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YMAA9l0BJ4swIieLMYVWJ4syBIXjF8AEQwLABEPnBoszAF2IqgFhAWCbAGCIkwEgwARDJoiwAgFhAWCbAGCIkwAChWwnizSEzRrABEPJiC8EheQXwARETcAERNgGizUAXYiIAWEBYJsAYIiTASDABERtiJIDAWEBYJsAYIiTAieLNhrABEStheMBJzcnBIXlF8AERn/ABEdRBos3AF2IqgFhAmDAAPbeYMAA9l1giJMBIMAERqWIsAIBYQJgwAD23mDAAPZdYIiTAAKFbCeLOITNGsAERzGIMASF5hfABEfDwARISwaLOQBdiIgBYQJgwAD23mDAAPZdYIiTASDABEfliJICAWECYMAA9t5gwAD2XWCIkwInizoawARIL4XlAASF5xfABEoHwARKSwaLOwBdiIgBYMAA9YIBGsAESiuF6ASF6BfABEqZwARLmAaLPABgiJ4BIMAESsKIqQMAASeLPQInN18iJ4s+BIXpF8AES+XABEwZBos/AF2IiAFgwAD1ggEawARL/4XqBIXqF8AETGfABE1LBotAAGCIngEgwARMioipBAABJ4tBA4VpOsAETM1gwAD2XQEni0IiJ4tDhVYni0QEhesXwARNmMAETdYGi0UAXYiIAWDAAPWCARrABE23hewEhewXwAROJMAET0cGi0YAYIieASDABE5MiKkDAAEni0cCJzdgIieLSASF7RfABE+UwARPygaLSQBdiIgBYMAA9YIBGsAET6+F7gSF7hfABFAYwARRCgaLSgBgiJ4BIMAEUDyIqQMAASeLSwInNyYiJ4tMBIXvF8AEUVfABFGfBotNAF2IiAFgwAD1ggEawARRfYXwBIXwF8AEUe3ABFLTBotOAGCIngEgwARSGIipBAABJ4tPA4VpOsAEUmNgwAD2XQEni1AiJ4tRhVYni1IEhfEXwARTIMAEU0QGi1MAXYiIAWDAAPWCARrABFMyhfIEhfIXwARTksAEVLkGi1QAYIieASDABFOtiKkEAAEni1UDhWk6wART42DAAPZdASeIsSIni1aFVieLVwSF8xfABFUjwARWDwaLWABdiKoBYQFgwAD2XWCIkwEgwARVSYiwAgFhAWDAAPZdYIiTAAKFbCeLWYTNGsAEVe+IMQSF9BfABFZ1wARXMgaLWgBdiIgBYQFgwAD2XWCIkwEgwARWl4iSAwFhAWDAAPZd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j2RdAQABFsAA0teBwADSz8AClEKPFZvcAMAA9nJUMsAA0vhgwAD2XVsBJ4IXgMAA0wHAApQtBoemF8AA1yTAANcswADalgABj2WDaAAAAAEDwADXW8AA2pYAAAAEBATAANdoAAAAg7BgwAD2XQDAANd5AAAAj1ZgkwUAwADXjQAAAI8MYJJZAMAA150AAACPDWCSWQAAYIiTAT4JScAA16kWwADXtIDAANetwAKVT4D8wAD2Yz0wwADXvSePOj9OwADX58AA1+8AAI8OYJu5AR/AANf1m94AAAAATsAA2BPAANghAACPV13AAPUdAWDAAPXFARzAANgrhMAA2CPAApWwj1gBAAGBwADYOcAClV4Am8BOwADYVMAA2F4AAI8PXcAA9R0BYMAA9cUBHMAA2GiEwADYYMAClbCPEAEAAYLAANhywAKVawCbv07AANiJwADYlAAAjxFdwAD1HQFgwAD1xQEcwADYnoTAANiWwAKVsI8QAQABg8AA2KjAApV4AJu/TsAA2LrAANjDAACEH2DAAPZdARzAANjThcAA2MXAApXMUQAAAADAAPTvTsAA2OTAANjpAACCF2DAAPZdARzAANj1hsAA2OvAApYEUQAAAADAAPTvTsAA2QbAANkMAACPEmDAAPZdARzAANkZh8AA2Q7AApY8UQAAAADAAPTvSsAA2SMBH8AA2S6InQMAARrAANk2g/gCIhzAANnpJMAA2ekJJ49mgMAA2YzAApVPJ49nFMAA2ZvAApZ0CAAnj2gUwADZwsAClp4JACePaRTAANndwAKWyAoAJ4DyXQEAARbAANoBhMAA2fnAApWwjxWb3ADAAPZyVDLAANoiYMAA9l1bBCeDsIDAANo2wAKVTyeEH4HAANpSwAKVXieCF4LAANptwAKVayePEoPAANqFwAKVeAaHpxfAAN4nwADeL8AA4MMAAY9qg2gAAAABA8AA3l7AAODDAAAAAgICwADebQAAAI9WYJMFAMAA3oEAAACPDGCSWQAAYIiTAT4GTsAA3pjAAN6gAACPDmCbuQEfwADeppveAAAAAE7AAN7EwADe0gAAj1ddwAD1HQFgwAD1xQEcwADe3ILAAN7UwAKX8Y9YAQABgMAA3urAApfPAJvATsAA3wXAAN8PAACPD13AAPUdAWDAAPXFARzAAN8ZgsAA3xHAApfxjxABAAGBwADf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AqnHwALeSSePjoVWJ4chVDLAAqpVYMAA9l1bASeAsIDAAqpewALeSQaH8xfAAq3dwAKt5cACr1MAAZA3g2gAAAABA8ACrhrAAq9TAAAAAQEBwAKuIgAAAICwYMAA9l0AAGCIkwE+A0nAAq4sFsACrjWAwAKuMMAC3xWA/MAA9mM9MMACrj4njwM/PYjAAq5awALfFR7AAq5hjAwBAAGAwAKufsAC3xUASsACrocBH8ACrpKInQMAARrAAq6ahRwCIiTAAq8vAyeC+4DAAq7mwALfFSeQOFQywAKvQmDAAPZdWwEngLCAwAKvS8AC3xUGh/QXwAKyacACsnHAArO6AAGQOYNoAAAAAQPAArKrwAKzugAAAAEBAcACsrgAAACAsGDAAPZdAABgiJMBPgNJwAKywhbAArLLgMACssbAAt/cgPzAAPZjPTDAArLUJ48DPz2IwAKy8MAC39wewAKy94wMAQABgMACsxTAAt/cAErAArMdAR/AArMoiJ0DAAEawAKzMIUeAiIkwAKzlgMngvuAwAKzd8AC39wnkDpUMsACs6lgwAD2XVsBJ4CwgMACs7LAAt/cBof1F8ACt4vAAreTwAK6BgABkDuDaAAAAAEDwAK3wsACugYAAAACAgLAArfRAAAAjwxgklkAwAK34QAAAI8NYJJZAABgiJMBPgZOwAK3+cACuAEAAI8OYJu5AR/AArgHm94AAAAATsACuCXAArgvAACPD13AAPUdAWDAAPXFARzAArg5gsACuDHAAuDFjxABAAGAwAK4Q8AC4KMAm79OwAK4WsACuGUAAI8RXcAA9R0BYMAA9cUBHMACuG+CwAK4Z8AC4MWPEAEAAYHAArh5wALgsACbv07AAriLwAK4kAAAghdgwAD2XQEcwAK4nIPAAriSwALg4VEAAAAAwAD0707AAritwAK4swAAjxJgwAD2XQEcwAK4wITAAri1wALhGVEAAAAAwAD070rAArjKAR/AArjViJ0EAAEawAK43YUgAyIcwAK5cSTAArlxBSeQPIXAArkzwALhUSeQPYbAArllwALheyeA8l0BAAEWwAK5iYLAArmBwALgxY8Vm9wAwAD2coVWJ4luVDLAArnjYMAA9l1bAieCF4DAArnswALgoyePEoHAArn8wALgsAaH9hfAAsBXwALAX8ACwn4AAZA+g2gAAAABA8ACwIXA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YMAA9cUBHMADVsyFwANWxMADAQ2PEAEAAYPAA1bWwAMA6QCbv0nAA1bhFsADVuuEwANW5cADAPaA/MAA9mM9MMADVvQnjwM/PYzAA1cQwAMA9h7AA1cYjAwBAAGEwANXNcADAPYATsADV0bAA1dLAACCF2DAAPZdARzAA1dXhsADV03AAwEpUQAAAADAAPTvTsADV2jAA1duAACPEmDAAPZdARzAA1d7h8ADV3DAAwFhUQAAAADAAPTvTsADV4zAA1eSAACQKWDAAPZdARzAA1efFMADV5TAAwHaCABRAAAAAMAA9O9KwANXqQEfwANXtIidBAABGsADV7yFbgMiHMADWIckwANYhwsnkGoUwANYHsADAlMJACeQYBTAA1hFwAMCfQoAJ5BhgsADWGXAAwDaJ49nFMADWHLAAwKnCwAngTGEwANYe8ADAPYngPJdAQABFsADWJ+FwANYl8ADAQ2PFZvcAMAA9nKFVieKIFQywANZH2DAAPZdWwUngheAwANZMcADAMAnjxKBwANZScADAM0ngLCCwANZYcADANonkCmDwANZeMADAOknjyOEwANZkcADAPYGiAkXwANdzcADXdXAA162AAGQboNoAAAAAQPAA131wANetgAAAAEBAcADXfoAAACPQ2DAAPbeAABgiJMBPgJOwANeC8ADXg8AAICgYMAA9l0BHsADXhGHhAEAAYDAA14fwAMDzQBKwANeKAEfwANeM4idAwABGsADXjuFcgIiJMADXpMDJ5BvgcADXorAAwPkJ4DyVDLAA16mYMAA9l1bASeAoIDAA16uwAMDzQaIChfAA2i5wANowcADa/0AAZBwg2gAAAABA8ADaPHAA2v9AAAAAgICwANo/gAAAIOwYMAA9l0AwANpCgAAAI9DYMAA9t4AAGCIkwE+A0nAA2kUFsADaR+AwANpGMADBHqA/MAA9mM9MMADaSgnjzo/TsADaU3AA2lRAACAoGDAAPZdAR7AA2lTh4QBAAGBwANpYcADBIkASsADaWoBH8ADaXWInQMAARrAA2l9hXoCIiTAA2vIBSeQcYDAA2n0wAMEeieQcoLAA2sawAMEwyeQc1QywANr22DAAPZdWwIng7CAwANr5sADBHongKCBwANr9cADBIkGiAsXwANv1sADb97AA3HQAAGQdINoAAAAAQPAA3AUwANx0AAAAAEB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9cUBHMAEqAmDwASoAcADOYuPEAEAAYLABKgTwAM5dgCbv07ABKglwASoKgAAghdgwAD2XQEcwASoNoTABKgswAM5p1EAAAAAwAD0707ABKhHwASoTQAAjxJgwAD2XQEcwASoWoXABKhPwAM531EAAAAAwAD0707ABKhrwASocQAAkClgwAD2XQEcwASofobABKhzwAM6F1EAAAAAwAD070rABKiIAR/ABKiTiJ0DAAEawASom4YuAiIcwASpMSTABKkxByeC+4fABKjlwAM6TyeQ6BTABKkBwAM6eQgAJ5DpFMAEqSXAAzqjCQAngPJdAQABFsAEqUmDwASpQcADOYuPFZvcAMAA9nJUMsAEqWpgwAD2XVsDJ4IXgMAEqXPAAzlcJ48SgcAEqYPAAzlpJ5ApgsAEqZTAAzl2Bog8F8AErY3ABK2VwASwfgABkOqDaAAAAAEDwAStwMAEsH4AAAADAwPABK3NAAAAgLBgwAD2XQDABK3aAAAAjyNgwAD2XQDABK3qAAAAjwxgklkAAGCIkwE+CEnABK31FsAErf6AwASt+cADO5CA/MAA9mM9MMAErgcnjwM/PYjABK4jwAM7kB7ABK4qjAwBAAGAwASuR8ADO5AAScAErlAWwASuWoHABK5UwAM7n4D8wAD2Yz0wwASuYyePAz89icAErn/AAzufHsAEroeMDAEAAYHABK6kwAM7nwBOwASuusAErsIAAI8OYJu5AR/ABK7Im94AAAAATsAErubABK7wAACPD13AAPUdAWDAAPXFARzABK76g8AErvLAAzxFjxABAAGCwASvBMADO64Am79OwASvFcAErxoAAIIXYMAA9l0BHMAEryaEwASvHMADPGFRAAAAAMAA9O9KwASvMAEfwASvO4idAwABGsAEr0OGMAIiHMAEsBUkwASwFQcnkOuAwASvucADO5AnkOyBwASvy8ADO58nkO2FwASwCsADPJkngPJdAQABFsAEsC2DwASwJcADPEWPFZvcAMAA9nJUMsAEsE5gwAD2XVsDJ4CwgMAEsFfAAzuQJ48jgcAEsGbAAzufJ4IXgsAEsHXAAzuuBog9F8AEv+PABL/rwATBNQABkO6DaAAAAAEDwATAEsAEwTUAAAABAQHABMAaAAAAgLBgwAD2XQAAYIiTAT4DScAEwCQWwATALYDABMAowAM9goD8wAD2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nCcAApzuAAKeEAACnzIAAqFmAAKiiAACo8UAAqRuAAKlFwACpgoAAqbWAAKnnQACqGQAAqkrAAKqHgACqzQAAqv7AAKswgACrYkAAq5VAAKvHAACr+MAArGQAAK0GwACtOcAArWzAAK2egACt0EAArgIAAK4zwACujIAAruVAAK8+AACvlsAAr8iAAK/6QACwLAAAsF3AALCJQACwuwAAsOzAALEegACxUEAAsYIAALGzwACx3gAAsghAALIygACyXMAAsocAALKxQACy3MAAswcAALMxQACzW4AAs4XAALOwAACz2kAAtAXAALRegAC0kEAAtMIAALTyAAC1I8AAtVWAALWHQAC1uEAAteoAALYygAC2v4AAtyIAALdVAAC3iAAAt7sAALfswAC4HoAAuIoAALj0QAC5PgAAuW/AALmhgAC500AAugUAALpNAAC6gAAAusnAALsVgAC7bkAAu9iAALx4gAC9GIAAve2AAL7CgAC/YoAAwCXAAMDpAADBFEAAwVIAAMF8QADB3wAAwi5AAMJgAADCkcAAwx7AAMNKAADDdYAAw6dAAMPsgADEFgAAxFmAAMSLQADEvQAAxQjAAMU6gADFfUAAxd/AAMYcgADGWUAAxoOAAMa1QADG4IAAxwoAAMePgADH/4AAyDFAAMicwADJCEAAyXPAAMnfQADKSsAAyrZAAMshwADLjUAAy78AAMvpQADMJwAAzFjAAMyLwADMuEAAzP2AAM1CwADNdIAAzZ/AAM3RgADOIYAAzkzAAM7ZwADPVkAAz4gAAM+2gADP6EAA0D6AANB2AADQp8AA0NmAANEoQADRWgAA0YRAANGtwADR4MAA0hKAANJEQADSdgAA0qfAANLzgADTP0AA06UAANPwwADUsEAA1VVAANWhAADV5kAA1g/AANZAwADWoAAA1vJAANdMQADXd4AA174AANgpgADYW0AA2IaAANizAADY3kAA2RAAANmywADaVYAA2r/AANsqAADblEAA29zAANwlQADcVwAA3IjAANy6gADc7EAA3R4AAN1PwADdgYAA3bNAAN4dgADeT0AA3nmAAN64QADe+EAA3yOAAN9WgADfiEAA382AAOAmQADgWAAA4MBAAOEogADhkMAA4bsAAOH3wADiRoAA4m9AAOKZgADi1kAA4wGAAOMzQADjcsAAAEDAIjlkbUY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EQEAASSRXAMngKOAkVLABEMGJ4CjAMAA9rtJkWQiIRyRboGRaMAEQxJBAQABgpFxwARDHgDAAPWcAIOReMAEQyw+AUmRkxyRoYeRl8AEQ/dBAQABFJGkwARETQkAAMAA9Zw+CE6RvpHHAACTzGDAAPZdARyR1haRyS6TvosUk80BAAEWkfCFkeLABEOngYuT+wCUP06SBJINAACTzmDAAPR5AR6SD8AAyhsCAWDAAPR5AhySHxSSE8AERCIIAF0BAAEckiaCkiLABEMegUEBAAGBkijABEMSAMAA9Z8AwAD1nhaSORSSMMAERcEMAFrAAPZhAD0ckk4UkkrABESjCwCCEQEAARySXRSSVMAERcEMAICxAgACkxSSasAERCIIAADAAPZzAMAA9rs9HJKFFJKBwAREowsAghEBAAEckpOEkovABEM6IAEAARySnRSSlMAERcEMAICxAgACFJKnwAREIggAFJK0wARF8Q0AAMAA9nMAAADAAPa7PRySzRSSycAERKMLAIGTAQABHJLeFJLVwARFwQwAgLEBAAEUkujABEXxDQAAwAD2cwDAAPa+TpMBkwMAAFtgwAD0eQGTRZMQAAEckxkUkxfABEcNDgBcAQABFJMbwAREIggAAMAA9aYBFZMowARHDQ4ckykUkyjABEcNDgBdAQABlADAAPWePgE9HJM9FJM5wAREowsAghEBAAEngQEAwAD2u0WTXAABHJNlFJNjwARHDQ4AXAEAARSTZ8AERfENAADAAPWmARWTccAERw0OHJNyFJNxwARHDQ4AXQEAAZQAwAD1nj4BPRyThhSTgsAERKMLAIIRAQABHJOUhJOMwARDOiABAAEng4MAAADAAPa7PgFFk70Bk8aTywAAgYtgwAD0eQGHk83ABEP3ARyT3RST2MAER+0MAIFKAQABFJPgwARETQkAAMAA9acBFZPpwARH7Qwck+0Uk+nABEftDABdAQABlADAAPWePgJOlASUDQAAk8xgwAD2XQEclBwWlA8uk76LFJPNAQABHJQtFJQowARH7QwAXQEAAZQAwAD1ngCUP0mUPRyURhSUQcAER+0MAEEBAAGHlEnABEP3AMAA9Zw+A0mUYhyUchSUZsAERCIIAICLAQABFpR9FJR0wARIRA0AWsAA9mEAwAD1qD4BPRWUlcAERCIIFpSsFJSjwARIRA0AWsAA9mE/PRyU0hSUzsAERKMLAIIRAQABHJThFJTYwARIRA0AgLECAAKTFJTuwAREIggAAMAA9nMAwAD2uz0clQ0UlQnABESjCwCBkwEAARyVHYSVFcAEQzogAQABHJUnFJUewARIRA0AgLEBAAEUlTHABEQiCAAAwAD2cwAAAMAA9r5JlVIclVsUlVbABEftDABBAQABFJVewARETQkAAMAA9Zw+A0mVdRyVgxSVecAERHgKAICLAQABFpWOFJWFwARIRA0AWsAA9mEAwAD1qD4BPRWVpsAERHgKFpW7FJWywARIRA0AWsAA9mE/PRyV4RSV3cAERKMLAIIRAQABHJXvhJXnwARDOiABAAEclfkUlfDABEhEDQCAsQIAApMUlgbABER4CgAAwAD2cwAAAMAA9rs9HJYkFJYgwAREowsAgZMBAAEcljUUlizABEhEDQCAsQEAARSWP8AERHgKAADAAPZzAMAA9r4+AT0clm8UlmvABESjCwCBkwEAARyWf4SWd8AEQzogAQABFJaAwARIRA0AAAAAwAD2vj9KlrUBHJbAFJa8wAREowsAIwAAAADAAPbABosYKZbTltuW+QEAk88AAAABA5bhlvkAAAAAAAAAYMAA9HkBSpbkARyW9haW7xaW5C6SA4sXWsAA9UyBQQEAAZQAwAD1nwAABD5yAAQ+nQAEPs0ABD+NAAQ/yQAEP+0ABEAXAARAOgAEQGYABEDaAARBIAAEQlUABEKsAARC6QAESpMABErZAAAADwKLJSmYBJgKnWQDk9AAAAFdiw0BXcAA9R0BYMAA9HkAAAMEiycpmFaYWQmAoAEamEHAAO5LYMAA9t4ABIsoKZiimLcJk9EAXcAA9R0BYMAA9HkABIspKZ1SnWIYk9IAYMAA9HkBHJ1glIFWAAAAAMAA9JwBBYs0KZl2mXaZ7gAAAAOZiZnuAAAAAgICmY8AAASAoGDAAPbeAJmeAAAAk9NdwAD1HQFgwAD0eQAAYIslAT8DCAGLJ4AAwARLqggAiygemcyLDAEAAYGZ5sAES7cACQGZdoskAAAAAAYGiyspmfOaDZoqAQASARqZ9MAA7ksAAAEDmhKaKgAAAAAAAABdwAD1HQFgwAD0eQFKmhUBFpoVLpPRiygGiy4pmi+aQprkAACTXQEamjDAAO5LAAABA5pKmuQAAAAAAAAAYMAA9l0BPgFKmoABHJqdFpqMGpqHwAC/GIGIwADDbIV1AwADFpqlLpPRiyiTHJrcFprVFpq/LpPRiyhawAD1TIFBAQABlADAAPWfAMAAw58Giy8pmuma/5s1AACTvwEamurAAO5LAAABA5samzUAAAAAAAAAXcAA9R0BYMAA9HkBSpsgARabIC6T0YsoBoswKZs6m02cPwAAk8MBGps7wADuSwAAAQObWpw/AAAAAgICm18AAABjYMAA9HkAm2oAAACCE2DAAPR5AABgwAD2XQE+AUqcFAEcnCYcnBsuk10AAAAAiy6AsQIAAoCcMMAETQyBnDfABE0YAMAA9nMGiywpnEScWJ0VAQBaARqcRcAA7ksAAAEDnF+dFQAAAAAAAABgwAD0eQE+AkmcZRycdRacaS6T0ospQQEAARyceJSBVgAAAADAAPScAMAA9Zw+AT0XnNQuk9IWnO0cnOIuk10AAAAAiy5awAD2YYspP0qc/wEWnQYuk9KLKQaLMimdGp0qnUoCAFoBGp0bwADuSwAAAQOdMJ1KAAAAAQEBnTUAAACA1GDAAPR5AABcAUqdOwEXnTsuk9KAnUnABE35iykAAARL+gAETDYABEyrAARM6AAETVkABE3WAAROHAAAAAYCizUpnWedbZ7NA5PUAAABYIslAAACBIs3KZ2vnbkYk8AAYMAA9l0BKwSLOCmd1p3eCYKjARqdvsAA7ktgwAD2XQABBYs8KZ3jneOeRAAAAAOd/Z5EAAAAAwMDngIAAACAoGDAAPbeAJ4MAAAEgqNgwAD2XQCeIAAAAJPTXcAA9R0BYMAA9HkAAGCLNQE/AggBiziBAMAETqUJAJ4xizQCAAKAnjfABE6Ygp48wAROsgABBos6KZ5JnlyeywAAk10BGp5KwADuSwAAAQOeZJ7LAAAAAAAAAGDAAPZdAT4CSZ5tHJ58Fp5xLpPAizdBAQABKwDAAPZsPgE9F56NLpPAHZ6gk10AAAAAiy6LNz9KnrYBFp69LpPAizcAAARO7wAET1cAAAABAos9KZ7Qntah5AOT1QAAAV2LDQFdwAD1HQFgwAD0eQAAAwSLPymfH58iCYCgARqfCsAA7ktgwAD23gAEi0Apnz+fRwmCowEanyfAAO5LYMAA9l0ABItBKZ9Yn1wJgT8AYMAA9l0AAwWLTCmfYZ9hn5UAAAADn3GflQAAAAMDA593AAAEgKBgwAD23gCfgQAABIKjYMAA9l0An5AAAASBP2DAAPZdAABgiz0BPwQIAYs/gADABE/jCAGLQIEAwARP8AgBi0GCAMAET/0JAZ9hiyQAAAAABYtNKZ+an5qf8ACT1gADn7Kf8AAAAAICAp+3AAAAgKBgwAD23gCfwwAAAIE/YMAA9l0AAGCLPQE/AQoAn9GLTAMAA4Cf1sAEUFIcn9+An9vABFBSIwAAAADAAPcGgZ/rwARQXwAFi04pn/Wf9aBiAJPXAAOgDqBiAAAAAgICoBYAAACCo2DAAPZdAKAnAAAAgT9gwAD2XQAAYIs9AT8BCgCgNYtMAwADHqA+wAD3UAEAAAFHgKBIwARQt4CgU8AEULeBoF3ABFDEAAYGi0MpoGeggaCaAQASARqgaMAA7ksAAAEDoIagmgAAAAAAAABdwAD1HQFgwAD0eQFKoIkBHKCOGqCJwAC/GJIUAQABFqCVLoE/i0EAwADBbgaLRCmgn6CzoMgBAFoBGqCgwADuSwAAAQOguqDIAAAAAAAAAGDAAPR5AUqgvQEWoMIWoL0ugT+LQVrAAPZhBotGKaDMoNyg6wIAWgEaoM3AAO5LAAABA6DioOsAAAABAQGg5wAAAIDUYMAA9HkAAFwBPgAGi0gpoPChA6EVAACTXQEaoPHAAO5LAAABA6ELoRUAAAAAAAAAYMAA9l0BSqERARahES6BP4tBBotJKaEaoTChiwAAk78BGqEbwADuSwAAAQOhS6GLAAAAAAAAAF3AAPUdAWDAAPR5AT4BSqFUAR6hW4sMAQABHKF6GqF1wAC/GJIUAQABFqGBLoE/i0EAwADBbgAGi0opoZCho6HiAACTwwEaoZHAAO5LAAABA6GwoeIAAAACAgKhtQAAAGNgwAD0eQChwAAAAIITYMAA9HkAAGDAAPZdAUqhyAEcoc0WocgugT+LQYCxAgACgKHXwARSfoGh3sAEUooAwAD2cwAABFEEAARRVAAEUZIABFHHAARR/gAEUloABFLFAAAABgKLTymh/qIEosYDk9gAAAFgwAD1xQABXVsBXcAA9R0BYMAA9HkCBItRKaJBokQJgKABGqIswADuS2DAAPbeAASLUimiZKJoCRIBGqJJwADuS13AAPUdAWDAAPR5AAEFi1Ypom2ibaKIAAAAA6JzoogAAAACAgKieQAABICgYMAA9t4AooMAAAQSXcAA9R0BYMAA9HkAAGCLTwE/AwgBi1GAAMAEU1wIAYtSgQDABFNpCQGibcAA9dsAAAAAAQaLVCmijaKnosQBAIH+ARqijsAA7ksAAAEDorGixAAAAAAAAABgTwFKorQBGqK+VgAABFOjAART0wAAAAEAAQaLDCmW/pcImAEAAZPZiwkAAAABA5chmAEAAAABAQGXLAAAAIP6XcAA9R0BYMAA9HkAAF3AAPUdAWDAAPR5AT4FSZc3IhyXSBaXQYCXO8AEVAFawAD1TICLAQABkwDAAPWoAByXWhaXVYCXT8AEVAGBecAA9QJBAQABkwDAAPWcSpdgAYCXZ8AEVAE/Tpd6l4EAAIEQXcAA9R0BYMAA9HkBHpeHwADcFwEAARyXnhaXl4CXkcAEVAFawAD1TF0BAAGUAMAA9Z4APRyXrYGXpsAEVG+DFwMAA5MWl7+Al7nABFQBWsAA9UyAl8fABFQBAMAA9UI9HJfXgZfRwARUb4CyAgACHJfmFpffgZfYwARUb1rAAPVMgUEBAAGUAMAA9Z+TAMAA9S1Kl/IBgZf5wARUbwEpAARVFAAEPfEABEseAAROPQAET2QABFLmAART4AAAAAUABFPiAARVFAAAAAEAi1eT2ioAAAGA+gAAwAC31AABAQGTNQAAAAICi1gqgSeBLYYhA5PbAAEAAIOTYMAA9cUBWwFdwAC6/gFfAAAAAV3AAPYOAV8AAAABBYtyKoFwgXaBiQEAAAOBh4GJAAAAAAAAAF2LWAFfAAABPwEJAYF2wAC7AwAAAAAVBotaKoGOgaGByAAAkyABGoGPwADuSwAAAQOBqIHIAAABAACT3GDAAPXFAVsAAAAAXcAA9g4BXwEAAUqBrgEfgbKLcgABXwEAAAAGi2wqgcyB3IIBAQBVARqBzcAA7ksAAAEDgeWCAQAAAAAAAABdwAD1FgFfAAABSoHoASCB7ot5AAAAAAaLbSqCBYIZgiQBAFoBGoIGwADuSwAAAQOCIIIkAAAAAAAAAGDAAPR5AUqCIwGTBotuKoIogj2CTAEAgPwBGoIpwADuSwAAAQOCRYJMAAAAAAAAAGDAAPKzAUqCSAEpBotwKoJRglWCmwEAk92LVwAAAAEDgmWCmwAAAAAAAABbAUqCaAEwgmgfgnLAAPQLAQABJ5PeAAaLWyqCoIKxgtIAAE8BGoKhwADuSwAAAQOCtILSAAAAAQEBgrcAACCTDV8AAAAAYMAA8rMBSoLDASaCwwEWgsMuk92LV4twYMAA8rMGi1wqgtaC54MWAACAmQEagtfAAO5LAAABA4LtgxYAAAABAQGC+gAAIIT5XcAA9NsBXwAAAABcAUqDBwEWgwcuk92LV4twBotdKoMbgymDRwAAk98BGoMcwADuSwAAAQODL4NHAAAAAQEBgzcAAACTDWDAAPXFAABfAAABSoNDASsGi14qg0uDXIN7AACT4AEag0zAAO5LAAABA4Nig3sAAAABAQGDagAAAJMNYMAA9cUAAGDAAPKzAUqDdgEqBotfKoN/g5CDtgAAk+EBGoOAwADuSwAAAQODmYO2AAAAAQEBg6sAAACE+V3AAPTbAWDAAPXFAABcAT4ABotgKoO6g8uD7gAAk+IBGoO7wADuSwAAAQOD1oPuAAAAAQEBg9wAAACT42EBXwAAYMAA8rMAAFwBPgAGi2Eqg/KEA4QpAACT5AEag/PAAO5LAAABA4QMhCkAAAABAQGEHgAAAIT5XcAA9NsBYMAA9cUAAFwBPgAGi2IqhC2EPoRhAACT5QEahC7AAO5LAAABA4RJhGEAAAABAQGETwAAAJPjYQFfAABgwADyswAAXAE+AAaLYyqEZYR2hJcAAIO8ARqEZsAA7ksAAAEDhH2ElwAAAAEBAYSDAAAAhVthAV8AAFwAAFwBPgAGi2QqhJuErIS1AACB0AEahJzAAO5LAAABA4SxhLUAAAAAAAAAXAE+AAaLZSqEuoTLhOwAAILQARqEu8AA7ksAAAEDhNOE7AAAAAEBAYTbAAAAkw1gwAD1xQAAYMAA8rMBSoTnASoGi2YqhPCFAYU1AACDxgEahPHAAO5LAAABA4UMhTUAAAABAQGFHgAAAIObXcAA9NsBYMAA9cUAAGDAAPKzAUqFKAEWhS6AhSjABFmSgPzAAPT/BotnKoU6hU2FdwAAk+YBGoU7wADuSwAAAQOFUoV3AAAAAQEBhVoAACCDm13AAPYOAV8AAAAAXcAA9g4BXwAAAUqFZAEehWjAALshAQFfAAABgIVxwARZ5AAGi2gqhXuFjoW1AACT5wEahXzAAO5LAAABA4WahbUAAAABAQGFpwAAAIObXcAA9g4BYMAA9cUAAF3AAPYOAV8AAAFKhbEBLgaLaSqFuYXMhfEAAJPoARqFusAA7ksAAAEDhdaF8QAAAAEBAYXjAAAAg5tdwAD2DgFgwAD1xQAAXcAA9g4BXwAAAUqF7QEuBotqKoX1hgiGHwAAkeIBGoX2wADuSwAAAQOGDYYfAAAAAAAAAF3AAPYOAV8AAAFKhhMBHoYXwAC7HwABXwAAAAAAAARVvgAEVggABFZDAARWcgAEVqIABFbZAARXJQAEV2sABFemAARX4wAEWB8ABFhaAARYlgAEWNEABFkIAARZMQAEWW4ABFnAAARaGQAEWmAABFqnAARa6AAAABUCi3MqhiSGKobGA5PpAAABYMAA9cUAAV3AAPUWAWDAAPWCAAEFi3kqhlqGYIZzAQAAA4ZxhnMAAAAAAAAAYItzAT8BCQGGYMAA9dsAAAAAAgaLdSqGeIaNhpwBAFcBGoZ5wADuSwAAAQOGlYacAAAAAAAAAGDAAPWCAUqGmAErBot3KoaghrGGxAAAVgEahqHAAO5LAAABA4a5hsQAAAAAAAAAYMAA8rMBSoa/ASoAAARblQAEW8QABFvzAAAAAgAAASoABFwGAARVXQAEW0UABFwEAAAAAgAEXAYAAAAAAIt6k+orAAABgPgAAMAAt9QAAQECk+uTNQAAAAUCi3srgS6BNJjSA5PsAAIAAIPIYMAA9cUBWwAAg8lgwAD1xQFbAV3AALvrAl8AAF8BAAAABQSLfiuBdoGVBpPti3oAYIuRASCBhouTAAAAAASLgiuBqoG2BpPuAGDAAPR5ATcIBIt/K4QMhBoYk++LegBbARqEE4t+BIuAK4QihCgYk/CLegBbASsEi4ErhDCENhiT8Yt6AFsBKwIFi48rhDuEO4RDAAAAA4RBhEMAAAAAAAAAXYt7Al8AAF8BAAE/AQkBhDvAALvzAAAAAAWLkCuESIRIhLIAkxYAA4RThLIAAAABAQGEYQAAAIObXYt7Al8AAF8BAAAAXYt7Al8AAF8BAAE+AT0chHSAhG7ABF0og7wBAAE0hHwDhHyErQAAAAICAoR/AAAAg5ZfAAAAhIYAAACAil8BAAAAYMAA9YIBPgE9HISZLoCyAgACgYSawARdZoKEocAEXXEAi4oAi4wBCQGESMAAu/MAAAAACQaLhCuEt4TMhXwBAID8ARqEuMAA7ksAAAEDhNSFfAAAAAAAAABgwADyswE+AUmE2hyE5RaE3i6T8Yt6i4FBAQABKwDAAPXSPgFKhPYBHIUFGoT9i35BAQABFoUILpPvi3qLfwDAAPXSSYUZHIUlGoUdi35BAQABFoUoLpPxi3qLgQDAAPXSPgFKhTgBJoU4ARaFRBaFPy6T74t6i3+A/ABgwADysz4BSoVgARyFbhaFZy6T8Yt6i4FBAQABkwDAAPXSBouFK4WBhZWGSAEAWgEahYLAAO5LAAABA4WchkgAAAAAAAAAYMAA9HkBPgFJhaIcha0WhaYuk/GLeouBQQEAASsAwAD10j4BSoW+ASMchc4ahcaLfkEBAAEWhdEuk++Leot/AMAA9dKTlAFgwAD0eUmF6xyF9xqF74t+QQEAARaF+i6T8Yt6i4EAwAD10j4BSoYKASaGCgEWhhYWhhEuk++Leot/WgBgwAD0eT4BSoYxASaGMQEWhjguk/GLeouBYMAA9HkGi4grhk2GXogCAACB3QEahk7AAO5LAAABA4ZpiAIAAAABAQGGcQAAAIOWYMAA9cUAAGDAAPKzAT4BSYZ8HIaHFoaALpPxi3qLgUEBAAErAMAA9dI+AUqGmAEchqQWhp8uk++Leot/QQEAAYCGp8AEX1wAwAD10kmGtxyGwxqGu4t+QQEAARaGxi6T8Yt6i4EAwAD10j4BSobWASaG1gEchuIWht0uk++Leot/gd0BAAGAhu7ABF9cAABgwADysz4CRYcHAocQhxoAAJPyYMAA9HkBJocQARaHHC6T8Yt6i4FgwAD0eYckhyYAAFtgwAD0eQGTASIchzWBhyvABF/9gIsBAAGTAMAA9agAHIc+goc8wARgHlwBAAEah0CLggDAAPWmAYqHSsAEYB4ch0uCh0rABGAeXQEAAZQAwAD1nkE+BE6HXYdnAACE8FsBHIdtFodpLpPvi3qLf0QBAAGCh27ABGAeAABJh3och4Yah36LfkEBAAGDh4nABGB8AMAA9dJCh5QAP0mHphyHtIOHqsAEYHxBAQABgIe3wARfXADAAPXSSoe8ASk/PYmH0cAEX/0ch9qBh9HABF/9gUEBAAGUAMAA9Z9Kh+wBKgaLiSuIB4geicwDAEQBGogIwADuSwAAAQOIIInMAAAAAQEBiCgAAACDlmDAAPXFAABfAQABPgFJiDMciD4WiDcuk/GLeouBQQEAASsAwAD10j4BSohPASaITwEjHIhcFohXLpPvi3qLf0EBAAGAiF/ABGEoAMAA9dIWiGYuk/CLeouAKwFbXwEASYiAHIiMGoiEi35BAQABFoiPLpPxi3qLgQDAAPXSPgFKiJ8BJoifARyIqhaIpi6T74t6i39EAQABgIirwARhKAAAXwEAPgJFiMQCiM2I1wAAk/JgwAD0eQEmiM0BFojZLpPxi3qLgWDAAPR5iOGI4wAAW2DAAPR5AZMBIhyI8oGI6MAEYdmAiwEAAZMAwAD1qAAciPuCiPnABGH6XAEAARqI/YuCAMAA9aYBiokHwARh+hyJCIKJB8AEYfpdAQABlADAAPWeQT4ETokaiSQAAITwWwEciSoWiSYuk++Leot/RAEAAYKJK8AEYfoAAEmJNxyJQxqJO4t+QQEAAYOJRsAEYlgAwAD10kKJUQA/SYljHIlxg4lnwARiWEEBAAGAiXTABGEoAMAA9dJKiXkBJol5ARyJhBaJgC6T74t6i39EAQABHImHgomFwARh+l0BAAEaiYmLggDAAPWeAABfAQA/PYmJnMAEYdkciaWBiZzABGHZgUEBAAGUAMAA9Z9KibcBKwaLiiuJ0Ynrk6MDAICyARqJ0sAA7ksAAAEDie6TowAAAAICAonxAAAgg5ZfAAAAifgAACCAil8BAAAAXAE+AUmKBRyKEBaKCS6T8Yt6i4FBAQABKwDAAPXSPgFJiiEcii0aiiWLfkEBAAEWijAuk++Leot/AMAA9dI+Aj0XikAuk++LeoCKR8AEYzaLfz0XilQuk/CLeoGKXcAEY0GLgEmKcRyKehaKdS6T74t6i39BAQABgIp9wARjNgDAAPXSPgE9F4qMLpPwi3qBipXABGNBi4A+CE6KuIq9AACDFF3AAPUdAVsBHorDwADuggEBWwEcitEaisiLgoM+AQABlQDAAPWgAD0ciuOCit/ABGPogLICAAKTForpLpPvi3qLfwDAAPUtPRyK+4KK98AEY+iAsgIAApSAiwHABGM2AMAA9S09HIsSgosOwARj6ICyAgACGosTi4IWix8uk/CLeouAAMAA9S09HIszgosvwARj6ICyAgACHIs9Gos0i4JdAQABlADAAPWegYtEwARjQQDAAPUtPReLUy6T74t6gotawARj6It/PReLaC6T8It6K4uAPReLfy6T8Yt6lYuBSYuvHIu7Gouzi35BAQABFou+LpPxi3qLgQDAAPXSPgE9HIvSFovOLpPvi3qLf4CyAgACgIvTwARjNoGL2sAEY0EAAD4GTov4jAIAAJPyYMAA9HkBJov4ARaMBC6T8Yt6i4FgwAD0eU6MFowcAAAnYMAA9HkBk06MKwAAAJPzYMAA9HkATowzAAAAk/RgwAD0eQBDjEMiHIxUgoxKwARlFoCLAQABkwDAAPWoAByMYYOMW8AEZThcAQABGoxji4IAwAD1pj4DTox7jIUAAITwWwEcjIsWjIcuk++Leot/RAEAAYOMjMAEZTgAAEmMnByMqBqMoIt+QQEAAYaMq8AEZZcAwAD10j4BSY3BHI3OhY3FwARlVUEBAAGDjdHABGU4AMAA9Zw+AT2NjebABGVVHI3uhY3mwARlVV0BAAGUAMAA9Z4+Aj2MjhHABGVHg44awARlOD2Nji3ABGVVHI4+g444wARlOF0BAAGUAMAA9Z5Jjl4cjmyGjmLABGWXQQEAAYCOb8AEYzYAwAD10j4CPRyOhBaOgC6T74t6i3+AsgIAAhyOjhqOhYuCXQEAAYOOkMAEZTgAwAD1noGOmcAEY0EAAEqOqgA+AT2KjwDABGUWHI8Jgo8AwARlFoFBAQABlADAAPWfPYuPH8AEZTgcjySDjx/ABGU4XQEAAZQAwAD1nkmPNhyPQIOPOsAEZThcAQABGo9Ci4IAwAD1pj4DPRyPWhaPVi6T74t6i3+AsgIAAoOPW8AEZTiAj2TABGM2AAA9HI91Fo9xLpPvi3qLf4CyAgACHI9/Go92i4JdAQABg4+BwARlOADAAPWegY+KwARjQQAAPRePmS6T8Yt6HI+fFo+ZLpPxi3qLgV0BAAGUAACLgUmPsCaPuwEcj7sWj7Quk/GLeouBXAEAARqPvYuCAABgwADysz4GQ5BRHJBhhZBYwARlVVwBAAEakGOLggDAAPWmPgQ9HJB9FpB5LpPvi3qLf4CyAgAChJB+wARlRxyQjBaQiC6T74t6i39EAQABhZCNwARlVQAAAAA9HJCmFpCiLpPvi3qLf4CyAgACHJCwGpCni4JdAQABhJCywARlRwDAAPWeHJDAFpC8LpPvi3qLf0QBAAEckMoakMGLgl0BAAGFkMzABGVVAMAA9Z4AAAAAPYyQ4cAEZUcckOeEkOHABGVHXQEAAZQAwAD1nj2NkPXABGVVHJD9hZD1wARlVV0BAAGUAMAA9Z49HJFOFpFKLpPvi3qLf4CyAgAChJFPwARlR4CRWcAEYzYAAD0ckWoWkWYuk++Leot/gLICAAIckXQakWuLgl0BAAGEkXbABGVHAMAA9Z6BkYDABGNBAAA9jJGPwARlRxyRlYSRj8AEZUddAQABlADAAPWePReR3i6T8Yt6HJHkFpHeLpPxi3qLgV0BAAGUAACLgUOSYxyScYSSasAEZUdcAQABGpJzi4IAwAD1pj4CPRySjRaSiS6T74t6i3+AsgIAAoSSjsAEZUc1AAAAAQBbARaSmC6T74t6i381AAAAAQBgwAD0eQEckqYakp2Lgl0BAAGEkqjABGVHAMAA9Z41AAAAAQBgwAD1ggErNQAAAAEAXAEckpyGkpzABGk4gLICAAKHkpzABGlKFADABGluCAAAABQAwARpbggAAAA9jJLCwARlRxySyISSwsAEZUddAQABlADAAPWePgVOkvGS9QAAgJ9dwAD1TgJfAABfAQABHpL7wAD1VQACXwAAXwEAAAA9HJMQLoO8AQABNJMYA5MYk0gAAAACAgKTGQAAAJP1XwAAAJMiAAAAk/ZfAQAAAF8BAAFKkzABNQAAAAEAXcAA9U4CXwAAXwEAAYaTMMAEacs1AAAAAQBfAAABh5M0wARqCTUAAAABAF8BAAEUkz/ABGoUCAA1AAAAAQBcARyTMxSTM8AEaikJAICyAgACFJMzwARqQwoAFADABGpUCwAAwAD1YxQAwARqVAsAAIuMPRyTVoaTU8AEacuAsgIAAoCTV8AEYzaBk17ABGNBAMAA9WM9F5NtLpPvi3qGk3TABGnLi389F5OBLpPxi3oak4qLfouBBouLK5Ook7aWcAAAk+ABGpOpwADuSwAAAQOTvJZwAAAAAQEBk8QAAACDlmDAAPXFAABfAQABPgFJk88ck9oWk9Muk/GLeouBQQEAASsAwAD10j4FSZPrIRyT9BaT7y6T74t6i39BAQABgJP3wARrCQDAAPXSSpP8ASs/PReUDy6T74t6GpQWi36Lf06UJ5QuAACBEF8BAAEmlCcBFpQwLpPwi3qLgF8BAD0XlD4uk/CLeiuLgEqUUwGBlFrABGtxSZRtHJR5GpRxi35BAQABFpR8LpPxi3qLgQDAAPXSPgFKlIwBJpSMARyUmBaUky6T74t6i3+T4AEAAYCUn8AEawkAAF8BAD4CRZS4ApTBlMsAAJPyYMAA9HkBJpTBARaUzS6T8Yt6i4FgwAD0eZTVlNcAAFtgwAD0eQGTASIclOaBlNzABGvxgIsBAAGTAMAA9agAHJTvgpTtwARsElwBAAEalPGLggDAAPWmAYqU+8AEbBIclPyClPvABGwSXQEAAZQAwAD1nkE+BE6VDpUYAACE8FsBHJUeFpUaLpPvi3qLf0QBAAGClR/ABGwSAABJlSsclTcalS+LfkEBAAGDlTrABGxwAMAA9dJClUUAP0mVVxyVZYOVW8AEbHBBAQABgJVowARrCQDAAPXSPgZOlX2ViAAAk/dgwAD0eQEclZMalYqLgl0BAAGClZXABGwSAMAA9Z5OlaaVrQAAgRBbARyVsxaVry6T74t6i39EAQABhJW0wARs1AAAPRyVzxaVyy6T74t6i3+AsgIAAoKV0MAEbBIaldWLfgAAPRyV7BaV6C6T74t6i3+AsgIAAoSV7cAEbNQrAAA9F5YLLpPxi3oclhEWlgsuk/GLeouBgUEBAAGUAACLgUqWHwEmlh8BhZYmwARs+18BAD89iZZAwARr8RyWSYGWQMAEa/GBQQEAAZQAwAD1n0qWWwErBouMK5Z1loaYNgAAg7wBGpZ2wADuSwAAAQOWjZg2AAAAAQEBlpMAAACFW2ECXwAAXwEAXAAAXAE+AUmWsRyWvBaWtS6T8Yt6i4FBAQABKwDAAPXSPgFJls0hHJbZGpbRi35BAQABFpbcLpPvi3qLfwDAAPXSPRyW6ICW4sAEbdYgAgACJpbpARaW6S6T74t6i39fAAAmlu8BFpbvLpPwi3qLgF8BAAAAP0mXAxyXDxqXB4t+QQEAARaXEi6T8Yt6i4EAwAD10j4BPRyXJxaXIi6T74t6i3+DvAEAAYCXL8AEbdYAAD4BRZdLApdUl14AAJPyYMAA9HkBJpdUARaXYC6T8Yt6i4FgwAD0eZdol2oAAFtgwAD0eQGTASIcl3mBl2/ABG6dgIsBAAGTAMAA9agAHJeCgpeAwARuvlwBAAEal4SLggDAAPWmAYqXjsAEbr4cl4+Cl47ABG6+XQEAAZQAwAD1nkE+BE6XoZerAACE8FsBHJexFpetLpPvi3qLf0QBAAGCl7LABG6+AABJl74cl8oal8KLfkEBAAGDl83ABG8cAMAA9dJCl9gAPz0cl/CAl+rABG3WIAIAAiaX8QGDl/HABG8cXwAAJpgAARyYABaX/C6T74t6i39EAQABHJgKGpgBi4JdAQABgpgMwARuvgDAAPWeAABfAQAAAD2JmBnABG6dHJgigZgZwARunYFBAQABlADAAPWfBouNK5g7mEyYiAAAgdABGpg8wADuSwAAAQOYUZiIAAAAAAAAAFwBPgI9F5haLpPvi3oamGGLfot/PReYbi6T8It6F5h3LpPxi3ori4GLgAaLhiuYjZipmNABAIHcARqYjsAA7ksAAAEDmK6Y0AAAAAAAAABdwAD02wFfAAABSpixAR+YtYuaAQFfAAABLgAAAARdsQAEXnMABF84AARhBQAEYxIABGrlAARtsgAEb84ABHAdAARwXQAAAAkCi5ErmNWY25kEA5P4AAABYMAA9cUAAAABBYuTK5jtmPOZAgEAAAOZAJkCAAAAAAAAAGCLkQE/AQkBmPPAAPXbAAAAAAAAAARwzwAAAAACi5QrmQeZDZq9A5P5AAEAAIPIYMAA9cUBWwFdwAC6/gFfAAAAAAEEi5YrmViZXgmT+gBdi3sCXwAAWwABBYuaK5ljmWOZggAAAAOZdZmCAAAAAQEBmXsAAAST+l2LewJfAABbAABdi5QBXwAAAT8CCAGLloAAwARxLQkBmWPAALsDAAAAAAEGi5grmYeZo5q7AQBVARqZiMAA7ksAAAEDmayauwAAAAAAAABdwAD1FgFfAAABPgFJmbIcmcQWmb0WmbYuk/qLlpPxi3qLgUEBAAErAMAA9dI+AUqZ1QEfmeCLpQEBXwAAARaaABaZ+S6T+ouWk++Leot/AEmaEhyaJRqaHYt+QQEAARaaLxaaKC6T+ouWk/GLeouBAMAA9dI+AUqaPwEmmj8BFppXFppSFppNFppGLpP6i5aT74t6i3+B3ABVAF3AAPUWAV8AAD4BSpp0AR+af4uyAgFfAAACJpqdARaanRaali6T+ouWk++Leot/XcAA9R0BWyaaqgEWmqoWmqMuk/qLlpPxi3qLgWDAAPR5AAAABHFfAARybwAAAAECi5srmsCaxpwuA5P7AAEAAIPIYMAA9cUBWwFgwAD1xQABXcAA9RYBXwAAAgSLniua/psGGJP8i3oAWwAEi58rmwybFFiFcot6AF8AAAErAQWLpSubGZsZmz0AAAADmy6bPQAAAAEBAZs0AAAEk/xbAABdi5sBXwAAAT8CCAGLnoAAwARy5AkBmxnAAPXbAAAAAAIGi6Erm0KbVJtnAQBXARqbQ8AA7ksAAAEDm1ybZwAAAAAAAABfAAABSptfARabXy6Fcot6i58Gi6Mrm2ybfZwsAABWARqbbcAA7ksAAAEDm4WcLAAAAAAAAABgwADyswE+BEmbjhyboRqbmYt+QQEAARabpC6T/It6i54AwAD10j4CPRebti6Fcot6K4ufSpvNASo/PReb5S6Fcot6JpvlARab8C6T/It6i55fAACLnz0Xm/4uk/yLehqcEIt+i55KnB0BKQAABHMPAARzRQAEc9QAAAACAoumK5wxnDeeHAOT/QABAACDyGDAAPXFAVsBYMAA9cUAAV3AAPUWAV8AAAQEi6krnHSceQmT/ot6AF3AAPUdAVsABIuqK5yBnIsYk/+LegBgwAD0eQAEi6srnJOcnRiUAIt6AGDAAPR5AZMEi6wrnKOcq1iFcot6AF8AAAErAQWLsiucsJywnOAAAAADnMOc4AAAAAICApzJAAAEk/5dwAD1HQFbAJzVAAAEk/9gwAD0eQAAXYumAV8AAAE/AwgBi6mAAMAEdHwIAYuqgQDABHSLCQGcsMAA9dsAAAAAAgaLriuc5Zz3nQoBAFcBGpzmwADuSwAAAQOc/50KAAAAAAAAAF8AAAFKnQIBFp0CLoVyi3qLrAaLsCudD50gnhoAAFYBGp0QwADuSwAAAQOdKJ4aAAAAAAAAAGDAAPKzAT4DQ50xHJ1DFp04LpP/i3qLqoCLAQABkwDAAPWoPgJOnVSdXgAAhPBbARydZRadYC6T/ot6i6lEAQABNQAAAAEAYMAA9HkBFp1mLpQAi3qLqzUAAAABAGDAAPR5ARedZi6UAIt6HJ1sgADABHVgXQEAAZQAwAD1nourgADABHVgAMAA9SxJnXchHJ2KGp2Ci35BAQABgJ2NwAR1RADAAPXSPgM9F52iLoVyi3omnaIBgJ2twAR1RF8AAIusPRedwC6T/4t6HJ3KFp3ALpP/i3qLqoFBAQABlADAAPWfi6pKndYBKT89F531LoVyi3ori6xKngoBKgAABHTEAAR0+gAEdhoAAAACAAABKwAEdi0ABFxBAARwigAEcNgABHJ8AARz5QAEdisAAAAFAAR2LQAAAAAAi7OUASwAAAGA+AAAwAC31AABAQGUAgAAAAQCi7QsgSCBJp6HA5QDAAEAAIOTYMAA9cUBWwFdwAC9kAFfAAAAAAQEi7csgWKBgQaT7YuzAGCL1gEggXKL2gAAAAAEi7osgZaBogaT7gBgwAD0eQE3CASLuCyDR4NaGJQEi7MAWwEag1OLtwSLuSyDYoNoGJPxi7MAWwErAgWL1CyDbYNtg3UAAAADg3ODdQAAAAAAAABdi7QBXwAAAT8BCQGDbcAAvZQAAAAABYvVLIN5g3mDtQCTFgADg4SDtQAAAAEBAYORAAAAhPldwAD02wFfAAAAAF2LtAFfAAABPgE9HIOhLoCZAQABgIOowAR3NwCLwQEJAYN5wAC9lAAAAAAVBou9LIO6g8iD5wABlAWLswAAAAEDg9KD5wAAAQAAk9xgwAD1xQFbAAAAAF3AAPYOAV8BAAFKg9gBH4Pci9QAAV8BAAAABou+LIPsg/+ENQAAkyABGoPtwADuSwAAAQOEBoQ1AAABAACT3GDAAPXFAVsAAAAAXcAA9g4BXwEAAUqEDAEehBDAAPYYAgJfAABfAQABLgGUBhqELYu9BovQLIQ5hFWFRgEAVQEahDrAAO5LAAABA4RehUYAAAAAAAAAXcAA9RYBXwAAAT4BSYRkHIRvFoRoLpPxi7OLuUEBAAErAMAA9dI+AUqEgAEfhIuL5QEBXwAAARaEpC6UBIuzi7gASYS7HITHGoS/i7dBAQABFoTKLpPxi7OLuQDAAPXSPgFKhNoBJoTaARaE6xaE4S6UBIuzi7hVAF3AAPUWAV8AAD4BSoUIAR+FE4vyAgFfAAACJoUqARaFKi6UBIuzi7hdwAD1HQFbJoU1ARaFNS6T8Yuzi7lgwAD0eQAGi9EshUuFX4YcAQBaARqFTMAA7ksAAAEDhWaGHAAAAAAAAABgwAD0eQE+AUmFbByFdxaFcC6T8Yuzi7lBAQABKwDAAPXSPgFKhYgBIxyFmBqFkIu3QQEAARaFmy6UBIuzi7gAwAD10pOUAWDAAPR5SYW6HIXGGoW+i7dBAQABFoXJLpPxi7OLuQDAAPXSPgFKhdkBJoXZARaF6haF4C6UBIuzi7haAGDAAPR5PgFKhgUBJoYFARaGDC6T8Yuzi7lgwAD0eQaL0iyGIYY2hvABAID8ARqGIsAA7ksAAAEDhj6G8AAAAAAAAABgwADyswE+AUmGRByGTxaGSC6T8Yuzi7lBAQABKwDAAPXSPgFKhmABHIZvGoZni7dBAQABFoZyLpQEi7OLuADAAPXSSYaIHIaUGoaMi7dBAQABFoaXLpPxi7OLuQDAAPXSPgFKhqcBJoanARaGuBaGri6UBIuzi7iA/ABgwADysz4BSobUARyG4haG2y6T8Yuzi7lBAQABkwDAAPXSBou/LIb1hwaIwwAAgtABGob2wADuSwAAAQOHDojDAAAAAQEBhxYAAACTDWDAAPXFAABgwADyswE+AUmHJRyHMBaHKS6T8Yuzi7lBAQABKwDAAPXSPgFKh0EBHIdSFodILpQEi7OLuEEBAAGAh1XABHqcAMAA9dJJh2kch3Uah22Lt0EBAAEWh3guk/GLs4u5AMAA9dI+AUqHiAEmh4gBHIeZFoePLpQEi7OLuILQAQABgIeiwAR6nAAAYMAA8rM+AkWHvwKHyIfSAACT8mDAAPR5ASaHyAEWh9Quk/GLs4u5YMAA9HmH3IfeAABbYMAA9HkBkwEiHIftgYfjwAR7PYCLAQABkwDAAPWoAByH9oKH9MAEe15cAQABGof4i7oAwAD1pgGKiALABHteHIgDgogCwAR7Xl0BAAGUAMAA9Z5BPgROiBWIHwAAhPBbARyIKhaIIS6UBIuzi7hEAQABgogrwAR7XgAASYg3HIhDGog7i7dBAQABg4hGwAR7vADAAPXSQohRAD9JiGMciHGDiGfABHu8QQEAAYCIdMAEepwAwAD10kqIfQEpPz2JiJLABHs9HIibgYiSwAR7PYFBAQABlADAAPWfSoitASoGi8AsiMiI2ZD0AABPARqIycAA7ksAAAEDiNyQ9AAAAAEBAYjfAAAgkw1fAAAAAGDAAPKzAT4BSYjuHIj5FojyLpPxi7OLuUEBAAErAMAA9dI+AUmJChyJFhqJDou3QQEAARaJGS6UBIuzi7gAwAD10j4CPReJLi6UBIuzgIk6wAR8aIu4SolLASlJiWUciXMWiWkulASLs4u4QQEAAYCJdsAEfGgAwAD10j4BSomgASo+Bk6JyonPAACDFF3AAPUdAVsBHonVwADuggEBWwEaidqLugA9HInxgYntwAR8+YCyAgACkxaJ9y6UBIuzi7gAwAD1LT0cig6BigrABHz5gLICAAKUgIoUwAR8aADAAPUtPReKJS6UBIuzgYoxwAR8+Yu4PReKPy6T8YuzlYu5SopkASlJioQcipAaioiLt0EBAAEWipMuk/GLs4u5AMAA9dI+AUqKowEmiqMBHIq0FoqqLpQEi7OLuE8BAAGAirjABHxoAABgwADysz4HTorZiuMAAJPyYMAA9HkBJorZARaK5S6T8Yuzi7lgwAD0eU6K94r9AAAnYMAA9HkBk06LDAAAAJPzYMAA9HkATosUAAAAk/RgwAD0eQBDiyQiHIs1gYsrwAR9xICLAQABkwDAAPWoAByLQoKLPMAEfeZcAQABGotEi7oAwAD1pkE+A06LXItmAACE8FsBHItxFotoLpQEi7OLuEQBAAE1AAAAAQBgwAD0eQGCi3LABH3mNQAAAAEAYMAA9HkBiotywAR95hyLd4UAwAR+Yl0BAAGUAMAA9Z6FAMAEfmIAAEmLhByLkBqLiIu3QQEAAYWLk8AEfkYAwAD10j4CSYypHIy2hIytwAR+A0EBAAEcjL+CjLnABH3mgUEBAAGUAMAA9Z8AwAD1nD4BPYyM0sAEfgMcjNqEjNLABH4DXQEAAZQAwAD1nj4CPYuM/cAEffUcjQyCjQbABH3mgUEBAAGUAMAA9Z89jI0dwAR+A4KNKMAEfeZCjUUASY1eHI1shY1iwAR+RkEBAAGAjW/ABHxoAMAA9dI+AUqNhAEqPz2JjaTABH3EHI2tgY2kwAR9xIFBAQABlADAAPWfSY2/HI3Jgo3DwAR95lwBAAEajcuLugDAAPWmPgI9HI3oFo3fLpQEi7OLuICyAgACgo3pwAR95oCN8sAEfGgAAD0XjgMuk/GLsxyOCRaOAy6T8Yuzi7ldAQABlAAAi7lJjhomjiUBHI4lFo4eLpPxi7OLuVwBAAEajieLugAAYMAA8rM+BEOOuxyOy4SOwsAEfgNcAQABGo7Ni7oAwAD1pj4BPRyO7BaO4y6UBIuzi7iAsgIAAjUAAAABAGDAAPR5AYOO7cAEffU1AAAAAQBgwAD0eQGLju3ABH31HI7zhQDABIAyXQEAAZQAwAD1noUAwASAMhyPAhaO+S6UBIuzi7hEAQABNQAAAAEAYMAA9HkBhI8DwAR+AzUAAAABAGDAAPR5AYyPA8AEfgMcjwuFAMAEgIJdAQABlADAAPWehQDABICCAAAAAD0cj2IWj1kulASLs4u4gLICAAI1AAAAAQBgwAD0eQGDj2PABH31NQAAAAEAYMAA9HkBi49jwAR99RyPaYUAwASA2F0BAAGUAMAA9Z6FAMAEgNiAj2/ABHxoAAA9F4+ALpPxi7Mcj4YWj4Auk/GLs4u5XQEAAZQAAIu5Q5AFHJATg5AMwAR99VwBAAEakBWLugDAAPWmPRyQKBaQHy6UBIuzi7iAsgIAAjUAAAABAGDAAPR5AYOQKcAEffU1AAAAAQBgwAD0eQGLkCnABH31HJAvhQDABIFtXQEAAZQAwAD1noUAwASBbSsAAD4CPReQUi6UBIuzNZBiAAABAF3AAPYOAV8AAAEekGLAALsfAAFfAAAAADUAAAABAFsBHJB3hZB1wASBuoCZAQABHJCSJpCJABaQfy6UBIuzi7hdwAD1HQFbkyAAAV8AAAAAwAD1KwDAAPYcNQAAAAEAWwEckKmFkKfABIG6TwEAAYCQrcAEfGgAwAD2G4UAwASBuou4PReQvy6T8YuzGpDIi7eLuUqQ3wEpBovBLJD5kQqRVgAAgJkBGpD6wADuSwAAAQOREJFWAAAAAQEBkR0AACCE+V3AAPTbAV8AAAAAXAE+AT0ckTaAkS3ABIJ8g7wBAAE0kT4DkT6RUQAAAAEBAZE/AAAAlAdfAAAAAGDAAPKzAUqRSAEckUguTwEAAYGRTMAEgrAAi8AAwAD06waLwiyRW5FpkzkAAJPfARqRXMAA7ksAAAEDkW+TOQAAAAEBAZF3AAAAkw1gwAD1xQAAXwAAAT4BSZGGHJGRFpGKLpPxi7OLuUEBAAErAMAA9dI+AUqRogEmkaIBIxyRsxaRqS6UBIuzi7hBAQABgJG2wASDAQDAAPXSFpHALpQEi7OLuCsBW18AAEmR3RyR6RqR4Yu3QQEAARaR7C6T8Yuzi7kAwAD10j4BSpH8ASaR/AEckg0WkgMulASLs4u4k98BAAGAkhTABIMBAABfAAA+AkWSMQKSOpJEAACT8mDAAPR5ASaSOgEWkkYuk/GLs4u5YMAA9HmSTpJQAABbYMAA9HkBkwEiHJJfgZJVwASDs4CLAQABkwDAAPWoABySaIKSZsAEg9RcAQABGpJqi7oAwAD1pgGKknTABIPUHJJ1gpJ0wASD1F0BAAGUAMAA9Z5BPgROkoeSkQAAhPBbARySnBaSky6UBIuzi7hEAQABgpKdwASD1AAASZKpHJK1GpKti7dBAQABg5K4wASEMgDAAPXSQpLDAD9JktUckuODktnABIQyQQEAAYCS5sAEgwEAwAD10kqS7wEmku8Bg5L2wASEMl8AAD89iZMJwASDsxyTEoGTCcAEg7OBQQEAAZQAwAD1n0qTJAErBovDLJM+k0+VsgAAk+ABGpM/wADuSwAAAQOTVZWyAAAAAQEBk10AAACTDWDAAPXFAABgwADyswE+AUmTbByTdxaTcC6T8Yuzi7lBAQABKwDAAPXSPgFJk4gck5YWk4wulASLs4u4QQEAAYCTmcAEhOwAwAD10j4CPReTrC6UBIuzGpO4i7eLuEqTyQEpPgFKk+0BKkmUDhyUGhqUEou3QQEAARaUHS6T8Yuzi7kAwAD10j4BSpQtASaULQEclD4WlDQulASLs4u4k+ABAAGAlEXABITsAABgwADysz4CRZRiApRrlHUAAJPyYMAA9HkBJpRrARaUdy6T8Yuzi7lgwAD0eZR/lIEAAFtgwAD0eQGTASIclJCBlIbABIWqgIsBAAGTAMAA9agAHJSZgpSXwASFy1wBAAEalJuLugDAAPWmAYqUpcAEhcsclKaClKXABIXLXQEAAZQAwAD1nkE+BE6UuJTCAACE8FsBHJTNFpTELpQEi7OLuEQBAAGClM7ABIXLAABJlNoclOYalN6Lt0EBAAGDlOnABIYpAMAA9dJClPQAP0mVBhyVFIOVCsAEhilBAQABgJUXwASE7ADAAPXSPgM9HJU1FpUsLpQEi7OLuICyAgACgpU2wASFyxqVO4u3AAA9F5VOLpPxi7MclVQWlU4uk/GLs4u5gUEBAAGUAACLuUqVYgEpPz2JlYHABIWqHJWKgZWBwASFqoFBAQABlADAAPWfSpWcASoGi8QslbeVyJYJAACT4QEalbjAAO5LAAABA5XRlgkAAAABAQGV4wAAAIObXcAA9NsBYMAA9cUAAFwBPgE9HJX2gJXwwASHGYO8AQABFpX+LpPgi8MAwAD06waLxSyWDpYfmBkAAJPiARqWD8AA7ksAAAEDliqYGQAAAAEBAZYwAAAAk+NhAV8AAGDAAPKzAABcAT4BSZZHHJZSFpZLLpPxi7OLuUEBAAErAMAA9dI+AUmWYxyWa4CWZ8AEh3IgAQABJpZsARaWbC6UBIuzi7hfAAAAAD4BPReWgi6UBIuzGpaOi7eLuD9JlqoclrYalq6Lt0EBAAEWlrkuk/GLs4u5AMAA9dI+AT0cltMWlskulASLs4u4k+IBAAGAlt/ABIdyAAA+AUWW+QKXApcMAACT8mDAAPR5ASaXAgEWlw4uk/GLs4u5YMAA9HmXFpcYAABbYMAA9HkBkwEiHJcngZcdwASIHoCLAQABkwDAAPWoAByXMIKXLsAEiD9cAQABGpcyi7oAwAD1pgGKlzzABIg/HJc9gpc8wASIP10BAAGUAMAA9Z5BPgROl0+XWQAAhPBbARyXZBaXWy6UBIuzi7hEAQABgpdlwASIPwAASZdxHJd9Gpd1i7dBAQABg5eAwASInQDAAPXSQpeLAD9Jl50cl6WAl6HABIdyIAEAASaXpgGDl6bABIidXwAAAAA+Aj0cl8cWl74ulASLs4u4gLICAAKCl8jABIg/GpfNi7cAAD0Xl+Auk/GLsxyX5haX4C6T8Yuzi7mBQQEAAZQAAIu5Pz2Jl/zABIgeHJgFgZf8wASIHoFBAQABlADAAPWfBovGLJgemC+YhQAAk+UBGpgfwADuSwAAAQOYOpiFAAAAAQEBmEAAAACT42EBXwAAYMAA8rMAAFwBPgE9HJhXLpPiAQABNJhjA5hjmIAAAAABAQGYZgAAAJMNXwAAAABgwADyswFKmHIBIRyYd4CYc8AEiYcgAQABgZh4wASJtgAAAIvFBovHLJiKmJuZOQAAk+QBGpiLwADuSwAAAQOYpJk5AAAAAQEBmLYAAACE+V3AAPTbAWDAAPXFAABcAT4CTpjKmM4AAJQIXcAA9g4BWwEjJZjZgJjQwASKC13AAPYOAVsUmOLABIoLAAFdwAD2DgFbHJj2gJjtwASKC5HiAAAAAMAA9PIBXcAA9g4BYMAA9cU9HJkDLpPiAQABNJkPA5kPmTQAAAABAQGZEgAAAJMNXwAAAABgwADyswFKmR4BIRyZI4GZH8AEiiSC0AEAAYKZLMAEio4AwAD2GgCLxQaLyCyZPplPmuwAAIO8ARqZP8AA7ksAAAEDmVaa7AAAAAEBAZlcAAAAhVthAV8AAFwAAFwBPgFJmXUcmYAWmXkuk/GLs4u5QQEAASsAwAD10j4BSZmRIRyZnRqZlYu3QQEAARaZoC6UBIuzi7gAwAD10j0cmbGAmavABIrnIAEAASaZsgEWmbIulASLs4u4XwAAAAA/SZnJHJnVGpnNi7dBAQABFpnYLpPxi7OLuQDAAPXSPgE9HJnyFpnoLpQEi7OLuIO8AQABgJn6wASK5wAAPgFFmhYCmh+aKQAAk/JgwAD0eQEmmh8BFporLpPxi7OLuWDAAPR5mjOaNQAAW2DAAPR5AZMBIhyaRIGaOsAEi5qAiwEAAZMAwAD1qAAcmk2CmkvABIu7XAEAARqaT4u6AMAA9aYBippZwASLuxyaWoKaWcAEi7tdAQABlADAAPWeQT4ETppsmnQAAJMNWwEcmn8WmnYulASLs4u4RAEAAYKagMAEi7sAAEmajByamBqakIu3QQEAAYOam8AEjBkAwAD10kKapAA/PRyavICatsAEiucgAQABJpq9AYOavcAEjBlfAAAAAD2Jms/ABIuaHJrYgZrPwASLmoFBAQABlADAAPWfBovJLJrxmwKbhQAAg8YBGprywADuSwAAAQObDZuFAAAAAQEBmx8AAACDm13AAPTbAWDAAPXFAABgwADyswE+AkabLJs/AAAAAQBgwAD1xQCAmzjABIy9PgJOmzMAAACDBl8AAAEmmywBgZszwASM3l8AAEmbRyEcm1EugtABAAGCm1rABIzzAIu/SpteASo/Spt2ASkGi8osm4qblpvOAACB0AEam4vAAO5LAAABA5ubm84AAAAAAAAAXAE+Aj0Xm6QulASLsxqbsIu3i7g9F5u9LpPxi7Mri7kGi8ssm9Ob5pwhAACT5gEam9TAAO5LAAABA5vrnCEAAAABAQGb8wAAIIObXcAA9g4BXwAAAABdwAD2DgFfAAABSpv9ATWcAQAAAQBdwAD2DgFfAAABHpwBwAC7IQEBXwAAAS4ANQAAAAEAWwEcnBSBnBLABI24gJkBAAGAnBvABI2XAMAA9hyBAMAEjbgGi8wsnCacPJydAACT5wEanCfAAO5LAAABA5xInJ0AAAABAQGcVQAAAIObXcAA9g4BYMAA9cUAAF2LtAFfAAABSpxlAR+caYvVAQFfAAABHJx9LoEnAQABNJyDA5yDnJsAAAABAQGchAAAAIMGXwAAAABgwADyswFKnIoBHJyQgJyKwASOJILQAQABgZyZwASOZgDAAPYaAMAAvXgABovNLJyinLidGAAAk+gBGpyjwADuSwAAAQOcwp0YAAAAAQEBnM8AAACDm13AAPYOAWDAAPXFAABdi7QBXwAAAUqc3wEfnOOL1QEBXwAAARyc9y6BJwEAATSc/QOc/Z0WAAAAAQEBnP4AAACDBl8AAAAAYMAA8rMBSp0EASEcnQuAnQXABI7BgtABAAGBnRTABI8DAMAA9hoAwAC9eAAGi84snR2dM56FAACR4gEanR7AAO5LAAABA504noUAAAAAAAAAXYu0AV8AAAE+A06dS51SAACBEF2LtAFfAAABH51Yi9QAAV8AAAAASZ1pHJ10Fp1tLpPxi7OLuUEBAAErAMAA9dI+AT0XnYyAnYXABI9rlASLsxadmC6UBIuzi7iLuEmdrhyduRadsi6T8Yuzi7lBAQABGp28i7cAwAD10j4CPRed1ICdzcAEj2uT8YuzGp3di7eLuT0XnfOAnezABI9rlASLsxyeCRad/y6UBIuzi7iR4gAAAAAAi7g+Aj0XniyAniXABI9rk/GLsxaeNS6T8Yuzi7mLuT0XnkqAnkPABI9rlASLsxyeYBaeVi6UBIuzi7iAoQAAAAAAi7hKnnQBgJ57wASPawAABHd1AAR3ugAEeBEABHjxAAR5tgAEengABHxFAASCWAAEgt0ABITIAASG9QAEh04ABIljAASJ5wAEisMABIyZAASNLgAEjXMABI4AAASOnQAEjzsABJBmAAAAFQKL1iyeip6QntoDlAkAAAFgwAD1xQAAAAEFi9osnqKeqJ63AQAAA561nrcAAAAAAAAAYIvWAT8BCQGeqMAA9dsAAAAAAQaL2Cyeu57HntgAACMBGp68wADuSwAAAQOez57YAAAAAAAAAGDAAPZdAUqe1QEngUEAAASRCAAEkTkAAAABAovbLJ7dnuOgSgOUCgABAACDk2DAAPXFAVsBYMAA9cUAAV3AAPUWAV8AAAIEi94snxufIxiT/IuzAFsABIvfLJ8pnzFYhXKLswBfAAABKwEFi+UsnzWfNZ9ZAAAAA59Kn1kAAAABAQGfUAAABJP8WwAAXYvbAV8AAAE/AggBi96AAMAEka4JAZ81wAD12wAAAAACBovhLJ9en3CfgwEAVwEan1/AAO5LAAABA594n4MAAAAAAAAAXwAAAUqfewEWn3suhXKLs4vfBovjLJ+In5mgSAAAVgEan4nAAO5LAAABA5+hoEgAAAAAAAAAYMAA8rMBPgRJn6ocn70an7WLt0EBAAEWn8Auk/yLs4veAMAA9dI+Aj0Xn9IuhXKLsyuL30qf6QEqPz0XoAEuhXKLsyagAQEWoAwuk/yLs4veXwAAi989F6AaLpP8i7MaoCyLt4veSqA5ASkAAASR2QAEkg8ABJKeAAAAAgKL5iygTaBTojcDlAsAAQAAg5NgwAD1xQFbAWDAAPXFAAFdwAD1FgFfAAAEBIvpLKCQoJUJk/6LswBdwAD1HQFbAASL6iygnaCnGJP/i7MAYMAA9HkABIvrLKCvoLkYlACLswBgwAD0eQGTBIvsLKC/oMdYhXKLswBfAAABKwEFi/IsoMugy6D7AAAAA6DeoPsAAAACAgKg5AAABJP+XcAA9R0BWwCg8AAABJP/YMAA9HkAAF2L5gFfAAABPwMIAYvpgADABJNGCAGL6oEAwASTVQkBoMvAAPXbAAAAAAIGi+4soQChEqElAQBXARqhAcAA7ksAAAEDoRqhJQAAAAAAAABfAAABSqEdARahHS6Fcouzi+wGi/AsoSqhO6I1AABWARqhK8AA7ksAAAEDoUOiNQAAAAAAAABgwADyswE+A0OhTByhXhahUy6T/4uzi+qAiwEAAZMAwAD1qD4CTqFvoXkAAITwWwEcoYAWoXsuk/6Ls4vpRAEAATUAAAABAGDAAPR5ARahgS6UAIuzi+s1AAAAAQBgwAD0eQEXoYEulACLsxyhh4AAwASUKl0BAAGUAMAA9Z6L64AAwASUKgDAAPUsSaGSIRyhpRqhnYu3QQEAAYChqMAElA4AwAD10j4DPRehvS6FcouzJqG9AYChyMAElA5fAACL7D0Xodsuk/+Lsxyh5Rah2y6T/4uzi+qBQQEAAZQAwAD1n4vqSqHxASk/PReiEC6FcouzK4vsSqIlASoAAASTjgAEk8QABJTkAAAAAgAAASwABJT3AAR2cgAEkMMABJFGAASSrwAElPUAAAAEAASU9wAAAAAAi/OUDC0AAAqLbAAAwAC/AAABAQEEi44AAKAUAACLpQEAoBQAAIu9AAChvQABAQGEjIvuAQChvQABAQGEjIwgAACh4AAAjEUAAJaZAACMZQAAnbwAAIyBAACh5wAAjKEAAKIhAAAQoBWgSqBjoGygd6DcoOmg9qEJoRKhSaFOoVahi6Gkob4AAICOAowOLYzbjOqPiQeUDQAAAWDAAPXFAAAAAQWMFC2M84z5jP8BAAADjP2M/wAAAAAAAABgjA4BPwEJAYz5wAD12wAAAAADBowQLY0EjQSNFQAClA4AAAABA40KjRUAAAABAQGNEwAAAIDUXaESAVsAAFsABowRLY0ZjR6NNgAClA8AAAABA40rjTYAAAABAQGNNAAAAIDUXaESAVsAAFwABowSLY9bj2KPhwAAIwAAAAEDj2qPhwAAAAAAAABgwAD2XQFKj3ABHo9wlqUBAAEuAAAABJXtAASWGgAElkcABJZ4AAAAAwKMFS2P+5AKmOcHlBAAAAFgjA4AAAUEjBgtkC+QPwSUEYvzAGDAAPR5AZMEjBktkE2QhgmDiQBgwAD0eQEbkFiMGByQehyQdRqQaIwYXQEAAZQAwAD1noMsAQABN/////8AwAD0kQSMGi2Qm5CoBpQSAGDAAPR5ARyQppSBVgAAAADAAPScBIwbLZC2kLwYklEAYIwVASsEjBwtkZCRpRiUEwBgwAD0eQEakZ2MGgEFjCoAAAAABAAAAwAAAAAAAAAAAGCMFQE/AQkBAIwUAAAAAAkGjB4tkaqRqpG/AAKUDgAAAAEDkbCRvwAAAAEBAZG9AAAAgNRdoHcBWwAAWwAGjB8tkcORw5HbAAKUDwAAAAEDkdCR2wAAAAEBAZHZAAAAgNRdoRIBWwAAXAAGjCAtkd+R35H/AAKUFAAAAAEDkfCR/wAAAAEBAZH9AAAAgNRgoU4AAFsABowhLZN4k32T8wAAlBUAAAABA5OJk/MAAAACAgKTkwAAAJQWYIwVAJOjAAAAlBdgjBUAAFwBPgE9HJO2LpQUAQABH5PMlDYCAAKAk9vABJgCgZPiwASYDQAAjCAGjCItlR+VJJWJAACUGAAAAAEDlS+ViQAAAAEBAZU5AAAAlBdgjBUAAFwBPgI9HJVTFpVMLpJRjBuUFQIAAi6AlWbABJheAIwhPReVeC6SUSuMGwaMIy2WeZZ+lsQAAJPgAAAAAQOWhJbEAAAAAAAAAFwBPgI9NQAAAAEAYIwVARaWjS6SUYwbIxyWlYAAwASYuEEBAAErAAArHJaVgADABJi4lBUCAAIuKwCMIQFcPReWsy6SUSuMGwaMJy2WyZbXlwcBAJQZAAAAAQOW6pcHAAAAAAAAAGCT3wFKlu0BNQAAAAEAYIwVARaW7S6SUYwbIxyW9YAAwASZIUEBAAErAAArFpb1gADABJkhlBmMJwFgk98GjCgtl+yX+ZhzAQCEvgAAAAEDmAKYcwAAAAAAAABgk/gBPgJJmAgcmBcWmAwulBOMHEEBAAEamBqMGgDAAPWcSpgkATUAAAABAGCMFQEWmCsuklGMGyMcmDOAAMAEmZpBAQABKwAAKxaYM4AAwASZmoS+jCgBYJP4P0qYQQEcmEgulBqL8wEAARaYZC6UE4wcAIwlBowlLZh4mIGY5QAAlBqL8wAAAAEDmJyY5QAAAAEBAZihAAAAgxVgwAD0eQAAYJP4AT4BSpivATUAAAABAGCMFQEWmLYuklGMGyMcmL6BAMAEmiFBAQABKwAAKxyYvoEAwASaIZQai/MBAAGAmNrABJoIAIwlAWCT+AAABJdgAASXjQAEl7oABJflAASYQQAEmJQABJj6AASZVQAEmekABJpiAAAACQKMKy2ZqZm9mr8HlBsBGpmqoiMAAWCMFQAAAQSMLS2Z9pn/CZQcARqZ3aIoYIw3AAEFjDEtmgSaBJp9AAAAA5oNmn0AAAABAQGaGAAAAJQcYIw3AABgjCsBPgE9F5puFppkLpQcjC2Dsi6MOgIIAIwtNQAAAAEAYIw3AYCaPMAEmtgjHJpGgQDABJsBQQEAASsAAB+aTYxGAAAAAIEAwASbAQFgjDcJAZoEjCoAAAAAAQaMLy2agpqUmr0BAJQdAAAAAQOaopq9AAAAAAAAAGChvgFKmqUBNQAAAAEAYIw3ARaapS6UHIwtIxyasIAAwASbZ0EBAAErAAArFpqwgADABJtnlB2MOQFgob4AAASbQAAEm5sAAAABAowyLZrCmtGbPweUHgAAAWCMFQAAAAEFjDYAAAAABAAAAwAAAAAAAAAAAGCMMgE/AQkBAIwqAAAAAAEGjDQtmy6bNps9AQKEGAAAAAEDmz2bPQAAAAAAAABgwAD23gAAAASb4wAEnAcAAAABAow3LZu2m8ShTAOUHwEam7eiJAABYMAA9cUAAAIEjDktm+Cb7RiUHQBgob4BKwSMOi2cBZwJGIOyARqb86IlYIwrASsBBYxGAAAAAAQAAAMAAAAAAAAAAABgjDcBPwEJAQDAAPXbAAAAAAgGjDwtnA6cFZzYAAAjAAAAAQOcHZzYAAAAAAAAAGDAAPZdAT4DSZwmIRycOBacKi6UHYw5QQEAASsAwAD10j4BSpxJASScbQInlCAWnF8ulB2MOT9JnHkhHJyCFpx9LoOyjDpBAQABKwDAAPXSPgFKnJMBJJyuAieUIBacqS6Dsow6P0qcugEnlCEGjD4tnN2c6Z16AQCUIgAAAAEDnPOdegAAAAAAAABgjEcBPgJJnPkcnQIWnP0ug7KMOkEBAAErAMAA9dI+AT0wnRMknVQCLieUIz9KnWABJp1sABadZy6Dsow6YIxHBow/LZ1/nYmeFAEAlCQAAAABA52RnhQAAAAAAAAAYIzOAT4CSZ2XHJ2gFp2bLoOyjDpBAQABKwDAAPXSPgE9MJ2xJJ3wAi4nlCU/Sp38ASaeCAAWngMug7KMOmCMzgaMQC2eGZ4knrIBAJQmAAAAAQOeLZ6yAAAAAAAAAGCNEwE+AkmeMxyePBaeNy6Dsow6QQEAASsAwAD10j4BPTCeTSSejQIuJ5QnP0qemQEmnqUAFp6gLoOyjDpgjRMGjEEtnreewZ9MAQCUKAAAAAEDnsmfTAAAAAAAAABgjTEBPgJJns8cntgWntMug7KMOkEBAAErAMAA9dI+AT0wnukknygCLieUKT9KnzQBJp9AABafOy6Dsow6YI0xBoxCLZ9Rn2Gf/gEAlCoAAAABA59vn/4AAAAAAAAAYI1eAT4CSZ91HJ9+Fp95LoOyjDpBAQABKwDAAPXSPgE9MJ+PJJ/UAi4nlCs/Sp/gASaf7AAWn+cug7KMOmCNXgaMQy2gA6ARoKgBAJQsAAAAAQOgHaCoAAAAAAAAAGCNnwE+AkmgIxygLBagJy6Dsow6QQEAASsAwAD10j4BPTCgPSSggAIuJ5QtP0qgjAEmoJgAFqCTLoOyjDpgjZ8GjEQtoK2guaFKAQCULgAAAAEDoMOhSgAAAAAAAABgjKkBPgJJoMkcoNIWoM0ug7KMOkEBAAErAMAA9dI+AT0woOMkoSQCLieULz9KoTABJqE8ABahNy6Dsow6YIypAAAEnH8ABJ0JAASdZwAEncUABJ4jAASegQAEnt8ABJ89AASfmwAAAAgCjEctohaiIbnuA5QwARqiF6IjAAFgjCsAAl3AAPK/AWCMR2CMMhEEjEktozyjRRiR4QBgwAD23gAEjEoto42jlBiEGABgwAD23gAEjEsto6qjvwaUMQBgwAD0eQEco7uUg4IBAAGTAMAA9JUEjEwto9Sj6gaUMgBgwAD0eQEco+aUg4IBAAGUAMAA9JUEjE0to/Oj/BiEEgBgwAD0eQGTBIxOLaelp6kYgLAAYMAA9l0ABIxPLahgqG4YlDMAXcAA9R0BYMAA9l0BKwSMUC2ok6ieCZQ0ARqodKIlXcAA9R0BYI5jAASMUS2owajNCYDBAF3AAPUdAWCMdQAEjFItqX2pngmUNQEaqV+iJV3AAPUdAWCMNwExqZxgjDcABIxTLanKqc8JlDYBGqmki/ddwAD1HQFgjI8ABIxULanoqfAJlDcAXcAA9R0BYIypAASMVS2qBqoNCZQ4AF3AAPUdAWCMzgAEjFYtqieqMQmUOQBdwAD1HQFgjZ8ABIxXLapHqk0JlDoAXcAA9R0BYI0xAASMWS24QbhWBJQ7i/MAYMAA9HkBkwSMWi24Xrh+GJQ8i/MAYMAA9HkBG7htjFkcuGsauG2MWV0BAAGUAMAA9Z4BBYx0LapSqlKuNwAAAAOqWa43AAAADAEBql8AAASR4WDAAPbeAAuqdgAABICwYMAA9l0BK6qHAAAAg+RgwADyswEqqrEAAACUNF3AAPUdAWCOYwErqtwAAACAwV3AAPUdAWCMdQErqwIAAACUNl3AAPUdAWCMjwErqx0AAACUN13AAPUdAWCMqQErqzkAAACUOF3AAPUdAWCMzgErq1gAAACUOV3AAPUdAWCNnwErq3YAAACUOl3AAPUdAWCNMQErq4kAAASEGGDAAPbeASurogAAAJQcYIw3AStgjEcBPgc9F60+LoPkgq1LwAShyoxgPR6tW4v5AgACFq1rLoDBjFEuAD0erYSL+QIAAhatlC6UNoxTLgA9Hq2mi/kCAAIWrbYulDeMVC4APR6ty4v5AgACFq3bLpQ4jFUuAD0ere+L+QIAAhat/y6UOYxWLgA9Hq4Wi/kCAAIWriYulDqMVy4ACwgBjEmAAMAEoa4IAYxOgQDABKG8CAGMShQAwASiVgoACACMUDUAAAABAF3AAPUdAWCOYwGDq8nABKHYIxyr1RQAwASjHgwAQQEAASsAADGr5GCOYwAUAMAEox4MAAFdwAD1HQFgjmMIAIxRNQAAAAEAXcAA9R0BYIx1AYSsBMAEoeojHKwRFADABKNlDABBAQABKwAAMawnYIx1ABQAwASjZQwAAV3AAPUdAWCMdQgAjFM1AAAAAQBdwAD1HQFgjI8BhaxAwASh/CMcrEYUAMAEo6wMAEEBAAErAAAxrFZgjI8AFADABKOsDAABXcAA9R0BYIyPCACMVDUAAAABAF3AAPUdAWCMqQGGrHLABKIOIxysexQAwASj8wwAQQEAASsAADGsh2CMqQAUAMAEo/MMAAFdwAD1HQFgjKkIAIxVNQAAAAEAXcAA9R0BYIzOAYesosAEoiAjHKyqFADABKQ6DABBAQABKwAAMay0YIzOABQAwASkOgwAAV3AAPUdAWCMzggAjFY1AAAAAQBdwAD1HQFgjZ8BFKzSwASiMggAIxys3RQAwASkgQwAQQEAASsAADGs62CNnwAUAMAEpIEMAAFdwAD1HQFgjZ8IAIxXNQAAAAEAXcAA9R0BYI0xARStBcAEokQJACMcrQwUAMAEpMoMAEEBAAErAAAxrRZgjTEAFADABKTKDAABXcAA9R0BYI0xCQCtIowxAQABFK0owASiZAsAABQGjFwtpbalv6XoAQCD5AAAAAEDpcql6AAAAAAAAABgwADyswFKpc0BIRyl5Byl1Balzi6EEoxNgywBAAEapdaMSwDAAPSRQQEAAZMAwAD1nAaMYC2l7KX1plYCAIPkAAAAAQOl/6ZWAAAAAQEBpgUAAACAimDAAPKzAABcAT4BPRemEi6EEiOAphrABKWPHKYpFqYjLoQSjE2A3wEAARqmK4xLAMAA9JIcpkIWpjwuhBKMTYMsAQABHKZEGqZFjEuSlQAAAADAAPSUAMAA9JEBYMAA9HmMTQaMXS2m9qb/pygBAJQ9AAAAAQOnC6coAAAAAAAAAGDAAPKzAUqnDgEhHKckHKcUFqcOLoQSjE2DLAEAARqnFoxMAMAA9JFBAQABkwDAAPWcBoxhLacspzWnmQIAlD0AAAABA6dAp5kAAAABAQGnRgAAAICKYMAA8rMAAFwBPgE9F6dTLoQSI4CnW8AEpmYcp2oWp2QuhBKMTYDfAQABGqdsjEwAwAD0khynhBanfi6EEoxNgywBAAEcp4Yap4eMTJKVAAAAAMAA9JQAwAD0kQFgwAD0eYxNBoxeLa8SryevbwEAlD4AAAABA68vr28AAAAAAAAAXcAA9NsBYI0TAUqvOAEcr18xr0pdwAD02wFgjRMCFq9LLpQ6jFcWr1MulDmMVpMiAQFgjRMBNK9mA69mr24AAAABAQGvZwAAAIMwXcAA9NsBYI0TAABdwAD02wFgjRMBSq9tAYCvbcAEpzIAwAD06QaMYy2vdK95sGMAAJQ/AAAAAQOvgrBjAAAAAQEBr4oAAACSW2CNEwAAXAE+Aj0Xr5+Ar5jABKd7klEujBtJr7Ilr72Ar7bABKd7YI2fPgE9HK/eFq/TLpQ5jFZPAQABFK/iwASnewABYI2fAMAA9S5Jr/YlsAGAr/rABKd7YI0xPgE9HLAaFrATLpQ6jFdPAQABFLAewASnewABYI0xAMAA9S4+AT0wsDofsETAAPOsAQABgLBSwASnewAGjGQtsGiwbbDDAACUQAAAAAEDsHqwwwAAAAEBAbCGAAAAg7JgjmMAAFwBPgI9F7CXgLCSwASoNpJRLowbPRywthawqi6UNIxQTwEAAYCwusAEqDYAwAD1LgaMZS2wyLDNsRsAAJRBAAAAAQOw1bEbAAAAAQEBsNwAAACUQmCMzgAAXAE+Aj0XsPGAsOrABKiPklEujBs9HLEMFrEELpQ4jFVPAQABgLEQwASojwDAAPUuBoxmLbEgsSWxbwAAlEMAAAABA7EtsW8AAAABAQGxNAAAAJREYI0xAABcAT4CPRexR4CxQcAEqOiSUS6MGz0csWEWsVoulDqMV08BAAGAsWXABKjoAMAA9S4GjGctsXSxebHbAACURQAAAAEDsYWx2wAAAAEBAbGQAAAAhDBgjZ8AAFwBPgI9F7GrgLGhwASpQZJRLowbPRyxyRaxvi6UOYxWTwEAAYCxzcAEqUEAwAD1LgaMaC2x4LHlsj4AAJRGAAAAAQOx77I+AAAAAQEBsfgAAACUR2CMqQAAXAE+Aj0XshGAsgjABKmaklEujBs9HLItFrIkLpQ3jFRPAQABgLIxwASpmgDAAPUuBoxpLbJDski1NAAAlEgAAAABA7JdtTQAAAAAAAAAXAE+BUAhHLJ7FrJtLpQdjC9BAQABKwDAAPXSsm2yggBFsokBspKylAAAW2DAAPR5AZMBHLKbgLKZwASqGFwBAAEWsqYWsp0ulDeMVFrAAPVMAMAA9aYBiLKwwASqGByyroCysMAEqhhdAQABlADAAPWePgJOssOyzAAAlEdgjKkBHLLWFrLOLpQ3jFREAQABgLLXwASqGADAAPUsPRyzDRyy7xay4S6UHYwvlEkBAAGBswPABKppAKHTlEoBAAEWsx2BsxTABKpplByMLQCh1kWzMwGzPLM+AABbYMAA9HkBkwEcs0WAs0PABKrIXAEAARazThazRy6UOoxXWsAA9UwAwAD1pgGIs1jABKrIHLNWgLNYwASqyF0BAAGUAMAA9Z4+Ak6zabNvAACURGCNMQEcs3cWs3EulDqMV0QBAAGAs3jABKrIAMAA9Sw9HLOqHLOQFrOCLpQdjC+USwEAAYGzo8AEqxkAodKUSgEAARazt4GzscAEqxmUHIwtAKHWRbPNAbPWs9gAAFtgwAD0eQGTARyz34Cz3cAEq3hcAQABFrPsFrPhLpQ5jFZawAD1TADAAPWmAYiz9sAEq3gcs/SAs/bABKt4XQEAAZQAwAD1nj4CTrQLtBIAAJJbYI2fARy0Hha0FC6UOYxWRAEAAYC0H8AEq3gAwAD1LD0ctFIctDcWtCkulB2ML5RLAQABgbRKwASryQCh0pRKAQABFrRggbRZwASryZQcjC0AodZFtHYBtH+0gQAAW2DAAPR5AZMBHLSIgLSGwASsKFwBAAEWtJIWtIoulDiMVVrAAPVMAMAA9aYBiLScwASsKBy0moC0nMAErChdAQABlADAAPWePgNOtK20tAAAlEJgjM4BHLS9FrS2LpQ4jFVEAQABgLS+wASsKADAAPUsPRy07By01ha0yC6UHYwvlEwBAAEWtOaBtN/ABKx5gLCM1AChz5RKAQABFrT6gbTzwASseZQcjC0AodY9HLUTgbUMwASseZRIAAAAAI0HBoxqLbU5tT61kwAAlE0AAAABA7VLtZMAAAABAQG1XgAAAIOyYIx1AABcAT4BPRy1dxa1ai6AwYxRTwEAATW1ewAAAQBgjHUBgLV7wAStCzUAAAABAFsBF7WBgbV/wAStLJJRLowbgQDABK0sAMAA9S4GjGsttZi1nbXfAACUTgAAAAEDtaS13wAAAAEBAbWxAAAAg7JgjI8AAFwBPgE9HLXDFrW9LpQ2jFNPAQABNbXHAAABAGCMjwGAtcfABK18NQAAAAEAWwEXtc2BtcvABK2dklEujBuBAMAErZ0AwAD1LgaMbC215LXkthEAAJQOAAAAAQO16rYRAAAAAQEBtfcAAACA1F2gdwFbAABbAUq1/QEctf+Atf3ABK3tlE8BAAEuAKDNBoxtLbYWtha2+gAAlA8AAAABA7YjtvoAAAABAQG2LAAAAIDUXaESAVsAAFwBPgc9HrY1i/oCAAIWtj8ulDSMUIC2TMAErjEAPR62VIv6AgACFrZeLoDBjFGAtmzABK4xAD0etnSL+gIAAha2fi6UNoxTgLaFwASuMQA9HraNi/oCAAIWtpculDeMVIC2ocAErjEAPR62qYv6AgACFrazLpQ4jFWAtrzABK4xAD0etsSL+gIAAha2zi6UOYxWgLbawASuMQA9Hrbii/oCAAIWtuwulDqMV4C29MAErjEABoxuLbb/tv+4MQAAlBQAAAABA7cQuDEAAAABAQG3HQAAAIDUYKFOAABbAT4HPR63Jov+AwADFrc0LpQ0jFCAt0HABK8PLgA9HrdPi/4DAAMWt10ugMGMUYC3a8AErw8uAD0et3mL/gMAAxa3hy6UNoxTgLeOwASvDy4APR63nIv+AwADFreqLpQ3jFSAt7TABK8PLgA9HrfCi/4DAAMWt9AulDiMVYC32cAErw8uAD0et+eL/gMAAxa39S6UOYxWgLgBwASvDy4APR64D4v+AwADFrgdLpQ6jFeAuCXABK8PLgAGjG8tuIO4h7jAAACB3wAAAAEDuJC4wAAAAAEBAbiZAAAgg5tgjEcAAGDAAPR5AUq4owEcuK4WuKMulDyL84xagUEBAAEWuLaAuLDABK/ylDyL84xaAMAA9Z8GjHAtuT65RblpAAAjAAAAAQO5TblpAAAAAAAAAGDAAPZdAUq5UwEeuVOWnQEAAS4ABoxyLbluuXe57AAAlBqL8wAAAAEDuZK57AAAAAEBAbmXAAAAgxVgwAD0eQAAYJP4AT4BSrmlAR65rIwBAwADFrnELpQZjCcWudguhBiMSoC54cAEsH8AAAAEpSIABKVyAASl+QAEpkkABKbQAASnXgAEqBkABKhyAASoywAEqSQABKl9AASp1gAErO4ABK1fAASt0AAErhQABK7yAASv1QAEsC8ABLBgAASwtwAAABQCjHUtuwW7C8AARDIDlFAAAAFgjBUAAAcEjHctuza7OxiEEgBgwAD0eQAEjHgtu1e7YgmUNABdwAD1HQFgjmMABIx5Lbtxu4kYlFEAYIw3AASMei28S7xPGICwAGDAAPZdAASMey28a7x2CZRSAF3AAPUdAWCMmgAEjHwtwABB8cAAQgQGlFMAYMAA9HkBHMAAQgCUg4IBAAGTAMAA9JUEjH0twABCGcAAQi4GlFQAYMAA9HkBHMAAQiqUg4IBAAGUAMAA9JUFBYyKLbx7vHu9ZwAAAAO8jL1nAAAABQUFvJEAAACEEmDAAPR5ALypAAAAlDRdwAD1HQFgjmMAvMQAAACUVWCMRwC83AAAAICwYMAA9l0AvPMAAACUUl3AAPUdAWCMmgAAYIx1AT8BCgC9DYyOBQAFgL0mwASx74G9LcAEsfwWvUqCvTrABLINlByMLYO9VcAEshiEvVvABLIlAAWMiy29bL1svogAlFYAA72MvogAAAAEAgK9lQAAAJRVYIxHAL2tAAAAgLBgwAD2XQACvcsAAACUUl3AAPUdAWCMmgErvekAAACUNF3AAPUdAWCOYwErYIx1AT8BCgC+BIyOBQAFGr4QjH01AAAAAQBdwAD1HQFgjmMBg74ewASytSMcviqEAMAEstxBAQABKwAAMb45YI5jAIQAwASy3AFdwAD1HQFgjmMWvlmAvknABLKKlByMLYG+ZMAEspU1AAAAAQBdwAD1HQFgjJoBgr5qwASyoyMcvnaEAMAEszBBAQABKwAAMb6FYIyaAIQAwASzMAFdwAD1HQFgjJoABYyMLb6Nvo2/lgCUVwADvqW/lgAAAAQBAb6uAAAAlFVgjEcAA77NAAAAgLBgwAD2XQErvuQAAACUUl3AAPUdAWCMmgErvwIAAACUNF3AAPUdAWCOYwErYIx1AT8BCgC/HYyOBQAFkzUAAAABAF3AAPUdAWCOYwGDvyzABLO0Ixy/OIQAwASz10EBAAErAAAxv0dgjmMAhADABLPXAV3AAPUdAWCOYxa/Z4C/V8AEs4iUHIwtgb9ywASzlDUAAAABAF3AAPUdAWCMmgGCv3jABLOiIxy/hIQAwAS0K0EBAAErAAAxv5NgjJoAhADABLQrAV3AAPUdAWCMmgAFjI0tv5u/m8AAQKAAlFgAA7+zwABAoAAAAAMBAb+8AAAAlFVgjEcAAr/lAAAAlFJdwAD1HQFgjJoBK8AAQAMAAACUNF3AAPUdAWCOYwErYIx1AT8BCgDAAEAejI4FAAUawABAKox8NQAAAAEAXcAA9R0BYI5jAYLAAEA2wAS0pSMcwABAQoMAwAS00kEBAAErAAAxwABAUWCOYwCDAMAEtNIBXcAA9R0BYI5jFsAAQHGAwABAYcAEtIeUHIwtKzUAAAABAF3AAPUdAWCMmgGBwABAgsAEtJMjHMAAQI6DAMAEtSpBAQABKwAAMcAAQJ1gjJoAgwDABLUqAV3AAPUdAWCMmgAFjI4twABApcAAQKXAAEFtAJRZAAPAAEDCwABBbQAAAAUFBcAAQMgAAASEEmDAAPR5AMAAQNQAAASUNF3AAPUdAWCOYwDAAEDsAAAElFFgjDcAwABBCwAABICwYMAA9l0AwABBFgAABJRSXcAA9R0BYIyaAABgjHUBPgI9HsAAQSmL+QIAAhbAAEE0LpQ0jHguAD0ewABBTIv5AgACFsAAQVculFKMey4ABggBjHeAAMAEtZIIAYx4gQDABLWhCAGMeYIAwAS1tAgBjHqDAMAEtcEIAYx7hADABLXQCQHAAECljCoAAAAACQaMfy3AAEFywABBfsAAQZgBAJRaAAAAAQPAAEGPwABBmAAAAAAAAABgjEcBSsAAQZIBJsAAQZIBFsAAQZIuklGMG2CMRwaMgC3AAEGcwABBqMAAQdsBAJRbAAAAAQPAAEG2wABB2wAAAAAAAABgjEcBSsAAQbkBFsAAQdIWwABBuS6UUYx5lCKMPgaMgS3AAEIzwABCPMAAQl8BAJRcAAAAAQPAAEJFwABCXwAAAAAAAABgwADyswFKwABCSAEhHMAAQlscwABCThbAAEJILoQSjHeDLAEAARrAAEJQjHwAwAD0kUEBAAGTAMAA9ZwGjIItwABCY8AAQmzAAEKBAQCUXQAAAAEDwABCdcAAQoEAAAAAAAAAYMAA8rMBSsAAQngBIRbAAEJ5LpRcjIEGjIMtwABChcAAQo7AAEK1AQCUXgAAAAEDwABCmcAAQrUAAAAAAAAAYMAA8rMBSsAAQpwBIRzAAEKxHMAAQqIWwABCnC6EEox3gywBAAEawABCpIx9AMAA9JFBAQABkwDAAPWcBoyFLcAAQrrAAEK/wABDGAAAlEAAAAABA8AAQszAAEMYAAAAAQEBwABC2AAAAJRfYI5jAABcAT4BPRzAAEL2FsAAQuoulDSMeE8BAAE1wABC+gAAAQBgjmMBgMAAQvrABLgQNQAAAAEAWwEXwABDBoHAAEMEwAS4N5JRLowbgQDABLg3AMAA9S4GjIYtwABDHcAAQx3AAENUAACUDgAAAAEDwABDI8AAQ1QAAAABAQHAAEMwAAAAgNRdoHcBWwAAWwFKwABDNgEcwABDOIDAAEM2wAS4mZRgAQABLgCgzgaMhy3AAENZwABDWcAAQ7QAAJQPAAAAAQPAAENmwABDtAAAAAEBAcAAQ28AAACA1F2hEgFbAABcAT4CPR7AAEN4i/oCAAIWwABDgi6UNIx4gMAAQ4/ABLjvAD0ewABDl4v6AgACFsAAQ6EulFKMe4DAAEOuwAS47wAGjIgtwABDucAAQ7nAAEQwAACUFAAAAAEDwABDysAARDAAAAABAQHAAEPXAAAAgNRgoU4AAFsBPgI9HsAAQ+CL/gMAAxbAAEPuLpQ0jHiAwABD+8AEuWguAD0ewABECYv+AwADFsAARBculFKMe4DAAEQkwAS5aC4AAAAEtlgABLadAAS24gAEt0YABLeFAAS36QAEuHIABLjIAAS5QQAEuboAAAAJAoyPLcAARJTAAESawABGfAOUYQAAAWCMFQAAAgSMkS3AAETSwABE3QmUNABdwAD1HQFgjmMABIySLcAARO7AAET1CZRiAGDAAPZdAAEFjJktwABE+sAARPrAAEVNAAAAA8AARQXAAEVNAAAAAgICwABFCwAABJQ0XcAA9R0BYI5jAMAARR0AAASUYmDAAPZdAABgjI8BPgE9HsAARSyL+QIAAhbAAEU3LpQ0jJEuAAMIAYyRgADABLpWCAGMkoEAwAS6aQkBwABE+owqAAAAAAQGjJQtwABFUsAARVfAAEWwAACUQAAAAAEDwABFZMAARbAAAAABAQHAAEVwAAAAlF9gjmMAAFwBPgE9HMAARY4WwABFgi6UNIyRTwEAATXAAEWSAAABAGCOYwGAwABFksAEut81AAAAAQBbARfAAEWegcAARZzABLsGklEujBuBAMAEuwYAwAD1LgaMlS3AAEW1wABFtcAAReYAAJQOAAAAAQPAAEW7wABF5gAAAAEBAcAARcgAAACA1F2gdwFbAABbAUrAAEXOARzAAEXQgMAARc7ABLtolGMBAAEuAKDQBoyWLcAARevAAEXrwABGJwAAlA8AAAABA8AARfjAAEYnAAAAAQEBwABGAQAAAIDUXaESAVsAAFwBPgE9HsAARgqL+gIAAhbAAEYULpQ0jJGAwABGIcAEu74ABoyXLcAARizAAEYswABGegAAlBQAAAABA8AARj3AAEZ6AAAAAQEBwABGSgAAAIDUYKFOAABbAT4BPR7AAEZTi/4DAAMWwABGYS6UNIyRgMAARm7ABLwYLgAAAAS6uAAEu0EABLuXAAS78QAEvEoAAAAEAoyaLcAARrbAAEa8wABIegOUZAAAAWCMFQAAAgSMnC3AAEbhwABG5xiUZQBgwADyswAEjJ0twABG/8AARwQJjwAAXcAA9R0BYMAA9l0AAwWMpi3AAEc4wABHOMAAR1sAAAADwABHQsAAR1sAAAACAgLAAEdIAAAElGVgwADyswDAAEdVAAAEjwBdwAD1HQFgwAD2XQAAYIyaAT8DCAGMnIAAwAS81AgBjJ2BAMAEvOMJAcAARziMKgAAAAAFjKctwABHX8AAR1/AAEeKAJRmAAPAAEduwABHigAAAAEBAcAAR3QAAASPAF3AAPUdAWDAAPZdAABgjJoBPwMIAYydgADABL1CCACMnCkJAcAAR1+MKgAAAAAFjKgtwABHjsAAR47AAEe6AJRnAAPAAEedwABHugAAAAEBAcAAR6MAAASPAF3AAPUdAWDAAPZdAABgjJoBPwMIAYydgADABL2cCACMnCoJAcAAR46MKgAAAAAFBoyfLcAARwnAAEcfwABHMwEAkegAAAABA8AARyrAAEczAAAAAAAAAGCMdQFKwABHLQEmwABHLQEWwABHLS6SUYwbYIx1BoygLcAAR7/AAEfIwABH2QEAlGgAAAABA8AAR8/AAEfZAAAAAAAAAGDAAPKzAUrAAEfSASEWwABH0y6UZYycBoyiLcAAR97AAEfqwABIGgAAlA4BGsAAR9/AAO5LAAABA8AAR/DAAEgaAAAAAQEBwABH/QAAAIDUXaB3AVsAAFsBSsAASAMBHMAASAWAwABIA8AEvoiUaQEAAS4AoM8GjKMtwABIH8AASCvAAEhFAACUDwEawABIIMAA7ksAAAEDwABIOMAASEUAAAABAQHAAEhBAAAAgNRdoRIBWwAAXAE+AAaMpC3AAEhKwABIVsAASHgAAJQUARrAAEhLwADuSwAAAQPAAEhnwABIeAAAAAEBAcAASHQAAACA1GChTgAAWwE+AAAABL3UAAS+GQAEvlgABL63AAS++wAEvz0AAAAFAoypLcAASJ7AAEikwABQ8gOUagAAAWCMKwABYIwyCASMqy3AAEktwABJNBiEGABgwAD23gAEjKwtwABJScAASWsYlDQAXcAA9R0BYI5jATrAAElXYI5jAASMrS3AAEl2wABJehiAsABgwAD2XQAEjK4twABJmMAASaYJkl4AXcAA9R0BYJLhAASMry3AAEmzwABJtxiCFwBgklkABIywLcAASnHAAEqNCZRrAF3AAPUdAWCS4QAEjLEtwABKscAASsUJlGwAXcAA9R0BYJICAASMsi3AAErpwABK+AmUbQBdwAD1HQFgkgIAAQWMvi3AAEr9wABK/cAATbcAAAADwABLBMAATbcAAAAIAgLAAEsKAAAEgLBgwAD2XQDAAEsVAAAEghdgklkABsAASywAAACUHGCMNwErwABLQgAABIQYYMAA9t4BK8AAS2UAAACSXl3AAPUdAWCS4QErwABLjwAAAJRrXcAA9R0BYJLhASvAAEvNAAAAlGxdwAD1HQFgkgIBK8AATAMAAACUbV3AAPUdAWCSAgErYIypAT4BPR7AAE2Oi/kCAAIWwABNni6SXoyuLgAICAGMrYAAwATAZwgBjK+BAMAEwHYIAYyrgwDABMCSCACMrjUAAAABAF3AAPUdAWCS4QGEwABMM8AEwKIjHMAATEIUAMAEwTMIAEEBAAErAAAxwABMVGCS4QAUAMAEwTMIAAFdwAD1HQFgkuEIAIywNQAAAAEAXcAA9R0BYJLhAYXAAEyQwATAtiMcwABMrRQAwATBgAgAQQEAASsAADHAAEy/YJLhABQAwATBgAgAAV3AAPUdAWCS4QgAjLE1AAAAAQBdwAD1HQFgkgIBhsAATPPABMDKIxzAAE0IFADABMHNCABBAQABKwAAMcAATSBgkgIAFADABMHNCAABXcAA9R0BYJICCACMsjUAAAABAF3AAPUdAWCSAgGHwABNQ8AEwN4jHMAATVMUAMAEwhoIAEEBAAErAAAxwABNa2CSAgAUAMAEwhoIAAFdwAD1HQFgkgIJAMAATXeMMQEAAYLAAE19wATAhAAHBoy0LcAATbzAAE3IwABN4gEAlFoAAAABA8AATdnAAE3iAAAAAAAAAGCMRwFKwABN3AEmwABN3AEWwABN3C6SUYwbYIxHBoy1LcAATefAAE33wABOSwEAlG4AAAABA8AATgDAAE5LAAAAAAAAAGCStQE+AUrAAE4GAR/AAE4RksQCAAIuHsAATiOMAAEAARbAAE43LpJejK4AAAaMty3AAE5QwABOUMAATosAAJQOAAAAAQPAAE5WwABOiwAAAAEBAcAATmMAAACA1F2gdwFbAABbAT4BSsAATmwBHMAATnWAwABOc8AEwzmUbwEAAS4AoNEGjLgtwABOkMAATpDAAE9MAACUFAAAAAEDwABOocAAT0wAAAABAQHAAE6uAAAAgNRgoU4AAFsBPgM9HsAATreL/gMAAxbAAE7FLpQ0jKyAwABO0sAEw5EuAD0ewABO4Iv+AwADFsAATu4ukl6MroDAAE7+wATDkS4AScAATwwhHMAATxUWwABPEC6CF4yvQQEAASsAkl0+AT0XwABPJi6CFxzAAE8vgMAATy3ABMORlHABAAEWwABPPS6CF4yvAKFQjK8/Boy5LcAAT1HAAE9RwABPxAAAlA8AAAABA8AAT17AAE/EAAAAAQEBwABPZwAAAIDUXaESAVsAAFwBPgM9HsAAT3CL+gIAAhbAAE96LpQ0jKyAwABPh8AExFUAPR7AAE+Pi/oCAAIWwABPmS6SXoyugMAAT6nABMRVAD01AAAAAQBgklkBFsAAT7EugheMryMcwABPt4EAwATEqUEBAAErAAArHMAAT7eBAMAExKmUDgEAAYDAAE++wATEVQCSWwFbBoy6LcAAT8nAAE/OwABQbQAAlEAAAAABA8AAT9vAAFBtAAAAAQEBwABP5wAAAIOyYI5jAABcAT4DScAAT/MWwABQAxbAAE/3LpQ0jKyA/MAA9P8+AT0XwABQFC6UNDHAAFAuYI5jAIysPz0cwABQSBbAAFA8LpQ0jKxPAQABgMAAUEzABMUVAMAA9S49F8AAUFyAwABQV8AExRWSUS6MGwaMvC3AAFBywABQe8AAUPAAAJQai/MAAAABA8AAUJbAAFDwAAAAAQEBwABQmwAAAIMVYMAA9HkAAGCT+AE+AUrAAFCpAR7AAFCwjAEDAAMWwABQyC6UGYwnFsAAUNwuhBiMq4DAAFDlwATFtwAAAATCeAAEwr0ABMMSAATDagAExC4ABMTuAATFjgAExfsAAAAHAoy/LcAAUYPAAFGIwABXJwuUcQAAAWDAAPXFAAAIBIzBLcAAUYjAAFGICScAYMAA9HkABIzDLcAAUYjAAFGICSiL8wBgwAD2XQAEjMQtwABRiMAAUYgGKQBdwAD1HQFgjL8BOgBgjL8FGgCMxRoAjMYaAIzHGgCMyBoAjMkEjMUtwABSJ8AAUicGlHIAYIy/ASAAjM0CAAKTJ5RzAASMxi3AAFNtwABTbQaUdABgjL8BIACMzQIAApQnlHUABIzHLcAAVIHAAFSBBpR2AGCMvwEgAIzNAgAClSeUdwAEjMgtwABWGcAAVhkGlHgAYIy/ASAAjM0CAAKWJ5R5AASMyS3AAFchwABXIQaUegBgjL8BIACMzQIAApcnlHsAAQWMzS3AAFGIwABRiMAAVycBAAADwABRiMAAVycAAAACAgLAAFGIAAAEJ2DAAPR5AMAAUYgAAAQoYMAA9l0AAGCMvwE/AwgAjMGAAMAEx2AIAIzDgQDABMduCQAAwAD12wAAAAABBozLLcAAUYjAAFGIwABXJwAAIwAAAAEDwABRiMAAVycAAAAAAAAAYMAA9l0BSgABDwAujMMAAATHowAEx9gAAAABAozOLcAAWKPAAFiuwACIDgOUfAEawABYpKIjAAFgjCsAAWCMMhgEjNAtwABaEMAAWjMYlH0AYMAA9HkBGsAAWiuMGgSM0S3AAFsSwABbMxiUfgBgwAD0eQEawABbK4waBIzSLcAAW4nAAFugGJR/AGCMvwEawABbnIzJBIzTLcAAXF7AAFyAGJQ0ARrAAFxFoiVdwAD1HQFgjmMBOsAAXGxgjmMABIzULcAAXajAAF2sGICwARrAAF2boiNgwAD2XQAEjNUtwABd7MAAXfsGlIAAYMAA9HkBlgSM1i3AAF4hwABeNgaUgQBgwAD0eQEcwABeMpSDggEAAZUAwAD0lQSM1y3AAF5LwABeXAaUggBgwAD0eQEcwABeWJSDggEAAZYAwAD0lQSM2C3AAF5xwABejAaUgwBgwAD0eQEcwABeiJSDggEAAZcAwAD0lQSM2S3AAF6hwABevQaUhABgwAD0eQEcwABeuZSDggEAATcFAMAA9JUEjNotwABe0sAAXu8GlIUAYMAA9HkBHMAAXuuUg4IBAAE3BgDAAPSVBIzbLcAAXvjAAF8BGIQSAGDAAPR5AZMEjNwtwABpusAAacEYhBgAYMAA9t4ABIzdLcAAaeDAAGnuCZJeAF3AAPUdAWCS4QAEjN4twABqQsAAaksYlIYAYJL2AASM3y3AAGqkwABqrxiUhwBgkvYABIzgLcAAavjAAGsICZSIAF3AAPUdAWCS9gAEjOEtwABrfMAAa4IJlDoAXcAA9R0BYI0xAASM4i3AAGvJwABr1QmUiQBdwAD1HQFgjV4ABIzjLcAAbGbAAGxwCZQ5AF3AAPUdAWCNnwAEjOQtwABtFsAAbTQJlIoAXcAA9R0BYI19AASM5i3AAIHBwACByRiUi4vzARrAAIGroiVgkosBKwSM5y3AAIIqwACCMxiUjIvzARrAAIIUoiVgkosBKwSM6C3AAILRwACC3BiUjYvzARrAAIK7oiVgkosBKwEFjRItwABtOcAAbTnAAHHaAAAAA8AAbT7AAHHaAAAADQAADcAAbUwAAASAsGDAAPZdASvAAG1dAAAAg99gwADyswEqwABtewAAAJSOYMAA8rMBKsAAbZ8AAASUhmCS9gErwABttQAABJSHYJL2ASvAAG3cAAAAkl5dwAD1HQFgkuEBK8AAbgIAAACUiF3AAPUdAWCS9gErwABuLAAAAJSJXcAA9R0BYI1eASvAAG5QAAAAlDldwAD1HQFgjZ8BK8AAbm4AAACUOl3AAPUdAWCNMQErwABuoAAAAJSKXcAA9R0BYI19ASvAAG7LAAAEhBhgwAD23gErwABu5AAAAJQcYIw3AStgjM4BPgc9HsAAcLOL+QIAAhbAAHDDLpJejN0uAD0ewABw3ov5AgACFsAAcO4ulImM4i4APR7AAHEHi/kCAAIWwABxFy6UOYzjLgA9HsAAcS6L+QIAAhbAAHE+LpQ6jOEuAD0ewABxUYv5AgACFsAAcWEulIqM5C4APRfAAHGRLoPfgcAAcZ7ABMsCjQA9F8AAcbMulI6CwABxxsAEyxKNAgsIAYzUgADABMryCAGM3oMAwATLIggBjN+EAMAEyzAIAYzcFADABMu2CwAIAIzdNQAAAAEAXcAA9R0BYJLhAYXAAG8OwATLPiMcwABvHRQAwATMpQ0AQQEAASsAADHAAG8vYJLhABQAwATMpQ0AAV3AAPUdAWCS4QgAjOA1AAAAAQBdwAD1HQFgkvYBhsAAb1PABMtSIxzAAG9kFADABMzyDQBBAQABKwAAMcAAb3JgkvYAFADABMzyDQABXcAA9R0BYJL2CACM4TUAAAABAF3AAPUdAWCNMQEUwABvjMAEy44JACMcwABvkxQAwATNPw0AQQEAASsAADHAAG+dYI0xABQAwATNPw0AAV3AAPUdAWCNMQgAjOI1AAAAAQBdwAD1HQFgjV4Bh8AAb73ABMtmIxzAAG/KFADABM2ODQBBAQABKwAAMcAAb9pgjV4AFADABM2ODQABXcAA9R0BYI1eCACM4zUAAAABAF3AAPUdAWCNnwEUwABv+MAEy3oIACMcwABwAxQAwATN2w0AQQEAASsAADHAAHARYI2fABQAwATN2w0AAV3AAPUdAWCNnwgAjOQ1AAAAAQBdwAD1HQFgjX0BFMAAcE/ABMuiCgAjHMAAcG4UAMAEzioNAEEBAAErAAAxwABwkGCNfQAUAMAEzioNAAFdwAD1HQFgjX0JAMAAcJyMMQEAARTAAHCiwATLxgwAACQGjOotwABfBsAAXw/AAF82AQCD3wAAAAEDwABfGsAAXzYAAAAAAAAAYMAA8rMBSsAAXx0BIRzAAF8yHMAAXyMWwABfHS6EEozbgywBAAEawABfJYzWAMAA9JFBAQABkwDAAPWcBo0ALcAAXzvAAF9EwABfpQIAg98AAAABA8AAX07AAF+lAAAAAQEBwABfVAAAAICKYMAA8rMAAFwBPgE9F8AAX2EuhBIjgMAAX2nABM8XHMAAX3gWwABfci6EEozbgN8BAAEawABfeozWAMAA9JIcwABfkRbAAF+LLoQSjNuDLAEAARzAAF+TGsAAX5SM1pKVAAAAAMAA9JQAwAD0kQFgwAD0eYzbBozrLcAAX8/AAF/YwABf9wEAlI8AAAABA8AAX9/AAF/3AAAAAAAAAGDAAPKzAUrAAF/iASEcwABf8xzAAF/oFsAAX+IuhBKM24MsAQABGsAAX+qM1wDAAPSRQQEAAZMAwAD1nAaNAS3AAF/8wABgBcAAYFoCAJSPAAAAAQPAAGALwABgWgAAAAEBAcAAYBEAAACAimDAAPKzAABcAT4BPRfAAGAeLoQSI4DAAGAmwATQIBzAAGA1FsAAYC8uhBKM24DfAQABGsAAYDeM1wDAAPSSHMAAYEoWwABgRC6EEozbgywBAAEcwABgTBrAAGBNjNeSlQAAAADAAPSUAMAA9JEBYMAA9HmM2waM7C3AAGJTwABiXMAAYo8BAJSOAAAAAQPAAGJtwABijwAAAAAAAABgwADyswFKwABicAEhHMAAYoscwABidhbAAGJwLoQSjNuDLAEAARrAAGJ4jNgAwAD0kUEBAAGTAMAA9ZwGjQItwABilMAAYp3AAGMYAgCUjgAAAAEDwABircAAYxgAAAABAQHAAGKzAAAAgIpgwADyswAAXAE+AT0XwABiwC6EEiOAwABi0MAE0SkcwABi3xbAAGLZLoQSjNuA3wEAARrAAGLhjNgAwAD0khzAAGL+FsAAYvguhBKM24MsAQABHMAAYwAawABjAYzYkpUAAAAAwAD0lADAAPSRAWDAAPR5jNsGjO0twABjv8AAY8jAAGP9AQCUkAAAAAEDwABj2sAAY/0AAAAAAAAAYMAA8rMBSsAAY90BIRzAAGP5HMAAY+MWwABj3S6EEozbgywBAAEawABj5YzZAMAA9JFBAQABkwDAAPWcBo0DLcAAZALAAGQLwABkiQIAlJAAAAABA8AAZBzAAGSJAAAAAQEBwABkIgAAAICKYMAA8rMAAFwBPgE9F8AAZC8uhBIjgMAAZD/ABNIyHMAAZE4WwABkSC6EEozbgN8BAAEawABkUIzZAMAA9JIcwABkbhbAAGRoLoQSjNuDLAEAARzAAGRwGsAAZHGM2ZKVAAAAAMAA9JQAwAD0kQFgwAD0eYzbBozuLcAAZTbAAGU/wABldgEAlJEAAAABA8AAZVLAAGV2AAAAAAAAAGDAAPKzAUrAAGVVASEcwABlchzAAGVbFsAAZVUuhBKM24MsAQABGsAAZV2M2gDAAPSRQQEAAZMAwAD1nAaNBC3AAGV7wABlhMAAZg0CAJSRAAAAAQPAAGWWwABmDQAAAAEBAcAAZZwAAACAimDAAPKzAABcAT4BPRfAAGWpLoQSI4DAAGWxwATTOxzAAGXIFsAAZcIuhBKM24DfAQABGsAAZcqM2gDAAPSSHMAAZfEWwABl6y6EEozbgywBAAEcwABl8xrAAGX0jNqSlQAAAADAAPSUAMAA9JEBYMAA9HmM2waNBi3AAGYSwABmIsAAaXQAAJSSAAAAAQPAAGY3wABpdAAAAAAAAABdwAD1HQFgkvYBPgVOwABmRMAAZlAAAJSTXcAA9R0BYJL2ATHAAGZdYJL2AEnAAGaGIRbAAGaLLpSRjO5KwABmnwGAwABmpsAE0+4/TsAAZ3vAAGeDAABXYJL2ARbAAGeFLpSGjN5DwABnlCIhHMAAZ6OBwABnm8AE1C5BAQABKwCTAQAWwABnwBbAAGe2gcAAZ67ABNQulJSS+5SOjOw+BU7AAGfgwABn7QAAlJVgjM4BFsAAZ/eBwABn78AE1C6UlJL7QBzAAGg0FsAAaC0WwABoHILAAGgPwATUg5SIjOBawAD1TEEBAAGVAMAA9ZzAAGgPwABoOABOwABoTsAAaFsAAJSWYJ3SAR7AAGhqndkBAAGBwABoeMAE1C4APRzAAGiUgMAAaIjABNPuTwEAARzAAGiwg8AAaKPABNTblJcBAAEcwABo4RbAAGjRgsAAaMTABNSDlIiM4EQBAAGUAMAA9SwAneIAwAD1Lj2JwABo7sAE1C4cwABpD4PAAGkCwATU25SXAQABHMAAaUAWwABpMILAAGkjwATUg5SIjOBEAQABkwDAAPUsAJ3iSsAAaVABNcAAaVcAAAEAXcAA9R0BYJL2AYDAAGlXwATT7jUAAAABAFsBHMAAaWSCwABpYsAE1ZZPAQABgcAAaWjABNQuAMAA9S6CAMAE1ZYGjQctwABx38AAceTAAHT9AACUSAAAAAEDwABx+cAAdP0AAAAAAAAAXAE+BUAhHMAAchcWwAByCS6UHYwvQQEAASsAwAD10sAAcgnAAHIeAEXAAHIlAcAAci7AAHIwAABbYMAA9HkBkwEcwAByN4DAAHI1wATWNVwBAAEWwAByQBbAAHI5LpQ6jOFawAD1TADAAPWmAYjAAHJKwATWNRzAAHJIgMAAckrABNY1XQEAAZQAwAD1nj4CTsAAclvAAHJiAACSW2CNMQEcwAByahbAAHJkLpQ6jOFEAQABgMAAcmvABNY1AMAA9Sw9HMAAcp4cwABygxbAAHJ1LpQdjC+USwEAAYHAAHKWwATWmACh0pRKAQABFsAAcqyBwABypcAE1piUHIwtAKHWRcAAcsIBwAByy8AAcs0AAFtgwAD0eQGTARzAAHLUgMAActLABNcPXAEAARbAAHLhFsAActYulDmM41rAAPVMAMAA9aYBiMAAcuvABNcPHMAAcumAwABy68AE1w9dAQABlADAAPWePgJOwABzAMAAcwcAAJJbYI2fARzAAHMTFsAAcwkulDmM40QBAAGAwABzFMAE1w8AwAD1LD0cwABzRxzAAHMsFsAAcx4ulB2ML5RLAQABgcAAcz/ABNdyAKHSlEoBAAEWwABzVYHAAHNOwATXcpQcjC0AodZFwABzawHAAHN0wABzdgAAW2DAAPR5AZMBHMAAc32AwABze8AE1+lcAQABFsAAc4wWwABzfy6UiYziWsAA9UwAwAD1pgGIwABzlsAE1+kcwABzlIDAAHOWwATX6V0BAAGUAMAA9Z4+Ak7AAHOtwABztAAAkltgjV4BHMAAc8IWwABzti6UiYziRAEAAYDAAHPDwATX6QDAAPUsPRzAAHP2HMAAc9sWwABzzS6UHYwvlEsBAAGBwABz7sAE2EwAodKUSgEAARbAAHQEgcAAc/3ABNhMlByMLQCh1kXAAHQaAcAAdCPAAHQlAABbYMAA9HkBkwEcwAB0LIDAAHQqwATYw1wBAAEWwAB0TRbAAHQuLpSKjORawAD1TADAAPWmAYjAAHRXwATYwxzAAHRVgMAAdFfABNjDXQEAAZQAwAD1nj4CTsAAdIDAAHSHAACSW2CNfQEcwAB0pxbAAHSJLpSKjOREAQABgMAAdKjABNjDAMAA9Sw9HMAAdNscwAB0wBbAAHSyLpQdjC+USwEAAYHAAHTTwATZJgCh0pRKAQABFsAAdOmBwAB04sAE2SaUHIwtAKHWBozvLcAAdUjAAHVSwAB1dAEAlJgAAAABA8AAdV3AAHV0AAAAAAAAAGCMzgFKwAB1YAE1AAAAAQBgkvYBFsAAdWAulIaM3iMcwAB1a4AAwATZykEBAAErAAArFsAAdWuAAMAE2cqUlJL7AWCMzgaM8C3AAHZKwAB2VMAAdnoBAJSZAAAAAQPAAHZhwAB2egAAAAAAAABgjM4BSsAAdmQBNQAAAAEAYJL2ARbAAHZkLpSHjN8jHMAAdnGAAMAE2jdBAQABKwAAKxbAAHZxgADABNo3lJSS+wFgjM4GjPEtwAB2xcAAds/AAHbzAQCUmgAAAAEDwAB21cAAdvMAAAAAAAAAYIzOAUrAAHbYATUAAAABAGCMzgE1AAAAAQBgjM4BFsAAdtgulJmM8CMcwAB25oAAwATarkEBAAErAAArFsAAduaAAMAE2q6UmozxAWCMziMcwAB27IAAwATapEEBAAErAAAugADABNqkAWCMzgaM8i3AAHb4wAB3AcAAdyoBAJSbAAAAAQPAAHcUwAB3KgAAAAAAAABgwADyswFKwAB3FwEhHMAAdyMWwAB3Fy6Uh4zfQQEAASsAkwEGjPMtwAB3L8AAdzrAAHe3AQCUnAAAAAEDwAB3SMAAd7cAAAAAAAAAYMAA9l0BPgNJwAB3ThbAAHdSLpSOjOxKwAB3ZAEWwAB3ay6UnYz0P0AhHMAAd5QWwAB3jy6AsIzUgtABAAEngywAwAD2esAAd47AAHehAErAAHeoARbAAHevLoCwjNQGjPQtwAB3vMAAd8fAAHgvAQCUnQAAAAEDwAB33sAAeC8AAAAAAAAAYMAA9l0BPgJAFsAAd+sulI6M7MAAd+vAAHf7AErAAHgCAR7AAHgJjAwBAAEWwAB4Ji6AsIzUAAaM9S3AAHg0wAB4P8AAeLcBAJSeAAAAAQPAAHhewAB4twAAAAAAAABgwAD2XQE+AkAWwAB4ay6UjozswAB4a8AAeHsASsAAeIIBHsAAeImMDQEAARbAAHiuLoCwjNQABoz2LcAAeW3AAHmCwAB6GgEAlD4AAAABA8AAeYrAAHoaAAAAAAAAAF3AAPTbAWCNEwFKwAB5jQEcwAB6CjHAAHmfXcAA9NsBYI0TBBbAAHmpLpQ6jOEWwAB5uS6UiYziFsAAec8ulDmM4xbAAHnjLpSKjOSTIgEBYI0TATTAAHoRA8AAehHAAHoZAAAAAQEBwAB6EgAAAIMwXcAA9NsBYI0TAABdwAD02wFgjRMBSsAAehgBgMAAehjABN0nAMAA9OkGjPctwAB678AAewfAAHvFAQCUnwAAAAEDwAB7DsAAe8UAAAAAAAAAXcAA9NsBYJL2AUrAAHsRARzAAHu1McAAeyZdwAD02wFgkvYDIxzAAHs6FsAAezAulIaM3kEBAAErAJMBOsAAe0RgkvYAMcAAe09gkvYBFsAAe1AulIaM3gFdwAD1HQFgkvYjHMAAe3AWwAB7ZC6Uh4zfQQEAASsAkwE6wAB7emCS9gAxwAB7hWCS9gEWwAB7hi6Uh4zfAV3AAPUdAWCS9hbAAHucLpSIjOCTIgEBYJL2ATTAAHu8A8AAe7zAAHvEAAAAAQEBwAB7vQAAAIMwXcAA9NsBYJL2AABdwAD02wFgkvYBSsAAe8MBgMAAe8PABN5HAMAA9OkGjPgtwAB788AAe//AAHwZAQCUWgAAAAEDwAB8EMAAfBkAAAAAAAAAYIxHAUrAAHwTASbAAHwTARbAAHwTLpJRjBtgjEcGjQgtwAB8pcAAfKrAAH5IAACUPwAAAAEDwAB8s8AAfkgAAAABAQHAAHy7AAAAkltgjRMAAFwBPgI9F8AAfNCAwAB8ycAE3uWSUS6MG0nAAHzjJcAAfO6AwAB858AE3uVgjV4+AT0cwAB9ExbAAH0GLpSJjOJPAQABFMAAfRfABN7lAAFgjV4AwAD1LknAAH0rJcAAfTaAwAB9L8AE3uVgjZ8+AT0cwAB9VxbAAH1MLpQ5jONPAQABFMAAfVvABN7lAAFgjZ8AwAD1LknAAH1vJcAAfXqAwAB9c8AE3uVgjTE+AT0cwAB9kxbAAH2MLpQ6jOFPAQABFMAAfZfABN7lAAFgjTEAwAD1LknAAH2rJcAAfbaAwAB9r8AE3uVgjX0+AT0cwAB9/xbAAH3gLpSKjORPAQABFMAAfgPABN7lAAFgjX0AwAD1Lj4BPTDAAH4fH8AAfinAAPOsAQABgMAAfjfABN7lAAaNCS3AAH5NwAB+UsAAfvEAAJRAAAAAAQPAAH5fwAB+8QAAAAEBAcAAfmsAAACDsmCOYwAAXAE+A0nAAH53FsAAfocWwAB+ey6UNIzTgPzAAPT/PgE9F8AAfpgulDQxwAB+smCOYwCM0z89HMAAfswWwAB+wC6UNIzTTwEAAYDAAH7QwATgTADAAPUuPRfAAH7ggMAAftvABOBMklEujBsGjQotwAB+9sAAfvbAAH8hAACUDgAAAAEDwAB+/MAAfyEAAAABAQHAAH8JAAAAgNRdoHcBWwAAWwFKwAB/DwEcwAB/EYDAAH8PwATg7JSgAQABLgCgxQaNCy3AAH8lwAB/JcAAf14AAJShAAAAAQPAAH80wAB/XgAAAAEBAcAAfz0AAACA1F2hEgFbAABbAUrAAH9DARzAAH9FgMAAf0PABOFClKIBAAEuAKEuBoz5LcAAgGnAAIBywACApAEAlKMAAAABA8AAgIbAAICkAAAAAAAAAGDAAPKzAUrAAICJARbAAICaFsAAgIkulFqM+IPkjFwGjPotwACAqcAAgLfAAIE5AQCUpAAAAAEDwACAxsAAgTkAAAAAAAAAYJL2AT4BSsAAgMwBH8AAgNeTAwIAAi4ewACA88AA9SICAWCSWQIWwACBGBbAAIEJLpJejN1awAD1TCDAAIEmknYAAAAAAAAGjPstwACBPsAAgUzAAIGlAQCUpQAAAAEDwACBXMAAgaUAAAAAAAAAYJL2AT4BSsAAgWIBH8AAgW2TAwIAAi4ewACBfYwAAQABFsAAgZEukl6M3QAABoz8LcAAgc3AAIHfwACCDgEAlKYAAAABA8AAgefAAIIOAAAAAAAAAGCSiwFKwACB6gE1AAAAAQBgkosBFsAAgeoulIuL84zmIxzAAIHzgADABOKvQQEAASsAkpgXwACB6i6Ui4vzH8AAgfuSmgEAAS4AjOaAAMAE4q8BYJKLBoz9LcAAgjfAAIJJwACCtQEAlG4AAAABA8AAglLAAIK1AAAAAAAAAGCSiwE+AUrAAIJYATUAAAABAGCSiwEWwACCXy6UjIvzjOcjHMAAgmmAAMAE4y9BAQABKwCSmBfAAIJfLpSMi/MfwACCeZKaAgACLh7AAIKNjAABAAEWwACCoS6SXozdAACM54AAwATjLwFgkosGjP4twACC4MAAgvLAAIODAQCUpwAAAAEDwACC/cAAg4MAAAAAAAAAYJKLAT4BSsAAgwMBNQAAAAEAYJKLARbAAIMKLpSNi/OM6CMcwACDFoAAwATjxEEBAAErAJKYF8AAgwoulI2L8x/AAIMekpoCAAIuHsAAgz7AAPUiAgFgklkCFsAAg2MWwACDVC6SXozdWsAA9UwgwACDcZKKAAAAAAAAjOiAAMAE48QBYJKLBo0MLcAAhATAAIQLwACENgAAIwAAAAEDwACEE8AAhDYAAAAAAAAAYMAA9l0BSsAAhBkBHsAAhBmWnwEAAS4ABo0NLcAAhDvAAIQ7wACFfQAAlA8AAAABA8AAhEjAAIV9AAAAAQEBwACEUQAAAIDUXaESAVsAAFwBPgk9HsAAhFqL+gIAAhbAAIRkLpQ0jNOAwACEccAE5KQAPR7AAIR5i/oCAAIWwACEgy6SXozdgMAAhJPABOSkAD01AAAAAQBgkvYBFsAAhJsulIaM3iMcwACEpoEAwATk+EEBAAErAAArHMAAhKaBAMAE5PiUDgEAAYDAAIStwATkpACS/wFbPTUAAAABAGCS9gEWwACEtS6Uh4zfIxzAAITCgQDABOU/QQEAASsAACscwACEwoEAwATlP5QOAQABgMAAhMnABOSkAJL/AVs9HsAAhNGL+gIAAhbAAITbLpSIjOCAwACE7cAE5KQAPR7AAIT1i/oCAAIWwACE/y6UiYzigMAAhQ3ABOSkAD0ewACFFYv6AgACFsAAhR8ulDmM44DAAIUrwATkpAA9HsAAhTOL+gIAAhbAAIU9LpQ6jOGAwACFRcAE5KQAPR7AAIVNi/oCAAIWwACFVy6UiozkgMAAhXfABOSkAAaNDi3AAIWCwACFgsAAh4kAAJQUAAAAAQPAAIWTwACHiQAAAAEBAcAAhaAAAACA1GChTgAAWwE+CT0ewACFqYv+AwADFsAAhbculDSM04DAAIXEwATmRi4APR7AAIXSi/4DAAMWwACF4C6SXozdgMAAhfDABOZGLgBJwACF/iEcwACGDBbAAIYCLpSGjN5BAQABKwCTAT4BPRfAAIYdLpSGHMAAhiuAwACGKcAE5kaUqAEAARbAAIY6LpSGjN4AoVKM3j9JwACGUCEcwACGYBbAAIZULpSHjN9BAQABKwCTAT4BPRfAAIZxLpSHHMAAhoGAwACGf8AE5kaUqAEAARbAAIaQLpSHjN8AoVKM3z89HsAAhqiL/QIAAhbAAIa/LpSIjOCAwACG0cAE5kYAPR7AAIbZi/4DAAMWwACG5y6UiYzigMAAhvXABOZGLgA9HsAAhwOL/gMAAxbAAIcRLpQ5jOOAwACHHcAE5kYuAD0ewACHK4v+AwADFsAAhzkulDqM4YDAAIdBwATmRi4APR7AAIdPi/4DAAMWwACHXS6UiozkgMAAh33ABOZGLgAGjRAtwACHjsAAh5fAAIgMAACUGovzAAAAAQPAAIeywACIDAAAAAEBAcAAh7cAAACDFWDAAPR5AABgk/gBPgFKwACHxQEewACHzIwBAwADFsAAh+QulBmMJxbAAIf4LoQYjNyAwACIAcAE5/YAAAAEzowABM7wAATPlQAEz/kABNCeAATRAgAE0acABNILAATSsAAE0xQABNO5AATV3wAE2ZcABNoEAATacQAE2wYABNtSAATb2QAE3DgABNyXAATdWQAE3nkABN6+AATgJQAE4MUABOEbAAThcQAE4bgABOInAATifAAE4voABOOPAATkPgAE5H0ABOYfAATnzQAE6DoAAAAkAo0TLcAAiNDAAIjkwACWFgeSOwEawACI0aIjAAFgjCsAAWCMMgUEjRUtwACJ/sAAih8YlH4AYMAA9HkBGsAAiheMGgSNFi3AAIrewACLABiUNAEawACKxaIlXcAA9R0BYI5jATrAAIrsYI5jAASNFy3AAIsKwACLDhiAsABgkjIABI0YLcAAi1XAAItcGIQYAGDAAPbeAASNGS3AAI4jwACONxiUqQBgwAD0eQGTAQWNMC3AAI48wACOPMAAjoMAAAADwACOQsAAjoMAAAADAwPAAI5IAAAEgLBgkjIAwACOUwAABIQYYMAA9t4AwACOZgAAAJQcYIw3AABgjRMBPwMIAY0XgADABOmkCAGNGIEAwATpsQkAwACOc4wxAQABgsAAjnnABOnAABIGjRstwACOiMAAjpLAAI7DAQCSaQAAAAEDwACOocAAjsMAAAAAAAAAYIzOAUrAAI6kASbAAI6kASMlwACOqxbAAI6kLpJRjBtgjM4WwACOti6SUYwbKwFgjBVgjM4GjRwtwACOx8AAjtPAAI8PAQCUWgAAAAEDwACO5MAAjw8AAAAAAAAAYIxHAUrAAI7nASbAAI7nASMlwACO7hbAAI7nLpJRjBtgjM4WwACPABbAAI75LpJRjBuSUYwbFsAAjwkuklGMGwFgjBVgjEcGjSktwACPFMAAjxTAAI8rAAKUDgAAAAEDwACPGsAAjysAAAABAQHAAI8pAAAAgNRdoGMBWwAAWwAGjSotwACPL8AAjy/AAI9YAAKUoQAAAAEDwACPPsAAj1gAAAABAQHAAI9WAAAAgNRdoQkBWwAAWwAGjR0twACQDsAAkBfAAJBJAQCUowAAAAEDwACQK8AAkEkAAAAAAAAAYMAA8rMBSsAAkC4BFsAAkD8WwACQLi6UWo0cg+SMXAaNHi3AAJCDwACQjMAAkJ8BAIPfAAAAAQPAAJCXwACQnwAAAAAAAABgwADyswFKwACQmgEqBo0fLcAAkN/AAJDowACQ7wECg+IAAAABA8AAkO/AAJDvAAAAAAAAAGDAAPKzAAaNIC3AAJGnwACRsMAAkbkBApSqAAAAAQPAAJG5wACRuQAAAAAAAABgwADyswAGjSEtwACR8cAAkfrAAJIDAQKUqwAAAAEDwACSA8AAkgMAAAAAAAAAYMAA8rMABo0iLcAAkj/AAJJIwACSWAEClKwAAAABA8AAkljAAJJYAAAAAAAAAGDAAPKzAAaNIy3AAJNxwACTesAAk4QBAoPkAAAAAQPAAJOEwACThAAAAAAAAABgwADyswAGjS4twACTiMAAk5HAAJOnAgKD5AAAAAEDwACTm8AAk6cAAAABAQHAAJOhAAAAgIpgwADyswAAXAAGjSQtwACT+sAAlAvAAJQbAQCSTwAAAAEDwACUFMAAlBsAAAAAAAAAYI44AUrAAJQXASsGjSstwACUncAAlKTAAJTQAAAjAAAAAQPAAJSswACU0AAAAAAAAABgwAD2XQFKwACUsgEewACUspahAQABLgAGjSwtwACU1cAAlNrAAJV5AACUQAAAAAEDwACU58AAlXkAAAABAQHAAJTzAAAAg7JgjmMAAFwBPgNJwACU/xbAAJUPFsAAlQMulDSNFoD8wAD0/z4BPRfAAJUgLpQ0McAAlTpgjmMAjRY/PRzAAJVUFsAAlUgulDSNFk8BAAGAwACVWMAE7XAAwAD1Lj0XwACVaIDAAJVjwATtcJJRLowbBo0lLcAAlX7AAJWLwACVlQEClK0AAAABA8AAlZXAAJWVAAAAAAAAAGCSWQAGjSYtwACVmcAAlabAAJWwAQKUrgAAAAEDwACVsMAAlbAAAAAAAAAAYJJZAAaNJy3AAJW1wACVvsAAlhQBAJSvAAAAAQPAAJXRwACWFAAAAAAAAABgwADyswE+AUrAAJXXASEcwACWDBzAAJXvFsAAld4ulKmNGYMsAQABGsAAlgGh4wDAAPSRQQEAAZMAwAD1nAAABOn+AATqWwAE6soABOsDAATrPAAE64MABOu4AATr5gAE7BQABOxCAATscAAE7J4ABOzXAATtCgAE7UkABO3pAATuFQAE7kEABO6nAAAAEgKNMS3AAJauwACWtMAAqMgDlLAAAAFgjRMAAAoEjTMtwACW1sAAltoYghcAYJJZAASNNC3AAJcIwACXERiEEgBgwAD0eQGTBI01LcAAlyDAAJcrGJJFAGCOYwAEjTYtwACaN8AAmkkGlLEAYMAA9HkBHMAAmkWUg4IBAAGTAMAA9JUEjTctwACahsAAmpgGlLIAYMAA9HkBHMAAmpSUg4IBAAGUAMAA9JUEjTgtwACarcAAmsAGlLMAYMAA9HkBHMAAmryUg4IBAAGVAMAA9JUEjTktwACa1cAAmvMGlLQAYMAA9HkBHMAAmu+Ug4IBAAGWAMAA9JUEjTotwACbCMAAmyYGlLUAYMAA9HkBHMAAmyKUg4IBAAGXAMAA9JUEjTstwACbO8AAm1EGlLYAYMAA9HkBHMAAm02Ug4IBAAE3BQDAAPSVBI08LcAAm2bAAJuHBpS3AGDAAPR5ARzAAJuDlIOCAQABNwYAwAD0lQEFjV0twACXQMAAl0DAAJohAAAAA8AAl0XAAJohAAAADAEBwACXSwAAAICwYJIyAAvAAJddAAAEghdgklkBIMAAl2mSdgAAAADAAJeDAAAEkkVgjmMBK8AAl5sAAACD5WDAAPKzASrAAJe6AAAAg+BgwADyswEqwACX1QAAAIPiYMAA8rMBKsAAl/AAAACD3mDAAPKzASrAAJgMAAAAlLhgwADyswErwACYKgAAAJS5YMAA8rMBK8AAmEcAAACUqWDAAPR5AZPAAJhmAAAAhBhgwAD23gErwACYfwAAAJQcYIw3AStgjTEBPglAIRzAAJjFFsAAmMAugheNM0EBAAErAJJdwACYwMAAmMwAPTUAAAABAGCOYwEWwACY0y6SRY01IxzAAJjgFADABPF1DABBAQABKwAAKxfAAJjgFADABPF1DACSUS6MGwFgjTE9F8AAmPgug+WDwACZBsAE8L2NTT0XwACZHC6D4ITAAJkmwATwzY1OPRfAAJk4LoPihcAAmULABPDdjU89F8AAmVQug96GwACZX8AE8O2NUD0XwACZci6UuDUAAAABAGDAAPKzAYfAAJmGwATw/SMcwACZmBQAwATyDgwAQQEAASsAACGGwACZnMAE8O0UAMAE8g4MAAFgwADys41RPRfAAJmvLpS5NQAAAAEAYMAA8rMBFMAAmcPABPENCAAjHMAAmdUUAMAE8lsMAEEBAAErAAAiIYbAAJnawATw7QAhhMAAmefABPDNFADABPJbDAABYMAA8rONUj0XwACZ+i6UqRTAAJoNwATxHQkAjRkDCAGNM4EAwATwlwgBjTWCAMAE8K8JAMAAmJONMAMAA4DAAJiZwATwiRTAAJifwATxLQoAFMAAmKjABPE9CwAAGwaNPi3AAJvOwACb18AAnAABAIPlAAAAAQPAAJvjwACcAAAAAAAAAABgwADyswFKwACb5gEhHMAAm/wcwACb7BbAAJvmLoQSjTSDLAEAARrAAJvujTsAwAD0kUEBAAGTAMAA9ZwGjT8twACcBcAAnA7AAJwvAQCD4AAAAAEDwACcFsAAnC8AAAAAAAAAYMAA8rMBSsAAnBkBIRzAAJwrHMAAnB8WwACcGS6EEo00gywBAAEawACcIY02AMAA9JFBAQABkwDAAPWcBo1ALcAAnDPAAJw8wACcXQEAg+IAAAABA8AAnETAAJxdAAAAAAAAAGDAAPKzAUrAAJxHASEcwACcWRzAAJxNFsAAnEcuhBKNNIMsAQABGsAAnE+NNwDAAPSRQQEAAZMAwAD1nAaNQS3AAJxhwACcasAAnI0BAIPeAAAAAQPAAJxzwACcjQAAAAAAAABgwADyswFKwACcdgEhHMAAnIkcwACcfBbAAJx2LoQSjTSDLAEAARrAAJx+jTgAwAD0kUEBAAGTAMAA9ZwGjUItwACdkMAAnZnAAJ3QAQCUuAAAAAEDwACdq8AAndAAAAAAAAAAYMAA8rMBSsAAna4BIRzAAJ3MHMAAnbQWwACdri6EEo00gywBAAEawACdto05AMAA9JFBAQABkwDAAPWcBo1DLcAAn47AAJ+XwACfzgEAlLkAAAABA8AAn6nAAJ/OAAAAAAAAAGDAAPKzAUrAAJ+sASEcwACfyhzAAJ+yFsAAn6wuhBKNNIMsAQABGsAAn7SNOgDAAPSRQQEAAZMAwAD1nAaNRC3AAKDTwACg3MAAoRsBAJS6AAAAAQPAAKDzwAChGwAAAAAAAABgwADyswFKwACg9gEhHMAAoRccwACg/BbAAKD2LoQSjTSDLAEAARrAAKD+jTwAwAD0kUEBAAGTAMAA9ZwGjU0twAChIMAAoSnAAKGNAgCD5QAAAAEDwAChNMAAoY0AAAABAQHAAKE6AAAAgIpgwADyswAAXAE+AT0XwAChRy6EEiOAwAChT8AE9eYcwAChXhbAAKFYLoQSjTSA3wEAARrAAKFgjTsAwAD0khzAAKF4FsAAoXIuhBKNNIMsAQABHMAAoXoawAChe407kpUAAAAAwAD0lADAAPSRAWDAAPR5jTQGjU4twAChksAAoZvAAKHzAgCD4AAAAAEDwAChosAAofMAAAABAQHAAKGoAAAAgIpgwADyswAAXAE+AT0XwAChtS6EEiOAwAChvcAE9oscwAChzBbAAKHGLoQSjTSA3wEAARrAAKHOjTYAwAD0khzAAKHiFsAAodwuhBKNNIMsAQABHMAAoeQawACh5Y02kpUAAAAAwAD0lADAAPSRAWDAAPR5jTQGjU8twACh+MAAogHAAKJZAgCD4gAAAAEDwACiCMAAolkAAAABAQHAAKIOAAAAgIpgwADyswAAXAE+AT0XwACiGy6EEiOAwACiI8AE9zAcwACiMhbAAKIsLoQSjTSA3wEAARrAAKI0jTcAwAD0khzAAKJIFsAAokIuhBKNNIMsAQABHMAAokoawACiS403kpUAAAAAwAD0lADAAPSRAWDAAPR5jTQGjVAtwACiXsAAomfAAKLCAgCD3gAAAAEDwACib8AAosIAAAABAQHAAKJ1AAAAgIpgwADyswAAXAE+AT0XwACigi6EEiOAwACiisAE99UcwACimRbAAKKTLoQSjTSA3wEAARrAAKKbjTgAwAD0khzAAKKwFsAAoqouhBKNNIMsAQABHMAAorIawACis404kpUAAAAAwAD0lADAAPSRAWDAAPR5jTQGjVEtwACix8AAotDAAKNaAgCUuAAAAAEDwACi4cAAo1oAAAABAQHAAKLnAAAAgIpgwADyswAAXAE+AT0XwACi9C6EEiOAwACi/MAE+HocwACjExbAAKMNLoQSjTSA3wEAARrAAKMVjTkAwAD0khzAAKM9FsAAozcuhBKNNIMsAQABHMAAoz8awACjQI05kpUAAAAAwAD0lADAAPSRAWDAAPR5jTQGjVItwACjX8AAo2jAAKPyAgCUuQAAAAEDwACjecAAo/IAAAABAQHAAKN/AAAAgIpgwADyswAAXAE+AT0XwACjjC6EEiOAwACjlMAE+R8cwACjqxbAAKOlLoQSjTSA3wEAARrAAKOtjToAwAD0khzAAKPVFsAAo88uhBKNNIMsAQABHMAAo9cawACj2I06kpUAAAAAwAD0lADAAPSRAWDAAPR5jTQGjVMtwACj98AApADAAKSVAgCUugAAAAEDwACkFsAApJUAAAABAQHAAKQcAAAAgIpgwADyswAAXAE+AT0XwACkKS6EEiOAwACkMcAE+cQcwACkSBbAAKRCLoQSjTSA3wEAARrAAKRKjTwAwAD0khzAAKR1FsAApG8uhBKNNIMsAQABHMAApHcawACkeI08kpUAAAAAwAD0lADAAPSRAWDAAPR5jTQGjUUtwACkzsAApNfAAKUIAQCUuwAAAAEDwACk4cAApQgAAAAAAAAAYMAA8rMBSsAApOQBHMAApQQcwACk6hbAAKTkLoQSjTSDLAEAARzAAKT3GsAApO2NNoDfAQABGsAApPmNNwDAAPSSAMAA9JFBAQABkwDAAPWcBo1GLcAApQzAAKUVwAClMgEAlKwAAAABA8AApSbAAKUyAAAAAAAAAGDAAPKzAUrAAKUpASEWwAClKi6D3o1BBo1HLcAApTbAAKU/wAClUAEAlKoAAAABA8AApUnAAKVQAAAAAAAAAGDAAPKzAUrAAKVMASkGjUgtwAClVMAApV3AAKVzAQCUqwAAAAEDwAClZ8AApXMAAAAAAAAAYMAA8rMBSsAApWoBFsAApWoulLuNRQaNSS3AAKV4wAClgcAApZQBAIPkAAAAAQPAAKWMwACllAAAAAAAAABgwADyswFKwACljwEqBo1ULcAApZjAAKWhwACl7gIAg+QAAAABA8AApavAAKXuAAAAAQEBwAClsQAAAICKYMAA8rMAAFwBPgFJwAClvoDAAKXCwAT7yT0wwAClySeUvD8GjVYtwACl88AApfPAAKYgAACUDgAAAAEDwACl+cAApiAAAAABAQHAAKYIAAAAgNRdoGMBWwAAWwFKwACmDgEcwACmEIDAAKYOwAT8HJS9AQABLgCgaAaNVy3AAKYlwACmJcAApm0AAJShAAAAAQPAAKY0wACmbQAAAAEBAcAApkwAAACA1F2hCQFbAABbAUrAAKZSARzAAKZUgMAAplLABPxylL4BAAEuAKEMBo1YLcAApnLAAKZywACm9AAAlA8AAAABA8AApn/AAKb0AAAAAQEBwACmiAAAAIDUXaESAVsAAFwBPgQ9HsAAppGL+gIAAhbAAKabLpQ0jRaAwACmqMAE/MgAPTUAAAABAGCSWQEWwACmsC6CF40zIxzAAKa2gQDABPz9QQEAASsAACscwACmtoEAwAT8/ZQOAQABgMAApr3ABPzIAJJbAVs9NQAAAAEAYJIyARbAAKbFLoCwjRcjHMAApsuBAMAE/URBAQABKwAAKxzAAKbLgQDABP1ElA4BAAGAwACm0sAE/MgAkj8BWz01AAAAAQBgjmMBFsAAptoukkWNNSMcwACm54EAwAT9i0EBAAErAAArHMAApueBAMAE/YuUDgEAAYDAAKbuwAT8yACOZwFbBo1ZLcAApvnAAKb5wACn2wAAlBQAAAABA8AApwrAAKfbAAAAAQEBwACnFwAAAIDUYKFOAABbAT4DPRfAAKcgLoIXHMAApymAwACnJ8AE/feUcAEAARbAAKc3LoIXjTMAoVCNMz0ewACnQov+AwADFsAAp1AulDSNFoDAAKddwAT99y4AScAAp2shHMAAp3sWwACnby6SRY01QQEAASsAwAD10j4CPRfAAKeMLpJFJsAAp4wBHMAAp6YWwACnmi6SRY01lA4BAAGAwACnrcAE/fcAjmdgjmONNT01AAAAAQBgjmMBFsAAp7cukkWNNSMcwACnxIEAwAT+q0EBAAErAAArF8AAp8SBAMAE/quSUS6MGwFgjTE/Bo1KLcAAp+DAAKftwACn/wEAlK0AAAABA8AAp/jAAKf/AAAAAAAAAGCSWQFKwACn+wEWwACn+y6CF40zBo1LLcAAqAPAAKgQwACoQwEAlK4AAAABA8AAqBvAAKhDAAAAAAAAAGCSWQFKwACoHgEjFsAAqB4ulLuNRRbAAKgqLoIXjTMgwACoN5KKAAAAAAFgklkGjVstwACoSMAAqFHAAKjGAACUGovzAAAAAQPAAKhswACoxgAAAAEBAcAAqHEAAACDFWDAAPR5AABgk/gBPgFKwACofwEewACohowBAwADFsAAqJ4ulBmMJxbAAKiyLoQYjRiAwACou8AE/6IAAAAE8wMABPNnAATzywAE9C8ABPSTAAT09wAE9VsABPW/AAT2ZAAE9wkABPeuAAT4UwAE+PgABPmdAAT6QgAE+rsABPr6AAT7LwAE+20ABPuiAAT79QAE/EsABPyhAAT90AAE/ucABP8jAAT/eQAE/+YAAAAbAo1eLcAAqjbAAKo8wAC0jQOUvwAAAWCNEwAABwSNYC3AAKuQwACrsxiUfQBgwAD0eQEawACrq4waBI1hLcAAq7zAAKvFGIQSAGDAAPR5AZMEjWItwACr1sAAq94Ykk8AYI44AASNYy3AAKv0wACsABiUwABdwAD1HQFgjesABI1kLcAArlPAAK5lBpSyAGDAAPR5ARzAAK5hlIOCAQABkwDAAPSVBI1lLcAArqLAAK63BpTBAGDAAPR5ARzAAK6zlIOCAQABlADAAPSVBI1mLcAArszAAK7iBpTCAGDAAPR5ARzAAK7elIOCAQABlQDAAPSVAQWNfC3AAKwFwACsBcAArj0AAAADwACsEMAArj0AAAAJAQHAAKwWAAAEkk9gjjgACMAArCwAAACAsGCSMgErwACsPQAAAIPiYMAA8rMBKsAArFgAAACD5GDAAPKzASrAAKx2AAAAlD1gwADyswEqwACsogAAAJTAXcAA9R0BYI3rASvAAKy6AAAAlKlgwAD0eQGTwACs2QAAAIQYYMAA9t4BK8AArPIAAACUHGCMNwErYI1eAT4GPTUAAAABAGCOOAEWwACtaS6ST41iIxzAAK1zFADABQIHCQBBAQABKwAAKxfAAK1zFADABQIHCQCSUS6MGwFgjV49HsAArYaL+QIAAhbAAK2WLpTAjWMuAD0XwACttC6D4oLAAK2+wAUBjY1xPRfAAK3QLoPkg8AArd3ABQGdjXI9F8AArfIulD2EwACuAMAFAa2Ncz0XwACuFi6UqYbAAK4pwAUB0Y0ZAwgBjWKAAMAFAXEIAI1jNQAAAAEAXcAA9R0BYI3rAYXAAK0awAUBvSMcwACtJxQAwAUCvQkAQQEAASsAADHAAK03YI3rABQAwAUCvQkAAV3AAPUdAWCN6wkAwACtQ40wAwADgcAArUnABQF/h8AArU/ABQHhFMAArVjABQHxCAAAEAaNaC3AAK7nwACu8MAArxEBAIPiAAAAAQPAAK74wACvEQAAAAAAAABgwADyswFKwACu+wEhHMAArw0cwACvARbAAK77LoQSjWGDLAEAARrAAK8DjWQAwAD0kUEBAAGTAMAA9ZwGjWktwACvFcAArx7AAK9FAQCD5AAAAAEDwACvKcAAr0UAAAAAAAAAYMAA8rMBSsAArywBIRzAAK9BHMAArzIWwACvLC6EEo1hgywBAAEawACvNI1lAMAA9JFBAQABkwDAAPWcBo1qLcAAr8TAAK/NwACv9gEAlD0AAAABA8AAr9nAAK/2AAAAAAAAAGDAAPKzAUrAAK/cASEcwACv8hzAAK/iFsAAr9wuhBKNYYMsAQABGsAAr+SNZgDAAPSRQQEAAZMAwAD1nAaNcS3AAK/7wACwBMAAsFwCAIPiAAAAAQPAALALwACwXAAAAAEBAcAAsBEAAACAimDAAPKzAABcAT4BPRfAALAeLoQSI4DAALAmwAUEghzAALA1FsAAsC8uhBKNYYDfAQABGsAAsDeNZADAAPSSHMAAsEsWwACwRS6EEo1hgywBAAEcwACwTRrAALBOjWSSlQAAAADAAPSUAMAA9JEBYMAA9HmNYQaNci3AALBhwACwasAAsMsCAIPkAAAAAQPAALB0wACwywAAAAEBAcAAsHoAAACAimDAAPKzAABcAT4BPRfAALCHLoQSI4DAALCPwAUFJxzAALCeFsAAsJguhBKNYYDfAQABGsAAsKCNZQDAAPSSHMAAsLcWwACwsS6EEo1hgywBAAEcwACwuRrAALC6jWWSlQAAAADAAPSUAMAA9JEBYMAA9HmNYQaNcy3AALDQwACw2cAAsT0CAJQ9AAAAAQPAALDkwACxPQAAAAEBAcAAsOoAAACAimDAAPKzAABcAT4BPRfAALD3LoQSI4DAALD/wAUFzBzAALEOFsAAsQguhBKNYYDfAQABGsAAsRCNZgDAAPSSHMAAsSgWwACxIi6EEo1hgywBAAEcwACxKhrAALErjWaSlQAAAADAAPSUAMAA9JEBYMAA9HmNYQaNay3AALFCwACxS8AAsWQBAJSsAAAAAQPAALFcwACxZAAAAAAAAABgwADyswFKwACxXwEqBo1sLcAAsWjAALFxwACxgwEAlKoAAAABA8AAsXvAALGDAAAAAAAAAGDAAPKzAUrAALF+ASoGjW0twACxh8AAsZDAALGiAQCUqwAAAAEDwACxmsAAsaIAAAAAAAAAYMAA8rMBSsAAsZ0BKgaNdS3AALGnwACxp8AAsdoAAJQOAAAAAQPAALGtwACx2gAAAAEBAcAAsbwAAACA1F2gYwFbAABbAUrAALHCARzAALHEgMAAscLABQcQlMMBAAEuAKBmBo12LcAAsd/AALHfwACyMwAAlKEAAAABA8AAse7AALIzAAAAAQEBwACyBgAAAIDUXaEJAVsAAFsBSsAAshIBHMAAshSAwACyEsAFB2aUxAEAAS4AoQ0GjXctwACyOMAAsjjAALLCAACUDwAAAAEDwACyRcAAssIAAAABAQHAALJOAAAAgNRdoRIBWwAAXAE+BD0ewACyV4v6AgACFsAAsmEulDSNFoDAALJuwAUHvAA9NQAAAAEAYJIyARbAALJ2LoCwjRcjHMAAsnyBAMAFB/FBAQABKwAAKxzAALJ8gQDABQfxlA4BAAGAwACyg8AFB7wAkj8BWz0ewACyi4v6AgACFsAAspUulMCNY4DAALKjwAUHvAA9NQAAAAEAYI44ARbAALKrLpJPjWIjHMAAsrWBAMAFCFdBAQABKwAAKxzAALK1gQDABQhXlA4BAAGAwACyvMAFB7wAjkoBWwaNeC3AALLHwACyx8AAs6UAAJQUAAAAAQPAALLYwACzpQAAAAEBAcAAsuUAAACA1GChTgAAWwE+Az0ewACy7ov+AwADFsAAsvwulDSNFoDAALMJwAUIwy4APR7AALMXi/4DAAMWwACzJS6UwI1jgMAAszPABQjDLgBJwACzQSEcwACzThbAALNFLpJPjWJBAQABKwDAAPXSPgI9F8AAs18ukk8mwACzXwEcwACzcxbAALNqLpJPjWKUDgEAAYDAALN6wAUIwwCOSmCOOI1iPTUAAAABAGCOOAEWwACzhC6ST41iIxzAALOOgQDABQlsQQEAASsAACsXwACzjoEAwAUJbJJRLowbAWCNXj8GjW4twACzqsAAs7fAALPXAQCUrQAAAAEDwACzwsAAs9cAAAAAAAAAYJJZAUrAALPFASDAALPLkooAAAAABo1vLcAAs9vAALPowAC0CAEAlK4AAAABA8AAs/PAALQIAAAAAAAAAGCSWQFKwACz9gEgwACz/JKKAAAAAAaNei3AALQNwAC0FsAAtIsAAJQai/MAAAABA8AAtDHAALSLAAAAAQEBwAC0NgAAAIMVYMAA9HkAAGCT+AE+AUrAALREAR7AALRLjAEDAAMWwAC0Yy6UGYwnFsAAtHcuhBiNGIDAALSAwAUKSwAAAAUDLwAFA5MABQP3AAUEWwAFBQAABQWlAAUGSgAFBn8ABQa0AAUG6QAFBz8ABQeVAAUInAAFCagABQnlAAUKIgAFCo8AAAAQAo19LcAAuC3AALgzwADHVwOUxQAAAWCNEwAACQSNfy3AALhowAC4cRiEEgBgwAD0eQGTBI2ALcAAuXPAALmACZJEAF3AAPUdAWCSWQAEjYEtwAC5/8AAug4YlMYAYIw3AASNgi3AALt3wAC7hRiSXgBdwAD1HQFgkuEABI2DLcAAvCTAALw4GJRsAF3AAPUdAWCSAgAEjYQtwAC8QMAAvFYYlMcAYMAA9HkABI2FLcAAvPDAALz/GJRtAF3AAPUdAWCSAgAEjYYtwADBeMAAwYoGlLIAYMAA9HkBHMAAwYaUg4IBAAGTAMAA9JUEjYctwADBx8AAwdwGlMEAYMAA9HkBHMAAwdiUg4IBAAGUAMAA9JUBBY2eLcAAvQTAAL0EwADBYgAAAAPAAL0hwADBYgAAAAwBAcAAvScAAASUxmCMNwALwAC9RAAAAICwYJIyASvAAL1VAAAAg+JgwADyswEqwAC9cAAAAIPkYMAA8rMBKsAAvY0AAACUqWDAAPR5AZPAAL23AAAAkkRdwAD1HQFgklkBK8AAveAAAACSXl3AAPUdAWCS4QErwAC+EAAAAJRsXcAA9R0BYJICASvAAL5GAAAAlG1dwAD1HQFgkgIBK8AAvmEAAACUx2DAAPR5ASvAAL6DAAAAhBhgwAD23gErwAC+nAAAAJQcYIw3AStgjX0BPgY9HsAAwHCL+QIAAhbAAMCALpJejYIuAD0ewADAm4v5AgACFsAAwKsulGyNgy4APR7AAMDMi/kCAAIWwADA3C6UbY2FLgA9F8AAwP0ug+KCwADBB8AFDCqNkz0XwADBGS6D5IPAAMEmwAUMOo2UPRfAAME7LpSphMAAwU7ABQxKjRkHCAGNgYAAwAUMDggAjYA1AAAAAQBdwAD1HQFgklkBhcAAvsXABQxaIxzAAL7TFADABQ1vDABBAQABKwAAMcAAvuBgklkAFADABQ1vDAABXcAA9R0BYJJZCACNgjUAAAABAF3AAPUdAWCS4QGGwAC/AsAFDG4jHMAAvxEUAMAFDbwMAEEBAAErAAAxwAC/I2CS4QAUAMAFDbwMAAFdwAD1HQFgkuEIAI2DNQAAAAEAXcAA9R0BYJICAYfAAL9XwAUMgiMcwAC/bBQAwAUOCQwAQQEAASsAADHAAL+EYJICABQAwAUOCQwAAV3AAPUdAWCSAggAjYU1AAAAAQBdwAD1HQFgkgIBFMAAv6fABQyWCAAjHMAAv7cUAMAFDlYMAEEBAAErAAAxwAC/z2CSAgAUAMAFDlYMAAFdwAD1HQFgkgIIAI2ENQAAAAEAYMAA9HkBNQAAAAEAYMAA9HkBFMAAwAXABQyqCQAjHMAAwBwUAMAFDrEMAEEBAAErAAA1AAAAAQBdwAD1HQFgkgIBh8AAwB/ABQyCIxzAAMA1FADABQ7dDQBBAQABKwAAKxbAAMA1FADABQ7dDQBawAD1TAFgwAD0eRQAwAUOsQwAAWDAAPR5IxzAAMA8FADABQ6lDABBAQABKwAAkxQAwAUOpQwAAWDAAPR5CQDAAMBKjTADAAOBwADAUMAFDBwUwADAVsAFDLoKABTAAMBfwAUMygsAABEGjYktwADB4cAAwerAAMILAQCD4gAAAAEDwADB8sAAwgsAAAAAAAAAYMAA8rMBSsAAwfUBIRzAAMIHHMAAwfsWwADB9S6EEo1/gywBAAEawADB/Y2GAMAA9JFBAQABkwDAAPWcBo2KLcAAwg/AAMIYwADCPwEAg+QAAAABA8AAwiPAAMI/AAAAAAAAAGDAAPKzAUrAAMImASEcwADCOxzAAMIsFsAAwiYuhBKNf4MsAQABGsAAwi6NhwDAAPSRQQEAAZMAwAD1nAaNky3AAMJEwADCTcAAwqUCAIPiAAAAAQPAAMJUwADCpQAAAAEBAcAAwloAAACAimDAAPKzAABcAT4BPRfAAMJnLoQSI4DAAMJvwAUQcBzAAMJ+FsAAwnguhBKNf4DfAQABGsAAwoCNhgDAAPSSHMAAwpQWwADCji6EEo1/gywBAAEcwADClhrAAMKXjYaSlQAAAADAAPSUAMAA9JEBYMAA9HmNfwaNlC3AAMKqwADCs8AAwxQCAIPkAAAAAQPAAMK9wADDFAAAAAEBAcAAwsMAAACAimDAAPKzAABcAT4BPRfAAMLQLoQSI4DAAMLYwAURFRzAAMLnFsAAwuEuhBKNf4DfAQABGsAAwumNhwDAAPSSHMAAwwAWwADC+i6EEo1/gywBAAEcwADDAhrAAMMDjYeSlQAAAADAAPSUAMAA9JEBYMAA9HmNfwaNiy3AAMMZwADDIsAAwzsBAJSsAAAAAQPAAMMzwADDOwAAAAAAAABgwADyswFKwADDNgEqBo2MLcAAwz/AAMNIwADDWgEAlKoAAAABA8AAw1LAAMNaAAAAAAAAAGDAAPKzAUrAAMNVASoGjY0twADDXsAAw2fAAMN5AQCUqwAAAAEDwADDccAAw3kAAAAAAAAAYMAA8rMBSsAAw3QBKgaNji3AAMN+wADDh8AAw64BAJJJAAAAAQPAAMOUwADDrgAAAAAAAABgwADyswFKwADDlwEcwADDpxbAAMOXLpTGjYFBAQABKwDAAPXSBo2PLcAAw7PAAMO+wADD4QEAgdMAAAABA8AAw8XAAMPhAAAAAAAAAGCNEwFKwADDyAE1AAAAAQBgjDcBFsAAw8gulMaNgSMcwADD2YAAwAUSskEBAAErAAArFsAAw9mAAMAFErKUJoxAAWCNEwaNlS3AAMPmwADD78AAxKcCAIHTAAAAAQPAAMP1wADEpwAAAAEBAcAAw/0AAACSW2CNEwAAXAE+AkAiJcAAxBmAwADEEsAFExNgjV4BIiXAAMQ7gMAAxDTABRMTYI2fABzAAMRXFsAAxFIUwADES8AFExMAAWCNn4IcjaJBAQABGsAAxGiN5gDAAPXSwADEEsAAxHAAPRfAAMR3LpTGHsAAxImMAgEAAYDAAMScwAUTEwCNgQaNly3AAMSswADErMAAxPEAAJQOAAAAAQPAAMSywADE8QAAAAEBAcAAxMEAAACA1F2gYwFbAABbAUrAAMTHARzAAMTJgMAAxMfABRPHlMgBAAEuAKBpBo2YLcAAxPbAAMT2wADFXAAAlKEAAAABA8AAxQXAAMVcAAAAAQEBwADFHQAAAIDUXaEJAVsAAFsBSsAAxSkBHMAAxSuAwADFKcAFFB2UyQEAAS4AoQ8GjZktwADFYcAAxWHAAMXzAACUDwAAAAEDwADFbsAAxfMAAAABAQHAAMV3AAAAgNRdoRIBWwAAXAE+BD0ewADFgIv6AgACFsAAxYoulDSNFoDAAMWXwAUUcwA9NQAAAAEAYI0TARbAAMWfLoHTjY8jHMAAxaeBAMAFFKhBAQABKwAAKxzAAMWngQDABRSolKEBAAGAwADFt8AFFHMAjSoBWz0ewADFv4v6AgACFsAAxckukkSNgIDAAMXYwAUUcwA9NQAAAAEAYJIyARbAAMXgLoCwjRcjHMAAxeaBAMAFFQ5BAQABKwAAKxzAAMXmgQDABRUOlA4BAAGAwADF7cAFFHMAkj8BWwaNmi3AAMX4wADF+MAAxm8AAJQUAAAAAQPAAMYJwADGbwAAAAEBAcAAxhYAAACA1GChTgAAWwE+Aj0ewADGH4v+AwADFsAAxi0ulDSNFoDAAMY6wAUVei4APR7AAMZIi/wCAAIWwADGWi6SRI2AgMAAxmnABRV6AAaNkC3AAMZ0wADGgcAAxqEBAJStAAAAAQPAAMaMwADGoQAAAAAAAABgklkBSsAAxo8BIMAAxpWSigAAAAAGjZEtwADGpcAAxrLAAMbSAQCUrgAAAAEDwADGvcAAxtIAAAAAAAAAYJJZAUrAAMbAASDAAMbGkooAAAAABo2cLcAAxtfAAMbgwADHVQAAlBqL8wAAAAEDwADG+8AAx1UAAAABAQHAAMcAAAAAgxVgwAD0eQAAYJP4AT4BSsAAxw4BHsAAxxWMAQMAAxbAAMctLpQZjCcWwADHQS6EGI0YgMAAx0rABRZuAAAABQ+BAAUP5QAFEEkABRDuAAURkwAFEcgABRH9AAUSMgAFEn8ABRLsAAUToAAFE/YABRRMAAUVUwAFFcsABRYIAAUWRQAFFrIAAAARAo2fLcAAykTAAMpPwADqbgOSPQEawADKRaIjAAFgjRMAAA4EjaEtwADLnsAAy8EYlH0AYMAA9HkBGsAAy7mMGgSNoi3AAMvUwADL2BiCHABgjdwABI2jLcAAy+DAAMvpGIQSAGDAAPR5AZMEjaQtwADMM8AAzDsYkk8AYI44AASNpS3AAM+xwADP0xiUygBgjDcABI2mLcAAz+HAANAHGJTLAGCMNwAEjactwADXP8AA11IGlLMAYMAA9HkBHMAA106Ug4IBAAGTAMAA9JUEjagtwADXj8AA16QGlIEAYMAA9HkBHMAA16CUg4IBAAGUAMAA9JUEjaktwADXucAA184GlMEAYMAA9HkBHMAA18qUg4IBAAGVAMAA9JUEjaotwADX48AA1/UGlLIAYMAA9HkBHMAA1/GUg4IBAAGWAMAA9JUEjastwADYMMAA2EsGlMwAYMAA9HkBHMAA2EeUg4IBAAGXAMAA9JUEjawtwADYYMAA2H8GlM0AYMAA9HkBHMAA2HuUg4IBAAE3BQDAAPSVBI2tLcAA2NTAANj+BpTOAGDAAPR5ARzAANj6lIOCAQABNwYAwAD0lQSNri3AANkTwADZNQaUzwBgwAD0eQEcwADZMZSDggEAATcHAMAA9JUCBY3aLcAA0AzAANAMwADUIAAAAAPAANAVwADUIAAAAA4DA8AA0BsAAACAsGCSMgDAANAvAAAAghxgjdwAwADQQgAAAJJPYI44AAvAANBYAAAAg99gwADyswEqwADQdgAAAIPeYMAA8rMBKsAA0JIAAACD5GDAAPKzASrAANCwAAAAg+JgwADyswEqwADQywAAAJTQYMAA8rMBKsAA0O8AAACU0WDAAPKzASrAANEWAAAAlKlgwAD0eQGTwADRNQAAAIQYYMAA9t4BK8AA0U4AAACUHGCMNwErwADRZgAAAJTSYI0TASvAANGOAAAAlNNgjRMBK2CNnwE/AQoAwADRu43bDgADgMAA0cfABRkEgcAA0c3ABRkRgsAA0dPABRkeC4Pfg8AA0fXABRksg96EwADSF8AFGTyD5IXAANI5wAUZTIPihsAA0lrABRlclNCHwADSgcAFGWyU0RTAANK1wAUZfAgAlKkUwADS6cAFGYwJAIQYFMAA0xDABRmcCgCUHBTAANMwwAUZrAsAlMoewADTe4wCAQABFMAA047ABRm6DAAAlMsewADT7owCAQABFMAA1AHABRnIDQAABY3bLcAA1CXAANQlwADXKQCUWQADwADUOsAA1ykAAAAOAwPAANRAAAAAgLBgkjIAwADUSwAABIIcYI3cAMAA1FYAAASST2COOAALwADUbAAAAIPfYMAA8rMBKsAA1IoAAACD3mDAAPKzASrAANSmAAAAg+RgwADyswEqwADUxAAAAIPiYMAA8rMBKsAA1N8AAACU0GDAAPKzASrAANUDAAAAlNFgwADyswEqwADVKgAAAJSpYMAA9HkBk8AA1UkAAACEGGDAAPbeASvAANViAAAAlBxgjDcBK8AA1XgAAASUymCMNwErwADVpwAABJTLYIw3AStgjZ8BPgg9NQAAAAEAYI44ARbAANX+LpJPjaQjHMAA1ggUAMAFG5sOAEEBAAErAAArF8AA1ggUAMAFG5sOAJJRLowbAWCNnz0XwADWIC6D34PAANYtwAUa6Y3IPRfAANZCLoPehMAA1k3ABRr5jcc9F8AA1mAug+SFwADWbcAFGwmNyT0XwADWgi6D4obAANaMwAUbGY3KPRfAANaeLpTQh8AA1rHABRspjcs9F8AA1swulNEUwADW48AFGzkIAI3MPRfAANcCLpSpFMAA1xXABRtJCQCNxgUIAY2igQDABRrOCAGNpIIAwAUa2wgBjaUUAMAFG3cMAAgBjaYUAMAFG4UNAAkAwADV2I0wAwADgMAA1d7ABRrBFMAA1eTABRtZCgAUwADV7cAFG2kLAAAmBo2wLcAAzPDAAMz4wADNRAEAlKkAAAABA8AAzQnAAM1EAAAAAAAAAGDAAPR5AT4CPTUAAAABAGCOOAEWwADNDy6ST42kIxzAAM0ZgADABRz1QQEAASsAACsWwADNGYAAwAUc9ZJMjk4BYJETSsAAzSMBGMAAzTCUqY0ZBo3GLcAAzhnAAM4iwADOgAIAlKkAAAABA8AAzjLAAM6AAAAAAQEBwADONwAAAJTUYMAA9HkAAFwBPgI9NQAAAAEAYI44ARbAAM5HLpJPjaQjHMAAzlGBAMAFHXtBAQABKwAAKxbAAM5RgQDABR17kkyOTgFgkRM9GcAAzmGUqYDAAM50wAUdZY0ZBo3SLcAAzz7AAM9DwADPogAAlNUAAAABA8AAz2jAAM+iAAAAAQEBwADPbQAAAJTUYMAA9HkAAFwBPgE9GcAAz4OUqYDAAM+WwAUd740ZBo2xLcAA2TrAANlDwADZZgEAg94AAAABA8AA2UzAANlmAAAAAAAAAGDAAPKzAUrAANlPASEcwADZYhzAANlVFsAA2U8uhBKNo4MsAQABGsAA2VeNpwDAAPSRQQEAAZMAwAD1nAaNsi3AANlqwADZc8AA2ZoBAIPfAAAAAQPAANl+wADZmgAAAAAAAABgwADyswFKwADZgQEhHMAA2ZYcwADZhxbAANmBLoQSjaODLAEAARrAANmJjagAwAD0kUEBAAGTAMAA9ZwGjbMtwADZnsAA2afAANnOAQCD5AAAAAEDwADZssAA2c4AAAAAAAAAYMAA8rMBSsAA2bUBIRzAANnKHMAA2bsWwADZtS6EEo2jgywBAAEawADZvY2pAMAA9JFBAQABkwDAAPWcBo20LcAA2mDAANppwADaigEAg+IAAAABA8AA2nHAANqKAAAAAAAAAGDAAPKzAUrAANp0ASEcwADahhzAANp6FsAA2nQuhBKNo4MsAQABGsAA2nyNqgDAAPSRQQEAAZMAwAD1nAaNtS3AANx6wADcg8AA3LYBAJTQAAAAAQPAANyUwADctgAAAAAAAABgwADyswFKwADclwEhHMAA3LIcwADcnRbAANyXLoQSjaODLAEAARrAANyfjasAwAD0kUEBAAGTAMAA9ZwGjbYtwADdUsAA3VvAAN2WAQCU0QAAAAEDwADdcMAA3ZYAAAAAAAAAYMAA8rMBSsAA3XMBIRzAAN2SHMAA3XkWwADdcy6EEo2jgywBAAEawADde42sAMAA9JFBAQABkwDAAPWcBo23LcAA3hLAAN4bwADeegEAlNYAAAABA8AA3jvAAN56AAAAAAAAAGDAAPKzAT4BSsAA3kEBIRzAAN5yHMAA3k4WwADeSC6EEo2jgywBAAEawADeUI2tAMAA9JFBAQABkwDAAPWcBo24LcAA307AAN9XwADfmAEAlNcAAAABA8AA32zAAN+YAAAAAAAAAGDAAPKzAUrAAN9vASIWwADfby6U0I21ACEWwADfhC6U0Y22Bo25LcAA353AAN+mwADf5wEAlNgAAAABA8AA377AAN/nAAAAAAAAAGDAAPKzAUrAAN/BASEcwADf4xzAAN/HFsAA38EuhBKNo4MsAQABGsAA38mNrgDAAPSRQQEAAZMAwAD1nAaNxy3AAN/swADf9cAA4FACAIPeAAAAAQPAAN/9wADgUAAAAAEBAcAA4AMAAACAimDAAPKzAABcAT4BPRfAAOAQLoQSI4DAAOAYwAUhqhzAAOAnFsAA4CEuhBKNo4DfAQABGsAA4CmNpwDAAPSSHMAA4D4WwADgOC6EEo2jgywBAAEcwADgQBrAAOBBjaeSlQAAAADAAPSUAMAA9JEBYMAA9HmNowaNyC3AAOBVwADgXsAA4L8CAIPfAAAAAQPAAOBowADgvwAAAAEBAcAA4G4AAACAimDAAPKzAABcAT4BPRfAAOB7LoQSI4DAAOCDwAUiTxzAAOCSFsAA4IwuhBKNo4DfAQABGsAA4JSNqADAAPSSHMAA4KsWwADgpS6EEo2jgywBAAEcwADgrRrAAOCujaiSlQAAAADAAPSUAMAA9JEBYMAA9HmNowaNyS3AAODEwADgzcAA4S4CAIPkAAAAAQPAAODXwADhLgAAAAEBAcAA4N0AAACAimDAAPKzAABcAT4BPRfAAODqLoQSI4DAAODywAUi9BzAAOEBFsAA4PsuhBKNo4DfAQABGsAA4QONqQDAAPSSHMAA4RoWwADhFC6EEo2jgywBAAEcwADhHBrAAOEdjamSlQAAAADAAPSUAMAA9JEBYMAA9HmNowaNyi3AAOEzwADhPMAA4ZQCAIPiAAAAAQPAAOFDwADhlAAAAAEBAcAA4UkAAACAimDAAPKzAABcAT4BPRfAAOFWLoQSI4DAAOFewAUjmRzAAOFtFsAA4WcuhBKNo4DfAQABGsAA4W+NqgDAAPSSHMAA4YMWwADhfS6EEo2jgywBAAEcwADhhRrAAOGGjaqSlQAAAADAAPSUAMAA9JEBYMAA9HmNowaNyy3AAOGZwADhosAA4h0CAJTQAAAAAQPAAOGywADiHQAAAAEBAcAA4bgAAACAimDAAPKzAABcAT4BPRfAAOHFLoQSI4DAAOHVwAUkPhzAAOHkFsAA4d4uhBKNo4DfAQABGsAA4eaNqwDAAPSSHMAA4gMWwADh/S6EEo2jgywBAAEcwADiBRrAAOIGjauSlQAAAADAAPSUAMAA9JEBYMAA9HmNowaNzC3AAOIiwADiK8AA4roCAJTRAAAAAQPAAOI/wADiugAAAAEBAcAA4kUAAACAimDAAPKzAABcAT4BPRfAAOJSLoQSI4DAAOJawAUk4xzAAOJxFsAA4msuhBKNo4DfAQABGsAA4nONrADAAPSSHMAA4pwWwADili6EEo2jgywBAAEcwADinhrAAOKfjaySlQAAAADAAPSUAMAA9JEBYMAA9HmNowaNzS3AAOK/wADiyMAA43gCAJTWAAAAAQPAAOLnwADjeAAAAAEBAcAA4u0AAACAimDAAPKzAABcAT4BPRfAAOL6LoQSI4DAAOMCwAUliBzAAOMZFsAA4xMuhBKNo4DfAQABGsAA4xuNrQDAAPSSHMAA408WwADjSS6EEo2jgywBAAEcwADjURrAAONSja2SlQAAAADAAPSUAMAA9JEBYMAA9HmNowaNzi3AAON9wADjhsAA5B4CAJTYAAAAAQPAAOOdwADkHgAAAAEBAcAA46MAAACAimDAAPKzAABcAT4BPRfAAOOwLoQSI4DAAOO4wAUmLRzAAOPPFsAA48kuhBKNo4DfAQABGsAA49GNrgDAAPSSHMAA4/0WwADj9y6EEo2jgywBAAEcwADj/xrAAOQAja6SlQAAAADAAPSUAMAA9JEBYMAA9HmNowaNui3AAOQjwADkLMAA5EkBAJSsAAAAAQPAAOQ9wADkSQAAAAAAAABgwADyswFKwADkQAEhFsAA5EEug96NsQaNuy3AAORNwADkVsAA5H4BAIRAAAAAAQPAAORfwADkfgAAAAAAAABgwADyswFKwADkYgEcwADkZxbAAORiLoIcjaJBAQABGsAA5HiN4wDAAPXSBo28LcAA5ILAAOSLwADkswEAhEEAAAABA8AA5JTAAOSzAAAAAAAAAGDAAPKzAUrAAOSXARzAAOScFsAA5JcughyNokEBAAEawADkrY3kAMAA9dIGjb0twADkt8AA5MDAAOTiAQCU2QAAAAEDwADky8AA5OIAAAAAAAAAYMAA8rMBSsAA5M4BIhbAAOTOLoRAjbsBFsAA5NouhEGNvAaNvi3AAOTmwADk78AA5RgBAJSqAAAAAQPAAOT5wADlGAAAAAAAAABgwADyswFKwADk/AEhHMAA5QEWwADk/C6CHI2iQQEAARrAAOUSjeQAwAD10gaNvy3AAOUcwADlJcAA5U4BAJSrAAAAAQPAAOUvwADlTgAAAAAAAABgwADyswFKwADlMgEcwADlNxbAAOUyLoIcjaJBAQABGsAA5UiN5ADAAPXSBo3ALcAA5VLAAOVbwADlhQEAg+MAAAABA8AA5WXAAOWFAAAAAAAAAGDAAPKzAUrAAOVoARzAAOVtFsAA5WgughyNokEBAAEawADlfo3mAMAA9dIGjcEtwADlisAA5ZXAAOXkAQCU0gAAAAEDwADlr8AA5eQAAAAAAAAAYI0TAUrAAOW4ATUAAAABAGCMNwEWwADluC6Uyo2lIxzAAOXcgADABSkHQQEAASsAACsWwADl3IAAwAUpB5QmjEABYI0TBo3PLcAA5enAAOXywADmZAIAlNIAAAABA8AA5gvAAOZkAAAAAQEBwADmEwAAAIHTYI0TAABcAT4BPRfAAOYhLpTKHsAA5kaMAgEAAYDAAOZZwAUpaACNpQaNwi3AAOZpwADmdMAA5ssBAJTTAAAAAQPAAOaSwADmywAAAAAAAABgjRMBSsAA5psBNQAAAAEAYIw3ARbAAOabLpTLjaYjHMAA5sOAAMAFKcxBAQABKwAAKxbAAObDgADABSnMlCaMQAFgjRMGjdAtwADm0MAA5tnAAOdTAgCU0wAAAAEDwADm9sAA51MAAAABAQHAAOb+AAAAgdNgjRMAAFwBPgE9F8AA5wwulMsewADnNYwCAQABgMAA50jABSotAI2mBo3TLcAA51jAAOdYwADniQAAlA4AAAABA8AA517AAOeJAAAAAQEBwADnbQAAAIDUXaBjAVsAAFsBSsAA53MBHMAA53WAwADnc8AFKoWU2gEAAS4AoGcGjdQtwADnjsAA547AAOfaAACUoQAAAAEDwADnncAA59oAAAABAQHAAOe1AAAAgNRdoQkBWwAAWwFKwADnuwEcwADnvYDAAOe7wAUq25TbAQABLgChDgaN1S3AAOffwADn38AA6EkAAJQPAAAAAQPAAOfswADoSQAAAAEBAcAA5/UAAACA1F2hEgFbAABcAT4DPR7AAOf+i/oCAAIWwADoCC6UNI0WgMAA6BXABSsxAD01AAAAAQBgkjIBFsAA6B0ugLCNFyMcwADoI4EAwAUrZkEBAAErAAArHMAA6COBAMAFK2aUDgEAAYDAAOgqwAUrMQCSPwFbPTUAAAABAGCOOAEWwADoMi6ST42kIxzAAOg8gQDABSutQQEAASsAACscwADoPIEAwAUrrZQOAQABgMAA6EPABSsxAI5KAVsGjdYtwADoTsAA6E7AAOkCAACUFAAAAAEDwADoX8AA6QIAAAABAQHAAOhsAAAAgNRgoU4AAFsBPgI9HsAA6HWL/gMAAxbAAOiDLpQ0jRaAwADokMAFLBkuAEnAAOieIRzAAOirFsAA6KIukk+NpEEBAAErAMAA9dI+Aj0XwADovC6STybAAOi8ARzAAOjQFsAA6Mcukk+NpJQOAQABgMAA6NfABSwZAI5KYI44jaQ9NQAAAAEAYI44ARbAAOjhLpJPjaQjHMAA6OuBAMAFLKJBAQABKwAAKxfAAOjrgQDABSyiklEujBsBYI2fPwaNwy3AAOkHwADpFMAA6WYBAJStAAAAAQPAAOkfwADpZgAAAAAAAABgklkBPgFKwADpJQEjFsAA6SwuhECNuxbAAOlAFsAA6Tcukk+NpJTcjkEWwADpVhbAAOlNLpJPjaSU3Y5PAWCSWQaNxC3AAOlrwADpeMAA6ekBAJSuAAAAAQPAAOmDwADp6QAAAAAAAABgklkBPgFKwADpiQEjFsAA6ZAuhEGNvBbAAOnEHMAA6cAWwADprBbAAOmjLpJPjaSUbI4/RAEAAZMAwAD1LIIXkgggwADp2ZKKAAAAAAFgklkGjdgtwADp7sAA6ffAAOpsAACUGovzAAAAAQPAAOoSwADqbAAAAAEBAcAA6hcAAACDFWDAAPR5AABgk/gBPgFKwADqJQEewADqLIwBAwADFsAA6kQulBmMJxbAAOpYLoQYjRiAwADqYcAFLekAAAAFHMMABR0+AAUdyAAFHhYABR56AAUe3gAFH0IABR+mAAUgCgAFIG4ABSDUAAUhHwAFIYMABSIoAAUizQAFI3IABSQXAAUkvAAFJWEABSYGAAUmqwAFJuoABSc9AAUnkAAFJ9oABSguAAUogQAFKNQABSlBAAUpmQAFKgYABSpeAAUqtAAFKwoABSvyAAUs3gAFLUcABS3AAAUuLQAAACYCjdwtwADqccAA6nbAAOq7C5TeAAABYMAA9cUAAAgEjd4twADqdsAA6nYJJwBgwAD0eQAEjeAtwADqdsAA6nYJKIvzAGDAAPZdAASN4S3AAOp2wADqdgYpAF3AAPUdAWCN3AE6AGCN3AUaAI3iGgCN4xoAjeQaAI3lGgCN5gSN4i3AAOqIwADqiAaU3wBgjdwBIACN6gIAApMnlOAABI3jLcAA6pLAAOqSBpThAGCN3AEgAI3qAgAClCeU4gAEjeQtwADqnMAA6pwGlOMAYI3cASAAjeoCAAKVJ5TkAASN5S3AAOqmwADqpgaSawBgjdwBIACN6gIAApYnlOUABI3mLcAA6rLAAOqyBpTmAGCN3AEgAI3qAgAClyeU5wABBY3qLcAA6nbAAOp2wADquwEAAAPAAOp2wADquwAAAAICAsAA6nYAAAQnYMAA9HkAwADqdgAABChgwAD2XQAAYI3cAT8DCACN3oAAwAUwDggAjeCBAMAFMBwJAADAAPXbAAAAAAEGjegtwADqdsAA6nbAAOq7AAAjAAAAAQPAAOp2wADquwAAAAAAAABgwAD2XQFKAAEPAC6N4AAABTBRAAUwhgAAAAECjestwADrucAA68jAAOxuB5ToAAABYIwVAAABBI3tLcAA7DjAAOxLGJQ9ARrAAOwli/dgwADyswEqAQWN8QAAAAAEAAADAAAAAAAAAAAAYI3rAT8BCQEAjCoAAAAAAQaN7y3AAOxQwADsUMAA7GwAApQOAAAAAQPAAOxWwADsbAAAAAEBAcAA7GoAAACA1F2gbAFbAABbAAAABTDyAAUxKwAAAAECjfItwADtLMAA7TLAAO3jA4sqAAABYI3rAAAAAQWN+AAAAAAEAAADAAAAAAAAAAAAYI3yAT8BCQEAjfEAAAAAAwaN9C3AAO1dwADtXcAA7ZwAAJQOAAAAAQPAAO1jwADtnAAAAAEBAcAA7XcAAACA1F2gbAFbAABbAUrAAO19ARzAAO1/gMAA7X3ABTGglOkBAAEuAKBvBo31LcAA7aHAAO2hwADtuwAAlA8AAAABA8AA7a7AAO27AAAAAQEBwADttwAAAIDUXaESAVsAAFwBPgAGjfYtwADtv8AA7b/AAO3hAACUFAAAAAEDwADt0MAA7eEAAAABAQHAAO3dAAAAgNRgoU4AAFsBPgAAAAUxeQAFMc8ABTIKAAUyQwAAAAMCjfktwADva8AA73HAAPJfA5TqAAABYI3rAAACBI37LcAA79/AAO/tGJTrAGCMNwAEjfwtwADv/MAA8AEYgIoAYI5jAAIFjgYtwADwBsAA8AbAAPBnAAAAA8AA8BbAAPBnAAAAAgICwADwHQAAAJREYI0xAMAA8C8AAACAimCOYwAAYI35AT8BCgDAAPBDjgcCAAI1AAAAAQBgjTEBgMAA8E/ABTK/IxzAAPBWggDABTLsQQEAASsAACsWwADwVoIAwAUy7JQcjC0BYIw3gcAA8GHABTLMAAWOBy3AAPBswADwbMAA8MgAlFkAA8AA8IjAAPDIAAAAAgICwADwjgAABJTrYIw3AMAA8KMAAASAimCOYwAAYI35AT4BPTUAAAABAGCOYwEWwADwsC6Aio38IxzAAPC3ggDABTN1QQEAASsAACsXwADwt4IAwAUzdZJRLowbAWCN+QMIAY37gADABTNSCAGN/IEAwAUzXwkBwADwbI3xAAAAAAUGjf4twADwzcAA8NfAAPD0AQCURAAAAAEDwADw3cAA8PQAAAAAAAAAYI0xAUrAAPDgASbAAPDgATUAAAABAGCMNwEWwADw4C6U6437IxzAAPDwgADABTQLQQEAASsAACsWwADw8IAAwAU0C4OyjDoBYIwrYI0xBo4ALcAA8PnAAPECwADxQAIAlEQAAAABA8AA8QfAAPFAAAAAAQEBwADxDgAAAJREYI0xAABcAT4BPRfAAPEbLpTrNQAAAAEAYI0xAYDAAPEswAU0byMcwADxM4EAwAU0i0EBAAErAAArFsAA8TOBAMAFNIuUHIwtAWCMN437Bo4CLcAA8UXAAPFFwADxggAAlA4AAAABA8AA8UvAAPGCAAAAAQEBwADxXwAAAIDUXaBsAVsAAFsBSsAA8WUBHMAA8WeAwADxZcAFNO2U7AEAAS4AoHAGjgMtwADxh8AA8YfAAPHZAACUDwAAAAEDwADxlMAA8dkAAAABAQHAAPGdAAAAgNRdoRIBWwAAXAE+Aj01AAAAAQBgjTEBFsAA8aYulESN/iMcwADxrYEAwAU1WUEBAAErAAArHMAA8a2BAMAFNVmUoQEAAYDAAPG9wAU1QwCNVwFbPTUAAAABAGCOYwEWwADxxS6Aio38IxzAAPHMgQDABTWgQQEAASsAACscwADxzIEAwAU1oJQOAQABgMAA8dPABTVDAI5nAVsGjgQtwADx3sAA8d7AAPJdAACUFAAAAAEDwADx78AA8l0AAAABAQHAAPH8AAAAgNRgoU4AAFsBPgFJwADyBSEcwADyDxbAAPIJLoCKjfxBAQABKwDAAPXSPgI9F8AA8iAugIomwADyIAEcwADyLhbAAPIoLoCKjfyUDgEAAYDAAPI1wAU2DACOZ2COY438PTUAAAABAGCOYwEWwADyPy6Aio38IxzAAPJGgQDABTZ1QQEAASsAACsXwADyRoEAwAU2dZJRLowbAWCN+T8AAAUz0gAFNEgABTTGAAU1HAAFNeUABTaxAAAABQKOCC3AAPOowADzrsAA9w4DlO0AAAFgjesAAAIEjgotwAD0MMAA9D8YlMYAYIw3AASOCy3AAPRNwAD0VhhUAGCPLQACBY4VLcAA9FvAAPRbwAD01AAAAAPAAPRrwAD01AAAAAICAsAA9HgAAACB02CNXgDAAPSKAAAAVGCPLQAAYI4IAT8BCgDAAPSijhYCAAIewAD0rowCAQABgMAA9MHABTc0AIHAAPTKwAU3QQAFjhYtwAD02cAA9NnAAPU+AJRZAAPAAPT1wAD1PgAAAAICAsAA9PsAAASUxmCMNwDAAPURAAAEVGCPLQAAYI4IAT4BPTUAAAABAGCPLQEWwAD1Ii5UjgsjHMAA9S2CAMAFN8JBAQABKwAAKxfAAPUtggDABTfCklEujBsBYI4IAwgBjgqAAMAFN6AIAY4LgQDABTetCQHAAPTZjfEAAAAABQaODS3AAPVDwAD1U8AA9XsBAIHTAAAAAQPAAPVawAD1ewAAAAAAAABgjV4BSsAA9V0BNQAAAAEAYIw3ARbAAPVdLpTGjgojHMAA9W6AAMAFOFFBAQABKwAAKxbAAPVugADABThRlCqMQgFgjV4Gjg8twAD1gMAA9YnAAPXaAgCB0wAAAAEDwAD1j8AA9doAAAABAQHAAPWcAAAAgdNgjV4AAFwBPgE9F8AA9aoulMYewAD1vIwCAQABgMAA9c/ABTiyAI4KBo4RLcAA9d/AAPXfwAD2HAAAlA4AAAABA8AA9eXAAPYcAAAAAQEBwAD1+QAAAIDUXaBsAVsAAFsBSsAA9f8BHMAA9gGAwAD1/8AFOQqU7gEAAS4AoHEGjhItwAD2IcAA9iHAAPZ4AACUDwAAAAEDwAD2LsAA9ngAAAABAQHAAPY3AAAAgNRdoRIBWwAAXAE+Aj01AAAAAQBgjV4BFsAA9kAugdOODSMcwAD2SIEAwAU5dkEBAAErAAArHMAA9kiBAMAFOXaUoQEAAYDAAPZYwAU5YACNdgFbPTUAAAABAGCPLQEWwAD2YC5UjgsjHMAA9muBAMAFOb1BAQABKwAAKxzAAPZrgQDABTm9lA4BAAGAwAD2csAFOWAAjzUBWwaOEy3AAPZ9wAD2fcAA9wwAAJQUAAAAAQPAAPaOwAD3DAAAAAEBAcAA9psAAACA1GChTgAAWwE+AUnAAPakIRzAAPayFsAA9qguVI4LQQEAASsAwAD10j4CPRfAAPbDLlQmwAD2wwEcwAD22RbAAPbPLlSOC5QOAQABgMAA9uDABTooAI81YI8tjgs9NQAAAAEAYI8tARbAAPbqLlSOCyMcwAD29YEAwAU6jkEBAAErAAArF8AA9vWBAMAFOo6SUS6MGwFgjgg/AAAFOB4ABTiLAAU44wAFOTkABToBAAU6yQAAAAUCjhctwAD4CsAA+BDAAPuHA5TvAAABYI3rAAACBI4ZLcAA+JfAAPimGJTGAGCMNwAEjhotwAD4tMAA+L0YVABgjy0AAgWOJC3AAPjCwAD4wsAA+UEAAAADwAD42MAA+UEAAAACAgLAAPjlAAAAgdNgjV4AwAD49wAAAFRgjy0AAGCOFwE/AQoAwAD5D44lAgACHsAA+RuMAgEAAYDAAPkuwAU7TACBwAD5N8AFO1kABY4lLcAA+UbAAPlGwAD5sQCUWQADwAD5aMAA+bEAAAACAgLAAPluAAAElMZgjDcAwAD5hAAABFRgjy0AAGCOFwE+AT01AAAAAQBgjy0BFsAA+ZUuVI4aIxzAAPmgggDABTvaQQEAASsAACsXwAD5oIIAwAU72pJRLowbAWCOFwMIAY4ZgADABTu4CAGOGoEAwAU7xQkBwAD5Ro3xAAAAAAUGjhwtwAD5tsAA+cbAAPnuAQCB0wAAAAEDwAD5zcAA+e4AAAAAAAAAYI1eAUrAAPnQATUAAAABAGCMNwEWwAD50C6Uxo4ZIxzAAPnhgADABTxpQQEAASsAACsWwAD54YAAwAU8aZQqjEIBYI1eBo4eLcAA+fPAAPn8wAD6TQIAgdMAAAABA8AA+gLAAPpNAAAAAQEBwAD6DwAAAIHTYI1eAABcAT4BPRfAAPodLpTGHsAA+i+MAgEAAYDAAPpCwAU8ygCOGQaOIC3AAPpSwAD6UsAA+pUAAJQOAAAAAQPAAPpYwAD6lQAAAAEBAcAA+mwAAACA1F2gbAFbAABbAUrAAPpyARzAAPp0gMAA+nLABT0ilPABAAEuAKByBo4hLcAA+prAAPqawAD68QAAlA8AAAABA8AA+qfAAPrxAAAAAQEBwAD6sAAAAIDUXaESAVsAAFwBPgI9NQAAAAEAYI1eARbAAPq5LoHTjhwjHMAA+sGBAMAFPY5BAQABKwAAKxzAAPrBgQDABT2OlKEBAAGAwAD60cAFPXgAjXYBWz01AAAAAQBgjy0BFsAA+tkuVI4aIxzAAPrkgQDABT3VQQEAASsAACscwAD65IEAwAU91ZQOAQABgMAA+uvABT14AI81AVsGjiItwAD69sAA+vbAAPuFAACUFAAAAAEDwAD7B8AA+4UAAAABAQHAAPsUAAAAgNRgoU4AAFsBPgFJwAD7HSEcwAD7KxbAAPshLlSOGkEBAAErAMAA9dI+Aj0XwAD7PC5UJsAA+zwBHMAA+1IWwAD7SC5UjhqUDgEAAYDAAPtZwAU+QACPNWCPLY4aPTUAAAABAGCPLQEWwAD7Yy5UjhojHMAA+26BAMAFPqZBAQABKwAAKxfAAPtugQDABT6mklEujBsBYI4XPwAABTw2AAU8owAFPPsABT1RAAU+GQAFPuEAAAAFAo4mLcAA/FXAAPxbwAD99QOU8QAAAWCN6wAAAQSOKC3AAPyYwAD8oBiSSwBgkgIAAQWOLi3AAPylwAD8pcAA/OYAAAADwAD8tcAA/OYAAAABAQHAAPy7AAAEkktgkgIAAGCOJgE+AT01AAAAAQBgkgIBFsAA/MsukkuOKCMcwAD81YEAwAU/Z0EBAAErAAArF8AA/NWBAMAFP2eSUS6MGwFgjiYCCAGOKIAAwAU/UQkBwAD8pY3xAAAAAAMGjiotwAD868AA/OvAAP0oAACUDgAAAAEDwAD88cAA/SgAAAABAQHAAP0FAAAAgNRdoGwBWwAAWwFKwAD9CwEcwAD9DYDAAP0LwAU/4ZTyAQABLgCgcwaOKy3AAP0twAD9LcAA/WMAAJQPAAAAAQPAAP06wAD9YwAAAAEBAcAA/UMAAACA1F2hEgFbAABcAT4BPTUAAAABAGCSAgEWwAD9TC6SS44oIxzAAP1WgQDABUBNQQEAASsAACscwAD9VoEAwAVATZQOAQABgMAA/V3ABUA3AJIfAVsGjiwtwAD9aMAA/WjAAP3zAACUFAAAAAEDwAD9ecAA/fMAAAABAQHAAP2GAAAAgNRgoU4AAFsBPgFJwAD9jyEcwAD9nBbAAP2TLpJLjihBAQABKwDAAPXSPgI9F8AA/a0ukksmwAD9rQEcwAD9wRbAAP24LpJLjiiUDgEAAYDAAP3IwAVAuQCSH2CSAo4oPTUAAAABAGCSAgEWwAD90i6SS44oIxzAAP3cgQDABUEiQQEAASsAACsXwAD93IEAwAVBIpJRLowbAWCOJj8AAAU/ugAFQBAABUCSAAVBXgAAAAMCji8twAD9+MAA/f7AAP91A5TzAAABYI3rAAABBI4xLcAA/jjAAP5BGJJQAGCRQQABBY43LcAA/kbAAP5GwAD+iQAAAAPAAP5XwAD+iQAAAAEBAcAA/l0AAASSUGCRQQAAYI4vAT4BPRfAAP54FsAA/m4uklCOMZJRLowbAggBjjGAAMAFQcYJAcAA/kaN8QAAAAADBo4zLcAA/o7AAP6OwAD+zAAAlA4AAAABA8AA/pTAAP7MAAAAAQEBwAD+qAAAAIDUXaBsAVsAAFsBSsAA/q4BHMAA/rCAwAD+rsAFQi6U9AEAAS4AoHQGjjQtwAD+0cAA/tHAAP8HAACUDwAAAAEDwAD+3sAA/wcAAAABAQHAAP7nAAAAgNRdoRIBWwAAXAE+AT0cwAD++hbAAP7wLpJQjjGUDgEAAYDAAP8BwAVChACRSAaONS3AAP8MwAD/DMAA/3MAAJQUAAAAAQPAAP8dwAD/cwAAAAEBAcAA/yoAAACA1GChTgAAWwE+Aj0XwAD/My6SUCbAAP8zARzAAP9JFsAA/z8uklCOMZQOAQABgMAA/1DABULgAJFIYJFBjjE9F8AA/2IWwAD/WC6SUI4xklEujBsAAAVCBwAFQl0ABUK5AAVDOwAAAAMCjjgtwAEA2MABAOPAAQ9pA5I4ARrAAQDZoiMAAWCMFQAACgSOOi3AAQHfwAECABiUfgBgwAD0eQEawAEB+IwaBI47LcABAmXAAQJwGJT1AGCOVAAEjjwtwAEDusABA8kYlPYAYI5UAASOPS3AAQPiwAED8BiSXgBdwAD1HQFgkuEABI4+LcABA/jAAQQOGJTHAGDAAPR5AASOPy3AAQQ8wAEEUBiUbAEawAEEE6IpXcAA9R0BYJICAASOQC3AAQR3wAEEhhiUbQEawAEEVaIlXcAA9R0BYJICAASOQS3AAQSTwAEEnRiU3ABgklkABI5DLcABBLjAAQS9GJT3i/MAYJETAASORC3AAQTSwAEE3RiU+ABhAFwBKwEFjlMtwAEGC8ABBgvAAQmTAAAAA8ABBhfAAQmTAAAACAEBwAEGHQAABJT3YJETAAfAAQY/AAAAkl5dwAD1HQFgkuEBK8ABBm8AAACUbF3AAPUdAWCSAgErwAEGpQAAAJRtXcAA9R0BYJICASvAAQbAAAAAlMdgwAD0eQErwAEG4wAABJTcYJJZASDAAQb1knYAAAAAwAEHDwAABJT1YI5UARrAAQcojlrAAQc5AAAElPZgjlQBK2COOAE+BkAhHMABCMAWwAEItS6U3I5BQQEAASsAkl3AAQi1wAEIxwA9HsABCM6L+QIAAhbAAQjeLpJejj0uAD0ewAEI+Yv5AgACFsABCQkulGyOPy4APR7AAQkqi/kCAAIWwAEJOi6UbY5ALgA9NQAAAAEAYJETARbAAQlWLpT3i/OOQyMcwAEJXRQAwAVFjwgAQQEAASsAACsXwAEJXRQAwAVFjwgAklEujBsBYI44PSMcwAEJgBbAAQlwLpT2jjxBAQABKwDAAPXSF8ABCXAulPYWwAEJhC6U9Y47jjwrAWCOVAkIAY5DgADABUSMCAGOQYUAwAVE5ggBjjuGAMAFRP4IAY48hwDABUUSCACOPzUAAAABAF3AAPUdAWCSAgGCwAEHe8AFRK4jHMABB5AUAMAFRjIIAEEBAAErAAAxwAEHqGCSAgAUAMAFRjIIAAFdwAD1HQFgkgIIAI4+NQAAAAEAYMAA9HkBNQAAAAEAYMAA9HkBhMABB97ABUTWIxzAAQf1FADABUaLCABBAQABKwAANQAAAAEAXcAA9R0BYJICAYLAAQf4wAVEriMcwAEIDhQAwAVGtQkAQQEAASsAACsWwAEIDhQAwAVGtQkAWsAA9UwBYMAA9HkUAMAFRosIAAFgwAD0eSMcwAEIFRQAwAVGfwgAQQEAASsAAJMUAMAFRn8IAAFgwAD0eQgAjkA1AAAAAQBdwAD1HQFgkgIBg8ABCDrABUTCIxzAAQhKFADABUcyCABBAQABKwAAMcABCGJgkgIAFADABUcyCAABXcAA9R0BYJICCACOPTUAAAABAF3AAPUdAWCS4QGBwAEIhMAFRJojHMABCJMUAMAFR38IAEEBAAErAAAxwAEIpWCS4QAUAMAFR38IAAFdwAD1HQFgkuEJAcABBguMKgAAAAAJBo5HLcABBOLAAQTnwAEFewAAlPmL8wAAAAEDwAEE8cABBXsAAAAAAAAAXAE+AUnAAQT6IRzAAQUKFsABBP4ulPiOREEBAAErAMAA9dI+A07AAQUfwAEFMAAAlPphAFwBFsABBTIulPiORD0XwAEFRS6U+CuORD0cwAEFb4DAAQVfwAVIJCAAAAAAAD8Gjk4twAEFgMABBY7AAQW7AQCSTAAAAAEDwAEFk8ABBbsAAAAAAAAAYJETAT4CPRzAAQWZLpT5i/MAAAAAjkdKwAEFqwEWwAEFsi6U94vzjkMGjlEtwAEFwMABBcnAAQYGAgCSTAAAAAEDwAEFzcABBgYAAAABAQHAAQXYAAAAkkxgkRMAAFwBPgI9HMABBeQulPmL8wAAAACORz0XwAEF9i6U94vzgMABBf7ABUjYjkMGjkgtwAEJmMABCajAAQnhAAGU+4vzAAAAAQPAAQm6wAEJ4QAAAAEBAcABCc8AAACDsmCSAgAAYJJZAUrAAQnYARbAAQndgMABCdjABUk6gheSCAaOSS3AAQnmwAEJ98ABCl0AAZT8i/MAAAABA8ABCg7AAQpdAAAAAQEBwAEKIwAAAIOyYJICAABgksYBPgFKwAEKLwEfwAEKOpLSAgACFsABCkmAwAEKRMAFSY2AsJIGFsABClSAwAEKT8AFSY2CF5IIAAaOTy3AAQpiwAEKc8ABDTgBAJTdAAAAAQPAAQqAwAENOAAAAAAAAABgkpwBPgVOwAEKj8ABCpYAAJJRYIwVARbAAQqdLpJRjBtOwAEKucABCr8AAJT9XcAA9R0BYJLGARzAAQr2HMABCtkWwAEKyS6UbY5AgJ8BAWCSxgEawAEK3Y5JAMAA9OaAoQEAAAGTDyrAAPTxPRzAAQsZgcABCxPABUoggKIAAAAAwAD1ME7AAQugwAELswAAlP5dwAD1HQFgkuEBHsABC7nAAPUjAQFgkuEBIyXAAQvZgMABC9LABUoFYI1eFsABDAgWwAEL+RTAAQvywAVKBQABYI1ekmmNG5JejN0WwAEMIS6SXo49AV3AAPUdAWCS4QBKwAEMNgEfwAEMQZK0BQACHMABDIQcwAEMbBbAAQxXLpRsjj+AnwEBYJJZARrAAQxwjkgAwAD05oChAQAAAZMPKsAA9PEWwAEMpS6U3I5BA5RtgcABDMrABUogkl6CwAEM6cAFSoWUxxbAAQ0dLpTHjj4GjkotwAENPcABDT3AAQ1vAACUDgAAAAEDwAENQ8ABDW8AAAABAQHAAQ1QAAAAgNRdoHcBWwAAWwFKwAENVgEcwAENWIDAAQ1WwAVLipT/AQABLgCg0waOSy3AAQ10wAENdMABDi4AAJQPAAAAAQPAAQ2BwAEOLgAAAAEBAcABDYoAAACA1F2hEgFbAABcAT4FPR7AAQ2Ti/oCAAIWwAENnS6SXo49gMABDa3ABUvgAD0ewAENtYv6AgACFsABDb8ulGyOP4DAAQ3VwAVL4AA9HsABDd2L+gIAAhbAAQ3nLpRtjkCAwAEN+MAFS+AAPTUAAAABAGCSWQEWwAEOAC6U3I5BIxzAAQ4MgQDABUxTQQEAASsAACscwAEODIEAwAVMU5QOAQABgMABDhPABUvgAJJbAVs9NQAAAAEAYJETARbAAQ4bLpJMjk4jHMABDiGBAMAFTJpBAQABKwAAKxzAAQ4hgQDABUyalA4BAAGAwAEOKMAFS+AAkRUBWwaOTC3AAQ4zwAEOM8ABD2cAAJQUAAAAAQPAAQ5EwAEPZwAAAAEBAcABDlEAAACA1GChTgAAWwE+BT0ewAEOWov+AwADFsABDmgukl6OPYDAAQ54wAVNBi4APR7AAQ6Gi/4DAAMWwAEOlC6UbI4/gMABDqrABU0GLgA9HsABDriL/gMAAxbAAQ7GLpRtjkCAwAEO18AFTQYuAD0XwAEO5S6U3BzAAQ70gMABDvLABU0GlHABAAEWwAEPAi6U3I5BAKFQjkFJwAEPEyEcwAEPHBbAAQ8XLpJMjk5BAQABKwDAAPXSPgI9F8ABDy0ukkwmwAEPLQEcwAEPORbAAQ80LpJMjk6UDgEAAYDAAQ9AwAVNBgCRFWCRE45RPTUAAAABAGCREwEWwAEPSi6STI5OIxzAAQ9QgQDABU36QQEAASsAACsXwAEPUIEAwAVN+pJRLowbAWCOOD8AAAVH1AAFSGAABUixAAVJEQAFSWQABUnWAAVLYwAFS7kABUzfAAVONgAAAAkCjlQtwAEPbMABD3HAARW/C5UAAAABYMAA9cUAAAgEjlYtwAEPccABD3EJJwBgwAD0eQAEjlgtwAEPccABD3EJKIvzAGDAAPZdAASOWS3AAQ9xwAEPcQYpAF3AAPUdAWCOVAE6AGCOVAUaAI5aGgCOWxoAjlwaAI5dGgCOXgSOWi3AAQ/EwAEPxAaSnQBgjlQBIACOYgIAApMnlQEABI5bLcABD8zAAQ/MBpKfAGCOVAEgAI5iAgAClCeVAgAEjlwtwAEP2MABD9gGkqEAYI5UASAAjmICAAKVJ5UDAASOXS3AAQ/hwAEP4QaSowBgjlQBIACOYgIAApYnlQQABI5eLcABFbHAARWxBpUFAGCOVAEgAI5iAgAClyeVBgABBY5iLcABD3HAAQ9xwAEVvwEAAAPAAQ9xwAEVvwAAAAICAsABD3EAAAQnYMAA9HkAwAEPcQAABChgwAD2XQAAYI5UAT8DCACOVoAAwAVPowgAjliBAMAFT7EJAADAAPXbAAAAAAEGjmAtwAEPccABD3HAARW/AAAjAAAAAQPAAQ9xwAEVvwAAAAAAAABgwAD2XQFKAAEPAC6OWAAABU/mAAVQGwAAAAECjmMtwAEWicABFp3AAR3sB5I2ARrAARaKoiMAAWCMFQAAAAEFjmoAAAAABAAAAwAAAAAAAAAAAGCOYwE/AQkBAIwqAAAAAAQGjmUtwAEXZMABF23AAReRAAKVBwAAAAEDwAEXesABF5EAAAABAQHAAReLAAAAlQhgoeoAAGCSWQAGjmYtwAEZcsABGYDAAR2kAACVCQAAAAEDwAEZmcABHaQAAAACAgLAARmnAAAAlJhgjM4AwAEZwwAAAJUIYKHqAABgkosBPgdJwAEbMRbAARtPFsABG0CAwAEbNcAFUNCSXozdgPzAAPT/PgFKwAEbYAEWwAEbcoDAARtnwAVQ0JSmjPw/TsABG4nAARuOAACCF2CSWQEcwAEbkC6VBwEAAYHAARuewAVQ3QCOZUPAARuqJcABG7aCwAEbscAFUS9gktM+AT2KwAEb1MAFUS8WwAEcARbAARv3JsABG+EAgsABG9zABVEvYJLTgM+S1ZUKkuZJwAEcEhzAARwbgsABHBbABVEvQQEAARbAARwkgcABHB7ABVDdlQuh9gCSXT4BSsABHDYBFsABHEiAwAEcPcAFUNCUp4z+P0nAARxeJcABHGeCwAEcYsAFUS9gkos+Ak7AARyFwAEckAAAlQxgkosBHMABHJiBwAEcksAFUN2VDQIAAhTAARyswAVRLwIBYJKLgMABHLLABVDQAKIZScABHMUhHMABHNSDwAEcycAFUfxBAQABKwCSmErAARzdAYPAARzkwAVR/D9JwAEc+yXAAR0EgsABHP/ABVEvYJKBPgFKwAEdGwEWwAEdLYDAAR0iwAVQ0JSnjP4/PRzAAR1JgcABHUPABVDdlQ4CAAIuJMABHYADgsABHVvABVEvJ5UPgMABHXXABVDQAKIKSsABHYcBFsABHZmAwAEdjsAFUNCUpoz8Bo5nLcABHanAAR2pwAEdxAAClA4AAAABA8ABHa/AAR3EAAAAAQEBwAEdwgAAAIDUXaAVAVsAAFsABo5oLcABHcjAAR3IwAEd6gAClRAAAAABA8ABHc/AAR3qAAAAAgICwAEd4wAAAIDUXaFWAltbAMABHeYAAACVEVsAAFsAAAAFUHAABVCpAAVS4QAFUxoABVNfAAAABAKOay3AAR5WwAEeXMABH9UDkjkAAAFgjmMAAAEEjm0twAEejMABHpMYIgBgwAD2XQABBY51LcABHpjAAR6YwAEetwAAAAPAAR6pwAEetwAAAAEBAcABHq8AAAQiYMAA9l0AAGCOawE/AggBjm2AAMAFU8wJAcABHpiOagAAAAAFBo5vLcABHrzAAR7FwAEe/wAAlQcAAAABA8ABHtLAAR7/AAAAAQEBwAEe4wAAAJUIYKHqAABgklkBSsABHu0BIMABHvOSigAAAAAGjnAtwAEfBMABHwTAAR9BAACUDgAAAAEDwAEfCsABH0EAAAABAQHAAR8dAAAAgNRdoBUBWwAAWwFKwAEfIwEcwAEfJYDAAR8jwAVUaZUSAQABLgCgGQaOcS3AAR9FwAEfRcABH44AAJUQAAAAAQPAAR9MwAEfjgAAAAICAsABH2AAAACA1F2hVgJbWwDAAR9jAAAAlRFbAABbAUrAAR9rARzAAR9tgMABH2vABVS/lRICAAIugcABH4rABVTPAKFaBo5yLcABH5PAAR+TwAEfrQAAlA8AAAABA8ABH6DAAR+tAAAAAQEBwAEfqQAAAIDUXaESAVsAAFwBPgAGjnMtwAEfscABH7HAAR/TAACUFAAAAAEDwAEfwsABH9MAAAABAQHAAR/PAAAAgNRgoU4AAFsBPgAAAAVT+AAFVEIABVSYAAVVAwAFVT4ABVV3AAAABQKOdi3AASAewAEgKcABIoADlRMBGsABIB+iIwABYI5jAAACBI54LcABIGDAASBoGJJLAGCSAgAEjnktwAEgfsABIIoYlRQBGsABIG2iJWCSWQABBY6BLcABIKjAASCowAEg1wAAAAPAASCzwAEg1wAAAAIBAsABILkAAASSS2CSAgDAASDJAAAElRRgklkBKwBgjnYBPwMIAY54gADABVYJCAGOeYEAwAVWFgkBwAEgqI5qAAAAAAUGjnstwAEg3MABIOXAASE4AACVBwAAAAEDwAEg8sABITgAAAABAQHAASEDAAAAlQhgoeoAAGCSWQE+AUrAASEQATUAAAABAGCSWQEWwAEhFy6VFI55IxzAASEkgQDABVaOQQEAASsAABbAASEwFsABIScukkuOeIIXkgiBAMAFVo4BYJJZBo58LcABIT3AASE9wAEhdAAAlA4AAAABA8ABIUPAASF0AAAAAQEBwAEhVgAAAIDUXaAVAVsAAFsBSsABIVwBHMABIV6AwAEhXMAFVviVFQEAAS4AoBoGjn0twAEheMABIXjAASG7AACVEAAAAAEDwAEhf8ABIbsAAAACAgLAASGTAAAAgNRdoVYCW1sAwAEhlgAAAJURWwAAWwFKwAEhngEcwAEhoIDAASGewAVXTpUVAgACLoHAASG3wAVXXgChWwaOfi3AASHAwAEhwMABIfoAAJQPAAAAAQPAASHNwAEh+gAAAAEBAcABIdYAAACA1F2hEgFbAABcAT4BPTUAAAABAGCSWQEWwAEh3y6VFI55IxzAASHtgQDABVfPQQEAASsAACscwAEh7YEAwAVXz5QOAQABgMABIfTABVe5AJJbAVsGjn8twAEh/8ABIf/AASJ+AACUFAAAAAEDwAEiEMABIn4AAAABAQHAASIdAAAAgNRgoU4AAFsBPgFJwAEiJiEcwAEiNxbAASIqLpUUjnlBAQABKwCSXT4BPRfAASJILpUUHMABIlmAwAEiV8AFWDuUcAEAARbAASJnLpUUjnkAoVCOeT8AAAVWTAAFVtEABVcnAAVXkgAFWBQABViYAAAABQKOgi3AASLhwAEi58ABJRUDlRYAAAFgjmMAAAIEjoQtwAEjHsABIyYYkksAYJICAASOhS3AASM1wAEjOhiAigBgjmMAAQWOjS3AASM/wAEjP8ABI4QAAAADwAEjSsABI4QAAAACAgLAASNQAAAEkktgkgIAwAEjXwAABICKYI5jAABgjoIBPgE9NQAAAAEAYI5jARbAASNsLoCKjoUjHMABI3OCAMAFWT9BAQABKwAAKxfAASNzggDABVk/klEujBsBYI6CAwgBjoSAAMAFWRwIAY6FgQDABVkpCQHAASM/jmoAAAAABQaOhy3AASOJwAEjksABI9QAAJUHAAAAAQPAASOfwAEj1AAAAAEBAcABI7AAAACVCGCh6gAAYJJZAUrAASO6ARzAASPAFsABI7ougIqOhZUHAQABgMABI87ABVnDAI5lBo6ILcABI9nAASPZwAEkEAAAlA4AAAABA8ABI9/AASQQAAAAAQEBwAEj8gAAAIDUXaAVAVsAAFsBSsABI/gBHMABI/qAwAEj+MAFWiKVFwEAAS4AoBsGjoktwAEkFMABJBTAASRXAACVEAAAAAEDwAEkG8ABJFcAAAACAgLAASQvAAAAgNRdoVYCW1sAwAEkMgAAAJURWwAAWwFKwAEkOgEcwAEkPIDAASQ6wAVaeJUXAgACLoHAASRTwAVaiAChXAaOii3AASRcwAEkXMABJI8AAJQPAAAAAQPAASRpwAEkjwAAAAEBAcABJHIAAACA1F2hEgFbAABcAT4BPTUAAAABAGCOYwEWwAEkey6Aio6FIxzAASSCgQDABVr5QQEAASsAACscwAEkgoEAwAVa+ZQOAQABgMABJInABVrjAI5nAVsGjostwAEklMABJJTAASUTAACUFAAAAAEDwAEkpcABJRMAAAABAQHAASSyAAAAgNRgoU4AAFsBPgFJwAEkuyEcwAEkxRbAASS/LoCKjoVBAQABKwDAAPXSPgI9F8ABJNYugIomwAEk1gEcwAEk5BbAASTeLoCKjoWUDgEAAYDAASTrwAVbZQCOZ2COY46FPTUAAAABAGCOYwEWwAEk9S6Aio6FIxzAAST8gQDABVvOQQEAASsAACsXwAEk/IEAwAVbzpJRLowbAWCOgj8AAAVZnAAFWfsABVpRAAVavAAFWz4ABVwKAAAABQKOji3AASWAwAEli8ABK8ADlRgBGsABJYGiIwABYI5jAAADBI6QLcABJbnAASXBGIQ8AGCOYwAEjpEtwAEl0cABJdUYgLABGsABJcaiI2CSMgAEjpItwAEl7cABJgUYlRkBGsABJduiJWCMNwACBY6eLcABJgrAASYKwAEmnQAAAAPAASYVwAEmnQAAAAMCA8ABJiEAAACEPGCOYwDAASYwAAAAgLBgkjIAwAEmPgAAAJUaYI0TASsAYI6OAT8BCgDAASZdjp8DAAOAwAEmacAFXLeBwAEmc8AFXMQewAEmeYwCAQABgsABJozABVzRAAAFjp8twAEmosABJqLAAScbAJRZAAPAASa5wAEnGwAAAAMDA8ABJsYAAASEPGCOYwDAASbVAAAEgLBgkjIAwAEm4AAABJUZYIw3AABgjo4BPgE9NQAAAAEAYI5jARbAAScALoQ8jpAjHMABJwqDAMAFXWtBAQABKwAAKxfAAScKgwDABV1rklEujBsBYI6OBAgBjpCAAMAFXTsIAY6RgQDABV1ICAGOkoIAwAVdVQkBwAEmoo5qAAAAAAcGjpQtwAEnIMABJyvAASdgAQCVGgAAAAEDwAEnO8ABJ2AAAAAAAAAAYI0TAUrAASc+ATUAAAABAGCMNwEWwAEnPi6VGY6SIxzAASdYgADABV4FQQEAASsAACsWwAEnWIAAwAVeBZQmjEABYI0TBo6WLcABJ2XAASduwAEnzAIAlRoAAAABA8ABJ33AASfMAAAAAQEBwAEnhQAAAJJbYI0TAABcAT4BPRfAASeTLpUZHsABJ66MAgEAAYDAASfBwAVeZgCOkgaOmC3AASfRwAEn2sABKlsAAJUHAAAAAQPAASfnwAEqWwAAAAEBAcABJ/gAAACVCGCh6gAAYJJZAT4FTsABKAnAASgZAACVGmCNEwEWwAEoIC6VGo6UScABKDUhHMABKEmBwAEoOcAFXtNBAQABKwDAAPXSPgNOwAEoYMABKGsAAJSYYIzOARbAASh9gcABKG3ABV7TkmmNG07AASiXwAEopAAAlRtgkosBHMABKK8WwAEopi6EPI6QlQkCAAKCwAEoycAFXw6AwAEo1cAFXr4AjmZKwAEo4wEcwAEpIh7AASj3ndoBAAGDwAEpCcAFXzEAkmYBAAEWwAEpQYHAASkxwAVe05StjSUAneE/TsABKZDAASmbAACVHGDAAPZdARbAASmiFsABKZ0ugLCOkYCwkjVJwAEprBzAASm7gsABKbDABV+lQQEAASeDiQDAAPZsPgFKwAEp0gEWwAEp34DAASnZwAVevpUdofhJwAEp8xzAASoCgsABKffABV+lQQEAASeFAwDAAPZsPgFKwAEqHAEWwAEqKYDAASojwAVevpUeof0/SsABKj0BIMABKkqSdgAAAAAGjpktwAEqYMABKmDAASqXAACUDgAAAAEDwAEqZsABKpcAAAABAQHAASp5AAAAgNRdoBUBWwAAWwFKwAEqfwEcwAEqgYDAASp/wAVgdZUfAQABLgCgHAaOmi3AASqbwAEqm8ABKt4AAJUQAAAAAQPAASqiwAEq3gAAAAICAsABKrYAAACA1F2hVgJbWwDAASq5AAAAlRFbAABbAUrAASrBARzAASrDgMABKsHABWDLlR8CAAIugcABKtrABWDbAKFdBo6bLcABKuPAASrjwAErLgAAlA8AAAABA8ABKvDAASsuAAAAAQEBwAEq+QAAAIDUXaESAVsAAFwBPgI9NQAAAAEAYI5jARbAASsCLoQ8jpAjHMABKwyBAMAFYUxBAQABKwAAKxzAASsMgQDABWFMlA4BAAGAwAErE8AFYTYAjmcBWz01AAAAAQBgkjIBFsABKxsugLCOkSMcwAErIYEAwAVhk0EBAAErAAArHMABKyGBAMAFYZOUDgEAAYDAASsowAVhNgCSPwFbBo6cLcABKzPAASszwAErvgAAlBQAAAABA8ABK0TAASu+AAAAAQEBwAErUQAAAIDUYKFOAABbAT4BScABK1ohHMABK2cWwAErXi6EPI6QQQEAASsAwAD10j4CPRfAASt4LoQ8JsABK3gBHMABK4wWwAErgy6EPI6QlA4BAAGAwAErk8AFYf8AjmdgjmOOkD01AAAAAQBgjmMBFsABK50uhDyOkCMcwAErp4EAwAViaEEBAAErAAArF8ABK6eBAMAFYmiSUS6MGwFgjo4/AAAFXdIABV4/AAVelwAFYE4ABWCkAAVhDwAFYdgABWKkAAAABwKOoC3AASxMwAEsUsABMQ4DlSAAAAFgjmMAAAQEjqItwAEsgMABLIgYhDwAYI5jAASOoy3AASyRwAEslRiAsABgkjIABI6kLcABLKTAASypGICKAGCOYwAEjqUtwAEsuMABLNAYlRkAYIw3AAIFjrEtwAEs1cABLNXAAS2UAAAAA8ABLODAAS2UAAAABAMEwAEs7AAAAIQ8YI5jAMABLPsAAACAsGCSMgDAAS0MAAAAgIpgjmMAwAEtIQAAAJUaYI0TASsAYI6gAT8BCgDAAS1AjrIEAASAwAEtWcAFY1iBwAEtY8AFY2WCwAEtacAFY3IewAEtcIwCAQABg8ABLYPABWN/AAAFjrItwAEtmcABLZnAAS44AJRZAAPAAS2wwAEuOAAAAAQEBMABLb0AAASEPGCOYwDAAS3MAAAEgLBgkjIAwAEt1wAABICKYI5jAMABLeMAAASVGWCMNwAAYI6gAT4CPTUAAAABAGCOYwEWwAEuAy6EPI6iIxzAAS4NhADABWQvQQEAASsAACsXwAEuDYQAwAVkL5JRLowbAWCOoD01AAAAAQBgjmMBFsABLiAugIqOpCMcwAEuJ4QAwAVkbEEBAAErAAArF8ABLieEAMAFZGySUS6MGwFgjqAFCAGOooAAwAVj8ggBjqOBAMAFY/8IAY6kggDABWQMCAGOpYMAwAVkGQkBwAEtmY5qAAAAAAcGjqctwAEuPcABLkjAAS59AQCVGgAAAAEDwAEuWMABLn0AAAAAAAAAYI0TAUrAAS5bATUAAAABAGCMNwEWwAEuWy6VGY6lIxzAAS51gADABWUQQQEAASsAACsWwAEudYAAwAVlEJQmjEABYI0TBo6pLcABLoLAAS6LwAEu6QIAlRoAAAABA8ABLprAAS7pAAAAAQEBwAEuogAAAJJbYI0TAABcAT4BPRfAAS6wLpUZHsABLsuMAgEAAYDAAS7ewAVlcQCOpQaOqy3AAS7uwAEu98ABLzkAAJUHAAAAAQPAAS8EwAEvOQAAAAEBAcABLxUAAACVCGCh6gAAYJJZAUrAAS8fARzAAS8lFsABLx8ugIqOpJUHAQABgMABLzPABWXJAI5lBo6sLcABLz7AAS8+wAEvdQAAlA4AAAABA8ABL0TAAS91AAAAAQEBwAEvVwAAAIDUXaAVAVsAAFsBSsABL10BHMABL1+AwAEvXcAFZiiVIQEAAS4AoB0Gjq0twAEvecABL3nAAS+8AACVEAAAAAEDwAEvgMABL7wAAAACAgLAAS+UAAAAgNRdoVYCW1sAwAEvlwAAAJURWwAAWwFKwAEvnwEcwAEvoYDAAS+fwAVmfpUhAgACLoHAAS+4wAVmjgChXgaOri3AAS/BwAEvwcABMCIAAJQPAAAAAQPAAS/OwAEwIgAAAAEBAcABL9cAAACA1F2hEgFbAABcAT4DPTUAAAABAGCOYwEWwAEv4C6EPI6iIxzAAS/qgQDABWb/QQEAASsAACscwAEv6oEAwAVm/5QOAQABgMABL/HABWbpAI5nAVs9NQAAAAEAYJIyARbAAS/5LoCwjqMjHMABL/+BAMAFZ0ZBAQABKwAAKxzAAS//gQDABWdGlA4BAAGAwAEwBsAFZukAkj8BWz01AAAAAQBgjmMBFsABMA4ugIqOpCMcwAEwFYEAwAVnjUEBAAErAAArHMABMBWBAMAFZ42UDgEAAYDAATAcwAVm6QCOZwFbBo6vLcABMCfAATAnwAExDAAAlBQAAAABA8ABMDjAATEMAAAAAQEBwAEwRQAAAIDUYKFOAABbAT4CScABME4hHMABMFsWwAEwUi6EPI6iQQEAASsAwAD10j4CPRfAATBsLoQ8JsABMGwBHMABMIAWwAEwdy6EPI6ilA4BAAGAwAEwh8AFZ/kAjmdgjmOOoj01AAAAAQBgjmMBFsABMJEuhDyOoiMcwAEwm4EAwAVoYkEBAAErAAArF8ABMJuBAMAFaGKSUS6MGwFgjqA/ScABMLQhHMABML4WwAEwuC6Aio6kQQEAASsAwAD10j4CPRfAATDPLoCKJsABMM8BHMABMN0WwAEw1y6Aio6klA4BAAGAwAEw5MAFZ/kAjmdgjmOOpD01AAAAAQBgjmMBFsABMO4ugIqOpCMcwAEw9YEAwAVo9UEBAAErAAArF8ABMPWBAMAFaPWSUS6MGwFgjqA/AAAFZN0ABWVKAAVlogAFZgEABWZXAAVmwgAFZ9IABWkxAAAABwKOsy3AATFRwAExV8ABNbIDlSIAAAFgjmMAAAIEjrUtwAExi8ABMZMYhDwAYI5jAASOti3AATGhwAExsBiUxgBgjDcAAgWOwi3AATG1wAExtcABMikAAAADwAExxsABMikAAAACAgLAATHSAAAAhDxgjmMAwAEx4wAAAIHTYI0TAABgjrMBPwEKAMABMfiOwwIAAoDAATIEwAVpvR7AATIOjAIBAAGBwAEyIcAFacoAAAWOwy3AATIuwAEyLsABMpIAlFkAA8ABMkvAATKSAAAAAgICwAEyUQAABIQ8YI5jAMABMmAAAASUxmCMNwAAYI6zAT4BPTUAAAABAGCOYwEWwAEydy6EPI61IxzAATKBggDABWpNQQEAASsAACsXwAEygYIAwAVqTZJRLowbAWCOswMIAY61gADABWoqCAGOtoEAwAVqNwkBwAEyLo5qAAAAAAcGjrgtwAEyl8ABMqLAATLFAQCB0wAAAAEDwAEyqcABMsUAAAAAAAAAYI0TAUrAATKsATUAAAABAGCMNwEWwAEyrC6Uxo62IxzAATK9gADABWrdQQEAASsAACsWwAEyvYAAwAVq3ZQmjEABYI0TBo66LcABMsrAATLTwAEzHwIAgdMAAAABA8ABMtnAATMfAAAAAQEBwAEy4QAAAIHTYI0TAABcAT4BPRfAATLvLpTGHsABMwGMAgEAAYDAATMUwAVrPgCOtgaOvC3AATMkwAEzJMABM3oAAJQPAAAAAQPAATMxwAEzegAAAAEBAcABMzoAAACA1F2hEgFbAABcAT4CPTUAAAABAGCOYwEWwAEzQy6EPI61IxzAATNNgQDABWusQQEAASsAACscwAEzTYEAwAVrrJQOAQABgMABM1TABWuWAI5nAVs9NQAAAAEAYI0TARbAATNcLoHTjrgjHMABM2SBAMAFa/NBAQABKwAAKxzAATNkgQDABWvzlKEBAAGAwAEzdMAFa5YAjSoBWwaOvS3AATN/wAEzf8ABNAoAAJQUAAAAAQPAATOQwAE0CgAAAAEBAcABM50AAACA1GChTgAAWwE+AUnAATOmIRzAATOzFsABM6ouhDyOtUEBAAErAMAA9dI+Aj0XwAEzxC6EPCbAATPEARzAATPYFsABM88uhDyOtZQOAQABgMABM9/ABWxfAI5nYI5jjrU9NQAAAAEAYI5jARbAATPpLoQ8jrUjHMABM/OBAMAFbMhBAQABKwAAKxfAATPzgQDABWzIklEujBsBYI6zPwaOvi3AATQPwAE0D8ABNEwAAJQOAAAAAQPAATQVwAE0TAAAAAEBAcABNCgAAACA1F2gFQFbAABbAUrAATQuARzAATQwgMABNC7ABW0rlSMBAAEuAKAeBo6/LcABNFDAATRQwAE0mQAAlRAAAAABA8ABNFfAATSZAAAAAgICwAE0awAAAIDUXaFWAltbAMABNG4AAACVEVsAAFsBSsABNHYBHMABNHiAwAE0dsAFbYGVIwIAAi6BwAE0lcAFbZEAoV8GjsAtwAE0nsABNKfAATWwAACVBwAAAAEDwAE0tMABNbAAAAABAQHAATTFAAAAlQhgoeoAAGCSWQE+A07AATTYwAE04wAAlJhgjM4BFsABNOwWwAE05S6B0464kmmNG07AATUEwAE1EQAAlRtgkosBHMABNRwWwAE1Ey6EPI61lQkCAAKBwAE1NsAFbgGAwAE1QsAFbewAjmZKwAE1TgEcwAE1ix7AATVindoBAAGCwAE1dMAFbiUAkmYBAAEWwAE1oRbAATWaLoHTjriUrY0lAJ3hAAAFaqoABWsXAAVrbwAFbDgABW0EAAVtWgAFbcUABW6YAAAABwKOxC3AATYPwAE2FcABOnMDlSQAAAFgjmMAAAMEjsYtwAE2ScABNlEYhDwAYI5jAASOxy3AATZfwAE2bhiUxgBgjDcABI7ILcABNn3AATaCGICKAGCOYwACBY7ULcABNofAATaHwAE3FAAAAAPAATaYwAE3FAAAAAMDA8ABNqQAAACEPGCOYwDAATa1AAAAgdNgjRMAwAE2yAAAAICKYI5jAABgjsQBPwEKAMABNtyO1QMAA4DAATbowAVvOB7AATbyjAIBAAGBwAE3BcAFb0UAgsABNw7ABW9SAAWO1S3AATcZwAE3GcABN6oAlFkAA8ABNzbAATeqAAAAAwMDwAE3QwAABIQ8YI5jAMABN1IAAASUxmCMNwDAATdoAAAEgIpgjmMAAGCOxAE+Aj01AAAAAQBgjmMBFsABN3UuhDyOxiMcwAE3f4MAwAVv60EBAAErAAArF8ABN3+DAMAFb+uSUS6MGwFgjsQ9NQAAAAEAYI5jARbAATeSLoCKjsgjHMABN5mDAMAFcChBAQABKwAAKxfAATeZgwDABXAoklEujBsBYI7EBAgBjsaAAMAFb7sIAY7HgQDABW/ICAGOyIIAwAVv1QkBwAE3GY5qAAAAAAcGjsotwAE3r8ABN7rAATfdAQCB0wAAAAEDwAE3wcABN90AAAAAAAAAYI0TAUrAATfEATUAAAABAGCMNwEWwAE3xC6Uxo7HIxzAATfVgADABXDCQQEAASsAACsWwAE31YAAwAVwwpQmjEABYI0TBo7MLcABN+LAATfrwAE4NwIAgdMAAAABA8ABN/HAATg3AAAAAQEBwAE3+QAAAIHTYI0TAABcAT4BPRfAATgHLpTGHsABOBmMAgEAAYDAATgswAVxIwCOxwaOzi3AATg8wAE4PMABOKgAAJQPAAAAAQPAAThJwAE4qAAAAAEBAcABOFIAAACA1F2hEgFbAABcAT4DPTUAAAABAGCOYwEWwAE4Wy6EPI7GIxzAAThlgQDABXGRQQEAASsAACscwAE4ZYEAwAVxkZQOAQABgMABOGzABXF7AI5nAVs9NQAAAAEAYI0TARbAATh0LoHTjsojHMABOHyBAMAFcdhBAQABKwAAKxzAATh8gQDABXHYlKEBAAGAwAE4jMAFcXsAjSoBWz01AAAAAQBgjmMBFsABOJQugIqOyCMcwAE4m4EAwAVyH0EBAAErAAArHMABOJuBAMAFch+UDgEAAYDAATiiwAVxewCOZwFbBo7PLcABOK3AATitwAE5kgAAlBQAAAABA8ABOL7AATmSAAAAAQEBwAE4ywAAAIDUYKFOAABbAT4CScABONQhHMABOOEWwAE42C6EPI7GQQEAASsAwAD10j4CPRfAATjyLoQ8JsABOPIBHMABOQYWwAE4/S6EPI7GlA4BAAGAwAE5DcAFcosAjmdgjmOOxj01AAAAAQBgjmMBFsABORcuhDyOxiMcwAE5IYEAwAVy9EEBAAErAAArF8ABOSGBAMAFcvSSUS6MGwFgjsQ/ScABOTohHMABOUQWwAE5Pi6Aio7IQQEAASsAwAD10j4CPRfAATlVLoCKJsABOVUBHMABOWMWwAE5XS6Aio7IlA4BAAGAwAE5asAFcosAjmdgjmOOyD01AAAAAQBgjmMBFsABOXQugIqOyCMcwAE5e4EAwAVzh0EBAAErAAArF8ABOXuBAMAFc4eSUS6MGwFgjsQ/Bo7QLcABOZfAATmXwAE51AAAlA4AAAABA8ABOZ3AATnUAAAAAQEBwAE5sAAAAIDUXaAVAVsAAFsBSsABObYBHMABObiAwAE5tsAFc+qVJQEAAS4AoB8GjtEtwAE52MABOdjAATohAACVEAAAAAEDwAE538ABOiEAAAACAgLAATnzAAAAgNRdoVYCW1sAwAE59gAAAJURWwAAWwFKwAE5/gEcwAE6AIDAATn+wAV0QJUlAgACLoHAATodwAV0UAChYAaO0i3AATomwAE6L8ABOnEAAJUHAAAAAQPAATo8wAE6cQAAAAEBAcABOk0AAACVCGCh6gAAYJJZAUrAATpXARzAATpdFsABOlcugIqOyJUHAQABgMABOmvABXSrAI5lAAAFcI8ABXD8AAVxVAAFcmQABXPDAAV0GQAFdIQABXTjAAAABwKO1i3AATq5wAE6v8ABQccDlSYAAAFgj0UAAAMEjtgtwAE7AsABOwoYhDwAYI5jAASO2S3AATsYwAE7JxiUxgBgjDcABI7aLcABOzXAATs+GFQAYI8tAAIFjuctwAE7Q8ABO0PAATvmAAAAA8ABO1nAATvmAAAAAwMDwAE7bAAAAIQ8YI5jAMABO4AAAACB02CNnwDAATuSAAAAVGCPLQAAYI7WAT8BCgDAATuqjugDAAOAwAE7tsAFdYIewAE7wIwCAQABgcABO9PABXWPAILAATvcwAV1nAAFjugtwAE768ABO+vAATyJAJRZAAPAATwNwAE8iQAAAAMDA8ABPBoAAASEPGCOYwDAATwpAAAElMZgjDcAwAE8PwAABFRgjy0AAGCO1gE+Aj01AAAAAQBgjmMBFsABPFAuhDyO2CMcwAE8WoMAwAV2M0EBAAErAAArF8ABPFqDAMAFdjOSUS6MGwFgjtY9NQAAAAEAYI8tARbAATxtLlSO2iMcwAE8eIMAwAV2cEEBAAErAAArF8ABPHiDAMAFdnCSUS6MGwFgjtYECAGO2IAAwAV2BAgBjtmBAMAFdhEIAY7aggDABXYeCQHAATvrj0wAAAAACAaO3C3AATyOwAE8nMABPMIBAIHTAAAAAQPAATyjwAE8wgAAAAAAAABgjZ8BSsABPKYBNQAAAAEAYIw3ARbAATymLpTGjtkjHMABPLeAAMAFdwlBAQABKwAAKxbAATy3gADABXcJlCyMQwFgjZ8Gjt8twAE8x8ABPNDAAT0fAgCB0wAAAAEDwAE81sABPR8AAAABAQHAATzhAAAAgdNgjZ8AAFwBPgE9F8ABPO8ulMYewAE9AYwCAQABgMABPRTABXdqAI7ZBo7dLcABPSTAAT0twAE9QQEAgLAAAAABA8ABPTLAAT1BAAAAAAAAAGCSMgFKwAE9NQE1AAAAAQBgjZ8BFsABPTUugdOO3CMcwAE9PYAAwAV3zkEBAAErAAArFsABPT2AAMAFd86AsI0XAWCSMgaO4S3AAT1GwAE9RsABPbYAAJQPAAAAAQPAAT1TwAE9tgAAAAEBAcABPVwAAACA1F2hEgFbAABcAT4DPTUAAAABAGCOYwEWwAE9ZS6EPI7YIxzAAT1vgQDABXhFQQEAASsAACscwAE9b4EAwAV4RZQOAQABgMABPXbABXgvAI5nAVs9NQAAAAEAYI2fARbAAT1+LoHTjtwjHMABPYaBAMAFeIxBAQABKwAAKxzAAT2GgQDABXiMlKEBAAGAwAE9lsAFeC8AjdQBWz01AAAAAQBgjy0BFsABPZ4uVI7aIxzAAT2pgQDABXjTQQEAASsAACscwAE9qYEAwAV405QOAQABgMABPbDABXgvAI81AVsGjuItwAE9u8ABPbvAAT6wAACUFAAAAAEDwAE9zMABPrAAAAABAQHAAT3ZAAAAgNRgoU4AAFsBPgJJwAE94iEcwAE97xbAAT3mLoQ8jthBAQABKwDAAPXSPgI9F8ABPgAuhDwmwAE+AAEcwAE+FBbAAT4LLoQ8jtiUDgEAAYDAAT4bwAV5PgCOZ2COY47YPTUAAAABAGCOYwEWwAE+JS6EPI7YIxzAAT4vgQDABXmnQQEAASsAACsXwAE+L4EAwAV5p5JRLowbAWCO1j9JwAE+SCEcwAE+VhbAAT5MLlSO2kEBAAErAMAA9dI+Aj0XwAE+Zy5UJsABPmcBHMABPn0WwAE+cy5UjtqUDgEAAYDAAT6EwAV5PgCPNWCPLY7aPTUAAAABAGCPLQEWwAE+ji5UjtojHMABPpmBAMAFejdBAQABKwAAKxfAAT6ZgQDABXo3klEujBsBYI7WPwaO4y3AAT61wAE+tcABPvcAAJQOAAAAAQPAAT67wAE+9wAAAAEBAcABPs4AAACA1F2gFQFbAABbAUrAAT7UARzAAT7WgMABPtTABXqZlScBAAEuAKAlBo7kLcABPvvAAT77wAE/TwAAlRAAAAABA8ABPwLAAT9PAAAAAgICwAE/FgAAAIDUXaFWAltbAMABPxkAAACVEVsAAFsBSsABPycBHMABPymAwAE/J8AFeu+VJwIAAi6BwAE/S8AFev8AoWYGjuUtwAE/VMABP13AAUHFAACVBwAAAAEDwAE/asABQcUAAAABAQHAAT97AAAAlQhgoeoAAGCSWQE+BUnAAT+IHMABP5KAwAE/jMAFe1qVKAEAARbAAT+xLoHTjtwAogs+AUrAAT/CARzAAT/PgMABP8nABXtalSkCAAIcwAE/9hbAAT/tLoQ8jtiVBwEAAYDAAUAEwAV7WgCOZRzAAUAuHMABQCoWwAFAIBbAAUAWLlSO2pUqjzBEAQABkwDAAPUslQcBAAGAwAFAPMAFe1oAjmUAogw/TsABQFXAAUBgAACUmGCMzgEWwAFAaRbAAUBiLoHTjtySaY0bTsABQIHAAUCOAACVG2CSiwEcwAFAmRbAAUCQLoQ8jtiVCQIAAoHAAUCzwAV8CoDAAUC/wAV7WgCOZk7AAUDPwAFA2gAAlNxgklkBHMABQRIewAFA6Z3aAQABgsABQPvABXwuAJJmAQABFsABQTEWwAFBKBbAAUEhLoHTjtyST42klNyOQQCd4UrAAUFCARzAAUGnHsABQVad3AIAAhbAAUF9FsABQXQWwAFBbS6B047ckk+NpJJejj0WwAFBlxbAAUGNLlSO2pUIjy8AkmYBAAGDwAFBtsAFfGgAneEAAAV21gAFd0MABXebAAV4CAAFeRcABXpyAAV6yAAFezMABX0KAAAACAKO6S3AAUI2wAFCPMABRoQDlSsAAAFgjmMAAAIEjustwAFCacABQm0YgLAAYJIyAASO7C3AAUJ8wAFClBiVGQBgjDcAAgWO+C3AAUKZwAFCmcABQxIAAAADwAFCqcABQxIAAAACAQLAAUKvAAAAgLBgkjIAwAFCvQAAAJUaYI0TASsAYI7pAT8BCgDAAULcjvkCAAKAwAFC6MAFfZoewAFC7owCAQABgcABQwHABX2nAAAFjvktwAFDF8ABQxfAAUNdAJRZAAPAAUMzwAFDXQAAAAICAsABQzkAAASAsGCSMgDAAUNEAAAElRlgjDcAAGCO6QE/AwgBjuuAAMAFfggIAY7sgQDABX4VCQHAAUMXjmoAAAAABwaO7i3AAUNiwAFDbcABQ6IBAJUaAAAAAQPAAUN9wAFDogAAAAAAAABgjRMBSsABQ4ABNQAAAAEAYIw3ARbAAUOALpUZjuwjHMABQ5qAAMAFfn1BAQABKwAAKxbAAUOagADABX59lCaMQAFgjRMGjvAtwAFDp8ABQ7DAAUQOAgCVGgAAAAEDwAFDv8ABRA4AAAABAQHAAUPHAAAAkltgjRMAAFwBPgE9F8ABQ9UulRkewAFD8IwCAQABgMABRAPABX7eAI7sBo7yLcABRBPAAUQcwAFFlwAAlQcAAAABA8ABRCnAAUWXAAAAAQEBwAFEOgAAAJUIYKHqAABgklkBPgROwAFETcABRFwAAJUsYIzOARbAAURuFsABRF4ulRqO7pJpjRtJwAFEghbAAUSkFsABRJWBwAFEhsAFf0uSXozdgPzAAPT/PgFKwAFEtQEWwAFEzBbAAUS8LpUaju6UrY0lP07AAUTmwAFE7wAAhDxgkosBHMABRPeAwAFE8cAFfzaVDQIAAhbAAUURgMABRQvABX82lG6h7YHAAUUbwAV/SwCiGUrAAUUwARzAAUVpHsABRUSd2gEAAYLAAUVWwAV/rQCSZgEAARbAAUWIFsABRXgulRqO7pStjSUAneEGjvMtwAFFnMABRZzAAUXYAACUDgAAAAEDwAFFosABRdgAAAABAQHAAUW1AAAAgNRdoBUBWwAAWwFKwAFFuwEcwAFFvYDAAUW7wAWAT5UtAQABLgCgIAaO9C3AAUXcwAFF3MABRiQAAJUQAAAAAQPAAUXjwAFGJAAAAAICAsABRfcAAACA1F2hVgJbWwDAAUX6AAAAlRFbAABbAUrAAUYCARzAAUYEgMABRgLABYCllS0CAAIugcABRiDABYC1AKFhBo71LcABRinAAUYpwAFGWwAAlA8AAAABA8ABRjbAAUZbAAAAAQEBwAFGPwAAAIDUXaESAVsAAFwBPgE9NQAAAAEAYJIyARbAAUZILoCwjusjHMABRk6BAMAFgSZBAQABKwAAKxzAAUZOgQDABYEmlA4BAAGAwAFGVcAFgRAAkj8BWwaO9i3AAUZgwAFGYMABRoIAAJQUAAAAAQPAAUZxwAFGggAAAAEBAcABRn4AAACA1GChTgAAWwE+AAAABX5KAAV+twAFfw8ABYAoAAWAfgAFgOkABYFrAAWBpAAAAAcCjvotwAFHFMABRxrAAUr5A5UuAAABYI5jAAADBI78LcABR0fAAUdLGICwAGCSMgAEjv0twAFHWsABR18YgIoAYI5jAASO/i3AAUduwAFHhhiVGQBgjDcAAgWPCi3AAUeLwAFHi8ABSBsAAAADwAFHm8ABSBsAAAADAwPAAUehAAAAgLBgkjIAwAFHsgAAAICKYI5jAMABR8AAAACVGmCNEwAAYI76AT8BCgDAAUfejwsDAAOAwAFH6sAFgkSBwAFH8MAFglEewAFH94wCAQABgsABSArABYJeAAAFjwstwAFIIMABSCDAAUiYAJRZAAPAAUg8wAFImAAAAAMDA8ABSEkAAASAsGCSMgDAAUhUAAAEgIpgjmMAwAFIYAAABJUZYIw3AABgjvoBPgE9NQAAAAEAYI5jARbAAUiALoCKjv0jHMABSIeDAMAFgvdBAQABKwAAKxfAAUiHgwDABYL3klEujBsBYI76BAgBjvyAAMAFgscIAY79gQDABYLUCAGO/oIAwAWC4QkBwAFIII5qAAAAAAcGjwAtwAFIncABSKjAAUjdAQCVGgAAAAEDwAFIuMABSN0AAAAAAAAAYI0TAUrAAUi7ATUAAAABAGCMNwEWwAFIuy6VGY7+IxzAAUjVgADABYORQQEAASsAACsWwAFI1YAAwAWDkZQmjEABYI0TBo8CLcABSOLAAUjrwAFJSQIAlRoAAAABA8ABSPrAAUlJAAAAAQEBwAFJAgAAAJJbYI0TAABcAT4BPRfAAUkQLpUZHsABSSuMAgEAAYDAAUk+wAWD8gCO/gaPBC3AAUlOwAFJV8ABSZkAAJUHAAAAAQPAAUlkwAFJmQAAAAEBAcABSXUAAACVCGCh6gAAYJJZAUrAAUl/ARzAAUmFFsABSX8ugIqO/ZUHAQABgMABSZPABYRKAI5lBo8FLcABSZ7AAUmewAFJ2gAAlA4AAAABA8ABSaTAAUnaAAAAAQEBwAFJtwAAAIDUXaAVAVsAAFsBSsABSb0BHMABSb+AwAFJvcAFhKmVLwEAAS4AoCEGjwYtwAFJ3sABSd7AAUomAACVEAAAAAEDwAFJ5cABSiYAAAACAgLAAUn5AAAAgNRdoVYCW1sAwAFJ/AAAAJURWwAAWwFKwAFKBAEcwAFKBoDAAUoEwAWE/5UvAgACLoHAAUoiwAWFDwChYgaPBy3AAUorwAFKK8ABSnMAAJQPAAAAAQPAAUo4wAFKcwAAAAEBAcABSkEAAACA1F2hEgFbAABcAT4CPTUAAAABAGCSMgEWwAFKSi6AsI78IxzAAUpQgQDABYWAQQEAASsAACscwAFKUIEAwAWFgJQOAQABgMABSlfABYVqAJI/AVs9NQAAAAEAYI5jARbAAUpfLoCKjv0jHMABSmaBAMAFhcdBAQABKwAAKxzAAUpmgQDABYXHlA4BAAGAwAFKbcAFhWoAjmcBWwaPCC3AAUp4wAFKeMABSvcAAJQUAAAAAQPAAUqJwAFK9wAAAAEBAcABSpYAAACA1GChTgAAWwE+AUnAAUqfIRzAAUqpFsABSqMugIqO/UEBAAErAMAA9dI+Aj0XwAFKui6AiibAAUq6ARzAAUrIFsABSsIugIqO/ZQOAQABgMABSs/ABYYzAI5nYI5jjv09NQAAAAEAYI5jARbAAUrZLoCKjv0jHMABSuCBAMAFhpxBAQABKwAAKxfAAUrggQDABYacklEujBsBYI76PwAABYNeAAWDywAFhCMABYSCAAWE2AAFhUMABYYMAAWG2AAAAAcCjwwtwAFLSMABS07AAU36A5I+AAABYI5jAAABBI8OLcABS7HAAUvAGJTGAGCMNwACBY8aLcABS8XAAUvFwAFMDAAAAAPAAUvOwAFMDAAAAAEBAcABS9YAAACB02CNEwAAYI8MAT8BCgDAAUvljxsBAAEewAFL8YwCAQABgMABTATABYdQAAAFjxstwAFMEcABTBHAAUw8AJRZAAPAAUwmwAFMPAAAAAEBAcABTCwAAASUxmCMNwAAYI8MAT8CCAGPDoAAwAWHpwkBwAFMEY5qAAAAAAcGjxAtwAFMQcABTEzAAUxvAQCB0wAAAAEDwAFMU8ABTG8AAAAAAAAAYI0TAUrAAUxWATUAAAABAGCMNwEWwAFMVi6Uxo8OIxzAAUxngADABYgFQQEAASsAACsWwAFMZ4AAwAWIBZQmjEABYI0TBo8SLcABTHTAAUx9wAFMyQIAgdMAAAABA8ABTIPAAUzJAAAAAQEBwAFMiwAAAIHTYI0TAABcAT4BPRfAAUyZLpTGHsABTKuMAgEAAYDAAUy+wAWIZgCPDgaPFC3AAUzOwAFM18ABTRAAAJUHAAAAAQPAAUzkwAFNEAAAAAEBAcABTPUAAACVCGCh6gAAYJJZAUrAAUz/ARbAAU0GFsABTP8ugdOPEJStjSUGjxUtwAFNFcABTRXAAU1KAACUDgAAAAEDwAFNG8ABTUoAAAABAQHAAU0uAAAAgNRdoBUBWwAAWwFKwAFNNAEcwAFNNoDAAU00wAWJEJUwAQABLgCgIgaPFi3AAU1OwAFNTsABTY8AAJUQAAAAAQPAAU1VwAFNjwAAAAICAsABTWkAAACA1F2hVgJbWwDAAU1sAAAAlRFbAABbAUrAAU10ARzAAU12gMABTXTABYlmlTACAAIugcABTYvABYl2AKFjBo8XLcABTZTAAU2UwAFN0QAAlA8AAAABA8ABTaHAAU3RAAAAAQEBwAFNqgAAAIDUXaESAVsAAFwBPgE9NQAAAAEAYI0TARbAAU2zLoHTjxAjHMABTbuBAMAFiedBAQABKwAAKxzAAU27gQDABYnnlKEBAAGAwAFNy8AFidEAjSoBWwaPGC3AAU3WwAFN1sABTfgAAJQUAAAAAQPAAU3nwAFN+AAAAAEBAcABTfQAAACA1GChTgAAWwE+AAAABYfSAAWIPwAFiJcABYjpAAWJPwAFiaoABYosAAWKZQAAAAcCjxwtwAFOW8ABTmHAAVHgA5UxAAABYI5jAAACBI8eLcABTr3AAU7MGJTGAGCMNwAEjx8twAFO28ABTuAYgIoAYI5jAAIFjystwAFO5cABTuXAAU9LAAAAA8ABTu7AAU9LAAAAAgICwAFO9gAAAIHTYI0TAMABTwkAAACAimCOYwAAYI8cAT8BCgDAAU8djywCAAIewAFPKYwCAQABgMABTzzABYrxAIHAAU9FwAWK/gAFjywtwAFPUMABT1DAAU+mAJRZAAPAAU9lwAFPpgAAAAICAsABT2sAAASUxmCMNwDAAU+BAAAEgIpgjmMAAGCPHAE+AT01AAAAAQBgjmMBFsABT44ugIqPHyMcwAFPlYIAwAWLgUEBAAErAAArF8ABT5WCAMAFi4GSUS6MGwFgjxwDCAGPHoAAwAWLXggBjx+BAMAFi2sJAcABT1COagAAAAAHBo8hLcABT6vAAU+2wAFP2QEAgdMAAAABA8ABT73AAU/ZAAAAAAAAAGCNEwFKwAFPwAE1AAAAAQBgjDcBFsABT8AulMaPHiMcwAFP0YAAwAWMEUEBAAErAAArFsABT9GAAMAFjBGUJoxAAWCNEwaPIy3AAU/ewAFP58ABUDMCAIHTAAAAAQPAAU/twAFQMwAAAAEBAcABT/UAAACB02CNEwAAXAE+AT0XwAFQAy6Uxh7AAVAVjAIBAAGAwAFQKMAFjHIAjx4GjyUtwAFQOMABUEHAAVCDAACVBwAAAAEDwAFQTsABUIMAAAABAQHAAVBfAAAAlQhgoeoAAGCSWQFKwAFQaQEcwAFQbxbAAVBpLoCKjx+VBwEAAYDAAVB9wAWMygCOZQaPJi3AAVCIwAFQiMABUL0AAJQOAAAAAQPAAVCOwAFQvQAAAAEBAcABUKEAAACA1F2gFQFbAABbAUrAAVCnARzAAVCpgMABUKfABY0plTIBAAEuAKAjBo8nLcABUMHAAVDBwAFRAgAAlRAAAAABA8ABUMjAAVECAAAAAgICwAFQ3AAAAIDUXaFWAltbAMABUN8AAACVEVsAAFsBSsABUOcBHMABUOmAwAFQ58AFjX+VMgIAAi6BwAFQ/sAFjY8AoWQGjygtwAFRB8ABUQfAAVFaAACUDwAAAAEDwAFRFMABUVoAAAABAQHAAVEdAAAAgNRdoRIBWwAAXAE+Aj01AAAAAQBgjRMBFsABUSYugdOPISMcwAFRLoEAwAWOAEEBAAErAAArHMABUS6BAMAFjgCUoQEAAYDAAVE+wAWN6gCNKgFbPTUAAAABAGCOYwEWwAFRRi6Aio8fIxzAAVFNgQDABY5HQQEAASsAACscwAFRTYEAwAWOR5QOAQABgMABUVTABY3qAI5nAVsGjyktwAFRX8ABUV/AAVHeAACUFAAAAAEDwAFRcMABUd4AAAABAQHAAVF9AAAAgNRgoU4AAFsBPgFJwAFRhiEcwAFRkBbAAVGKLoCKjx9BAQABKwDAAPXSPgI9F8ABUaEugIomwAFRoQEcwAFRrxbAAVGpLoCKjx+UDgEAAYDAAVG2wAWOswCOZ2COY48fPTUAAAABAGCOYwEWwAFRwC6Aio8fIxzAAVHHgQDABY8cQQEAASsAACsXwAFRx4EAwAWPHJJRLowbAWCPHD8AAAWL3gAFjEsABYyjAAWNAgAFjVgABY3DAAWOjAAFj1gAAAAHAo8tLcABUlXAAVJgwAFXUgOVMwEawAFSVqIjAAFgjBUAAAMEjy8twAFSncABUqIJlQgBGsABUoCiJV3AAPUdAWCSWQAEjzAtwAFSysABUtQJlSoBGsABUqeiJ13AAPUdAWCOYwAEjzEtwAFS7sABUvMYlP0AXcAA9R0BYI87AAIFjzktwAFS+MABUvjAAVP5AAAAA8ABUwHAAVP5AAAAAwEBwAFTBwAABJUqXcAA9R0BYI5jAALAAVMpAAAAlQhdwAD1HQFgklkBK8ABU0YAAACU/V3AAPUdAWCPOwErYI8tAT4CPR7AAVOyi/kCAAIWwAFTwi6VKo8wLgA9HsABU9mL+QIAAhbAAVPpLpT9jzEuAAQIAY8wgADABZAfCACPLzUAAAABAF3AAPUdAWCSWQGBwAFTY8AFkDMjHMABU2mDAMAFkJ9BAQABKwAAMcABU3ZgklkAgwDABZCfAV3AAPUdAWCSWQgAjzE1AAAAAQBdwAD1HQFgjzsBgsABU4/ABZBHIxzAAVOVgwDABZDoQQEAASsAADHAAVOpYI87AIMAwAWQ6AFdwAD1HQFgjzsJAcABUviMKgAAAAAFjzotwAFT/sABU/7AAVR2AJU0AAPAAVQNwAFUdgAAAAAAAABgjy0BPwQIAI8vMcABVCpgklkACACPMDHAAVRPYI5jAAgAjzExwAFUdGCPOwAJAcABU/6MKgAAAAAEBo8zLcABVHvAAVSDwAFWFAQBlTUAAAABA8ABVJbAAVYUAAAAAQEBwAFUpAAAAJJPYI44AABgjy0BPgFKwAFUtAEfwAFUv485AwABHMABVQ8cwAFU8BbAAVTbgMABVNLABZG9lGyOP4CfAQFgjnYBNMABVPQDwAFU9MABVQ0AAAABAQHAAVT1AAAAgMZgkgIAAGCOdgFKwAFU+wEfwAFU/46BAQABgcABVQvABZIZAADAAPTmgKEAAAAAwAD08QKU/RzAAVWXHMABVU4WwAFVMYDAAVUowAWRvZRtjkCAnwEBYI87ATTAAVVSA8ABVVLAAVWIAAAAAQEBwAFVUwAAAIDGYJICAABgjzsBSsABVVkBH8ABVV2PRAIAAhbAAVVvgcABVW3ABZKPgLCSBh/AAVV5joEBAAGBwAFVhcAFko8AAADAAPTmgKEAAAAAwAD08ZUIHMABVgccwAFV1RbAAVW5gMABVbDABZG9kl6OPYCfAQFgktMBNMABVdkDwAFV2cABVfgAAAABAQHAAVXaAAAAgMZgkuEAAGCS0wFKwAFV4AEfwAFV5JLgAQABgcABVfbABZMhAADAAPTmgKEAAAAAwAD08QaPNS3AAVYZwAFWGcABVkgAAJQOAAAAAQPAAVYfwAFWSAAAAAEBAcABViwAAACA1F2gdwFbAABbAUrAAVYyARzAAVY0gMABVjLABZODlTYBAAEuAKDUBo82LcABVk3AAVZNwAFWugAAlA8AAAABA8ABVlrAAVa6AAAAAQEBwAFWYwAAAIDUXaESAVsAAFwBPgM9HsABVmyL+gIAAhbAAVZ2LpUIjy+AwAFWfcAFk9kAPR7AAVaFi/oCAAIWwAFWjy6VKo8wgMABVpvABZPZAD0ewAFWo4v6AgACFsABVq0ulP2PMYDAAVa0wAWT2QAGjzctwAFWv8ABVr/AAVdQAACUFAAAAAEDwAFW0MABV1AAAAABAQHAAVbdAAAAgNRgoU4AAFsBPgM9HsABVuaL/AIAAhbAAVb4LpUIjy+AwAFW/8AFlHEAPR7AAVcHi/4DAAMWwAFXFS6VKo8wgMABVyHABZRxLgA9HsABVy+L/gMAAxbAAVc9LpT9jzGAwAFXRMAFlHEuAAAABZGWAAWTXAAFk7IABZRKAAWU4gAAAAQCjzstwAFXesABV4DAAVkGA5U3AAABYIwVAAACBI89LcABV6zAAVewGICwAGDAAPZdAASPPi3AAVe/wAFXxBiAigBgjmMAAQWPRC3AAVfJwAFXycABWA4AAAADwAFX2MABWA4AAAACAgLAAVfeAAAEgLBgwAD2XQDAAVfpAAAEgIpgjmMAAGCPOwE+AT01AAAAAQBgjmMBFsABV/YugIqPPiMcwAFX/YIAwAWViUEBAAErAAArF8ABV/2CAMAFlYmSUS6MGwFgjzsDCAGPPYAAwAWVZAgBjz6BAMAFlXMJAcABV8mMKgAAAAADBo9ALcABWBPAAVgTwAFYSAAAlA4AAAABA8ABWBnAAVhIAAAAAQEBwAFYJgAAAIDUXaB3AVsAAFsBSsABWCwBHMABWC6AwAFYLMAFlg2VOAEAAS4AoNUGj0EtwAFYTcABWE3AAViAAACUDwAAAAEDwAFYWsABWIAAAAABAQHAAVhjAAAAgNRdoRIBWwAAXAE+AT01AAAAAQBgjmMBFsABWGwugIqPPiMcwAFYc4EAwAWWeUEBAAErAAArHMABWHOBAMAFlnmUDgEAAYDAAVh6wAWWYwCOZwFbBo9CLcABWIXAAViFwAFZBAAAlBQAAAABA8ABWJbAAVkEAAAAAQEBwAFYowAAAIDUYKFOAABbAT4BScABWKwhHMABWLYWwAFYsC6Aio8+QQEAASsAwAD10j4CPRfAAVjHLoCKJsABWMcBHMABWNUWwAFYzy6Aio8+lA4BAAGAwAFY3MAFluUAjmdgjmOPPj01AAAAAQBgjmMBFsABWOYugIqPPiMcwAFY7YEAwAWXTkEBAAErAAArF8ABWO2BAMAFl06SUS6MGwFgjzs/AAAFleYABZY8AAWWvgAFl4oAAAADAo9FLcABWaDAAVm0wAFapAeVOQEawAFZoaIjAAFgjmMAAAABBY9MAAAAAAQAAAMAAAAAAAAAAABgj0UBPwEJAQCOagAAAAADBo9HLcABWeDAAVnuwAFZ9wECVAAAAAEDwAFZ98ABWfcAAAAAAAAAYI8tAAaPSi3AAVn7wAFZ/8ABWhkCAlQAAAABA8ABWgjAAVoZAAAAAQEBwAFaEwAAAICKYI8tAABcAAaPSC3AAVqVwAFansABWqIBAoCwAAAAAQPAAVqiwAFaogAAAAAAAABgkjIAAAAFl+cABZgSAAWYSAAFmHQAAAADAo9NLcABWsrAAVrVwAFldQOVOgEawAFay6IjAAFgj0UAAAQEj08twAFbEsABWxoYhDwAYI5jAASPUC3AAVsjwAFbJxiAsABgkjIABI9RLcABWzXAAVs+GFQAYI8tAASPUi3AAVtNwAFbZRiVGQBgjDcAAgWPXi3AAVtqwAFbasABXDUAAAADwAFbesABXDUAAAAEAwTAAVuGAAAAhDxgjmMAwAFblQAAAICwYJIyAMABW6UAAABUYI8tAMABW74AAACVGmCNEwErAGCPTQE/AQoAwAFb3Y9fBAAEgMABW/bABZkegcABXADABZkrgsABXAbABZk4HsABXBGMAgEAAYPAAVwkwAWZRAAABY9fLcABXDrAAVw6wAFc5gCUWQADwAFcVsABXOYAAAAEBATAAVxjAAAEhDxgjmMAwAFccgAABICwYJIyAMABXH0AAARUYI8tAMABXI0AAASVGWCMNwAAYI9NAT4CPTUAAAABAGCOYwEWwAFcrS6EPI9PIxzAAVy3hADABZnzQQEAASsAACsXwAFct4QAwAWZ85JRLowbAWCPTT01AAAAAQBgjy0BFsABXMouVI9RIxzAAVzVhADABZowQQEAASsAACsXwAFc1YQAwAWaMJJRLowbAWCPTQUIAY9PgADABZm3CAGPUIEAwAWZxAgBj1GCAMAFmdEIAY9SgwDABZndCQHAAVw6j0wAAAAABwaPVC3AAVzrwAFc9sABXSsBAJUaAAAAAQPAAV0GwAFdKwAAAAAAAABgjRMBSsABXQkBNQAAAAEAYIw3ARbAAV0JLpUZj1IjHMABXSOAAMAFmtNBAQABKwAAKxbAAV0jgADABZrTlCaMQAFgjRMGj1YtwAFdMMABXTnAAV2XAgCVGgAAAAEDwAFdSMABXZcAAAABAQHAAV1QAAAAgdNgjRMAAFwBPgE9F8ABXV4ulRkewAFdeYwCAQABgMABXYzABZs0AI9SBo9YLcABXZzAAV2lwAFjggAAlQcAAAABA8ABXbLAAWOCAAAAAQEBwAFdwwAAAJUIYKHqAABgklkBPgVOwAFd1MABXeQAAJUaYI0TARbAAV3rLpUaj1RJwAFeACEcwAFeFIHAAV4EwAWboUEBAAErAMAA9dI+BUnAAV4lIiXAAV45gcABXinABZuhYI2fABzAAV5ZgMABXlPABZuMlSgBAAEUwAFeeMAFm6EBAWCNnwCiCz4BSsABXpQBHMABXqGAwAFem8AFm4yVKQIAAhzAAV7VFsABXswuhDyPT5UHAQABgMABXuPABZuMAI5lHMABXw8cwAFfCxbAAV8BFsABXvcuVI9RlSqPMEQBAAGTAMAA9SyVBwEAAYDAAV8dwAWbjACOZQCiDD9OwAFfOsABX0UAAJSYYIzOARbAAV9XgcABX0fABZuhkmmNG07AAV9xwAFffgAAlRtgkosBHMABX4kWwAFfgC6EPI9PlQkCAAKCwAFfo8AFnI6AwAFfr8AFm4wAjmZOwAFfwcABX8wAAJStYJJZARzAAWAGHsABX9ud2gEAAYPAAV/twAWcsQCSZgEAARbAAWAlgcABYBXABZuhlK2NJQCd4UnAAWA4JcABYEeEwAFgPMAFnOtgkpw+AUrAAWBiARzAAWDKHsABYHad3AIAAhbAAWCcFMABYJHABZzrBAFgkpySXpKeFsABYLYWwAFgrC5Uj1GVCI8vAJJmAQABFsABYOQUwAFg2cAFnOsEAWCSnJTckqMAneE+AUrAAWEIASDAAWEVknYAAAAAP0nAAWE2HMABYUQWwAFhPxbAAWE6LoCwj1CAsJI1QQEAAScgAMAA9mw+Ak7AAWFbwAFhaAAAlRtgklkBHMABYXMWwAFhai6EPI9PlQcBAAGAwAFhgcAFm4wAjmVJwAFhjyXAAWGggsABYZPABZ3jYJKcPgJJwAFhuyEcwAFh4hbAAWHbFsABYcwUwAFhv8AFneMCAWCSnJJekp5awAD1TEEBAAEWwAFh9RbAAWHvFsABYeUuVI9RlQiPL1rAAPVMAMAA9Zw+AUrAAWIJASDAAWIWkooAAAAAP0rAAWI2ARzAAWKgHsABYkqd3AIAAhbAAWJyFMABYmXABZ3jAgFgkpySXpKeFsABYowWwAFigi5Uj1GVCI8vAJJmAQABFsABYrwUwAFir8AFneMCAWCSnJTckqMAneE/P0nAAWLbHMABYukWwAFi5BbAAWLfLoCwj1CAsJI1QQEAASdBAMAA9mw+AUrAAWNDARbAAWNQgMABY0rABZuMlTuh9z9KwAFjZAEgwAFjcZJ2AAAAAAaPWS3AAWOHwAFjh8ABY8MAAJQOAAAAAQPAAWONwAFjwwAAAAEBAcABY6AAAACA1F2gFQFbAABbAUrAAWOmARzAAWOogMABY6bABZ9rlTwBAAEuAKAkBo9aLcABY8fAAWPHwAFkDwAAlRAAAAABA8ABY87AAWQPAAAAAgICwAFj4gAAAIDUXaFWAltbAMABY+UAAACVEVsAAFsBSsABY+0BHMABY++AwAFj7cAFn8GVPAIAAi6BwAFkC8AFn9EAoWUGj1stwAFkFMABZBTAAWR5AACUDwAAAAEDwAFkIcABZHkAAAABAQHAAWQqAAAAgNRdoRIBWwAAXAE+Az01AAAAAQBgjmMBFsABZDMuhDyPTyMcwAFkPYEAwAWgQkEBAAErAAArHMABZD2BAMAFoEKUDgEAAYDAAWREwAWgLACOZwFbPTUAAAABAGCSMgEWwAFkTC6AsI9QIxzAAWRSgQDABaCJQQEAASsAACscwAFkUoEAwAWgiZQOAQABgMABZFnABaAsAJI/AVs9NQAAAAEAYI8tARbAAWRhLlSPUSMcwAFkbIEAwAWg0EEBAAErAAArHMABZGyBAMAFoNCUDgEAAYDAAWRzwAWgLACPNQFbBo9cLcABZH7AAWR+wAFlcwAAlBQAAAABA8ABZI/AAWVzAAAAAQEBwAFknAAAAIDUYKFOAABbAT4CScABZKUhHMABZLIWwAFkqS6EPI9PQQEAASsAwAD10j4CPRfAAWTDLoQ8JsABZMMBHMABZNcWwAFkzi6EPI9PlA4BAAGAwAFk3sAFoTsAjmdgjmOPTz01AAAAAQBgjmMBFsABZOguhDyPTyMcwAFk8oEAwAWhpEEBAAErAAArF8ABZPKBAMAFoaSSUS6MGwFgj00/ScABZQshHMABZRkWwAFlDy5Uj1FBAQABKwDAAPXSPgI9F8ABZSouVCbAAWUqARzAAWVAFsABZTYuVI9RlA4BAAGAwAFlR8AFoTsAjzVgjy2PUT01AAAAAQBgjy0BFsABZVEuVI9RIxzAAWVcgQDABaI0QQEAASsAACsXwAFlXIEAwAWiNJJRLowbAWCPTT8AAAWaoAAFmw0ABZtlAAWfRAAFn5oABaAFAAWhFAAFom8AAAAHAo9gLcABZezAAWXywAFr5QOVPQAAAWCPRQAAAwSPYi3AAWYuwAFmMhiAsABgkjIABI9jLcABZkDAAWZJGFQAYI8tAASPZC3AAWZYwAFmcBiVGQBgjDcAAgWPcC3AAWZ1wAFmdcABZxwAAAADwAFmisABZxwAAAADAgPAAWaQAAAAgLBgkjIAwAFmoAAAAFRgjy0AwAFmvAAAAJUaYI2fASsAYI9gAT8BCgDAAWbbj3EDAAOAwAFm58AFow6BwAFm7cAFoxsewAFm+IwCAQABgsABZwvABaMnAAAFj3EtwAFnIcABZyHAAWemAJRZAAPAAWdCwAFnpgAAAAMDA8ABZ08AAASAsGCSMgDAAWdaAAAEVGCPLQDAAWdqAAAElRlgjDcAAGCPYAE+AT01AAAAAQBgjy0BFsABZ4ouVI9jIxzAAWeVgwDABaPAQQEAASsAACsXwAFnlYMAwAWjwJJRLowbAWCPYAQIAY9igADABaORCAGPY4EAwAWjnggBj2SCAMAFo6oJAcABZyGPTAAAAAAHBo9mLcABZ6vAAWe5wAFn8QEAlRoAAAABA8ABZ8nAAWfxAAAAAAAAAGCNnwFKwAFnzAE1AAAAAQBgjDcBFsABZ8wulRmPZCMcwAFn5oAAwAWkWUEBAAErAAArFsABZ+aAAMAFpFmULIxDAWCNnwaPaC3AAWf2wAFn/8ABaGACAJUaAAAAAQPAAWgOwAFoYAAAAAEBAcABaBkAAACB02CNnwAAXAE+AT0XwAFoJy6VGR7AAWhCjAIBAAGAwAFoVcAFpLoAj2QGj2otwAFoZcABaG7AAWpnAACVBwAAAAEDwAFoe8ABamcAAAABAQHAAWiMAAAAlQhgoeoAAGCSWQE+BUnAAWiZHMABaK0WwAFonS6VGo9mQQEAASsAwAD10krAAWi2ASDAAWjDknYAAAAAP07AAWjcwAFo5wAAlJhgjM4BFsABaPkWwAFo6S6VGo9mkmmNG07AAWkRwAFpHgAAlRtgkosBHMABaSaAwAFpIMAFpRKVDQIAAhbAAWlAgMABaTrABaUSlG6h7YHAAWlKwAWlVwCiGU7AAWlfwAFpagAAlNxgklkBHMABaaIewAFpeZ3aAQABgsABaYvABaV7AJJmAQABFsABacoWwAFpwRbAAWmxLpUaj2aST42klNyOQQCd4UrAAWnbARzAAWpJHsABae+d3AIAAhbAAWofFsABahYWwAFqBi6VGo9mkk+NpJJejj0WwAFqORbAAWovLlSPY5UIjy8AkmYBAAGDwAFqWMAFpb0AneEGj2stwAFqbMABamzAAWqtAACUDgAAAAEDwAFqcsABaq0AAAABAQHAAWqFAAAAgNRdoBUBWwAAWwFKwAFqiwEcwAFqjYDAAWqLwAWmhpU+AQABLgCgJgaPbC3AAWqxwAFqscABav4AAJUQAAAAAQPAAWq4wAFq/gAAAAICAsABaswAAACA1F2hVgJbWwDAAWrPAAAAlRFbAABbAUrAAWrXARzAAWrZgMABatfABabclT4CAAIugcABavrABabsAKFnBo9tLcABawPAAWsDwAFrTwAAlA8AAAABA8ABaxDAAWtPAAAAAQEBwAFrGQAAAIDUXaESAVsAAFwBPgI9NQAAAAEAYJIyARbAAWsiLoCwj2IjHMABayiBAMAFp11BAQABKwAAKxzAAWsogQDABaddlA4BAAGAwAFrL8AFp0cAkj8BWz01AAAAAQBgjy0BFsABazcuVI9jIxzAAWtCgQDABaekQQEAASsAACscwAFrQoEAwAWnpJQOAQABgMABa0nABadHAI81AVsGj24twAFrVMABa1TAAWvjAACUFAAAAAEDwAFrZcABa+MAAAABAQHAAWtyAAAAgNRgoU4AAFsBPgFJwAFreyEcwAFriRbAAWt/LlSPY0EBAAErAMAA9dI+Aj0XwAFrmi5UJsABa5oBHMABa7AWwAFrpi5Uj2OUDgEAAYDAAWu3wAWoDwCPNWCPLY9jPTUAAAABAGCPLQEWwAFrwS5Uj2MjHMABa8yBAMAFqHVBAQABKwAAKxfAAWvMgQDABah1klEujBsBYI9gPwAABaQmAAWkkwAFpOsABaZfAAWmtQAFpyAABafoAAWosAAAAAcCj3ItwAFsm8ABbKHAAXGWA5U/AAABYI9FAAADBI90LcABbN3AAWzsGJTGAGCMNwAEj3UtwAFs+sABbQMYVABgjy0ABI92LcABbVTAAW1bGIPiAGDAAPKzAAIFj4MtwAFtgsABbYLAAW4uAAAAA8ABbZLAAW4uAAAAAwICwAFtnQAAAIHTYI2fAMABba8AAABUYI8tAAHAAW3AAAAAg+JgwADyswEqYI9yAT8BCgDAAW3ej4QDAAIewAFt6owCAQABgMABbf3ABalRAIHAAW4GwAWpXgGD4oLAAW4mwAWpawWPhC3AAW4zwAFuM8ABbrUAlFkAA8ABbk/AAW61AAAAAwICwAFuVQAABJTGYIw3AMABbmsAAARUYI8tAAHAAW6CAAAEg+JgwADyswEqYI9yAT4BPTUAAAABAGCPLQEWwAFumS5Uj3UjHMABbqSDAMAFqgpBAQABKwAAKxfAAW6kgwDABaoKklEujBsBYI9yBAgBj3SAAMAFqdgIAY91gQDABanlCAGPdoIAwAWp8gkBwAFuM49MAAAAAAgGj3gtwAFtYMABbWnAAW19AQCAsAAAAAEDwAFtbsABbX0AAAAAAAAAYJIyAUrAAW1xATUAAAABAGCNnwEWwAFtcS6B0495IxzAAW15gADABaqjQQEAASsAACsWwAFteYAAwAWqo4CwjRcBYJIyBo95LcABbrrAAW7IwAFu7gEAgdMAAAABA8ABbs/AAW7uAAAAAAAAAGCNnwFKwAFu0gE1AAAAAQBgjDcBFsABbtIulMaPdCMcwAFu44AAwAWrEEEBAAErAAArFsABbuOAAMAFqxCULIxDAWCNnwaPey3AAW7zwAFu/MABb0sCAIHTAAAAAQPAAW8CwAFvSwAAAAEBAcABbw0AAACB02CNnwAAXAE+AT0XwAFvGy6Uxh7AAW8tjAIBAAGAwAFvQMAFq3EAj3QGj30twAFvUMABb1nAAXAXAACVBwAAAAEDwAFvZsABcBcAAAABAQHAAW93AAAAlQhgoeoAAGCSWQE+AUrAAW+EARzAAW/pHsABb5id3AIAAhbAAW+/FsABb7YWwAFvry6B0495kk+NpJJejj0WwAFv2RbAAW/PLlSPdZUIjy8AkmYBAAEWwAFwCBbAAW//FsABb/gugdOPeZJPjaSU3I5BAJ3hBo9+LcABcBzAAXAcwAFwWAAAlA4AAAABA8ABcCLAAXBYAAAAAQEBwAFwNQAAAIDUXaAVAVsAAFsBSsABcDsBHMABcD2AwAFwO8AFrGyVQAEAAS4AoCcGj38twAFwXMABcFzAAXCkAACVEAAAAAEDwAFwY8ABcKQAAAACAgLAAXB3AAAAgNRdoVYCW1sAwAFwegAAAJURWwAAWwFKwAFwggEcwAFwhIDAAXCCwAWswpVAAgACLoHAAXCgwAWs0gChaAaPgC3AAXCpwAFwqcABcQAAAJQPAAAAAQPAAXC2wAFxAAAAAAEBAcABcL8AAACA1F2hEgFbAABcAT4CPTUAAAABAGCNnwEWwAFwyC6B0495IxzAAXDQgQDABa1DQQEAASsAACscwAFw0IEAwAWtQ5ShAQABgMABcODABa0tAI3UAVs9NQAAAAEAYI8tARbAAXDoLlSPdSMcwAFw84EAwAWtikEBAAErAAArHMABcPOBAMAFrYqUDgEAAYDAAXD6wAWtLQCPNQFbBo+BLcABcQXAAXEFwAFxlAAAlBQAAAABA8ABcRbAAXGUAAAAAQEBwAFxIwAAAIDUYKFOAABbAT4BScABcSwhHMABcToWwAFxMC5Uj3VBAQABKwDAAPXSPgI9F8ABcUsuVCbAAXFLARzAAXFhFsABcVcuVI91lA4BAAGAwAFxaMAFrfUAjzVgjy2PdT01AAAAAQBgjy0BFsABcXIuVI91IxzAAXF9gQDABa5bQQEAASsAACsXwAFxfYEAwAWuW5JRLowbAWCPcj8AAAWqcAAFqt0ABatKAAWrogAFrEUABaybAAWtBgAFrc4ABa6WAAAACAKPhS3AAXLBwAFyzMABeF8DlUEBGsABcsKiIwABYI9FAAADBI+HLcABcw3AAXMcGJTGAGCMNwAEj4gtwAFzM8ABczwYVAEawAFzIaIlYI8tAASPiS3AAXNFwAFzTBiD4gBgwADyswACBY+XLcABc3PAAXNzwAF0LAAAAAPAAXOIwAF0LAAAAAMCAsABc5UAAACB02CNXgDAAXOnAAAAVGCPLQABwAFzvgAAAIPiYMAA8rMBKmCPhQE/AQoAwAFz3I+YAwACHsABc+iMAgEAAYDAAXP7wAWvSQCBwAF0BMAFr1YBg+KCwAF0JMAFr2MFj5gtwAF0McABdDHAAXS4AJRZAAPAAXRSwAF0uAAAAAMCAsABdFgAAASUxmCMNwDAAXRuAAAEVGCPLQABwAF0hQAABIPiYMAA8rMBKmCPhQE+AT01AAAAAQBgjy0BFsABdJwuVI+IIxzAAXSngwDABbACQQEAASsAACsXwAF0p4MAwAWwApJRLowbAWCPhQQIAY+HgADABa/QCAGPiIEAwAWv3QgBj4mCAMAFr+oJAcABdDGPTAAAAAAJBo+LLcABc1HAAXNawAFzbgEAgLAAAAABA8ABc1/AAXNuAAAAAAAAAGCSMgFKwAFzYgE1AAAAAQBgjV4BFsABc2IugdOPjCMcwAFzaoAAwAWwm0EBAAErAAArFsABc2qAAMAFsJuAsI0XAWCSMgaPjC3AAXS9wAF0zcABdPUBAIHTAAAAAQPAAXTUwAF09QAAAAAAAABgjV4BSsABdNcBNQAAAAEAYIw3ARbAAXTXLpTGj4cjHMABdOiAAMAFsQhBAQABKwAAKxbAAXTogADABbEIlCqMQgFgjV4Gj48twAF0+sABdQPAAXVUAgCB0wAAAAEDwAF1CcABdVQAAAABAQHAAXUWAAAAgdNgjV4AAFwBPgE9F8ABdSQulMYewAF1NowCAQABgMABdUnABbFpAI+HBo+RLcABdVnAAXViwAF2GwAAlQcAAAABA8ABdW/AAXYbAAAAAQEBwAF1gAAAAJUIYKHqAABgklkBPgFKwAF1jQEjFsABdaQWwAF1nhbAAXWULlSPiJUIjy+A/MAA9P8WwAF1zBbAAXW9FsABdbYugdOPjJJpjRuUpoz8H8ABdeKSmgIAAhbAAXX3FsABdfAugdOPjJJpjRsWwAF2ERbAAXYHLlSPiJUIjy8AAWCSiwaPki3AAXYgwAF2IMABdmEAAJQOAAAAAQPAAXYmwAF2YQAAAAEBAcABdjkAAACA1F2gFQFbAABbAUrAAXY/ARzAAXZBgMABdj/ABbJwlUIBAAEuAKAoBo+TLcABdmXAAXZlwAF2sgAAlRAAAAABA8ABdmzAAXayAAAAAgICwAF2gAAAAIDUXaFWAltbAMABdoMAAACVEVsAAFsBSsABdosBHMABdo2AwAF2i8AFssaVQgIAAi6BwAF2rsAFstYAoWkGj5QtwAF2t8ABdrfAAXcOAACUDwAAAAEDwAF2xMABdw4AAAABAQHAAXbNAAAAgNRdoRIBWwAAXAE+Aj01AAAAAQBgjV4BFsABdtYugdOPjCMcwAF23oEAwAWzR0EBAAErAAArHMABdt6BAMAFs0eUoQEAAYDAAXbuwAWzMQCNdgFbPTUAAAABAGCPLQEWwAF29i5Uj4gjHMABdwGBAMAFs45BAQABKwAAKxzAAXcBgQDABbOOlA4BAAGAwAF3CMAFszEAjzUBWwaPlS3AAXcTwAF3E8ABd6IAAJQUAAAAAQPAAXckwAF3ogAAAAEBAcABdzEAAACA1GChTgAAWwE+AUnAAXc6IRzAAXdIFsABdz4uVI+IQQEAASsAwAD10j4CPRfAAXdZLlQmwAF3WQEcwAF3bxbAAXdlLlSPiJQOAQABgMABd3bABbP5AI81YI8tj4g9NQAAAAEAYI8tARbAAXeALlSPiCMcwAF3i4EAwAW0X0EBAAErAAArF8ABd4uBAMAFtF+SUS6MGwFgj4U/Bo+NLcABd6fAAXe5wAF4XQEAlUMAAAABA8ABd8nAAXhdAAAAAAAAAGCSiwE+AUrAAXfPASMWwAF35hbAAXfgFsABd9YuVI+IlQiPL4D8wAD0/xbAAXgOFsABd/8WwAF3+C6B04+MkmmNG5SmjPwfwAF4JJKaAgACFsABeDkWwAF4Mi6B04+MkmmNGxbAAXhTFsABeEkuVI+IlQiPLwABYJKLAAAFsGgABbDVAAWxQgAFsZoABbJJAAWynwAFswoABbPSAAW0mgAFtTwAAAAJAo+ZLcABeJzAAXiiwAF78AOVRAAAAWCOYwAAAgSPmy3AAXjSwAF43BiSRwBgjmMABI+cLcABePXAAXkCCZJEAF3AAPUdAWCSWQABBY+kLcABeQfAAXkHwAF5XQAAAAPAAXkUwAF5XQAAAAICAsABeRoAAASSR2COYwDAAXkrAAAEkkRdwAD1HQFgklkAAGCPmQE+AT01AAAAAQBgjmMBFsABeUAukkePmyMcwAF5TIIAwAW1/0EBAAErAAArF8ABeUyCAMAFtf+SUS6MGwFgj5kDCAGPm4AAwAW11ggBj5yBAMAFteMJAcABeQeOagAAAAAFBo+eLcABeWLAAXlrwAF6SAAAlQcAAAABA8ABeXjAAXpIAAAAAQEBwAF5iQAAAJUIYKHqAABgklkBPgJOwAF5o8ABeagAAIIXYJKcASbAAXmjARzAAXm1FsABeaoukkePm5UHAQABgMABecPABbaDAI5lYJKcSsABec8BHMABehoewAF5453cAgACFsABefKBwAF57cAFtpiSXpKeFsABegIukkSPnACSZgEAARbAAXougcABeinABbaYlUWSqQCd4QaPny3AAXpNwAF6TcABeoYAAJQOAAAAAQPAAXpTwAF6hgAAAAEBAcABemYAAACA1F2gFQFbAABbAUrAAXpsARzAAXpugMABemzABbdElUYBAAEuAKBFBo+gLcABeorAAXqKwAF6zwAAlRAAAAABA8ABepHAAXrPAAAAAgICwAF6pQAAAIDUXaFWAltbAMABeqgAAACVEVsAAFsBSsABerABHMABerKAwAF6sMAFt5qVRgIAAi6BwAF6y8AFt6oAoYYGj6EtwAF61MABetTAAXstAACUDwAAAAEDwAF64cABey0AAAABAQHAAXrqAAAAgNRdoRIBWwAAXAE+Aj01AAAAAQBgjmMBFsABevMukkePmyMcwAF6/4EAwAW4G0EBAAErAAArHMABev+BAMAFuBuUDgEAAYDAAXsGwAW4BQCOZwFbPR7AAXsOi/oCAAIWwAF7GC6SRI+cgMABeyfABbgFAAaPoi3AAXsywAF7MsABe+4AAJQUAAAAAQPAAXtDwAF77gAAAAEBAcABe1AAAACA1GChTgAAWwE+AknAAXtZIRzAAXtoFsABe10ukkePm0EBAAErAMAA9dI+Aj0XwAF7eS6SRybAAXt5ARzAAXuRFsABe4YukkePm5QOAQABgMABe5jABbimAI5nYI5jj5s9NQAAAAEAYI5jARbAAXuiLpJHj5sjHMABe66BAMAFuQ9BAQABKwAAKxfAAXuugQDABbkPklEujBsBYI+ZPz0ewAF7x4v8AgACFsABe9kukkSPnIDAAXvowAW4pgAAAAW2XAAFtx0ABbdzAAW33gAFuH8ABblqAAAABQKPpS3AAXyNwAF8k8ABfnYDlUcAAAFgjmMAAAEEj6ctwAF8ucABfMAYlUgAYI5jAAEFj68twAF8xcABfMXAAXz3AAAAA8ABfMjAAXz3AAAAAQEBwAF8zgAABJVIYI5jAABgj6UBPgE9NQAAAAEAYI5jARbAAXzdLpVIj6cj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wAbdpgkBwAKJV5MQAAAAAAcGk4otwAKJiMACiYjAAooZAACUDwAAAAEDwAKJlcACihkAAAABAQHAAomeAAAAgNRdoRIBWwAAXAE+Aj0cwAKJtBbAAomnLpVYk4WUDgEAAYDAAom7wAbeCACSW0bAAonDwAKJ7MACidcAAAGEH2CTBQAWwAKJ4y6VjZOGPgE9HMACif2BwAKJ9MAG3kaUoQEAAYDAAooNwAbeCACTCQaTiy3AAooewAKKHsACilMAAJQOAAAAAQPAAookwAKKUwAAAAEBAcACijUAAACA1F2g9gFbAABbAUrAAoo7ARzAAoo9gMACijvABt6mljkBAAEuAKEBBpOMLcACilfAAopXwAKKlgAAlKEAAAABA8ACimbAAoqWAAAAAQEBwAKKbwAAAIDUXaESAVsAAFsBSsACinUBHMACineAwAKKdcAG3vyWOgEAAS4AoTkGk40twAKKm8ACiqLAAoreAAAjAAAAAQPAAoqqwAKK3gAAAAAAAABgwAD2XQFKwAKKsAEkwAKK3gYWwAKKuC6FA8AA9dknXBbAAorGLpVYk4UnljMWwAKK1S6VjZOGJ4LaBpORLcACivrAAosCwAKLXQEAg4kAAAABA8ACiwvAAotdAAAAAAAAAGDAAPR5AT4BSsACixEBNQAAAAEAYMAA9HkBFsACixguljCL85OIIxzAAosogADABt/DQQEAASsAwAD1nBfAAosYLpYwi/McwAKLQhbAAos5FsACiywulViThYOJwAD12IODAQABHsACi0SMBwEAARbAAotRLpWNk4YAAMAA9JOTiIAAwAbfwwFgwAD0eQaTji3AAotiwAKLcMACjCADAEEAAAABA8ACi3LAAowgAAAAAQEBwAKLegAAAIObYMAA9cUAAGDAAPKzAUrAAouKASIewAKLisAA7l4CAAIugMACi5rABuBnAAEiIiXAAouxgMACi6vABuBnYJODABzAAovgFsACi9MUwAKLzcAG4GcAAWCTg5VYk4VBAQABFsACi+MulViThQCSXQAewAKL/YwJAgACFsACjA4UwAKMCMAG4GcAAWCTg5WNk4YWwAKMFy6VjZOGAAaTjy3AAowlwAKMLsACjHIAAJYXAAAAAQPAAow1wAKMcgAAAAEBAcACjEYAAACVCGCh6gAAYJJZAUrAAoxQARzAAoxWgMACjFDA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ABzAApKDFsACknQUwAKSbsAG6BEAAWCTlJVnk5ZBAQABFsACkoYulWeTlgDAAPXSAB7AApKkjAkCAAIWwAKStRTAApKvwAboEQABYJOUkkSTlxbAApLELpJEk5cAAB7AApLijAoCAAIWwAKS8hTAApLswAboEQABYJOUlWiTmBbAApL/LpVok5gABpOkLcACkxXAApMewAKTcQAAlhcAAAABA8ACkyXAApNxAAAAAQEBwAKTNgAAAJUIYKHqAABgklkBSsACk0YBH8ACk0qSmgIAAhbAApNYLpSUk5wWwAKTYy6SRJOXAAAABuKZAAbi3gAG5AQABuRaAAbksAAG5xIABufrAAbo5gAG6UQAAAAIApOnLcACk3bAApN8wAKYAwOWQAAAAWCTBQAAAgSTqS3AApPEwAKT0wmWQQBgk7YABJOqLcACk+zAApPxCZUIAF3AAPUdAWCSWQABBZO1LcACk/bAApP2wAKUNAAAAAPAApQSwAKUNAAAAAICAsAClBgAAASWQWCTtgDAApQuAAAElQhdwAD1HQFgklkAAGCTpwE/AwgBk6mAAMAG6doIAZOqgQDABunnCQHAApP2kxAAAAAABwaTrC3AApQ5wAKUOcAClJcAAJQPAAAAAQPAApRGwAKUlwAAAAEBAcAClE8AAACA1F2hEgFbAABcAT4CPRzAApRoFsAClFgulkGTqZShAQABgMAClHjABupJAJO/PR7AApSAi/oCAAIWwAKUii6VCJOqgMAClJHABupJAAaTrS3AApScwAKUnMAClOIAAJQOAAAAAQPAApSiwAKU4gAAAAEBAcAClLMAAACA1F2g9gFbAABbAUrAApS5ARzAApS7gMAClLnABurElkIBAAEuAKEDBpOuLcAClObAApTmwAKVPAAAlKEAAAABA8AClPXAApU8AAAAAQEBwAKU/gAAAIDUXaESAVsAAFsBSsAClQoBHMAClQyAwAKVCsAG6xqWQwEAAS4AoTsGk68twAKVQcAClUjAApWnAAAjAAAAAQPAApVQwAKVpwAAAAAAAABgwAD2XQE+AUrAApVZASTAApWjBhbAApVjLoUDwAD12SeDnBbAApWCFsAClXIulkGTqYQwk7onXBzAApWVFsAClY8ulQiTqlEBAAEng/IAwAD07yeWRAaTsy3AApWswAKVtMACle4BAIOJAAAAAQPA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ArKGwAKylwACll8AAAABA8ACspXAArKXAAAAAAAAAGDAAPR5AAaUDi3AArKcwAKyocACsrQAApZgAAAAAQPAArKqwAKytAAAAAEBAcACsq8AAACWYWDAAPR5AABcAAaUDy3AArK4wAKyvcACstgAApZiAAAAAQPAArLHwAKy2AAAAAEBAcACstIAAACD+l3AAPUdAWDAAPR5AABcAAaUEC3AArLcwAKy4cACsvcAApZjAAAAAQPAArLswAKy9wAAAAEBAcACsvEAAACAimDAAPR5AABcAAaUES3AArL7wAKzAMACsxYAApZkAAAAAQPAArMLwAKzFgAAAAEBAcACsxAAAACAimDAAPR5AABcAAaUEi3AArNBwAKzRsACs2QAApZlAAAAAQPAArNTwAKzZAAAAAEBAcACs14AAACD+l3AAPUdAWDAAPR5AABcAAaUEy3AArNpwAKzbsACs6gAApZmAAAAAQPAArOUwAKzqAAAAAEBAcACs6MAAACAsGChvgAAXAAGlBQtwAKzrMACs7HAArPRAAKWZwAAAAEDwAKzxcACs9EAAAABAQHAArPNAAAAg75gwAD2XQAAXAAGlBUtwAKz1cACs9rAArPuAAKWaAAAAAEDwAKz48ACs+4AAAABAQHAArPpAAAAg7JgkjIAAFwABpQWLcACs/LAArP3wAK0EwAClmkAAAABA8ACtATAArQTAAAAAQEBwAK0DgAAAIIXYJJZAABcAAaUFy3AArQXwAK0HMACtDAAApZqAAAAAQPAArQlwAK0MAAAAAEBAcACtCsAAACDsmCMDgAAXAAGlBgtwAK0NcACtDrAArSxAAKWawAAAAEDwAK0RMACtLEAAAADAAADwAK0YQAAAJJeXcAA9R0BYJLhASvAArR8AAAAlmxgwADyswEqwAK0mwAAAJZtYMAA8rMBKlwABpQZLcACtLXAArS6wAK1MQAClm4AAAABA8ACtMTAArUxAAAAAwAAA8ACtOEAAACSXl3AAPUdAWCS4QErwAK0/AAAAJZsYMAA8rMBKsACtRsAAACWbWDAAPKzASpcAAAABwRzAAcEoQAHBNoABwUZAAcFUgAHBYsABwXKAAcGAQAHBjoABwZxAAcGqAAHBt8ABwc9AAcHmwAAAA0ClBwtwAK1NsACtUXAArc3B5ZvAAABYMAA9cUAAAABBZQuAAAAAAQA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ArlzgsACuW7ABxX1lA4BAAGBwAK5esAHFdgAjBAGi/wtwAK5i8ACuZDAArriAAGWiwAAAAEDwAK5ocACuuIAAAACAgLAArmxAAAAloddwAD1HQFgklkAwAK5xAAAAJaJYKFOAABcAT4DTsACudXAArngAACWjGDAAPR5AZNFwAK55wHAArnwwAK58gAAW2DAAPR5AZMBHMACufmDwAK598AHFpNcAQABFsACugGAwAK5+8AHFlRawAD1TADAAPWmAYvAAroLwAcWkxzAAroJg8ACugvABxaTXQEAAZQAwAD1nj4CTsACuhjAArofAACBEGCSWQEcwAK6KYHAArohwAcWZ5RwAQABHMACujyAwAK6N8AHFlREAQABg8ACuj3ABxaTAMAA9SwAoVBJwAK6RiEcwAK6UYTAArpKwAcW9UEBAAErAJJdPgI9HMACumeAwAK6YsAHFlSAsgIAAoLAArpowAcWeoTAArp2wAcW9QDAAPUtPYrAArqGwAcWehzAArqEgsACuobABxZ6XQEAAZQAwAD1nj9JwAK6nhzAArqtgsACuqLABxZ6XAEAARbAArq1gMACuq/ABxZUWsAA9UwAwAD1pj4BPRfAArrJgMACusPABxZUWoLAArrSwAcWesAA9Uo/Bov9LcACuuXAArrqwAK8QwABlo0AAAABA8ACuwDAArxDAAAAAgICwAK7EQAAAJaHXcAA9R0BYJL2AMACuyQAAACWiWChTgAAXAE+A07AArs1wAK7QAAAloxgwAD0eQGTRcACu0cBwAK7UMACu1IAAFtgwAD0eQGTARzAArtZg8ACu1fABxhcXAEAARbAArthgMACu1vABxgdWsAA9UwAwAD1pgGLwAK7a8AHGFwcwAK7aYPAArtrwAcYXF0BAAGUAMAA9Z4+Ak7AArt4wAK7fwAAgRBgkvYBHMACu4mBwAK7gcAHGDCUqAEAARzAArudgMACu5jABxgdRAEAAYPAAruewAcYXADAAPUsAKFSScACu6chHMACu7KEwAK7q8AHGL5BAQABKwCTAT4CPRzAArvIgMACu8PABxgdgLICAAKCwAK7ycAHGEOEwAK718AHGL4AwAD1LT2KwAK758AHGEMcwAK75YLAArvnwAcYQ10BAAGUAMAA9Z4/ScACu/8cwAK8DoLAArwDwAcYQ1wBAAEWwAK8FoDAArwQwAcYHVrAAPVMAMAA9aY+AT0XwAK8KoDAArwkwAcYHVqCwAK8M8AHGEPAAPVKPwaL/i3AArxGwAK8S8ACvcEAAZaOAAAAAQPAArxYwAK9wQAAAAMDA8ACvGgAAACWh13AAPUdAWCMFQDAArx7AAAAlolgoU4AwAK8jQAAAJJRYIwVAABcAT4DTsACvJ3AAryoAACWjGDAAPR5AZNFwAK8rwHAAry4wAK8ugAAW2DAAPR5AZMBHMACvMGEwAK8v8AHGjJcAQABFsACvMmAwAK8w8AHGeZawAD1TADAAPWmAYzAArzTwAcaMhzAArzRhMACvNPABxoyXQEAAZQAwAD1nj4CTsACvODAArznAACBEFsBHMACvPIcwAK87oDAArzpwAcZ5kQBAAGEwAK878AHGjIAwAD1LJQOAQABgcACvPnABxn5AIweScACvQchHMACvRKFwAK9C8AHGpRBAQABKwDAAPXSPgM9HMACvSiAwAK9I8AHGeaAsgIAAoPAAr0pwAcaGSbAAr0oAYXAAr03wAcalGCMFQDAAPUtPRfAAr1MhcACvUXABxqUklGCwAK9VcAHGgYAPYvAAr1lwAcaGRzAAr1jg8ACvWXABxoZXQEAAZQAwAD1nj9JwAK9fRzAAr2Mg8ACvYHABxoZXAEAARbAAr2UgMACvY7ABxnmWsAA9UwAwAD1pj4BPRfAAr2ogMACvaLABxnmWoPAAr2xwAcaGcAA9Uo/BowALcACvcTAAr3TwAK+0gABlo+L8wAAAAEDwAK95sACvtIAAAABAQHAAr37AAAAkl5dwAD1HQFgkuEAAF3AAPUdAWCSWQE+AknAAr4PFsACviKAwAK+E8AHG+KA/MAA9P9KwAK+KwE6wAK+MmCSWQA/SsACvkgBHsACvlPAAPUlAwFgklkCFsACvoGAwAK+csAHG+JawAD1TDTAAr6JA8ACvonAAr64AAAAAQEBwAK+igAAAFtgwAD0eQAAYJLTAUrAAr6QAR/AAr6UkuABAAEcwAK+tIDAAr6mwAcb4kQBAAGBwAK+tcAHHGcAwAD1LAABkw8qBowCLcACyE/AAshZwALImQABlpAAAAABA8ACyGvAAsiZAAAAAQEBwALIcwAAAJJbYI0TAABgjDcBPgFKwALIfwE1AAAAAQBgjRMBgMACyIbABxzWIxzAAsiOgQDABxzxQQEAASsAACsWwALIjoEAwAcc8ZQcjC0BYIw3BowDLcACyQPAAskNwALJSwABlpEAAAABA8ACyR7AAslLAAAAAQEBwALJJQAAAJRCYIzOAABgjDcBPgFKwALJMQE1AAAAAQBgjM4BgMACyTjABx1RIxzAAslAgQDABx1sQQEAASsAACsWwALJQIEAwAcdbJQcjC0BYIw3BowELcACyf/AAsoNwALKzgABlpIAAAABA8ACyiXAAsrOAAAAAQEBwALKLQAAAJJbYI0TAABgob4BPgNJwALKORzAAspEgMACyj3ABx3MQQEAASsAwAD10krAAspNASs/ScACylwcwALKdRbAAspngMACymDABx3MlB2ML0EBAAErAMAA9dI+AT0wwALKhCTAAsqpAoDAAsqMwAcdzCeWkz9KwALKsQEWwALKv4DAAsq4wAcdzJQdjC8GjAUtwALLgMACy47AAsxNAAGWlAAAAAEDwALLpcACzE0AAAABAQHAAsusAAAAlEJgjM4AAGChvgE+A0nAAsu4HMACy8OAwALLvMAHHoVBAQABKwDAAPXSSsACy8wBKz9JwALL2xzAAsv0FsACy+aAwALL38AHHoWUHYwvQQEAASsAwAD10j4BPTDAAswDJMACzCgCgMACzAvABx6FJ5aTP0rAAswwARbAAsw+gMACzDfABx6FlB2MLwaMBi3AAs0EwALNEsACzdoAAZaVAAAAAQPAAs0rwALN2gAAAAEBAcACzTQAAACECWCMRwAAYKG+AT4DScACzUEcwALNTYDAAs1FwAcfPkEBAAErAMAA9dJKwALNVgErP0nAAs1lHMACzX8WwALNcYDAAs1pwAcfPpQdjC9BAQABKwDAAPXSPgE9MMACzY4kwALNtAKAwALNlsAHHz4nlpM/SsACzbwBFsACzcuAwALNw8AHHz6UHYwvBowHLcACzd3AAs3hwALORQABlpYAAAABA8ACze3AAs5FAAAAAQEBwALN8wAAAIMUXcAA9R0BWwAAYMAA9HkBPgFKwALN/QEcwALOCYDAAs4EwAcf94MSAgFgwAD0eQKTNMACzhEDwALOEcACzkIAAAACAgLAAs4WAAAAgIpgwAD0eQDAAs4kAAAAlpdgwAD1xQAAYMAA9HkBSsACzi0BHMACzjOBwALOLcAHIESDgwEAARbAAs46gsACzjXAByBTg4nAAPXYAMAA9JMAwAD07QaMCC3AAs5IwALOTMACzvYAAZaYAAAAAQPAAs5XwALO9gAAAAEBAcACzlwAAACAn13AAPVOAltbAABgwAD0eQE+BE7AAs5pwALObwAAgIpgwAD0eQGTRsACznYAwALOiAAAAYMwYMAA9cUAFsACzpGAwALOjcAHIMeB3MAA9XA9icACzpfAByDjHMACzp2BwALOl8AHIOODgwEAARbAAs6igsACzqDAByD8g4nAAPXYAMAA9JNGwALOrgDAAs7AAAABgzBgwAD1xQAWwALOyYDAAs7FwAcgxynAAPVxPYnAAs7RwAcg4xzAAs7XgcACztHAByDjg4MBAAEWwALO3ILAAs7awAchW4OJwAD12ADAAPSTSsACzugBgcACzu/AByDjBowJLcACzvnAAs7+wALPowABlpkAAAABA8ACzwjAAs+jAAAAAgICwALPDgAAAIFmXcAA9R0BWwDAAs8WAAAAgdpdwAD1HQFbAABgwADyswE+A0nAAs8dIRzAAs8qFsACzyOAwALPIcAHIelawAD1TEEBAAEWwALPL4HAAs8twAch+lrAAPVMAMAA9ZxKwALPNwEqP0XAAs9HAcACz1DAAs9SAABbYMAA9HkBkwEcwALPWYLAAs9XwAciXFwBAAEWwALPXYDAAs9bwAch6VrAAPVMAMAA9aYBisACz2XAByJcHMACz2aCwALPZcAHIlxdAQABlADAAPWePgFJwALPcCEcwALPeRzAAs91gMACz3TAByHpRAEAAYLAAs92wAciXADAAPUsQQEAARzAAs99gcACz3zAByH6RAEAAYLAAs9+wAciXADAAPUsAMAA9dJKwALPggEqP0rAAs+WASkGjAotwALPpsACz6vAAtBmAAGWmgAAAAEDwALPtMAC0GYAAAACAgLAAs+5AAAAgWZdwAD1TgJbWwDAAs/AAAAAgdpdwAD1TgJbWwAAYMAA8rMBPgNJwALPxyEcwALP1BbAAs/NgMACz8vAByNHWsAA9XJBAQABFsACz9mBwALP18AHI1lawAD1cgDAAPWcSsACz+EBKj9GwALP8cAC0BLAAtADAAABg5ZgwAD1xQAWwALQDIDAAtAKwAcjR4HcwAD1cD4BScAC0BgiIRzAAtAfgcAC0B3AByNZgd0BAAGCwALQK8AHI78AwAD1YQEhHMAC0DocwALQNIDAAtAzwAcj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AKs5wAewZIQ8jsYAlIs9HMAAq00ulyYBAAEWwACraIDAAKtjwAewZJTGjscAlKg9HMAAq34ulmoBAAEWwACrjYDAAKuIwAewZICKjsgAlIsGlM8uwACrnMAAq63AAKxBAACVMAEawACrncAA7ksAAAEDwACru8AArEEAAAABAQHAAKvGAAAAg7JgjwwAAFwBPgM9HMAAq9IulmABAAEawACr4KJOAJRzPRzAAKvwLpctAQABFsAArAGAwACr/MAHsUCUE4wcAJStPRzAAKwSLpcmAQABFsAArC2AwACsKMAHsUCUxo8OAJSoBpTQLsAArEbAAKxXwACtBgAAlTIBGsAArEfAAO5LAAABA8AArGXAAK0GAAAAAQEBwACscAAAAIOyYI8cAABcAT4EPRzAAKx8LpZgAQABGsAArIqiTwCUcz0cwACsmi6XLQEAARbAAKyrgMAArKbAB7HalBOMHACUrT0cwACsvC6XJgEAARbAAKzXgMAArNLAB7HalMaPHgCUqD0cwACs7S6WagEAARbAAKz8gMAArPfAB7HagIqPHwCUiwaU0S7AAK0LwACtHMAArjIAAJU8ARrAAK0MwADuSwAAAQPAAK0xwACuMgAAAAEBAcAArUMAAACDsmCPTQAAXAE+Bj0cwACtTy6WYAEAARrAAK1dolAAlHM9HMAArXQuly0BAAEWwACthYDAAK2AwAeylZQTjBwAlK09HMAArZYulmoBAAEWwACtpYDAAK2gwAeylYQ8j08AlIs9HMAArbQulmgBAAEWwACtw4DAAK2+wAeylYCwj1AAlK89HMAArc4ulvgBAAEWwACt5oDAAK3hwAeylVSPUQCUjT0cwACt9i6W3QEAARbAAK4VgMAArhDAB7KVlRmPUgCUpwaU0i7AAK43wACuSMAAr08AAJU+ARrAAK44wADuSwAAAQPAAK5iwACvTwAAAAEBAcAArnkAAACDsmCPYAAAXAE+BT0cwACuhS6WYAEAARrAAK6TolEAlHM9HMAArq8uly0BAAEWwACuwIDAAK67wAezkZQTjBwAlK09HMAArtEulmgBAAEWwACu4IDAAK7bwAezkYCwj2IAlK89HMAArusulvgBAAEWwACvA4DAAK7+wAezkVSPYwCUjT0cwACvEy6W3QEAARbAAK8ygMAAry3AB7ORlRmPZACUpwaU0y7AAK9U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FMAA7ksAAAEDwADSOcAA0x4AAAABAQHAANJLAAAAg7JgkU4AAFwBPgVJwADSVxzAANJpFsAA0lsulqWUQ5RKQQEAASsAwAD10j4BPRfAANJ6LpallEMfwADSjpVpAAAAAJRKPz0cwADSthbAANKoLpallEOUSpcVAQABgMAA0rzAB9P/AJVlPRzAANLHLpZgAQABGsAA0tWiewCUcz0cwADS7C6WagEAARbAANL7gMAA0vbAB9P/kkyRUACUiz0cwADTFBbAANMGLpallEOUSgYAAAAAlWYGlQEuwADTI8AA0zTAANP7AACVlwEawADTJMAA7ksAAAEDwADTS8AA0/sAAAABAQHAANNfAAAAg7JgkNkAAFwBPgQ9HMAA02sulmABAAEawADTeaKZAJRzPRzAANOSLpctAQABFsAA06OAwADTnsAH1O+UE4wcAJStPRzAANO0LpZpAQABFsAA08eAwADTwsAH1O+CF5DcAJR/PRzAANPSLpbVAQABFsAA0+6AwADT6cAH1O+EH5DbAJR8BpUCLsAA1ADAANQRwADUsAAAlbQBGsAA1AHAAO5LAAABA8AA1CTAANSwAAAAAQEBwADUNAAAAIOyYJFYAABcAT4DPRzAANRALpZgAQABGsAA1E6ifACUcz0cwADUYy6XLQEAARbAANR0gMAA1G/AB9WqlBOMHACUrT0cwADUhS6WZAEAARzAANSeFsAA1JEulqWUQ5RKRAEAARbAANSkgMAA1J/AB9WqgdORWgCVZwCUdQaVAy7AANS1wADUxsAA1XEAAJW2ARrAANS2wADuSwAAAQPAANTZwADVcQAAAAEBAcAA1OkAAACDsmCRYgAAXAE+BD0cwADU9S6WYAEAARrAANUDon0AlHM9HMAA1Rguly0BAAEWwADVKYDAANUkwAfWXJQTjBwAlK09HMAA1ToulmoBAAEWwADVSYDAANVEwAfWXJVPkWQAlIs9HMAA1VkulmoBAAEWwADVaIDAANVjwAfWXJJMkWUAlIsGlQQuwADVdsAA1YfAANYpAACVuAEawADVd8AA7ksAAAEDwADVl8AA1ikAAAABAQHAANWkAAAAg7JgkW0AAFwBPgQ9HMAA1bAulmABAAEawADVvqJ+AJRzPRzAANXQLpctAQABFsAA1eGAwADV3MAH1xeUE4wcAJStPRzAANXyLpZqAQABFsAA1gGAwADV/MAH1xeSTJFvAJSLPRzAANYMLpZqAQABFsAA1huAwADWFsAH1xeVT5FwAJSLBpUFLsAA1i7AANY/wADXsgAAlbwBGsAA1i/AAO5LAAABA8AA1lDAANeyAAAAAQEBwADWXgAAAIOyYJF4AABcAT4JPSMcwADWexbAANZqLpaklEOUSUEBAAErAMAA9dIXwADWai6WpJRDH8AA1oOVXwAAAACUSSsBYJVTPRzAANarFsAA1poulqSUQ5RJlxYAAAAAlVo9HMAA1rwulmABAAEawADWyqJ/AJRzPRzAANbdLpctAQABFsAA1u6AwADW6cAH19KUE4wcAJStPRzAANb/Lpc6AQABFsAA1yGAwADXHMAH19KVupF6AJUSPRzAANcxLpb6AQABFsAA10iAwADXQ8AH19KVT5F7AJSXPRzAANdYLpbkAQABFsAA12uAwADXZsAH19KVu5F8AJSCPRzAANd5LpZqAQABFsAA14iAwADXg8AH19KSTJF9AJSLPRzAANekFsAA15MulqSUQ5RJlxcAAAAAlVsGlQYuwADXt8AA18jAANldAACVwAEawADXuMAA7ksAAAEDwADX28AA2V0AAAABAQHAANfrAAAAg7JgkYUAAFwBPgk9IxzAANgIFsAA1/culqSUQ5RJQQEAASsAwAD10hfAANf3LpaklEMfwADYEJVfAAAAAJRJKwFglVM9HMAA2DgWwADYJy6WpJRDlEmXFgAAAACVWj0cwADYSS6WYAEAASMWwADYWIDAANhTwAfZPJW/kYsawADYZqKKGsAA2ICigAFgwAD0eQCUcz0cwADYlS6XLQEAARbAANimgMAA2KHAB9k8lBOMHACUrT0cwADYty6XLQEAARbAANjIgMAA2MPAB9k8lb6RhwCUrT0cwADY2S6XQAEAARbAANj3gMAA2PLAB9k8kkuRiACVET0cwADZBi6WagEAARbAANkVgMAA2RDAB9k8g5SRiQCUiz0cwADZJC6WagEAARbAANkzgMAA2S7AB9k8kkyRigCUiz0cwADZTxbAANk+LpaklEOUSZcXAAAAAJVbBpUHLsAA2WLAANlzwADa2AAAlcMBGsAA2WPAAO5LAAABA8AA2YfAANrYAAAAAQEBwADZmAAAAIOyYJGTAABcAT4HScAA2aQcwADZuxbAANmoLpamlEOUS0EBAAErAMAA9dI+AT0XwADZzC6WppRDH8AA2eWVcwAAAACUSz89HMAA2hcWwADaBC6WppRDlEuXFQEAAYDAANodwAfaxgCVbz0cwADaKC6WYAEAARrAANo2ooEAlHM9HMAA2kwuly0BAAEWwADaXYDAANpYwAfaxpQTjBwAlK09HMAA2m4ulmoBAAEWwADafYDAANp4wAfaxpJHkZUAlIs9HMAA2o4ulvABAAEWwADaq4DAANqmwAfaxpXCkZYAlIg9HMAA2soWwADaty6WppRDlEsGAQABgMAA2s/AB9rGAJVwBpUILsAA2t3AANruwADcRAAAlcgBGsAA2t7AAO5LAAABA8AA2v3AANxEAAAAAQEBwADbCQAAAIOyYJGeAABcAT4FTsAA20XAANtMAABaYMAA9HkBFsAA218WwADbU4DAANtOwAfcAZVUkaBawAD1TD0cwADbay6WZAEAAYHAANt3wAfcFACUdUXAANuEAcAA243AANuPAABbYMAA9HkBkwEcwADbloLAANuUwAfcX1wBAAGBwADbmMAH3BQAwAD1pgGKwADbosAH3F8cwADboILAANuiwAfcX10BAAGUAMAA9Z4+Aj0cwADbrS6XLQEAARzAANvPFsAA276AwADbucAH3AGVxZGhRAEAAYLAANvQwAfcXwDAAPUsAJStPRzAANvbLpZqAQABHMAA2/UWwADb6oDAANvlwAfcAZVUkaBEAQABgsAA2/bAB9xfAMAA9SwAlIs9HMAA3AUulmABAAEjFsAA3BSAwADcD8AH3AGVxpGjlJMBYMAA9HkAlHM9HMAA3CwulmoBAAEWwADcO4DAANw2wAfcAZJMkaIAlIsGlQkuwADcScAA3FrAAN0ZAACVygEawADcSsAA7ksAAAEDwADcdsAA3RkAAAABAQHAANyPAAAAg7JgkawAAFwBPgM9HMAA3JsulmABAAEawADcqaKCAJRzPRzAANzHLpctAQABFsAA3NiAwADc08AH3aGUE4wcAJStPRzAANzpLpZkAQABHMAA3QcWwADc9S6WppRDlEtEAQABFsAA3Q2AwADdCMAH3aGB05GuAJVxAJR1BpUKLsAA3R7AAN0vwADd/AAAlcwBGsAA3R/AAO5LAAABA8AA3T/AAN38AAAAAQEBwADdTAAAAIOyYJG2AABcAT4FPRzAAN1YLpZgAQABGsAA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lW01AAAAAQBgwAD0eQEXwAETYC6XjBzAARNrggDACAwVXQEAAZQAwAD1npVtggDACAwVAMAA9WMGlXAuwAETfMABE4HAARPGAAAGAAAAAQPAAROFwAETxgAAAAEBAcABE5YAAACDsmCRkwAAXAE+AT0XwAEToi6XjBzAAROuFsABE6Iul4yVbYFBAQABFsABE7wWwAETtoDAAROxwAgMhpXCkZZawAD1TADAAPWflW0GlXEuwAETy8ABE9jAARP6AwBEAAAAAQPAARPawAET+gAAAAEBAcABE+YAAACDsmCRngAAYMAA9HkBSsABE+8BHMABE/QWwAET7y4nlWxEAQABgMABE/XACAz+AMAA9WIAAAgLlAAIDGAACAzYAAgNOAAAAAMClXQuwAET/8ABFAXAARkAA5eRAAABXaFJAVsAAAUElXYuwAEURsABFFMJlqgAYJWMAASVdy7AARRtwAEUgwmVjQBdwAD1HQFgkwUBMcABFIFgkwUABJV4LsABFKDAARS7CZeSAF3AAPVOAmCTBWDAAPR5ATLAARS5YJMFYMAA9HkABJV5LsABFMPAARTRGJeTAGDAAPR5AZMElXsuwAEU6sABFPIJl5SUQwBglEYAAQWVgS7AART3wAEU98ABFSkAAAADwAEVBsABFSkAAAACAgLAARUMAAAElqhglYwAwAEVIAAABJeUYJRGAABglXQBPwMIAZV2gADACA4fCAGVe4EAwAgOLAkBwAEU96FNAAAAAAMGlX0uwAEVLsABFTLAARiKAACW0gAAAAEDwAEVNcABGIoAAAABAQHAARU/AAAAhB9gkwUAAGDAAPR5AT4ITsABFVnAARVjAAGXlWDAAPR5ARzAARVsFsABFWUul5KVeEQBAAGAwAEVbcAIDogAwAD1YknAARV8IRzAARWKgcABFYDACA6fQQEAASsAwAD1nErAARWTAYHAARWawAgOnz89HMABFh6AwAEWFcAIDoiUDwEAAS4AkwdJwAEWOCXAARZFgMABFjzACA6IYJM+PgE9HMABFm4WwAEWYC6WqJV2ltIBAAEWwAEWexTAARZywAgOiAABYJM+gIqTEwCVkEnAARaOJcABFpuAwAEWksAIDohgk0Y+AT0cwAEWxBbAARa2LpaolXaW0gEAARbAARbRFMABFsjACA6IAAFgk0aAsJNIAJWQScABFuMl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jmMARcAA1jsBwADWRMAA1kYAAFtgwAD0eQGTARzAANZNh8AA1kvACNgZXAEAAYXAANZPwAjXzQDAAPWmAY/AANZgwAjYGRzAANZhh8AA1mDACNgZXQEAAZQAwAD1nj4DTsAA1oHAANaKAAGVa2CMNwEcwADWtxzAANaaLpZ2AAAAAJYsl+oAAAAAodpOwADW4sAA1ugAAYCKYI5jARzAANbqLpflAAAAAJZLPRzAANcRhsAA1wbACNfugLICAAIUwADXEsAI2HEIABTAANcewAjYnQkAAMAA9WNOwADXO8AA10cAAJhtYMAA9HkBHMAA10kulnMAAAAAlgZOwADXc8AA13sAAJVpXcAA9R0BYJFBAR7AANeBwADuggEBYJFBAYfAANeXwAjY6wBFwADXrQHAANe2wADXuAAAW2DAAPR5AZMBHMAA178UwADXvcAI2UEJAFwBAAGHwADXwcAI2OsAwAD1pgEVwADXzsAI2UEJHMAA188UwADXzsAI2UEJAF0BAAGUAMAA9Z4+AT0cwADX5hTAANffwAjZDAgAgLICAAIUwADX58AI2UEJACbAANfmARzAANfsLphdAAAAAJZRYJFBAMAA9S1KwADYDwE1wADYGgAAAQBgj/sBH8AA2BqQCgQABIPAANg4wAjXiYTAANhIwAjXqIbAANhXwAjX7hTAANhkwAjZDAgAADUAAAABAFsBF8AA2HkUwADYd8AI2eEJAJQTgsAA2IbACNdojBwUAMAI2eEJAAHAANidGsAA2J2iXQA+Ak7AANi3wADYvgAAgxVgwAD0eQEcwADYwC6YPgAAAACWaErAANjWATXAANjhAAABAGCQCwEfwADY4ZAWAgACHMAA2O4ul+UAAAAAlkscwADZAC6WeQAAAACWXgA1AAAAAQBbARfAANkcg8AA2RrACNqClBOCwADZKcAI2luMHIMAwAjaggHAANlAGsAA2UCiXgA+A07AANlawADZYQAAgxVgwAD0eQEcwADZYy6YPgAAAACWaE7AANl9wADZgwAAhBJgwAD0eQEcwADZhS6WcQAAAACWBUrAANmZATXAANmkAAABAGCQFwEfwADZpJAoAgACHMAA2bEul+UAAAAAlkscwADZwy6WeQAAAACWXgA1AAAAAQBbARfAANnfhMAA2d3ACNs2lBOCwADZ7MAI2u6MHDUAAAABAFsBF8AA2f+EwADZ/cAI2zaEEoPAANoHwAjbD5AZhADACNs2AcAA2h0awADaHaJfAD4BSsAA2jQBH8AA2j+QOQEAARzAANpNLpZ3AAAAAJYhAAHAANp0GsAA2nSioAA+Ak7AANqXwADaowAAl0dgwAD0eQEcwADarYDAANqlwAjFz4MsAQABGsAA2rOinQDAAPSRSsAA2tMBH8AA2t6QQgEAARzAANr1gsAA2unACNvzgUEBAAEawADa+6KhAMAA9Z8AAcAA2yYawADbJqJwAD4BSsAA20IBH8AA202QQgEAARzAANtYLpZzAAAAAJYGAAHAANt0GsAA23SicQA+AUrAANuQAR/AANubkEIBAAEcwADbphzAANunLpZzAAAAAJYGgVYAAAAAwAD0nAABwADbwxrAANvDonIAPgFKwADb2gEfwADb5ZBCAQABHsAA2/TAAPSoAQABHMAA2/oulncAAAAAliEAAAHAANwiGsAA3CKiYAA+AUrAANw5AR/AANxEkEsBAAEcwADcUi6X1wAAAACWCAABwADccBrAANxwomEAPgFKwADchQEfwADckJBUAQABKQABwADcshrAANyyomIAPgFKwADcyAEfwADc05BUAQABKgABwADc9hrAANz2omMAPgFKwADdCwEfwADdFpBdAAAAAAHAAN00GsAA3TSiZAA+AUrAAN1LAR/AAN1WkGgBAAEcwADdZC6WdwAAAACWIQABwADdixrAAN2LomUAPgFKwADdoAEfwADdq5BzAQABHMAA3bculnkAAAAAll4AAcAA3dcawADd16JmAD4BSsAA3e8BH8AA3fqQfAAAAAABwADeGxrAAN4bomcAPgJOwADeMMAA3jcAAIMVYMAA9HkBHMAA3jkumD4AAAAAlmhKwADeTwE1wADeWgAAAQBgkH0BH8AA3lqQhQAAAAA1AAAAAQBbARfAAN5lg8AA3mPACN49lBOCwADecsAI3haMHIMAwAjePQHAAN6JGsAA3omiaAA+Ak7AAN6cwADeowAAgxVgwAD0eQEcwADepS6YPgAAAACWaErAAN67ATXAAN7GAAABAGCQhgEfwADexpCQAQABHMAA3swul+UAAAAAlksANQAAAAEAWwEXwADe34PAAN7dwAjetJQTgsAA3uzACN6NjByDAMAI3rQBwADfAxrAAN8DomkAPgNOwADfHMAA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AAEawABKE5cDAJckPgE9HMAASjgumOkBAAE1AAAAAQBgwAD2XQE1AAAAAQBgkjIBgMAASkLACWtJIxzAAEpIgQDACWvfQQEAASsAACsWwABKSIEAwAlr34CwkjUBYMAA9l0jHMAASk2BAMAJa9NBAQABKwAAJ5kXgQDACWvTAWDAAPZdAJckBpcxMMAASoTAAEqJwABLDwAAmOQAAAABA8AASpDAAEsPAAAAAQABwABKmQAAAIOwYMAA9l0BKwBcAT4EScAASqghHMAASrOAwABKrMAJbGZBAQABKwDAAPZsPgE9HMAASsQughEBAAGAwABKysAJbGYAlx4/PRzAAErdLoIRAQABJ4CjAJcePRfAAEruLoHiGsAASvaW/5cCPRfAAEsBLoTCk5b7BpcyMMAASxTAAEsZwABQGgAAmRgAAAABA8AASybAAFAaAAAABAEBwABLNAAAAJJPYI44AAPAAEtFAAAAgLBbASvAAEtdAAAAlMBdwAD1HQFgjesBK8AAS3AAAACZGWDAAPKzASlcAT4IScAAS4wlwABLlYHAAEuQwAltGWDAAPZdPgE9HMAAS6gumOkBAAEUwABLssAJbRkBAWDAAPZdAJckScAAS8QlwABLzYHAAEvIwAltGWCSMj4BPRzAAEveLpZoAQABFMAAS+jACW0ZAQFgkjIAlzA+AUAcwABMDoHAAEwJwAltGUEBAAErAMAA9dLAAEwJwABMFQA9HMAATCIumRoBAAEWwABMQoDAAEw5wAltC5Jejj0Alzg9HMAATFcumRsDAAMWwABMc4DAAExqwAltC5Rsjj8WwABMkoDAAEyJwAltC5RtjkAWwABMtIDAAEyrwAltC5THjj4Alzk9HMAATNEumRwCAAIWwABM84DAAEzqwAltC5TcjkE1AAAAAQBgluwBFsAATP8umMSW9yMcwABNCoQAwAluZEEBAAErAAArHMAATQqEAMAJbmSYwAIAAi6AwABNH8AJbQsAlu8BYMAA9l0AlzdJwABNLyIhHMAATUCCwABNM8AJbSVBAQABKwDAAPXSABbAAE1YgsAATUvACW0lg2jAAPUAPgY9HMAATWwumOQAAAAAlzE9F8AATX8ug6IcwABNfRbAAE1/LoOilvpdAQABlADAAPWelvo9HMAATZIumQYAAAAAlyY9HMAATawumQQBAAEngqYAlyM9HMAATcMuhPgCAWCN6wKCwABNzcAJbSUWwABN2y6WapcnAJc6PRfAAE3vLoOiHMAATe0WwABN7y6Dopb6gUEBAAGUAMAA9Z+W+j9JwABOBiEcwABOHxbAAE4TgMAATgrACW0LlPWOO0EBAAEawABOLo5aAMAA9dI+AT0cwABOPC6Y+wEAARzAAE5ILpkdAQABFsAATmeAwABOXsAJbQuU9Y47AJczAJciP0nAAE6AIiEcwABOnRbAAE6NgMAAToTACW0LlPaOPEEBAAEawABOrI5aAMAA9dIAIRzAAE7VFsAATsWAwABOvMAJbQuU9o48QQEAARbAAE7hgMAATtjACW0LlPWOOwDAAPXSPgM9HMAATvYumPsBAAEnmR4AlyI9HMAATxoumPsBAAEcwABPJi6ZHQEAARbAAE9FgMAATzzACW0LlPaOPACXMwCXIj0cwABPXi6Y+wEAASeZHwCXIj9JwABPeyEcwABPjRbAAE+IgMAAT3/ACW0LkkyOTkEBAAErAMAA9dI+AT0cwABPni6ZIAIAARbAAE+5gMAAT7DACW0LkkyOTgGZGYPAAE/OwAltOZc0ScAAT+mDwABP7cAJbTk+AT0cwABQBC6Y5AEAASeTgwCXMT8GlzMwwABQH8AAUCbAAFHPAACZHQAAAAEDwABQO8AAUc8AAAABAQHAAFBIAAAAmSFgjlQAAGDAAPZdAT4BR8AAUFaAwABQXsAJcTwGAcAAUH8awABQf45aAD4BSsAAUI0BJ5kiAcAAULMawABQs45bAD4BSsAAUMUBJ5kjAcAAUOwawABQ7I5cAD4BSsAAUPsBJ5kkAcAAUSIawABRIo5dAD4BSsAAUTUBJ5klAcAAUV0awABRXY5eAD4BSsAAUXMBJ5kmAAE+AUrAAFGdASTAAFHFAyeZJ4DAAFG9wAlxPCeAiwaXNDDAAFHUwABR2cAAVIcAAJkgAAAAAQPAAFHqwABUhwAAAAIBAcAAUfUAAACSTGCREwABwABSAQAAAJkZYMAA8rMBKVwBPgFJwABSHSIlwABSJoDAAFIhwAlyH2CRIwAWwABSQhbAAFI3FMAAUjLACXIfAAFgkSOVpZElgPzAAPT/PgQ9HMAAUlMumQIAAAAAlyA9HMAAUmgumQMBAAEnmSgAlyE9F8AAUoEugeIawABSiZcAlwJJwABSlYHAAFKZwAlyLT4BPRzAAFKyLpjkAAAAAJcxP0nAAFLQJcAAUtmAwABS1MAJch9gkSM+CT0cwABS6y6ZAgAAAACXID0cwABTAC6Y5AEAASeZKQCXMT0XwABTFi6DohzAAFMUFsAAUxYug6KW+l0BAAGUAMAA9Z6W+j0cwABTORbAAFMuFMAAUynACXIfAAFgkSOVpZElg7wBAAEWwABTQS6WapcnAMAA9Os9F8AAU1Uug6IcwABTUxbAAFNVLoOilvqBQQEAAZQAwAD1n5b6PRzAAFNoLpkGAAAAAJcmPRzAAFOCLpkDAQABJ5Y/AJchPRfAAFOaLoHiGsAAU6KXAJcCScAAU66BwABTssAJci0+AT0cwABTyy6Y5AAAAACXMT9JwABT6SIlwABT8oDAAFPtwAlyH2CRwgAhgcAAVAnACXItPgI9HMAAVCAumPsBAAEnmSoAlyI9HMAAVDkumSsBAAEWwABUThTAAFRJwAlyHwABYJHCkkeRxACXQz4BPRzAAFRuLpksAQABgMAAVHjACXIfAJc2Bpc1MMAAVIzAAFSMwABcHgAAmS0AAAABA8AAVJ3AAFweAAAAAwEBwABUqwAAAIOyYJKcAALAAFTSAAAAmS5dwAD1HQFgkgIBK8AAVQUAAACZL13AAPUdAWCSAgErWwE+DUnAAFUaHMAAVSQWwABVHi6B4pcCQQEAARrAAFUnlwAAwAD1nD4BPRzAAFU1LpkCAAAAAJcgPz0cwABVTi6ZGgEAARbAAFVqgMAAVWXACXRzkl6SngCXOD0cwABVfy6ZAwEAASeDnACXIU7AAFWkwABVrwAAlSpdwAD1HQFgklkBFsAAVbaAwABVscAJdHOUbJKgTsAAVdbAAFXqAACZMGDAAPKzASpJwABV9yEcwABWDYHAAFX7wAl0gUEBAAErAMAA9dI+AUbAAFYewABWVMAAVjcAAACZMWCSAgCBwABWQcAJdIE+AT2MwABWXsAJdUAihMAAVoDACXVAARzAAFaxFsAAVqoWwABWnoXAAFaXwAl1fJQ0kgVawAD1TICLAQABkwDAAPWoP0nAAFbIIRzAAFbZgsAAVszACXSVQQEAASsAwAD10j4BRsAAVurAAFcbwABXAwAAAJkxYJICAILAAFcNwAl0lT4BPYzAAFclwAl1QCKEwABXR8AJdUABHMAAV3gWwABXcRbAAFdlhcAAV17ACXX/lDSSBVrAAPVMgIsBAAGTAMAA9ag/ScAAV5AihMAAV5TACXVAACEcwABXvYHAAFerwAl0gUEBAAErAMAA9dI+AT0cwABXzi6E+AIBYJICAhzAAFfqgcAAV9jACXSBky4BAAEWwABX9IDAAFfvwAl0c5THkp8AwAD08xbAAFgXLpdAl5oAlzo+AT0cwABYRS6E+AIBYJJZAhzAAFhag8AAWE/ACXUXky4BAAEWwABYZIDAAFhfwAl0c5THkp8AwAD08xbAAFh9LpkPlysAlzpJwABYlBzAAFi0FsAAWJ2AwABYmMAJdHOUx5KfXAEAARbAAFjBg8AAWLbACXUXWsAA9UwAwAD1pj4EScAAWNEcwABY8RbAAFjagMAAWNXACXRzlMeSn4CLAQABkwDAAPWoPgE9HMAAWQAumQQAAAAAlyM/PRzAAFkcLpkDAQABJ5kJAJchScAAWTQihMAAWTjACXVAACEcwABZYYHAAFlPwAl0gUEBAAErAMAA9dI+AT0cwABZdC6E+AIBYJICAhzAAFmQgcAAWX7ACXSBkxcBAAEWwABZmoDAAFmVwAl0c5THkp8AwAD09RbAAFm/LpdAl5oAlzo+AT0cwABZ8S6E+AIBYJJZAhzAAFoGg8AAWfvACXUXkxcBAAEWwABaEIDAAFoLwAl0c5THkp8AwAD09RbAAFopLpkPlysAlzo9HMAAWkMumQMBAAEnmQoAlyE/ScAAWl8WwABaeBbAAFpogMAAWmPACXRzlG2SoYNowAD1AD4EScAAWowWwABaqhbAAFqVgMAAWpDACXRzlGySoINowAD1AD4BPRzAAFrALpkEAAAAAJcjPz0cwABa3C6ZAwEAASeZKQCXIUnAAFr0IoTAAFr4wAl1QAAhHMAAWxyCwABbD8AJdJVBAQABKwDAAPXSPgE9HMAAWy8uhPgCAWCSAgKCwABbOcAJdJUWwABbRy6XQJeaAJc6PgE9HMAAW3kuhPgCAWCSxgIWwABbiIDAAFuDwAl0c5RtkqEWwABbmS6WDpeqAJc6PRzAAFu4LpkDAQABJ5Y/AJchPz0cwABb1C6ZAwEAASeC2gCXIT0cwABb6i6Y+wEAASeZMgCXIj0cwABcAC6ZDwEAARbAAFwPgMAAXArACXRzlNySowCXKwaXNjDAAFwjwABcKMAAXVsAAJksAAAAAQPAAFwxwABdWwAAAAEBAcAAXDwAAACSTGCREwAAXAE+AUnAAFxIJcAAXFGAwABcTMAJecxgkSM+Bj0cwABcYy6Y5AEAASeWPgCXMT0XwABcei6DohzAAFx4FsAAXHoug6KW+l0BAAGUAMAA9Z6W+j0cwABcnRbAAFySFMAAXI3ACXnMAAFgkSOVpZElg7wBAAEWwABcpS6WapcnAMAA9Os9F8AAXLkug6IcwABctxbAAFy5LoOilvqBQQEAAZQAwAD1n5b6PRzAAFzMLpkGAAAAAJcmPRzAAFzmLpjkAQABJ5Y/AJcxPgQ9HMAAXQcumOQAAAAAlzE9F8AAXRoug6IcwABdGBbAAF0aLoOilvpdAQABlADAAPWelvo9HMAAXS0ulmoBAAGAwABdN8AJecwAlyc9F8AAXUYug6IcwABdRBbAAF1GLoOilvqBQQEAAZQAwAD1n5b6Bpc3MMAAXWDAAF1lwABd+QAAmRwAAAABA8AAXXTAAF35AAAAAgICwABdfgAAAIIXYJJZAMAAXYsAAACUX2DAAPZdAABcAT4DScAAXZ0cwABdpoDAAF2hwAl7PEEBAAErAJJdSsAAXa8APz0cwABduy6Y+wEAASeZMgCXIj0cwABd0S6ZDgIAAoDAAF3kwAl7PIHAAF3qwAl7SQCXKgaXODDAAF3+wABeA8AAXwUAAJkaAAAAAQPAAF4ZwABfBQAAAAEBAcAAXi4AAACSXl3AAPUdAWCS4QAAXAE+BUnAAF5EFsAAXleAwABeSMAJe9mA/MAA9P9KwABeYAA/PRzAAF5sLpkDAQABJ1wAlyE9HMAAXoIuhPgCAWCS4QKAwABejMAJe9kWwABenC6WapcnAJc6PRzAAF6sLpkDAQABJ4CLAJchPRfAAF7CLoHiGsAAXsqXAJcCBpc5MMAAXwrAAF8PwABh7AAAmRsAAAABA8AAXyHAAGHsAAAAAwMDwABfPAAAAJUqXcAA9R0BYJICAMAAX2gAAACU/V3AAPUdAWCSAgDAAF9zAAAAlMdgwAD0eQAAXAE+BT0cwABfkS6ZAwEAASeDnACXIT0cwABfpy6E+AIBYJICAhzAAF/FgMAAX7rACXySky4BAAGCwABfysAJfLgAwAD08xbAAF/jLpdAl5oAlzpJwABgAhzAAGAdgsAAYAbACXy4XAEAARbAAGAqgMAAYB/ACXySWsAA9UwAwAD1pj4EScAAYDocwABgVYLAAGA+wAl8uICLAQABkwDAAPWoPgE9HMAAYGQumQQAAAAAlyM/PRzAAGCALpkDAQABJ5kJAJchPRzAAGCYLoT4AgFgkgICHMAAYLiAwABgrcAJfJKTFwEAAYLAAGC9wAl8uADAAPT1FsAAYNYul0CXmgCXOj0cwABg9y6ZAwEAASeZCgCXIT9JwABhExbAAGEdgcAAYRfACXylg2jAAPUAPgRJwABhMRbAAGFAgMAAYTXACXySg2jAAPUAPgE9HMAAYVYumQQAAAAAlyM/PRzAAGFyLpkDAQABJ5kpAJchPRzAAGGKLoT4AgFgkgICgcAAYZTACXylFsAAYZsul0CXmgCXOj0cwABhvC6ZAwEAASeWPwCXIT89HMAAYdgumQMBAAEngtoAlyEGlzowwABh8cAAYfbAAGL+AACE+AAAAAEDwABiAsAAYv4AAAEAAIH9YMAA9cUBWwMCAsAAYg8AAACWh13AAPTbAV8AAADAAGIbAAAAmTNhAV8AAFwAAcAAYjgAAACBPmDAAPZdASeAm1wBPgJOwABiVMAAYloAAILSYMAA8rMBKUbAAGJmwABifsAAYm8AAACDsl8AAACAwABid8AJfrI+AknAAGKGg8AAYorACX7tPgE9i8AAYpvACX7tKj4BPRzAAGLBLpkEAQABgsAAYszACX7WAJcjPRzAAGLugcAAYubACX7FIAEAAYTAAGLvwAl/CQAABpc7MMAAYwPAAGMIwABjfAAAmRMAAAABA8AAYyjAAGN8AAAAAQEBwABjMwAAAJQcYIw3AABcAT4BPRzAAGNELpjpAQABHMAAY04umTQBAAGAwABjbcAJf5sAlzwAlyQGlzwwwABjgcAAY4jAAGTXAACZNAAAAAEDwABjpsAAZNcAAAABAQHAAGOxAAAAlBxgjDcAAGDAAPZdAT4EScAAY8IcwABj0IDAAGPGwAl/+kEBAAErAMAA9dJKwABj2QEnmNU/ScAAY/IhHMAAZAUWwABkAIDAAGP2wAl/+oOyjDpBAQABKwDAAPXSSsAAZA4BHMAAZBUulpEBAAEWwABkMYDAAGQnwAl/+pQkjD8Alw0/ScAAZD8hHMAAZFsWwABkTYDAAGRDwAl/+pQdjDlBAQABKwDAAPXSSsAAZGoBHMAAZHEumTUBAAEWwABkkoDAAGSIwAl/+pQdjDkAlz8/PTDAAGSmJ5k2Bpc9MMAAZNzAAGThwABlVwAAmPwAAAABA8AAZQLAAGVXAAAAAQEBwABlDQAAAJQcYIw3AABcAT4BPRzAAGUeLpjpAQABHMAAZSgumTcBAAGAwABlSMAJgQMAlz4AlyQGlz4wwABlXMAAZWPAAGa2AACZNwAAAAEDwABlgsAAZrYAAAABAQHAAGWNAAAAlBxgjDcAAGDAAPZdAT4EScAAZZ4cwABlrIDAAGWiwAmBYkEBAAErAMAA9dJKwABltQEnmNk/ScAAZc8hHMAAZeIWwABl3YDAAGXTwAmBYoOyjDpBAQABKwDAAPXSSsAAZesBHMAAZfIulpABAAEWwABmD4DAAGYFwAmBYpQmjEAAlxA/ScAAZh4hHMAAZjoWwABmLIDAAGYiwAmBYpQdjDlBAQABKwDAAPXSSsAAZkkBHMAAZlAumTUBAAEWwABmcYDAAGZnwAmBYpQdjDkAlz8/PTDAAGaFJ5k2Bpc/MMAAZrvAAGbCwABqkAAAmTUAAAABA8AAZtjAAGqQAAAAAQEBwABm5wAAAICwYKG+AABgwAD2XQE+DEnAAGbzFsAAZvyAwABm98AJgmuXA6HJPTDAAGcEJ5k4P0nAAGchHMAAZy8WwABnKoDAAGclwAmCa4CwocSBZwEAASeDNADAAPZvPTDAAGdAJ5k5P0/AAGdbwABnWwAAAZk6YQFgob5bAAPAAGdowABoQwAAAAEBAcAAZ3cAAACFRWChvgAAWwE+AknAAGeEIRzAAGecNQAAAAEAYIw3ARbAAGeMgsAAZ4jACYL5lByhxSMcwABnl4MAwAmDF0EBAAErAAArFsAAZ5eDAMAJgxeDsow6AWCMK0EBAAErAMAA9dJKwABnrQEcwABntC6Y0QEAARbAAGfWFsAAZ8yCwABnyMAJgvmUHKHFlCKMPgCXCz9KwABn6AEcwABn/hbAAGfvLpjDlvWYugIAAhbAAGgugsAAaCrACYL5lByhxYLAAGg5wAmC+QCW6E/AAGhKwABoSgAAAZk7YQFgob5bAAPAAGhVwABonwAAAAEBAcAAaGQAAACZPGChvgAAWwFKwABodAEcwABolRzAAGiOHMAAaIGBwABodMAJgtogAQABFsAAaIaDwABogsAJg++SUaHIAABdAQABJ5XtAABdAQABFsAAaJuDwABol8AJg++AsKHEAABJwABophbAAGi2FsAAaK+AwABoqsAJgmuSUaHIlwOhyUrAAGi+ASbAAGi+ARzAAGjSgcAAaMXACYLaIAEAAYDAAGjTwAmCawAAYMAA9l0/ScAAaN4WwABo9RbAAGjuFsAAaOeAwABo4sAJgmuSUaHIklGhyJcDoclKwABo/QEmwABo/QEcwABpD4LAAGkEwAmD0CABAAGAwABpEMAJgmsAAGDAAPZdP07AAGkqwABpMQAAmT1gob4BFsAAaTiAwABpM8AJgmuSUaHIQ8AAaUQhHMAAaVgWwABpU4PAAGlMwAmE/oCwocSBZwEAASeDNADAAPZvPYvAAGlpwAmE/hbAAGl5g8AAaXLACYT+klGhyE7AAGmNwABplAAAklFgwAD2XQEnAEnAAGmeFsAAabcWwABpsBbAAGmpg8AAaaLACYT+klGhyJJRociXA6HJPgE9jMAAacfACYVnJsAAaccBHMAAad2BwABp0MAJgtogAQABFsAAaeWDwABp3sAJhP6SUaHIAABgwAD2XT4BPYzAAGoBwAmFZybAAGoBARzAAGoVgsAAagrACYPQIAEAARbAAGodg8AAahbACYT+klGhyAAAYMAA9l1JwABqMRzAAGo/FsAAajqAwABqNcAJgmuAsKHEQQEAAScAAMAA9mxKwABqRgEkwABqaAOEwABqT8AJhWcnle0awABqWJcDP0rAAGpuASTAAGqMA4TAAGp3wAmFZyeV7RbAAGqGgMAAaoHACYJrgLChxAaXQDDAAGqVwABqmsAAavoAAJkUAAAAAQPAAGqvwABq+gAAAAEBAcAAargAAACWCmCMqQAAXAE+AT0cwABqyy6Y6QEAARzAAGrVLpjWAQABgMAAaunACYa2AJcOAJckBpdBMMAAav/AAGsEwABsEQAAmT4AAAABA8AAaxrAAGwRAAAAAQEBwABrLwAAAJJLYJICAABcAT4ETsAAa0XAAGtPAAGZCGDAAPKzARzAAGtRLpjNAQABgMAAa2HACYcVAJcHScAAa3CBwABrdMAJhyg+AT0cwABrhy6YzgEAAYDAAGuWwAmHFQCXCD89HMAAa6sumOkBAAEcwABrtS6Y2wEAAYDAAGvKwAmHFQCXEgCXJEnAAGvagcAAa97ACYcoPgE9HMAAa/EumM8BAAGAwABr/sAJhxUAlwk/BpdCMMAAbBbAAGwbwABsfwAAmT8AAAABA8AAbDbAAGx/AAAAAQEBwABsRQAAAIOyYJLhAABcAT4BPRzAAGxRLpjpAQABHMAAbFsumN4BAAGAwABsdcAJh/AAlxQAlyQGl0MwwABshMAAbInAAG6UAACZKwAAAAEDwABsmMAAbpQAAAACAQLAAGykAAAAg7JgjmMAwABsrwAAAJlAYMAA9HkBKwBcAT4ITsAAbM/AAGzZAAGZCGDAAPKzARzAAGzbLpjNAQABgMAAbOvACYhPAJcHScAAbPaCwABs+sAJiHI+AT0cwABtDS6YzgEAAYDAAG0cwAmITwCXCD9JwABtLRbAAG0xLoQOlv09HMAAbT4umOkBAAEkwABtXgMnmQkWwABtUYDAAG1MwAmIT5QTjBwnmQoAlyQ/TsAAbWrAAG16AACZQWDAAPKzASpJwABthyIhHMAAbZ2BwABti8AJiFxBAQABKwDAAPWcABzAAG28HMAAbagumQABAAGAwABttsAJiE8Alx1cAQABgcAAbb7ACYhcAMAA9aY+Aj2LwABt2cAJiQIpPRzAAG33LpkDAQABJ4OcAJchPz0cwABuEy6WagEAAYDAAG4dwAmITwCXJ0nAAG4og8AAbizACYkCPgE9HMAAbkUumQMBAAEngtoAlyE/ScAAbmGCwABuZcAJiHI+AT0cwABueC6YzwEAAYDAAG6FwAmITwCXCT8Gl0QwwABumcAAbp7AAG+XAACXOwAAAAEDwABurcAAb5cAAAABAQHAAG65AAAAg7JgjmMAAFwBPgI9HMAAbsUumQMBAAEngzQAlyFJwABu2yXAAG7kgMAAbt/ACYoOYI+FPgI9HMAAbwYumPwBAAEWwABvLRTAAG8owAmKDgABYI+FlMaPhwCXPT0cwABvRS6VNgEAARbAAG9ZFMAAb1TACYoOAAFgj4VUj4gAl5s+AT0cwABveC6ZKwEAAYDAAG+IwAmKDgCXQwaXRTDAAG+cwABvocAAcM8AAJcvAAAAAQPAAG+0wABwzwAAAAIBAcAAb8YAAACWh13AAPUdAWCOYwABwABv0wAAAJlCYMAA8rMBKVwBPgFGwABv78AAcA7AAG//AAAAg7JgjmMAgMAAcAfACYrWPgNJwABwFoHAAHAawAmK6j4BPRzAAHAzLpkGAAAAAJcmPz0cwABwVS6XOwEAAYLAAHBlwAmLBwCXREnAAHBygcAAcHbACYrqPgE9HMAAcI8umOQAAAAAlzE+AT0cwABwsS6ZAQAAAACXHwaXRjDAAHDUwABw1MAAcPAAAJRPAAAAAQPAAHDgwABw8AAAAAEBAcAAcOkAAACDsmCMRwAAYMAA9YIBPgAGl0cwwABw9cAAcPXAAHZOAACUvQAAAAEDwABw/8AAdk4AAAABAQHAAHEGAAAAg7JgjTEAAGDAAPWCAT4PPRzAAHESLpcvAQABFsAAcSuAwABxJsAJi+uUNI0WAJdFPRzAAHE9LpkGAAAAAJcmPRzAAHFVLpkVAgACFsAAcWiAwABxY8AJi+uD3o1BJ4PoAJcvPRzAAHGBLpkVAgACFsAAcZSAwABxj8AJi+uD5Y0+J4PvAJcvPRzAAHGzLpkVAgACFsAAccaAwABxwcAJi+uUuo1EJ5lDAJcvPRzAAHH9LpkVAgACFsAAchCAwAByC8AJi+uD4I0/J4PqAJcvPRzAAHInLpkVAgACFsAAcjqAwAByNcAJi+uD4o1AJ4PsAJcvScAAcrcWwABywIDAAHK7wAmL64PejUE+Aj0cwABy0i6ZFQIAAhbAAHLlgMAAcuDACYvrlLiNQieZRACXLz0cwABzCy6ZFQIAAhbAAHMegMAAcxnACYvrlLmNQyeZRQCXLz4CPRzAAHNRLpkVAgACIRbAAHNlgMAAc2DACYvrlLiNQieZRgCXL0nAAHOOFsAAc5eAwABzksAJi+uD4I0/PgE9HMAAc6oumRUCAAIWwABzvYDAAHO4wAmL65S5jUMnmUUAly8+AT0cwABz9C6ZFQIAAiEWwAB0CIDAAHQDwAmL65S5jUMnmUcAly89HMAAdD0umOkBAAEnlEQAlyQ9HMAAdFUumQEAAAAAlx89HMAAdGcumQ4CAAIWwAB0f4DAAHR6wAmL64IXjTM1AAAAAQBgluwBFsAAdIUumMSW9yMcwAB0kIEAwAmOEUEBAAErAAArHMAAdJCBAMAJjhGYwQIAAi6AwAB0pMAJi+sAlvABYMAA9l0Alyo9HMAAdLAulmgBAAEcwAB0ui6Y2AEAAYDAAHTIwAmL6wCXDwCXMEnAAHTUIRzAAHTpFsAAdN2AwAB02MAJi+uSRY01QQEAASsAwAD10j4CPRzAAHT6Lpj7AQABJ4CvAJciPRzAAHUSLpkrAQABFsAAdSeAwAB1IsAJi+uSRY01AJdDP0nAAHU/IiIcwAB1WBbAAHVJgMAAdUTACYvrkmmNG0EBAAErAMAA9dIAIRzAAHWNFsAAdYUWwAB1dIDAAHVvwAmL65RajRyEGIxKQQEAARbAAHWVgMAAdZDACYvrhBiNGADAAPcFASIhHMAAdb4WwAB1r4DAAHWqwAmL65JpjRtBAQABKwDAAPXSACEcwAB18RbAAHXpFsAAddqAwAB11cAJi+uSaY0bhBiM3EEBAAEWwAB1+YDAAHX0wAmL64QYjRgAwAD3BT4BPRzAAHYLLpjpAQABJMAAdjEDJ5lIFsAAdiWAwAB2IMAJi+uEGI0YJ5lJAJckPz0cwAB2Pi6Y5AEAASeTgwCXMQaXSDDAAHZTwAB2U8AAeYIAAJTaAAAAAQPAAHZhwAB5ggAAAAEBAcAAdmwAAACDsmCNnwAAYMAA9YIBPgs9HMAAdnguly8BAAEWwAB2kYDAAHaMwAmQEJQ0jRYAl0U9HMAAdqMumQYAAAAAlyY9HMAAdrsumRUCAAIWwAB2zoDAAHbJwAmQEIPkjbMng+4Aly89HMAAdusumRUCAAIWwAB2/oDAAHb5wAmQEIPejbEng+gAly89HMAAdxcumRUCAAIWwAB3KoDAAHclwAmQEIPfjbIng+kAly89HMAAd0cumRUCAAIWwAB3WoDAAHdVwAmQEJTQjbUnmUoAly89HMAAd4QumRUCAAIWwAB3l4DAAHeSwAmQEJTRjbYnmUsAly89HMAAd8oumRUCAAIWwAB33YDAAHfYwAmQEJTYjbknmUwAly89HMAAeBcumOkBAAEewAB4IZanAQABFsAAeDyAwAB4N8AJkBCCHI2iAACXJEnAAHhIIiIcwAB4YRbAAHhSgMAAeE3ACZAQkmmNG0EBAAErAMAA9dIAIRzAAHiWFsAAeI4WwAB4fYDAAHh4wAmQEJRajRyEGIxKQQEAARbAAHiegMAAeJnACZAQhBiNGADAAPcFASIhHMAAeMcWwAB4uIDAAHizwAmQEJJpjRtBAQABKwDAAPXSACEcwAB4+hbAAHjyFsAAeOOAwAB43sAJkBCSaY0bhBiM3EEBAAEWwAB5AoDAAHj9wAmQEIQYjRgAwAD3BT4BPRzAAHkULpjpAQABJMAAeToDJ5lIFsAAeS6AwAB5KcAJkBCEGI0YJ5lJAJckPz0cwAB5Ry6ZGAIAARbAAHlagMAAeVXACZAQkk+NpAGAsBzAAHlqLpjYAQABgMAAeXjACZAQAJcPlzIGl0kwwAB5h8AAeYfAAHr3AACUwwAAAAEDwAB5l8AAevcAAAABAQHAAHmkAAAAg7JgjV4AAGDAAPWCAT4HPRzAAHmwLpcvAQABFsAAecmAwAB5xMAJkrGUNI0WAJdFPRzAAHnbLpkGAAAAAJcmPRzAAHnzLpkVAgACFsAAegaAwAB6AcAJkrGD5I1pJ4PuAJcvPRzAAHojLpkVAgACFsAAejaAwAB6McAJkrGD4o1oJ4PsAJcvPRzAAHpNLpkVAgACFsAAemCAwAB6W8AJkrGUPY1qJ5lNAJcvPRzAAHp/LpjpAQABJ5hQAJckPRzAAHqdLpkYAwABFsAAerCAwAB6q8AJkrGST41iAoCwFsAAes2AwAB6yMAJkrGAsI0XlMAWwAB65oDAAHrhwAmSsZTAjWOXMgaXSjDAAHr8wAB6/MAAfd0AAJTIAAAAAQPAAHsewAB93QAAAAEBAcAAez0AAACDsmCNfQAAYMAA9YIBPgw9HMAAe0kuly8BAAEWwAB7YoDAAHtdwAmT5ZQ0jRYAl0U9HMAAe3QumQYAAAAAlyY9HMAAe4wumRUCAAIWwAB7n4DAAHuawAmT5YPkjYong+4Aly89HMAAe7wumRUCAAIWwAB7z4DAAHvKwAmT5YPijYkng+wAly89HMAAe+YumOkBAAEnmU4AlyRJwAB8DSEcwAB8GxbAAHwWgMAAfBHACZPlgLCNF0EBAAErAJI+PgE9HMAAfCwulmgBAAEWwAB8O4DAAHw2wAmT5YCwjRcAlzA/PRzAAHxMLpkaAQABFsAAfGiAwAB8Y8AJk+WSXo2CAJc4PRzAAHx9LpkbAwADFsAAfJWAwAB8kMAJk+WUbI2DFsAAfLCAwAB8q8AJk+WUbY2FFsAAfM6AwAB8ycAJk+WUx42EAJc5PRzAAHzrLpj7AQABJ4CvAJciPRzAAH0BLpj8AQABFsAAfSiAwAB9I8AJk+WUxo2BAJc9ScAAfT4WwAB9VRbAAH1HgMAAfULACZPlkkSNgINowAD1AD4DPRzAAH1pLpkDAQABJ1wAlyE9HMAAfYEuhPgCAWCSWQIWwAB9kIDAAH2LwAmT5ZJEjYAWwAB9ny6ZD5crAJc6PRzAAH2xLpkDAQABJ4CLAJchPz0cwAB9zS6Y5AEAASeTgwCXMQaXSzDAAH3iwAB94sAAgiwAAJSgAAAAAQPAAH3swACCLAAAAAEBAcAAffMAAACDsmCMzgAAYMAA9YIBPhM9HMAAff8uly8BAAEWwAB+GIDAAH4TwAmWFpQ0jNMAl0U9HMAAfioumQYAAAAAlyY9HMAAfkIumRUCAAIWwAB+VYDAAH5QwAmWFoPfjOong+kAly89HMAAfnIumOkBAAEnmU8AlyQ9HMAAfooumOkBAAEcwAB+lC6Y1AEAAYDAAH6hwAmWFgCXDACXJD0cwAB+rS6ZGgEAARbAAH7JgMAAfsTACZYWkl6M3QCXOEnAAH7eFsAAfueAwAB+4sAJlhaUm4zyPgQ9HMAAfwMumPsBAAEngK8AlyI9HMAAfxsulKgBAAEWwAB/L4DAAH8qwAmWFpSGjN4Aly09HMAAf0EumPsBAAEnmVAAlyI9HMAAf1wulKgBAAEWwAB/cIDAAH9rwAmWFpSHjN8Aly1JwAB/iSEcwAB/nBbAAH+SgMAAf43ACZYWlIaM3kEBAAErAJMBPgI9HMAAf60umPsBAAEnmVEAlyI9HMAAf8sulKgBAAEWwAB/34DAAH/awAmWFpSGjN4Aly0/ScAAf/UWwACADxbAAH/+gMAAf/nACZYWlIiM4INowAD1AD4CPRzAAIAjLpj7AQABJ5lSAJciPRzAAIBELoT4AgFgkvYCFsAAgFOAwACATsAJlhaUiIzgFsAAgGUulKiXLQCXOj9OwACAhMAAgJIAAJlTYMAA9l0BJ5Y+ScAAgJ4hHMAAgMAWwACAuBbAAICngMAAgKLACZYWlFqM+IQYjEpBAQABFsAAgMiAwACAw8AJlhaEGIzcAMAA9wU+AT2JwACA2cAJmBkcwACA54HAAIDZwAmYGV0BAAEkwACBBAInmVQWwACA+4DAAID2wAmWFoQYjNwAwAD2cj89HMAAgRAumOQBAAGBwACBGMAJmBkAlzE9F8AAgS4ug6IcwACBLBbAAIEuLoOilvpdAQABlADAAPWelvo9HMAAgUsWwACBRIDAAIE/wAmWFpQ6jOGDvAEAARbAAIFTLpZqlycAwAD06z0cwACBdRbAAIFogMAAgWPACZYWlImM4oO8AQABFsAAgX0ulmqXJwDAAPTrPRzAAIGdFsAAgZKAwACBjcAJlhaUOYzjg7wBAAEWwACBpS6WapcnAMAA9Os9HMAAgdkWwACBuoDAAIG1wAmWFpSKjOSDvAEAARbAAIHhLpZqlycAwAD06z0XwACB8y6DohzAAIHxFsAAgfMug6KW+oFBAQABlADAAPWflvo9HMAAggQumQYAAAAAlyY9HMAAghwumOQBAAEnlj8AlzEGl0wwwACCMcAAgjHAAIP+AACUbwAAAAEDwACCPcAAg/4AAAABAQHAAIJGAAAAg7JgjKkAAGDAAPWCAT4IPRzAAIJSLpcvAQABFsAAgmuAwACCZsAJmgeUNIysAJdFPRzAAIJ9LpkGAAAAAJcmPRzAAIKVLpjpAQABJ5YBAJckPRzAAIKvLpjpAQABFsAAgr6AwACCucAJmgeAsIytAJckPRzAAILJLpkaAQABFsAAguWAwACC4MAJmgeSXoyuAJc4PRzAAIL6Lpj7AQABJ4CvAJciScAAgxAlwACDHhbAAIMZgMAAgxTACZoHgheMr2CSnD4BPRzAAIM3LpktAwABJsAAg04BFsAAg06AwACDScAJmgeCF4yvYJKcApkuFsAAg3aAwACDccAJmgeUbIyxmS8WwACDqYDAAIOkwAmaB5RtjLKXNT4BPRzAAIPOLpZqAQABFsAAg92AwACD2MAJmgeCF4yvAJcnPRzAAIPuLpjkAQABJ5ODAJcxBpdNMMAAhAPAAIQDwACEtQAAlRIAAAABA8AAhBnAAIS1AAAAAQEBwACELAAAAIOyYI5rAABgwAD1ggE+Aj0cwACEOC6Y6QEAASeZVQCXJEnAAIRdIRzAAIRuFsAAhGaAwACEYcAJm4Iijm1BAQABKwDAAPZsPgE9HMAAhH8umOkBAAEkwACEqgMng2QcwACEjS6ZVgEAARbAAISfgMAAhJrACZuCIo5tAJdXJ4NkAJckPwaXTjDAAIS6wACEusAAhZwAAJU8AAAAAQPAAITPwACFnAAAAAEBAcAAhOEAAACDsmCPTQAAYMAA9YIBPgQ9HMAAhO0umSsCAAIWwACFAoDAAIT9wAmcNIQ8j08awACFF5fLAJdDPRzAAIUlLpkDAQABJ4ExAJchPRzAAIU7LplXAgACFsAAhVWAwACFUMAJnDSAsI9QFsAAhWCAwACFW8AJnDSVGY9SAJd5PRzAAIV/LpZqAQABFsAAhY6AwACFicAJnDRUj1EAlycGl08wwACFocAAhaHAAIagAACVJwAAAAEDwACFvMAAhqAAAAABAQHAAIXUAAAAg7JgjtYAAGDAAPWCAT4FPRzAAIXgLpkrAgACFsAAhfWAwACF8MAJnP6EPI7YGsAAhgqXywCXQz0cwACGGC6ZAwEAASeZWACXIT0cwACGMC6Y/AEAARbAAIZXgMAAhlLACZz+lMaO2QCXPT0cwACGbS6ZAwEAASeWPwCXIT0cwACGgy6WagEAARbAAIaSgMAAho3ACZz+VI7aAJcnBpdQMMAAhqXAAIalwACHcQAAlT4AAAABA8AAhr/AAIdxAAAAAQEBwACG1gAAAIOyYI9gAABgwAD1ggE+BD0cwACG4i6Y6QEAASeZWQCXJD0cwACG+i6ZAwEAASeBMQCXIT0cwACHEC6ZVwIAAhbAAIcqgMAAhyXACZ3IgLCPYhbAAIc1gMAAhzDACZ3IlRmPZACXeT0cwACHVC6WagEAARbAAIdjgMAAh17ACZ3IVI9jAJcnBpdRMMAAh3bAAId2wACILQAAlUAAAAABA8AAh4vAAIgtAAAAAQEBwACHnQAAAIOyYI9yAABgwAD1ggE+Az0cwACHqS6ZFQIAAhbAAIe8gMAAh7fACZ58g+KPdieD7ACXLz0cwACH0y6Y/AEAARbAAIf6gMAAh/XACZ58lMaPdACXPT0cwACIEC6WagEAARbAAIgfgMAAiBrACZ58VI91AJcnBpdSMMAAiDLAAIgywACI+AAAlUIAAAABA8AAiEzAAIj4AAAAAQEBwACIYwAAAIOyYI+FAABgwAD1ggE+Az0cwACIby6Y6QEAASMWwACIfoDAAIh5wAmfHoPij4kng+wnmVoBYMAA9l0AlyQ9HMAAiJ4umPwBAAEWwACIxYDAAIjAwAmfHpTGj4cAlz09HMAAiNsulmoBAAEWwACI6oDAAIjlwAmfHlSPiACXJwaXUzDAAIj9wACI/cAAiWAAAJVJAAAAAQPAAIkFwACJYAAAAAEBAcAAiQoAAACDsmCPpQAAYMAA9YIBPgI9HMAAiRYumQMBAAEnmVsAlyE9HMAAiSwumSsCAAIWwACJQYDAAIk8wAmfypVIj6cawACJVZfIAJdDBpdUMMAAiWXAAIllwACKVgAAlU0AAAABA8AAiXvAAIpWAAAAAQEBwACJjgAAAIOyYI+wAABgwAD1ggE+BE7AAImewACJqQAAmVxgwAD0eQEcwACJxhrAAIm2l81EAQABFsAAicyAwACJx8AJoEGSmo+zAMAA9WI9HMAAidsumSsCAAIWwACJ8IDAAInrwAmgQZVLj7KBwACJ9sAJoFgAl0M9HMAAigcumPsBAAEWwACKGIDAAIoTwAmgQZKaj7MAlyI9HMAAiicumSsCAAIWwACKPIDAAIo3wAmgQZVMj7QcwACKToHAAIpDwAmgWF0BAAGUAMAA9Z4Al0MGl1UwwACKW8AAilvAAIuIAACVUgAAAAEDwACKdcAAi4gAAAABAQHAAIqMAAAAg7Jgj70AAGDAAPWCAT4IPRzAAIqYLpkrAgACFsAAiq2AwACKqMAJoTyVT4+/GsAAisOXvgCXQz0cwACK1C6ZAgAAAACXID0cwACK5y6CEQEAASeA1gCXHj0cwACK9y6ZXQEAARbAAIsMgMAAiwfACaE8lVGPwgCXej0cwACLHS6ZAQAAAACXHz0cwACLLy6ZKwEAARbAAItEgMAAiz/ACaE8gTyPwACXQz0cwACLTy6Y+wEAASeCpgCXIj0cwACLZS6ZKwEAARbAAIt6gMAAi3XACaE8lVCPwQCXQwaXVjDAAIuNwACLlMAAjaUAAJleAAAAAQPAAIunwACNpQAAAAEBAcAAi6wAAACXr2DAAPR5AABgwAD2XQE+AUfAAIu8gMAAi8TACaJGCQHAAIvbNwkAPgFKwACL5gEng9IBwACL/zcKAD4BSsAAjAsBJ4PTAcAAjCQ3CwA+AUrAAIwwASeZXwHAAIxJNwwAPgFKwACMVQEnmWABwACMbjcNAD4BSsAAjHoBJ4PUAcAAjJM3IgA+AUrAAIyfASeD0QHAAIy4NyQAPgFKwACMxAEnmWEBwACM3TdcAD4BSsAAjOkBJ4PVAAE+AUnAAI0OIhzAAI0bgMAAjRLACaJGXAEAATcgAMAA9aYBHMAAjSyAwACNI8AJokaAiwEAATd+AMAA9ag+AUrAAI0/ARzAAI1MJ4PMXQEAARzAAI1aJMAAjVkBgMAAjVDACaJGjx8CAAKXJ4PNAMAA9ngAwAD2cj4BSsAAjYYBKwaXVzDAAI2qwACNscAAj1AAAJlWAAAAAQPAAI29wACPUAAAAAEBAcAAjcUAAACDsGDAAPZdAABgwAD2XQE+A07AAI3gAAAAghJgwAD2pwBFwACN7AHAAI31wACN9wAAW2DAAPR5AZMBHMAAjf6CwACN/MAJo9xcAQABFsAAjgeAwACOAMAJo65awAD2YQDAAPWmAYrAAI4RwAmj3BzAAI4PgsAAjhHACaPcXQEAAZQAwAD1nj4CTsAAjiPAAI4tAACQ92DAAPZdARzAAI4vLpleAQABHMAAjkqAwACOQ8AJo66D0AEAAYLAAI5VwAmj3ADAAPZrAJdWScAAjmAhHMAAjm6DwACOZMAJpD5BAQABKwDAAPZsPgI9IxzAAI6IgcAAjoHACaPHQQEAASsAwAD10onAAI6BwAmjxx/AAI6QwAD2xgEAARzAAI6kgMAAjp3ACaOugLECAAKTgsAAjrHACaPcAMAA9nMAKwFgwAD2pz0cwACOxYHAAI6+wAmjx4IRAQABg8AAjsvACaQ+AMAA9rs+AT01AAAAAQBgwAD2pwGBwACO7sAJo8cjHMAAjvaEAMAJpR5BAQABKwAAKxzAAI72hADACaUeghEBAAEcwACPAoDAAI78wAmjrkQBAAGCwACPA8AJo9wAwAD2agDAAPa7AVxKwACPGgEjHMAAjyiBwACPIcAJo8dBAQABKwDAAPXSgMAAjzLACaOuHMAAj0KBwACPO8AJo8cjAAAAAMAA9sABYMAA9l0Gl1gwwACPVcAAj1XAAJDeAACVVgAAAAEDwACPbcAAkN4AAAABAQHAAI+CAAAAg7Jgj8sAAGDAAPWCAT4FScAAj44cwACPmBbAAI+SLoHilwJBAQABGsAAj5uXAADAAPWcPgE9HMAAj6kumQEAAAAAlx8/PRzAAI/BLoIRAQABJ4NkAJceRsAAj9HAAI/0wACP2gAAAJliYI5jABbAAI/ngMAAj+LACaXplVSPzT4BScAAj/wlwACQBYHAAJAAwAmmUGCQMT4BPRzAAJAhLpkDAQABHMAAkC0umVYBAAEWwACQPxTAAJA6wAmmUAEBYJAxgIqQMwCXVwCXIT4DPRzAAJBfLpkDAQABJ5ljAJchPRzAAJB7LpkrAQABgcAAkIvACaZQAJdDPRzAAJCaLpkDAQABJ5Y/AJchPRzAAJC+LoIRAQABJ4NkAJcePRfAAJDOLoHiGsAAkNaXAJcCBpdZMMAAkOPAAJDjwACRswAAlVsAAAABA8AAkPnAAJGzAAAAAQEBwACRDAAAAIOyYI/WAABgwAD1ggE+Ak7AAJEdwACRIwAAgtJgwADyswEpRsAAkS/AAJFTwACRPwAAAJliYI5jABbAAJFMgMAAkUfACadGlVmP2T4DScAAkVshgcAAkWDACaddPRzAAJFnLpj7AQABJ10AlyI/PRzAAJF/LpkrAQABgsAAkY/ACad5AJdDPYnAAJGcwAmnXSoGl1owwACRuMAAkbjAAJKFAACVXwAAAAEDwACRzcAAkoUAAAABAQHAAJHfAAAAg7Jgj+IAAGDAAPWCAT4CTsAAkfDAAJH2AACC0mDAAPKzASlGwACSAsAAkiXAAJISAAAAmWJgjmMAFsAAkh+AwACSGsAJqAWVXY/lPgNJwACSLSGBwACSMsAJqBw9HMAAkjkumPsBAAEnXQCXIj89HMAAklEumSsBAAGCwACSYcAJqDgAl0M9icAAkm7ACagcKgaXWzDAAJKKwACSisAAk1cAAJVlAAAAAQPAAJKfwACTVwAAAAEBAcAAkrEAAACDsmCP7gAAYMAA9YIBPgJOwACSwsAAksgAAILSYMAA8rMBKUbAAJLUwACS98AAkuQAAACZYmCOYwAWwACS8YDAAJLswAmoxJVjj/I+A0nAAJL/IYHAAJMEwAmo2z0cwACTCy6Y+wEAASddAJciPz0cwACTIy6ZKwEAAYLAAJMzwAmo9wCXQz2JwACTQMAJqNsqBpdcMMAAk1zAAJNcwACWgAAAlWoAAAABA8AAk3HAAJaAAAAAAQEBwACTgwAAAIOyYI/7AABgwAD1ggE+Bz0cwACTjy6CEQEAASTAAJOoARbAAJOdgMAAk5jACamDlJSQAgCXHknAAJOvFsAAk8YWwACTuIDAAJOzwAmpg5JEj/6DaMAA9QA+Az0cwACT2i6ZAwEAASdcAJchPRzAAJPyLoT4AgFgklkCFsAAlAGAwACT/MAJqYOSRI/+FsAAlBAumQ+XKwCXOj0cwACUIi6ZAwEAASeAiwCXIT89HMAAlD4ughEBAAEnlj4Alx5OwACUVMAAlFoAAILSYMAA8rMBKT0cwACUdxbAAJRrgMAAlGbACamDlWiP/4O8AQABNMAAlH8DwACUf8AAlT0AAAACAgLAAJSKAAAAlWtgjDcAwACUnwAAAICKYI5jAABgwAD1ggE+BEnAAJSuIYHAAJSzwAmqST4BPRzAAJTELpkEAAAAAJcjPz0cwACU4C6CEQEAASTAAJUCAhbAAJT6FsAAlPKCwACU6cAJqo2UKIxBgLCNFyeDDgCXHj0cwACVCy6ZKwEAAYPAAJUbwAmqmgCXQz2JwACVKcAJqkkqAMAA9W1GwACVRMAAlXLAAJVZAAAAmWRgkUEAFsAAlWmAwACVZMAJqYOVaZAAPgVJwACVeiGBwACVf8AJqkk+AT0cwACVkC6ZBAAAAACXIz89HMAAlawughEBAAEnmWUAlx49HMAAlcQumSsBAAEWwACV3ILAAJXUwAmrNZVPkUMAl0NJwACV7iEcwACWAhbAAJX6gsAAlfLACas1IpFEQQEAASsAwAD10j4CPRzAAJYVLpkEAAAAAJcjPRzAAJYrLpkrAQABFsAAlkOCwACWO8AJqzUikUQAl0M/PRzAAJZbLoIRAQABJ4LaAJcePRzAAJZyLoIRAQABJ5Y/AJceBpddMMAAloXAAJaFwACXGQAAlW4AAAABA8AAlpbAAJcZAAAAAQEBwACWpAAAAIOyYJALAABgwAD1ggE+Az0cwACWsC6ZKwIAAhbAAJbFgMAAlsDACaxNlUiQDRrAAJbZl8IAl0M9HMAAluoumPsBAAEnmWYAlyI9HMAAlwEumQ8BAAEWwACXEIDAAJcLwAmsTYIXkA4AlysGl14wwACXHsAAlx7AAJfXAACVcgAAAAEDwACXL8AAl9cAAAABAQHAAJc9AAAAg7JgkBcAAGDAAPWCAT4DPRzAAJdJLpkrAgACFsAAl16AwACXWcAJrOWVSJAaGsAAl3KXwgCXQz0cwACXgy6Y+wEAASMWwACXlIDAAJePwAms5ZVxkB4nmWcnmP4BYMAA9l0AlyI9HMAAl78umQ8BAAEWwACXzoDAAJfJwAms5YIXkBsAlysGl18wwACX3MAAl9zAAJg4AACVfwAAAAEDwACX7sAAmDgAAAABAQHAAJf9AAAAg7JgkF4AAGDAAPWCAT4CPRzAAJgJLpkDAQABJ5YuAJchPRzAAJgfLpjpAQABFsAAmC6AwACYKcAJrZmAipBgAJckBpdgMMAAmD3AAJg9wACYfgAAlYEAAAABA8AAmE3AAJh+AAAAAQEBwACYWgAAAIOyYJBpAABgwAD1ggE+AT0cwACYZi6ZDwEAARbAAJh1gMAAmHDACa4JgheQawCXKwaXYTDAAJiDwACYg8AAmMcAAJWDAAAAAQPAAJiWwACYxwAAAAEBAcAAmKYAAACDsmCQdAAAYMAA9YIBPgE9HMAAmLIumOkBAAEnmWgAlyQGl2IwwACYzMAAmMzAAJkFAACVhQAAAAEDwACY2MAAmQUAAAABAQHAAJjhAAAAg7JgkH0AAGDAAPWCAT4BPRzAAJjtLpjpAQABJ5lpAJckBpdjMMAAmQrAAJkKwACZdQAAlYcAAAABA8AAmRTAAJl1AAAAAQEBwACZGwAAAIOyYJCGAABgwAD1ggE+Az0cwACZJy6Y6QEAASeZagCXJD0cwACZPy6ZAQAAAACXHz0cwACZUS6ZKwEAARbAAJlmgMAAmWHACa8FkkeQiACXQwaXZDDAAJl6wACZesAAmsQAAJWJAAAAAQPAAJmKwACaxAAAAAEBAcAAmZcAAACDsmCQkQAAYMAA9YIBPgVJwACZoxbAAJmsgMAAmafACa+Eg+KQkz4CPRzAAJm9LpjpAQABJ4PsAJckPRzAAJnXLpkBAAAAAJcfP0nAAJnvIRzAAJoFFsAAmfiAwACZ88AJr4SVWJCUQQEAASsAkl0+Az0cwACaFi6ZAwEAASdcAJchPRzAAJouLpkPAQABFsAAmj2AwACaOMAJr4SVWJCUAJcrPRzAAJpSLpkDAQABJ4CLAJchPz0cwACabi6ZAwEAASeZCQCXIT0cwACahC6E+AIBYI5jAhbAAJqTgMAAmo7ACa+ElVSQlRbAAJqgLpZqlycAlzo9HMAAmrAumQMBAAEnmQoAlyEGl2UwwACaycAAmsnAAJwRAACViwAAAAEDwACa2MAAnBEAAAABAQHAAJrkAAAAg7JgkJ4AAGDAAPWCAT4FScAAmvAWwACa+YDAAJr0wAmwuoPikKA+Aj0cwACbCi6Y6QEAASeD7ACXJD0cwACbJC6ZAQAAAACXHz9JwACbPCEcwACbUhbAAJtFgMAAm0DACbC6lViQoUEBAAErAJJdPgM9HMAAm2MumQMBAAEnXACXIT0cwACbey6ZDwEAARbAAJuKgMAAm4XACbC6lViQoQCXKz0cwACbny6ZAwEAASeAiwCXIT89HMAAm7sumQMBAAEnmSkAlyE9HMAAm9EuhPgCAWCOYwIWwACb4IDAAJvbwAmwupVUkKIWwACb7S6WapcnAJc6PRzAAJv9LpkDAQABJ5Y/AJchBpdmMMAAnBbAAJwWwACdbQAAlY4AAAABA8AAnCXAAJ1tAAAAAQEBwACcMQAAAIOyYJCrAABgwAD1ggE+BUnAAJw9FsAAnEaAwACcQcAJsfCD4pCtPgI9HMAAnFcumOkBAAEng+wAlyQ9HMAAnHEumQEAAAAAlx8/ScAAnIkhHMAAnJoWwACckoDAAJyNwAmx8JVhkK5BAQABKwCSXT4DPRzAAJyrLpkDAQABJ1wAlyE9HMAAnMMuhPgCAWCSWQIxwACczWCSWQIWwACc04DAAJzOwAmx8JVhkK4WwACc4YDAAJzcwAmx8JVikK8WwACc7S6ZD5crAJc6PRzAAJz/LpkDAQABJ4CLAJchPz0cwACdGy6ZAwEAASeZKQCXIT0cwACdMS6E+AIBYJC5AhbAAJ1AgMAAnTvACbHwlY2QsBbAAJ1JLpZqlycAlzo9HMAAnVkumQMBAAEnlj8AlyEGl2cwwACdcsAAnXLAAJ3oAACVkAAAAAEDwACdf8AAnegAAAABAQHAAJ2JAAAAg7JgkLkAAGDAAPWCAT4DPRzAAJ2VLpkrAQABFsAAnaqAwACdpcAJs06DlpC7AJdDPRzAAJ20LpkEAQABJ4KmAJcjPRzAAJ3JLpkrAQABFsAAnd6AwACd2cAJs06AipC8AJdDBpdoMMAAne3AAJ3twACeVwAAlZMAAAABA8AAngHAAJ5XAAAAAQEBwACeEgAAAIOyYJDDAABgwAD1ggE+Aj0cwACeHi6Y6QEAASeZawCXJD0cwACeNi6ZKwEAARbAAJ5LgMAAnkbACbPflUiQxQCXQwaXaTDAAJ5cwACeXMAAnskAAJWVAAAAAQPAAJ5zwACeyQAAAAEBAcAAnocAAACDsmCQzgAAYMAA9YIBPgE9HMAAnpMumRgCAAEWwACepoDAAJ6hwAm0T5JPkNABmRkqlzIGl2owwACezsAAns7AAJ8pAACVdAAAAAEDwACe4MAAnykAAAABAQHAAJ7vAAAAg7JgkDEAAGDAAPWCAT4BPRzAAJ77LpjpAQABJMAAnyQDJ4NkHMAAnwkumVYBAAEWwACfG4DAAJ8WwAm0sICKkDMAl1cng2QAlyQGl2swwACfLsAAny7AAJ9zAACVdgAAAAEDwACfPcAAn3MAAAABAQHAAJ9JAAAAg7JgkDoAAGDAAPWCAT4BPRzAAJ9VLpjpAQABJMAAn24BFsAAn2eAwACfYsAJtSiAipA8AJckBpdsMMAAn3jAAJ94wACfwwAAlXkAAAABA8AAn4rAAJ/DAAAAAQEBwACfmQAAAIOyYJBDAABgwAD1ggE+AT0cwACfpS6Y6QEAASTAAJ++ARbAAJ+3gMAAn7LACbWMgIqQRQCXJAaXbTDAAJ/IwACfyMAAoA8AAJV7AAAAAQPAAJ/YwACgDwAAAAEBAcAAn+UAAACDsmCQTAAAYMAA9YIBPgE9HMAAn/EumOkBAAEkwACgCgEWwACgA4DAAJ/+wAm18ICKkE4AlyQGl24wwACgFMAAoBTAAKBSAACVfAAAAAEDwACgJMAAoFIAAAABAQHAAKAxAAAAg7JgkFUAAGDAAPWCAT4BPRzAAKA9LpjpAQABJ4QCAJckBpdvMMAAoFfAAKBXwACg6AAAlZkAAAABA8AAoF/AAKDoAAAAAQEBwACgZAAAAIOyYJDlAABgwAD1ggE+BD0cwACgcC6Y6QEAASeZbACXJD0cwACghi6XQAEAARbAAKCkgMAAoJ/ACbajkkuQ5wCXmj0cwACgsy6Y+wEAASeZbQCXIj0cwACgyi6ZKwEAARbAAKDfgMAAoNrACbajkkyQ6ACXQwaXcDDAAKDtwACg7cAAoa0AAJWbAAAAAQPAAKEBwAChrQAAAAEBAcAAoRIAAACDsmCQ8QAAYMAA9YIBPgQ9HMAAoR4umPsBAAEnmW4AlyI9HMAAoTgumW8CAAEWwAChURbAAKFMgMAAoUfACbdGkkyQ85WlkSUBlhgpl4Q9HMAAoXYumQMBAAEnmXAAlyE9HMAAoY4umSsBAAEWwACho4DAAKGewAm3RoCKkPQAl0MGl3EwwAChssAAobLAAKJdAACVRgAAAAEDwAChxMAAol0AAAABAQHAAKHTAAAAg7Jgj5kAAGDAAPWCAT4EPRzAAKHfLpkrAQABFsAAofSAwACh78AJt/WSR4+bAJdDPRzAAKIFLpkDAQABJ1wAlyE9HMAAohsuhPgCAWCSWQIWwACiKoDAAKIlwAm39ZJEj5wWwACiOS6ZD5crAJc6PRzAAKJJLpkDAQABJ4CLAJchBpdyMMAAomLAAKJiwACjBgAAlZ4AAAABA8AAonLAAKMGAAAAAQEBwACifwAAAIOyYJD9AABgwAD1ggE+BT0cwACiiy6Y6QEAASeVnACXJD0cwACiqS6ZAwEAASeDnACXIT0cwACivy6Y6QEAARbAAKLVFsAAos6AwACiycAJuKSUV5D/gLCMegCXJD0cwACi4C6ZAwEAASeC2gCXIT0XwACi9i6B4hrAAKL+lwCXAgaXczDAAKMLwACjC8AAo8oAAJWhAAAAAQPAAKMkwACjygAAAAEBAcAAozoAAACDsmCRCAAAYMAA9YIBPgU9HMAAo0YumOkBAAEnlZ8AlyQ9HMAAo20umQMBAAEng5wAlyE9HMAAo4MumOkBAAEWwACjmRbAAKOSgMAAo43ACblTlFeRCoCwjHoAlyQ9HMAAo6QumQMBAAEngtoAlyE9F8AAo7ougeIawACjwpcAlwIGl3QwwACjz8AAo8/AAKR/AACUYwAAAAEDwACj38AApH8AAAABAQHAAKPsAAAAg7JgjI8AAGDAAPWCAT4FPRzAAKP4LpcvAQABFsAApBGAwACkDMAJugKUNIyRAJdFPRzAAKQjLpkGAAAAAJcmPRzAAKQ7LpjpAQABJ5liAJckPRzAAKRSLpjpAQABFsAApGGAwACkXMAJugKUYoySAJckPRzAAKRvLpjkAQABJ5ODAJcxBpd1MMAApITAAKSEwACmpQAAlGAAAAABA8AApJrAAKalAAAAAQEBwACkrQAAAIOyYIx1AABgwAD1ggE+CD0cwACkuS6ZBgAAAACXJj0cwACk0S6Y6QEAASMWwACk4IDAAKTbwAm6tJRdjIInlFcnlFgBYMAA9l0AlyROwAClCQAAAIUzWwBJwAClGCEcwAClQDUAAAABAGCMNwEWwAClIYDAAKUcwAm6tJRRjHkjHMAApTuCAMAJux9BAQABKwAAKxbAAKU7ggDACbsfg7KMOgFgjCtBAQABKwDAAPXSPgE9icAApVHACbsIJMAApX4BFsAApXMWwAClZYDAAKVgwAm6tJRbjICR4YxJPgE9icAApZPACbsIJMAApdYBNQAAAAEAYKG+ATUAAAABAGCMNwEWwAClp4DAAKWiwAm6tJRRjHkjHMAApcGCAMAJu7VBAQABKwAAKxbAAKXBggDACbu1lB2MOQFgob4jHMAApdCCAMAJu6tBAQABKwAAKxbAAKXQggDACburgLChxAFgwAD2XT0cwACl4i6Y6QEAASTAAKX6AyeDZIHAAKXvwAm7CCeDZACXJEnAAKYBFsAApgqAwACmBcAJurSUXoyDPgE9HMAAph4umOkBAAEnmXEAlyQ/ScAApj8hHMAApk0WwACmSIDAAKZDwAm6tICwjHpBAQABKwDAAPZsPgI9HMAApl4umOkBAAEnmP4AlyQ9HMAApnUumOkBAAEWwACmhIDAAKZ/wAm6tICwjHoAlyQ/PRzAAKaVLpjkAQABJ5ODAJcxBpd2MMAApqrAAKaqwACm9wAAl1kAAAABA8AAprvAAKb3AAAAAQEBwACmxwAAAIOyYI5jAABgwAD1ggE+AT0cwACm0y6Y6QEAASTAAKbyARbAAKblgMAApuDACb0GhQPAAPXZAJckBpd3MMAApvzAAKb8wACn4QAAlRUAAAABA8AApwzAAKfhAAAAAQEBwACnGQAAAIOyYI52AABgwAD1ggE+Aj0cwACnJS6ZPgEAARbAAKdBgMAApzzACb1skkuOeACXQUnAAKdQIRzAAKdmFsAAp1mAwACnVMAJvWyVFI55QQEAASsAkl0+BD0cwACndy6ZAwEAASeZKQCXIT0cwACnjy6WagEAARbAAKeegMAAp5nACb1slRSOeQCXJz0cwACnsy6ZAwEAASeWPwCXIT0XwACnyy6B4hrAAKfTlwCXAj8Gl3gwwACn5sAAp+bAAKhvAACVFwAAAAEDwACn9sAAqG8AAAABAQHAAKgDAAAAg7JgjoIAAGDAAPWCAT4DPRzAAKgPLpk+AQABFsAAqCuAwACoJsAJvkmSS46EAJdBPRzAAKg6Lpj7AQABJ4CvAJciPRzAAKhQLpkrAQABFsAAqGWAwACoYMAJvkmAio6FAJdDBpd5MMAAqHTAAKh5wACpVAAAmVcAAAABA8AAqI3AAKlUAAAAAgICwACokwAAAICwYJIyAMAAqKMAAACB02CMNwAAXAE+AUnAAKixIRzAAKi8gcAAqLXACb7nQQEAASsAwAD10j4DPRzAAKjNLpkDAQABJ5kpAJchPRzAAKjlLpj8AQABgcAAqQfACb7nAJc9PRzAAKkWLpkDAQABJ5Y/AJchPgE9HMAAqTsulmgBAAGAwACpRcAJvtoAlzAGl3owwACpWcAAqV7AAKnmAACZXQAAAAEDwACpbcAAqeYAAAABAQHAAKl3AAAAghdgklkAAFwBPgFJwACpgyEcwACpjIDAAKmHwAm/lkEBAAErAJJdPgM9HMAAqZ0umQMBAAEnmSkAlyE9HMAAqbUumQ8BAAGAwACpv8AJv5YAlys9HMAAqcwumQMBAAEnlj8AlyE/Bpd7MMAAqevAAKnrwACqpAAAlR8AAAABA8AAqfvAAKqkAAAAAQEBwACqCAAAAIOyYI6OAABgwAD1ggE+Az0cwACqFC6ZKwIAAhbAAKopgMAAqiTACcAqhDyOkBrAAKo+l8sAl0M9HMAAqkwumQMBAAEngTEAlyE9HMAAqmIumVcCAAIWwACqfIDAAKp3wAnAKoCwjpEWwACqh4DAAKqCwAnAKpUZjpIAl3kGl3wwwACqqcAAqqnAAKuZAACVIQAAAAEDwACqucAAq5kAAAABAQHAAKrGAAAAg7JgjqAAAGDAAPWCAT4FPRzAAKrSLpkrAgACFsAAqueAwACq4sAJwNSEPI6iGsAAqvyXywCXQz0cwACrCi6ZAwEAASeBMQCXIT0cwACrIC6ZVwIAAhbAAKs6gMAAqzXACcDUgLCOoxbAAKtFgMAAq0DACcDUlRmOpQCXeT0cwACrZC6Y+wEAASeArwCXIj0cwACrei6ZKwEAARbAAKuPgMAAq4rACcDUgIqOpACXQwaXfTDAAKuewACrnsAArEEAAJUtAAAAAQPAAKuzwACsQQAAAAEBAcAAq8UAAACDsmCO6QAAYMAA9YIBPgM9HMAAq9EumOkBAAEnmVkAlyQ9HMAAq+kumQMBAAEngTEAlyE9HMAAq/8umVcCAAIWwACsGYDAAKwUwAnBsYCwjusWwACsJIDAAKwfwAnBsZUZjuwAl3kGl34wwACsRsAArEbAAK0gAACVLwAAAAEDwACsW8AArSAAAAABAQHAAKxtAAAAg7JgjvoAAGDAAPWCAT4FPRzAAKx5LpjpAQABJ5lZAJckPRzAAKyRLpkDAQABJ4ExAJchPRzAAKynLplXAgACFsAArMGAwACsvMAJwkWAsI78FsAArMyAwACsx8AJwkWVGY7+AJd5PRzAAKzrLpj7AQABJ4CvAJciPRzAAK0BLpkrAQABFsAArRaAwACtEcAJwkWAio79AJdDBpd/MMAArSXAAK0lwACt+wAAlSMAAAABA8AArTvAAK37AAAAAQEBwACtTgAAAIOyYI6zAABgwAD1ggE+BD0cwACtWi6ZKwIAAhbAAK1vgMAArWrACcMMhDyOtRrAAK2El8sAl0M9HMAArZIumQMBAAEnmVgAlyE9HMAAraoumPwBAAEWwACt0YDAAK3MwAnDDJTGjrYAlz09HMAArecumQMBAAEnlj8AlyEGl4AwwACuAMAArgDAAK8NAACVJQAAAAEDwACuFsAArw0AAAABAQHAAK4pAAAAg7JgjsQAAGDAAPWCAT4GPRzAAK41LpkrAgACFsAArkqAwACuRcAJw7aEPI7GGsAArl+XywCXQz0cwACubS6ZAwEAASeZWACXIT0cwACuhS6Y/AEAARbAAK6sgMAArqfACcO2lMaOxwCXPT0cwACuwi6ZAwEAASeWPwCXIT0cwACu2C6Y+wEAASeArwCXIj0cwACu7i6ZKwEAARbAAK8DgMAArv7ACcO2gIqOyACXQwaXgTDAAK8SwACvEsAAr3IAAJUwAAAAAQPAAK8gwACvcgAAAAEBAcAArysAAACDsmCPDAAAYMAA9YIBPgE9HMAArzcumPwBAAEWwACvXoDAAK9ZwAnEk5TGjw4Alz0Gl4IwwACvd8AAr3fAALAOAACVMgAAAAEDwACvhcAAsA4AAAABAQHAAK+QAAAAg7JgjxwAAGDAAPWCAT4DPRzAAK+cLpj8AQABFsAAr8OAwACvvsAJxPGUxo8eAJc9PRzAAK/ZLpj7AQABJ4CvAJciPRzAAK/vLpkrAQABFsAAsASAwACv/8AJxPGAio8fAJdDBpeDMMAAsBPAALATwACwmgAAlaMAAAABA8AAsCvAALCaAAAAAQEBwACwQAAAAIOyYJEZAABgwAD1ggE+Az0cwACwTC6ZBgAAAACXJj0cwACwZC6ZKwEAARbAALB5gMAAsHTACcWCkkeRGwCXQz0cwACwii6Y5AEAASeTgwCXMQaXhDDAALCfwACwpMAAsgEAAJlvAAAAAQPAALCywACyAQAAAAIBAcAAsMMAAACVpV3AAPUdAWCREwABwACw1QAAAJYYYMAA8rMBKlwBPgdJwACw8hbAALEBgMAAsPbACcYBgPzAAPT/PgI9I4HAALESwAnGFRzAALEhLpkDAQABJ5koAJchHMAAsTUumOQBAAEnmSgAlzEBXErAALFKAD89HMAAsVwumOQBAAEnmSkAlzE9F8AAsXAug6IcwACxbhbAALFwLoOilvpdAQABlADAAPWelvo9HMAAsYyAwACxgcAJxgGDvAEAARbAALGULpZqlycAwAD06z0XwACxpi6DohzAALGkFsAAsaYug6KW+oFBAQABlADAAPWflvo9HMAAsbcumQYAAAAAlyY9I4HAALHPwAnGFRzAALHeLpkDAQABJ5Y/AJchHMAAsfEumOQBAAEnlj8AlzEBXAaXhTDAALIGwACyBsAAsl4AAJWnAAAAAQPAALIQwACyXgAAAAEBAcAAshcAAACDsmCRIwAAYMAA9YIBPgI9HMAAsiMumQYAAAAAlyY9HMAAsjsumW8BAAEWwACyT4DAALJKwAnHXZWlkSUAl4QGl4YwwACyY8AAsmPAALLiAACVqgAAAAEDwACyc8AAsuIAAAABAQHAALKAAAAAg7JgkS4AAGDAAPWCAT4DPRzAALKMLpkGAAAAAJcmPRzAALKkLpj7AQABJ5lyAJciPRzAALK/LplvAQABFsAAstOAwACyzsAJx8qVpZEwAJeEBpeHMMAAsufAALLnwACzPgAAlawAAAABA8AAsvrAALM+AAAAAQEBwACzCgAAAIOyYJE5AABgwAD1ggE+Aj0cwACzFi6ZBgAAAACXJj0cwACzLi6Y5AEAASeTgwCXMQaXiDDAALNDwACzQ8AAtNQAAJWwAAAAAQPAALNXwAC01AAAAAIBAcAAs2gAAACDsmCRQQABwACzdAAAAJYYYMAA8rMBKmDAAPWCAT4GScAAs5EhgcAAs5bACci1PgE9HMAAs6wumQYAAAAAlyY/PRzAALPKLpjpAQABJ5lyAJckPRzAALPjLpkDAQABJ4OcAJchPRzAALP5LpkrAQABFsAAtA6AwAC0CcAJyKeVT5FDAJdDScAAtB4hHMAAtC8WwAC0J4DAALQiwAnIpyKRREEBAAErAMAA9dI+Aj0cwAC0QC6ZBAAAAACXIz0cwAC0VC6ZKwEAARbAALRpgMAAtGTACcinIpFEAJdDP0nAALR9IYHAALSCwAnItT4BPRzAALSYLpjkAQABJ5lzAJcxPgE9HMAAtLoumQMBAAEngtoAlyEGl4kwwAC02cAAtNnAALWIAACVsgAAAAEDwAC07sAAtYgAAAABAQHAALUAAAAAg7JgkU4AAGDAAPWCAT4EPRzAALUMLpkGAAAAAJcmPRzAALUkLpjpAQABJsAAtT0BHMAAtT0WwAC1Li6Yw5b1mLQBAAGAwAC1UsAJyekAluVgwAD2XQCXJD0cwAC1Xi6Y5AEAASeCpgCXMT0cwAC1cC6WagEAARbAALV/gMAAtXrACcnpkkyRUACXJwaXijDAALWNwAC1jcAAtj0AAJW0AAAAAQPAALWgwAC2PQAAAAEBAcAAtbAAAACDsmCRWAAAYMAA9YIBPgQ9HMAAtbwumQYAAAAAlyY9HMAAtdQumOkBAAEnmXQAlyQ9HMAAtewumOkBAAEmwAC2BQEcwAC2BRbAALX2LpjDlvWYtAEAARbAALYfgMAAthrACcqigdORWgCW5WDAAPZdAJckPRzAALYtLpjkAQABJ5ODAJcxBpeLMMAAtkLAALZCwAC3DAAAlbYAAAABA8AAtlXAALcMAAAAAQEBwAC2ZQAAAIOyYJFiAABgwAD1ggE+Bj0cwAC2cS6ZBgAAAACXJj0cwAC2iS6Y+wEAASeZdQCXIj0cwAC2oy6ZAwEAASeDnACXIT0cwAC2uS6ZKwEAARbAALbOgMAAtsnACctVlU+RZACXQz0cwAC23i6ZAwEAASeC2gCXIT0cwAC29C6ZLAEAARbAALcDgMAAtv7ACctVkkyRZQCXNgaXjDDAALcRwAC3EcAAt/4AAJW4AAAAAQPAALchwAC3/gAAAAEBAcAAty4AAACDsmCRbQAAYMAA9YIBPgg9HMAAtzoumQYAAAAAlyY9HMAAt1IumOkBAAEnmXYAlyQ9HMAAt2cumSwBAAEWwAC3doDAALdxwAnMGZJMkW8AlzY9HMAAt4EumQYAAAAAlyY9HMAAt5kumPsBAAEnmXUAlyI9HMAAt7MumQMBAAEng5wAlyE9HMAAt8kumSsBAAEWwAC33oDAALfZwAnMGZVPkXAAl0M9HMAAt+4umOQBAAEngtoAlzEGl40wwAC4A8AAuAPAALmCAACVvAAAAAEDwAC4FMAAuYIAAAABAQHAALgiAAAAg7JgkXgAAGDAAPWCAT4KPRzAALguLpkGAAAAAJcmPRzAALhGLpj7AQABJ5l3AJciPRzAALheLpkDAQABJ4OcAJchPRzAALh0LoT4AgFgkgICFsAAuIOAwAC4fsAJzP6VupF6FsAAuI4ul0CXmgCXOj0cwAC4rS6ZBAEAASeTgwCXI0nAALjCIRzAALjVFsAAuMuAwAC4xsAJzP6VT5F7QQEAASsAwAD10j4BPRzAALjmLpkrAQABFsAAuPuAwAC49sAJzP6VT5F7AJdDPz0cwAC5ES6ZBAEAASeTgwCXIz0cwAC5Ji6E+AIBYI5jAhbAALk1gMAAuTDACcz+lbuRfBbAALk+Lpkrl0MAlzo9HMAAuVQumQMBAAEngtoAlyE9HMAAuWoumSwBAAEWwAC5eYDAALl0wAnM/pJMkX0AlzYGl44wwAC5h8AAuYfAALrhAACVwAAAAAEDwAC5msAAuuEAAAABAQHAALmqAAAAg7JgkYUAAGDAAPWCAT4JPRzAALm2LpkGAAAAAJcmScAAuc4WwAC514DAALnSwAnObJW/kYs+AT0cwAC56C6Y+wEAASeZawCXIj89HMAAuggumPsBAAEnmXcAlyI9HMAAuiAumQMBAAEng5wAlyE9HMAAujYul0ACAAEWwAC6VIDAALpPwAnObJJLkYgBmXgpl5o9HMAAungumPsBAAEnmW0AlyI9HMAAuo8umSsBAAEWwAC6pIDAALqfwAnObIOUkYkAl0M9HMAAurMumQMBAAEngtoAlyE9HMAAuskumSwBAAEWwAC62IDAALrTwAnObJJMkYoAlzYGl48wwAC65sAAuubAALwJAACVwwAAAAEDwAC6+sAAvAkAAAABAQHAALsLAAAAg7JgkZMAAGDAAPWCAT4KPRzAALsXLpkGAAAAAJcmPRzAALsvLpjpAQABJ5l5AJckPRzAALtILpkDAQABJ4OcAJchPRzAALteLpkrAQABFsAAu3OAwAC7bsAJz5KSR5GVAJdDPRzAALuELpjkAQABJ5l6AJcxPRfAALuaLoOiHMAAu5gWwAC7mi6Dopb6XQEAAZQAwAD1npb6PRzAALu2FsAAu7CAwAC7q8AJz5KVwpGWg7wBAAEWwAC7vi6WapcnAMAA9Os9F8AAu9Aug6IcwAC7zhbAALvQLoOilvqBQQEAAZQAwAD1n5b6PRzAALvhLpkGAAAAAJcmPRzAALv5LpjkAQABJ5Y/AJcxBpeQMMAAvA7AALwOwAC99AAAlcgAAAABA8AAvB3AAL30AAAAAQEBwAC8KQAAAIOyYJGeAABgwAD1ggE+CU7AALw8wAC8QgAAmHZgwAD2XQEmwAC8PAEcwAC8UxbAALxELpjDlvWYswEAAYDAALxiwAnQywCW5GDAAPZdPRzAALxtLpkGAAAAAJcmPRzAALyFLpjpAQABgcAAvI/ACdDiAJckPRzAALybLpjkAQABJ4KmAJcxRsAAvK3AALzWwAC8tgAAAJJHYI5jABbAALzJgMAAvMTACdDLlVSRoD4EPRzAALzeLpkGAAAAAJcmPRzAALz4LpjpAQABJ5l7AJckPRzAAL0RLpkrAQABgsAAvSHACdFhAJdDPRzAAL00LpjkAQABJ4KmAJcxScAAvUwWwAC9VYDAAL1QwAnQy5XGkaM+Az0cwAC9aC6ZBgAAAACXJj0cwAC9gi6Y6QEAASeZfACXJD0cwAC9ni6Y5AEAASeCpgCXMT89F8AAvbgug6IcwAC9thbAAL24LoOilvpdAQABlADAAPWelvo9HMAAvckulmoBAAEWwAC92IDAAL3TwAnQy5JMkaIAlyc9F8AAveUug6IcwAC94xbAAL3lLoOilvqBQQEAAZQAwAD1n5b6BpeRMMAAvfnAAL35wAC+uAAAlcoAAAABA8AAvhXAAL64AAAAAQEBwAC+LgAAAIOyYJGsAABgwAD1ggE+BD0cwAC+Oi6ZBgAAAACXJj0cwAC+Ui6Y6QEAASeZfQCXJD0cwAC+bS6Y6QEAASbAAL6GARzAAL6GFsAAvncumMOW9ZizAQABFsAAvpqAwAC+lcAJ0quB05GuAJbkYMAA9l0AlyQ9HMAAvqgumOQBAAEnk4MAlzEGl5IwwAC+vcAAvr3AAL/4AACVzAAAAAEDwAC+zcAAv/gAAAABAQHAAL7aAAAAg7JgkbYAAGDAAPWCAT4HPRzAAL7mLpkGAAAAAJcmPRzAAL7+LpjpAQABJ5l+AJckPRzAAL8TLpkDAQABJ4OcAJchPRzAAL8pLpkrAQABFsAAvz6AwAC/OcAJ016VT5G4AJdDPRzAAL9OLpkDAQABJ4LaAJchPRzAAL9kLpksAQABFsAAv3OAwAC/bsAJ016BPJG5AJc2ScAAv34hHMAAv5EWwAC/h4DAAL+CwAnTXpVQkbpBAQABKwDAAPXSPgM9HMAAv6IumQYAAAAAlyY9HMAAv7wumOkBAAEnmX8AlyQ9HMAAv9UumSwBAAEWwAC/5IDAAL/fwAnTXpVQkboAlzY/BpeTMMAAv/3AAL/9wADA1AAAlc4AAAABA8AAwBHAAMDUAAAAAQEBwADAIgAAAIOyYJHCAABgwAD1ggE+BD0cwADALi6ZBgAAAACXJj0cwADARi6Y6QEAASeZgACXJEnAAMBfIRzAAMBzFsAAwGiAwADAY8AJ1I6SR5HEQQEAASsAwAD10j4CPRzAAMCELpkBAAAAAJcfPRzAAMCYLpkrAQABFsAAwK2AwADAqMAJ1I6SR5HEAJdDPz0cwADAxC6Y5AEAASeTgwCXMQaXlDDAAMDZwADA2cAAwWcAAJXRAAAAAQPAAMDmwADBZwAAAAEBAcAAwPAAAACDsmCRzAAAYMAA9YIBPgQ9HMAAwPwumQYAAAAAlyY9HMAAwRQumOkBAAEnmYEAlyQ9HMAAwSoumSwBAAEWwADBOYDAAME0wAnVWJJMkc4AlzY9HMAAwVEWwADBSYDAAMFEwAnVWJXQkc+DvAEAARbAAMFZLpZqlycAwAD06waXlTDAAMFswADBbMAAw2EAAJXVAAAAAQPAAMF2wADDYQAAAAEBAcAAwX0AAACDsmCR2AAAYMAA9YIBPgg9HMAAwYkumQYAAAAAlyZJwADBoSEcwADBsBbAAMGqgMAAwaXACdYDldOR2kEBAAErAJJdPgM9HMAAwcEumOkBAAEnmYIAlyQ9HMAAwdgumQ8BAAEWwADB54DAAMHiwAnWA5XTkdoAlys9HMAAwfUumQEAAAAAlx8/PRzAAMINLpjpAQABJ5mDAJckPRzAAMIlLpkDAQABJ4OcAJchScAAwjshHMAAwk4WwADCRIDAAMI/wAnWA4F9kdtBAQABKwDAAPXSPgE9HMAAwl8ul0ABAAEWwADCfYDAAMJ4wAnWA4F9kdsAl5o+AT0cwADCnC6Y6QEAASeZhACXJEnAAMLFIRzAAMLZFsAAws6AwADCycAJ1gOV1JHcQQEAASsAwAD10j4CPRzAAMLqLpkEAAAAAJcjPRzAAML+LpdAAQABFsAAwxyAwADDF8AJ1gOV1JHcAJeaPz0cwADDMy6ZAwEAASeC2gCXIT0cwADDSS6ZLAEAARbAAMNYgMAAw1PACdYDkkyR3QCXNgaXljDAAMNmwADDZsAAxCQAAJXYAAAAAQPAAMN1wADEJAAAAAEBAcAAw4EAAACDsmCR5AAAYMAA9YIBPgY9HMAAw40umQYAAAAAlyY9HMAAw6UumOkBAAEnmYEAlyQ9HMAAw7sumSwBAAEWwADDyoDAAMPFwAnXyJJMkeYAlzY9HMAAw9UumQYAAAAAlyY9HMAAw+0umOkBAAEnmYUAlyQ9HMAAxAcumSwBAAEWwADEFoDAAMQRwAnXyJXXkecAlzYGl5cwwADEKcAAxCnAAMVGAACV3gAAAAEDwADEPMAAxUYAAAABAQHAAMRMAAAAg7Jgke8AAGDAAPWCAT4EPRzAAMRYLpkGAAAAAJcmScAAxHAWwADEeYDAAMR0wAnYiZXckfY+AT0cwADEji6Y6QEAASeZhgCXJEnAAMSuFsAAxLeAwADEssAJ2ImV3ZH3PgE9HMAAxMkumOkBAAEnmYcAlyQ+AT0cwADE8i6Y6QEAASeZiACXJD0cwADFEC6ZKwEAARbAAMUlgMAAxSDACdiJkkeR8QCXQz0cwADFNi6Y5AEAASeTgwCXMQaXmDDAAMVLwADFS8AAxeUAAJXlAAAAAQPAAMVjwADF5QAAAAEBAcAAxXgAAACDsmCSAgAAYMAA9YIBPgM9HMAAxYQumQYAAAAAlyY9HMAAxZwul0ACAAGAwADFtcAJ2XIBmXgpl5o9HMAAxdUumOQBAAEnk4MAlzEGl5kwwADF6sAAxerAAMdOAACV5wAAAAEDwADGAsAAx04AAAABAQHAAMYXAAAAg7JgkicAAGDAAPWCAT4EPRzAAMYjLpcvAQABFsAAxkUWwADGPIDAAMY3wAnZ65JLkimUNJIFAJdFPRzAAMZXLpkGAAAAAJcmPRzAAMZvLpjpAQABJ5JPAJckScAAxoohHMAAxpwWwADGk4DAAMaOwAnZ65JPkipBAQABKwDAAPXSPgE9HMAAxq0umRgCAAEWwADGwIDAAMa7wAnZ65JPkioBgLAcwADG0C6Y2gEAARbAAMblgMAAxuDACdnrkkuSKQCXEZcyPgI9HMAAxwQumOkBAAEcwADHDi6Y2gEAARbAAMcjgMAAxx7ACdnrkkuSKQCXEQCXJD0cwADHNS6Y5AEAASeZiQCXMQaXmjDAAMdTwADHWMAAypYAAJdAAAAAAQPAAMdwwADKlgAAAAIBAcAAx4UAAACDsmCSAgABwADHlwAAAJl4YMAA8rMBKlwBPgtJwADHtBbAAMe4LoQOlv09HMAAx8UumOkBAAEkwADH5QMnmQkWwADH2IDAAMfTwAnbIpQTjBwnmQoAlyQ/ScAAx+wWwADH8C6ED5b+PRzAAMf+Lpj9AQABgMAAyAzACdsiAJcpPz0cwADIFy6XLwIAARbAAMgwgMAAyCvACdsilDSSBQGZQiqXRT0cwADIWC6ZFQIAAhbAAMhrgMAAyGbACdsig+WSFCeD7wCXLz0cwADIii6ZFQIAAhbAAMidgMAAyJjACdsilLqSFieZQwCXLz0cwADI1C6ZFQIAAhbAAMjngMAAyOLACdsig+CSEieD6gCXLz0cwADI/i6ZFQIAAhbAAMkRgMAAyQzACdsig+KSEyeD7ACXL0nAAMkoIRzAAMk2FsAAyTGAwADJLMAJ2yKCF5IIQQEAASsAkl0+AT0cwADJRy6ZDgIAAhbAAMlfgMAAyVrACdsigheSCDUAAAABAGCW7AEWwADJZS6YxJb3IxzAAMlwggDACdyjQQEAASsAACscwADJcIIAwAnco5i+AgACLoDAAMmHwAnbIgCW7gFgwAD2XQCXKj9JwADJmSIiIoHAAMmdwAnbMAAhFsAAybSAwADJr8AJ2yKD4JISACEWwADJxYDAAMnAwAnbIoPikhMAHMAAydoWwADJ1YDAAMnQwAnbIoIXkghBAQABKwCSXT4BPRzAAMnrLpjpAQABJ4PrAJckPz0cwADKBy6Y6QEAARzAAMoRLpjaAQABgMAAyiHACdsiAJcRAJckScAAyi0hHMAAykIWwADKNoDAAMoxwAnbIpJFkgpBAQABKwDAAPXSPgI9HMAAylMumPsBAAEngK8AlyI9HMAAymsumSsBAAEWwADKgIDAAMp7wAnbIpJFkgoAl0M/BpebMMAAypvAAMqbwADL5gAAlTYAAAABA8AAyqnAAMvmAAAAAQEBwADKtAAAAIOyYI8tAABgwAD1ggE+BUnAAMrAFsAAys8WwADKyYDAAMrEwAneCZUIjy+DaMAA9QA+Az0cwADK4y6ZAwEAASdcAJchPRzAAMr7LoT4AgFgklkCFsAAywqAwADLBcAJ3gmVCI8vFsAAyxEumQ+XKwCXOj0cwADLIy6ZAwEAASeAiwCXIT89HMAAyz8umQMBAAEng5wAlyFOwADLWcAAy2EAAJmKXcAA9NsBYIwVARzAAMuZMcAAy3tdwAD1HQFgjBUCFsAAy4GAwADLfMAJ3gmVKo8wFsAAy5KAwADLjcAJ3gmU/Y8xkyIBAWCMFQE0wADLoAPAAMugwADLqAAAAAEBAcAAy6EAAACDMF3AAPUdAWCMFQAAXcAA9R0BYIwVAUrAAMunAYHAAMunwAnfEgDAAPTpPRzAAMuvLoT4AgFgjBUCgcAAy7nACd6oFsAAy8IulmqXJwCXOj0cwADL0i6ZAwEAASeC2gCXIQaXnDDAAMvrwADL68AAzGoAAJU4AAAAAQPAAMv/wADMagAAAAEBAcAAzBAAAACDsmCPOwAAYMAA9YIBPgM9HMAAzBwumOkBAAEWwADMK4DAAMwmwAnfooCwjz0AlyQ9HMAAzDYumQQBAAEngqYAlyM9HMAAzEsumSsBAAEWwADMYIDAAMxbwAnfooCKjz4Al0MGl50wwADMb8AAzG/AAMzQAACXYQAAAAEDwADMf8AAzNAAAAABAQHAAMyKAAAAg7JgkRMAAGDAAPWCAT4CPRzAAMyWLpkGAAAAAJcmPRzAAMyuLpjkAQABJMAAzMsBFsAAzL6AwADMucAJ4DOFA8AA9dkAlzEGl54wwADM1cAAzNXAAM0wAACU6QAAAAEDwADM7MAAzTAAAAABAQHAAM0AAAAAg7JgjfIAAGDAAPWCAT4BPRzAAM0MLpjpAQABJ5mLAJckBpefMMAAzTXAAM01wADN2QAAlOwAAAABA8AAzUrAAM3ZAAAAAQEBwADNXAAAAIOyYI35AABgwAD1ggE+Az0cwADNaC6Y/AEAARbAAM2PgMAAzYrACeD3lOuN+wCXPT0cwADNpC6Y+wEAASeArwCXIj0cwADNui6ZKwEAARbAAM3PgMAAzcrACeD3gIqN/ACXQwaXoDDAAM3ewADN3sAAzoMAAJTuAAAAAQPAAM3zwADOgwAAAAEBAcAAzgUAAACDsmCOCAAAYMAA9YIBPgM9HMAAzhEumOkBAAEnmVkAlyQ9HMAAzikumPwBAAEWwADOUIDAAM5LwAnhiJTGjgoAlz09HMAAzmYulmoBAAEWwADOdYDAAM5wwAnhiFSOCwCXJwaXoTDAAM6IwADOiMAAzzgAAJTwAAAAAQPAAM6jwADPOAAAAAEBAcAAzrsAAACDsmCOFwAAYMAA9YIBPgM9HMAAzscumOkBAAEnmWgAlyQ9HMAAzt4umPwBAAEWwADPBYDAAM8AwAniGJTGjhkAlz09HMAAzxsulmoBAAEWwADPKoDAAM8lwAniGFSOGgCXJwaXojDAAM89wADPPcAAz5sAAJTyAAAAAQPAAM9SwADPmwAAAAEBAcAAz2QAAACDsmCOJgAAYMAA9YIBPgE9HMAAz3Aul0ABAAEWwADPjoDAAM+JwAniqJJLjigAl5oGl6MwwADPoMAAz6DAANARAACU9AAAAAEDwADPtsAA0BEAAAABAQHAAM/JAAAAg7Jgji8AAGDAAPWCAT4BPRzAAM/VLpWwAgABFsAAz++AwADP6sAJ4waSUI4xAZYYKZeIBpekMMAA0BbAANAWwADQfQAAl1sAAAABA8AA0CjAANB9AAAAAQEBwADQNQAAAIOyYI3rAABgwAD1ggE+Aj0cwADQQS6ZBgAAAACXJj0cwADQWS6Y5AEAASTAANB4AieDDhbAANBrgMAA0GbACeNnhQPAAPXZAJcxBpelMMAA0ILAANCCwADQyAAAlfMAAAABA8AA0JLAANDIAAAAAQEBwADQnwAAAIOyYJJjAABgwAD1ggE+AT0cwADQqy6Y6QEAASeZjACXJAaXpjDAANDNwADQzcAA0Q4AAJX0AAAAAQPAANDdwADRDgAAAAEBAcAA0OoAAACDsmCSbQAAYMAA9YIBPgE9HMAA0PYumOkBAAEnmY0AlyQGl6cwwADRE8AA0RPAANFLAACV9gAAAAEDwADRIMAA0UsAAAABAQHAANEqAAAAg7JgkncAAGDAAPWCAT4BPRzAANE2LpjpAQABJ5mOAJckBpeoMMAA0VDAANFQwADSggAAlfwAAAABA8AA0WLAANKCAAAAAQEBwADRcQAAAIOyYJKLAABgwAD1ggE+Aj0cwADRfS6ZEwEAARbAANGjgMAA0Z7ACeTMlfqSjQCXO0nAANGzFsAA0coWwADRvIDAANG3wAnkzJJEko6DaMAA9QA+BD0cwADR3i6ZAwEAASdcAJchPRzAANH2LoT4AgFgklkCFsAA0gWAwADSAMAJ5MySRJKOFsAA0hQumQ+XKwCXOj0cwADSJi6ZAwEAASeAiwCXIT0XwADSPi6B4hrAANJGlwCXAj8Gl6kwwADSh8AA0ofAANLNAACWAgAAAAEDwADSmMAA0s0AAAABAQHAANKmAAAAg7JgkpwAAGDAAPWCAT4BPRzAANKyLpktAQABgMAA0sTACeWyAJc1BpeqMMAA0tLAANLSwADTUQAAlg4AAAABA8AA0uDAANNRAAAAAQEBwADS6wAAAIOyYJLGAABgwAD1ggE+BD0cwADS9y6Y6QEAARbAANMGgMAA0wHACeYHgLCSyACXJD0cwADTES6ZAwEAASeCpgCXIT0cwADTJy6ZAQAAAACXHz0cwADTOS6ZDwEAARbAANNIgMAA00PACeYHgheSyQCXKwaXqzDAANNWwADTVsAA1E8AAJYQAAAAAQPAANNswADUTwAAAAEBAcAA038AAACDsmCS0wAAYMAA9YIBPgI9HMAA04sumT8BAAEWwADTrIDAANOnwAnmp4DPktUAl0JJwADTvCEcwADT0xbAANPFgMAA08DACeanlg+S1kEBAAErAJJdPgQ9HMAA0+QumQEAAAAAlx89HMAA0/gumOkBAAEnmVEAlyQ9HMAA1BQumQEAAAAAlx89HMAA1CgumQ8BAAEWwADUN4DAANQywAnmp5YPktYAlys/BpesMMAA1FTAANRUwADV0QAAlhMAAAABA8AA1GbAANXRAAAAAQEBwADUdQAAAIOyYJLhAABgwAD1ggE+Bj0cwADUgS6ZFQIAAhbAANSUgMAA1I/ACed+lLqS6ieZQwCXLz0cwADUyy6XLwIAARbAANTkgMAA1N/ACed+lDSS5AGZQiqXRT0cwADVDC6Y6QEAARzAANUWLpjdAQABgMAA1SvACed+AJcTAJckPRzAANU3Lpj7AQABJ5lRAJciPRzAANVTLpkPAQABFsAA1WKAwADVXcAJ536VCpLmAJcrScAA1W4hHMAA1YMWwADVd4DAANVywAnnfpYSkudBAQABKwCSXT4CPRzAANWULpj7AQABJ4CvAJciPRzAANWsLpkPAQABFsAA1buAwADVtsAJ536WEpLnAJcrPwaXrTDAANXWwADV1sAA1kYAAJWXAAAAAQPAANXtwADWRgAAAAEBAcAA1gEAAACDsmCQ2QAAYMAA9YIBPgE9HMAA1g0umOkBAAEmwADWJgEcwADWJhbAANYXLpjDlvWYtQEAARbAANY4gMAA1jPACei3hB+Q2wCW5mDAAPZdAJckBpeuMMAA1kvAANZLwADWyQAAl1EAAAABA8AA1lrAANbJAAAAAQEBwADWZAAAAIOyYJMFAABgwAD1ggE+Ak7AANZ9wADWggABgLBgwAD2XQEmwADWfQEcwADWkxbAANaELpjDlvWYtQEAAYDAANagwAnpNwCW5mDAAPZdPRzAANarLpjkAQABJMAA1sQEJ4OhgcAA1rfACelOJ5mPgMAA1r/ACek3AJcxBpevMMAA1s7AANbOwADYGAAAljYAAAABA8AA1t/AANgYAAAAAQEBwADW7QAAAIOyYJNyAABgwAD1ggE+BE7AANcGwADXCwABgLBgwAD2XQEmwADXBgEcwADXHBbAANcNLpjDlvWYtQEAAYDAANcpwAnp3wCW5mDAAPZdPRzAANc0LoIRAQABJMAA10YDJ4OhgcAA1z7ACen2J5mPAJceTsAA11rAANdiAAGVjWDAAPZdARzAANfGHMAA13EWwADXaYDAANdkwAnp35WNk3WAnwEBWwE0wADXdQPAANd1wADXxAAAAAEBAcAA138AAACEH2CTBQAAWwE+AUrAANeRARzAANenFsAA15gumMOW9Zi1AQABgsAA17TACeqgAJbmAMAA9OZRAQABJ4PyAMAA9O89HMAA19YumOQBAAEkwADYEwYWwADX5oDAANfhwAnp34UDwAD12SdcFsAA1/qAwADX9cAJ6d+VWJN0J5YzgsAA2ArACepYJ4LaAJcxBpewMMAA2B3AANgdwADZZQAAljkAAAABA8AA2C3AANllAAAAAQEBwADYOgAAAIOyYJODAABgwAD1ggE+BE7AANhTwADYWAABgLBgwAD2XQEmwADYUwEcwADYaRbAANhaLpjDlvWYtQEAAYDAANh2wAnrXACW5mDAAPZdPRzAANiBLoIRAQABJMAA2JMDJ4OhgcAA2IvACetzJ5mPAJceTsAA2KfAANivAAGVjWDAAPZdARzAANkTHMAA2L4WwADYtoDAANixwAnrXJWNk4aAnwEBWwE0wADYwgPAANjCwADZEQAAAAEBAcAA2MwAAACEH2CTBQAAWwE+AUrAANjeARzAANj0FsAA2OUumMOW9Zi1AQABgsAA2QHACewdAJbmAMAA9OZRAQABJ4PyAMAA9O89HMAA2SMumOQBAAEkwADZYAYWwADZM4DAANkuwAnrXIUDwAD12SdcFsAA2UeAwADZQsAJ61yVWJOFJ5YzgsAA2VfACevVJ4LaAJcxBpexMMAA2WrAANlqwADbPQAAljEAAAABA8AA2XrAANs9AAAAAQEBwADZhwAAAIOyYJNVAABgwAD1ggE+BE7AANmgwADZpQABgLBgwAD2XQEmwADZoAEcwADZthbAANmnLpjDlvWYtQEAAYDAANnDwAns2QCW5mDAAPZdPRzAANnOLoIRAQABJMAA2eADJ4OhgcAA2djACezwJ5mPAJceTsAA2fTAANn8AAGVjWDAAPZdARzAANrUHMAA2gsWwADaA4DAANn+wAns2ZWNk1mAnwEBYMAA9l0BNMAA2g8DwADaD8AA2tIAAAABAQHAANohAAAAhLpgk2cAAGDAAPZdAT4DTsAA2j3AANpBAAGDlmDAAPZdASbAANo9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CnxZmgQBAAEWwACuR4TAAK43wAp9n5pkmI4AmIE/RsAArmrAAK6fwACueQAAAJSGYJL2ABbAAK6NgMAArobACnuzlIiM4D4CTsAArrLAAK7AAACaYmCYhQEcwACuyhbAAK7CLpn7mACYSkQBAAEWwACu1YTAAK7LwAp+F5SUkvsAwAD1Yj0cwACu+4PAAK7nwAp8WZoEAQABFsAArxmFwACvC8AKfjmaZJiOAJiBPRfAAK9BgcAArzzACnvGmmMcwACvb4LAAK9awAp7+poHAAAAAJiCmI09F8AAr42BwACviMAKe8aaZBzAAK+5g8AAr6XACnxZmgcAAAAAmIKYjgaYdTHAALDOwACw2MAAsoMAAJpmAAAAAQPAALDrwACygwAAAAAAAABdwAD1HQFgwAD0eQE+A07AALD4wACw/wAAgRBdwAD1HQFgwAD0eQExwACxBmDAAPR5AEbAALEOwACxMsAAsRkAAACUQmCMzgAWwACxLBbAALEjLpn7mACYSoHcwAD1cD4ETsAAsT7AALFDAACA+2CYhQEcwACxTRbAALFFLpn7mACYSkQBAAGBwACxTsAKf1MAwAD1Yk7AALFhwACxawAAmmdgwAD0eQEcwACxjxbAALGIFsAAsXKCwACxbcAKf3qaZJiOWsAA9UySmAEAAZUAwAD1o0nAALGbHMAAsamDwACxn8AKf66BSAEAARbAALGzgMAAsazACn8nWsAA9UwAwAD1qT4DTsAAscnAALHTAACaaGDAAPR5ARbAALHcgMAAsdXACn8nWsAA9Uw9F8AAsfOAwACx7MAKfydaHMAAsgaDwACx/MAKf65dAQABlADAAPWewAD1Sj0cwACyGoDAALITwAp/J5ppAwADhMAAsiTACoAfFsAAsjaAwACyL8AKfydawAD1TJMAwAD1RD89NQAAAAEAXcAA9R0BYMAA9HkBgMAAslDACn8nNQAAAAEAYMAA9HkBg8AAslfACn+uHMAAslaEwACyVsAKgKmAsgIAAoXAALJWwAqAxBzAALJiHMAAslaEwACyVsAKgKlEAQABhcAAslbACoDEAMAA9SxdAQABlADAAPWeAMAA9S1KwACycgGAwACyecAKfycGmHYxwACzdsAAs33AALU5AACaagAAAAEDwACzkMAAtTkAAAAAAAAAYMAA8ysBPgROwACzncAAs6cAAJpn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qIOpg6qDq4Osg62DroOvg7CDsYOyg7ODtIO1g7aDt4O4g7mDuoO7g7yDvYO+g7+DwIPBg8KDw4PEg8WDxoPHg8iDyYPKg8uDzIPNg86Dz4PQg9GD0oPTg9SD1YPWg9eD2IPZg9qD24Pcg92D3oPfg+CD4YPig+OD5IPlg+aD54Pog+mD6oPrg+yD7YPug++D8IPxg/KD84P0g/WD9oP3g/iD+YP6g/uD/IP9g/6D/4QAhAGEAoQDhASEBYQGhAeECIQJhAqEC4QMhA2EDoQPhBCEEYQShBOEFIQVhBaEF4QYhBmEGoQbhByEHYQehB+EIIQhhCKEI4QkhCWEJoQnhCiEKYQqhCuELIQthC6EL4QwhDGEMoQzhDSENYQ2hDeEOIQ5hDqEO4Q8hD2EPoQ/hECEQYRChEOERIRFhEaER4RIhEmESoRLhEyETYROhE+EUIRRhFKEU4RUhFWEVoRXhFiEWYRahFuEXIRdhF6EX4RghGGEYoRjhGSEZYRmhGeEaIRphGqEa4RshG2EboRvhHCEcYRyhHOEdIR1hHaEd4R4hHmEeoR7hHyEfYR+hH+EgISBhIKEg4SEhIWEhoSHhIiEiYSKhIuEjISNhI6Ej4SQhJGEkoSThJSElYSWhJeEmISZhJqEm4SchJ2EnoSfhKCEoYSihKOEpISlhKaEp4SohKmEqoSrhKyErYSuhK+EsISxhLKEs4S0hLWEtoS3hLiEuYS6hLuEvIS9hL6Ev4TAhMGEwoTDhMSExYTGhMeEyITJhMqEy4TMhM2EzoTPhNCE0YTShNOE1ITVhNaE14TYhNmE2oTbhNyE3YTehN+E4IThhOKE44TkhOWE5oTnhOiE6YTqhOuE7ITthO6E74TwhPGE8oTzhPSE9YT2hPeE+IT5hPqE+4T8hP2E/oT/hQCFAYUChQOFBIUFhQaFB4UIhQmFCoULhQyFDYUOhQ+FEIURhRKFE4UUhRWFFoUXhRiFGYUahRuFHIUdhR6FH4UghSGFIoUjhSSFJYUmhSeFKIUphSqFK4UshS2FLoUvhTCFMYUyhTOFNIU1hTaFN4U4hTmFOoU7hTyFPYU+hT+FQIVBhUKFQ4VEhUWFRoVHhUiFSYVKhUuFTIVNhU6FT4VQhVGFUoVThVSFVYVWhVeFWIVZhVqFW4VchV2FXoVfhWCFYYVihWOFZIVlhWaFZ4VohWmFaoVrhWyFbYVuhW+FcIVxhXKFc4V0hXWFdoV3hXiFeYV6hXuFfIV9hX6Ff4WAhYGFgoWDhYSFhYWGhYeFiIWJhYqFi4WMhY2FjoWPhZCFkYWShZOFlIWVhZaFl4WYhZmFmoWbhZyFnYWehZ+FoIWhhaKFo4WkhaWFpoWnhaiFqYWqhauFrIWtha6Fr4WwhbGFsoWzhbSFtYW2hbeFuIW5hbqFu4W8hb2FvoW/hcCFwYXChcOFxIXFhcaFx4XIhcmFyoXLhcyFzYXOhc+F0IXRhdKF04XUhdWF1oXXhdiF2YXahduF3IXdhd6F34XgheGF4oXjheSF5YXmheeF6IXpheqF64Xshe2F7oXvhfCF8YXyhfOF9IX1hfaF94X4hfmF+oX7hfyF/YX+hf+GAIYBhgKGA4YEhgWGBoYHhgiGCYYKhguGDIYNhg6GD4YQhhGGEoYThhSGFYYWhheGGIYZhhqGG4Ychh2GHoYfhiCGIYYihiOGJIYlhiaGJ4YohimGKoYrhiyGLYYuhi+GMIYxhjKGM4Y0hjWGNoY3hjiGOYY6hjuGPIY9hj6GP4ZAhkGGQoZDhkSGRYZGhkeGSIZJhkqGS4ZMhk2GToZPhlCGUYZShlOGVIZVhlaGV4ZYhlmGWoZbhlyGXYZehl+GYIZhhmKGY4ZkhmWGZoZnhmiGaYZqhmuGbIZthm6Gb4ZwhnGGcoZzhnSGdYZ2hneGeIZ5hnqGe4Z8hn2GfoZ/hoCGgYaChoOGhIaFhoaGh4aIhomGioaLhoyGjYaOho+GkIaRhpKGk4aUhpWGloaXhpiGmYaahpuGnIadhp6Gn4aghqGGooajhqSGpYamhqeGqIaphqqGq4ashq2GroavhrCGsYayhrOGtIa1hraGt4a4hrmGuoa7hryGvYa+hr+GwIbBhsKGw4bEhsWGxobHhsiGyYbKhsuGzIbNhs6Gz4bQhtGG0obThtSG1YbWhteG2IbZhtqG24bcht2G3obfhuCG4YbihuOG5IblhuaG54bohumG6obrhuyG7Ybuhu+G8IbxhvKG84b0hvWG9ob3hviG+Yb6hvuG/Ib9hv6G/4cAhwGHAocDhwSHBYcGhweHCIcJhwqHC4cMhw2HDocPhxCHEYcShxOHFIcVhxaHF4cYhxmHGocbhxyHHYcehx+HIIchhyKHI4ckhyWHJocnhyiHKYcqhyuH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GqTYmncapOGaeBqk65p5GqT3mnoapQOaexqlDpp8GqUamn0apSSafhqlLpp/GqU5moAapUOagRqlTJqCGqVZmoMapWKahBqlbJqFGqV3moYapYGahwSaiT2mCaYnBZwaAF3AAPVOAmDAAPZdYJpGAR6mFJqUAAAAAASaij2mlKadCZvSARqmfsAA7ktgwADyswAEmos9prmmwQmb1wEapqPAAO5LYMAA8rMAAQWalj2m+6cBqEgBAAADpwioSAAAAAcCAqcQAAAAge5gwAD2XQCnHwAAAICwYMAA9l0ABacxAAAEm9JgwADyswEqp04AAACb02DAAPKzASqnbAAABJvXYMAA8rMBKqeIAAAAm91gwADyswEqp6wAAACZXGDAAPR5ARqnuJocYJpGAT8DCAGaioIAwAsulwgBmouEAMALLrMJAKfQm7cGAASAp9bACy58gafewAsuiYan5MALLs8ap/CdMAKb04OoF8ALLqWb3YWoNsALLsEGBpqNPahNqFaogAEAnBsAAAABA6hoqIAAAAAAAAAAYMAA8rMBSqhrASIWqGsum9KaigEWqHgum9eaiwaajj2pPKlTqW8BAJwcARqpPcAA7koAAAEDqWOpbwAAAAAAAABgwADyswFKqWYBFqlmLpvSmooGmo89qcOpzqnqAQCAsAAAAAEDqdOp6gAAAAAAAABgwAD2XQFKqdYBHKndFqnWLoHum6CPHgAAAADAAPaDBpqQPapJqmKqcgEAnB0BGqpKwADuSgAAAQOqaapyAAAAAAAAAGDAAPZdAUqqbAEWqmwuge6boAaakj2qd6qKqpwAACMBGqp4wADuSwAAAQOqkqqcAAAAAAAAAGDAAPZdAUqqmAEWqpgugLCajwaalD2rKqtGrB8AAZwemhoAAAABA6tXrB8AAAAAAAAAXcAA9U4CYMAA9l1gmkYBPgNOq3+rhgAAgRBdwAC7FAJgwAD2XWCaRgEeq5TAALsWAAJgwAD2XWCaRgAARqu6q9qrxwAAAJwfYJpGABqr0pqIPgE9HKvogKviwAswf4CyAgACFqvxgavpwAswroHum6CBq/vACzCuAMAA9WNKrA4BgKwVwAswfwAACy8yAAsvbAALL6MACy/gAAswFwALME0ACzD1AAAABgKalz2sX6xlrt0DnCAAAAFgmqMAAAEEmpk9rKSsqwmcHwEarIvA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musBPwIIAZrugwDAC0K+CQDAAEQ1mtsDAAOAwABEO8ALQpOBwABEQcALQqCCwABESMALQq8AAwaa8D3AAERUwABEacAARHwBAJQ9ARrAAERVwADuSwAAAQPAAER1wABEfAAAAAAAAABgwADyswFKwABEeAEpBprxPcAARIHAAESVwABEtgEAWgEawABEgsAA7ksAAAEDwABEnMAARLYAAAAAAAAAYMAA9HkBSsAARJ8BNQAAAAEAYMAA9HkBFsAARJ8um7yaGpruIxzAAESngADAC0OCQQEAASsAABjAAESwWpq9gADAC0OCAWDAAPR5BprzPcAARLvAAETNwABFDgAAm7cBGsAARLzAAO5LAAABA8AARNHAAEUOAAAAAAAAAGCbAAFKwABE1wEfwABE25r1BAAEFsAARPAugheapRbAAET2LpPwmhqa0xbAAET+LoMVmqYWwABFBi6bvJoamu4AAAALQwcAC0NFAAtDwAALRDIAAAADApr2PcAARTHAAEU3wABGWAOOMgAAAWCaowAAAQSa+D3AAEW1wABFxBicKAEawABFpMAA7ktgmwABKwEFmv89wABFXsAARV7AAEWeAAAAA8AARWzAAEWeAAAAAgICwABFdwAAAIIXYJtIAMAARYEAAACDFWDAAPR5AABgmvYBPwEJAMAARYuazwIAAoDAAEWRwAtEpIHAAEWXwAtEsQADBpr6PcAARcnAAEXewABF8QEAlD0BGsAARcrAAO5LAAABA8AARerAAEXxAAAAAAAAAGDAAPKzAUrAAEXtASkGmvs9wABF9sAARgrAAEYVAQBaARrAAEX3wADuSwAAAQPAAEYRwABGFQAAAAAAAABgwAD0eQFKwABGFAGTBpr9PcAARhrAAEYswABGVgAAm7cBGsAARhvAAO5LAAABA8AARjDAAEZWAAAAAAAAAGCbAAFKwABGNgEfwABGOpr/AgACFsAARkkugheapRbAAEZPLoMVmqYAAAALROYAC0UkAAtFYQALRbsAAAADApsAPcAARznAAEdIwABkCweBowAAAWDAAPXFAAFgo/sBBJsDPcAAR0gABJMymhoAWwExAFsBGgCbBQAnBpsFPcAAR8bAAEfOwABIJQRBAAAAAAEDwABH08AASCUAAAADAgPAAEfeAAAAghdgm0gAwABH6AAAAIMVYMAA9HkAwABH/gAAAJwwYJo5ASsAYJsAAT01AAAAAJJZWwEaAJrPEwAABpsGPcAASITAAEiMwABJkgQBnDEAAAABA8AASJXAAEmSAAAAAgECwABImgAAAIMVYMAA9HkAwABIsAAAAJuvYJo5ASsAYJsAAT4ETsAASNDAAEjUAACcMWCbAAEfwABI2prPAwADGsAASPCbSoDAAEj1wAtGmYHAAEj9wAtGqAA9F8AASVyCwABJWMALRr6bvoLAAElnwAtGvpslPRfAAEl0gsAASXDAC0a+g2aCwABJe8ALRr6bI0rAAEmEAYLAAEmLwAtGvgabCD3AAEnXwABJ38AASegBApwmAAAAAQPAAEnowABJ6AAAAAAAAABgwAD0eQAGmwk9wABKRsAASk7AAEpYAQKEFwAAAAEDwABKWMAASlgAAAAAAAAAYMAA9HkABpsKPcAASrTAAEq8wABKwwECnCcAAAABA8AASsPAAErDAAAAAAAAAGDAAPR5AAabCz3AAEtHwABLUcAAS2ABApwoAAAAAQPAAEtgwABLYAAAAAAAAABgmwAABpsiPcAAS8/AAEvTwABL8gICnCgAAAABA8AAS+LAAEvyAAAAAQEBwABL6QAAAJu+YJsAAABcAAabDD3AAEv3wABMC8AATA4BAoITARrAAEv4wADuSwAAAQPAAEwOwABMDgAAAAAAAABgwAD0eQAGmw09wABMsMAATLrAAEzKAQCbzwAAAAEDwABMw8AATMoAAAAAAAAAYJsAAUrAAEzGASsGmw49wABNF8AATSDAAE0lAQKcKQAAAAEDwABNJcAATSUAAAAAAAAAYMAA8rMABpsPPcAATbHAAE26wABNxgECm7QAAAABA8AATcbAAE3GAAAAAAAAAGDAAPKzAAabED3AAE5OwABOV8AATmABApwhAAAAAQPAAE5gwABOYAAAAAAAAABgwADyswAGmxE9wABOqMAATrHAAE7GAQKcIgAAAAEDwABOxsAATsYAAAAAAAAAYMAA8rMABpsSPcAATyXAAE8uwABPOAECm9MAAAABA8AATzjAAE84AAAAAAAAAGDAAPKzAAabEz3AAE+CwABPi8AAT5UBApwqAAAAAQPAAE+VwABPlQAAAAAAAABgwADyswAGmxQ9wABQVcAAUF7AAFBpAQKUPQAAAAEDwABQacAAUGkAAAAAAAAAYMAA8rMABpsVPcAA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twQABCecWyecWhrAAH30miMawAB+CZ1jAASbWz3AAH42wAB+twacXABgm0gBIMAAfkKbtwYABCeA3yecXBrAAH5fmiUawAB+dp09ApwqKYG2KQSbXD3AAH7TwAB/QgacXQBgm0gBIMAAfuObtwUABCeXRSecXRrAAH8FmiEawAB/HJ1oAZwqKQSbXT3AAH+jwACAHAacXgBgm0gBIMAAf7abtwUABCecXyecXhrAAH/cmh0awAB/851pAZwqKQSbXj3AAIA4wACApAacYABgm0gBIMAAgEebtwUABCecYSecYBrAAIBomh0awACAf51qAZwqKQSbXz3AAIDAwACBBwacYgBgm0gBIMAAgNSbtwQABCeCpiecYhrAAIDsmhwawACA+50+AASbYD3AAIEjwACBagacYwBgm0gBIMAAgTebtwQABCeAmyecYxrAAIFPmhwawACBXp0/AASbYT3AAIGGwACCDgacZABgm0gBIMAAgZSbtwYABCeDgyecZBrAAIGzmiYawACBy51UApwqKYG2KQSbYj3AAIIqwACCnAacZQBgm0gBIMAAgjubtwUABCecZiecZRrAAIJemh0awACCdZ10AZwqKQSbYz3AAIK4wACDKgacZwBgm0gBIMAAgtSbtwQABCeWPyecZxrAAIMBmhwawACDEJ1MAASbZD3AAINGwACDnwacaABgm0gBIMAAg2CbtwQABCeC2iecaBrAAIN+mhwawACDjZ1OAASbZT3AAIO7wACEMAacaQBgm0gBIMAAg9ibtwQABCeZCiecaRrAAIQGmhwawACEFZ1NAASbZj3AAIRMwACEqwacagBgm0gBIMAAhFebtwUABCeAryecahrAAIRzmh0awACEip1AAZwqKQSbZz3AAITHwACFTQacawBgm0gBIMAAhNWbtwYABCdBJ5xrGsAAhPWaIxrAAIUKnVwCnCopgbYpBJtoPcAAhi/AAIaHBpxsAGCbSAEgwACGRpu3BAAEJ5xtJ5xsGsAAhmOaIxrAAIZ4nVsABJtpPcAAhqPAAIb0BpvxAGCbSAEgwACGupu3BAAEJ5kqJ5vxGsAAhtaaHBrAAIblnVcABJtqPcAAhxDAAIeOBpxuAGCbSAEgwACHG5u3BgAEJ4CLJ5xuGsAAhzeaJBrAAIdOnUECnCopgbYpBJtrPcAAh6rAAIgyBpxvAGCbSAEgwACHuJu3BgAEJ4FIJ5xvGsAAh9iaJBrAAIfvnV8CnCopgbYpBJtsPcAAiE7AAIjRBpxwAGCbSAEgwACIXJu3BgAEJ4OEJ5xwGsAAiHyaKBrAAIiOnXMCnCopgbYpBJttPcAAiO3AAIlgBpxxAGCbSAEgwACI/pu3BQAEJ5xyJ5xxGsAAiSKaHRrAAIk5nWABnCopBJtuPcAAiXzAAIoJBpxzAGCbSAEgwACJjZu3BgAEJ5KXJ5xzGsAAibGaKBrAAInDnXwCnCopgbYpBJtvPcAAiiXAAIqiBpx0AGCbSAEgwACKOZu3BQAEJ5x1J5x0GsAAimGaHRrAAIp4nX4BnCopBJtwPcAAir7AAIsCBpx2AGCbSAEgwACK0Zu3BAAEJ5YuJ5x2GsAAiuiaHBrAAIr3nUIABJtxPcAAix7AAIukBpx3AGCbSAEgwACLLJu3BgAEJ0QnnHcawACLTJotGsAAi2GdYgKcKimBtikEm3I9wACLwMAAjEoGnHgAYJtIASDAAIvRm7cGAAQngLInnHgawACL9ZocGsAAjASdYQKcKimBtikEm3M9wACMZsAAjOQGnHkAYJtIASDAAIxxm7cGAAQnXCeceRrAAIyNmiQawACMpJ1GApwqKYG2KQSbdD3AAI0AwACNiAacegBgm0gBIMAAjQ6btwYABCeBSiecehrAAI0umiQawACNRZ1WApwqKYG2KQSbdT3AAI2kwACOJwacewBgm0gBIMAAjbKbtwYABCeDgiecexrAAI3SmigawACN5J1eApwqKYG2KQSbdj3AAI5DwACOtgacfABgm0gBIMAAjlSbtwUABCecfSecfBrAAI54mh0awACOj51dAZwqKQSbdz3AAI7SwACPVwacfgBgm0gBIMAAjuCbtwYABCeBQSecfhrAAI7/mikawACPFJ1HApwqKYG2KQSbeD3AAI9zwACP5QacfwBgm0gBIMAAj4SbtwUABCecgCecfxrAAI+nmh0awACPvp1vAZwqKQSbeT3AAJABwACQeQacgQBgm0gBIMAAkBWbtwUABCecgiecgRrAAJA7miwawACQT51uAZwqKQSbej3AAJCVwACRBAacgwBgm0gBIMAAkLCbtwQABCeZKSecgxrAAJDcmhwawACQ651DAASbez3AAJEgwACRfAachABgm0gBIMAAkTmbtwQABCeDnCechBrAAJFWmi0awACRa51FAASbfD3AAJGYwACSDwachQBgm0gBIMAAkbSbtwQABCeZCSechRrAAJHgmi0awACR9Z1EAASbfT3AAJIrwACSvAachgBgm0gBIMAAkjubtwYABCeSliechhrAAJJcmioawACSd51TApwqKYG2KQSbfj3AAJLYwACTUAachwBgm0gBIMAAkuubtwUABCeciCechxrAAJMQmh0awACTJ51yAZwqKQSbfz3AAJNswACTvAaciQBgm0gBIMAAk4GbtwQABCeBMSeciRrAAJOami0awACTr51IAASbgD3AAJPYwACUVgacigBgm0gBIMAAk+6btwUABCeE8yecihrAAJQWmh4awACUKp1aAZwqKQSbgT3AAJRywACU9AaciwBgm0gBIMAAlH+btwYABCddJ5yLGsAAlJ2aKRrAAJSynUkCnCopgbYpBJuCPcAAlRDAAJV/BpyMAGCbSAEgwACVIJu3BQAEJ5yNJ5yMGsAAlUKaHRrAAJVZnW0BnCopBJuDPcAAlZvAAJYNBpyOAGCbSAEgwACVrZu3BQAEJ5yPJ5yOGsAAldGaLBrAAJXlnWwBnCopBJuEPcAAlinAAJabBpyQAGCbSAEgwACWOpu3BQAEJ4DWJ5yQGsAAllyaHxrAAJZ0nUoBnCopBJuFPcAAlrfAAJc8BpyRAGCbSAEgwACWz5u3BQAEJ5ySJ5yRGsAAlvmaLRrAAJcOnXcBnCopBJuGPcAAl1jAAJfiBpyTAGCbSAEgwACXcpu3BQAEJ5mmJ5yTGsAAl56aIBrAAJeynXgBnCopBJuHPcAAl/7AAJiUBpyUAGCbSAEgwACYG5u3BQAEJ5yVJ5yUGsAAmEqaHRrAAJhhnXkBnCopBJuIPcAAmLDAAJkDBpyWAGCbSAEgwACYyJu3BAAEJ5ODJ5yWGsAAmOSaHBrAAJjznU8ABJuJPcAAmR/AAJmqBpyXAGCbSAEgwACZLZu3BgAEJ0knnJcawACZTJoqGsAAmWedUAKcKimBtikEm4o9wACZxsAAmjgGnJgAYJtIASDAAJnXm7cFAAQnnJknnJgawACZ+podGsAAmhGdWAGcKikEm4s9wACaVMAAmtwGnJoAYJtIASDAAJphm7cGAAQngz4nnJoawACaf5oqGsAAmpqdUgKcKimBtikEm4w9wACa+MAAm2cGnJsAYJtIASDAAJsIm7cFAAQnnJwnnJsawACbKpodGsAAm0GdawGcKikEm409wACbg8AAnCIGnJ0AYJtIASDAAJurm7cEAAQnmWMnnJ0awACb8pocGsAAnAedVQAEm449wACcPsAAnOcGnJ4AYJtIASDAAJxmm7cEAAQnnJ8nnJ4awACcrJocGsAAnMGddgAEm489wACdA8AAnYYGnKAAYJtIASDAAJ0Rm7cGAAQnkpUnnKAawACdMJorGsAAnUOdUQKcKimBtikEm5A9wACdosAAnkAGnKEAYJtIASDAAJ22m7cGAAQnkpgnnKEawACd3JoqGsAAnfedcQKcKimBtikEm5E9wACeXMAAnuEGnKIAYJtIASDAAJ5zm7cFAAQnnKMnnKIawACenZodGsAAnrSdcAGcKikEm5I9wACe/cAAn00GnKQAYJtIASDAAJ8Um7cEAAQnnKUnnKQawACfL5ocGsAAnz6dOgAEm5M9wACfacAAn70GnKYAYJtIASDAAJ+Bm7cEAAQngqUnnKYawACfnpocGsAAn62dOwAEm5Q9wACf2cAAoFAGnKcAYJtIASDAAJ/2m7cEAAQnm4InnKcawACgJpocGsAAoDWdWQAEm5U9wACgbMAAoREGnKgAYJtIASDAAKCSm7cEAAQnnKknnKgawACg2JocGsAAoO2dfQAEm5Y9wAChLcAAoTwGm9QAYJtIARrAAKE6mkkEm5c9wAChWMAAoWcGm/oAYJtIARrAAKFlmmoEm5g9wAChtcAAojAGnKoAYJtIASDAAKHHm7cFAAQnnKsnnKoawACh+JocGsAAogedMwGcKysEm5k9wACix8AAozgGnKwAYJtIASDAAKLYm7cFAAQnnK0nnKwawACjAZocGsAAoxCdNgGcKysEm5o9wACjxMAArLsGnK4AXcAA9R0BYJtIATrAAKPKYJtIRhrAAKPrm0oawACj/ptLGsAApBSbTBrAAKQvm00awACkSZtOGsAApFybTxrAAKR+m1AawACkmJtRGsAApLubUhrAAKTRm1MawACk6ptUGsAApQ2bVhrAAKUpm1cawAClO5tYGsAApU+bWRrAAKVmm1sawACleZtcGsAApZCbXhrAAKWmm18awAClu5tgGsAApdCbYRrAAKXlm2IawACl/ZtjGsAApiCbZBrAAKY7m2UawACmX5tmGsAApnGbZxrAAKaGm2kawACmnptqGsAAprCbaxrAAKbFm2wawACm2pttGsAApvKbcBrAAKcGm3EawACnG5tyGsAApzObcxrAAKdFm3QawACnWpt1GsAAp2+bdhrAAKeHm3cawACnnJt4GsAAp7SbeRrAAKfPm3oawACn8Zt7GsAAqAubfBrAAKgum30awACoRZt+GsAAqF+bfxrAAKh1m4AawACokpuBGsAAqKabghrAAKi9m4MawACo1puEGsAAqO6bhRrAAKkNm4YawACpLpuHGsAAqVKbiBrAAKlrm4kawACpgJuKGsAAqZibixrAAKmsm4wawACpw5uNGsAAqfKbjhrAAKohm48awACqNpuQGsAAqlGbkRrAAKpvm5IawACqh5uTGsAAqqCblBrAAKrEm5UEm5s9wACsysAArM4JghwAYMAA9HkABJucPcAArUPAAK1NCZvTAGDAAPKzAASbnT3AAK2gwACtqgmcKgBgwADyswAEm549wACuSMAArlkJm90AYMAA8rMABJufPcAArs7AAK7lCYG2AGDAAPKzAASboD3AAK+FwACviwmB7gBgwAD2XQAEm6E9wACvysAAr84JgLAAYMAA9l0ABJuiPcAAsE3AALBXCZlcAGDAAPR5AASboz3AALCmwACwsQmcKwBgwAD2XQABBZu3PcAAsLbAALC8wACx/wEAAAPAALDFwACx/wAAAAkEBMAAsMsAAASB7mDAAPZdAMAAsNgAAASAsGDAAPZdAMAAsOMAAASZXGDAAPR5AMAAsPQAAASCHGDAAPR5AAXAALEGAAAEm9NgwADyswEqwACxJAAABJwqYMAA8rMBKsAAsUIAAASb3WDAAPKzASrAALFnAAAEgbZgwADyswEqwACxlAAAAJwrYMAA9l0BJ5yvYJtIAT8KCAGboIAAwAtoBggBm6GBAMALaBUIAZuiggDAC2gkCAGbm4MAwAtoMwgBm5yEAMALaEMIAZudhQDAC2hTCAGbnoYAwAtoYwgBm5+HAMALaHMIAJujIxzAALHYFMAAsczAC2iDCABBAQABJ5yvAMAA9myAwACx68ALaAYUwACx9MALaIMIAAFgwAD2XQkBwACwvMAA9dsAAAAAEAabpT3AALJawACyY8AAspoBAJywAAAAAQPAALJ2wACymgAAAAAAAABgwADyswFKwACyeQEcwACyhBbAALJ5Lplcm6JBAQAB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AMALlxcbAEEBAAErAAArFop/FADAC5cXGwCc/cAA+S4BYMAA+U0jHIqPFADAC5cLGwBBAQABKwAAKxaKjxQAwAuXCxsAnP/AAPlQAWDAAPR5TYqhAjUAAAAAAFsBHoqhwACyAAQABByKqxSKp8ALj8UUACABAAEkir0EJ50AFIqywAuWPxoAJ4KmFIq4wAuW/BsAAACHAMALjzoUAMALj0MIABQAwAuPjhAAACs9FADAC4+hEQBNisYCNQAAAAAAWwEeisbAALIABAAEFIrMwAuU1BkAhwDAC486FADAC49DCAAUAMALj44QAAArPTWKxgAAAQBgwAD5IQEUAMALj6ERADUAAAABAFsBF4rmForeFIrcwAuYHxwAnQHAAPkrnQIaiwDAAPi/wAD4ljUAAAABAFsBHIsPFIsNwAuYHxwAghEBAAEUixXAC5R1FgAAwADpXBQAwAuYHxwATYsiAjUAAAAAAFsBHosiwACyAAQABByLMBSLKMALlNQZAIIPAAAAAMAA+TCHAMALjzoUAMALj0MIABQAwAuPjhAAACs9FADAC4+hEQBNiz8CNQAAAAAAWwEeiz/AALIABAAEHItJFItFwAuPxRQAIAEAASeBMQAAhwDAC486FADAC49DCAAUAMALj44QAAArPRQAwAuPoREAPwEBi1pbAYthAAABgwZbAAGLZAAAAYT7YMAA9jEAPgRNi20CNQAAAAAAWwEei23AALIABAAEHIt3FItzwAuPxRQAIAEAASSLlAUngKMei32b8QEAARSLisALmSwYAAAngKMUi5DAC5k2GQAngKMAAIcAwAuPOhQAwAuPQwgAFADAC4+OEAAAKz0UAMALj6ERAE2LmwI1AAAAAABbAR6Lm8AAsgAEAAQci6UUi6HAC4/FFAAgAQABJIvEAyedAxSLucALlHUWACedBAAAhwDAC486FADAC49DCAAUAMALj44QAAArPRQAwAuPoREAPRyL1BSLzcALlJgXAIIPAQAAAZz5KcAA+RtNi+oCNQAAAAAAWwEei+rAALIABAAEHIv0FIvwwAuPxRQAIAEAASeAowAAhwDAC486FADAC49DCAAUAMALj44QAAArPRQAwAuPoREAPY2L/sALjyAejAnAALL0AgFfAAACgIwZwAuOwYGMIMALjsoAQgAAPR4AwACyAwIAAoQAwAuPAYUAwAuP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SqPADIklCwAAwAD1Lj01AAAAAQBdwAD1HQFgjEcBhsAASrXADIhVIxzAAErNFADADInTDABBAQABKwAAKxzAAErNFADADInTDABPAQABFMAAStHADIklCwAAwAD1LgFcPgI9HMAASxAUwABK8sAMiMkJAICyAgACFsAASxkUwABLEcAMiSULAJHhjEkUwABLJsAMiSULAADAAPVjPRzAAEtaFMAASzfADIjzCgCAsgIAAhbAAEtjFMAAS1vADIklCwCR4YxJFMAAS3DADIklCwAAwAD1Y07AAEuWwABLnwAAmkJdwAD1HQFgwAD23gEewABLpcAA8CQBAWDAAPbeAZMAPRzAAEu/FMAAS7bADIqbCwCAmQEAAYHAAEvGwAyH8gDAAPUvRsAAS9QAwABL6AAAAIQJXcAAT3ECYMAAUE5bAILAAEvzwAyIB0E+BEnAAEwMIhzAAEwjFsAATBwWwABMGBTAAEwQwAyK8AwAgKDAAE+DgUzAAPbkQQEAASeDbwDAAPZsACEWwABMORTAAEwxwAyK8AwAlD3AAE98PgFCwABMUAA/TsAATHDAAEx0AACFRWCMRwEmwABMcAEWwABMfhTAAEx2wAyK8AwAgdPAAE+CYIxHPRzAAEyqFMAATIzADIjJCQCAsgIAAhbAAEyzFMAATKvADIrwDACAoMAAT4MUwABMusAMi2wNAADAAPVjPRzAAEzPFMAATMXADIifCACAsgIAAhbAAEzYFMAATNDADIrwDACAoMAAT4MUwABM38AMi2wNAADAAPVjTsAATPzAAE0CAACe1WCrMAEfwABNCKs4AQABFMAATRXADIifCAAAQ8AATSYiFsAATTYUwABNLcAMipsLAINowAD1AAAWwABNYxTAAE1EwAyIyQkAg2jAAPV0PgJOwABNe8AATX8AAICgYMAA9t4BHMAATYoUwABNgcAMipsLAJWmAAAAAMAA9TxJwABNnhzAAE2tFMAATaLADIifCACB3QEAARTAAE25wAyMcA0AAMAA9WE+BEbAAE3JwABN9sAATdIAAACe1mDAAPbeABzAAE3kFMAATd7ADIwUDACe1wEAARTAAE3wwAyMcA0AAKs2PgE9HMAATgsUwABOAsAMipsLAE8BAAEUwABOD8AMjNEOAADAAPUuPRzAAE43FMAATizADIifCACT4AEAARTAAE4+wAyM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Lp8hnjIAwAD05oChAAAAAMAA9PEGnjJMwABBHcAAQSvAAEFRAAKfIQAAAAEDwABBPcAAQVEAAAABAQHAAEFMAAAAg7JgkuEAAGCS4QAGnjNMwABBVsAAQV/AAEhgAACWAgAAAAEDwABBcMAASGAAAAABAQHAAEF+AAAAg7JgkpwAAGCSWQE+C07AAERTwABEWQAAmOtgnh8BIxbAAERvFsAARGCAwABEW8AM2xSSXpKegPzAAPT/LhzAAESALp8tAAAAAJ4mAWCeH07AAESfwABEpgAAny5gwAD0eQEWwABErS6fLJ4jPRzAAET7gcAARPXADNspnyAAAAAAnidOwABFFcAARSQAAJJeXcAA9R0BYJLhARzAAEUsgcAARSbADNspnwoBAAEWwABFRYDAAEVAwAzbFJJekp4AnjFOwABFXsAARXMAAJRsXcAA9R0BYJJZASMWwABFjxbAAEV6gMAARXXADNsUlGySoID8wAD0/zrAAEWhYJJZABzAAEXpHMAARdgWwABFw4DAAEW+wAzbFJRskqCAnwEBYJJZARbAAEXigcAARdzADNspnxqeKgDAAPTmgKEAAAAAwAD08QFdwAD1HQFgkllOwABF+8AARgsAAJRtXcAA9R0BYJLGASMWwABGIhbAAEYSgMAARg3ADNsUlG2SoYD8wAD0/zrAAEY0YJLGABzAAEaBHMAARmcWwABGV4DAAEZSwAzbFJRtkqGAnwEBYJLGARbAAEZxgcAARmvADNsplg6eKQDAAPTmgKEAAAAAwAD08QFdwAD1HQFgksY9HMAARpWBwABGj8AM2ymfIAAAAACeJ07AAEavwABGugAAlNxgklkBHMAARsKBwABGvMAM2ymfGgEAARbAAEbNgMAARsjADNsUlNySowCeKk7AAEbnwABG8wAAlf5gklkBIxzAAEcOFsAARwKAwABG/cAM2xSV/pKiQQEAASsAksIrHMAARyWBwABHH8AM2ymfGgEAARbAAEcwgMAARyvADNsUlf6SogCeKgFgkllJwABHQhzAAEdWFsAAR0sunyyeI0EBAAGCwABHWcAM22sAwAD1nErAAEdhAYDAAEdowAzbFD9KwABHcgEfwABHfZK0BgAChMAAR4rADNvehsAAR6DADN0PBJRthcAAR8XADNxrkl6DwABH7sAM25+UxxbAAEgjgMAASB7ADNsUlMeSn5X+JsAASFABh8AASFDADN1IYJK1Bp40TMAASGXAAEhqwABJHAAAny8AAAABA8AASHvAAEkcAAAAAQEBwABIjQAAAIHTYJ4fAABcAT4DTsAASJ/AAEikAACDsmCeHwEuQ8AASLAhHMAASLyBwABIt8AM3nZBAQABgMAASL/ADN5jAMAA9dI+Aj01AAAAAQBgnh8BgcAASNHADN52F8AASNaCwABI1sAM3rGfLBzAAEjPFsAASNaCwABI1sAM3rGfLJ4jXQEAAZQAwAD1np4jPYnAAEjowAzedhbAAEj0gcAASO/ADN52nyieIT01AAAAAQBgnh8BgMAASQfADN5jF8AASQ6CwABJDsAM3xSfLBzAAEkFFsAASQ6CwABJDsAM3xSfLJ4jXQEAAZQAwAD1np4jBp41TMAASSHAAEkqwABKhQAAnxcAAAABA8AASTfAAEqFAAAAAQEBwABJRgAAAJJLYJLhAABgklkBPgNOwABJWsAASWYAAH5gnh8BLkPAAElyIRzAAEmFgcAASXnADN+VQQEAASsAwAD10j4DTsAASZrAAEmmAACUF2CSWQEcwABJtIHAAEmowAzflZPfAgACgMAASbvADN+AFsAAScUunyueIgCeJUnAAEneIRzAAEnugsAASeLADN/GQQEAASsAkl0+Aj0cwABKAS6fLwEAAYHAAEoTwAzflQCeNErAAEopAYLAAEowwAzfxj89icAASkvADN+VFsAASmWBwABKWcAM35WfKJ4hSsAASnYBKwaeNkzAAEqKwABKk8AASvgAAJYQAAAAAQPAAEqpwABK+AAAAAEBAcAASrwAAACDsmCS0wAAYJJZAT4BSsAASsgBNQAAAAEAYJJZARzAAErPLp8XAQABFsAASuKAwABK3cAM4I+Az5LVAJ41IxzAAErtgQDADOCqQQEAASsAAIDAAErwwAzgj4EAwAzgqgFgklkAAAzUegAM1LQADNTmAAzVGgAM1hgADNbRAAzXHAAM11QADNeMAAzXxAAM1/wADNj6AAzaCgAM2rQADNrtAAzePAAM31kADOBoAAzg+QAAABICnjlMwABK/cAASwPAAE6zA58wAAABYJ4XAAACBJ47TMAASz7AAEtHGJomAGDAAPR5AZMEnjxMwABLUMAAS2IYnzEAYMAA8rMBKgEFnkFMwABLZ8AAS2fAAEwQAAAA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BqDUVLRBtEO0egAAlTYAAAABA7RRtHoAAAABAQG0XAAAAIOyYI8tAABfAAABSrRlARy0ZS6WfAEAAYC0dcANyc0AoHkGoNVUtH60gLTDAACVOAAAAAEDtJS0wwAAAAEBAbSlAAAAg7JgjzsAAF8AAAFKtK4BHLSuLpZ8AQABgLS+wA3KEQCgeQag1lS0x7TJtQIAAJXIAAAAAQO02LUCAAAAAQEBtOQAAACDsmCRngAAXwAAAUq07QEctO0ulnwBAAGAtP3ADcpVAKB5BqDXVLUGtQi1NwAAldUAAAABA7UStTcAAAABAQG1GQAAAIOyYJHYAABfAAABSrUiARy1Ii6WfAEAAYC1MsANypkAoHkGoNhUtTu1PbVyAACVkAAAAAEDtUq1cgAAAAEBAbVUAAAAg7JgkLkAAF8AAAFKtV0BHLVdLpZ8AQABgLVtwA3K3QCgeQag2VS1drV4ta8AAJZYAAAAAQO1hrWvAAAAAQEBtZEAAACDsmCT3wAAXwAAAUq1mgEctZoulnwBAAGAtarADcshAKB5AAANsZQADbHGAA2yCgANsk4ADbKSAA2y1gANsxoADbNeAA2zogANs+YADbQqAA20bgANtLIADbT2AA21OgANtX4ADbXCAA22BgANtkoADbaOAA220gANtxYADbdaAA23ngANt+IADbgmAA24agANuK4ADbjyAA25NgANuXoADbm+AA26AgANukYADbqKAA26zgANuxIADbtWAA27mgANu94ADbwiAA28ZgANvKoADbzuAA29MgANvXYADb26AA29/gANvkIADb6GAA2+ygANvw4ADb9SAA2/lgANv9oADcAeAA3AYgANwKYADcDqAA3BLgANwXIADcG2AA3B+gANwj4ADcKCAA3CxgANwwoADcNOAA3DkgANw9YADcQaAA3EXgANxKIADcTmAA3FKgANxW4ADcW0AA3F+AANxjwADcaAAA3GxAANxwgADcdMAA3HkAANx9QADcgYAA3IXAANyKAADcjkAA3JKAANyWwADcmwAA3J9AANyjgADcp8AA3KwAANywQADctIAAAAYQKg3FS1tLW6uCoDnM4AAQAAk9xgwAD1xQFbAWDAAPXFAAAAAQWg6FS10bXXtegBAAADtea16AAAAAAAAABdoNwBXwAAAT8BCQG118AA9dsAAAAACQag3lS17bXvthUA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AKEwBqE4VMAATG3AAExvwABMxAAAljcAAAABA8AATInAAEzEAAAAAQEBwABMlwAAAIOyYJNyAABfAAABSsAATKYBHMAATKYul1UBAAGAwABMv8AN5foAoTAGoTlUwABMyMAATMrAAE0dAACWOgAAAAEDwABM48AATR0AAAABAQHAAEzwAAAAg7Jgk4MAAF8AAAFKwABM/wEcwABM/y6XVQEAAYDAAE0YwA3mUAChMAahOlTAAE0hwABNI8AATYAAAJY9AAAAAQPAAE1BwABNgAAAAAEBAcAATVMAAACDsmCTlAAAXwAAAUrAAE1iARzAAE1iLpdVAQABgMAATXvADeamAKEwBqE7VMAATYTAAE2GwABOBgAAlkMAAAABA8AATbDAAE4GAAAAAQEBwABN2QAAAIOyYJOnAABfAAABSsAATegBHMAATegul1UBAAGAwABOAcAN5vwAoTAGoTxUwABOCsAATgzAAE5nAACWSgAAAAEDwABOKcAATmcAAAABAQHAAE46AAAAg7Jgk7YAAF8AAAFKwABOSQEcwABOSS6XVQEAAYDAAE5iwA3nUgChMAahPVTAAE5rwABObcAATtAAAJZNAAAAAQPAAE6OwABO0AAAAAEBAcAATqMAAACDsmCTxgAAXwAAAUrAAE6yARzAAE6yLpdVAQABgMAATsvADeeoAKEwBqE+VMAATtTAAE7WwABPOQAAllAAAAABA8AATvfAAE85AAAAAQEBwABPDAAAAIOyYJPUAABfAAABSsAATxsBHMAATxsul1UBAAGAwABPNMAN5/4AoTAGoT9UwABPVcAAT1fAAE+CAACXXwAAAAEDwABPbcAAT4IAAAABAQHAAE91AAAAg7JgjRMAAF8AAAFKwABPfgErBqFAVMAAT4bAAE+IwABPxwAAlL4AAAABA8AAT5vAAE/HAAAAAQEBwABPogAAAIOyYI0xAABfAAABSsAAT6sBHMAAT6sul18BAAGAwABPwsAN6JQAoT8GoUFUwABPy8AAT83AAFAYAACUxAAAAAEDwABP5sAAUBgAAAABAQHAAE/zAAAAg7JgjV4AAF8AAAFKwABP/AEcwABP/C6XXwEAAYDAAFATwA3o6gChPwahQlTAAFAcwABQHsAAUGUAAJTbAAAAAQPAAFA1wABQZQAAAAEBAcAAUEAAAACDsmCNnwAAXwAAAUrA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DhZKAA4WtgAAABUAAAFUAA4XFQANmOYADab5AA2tLAANruEADbEkAA3M1QANz6gADdMeAA3XoQAN2ZgADeueAA3sawAN7hUADgPqAA4NeAAOFxMAAAAPAA4XFQAAAAAAob2h41UAAAGA+QAAi/MAAAAAAAECob5Vh4OHiZh9A4SMAAABYMAA9cUAAAYEocFVh6mHsBih5KG9AGChvgAEocRVh+qH7gmAsABgwAD2XQAEocJViACICxih5aG9AGChvgAEocNViCuINBih5qG9AF3AAPVOAmDAAPZdYKG+ASsEocVViHuIhBiUHABgjDcBKwShxlWIvojIGCcAYMAA9HkBHIjGlIFWAAAAAMAA9JwCBaHeVYjNiM2JbwCAqKG9AAOI3IlvAAAAAgICiOIAAASh5GChvgCI8AAABICwYMAA9l0AAGChvgE+A0AhHIkIFokDLoCwocRBAQABKwDAAPZsiQOJDwBAIRyJJBaJHS6SUaHIQQEAASsAwAD10okdiSsAPReJMi6h5aG9IxaJSBaJQC6h5KG9ocGXA6HJLhaJYBaJWC6h5KG9ocGh5aG9ocIBYKG+ocIECAGhwisIAaHBgADADhg0CAGhxIEAwA4YPwkBiM3AAPXbAAAAAAWh31WJdIl0ic4AhPQAA4mGic4AAAAAAAAAYKG+AT8ECAChwSsIAKHCKwgAocQnAAkBiXTAAPXbAAAAABMGochVh7WHx4fYAQCSUQAAAAEDh86H2AAAAAAAAABgob4BSofRARaH0S6h5KG9ocEGoclVidOJ3In1AQCXAwAAAAEDieOJ9QAAAAAAAABgwADyswFKieYBHInuFonmLqHkob2hwUEBAAErAMAA9dIGocpVifmKC4okAQCXKAAAAAEDihaKJAAAAAAAAABgob4BSooZARaKGS6h5aG9ocIGoctViimKRYqDAQCXAQAAAAEDik6KgwAAAAAAAABdwAD02wFgob4BSopXATUAAAABAF3AAPTbAWChvgE1AAAAAQBdwAD1TgJgwAD2XWChvgEWilcuoeahvaHDIxyKYoAAwA4Z/0EBAAErAAArFopigADADhn/KcAA9XEBXcAA9NsBYKG+IxyKaYAAwA4Z70EBAAErAAA6imxgob4AgADADhnvAV3AAPTbAWChvgahzFWKiIqkiscBAJcCAAAAAQOKs4rHAAAAAAAAAF3AAPTbAWChvgFKirYBNQAAAAEAXcAA9U4CYMAA9l1gob4BFoq2LqHmob2hwyMcisGAAMAOGpxBAQABKwAAKxaKwYAAwA4anCnAAPVxAV3AAPTbAWChvgahzlWKzIrRiygAAKHnAAAAAQOK2YsoAAAAAQEBiuEAAACAsGDAAPZdAABgwADyswE+AUqK7QEiIRyK/haK9C6h5qG9ocNBAQABKwDAAPXSAByLExaLCS6h5qG9ocOB3QEAAYCLH8AOGwEAwAD1YQahz1WLLYs7i8YAAJRMAAAAAQOLQ4vGAAAAAQEBi0sAAACAsGDAAPZdAABgob4BPgJOi1uLXwAAgJ9dwAD1TgJgwAD2XWChvgE1AAAAAQBdwAD1TgJgwAD2XWChvgEWi2EuoeahvaHDIxyLa4EAwA4bnUEBAAErAMAA9dIXi2EuoeahvTKLhmDAAPZdYKG+AKHDgQDADhudAV3AAPVOAmDAAPZdYKG+SouOATUAAAABAF3AAPVOAmDAAPZdYKG+AYGLlcAOG4U1AAAAAQBgwAD2XQGAi5nADhtwNQAAAAEAYKG+ARyLmIKLmMAOG/9EAQABg4uYwA4cGwDAAPViIxyLn4QAwA4cLkEBAAErAMAA9dI1AAAAAQBgob4BH4unod4CAAIugIu9wA4bcAA1AAAAAQBcARyLmIKLmMAOG/+AsgIAAoOLmMAOHBuFAMAOHGYAwAD1Y4UAwA4cZoQAwA4cLgFgob4GodBVi8uL2YzuAACWVQAAAAEDi+iM7gAAAAEBAYvtAAAAgKBgwAD23gAAYKG+AT4BSozTARyM2i6UTAEAASSM6QGAjOXADhzWAKHPBqHRVYzzjQGNqQAAoegAAAABA40ajakAAAABAQGNIAAAAICwYJIyAABgob4BPgFKjSwBIxaNOICNM8AOHSKV6pI5HI10HI1MLpZVAQABFo1pFo1hgI1cwA4dIoQJkjiR4YxJAKHQlEwBAAEWjYKAjX3ADh0igLCSNQChzxyNki6UTAEAARaNoICNm8AOHSKAsJI1AKHPAWChvgah0lWNro28jkMAAJRLAAAAAQONzo5DAAAAAQEBjdYAAACSW2CNEwAAYKG+AT4BSo3kARyOGRyN6y6UTAEAAR6N9KHbAQABgI4HwA4dvAAAoc+h6AEAARaOOoCOM8AOHbyAsI0XAKHRBqHTVY5IjlaOugAAlEkAAAABA45pjroAAAABAQGOcgAAAJRHYIypAABgob4BPgFKjoIBHI6fHI6JLpRMAQABJ5gRAKHPlEwBAAEWjrGAjqjADh4kgLCMrQChzwah1FWQ8ZD2kqUAAJZTAAAAAQORAJKlAAAAAQEBkQ8AAACUFmChvgAAXAE+BkmRHByRLhaRJoCRIMAOHn+h5KG9ocFBAQABLgDAAPXSSpE3AD9JkUMiIRyRURaRRy6h5qG9ocNBAQABKwDAAPXSAByRZhaRXC6h5qG9ocOB3QEAARaReICRcsAOHn+AsKHEAMAA9WE+AT0wkYckAAUnoekuJ6HqJ6HrFpHrgJHlwA4ef4CwocQ/PRySCxaSA4CR/cAOHn+h5KG9ocGh7AEAARaSHYCSF8AOHn+AsKHEAKHVPReSLoCSKMAOHn+h5KG9LqHBSZJCHJJQFpJGLqHmob2hw0EBAAErAMAA9dI9F5JZLqHmob0yknxgwAD2XWChvgChwz89HJKNFpKELqHmob2hw4CyAgACFpKUgJKOwA4ef4CwocSAkpzADh5/AMAA9WMGodVVkqqSr5LpAACh7AAAAAEDkrqS6QAAAAEBAZLCAAAAgLBgwAD2XQAAXAE+AT01AAAAAQBdwAD1TgJgwAD2XWChvgEWks4uoeahvaHDIxyS2YEAwA4f5EEBAAErAAArHJLZgQDADh/kk+ABAAGAkuDADh/QAMAA9WsBYKG+BqHWVZLukvOUXgAAlEoAAAABA5L5lF4AAAABAQGTBAAAAIHTYIw3AABcAT4FSZMSHJMgFpMWLpQcocVBAQABgJMjwA4gTwDAAPXSSpMrAD9JkzchHJNFFpM7LpQcocVBAQABKwDAAPXSPgE9MJNWJJN0Ai4noe0/SZOAIRyTmRaTi4CThMAOIE+UHYw5QQEAASsAwAD10j4BPTCTqiQABieh7i4nnQAWk8+Ak8jADiBPg7KMOieh7xaUB4CUAMAOIE+UHYw5Pz0XlCmAlCLADiBPlB0ujDk9F5RILpQcgJRUwA4gT6HFBqHXVZRjlGiU/wAAofAAAAABA5RulP8AAAAAAAAAXAE+BEmUdxyUhRaUey6UHKHFQQEAASsAwAD10kqUjgA/QByUuRaUqxaUoS6UHKHFlB2MOUEBAAEuAMAA9dKUoZTAAD0XlNEWlMculByhxZQdK4w5PReU6y6UHCuhxQah2FWVBJUJldQAAJZXAAAAAQOVEpXUAAAAAAAAAFwBPgM9HJUbLqHwAAAAAKHXTpVBlUsAAKHxXcAA9NsBYKG+ARaVTS6XAqHMSZVhIRyVb4CVZcAOIcVBAQABKwDAAPXSPgFGlYCVp5WTAAAAlBZgob4AgJWcwA4hxT4BPRyVt4GVscAOIf6WVwAAAACh2D8GodlVldmV4JYZAAAjAAAAAQOV6JYZAAAAAAAAAGDAAPZdAUqV7gEjHJX2FpXuLqHkob2hwUEBAAErAMAA9dInhPQklhkDFpYLLpJRocgnle0WlhQugLChxAFgwAD2XQah2lWWHpYoln0AAJfqAAAAAQOWNJZ9AAAAAAAAAGCMNwE+AUqWPQE1AAAAAQBgjDcBFpZELpQcocUjHJZOgADADiKuQQEAASsAwAD10heWRC6UHDWWVwAAAQBgjDcBH5ZXjEYAAAAANQAAAAEAWwEXlmSBlmLADiLalB0ujDmBAMAOItqhxYAAwA4irgFgjDcGodtVloKWkJh7AAGh8gAAAAEDlqKYewAAAAEBAZaqAAAAkltgjRMAAGDAAPZdAT4FSZa4JZbDgJa8wA4jM2CNnz4ESZbZFpbkFJbdwA4jMwABYI2fhECNu0qW7gEnmBM/SZcHFpcSFJcLwA4jMwABYI2fhEGNvEqXHAEnmBQ/SZc1FpdAFJc5wA4jMwABYI2fg+ONwEqXSwEnmBU/SpdmASeYED9Jl4Mll46Al4fADiMzYI0xPgFKl6ABJ5gSP0mXvCWXx4CXwMAOIzNgjV4+AUqX3wEnmBY/SZgBJZgMgJgFwA4jM2CNfT4BSpg2ASeYFT89MJhVJJh3Aieh84CYcMAOIzMAAA4ZIwAOGVMADhmSAA4ZwgAOGm8ADhrkAA4bUwAOHLkADh0FAA4dnwAOHgcADh5iAA4fswAOIDIADiEZAA4hlQAOIiYADiKFAA4jFgAOJBsAAAATAAABVQAOJHIADhd8AA4kcAAAAAEADiRyAAAAAACh4KH0VgAAASgAAIvzAAAAAAABAqHhVoEfgSWC9AOdswAAAWDAAPXFAAACBKHjVoHhgfQGofUAYMAA9HkBHIHwlIOCAQABkwDAAPSVBKHkVoJrgoIGofYAYMAA9HkBHIJ+lIOCAQABlADAAPSVAQWh5gAAAAAEAAADAAAAAAAAAAAAYKHhAT8BCQEAwAD12wAAAAAAAAAOJSEAAAAAAAABVgAOJSwADiSgAA4lKgAAAAEADiUsAAAAAACh56H3VwAABYD7AACL8wAAgQ4AAJgAAACBLQAAmK4AAIFHAACdvAAAgWQAAMAAQ5IAAQEBofgAAAGh6VeBzaH5AABeAAICAmCMFWDAAPZdAAFXoekAXAACgeMAAACDsmCMFQCB8AAAACJgwAD2XQAAAgKh6leB+4IKlhAHnRkAAAFgog8AAAYEoexXgkSCTQmEKgBgmK8ABKHtV4JggmgYlG4AYJKLASsEoe5XgnaCgBiU3ABgklkBKwSh71eCjYKWGKH6AGCSWQErBKHwV4KmgssYofsAYI5UARqCx45aBKHxV4NUg2AYofwAXgACAgJgjBVgwAD2XQABV6HpAFwBKwEFog5Xg2WDZYORAKH9AAODgYORAAAAAQEBg4cAAASEKmCYrwAAYKHqAT8CCAGh7IAAwA4mYgkBg2WiIAAAAAAYBqHzV4OWg56EJQQBAAAAAAEDg62EJQAAAAICAoO4AAAAhCpgmK8Ag9IAAACEK2CYDAAAYKHqAT4BSoPjAR+D7sAAQ5kCAAKAhAzADialgYQXwA4msAAGofVXhCqEPIRnAQCVoAAAAAEDhEeEZwAAAAAAAABgkosBSoRKARaEYBaEVBaESi6EKqHsmw2ZE5SmjPwGofZXhGuEfYSkAQCVCwAAAAEDhIaEpAAAAAAAAABgkosBSoSJARaEnRaEkxaEiS6EKqHsmwuZEZSmjPwGofdXhKiEuoThAQCVOwAAAAEDhMOE4QAAAAAAAABgkosBSoTGARaE2haE0BaExi6EKqHsmuGY9pSmjPwGofhXhOWE94UcAQCVHQAAAAEDhP+FHAAAAAAAAABgkosBSoUCARaFFRaFDBaFAi6EKqHsmvSZApSmjPwGoflXhSCFMoVXAQCh/gAAAAEDhTqFVwAAAAAAAABgkosBSoU9ARaFUBaFRxaFPS6EKqHsmwyZEpSmjPwGofpXhVuFbYWYAQCVeAAAAAEDhXiFmAAAAAAAAABgkosBSoV7ARaFkRaFhRaFey6EKqHsmuyY/ZSmjPwGoftXhZyFroXZAQCVVQAAAAEDhbmF2QAAAAAAAABgkosBSoW8ARaF0haFxhaFvC6EKqHsmyGZIZSmjPwGofxXhd2F74YaAQCVfgAAAAEDhfqGGgAAAAAAAABgkosBSoX9ARaGExaGBxaF/S6EKqHsmyKZIpSmjPwGof1Xhh6GMIZXAQCVHgAAAAEDhjmGVwAAAAAAAABgkosBSoY8ARaGUBaGRhaGPC6EKqHsmyqZJ5SmjPwGof5XhluGbYafAQCh/wAAAAEDhn2GnwAAAAAAAABgkosBSoaAARaGmBaGihaGgC6EKqHsmu2Y/pSmjPwGof9XhqSGrobMAQCa9AAAAAEDhreGzAAAAAAAAABgjM4BSoa6ARaGxBaGui6EKqHsmvSZAgaiAFeG0IbahvgBAJsMAAAAAQOG44b4AAAAAAAAAGCMzgFKhuYBFobwFobmLoQqoeybDJkSBqIBV4b8hwaHLgEAmu8AAAABA4cUhy4AAAAAAAAAYIzOAUqHFwEWhyEWhxcuhCqh7JrvmQAGogNXhzOHQYe3AACVWgAAAAEDh1CHtwAAAAEBAYdaAAAAogBgklkAAGCSiwE+AUqHbQEfh3iSmgIAAhaHkBaHhi6EKqHsmv2ZCTGHpWCSWQGAh6bADinzAAaiBFeHvIfKiD4AAJVeAAAAAQOH2Ig+AAAAAQEBh+IAAACiAGCSWQAAYJKLAT4BSof1AR+IAJKaAgACFogYFogOLoQqoeybAZkMMYgsYJJZAYCILcAOKkwABqIFV4hDiFGIzAAAlWQAAAABA4hfiMwAAAACAgKIaQAAAIOWYJJZAIh3AAAAgIpgklkAAGCSiwE+AUqIhAEfiI+SmgIAAhaIpxaInS6EKqHsmwOZDTGIu2CSWQKAiLzADiqlgYjBwA4qsAAGogZXiNGI34lIAACiAQAAAAEDiOuJSAAAAAEBAYj1AAAAghdgklkAAGCSiwE+AUqJAQEfiQySmgIAAhaJJBaJGi6EKqHsmvuZBzGJPWCSWQGAiT7ADisQAAaiB1eJTYlbicAAAKICAAAAAQOJZYnAAAAAAQEBiW8AAACCF2CSWQAAYJKLAT4BSol7AR+JhpKaAgACFomeFomULoQqoeybFpkaMYm1YJJZAYCJtsAOK2kABqIIV4nFidOKOAAAlZ0AAAABA4ndijgAAAABAQGJ5wAAAIIXYJJZAABgkosBPgFKifMBH4n+kpoCAAIWihYWigwuhCqh7JrumP8xii1gklkBgIouwA4rwgAGoglXivmLAo2wAACVkgAAAAEDiw6NsAAAAAEBAYsYAAAAghdgklkAAGCSWQE+AkmLJCWLLYCLKMAOLBtgkos+A0mLRyIci1oWi1AUi0vADiwbAAFgkouUlJKQQQEAARaLZxaLXS6EKqHsmu+ZAADAAPXSARyLkRaLhxSLgsAOLBsAAWCSi5SUkpBBAQABFoueFouULoQqoeya7pj/AMAA9dI+AUqLtQEci84Wi8EUi7zADiwbAAFgkouSRJKORAEAAZMAwAD1LD9OjRCNFwAAgW1gkosBHI0ZLpUNAgACFI0twA4sGwABYJKLFo09Fo0zLoQqoeya7pj/AKIZSY1RIRyNXIGNVcAOLMhBAQABKwCSmD4BSo1vARyNihaNfYGNdsAOLMiSRJKORAEAAZMAwAD1LD8/So2hAYCNqMAOLBsGogpXkC+QNJDYAACVDgAAAAEDkD2Q2AAAAAICApBHAAAAg7JgjBUAkFQAAAAiYMAA9l0AAFwBPgFJkGMhHJB0FpBnLqH8ofFBAQABKwDAAPXSPgE9HJCFLqH8AgACgJCSwA4tXIGQmMAOLWcAofE+AT0wkLUkkM4DgZC9wA4tZyeDO4CQycAOLVwGogtXkfqR/5NqAACVKAAAAAEDkh2TagAAAAEBAZIoAAAAkltgjZ8AAGDAAPKzAT4DTpI8kkMAAJRCYIzOARaSTICSRcAOLeaSaY0bSZJgIhySa4GSZMAOLftBAQABFpJ4FpJuLoQqoeya9JkCAMAA9dIBHJKLgZKEwA4t+0EBAAEWkpgWko4uhCqh7JsMmRIAwAD10j4CTpKxkrYAAICwYMAA9l0BFpLEFpK/gJK4wA4t5oCwjReAsJI1SpLQASIiIiIcktyCktfADi5hQQEAASddAMAA9mwBHJL1gpLwwA4uYUEBAAEngUEAwAD2bAEckw6CkwnADi5hQQEAASeDPgDAAPZsARyTJ4KTIsAOLmFBAQABJ5eqAMAA9mwBHJNIgpNDwA4uYUEBAAEnkpYAwAD2bD9Kk1oBKgaiDFeVQpVLlg4AAJUpAAAAAQOVaJYOAAAAAgIClXIAAACZx2CSWQCVggAAAI8SYJJZAABgklkBPgNJlY8clZmAlZPADi8gQQEAAYGVnMAOLysAkl1KlaMBgJWqwA4vID9JlbUiHJW/gJW5wA4vIEEBAAEWlcIulXih+gCSXQEcldaBldDADi8rQQEAARaV2S6VeKH6AJJdSpXlARaV7C6VeKH6P0qV/AEWlgMuof6h+QAADiaJAA4m3wAOJxsADidXAA4nkwAOJ88ADigLAA4oRwAOKIMADii/AA4o+wAOKTcADilsAA4poQAOKdYADiovAA4qiAAOKvMADitMAA4rpQAOK/4ADi0/AA4tyQAOLwMADi+0AAAAGAKiD1eWqZa4sNAHogMAAAFgwAD1xQAAAQSiEVeXiJeSBKIEAF3AAPUdAWDAAPXFASsBBaIgAAAAAAQAAAMAAAAAAAAAAABgog8BPwEJAQDAAPXbAAAAAAoGohNXlsqW3JbmAQKVoAAAAAEDluaW5gAAAAAAAABgkosABqIUV5bqlvyXBAEClQsAAAABA5cElwQAAAAAAAAAYJKLAAaiFVeXCJcalykBAqH/AAAAAQOXKZcpAAAAAAAAAGCSiwAGohZXly2XN5dEAQKa7wAAAAEDl0SXRAAAAAAAAABgjM4ABqIYV5dIl1aXbwAClZ0AAAABA5dgl28AAAABAQGXagAAAIIXYJJZAABgkosABqIZV5eXl6WX3gAClQ0AAAABA5e4l94AAAACAgKXxwAAAIIXYJKLAJfTAAAAlJhgjM4AAGCSiwAGohpXmFOYWJizAACiBQAAAAEDmF2YswAAAAEBAZhnAAAAghdgklkAAGDAAPKzAUqYdgEiIiWYe4CYdsAOMX9gkm0BJZiSgJiNwA4xf2CSdwEcmKaAmKHADjF/QQEAARaYqS6VoKITAJJdBqIcV5mlmaqalwAAogah5wAAAAEDmb6alwAAAAICApnIAAAAmdRgklkAmdoAAACUhmCSWQAAYMAA8rMBPgROmfCZ9wAAgRBgwADyswEpPSMcmkAamjWiEUEBAAErAMAA9dIbmjWiETGaTGDAAPXFACsBXcAA9R0BYMAA9cU9HJpfGppUohFPAQABMZpjYMAA9cUDgJpkwA4x64GabcAOMfaCmnjADjILAMAA9S5KmoYBgpqNwA4yCwaiHlea2ZreppAAAJnTAAAAAQOa6aaQAAAAAgICmvMAAACZ1GCSWQCbBQAAAJSGYJJZAABgwADyswE+DD2ImxbADjKhFpsogJsgwA4yoZXwkl89iZs1wA4yrBabS4GbQcAOMqyV8JJfSZtYHptcwADuXgIAAoCbZsAOMqGBm2/ADjKsAEqbewEpP0mbjCWbmICbkMAOMqFgkoFKm6cBKT9Jm7gcm8SAm7zADjKhQQEAARabxy6VC6IUAJJdPgFKnCgBISWcOYGcL8AOMqxgkoE/SZxTHJxXLqIFAQABgZxdwA4yrACiGkqcaQEpP0mcoSIlnK2AnKXADjKhYJKLAB6cycAA7l4CAAIWnNsUnNPADjKhAAFgkouUlJKQFpzmLprvohYAPgROnQKdDQAAogdgklkBHJ0kFp0XFJ0PwA4yoQABYJKLkkSSjkQBAAGTAMAA9SxJnS8iJZ09gZ0zwA4yrGCSiwAenVvAAO5eAgACFp1vFJ1lwA4yrAEBYJKLlJSSkBadei6a76IWAD4CTp2YnaUAAKIIYJJZARydvhadsRSdp8AOMqwBAWCSi5JEko5EAQABkwDAAPUsSp38ARyeAy6Z0wIAAoKeD8AOM6yDnhvADjQTAKIeP06ep561AACiCWCSiwEcnrculZ0BAAGCnsLADjOsAKIYSp7VASIcntwumdMCAAKDnujADjRfgZ73wA4yrACiHgAcnw8umdMCAAKCnxvADjOsgZ8nwA4yrACiHj9Jnz4iJZ9MgZ9CwA4yrGCSiwAen2jAAO5eAgACFp98FJ9ywA4yrAEBYJKLlJSSkBafhy6a76IWAD4DTqALoBgAAKIIYJJZARygMRagJBSgGsAOMqwBAWCSi5JEko5EAQABkwDAAPUsTqBAoFAAAKIKYJKLARygUi6VnQEAAYKgXcAONPQAohhKoHIBIhygeS6Z0wIAAoCghcAOMqGDoI7ADjUhAKIeARygrC6Z0wIAAoCguMAOMqGCoMHADjT0AKIeP0mg2yIloOeAoN/ADjKhYJKLACWhBYGg+8AOMqxgkos+BE6hI6EuAACVDGCSiwEcoTAulQ0CAAIUoUTADjKhAAFgkosWoVcUoU3ADjKsAQFgkouUlJKQAKIZSaFpHKF4gqFtwA41nUEBAAErAJKYSqGBASo/RaGVAaGeoaAAAFtgwAD0eQGTARyhp4OhpcAONfNcAQABFqHCFqG0gqGpwA41nZJEko5awAD1TADAAPWmAYuhzMAONfMcocqDoczADjXzXQEAAZQAwAD1nj4BSaIeIRyiIy6Z0wIAAhyiVBaiR4KiPMAONZ2SRJKORAEAAYOiVcAONfMAwAD1LByicBaiYxSiWcAOMqwBAWCSi5JEko5EAQABg6JxwA418wDAAPUsAKIePgFKooIBKj9KoqgBKT9Jor8losuAosPADjKhYJLTPgJJoukiJaL3gaLtwA4yrGCS0wAcoysWoyEUoxnADjKhAAFgktOAz5LVQQEAARajOBSjLsAOMqwBAWCS04DPktUAwAD10j4BSaNNIRyjaRajWxSjUcAOMqwBAWCS05YPktZBAQABKwCSXT4BSqN+ARyjhS6Z0wIAAhajmRSjkcAOMqEAAWCS05UKkt4Wo6oUo6DADjKsAQFgktOVCpLeAKIePgJAIhykOBakKhSkIsAOMqEAAWCS05YPktZBAQABKwCSXQEcpFEumdMCAAIWpGUUpF3ADjKhAAFgktOVCpLeFqR2FKRswA4yrAEBYJLTlQqS3gCiHqQipHwASqSJASk/SqWCARyliS6Z0wIAAhalnRSllcAOMqEAAWCS05UKkt6BpaTADjKsAKIeP0mluiWlxoClvsAOMqFgkpw+Akml3xyl7YGl48AOMqxBAQABFqXwLqH/ohUAkl1KpgEBKT9JphQlpiKBphjADjKsYJKcPgFKpj0BHKZELqILoecCAAIUplnADjKhAAFgkpwUpmLADjKsAQFgkpwAoh0/P0qmgAEqBqIdV6aVppqwzgAAoguh5wAAAAEDpq6wzgAAAAICAqa8AAAAmdRgkpwAptIAAACUhmCSnAAAYMAA8rMBPglJpuMcpwYWpu+ApufADjiBlMeSn4CLAQABFqcSgacIwA44jJTHkp8AwAD1qD4BSqcyASo/SadKHKdyFqdrFqdWgKdOwA44gZRskqBawAD1TFwBAAEWp5sWp4aBp3zADjiMlGySoFrAAPVMAMAA9aY+AUqnqwEqP0mnwyEcp+UWp94Wp8+Ap8fADjiBkl6SnlrAAPVMQQEAARaoARan8oGn6MAOOIySXpKeWsAA9UwAwAD1nD4BSqgRASo/SagpFqhEFqg1gKgtwA44gZJekp6DaMAA9QA+BE6oXKhpAACUll3AAPVOAmCS4WCSWQEyqIRgkuFgklkARaiOAaiXqJkAAFtgwAD0eQGTARyooIOonsAOOZtcAQABFqi5FqiqgKiiwA44gZJekp5awAD1TADAAPWmAYuow8AOOZscqMGDqMPADjmbXQEAAZQAwAD1nj4DTqjUqOEAAKIMYJLhARyo+Rao64Co48AOOIGSXpKeRAEAAYOo+sAOOZsAwAD1LE6pCqkZAACiDWCS4QEcqTMWqSWBqRvADjiMkl6SnkQBAAGDqTTADjmbAMAA9Sw9HKlMgqlAwA45eICyAgAChKlNwA458h+pYZLgAQABhalzwA46IAAAwAD1Y0WpkgGpm6mdAABbYMAA9HkBkwEcqaSDqaLADjp9XAEAARapvRaproCppsAOOIGSXpKeWsAA9UwAwAD1pgGLqcfADjp9HKnFg6nHwA46fV0BAAGUAMAA9Z4+BE6p2KnlAACiDGCS4QEcqf0Wqe+AqefADjiBkl6SnkQBAAGDqf7ADjp9AMAA9SxOqg6qHQAAog1gkuEBHKo3FqopgaofwA44jJJekp5EAQABg6o4wA46fQDAAPUsTqpIqlEAAKIOYJJZAR6qU53AAgACFqprhKpewA461JUKkuaCqnLADjl4AEmrsyIhHKu4LpnTAgACFqvThavEwA47ApUKkuaGq9rADjswAKIeASEcq/QumdMCAAKGrADADjswFqwZhawKwA47ApUKkuYAoh4+AUqsLQEqPz2IrFPADjiBJqxTAR6sXZ3AAgACFqxwgKxowA44gZVFkqmCrIfADjl4AGCSnD9JrKAhHKylLpnTAgACFqy5gKyxwA44gZTckqMWrM+BrMXADjiMlNySowCiHj4BSqzkASo/Raz8Aa0FrQcAAFtgwAD0eQGTARytDoKtDMAOPBFcAQABFq0vFq0aga0QwA44jJRskqBawAD1TADAAPWmAYqtOcAOPBEcrTeCrTnADjwRXQEAAZQAwAD1nj4DTq1IrVsAAKIPYJJZARytexatZ4GtXcAOOIyUbJKgRAEAAYKtfMAOPBEAwAD1LE6tiq2bAACiEGCSWQEcrbkWraWArZ3ADjiBlGySoEQBAAGCrbrADjwRAMAA9SxJrfUhHK36LpnTAgACg64GwA48aISuGsAOPJYAoh4+AUquNwEqP06uW65sAACiEWDAAPR5AZNGrnWuta6EAAAAog9gksYAFq6kga6awA44jJRtkqE+BEOuvSIcrtWCrsTADjzqXAEAARau7xau34Cu18AOOIGUbZKhWsAA9UwAwAD1pgAhHK8yFq8tHK8aFq8LgK8DwA44gZRtkqFEAQABgq8bwA486gDAAPUsgLCSyEEBAAEWr1aDr0PADjz+gLCSyADAAPZsPgE9iq9owA486hyvZoKvaMAOPOpdAQABlADAAPWeSa+IHK+dgq+MwA486kEBAAEWr7gWr6iAr6DADjiBlG2SoVrAAPVMAMAA9ZxKr8ABKj9Or96v7wAAohBgksYBHLAIFq/5gK/xwA44gZRtkqFEAQABgrAJwA486gDAAPUsSbBTIRywWC6Z0wIAAhawd4OwZMAOPP6CF5LJFrCOhLB9wA4924IXkskAoh4+AUqwnwEqP0qwvwEpAAAOMHUADjCXAA4wuQAOMNsADjD9AA4xKgAOMWIADjHMAA4yhAAOOGIADj5BAAAACgAAAVcADj50AA4luAAOMB0ADj5yAAAAAgAOPnQAAAAAAKIhohJYAAAAAAAAAQKiK1iCPYJDgpQDohMAAAFgwAD1xQAAAQSiLViCW4JrCaIUAGDAAPZdAAEFoi9Ygm+CdYKSAQAAA4J7gpIAAAABAQGCgQAABKIUYMAA9l0AAGCiKwE/AggBoi2AAMAOPuIJAYJ1wAD12wAAAAAAAAAOPw0AAAAACASiI1iBWIFfBqIVAGDAAPR5AZQEoiRYgXmBgwaiFgBgwAD0eQGVBKIlWIGZgaIGohcAYMAA9HkBlgSiJliBuIHCBqIYAGDAAPR5AZcEoidYgdiB5QaiGQBgwAD0eQE3BQSiKFiCCIISBqIaAGDAAPR5ATcGBKIpWIIagioGohsAYMAA9HkBNwcEoipYg2+DtgSiHABdwAD1HQFbATGDelsAAAFYAA4/uQAOPp8ADj8WAAAAAQAOP7kAAAAAAKIwoh1ZAAAAAAAAAgKiMVmA9YD7lkwDoh4AAAFgwAD1xQAAcQSiM1mBFIEfBqIfAGDAAPR5AZMEojRZgTSBQQaiIABgwAD0eQGUBKI1WYFXgWAGlHwAYMAA9HkBlQSiNlmBdoGGBpI4AGDAAPR5AZYEojdZgamBsgaUsABgwAD0eQGXBKI4WYHHgdYGlL8AYMAA9HkBNwUEojlZgeuB+AaSPQBgwAD0eQE3BgSiOlmCDYIwBpTFAGDAAPR5ATdsBKI7WYJYgm4GiyoAYMAA9HkBNwcEojxZgoOClwaU6gBgwAD0eQE3CASiPVmCrILABpTtAGDAAPR5ATcJBKI+WYLVgvAGlO8AYMAA9HkBNwoEoj9ZgwWDGgaU8QBgwAD0eQE3CwSiQFmDL4NFBpTzAGDAAPR5ATcMBKJBWYNsg4UGlZ8AYMAA9HkBNw0EokJZg5qDqgaVnABgwAD0eQE3DgSiQ1mDv4PVBpUiAGDAAPR5ATcPBKJEWYPqhAAGlSQAYMAA9HkBNxAEokVZhBWEMAaVJgBgwAD0eQE3EQSiRlmERYRfBqIhAGDAAPR5ATcSBKJHWYR0hIoGkjkAYMAA9HkBNxMEokhZhJ+ErwaVEwBgwAD0eQE3FASiSVmExITUBpUWAGDAAPR5ATcVBKJKWYTphPkGlRgAYMAA9HkBNxYEoktZhQ6FHgaVIABgwAD0eQE3FwSiTFmFM4VIBpUrAGDAAPR5ATcYBKJNWYVdhXIGlS4AYMAA9HkBNxkEok5ZhYeFlQaSPgBgwAD0eQE3GgSiT1mFqoW4BpUxAGDAAPR5ATcbBKJQWYXNheIGlToAYMAA9HkBNxwEolFZhfeGEQaVPQBgwAD0eQE3HQSiUlmGJoY7BpU/AGDAAPR5ATceBKJTWYZQhmoGlUEAYMAA9HkBNx8EolRZhn+GngaiIgBgwAD0eQE3IASiVVmGs4a7BpVHAGDAAPR5ATchBKJWWYbQhuYGlUoAYMAA9HkBNyIEoldZhvuHFQaVTgBgwAD0eQE3IwSiWFmHKodCBpVTAGDAAPR5ATckBKJZWYdXh24GlVcAYMAA9HkBN28EolpZh4OHmQaVXABgwAD0eQE3cASiW1mHrofEBpVgAGDAAPR5ATdxBKJcWYfZh+8GlWYAYMAA9HkBN3IEol1ZiASIFQaVbQBgwAD0eQE3JQSiXlmIKog7BpVvAGDAAPR5ATcmBKJfWYhQiGIGkj8AYMAA9HkBNycEomBZiHeIiQaVdwBgwAD0eQE3KASiYVmInoiuBqIjAGDAAPR5ATcpBKJiWYjDiNQGoiQAYMAA9HkBNyoEomNZiOmI+QaSPABgwAD0eQE3KwSiZFmJDokgBpV9AGDAAPR5ATcsBKJlWYk1iUUGlYAAYMAA9HkBNy0EomZZiVqJbQaVggBgwAD0eQE3LgSiZ1mJgomOBpWEAGDAAPR5ATcvBKJoWYmjia0GlYYAYMAA9HkBNzAEomlZicKJ0gaViABgwAD0eQE3MQSialmJ54n2BpWMAGDAAPR5ATcyBKJrWYoLih8GlZEAYMAA9HkBNzMEomxZijSKSwaVlABgwAD0eQE3NASibVmKYIpoBpI6AGDAAPR5ATc1BKJuWYp9ipEGlZoAYMAA9HkBN1IEom9ZiqaKuAaVRABgwAD0eQE3NgSicFmKzYrkBqIlAGDAAPR5ATc3BKJxWYr5ixAGoiYAYMAA9HkBNzgEonJZiyWLNwaiJwBgwAD0eQE3OQSic1mLTIthBqIoAGDAAPR5ATc6BKJ0WYt2i4oGoikAYMAA9HkBNzsEonVZi5+LrwaVigBgwAD0eQE3bQSidlmLxIvZBqIqAGDAAPR5ATduBKJ3WYv/jBcGkjcAYMAA9HkBNz0EonhZjCyMNgaVpABgwAD0eQE3PgSieVmMS4xeBpWrAGDAAPR5ATc/BKJ6WYxzjIcGla0AYMAA9HkBN0AEontZjJyMsQaVsQBgwAD0eQE3QQSifFmMxozZBpWzAGDAAPR5ATdCBKJ9WYzujQEGlbUAYMAA9HkBN0MEon5ZjRaNJgaVtwBgwAD0eQE3RASif1mNO41MBpW5AGDAAPR5ATdFBKKAWY1hjXQGlb0AYMAA9HkBN0YEooFZjYmNnQaVwQBgwAD0eQE3RwSiglmNso3OBpXJAGDAAPR5ATdIBKKDWY3jjfMGlcsAYMAA9HkBN0kEooRZjgiOHAaVzQBgwAD0eQE3SgSihVmOMY4+BpXPAGDAAPR5ATdLBKKGWY5TjmIGldYAYMAA9HkBN0wEoodZjneOigaV2QBgwAD0eQE3TQSiiFmOn463BpJBAGDAAPR5ATdOBKKJWY7MjuQGleYAYMAA9HkBN08EoopZjvmPEQaiKwBgwAD0eQE3UASii1mPJo82BpWpAGDAAPR5ATdRBKKMWY+Oj54GlgkAYMAA9HkBN1cEoo1Zj7OPwgaV9wBgwAD0eQE3WQSijlmP14/nBpXyAGDAAPR5ATdaBKKPWY/8kAwGkjUAYMAA9HkBN1sEopBZkCGQLgaV9QBgwAD0eQE3XASikVmQQ5BVBpX5AGDAAPR5ATddBKKSWZBqkHsGlf0AYMAA9HkBN14EopNZkJCQpgaSQABgwAD0eQE3XwSilFmQu5DTBqIsAGDAAPR5ATdgBKKVWZDokP8Goi0AYMAA9HkBN2EEopZZkSWRNwaiLgBgwAD0eQE3YwSil1mRTJFgBqIvAGDAAPR5ATdkBKKYWZF1kYoGojAAYMAA9HkBN2UEoplZkaCRuAaVlgBgwAD0eQE3agSimlmR95IaBqIxAGDAAPR5ATdrBKKbWZPKk+YGojIAYMAA9HkBN4CABKKcWZQHlCAGojMAYMAA9HkBN4D4BKKdWZRBlF0GojQAYMAA9HkBNwcEop5ZlH+UmwaiNQBgwAD0eQE3gIAEop9ZlLCUzAaiNgBgwAD0eQE3gIgEoqBZlOGU/AaiNwBgwAD0eQE3gJAEoqFZlRKVLwaiOABgwAD0eQGWBKKiWZVFlV8GojkAYMAA9HkBOaI6BKKjWZYylkoGojsAYMAA9HkBNxkBBaKlAAAAAAQAAAMAAAAAAAAAAABgojEBPwEJAQDAAPXbAAAAAAAAAA5I8wAAAAACoqZZlk+WXpjDB6I8AAABYMAA9cUAAA4EoqhZln+WjwaWGgBgwAD0eQGTBKKpWZaklrQGlh0AYMAA9HkBlASiqlmWyZbYBpYgAGDAAPR5AZUEoqtZlu2W/waWIwBgwAD0eQGWBKKsWZcUlyYGlicAYMAA9HkBlwSirVmXO5dNBpYqAGDAAPR5ATcFBKKuWZdil3EGli8AYMAA9HkBNwYEoq9Zl4aXlgaWNQBgwAD0eQE3BwSisFmXq5e7BpY4AGDAAPR5ATcNBKKxWZfQl+QGljsAYMAA9HkBNwgEorJZl/mYGQaWQABgwAD0eQE3CQSis1mYLphCBpZHAGDAAPR5ATcKBKK0WZhXmG8GlksAYMAA9HkBNwsEorVZmISYnAaWTgBgwAD0eQE3DAEForcAAAAABAAAAwAAAAAAAAAAAGCipgE/AQkBAMAA9dsAAAAAAAAADkpOAAAAAAAAAVkADkpZAA4/4AAOSPwADkpXAAAAAgAOSlkAAAAAAKK4oj1aAAABgPcAAIvzAAAAAAAEAqK7WoELgRqBTweiPgAAAWDAAPXFAAAAAQWivwAAAAAEAAADAAAAAAAAAAAAYKK7AT8BCQEAwAD12wAAAAABBqK9WoEqgS6BTQACmNMAAAABA4E8gU0AAAABAQGBRQAAAIQJYIxHAABgwAD0eQAAAA5KywAOSvoAAAABAqLAWoFSgViCrwOiPwAAAWDAAPXFAAFgorsBBKLDWoGggcAJokCiuABdwAD1TgJgjEdgwAD0eQEygb5gjEdgwAD0eQABBaLHWoHFgcWCZQAAAAOB2YJlAAAAAQEBgeQAAACB6WCT3wAAYKLAAT4BRYH1AYH+ggAAAFtgwAD0eQGTARyCB4GCBcAOS3pcAQABFoIdFoITgIIJwA5LZIQsk+NawAD1TADAAPWmAYmCJ8AOS3ocgiWBgifADkt6XQEAAZQAwAD1nj4BPRyCPxaCMi6iQKK4osOAsgIAAhyCUxaCSoCCQMAOS2SELJPjRAEAAYGCVMAOS3oAwAD1LIGCWsAOS3oAwAD1YwEJAYHFwAD12wAAAAABBqLFWoJqgm6CrQAAmNMAAAABA4J8gq0AAAABAQGChQAAAIQJYIxHAABgwAD0eQFKgpEBNQAAAAEAYMAA9HkBHIKeFoKRLqJAoriiw0QBAAGAgp/ADkw7AMAA9WIjHIKogQDADkxSQQEAASsAAByCq5SBVgAAAADAAPScgQDADkxSAWDAAPR5AAAOTB4ADkylAAAAAQKiyFqCsoK4hwEDokEAAAFgwAD1xQABYKK7AwSiy1qC+YMSCaJCorgAXcAA9R0BYMAA9l0BMYMQYMAA9l0ABKLMWoMqg0oJokOiuABdwAD1HQFgjEcBMYNIYIxHAASizVqDZoOGCaJAorgAXcAA9U4CYIxHYMAA9HkBMoOEYIxHYMAA9HkAAQWi2FqD7YPthAcAlTQAA4QFhAcAAAAAAAAAYKLIAT8BCQGD7cAA9dsAAAAABgaiz1qDi4OTg+gEAQAAAAABA4Olg+gAAAABAQGDrgAAAIVFYIxHAABgosgBPgFKg7kBHIPdH4PEouUBAAGAg9jADk2CAJ7xAAAAAKLeBqLRWoR7hIyEpwEAokQAAAABA4SYhKcAAAAAAAAAXcAA9R0BYMAA9l0BSoSbARaEmy6iQqK4ossGotJahKyEvoTlAQCY8AAAAAEDhNCE5QAAAAAAAABdwAD1HQFgjEcBSoTTARaE0y6iQ6K4oswGotRahOqE7oYHAACe7AAAAAEDhPeGBwAAAAICAoUAAAAAgdNgjEcAhQ8AAACY8WDAAPZdAABgwAD0eQE+B06FJYUrAAAnYMAA9HkBHIU6FoUtLqJAoriizUQBAAGAhTvADk4+AMAA9WJJhUghHIVSgoVMwA5OYEEBAAErAMAA9ZxKhVsBgoViwA5OYD89ioVtwA5OYBaFghaFdS6iQqK4ostawAD1TD0chZsWhY4uokKiuKLLTwEAAYGFn8AOTkkAwAD1Lj0chcMWhbAuokOiuKLMTwEAAYCFx8AOTj4AwAD1Lj0cheEWhdQuokCiuKLNgLICAAKAheLADk4+goXswA5OYADAAPVjSoX3AYKF/sAOTmAGotVahk2GUYaeAACY0wAAAAEDhl+GngAAAAEBAYZoAAAAhAlgjEcAAGDAAPR5AT4BSoZ3ATUAAAABAGDAAPR5ARyGixaGfi6iQKK4os1EAQABgIaMwA5PUgDAAPViIxyGlYEAwA5Pa0EBAAErAAAchpiUgVYAAAAAwAD0nIEAwA5PawFgwAD0eQai1lqGo4aqhv8AAJjyAAAAAQOGt4b/AAAAAQEBhsAAAACECWCMRwAAYMAA9l0BPgFKhs8BHIbiFobWLqJCoriiy0QBAAEchuMumNMBAAGAhvLADk/bAKLVAMAA9SwAAA5NZgAOTbMADk3rAA5OIQAOTzUADk++AA5QHAAAAAYCotlahzWHO497A6JFAAABXaFJAVsAAAIEottah4WHqwmX3wBgosgBH4eRotgAAAAABKLcWoe9h80JokYAYIxHAAEFouVaiCuIK4iFAAAAA4g+iIUAAAABAQGIRAAABKJGYIxHAABgotkBPgE9HIhiFohcLpffotue7AIAAhaIbC6iRqLcJwAAotQCCAGi3IAAwA5QlwkBiCuhTQAAAAAGBqLeWofSh+WIJgAAnvEAAAABA4fqiCYAAAAAAAAAYKLIAT4CPRyIBBaH8y6iRqLclA4BAAEuAIxsSogWARaIHS6X36LbBqLfWoiKiI+NngAAokcAAAABA4ifjZ4AAAABAQGIqAAAAIHTYIxHAABcAT4ISYi2HIjBgIi6wA5RP0EBAAEWiMQuokai3ADAAPXSSojWAD9OiQSJEQAAokhgwAD23gEWiSQWiRMuokai3JHhjElOiTeJQQAAoklgwAD23gEWiUqAiUPADlE/keGMSUmJWRyJZ4KJXcAOUZFBAQABKwDAAPcFPgE9MIl4JIm7AoGJgMAOUXMnoko/T4p3inwAAAGiS2EBW2DAAPKzAAOKkIrkAAAAAQEBipEAAACAoFsAAGDAAPKzAUqKoQEiIiEciqwWiqWEiqHADlH3gUwAQQEAAScAAMAA9dIAIRyKwBaKuYSKtcAOUfeBTABBAQABJ4FqAMAA9dIAIRyK2xaK1ISK0MAOUfeBTABBAQABJ4NvAMAA9dJOiu+LCgAAokxgwADyswEciyCDiwzADlHcIAEAAYKLIcAOUZEAAE6LNotUAACiTWDAAPKzARyLaoOLVsAOUdwgAQABgYtrwA5RcwAASYt+IoSLgsAOUmYAhYugwA5SjD4CTovOi9oAAKJOYMAA9l0BHovcoroCAAKCi+zADlGRgYv3wA5RcwA9HIwSFowMLpffotue7AIAAoCMHMAOUT+GjCTADlLHAKLUSYw9hIxBwA5SZj4BPTCNBySNSwOBjQ/ADlFzJ6JPgo1BwA5RkT4BPRyNZhaNYC6X36LbnuwCAAKAjXDADlE/HI2JFo1/gI14wA5RP5HhjEkjAAAAAMAA9wYAotQGouBajaONo430AACUogAAAAEDjbaN9AAAAAEBAY29AAAAg7JgjM4AAFsBPgE9HI3JLqJHAQABFo3fgI3awA5Th5RajPgAot8GouFajfmN+Y61AACUTwAAAAEDjgWOtQAAAAEBAY4OAAAAg7JgjEcAAFsBPgI9HY4glE8BAAGAji3ADlPPAKDNRo44jnSORwAAAKJQYIw3ABaOYYCOXMAOU8+UNYxSPgE9HI58LqJHAQABJo6kARaOpBaOn4GOjcAOU/eDsow6klGMG2CMRwCi3wai4lqOuo66jw8AAJdfAAAAAQOO0I8PAAAAAQEBjtgAAACDsmCNEwAAWwE+AT0cjuQuokcBAAEWjvqAjvXADlRYlFqNHACi3wai41qPFI8Uj3kAAJXrAAAAAQOPHY95AAAAAQEBjyMAAACAsGCSMgAAWwE+AUmPLyEcj0AWjziAjzPADlSghAmSOEEBAAErAMAA9dI+AT0cj1EuokcBAAEWj2eAj2LADlSghAmSOACi3z8AAA5Q3QAOUSIADlNqAA5TsgAOVDsADlSDAA5U7QAAAAYAAQaiulqPfo+Fk1oAAaJRAAAAAQOPlJNaAAAAAgICj5kAAACB02DAAPbeAI+lAAAAlzdgwAD23gAAYMAA9l0BPg5Oj7uPygAAolJdwAD1HQFgwAD2XQEWj9OAj8zADlUtgtHAAPbsTo/wj/wAAKJTXcAA9R0BYMAA9l0BFpACgY/+wA5VOoLRwAD27E6QFpAZAACaCmDAAPR5ARaQJ4OQG8AOVXZawAD1TEmQMRyQSxaQRIKQNcAOVVFawAD1TFwBAAGEkE3ADlWbAMAA9aY9jJBRwA5VmxaQZYKQVsAOVVFawAD1TD89jJBvwA5VmxyQcYSQb8AOVZuBQQEAAZQAwAD1n06QwJDFAACiVGDAAPR5ARyQx5SBVgAAAADAAPScQUWQzQGQ1pDYAABbYMAA9HkBkwEckN+GkN3ADlY0XAEAAYSQ4cAOVZsAwAD1pgGOkOXADlY0HJDmhpDlwA5WNF0BAAGUAMAA9Z4+AUmQ8ByRBhyRAoKQ9MAOVVFEAQABhpEDwA5WNADAAPUsQQEAARyRFIORCcAOVXZEAQABhpEVwA5WNADAAPUsAMAA9mw+AT2NkSHADlYThpEowA5WND4BQpE+AEmRUSIckVqFkVXADlYTQQEAARyRcxaRbIKRXcAOVVFawAD1TIFBAQABlQDAAPWfAMAA9ZwAHJGWFpGPgpGAwA5VUVrAAPVMQQEAARaRpYORmcAOVXZawAD1TADAAPWcPgJJkhEckikWkiSCkhXADlVRgXnAAPUCQQEAAScAAMAA9mxKkjABJ4ExP0qSQAEWklaCkkfADlVRgXnAAPUCP06Sb5J0AABHXcAA9R0BYMAA9l0BHpJ6wADwJAEBYMAA9l0BkwBOkpCSlQAAolVgwAD0eQEckpyFkpfADlYTXQEAAZQAwAD1nkOSoxySr4eSqsAOV5pcAQABHJLEFpK9g5KxwA5VdlrAAPVMgUEBAAGUAMAA9Z8AwAD1pj4CPRyS1IaSz8AOV3VPAQABJ4TzAMAA9S49j5LjwA5XmhyS54eS48AOV5pdAQABlADAAPWePRyS9oaS8cAOV3WAmQEAARyTDIKS/cAOVVGTFwEAARyTFoWTEcAOVhNdAQABlADAAPWeAMAA9PUAwAD1L0mTIBaTKYaTJMAOV3WA/MAA9P89HJM3hpMywA5XdU8BAAEngTEAwAD1Lj9Kk0MBHJNPhpNKwA5XdVEBAAEnSQDAAPTvAVoADlilAA5KjAAOSwcADkyyAA5QPQAOVQ4AAAAEAA5VEAAOWKUAAAABAKLmAFsAAAAAAAABAqLnW4EjgTKGcAeiVgABAACB/WDAAPXFAVsBYMAA9cUAAAEEoupbgUSBUgmiV6LmAF3AAPUdAV8AAAExgVBfAAAAAQWi9wAAAAAEAAADAAAAAAAAAAAAXaLnAV8AAAE/AQkBAMAA9dsAAAAACAai7FuBV4FggXkBAID8AAAAAQOBaIF5AAAAAAAAAGDAAPKzAUqBawEWgXIWgWsuolei5qLqgPzAAPT/BqLtW4F+gYeBpgEAg2gAAAABA4GSgaYAAAAAAAAAYMAA8rMBSoGVARaBnBaBlS6iV6LmouqDaMAA9QAGou9bgauBsILKAABPAAAAAQOBs4LKAAAAAQEBgbYAACCWl18AAAAAXAE+BE6BxoHMAAAnYMAA9HkBFoHVFoHOLqJXouai6lrAAPVMPTUAAAABAF3AAPUdAV8AAAEWgeEuolei5qLqF4HogoHowA5aDFocge8WgeiCgejADloMWsAA9UxdAQABlADAAPWewAD1SkFDgfkcggaBggDADlnrgIsBAAGTAMAA9ag+BE6CFYIcAACSUV8AAAEcgiQWgh4uolei5qLqRAEAARyCJS6iWKLmAQABgYIywA5Z6wCi9ADAAPUsSYJBHIJFLpp3AgACgoJRwA5abICCWcAOWdoAovFCgmAAPz0cgnMWgm0uolei5qLqgLICAAKBgnTADlnrgoJ9wA5abADAAPUtPYmCi8AOWescgpMuolii5gEAAYGCoMAOWesAovQ9HIK4FoKyLqJXouai6oCyAgACgYK5wA5Z64CCwsAOWdoAwAD1LQai8FuCz4LRg18AAJPgAAAAAQOC14NfAAAAAAAAAF8AAAE+BE6C4oLqAACe/l8AAAEcgvIWguwuolei5qLqRAEAAZMAwAD1LE6C/YMEAACiWV8AAAEcgw0WgwYuolei5qLqlaYAAAAAwAD1PEmDHxaDKhaDIy6iV6LmouqDaMAA9QA9HIM2LqJaouYBAAGBg0DADlt3AKL1P0qDTQGAg1TADltTBqLxW4Ong6yDwQACmncAAAABA4O3g8EAAAACAgKDugAAIIFmXwAAAIO/AAAggdpfAAAAAGDAAPKzAAai81uDxoPKhAcAAKJbouYAAAABA4PahAcAAAABAQGD3wAAACdgwAD0eQAAYMAA9HkBPgFKg+wBHIQAHIP6gIP0wA5cK4OCAQABlADAAPSVXQEAAZQAwAD1ngai9FuEDIQQhEkAAKJYouYAAAABA4QchEkAAAABAQGEIQAAACdgwAD0eQAAYMAA9HkBPgFKhC4BHIRBHIQ8gIQ2wA5chYFBAQABlADAAPWfg4QBAAGUAMAA9JYGovVbhE6EU4ZuAACiWqLmAAAAAQOEXIZuAAAAAQEBhF8AACCWl18AAAAAXAE+A06Eb4R1AAAnYMAA9HkBk0FDhH4pPgdOhJeEogAAolxgwAD0eQEchKQuolui5gEAAYGEtcAOXPEAovNJhMMchNKChMfADl0HgUgBAAEWhNwWhNUuolei5qLqWsAA9UwAwAD1qUKE5AA/ToTzhPkAAJQWXwAAARyFARaE+y6iV6LmoupEAQABgoUCwA5dBwDAAPUsSYUVHIUoHIUkgoUZwA5dB10BAAGUAMAA9Z5cAQABFoUxFoUqLqJXouai6lrAAPVMAMAA9aY+Ak6FRYVPAACiXV8AAAEchVcWhVEuolei5qLqRAEAARyFY4KFWMAOXQddAQABlADAAPWeAMAA9SxJhXEchXUumncCAAKEhYHADl26g4WMwA5dWQCi8T4CPYuFoMAOXVmEhajADl26PYqFvcAOXQcchceChb3ADl0HXQEAAZQAwAD1nj8/SYXjHIXnLpp3AgACgIXzwA5c4IOF+cAOXVkAovFChgEAPz0chhQWhg4uolei5qLqgLICAAKBhhXADlzxHIYkFoYeLqJXouai6kQBAAGChiXADl0HAMAA9SwAwAD1LT2JhjjADlzxgoZAwA5dBz0chlwWhlYuolei5qLqgLICAAKBhl3ADlzxgIZmwA5c4ADAAPUtAAAOWUgADlmDAA5ZvgAOWy4ADlvSAA5cDAAOXGYADlzBAA5ezwAAAAgAAAFbAA5e+gAOWNsADl74AAAAAQAOXvoAAAAAAKL4ol5cAAABgPgAAIvzAAAAAAADAqL5XIHnge2SiQOiXwAAAWDAAPXFAAAEBKL7XIISgicGomAAYMAA9l0BJ6JhBKL8XII/glQGomIAYMAA9l0BJ6JjBKL9XILNgtwGomQAYMAA9l0BJ5XtBKL/XIMAgyQJhUSi+ABdwAD1TgJgwAD2XWCjEQEygyJgwAD2XWCjEQAEBaMNXINrg2uEngAAAAODd4SeAAAAAgICg4IAAACB6WCT3wCDngAAAKJlXcAA9NsBYMAA9l0AAGCi+QE+Ak6DtYPDAACiZl3AAPYOAWDAAPZdARyD0YGDxcAOX82R4gAAAADAAPTyRoPehAeD5wAAAIQJYIxHABaD/ICD8sAOX8KELJPjPgJOhBOEFwAAgKBgwAD2XQEkhC8BFoQkg4QcwA5gFZHhjElJhDcchEmChDvADl/ogtABAAGEhFLADmAxAMAA9ho+AT0chGwWhGIuhUSi+KL/gLICAAKEhG3ADmAxH4R4oyEBAAGDhITADmAVAADAAPVjPwEJAYNrwAD12wAAAAAFow5chOWE5YVhAKJnAAOE94VhAAAAAgIChQIAAACB6WCT3wCFGwAAAKJlXcAA9NsBYMAA9t4AAGCi+QE/AQoAhTCjDQIAAoCFNcAOYMcchUyBhUDADmDSgJ8BAWDAAPZdATSFUAOFUIVfAAAAAQEBhVEAAACAoGDAAPbeAABgwAD2XQFKhVkBJIVfAYKFW8AOYR4AwAD05gAFow9chYeFh4ZvAKJoAAOFoYZvAAAAAQEBhawAAACB6WCT3wAAYKL5AT4BRoW9heaFxgAAAIQJYIxHABaF24CF0cAOYWCELJPjPgFJhe4chgsWhgQWhfqBhfLADmF3keGMSYFMwAD25EEBAAEng28AwAD2bD4BPRyGKhaGIC6FRKL4ov+AsgIAAiSGQQEWhjaBhi7ADmF3keGMSR+GSaMhAQABgYZVwA5hdwAAwAD1Yz8BCQGFh8AA9dsAAAAABaMQXIb6hvqHngCcrgADhwqHngAAAAEBAYcVAAAAgelgk98AAGCi+QE+AUaHJodPhy8AAACECWCMRwAWh0SAhzrADmIehCyT4z4BPRyHYRaHVy6FRKL4ov+AsgIAAiSHeAEWh22Bh2XADmI1keGMSR+HgKMhAQABgYeMwA5iNQAAwAD1YwEJAYb6wAD12wAAAAAKBqMCXIejh6+IdgAAommi+AAAAAEDh7+IdgAAAAEBAYfHAAAAgKBgwAD2XQAAYKMRAT4DTofeh+sAAKJqYKMRARyH9xaH7S6FRKL4ov9EAQABgIf4wA5itwDAAPViSYgCHIgTgYgGwA5izEEBAAErAMAA9dI+AT0wiCQkiFMDJ5DSgIg5wA5ityeiaz9KiF8BgYhmwA5izAajA1yI24jjiRoAAJrJAAAAAQOI7YkaAAAAAQEBiPUAAACAoGDAAPZdAABgjEcBSoj9ARaJExyI/S6iaaL4AQABgIkOwA5jTACjAoQJoxMGowRciViJYImVAACbBgAAAAEDiW2JlQAAAAEBAYl1AAAAgKBgwAD2XQAAYIxHAUqJfQE1AAAAAQBgoxEBHImHFol9LoVEovii/0QBAAGAiYjADmObAMAA9WIjHImOgQDADmOyQQEAASsAACsWiY6BAMAOY7KECaMTAWCMRwajBVyJ34nkih4AAKJsAAAAAQOJ84oeAAAAAQEBifsAAACAoGDAAPZdAABgwADyswFKigMBHIoOFooDLoVEovii/4HdAQABgIoawA5kGADAAPVhBqMGXIqfiqWLDgAAmtIAAAABA4qtiw4AAAACAgKKtQAAAIQJYMAA9l0AisUAAACV+mDAAPZdAABgjM4BPgFKitYBHIr3HIrdLqJpovgBAAGAiu7ADmRrAKMCmtIBAAGBiwDADmR4AKMcBqMHXItKi1CLugAAmvAAAAABA4tbi7oAAAACAgKLYwAAAIQJYMAA9l0Ai3MAAACV+mDAAPZdAABgjM4BPgFKi4QBNQAAAAEAYKMRARyLlRaLiy6FRKL4ov9EAQABgIuWwA5k1ADAAPViIxyLoIIAwA5k+kEBAAErAAArHIugggDADmT6mvABAAGBi6zADmThAKMdAWCMzgajCFyN+o4BjosAAJrLAAAAAQOOCo6LAAAAAwMDjhIAAACECWDAAPZdAI4iAAAAlfpgwAD2XQCONAAAAKJtYMAA9l0AAGCNEwE+AUqORgEcjmccjk0uommi+AEAAYCOXsAOZWsAowKaywIAAoGOccAOZXiCjnzADmWFAKMeBqMJXI7Ijs+PWgAAom4AAAABA47bj1oAAAADAwOO4wAAAIQJYMAA9l0AjvMAAACV+mDAAPZdAI8FAAAAom1gwAD2XQAAYI0TAT4BSo8XATUAAAABAGCjEQEcjygWjx4uhUSi+KL/RAEAAYCPKcAOZegAwAD1YiMcjzODAMAOZhtBAQABKwAAKxyPM4MAwA5mG6JuAgACgY9AwA5l9YKPS8AOZgIAox8BYI0TBqMKXJE5kUCRrgAAmsYAAAABA5FRka4AAAACAgKRWQAAAIQJYMAA9l0AkWkAAACibWDAAPZdAABgjRMBPgFKkXsBHJGCLprLAwADgJGMwA5mkxqRlaL9gZGfwA5moACjCAajC1yR85H6kocAAKJvAAAAAQOSDpKHAAAAAwMDkh0AAACECWDAAPZdAJItAAAAlfpgwAD2XQCSPwAAAKJtYMAA9l0AAGCNEwE+AUqSUQEcklguom4DAAOAkmXADmb0GpJuov2CknjADmcOAKMJAAAOYpgADmMvAA5jfgAOY/sADmROAA5ktwAOZU4ADmXLAA5mdgAOZtcADmdFAAAACgKjEVySjJKSmSUDonAAAAFgwAD1xQAAAgSjE1ySsJK3CYQJAGCMRwAEoxVcktaS3hiadaL4AF3AAPVOAmDAAPZdYKMiASsBBaMhXJLjkuOS/AAAAAOS7pL8AAAAAQEBkvQAAASECWCMRwAAYKMRAT8CCAGjE4AAwA5n1QkBkuPAAPXbAAAAAAcGoxdckwGTH5UfAQCUOAAAAAEDkyeVHwAAAAAAAABdwAD1TgJgwAD2XWCjIgE+AkmTLRyTOhaTMS6adaL4oxVBAQABKwDAAPXSPgQ9F5NLLpp1ovgyk2xgwAD2XWCjIgCjFT0ck34Wk3YumnWi+KMVgLICAAIak4yi/R+TnKMzAQABLgAAwAD1Y0aTv5Pjk8gAAACUQmCMzgAWk9oWk9IuhAmjE5Q4jFU+AT0ck/UWk+0umnWi+KMVgLICAAIWk/2Ak/bADmiMgLCM1B+UCaMyAgACLoCUHMAOaIwAAMAA9WNGlDOUapRCAAAAlBxgjDcAFpRXFpRPLoQJoxOUNYxSPgJOlH6UgwAAg7JgjCsBFpSPgJSFwA5o5IOyjDpJlJ0llKaBlKHADmkBYIzOPgE9HJTEFpS8Lpp1ovijFYCyAgACFpTKFJTFwA5pAQEBYIzOgLCM1B+U1qMyAgACLhSU6cAOaQEBAWCMzgAAwAD1Yz8/SpUMARaVEy6adaL4oxUGoxhclSSVL5bVAQCicQAAAAEDlT2W1QAAAAAAAABgwAD2XQE+AUqWWQEjFpZoFpZgLoQJoxOD5IxcJJavAyeichaWmhaWki6ECaMTkeGMSSeC+ySW0QMnonMWlsUWlr0uhAmjE5HhjEkngvsBYMAA9l0GoxtcltqW55eWAACidKL4AAAAAQOW9ZeWAAAAAQEBlv0AAACAsGDAAPZdAABgoyIBPgNOlw2XFQAAlstgoyIBHJceFpcXLpQ4oxdEAQABgJcfwA5qDwDAAPViSZcqHJc2gZcuwA5qJEEBAAErAMAA9dI+AT0wl0ckl3gEJ5AhgJdWwA5qDyeidRaXai6icaMYP0qXhAGBl4vADmokBqMcXJebl6GX4wAAmtIAAAABA5epl+MAAAABAQGXsQAAAICwYMAA9l0AAGCMzgE+AUqXvQEWl9kcl8QuonSi+AEAAYCX08AOaqoAoxuUQqMlBqMdXJfol+6YLQAAmvAAAAABA5f5mC0AAAABAQGYAQAAAICwYMAA9l0AAGCMzgE+AUqYDQE1AAAAAQBgoyIBHJgbFpgULpQ4oxdEAQABgJgcwA5q+wDAAPViIxyYI4EAwA5rFEEBAAErAAArFpgjgQDADmsUlEKjJQFgjM4Gox5cmDKYOZioAACaywAAAAEDmEKYqAAAAAICAphKAAAAlfpgwAD2XQCYXAAAAKJtYMAA9l0AAGCNEwE+AUqYbgEcmI8cmHUuonSi+AEAAYCYhMAOa3gAoxuaywEAAYGYmcAOa4UAoy8Gox9cmK2YtJkjAACibgAAAAEDmMCZIwAAAAICApjIAAAAlfpgwAD2XQCY2gAAAKJtYMAA9l0AAGCNEwE+AUqY7AE1AAAAAQBgoyIBHJj6FpjzLpQ4oxdEAQABgJj7wA5r4QDAAPViIxyZB4IAwA5sB0EBAAErAAArHJkHggDADmwHom4BAAGBmRTADmvuAKMwAWCNEwAADmf+AA5pfgAOafAADmqNAA5q3gAOa1sADmvEAA5sWQAAAAcCoyJcmSiZLqD8A6J2AAABYMAA9cUAAAMEoyRcmVGZVwmSUQBgoxEABKMlXJlnmW0JlEIAYIzOAASjJ1yZnJmkGKJ3ovgAXcAA9U4CYMAA9l1gjRMBKwIFozJcmdOZ05n5AAAAA5nfmfkAAAACAgKZ5QAABJJRYKMRAJnyAAAElEJgjM4AAGCjIgE/AwgBoySAAMAObO0IAaMlgQDADmz4CQGZ08AA9dsAAAAABaMzXJn+mf6aMACiZAADmhOaMAAAAAEBAZoZAAAEklFgoxEAAGCjIgE/AwgBoySAAMAObUMIAKMlKwkBmf7AAPXbAAAAAAcGoylcmamZtZnOAQCECQAAAAEDmb2ZzgAAAAAAAABgjEcBSpnAARaZxxaZwC6SUaMkhAmjEwajKlyaNZpNm8oBAJQ+AAAAAQOaVZvKAAAAAAAAAF3AAPVOAmDAAPZdYI0TAT4CSZpbHJpoFppfLqJ3ovijJ0EBAAErAMAA9dI+Aj0Xmnkuonei+DKalGDAAPZdYI0TAKMnSZqeIRyaqRaaoi6UQqMlQQEAASsAwAD10j4DPRyazhaawxaavC6UQqMllDmM44O8AQABFprWLpQ/oy4AwAD06z0cmvgWmvEWmuoulEKjJZQ6jOGDvAEAARabAC6UP6MuAMAA9Os9HJsoFpsbFpsULpRCoyWUiYzig7wBAAEWmzAulD+jLgDAAPTrPgI9HJtmFptbFptTLoQJoymUOYxWg7wBAAEWm24ulD+jLgDAAPTrPRybkRabihabgi6ECaMplDqMV4O8AQABFpuZLpQ/oy4AwAD06z9Km7cBFpu+LqJ3ovijJwajLVybz5vWnOAAAKJ4AAAAAQOb6pzgAAAAAQEBm/IAAACSW2CNEwAAYMAA9l0BPgJJnAAlnAuAnATADm8KYI2fPgJJnCEWnCwUnCXADm8KAAFgjZ+EQI27Spw2ARycVxqcSqL7XQEAARacZRacYBScWcAObwoAAWCNn4CwjReAsJI1AMAA9nI/SZxxFpx8FJx1wA5vCgABYI2fhEGNvEqchgEcnKcanJqi/F0BAAEWnLUWnLAUnKnADm8KAAFgjZ+AsI0XgLCSNQDAAPZyPz9KnMUBFpzYFpzTgJzMwA5vCoCwjReAsJI1BqMuXJzlnOqeDQAAlD8AAAABA5zzng0AAAABAQGc+wAAAJJbYI0TAABcAT4CSZ0JIhadGRadFICdDcAOb/OAsI0XleqSOQAhHJ06Fp0yFp0tgJ0mwA5v84CwjReECZI4QQEAARadPS6ECaMpAMAA9dI+AUqdyAA/PRyd4had2i6id6L4oyeAsgIAAhyd4y6ieAEAAYCd+MAOb/MAoy2AngPADm/zAMAA9WMGoytcnhKeHZ7TAQCicQAAAAEDniue0wAAAAAAAABgwAD2XQE+AUmeMRyePBaeNS6UQqMlQQEAASsAwAD10j4BSp5NASSeegInonkWnmsWnmQuklGjJKJxoxg+AUqejwEknskEJ6J6Fp6nFp6gLpRCoyWAsIzUJ6J7Fp66Fp6zLpJRoySicaMYBqMvXJ7Ynt+gxAAAmssAAAABA57ooMQAAAABAQGe8AAAAICwYMAA9l0AAGCNEwE+A06fAJ8HAACSW2CNEwEcnxAWnwkulD6jKkQBAAGAnxHADnElAMAA9WJJnxwcnyeBnyDADnE6QQEAASsAwAD10j4FTp8/n0cAACJgwAD2XQEkAAUnonyAn23ADnElJ6J9J6J+Fp+SLqJxoytOn6yfswAAon9gwAD2XQEcn88an8Ki+10BAAGAn9HADnElAMAA9nJOn+Gf6AAAmctgwAD2XQEcoAQan/ei/F0BAAGAoAbADnElAMAA9nJJoBIiIRygJhygHRagFi6UPqMqRAEAAYOgHsAOcaQAwAD1YkEBAAErAMAA9dIBIRygQRygOBagMS6UPqMqRAEAAYSgOcAOccsAwAD1YkEBAAErAMAA9dI+AT0woFQkoIoGgqBcwA5xeyeigIOgdMAOcaQnkLGEoIHADnHLJ6KBPz0woJqCoKDADnF7P0qgswGBoLrADnE6BqMwXKDJoNCg+gAAom4AAAABA6DcoPoAAAABAQGg5AAAAICwYMAA9l0AAGCNEwFKoO0BHKD0FqDtLpQ+oypEAQABgKD1wA5ypQDAAPViAAAObXEADm2mAA5u7QAOb9YADnCAAA5xCAAOcogADnLWAAAABwAAAVwADnL9AA5fKQAOZ3YADmx+AA5y+wAAAAMADnL9AAAAAACjNKKCXQAAAAAAAACAoASjNl2E/4UKBqKDAGDAAPR5AZMEozddhUCFSwaihABgwAD0eQGUBKM4XYV/hYoGooUAYMAA9HkBlQSjOV2FvIXHBqKGAGDAAPR5AZYEozpdhgGGDAaihwBgwAD0eQGXBKM7XYY6hkUGoogAYMAA9HkBNwUEozxdhnqGhQaiiQBgwAD0eQE3BgSjPV2GsIa7BqKKAGDAAPR5ATcHBKM+XYbrhvUGoosAYMAA9HkBNwgEoz9dhyqHNAaijABgwAD0eQE3CQSjQF2HdoeBBqKNAGDAAPR5ATcJBKNBXYexh7sGoo4AYMAA9HkBNwoEo0Jdh+6H+AaijwBgwAD0eQE3CwSjQ12IKIgyBqKQAGDAAPR5ATcMBKNEXYhoiHIGopEAYMAA9HkBNw0Eo0VdiKKIrAaikgBgwAD0eQE3DgSjRl2I24jlBqKTAGDAAPR5ATcPBKNHXYkciScGopQAYMAA9HkBNxAEo0hdiWmJdAailQBgwAD0eQE3EQSjSV2Jq4m2BqKWAGDAAPR5ATcSBKNKXYn5igQGopcAYMAA9HkBNxMEo0tdijuKRgaimABgwAD0eQE3FASjTF2KhIqPBqKZAGDAAPR5ATcVBKNNXYrGitEGopoAYMAA9HkBNxYEo05dixGLHAaimwBgwAD0eQE3FwSjT12LSYtUBqKcAGDAAPR5ATcYBKNQXYuIi5IGop0AYMAA9HkBNxkEo1Fdi8OLzgaingBgwAD0eQE3GgSjUl2L+4wGBqKfAGDAAPR5ATcbBKNTXYw7jEUGoqAAYMAA9HkBNxwEo1RdjHuMhQaioQBgwAD0eQE3HQSjVV2MvIzGBqKiAGDAAPR5ATceBKNWXYz7jQUGoqMAYMAA9HkBNx8Eo1ddjTKNPQaipABgwAD0eQE3fwSjWF2Nd42EBqKlAGDAAPR5ATcgBKNZXY2kjbcGoqYAYMAA9HkBNyEEo1pdjeON7waipwBgwAD0eQE3IgSjW12OD44cBqKoAGDAAPR5ATciBKNcXY48jlAGoqkAYMAA9HkBNyIEo11djnCOgQaiqgBgwAD0eQE3IgSjXl2OoY6tBqKrAGDAAPR5ATcjBKNfXY7NjtYGgbgAYMAA9HkBNyQEo2BdjvaPBAairABgwAD0eQE3JASjYV2PJI8zBqKtAGDAAPR5ATclBKNiXY9fj2oGoq4AYMAA9HkBNyYEo2Ndj4qPmwairwBgwAD0eQE3JgSjZF2Pu4/HBqKwAGDAAPR5ATcnBKNlXY/nj/kGorEAYMAA9HkBNycEo2ZdkBmQLQaisgBgwAD0eQE3JwSjZ12QTZBbBqKzAGDAAPR5ATcoBKNoXZB7kI0GorQAYMAA9HkBNygEo2ldkK2QxQaitQBgwAD0eQE3KASjal2Q5ZDzBqK2AGDAAPR5ATcpBKNrXZETkSYGorcAYMAA9HkBNykEo2xdkUaRXwaiuABgwAD0eQE3KQSjbV2Rf5GPBqK5AGDAAPR5ATcqBKNuXZGvkbsGoroAYMAA9HkBNysEo29dkduR6AaiuwBgwAD0eQE3LASjcF2SCJIVBqK8AGDAAPR5ATctBKNxXZI1kkEGor0AYMAA9HkBNy0Eo3JdkmGSbAaivgBgwAD0eQE3LgSjc12SjJKcBqK/AGDAAPR5ATcuBKN0XZK8kskGosAAYMAA9HkBNy8Eo3VdkumS+AaiwQBgwAD0eQE3LwSjdl2TGJMoBqLCAGDAAPR5ATcvBKN3XZNIk1EGgbkAYMAA9HkBNzAEo3hdk3GTegaSuABgwAD0eQE3MQSjeV2TmpOjBpK5AGDAAPR5ATcyBKN6XZPDk8wGkroAYMAA9HkBNzMEo3tdk+yT9QaSuwBgwAD0eQE3NASjfF2UFZQeBpK8AGDAAPR5ATc1BKN9XZQ+lEcGkr0AYMAA9HkBNzYEo35dlGeUcAaSvgBgwAD0eQE3NwSjf12UkJSZBpK/AGDAAPR5ATc4BKOAXZS5lMIGgboAYMAA9HkBNzkEo4FdlOKU7waiwwBgwAD0eQE3OgSjgl2VD5UgBqLEAGDAAPR5ATc7BKODXZVAlUoGosUAYMAA9HkBNzwEo4RdlWqVewaixgBgwAD0eQE3PASjhV2Vm5WpBqLHAGDAAPR5ATc8BKOGXZXJldsGosgAYMAA9HkBNzwEo4ddlfuWCAaiyQBgwAD0eQE3PQSjiF2WKJYyBqLKAGDAAPR5ATc+BKOJXZZSlmYGossAYMAA9HkBNz4Eo4pdloaWlAaizABgwAD0eQE3PgSji12WtJbHBqLNAGDAAPR5ATc+BKOMXZbnlvcGos4AYMAA9HkBNz8Eo41dlxeXIQaizwBgwAD0eQE3QASjjl2XQZdKBoG7AGDAAPR5ATdBBKOPXZdql3MGkscAYMAA9HkBN0IEo5Bdl5OXnAaSyABgwAD0eQE3QwSjkV2XvJfFBpLJAGDAAPR5ATdEBKOSXZfll+4GksoAYMAA9HkBN0UEo5NdmA6YFwaSywBgwAD0eQE3RgSjlF2YN5hABpLMAGDAAPR5ATdHBKOVXZhgmGkGks0AYMAA9HkBN0gEo5ZdmImYkgaSzgBgwAD0eQE3SQSjl12Yspi7BpLPAGDAAPR5ATdKBKOYXZjbmOQGktAAYMAA9HkBN0sEo5ldmQSZDQaS0QBgwAD0eQE3TASjml2ZLZk2BpLSAGDAAPR5ATdNBKObXZlWmV8GktMAYMAA9HkBN04Eo5xdmX+ZiAaS1ABgwAD0eQE3TwSjnV2ZqJmxBpLVAGDAAPR5ATdQBKOeXZnRmdoGktYAYMAA9HkBN1EEo59dmfqaAwaS1wBgwAD0eQE3UgSjoF2aI5osBpLYAGDAAPR5ATdTBKOhXZpMmlUGktkAYMAA9HkBN1QEo6JdmnWafgaS2gBgwAD0eQE3VQSjo12anpqnBpLbAGDAAPR5ATdWBKOkXZrHmtAGktwAYMAA9HkBN1cEo6VdmvCa+QaS3QBgwAD0eQE3WASjpl2bGZsiBpLeAGDAAPR5ATdZBKOnXZtCm0sGgcUAYMAA9HkBN1oEo6hdm2ubewai0ABgwAD0eQE3WwSjqV2bm5uvBqLRAGDAAPR5ATdbBKOqXZvPm+AGotIAYMAA9HkBN1wEo6tdnACcEAai0wBgwAD0eQE3XQSjrF2cMJxFBqLUAGDAAPR5ATddBKOtXZxlnHcGotUAYMAA9HkBN14Eo65dnJecpAai1gBgwAD0eQE3XgSjr12cxJzPBqLXAGDAAPR5ATdeBKOwXZzvnPgGgcYAYMAA9HkBN18Eo7FdnRidKgai2ABgwAD0eQE3XwSjsl2dSp1bBqLZAGDAAPR5ATdfBKOzXZ17nYwGotoAYMAA9HkBN2AEo7RdnayduQai2wBgwAD0eQE3YASjtV2d2Z3iBoHHAGDAAPR5ATdhBKO2XZ4CngsGkuMAYMAA9HkBN2IEo7ddniueNAaS5ABgwAD0eQE3YwSjuF2eVJ5dBpLlAGDAAPR5ATdkBKO5XZ59noYGkuYAYMAA9HkBN2UEo7pdnqaerwaS5wBgwAD0eQE3ZgSju12ez57YBoHIAGDAAPR5ATdnBKO8XZ74nwEGkugAYMAA9HkBN2gEo71dnyGfKgaS6QBgwAD0eQE3aQSjvl2fSp9TBpLqAGDAAPR5ATdqBKO/XZ9zn3wGkusAYMAA9HkBN2sEo8Bdn5yfpQaS7ABgwAD0eQE3bASjwV2fxZ/OBpLtAGDAAPR5ATdtBKPCXZ/un/cGku4AYMAA9HkBN24Eo8NdoBegIAaS7wBgwAD0eQE3bwSjxF2gQKBJBpLwAGDAAPR5ATdwBKPFXaBpoHIGkvEAYMAA9HkBN3EEo8ZdoJKgmwaS8gBgwAD0eQE3cgSjx12gu6DEBoHJAGDAAPR5ATdzBKPIXaDkoO0GkvMAYMAA9HkBN3QEo8ldoQ2hFgaS9ABgwAD0eQE3dQSjyl2hNqE/BpL1AGDAAPR5ATd2BKPLXaFfoWgGkvYAYMAA9HkBN3cEo8xdoYihkQaS9wBgwAD0eQE3eASjzV2hsaG6BpL4AGDAAPR5ATd5BKPOXaHaoeMGgcoAYMAA9HkBN3oEo89dogOiEQai3ABgwAD0eQE3ewSj0F2iMaJDBqLdAGDAAPR5ATd7BKPRXaJjom8Got4AYMAA9HkBN3wEo9Jdoo+imgai3wBgwAD0eQE3fASj012iuqLIBqLgAGDAAPR5ATd9BKPUXaLoovsGouEAYMAA9HkBN30Eo9VdoxujKAai4gBgwAD0eQE3fgABXQAOf6oADnMsAAAAAAAOf6oAAAAAAKPWouNeAAABgToAAKM0AAAAAAAAAQSj2V6B4oKPBqLko9YAYMAA9l0BJAACJ6LlJ6LmAwaj216CzILRgyEAAZs1AAAAAQOC44MhAAAAAQEBgusAAACDsGDAAPZdAABgwADyswE+AUqC9wEcgxwegv6j3QEAAYCDFMAOgBEAXAEAAZMAwAD1pgaj3V6EjoSShgsAAaLno9YAAAABA4SnhgsAAAABAQGErwAAAIOwYMAA9l0AAGDAAPR5AT4EToT+hQUAAKLoYMAA9HkBk0WFDAGFFYUXAABbYMAA9HkBkwEchR6ChRzADoCRXAEAARaFJ4CFIMAOgGdawAD2YQDAAPWmAYqFL8AOgJEchTCChS/ADoCRXQEAAZQAwAD1nj4DToU+hUAAAIDXYMAA9HkBHIVJgIVCwA6AZ4PQAQABgoVUwA6AkQDAAPZrSYVcIhyFYoOFYMAOgOGAiwEAATd/AMAA9agBHIWWHIWIGoVso9mD0AEAAYOFk8AOgOEAwAD2a4FKAQABGoWZo1gAwAD1pz4BSoWpAYKFsMAOgJE/PYmFvcAOgH4chcSBhb3ADoB+XQEAARyFyYOFx8AOgOGDgwEAARqFy6NyAMAA9JMAwAD1nkmF1xyF4oGF28AOgH5BAQABkwDAAPWcSoXoARaF9oCF78AOgGdawAD2YT9KhgABHIYHlIFWAAAAAMAA9JwGo95ehj6GRY8PAAGbUAAAAAEDhlmPDwAAAAEBAYZeAAAAmzFgwAD23gAAYMAA9l0BPgtJhm4hHIaEFoZ9gIZywA6B7IFMwAD25EEBAAEngWoAwAD2bD4BPTCGmB+GosAA860DAAOAhr/ADoHsJ5sxJ6LpAD9JhvYWhwWAhvrADoHsm0vAAPbxPgE9MIcZH4cjwADzrQMAA4CHQMAOgewnmzEnouoAP0mHixaHmoCHj8AOgeybScAA9vM+AT0wh+Qfh+7AAPOtAwADgIgLwA6B7CebMSei6wA/SYhXFohmgIhbwA6B7JtKwAD29D4BPTCJih+JlMAA860DAAOAibHADoHsJ5sxJ6LsAD9JigAcihQWig+AigTADoHsR8AA9umBZwEAASdJAMAA9m8+AT0wiisfijXAAPOtAwADgIpSwA6B7CebMSei7QA/ToqhiqwAAKLuYMAA9HkBHIq+Foq5gIquwA6B7EfAAPbpgK4BAAEnSQDAAPZwSYrOHIrdgYrSwA6DG0EBAAEciuCUgVYAAAAAwAD0nADAAPWcPgE9MIrqH4r0wADzrQMAA4CLCMAOgewnmzEnou8AP06Le4uHAACbPGDAAPZdARyLmRaLlICLicAOgexHwAD26YCxAgACk4GLpsAOgxsAwAD2c06LuYvCAACi8GDAAPR5AR6LxKPdAQABgovawA6DiwBJi+oci/eDi+7ADoO+gUgBAAGTAMAA9ak+B0mMAxaME4KMB8AOg4uA/MAA9mM+AT0wjCQfjC7AAPOtAwADgIxNwA6B7CebMSei8QA/SYyUHIyhg4yYwA6DvkEBAAEWjLCCjKTADoOLWsAA9mEAwAD1nD4BPTCMwB+MysAA860DAAOAjN7ADoHsJ5sxJ6LyAD9AHI1ag41RwA6DvlwBAAEWjWiCjVzADoOLWsAA9mEAwAD1po1RjW4ATo15jYUAAKLzYMAA9HkBHI2Tgo2HwA6Di4PQAQABg42ewA6DvgDAAPZrTo2xjbkAAKL0YMAA9l0BHI3AJ48dXQEAARyN4ByNzoSNwsAOhJWDzgEAATcQAMAA9KePHwIAApcng80AwAD2eADAAPZySY31IhyOBYSN+cAOhJWBSAEAATcgAMAA9akAHI4chI4QwA6ElYFKAQABN34AwAD1pz4BPY2OS8AOhL8kjnwFJ4L7HI5kgo5ZwA6Di0QBAAGDjmXADoO+AMAA9monkPuFjnPADoS/J4LaPz0wjogfjpLAAPOtAwADgI6vwA6B7CebMSSO8gInovWFjurADoS/AD9KjvsBgo8CwA6DiwFeAA6FoAAOf9UAAAAAAA5/9AAOgEgADoHPAA6FoAAAAAMAo9+i9l8AAAGBBwAAwAC/AAAAAAAAAgKj4F+BH4ElgcoDlA0AAAFgwAD1xQAABQSj4l+BS4FPGBIAWwAEo+NfgVeBXBhjAGDAAPR5AASj5F+BZIFnGIITAGDAAPR5AASj5V+BcoF5GKL3AGDAAPZdAASj5l+BgoGGGINmAGCj4AABBaPoX4GKgYqByAAAAAOBjoHIAAAABQUFgZQAAAQSWwCBnwAABGNgwAD0eQCBqwAABIITYMAA9HkAgbUAAASi92DAAPZdAIHDAAAEg2Zgo+AAAGCj4AE/BggBo+KAAMAOhlwIAaPjgQDADoZkCAGj5IIAwA6GcAgBo+WDAMAOhn0IAaPmhADADoaKCQGBisAA9dsAAAAAAAAADobbAAAAAAKj6V+CrIKyjIMDovgAAAFgwAD1xQAABQSj61+DJoNBBqL5AGDAAPR5ARyDPhyDNxyDMDcQgz4BAAE3hAAAwAD1oIM+AQABN4QAAMAA9aCBQQEAAZQAwAD1nwSj7F+DV4NuBqL6AGDAAPR5ARyDaDcIgz4BAAE3hAAAwAD1oASj7l+DmoOuGKL7o98AYMAA9HkBGoOio+wEo+9fg9SD3hii/KPfAGDAAPR5AZMEo/BfhAaEKxii/aPfAF3AAPUdAWCj4AEehBPAAO6CAQFgo+ABGoQeo+wAAQWj+QAAAAAEAAADAAAAAAAAAAAAYKPpAT8BCQEAwAD12wAAAAAGBqPyX4QwhD6FPwABhXkAAAABA4REhT8AAAAEBASETwAAABJdwAD1HQFgwAD0eQCEWQAAAGNgwAD0eQCEZAAAAIITYMAA9HkAhG4AAACbsmDAAPKzAABgwAD2XQE+A06EgwAAAIT7WwBJhIqDhI7ADogqPgE9jIShwA6IQR6EqcAA9oUDAAOAhL7ADof/gYTEwA6IEYKEy8AOiB0APgE9jITkwA6IQRyFDh+E7MAAw6YBAAABln0phXUDAAOAhRbADof/gYUcwA6IEYKFI8AOiB0AwADDn0qFMwEmhTMBhIU6wA6IQWDAAPZdBqPzX4VEhU+F+gABov4AAAABA4VYhfoAAAADAwOFYwAAABJdwAD1HQFgwAD0eQCFbQAAAGNgwAD0eQCFeAAAAIITYMAA9HkAAGDAAPR5AT4DToWHhYkAAIDVYMAA9HkBN5UFRYWVAYWehaAAAFtgwAD0eQGBhaLADoj7ARyFq4SFqcAOiTNcAQABgoWtwA6JBwDAAPWmAYyFssAOiTMchbOEhbLADokzXQEAAZQAwAD1nj4BPYuFv8AOiR4chdwchdEchc0chceDhcXADokeg4IBAAE3BQDAAPSVXQEAAYOFz8AOiR4AwAD1nl0BAAEchdeAhdPADojpRAEAAYSF2MAOiTMAwAD1LADAAPWegywBAAEahd6j6wDAAPSRSoXuAYOF9cAOiR4Go/Rfhf+GCoa+AAGi/wAAAAEDhhSGvgAAAAMDA4YcAAAAEmDAAPZdAIYmAAAAY2DAAPR5AIYxAAAAghNgwAD0eQAAYMAA9HkBPgNOhkCGQgAAgNVgwAD0eQE3lQVFhk4BhleGWQAAW2DAAPR5AYGGW8AOih0BHIZkhIZiwA6KVVwBAAGChmbADoopAMAA9aYBjIZrwA6KVRyGbISGa8AOilVdAQABlADAAPWePgE9i4Z4wA6KQByGoByGihyGhhyGgIOGfsAOikCDggEAATcFAMAA9JVdAQABg4aIwA6KQADAAPWeXQEAARyGkYCGjMAOihGD0AEAAYSGnMAOilUAwAD2awDAAPWegywBAAEahqKj6wDAAPSRSoayAYOGucAOikAGo/VfhsOGw4jYAACjAAAAAAEDhsmI2AAAAAAAAABbAT4FTobWht4AAKMBYMAA9HkBHIbmFobgLqL7o9+j7oM+AQABlQDAAPWgTobzhvwAAKMCXcAA9R0BYKPgAR6HAsAA7oIBAWCj4AGAhw3ADos6AEWHGwGHJIcmAABbYMAA9HkBkwEchy2ChyvADouMXAEAARaHLy6i+6Pfo+4AwAD1pgGKhzbADouMHIc3goc2wA6LjF0BAAGUAMAA9Z4+Ak6HSIdKAACDXGCj4AEch1IWh0wuov2j36PwRAEAAYKHU8AOi4wAwAD1LEOHXSEch2aDh2TADovXQQEAASsAwAD10j4GTod+h4AAAINZYKPgARaHhIOHgsAOi9eDZqPmToeWh58AAJbPYMAA9HkBIyWHqBaHo4OHocAOi9cSo+JgwAD2XRyH4x6HwKP0AwADJofNARaHzYOHy8AOi9cSo+JgwAD2XRaH1YOH08AOi9djo+MWh96Dh9zADovXghOj5ACDLAEAARyH7oCH5sAOizqBQQEAAZQAwAD1nwDAAPSRHIgjHogBo/MDAAMmiA0BFogNg4gLwA6L1xKj4l3AAPUdAWDAAPR5FogVg4gTwA6L12Oj4xaIHoOIHMAOi9eCE6PkAIMsAQABHIgugIgmwA6LOoFBAQABlADAAPWfAMAA9JEBYMAA9HlOiEGIQwAAhPtgo+ABHIhNgYhFwA6LYUQBAAGFiE7ADow2AMAA9Sw9F4hjg4hhwA6L14NmhohqwA6NH6PmPRyIfYGIdcAOi2GAsgIAAoWIfsAOjDaDiIrADovXAMAA9S09i4iVwA6L14SImcAOjBs9F4iuLqL7o9+AiLbADos6o+49F4jDLqL9o9+BiMzADotho/AGo/ZfiN2I5IwiAACbrgAAAAEDiPCMIgAAAAQEBIjxAAAAElsAiPsAAABjYMAA9HkAiQYAAACCE2DAAPR5AIkQAAAAm7JgwADyswAAYMAA9l0BPgxJiSEciSwWiSUuovyj36PvgIsBAAEWiS4uovuj36PuAMAA9ag9HIk1LqMAAAAAAKP1P06JR4lNAAAnYMAA9HkBIyWJVICJT8AOjc5gwAD2XR6JaKP0AwADFIlzwA6NzgABYMAA9l2BiXnADo3WgomAwA6N4gAeiY+j8wMAAyaJmQGAiZnADo3OXcAA9R0BYMAA9HmBiZ/ADo3WgommwA6N4gABYMAA9Hk9jImwwA6OOByJvoSJuMAOjjiDLAEAARyJxxaJwS6i+6Pfo+6BQQEAAZQAwAD1nwDAAPSRTonWidgAAIT7YKPgARyJ4BaJ2i6i/aPfo/BEAQABhInhwA6OOADAAPUsTonyifQAAINcYKPgAYWJ9sAOjuJOigGKBQAAluVgwAD0eQEciguCigfADo3igUEBAAGBig3ADo3WAMAA9Z9DihghHIohhoofwA6PDEEBAAErAMAA9dI+AkmKMhyKRhyKPBaKOIaKNsAOjwyCE6PkgUEBAAEWikCGij7ADo8MY6PjAMAA9Z9BAQABh4pJwA6PIADAAPWcPgROilyKXgAAW2DAAPR5AYGKYMAOjdZOimeKaQAAlyBgwAD0eQEWim2GimvADo8MY6PjQ4p8IhyKhRSKg8AOj6QIAFwBAAGCiofADo3iAMAA9aYAHIqWHIqSgIqOwA6NzkQBAAEUipPADo+kCAAAAEEBAAEcip8WipuGipnADo8MEqPiRAEAARSKoMAOj7kJAAAAAMAA9dI+Aj0VirDADo+kCByKsRSKsMAOj6QIAF0BAAGUAMAA9Z49FYq/wA6PuQkcisAUir/ADo+5CQBdAQABlADAAPWeSYrWHIrcFIrawA6PpAgAQQEAAYKK38AOjeIAwAD1nD4BSorwARaK+YaK98AOjwyi96PlPz89josawA6PDBaLIIaLHsAOjwyDZqPmTos3AAAAovdgwAD2XQBJi0Qli02Ai0jADo3OYMAA9l09FYtewA6QxQgci20Ui2jADo3OAAFgwAD2XYCxAgACgYt3wA6N1oKLfsAOjeIAwAD2cz0Vi5PADpDFCB6LnaPyBAAEJoukAYCLpMAOjc5dwAD1HQFgwAD0eYGLqsAOjdaCi7HADo3ig4u2wA6N7wA9HIvMFovGLqL9o9+j8ICyAgAChIvNwA6OOB+L2qPoBQAFgIvfwA6NzoGL5cAOjdaCi+zADo3iFIvxwA6QxQgAhYv6wA6O4gAAwAD1LT0XjAIuovyj3xyMCBaMAi6i/KPfo+9dAQABlADAAPWeo+9KjBABFIwXwA6QxQgABqP3X4wnjCeMgQAAgdAAAAABA4wsjIEAAAAAAAAAWwE+Az0XjDUuovuj3xqMPaPso+49F4xPLqL9o98ejFzAAO6CAQFgo+ABFoxnLqL7o9+j7gCj8D0XjHMuovyj35Oj7wAADofiAA6IzAAOifQADosXAA6NsQAOkc8ADpIwAAAABgAAAV8ADpJTAA6F2QAOhuQADpJRAAAAAgAOklMAAAAAAKP6AGAAAAAAAAABAqP7YIFmgXWDFgejAwAAAWDAAPXFAAAAAQWkAQAAAAAEAAADAAAAAAAAAAAAYKP7AT8BCQEAwAD12wAAAAADBqP9YIITghuCHgECghMAAAABA4Iegh4AAAAAAAAAYMAA9HkABqP+YIJ8goSCigECWgAAAAEDgoqCigAAAAAAAABgwAD0eQAGo/9ggwaDDoMUAQKDFQAAAAEDgxSDFAAAAAAAAABgwAD0eQAAAA6SvAAOkuAADpMDAA6TJwAAAAMAAAFgAA6TPgAOkn0ADpM8AAAAAQAOkz4AAAAAAKQCAGEAAAGA2gAAwABDmgAAAAAAAQKkA2GA84D5gX8DowQAAAFgwAD1xQAAAQSkBWGBHYE6BKMFAGDAAEObAR+BLMAAQ6QAAAAAAQWkCQAAAAAEAAADAAAAAAAAAAAAYKQDAT8BCQEAwAD12wAAAAABBqQHYYE/gU2BfQABowYAAAABA4FTgX0AAAABAQGBWwAAAIOwYMAA9l0AAGDAAPZdAUqBZgEcgW8agWakBaMGAQABgIF2wA6T5wDAAEOdAAAOk8oADpQYAAAAAQAAAWEADpQnAA6TbgAOlCUAAAABAA6UJwAAAAAApAoAYgAAAAAAAAABBKQMYoEvgYgGnM8AXcAA9R0BYMAA9l0BOoFIYMAA9l0GJ5qCJ5qDJ5qEJ5qFJ5qGJ5qBAAFiAA6UggAOlE0AAAAAAA6UggAAAAAApA2jB2MAABaA+QAAi/MAAQEFlGSUv5Tokj2U74GVAACqwKMIAIG8AQCqagAAgd8BAMAAQ6UAAQEBnR+CIgEAwABENAABAQGjCYJdAQDAAEQ/AAEBAZ0igpoBAMAARHQAAQEBowqC1QEAwABEhgABAQGdI4MSAQDAAESXAAEBAaMLg2QBAMAARKQAAQEBowyDsAEAwABErgABAQGjDYP6AQCq5QABAQGdJIQ7AQDAAES7AAEBAaMOhJMBAMAARMgAAQEBnSWE2QEAwABE1AABAQGjD4UYAQDAAETbAAEBBKMQoxGjEp0mhdMBAMAARS0AAQEBoxOGGQEAwABFPgABAQGjFIZUAQDAAEVGAAEBAaMVhqABAMAARVwAAQEBoxaG4wEAwABFawABAQGjF4cgAQDAAEV6AAEBAaMYOKT2pR6lNKrpwABDrsAARDXAAERAwABEdcAARIfAAESYwABEpcAARK/AAES8wABEycAARNXAAETcwABE8MAARQbAAEUhwABFMMAART/AAEVHwABFXcAARWzAAEWAwABOisAATqfAAE6vwABOiMAATonAAE7CwABOzcAATvLAAE8BwABPJsAATyzAAE8xwABPOsAAT0jAAE9cwABPasAAT3HAAE+ywABPwcAAT9bAAE/kwABP/8AAUAXAAFAWwABQJ8AAUEPAAFBOwABQYsAAUHLAAFCBwABQjgAAAAADBqQPY4dYh1yIBQABoxkAAAABA4dtiAUAAAACAgKHeAAAAIFmYI2fAIeFAAAAgdpgjZ8AAGDAAPR5AT4DToeQh5IAAFtgwAD0eQEch6Mkh6IBFoeZgIeXwA6Wz4QYjRiB3wEAASSHuwEWh7KBh7DADpbahBiNGADAAPZtSYfAIRyHxoKHxMAOlu9BAQABkwDAAPWcSofMAYKH08AOlu8/SofYARyH7BaH4YCH38AOls+UE4wcgd8BAAEWh/iBh/bADpbalBOMHADAAPWdBqQQY4gIiA2I8AABoxoAAAABA4g9iPAAAAABAQGISgAAAJhQYI1eAABgwADyswE+Ak6IbYh6AACUwF3AAPUdAWCN6wEWiIiAiHzADpeblMCNY0qImAEiHIizFoisgYifwA6XsFrAAPVMQQEAAZQAwAD1nAAliNUWiM6BiMHADpewgLbAAPUDYI4XBqQRY4jziQSLkAABoxsAAAABA4kXi5AAAAABAQGJLwAAAKMcXcAA9R0BYKrBAABdwAD1HQFgjJoBPgRJiUUciVqAiUnADpglQQEAASsAwAD10j4BSondASs/TooCigkAAIEQXcAA9R0BYIyaAR6KD8AA9SIDAWCMmgIWij+Aii7ADpglWsAA9UwrAZMPKUWKZgGKb4pxAABbYMAA9HkBkwEciniCinbADpiaXAEAARaKi4CKesAOmCVawAD1TADAAPWmAYqKk8AOmJocipSCipPADpiaXQEAAZQAwAD1nj4DToqviroAAJ7rYKrBARyKzICKvMAOmCVEAQABgorNwA6YmgDAAPUsToriiusAAKMdXcAA9R0BYMAA9l0BHIr+For4g4rtwA6Y6o8AqsSAoQAAAADAAPTxPRyLEoGLDMAOmGOAsgIAAoKLE8AOmJojFosjg4sYwA6Y6pRlqsMfiziMpwEAAYSLSMAOmREAH4tgjKgBAAGEi3DADpkRAAFgjJoAwAD1LUqLgQGBi4jADphjAWMADpmaAA6WsAAAAAAADpayAA6XfgAOmAgADpmaAAAAAwCkEqMeZAAADYEAAACL8wABAQGFS4EvAACCF5+8AQEBgZeBdAAAgswAAQEBgZuBtAAAqmoAAQEDnSCdCZ0nggMAAINKAAEBAYGdgjkAAJx0AAEBAZHVglwAAJlzAAEBA4RwgbKEk4KkAADAAEWLAAEBAaMfgtoAAIjlAAEBAYGfgwEAAMAARY4AAQEBgZeDJAAAmYoAAQEBhKODRwAAmZYAAQEBhKSDeQAAgqIAAQEBgZkAAAABAqQTZIQKhBmYZQedCgAAAWDAAEWPAAAOBKQVZIRVhGIJkd4AYJmXAASkFmSEfISJCZ0PAGCCPgAEpBdkhKSExQmB5wBgg00BGoS+g1cEpBhkhQaFNwmFTgBdwAD1TgJgwAD23mCUNwEWhSwahSSDV4VOg1AEpBlkhUiFbRijIABgwABPAQErBKQaZIV9hZMYoyEAYMAATwEBKwSkG2SFo4XIGKMiAGDAAE8BASsEpBxkhdiF7hijIwBgwABPAQErBKQdZIX+hhQYoyQAYMAATwEBKwSkHmSGJIZDGKMlAGDAAE8BASsEpB9khk2GZRidlwBgwADyswAEpCBkhm6GihijJgBgwADyswAEpCFkhpOGpBijJwBgwADyswAEpCJkhq2GxBijKABgwADyswABBaQxZIbJhsmJSgAAAAOG3YlKAAAAAwMDhuUAAACEsmCZiwCG8gAABJHeYJmXAIcGAAAEnQ9ggj4AAGCkEwE/BwgBpBWBAMAOm8QIAaQWggDADpvPCACkHxyHZRaHUBqHSINXb4NPhNABAAEah4qCrQCDBwgApCAch/MWh94ah9aDV2+DT4TQAQABGogYgq4AgwcIAKQhHIh6FohlGohdg1dvg0+E0AEAARqIn4KvAIMHCACkIhyI/BaI5xqI34NXb4NPhNABAAEaiSGCsACDBwkAiT3AAEWWAQABgIlDwA6buQAMBqQkZIp5ioiK2gACnRIAAAABA4qcitoAAAADAwOKqAAAAICgYMAA9t4AirEAAACEGGDAAPbeAIrTAAAInRNdwABPcQJgwABQTlsAAF3AAE9xAmDAAFBOWwAGpCVki5mLnou6AAKdFAAAAAEDi6iLugAAAAEBAYu2AAAAmTxdwABOzQJgwABQTlsAAFwABqQmZIu/i8OL+AAAndUAAAABA4vPi/gAAAABAQGL1AAAAICgYMAA9t4AAGDAAPbeAUqL3AEci+oWi9wukd6kFZufAQABgIv0wA6dLwCZngakJ2SM2ozmjhAAAJ3qAAAAAQONCI4QAAAAAQEBjRAAAACR5F2cdwFbAABgwABPAQE+AkmNHiEcjUgWjSIuoyCkGUEBAAErAMAA9dI+AUqNWQEWjWAuoyCkGT9KjZEBF42YLqMgHI3bFo3PgI3IwA6dfprrnIGjKQEAASejKgDAAE+RpBkGpChkjueO84/iAACd6wAAAAEDjwaP4gAAAAEBAY8OAAAAkeRdnHcBWwAAYMAATwEBPgJJjxwhHI83Fo8gLqMhpBpBAQABKwDAAPXSSo9AARaPRy6jIaQaP0qPYwEXj2ouoyEcj58Wj4qAj4PADp4DmuucgaMpAgABJ6MrAaMsKcAAT5GkGgakKWSQw5DPkiMAAJ3sAAAAAQOQ8ZIjAAAAAQEBkPkAAACR5F2cdwFbAABgwABPAQE+AkmRByEckTEWkQsuoyKkG0EBAAErAMAA9dI+AUqRQgEWkUkuoyKkGz9KkXoBF5GBLqMiHJHFFpGwgJGpwA6eiZrrnIGjKQIAASejLQGjLCnAAE+RpBsGpCpkkvmTBZQyAACd7QAAAAEDkxiUMgAAAAEBAZMgAAAAkeRdnHcBWwAAYMAATwEBPgNJky4hHJNJFpMyLqMkpB1BAQABKwDAAPXSSpNSARaTWS6jJKQdP06ThJONAACSQ13AAE9xAmDAAFBOWwEck5aAk4/ADp8RnTkDAAIek5/AAPcMAQABJ5qPAByTuJSBVgAAAADAAPScAZ06FpPVgJPOwA6fEZrrnIGcikqT5wEXk+4uoyQclBCBlAfADp9OoykBAAEnoy4AwABPkaQdBqQrZJQ3lDyU8wAAndYAAAABA5RWlPMAAAABAQGUXgAAAJHkXZx3AVsAAFwBPgFGlGyUpZR4AAAAgKBgwAD2XQAWlI0WlH8unQ+kFoQjgkE+AT0clLSAlK3ADp/hnTkDAAIelL3AAPcMAQABgZTDwA6f+ACTAZ06FpTdgJTWwA6f4ZrrnIGcigakLGSU+JT9lWAAAp0QAAAAAQOVEZVgAAAABAQElR0AAACR4WDAAPbeAJUsAAAAhBhgwAD23gCVPwAAAJIDXcAA9R0BYMAA9HkAlVUAAACYKl3AAPUdAWDAAPR5AABcAAakLWSVZZVqlZwAAJ2cAAAAAQOVeJWcAAAAAQEBlZIAAAiECV3AAE9xAmDAAFBOWwAAXAE+AAakLmSVoZWylycAAJ3pAAAAAQOVyJcnAAAABgYGldgAAAAiYIiTAJXrAAAAhBdgwAD0eQCWAQAAAFpgwAD0eQCWEwAAAIQYYMAA9t4AljcAAACjL13AAPUdAWCIsQCWVgAAAIRzYIjrAABgiMEBPgJOlneWiAAAozBggs0BFpaSFpaKLoHnpBdvg09Klp8BHJa3hpamwA6hU4S9AwADHJbPgJbHwA6g/4HrAwADg5bcwA6hIoGW5cAOoQmClvHADqEWAIiahZcCwA6hQISXFMAOoS8AgvkGpC9klyyXNZhjAACd4wAAAAEDl0CYYwAAAAMDA5dKAAAAhHNgiOsAl1wAAAAiYIiTAJdpAAAAhBhgwAD23gAAYIjrAT4DPSMcl4GAl3jADqHVQQEAASsAwAD10oiXeMAOodUWl5IWl42Bl4XADqHgghqIlYRziI4rAWCI60mXoByXrYCXpMAOodVBAQABGpe5iPMAwAD10j4BPYiX1cAOodUjFpfuFpfgLp0PpBaB4IJEGpgEiPYamBeI8gFgiOs/SpgoAR6YL8AARY0DAAOAmD/ADqHVFphRgZhJwA6h4IIaiJWCmFfADqHqAAAADpyFAA6c3gAOnRIADp1hAA6d5gAOnmwADp70AA6fxAAOoEwADqCsAA6g4gAOobgADqKkAAAADAAAAWQADqLfAA6acgAOot0AAAABAA6i3wAAAAAApDKjMWUAAAqA/wAAwAC/AAABAQGFHoEnAACL8wABAQyUfIVjkjWUsJX9lDCViJI7kj2SPpI/lGqCMQAAg2gAAQEEhJOH1o5rjrqCywAAmXsAAQEDkbube4MYgxYAAKQNAAEBB50gozKdIaMNoxSdJ6Mzg/gAAIldAAEBAYGzhEcAAMAARZcAAQEBozSEgAAApNQAAQEBnRqEuwAApEoAAQEBnQyE5wAAwABFrwABAQGjNQAAAAECpDNlhSmFL507A50LAAABXcAAT3ECYMAART9gjEcAAAMEpDVlhYeFjgmECQBgjEcABKQ2ZYWehaQYkeQAYKRLAASkN2WGS4ZgGKM2AF3AAPVOAmDAAPZdYMAA9l0BKwEFpEllhmWGZYbTAAAAA4Z3htMAAAACAgKGfQAABIQJYIxHAIaLAAAEkeRgpEsAAGCkMwE/AwgBpDWAAMAOpCgIAaQ2gQDADqQzCQCGm8AAT5sDAAMWhqmAhqHADqQohBiMSh+GtqUbAAAAAB+Gx6UbAAAAAAAOBqQ5ZYbYhu2HDwEAlD0BGobZwADuSwAAAQOG+YcPAAAAAAAAAGDAAPKzAUqG/AEWhwQWhvwuhAmkNZQ9jF0GpDplhxSHHIc0AQCAoAAAAAEDhyCHNAAAAAAAAABgwAD23gFKhyMBFocrFocjLoQJpDWR4YxJBqQ7ZYc5h0GHWwEAhBgAAAABA4dJh1sAAAAAAAAAYMAA9t4BSodMARaHVBaHTC6ECaQ1hBiMSgakPGWHYId3h4sBAICwARqHYcAA7ksAAAEDh3yHiwAAAAAAAABgwAD2XQFKh38BFoeHFod/LoQJpDWAsIxOBqQ9ZYeQh6iHuQEAgdMBGoeRwADuSwAAAQOHr4e5AAAAAAAAAGCMRwFKh7IBFoeyLoQJpDUGpEBlh76Hw4iDAACjNwAAAAEDh+OIgwAAAAAAAABcAT4BPRyH7C6jOAMAAyeZjR+IF8AATyoDAmDAAEU/YJJZAyCIWpJ2AAAAAC4ciG+UgVYAAAAAwAD0nAAciHyUgVYAAAAAwAD0nACkQwakQWWIiIiNitcAAJRBAAAAAQOIlYrXAAAAAQEBiJwAAACZPGCMzgAAXAE+BU6IuIjEAACjOWDAAEWcAR+IysAARa4CAAKAiNvADqYtLgA9HIjrLqM4AwADFoj6gIj2wA6mLYCwjNSBiQDADqY+FokRgIkNwA6mLZQTjBwApEM9HIkxFokmgIkiwA6mLZQ5jOODvAEAARaJRYGJOcAOpj6UP8AARakAwAD06z0ciWYWiVmAiVXADqYtlImM4oO8AQABFol6gYluwA6mPpQ/wABFqQDAAPTrRomKiaqJlQAAAJREYI0xABaJooCJnsAOpi2UOozhPgFJibIcicYWicEWibyCibbADqbsgLCNF4CwkjVBAQABJ5MyAMAA9mw+Ak6J8In8AACSRWCQkQEmifABFooEgon+wA6m7JJFjTVgkJFGihmKSAAAAAEAYI5jABaKO4OKL8AOpzGVVJCVPgJOiigAAACZuGCPDAEmihkBhIoowA6nV2CPDD0eimuJbAEAASaKfwEWin+FinvADqdxgdOPEGCNnwA+AT0cirWBiqnADqY+lD8BAAGCir/ADqbsAMAARakGpEJlityK4Yx9AACUPwAAAAEDiuqMfQAAAAEBAYryAAAAkltgjRMAAFwBPgJOiweLDAAAgLBgwAD2XQEWixoWixWAiw7ADqfkgLCNF4CwkjVJiyQciy2BiyjADqf1QQEAASejOgDAAPZsPgROi0uLUQAAlERgjTEBJotLAYCLU8AOp+RgjTFOi2+LdgAAg7BgkDEBJotvARaLfoKLeMAOqDSSRY01YJAxTouVi5oAAIHwWwEei5zAAL8mAQABFouug4unwA6oT4CKkDMAPReLvC6jNiMhHIvjhIvewA6ocUEBAAErAMAA9dIei/HAALsYAQJgwAD2XWDAAPZdASaMCgGEjArADqhxXcAA9U4CW1sAKwFdwAD1TgJgwAD2XWDAAPZdpDc+AT0cjCsuozgDAAOBjDbADqf1H4xApOoCAAKAjFLADqfkLgAWjGiAjGHADqfklBOMHACkQwakQ2WMgoyajqMAAKM4ARqMg8AA7ksAAAEDjKSOowAAAAMDA4ysAAAAgLBgwAD2XQCMvgAAAJ1mYMAATwEAjM8AAACEF2DAAPR5AABgwABPAQE+BUmM4SIcjOqAjOXADqlGQQEAASsAwAD2bAEWjPqAjPXADqlGgPzAAPZjSo0DASs/To0ZjSIAAIRBYMAA8rMBFo0wgY0kwA6pU4RBwABPFkmNPoONQsAOqaY+AT0cjWEWjVQunujAAE91ozsCAAKAjWvADqlGgY1xwA6pUwClIz4BPRyNnxaNki6e6MAAT3WUPwIAAoCNqcAOqUaBja/ADqlTAKUiSY3HIRyN0YCNzMAOqUaBZwEAASeAqADAAPZvPgFJjeqDje7ADqmmPgE9HI4VFo4CLqM8wABPdqM7AgACgI4fwA6pRoGOJcAOqVMApSM+AT0cjl0WjkouozzAAE92lD8CAAKAjmfADqlGgY5twA6pUwClIj9Kjo0BgY6UwA6pUwakRGWOqI6tj+AAAJRGAAAAAQOOt4/gAAAAAQEBjsAAAACWAWCMqQAAXAE+A06O2I7dAACCF2CSWQEWjueAjt/ADqq2gheMr0mO8SIljvqBjvXADqrHYJKcAByPHhaPEhSPDcAOqscBAWCSnJX+kqJBAQABKwCSwj4BPR6PL5l/BAAEJ4QCJ5RGFo9XgI9PwA6qtpQTjBwWj2uAj2PADqq2hBiMqwA/PRyPfy6jOAMAAxaPkoCPisAOqraAsIytH4+cwABFuQIAAoCPscAOqrYuABaP0YCPycAOqraUE4wcAKRDBqRFZY/lj/aQggAAoz0BGo/mwADuSwAAAQOQAJCCAAAABAQEkA8AAACAsGDAAPZdAJAhAAAAkltgwABPAQCQLQAAAIQXYMAA9HkAkD4AAACUXWDAAPKzAABcAT4BPR6QTpl+AwADJ6M9gpBqwA6ruhaQdi6EGKQ7AAakRmWQh5Cfk5QAAKM+ARqQiMAA7ksAAAEDkLqTlAAAAAYEBJDJAAAAgLBgwAD2XQCQ2wAAAIPmYMAATwEAkPAAAACDm2DAAE8BAJD7AAAAhBdgwAD0eQACkRMAAACUXGDAAPKzASqRKQAAAJRdYMAA8rMBKmDAAE8BAT4FSZFBHJFNgZFFwA6sJkEBAAGCkVDADqwzAMAA9dJKkVcBgZFewA6sJj9JkWslkXeBkW/ADqwmXcAAT2oCYMAAUE5bSpGOARSRlcAOrCYBAV3AAE9qAmDAAFBOWz9JkaIlkayCkabADqwzXcAAT2oCYMAAUE5bSpHDARSRysAOrDMCAV3AAE9qAmDAAFBOWz9Jkqockr0WkraBkq7ADqwmklHAAE8FQQEAAS4AwAD10kqSxgGBks3ADqwmP0qS2gEfkuXAAES6AgACgJMHwA6sGRyTYRyTQBqTFYRrhM0BAAGAk07ADqwZAIiugesDAAMWk24uhBikO4OTd8AOrEAWk4iAk4PADqwZWsAA9mEAiJoABqQ+ZZOZk7CUAwEAoz8BGpOawADuSwAAAQOTwpQDAAAAAAAAAGDAAPZdAT4BSpPIATUAAAABAGDAAPZdARaT1xaTzy6ECaQ1gLCMTiMck9yAAMAOrbVBAQABKwAAJJP/AyejQBaT9BaT7C6ECaQ1hBiMSiejQYAAwA6ttQFgwAD2XQakR2WUCJQNnTkAAJ0RAAAAAQOUHJ05AAAAAAAAAFwBPgI9NQAAAAEAXcAA9U4CYMAA9l1gwAD2XQEWlCUuozakNyMclDyAAMAOrilBAQABKwAAKxyUPIAAwA6uKYO8AQABNJREA5RElw4AAAACAgKUTAAAAICwYMAA9l0AlFkAAACjQmDAAPZdAABgwAD1ggE+A06UegAAAJ1mYMAATwEAQUeUjYGUlcAOrnUCApSqJ5mNlMInmY4APgI9i5VewA6umRyVkRaVfxaVcxaVbC6R5KQ2muucgaM8wABPdkQBAAGBlZLADq51AKUkQpWjAAABPgJOlc6V1gAAImCIkwEjHJXkgpXYwA6ugkEBAAErAMAA9mwclhEalfyHQ4TNAQABgZYfwA6udQCIrhyWSRqWNYdlhM0BAAGCllfADq6CAIiuAWCIkz2Llm/ADq6ZH5aPwABEugIAAoGWqMAOrnUclraElq7ADq76hMcAAAAAiJsAPRyW6xaW2C6jPMAAT3aUPwIAAoGW9cAOrnWDlvvADq6ZAKUiAMAA9W0BXEaXFpdHlx8AAACUHGCMNwAWlzQWlywuhAmkNZQ1jFI+C06XU5dYAACDsmCMKwEWl2SAl1rADq+og7KMOk6XdAAAAJ7mYMAA9t4ATpeNAAAAgLBgwAD2XQBOl56XpwAAhEFgwADyswEqSZe2JZe/gZe6wA6vxWCMzj4CPYqX08AOr+AWl/YWl+UUl+DADq/FAQFgjM6UWoz4keGMST2LmAnADq/uFpgVFJgQwA6vxQEBYIzOgLCM1EmYKCWYMYGYLMAOr8VgjZ8+Az2KmEnADq/gFphsFphbFJhWwA6vxQEBYI2flFqNHJHhjEk9i5h/wA6v7haYkBaYixSYhsAOr8UBAWCNn4CwjReAsJI1PYyYnsAOr/wWmK4UmKnADq/FAQFgjZ+EQY28SZjFJZjOgZjJwA6vxWCNEz4CPYqY48AOr+AWmQYWmPUUmPDADq/FAQFgjROUWo0ckeGMST2LmRnADq/uFpkqFpklFJkgwA6vxQEBYI0TgLCNF4CwkjVJmT0lmUaBmUHADq/FYIypPgI9iplcwA6v4BaZfxaZbhSZacAOr8UBAWCMqZRajLSR4YxJPYuZksAOr+4WmZ4UmZnADq/FAQFgjKmAsIytPgE9Hpm7mX8EAAQkmdoBFpnNgZnIwA6vxYUDwAD12SedERyZ75SBVgAAAADAAPScFpnzLoQYpDsATpoemiYAAIQJYKQzASaaHgEcmjcWmi8WmigukeSkNp07nHlEAQABgpo4wA6v4ADAAPViYKQzSZpLHJpXhZpPwA6xqkEBAAErAMAA9dI+AT0emmqZfQMAAxyamxqah4dlhM0BAAEkmsgDJ6NDgpq7wA6v4CeA8gCIrhya15SBVgAAAADAAPScFprnLoQYpDsAP06bCwAAAJ1mYMAATwEASZsehJsiwA6v/D4CPY6bNsAOsjscm18Wm1gWm0yFm0TADrGqnWfAAE90mc2k70QBAAGDm2DADq/uAMAA9WI9HJuCFptvLqM8wABPdqM7AgACg5uMwA6v7oabksAOsjsApSM+Aj2Om7fADrI7HJveFpvZFpvNhZvFwA6xqp1nwABPdJ2PpO5EAQABg5vfwA6v7gDAAPViPRycARab7i6jPMAAT3aUPwIAAoOcC8AOr+6GnBHADrI7AKUiSZwtHJw9hpwxwA6yO0EBAAErAMAA9dI+AT0enFCZfQMAAxycgRqcbYdlhM0BAAEknNYFJ6NEg5y0wA6v7iejRYKcycAOr+AngPIAiK4cnOWUgVYAAAAAwAD0nBac9S6EGKQ7AD9AHJ0ZgZ0UwA6vxUEBAAEWnSiGnRzADrI7gdPAAE8IAMAA9dKdFJ0uAAAADqSGAA6kxAAOpPsADqUyAA6lcAAOpaUADqYQAA6nxwAOqSIADqqZAA6rfAAOq/UADq2DAA6uBQAOs5AAAAAOAAABZQAOs9MADqOwAA6z0QAAAAEADrPTAAAAAACkSqNGZgAACoD2AADAALHJAAEBAQOBGAAAi/MAAQEElHyBloVjlDCBZAAAg2gAAQEDhWeFa4e6gcIAAKQNAAEBA50ioxSdJ4IqAADAAEW6AAEBAaNHgnMAAJx0AAEBAZHVgpkAAJl7AAEBAZt7gsQAAKQSAAEBAZ0KgwcAAKQyAAEBAZ0Lg0QAAJv9AAEBAZHQAAAAAQKkS2aDcIN2jC8DnQwAAAFdnHcBYIxHAAAAAQWkVmaDnYOdg9QAAAADg6eD1AAAAAEBAYO9AAAAgdNgpBMAAGCkSwE/AQkAg8ecmgEAAYCDzcAOtLYABwakTWaD2YP3hDEBAJ3SAAAAAQOEDoQxAAAAAAAAAF2IqgFeAAUFBWDAAPR5YMAA9HlgwAD1j2DAAPWPYMAA9Y8AAVeDagBgiJMBSoQXARqEF4RfBqRPZoTUhO2IKgAAkeUAAAABA4T8iCoAAAADAQGFBwAAAIHpYJPfAAKFHgAAAJHmYQFgwAD23mDAAPKzASuFMwAAAJ3RYMAA9HkBk13AAPUdAWCkMwE+CU6FVoVpAACjSF3AAPUdAWCMRwEWhXWAhWvADrVKhCyT406FjoWhAACjSV3AAPUdAWDAAPbeATGFqGDAAPbeAE6Fu4XCAACB02Cb/gEmhbsBFoXJLoHTnHxgm/5FhdUBhd6F4AAAW2DAAPR5AZMBHIXnhoXlwA615FwBAAEWhfyDhenADrWGWsAA9UwAwAD1pgGOhgTADrXkHIYFhoYEwA615F0BAAGUAMAA9Z4+A06GGYYhAACECWCMRwEchjWDhiPADrWGRAEAAYaGNsAOteQAwAD1LE6GRIZIAACAoGDAAPbeARaGUoeGSsAOtjSR4YxJSYZjIhyGboGGZ8AOtVZBAQABKwDAAPXSARyGf4GGecAOtVYgAQABFoaIh4aAwA62NJHhjEkAAD4DPRyGqBaGni6ELJx7TwEAAYeGrMAOtjQAwAD1Lj0chsWFhr7ADrXFnRUBAAGHhtDADrY0AJwJPRyG9YSG4sAOtadPAQABFIb5wA62WwgAAMAA9S4/TocqhzEAAIEQXcAA9R0BYKQzATGHR2CkMwBFh08Bh1iHWgAAW2DAAPR5AZMBHIdhh4dfwA63IlwBAAEWh3aEh2PADrWnWsAA9UwAwAD1pgGPh37ADrciHId/h4d+wA63Il0BAAGUAMAA9Z4+AT0ch5KGh4vADrcFTwEAASaHlgEch5YunTkCAAIch62Eh5vADrWnRAEAAYeHrsAOtyIAwAD1LByHspSBVgAAAADAAPScAJyKYKQzAMAA9S49HIfVFofJhYfCwA61xYVOpBiAmQEAARaH5oCH3MAOtUqFTpPkAMAA9Wo9F4f9Lp3RHIgHFof9Lp3RnINdAQABgogKwA61awDAAPWenINKiBkBhoggwA63BQakUGaIL4g8ibsAAJ3eAAAAAQOISIm7AAIAAQEBiFwAAAiD5mCkMwAAXcAAsuoBYMAA9YIBPg1OAAAAAYFZXcAAsjABYMAA9YIBH4hrwACyPQABYMAA9YIAAE4AAAAAgVpdwACy5gFgwAD1ggBOAAAAAIFbWwBOAAAAAIFcWwBOAAAAAIFdWwBOAAAAAIFeWwGTTgAAAACBX1sAT4g8AAAAAIFhWwADiEiJuwQAAAMAAwAAAACBYlsAAAAAAIFjWwAAAAAAgWRbAABbAUs+A0E+BUmIcRyIhRaIfYCIdcAOuDaECaQ1QQEAASsAwAD10j4BPR6Ilpl/BAAEJ4QCJ6NKkxaIxoCIvsAOuDaEGKQ7AD89HIjyFojqFojigIjawA64NoQJpDWUOIxVg7wBAAEWiQKAiPrADrg2lEGkQQDAAPTrPRyJLBaJIRaJGYCJEcAOuDaECaQ1lDmMVoO8AQABFok8gIk0wA64NpQ/pEIAwAD06z0ciWUWiVwWiVSAiUzADrg2hAmkNZQ3jFSDvAEAARaJdYCJbcAOuDaURqREAMAA9Os9HImdFomWFomOgImGwA64NoQJpDWUOoxXg7wBAAEWia2AiaXADrg2lD+kQgDAAPTrPR4AwACyAwIAAoEAwA64UYIAwA64dABKibsAAwEAWwEAAAAAgWNbAAEAAAAAgWRbAD4BPRwAgQDADrhRgWwCAAIUAMAOug8MABQAwA66GA0AAMAAsxM9iwDADriHHgDAALIEAQABFADADri3CAAAPYwAwA64kB4AwACx/gEAARQAwA64twgAAD2NAMAOuJkeAMAAsf8BAAEUAMAOuLcIAAA9HIhIgQDADrhRYwEAARQAwA64twgAAABKAAEWAIEAwA64UYFtwACzDwakUWaJwInNihkAAJ3bAAAAAQOJ1ooZAAAAAQEBieoAAAiD5mCkMwAAXcAAsuoBYMAA9YIBPgFKifkBHIoALp3eAQABgIoNwA661gCkUAakUmaKHoojiscAAJ0RAAAAAQOKMorHAAAAAAAAAFwBPgE9HIpEFoo7Lp07nHmDvAEAATSKTAOKTIrCAAAAAgICilEAAACAoGDAAPbeAIplAAAAg+ZdwABPcQJgwABQTlsAAGDAAPWCAT4CToqJipEAAIQJYKQzASaKiQGBipPADrtVYKQzPRyKqoKKosAOu3OdEQAAAACkRwDAAPVtBqRTZorMiuuLrQAAne4BGorNwADuSwAAAQOLDYutAAAAAQEBixQAAAiZPGCMzgAAYMAAREABPgNOiyeLNQAAo0tgjEcBFos7gIs3wA67yZRajPhOi2CLaAAAhAldwABPcQJgwABQTlsBHItyFotqLp07nHlEAQABFouBgYtzwA673pHhjEkAwAD1YkqLkQEmi5EBHIufgouYwA67+UQBAAEWi6SAi6DADrvJgLCM1ADAAE+WYMAAREAGpFRmi7KL0IwtAACd7wEai7PAAO5LAAABA4vijC0AAAABAQGL7AAACIIXYJJZAABgwABFPwE+AUqL+AEmi/gBHIwEgIv/wA68gpQOAQABH4wPwABFyQEAAS4AAJJbYMAART8AAA602gAOtS0ADrgZAA66uQAOuwcADrulAA68XgAOvMEAAAAHAAABZgAOvOgADrSDAA685gAAAAEADrzoAAAAAACkV6NMZwAAA4DwAADAAO4gAAEAAZWPgRMAAIvzAACBJgAAnbwAAAAAAAICpFhngfaB/MAAUZ4DnRcAAAFgwAD1xQABXaB3AVsHBKRaZ4JYgpYJlboAXcAA9U4CYJICYJICATKClGCSAmCSAgAEpFtngsiC/QmYpQBdwAD1TgJgkU5gkU4BMoL7YJFOYJFOAASkXGeDI4NLCaNNAF3AAPVOAmCRnmCRngEyg0lgkZ5gkZ4ABKRdZ4Nyg4IJnXsAXcAA9U4CYJLhYJJZAASkXmeDroO4CZ2tAF3AAPVOAmCS4WCS4QAEpF9ng8GD0RijTgBgwADyswAEpGFniN+I7RijT6RXAGDAAPbeASsBBaTOZ4T/hP+GJQAAAAOFC4YlAAAAAwAAA4UxAAAAnXtdwAD1TgJgkuFgklkBK4VrAAAAna1dwAD1TgJgkuFgkuEBK4WCAAAEo05gwADyswEpYKRYAT8ECAGkX4IAwA6+UggApF0ehbykYwEAAYCFysAOvigACACkXjUAAAABAF3AAPVOAmCS4WCS4QGBhffADr49IxyGAoMAwA6+iUEBAAErAAAyhiNgkuFgkuEAgwDADr6JAV3AAPVOAmCS4WCS4QkBhP/AAPXbAAAAAGkGpGNnhiqGToc8AAGjUAAAAAEDhluHPAAAAAEBAYaAAAAAgJ9dwAD1TgJgkuFgklkAAF3AAPVOAmCS4WCSWQE+AkmG2CIchuCAhtzADr76QQEAASsAwAD10gEWhu+AhuvADr76gPzAAPVzPgFKhwABMocgYJLhYJJZAD9Khy4BgIc1wA6++gakZGeHQYdKh54AAJRPAAAAAQOHVoeeAAAAAQEBh18AAACDsmCMRwAAYIwVAT4BPTCHayejUQakZWeHo4esh/oAAJSgAAAAAQOHtof6AAAAAQEBh70AAACDsmCMzgAAYIwVAT4BPTCHySejUgakZ2eJZIloidEAAKNTpFcAAAABA4l4idEAAAABAQGJfQAAAJQTYMAA9HkAAGDAAPR5AT4BSomPASMciaUWiZYuo0+kV6RhQQEAASsAwAD3BRqJuIwagInDwA6/7gFgwAD0eQakaGeJ1onYiyEAAJ13AAAAAQOJ8YshAAABAACB/WCMFQFgjBUBAQGJ9AAAAIOyXwAAAABfAAABPgVOigqKHQABo1RgwAD23gEWih8uo0+kV6RhSYozJYo8gIo3wA7AWmCMMj0Xikwuo0+kVzUAAAABAGDAAPbeARaKYhSKXcAOwFoAAV8AAWCMMoQYjDQjHIpqggDADsCfQQEAASsAABaKbS6jT6RXpGGCAMAOwJ8BYMAA9t6kYT9OipCKlwABgRBgjBUBJoqQATWKngAAAQBbARyKnoCKmcAOwFqUDgEAAS4AjB41AAAAAQBbAReKs4KKscAOwPyUExyKwC6jU6RXAQABForWgIrRwA7AWpQTjBwApGcAggDADsD8YIwVPReK5y6jT6RXgYr4wA7AbaRhSosQASaLEAGCixfADsDrXwAABqRpZ4smiy+MqQAAo1UAAAABA4s8jKkAAAABAQGLRgAAAIOyYIwVAABgjBUBPgdJi1Ici1uAi1bADsGSQQEAASsAwAD10kqLZAErP06Lf4uSAAGjVGDAAPbeARaLlC6jT6RXpGFJi6gli7GAi6zADsGSYIwyPReLwS6jT6RXNQAAAAEAYMAA9t4BFovXFIvSwA7BkgABYIwyhBiMNCMci9+CAMAOwfRBAQABKwAAFoviLqNPpFekYYIAwA7B9AFgwAD23qRhP06L/4wGAACBEGCMFQEmi/8BNQAAAAEAYIwVAYCMCMAOwZIjHIwOggDADsJOQQEAASsAACscjA6CAMAOwk6UDgEAAS4AjB4BW2CMFUmMICEcjCuCjCTADsI9QQEAASsAwAD10j0XjDuCjDTADsI9lBMcjEguo1OkVwEAARaMXoCMWcAOwZKUE4wcAKRnjBw/PReMby6jT6RXgYyAwA7BwqRhSoyYAYKMn8AOwj0GpGpnjK6Mt40DAACdsAAAAAEDjMCNAwAAAAEBAYzKAAAAghdgklkAAGCSWQE+AUqM1gEejN2dwAIAAoCM6MAOwwUWjO4unXukXQAGpGtnjQiNEY1LAACVmAAAAAEDjR6NSwAAAAEBAY0oAAAAhB9gkwUAAGCTBQE+AUqNOAGAjT/ADsNQBqRsZ41QjVmNwwAAo1YAAAABA41qjcMAAAABAQGNdAAAAIIXYJJZAABgklkBPgFKjYABIxyNjICNh8AOw4pBAQABKwCSXSsejZ2dwAIAAoCNqMAOw4oWja4unXukXQABYJJZBqRtZ43IjciOKwAAlRIAAAABA43ejisAAAABAQGN8QAAAIOyYI5rAABbAT4BSo39AR+OCI51AQABFo4fgI4awA7D7SKObQAGpG5njjCOMI68AACVFQAAAAEDjkCOvAAAAAEBAY5NAAAAg7JgjnYAAFsBPgFKjlkBH45kjoECAAIcjoIWjnkulbqkWkQBAAEWjoiAjoPADsQ0kkuOeADAAPViHI6TLqNWAQABFo6qgI6lwA7ENJUUjnkApGwABqRvZ47BjsGPMQAAlRcAAAABA47RjzEAAAABAQGO3gAAAIOyYI6CAABbAT4BSo7qAR+O9Y6NAgACHI8KFo8BLpW6pFpEAQABFo8QgI8LwA7EqpJLjoQAwAD1YhyPGy6ddwEBYI5jARaPJoCPIcAOxKqAio6FAKRoAAakcGePNo82j84AAJUfAAAAAQOPRo/OAAAAAQEBj1MAAACDsmCOjgAAWwE+AUqPXwEfj2qOnwMAAxyPiy6ddwEBYI5jARaPloCPkcAOxSOEPI6QAKRoFo+mgI+hwA7FI4CwjpEWj7GAj6zADsUjlRmOkgAGpHFnj9OP05B9AACVIQAAAAEDj+OQfQAAAAEBAY/wAAAAg7JgjqAAAFsBPgFKj/wBH5AHjrIEAAQckB8unXcBAWCOYwEWkCqAkCXADsWWhDyOogCkaBaQOoCQNcAOxZaAsI6jHJBILp13AQFgjmMBFpBTgJBOwA7FloCKjqQApGgWkGCAkFvADsWWlRmOpQAGpHJnkIKQgpEYAACVIwAAAAEDkJiRGAAAAAEBAZCrAAAAg7JgjrMAAFsBPgFKkLcBH5DCjsMCAAIckOkunXcBAWCOYwEWkPSAkO/ADsYmhDyOtQCkaBaRBICQ/8AOxiaUxo62AAakc2eRHZEdkcYAAJUlAAAAAQORM5HGAAAAAQEBkUYAAACDsmCOxAAAWwE+AUqRUgEfkV2O1QMAAxyRhC6ddwEBYI5jARaRj4CRisAOxouEPI7GAKRoFpGfgJGawA7Gi5TGjscckbAunXcBAWCOYwEWkbuAkbbADsaLgIqOyACkaAAGpHRnkcuRy5JcAACVLQAAAAEDkeCSXAAAAAEBAZHyAAAAg7JgjukAAFsBPgFKkf4BH5IJjvkCAAIWkjSAki/ADscNgLCO6xaSP4CSOsAOxw2VGY7sAAakdWeSYZJhkwUAAJUvAAAAAQOSdpMFAAAAAQEBkogAAACDsmCO+gAAWwE+AUqSlAEfkp+PCwMAAxaSyoCSxcAOx2OAsI78HJLQLp13AQFgjmMBFpLbgJLWwA7HY4CKjv0ApGgWkuiAkuPADsdjlRmO/gAGpHZnkwqTCpNpAACVMAAAAAEDkxiTaQAAAAEBAZMjAAAAg7JgjwwAAFsBPgFKky8BH5M6jxsBAAEWk1WAk1DADsfWlMaPDgAGpHdnk26TbpPgAACVMgAAAAEDk3yT4AAAAAEBAZOHAAAAg7JgjxwAAFsBPgFKk5MBH5OejywCAAIWk7mAk7TADsgelMaPHhyTyi6ddwEBYI5jARaT1YCT0MAOyB6Aio8fAKRoAAakeGeT5ZPllKIAAJU8AAAAAQOT+pSiAAAAAQEBlAwAAACDsmCPTQAAWwE+AUqUGAEflCOPXwQABByUQC6ddwEBYI5jARaUS4CURsAOyIOEPI9PAKRoFpRbgJRWwA7Ig4Cwj1AclGkunXcBAWCPLQEWlHSAlG/ADsiDVI9RAKRoFpSFgJSAwA7Ig5UZj1IABqR5Z5SnlKeVYwAAlScAAAABA5TClWMAAAABAQGU2gAAAIOyYI7WAABbAT4BSpTmAR+U8Y7oAwADHJUdLp13AQFgjmMBFpUogJUjwA7JEoQ8jtgApGgWlTiAlTPADskSlMaO2RyVSS6ddwEBYI8tARaVVICVT8AOyRJUjtoApGgABqR6Z5VolWiWHwAAlT4AAAABA5WClh8AAAABAQGVmQAAAIOyYI9gAABbAT4BSpWlAR+VsI9xAwADFpXggJXbwA7Jk4Cwj2IcleYunXcBAWCPLQEWlfGAlezADsmTVI9jAKRoFpYCgJX9wA7Jk5UZj2QABqR7Z5YkliSW1wAAlUAAAAABA5Y5ltcAAAABAQGWSwAAAIOyYI9yAABbAT4BSpZXAR+WYo+EAwACFpaNgJaIwA7KBZTGj3Qclp4unXcBAWCPLQEWlqmAlqTADsoFVI91AKRoAYPiFpbLgJbGwA7KBYPij3YGpHxnltyW3JeeAACVQgAAAAEDlvaXngAAAAEBAZcNAAAAg7Jgj4UAAFsBPgFKlxkBH5ckj5gDAAIWl1SAl0/ADsp5lMaPhxyXZS6ddwEBYI8tARaXcICXa8AOynlUj4gApGgBg+IWl5KAl43ADsp5g+KPiQakfWeXo5ejl+MAAJVJAAAAAQOXq5fjAAAAAQEBl7AAAACDsmCPpQAAWwE+AUqXvAEfl8ePrwEAARyXyy6ddwEBYI5jARaX1oCX0cAOyu2VSI+nAKRoAAakfmeX6JfomHoAAJVNAAAAAQOX/ph6AAAAAQEBmBEAAACDsmCPsAAAWwE+AUqYHQEfmCiPvAMAAxyYQy6ddwEBYI5jARaYToCYScAOy0SVS4+yAKRoFphagJhVwA7LRJKaj7McmGQunXcBAWCOYwEWmG+AmGrADstElUyPtACkaAAGpH9nmH+Yf5lMAACVUgAAAAEDmJmZTAAAAAEBAZiwAAAAg7Jgj70AAFsBPgFKmLwBH5jHj8oEAAQcmN0unXcBAWCOYwEWmOiAmOPADsvGlU+PvwCkaByY9C6ddwEBYI5jARaY/4CY+sAOy8aBPI/AAKRoHJkOLp13AQFgjmMBFpkZgJkUwA7LxpVQj8EApGgcmSUuo1YBAAEWmTyAmTfADsvGlVGPwgCkbAAGpIBnmVGZUZnSAACVVgAAAAEDmWmZ0gAAAAEBAZl+AAAAg7Jgj8sAAFsBPgFKmYoBH5mVj9UBAAEcmcUcmboWma6AmanADsxxlVSPzYCfAQFgjmMBNhaZvi6dd6RoAWCOYwDAAPTmgKEAAAAAwAD08QAGpIFnmdeZ15qAAACVWwAAAAEDme2agAAAAAEBAZoAAAAAg7Jgj9YAAFsBPgFKmgwBH5oXj+ECAAEcmj8cmjQWmi6AminADszjlVmP2YCfAQFgjmMBNhaaOC6dd6RoAWCOYwDAAPTmgKEAAAAAwAD08QGVWByaXy6dsAEAARaaboCaacAOzOOVWI/YAKRqBqSCZ5qFmoWbKgAAlV8AAAABA5qamyoAAAABAQGarAAAAIOyYI/iAABbAT4BSpq4AR+aw4/tAgABHJrpHJreFprZgJrUwA7NcZVdj+WAnwEBYI5jATYWmuIunXekaAFgjmMAwAD05oChAAAAAMAA9PEBlVgcmwkunbABAAEWmxiAmxPADs1xlViP5ACkagakg2ebL5svm/AAAJVlAAAAAQObRJvwAAAAAQEBm1YAAACDsmCP7gAAWwE+AUqbYgEfm22P+gMAARybkxybiBabg4CbfsAOzf+VY4/ygJ8BAWCOYwE2FpuMLp13pGgBYI5jAMAA9OaAoQAAAADAAPTxApVhHJuuLp2wAQABFpu9gJu4wA7N/5Vhj/AApGqVYhyb0i6dsAEAARab4YCb3MAOzf+VYo/xAKRqBqSEZ5v1m/WdoAAAlWoAAAABA5wKnaAAAAABAQGcHAAAAIOyYI/7AABbAT4DTpxJnFUAAZVoXcAA9U4CYIw3YI5jATKcbmCMN2COYwA9HJyHFpx7gJx2wA7OqZVoj/+DvAEAATScjwOcj5zpAAAAAgICnJoAAACVa2CMNwCcrwAAAICKYI5jAABgwAD1ggE+AT0cnMmBnL7ADs66gLICAAKCnMrADs7+HJzWLp13AQFgjmMBg5zcwA7PCQCkaADAAPVjAMAA9W1KnPABH5z7kAoEAAQWnRqAnRXADs6plWeP/RydVBydRRadN4CdMsAOzqmSRI/+gJ8BAWCSWQEWnUkunbCkagDAAPTmgKEAAAAAwAD08YGdZsAOzrocnZMcnYgWnYCAnXvADs6plWmQAICfAQFgkUEBNhadjC6dd6RoAWCRQQDAAPTmgKEAAAAAwAD08QAGpIVnnaWdpZ4WAACVbgAAAAEDnbaeFgAAAAEBAZ3EAAAAg7JgkAsAAFsBPgFKndABH53bkBYCAAIcnegunXcBAWCOYwEWnfOAne7ADs/+lUiQDQCkaByd/S6dsAEAARaeDICeB8AOz/6CF5AOAKRqAAakhmeeG54bnqcAAJVyAAAAAQOeLJ6nAAAAAQEBnjoAAACDsmCQFwAAWwE+AUqeRgE1nlEAAAEAYJAXAR+eUZAoAgACHJ5eLp13AQFgjmMBFp5pgJ5kwA7Qb5VIkBoApGgcnnMunbABAAEWnoKAnn3ADtBvgheQGwCkagA1AAAAAQBbAReekYGej8AO0ISEEhaenoCemcAO0G+EEpAZkBmBAMAO0IQGpIdnnqyerJ8BAACVfwAAAAEDnr6fAQAAAAEBAZ7NAAAAg7JgkF4AAFsBPgFKntkBH57kkGgBAAEWnveAnvLADtEVgIqQYAAGpIhnnwafBp9fAACVgQAAAAEDnxafXwAAAAEBAZ8jAAAAg7JgkGkAAFsBPgFKny8BH586kHMBAAEcn0YunbABAAEWn1WAn1DADtFdgheQawCkagAGpIlnn2SfZJ+yAACVgwAAAAEDn3efsgAAAAEBAZ+HAAAAg7JgkHQAAFsBPgFKn5MBH5+ekHwAAAAABqSKZ5+3n7ef8AAAlYUAAAABA5/Dn/AAAAABAQGfzAAAAIOyYJB9AABbAT4BSp/YAR+f45CFAAAAAAaki2ef9Z/1oEYAAJWHAAAAAQOf/6BGAAAAAQEBoAYAAACDsmCQhgAAWwE+AUqgEgEfoB2QkAEAASagIwEcoCMuo1UBAAEWoDaAoDHADtIlkkeQiACkaWCOYwAGpIxnoEugS6D/AACViQAAAAEDoFug/wAAAAEBAaBoAAAAg7JgkJEAAFsBPgFKoHQBH6B/kJ0DAAEcoKccoJwWoJCAoIvADtKAlVSQlYCfAQFgjmMBNhagoC6dd6RoAWCOYwDAAPTmgKEAAAAAwAD08QKVWBygxy6dsAEAARag1oCg0cAO0oCVWJCUAKRqg+IWoPOAoO7ADtKAg+KQkwakjWehBKEEobUAAJWLAAAAAQOhE6G1AAAAAQEBoR8AAACDsmCQngAAWwE+AUqhKwEfoTaQqgMAARyhXRyhUhahRoChQcAO0x6VVJCigJ8BAWCOYwE2FqFWLp13pGgBYI5jAMAA9OaAoQAAAADAAPTxApVYHKF9Lp2wAQABFqGMgKGHwA7THpVYkKEApGqD4hahqYChpMAO0x6D4pCgBqSOZ6G6obqikwAAlY4AAAABA6HJopMAAAABAQGh1QAAAIOyYJCrAABbAT4BSqHhAR+h7JC4BAABHKIPHKIEFqH8gKH3wA7TvJWNkLCAnwEBYJC5ATYWoggunXekaAFgkLkAwAD05oChAAAAAMAA9PEDlWEcoiounbABAAEWojmAojTADtO8lWGQrgCkapViHKJWLp2wAQABFqJlgKJgwA7TvJVikK8ApGqD4haih4CigsAO07yD4pCtBqSPZ6KYopii9gAAlZAAAAABA6KlovYAAAABAQGirwAAAIOyYJC5AABbAT4BSqK7AR+ixpDCAgACHKLPLp13AQFgjmMBFqLagKLVwA7UdoOWkLsApGgcouAunXcBAWCOYwEWouuAoubADtR2gIqQvACkaAAGpJBnovui+6NfAACVkwAAAAEDow+jXwAAAAEBAaMgAAAAg7JgkMMAAFsBPgFKoywBH6M3kM0BAAEco0cunXcBAWCOYwEWo1KAo03ADtTqlUiQxQCkaAAGpJFno2SjZKPSAACVlQAAAAEDo3uj0gAAAAEBAaOPAAAAg7JgkM4AAFsBPgFKo5sBH6OmkNgBAAEco7kunXcBAWCOOAEWo8SAo7/ADtVBkk+Q0ACkaAAGpJJno9ej16RsAACVlwAAAAEDo+6kbAAAAAEBAaQCAAAAg7JgkNkAAFsBPgFKpA4BH6QZkOQCAAIcpDUulZgBAAEWpEiApEPADtWYhB+Q2wCkaxykUy6dsAEAARakYoCkXcAO1ZiCF5DcAKRqAAakk2ekcaRxpMYAAJV0AAAAAQOkg6TGAAAAAQEBpJIAAACDsmCQMQAAWwE+AUqkngEfpKmQOQEAARakvICkt8AO1gaAipAzAAaklGeky6TLpRcAAJV2AAAAAQOk2qUXAAAAAQEBpOYAAACDsmCQOgAAWwE+AUqk8gEfpP2QQgEAARalDYClCMAO1k6AipA8AAaklWelHKUcpXEAAJV5AAAAAQOlLqVxAAAAAQEBpT0AAACDsmCQQwAAWwE+AUqlSQEfpVSQSwEAARalZ4ClYsAO1paAipBFAAaklmeldqV2pcUAAJV7AAAAAQOlhqXFAAAAAQEBpZMAAACDsmCQTAAAWwE+AUqlnwEfpaqQVAEAARalu4CltsAO1t6AipBOAAakl2elyqXKpg8AAJV8AAAAAQOl2qYPAAAAAQEBpecAAACDsmCQVQAAWwE+AUql8wEfpf6QXQAAAAAGpJhnphSmFKaKAACVmQAAAAEDphymigAAAAEBAaYhAAAAg7JgkOUAAFsBPgJOpjGmPQAAo1dgkgIBHKY/Lp13AQFgkgIBFqZKgKZFwA7XYJJLkOcApGhKplkBH6ZkkPACAAKBpmjADtdxHKZ1Lp13AQFgjmMBFqaAgKZ7wA7XYJJMkOgApGgABqSZZ6aPpo+nAwAAlZsAAAABA6ajpwMAAAABAQGmtAAAAIOyYJDxAABbAT4BSqbAAR+my5D8AgACHKbbLp13AQFgkSMBFqbmgKbhwA7X6JJMkPMApGgcpu0unXcBAWCOYwEWpviApvPADtfogIqQ9ACkaAAGpJpnpwinCKd7AACVowAAAAEDpyCnewAAAAEBAac1AAAAg7JgkRkAAFsBPgFKp0EBH6dMkSIBAAEcp2AunXcBAWCOYwEWp2uAp2bADthckkeRGwCkaAAGpJtnp4CngKfWAACVpwAAAAEDp4qn1gAAAAEBAaeRAAAAg7JgkSMAAFsBPgFKp50BH6eokS0BAAEcp8kcp74Wp7OAp67ADtizlaWRJYCfAQFgkRMBNhanwi6dd6RoAWCREwDAAPTmgKEAAAAAwAD08QAGpJxnp9un26hDAACVqgAAAAEDp+uoQwAAAAEBAaf4AAAAg7JgkS4AAFsBPgFKqAQBH6gPkTgBAAEcqDYcqCsWqCCAqBvADtkllaWRMICfAQFgkRMBNhaoLy6dd6RoAWCREwDAAPTmgKEAAAAAwAD08QAGpJ1nqEioSKiWAACVrAAAAAEDqFuolgAAAAEBAahrAAAAg7JgkTkAAFsBPgFKqHcBH6iCkUAAAAAABqSeZ6ibqJupnQAAlbAAAAABA6ivqZ0AAAABAQGowAAAAIOyYJFBAABbAT4BSqjMAR+o15FNBAABHKjnLp13AQFgjmMBFqjygKjtwA7Z0ZVPkUMApGgDla4WqSGAqRzADtnRla6RRZWvFqlYgKlTwA7Z0ZWvkUYiJql9ARypfS6jVQEAARapkICpi8AO2dEikUQApGlgjmMGpJ9nqaKpoqp1AACVsgAAAAEDqbeqdQAAAAEBAanJAAAAg7JgkU4AAFsBPgROqeap7gAAna9gkU4BH6n0kVcBAAErAD0cqhYWqhAumKWkW4CyAgACgKoXwA7aaYGqH8AO2noAwAD1Yz0XqjSBqizADtp6kkw1qjsAAAEAYJETARyqOy6ddwEBYJETARaqRoCqQcAO2mmSTJFQAKRoNQAAAAEAWwEXqk2CqkvADtrCklGBqlbADtp6jBuCAMAO2sKRUEqqYwGBqmrADtp6BqSgZ6p6qnqq2wAAlbQAAAABA6qNqtsAAAABAQGqnQAAAIOyYJFYAABbAT4BSqqpAR+qtJFhAQABHKrJFqrDLpilpFtEAQABFqrPgKrKwA7bNoHTkVoAwAD1YgAGpKFnquCq4KtVAACVtgAAAAEDqvOrVQAAAAEBAasDAAAAg7JgkWIAAFsBPgFKqw8BH6sakWwCAAIcqykunXcBAWCOYwEWqzSAqy/ADtuSlU+RZACkaByrQC6ddwEBYJETARarS4CrRsAO25KSTJFlAKRoAAakomerWqtaq8YAAJW4AAAAAQOraqvGAAAAAQEBq3cAAACDsmCRbQAAWwE+AUqrgwEfq46RdwIAAhyrmi6ddwEBYJETARarpYCroMAO3AaSTJFvAKRoHKusLp13AQFgjmMBFqu3gKuywA7cBpVPkXAApGgABqSjZ6vLq8usrwAAlbwAAAABA6vcrK8AAAABAQGr6gAAAIOyYJF4AABbAT4CTqv6rAQAAJW6XcAA9R0BYJICARysIBysFRasC4CsBsAO3HqVupF6gJ8BAWCSAgE2FqwZLp13pGgBYJICAMAA9OaAoQAAAADAAPTxSqwuAR+sOZGEBAAEgaxGwA7ciyasUQEcrFEuo1UBAAEWrGSArF/ADtx6lU+RewCkaWCOYxyskByshRasfYCseMAO3HqVu5F8gJ8BAWCOYwE2FqyJLp13pGgBYI5jAMAA9OaAoQAAAADAAPTxHKyaLp13AQFgkRMBFqylgKygwA7cepJMkX0ApGgABqSkZ6y0rLStiQAAlcAAAAABA6zHrYkAAAABAQGs1wAAAIOyYJGFAABbAT4CTqznrPMAAKNXYJICARys9S6ddwEBYJICARatAICs+8AO3XySS5GIAKRoSq0PAR+tGpGSBAADga0ywA7djRytPy6ddwEBYI5jARatSoCtRcAO3XyDlJGJAKRoHK1VLp13AQFgkRMBFq1ggK1bwA7dfJJMkYoApGgBlb8WrX2ArXjADt18lb+RiwakpWetjq2OrzIAAJXDAAAAAQOtoq8yAAAAAQEBrbMAAACDsmCRkwAAWwE+Akatv63prc8AAACjWGCRngAWreKArd3ADt4xlcKRlj4BPRyt/Bat8S6jTaRcgLICAAKBrf3ADt5GH64PkakEAAMcrkccrjwWrjCBriXADt5GlVSRoICfAQFgjmMBNhauQC6dd6RoAWCOYwDAAPTmgKEAAAAAwAD08R6uX8AA9SMBAWDAAPR5ARaueYGubsAO3kaVxZGhACsBlcYWrr2BrrLADt5GlcaRowDAAPVjSq7TAR+u3pGdAgACHK73Lp13AQFgjmMBFq8CgK79wA7eMZJHkZUApGgcryUcrxoWrxSArw/ADt4xlcKRloCfAQFgkZ4BNhavHi6dd6RoAWCRngDAAPTmgKEAAAAAwAD08QAGpKZnrzevN6/YAACVyAAAAAEDr0av2AAAAAEBAa9SAAAAg7JgkZ4AAFsBPgNOr2KvbQAAo1hgkZ4BHK96Fq9vLqNNpFxEAQABgK97wA7fbQDAAPViPRevkYGvhsAO336STDWvmAAAAQBgkRMBHK+YLp13AQFgkRMBFq+jgK+ewA7fbZJMkaIApGg1AAAAAQBbARevqoKvqMAO37OSUYGvs8AO336MG4IAwA7fs5GiSq/DAYGvysAO334GpKdnr92v3bBeAACVygAAAAEDr/mwXgAAAAEBAbASAAAAg7JgkawAAFsBPgFKsB4BH7ApkbUBAAEcsEwWsEEuo02kXEQBAAEWsFKAsE3ADuAngdORrgDAAPViAAakqGewY7BjsPcAAJXMAAAAAQOwc7D3AAAAAQEBsIAAAACDsmCRtgAAWwE+AUqwjAEfsJeRwQMAAxywrC6ddwEBYI5jARawt4CwssAO4IOVT5G4AKRoHLDDLp13AQFgkRMBFrDOgLDJwA7gg4E8kbkApGgmsNUBHLDVLqNVAQABFrDogLDjwA7gg5VQkboApGlgkRMABqSpZ7D8sPyxawAAlc4AAAABA7EQsWsAAAABAQGxIQAAAIOyYJHCAABbAT4BSrEtAR+xOJHLAQABJrFIARyxSC6jVQEAARaxW4CxVsAO4RiSR5HEAKRpYI5jAAakqmexcLFwsgUAAJXRAAAAAQOxfbIFAAAAAQEBsYcAAACDsmCRzAAAWwE+AUqxkwEfsZ6R1wMAAhyxpy6ddwEBYJETARaxsoCxrcAO4XOSTJHOAKRoHLHRHLHGFrG+gLG5wA7hc5XQkc+AnwEBYJHYATYWscounXekaAFgkdgAwAD05oChAAAAAMAA9PEBlD0WsfWAsfDADuFzlD2R0Aakq2eyCrIKswoAAJXVAAAAAQOyFLMKAAAAAQEBshsAAACDsmCR2AAAWwE+A06yK7I4AACjWWCMFQEcsjouo1UBAAEWsk2AskjADuISgX2R2wCkaU6yYbJvAACjWmCMFQEcsnEuo1UBAAEWsoSAsn/ADuISldSR3ACkaUqylQEfsqCR4wQAAiaypgGBsqbADuIjYJICHLK0Lp13AQFgkRMBFrK/gLK6wA7iEpJMkd0ApGgCldQmstoBgrLawA7iSmCSApXTHLLwLp2wAQABFrL/gLL6wA7iEpXTkdoApGoGpKxnsw+zD7N4AACV2AAAAAEDsx6zeAAAAAEBAbMqAAAAg7JgkeQAAFsBPgFKszYBH7NBke4CAAIcs0wunXcBAWCREwEWs1eAs1LADuLxkkyR5gCkaByzXi6ddwEBYJETARazaYCzZMAO4vGV15HnAKRoAAakrWezfbN9s/UAAJXeAAAAAQOzkLP1AAAAAQEBs6AAAACDsmCR7wAAWwE+AUqzrAE1s7cAAAEAYJHvAR+zt5IBAQABHLPGLp13AQFgjmMBFrPRgLPMwA7jZZJHkfEApGgANQAAAAEAWwEXs9+Bs93ADuN6hBIWs+yAs+fADuNlhBKR8pHygQDADuN6BqSuZ7P6s/q1wAAAleUAAAABA7QStcAAAAABAQG0JwAAAIOyYJICAABbAT4BSrQzATUAAAABAF3AAPVOAmCSAmCSAgEWtDoulbqkWjUAAAABAGCSAgGAtETADuPxNQAAAAEAYJICATW0UAAAAQBgkgIBH7RQkiUDAAEWtGmAtGTADuPxgLCSBgKSRSa0hAEctIQuo1UBAAEWtJeAtJLADuPxkkWSCgCkaWCOY4IXHLSzLp2wAQABFrTCgLS9wA7j8YIXkggApGo1AAAAAQBbARe00YO0z8AO5DyUNCMiFrTfLqNOpF8AIRa1BRa0+YC09MAO4/GUNJIFgPzAAPT/HLU1HLUqFrUegLUZwA7j8ZQ0kgWAnwEBYI5jATYWtS4unXekaAFgjmMAwAD05oChAAAAAMAA9PE6tUpgjmMAAV3AAPUdAWCOY5IFNQAAAAEAWwEXtWeDtWXADuQ8hBIWtXSAtW/ADuPxhBKSB5IHNQAAAAEAWwEXtYKDtYDADuQ8ld8ctZUuo1OkVwEAARa1q4C1psAO4/GV35IEAKRnkgSDAMAO5Dw1AAAAAQBcARy0Q4G0Q8AO5AaAsgIAAoK0Q8AO5CGDAMAO5DIAwAD1Y4MAwA7kMgakr2e1xbXFtm8AAJXnAAAAAQO13bZvAAAAAQEBtfIAAACDsmCSJwAAWwE+Ak62ArYOAACjV2CSAgEcthAunXcBAWCSAgEWthuAthbADuXGkkuSKQCkaEq2KgEftjWSMQIAAoG2ScAO5dcctlYunXcBAWCOOAEWtmGAtlzADuXGkk+SKgCkaAAGpLBntoG2gbj3AACUwwAAAAEDtpG49wAAAAEBAbaeAAAAg7JgjV4AAFsBPgFKtqoBNba1AAABAGCNXgEftrWNfAgAARy2wS6ddwEBYI44ARa2zIC2x8AO5k6ST41iAKRoB4CwFrbqgLblwA7mToCwjReD4ha3BoC3AcAO5k6D4o1og+QWtyiAtyPADuZOg+SNaZQ9FrdOgLdJwA7mTpQ9jWqUwBy3jhy3gxa3doC3ccAO5k6UwI1jgJ8BAWCN6wE2FreHLp13pGgBYI3rAMAA9OaAoQAAAADAAPTxlKkWt7eAt7LADuZOlKmNGYQYFrfaLqNPpFekYTUAAAABAFsBF7fygbfwwA7mY5Q0IyIWuAAuo06kXwAhFrgmFrgagLgVwA7mTpQ0jRaA/MAA9P8cuFYcuEsWuD+AuDrADuZOlDSNFoCfAQFgjmMBNha4Ty6dd6RoAWCOYwDAAPTmgKEAAAAAwAD08Tq4a2COYwABXcAA9R0BYI5jjRY1AAAAAQBbARe4iIG4hsAO5mOUExy4lS6jU6RXAQABFrirgLimwA7mTpQTjBwApGeMHDUAAAABAFsBF7i/gbi9wA7mY5R+HLjPLqNTpFcBAAEWuOWAuODADuZOlH6NFQCkZ40VgQDADuZjBqSxZ7j8uPy7qwAAlNoAAAABA7kKu6sAAAABAQG5FQAAAIOyYI2fAABbAT4BSrkhATW5LAAAAQBgjZ8BH7ksjdoHAAMWuTuAuTbADugygLCNFxa5RoC5QcAO6DKCHI2iHLlMLp13AQFgjjgBFrlXgLlSwA7oMpJPjaQApGgElKkWuYGAuXzADugylKmNsIQYFrmkLqNPpFekYZTSFrncgLnXwA7oMpTSjcGU0xa6I4C6HsAO6DKU043CNQAAAAEAWwEXukqBukjADuhHlDQjIha6WC6jTqRfACEWun4WunKAum3ADugylDSNFoD8wAD0/xy6rhy6oxa6l4C6ksAO6DKUNI0WgJ8BAWCOYwE2FrqnLp13pGgBYI5jAMAA9OaAoQAAAADAAPTxOrrDYI5jAAFdwAD1HQFgjmONFjUAAAABAFsBF7rggbrewA7oR5R9HLryLqNTpFcBAAEWuwiAuwPADugylH2NoQCkZ42hNQAAAAEAWwEXuyGBux/ADuhHlBMcuy4uo1OkVwEAARa7RIC7P8AO6DKUE4wcAKRnjBw1AAAAAQBbARe7WIG7VsAO6EeUfhy7aC6jU6RXAQABFrt+gLt5wA7oMpR+jRUApGeNFTUAAAABAFsBF7uVgbuTwA7oR4QSFruigLudwA7oMoQSjaONo4EAwA7oRwaksme7sLuwvqkAAJS9AAAAAQO7ur6pAAAAAQEBu8EAAACDsmCNMQAAWwE+AUq7zQE1u9gAAAEAYI0xAR+72I1dCwABFrvjgLvewA7qLoCwjRcKghccu/cunbABAAEWvAaAvAHADuougheNMwCkapJFJrwiARy8Ii6jVQEAARa8NYC8MMAO6i6SRY01AKRpYI5jg+UWvF2AvFjADuoug+WNPoPgFryAgLx7wA7qLoPgjT+D4ha8n4C8msAO6i6D4o1Ag94WvL+AvLrADuoug96NQZS4FrzpgLzkwA7qLpS4jUKUuRa9HIC9F8AO6i6UuY1DlKkWvU6AvUnADuoulKmNGYQYFr1xLqNPpFekYTUAAAABAFsBF72Jgb2HwA7qQ5Q0IyIWvZcuo06kXwAhFr29Fr2xgL2swA7qLpQ0jRaA/MAA9P8cve0cveIWvdaAvdHADuoulDSNFoCfAQFgjmMBNha95i6dd6RoAWCOYwDAAPTmgKEAAAAAwAD08Tq+AmCOYwABXcAA9R0BYI5jjRY1AAAAAQBbARe+H4G+HcAO6kOUExy+LC6jU6RXAQABFr5CgL49wA7qLpQTjBwApGeMHDUAAAABAFsBF75Wgb5UwA7qQ5R+HL5mLqNTpFcBAAEWvnyAvnfADuoulH6NFQCkZ40VNQAAAAEAWwEXvpOBvpHADupDhBIWvqCAvpvADuouhBKNNI00gQDADupDBqSzZ76uvq7AAEHTAACUyAAAAAEDvtDAAEHTAAAAAQEBvu8AAACDsmCNfQAAWwE+AUq++wE1vwYAAAEAYI19AR+/Bo2eCwABFr8pgL8kwA7sUJTGjYEKgLAWv02Av0jADuxQgLCNF4PiFr9pgL9kwA7sUIPijYmD5Ba/i4C/hsAO7FCD5I2KlKkWv7aAv7HADuxQlKmNGZJEHMAAQAEcv/IWv+SAv9/ADuxQkkSNgICfAQFgklkBFr/2Lp2wpGoAwAD05oChAAAAAMAA9PGSXhzAAEBCHMAAQDcWwABAKIDAAEAjwA7sUJJejYKAnwEBYJLhATYWwABAOy6dd6RoAWCS4QDAAPTmgKEAAAAAwAD08ZRsHMAAQI8cwABAhBbAAEBvgMAAQGrADuxQlGyNg4CfAQFgkgIBNhbAAECILp13pGgBYJICAMAA9OaAoQAAAADAAPTxlG0cwABA0hzAAEDHFsAAQLeAwABAssAO7FCUbY2FgJ8BAWCSAgE2FsAAQMsunXekaAFgkgIAwAD05oChAAAAAMAA9PGUxxbAAEEBgMAAQPzADuxQlMeNhIQYFsAAQSouo0+kV6RhNQAAAAEAWwEXwABBQoHAAEFAwA7sZZQ0IyIWwABBUC6jTqRfACEWwABBdhbAAEFqgMAAQWXADuxQlDSNFoD8wAD0/xzAAEGmHMAAQZsWwABBj4DAAEGKwA7sUJQ0jRaAnwEBYI5jATYWwABBny6dd6RoAWCOYwDAAPTmgKEAAAAAwAD08TrAAEG7YI5jAAFdwAD1HQFgjmONFoEAwA7sZQaktGfAAEHYwABB2MAARBIAAJYTAAAAAQPAAEHqwABEEgAAAAEBAcAAQfkAAACDsmCS4QAAWwE+BU7AAEITwABCGwAAna9gkuEBHMAAQicWwABCHS6draReRAEAAYDAAEIowA7usgDAAPViScAAQjMcwABCP4HAAEI3wA7uxUEBAAErAMAA9dI+Aj2JwABCUMAO7sUfwABCXpL1AQABFsAAQnGAwABCbMAO7rKAsJLlAD0cwABCjhbAAEJ+Lp17pF2AsgIAAoDAAEKPwA7ush/AAEKbkuABAAGBwABCrcAO7sUAAMAA9WM/PRfAAELJgcAAQsHADu7FlQocwABC0S6dsAEAARbAAELggMAAQtvADu6ylQqS5gCkapLmScAAQuwhHMAAQwEWwABC9YDAAELwwA7uspYSkudBAQABKwCSXT4BPRfAAEMagcAAQxLADu7FlhIcwABDKC6dsAEAARbAAEM3gMAAQzLADu6ylhKS5wCkapLnP0rAAENPATXAAENWAAABAGCS4QGBwABDVsAO7sU1AAAAAQBbARfAAENmgsAAQ2TADvAJlDQjIhbAAEN0LqNOpF8AIRbAAEOaFsAAQ46AwABDicAO7rKUNJLkgPzAAPT/HMAAQ8ocwABDvxbAAEOzgMAAQ67ADu6ylDSS5ICfAQFgjmMBNhbAAEPDLp13pGgBYI5jAMAA9OaAoQAAAADAAPTxOsAAQ99gjmMAAV3AAPUdAWCOY5LkNQAAAAEAWwEXwABD/ILAAEP6wA7wCYQSFsAARAmAwABEBMAO7rKEEpLjkuOCAMAO8AkGpLVnwABEF8AARCDAAEUlAACjWwAAAAEDwABENcAARSUAAAABAQHAAERDAAAAg7JgjjgAAGCMFQE+Ak7AAERUwABEagAAo1xgwADyswEWwABEcS6jTqRfTD4CPRfAAESYLqNOKaRfSsAARLcBHMAARL4uo1UBAAEWwABE0YDAAETMwA7xEZJMjk4ApGk+AT0XwABE8y6jToHAAEUGwA7xJqRfBqS2Z8AARSrAAEUqwABH9gAAlP8AAAABA8AARTvAAEf2AAAAAQEBwABFSQAAAIOyYI44AABbAT4ETsAARVnAAEVoAACSXl3AAPUdAWCS4QEcwABFiRzAAEV+FsAARW+AwABFasAO8bSSXo49gJ8BAWCS4QE2FsAARYIunXekaAFgkuEAwAD05oChAAAAAMAA9PFOwABFm8AARaYAAJUqXcAA9R0BYJICARzAAEXNHMAARcIWwABFrYDAAEWowA7xtJRsjj+AnwEBYJICATYWwABFxi6dd6RoAWCSAgDAAPTmgKEAAAAAwAD08U7AAEXfwABF5QAAlP1dwAD1HQFgkgIBHMAARgccwABF/BbAAEXsgMAARefADvG0lG2OQICfAQFgkgIBNhbAAEYALp13pGgBYJICAMAA9OaAoQAAAADAAPTxSsAARhUBNcAARiAAAAEAYI44AR/AAEYgjlMIAAEmwABGLQEcwABGLS6jWwEAAYDAAEZDwA7xtACktWCREweSXoHAAEZiwA7xx5RsgsAARpDADvIglG2DwABGtcAO8nmUxxbAAEbhgMAARtzADvG0lMeOPpTcHMAARw0unbABAAEWwABHHIDAAEcXwA7xtJTcjkEApGqU9RbAAEdDgMAARz7ADvG0lPWOO5T2FsAAR26AwABHacAO8bSU9o48NQAAAAEAWwEXwABHh4TAAEeFwA7y2JQTHMAAR5Quo1OkVwEAARbAAEeqgMAAR6XADvG0lBOMHACkZ4wcNQAAAAEAWwEXwABHvoTAAEe8wA7y2JR+HMAAR84uo1OkVwEAARbAAEfkgMAAR9/ADvG0lH6OOgCkZ446hADADvLYBqS3Z8AAR/vAAEf7wABIvwAAlTYAAAABA8AASAnAAEi/AAAAAQEBwABIFAAAAIOyYI8tAABbAT4BSsAASCABH8AASCuPOQMAARzAAEhQHMAASEUWwABIOoDAAEg1wA70M5UqjzCAnwEBYI5jATYWwABISS6dd6RoAWCOYwDAAPTmgKEAAAAAwAD08QKVCBzAAEiDHMAASHQWwABIboDAAEhpwA70M5UIjy+AnwEBYJJZARbAAEh4Lp2wpGoAwAD05oChAAAAAMAA9PGU/RzAAEiyHMAASKcWwABIoYDAAEicwA70M5T9jzGAnwEBYI87ATYWwABIqy6dd6RoAWCPOwDAAPTmgKEAAAAAwAD08QakuGfAAEjEwABIxMAASTEAAJU4AAAAAQPAAEjYwABJMQAAAAEBAcAASOkAAACDsmCPOwAAWwE+AUrAAEj1AR/AAEkAj0QCAAIWwABJFYDAAEkQwA71QoCwjz0cwABJGy6ddwEBYI5jARbAAEkmgMAASSHADvVCgIqPPgCkaAAGpLlnwABJNsAASTbAAEmFAACXUwAAAAEDwABJScAASYUAAAABAQHAAElXAAAAg7JgkCkAAFsBPgFKwABJYwEcwABJai6XWQEAAYDAAEl8wA71wQCkugakumfAAEmKwABJisAASe8AAJdZAAAAAQPAAEmbwABJ7wAAAAEBAcAASacAAACDsmCOYwAAWwE+AT0wwABJsyTAAEnrAiejXYDAAEnmwA72Fwaku2fAAEn0wABJ9MAASlwAAJdbAAAAAQPAAEoGwABKXAAAAAEBAcAAShMAAACDsmCN6wAAWwE+AT0wwABKHyTAAEpYAiejXoDAAEpTwA72aAakvGfAAEphwABKYcAASroAAJddAAAAAQPAAEpuwABKugAAAAEBAcAASnYAAACDsmCNEwAAWwE+AT0wwABKgiTAAEq2AiejX4DAAEqxwA72uQakvWfAAEq/wABKv8AASyEAAJdhAAAAAQPAAErPwABLIQAAAAEBAcAAStoAAACDsmCREwAAWwE+AT0wwABK5iTAAEsdAiejYIDAAEsYwA73CgakvmfAAEsmwABLJsAAS6MAAJZ8AAAAAQPAAEs1wABLowAAAAEBAcAASz8AAACDsmCMFQAAWwE+AT0wwABLSyQAAyejYSejYoDAAEuawA73Wwakv2fAAEuowABLqMAATBQAAJT0AAAAAQPAAEu+wABMFAAAAAEBAcAAS9EAAACDsmCOLwAAWwE+AUrAAEvdAR/AAEvojjcBAAEcwABL+i6ddwEBYJFBARbAAEwFgMAATADADvesklCOMQCkaAAGpMBnwABMGcAATBnAAEyEAACVoQAAAAEDwABMMsAATIQAAAABAQHAAExIAAAAg7JgkQgAAFsBPgFKwABMVAEfwABMX5ESAQABFsAATHmAwABMdMAO+BmUV5EKAAakwWfAAEyJwABMicAATNAAAJRpAAAAAQPAAEyYwABM0AAAAAEBAcAATKQAAACDsmCMmgAAWwE+AUrAAEywARzAAEy3LpZ8AQABgMAATMfADvh1AKS+BqTCZ8AATNXAAEzVwABNZAAAlOwAAAABA8AATOrAAE1kAAAAAQEBwABM/AAAAIOyYI35AABbAT4BSsAATQgBH8AATROOBwIAAhbAAE0+gMAATTnADvjLlOuN+xzAAE1OLp13AQFgjmMBFsAATVmAwABNVMAO+MuAio38AKRoAAakw2fAAE1pwABNacAATf8AAJVGAAAAAQPAAE17wABN/wAAAAEBAcAATYoAAACDsmCPmQAAWwE+AUrAAE2WAR/AAE2hj6QCAAIcwABNuC6ddwEBYI5jARbAAE3DgMAATb7ADvlKkkePmwCkaBzAAE3yHMAATeMWwABN1YDAAE3QwA75SpJEj5yAnwEBYJJZARbAAE3nLp2wpGoAwAD05oChAAAAAMAA9PEABqTEZ8AATgTAAE4EwABOXgAAlOkAAAABA8AAThvAAE5eAAAAAQEBwABOLwAAAIOyYI3yAABbAT4BSsAATjsBH8AATkaN+AAAAAAGpMVnwABOY8AATmPAAE64AACUYAAAAAEDwABOecAATrgAAAABAQHAAE6MAAAAg7JgjHUAAFsBPgFKwABOmAEcwABOny6WfAEAAYDAAE6vwA76PgCkvgakxmfAAE69wABOvcAATwYAAJRjAAAAAQPAAE7NwABPBgAAAAEBAcAATtoAAACDsmCMjwAAWwE+AUrAAE7mARzAAE7tLpZ8AQABgMAATv3ADvqUAKS+BqTHZ8AATwvAAE8LwABPWwAAlZ4AAAABA8AATxvAAE9bAAAAAQEBwABPKAAAAIOyYJD9AABbAT4BSsAATzQBH8AATz+RBwEAARbAAE9QgMAAT0vADvrqlFeQ/wAGpMhnwABPYMAAT2DAAE/IAACU8gAAAAEDwABPdcAAT8gAAAABAQHAAE+HAAAAg7JgjiYAAFsBPgFKwABPkwEfwABPno4uAQABHMAAT68unXcBAWCSAgEWwABPuoDAAE+1wA77RpJLjigApGgABqTJZ8AAT83AAE/NwABQEgAAllgAAAABA8AAT9vAAFASAAAAAQEBwABP5gAAAIOyYJPfAABbAT4BSsAAT/IBHMAAT/kulnwBAAGAwABQCcAO+7MApL4GpMpnwABQF8AAUBfAAFC9AACU8AAAAAEDwABQMsAAUL0AAAABAQHAAFBKAAAAg7JgjhcAAFsBPgFKwABQVgEfwABQYY4lAgACFsAAUJKAwABQjcAO/AmUxo4ZHMAAUKMunXcBAWCPLQEWwABQroDAAFCpwA78CVSOGgCkaAAGpMtnwABQwsAAUMLAAFFWAACU7gAAAAEDwABQ18AAUVYAAAABAQHAAFDpAAAAg7JgjggAAFsBPgFKwABQ9QEfwABRAI4WAgACFsAAUSuAwABRJsAO/IeUxo4KHMAAUTwunXcBAWCPLQEWwABRR4DAAFFCwA78h1SOCwCkaAAGpMxnwABRW8AAUVvAAFGcAACUbwAAAAEDwABRZ8AAUZwAAAABAQHAAFFwAAAAg7JgjKkAAFsBPgFKwABRfAEcwABRgy6WfAEAAYDAAFGTwA79BQCkvgAADr7dAA6/YwAOv5kADr/PAA7AMgAOwXUADsLoAA7DMwAOw20ADsPQAA7EFwAOxI0ADsUGAA7FeQAOxgkADsZuAA7G8AAOx0YADse5AA7IAQAOyGYADsj1AA7JdgAOyegADspcAA7K0AAOyycADsupAA7MVAAOzMYADs1UAA7N4gAOzowADs/hAA7QUgAO0PgADtFAAA7RlAAO0c4ADtIIAA7SYwAO0wEADtOfAA7UWQAO1M0ADtUkAA7VewAO1ekADtYxAA7WeQAO1sEADtcJAA7XQwAO18sADtg/AA7YlgAO2QgADtl6AA7ZtAAO2kwADtsZAA7bdQAO2+kADtxdAA7dXwAO3hQADt9QAA7gCgAO4GYADuD7AA7hVgAO4fUADuLUAA7jSAAO49QADuWpAA7mMQAO6BUADuoRAA7sLwAO7osADvDqAA7xjQAO9AwADvUbAA71mgAO9fAADvZBAA72kgAO9uMADvc0AA73hQAO9/IADvhOAA74pAAO+SMADvnNAA76FwAO+m0ADvrDAA77HwAO+4wADvviAA78YAAO/N4ADv00AAAAaQKkz2fAAFGhwABRp8AAUvgDo2MAAAFgpFgAAAABBaTTZ8AAUdHAAFHRwABSrAAAAAPAAFHhwABSrAAAAAIAAALAAFIHAAAAnXtdwAD1TgJgkuFgklkBK8AAUiQAAACjTmDAAPKzASlgpM8BPwEJAMAAUkakzgIAAAKde4DAAFJrwA7/IaNOgcAAUpvADv84AQak0WfAAFKxwABSxsAAUvYAAKNbARrAAFKywADuSwAAAQPAAFLbwABS9gAAAAEBAcAAUukAAACDsmCOOAAAYIwVAUrAAFLyASsAAA7/cQAO/7oAAAABAAABZwAO/8kADr0tAA7+4QAO/8cAAAACAA7/yQAAAAAApNSjZGgAAASA/gAAi/MAAQEFlL+UsJI7kj2U3oFfAACkDQABAQOdIKNloxqB9gAAwABFygABAQWjZqNno2ijaaNqglgAAJl7AAEBAZt7AAAAAQKk12iCg4KJh4IDnRoAAAFgwABPsgAAAgSk2WiCv4LICaNrAGDAAPR5AASk2miC2oLgCZJbAGCNEwABBaTqaILlguWDiQAAAAOC9oOJAAAAAgICgv4AAACSW2CNEwCDEgAAAJJRYMAATwEAAGCk1wE/AwgApNkegy6k1gEAAYCDP8APAI0ACACk2oCDWcAPAI0JAINpwABPvwIAAoGDb8APAJgWg36Ag3fADwCNlBOMHAANBqTcaIOOg5mDuQEAo2wAAAABA4Ojg7kAAAAAAAAAYMAA9l0BSoOmASedGgak3WiDvoPJg9kBAIHTAAAAAQOD0IPZAAAAAAAAAGCNEwFKg9MBFoPTLpJbpNoGpN5og96D6YQBAQCAsAAAAAEDg+6EAQAAAAAAAABgwAD2XQFKg/EBFoP9FoP4FoPxLpJbpNqAsI0XgLCSNQak32iEBoQPhDUBAIRFAAAAAQOEHYQ1AAAAAAAAAGDAAPKzAUqEIAElhCcWhCAukluk2mCNXgak4GiEOoRMhKoBAIIcAAAAAQOEUYSqAAAAAAAAAGCN3AE+Ak6EXYRkAAGSW2CNEwEWhGsukluk2kqEdwEjJYSFgIR+wA8B32CNnxaEmxSElMAPAd8AAWCNn4IcjaIrAWCN3Aak4WiEr4S4hPABAKNtAAAAAQOEyITwAAAAAAAAAGDAAPKzAUqEywEehMvAAO5eAgACGoTjjeIWhOsughyk4AAGpOJohPWE/oUvAQCEQAAAAAEDhQeFLwAAAAAAAABgwADyswFKhQoBHoUKwADuXgIAAhqFIo3jFoUqLoIcpOAABqTjaIU0hT2FbgEAhEEAAAABA4VGhW4AAAAAAAAAYMAA8rMBSoVJAR6FScAA7l4CAAIahWGN5BaFaS6CHKTgAAak5GiFc4V8hbEBAJwqAAAAAQOFh4WxAAAAAAAAAGDAAPKzAUqFigEehYrAAO5eAgACGoWijeUWhawughyk4AAGpOVohbaFv4XyAQCD4wAAAAEDhcmF8gAAAAAAAABgwADyswFKhcwBHoXMwADuXgIAAhqF5I3mFoXtLoIcpOAABqTmaIX3hgCGhQEAo24AAAABA4YjhoUAAAAAAAAAYMAA8rMBPgFKhikBIhaGMC6ERaTfAB6GSaQQAQABJoZ6ARaGei6SW6TaYI1eAAak52iGioaTh1gBAJQ9AAAAAQOGn4dYAAAAAAAAAGDAAPKzAT4BSobpASIiFobwLoRFpN8AHIcOFocJLoCwpN5BAQABJwAAwAD2bAAiHIcrFocgLoQXwABP50EBAAEWhzUWhy4uklHAAE+0hBfAAE8HAMAA9ZwBHIdOFodDLoQXwABP50EBAAEch1GUgVYAAAAAwAD0nADAAPWcBqToaIddh2aHgAEAhEIAAAABA4duh4AAAAAAAAAAYMAA8rMBSodxASWHeBaHcS6SW6TaYI0xAAAPAO0ADwEYAA8BRgAPAYQADwG6AA8CHQAPAl0ADwKdAA8C3QAPAx0ADwNdAA8DqQAPBEQADwR6AAAADQABBqTWaIeFh4mKXAABo28AAAABA4eZilwAAAABAQGHoQAAAJJbYI0TAABgwAD0eQE+BE6HsYe6AACjcGDAAPR5ASMWh8OAh7zADwTWg9+NHhqH0MAARcyTAWDAAPR5PYmH5MAPBOsch+2Bh+TADwTrgN8BAAEjFof3gIfwwA8E1oPkjSMaiATAAEXPkwFgwAD0eQDAAPSSSYgYJYgjgIgcwA8E1mCNMT4DPYmIM8APBOsciDyBiDPADwTrgN8BAAEjFohGFIg/wA8E1gABYI0xg+KNQBqIUMAARc2TAWDAAPR5AMAA9JI9iYhjwA8E6xyIbIGIY8APBOuA3wEAASMWiHYUiG/ADwTWAAFgjTGD4I0/GoiAwABF0JMBYMAA9HkAwAD0kj2JiJPADwTrHIicgYiTwA8E64DfAQABIxaIphSIn8APBNYAAWCNMYPejUEaiLHAAEXRkwFgwAD0eQDAAPSSSYjKJYjVgIjOwA8E1mCNnz4CPYmI6cAPBOsciPKBiOnADwTrgN8BAAEjFoj8FIj1wA8E1gABYI2fg+KNtBqJBsAARc2TAWDAAPR5AMAA9JI9iYkZwA8E6xyJIoGJGcAPBOuA3wEAASMWiSwUiSXADwTWAAFgjZ+D3o2xGok3wABF0ZMBYMAA9HkAwAD0kkmJUCWJW4CJVMAPBNZgjV4+AT2JiXHADwTrHIl6gYlxwA8E64DfAQABIxaJhBSJfcAPBNYAAWCNXoPijWgaiY7AAEXNkwFgwAD0eQDAAPSSPgJOibSJuwAAklFbARaJxICJvcAPBNaSUYwbPR6J0Jl/BAAEJInxARaJ5ICJ3cAPBNaFA8AA9dkno28Wig6AigfADwTWlBOMHByKKxqKJsAA9uNlAQABJoo6ARaKOoKKM8APBvyEGABgwAD2XQDAAPcJAEqKSwGBilLADwTrAWgADwd3AA8AOgAPBLcAAAABAA8EuQAPB3cAAAABAKTro3FpAAADgPAAAKpqAAEBA50go3Kjc4FIAACDaAABAQaBsoSTio+FjofjiBOCSQAAmXsAAQECkbubkgAAAAgCpOxpgoSCioSTA6N0AAABYMAA9cUAAAQEpO5pgtiC3RidjwBdwAD1TgJgwAD2XWDAAE8BAASk72mDIYMoGJnNAF3AAPVOAmDAAPZdYMAATwEABKTwaYOVg5sYklEAYKT2AASk8WmDrYPBCaN1AGDAAPZdAAEFpPVpg8aDxoRKAAAAA4PShEoAAAAEBASD3wAABJ2PXcAA9U4CYMAA9l1gwABPAQCD6wAABJnNXcAA9U4CYMAA9l1gwABPAQCD+QAABJJRYKT2AIQGAAAEo3VgwAD2XQAAYKTsAT4BQCEchD4WhCkuo3Wk8UEBAAErAMAA9myEKYRFAAUIAaTugADADwhjCAGk74EAwA8IewgBpPCCAMAPCJMIAaTxgwDADwieCQGDxsAA9dsAAAAAAQak82mET4RWhJEAACMAAAABA4RehJEAAAAAAAAAYMAA9l0BSoRkASSEkQUno3YWhGwuo3Wk8SeD8haEihaEhC6dj6TugdzAAPVwJ4LaAAAPCQQADwlRAAAAAQKk9mmEloScp8YDozMAAAFgpOwAAAQEpPhphSKFLgmjdwBgwADyswAEpPlphUyFUhiYpQBdwAD1TgJgwAD2XWDAAE8BASsEpPpphXCFhRijeABdwAD1TgJgwAD2XWDAAE8BASsEpPtphZuFpBiD9gBdwAD1TgJgwAD2XWDAAPR5ASsEBaUaaYWphamGmQAAAAOFroaZAAAABQQEhcgAAACdj13AAPVOAmDAAPZdYMAATwEAhegAAACZzV3AAPVOAmDAAPZdYMAATwEAhf0AAACSUWCk9gCGDAAAAKNsYMAA9l0AAYYdAAAEo3dgwADyswEpYKT2AT8CCAGk+IQAwA8KQgkAhjqk9QQABICGQMAPCfmJhkfADwoRNQAAAAEAXcAA9U4CYMAA9l1gwABPAQGBhlHADwoRIxyGWYUAwA8KeEEBAAErAAA7hlxgwAD2XWDAAE8BAIUAwA8KeAFdwAD1TgJgwAD2XWDAAE8BgoZ7wA8KKYOGj8APCjQABaUbaYaehp6HNwCjeQADhqeHNwAAAAEAAAGGrgAAAKN3YMAA8rMBKmCk9gE/AQoAhsylGgUABDKG5mDAAPZdYMAATwEAMob/YMAA9l1gwABPAQArJ6N5AaN3gIcqwA8K9AWlHGmHPIc8h9gAo3oAA4dLh9gAAAAAAAAAYKT2AT8BCgCHVqUaBQAEO4dbYMAA9l1gwABPAQA7h3pgwAD2XWDAAE8BACsno3oBo3cqBaUdaYfdh92IqwCjewADh+mIqwAAAAMCAofwAAAAklFgpPYAh/8AAACjbGDAAPZdAAGIEAAAAKN3YMAA8rMBKWCk9gE/AQoAiC2lGgUABDKIVGDAAPZdYMAATwEAMohtYMAA9l1gwABPAQCAiHHADwuhgYh5wA8LrAGjd4KInsAPC7oaBqT9aYiwiMqJCwEAVQAAAAEDiNOJCwAAAAAAAABdwAD1FgFgwABPAQE+AUqI2QEfiOSlVAEAAS4ABqT+aYkQiSGJagEAo3wAAAABA4kuiWoAAAAAAAAAYMAAT/8BPgFKiTQBH4k/pV0BAAEuAAalAmmJb4l1ihEAAKN9AAAAAQOJg4oRAAAAAgICiYoAAACSUWCk9gCJmQAAAKNsYMAA9l0AAGCk9gE+AUqJqgEfibWlGgUABBiJwZ2PpO4Yic6ZzaTvgInXwA8MloGJ38APDKEBo3cWigAuo3ek+AalFmmKSIpRinwCAJ2PAAAAAQOKVop8AAAAAQEBilcAAACAqF3AAPVOAmDAAPZdYMAATwEAAFwBSopdAR6KXZmBAwADJ6N+HIpzlIFWAAAAAMAA9JwrAAalF2mKs4q8iusCAJnNAAAAAQOKw4rrAAAAAQEBisQAAACAqF3AAPVOAmDAAPZdYMAATwEAAFwBSorKAR6KypmBAwADJ6N/HIrilIFWAAAAAMAA9JwrAAalGGmLIosri1gCAJJRAAAAAQOLMYtYAAAAAQEBizIAAACAqGCk9gAAXAFKizgBHos4mYEDAAMno4Aci0+UgVYAAAAAwAD0nCsABqUDaYvTi9iMpQAAo4EAAAABA4vkjKUAAAABAQGL6wAAAJ2OYKT2AABcAT4FQByMDRaMBhaL/y6SUaTwklGk8EEBAAErAMAA9dKL/4wUAEAcjDYWjC8WjCiAjCLADw39klGk8JJRpPBBAQABKwDAAPXSjCKMPQA9GYxKnY8WjFiAjFLADw39nY+k7qTuPRmMaZnNFox5gIxzwA8N/ZnNpO+k7z0ZjIySURaMm4CMlcAPDf2SUaTwpPAGpQRpjKqMsI09AACe6gAAAAEDjMGNPQAAAAIBAYzJAAAAo2xgwAD2XQABjNoAAACjd2DAAPKzASlgpPYBPgFKjPUBH40ApR0DAAIugI0TwA8OtgGjd4GNLMAPDsQGpQVpjUKNSI5/AACjggAAAAEDjVmOfwAAAAEBAY10AAAAo4NdwAD1HQFdwABQcgJgwABQTlsAAGCk9gE+BEmNiRyNm4CNjcAPDxNBAQABKwDAAPXSSo2kAS4/To27jcQAAKOEYKT2AR+N0qUdAwACLiejhQGjdypGjhGOPo4qAAAAg1xdwABQcgJgwABQTlsAgI4vwA8PEz4BPRyOVBaOT4GORsAPD1Kdj6TugLICAAIWjleCjlXADw9zgLDAAFBmgo5fwA8PcwDAAPVjSo5sAYGOc8APD1IGpQZpj5OPmZABAACjhgAAAAEDj6+QAQAAAAAAAABgpPYBPgFKj7gBH4/DpRoFAAQWj8kunY+k7haP0C6ZzaTvFo/ZLpJRpPAnmHYBo3cpBqUHaZAGkAuQuwAAo4cAAAABA5AUkLsAAAADAwOQHAAAAICwYMAA9l0AkCYAAACEF2DAAPR5AJA2AAAAhBhgwAD23gAAXAE+AUmQRRaQSS6jd6T4PgI9IxyQaRaQXy6D9qT7QQEAASsAwAD10heQXy6D9jKQemDAAPZdYMAA9HkApPsrAV3AAPVOAmDAAPZdYMAA9Hk9HJCOFpCELoP2pPuYkAIAAoCQmsAPEDo0kKADkKCQsAAAAAAAAABgwAD0eQFKkKYBgZCmwA8QRwDAAPVpPwalCGmQwJDMkpoAAKOIAAAAAQOQ1JKaAAAABQUFkNwAAACAsGDAAPZdAJDmAAAAhBdgwAD0eQCQ9gAAAIQYYMAA9t4AkR4AAACAn13AAPVOAmDAAPZdYMAATwEAkSgAAACjiWDAAPKzAABgwABPAQE+A06RS5FTAACD5mDAAE8BARyRWIORVcAPETREAQABgJFZwA8RDQDAAPViSZFkHJFwhZFowA8RY0EBAAErAMAA9dJKkXkBKz9JkYohHJGbFpGWhZGOwA8RY4NmwABPA0EBAAErAMAA9dI+AUqRrAEfkbelSwQABCMWkc2AkcjADxENgPzAAPZjFpHXLqN1pPGAke7ADxENAWDAAPZdhZH+wA8RY4GSB8APERqCkhPADxEnAEmSKCIhhJItwA8RTAAWkkiFkkDADxFjlKzAAE8SPgFKkmIBKz4BSpKCAYWSicAPEWMGpQlpkp+Sq5U4AACT3wAAAAEDkrGVOAAAAAQDA5K5AAAAgLBgwAD2XQCSwwAAAIQXYMAA9HkAktMAAACEGGDAAPbeAAGS6AAAAKOJYMAA8rMBKWDAAE8BAT4HPRyTBi6jhwMAA4CTEMAPEmGBkxbADxJugpMiwA8SewClB06TPJNEAACD5mDAAE8BARyTTi6jiAUABYCTV8APEmGBk13ADxJugpNpwA8SexaTci6dj6Tug5N5wA8SiQClCEmTjyEck5uEk5PADxLCQQEAASsAwAD10kqTpAGEk6vADxLCPz2Mk7jADxLCHJPCLqOIBQAFgJPLwA8SYYGT0cAPEm6Ck93ADxJ7FpPmLpnNpO+Dk+/ADxKJAKUISZQFIiEclBGElAnADxLCQQEAASsAwAD10gAhFpQlhJQdwA8SwqOKwABPCz4BSpQ5AR+URKVDBAAEgJRXwA8SYYSUXcAPEsKBlGbADxJugpRywA8SewA/SZSGIYOUi8APEok+AUqU3wGElObADxLCP0qU+QE1AAAAAQBgwABPAQGElQDADxLCIxyVCIUAwA8T0UEBAAErAAA1AAAAAQBgpPYBFpULLpJRpPAjHJUThgDADxP1QQEAASsAACsclROGAMAPE/WT3wMAA4CVGsAPEmGBlSDADxJugpUswA8SewClCQFgwABPAYUAwA8T0QFgwABPAQalCmmVPZVJl+IAAKOLAAAAAQOVVZfiAAAABAMDlV0AAACAsGDAAPZdAJVnAAAAhBdgwAD0eQCVdwAAAIQYYMAA9t4AAZWMAAAAo4lgwADyswEpYMAATwEBPgc9HJWqLqOHAwADgJW0wA8UbYGVusAPFHqClcbADxSHAKUHTpXglegAAIPmYMAATwEBHJXyLqOIBQAFgJX7wA8UbYGWAcAPFHqClg3ADxSHFpYWLpnNpO+Dlh/ADxSVAKUISZY1IRyWQYSWOcAPFM5BAQABKwDAAPXSSpZKAYSWUcAPFM4/PYyWXsAPFM4clmguo4gFAAWAlnHADxRtgZZ3wA8UeoKWg8APFIcWlowunY+k7oOWk8APFJUApQhJlqkiIRyWtYSWrcAPFM5BAQABKwDAAPXSACEWlsmElsHADxTOo4rAAE8LPgFKlt0BH5bopUMEAASAlvvADxRthJcBwA8UzoGXCsAPFHqClxbADxSHAD9Jlyohg5cvwA8UlT4BSpeDAYSXisAPFM4/SpedATUAAAABAGDAAE8BAYSXpMAPFM4jHJeshQDADxXdQQEAASsAADUAAAABAGCk9gEWl68uklGk8CMcl7eGAMAPFgFBAQABKwAAKxyXt4YAwA8WAaOLAwADgJfEwA8UbYGXysAPFHqCl9bADxSHAKUKAWDAAE8BhQDADxXdAWDAAE8BBqULaZfnl+yYNAAAo4wAAAABA5f5mDQAAAABAQGYAQAAAICwYMAA9l0AAGDAAPKzAUqYCgEiIRyYERaYCi6YpaT5QQEAASsAwAD10gAcmCMWmBwumKWk+YHdAQABgJgvwA8WeQDAAPVhBqUMaZg5mD6ZQAAAo40AAAABA5hKmUAAAAACAgKYUgAAAICwYMAA9l0AmGQAAACB02DAAE8BAABcAT4BSZhyFph2LqN3pPg+Aj0jHJiTFpiMLpilpPlBAQABKwDAAPXSF5iMLpilMpisYMAA9l1gwABPAQCk+SsBXcAA9U4CYMAA9l1gwABPAT0cmLwWmLYumKWk+YCyAgACgJi9wA8W4oGYxcAPFu8AwAD1Yz4BPR6Y4Jl9AwADGpj7hZwcmS2UgVYAAAAAwAD0nCsABqUNaZlFmUqaBAAAo44AAAABA5ldmgQAAAACAgKZZQAAAICwYMAA9l0AmXcAAACB02DAAE8BAABcAT4DPRyZhS6jjQIAAoCZksAPF66BmZjADxe7AKUMPSMcmbsWmaUuo3ik+kEBAAErAMAA9dIXmaUuo3gymdRgwAD2XWDAAE8BAKT6KwFdwAD1TgJgwAD2XWDAAE8BPRyZ8RaZ3C6jeKT6gLICAAKAmfLADxeugZn6wA8XuwDAAPVjBqUOaZoJmg6a/QAAo48AAAABA5oYmv0AAAABAQGaIAAAAICwYMAA9l0AAGDAAPKzAT4DSZosIhyaRhaaMC6jeKT6QQEAASsAwAD10gEcmnwcmm8Wmlkuo3ik+pPgAQABgJp2wA8YaADAAPVrQQEAASsAwAD10kqahQEqP0malxyauBaasRaamy6jeKT6WsAA9XJBAQABkwDAAPWcPgE9F5rGLqN4K6T6P0qa7gEpBqT/aZsCmx+bYgEAo5AAAAABA5s8m2IAAAAAAAAAXcAA9U4CYMAA9l1gwABPAQE+AUqbQgEWm0kuo3ik+galD2mbZ5tzm+AAAKORAAAAAQObfpvgAAAAAQEBm4YAAACAsGDAAPZdAABgwABPAQE+AUqbkgE1AAAAAQBgwABPAQEjHJuhFpuaLpilpPlBAQABKwDAAPXSKxybuBabsi6YpaT5RAEAAYCbucAPGVMAwAD1YgFgwABPASMcm8CBAMAPGW5BAQABKwAANQAAAAEAYKT2ARabwy6SUaTwIxyby4IAwA8Zw0EBAAErAAArHJvLggDADxnDo5EBAAGAm9fADxlTAKUPAWDAAE8BgQDADxluAWDAAE8BBqUQaZ02nUWfDgAAl04AAAABA51Mnw4AAAADAwOdVAAAAICwYMAA9l0AnWYAAACD5mDAAE8BAJ1zAAAAhBhgwAD23gAAYIixAT4CSZ2CFp2GLqN3pPg+AkmdnDUAAAABAGDAAPKzATUAAAABAF3AAPVOAmDAAPZdYMAA9HkBFp2gLoP2pPsjHJ2rgwDADxp4QQEAASsAACscnauDAMAPGniB3QEAAYCdt8APGi0AwAD1YQFgwADysyMcnb2DAMAPGmxBAQABKwAAKoMAwA8abAFgwADysz4BSp3RARyeMByeDxqd2ISHhM0BAAGAnh3ADxotAIiugesDAAOCnj3ADxpHHJ5PFp5GLoP2pPtEAQABgJ5QwA8aLQDAAPViFp5cgJ5XwA8aLVrAAPZhAIiaPz0cnngWnnMunY+k7oCyAgACgJ55wA8aLYGegcAPGjoAwAD1Yz4BPR6enZl9AwADGp64hZwcnuqUgVYAAAAAwAD0nCsASp7/ASsGpRFpnxOfGKFOAACjkgAAAAEDnx2hTgAAAAICAp8rAAAAnY5gpPYAn0QAAACjPmEDYMAA9l1gwABPAWDAAE8BYMAATwEAAFwBPgVOn8KfxgAAgJ9dwAD1TgJgwAD2XWDAAE8BARafyC6dj6TuT5/Un9kAAAGjk2ECYMAA9l1gwABPAVwAA5/koOgAAAACAgKf7AAAAICwYMAA9l0An/4AAACSW2DAAE8BAABcAT4DTqAaoCMAAIOBYMAATwEBHKAogqAlwA8b1UQBAAGEoCnADxwZAMAA9WJJoDYhHKBDhqA6wA8cOUEBAAErAMAA9dI+AUmgViEcoGOGoFrADxw5QQEAAYWgZsAPHCYAwAD10j4BPY2gesAPHCYcoJ6BoIPADxuxIAMAA4Sgn8APHBmGoKXADxw5haCvwA8cJgAAPz89HKDTgqDQwA8b1YCyAgAChKDUwA8cGYWg3MAPHCYAwAD1Yz0coPsWoPWAoO/ADxumnY+k7oO8AQABg6EDwA8b+QDAAPVtPYqhFcAPG9UWoRsumc2k7z0coTYWoS6AoSjADxummc2k74O8AQABg6E+wA8b+QDAAPVtBqUSaaFToVihtgAAg7wAAAABA6FfobYAAAABAQGhYAAAAIEoYQJgwAD2XWDAAE8BWwAAXAE+Aj0coZAWoYounY+k7oO8AQABgKGYwA8dYADAAPVtPRyhqBahoC6ZzaTvg7wBAAGAobDADx1gAMAA9W0GpQBpobuhxqKcAQCEzAAAAAEDodKinAAAAAAAAABgwAD2XQE+BE6h5aHsAACCEmDAAPanAR+h8sAA9sYAAAAATqIKohcAAKOUYMAA9HkBHKIZLqOVAQABgKIhwA8d2wClE0WiLgGiN6I5AABbYMAA9HkBgaI7wA8d9QEcokuCoknADx4agUgBAAGTAMAA9akBiqJRwA8eGhyiUoKiUcAPHhqBQQEAAZQAwAD1nz4BPRyiZYCiXsAPHduBkwEAASSiewIconUng6GDPgEAAYKid8APHhoAwAD2dyeWPwDAAPa+SqKIASSimAGAopHADx3bBqUTaaKhoqWkJwAAo5UAAAABA6KspCcAAAABAQGiuAAAAIQBYMAA9scAAGDAAPR5AT4GTqLIotUAAKOUYMAA9HkBHKL1NQAAAAEAYMAA9HkBNQAAAAEAYKT2ARai2C6SUaTwIxyi4IEAwA8e90EBAAErAAArHKLggQDADx73o5UBAAGAoujADx7CAKUTAWDAAPR5Ixyi7oEAwA8e60EBAAErAAAcovGUgVYAAAAAwAD0nIEAwA8e6wFgwAD0eV0BAAGUAMAA9Z5OowWjDAAAo5ZgwAD2XQEcoxMng6GDPgEAAYGjFcAPHtkAwAD2dz0coyyAoyfADx7CgZMBAAEkoz4CgqM2wA8fbieZKQDAAPbLPRyjSxajRS6dj6Tug7wBAAE0o1MDo1OjogAAAAICAqNbAAAAgLBgwAD2XQCjbQAAAJJbYMAATwEAAGDAAPWCAT4BPRyjgoCjfcAPHsKBkwEAASSjmgOCo4zADx9uJ4Ohg6OVwA8f1QDAAPbLAMAA9W09HKOxFqOpLpnNpO+DvAEAATSjuQOjuaQJAAAAAgICo8EAAACAsGDAAPZdAKPTAAAAkltgwABPAQAAYMAA9YIBPgE9HKPogKPjwA8ewoGTAQABJKQBBIKj8sAPH24ng6GDo/vADyBGJ4CvAMAA9ssAwAD1bUqkEAGBpBfADx7ZBqUUaaQspDKnxAAAo5cAAAABA6RDp8QAAAAAAAAAYKT2AT4ITqRZpF8AAI8AXcAA9R0BYMAA9l0BHKRxFqRsFqRmLp2PpO6B3MAA9XCAoQAAAADAAPTxTqSYpJ4AAJ2PXcAA9U4CYMAA9l1gwABPAQEypLVgwAD2XWDAAE8BAE6kwqTMAACjmGDAAPKzASpFpNkBpOKk5AAAW2DAAPR5AZMBHKTrg6TpwA8hOVwBAAEWpPOApO3ADyDLWsAA9UwAwAD1pgGLpPvADyE5HKT8g6T7wA8hOV0BAAGUAMAA9Z4+A06lD6UUAACAsGDAAPZdARylG4ClFsAPIMtEAQABg6UcwA8hOQDAAPUsTqUypT4AAJ1mYMAATwEBHKVKFqVFLp2PpO5EAQABhKVLwA8hiQDAAPViSaVYFqVohaVcwA8hsoPewABPFz4BPYqlfMAPISYpPgE9HKWqgaWlwA8g/oCyAgAChKWrwA8hiYWls8APIbIAwAD1Yz2IpdLADyDLHKXsFqXnFqXfLpnNpO+B3MAA9XCAoQAAAADAAPTxTqYTphsAAJnNXcAA9U4CYMAA9l1gwABPAQEypjJgwAD2XWDAAE8BAEWmOgGmQ6ZFAABbYMAA9HkBkwEcpkyEpkrADyJwXAEAARamVICmTsAPIMtawAD1TADAAPWmAYymXMAPInAcpl2EplzADyJwXQEAAZQAwAD1nj4DTqZwpnUAAICwYMAA9l0BHKZ8gKZ3wA8gy0QBAAGEpn3ADyJwAMAA9SxOppOmnwAAnWZgwABPAQEcpq0WpqYumc2k70QBAAGFpq7ADyLAAMAA9WJJprsWpsuGpr/ADyLpg97AAE8XPgE9iqbfwA8hJik+AT0cpw+DpwjADyJFgLICAAKFpxDADyLAhqcYwA8i6QDAAPVjSqc3ASOCpz7ADyEmH6dWpRoFAASBp1zADyD+g6djwA8iRRanbC6SUaTwFqd0LqN1pPEBo3cWp6Quo3ek+C4BYKT2AAAPDAwADwxFAA8MeQAPDOgADw0/AA8NlgAPDeAADw6ZAA8O9gAPD84ADxAdAA8Q8AAPEkQADxRQAA8WXAAPFsUADxeRAA8YSwAPGPkADxk2AA8aEAAPG4kADx1DAA8dtAAPHqUADyCmAA8jlwAAABoCpR5pp8mnz6kGA6OZAAABYMAA9cUAAAEEpSBpp+yn8QmdjgBgpPYAAQWlJmmn9qf2qA4AAAADqAKoDgAAAAEBAagIAAAEnY5gpPYAAGClHgE/AggBpSCAAMAPJEkJAaf2wAD12wAAAAADBqUiaagTqBioaQAAlD8AAAABA6ghqGkAAAACAgKoKQAAAICwYMAA9l0AqDsAAACD5mDAAE8BAABcAT4BPRyoVRaoUBaoSi6djqUgnY+k7oCyAgACgKhWwA8kj4GoXsAPJJwAwAD1YwalI2mobqhzqMYAAKM7AAAAAQOofKjGAAAAAgICqIQAAACAsGDAAPZdAKiWAAAAg+ZgwABPAQAAXAE+AT0cqLIWqKsWqKUunY6lIJnNpO+AsgIAAoCos8APJPaBqLvADyUDAMAA9WMGpSRpqMuo4KkEAwBEAAAAAQOo4qkEAAAAAQEBqOoAAACAsGDAAPZdAABgwABPAQFKqPMBHKj+Fqj5FqjzLp2OpSCdj6TuRAEAAYCo/8APJVwAwAD1YgAADyRyAA8k2QAPJUAADyWWAAAAAwKlJ2mpCakYqm4Ho5oAAAFgwABPAQAABASlKWmpTKlQCYCwAGDAAPZdAASlKmmpZ6luCYPmAGDAAE8BAASlK2mpfamHCYQXAGDAAPR5AASlLGmplqmdCYQYAGDAAPbeAAEFpTNpqaKpoqnoAAAAA6mwqegAAAAEBASptgAABICwYMAA9l0AqcEAAASD5mDAAE8BAKnPAAAEhBdgwAD0eQCp4AAABIQYYMAA9t4AAGClJwE/BQgBpSmAAMAPJiQIAaUqgQDADyYxCAGlK4IAwA8mPggBpSyDAMAPJksJAamiwABPJAAAAAAEBqUuaantqfGp/wEAgdMAAAABA6n4qf8AAAAAAAAAWwFKqfsBKwalL2mqBKoNqh8BAKOKAAAAAQOqGKofAAAAAAAAAGDAAPKzAUqqGwEpBqUwaaokqjCqNwECIgAAAAEDqjeqNwAAAAAAAABgiJMABqUxaao8qlOqbAEAoz8BGqo9wADuSwAAAQOqZapsAAAAAAAAAGDAAPZdAUqqaAEWqmgugLClKQAADyaUAA8muQAPJuIADycDAA8nOgAAAAQCpTRpqwCrBq39A6ObAAABYKUnAAAAAQWlQ2mrNKs0q74AAAADq0arvgAAAAQEBKtVAAAAgLBgwAD2XQCrZwAAAIPmYMAATwEAq3QAAACEF2DAAPR5AKuEAAAAhBhgwAD23gAAYKU0AT8BCQCrlaUzBAAEgKubwA8ngoGrocAPJ4+Cq6rADyecg6u2wA8nqQAMBqU2aavDq9Or5AEAklEAAAABA6vaq+QAAAAAAAAAYMAATwEBSqvdARar3S6D5qUqBqU3aavpq/KsDAEAg+AAAAABA6v6rAwAAAAAAAAAYMAA8rMBSqv9ARasBRar/S6D5qUqg+DAAE8QBqU4aawRrBqsNAEAhEIAAAABA6wirDQAAAAAAAAAYMAA8rMBSqwlARasLRasJS6D5qUqhELAAE8PBqU5aaw5rEKsbAEAo20AAAABA6xSrGwAAAAAAAAAYMAA8rMBSqxVARasXRasVS6D5qUqo23AAE8VBqU6aaxxrHqslwEAhEAAAAABA6yDrJcAAAAAAAAAYMAA8rMBSqyGASEWrI8WrIcug+alKoRAwABPEQalO2msnKylrMIBAIRBAAAAAQOsrqzCAAAAAAAAAGDAAPKzAUqssQEhFqy6FqyyLoPmpSqEQcAATxYGpTxprMes0Kz8AQCUrAAAAAEDrOGs/AAAAAAAAABgwADyswFKrOQBFqzsFqzkLoPmpSqUrMAATxIGpT1prQGtCq0mAQCD3gAAAAEDrROtJgAAAAAAAABgwADyswFKrRYBFq0eFq0WLoPmpSqD3sAATxcGpT5prSutNK1UAQCERgAAAAEDrT+tVAAAAAAAAABgwADyswFKrUIBFq1KFq1CLoPmpSqERsAATxkGpT9prVmtYq2QAQCjnAAAAAEDrXStkAAAAAAAAABgwADyswFKrXcBFq1/Fq13LoPmpSqjnMAATxoGpUBprZWtnq24AQCjnQAAAAEDraatuAAAAAAAAABgwADyswFKrakBFq2xFq2pLoPmpSqjncAATxMGpUFprb2tya37AQAiAAAAAQOt0a37AAAAAAAAAGCIkwFKrdQBHK3oGq3Ug3WEzQEAARat9i6AsKUpAIiuAAAPJ+QADygUAA8oTQAPKIYADyi/AA8o+QAPKTMADylsAA8ppQAPKd4ADyoXAA8qUAAPKo0AAAAMAqVEaa4ArgawEwOdGwAAAWClJwAAAAEFpUtprjKuMq66AAAAA65CrroAAAAEBASuUQAAAICwYMAA9l0ArmMAAACD5mDAAE8BAK5wAAAAhBdgwAD0eQCugAAAAIQYYMAA9t4AAGClRAE/AQkArpGlMwQABICul8APKvWBrp3ADysCgq6mwA8rD4OussAPKxwAAwalRmmuv67Prt0BAJJRAAAAAQOu1q7dAAAAAAAAAGDAAE8BAUqu2QErBqVHaa7iru6vLQEAIgAAAAEDrvavLQAAAAAAAABgiJMBSq75ARyvGhqu+YRxhM0BAAEWrygugLClKQCIrgalSWmvWa9lsBEAAJ1pAAAAAQOveLARAAAAAAAAAGDAAE8BAT4DTq+Nr5kAAJ1mYMAATwEBFq+bLoPmpSpDr6ghHK/AFq+7gK+vwA8r5INmwABPA0EBAAErAMAA9dI+AT2Ir9HADyvkFq/rgK/fwA8r5INmwABPA0qv+wGAsALADyvkAAAPK1cADyuAAA8rvQAPLEAAAAADAqVMabAWsByy6gOjngAAAWDAAPXFAAFdwAD1FgFgwABPAQMEpU5psHWwehidjwBdwAD1FgFgwABPAQAEpU9psJqwoQmZzQBdwAD1FgFgwABPAQAEpVBpsLGwuBhXAGDAAE8BASsBBaVUabC9sL2xRAAAAAOw2rFEAAAAAQEBsOEAAACdjmCk9gAAYKVMAT8DCAClThaxCxaxBBaw/oCw+MAPLNOdj6TuKcAA9XFVwAD0/QgApU8WsTwWsTUWsS2AsSfADyzTmc2k7ynAAPVxVcAA9P0JAbC9wAD12wAAAAABBqVSabFJsU6y6AAAVgAAAAEDsVay6AAAAAAAAABgwADyswE+BE6xa7FwAACDZmDAAE8BATUAAAABAGDAAE8BARaxci5XpVAjHLF7gADADy1rQQEAASsAACsWsXuAAMAPLWuDZsAATwMBYMAATwFJsYUhHLGOgLGJwA8tXEEBAAErAMAA9dI+Aj0XsZ8uV4CxqcAPLVylUEqxtQEpP0mxzCEcsdYWsdAunY+lTkEBAAErAMAA9dI+Akmx5xyx8Rax6y6dj6VOVgAAAADAAPUYPgI9F7IHLlcWshcWshEunY+lTlfAAPUapVBKsigBKT89F7JDLp2PK6VOP0myWxyyZxayXy6ZzaVPVgAAAADAAPUYPgI9F7J7LlcWso0WsoUumc2lT1fAAPUapVBKspwBKT4CPReyvC5XK6VQSrLSASoAAA8tNgAPLnYAAAABAqVVabLtsvO2hAOjnwAAAWClTAABYMAAT/8DBKVXabNss3YYo6AAXcAA9RYBYMAA9l0ABKVYabORs5wJo6EAXcAA9RYBYMAA9l0ABKVZabOos6wYgLAAYMAA9l0BKwEFpV1ps7GzsbRXAAAAA7PStFcAAAABAQGz2QAAAJ2OYKT2AABgpVUBPwMIAKVXFrQGFrQBFrP7gLP1wA8u+p2PpO6B3MAA9XBVwAD0/QgApVgWtDkWtDQWtCyAtCbADy76mc2k74HcwAD1cFXAAPT9CQC0S6VUAQABgLRRwA8u+gABBqVbabRctGG2ggAAVgAAAAEDtGm2ggAAAAAAAABgwADyswE+BE60frSDAACDZmDAAE8BATUAAAABAGDAAE8BARa0hS5XpVAjHLSOgADADy+ZQQEAASsAACsWtI6AAMAPL5mDZsAATwMBYMAATwFJtJghHLShgLScwA8vikEBAAErAMAA9dI+Aj0XtLIuV4C0vMAPL4qlUEq0yAEpP0m03yEctOkWtOMunY+lTkEBAAErAMAA9dI+Akm0+hy1BBa0/i6dj6VOVgAAAADAAPUYPgQ9HLUlFrUaLqOgpVdWAAAAAMAA9Rg9F7U5LlcWtUkWtUMunY+lTlfAAPUapVA9F7VaLoCwFrVsFrVhLqOgpVdXwAD1GqVZSrV9ASk/PRe1mC6joCulVz9JtbUctcEWtbkumc2lT1YAAAAAwAD1GD4EPRy14Ra11S6joaVYVgAAAADAAPUYPRe18y5XFrYFFrX9LpnNpU9XwAD1GqVQPRe2FC6AsBa2Jxa2Gy6joaVYV8AA9RqlWUq2NgEpPgI9F7ZWLlcrpVBKtmwBKgAADy9kAA8xAAAAAAEAAAFpAA8xDwAPB9YADwleAA8kCAAPJasADydTAA8qxgAPLFUADy6DAA8xDQAAAAgADzEPAAAAAAClXqOiagAABoD/AACL8wABAQWUfJS/kjuWFZQQgVsAAKTUAAEBAZ0agZ4AAINoAAEBCISYhkGGRoZKhk+GUoZWjg+C7QAApA0AAQEPnQmjo50gnSKdI6MRnSSdJaMUoxWdJ6OkozOjc6MZhLkAAKdXAAEBAaOlhPYAAJl7AAEBApuPm3sAAAABAqVhaofuh/SpHgOdHAAAAWDAAERAAAFdwADyvwFgpWEEBKVjaohsiHUJo6YBGohVwADuS2CMzgAEpWRqiKKItwmjpwBdwAD1HQFgwABO8gAEpWVqiM6I2ViUhwBgwABFPwAEpWZqiOOI9RiUkQBgwADyswABBaVyaoj6iPqMEwAAAAOJDIwTAAAAEA0NiSoAAACR8F3AAPUdAV3AAE/BAWDAAFBOAIk+AAAAo2tgwAD0eQCJVgAAAICwYMAA9l0AiXwAAACjg13AAPUdAV3AAFByAmDAAFBOWwCJowAAAJSGYMAART8AicwAAACdQF3AAPUdAWDAAEU/AInkAAAAnY5gpPYAifcAAACUiWCk9gCKGgAAAJJRXcAAT3ECYMAAUE5bAIotAAAEo6ddwAD1HQFgwABO8gCKTgAAAKOoYMAA9HkAimkAAACEF2DAAPR5AIp/AAAAo6lgwAD0eQADipsAAACZPGCMzgEriqsAAASUh2DAAEU/ASuKwwAABJSRYMAA8rMBKmClYQE+AT0ei/WnngIAAhaMBS6ZPKVoLgAFCAGlZBQAwA8y8gkACAGlZRQAwA8zOQ4ACAGlZhQAwA8zRw8ACAClYx6K9KVgBwAHJosEARSLBMAPMy0NAGCnlYOLCcAPMo6CixjADzKBJoseARSLHsAPMt4IAGCq6RSLMsAPMwUKABSLQ8APMxILABSLT8APMx8MAAAJAItnwABEcwoACoCLbcAPMluBi3fADzJ0gouCwA8ygYOLiMAPMo6Ei5fADzKohYuiwA8ytYaLusAPMsiHi8HADzLTFIvPwA8y3ggAFIvXwA8zEgsAAAgGpWhqjBiMNIxLAQCZPAEajBnAAO5LAAABA4w4jEsAAAAAAAAAYKeVAUqMOwEmjDsBFoxCFow7Lp0TwABER6OmwABERmCnlQalaWqMUIx1jI0BAIQJARqMUcAA7ksAAAEDjH2MjQAAAAAAAABgqukBSoyAASaMgAEYjIaECcAATt1gqukGpWtqjJKMmKA3AACe8QAAAAEDjJ2gNwAAAAICAoyzAAAAhAlgqukAjMsAAACa613AAE9xAmDAAFBOWwAAYIzOAT4OT4zejOMAAAGjqmECYMAA9l1gwABPAVwAA4zwkeAAAAACAgKM+AAAAICwYMAA9l0AjQoAAACdZmDAAE8BAABcAT4BRI0fPgJJjSwhHI1DFo08hI0wwA81N5JRwABPBUEBAAEuAMAA9dI+AUmNWCEcjWQWjVwuhBjAAE/oQQEAARaNehaNc4SNZ8APNTeSUcAATwWEGMAATwYAwAD3BT4BPR6NkZmABAAEJI2mARaNni6EGMAAT+gkjccBFo2+Fo23hI2rwA81N5JRwABPBYQYwABPBhaNyS6EF8AAT+cWjeUuhBjAAE/oAD4BPR6ODpmABAAEFo4ZLqM/wABESTUAAAABAGDAAE8BARaOOISOLMAPNTeSUcAATwUjHI5AhQDADzYFQQEAASsAACsWjkCFAMAPNgWjP8AATwoBYMAA9l0WjmMuhBfAAE/nFo5vLoQYwABP6ABJjpQljqSEjpjADzU3YMAARIc+Ak6PWo9gAACURGCNEwEcj24Uj2LADzU3BAFgwABEh57xAQABgI90wA804QDAAESTSY+IIiEWj5kUj43ADzU3BAFgwABEh509wABPFAAcj7UWj7AUj6TADzU3BAFgwABEh4NmwABPA0EBAAErAMAA9dI+AT0cj9AWj8wumTylaJQ/AQABhY/awA82cQCNCD9Jj/0lkA2EkAHADzU3YMAARNw+A06QOpBDAACST2CNEwEckFEUkEXADzU3BAFgwABE3J7xAQABgJBXwA804QDAAETqPReQdIWQa8APNxOSURaQfS6ZPKVojBtJkIwiIRaQnRSQkcAPNTcEAWDAAETcnT3AAE8UAByQuRaQtBSQqMAPNTcEAWDAAETcg2bAAE8DQQEAASsAwAD10j4BPRyQ1BaQ0C6ZPKVolD8BAAGFkN7ADzcTAI0IPz4BPR6REJl/BAAEJJE2ARaRKYSRHcAPNTeFA8AA9dkno6oWkWOEkVfADzU3hBfAAE8HFpF7hJFvwA81N4QYwABPBgA9jJGXwA81NxaRsYSRpcAPNTeDZsAATwMhHJHShJHGwA81N0EBAAErAMAA9dI9HJHtFpHnLp2OwABO0oO8AQABgpH1wA81CgClEj0ckhYWkgkulInAAE7Tg7wBAAGCkh7ADzUKAKUSPReSPBaSMi6jpqVjlIY1AAAAAQBgwABFPwEWklAulIbAAE7QIxySW4MAwA84cEEBAAErAAArHJJbgwDADzhwo6sDAAOAkmrADzThFpJzLoQXwABP5xaSfy6EGMAAT+gAwABFQgFgkvaM3kmSjSIiIRaSki6UkaVmACEcksQWkroWkrAuo6alY5SGjN5BAQABKwCTAQAWkuwWkuEWktcuo6alY5SYjO+UkYzuPgI9HJQsgJQkwA804Z04BAAEHJRdGpRChx2EzQEAARaUgBaUdRaUay6jpqVjlJiM74CwjNQAiK4WlJEuhBfAAE/nGpSng2wWlLsuhBjAAE/oAKr8PReU1RaUyy6jpqVjlIYrjN4/PReU+xaU8S6jpqVjlIc1AAAAAQBgwABFPwEWlREulIelZSMclR6DAMAPOYFBAQABKwAAKxyVHoMAwA85gZ1rAwADgJUvwA804RaVOC6EF8AAT+cWlUQuhBjAAE/oAMAARUMBYJL2jN89F5VcFpVSLqOmpWOUkRaVcS6UkaVmjQQ9F5X2FpXyLpk8pWiD3xaWAy6D38AAT+uNAEmWEyEcliIWlhcunUDAAE7RQQEAASsAwAD10j4BRpYzlmOWSgAAAJv5YMAART8AFpZXLp1AwABO0T4CTpZ3loEAAJSGYJL2ARyWmYOWj8APOi6jqwMAA4CWqMAPNOEWlrEuhBfAAE/nFpa9LoQYwABP6ADAAEVCSZbPIRyW3YSW08APOkhBAQABKwCTAT4BPRyXSxaXOhaXMC6jpqVjlIiM4E8BAAGEl0/ADzpIAMAA9S4/Pz0cl4UWl3gulInAAE7Tg7wBAAE0l40Dl42aoQAAAAICApeVAAAAgLBgwAD2XQCXpwAAAJhQYMAATwEAAGDAAPWCAT4FTpfIl88AAJJbYMAATwEBHJfdFpfRLp7owABO1EQBAAGDl97ADzrhAKUkSZfrHJf2hZfvwA87BUEBAAErAMAA9dJKl/8AP0mYDSEWmBmFmBLADzsFg97AAE8XSpgjAD89HJiwLp04AwADHJjXGpi7g8WEzQEAAYOY5cAPOuEAiK4WmQKEmPbADzruhBfAAE8HGpkOg2wAwABO50mZHxaZL4SZI8APOu6D48AATw4+AT0cmUQunTgDAAMcmXkamVyDw4TNAQABJJmdAxaZjy6AsMAAUGYngTGDmZfADzrhAIiuFpmzhZmswA87BYQXwABPBxqZy4NsAMAATuc+AT0cme0unTgDAAMcmjcamgWDwYTNAQABJJpbAxaaTS6AsMAAUGYngTGDmlXADzrhAIiuFppxhZpqwA87BYQXwABPBxqaiYNsAMAATucApRI9HJq3FpqvFpqpLp2OwABO0pnNpO+DvAEAATSavwOav55WAAAAAgICmscAAACAsGDAAPZdAJrZAAAAmctgwABPAQAAYMAA9YIBPgNOmvWa/AAAkltgwABPAQEcmwoWmv4unujAAE7URAEAAYObC8APPHgApSRJmxgiHJsjhZscwA88nEEBAAErAMAA9dIBISIiFptBhZs6wA88nIRCwABPDwAhFptUhZtNwA88nIPgwABPEAEiIhabdIWbbcAPPJyjbcAATxUAFpuOhZuHwA88nIPewABPFwAWm6GEm5rADzyFg97AAE8XSpu0AD9Jm8Icm94Wm82Fm8bADzyclKzAAE8SQQEAARab6ISb4cAPPIWUrMAATxIAwAD10j4CPRycBC6dOAMAAxycKxqcD4PFhM0BAAGDnDnADzx4AIiuFpxThJxMwA88hYQXwABPBxqcX4NsAMAATuc9HJyuLp04AwADHJzVGpy5g8mEzQEAAYOc48APPHgAiK4WnP2FnPbADzychBfAAE8HGp0Jg2wAwABO5z4CPRydKy6dOAMAAxydWRqdNoPHhM0BAAGDnWfADzx4AIiuFp2BhJ16wA88hYQXwABPBxqdjYNsAMAATuc9HJ3cLp04AwADHJ4KGp3ng8uEzQEAAYOeGMAPPHgAiK4WnjKFnivADzychBfAAE8HGp4+g2wAwABO5wDAAPVtPRyebBaeZBaeXi6djsAATtKZzaTvg7wBAAE0nnQDnnSf9QAAAAICAp58AAAAgLBgwAD2XQCejgAAAJnLYMAATwEAAGDAAPWCAT4ETp6qnrYAAJhQYMAATwEBHJ7PFp64LqOswABO1UQBAAGDntDADz6JAKUkSZ7dIhye7YWe4cAPPq1BAQABKwDAAPXSASEWnwCEnvnADz6Wg97AAE8XSp8KAD89HJ8YLp04AwADHJ9EGp8jg8GEzQEAAYOfUsAPPokAiK4Wn2qEn2PADz6WhBfAAE8HGp92g2wAwABO5z0cn4cunTgDAAMcn64an5KDyYTNAQABg5+8wA8+iQCIrhaf2YWfzcAPPq2EF8AATwcan+WDbADAAE7nAMAA9W09HKAMFqABFp/9Lpk8pWiUOYzjgKIBAAEaoBGkDwDAAPUwSqApARagMC6ZPKVoBqVsaqA8oEGhqAAAnXEAAAABA6BYoagAAAABAQGgZQAAAJhQYI1eAABcAT4GTqB/oIQAAICwYMAA9l0BFqCXFqCSgKCGwA8/y4CwjReAsJI1PRygshagpRagoS6ZPKVolImM4k8BAAGAoLbADz/LAMAA9S49F6DUgKDIwA8/y5JRFqDdLpk8pWiMG06g+KEGAACjrWCk1wEfoQyk6gIAAoChHsAPP8suAD0XoUSCoTbAD0A6g2YcoWIWoUsuo6zAAE7VRAEAAYGhY8APP9wApSTAAE8DPRyhhhahbi6jrMAATtWUPwIAAoGhkMAPP9yCoZbAD0A6AKUiBqVtaqGtobKjMAAAo64AAAABA6HKozAAAAAAAAAAXAE+Aj0codkWodMunY7AAE7Sg7wBAAE0oeEDoeGi1AAAAAICAqHpAAAAgLBgwAD2XQCh+wAAAJ1mYMAATwEAAGDAAPWCAT4BRKIQPgJJoh0loi2BoiHAD0D3YMAARIc+AT0colwUolDAD0D3AQFgwABEh6OuAAAAAMAARJQ/PYmiisAPQPcWoqSBopjAD0D3g2bAAE8DIRyixYGiucAPQPdBAQABKwDAAPXSAKUSSaLbIRai4C6dPcAATxQ+AT0covUWovEumTylaKOvAQABFqMUFqMNFqMFLoQJpWmR5Ks9o7ClggCnmz8GpW5qozWjRaVTAACjsQEaozbAAO5LAAABA6NQpVMAAAAAAAAAYMAA9HkBPgZJo1khFqNeLp09wABPFEqjZwGTPz0cpBQWpAgWpAQumTylaJQ0jNODvAEAATSkHAOkHKRHAAAAAQEBpB0AAAA+YI5jAABgwAD0eQFKpCMBF6QlgKQjwA9CFZQTFqQ9FqQ5FqQyLp0TwABER5k8wABERJQTjByMHADAAPTrTqRTpFkAAIDQYMAA9HkBkz0cpGgWpGIunY7AAE7Sg7wBAAE0pHADpHCkyAAAAAICAqR4AAAAgLBgwAD2XQCkigAAAJ1mYMAATwEAAGDAAPWCAT4BPYikn8APQlgcpKWApJ/AD0JYXQEAARyktIKkqMAPQpWjsQAAAADAAE8hAMAA9Z4ApRI9HKTcFqTPLpSJwABO04O8AQABNKTkA6TkpTwAAAACAgKk7AAAAICwYMAA9l0ApP4AAACdZmDAAE8BAABgwAD1ggE+AT2IpRPAD0JYHKUZgKUTwA9CWF0BAAEcpSiCpRzAD0MLo7EAAAAAwABPIQDAAPWeAKUSSqVDAYClSsAPQlgGpW9qpVilaqhNAACjsgAAAAEDpYGoTQAAAAEBAaWPAAAAmw1dwABOzQJgwABQTlsAAF3AAPUdAWDAAE8BAT4ITqW6pcEAAYEQXcAA9R0BYMAATwEBMaXQYMAATwEATqX1pf8AAZSGYMAARMkBJqX1ARamBi6UhsAATtBgwABEyUmmFSEcpiOCphnAD0O9QQEAASsAwAD10j4BPRymO4GmNMAPQ59PAQABFqZJgqY/wA9DvZ1mwABQCQDAAPUuSaZiIRymcoCmZsAPQ3tBAQABLgDAAPXSPgE9HKaKgaaDwA9Dn08BAAGApo7AD0N7AMAA9S4/TqbEps8AAZ1AXcAA9R0BYMAART8BFqbWLp1AwABO0Umm5iEcpvWDpurAD0RTQQEAASsAwAD10j4BRacGAacPpxEAAFtgwAD0eQGTARynGISnFsAPRI9cAQABFqclg6cawA9EU1rAAPVMAMAA9aYBjKctwA9EjxynLoSnLcAPRI9dAQABlADAAPWePgJOp1OnXQAAm/lgwABEyQEmp1MBHKdpg6dfwA9EU0QBAAGEp2rAD0SPAMAA9SxgwABEyT0cp32Bp3bAD0OfTwEAARani4WngcAPRN+dZsAAUAkAwAD1Lj9Op8in1AABlIdgwABEyQEmp8gBFqfbLpSHpWVgwABEyUmn7CEcp/yEp/DAD0U2QQEAASsAwAD10j4BPRyoFIGoDcAPQ59PAQABFqgkhKgYwA9FNp1mwABQCQDAAPUuP0qoPAGBqEPAD0OfBqVwaqhSqGKpHAAAgd8BGqhTwADuSwAAAQOoa6kcAAAAAQEBqH8AACCDm2ClYQAAYMAA9HkBPgNOqJColwAAgRBgwAD0eQEcqKQkqKMBFqibLoQYwABP6IHfAQABJKjAARaot4CoscAPRcOEGMAAT+gAwAD2bUmoxyEcqNKBqMvAD0XYQQEAAZMAwAD1nEqo2AGBqN/AD0XYP0qo6wEcqP0WqPIuhBfAAE/ngd8BAAEWqQ2AqQfAD0XDhBfAAE/nAMAA9Z0AAA80QAAPNIcADzTEAA8/rgAPQKcAD0GuAA9DXgAPRZ8AD0ZkAAAACAABBqVgaoUthTmH6wABo7MAAAABA4VIh+sAAAAHBweFWgAAAJk8YKeVAIV9AAAAo4NdwAD1HQFdwABQcgJgwABQTlsAhZcAAACAsGDAAPZdAIW2AAAAklFgqukAhcYAAACjqGDAAPR5AIXfAAAAhBdgwAD0eQCF8wAAAKOpYMAA9HkAAGCnlQE+Bj0jHIYKgIYGwA9GrEEBAAErAMAA9dKIhgbAD0asH4YSp6ACAAACgLCChivAD0bRkl4ehmvAAEVYAQABgYabwA9GtwArAWCnlT01AAAAAQBgp5UBgIauwA9GrCMchroWhrKHhrLAD0dhhBiM3EEBAAErAMAA9wUXhrKHhrLAD0dhhBgWhsWDhr7AD0behBirRYzcKwFgwAD23kmG0ByG6BaG2ICG1MAPRqyUfYzQQQEAARqG9IwaAMAA9Zw+AT0XhwiAhwTAD0aslH2EhxrAD0bpjNA/SYcxHIdEFoc5gIc1wA9GrJQTjBxBAQABGodQjBoAwAD1nD4BPReHZICHYMAPRqyUE4WHccAPRvaMHD9Jh4Mch5kWh4uAh4fAD0aslH6M0UEBAAEah6WMGgDAAPWcPgE9F4e5gIe1wA9GrJR+hofJwA9HA4zRP0qH3wGAh+bAD0asAWoAD0hsAA8xzgAPRo0AAAABAA9GjwAPSGwAAAABAKVzo7RrAAAegPgAAMAAsckAAQEBA4EaAADAAL8AAAEBAQSBPAAAwADNkgABAQGEioFmAACL8wABAQ2VM5X3lHyBloVjkjaSOJX5lDCUUJTelhWUEIKVAACYAAABAQKZvpm7gvcAAJiuAAEBAZp9gzAAAIK1AACDYAAAwABF/AABAQGjtYOgAACkCgABAQGcz4PjAADAAEYmAAEBAaO2hAkAAMAARjMAAQEBo7eELwAAg2gAAQEYgbKEk4VnhWuMcYx1jHmM/4SYhZKEmoeIh/eH/IgAiAWIyIjNicKJx4nMisiNk47Wh44AAKdXAAEBAqOlo7iH6gAApA0AAQELnQmdH50go7mdIp0jnSajFJ0nnSidKYk0AACcDAABAQGR0YluAADAAEZIAAEBAaO6iaYAAMAAR8wAAQEBo7uJ8QAAwABH7wABAQGjvIo9AADAAEW6AAEBAaNHioYAAJx0AAEBApHVnfCKxQAAwABIAAABAQGjvYsKAADAAEgNAAEBA6O+o7+jwItQAACZewABAQGRu4uBAACJBgABAQSBoZIHgaOSCYvIAADAAEgXAAEBAaPBjBQAAMAASIEAAQEBo8KMRAAAwABI7wABAQGjw4xwAADAAEj1AAEBAaPEjKQAAKVeAAEBAZ0cjOEAAKs5AAEBAZ6VAAAAAQKld2uNIo0owACWcQOdHQAAAV2cdwFgjEcAAA0EpXlrjZ+NqQmB4wBggrYABKV6a43ujf0JkgoAYMAA8rMABKV7a44cjjwJnvUAXcAA9U4CYMAA9t5dwAD1HQFgwAD0eQEyjjpgwAD23l3AAPUdAWDAAPR5AASlfGuOfI6FGIQrAGCYDAErBKV9a46TjpwYhCoAYJivASsEpX5rjvaPBBijxQBgklkBKwSlf2uPEY8hGKPGAGCSWQErBKWAa48ujzwYo8cAYJJZASsEpYFrj1uPbhijyABgqVMBKwSlgmuPhY+WGKOwAGDAAEhHASsEpYNrj6uPuhijyQBgwABGAAErBKWEa4/Vj+oYo8oAYMAAR80BKwSlhWuQBZAaGKPLAGDAAEfwASsBBaW6a5AfkB+QfQAAAAOQK5B9AAAAAwMDkDEAAASB42CCtgCQQgAABJIKYMAA8rMAkGAAAACB02CcDwAAYKV3AT8DCAGleYAAwA9LwwgBpXqBAMAPS84JAJBwnJoBAAGCkHbAD0vbADEGpYdrkIKQoJDcAQCd0gAAAAEDkLeQ3AAAAAAAAABdiKoBXgAFBQVgwAD0eWDAAPR5YMAA9Y9gwAD1j2DAAPWPAAFXg2oAYIiTAUqQwAEakMCG5waliGuQ4ZDqkQABAJ3TAAAAAQOQ+ZEAAAAAAAAAAGDAAPKzAUqQ/AEpBqWLa5EFkROdUgAAkgYAAAABA5EbnVIAAgACAQGRMQAAAIQJXas6AmDAAFBOWwABkUYAAACjzGDAAPKzASpdwACy6gFgmwABPg9OAAAAAYFZXcAAsjABYJsAAR+Ra8AAsj0AAWCbAAAATgAAAACBWl3AALLmAWCbAABOAAAAAIFbWwBOAAAAAIFcWwBOAAAAAIFdWwBOAAAAAIFeWwGTTgAAAACBX1sATgAAAACBYFsATgAAAACE51sAT5ETAAAAAIFhWwADkRudUgQAAAMAAwAAAACBYlsAAAAAAIFjWwAAAAAAgWRbAABbAUs+A0E+Ck6RdZF5AACAoGDAAPbeARaRg4CRe8APTKyEGKtFTpHEkcoAAIP6XcAA9R0BYMAA9HkBHJHXFpHMLp71pXtEAQABFJHYwA9NgQ8AAMAA9WJJkeMcke0UkefAD02eEABBAQABKwDAAPXSPgJJkhcckiYWkh8UkhvAD02BDwCBTMAA9uRBAQABGpIpnHYAwAD2bD4DTpJUklwAACJgiJMBHJJ4GpJeh3GEzQEAARaSjoCShsAPTKyAoKtSAIiuPRySpICSnMAPTKyjzQEAARSSusAPThMRAACrgj0VkszAD02eEByS1C6jzgIAAhaS+4CS88APTKyAoKtSKwCljEmTFCEWkx0UkxnAD02BDwCjz8AA9vA+Aj2LkzLAD0z5JpMyAR6TOZl9AwADHJN+GpNWhbmEzQEAARSTjMAPTYEPAACIrhyTnpSBVgAAAADAAPScFpO2gJOuwA9MrICgq1IAXcAAsuYBYJsAQgAASZPJHJPYFpPRFJPNwA9NgQ8AgUzAAPbkQQEAARqT8Ks8AMAA9mw+AT0VlBDAD02eEByUGC6jzgIAAhaUP4CUN8APTKyAoKtSKwCljD9JlFkhHJRjFJRdwA9NnhAAQQEAASsAwAD10j4ETpSAlJQAAKPQYMAA3BMBHpSawADcFwEAARyUsRaUqhSUpMAPTZ4QAFrAAPVMXQEAAZQAwAD1ngA9HJTTFJS/wA9PVBEAgxcDAAOTFpTlFJTfwA9NnhAAWsAA9UwUlO3AD02eEAAAwAD1Qj0VlP3AD02eEBSVBcAPT1QRAD0clS0WlSIunvWle4CyAgACFJUuwA9NgQ8AFJU1wA9NnhAAAMAA9WM/P0mVTxyVWRSVU8APTZ4QAEEBAAErAMAA9dI+B06VzwAAAKPRXcAA9R0BYMAA9HkASz4CTZX4AjUAAAAAAFsBHpX4wACyAAQABByWGxyWCRaV/i6B46V5hIUBAAEUlhbAD02BDwAAgriEhgAAAACCwIUAwA9NE4YAwA9NHBQAwA9NTAsAACs9FZXtwA9QFREUAMAPTV8MAAABljJggsQBllAAAAGDBmCCxAAAPgNOlmWWbQAAImCIkwEcloQalm+DsYTNAgACFJaSwA9NgQ8AFpaZFJaXwA9QlxIAIoLHAIiuPRyWs4CWq8APTKyjzQEAARSWycAPUKYTAACrgj0VltvAD1AVERyW5i6jzgIAAhaXDYCXBcAPTKyAoKtSFJcSwA9QphMAAKWMTpc0l0gAAKPQYMAA3BMBHpdOwADcFwEAARyXaBaXYRSXWMAPUBURAFrAAPVMXQEAAZQAwAD1ngA9HJeIFJd0wA9RIhIAgxcDAAOTFpedFJeUwA9QFREAWsAA9UwUl6XAD1AVEQAAwAD1Qj0Vl7bAD02eEBSXvsAPUSISAD0cl+QWl9kunvWle4CyAgACFJflwA9NgQ8AFJfswA9NnhAAAMAA9WM9F5f5Lp3RHJgDFpf5Lp3RnINdAQABFpgPFJgGwA9QFREAWsAA9UwAwAD1npyDP06YMJg3AACBEGCJGAEemDmJDAIAARSYPsAPTZ4QAAGSChaYVi6SCqV6TphymHgAAI8xYJsAARaYgRSYesAPUfURAJICiRpJmI0hgZiSwA9Mvz4ETpi7mMIAAIL9XcAA9R0BYMAA9HkBHJjELqPSAQABFJjOwA9NnhAAAKWNTpjgmOoAAJHhYMAA9t4BFpj0gJjswA9MrICgq1JJmP8WmQuAmQPAD0ysnT3AAE8UPgROmrmayQAAo9NdwAD1HQFgwAD2XQEemtvAAPUjAQFgwAD2XQEWmvcUmu3AD1JyFACC0cAA9uwAPRybHhSbDsAPUqQVAE8BAAEWmz8WmzIWmyqAmyLAD0yshBirRYLRwAD27IF5wAD1AgDAAPUuPRybXRSbTsAPUqQVAICyAgACkySbgAIcm3UUm2bAD1KkFQBEAQABkwDAAPUsJ6PUAMAA9S09FZuKwA9SchQcm6AUm5bAD1JyFACE9QEAAAGC0RSbtsAPUqQVAMAA9wc/PRyb3Rab1i6B06WJnRAEAAQUm/3AD1JyFAAWnBCAnAjAD0yshBirRRacIBScGcAPUfURAJIDiRsUnCzAD1JIEwAAnCY/Q5w/JZxMFJxGwA9SHhIAYJzVPgJJnGMhgZxowA9Mvz4CTpyUnJoAAILoYJzVASaclAEUnJzAD1IeEgBgnNU9HJyzgJyrwA9MrJ04BAAEFpzEFJy+wA9T1xMAge2c2R6c1sAAg2UBAAEUnOXAD1IeEgAAHpz5wACDbAEAARSdCMAPUh4SAAAUnRDAD02BDwAAwABPiT89FZ0kwA9SHhIWnTIUnSzAD1IeEgCDZpsbPYudQsAPTPkUnUnAD1IeEgBCAAA9HgDAALIDAgACggDAD0zagwDAD0z5AEqdUgADAQBbAQAAAACBY1sAAQAAAACBZFsAPgE9HACCAMAPTNqBbAIAAhQAwA9Ulw8AFADAD1SgEAAAwACzEz2MAMAPTQoeAMAAsgQBAAEUAMAPTUwLAAA9jQDAD00THgDAALH+AQABFADAD01MCwAAPY4AwA9NHB4AwACx/wEAARQAwA9NTAsAAD0ckRuCAMAPTNpjAQABFADAD01MCwAAAEoAARYAggDAD0zagW3AALMPBqWMa51XnWGesgAAo84AAAABA51/nrIAAAACAgKdhAAAAICgYMAA9t4AnZEAAAAiYIiTAABdwAD1HQFgwAD0eQE+AUedoCSdrgGAnarAD1VeAwGdvSeafwA+AUqd0gEcnd4andnAAL8YkhQBAAEaneWldQDAAMFuAZ4JJ5qQAD4BSp4fARyeKxqeJsAAvxiSFAEAARqeMqV2AMAAwW4AAT4BSp5jARyebxqeasAAvxiSFAEAASMcnn6BnnbAD1VrQQEAASsAwAD10icAJJ6nAyej1Raem4Gek8APVWsiiJYnmUkBYMAA9l0AwADBbgaljWuet57Bn88AAKPSAAAAAQOeyp/PAAAAAQEBntUAAACD+l3AAPUdAWDAAPR5AABdwAD1HQFgwAD0eQE+AkmfHSWfJ4CfIcAPVkxgwADcEz4BSp89AR6fSMAA3BkDAAMWn2gUn2LAD1ZMAAFgwADcE4ISwADb2hafdhSfcMAPVkwAAWDAANwTo9bAANvYHJ+SFp+LFJ+FwA9WTAABYMAA3BNawAD1TIFBAQABlADAAPWfAD9Kn6IBHJ+vgJ+pwA9WTID/AgACkxyfxxafwICfusAPVkxawAD1TIFBAQABlADAAPWfAMAA9UAGpY5rn9Sf4aDUAACd3gAAAAEDn+2g1AACAAEBAaADAAAIhAldqzoCYMAAUE5bAABdwACy6gFgwAD1ggE+Dk4AAAABgVldwACyMAFgwAD1ggEfoBLAALI9AAFgwAD1ggAATgAAAACBWl3AALLmAWDAAPWCAE4AAAAAgVtbAE4AAAAAgVxbAE4AAAAAgV1bAE4AAAAAgV5bAZNOAAAAAIFfWwBOAAAAAIFgWwBPn+EAAAAAgWFbAAOf7aDUBAAAAwADAAAAAIFiWwAAAAAAgWNbAAAAAACBZFsAAFsBSz4DQT4FTaAnAjUAAAAAAFsBHqAnwACyAAQABBygLS6SBgEAAYCgNsAPVzcApYuEAMAPV5iFAMAPV6EUAMAPV8gJAAArTqAeoCUAAJICYJsAARQAwA9X2woASaBEHKBPFKBIwA9YPA0AQQEAASsAwAD10j4CPYqgWMAPV3wrQgAAP06gc6B8AACj12DAAEkDAR+ggsAASXkBAAEmoJEBgKCRwA9XN12rOgJgwABFP2CMRwA9HKC/H6CjwABIDAEAARSgtcAPWHkOAACj2AEAARSgycAPWDwNAADAAIIEPR4AwACyAwIAAoEAwA9XWYIAwA9XfABKoNQAAwEAWwEAAAAAgWNbAAEAAAAAgWRbAD4BPRwAgQDAD1dZgWwCAAIUAMAPWPQNABQAwA9Y/Q4AAMAAsxM9iwDAD1ePHgDAALIEAQABFADAD1fICQAAPYwAwA9XmB4AwACx/gEAARQAwA9XyAkAAD2NAMAPV6EeAMAAsf8BAAEUAMAPV8gJAAA9HJ/tgQDAD1dZYwEAARQAwA9XyAkAAABKAAEWAIEAwA9XWYFtwACzDwalj2ug2aDmpKAAAJ3bAAAAAQOg76SgAAIAAQEBoP8AAAiECV3AAE9xAmDAAFBOWwAAXcAAsuoBYMAA9YIBPg5OAAAAAYFZXcAAsjABYMAA9YIBH6EOwACyPQABYMAA9YIAAE4AAAAAgVpdwACy5gFgwAD1ggBOAAAAAIFbWwBOAAAAAIFcWwBOAAAAAIFdWwBOAAAAAIFeWwGTTgAAAACBX1sATgAAAACBYFsAT6DmAAAAAIFhWwADoO+koAQAAAMAAwAAAACBYlsAAAAAAIFjWwAAAAAAgWRbAABbAUs+A0E+AUmhFCWhIIChGMAPWbtdqzoCYMAAUE5bPgdNohYCNQAAAAAAWwEeohbAALIABAAEHKIcLpIGAgABFKIlwA9ZuwABXas6AmDAAFBOWwGjzCmli4QAwA9aHoUAwA9aJxQAwA9aTgkAACtOog2iFAAAkgJgmwABFADAD1phCgBJolIcol0UolbAD1rqDQBBAQABKwDAAPXSPgI9iqJmwA9aAitCAAA/TqKBoooAAKPXYMAASIIBHKKMLqPZAQABFKKfwA9ZuwABXas6AmDAAFBOWwClkU6iuqLBAACj2mDAAEjwAR+ix8AASPQBAAEUotLAD1snDgAAPRyi6hSi48APW1UPAKPYAQABFKL0wA9a6g0AAMAAggRGowMAox0AAACZYl2rOgJgwABQTlsAFqMtFKMlwA9ZuwABXas6AmDAAFBOW5Q2q0BBPgRJoz4hHKNVFqNHFKNCwA9bmxAAo9vAAE94QQEAARSjWMAPWbsAAV2rOgJgwABQTlsAwAD10j4BQqOxAT9No9wCNQAAAAAAWwEeo9zAALIABAAEHKPiLpIGAQABFKPrwA9bmxAAAKWLhADAD1oehQDAD1onFADAD1pOCQAAK06j06PaAACSAmCbAAEUAMAPWmEKAEmj+iEcpAUUo/7AD1xIEQBBAQABKwDAAPXSPgM9F6QjFKQawA9bJw4AgKAWpC4UpCnAD1ubEACEGKtFwABIjz0XpEoUpEHAD1snDgCj3JPAAEiLPRykcxSkbMAPW1UPAKPYAQABFKR9wA9cSBEAAMAAggQ/Pz0eAMAAsgMCAAKBAMAPWd+CAMAPWgIASqSgAAMBAFsBAAAAAIFjWwABAAAAAIFkWwA+AT0cAIEAwA9Z34FsAgACFADAD1zxDQAUAMAPXPoOAADAALMTPYsAwA9aFR4AwACyBAEAARQAwA9aTgkAAD2MAMAPWh4eAMAAsf4BAAEUAMAPWk4JAAA9jQDAD1onHgDAALH/AQABFADAD1pOCQAAPRyg74EAwA9Z32MBAAEUAMAPWk4JAAAASgABFgCBAMAPWd+BbcAAsw8GpZBrpKWkuKlVAACe8wAAAAEDpMepVQACAAQEBKTkAAAAhAldqzoCYMAAUE5bAKT6AAAAkmlgwAD2XQClFQAAAJSsYMAA8rMApToAAACe8GCOOAAAXcAAsuoBYI5jAT4OTgAAAAGBWV3AALIwAWCOYwEfpUzAALI9AAFgjmMAAE4AAAAAgVpdwACy5gFgjmMATgAAAACBW1sATgAAAACBXFsATgAAAACBXVsATgAAAACBXlsBk04AAAAAgV9bAE4AAAAAgWBbAE+kuAAAAACBYVsAA6THqVUEAAADAAMAAAAAgWJbAAAAAACBY1sAAAAAAIFkWwAAWwFLPgNBPgpNpWACNQAAAAAAWwEepWDAALIABAAEHKVmLpIGAgABgKVvwA9duAGjzCqli4cAwA9eNhQAwA9ePwgAFADAD15mDAAAK06lWKVeAACPMWCbAAEUAMAPXnkNAEmlmxylpRSln8APXt8QAEEBAAErAMAA9dI+Aj2Npa7AD14cK0IAAD9Opcyl2QAAo91gwABIggEcpdsuo9kBAAGApe7AD124AKWRTqYJphAAAJJRYMAATwEBgKYSwA9duEmmHyEcpjKBpiPAD13KQQEAASsAwAD2bD4CTqZPplMAAJk8YMAATwEBHKZ4FqZsFKZfwA9fHBEAlmzAAEiOk98DAAOBpn/AD13KHKaPlIFWAAAAAMAA9JwrAKUJSaagJaaoFKakwA9fbhMAXcAATs0CYMAAUE5bPgI9FabDwA9fPhIUpszAD19uEwFdwABOzQJgwABQTls9NabZAAABAGDAAEiCARSm2cAPXxwRADUAAAABAFsBF6byFKbwwA9f7BQAlJUUpwHAD19uEwFdwABOzQJgwABQTlvAAEiMNQAAAAEAWwEXpxEUpw/AD1/sFACWbBynKRanIxSnH8APX24TAV3AAE7NAmDAAFBOW52OwABO0qN9AgACHKdgFqdUFKdHwA9fHBEAlmzAAEiOo4IBAAEWp3YUp3LAD19uEwFdwABOzQJgwABQTlujg8AATs8ApQUkp7gCJ6PegaepwA9dygClAsAASI4UAMAPX+wUAD8/Tqfkp+wAAIPmYMAARPABNafyAAABAGDAAETwAR+n8sAARQUMAAwrkysno98rKxqoR43iJqhPAYCoT8APXbhgqumTkxyoXpSBVgAAAADAAPScHKhilIFWAAAAAMAA9JwANQAAAAEAWwEXqG4UqGzAD2DWEwCSURSod8APXz4SAMAAT7QUAMAPYNYTAE6oj6iYAACj12DAAEZRASaojwEcqKcUqJrAD18cEQCj4AMAAxSov8APYMcTABao1RSoyMAPXxwRAJZswABIjoKo4sAPXdcAwABIz2DAAEZRPY2o+sAPXhwcqQoUqQHAD2FSFACj4QMAAx+pLcAAgtYBAAEUqTTAD2FSFAAAFKk/wA9e3xAAg6lGwA9d5ADAAEagQgAAPR4AwACyAwIAAoQAwA9d/YUAwA9eHABKqVUAAwEAWwEAAAAAgWNbAAEAAAAAgWRbAD4BPRwAhADAD139gWwCAAIUAMAPYgYQABQAwA9iDxEAAMAAsxM9jgDAD14tHgDAALIEAQABFADAD15mDAAAPY8AwA9eNh4AwACx/gEAARQAwA9eZgwAAD0VAMAPXj8IHgDAALH/AQABFADAD15mDAAAPRykx4QAwA9d/WMBAAEUAMAPXmYMAAAASgABFgCEAMAPXf2BbcAAsw8GpYlrqVqpa6mBAQCB0wAAAAEDqXKpgQAAAAAAAABgnA8BSql1ASapdQEYqXuB05x8YJwPBqWRa6mGqZOqGQAAo9kAAAABA6mlqhkAAAABAQGpuwAAAIQJXas6AmDAAFBOWwAAYMAASIIBPgFKqcoBH6nVwABI7gQABICp4sAPYwIWqesuhCulfBap9i6EKqV9FqoBLqPIpYEABqWSa6oeqiOt9gAAnUMAAAABA6ovrfYAAAAAAAAAXAE+CU6qQqpIAACUNl3AAPUdAWDAAPbeATGqT2DAAPbeAE6qcqp8AACELF3AAPUdAV2rOgJgwABQTlsBMaqUXas6AmDAAFBOWwA9HKqlFqqcLp07nHmDvAEAATSqrQOqrat3AAAAAgICqrIAAACAoGDAAPbeAKrGAAAAhAldwABPcQJgwABQTlsAAGDAAPWCAT4BSarXHKrqFqrjg6rbwA9j35HkwABPgEEBAAEuAMAA9dI+AUmq/RarCYOrAcAPY9+d2cAAT34+AT0cqyOAqx3AD2NuTwEAAYKrJ8APY9IAwAD1Lj4BPRyrUoGrSMAPY4xPAQABJqtWAYOrVsAPY99dqzoCYMAAUE5bAMAA9S4/AMAA9W1Oq4erkQAAo+JdwAD2DgFgwAD23gEeq5fAALsfAAFgwAD23gAARqunq9erwQAAAIQJXas6AmDAAFBOWwCBq8zAD2OMPgE9HKvng6vfwA9kqaPjAQABgqv0wA9kgACreUasCqwhrBMAAACAoGDAAPbeAICsGsAPY24+AUmsKRysN4KsLcAPZICC0AEAAYOsQMAPZOMAwAD2Gj4BPRysWRasUC6dO5x5k+ABAAGDrGDAD2TjAMAA9Ws+A06skqyXAACZYl2rOgJgwABQTlsBJqySARysoRasmS6dO5x5RAEAAYOsosAPZOMAwAD1Yl2rOgJgwABQTls9HKy1hKywwA9lOZ04BAAEGqzAhqiTlBas3oSs2cAPZTmEGKtFAMAAT4k9HKz1hKzwwA9lOaPkAgACKysAq3g9HK0oFq0hLoSynIaE4AEAASej5QCZkT0crU8WrUYunTuceYO8AQABNK1XA61XrcwAAAACAgKtXAAAAICgYMAA9t4ArXAAAACECV3AAE9xAmDAAFBOWwAAYMAA9YIBPgFJrYEcrZQWrY2ErYXAD2X3keTAAE+AQQEAAS4AwAD10j4BPRytr4Stp8APZfej5gAAAADAAE+YPwDAAPVtPRyt2hat0y6EspyGhOABAAEno+cAmZEGpZNrrfuuALV+AACdRAAAAAEDrhS1fgAAAAAAAABcAT4KTq4xrjsAAKPoXcAA9g4BXcAAT3ECYMAAUE5bAR6uQcAAux8AAV3AAE9xAmDAAFBOWwAATq5wrnoAAKPpXcAA9g4BXcAAT3ECYMAAUE5bAR6ugMAAux8AAV3AAE9xAmDAAFBOWwAAPRyupBaumy6dO5x5g7wBAAE0rqwDrqywIAAAAAICAq6xAAAAgKBgwAD23gCuxQAAAIQJXcAAT3ECYMAAUE5bAABgwAD1ggE+Akmu1hyu6Rau4oOu2sAPZxyR5MAAT4BBAQABLgDAAPXSPgJOrxGvHwAAo+pdqzoCYMAAUE5bASavEQGDryHAD2ccXas6AmDAAFBOWz0cr0CErzLAD2dco+sAAAAAq3s/Sa9kFq96Fq9wg69owA9nHKPowABPd4NowAD1AD4CPRyvmoGvkMAPZr5PAQABg6+ewA9nHADAAPYbRq+wr9uvvAAAAKPsYMAARicAFq/Qg6/IwA9nHKPowABPdz4BPRyv8YCv58APZotPAQABFq/+hK/1wA9n1qPswABGKQDAAPYbPwDAAPVtTrBBsEYAAKPtXcAA9g4BXas6AmDAAFBOWwEesEzAALsfAAFdqzoCYMAAUE5bAABGsG2wmLCBAAAAo+5dwABPcQJgwABQTlsAgbCNwA9mvj4CSbCgHLCugLCkwA9mi4LQAQABg7C3wA9oUwDAAPYaPgE9HLDRgrDMwA9oIE8BAAEmsNUBg7DVwA9oU12rOgJgwABQTlsAwAD2Gz9GsO6xGLD6AAAAlFhgwABGJwAWsQ2DsQTAD2hTo+jAAE93PgE9HLE3FrErg7EiwA9oU51nwABPdIO8AQABFrFGhLE/wA9ov6PvwABGMAClEk6xcLF7AACj8GDAAPKzASpEsYg+Aj2LsZPAD2kLKkaxrbHZsccAAACj7l2rOgJgwABQTlsAgrHTwA9oID4BRrHjsg2x7wAAAJRYYMAARicAFrIChLH5wA9pLaPowABPdz4BPRyyLhayIoSyGcAPaS2dZ8AAT3SDvAEAATSyNgOyNrLNAAAAAgICsj4AAACAsGDAAPZdALJQAAAAkltgwABPAQAAYMAA9YIBPgFJsmYcsnGFsmrAD2lNo+8CAAKGsoLAD2mTh7KIwA9poADAAEYwPgE9i7KhwA9pCyk/AKUSg7LvwA9pCz0cswkWswAunTuceYO8AQABNLMRA7MRs8cAAAACAgKzFgAAAICgYMAA9t4AsyoAAACECV3AAE9xAmDAAFBOWwAAYMAA9YIBPgFJszscs04Ws0eFsz/AD2odkeTAAE+AQQEAAS4AwAD10j4CTrN2s4QAAKPqXas6AmDAAFBOWwEms3YBhbOGwA9qHV2rOgJgwABQTls9HLOlhrOXwA9qXZ7tAAAAAKt8PwDAAPVtRrPOs/mz4gAAAKPxXcAAT3ECYMAAUE5bAIGz7sAPZr4+AT0ctSQWtRqEtRHAD2qjo+jAAE93gdAAAAAAwAD1Nj0ctT4WtTcuhLKchoTgAQABJ6PyAJmRBqWUa7WDtYi4bAAAo/MAAAABA7WZuGwAAAAAAAAAXAE+AT0ctewWteMunTuceYO8AQABNLX0A7X0uGcAAAACAgK1+QAAAICgYMAA9t4AtgYAAACB81sAAGDAAPWCAT4HTrYmti4AAIQJXas6AmDAAFBOWwEmtiYBgbYwwA9rQ12rOgJgwABQTltOtkq2UgAAlD5dwAD2DgFgwABPAQEetljAALsfAAFgwABPAQAATraItpEAAFVdwAD1FgFgwABPAQEWtpuCtpPAD2tWVcAAT4RDtqsctruEtrLAD2ukVgAAAADAAPUYPgE9HLbZg7bRwA9rf08BAAEWtuaEtt3AD2ukV8AA9RoAwAD2G063C7cTAACj9F3AAPUdAWDAAPZdATG3HWDAAPZdAD0ctzsWty+CtyfAD2tWnWfAAE90g7wBAAE0t0MDt0O4DwAAAAICArdLAAAAgLBgwAD2XQC3XQAAAJJbYMAATwEAAGDAAPWCAT4BQ7dvIRy3fYe3dsAPbFNBAQABKwDAAPXSPgJJt5IhHLefg7eXwA9rf4LQAQABh7eowA9sUwDAAPYaPgE9HLfHhbe/wA9sAk8BAAGGt8vAD2xGAMAA9S4/PY+36MAPbFMWt/iHt/HAD2xTg2bAAE8DAKUSSbgYFrgkhbgcwA9sAoNowAD1AD4BPR64OsAA7mABAAEkuFcDgLhCwA9rNiej9YW4T8APbAIAPwDAAPVtBqWVa7hxuHa5pQAAnUUAAAABA7iCuaUAAAAAAAAAXAE+A064j7iZAACj9mDAAPR5AZM9HLirFriiLp07nHmDvAEAATS4swO4s7lxAAAAAgICuLgAAACAoGDAAPbeALjMAAAAhAldwABPcQJgwABQTlsAAGDAAPWCAT4BSbjdHLjwFrjpgrjhwA9tdZHkwABPgEEBAAEuAMAA9dI+Ak65GLkmAACj6l2rOgJgwABQTlsBJrkYAYK5KMAPbXVdqzoCYMAAUE5bPYi5OcAPbTocuUOAuTnAD206XQEAARy5VIO5RsAPbbWdRQAAAACrfgDAAPWePwDAAPVtPRy5fxa5eC6EspyGhOABAAEkuaADJ6AzgLmQwA9tOiej9wCZkQallmu5qrmvuxIAAJ1KAAAAAQO5yrsSAAAAAAAAAFwBPgNOude54wAAo/hgwAD0eQGTPRy59Ra57C6dO5x5g7wBAAE0uf0Duf26zAAAAAICAroCAAAAgKBgwAD23gC6FgAAAIQJXcAAT3ECYMAAUE5bAABgwAD1ggE+AUm6Jxy6Oha6M4K6K8APbpOR5MAAT4BBAQABLgDAAPXSPgJOumK6cAAAo+pdqzoCYMAAUE5bASa6YgGCunLAD26TXas6AmDAAFBOWz2IuoPAD25YHLqPgLqDwA9uWF0BAAEcuqCDupLAD27TnUoAAAAAq4QAwAD1nj8AwAD1bT0cutoWutMuhLKchoTgAQABJLsNAyej+YC67MAPblgno/oAmZEGpZdruxe7HLwwAACdXgAAAAEDuza8MAAAAAAAAABcAT4DTrtDu0kAAIDQYMAA9HkBkz0cu1sWu1IunTuceYO8AQABNLtjA7tju+8AAAACAgK7aAAAAICgYMAA9t4Au3wAAACECV3AAE9xAmDAAFBOWwAAYMAA9YIBPgFJu40cu6AWu5mCu5HAD2+xkeTAAE+AQQEAAS4AwAD10j4BPYi7s8APb3Ycu7mAu7PAD292XQEAARy7xIK7vMAPb7GdXgAAAADAAE+NAMAA9Z4/AMAA9W09HLv9Frv2LoSynIaE4AEAASS8KwIno/uAvCXAD292AJmRBqWYa7w1vDq9SQAAnV8AAAABA7xWvUkAAAAAAAAAXAE+A068Y7xpAACA0GDAAPR5AZM9HLx7FrxyLp07nHmDvAEAATS8gwO8g70FAAAAAgICvIgAAACAoGDAAPbeALycAAAAhAldwABPcQJgwABQTlsAAGDAAPWCAT4BSbytHLzAFry5gryxwA9wpZHkwABPgEEBAAEuAMAA9dI+AT2IvNPAD3BqHLzZgLzTwA9wal0BAAEcvOSCvNzAD3Clo/wAAAAAwABPjgDAAPWePwDAAPVtPRy9Exa9DC6EspyGhOABAAEkvUQDJ6P9gL0zwA9waiej/gCZkQalmWu9Tr1TvlMAAJ1NAAAAAQO9Zr5TAAAAAAAAAFwBPgNOvXO9eQAAgNBgwAD0eQGTPRy9ixa9gi6dO5x5g7wBAAE0vZMDvZO+HAAAAAICAr2YAAAAgKBgwAD23gC9rAAAAIQJXcAAT3ECYMAAUE5bAABgwAD1ggE+AUm9vRy90Ba9yYK9wcAPcZyR5MAAT4BBAQABLgDAAPXSPgE9iL3jwA9xYRy96YC948APcWFdAQABHL30gr3swA9xnJ1NAQABKwDAAE8iAMAA9Z4/AMAA9W09HL4qFr4jLoSynIaE4AEAASS+TgMnoDOAvjvAD3FhJ6P/AJmRBqWaa75Yvl2/oAAAnUkAAAABA75wv6AAAAACAgK+fgAAAIOIXcAATs0CYMAAUE5bAL6SAAAAnS5gwABQTgAAXAE+A06+qb6vAACA0GDAAPR5AZM9HL7BFr64Lp07nHmDvAEAATS+yQO+yb9hAAAAAgICvs4AAACAoGDAAPbeAL7iAAAAhAldwABPcQJgwABQTlsAAGDAAPWCAT4BSb7zHL8GFr7/hL73wA9ytZHkwABPgEEBAAEuAMAA9dI+AT2KvxnAD3J6HL8fgr8ZwA9yel0BAAEcvyqEvyLAD3K1nUkCAAKAvz7AD3JTgb9GwA9yZwDAAE+SAMAA9Z4/AMAA9W09HL9vFr9oLoSynIaE4AEAASS/mwMnoDOCv4DAD3J6J6QAAJmRBqWba7+lv6rAAEE5AACdRgAAAAEDv73AAEE5AAAAAwMDv8oAAACdLmDAAFBOAL/jAAAAlKdgwABQTgDAAEACAAAAmw1dwABOzQJgwABQTlsAAFwBPgNOwABAGcAAQB8AAIDQYMAA9HkBkz0cwABAMRbAAEAoLp07nHmDvAEAATTAAEA5A8AAQDnAAEDuAAAAAgICwABAPgAAAICgYMAA9t4AwABAUgAAAIQJXcAAT3ECYMAAUE5bAABgwAD1ggE+AUnAAEBjHMAAQHYWwABAb4XAAEBnwA9z/pHkwABPgEEBAAEuAMAA9dI+AT2LwABAicAPc7McwABAj4PAAECJwA9zs10BAAEcwABApoXAAECewA9z/p1GAwADgMAAQLrAD3N9gcAAQMfAD3OKgsAAQNPAD3OXAMAAT5MAwAD1nj8AwAD1bT0cwABA/BbAAED1LoSynIaE4AEAASTAAEE0AyekAYPAAEEfwA9zsyekAgCZkQalnGvAAEE+wABBQ8AAQkEAAJ1gAAAAAQPAAEFWwABCQQAAAAAAAABcAT4DTsAAQWPAAEFpAACA0GDAAPR5AZM9HMAAQXsWwABBci6dO5x5g7wBAAE0wABBgwPAAEGDwABCCAAAAAICAsAAQYgAAACAoGDAAPbeAMAAQZwAAACECV3AAE9xAmDAAFBOWwAAYMAA9YIBPgFJwABBrRzAAEHAFsAAQbmCwABBscAPdUaR5MAAT4BBAQABLgDAAPXSPgE9iMAAQdPAD3T7HMAAQdmAwABB08APdPtdAQABHMAAQeSCwABB3MAPdUadYAAAAADAAE+PAMAA9Z4/AMAA9W09HMAAQhYWwABCDy6EspyGhOABAAEkwABCPAMnpAOAwABCJ8APdPsnpAQAmZEGpZ1rwABCRsAAQkvAAENGAACdYQAAAAEDwABCXcAAQ0YAAAAAAAAAXAE+A07AAEJqwABCcAAAgNBgwAD0eQGTPRzAAEKCFsAAQnkunTuceYO8AQABNMAAQooDwABCisAAQw4AAAACAgLAAEKPAAAAgKBgwAD23gDAAEKjAAAAhAldwABPcQJgwABQTlsAAGDAAPWCAT4BScAAQrQcwABCxxbAAELAgsAAQrjAD3ZzkeTAAE+AQQEAAS4AwAD10j4BPYjAAELawA92KBzAAELggMAAQtrAD3YoXQEAARzAAELrgsAAQuPAD3ZznWEAAAAAwABPkADAAPWePwDAAPVtPRzAAEMcFsAAQxUuhLKchoTgAQABJMAAQ0EDJ6QDgMAAQy3AD3YoJ6QFAJmRBqWea8AAQ6LAAEOnwABGgwAApAYAAAABA8AAQ8DAAEaDAAAAAQEBwABDzgAAAJsNXcAATs0CYMAAUE5bAABcAT4BScAAQ+EiJcAAQ/GAwABD5cAPd09gpWEAHMAARC0WwABEJhbAAEQeFMAARBLAD3dPAAFgpWGECaVpkeSrPUEBAAEuAMAA9dI+A0nAAEQ+IRzAAERYFsAARE4UwABEQsAPd08AAWClYZSGwABO0EEBAAErAMAA9dI+Aj0XwABEdxTAAERrwA93TwABYKVhlIYrwABO0D0cwABEnRTAAESRwA93TwABYKVhnTgDAAMawABEtYZqFsAARNcUwABEy8APd08AAWClYYQXwABP5xrAAETjg2wAwABO5z9JwABE/CEcwABFFxbAAEUMFMAARQDAD3dPAAFgpWGdQMAATtFBAQABKwDAAPXSPgI9HMAARTYUwABFKsAPd08AAWClYZ04AwADGsAARU6GbBbAAEVzFMAARWfAD3dPAAFgpWGEF8AAT+cawABFf4NsAMAATuc9F8AARZ4UwABFksAPd08AAWClYZ1AK8AATtE/ScAARb8hHMAARdsWwABFzxTAAEXDwA93TwABYKVhlIelZUEBAAErAMAA9dI+Aj0cwABF+hTAAEXuwA93TwABYKVhnTgDAAMawABGEoZuFsAARjQUwABGKMAPd08AAWClYYQXwABP5xrAAEZAg2wAwABO5z0XwABGXxTAAEZTwA93TwABYKVhlIcrpWU/Pwaln2vAAEfAwABH2cAAUioAAKQHAAAAAQPAAEfuwABSKgAAAAEBAcAAR/wAAACbDV3AAE7NAmDAAFBOWwAAXcAA9R0BYKVhAT4NTsAASHXAAEh+AACe/V3AAPUdAWClYQExwABIlGClYQBGwABInMAASMzAAEiwAAAAhAldwABPcQJgwABQTlsAFsAASMQWwABIuy6dO5x5KcAA9XE+AUnAAEjUHMAASOcWwABI4ILAAEjYwA951pHkwABPgEEBAAEuAMAA9dI+Ak7AAEkQwABJGAAAlD5dwAD1FgFgwABPAQEWwABJIoLAAEkawA951lXAAE+EQ8AASTQcwABJQ4PAAEk7wA96LVYAAAAAwAD1GD4CTsAASWfAAEluAACSW2DAAE8BARbAAEl4g8AASXDAD3otV8AA9RpJwABJiyXAAEmWhMAASY/AD3p3YKVhPgE9HMAAScSBwABJu8APea5PAQABFMAAScjAD3p3BAFgpWEAwAD1Lj8/TsAASgzAAEofAACkCF3AAPYOAV3AAE7NAmDAAFBOWwEewABKJcAAux8AAV3AAE7NAmDAAFBOWwAARcAASj4BwABKR8AASkkAAFtgwAD0eQGTARzAAEpQg8AASk7AD3sbXAEAARbAAEppGsAASlKkDFrAAPVMAMAA9aYBi8AASnHAD3sbHMAASnKDwABKccAPextdAQABlADAAPWePgE9HMAASpGCwABKfsAPet1PAQABJsAASqABHMAASqAWwABKlS6a65yBRAEAARzAAEq3GsAASqGkDEQBAAGDwABKuMAPexsAwAD1LADAAE+WXcAATs0CYMAAUE5bAMAA9htOwABLCMAASyMAAKQJXcAA9g4BYKVhAR7AAEsxwAC7HwABYKVhAABOwABLaQAAAKQKXcAA9R0BYKVhAETAAEt/PgM9jMAAS4rAD3wCgcAAS53AD3muPYnAAEutwA95rjHAAEvMYKVhAEXAAEvWAcAAS9/AAEvhAABbYMAA9HkBkwEcwABL6IXAAEvmwA98SFwBAAEWwABL+4TAAEvqwA98AlrAAPVMAMAA9aYBjcAATAPAD3xIHMAATASFwABMA8APfEhdAQABlADAAPWePgVOwABMJcAATCkAAJk8YKVhARzAAEw7hMAATCvAD3wCRAEAAYXAAEw8wA98SADAAPUsTsAATFrAAExrAACkC13AAPUdAWDAAE8BARzAAEx9hsAATHnAD3yqo7IBAAGAwABMlcAPeYoApW9OwABMsMAATMcAAKQMYMAA8rMBKUFFwABM1wHAAEzgwABM4gAAW2DAAPR5AZMBHMAATOkUwABM58APfS0JAFwBAAEWwABM/IfAAEzrwA9821rAAPVMAMAA9aYBFcAATQTAD30tCRzAAE0FFMAATQTAD30tCQBdAQABlADAAPWePgJOwABNIcAATSsAAJSG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pL0BAAGBwADUKMAQLxEAplA+AUrAANQ9ARzAANRELqSIAQABHMAA1FUupL0BAAGDwADUXMAQMHEAplAAplQ/ScAA1HQiIiIiIiXAANSBgcAA1HjAEC8RYJMbASXAANSngcAA1J7AEC8RYJMjASXAANTNgcAA1MTAEC8RYJMrASXAANTygcAA1OnAEC8RYJMzASXAANUagcAA1RHAEC8RYJM+ASXAANU/g8AA1TnAEDBxYJMbPgFKwADVWgEcwADVYS6kiAEAARzAANV7gcAA1XLAEC8RQQEAAYPAANV+wBAwcQCTCgCmVD4BSsAA1Z0BHMAA1aQugVUCAAKAwADVuMAQLs0cwADV9BrAANXKg/mEzQIAAoHAANYTwBAvERzAANYmgcAA1h3AEC8RlhcBAAEWwADWLi6WRaX4AJMLAIiuAKYVP0nAANajJcAA1rCBwADWp8AQLxFgkz4+AUnAANbLHMAA1uAWwADW2YLAANbPwBAvRFrAAPVMQQEAAZQAwAD1nD4BR8AA1vAWwADXAhbAANb9gMAA1vjAEC7NgLCPUICwkjUBAcAA1xknXQA+A07AANc5wADXPwABg5tgkwUBHMAA10qCwADXQcAQL0REAQABkwDAAPUsScAA11slwADXZYPAANdfwBAynmCTPj4BSsAA14gBHMAA148um64BAAEfwADXs5NFAQABHMAA19EWwADXyxTAANfCwBAvEQEBYJM+gIqTE10BAAEWwADX2RTAANfTwBAyngMBYJM+gIqTEwDAAPZyAACmXz9KwADX/AEcwADYAy6BVQIAAoDAANgbwBAuzRzAANhbGsAA2DGD94TNBAAEJ10UwADYl8AQLxEBAWCTPhbAANjFFsAA2LUulkWl+JVVofscwADY64PAANjlwBAynpYXAQABFsAA2PMulkWl+ACTCwCIrgCmFT9JwADZJCIlwADZMYHAANkowBAvEWCTKwElwADZTIHAANlDwBAvEWClwT4BScAA2W4cwADZgxbAANl8gsAA2XLAEC9EWsAA9UxBAQABkwDAAPWcPgFHwADZkxbAANmlFsAA2aCAwADZm8AQLs2AsI9QgLCSNQIBwADZvCeBVgA+A0nAANnSFsAA2dYupHWmED4DTsAA2gLAANoIAACAimDAAPKFARbAANouJsAA2hQAgcAA2gvAEC8RYKXBpEmlw0nA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wAEQDIHAAQ//wBBVSlrAAPVMgIsBAAGUAMAA9ag+A07AARAmwAEQMgABlVRdwAD1HQFgjmMBHsABEDjAAO6CAQFgjmMBFsABEFaBwAEQScAQVUpawAD1TABFwAEQZQHAARBuwAEQcAAAW2DAAPR5AZMBHMABEHeDwAEQdcAQV/dcAQABFsABEIaBwAEQecAQVUpawAD1TADAAPWmAYvAARCOwBBX9xzAARCPg8ABEI7AEFf3XQEAAZQAwAD1nj4CTsABEKTAARCqAACAimDAAPXFARzAARC4gcABEKzAEFVKRAEAAYPAARC5wBBX9wDAAPUsScABEMUlwAEQz4TAARDJwBBYWWCT1D4BPRzAARD+gsABEPPAEFe4gLICAAKDwAEQ/8AQV/ccwAERBC6kfQEAARTAAREMwBBYWQQBYJPUAKYYAMAA9S0+AT0cwAEROoLAAREvwBBXuICyAgACg8ABETvAEFf3H8ABEUSQ5AEAARzAARFmLpuuAQABH8ABEXeTRQEAARzAARGMhMABEYbAEFhZIwAAAADAAPXTAACmXwAAwAD1LUrAARGzARzAARG6LqR8AgACgMABEcbAEFU1H8ABEdCP1QEAAYLAARHkwBBXuAAAphc/SsABEf0BHMABEgQum64BAAEfwAESFZNFAQABHMABEjgWwAESMYHAARIkwBBVSoC2wAD1AyMAAAAAwAD10wAApl8GpklswAESTcABEk3AASNfAACVQAAAAAEDwAESYsABI18AAAABAQHAARJ0AAAAg7Jgj3IAAGCTBQE+CU7AARKQwAESlwABgdNgjZ8BFsABEp6AwAESmcAQWdqB0495TsABErrAARLEAAFUYI8tARbAARLLgMABEsbAEFnaVI91TsABEuDAARLsAAGkpl3AAPUdAWCTBQEcwAES7i6kpwEAAYLAARMKwBBaEgCmXE7AARMgwAETJgABlP1dwAD1TgJgwAD2XWCTBQEcwAETKC6kqAEAAYLAARM/wBBaEgCmXUnAARNPFsABE1MupHSmDz4BSsABE3ABHMABE3cupHwCAAKAwAETjsAQWdofwAEToo+DAwACgcABE8LAEFnvHMABE8oupKoDAAODwAET38AQWjOEwAET7MAQWmEWwAET/YLAARPzwBBaEpUIjy8Apl4Bg+IpAKYXP0nAARQuHMABFD4WwAEUOYHA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AS7mFMABLuDAEGv+AAFgkzOAipMTQQEAAZMAwAD1nAamUWzAAS72wAEu+8ABL0AAAJYmAAAAAQPAAS8AwAEvQAAAAAEBAcABLwoAAACAimCTBQAAYMAA8rMBSsABLxQBIiXAAS8agMABLxTAEGz2YJMzABbAAS87FsABLzUUwAEvL8AQbPYAAWCTM4CKkxOWJsAA9b4GplJswAEvRcABL0rAATB/AACklAAAAAEDwAEvW8ABMH8AAAABAQHAAS9lAAAAhB9gkwUAAGDAAPKzAT4CTsABMAPAATAIAACCF2CSWQEcwAEwE4DAATAKwBBtbJYXAQABFsABMBsulkWl+ACTC0rAATAxASEiJcABMD+BwAEwOsAQbYNgkosAIRzAATBULqTYAQABFsABMHAUwAEwa8AQbYMBAWCSi5SUkpAAplMGplNswAEwhMABMInAATLRAACk2AAAAAEDwAEwn8ABMtEAAAABAQHAATCmAAAApKBgjM4AAGDAAPKzAT4FTsABMLjAATC/AACk2WDAAPKzARzAATDUFsABMMEupGWmAUQBAAGAwAEw1cAQbhoAwAD1YknAATDhIRzAATDsgcABMOXAEG4xQQEAASsAwAD10krAATD1AYHAATD8wBBuMT9GwAExCMABMTbAATEXAAAAhDBgjZ8AFsABMSqAwAExJMAQbhqUOYzjPgFJwAExPiIiIhzAATFRFsABMUyCwAExQsAQbpuCHI2iQQEAARrAATFijeUAwAD10gAcwAExjBbAATGHFsABMYKCwAExeMAQbpuAsI0XgLCSNUEBAAEnQQDAAPZsACEWwAExrILAATGiwBBum4PfjbIAIRbAATHPgsABMcXAEG6blNCNtT4BSsABMesBNQAAAAEAXcAA9U4CYIzOYMAA8rMBFsABMfIupGWmATUAAAABAGCMzgGAwAEyBsAQbho1AAAAAQBgwADyswEqNQAAAAEAXAEcwAEyBYPAATIFwBBvSICyAgAChMABMgXAEG9nhQDAEG96AMAA9WOFAMAQb3o/ScABMigcwAEyPBbAATIygMABMizAEG4alIaM3kEBAAErAJMBSsABMkUBKT9KwAEycAE1AAAAAQBdwAD1TgJgjM5gwADyswEWwAEydy6kZaYBNQAAAAEAYIzOAYDAATKLwBBuGjUAAAABAGDAAPKzARzAATKcLqTYAQABFsABMsMWwAEyuYDAATKzwBBuGpSGjN6UlJL7AKZTNQAAAAEAXAEcwAEyioLAATKKwBBv74CyAgACg8ABMorAEHAOhADAEHAhAMAA9WOEAMAQcCEGplRswAEy1sABMuPAATMtAACkiAAAAAEDwAEy88ABMy0AAAABAQHAATL5AAAAgIpgwADyswAAYJMjAUrAATMJASOAwAEzCcAQcLEWwAEzES6kZ6YDFsABMyAupGimBAFgkyMGplVswAEzMsABM0HAATS6AACkiQAAAAEDwAEzU8ABNLoAAAABAQHAATNbAAAAgIpgwADzKwAAYJMzAT4CScABM2gWwAEzbC6kdaYQPgFJwAEz7CIWwAEz9oDAATPwwBBxFKSLwAD1wQAhHsABNAPAAO5eAgACgMABNA3AEHEUHMABNBQoAAAAAAAAAACBVgAAAADAAPM+AD4CTsABNCnAATQrAABbYMAA9HkBHMABNDOAwAE0LcAQcRSkwQAAAADAAPW0ScABNEQcwAE0ToDAATRIwBBxFEEBAAEcwAE0U4HAATRRwBBxiKRMAAAAAMAA9bUAwAD1nErAATRfAR/AATRqpcgBAAGBwAE0gMAQcYgAPz8/SsABNJYBH8ABNKGTPQEAAYDAATSwwBBxFAAGplZswAE0v8ABNMTAATdeAACk0gAAAAEDwAE0zcABN14AAAACAgLAATTXAAAAhB9gkwUAwAE06gAAAIIXYJJZAABgwADyswE+A07AATT/wAE1DAAApNpgklkBHMABNReAwAE1DsAQckOWFwEAARbAATUfLpZFpfgAkwtJwAE1NRbAATU5LqR1phA+AknAATVWIhzAATVngsABNVrAEHJnQQEAARbAATV6FsABNWoulkWl+JUdofgAkl0AHMABNZSBwAE1j8AQclBBAQABFsABNacWwAE1ly6WRaX4lXih+gCSXT4BSsABNfgBKT9JwAE2FCIcwAE2JYLAATYYwBByZ0EBAAEWwAE2OBbAATYoLpZFpfiVeKH6AJJdABzAATZVgcABNlDAEHJQQQEAARbAATZoFsABNlgulkWl+JUdofgAkl0+Ak7AATaCwAE2iAAAgIpgwADzKwEWwAE2pybAATaUAIDAATaLwBByQ2CTM4CKkxNJwAE2tiIWwAE2wIPAATa6wBBzY6SLwAD1wQAcwAE20oPAATbMwBBzY0EBAAEcwAE224PAATbVwBBzY6SMAAAAAMAA80cAwAD1nD4BSsABNvsBKT8/P0rAATckARzAATc7FsABNysulkWl+JnTAgACgsABN0fAEHJngcABN1XAEHJQAKIeBqZXbMABN2PAATdswAE4kAAApJUAAAABA8ABN3vAATiQAAAAAwMDwAE3hQAAAIQfYJMFAMABN5gAAACCF2CSWQDAATenAAAAg7JgjBUAAGCTBQE+AknAATezIRzAATe4LqTSAgACgMABN8LAEHQ8gcABN8zAEHRJAKZWPgFKwAE32wEcwAE34i6BVQIAAoLAATf0wBB0VhzAATghGsABOASEBYTNAwADgMABOD7AEHQ8gcABOEjAEHRJHMABOFeAwAE4TsAQdDyWFwEAARbAAThfLpZFpfgAkwsAiK4AphU/SsABOH0BgMABOITAEHQ8BqZYbMABOJXAATikwAE5FwAApK0AAAABA8ABOLnAATkXAAAAAgICwAE4wwAAAIOyYIwVAMABONMAAABUYI8tAABdwAD1HQFgklkBPgFKwAE45AEcwAE46y6k1AIAAoDAATj9wBB1LBbAATkNgcABOQPAEHU5lQiPLwCmWgamWWzAATkcwAE5K8ABOaEAAKS7AAAAAQPAATlFwAE5oQAAAAICAsABOU8AAACDsmCMFQDAATlfAAAAghdgkvYAAF3AAPUdAWCSWQE+AUrAATlrARzAATlyLqTUAgACgMABOYTAEHWoFsABOY+BwAE5isAQdbWSRJL5AKZaBqZabMABOabAATm1wAE67wAApNQAAAABA8ABOcbAATrvAAAAAgICwAE50AAAAIOyYIwVAMABOeUAAACVCF3AAPUdAWCSWQAAXcAA9R0BYJJZAT4BSsABOrABHMABOuMcwAE6vYHAATq3wBB2MoCfAQFgklkBNMABOsEDwAE6wcABOuEAAAABAQHAATrCAAAAg1xgklkAAGCSWQFKwAE6yAEcwAE6yC6kigIAAoDAATrZwBB2JYLAATrfwBB2hwCmWwDAAPTmgKEAAAAAwAD08QamW2zAATr0wAE6/cABO/gAAKSKAAAAAQPAATsNwAE7+AAAAAICAsABOxcAAACDsmCMFQDAATsmAAAAghdgklkAAGCSWQE+A07AATs4wAE7PwABgRBgklkBHMABO0UWwAE7QS6TWqYHpNsBAAGB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PRzAAEUdLp1oAgACgMAARTDAENXsJMAARXMFJ6VXgMAARU/AENXsJ6VYFsAARWmAwABFZMAQ1eySUYwbJ4DyAKb8PwanKnDAAEWDwABFj8AARj8AAJYMARrAAEWEwADuSwAAAQPAAEWkwABGPwAAAAEBAcAARa0AAACDsmCMqQAAWwE+AUnAAEW5IRzAAEXHFsAARb4ulDem7ILQAQABgMAARdDAENabAMAA9ho+AT0cwABF3y6daAIAAoDAAEXywBDWmyTAAEY0BSelV4DAAEYRwBDWmyelWBbAAEYrgMAARibAENabklGMGyeC+wCm/D8GpytwwABGRMAARlDAAEhrAACWEAEawABGRcAA7ksAAAEDwABGZsAASGsAAAABAQHAAEZ5AAAAg7JgktMAAFsBPgNOwABGicAARpMAAIDPYJLhARbAAEaagMAARpXAENdKgM+S1UnAAEapIRzAAEbEFsAARq4upQim7YLQAQABgcAARs3AENddAMAA9ho+AT0cwABG4S6daAIAAhbAAEb0LqUNpvYkAAYnpSOBwABHH8AQ110npVknpVoWwABHaIHAAEdewBDXXZJRjBsngPIApvw/ScAAR38iJcAAR5QWwABHjYHAAEeDwBDXXZJRjBtgjM4AIRbAAEehLqUKpvA+AT0cwABHyC6daAIAAhbAAEfbLqUNpvYkAAYnpSOBwABIBsAQ110npVsnpVwWwABIVoHAAEhMwBDXXZJRjBsngPIApvw/BqcscMAASHDAAEh8wABJ8wAAlfwBGsAASHHAAO5LAAABA8AASI7AAEnzAAAAAQEBwABInQAAAIOyYJKLAABbAT4CPRzAAEiugMAASKnAENiPlA8BAAEuAJKXScAASMchHMAASOUWwABI3hbAAEjQgMAASMvAENiPkkSSjlrAAPVMQQEAARbAAEkGFsAASPcWwABI7YDAAEjowBDYj5SUkpCSXozdWsAA9UwAwAD1nD4BPRzAAEkWLp1oAgACFsAASSkupQ2m9iQACCelXYDAAElJwBDYjyelXhbAAElsFsAASV6AwABJWcAQ2I+SRJKOWsAA9UwnpV8ngQEWwABJ1BbAAEnFFsAASbuAwABJtsAQ2I+UlJKQkl6M3VrAAPVMJ6VgAKb8PwanLXDAAEn4wABKBMAAS60AAJYLARrAAEn5wADuSwAAAQPAAEoUwABLrQAAAAEBAcAASiEAAACDsmCStQAAWwE+Az0cwABKLS6lKQEAARbAAEo/gMAASjrAENm2lgqSugCnDD0cwABKVoDAAEpRwBDZtpQPAQABLgCSwUnAAEpvIRzAAEqNFsAASoYWwABKeIDAAEpzwBDZtpJEkrhawAD1TEEBAAEWwABKsBbAAEqhFsAASpWAwABKkMAQ2baWCpK6kl6MrlrAAPVMAMAA9Zw+AT0cwABKwC6daAIAAhbAAErTLqUNpvYkAAgnpWGAwABK/8AQ2bYnpV4WwABLIhbAAEsUgMAASw/AENm2kkSSuFrAAPVMJ6ViJ4EBFsAAS44WwABLfxbAAEtzgMAAS27AENm2lgqSupJejK5awAD1TCelYACm/D8AABCsMwAQrI4AEKzXABCtGAAQraoAEK6cABCu2QAQrxEAEK/aABCwTwAQsL8AELGMABCyBgAQsugAELNiABC0mwAQtOsAELV7ABC3vQAQuBcAELnOABC6LwAQvCsAELz8ABC+MQAQv3MAEMAbABDCGQAQwloAEMKbABDC3AAQwx0AEMSNABDE/wAQxVkAEMchABDHhAAQx+cAEMkNABDKHAAQy1QAEM1jABDOdQAQz4UAENATABDQ/AAQ03cAENT5ABDVvAAQ1msAENcaABDYXwAQ2YYAENrOAAAANQKnMHDAAEuywABLuMAATgkDpWMAAAFdoRIBWwAAAQSnMnDAAExKwABMUBiSUQBgjBUAAQWnN3DAAExVwABMVcAATHcAAAADwABMaMAATHcAAAABAAHAAExvAAAEklFgjBUBKwBgpzABPwIIAacygADAENwACQHAAExVoUgAAAAAAganNHDAAEvgwABL7MAATDwAAaUOAAAAAQPAAEvxwABMPAAAAAEBAcAAS/sAAACDsmCMFQAAXAE+AT0cwABMDIDAAEwHwBDcU5QOAQABH8AATBenNwEAARbAAEwwgMAATCvAENxTklGMGwAAjB4GpzVwwABMfMAATHzAAE4HAACWfAAAAAEDwABMi8AATgcAAAABAQHAAEyVAAAAg7JgjBUAAFsBPgVJwABMoSEcwABMsRbAAEyqgMAATKXAENzAklGMG0EBAAEWwABMtC6SUacyAMAA9dI+AT0wwABMxB/AAEzOptwDAAMWwABM6y6SUacygMAATP3AENzAJAAJJ6VkFsAA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FsAARtQughGnpYXAAEbbwBD5UwCpOj0XwABG9C6lmyMWwABHCy6lrqeoNQAAAAEAYJJZAYHAAEcbwBD4KCMcwABHJIYAwBEAg0EBAAErAAAgwABHLZJ2AAAAAIYAwBEAgwFgklmFwABHPsAQ+VMBYJJZqTFKwABHUAEfwABHW6nOAQABhMAAR33AEPlHAAAAEPV3ABD17QAQ9/oAEQDmAAAAAwKnsnLAAEfswABH+8AATE0HpdUAAAFgp6EAAAIEp7RywABIosAASKoJhDwAYI5jAASntXLAAEjwwABI9wmEPQBgwADyswABBae8csAASPzAAEj8wABJbACAqKdXAAPAAEkjwABJbAAAAAMDA8AASTAAAASEPGCOYwDAAElFAAAApatgjmMAwABJTwAABIQ9YMAA8rMAAGCnsgE/AwgBp7SAAMARAWcIAae1ggDAEQGBCQDAAElmp7EBAAGBwABJaMARAXQAAganuHLAAElxwABJisAASkYAAKWwp1cBGsAASXLAAO5LAAABA8AASZvAAEpGAAAAAAAAAF3AAPUdAWDAAPZdAT4ETsAASajAAEmuAACUNl3AAPUdAWDAAPZdAR3AAEm2pbCnVwAAAACnrUnAAEnPIRzAAEncFsAASdMuhDyntEEBAAErAMAA9dI9HMAASeuAwABJ5cARAgNPAQABJMAASgMCJ6XWFsAASfouhDyntADAAPUuP0nAAEoKFsAASg4uhD2ntT0cwABKHYDAAEoXwBECA08BAAEnpdcAwAD1Lj9KwABKNgGAwABKPcARAgMGp7lywABKS8AASlTAAExLAACl2KdXAAAAAQPAAEpiwABMSwAAAAEBAcAASnYAAAClu2CpWgAAYJJZAT4BScAASoYhHMAASpMWwABKii6EPKe0QQEAASsAwAD10j4EPRzAAEqtgMAASqTAEQLYpcgDAAMWwABKvS6EPKe0IMAASs2nTQAAAAApAKlfTsAASu3AAEr6AACVG2CSWQEewABK/KdZAgACFsAASwwuhDyntIDAAEsWwBEC2AA9HMAASycupdCnVwMAA4DAAEs1wBEC2BbAAEs/LoQ8p7SBwABLScARAzsAqTpKwABLXgGBwABLZcARAztJwABLfhbAAEuCLoQ9p7U+AUrAAEuTARzAAEuyFsAAS6OAwABLmsARAtil2cAASr+VDQIAAhbAAEvagMAAS9HAEQLYlG7AAErCFsAATAoWwABMABbAAEv2FsAAS+2AwABL5MARAtiUbsAASsKUlJKQlIaM3pSUkvsAmBc+AUrAAEwpARbAAEw5gMAATDDAEQLYlG7AAErCAAARAcEAEQKvABEEPAAAAAICp71ywABMusAATMDAAE4FA6XaAAABYJGsAAFgqOQAAQWnw3LAAE0cwABNHMAATVUAAAADwABNMsAATVUAAAABAQHAAE0+AAAAgdNgkZ4AAGCnvQE/AQkAwABNSJG1AQABgMAATU7AEQSPAAIGp79ywABNWsAATXHAAE2JAQClnQAAAAEDwABNgMAATYkAAAAAAAAAYKkGAUrAAE2DASbAAE2DARbAAE2DLoHTka5gqQYGp8FywABNjsAATZ/AAE4DAAClkQEawABNj8AA7ksAAAEDwABNrsAATgMAAAABAQHAAE3AAAAAlolgqeYAAFwBPgFKwABNzwEcwABN3oDAAE3WwBEFLqXbAQABLgCp/gAAEQS5ABEE/gARBV0AAAACAqfEcsAATkjAAE5OwABP0AOl3AAAAWCQ5QABYKfbAQSnxnLAAE6bwABOpxilmwBgklkBKwEFp8xywABOrMAATqzAAE8OAAAAA8AATsHAAE8OAAAAAgICwABO1gAAAJJLYJICAMAATusAAACSTGCOYwAAYKfEAT8BCQDAAE75kPACAAKAwABO/8ARBcWBwABPCcARBdIAAganyHLAAE8TwABPIsAATzIBAKWQAAAAAQPAAE8rwABPMgAAAAAAAABgjmMBSsAATy4BFsAATy4ukkyQ6AanynLAAE83wABPSMAAT84AAKWRARrAAE84wADuSwAAAQPAAE9XwABPzgAAAAICAsAAT2kAAACWiWCp5gDAAE97AAAApaNgklkAAFwBPgFKwABPjgEcwABPnYDAAE+VwBEGcaXdAgACLoHAAE++wBEGfgCp/wAAEQYFABEGQQARBrYAAAACAqfNcsAAUBXAAFAbwABRRgOl3gAAAWCRbQABYKjkAAEFp9NywABQW8AAUFvAAFCkAAAAA8AAUGXAAFCkAAAAAgICwABQcAAAAJJMYJETAMAAUIEAAACVT2COYwAAYKfNAT8BCQDAAFCOkXcCAAKAwABQlMARBwmBwABQmsARBxYAAganz3LAAFCpwABQuMAAUNYBAKWUAAAA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hRbAAK1/LpXCkZaTIAABYKkGAADAAPUrBqkScsAArZDAAK2hwACuBgAApZEBGsAArZHAAO5LAAABA8AArbDAAK4GAAAAAQEBwACtwgAAAJaJYKnmAABcAT4BSsAArdEBHMAAreCAwACt2MARQ2ymTgEAAS4AqjcAABFCrAARQugAEUM8ABFDmwAAAAMCqRVywACuMsAArjjAAK90A6ZPAAABYJBeAAFgp9sBBKkXcsAArpPAAK6fGKWbAGCSWQErAQWpG3LAAK6kwACupMAArtYAAAADwACuucAArtYAAAABAQHAAK7BAAAAgIpgwAD2XQAAYKkVAT8BCQDAAK7KkGgBAAGAwACu0MARRAcAAQapGXLAAK7bwACu7MAAr3IAAKWRARrAAK7cwADuSwAAAQPAAK77wACvcgAAAAICAsAArw0AAACWiWCp5gDAAK8fAAAApaNgklkAAFwBPgFKwACvMgEcwACvQYDAAK85wBFEY6ZQAgACLoHAAK9iwBFEcACqOAAAEUQzABFEqAAAAAECqRxywACwV8AAsF3AALJRA6ZRAAABYKkvAAACBKkecsAAsLfAALDCCZhQAGCNEwAEqR9ywACw1sAAsN8JVABgjy0AAQWpJnLAALDkwACw5MAAsWsAgKinVwADwACxCsAAsWsAAAADAwPAALEkAAAApbFgjmMAwACxNAAABJhQYI0TAMAAsUYAAARUYI8tAABgqRwBPwMIAakegQDAEUUrCAGpH4IAwBFFOAkAwACxX6lAAQABgMAAsWHAEUUeAAIGqSFywACxcMAAsYbAALGkAQCl6AAAAAEDwACxmMAAsaQAAAAAAAAAYKdnAUrAALGbASbAALGbARbAALGbLlSpH2CnZwapI3LAALGpwACxusAAsk8AAKWRARrAALGqwADuSwAAAQPAALHJwACyTwAAAAICAsAAsdsAAACWiWCp5gDAALHtAAAApaNgklkAAFwBPgFKwACyAAEcwACyD4DAALIHwBFF6aZSAgACLoHAALI/wBFF9gCqOQAAEUV1ABFFuQARRi4AAAACAqkncsAAssTAALLKwAC0IwOmUwAAAWCpLwAAAQSpKXLAALMYwACzIgmSRwBgjmMAAQWpLnLAALMnwACzJ8AAs4YAgKinVwADwACzPcAAs4YAAAACAgLAALNQAAAApbFgjmMAwACzYAAA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ANKtwADXjgAAAAEBAcAA0rgAAACSUGCREwAAXAE+AknAANNSIRbAANNXLoRGwABKvkAhHMAA03EWwADTai6lvsAASsVBAQABKwDAAPXSwADTasAA03gAP0nAANOAJcAA046AwADThMARWElgqOQ+AUrAANTuARzAANT/FMAA1PXAEVhJAAFgqOSlkQEAAR/AANUTqk0BAAEuAACo5knAANU3JcAA1UWAwADVO8ARWElgkYU+AUrAANVgARzAANVxFMAA1WfAEVhJAAFgkYWVEAIAAh/AANV9qk0BAAEuACsAkY5JwADVpyXAANW1gMAA1avAEVhJYJFOPgFKwADV0gEcwADV4xTAANXZwBFYSQABYJFOlRACAAIfwADV76pNAQABLgArAJFTScAA1hklwADWJ4DAANYdwBFYSWCRWD4BSsAA1kIBHMAA1lMUwADWScARWEkAAWCRWJUQAgACH8AA1l+qTQEAAS4AKwCRXT4AAAARU78AEVQbABFWkgARV0MAEVgZABFZrQAAAAUCqWVywADXk8AA15nAANjJA6ZtAAABYJBpAAFgp9sBBKlncsAA1+zAANf4GKWbAGCSWQErAQWpa3LAANf9wADX/cAA2C0AAAADwADYEMAA2C0AAAABAQHAANgaAAAAghdgklkAAGCpZQE/AQkAwADYIpBzAQABgMAA2CjAEVohAAEGqWlywADYMsAA2EPAANjHAAClkQEawADYM8AA7ksAAAEDwADYUsAA2McAAAACAgLAANhkAAAAlolgqeYAwADYdgAAAKWjYJJZAABcAT4BSsAA2IkBHMAA2JiAwADYkMARWnumbgIAAi6BwADYt8ARWogAqkEAABFaSwARWsAAAAABAqlscsAA2SfAANktwADh5wOmbwAAAWDAAEszAAAAAQWpdXLAANldwADZXcAA2dEApmYAA8AA2XfAANnRAAAAAQEBwADZjgAAAKQiYMAAS8oAAGCpbAE/AQkAwADZs8AAS1sBAAGAwADZu8ARWw8ABgapbnLAANnWwADZ5sAA24sAAKZwARrAANnXwADuSwAAAQPAANoFwADbiwAAAAEBAcAA2hoAAACSS2CSAgAAYMAA9HkBPgFJwADaKiXAANo3gMAA2i7AEVttYKl8PgFKwADaXwEWwADabxTAANpmwBFbbQABYKl8pnGnV6mBPgFKwADbeQGTBqlvcsAA25DAANuhwADciwAApnIBGsAA25HAAO5LAAABA8AA27XAANyLAAAAAQEBwADbygAAAJJLYJICAABgwADyswE+A0AlwADb6oDAANvhwBFb82CpfMAA2+HAANwIAE7AANwrwADcRQAApnNgqXwBJsAA3CsBgMAA3EfAEVvzYKl8SsAA3FUBIRbAANx3gcAA3F3AEVwlpnSnV6mEBqlwcsAA3JDAANyhwADc7QAApnUBGsAA3JHAAO5LAAABA8AA3LDAANztAAAAAgICwADcvAAAAIFmYI5jAMAA3MoAAACB2mCOYwAAYMAA8rMBPgFKwADc0wEewADc2sAA7l4CAAKAwADc5MARXJKBwADc58ARXJ8ABqlxcsAA3PLAAN0DwADejgAApnYBGsAA3PPAAO5LAAABA8AA3R3AAN6OAAAAAQEBwADdMgAAAJJLYJICAABcAT4BScAA3UIlwADdT4DAAN1GwBFdCmCpfD4BPRfAAN2AFMAA3XfAEV0KAAFgqXymd6dXKamDPgAGqXJywADek8AA3qTAAOAxAACmeAEawADelMAA7ksAAAEDwADev8AA4DEAAAABAQHAAN7UAAAAkktgkgIAAFwBPgFJwADe5CXAAN7xgMAA3ujAEV2BYKl8PgE9F8AA3yIUwADfGcARXYEAAWCpfKZ5p1cpqYI+AAapc3LAAOA2wADgR8AA4eUAAKZ6ARrAAOA3wADuSwAAAQPAAOBhwADh5QAAAAEBAcAA4HYAAACSS2CSAgAAYMAA8rMBPgFJwADghiXAAOCTgMAA4IrAEV34YKl8PgFKwADguwEWwADgyxTAAODCwBFd+AABYKl8pnenV6mDPgFKwADh0AEpAAARWz0AEVvDABFcYgARXNoAEV1RABFdyAARXk4AAAAGAql2csAA4erAAOHwwADjDwOmewAAAWCnoQAAAAEFqXtywADiMcAA4jHAAOJsAICop1cAA8AA4k3AAOJsAAAAAQEBwADiWQAAAKWrYI5jAABgqXYBPwEJAMAA4mansQEAAYDAAOJowBFesQABBql4csAA4nHAAOKCwADjDQAApZEBGsAA4nLAAO5LAAABA8AA4pHAAOMNAAAAAgICwADiowAAAJaJYKnmAMAA4rUAAAClo2CSWQAAXAE+AUrAAOLIARzAAOLXgMAA4s/AEV8LpnwCAAIugcAA4v3AEV8YAKpCAAARXtsAEV9QAAAAAQKpfHLAAONhwADjZ8AA7dQDnpMAAAFgkgIAAWCo5AYEqX5ywADjz8AA4+AJpn0AYMAA8rMABKmAcsAA4/DAAOQACaZ+p1cAYMAA8rMABKmBcsAA5HzAAOSRCaZxp1cAYMAA9HkABKmCcsAA5ZrAAOWzGKZ5p1cAYMAA8rMBKgSpg3LAAOXxwADmCRimd6dXAGDAAPKzASoEqYRywADmTcAA5l0JpnSnVwBgwADyswADBamMcsAA5mLAAOZiwADo4wAAAAPAAOZ9wADo4wAAAAoCAsAA5oUAAACAsGDAAPZdAMAA5pAAAASmcWDAAPR5AAjAAOazAAAEpn1gwADyswEqwADm3gAAAJJFYI5jASvAAOb6AAAAghdgklkBK8AA5wsAAACD4GDAAPKzASrAAOcmAAAAg+JgwADyswEqwADnQQAAAJXjYMAA8rMBKsAA52IAAACD5WDAAPKzASrAAOeBAAAApn9gwADyswEqYKl8AT8FCAGpgYEAwBFgPggBqX6CAMARYE4IAKmAHMAA57qEwADntcARYGxBAQABKwCSXQgAqYQUwADn3sARYLoJAAkAwADn95IlBwABgMAA5/3AEWAvBpJFg8AA6BzAEWBeghc1AAAAAQBgklkBhMAA6DvAEWBsIxzAAOhAFADAEWEwCgBBAQABKwAAIMAA6EmSdgAAAAAUAMARYTAKAAFgklmD4IXAAOhtwBFgeoPihsAA6IvAEWCKleOHwADor8ARYJqD5RTAAOjXwBFgqggABamNcsAA6OjAAOjowADp0wCmgAADwADpDcAA6dMAAAACAgLAAOkgAAAAkkVgjmMAwADpMgAABKZxYMAA9HkAAGCpfAE/BQgBqYGBAMARYcwIAKl+KggAqYAqCACphCoJAMAA6b6SJgEAAYDAAOnHwBFhvwAFqY5ywADp2MAA6djAAOrBAJXkAAPAAOn8wADqwQAAAAICAsAA6g8AAACSRWCOYwDAAOohAAAEpnFgwAD0eQAAYKl8AT8FCAGpgYEAwBFiQAgAqX4qCACpgCkIAKmEKgkAwADqrJImAQABgMAA6rXAEWIzAAQGqYZywADqxsAA6tXAAOr3AQCmgQAAAAEDwADq6cAA6vcAAAAAAAAAYI5jAUrAAOrsARbAAOrsLpJFkgoGqYhywADq/MAA6w3AAOt2AAClkQEawADq/cAA7ksAAAEDwADrHMAA63YAAAABAQHAAOsuAAAAlolgqeYAAFwBPgFKwADrPQEcwADrTIDAAOtEwBFi8aaCAQABLgCqQwapiXLAAOw7wADsR8AA7KEAAaXwAAAAAQPAAOxYwADsoQAAAAEBAcAA7HUAAACSS2CpfAAAYMAA8rMBSsAA7IgBFsAA7JGAwADsiMARY0emfqdXqYAGqYpywADtbsAA7XrAAO3SAAGmfwAAAAEDwADticAA7dIAAAABAQHAAO2mAAAAkktgqXwAAGDAAPKzAUrAAO25ARbAAO3CgMAA7bnAEWOcpnSnV6mEAAARYoUAEWLBABFjIAARY3UAEWPKAAAABAKpj3LAAO4wwADuNsAA79UDpoMAAAFgqS8AAAEEqZFywADumcAA7qoJpgAAYKdnAAEFqZZywADur8AA7q/AAO8qAICop1cAA8AA7tPAAO8qAAAAAgICwADu7QAAAKWxYI5jAMAA7v0AAASmAGCnZwAAYKmPAT8CCAGpkYEAwBFkRgkAwADvHqlAAQABgMAA7yDAEWQ5AAEGqZNywADvL8AA70DAAO/TAAClkQEawADvMMAA7ksAAAEDwADvT8AA79MAAAACAgLAAO9hAAAAlolgqeYAwADvcwAAAKWjYJJZAABcAT4BSsAA74YBHMAA75WAwADvjcARZKqmhAIAAi6BwADvw8ARZLcAqkQAABFkegARZO8AAAABAqmXcsAA8DbAAPA8wADx6AOmhQAAAWCpLwAAAgSpmXLAAPCUwADwngmmhgBgwADyswAEqZpywADws8AA8LYJpasAYI5jAAEFqZ9ywADwu8AA8LvAAPE7AICop1cAA8AA8OHAAPE7AAAAAwMDwADw+wAAAKWxYI5jAMAA8QsAAASmhmDAAPKzAMAA8RwAAASlq2COYwAAYKmXAT8DCAGpmYEAwBFldQgBqZqCAMARZYQJAMAA8S+pQAEAAYDAAPExwBFlaAABBqmccsAA8UDAAPFRwADx5gAApZEBGsAA8UHAAO5LAAABA8AA8WDAAPHmAAAAAgICwADxcgAAAJaJYKnmAMAA8YQAAAClo2CSWQAAXAE+AUrAAPGXARzAAPGmgMAA8Z7AEWXypocCAAIugcAA8dbAEWX/AKpFAAARZcIAEWY3AAAAAQKpoHLAAPI6wADyQMAA8+gDpogAAAFgjnYAAWCn2wMEqaJywADyk8AA8p8YpZsAYJJZASsEqaRywADyvMAA8sEJpomnVwBgwABLXgAEqaVywADy38AA8uUJpoqnVwBgwABLbwABBampcsAA8urAAPLqwADzTAAAAAPAAPL9wADzTAAAAAMDA8AA8xIAAACSS2CSAgDAAPMhAAAEpolgwABLXgDAAPMtAAAEpopgwABLbwAAYKmgAT8DCAGppIEAwBFm2AgBqaWCAMARZucJAMAA8z2OgQEAAYDAAPNDwBFmywABBqmncsAA81HAAPNiwADz5gAApZEBGsAA81LAAO5LAAABA8AA83HAAPPmAAAAAgICwADzgwAAAJaJYKnmAMAA85UAAAClo2CSWQAAXAE+AUrAAPOoARzAAPO3gMAA86/AEWdXposCAAIugcAA89bAEWdkAKpGAAARZycAEWecAAAAAQKpqnLAAPQwwAD0NsAA9W0DpowAAAFgkWIAAWCo5AABBamwcsAA9HzAAPR8wAD0yAAAAAPAAPSJwAD0yAAAAAICAsAA9JUAAACVT2COYwDAAPSqAAAAkkxgkRMAAGCpqgE/AQkAwAD0spFsAgACgMAA9LjAEWfrgcAA9MPAEWf4AAIGqaxywAD0zcAA9NzAAPT6AQCllAAAAAEDwAD07sAA9PoAAAAAAAAAYI5jAUrAAPTxARbAAPTxLpVPkWQGqa5ywAD0/8AA9RDAAPVrAAClkQEawAD1AMAA7ksAAAEDwAD1H8AA9WsAAAABAQHAAPUxAAAAlolgqeYAAFwBPgFKwAD1QAEcwAD1T4DAAPVHwBFol6aNAQABLgCqRwAAEWgrABFoZwARaMYAAAACAqmxcsAA9brAAPXAwAD3DQOmjgAAAWCR7wABYKjkAAEFqbdywAD2BsAA9gbAAPZwAAAAA8AA9hPAAPZwAAAAAgICwAD2GQAAAJXcYMAA8rMAwAD2MQAAAJJHYI5jAABgqbEBPwEJAMAA9kWSAQIAAYHAAPZLwBFpKAGV3IDAAPZkwBFpGQIGqbNywAD2dcAA9oTAAPaaAQClkAAAAAEDwAD2jcAA9poAAAAAAAAAYI5jAUrAAPaQARbAAPaQLpJHkfEGqbVywAD2n8AA9rDAAPcLAAClkQEawAD2oMAA7ksAAAEDwAD2v8AA9wsAAAABAQHAAPbRAAAAlolgqeYAAFwBPgFKwAD24AEcwAD274DAAPbnwBFpyaaPAQABLgCqSAAAEWldABFpmQARafgAAAACAqm4csAA91bAAPdcwAD5AAOmkAAAAWCQ/QABYKfbAgSpunLAAPe2wAD3vwlUAGCPLQAEqbtywAD3zcAA99kYpZsAYJJZASsBBanBcsAA997AAPfewAD4KwAAAAPAAPfxwAD4KwAAAAICAsAA+AQAAACUV2CMdQDAAPgRAAAEVGCPLQAAYKm4AT8CCAGpuoEAwBFqgAkAwAD4HpEHAQABgMAA+CTAEWpzAAIGqb1ywAD4MMAA+EbAAPhkAQCl6AAAAAEDwAD4WMAA+GQAAAAAAAAAYKdnAUrAAPhbASbAAPhbARbAAPhbLlSpumCnZwapv3LAAPhpwAD4esAA+P4AAKWRARrAAPhqwADuSwAAAQPAAPiJwAD4/gAAAAICAsAA+JsAAACWiWCp5gDAAPitAAAApaNgklkAAFwBPgFKwAD4wAEcwAD4z4DAAPjHwBFrJ6aRAgACLoHAAPjuwBFrNACqSQAAEWqzABFq9wARa2wAAAACAqnCcsAA+VPAAPlZwAD61QOmkgAAAWCPDAABYKfbAgSpxHLAAPnEwAD5ygmUVwBgjHUABKnFcsAA+djAAPnkGKWbAGCSWQErAQWpyXLAAPnpwAD56cAA+jIAAAADwAD6A8AA+jIAAAACAgLAAPoJAAAElFdgjHUAwAD6GwAAAIHTYI2fAABgqcIBPwIIAanEgADAEWvoCQDAAPoljxoBAAGBwAD6K8ARa/UAAQapx3LAAPo3wAD6SMAA+tMAAKWRARrAAPo4wADuSwAAAQPAAPpXwAD60wAAAAICAsAA+mkAAACWiWCp5gDAAPp7AAAApaNgklkAAFwBPgFKwAD6jgEcwAD6nYDAAPqVwBFsWaaTAgACLoHAAPrDwBFsZgCqSgAAEWwpABFsngAAAAECqcpywAD7EMAA+xbAAPwGA6aUAAABYMAA9cUAAAEEqcxywAD7x8AA+88JpawAYI2fAAEFqc5ywAD71MAA+9TAAPwEAAAAA8AA+/XAAPwEAAAAAQEBwAD7+wAABKWsYI2fAABgqcoBPwIIAanMgADAEW0ACQHAAPvUwAD12wAAAAAAAAARbS0AAAAAAqnPcsAA/AnAAPwPwAD9aAOmlQAAAWCOYwAAAAEFqdcAAAAABAAAAwAAAAAAAAAAAGCpzwE/AQkBAI5qAAAAAAUGqdFywAD8OcAA/DnAAPxlAACUDgAAAAEDwAD8P8AA/GUAAAABAQHAAPxAAAAAgNRdoBUBWwAAWwFKwAD8RgEewAD8RpmBAwADJ5QOHMAA/FyUgVYAAAAAwAD0nCsABqnScsAA/GrAAPxqwAD8nQAAlRAAAAABA8AA/HHAAPydAAAAAgICwAD8cgAAAIDUXaFWAltbAMAA/HUAAACVEVsAAFsBSsAA/H0BHsAA/H2ZgQMAAyeVEBzAAPyUlIFWAAAAAMAA9JwrAAap03LAAPyiwAD8osAA/OAAAJUHAAAAAQPAAPyvwAD84AAAAAEBAcAA/LAAAACVCGCh6gAAYJJZAUrAAPy6ASbAAPy6AR7AAPy6mYEDAAMnlQccwAD815SBVgAAAADAAPScKwBgklkGqdRywAD85cAA/OXAAP0nAACUFAAAAAEDwAD89sAA/ScAAAABAQHAAPz3AAAAgNRgoU4AAFsBSsAA/P0BHsAA/P2ZgQMAAyeUFBzAAP0elIFWAAAAAMAA9JwrAAap1XLAAP0swAD9LMAA/WYAAJQPAAAAAQPAAP05wAD9ZgAAAAEBAcAA/ToAAACA1F2hEgFbAABcAUrAAP1AAR7AAP1AmYEDAAMnlA8cwAD9XZSBVgAAAADAAPScKwAAABFtdwARbdUAEW4/ABFupgARbwIAEW9gAAAABQKp2HLAAP1rwAD9ccABBdgDppYAAAFgwAD1xQAAAAEFqeUAAAAABAAAAwAAAAAAAAAAAGCp2AE/AQkBAMAA9dsAAAAACgap2nLAAP2GwAD9mMAA/mUAAaaXAAAAAQPAAP2twAD+ZQAAAAIBAcAA/bkAAAClq2COYwABwAD9yQAAAKYJYMAA9HkBHMAA/duUgVYAAAAAwAD0nGCOYwE+AUrAAP3mATXAAP3xAAABAGCoOQEfwAD98ahAAgABgMAA/g3AEW/pAaYJgcAA/izAEW/3NQAAAAEAWwEXwAD+RoLAAP5EwBFwI5QTFsAA/leAwAD+U8ARb+mUE4wcjByCAMARcCMGqdtywAD+asAA/nzAAP9nAAGmmAAAAAEDwAD+j8AA/2cAAAAEAwPAAP6iAAAAhDxgjmMAwAD+twAAACdgjmMAwAD+yQAAAKWrYI5jAAHAAP7aAAAAhD1gwADyswEqYI5jAT4BSsAA/vEBNcAA/vwAAAEAYKhBAR/AAP78qEsEAAOAwAD/FsARcKeBwAD/IMARcLSCwAD/J8ARcMABhD2DwAD/NcARcM41AAAAAQBbARfAAP9GhMAA/0TAEXDrlBMWwAD/WYHAAP9TwBFwtJQTjByMHIQAwBFw6wap3HLAAP9swAD/fsABAH0AAaaZAAAAAQPAAP+ewAEAfQAAAAMDA8AA/7gAAAClsWCOYwDAAP/KAAAAmFBgjRMAwAD/4QAAAFRgjy0AAGCOYwE+AUrAAP/yATXAAP/9AAABAGCpHAEfwAD//akmAwADgMABAC3AEXGBgcABADjAEXGOgsABAEXAEXGbADUAAAABAFsBF8ABAFiDwAEAVsARcbWUExbAAQBvgMABAGXAEXGBlBOMHIwcgwDAEXG1BqndcsABAILAAQCUwAEBRQABppoAAAABA8ABAKTAAQFFAAAAAgICwAEAtwAAAKWxYI5jAMABAM0AAACSR2COYwAAYI5jAT4BSsABAN8BNcABAOoAAAEAYKknAR/AAQDqqS4CAAKAwAEBAcARckCBwAEBDMARck0ANQAAAAEAWwEXwAEBIILAAQEewBFyaJQTFsABATeAwAEBLcARckCUE4wcjByCAMARcmgGqd5ywAEBSsABAVzAAQIrAAGmmwAAAAEDwAEBcsABAisAAAADAgLAAQF+AAAAhDxgjmMAwAEBkwAAAKWrYI5jAAHAAQGkAAAAhD1gwADyswEqYI5jAT4BSsABAbsBNcABAcYAAAEAYKjJAR/AAQHGqNMDAAKAwAEB48ARcuqBwAEB7cARcvcBhD2CwAEB+8ARcwU1AAAAAQBbARfAAQIMg8ABAgrAEXMilBMWwAECHYHAAQIZwBFy95QTjByMHIMAwBFzIgap33LAAQIwwAECQsABArgAAaacAAAAAQPAAQJWwAECuAAAAAEBAcABAmIAAAClq2COYwAAYI5jAT4BSsABAm0BNcABAngAAAEAYKjpAR/AAQJ4qO4BAAGAwAECk8ARc68ANQAAAAEAWwEXwAECmYHAAQKXwBFzypQTFsABAqqAwAECpsARc6+UE4wcjByBAMARc8oGqeBywAECvcABAs/AAQNkAAGmnQAAAAEDwAEC5sABA2QAAAABAQHAAQLyAAAApbFgjmMAAGCOYwE+AUrAAQMDATXAAQMOAAABAGCpLwEfwAEDDqlAAQABgMABAyzAEXRDADUAAAABAFsBF8ABAz+BwAEDPcARdF6UExbAAQNWgMABA0zAEXRDlBOMHIwcgQDAEXReBqnhcsABA2nAAQN7wAEERQABpp4AAAABA8ABA5nAAQRFAAAAAgICwAEDrAAAAKWxYI5jAMABA8EAAABUYI8tAABgjmMBPgFKwAED0gE1wAED3QAAAQBgqY8BH8ABA92plgIAAoDAAQQCwBF01ybAAQQNAYHAAQQNwBF05GCnZwA1AAAAAQBbARfAAQQggsABBB7AEXT+lBMWwAEEN4DAAQQtwBF015QTjByMHIIAwBF0/gap4nLAAQRKwAEEXMABBUUAAaafAAAAAQPAAQR8wAEFRQAAAAMDA8ABBI8AAAClsWCOYwDAAQSfAAAApoZgwADyswDAAQS2AAAApatgjmMAAGCOYwE+AUrAAQTBATXAAQTMAAABAGCplwEfwAEEzKmfAwADgMABBPzAEXWJgcABBQfAEXWWgsABBRPAEXWlADUAAAABAFsBF8ABBSCDwAEFHsARdcCUExbAAQU3gMABBS3AEXWJlBOMHIwcgwDAEXXABqnjcsABBUrAAQVcwAEF1gABpqAAAAABA8ABBXLAAQXWAAAAAQEBwAEFfgAAAKWrYI5jAABgjmMBPgFKwAEFiQE1wAEFlAAAAQBgqXYBH8ABBZSpewEAAYDAAQWxwBF2SwA1AAAAAQBbARfAAQW3gcABBbXAEXZmlBMWwAEFyIDAAQXEwBF2S5QTjByMHIEAwBF2ZgAAEW/CABFwgAARcVoAEXIZABFywwARc4gAEXQcABF0sAARdWIAEXYkABF2uAAAAAoCqeZzgP2BA8ABQXMDpqEAAAFdoaQCXGCSWQAABgSp6HOBVoFeCaW7AGCpWgAEqelzgWmBdhimogBgjM4BKwSp6nOBv4HUGKajAGDAAPR5ASsEqetzgh6CNBimpABgwAD0eQErBKnsc4KDgp4YpqUAYMAA9HkBKwSp7XOC8IMJGKamAGCSWQErAQWqTXODDoMOgy0AAAADgx6DLQAAAAEBAYMkAAAEpbtgqVoAAGCp5gE/AggBqeiAAMARd4oJAYMOobwAAAAAXQap73ODMoNDg+gAAJdZARqDM8AA7ksAAAEDg1SD6AAAAAICAoNgAAAAg7JgjmMAg28AACClo2CSWQAAXAE+AT0eg4KZfwQABCSDoQEWg5SAg4/AEXfVhQPAAPXZJ6ahFoO8gIO3wBF31ZQTjBwWg+AWg9kWg9Aupbup6KW+wABKxYCgwABKMQAGqfBzg+2D/oSOAACXYQEag+7AAO5LAAABA4QOhI4AAAACAgKEGQAAAIOyYJETAIQfAAAggKhgklkAAFwBPgE9HoQomX8EAAQkhEcBFoQ6gIQ1wBF4XYUDwAD12SemoRaEYoCEXcAReF2UE4wcFoSGFoR/FoR2LqW7qeilvsAASsWAoMAASjEABqnxc4SThKSE6gAAlRIBGoSUwADuSwAAAQOEuoTqAAAAAgIChM0AAACDsmCOawCE3AAAIKWjYJJZAABcAT4ABqnyc4TvhQCFOAAAlXYBGoTwwADuSwAAAQOFD4U4AAAAAgIChRsAAACDsmCQOgCFKgAAIKWjYJJZAABcAT4ABqnzc4U9hU6FjAAAlXkBGoU+wADuSwAAAQOFYIWMAAAAAgIChW8AAACDsmCQQwCFfgAAIKWjYJJZAABcAT4ABqn0c4WRhaKGXgAAlXIBGoWSwADuSwAAAQOFs4ZeAAAAAgIChcEAAACDsmCQFwCF0AAAIKWjYJJZAABcAT4BPRyF7BaF4y6lu6nopcgEAAMWhgqAhgXAEXmilUiQGiCGGadNAAAAACEWhjIWhikupbup6IRGwABKvgGl0SmpXwap9XOGY4ZohtcAAKWSAAAAAQOGhobXAAAAAQEBhqEAAACDsmCncgAAXAE+AT0chrYWhq0upbup6KZsAQABFobKgIbFwBF6GqWQp3QAqWIGqfZzhtyG4YlcAACllgAAAAEDhv2JXAAAAAEBAYcWAAAAg7Jgp3kAAFwBPgZOhyaHOAAApZRgjmMBFoc/gIc6wBF6aaWUp3tOh1qHagAApZVgjmMBFodxgIdswBF6aaWVp3xOh4qHlwAApclgkosBFoe2FoesFoeiFoeZLqW7qeiEKsAASqaa4Zj2lKaM/D0ch8wWh8Mupbup6KXIAwADgYflwBF6eoOH+MARerAhFogQFogHLqW7qeiERsAASr4AqV89HIgqFoghLqW7qeilygQABIOIRMARerAeiFqnWQIAAoGIasARenoWiH0upbup6ACBiJDAEXp6Foi9gYirwBF6epQTjBwAwABKzkmIziEciOKCiNLAEXqVQQEAASsAwAD10j4BPRyI/BaI8y6lu6nopcgDAAOCiRfAEXqVIIkup00AAAAAIRaJRxaJPi6lu6nohEbAAEq+AKlfPwap93OJYYlyi0QAAJWTARqJYsAA7ksAAAEDiYaLRAAAAAICAomXAAAAg7JgkMMAiaYAACClo2CSWQAAXAE+BEmJuSEcid0WiccWib4upbup6KQiwABKwaanAQABgYnswBF72QDAAEvWPgE9iYoCwBF72RyKGRaKEC6lu6nopqgBAAGBiirAEXvZAMAASu8/TopGik4AAJVIYI5jARaKVYCKUMARe86VSJDFPRyKaxaKYi6lu6nopcgEAAOCinvAEXw6gYqEwBF72SkBpdEpqV89HIq6FoqxLqW7qeimqQIAAoCK1cARe84ciw8WiuwWiuMupbup6KQiwABKwZWSAQABHoscp1kCAAKCiyzAEXw6Fos1LqW7qegAAKIJAMAASsoGqfhzi0mLTovTAAClmQAAAAEDi2CL0wAAAAEBAYtvAAAAg7Jgp4EAAFwBPgFGi3uLoIuEAAAApZBgkRMAFouVgIuQwBF86KWYp4M+AT0ci7EWi6gupbup6KZsAQABgYvAwBF8/QCpYgap+XOL2IvpjCMAAJV7ARqL2cAA7ksAAAEDi/mMIwAAAAICAowGAAAAg7JgkEwAjBUAACClo2CSWQAAXAE+AAap+nOMKIw5jI8AAJW0ARqMKcAA7ksAAAEDjEyMjwAAAAICAoxcAAAAg7JgkVgAjGIAACCAqGCSWQAAXAE+AAap+3OMlIyZjkIAAKWkAAAAAQOMrY5CAAAAAgICjL4AAACDsmCniACMzQAAAKWjYJJZAABcAT4EPReM5YCM4MARfc6lmxyNBRaM/C6lu6nopcgDAAMWjRqAjRXAEX3OpZ2njYGNKsARfdkpAKlfp4o9F41QFo1HgI1CwBF9zpJLkOeCFx6NV6dZAgACgI1nwBF9zhaNbS6lu6noAJIIRo18jaiNhQAAAKWQYI5jABaNloCNkcARfc6lnqeOPgE9HI25Fo2wLqW7qeilyAQAA4KN1MARflQgjeSnTQAAAAAhFo39Fo30LqW7qeiERsAASr4BpdEpqV9KjjMBKwap/HOOR45YkaoAAJVSARqOSMAA7ksAAAEDjnKRqgAAAAICAo6QAAAAg7Jgj70Ajp8AACClo2CSWQAAXAE+Ck6Oto7AAACVT2COYwEWjseAjsLAEX7RlU+Pv06O2o7fAACBPGCOYwEWjuaAjuHAEX7RgTyPwE6O9I7+AACVUGCOYwEWjwWAjwDAEX7RlVCPwU6PGI8lAAClyWCSiwEWj0QWjzoWjzAWjycupbup6IQqwABKpprhmPaUpoz8PRyPWhaPUS6lu6nopcgDAAOCj2rAEX7thY91wBF/PiEWj40Wj4Qupbup6IRGwABKvgCpXz0cj6cWj54upbup6KXKBAAEhY/BwBF/Ph6P16dZAgACgo/nwBF+7RaP8i6lu6noABaQCoCQBcARftGVT4+/FpAsFpAigJAdwBF+0ZVPj7+UE4wcAMAASs49HJBGFpA9LqW7qeilyAQAA4OQVsARfwiBkFzAEX7cKQGl0SmpXz0ckJIWkIkupbup6KXIBAADhJCiwBF/I4GQrcARftwpAaXRKalfTpDjkPAAAKWbYJJZARyRGhaQ+xaQ8i6lu6nopCLAAErBpdQCAAIekTCnWQIAAoORQMARfwgWkUYupbup6AAekV2nWQIAAoSRbcARfyMWkXgupbup6AAAwAB+Fj0XkY2AkYjAEX7RlVGGkZrAEYBCj8IGqf1zka+RwJsYAACVQgEakbDAAO5LAAABA5HamxgAAAACAgKR+AAAAIOyYI+FAJIHAAAgpaNgklkAAFwBPgZOkh6SJgAAhAldwABPcQJgwABQTlsBHJJFFpI4FpIxFpIoLqW7qeil78AASrymqsAASmxEAQABFpJLgJJGwBGA1oHTj4wAwAD1YkmSWCEckmSCklzAEYDyQQEAASsAwAD10j4FTpNtk3IAAICwYMAA9l0BFpOPFpOAFpN5gJN0wBGA1oHTj4ySaY0bgLCM1EmTmxaTtRaTsBaTqxaTpICTn8ARgNaB04+MgLCNF4CwkjWDaMAA9mQ+AT2LlFHAEYFWHJRWg5RRwBGBVl0BAAEklHQCJ4ExFpRuFpRpFpRigJRdwBGA1oHTj4yAsI0XgLCSNQDAAPZyPz0clIyClITAEYDynTgEAAQclMgalKKDrYTNAQABg5TWwBGBVgCIrhaU8xaU7ICU58ARgNaB04+MlBOMHBaVDoOVCcARgVZawAD2YRaVLBaVJYCVIMARgNaB04+MhBiNGADAAE+JRpU8lX+VRQAAAJ1mYJICABaVaRaVYBaVWYCVVMARgNaB04+Mkk+NYpRsjj8+AT01AAAAAQBgkgIBhJWJwBGCUyMclZoWlZWFlZXAEYJ+gheSCEEBAAErAJJdF5WVhZWVwBGCfoIXIJWkkmwAAAAAkggrAWCSWUaVwZX/lcoAAACdZmCSAgAWle4WleUWld6AldnAEYDWgdOPjJJPjWKUbY5APgE9NQAAAAEAYJICAYSWCcARgskjHJYaFpYVhZYVwBGC9IIXkghBAQABKwCSXReWFYWWFcARgvSCFyCWJJJsAAAAAJIIKwFgkllJlkYhHJaAipZLwBGA8hyWcRaWZRaWXhaWVS6lu6nope/AAEq8pqvAAEprRAEAARaWd4CWcsARgNaB04+MAMAA9WJBAQABKwDAAPXSPgU9HJauFpahFpaaFpaRLqW7qeil78AASrymq8AASmuT4AEAARaWuoCWtcARgNaB04+MAMAA9Ws9HJbmFpbZFpbSFpbJLqW7qeil78AASrymqsAASmyAsgIAAhaW7ICW58ARgNaB04+Mgpb2wBGA8gDAAPVjRpcFl0iXDgAAAJ1mYJICABaXMhaXKRaXIoCXHcARgNaB04+Mkk+NYpRsjj8+AT0cl2IWl1sWl1Iupbup6KXvwABKvKasAgACg5d6wBGEABaXjICXh8ARgNaB04+MAMAASnRGl6OX4ZesAAAAnWZgkgIAFpfQFpfHFpfAgJe7wBGA1oHTj4yST41ilG2OQD4BPRyX+xaX9BaX6y6lu6nope/AAEq8pqwCAAKDmBPAEYRiFpglgJggwBGA1oHTj4wAwABKdD0cmFoWmEwWmEUWmDwupbup6KXvwABKvKaqwABKbJPgAQABFphmgJhhwBGA1oHTj4wAwAD1az9OmH6YlwAApq1gwADyswEhHJjKHpihp10BAAEWmL+AmLrAEYDWVI+IAEEBAAErAMAA9dJOmNuY6wAApq5gwABLBgEcmPYWmO0upbup6KavBgAFgZkPwBGA4RaZKYCZJMARgNaUE4wcFplSFplJFplCgJk9wBGA1oHTj4yST41ilN2OTx6ZaKdcAQABFpmKgJmFwBGA1oHTj4wAFpmggJmbwBGA1lSPiAGD4haZwYCZvMARgNaD4o+JwABK4j0cmdgWmc8upbup6KapAgACgJnqwBGA1haaAISZ8MARhSqCF8AASwkAwABKykmaCyEWmhkWmhAupbup6IRGwABKvj4CTppCmkoAAIQJYKrpARaaVRaaTC6lu6nohAnAAErDSZpkIYOaacARhPc+AT0cmpWFmo3AEYX3prADAAKAmsXAEYDWFprUFprLLqW7qeikIsAASsEBprEpqyc/Pwap/nObHZsim4UAAKXbAAAAAQObPZuFAAAAAQEBm1UAAACDsmCnvQAAXAE+AAap/3ObiZuOnSEAAKXdAAAAAQObqJ0hAAAAAgICm8YAAACDsmCnxACb1QAAAKWjYJJZAABcAT4ETpxnnHAAAKWQYI5jARacd4CccsARhpulkKfIPRycjhachS6lu6nopcgEAAOCnJ7AEYa3gZyowBGGpikBpdEpqV89F5zagJzVwBGGm6WbHpzpp1kCAAKCnPnAEYa3Fp0DLqW7qegAp8ZKnRIBKwaqAHOdJp0rntkAAKXfAAAAAQOdOp7ZAAAAAQEBnUYAAACDsmCnzQAAXAE+BU6dVp1oAACllGCOYwEWnW+AnWrAEYdApZSnzz0cnY8WnYYupbup6KZsAQABFp2jgJ2ewBGHQJJMkW8AqWJOnbKduwAAlTtgkosBFp3aFp3QFp3GFp29LqW7qeiEKsAASqaa4Zj2lKaM/D0cnfAWnecupbup6KXIAwADgZ4AwBGHUYKeE8ARh44hFp4nFp4eLqW7qeiERsAASr4AqV89HJ5BFp44LqW7qeilygQABIKeW8ARh44enm2nWQIAAoGefcARh1EWnpAupbup6AAWnqiAnqPAEYdAlU+RcBaeyhaewICeu8ARh0CVT5FwlBOMHADAAErOBqoBc57enuOfdwAApeEAAAABA572n3cAAAACAgKfBgAAAIOyYKfUAJ8VAAAApaNgklkAAFwBPgI9F58tgJ8owBGIYqWbFp9bFp9PFp9FFp88LqW7qeiEKsAASqaa7Jj9lKaM/KfWSp9oASsGqgJzn3yfgZ/kAACl5AAAAAEDn5yf5AAAAAEBAZ+0AAAAg7Jgp+IAAFwBPgAGqgNzn+if7aCyAACl5gAAAAEDoA2gsgAAAAEBAaAqAAAAg7Jgp+cAAFwBPgE9HKA/FqA2LqW7qeilyAQAAxagXYCgWMARiPqlkKfpIKBtp00AAAAAIRaghhagfS6lu6nohEbAAEq+AaXRKalfBqoEc6C3oLyj2gAApekAAAABA6Dlo9oAAAACAgKhEgAAAIOyYKfuAKEhAAAApaNgklkAAFwBPgVOoTmhUgAAprJgwADyswEhHKGFHqFcp10BAAEWoXqAoXXAEYlnVI91AEEBAAErAMAA9dJOoZahpgAApq5gwABLBgEcobEWoagupbup6KavBgAFgaHKwBGJchah5ICh38ARiWeUE4wcFqINFqIEFqH9gKH4wBGJZ4HTj3mST42klN2OTx6iI6dcAQABFqJFgKJAwBGJZ4HTj3kAFqJbgKJWwBGJZ6Xop/IBg+IWooSAon/AEYlng+KPdsAASuI9F6KXgKKSwBGJZ6WbFqK2g6KmwBGJtoIXwABLCafwSaLAIRaizhaixS6lu6nohEbAAEq+PgJOovei/wAAhAlgqukBFqMKFqMBLqW7qeiECcAASsNJoxkhgqMewBGJgz4BPRyjSoSjQsARinamswMAAoCjdsARiWcWo4UWo3wupbup6KQiwABKwQGmsSmrKD8/SqPLASsGqgVzo9+j5KTnAACl8wAAAAEDo/+k5wAAAAEBAaQXAAAAg7JgqAMAAFwBPgJOpCekNwAAprRgklkBHKRKFqRBLqW7qeilyAMAAxakX4CkWsARivKAio38FqRxFqRrgKRmwBGK8pREjf6CF40zKQCpXz0cpIsWpIIupbup6KXKBAAEFqSwFqSqgKSlwBGK8pREjf6CF40zgaS2wBGLAxakzICkx8ARivKAio38FqTYgKTTwBGK8pQTjBwAwABKzgaqBnOk7KTxrDQAAKa1AAAAAQOlDaw0AAAABAMDpSkAAACSS2CSAgClPgAAAIOUYI5jAKVSAAAAkkxgkRMAAaVkAAAAlb9gwADyswEqXAE+DE6lhAAAAKIAYJJZAE6lmqWlAACmaGDAAPKzASpOpbelyAAAprZgwADyswEhFqXUFqXLLqW7qeiERsAASr5JpeQepgSpiQEAASamFgGAphbAEYuxYKl8AD4CPY2mKcARi/IpPYymQsARi+YgplanTQAAAAA+AT2MpnjAEYvmFqaPgKaGwBGLsYIXkghOpqmmtgAApZtgklkBHKa4Lqa3BAADgabUwBGLvISm3sARi+YihabrwBGL8gGGpvnAEYwCAZW/g6ccwBGL06oHSacqhacuwBGL8j4CPTUAAAABAGDAAEYAARanSxanQi6lu6noo8nAAErAIxynXBQAwBGMvggAQQEAASsAACscp1wUAMARjL4IAKQaBAAEFqdsFqdjLqW7qeiAoMAASr0Wp3qAp3HAEYuxlBOMHCeCFx+nnMAARhcBAAGHp7jAEYxxAADAAEYCAVw9F6fXgKfOwBGLsYIXh6fewBGMcZIIP0mn9yEcqACCp/vAEYvHQQEAASsAwAD10j0cqBIWqAkupbup6KZsAQABgqghwBGLxwCpYj9OqEGoSQAAprhgkgIBH6hXkiUDAAErAoIXh6h3wBGMcYPgKU6opaixAACmuWCOdgE1qLcAAAEAYI52AR+ot46BAQABFKjDwBGNhQgAADUAAAABAFsBF6jUFKjSwBGNtQkAlBMWqOqAqOHAEYuxlBOMHIwcFADAEY21CQBOqQOpCgAAklFgjBUBFqkVgKkMwBGLsZJRjBtOqSypPQAAprpgjmMBHKlIFqk/LqW7qeilygUABBapa4CpYsARi7GCF5IIh6lxwBGMcRSpf8ARjagJABapkxSpjMARjgAKAJQTjBwBhWgaqbGFH8AASs5JqeEhHKn2FKnlwBGOGwsAQQEAASsAwAD10j4DPRyqDhSqB8ARjgAKAJQVAgACgKobwBGLsRSqJcARjYUIAACMIT0Xqj6AqjXAEYuxkkU1qkwAAAEAYI5jARSqTMARjhsLADUAAAABAFsBF6peFKpcwBGOwAwAklGAqmfAEYuxjBsUAMARjsAMAJIKSap3HKqAgqp7wBGLx0EBAAErAMAA9dI+AUmqkyWqnhSql8ARjgAKAGDAAEm/PgE9F6rCFKq7wBGOAAoBYMAASb+mu4CqzcARi7HAAEnDSarmJarxFKrqwBGOAAoAYMAASiA+AT0XqxYUqw/AEY4ACgFgwABKIKa7gKshwBGLscAASiQ+AT0eq0aZfwQABCSrZwEWq1oUq1PAEY4ACgCFA8AA9dknprUWq6CAq5fAEYuxlBOMHBarvhartYCrrMARi7GEvowogU2T+gA+AT0cq+0Uq+bAEY4ACgCUFQIAAoKr+sARi8cerADAAEZNAgACgKwSwBGLsYKsHMARi8cAAIwhPwaqB3OsOaxCsKEAAKa3AAAAAQOsVLChAAAABAMDrGcAAACDlGCOYwCsegAAAKIAYJJZAKyMAAAApmhgwADyswABrKQAAACVv2DAAPKzASpgklkBPghOrMGszwAAmvtgjM4BI4Os0cARkEAWrPYWrOwWrOMupbup6IQqwABKppsWmRoWrR8WrRUWrQwupbup6IQqwABKppr7mQcBYIzOTq07rUMAAIHnYJJZARytThatRS6lu6noprwCAAKBrVfAEZAnhK1kwBGQVQDAAErxPRytgRateC6lu6nopcgDAAOArZHAEZAcha2bwBGQnoKtpMARkDIAqV9Orb6t1QAApr1gklkBHK3oFq3fLqW7qeimvgEAAR6t/adZAgACgK4NwBGQHBauFy6lu6noAADAAEruPRyuMBauJy6lu6nopcoFAAQcrlMWrkoupbup6Ka8AgACIK5iknYAAAAAhK5xwBGQVQDAAErxhq6JwBGQ94CuqcARkBwWrsSArrvAEZAclBOMHAGFaBqu4oUlwABKzk6vEgAAAKWbYJJZAEmvJIKvKMARkDI+Aj2PrzzAEZGPIK9RknYAAAAASa9mJa+Bhq9qwBGQ92CSiz4CTq+rr7UAAJSGYJKLARyv3BavwBavty6lu6nopdnAAEq/lQ0CAAIUr/DAEZD3BgFgkouEsAjAEZBVAJgXSbAgIRywLhSwJMARkcoIAEEBAAErAJKYPgE9j7BDwBGRjxywaRawXBSwUsARkcoIAJJEko5EAQABkwDAAPUsPz8/SrCKAYewkcARkY8GqghzsKawq7ljAACmvwAAAAEDsMW5YwAAAAQDA7DhAAAAkktgkgIAsPYAAACDlGCOYwCxCgAAAJJMYJETAAGxHAAAAJW/YMAA8rMBKlwBPg1OsTwAAACiAGCSWQBOsVKxYwAAprZgwADyswEhFrFvFrFmLqW7qeiERsAASr5OsYgAAACmwGCSWQBOsasAAACmwWCOYwBOsc8AAAClq2COYwBOseyx9gAAklBgkRkBJrHsASMlsgWCsgDAEZKFYJEjFrIgFrIVFLIQwBGShQIBYJEjlaWRJYLSwAD1AYKyKMARkoUBYJETYJEZTrJOslcAAKWQYKkvASayTgEWsmMUslnAEZL1CQCSR5EbYKkvPY+yc8ARkt0WspIUsonAEZM+CgClsakzSbKhJbK5h7KlwBGS3WCOgj4CPY6y0cARktGMsubAEZKkFrMRFrMIFLL0wBGS3QcBYI6CkkuOhIIXkgg9FbMdwBGS6QgWszcUsyPAEZLdBwFgjoKAio6FSbNJIiWzYYezTcARkt1gjqABJbOPh7N7wBGS3WCO+j4ETrO1s8IAAJUbYJJZARazzRazxC6lu6nolG7AAErCTrPks/AAAKbCYMAA9cUBHLQFFrP8LqW7qeimOQIAAhS0G8ARk/ILAIe0KcARkt0AwABK0z2OtEXAEZLRjLRkwBGSpBy0exa0ci6lu6nopsMCAAIUtInAEZQQDAAUtJbAEZPyCwAAwABK2Um0qyW0w4e0r8ARkt1gjqA+AT0VtN3AEZLpCBa09xS048ARkt0HAWCOoICKjqRJtQsltSOHtQ/AEZLdYI76PgE9FbVCwBGS6QgWtVwUtUjAEZLdBwFgjvqAio79P0m1diW1joe1esARkt1gjxw+Aj2OtaTAEZLRjLW5wBGSpBa14ha12xS1x8ARkt0HAWCPHIHTjyGUro0mPRW19MARkukIFrYOFLX6wBGS3QcBYI8cgIqPH0m2ICW2OIe2JMARkt1gjms+AT2MtlbAEZKkILZqp00AAAAAPgE9HraMmX8EAAQktsUBFra4h7akwBGS3YUDwAD12SemxBa3Foe3AsARkt2UE4wcFrc8Frc1FrcsLqW7qeilvsAASsWAoMAASjEATrdWt2MAAKWbYJJZARy3ZS6mtwQAA4G3gcARknqEt4vAEZKkhbeYwBGSsAGVv4O3u8ARkpGqB0m3yYW3zcARkrA+AT0Xt/CAt+fAEZJvghcUt/fAEZWcCwCSCD89HLgZFrgQLqW7qeimbAEAAYK4KMARkoUAqWJJuDQhHLhLhrg4wBGS0UEBAAErAJJdPgE9HLhlFrhcLqW7qeilygYABB64gcAAS5sCAAIWuJoWuJEupbup6IQqwABKpoa4pcARktEAFrjNgLjEwBGSb4IXkggUuN3AEZLpCAAWuPAUuOzAEZLpCACUE4wcAoVoGrkQhR+l0SnAAErOPwaqCXO5aLl5urwAAJXAARq5acAA7ksAAAEDuYy6vAAAAAICArmcAAAAg7JgkYUAuaIAACCAqGCSWQAAXAE+AUm5qxy5wha5vRa5tIC5r8ARlrmSS5GIgLCSBkEBAAErAMAA9mw+AT0cudMupr8EAAMWufOAue7AEZa5kkuRiBa6AoC5/cARlrmDlJGJFroRgLoMwBGWuZJMkYoBlb8Wui+AuirAEZa5lb+Ri6oIPgE9HLpMLqa1BAADFrpugLppwBGWuZJLkYgWun2AunjAEZa5g5SRiRa6jIC6h8ARlrmSTJGKAZW/FrqqgLqlwBGWuZW/kYuqBgaqCnO6wbrGvxAAAKX2AAAAAQO61r8QAAAAAQEBuuMAAACDsmCoCAAAXAE+BU6687sFAACllGCOYwEWuwyAuwfAEZeopZSoCka7I7tYuzwAAACSS2CSAgAWu02Au0jAEZeolbqRej4BSbtgHLtyFrttgrtkwBGX2ICwkgZBAQABKwDAAPZsPgJOu5C7nAAAkkVgjmMBFrungruewBGX2JJFkgpJu7whHLvMg7vAwBGYFEEBAAErAMAA9dI+AT0Xu+qCu+HAEZfYghccu/oWu/Eupbup6KXIBAADg7wZwBGYFCC8LKdNAAAAACkBpdEpqV+SCD8+AT0cvI8WvIYupbup6KZsAQABgryewBGX2ACpYkm8uyEcvNGBvL/AEZe5QQEAASsAwAD10j4DTrzmvPMAAKXJYJKLARa9Eha9CBa8/ha89S6lu6nohCrAAEqmmuGY9pSmjPw9HL0qFr0hLqW7qeilyAMAA4G9RcARl7mCvVjAEZi3IRa9cBa9Zy6lu6nohEbAAEq+AKlfPRy9jBa9gy6lu6nopcoEAASCvajAEZi3Hr3Ap1kCAAKBvdDAEZe5Fr3jLqW7qegAFr39gL34wBGXqJVPkXsWviEWvheAvhLAEZeolU+Re5QTjBwAwABKzj9Gvji+Yb5BAAAApsVgjmMAFr5QgL5LwBGXqKX1qAs+AT0cvnIWvmkupbup6KXIBAADgr6NwBGZdCC+m6dNAAAAACEWvrQWvqsupbup6IRGwABKvgGl0SmpXz0cvvMWvuoupbup6KZsAQABFr8HgL8CwBGXqJJMkX0AqWIGqgtzvxW/L8AAQEgAAKbGAAAAAQO/SMAAQEgAAAAEBAS/ZQAAAIOyYKgQAL96AAAApaNgklkAv5YAAACmx2CSWQC/rwAAAKbIYMAA9HkAAGDAAEsGAT4BSr/WARy/5ha/3S6lu6nopskEAASAwABAAsARmguBwABACMARmhaDwABAFcARmiyCwABANsARmiEAwABK4waqDHPAAEBNwABAUsAAQesAAKX8AAAAAQPAAEBywABB6wAAAAEBAcAAQI8AAACDsmCoEwAAXAE+BD0cwABApBbAAECbLqW7qeimygEAARbAAEDNFsAAQMSAwABAv8ARmqaSS5IplDSSBQDAAErlTsAAQOjAAED2AACmx2CSWQEjFsAAQQWAwABBAMARmqal+adXqBYrFsAAQTMWwABBKoDAAEElwBGappJPkiqU3I5BAWCSWU7AAEFHwABBVwAApq5gwABLBgEcwABBWS6mxgQABBbAAEGBgMAAQXzAEZqmpfuoGSuBwABBmcARmu4WwABBrYDAAEGowBGappQTjBwAqgs9F8AAQcwWwABBw4DAAEG+wBGappJLkimCFxbAAEHjgsAAQdPAEZs0ghfAAEsJkggGqg1zwABB8MAAQgHAAEL5AACVlQEawABB8cAA7ksAAAEDwABCGMAAQvkAAAACAgLAAEIsAAAAg7JgkM4AwABCOwAAIKWjYJJZAABcAT4CTsAAQlLAAEJiAACmrmDAAEsGARzAAEJkLqbGBAAEJsAAQowBFsAAQoyAwABCh8ARm+KST5DQYKgQgcAAQpbAEZvvKxbAAEKugMAAQqnAEZvilBOMHACqCz0cwABCyBbAAEK/LqW7qeimqQIAAoDAAELawBGb4hbAAELwgsAAQuDAEZwCghfAAEsJAMAASsoGqg5zwABC/sAAQwPAAEUeAACmAQAAAAEDwABDJ8AARR4AAAABAQHAAENPAAAAg7JgqB8AAFwBPgJOwABDX8AAQ2wAAJSWYJ3SAR7AAEN7ndkBAAEcwABDqhbAAEOSFsAAQ4kupbup6KXZwABKv5nIAgACFsAAQ94WwABD1RbAAEPMLqW7qeiUbsAASsKUlJKQFsAAQ/UWwABD7oDAAEPpwBGct4HTqCGSaY0bAJgWAD0cwABEFBbAAEQLLqW7qeimrwYABSsWwABEQIDAAEQ7wBGct5QTjBwmwABEYQEcwABEYYHAAERUwBGcypJmAQABFsAARJ8WwABEkhbAAESJFsAARIKAwABEfcARnLeB06ghkk+NYpTdjk+VRZKpAJ3hYJKcFsAARMgWwABEvy6lu6nolG7AAErCFsAARN+AwABE2sARnLemAKgiAabLKcAASuIGqg9zwABFI8AARSjAAElzAACmBQAAAAEDwABFO8AASXMAAAACAgLAAEVLAAAAg7JgqCcAwABFWgAAAKWjYJJZAABcAT4KTsAARXHAAEV+AACmA2COYwEWwABFhYDAAEWAwBGeCqYDqCxOwABFm8AARakAAKYEYI5jARbAAEWwgMAARavAEZ4KpgSoLT0cwABGHhbAAEYVLqW7qeilyAMAA4LAAEYuwBGeKoHAAEY8wBGeFykAqV9OwABGWMAARmAAAKbMYJJZAR7AAEZip1kCAAKCwABGcsARnioWwABGgC6lu6noAD0XwABGnRbAAEaUgMAARo/AEZ4KkkuQ54IXhMAARqTAEZ6bkghJwABHAiXAAEcSgcAARwbAEZ4XYKdGPgE9HMAARzMWwABHKi6lu6nopcgEAAODwABHQ8ARnk2EwABHUsARnpspAaXRKalfPgE9HMAAR50WwABHlC6lu6nopcgEAAODwABHrcARnk2BwABHvMARnhcpAaXRKalfTsAAR/3AAEgFAAClxGCSWQEewABIB6dZAgACg8AASBfAEZ5NFsAASCYupbup6AA9F8AASMWAwABIwMARngqlmxzAAEj7FsAASOUWwABI3C6lu6nopCLAAErBpdQCAAKEwABJEcARnpuFwABJGsARn2UAwAB+FqgpPRfAAEkyFsAASS2AwABJKMARngqSTKgrlVEewABJP6dZAgACgMAASU/AEZ4KFsAASVUupbup6ACPwkrAAElkASsGqhBzwABJeMAASX3AAEuXAACmBwAAAAEDwABJjMAAS5cAAAABAQHAAEmYAAAAg7JgqDIAAFwBPgZOwABJqMAASboAAKWUYI5jARbAAEnBgMAASbzAEaBEpZSoNE7AAEncwABJ6QAApclgkosBFsAASggWwABJ/hbAAEn0FsAASesupbup6IQqwABKpprhmPaUpoz8PRzAAEoeFsAAShUupbup6KXIAwADgcAASjfAEaBXgsAASkrAEaB6IRbAAEpiFsAASlkupbup6IRGwABKvgCpXz0cwABKfBbAAEpzLqW7qeilygQABILAAEqWwBGgeh7AAEqsp1kCAAKBwABKvMARoFcWwABKzy6lu6noABbAAErngMAASuLAEaBElU+RuBbAAEsJFsAASv+AwABK+sARoESVT5G4lBOMHADAAErOPRzAAEsjFsAASxoupbup6KZsAQABFsAASzeAwABLMsARoESBPJG5AKliScAAS0IhHMAAS1UWwABLS4DAAEtGwBGgRJVQkbpBAQABKwDAAPXSPgE9HMAAS28WwABLZi6lu6nopmwBAAEWwABLg4DAAEt+wBGgRJVQkboAqWI/BqoRc8AAS5zAAEuhwABNQwAApgoAAAABA8AAS7/AAE1DAAAAAgICwABL4QAAAIOyYKg5AMAAS/AAAAClo2CSWQAAXAE+BUnAAEwDIRzAAEwSFsAATAyAwABMB8ARogSCEaelQQEAASsAwAD10j4BPRzAAEwsFsAATCMupbup6KXIAwADFsAATEyAwABMR8ARogSCEaelIMAATFmnTQAAAAAhFsAATHIWwABMaS6lu6nohEbAAEq+AKlfPz0cwABMkhbAAEyJLqW7qeilyAMAAxbAAEywgMAATKvAEaIEpaunpCDAAEy7p00AAAAAIRbAAEzUFsAATMsupbup6IRGwABKvgCpXz0cwABM6oDAAEzlwBGiBKZWp1cAAAAAqTk9F8AATQyAwABNB8ARogSlmyDAAE0hknYAAAAAqTFKwABNNAErBqoSc8AATUjAAE1NwABX7AAApg8AAAABA8AATWnAAFfsAAAAAgICwABNiQAAAIOyYKhBAMAATZgAAAClo2CSWQAAXAE+EU7AAE2vwABNvAAAlRtgklkBHMAATcOAwABNvsARo0il2KdXAQABFsAATdIupbup6ACnuU7AAE3lwABN8QAApsJgwAD1xQEcwABOBBbAAE37LqW7qeilwQIAAoLAAE4fwBGjaCbAAE4yARbAAE4ygMAATi3AEaNIghGnpWCPRQDAAErRTsAATv/AAE8KAACmzWCSnAEcwABPFRbAAE8MLqW7qeilxgIAAhzAAE89FsAATzQupbup6KXHAgACg8AAT0vAEaObgsAAT1jAEaNoAMAAStUqAMAAStROwABPfAAAAKbOYJJZAE7AAE+kwABPsQAAps9gklkBIMAAT7mnTQAAAABOwABP1cAAT+IAAKW9YJJZASDAAE/qp00AAAAAScAAT/0cwABQKBbAAFAhFsAAUAyEwABQAcARo+uUbJKgWsAA9UyBSAEAAZUAwAD1qT4CPY3AAFDxwBGkQRzAAFEsFsAAURiEwABRDcARo+uUbJKgRAEAAZMAwAD1LD2PwABRN8ARpGscwABRZRbAAFFRhMAAUUbAEaPrlGySoEQBAAGUAMAA9Sw/PRzAAFF9FsAAUXQupbup6KXIAwADFsAAUZKAwABRjcARo0gnqEOGwABRmcARpE8pAKlfTsAAUbbAAFHAAACm0GCSWQEewABRwqdZAgACFsAAUdeAwABR0sARo0gnqEMWwABR3i6lu6noAD0cwABR8oDAAFHtwBGjSKXQp1cDAAMWwABSAC6lu6noFsAAUg+AwABSCsARo0gnqEMUwABSFsARpUQIAACpOknAAFImISXAAFI3h8AAUirAEaRrYKdGPgE9HMAAUlkWwABSUC6lu6nopcoEAASFwABSdcARpEEUwABSmsARpUQIABzAAFLsFsAAUuIcwABStIDAAFKvwBGjSKYMp1cCAAIWwABSzC6lu6noFsAAUtuAwABS1sARo0iCEaelAKhGlSqPMEQBAAGTAMAA9SwWwABTBhbAAFMAgMAAUvvAEaNIghGnpZQTjBwAwABKzj9OwABTMsAAUzcAAJ05YI9FASbAAFMyARbAAFM+gMAAUznAEaNInTmno2CPRU7AAFNRAAAApbxgklkAScAAU18hHMAAU2gUwABTY8ARpmkJAEEBAAErAMAA9dI+CE7AAFN9wABTiAAAptFgwAD1xQEcwABTkxbAAFOKLqW7qeilwQMAAoLAAFOuwBGjaBTAAFO8wBGmaQkAAaXCKsAAStFOwABT7MAAU/8AAKbSYJKcARzAAFQKFsAAVAEupbup6KXGAgACHMAAVDQWwABUKy6lu6nopccCAAIUwABUQsARpsULAILAAFROwBGjaADAAErVKgDAAErUPRzAAFR0FsAAVGsupbup6KXKBAAEHsAAVJDAAEusAgACFMAAVKvAEacIDACTABTAAFTNwBGlRAgAHMAAVRkWwABVDxzAAFTngMAAVOLAEaNIpgynVwIAAhbAAFT/LqW7qegUwABVCcARpmkJAACoRpUqjzBEAQABkwDAAPUsFsAAVS0UwABVKMARpmkJAJQTjBwAwABKzj0VwABVQMARppUKFsAAVV4UwABVS8ARpwgMAJTckqNOwABVdMAAVYgAAKbTYI9NASMlwABVjxTAAFWKwBGmaQkAYI9NFMAAVaXAEaZpCQFgj00rAWCPTU7AAFW8wABVxgAApctgwABKlwEcwABV0RbAAFXILqW7qeilzAYABhbAAFX3gMAAVfLAEaNIhDyntILAAFYLwBGjaBTAAFYZwBGmxQsAFMAAViXAEagWDQAWwABWPxTAAFY6wBGmaQkAVI9HFMAAVkrAEaZpCQAAwABK7U7AAFZbwABWaAAAptRgjmMBHMAAVnMWwABWai6lu6nopc4HAAcUwABWncARqE4OABTAAFaywBGoFg0AFsAAVtYUwABW0cARpmkJAFSPRxTAAFbrwBGmaQkAFMAAVvvAEaaVCgAUwABXD8ARpwgMABbAAFcyFMAAVy3AEaZpCQCUE4wcAMAASts9HMAAV0qAwABXRcARo0il0KdXAwADFsAAV1gupbup6BTAAFdiwBGoyQ8AFMAAV3DAEaaVCgAAqTo/PRzAAFeKgMAAV4XAEaNIpbqnVwMAAxbAAFeULqW7qegUwABXnsARppUKAIfAAFeowBGkawCnrj0cwABXwIDAAFe7wBGjSKZWp1cAAAAAqTlKwABX3QErBqoTc8AAV/HAAFf2wABa2gAAphYAAAABA8AAWAbAAFraAAAAAgICwABYEwAAAIOyYKhRAMAAWCIAAAClo2CSWQAAXAE+BUnAAFg1HMAAWEIWwABYOS6lu6noptUBAAGBwABYUsARqhUAwABKzD4CTsAAWG/AAFh7AACmFWDAAPMrARzAAFiCgMAAWH3AEaoIphMAAAAAqFZJwABYlCEcwABYpILAAFiYwBGqUUEBAAErAMAA9Zw+Az0cwABYwxbAAFi8gMAAWLfAEaoIklGMG5QVAgACgMAAWN3AEaoINcAAWOMAAAEAYJBDAR/AAFjjkEsBAAGCwABY8cARqlEANQAAAAEAWwEXwABY/4PAAFj9wBGqwJQTFsAAWRGAwABZDMARqgiUE4wcjByDAMARqsAAjCE9F8AAWSuAwABZJsARqgilmxbAAFlZFsAAWU0WwABZQxbAAFk6LqW7qeiEKsAASqaa7Jj9lKaM/KhTSsAAWWoBKz8/TsAAWZTAAFmaAACC6GCOYwEewABZnKdeBAAEFsAAWccupbup6BbAAFnWgMAAWdHAEaoIgIqQPBbAAFnigMAAWd3AEaoIphKoVBbAAFnwgMAAWevAEaoIlBOMHABJwABaASEcwABaC4LAAFoFwBGrWUEBAAErAMAA9dI+Az0cwABaKBbAAFohgMAAWhzAEaoIklGMG5QVAgACgMAAWjXAEaoIgsAAWjvAEatZAIwhPRfAAFpOgMAAWknAEaoIpZsgwABaY5KKAAAAAKhTSsAAWncBKz89F8AAWpOAwABajsARqgilmxbAAFq+FsAAWrUWwABaqxbAAFqiLqW7qeiEKsAASqaa9JkClKaM/KhTSsAAWssBKwaqFHPAAFrfwABa5MAAYAEAAKYaAAAAAQPAAFr+wABgAQAAAAICAsAAWxwAAACDsmCoWgDAAFsrAAAApaNgklkAAFwBPghJwABbPhzAAFtLFsAAW0Iupbup6KbVAQABgcAAW1vAEayhAMAASsw+Ak7AAFt4wABbhAAAphVgwADzKwEcwABbi4DAAFuGwBGslKYTAAAAAKhhScAAW50hHMAAW62CwABbocARrN1BAQABKwDAAPWcPgM9HMAAW8wWwABbxYDAAFvAwBGslJJRjBuUFQIAAoDAAFvmwBGslDXAAFvsAAABAGCQQwEfwABb7JBLAQABgsAAW/rAEazdADUAAAABAFsBF8AAXAiDwABcBsARrUyUExbAAFwagMAAXBXAEayUlBOoXYwcgwDAEa1MAIwhPRfAAFw0gMAAXC/AEayUpZsWwABcYhbAAFxWFsAAXEwWwABcQy6lu6nohCrAAEqmmuyY/ZSmjPyoX0rAAFxzASs/P07AAFyXwABcoAAApNFgwAD0eQEcwABcp4DAAFyiwBGslKYZAAAAAKhiScAAXLYcwABcw4LAAFy6wBGt5UEBAAErAMAA9Zw+BE7AAFzfwABc6wAAlBdgjmMBHMAAXP0WwABc9hbAAFztLqW7qeilvsAASsWm1gEAARzAAF0zFsAAXSwWwABdIy6lu6nopb7AAErFptcDAAMcwABdchrAAF1PhY2EzQEAARbAAF2FgMAAXYDAEayUphKoXACIrhbAAF2igMAAXZ3AEayUlBOoXRbAAF3JFsAAXcGAwABdvMARrJSmEqhcWsAA9mEAwABKNQDAAEo6PRzAAF3lFsAAXd6AwABd2cARrJSSUYwblBUCAAKAwABd8sARrJSDwABd+MARri0AjCE9F8AAXhGAwABeDMARrJSlmyDAAF4mkooAAAAAqF9KwABeOgErP07AAF5cwABeYgAAguhgjmMBHsAAXmSnXgQABBbAAF6PLqW7qeiCwABemcARreUWwABeqIDAAF6jwBGslKYSqFwWwABetoDAAF6xwBGslJQTqF0AScAAXschHMAAXtGDwABey8ARrzJBAQABKwDAAPXSPgM9HMAAXu4WwABe54DAAF7iwBGslJJRjBuUFQIAAoDAAF77wBGslIPAAF8BwBGvMgCMIT0XwABfFIDAAF8PwBGslKWbIMAAXymSigAAAACoX0rAAF89ASs/PRzAAF9pFsAAX1mAwABfVMARrJSSUYwblBUCAAKAwABfdsAR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LqW7qeilvsAASsWm1gEAARzAAGjZFsAAaL0WwABotC6lu6nopb7AAErFptcDAAMawABo5oZUFsAAaTIWwABpJxTAAGkfwBG0vAABYMAASYuSR8AASY2UE4wclADAAEo1AMAASjoAjCE+AT0cwABpaoHAAGljwBG0yZQVAgACFMAAaYjAEbS8AAFgwABJixzAAGmxFsAAaaoWwABpoS6lu6nopb7AAErFptYBAAEcwABp8RbAAGnVFsAAacwupbup6KW+wABKxabXAwADHMAAajIawABqF4b1hM0BAAGGwABqQMARtTkAiK4WwABqeBbAAGptFMAAamXAEbS8AAFgwABJi5JHwABJjZQTjByUAMAASjUAwABKOgCMIUnAAGq9JcAAasyGwABqwcARtTlgkos+AUnAAGrqIRzAAGr4FsAAau8upbup6KbfAgACgsAAawXAEbTWh8AAaxvAEbYbAMAASs0+AT0cwABrRIHAAGs9wBG0yZQVAgACFMAAa2LAEbS8AAFgwABJixzAAGuLFsAAa4QWwABrey6lu6nopb7AAErFptYBAAEcwABryxbAAGuvFsAAa6Yupbup6KW+wABKxabXAwADHMAAbBMawABr8YbrhM0CAAKHwABsPsARthuCwABsUcARtNYAiK4WwABskxbAAGyIFMAAbIDAEbS8AAFgwABJi5JHwABJjZQTjByUAMAASjUAwABKOgCMIT8/P0rAAG0MARfAAG0bFMAAbRPAEbS8AAFgwABJi6IANQAAAAEAYJJZARzAAG0zLqbYAgAChsAAbUjAEbU5FsAAbVwUwABtVMARtLwAAWDAAEmLpJHAAEmOAKoZIxzAAG1phwDAEblpQQEAASsAACDAAG2AknYAAAAAhwDAEblpAWCSWcAASY9JwABtmiXAAG2mgMAAbZ7AEbS8YMAASZw+B07AAG3FwABtzgAAlTtgklkBFsAAbe0WwABt4xbAAG3ZFsAAbdAupbup6IQqwABKpprhmPaUpoz8TsAAbgXAAG4TAACm4GCSWQEcwABuHhbAAG4VLqW7qeilyAQAAxbAAG5BFMAAbjnAEbS8AAFgwABJnJVPwABJnobAAG5MwBG564XAAG5WwBG1CAGl0SqpXz0cwABumBbAAG6PLqW7qeilygQABIbAAG6pwBG564fAAG6zwBG6IxbAAG7KFMAAbsLA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ARTAAIeWwBHLqwsAAMAA9SyAwACHmsARxl0WwACHpYDAAIegwBHGXZVYkJQUwACHs8ARx3EKAACqGz89F8AAh+CAwACH28ARxl2lmx/AAIfzkpoCAAKCwACIAcARxn0xwACIDGCSWQGFwACIDcARxuMAqHdJwACIKSEWwACINxbAAIguLqW7qeiERsAASr4+Ak7AAIhgwACIaAAAhAlgqukBFsAAiHMWwACIai6lu6nohAnAAErDScAAiIIUwACIhsARxxkIAD4BPRzAAIipFMAAiKHAEczSCwCm6gMAAoDAAIjCwBHGXRbAAIjRFsAAiMgupbup6KQiwABKwQGmsSmrIj8/SsAAiRgBKwaqHXPAAIkswACJPcAAi3gAAJVNARrAAIktwADuSwAAAQPAAIlTwACLeAAAAAICAsAAiWYAAACDsmCPsADAAIl1AAAgpaNgklkAAFwBPghOwACJjMAAiZUAAJU7YJKLARbAAIm0FsAAiaoWwACJoBbAAImXLqW7qeiEKsAASqaa4Zj2lKaM/E7AAInFwACJygAAlUtgjmMBFsAAidGAwACJzMARzXyVS4+yTsAAid/AAInlAACVTGCOYwEWwACJ7IDAAInnwBHNfJVMj7Q9HMAAigAWwACJ9y6lu6nopcgDAAODwACKEMARzdSCwACKFsARzZwhFsAAiioWwACKIS6lu6nohEbAAEq+AKlfPRzAAIpEFsAAijsupbup6KXIAwADhMAAilTAEc33gsAAilvAEc2cIRbAAIpvFsAAimYupbup6IRGwABKvgCpXz0cwACKiRbAAIqALqW7qeilygQABILAAIqawBHNnB7AAIqkp1kCAAKDwACKtMARzdQWwACKui6lu6noABbAAIrSgMAAis3AEc18lUuPshbAAIriFsAAit2AwACK2MARzXyVS4+ylBOMHADAAErOPRzAAIr8FsAAivMupbup6KXKBAAEgsAAiw3AEc2cHsAAixenWQIAAoTAAIsnwBHN9xbAAIsuLqW7qegAFsAAi0aAwACLQcARzXyVTI+0FsAAi1gWwACLUoDAAItNwBHNfJVMj7SUE4wcAMAASs5KwACLaQErBqoec8AAjK3AAIyywACPqAAApusAAAABA8AAjNHAAI+oAAAABAQEwACM2wAAAKbsYJJZAMAAjPoAAACkkWDAAPKzAMAAjRYA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ASsAwAD2bD4BScAArIwhHMAArKgWwACsnBTAAKyQwBHkkQoAkkWSCkEBAAErAMAA9dI+AT0XwACsyxTAAKy/wBHkkQoAghccwACs2xbAAKzSLqW7qeilyAQAAxbAAKz3FMAArOvAEeSRCgCSRZIKFsAArSAUwACtFMAR5JEKAIIXkggiFMAArSbAEdN7CAABFMAArTnAEdOKCQABpdEpqV+SCD8+AT0cwACtoRbAAK2YLqW7qeimbAEAARTAAK2wwBHkkQoAAKliScAArdYhHMAAreoWwACt4BTAAK3awBHS/gABYMAASgqVT8AASg1BAQABKwDAAPXSPgE9HMAArgYWwACt/S6lu6nopcgEAAMWwACuKRTAAK4jwBHS/gABYMAASgqVT8AASg0WwACuXRbAAK5TFsAArkkWwACuQC6lu6nohCrAAEqmmuGY9pSmjPwiFMAArnLAEdN7CAABFMAAroXAEdOKCQABpdEqqV8/RsAArsjAAK71wACu2AAAAJJHYI5jABbAAK7sFMAArubAEdL+AAFgwABKCpW7wABKDj4BPRzAAK8IFsAArv8upbup6KXIBAADFMAArxjAEeZWCgAgwACvKqdNAAAAACIUwACvRcAR03sIAAEUwACvWMAR04oJAAGl0SmpX0rAAK/RARzAAK/YLqbtCgAKFsAAr/cUwACv8cAR0v4AAWDAAEoKkkzAAEoPFMAAsAfAEdL+AAFgwABKCoLAALAYwBHTGIPAALAzwBHTJYTAALBQwBHTMoXAALBpwBHTP4bAALCAwBHTUofAALCdwBHTZRTAALC8wBHTewgAFMAAsNfAEdOKCQAAqh9JwACw9SXAALD/gMAAsPnAEdL+YMAASiA+A0nAALEZHMAAsTEWwACxLBbAALEjFMAAsR3AEdL+AAFgwABKIJJLwABKIoCwkgZBAQABKwDAAPZsPgE9HMAAsUQupr8EAAMWwACxchTAALFswBHS/gABYMAASiCSS8AASiIWwACxghTAALF8wBHS/gABYMAASiCDlMAASiMWwACxkhTAALGMwBHS/gABYMAASiCmu8AASiQBlb8WwACxtxTAALGxwBHS/gABYMAASiCVv8AASieqCD4BPRzAALHYLqa1BAADFsAAsggUwACyAsAR0v4AAWDAAEogkkvAAEoiFsAAshgUwACyEsAR0v4AAWDA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wADV28AA1fAAAKbbYJJZARzAANYFFMAA1fLAEf+zGgBEAQABkwDAAPUsPTUAAAABAGDAAEYAARbAANYbFsAA1hIupbup6KPJwABKwCMcwADWLBQAwBIBKBwAQQEAASsAACscwADWLBQAwBIBKBwApBoEAAQWwADWSRbAANZALqW7qeiAoMAASr0WwADWX4DAANZawBHxTpQTjBwnpukfwADWk8AARh4BAAExwADWs2CSWQEUwADWtMASAPwbAAAAwABGAgFcTsAA1unAANb0AACnAmCofAE1wADW+gAAAQBgqHwBH8AA1vqoggMAARTAANcNwBH+IhcAApVYFMAA1zTAEgD8GwCD4hbAANdYgMAA11PAEfFOg+KQrTUAAAABAFsBF8AA120UwADXa8ASAdQcAJQTFsAA13+AwADXesAR8U6UE4wcjBwUAMASAdQcAD0cwADXnxbAANeYgMAA15PAEfFOklGMG5QVAgACgMAA16zAEfFOFMAA17LAEgHDHAAAjCFJwADXxxTAANfLwBH18g4APgFFwADX6QHAANfywADX9AAAW2DAAPR5AZMBHMAA1/sUwADX+cASApkdAFwBAAEWwADYFBbAANgIFMAA1/3AEgHDHACVVJCiWsAA9UwAwAD1pgEVwADYHMASApkdHMAA2B0UwADYHMASApkdAF0BAAGUAMAA9Z4+AT0cwADYLy6m4wQABBzAANhSFsAA2EcUwADYPMASAcMcAJVUkKJEAQABFMAA2FPAEgKZHQAAwAD1LBTAANhXwBIBwxwAFsAA2H4UwADYc8ASAcMcAJVYkKEUwADYjMAR9hsPAACqGz89F8AA2MaAwADYwcAR8U6lmxfAANjgFMAA2NXAEgHDHAClmx/AANj/kpoCAAIWwADZIBbAANkWFsAA2Q0upbup6IQqwABKppsBmQwUwADZKsAR/7MaAACofqiFSsAA2UgAP0nAANleIiIUwADZYsAR/ZoVAAAUwADZbsAR/dUWAAAWwADZhxbAANl/gMAA2XrAEfFOlY2QsINowAD1AD4DPRzAANmpFsAA2aKAwADZncAR8U6SUYwblBUCAAKAwADZw8AR8U4cwADZ5RbAANneFsAA2dUupbup6KW+wABKxabWAQABHMAA2iEWwADaCRbAANoALqW7qeilvsAASsWm1wMAAxrAANoug6gWwADadIDAANpvwBHxTpQTjByUAMAASjUAwABKOgCMIT0XwADak4DAANqOwBHxTqWbIMAA2qiSigAAAACohUrAANq+AD9JwADa1CIhFMAA2tnAEf2aFQAAIRTAANrmwBH91RYAPgNJwADa+iEWwADbCBbAANr/LqW7qeiERsAASr4+AT0cwADbLBbAANslgMAA2yDAEfFOklGMG5QVAgACgMAA20jAEfFOHMAA22wWwADbZRbAANtcLqW7qeilvsAASsWm1gEAARzAANuqFsAA25AWwADbhy6lu6nopb7AAErFptcDAAMawADbt4OmFsAA2/+AwADb+sAR8U6UE4wclADAAEo1AMAASjoAjCE/PRfAANwogMAA3CPAEfFOpZsgwADcPZKKAAAAAKiFSsAA3FMAPz0cwADciBbAANxyFsAA3Gkupbup6KQiwABKwaboBgAGg8AA3K7AEfGdFsAA3MqCwADcwcAR8W6SXozdh8AA3OTAEfHwFMAA3PvAEfIECACBwADdEsAR8VuEwADdKcAR8cAAwABL0j2NwADdP8AR8dQcwADdXoTAAN1RwBHxwEQBAAGTAMAA9Sw9jsAA3WnAEfHiHMAA3YqEwADdfcAR8cBEAQABlADAAPUsPTUAAAABAGDAAEYAARbAAN2eFsAA3ZUupbup6KPJwABKwCMcwADdrxQAwBIGXBcAQQEAASsAACscwADdrxQAwBIGXBcApBoEAAQWwADdyhbAAN3BLqW7qeiAoMAASr0WwADd3oDAAN3ZwBHxTpQTjBwnpukfwADeDsAARh4BAAExwADePWCSWQKFwADePsAR8dSGwADeT8AR8eIAAMAARgIBXD0XwADecIDAAN5rwBHxTpVhhcAA3nrAEfHUkK49F8AA3paAwADekcAR8U6VYobAAN6iwBHx4pCvP0nAAN6/FMAA3sPAEfXyDgA+AUXAAN7dAcAA3ubAAN7oAABbYMAA9HkBkwEcwADe7xTAAN7twBIHThUAXAEAARbAAN7+FsAA3vaAwADe8cAR8U6VjZCwWsAA9UwAwAD1pgEVwADfCMASB04VHMAA3wYUwADfCMASB04VAF0BAAGUAMAA9Z4+AT0cwADfFS6m/AcABxzAAN8vFsAA3yiAwADfI8AR8U6VjZCwRAEAARTAAN8wwBIHThUAAMAA9SyAwADfNMAR8U4cwADfRBTAAN86wBH3zBAARAEAARTAAN9FwBIHThUAAMAA9SwcwADfVRTAAN9JwBH4DxEARAEAARTAAN9WwBIHThUAAMAA9SwWwADfa4DAAN9mwBHxTpVhkK4WwADfeYDAAN90wBHxTpVikK8UwADfhMAR9hsPAACqID89F8AA37GAwADfrMAR8U6lmx/AAN/MkpoCAAKCwADf2sAR8W4xwADf5GCSWQKFwADf5cAR8dSGwADf9sAR8eIAqIVJwADgDyEWwADgHRbAAOAULqW7qeiERsAASr4+Ak7AAOBGwADgTgAAhAlgqukBFsAA4FkWwADgUC6lu6nohAnAAErDScAA4OkUwADg7cAR8nwKAD4BPRzAAOEQFMAA4QjAEgjYFQCnDwMAAoDAAOEowBHxThbAAOE3FsAA4S4upbup6KQiwABKwQGmsSmrJD8/Bqoic8AA4YDAAOGFwADvfgAApikAAAABA8AA4aLAAO9+AAAAAgICwADhwwAAAIOyYKiUAMAA4dIAAAClo2CSWQAAXAE+A0nAAOHlIiIiHMAA4fgWwADh8xbAAOHugMAA4enAEglygLCPUICwkjVBAQABJ4FWAMAA9mwAFsAA4iQWwADiHhbAAOIUgMAA4g/AEglyVI9RlQiPL4D8wAD0/wAWwADiURbAAOJGFsAA4jyAwADiN8ASCXJUj1GVKo8wgPzAAPT/ABbAAOJ5FsAA4nMWwADiaYDAAOJkwBIJclSPUZT9jzGA/MAA9P8+AUnAAOUnJcAA5TkWwADlMIDAAOUrwBIJcoQ8j09gqFE+BE7AAOVfwADlaAAAhDxgqFEBJsAA5V8BFsAA5W+AwADlasASCXKEPI9PYKhRScAA5YEcwADljhbAAOWFLqW7qeim1QEAAYHAAOWewBIJfwDAAErMPgJOwADlv8AA5csAAKYVYMAA8ysBHMAA5daCwADlzcASClumEwEAAAGmFCmoVknAAOX5IRzAAOYJg8AA5f3AEgqwQQEAASsAwAD1nD4DPRzAAOYsFsAA5iWAwADmIMASCXKSUYwblBUCAAKAwADmSsASCXI1wADmUAAAAQBgkEMBH8AA5lCQSwEAAYPAAOZewBIKsAA1AAAAAQBbARfAAOZshMAA5mrAEgsilBMWwADmfoDAAOZ5wBIJcpQTjByMHIQAwBILIgCMIT0XwADmnIDAAOaXwBIJcqWbFsAA5soWwADmvhbAAOa0FsAA5qsupbup6IQqwABKpprsmP2Upoz8qJZKwADm3wErPz9OwADnFcAA5xsAAILoYI5jAR7AAOcdp14EAAQWwADnTC6lu6noFsAA51+CwADnVsASCluAipA8FsAA52+CwADnZsASClumEqhUFsAA54GCwADneMASCluUE4wcAEnAAOeWIRzAAOegg8AA55rAEgu7QQEAASsAwAD10j4DPRzAAOfBFsAA57qAwADntcASCXKSUYwblBUCAAKAwADnzsASCXKDwADn1MASC7sAjCE9F8AA5+uAwADn5sASCXKlmyDAAOgAkooAAAAAqJZKwADoGAErP0nAAOg8JcAA6E4WwADoRYDAAOhAwBIJcoQ8j09gqFo+Ak7AAOiIwADokQAAhDxgqFoBJsAA6IgBFsAA6JiAwADok8ASCXKEPI9PYKhaScAA6KohFsAA6LiCwADor8ASDLCmGKhePgRJwADo1RzAAOjiFsAA6Nkupbup6KbVAQABgcAA6PLAEgl/AMAASsw+Ak7AAOkVwADpIQAAphVgwADzKwEcwADpLILAAOkjwBIMsKYTAQAAAaYUKahhScAA6VEhHMAA6WGDwADpVcASDR9BAQABKwDAAPWcPgM9HMAA6YYWwADpf4DAAOl6wBIJcpJRjBuUFQIAAoDAAOmTwBIJcjXAAOmrAAABAGCQQwEfwADpq5BLAQABg8AA6bnAEg0fADUAAAABAFsBF8AA6ceEwADpxcASDZGUExbAAOnZgMAA6dTAEglylBOMHIwchADAEg2RAIwhPRfAAOn5gMAA6fTAEglypZsWwADqJxbAAOobFsAA6hEWwADqCC6lu6nohCrAAEqmmuyY/ZSmjPyolkrAAOo+ASs/P07AAOpzwADqfAAApNFgwAD0eQEcwADqh4LAAOp+wBIMsKYZAQAAAaYUKahiScAA6qkcwADqtoPAAOqtwBIOKkEBAAErAMAA9Zw+BE7AAOrYwADq3gAAguhgjmMBHMAA6vAWwADq6RbAAOrgLqW7qeilvsAASsWm1gEAARzAAOssFsAA6yUWwADrHC6lu6nopb7AAErFptcDAAMcwADrihrAAOtOhY2EzQEAARbAAOuhgsAA65jAEgywphKoXACIrhbAAOvIgsAA67/AEgywlBOoXRbAAOv5FsAA6/GCwADr6MAS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okEBAAEawAESCY3iAMAA9dI+AT2LwAESGcASKtccwAESKRbAARIgLqW7qeinHQMAA4PAARI8wBIq14HAARJCwBIqioDAARJPwBIqfQDAAErrPz0cwAESaRbAARJgLqW7qeimqQIAAoDAARJ7wBIqfYPAARKBwBIq1wDAAErKBqoxc8ABEo/AARKgwAEVZQAAlUABGsABEpDAAO5LAAABA8ABErXAARVlAAAAAgICwAESxwAAAIOyYI9yAMABEtYAACClo2CSWQAAXAE+BU7AARL2wAETAQAAps1gkpwBIyEcwAETDxbAARMIgMABEwPAEivagdOPeUEBAAErAMAA9dIWwAETNhbAARMtFsABEyaAwAETIcASK9qB0495kk+NpJTdjk8fwAETUZK0AgACMcABE15gklkAIMABE2iSdgAAAAAAAWCSnE7AAROBwAETmgAAprJgwADyswEhHMABE80ewAETpKddAQABFsABE8KAwAETvcASK9pUj3UAQQEAASsAwAD10k7AARPewAET7gAApq5gwABLBgEcwAET+RbAARPwLqW7qeimrwUABYHAARQJwBIr5xbAARQbgMABFBbAEivalBOMHILAARQvwBIr+hbAARRGgsABFDvAEiv6lNySoxbAARRXgMABFFLAEivaVI91AMAASuI9HMABFHAWwAEUZy6lu6nopqkCAAKAwAEUgsASK9oWwAEUmITAARSIwBIstIIXwABLCQDAAErKScABFKMiIYPAARSowBIsdQAhHMABFNAWwAEUyYDAARTEwBIr2oHTj3lBAQABKwDAAPXSPgE9NQAAAAEAYKrpARbAARTqFsABFOEupbup6IQJwABKwyMcwAEU84UAwBItlEEBAAErAAArHMABFPOFAMASLZSnHgMAAoDAARUcwBIr2hbAARUrFsABFSIupbup6KQiwABKwQGmsSmrKQFcPwaqMnPAARVqwAEVe8ABFpQAAJVWARrAARVrwADuSwAAAQPAARWTwAEWlAAAAAICAsABFa8AAACDsmCPywDAARW+AAAgpaNgklkAAFwBPgFJwAEV0SEWwAEV3xbAARXWLqW7qeiERsAASr4+AUbAARXzwAEWHMABFfwAAACSR2COYwAWwAEWD4DAARYKwBIuLZVUj80+AT0cwAEWLxbAARYmLqW7qeilyAMAA4LAARZMwBIuciDAARZep00AAAAAIRbAARZ3FsABFm4upbup6IRGwABKvgCpXz8GqjNzwAEWmcABFqrAARboAACVdAEawAEWmsAA7ksAAAEDwAEWvMABFugAAAACAgLAARbLAAAAg7JgkDEAwAEW2gAAIKWjYJJZAABcAT4ABqo0c8ABFu3AARbywAEY+AAApkQAAAABA8ABFw/AARj4AAAAAQEBwAEXKQAAAIOyYKjvAABcAT4CTsABFznAARdGAACUlmCd0gEewAEXVZ3ZAQABHMABF4QWwAEXbBbAARdjLqW7qeil2cAASr+ZyAIAAhbAARe4FsABF68WwAEXpi6lu6nolG7AAErClJSSkBbAARfPFsABF8iAwAEXw8ASL0yB044NkmmNGwCYFgA9HMABF+4WwAEX5S6lu6nopq8GAAUrFsABGBqAwAEYFcASL0yUE4wcJsABGDsBHMABGDuBwAEYLsASL1+SZgEAARbAARh5FsABGGwWwAEYYxbAARhcgMABGFfAEi9MgdOODZJPjWKU3Y5PlUWSqQCd4WCSnBbAARiiFsABGJkupbup6JRuwABKwhbAARi5gMABGLTAEi9Mpeio8QGmyynAAEriBqo1c8ABGP3AARkCwAEbPwAApkYAAAABA8ABGSTAARs/AAAAAgICwAEZSgAAAIOyYKj2AMABGVkAAAClo2CSWQAAXAE+A0nAARlsIRzAARmFFsABGXWAwAEZcMASMJ+VGo9mQQEAASsAwAD10j4BPTUAAAABAGDAAEYAARbAARmfFsABGZYupbup6KPJwABKwCMcwAEZsIIAwBIw6UEBAAErAAArHMABGbCCAMASMOmkGgQABBbAARnAFsABGbcupbup6ICgwABKvRbAARnKgMABGcXAEjCflBOMHCeB0x/AARnuwABGEAEAARbAARoRgMABGgzAEjCflRqPZgAAwABGAgFcP07AARoywAEaQgAApq5gwABLBgEcwAEaTRbAARpELqW7qeinEAgABYDAARpswBIwnysWwAEafYDAARp4wBIwn5QTjBwqgcABGpDAEjCsA6cfFsABGruAwAEatsASMJ+VGo9mpyAWwAEa5YDAARrgwBIwn4Cwj2JUFsABGwOAwAEa/sASMJ9Uj2PAAErmPRfAARsYgMABGxPAEjCfpZsWwAEbN4LAARsnwBIxf4IXwABLCaj4Bqo2c8ABG0TAARtJwAEc+gAApkgAAAABA8ABG2bAARz6AAAAAgICwAEbhwAAAIOyYKj/AMABG5YAAAClo2CSWQAAXAE+AknAARupIRzAARvCFsABG7KAwAEbrcASMliVGo7uQQEAASsAwAD10j4BPTUAAAABAGDAAEYAARbAARvcFsABG9Mupbup6KPJwABKwCMcwAEb7YIAwBIyokEBAAErAAArHMABG+2CAMASMqKkGgQABBbAARv9FsABG/Qupbup6ICgwABKvRbAARwHgMABHALAEjJYlBOMHCeB0x/AARwrwABGEAEAARbAARxOgMABHEnAEjJYlRqO7gAAwABGAgFcPz0cwAEcdBbAARxrLqW7qeinEgYABIDAARyFwBIyWCsWwAEcloDAARyRwBIyWJQTjByBwAEcosASMmUCpx8WwAEczYDAARzIwBIyWJUaju6nIRbAARzxgMABHOzAEjJYgLCO68AASugGqjdzwAEc/8ABHQTAASF/AACmTgAAAAEDwAEdIMABIX8AAAABAQHAAR05AAAAg7JgqQ0AAFwBPgROwAEdScABHVwAAKZMYI5jARbAAR1jgMABHV7AEjPFpkypDz0cwAEdhBbAAR17LqW7qeilyAMAA4HAAR2UwBIz2CDAAR2up00AAAAAKQCpX07AAR3MwAEd2wAApyJgklkBHsABHd2nWQIAAoHAAR3twBIz2BbAAR4BLqW7qegARsABHhHAAR48wAEeGgAAAKNYYKkGABbAAR4tgMABHijAEjPFpk2pED4CRsABHkTAAR5/wAEeTQAAAKcjYI5jABbAAR5qg8ABHl/AEjRfpkqpCD4CTsABHpLAAR6lAACnJGCSWQEcwAEevBbAAR6zLqW7qeilyAMAA4TAAR7MwBI0iYLAAR7cwBI0KCkAqV9JwAEfVCEcwAEfYhbAAR9ZLqW7qeim3wIAAoLAAR9vwBI0KIXAAR9/wBI0qwDAAErNPgE9HMABH7AWwAEfqRbAAR+gLqW7qeilvsAASsWdOAQAAxzAAR/wGsABH8qHI4TNAgACgsABIBHAEjQohcABICHAEjSrAIiuFsABIFOEwAEgRMASNImUE4wcGsABIG2DbAGB5zHAASCOYIixARzAASDKGsABIKCHJoHrAwADFsABIPUWwAEg7C6lu6nogKDAAEq9FsABIQ2BwAEg+sASM9iUE4wcGsABIRmDbACIpsAASjc/PRzAASFWFsABIU0upbup6KZsAQABFsABIXCDwAEhZcASNF+STJGiAKliBqo4c8ABIYTAASGJwAEiMgAAplAAAAABA8ABIaPAASIyAAAAAgICwAEhwQAAAIOyYKkVAMABIdAAAAClo2CSWQAAXAE+Aj0XwAEh6IDAASHjwBI2G6WbFsABIhYWwAEiChbAASIAFsABIfcupbup6IQqwABKppsimSKUpoz8qRdKwAEiIwErBqo5c8ABIjfAASI8wAElMgAAplIAAAABA8ABImXAASUyAAAAAgICwAEikgAAAIOyYKkcAMABIqEAAAClo2CSWQAAXAE+Bk7AASLBAAAAps1gkpwATsABItoAAACU3GCSWQBJwAEi6iEcwAEi/xbAASLzgMABIu7AEjaimFCpHkEBAAErAMAA9dI+Aj2KwAEjEMASNsIWwAEjNxbAASMuFsABIyKAwAEjHcASNqKYUKkekk+NJJTdjk89i8ABI0vAEjbQHsABI1inXAEAARbAASN6gMABI3XAEjaimFCpHgA+Aj2KwAEjm8ASNsIfwAEjrJK0AgACMcABI7lgklkAIMABI8OSdgAAAAAAPYvAASPZwBI20CDAASPsknYAAAAATsABJB/AASQvAACmrmDAAEsGARzAASQ6FsABJDEupbup6KavBQAFgcABJFPAEjavFsABJG2AwAEkaMASNqKUE4wcgsABJIHAEjbCg8ABJJXAEjbQFsABJK6AwAEkqcASNqKl6KkhAMAASuI9F8ABJMuAwAEkxsASNqKlmxbAASTqhMABJNrAEjecghfAAEsJqTFKwAEk9AEcwAEk+y6mVQIAAoDAASUcwBI2ooHAASUiwBI2rwCqOwaqOnPAASU3wAElPMABJxQAAKZUAAAAAQPAASVVwAEnFAAAAAICAsABJXIAAACDsmCpJwDAASWBAAAApaNgklkAAFwBPgM9NQAAAAEAYI5jARbAASZSgMABJk3AEjh6kkepKSMcwAEmZBbAASZdgsABJl3AEjibklGMG0EBAAErAMAA9dIXwAEmXYLAASZdwBI4m5JRgMABJmjAEjh6jBsrAWCMFT0cwAEmfBbAASZzLqW7qeilyAMAAxbAASaagMABJpXAEjh6kkepKSDAASasp00AAAAAIRbAASbFFsABJrwupbup6IRGwABKvgCpX0rAASbWARzAASbdLqZVAgACgMABJv7AEjh6gcABJwTAEjiHAKo7Bqo7c8ABJxnAAScewAEn4gAAplUAAAABA8ABJz7AASfiAAAAAgICwAEnYgAAAIOyYKkvAMABJ3EAAAClo2CSWQAAXAE+Az0cwAEniYDAASeEwBI5kKZWp1cAAAAAqTk9F8ABJ6uAwAEnpsASOZClmyDAASfAknYAAAAAqTFKwAEn0wErBqo8c8ABJ+fAASfswAEoLAAAlYMAAAABA8ABJ//AASgsAAAAAgICwAEoDwAAAIOyYJB0AMABKB4AACClo2CSWQAAXAE+AAaqPXPAASgxwAEoQsABKNYAAJWHARrAASgywADuSwAAAQPAAShMwAEo1gAAAAICAsABKFMAAACDsmCQhgDAAShiAAAgpaNgklkAAFwBPgE9HMABKH4WwAEodS6lu6nopcgDAAMWwAEonIDAASiXwBI6Y5JHkIggwAEorqdNAAAAACEWwAEoxxbAASi+LqW7qeiERsAASr4AqV8Gqj5zwAEo28ABKODAASkzAACnJQAAAAEDwAEo8sABKTMAAAABAQHAASkBAAAAg7JgqUEAAFwBPgE9HMABKRYWwAEpDS6lu6nopmwBAAEWwAEpKoDAASklwBI69JJMkd0AqWIGqj9zwAEpOMABKT3AASnsAACmXgAAAAEDwAEpUsABKewAAAABAQHAASlkAAAAg7JgqUcAAFwBPgI9HMABKXkWwAEpcC6lu6nopmwBAAEWwAEpjYDAASmIwBI7V5JMkc4AqWJGwAEpmMABKcDAASmhAAAApyZgqUEAFsABKbCAwAEpq8ASO1emXalJPgE9HMABKcgupyUBAAGBwAEp28ASO5wAqj4GqkBzwAEp8cABKfbAASqAAACmYAAAAAEDwAEqDcABKoAAAAABAQHAASohAAAAg7JgqU4AAFwBPgI9HMABKjYWwAEqLS6lu6nopmwBAAEWwAEqSoDAASpFwBI7/JJMkeYAqWI9HMABKl4WwAEqVS6lu6nopmwBAAEWwAEqcoDAASptwBI7/JXXkecAqWIGqkFzwAEqhcABKorAASstAACmbgAAAAEDwAEqosABKy0AAAACAgLAASq+AAAAg7JgqWUAwAEqzQAAAKWjYJJZAABcAT4CPRfAASrlgMABKuDAEjyJpZsWwAErERbAASsHFsABKv0WwAEq9C6lu6nohCrAAEqmmyqZJ5SmjPypZ0rAASseASsGqkJzwAErMsABKzfAAS2LAACmfAAAAAEDwAErVsABLYsAAAACAgLAASt5AAAAg7JgqXYAwAEriAAAAKWjYJJZAABcAT4JTsABK6QAAAClvGCSWQBOwAErtsABK7sAAJ05YI5jARbAASvCgMABK73AEj0QnTmno0nAASvMJcABK9WDwAEr0MASPT5gjnY+AT2KwAEr7cASPTA1AAAAAQBgklkBFsABK/0UwAEr+MASPT4DAWCOdpUUjnkjHMABLAqEAMASPYNBAQABKwAAFsABLBsWwAEsEhTAASwNwBI9PgMBYI52kkuOeIIXkgiEAMASPYMBYJJZP07AASw0wAEsQQAApb1gklkBIMABLEmnTQAAAABOwAEsYMABLGYAAIIRYI5jARbAASxtgMABLGjAEj0QghGnpUnAASx4JcABLIKFwAEsfMASPf5gjoI+Aj2MwAEsmsASPeIWwAEsuBbAASyvFMABLKnAEj3+BQFgjoKSS46EgheSCEnAASzEIRzAASzNg8ABLMjAEj0+QQEAASsAwAD10j4BPRzAASzlgMABLODAEj0QpdCnVwMAAxbAASzzLqW7qeiDwAEs/cASPT6EwAEtA8ASPeIAqTo/Pz0cwAEtKYDAAS0kwBI9EKW6p1cDAAMWwAEtMy6lu6nogsABLT3AEj0whMABLUfAEj3iAKeuPRzAAS1fgMABLVrAEj0QplanVwAAAACpOUrAAS18ASsGqkNzwAEtkMABLZXAATNBAACmggAAAAEDwAEttcABM0EAAAABAQHAAS3SAAAAg7JgqXwAAFwBPghOwAEt4sABLfYAAKaBYI5jARbAAS39gMABLfjAEj81poGphk7AAS4awAEuJwAApydgklkBIxbAAS4ugMABLinAEj81pn6nV6mAIMABLkenTQAAAAAWwAEuXIDAAS5XwBI/NYIXkggBYJJZTsABLm8AAAClm2CSWQBOwAEuigAAAKa0YJJZAEnAAS6fIRzAAS63gcABLqPAEj9IQQEAASsAwAD10j4DPRzAAS7RFsABLsgupbup6KXIBAADgcABLuHAEj9IgsABLvbAEj9rIiEWwAEvGBbAAS8PLqW7qeiERsAASr4BFsABLyuAwAEvJsASPzWmfqdXqYABpdEpqV89jMABL2PAEj/AHsABL3WnWQIAAoHAAS+FwBI/SBbAAS+aLqW7qegAPYvAAS+rwBI/shzAAS/DFsABL7oupbup6KcoAQABhMABL9jAEj/AAMAASt0+AT2LwAEv/cASP7IgwAEwEpJ2AAAAAEnAATArFsABMDSAwAEwL8ASPzWmfqdXqYA+Aj01AAAAAQBgwABGAAEWwAEwVxbAATBOLqW7qeijycAASsAjHMABMGiFAMASQM5BAQABKwAAKxzAATBohQDAEkDOpBoEAAQWwAEweBbAATBvLqW7qeiAoMAASr0WwAEwgoDAATB9wBI/NZQTjBwnghcfwAEwpMAARhcBAAGDwAEwwMASP7IAAMAARgIBXD0XwAEw24DAATDWwBI/NYIXg8ABMOLAEj+ykgg/ScABMPohHMABMQ8WwAExA4DAATD+wBI/NZJFkgpBAQABKwDAAPXSPgJOwAExJMABMTgAAKcpYI5jARzAATFDFsABMToupbup6KXKBQAEFsABMWSAwAExX8ASPzWCF5IIhMABMWrAEj/AFsABMYCAwAExe8ASPzWSRZIKFsABMZKAwAExjcASPzWUE4wcAaXRJcABMcEWwAExvIDAATG3wBI/NYIXkghgknfAAErOScABMdUhHMABMe2FwAEx2cASQaBBAQABKwDAAPXSPgE9F8ABMgWAwAEyAMASPzWSRYXAATITwBJBoJIKPz9JwAEyOiEWwAEySBbAATI/LqW7qeiERsAASr4+Ak7AATJxwAEyeQAAhAlgqukBFsABMoQWwAEyey6lu6nohAnAAErDScABMpMWwAEynIDAATKXwBI/NaZ+p1epgD4BPRzAATLAhcABMrjAEkKApyoDAAKAwAEy7sASPzUWwAEy/RbAATL0LqW7qeikIsAASsEBprEpqyY/PwaqRHPAATNGwAEzS8ABNMoAAKaEAAAAAQPAATNywAE0ygAAAAICAsABM50AAACDsmCpjwDAATOsAAAApaNgklkAAFwBPgNOwAEzw8ABM8oAAIEQXAEcwAEzzC6mVQIAAoDAATPtwBJDIYHAATPzwBJDLgCqOz0cwAE0DhbAATQFLqW7qeimrwUABYHAATQnwBJDLhbAATRBgMABNDzAEkMhlBOMHBrAATRmwABKuyDAATSFknYAAAAAFsABNKGAwAE0nMASQyGmAKmRAMAASuJKwAE0uQGCwAE0wMASQ0EGqkVzwAE0z8ABNNTAATZCAACmhwAAAAEDwAE0/cABNkIAAAACAgLAATUqAAAAg7JgqZcAwAE1OQAAAKWjYJJZAABcAT4DPRzAATVVFsABNUwupbup6KXIAwADFsABNWqAwAE1ZcASRAClq6maIMABNXWnTQAAAAApAKlfPRfAATWUgMABNY/AEkQApZsjFsABNaiAwAE1o8ASRACmhqmZIMABNcOSdgAAAAAewAE126dZAgACFsABNfCAwAE168ASRAClq6maFsABNfUupbup6AABYJJZqTFKwAE2BAEcwAE2Cy6mVQIAAoDAATYswBJEAIHAATYywBJEDQCqOwaqRnPAATZHwAE2TMABOXMAAKaLAAAAAQPAATZkwAE5cwAAAAICAsABNoAAAACDsmCpoADAATaPAAAApaNgklkAAFwBPgpOwAE2vsABNscAAJJLYKl8ASbAATa+ARbAATbOgMABNsnAEkT+kkuOeGCpfE7AATbhwAE28gAApytgwADyswEWwAE2/YLAATb0wBJFHqZ5p1epgk7AATcdwAE3NAAApyxgklkBFsABNz+CwAE3NsASRR6CF5IITsABN1PAATdgAACVFGCSWQEcwAE3gRbAATdrFsABN2Iupbup6KZlqVynLQMAAxbAATeagMABN5XAEkT+pomnV6mkFsABN6aAwAE3ocASRP6miqdXqaWDwAE3rsASRUoAwABLF0nAATfFIRzAATfWhcABN8nAEkWUQQEAASsAkl0+AT01AAAAAQBgwABGAAEWwAE38BbAATfnLqW7qeijycAASsAjHMABOAGGAMASRhdBAQABKwAAKxzAATgBhgDAEkYXpBoEAAQWwAE4ERbAATgILqW7qeiAoMAASr0WwAE4G4DAATgWwBJE/pQTjBwnlRQfwAE4RcAARhcBAAGFwAE4YcASRZQAAMAARgIBXD89F8ABOICAwAE4e8ASRP6VFIXAATiPwBJFlI55TsABOKXAATiqAACCF2CSWQE1AAAAAQBgklkBhcABOKzAEkWUIxzAATi5hgDAEkbRQQEAASsAAITAATi8wBJFcYYAwBJG0QFgkllJwAE42BbAATjlgsABONzAEkUepnSnV6mEPgE9jsABOP/AEkbAHMABOQ8WwAE5Bi6lu6nopx0DAAOGwAE5IsASRsCBwAE5KMASRQuAwAE5NcASRP4AwABK6z89F8ABOUuAwAE5RsASRP6lm4bAATlawBJGwKmiSsABOWQBKwaqR3PAATl4wAE5fcABO0YAAKaNAAAAAQPAATmPwAE7RgAAAAEBAcABOZ4AAACDsmCpqgAAXAE+BU7AATmuwAE5wAAApZRgjmMBFsABOceAwAE5wsASR62llKmsTsABOeLAATnvAAClyWCSiwEWwAE6DhbAAToEFsABOfoWwAE58S6lu6nohCrAAEqmmuGY9pSmjPw9HMABOiQWwAE6Gy6lu6nopcgDAAOBwAE6PcASR8CCwAE6UMASR+MhFsABOmgWwAE6Xy6lu6nohEbAAEq+AKlfPRzAATqCFsABOnkupbup6KXKBAAEgsABOpzAEkfjHsABOrKnWQIAAoHAATrCwBJHwBbAATrVLqW7qegAFsABOu2AwAE66MASR62VT5FkFsABOw8WwAE7BYDAATsAwBJHrZVPkWSUE4wcAMAASs49HMABOykWwAE7IC6lu6nopmwBAAEWwAE7PYDAATs4wBJHrZJMkWUAqWIGqkhzwAE7S8ABO1DAAT5aAACmjwAAAAEDwAE7YsABPloAAAABAQHAATtxAAAAg7JgqbEAAFwBPgROwAE7gcABO4oAAKWQYI5jARbAATuRgMABO4zAEkkZpZCps07AATujwAE7sgAApxhgwABKfwEWwAE7vRbAATu0LqW7qeinGMAASsZJwAE70RbAATvkgsABO9XAEklPpxnAAEqCPgNOwAE7/cABPAkAAKWjYJJZARbAATwagsABPAvAEklPpxrAAEqDScABPDYiFsABPD+AwAE8OsASSRmV3JH2ACEcwAE8WoPAATxOwBJJkkEBAAErAJJdPgE9i8ABPG3AEkmSHMABPIQWwAE8ey6lu6noprwCAAKDwAE8msASSZIjFsABPMKCwAE8s8ASSU+Vv8AASoEWwAE87xbAATzlFsABPNwupbup6IQqwABKppsWmRoWwAE9IBbAAT0WFsABPQ0upbup6IQqwABKppr7mQcBYIzOAMAASvE/PRzAAT1HFsABPT4upbup6KXIAwADgcABPVfAEkksg8ABPWHAEkmSKQCpXz4BPRzAAT2RFsABPYgupbup6KXIAwADgcABPaHAEkksIMABPbGnTQAAAAApAKlfPRzAAT3ggsABPdHA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AIfTAAAgpbtgwABKuQAAYJJZAT4BSofjAR6H6qdaAQABFogDgYf6wBJR2ZRuwABKwgAGqld0iBWIKoidAACVewEaiBbAAO5LAAABA4g6iJ0AAAACAgKIRwAAAIOyYJBMAIheAAAgpbtgwABKuQAAYJJZAT4BSohuARaIkhaIiBaIfoGIdcASUjmEKsAASqaa4Zj2lKaM/AaqWHSIooi3iTAAAJVSARqIo8AA7ksAAAEDiNGJMAAAAAICAojvAAAAg7Jgj70AiQYAACClu2DAAEq5AABgklkBPgFKiRYBFokigIkdwBJSk5VRj8IGqll0iTWJSonTAACVQgEaiTbAAO5LAAABA4lkidMAAAACAgKJggAAAIOyYI+FAImZAAAgpbtgwABKuQAAYJJZAT4BSompARyJuYGJsMASUvOnMQEAAYCJysASUugAwABKywaqWnSJ2IntimIAAJVuARqJ2cAA7ksAAAEDif6KYgAAAAICAooMAAAAg7JgkAsAiiMAACClu2DAAEq5AABgklkBPgFKijMBFopXFopNFopDgYo6wBJTVYQqwABKpprhmPaUpoz8BqpbdIpninyK/wAAlZUBGopowADuSwAAAQOKk4r/AAAAAgICiq4AAACDsmCQzgCKxQAAIKW7YMAASrkAAGCSWQE+AUqK1QEciuWBitzAElO6pzEBAAGAivbAElOvAMAASssGqlx0iwSLGYufAACVTQEaiwXAAO5LAAABA4svi58AAAACAgKLSQAAAIOyYI+wAItgAAAgpbtgwABKuQAAYJJZAT4BSotwARaLlBaLihaLgIGLd8ASVByEKsAASqaa4Zj2lKaM/AaqXXSLpIu5jBwAAJVJARqLpcAA7ksAAAEDi8GMHAAAAAICAovGAAAAg7Jgj6UAi90AACClu2DAAEq5AABgklkBPgFKi+0BFowRFowHFov9gYv0wBJUgYQqwABKpprhmPaUpoz8BqpedIwhjDaMqQAAlXwBGowiwADuSwAAAQOMRoypAAAAAgICjFMAAACDsmCQVQCMagAAIKW7YMAASrkAAGCSWQE+AUqMegEWjJ4WjJQWjIqBjIHAElTmhCrAAEqmmwuZEZSmjPwGql90jK6Mw40xAACVHwEajK/AAO5LAAABA4zTjTEAAAACAgKM4AAAAIOyYI6OAIz3AAAgpbtgwABKuQAAYJJZ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AAEnp7wAq109FcAAR0HAErPQFRzAAEdsLqe9AgACFMAAR37AEqwvCQAWwABHjS6nvqtOAKsUTsAAR8HAAEfKAACnv13AAPUdAWDAAFBOATHAAEfZYMAAUE4AScAAR+kiJcAAR/cUwABH7cASrVMMAGDAAETJACEcwABIOBbAAEguFMAASCTAEq1TDAFgwABEyVTAAFAIQQEAASsAwAD10j4BRcAASFEBwABIWsAASFwAAFtgwAD0eQGTARzAAEhjFMAASGHAErTwGABcAQABFsAASHkWwABIbxTAAEhlwBKtUwwBYMAARMlUwABQCFrAAPVMAMAA9aYBFcAASIPAErTwGBzAAEiBFMAASIPAErTwGABdAQABlADAAPWePgE9HMAASKsWwABIohTAAEiYwBKtUwwBYMAARMlUwABQCICyAgACFMAASKzAErTwGAAmwABIqwEcwABIyBzAAEjEFsAASLsUwABIscASrVMMAWDAAETJVMAAUAhEAQABFMAASMXAErTwGAAAwAD1LJ13AQABFMAASM7AErR/FwAAwABQXGDAAEU/AMAA9S0/ScAASQMiJcAASQ0UwABJB8ASsaESAGDAAETJACEcwABJOhbAAEkwFMAASSrAErGhEgFgwABEyVTAAFAIQQEAASsAwAD10j4BRcAASVMBwABJXMAASV4AAFtgwAD0eQGTARzAAEllFMAASWPAErZDGABcAQABFsAASXcWwABJbRTAAElnwBKxoRIBYMAARMlUwABQCFrAAPVMAMAA9aYBFcAASYHAErZDGBzAAEl/FMAASYHAErZDGABdAQABlADAAPWePgE9HMAASaUWwABJnBTAAEmWwBKxoRIBYMAARMlUwABQCICyAgACFMAASabAErZDGAAmwABJpQEcwABJvhzAAEm6FsAASbEUwABJq8ASsaESAWDAAETJVMAAUAhEAQABFMAASbvAErZDGAAAwAD1LJ13AQABFMAAScTAErR/FwAAwABQXGDAAEU/AMAA9S0/RsAASfnAAEofwABKCgAAAKfAYMAAUE4AFMAAShXAErR/FwA+AT0cwABKQhbAAEovLqe+q06nnAEAAR/AAEphwABQjAMBYMAART8DJsAASoMBFMAASoPAErdRGABgwABFPxzAAEqMlIFWAAAAAMAA9JwrAACrlU7AAErGwABK1wAAp8Fd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AMAA9SzAAFB1Pz9JwACxCyKGwACxD8AS/nIBh8AAsR3AEv6wPgFFwACxbAHAALF1wACxdwAAW2DAAPR5AZMBHMAAsX4UwACxfMATAcwIAFwBAAEWwACxioXAALGAwBL+UlrAAPVMAMAA9aYBFcAAsZTAEwHMCBzAALGSFMAAsZTAEwHMCABdAQABlADAAPWePgE9F8AAsbAcwACxrIXAALGjwBL+UkQBAAEUwACxrcATAcwIAADAAPUslhKAwACxvsAS/cHAAFB1P0rAALHkARbAALH1hcAAsevAEv5SWsAA9UxPwACyCMAAsg0AAAGn+mEBXcAA9R0BYMAA9cVcAAPAALIZwACzqgAAAAEBAcAAsicAAACn+13AAPUdAWDAAPXFAABcAT4BRcAAsjcBwACyQMAAskIAAFtgwAD0eQGTARzAALJJh8AAskfAEwLPXAEAARbAALJShsAAskvAEwKvWsAA9UwAwAD1pgGPwACyWsATAs8cwACyXIfAALJawBMCz10BAAGWAMAA9Z4+BE7AALKYwACypAAAnWZdwABQYgJgwABQTmDAAPXFASbAALKYARzAALKshsAAsqbAEwKvRAEAAYfAALKtwBMCzwDAAPUsXcAAUGICYMAAUE5gwAD1xU7AALLBwACyyQAAImCIkwEmwACywQEcwACy0YbAALLLwBMCr0QBAAEcwACy1IfAALLSwBMCz10BAAGUAMAA9Z4AwAD1LGCIk07AALL3wACy/wAAgeddwAD1HQFgiLEBJsAAsvcBHMAAsweGwACzAcATAq9EAQABHMAAswqHwACzCMATAs9dAQABlQDAAPWeAMAA9SxdwAD1HQFgiLE9HMAAsxkunTgFAAQUwACzJMATA4UJABbAALM5FMAAsy3AEwMxCACEF8AAT+cWwACzVhbAALNRFMAAs0XAEwMxCACAsMAAUGZawAD2YRbAALN2FMAAs2rAEwMxCACEGMAAT+gBgecUwACzlMATA80KAKr8TsAAs7bAALPBAACB4GDAAPKzARbAALPRFsAAs8oWwACzwy6R5Ks9gdOliYHgnB9GwACz4cAAtBzAALPqAAAAnWZgwABPAQAWwAC0FBbAALQMFsAAs/kup6OrPpQ+q4spwAD1cT4BScAAtCQlwAC0NIfAALQowBMEzGDAAERAPgI+A07AALRuwAC0dQAAp/td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ExXwgLCS5RTAANS7wBMZBgoAAIiuPRzAANTwLqgKAwADFMAA1QjAExYVCACBwADVEcATFWmHwADVGcATFfAAqx4Gqx59wADVNsAA1TvAANdyAACoCgAAAAEDwADVUsAA13IAAAADAwPAANViAAAAImCIkwDAANVvAAAAlBNgwAD0eQDAANWJAAAAnX5gkuEAAFwBPgNOwADVswAAAIHnXcAA9R0BYIixAEnAANXAIiEcwADV0oLAANXEwBMav0EBAAErAMAA9dIAIRzAANX2FsAA1euCwADV3cATGr+UE4wcQQEAARzAANX5lIFWAAAAAMAA9JwAwAD1nD4BPYvAANZzwBMa0jHAANaNYIixARzAANa8GsAA1peFcIHrAwADFsAA1u0WwADW5ILAANbWwBMav4S+jCiBTZP6FsAA1wGCwADW88ATGr+UE4wcGsAA1w2DbACIpj89HMAA1younTgFAASAwADXNcATGqSBwADXPsATGrAawADXSoNsFsAA11QuhBirRQGB54PAANdmwBMa0qr8BqsffcAA13fAANd8wADYUgAAqAsAAAABA8AA147AANhSAAAAAgICwADXlQAAAJREYI0xAMAA16wAAACWRWCh6gAAXAE+AknAANfDFsAA19UWwADXzhbAANfHLpHkqz2B06WJgeCcH0rAANfhAD89HMAA1+0uqAwEAAMWwADYBYDAANf/wBMb+IIXjTOBwADYC8ATHAUWwADYIoDAANgcwBMb+JQTjBwBqA0pqyUGqyB9wADYV8AA2FzAAODqAACoDgAAAAEDwADYesAA4OoAAAAGAgLAANiSAAAAlkVgoeoAwADYpwAAAJQTYMAA9HkABMAA2M4AAACSXl3AAPUdAWCS4QErwADY/gAAAJRsXcAA9R0BYJICASvAANk0AAAAlG1dwAD1HQFgkgIBK8AA2VQAAACU3GCSWQErXAE+BUnAANlnFsAA2XkWwADZchbAANlrLpHkqz2B06WJgeCcH0rAANmFAD9JwADZkSEcwADZpILAANmVwBMcwkEBAAErAMAA9dI+AUbAANm1wADZ5cAA2cgAAACAz2CS4QCCwADZ1cATHMI+AT0cwADZ7y6oDAQAAxbAANoYhsAA2g7AEx1hlQqS5oDAANofwBMcpRbAANo6hsAA2jDAEx1hlBOMHAGoDSqrJT9JwADafyEc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XcAATs0CYMAAUE5blJvAAE7ZASEWwABMUBTAAExKwBNphAEBXcAATs0CYMAAUE5blJvAAE7ZP0rAAExuASkGq3V/wABMgsAATIfAAEzIAAKn3gAAAAEDwABMk8AATMgAAAACAgLAAEygAAAAnWZgwABPAQDAAEy8AAAAmutdwABPcQJgwABQTlsAAFwABqt2f8AATM3AAEzPwABQ5AAAnvEAAAABA8AATNTAAFDkAAAAAQEBwABM5AAAAJrrXcAAT3ECYMAAUE5bAABfAQABPghAFsAATRUWwABM/i6oIatGgPzAAPT/wABM/sAATRwAPRfAAE0jLqgkKatPTsAATWLAAE1rAABVXcAA9RYBYMAATwEBFsAATXIuVcAAT4RDwABNgBzAAE2QgcAATYfAE2wVVgAAAADAAPUYPgE9HMAATaQup94CAAIWwABNuoHAAE2xwBNsFVfAAPUagMAATcPAE2vMAKt1RsAATdvAAE4FwABN5QAAAIMUXcAA9R0BWwAWwABN7S6oIatGPgVOwABOFMAAThkAAICwYMAA9l0BJsAAThQBHMAATh+CwABOG8ATbIlEAQABkwDAAPUsYMAA9l1OwABONsAATkIAAJ1mYMAATwEBJsAATjYBHMAATkiCwABORMATbIlEAQABlADAAPUsYMAATwFOwABOV8AATmIAAIQXYMAA9HkBJsAATlcBHMAATmiCwABOZMATbIlEAQABlQDAAPUsYMAA9Hk9HMAATnMuozgDAAODwABOfsATbKeEwABOhMATbN2FwABOkcATbRMAq3M9HMAATqQup94CAAKEwABOscATbN2AwABOvsATa8wAq3U9F8AATtYuqCQqq089HMAATw8WwABPBxbAAE8BLp2OwABPc5nNpO+DvAEAATTAAE8XA8AATxfAAFDNAAAAAgICwABPHwAAAICwYMAA9l0AwABPMQAAAJnLYMAATwEAAGDAAPWCAT4ETsAAT03AAE9UAACSW2DAAE8BARzAAE9iFsAAT1YunujAAE91RAEAAYLAAE9jwBNt0wClJEnAAE9wIiIcwABPe4TAAE90wBNt+0EBAAErAMAA9dIBIRbAAE+OhMAAT4fAE237hELAAE8PARbAAE+ghMAAT5nAE237g+DAAE8QSsAAT6kAPz0cwABPty6dOAQABBzAAE/eGsAAT8KDxYTNAQAB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gIq0BbQVtCYBAqltAAAAAQO0JrQmAAAAAAAAAGCwrQAGrUCAirQrtD20TQECqW4AAAABA7RNtE0AAAAAAAAAYMAAWF0ABq1BgIq0UrRotIIBAqlvAAAAAQO0grSCAAAAAAAAAGCw7AAGrUKAirTatOq09wECqXAAAAABA7T3tPcAAAAAAAAAYLCtAAatV4CKteS16bYNAAKpcQAAAAEDtfi2DQAAAAEBAbYGAAAAkltgsL8AAGDAAPKzAAatWICKthK2HrZrAAKpcgAAAAEDtjK2awAAAAICArZGAAAAmTxgsK0AtlsAAACog2DAAFOVAABgsK0AAAATvOcAE70KABO9LQATvVAAE71zABO9lgATvbkAE73cABO9/wATviIAE75FABO+aAATvosAE76uABO+0QATvvQAE78XABO/OgATv10AE7+AABO/owATv8YAE7/pABPADAATwC8AE8BSABPAdQATwJgAE8C7ABPA3gATwQ4AE8ExABPBYQATwYYAE8GrABPB0AATwfUAE8IaABPCPwATwmQAE8KJABPCrgATwtMAE8L4ABPDHQATw0IAE8N1ABPDqAATw+kAE8QcABPETwATxIIAE8SyABPE4gATxRIAE8VgABPFkgATxbUAE8XaABPF/QATxiAAE8ZDABPGZgATxokAE8asABPGzwATxvIAE8cVABPHOAATx1sAE8eLABPHrgATx9EAE8f0ABPIFwATyDoAE8hdABPIgAATyKMAE8jGABPI6QATyQwAE8kvABPJUgATyXUAE8mYABPJuwATyd4AE8oBABPKJAATykcAE8pqABPKjQATyrAAE8rTABPK9gATyxkAE8s8ABPLXwATy4IAE8ulABPLyAATy+sAE8wOABPMMQATzFQAE8x3ABPMmgATzL0AE8zgABPNAwATzTMAE81WABPNeQATzakAE83MABPN7wATzhIAE841ABPOWAATznsAE86eABPOwQATzuQAE88HABPPKgATz00AE89wABPPkwATz7YAE8/ZABPP/AAT0B8AE9BCABPQZQAT0IgAE9CrABPQzgAT0PEAE9EUABPRNwAT0VoAE9F9ABPRoAAT0cMAE9HmABPSCQAT0iwAE9JPABPScgAT0pUAE9K4ABPS2wAT0v4AE9MhABPTRAAT02cAE9OKABPTrQAT09AAE9PzABPUFgAT1DkA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QlnAAEJfwADiXAOplAAAAWDAAPXFAANgrJNgrVtgrWpuBK2HgIrAAELPwABC0wmplaySAGCu7wAErYiAisAAQwbAAEMSGJqTrJIAYLCtASsErYmAisAAQ4rAAEOUGJqVrJIAYLCtASsErYqAisAARADAAEQJGJqXrJIAYLCtASsErYuAisAARHLAAER7GJqWrJIAYLCtASsErYyAisAAROTAAETwGJqYrJIAYLCtASsErY2AisAARWjAAEV0GJqZrJIAYLCtASsErY6AisAARezAAEX6GJqhrJIAYLCtASsErY+AisAARnjAAEaGGKmWrJIAYLCtASsErZCAisAARwTAAEcQGJqfrJIAYLCtASsErZGAisAAR4jAAEeSGJqUrJIAYLCtASsErZKAisAAR/7AAEgIGJqgrJIAYLCtASsErZOAisAASHTAAEiEGJqvrJIAYLCtASsErZSAisAASQjAAEkSGJqarJIAYLCtASsErZWAisAASX7AAEmHGJqbrJIAYLCtASsErZaAisAASfDAAEn5GJqcrJIAYLCtASsErZeAisAASmLAAEp3GKmXrJIAYLCtASsErZiAisAASyjAAEs2GJqdrJIAYLCtASsErZmAisAAS7TAAEvAGJqurJIAYLCtASsErZqAisAATDnAAExFGJqwrJIAYLCtASsErZuAisAATMDAAEzMGJqSrJIAYLCeASsErZyAisAATVnAAE1mGJqtrJIAYLCeASsErZ2AisAATkPAAE5SGJrArJIAYLCeASsErZ6AisAATtjAAE7pGKmYrJIAYLCeASsErZ+AisAAT37AAE+OGKmZrJIAYLCeASsEraCAisAAUBnAAFAtGKmarJIAYLCeASsEraGAisAAUMPAAFDSGKmbrJIAYLCeASsEraKAisAAUa7AAFG+GKmcrJIAYLCeASsEraOAisAAUlbAAFJlGKmdrJIAYLCtASsEraSAisAAUvfAAFMPGKmerJIAYLDsASsEraWAisAAVG/AAFSdGKmfrJIAYMAA8rMBKgStpoCKwABUs8AAVNkYqaCskgBgsOwBKwStp4CKwABZFcAAWScYqaGskgBgsNQBKwStqICKwABxTcAAcV0YqaKskgBgsK0BKwStqYCKwABy1cAAcusYqaOskgBgsOwBKwStqoCKwABzAcAAcxwYqaSskgBgsOwBKwStq4CKwABzL8AAc0YYqaWskgBgsNQBKwStrICKwABzWcAAc3UYqaaskgBgsNQBKwStrYCKwAB3g8AAd5MYqaeskgBgsK0BKwStroCKwAB4PcAAeFMYqaiskgBgsOwBKwStr4CKwAB4acAAeIQYqamskgBgsOwBKwStsICKwAB4l8AAeK4YqaqskgBgsNQBKwStsYCKwAB4wcAAeN0YqauskgBgsNQBKwStsoCKwAB878AAfQIYqayskgBgsNQBKwSts4CKwACGvsAAhtYYqa2skgBgsNQBKwSttICKwACHfMAAh5cYqa6skgBgsNQBKwSttYCKwACIUMAAiHEYqa+skgBgsNQBKwSttoCKwACKKsAAij0YqbCskgBgsK0BKwStt4CKwACKx8AAitUYqbGskgBgsK0BKwStuICKwACLUsAAi18YqbKskgBgsK0BKwStuYCKwACL2cAAi+cYqbOskgBgsK0BKwStuoCKwACMZMAAjG8YqbSskgBgsK0BKwStu4CKwACM3cAAjOsYqbWskgBgsK0BKwStvICKwACNaMAAjXQYqbaskgBgsK0BKwStvYCKwACN68AAjfcYqbeskgBgsK0BKwStvoCKwACObsAAjosYqbiskgBgsK0BKwStv4CKwACPPcAAj1wYqbmskgBgsK0BKwStwICKwACQFMAAkC4YqbqskgBgsK0BKwStwYCKwACQzcAAkOUYqbuskgBgsK0BKwStwoCKwACRfsAAkY8YqbyskgBgsK0BKwStw4CKwACSFcAAki0Yqb2skgBgsK0BKwStxICKwACSyMAAktwYqb6skgBgsK0BKwStxYCKwACTa8AAk30Yqb+skgBgsK0BKwStxoCKwACUBsAAlB0YqcCskgBgsK0BKwStx4CKwACUtcAAlM4YqcGskgBgsK0BKwStyICKwACVbMAAlX8YqcKskgBgsK0BKwStyYCKwACWC8AAlhkYqcOskgBgsK0BKwStyoCKwACWlsAAlqQYqcSskgBgsK0BKwSty4CKwACX/sAAmBkYqcWskgBgsNQBKwStzICKwACZasAAmYIYqcaskgBgsOwBKwStzYCKwACaIcAAmjMYqceskgBgsNQBKwStzoCKwACayMAAmtMYqciskgBgsNQBKwStz4CKwACfFsAAnyQYqcmskgBgsNQBKwSt0ICKwACfrcAAn74YqcqskgBgsNQBKwSt0YCKwACgUMAAoGQYqcuskgBgsNQBKwSt0oCKwACg8sAAoP8YqcyskgBgsK0BKwSt04CKwAChk8AAoaUYqc2skgBgsK0BKwSt1ICKwACi2MAAoukYqc6skgBgsK0BKwSt1YCKwAClPMAApUkYqc+skgBgsK0BKwSt1oCKwAClt8AApckYqdCskgBgsK0BKwSt14CKwACmTMAApl0YqdGskgBgsK0BKwSt2ICKwACm2sAApu8YqdKskgBgsK0BKwSt2YCKwACn9MAAqAkYqdOskgBgsK0BKwSt2oCKwACohsAAqJgYqdSskgBgsK0BKwSt24CKwACpG8AAqScYmsGskgBgsK0BKwSt3ICKwACpn8AAqbQYqdWskgBgsNEBKwSt3YCKwACqQsAAqloYqdaskgBgsNEBKwSt3oCKwACq8cAAqwkYqdeskgBgsK0BKwSt34CKwACrn8AAq7wYqdiskgBgsL8BKwSt4ICKwACsesAArJYYqdmskgBgsK0BKwSt4YCKwACwt8AAsM0YqdqskgBgsK0BKwSt4oCKwACxWMAAsXAYqduskgBgsOwBKwSt44CKwACyFcAAsiAYqdyskgBgsNQBKwSt5ICKwACynMAAsqgYqd2skgBgsNQBKwSt5YCKwACzJ8AAszQYqd6skgBgsNQBKwSt5oCKwACztsAAs84Yqd+skgBgsNQBKwSt54CKwAC0a8AAtIcYqeCskgBgsNQBKwSt6ICKwAC1OsAAtVEYqeGskgBgsNQBKwSt6YCKwAC7MsAAu1kYqeKskgBgsNQBKwSt6oCKwADRKcAA0UMYqeOskgBgsK0BKwSt64CKwADR28AA0e0YqeSskgBgsK0BKwSt7ICKwADT4cAA0/sYqeWskgBgsNEBKwSt7YCKwADUwcAA1NwYqeaskgBgsOwBKwSt7oCKwADV3cAA1fIYqeeskgBgsK0BKwSt74CKwADWx8AA1t8YqeiskgBgsK0BKwSt8ICKwADX7sAA1/wYqemskgBgsK0BKwSt8YCKwADYt8AA2MUYqeqskgBgsK0BKwSt8oCKwADZecAA2ZcYqeuskgBgwADyswEqBK3zgIrAANmnwADZuRip7KySAGCwrQErBK30gIrAANnJwADZ3Bip7aySAGCwrQErAQWu7oCKwABC2MAAQtjAAEL1AAAAA8AAQurAAEL1AAAAAQEBwABC8AAABKmVYK7vAABgrYQBPwIIAa2HgADAE+04CQHAAELYwAD12wAAAACA9Qat9oCKwABDFsAAQzLAAEN5AQCbDQEawABDF8AA7ksAAAEDwABDPsAAQ3kAAAAAAAAAYLCtAUrAAENHATUAAAABAGCwrQEWwABDRy6ak6ySrYgjHMAAQ1SAAMAT7aNBAQABKwDAAPXSF8AAQ0cumpOskhzAAENYLqnurJICAAIWwABDYy6a664JJ5qAAK64rYiAAMAT7aMBYLCtBq33gIrAAEOYwABDtMAAQ+8BAJrhARrAAEOZwADuSwAAAQPAAEO+wABD7wAAAAAAAABgsK0BSsAAQ8EBNQAAAAEAYLCtARbAAEPBLpqVrJKtiSMcwABDzIAAwBPuPkEBAAErAMAA9dIXwABDwS6alaySHMAAQ9Auqe6skgIAAhbAAEPbLprrrgknmoIArritiYAAwBPuPgFgsK0GrfiAisAARA3AAEQpwABEYQEAmwwBGsAARA7AAO5LAAABA8AARDLAAERhAAAAAAAAAGCwrQFKwABENQE1AAAAAQBgsK0BFsAARDUumpeskq2KIxzAAEQ/gADAE+7ZQQEAASsAwAD10hfAAEQ1LpqXrJIcwABEQy6p7qySAgACFsAARE4umuuuCSeahACuuK2KgADAE+7ZAWCwrQat+YCKwABEf8AARJvAAETTAQCa9AEawABEgMAA7ksAAAEDwABEpMAARNMAAAAAAAAAYLCtAUrAAESnATUAAAABAGCwrQEWwABEpy6alqySrYsjHMAARLGAAMAT73RBAQABKwDAAPXSF8AARKcumpaskhzAAES1LqnurJICAAIWwABEwC6a664JJ5qDAK64rYuAAMAT73QBYLCtBq36gIrAAET0wABFEMAARVcBAJrsARrAAET1wADuSwAAAQPAAEUcwABFVwAAAAAAAABgsK0BSsAARSUBNQAAAAEAYLCtARbAAEUlLpqYrJKtjCMcwABFMoAAwBPwD0EBAAErAMAA9dIXwABFJS6amKySHMAARTYuqe6skgIAAhbAAEVBLprrrgknmoUArritjIAAwBPwDwFgsK0GrfuAisAARXjAAEWUwABF2wEAmyEBGsAARXnAAO5LAAABA8AARaDAAEXbAAAAAAAAAGCwrQFKwABFqQE1AAAAAQBgsK0BFsAARakumpmskq2NIxzAAEW2gADAE/CqQQEAASsAwAD10hfAAEWpLpqZrJIcwABFui6p7qySAgACFsAARcUumuuuCSeahgCuuK2NgADAE/CqAWCwrQat/ICKwABF/sAARhrAAEZnAQCa7QEawABF/8AA7ksAAAEDwABGKMAARmcAAAAAAAAAYLCtAUrAAEYxATUAAAABAGCwrQEWwABGMS6aoaySrY4jHMAARkCAAMAT8UVBAQABKwDAAPXSF8AARjEumqGskhzAAEZELqnurJICAAIWwABGTy6a664JJ5qMAK64rY6AAMAT8UUBYLCtBq39gIrAAEaKwABGpsAARvMBAKjSARrAAEaLwADuSwAAAQPAAEa0wABG8wAAAAAAAABgsK0BSsAARr0BNQAAAAEAYLCtARbAAEa9LqmWrJKtjyMcwABGzIAAwBPx4EEBAAErAMAA9dIXwABGvS6plqySHMAARtAuqe6skgIAAhbAAEbbLprrrgknqe8Arritj4AAwBPx4AFgsK0Grf6AisAARxTAAEcwwABHdwEAmyIBGsAARxXAAO5LAAABA8AARzzAAEd3AAAAAAAAAGCwrQFKwABHRQE1AAAAAQBgsK0BFsAAR0Uump+skq2QIxzAAEdSgADAE/J7QQEAASsAwAD10hfAAEdFLpqfrJIcwABHVi6p7qySAgACFsAAR2EumuuuCSeaiwCuuK2QgADAE/J7AWCwrQat/4CKwABHlsAAR7LAAEftAQCbCwEawABHl8AA7ksAAAEDwABHvMAAR+0AAAAAAAAAYLCtAUrAAEe/ATUAAAABAGCwrQEWwABHvy6alKySrZEjHMAAR8qAAMAT8xZBAQABKwDAAPXSF8AAR78umpSskhzAAEfOLqnurJICAAIWwABH2S6a664JJ5qBAK64rZGAAMAT8xYBYLCtBq4AgIrAAEgMwABIKMAASGMBAJsqARrAAEgNwADuSwAAAQPAAEgywABIYwAAAAAAAABgsK0BSsAASDUBNQAAAAEAYLCtARbAAEg1LpqgrJKtkiMcwABIQIAAwBPzsUEBAAErAMAA9dIXwABINS6aoKySHMAASEQuqe6skgIAAhbAAEhPLprrrgknlHQArritkoAAwBPzsQFgsK0GrgGAisAASIjAAEikwABI9wEAmxQBGsAASInAAO5LAAABA8AASLTAAEj3AAAAAAAAAGCwrQFKwABIvQE1AAAAAQBgsK0BFsAASL0umq+skq2TIxzAAEjOgADAE/RMQQEAASsAwAD10hfAAEi9LpqvrJIcwABI0i6p7qySAgACFsAASN0umuuuCSebFQCuuK2TgADAE/RMAWCwrQauAoCKwABJFsAASTLAAEltAQCa/QEawABJF8AA7ksAAAEDwABJPMAASW0AAAAAAAAAYLCtAUrAAEk/ATUAAAABAGCwrQEWwABJPy6amqySrZQjHMAASUqAAMAT9OdBAQABKwDAAPXSF8AAST8umpqskhzAAElOLqnurJICAAIWwABJWS6a664JJ5qHAK64rZSAAMAT9OcBYLCtBq4DgIrAAEmLwABJp8AASd8BAJsBARrAAEmMwADuSwAAAQPAAEmwwABJ3wAAAAAAAABgsK0BSsAASbMBNQAAAAEAYLCtARbAAEmzLpqbrJKtlSMcwABJvYAAwBP1gkEBAAErAMAA9dIXwABJsy6am6ySHMAAScEuqe6skgIAAhbAAEnMLprrrgknmwIArritlYAAwBP1ggFgsK0GrgSAisAASf3AAEoZwABKUQEAmwMBGsAASf7AAO5LAAABA8AASiLAAEpRAAAAAAAAAGCwrQFKwABKJQE1AAAAAQBgsK0BFsAASiUumpyskq2WIxzAAEovgADAE/YdQQEAASsAwAD10hfAAEolLpqcrJIcwABKMy6p7qySAgACFsAASj4umuuuCSeaiACuuK2WgADAE/YdAWCwrQauBYCKwABKe8AASpfAAEsXAQCo0wEawABKfMAA7ksAAAEDwABKrMAASxcAAAAAAAAAYLCtAUrAAEqvATUAAAABAGCwrQEWwABKry6pl6ySrZcjHMAASsWAAMAT9rhBAQABKwDAAPXSF8AASq8uqZeskhzAAErPLqnurJICAAIcwABK3xbAAEraLqmVrJKth5/nAQABGsAASvKsZgCu9yekcgCuuK2XgADAE/a4AWCwrQauBoCKwABLOsAAS1bAAEujAQCa+wEawABLO8AA7ksAAAEDwABLZMAAS6MAAAAAAAAAYLCtAUrAAEttATUAAAABAGCwrQEWwABLbS6anaySrZgjHMAAS3yAAMAT92lBAQABKwDAAPXSF8AAS20ump2skhzAAEuALqnurJICAAIWwABLiy6a664JJ5qJAK64rZiAAMAT92kBYLCtBq4HgIrAAEvEwABL4MAATCgBAJruARrAAEvFwADuSwAAAQPAAEvswABMKAAAAAAAAABgsK0BSsAAS/UBNQAAAAEAYLCtARbAAEv1LpqurJKtmSMcwABMAoAAwBP4BEEBAAErAMAA9dIXwABL9S6arqySHMAATAYuqe6skgIAAhbAAEwRLprIrgonAwCuuK2ZgADAE/gEAWCwrQauCICKwABMScAATGXAAEytAQCbFgEawABMSsAA7ksAAAEDwABMccAATK0AAAAAAAAAYLCtAUrAAEx6ATUAAAABAGCwrQEWwABMei6asKySrZojHMAATIeAAMAT+J5BAQABKwDAAPXSF8AATHoumrCskhzAAEyLLqnurJICAAIWwABMli6ayK4KJ5qRAK64rZqAAMAT+J4BYLCtBq4JgIrAAEzQwABM7sAATUYBAJrrARrAAEzRwADuSwAAAQPAAEz6wABNRgAAAAAAAABgsJ4BSsAATQMBNQAAAAEAYLCeARbAAE0DLpqSrJKtmyMcwABNEIAAwBP5OUEBAAErAMAA9dIXwABNAy6akqySHMAATRkWwABNFC6playSrYef5wIAARrAAE0srGcBqfAprvetm4AAwBP5OQFgsJ4GrgqAisAATWrAAE2IwABN0wEAmsgBGsAATWvAAO5LAAABA8AATZXAAE3TAAAAAAAAAGCwngFKwABNngE1AAAAAQBgsJ4BFsAATZ4umq2skq2cIxzAAE2sgADAE/naQQEAASsAwAD10hfAAE2eLpqtrJIcwABNtRbAAE2wLqmVrJKth5/nAQABGsAATcisZQCu962cgADAE/naAWCwngauC4CKwABOVsAATnTAAE7FAQCbBQEawABOV8AA7ksAAAEDwABOg8AATsUAAAAAAAAAYLCeAUrAAE6MATUAAAABAGCwngEWwABOjC6awKySrZ0jHMAATpyAAMAT+nhBAQABKwDAAPXSF8AATowumsCskhzAAE6lFsAATqAuqZWskq2Hn+cBAAEawABOuKxtAK73rZ2AAMAT+ngBYLCeBq4MgIrAAE7twABPC8AAT2sBAKjUARrAAE7uwADuSwAAAQPAAE8cwABPawAAAAAAAABgsJ4BSsAATyUBNQAAAAEAYLCeARbAAE8lLqmYrJKtniMcwABPN4AAwBP7FkEBAAEr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AAAAAAAAAGCwrQE+AknAAKHdHMAAofQWwACh4S6pzaySrdNBAQABKwDAAPXSPgNOwACiE8AAohsAAIQJYLCeARzAAKIiFsAAoh0uqZWskq2Hn+cBAAEawACiNax6AK73ScAAokgcwACiVIDAAKJMwBQ+OEEBAAErAMAA9dJKwACiXQErPz0XwACicC6pzaySHMAAooUuqe6skgIAAoDAAKKQwBQ+OCeqPwCuuK3TP0rAAKKqARbAAKKxLqnNrJKt0wauX4CKwACi7cAAownAAKQPAQCpdQEawACi7sAA7ksAAAEDwACjGsAApA8AAAAAAAAAYLCtAT4CScAAoyAcwACjNhbAAKMkLqnOrJKt1EEBAAErAMAA9dI+A07AAKNVwACjXQAAhAlgsJ4BHMAAo2QWwACjXy6playSrYef5wEAARrAAKN3rHoArvdJwACjihzAAKOWgMAAo47AFD8kQQEAASsAwAD10krAAKOfASs/PRfAAKOyLqnOrJIcwACjxi6p7qySAgACgMAAo9HAFD8kJ6pAAK64rdQ/SsAAo/MBFsAAo/ouqc6skq3UBq7egIrAAKQUwACkL8AApGsAAKkhARrAAKQVwADuSwAAAQPAAKRBwACkawAAAAEBAcAApEkAAACAsGDAAPZdAABgsNQBSsAApFIBHMAApFIuqkGskgEAAYDAAKRmwBQ/5gCuxQauxYCKwACkcMAApH/AAKTSAACqQaySAAAAAQPAAKSSwACk0gAAAAEBAcAApJoAAACAsGDAAPZdAABgsNQBSsAApKkBJsAApKkBHMAApKkuqfSskgIAAhbAAKS8LqjVrg2AwACkzcAUQEMArrlgsNQGrsaAisAApNfAAKTjwAClKwAAqkKskgAAAAEDwACk88AApSsAAAABAQHAAKT7AAAAgLBgwAD2XQAAYLCtAUrAAKUKARzAAKUKLqnurJICAAIWwAClFS6o1a4NgMAApSbAFECzAK64Bq5ggIrAAKVNwAClacAApaYBAKkiARrAAKVOwADuSwAAAQPAAKV2wAClpgAAAAAAAABgsK0BSsAApXkBNQAAAAEAYLCtARbAAKV5LqnPrJKt1SMcwAClh4AAwBRBLUEBAAErAMAA9dIXwACleS6pz6ySHMAApYsuqkKskgEAASeqQwCuxq3VgADAFEEtAWCwrQauYYCKwAClzcAA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AAEawACt/8AAVnwArsYGrm6AisAArg7AAK4qwACukwEAqS0BGsAArg/AAO5LAAABA8AArkHAAK6TAAAAAAAAAGCwrQFKwACuSgEcwACuSi6qQqySAQABGsAAroHAAFZ9AK7GBq5vgIrAAK6XwACus8AArxoBAKkuARrAAK6YwADuSwAAAQPAAK7JwACvGgAAAAAAAABgsK0BSsAArtIBHMAArtIuqkKskgEAARrAAK8JwABWfgCuxgaucICKwACvHsAArzrAAK+mAQCpLwEawACvH8AA7ksAAAEDwACvUsAAr6YAAAAAAAAAYLCtAUrAAK9VARzAAK9VLqpCrJIBAAEawACvk8AAVn8ArsYGrnGAisAAr6vAAK/HwACv/AEAqTABGsAAr6zAAO5LAAABA8AAr97AAK/8AAAAAAAAAGCwrQFKwACv4QEcwACv4S6qQqySAQABJ6pLAK7GBq5ygIrAALABwACwHcAAsFIBAKkxARrAALACwADuSwAAAQPAALA0wACwUgAAAAAAAABgsK0BSsAAsDcBHMAAsDcuqkKskgEAASeqTACuxgauc4CKwACwV8AAsHPAALCmAQCpMgEawACwWMAA7ksAAAEDwACwicAAsKYAAAAAAAAAYLCtAUrAALCMARzAALCMLqpCrJIBAAEnqk0ArsYGrnSAisAAsNHAALDtwACxQQEAqTMBGsAAsNLAAO5LAAABA8AAsQPAALFBAAAAAAAAAGCwrQFKwACxDAE1AAAAAQBgsK0BFsAAsQwuqdqskq3hIxzAALEjgADAFErLQQEAASsAwAD10hfAALEMLqnarJIcwACxJy6qQqySAQABJ6pOAK7GreGAAMAUSssBYLCtBq51gIrAALF0wACxlsAAsgEBAKk0ARrAALF1wADuSwAAAQPAALGuwACyAQAAAAAAAABgsOwBSsAAsbEBNQAAAAEAYLDsARbAALGxLqnbrJKt4iMcwACxyoAAwBRLXEEBAAErAMAA9dIXwACxsS6p26ySHMAAsdkWwACx1C6playSrYep/wIAAhbAALHrLqknrmUnAACu/q3igADAFEtcAWCw7AaudoCKwACyJMAAskPAALKIAQCpNQEawACyJcAA7ksAAAEDwACyTsAAsogAAAAAAAAAYLDUAUrAALJXATUAAAABAGCw1AEWwACyVy6p3KySreMjHMAA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gMAAzYrAFGDAAD8GruSAisAAza3AAM3FwADOZgAAqWgBGsAAza7AAO5LAAABA8AAzdrAAM5mAAAAAQEBwADN3wAAAJJnYMAA9HkAAGCwrQE+Aj0cwADN+C6qYqySAQABgMAAzhDAFGFsAK7HSsAAzigBHMAAzi8uqkKskgEAASTAAM5hAieVRIDAAM5PwBRhbACuxgau5YCKwADOa8AAzobAAM8pAACpaQEawADObMAA7ksAAAEDwADOnMAAzykAAAABAQHAAM6hAAAAkmdgwAD0eQAAYLDUAT4CPRzAAM66LqpirJIBAAGAwADO0sAUYfUArsdKwADO6gEcwADO8S6qQaySAQABJMAAzyQCJ6iZgMAAzxLAFGH1AK7FBq6ogIrAAM8uwADPTcAAz6wBAKlqARrAAM8vwADuSwAAAQPAAM9twADPrAAAAAAAAABgsNQBSsAAz3YBHMAAz3YuqkGskgEAASepagCuxQauqYCKwADPscAAz9DAANA7AQCpawEawADPssAA7ksAAAEDwADP9sAA0DsAAAAAAAAAYLDUAUrAAM//ARzAAM//LqpBrJIBAAEnqWsArsUGruaAisAA0EDAANBRwADQ/gAAqY4BGsAA0EHAAO5LAAABA8AA0GXAAND+AAAAAQEBwADQcgAAAJk8YLCtAABgwADyswE+AUrAANB9ASIiHMAA0JAWwADQiIDAANCEwBRjHIQJsK9BAQABFsAA0JMuqZmskq2fAMAA9dIAIRzAANC4FsAA0LOAwADQr8AUYxyAsLCbQQEAASeVRADAAPZsABzAANDfFsAA0NqAwADQ1sAUYxyAsLCbgWcBAAEnlUQAwAD2bwauqoCKwADRR8AA0WPAANHKAQCpbAEawADRSMAA7ksAAAEDwADRfcAA0coAAAAAAAAAYLCtAUrAANGGATUAAAABAGCwrQEWwADRhi6p46ySreojHMAA0aGAAMAUY+1BAQABKwDAAPXSF8AA0YYuqeOskhzAANGlLqnurJICAAIWwADRsC6o2K4QJ5qLAK64reqAAMAUY+0BYLCtBq6rgIrAANHxwADSDcAA0moBAKltARrAANHywADuSwAAAQPAANIfwADSagAAAAAAAABgsK0BSsAA0igBNQAAAAEAYLCtARbAANIoLqnkrJKt6yMcwADSO4AAwBRkiEEBAAErAMAA9dIXwADSKC6p5KySHMAA0j8uqe6skgIAAhbAANJKLqjYrhAnoy4Arrit64AAwBRkiAFgsK0GrqyAisAA0m7AANKMwADSvgEAqW4BGsAA0m/AAO5LAAABA8AA0p3AANK+AAAAAAAAAGDAAFhdAUrAANKgARzAANKgLqn3rJIBAAEWwADSrC6pba6rAK68Bq6tgIrAANLDwADS5cAA02sBAKlvARrAANLEwADuSwAAAQPAANMAwADTawAAAAAAAABgsOwBSsAA0wkBNQAAAAEAYLDsARbAANMJLqnmrJKt7SMcwADTJYAAwBRle0EBAAErAMAA9dIXwADTCS6p5qySHMAA0zMuqfKskgIAAhbAANNELqlsrqonqmQArrut7YAAwBRlewFgsOwGrq6AisAA0//AANQPwADUqgEAqgQAAAABA8AA1CnAANSqAAAAAAAAAGCw0QFKwADULAEmwADULAE1AAAAAQBgsNEBFsAA1CwuqeWskq3sIxzAANRHgADAFGYTQQEAASsAwAD10hfAANQsLqnlrJImwADULAEcwADUVhbAANRRLqmVrJKth6n+AwACFsAA1G0uqWyuqicoAanwKa78YLDRreyAAMAUZhMBYLC/YLDRBq7ngIrAANTgwADU8cAA1akAAKl5ARrAANThwADuSwAAAQPAANUNwADVqQAAAAEBAcAA1SAAAACTDWCw7AAAYMAA8rMBPgJJwADVLyEcwADVTxbAANUzLqnmrJKt7UEBAAErAMAA9dI+AUrAANVgARzAANVvgMAA1WfAFGa5QQEAARbAANVyLqnmrJKt7QDAAPXSP0rAANWZASoGrq+AisAA1fbAANYSwADWtgEAqY8BGsAA1ffAAO5LAAABA8AA1ifAANa2AAAAAAAAAGCwrQFKwADWKgE1AAAAAQBgsK0BFsAA1iouqeeskq3uIxzAANZAgADAFGdgQQEAASsAwAD10hfAANYqLqnnrJIcwADWRC6p7qySAgACHMAA1lsWwADWVi6playSrYef5wIAARrAANZurG8BqfAprvcnqmUArrit7oAAwBRnYAFgsK0GrrCAisAA1uPAANb/wADXugEAqZABGsAA1uTAAO5LAAABA8AA1xfAANe6AAAAAAAAAGCwrQFKwADXIAE1AAAAAQBgsK0BFsAA1yAuqeiskq3vIxzAANc5gADAFGgUQQEAASsAwAD10hfAANcgLqnorJIcwADXPS6p7qySAgACHMAA11gWwADXUy6playSrYef5wIAARrAANdrrG8BqfAprvcnqmYArrit74AAwBRoFAFgsK0GrrGAisAA2ADAANgcwADYpgEAqXABGsAA2AHAAO5LAAABA8AA2CrAANimAAAAAAAAAGCwrQFKwADYLQE1AAAAAQBgsK0BFsAA2C0uqemskq3wIxzAANg8gADAFGjIQQEAASsAwAD10hfAANgtLqnprJIcwADYQC6p7qySAgACHMAA2FcWwADYUi6playSrYef5wIAARrAANhqrHkBqfAprvcnqmcArrit8IAAwBRoyAFgsK0GrrKAisAA2MnAANjlwADZbwEAqZEBGsAA2MrAAO5LAAABA8AA2PPAANlvAAAAAAAAAGCwrQFKwADY9gE1AAAAAQBgsK0BFsAA2PYuqeqskq3xIxzAANkFgADAFGl8QQEAASsAwAD10hfAANj2LqnqrJIcwADZCS6p7qySAgACHMAA2SAWwADZGy6playSrYef5wIAARrAANkzrHkBqfAprvcnqmgArrit8YAAwBRpfAFgsK0GrsiAisAA2eHAANnmwADcJgAAqmmskgAAAAEDwADZ/MAA3CYAAAAAAAAAXAE+AUnAANoFIRbAANoKLqnrrJKt8j4DPRfAANoqLqnrrJIprfJOwADaXcAA2mUAAIQJYLCeARzAANpsFsAA2mcuqZWskq2Hn+cBAAEawADaf6x7AK73ScAA2pwhHMAA2qiAwADaoMAUakVBAQABKwDAAPXSPgM9F8AA2rsuqeyskhzAANrVFsAA2tAuqZWskq2HqfsCAAKAwADa4cAUakUnqmoArvmt8z0XwADbAC6p7aySHMAA2xsWwADbFi6playSrYep+wIAAoDAANsnwBRqRSeqawCu+a30ScAA20ciHMAA214WwADbSy6p7KySrfNBAQABKwDAAPXSARzAANt9FsAA22kuqe2skq30QQEAASsAwAD10j4CPRfAANvLLqnsrJIrrfM9F8AA2/Auqe2skiut9D8/Pwaus4CKwADcK8AA3EfAANyaAQCpegEawADcLMAA7ksAAAEDwADcWcAA3JoAAAAAAAAAYLCtAT4CPRzAANxfLqpprJIAAAAArshKwADcfQEWwADchC6p7KySrfMGrrSAisAA3J/A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wABaZj0cwADW1IDAANbPwBTy+4ITAQABGsAA1tiv0QDAAFotBq/igIvAANcZwADXJMAA18gAAKtZAAAAAQPAANc2wADXyAAAAAEBAcAA10MAAACZPGCwrQAAYK8tAT4DScAA104hFsAA11Mun/uv0krAANdjARbAANdqLqs0r9M/TsAA14nAANeOAACqsmCvLQEcwADXnBbAANeQLqs1ryqv1UQBAAGAwADXncAU+KgAwAD1YkrAANenATUAAAABAGCvLQGBwADXrsAU+N4jHMAA17OCAMAU+RhBAQABKwAAFsAA17YuqzSv04IAwBT5GAFgry0Gr+OAi8AA2ATAANgPwADZOQAAq1oAAAABA8AA2CLAANk5AAAAAQEBwADYMAAAAJJbYLC/AABgry0BPgVJwADYPiEWwADYQy6f+6/SSsAA2FMBFsAA2FouqzSv0z9OwADYecAA2H4AAKqyYK8tARzAANiNFsAA2IAuqzavKq/WRAEAAYDAANiOwBT5eQDAAPViScAA2JshHMAA2KSBwADYn8AU+a9BAQABKwDAAPXSSsAA2K0BgcAA2LTAFPmvP0nAANi+FsAA2MmAwADYwsAU+XmUrLDEPgFKwADY4wEcwADY6i6rWQEAARbAANkEgMAA2P3AFPl5kmmwzQCv4j9KwADZIAEWwADZJy6rNK/TBq/ugIvAANmIwADZpMAA2c8BAKtbAAAAAQPAANm4wADZzwAAAAAAAABdwAD02wFgwABWvQFKwADZuwEWwADZyxbAANm7Lqs4ryqv2IHcwAD1cAav5ICLwADaDcAA2hjAANqgAACrXAAAAAEDwADaLcAA2qAAAAABAQHAANo8AAAAhB9gwABWvQAAYK8tAT4CScAA2kwhFsAA2lEun/uv0krAANphARbAANpoLqs0r9M/SsAA2nwBHMAA2pIWwADagy6rOK8qr9hEAQABgMAA2pPAFPraAMAA9WIGr+WAi8AA2tTAANrZwADbPAAAq10AAAABA8AA2ujAANs8AAAAAQEBwADa9QAAAJMNYLCtAABgwADyswE+AUrAANsEASEcwADbJxzAANsLLqtZAQABgMAA2x7AFPtiAK/iQQEAARbAANsqLqs0r9MAwAD10gav5oCLwADco8AA3KjAAN4UAACrXgAAAAEDwADcxcAA3hQAAAACAgLAANzTAAAAkxZgsL8AwADc5gAAAJoKYLC/AABgwADyswE+BU7AANz7wADdCgAAq19gry0BHMAA3Qwuq1oBAAGAwADdIMAU+9YAr+NOwADdNsAA3UMAAKtgYK8tARzAAN1FLqtaAQABgcAA3VnAFPvjAK/jScAA3WIcwADdc4PAAN1mwBT8IkEBAAEWwADddi6rNK/TAMAA9dJKwADdhgEpP0nAAN2XHMAA3aqCwADdm8AU+/pBAQABFsAA3a0uqzSv0wDAAPXSSsAA3b0BKj9KwADdzwEcwADd7BbAAN3jg8AA3dbAFPwiqqCvKq8yg8YBAAEWwADeB4LAAN34wBT7+qqgryqvMgDAAPYjBq/ngIvAAN98wADfgcAA4QEAAKthAAAAAQPAAN+owADhAQAAAAICAsAA370AAACTFmCwvwDAAN/RAAAAmgpgwABWvQAAYMAA8rMBPgVOwADf5sAA3/UAAKtfYK8tARzAAN/3LqtaAQABgMAA4AvAFP0KAK/jTsAA4CHAAOAuAACrYGCvLQEcwADgMC6rXAEAAYHAAOBGwBT9FwCv5EnAAOBPHMAA4GCDwADgU8AU/VhBAQABFsAA4GMuqzSv0wDAAPXSSsAA4HMBKT9JwADghBzAAOCXgsAA4IjAFP0wQQEAARbAAOCaLqs0r9MAwAD10krAAOCqASo/SsAA4LwBHMAA4NkWwADg0IPAAODDwBT9WKqgryqvMoPGAQABFsAA4PSCwADg5cAU/TCqoK8qrzIAwAD2Iwav6ICLwADhYcAA4WbAAOJoAACrYgAAAAEDwADhgcAA4mgAAAACAgLAAOGlAAAAhB9gwABYFADAAOG6AAAAqrJgry0AAFwBPgNJwADhxiEWwADhyy6f+6/SSsAA4dsAP0AiHMAA4hEcwADiBhbAAOH3Lqs4ryqv2EQBAAGAwADiB8AU/kAAwAD1YkEBAAErAMAA9dIBHMAA4jYcwADiKxbAAOIcLqs4ryqv2EQBAAGAwADiLMAU/kAAwAD1YkEBAAGBwADiOcAU/k8AwAD10sAA4ffAAOI9AD0cwADiUxbAAOJELqs4ryqv2ICyAgACgMAA4lTAFP5AgcAA4mDAFP5PAMAA9WMGr+mAi8AA4srAAOLPwADjmgAAq2MAAAABA8AA4ufAAOOaAAAAAgICwADi/AAAAKtkYLC/AMAA4xkAAACrZWCwvwAAXAE+AkAcwADjShzAAOM+FsAA4zEuqzavKq/WRAEAAYHAAOM/wBT/UwDAAPViQQEAASsAwAD10sAA4zHAAONRAD0cwADjZRbAAONYLqs2ryqv1oCyAgACgcAA42bAFP9THMAA43Muq1oBAAGAwADjh8AU/0YAr+MAwAD1Ywav6oCLwADj3sAA4+XAAOTZAACrZgAAAAEDwADj98AA5NkAAAACAgLAAOQCAAAAg7Jgq/EAwADkFQAAAJRXYLCjAABgwAD2XQE+A07AAOQqwADkLwAAgLBgwAD2XQEcwADkQRbAAOQxLqqqryqv2UQBAAGBwADkQsAVABIAwAD1YknAAORPHMAA5FiCwADkU8AVAClBAQABKwDAAPZsPgE9MMAA5GkfwADkc6wCAgACgMAA5JjAFQAFJMAA5L0DJ6tngcAA5LXAFQASJ4ExAD9KwADkygGCwADk0cAVACkGr+uAi8AA5SbAAOU3wADllQAAq2gAAAABA8AA5UXAAOWVAAAAAQEBwADlUQAAAKqyYK8tAABdwAD02wFgwAD2XQE+AUrAAOVdARzAAOVyFsAA5WmAwADlZMAVAOSqoK8qrzKAnwEBYMAA9l0BNMAA5XYDwADldsAA5ZAAAAABAQHAAOV3AAAAW2CwowAAYMAA9l0BSsAA5X0BHMAA5Y0WwADlfS6qqq8qr9lEAQABgcAA5Y7AFQE9AMAA9WIAwAD05gav7ICLwADn8sAA6BTAAOyxAACraQAAAAEDwADoJsAA7LEAAAADAgLAAOg+AAAAb2CA/wDAAOhaAAAAn+Zgru8AAcAA6IUAAACral3AAPYOAWCvLQErXcAA9U4CYMAA9l1dwAD1TgJgwAD2XVsBPgQ9IxzAAOingsAA6JrAFQHAQQEAASsAwAD10orAAOiawBUBwB7AAOirwAC7HwABYK8tAAArAV3AAPYOAWCvLU7AAOjYwADo4AAAlkZdwAD1TgJgwAD2XV3AAPVOAmDAAPZdWwEywADo4mDAAPZdXcAA9U4CYMAA9l1bAD0cwADpDBbAAOkHFsAA6Osuqq+vKq/agdzAAPVwg7wBAAE0wADpFAPAAOkUwADsmAAAAAEBAcAA6SIAAACUV2CwowAAYMAA9YIBPgZOwADpQ8AA6U8AAKs5XcAA9R0BYK8tARzAAOlcFsAA6VEuqu+v3EQBAAEcwADpbRbAAOldLqqqryqv2UQBAAGEwADpbsAVAp4AwAD1YgDAAPViTsAA6ZDAAOmcAACTfGCvdwEcwADpuRbAAOmeLqqvryqv2kQBAAGEwADpusAVAp4AwAD1Yk/AAOnJwADp0AAAAZiPYQFgsJ5gwAD2XQADwADp18AA6mYAAAABAQHAAOnmAAAAhAlgsJ4AAGDAAPZdAT4CTsAA6f3AAOoCAACAsGDAAPZdARzAAOoXgcAA6gTAFQGymNABAAEUwADqJsAVA2IIAACu9krAAOo4ASMcwADqRBTAAOo/wBUDeQkAQQEAAScAAMAA9mwnq2sUwADqWsAVA3kJAAFgwAD2XU7AAOqEwADqjwAAntJdwAD1TgJgwAD2XVsBHMAA6pmDwADqkcAVAi2YkAIAAhbAAOq8hsAA6rDAFQMHqxeveTTAAOrUA8AA6tTAAOtwAAAAAAAAAF3AAPVOAmDAAPZdWwFKwADq2gEywADq62DAAPZdWwIngLAcwADrDIfAAOsFwBUDPyABAAEWwADrGYbAAOsNwBUDB6sYryqvfAAAJ5jqMsAA615gwAD2XV3AAPUdAWDAAPZdAADAAPVpTsAA64fAAOuVAACrbF3AAPUdAWDAAPZdARzAAOxCHMAA6/McwADrroXAAOuXwBUCtYEnAQABNMAA67QDwADrtMAA6+YAAAABAQHAAOu1AAAAqvNgry0AAGDAAPKzAUrAAOvEASEcwADr0oLAAOvFwBUBwILQAQABFMAA69vAFQToCQAAwAD2GgDAAPTngJ8BAWDAAPZdATTAAOv3A8AA6/fAAOw1AAAAAQEBwADr+AAAAKrzYK8tAABgwAD2XQFKwADsBwEewADsB68sAgACgMAA7BzAFQGmFsAA7DAUwADsJcAVBUkJAICwrzAAAMAA9OaAoQAAAADAAPTxPRzAAOxnHMAA7FwUwADsUsAVA+MIAEQBAAEnmOoAwAD1YoCyAgACHMAA7HgWwADsaC6qqq8qr9lEAQABhMAA7HnAFQKeAMAA9WIUwADshMAVBJ8JAAAAAMAA9OtKwADsnwGDwADspsAVAi0AABTpQwAU7KwAFPLTABT4gAAU+VEAFPpgABT6sgAU+zoAFPuuABT84gAU/hgAFP8eABT/3QAVALwAFQF+ABUGBQAAAA8Cr/GAi8AA7ujAAO7uwADxZwOrbQAAAWDAAPXFAAAEBK/zgIvAAO8mwADvMgmUOABdwAD1TgJgsK1gr/0BMsAA7zBgsK1gr/0ABK/0gIvAAO9ewADvagmUPgBdwAD1TgJgsL9gr/0BMsAA72hgsL9gr/0ABK/1gIvAAO9/wADvoAmqzABdwAD2DgFgsPgBHsAA75TAALsfAAFgsPgAAASv9oCLwADvzcAA79sJmKcAXcAA9U4CYMAAVr1gr/0BMsAA79lgwABWvWCv/QABBa/8AAAAAAQAAAMAAAAAAAAAAABgr/EBPwEJAQDAAPXbAAAAAAMGr/iAi8AA7+DAAO/lwADwXgAAlEEAAAABA8AA7+3AAPBeAAAAAgECwADv+gAAAJk8YLCtAMAA8A0AAACUV2CwowErAFwBPgE9HMAA8EQ1AAAAAQBdwAD1TgJgsK1gr/0BFsAA8B0ulDiv8zUAAAABAGCwrQGAwADwJcAVB2U1AAAAAQBgr/0BHMAA8CSCwADwJMAVB4xEAQABg8AA8CTAFQepAMAA9WIjHMAA8CqEAMAVB7xBAQABKwDAAPXSNQAAAAEAYK/9AR/AAPAysAQAAAAANQAAAAEAXAEcwADwJILAAPAkwBUHjICyAgACg8AA8CTAFQephQDAFQf8AMAA9WOFAMAVB/yEAMAVB7wBYK/9q24BAAGBwADwU8AVB3IAsAIGr/mAi8AA8GPAAPBowADw3wAAlD8AAAABA8AA8HHAAPDfAAAAAgECwADwfwAAAD5gsL8AwADwkAAAAJRXYLCjASsAXAE+AT0cwADwxTUAAAABAF3AAPVOAmCwv2Cv/QEWwADwoC6UPq/0NQAAAAEAYLC/AYDAAPCowBUIiDUAAAABAGCv/QEcwADwp4LAAPCnwBUIrkQBAAGDwADwp8AVCMsAwAD1YiMcwADwq4QAwBUI3kEBAAErAMAA9dI1AAAAAQBgr/0BH8AA8LOwBAAAAAA1AAAAAQBcARzAAPCngsAA8KfAFQiugLICAAKDwADwp8AVCMuFAMAVCR4AwAD1Y4UAwBUJHoQAwBUI3gFgr/2rbgEAAYHAAPDUwBUIlACwAgav+oCLwADw5MAA8OnAAPFlAACq3AAAAAEDwADw9MAA8WUAAAACAQLAAPEDAAAAgNdgwABWvQDAAPEUAAAAlFdgsKMBKwBcAT4BPRzAAPFLNQAAAAEAXcAA9U4CYMAAVr1gr/0BFsAA8SQumKev9jUAAAABAGDAAFa9AYDAAPEuwBUJqjUAAAABAGCv/QEcwADxLYLAAPEtwBUJ00QBAAGDwADxLcAVCfIAwAD1YiMcwADxMYQAwBUKB0EBAAErAMAA9dI1AAAAAQBgr/0BH8AA8TmwBAAAAAA1AAAAAQBcARzAAPEtgsAA8S3AFQnTgLICAAKDwADxLcAVCfKFAMAVCkcAwAD1Y4UAwBUKR4QAwBUKBwFgr/2rbgEAAYHAAPFawBUJuQCwAgAAFQc9ABUIYAAVCYIAFQqrAAAAAwKv/YCLwADxasAA8XDAAPLGA6tvAAABYMAA9cUAAAIEr/+Ai8AA8YjAAPGZGJReAGDAAPKzASkEsACAi8AA8bDAAPG3GJjqAF3AAPUdAWCwowErAQWwBAAAAAAEAAADAAAAAAAAAAAAYK/9AT8BCQEAwAD12wAAAAABBrACgIvAAPG8wADxvMAA8sQAAKtuAAAAAQPAAPHKwADyxAAAAAEBAcAA8dgAAACUV2CwowAAWwE+AknAAPHmIRbAAPHrLpRer/9KwADx9wA/ScAA8kUhHMAA8lCAwADyScAVC2JBAQABKwDAAPXSPgE9HMAA8nI1AAAAAQBdwAD1HQFgsKMBFsAA8mIumOqwACMcwADyaoEAwBULskEBAAErAMAA9dIXwADyYi6Y6jHAAPJuYLCjALAAgQDAFQuyAV3AAPUdAWCwo08BAAGAwADydsAVC2IAwAD1Lj4CPRfAAPKSLpjqK7AAPRfAAPKoLpReKq//AAAVCzoAFQwwAAAAAQKwBYCLwADyycAA8s/AAPogA6twAAABYMAA9cUAAV3AAFj1AlxgwAD1ggMEsAiAi8AA8yPAAPMwCatxryoAYK/xAASwCYCLwADzR8AA804Jq3KvKgBgsKMABLAKgIvAAPNnwADzdgmrc68qAGCskwABBbAXgIvAAPN7wADze8AA88gAAAADwADzkMAA88gAAAADAwPAAPOWAAAEq3Fgr/EAwADzqgAABKtyYLCjAMAA87gAAASrc2CskwAAYLAFAT8ECAGwCIAAwBUM0QgBsAmBAMAVDN4IAbAKggDAFQzrCQHAAPN7wAD12wAAAAAKBrAMgIvAAPPNwADz3sAA9BkAAJ8aARrAAPPOwADuSwAAAQPAAPPjwAD0GQAAAAIBAsAA8+0AAAiCF2DAAFg2AMAA8/QAACCAqGDAAPWCASsAXAE+AT0cwAD0A4DAAPP+wBUNXZQOAgJcYMAA9YICLisAwABYSQawDYCLwAD0HsAA9CPAAPRhAACWiAAAAAEDwAD0LMAA9GEAAAABAQHAAPQ8AAAAlQhdwAD1HQFgwABYNgAAXAE+AT0cwAD0T4DAAPRJwBUNyoO8AQABFsAA9FcunxqwDADAAPTrBrAOgIvAAPRmwAD0d8AA9QYAAKt0ARrAAPRnwADuSwAAAQPAAPSIwAD1BgAAAAICAsAA9JYAAAiCF2DAAFjiAMAA9KEAACAfYMAA9YIAAFwBPgI9HMAA9L8WwAD0sS6rca8qsAiUQQEAARbAAPTYFsAA9Mguq3OvKrAKmu6spgCv+D0cwAD06i6fGgEAARbAAPT1gMAA9PDAFQ44lVjAAFjkALAMBrAPgIvAAPULwAD1HMAA9WkAAJX0ARrAAPUMwADuSwAAAQPAAPUswAD1aQAAAAICAsAA9TkAAAiCF2DAAFi8AMAA9UQAACAfYMAA9YIAAFwBPgAGsBCAi8AA9W7AAPV/wAD18wAAlgsBGsAA9W/AAO5LAAABA8AA9Y/AAPXzAAAAAgICwAD1nAAACIIXYMAAWHMAwAD1pwAAIB9gwAD1ggAAXAE+Aj0cwAD1ty6WiAEAARbAAPXGgMAA9cHAFQ8wkkTAAFh2ALANPRzAAPXaLp8aAQABFsAA9eWAwAD14MAVDzCrdcAAWHcAsAwGsBGAi8AA9fjAAPYJwAD3SwAAlfwBGsAA9fnAAO5LAAABA8AA9hvAAPdLAAAAAgICwAD2KgAACIIXYMAAWF0AwAD2NQAAIB9gwAD1ggAAXAE+Aj0cwAD2RS6WiAEAARbAAPZUgMAA9k/AFQ/JkkTAAFhgALANPRzAAPcoFsAA9xouq3GvKrAIlEECAAIWwAD3NoDAAPcxwBUPyZMNwABYXxbAAPc/LqtyryqwCQCv+AawEoCLwAD3UMAA92HAAPiZAACWAgEawAD3UcAA7ksAAAEDwAD3csAA+JkAAAACAgLAAPeAAAAIghdgwABYyQDAAPeLAAAgH2DAAPWCAABcAT4FRsAA95vAAPfZwAD3tQAAAKe0YMAAWJsAFsAA98qAwAD3xcAVEHmjg8AAWNA+AT0cwAD34S6fGgEAARbAAPf0gsAA9+fAFRCklQrAAFihALAMPRzAAPgGLpaIAQABFsAA+BWAwAD4EMAVEHmrdsAAWMwAsA09HMAA+CoulogBAAEWwAD4OYDAAPg0wBUQeat3wABYzQCwDT0cwAD4Vi6WiAEAARbAAPhlgMAA+GDAFRB5q3jAAFjPALANPRzAAPh/Lp8aAQABFsAA+IqAwAD4hcAVEHmU3MAAWMsAsAwGsBOAi8AA+J7AAPivwAD5LgAAq3kBGsAA+J/AAO5LAAABA8AA+MjAAPkuAAAAAgICwAD43gAACIIXYMAAWJsAwAD46QAAIB9gwAD1ggAAXAE+AAawFICLwAD5M8AA+UTAAPnBAACregEawAD5NMAA7ksAAAEDwAD5WcAA+cEAAAACAgLAAPlrAAAIghdgwABYiQDAAPl2AAAgH2DAAPWCAABcAT4ABrAVgIvAAPnGwAD518AA+h4AAJX2ARrAAPnHwADuSwAAAQPAAPnkwAD6HgAAAAICAsAA+e4AAAiCF2DAAFiwAMAA+fkAACAfYMAA9YIAAFwBPgAAABUNLAAVDaIAFQ4HABUOrAAVDv8AFQ+YABUQSAAVEXgAFRHLABUSHgAVEnEAAAAKAAEGryyAi8AA7X3AAO2EwADu5QABq3sAAAABA8AA7ZjAAO7lAAAAAwICwADtqQAAAG9ggP8AwADtuQAAAICwYMAA9l0AAcAA7ckAAACrfGDAAPKzASlgwAD2XQE+BUAhHMAA7e6BwADt6cAVEthBAQABJwAAwAD2bMAA7enAAO3zAE7AAO3/wADuBwAAq31gwAD2XQEjIRzAAO4bFsAA7hGAwADuCcAVEsyCu4EnQQEAASsAwAD3BRbAAO43FsAA7i2AwADuJcAVEsyCu4EnR8AA9uknaAFgwAD2XU7AAO5OwADuVgAAq35gwAD2XQEcwADuYIPAAO5YwBUTJYCxAQABHMAA7oMcwADucoPAAO5qwBUTJYN2AQABJ0kAwAD2cV0BAAGUAMAA9Z4AwAD2c07AAO6SwADunAAAghZgwAD2XQEjgsAA7p7AFRLoJ6t/JwABYMAA9l1KwADuwAEkwADu4wSEwADuysAVE38ngKiBwADu1MAVEtiFwADu2cAVE9MBgIsAFRQkABSDkQAUiAYAFMzAABTOUgAUzw4AFNYfABTZ7AAU3+0AFODEABTiogAU5IAAFOZiABUGSgAVCsAAFQw9ABUSogAAAA8AFRKkABUUJAAAAAEAsBirgICMAAABgQYAAIHGg2oBAQGDawAAAAUCsBmAjIHZgeiEJgergQAAAWDAAPXFAAAAAAMGsBuAjIIxgjaCTQACoEAAAAABA4JEgk0AAAABAQGCSQAAAICgYMAA9t4AAGDAAPKzAAawHICMgpCCl4KuAAKDawAAAAEDgqGCrgAAAAEBAYKmAAAAhSNgwAD23gAAYMAA9l0ABrAegIyCs4K7hCQEAQAAAAABA4LHhCQAAAABAQGCzAAAAICgYMAA9t4AAGCwGQE+AUmC1xyC5haC34CC28AVFTKBTMAA9uRBAQABJ4FqAMAA9mw+Ak6DAIMJAACgQmDAAPR5ARyDFBaDD4CDC8AVFTJHwAD26YCuAQABJ0kAwAD2cEmDKCEcgzWBgyzAFRVrQQEAARyDOJSBVgAAAADAAPScAMAA9Zw+Ak6DTYNZAACbPGDAAPZdARyDZBaDX4CDW8AVFTJHwAD26YCxAgACk4GDccAVFWsAwAD2c0qDhAEfg4+wLgEAAYKDn8AVFb8APgFKg8QBH4PPsDYBAAGAg9vAFRUyAD4BSoP8AR+EB7AmAQABgIQWwBUVMgAAABUUsQAVFOMAFRUVABUWMQAAAAMCsB+AjISmhKyFygOrggAAAWDAAPXFAAFgsBkBBLAhgIyE4YTkCYCgAGDAAPbeAAEFsCaAjITphOmFAQAAAAOE94UBAAAAAQEBhP0AAASAoGDAAPbeAABgsB8BPwIIAbAhgADAFRaPCQGE6cAA9dsAAAAAAgawI4CMhQaFF4VdAACgQAEahQfAAO5LAAABA4UlhV0AAAABAQGFKgAAAICgYMAA9t4AAGDAAPKzAT4BSoU1ARyFTBaFRRaFQS6AoLAhgUzAAPbkQQEAARaFU4CFT8AVFt+BTMAA9uQAwAD2bAawJICMhWKFdYXIAACDawEahWPAAO5LAAABA4V/hcgAAAABAQGFhAAAAIUjYMAA9t4AAGDAAPZdAT4BSoWTAR6FmoHIAwADgIWwwBUXSxaFuS6AoLAhKgAAABUWugAVFyYAFRd+AAAAAgKwJ4CMhnOGeYesA6uDAAABYMAA9cUAAWCwGQEEsCmAjIayhr0JmzwAYMAA9l0AAQWwLoCMhsKGwobjAAAAA4bRhuMAAAABAQGG1wAABJs8YMAA9l0AAGCwJwE/AggBsCmAAMAVF9gJAYbCwAD12wAAAAACBrArgIyG6Ib5h2EAAKBAARqG6cAA7ksAAAEDhweHYQAAAAEBAYcMAAAAgKBgwAD23gAAYMAA8rMBPgFKhxcBIhyHKRaHIoCHHsAVGCiBTMAA9uRBAQABJ4FqAMAA9mwAHIdCFoc9gIc5wBUYKEfAAPbpgWcBAAEkh1wCFodPLps8sCknSQDAAPZvBrAsgIyHZod5h6oAAINrARqHZ8AA7ksAAAEDh4OHqgAAAAEBAYeIAAAAhSNgwAD23gAAYMAA9l0BSoeUASSHqgInnTcWh54umzywKQAAFRgDABUYjQAVGNkAAAACArAvgIyIMog4iTQDq4QAAAFgwAD1xQABYLAZAQSwMYCMiGqIbQmAoABgwAD23gABBbA2gIyIcohyiIcAAAADiH2IhwAAAAEBAYiDAAAEgKBgwAD23gAAYLAvAT8CCAGwMYAAwBUZMwkBiHLAAPXbAAAAAAIGsDOAjIiMiJ2IxwAAoEABGoiNwADuSwAAAQOIq4jHAAAAAQEBiLAAAACAoGDAAPbeAABgwADyswFKiLgBHIjBFoi9LoCgsDFBAQABgIjEwBUZgwDAAPcFBrA0gIyIzIjfiTIAAINrARqIzcAA7ksAAAEDiOmJMgAAAAEBAYjuAAAAhSNgwAD23gAAYMAA9l0BPgFKiP0BHokEgcgDAAOAiRrAFRnbFokjLoCgsDEqAAAAFRleABUZtgAVGg4AAAACArA3gIyJYoloihcDq4UAAAFgwAD1xQABYLAZAAEFsDyAjImQiZaJowEAAAOJoYmjAAAAAAAAAGCwNwE/AQkBiZbAAPXbAAAAAAIGsDmAjImoibmJ2AAAoEABGompwADuSwAAAQOJx4nYAAAAAQEBicwAAACAoGDAAPbeAABgwADyswFKidQBKQawOoCMid2J8IoVAACDawEaid7AAO5LAAABA4n6ihUAAAABAQGJ/wAAAIUjYMAA9t4AAGDAAPZdAUqKCwEkihUBgIoNwBUazAAAFRppABUapwAVGu8AAAACAAABgIwAFRsCABUUlgAVFkYAFRePABUY6gAVGh8AFRsAAAAABQAVGwIAAAAAALA9q4aAjQAAFoDuAADAAL8AAAEBA6uHhWGriIFIAADAAF3dAACBcQAAwABe1gAAgaUAAMAAXxyrhgCB7AAATAAAggsAAKwuAACCJwAAnoMAAQEBn16CVQAAnr4AAIJrAACskgABAQGqjIKjAACewQABAQGfr4LJAADAAFaOAAEBAqqWq4mDFgAAryoAAQECqp6re4NZAACwmAAAg3oAALHGAACDqAAAtRcAAQECq4qfoIQLAADAAF9cq4sAhCkAAMAAU5MAAQEBn6OEZQAAwABfkQAAhI4AAL73AACEvAAAv/sAAQEDqpyfqqqdhR0AAMAAX/UAAIU+AADAAEB1AAEBAZ+sAAAABQKwPoCNhWaFbLSLA6uMAAABYMAA9cUAAAgEsECAjYWUhZwJgh4AYJ7EAASwQYCNhbOFvgmf4QBgwABAeQAEsEOAjYXjhfoJq42wPQBgtT0ABLBHgI2GEYYdCZ/BAGCwaQAEsEiAjYbJht8JgRAAYMAAXf8BH4bWwABeEQAAAAAEsESAjYb7hxsJq46wPQBdwAD1TgJgsJlgwABd4QEyhxlgsJlgwABd4QAEsEWAjYc+h2cJq4+wPQBdwAD1TgJgwABWvWDAAF3hATKHZWDAAFa9YMAAXeEABLBGgI2HkYejCauQsD0AXcAA9U4CYK8tYMAAXjMBMoehYK8tYMAAXjMAAQWwXYCNh6iHqIgUAAAAA4e8iBQAAAAEBASHwgAABIIeYJ7EAIfRAAAEn8FgsGkAh+QAAASf4WDAAEB5AIf8AAAEq41gtT0AAGCwPgE/BQgBsECAAMAVHVEIAbBHgQDAFR1cCAGwQYIAwBUdZwgBsEODAMAVHXQJAYeowAD12wAAAAAQBrBKgI2GIoY6hmcBAH4AAAABA4ZGhmcAAAAAAAAAYK8eAUqGSQEWhlUWhkkun+GwQZ/mwABAfwawS4CNhmuGg4a2AQCf2QAAAAEDhpeGtgAAAAAAAABgvvgBSoaaARaGoxaGmi6CHrBAn9me9QawTYCNiBmIHonrAACCIwAAAAEDiCGJ6wAAAAAAAABcAT4CPRyIRxaINxaIKi6fwbBHq5GwPbBzg7wBAAE0iE8DiE+JtQAAAAICAohQAAAAhB9gwABWvQCIWgAAAIOyYMAAiWAAAGDAAPWCAT4EToioiK0AAJOLYMAAXkYBHIjFFoi8FoivLp/BsEerkrA9sHFEAQABgYjGwBUegADAAPViTojXiNwAAID7YMAAXk0BH4jiwABeUwMAAAOX/xyJCRaJBYKJAMAVHpeCE8AAXkmBQQEAARaJEIKJC8AVHpdjwABeSADAAPWfghoxiSdgwABeRgGCiSjAFR6XqvMciUUuq5OwPQEAAYCJWsAVHnMAsFc9HIl7FolsLquPsD2wRYCyAgACgIl8wBUec4OJiMAVHsoAwAD1Yz0ciaUWiZsWiZQugRCwSJinwABeB08BAAGDianAFR7KAMAA9S4AwAD1bT0cidIWicgWibwufrBKhCyu84O8AQABFonaLpRPsE8AwAD06wawToCNiw2LEoudAACrlAAAAAEDixyLnQAAAAEBAYskAAAAnttgsJkAAGDAAPKzAT4BSosyASIci04Wi0YWizkun8GwR6uVsHeB3QEAAYCLWsAVH8wAwAD1YQEci4YWi3oWi20un8GwR6uWsHWB3QEAAYCLksAVH8wAwAD1YQawT4CNi6KLrpBSAACUTwAAAAEDi7qQUgAAAAEBAYvJAAAAhUVgsJ4AAGDAAF4lAT4KTovbi+MAAKuXYMAA9l0BHIvxFovlLn6wSpjQAQABgIwAwBUgSgCu9kmMChaMFoGMDsAVIF+A/MAA9mM+AT2JjCfAFSBfJ6trP06MTIxRAACX/2DAAPR5ARyMYBaMUy6fwbBHq5gBAAGAjGfAFSBKALCGTox9jIIAAID7YMAAXiUBH4yIwABeMQQABIGMlMAVIF8WjKGAjJ3AFSBKoCqwoCuCjLXAFSCoAD0cjM0WjMAuq46wPbBEgLICAAKAjM7AFSBKg4zVwBUg0QDAAPVjPRyM7BaM4C5+sEqqcQIAAoCNAcAVIEo0jQYDjQaPBwAAAAEBAY0UAAAAkltgsL8AAGDAAPWCAT4BSY0kIiIWjS+EjSjAFSFSqlawxwEWjUSEjT3AFSFShECwyAEWjVeEjVDAFSFShEGwyT4CTo14jYUAAKuZYMAAXnYBHI2HLquaAQABJo2VAYSNlcAVIVJgsNQAsFtJjaYhHI23hY2qwBUhmkEBAAErAMAA9dI+Aj0cjeMWjdGDjczAFSDRq5vAAF4oTwEAAYWN58AVIZoAwAD1Lj0Xjg2FjgDAFSGaklGDjhbAFSDRwABd8j9JjjMWjj6EjjfAFSFShEKwxj4CTo5bjmUAAKucYMAAXlsBHI5nLpS9AQABJo5yAYSOcsAVIVJgsNEAsFhJjoMhHI6RhY6HwBUiLUEBAAErAMAA9dI+Aj0cjr0WjquDjqbAFSDRq53AAF4pTwEAAYWOwcAVIi0AwAD1Lj0XjuGFjtfAFSItklGDjurAFSDRwABd8j8/AK76PRyPGxaPDy5+sEqf8wIAAoCPKMAVIEo0jy0Djy2P5AAAAAEBAY86AAAAq55gsK0AAGDAAPWCAT4CTo9Tj10AAJn2YMAAXjwBHI9fLpSgAQABhI9qwBUi1QCwWUmPeCEcj4aFj3zAFSLqQQEAASsAwAD10j4CPRyPphaPnoOPmcAVINGUOMAAXipPAQABhY+qwBUi6gDAAPUuPRePyIWPvsAVIuqSUYOP0cAVINHAAF3yPwCu+EmP7CIWj/WDj/DAFSDRgPzAAF4tACEckAEuq5QBAAGAkAzAFSBKALBOSpASASs/PRyQNBaQKhaQIy6BELBIhCzAAF4CTwEAAYOQOMAVINEAwAD1LkqQQwGDkErAFSDRBrBRgI2QV5B3kMkAAKufsD0AAAABA5CGkMkAAAABAQGQlAAAAIMGYLC/AABgtRgBSpCgARyQuBaQoC6rjbA9sEOroAEAAYCQx8AVI+QAtUIGsFKAjZDOkNyRLQAAq6GwPQAAAAEDkO6RLQAAAAEBAZD1AAAAgwZgsPgAAGCx4QFKkQEBHJEZFpEBLquNsD2wQ6uiAQABgJErwBUkNAC1QwawWICNkTKRPJbDAACUvQAAAAEDkUaWwwAAAAIBAZFTAAAAlERgsNEAAZFnAAAAq6NgsK0BK2DAAF5bAT4OTpGNkZoAAKWbYLHhARaRsxyRnC6rn7A9AQABgJGswBUkggCwUYIXtSZJkfwiHJINgpIAwBUko0EBAAErAMAA9dIBFpJwHJJNFpIsFpIgLp/hsEGphsAAQIKA/AEAAYKSVcAVJKMAsg2rpLHPPgFKkooBKz9OkqaSqwAAl/9gwAD0eQEckroWkq0un8GwR6uYAQABgJLBwBUkggCwhk6S3JLhAACCGl3AAPUdAWDAAF5GARyS8BaS4y6fwbBHq6UBAAGAkvfAFSSCALCISZNMIRyTVYSTUMAVJUBBAQABKwDAAPXSPYuTXsAVJRcck2ODk17AFSUXXQEAARaTa4STZsAVJUBawAD1TADAAPWeP06TgpOHAACA+2DAAF5bAR+TjcAAXmYGAAAGgLAWk6yAk6bAFSSCgLCwm4IXJJPkARyTzxaTwy5+sEqqgAEAAYCT3MAVJIIArw6lmySUCwGCk/7AFSSjghqElBvAFSVAqvMclDUuq6awPQEAAYCUSMAVJIIAsFWD4haUZ4CUYcAVJIKD4rDLPRyUghaUdS6rjrA9sESAsgIAAoCUg8AVJIKFlIzAFSWyAMAA9WNOlKiUsgAAq6dgwABf4AEclM4WlMAWlLQun+GwQauowABAe6upAQABJpTbAYCU28AVJIJgwABobwDAAF/cSZTnIRyVAhaU9YaU68AVJl6TJcAAX+NBAQABKwDAAPXSPgE9F5UYhZUTwBUlspJFJpUYARyVNRaVJi6rj7A9sEVEAQABFpVAhpU2wBUmXpMlwABf4wDAAPViYMAAXk3AAF5iP0mVWhaVbxaVZxaVXi6CHrBAb57Qgk2BPj4BPReWEYWWDMAVJbKrqiSWMQEWlieAliHAFSSCg4nAAPXYwABd8D9OlkKWTgAAq6tgwAD0eQEcllAuq6ywPQIAAoWWYMAVJbKAlmbAFSSCALBTPReWd4WWcsAVJbKX/xyWg4OWfsAVJRddAQABh5aFwBUnPwDAAPWewABd8T0clqUWlp4WlpcugRCwSJQ6wABeBk8BAAGFlqnAFSWyAMAA9S5KlrQBhZa7wBUlsgawWYCNlsiW0p3XAACUoAAAAAEDltyd1wAAAAEBAZbpAAAAq55gsK0AAGDAAF48AT4JTpcnlzEAAJn2YMAAXjwBH5c3wABeRAMAAAOAsBaXVoCXUMAVJ+KAsLCbg98Wl3aAl3DAFSfig9+wsarzHJeWLqutsD0BAAGAl6jAFSfiALBWPRyXwhaXtS6rjrA9sESAsgIAAoCXw8AVJ+KBl8zAFSf3AMAA9WNOl+CX5QAAl/9gwAD0eQEcl/QWl+cun8GwR6uYAQABgJf7wBUn4gCwhj0cmBMWmAcufrBKqnQCAAKAmCvAFSfiNJgyA5gym2sAAAABAQGYMwAAAJJbYLC/AABgwAD1ggE+AUmYQyIiFphOg5hHwBUou6pWsMcBFphjg5hcwBUou4RAsMgBFph2g5hvwBUou4RBsMk+Ak6Yl5ikAACrmWDAAF52ARyYpi6rmgEAASaYtAGDmLTAFSi7YLDUALBbSZjFIRyY1oSYycAVKQNBAQABKwDAAPXSPgM9HJj/Fpj1gZjrwBUn96uuwABeP08BAAGEmQPAFSkDAMAA9S49F5kphJkcwBUpA5JRgZkywBUn98AAXfJGmUeZdplQAAAAq69gwABeiwAWmWyEmV/AFSkDq7DAAF5+PgE9ipmEwBUobhyZiYKZhMAVKG5dAQABFpmYhZmMwBUphpf/wABd8QDAAPWeP0mZwRaZzIOZxcAVKLuEQrDGPgJOmemZ8wAAq5xgwABeWwEcmfUulL0CAAEmmgABg5oAwBUou2Cw0QGro4CaGcAVJ+KwWEmaKSEcmjeEmi3AFSnlQQEAASsAwAD10j4DPRyaXRaaVoGaTMAVJ/eUOsAAXkBPAQABhJphwBUp5QDAAPUuPReagYSad8AVKeWSUYGaisAVJ/fAAF3yRpqfmsuaqAAAAKuvYMAAXosAFprBhJq3wBUp5auwwABeXz4BPYqa2cAVKG4cmt6CmtnAFShuXQEAARaa7YWa4cAVKnGX/8AAXfEAwAD1nj8+AT0wmyAfmyrAAPQZAQABJ6uxAACu/z0cm34Wm3IufrBKqnYCAAKAm5HAFSfiNJuYA5uYnNQAAAABAQGbmQAAAJhQYLDsAABgwAD1ggE+Ak6bu5vIAACrmWDAAF52ARybyi6rmgEAAYOb2MAVKvgAsFtJm+whHJv9hJvwwBUrDUEBAAErAMAA9dI+Az0cnCQWnBqBnBDAFSf3q67AAF4/TwEAAYScKMAVKw0AwAD1Lj0XnEyEnD/AFSsNklGBnFXAFSf3wABd8kacaJyXnHEAAACrr2DAAF6LABacjYScgMAVKw2rsMAAXn4+AT2KnKPAFShuHJyogpyjwBUobl0BAAEWnLeFnKvAFSuJl//AAF3xAMAA9Z4/AK8BPRec5oGc3MAVJ/eX/4Kc7cAVKG7AAF3xSZz4IiIhHJ0kFp0WFp0OFp0GFpz9LoIesECfvJ7Zq7K2jquzwACVo4LQAQABgJ0twBUn4gDAAPYaABadUBadSYGdP8AVJ/eUOsAAXkCA/MAA9P8AFp13Fp1tgZ1jwBUn96uuwABeP4D8wAD0/z4BSp2IASs/PRydrxadpxadoC6BELBIlDjAAF4FTwEAAYGds8AVJ/cAwAD1LkqdwwGBncrAFSf3BrBagI2d3J3ooFIAAKu0AAAAAQOd+aBSAAAAAQEBngYAAACTDWCwrQAAYMAAXosBPglOniGeLQAAq69gwABeiwEfnjPAAF6RAwAAA4CwFp5WgJ5OwBUssoCwsJuq8xyecC6rrbA9AQABgJ6CwBUssgCwVpf/HJ6nFp6aLp/BsEermAEAAYCersAVLLIAsIY9HJ7KFp69LquOsD2wRICyAgACgJ7LwBUssoGe1sAVLMcAwAD1Y06e958CAACrtWCw1AEmnvcBHJ8sFp8QFp8ELp/hsEGf5sAAQH+qcgIAAoCfPsAVLLIan1OsMQCu/WCw1E6fbJ95AACrmWDAAF52ARyfey6rmgEAAYKficAVLUoAsFtJn5ocn6uDn57AFS2GQQEAASsAwAD10kqftAErPz0Xn9GBn8XAFSzHkk+Dn9zAFS2GwABejT0Xn/uDn+7AFS2GklGBoATAFSzHwABd8j0coCYWoB0WoBYugRCwSKuwwABeCE8BAAGBoCrAFSzHAMAA9S5KoDwBgaBDwBUsxwawW4CNoFegZKvJAACrmgAAAAEDoHGryQAAAAEBAaCBAAAAkk9gsNQAAGDAAF52AT4cTqCVoJoAAJf/YMAA9HkBHKCpFqCcLp/BsEermAEAAYCgsMAVLkIAsIZJoR0iHKEmgaEhwBUuV0EBAAGTAMAA9ZwAIRyhLy6rlAEAAYChOsAVLkIAsE5KoUUBKz9Ooa6hswAAgLBgwAD2XQEWockWob6AobXAFS5Com2wwYE/wABU0E6h1wAAAIIcYMAA9HkASaHhIhah7oCh5cAVLkKD3rDDARaiA4Ch+sAVLkKERrDCPgE9i6IXwBUu2RqiK8AAXnhJok8hHKJrFqJcgKJTwBUuQpJpsM1BAQABKwDAAPXSPgE9i6J8wBUu2RqikMAAXno/SaKxFqK+gKK1wBUuQoRFsMU+Aj2KotXAFS6zIxyi4YKi3MAVLrNBAQABJwAAwAD2bCSjHwEWow4Wov+AovbAFS5CkmmwzYCwsJsko1MDFqM8FqMtgKMkwBUuQpJpsM2AsLCbJ4ExFqNNgKNEwBUuQoCwsJsBYMAA9l09i6NbwBUu2Rqjb8AAXns/QCEco6GDo5zAFS7ZQQEAASsAwAD1nKOco6gATqPCo8wAAKNrYMAAXqABH6PSwABepwQAAASD3haj/oCj9cAVLkKD3rDDg+IWpCCApBfAFS5Cg+Kwy4PjIxakQ4CkOsAVLkKERbDFFqR9JqRnAICkXsAVLkJgsOyrtrDvKgFgwADys4PkFqTAgKS3wBUuQoPksNZOpOak6wAAghpdwAD1HQFgwABeRgEcpPoWpO0un8GwR6ulAQABgKUBwBUuQgCwiE6lJaUwAACe8F3AAPUdAWDAAF6ZATGlQWDAAF6ZAE6lVqVtAACrt13AAPUdAWDAAPZdATGld2DAAPZdAD0cpZMWpX8un9mwS6u4AgACgKWrwBUuQjSltQOltaYOAAAAAQEBpbYAAACAz2Cw+AAAYMAA9YIBPgE9HKXgh6XJwBUws08BAAEkpgYBHKXnLquhsD0BAAEUpfrAFTD2CAAAsFIAwAD1LgC/BU6mGaYoAACruWDAAPR5AZM9HKZFFqYxLp/ZsEurugIAAoCmVsAVLkI0pmADpmCm5AAAAAMDA6ZhAAAAghdgwABYNgCmZwAAAICwYMAA9l0Apm0AAACAqGDAAFa9AABgwAD1ggE+AT0cpoOGpnjAFTCVTwEAAR+mi8AAXp8DAAMUpqTAFTF/CgAcpsCHpqrAFTCzRAEAATUAAAABAGDAAPR5ARSmwcAVMT0IADUAAAABAGDAAPR5ARWmwcAVMT0IHKbPFADAFTHTDABdAQABlADAAPWeFADAFTHTDAAAwAD1LCSm2wEUptbAFTFyCQAAAMAA9S4AvwROpvCm/QAAlN1gwABYyQEcpwsWpv8ufrBKqn0BAAGApxvAFS5CAK8LTqcxpzwAAJTcYMAA9l0BJKdaARanThSnQcAVMjQJAJTcwABYy06naKd7AACru2DAAPZdASSnpgEWp5ocp4Auq5+wPQEAAYCnkMAVLkIAsFGU3LUpTqezp78AAKu8YMAA9l0BJKgUARyn8Ran5BanzC6rjbA9sEOgE7VKq70BAAGAqAnAFS5CALbtTqgfqCwAAKu+YMAA9HkBHKhGFqg7FqguLp/BsEerlrB1RAEAAYCoR8AVLkIAwAD1YkmoVhyoZxSoWsAVMuYNAEEBAAErAMAA9Zw9FahwwBUy5g2TP06olKiZAACA+2DAAF52AR+on8AAXokLAAALgLCCqLvAFS6zq7+DqNfAFS7Zo2uEqPDAFS/vlNwUqQ/AFTJcCgCruxSpN8AVMoELAJ7whqlfwBUwlau8FKmAwBUysAwAq74UqaPAFTLmDQCCGoWpv8AVMGaCFxyp4BSp08AVMjQJACMAAAAAwABY36rzHKoALqumsD0BAAGAqhPAFS5CALBVPRyqMBaqIy6rjrA9sESAsgIAAoCqMcAVLkIUqj3AFTM7DgAAwAD1Y06qTKpYAACrq2DAAPR5ARyqWi6rrLA9AgACFKpqwBUzOw4AgKpwwBUuQgCwUz2Jqn/AFS5XHKqEgap/wBUuV10BAAEUqofAFTQEDwAAwAD1nkmqmRaqrhaqphaqnS6CHrBAb57Qgk2BPj4BPRerUxSrTsAVMzsOAKuqJKt2ARarbICrY8AVLkKDicAA9djAAF3wPz0Xq4gUq4PAFTM7DgCX/4Grj8AVLlfAAF3xPRyrqxaroRarmi6BELBIq67AAF4DTwEAARSrr8AVMzsOAADAAPUuSqu6ARSrwcAVMzsOAAawU4CNrHOsd67aAACrrLA9AAAAAQOshq7aAAAAAgICrIwAAACA+2DAAF3hAKyfAAAAkltgsL8AAGDAAPR5AT4HQCIlrLmArLTAFTUEYMAAXnYBJazRgKzMwBU1BGDAAF5brLSs3QBOrOis7QAAl/9gwAD0eQGTTq0IrRcAAKvAXcAA9R0BYMAAXosBMa0mYMAAXosAPRytOhatLi5+sEqqjwIAAoGtT8AVNRE0rVcDrVeuSgAAAAEBAa1YAAAAq8FgsNQAAGDAAPWCAT4CTq11rYEAAKuvYMAAXosBHK2DLqu0AQABFq2dhK2VwBU1npJpsM0AsFpJrbQhHK3Eha24wBU1s0EBAAErAMAA9dI+Az0XreOFrdfAFTWzklGArezAFTUEwABd8j0crgmDrfrAFTVcTwEAAYWuDcAVNbMAwAD1Lj2KriPAFTVMHK4ogq4jwBU1TF0BAAEWrjeFrivAFTWzl//AAF3xAMAA9Z4/AK8iSa5RJa5agK5VwBU1BGDAAF52PReucBSua8AVNQQAAWDAAF52q7CDrnvAFTVcwABefj9Jro8lrpiArpPAFTUEYMAAXls9F66rFK6mwBU1BAABYMAAXlursIOutsAVNVzAAF5fP0quywGCrtLAFTVMBrBUgI2u367usg4AAKvCsD0AAAABA68Bsg4AAAABAQGvDQAAAKrzYK8tAABgwABeMwE+AUqvHwEcrzQWryYuq5CwPbBGmJACAAKAr0DAFTbmNK9MA69MsgkAAAAAAAAAYMAAXjMBPgdOr9+v5wAAn7xgtoUBFq/yFq/pLoIesECfvJ7ZQCIhHLAYFrATgLAIwBU25oCwrzBBAQABKwDAAPZsARawLoCwI8AVNuaqn68vsAiwOgBOsEewUAAAgqNgwAD2XQEjFrBdgLBSwBU25qqfry8WsJ4WsJEWsIcWsH8WsHYugh6wQG+e0IK7gSeC0cAA9uyBecAA9QIesK+vLAIAAhawzRawxC6CHrBAb57QFrDhgLDWwBU25oCwrzAAAWDAAPZdTrD9sQIAAID7YMAAXjMBH7EIwABeOgMAA4KxF8AVN30WsSyAsSHAFTbmgLCvMByxVBaxTBaxRIGxPMAVNy+rsraOq7LAAJWnq8MBAAGAsWLAFTbmAMAAldcAPRyxjhaxe4OxdsAVN+2Y6sAAXjaAmQEAARyxsBaxoRaxlS6f4bBBqIHAAECLq2gBAAGAsb/AFTbmAK/rAMAA9S89HLHmFrHaFrHTLoEQsEirOcAAXglPAQABg7HqwBU37QDAAPUuSrH3AYOx/sAVN+0AwAD1aQawVYCNshOyIrKvAACrprA9AAAAAQOyNLKvAAAAAQEBskIAAACe22CwvwAAYMAAXjMBPgFKslABHLJXLqvCsD0BAAEcso8WsoAWsnQun+GwQaiBwABAi6taAQABgLKjwBU43ACv4wCwVAawVoCNsrSyw7NNAACrrbA9AAAAAQOy1LNNAAAAAQEBsuEAAACe22CwrQAAYMAAXjMBPgFKsu8BHLL2LqvCsD0BAAEcsy4Wsx8WsxMun+GwQaiBwABAi6tZAQABgLNBwBU5RQCv4gCwVAawV4CNs1KzYbSJAACrk7A9AAAAAQOzdbSJAAAAAQEBs4QAAACEH2DAAFa9AABgwABeMwE+A06zn7OqAACq82CvLQEcs88Ws8AWs7Qun+GwQaiBwABAi6tcAQABgLPlwBU5rgCv5Emz9By0A4Gz+MAVOcVBAQABKwDAAPXSPgJAJbQkgLQbwBU5rmDAAFfStBu0PwBKtEgBKz9KtF8BHLRmLqvCsD0BAAGBtHrAFTnFALBUAAAVHbsAFR3yABUeKAAVH64AFSAsABUjxAAVJBQAFSRkABUnxAAVLJQAFS4kABU05AAVNsYAFTi8ABU5JQAVOY4AFTpBAAAAEAKwXoCNtI60lLUdA6vEAAABYMAA9cUAAAIEsGCAjbSvtL0Jq8UAYLCZAASwYYCNtM604AmrxgBgwAD1xQABBbBjgI205LTktRsAAAADtO21GwAAAAICArTzAAAEq8VgsJkAtQgAAASrxmDAAPXFAABgsF4BPwMIAbBggADAFTrhCAGwYYEAwBU67AkBtOTAAPXbAAAAAAAAABU7IQAAAAACsGSAjba/ts63JQerxwAAAWDAAPXFAAAAAQWwaAAAAAAEAAADAAAAAAAAAAAAYLBkAT8BCQEAwAD12wAAAAABBrBmgI2237bktyMAAqvIAAAAAQO28bcjAAAAAgICtwEAAACTDWCw1AC3FwAAAKvJYLC/AABcAAAAFTtqABU7oQAAAAECsGmAjbcoty7AAF8/A5+ZAAABYJ6EAAFgsGQMBLBrgI23h7e0BqqoAGDAAEBSASC3msAAQFgBAAEnq8oABLBsgI23x7fPCYIeAGCexAAEsG2Ajbfet+0Jq8sAYMAA8rMABLBugI24u7jIGKvMAGCwPgErBLBwgI24+bkFGKvNsD0AYMAA9HkBKwSwcYCNueK6BgmrkrA9AF3AAPVOAmDAAIlgYMAAXkYBMroEYMAAiWBgwABeRgAEsHKAjbpqup0Jq86wPQBdwAD1TgJgsJldwAD1HQFgwACJYAEyuptgsJldwAD1HQFgwACJYAAEsHOAjbrGuvsJq5GwPQBdwAD1TgJgwABWvWDAAIlgATK6+WDAAFa9YMAAiWAABLB1gI27F7s0CauWAF3AAPVOAmCwmWDAAPR5ATK7MmCwmWDAAPR5AASwdoCNu7G71QmrzwBdwAD1TgJgsJldwAD1HQFgsJkBMrvTYLCZXcAA9R0BYLCZAASwd4CNu/+8JgmrlQBdwAD1TgJgsL9gv/4BMrwkYLC/YL/+AASwdICNwABGFMAARh8Yq9CwPQBdwAD1HQFgsI8BMcAARh1gsI8AAQWwjoCNt/K38rhyAAAAA7f+uHIAAAABAQG4BAAABIIeYJ7EAABgsGkBPwMIAbBsgADAFT2FCACwbRa4ORa4MYC4KMAVPYVvntCCtYEeCQC4Wp6kAQABFrhpgLhgwBU9hZNPnuwAEwaweYCNuHe4jrihAQCAsAEauHjAAO5LAAABA7iTuKEAAAAAAAAAYMAA9l0BSriWASer0QawfICNvFy8YbyhAACgFAAAAAEDvGu8oQAAAAEBAbxwAAAAoBFgwAD0eQAAXAE+AT0XvIMuq82wPYC8ksAVPiOwcAawfYCNvKa8t720AACryAEavKfAAO5LAAABA7zEvbQAAAACAgK81AAAAJMNYLDUALzqAAAAq8lgsL8AAFwBPgQ9HL0JFrz9LquWsHWYkAIAAoC9FcAVPmw0vR4DvR69JQAAAAAAAABgwAD0eQFKvSQBkwDAAPVpPTUAAAABAF3AAPVOAmCwmWDAAPR5ARa9LC6rlrB1NQAAAAEAYLDUAYC9OMAVPmwcvTeCvTfAFT7AgLICAAKDvTfAFT7dHL1BHL03gr03wBU+wEQBAAGDvTfAFT7dAMAA9WJdAQABlADAAPWeAMAA9WM9HL1VFr1LLqvPsHaYkAIAAoG9YcAVPnc0vW4DvW69hgAAAAAAAABdwAD1HQFgsJkBSr10AR69eMAA8CQBAWCwmQGTAADAAPVpPRy9pBy9lha9jS6rz7B2RAEAAYG9l8AVPncAwAD1Yk8BAAGAvajAFT5sAMAA9S4GsH6Ajb25vb6+RQAAq9IAAAABA73MvkUAAAACAgK92gAAAJJbYLC/AL3uAAAAq9Ngv/4AAFwBPgFJvfwWvhEWvgkWvgAugh6wbG+e0IIIgR0+AT0cvioWviMuq5Wwd4CyAgACgL4rwBU/xYG+NcAVP9AAwAD1Yz8GsH+Ajb5Kvk++mAAAq9QAAAABA75fvpgAAAABAQG+ZAAAAKAoWwAAXAE+AT0cvoAWvnguq5Wwd5PgAQABgL6HwBVAPQDAAPVrBrCAgI2/Sr9ewABClgAAq9UAAAABA79qwABClgAAAAICAr9yAAAAnttgsJkAv4cAAACf4WDAAEB5AABdwAD02wFgsF4BPgVOv6a/rQAAq9Ngv/4BHL+2Fr+vLquVsHdEAQABgL+3wBVAigDAAPViSb/EHL/Pgr/IwBVAsEEBAAErAMAA9dJKv9gBOr/fYLBeAD9Ov/3AAEAIAACr1l3AAPUdAWCwXgExwABAFWCwXgA9HMAAQDUWwABAJhbAAEAdLoIesGyftZ7PqsYEAASAwABASsAVQIqCwABAWsAVQLAfwABAbsAAQHQCAAACqtE0wABAlgPAAECWwABB+gAAAAEBAcAAQJcAAACq0mDAAF0uAABgwAD1ggE+Ak7AAEC9wABAwgAAq9dgseEBJsAAQL0BFsAAQM+EwABAxMAVQWurxsAAXTNgseE9HMAAQPiDwABA7cAVQPuAmQEAARzAAEG/HMAAQYeBwABA/8AVQJWr2AIAAhbAAEGghMAAQZXAFUFrn+zAAF0whcAAQarAFUGEAMAAQJ6AnwEBYLBeATTAAEHDA8AAQcPAAEHtAAAAAQEBwABB0QAAAIMGYLC/AABgsF4BSsAAQdcBH8AAQduwYwIAAobAAEHlwBVCG4XAAEHowBVBhAAAwAD05gDAAPUvqsc0wABCDAPAAEIMwABCZQAAAAEBAcAAQg0AAACqyGDAAF1pAABgwAD1ggE+AT0cwABCL4PAAEIkwBVA+08BAAEfwABCN7BjAgACFsAAQkuEwABCQcAVQnCTDcAAXWsrAADAAPUuGsAAQnCwawDAAEBbSsAAQoEBg8AAQojAFUD7BrCBgI3AAEL9wABDAsAARDgAAKvZAAAAAQPAAEMTwABEOAAAAAMCAsAAQxsAAACe22CwmQDAAEMuAAAAghpgwACJYAABwABDSQAAAIQJYLCeAStcAT4BScAAQ1kWwABDbhbAAENmFsAAQ10ugh6wbG+e0IIIgR0+Aj0cwABD1xzAAEOaFsAAQ4Auq86wPbBymJACAAKAwABDpsAVQwM0wABDrgPAAEOuwABDygAAAAAAAABdwAD1HQFgwACJYAFKwABDtAEewABDuMAA8CQBAWDAAIlgAZMAAMAA9WlPAQABgcAAQ9vAFUMQAMAA9S49NQAAAAEAXcAA9U4CYMAAiWBgwABeRgEWwABD6C6rkrA9sHE1AAAAAQBgwACJYAGBwABD8sAVQxAjHMAAQ/gcwABD8YPAAEPxwBVDzEQBAAGEwABD8cAVQ+8AwAD1YkEBAAErAMAA9dI1AAAAAQBgwABeRgEjFsAAQ/wuq8uwbR/AAEQSwABeTAAAAAAfwABEI7CXAAAAAAFgwABeRjUAAAABAFwBHMAAQ/GDwABD8cAVQ8yAsgIAAoTAAEPxwBVD74UAwBVENADAAPVjhQDAFUQ0KwFgwABeRj8GsIKAjcAARD3AAERCwABFhAAAq9oAAAABA8AARFXAAEWEAAAAAgICwABEZAAAAIQfYMAAVr0AwABEeQAAAIIaYMAAiWAAAFwBPgFJwABEhRbAAESaFsAARJIWwABEiS6CHrBsb57QggiBHT4DQCIcwABEzRzAAETCFsAARLMuq5GwPbBzRAEAAYDAAETDwBVEzQDAAPViQQEAASsAwAD10gEcwABE/BzAAETxFsAAROIuq5GwPbBzRAEAAYDAAETywBVEzQDAAPViQQEAAYHAAET/wBVE3ADAAPXSwABEs8AARQMAPRzAAEUbFsAARQwuq5GwPbBzgLICAAKAwABFHMAVRM2BwABFKMAVRNwAwAD1Yz01AAAAAQBdwAD1TgJgwACJYGDAAF5GARbAAEU0LquSsD2wcTUAAAABAGDAAIlgAYHAAEU+wBVE3CMcwABFRBzAAEU9gsAART3AFUW6RAEAAYPAAEU9wBVF3QDAAPViQQEAASsAwAD10jUAAAABAGDAAF5GASMWwABFSC6ry7BtH8AARV7AAF5MAAAAAB/AAEVvsJcAAAAAAWDAAF5GNQAAAAEAXAEcwABFPYLAAEU9wBVFuoCyAgACg8AART3AFUXdhADAFUYiAMAA9WOEAMAVRiIrAWDAAF5GPwaweoCNwABFicAARZLAAEW0AQCr2wAAAAEDwABFocAARbQAAAAAAAAAYMAA8rMBSsAARaQBIRbAAEWlLqvLsG0GsIOAjcAARiPAAEYowABG1AAAq9wAAAABA8AARjHAAEbUAAAAAgICwABGPQAAAIOyYMAAiWAAwABGRwAAAGNgwAD0eQAAXAE+A07AAEZYwABGXQAAEmDAAF5GARzAAEZoFsAARl8uq5KwPbBxRAEAAYDAAEZpwBVG+wDAAPViPTUAAAABAGDAAF5GAYLAAEZ0wBVHHiMcwABGeoMAwBVHVEEBAAErAAArF8AARnqDAMAVR1RjgcAARoLAFUcKwABeSAFgwAD0eUnAAEaOIhbAAEaSLqvbsHoAIRzAAEapgsAARqTAFUceQQEAASsAwAD10j4BPRzAAEbBFsAARrouq9CwPbB0TwEAASbAAEbFAYLAAEbFwBVHHmCwjwDAAPUuPwawhICNwABG2cAARt7AAEguAACr3QAAAAEDwABG4sAASC4AAAABAQHAAEbqAAAAg7BgwAD2XQAAXAE+AUnAAEb4FsAARvwuq9uwej4BPRzAAEf/FsAAR/guq9CwPbB0g7wBAAE0wABIBwPAAEgHwABIIwAAAAEBAcAASAgAAACBKGCwjwAAXAFKwABIDgEcwABIFhbAAEgQgcAASA7AFUhtq96wPbCSghEBAAGAwABIHMAVSB0AwAD2uwDAAPTrPwawhYCNwABIM8AASDjAAElBAACr3wAAAAEDwABIQMAASUEAAAAEBATAAEhMAAAAg7JgwACJYADAAEhWAAAAY2DAAPR5AMAASGEAAACCE2DAAPR5AMAASGoAAACr4GDAAPR5AABcAT4DTsAASH3AAEiCAAASYMAAXkYBHMAASI0WwABIhC6rkrA9sHFEAQABgMAASI7AFUjdAMAA9WI9NQAAAAEAYMAAXkYBhMAASJnAFUkeIxzAAEifhQDAFUlUQQEAASsAACsXwABIn4UAwBVJVIITgsAASKXAFUj6wABeSQFgwAD0eUnAAEiuIhbAAEiyLqvbsHoAIRzAAEjJhMAASMTAFUkeQQEAASsAwAD10j4DTsAASN7AAEjjAACBeWCwjwEcwABI7BbAAEjlLqvQsD2wdJWmAAAAAMAA9TxAHMAASQyEwABJB8AVSR5BAQABhcAASQ/AFUnJAMAA9dLAAEkHwABJEwBAHMAASS4WwABJKITAAEkjwBVJHmPAAF5IQQEAAYHAAEkxwBVI7ADAAPWcwABJI8AASTYAPwawhoCNwABJwsAAScbAAEp/AACrmAAAAAEDwABJzMAASn8AAAABAQHAAEnUAAAAnttgsJkAAGDAAPR5AT4BScAASeIcwABJ9RbAAEnmLqvOsD2wcoHdAQABgMAASgHAFUp7AMAA9WE+AUrAAEoSARzAAEpAHMAASjAcwABKJxbAAEoZLqvOsD2wckQBAAGAwABKKMAVSnsAwAD1YoCfAQFgwAD0eQEWwABKNC6r4bCHAMAA9OaDEgIBYMAA9HkCkzTAAEpIA8AASkjAAEpXAAAAAgICwABKSQAAAIFmYMAA9HkAwABKTAAAAIHaYMAA9HkAAGDAAPR5AUrAAEpSARzAAEpUgcAASlLAFUsnXQEAAYLAAEpWwBVLNgDAAPWeAMAA9O0+AUrAAEptAZMGsIeAjcAASoTAAEqIwABLDwAAq+EAAAABA8AASpLAAEsPAAAAAQEBwABKngAAAIOyYMAAiWAAAGDAAPR5AT4DTsAASrPAAEq4AACTi2DAAF5GARzAAErDFsAASrouq5KwPbBxRAEAAYDAAErEwBVLqADAAPViScAASs8cwABK2IHAAErTwBVLwUEBAAErAMAA9dJKwABK4QGTP0rAAErvARzAAEr/FsAASvuBwABK9sAVS8GCE8AAXkmBQQEAARbAAEsGgcAASwHAFUvBY8AAXkgAwAD1nwawiICNwABLFMAASyPAAEvVAACrpQAAAAEDwABLKcAAS9UAAAABAQHAAEs3AAAAnttgsL8AAF3AAPUdAWDAAF5GAT4DTsAAS1bAAEtbAACCGl3AAPUdAWDAAIlgARzAAEtrFsAAS10uq86wPbByRAEAAYDAAEtswBVMfwDAAPViScAAS3kcwABLgoHAAEt9wBVMnEEBAAErAMAA9dJKwABLiwE6wABLkmDAAF5GAD9KwABLoAEcwABLyRzAAEusgcAAS6fAFUycgJ8BAWDAAF5GATTAAEuwA8AAS7DAAEvHAAAAAQEBwABLsQAAAKviYMAAiWAAAGDAAF5GAUrAAEu5ARzAAEvCFsAAS7kuq5KwPbBxRAEAAYLAAEvDwBVNPQDAAPViAMAA9OaAoQAAAADAAPTxBrCJgI3AAEvawABL38AATYEAAIIIAAAAAQPAAEvnwABNgQAAAAICAsAAS/UAAACf4WDAAEB5AMAATCMAAACgC2C1PQAAXAE+AT0cwABMQS6TjQEBYMAA9YIBNMAATEkDwABMScAATXwAAAAAAAAAYMAA9YIBPgM9F8AATFQuq8w1wABMaAAAAQBgsD4BH8AATGiwXQQABBbAAEyILoIesGwugMAATJjAFU2zgcAATKXAFU3CADUAAAABAFsBHMAATMeCwABMxcAVTgyCIwAAAACwTYIAwBVODLBuTsAATNnAAEzhAACr42DAAF3/ARzAAEzjLqvkAQABgMAATPXAFU2zALCMScAATQkWwABNDS6ry7BtPgE9HMAATSguq+UBAAGCwABNN8AVTmcAsIs+AT0cwABNWC6r5gEAAYLAAE1lwBVOZwCwigCelgawioCNwABNhsAATYvAAFCAAACr5gAAAAEDwABNl8AAUIAAAAABAQHAAE2gAAAAEmDAAF3/AABcAT4GTsAATbnAAE3EAACr52DAAPanAR/AAE3KwAD2xgAAAABOwABN6sAATfIAAIV0YMAAwe4BIMAATfrAAMH6AQABJ4OhAE7AAE46wABOPwAAhAFdwADBTAFgwAD1xQEcwABOSYLAAE5BwBVPMqvoAQABH8AATm3AAMM4AQFgwAD2xwGBwABOkcAVTxIAAMAAwfU9HMAATqiDwABOo8AVT1VPAQABHMAATt0fwABOsMAAXxMBAAABq+kpkhQBAAGAwABO5MAVTv4AwADBbgDAAMFTPTXAAE8IAAABAGB3ARzAAE8IFsAATvkWwABO8C6CHrBsgQye7oIVAwADFsAAT0oWwABPPRbAAE8zFsAATysWwABPIi6CHrBsb57QgruBJ4LRwAD27IF5wAD1Aier6hrAAE94cACAhTUAAAABAFsBHMAAT4qEwABPiMAVT+JPAQABHMAAT5mBwABPjsAVTxIjAAAAAMAA9sAAeTUAAAABAFsBHMAAT62EwABPq8AVT+KCDwAAAAB6hADAFU/iPRzAAE/MFsAAT8MWwABPui6CHrBsn86e76BVAwADGsAAT9er8BrAAE/6n4sywABQA1tbASeBPyQAAier6yer7ACrzQawi4CNwABQhcAAUIrAAFJuAACr5QAAAAEDwABQmMAAUm4AAAABAQHAAFChAAAAEmDAAF3/AABcAT4ETsAAULHAAFC2AACAsGDAAPZdARzAAFDlFsAAUOAWwABQ0xbAAFDJFsAAUMEWwABQuC6CHrBsb57QgruBJ4LRwAD27IF5wAD1Al0BAAEnq+0AwAD2ck7AAFEJwABRDgAAhAFdwAD2KwFdwAD1HQFgwAD0eQEfwABRFMAAX/0BAAEcwABRTRbAAFE1FsAAUSwugh6wbIEMnu6CGAEAARzAAFF5FsAAUW8WwABRZxbAAFFeLoIesGxvntCCu4EnZQEAAYHAAFGBwBVRHADAAPcJAICGAD0ewABRjsAAXyQCAAKAwABRn8AVUQiCwABRpcAVUXEAPRzAAFHCFsAAUbkWwABRsC6CHrBsn86e76BVAwADGsAAUc2r8BrAAFHwn4sywABR+VtbASeBPyQAAier7ier7wCrzQawjICNwABSc8AAUnvAAF89AACr5AAAAAEDwABSjMAAXz0AAAABAQHAAFKaAAAAn+FgwABAeQAAYMAAXf8BPg1OwABSt8AAUsEAAKvwYMAA9kUBH8AAUsfAAPZcAAAAAD0cwABS4oHAAFLYwBVSkmMAAAAAwAD2UU7AAFL4wABS/wAAgRBgwABd/wEWwABTDxbAAFMBLqvMsG6BELBITsAAU13AAFNuAACr8V3AAPTbAWCwmQEcwABTmRbAAFOUFsAAU4YWwABTeC6rzLBuq46wPbBEgdzAAPVwgScBAAE0wABTnwPAAFOfwABTuQAAAAEBAcAAU6AAAACDvWCwmQAAYMAA8rMBSsAAU6YBJcAAU6iDwABTpsAVU0RgsNQAwAD050bAAFPAwABT8AAAAAEAYLCZAIPAAFPewBVS8D4ETsAAU9QAAACe22Cw1AEmwABTwAGEwABT1MAVU31gsNROwABUBcAAVAoAAID7YMAAXnYBJsAAVAUBHMAAVCcWwABUGhbAAFQMLqvMsG6rjrA9sEREAQABhcAAVCjAFVOSAMAA9WJgwABedk7AAFRLwABUUAAAq/JdwAD02wFgsF4BHMAAVFIuq9UCAAKFwABUX8AVU5KAwABUZ8AVUnkAsIBGwABUugDAAFTJAAAAq/NgsF4Ah8AAVNbAFVP8QT4DTsAAVTbAAFU+AACr9GDAAF3hARzAAFVbFsAAVU4WwABVQC6rzLBuq46wPbBERAEAARbAAFVmFMAAVVzAFVQ4CACrxbBgAMAA9WJJwABVfxzAAFWLFMAAVYPAFVRSCQBBAQABKwDAAPXSQsAAVZQAPz0cwABVsBbAAFWrhsAAVabAFVOyq/LAAF38TwEAAR/AAFW4wABemAIAAhTAAFXUwBVUUgkANQAAAAEAYMAA9cUBFsAAVecUwABV3cAVVDgIAKvGsGEjHMAAVfsUAMAVVPcKAEEBAAErAAArHMAAVfsUAMAVVPcKACMAAAAAwAD10wFgwAD2XQAAwAD1Lk7AAFZawABWZgAAq/VdwAD02wFgsJkBHMAAVpEWwABWjBbAAFZ+FsAAVnAuq8ywbquOsD2wRIHcwAD1cIEnAQABNMAAVpcDwABWl8AAVq4AAAABAQHAAFaYAAAAg71gsJkAAGDAAPKzAUrAAFaeASXAAFaghMAAVp7AFVWjYLDRAMAA9OdGwABWtcAAVt0AAAABAGCwmQCEwABW0MAVVU8+BE7AAFbGAAAAnttgsNEBJsAAVrUBhcAAVsbAFVXcYLDRTsAAVu/AAFb0AACA+2DAAF5bASbAAFbvARzAAFcRFsAAVwQWwABW9i6rzLBuq46wPbBERAEAAYbAAFcSwBVV8QDAAPViYMAAXltOwABXNcAAVzoAAKvyXcAA9NsBYLBeARzAAFc8LqvVAgAChsAAV0nAFVXxgMAAV1HAFVJ5ALCARsAAV6QAwABXswAAAKvzYLBeABTAAFfAwBVWWwgAQT4DTsAAV9XAAFfdAACr9GDAAF3hARzAAFf6FsAAV+0WwABX3y6rzLBuq46wPbBERAEAARbAAFgFFMAAV/vAFVaXCQCrxbBgAMAA9WJJwABYHhzAAFgqFMAAWCLAFVazCgBBAQABKwDAAPXSQsAAWDMAPz0cwABYTxbAAFhKh8AAWEXAFVYRq/LAAF38TwEAAR/AAFhXwABemAIAAhTAAFhzwBVWswoANQAAAAEAYMAA9cUBFsAAWIYUwABYfMAVVpcJAKvGsGEjHMAAWJoUAMAVV1gLAEEBAAErAAArHMAAWJoUAMAVV1gLACMAAAAAwAD10wFgwAD2XQAAwAD1Lj0cwABZIRbAAFkSFsAAWQkugh6wbJ+1ns+gLQEAARrAAFkusGsAwABAXEbAAFlzAMAAWX8AAACe22CwmQAWwABZkxbAAFmJLqvPsHaB3MAA9XBBPgNOwABZqsAAWbQAAKv2YMAAXfoBJsAAWaoBHMAAWdEWwABZxBbAAFm2LqvMsG6rjrA9sEREAQABhcAAWdLAFVffAMAA9WJgwABd+knAAFnhHMAAWe+GwABZ5cAVWAVBAQABKwDAAPXSQsAAWfgAP0bAAFoIAMAAWhQAAACr92CwmQAcwABaKBbAAFofLqvPsHZEAQABhcAAWinAFVffAMAA9WJBPgNOwABaQcAAWk0AAKv4YMAAXeEBHMAAWmoWwABaXRbAAFpPLqvMsG6rjrA9sEREAQABh8AAWmvAFVh4AMAA9WJJwABafRzAAFqNFMAAWoHAFViqCABBAQABKwDAAPXSQsAAWpYBPz0cwABatxbAAFqyhsAAWqjAFVgFq/LAAF38TwEAAR/AAFq/wABemAIAAhTAAFrOwBVYqggAJ6v3AADAAPUuPRfAAFsCgsAAWvvAFVLKq/kcwABbNhbAAFsegMAAWxLAFVJ5qIHAAECLq2kCAAIWwABbUhbAAFtJLoIesGxvntAWwABbZ4DAAFtbwBVSeZ/mwABAfwCv7MAAXgo9HMAAW4qBwABbgMAVUpKfbQAAAADAAPZSPRfAAFuegsAAW5fAFVLKnbEfwABbrMAAXiQNAAANq/omwABb9QEcwABb9RbAAFvoFsAAW80uq8ywbquOsD2wREQBAAEWwABcFRbAAFwCgMAAW/bAFVJ5n+bAAEB/n/au8gDAAPViYMAAXnaX/xbAAFwyLqvNsD2wcKv7IxbAAFx1FsAAXG0WwABcZC6CHrBsb57QgsSBQxbAAFyTFsAAXIsWwABcgi6CHrBsb57QgrGBDisBYMAA9l2r/B/AAFzCwADzJAAAAACr/RbAAF0BFsAAXPgWwABc7y6CHrBsk0+e7JNhnrWr/h/AAF07wADzewEAAAGTchbAAF1cgcAAXVLAFVKSn2nAAPZZq/8fwABdkMAA83sBAAABk3IWwABdrC6fZ56SrAAWwABd6xbAAF3egMAAXdLAFVJ5qvXAAEB8rAHAAGI+rAIWwABeMxbAAF4mgMAAXhrAFVJ5qvXAAEB8rALAAGI7rAMqrAQWwABemxbAAF6OgMAAXoLAFVJ5qvXAAEB8rATAAGI8rAUWwABe4BbAAF7TgMAAXsfAFVJ5qvXAAEB8rAXAAGI9rAYWwABfEhbAAF8KFsAAXwEugh6wbG+e0IK2gSDAAF4BSsAAXywBgsAAXzPAFVLKAAAVPdIAFT4FABU+RwAVP6cAFUAfABVAaAAVQtsAFUSlABVGkwAVRtMAFUf1ABVItQAVSlMAFUuAABVMVwAVTYsAFU7WABVQ4AAVUlEAFVueAAAAEwKwj4CNwABfy8AAX9HAAGBlA6wHAAABYMAAXkYAAAEEsJKAjcAAX/3AAGAXGKvesD0AYMAA9qcBH8AAYAnAAPbGAAAAAAEFsJcAAAAABAAAAwAAAAAAAAAAAGCwjwE/AQkBAMAAXkwAAAAAAgawlICNwABgG8AAYDLAAGBCAQCBPwEawABgHMAA7ksAAAEDwABgN8AAYEIAAAAAAAAAYMAA9l0BSsAAYDoBJMAAYEIBFsAAYDwuq96wPbCSBrCVgI3AAGBGwABgTsAAYGMBAFoAAAABA8AAYFXAAGBjAAAAAAAAAGDAAPR5AUrAAGBYARzAAGBcFsAAYFgughPAAF5JgUEBAAEWwABgXi5jwABeSADAAPWfAAAVXF8AFVyvABVdCQAAAAIAAAGAjQAVXRwAFRw2ABU6igAVOyoAFTuuABVb8wAVXRoAAAAFABVdHAAAAAAAsJisCICOAAAHgO0AAEUAAQEBgbWBOwAAnr4AAIFUAADAAFohAACBggAAwABU/AABAQGoi4G/AACByQAAgdsAAMAAVMsAAIHwAADAAFgxAAAAAAAOArCZgI6D5oP1hCYHrAkAAAFgwAD1xQABYKvxAAEFsJ0AAAAABAAAAwAAAAAAAAAAAGCwmQE/AQkBAMAA9dsAAAAAAQawm4COhBWEIIQkAQKAsAAAAAEDhCSEJAAAAAAAAABgwAD2XQAAABVd3wAVXgQAAAABArCegI6E1oTlhVkHrAoAAAFgsJkAAAABBbCiAAAAAAQAAAMAAAAAAAAAAABgsJ4BPwEJAQCwnQAAAAABBrCggI6FQ4VLhVcBAqAqAAAAAQOFV4VXAAAAAAAAAGDAAPbeAAAAFV5NABVecgAAAAECsKOAjoXXhd2HqAOsCwAAAWDAAPXFAAAEBLClgI6F+4X/CYCwAGDAAPZdAASwpoCOhnSGhwmrDgBgwAD23gAEsKeAjobGhtAJlF4AYMAA8rMABLCogI6G/Ib/CYCgAGDAAPbeAAEFsKyAjocEhwSHUAAAAAOHEIdQAAAABAQEhxYAAASUXmDAAPKzAIcnAAAEgLBgwAD2XQCHMgAABICgYMAA9t4AhzwAAASrDmDAAPbeAABgsKMBPwUIAbCngADAFV7+CAGwpYEAwBVfCwgBsKiCAMAVXxgIAbCmgwDAFV8lCQGHBMAA9dsAAAAAAQawqoCOh1WHaIemAAAjARqHVsAA7ksAAAEDh3CHpgAAAAAAAABgwAD2XQFKh3YBJIemBSesDBaHfy6AsLClJ4KmIxaHhi6UXrCnJ6wNJwABYMAA9l0ngtoAABVfbgAVX8YAAAABArCtgI6IVIhjifwHrA4AAAFgsJkAAAABBbCzAAAAAAQAAAMAAAAAAAAAAABgsK0BPwEJAQCwnQAAAAADBrCvgI6JLolAiUcBAoQJAAAAAQOJR4lHAAAAAAAAAGCwngAGsLCAjomnibCJuQECrA8AAAABA4m5ibkAAAAAAAAAYMAA8rMABrCxgI6J54nwifoBAoPfAAAAAQOJ+on6AAAAAAAAAGDAAPKzAAAAFWAPABVgMgAVYFcAFWB8AAAAAwKwtICOif+KDop/B6wQAAABYLCZAAAAAQWwuAAAAAAEAAADAAAAAAAAAAAAYLC0AT8BCQEAsJ0AAAAAAQawtoCOimSKdop9AQKECQAAAAEDin2KfQAAAAAAAABgsJ4AAAAVYM0AFWDwAAAAAQKwuYCOioKKkYuFB6wRAAABYLCZAAAAAQWwvgAAAAAEAAADAAAAAAAAAAAAYLC5AT8BCQEAsJ0AAAAAAgawu4COivuLBosVAQKsEgAAAAEDixWLFQAAAAAAAABgsJkABrC8gI6Ldot+i4MBAicAAAABA4uDi4MAAAAAAAAAYMAA9HkAAAAVYTkAFWFcABVhgAAAAAICsL+AjoxmjHWRngeoyAAAAWCwmQAAAAEFsNAAAAAABAAAAwAAAAAAAAAAAGCwvwE/AQkBALCdAAAAAA4GsMGAjozxjPqNBAECom0AAAABA40EjQQAAAAAAAAAYMAAVMwABrDCgI6NNo0/jUkBAoRGAAAAAQONSY1JAAAAAAAAAGDAAPKzAAaww4COjYCNiY2RAQKD3gAAAAEDjZGNkQAAAAAAAABgwADyswAGsMSAjo3LjdSN5AEClKwAAAABA43kjeQAAAAAAAAAYMAA8rMABrDFgI6ODo4XjiQBAoRFAAAAAQOOJI4kAAAAAAAAAGDAAPKzAAawxoCOjkiOUY5YAQKEQgAAAAEDjliOWAAAAAAAAABgwADyswAGsMeAjo7Fjs6O2AECqlYAAAABA47YjtgAAAAAAAAAYMAA8rMABrDIgI6O/Y8Gjw4BAoRAAAAAAQOPDo8OAAAAAAAAAGDAAPKzAAawyYCOjzOPPI9EAQKEQQAAAAEDj0SPRAAAAAAAAABgwADyswAGsMqAjo+Vj56PqgECpt8AAAABA4+qj6oAAAAAAAAAYMAA8rMABrDLgI6P/JAFkAwBAoPiAAAAAQOQDJAMAAAAAAAAAGDAAPKzAAawzICOkGmQcpB8AQKD3wAAAAEDkHyQfAAAAAAAAABgwADyswAGsM2AjpDokPiRBgECkmkAAAABA5EGkQYAAAAAAAAAYLCtAAawzoCOkYORlZGcAQKECQAAAAEDkZyRnAAAAAAAAABgsJ4AAAAVYc0AFWHyABViFwAVYjwAFWJhABVihgAVYqsAFWLQABVi9QAVYxoAFWM/ABVjZAAVY4kAFWOsABVjzwAAAA4CsNGAjpJXkmaSiAesEwAAAWCwvwAAAAEFsNMAAAAABAAAAwAAAAAAAAAAAGCw0QE/AQkBALDQAAAAAAAAABVkTAAAAAACsNSAjpNak2mUwwesFAAAAWCwvwAAAAEFsNoAAAAABAAAAwAAAAAAAAAAAGCw1AE/AQkBALDQAAAAAAMGsNaAjpP0k/2UBwECg+QAAAABA5QHlAcAAAAAAAAAYMAA8rMABrDXgI6UPJRTlGUBAqwVAAAAAQOUZZRlAAAAAAAAAGCw+wAGsNiAjpSmlLaUwQEClPUAAAABA5TBlMEAAAAAAAAAYLDbAAAAFWSRABVktgAVZNkAFWT8AAAAAwKw24COlQmVD5r2A5UAAAABYMAA9cUAAAgEsN2AjpVglY4GnA8AYLDbASCVbbDrAQABGpWJiaQABLDegI6V1JYjBqwWAGCw2wEgleyw6wIAARqWCImlAawXKQSw34COlmmWrgab1gBgsNsBIJZ9sOsCAAEalpmJpgGVvykEsOCAjpb1l2IGrBgAYLDbASCXCLDrAwABGpcriacClb8prBcpBLDhgI6X+5gCCZW/AGDAAPKzAASw4oCOmJeYoQmsFwBgwADyswAEsOOAjpi6mMoJrBkAYImeAASw5ICOmheaawYpAF3AAPUdAWCw2wE6miBgsNsEGpo5sN0amkOw3hqaUrDfGppdsOABBbDrgI6Yz5jVmS4BgKiwmAADmOKZLgAAAAMBAZjoAAAErBlgiZ4AApkGAAAElb9gwADyswEqmRsAAASsF2DAAPKzASpgsNsBPwQIAbDjgADAFWY3CAGw4YEAwBVmQwgBsOKCAMAVZlEJAZjVwAD12wAAAAACBrDmgI6ZM5lGmZkAACMBGpk0wADuSwAAAQOZTpmZAAAAAAAAAGDAAPZdAT4BSplXASSZlQIjFplhLpW/sOEnmSQnmSIBYMAA9l0jFpl+LqwXsOIngz4nAAFgwAD2XQaw6ICOms+a15r0AQAnAAAAAQOa3Zr0AAAAAAAAAGDAAPR5AUqa4AEcmucamuCw5ICuAQABLgDAAPUyAAAVZpAAFWbuABVnKQAAAAICsOyAjpwcnCudrwesGgAAAWCw1AAAAAEFsPIAAAAABAAAAwAAAAAAAAAAAGCw7AE/AQkBALDaAAAAAAMGsO6AjpyenKecvgECqsIAAAABA5y+nL4AAAAAAAAAYMAA8rMABrDvgI6dBp0PnSMBAqu2AAAAAQOdI50jAAAAAAAAAGDAAPKzAAaw8ICOnYidkZ2tAQKqbAAAAAEDna2drQAAAAAAAABgwADyswAAABVndgAVZ5sAFWfAABVn5QAAAAMCsPOAjp8InxefrgesGwAAAWCw1AAAAAEFsPcAAAAABAAAAwAAAAAAAAAAAGCw8wE/AQkBALDaAAAAAAEGsPWAjp+Ln6GfrAECmFAAAAABA5+sn6wAAAAAAAAAYLDsAAAAFWg2ABVoWQAAAAECsPiAjqH/og6iJAesHAAAAWCwmQAAAAEFsPoAAAAABAAAAwAAAAAAAAAAAGCw+AE/AQkBALCdAAAAAAAAABVoogAAAAACsPuAjqJRoleyggOsHQAAAWDAAPXFAAAFBLD9gI6i66MGBoOrAGDAAPZdASesHgSw/oCOo0ujXQmsHwBgwAD0eQAEsP+AjqOXo6sJlGwAYMAA9HkABLEAgI6j9aQECZRtAF3AAPUdAWDAAPZdAASxAYCOpDikRgmSXgBgwAD0eQADBbERgI6kS6RRpMgBAAADpGOkyAAAAAQEBKRpAAAErB9gwAD0eQCkggAABJRsYMAA9HkApKMAAASUbV3AAPUdAWDAAPZdAKS5AAAEkl5gwAD0eQAAYLD7AT8FCAGw/oAAwBVpRggBsP+BAMAVaVMIAbEAggDAFWlgCAGxAYMAwBVpcwkBpFHAAPXbAAAAAAWxEoCOpM2k06UQAaJ/AAOk7KUQAAAAAAAAAGCw+wE/AQoApPGxEQQABJOTOqT8YMAA9l0AkwAFsROAjqUVpRulWAGZywADpTSlWAAAAAAAAABgsPsBPwEKAKU5sREEAASUlDqlRGDAAPZdAJMACwaxA4COpV2lZaZqBAGsIAAAAAEDpYCmagAAAAEBAaWOAAAAghdgwABYyQAAYLD7AT4BSqWaAR+lpbERBAAEFqXVFqXGgKXBwBVqSKt2wABYzFrAAPVMHKYAFqX5FqXqgKXlwBVqSKt2wABYzFrAAPVMXQEAARamHhamB4CmAsAVakird8AAWM1awAD1TADAAPWeFqYzgKYuwBVqSJRtwABYzhamXxamUYCmTMAVakijg8AAWNBawAD1TAAGsQSAjqavpreoWgQBq0EAAAABA6bcqFoAAAABAQGm6AAAAIL9YMAAWmkAAGCw+wE+Bz0cpv2ApvbAFWsDghsBAAEapwOw/QDAAFprTqcRpyQAAKwfYMAA9HkBHKctgKcmwBVrA6tGAAAAAMAAWnROp0CnVQAAlGxgwAD0eQEcp16Ap1fAFWsDq0YAAAAAwABadE6neqeKAACUbV3AAPUdAWDAAPZdARynk4CnjMAVawOsIQAAAADAAFp4Tqeqp7kAAJJeYMAA9HkBHKfCgKe7wBVrA6tGAAAAAMAAWnQ9HKfYgKfRwBVrA4ITAQABGqfcsP0AwABabEqn5gEfp/GxEQQABIGoBMAVazKCqBjAFWtVg6g2wBVreISoR8AVa6EABrEGgI6olaiaqYAAAKtNAAAAAQOoqamAAAAAAQEBqLMAAACEAWDAAFonAABcAT4GPRyoxICov8AVbCSCGwEAARqoyrD9AMAAWiw9HKjZgKjUwBVsJKtRAQABFqjiLqwfsP4AwABaMj0cqQCAqPvAFWwkq1EBAAEWqQkulGyw/wDAAFoyPRypKYCpJMAVbCSsIgEAARapNi6UbbEAAMAAWjY9HKlRgKlMwBVsJKtRAQABFqlaLpJesQEAwABaMj0cqXSAqW/AFWwkghMBAAEaqXiw/QDAAFotBrEKgI6pxKnMqioBAKwjAAAAAQOp36oqAAAAAAAAAGDAAPR5AUqp6AEcqhIcqf0WqegulGyw/4FBAQABFqn/LqwfsP4AwAD1n10BAAEWqiQWqhQulG2xAFrAAPVMAMAA9Z4GsQuAjqpsqnSqtAEArCQAAAABA6qEqrQAAAAAAAAAYMAA9HkBSqqHARyqnBaqhy6UbLD/XQEAARaqrhaqni6UbbEAWsAA9UwAwAD1ngaxDICOqzGrQ6vLAQCsJQAAAAEDq1GrywAAAAAAAABgwABU/QE+AUqrVwEeq2LAAFUSAwADHKuFFqtwLpRssP9dAQABFquXFquHLpRtsQBawAD1TADAAPWeFqunLpRtsQAWq7gukl6xAQAGsQ2AjqvQq+SsuAEAg4kBGqvRwADuSwAAAQOr7ay4AAAAAAAAAGDAAPR5AUqr8AEeq/iB3AIAAhasCC6UbbEAHqwngdoCAAIWrD0ulGyw/x6sZYHaAgACFqx/LqwfsP4erJuB2gEAARaspi6SXrEBAAAAAAaxB4COrL2s1670AwBBARqsvsAA7ksAAAEDrNmu9AAAAAEBAazaAAAAg5tbAABgwADyswE+BUms5x6s68AA7l4CAAIugKz7wBVujwBKrQMBKT9JrRQhJa0egK0YwBVuj2Cw+0qtNgEqP0mtSCIiIiEcrV8WrUwurB+w/kEBAAEWrWiArWLAFW6PrB8AAMAA9ZwBIRytmxathi6UbLD/QQEAARatpICtnsAVbo+UbAAAwAD1nAEhHK3TFq3ELpJesQFBAQABFq3cgK3WwBVuj5JeAADAAPWcASEcrg0WrgYWrfYulG2xAFrAAPVMQQEAARauJhauFoCuEMAVbo+UbQBaAADAAPWcPgFKrjYBKj9Frk4BrleuWQAAW2DAAPR5AZMBHK5gga5ewBVvflwBAAEWrnIWrmIulG2xAFrAAPVMAMAA9aYBia56wBVvfhyue4GuesAVb35dAQABlADAAPWePgFJrochHK6eHK6aFq6LLpRtsQBEAQABga6bwBVvfgDAAPUsQQEAARyuthaup4CuocAVbo+UbQBEAQABga63wBVvfgAAAMAA9mw+AUquxQEqP0qu5QEpBrEOgI6vLa84sK8BAKwmAAAAAQOvQrCvAAAAAAAAAGDAAPZdAT4HTq9Vr1gAAIN6YMAA9qcBH69ewAD2xgAAAABJr3IhHK+FFq92LpJesQFBAQABkwDAAPWcPgM9HK+WgK+TwBVwS4IRAQABJ1wAwAD2uz0cr6uAr6jAFXBLghEBAAEWr7Eukl6xAQDAAPa7PRyvy4CvyMAVcEuCEQEAASeAiwDAAPa7Pz0cr+SAr+HAFXBLghEBAAEng5wAwAD2uz0cr/eAr/TAFXBLghEBAAEWr/0ulGyw/wDAAPa7SbAYHLAzFrAsFrAcLpRtsQBawAD1TICLAQABkwDAAPWoPgI9HLBDgLBAwBVwS4IRAQABJ4CbAMAA9rs9HLBYgLBVwBVwS4IRAQABHLBuFrBeLpRtsQBRAQABJ4CbAMAA9O8AwAD2uz89HLCHgLCEwBVwS4IRAQABJ4LaAMAA9rtKsJcBHLChgLCewBVwSyMAAAAAwAD2wAaxCICOsLSwx7InAAAjARqwtcAA7ksAAAEDsM+yJwAAAAAAAABgwAD2XQE+B06w5bDoAACDemDAAPanAR+w7sAA9sYAAAAAPRyxBYCxAsAVccaCEQEAASesJwDAAPa7PRyxKoCxJ8AVccaCEQEAASSxWQMnrCgWsUUurB+w/ieAmwDAAPa7PRyxY4CxYMAVccaCEQEAASSxlgMnrCkWsYAulGyw/yeAmwDAAPa7PRyxoICxncAVccaCEQEAASSx1wMnrCocscoWsboulG2xAFEBAAEngJsAwAD07yesKwDAAPa7PRyx4YCx3sAVccaCEQEAASSyCAMnrCwWsfgukl6xASeC2gDAAPa7SrIPARyyGYCyFsAVccYjAAAAAMAA9sAGsQ+AjrIssjSygAEAl/8AAAABA7I5soAAAAAAAAAAYMAA9HkBSrJCARyyaByyVxayQi6UbLD/XQEAARayWS6SXrEBAMAA9Z5dAQABFrJ6FrJqLpRtsQBawAD1TADAAPWeAAAVaioAFWrlABVsBgAVbN4AFW1AABVtjQAVbfcAFW5rABVwIwAVcZgAFXK5ABVzGgAAAAsAAAGAjgAVc1EAFV2cABVeEQAVXn8AFV/TABVgkQAVYP0AFWGRABVkEAAVZFUAFWURABVnOgAVZ/oAFWhmABVoqwAVc08AAAAOABVzUQAAAAAAsRSsLYCPAAAUgPQAAMAAt9QAAQEBncyBGgAAnoMAAQEBn16BSAAArH4AAQEBn5SBcQAAnr4AAIGHAACskgABAQGflYG+AADAAFaOAACB3gAAnsEAAQEBn6+CBAAAgOcAAIIbAACwmAAAgjwAAMAAWDEAAIJaAAC1FwAAgngAAMAAX/4AAIKbAADAAGAuAACCwAAAv2EAAILxAADAAFRyAACDFwAAwABdIAABAQasLqwvrDCsMawyrDODtAAAv/sAAQEEn6mqnJ+qrDSEIQAAwABhfQAAhD0AAIHJAAEBAZQDhGIAAMAAQHUAAQEBn6wAAAAHArEVgI+EioSQiZ8Dn5sAAAFgnoQAAAMEsRiAj4TIhNMYrDWxFABgsVsBKwSxGYCPhOeFABisNgBgwABf/wErBLEagI+FE4UbCYIeAGCexAABBbEjgI+FTYVNha4AAAADhViFrgAAAAEBAYViAAAAgh5gnsQAAGCxFQE/AggAsRqAhYTAFXT+CQCFlp6kAQABFoWlgIWcwBV0/pNPnuwABQaxHICPhSCFN4VIAQCAsAEahSHAAO5LAAABA4U8hUgAAAAAAAAAYMAA9l0BSoU/ASesNwaxHYCPheeF8IYUAQCf7wAAAAEDhf6GFAAAAAAAAABgwADyswFKhgEBIRyGDRaGAS6sNbEUsRhBAQABKwDAAPXSBrEegI+GTYZkhxoBAJ/XAAAAAQOGb4caAAAAAAAAAGCxWwE+AkAhHIaRFoaFLqw1sRSxGEEBAAErAMAA9dKGhYaYAR6GoqvfAgACGoarq/AnrDgASocEARaHCy6sNbEUsRgGsSCAj4cfhzKH+gAAn/AAAAABA4dKh/oAAAAAAAAAYLFbAT4BSodTATUAAAABAGCxWwEWh1ourDWxFLEYIxyHZoAAwBV2NEEBAAErAMAA9dIXh1ourDWxFDWHhAAAAQBgsVsBHIeEFodzFodqLoIesRqfvJ7Zn/ACAAIuFoejLoIesRoAtsA1AAAAAQBbAReHuYGHt8AVdmSsORaH1haHzS6CHrEan8me6LFrgQDAFXZksRiAAMAVdjQBYLFbBrEhgI+H/4gIiZ0AAKAdAAAAAQOIHYmdAAAAAgICiCsAAACf4WDAAEB5AIhZAAAAoAtgtT0AAGCxJAE+A06IgIiJAACfv2CxJAE1iJwAAAEAYMAAX/8BHIicFoiUFoiLLoIesRqfvJ7ZoB0EAAQuFojBLoIesRqAiMvAFXbmgYjYwBV28wC2wTUAAAABAFsBF4j4goj2wBV3E6w5FokVFokMLoIesRqfyp7pwABgDoIAwBV3E0mJOBqJPJ7APgE9F4laLqw2JolaAYKJdsAVdwZgwABf/7EZP0qJigGCiZHAFXcGAAAVdTQAFXVnABV1qAAVdgoAFXbIABV3rAAAAAUCsSSAj4miibGO7QefmgAAAWDAAPXFAAACBLEmgI+LFYs4BKw6AGDAAPKzASoEsSeAj4w+jEsYoCwAYMAA8rMBKwEFsTgAAAAABAAAAwAAAAAAAAAAAGCxJAE/AQkBAMAA9dsAAAAADQaxKYCPiz2LTotaAQKf2AAAAAEDi1qLWgAAAAAAAABgwABUpwAGsTCAj4tfi2SLwQACoCkAAAABA4toi8EAAAADAwOLeAAAAJ+1YMAAQFkAi5cAAACB6mCw1ACLtwAAAIQsXcAA9NsBYMAA9t4AAFwABrExgI+LxYvKi9EAAoIPAAAAAQOLz4vRAAAAAAAAAFwABrEqgI+MGowjjDQBAqw7AAAAAQOMNIw0AAAAAAAAAGDAAPKzAAaxK4CPjFCMWYxlAQKsPAAAAAEDjGWMZQAAAAAAAABgwADyswAGsSyAj4xqjHyMhQECoC4AAAABA4yFjIUAAAAAAAAAYMAAQFIABrEygI+MioyPjK0AAoO8AAAAAQOMloytAAAAAQEBjJwAAACBKGEBYKx/XAAAXAAGsTOAj41tjXKNqgACn/0AAAABA419jaoAAAACAQGNigAAAKrFYL/+AAGNnAAAAKAoWwErXAAGsTSAj42ujbOOBgACoC8AAAABA43YjgYAAAABAQGN8wAAAJ/mYK7vAABgwADyswAGsTWAj45GjkuOXgACoDAAAAABA45cjl4AAAAAAAAAXAAGsTaAj45ijmeOiwACndwAAAABA45xjosAAAABAQGOdwAAAJNXYQFgwAD2XVwAAFwABrEtgI+OkI6rjrwBAqA0AAAAAQOOvI68AAAAAAAAAF3AAPTbAWCwvwAGsS6Aj47BjtuO6wECmkEAAAABA47rjusAAAAAAAAAXcAA9NsBYLCtAAAAFXgxABV4VgAVeKIAFXjDABV46AAVeQ0AFXkyABV5YQAVeZcAFXnHABV56AAVehkAFXpCABV6awAAAA0CsTmAj47wjv+Y+gesPQAAAWDAAPXFAAAAAQWxRwAAAAAEAAADAAAAAAAAAAAAYLE5AT8BCQEAwAD12wAAAAALBrE7gI+PX49kj8cAAqw+AAAAAQOPfI/HAAAAAwEBj4sAAACCF2DAAFhdAAKPnQAAAKw/YMAA8rMBKo+zAAAArEBgwADyswEqXAAGsTyAj5BUkGCQigACrEEAAAABA5B5kIoAAAABAQGQhgAAAJk8YLCtAABgv/4ABrE9gI+RL5E7kWQAAqxCAAAAAQORU5FkAAAAAQEBkWAAAACZPGCwrQAAYL/+AAaxPoCPkeyR+JIVAAKsQwAAAAEDkhOSFQAAAAAAAABgv/4ABrE/gI+SlpKiktMAAqxEAAAAAQOSupLTAAAAAQEBksoAAACST2Cw1AAAYL/+AAaxQICPk16TapOSAAKsRQAAAAEDk32TkgAAAAEBAZOLAAAAkltgsL8AAGC//gAGsUGAj5QblCeUUAACrEYAAAABA5Q7lFAAAAABAQGUSgAAAICKYMAAVr0AAGC//gAGsUKAj5RVlFqUswACrEcAAAABA5RllLMAAAADAwOUdgAAAJ+/YLEkAJSPAAAAgepgsNQAlKkAAACELF3AAPTbAWDAAPbeAABcAAaxQ4CPmAmYDphSAAKsSAAAAAEDmBqYUgAAAAICApgkAAAAn79gsSQAmEQAAACsSV3AAPTbAWCwrQAAYMAA8rMABrFEgI+Yh5iMmJsAAqxKAAAAAQOYmZibAAAAAAAAAFwABrFFgI+Yz5jUmPgAAp3cAAAAAQOY3pj4AAAAAQEBmOQAAACTV2EBYMAA9l1cAABcAAAAFXroABV7MgAVe2AAFXuOABV7sQAVe98AFXwNABV8PQAVfIcAFXzIABV86QAVfRoAAAALArFIgI+Y/ZkMnuoHrEsAAAFgsSQAAAEEsUuAj5qZmsEYrEyxFABgwABAWQEgmrHAAEBeAAAAAAEFsVoAAAAABAAAAwAAAAAAAAAAAGCxSAE/AQkBALE4AAAAAAsGsU2Aj5kumT+ZQwECk28AAAABA5lDmUMAAAAAAAAAYJ6EAAaxUYCPmUeZTJlnAAKsTQAAAAEDmVaZZwAAAAEBAZljAAAAmTxgsK0AAFwABrFSgI+Za5lwmZUAAqxOAAAAAQOZgJmVAAAAAQEBmYsAAACqyGDAAF1pAABcAAaxU4CPmZmZnpm9AAKsTwAAAAEDmayZvQAAAAEBAZm1AAAAqs5gwABdtAAAXAAGsVSAj5nBmcaZ7gACrFAAAAABA5nXme4AAAABAQGZ4wAAAKrSYMAAXS4AAFwABrFVgI+Z8pn3miIAAqxRAAAAAQOaCZoiAAAAAQEBmhYAAACsUmDAAF3OAABcAAaxToCPmiaaO5pDAQKj1wAAAAEDmkOaQwAAAAAAAABgsTkABrFPgI+axprZmvoBAJ+1AAAAAQOa6Jr6AAAAAAAAAGDAAEBZAUqa6wEWmusurEyxFLFLBrFWgI+a/5sQm88AAKApARqbAMAA7ksAAAEDmxSbzwAAAAMDA5skAAAAn7VgwABAWQCbQwAAAIHqYLDUAJtjAAAAhCxdwAD02wFgwAD23gAAXAE+Aj0Xm3QurEyxFICbhsAVfy2xSz0cm6MWm5ouo9exTqxHAwADLoGbtcAVfzqCm8HAFX9FALFCBrFXgI+b1JvlnKQAAIIPARqb1cAA7ksAAAEDm+qcpAAAAAAAAABcAT4CPRecWi6sTLEUIJxywABAXgAAAACxSz0cnJEWnIguo9exTqxKAAAAALFEBrFYgI+c65zwnugAAKxTAAAAAQOdCJ7oAAAAAQEBnRwAAACf5mCu7wAAYMAA8rMBPgI9HJ07Fp02LpNvsU2TjQEBYMAA9YIBNJ1DA51DntIAAAAAAAAAYMAA9YIBPgFGnZud8J2sAAAAqgJgsK0AFp3TFp3GLp/YsSmsVMAAVKk+AUWd+gGeC54YAACUlWCwrQGBnhrAFYBKASEcnkGCnjTAFYBsQQEAASsAwAD10gGKnlbAFYBsHJ54gJ5lwBWABKpzAQABgp6GwBWAbACvAj4BPRyeoS6sTQEAAYKerMAVgGwAsVEAnpZKntkBKQAAFX2rABV9zgAVffoAFX4oABV+VgAVfoQAFX6yABV+1QAVfwgAFX+SABV/5gAVgNQAAAALArFbgI+fHZ8jwABD7gOfnAAAAWCxSAAADgSxXYCPn2qfpgaqqABgwABAUgEgn4PAAEBYAQABJ5+cAASxXoCPn8qfzgmTbwEan6zAAO5LYJ6EAASxX4CPn9+f4wmAsABgwAD2XQAEsWGAj5/9oAUJrFWxFABggP8ABLFpgI+gLKA0CaPXARqgCsAA7ktgsTkABLFigI+gUKB6CaxWsRQAXcAA9g4BYLCtAR+gZYvUAAFgsK0AAASxY4CPoIOgmxisV7EUAGDAAPKzASoEsWSAj6DEoNEJrFixFABgv3IABLFlgI+g66D7CaxZsRQAYLGVAASxZoCPoRihIQmfsrEUAGCrvwAEsWqAj6E3oUwYoCwBGqEnwADuS2DAAPKzASoEsWeAj6FkoXIYrFqxFABgwABAXwErBLFogI+hjaGrCaxbsRQAXcAAvHMBYKx/AR+hmsAAvR8AAWCsfwAABLFrgI+iUKJhGKw5AGEAXAErAQWxioCPomaiZqNMAAAAA6J4o0wAAAAHBgeifgAABJNvYJ6EAKKJAAAErFVggP8AopgAAASfsmCrvwCiqAAABKPXYLE5AKK9AAAErFhgv3IAotEAAASsWWCxlQCi7wAABICwYMAA9l0BJ6xcAGCxWwE+AT0XoxQurFqxFB+jKbGUAQABLgCxZwgIAbFegADAFYKRCAGxYYEAwBWCnAgBsWaCAMAVgqcIAbFpgwDAFYKyCAGxZIQAwBWCvQgBsWWFAMAVgsgIAbFfhgDAFYLTCQGiZrFaAAAAABoGsW2Aj6NRo3ijlQEAn9gBGqNSwADuSwAAAQOjhaOVAAAAAAAAAGC/YgFKo4gBFqOILqxYsRSxZAaxboCPo5qjr6PNAQCsPAEao5vAAO5LAAABA6O8o80AAAAAAAAAYMAA8rMBSqO/ARajxhajvy6sW7EUsWiA/MAA9P8GsXSAj6PSo+OkYQAAoDABGqPTwADuSwAAAQOj9KRhAAAAAAAAAFwBPgFJo/0WpAgWpAEurFuxFLFog2jAAPUAPgE9HqQcq98CAAIWpDIWpCwWpCUurFuxFLFogtLAAPUBkw2sgSSkVgIWpD0ugLCxXyesXQA/BrFvgI+kZqSMpL4BAJpBARqkZ8AA7ksAAAEDpJ2kvgAAAAAAAABdwAD02wFgsK0BSqSgARakrhakoC6sWLEUsWSaQb90BrF1gI+kw6TUpZUAAJ/9ARqkxMAA7ksAAAEDpN+llQAAAAIBAaTsAAAAqsVgv/4AAaT+AAAAoChbAStcAT4CSaUTFqUjgKUXwBWErID8wABABEqlLAA/PRylRxalOC6ftbFPqsYEAASBpVzAFYS4gKVqwBWErBaldy6sWrEUsWcWpYcuoC6xcQDAAEBbBrF3gI+lmqWfp3AAAKxesRQAAAABA6W4p3AAAAAFAQGlxwAAAIIXYMAAWF0ABKXmAAAAmFBgsOwBK6X+AAAArEBgwADyswEqph0AAACsX2DAAPKzASqmQQAAAKxgYMAA8rMBKlwBPgE9HKZjFqZeLpNvsV6TjQEBYMAA9YIBNKZrA6Zrp2sAAAAAAAAAYMAA9YIBPgI9HKaEFqZ2LqxYsRSxZKxhBAACgKaewBWFNBampC6sYrEUsXkCmFCBpsvAFYVCrGCEpufAFYVqv3g9HKcGFqb9LqPXsWmsPgMAAYCnH8AVhTQCrD+DpznAFYVcrECCp1jAFYVOsTsAnpYGsX+Aj6d1p4aoUgAAoC8BGqd2wADuSwAAAQOnq6hSAAAAAQEBp8YAAACf5mCu7wAAYMAA8rMBPgJJp+Aap+2xJkqoCgEpP0qoGwEcqCIurFMBAAGAqDvAFYY3ALFYBrGAgI+oV6hoqaMAAKxNARqoWMAA7ksAAAEDqHKpowAAAAEBAah/AAAAmTxgsK0AAFwBPgE9HKiYFqiKLqxYsRSxZKxjAwACgKiswBWGlTSouQOouamQAAAAAgICqMcAAACSW2CwvwCo4gAAAKxkXcAAYX4BYMAAYPMAAGDAAPWCAT4BSajyFqj9gqj2wBWG2INowABhij4BPRypHRapEy6fsrEUsWagYgIAAoGpK8AVhs0kqYAEJ6xlgalTwBWGzSeDDhypZIKpXcAVhtiDlAEAARqpd8AAYPgAwABhmACrxT8BrGYpv3kGsXiAj6nbqeCrgQAArGexFAAAAAEDqe+rgQAAAAICAqn3AAAAkltgsJkAqhIAAACsZF3AAGF+AWDAAGDzAABcAT4DSaogHKorgaokwBWHhILQAQABGqo+wABg+QDAAGGXPgE9HKpPLqxosRQBAAEmql4BgKpewBWHeWCwvwCxfT9JqnEcqnyBqnXAFYeEgtABAAEaqo/AAGD6AMAAYZc+AT0cqqwurGmxFAEAASaqxgGAqsbAFYd5YLC/ALF7P0mq2Ryq5IGq3cAVh4SC0AEAARqq98AAYPsAwABhlz4BPRyrEi6f/QIAARyrJxarHi6j17FprEMAAAAAsT4BoCgnrGqxdT8GsXmAj6u2q7uuNQAArGKxFAAAAAEDq8muNQAAAAICAqvWAAAAmTxgsK0Aq+0AAACsZF3AAGF+AWDAAGEaAABcAT4CSav7HKwGgav/wBWIiYLQAQABGqwYwABhIADAAGGXPgM9HKw+FqwvLqxWsRSxYk8BAAGArELAFYh+AMAA9hs9HKxcFqxOLqxYsRSxZKxjAgACgKxwwBWIfhasdS6sZ7EUsXgAv3k9HK0qLp/9AgABHK0/Fq02LqPXsWmsQQEAAYCtWcAViH4AsTwBoCgnrGuxdT9JrZgcraOBrZzAFYiJgtABAAEarbXAAGEhAMAAYZc+AT0crcsun/0CAAEcreAWrdcuo9exaaxCAQABgK35wBWIfgCxPQGgKCesbLF1PwaxgYCPrjquS67bAACsUAEarjvAAO5LAAABA65crtsAAAABAQGuaAAAAKrSYMAAXS4AAFwBPgE9HK5/Fq56LpNvsV6TjQEBYMAA9YIBNK6HA66HrtYAAAAAAAAAYMAA9YIBPgE9HK6gFq6SLqxYsRSxZKxtAgACgK6zwBWJpRauvy6sZ7EUsXgAv3oAnpYGsYKAj67grvGwFQAArFEBGq7hwADuSwAAAQOvA7AVAAAAAQEBrxAAAACsUmDAAF3OAABcAT4BPRyvKBavIy6Tb7Fek40BAWDAAPWCATSvMAOvMLAQAAAAAAAAAGDAAPWCAT4BSa87HK9NFq8/LqxYsRSxZKxuAQABgK9hwBWKMwC/fD4CPRyveS6f/QIAARyvjhavhS6j17FprEYBAAEWr6+Ar6PAFYozgIrAAF3QALFBAaAoJ6xvsXU9F6/qLqxXsRQpsWM/AJ6WBrGDgI+wGrArsvsAAKxOARqwG8AA7ksAAAEDsDuy+wAAAAEBAbBGAAAAqshgwABdaQAAXAE+Aj0csGUWsFcurFixFLFkrHACAAKAsHfAFYr9FrCCLqxnsRSxeAC/e0FHsPoWsQyAsQLAFYr9ghzAAF1sAwKxLRqxLcAAXVuxWhqxWsAAXVwAPgI9HLF8LqxesRQDAAEWsaCAsZbAFYr9ghfAAF1uAphQJrHJARaxyYCxv8AViv2TDcAAXWtgsOysXyqxd0Kx9AABshQashTAAF1dAD4CPRyyKS6sXrEUBAABFrJNgLJDwBWK/YIXwABdbgOYUCaydgEWsnaAsmzAFYr9kw3AAF1rYLDsrF8qrGApsXdCss4AAAE+AUKy7AAGsYSAj7MAsxG4LwAArE8BGrMBwADuSwAAAQOzH7gvAAAAAQEBsygAAACqzmDAAF20AABcAT4CTrNAs0UAAIIXYMAAWDYBFrNPgLNHwBWMHIIXwABdtkFHs1kWs2mAs2HAFYwcghzAAF23CAKziBqziMAAXamzrhqzrsAAXasAPgI9HLPLLqxesRQCAAEms+UBgbPlwBWML2DAAFhdAaxfKrF3QrQNAAG0Kxq0K8AAXaoAPgI9HLRJLqxesRQDAAEmtGMBgbRjwBWML2DAAFhdAqxAKaxfKbF3QrSpAAK0xxq0x8AAXaW06Bq06MAAXacAPgI9HLT8LqxxsRQBAAGBtQ3AFYwvALF6QrUcAAG1Ohq1OsAAXaYAPgJJtUshFrVZFrVQLqxVsRSxYYJbgS8+AT0ctXIurHGxFAEAAYG1g8AVjC8AsXo/QrWcAAG1uhq1usAAXawAPgJJtdEWtfoWtd4WtdUurFWxFLFhgr+BM4LVgVA+AT0cthEurHGxFAEAAYG2IsAVjC8AsXo/QrY7AAG2WRq2WcAAXa0APgJJtnIWtpQWtn8WtnYurFWxFLFhgr6BMoLVgVA+AT0ctqsurHGxFAEAAYG2vMAVjC8AsXo/QrbVAAG28xq288AAXagAPgJJtwkltxKBtw3AFYwvYMAAWIk+AT0ct0EWtzMurFixFLFkrHIBAAEUt2HAFYwvAQFgwABYiQC/gD9Ct3oAAreYGreYwABdrre6Gre6wABdrwA+Aj0et9Gr3wIAAhq32qvvJLgVAyeq0IC4DMAVjBwngTEAQrggAAaxeoCPuDS4ObiGAACscbEUAAAAAQO4SbiGAAAAAQEBuFMAAACCF2DAAFg2AABcAT4BPRy4bRa4Xy6sWLEUsWSscwEAAYC4fcAVjnEAv38GsXuAj7iLuJC5hwAArGmxFAAAAAEDuKm5hwAAAAEBAbi3AAAAkw1gsL8AAFwBPgNAFrjVgLjNwBWOwJSssMS4zbjlAD0cuOwun/0CAAEcuQEWuPguo9exaaxEAQABJrkaAYC5GsAVjsBgsNQAsT8BoCgnrHSxdT0cuWIWuVQurFixFLFkrEQBAAGAuXvAFY7AAL93BrF8gI+5jLmRvCYAAKx1sRQAAAABA7mZvCYAAAABAQG5nwAAAIEoYQFgrH9cAABcAT4BRLm3PgVDucIWudAWuckurFuxFLFog2jAAPUAPgJOui66MwAAoCVgrH8BHLo8Fro1LqxbsRSxaJWmAAAAAMAAvH9JulIhHLplFrpXLqxYsRSxZKx2AQABFrp8gbp3wBWPhZMNrIEAv30+Aj0cupOAupLAFY9UIAEAAYG6lMAVj4UAAD0curMWuqUurFixFLFkrHcBAAEWutCBusvAFY+Fkw2sgQC/fj9OuwS7DAAArHhdwAD1HQFgsK0BHLsdFrsOLqxWsRSxYoChAQAAAZMPKsAA9PE9HLtLFrs8LqxWsRSxYoHQAAAAAMAA9ic9F7taLqxXsRQqsWNJu3ohHLt/Lqx5sRQBAAGBu43AFZAPALF+PgE9HLuwFruhLqxWsRSxYoCZAQABgbu3wBWQDwDAAPYcPyIiFrvmFrvfLqxbsRSxaINowAD1AAEWvAMWu/QurFaxFLFig2jAAPUAARa8ES6sV7EUsWMGsYWAj7wrvDy8yQAAg7wBGrwswADuSwAAAQO8Q7zJAAAAAQEBvEkAAACBKGEBYKx/XAAAXAE+Aj0cvGEurHWxFAEAAYC8asAVkPMAsXxJvHIhHLyIFrx2Lqw5sWtBAQABKwDAAPXSPgI9HLyZLqw5AAAAALFrPRy8tC6sdbEUAQABgLy9wBWQ8wCxfD8GsYaAj7zOvN+9YQAAndwBGrzPwADuSwAAAQO86b1hAAAAAQEBvO8AAACTV2EBYMAA9l1cAABcAT4CPRy9DYC9CsAVkYAgAQABJL0+AyegMxa9LBa9Gi6gNLFwWsAA9P4noDUAAD0cvU4WvUUuo9exaZ3cAQABgL1ZwBWRgACxRQaxh4CPvWa9eb2YAAAjARq9Z8AA7ksAAAEDvYG9mAAAAAAAAABgwAD2XQFKvYcBJL2YAyeseha9ki6AsLFfJ4LaBrFwgI+9nb3Evf0BAKA0ARq9nsAA7ksAAAEDvda9/QAAAAAAAABdwAD02wFgsL8BSr3fARa97Ra93y6sWLEUsWSse791BrFxgI++Ar4gvjcBAKAuARq+A8AA7ksAAAEDviq+NwAAAAAAAABgwABAUgFKvi0BGr4tsV0GsXKAj748vlG+agEArDsBGr49wADuSwAAAQO+Y75qAAAAAAAAAGDAAPKzAUq+ZgEpBrGIgI++zr7Tv0AAAKx8AAAAAQO+879AAAAAAQEBvwEAAACe22CwvwAAXAE+AT0cvx0Wvw8urFixFLFkrHcBAAGAvzXAFZLlAL9+BrF9gI+/tL+5wABBoQAArGixFAAAAAEDv8fAAEGhAAAAAQEBv9UAAACe22CwvwAAXAE+B0m/4xy/9Ra/5y6sWLEUsWSsdgEAAYDAAEAHwBWTNgC/fUrAAEAQAD9OwABAJcAAQC4AAKx9YKx/ARzAAEBBFsAAQDAurFmxFLFlrH4BAAGAwABAUMAVkzYAsZdJwABAXRzAAEBqgcAAQGHAFZNvQQEAASsAwAD10krAAEBzAD9JwABAgBbAAECELqAssWo+AT0ewABAm6vfAgACgMAAQK/AFZM2JMAAQO8DJ6x/gMAAQOfAFZM2J4ExAD89HMAAQP0un/0CAAEcwABBEhbAAEEJLqPXsWmsRQEAAYDAAEEmwBWTNgCxQAGgKCesgLF1PRzAAEFoFsAAQVourFixFLFkrEUBAAGAwABBfMAVkzYAwABApD0cwABBkBbAAEGJLqxbsRSxaE8BAAGBwABBlMAVk28AwAC8ggaxfoCPwABDecAAQ37AAEPsAACsebEUAAAAAQPAAEOLwABD7AAAAAEBAcAAQ6IAAACsSV3AAPTbAWCwrQAAYMAA8rMBPgFKwABDtwEcwABDxxbAAEO+LqPXsWmsSAIAAi6AwABD2sAVlKgAsUMAABWDUQAVg4kAFYPMABWEQgAVhIcAFYUUABWGEgAVhnAAFYdZABWIXgAViYAAFYoOABWK2AAVi/cAFY5RABWOoAAVjzQAFZDOABWRWwAVkdsAFZIcABWSYQAVkpYAFZLHABWTEgAVlH4AFZTrAAAAGgKxi4CPwABD8cAAQ/fAAEYiA6yBAAABYMAA9cUAAWDAAEBfAQSxjYCPwABERsAARE4Jn78AYLFIAAEFsZSAj8AARFPAAERTwABEewAAAAPAAERswABEewAAAAEBAcAARHIAAASfv2CxSAAAYLGLAT8CCAGxjYAAwBWVuQkBwABEU8AA9dsAAAAABAaxj4CPwABEgMAARJHAAEToAACq0QEawABEgcAA7ksAAAEDwABEoMAAROgAAAABAQHAAESsAAAAqtJgwABdLgAAXAE+AT0cwABExxbAAES+Lp+/sY2sUAEAAYDAAETZwBWWFwCxVAaxkICPwABE7cAARP7AAEVQAACqxwEawABE7sAA7ksAAAEDwABFDMAARVAAAAABAQHAAEUXAAAAqshgwABdaQAAXAE+AT0cwABFMRbAAEUoLp+/sY2sTgEAAYDAAEVCwBWWfQCxUgaxkYCPwABFVcAARWbAAEWuAACqzQEawABFVsAA7ksAAAEDwABFcsAARa4AAAABAQHAAEV7AAAAqs5gwABdtAAAXAE+AT0cwABFkxbAAEWKLp+/sY2sTwEAAYDAAEWiwBWW4wCxUwaxkoCPwABFs8AARcTAAEYgAACsggEawABFtMAA7ksAAAEDwABF1MAARiAAAAABAQHAAEXhAAAArFJgwABdzgAAXAE+AT0cwABF/RbAAEX0Lp+/sY2sUQEAAYDAAEYQwBWXSQCxVQAAFZXmABWWTAAVlrIAFZcYABWXfgAAAAQCsZWAj8AARmnAAEZ4wABGxAesgwAAAWDAAPXFAAAAAQWxmQAAAAAEAAADAAAAAAAAAAAAYLGVAT8BCQEAwAD12wAAAAABBrGXgI/AAEaMwABGlcAARsIAAqx+AAAAAQPAAEajwABGwgAAAAEBAcAARrsAAAie22CwvwAAYKx/AAAAFZfdABWYFwAAAAEAAAGAjwAVmCYAFXSUABV3yQAVeqgAFX1PABWBCQAVlVwAFZeXABWYJAAAAAcAFZgmAAAAAACxmqyEgJAAABaA/gAAwABh2AAAgSAAAJ6+AACBNgAArJIAAIFVAACewQABAQGfr4F7AACvKgABAQGfloGuAACwmAAAgc8AAMAAWDEAAIHtAACxFAAAggQAAMAAYd4AAIIqAADAAF+RAAEBAayFgmcAAMAAYigAAIKPAADAAGKOAACCugAAwABTlAAAguAAAMAAYukAAIMSAADAAGM8AACDOgAAt9QAAINXAADAAGVPAAEBAayGg5MAAMAAZZAAAIOyAADAAGWtAACD2gAAv2EAAIQLAADAAFRyAACEMQAAv/sAAAAAAAQCsZuAkITFhNSQTgeshwAAAWDAAPXFAAAAAQWxrwAAAAAEAAADAAAAAAAAAAAAYLGbAT8BCQEAwAD12wAAAAAQBrGdgJCFJ4UshVgAAp/lAAAAAQOFQ4VYAAAAAQEBhVEAAACBEGC35gAAXAAGsaiAkIW3hc6F4AECn+YAAAABA4XgheAAAAAAAAAAYK7vAAaxqYCQhjuGToZcAQKqtQAAAAEDhlyGXAAAAAAAAABgrJMABrGqgJCGrIa6hsMBAqyIAAAAAQOGw4bDAAAAAAAAAGDAAFlJAAaxq4CQhwOHG4cuAQKsiQAAAAEDhy6HLgAAAAAAAABgsbAABrGsgJCHM4dHh1YBAqiDAAAAAQOHVodWAAAAAAAAAGDAAFOVAAaxnoCQh6uHvIflAAKf0gAAAAEDh9KH5QAAAAEBAYfcAAAAgh5gnsQAAGCvOgAGsZ+AkIgjiDWIbQACrIoAAAABA4hMiG0AAAABAQGIXQAAAKiDYMAAU5UAAGDAAGWZAAaxoICQiNSI6YkFAAKsiwAAAAEDiQOJBQAAAAAAAABgwABjNQAGsa2AkIlWiXKJkwECrIwAAAABA4mTiZMAAAAAAAAAYMAAY14ABrGhgJCKA4oajHUAAqyNAAAAAQOKNox1AAAADAwMik4AAACog2DAAFOVAIp3AAAArI5gwABTxACKpwAAAKyPYMAAYqMAitkAAACskGDAAGI/AIsMAAAArJFgwABjXgCLMQAAAKySYMAAX5IAi2MAAACsk2DAAGVzAIuYAAAArJRgwABi6gCLywAAAKyVYMAAYiAAjAUAAACohGDAAFR+AIw+AAAArJZgwABl9QCMaAAAAKyXYMAAZiwAAGC/YgAGsaKAkIz8jQyOLgACrJgAAAABA40rji4AAAAGBgaNQwAAAKiDYMAAU5UAjWwAAACsjmDAAFPEAI2cAAAArJVgwABiIACNzAAAAKyZYMAAYdkAjf4AAACf013AAPVOAmCwmWC//gCOIAAAAKuoYMAAX5IAAGCxlQAGsaOAkI6gjq+O3AACn/cAAAABA466jtwAAAABAQGOzgAAAKyaYMAAQAwAAGCw1AAGsaSAkI8gjziPVwACrJsAAAABA49Vj1cAAAAAAAAAYMAAY14ABrGlgJCPkI+dj7EAAqycAAAAAQOPr4+xAAAAAAAAAGDAAGYsAAaxpoCQkASQD5BMAAKgUAAAAAEDkCCQTAAAAAICApArAAAAoE5gq/EAkD0AAACf1WCwmQAAYKvhAAAAFZmBABWZrQAVmdAAFZnzABWaGAAVmjsAFZpgABWajgAVmsAAFZrlABWbCgAVm8kAFZxBABWccQAVnJYAFZy7ABWc9AAAABACsbCAkJCfkK6RqgesnQAAAWDAAPXFAAAAAQWxtgAAAAAEAAADAAAAAAAAAAAAYLGwAT8BCQEAwAD12wAAAAADBrGygJCQxpDLkPoAAqyeAAAAAQOQ45D6AAAAAQEBkPIAAACECWCwngAAXAAGsbOAkJD/kQSRNgACrJ8AAAABA5EfkTYAAAABAQGRLgAAAIQJYLCeAABcAAaxtICQkTuRQJGoAAKsoAAAAAEDkVuRqAAAAAICApFzAAAAqINgwABTlQCRlgAAAKyOYMAAU8QAAFwAAAAVnX0AFZ2pABWd1QAVnhAAAAADArG3gJCRrZG8k9wHrKEAAAFgwAD1xQABYLGbAgSxuYCQkhKSUQmsogBgwABTzQEfkjXAAFPeAAAAAASxu4CQkmWSdRiso7GaAGDAAFOVASsBBbG/AAAAAAQAAAMAAAAAAAAAAABgsbcBPwEJAQDAAPXbAAAAAAEGsb2AkJJ6kpqT2gEAqIMBGpJ7wADuSwAAAQOSqpPaAAAAAAAAAGDAAFOVAT4CSZKwHJLFFpK0LqyjsZqxu0EBAAErAMAA9dI+Aj0XktYurKOxmhyTABaS6S6sorG5gg8BAAEWkwYun+axqADAAFPbsbtAIRyTRBaTMy6so7GasbtBAQABKwDAAPXSkzOTSwEek1er3wIAAhqTYKvwJ6ykAD9Kk78BFpPGLqyjsZqxuwAAFZ6cABWfTAAAAAECscCAkJRplHiWGgespQAAAWDAAPXFAAAAAQWxxQAAAAAEAAADAAAAAAAAAAAAYLHAAT8BCQEAwAD12wAAAAACBrHCgJCVL5U0lVYAAqBmAAAAAQOVRpVWAAAAAQEBlU4AAACTDWCwmQAAXAAGscOAkJYHlgyWGAACoGcAAAABA5YWlhgAAAAAAAAAXAAAABWfmQAVn8UAFZ/mAAAAAgAAAYCQABWf+QAVmUEAFZ09ABWeJQAVn1kAFZ/3AAAABAAVn/kAAAAAALHGrKaAkQAACIECAADAAFaOAAEBAqqWrKeBUAAAsJgAAIF0AADAAFTLAACBlQAAwABYMQABAQGFY4HEAADAAFohAACB8gAAvq0AAIIWAADAAFRyAACCPwAAwABAdQAAAAAABAKxx4CRgqCCpobjA6yoAAABYMAA9cUAAAQEscqAkYLCgsgJk/CxxgBgwADyswAEscuAkYQyhFMGrKkAYLHHASCEP7HaAQABKQAEscyAkYTRhPQGrKoAYLHHASCE37HaAQABKgAEsc2AkYVxhZMGrKsAYLHHASCFf7HaAQABKwABBbHagJGCzYLTgu4BgKixxgADguGC7gAAAAEBAYLnAAAEk/BgwADyswAAYLHHAT8CCAGxyoAAwBWhIAkBgtPAAPXbAAAAAAgGsc+AkYLzgvyDHgEAq6QAAAABA4MNgx4AAAAAAAAAYMAA8rMBSoMQARyDFxaDEC6T8LHGscpBAQABKQDAAPXSBrHQgJGDI4Msg1ABAKo9AAAAAQODPoNQAAAAAAAAAGDAAPKzAUqDQQEhHINIFoNBLpPwscaxykEBAAEqAMAA9dIGsdGAkYNVg16DggEArKwAAAABA4Nwg4IAAAAAAAAAYMAA8rMBSoNzARyDehaDcy6T8LHGscpBAQABKgDAAPXSBrHSgJGDh4OQg7QBAKytAAAAAQODo4O0AAAAAAAAAGDAAPKzAUqDpgEhHIOtFoOmLpPwscaxykEBAAEpAMAA9dIGsdSAkYWYhayF2wABrK4AAAABA4W3hdsAAAABAQGFvQAAAICKYMAA8rMAAGCxxwFKhccBI4CFx8AVomsahc+xyxqF1rHNAWCxxwax1YCRheCF9IYjAAGsrwAAAAEDhf+GIwAAAAEBAYYFAAAAgIpgwADyswAAYLHHAUqGDwEjgIYPwBWitRqGF7HLGoYescwBYLHHBrHWgJGGKIY8hm0AAaywAAAAAQOGSIZtAAAAAQEBhk4AAACAimDAAPKzAABgsccBSoZYASOAhljAFaL/GoZgsc0ahmixzAFgsccGsdeAkYZyhoWG4QAAIwEahnPAAO5LAAABA4aNhuEAAAAAAAAAYMAA9l0BSoaZASSG4QInrLEjHIawFoapLpPwscaxykEBAAErAMAA9dInrKsjFobFLpPwscaxyiesqSesqgFgwAD2XQFgwAD2XQAAFaFLABWhiwAVocwAFaIMABWiTQAVopcAFaLhABWjKwAVo5kAAAAIArHbgJGHQIdPiGcHn50AAAFgwAD1xQAAAAEFseAAAAAABAAAAwAAAAAAAAAAAGCx2wE/AQkBAMAA9dsAAAAAAgax3YCRh6SHuIfeAAKssgAAAAEDh8SH3gAAAAEBAYfSAAAAn+FgwABAeQAAYLHkAAax3oCRiDGITYhlAAKsswAAAAEDiGOIZQAAAAAAAABgwABUfgAAABWkAgAVpDIAFaRXAAAAAgKx4YCRiJuIqoi5B6y0AAABYMAA9cUAAAABBbHjAAAAAAQAAAMAAAAAAAAAAABgseEBPwEJAQDAAPXbAAAAAAAAABWkqAAAAAACseSAkYj9iQzAAFiGB6y1AAABYMAA9cUAAAABBbJXAAAAAAQAAAMAAAAAAAAAAABgseQBPwEJAQDAAPXbAAAAAG8GseaAkYloiXqJhQECnS4AAAABA4mFiYUAAAAAAAAAYLHhAAax54CRieOJ9Yn9AQKVHgAAAAEDif2J/QAAAAAAAABgseEABrHogJGKX4pxin0BApTdAAAAAQOKfYp9AAAAAAAAAGCx4QAGsemAkYrbiu2K9QEClTsAAAABA4r1ivUAAAAAAAAAYLHhAAax6oCRi1KLZItrAQKVHQAAAAEDi2uLawAAAAAAAABgseEABrHrgJGLy4vdi+cBApV4AAAAAQOL54vnAAAAAAAAAGCx4QAGseyAkYxEjFaMXQECof4AAAABA4xdjF0AAAAAAAAAYLHhAAax7YCRjL2Mz4zZAQKVVQAAAAEDjNmM2QAAAAAAAABgseEABrHugJGNN41JjVEBAqbkAAAAAQONUY1RAAAAAAAAAGCx4QAGse+AkY2ujcCNxwECpw0AAAABA43HjccAAAAAAAAAYLHhAAax8ICRjiSONo49AQKm/wAAAAEDjj2OPQAAAAAAAABgseEABrHxgJGOiY6bjqYBAqy2AAAAAQOOpo6mAAAAAAAAAGCx4QAGsfKAkY7sjv6PBgEClQsAAAABA48GjwYAAAAAAAAAYLHhAAax84CRj2yPfo+OAQKstwAAAAEDj46PjgAAAAAAAABgseEABrH0gJGP9pAIkBUBAqy4AAAAAQOQFZAVAAAAAAAAAGCx4QAGsfWAkZB5kIuQlQECrLkAAAABA5CVkJUAAAAAAAAAYLHhAAax9oCRkPmRC5EVAQKsugAAAAEDkRWRFQAAAAAAAABgseEABrH3gJGRcpGEkZMBAqy7AAAAAQORk5GTAAAAAAAAAGCx4QAGsfiAkZH1kgeSFAECrLwAAAABA5IUkhQAAAAAAAAAYLHhAAax+YCRknWSh5KTAQKsvQAAAAEDkpOSkwAAAAAAAABgseEABrH6gJGS9JMGkxIBAqy+AAAAAQOTEpMSAAAAAAAAAGCx4QAGsfuAkZNik3STfQECrL8AAAABA5N9k30AAAAAAAAAYLHhAAax/ICRlA6UIJQ0AQKswAAAAAEDlDSUNAAAAAAAAABgseEABrH9gJGUw5TVlOQBAqzBAAAAAQOU5JTkAAAAAAAAAGCx4QAGsf6AkZV0lYaVmQECrMIAAAABA5WZlZkAAAAAAAAAYLHhAAayAICRleeV9ZYYAAKswwAAAAEDlgeWGAAAAAEBAZYUAAAAmTxgsK0AAGCx4QAGsgGAkZZulnyWoAACrMQAAAABA5aPlqAAAAABAQGWnAAAAJk8YLCtAABgseEABrICgJGW8pcAlyYAAqzFAAAAAQOXFZcmAAAAAQEBlyIAAACZPGCwrQAAYLHhAAayA4CRl3uXiZeuAAKsxgAAAAEDl52XrgAAAAEBAZeqAAAAmTxgsK0AAGCx4QAGsgSAkZgRmB+YRQACrMcAAAABA5g0mEUAAAABAQGYQQAAAJk8YLCtAABgseEABrIFgJGYvZjKmPUAAqzIAAAAAQOY1pj1AAAAAQEBmO8AAAiAimCx4QAAYLHHAAayBoCRmWmZdpmmAAKsyQAAAAEDmYeZpgAAAAEBAZmgAAAIgIpgseEAAGCxxwAGsgeAkZnzmgGaKwACrMoAAAABA5oMmisAAAABAQGaJQAACICKYLHhAABgseEABrIIgJGaeJqGmrAAAqzLAAAAAQOakZqwAAAAAQEBmqoAAAiAimCx4QAAYLHhAAayCYCRmyKbL5trAAKszAAAAAEDmzubawAAAAICAptUAAAIgIpgseEAm2cAAACZPGCwrQAAYLHHAAayCoCRm+ub+Jw4AAKszQAAAAEDnAicOAAAAAICApwhAAAIgIpgseEAnDQAAACZPGCwrQAAYLHHAAayC4CRnOqc951AAAKszgAAAAEDnQmdQAAAAAICAp0pAAAIgIpgseEAnTwAAACZPGCwrQAAYLHHAAayDICRnbqdx535AAKszwAAAAEDndOd+QAAAAICAp3iAAAAgIpgseEAnfUAAACZPGCwrQAAYLHHAAayDYCRnmOecJ6WAAKA/AAAAAEDnneelgAAAAEBAZ6QAAAIgIpgseEAAGCxxwAGsg6AkZ8GnxOfOQACrNAAAAABA58anzkAAAABAQGfMwAACICKYLHhAABgsccABrIPgJGfq5+4n+QAAqzRAAAAAQOfxZ/kAAAAAQEBn94AAAiAimCx4QAAYLHHAAayEICRoGqgdqCiAAKs0gAAAAEDoIOgogAAAAEBAaCcAAAIgIpgseEAAGCwrQAGshGAkaECoQ+hNAACrNMAAAABA6EVoTQAAAABAQGhLgAACICKYLHhAABgsccABrISgJGhwKHNofcAAqsJAAAAAQOh2KH3AAAAAQEBofEAAAiAimCx4QAAYLHHAAayE4CRomSicaKhAAKs1AAAAAEDooKioQAAAAEBAaKbAAAIgIpgseEAAGCxxwAGshSAkaMMoxmjSgACrNUAAAABA6Mro0oAAAABAQGjRAAACICKYLHhAABgsccABrIVgJGjtqPDo/IAAqzWAAAAAQOj06PyAAAAAQEBo+wAAAiAimCx4QAAYLHHAAayFoCRpIKkj6TCAAKs1wAAAAEDpKOkwgAAAAEBAaS8AAAIgIpgseEAAGCxxwAGsheAkaVPpVylhwACrNgAAAABA6VopYcAAAABAQGlgQAACICKYLHhAABgsccABrIYgJGmBqYTpkMAAqzZAAAAAQOmJKZDAAAAAQEBpj0AAAiAimCx4QAAYLHHAAayGYCRpsGmzqb7AAKs2gAAAAEDptym+wAAAAEBAab1AAAIgIpgseEAAGCxxwAGshqAkaeLp5inyQACrNsAAAABA6eqp8kAAAABAQGnwwAACICKYLHhAABgsccABrIbgJGoP6hMqHIAAqzcAAAAAQOoU6hyAAAAAQEBqGwAAAiAimCx4QAAYLHHAAayHICRqN+o7KkcAAKs3QAAAAEDqP2pHAAAAAEBAakWAAAIgIpgseEAAGCxxwAGsh2AkamEqZGpvQACrN4AAAABA6meqb0AAAABAQGptwAACICKYLHhAABgsccABrIegJGqL6o8qmQAAqzfAAAAAQOqRapkAAAAAQEBql4AAAiAimCx4QAAYLHHAAayH4CRquaq86saAAKs4AAAAAEDqvurGgAAAAEBAasUAAAIgIpgseEAAGCxxwAGsiCAkaucq6mr0AACrOEAAAABA6uxq9AAAAABAQGrygAACICKYLHhAABgsccABrIhgJGsS6xYrIgAAqziAAAAAQOsaayIAAAAAQEBrIIAAAiAimCx4QAAYLHHAAayIoCRrQWtEq1IAAKs4wAAAAEDrSmtSAAAAAEBAa1CAAAIgIpgseEAAGCxxwAGsiOAka28rcmt9wACrOQAAAABA63YrfcAAAABAQGt8QAACICKYLHhAABgsccABrIkgJGuba56rqEAAqzlAAAAAQOugq6hAAAAAQEBrpsAAAiAimCx4QAA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wABDSgAAAAEBAcAAQtYAAAiAimC0lQAAYLHHAT4BSsAAQuMBHsAAQvex1AEAASIcwABDEoDAAEMMwBYOIq17AQABFsAAQyMurTmy5rLsALSxACEWwABDO4DAAEM1wBYOIq1stMMABrNlgJPAAENPwABDaMAAQ8IAAKzqARrAAENQwADuSwAAAQPAAEN3wABDwgAAAAEBAcAAQ4EAAAiAimC0lQAAYLHHAUrAAEORAR7AAEOesdQBAAEcwABDqi6tfLLmAQABgMAAQ7vAFg6vALNCAAazQoCTwABDx8AAQ8zAAEQiAACtfLLmAAAAAQPAAEPcwABEIgAAAAEBAcAAQ+YAAACAimC0lQAAYMAA8rMBPgFKwABD8wEcwABEAIDAAEP6wBYPFa17AQABFsAARBEurTmy5rLsALSxBrNmgJPAAEQnwABEQMAARMgAAKzrARrAAEQowADuSwAAAQPAAERIwABEyAAAAAEBAcAARFIAAAiAimC0lQAAYLHHAT4BSsAARF8BHsAARHOx1AEAASIcwABEjoDAAESIwBYPhK12AQABFsAARKEurTmy5rLsALSyACEWwABEuYDAAESzwBYPhK1stMMABrNngJPAAETNwABE5sAARVYAAKzsARrAAETOwADuSwAAAQPAAET0wABFVgAAAAEBAcAARP4AAAiAimC0lQAAYLHHAT4BSsAARQsBHsAARR+x1AEAARzAAEUxgMAARSvAFhARrXYBAAEWwABFRC6tObLmsuwAtLIABrNogJPAAEVbwABFdMAARdIAAKztARrAAEVcwADuSwAAAQPAAEWFwABF0gAAAAEBAcAARY8AAAiAimC0lQAAYLHHAUrAAEWfAR7AAEWssdQBAAEcwABFuC6tfbLmAQABgMAARcvAFhCJALNDAAazQ4CTwABF18AARdzAAEaLAACtfbLmAAAAAQPAAEXuwABGiwAAAAEBAcAARfgAAACAimC0lQAAYMAA8rMBPgFKwABGBQEiIiIcwABGDC6tdbLmAQABgMAARiLAFhDvALM/ARzAAEY0Lq15suYBAAGAwABGRMAWEO8As0EBHMAARlYurXyy5gEAAYDAAEZnwBYQ7wCzQgEcwABGeS6tbbLmAQABgMAARoHAFhDvALM7BrNpgJPAAEaQwABGpcAARt4AAJPmARrAAEaRwADuSwAAAQPAAEaqwABG3gAAAAICAsAARrQAAAiBZmC0lQDAAEbAAAAIgdpgtJUAAGC0lQFKwABGxgEcwABGyIDAAEbGwBYRppPmAgACgcAARs7AFhGzFsAARtEurTmy5rLsALS7BrNqgJPAAEbjwABG+MAAR0UAAJPnARrAAEbkwADuSwAAAQPAAEcEwABHRQAAAAICAsAARw4AAAiBZmC0lQDAAEcaAAAIgdpgtJUAAGC0lQFKwABHJgEcwABHKIDAAEcmwBYSJ5PnAgACgcAARzXAFhI0FsAARzgurTmy5rLsALS9BrNrgJPAAEdKwABHY8AAR8cAAKzvARrAAEdLwADuSwAAAQPAAEduwABHxwAAAAICAsAAR3gAAAiBZmC0lQDAAEeEAAAIgdpgtJUAAGCxxwFKwABHkAEewABHnbHUAQABHMAAR6uAwABHqcAWEqitawIAAoHAAEe2wBYStRbAAEe5Lq05suay7AC0vAAGs2yAk8AAR8zAAEflwABIPAAAg8YBGsAAR83AAO5LAAABA8AAR/DAAEg8AAAAAQEBwABH+gAACIFmYLSVAABgsccBSsAASAYBHsAASBOx1gEAARzAAEgigMAASCDAFhM0g8YBAAEWwABILi6tObLmsuwAtLkABrNtgJPAAEhBwABIW8AASMUAAKzwARrAAEhCwADuSwAAAQPAAEh6wABIxQAAAAEBAcAASIkAAACAimDAAFa9AABgseEBPgFKwABIlgEewABIncAAZoUCAAIWwABIrS6tObLmsuyAwABIu8AWE6oABrNugJPAAEjKwABI5MAASWUAAKz7ARrAAEjLwADuSwAAAQPAAEjxwABJZQAAAAEBAcAASQAAAACAimCx4QAAYLHhAT4CScAASQ0lwABJF4DAAEkRwBYUGWC0Oj4BSsAASS8BFsAASTwUwABJNsAWFBkAAWC0OpVhtEE/SsAASU8BFsAASVYunS6zDQazb4CTwABJasAASYTAAEpgAACs/AEawABJa8AA7ksAAAEDwABJk8AASmAAAAABAQHAAEmiAAAAgIpgseEAAGCx4QE+AknAAEmvJcAASbmAwABJs8AWFKRgtDo+AUrAAEoZATUAAAABAGC0lQEWwABKJhTAAEogwBYUpAABYLQ6lWK0QCMcwABKMIEAwBYU10EBAAErAAAWwABKMy6dLrMNgQDAFhTXAWC0lT9KwABKSgEWwABKUS6dLrMNBrNwgJPAAEplwABKf8AASyMAAKz2ARrAAEpmwADuSwAAAQPAAEqWwABLIwAAAAEBAcAASqUAAACAimCx4QAAYLHhAT4CScAASrIlwABKvIDAAEq2wBYVYGCzkj4BSsAAStoBNQAAAAEAYLSVARbAAErnFMAASuHAFhVgAAFgs5KiALOYIxzAAErzgQDAFhWTQQEAASsAABbAAEr2Lp0usw2BAMAWFZMBYLSVP0rAAEsNARbAAEsULp0usw0Gs3GAk8AASyjAAEs4wABLoQAArPcBGsAASynAAO5LAAABA8AAS0rAAEuhAAAAAQEBwABLWQAAAICKYLHhAABgwAD0eQE+AUrAAEtmASMlwABLc4DAAEttwBYWHGCzkhbAAEuQFMAAS4rAFhYcAAFgs5Jas5krAWDAAPR5BrNygJPAAEumwABLwMAATN0AAKzyARrAAEunwADuSwAAAQPAAEvUwABM3QAAAAUFBcAAS+oAAACtfmCx4QDAAEwCAAAArPRgwAD1xQDAAEwlAAAArPVgsL8AwABMTAAAAKIAYLHhAMAATGMAAABaYMAA9HkAAGCx4QE+AUrAAExxAR/AAEx8s6oFAAUmwABMlwGAwABMl8AWFphgtJUmwABMogGBwABMosAWFqVgjA6CwABMssAWFrQmwABMxQGDwABMxcAWFsFgtJWEwABM0sAWFs4ABrNzgJPAAEziwABM/MAATdEAAKzuARrAAEzjwADuSwAAAQPAAE0HwABN0QAAAAEBAcAATSAAAAApXcAA9NsBYLHhAABgseEBPgNOwABNN8AATT4AAIEQYLSVASDAAE1GtAcAAAAARsAATWPAAE2CAAAAAQBgseEAgMAATXrAFhdtPgJOwABNcQAAAICKYLSVASbAAE1jAYLAAE1xwBYXq2C0lT2JwABNisAWF4ccwABNmoHAAE2TwBYXh5PmAgACg8AATaDAFhfAFsAATacurTmy5rLsALS7SsAATcABgcAATcfAFheHBrN0gJPAAE3WwABN8MAAURUAAK0LARrAAE3XwADuSwAAAQPAAE3/wABRFQAAAAEBAcAAThcAAACUPl3AAPTbAWCwvwAAYLHhAT4CQBzAAE5SFsAATjoWwABOLS6tObLmsuyl2cAAQIetfwEAARbAAE6DFsAATnQWwABOZy6tObLm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SicBAIIXARrAAEn3wADuSwAAAQPAAEoZwABKJwAAAAAAAABgseEBSsAAShwBFsAAShwunS61mQa1nICdwABKLMAASkrAAEpjAQCU3AEawABKLcAA7ksAAAEDwABKVcAASmMAAAAAAAAAYLHhAUrAAEpYARbAAEpYLp0utZkGtZ2AncAASmjAAEp9wABKkgEArjkBGsAASmnAAO5LAAABA8AASorAAEqSAAAAAAAAAGDAAPKzAUrAAEqNASoGtaCAncAASpfAAEqxwABK3AAArj4BGsAASpjAAO5LAAABA8AASsbAAErcAAAAAQEBwABKzwAAAIOyYIwOAABgseEBSsAAStgBKwa1oYCdwABK4cAASvvAAEsnAACuPQEawABK4sAA7ksAAAEDwABLEcAASycAAAABAQHAAEsaAAAAg7JgjA4AAGCx4QFKwABLIwErBrWigJ3AAEsswABLRsAAS2oAAK48ARrAAEstwADuSwAAAQPAAEtUwABLagAAAAEBAcAAS10AAACDsmCMDgAAYLHhAUrAAEtmASsGtaOAncAAS2/AAEuJwABLqwAArjsBGsAAS3DAAO5LAAABA8AAS5XAAEurAAAAAQEBwABLngAAAIOyYIwOAABgseEBSsAAS6cBKwa1pICdwABLsMAAS8rAAEvqAACuOgEawABLscAA7ksAAAEDwABL1MAAS+oAAAABAQHAAEvdAAAAg7JgjA4AAGCx4QFKwABL5gErBrWegJ3AAEvvwABMBMAATBkBAK44ARrAAEvwwADuSwAAAQPAAEwRwABMGQAAAAAAAABgwADyswFKwABMFAEqBrWlgJ3AAEwewABML8AATN4AAKtNARrAAEwfwADuSwAAAQPAAEw+wABM3gAAAAICAsAATEgAAACEAWDAAFonAMAATGIAAACphmCx5AAAXAE+AT0wwABMfR/AAEyHwAD0CwEAASeucQAAABccvQAXHQMAFx1JABcdiAAXHdIAFx4cABceZgAXHrAAFx76ABcfOQAXH6EAAAAKArWogJ3AAEzjwABM6cAAUQQDrnIAAAFgwAD1xQABYLUYAgS1qoCdwABNU8AATV4JnS4AYLHhAAS1q4CdwABNdsAATX8JrL8AYLHhAAEFtbmAncAATYTAAE2EwABOGwAAAAPAAE2mwABOGwAAAAEBAcAATbsAAACuc2Cx5AAA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AEK5AAAAAQEBwABCmgAAAIOyYLvyAABbAUrAAEKjARzAAEKjLrCJAQABgMAAQrTAGCgFALi6BrjjgKbAAEK9wABCycAAQwQAALAsARrAAEK+wADuSwAAAQPAAELYwABDBAAAAAEBAcAAQuUAAACDsmC8/gAAWwFKwABC7gEcwABC7i6wWQEAAYDAAEL/wBgoYwC4sQa45ICmwABDCMAAQxTAAENCAACwLQEawABDCcAA7ksAAAEDwABDHcAAQ0IAAAABAQHAAEMkAAAAg7JgvJsAAFsBSsAAQy0BHMAAQy0usIsBAAGAwABDPcAYKMEAuLwGuOWApsAAQ0bAAENSwABDigAAsC4BGsAAQ0fAAO5LAAABA8AAQ2DAAEOKAAAAAQEBwABDbAAAAIOyYLykAABbAUrAAEN1ARzAAEN1LrCLAQABgMAAQ4XAGCkfALi8BrjmgKbAAEOOwABDmsAAQ9cAALAvARrAAEOPwADuSwAAAQPAAEOqwABD1wAAAAEBAcAAQ7gAAACDsmC9FwAAWwFKwABDwQEcwABDwS6wWQEAAYDAAEPSwBgpfQC4sQa454CmwABD28AAQ9vAAEQYAACwjgAAAAEDwABD68AARBgAAAABAQHAAEP5AAAAg7JguxAAAFsBSsAARAIBHMAARAIusFkBAAGAwABEE8AYKdIAuLEGuOiApsAARBzAAEQowABEXwAAsDABGsAARB3AAO5LAAABA8AARDXAAERfAAAAAQEBwABEQAAAAIOyYLsXAABbAUrAAERJARzAAERJLrCOAQABgMAARFrAGCowALjnBrjpgKbAAERjwABEb8AARKYAALAxARrAAERkwADuSwAAAQPAAER8wABEpgAAAAEBAcAARIcAAACDsmC7HgAAWwFKwABEkAEcwABEkC6wjgEAAYDAAEShwBgqjgC45wa46oCmwABEqsAARLbAAETxAACwMgEawABEq8AA7ksAAAEDwABExcAARPEAAAABAQHAAETSAAAAg7JgvFEAAFsBSsAARNsBHMAARNsusFkBAAGAwABE7MAYKuwAuLEGuOuApsAARPXAAEUBwABFQgAAsDMBGsAARPbAAO5LAAABA8AARRDAAEVCAAAAAQEBwABFHQAAAIOyYLwpAABbAUrAAEUmARzAAEUmLrCIAQABgMAART3AGCtKALi5BrjsgKbAAEVGwABFUsAARYUAALA1ARrAAEVHwADuSwAAAQPAAEVdwABFhQAAAAEBAcAARWYAAACDsmC7ywAAWwFKwABFbwEcwABFby6whwEAAYDAAEWAwBgrqAC4uAa47YCmwABFicAARZXAAEXCAACVSQEawABFisAA7ksAAAEDwABFncAARcIAAAABAQHAAEWjAAAAg7JgvEkAAFsBSsAARawBHMAARawusFkBAAGAwABFvcAYLAYAuLEGuO6ApsAARcbAAEXSwABGHwAAsDYBGsAARcfAAO5LAAABA8AARenAAEYfAAAAAQEBwABF/gAAAIOyYLz0AABbAUrAAEYHARzAAEYHLrCFAQABgMAARhrAGCxkALi2BrjvgKbAAEYjwABGL8AARlwAALA4ARrAAEYkwADuSwAAAQPAAEY3wABGXAAAAAEBAcAARj0AAACDsmC8agAAWwFKwABGRgEcwABGRi6wWQEAAYDAAEZXwBgswgC4sQa48ICmwABGYMAARmzAAEaoAACwNAEawABGYcAA7ksAAAEDwABGecAARqgAAAABAQHAAEaEAAAAg7Jgu2QAAFsBSsAARo0BHMAARo0usIEBAAGAwABGo8AYLSAAuLIGuPGApsAARqzAAEa4wABG+gAAsDcBGsAARq3AAO5LAAABA8AARsvAAEb6AAAAAQEBwABG3AAAAIOyYLxXAABbAUrAAEblARzAAEblLrAyAQABgMAARvXAGC1+ALjqBrjygKbAAEb+wABHCsAAR0kAALA5ARrAAEb/wADuSwAAAQPAAEcewABHSQAAAAEBAcAARzAAAACDsmC9rQAAWwFKwABHOQEcwABHOS6wjAEAAYDAAEdEwBgt3AC4xwa484CmwABHTcAAR1nAAEeeAACwOgEawABHTsAA7ksAAAEDwABHbcAAR54AAAABAQHAAEd/AAAAg7JguvUAAFsBSsAAR4gBHMAAR4gusFkBAAGAwABHmcAYLjoAuLEGuPSApsAAR6LAAEeuwABH3AAAsDsBGsAAR6PAAO5LAAABA8AAR7bAAEfcAAAAAQEBwABHvAAAAIOyYLn/AABbAUrAAEfFARzAAEfQFsAAR8qAwABHxcAYLpiAiroBlA4BAAEuALnNBrj1gKbAAEfgwABH7MAASCoAALA8ARrAAEfhwADuSwAAAQPAAEf6wABIKgAAAAEBAcAASAYAAACDsmC7fwAAWwFKwABIDwEcwABIDy6wgQEAAYDAAEglwBgu/wC4sga49oCmwABILsAASDrAAEhtAACwPQEawABIL8AA7ksAAAEDwABIRcAASG0AAAABAQHAAEhOAAAAg7JgvK0AAFsBSsAASFcBHMAASFcusIkBAAGAwABIaMAYL10AuLoGuPeApsAASHHAAEh9wABItgAAsD4BGsAASHLAAO5LAAABA8AASIvAAEi2AAAAAQEBwABIlwAAAIOyYLuVAABbAUrAAEigARzAAEigLrCDAQABgMAASLHAGC+7ALizBrj4gKbAAEi6wABIxsAASQEAALA/ARrAAEi7wADuSwAAAQPAAEjVwABJAQAAAAEBAcAASOIAAACDsmC7ngAAWwFKwABI6wEcwABI6y6wgwEAAYDAAEj8wBgwGQC4swa4+YCmwABJBcAASRHAAElNAACwRAEawABJBsAA7ksAAAEDwABJHsAASU0AAAABAQHAAEkpAAAAg7Jgu20AAFsBSsAASTIBHMAASTIusIEBAAGAwABJSMAYMHcAuLIGuPqApsAASVHAAEldwABJkAAAsEUBGsAASVLAAO5LAAABA8AASWjAAEmQAAAAAQEBwABJcQAAAIOyYLuIAABbAUrAAEl6ARzAAEl6LrCJAQABgMAASYvAGDDVALi6Brj7gKbAAEmUwABJoMAASdMAALBAARrAAEmVwADuSwAAAQPAAEmrwABJ0wAAAAEBAcAASbQAAACDsmC81QAAWwFKwABJvQEcwABJvS6wWQEAAYDAAEnOwBgxMwC4sQa4/ICmwABJ18AASePAAEogAACwQQEawABJ2MAA7ksAAAEDwABJ88AASiAAAAABAQHAAEoBAAAAg7JgvQkAAFsBSsAASgoBHMAASgousFkBAAGAwABKG8AYMZEAuLEGuP2ApsAASiTAAEowwABKbwAAsEIBGsAASiXAAO5LAAABA8AASkHAAEpvAAAAAQEBwABKUAAAAIOyYL20AABbAUrAAEpZARzAAEpZLrBZAQABgMAASmrAGDHvALixBrj+gKbAAEpzwABKf8AASrgAALBDARrAAEp0wADuSwAAAQPAAEqNwABKuAAAAAEBAcAASpkAAACDsmC9vQAAWwFKwABKogEcwABKoi6wWQEAAYDAAEqzwBgyTQC4sQa4/4CmwABKvMAASsjAAEr6AACwRgEawABKvcAA7ksAAAEDwABK0cAASvoAAAABAQHAAErYAAAAg7JgvF4AAFsBSsAASuEBHMAASuEusDcBAAGAwABK9cAYMqsAuPEGuQCApsAASv7AAEsKwABLOwAAlYcBGsAASv/AAO5LAAABA8AASxTAAEs7AAAAAQEBwABLHAAAAIOyYLzNAABbAUrAAEslARzAAEslLrCJAQABgMAASzbAGDMJALi6BrkBgKbAAEs/wABLS8AAS5AAALBHARrAAEtAwADuSwAAAQPAAEtfwABLkAAAAAEBAcAAS3EAAACDsmC8swAAWwFKwABLegEcwABLei6wWQEAAYDAAEuLwBgzZwC4sQa5AoCmwABLlMAAS6DAAEvsAACwSAEawABLlcAA7ksAAAEDwABLtcAAS+wAAAABAQHAAEvIAAAAg7Jgu3YAAFsBSsAAS9EBHMAAS9EusIEBAAGAwABL58AYM8UAuLIGuQOApsAAS/DAAEv8wABMKQAAsEkBGsAAS/HAAO5LAAABA8AATATAAEwpAAAAAQEBwABMCgAAAIOyYLwJAABbAUrAAEwTARzAAEwTLrCJAQABgMAATCTAGDQjALi6BrkEgKbAAEwtwABMOcAATGQAALApARrAAEwuwADuSwAAAQPAAExAwABMZAAAAAEBAcAATEUAAACDsmC9QAAAWwFKwABMTgEcwABMTi6wWQEAAYDAAExfwBg0gQC4sQa5BYCmwABMaMAATHTAAEytAACwKwEawABMacAA7ksAAAEDwABMgsAATK0AAAABAQHAAEyOAAAAg7JgvWoAAFsBSsAATJcBHMAATJcusFkBAAGAwABMqMAYNN8AuLEGuQaApsAATLHAAEy9wABNBAAAsCoBGsAATLLAAO5LAAABA8AATNLAAE0EAAAAAQEBwABM5QAAAIOyYL1dAABbAUrAAEzuARzAAEzuLrBZAQABgMAATP/AGDU9ALixBrkHgKbAAE0IwABNFMAATVEAALBKARrAAE0JwADuSwAAAQPAAE0nwABNUQAAAAEBAcAATTgAAACDsmC9cgAAWwFKwABNQQEcwABNQS6wjAEAAYDAAE1MwBg1mwC4xwa5CICmwABNVcAATWHAAE2UAACwSwEawABNVsAA7ksAAAEDwABNb8AATZQAAAABAQHAAE17AAAAg7JgvZYAAFsBSsAATYQBHMAATYQusIwBAAGAwABNj8AYNfkAuMcGuQmApsAATZjAAE2kwABN1QAAsAcBGsAATZnAAO5LAAABA8AATa7AAE3VAAAAAQEBwABNtgAAAIOyYLy6AABbAUrAAE2/ARzAAE2/LrBZAQABgMAATdDAGDZXALixBrkKgKbAAE3ZwABN5cAAThYAALBMARrAAE3awADuSwAAAQPAAE3vwABOFgAAAAEBAcAATfcAAACDsmC8wwAAWwFKwABOAAEcwABOAC6wWQEAAYDAAE4RwBg2tQC4sQa5C4CmwABOG8AATifAAE5sAACwTQEawABOHMAA7ksAAAEDwABOO8AATmwAAAABAQHAAE5NAAAAg7JgvncAAFsBSsAATlYBHMAATlYusFkBAAGAwABOZ8AYNxMAuLEGuQyApsAATnDAAE58wABO0QAAsE4BGsAATnHAAO5LAAABA8AATpXAAE7RAAAAAQEBwABOrAAAAIOyYL6AAABbAUrAAE67ARzAAE67LrBZAQABgMAATszAGDdxALixBrkNgKbAAE7VwABO4cAATywAALBPARrAAE7WwADuSwAAAQPAAE74wABPLAAAAAEBAcAATw0AAACDsmC+nQAAWwFKwABPFgEcwABPFi6wWQEAAYDAAE8nwBg3zwC4sQAAGBj5ABgZnQAYGcsAGBoOABgaUQAYGpQAGBrXABgbGgAYG10AGBugABgb4wAYHCYAGBxpABgcrAAYHPYAGB1AABgdigAYHdQAGB4eABgeaAAYHrIAGB78ABgfRgAYH5AAGB/TABggHQAYIGcAGCCxABgg+wAYIUUAGCGPABgh2QAYIiMAGCJtABgitwAYIwEAGCNLABgjlQAYI98AGCQpABgkcwAYJL0AGCUHABglUQAYJakAGCYHABgmZQAYJsMAGCchABgnfwAYJ90AGCgyABgokAAYKO4AGClMABgpqgAYKf8AGCpdABgquwAYKxkAGCt3ABgr1QAYLDMAGCyRABgs7wAYLU0AGC2rABguCQAYLmcAGC7OABgvLAAYL4oAGC/oABgwRgAYMKQAGDECABgxYAAYMb4AGDIcABgyegAYMtgAGDM2ABgzlAAYM/IAGDRQABg0rgAYNQwAGDVqABg1yAAYNiYAGDaEABg24gAYN0AAGDeeABg3/AAAAF4CuRCApsAATzHAAE83wABQfwOw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aMAAioAAALECAAAAAQPAAIp1wACKgAAAAAAAAABgwADyswFKwACKewEqBrmogKbAAIqFwACKisAAit8AAK1vAAAAAQPAAIqRwACK3wAAAAEBAcAAiqYAAACuc2Cx5AAAYMAA8rMBSsAAircBHMAAir6AwACKt8AYaxqtCAEAARbAAIrPLrD3uZsAskYGuamApsAAiuTAAIrxwACLOwAArNMAAAABA8AAivfAAIs7AAAAAQEBwACLDAAAAK5zYLHkAABgsccBSsAAix0BHMAAiySAwACLHcAYa3ys0wEAARbAAIsrLrD3uZsAshEGuaqApsAAi0DAAItNwACLnwAAsQMAAAABA8AAi1rAAIufAAAAAQEBwACLbwAAAK5zYLHkAABgsccBSsAAi4ABHMAAi4eAwACLgMAYa9yA/AEAARbAAIuPLrD3uZsAsg0GuauApsAAi6TAAIuxwACMBQAAqwkAAAABA8AAi7zAAIwFAAAAAQEBwACL0QAAAK5zYLHkAABgsccBSsAAi+IBHMAAi+mAwACL4sAYbDyrCQEAARbAAIv1LrD3uZsAshIGuayApsAAjArAAIwXwACMdwAArNQAAAABA8AAjCjAAIx3AAAAAQEBwACMPQAAAK5zYLHkAABgsccBSsAAjE4BHMAAjFWAwACMTsAYbJys1AEAARbAAIxnLrD3uZsAshMGua2ApsAAjHzAAIyJwACM6wAArNUAAAABA8AAjJvAAIzrAAAAAQEBwACMsAAAAK5zYLHkAABgsccBSsAAjMEBHMAAjMiAwACMwcAYbPys1QEAARbAAIzbLrD3uZsAshQGua6ApsAAjPDAAIz9wACNWwAArNYAAAABA8AAjQ3AAI1bAAAAAQEBwACNIgAAAK5zYLHkAABgsccBSsAAjTMBHMAAjTqAwACNM8AYbVys1gEAARbAAI1LLrD3uZsAshUGua+ApsAAjWDAAI1twACN0wAArNcAAAABA8AAjYHAAI3TAAAAAQEBwACNlgAAAK5zYLHkAABgsccBSsAAjacBHMAAja6AwACNp8AYbbys1wEAARbAAI3DLrD3uZsAshYGubCApsAAjdjAAI3lwACOOwAArNgAAAABA8AAjfHAAI47AAAAAQEBwACOBgAAAK5zYLHkAABgsccBSsAAjhcBHMAAjh6AwACOF8AYbhys2AEAARbAAI4rLrD3uZsAshcGubGApsAAjkDAAI5NwACOrQAArNkAAAABA8AAjl7AAI6tAAAAAQEBwACOcwAAAK5zYLHkAABgsccBSsAAjoQBHMAAjouAwACOhMAYbnys2QEAARbAAI6dLrD3uZsAshgGubKApsAAjrLAAI6/wACPGQAArNoAAAABA8AAjs3AAI8ZAAAAAQEBwACO4gAAAK5zYLHkAABgsccBSsAAjvMBHMAAjvqAwACO88AYbtys2gEAARbAAI8JLrD3uZsAshkGubOApsAAjx7AAI8rwACPjQAArNsAAAABA8AAjz3AAI+NAAAAAQEBwACPUgAAAK5zYLHkAABgsccBSsAAj2MBHMAAj2qAwACPY8AYbzys2wEAARbAAI99LrD3uZsAshoGubSApsAAj5LAAI+fwACP6wAArNwAAAABA8AAj6bAAI/rAAAAAQEBwACPuwAAAK5zYLHkAABgsccBSsAAj8wBHMAAj9OAwACPzMAYb5ys3AEAARbAAI/bLrD3uZsAshsGubWApsAAj/DAAI/9wACQXQAArN0AAAABA8AAkA7AAJBdAAAAAQEBwACQIwAAAK5zYLHkAABgsccBSsAAkDQBHMAAkDuAwACQNMAYb/ys3QEAARbAAJBNLrD3uZsAshwGubaApsAAkGLAAJBvwACQvwAArN8AAAABA8AAkHjAAJC/AAAAAQEBwACQjQAAAK5zYLHkAABgsccBSsAAkJ4BHMAAkKWAwACQnsAYcFys3wEAARbAAJCvLrD3uZsAsh4GubeApsAAkMTAAJDRwACRHwAArOAAAAABA8AAkNnAAJEfAAAAAQEBwACQ7gAAAK5zYLHkAABgsccBSsAAkP8BHMAAkQaAwACQ/8AYcLys4AEAARbAAJEPLrD3uZsAsh8GubiApsAAkSTAAJExwACRfwAArOEAAAABA8AAkTnAAJF/AAAAAQEBwACRTgAAAK5zYLHkAABgsccBSsAAkV8BHMAAkWaAwACRX8AYcRys4QEAARbAAJFvLrD3uZsAsiAGubmApsAAkYTAAJGRwACR8QAArOIAAAABA8AAkaLAAJHxAAAAAQEBwACRtwAAAK5zYLHkAABgsccBSsAAkcgBHMAAkc+AwACRyMAYcXys4gEAARbAAJHhLrD3uZsAsiEGubqApsAAkfbAAJIDwACSbwAArOMAAAABA8AAkhrAAJJvAAAAAQEBwACSLwAAAK5zYLHkAABgsccBSsAAkkABHMAAkkeAwACSQMAYcdys4wEAARbAAJJfLrD3uZsAsiIGubuApsAAknTAAJKBwACS3QAArOQAAAABA8AAkpDAAJLdAAAAAQEBwACSpQAAAK5zYLHkAABgsccBSsAAkrYBHMAAkr2AwACStsAYcjys5AEAARbAAJLNLrD3uZsAsiMGubyApsAAkuLAAJLvwACTPQAArOUAAAABA8AAkvfAAJM9AAAAAQEBwACTDAAAAK5zYLHkAABgsccBSsAAkx0BHMAAkySAwACTHcAYcpys5QEAARbAAJMtLrD3uZsAsiQGub2ApsAAk0LAAJNPwACTqQAArOYAAAABA8AAk13AAJOpAAAAAQEBwACTcgAAAK5zYLHkAABgsccBSsAAk4MBHMAAk4qAwACTg8AYcvys5gEAARbAAJOZLrD3uZsAsiUGub6ApsAAk67AAJO7wACUCQAArOcAAAABA8AAk8PAAJQJAAAAAQEBwACT2AAAAK5zYLHkAABgsccBSsAAk+kBHMAAk/CAwACT6cAYc1ys5wEAARbAAJP5LrD3uZsAsiYGub+ApsAAlA7AAJQbwACUdQAArOgAAAABA8AAlCnAAJR1AAAAAQEBwACUPgAAAK5zYLHkAABgsccBSsAAlE8BHMAAlFaAwACUT8AYc7ys6AEAARbAAJRlLrD3uZsAsicGucCApsAAlHrAAJSHwACU1wAArOkAAAABA8AAlJDAAJTXAAAAAQEBwACUpQAAAK5zYLHkAABgsccBSsAAlLYBHMAAlL2AwACUtsAYdBys6QEAARbAAJTHLrD3uZsAsigGucGApsAAlNzAAJTpwACVRQAArOoAAAABA8AAlPjAAJVFAAAAAQEBwACVDQAAAK5zYLHkAABgsccBSsAAlR4BHMAAlSWAwACVHsAYdHys6gEAARbAAJU1LrD3uZsAsikGucKApsAAlUrAAJVXwACVpQAArOsAAAABA8AAlV/AAJWlAAAAAQEBwACVdAAAAK5zYLHkAABgsccBSsAAlYUBHMAAlYyAwACVhcAYdNys6wEAARbAAJWVLrD3uZsAsioGucOApsAAlarAAJW3wACWEQAArOwAAAABA8AAlcXAAJYRAAAAAQEBwACV2gAAAK5zYLHkAABgsccBSsAAlesB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pAPAAKSBAAAAAgICwACkGAAAALCUYLlkAMAApC0AAACxFWC5ZAAAXAE+AT0cwACkYh7AAKRRufACAAIugMAApFrAGINwAJQYAQABgcAApG7AGIN9ALnxBrnVgKbAAKSGwACki8AApWkAALEWAAAAAQPAAKSVwAClaQAAAAEBAcAApKMAAACDm2C5ZAAAXAE+BkAhJcAApLwuYLo4wACkt8AApMwAQCElwACk3y5gvGrAAKTawACk5wBAISXAAKT7gMAApPXAGIPjYLxqwACk9cAApQMAPRzAAKUQFsAApQoumW65bLCWAQABLgC5Jj0cwAClLhbAAKUogMAApSLAGIPjmW65bLCVAgACgMAApUDAGIPjLgC5JT0XwAClUi6ZbhbAAKVggMAApVrAGIPjmW65bLlsBrnWgKbAAKVuwAClc8AApYgAALBpAAAAAQPAAKV9wACliAAAAAAAAABgwADyswFKwAClgwEqBrnXgKbAAKWMwAClkcAApa0AALEXAAAAAQPAAKWiwAClrQAAAAAAAABgwADyswFKwAClqAEqBrnYgKbAAKWxwACltsAApc8AALEYAAAAAQPAAKXEwAClzwAAAAAAAABgwADyswFKwAClygEqBrnZgKbAAKXTwACl2MAApfMAALEZAAAAAQPAAKXowACl8wAAAAAAAABgwADyswFKwACl7gEqBrnagKbAAKX3wACl/MAAphgAALEaAAAAAQPAAKYNwACmGAAAAAAAAABgwADyswFKwACmEwEqBrnbgKbAAKYcwACmIcAApjwAALEbAAAAAQPAAKYxwACmPAAAAAAAAABgwADyswFKwACmNwEqBrncgKbAAKZAwACmRcAApl4AALEcAAAAAQPAAKZTwACmXgAAAAAAAABgwADyswFKwACmWQEqBrndgKbAAKZiwACmZ8AApn8AALEdAAAAAQPAAKZ0wACmfwAAAAAAAABgwADyswFKwACmegEqBrnegKbAAKaDwACmiMAApqIAALEeAAAAAQPAAKaXwACmogAAAAAAAABgwADyswFKwACmnQEqBrnfgKbAAKamwACmq8AApsQAALEfAAAAAQPAAKa5wACmxAAAAAAAAABgwADyswFKwACmvwEqBrnggKbAAKbJwACmzsAApv4AAKzeAAAAAQPAAKbbwACm/gAAAAEBAcAApukAAACf4WDA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z8EAALECARrAAM+awADuSwAAAQPAAM+3wADPwQAAAAAAAABgwADyswFKwADPvQEpBrorgKbAAM/GwADP0sAA0AwAAJQOARrAAM/HwADuSwAAAQPAAM/YwADQDAAAAAEBAcAAz+IAAACWiV24HwFbAABbAUrAAM/uARzAAM/2gMAAz+7AGKbtsA0BAAEuALgpBrosgKbAANAQwADQIMAA0FAAALEJARrAANARwADuSwAAAQPAANAowADQUAAAAAAAAABgwAD0eQFKwADQLgEawADQO7l1BrotgKbAANBUwADQZcAA0I8AALEIARrAANBVwADuSwAAAQPAANBvwADQjwAAAAEBAcAA0HAAAAiDm2C5ZAAAYMAA8rMBSsAA0HoBJcAA0ICAwADQesAYp5JguhwGui6ApsAA0JPAANCkwADQygAAsQwBGsAA0JTAAO5LAAABA8AA0K7AANDKAAAAAQEBwADQvAAACIObYLlkAABgwADyswFKwADQxgEpAAAYpR0AGKVoABilswAYpf8AGKZ9ABimvAAYpxwAGKdhABinvQAYqAkAAAAJAroxgKbAANDPwADQ3sAA0gkHsUwAAAFgujgAAAABBbo3gKbAANEKwADRCsAA0XEAAAADwADRHMAA0XEAAAACAgLAANExAAAArnNgseQAwADRTAAAAIHlXcAA9R0BYLlkAABgujEBPwEJAMAA0Vy6PQIAAoDAANFiwBiod4HAANFqwBiohAADBrozgKbAANF1wADRhsAA0ZwBAJVPAAAAAQPAANGQwADRnAAAAAAAAABguWQBSsAA0ZMBHMAA0ZkWwADRky6B5blqRAEAAZMAwAD1LAa6NICmwADRoMAA0bDAANHRAQCxTQAAAAEDwADRu8AA0dEAAAAAAAAAYLktAUrAANG+ARzAANHOFsAA0cQWwADRvi6ZbrlssKO5OkQBAAGTAMAA9SwGujWApsAA0dXAANHlwADSBwEAsU4AAAABA8AA0fHAANIHAAAAAAAAAGC5LQFKwADR9AEcwADSBBbAANH6FsAA0fQumW65bLCjuTpEAQABlADAAPUsAAAYqL0AGKkJABipXgAYqbMAAAADAro4gKbAANIMwADSG8AA08IHsU8AAAFguWQAAAABBbo9gKbAANJBwADSQcAA02gAAAADwADSTcAA02gAAAACAgLAANJiAAAArnNgseQAwADSfQAAAIHlXcAA9R0BYLlkAABgujgBPwEJAMAA00m56AIAAoHAANNPwBiqFhbAANNegMAA01fAGKoJrL+x+wACBro6gKbAANNswADTfcAA05QAALECARrAANNtwADuSwAAAQPAANOKwADTlAAAAAAAAABgwADyswFKwADTkAEpBro7gKbAANOYwADTqcAA08AAALEhARrAANOZwADuSwAAAQPAANO2wADTwAAAAAAAAABgwADyswFKwADTvAEpAAAYqlgAGKqXABiq1gAAAAICuj6ApsAA0+/AANP1wADYvgOxUAAAAWC5ZAAABAS6QICmwADUKMAA1C8Jkw0AYLCtAAS6QYCmwADUjMAA1JcJsVEAYMAA8rMABLpCgKbAANXnwADV+BixUgBdwAD1HQFgwABYXQAEukOApsAA1nTAANZ+GKu1AGCw1AABBbpLgKbAANaDwADWg8AA140AAAADwADWisAA140AAAAHBATAANaQAAAEkw1gsK0AwADWrAAAAIHlXcAA9R0BYLlkAMAA1sIAAACCF2Cx4QDAANbgAAAAoGFgtdAAA8AA1v8AAASxUl3AAPUdAWDAAFhdASvAANcXAAAEsVFgwADyswEqwADXMAAABKu1YLDUAStguj4BPgE9F8AA12QuoGGDwADXeMAYq7O5ZwUIAbpAgADAGKuGCAG6QoQAwBirwQgBukGFAMAYq9cIAbpDhgDAGKvnCQDAANdFuegCAAKBwADXS8AYq5OCwADXU8AYq6YABAa6RYCmwADXksAA16PAANfTAACxAAEawADXk8AA7ksAAAEDwADXr8AA19MAAAABAQHAANfEAAAArnNgseQAAGDAAPKzAUrAANfPASkGukmApsAA19jAANfpwADYJwEAsVMAAAABA8AA1/LAANgnAAAAAAAAAGC5ZAE+AkAWwADX/y6xUbpBwADX/8AA2AoASsAA2BEBFsAA2B8WwADYGC6B5blqgXnAAPUCBrpGgKbAANgswADYOMAA2G0AAJQOARrAANgtwADuSwAAAQPAANg+wADYbQAAAAEBAcAA2EgAAACWiV24HwFbAABbAUrAANhUARzAANhcgMAA2FTAGK0ysBABAAEuALgtBrpHgKbAANhywADYhcAA2LwAACMBGsAA2HPAAO5LAAABA8AA2I3AANi8AAAAAAAAAGDAAPZdAUrAANiTASTAANi8BSexVBbAANidLpMNukAng/IWwADYqC6xUrpCJ4LaAAAYrFcAGKyjABitAQAYrWEAGK3BAAAABAK6TICmwADY+MAA2P7AANolA7FVAAABYLlkAAAAAQW6UoCmwADZIsAA2SLAANlgAAAAA8AA2SzAANlgAAAAAQEBwADZOwAAAIIXYLHhAABgukwBPwEJAMAA2UO56AIAAjHAANlXYLlkAIDAANlbwBiuGwADBrpOgKbAANllwADZdsAA2aYAALEAARrAANlmwADuSwAAAQPAANmCwADZpgAAAAEBAcAA2ZcAAACuc2Cx5AAAYMAA8rMBSsAA2aIBKQa6T4CmwADZq8AA2bfAANnvAACUDgEawADZrMAA7ksAAAEDwADZvcAA2e8AAAABAQHAANnHAAAAlolduB8BWwAAWwFKwADZ0wEcwADZ24DAANnTwBiuy7ARAQABLgC4Lga6UICmwADZ9MAA2gfAANojAAAjARrAANn1wADuSwAAAQPAANoPwADaIwAAAAAAAABgwAD2XQFKwADaFQEnsVYAABiuTgAYrpoAGK76ABivOgAAAAMCulOApsAA2ijAANo3wADc3wexVwAAAWC5ZAAAAwS6VoCmwADaXcAA2nIYsVi4HgBgwADyswEqBLpXgKbAANs1wADbThixWQBgwADyswEqBLpYgKbAANv4wADcDAaxWgBgwAD0eQGUAQW6XoCmwADbUsAA21LAANvjAAAAA8AA21nAANvjAAAAAgICwADbbQAAAIHlXcAA9R0BYLlkAMAA23UAAACCF1sAAGC6UwE+Aj0cwADboxbAANuXLqu8uW+vfQAAAADAAG5pPRzAANvIFsAA27wuq7y5b69+AAAAAMAAbmsBCQDAANt9uegCAAKAwADbg8AYr9omwADbiwGBwADbi8AYr+1gseEAAwa6WoCmwADcEMAA3CHAANxNAACw/wEawADcEcAA7ksAAAEDwADcKcAA3E0AAAABAQHAANw+AAAArnNgseQAAGDAAPKzAUrAANxJASkGuluApsAA3FHAANxiwADcmwAAsQABGsAA3FLAAO5LAAABA8AA3G7AANybAAAAAQEBwADcgwAAAK5zYLHkAABgwADyswFKwADcjgEWwADcji6xWLgeulYGulyApsAA3J/AANykwADc3QAAsVsAAAAB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sYlgwAD2XQDAARBVAAAEsYpgwAD0eQDAARB2AAAAgeVdwAD1HQFguWQAwAEQjAAAAIIXYLHhAABguvUBPgQ9HMABEMAWwAEQtC6rvLlvsXoAAAAAwABuaj0cwAEQ5xbAARDbLqu8uW+xewAAAADAAG5sPRzAAREPFsABEQMuq7y5b698AAAAAMAAbnw9HMABET0WwAERMS6rvLlvr3sAAAAAwABuegQIAbr6gADAGNs0CAG6+4EAwBjbQQgBuvyCAMAY21AJAMABEJq6CgIAAoPAARCgwBjbX4TAARCowBjbcgAFuw2ApsABEWnAARFpwAESSgCxiwADwAERgsABEkoAAAAFBQXAARGPAAAAkw1gsNEAwAERnwAAALGJYMAA9l0AwAERuAAAAIQ8YLlkAMABEc8AAACVSGC5ZADAARHmAAAAghdgseEAAGC69QE/AQoAwAER+bsMBQAFgMABEgjAGNxPgcABEhHAGNxcGsABEhe69zHAARIwYLlkAoLAARIxwBjca4PAARI7wBjceITAARJFwBjchQAFuw6ApsABEk/AARJPwAES/gCxjAADwAESZcABEv4AAAAEBATAARJyAAAAkw1gsNEAwAESggAAALGJYMAA9l0AwAESmwAAAIQ8YLlkAMABErMAAACCF2Cx4QAAYLr1AT8BCgDAARLGuwwFAAWAwAESyMAY3QaBwAES0cAY3RMawAES17r4McABEu1guWQBgsABEu7AGN0ig8ABEvnAGN0vAAW7D4CmwAETA8ABEwPAARO0ALGNAAPAARMawAETtAAAAAQEBMABEycAAACTDWCw0QDAARM3AAAAsYlgwAD2XQDAARNQAAAAhDxguWQAwAETaAAAAIIXYLHhAABguvUBPwEKAMABE3u7DAUABYDAARN9wBjdp4HAAROGwBjdtBrAAROMuvkxwAETo2C5ZAGCwAETpMAY3cODwAETr8AY3dAACwa6/oCmwAETucABE8rAARPfAQCEPAAAAAEDwAET08ABE98AAAAAAAAAYLlkAUrAARPWARzAARPcFsABE9YugeW5akQBAAGTAMAA9SwGuv+ApsABE+TAARPtwAEUCAEAsY4AAAABA8ABE/XAARQIAAAAAAAAAGDAAPKzAUrAARP4ARzAARP/FsABE/gusYq6/EEBAAEawAEUArr4AMAA9ZwGuwCApsABFAzAARQVwAEUMgEAsY8AAAABA8ABFB7AARQyAAAAAAAAAGDAAPKzAUrAARQhARzAARQoFsABFCEusYq6/EEBAAEawAEUK7r5AMAA9ZwGuwGApsABFDbAARQ/wAEUYAEAsZAAAAABA8ABFErAARRgAAAAAAAAAGDAAPKzAUrAARRNARzAARRUFsABFE0usYq6/EEBAAEawAEUV7r3AMAA9ZwGuwSApsABFGXAARR2wAEUzQAAsP8BGsABFGbAAO5LAAABA8ABFH7AARTNAAAAAQEBwAEUkwAAAK5zYLHkAABgwADyswFKwAEUpAEWwAEUvBzAARStFsABFKQuhDy6/qzTAQABgMABFLTAGN+eALmpqj2x0Aa7BYCmwAEU0sABFOvAARUgAACxBAEawAEU08AA7ksAAAEDwAEU+sABFSAAAAABAQHAARUIAAAAn+FgwABAeQAAYLlkAUrAARUYARbAARUYLoQ8uv4GuwaApsABFSTAARU1wAEVTAAAsQUBGsABFSXAAO5LAAABA8ABFULAARVMAAAAAAAAAGDAAPKzAUrAARVIASkGuwKApsABFVHAARViwAEVdAEAgIoAAAABA8ABFWjAARV0AAAAAAAAAGC5ZAFKwAEVawEcwAEVcRbAARVrLoHluWpEAQABlADAAPUsBrsHgKbAARV4wAEVhMABFcIAAJQOARrAARV5wADuSwAAAQPAARWKwAEVwgAAAAEBAcABFZQAAACWiV24HwFbAABbAUrAARWgARzAARWogMABFaDAGODysDoBAAEuALhYBrsIgKbAARXHwAEV2MABFfUAALEhARrAARXIwADuSwAAAQPAARXlwAEV9QAAAAAAAABgwADyswFKwAEV6wEWwAEV6y6xkLsBBrsJgKbAARX5wAEWDMABFkIAACMBGsABFfrAAO5LAAABA8ABFhTAARZCAAAAAAAAAGDAAPZdAUrAARYaASTAARZCBiexkRbAARYsLrGJuvsngQEWwAEWMi6xirr8J4EBFsABFjoukw26+gAAGN4lABjecQAY3sUAGN8ZABjfbQAY3+EAGOA2ABjgdQAY4MEAGOEhABjhaQAY4dMAAAALArsQgKbAARZHwAEWVsABFygHsZIAAAFguWQAAAEEuxKApsABFojAARaQCZJLAGCw+AABBbsWgKbAARaVwAEWlcABFvsAAAAD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IuYAALD/ARrAASHbwADuSwAAAQPAASHzwAEi5gAAAAEBAcABIggAAACuc2Cx5AAAYMAA8rMBPgJJwAEiFhzAASIoFsABIiEWwAEiGi6B5blqWsAA9UyAiwEAAZMAwAD1qD4BSsABIjUBIxbAASJYHMABIkkWwAEiQxbAASI8LoHluWqC0sAA9QGs0wEAAYDAASJQwBjs/gC5qao9sdAWwAEihBbAASJ2LrGZuzSw/8AAb0IWwAEisRbAASKnFsABIpkusZm7NLGcwABvRbD/wABvQgFgwADysz9KwAEixQEWwAEi2hbAASLMLrGZuzSw/8AAb0IGuzqApsABIuvAASL8wAEjLwAAsQUBGsABIuzAAO5LAAABA8ABIwnAASMvAAAAAAAAAGDAAPKzAUrAASMPARbAASMdFsABIw8usZm7NLGdwABvRAa7O4CmwAEjNMABI0XAASPcAACxAAEawAEjNcAA7ksAAAEDwAEjUcABI9wAAAABAQHAASNmAAAArnNgseQAAGDAAPKzAUrAASN3ASIiIRzAASOGFsABI3cur7G7M0EBAAErAMAA9dIAFsABI6YWwAEjly6vsbszsQDAAG9ZABbAASPLHMABI7wurNMBAAGAwAEjw8AY7lUAuamsrLHRBrs8gKbAASPhwAEj8cABJCEAALEJARrAASPiwADuSwAAAQPAASP5wAEkIQAAAAAAAABgwAD0eQFKwAEj/wEawAEkDLmXBrs9gKbAASQlwAEkNsABJGAAALEIARrAASQmwADuSwAAAQPAASRAwAEkYAAAAAEBAcABJEEAAAiDm2C5ZAAAYMAA8rMBSsABJEsBJcABJFGAwAEkS8AY7zhguy8Guz6ApsABJGTAASR1wAEk/AAAsQwBGsABJGXAAO5LAAABA8ABJH/AAST8AAAAAQEBwAEkjQAACIObYLsvAABgwADyswE+AUrAASSaASIhHMABJLUWwAEkrhbAASShLrGYuzGC/cAAjp9BAQABKwDAAPZsABzAASTcFsABJNUWwAEkyC6xmLsxgv3AAI6fQQEAARbAASTyFsABJOWAwAEk38AY75SxmLsxgv3AAI6fAMAA9mwGuz+ApsABJQHAASUUwAElSgAAIwEawAElAsAA7ksAAAEDwAElHMABJUoAAAAAAAAAYMAA9l0BSsABJSIBJMABJUoDJ7GeFsAB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wAE5IcAZBTmDwAE5K8AZBUYABQa7l4CmwAE5NMABOUDAATl4AACUDgEawAE5NcAA7ksAAAEDwAE5RsABOXgAAAABAQHAATlQAAAAlolduB8BWwAAWwFKwAE5XAEcwAE5ZIDAATlcwBkFvLA+AQABLgC4XAa7mICmwAE5fcABOanAATnRAACbkwEawAE5fsAA7ksAAAEDwAE5ssABOdEAAAAAAAAAYMAAVXABSsABObgBGsABOcjAAFVHBruZgKbAATnVwAE55cABOhMAALEJARrAATnWwADuSwAAAQPAATntwAE6EwAAAAAAAABgwAD0eQFKwAE58wEawAE6ALl8BruagKbAAToXwAE6KMABOlAAALEIARrAAToYwADuSwAAAQPAAToywAE6UAAAAAEBAcABOjMAAAiDm2C5ZAAAYMAA8rMBSsABOj0BJcABOkOAwAE6PcAZBqhgu5UGu5uApsABOlTAATplwAE6iwAAsQwBGsABOlXAAO5LAAABA8ABOm/AATqLAAAAAQEBwAE6fQAACIObYLlkAABgwADyswFKwAE6hwEpAAAZBYsAGQXrABkGMgAZBncAGQbTABkHHwAAAAUCu56ApsABOpDAATqWwAE8pgOxrQAAAWC7kgAAAAEFu6aApsABOrvAATq7wAE7RQAAAAPAATrGwAE7RQAAAAQEBMABOtQAAACVS2C5ZADAATrnAAAAlUxguWQAwAE69wAAAJ/sYL6/AMABOxUAAACCF2Cx4QAAYLueAT8BCQDAATsju5QEAASAwAE7KcAZB32BwAE7L8AZB4qCwAE7NsAZB5eDwAE7QMAZB6QABQa7oICmwAE7ScABO1XAATuOAACUDgEawAE7SsAA7ksAAAEDwAE7W8ABO44AAAABAQHAATtlAAAAlolduB8BWwAAWwFKwAE7cQEcwAE7eYDAATtxwBkIGrA/AQABLgC4XQa7oYCmwAE7k8ABO7/AATvoAACbkwEawAE7lMAA7ksAAAEDwAE7yMABO+gAAAAAAAAAYMAAVXABSsABO84BGsABO97AAFVIBruigKbAATvswAE7/MABPCsAALEJARrAATvtwADuSwAAAQPAATwEwAE8KwAAAAAAAABgwAD0eQFKwAE8CgEawAE8F7mRBrujgKbAATwvwAE8QMABPGkAALEIARrAATwwwADuSwAAAQPAATxK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wABDxIDAAEO6wBoAwZJEwABddADAAFTFP0LAAEPmAAHAAEQGGsAARAbAAF1fAD4CPRzAAEQYLrLoAQABgMAARDHAGgDBAMAAVMRCwABERQBJwABEVhbAAERhhMAARFrAGgIBg2jAAGGKPgE9HMAARH+BwABEdcAaAM4gAgACFsAARIaDwABEgMAaASue28AAYTCEwABEjsAaAgEAAD8Gv1SAqMAARNjAAETdwABFNAAArEQAAAABA8AARPXAAEU0AAAAAQEBwABFAwAAAJMNYLC/AABcAT4BPRzAAEUkFsAARRIusrjAAFS9TwEAASbAAEUoAYDAAEUowBoG4mCw1ADAAPYbBr9VgKjAAEU5wABFPsAARlsAAKxjAAAAAQPAAEVRwABGWwAAAAMCAsAARV4AAACZPGCwrQDAAEV2AAAAstxeAAICAmCwv13AAGF+AWDAAGDzAAFXwABgMABcAAHAAEWOAAAArGZgwADyswEqXAE+AT0cwABFuBbAAEWkLrLTvve/MKp1AgACgMAARcvAGgdJNMAARdgDwABF2MAARlYAAAACAgLAAEXlAAAAmTxgsK0AwABF9wAAAJJbYLC/AABgwAD1ggE+AT0cwABGBy6y7L73BAADg8AARifAGgfFhMAARizAGgfSgcAARjTAGgdWAaxmgsAARkjAGgd9v0MArwAGv0OAqMAARmDAAEZlwABHTQAAsuy+9wAAAAEDwABGhMAAR00AAAAEAwPAAEaRAAAAmTxgsK0AwABGswAACJJbYLC/AMAARs4AAACy3F4AAgICYLC/XcAAYX4BYMAAYPMAAVfAAGAwAFwAAcAARuYAAACsZmDAAPKzASpcAT4CScAARvwhFsAARwiBwABHAcAaCFmUrLDESsAARxoAPz0cwABHJi6y6773AgACgcAARzbAGghZgsAARz7AGghmAL9EBr9EgKjAAEdSwABHXsAATuAAALLrvvcAAAABA8AAR23AAE7gAAAAAwICwABHjAAACJJbYLC/AMAAR6cAAACy3F4AAgICYLC/XcAAYX4BYMAAYPMAAVfAAGAwAFwAAcAAR78AAACsZmDAAPKzASpgwABgQAE+A07AAEiMwABIkgAAst9gwABgQAEcwABIqBbAAEiULrLIvve/HkQBAAGAwABIqcAaCQ0AwAD1YknAAEi2HMAASMCDwABIusAaCVpBAQABKwDAAGBaPgtOwABI2MAASOMAAKJtYMAA9l0BFsAASOyAwABI5cAaCQ2AsLCbTsAASQTAAEkIAACZPGCwrQEWwABJEYDAAEkKwBoJDZJpsM1OwABJLMAASTUAAJXdYMAA8rMBHMAASUgWwABJNy6so773vzGqbwEAAYXAAElWwBoJ1ADAAFOdPYvAAEliwBoJWh7AAEluwABgRAIAAYDAAEl6wBoJDQGV3YbAAEmMwBoJ907AAEmwwABJtwAArGRdwABhfgFgwABg8wEfwABJvcAAYa8AAWDAAGDzAAA9HMAASeCHwABJ2cAaClmAmQEAARbAAEntg8AASefAGglasu3AAGA3AMAAYZBJwABKACIhFsAASguDwABKBcAaCVqy7sAAYEgAHMAAShYusrEBAAGAwABKJ8AaCQ0Av0k+AT0cwABKQYfAAEo6wBoKWYCZAQABHMAASk6DwABKSMAaCVqdOQAAAADAAGBWAMAAYZA/ScAASmUiIRbAAEpwg8AASmrAGglasu/AAGBJABzAAEp8LrKwAQABgMAASo3AGgkNAL9KPgE9HMAASqeHwABKoMAaClmAmQEAARzAAEq0g8AASq7AGglaghEAAAAAwABgVwDAAGGQP0nAAErMIiEWwABK14PAAErRwBoJWrLwwABgSgAcwABK5C6y2wEAAYDAAErywBoJDQC/SD4BPRzAAEuVh8AAS47AGgpZgJkBAAEcwABLooPAAEucwBoJWrLiAQABKwDAAGBYAMAAYZA/ScAAS8AhgsAAS8XAGglBPgNJwABL1xbAAEvhg8AAS9vAGglasvHAAGBOPgE9HMAATOccwABMmxbAAExzLrLKvve/IJiQAgACFsAATLQWwABMrYPAAEynwBoJWp7bwABgQoCwsJs0wABMugPAAEy6wABM1gAAAAAAAABdwAD2DgFgwABgQAFKwABMwAEewABMxMAAux8AAWDAAGBAAAAAwAD1aU8BAAGDwABM68AaCVoAwAD2Gz9JwABNBRbAAE0Pg8AATQnAGglasvLAAGBNPgE9HMAAThAcwABNyxbAAE2lLrLJvve/H5iQAgAChMAATdfAGgmvNMAATeMDwABN48AATf8AAAAAAAAAXcAA9g4BYMAAYEABSsAATekBHsAATe3AALsfAAFgwABgQAAAAMAA9WlPAQABg8AAThTA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AAEmwABlygGDwABlysAaHetgwABobwDAAF/csqvAAF/mAACvAAa/XYCowABl7MAAZfHAAGY/AACy/wAAAAEDwABmCcAAZj8AAAABAQHAAGYTAAAAghdgwABYNgAAXAE+AT0cwABmMhbAAGYfLrLNvve/I08BAAGAwABmNsAaHwUAwAD2Gwa/OoCowABmRMAAZmfAAGaOAQCyvAEawABmRcAA7ksAAAEDwABmecAAZo4AAAAAAAAAXcAA9NsBYMAAWDYBSsAAZnwBFsAAZnwuss2+978jBr9egKjAAGaTwABmmMAAZuIAALMAAAAAAQPAAGaswABm4gAAAAEBAcAAZrYAAACCF2DAAFg2AABcAT4BPRzAAGbVFsAAZsIuss6+978kTwEAAYDAAGbZwBoftQDAAPYbBr87gKjAAGbnwABnCsAAZzEBALK9ARrAAGbowADuSwAAAQPAAGccwABnMQAAAAAAAABdwAD02wFgwABYNgFKwABnHwEWwABnHy6yzr73vyQAABntMAAZ7WwAGe2oABnt5AAZ7iAAGe5eABnunAAZ7zoAGe96ABnvugAZ8eUAGfMDABnzfAAZ9CoAGfSqABn5AAAZ+2AAGfvjABn8VgAZ/MkAGf08ABn9owAZ/goAGf5xABn+xgAaAJ8AGga6ABoHIQAaCCIAGgjjABoNxwAaD5gAGhA5ABoR3AAaEkMAGhSvABoVRgAaFZEAGhcKABoYsgAaGkAAGhr+ABob6gAaHUsAGh7dABofPQAaH40AGh/tABogPQAAADAAAAGAqAAaIQgAGeOnABno0wAaIQYAAAACABohCAAAAAAAv2EAgKkAAB2A2gAAnr4AAIDzAACsLgABAQKojKiSgSoAAKySAACBTAAAwABWjgAAgW8AALCYAACBkwAAwABYMQAAgbQAAMAAe5wAAIHVAADAAGHeAACB/gAAwABfkQABAQGshYI+AADAAGIoAAEBArMBswKClAAAwABijgABAQGzA4LeAADAAFOUAAEBAqjQswSDLwAAwABi6QAAg2QAAMAAYzwAAIOPAADAAHg0AACDuQAAwABZgQAAg9wAAMAAfIUAAIQCAADAAGVPAAEBAayGhEEAAIDnAACEWwAAwABhfQAAhHoAAIHJAACElgAAwABAdQABAQKfrbMFhMsAAMAAVPwAAITpAADAAGWtAAEBAp0f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APKzASlOwABGL8AARjsAAJVoXcAA9U4CYLDRYMAAVr0BMsAARmNgsNFgwABWvQA9HMAARo4WwABGeoLAAEZtwBrtt7QwwAB9ZYO8AQABNMAARpYDwABGlsAASDoAAAACAgLAAEajAAAAlERgsNEAwABGvQAAAIQfYMAAQOwAAGDAAPWCAT4DTsAARt/AAEblAACAimDAAFa9ARzAAEbwhsAARufAGu6TnaoBAAGAwABG+cAa7SgAwABA+UAhHMAARymHwABHI8Aa7qxBAQABKwDAAPXSwABHI8AARzABHsAARz6r3wIAAhrAAEdHq+8kwABHqQMntDEcwABHlIbAAEeLwBruk6sKAAAAAMAAQPwngTEAScAAR7UWwABHv4fAAEe5wBrurLBpwABWvz4BPRzAAEfihMAAR9fAGu4qgLICAAKFwABH48Aa7oaHwABH7MAa7qwAwAD1Yz4BPYvAAEgOwBruFioAwAD1bUbAAEhDwABIh8AASGEAAAC0MmDAAELMABbAAEh7gsAASG7AGu23tDPAAH1mPgFJwABIkSEWwABIthzAAEighcAASJbAGu+ZnaoBAAGAwABIqcAa7SgAwABC17BpwABWvz4BPYvAAEjOwBruFio/ScAASQGDwABJBcAa7hY+AUrAAEkiAR/AAEktwABYAwIAAoHAAElGwBrtQITAAElUwBruKgA+AUrAAEl5AR/AAEmEwABYMAAAAAAAwAB9xgbAAEGigK3AAEmvwABJv8AASq4AAJXuwABAxAEawABJsMAA7ksAAAEDwABJz8AASq4AAAAAAAAAYMAA9HkBPgNOwABJ3MAASeUAAIOJYMAA9HkBHMAAShkcwABKAhzAAEnyNw2DPgEAARbAAEn5FsAASfQughfAAEGWg4nAAFhmAMAA9aBdAQABHMAASgc3EYM+AQABFsAAShAWwABKCS6B08AAQZeDicAA9dgAwAD1oADAAPWeXQEAARzAAEoeNxODPgEAARbAAEouFsAASiAurCXAAEGYg4nAAFUQAMAA9aAAwAD1nkbAAEo8wABKaMAASlQAAACAimDAAEDsABbAAEpdLlTAAEGZPgE9iMAASnDAGvCOHMAASnmAwABKcMAa8I6DgwEAARzAAEp/NxeDPgEAARbAAEqHgcAASoHAGvE9g4nAAEDzAMAA9aAAwAD0k0rAAEqbAYDAAEqiwBrwjgbAAEGjgK3AAEqzwABKxMAATA0AALP8wABAxAEawABKtMAA7ksAAAEDwABKy8AATA0AAAABAQHAAErqAAAIg5tgwABBlAAAYMAA8rMBPgVJwABK9yEcwABLABbAAEr7LoIXwABBlkEBAAEWwABLCYDAAEsDwBrx5oIXwABBlgDAAFhvSsAASw8BKj9JwABLISEcwABLLBbAAEslLoHTwABBl0EBAAEWwABLNYDAAEsvwBrx5oHTwABBlwDAAPXSSsAASz0BKj9JwABLTyEcwABLYRbAAEtTLqwlwABBmEEBAAEWwABLaoDAAEtkwBrx5qwlwABBmADAAFUbSsAAS3kBKj9FwABLiwHAAEuUwABLlgAAW2DAAPR5AZMBHMAAS52BwABLm8Aa8rhcAQABFsAAS6kWwABLny5UwABBmVrAAPVMAMAA9aYBicAAS7HAGvK4HMAAS7KBwABLscAa8rhdAQABlADAAPWePgFJwABLviEcwABLzxzAAEvLFsAAS8IuVMAAQZlEAQABgcAAS8zAGvK4AMAA9SxBAQABHMAAS+EWwABL2IDAAEvSwBrx5lTAAEGZRAEAAYHAAEviwBryuADAAPUsAMAAQQFKwABL5gEqP0rAAEv+ASkGwABBnICtwABMEsAATCfAAEw6AQC0AAEawABME8AA7ksAAAEDwABMMsAATDoAAAAAAAAAYMAA8rMBSsAATDUBKgbAAEGdgK3AAEw/wABMVMAATJQBALQBARrAAExAwADuSwAAAQPAAExgwABMlAAAAAAAAABgwADyswE+AUrAAExmARzAAEx3FsAATG0uVMAAQZmBZQEAATTAAEx7A8AATHvAAEyPAAAAAQEBwABMfAAAAIMGYMAAQOwAAGDAAPKzAUrAAEyCARbAAEyEgMAATILAGvQ2tAHAAED1AMAA9PAAABrogAAa6LkAGukfABrqXgAa62YAGuv1ABrs9QAa8E0AGvGvABrzigAa88sAGvRrAAAACwLAAEGqgK3AAEzWwABM3MAAWJYDtDQAAAFgwABA7AAAAQTAAEGsgK3AAE04wABNQwmVVABdwAD1HQFgwABA7AABBcAAQbqArcAATUjAAE1IwABNdwAAAAPAAE1lwABNdwAAAAEBAcAATWsAAASVVF3AAPUdAWDAAEDsAABgwABBqgE/AggBwABBrIAAwBr1BgkBwABNSMAAQQQAAAAACQbAAEGugK3AAE18wABNo8AATc0BAIIcARrAAE19wADuSwAAAQPAAE2owABNzQAAAAAAAABgwABAxQFKwABNqwEawABNwsAAQM8GwABBsYCtwABN0sAATd7AAE5LAACUDgEawABN08AA7ksAAAEDwABN5MAATksAAAACAQLAAE3/AAAAloldwABC7QJbWwDAAE4JAAAAgedbASsAWwE+AUrAAE4ZARzAAE4ogMAATiDAGvW7tDUCAAIugcAATj/AGvXNAMAAQvoGwABBs4CtwABOUMAATmHAAE95AACz+8AAQMQBGsAATlHAAO5LAAABA8AATnbAAE95AAAAAQEBwABOhAAAAIN6YMAA9qcAAFwBPgQ9HMAATpGAwABOjsAa9j2CEQEAASe0NgDAAPa7TsAATsDAAE7KAAC0FmDAAPZdAScARsAATtTAAE8CwABO7AAAAICKYMAAQOwAFsAATvUulVTAAEGsPgM9HMAATw2AwABPCsAa9j2CEQEAAYHAAE8TwBr2bgDAAPa7PRzAAE8rgsAATyXAGvaLs/vAAEDEAQABgMAAT0HAGvY9AMAAQP49icAAT0zAGvZuJ4CbPRzAAE9qgMAAT2fAGvY9ghEBAAEntBcAwAD2uwbAAEG2gK3AAE9+wABPncAAUDIAAKn1ARrAAE9/wADuSwAAAQPAAE+iwABQMgAAAAEBAcAAT7cAAABUYMAAfeAAAGDAAEDsAT4BSsAAT8gBH8AAT9PAAEG6AQABHMAAUCUcwABQBhbAAE/6LpVUwABBrICfAQFgwABA7AE0wABQCgPAAFAKwABQIwAAAAEBAcAAUAsAAACBZmDAAEDsAABgwABA7AFKwABQEQEcwABQE4HAAFARwBr3qan1AQABgMAAUBnAGvdMAMAAQPgAwAD05oChAAAAAMAA9PEABsAAQbeArcAAUDfAAFBRwABV5gAAnaoBGsAAUDjAAO5LAAABA8AAUFnAAFXmAAAAAQEBwABQcAAAAH5gwAB9tgAAYMAAVr0BPgVOwABQiMAAUJAAAK6wYMAA8rMBKU7AAFCpwABQrAAAg3pgwAD2pwEfwABQssAA9sYAAAAARsAAUMYAwABQ3gAAAJJHYMAAQOwAFsAAUOwulVTAAEGsQT4DTsAAUQ/AAFEVAACAimDAAFa9ARzAAFEig8AAURfAGvh6naoBAAGAwABRK8Aa+CkAwABA+UnAAFE/IRbAAFFKhMAAUUTAGviZsGnAAFa/PgI9icAAUWDAGvhBKkLAAFH2AD9JwABSDhbAAFIYhMAAUhLAGviZqwnAAFbNPgFJwABSLyXAAFI5hMAAUjPAGviZYMAAV3M+AT0cwABSYILAAFJdwBr4VYIRAQABFsAAUmwUwABSZsAa+JkEAWDAAFdznCvAAFd1AMAA9rtJwABSiSXAAFKThMAAUo3AGviZYMAAVxY+AT0cwABSt4LAAFK0wBr4VYIRAQABFsAAUsMUwABSvcAa+JkEAWDAAFcWpNHAAFcYAMAA9rtJwABS3SXAAFLnhMAAUuHAGviZYMAAVzA+AT0cwABTDoLAAFMLwBr4VYIRAQABFsAAUxoUwABTFMAa+JkEAWDAAFcwphXAAFcyAMAA9rtJwABTNyXAAFNBhMAAUzvAGviZYMAAV0g+AT0cwABTZoLAAFNjwBr4VYIRAQABFsAAU3IUwABTbMAa+JkEAWDAAFdIm7PAAFdNAMAA9rtJwABTjSXAAFOXhMAAU5HAGviZYMAAVvw+AT0cwABTvILAAFO5wBr4VYIRAQABKwDAAPa7Pz4DPRzAAFP2gMAAU+rAGvgpoFEDAAODwABUD8Aa+HoawABUJ5+dMsAAVExbWwInhB+DwABUZMAa+HonghccwABUiITAAFSCwBr4mZYXAQABFsAAVJyAwABUkMAa+CmqtcAAfbgAwABW2gDAAH3FPYnAAFTAwBr4QSpCwABVVgBJwABVcoHAAFV2wBr4QT4BSsAAVYcBHsAAVY7AAFVWAQABHMAAVa6CwABVq8Aa+FUjAAAAAMAA9sAAP0rAAFXFAR/AAFXQwABYMAAAAAAGwABBtICtwABV68AAVfvAAFa0AACV7sAAQMQBGsAAVezAAO5LAAABA8AAVgvAAFa0AAAAAAAAAGDAAPR5AT4DTsAAVhjAAFYhAACDiWDAAPR5ARzAAFYmNxGDPgEAARbAAFY0FsAAVigulVTAAEGsWsAA9UwAwAD1oEbAAFZAwABWbsAAVlgAAACAimDAAEDsABbAAFZhLpVUwABBrD4BPYjAAFZ2wBr7kBzAAFZ/gMAAVnbAGvuQg4MBAAEcwABWhTcTgz4BAAEWwABWjYHAAFaHwBr70oOJwABA8wDAAPWgAMAA9JNKwABWoQGAwABWqMAa+5AGwABBtYCtwABWucAAVsrAAFfLAACz/MAAQMQBGsAAVrrAAO5LAAABA8AAVtHAAFfLAAAAAQEBwABW8AAACIObYMAAQaoAAGDAAPKzAT4DScAAVv0hHMAAVxQWwABXDRbAAFcBLpVUwABBrFrAAPVMQQEAARbAAFcpFsAAVx2AwABXF8Aa/HyVVMAAQaxawAD1TADAAPWcSsAAVzEBKj9FwABXQwHAAFdMwABXTgAAW2DAAPR5AZMBHMAAV1WBwABXU8Aa/OpcAQABFsAAV2MWwABXVy6VVMAAQaxawAD1TADAAPWmAYnAAFdrwBr86hzAAFdsgcAAV2vAGvzqXQEAAZQAwAD1nj4BScAAV3ghHMAAV4scwABXhxbAAFd8LpVUwABBrEQBAAGBwABXiMAa/OoAwAD1LEEBAAEcwABXnxbAAFeUgMAAV47AGvx8lVTAAEGsRAEAAYHAAFegwBr86gDAAPUsAMAAQQFKwABXpAEqP0rAAFe8ASkGwABBuICtwABX0MAAV+rAAFg4AACz+gEawABX0cAA7ksAAAEDwABX9sAAWDgAAAABAQHAAFgGAAAAqrVgrJMAAGDAAFhdAUrAAFgfARbAAFgugMAAWB/AGv3ylVWsuQbAAEGvgK3AAFg9wABYUsAAWJQBALQBARrAAFg+wADuSwAAAQPAAFhewABYlAAAAAAAAABgwADyswE+AUrAAFhkARzAAFh3FsAAWGsulVTAAEGsgWUBAAE0wABYewPAAFh7wABYjwAAAAEBAcAAWHwAAACDBmDAAEDsAABgwADyswFKwABYggEWwABYhIDAAFiCwBr+irQBwABA9QDAAPTwAAAa9T8AGvWIABr2BgAa9xkAGvf2ABr7TwAa/EUAGv2/ABr+HgAa/r8AAAAJAsAAQbuArcAAWK3AAFizwABb+gO0NwAAAWDAAEDsAAABBMAAQb2ArcAAWPjAAFj8CYCwAGDAAPZdAAEFwABByYCtwABZAcAAWQHAAFkkAAAAA8AAWRnAAFkkAAAAAQEBwABZHwAABICwYMAA9l0AAGDAAEG7AT8CCAHAAEG9gADAGv9MCQHAAFkBwABBBAAAAAAHBsAAQb+ArcAAWSnAAFlQwABZdQEAghwBGsAAWSrAAO5LAAABA8AAWVXAAFl1AAAAAAAAAGDAAEDFAUrAAFlYARrAAFlvwABA4AbAAEHBgK3AAFl6wABZhsAAWe4AAJQOARrAAFl7wADuSwAAAQPAAFmMwABZ7gAAAAIBAsAAWacAAACWiV3AAELtAltbAMAAWbEAAACB51sBKwBbAT4BSsAAWcEBHMAAWdCAwABZyMAa//u0OAIAAi6BwABZ4sAbAA0AwABC+wbAAEHDgK3AAFnzwABaBMAAWlMAALP7wABAxAEawABZ9MAA7ksAAAEDwABaGcAAWlMAAAABAQHAAFonAAAAg3pgwAD2pwAAXAE+AT0cwABaNIDAAFoxwBsAfYIRAQABJMAAWk4DJ7Q5FsAAWkgugLDAAEG9J4LaAMAA9rsGwABBxICtwABaWMAAWmjAAFqQAACV7sAAQMQBGsAAWlnAAO5LAAABA8AAWnjAAFqQAAAAAAAAAGDAAPR5AUrAAFp+ARzAAFqBNw2DPgEAARbAAFqIFsAAWoMugLDAAEG9g4nAAPZiAMAA9aAGwABBxYCtwABalcAAWqbAAFrxAACz/MAAQMQBGsAAWpbAAO5LAAABA8AAWq3AAFrxAAAAAQEBwABaxwAACIObYMAAQbsAAGDAAPKzAT4BSsAAWtQBHMAAWuAWwABa2y6AsMAAQb1BAQABFsAAWumAwABa48AbAWWAsMAAQb0AwAD2bAbAAEHGgK3AAFr2wABbEMAAW4sAAJ2qARrAAFr3wADuSwAAAQPAAFsYwABbiwAAAAEBAcAAWy8AAAB+YMAAfbYAAGDAAFa9AT4BSsAAW0IBHsAAW0nAAFVjAgACFsAAW3KAwABbZsAbAeSqtcAAfbgWwABbgi6AsMAAQb0ABsAAQceArcAAW5DAAFuqwABb+AAAs/oBGsAAW5HAAO5LAAABA8AAW7bAAFv4AAAAAQEBwABbxgAAAKq1YKyTAABgwABYXQFKwABb3wEWwABb7oDAAFvfwBsCYZV+rLoAABr/fwAa/8gAGwBGABsAwgAbAS4AGwGxABsCLgAbAo0AAAAHAsAAQcqArcAAXA/AAFwVwABgHAO0OgAAAWDAAEDsAAACBMAAQcyArcAAXI3AAFyRCYIXAGDAAFg2AATAAEHNgK3AAFyiwABcpgmAsABgwAD2XQABBcAAQdmArcAAXKvAAFyrwABdUgAAAAPAAFzBwABdUgAAAAICAsAAXMcAAASCF2DAAFg2AMAAXNIAAASAsGDAAPZdAABgwABBygE+AUAiIhbAAFzqFsAAXOUughfAAEHMqs/AAFg9ARbAAF0CFsAAXP0ughfAAEHMsizAAFg+ARbAAF0UFsAAXQ8ughfAAEHMhETAAFg7wABc5cAAXR0BJMAAXU0CJ7Q7FsAAXUgughfAAEHMAwgBwABBzIAAwBsDKwgBwABBzYEAwBsDOgkBwABcq8AAQQQAAAAABwbAAEHPgK3AAF1XwABdfsAAXaEBAIIcARrAAF1YwADuSwAAAQPAAF2DwABdoQAAAAAAAABgwABAxQFKwABdhgEawABdncAAQOEGwABB0YCtwABdpsAAXbLAAF4YAACUDgEawABdp8AA7ksAAAEDwABduMAAXhgAAAACAQLAAF3TAAAAloldwABC7QJbWwDAAF3dAAAAgedbASsAWwE+AUrAAF3tARzAAF38gMAAXfTAGwRenbACAAIugcAAXgzAGwRwAMAAQvwGwABB04CtwABeHcAAXi7AAF57AACz+8AAQMQBGsAAXh7AAO5LAAABA8AAXkPAAF57AAAAAQEBwABeUQAAAIN6YMAA9qcAAFwBPgE9HMAAXl6AwABeW8AbBOCCEQEAASTAAF52Aye0PBbAAF5wLoIXwABBzCeC2gDAAPa7BsAAQdaArcAAXoDAAF6awABfEwAAnaoBGsAAXoHAAO5LAAABA8AAXqLAAF8TAAAAAQEBwABeuQAAAH5gwAB9tgAAYMAAVr0BPgFKwABezAEewABe08AAVVoCAAIWwABe+oDAAF7uwBsFWKq1wAB9uBbAAF8KLoIXwABBzAAGwABB1ICtwABfGMAAXyjAAF9QAACV7sAAQMQBGsAAXxnAAO5LAAABA8AAXzjAAF9QAAAAAAAAAGDAAPR5AUrAAF8+ARzAAF9BNw2DPgEAARbAAF9IFsAAX0MughfAAEHMg4nAAPXYAMAA9aAGwABB1YCtwABfVcAAX2bAAF+vAACz/MAAQMQBGsAAX1bAAO5LAAABA8AAX23AAF+vAAAAAQEBwABfhQAACIObYMAAQcoAAGDAAPKzAT4BSsAAX5IBHMAAX54WwABfmS6CF8AAQcxBAQABFsAAX6eAwABfocAbBkWCF8AAQcwAwAD10gbAAEHXgK3AAF+0wABfzsAAYBoAALP6ARrAAF+1wADuSwAAAQPAAF/awABgGgAAAAEBAcAAX+oAAACqtWCskwAAYMAAWF0BSsAAYAMBFsAAYBKAwABgA8AbBsSVHqy9AAAbA+IAGwQrABsEqQAbBSUAGwWiABsGDgAbBpEAGwbwAAAABwLAAEHagK3AAGB0wABgesAAaf4DtD0AAAFgwABA7AAAAgTAAEHcgK3AAGDHwABg0QmSRwBgwABA7AAEwABB3YCtwABg5MAAYOgJghcAYMAAWDYAAQXAAEHqgK3AAGDtwABg7cAAYR0AAAADwABhAcAAYR0AAAACAgLAAGEHAAAEkkdgwABA7ADAAGEYAAAEghdgwABYNgAAYMAAQdoBPwMIAcAAQdyAAMAbB44IAcAAQd2BAMAbB50JAcAAYO3AAEEEAAAAAAgGwABB34CtwABhIsAAYUnAAGFqAQCCHAEawABhI8AA7ksAAAEDwABhTsAAYWoAAAAAAAAAYMAAQMUBSsAAYVEBGsAAYWjAAEDLBsAAQeGArcAAYW/AAGF7wABh3wAAlA4BGsAAYXDAAO5LAAABA8AAYYHAAGHfAAAAAgECwABhnAAAAJaJXcAAQu0CW1sAwABhpgAAAIHnWwErAFsBPgFKwABhtgEcwABhxYDAAGG9wBsIWLQ+AgACLoHAAGHTwBsIagDAAELwBsAAQeOArcAAYeTAAGH1wABigwAAs/vAAEDEARrAAGHlwADuSwAAAQPAAGIKwABigwAAAAEBAcAAYhgAAACDemDAAPanAABcAT4DPRzAAGIlgMAAYiLAGwjaghEBAAEntD8AwAD2uz0cwABiSBbAAGI9LpJHwABB3LP7wABAxAEAAYDAAGJewBsI2gDAAED+PRzAAGJqgMAAYmfAGwjaghEBAAEkwABifgMnsYAWwABieC6CF8AAQd0ngtoAwAD2uwbAAEHmgK3AAGKIwABiosAAaBUAAJ2qARrAAGKJwADuSwAAAQPAAGKqwABoFQAAAAEBAcAAYsEAAAB+YMAAfbYAAGDAAFa9AT4GTsAAZIHAAGSRAAC0QGDAAFa9ARzAAGSeFsAAZJMukkfAAEHcnaoBAAGAwABkp8AbCZcAwABA+UnAAGS6IRbAAGTLgMAAZL/AGwmXtEHAAH28SsAAZNcBgcAAZN7AGwmvP07AAGUiwABlMQAApyJgwABYNgEcwABlS4HAAGU7wBsJr5YXAQABFsAAZV+AwABlU8AbCZeqtcAAfbgAwABW2k7AAGW+wABlzAAAtEJgwABYNgEcwABl2oDAAGXOwBsJl7RDAQABFsAAZesughfAAEHdAMAAfcNJwABmWCEewABmXcAAVWADAAMWwABmjIDAAGaAwBsJl5UIwAB9uYLAAGaTwBsKEIPAAGajwBsKTwA+Aj0cwABnQoDAAGc2wBsJl6BRAwADFsAAZ04ukkfAAEHcGsAAZ2afkzLAAGeHW1sDJ4QfFsAAZ5QukkfAAEHcJ4IXgsAAZ6jAGwoQJ7REFsAAZ8QughfAAEHdAMAAfcVKwABn0gEfwABn3cAAWDAAAAAAP0rAAGf7AYHAAGgCwBsJrwbAAEHngK3AAGgawABoOcAAaKoAAKn1ARrAAGgbwADuSwAAAQPAAGg+wABoqgAAAAEBAcAAaFMAAABUYMAAfeAAAGDAAEDsAT4BSsAAaGQBH8AAaG/AAEHqAgACHMAAaI8WwABohC6SR8AAQdyp9QEAAYDAAGiVwBsLdADAAED4FsAAaKEughfAAEHdAAbAAEHkgK3AAGivwABov8AAaQIAAJXuwABAxAEawABosMAA7ksAAAEDwABoz8AAaQIAAAAAAAAAYMAA9HkBSsAAaNUBHMAAaOgcwABo2DcNgz4BAAEWwABo3xbAAGjaLoIXwABB3YOJwAD12ADAAPWgXQEAARzAAGjtNxGDPgEAARbAAGj6FsAAaO8ukkfAAEHcg4nAAEDzAMAA9aAAwAD1ngbAAEHlgK3AAGkHwABpGMAAaYEAALP8wABAxAEawABpCMAA7ksAAAEDwABpH8AAaYEAAAABAQHAAGk1AAAIg5tgwABB2gAAYMAA8rMBPgFKwABpQgEiHMAAaVQWwABpSS6SR8AAQdxBAQABFsAAaV2AwABpV8AbDKeSR8AAQdwAwABBAQAcwABpcBbAAGlrLoIXwABB3UEBAAEWwABpeYDAAGlzwBsMp4IXwABB3QDAAPXSBsAAQeiArcAAaYbAAGmgwABp/AAAs/oBGsAAaYfAAO5LAAABA8AAaazAAGn8AAAAAQEBwABpvAAAAKq1YKyTAABgwABYXQFKwABp1QEmwABp1QEcwABp4BbAAGnVLpJHwABB3LP6AQABgMAAae3AGw1WAMAAQPpgwABYXQAAGwfcABsIJQAbCKMAGwlkABsLQQAbC84AGwxwABsNIwAbDZ8AAAAIAsAAQeuArcAAajjAAGo+wABtlAO0RQAAAWDAAEDsAAABBMAAQe2ArcAAaofAAGqOCZMNAGCw0QABBcAAQfiArcAAapPAAGqTwABquAAAAAPAAGqqwABquAAAAAEBAcAAarAAAASTDWCw0QAAYMAAQesBPwIIAcAAQe2AAMAbDiYJAcAAapPAAEEEAAAAAAYGwABB74CtwABqvcAAauTAAGsIAQCCHAEawABqvsAA7ksAAAEDwABq6cAAawgAAAAAAAAAYMAAQMUBSsAAauwBGsAAawPAAEDVBsAAQfGArcAAaw3AAGsZwABrgAAAlA4BGsAAaw7AAO5LAAABA8AAax/AAGuAAAAAAgECwABrOgAAAJaJXcAAQu0CW1sAwABrRAAAAIHnWwErAFsBPgFKwABrVAEcwABrY4DAAGtbwBsO05S9AgACLoHAAGt0wBsO5QDAAEL+BsAAQfOArcAAa4XAAGuWwABr6gAAs/vAAEDEARrAAGuGwADuSwAAAQPAAGurwABr6gAAAAEBAcAAa7kAAACDemDAAPanAABcAT4BPRzAAGvGgMAAa8PAGw9VghEBAAEkwABr5QMntEYWwABr3C6TDcAAQe0ngtoAwAD2uwbAAEH2gK3AAGvvwABsCcAAbOwAAJ2qARrAAGvwwADuSwAAAQPAAGwRwABs7AAAAAEBAcAAbCgAAAB+YMAAfbYAAGDAAFa9AT4BSsAAbDsBHMAAbE6AwABsQsAbD820RwIAAhbAAGxcLpMNwABB7TTAAGxlA8AAbGXAAGznAAAAAAAAAGDAAFa9AT4CTsAAbIPAAGyMAACEH2DAAEDsARzAAGyagMAAbI7AGw/NtEgBAAEWwABsqy6TDcAAQe0AwAB9wErAAGy7ARzAAGzLgcAAbMLAGxAnnaoBAAGAwABs1MAbD80AwABA+QDAAH3IBsAAQfSArcAAbPHAAG0BwABtLAAAle7AAEDEARrAAGzywADuSwAAAQPAAG0RwABtLAAAAAAAAABgwAD0eQFKwABtFwEcwABtGjcNgz4BAAEWwABtJBbAAG0cLpMNwABB7YOJwAD12ADAAPWgBsAAQfWArcAAbTHAAG1CwABtkgAAs/zAAEDEARrAAG0ywADuSwAAAQPAAG1JwABtkgAAAAEBAcAAbWIAAAiDm2DAAEHrAABgwADyswE+AUrAAG1vARzAAG1+FsAAbXYukw3AAEHtQQEAARbAAG2HgMAAbYHAGxEskw3AAEHtAMAA9dIAABsOVwAbDqAAGw8eABsPmgAbEIkAGxD1ABsReAAAAAYCwABB+YCtwABtw8AAbcnAAHELA7RJAAABYMAAQOwAAAEEwABB+4CtwABuFMAAbhsJkw0AYLD4AAEFwABCBoCtwABuIMAAbiDAAG5NAAAAA8AAbj/AAG5NAAAAAQEBwABuRQAABJMNYLD4AABgwABB+QE/AggBwABB+4AAwBsR9wkBwABuIMAAQQQAAAAABgbAAEH9gK3AAG5SwABuecAAbqYBAIIcARrAAG5TwADuSwAAAQPAAG5+wABupgAAAAAAAABgwABAxQFKwABugQEawABumMAAQOMGwABB/4CtwABuq8AAbrfAAG8mAACUDgEawABurMAA7ksAAAEDwABuvcAAbyYAAAACAQLAAG7YAAAAloldwABC7QJbWwDAAG7iAAAAgedbASsAWwE+AUrAAG7yARzAAG8BgMAAbvnAGxKktEoCAAIugcAAbxrAGxK2AMAAQv0GwABCAYCtwABvK8AAbzzAAG+YAACz+8AAQMQBGsAAbyzAAO5LAAABA8AAb1HAAG+YAAAAAQEBwABvXwAAAIN6YMAA9qcAAFwBPgE9HMAAb2yAwABvacAbEyaCEQEAASTAAG+TAye0SxbAAG+KLpMNwABB+yeC2gDAAPa7BsAAQgSArcAAb53AAG+3wABwWwAAnaoBGsAAb57AAO5LAAABA8AAb7/AAHBbAAAAAQEBwABv1gAAAH5gwAB9tgAAYMAAVr0BPgJOwABv/MAAcAUAAIQfYMAAQOwBHMAAcBOAwABwB8AbE560TAEAARbAAHAkLpMNwABB+wDAAH2/SsAAcDIBHMAAcEKBwABwOcAbE7adqgEAAYDAAHBLwBsTngDAAED5BsAAQgKArcAAcGDAAHBwwABwmwAAle7AAEDEARrAAHBhwADuSwAAAQPAAHCAwABwmwAAAAAAAABgwAD0eQFKwABwhgEcwABwiTcNgz4BAAEWwABwkxbAAHCLLpMNwABB+4OJwAD12ADAAPWgBsAAQgOArcAAcKDAAHCxwABxCQAAs/zAAEDEARrAAHChwADuSwAAAQPAAHC4wABxCQAAAAEBAcAAcNkAAAiDm2DAAEH5AABgwADyswE+AUrAAHDmARzAAHD1FsAAcO0ukw3AAEH7QQEAARbAAHD+gMAAcPjAGxS2kw3AAEH7AMAA9dIAABsSKAAbEnEAGxLvABsTawAbFBMAGxR/ABsVAgAAAAYCwABCB4CtwABxP8AAcUXAAHTHA7RNAAABYMAAQOwAAAIEwABCCYCtwABxlMAAcZsJkw0AYLDUAATAAEIKgK3AAHGywABxtgmCFwBgwABYyQABBcAAQhaArcAAcbvAAHG7wABx7gAAAAPAAHHVwABx7gAAAAICAsAAcdsAAASTDWCw1ADAAHHpAAAEghdgwABYyQAAYMAAQgcBPwMIAcAAQgmAAMAbFZoIAcAAQgqBAMAbFacJAcAAcbvAAEEEAAAAAAcGwABCDICtwABx88AAchrAAHJBAQCCHAEawABx9MAA7ksAAAEDwAByH8AAckEAAAAAAAAAYMAAQMUBSsAAciIBGsAAcjnAAEDUBsAAQg6ArcAAckbAAHJSwAByvAAAlA4BGsAAckfAAO5LAAABA8AAcljAAHK8AAAAAgECwABycwAAAJaJXcAAQu0CW1sAwAByfQAAAIHnWwErAFsBPgFKwAByjQEcwABynIDAAHKUwBsWYquaAgACLoHAAHKwwBsWdADAAEL/BsAAQhCArcAAcsHAAHLSwABzKQAAs/vAAEDEARrAAHLCwADuSwAAAQPAAHLnwABzKQAAAAEBAcAAcvUAAACDemDAAPanAABcAT4BPRzAAHMCgMAAcv/AGxbkghEBAAEkwABzJAMntE4WwABzGy6TDcAAQgkngtoAwAD2uwbAAEITgK3AAHMuwABzSMAAc60AAJ2qARrAAHMvwADuSwAAAQPAAHNQwABzrQAAAAEBAcAAc2cAAAB+YMAAfbYAAGDAAFa9AT4BSsAAc3oBH8AAc4XAAFbyAgACFsAAc5sukw3AAEIJFsAAc6QughfAAEIKAAbAAEIRgK3AAHOywABzwsAAc+0AAJXuwABAxAEawABzs8AA7ksAAAEDwABz0sAAc+0AAAAAAAAAYMAA9HkBSsAAc9gBHMAAc9s3DYM+AQABFsAAc+UWwABz3S6TDcAAQgmDicAA9dgAwAD1oAbAAEISgK3AAHPywAB0A8AAdFYAALP8wABAxAEawABz88AA7ksAAAEDwAB0CsAAdFYAAAABAQHAAHQmAAAIg5tgwABCBwAAYMAA8rMBPgFKwAB0MwEcwAB0QhbAAHQ6LpMNwABCCUEBAAEWwAB0S4DAAHRFwBsYQZMNwABCCQDAAPXSBsAAQhSArcAAdFvAAHR1wAB0xQAAs/oBGsAAdFzAAO5LAAABA8AAdIHAAHTFAAAAAQEBwAB0kQAAAKq1YKyTAABgwABYXQFKwAB0qgEWwAB0uYDAAHSqwBsYwJTdrLsAABsV5gAbFi8AGxatABsXKQAbF54AGxgKABsYjQAbGOwAAAAHAsAAQheArcAAdPnAAHT/wACnMwO0TwAAAWDAAEDsAAAEBMAAQhmArcAAdVDAAHVUCZVLAGDAAEDsAATAAEIagK3AAHVtwAB1dQmSmgBgwAB7YQAEwABCG4CtwAB1ksAAdZcJlUwAYMAAQOwABMAAQhyArcAApGrAAKcxBrRQAF3AAPVOAmDAAHtCYMAA9HkBO8AApHtgwAB7QmDAAPR5FRrAAKSawAB7SDcGGsAApLjAAHtJNwYawACk2sAAe1o3BRrAAKUBwAB7W5cawAClJ8AAe1k3CRrAAKVGwAB7VzcKGsAApWbAAHtYNwgawAClhMAAe1I3CxrAAKWkwAB7UTcLGsAApcTAAHtLNwwawACl5MAAe0w3DBrAAKYEwAB7TTcNGsAApiTAAHtONw0awACmRMAAe083DRrAAKZlwAB7VDcHGsAApoPAAHtWNwcawACmocAAe1M3BxrAAKbBwAB7VTcHGsAApuHAAHtQNw0awACnAcAAe1yWGsAApyTAAHtKlgEFwABCLICtwAB1nMAAdZzAAHZTAAAAA8AAdbTAAHZTAAAAAwMDwAB1ugAABJVLYMAAQOwAwAB1xQAABJKaYMAAe2EAwAB11AAABJVMYMAAQOwAAGDAAEIXAT4BQCEcwAB2BhzAAHX2GsAAdejAAEIcRAEAARbAAHYAFsAAdfcukprAAEIaghzAAHtjAMAA9WJBAQABKwDAAPWcwAB16MAAdg0BJMAAdk4DJ7RRFsAAdkMukprAAEIaJ4DyBAgBwABCGYAAwBsauwgBwABCGoEAwBsayggBwABCG4IAwBsa2QkBwAB1nMAAQQQAAAAACwbAAEIegK3AAHZYwAB2ZMAAdr0AAbRSAAAAAQPAAHZ1wAB2vQAAAAEBAcAAdoUAAACSmmDAAHthAABgwADyswFKwAB2mAEhHMAAdrYcwAB2phrAAHaYwABCHEQBAAEWwAB2sIDAAHanwBsbr4IcwAB7YwDAAPViQQEAASsAwAD1nAbAAEIogK3AAHbCwAB26cAAdw4BAIIcARrAAHbDwADuSwAAAQPAAHbuwAB3DgAAAAAAAABgwABAxQFKwAB28QEawAB3CMAAQMwGwABCH4CtwAB3E8AAdx/AAHeHAACUDgEawAB3FMAA7ksAAAEDwAB3JcAAd4cAAAACAQLAAHdAAAAAloldwABC7QJbWwDAAHdKAAAAgedbASsAWwE+AUrAAHdaARzAAHdpgMAAd2HAGxyCtFMCAAIugcAAd3vAGxyUAMAAQwAGwABCIYCtwAB3jMAAd53AAHhoAACz+8AAQMQBGsAAd43AAO5LAAABA8AAd7LAAHhoAAAAAQEBwAB3wAAAAIN6YMAA9qcAAFwBPgU9HMAAd82AwAB3ysAbHQSCEQEAASe0VADAAPa7PRzAAHftFsAAd+gulUvAAEIZs/vAAEDEAQABgMAAeAPAGx0EAMAAQP49HMAAeA+AwAB4DMAbHQSCEQEAASTAAHgrAye0VRbAAHgbLpKawABCGie0VgDAAPa7PRzAAHg4FsAAeDIulUzAAEIbs/vAAEDEAQABgMAAeE7AGx0EAMAAQP49HMAAeFqAwAB4V8AbHQSCEQEAASeC2gDAAPa7BsAAQiSArcAAeG3AAHiHwACZhwAAnaoBGsAAeG7AAO5LAAABA8AAeI/AAJmHAAAAAQEBwAB4pgAAAH5gwAB9tgAAYMAAVr0BPglOwAB4x8AAeNEAALRXYMAAVr0BHMAAeNgWwAB40y6VS8AAQhmdqgEAAYDAAHjhwBseBgDAAED5ScAAePMhFsAAeQKBwAB4+MAbHh6wacAAVr9KwAB5DgEfwAB5GcAAWDAAAAAAP07AAHk/AAAAtFhgwABWvQBBR8AAeXkWwAB5ihbAAHmBLpKawABCGoIcwAB7YwMBwAB5sBrAAHmwwAB7WgA+AknAAHnFIhbAAHnTgcAAecnAGx4esdHAAFbBABbAAHnngcAAed3AGx4esdXAAFbDPgE9isAAefzAGx6DHsAAeg3AAFdnAAAAAD4BPYrAAHo+wBsegxzAAHpRFsAAeksulUzAAEIbnaoBAAGAwAB6WsAbHgYAwABA+ULAAHp6AAHAAHqgGsAAeqDAAHtbAD4CScAAerQiFsAAesKBwAB6uMAbHh6x0cAAVsEAFsAAetaBwAB6zMAbHh6x1sAAVsI+AT2KwAB66sAbHoMewAB6+8AAV1kAAAAAPgE9isAAeyvAGx6DHMAAez4WwAB7OC6VTMAAQhudqgEAAYDAAHtHwBseBgDAAED5QsAAe2cAAAE+AT2KwAB7hcAbHoMcwAB7mBbAAHuSLpVMwABCG52qAQABgMAAe6HAGx4GAMAAQPlJwAB7uiEWwAB7yoLAAHu/wBseg7BpwABWv0rAAHvWAR/AAHvhwABYMAAAAAA/TsAAe/7AAHwGAACusGDAAPKzASlBR8AAfBIWwAB8IxbAAHwaLpKawABCGoIcwAB7YwgCwAB8SRrAAHxJwAB7SMAAfGsawAB8a8AAe0kAPgNJwAB8eyEWwAB8ioHAAHyAwBseHqsJwABWzT4BScAAfKMhFsAAfLOCwAB8qMAbHoOs08AAVsA+Aj0cwAB81YDAAHzJwBseBqBRAwADFsAAfPIulUvAAEIZGsAAfQSflzLAAH0sW1sDJ4QfFsAAfUgulUvAAEIZJ4IXHMAAfW6BwAB9ZMAbHh6WFwEAARbAAH2CgMAAfXbAGx4GqrXAAH24AMAAVtonkpoWwAB9rS6SmsAAQhoAwAB9xT2LwAB90sAbIC8qPz9JwAB+ASEWwAB+EYLAAH4GwBseg6sJwABWzT4BScAAfiohFsAAfjmBwAB+L8AbHh6s08AAVsA+Aj0cwAB+W4DAAH5PwBseBqBRAwADFsAAfngulUzAAEIbGsAAfouflzLAAH6zW1sDJ4QfFsAAfs8ulUzAAEIbJ4IXHMAAfveCwAB+7MAbHoOWFwEAARbAAH8LgMAAfv/AGx4GqrXAAH24AMAAVtonkpoWwAB/Ni6SmsAAQhoAwAB9xT2LwAB/W8AbIC8qPz9CwAB/igABwAB/rxrAAH+vwAB7SwA+AknAAH+8FsAAf8qBwAB/wMAbHh6s68AAVsc+AUnAAH/gIRbAAH/wgsAAf+XAGx6DrOvAAFbHPgI9HMAAgBSAwACACMAbHgagUQMAAxbAAIAxLpVMwABCGxrAAIBEn6AywACAZltbAieEHxbAAICCLpVMwABCGyeCFxzAAICqgsAAgJ/AGx6DlhcBAAEWwACAvoDAAICywBseBqq1wAB9uADAAFbaAMAAfcU9i8AAgOrAGyAvKj9JwACBFhbAAIEkgcAAgRrAGx4esdLAAFbGPgFJwACBNyEWwACBR4LAAIE8wBseg7HSwABWxj4CPRzAAIFogMAAgVzAGx4GoFEDAAMWwACBhS6VTMAAQhsawACBmJ+hMsAAgbdbWwInhB8WwACB0y6VTMAAQhsnghccwACB+4LAAIHwwBseg5YXAQABFsAAgg+AwACCA8AbHgaqtcAAfbgAwABW2gDAAH3FPYvAAII7wBsgLyo/ScAAgmcWwACCdoLAAIJrwBseg6zrwABWxz4BScAAgowhFsAAgpuBwACCkcAbHh6s68AAVsc+Aj0cwACCv4DAAIKzwBseBqBRAwADFsAAgtwulUvAAEIZGsAAgu6foDLAAIMQW1sCJ4QfFsAAgywulUvAAEIZJ4IXHMAAg1KBwACDSMAbHh6WFwEAARbAAINmgMAAg1rAGx4GqrXAAH24AMAAVtoAwAB9xT2LwACDksAbIC8qP0nAAIO+FsAAg82CwACDwsAbHoOx0sAAVsY+AUnAAIPgIRbAAIPvgcAAg+XAGx4esdLAAFbGPgI9HMAAhBCAwACEBMAbHgagUQMAAxbAAIQtLpVLwABCGRrAAIQ/n6EywACEXltbAieEHxbAAIR6LpVLwABCGSeCFxzAAISggcAAhJbAGx4elhcBAAEWwACEtIDAAISowBseBqq1wAB9uADAAFbaAMAAfcU9i8AAhODAGyAvKj8+Aj0cwACFM4DAAIUYwBseBqBRAwADLhrAAIVRn5QywACFbVtbBCe0WRbAAIWLLpVLwABCGSe0WhzAAIWzgcAAhanAGx4elhcBAAEWwACFx4DAAIW7wBseBqq1wAB9uADAAFbaJ7RbFsAAhfUulUzAAEIbJ7RcHMAAhiCCwACGFcAbHoOWFwEAARbAAIY0gMAAhijAGx4GqrXAAH24AMAAVtoAwAB9xT2LwACGXMAbIC8qQsAAhn8ACcAAhqQawACGpMAAe0zAAIbHGsAAhsfAAHtNwACG6hrAAIbqwAB7TsAAhw0awACHDcAAe0/AAIcxGsAAhzHAAHtQwACHVBrAAIdUwAB7U8AAh3gawACHeMAAe1TAAIeaGsAAh5rAAHtVwACHvhrAAIe+wAB7VgA+BEnAAIfKIRbAAIfZgcAAh8/AGx4esdLAAFbGPgI9HMAAiAeAwACH7MAbHgagUQMAAxbAAIgTLpVLwABCGRrAAIgln5YywACIR1tbAyeEHxbAAIhhLpVLwABCGSeCFxzAAIiFgcAAiHvAGx4elhcBAAEWwACImYDAAIiNwBseBqq1wAB9uADAAFbaJ5KaFsAAiMIukprAAEIaAMAAfcU9i8AAiOPAGyAvKj9JwACJBiEWwACJFoLAAIkLwBseg7HSwABWxj4CPRzAAIk1gMAAiSnAGx4GoFEDAAMWwACJUC6VTMAAQhsawACJY5+WMsAAiYVbWwMnhB8WwACJny6VTMAAQhsnghccwACJxYLAAIm6wBseg5YXAQABFsAAidmAwACJzcAbHgaqtcAAfbgAwABW2ieSmhbAAIoCLpKawABCGgDAAH3FPYvAAIojwBsgLyo/ScAAikYig8AAikrAGyAvACIcwACKcBbAAIprFsAAimIukprAAEIaghzAAHtjQQEAARrAAIqGwAB7TwDAAPXSARzAAIqsFsAAiqcWwACKni6SmsAAQhqCHMAAe2NBAQABGsAAisLAAHtQAMAA9dI+AUnAAIrUFsAAiuOCwACK2MAbHoOkvcAAVtQ+Aj0cwACLBYDAAIr5wBseBqBRAwADFsAAixEulUzAAEIbGsAAiySfmzLAAItKW1sDJ5VLFsAAi1MulUvAAEIZJ5VMFsAAi2IulUzAAEIbJ5KaFsAAi3UukprAAEIaAMAAfcU9i8AAi43AGyAvKj8/QsAAi7wABcAAi+EawACL4cAAe1HAAIwEGsAAjATAAHtSwACMJxrAAIwnwAB7V8AAjEoawACMSsAAe1jAAIxsGsAAjGzAAHtZAD4EScAAjHkhFsAAjIiBwACMfsAbHh6x08AAVsQ+Aj0cwACMtoDAAIybwBseBqBRAwADFsAAjMIulUvAAEIZGsAAjNSflTLAAIz2W1sDJ4QfFsAAjRAulUvAAEIZJ4IXHMAAjTSBwACNKsAbHh6WFwEAARbAAI1IgMAAjTzAGx4GqrXAAH24AMAAVtonkpoWwACNcS6SmsAAQhoAwAB9xT2LwACNksAbIC8qP0nAAI21IRbAAI3FgsAAjbrAGx6DsdPAAFbEPgI9HMAAjeSAwACN2MAbHgagUQMAAxbAAI3/LpVMwABCGxrAAI4Sn5UywACONFtbAyeEHxbAAI5OLpVMwABCGyeCFxzAAI50gsAAjmnAGx6DlhcBAAEWwACOiIDAAI58wBseBqq1wAB9uADAAFbaJ5KaFsAAjrEukprAAEIaAMAAfcU9i8AAjtLAGyAvKj9JwACO9SKDwACO+cAbIC8AIhzAAI8fFsAAjxoWwACPES6SmsAAQhqCHMAAe2NBAQABGsAAjzXAAHtRAMAA9dIBHMAAj1oWwACPVRbAAI9MLpKawABCGoIcwAB7Y0EBAAEawACPcMAAe1IAwAD10j4CTsAAj5PAAI+ZAAC0XWDAAFcWASbAAI+TAYLAAI+bwBseg2DAAFcWScAAj7EcwACPxBbAAI+7hMAAj7XAGyp/pNHAAFcYXAEAARrAAI/NwADyhwDAAPKiPgI9HMAAj+2AwACP4cAbHgagUQMAAxbAAI/5LpVMwABCGxrAAJAMn6MywACQNFtbAyeVSxbAAJA9LpVLwABCGSeVTBbAAJBMLpVMwABCGyeSmhbAAJBfLpKawABCGgDAAH3FPYvAAJB3wBsgLyo/P0LAAJCmAAHAAJDLGsAAkMvAAHtaAD4DScAAkOAhFsAAkO+BwACQ5cAbHh6x0cAAVsE+Aj0cwACRHoDAAJEDwBseBqBRAwADFsAAkSoulUvAAEIZGsAAkTyfpjLAAJFeW1sDJ4QfFsAAkXgulUvAAEIZJ4IXHMAAkZyBwACRksAbHh6WFwEAARbAAJGwgMAAkaTAGx4GqrXAAH24AMAAVtonkpoWwACR2S6SmsAAQhoAwAB9xT2LwACR+sAbIC8qP0nAAJIdIRbAAJItgsAAkiLAGx6DsdHAAFbBPgI9HMAAkk2AwACSQcAbHgagUQMAAxbAAJJoLpVMwABCGxrAAJJ7n6YywACSnVtbAyeEHxbAAJK3LpVMwABCGyeCFxzAAJLdgsAAktLAGx6DlhcBAAEWwACS8YDAAJLlwBseBqq1wAB9uADAAFbaJ5KaFsAAkxoukprAAEIaAMAAfcU9i8AAkzvAGyAvKj9CwACTXgABwACTgxrAAJODwAB7WwA+A0nAAJOXIRbAAJOmgcAAk5zAGx4esdHAAFbBPgI9HMAAk9WAwACTusAbHgagUQMAAxbAAJPhLpVLwABCGRrAAJPzn6cywACUFFtbAyeEHxbAAJQuLpVLwABCGSeCFxzAAJRSgcAAlEjAGx4elhcBAAEWwACUZoDAAJRawBseBqq1wAB9uADAAFbaJ5KaFsAAlI8ukprAAEIaAMAAfcU9i8AAlLDAGyAvKj9JwACU0yEWwACU44LAAJTYwBseg7HRwABWwT4CPRzAAJUSgMAAlPfAGx4GoFEDAAMWwACVHi6VTMAAQhsawACVMZ+nMsAAlVJbWwMnhB8WwACVbC6VTMAAQhsnghccwACVkoLAAJWHwBseg5YXAQABFsAAlaaAwACVmsAbHgaqtcAAfbgAwABW2ieSmhbAAJXPLpKawABCGgDAAH3FPYvAAJXwwBsgLyo/QsAAlhMAAcAAljgawACWOMAAe0oAPgM9HMAAllOAwACWR8AbHgagUQMAAy4awACWcZ+cMsAAlolbWwAAwAB9xT2LwACWlsAbIC8qQsAAlq8AAcAAltQawACW1MAAe1wAPgFCwACXKABJwACXOYPAAJc9wBsgLz4BR8AAl04WwACXXxbAAJdWLpKawABCGoIcwAB7YwIBwACXhxrAAJeHwAB7SQA+Ak7AAJerwACXsgAAkndgwABXSAEmwACXqwEcwACX2BrAAJfSwABVO4MSAgACgcAAl93AGx4egsAAl+jAGx6DAMAAVkhgwABXSErAAJf/ARzAAJgNhMAAmAbAGy6+tF4AAAAAwABXUQABPgNOwACYQMAAmEYAAICKYMAAVr0BHMAAmI0ewACYSMAAVWUBAAEWwACYdC6SmsAAQhoAgxICAAKBwACYksAbHh6CwACYncAbHoMAwABVcknAAJi0IRzAAJi+hMAAmLjAGy8oQQEAASsAwAD10j4BSsAAmNUBhMAAmNzAGy8oPz0cwACZFIDAAJj5wBseBqBRAwADLhrAAJkyn70ywACZT1tbAADAAH3FP0rAAJlmAR/AAJlxwABYMAAAAAAGwABCJYCtwACZjMAAmavAAJo/AACp9QEawACZjcAA7ksAAAEDwACZsMAAmj8AAAABAQHAAJnFAAAAVGDAAH3gAABgwABA7AE+AUrAAJnWAR/AAJnhwABCLAMAAxzAAJoIFsAAmgMulUvAAEIZqfUBAAGAwACaDsAbMBQAwABA+BbAAJoaLpKawABCGhzAAJoqFsAAmiQulUzAAEIbqfUBAAGAwACaMMAbMBQAwABA+AAGwABCJoCtwACaRMAAmnrAAKJ6AACz+gEawACaRcAA7ksAAAEDwACahsAAonoAAAABAQHAAJqWAAAAqrVgrJMAAGDAAFhdAT4DTsAAmrXAAJrDAAC0X2DAAFg2ARzAAJrKFsAAmsUulUvAAEIZs/oBAAGAwACa18AbMMUAwABA+k7AAJr1wACbBAAAtGBgwABYNgEcwACbDBbAAJsGLpVMwABCG7P6AQABgMAAmxnAGzDFAMAAQPpHwACbLhbAAJs/FsAAmzYukprAAEIaghzAAHtjBwjAAJtlGsAAm2XAAHtIwACbhxrAAJuHwAB7ScAAm60awACbrcAAe1rAAJvYGsAAm9jAAHtbwACcAhrAAJwCwAB7VMAAnCQawACcJMAAe1bAAJxGGsAAnEbAAHtTwACcahrAAJxqwAB7VQA+AUrAAJx4ARbAAJyOgMAAnH/AGzDFlTustQHAAJy2GsAAnLbAAHtLAD4DScAAnMMcwACc1YHAAJzHwBsw3EEBAAEWwACc54DAAJzYwBswxZVVrLkAwAD10j4CQBzAAJ0VgsAAnQbAGzETQQEAARbAAJ0ngMAAnRjAGzDFlVWsuQDAAPXSwACdBsAAnTEASsAAnT4BFsAAnVSAwACdRcAbMMWVVay5ScAAnW8iHMAAnYGBwACdc8AbMNxBAQABFsAAnZOAwACdhMAbMMWVHay3AMAA9dIAHMAAnbmCwACdqsAbMRNBAQABFsAAncuAwACdvMAbMMWVHay3AMAA9dI+AUrAAJ3gARbAAJ32gMAAnefAGzDFlR2stz9AIhzAAJ4mgcAAnhjAGzDcQQEAARbAAJ44gMAAninAGzDFlXisuADAAPXSARzAAJ5hgsAAnlLAGzETQQEAARbAAJ5zgMAAnmTAGzDFlXisuADAAPXSwACeGMAAnn0ASsAAnogBFsAAnp6AwACej8AbMMWVeKy4A8AAnsgawACeyMAAe0zAAJ7rGsAAnuvAAHtNwACfDhrAAJ8OwAB7UAA+A0nAAJ8bIhzAAJ8tgcAAnx/AGzDcQQEAARbAAJ8/gMAAnzDAGzDFlR2stwDAAPXSABzAAJ9lgsAAn1bAGzETQQEAARbAAJ93gMAAn2jAGzDFlR2stwDAAPXSPgFKwACfjAEWwACfooDAAJ+TwBswxZUdrLc/QCIcwACf0oHAAJ/EwBsw3EEBAAEWwACf5IDAAJ/VwBswxZV4rLgAwAD10gEcwACgDYLAAJ/+wBsxE0EBAAEWwACgH4DAAKAQwBswxZV4rLgAwAD10sAAn8TAAKApAErAAKA0ARbAAKBKgMAAoDvAGzDFlXisuAHAAKB0GsAAoHTAAHtOAD4BSsAAoIEBFsAAoJeAwACgiMAbMMWVeKy4AcAAoMEawACgwcAAe08APgFKwACgzwEWwACg5YDAAKDWwBswxZUdrLcFwAChDBrAAKEMwAB7V8AAoS8awAChL8AAe1jAAKFRGsAAoVHAAHtZwAChdBrAAKF0wAB7UsAAoZcawAChl8AAe1EAPgFKwAChpAEWwAChuoDAAKGrwBswxZUdrLcCwACh4RrAAKHhwAB7XMAAoggawACiCMAAe0oAPgE9MMAAohcfwACiIcAA9AsBAAEkwACibwIntGEWwACiZi6SmsAAQhoABsAAQimArcAAon/AAKKTwACivgEAmVwBGsAAooDAAO5LAAABA8AAop7AAKK+AAAAAAAAAGDAAPR5AUrAAKKhARzAAKKvGsAAoqHAAEIcRAEAARbAAKK5FsAAorAukprAAEIaghzAAHtjAMAA9WIGwABCIoCtwACiw8AAotPAAKM4AACV7sAAQMQBGsAAosTAAO5LAAABA8AAouPAAKM4AAAAAAAAAGDAAPR5AT4BSsAAouwBHMAAox8cwACjChzAAKL2Nw2DPgEAARbAAKMBFsAAovgukprAAEIag4nAAPXYAMAA9aBdAQABHMAAow83EYM+AQABFsAAoxYWwACjES6VS8AAQhmDicAAQPMAwAD1oADAAPWeXQEAARzAAKMkNxODPgEAARbAAKMsFsAAoyYulUzAAEIbg4nAAEDzAMAA9aAAwAD1ngbAAEIjgK3AAKM9wACjTsAAo98AALP8wABAxAEawACjPsAA7ksAAAEDwACjVcAAo98AAAABAQHAAKNvAAAIg5tgwABCFwAAYMAA8rMBPgFKwACjfAEiIhzAAKOMFsAAo4MukprAAEIaQQEAARbAAKOVgMAAo4/AGzbpkprAAEIaAMAA9dIAHMAAo64WwACjqS6VS8AAQhlBAQABFsAAo7eAwACjscAbNumVS8AAQhkAwABBAQAcwACjzRbAAKPHLpVMwABCG0EBAAEWwACj1oDAAKPQwBs26ZVMwABCGwDAAEEBBsAAQiqArcAAo+TAAKP5wACkOwEAtAEBGsAAo+XAAO5LAAABA8AApAXAAKQ7AAAAAAAAAGDAAPKzAT4BSsAApAsBIhbAAKQXFsAApBIulUvAAEIZtAHAAED1ARbAAKQsFsAApCYulUzAAEIbtAHAAED1AAAbG4UAGxwGABscTwAbHM0AGx3TABsv4QAbMJIAGzVqABs12AAbNrIAGzeVABs4BwAAAAsCwABCLYCtwACncsAAp3jAAK26A7RiAAABYMAAQOwAAAIEwABCL4CtwACnzMAAp9AJlUsAYMAAQOwABMAAQjCArcAAp+3AAKfyCZVMAGDAAEDsAAEFwABCP4CtwACn98AAp/fAAKgpAAAAA8AAqBLAAKgpAAAAAgICwACoGAAABJVLYMAAQOwAwACoIwAABJVMYMAAQOwAAGDAAEItAT8DCAHAAEIvgADAGzi1CAHAAEIwgQDAGzjECQHAAKf3wABBBAAAAAAKBsAAQjKArcAAqC7AAKhVwACofQEAghwBGsAAqC/AAO5LAAABA8AAqFrAAKh9AAAAAAAAAGDAAEDFAUrAAKhdARrAAKh0wABA1gbAAEI2gK3AAKiCwACojsAAqPkAAJQOARrAAKiDwADuSwAAAQPAAKiUwACo+QAAAAIBAsAAqK8AAACWiV3AAELtAltbAMAAqLkAAACB51sBKwBbAT4BSsAAqMkBHMAAqNiAwACo0MAbOX+0YwIAAi6BwACo7cAbOZEAwABDAQbAAEI4gK3AAKj+wACpD8AAqdAAALP7wABAxAEawACo/8AA7ksAAAEDwACpJMAAqdAAAAABAQHAAKkyAAAAg3pgwAD2pwAAXAE+BT0cwACpP4DAAKk8wBs6AYIRAQABJ7RkAMAA9rs9HMAAqWIWwACpXS6VS8AAQi+z+8AAQMQBAAGAwACpeMAbOgEAwABA/j0cwACphIDAAKmBwBs6AYIRAQABJ7RWAMAA9rs9HMAAqaAWwACpmi6VTMAAQjCz+8AAQMQBAAGAwACptsAbOgEAwABA/j0cwACpwoDAAKm/wBs6AYIRAQABJ4LaAMAA9rsGwABCO4CtwACp1cAAqe/AAKs6AACdqgEawACp1sAA7ksAAAEDwACp98AAqzoAAAABAQHAAKoOAAAAfmDAAH22AABgwABWvQE+BE7AAKovwACqOQAAtFdgwABWvQEcwACqQBbAAKo7LpVLwABCL52qAQABgMAAqknAGzruAMAAQPlOwACqacAAqnQAALRYYMAAVr0BHMAAqnwWwACqdi6VTMAAQjCdqgEAAYDAAKqFwBs67gDAAED5ScAAqpciFsAAqqWBwACqm8AbOwawacAAVr8AFsAAqr6CwACqs8AbOz2wacAAVr8+AUrAAKrSARzAAKryGsAAqunAAFU+gxICAAKBwACq98AbOwaCwACrAsAbOz0AwABWUD9KwACrGQEfwACrJMAAWDAAAAAABsAAQjyArcAAqz/AAKtewACr6wAAqfUBGsAAq0DAAO5LAAABA8AAq2PAAKvrAAAAAQEBwACreAAAAFRgwAB94AAAYMAAQOwBPgFKwACriQEfwACrlMAAQj8CAAIcwACrvhbAAKu5LpVLwABCL6n1AQABgMAAq8TAGzwbAMAAQPgcwACr1hbAAKvQLpVMwABCMKn1AQABgMAAq9zAGzwbAMAAQPgABsAAQjOArcAAq/DAAKwEwACsFAEAmVwBGsAAq/HAAO5LAAABA8AArA/AAKwUAAAAAAAAAGDAAPR5AUrAAKwSATcPBsAAQjmArcAArBnAAKwpwACsdQAAle7AAEDEARrAAKwawADuSwAAAQPAAKw5wACsdQAAAAAAAABgwAD0eQE+AUrAAKxCARzAAKxcHMAArEw3EYM+AQABFsAArFMWwACsTi6VS8AAQi+DicAAQPMAwAD1oF0BAAEcwACsYTcTgz4BAAEWwACsaRbAAKxjLpVMwABCMIOJwABA8wDAAPWgAMAA9Z4GwABCOoCtwACsesAArIvAAKzxAACz/MAAQMQBGsAArHvAAO5LAAABA8AArJLAAKzxAAAAAQEBwACsrwAACIObYMAAQi0AAGDAAPKzAT4BSsAArLwBIhzAAKzIFsAArMMulUvAAEIvQQEAARbAAKzRgMAArMvAGz2qlUvAAEIvAMAAQQEAHMAArN8WwACs2S6VTMAAQjBBAQABFsAArOiAwACs4sAbPaqVTMAAQjAAwABBAQbAAEI9gK3AAKz2wACtEMAArVwAALP6ARrAAKz3wADuSwAAAQPAAK0cwACtXAAAAAEBAcAArSwAAACqtWCskwAAYMAAWF0BSsAArUUBFsAArVSAwACtRcAbPlmVO6y1BsAAQjSArcAArWHAAK12wACtuAEAtAEBGsAArWLAAO5LAAABA8AArYLAAK24AAAAAAAAAGDAAPKzAT4BSsAArYgBIhbAAK2UFsAArY8ulUvAAEIvtAHAAED1ARbAAK2pFsAAraMulUzAAEIwtAHAAED1AAAbOQMAGzlMABs5ygAbOrsAGzvoABs8jQAbPM8AGz1zABs+JgAbPoUAGz73AAAACgLAAEJAgK3AAK3owACt7sAAudwDtGUAAAFgwABA7AAAAwTAAEJCgK3AAK45wACuQQmSmgBgwAB7MQAEwABCQ4CtwACuXsAArmgJkkcAYMAAQOwABMAAQkSArcAAuVfAALnaBrRQAF3AAPVOAmDAAHskYMAA9HkBO8AAuWhgwAB7JGDAAPR5AxrAALmGwAB7KjcOGsAAuaXAAHssNw4awAC5y8AAeys3DgEFwABCU4CtwACubcAArm3AAK7cAAAAA8AAroTAAK7cAAAAAgICwACuigAABJKaYMAAezEAwACumQAABJJHYMAAQOwAAGDAAEJAAT4BQCEcwACu0BzAAK7AGsAArrLAAEJERAEAARbAAK7KFsAArsEukprAAEJCghzAAHszAMAA9WJBAQABKwDAAPWcwACussAArtcAAwgBwABCQoAAwBs/9ggBwABCQ4EAwBtABQkBwACubcAAQQQAAAAACgbAAEJGgK3AAK7hwACvCMAArywBAIIcARrAAK7iwADuSwAAAQPAAK8NwACvLAAAAAAAAABgwABAxQFKwACvEAEawACvJ8AAQOIGwABCSoCtwACvMcAArz3AAK+kAACUDgEawACvMsAA7ksAAAEDwACvQ8AAr6QAAAACAQLAAK9eAAAAloldwABC7QJbWwDAAK9oAAAAgedbASsAWwE+AUrAAK94ARzAAK+HgMAAr3/AG0EJtGYCAAIugcAAr5jAG0EbAMAAQwIGwABCTICtwACvqcAAr7rAALBSAACz+8AAQMQBGsAAr6rAAO5LAAABA8AAr8/AALBSAAAAAQEBwACv3QAAAIN6YMAA9qcAAFwBPgM9HMAAr+qAwACv58AbQYuCEQEAASTAALAQAye0ZxbAAK/7LpKawABCQie0aADAAPa7PRzAALAiFsAAsBcukkfAAEJDs/vAAEDEAQABgMAAsDjAG0GLAMAAQP49HMAAsESAwACwQcAbQYuCEQEAASeC2gDAAPa7BsAAQk+ArcAAsFfAALBxwAC2igAAnaoBGsAAsFjAAO5LAAABA8AAsHnAALaKAAAAAQEBwACwkAAAAH5gwAB9tgAAYMAAVr0BPgVOwACwscAAsMEAALRAYMAAVr0BHMAAsM4WwACwwy6SR8AAQkOdqgEAAYDAALDXwBtCSADAAED5TsAAsO7AALD2AACusGDAAPKzASlBR8AAsQIWwACxExbAALEKLpKawABCQoIcwAB7MwMBwACxOBrAALE4wAB7KgA+AknAALFFIRbAALFagcAAsUrAG0JgsdHAAFbBPgI9HMAAsYmAwACxbsAbQkigUQMAAxbAALGVLpJHwABCQxrAALGtn58ywACxyFtbAyeEHxbAALHiLpJHwABCQyeCFxzAALISgcAAsgLAG0JglhcBAAEWwACyJoDAALIawBtCSKq1wAB9uADAAFbaJ5KaFsAAsk8ukprAAEJCAMAAfcU9isAAsnDAG0KXKj9CwACykwABwACytxrAALK3wAB7KwA+AknAALLHIRbAALLcgcAAsszAG0JgsdLAAFbGPgI9HMAAsvuAwACy78AbQkigUQMAAxbAALMWLpJHwABCQxrAALMun54ywACzTFtbAyeEHxbAALNmLpJHwABCQyeCFxzAALOWgcAAs4bAG0JglhcBAAEWwACzqoDAALOewBtCSKq1wAB9uADAAFbaJ5KaFsAAs9MukprAAEJCAMAAfcU9isAAs/TAG0KXKj9CwAC0FwABwAC0OxrAALQ7wAB7LAA+AknAALRPIRbAALRkgcAAtFTAG0JgsdPAAFbEPgI9HMAAtIOAwAC0d8AbQkigUQMAAxbAALSeLpJHwABCQxrAALS2n5gywAC02FtbAyeEHxbAALTyLpJHwABCQyeCFxzAALUigcAAtRLAG0JglhcBAAEWwAC1NoDAALUqwBtCSKq1wAB9uADAAFbaJ5KaFsAAtV8ukprAAEJCAMAAfcU9isAAtYDAG0KXKj9CwAC1owBJwAC1tILAALW4wBtClz4CTsAAtdfAALXdAACAimDAAFa9ARzAALYPHsAAtenAAFVkAQABFsAAtgUukprAAEJCAIMSAQABgcAAthTAG0JgAMAAVW1JwAC2LCEcwAC2NoPAALYwwBtFGUEBAAErAMAA9dI+AUrAALZJAYPAALZQwBtFGT8/SsAAtmkBH8AAtnTAAFgwAAAAAAbAAEJQgK3AALaPwAC2rsAAtyYAAKn1ARrAALaQwADuSwAAAQPAALazwAC3JgAAAAEBAcAAtsgAAABUYMAAfeAAAGDAAEDsAT4BSsAAttkBH8AAtuTAAEJTAgACFsAAtvwukprAAEJC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AcAA0IsAAABUYMAAfeAAAGDAAEDsAT4BSsAA0JwBHMAA0K2AwADQo8AbXqW0fwEAARbAANC+LoCwwABCjADAAH3mBsAAQpSArcAA0MzAANDcwADRBAAAle7AAEDEARrAANDNwADuSwAAAQPAANDswADRBAAAAAAAAABgwAD0eQFKwADQ8gEcwADQ9TcNgz4BAAEWwADQ/BbAAND3LoCwwABCjIOJwAD2YgDAAPWgBsAAQpWArcAA0QnAANEawADRVQAAs/zAAEDEARrAANEKwADuSwAAAQPAANEhwADRVQAAAAEBAcAA0TkAAAiDm2DAAEKKAABgwADyswFKwADRQwEcwADRSBbAANFDLoCwwABCjEEBAAEWwADRUYDAANFLwBtfiYCwwABCjADAAPZsBsAAQpeArcAA0VrAANF0wADRxwAAnaoBGsAA0VvAAO5LAAABA8AA0XzAANHHAAAAAQEBwADRkwAAAH5gwAB9tgAAYMAAVr0BPgFKwADRpgEfwADRscAAWDAAAAAABsAAQo+ArcAA0czAANHhwADR9AEAtAEBGsAA0c3AAO5LAAABA8AA0e3AANH0AAAAAAAAAGDAAPKzAUrAANHwASkAABtdLQAbXXgAG132ABtecgAbXuYAG19SABtf0wAbYDAAG2BxAAAACALAAEKagK3AANH5wADSCMAA1h0HtIAAAAFgwABA7AAAAgTAAEKcgK3AANJiwADSZgmAsABgwABA7AAEwABCnYCtwADSg8AA0o8Jgt8AYMAAQOwAAQXAAEKngK3AANKUwADSlMAA0tMAAAADwADStcAA0tMAAAACAgLAANK7AAAEgLBgwABA7ADAANLGAAAEgt9gwABA7AAAYMAAQpoBPwMIAcAAQpyAAMAbYRMIAcAAQp2BAMAbYSIJAcAA0pTAAEEEAAAAAAUGwABCoICtwADS2MAA0t3AANRjAAC0gcAAQMQAAAABA8AA0vbAANRjAAAAAwMDwADTDQAAAH5gwAB9tgDAANMzAAAAgLBgwABA7ADAANNHAAAApKtgwABWvQAAYMAA8rMBPgJJwADTWCEWwADTZ4LAANNdwBthrKzrwABWxz4CPRzAANOFgMAA03nAG2GPoFEDAAOBwADTnMAbYZ0awADTrp+kMsAA09JbWwInhB+BwADT6MAbYZ0nghccwADUCILAANP+wBthrJYXAQABFsAA1ByAwADUEMAbYY+qtcAAfbgAwABW2gDAAH3FSsAA1DwBKj9KwADUVAEpBsAAQqGArcAA1GjAANR4wADUywAAle7AAEDEARrAANRpwADuSwAAAQPAANSIwADUywAAAAAAAABgwAD0eQE+AUrAANSRARzAANSrHMAA1Js3DYM+AQABFsAA1KIWwADUnS6AsMAAQpyDicAAQPMAwAD1oF0BAAEcwADUsDcRgz4BAAEWwADUvxbAANSyLoLfwABCnYOJwABA8wDAAPWgAMAA9Z4GwABCooCtwADU0MAA1OHAANVbAACz/MAAQMQBGsAA1NHAAO5LAAABA8AA1OjAANVbAAAAAQEBwADVCwAACIObYMAAQpoAAGDAAPKzAT4BSsAA1RgBIhzAANUkFsAA1R8ugLDAAEKcQQEAARbAANUtgMAA1SfAG2M2gLDAAEKcAMAAQQEAHMAA1UIWwADVNS6C38AAQp1BAQABFsAA1UuAwADVRcAbYzaC38AAQp0AwABBAQbAAEKkgK3AANVgwADVdcAA1ZYBALQAARrAANVhwADuSwAAAQPAANWAwADVlgAAAAAAAABgwADyswE+AUrAANWGASoGwABCpYCtwADVm8AA1bDAANYbAQC0AQEawADVnMAA7ksAAAEDwADVvMAA1hsAAAAAAAAAYMAA8rMBPgFKwADVwgEiFsAA1c4WwADVyS6AsMAAQpy0AcAAQPUBIiEcwADV8xbAANXmLoLfwABCnUEBAAErAMAAQQEAFsAA1gsWwADV/i6C38AAQp20AcAAQPUAABthYQAbYlsAG2L/ABtjsgAbY/UAG2SFAAAABQLAAEKogK3AANZNwADWU8AA4D0DtIIAAAFgwABCmgAAAAEFwABCs4CtwADWq8AA1qvAANczAAAAA8AA1tDAANczAAAAAgICwADW6wAAAICwYMAAQOwAwADXBAAAAILfYMAAQOwAAGDAAEKoAT8BCQDAANcawABCpwIAAoDAANcgwBtk6YHAANcmwBtk+AAGBsAAQqqArcAA1zjAANdfwADXoQEAghwBGsAA1znAAO5LAAABA8AA12TAANehAAAAAAAAAGDAAEDFAT4BSsAA12oBGsAA14jAAEDOBsAAQqyArcAA16bAANeywADYJwAAlA4BGsAA16fAAO5LAAABA8AA17jAANgnAAAA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SwAAAQPAAQ/nwAEQIQAAAAIBAsABD/8AAAC0mWDAAEFNAMABEAUAACCAqFsBKwBcAT4BPRzAARASFsABEA8ug3rAAEMQghEBAAErAMAA9rsGwABDGoCtwAEQJsABEDfAARDFAAC0DgEawAEQJ8AA7ksAAAEDwAEQQsABEMUAAAACAQLAARBcAAAAtJlgwABBPgDAARBiAAAggKhbASsAXAE+AT0cwAEQpBbAARChLoN6wABDEIIRAQABJMABEMADJ4NkFsABELKAwAEQrsAbl2ecK8AAQUAng2QAwAD2uwbAAEMbgK3AARDKwAEQ28ABEiUAAJaIARrAARDLwADuSwAAAQPAARDkwAESJQAAAAIBAsABEPwAAAC0mWDAAEFaAMABEQIAACCAqFsBKwBcAT4GPRzAAREPFsABEQwug3rAAEMQghEBAAEntJ4AwAD2uz0cwAERJC60nAEAARbAARE7gMABETfAG5f2ghfAAEFcAMAAQxM9HMABEUkWwAERRi6DesAAQxCCEQEAASeZCQDAAPa7TsABEV7AARFpAACzHGDAAPKzASpGwAERdsABEaPAARGOAAAAgIpgwABA7AAWwAERm4DAARGXwBuX9inAAEFdPgNJwAERq4LAARGvwBuYej4BPRzAARHIFsABEcUug3rAAEMQghEBAAEng/IAwAD2uz89HMABEeMunxoBAAGDwAER6cAbmJYAwABDFD2KwAER98AbmHopPRzAARIXFsABEhQug3rAAEMQghEBAAEnmQoAwAD2uwbAAEMcgK3AARIqwAESO8ABEusAALQZARrAARIrwADuSwAAAQPAARJDwAES6wAAAAIBAsABEloAAAC0mWDAAEFtAMABEmAAACCAqFsBKwBcAT4FPRzAARJtFsABEmoug3rAAEMQghEBAAEntJ4AwAD2uz0cwAESgi60nAEAARbAARKZgMABEpXAG5lhghfAAEFvAMAAQxM9HMABEqcWwAESpC6DesAAQxCCEQEAASeZKQDAAPa7PRzAARK6FsABErcug3rAAEMQtJ8CAAIWwAESx4DAARLDwBuZYSnAAEFwJ4PyAMAA9r09HMABEt0WwAES2i6DesAAQxCCEQEAASeWPwDAAPa7BsAAQx2ArcABEvDAARMBwAEUWwAAtBwBGsABEvHAAO5LAAABA8ABEwnAARRbAAAAAgECwAETIAAAALSZYMAAQYAAwAETJgAAIICoWwErAFwBPgU9HMABEzMWwAETMC6DesAAQxCCEQEAASe0ngDAAPa7PRzAARNILrScAQABFsABE1+AwAETW8AbmmiCF8AAQYIAwABDEz0cwAETbRbAARNqLoN6wABDEIIRAQABJ5kpAMAA9rtFwAETfQHAAROGwAETjAAAJ2DAAPR5AZMBHMABE5eCwAETkcAbmvFcAQABFsABE6IWwAETnYDAAROZwBuaaIHcwABBg1rAAPVMAMAA9aYBisABE6rAG5rxHMABE6+CwAETqsAbmvFdAQABlADAAPWePgRJwAETuxzAARPFgsABE7/AG5rxgIsBAAGTAMAA9ag+AT0cwAET1xbAARPULoN6wABDEIIRAQABJ4PyAMAA9rs/PRzAARPyLp8aAQABHMABFAAWwAET/IDAARP4wBuaaIHcwABBg0QBAAGCwAEUAcAbmvEAwAD1LADAAEMUPRzAARQTFsABFBAug3rAAEMQghEBAAEngw4AwAD2uz0cwAEUJi6fGgEAARzAARQ2FsABFDCAwAEULMAbmmgpwABBhEQBAAGCwAEUN8AbmvEAwAD1LADAAEMUPRzAARRNFsABFEoug3rAAEMQghEBAAEnlj8AwAD2uwbAAEMegK3AARRgwAEUccABF9IAALQiARrAARRhwADuSwAAAQPAARSBwAEX0gAAAAIBAsABFKAAAAC0mWDAAEGUAMABFKYAACCAqFsBKwBcAT4KPRzAARSzFsABFLAug3rAAEMQghEBAAEntJ4AwAD2uz0cwAEUyxbAARTILoN6wABDEIIRAQABFsABFOsWwAEU3BbAARTVgMABFNHAG5yFgdPAAEGXkmmwzYCwsJsAwAD2uz0cwAEU9i60nAEAARbAARUNgMABFQnAG5yFghfAAEGWAMAAQxNJwAEVGCEcwAEVLBbAARUnFsABFSCAwAEVHMAbnIWB08AAQZeAsLCbQQEAAScAAMAA9mw+Aj0cwAEVPhbAARU7LoN6wABDEIIRAQABJ4ExAMAA9rs9HMABFVMWwAEVUC6DesAAQxCCEQEAARbAARVkFsABFV2AwAEVWcAbnIWB08AAQZeAsLCbAMAA9rs/PRzAARV4FsABFXUug3rAAEMQghEBAAEng5wAwAD2u07AARWNwAEVmAAAsxxgwADyswEqTsABFarAARW2AAC0oGDAAPR5ARbAARXKFsABFbyAwAEVuMAbnIWsJcAAQZiuyMAAVQlFwAEV5wHAARXwwAEV9gAAJ2DAAPR5AZMBHMABFgGEwAEV+8AbniRcAQABg8ABFgPAG53tAMAA9aYBjMABFhDAG54kHMABFhWEwAEWEMAbniRdAQABlADAAPWePgNJwAEWIYLAARYlwBud2T4BPRzAARY+FsABFjsug3rAAEMQghEBAAEng/IAwAD2uz89HMABFlkunxoBAAEcwAEWbBbAARZjgMABFl/AG5yFVMAAQZlEAQABhMABFm3AG54kAMAA9SwAwABDFD2KwAEWfMAbndkpRcABFpkBwAEWosABFqgAACdgwAD0eQGTARzAARazhMABFq3AG573XAEAARbAARbHFsABFrmAwAEWtcAbnIWsJcAAQZiykMAAVQgAwAD1pgGMwAEW28AbnvccwAEW4ITAARbbwBue910BAAGUAMAA9Z4+BUnAARbsgsABFvDAG53ZPgE9HMABFwkWwAEXBi6DesAAQxCCEQEAASeD8gDAAPa7Pz0cwAEXJxbAARckLoN6wABDEIIRAQABHMABF00WwAEXPxbAARcxgMABFy3AG5yFrCXAAEGYpLjAAFUMRAEAAYTAARdOwBue9wDAAPUsAMAA9rs9HMABF2AWwAEXXS6DesAAQxCCEQEAASeDDgDAAPa7PRzAARdzLp8aAQABHMABF4YWwAEXfYDAARd5wBuchVTAAEGZRAEAARzAAReTg8ABF4fAG53tXQEAAYTAAReVwBue9wDAAPWeAMAA9SwAwABDFD2KwAEXpMAbndkpPRzAARfEFsABF8Eug3rAAEMQghEBAAEngtoAwAD2uwbAAEMfgK3AARfXwAEX6MABGcgAALQ1ARrAARfYwADuSwAAAQPAARf4wAEZyAAAAAIBAsABGBcAAAC0mWDAAEGqAMABGB0AACCAqFsBKwBcAT4DPRzAARgqFsABGCcug3rAAEMQghEBAAEng2QAwAD2u0bAARg6wAEYccABGFIAAACSR2DAAEDsABbAARhkgMABGGDAG6C0lVTAAEGsPgFJwAEYeRzAARiNFsABGIiCwAEYfcAboPyCHMAAQPFBAQABGsABGKfAAEDdAMAA9dI+Ak7AARjSwAEY2QAAg7BgwABBPgEmwAEY0gGCwAEY28AboPxgwABBPj0cwAEZKxbAARkoLoN6wABDEIIRAQABJMABGUgBFsABGTuDwAEZNMAboVScK8AAQUAAwAD2uz4DPRzAARllFsABGWIug3rAAEMQghEBAAEnmWMAwAD2uz0cwAEZey6fGgEAAYLAARmBwBug/ADAAEMUPRzAARmZFsABGZYug3rAAEMQghEBAAEnlj8AwAD2uz0cwAEZuhbAARm3LoN6wABDEIIRAQABJ4NkAMAA9rsGwABDIICtwAEZzcABGd7AARo8AAC0OAEawAEZzsAA7ksAAAEDwAEZ6cABGjwAAAACAQLAARoDAAAAtJlgwABBuwDAARoJAAAggKhbASsAXAE+Aj0cwAEaFhbAARoTLoN6wABDEIIRAQABJ5YuAMAA9rs9HMABGikWwAEaJi6DesAAQxCCEQEAARbAARozgMABGi/AG6JcgLDAAEG9AMAA9rsGwABDIYCtwAEaQcABGlLAARqZAACdsAEawAEaQsAA7ksAAAEDwAEaW8ABGpkAAAACAQLAARpzAAAAtJlgwABBygDAARp5AAAggKhbASsAXAE+AT0cwAEahhbAARqDLoN6wABDEIIRAQABFsABGpCAwAEajMAbov6AsMAAQc0AwAD2uwbAAEMigK3AARqewAEar8ABG2wAAJS9ARrAARqfwADuSwAAAQPAARq5wAEbbAAAAAIBAsABGtIAAAC0mWDAAEHrAMABGtgAACCAqFsBKwBcAT4CScABGuIWwAEa8hbAARrqgMABGubAG6OBkw3AAEHtg96wwz4CPRzAARsHFsABGwQug3rAAEMQghEBAAEWwAEbKBbAARsZFsABGxGAwAEbDcAbo4GTDcAAQe2SabDNgLCwmwDAAPa7PRzAARs4FsABGzUug3rAAEMQghEBAAEngTEAwAD2uz89HMABG1EWwAEbTi6DesAAQxCCEQEAARbAARtjFsABG1uAwAEbV8Abo4GTDcAAQe2AsLCbAMAA9rsGwABDI4CtwAEbccABG4LAARvjAAC0SgEawAEbcsAA7ksAAAEDwAEblMABG+MAAAACAQLAARu1AAAAtJlgwABB+QDAARu7AAAggKhbASsAXAE+AT0cwAEbyBbAARvFLoN6wABDEIIRAQABFsABG9oWwAEb0oDAARvOwBukk5MNwABB+4CwsJsAwAD2uwbAAEMkgK3A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KwBcAT4EPRzAASILFsABIggug3rAAEMQghEBAAEntKYAwAD2uz0cwAEiNS6fGgEAARbAASI/gMABIjvAG6vigLDAAEKcAMAAQxRJwAEiSiEcwAEiXxbAASJSgMABIk7AG6vigt/AAEKdQQEAASsAwABBAT4CPRzAASJzFsABInAug3rAAEMQghEBAAEntKcAwAD2uz0cwAEilC6fGgEAARbAASKegMABIprAG6vigt/AAEKdAMAAQxQ/PRzAASK6FsABIrcug3rAAEMQghEBAAEngtoAwAD2uwbAAEMtgK3AASLNwAEi3sABI+oAALSLARrAASLOwADuSwAAAQPAASL1wAEj6gAAAAIBAsABIxsAAAC0mWDAAEK0AMABIyEAACCAqFsBKwBcAT4EPRzAASMuFsABIysug3rAAEMQghEBAAEntKgAwAD2uz0cwAEjVy6fGgEAARbAASNhgMABI13AG60IgLDAAEKcAMAAQxRJwAEjbCEcwAEjgRbAASN0gMABI3DAG60Igt/AAEKdQQEAASsAwABBAT4CPRzAASOVFsABI5Iug3rAAEMQghEBAAEntKcAwAD2uz0cwAEjti6fGgEAARbAASPAgMABI7zAG60Igt/AAEKdAMAAQxQ/PRzAASPcFsABI9kug3rAAEMQghEBAAEngtoAwAD2uwbAAEMugK3AASPvwAEkAMABJRsAALSOARrAASPwwADuSwAAAQPAASQawAElGwAAAAIBAsABJEMAAAC0mWDAAELAAMABJE8AACCAqFsBKwBcAT4EPRzAASRcFsABJFkug3rAAEMQghEBAAEntKkAwAD2uz0cwAEkiC6fGgEAARbAASSSgMABJI7AG64ugLDAAEKcAMAAQxRJwAEknSEcwAEkshbAASSlgMABJKHAG64ugt/AAEKdQQEAASsAwABBAT4CPRzAASTGFsABJMMug3rAAEMQghEBAAEntKcAwAD2uz0cwAEk5y6fGgEAARbAASTxgMABJO3AG64ugt/AAEKdAMAAQxQ/PRzAASUNFsABJQoug3rAAEMQghEBAAEngtoAwAD2uwbAAEMvgK3AASUgwAElMcABJf8AALSUARrAASUhwADuSwAAAQPAASU8wAEl/wAAAAIBAsABJVYAAAC0mWDAAELMAMABJVwAACCAqFsBKwBcAT4EPRzAASVpFsABJWYu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uwgAFsAARfsUwABF78AcdjIFAWDAAEUhhBfAAE/nGsAARgeDbADAAE7nPRfAAEbUFMAARsjAHHYyBQFgwABFIZJMH8AARt+JcgEAARbAAEcohsAARxbAHHbhoz/AAE77AMAAROY/Pz2NwABHcMAcdjIWwABHioXAAEd+wBx2MoNmwABPAyEcwABHrYXAAEehwBx2MkEBAAErAMAA9dI/SsAAR8kBgcAAR9DAHHVpBsAARFSAtMAAR97AAEfjwABMmwAAtVgAAAABA8AAR/zAAEybAAAAAgICwABIGwAAAJhQYMAARPAAwABIPQAAAIQJYKrpAABcAT4ETsAASjPAAEpFAAC1WmCk1wEmwABKMwEcwABKYhbAAEpcFsAASlYWwABKTy6dE8AAREedjsAATtKdj6TumJACAAInkzI0wABKfwPAAEp/wABL4gAAAAAAAABgpNcBPgVOwABKlsAASp4AAKYSYJCRAR/AAEqkkJ0BAAExwABKvGCOYwAATsAASszAAErRAACAsGCSMgEewABK15I7AgACJ5MyFsAASvWBwABK7cAcfE+ECarrAE7AAEsLwABLEQAAlERgjTEBNcAASxcAAAEAYI0xAR/AAEsXjV0EAAGDwABLHcAcfOYDg94pkkWCwABLSsAcfMGEGBbAAEtgFsAAS1wumTzAAEREhBiM3DUAAAABAFsBF8AAS3OEwABLccAcfSiUExbAAEuEFsAAS4AumTzAAERElBOMHIwchADAHH0oPRzAAEuaFsAAS5YumTzAAERElD8BAAGEwABLpMAcfRcAjQhKwABLsgEfwABLvaTqAgAChMAAS8/AHH0XLgAAwAD1aWCk107AAEvvwABL9QAAlERgjTEBJsAAS+8BFsAATAmCwABL98AcfGKB06TdYI0xTsAATCHAAEwpAACmEmCQkQEmwABMIQEWwABMMYPAAEwrwBx96ZJFjTVgkJE9HMAATF8WwABMSoTAAExCwBx+FZVUkJVPAQABNcAATGcAAAEAYI8MAR/AAExnjxoBAAEWwABMfYDAAExxwBx8QIHTwABE/AA1AAAAAQBbARfAAEyGhcAATITAHH5dklGEwABMj8AcfhWMG4UAwBx+XQDAAPUuBsAARFWAtMAATKDAAEylwABPDQAAtVsAAAABA8AATLjAAE8NAAAABQUFwABMzwAAAIQrYJgM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APWmPgE9HMAAqv0WwACq9S6ECcAATt2dOAUABBzAAKs8GsAAqxOGf4TNAgACJAADFsAAq3oWwACra4LAAKtcwBy075JpjRuAsIzUJ4ExFsAAq6cWwACrooLAAKuTwBy074CwjReAsJI1JAADFsAAq98WwACr0IPAAKvAwBy0/JJpjRuAsIzUJ4ExFsAArA0WwACsCIPAAKv4wBy0/ICwjReAsJI1AIiuFsAArC+CwACsIMActO+UE4wcGsAArEWDbBbAAKxogsAArFnAHLTvhBiNGAGB5xzAAK17McAArIRgiLEBHMAArQccwACsyRrAAKyWhnuEzQEAARbAAKzsFsAArOeDwACs18ActPyAsI0XgLCSNQCIroHrAwADFsAArSSDwACtFMActPyEGI0YFsAArVWDwACtRcActPyUE4wcGsAArWGDbACIml0BAAEcwACtiy61ggIAAoTAAK2cwBy1CYLAAK2uwBy07wDAAERnAMAA9T/AAE+JP0nAAK3KHMAArfcWwACt4IfAAK3OwBy1u5THjj5cAQABFsAArhKGwACuAcActZiUx44+AMAA9aY+AT0cwACuOhbAAK4yLoQJwABO3Z04BQAEHMAArnYawACuUIaDhM0CAAIkAAMWwACutBbAAK6lgsAArpbAHLTvkmmNG4CwjNQngTEWwACu4RbAAK7cgsAArs3AHLTvgLCNF4CwkjUkAAMWwACvGRbAAK8Kg8AArvrAHLT8kmmNG4CwjNQngTEWwACvRxbAAK9Cg8AArzLAHLT8gLCNF4CwkjUAiK4WwACvaYLAAK9awBy075QTjBwawACvf4NsFsAAr6KCwACvk8ActO+EGI0YAYHnHMAAsLUxwACvvmCIsQEcwACwQRzAALADGsAAr9CGe4TNAQABFsAAsCYWwACwIYPAALARwBy0/ICwjReAsJI1AIiugesDAAMWwACwXoPAALBOwBy0/IQYjRgWwACwj4PAALB/wBy0/JQTjBwawACwm4NsAIiaXQEAARzAALDFLrWCAgAChMAAsNbAHLUJgsAAsOjAHLTvAMAARGcAwAD1P8AAT4k/RcAAsQQBwACxDcAAsQ8AAFtgwAD0eQGTASIcwACxHhTAALEcwBy6XAoAXAEAARbAALFGFsAAsTGGwACxIMActZiUbI4/WsAA9UwAwAD1pgAcwACxXhTAALFc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v8AAzvvAAM7QAAAApBFgwABPAQAWwADO8xbAAM7tFsAAzuAulInAAE7TnY+k7inAAPVxPgFJwADPAyIhFsAAzxWAwADPCMAczEmUPcAATxgAIhbAAM88gMAAzy/AHMxJg+PAAE8OARbAAM9WgMAAz0nAHMxJhEXAAE8NPgE9HMAAz3AunTgEAAMcwADPvxrAAM+IhUOEzQEAARbAAM/NLqM/wABESQCIrhbAAM/tLoQXwABP5xrAANAFg2wBgecxwADQJGCIsQEcwADQphzAANByGsAA0DSFRYTNAQABFsAA0IAuoz/AAERJAIiugesDAAMWwADQ14DAANDKwBzMSYQYwABPBhbAANDtgMAA0ODAHMxJhBfAAE8HGsAA0PmDbACImsAATuc/BsAARGmAtMAA0SjAANEtwADUiAAApCoAAAABA8AA0ULAANSIAAAAAQEBwADRUgAAAIQrYJgMAABcAT4DTsAA0fDAANH6AACUhmCSiwEWwADSChbAANIAFsAA0fwumTzAAERElIaM3pYWkvxOwADSLMAA0jkAAJSWYJ3SAR7AANJIndkBAAEWwADSWhbAANJWLpk8wABERJSHjN8ARsAA0mzAANKzwADSewAAAK0nYJL2ABzAANKaFsAA0o0WwADSiS6ZPMAARESUmYzwlJIAAAAAjQY+Ak7AANLJwADS0wAAm/lgkosBFsAA0wwcwADS7ILAANLfwBzN2ZSXAQABg8AA0wDAHM4SAJ3ilhaS/EnAANMjIRzAANNlHMAA0zGAwADTJ8AczZeVDQIAAoHAANNFwBzNqhbAANNahMAA01DAHM5ElJSSkACYF0EBAAGEwADTcsAczkQAkpg+AT0cwADTjxbAANOHLoQJwABO3Z04BAAEHMAA09UawADTp4YthM0DAAOBwADT9MAczaqEwADT/8AczkQWwADUGhbAANQOFsAA1AoumTzAAERElIeM35YWkvwAiK4WwADUPBbAANQ4Lpk8wABERJQTjBwawADUVINsFsAA1G4WwADUai6ZPMAARESEGIzcAMAAT4k/BsAARGqAtMAA1I3AANSewADbCQAAqAABGsAA1I7AAO5LAAABA8AA1KjAANsJAAAAAQEBwADUtQAAAJwGYMAATwEAAFwBPgFJwADUwiXAANTMgMAA1MbAHM+PYMAAREA+Bz0XwADU8RTAANTrwBzPjwABYMAARECnli7AAERCPRzAANVWFsAA1VAWwADVSi6djsAATtKdj6Tug7wBAAE0wADVXgPAANVewADWGwAAAAICAsAA1WYAAACAsGDAAPZdAMAA1XgAAACSW2DAAE8BAABgwAD1ggE+Ak7AANWWwADVogAAtZhgwABPAQEcwADVtRbAANWwFsAA1aoUwADVpMAcz48AAWDAAERAnY7AAE7SnY+k7kQBAAGBwADVtsAc0A4AwAD1YknAANXFIRzAANXVg8AA1cnAHNA2QQEAASsAwAD10j4BPRzAANXxgsAA1erAHNAdqAABAAGDwADV/MAc0DYAwABPID8AwAD1bT0cwADWMhbAANYqFsAA1iQunY7AAE7Smc2k74O8AQABNMAA1joDwADWOsAA1vkAAAACAgLAANZCAAAAgLBgwAD2XQDAANZUAAAAkltgwABPAQAAYMAA9YIBPgJOwADWcsAA1n4AALWYYMAATwEBHMAA1pMWwADWjBbAANaGFMAA1oDAHM+PAAFgwABEQJ2OwABO0pnNpO9EAQABgcAA1pTAHND/AMAA9WJJwADWoyEcwADWs4PAANanwBzRJ0EBAAErAMAA9dI+AT0cwADWz4LAANbIwBzRDqgAAQABg8AA1trAHNEnAMAATyA/AMAA9W09HMAA1xUWwADXDxbAANcCLpSJwABO052PpO6DvAEAATTAANcdA8AA1x3AANfhAAAAAgICwADXJQAAAICwYMAA9l0AwADXNwAAAJJbYMAATwEAAGDAAPWCAT4CTsAA11XAANdhAAC1mGDAAE8BARzAANd7FsAA13YWwADXaRTAANdjwBzPjwABYMAARECUicAATtOdj6TuRAEAAYHAANd8wBzR8ADAAPViScAA14shHMAA15uDwADXj8Ac0hhBAQABKwDAAPXSPgE9HMAA17eCwADXsMAc0f+oAAEAAYPAANfCwBzSGADAAE8gPwDAAPVtTsAA1+/AANf8AAC1mWDAAPR5ATUAAAABAGDAAPR5ATUAAAABAF3AAPUdAV3AAFByAmDAAFBOWwEWwADX/i6jg8AATs8jHMAA2A2BAMAc0s1BAQABKwAAKxbAANgNgQDAHNLNWsAA9UwBYMAA9HkjHMAA2BSBAMAc0sFBAQABKwAAk4EAwBzSwQFgwAD0eU7AANgkwADYMAAAtZpgwAD0eQE1AAAAAQBgwAD0eQE1AAAAAQBdwAD1HQFdwABQcgJgwABQTlsBFsAA2DgUwADYMsAcz48AAWDAAERAo4PAAE7PIxzAANhHggDAHNNbQQEAASsAACsWwADYR4IAwBzTW1rAAPVMAWDAAPR5IxzAANhOggDAHNNPQQEAASsAAJOCAMAc008BYMAA9HlJwADYWiEcwADYa4HAANhewBzSrkEBAAGCwADYbsAc0zwAwAD1nD4BPRzAANiLFMAA2IXAHM+PAAFgwABEQJ04BAADGsAA2JaGrhbAANjQFMAA2MrAHM+PAAFgwABEQIQXwABP5xrAANjcg2wBgecxwADY72CIsQEcwADZExrAANj7hqyB6wMAAxbAANkgLoQYwABP6BbAANkpLoQXwABP5xrAANk1g2wAiKbAAE7nScAA2VghHMAA2WoWwADZXC6jg8AATs9BAQABKwDAAPXSPgJOwADZgcAA2YcAAIDQYMAA9HkBk0bAANmUwADZzQAAAAEAXcAAUHICYMAAUE5bABbAANm+FMAA2bjAHM+PAAFgwABEQKODwABOzz4CTsAA2bMAAACDXGDAAEVHASbAANmUAYTAANmzwBzUx2DAAEVHPRzAANnwHMAA2eYWwADZ2S6jg8AATs9EAQABNQAAAAEAYMAA9HkBg8AA2efAHNSrNQAAAAEAYMAA9HkBi8AA2efAHNSrHMAA2eyGAMAc1TZdAQABlADAAPWehgDAHNU2AMAA9SyoAAEAAYXAANn7wBzU9wDAAE8gPz4BPRzAANosFsAA2iQuhAnAAE7dnTgFAAQawADaN4awFsAA2l6AwADaWMAcz4+EF8AATwcawADadINsFsAA2oSAwADafsAcz4+EGMAATwYBgecxwADalmCIsQEcwADavhrAANqghrKB6wMAAxbAANrYLoQYwABP6BbAANrhLoQXwABP5xrAANrtg2wAiKbAAE+JBsAARGuAtMAA2w7AANsmwADc+gAAtZsBGsAA2w/AAO5LAAABA8AA2zfAANz6AAAABQQEwADbRgAAAICwYMAA9l0AwADbUAAAAIQXYMAA9HkAwADbYAAAAIQYYMAA9t4AwADbeAAAALWcXcAAT3ECYMAAUE5bAAHAANuWAAAAhEFgwADyswEqYMAATwEBPgNOwADbusAA28YAAJ1mYMAATwEBHcAA2861mwUA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aJSPKY0BPRyjMhajKi6VHcAARHioSQQABBajSIGjPMAc9k6djsAAT3MWo08uhBfAAE/nFqNbLoQYwABP6ICjZMAc9kMAwABQDT0co4QWo3kulVXAAER5qEkEAAQWo6OBo5fAHPZOnY7AAE9zFqOqLoQXwABP5xajti6EGMAAT+iAo7/AHPZDAMAAUA09HKPfFqPULpWgwABEeqhJBAAEFqP+gaPywBz2Tp2OwABPcxakBS6EF8AAT+cWpBEuhBjAAE/ogKQawBz2QwDAAFANPRykOBakLy6m5MAARHuoSQQABBakToGkQsAc9k6djsAAT3MWpFUuhBfAAE/nFqRhLoQYwABP6ICkasAc9kMAwABQDU6kk6SlAAC1sGDAAESHASakkwEcpKcutbEBAAEnJwDAAE7oYMAARIdOpMyk1wAAtbJgjTEBHKTrgqTZwBz3h57xAQABgKTxwBz2QwDAAESTTqUZpSoAALWzYMAARIcBJqUZARylLC61sQEAAScoAMAATuhgwABEh06lUaVbAAC1tGCNMQEcpW6EpV3AHPfXnvEBAAGApXTAHPZDAMAARJNOpaClsAAAtapgwABE8AEmpaABHKWyLrWxAQABJyMAwABO6GDAAETwPRel5Ial1MAc+CeSTB+l75HLAQABH6YMjsICAAIfpiKQfAAAAACFpjTAHPf/AADAAETmTqZWpl0AACldwAD1HQFgjmMBMaZrYI5jAEmmcyEcpokWpncup9bAAER3QQEAASsAwAD10j4BRqaaptemsAAAALWrYMAATzEAFqbELqfWwABEdz4BSabhIRym9hSm5cAc+LwIAEEBAAErAMAA9dI+Ak6nF6cjAACdZmDAAE8BARynJS61sQEAARanRxSnNsAc+LwIAICwwABPNADAAE7oSadYFqdoFKdcwBz48gkAhELAAE8PPgJOp5KnmAAAlERgwABEhwEmp5IBFKeawBz48gkAYMAARIc9HKe6h6ezwBz4gk8BAAEfp8KPGgEAARyn0hSnzMAc+TgKAJ7xAQABgKfYwBz2QwDAAESTAADAAPUuPz8/TqgmqDQAALWpYMAARIcBJqgmARyoNi61sQEAAScpAMAATuhgwABEhz0cqGQUqFbAHPmWCACe8QEAAYCoasAc9kMAwABEkz0XqI0UqH/AHPmWCACSRR+op5CdAwABh6izwBz4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QB0BYMAARPAGwABE+IC9qC2oP6hVAQCCHAAAAAEDqESoVQAAAAAAAABgjdwBSqhHARaoURaoRy6EMMAARPKCHI2iBsAARPmAvahaqGqojgEAtdQAAAABA6h4qI4AAAAAAAAAYI5UAUqoewEWqHsutdrAAET0BsAARPqAvaiTqKGpLAEAkkwAAAABA6imqSwAAAAAAAAAYJETAT4CSaisIiIcqLsWqLAutdHAAETgQQEAASsAwAD10gAhFqjHLoPfwABP6wAhFqjWLoPkwABP7j4BPReo6i610R+o+5FAAAAAAMAAROA/SqkXARapHi610cAAROAGwABE/oC9qTGpOqo4AgC11AAAAAEDqUeqOAAAAAEBAalUAAAAtdtgjlQAAFwBPgI9F6lnLrXagKl9wB1BXcAARPRJqY4hHKmbFqmSLpJPwABE30EBAAErAMAA9dI+Aj0XqdcWqc4ukk/AAETflPUWqeUutdrAAET0jjs9F6oJFqoALpJPwABE35T2FqobLrXawABE9I48PwbAAET7gL2qPapGq3cBALXcAAAAAQOqZat3AAAAAAAAAGDAAPKzAT4DSaprFqp3FqpvLoQJwABPvIHgwABPe0qqgwEqP0mqlRaqmS6UrMAAT7c+Akmqsxyqwhaqty6U3MAAUCtBAQABKwDAAPXSSqrLASk/SareIRyq6haq4i6ntsAAUC5BAQABKwDAAPXSPgFGqv2rGasGAAAAmTFdwABPSAFgwABQTgAWqxAup7bAAFAuPgFJqyUcqzUWqzCAqynAHUJrghfAAE9MQQEAASsAwAD10kqrPgEpPz8/SqtnASoGwABFAIC9q3yrhq6iAACe8QAAAAEDq4uuogAAAAEBAauhAAAAhAldqzoCYMAAUE5bAABgjZ8BPgNJq/gcrAsWrAYWq/wuhDDAAETygLCNF0EBAAErAJI+Pgk9F6wmFqwcLoQwwABE8pJPHKwxLrXTAQABgKw/wB1C1wDAAETpjaQ9F6xiFqxZFqxPLoQwwABE8pJPjaSSURasay6EMMAARPKMGz0XrI8WrIYWrHwuhDDAAETykk+NpJQTFqycLqfLwABE84wcPResyhaswRasty6EMMAARPKST42klH4WrOQWrNouhDDAAETylH6NFY46PRetAxas+S6EMMAARPKD3xatEC6D38AAT+uNyD0XrSwWrSIu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9dIBIRzAAEUiFsAARQsutd/AAEUMQQEAASsAwAD10j4BPRzAAEU1LrXhAwADGsAARU6GMhbAAEWQFMAARYTAHVPOAAFgjheUE4wcgcAARZzAHVPbAMAARRpJwABFshbAAEXPFsAARcIWwABFti6YUMAARQiUwI1jg2jAAPUAPgNOwABF8cAARfcAAILSYI3rARbAAEYSFsAARgUWwABF+S6YUMAARQiUwI1jgtLAAPUBTsAARi3AAEYzAACC6GCN6wEcwABGPIHAAEY1wB1T27XjAgACHMAARmiBwABGYcAdU9um1gEAARzAAEaKgcAARoPAHVPbptcDAAMawABGqIcyFsAARs6DwABGyMAdVeGUE4wcGsAARtqDbADAAEo1AMAASjoWwABG+IPAAEbywB1V4ZQTjBwAwAB+zj0cwABHGoLAAEcNwB1T8E8BAAE1wABHHgAAAQBgjesBhMAARx7AHVYSNQAAAAEAWwEXwABHJYXAAEcjwB1WsJJRFsAARy4umFDAAEUIjBuFAMAdVrAAwAD1Lj4CPRzAAEdggsAAR1PAHVPwTwEAATXAAEdkAAABAGCOFwEUwABHZMAdU84AAWCOFzUAAAABAFsBF8AAR3GDwABHb8AdVwySURbAAEd6LphQwABFCIwbgwDAHVcMAMAA9S49F8AAR5Autd8UwABHqcAdU84AAWCOF8AARQxJwABHySEcwABH5BbAAEfNLrXfwABFDEEBAAErAMAA9dI+AT0cwABH9S614QMAAxrAAEgZhzIWwABIRYDAAEg5wB1TzpQTjByBwABIUcAdU9sAwABFGknAAEhlIRzAAEh6FsAASGkutd7AAEULQQEAASsAwAD10j4BPRzAAEiLLrXhAwADGsAASK+HDBbAAEjgFsAASM8utd7AAEULlBOMHIHAAEjswB1T2wDAAEUaPgE9HMAASRWCwABJCMAdU/BPAQABNcAASRkAAAEAYI3rAYDAAEkZwB1TzjUAAAABAFsBF8AASSaDwABJJMAdWDeSURbAAEkvLphQwABFCIwbgwDAHVg3AMAA9S4GwABFHIC9wABJSsAASVrAAEytAACjsQEawABJS8AA7ksAAAEDwABJZcAATK0AAAAAAAAAYMAA9HkBPgxJwABJbiEWwABJcy6dPcAATxRKwABJfAGTPz0XwABKLBbAAEogFsAAShku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FobAAEQKwB3r5IRCwABPDwAcwABEMhbAAEQthsAARCHAHevkg2bAAE8DQQEAASsAwAD10j4BPY/AAERFwB3scybAAERFAYbAAERNwB3r5GDAAESHPgFCwABEcQA9HMAARJCBwABEicAd6uNPAQABh8AARJTAHexzAMAA9S5JwABEoiEcwABEsoPAAESmwB3rZUEBAAErAMAA9dI+AUnAAETFIRzAAETUFsAARM+HwABEycAd7HODZsAATwNBAQABKwDAAPXSPgA+Az0XwABFwYfAAEW7wB3sc5JFg8AARc/AHetlwABEjT01AAAAAQBgwABKpAEWwABF5i6l7MAARkjAAEZfIxzAAEX1FADAHe12CABBAQABKwAAKxzAAEX1FADAHe12CAC26QMAAy4WwABGJofAAEYgwB3sc7W9wABEkYPAAEYxwB3rZQDAAEqxAVw9HMAARlgWwABGURbAAEZJLoQJwABGU5Hkqz2kNgMAAxbAAEaEh8AARn7AHexzgdPAAESQFsAARowupDfAAEZqFsAARqIupDjAAEZpAKWyPz4BPRzAAEiXLrbqAQABJsAASKUBHMAASKUursIAAAAAwACDvF3AAFCBAWDAAEU/AMAAR3BOwABI0cAASN0AAJQ0XcAA9R0BYI5jASbAAEjRARzAAEjfLq7CAAAAAMAAg7xdwAD1HQFgjmNJwABI6iEcwABI+oLAAEjuwB3uY0EBAAErAMAA9dI+BD0cwABJCy620QEAAYLAAEkcwB3uYwDAAEaLTsAASTbAAEk8AACURGCNMQEWwABJSxbAAElFgcAAST7AHerjgtLAAPUBgdPAAESQRcAASZkBwABJosAASaQAAFtgwAD0eQGTARzAAEmrhMAASanAHe8IXAEAARbAAEm5gsAASa3AHe5jWsAA9UwAwAD1pgGMwABJwcAd7wgcwABJwoTAAEnBwB3vCF0BAAGUAMAA9Z4+AT0cwABJ1oPAAEnQwB3u05RAAQABHMAASe+CwABJ5MAd7mNEAQABhMAASfDAHe8IAMAA9SwAjSxFwABKAwHAAEoMwABKDgAAW2DAAPR5AZQBHMAAShWEwABKE8Ad76ZcAQABFsAASh6BwABKF8Ad6uNawAD1TADAAPWmAYzAAEomwB3vphzAAEonhMAASibAHe+mXQEAAZQAwAD1nj4DPYvAAEp6wB3u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Luubz5sNAMAAfx8AwABGewbAAEamgM3AAKwUwACsJcAAr5IAALcnARrAAKwVwADuSwAAAQPAAKxCwACvkgAAAAEBAcAArEkAAACPMWCbAAAAXAE+Az0cwACsVi621AEAASe3KADAAEdrTsAArIzAAKySAACAimCOYwEcwACslC62uwAAAADAAEZ8ScAArKclwACssYHAAKyrwB4vwmCoWj4BPRzAAK8JLq7BAQABNcAArw4AAAEAYKhaARTAAK8OwB4vwgEBYKhaNQAAAAEAWwEXwACvFYLAAK8TwB4wB6YYKaheggDAHjAHAMAARns+AT0cwACvQS6uwQEAAR/AAK9KwABOhAMAAy4WwACvd4DAAK9xwB4vm5vPmw2BwACvgcAeL8IAAMAARnsGwABGp4DNwACvl8AAr6jAALNkAAC3KQEawACvmMAA7ksAAAEDwACvssAAs2QAAAACAgLAAK+5AAAAp1hgmwAAwACvywAAAJvNYJsAAABcAT4GPRzAAK/bLrbUAQABJ7cqAMAAR2tOwACv/cAAsAcAAFRgjy0BJsAAr/0BHMAAsAkursIAAAAAwACDvGCPLU7AALA8wACwSgAAkkRdwAD1HQFdwABQgQFgwABFPwEmwACwPAEcwACwTC6uwgAAAADAAIO8XcAA9R0BXcAAUIEBYMAART9OwACwXsAAsGcAAIQ8YMAA9cUBHMAAsGkursIAAAAAwACDvEnAALB0IiEcwACwgoLAALB4wB4w6kEBAAErAMAA9dIAIRzAALCbg8AAsI3AHjETQQEAASsAwAD10j4CQBbAALDcHMAAsLoWwACwsy619MAAfsa3KwEAAYLAALDRwB4w6gDAAH7zgPzAAPT/wACws8AAsOMAPRzAALDzFsAAsOwutfTAAH7GtywCAAKCwACxGMAeMOocwACxIy63LQEAAYPAALE6wB4xEwDAAEdxAMAAfvQ+AUAcwACxc4PAALFlwB4xE0EBAAErAMAA9dLAALFlwACxegBJwACxhyXAALGUhMAAsYvAHjFZYMAAToo+Ak7AALGwwACxtQAAgLBgkjIBHsAAsbuSOwIAAhbAALHJFMAAscDAHjFZBAFgwABOioCwwABOjBbAALHXFsAAsc8uhAnAAEZThAmq6wBJwACx5xzAALH1gsAAsevAHjDqQQEAASsAwAD10j4BPRzAALII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ANBgIhbAANBkLoHgwABGYQAcwADQghbAANByLrauwABGbkEBAAEawADQlcAAf1IAwAD10j4CPRzAANCjLp04BQADFsAA0LYUwADQrsAeRuEJAIVuiLYWwADQzRTAANDFwB5G4QkAhBeItBbAANDhFMAA0NnAHkbhCQBaiLUCneApgecUwADRDsAeR/MNAMAAR2hKwADRHgE1wADRLAAAAQBgjmMBHMAA0SwWwADRJS619MAAfsaqWwIAAiscwADRZhbAANFfFsAA0VcuhAnAAEZTkeSrPYQ+CQAEgMAA0ZLAHkZbgcAA0ZzAHkZoHMAA0akWwADRoi619MAAfsa3LgEAAYLAANG3wB5GdwDAAH9Ig8AA0cPAHkaDBYQ/IiGGwADR6MAeRrEAIYfAANH1wB5GwYRAhsAA0hfAHkaxhEGHwADSOcAeRsGD3hTAANJbwB5G0QgAhEYiIRTAANKAwB5G0QgAACGFwADSjcAeRqGltQDAAH8lNQAAAAEAWwEXwADSoRTAANKfwB5MEQ4AlBODwADSrsAeRoOMHBQAwB5MEQ4AP0rAANLEARzAANLLLqbWAQABHMAA0uYuptcEAAMWwADTBBTAANL8wB5G4QkAhW6IthbAANMbFMAA0xPAHkbhCQCEF4i0FsAA0y8UwADTJ8AeRuEJAFqItQGB5xTAANNIwB5H8w0AwABHVADAAEd0BsAARraAzcAA01rAANNuwADVOgAAt04BGsAA01vAAO5LAAABA8AA03/AANU6AAAABQICwADThQAAAICwYJIyAMAA048AAACEF2DAAPR5AAPAANOnAAAAhD1gwADyswEqwADTwgAAAKBTYMAA8rMBKcAA0/IAAACB513AAPUdAWCIsQErYIiTAT4DTsAA1ArAANQSAAAiYIiTASOCwADUFMAeTdscwADUShrAANQshxOEzQEAARbAANRdgMAA1FjAHk2+gLCSNQCIrhzAANSKGsAA1HOFNYTNAQABFsAA1J2AwADUmMAeTb6AsJI1AIiuAWCIk0nAANSog8AA1KzAHk3rPgE9HMAA1MMut1EEAAOFwADU2sAeThaBwADU48AeTcsWwADU+RbAANT0gMAA1O/AHk2+gLCSNVrAAPZhAYHnhMAA1RTAHk37wABHaT9KwADVKAGFwADVL8AeThYGwABGt4DNwADVP8AA1VPAANcf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ARrAARL2wADuSwAAAQPAARMiwAETrAAAAAICAsABEykAAAC3g2CbAADAARM7AAAAm81gmwAAAFwBPgI9HMABE0suttQBAAEnt4EAwABHaz0cwAETdS63hAMAAykWwAETmYDAAROOwB58zINmmxuBwAETn8AefNkAwABGyAbAAEbIgM3AAROxwAETwsABFXAAALeEARrAAROywADuSwAAAQPAARPUwAEVcAAAAAMDA8ABE+EAAAC3hWDAAPKzAMABE/YAAACnWGCbAADAARQIAAAAm81gmwAAAFwBPgM9HMABFBguttQBAAEnlc0AwABHa07AARRGwAEUUQAAkkdgjmMBI4DAARRTwB59XxzAARRjLra7AAAAAMAARnwrAWCOY0nAARR9IiEcwAEUjIPAARSBwB59okEBAAErAMAA9dIAFsABFJcutrjAAEZ2PgE9HMABFK4ursEBAAEcwAEUsy63hgIAAhrAARTahC4WwAEVB4HAART8wB59boQXmwkAwABHWQDAAEZ7PgE9HMABFSgursEBAAEcwAEVNBbAARUtLrX0wAB+xreHAwADgcABFUTAHn1ug8ABFVDAHn2igsABFVzAHn17AMAAfyEAwABGewbAAEbJgM3AARV1wAEVhsABFjgAALeIARrAARV2wADuSwAAAQPAARWYwAEWOAAAAAEBAcABFZ8AAACPMWCbAAAAXAE+BE7AARW3wAEVwQAAlU9gjmMBHMABFcMutrsAAAAAwABGfD0cwAEV1i63iQEAAYHAARXwwB5+yADAAEduPRzAARYALq7BAQABgcABFgXAHn7IAMAARns9HcABFhu3iAEAAYDAARYuwB5+tQDAAH+pBsAARsqAzcABFj3AARZOwAEWsgAAt4oBGsABFj7AAO5LAAABA8ABFl7AARayAAAAAQEBwAEWZQAAAI8xYJsAAABcAT4CPTUAAAABAGDAAEsNARbAARZyLqZlwABGYCMcwAEWgIEAwB5/fEEBAAErAAArHMABFoCBAMAef3y3iwAAAADAAEsYAVw9HcABFpe3igEAAYDAARaowB5/aADAAH+qBsAARsuAzcABFrfAARbIwAEX9wAAt4wBGsABFrjAAO5LAAABA8ABFtbAARf3AAAAAgICwAEW3QAAALeNYJsAAMABFuwAAAC3jmCbAAAAXAE+BU7AARcHwAEXEAAAt49gkRMBHMABFxIutscBAAGBwAEXKMAegBcAwABGhE7AARdCwAEXSwAAt5BgkRMBHMABF00utsgAAAAAwABGhU7AARdswAEXdgAAlU9gjmMBJsABF2wBHMABF3gursIAAAAAwACDvGCOYz01AAAAAQBgwABLDQEWwAEXgy6mZcAARmAjHMABF5GFAMAegKBBAQABKwAAKxzAAReRhQDAHoCgt5EAAAAAwABLGwFcPRzAAReoLq7BAQABHMABF7QWwAEXrS619MAAfsa3kgUABYDAARfAwB6ACoTAARfJwB6AdYPAARfUwB6AVIHAARfewB6AF4LAARfpwB6AKgDAAH8aAMAARnsGwABGzIDNwAEX/MABGA3AARjmAAC3kwEawAEX/cAA7ksAAAEDwAEYI8ABGOYAAAABAQHAARgqAAAAt5RgmwAAAFwBPgM9HMABGEQuttQBAAEnt5UAwABHa0AcwAEYkRbAARiFgMABGHLAHoFunCubH0EBAAEngK8AwAD2bMABGHLAARiXAD0cwAEYni63lgIAARzAARizLra7AAAAAMAARnwBt5eAwAEYz8AegW7AAEbOBsAARs2AzcABGOvAARj8wAEczwAAt5gBGsABGOzAAO5LAAABA8ABGRfAARzPAAAAAQEBwAEZHgAAAI8xYJsAAABcAT4GPRzAARkrLrbUAQABJ7eZAMAAR2tOwAEZWcABGWEAAIPiYMAA8rMBIRzAARmPHMABGYIWwAEZZC62sMAARnCDLAEAARrAARmEwABFzQDAAPSRQQEAAZMAwAD1nE7AARmewAEZpgAAg+BgwADyswEhHMABGdQcwAEZxxbAARmpLrawwABGcIMsAQABGsABGcnAAEXQAMAA9JFBAQABkwDAAPWcTsABGekAAACSRWCOYwBJwAEZ+iEewAEZ/8AAg2ECAAInmW2AwAEaDsAegiAAPgFJwAEa6YHAARrtwB6CRz4BPYvAARsAwB6C1RzAARsOLqbXAwADHMABG2QawAEbLoQhhM0BAAEWwAEbeIDAARtywB6CIIHumxoAiK4WwAEbk4DAARuNwB6CIIQXmwkWwAEbsYDAARurwB6CIFqbGQDAAEdUScABG8eCwAEby8Aego4+AT2LwAEb3sAegtUcwAEb7C6m1wMAAxzAARxCGsABHAyFGYTNAQABFsABHFaAwAEcUMAegiCB7psaAIiuFsABHHGAwAEca8AegiCEF5sJFsABHI+AwAEcicAegiBamxkAwABHVD8/PRzAARyqLreWAQABg8ABHL/AHoLVAMAARs4GwABGzoDNwAEc1MABHNnAASCvAAC3lgAAAAEDwAEc7cABIK8AAAACAQHAARz5AAAAkkVgjmMAAcABHQ0AAAC3l2CbAAErXAE+Ck7AAR0owAEdLQAAg7JgwAD1xQEcwAEdLy6uwgAAAADAAIO8ScABHTolwAEdQ4LAAR0+wB6EUGDAAIQEPgI9HMABHV4ursEBAAEUwAEdY8AehFACAWDAAIQEAMAARntKwAEdcAA/TsABHY3AAR2YAACcSmDAAE6KASbAAR2NAYLAAR2awB6EUGDAAE6KQCEcwAEdyRbAAR2rLrawwABGcEEBAAEcwAEdzJSBVgAAAADAAPScAMAA9ZzAAR2rwAEdzgBOwAEd2sABHeIAAIPiYMAA8rMBIRzAAR4QHMABHgMWwAEd5S62sMAARnCDLAEAARrAAR4FwABFzQDAAPSRQQEAAZMAwAD1nE7AAR4fwAEeJwAAg+BgwADyswEhHMABHlUcwAEeSBbAAR4qLrawwABGcIMsAQABGsABHkrAAEXQAMAA9JFBAQABkwDAAPWcQBzAAR5uhMABHmbAHoURQQEAARzAAR6CFsABHnIutq7AAEZuQQEAARrAAR6VwAB/UwDAAPXSAMAA9dLAAR5mwAEengBOwAEeucABHsIAAJJLYJICATXAAR7IAAABAGCpfAEfwAEeyKmMBwACFsABHviDwAEe7cAehLWAsMAATowWwAEe/i61v8AARmgFpn0WwAEfUx7AAR8vwABOiQEAAYPAAR9HwB6EtQCUPZsUkkWAwAEfdcAehC+CFxzAAR+QLrbqAQABFsABH54utq/AAEZvAMAAR3CD4IXAAR/KwB6FWIPihMABH+TAHoURNQAAAAEAWwEXwAEf9YbAAR/zwB6F9JQTFsABIA2DwAEgAsAehLWEF8AATo2MHDUAAAABAFsBF8ABICCGwAEgHsAehfSV3x7AASAzwACDZQEAAYHAASBCwB6EPQCSBIYAwB6F9D0cwAEgXBbAASBULoQJwABGU6cqAgAChsABIH3AHoXjFsABIIculkXAAEZ4AKsmPRzAASCdLq7BAQABhsABIKLAHoXjAMAARnsGwABGz4DNwAEgtMABIMXAASELAAC3mgEawAEgtcAA7ksAAAEDwAEg2sABIQsAAAABAQHAASDhAAAAjzFgmwAAAFwBPgE9F8ABIO4utqopwABGZQbAAEbQgM3AASEQwAEhIcABIfAAALebARrAASERwADuSwAAAQPAASE0wAEh8AAAAAICAsABITsAAAC3lGCbAADAASFVAAAAjzFgmwAAAFwBPgQ9HMABIWIuttQBAAEnlOoAwABHaz0XwAEhhi62qirAAEZlQBzAASHMFsABIcCAwAEhrcAeh76cK5sfQQEAASeArwDAAPZswAEhrcABIdIAPRzAASHZLq7BAQABHMABId4utrsAAAAAwABGfADAAEZ7BsAARtGAzcABIfXAASIGwAEjNAAAt5wBGsABIfbAAO5LAAABA8ABIh7AASM0AAAAAQEBwAEiJQAAAI8xYJsAAABcAT4CPRzAASIyLrbUAQABJ7edAMAAR2tJwAEiWBzAASJsFsABIlwutq7AAEZuQQEAARrAASJ/wAB/UwDAAPXSPgE9HMABItYursEBAAEcwAEi4hbAASLbLrX0wAB+xrcBAQABgMABIu7AHoiAAMAAfv0AwABGez4BPRzAASMKLq7BAQABGsABIxnAAIOSAMAARnsGwABG0oDNwAEjOcABI0rAASTJAAC3ngEawAEjOsAA7ksAAAEDwAEjYsABJMkAAAABAQHAASNpAAAAt59gmwAAAFwBPgc9HMABI64uttQBAAEnpz0AwABHa07AASPewAEj4wAAg7JgwAD1xQEcwAEj5S6uwgAAAADAAIO8ScABI/AlwAEj+YHAASP0wB6Je2DAAIQEPgI9HMABJBQursEBAAEUwAEkGcAeiXsBAWDAAIQEAMAARntKwAEkJgA/TsABJEzAASRVAACSS2CSAgEmwAEkTAGBwAEkV8AeiXtgkgI9F8ABJGqCwAEkYcAeieCUExbAASSBgMABJHfAHolUhBebCYwcPRzAASSRLq7BAQABgsABJJbAHongAMAARns9HMABJKUupR4CAAKCwAEktcAeieAWwAEkvy6djsAAf4sAwABGiQbAAEbTgM3AASTOwAEk38ABJykAALegARrAASTPwADuSwAAAQPAAST4wAEnKQAAAAICAsABJP8AAACPMWCbAADAASUMAAAAtuRgmwAAAFwBPgk9HMABJSMuttQBAAEnt6AAwABHa07AASVywAEldwAAghddwABQgQFgwABFPwEmwAElcgEcwAEleS6uwgAAAADAAIO8XcAAUIEBYMAART9OwAEliMABJZIAAKNrYMAA9HkBHsABJZ3AAEX5AQABNQAAAAEAYJsAAYHAASW1wB6KpyMcwAElxoMAwB6LJ0EBAAErAAArFsABJcaDAMAeiyeB7psaAWDAAPZdAD0dwAEl2a7BAQABFsABJd4utrDAAEZwAMAAg7k9HcABJgiuwQEAATUAAAABAF3AAFCBAWDAAEU/ARbAASYNLravwABGbyMcwAEmJoQAwB6Li0EBAAErAAAawAEmM8AAg6GEAMAei4sBYMAA9cUAwACDuT0XwAEmPi62r4LAASZZwB6KzsAARm89F8ABJmMutrCDwAEmg8AeiwjAAEZwPR3AASaYrsEBAAEWwAEmnS62rsAARm4AwACDuT0XwAEmsy62riMhHMABJt4cwAEm0YPAASbHwB6LCIMsAQABGsABJtPAAEXNAMAA9JFBAQABkwDAAPWcGsABJv7AAH9TGsABJyHAAH9SAWDAAH9MwABGbgbAAEbUgM3AAScuwAEnP8ABLPAAALehARrAAScvwADuSwAAAQPAASdWwAEs8AAAAAICAsABJ1sAAACA0GDAAPR5AMABJ2gAAACbzWCbAAAAXAE+Aj0cwAEneC621AEAASe3ogDAAEdrScABJ6AcwAEnqoDAASekwB6Mp0EBAAGUAMAA9Zw+CU7AASe/wAEnxAAAg7JgwAD1xQEcwAEnxi6uwgAAAADAAIO8PRfAASfTLrauJsABJ9MBHMABJ+UursIAAAAAwACDvGDAAH9MwABGbj0XwAEn8i62rybAASfyARzAASgNLq7CAAAAAMAAg7xdwABQgQFgwABFP8AARm89F8ABKBoutrAmwAEoGgEcwAEoOi6uwgAAAADAAIO8YMAA9HnAAEZwTsABKFjAAShkAACUNF3AAPUdAWCOYwEmwAEoWAEcwAEoZi6uwgAAAADAAIO8XcAA9R0BYI5jScABKHMlwAEofILAASh3wB6M/GDAAIQEPgI9HMABKJkursEBAAEUwAEonsAejPwCAWDAAIQEAMAARntKwAEorQA/TsABKNfAASjgAACSS2CSAgEmwAEo1wGCwAEo4sAejPxgkgJJwAEo7iEcwAEo/oPAASjywB6NnUEBAAErAMAA9dI+AkXAASkRAcABKRrAASkcAABbYMAA9HkBkwEcwAEpI4XAASkhwB6OXVwBAAEWwAEpMYPAASklwB6NnVrAAPVMAMAA9aYBjcABKTnAHo5dHMABKTqFwAEpOcAejl1dAQABlADAAPWePgE9HMABKVOEwAEpSsAejhWUQAEAARzAASlsg8ABKWHAHo2dRAEAAYXAASltwB6OXQDAAPUsAJIePRzAASm4NQAAAAEAXcAA9R0BYJICARbAASmFLraywABGcyMcwAEpm4UAwB6O/EEBAAErAMAA9dIXwAEphS62sjHAASm0YJICAMAARnOFAMAejvwBXcAA9R0BYJICTwEAAYTAASm8wB6OFQDAAPUuPz0cwAEp1S6uwQEAAYTAASnawB6OFQDAAEZ7PghOwAEqEsABKhwAAJW6XcAA9R0BYJICARzAASpXIMABKi7AAIP+AAFgkgIAAK7CAgACFsABKlsutsbAAIOvgMABKmLAHoynAMAAg/s9F8ABKnAutq4mwAEqcAEcwAEqgi6uwgAAAADAAIO8YMAAf0zAAEZuPRfAASqPLravJsABKo8BHMABKqoursIAAAAAwACDvF3AAFCBAWDAAEU/wABGbz0XwAEqty62sCbAASq3ARzAASrXLq7CAAAAAMAAg7xgwAD0ecAARnBOwAEq9cABKwEAAJQ0XcAA9R0BYI5jASbAASr1ARzAASsDLq7CAAAAAMAAg7xdwAD1HQFgjmNJwAErEBzAASsegsABKxTAHo+CQQEAASsAwAD10j4CPRzAASsxLq7BAQABH8ABKzrAAIQKAQABHsABK0nAAINlAQABgcABK1jAHoy2AAAAwABGe0rAASttAD9JwAErgyEcwAErk4PAASuHwB6QS0EBAAErAMAA9dI+A07AASu6wAErwAAAgtJgkgIBFsABK8yCwAErwsAej4KC0sAA9QFFwAEr2wHAASvkwAEr5gAAW2DAAPR5AZMBHMABK+2FwAEr68AekSVcAQABFsABK/uDwAEr78AekEtawAD1TADAAPWmAY3AASwDwB6RJRzAASwEhcABLAPAHpElXQEAAZQAwAD1nj4BPRzAASwahMABLBTAHpD7lEABAAEcwAEsM4PAASwowB6QS0QBAAGFwAEsNMAekSUAwAD1LACSHj0cwAEslzUAAAABAF3AAPUdAV3AAPUdAWCSAgEWwAEsTC62s8AARnQjHMABLGeFAMAekcRBAQABKwDAAPXSF8ABLEwutrMxwAEshl3AAPUdAWCSAgDAAEZ0hQDAHpHEAV3AAPUdAV3AAPUdAWCSAk8BAAGCwAEsm8Aej4IAwAD1Lj89HMABLLUursEBAAEcwAEswRbAASy6LrX0wAB+xrejAgACgsABLNbAHo+CFsABLOEugKDAAEZdAMAAfygAwABGewbAAEbVgM3AASz1wAEtBsABLb8AALekARrAASz2wADuSwAAAQPAAS0OwAEtvwAAAAMDA8ABLRMAAACA0GDAAPR5AMABLSAAAACeKGCbAADAAS0xAAAAtsVgmwAAAFwBPgQ9HMABLUMuttQBAAEnlaQAwABHa07AAS1mwAEtbAAAmW5gkRMBHMABLW4utsQDAAOAwAEtd8AekrOBwAEtfsAeksKCwAEticAeks8AwABGgz0cwAEtmi6lFwAAAADAAH+UPRzAAS2wLq7BAQABg8ABLbXAHpL2AMAARnsGwABG1oDNwAEtxMABLcnAAS6CAAC3pQAAAAEDwAEt48ABLoIAAAABAQHAAS3qAAAAjzFgmwAAAFwBPgE9HMABLnAursIAAAAAwACDvAbAAEbXgM3AAS6HwAEumMABMDIAALemARrAAS6IwADuSwAAAQPAAS6ywAEwMgAAAAEBAcABLrkAAACPMWCbAAAAXAE+BD0cwAEuxi621AEAASe3pwDAAEdrTsABLvnAAS7/AACAimCOYwEcwAEvAS62uwAAAADAAEZ8TsABLxvAAS8lAAC222DAAPXFARzAAS8nLq7CAAAAAMAAg7xJwAEvMiElwAEvQILAAS82wB6UJGDAAH/KPgE9HMABL1cursEBAAEcwAEvXC6m1wMAAxrAAS9vhmQewAEvg8AAg2UBAAGAwAEvksAek9wAHsABL6TAAINsAQABgMABL7PAHpPcAADAAEdUAMAARns+AT0cwAEv0C6uwQEAAR7AAS/ZwACAeAUABS6AwAEv/MAek9wmwAEwAwGCwAEwA8AelCRgwAB/yoHAATAOwB6UAxbAATAbgMABMBXAHpPcnCubHwAAwABGewbAAEbYgM3AATA3wAEwSMABMX4AALeoARrAATA4wADuSwAAAQPAATBRwAExfgAAAAEBAcABMFYAAACEF2DAAPR5AABcAT4BScABMGglwAEwcxzAATBsLp36AAAAAMAAg7tgwABHnj4DTsABMJfAATCeAACB02DAAEeeASbAATCXARzAATCgLp36AAAAAMAAg7tgwABHnj0cwAEwri63qQIAAoDAATC/wB6VQRbAATDSgcABMMvAHpV3t6rAAEehAMAAf5U9HMABMOYut6sCAAKAwAEw+sAelUEWwAExDYHAATEGwB6Vd7eswABHogDAAH+WPgI9HMABMTEut6kBAAGAwAExQsAelUEAwAB/lT0cwAExVS63qwEAAYDAATFpwB6VQQDAAH+WBsAARtmAzcABMYPAATGIwAEyTAAAt60AAAABA8ABMZjAATJMAAAAAQEBwAExowAAAJJQYJETAABcAT4BScABMbQhHMABMc4WwAExuC62rMAARmtBAQABKwDAAPXSPgI9HMABMd8ursEBAAEWwAEx5C62rMAARmsAwABGez0XwAEyAi62rCvAAEZrPgE9HMABMjMursEBAAGAwAEyOMAelmAAwABGewbAAEbagM3AATJRwAEya8ABN/AAALeuAAAAAQPAATKEwAE38AAAAAEBAcABMoUAAAC3r1sAAF3AAPUdAWCSAgE+A0nAATMPJcABMyiAwAEzE8AelwZgwAB/yj4BPYjAATM+wB6XBhzAATNqgMABM1XAHpcGtsEAAAAAAD9JwAEzhiXAATOfgMABM4rAHpcGYJICPgFKwAEzvwExwAEz22CSAgEUwAEz3MAelwYAAWCSAknAATP+JcABNBeAwAE0AsAelwZgjmM+Ak7AATRCwAE0SwAAkktgkgIBH8ABNFGpjQIAAhTAATSCwB6XBgABYI5jFsABNJgutb/AAEZoAErAATS1ATHAATTRYJICAYHAATTSwB6XpknAATToJcABNQGAwAE07MAelwZgkRk+Ak7AATU1wAE1PgAAkktgkgIBH8ABNUSpjQIAAhbAATWKFMABNXXAHpcGAAFgkRmSR5EbFsABNZYutb/AAEZoAErAATWzATHAATXPYJICAYHAATXQwB6YDEnAATXmHMABNfEWwAE16i619MAAfsa3sAEAAYDAATYIwB6XBgDAAH8zPgFKwAE2JwEcwAE2QBbAATYuLrX0wAB+xrexAQABJsABNmgBgMABNmjAHpcGYJETAMAAfylJwAE2iiXAATajgMABNo7A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Aic9h8ACJzvAH0vylBMewAInSsAAg2UBAAGAwAInWcAfSHEAjByHAMAfS/IAwABGewbAAEcxgM3AAid0wAInhcACKloAALiWARrAAid1wADuSwAAAQPAAieYwAIqWgAAAAMDA8ACJ6YAAAC4l2CbAADAAie3AAAAuJhgmwAAwAInywAAAJvNYJsAAABcAT4JPRzAAifbLrbUAQABJ7iZAMAAR2tOwAIoCsACKBQAAJVPYI5jARzAAigWLra7AAAAAMAARnxOwAIoM8ACKDgAAJJMYJETARzAAig6LrbIAAAAAMAARoVOwAIoWcACKGgAALesYMAAR4cBHMACKGout8gAAAAAwAB/mE7AAiiPwAIomwAAt6pgwABHhwEcwAIonS63yQAAAADAAH+XScACKLQWwAIox4XAAii4wB9NA7fKwABHkz4CPYzAAijZwB9M4hzAAijnFsACKOAutfTAAH7Gt8sBAAGEwAIpAcAfTOIAwAB/Iz0cwAIpHYXAAikOwB9NA7fMAgACFsACKS4utfTAAH7GhMACKTbAH0ziAMAAR5o/TsACKVHAAilYAACBEGCREwEcwAIpaRbAAiliLrX0wAB+xriaBQAFgMACKXXAH0yAhMACKYDAH0zigcACKYbAH0yNg8ACKZTAH0zBgsACKZ/AH0yaAMAAfxZJwAIprhbAAim+hsACKbLAH00mt8rAAEeTPgI9j8ACKdDAH03BHMACKeAWwAIp2S619MAAfsa3ywEAAYfAAin6wB9NwQDAAH8jPRzAAioVhsACKgnAH00mt84CAAIWwAIqIy619MAAfsaHwAIqK8AfTcEAwABHmT89HMACKj4ut60BAAGHwAIqT8AfTcEAwABG2QbAAEcygM3AAipfwAIqcMACKr8AALibARrAAipgwADuSwAAAQPAAiqEwAIqvwAAAAEBAcACKosAAACPMWCbAAAAXAE+AT0cwAIqmC6lFgIAAisWwAIqtBbAAiquLp2OwAB/i5JRpPAAwAB/kwbAAEczgM3AAirEwAIq1cACK4sAALicARrAAirFwADuSwAAAQPAAirnwAIriwAAAAEBAcACKu4AAACPMWCbAAAAXAE+BD0cwAIq+y621AEAASe4nQDAAEdrTsACKynAAis0AACSR2COYwEcwAIrNi62uwAAAADAAEZ8PRzAAitJLqUXAAAAAMAA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ApJWwB+fYmCpLz4BPYzAApKQwB+fYhzAApKdLqbWAQABhMACkrjAH59iAMAAR3Q/SsACks8BNcACkt0AAAEAYI5jARzAApLdFsACktYutfTAAH7GqlsCAAIrhMACkvPAH59iAMAAfyU1AAAAAQBbARfAApMAhcACkv7AH6CzlBOCwAKTDcAfntCMHIUAwB+gswbAAEdZgM3AApMgwAKTKsAClGkAALeGAAAAAQPAApM/wAKUaQAAAAUCAsACk0gAAAAiYIiTAMACk1UAAACEF2DAAPR5AAPAApN9AAAAgeddwAD1HQFgiLEBK8ACk4oAAABaYMAA9HkBK8ACk5cAAAC1yWDAAPKzASpgkRMBPgI9IxzAApO9g8ACk7bAH6FnQQEAASsAwAD1nIvAApO2wB+hZxrAApPBg2wrAWDAAPR5SsACk88BH8ACk9qn7QEAARzAApP2LqbXBQADgMAClAzAH6E3gcAClBXAH6FDg8AClCHAH6FnAoHngsAClDrAH6FTtcmEwAKUVMAfoXbAAEdUAAbAAEdagM3AApRuwAKUeMAClY8AALbNAAAAAQPAApSOwAKVjwAAAAICAsAClJkAAACSUGCREwDAApSsAAAAImCIkwAAYJETAT4BSsAClVABHMAClVcut4YCAAKBwAKVbcAfokYWwAKVgIDAApV2wB+iOZQTjBwAwABHWQbAAEdbgM3AApWUwAKVrMAClqcAALXjARrAApWVwADuSwAAAQPAApXDwAKWpwAAAAIBAsAClc8AAACSR2COYwDAApXmAAAAhBdgwAD0eQEcwAKV85SBVgAAAADAAPScAGCN6wE+Aj0XwAKV/i62pyrAAEZiSsAClikBNcACljQAAAEAYKhmAR/AApY0qGoBAAEfwAKWWpImAQABgMAClnfAH6K9AAA1AAAAAQBbARfAApaMgsAClorAH6MFlBOBwAKWmcAfosqMHIIAwB+jBQbAAEdcgM3AApaswAKWuMACmAoAALj+AAAAAQPAApbUwAKYCgAAAAQDBMAClugAAACB02CNXgDAApcCAAAAVGCnZwDAApcYAAAAkkdgjmMAwAKXLwAAAIQXYMAA9HkBHMAClzyUgVYAAAAAwAD0nABgjesBPgI9F8ACl0cutqcqwABGYkrAApdyATXAApd9AAABAGCoHwEfwAKXfagmAwADgMACl6bA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wABQgQFgwABFPwE+A07AArKBwAKyiQAAg+ZgwABFPwEWwAKyloDAArKLwB+1boPmwABQg0nAArKjIiXAArKvgsACsqfAH7WiYMAARMkAFsACsugWwAKy3BTAArLUwB+1ogIBYMAARMmdZsAAUAmxI8AATxs+Bk7AArMOwAKzHAAAnX5gkuEBJsACsw4BFsACszIWwAKzJhTAArMewB+1ogIBYMAARMmdZsAAUAmB08AATwhgkuFOwAKzRcACs1AAALBpYMAA8rMBIRzAArNiFsACs1Iutq7AAEZuQQEAARrAArN1wAB/UgDAAPXSTsACs5AAAAAiYIixAE7AArOkwAKztAAAtclgwADyswEqScACs8MiIRbAArPILra5wABGdwAlwAKz8hbAArPrg8ACs93AH7YLklGMG2CMzj4CPY3AArQGwB+2ghzAArQ5GsACtBaHUIHrAwADFsACtF6AwAK0U8AftW6EGMAAUIUWwAK0foDAArRzwB+1boQXwABQhBbAArSpFsACtKSDwAK0lsAftguAsJLlWsAA9mEAiKZJwAK0uiIiIYHAArS/wB+1gwAhhMACtNzAH7ZLABbAArTqLoHgwABGYT4CPRzAArUxLp04AwADFsACtUSFwAK1PMAftoKFboi2FsACtVuFwAK1U8AftoKEF4i0FsACtW+FwAK1Z8AftoJaiLUAwABHaD2OwAK1gsAfto8pP0nAArWxHMACtcUWwAK1tS62rsAARm5BAQABGsACtdjAAH9TAMAA9dI+AT2NwAK17MAftoIcwAK2IRrAArX8h06B6wMAAxbAArZGgMACtjvAH7VuhBjAAFCFFsACtmaAwAK2W8AftW6EF8AAUIQWwAK2kRbAAraMg8ACtn7AH7YLgLCS5VrAAPZhAIimPgFKwAK2sQGAwAK2uMAftW5KwAK20gEfwAK23cAAUIwDAWDAAEU/AzXAArcOAAABAGDAAETJAR/AArcOwABE0wIAAhbAArczg8ACtyXAH7YLgLCS5SsANQAAAAEAWwEcwAK3TYfAArdLwB+4Zp0+AQABH8ACt1bAAES6AwACFsACt32DwAK3b8AftguAsJLlhcACt4PAH7aCAbXJhsACt63AH7aPAMAAUAyHAMAfuGYWwAK31YDAArfKwB+1boQXwABQhBbAArf2gMACt+vAH7VuhBjAAFCFAD9KwAK4CgGAwAK4EcAftW4GwABHZYDNwAK4JMACuDvAArqVAAC3DgEawAK4JcAA7ksAAAEDwAK4UsACupUAAAACAgLAArhkAAAAVGCPLQDAArh6AAAAkkdgjmMAAGCOYwE+BUnAAriMHMACuJqAwAK4kMAfuVlBAQABKwDAAPXSSsACuKMBgcACuKrAH7llP07AArjLwAK41wAAlVRdwAD1HQFgjmMBHsACuOXAAPUjAQFgjmMBHMACuQIWwAK4+y619MAAfsa4XQEAAYDAArkWwB+5WQDAAH7yAEbAArknwAK5ZwAAAAEAYMAA9cUAHMACuUwWwAK5RS619MAAfsa4XgEAAYDAArlbwB+5WQDAAH7xPgJOwAK5PAAAAJT9YI87ASbAArknAYPAArk8wB+5+mCPOz0cwAK5e4LAArlvwB+5p08BAAEWwAK5hYTAArl/wB+6LICKjz4AwAD1LkbAArmXwAK5ycACuacAAAAfYI5jABbAArm/gsACubPAH7mnmAHAAPVNPgE9icACudHAH7llH8ACueKQ8AIAAh/AArn1kiYDAAGDwAK6EsAfun4Cg+ApghcWwAK6VRbAArpJFsACuj8uhCrAAEZXmw2ZE5SmjPyBwAK6acAfuWUASsACuoABgcACuofAH7llBsAAR2aAzcACuprAArqrwAK67wAAuQoBGsACupvAAO5LAAABA8ACurbAArrvAAAAAQEBwAK6vgAAAJJbYI0TAABgwADyswFKwAK6yQEcwAK60IDAArrJwB+7N0EBAAEWwAK63RbAArrTLoQqwABGV5rymQEAwAD10gbAAEdngM3AArr0wAK7C8ACxSMAALcxARrAArr1wADuSwAAAQPAArsgwALFIwAAAAkEBMACuzMAAACEPGCOYwDAArtCAAAAgLBgkjIAwAK7UgAAAFRgjy0AwAK7YQAAAIMVYMAA9HkABcACu3UAAAC3RWDAAPKzASrAArudAAAApJFgwADyswEqwAK7vAAAAKYoYMAA8rMBKsACu94AAACEPWDAAPKzASrAArv7AAAAlRpgjRMBK2COYwE+A0nAArwTIiEcwAK8JxbAArwXLrauwABGbkEBAAEawAK8OsAAf1IAwAD10gAhhMACvEPAH7vmPgFKwAK8YQEcwAK8aC6m1wMAAxzAAryzGsACvIaGZ4TNAQABJ7kLAIiug8AC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wALGBC6AoMAARl0DneCDwALGHcAfwzuB54TAAsYywB/DS4RzhcACxkXAH8NfqvwGwABHaYDNwALGV8ACxmjAAsikAAC3UQEawALGWMAA7ksAAAEDwALGfsACyKQAAAAFAwPAAsaHAAAAImCIkwDAAsaUAAAAhBdgwAD0eQDAAsakAAAAWmDAAPR5AALAAsa4AAAAneBgwADyswEqwALG4AAAAIHnXcAA9R0BYIixAStcAT4DTsACx7PAAse8AACEc2CI6wEWwALHyxbAAsfGgMACx77AH8QGghqIlYRziI5JwALH2SEcwALH7RbAAsfdLrauwABGbkEBAAEawALIAMAAf1IAwAD10j4BPY3AAsgOwB/EWRrAAsgiiPI/PRzAAsgzLp04BgADgMACyD7AH8QGgcACyEfAH8QSgsACyFPAH8QhA53gg8ACyG/AH8QwgeeEwALIhMAfxECEc4XAAsiXwB/EWcAAR2gGwABHaoDNwALIqcACyLrAAsrJAAC4AwEawALIqsAA7ksAAAEDwALI1cACyskAAAADAwPAAsjpAAAAg4FgwABPAQDAAsj6AAAAgLBgwAD2XQDAAskEAAAAhBdgwAD0eQAAXAE+Ak7AAskrwALJMwAAgeddwAD1HQFgiLEBIxbAAsk+gMACyTXAH8VBlD3AAE8YKzHAAslzYIixARzAAsngHMACybsawALJh4RthM0BAAGBwALJycAfxVAAiK6B6wMAAxbAAsoLgMACygLAH8VBhBjAAE8GFsACyh2AwALKFMAfxUGEF8AATwcWwALKLoHAAsopwB/FUFrAAPZhAIiaAV3AAPUdAWCIsT0cwALKRy6dOAQAAxzAAsp2GsACyliEa4TNAQABgcACyoTAH8VQAIiugsACypPAH8VfFsACyqSBwALKn8AfxVBawAD2YQGB54PAAsq9wB/FdMAAR2gGwABHa4DNwALKzsACyt/AAsskAAC21AEawALKz8AA7ksAAAEDwALK6cACyyQAAAABAQHAAsrxAAAAgLBgwAD2XQAAXAE+AAbAAEdsgM3AAsspwALLP8ACy7sAALkNARrAAssqwADuSwAAAQPAAstMwALLuwAAAAICAsACy1QAAAC3ZGCNEwDAAstmAAAAjzFgmwAAAGCPDAE+AUrAAstzATXAAst+AAABAGCPDAEfwALLfo8aAQABgMAC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v2DAAPR5AMAC2x4AAASSUWDAAE+yAMAC2ysAAASEF2DAAPR5AABgwABHhwE/BQgBwABHioAAwB/YpQgBwABHi4EAwB/YtAgBwABHjIIAwB/YwwgBwABHjYMAwB/Y0gkBwALa4cAATyQAAAAADAbAAEePgM3AAts7wALbT8AC22gBAIQYARrAAts8wADuSwAAAQPAAttXwALbaAAAAAAAAABgwAD23gFKwALbWgEWwALbYRbAAttaLpJRwABHjIQYwABP6AbAAEeQgM3AAtttwALbdsAC26MBALjkAAAAAQPAAtuEwALbowAAAAAAAABgwADyswFKwALbhwEcwALbjBbAAtuHLoIcwABHikEBAAEawALbnsAAf4IAwAD10gbAAEeRgM3AAtuowALbscAC2+QBALjwAAAAAQPAAtvCwALb5AAAAAAAAABgwADyswFKwALbxQEcwALbyhbAAtvFLoIcwABHikEBAAEawALb3MAAf4MAwAD10gbAAEeSgM3AAtvpwALb8sAC3B0BALjuAAAAAQPAAtv/wALcHQAAAAAAAABgwADyswFKwALcAgEcwALcBxbAAtwCLoIcwABHikEBAAEawALcGcAAf4QAwAD10gbAAEeTgM3AAtwiwALcK8AC3EcBALfKAAAAAQPAAtw0wALcRwAAAAAAAABgwADyswFKwALcNwEWwALcPRbAAtw3LrE6wABHiYNowAD1AAbAAEeWgM3AAtxMwALcUcAC3KgAALjoAAAAAQPAAtxZwALcqAAAAAEBAcAC3GQAAACSUGCREwAAXAE+AkAWwALcfC645MAAR5DAAtx8wALciQA9HMAC3JYWwALckC6xOsAAR4lPAQABgMAC3JrAH9sGAMAA9S4GwABHl4DNwALcrcAC3LLAAt0PAAC48gAAAAEDwALcvcAC3Q8AAAABAQHAAtzIAAAAklBgkRMAAFwBPgJAFsAC3OAuuPDAAEeRwALc4MAC3PAAPRzAAtz9FsAC3PcusTrAAEeJTwEAAYDAAt0BwB/bfADAAPUuBsAAR5iAzcAC3RTAAt0ZwALdbgAAuO8AAAABA8AC3SDAAt1uAAAAAQEBwALdKwAAAJJQYJETAABcAT4CQBbAAt1DLrjuwABHksAC3UPAAt1PAD0cwALdXBbAAt1WLrE6wABHiU8BAAGAwALdYMAf2/IAwAD1LgbA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wALmrcAC5rAJgKAAYMAA9t4AAQXAAEfDgM3AAua1wALmtcAC52AAAAADwALmxcAC52AAAAAEBATAAubLAAAEnvBdwAD1HQFgwABEmADAAubcAAAEhBdgwAD0eQDAAubtAAAEWmDAAPR5AMAC5voAAASAoGDAAPbeAABgwABHtwE+AUnAAucFNQAAAAEAYMAA8rMBNQAAAAEAXcAA9R0BYMAARJgBFsAC5wkunvDAAEe5IxzAAucVhADAH+dgQQEAASsAACsWwALnFYQAwB/nYID8wAD0/wFgwADysyMcwALnHYQAwB/nVEEBAAErAAAqhADAH+dUAWDAAPKzPgE9MMAC5y8nuRg/BQgBwABHuYAAwB/nBAgBwABHuoEAwB/nGQgBwABHu4IAwB/nKAgBwABHvIMAwB/nNgkBwALmtcAA9dsAAAAABAbAAEe+gM3AAudlwALncsAC7HQAALiPAAAAAQPAAueDwALsdAAAAAYGBsAC56AAAACECWCq6QDAAufRAAAAlNxdwABQgQFgwABFPwDAAugDAAAAkl5dwAD1HQFgwABFRwDAAuglAAAAtdRgjlQAwALoRAAAAJJMYJETAMAC6FQAAACUfmDAAPR5AABgjjgBPgVOwALodsAC6HsAAIIXYJKcASbAAuh2ARzAAui4FsAC6LAcwALohS64BgIAAoHAAuiUwB/oS4LAAuigwB/oYADAAEe/g+bAAFCDnvEBAAGAwALovsAf6D4AwABFQWCSnE7AAujmwALo+wAAlGxdwAD1HQFgkgIBMcAC6RJgkgIATsAC6TTAAulEAACUbV3AAPUdAWCSAgExwALpW2CSAgBJwALpYyEcwALpchbAAulnLp7wwABHuUEBAAErAMAA9dI+AkbAAumDwALpvsAC6aUAAACAz2DAAESYABbAAumyLp7wwABHuT4BScAC6cgWwALp1hTAAunMwB/pcAkAtcbAAE9TPgE9HMAC6fsUwALp68Af6SUIAE8BAAEWwALqCRTAAun/wB/pcAkAgdPAAEScAMAA9S4+AT0cwALqQofAAuotwB/pBU8BAAEWwALqUBTAAupGwB/pcAkAgdPAAEScAMAA9S49HMAC6oEUwALqccAf6SUIAICiAQABNMAC6oYDwALqhsAC6ucAAAACAgLAAuqbAAAAgWZgkgIAwALqsgAAAIHaYJICAABg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acAgk90AAWCNMQA1AAAAAQBbARfAAK59hsAArnvAIJZPklEWwACujRTAAK6GwCCT3QABYI0xkmmNG4wbhgDAIJZPP0rAAK6vASbAAK6vAR7AAK62mX8EAAQkwACu1wEWwACuyoDAAK7DwCCT3YUDwAD12Se5uxzAAK7qlIFWAAAAAMAA9JwrAGCNnwbAAEhXgNLAAK78wACvEcAArz8AAbm9wABIFwAAAAEDwACvGMAArz8AAAABAQHAAK8jAAAAhDBgjZ8AAGCN3AFKwACvMQEWwACvO4DAAK8xwCCXTYIcjaIGwABIWIDSwACvkMAAr5zAALMTAAG5vsAASBcAAAABA8AAr7LAALMTAAAAAQEBwACvvQAAAIQwYI2fAABgwADyswE+BknAAK/OJcAAr9yAwACv0sAgl6VgwABIYT4BSsAAr/oBHsAAsA2n/wEAASbAALApARbAALApFMAAsB/AIJelAAFgwABIYbl1wABIF8AASGRgp/cAP0nAALA8IiEcwACwTxbAALBKgMAAsEDAIJelghyNokEBAAEawACwYI3kAMAA9dIAHsAAsIKoxgEAASbAALCYAYDAALCYwCCXpWCovwA+AUnAALE8IiEcwACxTxbAALFKgMAAsUDAIJelghyNokEBAAEawACxYI3lAMAA9dIBIRzAALGKFsAAsYUWwACxgIDAALF2wCCXpYCwjReAsJI1QQEAASeAsgDAAPZsPgFKwACxngEpPz9OwACxwcAAscoAAJJPYI44ARbAALHWgMAAsczAIJelkk+NpEbAALHkwACyGcAAse0AAACAz2CSAgAWwACyA4HAALH6wCCYxZRsjj8+AUnAALIhHsAAskGpiQEAASbAALJTAYLAALJTwCCY8GCpfABKwACyXwEpP0bAALJ2wACypsAAsn8AAACAz2CSAgAWwACylYHAALKMwCCYxZRtjkA+AUnAALKuHsAAss6piQEAASbAALLgAYLAALLgwCCZRGCpfABKwACy7AEpP0rAALMDASoAACBmwgAgZxQAIGjCACBtNgAgc2kAIIEQACCECgAghgMAIIkvACCKTQAgkTUAIJHYACCTswAglx8AIJd3ACCZlgAAAA8CwABIYYDSwACzZsAAs2zAALXrA7m/AAABYI2fAAABBMAASGSA0sAAs9jAALPeCbl1wABIFwBgjTEAAQXAAEhqgNLAALPjwACz48AAtW8AAAADwACz9MAAtW8AAAAEBATAALQBAAAAgLBgkjIAwAC0FQAAAIIcYI3cAMAAtCgAAACST2COOADAALQ3AAAEuXVgjTEAAGDAAEhhAT4BPRfAALVNLpQTFsAAtWEWwAC1Wi65dcAASBfAAEhklBOMHIwcAggBwABIZIMAwCCaYgkAwAC0R43aBAADgMAAtFrAIJo7gcAAtGzAIJpIIxzAALSDgcAAtH7AIJpIQQEAARrAALSUjeQAwAD10h/AALSxwABIcwEAAYPAALTWwCCaYgAfwAC09MAASHIBAAGDwAC1GcAgmmIAAWDAAEhrAYQYFsAAtT6DwAC1N8AgmmKEGI0YAgbAAEhmgNLAALV0wAC1jcAAtaYBAJStARrAALV1wADuSwAAAQPAALWYwAC1pgAAAAAAAABgklkBSsAAtZsBFsAAtaIWwAC1my65dcAASBfAAEhkgheNMwbAAEhogNLAALWrwAC1ssAAtekAAbnAAAAAAQPAALW6wAC16QAAAAEBAcAAtc0AAACdOmDAAEhhAABbAUrAALXaARbAALXjgMAAtdrAIJuuuXXAAEgXwABIZAAAIJstACCbhAAgm94AAAACAsAASGuA0sAAtzTAALc6wAC49AO5wQAAAWCOOAAAAQTAAEhugNLAALd9wAC3gwm5dcAASBcAYI0xAAIFwABIcoDSwAC3iMAAt4jAALfeAKJ/AAPAALeswAC33gAAAAEBAcAAt7IAAAS5dWCNMQAAYMAASGsBPwIIAcAASG6AAMAgnFAJAMAAt8KOUwEAAR/AALfMkcsAAAAAAAXAAEhzgNLAALfjwAC348AAuIMAmcsAA8AAuAfAALiDAAAAAQEBwAC4DQAABLl1YI0xAABgwABIawE/AggBwABIboAAwCCcrwkAwAC4HY5TAgABH8AAuCeRywAAAAABlGwxwAC4XGCSAgEfwAC4YcAASIABAAGAwAC4esAgnK8AAQbAAEhwgNLAALiIwAC4ocAAuPIBAJTcARrAALiJwADuSwAAAQPAALiswAC48gAAAAAAAABgklkBSsAAuLUBIxbAALjKFsAAuLUulGyOP4D8wAD0/xbAALjbFsAAuNQuuXXAAEgXwABIboIXjTMgwAC46JKAAAAAAAFgklkAACCdCgAgnYYAAAABAsAASHSA0sAAu6PAALupwAC90wO5wgAAAWCSAgAAAQTAAEh3gNLAALvuwAC79Am5dcAASBcAYI0xAAEFwABIgIDSwAC7+cAAu/nAALxSAAAAA8AAvBHAALxSAAAAAQEBwAC8FwAABLl1YI0xAABgwABIdAE/AggBwABId4AAwCCd8wkAwAC8J5IlAgABJ4CoAYPlFsAAvEaAwAC8P8AgnfOD5Y0+BQbAAEh5gNLAALxXwAC8bMAAvI0BAIPlARrAALxYwADuSwAAAQPAALx4wAC8jQAAAAAAAABgwADyswFKwAC8ewEWwAC8ghbAALx7Lrl1wABIF8AASHeD5Y0+BsAASH2A0sAAvJLAALynwAC84wIAg+UBGsAAvJPAAO5LAAABA8AAvLLAALzjAAAAAQEBwAC8uAAAAICKYMAA8rMAAFwBPgE9F8AAvMwWwAC8xS65dcAASBfAAEh3g+WAwAC82sAgnsWNTQbAAEh6gNLAALzowAC8/cAAvTQBAJS6ARrAALzpwADuSwAAAQPAAL0UwAC9NAAAAAAAAABgwADyswFKwAC9FwEWwAC9HhbAAL0XLrl1wABIF8AASHeUuo1EBsAASH6A0sAAvTnAAL1OwAC9oAIAlLoBGsAAvTrAAO5LAAABA8AAvWTAAL2gAAAAAQEBwAC9agAAAICKYMAA8rMAAFwBPgE9F8AAvX4WwAC9dy65dcAASBfAAEh3lLqAwAC9l8Agn4iNUwbAAEh7gNLAAL2lwAC9vsAAvdEBAIIXARrAAL2mwADuSwAAAQPAAL3DwAC90QAAAAAAAABgklkBSsAAvcYBFsAAvc0WwAC9xi65dcAASBfAAEh3gheNMwAAIJ45ACCekgAgnvwAIJ9VACCfvwAgoBYAAAAFAAABgNIAIKA1ACA0LwAgPEIAIGW7ACCZ2wAgm+8AIJ2TACCgMwAAAAYAIKA1AAAAAADAAEiBucOA0wAAEYD4AACL8wABAQiVAJI2lfmUMJRQlGGUEJJBgdMAAJgAAAEBAZm+ghYAAJiuAAEBAZp9gk8AAJoaAAEBAYGjgn4AAKpqAACCoQAAwAB/SwABAQG2coLaAACb6QABAQGbeIL+AACDaAABAQWEboGyhJOIW4qeg6kAAMAAg3YAAQEBucSD7AAAwAB+tgABAQG1t4QxAACkDQABAQSjC6MMoxOjFITmAADAAEgNAAEBBLZ4tnqjvrZ8hSoAAJl7AAEBBISikbubj5t7hYIAAMAASj0AAQEBpXWF0wAAqzkAAQEBnpWGFAAAwACDeQABAQS2g7aGtoe5xYZ4AADAAH9ZAAEBAbaCAAAAAQLAAEiCgNOGpYarwAB2XAOjwgAAAWDAAIOtAAAMBMAASISA04bthvQJhAkAXas6AmDAAFBOWwAEwABIhYDThw6HFwmEKwBgmAwABMAASIaA04cshzUJhCoAYJivAATAAEiHgNOHRYdRCYQ3AGDAAPKzAATAAEiIgNOHYYd6CbalAGDAAPKzAATAAEiJgNOHmYesCaPIAGDAAEpkAATAAEiKgNOHtYfTGLnGAGDAAPR5AZMEwABIi4DTh9uH8Rij3ABgwAD0eQGTBMAASIyA04gDiA8YlJUAXcAATs0CYMAAUE5bASsEwABIjYDTiBmIPRi5xwBgwADyswEqBMAASI6A04jMiNcYlmwAYKT2AATAAEiPgNOI7IjvGICgARqI3cAA7ktgwAD23gABBcAASO6A04j0iPSKkAAAAAOJAIqQAAAABAQEiRYAAACECV2rOgJgwABQTlsAiSQAAASEK2CYDACJNAAABIQqYJivAIlKAAAEo8hgwABKZAAAYMAASIIBPwkIAcAASIWBAMAgotAIAcAASIaCAMAgotsIAcAASImDAMAgouYIAMAASISAiXHAIKK+CADAAEiPFomQgImIwCCivoQYq0UIAMAASI4WibeAia/AIKK+nY7AAE9zCADAAEiHHIoFFon3FonwFonpgInhwCCivpHkqz2B06WJnQ+kFoQ3AQABFooagIoSwCCivoCgq1IAglAIAMAASIgWinQWimYWil8WiliAilDAIKK+keSrPYHTpYmdD6QWhDiCRwkBiPTAAIPnAAAAAFwGwABIkYDTipWKpotsAAC23wEaipbAAO5LAAABA4q1i2wAAAABAQGKugAAAIDQYMAA9HkAAFwBPgI9HIrHLrbUAQABJ7bgAMAASOhJiuccivGAiuvAIKPvgIsBAAGTAMAA9ag+Aj0civ4uucgBAAEciwyAiwbAIKPvgUEBAAGUAMAA9Z8AwACDsz0cixgursEBAAEcix0ursIBAAEaiyvAAIObAMAAg7wAwACDuT4BPRyLSi6uwQEAARqLWcAAg5sAwACDuQbAAEiSgNOLcYuCjC0AALbVARqLcsAA7ksAAAEDi42MLQAAAAMDA4uUAAAAp1hgmwAAi6YAAAC21mCbAACLvgAAAJvNYJsAAABcAT4DPRyLzi621AEAASe21wDAAEjoPRyL6i65yAEAASMcjAOBi/LAIKS/QQEAASsAwAD10pSVAWDAAPR5AMAAg7M9HIwZLq7BAQABgIwewCCktADAAIO5BsAASJOA04wyjEOM7wAAuckBGowzwADuSwAAAQOMTIzvAAAABAQEjFoAAAC5ymCbAACMbQAAALnLYJsAAIx+AAAAt4BgmwAAjI4AAAC3cmDAAPKzAABcAT4DPRyMnS621AEAASe5zADAAEjoSYy3g4y7wCCldj0cjMQuucgBAAGUAMAAg7M/PRyM1C65yAEAAZQAwACDswbAAEiUgNOM9I0FjYYAALnNARqM9cAA7ksAAAEDjSWNhgAAAAEBAY0sAAAAp1hgmwAAAFwBPgI9HI0+LrbUAQABJ7nOAMAASOg9HI1sLq7CAAAAAMAAg7wGwABIlYDTjYuNnI3eAAC5zwEajYzAAO5LAAABA42tjd4AAAABAQGNtAAAAI8xYJsAAABcAT4BPRyNwS621AEAASe50ADAAEjoBsAASJaA043jjfSOPgAAudEBGo3kwADuSwAAAQOOCY4+AAAAAQEBjhAAAACPMWCbAAAAXAE+AT0cjh0uttQBAAEnudIAwABI6AbAAEiXgNOOQ45UjugAALnTARqORMAA7ksAAAEDjo6O6AAAAAEBAY6VAAAAjzFgmwAAAFwBPgE9HI6iLrbUAQABJ7nUAMAASOgGwABImIDTju2O/o89AAC51QEaju7AAO5LAAABA48Kjz0AAAABAQGPEQAAALnWYJsAAABcAT4BPRyPJS621AEAASe51wDAAEjoBsAASJmA049Cj1OPsAAAt/sBGo9DwADuSwAAAQOPXY+wAAAAAgICj2QAAACnWGCbAACPdgAAALf8YJsAAABcAT4CPRyPii621AEAASeUdADAAEjoPRyPoi65yAEAAZQAwACDswbAAEiagNOPtY/Gj/0AALnYARqPtsAA7ksAAAEDj9GP/QAAAAEBAY/WAAAAgNBgwAD0eQAAXAE+AT0cj+MuttQBAAEnudkAwABI6AbAAEibgNOQApATkIMAALnaARqQA8AA7ksAAAEDkDiQgwAAAAEBAZA/AAAAudtgmwAAAFwBPgE9HJBSLrbUAQABJ7ncAMAASOgGwABInIDTkIiQmZDpAAC53QEakInAAO5LAAABA5CukOkAAAABAQGQtQAAALnbYJsAAABcAT4BPRyQyC621AEAASe53gDAAEjoBsAASJ2A05DukP+RQgAAud8BGpDvwADuSwAAAQORFpFCAAAAAAAAAFwBPgE9HJEfLrbUAQABJ7ngAMAASOgGwABInoDTkUeRWJG7AAC4fAEakUjAAO5LAAABA5FokbsAAAADAwORbQAAAIDQYMAA9HkAkXoAAACnWGCbAACRjAAAAJvNYJsAAABcAT4BPRyRnC621AEAASe4fQDAAEjoBsAASJ+A05HAkdGSJQAAuH4BGpHBwADuSwAAAQOR65IlAAAAAQEBkfIAAACPMWCbAAAAXAE+AT0ckf8uttQBAAEnuH8AwABI6AbAAEiggNOSKpI7kp4AALebARqSK8AA7ksAAAEDkk6SngAAAAICApJVAAAAt5RgmwAAkm8AAACPMWCbAAAAXAE+AT0cknwuttQBAAEnlOoAwABI6AbAAEihgNOSo5K0kwQAALecARqSpMAA7ksAAAEDksyTBAAAAAEBAZLTAAAAjzFgmwAAAFwBPgE9HJLgLrbUAQABJ7edAMAASOgGwABIooDTkwmTGpNkAAC4+QEakwrAAO5LAAABA5Mvk2QAAAABAQGTNgAAAI8xYJsAAABcAT4BPRyTQy621AEAASe4+gDAAEjoBsAASKOA05Npk3qVEQAAuDIBGpNqwADuSwAAAQOTjZURAAAABAQEk5kAAACA0GDAAPR5AJOmAAAAp1hgmwAAk7gAAACbzWCbAACTzQAAAIIcYMAAg0MAAFwBPgQ9HJPZLrbUAQABJ7gzAMAASOhAHJQKgJQEwCCqd0EBAAGTAMAA9ZyUBJQOAEmUTCIiIRyUVYOUUMAgqppBAQABGpRjwACDTQDAAPXSAB6UhsAA7l4CAAIclJAunfoAAAAAwACDuyeBQQAAHpSowADuXgIAAhaUvYGUssAgqoSDZpsbgpTDwCCqjwA+Aj0clNYursIAAAAAwACDvD0clOMursEBAAEngVYAwACDuT89HJT9Lq7BAQABgZUCwCCqhADAAIO5BsAASKSA05UWlSeV5AAAueEBGpUXwADuSwAAAQOVP5XkAAAAAgIClUYAAACPMWCbAACVWAAAAIIcYMAAg0MAAFwBPgM9HJVkLrbUAQABJ7niAMAASOhJlYoelY7AAO5eAgACHJWYLp36AAAAAMAAg7sngUEAPgI9HJWuLq7CAAAAAMAAg7w9HJW7Lq7BAQABJ4FWAMAAg7k/PRyV1S6uwQEAAYCV2sAgq5cAwACDuQbAAEilgNOV6ZX6lmcAALgEARqV6sAA7ksAAAEDlgmWZwAAAAICApYQAAAAuAVgmwAAliUAAAC3/GCbAAAAXAE+Aj0cljkuttQBAAEnlf0AwABI6D0cllkuucgBAAGUAMAAg7MGwABIpoDTlmyWfZ9NAAC54wEalm3AAO5LAAABA5aRn00AAAADAwOWnwAAALnkYJsAAJa1AAAAkndgmwAAlsMAAACbzWCbAAAAXAE+Cj0cltMuttQBAAEnueUAwABI6EmW+RyXBIGW/cAgrLVBAQABKwDAAPXSPRyXDS6uwgAAAADAAIO8P06XK5cwAACAsGDAAPXFARyXMi6uwgAAAADAAIO8TpdDl0wAAJHwYJsAASaXQwEcl04ursIAAAAAwACDvGCbAD0cl1kutx0BAAEWl3OAl2TAIKyqhBebCQDAAIPESZeEJZeNg5eIwCCtCmDAAIQESpegAD9Ol7mXyAAAueZgwABPAQEcl8ouuecDAAOAl9jAIKyqKyaX7gGDl+7AIK0KYMAA9l0AwABI4z0cl/kuuegDAAMmmAcBhZgHwCCtfWDAAE/khJgXwCCtJyaYMAEWmDCFmCHAIK19gdPAAE8IYIwVAMAASOlJmD0lmFCFmEHAIK19YMAARTA+Ak6YhZiKAACCF2DAAEU/ARaYmxSYjMAgrX0FAWDAAEUwghfAAFBFSZinJZiwhpirwCCuA2DAAESlPgJOmQKZCgAAp7ZdwAD1HQFdwABPSAFgwABQTgEmmQIBFpkRFJkMwCCuAwYBYMAARKWntsAAT2BdwAD1HQFdwABPSAFgwABQTkmZIiEcmS6HmSbAIK49QQEAASsAwAD10j4BRZlDAZlMmU4AAFtgwAD0eQGTARyZVRSZU8AgrqEIAFwBAAEWmV+HmVfAIK49WsAA9UwAwAD1pgEVmWnAIK6hCByZZxSZacAgrqEIAF0BAAGUAMAA9Z4+A06Zl5meAACZMWDAAESYASaZlwEcmaeHmaDAIK49RAEAARSZqMAgrqEIAADAAPUsYMAARJhOmc6Z1wAAkfBdwAD1HQFdwABPwQFgwABQTgEWmeAUmdnAIK72CQCR8MAAT0pJmfYiIRyaAxSZ+sAgryoKAEEBAAErAMAA9dIAHJoeFpoXFJoOwCCvKgoAWsAA9UyAiwEAAZMAwAD1qD4DTprTmuEAALnpYJsAARya4y656gMAA4CbBcAgrKqCmxXAIKzAFpsrHJsnFJsfwCCvKgoARAEAAZMAwAD1LIQXwABPwwDAAEjqTptXm2MAAJQ0XcAA9R0BYI5jARybdy656AMAAxSbhcAgrX0FAWDAAEUwFJuVwCCvlAsAKwDAAEjpSZu5FpvEFJu9wCCu9gkAtcTAAE9SPgJOm/icAgAAgM9gkgIBHJxCFpwuFpwnFJwYwCCtfQUBYMAARTCB08AARTKUbIyxRAEAARScQ8AgrqEIAADAAPUsRpxXnIKcZwAAAJRfYI5jABScdcAgr9wMAD4BPRycoBSclsAgsCwNAJRAAQABFJyuwCCwcA4AAJIePgFGnPSdUZ0NAAAAlP1gkgIAFp1AFp05FJ0qwCCtfQUBYMAARTCB08AARTKUbYyyPgFJnWUcnXQWnW8UnWnAILCrDQCAsJIGQQEAARadfhSdd8AgrvYJAICwwABPTQDAAPZsPgFGnZqdxZ2qAAAAlF9gjmMAFJ24wCCv3AwAPgE9HJ3jFJ3dwCCwqw0AlEABAAEUnfHAILEODgAAkh4/Pz8/SZ6BIRyelIWehcAgrX1BAQABKwDAAPXSPgE9Hp6lmX8EAAQkntQBFp7BhZ6ywCCtfaM/wABPCie54xafB4Ce+MAgrKqEF5sJFp8TLoCgwABIjwA/PRyfJC63HQEAARafPoCfL8AgrKqEF5sJAMAAg8QGwABIp4DTn1KfY6ApAAC25gEan1PAAO5LAAABA59soCkAAAAGBgafcwAAALbiYJsAAJ+GAAAAtuNgmwAAn5wAAAC25GCbAACftwAAAIDQYMAA9HkAn8QAAACnWGCbAACf1gAAAJvNYJsAAABcAT4CPRyf5i621AEAASe25wDAAEjoPRygAC656wMAA4OgDMAgsf+EoBPAILIMKgDAAEjSBsAASKiA06AuoD+gnAAAt9EBGqAvwADuSwAAAQOgUqCcAAAAAgICoFkAAAC30mCbAACgawAAAJ34YJsAAABcAT4BPRygfS621AEAASeBtQDAAEjoBsAASKmA06ChoLKifQAAuewBGqCiwADuSwAAAQOgw6J9AAAAAwMDoMoAAACnWGCbAACg3AAAALntYJsAAKDsAAAAm81gmwAAAFwBPgg9HKD8LrbUAQABJ7nuAMAASOhOoSShLgAAue9gmwABJqEkARyhMC6uwgAAAADAAIO8YJsATqFCoUcAAICwYMAA9cUBHKFJLq7CAAAAAMAAg7xOoVqhYwAAkfBgmwABJqFaARyhZS6uwgAAAADAAIO8YJsAPRyhcC63HQEAARahhoChe8AgstKEF5sJAMAAg8RJoZcloaCEoZvAILMtYMAAhARKobMAP06h1KHdAAGj12DAAIOtARyh5y658AEAASah/gEcof4uuecDAAOAogzAILLSgaIYwCCy3SaiIgGEoiLAILMtYMAA9l0AwABI413AAFAnAWDAAFBOAMAASNA9HKIuLrnxBAAEhqJAwCCzoIOiSsAgswuFolXAILNKGqJqwACDUQDAAEjhBsAASKqA06KCopOi2wAAufIBGqKDwADuSwAAAQOip6LbAAAAAQEBoq4AAACPMWCbAAAAXAE+AT0corsuttQBAAEnufMAwABI6AbAAEirgNOi4KLxo8YAALbhARqi4cAA7ksAAAEDowKjxgAAAAYGBqMJAAAAtuJgmwAAoxwAAAC242CbAACjOAAAALbkYJsAAKNNAAAAgNBgwAD0eQCjWgAAAKdYYJsAAKNsAAAAm81gmwAAAFwBPgI9HKN8LrbUAQABJ7blAMAASOg9HKOeLrnrAwADg6OqwCC0s4SjscAgtMApAMAASNIGwABIrIDTo8uj3KQeAAC4BwEao8zAAO5LAAABA6PtpB4AAAABAQGj9AAAAI8xYJsAAABcAT4BPRykAS621AEAASe4CADAAEjoBsAASK2A06QjpDSkcQAAtvQBGqQkwADuSwAAAQOkSKRxAAAAAAAAAFwBPgE9HKRRLrbUAQABJ7b1AMAASOgGwABIroDTpHakh6ToAAC29wEapHfAAO5LAAABA6SWpOgAAAADAwOkmwAAAIDQYMAA9HkApKgAAACnWGCbAACkugAAAJvNYJsAAABcAT4BPRykyi621AEAASe2+ADAAEjoBsAASK+A06TtpP6mbAAAt2UBGqTuwADuSwAAAQOlDaZsAAAAAQEBpRQAAAC22mCbAAAAXAE+BD0cpSIuttQBAAEnt2UAwABI6E6lTKVTAACgamDAAPXFARylVS6uwgAAAADAAIO8TqVnpW4AAILeYMAA9cUBHKVwLq7CAAAAAMAAg7xJpXslpYaCpX/AILZaYMAAhAQ+AT0cpaEursEBAAEUpabAILZaAgFgwACEBADAAIO5SaW6JaXFgaW+wCC2PWDAAIQEPgE9HKXgLq7BAQABFKXlwCC2PQEBYMAAhAQAwACDuT4CQB6mCMAA7l4CAAKBphLAILY9FqYmFqYhgKYawCC2GoNmmxuB7psaAKYIpi0APRymNi6uwQEAAR+mP8AATrYCAAKCpk3AILZaFqZcgKZVwCC2GoNmmxsAAMAAg7kGwABIsIDTpnGmgqdEAAC59AEapnLAAO5LAAABA6aQp0QAAAACAgKmlwAAALn1YJsAAKatAAAAt4BgmwAAAFwBPgQ9HKa+LrbUAQABJ7n0AMAASOg9HKbgLq7CAAAAAMAAg7xOpvqnAwAAkfBgmwABJqb6ARynBS6uwgAAAADAAIO8YJsAPRynEC656AMAAxanHi6ECcAASISCpyfAILeaJqc5ARanORanMS6ECcAASISB08AAT4JgjBUAwABI6QbAAEixgNOnSadap6QAALdoARqnSsAA7ksAAAEDp2ynpAAAAAEBAadzAAAAjzFgmwAAAFwBPgE9HKeALrbUAQABJ7doAMAASOgGwABIsoDTp6mnuqf6AAC3aQEap6rAAO5LAAABA6fKp/oAAAABAQGn0QAAAI8xYJsAAABcAT4BPRyn3i621AEAASe3agDAAEjoBsAASLOA06f/qBCocQAAt2sBGqgAwADuSwAAAQOoIKhxAAAAAgICqCUAAAC3bGDAAPR5AKg/AAAAm81gmwAAAFwBPgE9HKhPLrbUAQABJ7drAMAASOgGwABItIDTqHaoh6jfAAC3cAEaqHfAAO5LAAABA6iZqN8AAAACAgKooAAAALdxYJsAAKiyAAAAt3JgwADyswAAXAE+AT0cqMEuttQBAAEnt3MAwABI6AbAAEi1gNOo5Kj1qS0AALd1ARqo5cAA7ksAAAEDqQGpLQAAAAEBAakIAAAAjzFgmwAAAFwBPgE9HKkVLrbUAQABJ7d2AMAASOgGwABItoDTqTKpQ6maAAC3dwEaqTPAAO5LAAABA6lcqZoAAAABAQGpYQAAALd4YMAA9HkAAFwBPgE9HKl1LrbUAQABJ7d5AMAASOgGwABIt4DTqZ+psKoZAAC59gEaqaDAAO5LAAABA6nAqhkAAAACAgKpxQAAAIDQYMAA9HkAqdIAAAC592CbAAAAXAE+Aj0cqekuttQBAAEnufgAwABI6D0cqgcuucgBAAGAqg/AILnuAMAAg7MGwABIuIDTqh6qL6qaAAC5+QEaqh/AAO5LAAABA6pAqpoAAAADAwOqRwAAALn6YJsAAKpYAAAAt7pgmwAAqmkAAAC5+2CbAAAAXAE+AT0cqnouttQBAAEnufwAwABI6AbAAEi5gNOqn6qwqvUAALn9ARqqoMAA7ksAAAEDqsKq9QAAAAEBAarHAAAAgNBgwAD0eQAAXAE+AT0cqtQuttQBAAEnuf4AwABI6AbAAEi6gNOq+qsLq4MAALn/ARqq+8AA7ksAAAEDqx2rgwAAAAICAqskAAAAugBgmwAAqzsAAACPMWCbAAAAXAE+Aj0cq0guttQBAAEnugEAwABI6D0cq2gursEBAAEWq3OBq23AILsPnCubHwDAAIO5BsAASLuA06uIq5msFwAAugIBGquJwADuSwAAAQOrsqwXAAAAAgICq7kAAAC6AGCbAACr0AAAAI8xYJsAAABcAT4CPRyr3S621AEAASe6AwDAAEjoPRysBC6uwQEAASekeQDAAIO5BsAASLyA06wcrC2shwAAugQBGqwdwADuSwAAAQOsQayHAAAAAQEBrEYAAACA0GDAAPR5AABcAT4CPRysUy621AEAASe6BQDAAEjoPRysdS65yAEAAYCsfcAgu9sAwACDswbAAEi9gNOsjKydrNQAALoGARqsjcAA7ksAAAEDrKSs1AAAAAEBAayrAAAAugdgmwAAAFwBPgE9HKy+LrbUAQABJ7oIAMAASOgGwABIvoDTrNms6q0hAAC6CQEarNrAAO5LAAABA6zxrSEAAAABAQGs+AAAALoKYJsAAABcAT4BPRytCy621AEAASe6CwDAAEjoBsAASL+A060mrTetdAAAugwBGq0nwADuSwAAAQOtRa10AAAAAQEBrUoAAACA0GDAAPR5AABcAT4BPRytVy621AEAASe6DQDAAEjoBsAASMCA0615rYquFgAAug4BGq16wADuSwAAAQOtnK4WAAAAAgICraMAAAC6D2CbAACtugAAALoQYJsAAABcAT4CPRytyy621AEAASe6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AErHwADuSwAAAQPAAErgwABLeAAAAAUFBcAASucAAAC4vmCbAADAAEr9AAAAghxgwACC4wDAAEsJAAAAuKBgmwAAwABLJgAAALjAYJsAAMAASzgAAAC4wWCbAAAAXAE+AT0cwABLTi621AEAASe2eADAAEjoBsAASNaA08AAS33AAEuOwABMCQAAujABGsAAS37AAO5LAAABA8AAS6PAAEwJAAAAAgICwABLqgAAALoxYJsAAMAAS74AAACAsGCbAAAAXAE+Aj0cwABLyi621AEAASe6MADAAEjoPRzAAEvzLq7BAQABgMAAS/jAINMAAMAAg7kGwABI14DTwABMDsAATB/AAEyhAAC6MgEawABMD8AA7ksAAAEDwABMNMAATKEAAAADAwPAAEw7AAAAghtgmwAAwABMSAAAALozYJsAAMAATF0AAACAsGCbAAAAXAE+Aj0cwABMaS621AEAASe6MgDAAEjoPRzAAEySLq7BAQABgMAATJfAINOAAMAAg7kGwABI2IDTwABMpsAATLfAAE7WAAC6NAEawABMp8AA7ksAAAEDwABMzMAATtYAAAABAQHAAEzTAAAAjzFgmwAAAFwBPgs9HMAATOAuttQBAAEnujQAwABI6E7AAE0PwABNGgAAp1hgmwABJsAATQ8BHMAATRwursIAAAAAwACDvGCbAE7AAE0uwABNMwAAgLBgwAD1xQEcwABNNS6uwgAAAADAAIO8TsAATUbAAE1PAACR8GCbAAEmwABNRgEcwABNUS6uwgAAAADAAIO8YJsAQBzAAE1wFsAATWMulJXAAEiMQQEAASsAwAD10sAATWPAAE13AEAcwABNkRbAAE2FLpZswABIjkEBAAEWwABNnBbAAE2ULoQJwABIhJ2OwABPcwDAAPXSwABNhcAATaEAScAATaglwABNsYLAAE2swCDUXmDAAIQEPgI9F8AATcwuuccpwABIjUrAAE33AD9OwABOFsAATiMAALajYMAATwEBHMAATiUuuecDAAOBwABOM8Ag1DQrJsAATkUBgsAATkXAINReYMAA9l0AwABI4z0cwABOUC656AMAAybAAE5eAYTAAE5ewCDVOmDAAE/kg8AATmzAINSBJsAAToMBFsAAToOEwABOdsAg1TqB08AATwhgjBUAwABI6T0XwABOkS6UlSbAAE6RAYTAAE6gwCDV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QxOAwABDDsAhJpZgwACEBCuAwABDLsAhJpYBYMAA9cUGwABJNoDVwABDO8AAQ0zAAEjgAAC6OQEawABDPMAA7ksAAAEDwABDX8AASOAAAAACAgLAAENmAAAAunhgmwAAwABDeAAAAJvNYJsAAABcAT4OPRzAAEOILrbUAQABJ7o5AMAASXdOwABDtsAAQ8sAAKegYMAA9l0BHsAAQ83AAEl2AQABgMAAQ+XAIScLAE7AAEQIwABEEwAAnUBdwAD1HQFgwABQTgEmwABECAEcwABEFS6uwgEAARrAAEQjwACDowDAAIO8XcAA9R0BYMAAUE5OwABEUcAARGYAALp5XcAA9R0BYMAART8BJsAARFEBHMAARGguuncBAAEcwABEfS6uwgAAAADAAIO8AMAASTVdwAD1HQFgwABFP07AAETAwABEzgAAo4NdwAD1HQFdwABQcgJgwABFP2CSWQEmwABEwAEcwABE2C6uwgEAARrAAETmwACDpgDAAIO8XcAA9R0BXcAAUHICYMAART9gkllOwABE/sAARQkAALp6YMAA9HkBJsAARP4BHMAARQsursIAAAAAwACDvGDAAPR5TsAARR3AAEUiAACAsGDAAPXFARzAAEUkLq7CAAAAAMAAg7xOwABFWMAARWEAAJHwXcAA9R0BXcAAT8EBYMAART8BJsAARVgBHMAARWMursIBAAEawABFccAAg5sAwACDvF3AAPUdAV3AAE/BAWDAAEU/PRzAAEWALrcdAQABFsAARZaAwABFi8AhJwuEF5sJAMAAg8RJwABFpyXAAEWwh8AARavAISh4YMAAhAQ+Aj0cwABF0xbAAEXLLoQJwABJBaeiAQABJ6grAKteSsAARgEAP07AAEYXwABGIwAAl+FgwAD0eQEjHMAARjYUwABGLcAhKJsIAEEBAAErAMAA9dIWwABGS4DAAEZAwCEnC4QXmwkWwABGZxbAAEZhFMAARljAISibCACC0sAA9QGEF8AAT8MBYMAA9HlOwABGgwAAAJSGYMAAUE4AScAARpIiIRzAAEarhMAARpbAISerQQEAASsAwAD10gAWwABGy4TAAEa2wCEnq4NowAD1AD4BScAARt8cwABG/xbAAEb4hMAARuPAISerWsAA9UxBAQABlADAAPWcPgE9FcAARw/AISmyChbAAEcwhMAARxvAISergtLAAPUBPgE9FcAAR07AISmyCh/AAEdewABExwIAAhbAAEeehMAAR4nAISergtLAAPUBHMAAR8IcwABHuoTAAEelwCEnq5MXAQABlADAAPT1gKEAAAAAwAD08QA/PRzAAEfnFsAAR98uhAnAAEkFlEELAAuCwABH+cAhJz8UwABIF8AhKJsIABrAAEgpwABF0ybAAEhHAYfAAEhHwCEoeGDAAPZdhcAASFXAISf1JsAASGwBFMAASGzAISmyCgBgwABFPybAAEh/AYPAAEh/wCEnaF3AAPUdAWDAAEU/FMAASJPAISlLCQCGwABIqMAhKEoWwABIxYHAAEi8wCEnGIQXmwkcwABI2ZSBVgAAAADAAPScAKtnBsAASTeA1cAASOXAAEjzwABKIwAAunsAAAABA8AASQfAAEojAAAAAQEBwABJDgAAAI8xYJsAAABgjdwBPgRJwABJGxzAAEklgMAASR/AISt6QQEAASsAwAD10krAAEkuARrAAElDjeI/ScAASU8ewABJU8AAg2ECAAInmbiAwABJY8AhK3oASsAASWsBGsAASYCN4z9JwABJjB7AAEmQwACDYQIAAieUCIDAAEmgwCEregBKwABJqAEawABJvY3kP0rAAEnJASbAAEnJAR7AAEnQmX8EAAQWwABJ6YDAAEnjwCEreoHumxonunsWwABKD4DAAEoJwCEreoQXmwkWwABKGy6AoMAASQ0AYI3cBsAASTiA1cAASijAAEo5wABK8AAAunwBGsAASinAAO5LAAABA8AASkzAAErwAAAAAgICwABKUwAAALnWYJsAAMAASmcAAAC6fWCbAAAAXAE+Aj0cwABKhBbAAEp8LoQJwABJBae7AgABJ7p+AagpKqtdPRzAAEq+Lq7BAQABIyEcwABK0YHAAErDwCEsnkEBAAErAMAA9dIawABK28AARc+TAWDAAPR5AMAAg7kGwABJOYDVwABK9cAASwbAAFFOAAC57AEawABK9sAA7ksAAAEDwABLF8AAUU4AAAADAwPAAEseAAAAp1hgmwAAwABLMAAAALntYJsAAMAAS0AAAACbzWCbAAAAXAE+FD0cwABLUC621AEAASe57ADAAEl3TsAAS4DAAEuFAACCHGDAAEj2ASbAAEuAARzAAEuHLq7CAAAAAMAAg7xgwABI9k7AAEuvwABLtwAAp7ZdwAD1HQFdwABPSAFgwABQTgEmwABLrwEcwABLuS6uwgAAAADAAIO8XcAA9R0BXcAAT0gBYMAAUE5OwABLyMAAS9YAALp/YMAA9HkBJsAAS8gBHMAAS9gursIAAAAAwACDvGDAAPR5TsAATBrAAEwoAACjg13AAPUdAV3AAFByAmDAAEU/YJJZASbAAEwaARzAAEwyLq7CAAAAAMAAg7xdwAD1HQFdwABQcgJgwABFP2CSWU7AAExBwABMTAAAhBdgwAD0eQEmwABMQQEcwABMTi6uwgAAAADAAIO8YMAA9HlOwABMYMAATGUAAICwYMAA9cUBHMAATGcursIAAAAAwACDvE7AAEx+wABMiQAAlNxgwABQTgEmwABMfgEcwABMiy6uwgAAAADAAIO8YMAAUE5OwABMm8AATKYAAIPfYMAA8rMBHMAATK2DwABMqMAhLX9BAQABGsAATLvAAEj8AMAA9dJJwABMySIhHMAATNaBwABMzcAhLUtBAQABKwDAAPXSAB7AAEzhwACDYQIAAieUCIHAAEzxwCEtSwA+AUnAAE0EIhzAAE0QhMAATQjAIS2tQQEAASsAwAD10gEhHMAATSoWwABNI4TAAE0bwCEtrVrAAPVMQQEAAZQAwAD1nD4BPRXAAE2pwCEu7AoqPz9OwABN08AATd0AAKNrYMAA9HkBJsAATdMBHMAATd8ursIAAAAAwACDvGDAAPR5ScAATeoUwABN7sAhLuwKAD4BPRXAAE4CwCEvrAscwABODBTAAE4CwCEvrAsAgN8BAAEawABOD8AARcwAwAD0kj9OwABOUMAATlkAAJHwXcAA9R0BXcAAT8EBYMAART8BJsAATlABHMAATlsursIAAAAAwACDvF3AAPUdAV3AAE/BAWDAAEU/PRzAAE5mLrcdAQABFsAATnyAwABOccAhLT6EF5sJAMAAg8Q9HMAATsccwABOnhbAAE6NLoQJwABJBaeiAQABJ7p+AKtenUUCAAKGwABO1MAhLiEWwABO4y6ECcAASQUAq5ZJwABO8SXAAE76FMAATvXAIS6bCABgwACEBErAAE8NAD9OwABPI8AATzMAAaOoYMAA9HkBIxzAAE9GFMAATz3AITAbDABBAQABKwDAAPXSFsAAT1uAwABPUMAhLT6EF5sJFsAAT3cWwABPcRTAAE9owCEwGwwAgtLAAPUBhBfAAE/DAWDAAPR5TsAAT47AAE+jAACnoGDAAPZdAR7AAE+lwABJdgEAAYDAAE+9wCEtPgA9HMAAT9YWwABPzi6ECcAASQWURQ4ADRTAAE/swCExSw4AFMAAUArAITAbDAAUwABQHMAhL6wLACbAAFAvARTAAFAvwCEuvgkAYMAART8mwABQQwEUwABQQ8AhLpsIAGDAAPZdhsAAUFHAIS4hhMAAUGjAIS2tHMAAUHkuunsBAAGBwABQjsAhLUsAwABJNxTAAFChwCEw5A0Ah8AAULrAIS5thcAAUM7AIS3zFsAAUO6CwABQ5cAhLViEF5sJFsAAUQIup8zAAEkLAYRGKatsPRfAAFEzLqfMK8AASQsGwABJOoDVwABRU8AAUWTAAFJDAAC6IQEawABRVMAA7ksAAAEDwABRfMAAUkMAAAACAgLAAFGDAAAAt3FgmwAAwABRlgAAALeAYJsAAABcAT4CPRzAAFGnLrbUAQABJ7oiAMAASXdJwABRzSEcwABR4hbAAFHRLqfMwABJC0EBAAErAMAA9mw+AT0cwABR8y6uwQEAARrAAFIDwABI/QDAAIO5PgE9HMAAUiAursEBAAEawABSMMAASPwAwACDuQbAAEk7gNXAAFJIwABSWcAAUs4AALojARrAAFJJwADuSwAAAQPAAFJ4wABSzgAAAAICAsAAUn8AAAC3cWCbAADAAFKSAAAAt4BgmwAAAFwBPgE9HMAAUqMuttQBAAEnuiQAwABJdwbAAEk8gNXAAFLTwABS5MAAU84AALolARrAAFLUwADuSwAAAQPAAFMDwABTzgAAAAICAsAAUwoAAAC3cWCbAADAAFMdAAAAt4BgmwAAAFwBPgJJwABTLiEWwABTMy6EN8AASQY+AT0dwABTT7fBAwADGsAAU3GEpoDAAFONwCEzqYDAAFOawCEzqQDAAIPiPz0cwABTsi6uwQEAARrAAFPCwABI/QDAAIO5BsAAST2A1cAAU9PAAFPkwABUpAAAufIBGsAAU9TAAO5LAAABA8AAU/jAAFSkAAAAAQEBwABT/wAAAI8xYJsAAABcAT4CPRzAAFQMLrbUAQABJ7nzAMAASXdJwABULiEcwABUQxbAAFQyLqfMwABJC0EBAAErAMAA9mw+AT0cwABUVC6uwQEAARrAAFRkwABI/QDAAIO5PgE9HMAAVIEursEBAAEawABUkcAASPwAwACDuQbAAEk+gNXAAFSpwABUusAAVUcAALqAARrAAFSqwADuSwAAAQPAAFTTwABVRwAAAAICAsAAVNoAAACPMWCbAADAAFTmAAAAuoFgwADyswAAXAE+Aj0cwABU/i621AEAASe6gADAAEl3PRzAAFUrLq7BAQABGsAAVTvAAEj9AMAAg7kGwABJP4DVwABVTMAAVV3AAFpSAAC6ggEawABVTcAA7ksAAAEDwABVaMAAWlIAAAAGBgbAAFVvAAAAun1gmwAAwABVhAAAALbiYJsAAMAAVZcAAAC242CbAADAAFWzAAAAtuRgmwAAwABVygAAALntYJsAAMAAVdoAAACAsGCbAAAAXAE+CT0XwABV5i62uCIcwABWCzUAAAABAGCbAAGFwABV/sAhNcgjHMAAVgSGAMAhNepBAQABKwAAKxbAAFYEhgDAITXqge6bGgFgwAD2XUEBAAEWwABWKRbAAFYWFsAAVg4uhAnAAEkFp76rToCwq48AwAD2bAAcwABWOoTAAFYxwCE1u0EBAAErAMAA9dLAAEkITsAAVlYAAACja13AAPUdAWDAAEXwAEnAAFZlIRzAAFZ3gMAAVmnAITWHQQEAASsAwAD10j4CPSMcwABWkobAAFaIwCE2akEBAAErAMAA9dKOwABWiMAhNmoxwABWoGDAAEXwACsBXcAA9R0BYMAARfA9HMAAVrSGwABWqsAhNmpPAQABGsAAVrjAAEXbAMAA9S4/ScAAVs0hHMAAVt2BwABW0cAhNZRBAQABKwDAAPXSPgFJwABW7hbAAFbyLra4wABJCD4BPRzAAFcLLrfBAwADGsAAVy+HBIHAAFdJwCE1lIHAAFdWwCE1lADAAIPiPgI9IxzAAFeFhsAAV3vAITZqQQEAASsAwAD10o7AAFd7wCE2ajHAAFeTYMAARfAAKwFdwAD1HQFgwABF8D0cwABXqYbAAFefwCE2ak8BAAEawABXrcAARd0AwAD1Lj9JwABXyCEcwABX24LAAFfMwCE1oUEBAAErAMAA9dI+Aj0jHMAAV/aGwABX7MAhNmpBAQABKwDAAPXSjsAAV+zAITZqMcAAWARgwABF8AArAV3AAPUdAWDAAEXwPRzAAFgYhsAAWA7AITZqTwEAARrAAFgcwABF2gDAAPUuP0nAAFgyIRzAAFhGg8AAWDbAITWuQQEAASsAwAD10j4CTsAAWF7AAFhlAACB7mDAAPZdARbAAFh3g8AAWGfAITWuge6bGknAAFiFHsAAWInAAO5eAgACJ4Prh8AAWJrAIThWAD4CPSMcwABYt4bAAFitwCE2akEBAAErAMAA9dKOwABYrcAhNmoxwABYxWDAAEXwACsBXcAA9R0BYMAARfA9HMAAWNuGwABY0cAhNmpPAQABGsAAWN/AAEXeAMAA9S5JwABY8h7AAFj2wADuXgIAAieD6ofAAFkJwCE4VgA+Aj0jHMAAWSaGwABZHMAhNmpBAQABKwDAAPXSjsAAWRzAITZqMcAAWTRgwABF8AArAV3AAPUdAWDAAEXwPRzAAFlKhsAAWUDAITZqTwEAARrAAFlOwABF3ADAAPUuPgI9IxzAAFl3hsAAWW3AITZqQQEAASsAwAD10o7AAFltwCE2ajHAAFmFYMAARfAAKwFdwAD1HQFgwABF8D0cwABZm4bAAFmRwCE2ak8BAAEawABZn8AARdkAwAD1Lj89HMAAWbkursEBAAE1AAAAAQBgwAD0eQE1AAAAAQBgmwABg8AAWb7AITWuIxzAAFnPhwDAITnqQQEAASsAACsWwABZz4cAwCE56oQXmwkBYMAA9HkjHMAAWdqHAMAhOd5BAQABKwAAHMAAWd2UgVYAAAAAwAD0nIcAwCE53gFgwAD0eQDAAIO5PRzAAFnmLq7BAQABNQAAAAEAXcAA9R0BYMAARfABhsAAWevAITZqIxzAAFn1hwDAITpmQQEAASsAABrAAFoCwACDnIcAwCE6ZgFgwAD1xQDAAIO5PRzAAFoaFsAAWhIuhAnAAEkFp7sCAAEnun4BqCkqq10GwABJQIDVwABaV8AAWmjAAG0nAAC6JwEawABaWMAA7ksAAAEDwABaccAAbScAAAAEBATAAFp/AAAAue1gmwAAwABajwAAAKdYYJsAAMAAWqEAAAC6KGCbAADAAFqzAAAAm81gmwAAAFwBPhs9HMAAWsMuttQBAAEnlN8AwABJd07AAFrowABa8QAAuoNgwABI9gEmwABa6AEcwABa8y6uwgAAAADAAIO8YMAASPZJwABa/hzAAFsLhMAAWwLAITtOQQEAARrAAFsZwABI/gDAAPXSPgE9HMAAW2IursIAAAAAwACDvD9OwABbkMAAW5gAAKe2XcAA9R0BXcAAT0gBYMAAUE4BJsAAW5ABHMAAW5oursIAAAAAwACDvF3AAPUdAV3AAE9IAWDAAFBOTsAAW6nAAFu3AAC6f2DAAPR5ASbAAFupARzAAFu5Lq7CAAAAAMAAg7xgwAD0eU7AAFv7wABcCQAAo4NdwAD1HQFdwABQcgJgwABFP2CSWQEmwABb+wEcwABcEy6uwgAAAADAAIO8XcAA9R0BXcAAUHICYMAART9gkllOwABcIsAAXC0AAIQXYMAA9HkBJsAAXCIBHMAAXC8ursIAAAAAwACDvGDAAPR5TsAAXEHAAFxQAAC6hGDAAPXFARzAAFxSLq7CAAAAAMAAg7xJwABcXSIcwABccxrAAFxqiZZBAQABFMAAXHbAITyjCQAAwAD10gAcwABckIXAAFyIwCE7tUEBAAErAMAA9dI+AT0VwABcocAhPKMJGsAAXLuJmD9OwABc2AAAAICwYMAA9cUATsAAXPAAAACCHGCN3ABJwABc+iXAAF0NFMAAXP7AITyjCQBgiX4+BD0VwABdIsAhPRoKHsAAXSmJfAEAARTAAF06wCE8owkBYIl+AD0VwABdUcAhPSoLGsAAXWaN5U7AAF16wABdkAAAuoVgwAD0eQEewABdkol9AQABFMAAXbDAITyjCQFgiX4AScAAXcchHMAAXeI1AAAAAQBgwAD0eQE1AAAAAQBdwAD1HQFdwABPSAFgwABQTgGFwABdzMAhO7UjHMAAXdUUAMAhPcsNAEEBAAErAAArFsAAXdUUAMAhPcsNAFrAAPVMAWDAAPR5IxzAAF3cFADAIT2/DQBBAQABKwAAkxQAwCE9vw0AAWDAAPR5QQEAARTAAF3lwCE9iAwAAMAA9Zw+BE7AAF4KAAAAhWhbAEFHwABeHBTAAF4kwCE9iAwABAHAAF5MkwA+Aj0VwABeW8AhPlQNGsAAXmaGc0LAAF6WAAHAAF6tlAA+AknAAF68HMAAXtIawABeyYmWQQEAARTAAF7VwCE8owkBYIl+AMAA9dI+AT0VwABe9cAhPlQNGsAAXwCGcT4BPRXAAF9LwCE+VA0awABfVoZ1QsAAX5QAAcAAX6uVAD4CPRXAAF+6wCE+VA0awABfxYZ3QsAAX/UAAAE+AT0ewABgHJl/BAAEJMAAYD4BFMAAYCjAIT2IDAAnkpsUwABgccAhPHUIABbAAGB9LoCgwABJDQBOwABgnMAAYKMAAIOwYMAA9l0BJsAAYJwBFMAAYKXAIT0aCgBgwAD2XT0cwABgsy6dOAMAAybAAGDHARzAAGDHFMAAYL7AIT5UDQCEzQEAARTAAGDVwCE9GgoAAABgiJMUwABg3MAhPHUIABbAAGDvFMAAYOjAIT9ODgBawAD2YQDAAEl0PgFJwABhDyEcwABhG4XAAGETwCE7tUEBAAErAMAA9dI+AUbAAGEwwABhX8AAYUwAAACZMV3AAE9IAWDAAFBOAIXAAGFWwCE7tT4BScAAYW0hFsAAYXkUwABhcsAhP/0NALXFwABPUT4BPRzAAGGVLp04AwADGsAAYaCGehbAAGHLFMAAYcTAIT/9DQCEF8AAT+cWwABh9RbAAGHwFMAAYenAIT/9DQCAsMAAT01awAD2YQDAAEl0Pz8+Aj0VwABiPcAhPRoKFMAAYkTAITyjCQA9FcAAYlrAIT0qCxzAAGJhLrp7AQABgMAAYnbAITsAAMAASTdOwABil8AAYqIAAJTcYMAAUE4BJsAAYpcBHMAAYqQursIAAAAAwACDvGDAAFBOTsAAYrTAAGK/AACD32DAAPKzARzAAGLKhMAAYsHAITtOQQEAARrAAGLYwABI/ADAAPXSScAAYuYiIRzAAGLzgMAAYurAITsAQQEAASsAwAD10gAewABi/sAAg2ECAAInlAiAwABjDsAhOwAAPgFJwABjISIcwABjLYXAAGMlwCE7tUEBAAErAMAA9dIBIRzAAGNHFsAAY0CFwABjOMAhO7VawAD1TEEBAAGUAMAA9Zw+AT0VwABjxsAhQPYNKj8/TsAAY/DAAGP6AACja2DAAPR5AR7AAGQFwABF+AIAASbAAGQOARzAAGQOLq7CAAAAAMAAg7xdwAD1HQFgwABF8AGD3xTAAGQhwCFA9g0AScAAZDIhHMAAZFEcwABkQRTAAGQ3wCFBtg4AgywBAAEawABkQ8AARc8AwAD0kUEBAAGTAMAA9Zw+AT0VwABkX8AhQbYOHMAAZGkUwABkX8AhQbYOAIMsAQABHMAAZGwawABkbcAARcySlQAAAADAAPSUAMAA9JE/TsAAZIrAAGSSAACD4mDAAPKzASEcwABkrBzAAGSfFMAAZJXAIUG2DgCDLAEAARrAAGShwABFzQDAAPSRQQEAAZMAwAD1nE7AAGS6wABk0AAAuoZgwAD0eQEmwABkugEcwABk0i6uwgAAAADAAIO8YMAA9HlOwABlBsAAZQ8AAJHwXcAA9R0BXcAAT8EBYMAART8BJsAAZQYBHMAAZREursIAAAAAwACDvF3AAPUdAV3AAE/BAWDAAEU/TsAAZSPAAGU4AACnoGDAAPZdAR7AAGU6wABJdgEAAYHAAGVSwCE7DQA9HMAAZZ0cwABldBbAAGVjLoQJwABJBaeiAQABJ7p+AKtenUUCAAKHwABlqsAhPCkWwABluS6ECcAASQUAq5ZJwABlxyXAAGXQFMAAZcvAIT0aCgBgwACEBD4DPRfAAGXrLqfMK8AASQs9F8AAZgoutrgqwABJCErAAGYnAD9OwABmQMAAZlAAAKfKYMAA9l0BIyIcwABmXxTAAGZawCE9KgsAQQEAARrAAGZwjeMAwAD10gEcwABmfxTAAGZ6wCE9KgsAQQEAARrAAGaQjeQAwAD10iscwABmwBbAAGa4LoQJwABJBafTAgACFMAAZuLAIT0aCgAUwABm6MAhPHUIAACrYQFgwAD2XUnAAGb5IRzAAGcNFMAAZv3AIUPdEwBBAQABKwDAAPZsPgRJwABnHiIUwABnIsAhQnwPAAAhHMAAZzaEwABnLcAhO05BAQABGsAAZ0TAAEj8AMAA9dI+Aj0cwABnWC6dOAMAAxrAAGdjg+IUwABnhMAhQsIQADcFAMAASXQ9FcAAZ6fAIUG2DhzAAGexFMAAZ6fAIUG2DgCDLAEAARzAAGe0GsAAZ7XAAEXNkpUAAAAAwAD0lADAAPSRP0nAAGfOIRzAAGfdFMAAZ9LAIUDIDABBAQABKwDAAPXSPgI9HMAAaDAut8EDAAMawABoVIQugcAAaHbAITsNgcAAaILAITsNAMAAg+I9FcAAaJfAIUDIDCs/TsAAaMLAAGjSAAGjqGDAAPR5ASMcwABo5xTAAGjewCFC8BEAQQEAASsAwAD10hbAAGj8gcAAaPHAITsNhBebCRbAAGkYFsAAaRIUwABpCcAhQvARAILSwAD1AYQXwABPwwFgwAD0eT0cwABpMhbAAGkqLoQJwABJBafJDQANFMAAaUzAIUM2EgAUwABpbMAhQvARABTAAGmAwCFBtg4AJsAAaZUBFMAAaZXAIUDIDABgwABFPxTAAGmrwCE9GgoAFMAAabvAIUPdEwCHwABp1sAhPCmFwABp78AhO7UUwABqAsAhRXwUABTAAGodwCE8dQgAhsAAajPAITv7FsAAalWDwABqTMAhOyeEF5sJFsAAamsup8zAAEkLAKtrPgNJwABqkRTAAGqVwCFCfA8APgI9HMAAaqgunTgDAAMawABqs4QmFMAAasfAIULCEAA3BQDAAEl0PRXAAGrqwCFBtg4cwABq9BTAAGrqwCFBtg4AgywBAAEcwABq9xrAAGr4wABFzZKVAAAAAMAA9JQAwAD0kT9OwABrG8AAaysAAaOoYMAA9HkBIxzAAGtAFMAAazfAIULwEQBBAQABKwDAAPXSFsAAa1WBwABrSsAhOw2EF5sJFsAAa3EWwABraxTAAGtiwCFC8BEAgtLAAPUBhBfAAE/DAWDAAPR5PRzAAGuLFsAAa4MuhAnAAEkFlEUOAA0UwABro8AhQzYSABTAAGvDwCFC8BEAFMAAa9fAIUG2DgAmwABr7AEUwABr7MAhQMgMAGDAAEU/JsAAbAIBFMAAbALAIT0aCgBgwAD2XYfAAGwSwCE8KYXAAGwrwCE7tRTAAGw+wCE9KgsAFMAAbE7AIUcQFAAUwABsacAhPHUIAIbAAGx/wCE7+xbAAGyhg8AAbJjAITsnhBebCRbAAGy3LqfMwABJCwGERiqrbD0XwABs8S6nzCvAAEkLPRfAAG0OLra4KsAASQgGwABJQYDVwABtLMAAbT3AAG7VAAC52gEawABtLcAA7ksAAAEDwABtYsAAbtUAAAABAQHAAG1pAAAAudtgmwAAAFwBPgQ9HMAAbXwuttQBAAEnudwAwABJd07AAG22wABtvQAAp55gwAD1xQEcwABtvy6uwgAAAADAAIO8TsAAbdHAAG3bAACUhmDAAPXFARzAAG3dLq7CAAAAAMAAg7xJwABt6CXAAG3zgcAAbezAIUiwYMAAhAQ+AT0cwABuDi6uwQEAARTAAG4TwCFIsAEBYMAAhAQAwACDuUnAAG4nJcAAbjWCwABuK8AhSNNgwACEBD4BPRzAAG5QLq7BAQABFMAAblXAIUjTAgFgwACEBADAAIO5PgE9HMAAbnQursEBAAEcwABugRbAAG55LoQJwABJBaedAwADJsAAbqABgsAAbqDAIUjTYMAART8mwABuqwGBwABuq8AhSLBdwAD1HQFgwABFPxbAAG6/gMAAbrPAIUiJhBebCQCrWQDAAIO5BsAASUKA1cAAbtrAAG7rwABzSQAAukABGsAAbtvAAO5LAAABA8AAbwPAAHNJAAAABQUFwABvCgAAAKdYYJsAAMAAbxwAAAC6QWCbAADAAG82AAAAkndgmwAAwABvRAAAALpCYJsAAMAAb10AAACbzWCbAAAAXAE+Dj0cwABvbS621AEAASe6QADAAEl3TsAAb6DAAG+1AACnoGDAAPZdAR7AAG+3wABJdgEAAYDAAG/PwCFKCgBOwABv8sAAb/0AAJ1AXcAA9R0BYMAAUE4BJsAAb/IBHMAAb/8uuEABAAGDwABwDMAhSjEAwACDvV3AAPUdAWDAAFBOTsAAcCvAAHA8AACnxmDAAPXFARzAAHA+Lq7CAAAAAMAAg7xOwABwTcAAcFcAAKNrYMAA9HkBJsAAcE0BHMAAcFkursIAAAAAwACDvGDAAPR5TsAAcJvAAHCpAACjg13AAPUdAV3AAFByAmDAAEU/YJJZASbAAHCbARzAAHCzLq7CAAAAAMAAg7xdwAD1HQFdwABQcgJgwABFP2CSWU7AAHDCwABwzQAAhBdgwAD0eQEmwABwwgEcwABwzy6uwgAAAADAAIO8YMAA9HlOwABw4cAAcOYAAICwYMAA9cUBHMAAcOgursIAAAAAwACDvE7AAHEcwABxJQAAkfBdwAD1HQFdwABPwQFgwABFPwEmwABxHAEcwABxJy6uwgAAAADAAIO8XcAA9R0BXcAAT8EBYMAART89HMAAcTIutx0BAAEWwABxSIDAAHE9wCFKCoQXmwkAwACDxEnAAHFZIiXAAHFiFMAAcV3AIUucCwBgwACEBAElwABxiIfAAHF3wCFK0WDAAIQEPgI9HMAAcasWwABxoy6ECcAASQWnogEAASeoKwCrXkrAAHHZAD9OwABx8MAAcgAAAKOoYMAA9HkBFsAAcg2AwAByAsAhSgqEF5sJTsAAciHAAHIvAACjqWDAAPR5ARbAAHI6hMAAcjHAIUo+hBebCT0cwAByUhbAAHJKLoQJwABJBafFCgAKhcAAcnTAIUplFMAAcpLAIUu/DAAmwABypAEUwABypMAhS5wLAGDAAPZdFMAAcrLAIUsiCQAUwAByycAhSvQIACbAAHLcAYfAAHLcwCFK0WDAAEU/JsAAcvYBhsAAcvbAIUqOXcAA9R0BYMAART8UwABzCsAhTH0NABTAAHMjwCFLbgoAFMAAczfAIUyiDgAAq2gGwABJQ4DVwABzTsAAc1/AAHQvAAC4fAEawABzT8AA7ksAAAEDwABzb8AAdC8AAAADAwPAAHN0AAAAgNBgwAD0eQDAAHOBAAAAp1hgmwAAwABzkwAAAJvNYJsAAABcAT4CPRzAAHOjLrbUAQABJ7h9AMAASXc9HMAAc8QursEBAAE1AAAAAQBdwAD1HQFgwABFPwEcwABz9iDAAHPPwACD/gABYMAART8AAK7CAgACFsAAc/outsbAAIOvgMAAdAHAIU2iAMAAg/sjHMAAdAiDAMAhTfFBAQABKwAAGsAAdB3AAIOigwDAIU3xAWDAAPXFAMAAg7kGwABJRIDVwAB0NMAAdEXAAHS7AAC4fgEawAB0NcAA7ksAAAEDwAB0X8AAdLsAAAABAQHAAHRmAAAAjzFgmwAAAFwBPgI9HMAAdHMuttQBAAEnuH8AwABJdz0cwAB0my6uwgEAARrAAHSpwACDogDAAIO8BsAASUWA1cAAdMDAAHTRwAB1CQAAt3UBGsAAdMHAAO5LAAABA8AAdN3AAHUJAAAAAQEBwAB05AAAAI8xYJsAAABcAT4BPRzAAHTxLrbUAQABJ7d2AMAASXcGwABJRoDVwAB1DsAAdR/AAHWAAAC3+AEawAB1D8AA7ksAAAEDwAB1PMAAdYAAAAABAQHAAHVDAAAAt/lgmwAAAFwBPgE9HMAAdU8ut/oBAAGAwAB1d8AhT2QAwACBjgbAAElHgNXAAHWFwAB1lsAAdvQAALf7ARrAAHWGwADuSwAAAQPAAHWgwAB29AAAAAICAsAAdacAAACnWGCbAADAAHW5AAAAt/xgmwAAAFwBPgY9HMAAdc0uttQBAAEnlHQAwABJdz0cwAB15S63/QEAAYHAAHX/wCFP0ADAAIGNTsAAdiTAAHYuAABUXcAA9R0BYMAAUE4BJsAAdiQBHMAAdjAursIAAAAAwACDvF3AAPUdAWDAAFBOTsAAdj/AAHZKAACEF2DAAPR5ASbAAHY/ARzAAHZMLq7CAAAAAMAAg7xgwAD0eU7AAHZewAB2YwAAgLBgwAD1xQEcwAB2ZS6uwgAAAADAAIO8ScAAdnAlwAB2eYTAAHZ0wCFQeGDAAIQEPgE9HMAAdpQursEBAAEUwAB2mcAhUHgEAWDAAIQEAMAAg7k+AT0cwAB2sy6uwQEAARzAAHbAFsAAdrguhAnAAEkFp5sDAAOEwAB2zcAhUHgmwAB20wGCwAB208AhUBFdwAD1HQFgwABFP4PAAHbewCFQSgCrWADAAIO5BsAASUiA1cAAdvnAAHcKwAB3sgAAudgBGsAAdvrAAO5LAAABA8AAdxXAAHeyAAAAAQEBwAB3GgAAAIDQYMAA9HkAAFwBPgI9HMAAdycuttQBAAEnudkAwABJdz0cwAB3Qy6uwQEAATUAAAABAF3AAPUdAWDAAETJARzAAHd6IMAAd07AAIP+AAFgwABEyQAArsICAAIWwAB3fi62xsAAg6+AwAB3hcAhUWAAwACD+yMcwAB3jIEAwCFRlUEBAAErAAAfwAB3m8AAhAoBAAEcwAB3qpSBVgAAAADAAPScAIEAwCFRlQFgwAD1xQDAAIO5BsAASUmA1cAAd7fAAHfIwAB4NgAAuPkBGsAAd7jAAO5LAAABA8AAd93AAHg2AAAAAQEBwAB35AAAAI8xYJsAAABcAT4CPR3AAHf3uPkBAAGAwAB4DcAhUlAAwACDzz0XwAB4GS66XCrAAEkJBsAASUqA1cAAeDvAAHhMwAB4vwAAuAcBGsAAeDzAAO5LAAABA8AAeF3AAHi/AAAAAQEBwAB4ZAAAAI8xYJsAAABcAT4CPRzAAHhxLrbUAQABJ7gIAMAASXc9HMAAeJAursEBAAEcwAB4nRbAAHiVLoQJwABJBaefAQABFsAAeK+AwAB4qcAhUryEF5sJAKtbAMAAg7kGwABJS4DVwAB4xMAAeNXAAHm7AAC4HQEawAB4xcAA7ksAAAEDwAB46cAAebsAAAAEBATAAHjwAAAAjzFgmwAAwAB5AgAAAIIcYMAAg0MAwAB5DgAAALbjYJsAAMAAeSoAAAC25GCbAAAAXAE+AT0cwAB5QS6uwQEAARzAAHlzIyEcwAB5VoLAAHlHwCFTbUEBAAErAMAA9dIawAB5YMAARc6TAWDAAPR5gN8BAAEewAB5hsAARfkBAAE1AAAAAQBgmwABg8AAeZ7AIVN6IxzAAHmvhADAIVPZQQEAASsAACsWwAB5r4QAwCFT2YHumxoBYMAA9l0AAMAA9JIAwACDuQbAAElMgNXAAHnAwAB50cAAe/wAALgeARrAAHnBwADuSwAAAQPAAHnjwAB7/AAAAAUFBcAAeeoAAAC4H2CbAADAAHn9AAAAuCBgmwAAwAB6GgAAALefYJsAAMAAejkAAACCHGDAAIL1AMAAekoAAAC1QGDAAINDAABcAT4HPRzAAHpcLrbUAQABJ7ghAMAASXdOwAB6g8AAeo4AAIQXYMAA9HkBJsAAeoMBHMAAepAursIAAAAAwACDvGDAAPR5TsAAeqLAAHqnAACAsGDAAPXFARzAAHqpLq7CAAAAAMAAg7xOwAB6wMAAesUAAIIXYMAAUE4BJsAAesABHMAAescuuncBAAEcwAB63C6uwgAAAADAAIO8AMAASTVgwABQTk7AAHrswAB69gAAo2tgwAD0eQEmwAB67AEcwAB6+C6uwgAAAADAAIO8YMAA9HlOwAB7LMAAezUAAJHwXcAA9R0BXcAAT8EBYMAART8BJsAAeywBHMAAezcursIAAAAAwACDvF3AAPUdAV3AAE/BAWDAAEU/ScAAe0IlwAB7S4bAAHtGwCFU32DAAIQEPgE9HMAAe2YursEBAAEUwAB7a8AhVN8GAWDAAIQEAMAAg7k+AT0cwAB7hS6uwQEAARzAAHuSFsAAe4ouhAnAAEkFp9sGAAYUwAB7sMAhVW4JABTAAHu6wCFVQAgAJsAAe8UBh8AAe8XAIVUCYMAART8mwAB7ywGGwAB7y8AhVN9gwAD2XSEcwAB73YDAAHvRwCFUUkEBAAErAMAA9dKFwAB75sAhVLEAq3EAwACDuQbAAElNgNXAAHwBwAB8EsAAfFsAALgpARrAAHwCwADuSwAAAQPAAHw8wAB8WwAAAAAAAABcAT4ABsAASU6A1cAAfGDAAHxxwAB88QAAuCoBGsAAfGHAAO5LAAABA8AAfJnAAHzxAAAAAAAAAFwBPgE9HMAAfKIuttQBAAEnuCsAwABJdwbAAElPgNXAAHz2wAB9B8AAfYMAALgtARrAAHz3wADuSwAAAQPAAH0iwAB9gwAAAAICAsAAfSkAAACSd2CbAADAAH03AAAAjzFgmwAAAFwBPgE9HMAAfUQuttQBAAEnuC4AwABJdwbAAElQgNXAAH2IwAB9mcAAfhMAALgvARrAAH2JwADuSwAAAQPAAH26wAB+EwAAAAEBAcAAfcEAAACPMWCbAAAAXAE+AT0cwAB9zi621AEAASe4MADAAEl3BsAASVGA1cAAfhjAAH4pwACBqwAAuCQBGsAAfhnAAO5LAAABA8AAfkTAAIGrAAAAAwMDwAB+UAAAAIDQYMAA9HkAwAB+XQAAAKdYYJsAAMAAfm8AAACbzWCbAAAAXAE+BD0cwAB+fy621AEAASe4JQDAAEl3TsAAfr/AAH7EAACCHGDAAIL1ASMewAB+xsAAg2ECAAInmSmBwAB+1MAhV/8AGsAAfv7AAIL8GsAAfyrAAIL9AWDAAIL1TsAAgGbAAIBxAACe8F3AAPUdAV3AAE9IAWDAAFBOARzAAICtIMAAgIHAAIP+AAFdwABPSAFgwABQTgAArsICAAIWwACAsS62xsAAg6+AwACAuMAhV/AAwACD+0nAAIDEHMAAgNOEwACAyMAhWHhBAQABKwDAAPXSPgE9HMAAgOQursEBAAEfwACA7cAAhAoBAAEewACA/MAAg2UBAAGBwACBC8AhV/8AAADAAIO5PgJGwACBLcAAgWLAAIFJAAAAgM9dwABPSAFgwABQTgCEwACBVsAhWHg+AT0XwACBdoXAAIFswCFZMIIcg8AAgX3AIVgzwABPTj0cwACBkS6uwQEAAYTAAIGWwCFYeADAAIO5BsAASVKA1cAAgbDAAIHBwACMRgAAuDIBGsAAgbHAAO5LAAABA8AAgdTAAIxGAAAABAQEwACB4AAAAIDQYMAA9HkAwACB7QAAAKdYYJsAAMAAgf8AAACbzWCbAADAAIIUAAAAghxgwACDQwAAXAE+Bj0cwACCIC621AEAASe4MwDAAEl3TsAAgmEAAACntl3AAPUdAV3AAE9IAWDAAFBOAEnAAIJuHMAAgniAwACCcsAhWbtBAQABlADAAPWcPgJOwACCjcAAgpIAAIF5YMAA9cUBHMAAgpQursIAAAAAwACDvEnAAIKhJcAAgqqFwACCpcAhWkhdwAD1HQFdwABPSAFgwABQTj4BPYzAAILVwCFaDRTAAILfwCFaSAUBXcAA9R0BXcAAT0gBYMAAUE5JwACC8iElwACC+4XAAIL2wCFaSGDAAIQEPgNAIRzAAIMlhcAAgyDAIVpIQQEAASsAwAD10sAAgyDAAIMsAD2MwACDN8AhWg0ewACDRcAA7oIBAV3AAE9IAWDAAFBOAZQAPRzAAIN1hMAAg27AIVoNgLICAAKTJsAAg3UBhcAAg3vAIVpIXcAAT0gBYMAAUE4AwAD1LT9JwACDlBzAAIOegMAAg5jAIVm7gIsBAAGUAMAA9ag+A07AAIOywACDtwAAgXlgwAD1xQEcwACDuS6uwgAAAADAAIO8PYjAAIPGwCFZuxzAAIPLgMAAg8bAIVm7gUEBAAGUAMAA9Z9JwACD1SXAAIPehcAAg9nAIVttYMAAhAQ+AT0cwACD+y65yAEAAYDAAIQDwCFZuwDAAIOzScAAhBglwACEIYXAAIQcwCFbbV3AAPUdAV3AAE9IAWDAAFBOPgI9jMAAhEzAIVoNHMAAhJUgwACEXMAAg/4AAV3AAE9IAWDAAFBOAAC4NgMAAxbAAISfLrbGwACDr4DAAISmwCFZuxbAAISyFMAAhK3AIVttBQFdwAD1HQFdwABPSAFgwABQTlrAAPVMAMAAg/xJwACEwyEcwACEz4TAAITHwCFaDUEBAAErAMAA9dI+AT0cwACE7ITAAITkwCFaDYMXAwADgMAAhPXAIVm7FsAAhQSEwACE/MAhWg1awAD1TBTAAIUMwCFbbQUBXcAA9R0BXcAAT0gBYMAAUE4AwAD1Qj8+Aj2MwACFNMAhWg0cwACFfSDAAIVEwACD/gABXcAAT0gBYMAAUE4AALg2AwADFsAAhYcutsbAAIOvgMAAhY7AIVm7lADAAIP8ScAAhaEhHMAAha2EwACFpcAhWg1BAQABKwDAAPXSPgE9HMAAhcmEwACFwsAhWg2AsgIAAoDAAIXKwCFZuybAAIXJAYXAAIXTwCFbbV3AAE9IAWDAAFBOAMAA9S0/P0nAAIX1IRzAAIYBhMAAhfnAIVoNQQEAASsAwAD10j4CQBbAAIYhhMAAhhnAIVoNg2jAAPUAwACGGcAAhisAScAAhjQcwACGRxbAAIZAhMAAhjjAIVoNWsAA9UxBAQABlQDAAPWcPgFJwACGlyIhHMAAhqsWwACGphzAAIaihMAAhpvAIVoNRAEAAZMAwAD1LICwwABPTUEBAAErAMAA9mwAHMAAhsYWwACGwRzAAIa9hMAAhrbAIVoNRAEAAZMAwAD1LICwwABPTUEBAAEWwACG1BzAAIbQhMAAhsnAIVoNRAEAAZQAwAD1LICwwABPTQDAAPZsPgE9HMAAhuYunTgEAAMcwACHIBrAAIcAhIuEzQEAARbAAIc5HMAAhzWEwACHLsAhWg1EAQABlADAAPUsgLDAAE9NAIiuFsAAh1kcwACHVYTAAIdOwCFaDUQBAAGUAMAA9SyEF8AAT+cWwACHgxbAAId+HMAAh3qEwACHc8AhWg1EAQABlADAAPUsgLDAAE9NWsAA9mEBgecxwACHomCIsQEcwACIIhzAAIfuGsAAh7SEjYTNAQABFsAAiAccwACIA4TAAIf8wCFaDUQBAAGUAMAA9SyAsMAAT00AiK6B6wMAAxbAAIhILoCgwABJDRbAAIhYHMAAiFSEwACITcAhWg1EAQABkwDAAPUshBfAAE/nFsAAiHQWwACIbxzAAIhrhMAAiGTAIVoNRAEAAZMAwAD1LICwwABPTVrAAPZhAIiawABJdD9JwACIpRzAAIi4FsAAiLGEwACIqcAhWg1awAD1TICLAQABlQDAAPWoPgJOwACI68AAiPUAALqHXcAA9U4CYMAA9l1dwABPSAFgwABQTgEywACJI2DAAPZdXcAAT0gBYMAAUE4ARsAAiS8AwACJSwAAAJkxXcAAT0gBYMAAUE4AhMAAiVXAIVoNQT4CScAAiWocwACJehbAAIl1hsAAiW7AIWA2gLDAAE9NQQEAASsAwAD2bELAAImDAD9JwACJlxzAAImlhcAAiZvAIV/3gd0BAAEWwACJuIbAAImxwCFgNoCwwABPTQDAAPVhPgE9HMAAic0unTgEAAMcwACKCRrAAInphIuEzQEAARbAAIoehsAAihfAIWA2gLDAAE9NAIiuFsAAijyGwACKNcAhYDaEF8AAT+cWwACKZBbAAIpfhsAAiljAIWA2gLDAAE9NWsAA9mEBgecxwACKhWCIsQEcwACLBxzAAIrVGsAAipmEjYTNAQABFsAAiuqGwACK48AhYDaAsMAAT00AiK6B6wMAAxbAAIsULoCgwABJDRbAAIswHMAAiyKFwACLGcAhX/dEAQABFsAAiyqGwACLI8AhYDaAsMAAT00AwAD1YoQXwABP5xbAAItyFsAAi20cwACLX4XAAItWwCFf90QBAAEWwACLZ4bAAItgwCFgNoCwwABPTQDAAPVigLDAAE9NWsAA9mEAiJrAAEl0PgE9HMAAi7aFwACLrcAhX/eAsgIAAhbAAIu+hsAAi7fAIWA2gLDAAE9NhsAAi8bAIWA2AMAA9WM/Pz0cwACL9i6uwQEAARbAAIwGgcAAi/vAIVnKhBebCQDAAIO5PRzAAIwXLq7BAQABNQAAAAEAXcAA9R0BXcAAT0gBYMAAUE4BhMAAjBzAIVoNIxzAAIwkhQDAIWJQQQEAASsAABrAAIwxwACDk4UAwCFiUAFgwAD1xQDAAIO5BsAASVOA1cAAjEvAAIxcwACM5AAAueEBGsAAjEzAAO5LAAABA8AAjHTAAIzkAAAAAgICwACMewAAAI8xYJsAAMAAjI0AAACCHGDAAINDAABcAT4CPRzAAIyZLq7BAQABFsAAjKSAwACMnsAhYtCEF5sJAMAAg7k9HcAAjLu54QIAAoDAAIzUwCFi0IHAAIzbwCFi3QDAAIPSBsAASVSA1cAAjOnAAIz6wACNmwAAuL8BGsAAjOrAAO5LAAABA8AAjQPAAI2bAAAABQUFwACNCgAAALi+YJsAAMAAjSAAAACCHGDAAILjAMAAjSwAAAC4oGCbAADAAI1JAAAAuMBgmwAAwACNWwAAALjBYJsAAABcAT4BPRzAAI1xLrbUAQABJ7Z4AMAASXcGwABJVYDVwACNoMAAjbHAAJBnAAC6OwEawACNocAA7ksAAAEDwACNuMAAkGcAAAADAwPAAI2/AAAAujxgmwAAwACN0gAAALfcYJsAAMAAjeEAAACA0GDAAPR5AABcAT4KPRzAAI3uLrbUAQABJ7o9AMAASXdOwACODcAAjiIAAKegYMAA9l0BHsAAjiTAAEl2AQABgMAAjjzAIWP4AE7AAI5lwACOdwAAp9ZdwAD1HQFgwABPMQEcwACOrSDAAI6HwACD/gABYMAATzEAAK7CAgACFsAAjrEutsbAAIOvgsAAjrjAIWQSAMAAg/tOwACOyMAAjtMAAIQXYMAA9HkBJsAAjsgBHMAAjtUursIAAAAAwACDvGDAAPR5TsAAjv/AAI8PAACjqGDAAPR5ARbAAI8dgMAAjxHAIWP4hBebCU7AAI80wACPOQAAgLBgwAD1xQEcwACPOy6uwgAAAADAAIO8TsAAj2/AAI94AACR8F3AAPUdAV3AAE/BAWDAAEU/ASbAAI9vARzAAI96Lq7CAAAAAMAAg7xdwAD1HQFdwABPwQFgwABFPz0cwACPhS63HQEAARbAAI+cgMAAj5DAIWP4hBebCQDAAIPEScAAj60lwACPtofAAI+xwCFlBmDAAIQESsAAj8kAPz0cwACP3RbAAI/VLoQJwABJBafVBwAHg8AAj+XAIWQ7FMAAj/vAIWUpCAAmwACQBQGHwACQBcAhZQZgwAD2XYTAAJALwCFkZIbAAJAmwCFk4YXAAJA3wCFkszUAAAABAGCbAAE1AAAAAQBgmwABgcAAkEPAIWQFIxzAAJBOFADAIWYVCQBBAQABKwAAKxbAAJBOFADAIWYVCQCbz5sNAWCbACMcwACQWBQAwCFmCwkAQQEAASsAACsWwACQWBQAwCFmCwkAhBebCQFgwAD0eQCrbQbAAElWgNXAAJBswACQfcAAkOgAALqIARrAAJBtwADuSwAAAQPAAJCTwACQ6AAAAAEBAcAAkJoAAACPMWCbAAAAXAE+AT0cwACQrxbAAJCnLoQJwABJBae7AgABJ6fYAagpKqtdBsAASVeA1cAAkO3AAJD+wACRlAAAuAEBGsAAkO7AAO5LAAABA8AAkQ/AAJGUAAAAAQEBwACRFgAAAKdYYJsAAABcAT4CPRzAAJEoLrbUAQABJ7gBAMAASXc9HMAAkVUWwACRTS6ECcAASQWnuwIAASen2gGoKSqrXQbAAElYgNXAAJGZwACRqsAAklsAALgmARrAAJGawADuSwAAAQPAAJHLwACSWwAAAAEBAcAAkdIAAACPMWCbAAAAXAE+Aj0cwACR3y621AEAASe4JgDAAEl3PRzAAJIcFsAAkhQuhAnAAEkFp7sCAAEnp9oBqCkqq10GwABJWYDVwACSYMAAknHAAJQyAAC4BAEawACSYcAA7ksAAAEDwACSgMAAlDIAAAACAgLAAJKHAAAAuAVgmwAAwACSnAAAALf8YJsAAABcAT4HPRzAAJKwLrbUAQABJ5X9AMAASXc9HMAAktAut/0BAAGBwACS6sAhaBkAwACBjU7AAJMawACTIgAAp7ZdwAD1HQFdwABPSAFgwABQTgEmwACTGgEcwACTJC6uwgAAAADAAIO8XcAA9R0BXcAAT0gBYMAAUE49HMAAky8ursIAAAAAwACDvE7AAJNYwACTYwAAlNxgwABQTgEmwACTWAEcwACTZS6uwgAAAADAAIO8YMAAUE5OwACTp8AAk7UAAKODXcAA9R0BXcAAUHICYMAART9gklkBJsAAk6cBHMAAk78ursIAAAAAwACDvF3AAPUdAV3AAFByAmDAAEU/YJJZPRzAAJPKLq7BAQABHMAAk9cWwACTzy6ECcAASQWn2QQABCbAAJPwAYPAAJPwwCFosWDAAEU/hMAAk/zAIWjfgsAAlAvAIWhaFsAAlCKAwACUFMAhaAyEF5sJAKtvAMAAg7kGwABJWoDVwACUN8AAlEjAAJXbAAC4JwEawACUOMAA7ksAAAEDwACUZ8AAldsAAAABAQHAAJRuAAAAt59gmwAAAFwBPgY9HMAAlH8uttQBAAEnuCgAwABJd07AAJTMwACU1AAAp7ZdwAD1HQFdwABPSAFgwABQTgEmwACUzAEcwACU1i6uwgAAAADAAIO8XcAA9R0BXcAAT0gBYMAAUE5OwACU5cAAlPMAALp/YMAA9HkBJsAAlOUBHMAAlPUursIAAAAAwACDvGDAAPR5TsAAlQzAAJUXAACU3GDAAFBOASbAAJUMARzAAJUZLq7CAAAAAMAAg7xgwABQTk7AAJVbwACVaQAAo4NdwAD1HQFdwABQcgJgwABFP2CSWQEmwACVWwEcwACVcy6uwgAAAADAAIO8XcAA9R0BXcAAUHICYMAART9gklk9HMAAlX4ursEBAAEcwACVixbAAJWDLoQJwABJBafZBAAEJsAAlaQBg8AAlaTAIWpaYMAART+EwACVsMAhaoiBwACVv8AhaeaCwACVyMAhaiwAq28AwACDuQbAAElbgNXAAJXgwACV8cAAndUAALnjARrAAJXhwADuSwAAAQPAAJYFwACd1QAAAAMDA8AAlhMAAAC55GCbAADAAJYpAAAAkndgmwAAwACWNwAAAJvNYJsAAABcAT4KPRzAAJZHLrbUAQABJ7njAMAASXdOwACWdsAAlosAAKegYMAA9l0BHsAAlo3AAEl2AQABgMAAlqXAIWtfAE7AAJbxAAAAo4NdwAD1HQFdwABQcgJgwABFP2CSWQBOwACXCwAAAICwYMAA9cUATsAAlxkAAACEF2DAAPR5AE7AAJc9AAAAlN1gwABPXABJwACXTxzAAJdagcAAl1PAIWtsQQEAASsAwAD10j4JTsAAl4jAAJeQAACntl3AAPUdAV3AAE9IAWDAAFBOASbAAJeIARzAAJeSLq7CAAAAAMAAg7xdwAD1HQFdwABPSAFgwABQTj0cwACXny6uwgAAAADAAIO8PYzAAJe+wCFrySbAAJe+ARzAAJfOLq7CAAAAAMAAg7xdwAD1HQFdwABQcgJgwABFP2CSWT2OwACX28Aha/gmwACX2wEcwACX6C6uwgAAAADAAIO8YMAA9Hk9jcAAl/XAIWvoHMAAl/wursIAAAAAwACDvE7AAJgVwACYIAAAlNxgwABQTgEmwACYFQEcwACYIi6uwgAAAADAAIO8YMAAUE5JwACYjyXAAJiYhcAAmJPAIWvoYMAAhAQ+Az0cwACYtS6uwgAAAADAAIO8PRzAAJjZFsAAmNEuhAnAAEkFp6IBAAEnqCsAq15KwACZCQA/PRzAAJknFsAAmR8uhAnAAEkFp7sCAAEnp9oBqCkqq109j8AAmWrAIWwIHMAAmYsWwACZgy6ECcAASQWn2QQABCbAAJmbARTAAJmbwCFtAQkAYMAART8rFMAAma3AIWw3CACGwACZtsAha/gAq28+Bk7AAJnawACZ3wAAghdgwAD1xQEcwACZ4S6uwgAAAADAAIO8PYzAAJnuwCFrySbAAJnuARzAAJn+Lq7CAAAAAMAAg7xdwAD1HQFdwABQcgJgwABFP2CSWT2OwACaC8Aha/gmwACaCwEcwACaGC6uwgAAAADAAIO8YMAA9Hk9jcAAmiXAIWvoHMAAmiwursIAAAAAwACDvEnAAJo5JcAAmkKFwACaPcAha+hgwACEBD4DPRzAAJpfLq7CAAAAAMAAg7w9HMAAmoMWwACaey6ECcAASQWnogEAASeoKwCrXkrAAJqzAD9JwACaySXAAJrSFMAAms3AIW3uCABgwABPXD4BPY/AAJw7wCFsCBTAAJxKwCFt7ggBYMAAT1w+AT0cwACcmS6dOAMAAxrAAJykh1YWwACcxoHAAJy/wCFrbIQXmwkWwACc2YHAAJzSwCFrbFqbGQDAAEl0TsAAnR3AAJ0mAACR8F3AAPUdAV3AAE/BAWDAAEU/ASbAAJ0dARzAAJ0oLq7CAAAAAMAAg7xdwAD1HQFdwABPwQFgwABFPz0cwACdMy63HQEAARbAAJ1NgMAAnT7AIWtfhBebCQDAAIPEPRzAAJ1mFsAAnV4uhAnAAEkFp9cGAAaDwACde8Aha6AUwACdkcAhb0YIACbAAJ2bAYXAAJ2bwCFr6GDAAPZdhMAAnanAIWvJh8AAnbjAIWwIhsAAncbAIWv4AKtuBsAASVyA1cAAndrAAJ3rwACg6QAAtuEBGsAAndvAAO5LAAABA8AAnfzAAKDpAAAABgYGwACeAwAAALbiYJsAAMAAnhYAAAC242CbAADAAJ4yAAAAtuRgmwAAwACeRwAAAIDQYMAA9HkAwACeVAAAAKdYYJsAAMAAnmYAAACbzWCbAAAAXAE+CT0cwACedi621AEAASe24QDAAEl3TsAAnqvAAJ62AACoP13AAPUdAWCrmwEcwACeuC66iQEAAYPAAJ7GwCFwZQDAAEleTsAAnt7AAJ7jAACCF2DAAFBOASbAAJ7eARzAAJ7lLrp3AQABHMAAnvoursIAAAAAwACDvADAAEk1YMAAUE5OwACfCsAAnxQAAKNrYMAA9HkBHMAAn3QcwACfPSMhHMAAnyOAwACfF8AhcD5BAQABKwDAAPXSGsAAny3AAEXRkwFgwAD0eYDfAQABIyEcwACfV4HAAJ9IwCFwS0EBAAErAMAA9dIawACfYcAARc6TAWDAAPR5AMAA9JKA3wEAAR7AAJ+HwABF+QEAATUAAAABAGCbAAGCwACfn8AhcFgjHMAAn7AUAMAhcaIIAEEBAAErAAArFsAAn7AUAMAhcaIIAIHumxoBYMAA9l0AAMAA9JJOwACf5sAAn+8AAJHwXcAA9R0BXcAAT8EBYMAART8BJsAAn+YBHMAAn/EursIAAAAAwACDvF3AAPUdAV3AAE/BAWDAAEU/PRzAAJ/8LrcdAQABFsAAoBKEwACgB8AhcHSEF5sJAMAAg8RJwACgIxzAAKAyhsAAoCfAIXCoQQEAASsAwAD10krAAKA7AD9OwACgTsAAoGMAAKegYMAA9l0BHsAAoGXAAEl2AQABhMAAoH3AIXB0AD0cwACglhbAAKCOLoQJwABJBag+BQAFFMAAoKnAIXJ1CgAUwACgv8AhcegJABTAAKDJwCFxFggAJsAAoNQBh8AAoNTAIXDYYMAART+GwACg2sAhcKgAq2oGwABJXYDVwACg7sAAoP/AAKTbAAC25gEawACg78AA7ksAAAEDwAChCMAApNsAAAAGBgbAAKEPAAAAtuJgmwAAwAChIgAAALbjYJsAAMAAoTgAAAC25GCbAADAAKFTAAAAgNBgwAD0eQDAAKFgAAAAp1hgmwAAwAChcgAAAJvNYJsAAABcAT4JPRzAAKGCLrbUAQABJ7bnAMAASXdOwAChrMAAobcAAKg/XcAA9R0BYKubARzAAKG5LrqJAQABg8AAocfAIXNPAMAASV5OwACh38AAoeQAAIIXYMAAUE4BJsAAod8BHMAAoeYursIAAAAAwACDvGDAAFBOTsAAofXAAKH/AACja2DAAPR5ARzAAKJfHMAAoigjIRzAAKIOgMAAogLAIXMoQQEAASsAwAD10hrAAKIYwABF0ZMBYMAA9HmA3wEAASMhHMAAokKBwACiM8AhczVBAQABKwDAAPXSGsAAokzAAEXOkwFgwAD0eQDAAPSSgN8BAAEewACicsAARfkBAAE1AAAAAQBgmwABgsAAoorAIXNCIxzAAKKbFADAIXR8CABBAQABKwAAKxbAAKKbFADAIXR8CACB7psaAWDAAPZdAADAAPSSScAAoqgiHMAAoriAwACirMAhcyhBAQABKwDAAPXSACEcwACi2RzAAKLNFMAAosPAIXPwCACDLAEAARrAAKLPwABFzQDAAPSRQQEAAZMAwAD1nD4CPRzAAKNILp04AwADGsAAo1OEJBbAAKN+gsAAo27AIXNChBebCRbAAKOkgsAAo5TAIXNCWpsZAMAASXQ9FcAAo7PAIXPwCBzAAKO9FMAAo7PAIXPwCACDLAEAARzAAKPAGsAAo8HAAEXNkpUAAAAAwAD0lADAAPSRP07AAKP/wACkCAAAkfBdwAD1HQFdwABPwQFgwABFPwEmwACj/wEcwACkCi6uwgAAAADAAIO8XcAA9R0BXcAAT8EBYMAART9JwACkFRzAAKQkhsAApBnAIXOSQQEAASsAwAD10krAAKQtAD9OwACkQMAApFUAAKegYMAA9l0BHsAApFfAAEl2AQABhMAApG/AIXNeAD0cwACkiBbAAKSALoQJwABJBag+BQAFFMAApJvAIXX5CgAUwACkscAhdY8JABTAAKS7wCFz8AgAJsAApMYBh8AApMbAIXPCYMAART+GwACkzMAhc5IAq2oGwABJXoDVwACk4MAApPDAAKeLAAC6iQAAAAEDwACk/cAAp4sAAAABAQHAAKUCAAAAgNBgwAD0eQAAXcAA9R0BYKubAT4FScAApQ8cwAClGYDAAKUTwCF2o0EBAAGTAMAA9ZxKwAClHwErP07AAKVAwAClSwAAqD9dwAD1HQFgq5sBHsAApVHAAO6CAQFgq5sBgMAApWHAIXajAE7AAKVywAClgwAAul9gwADyswEqRcAApZABwAClmcAApZsAAFtgwAD0eQEcwAClo4DAAKWdwCF2o4FBAQABlADAAPWfASEcwAClqoPAAKWowCF3LkEBAAEcwAClrZSBVgAAAADAAPScAMAA9ZwBi8AApbHAIXcuHMAApbKDwAClscAhdy6BQQEAAZQAwAD1nz4GTsAApcLAAKXQAACjqWDAAPR5ASbAAKXCARzAAKXSLq7CAAAAAMAAg7xgwAD0eU7AAKXlwACl8AAAqEBgmwABJsAApeUBHMAApfIursIAAAAAwACDvGCbAE7AAKYFwACmIgAAp8dgmwABJsAApgUBHMAApiQursIAAAAAwACDvGCbAE7AAKY1wACmQAAAhBdgwAD0eQEmwACmNQEcwACmQi6uwgAAAADAAIO8YMAA9HlOwACmVsAAplsAAICwYMAA9cUBHMAApl0ursIBAAEawACma8AAg5cAwACDvEnAAKZ+JcAApocUwACmgsAheFcIAGDAAIQEPgE9isAApqTAIXcVKT4BPRzAAKbegcAAptTAIXblgLICAAKDwACm38Ahdy4fwACm6KujBQAFJsAApvIBFMAApvLAIXhXCABgwAD2XYfAAKb4wCF4KYbAAKcQwCF3/4XAAKcuwCF31YTAAKc6wCF3pwAAwAD1LUrAAKdcASOCwACnY8AhdxUrgcAAp33AIXblAV3AAPUdAWCrmwbAAElfgNXAAKeQwACnocAAqUwAALjzARrAAKeRwADuSwAAAQPAAKeywACpTAAAAAEBAcAAp7kAAACPMWCbAAAAXAE+BT0cwACnxi621AEAASe48wDAAEl3TsAAp+/AAKf6AACEF2DAAPR5ASbAAKfvARzAAKf8Lq7CAAAAAMAAg7xgwAD0eU7AAKgOwACoEwAAgLBgwAD1xQEcwACoFS6uwgAAAADAAIO8PRzAAKi/Lq7CAAAAAMAAg7xJwACoyiXAAKjTgsAAqM7AIXm+YMAAhAQ+AT0cwACo7i6uwQEAARTAAKjzwCF5vgIBYMAAhAQAwACDuT4BPRzAAKkNLq7BAQABHMAAqRoWwACpEi6ECcAASQWn3QMAAybAAKkqAYLAAKkqwCF5vmDAAPZdK4HAAKk2wCF5kACrcgDAAIO5BsAASWCA1cAAqVHAAKliwACqggAAuPQBGsAAqVLAAO5LAAABA8AAqXzAAKqCAAAAAgICwACpgwAAAI8xYJsAAMAAqY4AAACA0GDAAPR5AABcAT4DPRzAAKmbLrbUAQABJ7qKAMAASXdAHMAAqdCBwACpysAheraAiwEAAZMAwAD1qMAAqcrAAKnTAD0cwACp2i6uwQEAATUAAAABAF3AAPUdAV3AAFByAmDAAEU/YJJZARzAAKpJIMAAqeXAAIP+AAFdwABQcgJgwABFP2CSWQAArsICAAIWwACqTS62xsAAg6+BwACqVMAherYAwACD+yMcwACqW4IAwCF7DkEBAAErAAAawACqcMAAg6aCAMAhew4BYMAA9cUAwACDuQbAAElhgNXAAKqHwACqmMAArBcAALj1ARrAAKqIwADuSwAAAQPAAKqnwACsFwAAAAMDA8AAqq4AAACPMWCbAADAAKq5AAAAJ2DAAPR5AMAAqsYAAAC49mCbAAAAXAE+BD0cwACq3C621AEAASe49QDAAEl3TsAAqwvAAKsRAACVCmDAAFBOASbAAKsLARzAAKsTLrp3AQABHMAAqygursIAAAAAwACDvADAAEk1YMAAUE5OwACrocAAq7AAAJJeXcAA9R0BXcAAUHICYMAART9gklkBJsAAq6EBHMAAq7ounfoAAAAAwACDu13AAPUdAV3AAFByAmDAAEU/YJJZScAAq8YhHMAAq9mEwACrysAhfEdBAQABKwDAAPXSPgE9F8AArAAcwACr+ITAAKvqwCF8R0QBAAGBwACr+cAhe9QAwAD1LJUKJsAArAABg8AArAjAIXwJYMAART/AAFB0PwbAAEligNXAAKwcwACsLcAAteQAALj3ARrAAKwdwADuSwAAAQPAAKw9wAC15AAAAAICAsAArEQAAACnWGCbAADAAKxWAAAAm81gmwAAAFwBPgU9HMAArGYuttQBAAEnuPcAwABJd07AAKz4wACtBwAAkl5dwAD1HQFdwABQcgJgwABFP2CSWQEmwACs+AEcwACtES6d+gAAAADAAIO7XcAA9R0BXcAAUHICYMAART9gkllOwACtPwAAAKepXcAA9U4CYMAA9l1dwABQcgJgwABQTlsAScAArVghHMAArWuCwACtXMAhfVpBAQABKwDAAPXSPgFGwACtfMAArbDAAK2VAAAAg+ZdwABQcgJgwABQTlsAgsAAraDAIX1aPgFJwACtuiEcwACtzBbAAK3GhMAArb7AIX3wlQrAAFB0QQEAASsAwAD10j4EScAAreEcwACt+YPAAK3lwCF9pkEBAAErAMAA9dI+Aj2LwACuEMAhfaYewACuKsAA9VUAAmDAAPZdXcAAUHICYMAAUE5bAABGwACuWsAAro7AAK5zAAAAg+ZdwABQcgJg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9R0BYI5jAABcAAbAAEq1gNnAAENdwABDYsAAQ6EAAqbKAAAAAQPAAEN8wABDoQAAAAEBAcAAQ5UAAACUNF3AAPUdAWCOYwAAXAAGwABKtoDZwABEAsAARAfAAER0AAK3AgAAAAEDwABEIMAARHQAAAADAwPAAEQxAAAApb5gwABKLgDAAERRAAAAkkVgjmMAwABEZwAAAKcnYJJZAABcAAAAIf5TACH+xQAh/uoAIf8RACH/OAAh/2kAIf+/ACIAIgAiAGsAIgC6ACIA+gAiAVAAAAALAsAASrmA2cAARYrAAEWZwAEioQeleAAAAWDAAEqkAAAOBMAASruA2cAARjnAAEaABbrLAGCSnAEfwABGVZK0AgACOsAARmJgklkAIMAARnKSdgAAAAAABMAASryA2cAARp/AAEalCaXvAGDAAEpkAATAAEq9gNnAAEbAwABGwwmAoAEawABGq8AA7ktgwAD23gAEwABKvoDZwABHg8AAR40JhEYAYMAA8rMABMAASr+A2cAAR6fAAEe1CaXZAGCYDAAEwABKwIDZwABH0MAAR98Jo8kAYMAARgAABMAASsGA2cAASADAAEgVCaQiAGDAAEvKAATAAErCgNnAAEguwABINgmUbgBgkosABMAASsOA2cAASGLAAEhpCYQJARrAAEg8wADuS2Cq6QAEwABKxIDZwABIjMAASLUJuswAXcAA9U4CYIwVYJJZATLAAEizYIwVYJJZAATAAErFgNnAAEjKwABI0BilvgBgwABKLgErBMAASsaA2cAASUfAAElVGKcYAGDAAEp/ASsEwABKx4DZwABJ7cAASgUYus0AYJ3SASsEwABKyIDZwABKosAASrAYus4AYJKcASsBBcAASvqA2cAASrXAAEq1wABMYQCmZgADwABKzcAATGEAAAAFBQXAAEraAAAEpe9gwABKZADAAErnAAAEgKBgwAD23gDAAErxAAAAomRgwADyswDAAEsAAAAElG5gkosAwABLDwAABIQJYKrpAABgwABKuQE/CggBwABKvIAAwCIDZwgBwABKvYEAwCIDdggBwABKwoMAwCIDlAgBwABKw4QAwCIDoQwAQCIigsAASyjAIgOFABzAAEs8hMAASzTAIgOhQQEAASsAwAD10gEiIYLAAEtKwCIDhQAhHMAAS16EwABLVsAiA6FBAQABKwDAAPXSwABLJ8AAS2YACADAAEq/FsAAS4mAwABLgsAiA2el2cAASmYIAMAASsAjgsAAS7PAIgOFKxbAAEvMgMAAS8XAIgNno8nAAEptAWDAAEYACADAAErBFsAATASAwABL/cAiA2ekIsAASmkIAMAASr6CwABMMMAiA4UJAMAATEjAAEq4AQABFsAATFeAwABMUMAiA2eEKsAASmcALQbAAErKgNnAAExmwABMb8AATj4AAKapAAAAAQPAAEyAwABOPgAAAAICAsAATIoAAACDsmCMFQDAAEyZAAAAghdgklkAAGCSWQE+AUnAAEylJcAATK6AwABMqcAiBPhgp9s+AUrAAEzNARfAAEzZFMAATNTAIgT4AAFgp9ulm4HAAEzowCIFBafdPgJJwABNARzAAE0WFsAATQUuuszAAErEgd0BAAGAwABNIsAiBPgAwAD1YT4BPR7AAE0zmX0DAAMcwABNhBrAAE1Qha+EzQIAAhzAAE2zFsAATaMuuszAAErERAEAAYDAAE20wCIE+ADAAPViJMAATdABFsAATcOAwABNvsAiBPiFA8AA9dkAiK4WwABN5IDAAE3fwCIE+JQTjBwWwABN/C6AoMAASr0AP0rAAE4QATUAAAABAF3AAPVOAmCMFWCSWQEWwABOFy66zMAASsQ1AAAAAQBgjBUBgMAATijAIgT4NQAAAAEAYJJZAYHAAE4wwCIFBTUAAAABAFwBHMAATieCwABOJ8AiBgeAsgIAAoPAAE4nwCIGJoQAwCIGOQDAAPVjhADAIgY5BsAASsuA2cAATkPAAE5MwABPhAAApzEAAAABA8AATlzAAE+EAAAAAQEBwABOZgAAAIOyYIwVAABgklkBPgJJwABOciIhHMAATogWwABOdy66zMAASsSB3QEAAYDAAE6UwCIGqgDAAPVhACEWwABOni6ERsAASr4+AT0ewABOspl9AwADHMAATwgawABOzYWhhM0BAAEkwABPKwEWwABPHoDAAE8ZwCIGqoUDwAD12QCIrhbAAE89gMAATzjAIgaqlBOMHBbAAE9TLoCgwABKvQA/SsAAT2MBHMAAT3oWwABPai66zMAASsREAQABgMAAT3vAIgaqAMAA9WIGwABK+IDZwABP48AAT/TAAFAAAQKmZQAAAAEDwABQAMAAUAAAAAAAAAAAYMAASw0ABsAASsyA2cAAUAXA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wCInFgABYJKcScAAhuAigcAAhuTAIicjACXAAIb9gMAAhvLAIicWYJKLPgNOwACHG8AAhyIAAJJbYI0TARzAAIckLrrcwABKegMAAxbAAIdDFMAAhzjAIicWAAFgkouUlJKQGsAAh07AAH3vKgDAAEr0TsAAh2rAAIdzAAC64WCSWQEcwACHdS6lxwIAAoLAAIeDwCIniRTAAIeLwCInFgABYJKLAMAAStVJwACHniXAAIerg8AAh6LAIifPYJKcPgFKwACHxgEUwACHzcAiJ88DAWCSnD8/SsAAh+kBGsAAh/DAAEq7BsAAStWA2cAAiAjAAIgRwACNTwAApccAAAABA8AAiB7AAI1PAAAAAgICwACIJgAAAKcfYMAA9cUAwACIQAAAAJUbYJJZAABgklkBPgFJwACIVB7AAIhYwADuXgIAAoDAAIhiwCIobScgAD4BSsAAiIQBgcAAiIvAIih8ScAAiKQcwACIuIDAAIiowCIobUEBAAErAMAA9dI+AUrAAIjJASDAAIjWknYAAAAAScAAiPAlwACJBIDAAIj0wCIobWCNEz4FTsAAiRvAAIknAAC64mCMzgEWwACJORTAAIkpwCIobQABYI0TkmmNG07AAIlYAAAAps1gklkAScAAiWolwACJfhTAAIluwCIobQABYI0TYI2fPgFJwACJlhzAAImvFsAAiaoUwACJmsAiKG0AAWCNn4IcjaJBAQABGsAAicCN4wDAAPXSPgE9i8AAidTAIikvFsAAifoWwACJ8RTAAInhwCIobQABYI2fkk+NpJTcjkE+AT2LwACKIcAiKS8WwACKRxbAAIo+FMAAii7AIihtAAFgjZ+ST42klN2OT0nAAIpsJcAAioAUwACKcMAiKG0AAWCNE2CNMT4BPYvAAIqUwCIpLxbAAIqxFMAAiqHAIihtAAFgjTGCF40zPgE9MMAAis4ewACK1Jl/BAAEHMAAivoWwACK7hTAAIrewCIobQABYI0ThQPAAPXZIwAAAADAAPXTJ6XHKysAScAAiz4WwACLXRbAAItOgsAAi0LAIikHkl6M3YNowAD1AD4CPYnAAItzwCIofBzAAIuCLqa+AQABgcAAi5fAIih8AMAASu5JwACLriXAAIu/gcAAi7LAIih8YJKLPgJOwACL4cAAi+wAAJosYJKLARzAAIwLFsAAi/wupdnAAEq/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wABLrAIAAhTAANUDwCJQvQEBYJKcFMAA1RDAIlRICQAAAMAA9S0+AT0cwADVRRTAANUvwCJT8AgAgLICAAIUwADVRsAiVEgJAB7AANVZwABLqwIAAhTAANVvwCJQvQEBYJKcFsAA1YccwADVg4bAANV8wCJTX0QBAAEUwADVhMAiVEgJAADAAPUsgLCSBgAAwAD1LT2LwADVpsAiUNkWwADVwhTAANW2wCJQvQEBYJKclNySo07AANZNwADWXQAAnXNdwAD1TgJgkuFgklkBMsAA1nhgkuFgklkARcAA1oIBwADWi8AA1o0AAFtgwAD0eQGTARzAANaUFMAA1pLAIlXxCgBcAQABFsAA1rEWwADWohTAANaWwCJQvQEBYJKckl6SnlrAAPVMAMAA9aYBFcAA1rnAIlXxChzAANa6FMAA1rnAIlXxCgBdAQABlADAAPWePgE9HMAA1tcUwADWyMAiVcYJAICyAgACHMAA1vIWwADW5BTAANbYwCJQvQEBYJKckl6SnkQBAAEUwADW88AiVfEKAADAAPUsIxzAANcHFMAA1wXAIlXxCgBcAQABFsAA1xiFwADXCcAiUzZawAD1TADAAPWmH8AA1zWS4AEAARzAANdVhcAA10fAIlM2RAEAARTAANdWwCJV8QoAAMAA9SwAIMAA13KSdgAAAAABYJJZAMAA9WM9j8AA14/AIlPiHsAA16ud1gEAARTAANezwCJVxgkAAD4BPY/AANkDwCJT4hrAANkfndRFwADaCQHAANoSwADaFAAAW2DAAPR5AZMBHMAA2hsUwADaGcAiV1IJAFwBAAEWwADaJYbAANodwCJTX1rAAPVMAMAA9aYBFcAA2i3AIldSCRzAANouFMAA2i3AIldSCQBdAQABlADAAPWePgJOwADaVsAA2l0AAJkxYKl8ASbAANpWARzAANpmhsAA2l/AIlNfRAEAARTAANpnwCJXUgkAAMAA9SxgqXxJwADacR7AANqRqYkBAAEUwADao8AiV7kKAAA+BE7AANq/AAAApZtgklkAScAA2tUcwADa8xzAANrvFMAA2tnAIlPwCABEAQABFMAA2vDAIldSCQAAwAD1LEEBAAEWwADbChbAANsAFsAA2vYuhCrAAEqmmwuZEZSmjPwAkl0+AT0VwADbH8AiWBILFsAA20QWwADbOBbAANsuLoQqwABK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wCJyVgIBYI2fkk+NpJTcjkEAPgFKwAEPdwEawAEPnMAASp4/SsABD7kBGsABD97AAEqdBsAASu6A2cABEDjAARBBwAETwAAApr4AAAABA8ABEFXAARPAAAAAAQEBwAEQXwAAAIIXYJJZAABgklkBPgdPwAEQa8ABEHQAAAG6+2EBYJJZYJJZAAPAARCCwAERBgAAAAEBAcABEIwAAACCF2CSWQAAYJJZAT4BScABEJolwAEQo4LAARCewCJ1S2CS0z4BSsABEMMBFsABEM8UwAEQysAidUsCAWCS05UKkt4+AUrAARDtAStOwAEREcABERoAALr8YJJZARzAAREqgcABERzAInUqIAEAAYDAARErwCJ1EQAAScABETYcwAERQ4LAARE6wCJ1nkEBAAErAJJdSsABEUwBgMABEVPAInURPz2IwAERocAidRGCwAERqMAidZ5OwAERv8ABEcQAAJJhYJJZARzAARHUgcABEcbAInUqIAEAAYDAARHVwCJ1EQAAScABEeAcwAER6YPAARHkwCJ2CkEBAAErAJJdSsABEfIBgMABEfnAInURP0PAARIDKT4HScABEhgewAESHMAA7l4CAAKAwAESJsAidRGDwAESLMAidgoAPgFKwAESfwEgwAESjJJ2AAAAAD9OwAESzMABEtIAALr9YJJZARzAARLigcABEtTAInUqIAEAAYPAARLjwCJ2CgAAScABEvAcwAES+oTAARL0wCJ2o0EBAAErAJJdSsABEwMBg8ABEwrAInYKP07AARMawAETIAAAuv5gklkBHMABEzCBwAETIsAidSogAQABhMABEzHAInajAABJwAETPxzAARNJhcABE0PAInb8QQEAASsAkl1KwAETUgGDwAETWcAidgo/PYvAARNlwCJ2CoXAARNswCJ2/D2IwAETm8AidREcwAETsIHAAROiwCJ1KiABAAGAwAETscAidREAAAbAAErvgNnAARPFwAETzsABFTsAAKaoAAAAAQPAARPewAEVOwAAAAEBAcABE+gAAACCF2CSWQAAYJJZAT4CScABE/QiJcABE/2AwAET+MAid7hgkosAHsABFBnAAO5eAgACFsABFCgUwAEUI8Aid7gAAWCSi5SUkpAWwAEUPRbAARQzLoQqwABKpprvmQAAPgFKwAEUVQEUwAEUXMAid7gAAWCSiz9KwAEU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jnY+Ak7AAR+2wAEfvwAAkktgkgIBFsABH8wUwAEfwcAifXUAAWCOdpJLjnhJwAEf3CIlwAEf6YHAAR/gwCJ/RWCpfAAewAEgMamKAQABFMABIEHAIn9FAQFgqXwAPgFKwAEgVgEawAEgXYXPPz9KwAEgkQErBsAASvaA2cABIKXAASCqwAEinwAAutTAAEp6AAAAAQPAASC8wAEinwAAAAICAsABIMYAAAClyWCSWQDAASDdAAAAus9gklkAAGDAAPKzAT4EScABIO8iJcABIQCAwAEg88Aif+NgkosAHMABITMWwAEhKRTAASEcwCJ/4wABYJKLlJSSkEEBAAEWwAEhTBbAASE2LqQiwABKwZrvogEAwAD10j4BPYjAASFjwCJ/4xzAASGfFsABIZImwAEhgACAwAEhc8Aif+NgkouSRJKORAEAAZMAwAD1LD9JwAEhriXAASG/gMABIbLAIn/jYJKcSsABIdABKT9JwAEh4RzAASHygMABIeXAIn/jQQEAARbAASILFsABIfUupCLAAErBof/AAH4RAJJdPgFJwAEiJCEcwAEiPxbAASIpLqQiwABKwZnTAgACgcABIkvAIn/wgMABIlfAIn/jAMAAS9U+AUrAASJwASk/P0rAASKPASoAACIEzgAiBoAAIgd7ACIHrAAiCOcAIgmWACIVsgAiFkUAIhsfACIgTgAiI5oAIibsACIoQwAiK34AIixwACIsrAAiLUgAIjDDACIxlAAiNuIAIjplACI7KwAiO5MAIjzcACI9GAAiPiUAIlCGACJcBAAiXL0AIl7BACJoBwAiaUQAIm12ACJuAQAibjsAInEHACJyEgAidOcAIneOACJ4ngAieWAAInoJACJ7CQAifUcAIn+1ACKBJQAAAC0CwABK+4DZwAEipMABIrPAATvsB5m8AAABYMAA9cUAAAIEwABK/YDZwAEi1cABIt4JhCoAYJivAATAAEr+gNnAASL/wAEjBwm1JABgwAB+HwABBcAASwWA2cABIwzAASMMwAEjOAAAAAPAASMZwAEjOAAAAAICAsABIx8AAASEKmCYrwDAASMvAAAEtSRgwAB+HwAAYMAASvsBPwMIAcAASv2AAMAiglkIAcAASv6BAMAigmYJAcABIwzAAPXbAAAAAAQGwABLAIDZwAEjPcABI0fAASN6AAKZyQAAAAEDwAEj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sgAAuwNgjM4BFsABNMCBwAE0tMAiiQaUlJL7TsABNNnAATToAAC7BGCS9gEWwAE09YPAATTqwCKJxZSGjN49HMABNUAuuwIDAAODwAE1VMAiicWCwAE1YMAiiaKEwAE1asAiiegAwABLAk7AATXZwAE14AAAgRBdwAD1TgJgkuFgwABLrQEcwAE16xbAATXiLrUkwABK/rsNAAAAAMAAfjFOwAE2WsABNmUAAJ7wXcAA9R0BYJLhARzAATmEHMABNoEWwAE2coPAATZnwCKJxZJejN2AnwEBYJLhATTAATaFA8ABNoXAATmCAAAAAQEBwAE2hgAAAIDGYJLhAABgkuEBPgVOwAE2lcABNqAAAK0nYMAAS60BHMABNqiFwAE2osAiijdEAQABhsABNqnAIoq8AMAA9WJJwAE3SiIhHMABN1mHwAE3TsAiitFBAQABKwDAAPXSACEcwAE3dRbAATdvh8ABN2TAIorRlgXAAEuwQQEAARbAATeDh8ABN3jAIorRlgTAAEuvAJJdPgI9HMABN5QutSUCAAIcwAE31RrAATevhi+EzQMAAxbAATfug8ABN+PAIonFgLCM1BbAATgXFsABOA2CwAE4BMAiiaKUlJL7gLCM1BbAATgshMABOB3AIonolhaS/ACIroPAAThKwCKJxQDAAEsBSsABOF8BhsABOGbAIoq8P0AiHMABOImHwAE4fsAiitFBAQABKwDAAPXSARzAATilFsABOJ+HwAE4lMAiitGWBcAAS7BBAQABFsABOLOHwAE4qMAiitGWBMAAS68Akl3AATh+wAE4uABOwAE4xsABOMwAAK2nYMAA8rMBIiEcwAE444fAATjYwCKK0UEBAAErAMAA9dIAIRzAATj/FsABOPmHwAE47sAiitGWBcAAS7BBAQABIMABOQinTQAAAAAAkl1KwAE5HQEfwAE5KJL1AwADFsABOUOGwAE5QcAiiryAsJLlIxTAATlJwCKMMAgAFsABOVyHwAE5UcAiitGWBcAAS7AWwAE5ZobAATlkwCKKvJUKkuYBYJJZFsABOW+GwAE5bcAiiryWEpLnAADAAPTmgKEAAAAAwAD08U7AATofwAE6LAAAlJZgndIBHsABOjud3AIAAhbAATpQg8ABOkXAIonFkl6M3RzAATqYHMABOnOGwAE6aMAiim6AnwEBYJLTATTAATp3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t0W3SwAAghFgjqABNbdRAAABAGCOoAEft1GOsQQABCa3XQEct10uu4oAAAAAwABMT2COYxa3by6AsMAATEeAt3XAIy7dFrd8LpnLwABMSQA1AAAAAQBbARe3jIO3isAjLxWUEx63mcAAg2UBAAEWt6gujzHAAEv7AIwcgwDAIy8VPTUAAAABAGCnoQGCt7TAIy71Ixy3x4QAwCMvi0EBAAErAAArF7fHhADAIy+LghGDt8/AIy8Ip6UBYI6gSrfaAYO34cAjLwgGwABMWIDet++4BrimAAC7ccAAS/ABGrfwwADuSwAAAQO4DbimAAAAAgICuCAAAACSTGCOYwC4QAAAALtzYKehAABgjmMBPgFKuFkBHbhmu3HAAEvwAgACHrhuwABL8gIAAha4di67icAAS/DAAExLgLiJwCMv+wCBuJDAIzAGAMAATAwAACMongAjKOEAIymgACMqIgAjKn4AIywHACMsoAAjLbMAIy6yACMv0AAjMFQAAAAKAsAATFuA3riruLHAAEE8N7uQAAABYMAATBAAAWDAAH/vAAEFwABMYAAAAAAEAAADAAAAAAACAgIAAAAApb5bAAAAAACPMVsAAGDAAExbAT8BCQAAwABMJwIAAoAAwCMwvYEAwCMwxQACBsAATF2A36j5qRCpOgEAo2wBGqj6wADuSwAAAQOpGqk6AAAAAAAAAGDAAPZdAUqpHQEntpwGwABMXoDfqT+pVKlwAQC7hwEaqUDAAO5LAAABA6lpqXAAAAAAAAAAYMAA8rMBSqlsASkAACMw7gAjMSMAIzFWAAAAAgLAAExhgN64q7ixwABBPAO7kQAAAWDAAExbAAADBMAATGOA3rkfuSMJgLAAYJIyAATAAExkgN65Nbk7CaJ/AGCNEwAEwABMZYDeuU25UwmZywBgjRMAAQXAAExwgN65WLlYufAAAAADuXm58AAAAAUFBbmUAAAApb5gwAB+wAC5qAAAAI8xYJsAALm0AAAEgLBgkjIAub8AAASif2CNEwC5zAAABJnLYI0TAABgwABMYQE/BAgBwABMY4IAwCMx8QgBwABMZIMAwCMx/AgBwABMZYQAwCMyBwkAudzAAExgAgACgLniwCMx2YG56sAjMeYABgbAAExngN659boMuikBALkfARq59sAA7ksAAAEDuh26KQAAAAAAAABgwAD2XQFKuiAB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gN7AAEJdwABCXcAAQ4QAAAADwABCg8AAQ4QAAAAHBwfAAEKlAAAApb5gwAB+wADAAEK5AAAAjzFgmwAAwABCywAABLuUYI5jAMAAQuoAAASAsGCSMgDAAEL7AAAEon9gjRMAwABDDgAABJnLYI0TAMAAQyEAAASCF2CSWQAAYMAATHYBPwcIAcAATHmCAMAjOdAIAcAATHqDAMAjOd0IAcAATHuEAMAjOeoIAcAATHyFAMAjOfcIAcAATH2GAMAjOgQIAMAATHgewABDP8AAS/UBAAGCwABDU8AjOdAACQDAAENwwABMdQIAAoDAAEN2wCM5tIHAAEN+wCM5wwAIBsAATH+A3sAAQ4nAAEOUwABDwQAAu4oAAAABA8AAQ6LAAEPBAAAAAAAAAGCOYwFKwABDqAEfwABDrI6BAQABFsAAQ7guhDzAAEx4AAbAAEyIgN7AAEPGwABD3cAAQ/oBALkfARrAAEPHwADuSwAAAQPAAEPuwABD+gAAAAAAAABgwAD2XQFKwABD8QEWwABD9hbAAEPxLoCwwABMeoCwkjUGwABMgYDewABD/8AARBbAAETxAAC7d8AAS/ABGsAARADAAO5LAAABA8AARB/AAETxAAAAAQEBwABEOgAAALtzYKehAABgjmMBPgNOwABEV8AARFwAAJ05YI6OATXAAERiAAABAGCOjgEfwABEYo6eAwADHMAARG4uu4oAAAAAwABMfxbAAESALoCwwABMehbAAESGLqJ/wABMewA1AAAAAQBbARfAAESWgcAARJTAIzuRlBMewABEo8AAg2UBAAEWwABEsi6PMcAAS/sAjByBAMAjO5E9NQAAAAEAYKehAYDAAES+wCM7ayMcwABE0YIAwCM8C0EBAAErAAArF8AARNGCAMAjPAudOYHAAETYwCM7gKejAWCOjkrAAETiAYHAAETpwCM7gAbAAEyCgN7AAET2wABFDcAARh4AALt4wABL8AEawABE98AA7ksAAAEDwABFF8AARh4AAAADAwPAAEUjAAAAgIpgjmMAwABFLwAAALirYMAA8rMAwABFXAAAALtzYKehAABgjmMBPgNOwABFecAARX8AAIIRYI6gATXAAEWFAAABAGCOoAEfwABFhY6xBAAEHMAARZEuu4oAAAAAwABMfxbAAEWjLoCwwABMeoDAAEWpwCM8kxbAAEWwLpnL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JIDfwABExsAARN3AAEWqAAC3MAEawABEx8AA7ksAAAEDwABE6cAARaoAAAACAgLAAETuAAAAgxVgwAD0eQDAAEUAAAAAVGCPLQAAYI5jAT4BSsAARREBHMAARR8WwABFGC6lvsAAf8y5DgMAAybAAEVMARzAAEVMFsAARTwuu7LAAIAotzACAAKAwABFWcAjlSuBwABFYcAjlToAwAB/2WCOYybAAEWFARbAAEWFFsAARXUuu7HAAIAngt7AAICRYMAARNUWwABFmxbAAEWVLo8xwAB/zYQXmwkAwAB+1gbAAE0lgN/AAEWvwABFxsAAR4gAALhqARrAAEWwwADuSwAAAQPAAEXXwABHiAAAAAYGBsAARgcAAACSRF3AAPUdAV3AAFCBAWDAAEU/AMAARiMAAACAsGDAAPZdAMAARjkAAABUYI8tAMAARlAAAAC3n2CbAADAAEZnAAAAuGlgmwAAwABGhgAAALcUYMAAf7AAAGCOYwE+AUrAAEaXARzAAEalFsAARp4upb7AAH/MuQ4DAAMcwABG0hbAAEbCLruywACAKLhqBgAGgMAARuTAI5YOgcAARvPAI5YpgsAARvnAI5Y4g8AARxDAI5ZEhMAARxvAI5ZRhcAARyrAI5ZeAMAAf90mwABHTgEWwABHThbAAEc+LruxwACAJ4LewACAkWDAAETVHsAAR17AAINlAQABFsAAR30WwABHbS67ssAAgCiPMcAAf80AAMAAftYGwABNJoDfwABHjcAAR57AAEhLAACD8QEawABHjsAA7ksAAAEDwABHpcAASEsAAAABAQHAAEexAAAAhAFgwAD2xwAAXAE+BD0cwABHwoDAAEe9wCOXX4IRAQABJ7u2AMAA9sk9HMAAR+mAwABH5MAjl1+CEQEAARbAAEfvLruxwACAJwDAAPbJPRzAAEgKgMAASAXAI5dfghEBAAEnu7cAwAD2yT0cwABIMYDAAEgswCOXX4IRAQABFsAASDcuu7LAAIAoAMAA9skAACOPswAjj9oAI5ABACORSgAjkbwAI5H/ACOU+AAjldsAI5csACOX9QAAAAkCwABNKYDewACb/sAAnATAAKDJA7u4AAABYMAATRsAAAIEwABNK4DewACcisAAnJkJu7EBGsAAnGDAAO5LYMAATeMABMAATSyA3sAAnMDAAJzPCbuyARrAAJyfwADuS2DAAEwQAAEFwABNNIDewACc1MAAnNTAAJ1vAAAAA8AAnPHAAJ1vAAAABAQEwACdDAAAAKW+YMAAfsAAwACdGgAAAI8xYJsAAMAAnSwAAAS7sWDAAE3jAMAAnUIAAAS7smDAAEwQAABgwABNKQE/AwgBwABNK4IAwCOYyQgBwABNLIMAwCOY2AkAwACdW8AATSgCAAKAwACdYcAjmK2BwACdacAjmLwABAbAAE0vgN7AAJ10wACdi8AAnh0AALtywABL8AEawACddcAA7ksAAAEDwACdmsAAnh0AAAAAAAAAYI5jAT4BSsAAnaMBHMAAnbEWwACdqi6lvsAAS/q5DgMAAxzAAJ3VFsAAncUuu7LAAE0su3LAAEvwAAAAAMAATAgmwACeAAEWwACeABbAAJ3wLruxwABNK4LewABN5WDAAETVFsAAng4WwACeCC6PMcAAS/uEF5sJAMAAftYGwABNMIDewACeIsAAnjnAAJ8MAAC7d8AAS/ABGsAAniPAAO5LAAABA8AAnkLAAJ8MAAAAAQEBwACeXQAAALtzYKehAABgjmMBPgFKwACedgEcwACehBbAAJ59LqW+wABL+rkOAwADHMAAnrEWwACeoS67ssAATSy7d8AAS/ABAAGAwACeu8AjmhUAwABMCibAAJ7nARbAAJ7nFsAAntcuu7HAAE0rgt7AAE3lYMAARNUWwACe/RbAAJ73Lo8xwABL+4QXmwkAwAB+1gbAAE0xgN7AAJ8RwACfKMAAoDsAALt4wABL8AEawACfEsAA7ksAAAEDwACfMsAAoDsAAAADAwPAAJ8+AAAAgIpgjmMAwACfSgAAALirYMAA8rMAwACfdwAAALtzYKehAABgjmMBPgFKwACfkAEcwACfnhbAAJ+XLqW+wABL+rkOAwADHMAAn8sWwACfuy67ssAATSy7eMAAS/ADAAOAwACf1sAjmuCBwACf3cAjmu2CwACf6sAjmvwAwABMCybAAKAWARbAAKAWFsAAoAYuu7HAAE0rgt7AAE3lYMAARNUWwACgLBbAAKAmLo8xwABL+4QXmwkAwAB+1gbAAE0ygN7AAKBAwACgZsAAoMcAALt0ARrAAKBBwADuSwAAAQPAAKB8wACgxwAAAAEBAcAAoIgAAAClq2COYwAAYKehAUrAAKCWASbAAKCWAR7AAKCuqd8BAAGAwACgw8Ajm9UAYKehAAAjmSkAI5neACOaqQAjm6IAI5wKAAAABALAAE01gN7AAKDMwACg0sAAr903u7kAAAFgwABNTwABYMAAgDEAAQXAAE0+AAAAAAQAAAMAAAAAAAQEBAAAAAClvmDAAH7AAAAAAACPMWCbAAAAAAAAkkdbAAAAAAC5H1sAAGDAAE01AT8BCQAAwABNXAQABIAAwCOcX4EAwCOca4IAwCOcdYMAwCOcfQAFBsAATTeA38AASX/AAEmawABJpQECnWYAAAABA8AASaXAAEmlAAAAAAAAAF3AAFBiAmDAAFBOWwAGwABNOIDfwABJqsAAScHAAEngAQCjbAEawABJq8AA7ksAAAEDwABJy8AASeAAAAAAAAAAYMAA9l0BSsAASc4BJ7adBsAATTqA38AASeXAAEoDwABPiAAAuAABGsAASebAAO5LAAABA8AASiHAAE+IAAAAAQEBwABKUQAAAFRdwAD1HQFdwABQgQFgwABFPwAAYMAART8BPgRJwABKYiEcwABKcIDAAEpmwCOdYEEBAAErAMAA9dI+Ak7AAEqFwABKjgAAm5BgwAD0eQEWwABKnBbAAEqQLp1mwACANbVLwABQa0nAAEq2IRzAAErLFsAASsSAwABKusAjnWBawAD1TEEBAAGBwABKzsAjnaQAwAD1nD4DPRzAAEsxFsAASyoupb7AAH/Mty0BAAGAwABLSMAjnWAAwAB+4z0cwABLYxbAAEtcLqW+wAB/zLdUAwADFsAAS5YWwABLii6dZsAAgDWAsMAAUGaBwABLnMAjnaQewABLpsAAg2UBAAEWwABLtS6PMcAAf80AAMAAft89iMAATMfAI51gKz9JwABM7CEcwABNDxbAAEz8FsAATPAunWbAAIA1tUvAAFBrQQEAAZMAwAD1nD4BPRzAAE0kFsAATR0upb7AAH/MnTgDAAMcwABNbhrAAE06hhOEzQEAARbAAE2IFsAATXwunWbAAIA1tUvAAFBrAIiuHsAATafAAINlAQABFsAATbYujzHAAH/NAB7AAE3IwACDbAEAARbAAE3XLo8xwAB/zQAAwABKNz9OwABOAwAAALu6XcAA9R0BYMAART8AScAAThkhHMAATieAwABOHcAjnWBBAQABKwDAAPXSPgI9icAATjjAI58uHsAATk/AAO6CAQFgwABFPwEWwABOcYDAAE5n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ji6PMcAAS/uBwACvncAjrTknACsWwACvuBbAAK+yLo8xwABL+4QXmwkawACvzsAAf7gAwAB+2QAAI6P8ACOmgAAjp9cAI6z3ACOtzwAAAAQCwABNSoDewACv4MAAr+bAALVCN7u/AAABYMAATBAAAWDAAIA7AAEFwABNTgAAAAAEAAADAAAAAAACAgIAAAAApb5bAAAAAACPMVsAAGDAAE1KAT8BCQAAwABMJwIAAoAAwCOuJIEAwCOuLAABBsAATUyA38AAU1DAAFNnwABTjQEAo2wBGsAAU1HAAO5LAAABA8AAU3HAAFONAAAAAAAAAGDAAPZdAUrAAFN0ASe2lwAAI65VACOumAAAAAECwABNT4DewACv4MAAr+bAALVCA7vAAAABYMAATUoAAAMEwABNUYDewACwWsAAsGoJuR8BGsAAsELAAO5LYMAA9l0ABMAATVKA3sAAsHrAALCEGJJHAGCOYwAEwABNU4DewACwncAAsKIYgIoAYJICASsBBcAATVyA3sAAsKfAALCnwACxPgAAAAPAALDEwACxPgAAAAQEBMAAsN8AAAClvmDAAH7AAMAAsO0AAACPMWCbAADAALD/AAAEkkdgjmMAwACxEAAABLkfYMAA9l0AAGDAAE1PAT8DCAHAAE1SggDAI69ZCAHAAE1RgwDAI69mCQDAALEqwABNTgIAAoDAALEwwCOvPYHAALE4wCOvTAAFBsAATVaA3sAAsUPAALFawACxeQAAu3LAAEvwARrAALFEwADuSwAAAQPAALFpwACxeQAAAAAAAABgjmMBSsAAsW8BFsAAsW8ukkfAAE1SBsAATVeA3sAAsX7AALGVwACyLwAAu3fAAEvwARrAALF/wADuSwAAAQPAALGewACyLwAAAAEBAcAAsbkAAAC7c2CnoQAAYI5jAT4CPSMcwACx2BbAALHSLoCKwABNU0EBAAErAMAA9dIXwACx0i6Aih/AALHgkiYBAAEWwACx/S6SR8AATVIAwABNUysBYJICSsAAsg4BH8AAshmOgQEAARbAALIlLoCKwABNUwAGwABNWIDewACyNMAAskvAALLbAAC7ccAAS/ABGsAAsjXAAO5LAAABA8AAslLAALLbAAAAAgICwACyaQAAAJJMYI5jAMAAsokAAAC7c2CnoQAAYI5jAUrAALKlAR3AALKru3HAAEvwAgAC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wABIDsAASxUAAAAAAAAAYI44AT4DTsAASCnAAEguAACCHGDAAFu+ARzAAEgwLsAAQEfAAFohAQFgwABbvgEawABIVMAAW8MAwABbNEfAAEhhgMAASGnAKT2CBAHAAEiOGsAASI7AAFvEAD4CTsAASK7AAEi4AACEMGCNnwEmwABIrgEWwABIzBzAAEi6LsAAQEXAAFohAAAAAMAAWx6DssAAXGNgjZ9KwABI2gEWwABI64HAAEjhwCk92ZJPjaQBwABJEhrAAEkSwABbxQA+Ak7AAEk2wABJQgAAmFBgjV4BJsAASTYBFsAASVYcwABJRC7AAEBFwABaIQAAAADAAFseg7LAAFxjYI1eSsAASWQBFsAASXeBwABJa8ApPj2ST41iAcAASZ4awABJnsAAW8YAPgJOwABJ0MAASeMAAMAAQGNgkM4BJsAASdABHMAASeUuwABAU8AAWiEAAAAAwABbKWCQzkrAAEn+ARbAAEoYgcAASgXAKT6hkk+Q0AHAAEo/GsAASj/AAFvHAD4CTsAASnPAAEqHAADAAEBaYJInASbAAEpzARzAAEqJLsAAQFPAAFohAAAAAMAAWylgkidKwABKogEWwABKvYHAAEqpwCk+/JJPkio9MMAAStEfwABK28AA9AsBAAEkwABLEAInwABAZIDAAEsLwCk9ggAGwABbRYEVwABLGsAASzfAAEukAAC/5AEawABLG8AA7ksAAAEDwABLTMAAS6QAAAAAAAAAYJLhAT4CPRzAAEtVLsAAQD7AAFohAQABGsAAS23AAFuGAMAAWyxKwABLhQEcwABLjC7AAEBcwABaIQAAAADAAFsrBsAAWyuBFcAAS6nAAEu6wABNtQAAwABAXMAAWiEAAAABA8AAS8zAAE21AAAAAAAAAGCS4QE+A07AAEvowABL7QAAghxgwABbzAEcwABL7y7AAEBHwABaIQEBYMAAW8wBGsAATBTAAFvRAMAAWzRHwABMIYDAAEwpwClAGgIBwABMTxrAAExPwABb0gA+Ak7AAExlwABMaQAAmTxgjM4BFsAATHwcwABMay7AAEBIwABaIQAAAADAAFsgg7LAAFxZSsAATIoBHMAATKMWwABMlYHAAEyRwClAcZJejN1EAQABHMAATKQuwABAQMAAWiEAAAAAwABbMgDAAPUsAcAATNcawABM18AAW9MAPgJOwABM/cAATQoAALXgYI44ARzAAE0MLsAAQFvAAFohAAAAAMAAWypKwABNKQEcwABNSxbAAE09gcAATTDAKUDwkl6OPUQBAAEcwABNTC7AAEBAwABaIQAAAADAAFsyAMAA9Sw9MMAATWsfwABNdcAA9AsBAAEkwABNsAInwABAZYDAAE2rwClAGgAGwABbLIEVwABNusAATb/AAE7ZAADAAEA+wABaIQAAAAEDwABNzcAATtkAAAABAQHAAE3XAAAAwABAZmDAAFt2AABcAT4DScAATeshFsAATfAur//AAFr/SsAATf4AP07AAE4TwABOHgAAwABAZ2DAAFt2ARzAAE4gLsAAQEfAAFohAQFgwABbdgEawABOO8AAW3sAwABbNEAcwABOY4HAAE5YwClB2UEBAAGAwABOZsApQakAwAD10sAATljAAE5yASQAByfAAEBoJ5GMgMAATqXAKUGpJ8AAQAaBwABOusApQdkngTEWwABOxi7AAEBhwABaIcAAW00GwABbRoEVwABO3sAATvDAAFItAAC/6gEawABO38AA7ksAAAEDwABO+cAAUi0AAAAAAAAAYLD4AT4DTsAATwzAAE8RAACCHGDAAFueARzAAE8TLq36AQFgwABbngEawABPJsAAW6MAwABbPEfAAE8zgMAATzvAKUKtBQHAAE9YGsAAT1jAAFukAD4DTsAAT3XAAE+DAACrBmCwvwEcwABPhS6m0QAAAADAAFsTTsAAT5/AAE+qAADAAEAkYMAA9HkBHMAAT6wuq0YAAAAAwABbQErAAE+/ARzAAE/SFsAAT8Yuv9fAAFtLv/kCAAKBwABP4sApQv6CwABP8cApQx8AwABatgHAAFATGsAAUBPAAFulAD4CTsAAUDLAAFA2AACZPGCwrQEcwABQOC6YOgAAAADAAFsRSsAAUE0BH8AAUFjAAHnlAQABgcAAUGLAKUOIAAHAAFB9GsAAUH3AAFumAD4CTsAAUJvAAFCfAACZPGCwrQEcwABQoS6YOgAAAADAAFsRSsAAULYBH8AAUMHAAHnbAQABgcAAUMrAKUPWAAHAAFDlGsAAUOXAAFunAD4CTsAAURDAAFEUAACZPGCwrQEcwABRFi6YOgAAAADAAFsRSsAAUSsBH8AAUTbAAHHiAQABJsAAUUwBgcAAUUzAKUQkYMAAccwAAcAAUWcawABR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H6jYqN6vAgPAAEG1AAABYMAAXnAAAA4EwABeeIEfqSCpOwbAAEG2AGDAAPR5AZMEwABeeYEfqVCpaQbAAEG3AGDAAPR5AZQEwABeeoEfqX6plgbAAEG4AGDAAPR5AZUEwABee4EfqaupyAbAAEG5AGDAAPR5AZYEwABefIEfqh+qKxirvwBgwAD0eQAEwABefYEfqmyqdRijawBgwABeoAAEwABefoEfqtCq2BirsABdwAD1HQFgwABeiwAEwABef4EfqwWrCRiCFwBgwAD2XQAEwABegIEfqzWrPxiU3ABgwAD2XQAEwABegYEfq2urfRiruwBgwAD2XQAEwABegoEfq8qr1Bie8ABdwAD1HQFgwABemQAEwABeg4EfrESsTxirvABgwAD2XQAEwABehIEfrJesoxirvgBgwAD0eQAEwABehYEfrNis3BiCGgBdwAD1HQFgwABeRgACBcAAXomBH6zhrOGueQAAAAOs7a55AAAADgAADqz9AAAAgLBgwAD2XQErrRAAAACrqmDAAPZdASutMQAAAKrzYMAAXjMBK61HAAAAl/9gwAD0eQGTrVsAAASrv2DAAPR5ASutdAAABKNrYMAAXqABK62KAAAEq7BdwAD1HQFgwABeiwErrZ8AAASCF2DAAPZdASutsAAABJTcYMAA9l0BK63HAAAEq7tgwAD2XQErreYAAASe8F3AAPUdAWDAAF6ZASut/QAABKu8YMAA9l0BK64VAAAEq75gwAD0eQErri4AAASCGl3AAPUdAWDAAF5GAStgwABedgE/CwgBwABefIQAwCpU2AgBwABefYUAwCpU5ggBwABefoYAwCpU9AgBwABef4cAwCpVCAgBwABegBQAwCpVFggACAHAAF6BFADAKlUkCQAIAcAAXoIUAMAqVTIKAAgBwABegxQAwCpVRgsACAHAAF6EFADAKlVUDAAIAcAAXoUUAMAqVWINAAkArj3AAF50BQAFGq5MwABesICuVsAqVKCCrlzAKlS8g65owCpUyoGubsAqVK4ABcAAXoqBH65+rn6uuQCSQwADrpOuuQAAAAAAAABgwABedgE/CwgBwABehSsIAcAAXoQrCAHAAF6DKwgBwABegisIAcAAXoErCAHAAF6AKwgBwABefysIAcAAXn4rCAHAAF59KwgBwABefCsJAK6ewABedQEAARqusMAA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GsAASDGewD4BPRzAAEh0FMAASF3AKx99FABPAQABJsAASHwBHMAASHyBwABIeMArEj7AAEJ4AQABFMAASIzAKyEbGAAAwAB1BmCw0QDAAPUuPz8/P0nAAEj1IhTAAEj5wCsfbRMAACEcwABJGxTAAEkEwCsffRQAQQEAASsAwAD10j4CPRXAAEkywCsfkxU1AAAAAQBgwAD0eQEUwABJQsArHAcJADUAAAABAGDAAPR5ARXAAElCwCscBwkcwABJVBQAwCsjJBYAXQEAAZQAwAD1nhQAwCsjJBYAScAASWQhGsAASWmewD4BPRXAAEmPwCsffRQrPz4BPRXAAEnbwCsffRQrPRXAAEoZwCscrw01AAAAAQBdwAD1TgJgsNFgwABf4AGDwABKIMArEl81AAAAAQBgwABobwEUwABKKsArHFcMADUAAAABAGDAAF/gAR/AAEo4wABf9AYAAAaTJRTAAEplwCse5xEAwABCghTAAEqMwCsefg8AsqsUwABKtsArHyESAMAAQooUwABK1cArH20TAMAAQogUwABK/sArH5MVAMAAQo8UwABLO8ArH30UADUAAAABAFwBHMAASikUwABKKcArI6UWAICyAgACFMAASinAKyPDFwAUAMArI9oYAADAAPVjFADAKyPaGAA9HMAAS3EUwABLY8ArG8cIAJPgAQABFMAAS3jAKxw+CwAAwAD2HT0cwABLl4fAAEuHwCsbiU8BAAEUwABLm8ArHD4LAADAAPYbSsAAS6oBFMAAS7HAKxyvDQA9HMAATDSFwABMIsArGjGDvAEAARTAAEw8wCscGwoAAMAA9Os9HMAATRGGwABNAcArGlGAogEAATTAAE0WA8AATRbAAE9dAAAAAgICwABNHgAAAIFmYMAAWfgAwABNKAAAAIHaYMAAWfgAAGDAAPR5AT4JTsAATTfAAE0+AACBEGDAAPR5AR7AAE1KwAB7GQIAAhbAAE1pFsAATWEUwABNX8ArJSsLAIQJwABZoaAqwABZhxbAAE2BFsAATXkUwABNd8ArJToMAIQJwABZoaAqwABZhwBJwABNliEcwABNoRTAAE2awCslUw0AQQEAAZMAwAD1nErAAE2nARTAAE2uwCslUw0AP07AAE3IwABN0gAAwABCkGCT+AEWwABN/BzAAE3rFsAATeCAwABN1MArEjGrAsAAfIiv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ZC6y8MAAYNE+AUrAAEl3ARrAAEmJwABhAz89F8AASZkusvApwABg0UrAAEmvARzAAEnLFsAASbYuwABCp8AAYC7AAGA1k+EBAAEjFsAASdUusu7AAGBIGsAASerAAGEDGsAASfzAAGEEAV3AAGF+AWDAAGDzAMAAYZIGwABg2oEmwABKEcAASjDAAEpzAADAAEKuARrAAEoSwADuSwAAAQPAAEo4wABKcwAAAAAAAABdwABhfgFgwABg8wFKwABKRAEcwABKRC6y4gEAARbAAEplFsAASlIWwABKSy6e28AAYNOsFbDXrCWxDADAAGDZBsAAYNaBJsAASnjAAEqNwABKowEAs0UBGsAASnnAAO5LAAABA8AASpfAAEqjAAAAAAAAAGDAAPKzAUrAAEqaARbAAEqaLrLwwABg0QbAAGDXgSbAAEqowABKy8AASxIBAMAAQn4BGsAASqnAAO5LAAABA8AASt3AAEsSAAAAAAAAAGCw+wFKwABK5gEjFsAASuYusvDAAGDRFsAASvkWwABK8i6e28AAYNOsFbDXKwFgsPsGwABg24EmwABLF8AASy/AAEueAACddwEawABLGMAA7ksAAAEDwABLNMAAS54AAAAAAAAAYMAAYEABPgFKwABLPQEfwABLSMAAYN0DAAIWwABLYC6e28AAYNMcwABLdBbAAEtoLsAAQqfAAGAuwABgNZ13AAAAAMAAYZoBsvAWwABLkC6y8MAAYNEAACt8+wArfU0AK32iACt+dgArfuwAK384ACt/nwArgCkAAAAHAsAAYN+BJsAAS6PAAEupwABSmAPAAELDAAABYMAAYEAAAAEEwABg4oEmwABL+MAATAcJwABCvMAAYC4AYMAAYWoAAgXAAGDxgSbAAEwMwABMDMAATLwAtXIAA8AATDTAAEy8AAAAAwMDwABMRwAAAJhQYLDsAMAATF8AAATAAEK8YMAAYWoAwABMgwAAAMAAQqxdwABhfgFgwABg8wAAYMAAYN8BPwIIAcAAYOKBAMArgMQJAMAATJ3AAGBgAgACgMAATKTAK4C3gsAATLHAK4DVAAXAAGDygSbAAEzBwABMwcAATXMAAAADwABM4sAATXMAAAABAQHAAEz1AAAAmFBgsOwAAGDAAGDfAT8CCADAAGDiH8AATSDAAGF7AQABFsAATTuAwABNL8ArgUasFbDX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XcAAYX4BYMAAYPMAAcAAZi8AAADAAELfYMAA8rMBK2DAAGFHAT8BCQDAAGZMwABhRQMAAoDAAGZTwCuaBIHAAGZbwCuaEQHAAELfgsAAZnXAK5opCQbAAGFJgSbAAGaHwABmpsAAZr4AALLnARrAAGaIwADuSwAAAQPAAGatwABmvgAAAAAAAABdwABhfgFgwABg8wFKwABmswEcwABmsy6y6QAAAADAAGE6BsAAYUyBJsAAZsPAAGbYwABm5wEAwABCrQEawABmxMAA7ksAAAEDwABm4MAAZucAAAAAAAAAYMAA8rMBSsAAZuMBKQbAAGFNgSbAAGbswABnAcAAZxoBALNFARrAAGbtwADuSwAAAQPAAGcLwABnGgAAAAAAAABgwADyswFKwABnDgEWwABnDi7AAELfwABhMQbAAGFOgSbAAGcfwABnNMAAZ00BALLwARrAAGcgwADuSwAAAQPAAGc+wABnTQAAAAAAAABgwADyswFKwABnQQEWwABnQS7AAELfwABhMQbAAGFPgSbAAGdSwABnZ8AAZ38BALLvARrAAGdTwADuSwAAAQPAAGdwwABnfwAAAAAAAABgwADyswFKwABncwEWwABncy7AAELfwABhMQbAAGFQgSbAAGeEwABnmcAAZ7ABALLuARrAAGeFwADuSwAAAQPAAGehwABnsAAAAAAAAABgwADyswFKwABnpAEWwABnpC7AAELfwABhMQbAAGFRgSbAAGe1wABnysAAZ+0BALLxARrAAGe2wADuSwAAAQPAAGflwABn7QAAAAAAAABgwADyswFKwABn6AEqBsAAYVKBJsAAZ/LAAGgVwABoLgEAwABCfgEawABn88AA7ksAAAEDwABoJ8AAaC4AAAAAAAAAYLD7AUrAAGgqASsGwABhSoEmwABoM8AAaEvAAGjIAACddwEawABoNMAA7ksAAAEDwABoUMAAaMgAAAAAAAAAYMAAYEABPgFKwABoWQEfwABoZMAAYVUDAAIWwABohC6e28AAYTAcwABomBbAAGiMLsAAQqfAAGAuwABgNZ13AAAAAMAAYZoBwABC3xbAAGi3LsAAQt/AAGExAAArmnEAK5rHACubCgArm1gAK5umACub9AArnEIAK5yDACucxAArnVIAAAAJAsAAYVaBJsAAaM3AAGjTwABuaQPAAELiAAABYMAAYS4A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wADTPxzAANNfhMAA00PALLh0gtABAAEUwADTaMAsuhAMAADAAPYaSsAA024APz0cwADTmoTAANN+wCy4dE8BAAEUwADTnsAsuhAMAADAAPYbPRzAANQOFsAA0/+BwADT88Ast9al2cAAQLPAAEROAgACFMAA1CXALLoQDAA0wADUNgPAANQ2wADUgAAAAAEBAcAA1EMAAACSZWCwrQAAYMAA9YIBPgE9HMAA1HAUwADUVMAsuWwKACABAAEUwADUccAsuvUNAAAAAMAAZcVJwADUkCXAANSbFMAA1JTALLmNCwBgsNQ+AT0cwADU1IbAANS4wCy4xk8BAAEUwADU2MAsuY0LAWCw1ADAAPYbPgE9HMAA1RsUwADU+MAsuRgIAE8BAAEmwADVHwEUwADVH8AsuY0LAGCw+ADAAPYbTsAA1UjAANVVAACAwV3AAPTbAWCwmQEcwADVc4PAANVhwCy3+8AARBUBAAEUwADVj8AsuY0LAADAAGQHPRzAANWrFMAA1Z7ALLujDACDvAEAATTAANWzA8AA1bPAANX4AAAAAQEBwADVuwAAAIObYLCZAABgwAD1ggE+AT0cwADV6BTAANXMwCy5bAoAIAEAARTAANXpwCy8CA0AAAAAwAD0607AANYRwADWIAAAqsxdwAD2DgFgsPgBHMAA1kgWwADWOYDAANYiwCy3yarMv2uR4gAAAADAAPTyTsAA1mnAANZ7AACyuF3AAPYOAWCw1AEcwADWwxbAANacgMAA1oXALLfJswm/bZHiAAAAAMAA9PJPwADXBsAA1wsAAAHAAERPXgAAAQABwABEUGDAAFg2AFwAA8AA1xjAAN9LAAAAAQAAAcAA1yMAAADAAERQYMAAWDYBK1wBPgdPwADXQMAA10UAAAHAAERRYQFgwABYyWDAAPKzAAPAANdWwADY9gAAAAEBAcAA12QAAACU3WDAAFjJAABgwADyswE+A07AANeIwADXlQAAv3pgsK0BHsAA16HAAFldAQABFMAA17HALL0pEAAAScAA18giIRzAANfZFMAA18zALL1CEQBBAQABKwDAAPXSACIcwADYBBTAANfxwCy85w4AQQEAASsAwAD10gEcwADYShbAANgrgcAA2B/ALLfWrIjAAECsv20CAAIUwADYXcAsvSkQABTAANhrwCy85w4AAMAAWVM+Aj0cwADY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ACsBwABD1CoAwABlMT4BScAARIEUwABEhcAs40oVAD4BPRzAAEVMh8AARUXALN7ITwEAAR/AAEVUwABlCQMAAhTAAEVewCziABAAIxTAAEWAwCzjexYAIMAARZnAAGT6AAAAACsBYMAAZO4BwABD1CoAwABlMT4BPRzAAEZyh8AARmvALN7ITwEAAR/AAEZ6wABlCQMAAhTAAEaZwCziABAAHMAARqcuwABD0wIAAoXAAEa7wCzeGxTAAEbAwCziABAAAMAAY7QBwABD1CoAwABlMT4BScAAR4EUwABHhcAs40oVAD4BPRzAAEiFh8AASH7ALN7ITwEAAR/AAEiNwABlCQMAAhTAAEiXwCziABAAKwHAAEPUFMAASLTALOQKGAAAwABlMT4BPRzAAElLh8AASUTALN7ITwEAAR/AAElTwABlCQMAAhTAAElwwCziABAAHMAASX4uwABD0wIAAoXAAEmSwCzeGxTAAEmXwCziABAAAMAAY7QBwABD1BTAAEnBwCzkChgAAMAAZTE/RsAASf8AwABKEgAAAIIXYMAAWF0AHMAASiEWwABKGi7AAEPKwABjPMAAY6yzTgEAAYXAAEovwCzeGwDAAFlZPgE9HMAASk8UwABKP8As4c4OACABAAEUwABKUMAs5ikPAAAATsAASnLAAEp7AAC64WDAAFjJARzAAEqEFsAASn0uwABDysAAYzzAAGOsv0oBAAEcwABKlxbAAEqQLsAAQ8rAAGM8wABjrKp5AQABhcAASqPALN4bAMAAWVcAwABZW0nAAEqwIRzAAEq9FMAASrTALOaHDwBBAQABKwDAAFjePgE9HMAASuAUwABK0MAs4c4OACABAAEWwABK/RbAAEruFsAASuEurTnAAGM8wABjqaq1wABAgZTdrLsAAD9KwABLGgGHwABLIcAs3shGwABLNADAAEtFAAAAmTxgsK0AFsAAS1iAwABLTMAs3X2B3MAA9XA+Ak7AAEtvwABLeAAAwABDvWDAAGVAATUAAAABAGDAAGVAARzAAEuFgMAAS3rALN19RAEAAYXAAEuGwCznVwDAAPViIxzAAEuLhgDALOeQQQEAASsAAIPAAEuOwCzd3IYAwCznkAFgwABlQEnAAEueIiIWwABLq4bAAEuiwCzne8AAQ77AAGVDARbAAEvQhsAAS8fALOd7lVjAAGVFARbAAEvzhsAAS+rALOd7wABBm8AAZUc+AT0cwABMm4TAAEyOwCzd+iABAAGFwABMnMAs51cAAD9KwABMtQGBwABMvMAs3Z8GwABkc4EtwABMy8AATOjAAE9mAADAAEPfARrAAEzMwADuSwAAAQPAAE0FwABPZgAAAAEBAcAATREAAADAAEPPYMAAY0MAAF3AAPYOAWCwrQE+BE7AAE0wwABNPQAAwABD4F3AAPYOAWCwrQEewABNQ8AAux8AAWCwrQAATsAATW3AAE13AAC8nWDAAGTXAR/AAE19wABk4gAAAABGwABNlgDAAE2nAAAAgdNgsK0AFsAATbiAwABNscAs6JGUOMAAY0c+Ak7AAE3VwABN4QAAwABD4WDAAGUrARzAAE3pgMAATePALOiRRAEAAYPAAE3qwCzo/gDAAGNFRsAATfkAwABOCAAAAKUOYMAAZP4AFsAATh2EwABOEcAs6SLAAEPPwABlNT4CTsAATjzAAE5JAACUlmDAAGTuARbAAE5RhcAATkvALOlclJbAAGUCScAATmchHMAATniGwABOa8As6YRBAQABKwDAAPXSPgE9HMAATpeCwABOjcAs6NnAAEPiAQABFsAATq+GwABOosAs6YRUwABk8gDAAGTdP0rAAE7XATXAAE7eAAABAF3AAPYOAWCwrQGBwABO3sAs6LA1AAAAAQBbARzAAE7sg8AATurALOoAgJkBAAEWwABO/YLAAE7zwCzo2ZQ4wABk2QDAAPYcgwDALOoABsAAZHSBLcAAT7nAAE/KwABVXgAAwABD0gEawABPusAA7ksAAAEDwABP38AAVV4AAAACAgLAAE/sAAAAmTxgsK0AwABP/QAAAKUOYLCtAABgwADyswE+DEnAAFAKFsAAUBKAwABQDsAs6oqsD7CwPgFKwABQUAEpP0nAAFCuIRzAAFDHFsAAULMustPAAGM8wABjq6p6AQABgcAAUNbALOqXAK8HPgFKwABQ5gEpP0nAAFFnHMAAUYMWwABReBbAAFFrLq05wABjPMAAY6mvKMAAQH2qbgEAAYDAAFGUwCzqigDAAFOiPgFKwABRogEqP0nAAFH6HMAAUgKAwABR/sAs6opBAQABgcAAUgXALOqXAMAA9dI+AUrAAFIUASk/TsAAUjrAAFJHAADAAEPjYMAAWF0BHMAAUl0WwABSSS6y08AAYzzAAGOrqnkBAAGAwABSacAs6ooArwZOwABSgcAAUoYAAIIXYMAAWF0BHMAAUo8WwABSiC7AAEPKwABjPMAAY6y/SQIAAoLAAFKcwCzrdoHAAFKqwCzqlwDAAFlVScAAUyMcwABTLIPAAFMnwCzrsUEBAAErAMAAWG9KwABTNQEpP07AAFQTwABUHQAAlbpdwAD1HQFgwABYNgEWwABULILAAFQfwCzrdpJEwABYYE7AAFROwABUWAAAVF3AAPUdAWDAAFg2ARbAAFRfg8AAVFrALOuxkkTAAFhgScAAVHIhHMAAVIcWwABUgITAAFR2wCzsHFrAAPVMQQEAARbAAFSUhcAAVIrALOxJWsAA9UwAwAD1nD4BSsAAVKQBKj9FwABUvAHAAFTFwABUywAAJ2DAAPR5AZMBHMAAVNaGwABU0MAs7L5cAQABFsAAVOKEwABU2MAs7BxawAD1TADAAPWmAY7AAFTqwCzsvhzAAFTvhsAAVOrALOy+XQEAAZQAwAD1nj4BScAAVPshHMAAVRAcwABVCITAAFT/wCzsHEQBAAGGwABVCcAs7L4AwAD1LEEBAAEcwABVHIXAAFUTwCzsSUQBAAGGwABVHcAs7L4AwAD1LADAAPXSPgFKwABVLwEqP0rAAFVPASkGwABkdYEtwABVY8AAVXzAAFcfAADAAEPkARrAAFVkwADuSwAAAQPAAFWLwABXHwAAAAICAsAAVZgAAACZPGCwrQDAAFWpAAAAg5tgsK0AAGDAAGTuAT4CRsAAVdsAwABV6gAAAKUOYMAAZP4AFsAAVggcwABWAhbAAFXzLsAAQ8HAAGM8wABjqkQBAAGAwABWA8As7bkAwABjRcAAQ8/AAGU1PgFJwABWGBzAAFYmFsAAViKCwABWHMAs7eKZPMAAZQBBAQABgcAAVinALO3GAMAA9dI+AUrAAFY6ARbAAFZHgsAAVkHALO3ilJbAAGUCP0rAAFb1ARzAAFb8LsAAQ9MCAAKAwABXEMAs7bmBwABXFcAs7cYAwABjtAbAAGR2gS3AAFckwABXMcAAWzsAAMAAQ9MAAAABA8AAV0TAAFs7AAAAAwICwABXUQAAAJk8YLCtAMAAV2IAAAClDmCwrQABwABXdQAAAMAAQ+VgwADyswEqYMAAZO4BPgVJwABXmxzAAFefLsAAQ9ICAAKAwABXtcAs7syBwABXusAs7tkAwABjskrAAFfCASs/TsAAWKDAAFilAACCF2DAAFhdARzAAFi7FsAAWKcustPAAGM8wABjq6p5AQABgMAAWMfALO7MAK8GTsAAWN/AAFjmAACB02DAAFhdARzAAFjvFsAAWOguwABDysAAYzzAAGOsv0kCAAKDwABY/MAs7zOBwABZAsAs7tkAwABZVU7AAFkdwABZKwAAo4NdwAD1HQFgwABYNgEWwABZMoPAAFktwCzvM5JEwABYYEnAAFlFHMAAWWEWwABZVhbAAFlJLq05wABjPMAAY6mvKMAAQH2qbgEAAYDAAFlywCzuzADAAFOiPgJOwABZhMAAWZIAAJJEYMAA9HkBFsAAWakWwABZm4TAAFmUwCzvbJJEwABYYFrAAPVMSsAAWioBH8AAWjXAAGT9AQABhsAAWkzALPAZAEnAAFpnIhbAAFp5hcAAWmvALO+ygPzAAPT/ACGCwABahcAs7uc+AUrAAFqlAR/AAFqwwABk+wEAARbAAFrJhMAAWsLALO9skkTAAFhgAD4BSsAAWuwBH8AAWvfAAGT8AgACFsAAWxSEwABbDcAs72ySRMAAWGCFwABbI8As77IAAAAs3CcALNxSACzcfwAs3MMALN0LACzdUwAs6FwALOpVACzthAAs7qAALPDlAAAACgLAAGR5gS3AAQ9qwAEPcMABNR0DwABEZQAAAWDAAGRoAAFgwABjhAcEwABkfIEtwAEQD8ABEBsJrTnAAGM8ARrAAQ/xwADuS2DAAEB5AATAAGR+gS3AARB4wAEQognAAERmAF3AAPYOAWDAAFg2AR7AARCTwAC7HwABYMAAWDYAAATAAGR/gS3AARDnwAERCgnAAERnAF3AAPYOAWDAAFg2AR7AARD7wAC7HwABYMAAWDYAAATAAGSAgS3AAREawAERLhjAAERoAGDAAGNDASsEwABkgYEtwAERRMABEWIYrxcBGsABETTAAO5LYMAA8rMBKgTAAGSCgS3AARMBwAETFhjAAERpAF3AAPVOAmCwrWDAAGVAASsEwABkfYEtwAETO8ABE3kJwABESsAAYzwAXcAA9g4BYMAAkM0BHsABE17AALsfAAFgwACQzQAAAQXAAGSOgS3AARFnwAERZ8ABEaoAAAADwAERd8ABEaoAAAABAQHAARF9AAAErTlgwABAeQAAYMAAZHkBPwIIAcAAZHyAAMAs8osJAMABEY3AAGR4AQABFsABEaCAwAERk8As8ousiMAAQIAABwbAAGSFgS3AARGvwAERw8ABEfEBAKtzwABjPAAAAAEDwAER08ABEfEAAAAAAAAAYK1qAUrAARHWARbAARHjFsABEdYurTnAAGM8wABkfKq1wABAgQbAAGSGgS3AARH1wAESGcABElUBALLTwABjPAEawAER9sAA7ksAAAEDwAESLcABElUAAAAAAAAAYK8eAUrAARI2ARbAARJDFsABEjYurTnAAGM8wABkfJ/mwABAfwbAAGSHgS3AARJZwAESesABEpoBAMAAQ8vAAGM8ARrAARJawADuSwAAAQPAARKDwAESmgAAAAAAAABgwABjSgFKwAEShgEWwAESkxbAARKGLq05wABjPMAAZHyvKsAAQIMGwABkiIEtwAESn8ABErrAARLhAQDAAEPBwABjPAEawAESoMAA7ksAAAEDwAESysABEuEAAAAAAAAAYMAAY0MBSsABEs0BFsABEs0uwABEaMAAZIAGwABkioEtwAETfsABE4/AARQyAADAAEO3ARrAARN/wADuSwAAAQPAARO1wAEUMgAAAAICAsABE8YAAACVWGDAAFg2AMABE90AAACVCmDAAFg2AABcAT4CPRzAARP/FsABE+ouwABEZsAAZH5PAQABgMABFAPALPRtAMAA9hs9HMABFCQWwAEUFi7AAERnwABkf08BAAGBwAEUKMAs9HwAwAD2GwbAAGSLgS3AARQ3wAEUSMABFLwAAMAAQ60BGsABFDjAAO5LAAABA8ABFGTAARS8AAAAAQEBwAEUegAAAMAAQZxgwACQzQAAXAE+AT0cwAEUphbAARSPLsAARErAAGM8wABkfU8BAAGAwAEUqsAs9REAwAD2GwbAAGSMgS3AARTBwAEU4MABNRsAAMAAQ7gBGsABFMLAAO5LAAABA8ABFPXAATUbAAAAAgICwAEVEQAAAJ/ZYL74AMABFTYAAABvYID/AABgwABjcAE+IE7AARVXwAEVaQAAwABETGDAAGP3AR/AARVvwABkEwYABRbAARWKLrLTwABjPMAAZIYWwAEVpy6rc8AAYzzAAGSFFsABFcAuwABDysAAYzzAAGOsgMABFdDALPWGFsABFe0uwABESsAAYzzAAGR9AcAARAoqTsABFjTAARZFAADAAEQIXcAA9g4BYMAAWDYBFsABFlmCwAEWR8As9anAAEQIwABj/07AARZ9wAEWjgAAwABDxF3AAPYOAWDAAFg2ARbAARaigsABFpDALPWpwABDxMAAZABOwAEW1MABFuAAAMAAQ7tdwAD1TgJgsK1gwABlQAEywAEW+WCwrWDAAGVAAEnAARcBGsABFwWewD4BPRfAARcjLsAARGmFwAEXO8As9n/AAGSCP07AARdlwAEXegAAwABEal3AAPYOAWDAAFjJAR7AAReAwAC7HwABYMAAWMkAAE7AAReqwAEXtwAAwABEa13AAPYOAWCwrQEewAEXvcAAux8AAWCwrQAATsABF+bAARf0AACSRF3AAPYOAWCwrQEewAEX+sAAux8AAWCwrQAATsABGfXAARoFAADAAERsYMAAZRgBH8ABGhPAAGUqAQAAAcAARG00wAEaKAPAARoowAEc1gAAAAIBAcABGjUAAACZPGCwrQABwAEaTAAAAIHiYMAAZQoBK2DAAPWCAT4CTsABGmXAARpuAADAAEO9YMAAZUABHMABGnyFwAEacMAs9n+YkAIAAhTAARqIwCz3iAkANMABGo0DwAEajcABGqEAAAAAAAAAYMAAZUABSsABGpMBH8ABGpfAAGVOAAAAAADAAPVpQUfAARqqFMABGrLALPeWCgAEAcABGtkawAEa2cAAZREAPgM9F8ABGwMUwAEa+sAs968LAJVYKcAAZUU9HMABGzAUwAEbIsAs9ygIAE8BAAEUwAEbNMAs94gJAADAAPYbQsABG0QAAcABG2kawAEbacAAZRIAPgQ9F8ABG5cUwAEbjsAs968LAJVYKcAAZUU9F8ABG78UwAEbtsAs968LAMAAQ8ApwABlRj0cwAEb8xTAARvlwCz3KAgATwEAARTAARv3wCz3iAkAAMAA9htCwAEcBwABwAEcLBrAARwswABlEwA+Az0XwAEcTBTAARxDwCz3rwsAwABBmynAAGVHPRzAARx3h8ABHGrALPb/TwEAARTAARx7wCz3iAkAAMAA9htCwAEciwABwAEcsBrAARywwABlEAA+AULAARzCAE7AAR6ewAEesAAAwABEbmDAAGUYAR/AAR6+wABlKgEAAAHAAERtNMABHtMDwAEe08ABIWQAAAACAQHAAR7gAAAAmTxgsK0AAcABHvcAAACB4mDAAGUKAStgwAD1ggE+Ak7AAR8QwAEfGQAAwABDvWDAAGVAARzAAR8nhcABHxvALPZ/mJACAAIUwAEfM8As+Y0KADTAAR84A8ABHzjAAR9MAAAAAAAAAGDAAGVAAUrAAR8+AR/AAR9CwABlTgAAAAAAwAD1aUFHwAEfVRTAAR9dwCz5mwsABAHAAR+EGsABH4TAAGURAD4EPRfAAR+uFMABH6XALPm0DACVWCnAAGVFPRfAAR/WFMABH83ALPm0DADAAEPAKcAAZUY9HMABIAoUwAEf/MAs9ygIAE8BAAEUwAEgDsAs+Y0KAADAAPYbQsABIB4AAcABIEMawAEgQ8AAZRIAPgM9F8ABIHEUwAEgaMAs+bQMAJVYKcAAZUU9HMABIJ4UwAEgkMAs9ygIAE8BAAEUwAEgosAs+Y0KAADAAPYbQsABILIAAcABINcawAEg18AAZRMAPgFCwAEg7gABwAEhExrAASETwABlEAA+Aj0XwAEhLhTAASElwCz5tAwAwABDvynAAGVEQsABIVAAPRzAASGUFsABIYCAwAEhbMAs9Yayqb76g7wBAAE0wAEhnAPAASGcwAEiIwAAAAEBAcABIakAAACZPGCwrQAAYMAA9YIBPgJOwAEhv8ABIcgAAMAAQ71gwABlQAEcwAEh1oXAASHKwCz2f5iQAgACFMABIeLALPtmCwA0wAEh5wPAASHnwAEh+wAAAAAAAABgwABlQAFKwAEh7QEfwAEh8cAAZU4AAAAAAMAA9Wk9F8ABIg0UwAEiBMAs+30MAJIhKcAAZUIAwAD0607AASI8wAEiUAAAwABEb13AAPYOAWCwrQE1AAAAAQBdwAD2DgFgsK0BHgDAALsfAAFgsK0AABQAwCz8GQsAPRzAASKAFsABIm6AwAEiWsAs9YaxUsAAVKuDvAEAATTAASKIA8ABIojAASekAAAAAQEBwAEilwAAAIIXYMAAWF0AAGDAAPWCAT4GPRzAASK1FMABIqXALPdPCQCdsAIAAhTAASK/wCz8cAwAGsABItbAAGUQAMAAZSBOwAEi7sABIvcAAMAAQ71gwABlQAEcwAEjD4XAASMDwCz2f5iQAgACFsABIyAUwAEjG8As/HAMAJMNwABYXzTAASMpA8ABIynAASM9AAAAAAAAAGDAAGVAAUrAASMvAR/AASMzwABlTgAAAAAAwAD1aT0XwAEjTxTAASNGwCz8uA0AwABDvinAAGVDTsABI3nAASOCAAC64WDAAFjJARzAASOLFsABI4QuwABDysAAYzzAAGOsv0oBAAEUwAEjl8As/HAMAADAAFlbScABI6QhHMABI7EUwAEjqMAs/UMOAEEBAAErAMAAWN4+AT0cwAEj1BTAASPEwCz3TwkAnbACAAIUwAEj3sAs/UMOABrAASP5wABlEADAAGUgP0FGwAElMMABJY7AASVDAAAAlIZgwABYXQAcwAElcRbAASVnFsABJVourTnAAGM8wABkfKyIwABAgLNOAQABFsABJYQUwAElf8As/HAMAJMNwABYXwDAAFlZPgNJwAElmCIWwAEltBbAASWmFMABJZzALP3dDwCSRMAAWGCA/MAA9P8AHMABJd8UwAEly8As/AALAILQAQABFsABJfIUwAEl6MAs/d0PAJMNwABYXwDAAPYaPgFCwAEnCwA/PRzAASc4FMABJyTALPwACwBPAQABFsABJ0YUwAEnPMAs/d0PAJMNwABYXwDAAPYbPRzAASdoFMABJ1jALPdPCQCdsAIAAhTAASdywCz93Q8AGsABJ47AAGUQAMAAZSAAwAD060bAASeswAEoBcABJ8AAAACTDWCw1AAWwAEn54DAASfTwCz1hrK1vvs+Ak7AASgawAEoJwAAlN1gwABYyQEcwAEoPRbAASgpLrLTwABjPMAAZIaqfQEAARTAAShNwCz+/AwAAK8LPRzAAShtFMABKF3ALPdPCQCdsAIAAhTAASh3wCz/Hg0AGsABKJbAAGUQAMAAZSBGwAEoqsABKPDAASi+AAAAkw1gsNQAFsABKN2AwAEoycAs9YayuL7+PgJOwAEpBcABKRIAAJTdYMAAWMkBHMABKSgWwAEpFC6y08AAYzzAAGSGqn0BAAEUwAEpOMAs/5AMAACvCz0cwAEpWBTAASlIwCz3TwkAnbACAAIUwAEpYsAs/7INABrAASmBwABlEADAAGUgT8ABKZXAASmaAAABwABEcGECW13AAPYOAWDAAFg2XAADwAEptMABKnoAAAACAgLAASm1AAAAgKhbAMABKcYAAACSRF3AAPYOAWDAAFg2AABcAT4BRsABKd3AASoKwAEp6wAAAJVYYMAAWDYAFMABKfvALQBVDgA+AT0cwAEqJBTAASoUwCz3TwkAnxoCAAIUwAEqN8AtAHgPABrAASpWwABlEQDAAFj3PRzAASqVgMABKoHALPWGvhsBAAEUwAEqr8AtACAMAADAAFS0PRzAASrkgMABKtDALPWGvhwBAAEUwAEq/8AtACAMAADAAFS1PRzAAStGFsABKzSAwAErIMAs9Yayvb8Ag7wBAAE0wAErTgPAAStOwAErtAAAAAEBAcABK1gAAACCF2DAAFg2AABgwAD1ggE+AT0cwAErdhTAAStmwCz3TwkAnbACAAIUwAErgMAtATwNABrAASuXwABlEQDAAGUgAMAA9Os9HMABK+EWwAErz4DAASu7wCz1hrK8vv+DvAEAATTAASvpA8ABK+nAASxFAAAAAQEBwAEr8wAAAIIXYMAAWDYAAGDAAPWCAT4BPRzAASwRFMABLAHALPdPCQCdsAIAAhTAASwbwC0BuQ0AGsABLDLAAGUTAMAAZSAAwAD0607AASxSwAEsZAAAwABEcWDAAPKzASpPwAEscsABLHcAAAHAAEQeYQFgwABYNlwAA8ABLInAAS23AAAAAQEBwAEskwAAAINcYMAAWDYAAFwBPgJJwAEsniXAASykFMABLKLALQJDDwBgwABYyT4BPRzAASzUhsABLL/ALPbSTwEAARTAASzYwC0CQw8BYMAAWMkAwAD2G0nAASzpJcABLO8UwAEs7cAtAkMPAGDAAFhdPgE9FcABLQvALQIGDSIUwAEtK8AtAgYNAAEcwAEtShbAAS1CFMABLUDALQJDDwFgwABYXZMNwABYX0EBAAEWwAEtXRbAAS1NLqtzwABjPMAAZIWa7aybAMAA9dI/PRzAAS2MFMABLXrALPlUCgCdsAIAAhTAAS2WwC0CQw8AGsABLarAAGUQAMAAZSA9HMABLc+DwAEtvsAs9h2DvAEAARTAAS3XwC0CIA4AAMAA9Os9HMABLgGEwAEt8MAs9k6DvAEAARTAAS4JwC0CIA4AAMAA9OtPwAEvkMABL5UAAAGy82EBYLCtXAADwAEvocABMMIAAAABAQHAAS+uAAAAmTxgsK0AAFwBPgJOwAEvzcABL9oAAJTdYMAAZTkBHsABL+bAAGNCAgACFsABL/sustPAAGM8wABkhhTAATAQwC0DrRAAAEnAATAcIRzAATAtFMABMCDALQPAEQBBAQABKwDAAPXSPgJOwAEwScABMFIAAMAAQ71gwABlQAEcwAEwYIXAATBUwCz2f5iQAgACFMABMGzALQOtEAA0wAEwcQPAATBxwAEwhQAAAAAAAABgwABlQAFKwAEwdwEfwAEwe8AAZU4AAAAAAMAA9Wk9F8ABMJkUwAEwkMAtBB0SAJTdFMABMKjALQPAEQDAAGVIP07AATFAwAExTAAAwABEcl3AAPUdAWCwrQExwAExW2CwrQA9HMABMW+FwAExY8As9n+DvAEAATTAATF3A8ABMXfAATHmAAAAAgICwAExhAAAAJk8YLCtAMABMZIAAADAAEO9YMAAZUAAAGDAAPWCAT4BScABMaQWwAExsRTAATGowC0E/BIAsKLAAGVKPgE9HMABMc8UwAExw8AtBKYQAE8BAAEUwAEx08AtBO8RAADAAPUuPwDAAPVtPRzAATH5FMABMe3ALQSmEACDvAEAARTAATIBwC0Djg8AAMAA9OtJwAEyFRbAATI2FsABMiGBwAEyGcAs9ZOCvoEygtWBUD4BRsABMknAATKLwAEyXQAAAJMxYLDUABbAATJ7gMABMmfALPWGsvzAAFSwPgFJwAEylRzAATKiFsABMpkuwABDy8AAYzzAAGSHwABDpAEAARTAATK7wC0FrxEAAMAAY1A+AUbAATLQwAEzOsABMuYAAACntGDAAFiJABzAATMYFsABMwQustPAAGM8wABkhqp+AQABFMABMzHALQWvEQAArww+A07AATNRwAEzVwAAlQpgwABYNgEcwAEzfRbAATNpLrLTwABjPMAAZIaqfAEAARbAATOfFMABM5LALQYQEgCTDcAAWIsArwo9HMABM8cUwAEztcAtAiAOACABAAEUwAEzyMAtBkoTAAAAPRzAATPsFMABM9zALPdPCQCfGgIAAhTAATQDwC0GShMAGsABNBvAAGURAMAAWPc/Pz0XwAE0XC7AAERoHMABNHMuwABDwsAAYzwBAAGFwAE0gsAs9n8AwABjsMAAZIA9F8ABNJQurxcpwABkgUrAATS3AR/AATTCwABkZwQABC4WwAE05S7AAERowABkgBTAATT7wCz3KAgAh8ABNQrALPb/AAAALPLSACzzJgAs84MALPPkACz0OAAs9NwALPVRAC0HVAAAAAcCwABkj4EtwAE5WsABOWDAAVpGA8AARHMAAAFgwAD1xQABYMAAY8YFBMAAZJGBLcABOafAATmsCa8MAGDAAGuZAATA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AEJUwC2k84DAAEJawC2k1wDAAGXfPgFKwABCqwEawABCwcAAZl0/ScAAQtocwABC44LAAELewC2k80EBAAEWwABC9hbAAELmLqtzwABlrcAAZdObDayVAMAA9dI+AUrAAEOCARrAAEOYwABmXj9OwABEDMAARBQAAJQ4XcAA9R0BYLCtATHAAEQjYLCtAD0cwABELS7AAENtAgACgsAAREXALaTzNMAAREsDwABES8AARawAAAABAQHAAERYAAAAmdJgsK0AAGDAAH02AT4CScAARGwcwABEcC6Z0wIAAoXAAER8wC2qLYDAAESGwC2k1wDAAGXfPgI9HMAARKGEwABEmcAtqeNPAQABhcAARKXALaotAMAA9S5KwABFTgEawABFY8AAfT4/SsAARYYBGsAARZvAAH08AMAAZeRKwABFtQEfwABFwMAAZmMBAAGEwABFz8AtqeMAPgRJwABF7CIcwABF9YDAAEXwwC2k10EBAAGCwABF+MAtpPMAwAD10gEcwABGAC6Z0wIAAoDAAEYMwC2k14LAAEYSwC2k8wDAAGXfPgFKwABGcgEawABGiMAAZl5JwABGnxzAAEajLpnTAgACgsAARq/ALaTzgMAARrXALaTXAMAAZd8+AUrAAEcVARrAAEcrwABmXz9OwABJscAASbkAAJQ4XcAA9R0BYLCtATHAAEnIYLCtAD0cwABJ0i7AAEROAgACgMAASenALaTXNMAASe8DwABJ78AAS1AAAAABAQHAAEn8AAAAmdJgsK0AAGDAAH02AT4CScAAShAcwABKFC6Z0wIAAoXAAEogwC2rrYLAAEoqwC2k8wDAAGXfPgI9HMAASkWEwABKPcAtq2NPAQABhcAASknALautAMAA9S5KwABK8gEawABLB8AAfT4/SsAASyoBGsAASz/AAH08AMAAZelKwABLWQEfwABLZMAAZmMBAAGEwABLc8Atq2MABsAAZfCBMMAAS4rAAEupwABL+gAAwABFFwEawABLi8AA7ksAAAEDwABLvsAAS/oAAAABAQHAAEvLAAAAmTxgsK0AAGDAAHy0AT4BSsAAS9YBHMAAS/EWwABL3S7AAEUawABlrcAAZdREAQABgMAAS/LALayCAMAA9WIGwABl8YEwwABL/8AATBTAAExRAADAAEO8ARrAAEwAwADuSwAAAQPAAEwfwABMUQAA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wACSqQAAXAE+DUnAAEQzFsAARDyAwABEN8AuEuLAAEXDwACS+ErAAERGAD89F8AARFeAwABEUsAuEuLAAEXDKcAAkvhOwABEfcAARIQAAK8KYMAAlKMBH8AARIrAAJSuAgACgMAARJvALhLiLgBOwABEssAARLwAAMAARcRgwADyswEcwABExYHAAES+wC4TMYIjAAAAAMAAlKlJwABE0CGCwABE1cAuE1tKwABE4AA/PRfAAETygMAARO3ALhLiwABFxSrAAJL3RcAARQkBwABFEsAARRQAAFtgwAD0eQGTARzAAEUbg8AARRnALhO7XAEAARbAAEUzFsAARSSBwABFHcAuEzHAAEXJwACUpVrAAPVMAMAA9aYBi8AART3ALhO7HMAARTuDwABFPcAuE7tdAQABlADAAPWePgJOwABFWMAARWAAAKfAYMAAkN4BHMAARWeAwABFYsAuEuLAAEXKAwADFsAARXouqYbAAGalHMAARa4WwABFoIHAAEWZwC4TMcAARcnAAJSlRAEAAYPAAEWvwC4TuwDAAPUsHMAARcoWwABFuoHAAEWzwC4TMcAARcvAAJSmRAEAAYPAAEXLwC4TuwDAAPUsAMAAkrRJwABF1iEcwABF4oTAAEXawC4UKkEBAAErAMAA9dI9HMAARfUWwABF6y6yS8AAZtVPAQABhMAARfnALhQqAMAAZmo/RsAARg3AAEZAwABGIgAAAICfYMAAkN4AFsAARjCBwABGKcAuEzHAAEXMwACUpz4BPRzAAEZSFsAARkguskvAAGbVgJkBAAEcwABGXoDAAEZZwC4S4sAARc0CAAIWwABGby6phsAAZqUmwABGhAGDwABGhMAuFQhgwACSqQDAAJK1AMAAZms9HMAARpuAwABGlsAuEuLAAEXOAAAAAMAAkrY9HMAARrsWwABGsS6yS8AAZtVPAQABFsAARsSAwABGv8AuEuKVYcAAkqwAwABmaj0cwABG3BbAAEbSLrJLwABm1U8BAAEWwABG5YDAAEbgwC4S4pViwACSrQDAAGZqPRzAAEb/FsAARvUuskvAAGbVgJkBAAEWwABHFxbAAEcLgMAARwbALhLiwABFz8AAkqspwAD1cQDAAGZrPRzAAEcuFsAARyQuskvAAGbVTwEAAYDAAEcywC4S4gDAAGZqBsAAZveBM8AAR0DAAEdRwABkKQAAwABFfwEawABHQcAA7ksAAAEDwABHY8AAZCkAAAAAAAAAXAE+Ez0cwABHbC7AAEXQAAAAAMAAZvhOwABHlMAAR5kAAKsBYMAAlL0BIxrAAEepwACULh/AAEe7wACUywIAAhbAAEfJLq/ewABmmsAAZt8uACsBYMAAlL09NQAAAAEAYMAAlL0BgMAAR+3ALhasIxzAAEfzgQDALhbvQQEAASsAACscwABH84EAwC4W78AARdEAAAAAwACUxgFcPRzAAEgJLsAARdIAAAAAwABnAj0cwABIHy7AAEXTAAAAAMAAZwE9HMAASJsWwABIlBbAAEiFFsAASH8ulQjAAGbjrlrAAJUcKcAA9XGDvAEAATTAAEijA8AASKPAAEjkAAAAAQEBwABItAAAAID7YMAAkN4AAGDAAPWCAT4BPRzAAEjCLsAARZQBAAEmwABI2AGBwABI2MAuF5ZgwACSYgDAAGb0AMAA9Os9HMAASVcWwABJUBbAAElCFsAASTwulQjAAGbjwABF1MAAlR0pwAD1cYO8AQABNMAASV8DwABJX8AASZ8AAAABAQHAAElwAAAAgPtgwACQ3gAAYMAA9YIBPgE9HMAASX4uwABFlQEAASbAAEmTAYHAAEmTwC4YHGDAAJKHAMAAZvUAwAD06z0cwABKKhbAAEojFsAAShUWwABKDy6VCMAAZuPAAEXVwACVHinAAPVxg7wBAAE0wABKMgPAAEoywABKcgAAAAEBAcAASkMAAACA+2DAAJDeAABgwAD1ggE+AT0cwABKUS7AAEWWAQABJsAASmYBgcAASmbALhiiYMAAkqkAwABm9gDAAPTrTsAASo7AAEqaAADAAEXWXcAA9g4BYLDUAR7AAEqgwAC7HwABYLDUAAA9HMAASw8WwABK/RbAAEr3LpUIwABm48AARdfAAJUfg7wBAAE0wABLFwPAAEsXwABXawAAAAEBAcAASyAAAACA+1sAAGDAAPWCAT4CT8AASy7AAEszAAABgX5hAl3AAPTbAWCw1GDAAJQQXAADwABLOMAAULMAAAACAgLAAEtdAAAAhPldwAD02wFgsNQAwABLfAAAAK8KYMAAlBAAAFwBPgM9HMAAS5WFwABLjsAuGZ2CIwAAAADAAJQYScAAS6QhFsAAS7CFwABLqcAuGZ3AAEXYwACrAj4DPRzAAEvYhMAAS8/ALhmKg7wBAAE0wABL4APAAEvgwABNngAAAAEBAcAAS/AAAACTDWCw1AAAYMAA9YIBPgM9HMAATBsWwABMBy6gCMAAZuKvaQEAAYbAAEw4wC4aEAC29knAAExOGsAATFjAAJQrPgE9HsAATHHAAO5gAQABJMAATKIFJ8AARdmGwABMiMAuGhAntJ0pJ8AARdoAPz0cwABMzhbAAEzFFsAATL8ulQjAAGbjoBfAAJUZq7oCAAKGwABM38AuGhA0wABM6APAAEzowABNkAAAAAEBAcAATO8AAACAz2Cw+AAAYMAA9YIBPgE9HMAATVwcwABNIxbAAE0KLpUIwABm46+uAQABh8AATT7ALhrEAMAAlWPAAEXbAgABLgHAAEXcKsAAkP0AwACVCgDAAPTrPRzAAE23gcAATavALhjngJkBAAGEwABNvsAuGYoAwAD2HErAAE3TAD89HMAATjccwABOA4TAAE3twC4ZioEnAQABNMAATgkDwABOCcAATigAAAABAQHAAE4KAAAAgwZgsNQAAGDAAPKzAUrAAE4QASEcwABOHYHAAE4RwC4Y54LQAQABhsAATibALht2AMAA9hoAwAD054O8AQABNMAATj8DwABOP8AAUKoAAAABAQHAAE5PAAAAkw1gsNQAAGDAAPWCAT4DPRzAAE5zFsAATmoWwABOZC6VCMAAZuOgF8AAlRmrugIAAobAAE6EwC4b0DTAAE6NA8AATo3AAE9WAAAAAQEBwABOlAAAAIDPYLD4AABgwAD1ggE+A07AAE7GwABOywAAgPtgwACRpwEcwABO4xbAAE7dLpUIwABm46+uAQABh8AATv7ALhwlAMAAlWM9HMAATxsUwABPFsAuHDwIAMAARd0AAAAAwACRBD0cwABPQBbAAE82LrJLwABm1U8BAAEUwABPRMAuHDwIAADAAGZqAMAAlQpJwABPYxbAAE95FsAAT26FwABPZ8AuGZ3AAEXewACUFsAARd/AAJEQPgE9HMAAT7kWwABPpS6gCMAAZuKvaQEAAYbAAE/WwC4b0AC29j9JwABP9hrAAFAAwACUKz4BPR7AAFAXwADuYAEAASQABCfAAEXZhsAAUC7ALhvQJ7SdHMAAUGIWwABQTi6gCMAAZuKvagEAAYbAAFCIwC4b0AC29wA/AMAA9OtJwABQvCXAAFDFgsAAUMDALhlHYMAAkuU+Ak7AAFEDwABRDAAAhPldwAD02wFgsNQBMcAAUQ5gsNQBFsAAURQUwABRD8AuGUcCAWDAAJLlq8HAAJLqPRzAAFErg8AAUSbALhlgIAIAAoTAAFEswC4dfR/AAFE6wACUIwMAA4TAAFFPwC4dfRTAAFFZwC4ZRwIBYMAAkuUuAAAAScAAUXQlwABRfYLAAFF4wC4ZR2DAAJHYPgFJwABRoyIiJcAAUawUwABRp8AuGUcCAWDAAJHYYMAAkekAIRzAAFHqFsAAUeEUwABR3MAuGUcCAWDAAJHpn+zAAJHdQQEAASsAwAD10gAWwABSDxbAAFIGFMAAUgHALhlHAgFgwACR6Z/swACR3ao4vtE+B07AAFKwwABSvgAAwABF4GCw1AEmwABSsAEWwABSxRTAAFLAwC4ZRwIBYMAAkenAAEXgwACR62Cw1EAiJcAAUvOEwABS5cAuHotgsOwAFsAAUycUwABTGcAuHosEAWCw7KrCsO7AAFLlwABTPgBOwABTV8AAU1sAAJk8YLCtARbAAFNrhMAAU13ALh6LkmmwzU7AAFOUwABTnwAAq7VgsNQBHMAAU6EuwABF4QEAAYXAAFOywC4e+ADAAGb6QCEcwABT1IbAAFPJwC4fG0EBAAErAMAA9dLAAFPJwABT2wEewABT3avfAQABhcAAU+bALh74AE7AAFQQwABUGQAAhPldwAD02wFgsNQBMcAAVBtgsNQBhsAAVBzALh8bPRzAAFQ4g8AAVDPALhlgIAIAAofAAFQ5wC4ffh/AAFRHwACUIwMAA4fAAFRcwC4ffhTAAFRmwC4ZRwIBYMAAkekuAAAAPgJOwABVZMAAVW0AAIT5XcAA9NsBYLDUAR7AAFVzwAD1IwEBYLDUARzAAFWpFsAAVaEUwABVnMAuGUcCAWDAAJHYwABF4sAAkeWBJwEAATTAAFWvA8AAVa/AAFXCAAAAAQEBwABVsAAAAIMGYLC/AABgwADyswFKwABVtgEWwABVuITAAFW2wC4gTqpWsMcAwAD05wA9HMAAVdWDwABV0MAuGWAgAgAChMAAVdbALh/uH8AAVeTAAJQjAwADhMAAVfnALh/uFMAAVgPALhlHAgFgwACR2C4AAABJwABWKCXAAFYxgsAAVizALhlHYMAAkTo+AT0cwABWWoPAAFZVwC4ZYCACAAIxwABWa2Cw1AEmwABWcQEWwABWcRTAAFZswC4ZRwIBYMAAkTqSW8AAkUJgsNQfwABWisAAlCgDAAMmwABWsQEWwABWsRTAAFaswC4ZRwIBYMAAkTqSW8AAkUJgsNQUwABWucAuGUcCAWDAAJE6LgAAAEnAAFbUJcAAVt2CwABW2MAuGUdgwACRpz4BPR7AAFcEq98CAAIawABXGqvwJMAAV1sCJ8AAReMUwABXVsAuGUcCAWDAAJGnAD8AwAD06z01AAAAAQBgwACUvQGAwABXc8AuFqwjHMAAV3mCAMAuIbNBAQABKwAAKxzAAFd5ggDALiGzwABF5AAAAADAAJTHAVxOwABYd8AAWIEAAMAAReVdwAD2DgFgwACQ3gEewABYh8AAux8AAWDAAJDeAABDwABYoyEWwABYtRbAAFirLrJLwABm1YD8wABmbkE+BU7AAFjWwABY2wAAgPtgwACQ3gEcwABY5xbAAFjdLrJLwABm1ZPgAAAAAMAAZmxJwABY9xzAAFkFgsAAWPvALiH1gtABAAGDwABZDsAuIkIAwAD2GkLAAFkVAD9JwABZdiEcwABZgIPAAFl7wC4iQpuaAQABLgDAAJD/QsAAWY0APz0cwABZp4LAAFmdwC4h9U8BAAGDwABZq8AuIkIAwAD2Gz0cwABZwhbAAFm4LrJLwABm1YCZAQABFsAAWc6DwABZycAuIkKxOsAAkOAAwABmaz0cwABZ6xbAAFnhLrJLwABm1YCZAQABgsAAWfLALiH1AMAAZms9HMAAWgIuwABF0wAAAADAAGcBScAAWhEawABaG8AAlCw+BT0cwABaThbAAFpHFsAAWjgWwABaMi6VCMAAZuOuWsAAlRwpwAD1cYO8AQABNMAAWlYDwABaVsAAW3gAAAABAQHAAFpXAAAAwABF5mDAAJJiAABgwAD1ggE+Ak7AAFp8wABagQAAgPtgwACSYgGDwABag8AuI5s9HsAAWpLAAO5gAQABJAAJFsAAWqCEwABam8AuI7aCF8AAkOQngQEnmlAcwABazxbAAFq7LqmGwABmpa0GAQABFsAAWuaEwABa4cAuI7bAAEPjwACSZQCyRCeBASfAAEXnHMAAWx0WwABbCS6phsAAZqWtBwEAARbAAFs3hMAAWzLALiO2wABD48AAkmUAskUnwABF6BbAAFthhMAAW1zALiO2wABF6cAAkOcAAMAA9Os9HMAAW5wWwABblRbAAFuHFsAAW4EulQjAAGbjwABF1MAAlR0pwAD1cYO8AQABNMAAW6QDwABbpMAAXMYAAAABAQHAAFulAAAAwABF5mDAAJKHAABgwAD1ggE+Ak7AAFvJwABbzgAAgPtgwACShwGDwABb0MAuJMQ9HsAAW9/AAO5gAQABJAAKFsAAW+2EwABb6MAuJN+CF8AAkOQngQEnmlAcwABcHBbAAFwILqmGwABmpa0GAQABFsAAXDOEwABcLsAuJN/AAEPjwACSigCyRCeBASfAAEXnHMAAXGoWwABcVi6phsAAZqWtBwEAARbAAFyEhMAAXH/ALiTfwABD48AAkooAskUngQEnwABF6BbAAFyvhMAAXKrALiTfwABF6cAAkOcAAMAA9Os9HMAAXOoWwABc4xbAAFzVFsAAXM8ulQjAAGbjwABF1cAAlR4pwAD1cYO8AQABNMAAXPIDwABc8sAAXhMAAAABAQHAAFzzAAAAwABF5mDAAJDeAABgwAD1ggE+Ak7AAF0XwABdHAAAgPtgwACSqQEmwABdFwGDwABdHsAuJfBgwACSqT0ewABdLcAA7mABAAEkAAkWwABdO4TAAF02wC4mC4IXwACQ5CeBASeaUBzAAF1qFsAAXVYuqYbAAGalrQYBAAEWwABdgYTAAF18wC4mC8AAQ+PAAJKuALJEJ4EBJ8AAReccwABduBbAAF2kLqmGwABmpa0HAQABFsAAXdKEwABdzcAuJgvAAEPjwACSrgCyRSfAAEXoFsAAXfyEwABd98AuJgvAAEXpwACQ5wAAwAD06z0cwABeNBbAAF4iFsAAXhwulQjAAGbjwABF18AAlR+DvAEAATTAAF48A8AAXjzAAGLoAAAAAQEBwABeTQAAAID7YMAAkN4AAGDAAPWCAT4BScAAXl0lwABeZoPAAF5hwC4nGmDAAJEoPgE9HsAAXo3AAO5gAQABJAADHMAAXpsUwABelsAuJxoDAWDAAJEowABF6gEAARbAAF6wLpUIwABm4wDAAJEsJ8AAResWwABe1BTAAF7PwC4nGgMBYMAAkSijbMAAkS4AScAAXvElwABe+oPAAF71wC4nGmDAAJLlPgE9HsAAXyHAAO5gAQABJAADHMAAXy8UwABfKsAuJxoDAWDAAJLlwABF6gEAARbAAF9ELpUIwABm4wDAAJLyJ8AAResWwABfaBTAAF9jwC4nGgMBYMAAkuWjbMAAkusAScAAX4UlwABfjoPAAF+JwC4nGl3AAJH6AVs+AknAAF+9FsAAX8YUwABfwcAuJxoDAV3AAJH6AVvAAEXswACSDj4BPR7AAF/rwADuYAEAASfAAEXtAD9GwABgGsAAYEzAAGAsAAAAgdNgsL8AFsAAYDsUwABgNsAuJxoDAV3AAJH6AVvAAEXuwACSDz4BScAAYFolwABgZYTAAGBewC4ogWCw1D4BPR7AAGCIwADuYAEAASQABBzAAGCXFsAAYJEulQjAAGbjwABF7wEAARTAAGC0wC4ogQQBYLDUAMAAlWgngQEnmlAUwABg2MAuKIEEAWCw1AA+AT0ewABhBsAA7mABAAEkAAQWwABhNRzAAGEVFsAAYQ8ulQjAAGbjwABFiQEAAYTAAGEtwC4ogQDAAJVlghfAAJDkJ4EBJ5pQhMAAYVbALiiBAEnAAGGKJcAAYZODwABhjsAuJxpgwACR6T4DTsAAYc3AAGHRAACZPGCwrQEWwABh5hbAAGHYFMAAYdPALicaAwFgwACR6cAAReDAAJHrkmmwzU7AAGIPwABiGgAAq7VgsNQBHMAAYhwuwABF4QEAAYTAAGItwC4phQDAAGb6PR7AAGI9wADuYAEAASTAAGKBAxzAAGJMFsAAYkYulQjAAGbjwABF7wEAAYXAAGJpwC4pvADAAJVoJ8AAReuEwABifMAuKYUAPgE9HsAAYp/AAO5gAQABJMAAYtQCFsAAYq2DwABiqMAuJxqCF8AAkOQnwABF8AAAwAD06z0cwABjAhbAAGLxLsAARbXAAGbXg7wBAAE0wABjCgPAAGMKwABjqgAAAAEBAcAAYxgAAAC32WCwvwAAYMAA9YIBPgJOwABjOMAAYz0AAIIXYMAAkN4BHMAAY0UWwABjPy6VCMAAZuPAAEWJAQABg8AAY13ALiqQAMAAlWU9HsAAY2zAAO5gAQABJMAAY6AGg8AAY3XALiqQJ8AARfGEwABjgMAuKqcnmkwWwABjkoTAAGONwC4qp8AARcfAAJDvJ4EBAADAAPTrPz01AAAAAQBgwACUvQGAwABjt8AuFqwjHMAAY72DAMAuKy5BAQABKwAAKxzAAGO9gwDALisuwABF8gAAAADAAJTIAVw9HMAAY9wWwABj0y6fzsAAZt2TVwEAASTAAGQFAyfAAEXzFsAAY+suwABFt8AAZtknwABF9ACrxD0cwABkDS7AAEX1AAAAAMAAZwAGwABm+IEzwABkWcAAZF7AAGaoAADAAEXQAAAAAQPAAGRwwABmqAAAAAAAAABcAT4ETsAAZJDAAGShAACse13AAPTbAWCwvwEcwABkyRbAAGSvFsAAZKMun+HAAGbhrHvAAHSDgScBAAE0wABkzwPAAGTPwABk+gAAAAEBAcAAZN0AAACSW2CwvwAAYMAA8rMBSsAAZOgBIRbAAGTwgMAAZOnALiw3g9+wzADAAPTnPRzAAGULFsAAZQIugn/AAGbcoCsAAAAAn1s9HMAAZS6AwABlHcAuK+yDvAEAATTAAGU2A8AAZTbAAGZbAAAAAQEBwABlRAAAAJJbYLC/AABgwAD1ggE+Aj0cwABlXRbAAGVULoJ/wABm3KAyAwADJ8AARfYWwABlfy7AAEW4wABm2ifAAEX3AJ9cPRzAAGYrFsAAZiUulQjAAGbjwABF+AIAAoHAAGY2wC4sqzTAAGY+A8AAZj7AAGZTAAAAAAAAAFwBSsAAZkQBHMAAZkQuwABFkwEAAYHAAGZMwC4sqwDAAGb7AMAAlVkAwAD06z0cwABmaxbAAGZiLp/OwABm3ZNXAQABJMAAZqMDJ8AARfYWwABmdy7AAEW4wABm2ifAAEX3AKvEBsAAZvmBM8AAZtfAAGbfwABrtgAAwABF+QAAAAEDwABm8MAAa7YAAAABAQHAAGb+AAAAkltgsL8AAGCMDgE+BE7AAGcdwABnKAAAwABF+mDAAHL7ARzAAGdJFsAAZz4WwABnMi6f4cAAZuGrAsAAdIXAAEX7AQABgMAAZ13ALi27AMAAc+lBR8AAZ2oWwABnfYHAAGdywC4t0IIcwABy/QUBwABnmxrAAGebwABy8AA+A07AAGe2wABnuwAAg7JgjRMBJsAAZ7YBFsAAZ8iBwABnvcAuLdCDssAAcv5gjRNJwABn1iXAAGffgsAAZ9rALi5CYI0xPgFKwABn+AEewABn/8AAcpUCAAIWwABoHxbAAGgTLp/hwABm4asCwAB0hSbAAGgrAYDAAGgrwC4tu2Cw0QBJwABoQyXAAGhMgsAAaEfALi5CYI2fPgFKwABoaQEWwABodRTAAGhwwC4uQgIBYI2fkk+NpD9CwABokQABwABorhrAAGiuwABy8QA+AUrAAGjDARbAAGjVgcAAaMrALi3Qg7LAAHL+AcAAaPEawABo8cAAcvIAPgNOwABpFMAAaRkAAIOyYI0TASbAAGkUARbAAGkmgcAAaRvALi3Qg7LAAHL+YI0TScAAaTQlwABpPYLAAGk4wC4vPGCNXj4BSsAAaVwBFsAAaWgUwABpY8AuLzwCAWCNXpJPjWJJwABpgSXAAGmKgsAAaYXALi88YI2fPgFKwABppwEWwABpsxTAAGmuwC4vPAIBYI2fkk+NpD9CwABpzwABwABp7BrAAGnswABy8wA+A07AAGoNwABqEgAAg7JgjBUBJsAAag0BFsAAah+BwABqFMAuLdCDssAAcv5gjBVJwABqLSXAAGo2gsAAajHALi/sYJInPgFKwABqXQEWwABqaRTAAGpkwC4v7AIBYJInkk+SKknAAGqCJcAAaouCwABqhsAuL+xgkM4+AUrAAGqxARbAAGq9FMAAarjALi/sAgFgkM6ST5DQP0LAAGrZAAPAAGr2GsAAavbAAHL0wABrGhrAAGsawABy9cAAazsawABrO8AAcvYAPgFCwABrUgA9HsAAa2Or3wIAAoDAAGtswC4tuyTAAGugAyfAAEX8gcAAa5TALi3QJ4ExAErAAGunASsGwABm+oEzwABsI8AAbDLAAG1sAADAAEXhAAAAAQPAAGxCwABtbAAAAAEBAcAAbE8AAACZPGCwrQAAYLDUAT4DTsAAbGnAAGxyAACST2Cw1AEmwABsaQEcwABskBbAAGx8LrLTwABmmsAAZumqcgIAAoDAAGyiwC4xGhrAAGyzrDEArv1gsNRJwABsviIcwABsy4HAAGzCwC4xL0EBAAErAMAA9dIBFsAAbN+BwABs1sAuMS+D37DMPgE9icAAbPPALjEvJsAAbPMBHMAAbRwWwABtCC6y08AAZprAAGbpqnICAAKAwABtLsAuMRoawABtP6w3AK79YLDUP0rAAG1ZAYHAAG1gwC4xLwbAAGb7gTPAAG1xwABtgsAAdy4AAMAARZMBGsAAbXLAAO5LAAABA8AAbYnAAHcuAAAAAQEBwABtlwAAAJMNYLC/AABcAT4HScAAbaYcwABtuxbAAG2qLsAARbXAAGbXgtABAAGAwABtxMAuMi0AwAD2GkrAAG3OAD89HMAAbesWwABt2i7AAEW1wABm108BAAGAwABt78AuMi0AwAD2G07AAG4GwABuCwAAkkxgjA4BHMAAbg0uwABF+QEAAYDAAG4fwC4yLQDAAGb5TsAAbj4AAACCF2DAAJDeAD0cwABuURbAAG5ILp/OwABm3aAmAgACgMAAbmTALjItNMAAbm0DwABubcAAbrEAAAAAAAAAYMAA9YIBPgE9isAAbnjALjLEHMAAbn8uwABF/QIAAoDAAG6cwC4yLYHAAG6lwC4ymADAAGb8AKvOPRfAAG64LsAARbgcwABuxBbAAG64LsAARbjAAGbaXQEAAZQAwAD1nsAAZtpJwABuzRbAAG7ZgMAAbtHALjIthEKwxj4DTsAAbvbAAG78AACURGCw0QEmwABu9gGAwABu/sAuMi1gsNFJwABvDSEWwABvGIPAAG8SwC4zh6bfsMo+AUnAAG+RIRzAAG+agcAAb5XALjKYQQEAASsAwAD10j4CScAAb68iISXAAG+4gsAAb7PALjLEYMAAkmIAISXAAG/YgsAAb9PALjLEYMAAkqk+Ak7AAHCUwABwmgAAgIpgwABWvQEcwABwnC60SAEAAYPAAHCtwC4zhwDAAGb+ScAAcMEhHMAAcMuEwABwxcAuNBVBAQABKwDAAPXSPgFJwABw5BbAAHDuhMAAcOjALjQVqlbAAFbMPgNOwABxIsAAcTMAAMAARf5gwABW4gEmwABxIgGEwABxNcAuNBVgwABW4k7AAHFbwABxZAAAkk9gsNQBFsAAcXeFwABxZsAuNHyTDcAAVuQ9isAAcZDALjLEHMAAcZ0WwABxly6VCMAAZuPAAEX/AQABhsAAca3ALjSlAMAAlW8+A07AAHLIwABy1AAAwABGAGCx4QEcwABy/hbAAHLqLqmGwABmpazwAQABhMAAcx7ALjQVALIyPYrAAHM2wC4yxB/AAHNBwACSSgMAAxbAAHNsLqmGwABmpYLAAHOBwC4yxIXAAHOHwC40/AA9HMAAc7oWwABzqxbAAHOlLpUIwABm48AARgHAAJUiTwEAAYLAAHO+wC4yxADAAPUuPz89HMAAc/kuwABFoQIAAoPAAHQLwC4zh4LAAHQSwC4yxADAAGcKScAAdCghFsAAdDWAwAB0LcAuMi2UrLDEPgE9HMAAdFMuwABFoQIAAoPAAHRlwC4zhxbAAHRyFsAAdGwulQjAAGbjlQvAAJVBAMAAZwo/ScAAdJQcwAB0nYHAAHSYwC4ymEEBAAErAMAA9dI+AUnAAHU3IhbAAHVDgMAAdTvALjItg96wwwEWwAB1V4DAAHVPwC4yLYRGsMI+AT0cwAB1by7AAEWhAgACg8AAdYHALjOHgsAAdYjALjLEAMAAZwo/PgE9HMAAdbAuwABFoQIAAoPAAHXCwC4zh4LAAHXJwC4yxADAAGcKScAAdd4iIiIWwAB164DAAHXjwC4yLYPesMMBFsAAdf+AwAB198AuMi2ERrDCACEcwAB2HYHAAHYYwC4ymEEBAAErAMAA9dIAIRbAAHY7gMAAdjPALjItg+Kwyz4BScAAdk4cwAB2Ui7AAEYCAgACJsAAdnQBgMAAdnTALjItYLDRgcAAdn3ALjKYAMAAZv0+AT0cwAB2kC7AAEWhAgACg8AAdqLALjOHFsAAdq8WwAB2qS6VCMAAZuOVC8AAlUEAwABnCj8/PgJOwAB27sAAdvUAAJMxYLDUASbAAHbuAYDAAHb3wC4yLWCw1D0cwAB3Bi7AAEWgAgACg8AAdxfALjdtgsAAdx/ALjLEAMAAZwsGwABm/IEzwAB3e8AAd4vAAHj8AADAAEX9AAAAAQPAAHenwAB4/AAAAAICAsAAd7wAAACSW2CwvwDAAHfMAAAAkkxgjA4AAGDAAJDeAT4CTsAAd+/AAHf3AACWiWDAAJMyAR/AAHf9wACTzQcABxbAAHgdLm/AAGbbFsAAeC4un+HAAGbhLoDAAHhRwC434IHAAHhhwC437RzAAHiLFsAAeHsWwAB4by6f4cAAZuGy1MAAdInAAEYDAQABgMAAeJjALjfgAMAAdVocwAB4wBbAAHi1FsAAeKkun+HAAGbhqwLAAHSFwABGBAEAAYDAAHjWwC434ADAAHO8AErAAHjkARzAAHjzgsAAeOvALjgEgiMAAAAAwACTZgbAAGb9gTPAAHl1wAB5esAAfJkAAMAARgIAAAABA8AAeZvAAHyZAAAAAgICwAB5rwAAAJREYLDRAMAAeb4AAACSRWCMDgAAYMAA8rMBPgJJwAB7CCIiIiIiIiIlwAB7GIHAAHsMwC45BmCPTQElwAB7RoHAAHs6wC45BmCOjgElwAB7b4HAAHtjwC45BmCOoAElwAB7mIHAAHuMwC45BmCPcgElwAB7xoHAAHu6wC45BmCPDAElwAB77YHAAHvhwC45BmCPHAElwAB8FIHAAHwIwC45BmCQ5QEiJcAAfDWBwAB8KcAuOQZgj4UAIRbAAHxhFMAAfFXALjkGAQFgj4WD4o+JPgFKwAB8cgEpP0rAAHyJASoGwABm/oEzwAB9HsAAfSzAAH2bAAC0SAAAAAEDwAB9PMAAfZsAAAABAQHAAH1JAAAAlERgsNEAAGDAAFa9AT4BSsAAfVYBFsAAfYscwAB9dxbAAH1pFsAAfV0un+HAAGbhq6jAAHSHq6kBAAEmwAB9hAGAwAB9hMAuOgxgwABobwDAAF/ckyXAAF/jBsAAZv+BM8AAfdPAAH3YwAB+fAAAwABGBQAAAAEDwAB948AAfnwAAAABAQHAAH3wAAAAmTxgsK0AAGDAAPKzAT4BSsAAffsBIRzAAH5pHMAAfiwWwAB+GRbAAH4OFsAAfgIun+HAAGbhqwLAAHSFlQjAAHPzv0oBAAEcwAB+VxbAAH5EFsAAfjgun+HAAGbhn+bAAHSoqnkBAAGAwAB+Y8AuOpkArwYAwABZW0EBAAErAMAAWN4GwABnAIEzwAB+gcAAfobAAII1AADAAEX1AAAAAQPAAH6cwACCNQAAAAAAAABcAT4BPRzAAH66FsAAfqsWwAB+pS6VCMAAZuPAAEYGwACVIYO8AQABNMAAfsIDwAB+wsAAgjAAAAABAQHAAH7bAAAAgPtgwACR2AAAYMAA9YIBPgNJwAB+6SEWwAB+84DAAH7uwC47jMAARaXAAJHgSsAAfvsAP0nAAH9XJcAAf2CAwAB/W8AuO4xgwACSEz4BSsAAf40AP0nAAH+jJcAAf6yAwAB/p8AuO4xgwACR6T4CTsAAf+XAAH/sAACSW2CwvwEWwAB/8xTAAH/uwC47jAABYMAAkenAAEXgwACR6z0cwACAHhbAAIAKLqAIwABm4q9rAQABgcAAgDbALjwDALb4ScAAgEwiIRzAAIBaFsAAgFWAwACAUMAuO4yr18AAkd5BAQABKwDAAPXSABbAAICaHMAAgIMWwACAby6phsAAZqWDxgEAARbAAICUgMAAgI/ALjuMq9fAAJHeALIxrKyx0T4BPRzAAIG2FsAAga6AwACBqcAuO4zAAEXiwACR5YO8AQABNMAAgb4DwACBvsAAgiAAAAABAQHAAIHMAAAAkw1gsL8AAGDAAPWCAT4BPRzAAIH1FsAAgeEuoAjAAGbir2sBAAGBwACCDcAuPOsAtvgAwAD06z8AwAD06wbAAGcBgTPAAII6wACCP8AAhhAAAMAARdMAAAABA8AAgkXAAIYQAAAAAAAAAFwBPgI9HMAAglcWwACCTi6Cf8AAZtygKwAAAACfW0PAAIJpIRbAAIJ7FsAAgnEuskvAAGbVgPzAAGZuPgc9HMAAgpUWwACCjC6Cf8AAZtygMgMAAyfAAEXzFsAAgq8uwABFt8AAZtknwABF9ACfXE7AAILlwACC6gAAgPtgwACQ3gEcwACC9hbAAILsLrJLwABm1ZPgAAAAAMAAZmxOwACDFMAAgxwAAMAARgdgseEBFsAAgyOAwACDHsAuPcyCF8AAkOROwACDPcAAg0UAAKfAYLHhARzAAINMgMAAg0fALj3MwABF0wEAAS4AwACQ+kAcwACDtYHAAIOtwC49+kEBAAEWwACDvYDAAIO4wC49zIIXwACQ5ADAAPXSwACDrcAAg8EAScAAg8oWwACD04DAAIPOwC49zMAARgjAAJDmPRfAAIPsgMAAg+fALj3MwABFeynAAJDpP0nAAIQHIRzAAIQhF8AAhBGAwACEDMAuPcyCF4LAAIQYwC4+IcAAkORBAQABgcAAhCTALj36AMAA9dI+BT0XwACENy7AAEW3HMAAhEkWwACENy7AAEW3wABm2V0BAAGUAMAA9Z7AAGbZPTUAAAABAGDAAJDeAYDAAIRVwC49zBfAAIRag8AAhFrALj8fwABF6RzAAIRlFsAAhFqDwACEWsAuPx/AAEXpwACQ510BAAGUAMAA9Z7AAJDnScAAhHEcwACEhhbAAIR6gMAAhHXALj3MwABF6cAAkOeAiwEAARbAAISILsAARbbAAGbYAMAA9ag+BEnAAISmGsAAhLDAAJQtPgE9HsAAhMzAAO5gAQABJMAAhQUCJ8AARgmAwACFAMAuPcwAPz0cwACFI4DAAIUewC49zMAARdsBAAEuAMAAkP09F8AAhUCAwACFO8AuPcyCFxzAAIVMgMAAhUfALj3MwABF0wEAAS4AwACQ+sAAkOQ9F8AAhWmAwACFZMAuPczAAEV7KcAAkOk/PRzAAIWaFsAAhZAuskvAAGbVgJkBAAEWwACFpoDAAIWhwC49zLE6wACQ4ADAAGZrScAAhbYcwACFv4DAAIW6wC49zMAARgoBAAEuAMAAkQE+AT0cwACF5YDAAIXgwC49zMAARgsBAAEuAMAAkQM/PwbAAGcCgTPAAIYVwACGGsAAhusAAMAARdIAAAABA8AAhijAAIbrAAAAAAAAAFwBPgQ9HMAAhjsWwACGMS6yS8AAZtWAmQEAARbAAIZIFsAAhkIulQjAAGbjwABGDMAAlTwAwABmaz0cwACGcBbAAIZmLrJLwABm1YCZAQABFsAAhn0WwACGdy6VCMAAZuPAAEYBwACVIgDAAGZrPRzAAIacFsAAhpIuskvAAGbVgJkBAAEWwACGqRbAAIajLpUIwABm48AARdfAAJUfAMAAZms9HMAAhssWwACGwS6yS8AAZtWAmQEAARbAAIbYFsAAhtIulQjAAGbjwABGBsAAlSEAwABmawbAAGcDgTPAAIbwwACHAcAAkPUAAMAARaoBGsAAhvHAAO5LAAABA8AAhxvAAJD1AAAABwUFwACHLAAAALFyYMAAkN4AwACHQQAAAMAARadgsL8AwACHXgAAAFRgwACUWwDAAIdyAAAAn+xgvr8AwACHigAAAKvXYLHhAALAAIecAAAAk+BgwADyswErwACHqQAAAMAARatgwADyswEpXAE+AknAAIfCHMAAh9IWwACHzYHAAIfGwC5B+YCwsJtBAQABGsAAh+GsNwDAAPZsSsAAh/AAP0nAAIf8FsAAiAeBwACIAMAuQfmEQrDGPgFJwACIGBbAAIglg8AAiBzALkIWhEG+0D4DTsAAiFDAAIhVAACA+2DAAJEoARzAAIhdFsAAiFculQjAAGbjwABFiQEAAYHAAIh1wC5B+QDAAJVlScAAiIaFwACIisAuQjE+AT0cwACIo4fAAIiewC5CvcAARg0BAAEcwACIyBbAAIi+gsAAiLTALkIIlSrAAJRdRAEAAZMAwAD1LADAAJD5PgE9HMAAiO6HwACI6cAuQr3AAEXIAQABHMAAiRAWwACJBoLAAIj8wC5CCJUqwACUXUQBAAGTAMAA9SwAwACQ+EnAAIkohsAAiSzALkJBPRzAAIlCFsAAiTguskvAAGbVTwEAAYfAAIlGwC5CvQDAAGZqPz9JwACJYBbAAIlrgcAAiWTALkH5hECwyD4BSsAAiX0AScAAiZAiIRzAAImdg8AAiZTALkIWQQEAASsAwAD10gAWwACJsYPAAImowC5CFoRAvs8+A0AWwACKE4HAAIoMwC5B+apWsMfAAIoMwACKHQBOwACKPMAAikEAAID7YMAAkToBHMAAikkWwACKQy6VCMAAZuPAAEWJAQABgcAAimHALkH5AMAAlWVJwACKcIXAAIp0wC5CMT4BPTUAAAABAGDAAJE6AYfAAIqGwC5EJxfAAIqLFMAAiovALkRxCADAAEYOHMAAipoWwACKixTAAIqLwC5EcQgAwABGDsAAkUCBQQEAAZQAwAD1n8AAkUA+Az01AAAAAQBgwACROgGHwACKtcAuRCcXwACKuhTAAIq6wC5EyQgAwABGDhzAAIrJFsAAiroUwACKusAuRMkIAMAARg7AAJFAXQEAAZQAwAD1nsAAkUBJwACK1SIWwACK4IHAAIrZwC5B+YPesMMBFsAAivOBwACK7MAuQfmERrDCPgE9HMAAiyMWwACLERbAAIsLLpUIwABm48AARdfAAJUfTwEAAYfAAIsnwC5EJwDAAPYbPgE9HMAAi+YWwACL1BbAAIvOLpUIwABm48AARdfAAJUfTwEAAYDAAIvqwC5B6gDAAPYbPRzAAIwUFsAAjAsWwACMBS6VCMAAZuOgF8AAlRmrugIAAibAAIwlAYHAAIwlwC5B+WCw1DTAAIwtA8AAjC3AAI0RAAAAAQEBwACMNAAAAIDPYLD4AABgwAD1ggE+A07AAIxkwACMaQAAgPtgwACRpwEcwACMfxbAAIx5LpUIwABm46+uAQABFMAAjJrALkX1CAAAwACVYz0cwACMtRTAAIywwC5GDAkAwABGDwEAAS4AwACRt0nAAIzjhsAAjOfALkJBPRzAAIz9FsAAjPMuskvAAGbVTwEAARTAAI0BwC5GDAkAAMAAZmo/AMAAlQo+BE7AAI0+wACNRQAAkzFgsNQBJsAAjT4BgcAAjUfALkH5YLDUTsAAjWjAAI17AACsFWCw+wEWwACNhIfAAI19wC5Gn6wVsNdOwACNosAAjbEAAKu5YMAA9HkBkz0cwACNyxbAAI3CFsAAjbwulQjAAGbjoBfAAJUZq7oCAAImwACN3AGBwACN3MAuQflgsNQ0wACN5APAAI3kwACQ6gAAAAEBAcAAjesAAACAz2Cw+AAAYMAA9YIBPgdOwACOEAAAAIIXYMAAkN4AScAAjh4cwACOMRTAAI4iwC5G5QkAXAEAARbAAI5GFMAAjjPALkbCCACsH7D+AMAA9aY+AT0VwACOZsAuR1cLHMAAjoEWwACOd4LAAI5twC5CCJUqwACUXUQBAAEUwACOgsAuRuUJAADAAPUsScAAjqIWwACOyRbAAI65FMAAjqbALkbCCACUbbEAg2jAAPUAPgE9FcAAjuHALkdXCxzAAI73FsAAjvKCwACO6MAuQgiU/cAAlF5EAQABFsAAjwIUwACO+MAuR0AKAICwsJsAwAD1YknAAI8YHMAAjysUwACPHMAuRuUJAFwBAAEWwACPQhbAAI83gsAAjy3ALkIIlSrAAJRdWsAA9UwAwAD1pj4BPRXAAI9WwC5HVwscwACPcRbAAI9ngsAAj13ALkIIlSrAAJRdRAEAARTAAI9ywC5G5QkAAMAA9Sw/ScAAj5UcwACPnhTAAI+ZwC5HVwsAQQEAASsAwAD10j0VwACPp8AuR1cLHMAAj64uwABFmgEAARTAAI/IwC5HQAoAAMAAZwU/TsAAj+zAAI/xAACA+2DAAJDeARzAAI/5FsAAj/MulQjAAGbjr64BAAEUwACQFMAuR0AKAADAAJVjScAAkCiFwACQLMAuQjE+AT0cwACQRRTAAJBAwC5I+QwAwABGDQEAARTAAJBWwC5HVwsAAMAAkPk+AT0cwACQfRTAAJB4wC5I+QwAwABFyAEAARTAAJCLwC5HVwsAAMAAkPg9FcAAkKTALkblCRzAAJCyFMAAkKTALkblCQBdAQABlADAAPWeScAAkL6GwACQwsAuQkE9HMAAkNgWwACQzi6yS8AAZtVPAQABFMAAkNzALkj5DAAAwABmaj8AwACVCgbAAGcEgTPAAJD6wACRC8AAlPcAAMAARZwBGsAAkPvAAO5LAAABA8AAkSTAAJT3AAAAAwICwACRKwAAAIDPYLD4AMAAkUYAAACCF2DAAJDeAAHAAJFYAAAAlKxgwADyswErXAE+BUAhHMAAkYaBwACRgcAuSjRBAQABKwDAAPXSwACRgcAAkY0BHsAAkY+r3wIAAoDAAJGYwC5KJyTAAJHEAyfAAEYQgMAAkbnALkonJ4ExAE7AAJHcwACR5QAAg4FgwACQ3gEcwACR/RbAAJHnLsAARbTAAGbURAEAAYDAAJH+wC5KJwDAAPViPRzAAJIkFsAAkg4uwABFtMAAZtSAsgIAAoDAAJIlwC5KJ4HAAJIywC5KNADAAPVjTsAAkkzAAJJRAACA+2DAAJDeARzAAJJZFsAAklMulQjAAGbjr64BAAGAwACSdMAuSicAwACVY0nAAJKEIiEcwACSkYPAAJKIwC5Kp0EBAAErAMAA9dIAJcAAkqWDwACSnMAuSqdgwACREz4CScAAkw2CwACTEcAuSkQ+Ak7AAJNCwACTTgAAwABFx2DAAJEaASbAAJNCARbAAJNVhMAAk1DALksPwABFx8AAkO9gwACRGj0cwACTdoXAAJNqwC5Li4T1AgACFMAAk37ALkqnAwFgwACRE4HAAJOIwC5KNADAAJEgPgJOwACTvMAAk8gAAMAARcddwAD1HQFgwACQ3gEmwACTvAEWwACTz4TAAJPKwC5LD8AARcfAAJDvXcAA9R0BYMAAkN5FwACT5AHAAJPtwACT7wAAW2DAAPR5AZMBHMAAk/aGwACT9MAuTDxcAQABFsAAlASFwACT+MAuS/VawAD1TADAAPWmAY7AAJQMwC5MPBzAAJQNhsAAlAzALkw8XQEAAZQAwAD1nj4BScAAlB0cwACUMBzAAJQshcAAlCHALkv1RAEAAYbAAJQtwC5MPADAAPUsQQEAARTAAJQzwC5KpwMBYMAAkRMAwAD10j4BPRzAAJRWhcAAlEvALkv1gLICAAKGwACUV8AuTDyBwACUXMAuSjQAwAD1LT89HMAAlKyBwACUp8AuSjTAAEYRAQABFMAAlLfALkqnAwFgwACREwDAAJD1PgFAHMAAlOWDwACU3MAuSqdBAQABKwDAAPXSwACU3MAAlOwABsAAZwWBM8AAlPzAAJUYwACV7wAAwABFmgEawACU/cAA7ksAAAEDwACVMcAAle8AAAABAQHAAJU4AAAAgM9gsPgAAGDAAJDeAT4BSsAAlUkBHMAAlWcWwACVUC7AAEW0wABm1JiQAgACgMAAlXPALk2SNMAAlX4DwACVfsAAleoAAAAAAAAAYMAAkRMBPgFKwACViQEfwACVlMAAkRkCAAIWwACVui6phsAAZqUWwACV1RbAAJXPLpUIwABm46UMwACVQAAAwAD1aQbAAGcGgTPAAJX0wACWBcAAlsMAAMAARZsBGsAAlfXAAO5LAAABA8AAli3AAJbDAAAAAQEBwACWNAAAAIDPYLD4AABgwADyswE+Ak7AAJZVwACWWgAApI5gwACQ3gEcwACWchbAAJZcLsAARbTAAGbURAEAAYDAAJZzwC5OXADAAPViSsAAloMBIiEcwACWkIHAAJaLwC5Oc0EBAAErAMAA9dIAISXAAJaggcAAlpvALk5zYMAAkRMGwABnB4EzwACWyMAAluTAAJc9AADAAEWvARrAAJbJwADuSwAAAQPAAJbzwACXPQAAAAEBAcAAlvoAAACTDWCw+AAAYMAAkN4BPgFKwACXCQEcwACXFhbAAJcQLpUIwABm46+uAQABgMAAlzHALk8UAMAAlWMGwABnCIEzwACXQsAAl17AAJf2AADAAEWuARrAAJdDwADuSwAAAQPAAJdqwACX9gAAAAEBAcAAl3gAAACTDWCwvwAAYMAAkN4BPgJJwACXhyXAAJeTgMAAl4vALk+JYLDUSsAAl6YBFsAAl7MWwACXrS6VCMAAZuOU3cAAlUk/SsAAl8UBHMAAl9IWwACXzC6VCMAAZuPAAEWJAQABgMAAl+rALk+JAMAAlWUGwABnCYEzwACX+8AAmBfAAJi1AADAAEWtARrAAJf8wADuSwAAAQPAAJgpwACYtQAAAAEBAcAAmDcAAACTDWCwvwAAYMAAkN4BPgJJwACYRiElwACYUoDAAJhKwC5QNGCw1ErAAJhmARbAAJhzFsAAmG0ulQjAAGbjnS7AAJVUP0rAAJiEARzAAJiRFsAAmIsulQjAAGbjwABFiQEAAYDAAJipwC5QNADAAJVlBsAAZwqBM8AAmLrAAJjLwACZTAAAwABFoQEawACYu8AA7ksAAAEDwACY3MAAmUwAAAACAgLAAJjpAAAAkw1gsNEAwACZAgAAAIIXYMAAkN4AAFwBPgE9HMAAmTUcwACZFBbAAJkOLpUIwABm48AARYkBAAGAwACZLMAuUOAAwACVZcAARcgBAAGBwACZQ8AuUO0AwACQ+AbAAGcLgTPAAJlRwACZYsAAm18AAMAARaABGsAAmVLAAO5LAAABA8AAmXLAAJtfAAAAAgICwACZggAAAJMNYLDUAMAAmZsAAACCF2DAAJDeAABcAT4ETsAAmbfAAJm8AACA+2DAAJDeARzAAJnEFsAAmb4ulQjAAGbjwABFiQEAAYDAAJncwC5RdwDAAJVlScAAmeocwACZ+xbAAJn2gMAAme7ALlF3gLCwm0EBAAEnQQDAAPZsPgE9HMAAmmCCwACaW8AuUZnAAEXIAQABFsAAmnQWwACabi6VCMAAZuOVO8AAlUgAwACQ+D9JwACbBxzAAJsQgcAAmwvALlGEQQEAASsAwAD10krAAJsZAD9JwACbJRbAAJs6FsAAmy6CwACbKcAuUZnAAEXHwACQ74D8wAD0/z0cwACbSILAAJtDwC5RmcAARcgBAAGBwACbVsAuUYQAwACQ+D8GwABnDIEzwACbZMAAm4DAAJ1AAADAAEWXARrAAJtlwADuSwAAAQPAAJuWwACdQAAAAAMDA8AAm60AAACTDWCw1ADAAJvGAAAAwABFmGDAAJDeAMAAm94AAACnwGDAAJDeAABgwACQ3gE+BE7AAJv9wACcAgAAghdgwACQ3gEcwACcChbAAJwELpUIwABm48AARYkBAAGAwACcIsAuUtEAwACVZUnAAJysIiXAAJy4gMAAnLDALlLRYLDsABbAAJzYFMAAnNDALlLRAAFgsOyqwrDuPgFKwACc+QGDwACdAMAuUwg/PRzAAJ0Vg8AAnRDALlMIwABFyAEAAYLAAJ0jwC5S7wDAAJD4SsAAnTEBg8AAnTjALlMIBsAAZw2BM8AAnUXAAJ1hwACiWAAAwABFpgEawACdRsAA7ksAAAEDwACddcAAolgAAAAICAjAAJ2EAAAAg7JgwAD1xQDAAJ2ZAAAAn+xgvr8AwACdtwAAAKvXYLHhAMAAndAAAACxcmCwvwDAAJ3rAAAAwABFp2CwvwDAAJ4IAAAAVGDAAJRbAMAAniwAAACviGDAAG6MAMAAnksAAADAAEWlYMAA8rMAAGDAAJDeAT4GTsAAnnHAAJ52AACA+2DAAJHYAR/AAJ58wACR+QkACRbAAJ6jLqmGwABmpRbAAJ7GFsAAnsAulQjAAGbjpQzAAJVAgMAAnt3ALlPpg8AAnuvALlQShMAAnvvALlQfgcAAnwvALlP4gsAAnx3ALlQFhcAAnyvALlQuh8AAnz7ALlRLAEnAAKC/IiIiIRzAAKDMgcAAoMPALlP4QQEAASsAwAD10gAWwACg6IHAAKDfwC5T+Ko4vtEAJcAAoQGEwACg+sAuVB9gsOwAFsAAoSgUwAChIcAuVB8EAWCw7KrCsO4+Ak7AAKFVwAChWQAAmTxgsK0BFsAAoWIUwAChW8AuVB8EAWCw7JJpsM1JwACheBzAAKF8LsAARgUBAAEUwAChiMAuVUgJAADAAGb/PgE9HMAAobAWwAChnhbAAKGYLpUIwABm48AARdfAAJUfTwEAARTAAKG0wC5UZggAAMAA9hs/Pz0cwACh0hTAAKHNwC5UZggAwABGEgEAAS4AwACR4z0cwACh/RbAAKHuFsAAoegulQjAAGbjwABGBsAAlSFPAQABFMAAogHALlRmCAAAwAD1Lj0cwACiDC7AAEW6AwADhsAAoh7ALlQ8gcAAojLALlP4hMAAojzALlQfAMAAZu1KwACiSQEUwACiUMAuVGYIAAbAAGcOgTPAAKJdwACiecAApuwAAMAARagBGsAAol7AAO5LAAABA8AAoo/AAKbsAAAACggIwACioAAAALrhYMAAkcQAwACiuAAAAIOyYIwOAMAAos0AAACf7GC+vwDAAKLrAAAAq9dgseEAwACjBwAAAJUbYMAAkN4AwACjKAAAALFyYLC/AMAAo0UAAABUYMAAlFsAwACjaQAAAK+IYMAAbowAAsAAo4kAAADAAEWlYMAA8rMBK8AAo5wAAADAAEWpYMAA8rMBK2DAAJDeAT4HScAAo7IWwACjv4LAAKO2wC5Wqa5hvtI+AUrAAKPWARzAAKPdLsAARaQIAAeBwACj88AuVpyCwACj+cAuVqmDwACkA8AuVraEwACkCcAuVsOFwACkF8AuVtKGwACkKcAuVt+HwACkNMAuVu0BwABFpRTAAKRawC5W/QgAwABnET9JwACkbhzAAKR+FsAApHIun+HAAGbhrcoCAAKCwACkksAuVqmDwACknMAuVrYAwAB0oD4BPRzAAKS+h8AApKvALlbtwABFuwAAAADAAG6YPz0cwAClHBzAAKT+FsAApPIun+HAAGbhq9gCAAKCwAClDMAuVqmDwAClFsAuVrYAwAB0ooO8AQABNMAApSQDwAClJMAApXMAAAABAQHAAKUlAAAAwABFp2CwvwAAYMAA9YIBPgE9HMAApTUuwABFugMAA4fAAKVHwC5W7YLAAKVbwC5WqRTAAKVlwC5YRQoAAMAAZu0AwAD0607AAKWTwAClmAAAgPtgwACR2AEfwAClnsAAkhILAWCMDgsWwAClxi6phsAAZqUWwACl6RbAAKXjLpUIwABm46UMwACVQIDAAKYAwC5WjYHAAKYSwC5WnIXAAKYgwC5W0oLAAKYwwC5WqYPAAKZCwC5WtoTAAKZQwC5Ww4bAAKZmwC5W3xTAAKZ5wC5W/QgAFMAAponALlcPCQAAPRzAAKajFMAApp7ALliTCgDAAEYSAQABLgDAAJHjPRzAAKbOFsAApr8WwACmuS6VCMAAZuPAAEYGwACVIU8BAAEUwACm0sAuWJMKAADAAPUuSsAApt0BFMAApuTALliTCgAGwABnD4EzwACm8cAApw3AAKgRAADAAEWiARrAAKbywADuSwAAAQPAAKcawACoEQAAAAICAsAApyMAAACDsmCMDgDAAKc5AAAAH2DAAJDeAABgwACQ3gE+BE7AAKdewACnYwAAgPtgwACTAQEfwACnacAAkwwDAAMWwACnhy6phsAAZqUWwACnohbAAKecLpUIwABm46UMwACVQIDAAKexwC5ZxAA9HMAAp8GCwACnvMAuWenAAEXIAQABgcAAp8/ALlnRAMAAkPg9HMAAp/MWwACn5BbAAKfeLpUIwABm48AARgHAAJUiTwEAAYLAAKf3wC5Z6QDAAPUuSsAAqAIBgsAAqAnALlnpBsAAZxCBM8AAqBbAAKgywACpNgAAwABFowEawACoF8AA7ksAAAEDwACoP8AAqTYAAAACAgLAAKhIAAAAg7JgjA4AwACoXgAAAB9gwACQ3gAAYMAAkN4BPgROwACog8AAqIgAAID7YMAAkw0BH8AAqI7AAJMYAwADFsAAqKwuqYbAAGalFsAAqMcWwACowS6VCMAAZuOlDMAAlUCAwACo1sAuWs0APRzAAKjmgsAAqOHALlrywABFyAEAAYHAAKj0wC5a2gDAAJD4PRzAAKkYFsAAqQkWwACpAy6VCMAAZuPAAEYBwACVIk8BAAGCwACpHMAuWvIAwAD1LkrAAKknAYLAAKkuwC5a8gbAAGcRgTPAAKk7wACpV8AAq9oAAMAARaQBGsAAqTzAAO5LAAABA8AAqWzAAKvaAAAACAcHwACpfAAAAIOyYIwOAMAAqZEAAACf7GC+vwDAAKmvAAAAq9dgseEAwACpywAAAKvBYMAAkN4AwACp5wAAALFyYLC/AMAAqgQAAABUYMAAlFsAwACqKAAAAK+IYMAAbowAAcAAqkgAAADAAEWlYMAA8rMBK2DAAJDeAT4FPRzAAKpqhsAAqlfALlwnwABFuwAAAADAAG6YTsAAqrDAAKq1AACA+2DAAJHYAR/AAKq7wACSHwkACRbAAKrjLqmGwABmpRbAAKsGFsAAqwAulQjAAGbjpQzAAJVAgMAAqx3ALlvWhMAAqyvALlwMgcAAqzvALlvjgsAAq03ALlvwg8AAq1vALlv9hcAAq2zALlwZh8AAq3/ALlw3AD0cwACrkRTAAKuMwC5cbQgAwABGEgEAAS4AwACR4z0cwACrvBbAAKutFsAAq6culQjAAGbjwABGBsAAlSFPAQABFMAAq8DALlxtCAAAwAD1LkrAAKvLARTAAKvSwC5cbQgABsAAZxKBM8AAq9/AAKvwwACskAAAgg8BGsAAq+DAAO5LAAABA8AAq/XAAKyQAAAAAAAAAFwBPgFGwACr/sAArFnAAKwZAAAAwABFg2DAAJE6ABbAAKxRFsAArDoWwACsNC6VCMAAZuPAAEYTwACVGynAAPVxPgE9HMAArHGAwACsYcAuXZHAAEWKAAAAAMAAkU8GwABnE4EzwACslcAArKbAAK/LAACB0AEawACslsAA7ksAAAEDwACsq8AAr8sAAAAAAAAAXAE+EknAAKy0GsAArLiewErAAKzOAD9PwACs28AArOAAAAGq/WEBYMAAkN5cAAPAAKznwACtGgAAAAEBAcAArPgAAACA+2DAAJDeAABcAT4BPRzAAK0LgcAArQbALl5Tqv0AAAAAwACRBT0cwACtNhbAAK0nFsAArSEulQjAAGbjwABGBsAAlSGDvAEAAYDAAK0+wC5eMgDAAPTrPRzAAK1hFsAArVIWwACtTC6VCMAAZuPAAEYGwACVIYHQAAAAAMAA9TY9HMAArYYWwACtby7AAEW0wABm1IHQAAAAAMAA9Ww9HMAArbsWwACttBbAAK2aFsAArZQulQjAAGbjwABGFMAAlRopwAD1cYO8AQABgMAArcPALl4yAMAA9Os9HMAArfUWwACt7hbAAK3XFsAArdEulQjAAGbjwABGE8AAlRspwAD1cYO8AQABgMAArf3ALl4yAMAA9Os9HMAAriEWwACuEhbAAK4MLpUIwABm48AARgHAAJUig7wBAAGAwACuKcAuXjIAwAD06z0cwACuTBbAAK49FsAArjculQjAAGbjwABGAcAAlSKB0AAAAADAAPU2PRzAAK5uFsAArmAWwACuWi6VCMAAZuPAAEWSwACVIIHQAAAAAMAA9Ww9HMAArpQWwACughbAAK58LpUIwABm48AARdfAAJUfg7wBAAGAwACunMAuXjIAwAD06z0cwACuwhbAAK6wFsAArqoulQjAAGbjwABF18AAlR+B0AAAAADAAPYnPRzAAK7hFsAArtAuwABFtcAAZteB0AAAAADAAPYnPRzAAK8RFsAAru4uwABFucAAZuWB0AAAAADAAPYnPRzAAK86FsAArzMWwACvJRbAAK8fLpUIwABm48AARdXAAJUeKcAA9XGDvAEAAYDAAK9CwC5eMgDAAPTrPRzAAK9rFsAAr2QWwACvVhbAAK9QLpUIwABm48AARdTAAJUdKcAA9XGDvAEAAYDAAK9zwC5eMgDAAPTrPRzAAK+dFsAAr5YWwACvhxbAAK+BLpUIwABm465awACVHCnAAPVxg7wBAAGAwACvpcAuXjIAwAD06z0cwACvwBbAAK+0Lr/+wABmmsAAZuCB0AAAAADAAPVsBsAAZxSBM8AAr9DAAK/zwACwkAAAwABFgQEawACv0cAA7ksAAAEDwACwCcAAsJAAAAABAQHAALAXAAAAkw1gsL8AAF3AAPTbAWCwvwE+Ak7AALA8wACwQQAAgPtgwACROgEcwACwSRbAALBDLpUIwABm48AARYkBAAGAwACwYcAuYZMAwACVZUrAALBvARbAALB7gcAAsHbALmGuwABGFcAAkUQGwABnFYEzwACwlcAAsLHAALTRAACuZQEawACwlsAA7ksAAAEDwACwycAAtNEAAAACAgLAALDeAAAAkw1gsL8AwACw8AAAAJ/sYL6/AABgwACQ3gE+AUnAALEAIhzAALERFsAAsQyAwACxBMAuYjWAsLCbQQEAARrAALEgrDcAwAD2bAAhHMAAsUcWwACxQoHAALE5wC5iQoCwvs1BAQABFsAAsVKAwACxSsAuYjWAsLCbAMAA9mw+AUrAALHZARzAALHgLsAARa0BAAGAwACx88AuYjUAwABnCUnAALIIFsAAshWBwACyDMAuYkKEQL7PPgFJwACyJxbAALIzgMAAsivALmI1qlawxz4BSsAAsogBIxzAALKiFsAAspUWwACyjy6VCMAAZuOU3cAAlUlBAQABKwDAAPXSFsAAsr4WwACyuC6VCMAAZuOdLsAAlVQWwACy3hbAALLYLpUIwABm45TdwACVSQFgwACQ3knAALL5FsAAswWAwACy/cAuYjWEQrDGPgFKwACzGAEcwACzHy7AAEWuAQABgMAAsyzALmI1AMAAZwhJwACzQxbAALNPgMAAs0fALmI1hECwyD4BSsAAs2MB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AMm0wADNbwAAAAICAsAAyccAAACC/WDAAFppAMAAyeMAAACphmCx5AAAYMAAZy4BPgc9HMAAygWAwADJ/sAudWmCGwEAARrAAMoLwABnMADAAFprTsAAyjXAAMo9AADAAEYqXcAA9U4CYIwVYLHhARzAAMpGgMAAyj/ALnVprlsCAmCMFWCx4QE0wADKXwPAAMpfwADKoAAAAAAAAABgseEBSsAAymUBHMAAynmBwADKZcAudXitFQEAAYDAAMqZwC51aQCyVAG/2CnAAFqITsAAyujAAMr0AADAAEYrXcAA9U4CYJGFYLHhARzAAMr9gMAAyvbALnVprlsCAmCRhWCx4QE0wADLFgPAAMsWwADLVwAAAAAAAABgseEBSsAAyxwBHMAAyzCBwADLHMAudXitFQEAAYDAAMtQwC51aQCyVAG/2CnAAFqITsAAy5/AAMuqAADAAEYsXcAA9U4CYJGFYLHhARzAAMuzgMAAy6zALnVprlsCAmCRhWCx4QE0wADLzAPAAMvMwADMDQAAAAAAAABgseEBSsAAy9IBHMAAy+aBwADL0sAudXitFQEAAYDAAMwGwC51aQCyVAG/2CnAAFqITsAAzFXAAMxhAADAAEYtXcAA9U4CYJGFYLHhARzAAMxqgMAAzGPALnVprlsCAmCRhWCx4QE0wADMgwPAAMyDwADMxAAAAAAAAABgseEBSsAAzIkBHMAAzJ2BwADMicAudXitFQEAAYDAAMy9wC51aQCyVAG/2CnAAFqIPRzAAMztgMAAzObALnVpghMBAAEawADM8cAAZzAAwABabErAAMz7AR/AAM0GwABnRgQABILAAM09wC51sYPAAM1GwC52LITAAM1TwC52p4XAAM1fwC53IgAGwABnOYEzwADNdMAAzYXAANDQAACrTQEawADNdcAA7ksAAAEDwADNlMAA0NAAAAACAgLAAM2eAAAAhAFgwABaJwDAAM24AAAAqYZgseQAAFwBPgY9HMAAzdiAwADN08AueCiCGwEAARrAAM3ewABnMADAAFosPRzAAM3tgMAAzejALngorl4DAWCx4QIWwADOBy7AAEYmwABmmsAAZzI0wADOGQPAAM4ZwADOewAAAAEBAcAAzigAAACAimCx4QAAXAFKwADOPgEcwADOUoHAAM4+wC54N60WAgACgMAAzm/ALngogsAAznXALnioALJVAZcrKcAAWkY9HMAAzqCAwADOm8AueCiuXgMBYLHhAhbAAM66LsAARifAAGaawABnMzTAAM7QA8AAztDAAM8yAAAAAQEBwADO3wAAAICKYLHhAABcAUrAAM71ARzAAM8JgcAAzvXALng3rRYCAAKAwADPJsAueCiCwADPLMAueSsAslUBlyspwABaRj0cwADPV4DAAM9SwC54KK5eAwFgseECFsAAz3EuwABGKMAAZprAAGc0NMAAz4YDwADPhsAAz+gAAAABAQHAAM+VAAAAgIpgseEAAFwBSsAAz6sBHMAAz7+BwADPq8AueDetFgIAAoDAAM/cwC54KILAAM/iwC55rgCyVQGXKynAAFpGPRzAANANgMAA0AjALngorl4DAWCx4QIWwADQJy7AAEYpwABmmsAAZzU0wADQPQPAANA9wADQnwAAAAEBAcAA0EwAAACAimCx4QAAXAFKwADQYgEcwADQdoHAANBiwC54N60WAgACgMAA0JPALngogsAA0JnALnoxALJVAZcrKcAAWkY9HMAA0MSAwADQv8AueCiCEwEAARrAANDIwABnMADAAFotBsAAZzqBM8AA0NXAANEAwADUCAAArkABGsAA0NbAAO5LAAABA8AA0QjAANQIAAAAAAAAAGC1KgE+BknAANERIRzAANEeFsAA0RUuwABGJsAAZprAAGcyQQEAASsAwAD10j4CPRzAANE4FsAA0S8uwABGJsAAZprAAGcyk+IBAAEawADRRMAAZp0AwAD1aEnAANFYFsAA0WUWwADRXC7AAEYmwABmmsAAZzKA/MAA9XM+AT0XwADReC7AAEYmwABmmivAAGcyPz9JwADRmyEcwADRrBbAANGfLsAARifAAGaawABnM0EBAAErAMAA9dI+Aj0cwADRyhbAANG9LsAARifAAGaawABnM5PiAQABGsAA0dbAAGadAMAA9WhJwADR6hbAANH7FsAA0e4uwABGJ8AAZprAAGczgPzAAPVzPgE9F8AA0g4uwABGJ8AAZporwABnMz8/ScAA0jUhHMAA0kUWwADSOS7AAEYowABmmsAAZzRBAQABKwDAAPXSPgI9HMAA0mIWwADSVi7AAEYowABmmsAAZzST4gEAARrAANJuwABmnQDAAPVoScAA0oIWwADSkhbAANKGLsAARijAAGaawABnNID8wAD1cz4BPRfAANKlLsAARijAAGaaK8AAZzQ/P0nAANLLIRzAANLcFsAA0s8uwABGKcAAZprAAGc1QQEAASsAwAD10j4CPRzAANL6FsAA0u0uwABGKcAAZprAAGc1k+IBAAEawADTBsAAZp0AwAD1aEnAANMaFsAA0ysWwADTHi7AAEYpwABmmsAAZzWA/MAA9XM+AT0XwADTPi7AAEYpwABmmivAAGc1Pz9JwADTZSIiIhzAANNyFsAA02kuwABGJsAAZprAAGcyQQEAASsAwAD10gAcwADTkhbAANOFLsAARifAAGaawABnM0EBAAErAMAA9dIAHMAA07EWwADTpS7AAEYowABmmsAAZzRBAQABKwDAAPXSABzAANPRFsAA08QuwABGKcAAZprAAGc1QQEAASsAwAD10j4BSsAA0+IBKz9KwADT+QEuBsAAZzuBM8AA1A3AANQnwADUigAArjoBGsAA1A7AAO5LAAABA8AA1DHAANSKAAAAAQEBwADUPgAAAIOyYIwVAABgseEBPgJJwADUShzAANRXFsAA1E4uwABGJsAAZprAAGcyQQEAASsAwAD10krAANRgASs/SsAA1HEBHMAA1IAWwADUeC7AAEYmwABmmsAAZzJEAQABgMAA1IHALn3eAMAA9WIGwABnPIEzwADUj8AA1JTAANUvAADAAEXBAAAAAQPAANSmwADVLwAAAAICAsAA1LkAAACDsmCRhQDAANTNAAAAq9dgseEAAFwBPgI9IxzAANTlFsAA1NkuwABGKMAAZprAAGc0QQEAASsAwAD10hfAANTZLsAARijAAGaaMsAA1QtgkYVgseEAwABnNCsBXcAA9U4CYJGFYLHhPRzAANUeFsAA1RMuwABGKMAAZprAAGc0gLICAAKAwADVH8AufnuBwADVJ8AufogAwAD1YwbAAGc9gTPAANU0wADVOcAA1dcAAMAARcIAAAABA8AA1UzAANXXAAAAAgICwADVXwAAAIOyYJGFAMAA1XMAAACr12Cx4QAAXAE+Aj0jHMAA1YwWwADVfy7AAEYpwABmmsAAZzVBAQABKwDAAPXSF8AA1X8uwABGKcAAZpoywADVsmCRhWCx4QDAAGc1KwFdwAD1TgJgkYVgseE9HMAA1cYWwADVui7AAEYpwABmmsAAZzWAsgIAAoDAANXHwC5/SYHAANXPwC5/VgDAAPVjBsAAZz6BM8AA1dzAANXhwADWfwAAwABFwAAAAAEDwADV9MAA1n8AAAACAgLAANYHAAAAg7JgkYUAwADWGwAAAKvXYLHhAABcAT4CPSMcwADWNBbAANYnLsAARifAAGaawABnM0EBAAErAMAA9dIXwADWJy7AAEYnwABmmjLAANZaYJGFYLHhAMAAZzMrAV3AAPVOAmCRhWCx4T0cwADWbhbAANZiLsAARifAAGaawABnM4CyAgACgMAA1m/ALoAXgcAA1nfALoAkAMAA9WMGwABnP4EzwADWhMAA1p7AANciAACuPgEawADWhcAA7ksAAAEDwADWs8AA1yIAAAABAQHAANbQAAAIg7JgkYUAAGCx4QE+AknAANbcHMAA1uwWwADW4C7AAEYowABmmsAAZzRBAQABKwDAAPXSSsAA1vUBKz9KwADXBgEcwADXGBbAANcNLsAARijAAGaawABnNEQBAAGAwADXGcAugOwAwAD1YgbAAGdAgTPAANcnwADXQcAA18gAAK49ARrAANcowADuSwAAAQPAANdXwADXyAAAAAEBAcAA13QAAAiDsmCRhQAAYLHhAT4CScAA14AcwADXkRbAANeELsAARinAAGaawABnNUEBAAErAMAA9dJKwADXmgErP0rAANerARzAANe+FsAA17IuwABGKcAAZprAAGc1RAEAAYDAANe/wC6BkADAAPViBsAAZ0GBM8AA183AANfnwADYZgAArjwBGsAA187AAO5LAAABA8AA1/XAANhmAAAAAQEBwADYEgAACIOyYJGFAABgseEBPgJJwADYHhzAANgvFsAA2CIuwABGJ8AAZprAAGczQQEAASsAwAD10krAANg4ASs/SsAA2EkBHMAA2FwWwADYUC7AAEYnwABmmsAAZzNEAQABgMAA2F3ALoI0AMAA9WIGwABnQoEzwADYa8AA2HDAANjyAADAAEW/AAAAAQPAANh7wADY8gAAAAICAsAA2IgAAACDsmCMFQDAANicAAAAq9dgseEAAFwBPgI9IxzAANixFsAA2KguwABGJsAAZprAAGcyQQEAASsAwAD10hfAANioLsAARibAAGaaMsAA2NFgjBVgseEAwABnMisBXcAA9U4CYIwVYLHhPRzAANjhFsAA2NkuwABGJsAAZprAAGcygLICAAKAwADY4sAugtGBwADY6sAu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wABdpcAAXbQJrBIBGsAAXY3AAO5LYLCZAATAAGiogTXAAF3RwABd1QmAsAEawABducAA7ktgwAD2XQAEwABoqYE1wABd78AAXfQJJwEawABd2sAA7ktgwAD0eQABBcAAaLCBNcAAXfnAAF35wABeMwAAAAPAAF4GwABeMwAAAAMDA8AAXgwAAASsEmCwmQDAAF4iAAAEgLBgwAD2XQDAAF4tAAAEJ2DAAPR5AABgwABopAE/BAgBwABop4AAwC7i2ggBwABoqIEAwC7i5wgBwABoqYIAwC7i9gkBwABd+cAAhskAAAAAAwbAAGirgTXAAF5zwABee8AAYiUEAatBAAAAAQPAAF6bwABiJQAAAAEBAcAAXqcAAACC/WDAAFppAABgwABopAE+CD0cwABevIDAAF61wC7jaoIbAQABGsAAXsLAAGimAMAAWmtOwABe3sAAXuMAAIIcYMAAaJYBHMAAXuyAwABe5cAu42qt+gEBYMAAaJYBGsAAXwfAAGibAMAAWnpOwABfGwAAAKwSYLCZAEFHwABfMIHAAF84wC7jpQQBwABfXRrAAF9dwABonAA+Aj2KwABfasAu494cwABfg4DAAF98wC7japg6AAAAAMAAWpNCwABfmAABwABfvBrAAF+8wABonQA+Aj2KwABfzMAu494cwABf5YDAAF/ewC7jaqbRAAAAAMAAWphCwABf+wABwABgHxrAAGAfwABongA+Aj2KwABgMMAu494cwABgSYDAAGBCwC7japg5AAAAAMAAWpdCwABgYAABwABghBrAAGCEwABonwA+AULAAGF8AE7AAGGUwABhmQAAgLBgwAD2XQEcwABhooDAAGGbwC7jaqtEAAAAAMAAWnZOwABhuMAAYb4AACdgwAD0eQEcwABhx4DAAGHAwC7jaqtGAAAAAMAAWnQ9HMAAYd2AwABh1sAu42qCEwEAARrAAGHhwABopgDAAFpsSsAAYesBH8AAYfbAAGiwAwADgsAAYgTALuPeg8AAYhXALuS+hMAAYhvALuTpAAbAAGitgTXAAGJbwABiYMAAZbcAAKtNAAAAAQPAAGJvwABltwAAAAEBAcAAYnkAAACEAWDAAFonAABcAT4FPRzAAGKKgMAAYoXALuWMghsBAAEawABikMAAaKYAwABaLEnAAGKaJcAAYq4WwABini6sEsAAaKdgwACG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wACKl1sAAFsBPgdOwABEn8AARK8AAMAARslgwAD0eQEWwABEsS7AAEaewABo1U7AAETYwABE2wAAwABGzWDAAIqXARzAAETdLsAARsQBAAGAwABE7cAvBVEAwABo/0nAAET5HMAARP0uwABGvAEAAYHAAEUNwC8FYADAAGj6PgE9jMAARR3ALwWvHMAARSIuwABGxcAAaLEBAAGEwABFNMAvBa8AwABpAT9OwABFUcAARVQAAMAARs5gwACKlwEcwABFVi7AAEbEAQABgcAARWbALwVgAMAAaP9OwABFdsAARX0AAIEQWwEcwABFgYLAAEV/wC8FbyACAAKEwABFgsAvBa+FwABFhsAvBisAAD0XwABFjy7AAEaeg8AARaXALwWMwABo1UrAAEW6AYbAAEXBwC8GWwbAAGkGgTfAAEckwABHJMAASrIAAMAARs8AAAABA8AARzPAAEqyAAAAAgICwABHSAAAAJaHXcAA9R0BYMAAipcAwABHTwAAAJMSYQFdwAD1HQFgwACKl1sAAFsBPghOwABHesAAR4oAAMAARslgwAD0eQEWwABHjC7AAEaewABo1U7AAEgswABIPwAAwABG0GDAAPR5AZNBRcAASEgBwABIUcAASFMAAFtgwAD0eQEcwABIYhbAAEhbgMAASFXALwbiWsAA9UyBQQEAAZQAwAD1nwEcwABIaYTAAEhnwC8HVIFIAQABkwDAAPWpAYzAAEhxwC8HVBzAAEhvhMAASHHALwdUgUEBAAGUAMAA9Z9BPgJJwABIfBzAAEiJHMAASIWAwABIgMAvBuJEAQABhMAASIbALwdUAMAA9SxBAQABKwDAAPXSQsAASJIBP0nAAEiiHMAASKYuwABGvAEAARzAAEi7gMAASLbALwbiRAEAAYTAAEi8wC8HVADAAPUsAMAAaPo+Aj2LwABIy8AvBziEwABI4MAvB1RCwABI6wA/TsAASRLAAEkaAAC8yV3AAPUdAWDAAIlgARzAAEmmHMAASTscwABJIoDAAEkcwC8G4pMuAQABg8AASSfALwc4AMAA9POAnwEBYMAAipcBNMAAST8DwABJP8AASaQAAAABAQHAAElIAAAAg7JgwACJYAAAYMAAipcBPgFKwABJVgEjHMAASWOEwABJXsAvCLhBAQABKwDAAPXSKxzAAEl1LsAARsXAAGixAQABHMAA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ogHAL0AmlVDAAImsAMAAaSg9HMAAohoulagBAAEfwACiK8AAibcDAAOBwACiMcAvQMeCwACiPMAvQOCDwACiTMAvQRsAAMAAaPgBwABGyCrAAGkDSsAAonwAP07AAKKSwACinAAAwABG7GDAAPR5ARzAAKKeLsAARrUBAAEngTwAwABo807AAKK4wACiwgAAwABG7WDAAPR5ARzAAKLELsAARrUBAAEnUQDAAGjzTsAAot7AAKLoAADAAEb2YMAA9HkBIyXAAKMCFsAAoviAwACi88AvQCaVUMAAiaxgwACJnoLAAKMawC9ByhzAAKMmLsAARrUBAAEnmX8AwABo8wFgwAD0eT0cwACjPS7AAEbHAwACFsAAo1GAwACjTMAvQCaVT8AAiao0wACjXAPAAKNcwACkIwAAAAEBAcAAo2sAAACVT2DAAIqXAABgwAD1ggE+AT0cwACjfi7AAEa7AQABH8AAo5nAAIrzAgACFsAAo7IusbfAAGjhH8AAo8bAAIsOAwADhMAAo+TAL0KAHsAAo+/AAIg9AQABgcAAo/nAL0GgAB7AAKQFwACIPQEAAYPAAKQPwC9B8wAAAADAAGj5AcAARsgqwABpAz0cwACkOC646AEAASbAAKRGARbAAKRGgMAApEHAL0AmoGHAAIllYLXQAMAAaR49HMAApF4uwABGtgEAAYHAAKRpwC9BoADAAGj0PRzAAKR5LsAARsIBAAEWwACkjYDAAKSIwC9AJoE8wACJqwDAAGj9ScAApJghJcAApKsWwACkoYDAAKScwC9AJpVQwACJrGDAAImePgM9HMAApMouuO8CAAKCwACk0sAvQcomwACk4gEWwACk4oDAAKTdwC9AJqBhwACJZWC10ADAAGj3PRzAAKT8LsAARrYBAAGDwAClB8AvQfMAwABo9D0cwAClGS7AAEbCAQABFsAApS2AwAClKMAvQCaVUMAAiawAwABo/T89HMAApUMuwABGtgEAAYLAAKVOwC9BygDAAGj0BsAAaSuBN8AApWHAAKVtwAClywAAwABHFgEawAClYsAA7ksAAAEDwACliMAApcsAAAABAQHAAKWjAAAAg7JgwACMZAAAWwE+AUrAAKWvARzAAKW2LpuSAQABgMAApcLAL0RzAMAAaPsGwABpLIE3wACl0MAApdzAAKY8AADAAEcXARrAAKXRwADu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wABGh8AAaLpEAQABgsAAzmjAL2qbAMAA9WJJwADOdSEcwADOhoTAAM55wC9rVUEBAAErAMAA9Zw+AT0cwADOoIDAAM6ZwC9p+E8BAAGEwADOpMAva1UAwAD1Lj9KwADOxQEcwADO3BbAAM7TgMAAzszAL2n4mAHAAPVNgKEAAAAAwAD08QbAAGlMgTfAAM8vwADPQMAA370AALBJARrAAM8wwADuSwAAAQPAAM9IwADfvQAAAAEBAcAAz1AAAACDsmDAAIohAABcAT4WScAAz1whHMAAz2EuwABGvAEAAYDAAM9xwC9sLADAAGj6PgVOwADPicAAz44AAJJMYMAAiYUBHMAAz5AuwABHEwEAARbAAM+mgMAAz6HAL2wskkzAAIojAMAAaSlOwADPvMAAz8YAAMAARz9gwACKLwEjHMAAz9gWwADPzoDAAM/JwC9sLMAARz/AAIokQQEAASsAwAD10isfwADQAsAAijsCAAIWwADQGhbAANAQgMAA0AvAL2wswABHP8AAiiSdZsAAijEcwADQNS7AAEcTAQABFsAA0FUWwADQS4DAANBGwC9sLMAARz/AAIokkkzAAIoyAMAAaSkAAWDAAIovTsAA0GzAANB4AADAAEdAYMAAiYUBIxzAANCMFsAA0ICAwADQe8AvbCzAAEdAwACKJUEBAAErAMAA9dIrHMAA0LIuwABHEwEAARbAANDIgMAA0MPAL2wswABHQMAAiiUAwABpKQFgwACJhT0cwADQ3C6VqAEAAR/AANDtwACKLgMAA4HAAND0wC9sZILAAND6wC9snYPAANEFwC9tQAAAwABo+ErAANEaAD89F8AA0S0uwABGoynAAGjaTsAA0UrAANFYAADAAEdBYMAA9HkBHMAA0VouwABGtQEAASfAAEdCAMAAaPNOwADReMAA0YUAAMAARz1gwAD0eQEjHMAA0Z8WwADRlYDAANGQwC9sLMAARz/AAIokQQEAASsAwAD10oHAANGqwC9t+hzAANG6LsAARrUBAAEnmYMAwABo8wFgwAD0eU7AANHWwADR4wAAwABHPmDAAPR5ARzAANHlLsAARrUBAAEnmYUAwABo807AANICwADSFAAAwABHQ2DAAPR5ARzAANIWLsAARrUBAAEnwABHRADAAGjzScAA0jUhHMAA0koWwADSPoDAANI5wC9sLMAAR0DAAIolQQEAASsAwAD10j4CPRzAANJoFsAA0lsuwABGh8AAaLqAsgIAAhbAANJugMAA0mnAL2wswABHQMAAiiWDwADSfcAvboUAwAD1Yz0cwADSnRbAANKRLsAARovAAGi+TwEAARbAANKmgMAA0qHAL2wswABHQMAAiiUAwAD1Lj89HMAA0swWwADSvy7AAEaIwABou4CyAgACgMAA0s3AL2wsgsAA0tXAL24mAMAA9WM9HMAA0vMWwADS5y7AAEaLwABovk8BAAGAwADS98AvbCwAwAD1Lj0cwADTai7AAEc7AAAAAMAAaUs9HMAA04IuwABGwgEAARbAANOWgMAA05HAL2wskkzAAIojAMAAaP1OwADTqsAA068AAIF5YMAAiWABHMAA070WwADTsS7AAEaLwABovpWmAAAAAMAA9TxAHMAA09uFwADT1sAvcAlBAQABgMAA097AL2wsAMAA9dLAANPWwADT4gBJwADT6hzAANP/FsAA0/OAwADT7sAvbCzAAEdAwACKJUEBAAErAMAA9dI+Aj0cwADUEC7AAEc7AAAAAMAAaUs9HMAA1CkuuO8CAAKEwADUMcAvbq8mwADUSQEWwADUSYDAANREwC9sLKBhwACJZWC10ADAAGj3PgI9HMAA1LculagBAAEcwADU1RrAANTSwACINpJQAgACJ8AAR0UxwADU7WDAAIqXAhbAANTuLoNmwABo4x7AANT0wACIPQEAAYTAANT+wC9urwAAwACNBQDAAGj4PRzAANUbLrjvAgACg8AA1SPAL26FJsAA1TYBFsAA1TaAwADVMcAvbCygYcAAiWVgtdAAwABo90nAANVVIRzAANVoFsAA1V6AwADVWcAvbCzAAEc/wACKJEEBAAErAMAA9dI+DT0cwADVeS7AAEa2AQABgsAA1YTAL24mAMAAaPQ9HMAA1j0WwADWMC7AAEaIwABou4CyAgACFsAA1kOAwADWPsAvbCzAAEc/wACKJIHAANZQwC9t+gDAAPVjPRzAANZxFsAA1mUuwABGi8AAaL5PAQABFsAA1nqAwADWdcAvbCzAAEc/wACKJADAAPUuPRzAANaMLsAARzsAAAAAwABpS07AANdYwADXZAAAwABHRmDAAPZdARzAANdmLsAARq0BAAEWwADXixbAANd/FsAA13WAwADXcMAvbCzAAEc/wACKJJ1mwACKMYCwwACLVwDAAGjxPRzAANenFsAA15guwABGhMAAaLdPAQABH8AA16/AAIt1AQABhsAA18bAL3I5AADAAPUuPRzAANf4FsAA19suwABGj8AAaMJPAQABH8AA2ACB7AICYMAA9l1gwAD2XQIWwADYIBbAANgUFsAA2AqAwADYBcAvbCzAAEc/wACKJJ1mwACKMYCwwACLV4bAANgmwC9yOQAAwAD1Lj0cwADYOy6VqAEAARzAANhOGsAA2EvAAIg2klACAAInwABGxjHAANhiYMAA9cUChsAA2GPAL3I5FsAA2HAuwABGqcAAaOUAwACNBQDAAGj4PRzAANiHLsAARsIBAAEWwADYpRbAANibgMAA2JbAL2wswABHP8AAiiSSTMAAijIAwABo/T0cwADYxBbAANiyLsAARo/AAGjClaYAAAAAwAD1PEnAANjYIRzAANjtFsAA2OGAwADY3MAvbCzAAEdAwACKJUEBAAErAMAA9dI+Aj0cwADZXy6VqAEAARzAANl/GsAA2W/AAIg2klACAAInwABHRTHAANmXYMAAipcCFsAA2Zgug2bAAGjjHsAA2Z7AAIg9AQABhMAA2ajAL26vAADAAI0FAMAAaPg9HMAA2ccuuO8CAAKDwADZz8AvboUmwADZ4gEWwADZ4oDAANndwC9sLKBhwACJZWC10ADAAGj3PgE9HMAA2g0uuO8CAAKEwADaFcAvbq8mwADaLQEWwADaLYDAANoowC9sLKBhwACJZWC10ADAAGj3TsAA2lfAANpcAACBeWDAAIlgARzAANpqFsAA2l4uwABGi8AAaL6VpgAAAADAAPU8QBzAANqKh8AA2oXAL3TAQQEAARbAANqSgMAA2o3AL2wswABHP8AAiiQAwAD10sAA2oXAANqbAD89HMAA2zUuwABGtgEAAYHAANtAwC9t+gDAAGj0TsAA21/AANtyAADAAEdHXcAA9R0BYMAA9HkBHMAA23QuwABHPMAAaLEAAAAAwABpAk7AANuiwADbrAAAwABHSGDAAPR5ARzAANvBhsAA267AL3VElaYAAAAAwAD1PEnAANvTFsAA2+qGwADb18AvdUSDaMAA9QA+AT0cwADchi6VqAEAARzAANyZGsAA3JbAAIg2klACAAInwABGxjHAANytYMAAipcCFsAA3Lcug2bAAGjjH8AA3MnAAIwtAQABHMAA3P8cwADc8IbAANzdwC91RICfAQFgwACMFAEawADc98AAiD0AwAD05oChAAAAAMAA9PEAAMAAjQUAwABo+D9JwADdHhzAAN0zFsAA3SeAwADdIsAvbCzAAEdAwACKJUEBAAErAMAA9dI+AT0cwADd0C647wIAAofAAN3YwC91dSbAAN3oARbAAN3ogMAA3ePAL2wsoGHAAIllYLXQAMAAaPc/ScAA3gYhHMAA3hsWwADeD4DAAN4KwC9sLMAAR0DAAIolQQEAASsAwAD10j4ITsAA3jTAAN45AACBeWDAAIlgARzAAN5HFsAA3jsuwABGi8AAaL6VpgAAAADAAPU8QBzAAN5nFMAA3mLAL3bWCABBAQABFsAA3m+AwADeasAvbCzAAEdAwACKJQDAAPXSwADeYsAA3noAPRzAAN6ELsAARrYBAAGDwADej8AvboUAwABo9D0cwADepC7AAEc7AAAAAMAAaUs9HMAA3r0uwABGwgEAARbAAN7RgMAA3szAL2wswABHQMAAiiUAwABo/T0cwADe5S6VqAEAAR/AAN72wACNAQEAASfAAEdJAADAAGj4PRzAAN8tLpWoAQABHMAA30AawADfPcAAiDaSUAIAAifAAEdKMcAA31pgwACLYgIWwADfWy6xt8AAaOEWwADfYS6DZsAAaOMAwACNBQDAAGj4PRzAAN9wLrjoAQABJsAA334BFsAA336AwADfecAvbCygYcAAiWVgtdAAwABpHj89HMAA35wuwABGtgEAAYTAAN+nwC9urwDAAGj0BsAAaU2BN8AA38LAAN/OwADgHwAAleUBGsAA38PAAO5LAAABA8AA3+bAAOAfAAAAAQEBwADf/gAAAIOyYMAAi2wAAFsBPgE9HMAA4AouwABGwAEAAYDAAOAWwC94iADAAGj8BsAAaU6BN8AA4CTAAOA+wADibgAAwABHSwEawADgJcAA7ksAAAEDwADgWsAA4m4AAAABAQHAAOB2AAAAg7JgwACKxgAAYMAAipcBPgJGwADggsAA4MbAAOChAAAAwABHTGDAAIr1ABbAAOC4gMAA4LPAL3jtwABHTcAAisg+A07AAODlwADg8QAAnWZgwACLbAEmwADg5QEWwADhAoHAAODzwC95Dp1mwACK92DAAItsPRzAAOEkFsAA4RUuwABGhMAAaLdPAQABgsAA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AEbUYMAAiYAAwAEAqgAAAMAARtVgwACKxgDAAQDYAAAAwABG1mC10ADAAQELAAAArz9gtdAAAGDAAIuVAT4ITsABATbAAQFHAADAAEdmYMAAipcBJsABATYBHMABAeQcwAEBUxrAAQFUwACINiACAAInwABHZzLAAQF9YMAA9l1gwAD1xQMngRAWwAEBjy7AAEaRwABoxSevWRbAAQGxLq9ZwABpXCfAAEdZFsABAdIuwABHWcAAaWIAwACNBK8xAQABhcABAfrAL47FAMAAiW5gwACKl07AAQIgwAECMwAAwABHaGDAAIoJASbAAQIgARzAAQJeH8ABAjnAAIoUAQABhsABAkPAL47cAK8xAQABhcABAnTAL47FAMAAiW5gwACKCU7AAQKdwAECqAAAwABHaWDAAImAASbAAQKdARzAAQSjHMABArAawAECrcAAiDaSUAIAAifAAEdqMsABA4FgwAD2XWDAAPXFCCeBhRbAAQOWLsAARpLAAGjGJ5HBHsABA7TAAIg9AQABGsABA8rAAJV/ACfAAEaVFsABA+wuwABGlcAAaMonwABGqRbAAQQULsAARqnAAGjlJ4EQFsABBDIuwABGkcAAaMUnsbcWwAEETC6xt8AAaOEnThbAAQRjLk7AAGjiJ8AAR2iHwAEEiMAvj3MAwACNBa8xAQABhcABBLnAL47FAMAAiW5gwACJgE7AAQTcwAEE6gAAwABHa2DAAIuVASbAAQTcARzAAQXjHMABBO4awAEE78AAiDYgAgACJ8AAR2wywAEFVmDAAPZdYMAA9cUEJ4GFFsABBWsuwABGksAAaMYngRAWwAEFii7AAEaRwABoxSfAAEdpFMABBarAL4/BCAAnwABG1ILAAQXNwC+OlADAAI0ErzEBAAGEwAEF+cAvjrYAwACJbmDAAIuVTsABBifAAQY2AADAAEdtYMAAipcBJsABBicBHMABBsccwAEGOhrAAQY7wACINiACAAInwABHbjLAAQZkYMAA9l1gwACKlwMnr1YWwAEGei6vVsAAaVknr0wWwAEGmC6vTMAAaMcnwABHWRbAAQa1LsAAR1nAAGliAMAAjQSvMQEAAYXAAQbdwC+OxQDAAIluYMAAipdOwAEHA8ABBxQAAMAAR29gwACKCQEmwAEHAwEcwAEHPR/AAQcawACKFAEAARTAAQckwC+RVQoA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wACKlwEmwAEbsQEcwAEchRzAARvRGsABG9LAAIg2IAIAAifAAEeGMsABHABgwAD2XWDAAPXFAyevRRbAARwbLq9FwABpbyeCFxbAARw6Lq9GwABpcCfAAEdrFMABHG/AL5vyDgAAwACNBK8xAQABhcABHJvAL5enAMAAiW5gwACKl07AARzEwAEc3gAAwABHh2DAAImAASbAARzEARzAAR0MH8ABHOTAAIoUAQABFMABHO7AL5ydDwAArzEBAAGFwAEdIsAvl6cAwACJbmDAAImASsABHT4BJsABHT4BHMABHuMcwAEdRxrAAR1IwACINiACAAInwABHiDLAAR4JYMAA9l1gwAD1xQUnwABHdYfAAR4mwC+X5CeSXoHAAR5RwC+XYSfAAEeJFsABHn0WwAEedC7AAEaQwABow6fcwABpoSeY8xbAAR6ULsAARprAAGjPJ8AAR4cUwAEewcAvnS8QAADAAI0ErzEBAAGEwAEe+cAvl5gAwACJbmDAAIuVBsAAaXmBN8ABHxzAAR8twAEg3QAAwABG0gEawAEfHcAA7ksAAAEDwAEfOcABIN0AAAABAQHAAR9MAAAAoGFgtdAAAFwBPgQ9F8ABH2UuwABGlSnAAGjKPRzAAR+uLsAARrYBAAEWwAEfuS7AAEaKwABovQDAAGj0TsABH9rAAR/2AADAAEeKYMAAipcBJsABH9oBHMABIEEcwAEf+hrAAR/7wACINiACAAInwABHYjHAASAGYMAAipcCFsABIA4ur0nAAGlzFsABIC0uwABGqcAAaOUAwACNBK8xAQABgMABIFfAL55hAMAAiW5gwACKlz0cwAEgby6VqAEAASbAASCwARzAASCwH8ABIIDAAIoUAQABgcABIIrAL56lAK8xAQABgMABIMbAL55hAMAAiW5gwACJgADAAGj4BsAAaXqBN8ABISzAASE9wAEi4gAAwABG0QEawAEhLcAA7ksAAAEDwAEhS8ABIuIAAAABAQHAASFeAAAAoGFgtdAAAFwBPgNJwAEhdxbAASGEFsABIXsuwABGkMAAaMPAAEbZwABpoD4BPRzAASGgLsAARrYBAAEWwAEhqy7AAEaJwABovADAAGj0PgE9HMABIcoulagBAAEfwAEh28AAjQEBAAEnwABHXgAAwABo+E7AASITwAEiJgAAwABHi2DAAIqXASbAASITARzAASJPHMABIjIawAEiM8AAiDYgAgACJ8AAR4wxwAEiPWDAAIqXARbAASI+LqkAwABpcQDAAI0ErzEBAAGAwAEiZcAvn5wAwACJbmDAAIqXPRzAASJ9LpWoAQABJsABIrUBHMABIrUfwAEijsAAihQBAAGBwAEimMAvoBcArzEBAAGAwAEiy8Avn5wAwACJbmDAAImAAMAAaPgGwABpe4E3wAEi58ABIxfAASPEAADAAEbXARrAASLowADuSwAAAQPAASMuwAEjxAAAAAEBAcABI0gAAACgYWC10AAAXcAA9NsBYMAAivUBPgJOwAEjgcABI4sAAJW6XcAA9R0BYMAAivUBMcABI6hgwACK9QBKwAEjsAGBwAEjt8AvoR0GwABpfIE3wAEjycABI+LAASSgAADAAEboARrAASPKwADuSwAAAQPAASPwwAEkoAAAAAICAsABJAYAAACAimDAAIqXAMABJB8AAACgYWC10AAAYMAAiYABPgE9MMABJDgcwAEkRxbAASQ+Lp/OwABo0aBiAgACFsABJF4uoE7AAGjnJ8AAR40Aq8UGwABpfYE3wAEkpcABJLbAASUrAADAAEasARrAASSmwADuSwAAAQPAASTFwAElKwAAAAAAAABcAT4BPRfAASTOLq9GHMABJPUuwABGtAEAARbAASUKLq9GwABpcADAAGjywABpcAAAL5V5AC+VvAAvlxkAL54sAC+fZwAvoMsAL6FPAC+h2QAvoj4AAAAIAsAAaYCBN8ABJTDAASU2wAFOOwPAAEeOAAABYMAAaLUAAAkEwABpgoE3wAEmgsABJpYYwABHjwBgwAD2XQErBMAAaYOBN8ABJt/AASbtGMAAR5AAYMAA9l0BKwTAAGmEgTfAASkbwAEpKgmo/gBgwACKlwAEwABphYE3wAEpr8ABKbwJr04AYMAAipcABMAAaYaBN8ABKdTAASnuGK9PAF3AAPUdAWDAAIqXAATAAGmHgTfAASpMwAEqXgmo/wBgwACKlwAEwABpiIE3wAEq78ABKv4Jr1AAYMAAipcABMAAaYmBN8ABK5bAASupCa9IAGDAAIqXAATAAGmKgTfAASvCwAErygmo+gBgwACKlwABBcAAaZiBN8ABK8/AASvPwAEtbAAAAAPAASvgwAEtbAAAAAsCAsABK/QAAACfzmCrvwDAASwIAAAAoE5gq/EACcABLB8AAASo/mDAAIqXASvAASw7AAAEqP9gwACKlwErwAEsWgAABK9OYMAAipcBK8ABLHQAAASvT13AAPUdAWDAAIqXASvAASybAAAEr1BgwACKlwErwAEstwAABK9IYMAAipcBK8ABLNcAAASo+mDAAIqXASvAASzuAAAAr0phAWDAAPZdYMAA9l0BK8ABLSMAAACvTGDAAIqhAStgwABpgAE/CAgBwABphIIAwC+juAgBwABph4MAwC+jyAgBwABphYQAwC+j2AgBwABphoUAwC+j6AgBwABpiIYAwC+j/ggBwABpiYcAwC+kDggBwABpihQAwC+kHggACQDAAS02wABpVQQABIDAAS08wC+jnYHAAS1GwC+jqhTAAS1RwC+kLgkAFMABLWPAL6RFCgAACgbAAGmMgTfAASVmwAEle8ABJY4BAMAARqsBGsABJWfAAO5LAAABA8ABJYfAASWOAAAAAAAAAGDAAPKzAUrAASWKASkGwABpjYE3wAEmGcABJizAASZ2AQDAAEeRAAAAAQPAASY9wAEmdgAAAAAAAABgwACLYgE+AUrAASZDAR/AASZOwACLawEAARbAASZdLsAAR4/AAGmCAAbAAGmOgTfAASbxwAEnBMABJzQBAMAAR5IAAAABA8ABJw/AASc0AAAAAAAAAGDAAItiAUrAAScSAR/AAScWwACLawEAARbAASclLsAAR5DAAGmDAAbAAGmQgTfAAS8dwAEvLsABNHoAAMAAR1QBGsABLx7AAO5LAAABA8ABLzbAATR6AAAAAwMDwAEvRAAAAIOyYMAAiooAwAEvWAAAAJJHYMAAipcAwAEvfAAAAKBhYLXQAABcAT4GTsABMEXAATBcAADAAEeTXcAA9R0BYMAA9HkBMcABMGNgwAD0eQEWwAEwZC7AAEaJwABovD0cwAEwi4PAATB0wC+mPYCZAQABHMABMOUcwAEwpxbAATCSLsAARovAAGi+gScBAAE0wAEwrQPAATCtwAEw2gAAAAEBAcABMLYAAACDsmDAAIlgAABgwADyswFKwAEwvwEhHMABMNMcwAEwzBbAATC/LsAARofAAGi6RAEAAYTAATDNwC+mtQDAAPViQQEAASsAwAD1nADAAPTngJ8BAWDAAPR5ATTAATDpA8ABMOnAATEOAAAAAQEBwAEw8gAAAIOyYMAAiWAAAGDAAPR5AUrAATD7ARzAATEIFsABMPsuwABGh8AAaLpEAQABhMABMQnAL6cpAMAA9WIAwAD05gDAAPUvPRzAATEWLpWoAQABJsABMawBHMABMawcwAExKRrAATEmwACINpJQAgACJ8AARsYxwAExPWDAAIqXAhbAATFFLsAAR5HAAGmNH8ABMWHAAIwtAQABHMABMZscwAExjIPAATF1wC+mPYCfAQFgwACMFAEawAExk8AAiD0AwAD05oChAAAAAMAA9PEAAMAAjQWvMQEAAYLAATHCwC+mKgDAAIluYMAAiYAAwABo+E7AATHpwAEx/QAAwABHlGDAAIqXASbAATHpARzAATKeHMABMgEawAEyAsAAiDYgAgACJ8AAR5UywAEyJmDAAPZdYMAAipcCJ69QIxbAATJGgMABMkHAL6YMsfXAAIqNFsABMlAur0jAAGmJFsABMmYur1DAAGmIAWDAAIqXJ5JHgcABMovAL6YbAMAAjQSvMQEAAYLAATK0wC+mKgDAAIluYMAAipdOwAEy2sABMu4AAMAAR5ZgwACKlwEmwAEy2gEcwAEz5hzAATLyGsABMvzAAIg2IAIAAifAAEeXMsABM0FgwAD2XWDAAPXFBCeo/hbAATNcLqj+wABphCfAAEeUhMABM4rAL6ghJ69MFsABM7Eur0zAAGjHJ8AAR5IWwAEzzy7AAEeQwABpgwDAAI0ErzEBAAGCwAEz/MAvpioAwACJbmDAAIqXPRzAATQULpWoAQABJsABNE0BHMABNE0fwAE0JcAAihQBAAGFwAE0L8AvqMcArzEBAAGCwAE0Y8AvpioAwACJbmDAAImAAMAAaPgGwABpkYE3wAE0f8ABNJLAAUSOAAC2/gEawAE0gMAA7ksAAAEDwAE0oMABRI4AAAAGBgbAATS7AAAAnvBdwAD1HQFgwACLdgDAATTgAAAAkl5dwAD1HQFgwACLdgDAATUDAAAAwABG1GDAAImAAMABNTMAAADAAEbVYMAAisYAwAE1YQAAAMAARtZgtdAAwAE1lAAAAK8/YLXQAABgwACLlQE+D07AATW/wAE1ygAAwABHmGDAAIqXASbAATW/ARzAATY4HMABNc4awAE1z8AAiDYgAgACJ8AAR5kywAE172DAAPZdYMAAi2ICJ4NmFsABNf8ug2bAAGjjJ8AAR5EWwAE2Hy7AAEeRwABpjQDAAI0ErzEBAAGFwAE2TsAvqkEAwACJbmDAAIqXTsABNnjAATaAAADAAEeaYMAAipcBJsABNngBHMABNrQcwAE2hBrAATaFwACINiACAAInwABHmzLAATaXYMAA9l1gwACLYgEng2YWwAE2py6DZsAAaOMAwACNBK8xAQABhcABNsrAL6pBAMAAiW5gwACKl07AATb0wAE3AgAAwABHnGDAAIqXASbAATb0ARzAATdVHMABNwYawAE3B8AAiDYgAgACJ8AAR50ywAE3HmDAAPZdYMAAipcCJ7G3FsABNy4usbfAAGjhJ8AAR5qHwAE3RcAvqt4AwACNBK8xAQABhcABN2vAL6pBAMAAiW5gwACKl07AATeVwAE3oQAAwABHnmDAAIqXASbAATeVARzAATgNHMABN6UawAE3psAAiDYgAgACJ8AAR3kywAE3xGDAAPZdYMAA9cUCJ8AARqkWwAE33C7AAEapwABo5SeBEBbAATf6LsAARpHAAGjFAMAAjQSvMQEAAYXAATgjwC+qQQDAAIluYMAAipdOwAE4TcABOFcAAMAAR59gwACKlwEmwAE4TQEcwAE4qhzAAThbGsABOFzAAIg2IAIAAifAAEd7MsABOHNgwAD2XWDAAItiAiextxbAATiDLrG3wABo4SdOFsABOJouTsAAaOIAwACNBK8xAQABhcABOMDAL6pBAMAAiW5gwACKl07AATjpwAE4+AAAuOdgwACJgAEmwAE46QEcwAE5FR/AATkGwACKCAEAASsArzEBAAGFwAE5K8AvqkEAwACJbmDAAImATsABOVTAATlfAACjWGDAAImAASbAATlUARzAATueHMABOWcawAE5ZMAAiDaSUAIAAifAAEegMsABOlhgwAD2XWDAAPXFCCeBhRbAATptLsAARpLAAGjGJ8AAR6EewAE6mcAAiD0BAAEawAE6r8AAlYAAJ8AAR5iGwAE62cAvqlgnwABHnBTAATr8wC+rUQgAJ5l0FMABOxrAL6zaCwAnkcEewAE7OcAAiD0BAAEawAE7T8AAlX8AJ8AAR54UwAE7bMAvq9IJACfAAEefFMABO4zAL6xaCgAAwACNBa8xAQABhcABO7TAL6pBAMAAiW5gwACJgE7AATvdwAE75QAAwABHomDAAImAASbAATvdARzAATz0HMABO+0awAE76sAAiDaS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AYKKlcAv+00AAMAAQA5GiquK5Yq+AAAAuvhgwABYXQAWitIusVLAAGouPgE9HIsLgIrtwC/6a7NrAQABHosfwABdwwEAAYKLNcAv+6sAAMAAQA9Gi1OLgItkAAAAmTxgsK0AFotrLrKpwABqLz4BPRyLm4CLiMAv+muzawEAAR6LusAAXcMBAAEci+OBi9DAL/p6qgABAAGCi+7AL/vwAK8FAADAAEAPRowAjCeMEQAAAJk8YLCtABaMGC7AAENMwABqMD4BPRyMQoCML8Av+muzawEAAR6MYcAAXcMBAAEcjIqBjHfAL/p6qgABAAGCjJXAL/xFAK8FAADAAEAPRoynjNeMugAAAMAAQ01gwABqKQAWjMkuwABDTsAAajE+AT0cjOuCjN/AL/ycq9ICAAKAjPrAL/prgY0OwC/6egDAAGo4AAAv+X4AL/nVAC/6SwAv/NwAAAADAsAAajuBO41ujXTAAF1gA8AAR+oAAAFgwAD1xQAAQwTAAGo+gTuNnI2rCatzwABqHABgrJMABMAAaj+BO43njf4YwABH68AAahwAYMAAaikBKwTAAGpAgTuPJ484GMAAR+zAAGocAGDAAGopASsEwABqQYE7kJKQpBjAAEftwABqHABgwABqKQErBMAAakKBO5F/kYkYwABH7sAAahwAYMAAaikBKwTAAGpDgTuS+pMHGMAAR+/AAGocAGDAAGopASsEwABqRIE7k/uUCRjAAEfwwABqHABgwABqKQErBMAAakWBO5VxlYgYwABH8cAAahwAYMAAaikBKwTAAGpGgTuWaJaDGMAAR/LAAGocAGDAAGopASsEwABqR4E7l56XrxjAAEfzwABqHABgwABqKQErBMAAakiBO5hamGIYwABH9MAAahwAYMAAaikBKwTAAGpJgTuY/JkOGMAAR/XAAGocAGDAAGopASsEwABqSoE7mwGbDhjAAEf2wABqHABgwABqKQErBMAAakuBO5u3m8EYwABH98AAahwAYMAAaikBKwTAAGpMgTudgJ2LGMAAR/jAAGocAGDAAGopASsEwABqTYE7ni6eOBjAAEf5wABqHABgwABqKQErBMAAak6BO57ZnuQYwABH+sAAahwAYMAAaikBKwTAAGpPgTugOKBKGMAAR/vAAGocAGDAAGopASsEwABqUIE7oXChhhjAAEf8wABqHABgwABqKQErBMAAalGBO6K3oskYwABH/cAAahwAYMAAaikBKwTAAGpSgTuko6S2GMAAR/7AAGocAGDAAGopASsEwABqU4E7pf2mEBjAAEf/wABqHABgwABqKQErBMAAalSBO6cBpxMYwABIAMAAahwAYMAAaikBKwTAAGpVgTuny6fXGMAASAHAAGocAGDAAGopASsEwABqVoE7qw2rIhjAAEgCwABqHABgwABqKQErBMAAaleBO6vRq+MYwABIA8AAahwAYMAAaikBKwTAAGpYgTusqKyzGMAASATAAGocAGDAAGopASsEwABqWYE7rVytcBjAAEgFwABqHABgwABqKQErBMAAalqBO66VrqkYwABIBsAAahwAYMAAaikBKwTAAGpbgTuwLLA7GMAASAfAAGocAGDAAGopASsEwABqXIE7sW+xfxjAAEgIwABqHABgwABqKQErBMAAal2BO7NQs1oYwABICcAAahwAYMAAaikBKwTAAGpegTuz+LQEGMAASArAAGocAGDAAGopASsEwABqX4E7tOi0+hjAAEgLwABqHABgwABqKQErBMAAamCBO7XwtfoYwABIDMAAahwAYMAAaikBKwTAAGphgTu3KrdBGMAASA3AAGocAGDAAGopASsEwABqYoE7uOG46xjAAEgOwABqHABgwABqKQErBMAAamOBO7lsuX0YwABID8AAahwAYMAAaikBKwTAAGpkgTu7ALsPGMAASBDAAGocAGDAAGopASsEwABqZYE7u5m7rxjAAEgRwABqHABgwABqKQErBMAAamaBO7xuvIAYwABIEsAAahwAYMAAaikBKwTAAGpngTu9M71FGMAASBPAAGocAGDAAGopASsEwABqaIE7ve69/hjAAEgUwABqHABgwABqKQErBMAAammBO79Lv1MYwABIFcAAahwAYMAAaikBKwTAAGpqgTu/8sAAQAEYwABIFsAAahwAYMAAaikBKwTAAGprgTvAAEJbwABCZhjAAEgXwABqHABgwABqKQErBMAAamyBO8AAQ3/AAEOTGMAASBjAAGocAGDAAGopASsEwABqbYE7wABFJsAARTQYmqHAAGocAGDAAGopASsEwABqboE7wABF2MAAReEYmpzAAGocAGDAAGopASsEwABqb4E7wABHGMAARyEYmpvAAGocAGDAAGopASsEwABqcIE7wABIPMAASE4YqdDAAGocAGDAAGopASsEwABqcYE7wABI/8AASRQYwABIGcAAahwAYMAAaikBKwTAAGpygTvAAEqqwABKuhiposAAahwAYMAAaikBKwTAAGpzgTvAAEv/wABMDxipp8AAahwAYMAAaikBKwTAAGp0gTvAAE1XwABNZBipz8AAahwAYMAAaikBKwTAAGp1gTvAAE4JwABOFRjAAEgawABqHABgwABqKQErBMAAanaBO8AAT3zAAE+PGMAASBvAAGocAGDAAGopASsEwABqd4E7wABRBMAAURAYwABIHMAAahwAYMAAaikBKwTAAGp4gTvAAFGswABRvhjAAEgdwABqHABgwABqKQErBMAAanmBO8AAUnPAAFKGGMAASB7AAGocAGDAAGopASsEwABqeoE7wABT6cAAU/kYwABIH8AAahwAYMAAaikBKwTAAGp7gTvAAFUwwABVRBjAAEggwABqHABgwABqKQErBMAAanyBO8AAVmrAAFZ2GMAASCHAAGocAGDAAGopASsEwABqfYE7wABX7MAAV/oYwABIIsAAahwAYMAAaikBKwTAAGp+gTvAAFjdwABY6xjAAEgjwABqHABgwABqKQErBMAAan+BO8AAWerAAFn9GMAASCTAAGocAGDAAGopASsEwABqgIE7wABbacAAW5cYwABIJcAAahwAXcAA9U4CYMAA9HlgwABqKQEywABblWDAAPR5YMAAaikAAQXAAGrRgTuNsI2wjdQAAAADjb6N1AAAAAEBAY3EAAAEq3NgrJMAAGDAAGo7AT8CCAHAAGo+gADAMAThCQGNsMAA9dsAAAAATAbAAGqCgTuOA44VjxQBAKlUAAAAAQOOLI8UAAAAAAAAAGDAAGopAT4BSo4yATUAAAABAGDAAGopARaOOS7AAEfrwABqHMAAaj8jHI5RgADAMAU8QQEAASsAwAD10heOOS7AAEfrwABqHB+OWcAAajoBAAABwABDSzGOc2Cw1AMWjosWjnsuq3PAAGocwABqPqlVrSoWjsQWjrQuq3PAAGocwABqPqlUrSkWjvIWjuIuq3PAAGocwABqPqlRrSbAAGo/gADAMAU8AWDAAGopBsAAaoOBO489j0+QfwEAqVIAAAABA49gkH8AAAAAAAAAYMAAaikBPgFKj2YBNQAAAAEAYMAAaikBFo9tLsAAR+zAAGocwABqQCMcj3+AAMAwBgpBAQABKwDAAPXSF49tLsAAR+zAAGocH4+HwABqOgIAAALAAENLMY+hYLDUBBaPuRaPqS6rc8AAahzAAGo+qU+tJBaP4xaP0y6rc8AAahzAAGo+qVCtJRaQDRaP/S6rc8AAahzAAGo+qVKtJxaQNRaQJS6rc8AAahzAAGo+qVOtKMAAQ04xkGJgwABqKQEWkGouwABIJsAAapPAAGpAgADAMAYKAWDAAGopBsAAaoSBO5CpkLuRbAEAwABIJwAAAAEDkM2RbAAAAAAAAABgwABqKQE+AUqQ0wE1AAAAAQBgwABqKQEWkNouwABH7cAAahzAAGpBIxyQ7YAAwDAHCEEBAAErAMAA9dIXkNouwABH7cAAahwfkPXAAGo6AQAAAbKpMZEYYLCtAhaRMBaRIC6rc8AAahzAAGo+qQus4haRVBaRRC6rc8AAahzAAGo+qQqs4cAAakGAAMAwBwgBYMAAaikGwABqhYE7kY6RoJLnAQDAAEgoAAAAAQORqpLnAAAAAAAAAGDAAGopAUqRrQE1AAAAAQBgwABqKQEWka0uwABH7sAAahzAAGpCIxyRuIAAwDAHv0EBAAErAMAA9dIXka0uwABH7sAAahwfkcDAAGo6AQAAAbNiMZHaYLDUBhaR9BaR5C6rc8AAahzAAGo+qPeszhaSHhaSDi6rc8AAahzAAGo+qPiszxaSSRaSOS6rc8AAahzAAGo+qPms0BaSdRaSZS6rc8AAahzAAGo+qQWs3BaSqBaSmC6rc8AAahzAAGo+qPqs0RaSyhaSui6rc8AAahzAAGo+qPaszcAAakKAAMAwB78BYMAAaikGwABqhoE7kwyTHpPoAQDAAEgpAAAAAQOTK5PoAAAAAAAAAGDAAGopAT4BSpMxATUAAAABAGDAAGopARaTOC7AAEfvwABqHMAAakMjHJNGgADAMAjMQQEAASsAwAD10heTOC7AAEfvwABqHB+TTsAAajoBAAABs2Ixk2hgsNQDFpOAFpNwLqtzwABqHMAAaj6pAKzXFpOmFpOWLqtzwABqHMAAaj6o+6zSFpPHFpO3LqtzwABqHMAAaj6o/azUwABqQ4AAwDAIzAFgwABqKQbAAGqHgTuUDpQglV4BAMAASCoAAAABA5QulV4AAAAAAAAAYMAAaikBPgFKlDQBNQAAAAEAYMAAaikBFpQ7LsAAR/DAAGocwABqRCMclEqAAMAwCZpBAQABKwDAAPXSF5Q7LsAAR/DAAGocH5RSwABqOgEAAAGzYjGUbGCw1AYWlIQWlHQuq3PAAGocwABqPqj+rNUWlKsWlJsuq3PAAGocwABqPqj/rNYWlNUWlMUuq3PAAGocwABqPqj8rNMWlPgWlOguq3PAAGocwABqPqj7rNIWlRkWlQkuq3PAAGocwABqPqkFrNwWlUoWlTouq3PAAGocwABqPqj6rNHAAGpEgADAMAmaAWDAAGopBsAAaoiBO5WNlZ+WVQEAwABIKwAAAAEDlbaWVQAAAAAAAABgwABqKQE+AUqVvAE1AAAAAQBgwABqKQEWlcMuwABH8cAAahzAAGpFIxyV24AAwDAKp0EBAAErAMAA9dIXlcMuwABH8cAAahwflePAAGo6AQAAAbNiMZX9YLDUAhaWFRaWBS6rc8AAahzAAGo+qUatGxaWOxaWKy6rc8AAahzAAGo+qVatK8AAakWAAMAwCqcBYMAAaikGwABqiYE7loiWmpeLAQDAAEgsAAAAAQOWtZeLAAAAAAAAAGDAAGopAT4BSpa7ATUAAAABAGDAAGopARaWwi7AAEfywABqHMAAakYjHJbegADAMAtgQQEAASsAwAD10heWwi7AAEfywABqHB+W5sAAajoCAAACs2IxlwlgsNQBFpcaFpcKLqtzwABqHMAAaj6pR60cwABDTjGXV2DAAGopARyXWC7AAEgtwABqHAEAASfAAEguAMAAas7AAGpGgADAMAtgAWDAAGopBsAAaoqBO5e0l8aYRwEAqWIAAAABA5fXmEcAAAAAAAAAYMAAaikBPgFKl90BNQAAAAEAYMAAaikBFpfkLsAAR/PAAGocwABqRyMcl/aAAMAwDChBAQABKwDAAPXSF5fkLsAAR/PAAGocH5gGwABqOgEAAAGzYjGYIGCw1AEWmDEWmCEuq3PAAGocwABqPqlirTfAAGpHgADAMAwoAWDAAGopBsAAaouBO5hnmHmY6QEAwABILwAAAAEDmIGY6QAAAAAAAABgwABqKQE+AUqYhwE1AAAAAQBgwABqKQEWmI4uwABH9MAAahzAAGpIIxyYl4AAwDAMzEEBAAErAMAA9dIXmI4uwABH9MAAahwfmKfAAGo6AQAAAbNiMZjBYLDUARaY0haYwi6rc8AAahzAAGo+qUStGcAAakiAAMAwDMwBYMAAaikGwABqjIE7mROZJZruAQCpYAAAAAEDmTea7gAAAAAAAABgwABqKQE+AUqZPQE1AAAAAQBgwABqKQEWmUQuwABH9cAAahzAAGpJIxyZV4AAwDANbkEBAAErAMAA9dIXmUQuwABH9cAAahwfmV/AAGo6AgAAArNiMZl5YLDUARaZkRaZgS6rc8AAahzAAGo+qWCtNcAAQ04xmblgwABqKQMcmgouwABIMMAAahwBAAEnwABIMQDAAGrNHJpbLsAASC3AAGocAQABJ8AASDIAwABqzhaaqS6o6sAAarzAAGpJgADAMA1uAWDAAGopBsAAao2BO5sTmyWbpAEAwABIMwAAAAEDmzKbpAAAAAAAAABgwABqKQE+AUqbOAE1AAAAAQBgwABqKQEWmz8uwABH9sAAahzAAGpKIxybTYAAwDAOW0EBAAErAMAA9dIXmz8uwABH9sAAahwfm13AAGo6AQAAAbKpMZuAYLCtARabkRabgS6rc8AAahzAAGo+qQqs4cAAakqAAMAwDlsBYMAAaikGwABqjoE7m8ab2J0QAQDAAEg0AAAAAQOb4p0QAAAAAAAAAGDAAGopAT4BSpvoATUAAAABAGDAAGopARab7y7AAEf3wABqHMAAaksjHJv6gADAMA7/QQEAASsAwAD10heb7y7AAEf3wABqHB+cAsAAajoBAAABsqkxnCVgsK0GFpw9FpwtLqtzwABqHMAAaj6pDazkFpxfFpxPLqtzwABqHMAAaj6pG6zyFpyJFpx5LqtzwABqHMAAaj6pHKzzFpyuFpyeLqtzwABqHMAAaj6pHaz0FpzTFpzDLqtzwABqHMAAaj6pDKzjFpz4FpzoLqtzwABqHMAAaj6pDqzlwABqS4AAwDAO/wFgwABqKQbAAGqPgTudFZ0nnT0BAMAASDUAAAABA50xnT0AAAAAAAAAYMAAaikBSp00ARadNC7AAEg0wABqjgbAAGqQgTudQp1UnW0BAMAASDYAAAABA51hnW0AAAAAAAAAYMAAaikBSp1kARadZC7AAEg0wABqjgbAAGqRgTudkJ2inhsBAMAASDcAAAABA52tnhsAAAAAAAAAYMAAaikBPgFKnbMBNQAAAAEAYMAAaikBFp26LsAAR/jAAGocwABqTCMcncaAAMAwEH5BAQABKwDAAPXSF526LsAAR/jAAGocH53WwABqOgEAAAGyqTGd+WCwrQEWngoWnfouq3PAAGocwABqPqkQrOfAAGpMgADAMBB+AWDAAGopBsAAapKBO549nk+exgEAwABIOAAAAAEDnlmexgAAAAAAAABgwABqKQE+AUqeXwE1AAAAAQBgwABqKQEWnmYuwABH+cAAahzAAGpNIxyecYAAwDARIkEBAAErAMAA9dIXnmYuwABH+cAAahwfnoHAAGo6AQAAAbKpMZ6kYLCtARaetRaepS6rc8AAahzAAGo+qQ+s5sAAak2AAMAwESIBYMAAaikGwABqk4E7nume+6AlAQDAAEgmAAAAAQOfBqAlAAAAAAAAAGDAAGopAT4BSp8MATUAAAABAGDAAGopARafEy7AAEf6wABqHMAAak4jHJ8fgADAMBHGQQEAASsAwAD10hefEy7AAEf6wABqHB+fJ8AAajoBAAABwABDTDGfRGCwrQUWn1wWn0wuq3PAAGocwABqPqkLrOIWn4AWn3Auq3PAAGocwABqPqkXrO4Wn6sWn5suq3PAAGocwABqPqkYrO8Wn9QWn8Quq3PAAGocwABqPqkZrPAWoAIWn/Iuq3PAAGocwABqPqkarPHAAGpOgADAMBHGAWDAAGopBsAAapSBO6BPoGGhXQEAqUQAAAABA6BzoV0AAAAAAAAAYMAAaikBPgFKoHkBNQAAAAEAYMAAaikBFqCALsAAR/vAAGocwABqTyMcoJOAAMAwEr5BAQABKwDAAPXSF6CALsAAR/vAAGocH6CbwABqOgIAAAKzYjGgtWCw1AEWoM0WoL0uq3PAAGocwABqPqlErRnAAENOMaD1YMAAaikBFqFGLsAASDPAAGqNwABqT4AAwDASvgFgwABqKQbAAGqVgTuhi6GdoqQBAKlFAAAAAQOhs6KkAAAAAAAAAGDAAGopAT4BSqG5ATUAAAABAGDAAGopARahwC7AAEf8wABqHMAAalAjHKHXgADAMBN5QQEAASsAwAD10hehwC7AAEf8wABqHB+h38AAajoCAAACs2IxoflgsNQBFqIRFqIBLqtzwABqHMAAaj6pRa0awABDTjGiPGDAAGopARaijS7AAEgzwABqjcAAalCAAMAwE3kBYMAAaikGwABqloE7os6i4KSQAQDAAEg5AAAAAQOi8qSQAAAAAAAAAGDAAGopAT4BSqL4ATUAAAABAGDAAGopARai/y7AAEf9wABqHMAAalEjHKMSgADAMBQ2QQEAASsAwAD10hei/y7AAEf9wABqHB+jGsAAajoCAAACs2IxozRgsNQCFqNMFqM8LqtzwABqHMAAaj6pY604FqN6FqNqLqtzwABqHMAAaj6o9KzMwABDTjGjomDAAGopAxyjqi7AAEg6wABqHAEAASfAAEg7AMAAaswco/ouwABIMMAAahwBAAEnwABIPADAAGrNHKRFLsAASC3AAGocAQABJ8AASD0AwABqzsAAalGAAMAwFDYBYMAAaikGwABql4E7pLukzaXqAQDAAEg+AAAAAQOk4KXqAAAAAAAAAGDAAGopAT4BSqTmATUAAAABAGDAAGopARak7S7AAEf+wABqHMAAalIjHKUBgADAMBVHQQEAASsAwAD10hek7S7AAEf+wABqHB+lCcAAajoBAAABsqkxpSxgsK0EFqVEFqU0LqtzwABqHMAAaj6pLK0BFqVsFqVcLqtzwABqHMAAaj6pLq0DFqWZFqWJLqtzwABqHMAAaj6pLa0CFqXHFqW3LqtzwABqHMAAaj6pL60EwABqUoAAwDAVRwFgwABqKQbAAGqYgTumFaYnpu4BAMAASD8AAAABA6Y6pu4AAAAAAAAAYMAAaikBSqZDATUAAAABAGDAAGopARamQy7AAEf/wABqHMAAalMjHKZXgADAMBYoQQEAASsAwAD10hemQy7AAEf/wABqHB+mX8AAajoCAAACsqkxpoJgsK0BFqacFqaMLqtzwABqHMAAaj6pJqz7wABDTjGmyWDAAGopARam0y7AAEg+wABql8AAalOAAMAwFigBYMAAaikGwABqmYE7pxinKqe4AQDAAEhAAAAAAQOnPKe4AAAAAAAAAGDAAGopAT4BSqdCATUAAAABAGDAAGopARanSS7AAEgAwABqHMAAalQjHKdcgADAMBblQQEAASsAwAD10henSS7AAEgAwABqHB+nZMAAajoBAAABs2Ixp4dgsNQBFqeYFqeILqtzwABqHMAAaj6pb61BwABqVIAAwDAW5QFgwABqKQbAAGqagTun3KfuqLcBAMAASEEAAAABA6f6qLcAAAAAAAAAYMAAaikBPgFKqAABNQAAAAEAYMAAaikBFqgHLsAASAHAAGocwABqVSMcqBSAAMAwF4lBAQABKwDAAPXS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AAAAAGDAAGopAUrAAEdEATUAAAABAGDAAGopARbAAEdELpqbwABqHMAAam8jHMAAR06AAMAwLOFBAQABKwDAAPXSF8AAR0QumpvAAGocH8AAR1bAAGo6AQAAAcAAQ0wxwABHc2CwrQIWwABH7RbAAEfdLqtzwABqHMAAaj6a/ayhFsAASBAWwABIAC6rc8AAahzAAGo+qO+sx8AAam+AAMAwLOEBYMAAaikGwABquoE7wABIU8AASGXAAEjsAQCpIwAAAAEDwABId8AASOwAAAAAAAAAYMAAaikBPgFKwABIfQE1AAAAAQBgwABqKQEWwABIhC6p0MAAahzAAGpwIxzAAEiXgADAMC20QQEAASsAwAD10hfAAEiELqnQwABqHB/AAEinwABqOgEAAAHAAENMMcAASMRgsK0BFsAASNUWwABIxS6rc8AAahzAAGo+qSOs+MAAanCAAMAwLbQBYMAAaikGwABqu4E7wABJGcAASSvAAEqXAQDAAEhdAAAAAQPAAElAwABKlwAAAAAAAABgwABqKQE+AUrAAElGATUAAAABAGDAAGopARbAAElNLsAASBnAAGocwABqcSMcwABJY4AAwDAucEEBAAErAMAA9dIXwABJTS7AAEgZwABqHB/AAElrwABqOgIAAALAAENLMcAASYVgsNQBFsAASZ0WwABJjS6rc8AAahzAAGo+qR+s9cAAQ0wxwABJzmCwrQQWwABJ5hbAAEnWLqtzwABqHMAAaj6pCazgFsAAShAWwABKAC6rc8AAahzAAGo+qRSs6xbAAEo/FsAASi8uq3PAAGocwABqPqkRrOgWwABKcxbAAEpjLqtzwABqHMAAaj6pE6zqwABqcYAAwDAucAFgwABqKQbAAGq8gTvAAEq/wABK0cAAS+wBAKjqAAAAAQPAAErhwABL7AAAAAAAAABgwABqKQE+AUrAAErnATUAAAABAGDAAGopARbAAEruLqmiwABqHMAAanIjHMAASv+AAMAwL59BAQABKwDAAPXSF8AASu4uqaLAAGocH8AASwfAAGo6AQAAAcAAQ0sxwABLIWCw1AQWwABLORbAAEspLqtzwABqHMAAaj6o66zDFsAAS2YWwABLVi6rc8AAahzAAGo+qOysxBbAAEuYFsAAS4guq3PAAGocwABqPqjtrMUWwABLxhbAAEu2LqtzwABqHMAAaj6o7qzGwABqcoAAwDAvnwFgwABqKQbAAGq9gTvAAEwUwABMJsAATUQBAKjvAAAAAQPAAEw2wABNRAAAAAAAAABgwABqKQFKwABMPwE1AAAAAQBgwABqKQEWwABMPy6pp8AAahzAAGpzIxzAAExQgADAMDCiQQEAASsAwAD10hfAAEw/LqmnwABqHB/AAExYwABqOgEAAAHAAENLMcAATHJgsNQEFsAATIwWwABMfC6rc8AAahzAAGo+qPCsyBbAAEy7FsAATKsuq3PAAGocwABqPqjxrMkWwABM7xbAAEzfLqtzwABqHMAAaj6o8qzKFsAATR8WwABNDy6rc8AAahzAAGo+qPOsy8AAanOAAMAwMKIBYMAAaikGwABqvoE7wABNacAATXvAAE32AQCpIgAAAAEDwABNiMAATfYAAAAAAAAAYMAAaikBPgFKwABNjgE1AAAAAQBgwABqKQEWwABNlS6pz8AAahzAAGp0IxzAAE2jgADAMDGnQQEAASsAwAD10hfAAE2VLqnPwABqHB/AAE2zwABqOgEAAAHAAENLMcAATc1gsNQBFsAATd4WwABNzi6rc8AAahzAAGo+qT+tFMAAanSAAMAwMacBYMAAaikGwABqv4E7wABOGsAATizAAE9pAQDAAEheAAAAAQPAAE44wABPaQAAAAAAAABgwABqKQE+AUrAAE4+ATUAAAABAGDAAGopARbAAE5FLsAASBrAAGocwABqdSMcwABOUoAAwDAyY0EBAAErAMAA9dIXwABORS7AAEgawABqHB/AAE5awABqOgEAAAHAAENLMcAATsdgsNQDFsAATuMWwABO0y6rc8AAahzAAGo+qSCs9hbAAE8WFsAATwYuq3PAAGocwABqPqlPrSQWwABPRBbAAE80LqtzwABqHMAAaj6pUa0mwABqdYAAwDAyYwFgwABqKQbAAGrAgTvAAE+UwABPpsAAUPEBAMAASF8AAAABA8AAT7nAAFDxAAAAAAAAAGDAAGopAT4BSsAAT78BNQAAAAEAYMAAaikBFsAAT8YuwABIG8AAahzAAGp2IxzAAE/agADAMDNVQQEAASsAwAD10hfAAE/GLsAASBvAAGocH8AAT+LAAGo6AQAAAcAAQ0sxwABQzWCw1AEWwABQ3hbAAFDOLqtzwABqHMAAaj6pQK0VwABqdoAAwDAzVQFgwABqKQbAAGrBgTvAAFEVwABRJ8AAUZkBAKk+AAAAAQPAAFEzwABRmQAAAAAAAABgwABqKQE+AUrAAFE5ATUAAAABAGDAAGopARbAAFFALsAASBzAAGocwABqdyMcwABRTYAAwDA0E0EBAAErAMAA9dIXwABRQC7AAEgcwABqHB/AAFFdwABqOgEAAAHAAENLMcAAUXdgsNQBFsAAUYgWwABReC6rc8AAahzAAGo+qT6tE8AAaneAAMAwNBMBYMAAaikGwABqwoE7wABRw8AAUdXAAFJgAQCqTwAAAAEDwABR58AAUmAAAAAAAAAAYMAAaikBPgFKwABR7QE1AAAAAQBgwABqKQEWwABR9C7AAEgdwABqHMAAangjHMAAUgeAAMAwNNFBAQABKwDAAPXSF8AAUfQuwABIHcAAahwfwABSD8AAajoBAAABwABDSzHAAFIyYLDUARbAAFJDFsAAUjMuq3PAAGocwABqPqk4rQ3AAGp4gADAMDTRAWDAAGopBsAAasOBO8AAUovAAFKdwABT1gEAwABIYAAAAAEDwABSsMAAU9YAAAAAAAAAYMAAaikBPgFKwABStgE1AAAAAQBgwABqKQEWwABSvS7AAEgewABqHMAAankjHMAAUtGAAMAwNZFBAQABKwDAAPXSF8AAUr0uwABIHsAAahwfwABS2cAAajoDAAADwABDTDHAAFL2YLCtARbAAFMOFsAAUv4uq3PAAGocwABqPpr9rKHAAENLMcAAUytgsNQCFsAAU0MWwABTMy6rc8AAahzAAGo+qU+tJBbAAFNtFsAAU10uq3PAAGocwABqPqlQrSXAAENOMcAAU5VgwABqKQIWwABTnS6pVMAAaoIWwABTuy6pUsAAaoPAAGp5gADAMDWRAWDAAGopBsAAasSBO8AAU/7AAFQQwABVHQEAwABIYQAAAAEDwABUIMAAVR0AAAAAAAAAYMAAaikBPgFKwABUJgE1AAAAAQBgwABqKQEWwABULS7AAEgfwABqHMAAanojHMAAVD6AAMAwNrdBAQABKwDAAPXSF8AAVC0uwABIH8AAahwfwABUTsAAajoCAAACwABDSzHAAFRoYLDUARbAAFR5FsAAVGkuq3PAAGocwABqPqlfrTTAAENMMcAAVPtgsK0BFsAAVQwWwABU/C6rc8AAahzAAGo+myGsmsAAanqAAMAwNrcBYMAAaikGwABqxYE7wABVScAAVVvAAFZXAQDAAEhiAAAAAQPAAFVvwABWVwAAAAAAAABgwABqKQE+AUrAAFV1ATUAAAABAGDAAGopARbAAFV8LsAASCDAAGocwABqeyMcwABVkYAAwDA3nUEBAAErAMAA9dIXwABVfC7AAEggwABqHB/AAFWZwABqOgIAAAKzYjHAAFWzYLDUAhbAAFXLFsAAVbsuq3PAAGocwABqPqljrTgWwABV+RbAAFXpLqtzwABqHMAAaj6pZK05s2ExwABWLWC+vwEawABWP6xVwABqe4AAwDA3nQFgwABqKQbAAGrGgTvAAFbTwABW5cAAV9kBAKiNAAAAAQPAAFbxwABX2QAAAAAAAABgwABqKQE+AUrAAFb3ATUAAAABAGDAAGopARbAAFb+LsAASCHAAGocwABqfCMcwABXC4AAwDA4hEEBAAErAMAA9dIXwABW/i7AAEghwABqHB/AAFcTwABqOgEAAAHAAENLMcAAVy1gsNQCFsAAV5AWwABXgC6rc8AAahzAAGo+qTutEBbAAFe6FsAAV6ouq3PAAGocwABqPqk8rRHAAGp8gADAMDiEAWDAAGopBsAAaseBO8AAWDnAAFhLwABYygEAwABIYwAAAAEDwABYWcAAWMoAAAAAAAAAYMAAaikBPgFKwABYXwE1AAAAAQBgwABqKQEWwABYZi7AAEgiwABqHMAAan0jHMAAWHWAAMAwOV1BAQABKwDAAPXSF8AAWGYuwABIIsAAahwfwABYhcAAajoBAAABwABDTDHAAFiiYLCtARbAAFizFsAAWKMuq3PAAGocwABqPqkjrPjAAGp9gADAMDldAWDAAGopBsAAasiBO8AAWUvAAFldwABZ1wEAwABIZAAAAAEDwABZa8AAWdcAAAAAAAAAYMAAaikBPgFKwABZcQE1AAAAAQBgwABqKQEWwABZeC7AAEgjwABqHMAAan4jHMAAWYeAAMAwOh1BAQABKwDAAPXSF8AAWXguwABII8AAahwfwABZl8AAajoBAAABwABDTDHAAFm0YLCtARbAAFnFFsAAWbUuq3PAAGocwABqPqkirPfAAGp+gADAMDodAWDAAGopBsAAasmBO8AAWjvAAFpNwABbTAEAwABIZQAAAAEDwABaYMAAW0wAAAAAAAAAYMAAaikBPgFKwABaZgE1AAAA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AADAAEidYMAA8rMBKU6kXKRjAACgamDAAPZdASOCpGXAME6yJ8AASJ4nwABEsAFgwAD2XUmkjiIcpJqFpJLAME/XQQEAARakrIGkncAwTqapCqzhAMAA9dIBHKTNhaTFwDBP10EBAAEWpN+BpNDAME6mmyGsmgDAAPXSPgJJpPSDpPjAME7CSqUJASs/SqUcASSlMgIng7CHpSvAMFAGP0mlPyIcpUuFpUPAME/XQQEAARalXYGlTsAwTqapDqzlAMAA9dIBHKV+haV2wDBP10EBAAEWpZCBpYHAME6mmuysmQDAAPXSPgJJpaWDpanAME7CSqW6ASs/SqXNASSl4wInmoWHpdzAMFAGP0ml8CIcpfyFpfTAME/XQQEAARamDoGl/8AwTqapDKzjAMAA9dIBHKYvhaYnwDBP10EBAAEWpkGBpjLAME6mmwyslwDAAPXSPgJJplODplfAME7CSqZoASs/SqZ7ASSmjgInmoSHpofAMFAGP0mmmyIcpqeFpp/AME/XQQEAARamuYGmqsAwTqapEKznAMAA9dIBHKbYhabQwDBP10EBAAEWpuqBptvAME6mmuGslgDAAPXSPgJJpv2DpwHAME7CSqcSASs/SqclASSnOQInmoKHpzLAMFAGP0mnRiIiIiIcp1KFp0rAME/XQQEAARanZIGnVcAwTqapDazkAMAA9dIBHKeChad6wDBP10EBAAEWp5SBp4XAME6mmvSsmADAAPXSARynsIWnqMAwT9dBAQABFqfCgaezwDBOpqkcrPMAwAD10gEcp+OFp9vAME/XQQEAARan9YGn5sAwTqapHaz0AMAA9dIBHKgWhagOwDBP10EBAAEWqCiBqBnAME6mqRus8gDAAPXSPgJJqESDqEjAME7CSqhZASs/SqhsASSofwInmoOHqHjAMFAGP0mojByon4GokMAwTqao4AEAAYWoucAwT9cArUw+AUqoywEjhqjSwDBP9CSpFwInwABIn4epBcAwUAYkqTUCJ8AASKCHqS7AMFAGAWDAAPZdP0mpQhypVYGpRsAwTqao4QEAAYWpa8AwT9cArU0+AUqpfQEjhqmEwDBP9CSprQInwABIoYeppcAwUAYkqcMCJ8AASKKHqbzAMFAGAWDAAPZdP0mp0CIiHKndhanVwDBP10EBAAEWqe+BqeDAME6mmv2soQDAAPXSARyq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AEM3AQABg4m9wDCEZQDAAGJIRonRif+J3gAAAMAAQ09gwACQeQAWifWAienAMIQSwABDUMAAdc4+AUFHigeDig/AMITLGAGKLxqKL8AAkH8APgI9HIplgopXwDCESiABAAEWim8WimYuwABIp8AAa3LAAGt5wABILMAAaokAAEKKlgABirIairLAAJCAAD4CPRyK0oKKxMAwhEogAQABForcForTLsAASKfAAGtywABrecAASELAAGqbAABCiv0AAYsZGosZwACQgQA+Aj0ci0aCizjAMIRKIAEAARaLUBaLRy7AAEinwABrcsAAa3nAAEhDwABqnAAAQotuAAGLihqLisAAkIIAPgI9HIupgoubwDCESiABAAEWi7MWi6ouwABIp8AAa3LAAGt5wABIKMAAaoUAAEKLyQABi+Uai+XAAJCDAD4CPRyMC4KL/cAwhEogAQABFowVFowMLsAASKfAAGtywABrecAASETAAGqdAABCjCwAAYxIGoxIwACQhAA+Aj0cjGyCjF7AMIRKIAEAARaMdhaMbS7AAEinwABrcsAAa3nAAEgqwABqhwAAQoyQAAGMrBqMrMAAkIUAPgI9HIzVgozHwDCESiABAAEWjN8WjNYuwABIp8AAa3LAAGt5wABITsAAaqUAAEKM+gABjRYajRbAAJCGAD4CSY00Fo1BFo04LqxVwABrcsAAa3aCVYElPgE9HI3Qgo3CwDCESiABAAEWjdoWjdEuwABIp8AAa3LAAGt5qUTAAGqUAAA/Qo4EAAGOIBqOIMAAkIcAPgI9HI5Mgo4+wDCESiABAAEWjlYWjk0uwABIp8AAa3LAAGt5qWLAAGqKAABCjnMAAo6PGo6PwACQiI6/Go6/wACQigA+Az0cjvCBjuTAMIQns2sBAAEejxPAAF3DAQABFo85Fo8pLqtzwABrcsAAa3iVC6y8AADAAEBLPRyPXYKPT8AwhEogAQABFo9nFo9eLsAASKfAAGtywABrecAASEnAAGqgAABCj38AAY+bGo+bwACQiQA+Aj0cj7+Cj7HAMIRKIAEAARaPyRaPwC7AAEinwABrcsAAa3nAAEhPwABqpwAAQo/fAAGP+xqP+8AAkIwAPgI9HJApgpAbwDCESiABAAEWkDMWkCouwABIp8AAa3LAAGt5wABIUMAAaqkAAEKQUQABkG0akG3AAJCNAD4C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SOknVATAAGudgUGdt7OjBsAASOoAXcAA9R0BYMAA9l0BOp3PYMAA9l2BESfAAEjrJ8AASOwnwABI7SfAAEjpJ8AASO4nwABI7yeWJiekiyfAAEjwJ8AASPEnwABI8ifAAEjzJ5qAJ5qMJ8AASPQnmoYnwABI9SfAAEj2J8AASPcnwABI+CeRyCfAAEj5J8AASPonwABI+yfAAEj8J8AASP0nwABI/ifAAEKiJ1QnvVgntn8nwABI/yfAAEkAJ8AASQEnk9MnwABJAifAAEkDJ8AASQQnwABJBSfAAEkGJ8AASQcnwABJCCe0uCfAAEkJJ8AASQonwABJCyfAAEkMJ8AASQ0nWieEvifAAEkOJ8AASQ8nwABJECfAAEkRJ8AASRInwABJEyeAsCfAAEkUJ8AASRUnwABJFifAAEkXJ8AASRgnwABJGSeSUSfAAEkaJ8AASRsnwABGqCfAAEkcJ8AASR0nwABJHifAAEkfJ5jzJ8AASSAnwABJISewnifAAEkiJ8AASSMno3knwABJJCfAAEklJ8AASSYnwABJJyfAAEkoJ8AASSknwABJKifAAEkrJ8AASSwnwABJLSeCDyfAAEkuJ8AASS8nwABJMCerASfAAEkxJ71YJ8AASTInwABJMyfAAEk0J8AASTUnwABJNifAAEk3J8AASTgnwABJOSfAAEk6J8AASTsnwABJPCfAAEk9J8AAST4noCknwABJPyfAAElAJ8AASUEnwABJQifAAElDJ8AASUQnwABJRSfAAElGJ8AASUcnvzonwABJSCfAAElJJ8AASUonwABJSyfAAElMJ8AASU0nwABJTifAAElPJ8AASVAnwABJUSfAAElSJ59tJ8AASVMnwABJVCfAAElVJ8AASVYnwABJVyfAAElYJ8AASVknwABJWifAAElbJ8AASVwnwABJXSfAAEleJ8AASV8nwABJYCfAAElhJ8AASWInwABJYyfAAElkJ8AASWUnwABJZifAAElnJ8AASWgnwABJaSfAAElqJ8AASWsnwABJbCfAAEltJ8AASW4nwABJbyfAAElwJ8AASXEnwABJcifAAElzJ8AASXQnwABJdSfAAEl2J8AASXcnwABJeCfAAEl5J8AASXonmWwnmYgnwABJeyfAAEl8J8AASX0nwABJfifAAEl/J8AASYAnwABJgSfAAEmCJ8AASYMn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Hi7AAEoMwABrz4O8AQABNMAASjIDwABKMsAASnkAAAACAgLAAEozAAAAnttgsJkAwABKOwAAAMAASjBgwACKoQAAYMAA9YIBPgE9HMAASksuwABKL8AAa5gDAAOAwABKWcAwvL2CwABKXsAwvSQWwABKbYHAAEpmwDC9F4CwsJsAwABsBQDAAPVtPRzAAEqWFsAASoAuwABKDcAAa9CDvAEAATTAAEqeA8AASp7AAErlAAAAAgICwABKnwAAAJ7bYLCZAMAASqcAAADAAEowYMAAiqEAAGDAAPWCAT4BPRzAAEq3LsAASi/AAGuYAwADgMAASsXAMLy9gsAASsrAML24FsAAStmBwABK0sAwvauAsLCbAMAAbAUAwAD1bT0cwABK/BbAAErsLsAASg7AAGvRg7wBAAE0wABLBAPAAEsEwABLQgAAAAICAsAASwUAAACAsGDAAPZdAMAASwsAAADAAEowYMAAiqEAAGDAAPWCAT4BPRzAAEsbLsAASi/AAGuYAwADgMAASynAMLy9gsAASy7AML5OgcAASzbAML4/AMAAbAUAwAD1bUrAAEtJAYDAAEtQwDC8vQbAAGwggUHAAE3gwABN9MAAT/8AAMAASjUAAAABA8AAThHAAE//AAAAAAAAAF3AAPVOAmDAAPZdYMAA9l0BPgVOwABOHsAATiIAAICfXcAA9U4CYMAA9l1gwAD2XQEywABONGDAAPZdYMAA9l0APRzAAE5UFsAATjwuwABKEsAAa9WDvAEAATTAAE5cA8AATlzAAE6jAAAAAgICwABOXQAAAJ7bYLC/AMAATmUAAADAAEowYMAAiqEAAGDAAPWCAT4BPRzAAE51LsAASi/AAGuYAwADgMAAToPAML7vgsAATojAML9WFsAATpeBwABOkMAwv0mAsLCbAMAAbAUAwAD1bT0cwABOvhbAAE6qLsAAShDAAGvTg7wBAAE0wABOxgPAAE7GwABPLQAAAAICAsAATscAAACAsGDAAPZdAMAATs0AAADAAEowYMAAiqEAAGDAAPWCAT4BPRzAAE7dLsAASi/AAGuYAwADgMAATuvAML7vgsAATvDAML/sNQAAAAEAYMAA9l0BHMAATxcWwABO+C7AAEoRwABr1EQBAAGBwABPGMAwv90AwAD1YiMcwABPHoMAwDDAK0EBAAErAACBwABPIcAwv92D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WoFBwAEU38ABFOXAAS+HA8AASsgAAAFgwAD1xQABXcAAVqkCW1sLBMAAbFyBQcABFTPAARVpBZxJAGDAAPXvAR7AARVEwAD2BgEAASfAAEoIAATAAGxdgUHAARV6wAEViwbAAErJAGDAAPR5ATcFBMAAbF6BQcABFZzAARWxBsAASsoAYMAA9HkBNx4EwABsX4FBwAEVwsABFdgGwABKywBgwAD0eQGWBMAAbGCBQcABFffAARYBCa8cAGDAAGPGAATAAGxhgUHAARYfwAEWMgmf2QBgvvgABMAAbGKBQcABFlTAARZaCcAASswAYMAAbIIABMAAbGOBQcABFmbAARZxGIT0AGDAAPZdASsEwABsZIFBwAEWnsABFqwYwABKzQBgwADyswEqBMAAbGWBQcABFuXAARb7GMAASs4AXcAA9R0BYMAA9l0BMcABFvlgwAD2XQAEwABsZoFBwAEXA8ABFw0YWgBgwAD0eQGTAQXAAGyBgUHAARcSwAEXEsABF18AAAADwAEXJ8ABF18AAAADAwPAARctAAAErxxgwABjxgDAARc+AAAEn9lgvvgAwAEXWAAABMAASsxgwABsggAAYMAAbFoBPwQIAcAAbGCAAMAxK4QIAcAAbGGBAMAxK5MIAcAAbGKCAMAxK6AJAcABFxLAAPXbAAAAABcGwABsaIFBwAEXZMABF2vAARhvAACYjwAAAAEDwAEXcsABGG8AAAABAQHAAReBAAAAhB9gwABWvQAAYMAA9l0BPgU9HMABF5EuwABKz8AAa5gBAAGAwAEXmMAxLBcAwABsb0nAARenHMABF7AWwAEXqy6E9MAAbGNBAQABKwDAAPZsSsABF7kBJ8AAStA/ScABF9AWwAEX1C7AAErNwABsZErAARfcASTAARgYAxbAARfmLoT0wABsYyeAqBzAARfuLsAAStECAAKAwAEX+cAxLBcawAEYA8AAbF8AwABsaT9JwAEYHhzAARgzFsABGCwWwAEYIi7AAErOwABsZVrAAPVMQQEAAZQAwAD1nErAARg5ASTAARhLAifAAErSFsABGEUuhPTAAGxjP0rAARhRARzAARhiFsABGFguwABKzsAAbGVRAQABJ4CoAMAA9O8GwABsaYFBwAEYdMABGHvAARjbAADAAErRAAAAAQPAARiFwAEY2wAAAAICAsABGJQAAACEH2DA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wAD1qT4BPRfAASIaLsAASs0pwABsZD4BQUXAASI8AcABIkXAASJHAABbYMAA9HkBkwEcwAEiToPAASJMwDE4H1wBAAGCwAEiUMAxN34AwAD1pgGLwAEiWMAxOB8cwAEiWYPAASJYwDE4H10BAAGUAMAA9Z4+Aj0cwAEiZy7AAErPwABrmAEAARzAASJ+FsABIneAwAEibsAxN0eVjcAAV6BEAQABg8ABIn/AMTgfAMAA9SwAwABsb0nAASKMFsABIpAuwABKzcAAbGRCwAEimAA/BsAAbHmBQcABIrTAASLFwAEjqwAAtBkBGsABIrXAAO5LAAABA8ABIs3AASOrAAAAAgECwAEi3wAACIQfYMAAV64AwAEi6gAAKICoWwErAFwBPgI9HMABIy4uwABK1wEAASebAgDAAGxrScABI0IcwAEjVhbAASNPgMABI0bAMTkFWsAAV7RBAQABkwDAAPWcPgE9HMABI2QuTwEAASeVNADAAGxsPgE9HMABI4UuTwEAARzAASOJLsAAStECAAKAwAEjlMAxOQU3BQDAAGxpAMAAbGwGwABseoFBwAEjsMABI8HAASVQAAC0HAEawAEjscAA7ksAAAEDwAEjycABJVAAAAACAQLAASP6AAAIhB9gwABWeQDAASQFAAAogKhbASsAXAE+Aj0cwAEkSS7AAErXAQABJ5qIAMAAbGtJwAEkXRzAASRxFsABJGqAwAEkYcAxOdlawABXx0EBAAGTAMAA9Zw+AT0cwAEkfy5PAQABJ5U0AMAAbGw+AT0cwAElCC5PAQABHMABJSwcwAElDC7AAErRAgACFsABJSCAwAElF8AxOdm+mMAAVoWVAMAAbGldAQABHMABJS4uwABK0QIAAoDAASU5wDE52ZYAwABsaQDAAPZyAMAAbGwGwABse4FBwAElVcABJWbAASluAAC0IgEawAElVsAA7ksAAAEDwAEldsABKW4AAAACAQLAASWQAAAIhB9gwABX8wDAASWbAAAogKhbASsAXAE+BT0cwAElpS7AAErXAQABFsABJcMWwAEluxbAASW2gMABJa3AMTrhghfAAFeGkw3AAFhfgLCwmwDAAGxrTsABJjHAASY6AAG0MF3AAPVOAmCw0WDAAFa9ARbAASZFgMABJjzAMTrhlDrAAFf1TsABJlXAASZaAACX/2DAAPR5ARbAASZl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pI9cAQABNxoAwAD1pkqomQEcqKMaqKCJ910BAAGAqKXAMaSPAMAA9Z4/SaisHKiygKiwwDGkj1wBAAE3NADAAPWmSqi4ARyoxhyowhqov4nXXQEAAYCoxMAxpI8AwAD1noFBAQABNxoAwAD1nz9KqNABHKjeHKjaGqjXicZdAQABgKjcwDGkjwDAAPWegUEBAAE3NADAAPWfBsAAbXGBRKjrqQKp6gAAwABKcQEaqOzAAO5LAAABA6kbqeoAAAABAQGpKAAAAJMNYLDRAABgwACKoQE+A06pQqlLAADAAEsLYMAAiqEBHKlNLsAASvbAAGuYAQABgKlwwDGlvgDAAGzISal+IRypi4GpgsAxpdNBAQABKwDAAPXSPgFKqZwBgamjwDGl0z9KqbcBHanEwABKcQEAAYCp3sAxpb4AwABsNwAAMZS8ADGU9QAxlSwAMZVhADGVmAAxlc8AMZYGADGWPQAxlnQAMZarADGW4gAxmC0AMZqzADGcTgAxn40AMaAjADGhwwAxo4EAMaRpADGllQAxpj4AAAAUAsAAbXSBRKwJrA+06APAAEuqAAABYMAA9cUAAAIEwABtd4FErDmsRAnAAEurwABrmABgwAD0eQAEwABteIFErGascwnAAEuswABrmABdwAD1HQFgsOwAAwXAAG2CgUSssKywrWQAwABLAAADrNWtZAAAAAICAqzpAAAAmTxgsK0ArQEAAAB+YK7vAABgwABtdAE/AwgAwABtd5MIAMAAbXgerT/AAG2AAgACgK1TwDGnDYGtWMAxpxgACQGssMAA9dsAAAAABcAAbYOBRK1prWmuegDAAEsFAAOtja56AAAAAwMDrZoAAACZPGCwrQCtwQAAAMAASv5gwABtdACt4AAAAH5gru8AAGDAAG10AT8DCADAAG13HK4aFq4Oga4DwDGnhsAAS6vAAGuYwABtd10BAAEWrieBrhzAMaeGwABLrcAAbXoAwAD1nggAwABteB6uVcAAbYACAAKArmnAMad7gq5uwDGnlQAJAa1pwAD12wAAAAAFwABthIFErwKvAq/iAMAAS64AA68xr+IAAAACAgKvRQAAAJk8YLCtAK9mAAAAwABK/mDAAG10AABgwABtdAE/AwgAwABtdxyvnxavk4GviMAxqDbAAEurwABrmMAAbXddAQABFq+sga+hwDGoNsAAS63A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YIwOAABgtdABPgFKtuABHLbnLsAATBjAAG6kAQABJrb2AYC29sAyPCFgjBUAwABuvwbAAG7dgUm3BLcit14AAK6PARq3BcAA7ksAAAEDtyq3XgAAAAEBAbczAAAAg7JgjA4AAGC10AE+AUq3PwEct0YuwABMGMAAbqQBAAEmt1UBgLdVwDI8gGCMFQDAAG6/BsAAbt6BSbdjt4G3vgAAro0BGrdkwADuSwAAAQO3ire+AAAAAQEBt5MAAACDsmCMDgAAYLXQAT4BSrefARy3pi7AAEwYwABupAEAASa3tQGAt7XAMjzfYIwVAMAAbr8GwABu34FJt8O34bgSAACujAEat8TAAO5LAAABA7f0uBIAAAABAQG4AgAACJMNYLC/AABgtdABSrgOASsGwABu4IFJuBe4NbiAAACuiwEauBjAAO5LAAABA7hAuIAAAAABAQG4SQAAAIOyYIwOAABgtdABPgFKuFUBHLhcLsAATBnAAG6kAgACFrhuLsAATAnAAG6kwABusya4dwGAuHfAMj16YIwVAMAAbroGwABu4YFJuIW4o7jiAACuigEauIbAAO5LAAABA7iuuOIAAAABAQG4twAAAIOyYIwOAABgtdABPgFKuMMBHLjKLsAATBjAAG6kAQABJrjZAYC42cAyPelgjBUAwABuvwbAAG7igUm457kFuUkAAK6rARq46MAA7ksAAAEDuRW5SQAAAAEBAbkeAAAAg7JgjA4AAGC10AE+AUq5KgEcuTEuwABMGMAAbqQBAAEmuUABgLlAwDI+SGCMFQDAAG6/BsAAbuOBSblOuWy5jgAArokBGrlPwADuSwAAAQO5eLmOAAAAAQEBuYEAAACDsmCMDgAAYLXQAUq5igErBsAAbuSBSbmTubG6AQAArocBGrmUwADuSwAAAQO5wboBAAAAAQEBuc8AAAiSW2CwvwAAYLXQAT4BSrndARy55C7AAEwZwABupAEAAYC59sAyPuMAwABuugbAAG7lgUm6Broku3UAAK6IARq6B8AA7ksAAAEDui27dQAAAAICArpEAAAIkk9gsNQAulwAAACsJWDAAFT9AABgtdABPgROuoK6jQAAwABF+mDAAHL7ARy6mxa6jy6vksAAbqTAAG6ywABF+wEAAYC6r8AyPzsAwABytk66xbrKAACAsGDAAPZdAR66zMAAbqYDAAMWuvsu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8sAyb14bAEEBAAErAMAA9dI9HMAASAuHwABIAsAyYe0gAQABFMAASAzAMm9eGwAAAD8GwABvbIFLwABIHMAASC/AAE/fAAHAAEyCAAAAAQPAAEg9wABP3wAAAAMDA8AASEoAAACgUWEBYMAA9l1cAMAASG4AAACxm2DAAPZdAMAASH4AAADAAExrYMAA9l0AAGDAAG5PAT4GScAASI0iHMAASJmBwABIkcAycVRBAQABKwDAAPZsABzAAEisgsAASKTAMnFjQQEAASsAwAD2bErAAEi1ASs/ScAASMciHMAASNOBwABIy8AycVRBAQABKwDAAPZsARzAAEjmgsAASN7AMnFjQQEAASsAwAD2bD4CPRzAAEkCgMAASPfAMnFCIAEAASfAAEyDAABKwABJOgErP07AAElewABJagAAq7xgwABuTwEfwABJcMAAbokAAAAAScAASYMcwABJj4HAAEmHwDJxVEEBAAEnhFEAwAD2bD4BPRzAAEmug8AASaLAMnIYsXoAAAAAwABuaknAAEnQHMAASdyBwABJ1MAycVRBAQABJ5yuAMAA9mw+AD4DTsAASiTAAEoxAADAAEyEXcAA9R0BYMAA9l0BHMAASjuBwABKM8AycVSAmgEAASeAmwDAAPaAScAASk0WwABKXoTAAEpRwDJylYD8wAD0/z4BPRzAAEp8gMAASnHAMnFCIAEAASfAAEyFAAA/RsAASqnAAErNwABKtQAAAMAATIZgwAD2XQCEwABKv8AycpU+AUFHwABK14XAAErfwDJzCQQBwABK+CfAAEyHAD4CPRzAAEscg8AASxDAMnIYwABL9wAAAADAAG53QsAASz0AAcAAS1MnwABMiAA+Aj0cwABLeoPAAEtuwDJyGMAAS/sAAAAAwABufULAAEumAAHAAEu8J8AATIkAPgI9HMAAS+GDwABL1cAychjAAEvzAAAAAMAAbnFCwABMCwAAAT4BPRzAAEw8gMAATDHAMnFCIAEAASTAAExoAyfAAEyKhcAATF/AMnMJJ4DyAABJwABMiBzAAEyUgsAATIzAMnFjQQEAASeEUQDAAPZsPgE9HMAATLODwABMp8AychixewAAAADAAG5sScAATNYcwABM4oLAAEzawDJxY0EBAAEnnK4AwAD2bD4APgNOwABNKsAATTwAAMAATItdwAD1HQFgwAD2XQEc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1rvAALsfAAFgsPgAAEnAANbGIRzAANbXgcAA1srAMxxdQQEAASsAwAD10j4EQCEcwADXAoLAANbvwDMca0EBAAErALEHwADW78AA1wkAT8AA1xPAANcYAAABwABND14AAQMBYJICArKrYMAA8rO11WDAAPKzAFwAA8AA1yfAANiBAAAAAwEBwADXPwAAAIOyYJICAALAANdmAAAAsqtgwADyswErwADXVQAAALXVYMAA8rMBK1wBPgNOwADXgcAA14cAAJ2PYLD4ARzAANeTFsAA14kuwABGHsAAb/nAAE0QAQABFMAA16TAMx2vCAAAwABy2UnAANezFMAA17fAMx29CQA+Aj0cwADX3oXAANfNwDMc608BAAEUwADX4sAzHa8IAADAAPUuPRzAANgGhsAA1/PAMx0NTwEAARTAANgKwDMd4gsAAMAA9hs/PRzAANgwhMAA2CTAMxzDgLICAAIUwADYMcAzHeILABzAANhYFsAA2EYuwABM2sAAb4jAAG/+r64BAAEUwADYc8AzHeILAADAAHLQAMAA9WM9HsAA2IrAAHKWAwADgcAA2LvAMxxdgsAA2MnAMxxrh8AA2N3AMx17AD0XwADY9i7AAEzTwABviBzAANkQFsAA2QQur5LAAG+IwABv5cAATNwBAAEWwADZKYHAANkcwDMcXZTcjkEAwABynsAAb+k/TsAA2U3AANlTAACZbmC5LQEcwADZWxbAANlVLp7VwACZbLBlAAAAALiZPRzAANqbLqApAQABFsAA2qYWwADaoC6e1cAAmWyEuriLAMAAmZk9HMAA2tgcwADasi6CDwEAAR/AANq8u/EBAAEWwADawi6phsAAmX4AAMAAmZqwtwEAAYfAANrlwDMfNgC5VD0cwADa8S6gKQEAAYfAANr2wDMfNgDAAJmZPRzAANsRFsAA2wMuwABMqsAAmW6vUwcABhbAANsoLsAATMHAAG/eHMAA21EWwADbPy6zhsAAb+3AAEWHAQABFsAA214uwABMwcAAb94AwAB5kxzAANuIFsAA23Yus4bAAG/twABNEwEAARbAANuZLsAATMHAAG/eAMAAeZaEwADbscAzHMOGwADbx8AzHQ0cwADb/RbAANvjLsAATNnAAG+IwABv/66HAQABFsAA3A4uwABMwcAAb94Ate0BwABNWCXAANxRFsAA3EMuwABM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JD0cwAEivBbAASK3gMABIrLAM0VhkkyRipQOAQABLgCRFU/AASLVwAEi2gAAAcAATWlhAFwAA8ABIuXAASLpAAAAAAAAAFwBPgBOwAEjV8ABI2IAAMAATX1gwABxIwEfwAEjaMAAcUACAAIuHMABI6gWwAEjji7AAEzZwABviMAAb/+ujQEAAYDAASOywDNFYQC18wA9HMABI+YWwAEj2i7AAEzPwABv8sAATWwIAAiAwAEj+sAzRWEcwAEkGhbAASQILrOGwABv7cAATW0BAAGAwAEkL8AzRWEAwAB5lRzAASRIFsABJD4uwABGHsAAb/nAAE16AQABgMABJF7AM0VhAMAAcuUUwAEkbcAzSC4IABTAASSHwDNIVgkAFMABJJ/AM0sDCwAUwAEktMAzSakKABzAASThFsABJMcuwABM2cAAb4jAAG//ro0BAAGAwAEk68AzRWEAtfMAwACaQ0/AAST4wAEk/QAAAcAATX5hAFwAA8ABJQ7AASZyAAAAAAAAAFwBPgI9HMABJRkuwABNe8AAb4gGAAaAwAElO8AzRWErGsABJWWsUTHAASV3YLlkAYHAASV4wDNFdDrAASWTYMAAWDYAHMABJhoWwAElsS7AAEzZwABviMAAb/+uiQEAAYDAASYnwDNFYQC17wDAAHAzPRzAASY1Lk8BAAEfwAEmPbzCAgACHMABJkQursIAAAAAwACZlBbAASZfFsABJksuqYbAAJl+nS6x5gAAwACZnz01wAEmeQAAAQBgwABxIwEUwAEmecAzSycMADUAAAABAFsBHMABJowUwAEmisAzTRMOAMAATX8AAAAAwABxPDUAAAABAFsBHMABJqMUwAEmocAzTRMOAMAATYABAAEUwAEmtcAzTEENAADAAHE7NQAAAAEAWwEcwAEm0BTAASbOwDNNEw4AwABNgQAAAADAAHE+FADAM00TDgAGwABwaYFMwAEm4sABJvvAASsrAADAAEy/ARrAASbjwADuSwAAAQPAAScRwAErKwAAAAMDA8ABJx8AAADAAEy+YLlkAMABJzwAAADAAEy9YLlkAMABJ1kAAACgYWC10AAAYLlkAT4FTsABJ7jAASfJAADAAE2CYLDUARbAASfbFsABJ8suq3PAAG+IwABv/KlPrSQ9HMABKD8uwABNVMAAb4gFAASDwAEoVcAzThMxwAEodWC5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wAGhChbAAaEELp7VwACZbLBuAgACFsABoSiAwAGhI8AzlIeAipA8FsABoS8un+HAAG/gALieAMAA9S4GwABwe4FMwAGhRcABoVbAAaHFAACVeQEawAGhRsAA7ksAAAEDwAGhaMABocUAAAABAQHAAaF6AAAAg7JgkEMAAFwBPgE9HMABoYwWwAGhhi62xsAAmW9PAQABHMABoZYWwAGhkC6e1cAAmWywbwIAAhbAAaGtgMABoajAM5UegIqQRRbAAaG0Lp/hwABv4AC4nwDAAPUuBsAAcHyBTMABocrAAaHbwAGiRAAAlXsBGsABocvAAO5LAAABA8ABoevAAaJEAAAAAQEBwAGh+wAAAIOyYJBMAABcAT4BPRzAAaINFsABogcutsbAAJlvTwEAARzAAaIXFsABohEuntXAAJlssHICAAIWwAGiLIDAAaInwDOVtYCKkE4WwAGiMy6f4cAAb+AAuKIAwAD1LgbAAHB9gUzAAaJJwAGiWsABoskAAJV0ARrAAaJKwADuSwAAAQPAAaJswAGiyQAAAAEBAcABon4AAACDsmCQMQAAXAE+AT0cwAGikBbAAaKKLrbGwACZb08BAAEcwAGimhbAAaKULp7VwACZbLBwAgACFsABorGAwAGirMAzlkyAipAzFsABorgun+HAAG/gALigAMAA9S4GwABwfoFMwAGizsABot/AAaOYAACVfwEawAGiz8AA7ksAAAEDwAGi8cABo5gAAAABAQHAAaMDAAAAg7JgkF4AAFwBPgI9HMABoxUWwAGjDy62xsAAmW9PAQABHMABoygWwAGjIi6e1cAAmWyq3AIAAhzAAaNAFsABozQur5LAAG+IwABv5cAAQlsBAAGAwAGjUcAzluMAwAByshbAAaNYLp/hwABv4AC4mwDAAPUuPTUAAAABAGDAAGdsARbAAaNrLq8ywABv7CMcwAGjdYEAwDOXYUEBAAErAAArHMABo3WBAMAzl2HAAEY7AQABFsABo46AwAGjicAzluOAipBgAMAAZ30BXAbAAHB/gUzAAaOdwAGjrsABpAsAAJV8ARrAAaOewADuSwAAAQPAAaO+wAGkCwAAAAEBAcABo84AAACDsmCQVQAAXAE+AT0cwAGj4BbAAaPaLrbGwACZb08BAAEcwAGj6hbAAaPkLp7VwACZbLBzAQABFsABo/oun+HAAG/g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swEiFsACj6qHwAKPocA0LyqEQL7PABzAAo/EFsACj7+HwAKPtsA0LyqAsL7NQQEAASdaAMAA9mxJwAKP1yIUwAKP28A0L04JAAEWwAKP8IfAAo/nwDQvKq5mvtM+AUrAApADARzAApAlFsACkBYWwAKQCi6f4cAAb+Cl2cAAQIeZ0wIAAhbAApBGFMACkD7ANC83CACSabDNFsACkGUWwAKQVi6qtcAAmYGpFazsAMAAZbxJwAKQhRbAApCSh8ACkInANC8qrmK+1D4BSsACkKgBHMACkMoWwAKQuxbAApCvLp/hwABv4KXZwABAh5nTAgACFsACkOsUwAKQ48A0LzcIAJJpsM0WwAKRChbAApD7Lqq1wACZgakWrO0AwABlvD4BSsACkTsBKk/AApFcwAKRYQAAAcAATmJhAmC+v2Cwv2DAAPKzAAPAApF3wAKT6wAAAAICAsACkYEAAACf7GC+vwDAApGYAAAAkw1gsL8AAGDAAPKzAT4JTsACkbXAApG5AACZPGCwrQEWwAKRwxTAApG7wDQwxAkAkmmwzUnAApHZHMACkf6GwAKR3cA0LwIgAgACFMACkf/ANDC3CAAUwAKSCcA0MMQJAAAASsACkhMBKT9JwAKSJiEcwAKSThbAApI7FsACkisurzrAAJmFsfzAAGKigtABAAEUwAKSV8A0MNsKAADAAPTqSsACkl0BKj9JwAKScRbAApJ+FMACknXANDC3CACcKr7VSsACkooBKT9JwAKSnRbAApKqFMACkqHANDC3CACEQb7QSsACkrQBKT9JwAKSxxbAApLUFMACksvANDC3CACuZr7TSsACkt0BKT9JwAKS8BbAApL9FMACkvTANDC3CACuYr7USsACkwkBKT9JwAKTHCIiHMACkygUwAKTIMA0MMQJAEEBAAEWwAKTOhbAApMrLqq1wACZgamDrXoAwAD10gEcwAKTWhTAApNSwDQwxAkAQQEAARbAApNsFsACk10uqrXAAJmBqYKteQDAAPXSARzAApOaFsACk4suqrXAAJmBqYQBAAEUwAKTqsA0MMQJAACtcD4BSsACk74BKT9KwAKT2QEqTsACk//AApQHAACTDWCwvwEcwAKUFRbAApQJLp/hwABv4K0RAgACgsAClCjANC63gcAClDLANC6qAMAAQJ9JwAKUPSIiIiIhHMAClEkUwAKUQcA0MpQIAEEBAAErAMAA9dIAIRbAApRlFMAClF3ANDKUCACEQrDGACEiFsAClIIUwAKUesA0MpQIAIRAsMgAFsAClJeCwAKUjsA0LreqOL7RACEiFsAClLQUwAKUrMA0MpQIAKpWsMcAFsAClMuCwAKUwsA0LreEQL7PACEcwAKU94fAApThwDQwjyACAAKCwAKU+MA0LrcUwAKVAsA0MpQIAAAAPgFJwAKVFBzAApUYLsAATRfAAG+IBwAHJsAClSkBFMAClSnANDKUCABgsNSCwAKVMsA0LreBwAKVPMA0LqqDwAKVQsA0LsSEwAKVTcA0LtaAwAKVZsA0Lp2FwAKVbMA0LusAwABwPD4BSsAClYoAPz9OwAKVssAClbsAAIQ8YLlkARbAApXHg8AClb3ANC7EgtLAAPUBTsACleXAApXsAACB5V3AAPUdAWC5ZAExwAKV/GC5ZAA9IxzAApYOgsAClgXANC63QQEAASsAwAD10orAApYFwDQutxzAApYeFsAClhIur5LAAG+IwABv5cAATesBAAEmwAKWKgGAwAKWKsA0Lp1gjmMAwABypCsBYL6/TsACljvAApZJAACxXmDAAPKzARzAApZvFsACll8WwAKWUy6f4cAAb+CvOsAAQH7AAENaAQABgsACloXANC63AMAAYpxJwAKWlRTAApaZwDQ0mwsAPgJOwAKWvcAClskAALIYYLziARzAApbLLsAATgrAAG+IAgACFMACltvANDP7CQCFwAKW5cA0LusAwABwNT0cwAKXBhTAApb/wDQ0IAoATwEAARTAApcKwDQ08QwAAMAA9S4/PRzAApcpFMAClyLANDQgCgCAmQEAAYPAApcwwDQuxADAAPUvTsACl0/AApdUAACCF2Cx4QEcwAKXaBbAApdWLsAATNrAAG+IwABv/q+vAgACgsACl3fANC63gcACl4HANC6qAMAActFJwAKXjBbAApeZgsACl5DANC63hEC+zz4BPRzAAperLq7BAQABH8ACl7S6jgcAB4LAApfJwDQut4HAApfTwDQuqhTAApfZwDQylAgAFMACl+LANDQgCgAUwAKX9MA0NJsLABTAApgDwDQ1dgwAhcACmAnANC7rAADAAJmTScACmCkWwAKYNoLAApgtwDQut4RBvtA+AT0cwAKYSC6uwQEAAR/AAphRupgHAAeCwAKYZsA0LreBwAKYcMA0LqoUwAKYdsA0MpQIABTAAph/wDQ0IAoAFMACmJHANDSbCwAUwAKYoMA0NXYMAIXAApimwDQu6wAAwACZk0nAApjGFsACmNOCwAKYysA0LreuYb7SPgJAIRTAApjywDQ0mwsAwAKY8cACmP8APRzAApkILq7BAQABNcACmREAAAEAYLpxAR/AApkRuncEAASCwAKZIMA0LrcUwAKZKsA0NCAKABTAApkywDQ1dgwAhMACmTjANC7WADUAAAABAFsBF8ACmVEUwAKZT8A0Nu0NAKBhhcACmWXANC7ruWcUAMA0Nu0NAADAAJmTPgE9HMACmYwursEBAAEfwAKZlbp/BwAGgsACmbXANC63gcACmb/ANC6qFMACmcXANDQgCgAUwAKZzcA0NXYMAITAApnTwDQu1oXAApniwDQu6wGxXhTAApoOwDQ0mwsAAMAAmZMGwABwNIFMwAKaLMACmjnAAqzOAADAAE5fwABviAAAAAEDwAKaUcACrM4AAAACAgLAAppoAAAAkw1gsNQAwAKahAAAAFRdwAD1HQFguWQAAGC7LwE+EUAcwAKasxbAApqoFsACmpwun+HAAG/gryjAAEB9vasBAAGAwAKaxcA0N/MAwABTtcACmpzAAprNAD0cwAKa8BbAApriFsACmtQur6HAAG/0p5fAAJZrTwEAAYDAApr0wDQ38wDAAPYbScACmwMiIiXAApsPgMACmwfANDfzYLDsABbAAps3FMACmy/ANDfzAAFgsOyrtrDvABzAAptiFsACm1curyjAAJmEvbMBAAEWwAKbhBTAApt8wDQ38wABYLDskmmwzQDAAFO3Pg1OwAKcF8ACnCMAAJhQYLDsARTAApwlwDQ38wABYLDsTsACnDjAApw6AABbYMAA9HkBk07AApxJwAKcUwAAwABOY2DAAPR5AZNOwAKcYsACnHQAAMAATmRdwAD1HQFguWQBMcACnIRguWQATsACnJLAApyjAADAAE5lXcAA9U4CYMAA9l1gwACKlwEewAKcqcAA9VUAAmDAAPZdYMAAipcAAE7AAp4gwAKeJQAAg7JgjZ8BJsACniABFsACnlQcwAKeMxbAAp4nLq+SwABviMAAb+XAAEX7AQABgsACnkfANDjnAMAAcraDssAAcv5gjZ9OwAKefcACno0AAJRtXcAA9R0BYJIC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AJJEXcAA9R0BYMAAWDYBHMACtAQcwAKzghbAArNrgMACs2bANEcpkkSPnICfAQFgwABYNgE0wAKzhgPAArOGwAKz+QAAAAEBAcACs4cAAACCF2CSWQAAYMAAWDYBSsACs5ABI4LAArOQwDRHpBzAArO+FsACs7Iur5LAAG+IwABv5cAATNwBAAGDwAKzysA0SEUAwABynhbAArPuFsACs94uq3PAAG+IwABv/J0urLMBYMAAWDYAwAD05oChAAAAAMAA9PE9HMACtBsWwAK0Ei6vMsAAb+zAAEOtAQABH8ACtEXAAJDYAgACK4PAArRgwDRH8wAAwABngkbAArTBwAK05sACtM8AAACCF2DAAFg2AIPAArTXwDRH8z4CTsACtPvAArUHAACwW2C5ZAEcwAK1HxbAArUTLsAATMLAAG/zwABNFgIAAoTAArUzwDRI/xbAArU5LqBgwABwAQDAAJqvPRzAArVZgcACtU/ANEc8TwEAAYXAArVdwDRJGgDAAPUuTsACtXnAArWLAACSZ2DAAPR5ARbAArWgFsACtZKAwAK1jcA0RymSRI+cWsAA9UxOwAK1scACtcAAALFvYMAA8rMBKk7AArX4wAK1/wAAgdNgsNQBHMACthkWwAK2CS6rc8AAb4jAAG/8qWkBAAGEwAK2MMA0SYAArVZJwAK2SBzAArZThsACtkzANEnDQQEAASsAwAD10j4DPRzAArZtFsACtmQun87AAJl/oGICAAIcwAK2khbAAraGLq+SwABviMAAb+XAAE1fAgACFsACtp8uwABMwcAAb96AwAK2rsA0RykAwAByuyQAAyfAAE5uhMACtwLANEmAJ8AATm8Aq8U9HMACtzMWwAK3LS62xsAAmW9PAQABHMACtz0WwAK3Ny6e1cAAmWywcwEAARbAArdNLp/hwABv4AC4owDAAPUuSsACt2IAP07AAreBwAK3jQAAsFtguWQBH8ACt5O6pQUABIbAAreqwDRJw4HAAreywDRHPBbAArfRFsACt70uqYbAAJl+lN2x6DHAArfpYMAAWDYAAbFvhcACuAXANEmvPTXAArhgAAABAGDAAG5PARbAArhgh8ACuFTANErIq7y5bzUAAAABAFsBHMACuHQUwAK4csA0SyIIALF7AAAAAMAAbmw1AAAAAQBbARzAAriTFMACuJHANEsiCACxegAA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wAD1Lj0cwALHDIfAAscFwDRVOYCZAQABg8ACxxPANFTCAMAA9S9OwALHMgAAAK1kYLHhAEnAAsdAJcACx0uCwALHRMA0VLVgsNQ+AT0VwALHZsA0VjMJHMACx4MWwALHcS7AAEzawABviMAAb/6vpQEAARTAAseTwDRUtQIBYLDUAMAAcsQ+AT0VwALHr8A0VjMJFsACx84WwALHui6phsAAmX6dLrHmTsACx/LAAsf+AACwW2C5ZAEfwALIBLq0CQAIgsACyBrANFS1gcACyCrANFSogMACyEPANFSbh8ACyFXANFU5FMACyGXANFVZCAAUwALIfMA0VjMJAITAAsiOwDRU1IXAAsilwDRU6QGEQSIWwALI04DAAsjKwDRUm4RBvtABFsACyOiAwALI38A0VJuuYr7UPRfAAskFFMACyPnANFa1CgCrvBzAAskoFsACyRsuoBPAAJmLr2ICAAKAwALJQcA0VJsrALbuuW89HMACyVYursEBAAEUwALJW8A0VrUKAADAAJmTSsACyW0BFMACyXTANFa1CgAGwABwp4FMwALJiMACyZnAAs14AACVLQEawALJicAA7ksAAAEDwALJrsACzXgAAAABAQHAAsnDAAAAg7JgjukAAFwBPgVOwALJ4cACyfMAAKBhYLXQARzAAsoXFsACyf0uwABM2cAAb4jAAG//ro4BAAGAwALKIMA0V9wAtfROwALKOMACyj8AAJJbYLC/ARzAAspVFsACykkur5LAAG+IwABv5cAATekCAAIWwALKchbAAspkLsAATNXAAG+IwABv65JbwABvjBbAAsp/gMACynrANFfcgLCO6wDAAHKrScACyoocwALKlYLAAsqOwDRYKEEBAAErAMAA9dI+Aj0cwALKpi7AAE3qwABviAUABYDAAsrBwDRX3BbAAsrlHMACytMWwALKxy6vksAAb4jAAG/lwABN6wEAAYDAAsrfwDRX3ADAAHKkgLC+zTrAAsr1YLlkADrAAssNYMAAWDYAgcACyyHANFfvAMAAcDdKwALLOwA/ScACy00WwALLWILAAstRwDRYKIRCsMY+Ak7AAst7wALLhQAAq6dgwABf4AEcwALLlhbAAsuHLq8BwABviMAAb/2rqQEAASbAAsujAYLAAsujwDRYKGDAAGhvAMAAX9xJwALLshbAAsvAg8ACy7bANFk4wABCgMAAX/E+A07AAsvvwALL9QAAgIpgwABWvQEWwALMAYPAAsv3wDRZOMAAQmDAAF/yPRzAAsweFsACzBgutsbAAJlvTwEAARzAAswoFsACzCIuntXAAJlsqtwDAAKEwALMNMA0WZsWwALMOy6f4cAAb+ABoGGBwALMZ8A0V++4mwDAAPUuSsACzIQAPz89HMACzJ4uwABN7MAAb4gGAAYcwALMxRbAAsy5Lq+SwABviMAAb+XAAE3rAQABgMACzNHANFfcAMAAcqQcwALM7BbAAszgLq+SwABviMAAb+Wa0gEAAR7AAsz1wABwNgEAAYDAAs0GwDRX3AAAwAByqYLAAs0WwDRYKDrAAs0mYLlkADrAAs1GYMAAWDYAgcACzWLANFfvAMAAcDgGwABwqIFMwALNfcACzY7AAtMLAACVPgEawALNfsAA7ksAAAEDwALNqMAC0wsAAAABAQHAAs3CAAAAg7Jgj2AAAFwBPglOwALN4MACzfIAAKBhYLXQARzAAs4WFsACzfwuwABM2cAAb4jAAG//rpACAAKAwALOIMA0Wu6AwALOJsA0Wu4AtfZOwALOPsACzkUAAJJbYLC/ARzAAs5bFsACzk8ur5LAAG+IwABv5cAATekCAAIWwALOeBbAAs5qLsAATNXAAG+IwABv65JbwABvjBbAAs6FgMACzoDANFrugLCPYgDAAHKrScACzpAcwALOm4LAAs6UwDRbQ0EBAAErAMAA9dI+Bk7AAs61wALOvgAAn+xgvr8BHMACzswWwALOwC6vksAAb4jAAG/lwABN6wEAAYDAAs7YwDRa7gDAAHKkTsACzvTAAs8CAACSRF3AAPUdAWDAAFg2ATHAAs8OYMAAWDYAPYvAAs8YwDRbwxzAAs8tLsAATfPAAG+IAwADg8ACz0fANFvDFsACz1aAwALPUcA0Wu5Uj2OEwALPYcA0W/4AwABwKE7AAs+KwALPlAAAVF3AAPUdAWC5ZAEcwALPli7AAE3wwABviAMAA4PAAs/BwDRbwxbAAs/QgMACz8vANFruVI9jhMACz9vANFv+AMAAcCY9HMACz/EuwABN6sAAb4gFAAWAwALQF8A0Wu4WwALQJoPAAtAdwDRbw4Cwvs2FwALQLMA0XGWEwALQN8A0W/6BwALQRsA0WwEAwABwN0rAAtBgAD9OwALQgcAC0I8AAJJEXcAA9R0BYMAAWDYBHMAC0JkuwABN9sAAb4gCAAImwALQsQGCwALQscA0W0NgsNQWwALQvoDAAtC5wDRa7lSPYwDAAHArTsAC0ODAAtDxAADAAE5yYMAAcvsBHMAC0P8WwALQ8y6vksAAb4jAAG/lwABF+wEAAYLAAtETwDRbQwDAAHK2TsAC0S3AAtE0AACB02CNnwEmwALRLQEWwALRR4TAAtE2wDRdWoOywABy/mCNn07AAtFgwALRaQAAkk9gsNQBJsAC0WABgsAC0WvANFtDYLDUTsAC0YrAAtGUAABUXcAA9R0BYLlkARzAAtGWLsAATffAAG+IBQAFFsAC0cWFwALRvsA0XZmST42kFsAC0eCGwALR18A0XcesFbDXFsAC0gGAwALR/MA0Wu5Uj2ODwALSFMA0XQiBwALSK8A0WwEAwABwLD0cwALSQy7AAE3swABviAYABhzAAtJqFsAC0l4ur5LAAG+IwABv5cAATesBAAGAwALSdsA0Wu4AwABypBzAAtKRFsAC0oUur5LAAG+IwABv5ZrSAQABHsAC0prAAHA2AQABgMAC0qvANFruAADAAHKpgsAC0rvANFtDh8AC0svANF3qg8AC0t7ANF0IgcAC0vXANFsBAMAAcDgGwABwOYFMwALTEMAC0xXAAtakAADAAE1MwABviAAAAAEDwALTIsAC1qQAAAAFBQXAAtMwAAAAwABOc2C5ZADAAtNNAAAAlIZgwABYNgDAAtNlAAAAgt5gwAD2XQDAAtN0AAAAwABOdGDAAPZdAMAC04IAAACgamDAAPZdAABcAT4ITsAC053AAtOyAADAAE51YLlkARzAAtPAFsAC07QuwABMwsAAb/PAAE0WAgACHMAC0+sWwALT3S7AAEyqwACZbsAATQgBAAGBwALT+sA0XzUAwACaFRbAAtQGLqBgwABwAQDAAJqvTsAC1CfAAtQ5AADAAE52YLlkARzAAtRJFsAC1EMuntXAAJlssHACAAKCwALUW8A0X0QWwALUYy6f4cAAb+AAuKBOwALUgsAC1JMAAMAATndguWQBHMAC1JsWwALUlS6e1cAAmWywcAIAAoPAAtStwDRfUxbAAtS0Lp/hwABv4AC4oE7AAtTTwALU5QAAwABOeGC5ZAEcwALU9RbAAtTvLp7VwACZbLBwAgAChMAC1QfANF9kFsAC1Q8un+HAAG/gALigTsAC1TDAAtU4AACTDWCw1AEWwALVSRbAAtU6Lqq1wACZgalWrStOwALVYsAC1WkAAIHlXcAA9R0BYLlkATHAAtV5YLlkBYDAAtWBwDRfJoXAAtWbwDRfeYbAAtW3wDRf34fAAtXQwDRgIBTAAtXowDRgYQgATsAC1hLAAtYiAACpVmC5ZAEfwALWKLqlBAAEFMAC1jbANGCiCQAUwALWP8A0YMgKABbAAtZigMAC1k/ANF8msPe5mzrAAtZzYMAAWDYAAD0cwALWjC5PAQABFMAC1pDANGEXCwAAwACZnwbAAHCpgUzAAtapwALWusAC32gAAJVCARrAAtaqwADuSwAAAQPAAtbUwALfaAAAAAEBAcAC1u4AAACDsmCPhQAAXAE+EU7AAtcMwALXHgAAoGFgtdABHMAC10IWwALXKC7AAEzZwABviMAAb/+ukgEAAYDAAtdLwDRhswC1+E7AAtdlwALXbAAAgdNgjV4BFsAC13OAwALXbsA0YbOB04+MScAC138WwALXiIDAAteDwDRhs4Pij4k+A07AAtenwALXsAAAhB9gwABWvQEcwALXvhbAAteyLq+SwABviMAAb+XAAEJbAQABgMAC18/ANGGzAMAAcrI9HMAC1+IWwALX3C62xsAAmW9PAQABHMAC1+wWwALX5i6e1cAAmWyq3AMAAoPAAtf4wDRiOxbAAtgCLp/hwABv4AGgYYHAAtgswDRhxribAMAA9S5KwALYRwA/TsAC2GzAAth4AACYUGCw7AEcwALYhhbAAth6Lq+SwABviMAAb+WjKQEAAYLAAtiVwDRh/wDAAHKnTsAC2K7AAtiyAACZPGCwrQEWwALYwIPAAti0wDRi05JpsM1OwALY4sAC2OsAAK1kYLHhARzAAtkBFsAC2O0uqYbAAJl+rMMBAAGEwALZFMA0YwwAsgBOwALZLMAC2TkAALQsYMAAWF0BHMAC2UcWwALZOy6vksAAb4jAAG/lqgECAAIWwALZa4LAAtlkwDRh/5JpjRsWwALZihbAAtmAgMAC2XvANGGzVI+IlQiPLwDAAHKiPY7AAtmWwDRjYibAAtmWARzAAtmzFsAC2aUuwABMqsAAmW7AAE0IAQABhsAC2cLANGNiAMAAmhVgwABYXU7AAtnpwALZ8wAAVF3AAPUdAWC5ZAExwALaA2C5ZABJwALaCyIiFsAC2huDwALaD8A0YtOqwrDuABzAAtpJFsAC2j4uryjAAJmEvagBAAEWwALabYPAAtphwDRi05JpsM0AwABToAAhHMAC2pQWwALaiS6vKMAAmYS9qwEAAYPAAtqmwDRi0wDAAFO1PgE9HMAC2xOHwALbCcA0Y/1PAQABHMAC2x0WwALbFy6e1cAAmWywcwEAARbAAtstLp/hwABv4AC4owDAAPUuP07AAttVwALbYwAAkkRdwAD1HQFgwABYNgEcwALbbS7AAE30wABviAIAAoPAAtuKwDRi0xbAAtucgMAC25fANGGzVI+IAMAAcCk9HMAC27aHwALbrMA0Y/2AmQEAASMcwALb1BbAAtvJFsAC270un+HAAG/gryjAAEB9vasBAAGDwALb5sA0YtMAwABTtRzAAtv9LsAATfLAAG+IAgACFsAC3CmCwALcIsA0Yf+ST41iFsAC3DiAwALcM8A0YbNUj4gAwABwJxzAAtxNLsAATffAAG+IBQAFFsAC3ICCwALcecA0Yf+ST41iFsAC3KKDwALclsA0YtOsFbDXFsAC3MeAwALcwsA0YbNUj4gUwALc3sA0ZMkIAIHAAtz5wDRhxgDAAHAsAV3AAPUdAWC5ZADAAPUvScAC3RIcwALdJRbAAt0WLqq1wACZgajbAQABg8AC3TnANGLTAK1EPgE9i8AC3U/ANGLTFsAC3WwWwALdXS6qtcAAmYGpb61BPz0cwALeDy7AAE18wABviAMAA4fAAt4hwDRj/RzAAt4sLsAATfXAAG+IAgAChMAC3kPANGMMFsAC3k2AwALeSMA0YbNUj4gAwABwKoHAAt5hwDRhxgDAAHAtPRzAAt55LsAATQkBAAGGwALeksA0Y2IAwABwWj0cwALepS7AAE1UwABviAYABIPAAt67wDRi04fAAt7IwDRj/YXAAt7TwDRjLxTAAt7dwDRkyQgAAqBhgcAC3wfANGHGtCyGwALfKMA0Y2LAAHAyPRzAAt87LsAATQoBAAGGwALfV8A0Y2IAwABwWwbAAHCqgUzAAt9twALffsAC4D4AAJVuARrAAt9uwADuSwAAAQPAAt+PwALgPgAAAAEBAcAC36AAAACDsmCQCwAAXAE+Az0cwALfuRbAAt+xgMAC36zANGdclUiQDZQOAQABLgCOZ07AAt/YwALf4wAAkkdguWQBHMAC3+UursIAAAAAwACZlD0cwALf8C7AAE55AwADFsAC4ACAwALf+8A0Z1yCF5AOgcAC4AbANGeQHMAC4CwWwALgEi7AAEzZwABviMAAb/+upwEAAYDAAuA0wDRnXAC2DQDAAHCrBsAAcKuBTMAC4EPAAuBIwALwxwAAwABOeQAAAAEDwALgUsAC8McAAAADAwPAAuBfAAAAghdgklkAwALgcgAAAJJHYLlkAMAC4JYAAACgYWC10AAAXAE+CknAAuFxJcAC4XqAwALhdcA0aDJgkmM+BD0cwALhyy7AAE2rAgACJ8AATayCwALh7cA0aEwAwABwcD0cwALiBy6uwgAAAADAAJmUPRzAAuIaFsAC4hQutsbAAJlvTwEAARzAAuIkFsAC4h4untXAAJlssHICAAIpFsAC4joun+HAAG/gALiiAMAA9S5KwALiTwA/TsAC4mvAAuJ1AADAAE4JYMAAWDYBHMAC4o0WwALify7AAEyqwACZbsAATQgBAAEcwALiqBbAAuKcLq+SwABviMAAb+XAAEzcAQABgMAC4rTANGgyAMAAcp4AwACaFUnAAuLBFsAC4s+DwALixcA0aPG/HMAAWDo+Aj0cwALi7RbAAuLnLrbGwACZb08BAAEcwALi9xbAAuLxLp7VwACZbLByAgACKRbAAuMNLp/hwABv4AC4ogDAAPUuSsAC4yIAP0nAAuM1JcAC40ODwALjOcA0aPFgwABYyT4GTsAC42nAAuN4AADAAESGYLlkARzAAuOQFsAC44QuwABMwsAAb/PAAE0WAgACFMAC46TANGjxAwFgwABYyRbAAuOvLqBgwABwAQDAAJqvTsAC49jAAuPfAACB5V3AAPUdAWC5ZAExwALj72C5ZAKBwALj+cA0aD+EwALkDcA0acw9HMAC5CwuwABNVMAAb4gFAAQWwALkUhbAAuRCLqtzwABviMAAb/ypWq0vhcAC5GTANGoaFsAC5IoWwALkdi6phsAAmX6VO7HpOsAC5JRgwABYNgABoGGCwALkxcA0aEzAAHAyTsAC5OzAAuTxAAAgYLlkARzAAuTzLq7CAAAAAMAAmZQ9HMAC5QAursEBAAEfwALlCb1aBQAFFMAC5RbANGjxAwFgwABYyYHAAuUhwDRoP4bAAuUtwDRqsBbAAuVRFsAC5T0uqYbAAJl+lTux6YLAAuVbwDRoTAAAwACZk0rAAuV2AD9JwALliSXAAuWXg8AC5Y3ANGjxYMAAWOI+Bk7AAuW9wALlzAAAwABEhmC5ZAEcwALl5BbAAuXYLsAATMLAAG/zwABNFgIAAhTAAuX4wDRo8QMBYMAAWOIWwALmAy6gYMAAcAEAwACar07AAuYswALmMwAAgeVdwAD1HQFguWQBMcAC5kNguWQCgcAC5k3ANGg/hMAC5mHANGtNPRzAAuaALsAATVTAAG+IBQAEFsAC5qYWwALmli6rc8AAb4jAAG/8qVutMIXAAua0wDRrmxbAAubaFsAC5sYuqYbAAJl+lTux6TrAAubkYMAAWDYAAaBhgsAC5xXANGhMwABwMk7AAuc8wALnQQAAIGC5ZAEcwALnQy6uwgAAAADAAJmUPRzAAudQLq7BAQABH8AC51m9WgUABRTAAudmwDRo8QMBYMAAWOKBwALnccA0aD+GwALnfcA0bDEWwALnoRbAAueNLqmGwACZfpU7semCwALnq8A0aEwAAMAAmZNKwALnxgA/ScAC59klwALn54PAAufdwDRo8WDAAFiJPgROwALoEcAC6B0AAIUDYLlkARzAAug1FsAC6CkuwABMwsAAb/PAAE56AgACFMAC6E7ANGjxAwFgwABYiRbAAuhZLqBgwABwAQDAAJqsPRzAAuhvLsAATVTAAG+IBQAEFsAC6KAWwALokC6rc8AAb4jAAG/8qVytMTHAAujTYLlkAoHAAujUwDRoP4TAAujgwDRszhbAAukMFsAC6PguqYbAAJl+lTux6TrAAukgYMAAWDYAAaBhgsAC6VHANGhMwABwMj0cwALpay6uwQEAAR/AAul0vVsFAAUUwALpgcA0aPEDAWDAAFiJgcAC6YzANGg/HMAC6ZgursIAAAAAwACZlBbAAum9FsAC6akuqYbAAJl+lTux6YLAAunHwDRoTAAAwACZk0rAAuniAD9JwALp9SIlwALqA4PAAun5wDRo8WDAAFhdACEcwALqGC7AAE57wABviAEAARTAAuowwDRo8QMBYMAAWF0AwABwOj4KTsAC6lHAAuphAADAAE58YLlkARzAAup6FsAC6mMuwABMwsAAb/PAAE59AgACFMAC6pvANGjxAwFgwABYXRbAAuqmLqBgwABwAQDAAJquPRzAAuq8Lk8BAAGEwALqwMA0bj0AwACZn07AAurkwALq7AAAkw1gsK0BFsAC6vgUwALq7sA0aPEDAWDAAFhdkw3AAFhfTsAC6w/AAusYAACSmmDAAIqhARzAAusgFsAC6xourwzAAJmHwABIcgEAAYXAAusrwDRupADAAGxRTsAC60jAAutUAADAAE5+YLlkARzAAutmFsAC62AuntXAAJlssHECAAKGwALrgMA0btAWwALrii6f4cAAb+AAuKFOwALrq8AC67cAAMAATn9guWQBIyIcwALr3hbAAuvPFsAC68Mun+HAAG/gpdnAAECHra0BAAGFwALr8sA0bqQAwABlyQEcwALsJxbAAuwcFsAC7BAun+HAAG/gryjAAEB9qm4BAAGFwALsOMA0bqQAwABTohzAAuxXFsAC7FEuntXAAJlssHECAAIcwALsihbAAuyELq8MwACZh8AASHMBAAGFwALsm8A0bqQAwABsUhbAAuylLp/hwABv4AC4oRzAAuzIFsAC7MIuntXAAJlssHMBAAEWwALs2C6f4cAAb+AAuKMBYLwzTsAC7P/AAu0GAACB5V3AAPUdAWC5ZAExwALtFmC5ZASBwALtIMA0aD+HwALtNMA0bwmEwALtScA0bj0UwALtYsA0b0oIAD0cwALtfS7AAE1UwABviAUABBbAAu2jFsAC7ZMuq3PAAG+IwABv/KlXrSwUwALtscA0cDIJABbAAu3XFsAC7cMuqYbAAJl+lTux6TrAAu3hYMAAWDYAAaBhgsAC7hLANGhMwABwMj0cwALuLC6uwQEAAR/AAu41vVoFAAUUwALuQsA0aPEDAWDAAFhdgcAC7k3ANGg/HMAC7lkursIAAAAAwACZlBbAAu5+FsAC7mouqYbAAJl+lTux6YLAAu6IwDRoTAAAwACZk0rAAu6jAD9JwALuthzAAu7CFsAC7roun7zAAG/4rzcCAAIWwALu4BbAAu7ULp/hwABv4Kq1wABAgYPAAu7wwDRo8QC2xT4CPRzAAu8ELq7BAQABH8AC7w29WAQABIPAAu8YwDRo8YHAAu8jwDRoPxbAAu9DFsAC7y8uqYbAAJl+lTux6YLAAu9XwDRoTAAAwACZk0rAAu9yAD89HMAC8AUursEBAAEewALwDr1JBQAFg8AC8B/ANGjxgcAC8DLANGg/HMAC8EYuwABOCsAAb4gCAAKBwALwVsA0aD+CwALwYsA0aEwAwABwNRbAAvCSFsAC8H4uqYbAAJl+lTux6YLAAvCkwDRoTAAAwACZk0rAAvC9AAbAAHA6gUzAAvGBwALxhsAC86YAAMAATnvAAG+IAAAAAQPAAvGdwALzpgAAAAEBAcAC8awAAACCF2DAAFhdAABgwADyswE+BE7AAvHGwALxzwAAlG5gwABYXQEcwALx+BbAAvHlFsAC8dkur5LAAG+IwABv5Z/mwABynKp5AQABFsAC8gmAwALyBMA0coSTDcAAWF8ArwZOwALyJsAC8i0AALsOXcAA9R0BYMAAWDYBFsAC8jiBwALyL8A0cp2SRMAAWGBFwALySwHAAvJUwALyVgAAW2DAAPR5AZMBHMAC8l2DwALyW8A0cx5cAQABFsAC8maCwALyX8A0cuxawAD1TADAAPWmAYvAAvJuwDRzHhzAAvJvg8AC8m7ANHMeXQEAAZQAwAD1nkE+BU7AAvKEwALyiAAAlRFgwABYNgEcwALynBbAAvKPgMAC8orANHKEkkTAAFhgRAEAAYPAAvKdwDRzHgDAAPUsScAC8qcWwALyr4TAAvKrwDRzgb8cwABYOkLAAvK/AD9OwALy4MAC8u0AAKe0YMAAWIkBJsAC8uABHMAC8vWCwALy78A0cuxEAQABg8AC8vbANHMeAMAA9SxgwABYiU7AAvMJwALzDwAAlQpgwABYNgEcwALzOxbAAvMdFsAC8xEur5LAAG+IwABv5Z/mwABynKp8AQABFsAC812FwALzUMA0c9+TDcAAWIsArwpJwALzbSEcwALzd4bAAvNxwDR0HUEBAAGEwALzesA0c4EAwAD10krAAvN/ASo/SsAC85cBKQbAAHCsgUzAAvOrwALzvMAC9Q8AAJWHARrAAvOswADuSwAAAQPAAvPGwAL1DwAAAAEBAcAC89AAAACDsmCQhgAAXAE+Aj0cwALz3C7AAE1kwABviAEAARbAAvP3gMAC8/LANHTTkkeQiADAAHA7ScAC9AgWwAL0DC7AAEytwACZdT4ETsAC9DPAAvRFAACgYWC10AEcwAL0axbAAvRRLsAATNnAAG+IwABv/66TAQABgMAC9HbANHTTALX5PRzAAvSDLsAATMAAAAAAwACZpT0cwAL0oS6uwQEAAR/AAvSqvLkDAAMWwAL0uy6phsAAmX4cwAL00C6uwgAAAADAAJmUgcAC9NfANHUkAADAAJmTPRfAAvTyLsAATK0qwACZdT8GwABwO4FMwAL1FMAC9RnAAvX2AADAAE1kwABviAAAAAEDwAL1LsAC9fYAAAABAQHAAvU9AAAAkkdgjmMAAFwBPgJOwAL1VMAC9VgAAIMTYMAA8rMBFsAC9VouwABM0MAAb4jAAG/mTD4CPRfAAvWALsAATNDAAG+IKcAAb+Y9HMAC9a6AwAL1o8A0dfGUDgEAAS4Ajmc+AT0XwAL10i7AAEzQwABviIHAAvXpwDR2BMAAb+YGwABwrYFMwAL1+8AC9gzAAvbVAACV3gEawAL1/MAA7ksAAAEDwAL2H8AC9tUAAAABAQHAAvYyAAAAg7Jgke8AAFwBPgI9HMAC9k4WwAL2Q4DAAvY+wDR2qJJHkfGUDgEAAS4Ajmc9HMAC9mAuTwEAAR/AAvZovMwEAAQWwAL2by6phsAAmX4cwAL2hC6uwgAAAADAAJmUFsAC9pCAwAL2i8A0dqiV3JH2HMAC9r8WwAL2pS7AAEzZwABviMAAb/+umAEAAYDAAvbKwDR2qAC1/gAAwACZnwbAAHCugUzAAvbawAL268AC+A0AAJWTARrAAvbbwADuSwAAAQPAAvb/wAL4DQAAAAEBAcAC9xMAAACDsmCQwwAAXAE+Az0cwAL3LBbAAvckgMAC9x/ANHd/lUiQxZQOAQABLgCOZ07AAvdLwAL3UwAAwABOgGC5ZAEcwAL3VS6uwgAAAADAAJmUPRzAAveILq7BAQABNcAC95EAAAEAYLy6AR/AAveRvMICAAKBwAL3mMA0d7MWwAL3tRbAAvehLqmGwACZfp0useYANQAAAAEAWwEXwAL3yoLAAvfIwDR34qBhHMAC9/gWwAL33i7AAEzZwABviMAAb/+ulwEAAYDAAvgDwDR3fwC1/blnggDANHfiAMAAmZMGwABwr4FMwAL4EsAC+CPAAvrfAACVhQEawAL4E8AA7ksAAAEDwAL4L8AC+t8AAAABAQHAAvg7AAAAg7JgkH0AAFwBPgZOwAL4VMAC+F4AAIF9YLlkARbAAvhgLsAATM3AAG/vScAC+HocwAL4iIHAAvh+wDR4qkEBAAErAMAA9dI+Aj2JwAL4mcA0eKocwAL4qxbAAvilLp7VwACZbLBzAQABFsAC+Lsun+HAAG/gALijPRzAAvjYFsAC+M8un87AAJl/oGICAAIcwAL48hbAAvjmLq+SwABviMAAb+XAAE1fAgACFsAC+P8uwABMwcAAb96AwAL5DsA0eJcAwAByuyfAAE6BAKvFPz0cwAL5Vi7AAEzAAAAAAMAAmaVOwAL5hMAC+ZYAAKBhYLXQARzAAvm6FsAC+aAuwABM2cAAb4jAAG//rpMBAAGAwAL5xcA0eJcAtfk9HMAC+dAuwABMswEAAR/AAvnlvNQEAAMWwAL59S6phsAAmX6BwAL6CsA0eKqCwAL6FcA0eYIBsfcpAMAAmZs9HMAC+q0WwAL6py62xsAAmW9PAQABHMAC+rcWwAL6sS6e1cAAmWywdAEAARbAAvrOLp/hwABv4AC4pADAAPUuBsAAcLCBTMAC+uTAAvr1wAL7kgAAlYMBGsAC+uXAAO5LAAABA8AC+wjAAvuSAAAAAQEBwAL7GwAAAIOyYJB0AABcAT4BPRzAAvstFsAC+ycutsbAAJlvTwEAARzAAvs/FsAC+zEuwABMqsAAmW7AAEzyAQAAAaBhHMAC+34WwAL7ZC7AAEzZwABviMAAb/+ujgEAAYDAAvuHwDR6bAC19MAAmiEAwAD1LgbAAHCxgUzAAvuXwAL7qMAC/GoAAJVJARrAAvuYwADuSwAAAQPAAvuwwAL8agAAAAEBAcAC+7gAAACDsmCPpQAAXAE+Aj0cwAL70RbAAvvJgMAC+8TANHsVlUiPp5QOAQABLgCOZz0cwAL74y6uwQEAATXAAvvsAAABAGC8SQEfwAL77LxQAgACHMAC+/EuwABMsAAAAADAAHBOFsAC/BUWwAL8AS6phsAAmX6VO7HpADUAAAABAFsBF8AC/CeBwAL8JcA0e1WgYRzAAvxVFsAC/DsuwABM2cAAb4jAAG//rqQBAAGAwAL8YMA0exUAtgq5Z4EAwDR7VQDAAJmTBsAAcLKBTMAC/G/AAvyAwAL9VgAAlVYBGsAC/HDAAO5LAAABA8AC/JjAAv1WAAAAAQEBwAL8sAAAAMAAToJgj8sAAFwBPgNOwAL82MAC/OYAAMAAToNgwACZ8QEfwAL87MAAmf0BAAEuAD0cwAL9GIDAAv0LwDR8E5QOAQABgcAC/R/ANHwoAI/QPRzAAv05FsAC/TMutsbAAJlvTwEAARbAAv1LgcAC/T3ANHwogRDAAJn0AMAA9S4GwABws4FMwAL9W8AC/WzAAv57AACV0QEawAL9XMAA7ksAAAEDwAL9ecAC/nsAAAABAQHAAv2GAAAAg7JgkcwAAFwBPgNOwAL9qcAC/bQAAMAATX1gwABxIwEfwAL9usAAcUACAAIuHMAC/foWwAL94C7AAEzZwABviMAAb/+upQEAAYDAAv4DwDR8zAC2CwA9HMAC/hkWwAL+FIDAAv4PwDR8zJJMkc6UDgEAAS4AkRU9NcAC/isAAAEAYMAAcSMBgcAC/ivANHzfNQAAAAEAWwEcwAL+PoLAAv48wDR9TMAATX8AAAAAwABxPDUAAAABAFsBHMAC/lWCwAL+U8A0fUyupgEAAYDAAv5gwDR8zADAAHE9NQAAAAEAWwEcwAL+boLAAv5swDR9TMAATYEAAAAAwABxPoIAwDR9TAbAAHC0gUzAAwCrwAMAvMADA0oAAJXYARrAAwCswADuSwAAAQPAAwDLwAMDSgAAAAEBAcADANoAAACDsmCR5AAAXAE+A07AAwD9wAMBCAAAwABNfWDAAHEjAR/AAwEOwABxQAIAAi4cwAMBThbAAwE0LsAATNnAAG+IwABv/66lAQABgMADAVfANH4JALYLAEnAAwHSJcADAeAWwAMB24DAAwHWwDR+CZJMkeZgkcw+A07AAwIEwAMCDQAAwABOhGCRzAEmwAMCBAEWwAMCFIDAAwIPwDR+CZJMkeZgkcw9HMADAi4WwAMCKYLAAwIgwDR+iJJMkc6UDgEAAS4AkRU9NcADAkIAAAEAYMAAcSMBgcADAkLANH4cNQAAAAEAWwEcwAMCV4PAAwJVwDR+2MAATX8AAAAAwABxPDUAAAABAFsBHMADAnCDwAMCbsA0ftiupgEAAYLAAwJ7wDR+iADAAHE9gwDANH7YPgI9HMADAqMWwAMCnoDAAwKZwDR+CZJMkeaUDgEAAS4AkRU9HMADAsKBwAMCt8A0fhzAAE1/AAAAAMAAcTw9NcADAt0AAAEAYMAAcSMBgcADAt3ANH4cNQAAAAEAWwEcwAMC8ILAAwLuwDR/gMAATYABAAE0wAMDAgPAAwMCwAMDMwAAAAAAAABgwAD1ggE+AT0cwAMDHhbAAwMUgMADAw/ANH4JldeR55QOAQABLgCRFQDAAHE7NQAAAAEAWwEcwAMDPYLAAwM7wDR/gMAATYEAAAAAwABxPoIAwDR/gAbAAHA8gUzAAwPPwAMD1MADJnoAAMAATRfAAG+IAAAAAQPAAwPkwAMmegAAAAgHB8ADA/sAAACST2Cw1ADAAwQUAAAAn+xgvr8AwAMEMgAAAKvXYLHhAMADBFEAAADAAE6FXcAA9R0BYLlkAMADBHkAAACSRF3AAPUdAWDAAFg2AMADBJYAAADAAE6GYIwOAMADBLsAAACgYWC10AABwAME4wAAALQsYMAAWF0BK2DAAPKzAT4NScADBPgWwAMFBYDAAwT8wDSAT4PksNY+AUrAAwVkASo/ScADBX0iHMADBYwWwAMFgS6vKMAAmYS9qwEAAYDAAwWewDSATwDAAFO1ACEiJcADBb6AwAMFtcA0gE9gsOwAFsADBd8UwAMF1sA0gE8AAWCw7Ku2sO8+AUrAAwY/ASo/ScADBlgcwAMGZRbAAwZcLoIewABv8KBDAQABgMADBoDANIBPAJ8SSsADBosBKj9OwAMGo8ADBq4AAK7jYMAA8rMBIhzAAwa6FsADBrAuwABMq8AAmXCAiwEAAZMAwAD1qAEWwAMGxxbAAwbBLp7VwACZbLBiuJJOwAMHYsADB3UAAMAATodgwADyswEcwAMHixbAAwd/LsAATNbAAG/1ruICAAGAwAMHlcA0gE8BruMUwAMHq8A0gYYIALZwScADB7wcwAMH0xTAAwfAwDSBzgkAQQEAASoAwAD10krAAwfdASo/T8ADB/DAAwf1AAABwABOiGEAYMAA8rMAA8ADCAnAAw/qAAAAAAAAAGDAAPKzAT4IScADCBQWwAMIIBbAAwgYLm/AAJmAgi2BE0rAAwgxASo/QCIiIiIhHMADCGGBwAMIWMA0gFxBAQABKwDAAPXSARbAAwiDgMADCHrANIBPg96wwwEWwAMIpoDAAwidwDSAT4RGsMIBFsADCMuAwAMIwsA0gE+ERbDFASXAAwjzgMADCOrANIBPYLDzwAMIWMADCQsBHsADCRer3wIAAoDAAwkgwDSATyTAAwlXAyfAAE6JgMADCU3ANIBPJ4ExAEnAAwlhIRzAAwlugcADCWXANIBcQQEAASsAwAD10j4CScADCYEhHMADCY+BwAMJhsA0gFyqOwEAAYDAAwmXwDSATwC+30rAAwmiASo/ScADCbgiIRzAAwnBgsADCbzANIBpQQEAASsAwAD10gAWwAMKRRzAAwn9FsADCdguqYbAAJl+qjwDAAOCwAMKD8A0gGmAwAMKFcA0gE8WwAMKKIHAAwofwDSAXKJtvsMAskqsrLHRPgFKwAMKZAEqPz9JwAMKixzAAwqaFsADCo8uryjAAJmEvasBAAGAwAMKrMA0gE8AwABTtUrAAwq3ASo/ScADCxMcwAMLJRbAAwsggMADCxfANIBPgLCwm0EBAAEnQQDAAPZsPgFJwAMLOCIhHMADC1QWwAMLRYDAAws8wDSAT5JpsM1BAQABFsADC2YWwAMLVy6qtcAAmYGbDayVAMAA9dIAFsADC9QcwAMLpxzAAwuSg8ADC4HANIB2RAEAAZQAwAD1LKzTAQABFsADC64uqYbAAJl+ALmpqj2x0D4BSsADC/MBKj8/ScADDLMiIiXAAwzAgMADDLfANIBPYLDsABbAAwzrFMADDOLANIBPAAFgsOyqwrDuABzAAw0bFsADDRAuryjAAJmEvagBAAEWwAMNPBTAAw0zwDSATwABYLDskmmwzQDAAFOgPgFKwAMNVwEqP0nAAw3pISXAAw32gMADDe3ANIBPYLDzPgFJwAMOGxbAAw5PHMADDjYWwAMOHy6gC8AAb/GroAEAAYDAAw5FwDSATwC1Qq45tSg+Aj0XwAMPky7AAEytKsAAmXVKwAMPsgEqPz9KwAMP2QEpT8ADD/HAAw/2AAABwABOimEAYMAA8rMAA8ADEAjAAxDMAAAAAAAAAGDAAPKzAT4BSsADEE4BHsADEGLAAHDWBAADFsADEG8ur5LAAG+IwABv5YDAAxB8wDSAT5QBgrkWwAMQsRbAAxCpLm/AAJmAgrmBJE/AAxDTwAMQ2AAAAcAATothAGDAAPKzAAPAAxDqwAMTQwAAAAAAAABgwADyswE+A0nAAxFuHMADEXIuwABOjMAAb4gBAAGAwAMRgMA0gE8AwABwSj4BSsADEZUBHsADEanAAHDWBAADFsADEbYur5LAAG+IwABv5YDAAxHDwDSATysBgrkWwAMR/RbAAxH1Lm/AAJmAgrmBJD9JwAMSIh7AAxI8wABw+QUAAxbAAxJULq+SwABviMAAb+WAwAMSYcA0gE8WwAMSfYPAAxJrwDSAdlrAAPVMAoK5FsADEq0WwAMSpS5vwACZgIK5gSTAAE6NFsADEugWwAMS4C5vwACZgIJZgS4+AUrAAxMHASk/SsADEyIBHMADEzsUwAMTKcA0hZ8LACAAAAAAAE/AAxNKwAMTTwAAAcAATo5hAGDAAPKzAAPAAxNjwAMf1AAAAAAAAABgwADyswE+EEnAAxORHMADE6QWwAMTlS7AAEzRwABviMAAb+eBZQEAATTAAxOoA8ADE6jAAxPNAAAAAQEBwAMTqQAAAIS6YMAAcL4AAGDAAPKzAUrAAxOzARzAAxPCFsADE7kUwAMTs8A0h54OAJJPwABwwEEBAAGAwAMTxcA0gE8AwAD10gDAAPTwPgFKwAMT2gEqP07AAxSSwAMUsAAAq15gwADyswEcwAMU2BbAAxS+FsADFLIun+HAAG/gqIHAAECLq14CAAImwAMU/wEWwAMU/xbAAxT2LoIewABv8J/VnvJgsL+AwAMVD8A0gE8Ar+ZJwAMVISEUwAMVJsA0h/cOAD4BSsADFU8BHMADFWgUwAMVVsA0hZ8LACAAAAAAAD9JwAMVxyIWwAMVyy7AAEzQwABviMAAb+YBFsADFeMuwABM1MAAb4jAAG/qPgFKwAMWCwEcwAMWJBTAAxYSwDSGEgwAIAAAAAAAP0nAAxY3HMADFk4UwAMWO8A0gc4JAEEBAAEpAMAA9dI+A07AAxbwAAAAoGNgwAD2XQBAHMADF+IVwAMXFcA0iPAPHsADFyvAAHDXBQADFsADF1Yur5LAAG+IwABv5YDAAxdjwDSATysCwABOjymCuRbAAxfLFsADF8Mub8AAmYCCuYEkQQEAASsAwAD2bMADFxTAAxf5AR7AAxgHq98CAAKAwAMYEMA0gE8kwAMYPAQnwABOkIDAAxgqwDSATyeDDhTAAxg1wDSI8A8AAErAAxhIASk/TsADGGjAAxh2AADAAE6RYMAA9HkBFsADGJQWwAMYgYDAAxh4wDSAT6wVsNesJLELTsADGK8AAADAAE6SYMAA9HkAScADGMcUwAMYy8A0gYYIAD4BPRXAAxjhwDSJ0xAcwAMZHBrAAxkBwABwzV0BAAEcwAMZXRrAAxk3wABwzoM+AQABFMADGV/ANImjDwAAwAD1oADAAPWePgE9FcADGYXANInTEBzAAxnBGsADGaXAAHDLXQEAARzAAxoDGsADGdzAAHDMgz4BAAEUwAMaBcA0iaMPAADAAPWgAMAA9Z5OwAMaKMADGjgAAMAATpNgwADyswEcwAMaRhbAAxo6LsAATNbAAG/1rukBAAGAwAMaWMA0gE8AtnROwAMabsADGnkAAMAATpRgwADyswEcwAMaey7AAE6MwABviAEAAYDAAxqJwDSATwDAAHBKScADG1siFMADG1/ANIqDEQABFMADG3LANIq8EgA+AT0VwAMbiMA0idMQKz9OwAMbtMADG78AAMAATo9gwADyswEqScADG84UwAMb0sA0ioMRAD4BPRXAAxvtwDSLHBMpP07AAxwUwAMcHgAAruJgwADyswEewAMcLcAAcNYFAAMWwAMcRS6vksAAb4jAAG/lgMADHFLANIBPFMADHFzANInTEAACwABOjxTAAxyEwDSLHBMAgrkWwAMcuBbAAxywLm/AAJmAgrmBJEnAAxzVFMADHNnANIqDEQA+AUnAAxz0FMADHPjANItRFAA+Aj0cwAMdGxbAAx0PLsAATNbAAG/1ruUCAAGAwAMdK8A0gE8BruMptnE9HMADHV4WwAMdUi7AAEzWwABv9a7lAgABgMADHW7ANIBPAa7jKrZxPgI9HMADHbMWwAMdpy7AAEzWwABv9a7dAgABgMADHcbANIBPAa7jKbZyPRzAAx35FsADHe0uwABM1sAAb/Wu3QIAAYDAAx4MwDSATwGu4yq2cknAAx5BFMADHkXANIq8EgA+AD4BScADHu8UwAMe88A0i1EUAD4BPRzAAx8WFsADHwouwABM1sAAb/Wu5QIAAYDAAx8mwDSATwGu4xTAAx88wDSBhggAtnE+AT0cwAMfcBbAAx9kLsAATNbAAG/1rt0CAAGAwAMfg8A0gE8BruMUwAMfmcA0gYYIALZySsADH74BFMADH8XANItRFABPwAMf28ADH+AAAAHAAE6VYQBcAAPAAx/qwAMlUwAAAAAAAABcAT4GScADH/UWwAMgAoDAAx/5wDSAT4RFsMU+AT0cwAMgJBbAAyAbLq8ywABv7KxwAQABHsADIEfAAF2SAgACJsADIGUBgMADIGXANIBPYLDsh8ADIG/ANIC9AADAAGd3PgJAHMADIKqHwAMgncA0gL1BAQABKwDAAFhvwAMgncADILEBJMADIPYEJ8AATpaAwAMg3sA0gE8ngw6HwAMg6cA0gL09HMADIQoWwAMhAS6vMsAAb+yscAEAAR7AAyEtwABdkwIAAoDAAyFGwDSAT4TAAyFQwDSAiwAAwABnd0nAAyIwIiIWwAMiPYDAAyI0wDSAT5SssMQAISXAAyJkgMADIlvANIBPYLDzACIcwAMikYLAAyKMwDSAaUEBAAErAMAA9dIBFsADIsscwAMivhbAAyKqLqmGwACZfqzTAQABgsADIsXANIBpALIRqj2x0D4BPRzAAyLpLk8BAAEfwAMi8brYBQAEKxzAAyMSg8ADIwHANIB2RAEAAZMAwAD1LBbAAyM3FsADIyMuqYbAAJl+nS6x5obAAyNEwDSArwGm3yoAwACZnz9OwAMjm8ADI60AAMAATpddwAD1HQFguWQBHMADI68uwABOmMAAb4gEAASAwAMj1cA0gE+BwAMj38A0gFyDwAMj6cA0gHaFwAMj/MA0gKAAwABwPT0cwAMkEC7AAE6ZwABviAMAA4DAAyQkwDSATxTAAyQuwDSO6w8Ah8ADJEHANIC9AMAAcEA9HMADJFYuq8kDAAOAwAMkYsA0gE+GwAMkbMA0gK80wAMkfwPAAyR/wAMlLwAAAAAAAABgwAD1ggE+AUnAAySMIRbAAySRLsAATK3AAJl1PgE9HMADJKouwABNZsAAb4gCAAIcwAMkvBbAAyS2Lp7VwACZbLBzAQABFsADJMwun+HAAG/gALijhsADJNrANICvAMAAcEU+AT0cwAMlCS7AAE6awABviAEAAYDAAyUTwDSATwDAAHBGAMAAcFA9HMADJTguwABOm8AAb4gAAAAAwABwQknAAyVaIhzAAyVyFMADJV7ANII/CgAgAAAAAAAAHMADJYwUwAMleMA0hz4NACAAAAAAAD4DPRzAAyWiFMADJZjANI0hDgAgAAAAAAA9NQAAAAEAYLBkARbAAyWsLsAATMzAAG+IwABv4yMcwAMluxQAwDSQkw8AQQEAASsAACscwAMluxQAwDSQkw8Aq8gCAAKAwAMl1MA0gE8jFsADJfcWwAMl6C7AAEzRwABviMAAb+eA/MAA9P8WwAMmDy7AAEzBwABv3hbAAyZBFsADJjwWwAMmLS7AAEzRwABviMAAb+eBecAA9QKST8AAcMABYLC/ALBmAVxKwAMmUgEpP0rAAyZqASoGwABwPYFMwAMmwMADJtPAAyo3AADAAE6YwABviAAAAAEDwAMm7cADKjcAAAAEBATAAycEAAAAkk9gsNQAwAMnHQAAAJ/sYL6/AMADJ0AAAADAAE6FXcAA9R0BYLlkAMADJ2EAAADAAE6GYIwOAABdwAD1HQFguWQBPgNAIRzAAyeNgsADJ3vANJGVQQEAASsAwAD10sADJ3vAAyeUAE7AAyehwAMnsgAAlKxgwADyswEWwAMnvYDAAye0wDSRe5SssMRJwAMoZSIiIiIhhMADKGrANJHqARzAAyiSg8ADKIbANJGqQQEAASsAwAD10gEcwAMo1C7AAE6cwABviAEAAYPAAyj4wDSRqgDAAHBEASXAAykZgMADKRDANJF7YLDzARbAAylGgcADKT3ANJGIhEC+zz4BSsADKaYBgsADKa3ANJGVPgFKwAMp0wEcwAMp2i7AAE6dwABviAMAA4HAAyoHwDSRiIDAAyoRwDSRe4LAAyobwDSRlQDAAHA+BsAAcD6BTMADLSPAAy02wAM7/wAAwABOncAAb4gAAAABA8ADLVfAAzv/AAAAAwMDwAMtYQAAAJ/sYL6/AMADLYAAAACST2Cw1ADAAy2dAAAAwABOhV3AAPUdAWC5ZAAAXcAA9R0BYLlkAT4OQBzAAy3GgMADLb3ANJL5qjsBAAGBwAMtzsA0kwYAvt/AAy29wAMt1wBOwAMt7MADLfoAAKwlYMAAVP0BFsADLgWAwAMt/MA0kvmsJb7ETsADLivAAy4+AACsFWCw+wEWwAMuSYHAAy5AwDSTBqwVsNdOwAMubsADLoQAAMAATp5dwAD1HQFgwAD2XQEcwAMupRbAAy6XgMADLo7ANJL5rCW+xK7JAAAAAMAAVRdOwAMu2MADLuoAAMAATpddwAD1HQFguWQBHsADLvDAAO6CAQFguWQBHMADL18cwAMvLxbAAy8fhMADLwzANJOErCSxC10BAAEWwAMvUITAAy89wDSThJJesQEAwAD1nl0BAAGUAMAA9Z4ATsADL5TAAy+qAADAAE6fYMAA9HkBkz0cwAMv24bAAy/KwDST44CyAgACNQAAAAEAYMAA9HkBh8ADL9zANJRNNQAAAAEAYMAA9HkBj8ADL9zANJRNHMADL/EUAMA0lHcIAF0BAAGUAMAA9Z4UAMA0lHcIABzAAzAIgsADL/fANJMTRAEAAZMAwAD1LADAAPUtTsADMFXAAzBuAADAAE6gYMAA9HkBlE7AAzC2wAMwygAAwABOoWDAAPR5ARzAAzDyFsADMNqDwAMwzMA0k1+uyMAAVQldAQABlADAAPWeTsADMQDAAzEYAADAAE6iYMAA9HkBk07AAzElwAMxOAAAwABOo2DAAPR5AZM9HMADMVAWwAMxQi6sWMAAb4jAAG/iq7oCAAKBwAMxYcA0kwY0wAMxcwPAAzFzwAM3+AAAAAMDA8ADMX0AAACCF2DAAFg2AMADMYoAAACAsGDAAPZdAMADMZ4AAACC32DAAFa9AABgwAD1ggE+AUnAAzG0HMADMdAUwAMxuMA0lSsKAFwBAAEWwAMx5YTAAzHSwDSThJRssP8AwAD1pj4BScADMgUcwAMyIRTAAzIJwDSVKwoAXAEAARbAAzIxg8ADMiPANJNfrsjAAFUJAMAA9aY+AT0cwAMyZ4bAAzJWwDST44CyAgACNQAAAAEAYMAA9HkBh8ADMmjANJRNNQAAAAEAYMAA9HkBj8ADMmjANJRNHMADMn0UAMA0lj8PAF0BAAGUAMAA9Z4UAMA0lj8PABzAAzKUgsADMoPANJMTRAEAARzAAzK9FMADMqTANJTdCABdAQABNQAAAAEAYMAA9HkBFMADMr/ANJUrCgA1AAAAAQBgwAD0eQEVwAMyv8A0lSsKHMADMtYUAMA0lq4PAF0BAAGUAMAA9Z4UAMA0lq4PAADAAPWeAMAA9SwAwAD1LT4CQCEcwAMzChTAAzL9wDSVrA4AQQEAASsAwAD10sADMv3AAzMRAR7AAzMhq98CAAKBwAMzKsA0kwYkwAMzXgInwABOpBTAAzNZwDSVnQ0AAD0cwAMzfYbAAzNswDST44CyAgACNQAAAAEAYMAA9HkBh8ADM37ANJRNNQAAAAEAYMAA9HkBj8ADM37ANJRNHMADM5MUAMA0l24PAF0BAAGUAMAA9Z4UAMA0l24PABzAAzOtFsADM6cuntXAAJlsqtwCAAIUwAMzucA0lawOABbAAzPHLp/hwABv4AC4mwDAAPUtPgFJwAM1oCIcwAM1txTAAzWkwDSVQQsAXAEAARbAAzXPhcADNbnANJOnWsAA9UwAwAD1pgAcwAM16hTAAzXlwDSVnQ0AQQEAARzAAzYChcADNe3ANJOnRAEAARTAAzYDwDSVQQsAAMAA9SwAwAD2bD4BPRzAAzZ+hsADNm3ANJPjgLICAAI1AAAAAQBgwAD0eQGHwAM2f8A0lE01AAAAAQBgwAD0eQGPwAM2f8A0lE0cwAM2lBQAwDSYcg8AXQEAAZQAwAD1nhQAwDSYcg8AHMADNrmCwAM2qMA0kxNEAQABHMADNs4UwAM2usA0lPMJAF0BAAE1AAAAAQBgwAD0eQEUwAM20MA0lUELADUAAAABAGDAAPR5ARXAAzbQwDSVQQscwAM24hQAwDSY4Q8AXQEAAZQAwAD1nhQAwDSY4Q8AAMAA9Z4AwAD1LADAAPUtPgJAIRzAAzcWFMADNwnANJWsDgBBAQABKwDAAPXSwAM3CcADNx0BHsADNy2r3wIAAoHAAzc2wDSTBiTAAzdqAifAAE6kFMADN2XANJWdDQAAPRzAAzeJhsADN3jANJPjgLICAAI1AAAAAQBgwAD0eQGHwAM3isA0lE01AAAAAQBgwAD0eQGPwAM3isA0lE0cwAM3nxQAwDSZoQ8AXQEAAZQAwAD1nhQAwDSZoQ8AHMADN7kWwAM3sy6e1cAAmWyq3AIAAhTAAzfFwDSVrA4AFsADN9Mun+HAAG/gALibAMAA9S0AvwRJwAM3/xzAAzgLFsADOAMuryrAAJmIwABDpAEAAYHAAzgkwDSTBgDAAGNQPgFJwAM4NxzAAzhbFsADOEmDwAM4O8A0k1+SZ8AAVQVBAQABFsADOHuEwAM4aMA0k4SSXrEBAMAA9Zw+Ak7AAzjWwAM46QAAwABOpWDAAPR5ARzAAzkHFsADOPmDwAM468A0k1+yj8AAVQZdAQABlADAAPWeRcADOT0BwAM5RsADOVgAAMAATqZgwAD0eQGTARzAAzl7FMADOWnANJrHDQBcAQABFsADOYuDwAM5fcA0k1+SZ8AAVQUAwAD1pgEVwAM5qsA0mscNHMADObsUwAM5qsA0mscNAF0BAAGUAMAA9Z4+AT0cwAM53IbAAznLwDST44CyAgACNQAAAAEAYMAA9HkBh8ADOd3ANJRNNQAAAAEAYMAA9HkBj8ADOd3ANJRNHMADOfIUAMA0m0YOAF0BAAGUAMAA9Z4UAMA0m0YOABzAAzoXgsADOgbANJMTRAEAARzAAzorFMADOhjANJqKDABdAQABFMADOi3ANJrHDQAAwAD1ngDAAPUsAMAA9S0+AkAcwAM6iRbAAzp3g8ADOmnANJNfkmfAAFUFQQEAAZMAwAD1nMADOmnAAzqNAEbAAzrQwAM7RsADOuYAAACntGDAAFiJABzAAzsiFsADOwIWwAM69i6vksAAb4jAAG/ln+bAAHKcqn4BAAGBwAM7O8A0kwYArww+AT0cwAM7Y4bAAztSwDST44CyAgACNQAAAAEAYMAA9HkBh8ADO2TANJRNNQAAAAEAYMAA9HkBj8ADO2TANJRNHMADO3kUAMA0nF0NAF0BAAGUAMAA9Z4UAMA0nF0NABzAAzuNLsAATQLAAG+IAgACgcADO67ANJMGFMADO7jANJwGDAAAwABwPwDAAPUtP0rAAzvjAYbAAzvqwDST4wbAAHA/gUzAAzwEwAM8EcADPjYAAMAATQLAAG+IAAAAAQPAAzwxwAM+NgAAAAICAsADPEgAAACST2Cw1ADAAzxjAAAAp7RgwABYiQAAYLlkAT4CTsADPIDAAzyGAACVCmDAAFg2ARzAAzywFsADPJQWwAM8iC6vksAAb4jAAG/ln+bAAHKcqpIBAAEWwAM82IHAAzzLwDSdIZMNwABYiwCvJUnAAzzmFsADPPCCwAM86sA0nTizM8AAWEM+AUrAAz20ARzAAz3BFsADPbsuntXAAJlssG0CAAIcwAM90JWBVgAAAADAAPScFsADPdQun+HAAG/gALidPgFKwAM99QEcwAM+CBbAAz38LsAATMLAAG/zwABNFgIAAoLAAz4cwDSdOIDAAz4jwDSdFADAAJqvBsAAcECBTMADPqLAAz6nwANBFQAAwABOmcAAb4gAAAABA8ADPrrAA0EVAAAAAwMDwAM+ygAAAJJPYLDUAMADPu0AAADAAE6XXcAA9R0BYLlkAMADPw4AAAC0LGDAAFhdAABcAT4DTsADPzbAAz88AACB4mDAAHC+AR/AAz9CwABwyAcAB4DAAz9fwDSeRRbAAz9xLsAATNLAAG+IwABv6BbAAz+HLsAATNPAAG+IwABv6RbAAz+cLrbGwACZbxbAAz+rLsAATKrAAJluFsADP8IuwABMqcAAmW0cwAM/2i7AAE6MwABviAEAAYDAAz/owDSeRQDAAHBKAD0cwANABxbAAz/4LsAATNHAAG+IwABv508BAAGDwANAC8A0nnwAwAD1Lj0cwANA0C7AAE6nwABviAMAA4DAA0DnwDSeRYHAA0DxwDSeUoLAA0EEwDSeZwDAAHBBBsAAcEGBTMADQtTAA0LZwANSfwAAwABOp8AAb4gAAAABA8ADQu/AA1J/AAAAAwMDwANC/wAAAJJPYLDUAMADQyIAAADAAE6XXcAA9R0BYLlkAMADQ0MAAAC0LGDAAFhdAABcAT4UPRfAA0NXLsAATKofwANDa8AAmjAGAAYugMADQ5DANJ+bgMADQ6LANJ+bNQAAAAEAYMAAWF0BgsADQ7TANJ+9IxzAA0PBgwDANJ/8QQEAASsAABzAA0PQFsADQ8Qur5LAAG+IwABv5a+gAQABgMADQ+LANJ+bAMAAcreDAMA0n/wBYMAAWF0WwAND9S6vKMAAmYQWwANECS6vOsAAmYUAwACZbj0XwANELRbAA0QfLsAATKrAAJluwABNMhzAA0RLFsADRDkus4bAAG/twABFhwEAAYDAA0RYwDSfmwDAAHmTwACaBE7AA0R2wANEgAAAwABNEmDAAHmxARzAA0SUFsADRIIus4bAAG/twABNEwEAAYDAA0SlwDSfmwDAAHmWTsADRLnAA0TWAADAAE6oYMAA8rMBJcADROGAwANE2MA0n5tgsPM9F8ADRQAuwABM0sAAb4gfwANFE8AAmj0DAAMngRCAwANFLMA0n5uAwANFNsA0n5sAwABv6D0cwANFUxbAA0VFLsAATKrAAJluwABNGQIAAhbAA0VfLsAATNLAAG+IwABv6BzAA0VzFsADRW0untXAAJlssHMBAAEWwANFgy6f4cAAb+AAuKMAwACaJD0XwANFly7AAEypKsAAmW1OwANF1cADReMAAMAATqlgwAD0eQGTScADRewWwANF+YDAA0XwwDSfm5SssMQ+AT0cwANGIRbAA0YTLsAATKrAAJluwABNGQIAAhbAA0ZFFsADRjsWwANGLS7AAEyqwACZbsAATTLAAJoEsXzAAHmuHMADRmuBwANGWsA0n6hEAQABNQAAAAEAYMAA9HkBhcADRmzANKG0NQAAAAEAYMAA9HkBjcADRmzANKG0HMADRnmGAMA0ojZdAQABlADAAPWehgDANKI2AMAA9SwAwACaJD9OwANGj8ADRpYAAMAATqpgwADyswEqTsADRrXAA0a/AADAAEYeYMAActUBHMADRuUWwANG1RbAA0bJLp/hwABv4LLUwABAicAARgMBAAGAwANG8sA0n5sAwAB1Wj0ewANHAcAAcpcDAAMWwANHGS6vksAAb4jAAG/lgMADRybANJ+bNMADRzgDwANHOMADSY4AAAACAQHAA0dQAAAAkktgkgIAAcADR2AAAACyq2DAAPKzAStgwAD1ggE+BU7AA0d5wANHfwAAnY9gsPgBHMADR4uHwANHgcA0opzAAE0QAQABFMADR5zANKMbCAAAwABy2UnAA0etFMADR7HANKMpCQA+Aj0cwANH0xbAA0fFLsAATKrAAJluwABNGQIAAhTAA0ffwDSjQgoAHMADR+YuwABNWcAAb4gBAAEUwANIAMA0oxsIAADAAHAuAMAAmiRKwANIFAA/ScADSCoihMADSC7ANKDyABzAA0hYg8ADSE7ANKC3wABNRQEAARTAA0howDSjQgoAAMAAeaw+Aj2OwANI7sA0ooYpSsADSQUAP07AA0kowANJMQAAH2C5ZAEcwANJRIHAA0kzwDSfqEQBAAE1AAAAAQBgwAD0eQGFwANJRcA0obQ1AAAAAQBgwAD0eQGNwANJRcA0obQcwANJUhQAwDSkSAsAXQEAAZQAwAD1nhQAwDSkSAsAAMAA9Sw9HMADSWsWwANJXS7AAEyqwACZbsAATRkCAAIUwANJd8A0o0IKABTAA0l+wDSkJgsAAMAAmiQAScADSZaGwANJmsA0ooY+A07AA0m3wANJuwAAwABK92C5ZAEcwANJzoHAA0m9wDSfqEQBAAE1AAAAAQBgwAD0eQGFwANJz8A0obQ1AAAAAQBgwAD0eQGNwANJz8A0obQcwANJ3BQAwDSlAggAXQEAAZQAwAD1nhQAwDSlAggAAMAA9SxAJcADSfIUwANJ7sA0pN0IAGC6TMADSe7AA0n/AD0cwANKqhbAA0qcLsAATKrAAJlulmsEAAKDwANKtcA0oLcrAsAATqsUwANK3MA0pN0IAMAATqiEwANLCcA0oPLAAJoYP07AA0s/wANLSQAArctgsK0BFsADS1SAwANLS8A0n5uSabDNScADS2giIhbAA0t2gMADS23ANJ+bhEWwxQElwANLkIDAA0uHwDSfm2Cw8wAcwANLvRbAA0u1Lq8qwACZiMAAQ6MBAAEUwANL1cA0pbIIAADAAGNPPgJOwANL98ADTAAAAJRuYMAAWF0BHMADTCsWwANMGBbAA0wMLq+SwABviMAAb+Wf5sAAcpyqeQEAARTAA0w3wDSlsggAAK8GPRzAA0xgFsADTFIUwANMScA0pisJAJJEwABYYIO8AQABNMADTGgDwANMaMADTWoAAAABAQHAA0xpAAAAwABM/WDAAFg2AABgwAD1ggE+A07AA0yTwANMoAAAp7RgwABYiQEmwANMkwEUwANMosA0pqUKAGDAAFiJTsADTMbAA0zPAAAfYLlkARzAA0zigcADTNHANJ+oRAEAATUAAAABAGDAAPR5AYXAA0zjwDShtDUAAAABAGDAAPR5AY3AA0zjwDShtBzAA0zwFADANKcLDABdAQABlADAAPWeFADANKcLDAAAwAD1LD0cwANNCxbAA0z9LsAATKrAAJluwABNGQIAAhzAA00yFsADTSQuwABMqsAAmW7AAEz+AQABFMADTUnANKbACwAAwACaIxTAA01YwDSm6QwAAMAAmiQAwAD06z9JwANNdxzAA02DFsADTXsuryrAAJmIwABDpAEAAYDAA02cwDSfmwDAAGNQPgJOwANNtMADTckAAMAATqxgwADyswEcwANOABbAA03xFsADTd6AwANN1cA0n5usFbDXkl6xAUEBAAGTAMAA9ZxGwANODMADToDAA04iAAAAp7RgwABYiQAcwANOXBbAA04+FsADTjIur5LAAG+IwABv5Z/mwABynKp+AQABgMADTnXANJ+bAK8MPgNOwANOlwAAAB9guWQAScADTqkUwANOrcA0p+EJAD4BPRXAA075wDSoawscwANPBC7AAE0CwABviAIAAoDAA08lwDSfmxTAA08vwDSoKAoAAMAAcD8+AT0VwANPWcA0qGsLHMADT3WBwANPZMA0n6hEAQABNQAAAAEAYMAA9HkBhcADT3bANKG0NQAAAAEAYMAA9HkBjcADT3bANKG0HMADT4MUAMA0qN4MAF0BAAGUAMAA9Z4UAMA0qN4MAADAAPUsPRzAA0+oFsADT5ouwABMqsAAmW7AAE0ZAgACHMADT88WwANPwS7AAEyqwACZbsAATP4BAAEUwANP5sA0qCgKAADAAJojFMADT/XANKhrCwAAwACaJD9AIhzAA1AwhcADUCLANKG0QQEAARbAA1BFgcADUDPANJ+oWsAA9UwAwAD1nAEiIRzAA1BkFsADUFwuryrAAJmIwABDpAEAAYDAA1B9wDSfmwDAAGNQABzAA1DDHMADULMWwANQrIHAA1CawDSfqFrAAPVMgUEBAAGFwANQtcA0obQAwAD1n0EBAAEWwANQ9hbAA1DjgMADUNrANJ+brBWw15JesQEAwAD1nMADUCLAA1EEAR7AA1EOq98CAAKAwANRJMA0n5skAAonwABOrYXAA1FCwDShtCeevBbAA1FogcADUVbANJ+oWsAA9UwngQEnwABOroHAA1GgwDSfqCfAAE6vgMADUc3ANJ+bJ4ExAD0XwANR4C7AAEzTwABviBbAA1IvHMADUhUWwANSAhbAA1H2Lq+SwABviMAAb+Wf5sAAcpyqfQEAAYDAA1IlwDSfmwCvC5TcwABYy8AAb+k9F8ADUj8utsYxwANSVWC5ZADAAJlvPRzAA1JeLsAATVrAAG+IAQABgMADUnLANJ+bAMAAcEsGwABwQoFMwANShMADUonAA1NSAADAAE6bwABviAAAAAEDwANSnMADU1IAAAAAAAAAXAE+BE7AA1KywANSuQAAgRBguWQBHMADUskWwANSuy7AAEyqwACZbr/qAQABFsADUtMuwABM0sAAb4jAAG/oAMAAmiBOwANS+sADUwAAAIHiYMAAcL4BHMADUxEWwANTAi7AAEzRwABviMAAb+eVpgAAAADAAPU8PRzAA1MjLsAATrDAAG+IAQABgcADUzHANKuMAMAAcEM9HMADU0MWwANTPS62xsAAmW9PAQABgMADU0fANKtMAMAA9S4GwABwQ4FMwANTV8ADU1zAA1RnAADAAE6wwABviAAAAAEDwANTacADVGcAAAABAQHAA1N+AAAAgeJgwABwvgAAXAE+Bj0XwANTiy7AAEyqFsADU6GAwANTm8A0rDPAAE6xwABwxMAAmW49F8ADU7cuwABM0sAAb4gWwANTzIDAA1PGwDSsM8AATrLAAHDBwABv6D0XwANT4C7AAEypFsADU/eAwANT8cA0rDPAAEypwABwxcAAmW09F8ADVAsuwABM08AAb4gWwANUH4DAA1QZwDSsM8AATrPAAHDCwABv6UAWwANUPxbAA1Q5LrbGwACZb4D8wAD0/8ADVDnAA1RGAD0XwANUTS62xhbAA1RbgMADVFXANKwzwABOtMAAcMPAAJlvBsAAcESBTMADVGzAA1RxwANWUwAAwABOnMAAb4gAAAABA8ADVJTAA1ZTAAAAAQEBwANUnQAAAMAAToZgjA4AAGDAAPKzAT4BSsADVigBJcADVjuAwANWL8A0rVdgkYUGwABwRYFMwANWWMADVl3AA1dwAADAAE1mwABviAAAAAEDwANWaMADV3AAAAACAgLAA1Z2AAAAgIpguWQAwANWjwAAAKBhYLXQAABcAT4BScADVqgWwANWuxbAA1asLsAATNHAAG+IwABv54D8wAD0/z4BPRzAA1bMLsAATLMBAAEfwANW7LyyAwADFsADVvQuqYbAAJl+gMADVwnANK22gcADVxDANK3DAADAAJmbPgE9HMADV0YWwANXOC7AAEyqwACZbsAATRkCAAIWwANXUi7AAEzSwABviMAAb+iAwANXYMA0rbYAwACaJAbAAHBGgUzAA1d1wANXesADV8YAAMAATprAAG+IAAAAAQPAA1eDwANXxgAAAAEBAcADV5MAAACST2Cw1AAAXAE+AT0cwANXoy7AAE61wABviAEAAYDAA1e5wDSuogDAAHBHBsAAcEeBTMADWA/AA1gUwANcwgAAwABOtcAAb4gAAAABA8ADWCnAA1zCAAAAAQEBwANYOQAAAJJPYLDUAABcAT4EPRzAA1hJLsAATrbAAG+IAQABgMADWHDANK8EAMAAcEhOwANYkcADWJwAAMAARfpgwABy+wEcwANYqhbAA1ieLq+SwABviMAAb+XAAEX7AQABgMADWL7ANK8EAMAAcrZBR8ADWM0WwANY4IHAA1jVwDSvN4IcwABy/QUBwANY/hrAA1j+wABy8QA+Aj0cwANZEy7AAEzkAgACJsADWSQBgMADWSTANK8EYLDsJsADWTkBFsADWTmBwANZLsA0rzeDssAAcv5gjV4AwABwT0rAA1lIAAHAA1lmGsADWWbAAHLyAD4DTsADWY7AA1maAACYUGCNXgEmwANZjgEWwANZp4HAA1mcwDSvN4OywABy/mCNXj0cwANZzxbAA1nKFsADWcGCwANZtcA0r/uST41ikkyOTpQOAQABLgCRFUrAA1nlAAHAA1oDGsADWgPAAHLwAD4DTsADWhzAA1ohAACDsmCMDgEWwANaLoHAA1ojwDSvN4OywABy/knAA1o8JcADWkWCwANaQMA0sGpgjV4+Aj0cwANadxbAA1pyFsADWmkUwANaZMA0sGoCAWCNXpJPjWKSTI5OlA4BAAEuAJEVSsADWo8AScADWqYlwANar4LAA1qqwDSwamCNnz4CPRzAA1rfFsADWtoWwANa0RTAA1rMwDSwagIBYI2fkk+NpJJMjk6UDgEAAS4AkRVKwANa9wA/QsADWxEAAcADWy4awANbLsAAcvMAPgNOwANbS8ADW1AAAIOyYIwOARbAA1tdgcADW1LANK83g7LAAHL+ScADW2slwANbdILAA1tvwDSxQWCQzj4CPRzAA1utFsADW6gWwANbnxTAA1uawDSxQQIBYJDOkk+Q0JJMjk6UDgEAAS4AkRVKwANbxQBJwANb3CXAA1vlgsADW+DANLFBYJInPgI9HMADXB8WwANcGhbAA1wRFMADXAzANLFBAgFgkieST5IqkkyOTpQOAQABLgCRFUrAA1w3AD9CwANcUQAAAT4BQsADXG8APR7AA1yAq98CAAKAwANcicA0rwQkwANcvQInwABOt4HAA1yywDSvNwAGwABwSIFMwANdDsADXRPAA2J/AADAAE62wABviAAAAAEDwANdOcADYn8AAAABAQHAA11JAAAAkk9gsNQAAFwBPgZJwANdWSEWwANdahbAA11eLsAATMLAAG/zwABM+cAAmrJKwANdfQA/TsADXh3AA14lAACC1mDAAPKzASpJwANeMiIiIhbAA14/gMADXjbANLJpg96wwwEWwANeXIDAA15TwDSyaYRGsMIBFsADXnuAwANecsA0smmERbDFASXAA16dgMADXpTANLJpYLDzPgE9icADXz/ANLKkKT9JwANfWiGBwANfX8A0sqQ+AT0cwANfcC6/dwEAAYDAA1+IwDSyaQDAAHBYP07AA1+wwANfugAAwABGHmDAAHLVARzAA1/gFsADX9AWwANfxC6f4cAAb+Cy1MAAQInAAEYDAQABgMADX+3ANLJpAMAAdVo9HsADX/zAAHKXAwADFsADYBQur5LAAG+IwABv5YDAA2AhwDSyaTTAA2AzA8ADYDPAA2J6AAAAAgEBwANgSwAAAJJLYJICAAHAA2BbAAAAsqtgwADyswErYMAA9YIBPgZOwANgdMADYH4AAIDPYLD4ARzAA2CKgsADYIDANLNEwABNEAEAAYPAA2CbwDSzwwDAAHLZTsADYLnAA2DCAAAfYLlkARzAA2DSFsADYMQuwABMqsAAmW6/6gEAAYXAA2DcwDSz6gDAAJogTsADYPfAA2D8AACCF2DAAFg2ARzAA2EIgsADYP7ANLNEwABGIAIAAhbAA2EVLq+SwABviMAAb+WFwANhIsA0s+oAwABy3E7AA2FBAAAAwABOuGC5ZABJwANhWYHAA2FdwDSypD4BPRXAA2FwwDS0mggcwANhjxbAA2GDLsAATMLAAG/zwABNSgIAAobAA2GkwDS0HofAA2GuwDS0VADAAJqnPgE9FcADYczANLSaCBzAA2H3FsADYesuwABMwsAAb/PAAEzzAgAChsADYh7ANLQeh8ADYijANLRUAMAAmqg9HMADYksWwANiPS7AAEyqwACZbsAATRkCAAKFwANiV8A0s+oUwANiYsA0tJoIAADAAJokAAbAAHAAgUzAA2KEwANijcADYwEBAMAATrnAAG+IAAAAAQPAA2KswANjAQAAAAAAAABgwADyswE+AUrAA2KyASIWwANiyBbAA2K5LsAATNHAAG+IwABv54D8wAD0/wEWwANi5xbAA2LiFsADYtMuwABM0cAAb4jAAG/ngXnAAPUCwABOusAAcMYGwABwSYFMwANjBsADYwvAA2XrAADAAE67wABviAAAAAEDwANjIMADZesAAAABAQHAA2MwAAAAkw1gsNQAAGDAAPKzAT4CScADY4MlwANjj4DAA2OHwDS2IGCw8z4DTsADZMrAA2TRAACUQmCwrQEWwANk2xTAA2TTwDS2IAABYLDzkmmwzUnAA2TxHMADZRAWwANlARbAA2T1Lp/hwABv4KXZwABAh7MVAQABgcADZSfANLZPAMAAZbc+AUrAA2U6ASEcwANlXRbAA2VOFsADZUIun+HAAG/gpdnAAECHwABFDwEAAYHAA2V2wDS2TwDAAGW6P0rAA2WNASo/SsADZaUBFsADZdscwANlwxbAA2WsLqALwABv8augAQABgMADZdLANLYgALVCrji1JwbAAHBKgUzAA2XwwANl9cADZmwAAMAATozAAG+IAAAAAQPAA2YCwANmbAAAAAEBAcADZhIAAACTDWCw1AAAYMAA8rMBPgFKwANmIQEiFsADZiguwABOucAAb4jAAHAAABzAA2ZKLsAATrvAAG+IAQABgMADZmDANLdOAMAAcEkGwABwS4FMwANmccADZnbAA2kjAADAAE1awABviAAAAAEDwANmicADaSMAAAABAQHAA2aXAAAAkw1gsL8AAFwBPgdJwANmpiEWwANmsxbAA2arLm/AAJmAgk2BPkrAA2bSAD9JwANm3hzAA2bqgMADZuLANLfNQQEAARbAA2b8FsADZu0uqrXAAJmBqT6tEwDAAPXSSsADZwkAP07AA2dYwANnYwAAwABOvGC8MwEcwANnaxbAA2dlLp7VwACZbLBtAgACFsADZ4KAwANnesA0t82DicAA9dgWwANnjC6f4cAAb+AAuJ1PwANnnsADZ54AAAGDWWEBW1sAA8ADZ5/AA2e9AAAAAQEBwANnoAAAAIMGWwAAWwFKwANnpgEjHMADZ6iDwANnpsA0uKZBAQABKwDAAPXSJwAWwANnuYPAA2e3wDS4poCwAAFbTsADZ8rAA2fPAACAsGDAAPZdASQABRzAA2fVgsADZ9TANLiJIAEAARbAA2fegMADZ9bANLfNhAmwzgAAJ4KmHMADZ+uCwANn6sA0uIkgAQABFsADZ/SAwANn7MA0t82SabDNAAAngTEcwANoE4LAA2gSwDS4iSABAAGAwANoFMA0t80AAE7AA2guwANoOwAAmLVgvDMBHMADaEMWwANoPS6e1cAAmWywcAIAAoPAA2hVwDS46RbAA2hbLp/hwABv4AC4oD0cwANobS5PAQABH8ADaHW6pQQABBbAA2ibFsADaIwuqrXAAJmBqT6tEzHAA2i+YLlkAoHAA2i/wDS4OYTAA2jLwDS5bhbAA2j2FsADaOIuqYbAAJl+nS6x5jrAA2kLYMAAWDYAAADAAJmfAAAysYIAMrHDADKyCwAysloAMrKeADKy4AAysywAMrN0ADKz/gAytG8AMrZIADK2nQAyvsgAMr99ADLBRgAyxREAMsWJADLGZQAyyQwAMswyADLctQAy3WwAMt55ADLfgQAy4p8AMuanADLnTQAy7RwAMvLUADLz7AAy9gAAMvrQADL9igAy/pMAMwMUADMDwAAzCLMAMwoMADMLHAAzD2cAMxH0ADMbEgAzG6QAMxwjADMiCgAzIqQAMyMqADMjhQAzJa4AMyciADMoqwAzKPAAMyqbADMsSQAzLTIAMy9zADMy4AAzM90AMz9mADNFMQAzTasAM0+vADNRkQAzXocAM1/yADNhKQAzZJsAM2WTADNmVwAzZxsAM2qyADNrzgAzboMAM3KdADNz6gAzdYUAM3grADN4oQAzeR4AM3puADN7ugAzhS0AM49cADOQlgAzkgMAM5RUADOU6wAzlYIAM5YZADOWsAAzl7cAM5g8ADOaHgAznWoAM6QvADOrewAzq9gAM673ADO0MQAztwQAM7hWADO57gAzu8wAM70nADO9hAAzveEAM8CKADPBawAzxCQAM8WmADPGowAzxyoAM8gLADPKQwAzzfcAM888ADPPpQAz0JQAM9GDADPWQgAz10UAM9g9ADPcbwAz6pgAM+/2ADP0ZgA0AZwANAjOADQK3wA0C1EANBBaADQSMgA0E18ANBXqADQYcQA0HM0ANB7NADQh6AA0I6wANCpXADQrqwA0Lm0ANDfDADRDJgA0RZUANEaOADRG9gA0S6gANE33ADRO4AA0T5IANFRrADRXqQA0WrsANF72ADRhgAA0ZykANGgGADRyVAA0dKAANHXBADR2dQA0d0wANHhkADR6OQA0euIANHvgADR8mQA0fdYANIAfADSRSwA0kskANJzkADSeFQA0n2sANKsWADSsAwA0rScANK2GADSucgA0rtQANLI5ADS1aAA0tfAANLceADS3nQA0uhcAAAC6AsAAcLeBTMADaVTAA2lawANq3APAAE69AAABYMAA9cUAAAMEwABwuYFMwANprcADadIJwABNCwBdwAD1HQFgjV4BMcADadBgjV4ABMAAcLqBTMADairAA2pbCZVoAF3AAPVOAmCw0WC5ZAEywANqWWCw0WC5ZAAEwABwu4FMwANqssADatoJwABNHQBdwAD2DgFgsK0BHsADasjAALsfAAFgsK0AAAEFwABwvQAAAAAEAAADAAAAAAAAAAAAYMAAcLcBPwEJAQDAAPXbAAAAAAAAADS92QAAAAACwABwvoFMwANq38ADauXAA2y8A8AATr4AAAFgwAD1xQAABwTAAHDAgUzAA2sSwANrGgmSTwBgsNQABMAAcMGBTMADayrAA2s4CcAATrIAYLD4AATAAHDCgUzAA2tLwANrWAnAAE6zAGDAAFg2AATAAHDDgUzAA2t1wANrfQnAAE60AF3AAPUdAWC5ZAAEwABwxIFMwANrlcADa6UJwABOsQBgwACZ/wAEwABwxYFMwANrtMADa8IJwABMqQBgwADyswAEwABwxoFMwANr0cADa+cJwABOugBgwADyswABBcAAcMiBTMADa+zAA2vswANsugAAAAPAA2v/wANsugAAAAcHB8ADbAwAAASST2Cw1ADAA2whAAAEwABOsmCw+ADAA2w8AAAEwABOs2DAAFg2AMADbFYAAATAAE60XcAA9R0BYLlkAMADbGsAAATAAE6xYMAAmf8AwANsiAAABMAATKlgwADyswDAA2yjAAAEwABOumDAAPKzAABgwABwvgE/CAgBwABwwIAAwDS+5ggBwABwwYEAwDS+8wgBwABwwoIAwDS/AggBwABww4MAwDS/EwgBwABwxIQAwDS/KAgBwABwxYUAwDS/OQgBwABwxoYAwDS/SgkBwANr7MAA9dsAAAAAAAAANL/HAAAAAALAAHDJgUzAA2y/wANsxcADgTkDwABOvwAAAV2hEgFbAAAKBMAAcMuBTMADbSXAA21FBsAATsAAYMAA9HkBNw8EwABwzIFMwANtVsADbYAGwABOwQBgwAD0eQGWBMAAcM2BTMADbZHAA22wBsAATsIAYMAA9HkBNyIEwABwzoFMwANtwcADbeoGwABOwwBgwAD0eQGXBMAAcM+BTMADchPAA3IjCcAATpIAYMAA9HkABMAAcNCBTMADckvAA3JVCcAATo8AYMAA8rMABMAAcNGBTMADcmTAA3J4CYK5AGDAAPKzAATAAHDSgUzAA3KCwANylBjAAE7EAGDAAPKzASoEwABw04FMwANynMADcqkYwABOxQBgwAD0eQGTBMAAcNSBTMADcrTAA3LGGMAATsYAYMAA9l0BKwEFwABw7YFMwANzAsADcwLAA3NYAAAAA8ADcw7AA3NYAAAAAwMDwANzGwAABMAATpJgwAD0eQDAA3MyAAAEwABOj2DAAPKzAMADc0MAAASCuWDAAPKzAABgwABwyQE/BAgBwABwz4AAwDTBLggBwABw0IEAwDTBPwgBwABw0YIAwDTBUAkBwANzAqFIAAAAABQGwABw1oFMwANt78ADbfvAA29UAAHAAE7HAAAAAQPAA24HwANvVAAAAAUDA8ADbh4AAACrAmDAAHKYAMADbjkAAACST2Cw1ADAA25HAAAAwABOkmDAAPR5AALAA25lAAAAwABOj2DAAPKzASrAA259AAAAgrlgwADyswErYMAA8rMBPgFKwANuoAEcwANvQR7AA26nwABw1wUAA4DAA269wDTBxYHAA27JwDTB1ILAA27TwDTB4QLAAE6Pg8ADbv3ANMHzgrmEwANvK8A0wgVBAQABKwDAAPZsBsAAcNeBTMADb1nAA29nwANyBAABwABOyAAAAAEDwANvfMADcgQAAAAFAwPAA2+TAAAAqwJgwABymADAA2+uAAAAkk9gsNQAwANvvAAAAMAATpJgwAD0eQACwANv2gAAAMAATo9gwADyswEqwANv8gAAAIK5YMAA8rMBK2DAAPZdAT4FTsADcCLAA3AqAACWiWDAAHDJAR/AA3A4wABw7QMAA4LAA3BFwDTCuoPAA3BXwDTCzITAA3BjwDTC3gBOwANwjsADcJMAAIOyYI44AR7AA3CVwABylAIAAoDAA3ClwDTCnoHAA3CxwDTCrQA9HMADcMWGwANwwMA0wzKUDgEAAYXAA3DMwDTC9wCOSknAA3DaFsADcOeBwANw3sA0wq2ERbDFPgNOwANxD8ADcRoAAMAARfpgwABy+wEcwANxJ4DAA3EcwDTCnsAARfsBAAGBwANxO8A0wq0AwABytk7AA3FUwANxWQAAg7JgjA4BFsADcWaHwANxW8A0w5uDssAAcv5JwANxciXAA3F7FMADcXbANMPTCABgjV4+AT0cwANxqhbAA3GdFMADcZjANMPTCAFgjV6UwI1jg7wBAAE0wANxsgPAA3GywANxygAAAAEBAcADcbMAAACDWWCN6wAAWwFKwANxuQEcwANxuxTAA3G5wDTERwkAlA4BAAGFwANxwsA0wvcAje8AwAD06z8/SsADcd8BFsADce6FwANx5sA0wvfAAE7GwABw1AbAAHDrgUzAA3LKwANy08ADcv0BAMAATskAAAABA8ADcuDAA3L9AAAAAAAAAGDAAPKzAUrAA3LjASEcwANy9hbAA3LjLsAATsbAAHDUQQEAASsAwAD2bAbAAHDYgUzAA3NdwANzYsADdCgAAMAAQO0AAAABA8ADc27AA3QoAAAAAAAAAGDAAPKzAT4DScADc3ccwANzjBbAA3N7LsAATpLAAHDPQQEAASsAwAD1nErAA3OVASk/ScADc6YcwANztjUAAAABAGDAAPR5ARbAA3OqLsAATsXAAHDTNQAAAAEAYMAA9HkBF8ADc6ouwABOxRzAA3OzgADANMViXQEAAZQAwAD1nsAAcNOAAMA0xWKAiwEAARbAA3O4LsAATpLAAHDPAMAA9ag+Aj0jHMADc+UWwANz0i7AAE7GwABw1EEBAAErAMAA9mwXwANz0i7AAE7GJ8AATsrAAHDUKwFgwAD2XUrAA3QBASo/SsADdBkBKQbAAHDZgUzAA3QtwAN0OcADdRAAAJdPARrAA3QuwADuSwAAAQPAA3REwAN1EAAAAAEBAcADdE0AAACDsmCMDgAAWwE+BEnAA3RZFsADdF0uwABOycAAcOtKwAN0awA/ScADdHchHMADdHwuwABA7QAAAADAAHDYSsADdIwAP0nAA3SYFsADdJwuwABOxMAAcNI+Aj0jHMADdMMWwAN0sC7AAE7GwABw1EEBAAErAMAA9mwXwAN0sC7AAE7GJ8AATsvAAHDUKwFgwAD2XUrAA3TiAD89HMADdPmAwAN09MA0xkWUDwEAAS4AjBEGwABw2oFMwAN1FcADdSHAA3YFAACVzgEawAN1FsAA7ksAAAEDwAN1NcADdgUAAAABAQHAA3VJAAAAg7JgkcIAAFsBPgRJwAN1VSEcwAN1Wi7AAEDtAAAAAMAAcNhKwAN1agA/ScADdXYWwAN1ei7AAE7EwABw0j4CPSMcwAN1oRbAA3WOLsAATsbAAHDUQQEAASsAwAD2bBfAA3WOLsAATsYnwABOy8AAcNQrAWDAAPZdSsADdcAAPz0cwAN114DAA3XSwDTHMJQPAQABLgCRyD0XwAN18C7AAE7EKcAAcNIGwABw24FMwAN2CsADdhbAA3bPAACVhwEawAN2C8AA7ksAAAEDwAN2IMADds8AAAABAQHAA3YqAAAAg7JgkIYAAFsBPgNJwAN2NiEcwAN2Oy7AAEDtAAAAAMAAcNhKwAN2SwA/ScADdlcWwAN2Wy7AAE7EwABw0j4CPSMcwAN2ghbAA3ZvLsAATsbAAHDUQQEAASsAwAD2bBfAA3ZvLsAATsYnwABOy8AAcNQrAWDAAPZdSsADdqEAPz0cwAN2uIDAA3azwDTIEZQPAQABLgCQjQbAAHDdgUzAA3bUwAN21MADd/cAAMAATszAAG+IAAAAAQPAA3bfwAN39wAAAAEBAcADdugAAACDsmCMDgAAWwE+AknAA3enIRbAA3esLsAATo/AAHDQPSMcwAN3yxbAA3e4LsAATsbAAHDUQQEAASsAwAD2bBfAA3e4LsAATsYnuTfAAHDUKwFgwAD2XT89HMADd+CAwAN328A0yN+UDwEAAS4AjBEGwABw3oFMwAN3/MADeAjAA3hLAACVvAEawAN3/cAA7ksAAAEDwAN4GcADeEsAAAABAQHAA3gqAAAAg7JgkXgAAFsBPgE9HMADeDYuwABOzMAAb4gBAAGAwAN4QsA0yYgAwABw3QbAAHDfgUzAA3hQwAN4XMADeKMAAJXAARrAA3hRwADuSwAAAQPAA3hvwAN4owAAAAEBAcADeIIAAACDsmCRhQAAWwE+AT0cwAN4ji7AAE7MwABviAEAAYDAA3iawDTJ7QDAAHDdBsAAcOCBTMADeKjAA3i0wAN4+wAAlbYBGsADeKnAAO5LAAABA8ADeMfAA3j7AAAAAQEBwAN42gAAAIOyYJFiAABbAT4BPRzAA3jmLsAATszAAG+IAQABgMADePLANMpSAMAAcN0GwABw4YFMwAN5AMADeQzAA3lNAACVuAEawAN5AcAA7ksAAAEDwAN5HMADeU0AAAABAQHAA3ksAAAAg7JgkW0AAFsBPgE9HMADeTguwABOzMAAb4gBAAGAwAN5RMA0yrcAwABw3QbAAHDigUzAA3lSwAN5XsADeaQAAJXRARrAA3lTwADuSwAAAQPAA3lrwAN5pAAAAAEBAcADeXgAAACDsmCRzAAAWwE+AT0jHMADeZcWwAN5hC7AAE7GwABw1EEBAAErAMAA9mwXwAN5hC7AAE7GJ5mBwABw1CsBYMAA9l0GwABw44FMwAN5qcADebXAA3n/AACV2AEawAN5qsAA7ksAAAEDwAN5xMADef8AAAABAQHAA3nTAAAAg7JgkeQAAFsBPgE9IxzAA3nyFsADed8uwABOxsAAcNRBAQABKwDAAPZsF8ADed8uwABOxieZgcAAcNQrAWDAAPZdBsAAcOSBTMADegTAA3oQwAN6jwAAlZUBGsADegXAAO5LAAABA8ADeifAA3qPAAAAAQEBwAN6PgAAAIOyYJDOAABbAT4CScADekohHMADek8uwABA7QAAAADAAHDYSsADel8APz0jHMADen4WwAN6ay7AAE7GwABw1EEBAAErAMAA9mwXwAN6ay7AAE7GJ6vBwABw1CsBYMAA9l0GwABw5YFMwAN6lMADeqDAA3shAACV5wEawAN6lcAA7ksAAAEDwAN6uMADeyEAAAABAQHAA3rQAAAAg7JgkicAAFsBPgJJwAN63CEcwAN64S7AAEDtAAAAAMAAcNhKwAN68QA/PSMcwAN7EBbAA3r9LsAATsbAAHDUQQEAASsAwAD2bBfAA3r9LsAATsYnq8HAAHDUKwFgwAD2XQbAAHDmgUzAA3smwAN7MsADe+8AAJT/ARrAA3snwADuSwAAAQPAA3tDwAN77wAAAAEBAcADe1QAAACDsmCOOAAAWwE+AknAA3tgIRzAA3t1FsADe2mAwAN7ZMA0zUqU9Y47QQEAARrAA3uHjloAwAD10j4CPSMcwAN7qBbAA3uVLsAATsbAAHDUQQEAASsAwAD2bBfAA3uVLsAATsYnwABOzcAAcNQrAWDAAPZdSsADe8EAPz0cwAN72IDAA3vTwDTNSpQPAQABLgCOSwbAAHDngUzAA3v0wAN8AMADgCoAAJVSARrAA3v1wADuSwAAAQPAA3wawAOAKgAAAAEBAcADfDQAAACDsmCPvQAAWwE+Dk7AA31GwAN9UAAAlU9gjmMBFsADfVeAwAN9UsA0zhaVT4+/PRzAA31wgcADfWbANM4plA4BAAEuAI5nScADfYIWwAN9hi7AAE7JwABw60rAA32UAD9OwAN9pMADfbYAAMAATs5gwAD0eQEWwAN9uC7AAE7FwABw0z0cwAN90hbAA33NgMADfcjANM4WgTyPwJQOAQABLgCOZ0nAA33kFsADfeguwABOycAAcOtKwAN99gA/TsADfgbAA34QAADAAE7PYMAA9HkBHMADfhwWwAN+Ei7AAE7FwABw04FBAQABgsADfh7ANM5+AMAA9Z89F8ADfjYuwABOxYLAA35CwDTOfsAAcNM9HMADfmgWwAN+XoDAA35ZwDTOFpVQj8GUDgEAAS4AjmdJwAN+ehbAA35+LsAATsnAAHDrSsADfowAP07AA36cwAN+pgAAwABO0GDAAPR5ARzAA36yFsADfqguwABOxcAAcNOBQQEAAYLAA360wDTOfgDAAPWfPRfAA37MLsAATsUcwAN+9hzAA37qgsADftjANM5+XQEAAYPAA37swDTO3ADAAPWeXQEAAYTAA374wDTPagDAAPWewABw00nAA38HIiXAA38VgcADfwvANM4pYI52ACXAA39MFsADf0UWwAN/PBTAA38ywDTOKQEBYI52kkuOeJJRjBtgjjg+AT0XwAN/aC7AAE7FHMADf5CCwAN/fsA0zn5dAQABIxzAA3+dg8ADf5PANM7cgIsBAAGEwAN/n8A0z2oAwAD1qIPAA3+rwDTO3ITAA3+3wDTPagFgwAD0eQDAAPWewABw0z9JwAOACyEcwAOAEC7AAEDtAAAAAMAAcNhKwAOAIAA/BsAAcOiBTMADgC/AA4A7wAOAtgAAlPQBGsADgDDAAO5LAAABA8ADgFHAA4C2AAAAAQEBwAOAZwAAAIOyYI4vAABbAT4CScADgHMhFsADgHgugrnAAHDRSsADgI4APz0cwAOAn4DAA4CawDTQ35QPAQABLgCONAbAAHDpgUzAA4C7wAOAx8ADgTcAAJWwARrAA4C8wADuSwAAAQPAA4DbwAOBNwAAAAEBAcADgO8AAACDsmCRQQAAWwE+AknAA4D7IRbAA4EALoK5wABw0UrAA4EWAD89HMADgSIul08BAAGAwAOBLsA00VUAwABw2QAANMGZADTCcgA0xKEANMT4ADTGEgA0xv0ANMfeADTIrwA0yVUANMm6ADTKHwA0yoQANMrpADTLZQA0y+EANMx8ADTNFwA0zeMANNCsADTRIgA00ZoAAAAUAsAAcO6BTMADgYbAA4GMwAOh+QPAAE7RAAABXaESAVsAAAgEwABw8IFMwAOH0MADh90Jso8AYMAA9HkABMAAcPGBTMADh+zAA4gACYK5AGDAAPKzAATAAHDygUzAA4gPwAOIIAnAAE6NAGDAAPKzAATAAHDzgUzAA4guwAOIPgnAAE6SAGDAAPR5AATAAHD0gUzAA4hIwAOIWhjAAE7EAGDAAPKzASoEwABw9YFMwAOIYsADiG8YwABOxQBgwAD0eQGTBMAAcPaBTMADiHfAA4iEGMAATtIAYMAA9HkBkwTAAHD3gUzAA4iPwAOIoRjAAE7GAGDAAPZdASsBBcAAcSKBTMADiN3AA4jdwAOKKQAAAAPAA4jywAOKKQAAAAMDA8ADiP8AAASyj2DAAPR5AMADiRMAAASCuWDAAPKzAMADiS4AAATAAE6NYMAA8rMAAGDAAHDuAT8FCAHAAHDwgADANNMUCAHAAHDxgQDANNMjCAHAAHDyggDANNMyCADAAHDzHMADiiaAwAOKGMA00xRdAQABlADAAPWeCQHAA4jdoUgAAAAAJgbAAHD5gUzAA4PnwAOD88ADhVoAAcAATscAAAABA8ADg//AA4VaAAAABQMDwAOEFgAAAKsCYMAAcpgAwAOEMQAAAJJPYLDUAMADhD8AAACyj2DAAPR5AALAA4RaAAAAgrlgwADyswErwAOEewAAAMAATo1gwADyswErYMAA8rMBPgFKwAOEmwEcwAOFRx7AA4SiwABw+gUAA4DAA4S4wDTTx4HAA4TEwDTT1oLAA4TOwDTT4wKCuYPAA4T/wDTT88AATo2EwAOFNMA01ANBAQABKwDAAPZsBsAAcPqBTMADhV/AA4VtwAOHwQABwABOyAAAAAEDwAOFgsADh8EAAAAFAwPAA4WZAAAAqwJgwABymADAA4W0AAAAkk9gsNQAwAOFwgAAALKPYMAA9HkAAsADhd0AAACCuWDAAPKzASvAA4X+AAAAwABOjWDAAPKzAStgwAD2XQE+B0AhHMADhjqDwAOGJcA01MpBAQABKwDAAPXSwAOGJcADhkEAQCEcwAOGYYTAA4ZPwDTU2kEBAAErAMAA9dLAA4ZPwAOGaABOwAOGc8ADhnsAAJaJYMAAcO4BH8ADhoHAAHEiAwADgsADhqDANNS6g8ADhq/ANNTKhMADhsXANNTaAE7AA4btwAOG8gAAg7JgjjgBHsADhvTAAHKUAgACgMADhwTANNSegcADhxDANNStAEnAA4cfFsADhyyBwAOHI8A01K2ERbDFPgFKwAOHQwE1AAAAAQBgwABw7gGFwAOHSsA01Ts1AAAAAQBgwAD2XQEWwAOHUofAA4dSwDTVxcAATsbAAHD3IxzAA4dlFADANNXaCABBAQABKwDAAPZsF8ADh1KHwAOHUsA01cXAAE7GJ5hQwABw9xQAwDTV2ggAAWDAAPZdPz0cwAOHh4bAA4eCwDTVdpQOAQABhcADh47ANNU7AI5KSsADh5wBFsADh6uFwAOHo8A01TvAAE7GwABw9wbAAHEggUzAA4ilwAOIrsADiNgBAMAATskAAAABA8ADiLvAA4jYAAAAAAAAAGDAAPKzAUrAA4i+ASEcwAOI0RbAA4i+LsAATsbAAHD3QQEAASsAwAD2bAbAAHD7gUzAA4ouwAOKM8ADisoAAMAAQO0AAAABA8ADij/AA4rKAAAAAAAAAGDAAPKzAT4CScADikgcwAOKWBfAA4pOLsAATsUcwAOKTBbAA4pOLsAATsXAAHD1XQEAAZQAwAD1nsAAcPWAiwEAARbAA4paLsAATpLAAHDzAMAA9ag+Aj0jHMADiocWwAOKdC7AAE7GwABw90EBAAErAMAA9mwXwAOKdC7AAE7GJ8AATsrAAHD3KwFgwAD2XUrAA4qjASo/SsADirsBKQbAAHD8gUzAA4rPwAOK1MADi1wAAMAATtMAAAABA8ADiuDAA4tcAAAAAAAAAGDAAPKzAT4CScADiukcwAOK+RfAA4rvLsAATtIcwAOK7RbAA4rvLsAATtLAAHD2XQEAAZQAwAD1nsAAcPaAiwEAAZQAwAD1qD4CPSMcwAOLGRbAA4sGLsAATsbAAHD3QQEAASsAwAD2bBfAA4sGLsAATsYnwABO1MAAcPcrAWDAAPZdSsADizUBKj9KwAOLTQEpBsAAcP2BTMADi2HAA4ttwAOMRAAAl08BGsADi2LAAO5LAAABA8ADi3jAA4xEAAAAAQEBwAOLgQAAAIOyYIwOAABbAT4EScADi40WwAOLkS7AAE7JwABxIErAA4ufAD9JwAOLqxbAA4uvLsAATsTAAHD0PgI9IxzAA4vWFsADi8MuwABOxsAAcPdBAQABKwDAAPZsF8ADi8MuwABOxifAAE7LwABw9ysBYMAA9l1KwAOL9QA/ScADjAchHMADjAwuwABA7QAAAADAAHD7SsADjBwAPz0cwAOMLYDAA4wowDTYjJQPAQABLgCMEQbAAHD+gUzAA4xJwAOMVcADjRgAAJXOARrAA4xKwADuSwAAAQPAA4xpwAONGAAAAAEBAcADjH0AAACDsmCRwgAAWwE+A0nAA4yJFsADjI0uwABOxMAAcPQ+Aj0jHMADjLQWwAOMoS7AAE7GwABw90EBAAErAMAA9mwXwAOMoS7AAE7GJ8AATsvAAHD3KwFgwAD2XUrAA4zTAD89HMADjOqAwAOM5cA02XeUDwEAAS4Akcg9F8ADjQMuwABOxCnAAHD0BsAAcP+BTMADjR3AA40pwAONawAAlYcBGsADjR7AAO5LAAABA8ADjTPAA41rAAAAAQEBwAONPQAAAIOyYJCGAABbAT4BPSMcwAONXBbAA41JLsAATsbAAHD3QQEAASsAwAD2bBfAA41JLsAATsYnmWrAAHD3KwFgwAD2XQbAAHEAgUzAA41wwAONfMADjakAAJWsARrAA41xwADuSwAAAQPAA42PwAONqQAAAAEBAcADjaIAAACDsmCROQAAWwE+AAbAAHEBgUzAA42uwAONusADjhIAAJWjARrAA42vwADuSwAAAQPAA43SwAOOEgAAAAEBAcADjeoAAACDsmCRGQAAWwE+AT0cwAON+4DAA432wDTa+pQPAQABLgCRHwbAAHECgUzAA44XwAOOI8ADjl8AAJWnARrAA44YwADuSwAAAQPAA44twAOOXwAAAAEBAcADjjcAAACDsmCRIwAAWwE+AT0cwAOOSIDAA45DwDTbV5QPAQABLgCRKQbAAHEDgUzAA45kwAOOcMADjyoAAJV0ARrAA45lwADuSwAAAQPAA46CwAOPKgAAAAEBAcADjpQAAACDsmCQMQAAWwE+Aj0cwAOOoC7AAEDtAAAAAMAAcPtJwAOO5hzAA478FsADjvUWwAOO74DAA47qwDTbtICKkDNawAD2YYCLAQABNw4AwAD1qD0jHMADjxUWwAOPAi7AAE7GwABw90EBAAErAMAA9mwXwAOPAi7AAE7GJ8AATtXAAHD3KwFgwAD2XT8GwABxBIFMwAOPL8ADjzvAA4/HAACVHwEawAOPMMAA7ksAAAEDwAOPS8ADj8cAAAABAQHAA49bAAAAg7Jgjo4AAFsBPgNJwAOPZyEcwAOPbC7AAE7TAAAAAMAAcPxKwAOPfAA/ScADj4ghHMADj40uwABA7QAAAADAAHD7SsADj50APz0cwAOPtxbAA4+ugMADj6nANNx4hDyOkJQOAQABLgCOZwbAAHEFgUzAA4/MwAOP2MADkHAAAJUjARrAA4/NwADuSwAAAQPAA4/uwAOQcAAAAAEBAcADkAQAAACDsmCOswAAWwE+A0nAA5AQIRzAA5AVLsAATtMAAAAAwABw/ErAA5AlAD9JwAOQMSEcwAOQNi7AAEDtAAAAAMAAcPtKwAOQRgA/PRzAA5BgFsADkFeAwAOQUsA03RyEPI61lA4BAAEuAI5nBsAAcQaBTMADkHXAA5CBwAORKgAAlSEBGsADkHbAAO5LAAABA8ADkJHAA5EqAAAAAQEBwAOQoQAAAIOyYI6gAABbAT4EScADkK0hHMADkLIuwABO0wAAAADAAHD8SsADkMIAP0nAA5DOIRzAA5DTLsAAQO0AAAAAwABw+0rAA5DjAD89HMADkP0WwAOQ9IDAA5DvwDTdwIQ8jqKUDgEAAS4Ajmc9HMADkRoWwAORFIDAA5EPwDTdwICKjqSUDgEAAS4AjmcGwABxB4FMwAORL8ADkTvAA5HwAACVJQEawAORMMAA7ksAAAEDwAORUcADkfAAAAABAQHAA5FnAAAAg7JgjsQAAFsBPgRJwAORcyEcwAOReC7AAE7TAAAAAMAAcPxKwAORiAA/ScADkZQhHMADkZkuwABA7QAAAADAAHD7SsADkakAPz0cwAORwxbAA5G6gMADkbXANN6FhDyOxpQOAQABLgCOZz0cwAOR4BbAA5HagMADkdXANN6FgIqOyJQOAQABLgCOZwbAAHEIgUzAA5H1wAOSAcADkj8AAJUVARrAA5H2wADuSwAAAQPAA5IRwAOSPwAAAAEBAcADkiEAAACDsmCOdgAAWwE+AT0cwAOSLS7AAEDtAAAAAMAAcPsGwABxCYFMwAOSRMADklDAA5KUAACVgwEawAOSRcAA7ksAAAEDwAOSY8ADkpQAAAABAQHAA5J2AAAAg7JgkHQAAFsBPgE9HMADkoIuwABA7QAAAADAAHD7BsAAcQqBTMADkpnAA5KlwAOTQwAAlTABGsADkprAAO5LAAABA8ADkrPAA5NDAAAAAQEBwAOSwQAAAIOyYI8MAABbAT4CScADkxAhHMADkxUuwABO0wAAAADAAHD8SsADkyUAPz0cwAOTMS7AAEDtAAAAAMAAcPsGwABxC4FMwAOTSMADk1TAA5SdAACVQgEawAOTScAA7ksAAAEDwAOTbsADlJ0AAAABAQHAA5OIAAAAg7Jgj4UAAFsBPgRJwAOTlBbAA5OdgMADk5jANOBxg+KPiT4CPRzAA5P3LsAAQO0AAAAAwABw+0rAA5QNAD9JwAOUHyEcwAOUJC7AAE7TAAAAAMAAcPxKwAOUNAA/ScADlEAhHMADlEUuwABA7QAAAADAAHD7SsADlFUAPz0cwAOUYS7AAE7WwABviAIAAhbAA5R4gMADlHPANOBxVI+INQAAAAEAYI1eARbAA5SIgMADlIPANOBxgdOPjCMcwAOUkIEAwDThGEEBAAErAAArFsADlJCBAMA04RiST41iAWCOOADAAHEPBsAAcQyBTMADlKLAA5SuwAOVyQAAlUABGsADlKPAAO5LAAABA8ADlMPAA5XJAAAAAQEBwAOU2AAAAIOyYI9yAABbAT4EScADlOQWwAOU7YDAA5TowDThkoPij3Y+Aj0jHMADlREWwAOU/i7AAE7GwABw90EBAAErAMAA9mwXwAOU/i7AAE7GJ8AATtfAAHD3KwFgwAD2XUrAA5U5AD9JwAOVSyEcwAOVUC7AAE7TAAAAAMAAcPxKwAOVYAA/ScADlWwhHMADlXEuwABA7QAAAADAAHD7SsADlYEAPz0cwAOVjS7AAE7WwABviAIAAhbAA5WkgMADlZ/ANOGSVI91NQAAAAEAYI2fARbAA5W0gMADla/ANOGSgdOPeSMcwAOVvIEAwDTiX0EBAAErAAArFsADlbyBAMA04l+ST42kAWCOOADAAHEPBsAAcQ2BTMADlc7AA5XawAOWnQAAlTwBGsADlc/AAO5LAAABA8ADle/AA5adAAAAAQEBwAOWBAAAAIOyYI9NAABbAT4EScADlhAhHMADlhUuwABO0wAAAADAAHD8SsADliUAP0nAA5YxIRzAA5Y2LsAAQO0AAAAAwABw+0rAA5ZGAD89HMADlmAWwAOWV4DAA5ZSwDTi2YQ8j0+UDgEAAS4Ajmc9HMADlnIuwABO1sAAb4gCAAIWwAOWiYDAA5aEwDTi2VSPUSsAwABxDwbAAHEPgUzAA5aiwAOWosADmf4AAMAATtbAAG+IAAAAAQPAA5azwAOZ/gAAAAICAsADlsEAAABUYI8tAMADltwAAACB02COOAAAWwE+BknAA5bqFsADlv4WwAOW+IDAA5buwDTjo5UIjy+DaMAA9QA+Aj0jHMADlyUWwAOXEi7AAE7GwABw90EBAAErAMAA9mwXwAOXEi7AAE7GJ8AATtjAAHD3KwFgwAD2XUrAA5dBAD9OwAOXV8ADl10AAIDQYMAA9HkBHMADl3sWwAOXdBbAA5dpgMADl1/ANOOjlSqPMFrAAPVMXQEAARbAA5eNFsADl4eAwAOXfcA046OU/Y8xWsAA9UwAwAD1nknAA5eZHMADl6OCwAOXncA05CaAiwEAARbAA5elLrKPwABw8ADAAPWoPgI9IxzAA5fPFsADl7wuwABOxsAAcPdBAQABKwDAAPZsF8ADl7wuwABOxifAAE7ZwABw9ysBYMAA9l1KwAOX8QA/ScADmAQhHMADmA+BwAOYCMA0469BAQABKwDAAPXSPgFJwAOYfhzAA5jFHMADmKUWwAOYnhbAA5iJgcADmILANOOvlGyOP1rAAPVMXQEAARbAA5i+FsADmK6BwAOYp8A046+UbY5AWsAA9UwAwAD1noCLAQABgsADmNHANOQmAMAA9ag+Aj0jHMADmPUWwAOY4i7AAE7GwABw90EBAAErAMAA9mwXwAOY4i7AAE7GJ8AATtrAAHD3KwFgwAD2XUrAA5kYAD8/RsADmTPAA5lXwAOZPAAAAIMGYI5jABbAA5lLgMADmUHANOOjlSqPMD4CPRzAA5lhg8ADmV/ANOW4lA4BAAEuAI5nScADmXUWwAOZeS7AAE7JwABxIErAA5mHAD9GwAOZmcADmbjAA5miAAAAgwZgjzsAFsADmbGAwAOZp8A046OU/Y8xPgI9HMADmcgWwAOZwoPAA5nAwDTmFICKjz6UDgEAAS4AjmdJwAOZ3BbAA5ngLsAATsnAAHEgSsADme4APwbAAHEQgUzAA5oDwAOaD8ADmsQAAJVyARrAA5oEwADuSwAAAQPAA5ogwAOaxAAAAAEBAcADmjEAAACDsmCQFwAAWwE+AknAA5o9IhbAA5pGgMADmkHANOajlXGQHgAWwAOaVS7AAE6NwABw8j4CPRzAA5p9FsADmnWAwAOacMA05qOVSJAalA4BAAEuAI5nSsADmpEAPz0jHMADmrYWwAOaoy7AAE7GwABw90EBAAErAMAA9mwXwAOaoy7AAE7GJ5MgwABw9ysBYMAA9l0GwABxEYFMwAOaycADmtXAA5vuAACV5QEawAOaysAA7ksAAAEDwAOa7cADm+4AAAABAQHAA5sFAAAAg7JgkgIAAFsBPgFJwAObVSEcwAObahbAA5tegMADm1nANOdwkkWSCkEBAAErAMAA9dI+Az0XwAObfS7AAE7FHMADm3sWwAObfS7AAE7FwABw9YFBAQABlADAAPWfwABw9T0cwAObyhbAA5u+gMADm7nANOdwkkWSCpQOAQABLgCOZ0rAA5veAD8GwABxEoFMwAOb88ADm//AA5xOAACVvAEawAOb9MAA7ksAAAEDwAOcEMADnE4AAAABAQHAA5whAAAAg7JgkXgAAFsBPgE9IxzAA5xAFsADnC0uwABOxsAAcPdBAQABKwDAAPZsF8ADnC0uwABOxie5N8AAcPcrAWDAAPZdBsAAcROBTMADnFPAA5xfwAOcsgAAlcABGsADnFTAAO5LAAABA8ADnHLAA5yyAAAAAQEBwAOchQAAAIOyYJGFAABbAT4BPSMcwAOcpBbAA5yRLsAATsbAAHD3QQEAASsAwAD2bBfAA5yRLsAATsYnuTfAAHD3KwFgwAD2XQbAAHEUgUzAA5y3wAOcw8ADnRYAAJW2ARrAA5y4wADuSwAAAQPAA5zWwAOdFgAAAAEBAcADnOkAAACDsmCRYgAAWwE+AT0jHMADnQgWwAOc9S7AAE7GwABw90EBAAErAMAA9mwXwAOc9S7AAE7GJ7k3wABw9ysBYMAA9l0GwABxFYFMwAOdG8ADnSfAA510AACVuAEawAOdHMAA7ksAAAEDwAOdN8ADnXQAAAABAQHAA51HAAAAg7JgkW0AAFsBPgE9IxzAA51mFsADnVMuwABOxsAAcPdBAQABKwDAAPZsF8ADnVMuwABOxie5N8AAcPcrAWDAAPZdBsAAcRaBTMADnXnAA52FwAOdywAAldEBGsADnXrAAO5LAAABA8ADnZLAA53LAAAAAQEBwAOdnwAAAIOyYJHMAABbAT4BPSMcwAOdvhbAA52rLsAATsbAAHD3QQEAASsAwAD2bBfAA52rLsAATsYnmYHAAHD3KwFgwAD2XQbAAHEXgUzAA53QwAOd3MADniYAAJXYARrAA53RwADuSwAAAQPAA53rwAOeJgAAAAEBAcADnfoAAACDsmCR5AAAWwE+AT0jHMADnhkWwAOeBi7AAE7GwABw90EBAAErAMAA9mwXwAOeBi7AAE7GJ5mBwABw9ysBYMAA9l0GwABxGIFMwAOeK8ADnjfAA56CAACVzAEawAOeLMAA7ksAAAEDwAOeR8ADnoIAAAABAQHAA55XAAAAg7JgkbYAAFsBPgE9IxzAA552FsADnmMuwABOxsAAcPdBAQABKwDAAPZsF8ADnmMuwABOxieZfsAAcPcrAWDAAPZdBsAAcRmBTMADnofAA56TwAOe8QAAlZUBGsADnojAAO5LAAABA8ADnqrAA57xAAAAAQEBwAOewQAAAIOyYJDOAABbAT4BPSMcwAOe4BbAA57NLsAATsbAAHD3QQEAASsAwAD2bBfAA57NLsAATsYnq8HAAHD3KwFgwAD2XQbAAHEagUzAA572wAOfAsADn2IAAJXnARrAA573wADuSwAAAQPAA58awAOfYgAAAAEBAcADnzIAAACDsmCSJwAAWwE+AT0jHMADn1EWwAOfPi7AAE7GwABw90EBAAErAMAA9mwXwAOfPi7AAE7GJ6vBwABw9ysBYMAA9l0GwABxG4FMwAOfZ8ADn3PAA6BcAACU/wEawAOfaMAA7ksAAAEDwAOfhMADoFwAAAABAQHAA5+VAAAAg7JgjjgAAFsBPgJJwAOfoSEcwAOfthbAA5+qgMADn6XANOyPlPWOO0EBAAEawAOfyI5aAMAA9dI+Aj0jHMADn+kWwAOf1i7AAE7GwABw90EBAAErAMAA9mwXwAOf1i7AAE7GJ8AATs3AAHD3KwFgwAD2XUrAA6ACAD89HMADoEwWwAOgR4DAA6BCwDTsj5JMjk6UDgEAAS4AkRUGwABxHIFMwAOgYcADoG3AA6DqAACVUgEawAOgYsAA7ksAAAEDwAOgh8ADoOoAAAABAQHAA6ChAAAAg7Jgj70AAFsBPgJJwAOgrSEcwAOgsi7AAEDtAAAAAMAAcPtKwAOgwgA/PRzAA6DTgMADoM7ANO1klA8BAAEuAI/HBsAAcR2BTMADoO/AA6D7wAOhdgAAlPQBGsADoPDAAO5LAAABA8ADoRHAA6F2AAAAAQEBwAOhJwAAAIOyYI4vAABbAT4CScADoTMhFsADoTgugrnAAHDxSsADoU4APz0cwAOhX4DAA6FawDTt4JQPAQABLgCONAbAAHEegUzAA6F7wAOhh8ADofcAAJWwARrAA6F8wADuSwAAAQPAA6GbwAOh9wAAAAEBAcADoa8AAACDsmCRQQAAWwE+AknAA6G7IRbAA6HALoK5wABw8UrAA6HWAD89HMADoeIul08BAAGAwAOh7sA07lYAwABw/QAANNObADTUcgA01ncANNbOADTXmgA02FkANNlEADTaBgA02oIANNrHADTbJAA024EANNxFADTc6QA03Y0ANN5SADTfFwA0328ANN/HADTgPgA04V8ANOKmADTjcwA05nAANOc9ADToAAA06HwANOj4ADTpdAA06fAANOpsADTq6AA062QANOvgADTsXAA07TEANO2tADTuIwA07psAAAAmAsAAcSOBTMADorPAA6K5wAPHDQPAAE7bAAABYMAA9cUAABEEwABxJYFMwAOi8MADov0JwABO3ABgwABv3AAEwABxJoFMwAOjGcADoy0JwABO3QBgtdAABMAAcSeBTMADoz7AA6NIGMAATt4AYLktASsEwABxKIFMwAOjWMADo2UYwABO3wBguS0BKwTAAHEpgUzAA6N1wAOjgBjAAE7gAGC5LQErBMAAcSqBTMADo5DAA6OfGMAATuEAYLktASsEwABxK4FMwAOjr8ADo7wYwABO4gBguS0BKwTAAHEsgUzAA6PMwAOj3RjAAE7jAGC5LQErBMAAcS2BTMADo+3AA6P8GMAATuQAYLktASsEwABxLoFMwAOkDMADpBUYwABO5QBguS0BKwTAAHEvgUzAA6QewAOkLBjAAE7mAGC8CQErBMAAcTCBTMADpDzAA6RFGIF9AGC8UQErBMAAcTGBTMADpLvAA6TTGMAATucAYMAA8rMBKwTAAHEygUzAA6Th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AYDAAEuNwDU6XwDAAPVhBsAAcZiBT8AAS5vAAEujwABNnAQBq0EAAAABA8AAS8HAAE2cAAAAAQEBwABLzQAAAIL9YMAAWmkAAGDAAHGKAT4HPRzAAEvigMAAS9vANTrJghsBAAEawABL6MAAcYwAwABaa07AAEwCwABMGAAAwABPMV3AAPTbAWCw+AEcwABMIYDAAEwawDU6yb/sAAFgsPgAAMAAWp5OwABMOcAATEMAALF8YLD4ARzAAExMgMAATEXANTrJv+sAAAAAwABanU7AAEx8wABMiwAAwABPJV3AAPVOAmCw+GDAAHIQARzAAEycgMAATJXANTrJrlgBAmCw+GDAAHIQATTAAEy+A8AATL7AAEzXAAAAAAAAAGDAAHIQAUrAAEzEASbAAEzEARzAAEzLgMAATMTANTrJptEAAAAAwABamGDAAHIQAMAAWp9OwABM6cAATPcAAMAARYVdwAD2DgFgsPgBHMAATQ0cwABNAIDAAEz5wDU6yb/sAAFgsPgAAMAAWp6R4gAAAADAAPTyPRzAAE0hgMAATRrANTrJghMBAAEawABNJcAAcYwAwABabErAAE0vAR/AAE06wABxmgQABIHAAE1YwDU7BILAAE1vwDU7OIPAAE16wDU7YYTAAE2KwDU74wAGwABxloFPwABNocAATbLAAE7cAACrTQEawABNosAA7ksAAAEDwABNwcAATtwAAAABAQHAAE3LAAAAhAFgwABaJwAAXAE+Bz0cwABN3IDAAE3XwDU8sa2LAQABGsAATfTAAHmdAMAAWjg9HMAATgmAwABOBMA1PLGCGwEAARrAAE4PwABxjADAAFosPRzAAE4egMAAThnANTyxv8sBAAEWwABOKi7AAE8xwABxjQDAAFpcPRzAAE5LgMAATkbANTyxv8oBAAEWwABOXC6xfMAAcY4AwABaWz0cwABOcYDAAE5swDU8sa5cAgFgwAByEAIWwABOfy7AAE8lwABxjxbAAE6UgMAATo/ANTyxpsLAAFpWAMAAWl09HMAATquAwABOpsA1PLG/ywEAARbAAE63LsAARYXAAHGQAMAAWlw9HMAATtCAwABOy8A1PLGCEwEAARrAAE7UwABxjADAAFotAAA1N/cANTjEADU5OQA1OioANTqfADU8fgA1Pd4AAAAGAsAAcZyBT8AATuHAAE7nwABWYwPA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pOfAAJrRwACbtQAANXsVADV7RAA1fWYAAAACAsAAckiBT8AAk/LAAJP4wACbAzfAAE9hAAABYMAAcj4AAWDAAJu8AAEFwAByTgAAAAAEAAADAAAAAAACAgIAAAAAwABF+lsAAAAAAMAAT11bAABgwABySAE/AQkAAMAAckcCAAKAAMA1fbWBAMA1fb8AAgbAAHJKgVDAAEq1wABKycAAStUBArXgAAAAAQPAAErVwABK1QAAAAAAAABgjjgABsAAckyBUMAAStrAAErrwABOoAAAq7oBGsAAStvAAO5LAAABA8AASvvAAE6gAAAABAMDwABLEgAAAKsCYMAAcpgAwABLNwAAAKwVYLD7AMAAS1YAAACBKGEDYMAAWDZgwAD2XWDAAFa9XAABwABLnQAAAJXdYMAA8rMBKlwBPgJPwABLtcAAS7oAAAHAAE0PXgABAgFgkgIBtdVgwADyswBcAAPAAEvJwABNgAAAAAIBAcAAS+EAAACDsmCSAgABwABL7QAAALXVYMAA8rMBKVwBPgVOwABMEcAATBYAAIIXYMAAWDYBHMAATCOAwABMGMA1fkzAAEzcAQABFsAATDSFwABML8A1fsuCF5IIAMAAcp5OwABMSMAATE0AAICwYMAA9l0BFsAATFSFwABMT8A1fsuAsJIGTsAATG4AAACC32DAAFa9AEnAAEyChsAATIbANX7ZPgFJwABMnCEcwABMsRbAAEylhcAATKDANX7LkkWSCkEBAAErAMAA9dI+AT0VwABMxsA1f1IJHMAATOCAwABM1cA1fkzAAEJbAQABFsAATPaFwABM8cA1fsuSRZIKAMAAcrI+AT0VwABNH8A1f1IJH8AATTLAAFcPAAAAAD89HMAATWCCwABNX8A1fmggAwADh8AATWHANX7uFMAATWfANX8tCAAUwABNbcA1f1IJAAAAPR7AAE2HwABylgQAAxbAAE2tLrXgwACbvoHAAE27wDV+WzTAAE3XA8AATdfAAE5+AAAAAwEBwABN7wAAAIDPYJICAALAAE4RAAAAsqtgwADyswErwABOAAAAALXVYMAA8rMBK2DAAPWCAT4BScAATiQhhsAATinANYBkPgE9HMAATkyEwABOPcA1fp4gAgABhcAATk3ANYBWAbXVh8AATmTANYB0AD8BwABPYoPAAE6TwDV+hQAANX3qADV+GQA1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NoS+wABy/yQABCfAAE9pgcAAoYvANYm1J4M7J8AAT2oASsAAodIBF8AAodkujwzAAHFiHMAAoeyAwACh4cA1iWDAAEzcAQABgsAAofjANYnqAMAAmrjAAHJhBsAAcmeBT8AAogbAAKIlwACjAAAAwABPawEawACiB8AA7ksAAAEDwACiP8AAowAAAAABAQHAAKJPAAAAqwJgwACatgAAYMAAQOwBPgI9HsAAomGr3wIAAhbAAKJ+FsAAonMuwABF+sAAcjaEvsAAcv8kAAQnwABPbBbAAKKkLsAARfrAAHI2J4M7J8AAT20ASsAAovEBKwbAAHJpgU/AAKMFwACjLcAAo2oBAMAAT2UBGsAAowbAAO5LAAABA8AAo0XAAKNqAAAAAAAAAGDAAJqRAUrAAKNOARrAAKNmwACalwAANYceADWILwA1iS0ANYvGADWMXQA1jKgAAAAFAsAAcmyBT8AAo2/AAKN1wACntAPAAE9uAAABYMAA9cUAAWDAAHL7BATAAHJugU/AAKQvwACkUAaDqwBgwAD2XQEnwABPbwTAAHJvgU/AAKRywACkegmEvgEawACkVsAA7ktgq+EABMAAcnCBT8AApJvAAKSfCYIcARrAAKR/wADuS2DAAHLqAATAAHJxgU/AAKTBwACkxQmDsgEawACkpMAA7ktgjBUAAQXAAHJ4gU/AAKTKwACkysAApWUAAAADwACk4cAApWUAAAADAwPAAKTnAAAEhL5gq+EAwACk9gAABIIcYMAAcuoAwAClAQAABIOyYIwVAABgwABybAE/BQgBwAByb4AAwDWNkwgBwABycIEAwDWNoAgBwABycYIAwDWNrwwAQCIcwAClKIHAAKUjwDWNoEEBAAEawAClNsAAcvMAwAD10gEcwAClSoHAAKVFwDWNoEEBAAEawAClWMAAcvQAwAD10sAApSPAAKVkAAkBwACkysAA9dsAAAAAAwbAAHJzgU/AAKVqwAClcsAAppcEAatBAAAAAQPAAKWcwACmlwAAAAICAsAApa8AAACC/WDAAFppAMAApcIAAACCHGDAAHLqAABgwABybAE+BT0cwACl1YDAAKXOwDWOcIIbAQABGsAApdvAAHJuAMAAWmtOwACl8MAApfkAAIS+YKvhARzAAKYCgMAApfvANY5wv+kAAAAAwABaj07AAKYkwACmKQAAg7Jg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gU/AAKy7wACswMAArO0AAsAAQ6YAAAABA8AArNrAAKztAAAAAQEBwACs5AAAAJ/sYL6/AABgwADyswAGwAByj4FPwACs8sAArPfAAK1LAALAAEOnAAAAAQPAAK0WwACtSwAAAAICAsAArScAAACU3WDAAFg2AMAArTkAAACSZ2DAAPR5AABgwADyswAAADWUswA1lPMANZUzADWVcwA1lbMANZXzADWWMwA1loQAAAAHAAEGwABxZYFPwABCacAAQm/AAES2AAHAAE92wABxYgAAAAEDwABCeMAARLYAAAADAwPAAEKGAAAAkktgjA4AwABCogAAAMAARh5gwABy1QDAAEK8AAAAqwJgwABymAAAYLD4AT4DQCIlwABC3IDAAELTwDWW22CSAgElwABDCIDAAEL/wDWW22DAAHaIwABC08AAQyYAScAAQyslwABDOIDAAEMvwDWW22CSAj4BSsAAQ1kBHMAAQ2qBwABDYMA1lujAAE0QAQABFMAAQ3vANZbbAAFgkgIAwABy2UnAAEOPJcAAQ5yAwABDk8A1lttgwAB2iD4BSsAAQ8IBHMAAQ9OBwABDycA1lujAAE1LAgACFsAAQ/EUwABD6MA1ltsAAWDAAHaIghfAAHaLgsAAQ/fANZb5AMAActo/PTDAAEQKH8AARBTAAPOsAQABJAADJ8AAT3cnwABPeBbAAESmgMAARJ3ANZbbhQPAAPXZAAGBTwA1mBgANRYMADUgWwA1NGgANT3/ADVEMQA1SvMANVcTADVahAA1XQgANWMpADVpNwA1bK8ANXDRADV1QQA1eNIANXp+ADV9dwA1gOYANYZIADWMxQA1kNQANZRlADWWqQAAABYANZarADWYGAAAAAEAwABykgCBUQAAGIDaAACL860rAIEDAACevgAAgRwAAMAAVo4AAIE/AACskgABAQKpfaqMgYsAALCYAACBrwAAwAB5+wAAgdAAAMAAVMsAAIHxAADAAFgxAACCEgAAscYAAIJDAADAAHYRAACCYAAAwACZUgAAgooAAMAAkDQAAIKkAADAAF9cggIAgsIAAMAAa5gAAILlAADAAJWZAACDFAAAwABxYgABAQHAAE9Tg0kAAMAAZ4oAAQEBwABGboOBAADAAG8kAACDowAAwABaIQAAg9EAAMAAmpAAAIP0AADAAFT8AACEHgAAvq0AAIRC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wABNtAAAAAEDpgGmGQAAAAEBAaYUAAAAg7JgkVgAAGDAAPKzAAbAAHLfgVGmlqahptAAAsAATbcAAAABA6a2ptAAAAABAQGmywAAAIOyYJFOAABgwAB6BQAGwABy4IFRp0unVqeFAALAAE3AAAAAAQOnbKeFAAAAAQEBp4AAAACDsmCRkwAAYMAAegUABsAAcuGBUafTp96oHQACwABNvAAAAAEDp/yoHQAAAAEBAagYAAAAg7JgkawAAGDAAHoFAAbAAHLigVGok6ieqMwAAsAATv4AAAABA6i4qMwAAAABAQGoxwAAAIOyYJGeAABgwAB6BQAGwABy44FRqUCpS6lyAALAAE2MAAAAAQOpXalyAAAAAQEBqW0AAACDsmCRbQAAYMAAegUABsAAcuSBUanqqfWqHgACwABNawAAAAEDqgiqHgAAAAEBAaoZAAAAg7JgkXgAAGDAAHoFAAbAAHLlgVGqmaqkqtEAAsAATXoAAAABA6q5qtEAAAABAQGqzAAAAIOyYJGFAABgwAB6BQAGwABy5oFRq0urVquDAALAAE2IAAAAAQOra6uDAAAAAQEBq34AAACDsmCRYgAAYMAAegUABsAAcueBUau9q8Kr4AACq00AAAABA6vRq+AAAAABAQGr2wAAAIQBYMAAWicAAFwAAAA1pkAANaZlADWmlwA1ptYANacIADWnSQA1p30ANaexADWn5QA1qBkANahNADWogQA1qLUANajpADWpHQA1qVEANamBAAAAEALAAHLqgVGwX7Bks3ELtnoAAAFgwAD1xQAACgTAAHLsgVGwZLBkCScAYMAA9HkABMAAcu6BUbBksGQJKMAAcpIAYMAA9l0ABMAAcu+BUbBksGQGKQBdwAD1HQFgwABy6gE6AGDAAHLqBxoAwABy8BoAwABy8RoAwABy8hoAwABy8xoAwABy9BoAwABy9RoAwABy9gTAAHLwgVGworCiBsAAT4MAYMAAcuoBIADAAHL6AgACkyfAAE+EAATAAHLxgVGw+rD6BphQAGDAAHLqASAAwABy+gIAApQnwABPhQAEwABy8oFRsU+xTwbAAEZSAGDAAHLqASAAwABy+gIAApUnwABPhgAEwABy84FRsdux2wbAAEFxAGDAAHLqASAAwABy+gIAApYnwABPhwAEwABy9IFRsluyWwbAAEZYAGDAAHLqASAA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AABgwABzNgE+BD0cwABHZYDAAEdewDW5EoIbAQABGsAAR2vAAHM4AMAAWmtOwABHfsAAR4MAAIOyYIzOARzAAEeMgMAAR4XANbkSv9wAAAAAwABafT0cwABHqIDAAEehwDW5EoITAQABGsAAR6zAAHM4AMAAWmxKwABHtgEfwABHwcAAc0MBAAGBwABH2MA1uU0ABsAAcz2BUcAAR+bAAEf3wABIewAAq00BGsAAR+fAAO5LAAABA8AASAbAAEh7AAAAAQEBwABIEAAAAIQBYMAAWicAAFwBPgQ9HMAASCGAwABIHMA1ueatiwEAARbAAEgrLoIcwABzQQDAAFo4PRzAAEg7gMAASDbANbnmghsBAAEawABIQcAAczgAwABaLD0cwABIUIDAAEhLwDW55pbrAQABFsAASF8ug7LAAHM5AMAAWjs9HMAASG+AwABIasA1ueaCEwEAARrAAEhzwABzOADAAFotBsAAc0CBUcAASIDAAEibwABIygEAhL4BGsAASIHAAO5LAAABA8AASKTAAEjKAAAAAAAAAGCr4QFKwABIpwEewABIp8AAkDkBAAEWwABIxS6DssAAczkABsAAc0GBUcAASM/AAEjpwABJAgEAghwBGsAASNDAAO5LAAABA8AASO7AAEkCAAAAAAAAAGDAAHMEAUrAAEjxARrAAEj7wABzCgbAAHM+gVHAAEkHwABJGsAASXMAACMBGsAASQjAAO5LAAABA8AASSLAAElzAAAAAAAAAGDAAPZdAUrAAEkoASQACCfAAE+bFsAASUYughzAAHNBJ4CbJ8AAT5QWwABJWi6DssAAczknwABPWxbAAElpLoS+wABzQCeC2gAANbjoADW5swA1uogANbrfADW7KAA1u6MAAAAFAAQGwABylIFRrGesd6/bAAHAAE+cAAAAAQOshq/bAAAAAgICrJsAAACrAmDAAHKYAKy0AAAAkltgsL8AAGCOOAE+A06s0azcAADAAEX6YMAAcvsBHKzpgKzewDW75MAARfsBAAGBrP3ANbvxAMAAcrZBR60IFq0bgq0QwDW8BIIcwABy/QQBrTcarTfAAHLwAD4DTq1OrVMAAIOyYIwOARatYIKtVcA1vASDssAAcv5JrWwlrXWDrXDANbxUYI2fPgFKrZABFq2cFK2XwDW8VAMBYI2fkk+NpD9CrbQAAq3PGq3P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TrSRtJcAACdgwAD0eQEctKCEtJnANd9oq0YAAAAAwABadE60urTCAACWAWDAAGe7AR60yMAAZ8EBAAGEtOTANd9oAD0ctQCFtPPANeBFwABP3gIAAhS1EMA141EKABS1F8A143MLAADAAHRgPRy1MoS1K8A132iCEwEAARq1NsAAc08AwABabD0ctU+EtUjANd9oghsBAAEatVXAAHNQAMAAWmtOtWm1dQAApDFgwAD0eQEctX6EtXfANd9oq0YAAAAAwABadEW1jQG1lrWYAABbYMAA9HkBkwEctZ8UtZ3ANeQbCgBcAQABFLWhwDXj9QkAAMAA9aYBFbWuwDXkGwocta8Uta7ANeQbCgBdAQABlADAAPWePgNOtb+1xQAAJ2DAAPR5ARy1zoS1x8A132irRgAAAADAAFp0TrXnte4AAJJbYMAAZ90BHrX0wABn5QEAAYS2D8A132gAPRy2K4W2HsA14EXAAE/fAgACFLY6wDXkagsAFLZBwDXkjAwAAMAAdGE9HLZbhLZUwDXfaIITAQABGrZfwABzUADAAFpsPRy2d4S2cMA132iCGwEAARq2fcAAc1EAwABaa062l7apAADAAEBBYMAA9HkBHLayhLarwDXfaKtGAAAAAMAAWnRFtsEBtsq2zAAAW2DAAPR5AZMBHLbTFLbRwDXlNgsAXAEAARS21cA15Q4KAADAAPWmARW26MA15TYLHLbpFLbowDXlNgsAXQEAAZQAwAD1nj4DTrb5tv8AACdgwAD0eQEctwiEtwHANd9oq0YAAAAAwABadE63J7c0AACntGDAAGikAR63OsAAaKsBAAGEt1vANd9oAD0ct3eFt2rANeBFwABP4AIAAhS3jMA15YUMABS3k8A15acNAADAAHRiPRy3s4S3rMA132iCEwEAARq3t8AAc1EAwABabD0Xt84ur+8ft9/AAJrgAQABMbfrYJPfAYO37MA1310AwABzZz0cuASEt/3ANd9oghsBAAEauArAAHNSAMAAWms9HLgshbgfwDXgRcAAT+EBAAE0uDsDuDu5nwAAAAICArhAAAAAJ2DAAPR5ALhQAAAAhAlgwABnjQAAYMAA9YIBPgVOuG24cQAAk1pgwACa4QEeuHfAAJrqAQABhLiWwDXfaABOuLK4twAAEmDAAJr0AR64vcAAmvoBAAGEuN3ANd9oAD0cuPYWuOwuntLAAHNtgLICAAIWuPsUuPfANeaPDQCECcAAmuQcuRoWuRAuhCzAAHNowABP4gQDYMAAhqpgwACa9GDAAJrhBBS5KsA15mwLABS5McA15ngMABS5OsA15rAOABS5QMA15o8NAADAAIcCAMAA9WM9HLlXFrlMLq/vwABzZ8AAT8gBAAEUuWfANeaPDQAAwACa3EAcuYAUuXrANeZsCwBBAQABFrmLFLmDwDXmeAwAomrAAIasAMAA9Zy5ermXAADAAHRjPRy5rYS5psA132iCEwEAARq5scAAc1IAwABabD0cuc6EucfANd9oghsBAAEaudTAAHNTAMAAWms9HLn0hbnnwDXgRZ/zAQABNLoBA7oBu94AAAACAgK6BgAAACdgwAD0eQC6FAAAAJk8YMAAZ6wAAGDAAPWCAT4FTrorui8AAJNaYMAAmwwBHro1wACbDgEAAYS6UsA132gATrpsunEAABJgwACbXgEeunfAAJtgAQABhLqVwDXfaAA9HLqsFrqkLqr5wABzboCyAgACFrqxFLqtwDXoEw0AmTzAAJsXHLrAFrq4LpQ4wABzacAAT+IEA2DAAIawYMAAm15gwACbDAQUutDANefwCwAUutfANef8DAAUutzANeg0DgAUuuLANegTDQAAwACHAgDAAPVjSbruIiEluvYUuvLANef8DABgwAByBAAhJbsJFLsFwDXn/AwAYMAAccw+AT0cu4wcu3gWu24uhCzAAHNowABPxAEAARa7gxS7f8A15/wMAIQJwABnrwDAAIb8n/QCAAIWu54Uu5rANef8DACAsMAAZ7AUu6TANegTDQAAwACa7T9AHLvFFLu/wDXn8AsAQQEAARa7zBS7yMA15/wMAMAAQCHAAIayAMAA9Zy7v7vWAADAAHRkPRy77IS75cA132iCEwEAARq78MAAc1MAwABabD0cvAuEvATANd9oghsBAAEavBHAAHNUAMAAWms9HLwzhbwmwDXgRcAAT+MBAAE0vEIDvEK9KQAAAAICArxHAAAAJ2DAAPR5ALxXAAAAlgFgwABnuwAAYMAA9YIBPgNOvHW8egAAEmDAAJxGAR68gMAAnEwBAAGEvKDANd9oAD0cvLkWvK8uwABPucAAc2+AsgIAAha8vxS8usA16fgNAIOywACcSRy80Ba8xy6UN8AAc2zAAE/iAwJgwACGymDA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ghsBAAEawABEJMAAc04AwABaLD0cwABEOIDAAEQzwDXv6atRAQABFsAAREkWwABEQS6UOMAAc2mX/8AAhtwAwABaMj0cwABEXBbAAERULpQ4wABzaYO8AQNgwABnrGDAAJteYMAAmwwBNMAARGQDwABEZMAARMUAAAADAwPAAERsAAAAmTxgwABnrADAAERxAAAAgKhbAMAARHQAAADAAE/lWwAAYMAA9YIBPgI9HMAARIWAwABEgMA17+mrUQEAARbAAESSgcAARI7ANfHdwABAIcAAhrIAwABaMj0cwABEqYHAAESlwDXx3atNAQABgMAARLnANe/pAMAAZ7UAwACHAz0cwABE0YDAAETMwDXv6YITAQABGsAARNXAAHNOAMAAWi09HMAAROqAwABE5cA17+mCGwEAARrAAETwwABzTwDAAFosPRzAAEUGgMAARQHANe/pq1EBAAEWwABFGBbAAEUPLpQ3wABzbJf/wACG3ADAAFoyPRzAAEUsFsAARSMulDfAAHNsg7wBAmDAAGe7YMAAnEYBNMAARTQDwABFNMAARaEAAAACAgLAAEU+AAAAlgFgwABnuwDAAEVHAAAAgKhbAABgwAD1ggE+Aj0cwABFV4DAAEVSwDXv6atRAQABFsAARWiBwABFYMA18wzAAEAiwACGzADAAFoyPRzAAEWFgcAARX3ANfMMq00BAAGAwABFlcA17+kAwABnwwDAAIb0PRzAAEWtgMAARajANe/pghMBAAEawABFscAAc08AwABaLT0cwABFyIDAAEXDwDXv6YIbAQABGsAARc7AAHNQAMAAWiw9HMAAReOAwABF3sA17+mrUQEAARbAAEX0FsAARewulD7AAHNql//AAIbcAMAAWjI9HMAARgcWwABF/y6UPsAAc2qDvAECYMAAZ91gwACblgE0wABGDwPAAEYPwABGdwAAAAICAsAARhgAAACSW2DAAGfdAMAARiAAAACAqFsAAGDAAPWCAT4CPRzAAEYwgMAARivANe/pq1EBAAEWwABGQIHAAEY5wDX0LsAAQCPAAIa4AMAAWjI9HMAARluBwABGVMA19C6rTQEAAYDAAEZrwDXv6QDAAGfnAMAAhvQ9HMAARoOAwABGfsA17+mCEwEAARrAAEaHwABzUADAAFotPRzAAEadgMAARpjANe/pghsBAAEawABGo8AAc1EAwABaLD0cwABGvoDAAEa5wDXv6atRAQABFsAARtUWwABGxy6jg8AAc2uX/8AAhtwAwABaMj0cwABG7hbAAEbgLqODwABza4O8AQJgwABopGDAAJxRATTAAEb2A8AARvbAAEd8AAAAAgICwABHBQAAAKe0YMAAaKQAwABHEwAAAICoWwAAYMAA9YIBPgI9HMAARyOAwABHHsA17+mrUQEAARbAAEc5gcAARyzANfVQwABAOcAAhscAwABaMj0cwABHYIHAAEdTwDX1UKtNAQABgMAAR3DANe/pAMAAaK0AwACG9D0cwABHiIDAAEeDwDXv6YITAQABGsAAR4zAAHNRAMAAWi09HMAAR++AwABH6sA17+mCGwEAARrAAEf1wABzUgDAAFosPRzAAEgUFsAASAouhCzAAHNog7wBA2DAAIaqYMAAmvRgwACa4QE0wABIHAPAAEgcwABIjgAAAAMDA8AASB0AAACAqFsAwABILQAAABJgwACa9ADAAEg/AAAAk1pgwACa4QAAYMAA9YIBPgI9HMAASFCDwABITMA19mCrTQEAAYDAAEhgwDXv6QDAAJrsPRzAAEhygsAASG3ANfZSq00BAAGAwABIgsA17+kAwACa/ADAAIcDPRzAAEiagMAASJXANe/pghMBAAEawABInsAAc1IAwABaLT0cwABIuYDAAEi0wDXv6YIbAQABGsAASL/AAHNTAMAAWiw9HMAASNoWwABI0i6UOMAAc2mDvAEDYMAAhrBgwACbXmDAAJsMATTAAEjiA8AASOLAAElQAAAAAwMDwABI4wAAAICoWwDAAEjxAAAAEmDAAJteAMAASQEAAACTWmDAAJsMAABgwAD1ggE+Aj0cwABJEoPAAEkOwDX3WKtNAQABgMAASSLANe/pAMAAmxA9HMAASTSCwABJL8A190qrTQEAAYDAAElEwDXv6QDAAJtiAMAAhwM9HMAASVyAwABJV8A17+mCEwEAARrAAElgwABzUwDAAFotPRzAAEl5gMAASXTANe/pghsBAAEawABJf8AAc1QAwABaLD0cwABJnRbAAEmULpQ3wABzbIO8AQJgwACGymDAAJxGATTAAEmlA8AASaXAAEnlAAAAAgICwABJpgAAAICoWwDAAEm2AAAAEmDAAJxGAABgwAD1ggE+AT0cwABJyYLAAEnEwDX4PatNAQABgMAASdnANe/pAMAAnE4AwACG9D0cwABJ8YDAAEnswDXv6YITAQABGsAASfXAAHNUAMAAWi09HMAAShCAwABKC8A17+mCGwEAARrAAEoWwABzVQDAAFosPRzAAEoyFsAASioulD7AAHNqg7wBAmDAAIa2YMAAm5YBNMAASjoDwABKOsAASnkAAAACAgLAAEo7AAAAgKhbAMAASkoAAAASYMAAm5YAAGDAAPWCAT4BPRzAAEpdgsAASljANfj/q00BAAGAwABKbcA17+kAwACbnQDAAIb0PRzAAEqFgMAASoDANe/pghMBAAEawABKicAAc1UAwABaLT0cwABKo4DAAEqewDXv6YIbAQABGsAASqnAAHNWAMAAWiw9HMAAStEWwABKwy6jg8AAc2uDvAECYMAAhsVgwACcUQE0wABK2QPAAErZwABLHgAAAAICAsAAStoAAACAqFsAwABK7wAAABJgwACcUQAAYMAA9YIBPgE9HMAASwKCwABK/cA1+cGrTQEAAYDAAEsSwDXv6QDAAJxbAMAAhvQ9HMAASyqAwABLJcA17+mCEwEAARrAAEsuwABzVgDAAFotPRzAAEtOgMAAS0nANe/pghsBAAEawABLVMAAc1cAwABaLD0cwABLcYDAAEtswDXv6atTAgFdwAD1HQFgwACGvAIWwABLgC7AAE+9wABzRMAAc2IWwABLmIDAAEuTwDXv6a95wABaWADAAFpZPRzAAEuwgMAAS6vANe/pghMBAAEawABLtMAAc1cAwABaLT0cwABL0oDAAEvNwDXv6YITAQABGsAAS9bAAHNMAMAAWi0GwABz84FSwABL48AAS/3AAEwMAQCVCAEawABL5MAA7ksAAAEDwABMA8AATAwAAAAAAAAAYMAAWUkBSsAATAYBFsAATAYuwABDysAAc0TAAHNfBsAAc/SBUsAATBHAAEw2wABMXwEAn+YBGsAATBLAAO5LAAABA8AATEnAAExfAAAAAAAAAGDAAHP/AUrAAExMARbAAExMLrLTwABzRMAAc1wGwABz9YFSwABMZMAATIfAAEyoAQCqtQEawABMZcAA7ksAAAEDwABMlsAATKgAAAAAAAAAYK2EAUrAAEyZARbAAEyZLqtzwABzRMAAc1sGwABz94FSwABMrcAATMDAAE0+AQDAAE/mwABzRAAAAAEDwABMzsAATT4A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kjUjFsAAoc+AwAChysA2SQyV6pI5HMAAodsumskBAAEWwACh64DAAKHmwDZJDIQJkjgAwABznysBYLCeAAbAAHO+gVLAAKIEwACiHsAAo0YAAMAAT3wBGsAAogXAAO5LAAABA8AAoi7AAKNGAAAAAQEBwACiPAAAAFRgjy0AAGDAAFT9AT4DTsAAolHAAKJfAACyj2DAAPR5ARzAAKJ9FsAAonYWwACia4DAAKJhwDZJtpUqjzBawAD1TF0BAAEWwACijxbAAKKJgMAAon/ANkm2lP2PMVrAAPVMAMAA9Z5OwACiqMAAorcAAKS4XcAA9R0BYMAA9l0BHMAAotwcwACiyRbAAKLDgMAAornANkm2lP2PMYCfAQFgwAD2XQE0wACizQPAAKLNwACi2gAAAAEBAcAAos4AAACDBmCPOwAAYMAA9l0BSsAAotQBFsAAotaCwACi1MA2SneAsI89AMAA9OaAoQAAAADAAPTxSsAAouoBHsAAovXAAFUSAwADgcAAowzANknMgsAAoxvANkolFsAAozsWwACjNYDAAKMrwDZJtpUIjy9awAD1TAAGwABzv4FSwACjS8AAo2DAAKbMAADAAE3rARrAAKNMwADuSwAAAQPAAKNrwACmzAAAAAEBAcAAo3oAAACDsmCOYwAAYL6/AT4HScAApCglwACkMYDAAKQswDZLKGCOjj4BSsAApEwBHMAApFMuwABQIgEAARbAAKRqFMAApGXANksoAAFgjo6AsI6RAMAAc8E/ScAApHslwACkhIDAAKR/wDZLKGCOsz4BSsAApKUBHMAApKwuwABQIgEAARbAAKTKFsAApMMUwACkvsA2SygAAWCOs4HTjriAsI0XAMAAc8E/ScAApNslwACk5IDAAKTfwDZLKGCO6T4BSsAApQQBHMAApQsuwABQIgEAARbAAKUiFMAApR3ANksoAAFgjumAsI7rAMAAc8E/ScAApTMlwAClPIDAAKU3wDZLKGCOoD4BSsAApVcBHMAApV4uwABQIwEAARbAAKV1FMAApXDANksoAAFgjqCAsI6jAMAAc8I/ScAApYYlwAClj4DAAKWKwDZLKGCO+j4BSsAApa8BHMAApbYuwABQIwEAARbAAKXNFMAApcjANksoAAFgjvqAsI78AMAAc8I/ScAApd4lwACl54DAAKXiwDZLKGCPRT4BSsAA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XgAAmTxgsK0BHMAArnMWwACuYC6f5sAAc/Sp+wIAAofAAK5/wDZTkoTAAK6IwDZTQADAAHQmScAArp0hHMAArqUUwACuocA2U8kIAEEBAAErAMAA9dI+AUrAAK7xASOAwACu+MA2UhIcwACvKhbAAK8XLp/mwABz9KoAAQABFMAArzXANlPJCAAAwAB0ChzAAK9fFsAAr0wun+bAAHP0qnkBAAEUwACva8A2U8kIAADAAHQJAWDAAFhdPz9KwACvjwErT8AAr6vAAK+0AAABwABQLmEBYMAA9t5gwABYNgADwACvusAAsBEAAAABAQHAAK+/AAAAgKBgwAD23gAAYMAAWDYBPgFKwACvzgEcwACv4obAAK/VwDZTbSABAAEcwACv9hbAAK/jLp/mwABz9J/nAQABFMAAsATANlS/CAAAwAB0KAAATsAAsNEAAACCF2DAAFg2AEnAALDdNQAAAAEAYMAA8rMBgcAAsOHANlJCIxzAALD3FADANlUtCQBBAQABKwDAAPXSicAAsOHANlJCHMAAsQqCwACw+8A2UlggAAAAAAAUAMA2VS0JAAFgwADysz4BPSMcwACxHRTAALEYwDZVGAgAQQEAASsAwAD10hXAALEYwDZVGAgcwACxLobAALEhwDZTbSABAAEWwACxQhbAALEvLp/mwABz9KpwwAB0BAAAKwFgwABYNj89IxzAALFjFMAAsV7ANlUYCABBAQABKwDAAPXSFcAAsV7ANlUYCBzAALFth8AAsWfANlSYIAEAARrAALFzrGcAACsBYMAAWDY9IxzAALGKFMAAsYXANlUYCABBAQABKwDAAPXSFcAAsYXANlUYCBzAALGUh8AAsY7ANlSYIAEAARrAALGarHUAACsBYMAAWDY9IxzAALG3FMAAsbLANlUYCABBAQABKwDAAPXSFcAAsbLANlUYCBzAALHBh8AAsbvANlSYIAEAARrAALHHrHYAACsBYMAAWDY9IxzAALHnFMAAseLANlUYCABBAQABKwDAAPXSFcAAseLANlUYCBzAALHxh8AAsevANlSYIAEAARrAALH3rG8AACsBYMAAWDY9IxzAALIcFMAAshfANlUYCABBAQABKwDAAPXSFcAAshfANlUYCBzAALImh8AAsiDANlSYIAEAARrAALIsrGYAACsBYMAAWDY9IxzAALJJFMAAskTANlUYCABBAQABKwDAAPXSFcAAskTANlUYCBzAALJTh8AAsk3ANlSYIAEAARrAALJZrGwAACsBYMAAWDY9IxzAALJwFMAAsmvANlUYCABBAQABKwDAAPXSFcAAsmvANlUYCBzAALJ6h8AAsnTANlSYIAEAARrAALKArGgAACsBYMAAWDY9IxzAALKXFMAAspLANlUYCABBAQABKwDAAPXSFcAAspLANlUYCBzAALKhh8AAspvANlSYIAEAARrAALKnrGkAACsBYMAAWDY9IxzAALLFFMAAssDANlUYCABBAQABKwDAAPXSFcAAssDANlUYCBzAALLPh8AAssnANlSYIAEAARrAALLVrHEAACsBYMAAWDY9IxzAALLrFMAAsubANlUYCABBAQABKwDAAPXSFcAAsubANlUYCBzAALL1h8AAsu/ANlSYIAEAARrAALL7rHIAACsBYMAAWDY9IxzAALMXFMAAsxLANlUYCABBAQABKwDAAPXSFcAAsxLANlUYCBzAALMhh8AAsxvANlSYIAEAARrAALMnrHMAACsBYMAAWDY9IxzAALNAFMAAszvANlUYCABBAQABKwDAAPXSFcAAszvANlUYCBzAALNKh8AAs0TANlSYIAEAARrAALNQrHQAACsBYMAAWDY9IxzAALNqFMAAs2XANlUYCABBAQABKwDAAPXSFcAAs2XANlUYCBzAALN0h8AAs27ANlSYIAEAARrAALN6rGoAACsBYMAAWDY9IxzAALOXFMAAs5LANlUYCABBAQABKwDAAPXSFcAAs5LANlUYCBzAALOhh8AAs5vANlSYIAEAARrAALOnrHAAACsBYMAAWDY9IxzAALPEFMAAs7/ANlUYCABBAQABKwDAAPXSFcAAs7/ANlUYCBzAALPOh8AAs8jANlSYIAEAARrAALPUrG0AACsBYMAAWDZJwACz6SIcwACz8hTAALPtwDZVGAgAQQEAASsAwAD10gCFwACz/cA2U1A+AT0cwAC0GhbAALQRLp/OwABzWahVAwADGsAAtC2r7xrAALRgn4sywAC0aVtbASeBPyTAALSPAyePmYTAALR6wDZTQCeRkQCrxz9KwAC0oQEUwAC0qMA2VRgIAErAALS5AYPAALTAwDZTDwbAAHOPgVLAALTPwAC01sAAtVkAAMAAUC/AAHNEAAAAAQPAALTowAC1WQAA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wADPVgAAAICwYMAA9l0AAGDAAIbKAT4BSsAAz2IBH8AAz23AAGfGAgACJsAAz3YBgMAAz3bANmxfYMAAZ42BwADPf8A2bGwABsAAc8+BUsAAz43AAM+gwADQKgAAwABP2wAAAAEDwADPssAA0CoAAAADAwPAAM/BAAAArBJgsJkAwADP2QAAAICwYMAA9l0AwADP4wAAACdgwAD0eQAAYLC5AT4BSsAAz/ABH8AAz/vAAGiwAwADgMAA0AnANmzggcAA0BrANmztgsAA0CDANmz8AAbAAHPQgVLAANAvwADQQsAA0WAAAMAAUD4AAAABA8AA0F3AANFgAAAABQMDwADQagAAAJJpYLCtAMAA0IUAAACAsGDAAFTMAMAA0J4AAACsFWCw+wACwADQvgAAAIPkYMAA8rMBK8AA0M8AAACD4mDAAPKzAStgwACGvwE+AUrAANDfAR/AANDqwABoGgUAAybAANEBAYDAANEBwDZta2DAAGesgcAA0RHANm14gsAA0RfANm2HAoPkg8AA0T/ANm2Vg+KEwADRVMA2baUGwABz0YFSwADRZcAA0XjAANL/AADAAFA/AAAAAQPAANGQwADS/wAAAAYDA8AA0Z0AAACSaWCwrQDAANG4AAAAgLBgwABUzADAANHRAAAArBVgsPsAA8AA0fEAAACD5GDAAPKzASvAANICAAAAg+JgwADyswErwADSEAAAAKpsYMAA8rMBK2DAAIa/AT4BSsAA0jUBH8AA0kDAAGgnBgADJsAA0lQBgMAA0lTANm44YMAAZ6yBwADSZMA2bkWCwADSasA2blQDg+SDwADSksA2bmKD4oTAANKvwDZucqpshcAA0t7ANm6CBsAAc9KBUsAA0wTAANMVwADTvgAAwABQQAAAAAEDwADTKsAA074AAAACAgLAANNEAAAAmFBgsOwAwADTZAAAAKwVYLD7AABgwABoKAE+AUrAANN+AR/AANOJwABoNAIAAibAANOaAYDAANOawDZvIGDAAGgCgcAA06fANm8tAAbAAHPTgVLAANPDwADT0sAA1FYAAMAAUEEAAAABA8AA0+XAANRWAAAAAgICwADT/AAAAJJPYLDUAMAA1A8AAACiAGDAAFg2AABgwABoQwE+AUrAANQiAR/AANQtwABoUQIAAibAANQ8AYDAANQ8wDZvn2DAAGf7gcAA1EbANm+sAAbAAHPUgVLAANRbwADUa8AA1aIAAMAAUEIAAAABA8AA1HfAANWiAAAABwQEwADUhgAAAIQJYLCeAMAA1KEAAACSaWCwrQDAANS2AAAAgLBgwABUzADAANTIAAAAlPVgsNsAA8AA1OEAAACD3mDAAPKzASvAANTwAAAAg+RgwADyswErwADVAQAAAIPfYMAA8rMBK2DAAIa8AT4BSsAA1RQBH8AA1R/AAGhfBwAEJsAA1ScBgMAA1SfANnAgYMAAZ40mwADVMAGBwADVMMA2cC1gwABnrILAANVAwDZwOoPAANVGwDZwSQOD3oTAANVlwDZwV4PkhcAA1XvANnBng9+GwADVk8A2cHcGwABz1YFSwADVp8AA1bfAANdXAADAAFBDAAAAAQPAANXDwADXVwAAAAgFBcAA1dkAAACECWCwngDAANX0AAAAkmlgsK0AwADWDwAAAICwYMAAVMwAwADWLgAAAKwVYLD7AMAA1lQAAACU9WCw2wADwADWbQAAAIPeYMAA8rMBK8AA1oIAAACD5GDAAPKzASvAANaZAAAAg99gwADyswErYMAAhrwBPgFKwADWrAEfwADWt8AAaEIIAAUmwADWyAGAwADWyMA2cSlgwABnjSbAANbRAYHAANbRwDZxNmDAAGesgsAA1uHANnFDg8AA1ufANnFShMAA1vvANnFfA4PehcAA1xrANnFtg+SGwADXMMA2cX2D34fAANdIwDZxjQbAAHPWgVLAANdcwADXbMAA2H4AAMAAUEQAAAABA8AA13jAANh+AAAABgMDwADXjgAAAIQJYLCeAMAA16MAAACSaWCwrQDAANe4AAAAgLBgwABUzAADwADXygAAAIPeYMAA8rMBK8AA19kAAACD5GDAAPKzASvAANfqAAAAg99gwADyswErYMAAhrwBPgFKwADX/QEfwADYCMAAaG4GAAMmwADYEAGAwADYEMA2ckhgwABnjSbAANgZAYHAANgZwDZyVWDAAGesgsAA2CnANnJiA4Peg8AA2EHANnJyg+SEwADYV8A2coKD34XAANhvwDZykgbAAHPXgVLAANiDwADYkMAA2Z0AAMAAUEUAAAABA8AA2JvAANmdAAAABgMDwADYsQAAAIQJYLCeAMAA2MYAAACSaWCwrQDAANjbAAAAgLBgwABUzAADwADY7QAAAIPeYMAA8rMB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EkOHwAESR8A2lsM+AT0cwAESZi7AAFBhwABzRAYABhTAARKAwDacnBMAFMABEpLANpg0DACBwAESncA2ll0UwAESrcA2lt4IABTAARK9wDaYDQsAFMABEsfANpdKCQAAwABzlj89F8ABEvMUwAES58A2mM4PALrhHMABEv4uqn0BAAGBwAETDsA2ll0AwABzrsAAch89HMABEyIWwAETGi6UPsAAc2rAAEwwAgJgwACGvGDAAJurAhTAARNTwDaaqhEAH8ABE2vAAHJcBQAFH8ABE5DAAHJ4AwADFMABE7nANpgNCwAawAETzsAAcvMWwAET4IHAARPbwDaWXZJRjBsAFMABE/XANpbeCAAWwAEUHRTAARQRwDaYzg8AuuHAAHIfgcABFDPANpZdFMABFEXANpdKCQAAAMAAhvI9HMABFGgUwAEUX8A2mDQMAICyAgACFsABFHQUwAEUacA2mqoRAICwsJsXwAEUjRTAARR8wDacnBMAq7UmwAEUjQEUwAEUmsA2mqoRAGDAAGf7wABxuQDAAPVjSsABFKoBFMABFLHANpycEwAGwABzlIFSwAEUysABFM/AASBQAADAAFBgwABzRAAAAAEDwAEU58ABIFAAAAAHBwfAARUGAAAAwABPKGDAAHG2AMABFSsAAACSW2CwvwDAARVHAAAAwABPXWDAAFhdAMABFW0AAACA+2DAAHYbAMABFYsAAADAAEYeYMAActUAwAEVtQAAAMAAUFtdwAD1TgJgsPhgwAByEADAARXxAAAAqvpdwAD1TgJgwAD2XWCwvwAAXAE+BE7AARacwAEWqAAAwABQYmDAAPR5AZNGwAEX+MABGCXAARgFAAAAkktgjA4AFsABGBaDwAEYEcA2n6zAAEWFwAB2IT4BScABGC0lwAEYOhTAARgxwDagIggAYJICPgJOwAEYZcABGHMAAMAAUGNgsPgBHMABGH+EwAEYdcA2n7vAAE0QAQABFMABGJDANqAiCAFgkgIAwABy2UnAARijHMABGKcuwABQWsAAc0QCAAIUwAEYs8A2oGIJAIXAARjCwDafzADAAHOSPgJOwAEY8MABGQEAAMAAUGRgwADyswEcwAEZAy7AAFBlwABzRAcABxTAARkywDagYgkAgMABGU/ANp99gsABGW/ANp+bhsABGY3ANp/mFMABGabANqAiCAFgkgKFwAEZvsA2n8yHwAEZ6MA2oAQAwABzlUnAARoAFMABGgTANqDOCgA9j8ABGhbANqAEHMABGiGHwAEaFsA2oARdAQABlADAAPWePz8/ScABGm4WwAEad4PAARpywDafrMAATx7AAHYjPgI9HMABGpcuwABQZsAAc0QIAAgWwAEayoDAARq5wDaffbF8wABxvIDAARrfwDaffYLAARr7wDafm4bAARsVwDaf5ibAARtUARbAARtUHMABGyouwABPfgEAARbAARtEgcABGz3ANp+OkmmwzQDAAHPqg7LAAHMwYIwVKSqHwAEbhcA2oAQAwABzlz2PwAEbmcA2oAQcwAEbpIfAARuZwDagBF0BAAGUAMAA9Z4/RsABG7PAARvgwAEbwAAAAJJLYIwOABbAARvRg8ABG8zANp+swABFhcAAdiE+AUnAARxuJcABHHsUwAEccsA2okUIAGCSAj4CTsABHKbAARy0AADAAFBjYLD4ARzAARzAhMABHLbANp+7wABNEAEAARTAARzRwDaiRQgBYJICAMAActlJwAEc5CEcwAEc6S7AAFBawABzRAIAAhTAARz1wDaihQkAhcABHQTANp/MAMAAc5I+Aj0cwAEdLS7AAFBmwABzRAgACBTAAR1TwDaihQkAgMABHXDANp99gsABHZDANp+bhsABHa7ANp/mFMABHcfANqJFCAFgkgIWwAEd6BTAAR3fwDaiRQgBYJICg+KSEyqHwAEeSsA2oAQAwABzlz2PwAEeYsA2oAQcwAEebYfAAR5iwDagBF0BAAGUAMAA9Z4/ScABHoglwAEelRTAAR6MwDaiRQgAYMAAdog+Aj0cwAEevy7AAFBmwABzRAgACBzAAR7thMABHuPANp+7wABNSwIAAhbAAR8LFMABHwLANqJFCAFgwAB2iIIXwAB2iy4AwABy2oDAAR8kwDaffYLAAR9CwDafm4bAAR9ewDaf5hbAAR+DFsABH34UwAEfdcA2okUIAWDAAHaIghfAAHaLgM+S1Skqh8ABH7/ANqAEAMAAc5c9j8ABH9XANqAEHMABH+CHwAEf1cA2oARdAQABlADAAPWePgE9MMABH/sfwAEgBcAA9AsBAAEkwAEgPQInwABQZxTAASA0wDaiRQgAAAbAAHOVgVLAASJFwAEiSsABJ3sAAMAAUGXAAHNEAAAAAQPAASJpwAEnewAAAAcHB8ABIncAAADAAFBjYLD4AMABIqMAAADAAE8oYMAAcbYAwAEiyQAAAMAAT11gwABYXQDAASL5AAAAqvpdwAD1TgJgwAD2XWCwvwDAASMWAAAAwABPaGCMFQDAASNBAAAAwABQW13AAPVOAmCw+GDAAHIQAMABI2cAAADAAFBiYMAA9HkAAGDAAPKzAT4ITsABI4fAASOTAADAAEZgYMAAchABHMABI6+FwAEjlcA2pQhEAQABgMABI7DANqSwAMAA9WJJwAEkOhzAASRfFsABJE+BwAEkPsA2pL/AAE9AwABxvoHdAQABFsABJHeHwAEka8A2pT3AAEr3wAByEwDAAPVhPgI9HMABJKQWwAEkloHAASSFwDakv8AATyXAAHGPgLICAAKAwAEkpcA2pLCHwAEktsA2pT0AwAD1Y0rAASTJASo/TsABJO7AAST7AADAAEZYYLDRAR/AASUBwABx7gUAAyTAASUrAifAAFBohsABJR/ANqUigcABJS3ANqS/FsABJU8WwAElS4fAASU/wDalPcAASvfAAHITgLDAAHnVAoPiKabfKj0cwAEljxbAASWHLpQ+wABzasAATDACAmDAAIbCYMAAnC8CJsABJbsBFMABJbvANqX0CABgwACGwh/AASXVwAByawIAAh/AASX3wAByeAMAAx7AASYgwACQOQEAAYTAASY+wDak+QAawAEmZsAAcvSEwAEmhMA2pPkAgsABJp3ANqTQAADAAIbyPRzAASa8g8ABJrPANqThgLICAAIWwAEmyhTAASa9wDal9AgAgLCwmxTAASbSwDal9AgAAMAA9WM9HMABJwQWwAEm9YHAASbkwDakv8AAT0DAAHG+gLICAAIWwAEnEYfAAScFwDalPcAASvfAAHITJsABJwQBFMABJxjANqX0CABgwABobwDAAPVjPRzAASdJFsABJzuBwAEnKsA2pL/AAE8lwABxj4CyAgACgMABJ0rANqSwh8ABJ1vANqU9AMAA9WNKwAEnbAEpBsAAc5aBUsABJ4DAASeFwAEqqQAAwABQYcAAc0QAAAABA8ABJ57AASqpAAAABgYGwAEnvQAAAMAATyhgwABxtgDAASfvAAAAqvpdwAD1TgJgwAD2XWCwvwDAASgQAAAAwABPQmCOOADAASg3AAAAwABPXWDAAFhdAMABKFgAAACEvmCr4QDAASiAAAAAwABQXWDAAJqRAABcAT4DTsABKKnAASi5AADAAEZeYLDUAR/AASjHwABolQEAARbAASjpgMABKNjANqfZwABOacAAcb0APRzAASkKFsABKQIulD7AAHNqwABMMAICYMAAhrxgwACbqwImwAEpOwGGwAEpO8A2qEZgwACGvB/AASlYwACb9gQABB/AASl/wABzLAIAAhbAASm6gsABKajANqgCklGMGxrAASnNwABy9QCDwAEp5cA2qBEWwAEqE4LAASoBwDaoApJejj2FwAEqL8A2qC8AAMAAhvI9HMABKlKBwAEqScA2p+qAsgIAAhbAASpjhsABKlPANqhGgLCwmxfAASqEgMABKnPANqfZwABGXibAASqEAYbAASqWwDaoRmDAAGiKwABxugDAAPVjBsAAc5eBUsABKq7AASqzwAEuVQAAwABQZsAAc0QAAAABA8ABKsnAAS5VAAAACAgIwAEq1wAAAMAAUGNgsPgAwAErAwAAAMAATyhgwABxtgDAASspAAAAwABPXWDAAFhdAMABK1kAAACq+l3AAPVOAmDAAPZdYLC/AMABK3YAAADAAE9oYIwVAMABK40AAACD4mDAAPKzAMABK6EAAACm32DAAPKzAMABK7kAAADAAFBiYMAA9HkAAFwBPgROwAEr2MABK+UAAMAARlhgsNEBH8ABK+vAAHHuBQADHMABLAIuwABQacAAc0QCAAIWwAEsKIDAASwawDaplYCwsJuHwAEsLsA2qgsAwABzmYHAASxEwDappBbAASxsgMABLF7ANqmVgLCwmwKD4oXAASyDwDap7abfhsABLKLANqn8PRzAASy+FsABLLYulD7AAHNqwABMMAICYMAAhsJgwACcLwImwAEs6gEUwAEs6sA2qiIIAGDAAIbCH8ABLQTAAHJrAgACH8ABLSbAAHJ4AwADHsABLU/AAJA5AQABhMABLW3ANqneABrAAS2VwABy9ITAAS2zwDap3gCCwAEtzMA2qbUAAMAAhvI9HMABLeuDwAEt4sA2qcaAsgIAAhbAAS35FMABLezANqoiCACAsLCbFMABLgHANqoiCAAAwAD1Yz0cwAEuMxbAAS4kgcABLhPANqmkwABPQMAAcb6AsgIAAoDAAS40wDaplSbAAS4zARTAAS5FwDaqIggAYMAAaG8AwAD1YwbAAHOYgVLAAS6YwAEun8ABNDUAAMAAUF7AAHNEAAAAAQPAAS6ywAE0NQAAAAEBAcABLr8AAADAAEBeYIwVAABgwAD2XQE+BU7AAS7TwAEu2QAAlDZdwAD1HQFgwAD2XQExwAEu42DAAPZdAE7AAS+XwAEvoQAAwABQamDAAPZdASerwU7AAS++wAEvxgAAV2CMFQGAwAEvyMA2q9lBQ8ABMAshHMABMBqDwAEwEsA2rC5BAQABKwDAAPXSPgNOwAEwL8ABMDQAAIOyYIwVAYPAATA2wDasLknAATBFJcABME6EwAEwScA2rGhgkM4+Aj0cwAEweIHAATBywDar8k8BAAGCwAEwfMA2rBYAwAD1Lj2KwAEwkMA2rBYnAEnAATCtJcABMLaEwAEwscA2rGhgkic+Ak7AATDiwAEw5wAAgLBgwAD2XQEWwAEw9xbAATDuFMABMOnANqxoBAFgkieSS5IpgLCSBknAATEFIiEcwAExDoXAATEJwDas30EBAAErAMAA9mwAIRzAATEehcABMRnANqzfQQEAAScAAMAA9mw+AT0cwAExN4HAATExwDar8k8BAAEewAExO8AAeyABAAGFwAExWsA2rN8AAMAA9S4+Aj0cwAExg4HAATF9wDar8k8BAAGCwAExh8A2rBYAwAD1Lj2KwAExncA2rBYnAEnAATHEJcABMc2EwAExyMA2rGhgjM4+Aj0cwAEyO4HAATI1wDar8k8BAAEWwAEyRBTAATI/wDasaAQBYIzOgLCM1ADAAPUuQsABMlMAScABMmclwAEycITAATJrwDasaGCNnz4BScABMoscwAEymRbAATKUFMABMo/ANqxoBAFgjZ+CHI2iQQEAARrAATKtjeYAwAD10j4BPRzAATLIgcABMsLANqvyTwEAAR7AATLMwAB7HgEAASbAATLtARzAATLtLprLAQABFMABMvfANqxoBAFgjZ8AwABzpGCw1AAAwAD1Lj4BPRzAATMhgcABMxvANqvyTwEAAR7AATMlwAB7IAEAARbAATNOFsABM0kUwAEzRMA2rGgEAWCNn4CwjReAsJI1AADAAPUuScABM20lwAEzdoTAATNxwDasaGCNXj4CPRzAATOZgcABM5PANqvyTwEAAR7AATOdwAB7HgEAASbAATO+ARzAATO+LprLAQABFMABM8jANqxoBAFgjV4AwABzpGCw1AAAwAD1LkLAATPZAD89i8ABM+7ANqwuFsABNACDwAEz+MA2rC6SUYwbSsABNBIBHMABNCgWwAE0H4HAATQZwDar8pgBwAD1TVEBAAEngKgAwAD07wbAAHOZgVLAATZDwAE2SsABNp8AAMAAUGnAAHNEAAAAAQPAATZhwAE2nwAAAAICAsABNmkAAACAsGDAAPZdAMABNnMAAACrA2DAAPR5AABgwAD2XQE+AUrAATZ9ASTAATabBCfAAFBrgMABNpHANq+3J4CogcABNpjANq/GBsAAc/CBUsABNqTAATa/wAE6XgAAwABNPwEawAE2pcAA7ksAAAEDwAE2z8ABOl4AAAABAQHAATbqAAAIkk9gwACGvAAAYMAAaEMBPgNOwAE3CcABNxcAAMAARlxgwABoQwEcwAE3KRbAATcZLsAAT77AAHNEwABzY0QBAAGAwAE3KsA2sDkAwAD1YknAATc5HMABN0uBwAE3PcA2sFJBAQABKwDAAPXSPgZOwAE3acABN3YAAMAAUGxgwACbqwEmwAE3aQEcwAE3gBbAATd4LpQ+wABzasAAT8UBAAGAwAE3iMA2sDkAwACG7GDAAJurTsABN6XAATeqAACDsmCMFQEmwAE3pQEWwAE3xBbAATe5gsABN6zANrCvwABF+sAAm5iDssAAcv5gjBVOwAE32cABN+UAAKIAYMAAWDYBHMABOAQWwAE38S6f5sAAc/SqlAEAAYDAATgqwDawOQDAAHQVPYnAATg7wDawUhzAAThLLsAAUEECAAKAwAE4X8A2sDmEwAE4acA2sTAAwABz0z0cwAE4hRbAATh9LpQ+wABzasAATDACAmDAAIa8YMAAm6sCgcABOLjANrBSH8ABONXAAJwOAgACgsABOO/ANrCvH8ABOQ/AAHMsAgACg8ABOSfANrD1GsABOTjAAHL2AAAAwACG8knAATlRIRzAATltFsABOV6AwAE5VcA2sDmSabDNQQEAASsAwAD10j4BPRzAATogNQAAAAEAXcAA9U4CYMAAhrBdwAD1HQFgwACGtgEWwAE5zS7AAE+/wABzRMAAc2Q1AAAAAQBgsK0BFsABOeyAwAE548A2sDmSabDNNQAAAAEAXcAA9R0BYMAAhrYBHMABOeKFwAE54sA2sipEAQABhsABOeLANrJZAMAA9WIjHMABOfyHAMA2snVBAQABKwDAAPXSNQAAAAEAXcAA9R0BYMAAhrYBMcABOg9gwACGtgA1AAAAAQBcARzAATnihcABOeLANrIqgLICAAImwAE54gGGwAE54sA2sllgwACGsBQAwDayvQgAAMAA9WMUAMA2sr0IAIcAwDaydQFdwAD1HQFgwACGtk8BAAGBwAE6JMA2sFIAwAD1Lj8/SsABOkYBgcABOk3ANrBSBsAAc/GBUsABOmPAATp7wAE7lAAAwABOUQEawAE6ZMAA7ksAAAEDwAE6j8ABO5QAAAACAgLAATqlAAAAhB9gwABWvQDAATq/AAAAq7JgwACVmgAAYMAAjp0BPgNOwAE60sABOtgAACdgwAD0eQEcwAE62i7AAFA2AgACgMABOwXANrOHFsABOx4WwAE7Dy6qtcAAc/Wpka6yAMAAc8hJwAE7MhzAATs8gsABOzbANrOvQQEAASsAwAD1nErAATtFASs/SsABO1YBHMABO2WBwAE7XcA2s5bAAFBtAQABHMABO4gawAE7gsAAl7pEAQABgsABO4nANrOvAMAA9SwAwACVtgAANe+/ADX60QA1+yMANftzADX7wQA1/F0ANfz5ADYBKAA2AfsANgLzADYELwA2BVYANgaYADYH9AA2COgANgm/ADYKYgA2CsgANgsuADYMGwA2DscANg8vADYWbAA2FycANhipADYbhgA2G+wANh5nADYezwA2HzUANh+uADYgIwA2ISMANiGnADYp7wA2Kp4ANitkADYspAA2LY8ANi51ADYvRAA2MBkANjDoADYxsQA2MncANjOOADY0dgA2NTYANjX2ADY3CgA2N98ANjj1ADY67gA2O8YANjyXADY+GwA2PwoANkAGADZA9wA2QZkANkI7ADZDNgA2RBMANkThADZI2QA2SYEANkrzADZNFQA2TpwANk9kADZQLAA2UeEANlqsADZbXAA2Xb8ANl/SADZigQA2Y4sANmVFADZnwAA2aOIANmsfADZrlwA2bDMANmy0ADZtPwA2bgwANm70ADZvcwA2b/QANnD9ADZyHAA2cw8ANnQCADZ0fgA2dRQANnWWADZ7LgA2fA8ANnyfADZ9LgA2feEANn7SADZ/JwA2f/EANoC7ADaBdQA2gjEANoLtADaGiQA2h0UANofxADaKigA2iwEANot4ADaMbgA2jRcANo3VADaPrAA2k9oANpRfADaWJAA2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4AAAAAMDA8AAR5oAAACDsmCOoADAAEesAAAAlRtgklkAwABHxgAAAJViYJJZAABcAT4CTsAAR+XAAEfuAACzU2DAAHudARzAAEfwLsAAUbzAAHaZAQABgcAASA7AODIEAMAAduBJwABIISEcwABIOhbAAEgqgMAASCXAODH3lRqOp0EBAAErAMAA9dI+AT0cwABISy7AAFGwAwADgcAASF/AODIEg8AASG3AODIkFsAASHyAwABId8A4MfeVGo6nAMAAds0+AT0cwABIoS7AAFGvAwADgcAASLTAODIEg8AASMLAODIkFsAASNGAwABIzMA4MfeAsI6jAMAAdswGwAB3CIFZwABI5cAASPbAAEmtAADAAFHlARrAAEjmwADuSwAAAQPAAEkNwABJrQAAAAMDA8AASSMAAACDsmCOxADAAEk7AAAAlRtgklkAwABJVQAAAJViYJJZAABcAT4BPRzAAElmLsAAUbADAAOBwABJesA4MzAawABJlsAAe6UWwABJooDAAEmdwDgzI4HTjsoAwAB2zQbAAHcJgVnAAEmywABJw8AASskAAMAAUeYBGsAASbPAAO5LAAABA8AASd7AAErJAAAAAwMDwABJ+AAAAIOyYI9gAMAAShIAAADAAFHZYMAAfFIAwABKLQAAAJTcYJJZAABcAT4BPRzAAEo/LsAAUbEEAAQWwABKXIDAAEpXwDgzu4Cwj2IWwABKfBbAAEpxFsAASmeAwABKYsA4M7tUj2OVKo8wWsAA9UwewABKjMAAdpwBAAEWwABKpIDAAEqfwDgzu1SPYwAWwABKvxbAAEq1gMAASrDAODO7VI9jlQiPLwDAAHbOBsAAdwqBWcAASs7AAErfwABLVAAAwABR5wEawABKz8AA7ksAAAEDwABK9cAAS1QAAAACAgLAAEsRAAAAg7JgjukAwABLIwAAAMAATf9gklkAAFwBPgE9HMAASzUuwABRsgEAARbAAEtLgMAAS0bAODShgLCO6wDAAHbPBsAAdwuBWcAAS1nAAEtqwABL1wAAwABR6AEawABLWsAA7ksAAAEDwABLgMAAS9cAAAACAgLAAEuVAAAAg7JgjvoAwABLpwAAAJViYJJZAABcAT4BPRzAAEu4LsAAUbMBAAEWwABLzoDAAEvJwDg1HICwjvwAwAB20AbAAHcMgVnAAEvcwABL7cAATQMAAMAAUekBGsAAS93AAO5LAAABA8AATAPAAE0DAAAAAgICwABMHwAAAIOyYI4IAMAATDMAAADAAFHZYMAAfFIAAFwBPgE9HMAATEguwABRtAUABSbAAExvARbAAExvgMAATGrAODWVklGMG2CNXhbAAEyEgMAATH/AODWVgdOODRbAAEyuFsAATKMWwABMmYDAAEyUwDg1lVSOC5UqjzBawAD1TB7AAEy+wAB2nAEAARbAAEzWgMAATNHAODWVVI4LABbAAEz5FsAATO+AwABM6sA4NZVUjguVCI8vAMAAdtEGwAB3DYFZwABNCMAATRnAAE2fAACVwwEawABNCcAA7ksAAAEDwABNLcAATZ8AAAABAQHAAE1BAAAAg7JgkZMAAGDAAPWCAT4CPRzAAE1NLsAAUbkBAAGAwABNacA4NocAwAB210rAAE10AR3AAE2BlcMBAAGAwABNlsA4NocAwAB8MwbAAHcOgVnAAE2kwABNtcAATnoAAMAAUeoBGsAATaXAAO5LAAABA8AATcnAAE56AAAABAQEwABN2QAAAIOyYI6OAMAATfIAAACCHGDAAJBcAMAATgoAAACVG2CSWQDAAE4kAAAAwABDVGCSWQAAXAE+AT0cwABOOC7AAEM6BAAEgMAATk/AODcMgcAATlXAODcZgsAATlvAODcog8AATmnAODc1AMAAdtIGwAB3D4FZwABOf8AATpDAAE9NAADAAFHrARrAAE6AwADuSwAAAQPAAE6owABPTQAAAAEBAcAATr8AAACDsmCQ2QAAXAE+Ak7AAE7gwABO5wAAlFdgjHUBHsAATunAAJA8AQABgMAATvvAODe1AD0cwABPFBbAAE8LgMAATwbAODe1hB+Q25QOAQABH8AATx/AAHd9AwADLoHAAE87wDg3yIDAAE9DwDg3tQAAkwgAADgWAgA4FocAOBbfADgXNwA4F48AOBfnADgYPwA4GIkAOBkKADgZiwA4GhoAOBsOADgbgwA4G+wAOBxjADgfgwA4H80AOCBBADggsQA4IRwAOCFyADgiPwA4IokAOCMSADgjyQA4JDMAOCSLADgk1QA4JYQAOCXcADgmVAA4JqUAOCeXADgoBwA4KR0AOCsCADgu9QA4L/oAODEoADgxwgA4Mu4AODOGADg0bAA4NOcAODVgADg2VAA4NtcAODeAADg4LgAAADAC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AFibAEnAAEeVFsAAR60WwABHnoDAAEeZwDjPjJJejj2DaMAA9QA+CU7AAEfQwABH3wAAkl5dwAD1HQFgwABYNgExwABH62DAAFg2AEbAAEf1wABIMcAASAsAAACdfmCS4QAWwABIIYDAAEgcwDjPjJJejj0+AT0cwABIVxTAAEg7wDjT0QkATwEAARzAAEhbLsAATNwBAAEfwABIa5LgAQABFMAASIDAONP9CgAAAMAAeJwAwAD1Lj0VwABIoMA405cIHsAASLTAAPUlAgFgwABYmwIWwABI9xbAAEjogMAASOPAOM+Mkl6OPVrAAPVMNMAASQkDwABJCcAASTcAAAABAQHAAEkOAAAAJ2DAAPR5AABgwABYmwFKwABJGAEfwABJHMAAWK8BAAEUwABJMcA41KwKAAAAT8AASUHAAElKAAABtQdhAWDAAFg2YMAAWDYAA8AASU/AAEmhAAAAAQEBwABJWQAAAIIXYMAAWDYAAGDAAFg2AT4BSsAASWkBHMAASXUUwABJcMA41QoLALUHAgACFMAASXvAONOXCAAUwABJisA409EJAADAAFhIPYnAAEmqwDjPoxzAAEm8FMAASbfAONTlCgAgAQABgcAASb3AOM+jAAA9isAASdDAONAbHMAASfscwABJ8ILAAEnhwDjQG4CfAQFgwABYNgEUwABJ9MA41OUKAADAAPTmgKEAAAAAwAD08T2LwABKC8A40D8cwABKRhzAAEo7g8AASiTAONA/gJ8BAWDAAFg2ARTAAEo/wDjU5QoAAMAA9OaAoQAAAADAAPTxPY7AAEpWwDjSChzAAEqLHMAASoCGwABKbMA40gqAnwEBYMAAWDYBFMAASoTAONTlCgAAwAD05oChAAAAAMAA9PFFwABKmwHAAEqkwABKqgAAJ2DAAPR5AZMBHMAASrUUwABKr8A41koLAFwBAAEWwABKxRTAAEq3wDjTlwgAWsAA9UwAwAD1pgEVwABKzcA41koLHMAAStIUwABKzcA41koLAF0BAAGUAMAA9Z4+AT0XwABK9RzAAErtFMAASuDAONOXCABEAQABFMAASu7AONZKCwAAwAD1LJUKHMAASw4UwABLCcA41OUKACABAAEcwABLDy7AAEzcAQABFsAASzYcwABLLhbAAEsggMAASxvAOM+Mkl6OPUQBAAEUwABLL8A41koLAADA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AABguWQBPglOnuqe/gAAqYZgseQBFp8MhZ8AwDnsz6mGwABAgkmfJRafexyfSByfOxafNYCfKcA57JmB5blqRAEAAZQAwAD1LKzXAQABh59dwDns8QC5r6ytsdI+AUqflwErP0mfriIWoAEcn9Ucn8QWn76An7LAOeyZgeW5akQBAAGVAMAA9Sys3wEAAYef38A57PEAubasrbHSABagPBagJ4OgH8A57LqCvoEygtWBUD4BSqB+ASs/TqCjoLAAAJUbYLHhARag4xygxoCgusA57JmxBAEAAYWg1sA57M8Aumew97mbTqEGoRIAAKIAYLHhAR6hKcAAcV4DAAMWoVaAoUrAOeyZn+y6YhShYMA57aMIAIKhbsA57K8ASaF8FqGvHKGUh6GAwDns8azIAQABFKGhwDntowgAALIFq6Sxzz4BPRWhycA57dAJHKHrh6HXwDns8azKAQABFKH3wDnt0AkAALIHP06iFqIgAACW0WC9HgEfoia9LwQABByiPxaiOYCiLcA57JmB5blqRAEAAZQAwAD1LByiVhaiUICiRMA57JmB5blqRAEAAZUAwAD1LBaib4CiY8A57Jmf7LpiFKJ5wDnt0AkAAD01AAAAAQBgwAChHgGGoovAOezcIxyikBQAwDnutgsAQQEAASsAACscopAUAMA57rYLAMAAUsACAAKAop7AOeyZFKKrwDnuUgoAAMAAoS0BXEqiuwEUosLAOe5SCgAAADnscAA57xIAAAABAsAAeiqBZaLUotqohgPAAFLBAAABYMAAehQAAAABBcAAejCBZaMRoxejKgEAAAOjKKMqAAAAAAAAAGDAAHoqAT8BCQGjF8AAeh0AAAAAAwbAAHosgWWjL6Nao40AAJuTARqjMMAA7ksAAAEDo2OjjQAAAAAAAABgwABVawE+AUqjbAEao4PAAFU1BsAAei2BZaOSo6yl0gAAwABSuAEao5PAAO5LAAABA6PFpdIAAAAEBASj3AAAALBbYLpfAKQKAAAAn99gtT0ApCkAAABvYID/AKRFAAAAn+FgwABAeQAAYLHhAT4CSaS9FqUcHKTgHKTTFqTNgKTBwDnv0oHluWpEAQABlADAAPUsrO0BAAEWpP6DpPLAOe/yqYbAAECCALnEq6Sxzz4BSqU2ARalXRalSYOlPcA57/KphsAAQIKsurH2P0qlcwEdpYnA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OgHJAMAAekY+AUrAAEREARbAAERrFsAARFeDwABES8A6AcmphsAAQIKsurH2P0nAAESBHMAARIUuwABSzAIAAoDAAESfwDoBo4PAAESswDoByQDAAHpFPgFKwABEwgEWwABE6RbAAETVg8AARMnAOgHJqYbAAECCrLux9z9KwABFBAEdwABFGsAAUrgEAASAwABFNMA6AaOBwABFQcA6AbCCwABFSsA6Ab2DwABFU8A6AckAwAB6QgbAAHpOgWXAAEVowABFlMAARcQAAJuTARrAAEVpwADuSwAAAQPAAEWdwABFxAAAAAAAAABgwABVcAE+AUrAAEWmARrAAEW9wABVMwbAAHpPgWXAAEXJwABF4sAAR0UAAMAAUssBGsAARcrAAO5LAAABA8AARfPAAEdFAAAABAQEwABGCgAAALBbYLpfAMAARjgAAACf32C1PQDAAEZXAAAAb2CA/wDAAEZzAAAAn+FgwABAeQAAYLlkAT4BSsAARoYBH8AARpG7WgQABBzAAEaxFsAARquAwABGn8A6AziB5blqRAEAAZQAwAD1LBzAAEbQFsAARsqAwABGvsA6AziB5blqRAEAAZUAwAD1LBbAAEbpgMAARt3AOgM4n+y6YhzAAEb7LsAAUrgEAASAwABHFcA6AziBwABHIsA6A0WCwABHK8A6A1KDwABHNMA6A14AwAB6TQAGwAB6UIFlwABHSsAAR1vAAEftAADAAFLHARrAAEdLwADuSwAAAQPAAEdvwABH7QAAAAMDA8AAR4sAAACTV2DAAKEeAMAAR50AAACdeWC5ZADAAEe0AAAAltFguWQAAFwBPgE9HMAAR8mAwABHxcA6BETAAFLPAgACJsAAR9UBgcAAR9XAOgRTYLpfJsAAR98BgsAAR9/AOgRgYLtSAMAAoTEAADoBbgA6ArgAOgMDADoEDwA6BLEAAAAEAsAAelOBZcAAR/LAAEf4wABMkwPAAFLQAAABYMAAekAAAAABBcAAelqBZcAASDLAAEg4wABISwEAAAPAAEhJwABISwAAAAAAAABgwAB6UwE/AQkBwABIOMAAekoAAAAABAbAAHpVgWXAAEhQwABIfMAASK8AAJuTARrAAEhRwADuSwAAAQPAAEiFwABIrwAAAAAAAABgwABVcAE+AUrAAEiOARrAAEilwABVOgbAAHpWgWXAAEi0wABI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wi67ssAAgCi4agYABoDAAEbkwDzVrYHAAEbzwDzVyILAAEb5wDzV14PAAEcQwDzV44TAAEcbwDzV8IXAAEcqwDzV/QDAAH/dJsAAR04BFsAAR04WwABHPi67scAAgCeC3sAAgJFgwABE1R7AAEdewACDZQEAARbAAEd9FsAAR20uu7LAAIAojzHAAH/NAADAAH7WBsAAgDCA38AAR43AAEeewABISwAAg/EBGsAAR47AAO5LAAABA8AAR6XAAEhLAAAAAQEBwABHsQAAAIQBYMAA9scAAFwBPgQ9HMAAR8KAwABHvcA81v6CEQEAASe7tgDAAPbJPRzAAEfpgMAAR+TAPNb+ghEBAAEWwABH7y67scAAgCcAwAD2yT0cwABICoDAAEgFwDzW/oIRAQABJ7u3AMAA9sk9HMAASDGAwABILMA81v6CEQEAARbAAEg3LruywACAKADAAPbJAAA8zrAAPM9SADzPeQA8z6AAPNDpADzRWwA80Z4APNSXADzVegA81ssAPNeUAAAACgLAAIAxgN/AAEhQwABIX8AAUhcHtp0AAAFgwAD1xQABYMAAf8oAAAYGwACAM4DfwABIicAASJHAAEl6BAEAAAAAAQPAAEihwABJegAAAAQEBMAASLwAAAClvmDAAH7AAMAASMoAAACPMWCbAADAAEjuAAAAnWZdwABQYgJgwABQTlsAwABJAgAAALkfYMAA9l0AAGDAAIAxAT4BSsAASRoBJsAASRoBHMAASTgWwABJKIDAAEkhwDzYFrX0wAB+xsAAVOoEAASAwABJScA82BaBwABJUcA82CWCwABJWMA82DKDwABJZcA82EgAwAB/P2DAAIAxBsAAgDWA38AASX/AAEmawABJpQECnWYAAAABA8AASaXAAEmlAAAAAAAAAF3AAFBiAmDAAFBOWwAGwACANoDfwABJqsAAScHAAEngAQCjbAEawABJq8AA7ksAAAEDwABJy8AASeAAAAAAAAAAYMAA9l0BSsAASc4BJ7adBsAAgDiA38AASeXAAEoDwABPiAAAuAABGsAASebAAO5LAAABA8AASiHAAE+IAAAAAQEBwABKUQAAAFRdwAD1HQFdwABQgQFgwABFPwAAYMAART8BPgRJwABKYiEcwABKcIDAAEpmwDzZaEEBAAErAMAA9dI+Ak7AAEqFwABKjgAAm5BgwAD0eQEWwABKnBbAAEqQLp1mwACANbVLwABQa0nAAEq2IRzAAErLFsAASsSAwABKusA82WhawAD1TEEBAAGBwABKzsA82awAwAD1nD4DPRzAAEsxFsAASyoupb7AAH/Mty0BAAGAwABLSMA82WgAwAB+4z0cwABLYxbAAEtcLqW+wAB/zLdUAwADFsAAS5YWwABLii6dZsAAgDWAsMAAUGaBwABLnMA82awewABLpsAAg2UBAAEWwABLtS6PMcAAf80AAMAAft89iMAATMfAPNloKz9JwABM7CEcwABNDxbAAEz8FsAATPAunWbAAIA1tUvAAFBrQQEAAZMAwAD1nD4BPRzAAE0kFsAATR0upb7AAH/MnTgDAAMcwABNbhrAAE06hhOEzQEAARbAAE2IFsAATXwunWbAAIA1tUvAAFBrAIiuHsAATafAAINlAQABFsAATbYujzHAAH/NAB7AAE3IwACDbAEAARbAAE3XLo8xwAB/zQAAwABKNz9OwABOAwAAALu6XcAA9R0BYMAART8AScAAThkhHMAATieAwABOHcA82WhBAQABKwDAAPXSPgI9icAATjjAPNs2HsAATk/AAO6CAQFgwABFPwEWwABOcYDAAE5nwDzZaFrAAPVMAEXAAE6AAcAATonAAE6LAABbYMAA9HkBkwEcwABOkoLAAE6QwDzboFwBAAEWwABOpYHAAE6UwDzbNlrAAPVMAMAA9aYBisAATq3APNugHMAATq6CwABOrcA826BdAQABlADAAPWePgE9HMAATsyBwABOvMA82zaAsgIAAoLAAE7NwDzboBbAAE8KHMAATuUWwABO3i6lvsAAf8y5CAIAAhzAAE7+gMAATvXAPNloRAEAAYLAAE7/wDzboADAAPUsKgDAAH7ag+bAAFCDAMAA9S0/SsAATyUBNcAATzAAAAEAYMAARMkBH8AATzDAAETTAgACFsAAT0cuuR/AAH/QgcAAT1nAPNs2ADUAAAABAFsBHMAAT3OCwABPccA83HKdPgEAARbAAE94Lp1mwACANQDAAFAMggDAPNxyBsAAgDmA38AAT43AAE+kwABRWAAAuGoBGsAAT47AAO5LAAABA8AAT7XAAFFYAAAABgYGwABP5QAAAJJEXcAA9R0BXcAAUIEBYMAART8AwABQAQAAAICwYMAA9l0AwABQFwAAAFRgjy0AwABQ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QcAAgfzAAFXlAgACgMAAoUPAPdKkKgDAAKNlP0rAAKFcARzAAKFjLrpUAgACgsAAoX3APdLIgcAAoYPAPdKxAMAAgigGwACCJ4F8wACim8AAoqHAAKMRAADAAFX9AAAAAQPAAKK2wACjEQAAAAICAsAAor0AAACPMWCbAADAAKLPAAAAghxgwACDQwAAYJsAAT4BSsAAotsBHMAAouIuulQCAAIWwACjAoDAAKL8wD3TyINmmxuBwACjCMA909UAwACCKAbAAIIogXzAAKQjwACkKcAArGEAALpUAAAAAQPAAKRCwACsYQAAAAICAsAApEkAAACPMWCbAADAAKRbAAAAghxgwACDQwAAYJsAAT4ITsAApG3AAKRzAACCG2CbAAGAwACkdcA91EZAHsAApIfAAINhAgACJ4OcgMAApJXAPdRGAMAApIfAAKSbAD0cwACkqxbAAKSiLqPXwACB87gxAgACgsAApMHAPdRqgcAApMjAPdRTAMAAgQhOwACk18AApOYAALhDYMAA9HkBk0FDwACk7ylBPglOwAClCsAApQ8AAINmYJsAARbAAKUXgMAApRHAPdRGg2abG0nAAKUjHsAApSfAAINhAgACJ4LahMAApTXAPdTzAD4CPYjAAKVGwD3URoTAAKVOwD3U80LAAKVcAD89i8AApXPAPdTVHMAApXGDwAClc8A91NVdAQABlADAAPWeTsAApZDAAKWWAACAimDAAPZdARbAAKWdhMAApZjAPdTznCubH0nAAKWwHsAApbTAAO5eAgAChcAApb7APdVyJ5kJAD4DPYjAAKXVwD3URhzAAKXdLsAAVgECAAKAwACl/8A91EaBwACmBsA91FMAwACCKz2IwACmFcA91EYcwACmHS7AAFYCAgACgMAApi7APdRGgsAApjXAPdRqAMAAglFCwACmRQBJwACmWR7AAKZdwADuXgIAAoXAAKZnwD3VcieZKQA+Az2IwACmfsA91EYcwACmhi7AAFYDAgACgMAApqPAPdRGgcAApqrAPdRTAMAAgiw9iMAAprnAPdRGHMAApsEuwABWAgIAAoDAAKbSwD3URoLAAKbZwD3UagDAAIJRQsAApukAScAApv0ewACnAcAA7l4CAAKFwACnC8A91XInRAA+BD2IwACnN8A91EYcwACnPy7AAFYEAQABgMAAp1XAPdRGAMAAglY9iMAAp2XAPdRGHMAAp20uwABWAQIAAoDAAKePwD3URoHAAKeWwD3UUwDAAIIrPYjAAKelwD3URhzAAKetLsAAVgICAAKAwACnvsA91EaCwACnxcA91GoAwACCUULAAKfVAD89iMAAp+rAPdRGHMAAp/IuwABWBQMAA4DAAKgHwD3URhrAAKgiwACC+4HAAKgtwD3UUwDAAIIqPYzAAKg6wD3U8xbAAKhHgMAAqEHAPdRGg2abG0nAAKhTIR7AAKhYwACDYQIAAieAm4TAAKhmwD3U8wA+A07AAKh9wACoggAAg2ZgmwABFsAAqIqAwACohMA91EaDZpsbScAAqJgewAConMAAg2ECAAIngtqGwACoqsA917YAPgE9iMAAqL3APdRGhsAAqMXAPde2PgFJwACo/BbAAKkPFsAAqQaCwACpAMA91Gqbz5sNlD2bFD4BPYjAAKmwwD3URhzAAKnBFsAAqbgur0HAAIH8wABV6AIAAoDAAKnPwD3URhbAAKncgsAAqdbAPdRqm8+bDQDAAKNoScAAqfgiHMAAqgYWwACqAYbAAKn8wD3XtoIcmxhBAQABGsAAqgmdMQDAAPWcABzAAKo6FsAAqjUWwACqMIbAAKorwD3XtoNmmxuCHJsYQQEAARrAAKo9nTEAwAD1nD4CPYjAAKqHwD3URhzAAKqPLsAAVgYDAAOAwACqssA91EYcwACq5hrAAKrPhKmEzQEAASeAmwCIrh/AAKsOmv8CAAIawACrJ5tgFsAAqzOGwACrLsA917aEF5sJAADAAIJVQsAAq00BPgE9iMAAq3bAPdRGHMAAq34uwABWAgIAAoDAAKuPwD3URoLAAKuWwD3UagDAAIJRQsAAq7wAPz2IwACr0cA91EaEwACr2cA91PNAHsAAq/DAAINhAgACJ4LagMAAq/7APdRGAMAAq/DAAKwEAD0cwACsFBbAAKwLLqPXwACB87gyBAAEg8AArCjAPdTVgsAArDjAPdRqgMAArD/APdRGgcAArEbAPdRTAMAAgQlKwACsUQGAwACsWMA91EYGwACCKYF8wACsxcAArM3AAK4qAADAAFX/AAAAAQPAAKzkwACuKgAAAAEBAcAArPAAAACCHGDAAINDAABgiJMBPgJJwACs/BzAAK0FgMAArQDAPdofQQEAARrAAK0TwACDSwDAAPXSPgFKwACtLgEawACtO4YsScAArWciHMAArXCAwACta8A92h9BAQABGsAArX7AAINPAMAA9dIBHMAArZ6AwACtmcA92h9BAQABGsAArazAAINQAMAA9dI+AUrAAK3CARrAAK3PhiQ/SsAArfkBGsAArgaGGgbAAIIqgXzAALAjwACwKcAAyuIAAMAAVgUAAAABA8AAsD3AAMriAAAAAwMDwACwSwAAAI8xYJsAAMAAsGYAAADAAFYHYMAAgvUAwACwgAAAALVAYMAAg0MAAGCbAAE+JEAhHMAAsKeBwACwmcA92wZBAQABKwDAAPXSwACwmcAAsK4APYjAALC1wD3a+RzAALC9LrorAQABgMAAsM/APdr5AMAAghxOwACw4cAAsOYAAINmYJsAARbAALDugMAAsOjAPdr5g2abG07AALD+wACxBAAAY2CbAAGDwACxBsA923ROwACxHMAAsSsAAcAARKhgwADyswEcwACxQILAALE1wD3bF0EBAAEawACxTsAAg00AwAD10k7AALFyAAAAtuNgmwAATsAAsYwAAAC25GCbAABJwACxoR7AALGlwACjHwEAAYPAALGwwD3bdAA+AknAALG/HsAAscPAAINhAgACJ4Pvg8AAsdnAPdt0AD4BScAAseoiIRzAALH5gsAAse7APdsXQQEAARrAALIHwACDUADAAPXSACEcwACyLoLAALIjwD3bF0EBAAEawACyPMAAg1EAwAD10j4CPY7AALJYwD3b5YjAALJpwD3a+YPAALJxwD3bdD2LwACygcA923QWwACyjoDAALKIwD3a+YNmmxs/P0nAALKtHsAAsrHAAKMfAQABg8AAsrzAPdt0AD4CScAAss0hhcAAstLAPduwPgFJwACy7h7AALLywACDYQIAAieD64PAALMCwD3bdAA+Aj2PwACzF8A92/OIwACzKcA92vmDwACzMcA923Q9i8AAs0PAPdt0FsAAs1CAwACzSsA92vmDZpsbScAAs2cewACza8AAg2ECAAIng+qDwACzfcA923QAPgI9j8AAs5LAPdvziMAAs6TAPdr5g8AAs6zAPdt0PYvAALO+wD3bdBbAALPLgMAAs8XAPdr5g2abGz8/ScAAs/AewACz9MAAox8BAAGDwACz/8A923QAPgVOwAC0QMAAtEgAAIHnYMAAoyABH8AAtE7AAKM8AQABLgA9iMAAtHfAPdr5HMAAtIcUwAC0f8A93cAIAMAAVggEAAKAwAC0pcA92vmCwAC0rMA92xcCtuOGwAC01sA92+W25IfAALT3wD3b88AAoy49jsAAtRPAPdvlFsAAtSwUwAC1JMA93cAIALbjwACjJT2PwAC1RsA92/MWwAC1YBTAALVYwD3dwAgAtuTAAKMpPRXAALV7wD3dwAgrPz8/PRzAALWxFsAAtaguo9fAAIHzuB0EAASEwAC1z8A925eCwAC11sA92xeGwAC14sA92+WHwAC18sA92/MAwACBBU7AALZlwAC2cAABwABWCWCbAAGAwAC2csA92vlOwAC2hsAAto8AAMAATL5gwACjhAEewAC2kcAAo4ECAAKAwAC2ncA92vmFwAC2pMA927AAPYjAALa5wD3a+RzAALbKFMAAtsHAPd7aCQDAAFX1AQABgMAAttPAPdr5AMAAo449i8AAtt/APdt0FsAAtuyAwAC25sA92vmDZpsbScAAtvYiHMAAtwMUwAC2+sA93toJAEEBAAEawAC3BsAAo3sAwAD10gAiHsAAtxnAAINhAgACJ4Exg8AAtyfAPdt0AAEiFsAAt0KDwAC3PcA923SbtJsPAB7AALdSwACDYQIAAieBMRbAALdlg8AAt2DAPdt0g2abGwA+Az0VwAC3o8A93toJHsAAt67AAKOBAgACFMAAt7rAPd6+CAApAD2IwAC308A92vkcwAC35BTAALfbwD3e2gkAwABV9QEAARTAALftwD3evggAAMAAo449i8AAuADAPdt0FsAAuA2AwAC4B8A92vmDZpsbP07AALgpwAC4OgABwABWCmDAAPKzARzAALhSgcAAuETAPdsGQQEAARrAALhpwACC/ADAAPXSTsAAuIMAAAC4H2CbAABOwAC4mgAAALggYJsAAE7AALjBwAC4zQAAwABWC2DAAIMIARrAALjpwACDE0nAALkKIiGFwAC5D8A927AAHsAAuSHAAINhAgACJ5log8AAuTLAPdt0AD4GPRXAALlBwD3gfAuIwAC5T8A92vmDwAC5V8A923Q9i8AAuWPAPdt0FsAAuXCAwAC5asA92vmDZpsbScAAuXwhHsAAuYHAAINhAgACJ4Exg8AAuY/APdt0AD4BPYvAALnbwD3bdBzAALniLsAAVgYDAAOAwAC6AcA92vkcwAC6MRrAALoahKmE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AMAAy8rAAMveAD0cwADL7hbAAMvlLqPXwACB88AAVXEBAAGCwADMDMA967AAwACBY07AAMwcwADMKwAAuENgwAD0eQGTQUPAAMw0KT4HTsAAzE/AAMxUAACDZmCbAAEWwADMXIDAAMxWwD3rjINmmxtJwADMaB7AAMxswACDYQIAAieZCoTAAMx6wD3sQwA+AULAAMyLAD89iMAAzKDAPeuMHMAAzKguwABWBQMAA4DAAMzIwD3rjBrAAMzjwACC/YHAAMz3wD3rmQDAAIIqPYzAAM0EwD3sQxbAAM0RgMAAzQvAPeuMg2abGz2LwADNH8A97CYcwADNHYPAAM0fwD3sJl0BAAGUAMAA9Z5JwADNNSEewADNOsAAg2ECAAIngJuEwADNSMA97EMAPgJJwADNWSEewADNXsAAg2ECAAInmQqEwADNbMA97EMAPgM9HMAAzZUuwABVyQIAAoTAAM27wD3sQxzAAM3eGsAAzceEqYTNAQABJ5kKAIiuAMAAgsM9jMAAzjDAPexDFsAAzj2CwADON8A967Cbz5sNQ8AAzlEhHMAAzmMWwADOXoDAAM5YwD3rjINmmxtBAQABhMAAzmbAPexDAMAA9dI+AT2IwADOesA964wWwADOiIDAAM6CwD3rjINmmxs/QsAAzqwAPz2IwADOwcA964yEwADOycA97ENJwADO2RzAAM7sg8AAzt3APewmQQEAAZMAwAD1nD4DPRzAAM76LsAAVgYDAAOAwADPF8A964wawADPLoSSH8AAz1+a9QQABBrAAM+Nm00nABbAAM+oFsAAz6OAwADPncA964yDZpsbhBebCZMAAMAAglU9iMAAz7/APeuMHMAAz8cuwABWBQMAA4DAAM/nwD3rjBrAANACwACC/YHAANAWwD3rmQDAAIIqPYvAANAlwD3sJhzAANAjg8AA0CXAPewmXQEAAZQAwAD1nj89iMAA0D/APeuMFsAA0E2AwADQR8A964yDZpsbQB7AANBewACDYQIAAieZCoDAANBswD3rjADAANBewADQcgA9HMAA0IIWwADQeS6j18AAgfO4JAMAA4PAANCewD3sJoLAANCuwD3rsIDAANC1wD3rjADAAIFkSsAA0MEBgMAA0MjAPeuMBsAAgiyBfMAA0XHAANF3wADW3QAAwABWAwAAAAEDwADRk8AA1t0AAAACAgLAANGaAAAAjzFgmwAAwADRrAAAAIIcYMAAg0MAAGCbAAE+Ck7AANG+wADRxAAAghtgmwABiMAA0cbAPe93FsAA0dSAwADRzsA973eDZpsbQB7AANHlwACDYQIAAieZKYDAANHzwD3vdwDAANHlwADR+QA9HMAA0gkWwADSAC6j18AAgfPAAFVxAQABgsAA0ifAPe+bAMAAgWNOwADSN8AA0kYAALhDYMAA9HkBk0FDwADSTyk+B07AANJqwADSbwAAg2ZgmwABFsAA0neAwADSccA973eDZpsbScAA0oMewADSh8AAg2ECAAInlj+EwADSlcA98C4APgFCwADSpgA/PYjAANK7wD3vdxzAANLNLsAAVgUDAAOAwADS4sA973cawADS/cAAgvyBwADTDMA974QAwACCKj2MwADTGcA98C4WwADTJoDAANMgwD3vd4Nmmxs9i8AA0zTAPfARHMAA0zKDwADTNMA98BFdAQABlADAAPWeScAA00ohHsAA00/AAINhAgACJ4CbhMAA013APfAuAD4CScAA024hHsAA03PAAINhAgACJ5Y/hMAA04HAPfAuAD4DPRzAANOqLsAAVckCAAKEwADT0MA98C4cwADT8xrAANPchKmEzQEAASeWPwCIrgDAAILDPYzAANRFwD3wLhbAANRSgsAA1EzAPe+bm8+bDUPAANRmIRzAANR4FsAA1HOAwADUbcA973eDZpsbQQEAAYTAANR7wD3wLgDAAPXSPgE9iMAA1I/APe93FsAA1J2AwADUl8A973eDZpsbP0LAANTBAD89iMAA1NbAPe93hMAA1N7APfAuScAA1O4cwADVAYPAANTywD3wEUEBAAGTAMAA9Zw+Az0cwADVDy7AAFYGAwADgMAA1SzAPe93GsAA1UOEkB/AANVxmvUEAAQawADVn5tNJwAWwADVuhbAANW1gMAA1a/APe93g2abG4QXmwmTAADAAIJVPYjAANXRwD3vdxzAANXjLsAAVgUDAAOAwADV+MA973cawADWE8AAgvyBwADWIsA974QAwACCKj2LwADWMcA98BEcwADWL4PAANYxwD3wEV0BAAGUAMAA9Z4/PYjAANZLwD3vdxbAANZZgMAA1lPAPe93g2abG0AewADWasAAg2ECAAInlj+AwADWeMA973cAwADWasAA1n4APRzAANaOFsAA1oUuo9fAAIHzuCQDAAODwADWqsA98BGCwADWusA975uAwADWwcA973cAwACBZErAANbNAYDAANbUwD3vdwbAAIItgXzAANcxwADXN8AA2EsAAMAAVdUAAAABA8AA10XAANhLAAAAAwMDwADXTAAAAI8xYJsAAMAA12UAAACB52DAAIMIAMAA14YAAADAAFYPYMAAgwgAAGCbAAE+Az2IwADXocA982IcwADXqS7AAFXZAgACgMAA17rAPfNigcAA18HAPfNvAMAAgkBDwADXzx7AANfWwACDYQIAAieBMRbAANfqgMAA1+TAPfNig2abGwA+AT2IwADX+cA982IcwADYAS7AAFYQAgACgMAA2BTAPfNigsAA2BvAPfN+AMAAgi9KwADYOwGAwADYQsA982IGwACCLoF8wADYm8AA2KHAANl/AADAAFXzAAAAAQPAANi2wADZfwAAAAICAsAA2MQAAACPMWCbAADAANjdAAAAwABWD2DAAIMIAABgmwABPgFJwADY+B7AANj8wACDYQIAAieBMRbAANkQgMAA2QrAPfRWg2abGwA+AUrAANkfARzAANkmLsAAVhACAAKAwADZOcA99FaBwADZQMA99GMAwACCLz4BSsAA2WkBgMAA2XDAPfRWBsAAgi+BfMAA2czAANnSwADaywAAwABWEAAAAAEDwADZ5MAA2ssAAAACAgLAANnrAAAAjzFgmwAAwADaBAAAAIHnYMAAgwgAAGCbAAE+Bj2IwADaE8A99QsWwADaIYDAANobwD31C4NmmxtAHsAA2jLAAINhAgACJ4ExgMAA2kDAPfULAMAA2jLAANpGAE7AANpTwADaWgAAttpgmwABgMAA2lzAPfULPYjAANpnwD31CxzAANpvLsAAVdkCAAKAwADagMA99QuBwADah8A99RgAwACCQD0cwADanhbAANqVLqPXwACB87dlAQABgsAA2q7APfVuAMAAgdFKwADauwGAwADawsA99QsGwACCMIF8wADa0MAA2tbAANtdAAC5XQAAAAEDwADa38AA210AAAABAQHAANrmAAAAjzFgmwAAAGCbAAE+AUrAANsxARbAANtRHMAA2zguwABWEQIAAoDAANtEwD32EysAwACCT5vPmw0GwACCMYF8wADb1sAA29zAAOQYAADAAFXSAAAAAQPAANvlwADkGAAAAAEBAcAA2+wAAAC6PGCbAAAAYJsAAT4JQB7AANwGwACDYQIAAieb54DAANwXwD32fgDAANwGwADcIwA9HMAA3DMWwADcKi6j18AAgfPAAFVTAQABgMAA3D3APfZ+AMAAgP1OwADcVcAA3FsAAI8xYJsAARzAANxlLsAAVdkCAAKAwADcdsA99n4awADclcAAgxkAwACCQE7AANyxwADcuwAAt9xgmwABFsAA3MOBwADcvcA99t2DZpsbTsAA3NHAANzXAACA0GDAAPR5AZNJwADc4B7AANzkwACDYQIAAieZKYLAANzywD33EgA+Aj2JwADdBsA99t2CwADdDsA99xJBQ8AA3R8pPgdOwADdPMAA3UEAAINmYJsAARbAAN1JgcAA3UPAPfbdg2abG0nAAN1XHsAA3VvAAINhAgACJ5Y/hMAA3WnAPfeFAD4DPYnAAN18wD323YTAAN2EwD33hUnAAN2UHMAA3Z6DwADdmMA99zVBAQABkwDAAPWcPgE9HMAA3bIuwABVyQIAAoHAAN3JwD323RrAAN3WhJgAwACCwz9CwADeCgA/PYnAAN4jwD323RzAAN4rLrorAQABgcAA3j3APfbdAMAAghw9icAA3k3APfbdHMAA3lUuwABV2QIAAoHAAN5mwD323RrAAN5/wACDGgDAAIJAPYzAAN6ewD33hRbAAN6rgcAA3qXAPfbdg2abGz2LwADeucA99zUcwADevoPAAN65wD33NV0BAAGUAMAA9Z5JwADeyh7AAN7OwACDYQIAAieAm4TAAN7cwD33hQA+AT2JwADe78A99t2EwADe98A994VJwADfDB7AAN8QwACDYQIAAieWP4TAAN8ewD33hQA+Aj2JwADfMcA99t2EwADfOcA994VCwADfSQA+Ak7AAN+HwADfkAAAm89gmwABFsAA35yCwADfksA99xKbz5sNScAA37AWwADfvYXAAN+0wD35IpQ9mxQ+Aj2JwADgHsA99t0cwADgLxbAAOAmLq9BwACB/MAAVegCAAKBwADgPcA99t2FwADgRMA9+SIAwACjaELAAOBbAEnAAOBzFsAA4HyEwADgd8A994WbtJsPPgE9HMAA4bouwABVyQIAAoTAAOHiwD33hRzAAOIFGsAA4e6EqYTNAQABJ4CbAIiuAMAAgsM+Az0cwADieS7AAFXJAgAChMAA4qHAPfeFHMAA4sQawADirYSphM0BAAEnlj8AiK4AwACCwz2JwADi5cA99t0WwADi94LAAOLtwD33EpvPmw1CwADjDQA+Aj2KwADjRcA99xIcwADjUS7AAFYRAgACgcAA413APfbdGsAA42qEtQDAAIJPPYnAAOOLwD323RbAAOOdgsAA45PAPfcSm8+bDUAewADjuMAAg2ECAAInlj+BwADjxsA99t0AwADjuMAA48wAPRzAAOPcFsAA49Muo9fAAIHzujsDAAOAwADj5MA99n6CwADj8cA99xKDwADj/MA99zUAwACA/krAAOQIAYHAAOQPwD323QbAAIIygXzAAOQdwADkI8AA5v4AAMAAVdEAAAABA8AA5ETAAOb+AAAAAgICwADkUgAAALozYJsAAMAA5GcAAAC6QWCbAAAAYJsAAT4GQB7AAOSCwACDYQIAAieZT4HAAOSUwD37KwDAAOSCwADkoQBOwADkrsAA5LQAAIIbYJsAATUAAAABAGCbAAGAwADktsA9+x4jHMAA5MSCAMA9+3RBAQABKwAAgcAA5MfAPfsrggDAPft0AWCbAD0cwADk4hbAAOTZLqPXwACB87psAQABgsAA5QTAPftjAMAAgOJOwADlFsAA5RsAAICwYJsAARzAAOUdLsAAVdkCAAKBwADlN8A9+ysawADlV8AAgxsAwACCQE7AAOV7wADlgQAAjzFgmwABHMAA5aUewADlg8AAo4ICAAKDwADlmcA9+9IpAMAAVfYCAAKDwADltMA9+9IuAMAAo5hJwADlxR7AAOXJwACDYQIAAieArxbAAOXdhMAA5dfAPfwHg2abGwA+Aj0cwADl9RbAAOXsLqPXwACB87puAwADgsAA5hDAPftjgMAA5hfAPfseg8AA5ibAPfvSAMAAgSdKwADmMwEcwADmOi7AAFYSAwADhMAA5lXAPfwHgsAA5lzAPftjgcAA5mPAPfsrAMAAgjM+Aj0cwADmjhbAAOaFLqPXwACB87oyAwADgsAA5qTAPftjgMAA5qvAPfseg8AA5rrAPfvSAMAAgONKwADmxwEcwADmzi7AAEHNAwADhMAA5tnAPfwHgsAA5uDAPftjgcAA5ufAPfsrAMAAgjQGwACCM4F8wADnA8AA5wnAAOllAADAAFYSAAAAAQPAAOcjwADpZQAAAAMDA8AA5zEAAACPMWCbAADAAOc+AAAA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wAEQ7IDAARDmwD4V/oNmmxtJwAEQ9iEcwAERBBbAARD/gcABEPrAPhYTghybGEEBAAEawAERB504AMAA9Zw+A07AAREiwAERMAAAwABWJWDAAPKzASpDwAERPyXAARFLgcABEUbAPhYTYJzVPgQ9isABEWTAPhZlKT0cwAERgi7AAFYmAQABJsABEZMBgcABEZPAPhYTYJzVAMAAgsU9iMABEaLAPhX+gcABEarAPhYTPYnAARG4wD4WExbAARHFgMABEb/APhX+g2abG0nAARHZIRzAARHnFsABEeKBwAER3cA+FhOCHJsYQQEAARrAARHqnTgAwAD1nD4CScABEgIhgsABEgfAPhZlPgE9HMABEiIuwABVuwIAAoHAARJCwD4WExrAARJOhMcAwACCxD89icABEnnAPhYTHMABEokWwAESgC6vQcAAgfzAAFXKAgACgMABEpXAPhX+H8ABEqya9QMAAxrAARLLm1InABbAARLcgcABEtfAPhYThBebCQAAwACjZz8/PRzAARMFFsABEvwuo9fAAIHzt2kBAAGBwAETFsA+FhMAwACB0krAARMhAYHAARMowD4WEwbAAII/gXzAARPqwAET8MABFS0AAMAAVfoAAAABA8ABFAnAARUtAAAABAICwAEUEAAAAI8xYJsAAMABFCkAAACB52DAAIMIAALAARRBAAAAImCIkwErwAEUUAAAAMAAVidgmwABK2CbAAE+A07AARRtwAEUcgAAg2ZgmwABFsABFHqAwAEUdMA+GA2DZpsbPRzAARSELsAAVckCAAI1AAAAAQBgmwABg8ABFJvAPhg3IxzAARSqhQDAPhh/QQEAASsAAITAARStwD4YToUAwD4YfwFgmwA1AAAAAQBgiJMBgsABFLvAPhgqIxzAARTDhQDAPhi4QQEAASsAABzAARTfFsABFM6BwAEUxsA+GBrAAFYowACDPITNAQABhMABFO3APhhOAIiuhQDAPhi4AWCIkwDAAILDSsABFPkBHMABFQkWwAEVAC6vQcAAgfzAAFX6AQABgMABFSPAPhgNAMAAo2YGwACCQIF8wAEWcMABFnbAARf/AADAAFXZAAAAAQPAARaGwAEX/wAAAAICAsABFo0AAACPMWCbAADAARamAAAAgedgwACDCAAAYJsAAT4FQCEcwAEWxIHAARa8wD4ZfUEBAAErAMAA9dLAARa8wAEWywBOwAEW2MABFuMAAJxKYJsAARbAARbrgMABFuXAPhlwg2abG0nAARb1IRzAARcJFsABFwSCwAEW+cA+GbeCHJsYQQEAARrAARcMnTEAwAD1nD4DPYrAARcmwD4ZtxzAARc7gcABFzPAPhl9wABV2QIAAoDAARdMwD4ZcC4AwACDP0AhHMABF3KCwAEXZ8A+GbdBAQABKwDAAPXSwAEXZ8ABF3kAQBbAAReUgsABF4nAPhm3nCKbEcABF4nAARepAD89HMABF78WwAEXti6j18AAgfO3WAIAAoLAARfQwD4Zt4HAARfcwD4ZfQDAAIG1SsABF+oBgsABF/HAPhm3BsAAgkGBfMABGATAARgJwAEYlAAAwABWKQAAAAEDwAEYFsABGJQAAAACAgLAARgeAAAAgIpgwAD2XQDAARgrAAAAjzFgmwAAAGDAAPKzAT4BSsABGDgBIiEewAEYQMAA7l4CAAIWwAEYUIHAARhKwD4a7oIcmxgawAEYVp0vAAAhHsABGG3AAO5eAgACgMABGHfAPhrfFsABGISBwAEYfsA+Gu6cK5sfAAbAAIJCgXzAARiZwAEYn8ABGREAAMAAVioAAAABA8ABGLTAARkRAAAAAQEBwAEYuwAAAI8xYJsAAABgmwABPgFKwAEYyAEcwAEY8h7AARjPwACjggIAAoDAARjlwD4biCkAwABV9gIAAoDAARkBwD4biC4AwACjmAbAAIJDgXzAARpOwAEaVMABGucAALpKAAAAAQPAARpnwAEa5wAAAAEBAcABGm4AAACPMWCbAAAAYJsAAT4CPYjAARp7wD4b/hzAARqDLrorAQABHMABGpUutxsBAAGAwAEarMA+G/4AwACCywDAAIIcSsABGrkBFsABGt8cwAEawC7AAFXIAQABgMABGtjAPhv+AMAAgkSDZpsbBsAAgkSBfMABGuzAARrywAEuYAAAwABVyAAAAAEDwAEbCcABLmAAAAABAQHAARsQAAAAjzFgmwAAAGCbAAE+E07AARsjwAEbLwAAwABWK2CbAAGAwAEbMcA+HJtOwAEbQsABG0cAAINmYJsAARbAARtPgMABG0nAPhybg2abGz0cwAEbYhbAARtZLqPXwACB88AAVX0BAAGCwAEbdsA+HMwAwACBgE7AARuIAAAAun1gmwAATsABG6EAAAC25GCbAABJwAEbtx7AARu7wACjHwEAAYLAARvGwD4czAA+AknAARvVHsABG9nAAINhAgACJ4PugsABG+7APhzMAD4CPYvAARv/wD4dFojAARwPwD4cm4LAARwXwD4czD2KwAEcJcA+HMwWwAEcMoDAARwswD4cm4Nmmxs/ScABHEYewAEcSsAAox8BAAGCwAEcVcA+HMwAPgJJwAEcZh7AARxqwACDYQIAAieD6oLAARx8wD4czAA+Aj2MwAEcj8A+HSSIwAEcocA+HJuCwAEcqcA+HMw9isABHLnAPhzMFsABHMaAwAEcwMA+HJuDZpsbScABHNsewAEc38AAg2ECAAIng+uCwAEc78A+HMwAPgI9jMABHQLAPh0kiMABHRTAPhybgsABHRzAPhzMPYrAAR0swD4czBbAAR05gMABHTPAPhybg2abG0nAAR1OHsABHVLAAINhAgACJ4PsgsABHWTAPhzMAD4CPYzAAR13wD4dJIjAAR2JwD4cm4LAAR2RwD4czD2KwAEdocA+HMwWwAEdroDAAR2owD4cm4Nmmxs/ScABHcYewAEdysAAox8BAAGCwAEd1cA+HMwAPgFJwAEd/iIhHMABHhKEwAEeAsA+HSRBAQABKwDAAPXSACIiHsABHizAAINhAgACJ4PqgsABHj7APhzMAAEewAEeWcAAg2ECAAIng+uCwAEeacA+HMwAAR7AAR6EwACDYQIAAieD7ILAAR6WwD4czAA+AD4GTsABH2bAAR9uAACB52DAAKMgAR/AAR90wACjPAEAAS4APYjAAR+fwD4cmxzAAR+vhcABH6fAPh9ewABWLAMAAYDAAR/GwD4cmwK6fYPAAR/swD4dFrbkhMABIAzAPh0kwACjMD2KwAEgKsA+HMwWwAEgN4DAASAxwD4cm4Nmmxs9i8ABIErAPh0WFsABIGKFwAEgWsA+H166fcAAoyY9jMABIH3APh0kFsABIJeFwAEgj8A+H1625MAAoyk9jcABILTAPh9eKz8/P07AASDzwAEg/gAAwABWCWCbAAGAwAEhAMA+HJtOwAEhFMABIR0AAMAATL5gwACjhAEewAEhH8AAo4EDAAOAwAEhK8A+HJsqKQA9iMABIUTAPhybHMABIVWGwAEhTMA+IETAAFX1AQABgMABIV7APhybAMAAo449isABIWrAPhzMFsABIXeAwAEhccA+HJuDZpsbTsABIYgAAAC57WCbAABOwAEhncABIaMAAICKYMAA9l0BFsABIaqCwAEhpcA+HMycK5sfScABIbsiHsABIb/AAO5eAgACFMABIcnAPiDICAAnmbgAAR7AASHawADuXgIAAhTAASHkwD4gyAgAJ5QIAD4BScABIfsWwAEiCRbAASIEgsABIf/APhzMg2abG5u0mw8+Aj2PwAEiIcA+ILqIwAEiLMA+HJuCwAEiNMA+HMw9isABIkLAPhzMFsABIk+AwAEiScA+HJuDZpsbPz9JwAEiaCEcwAEidhbAASJxgsABImzAPhzMghebIEEBAAEawAEig5tNAMAA9dI+Aj0VwAEil8A+IMgIFsABIqSCwAEin8A+HMycK5sfScABIrciHsABIrvAAO5eAgACFMABIsXAPiDICAAng+0AAR7AASLawADuXgIAAhTAASLkwD4gyAgAJ5KaAD4CPRXAASNEwD4gyAgWwAEjVhbAASNRgsABI0zAPhzMg2abG5wrmx9JwAEjayIiIiIiIiIcwAEjeIfAASNvwD4gukEBAAErAMAA9dIAIR7AASOQwADuXgIAAhTAASOawD4gyAgAJ4OcAAAhHsABI7bAAO5eAgACFMABI8DAPiDICAAnmSkAACEewAEj3MAA7l4CAAIUwAEj5sA+IMgIACdcAAAhHsABJALAAO5eAgACFMABJAzAPiDICAAnmSoAACEewAEkKcAA7l4CAAIUwAEkM8A+IMgIACeArwAAIR7AASRPwADuXgIAAhTAASRZwD4gyAgAJ5ODAAAhHsABJHXAAO5eAgACFMABJH/APiDICAAngJsAPgQ9FcABJK7APiDICBbAASS7gsABJLbAPhzMnCubH0nAASTSHsABJNbAAO5eAgACFMABJODAPiDICAAng+0APgE9HMABJQEuwABVyQIAAoLAASUpwD4czBrAASU1hPgAwACCwz4CPRzAASV4LsAAVckCAAKCwAElj8A+HMwawAElm4c6AMAAgsNJwAElwRbAASXPFsABJcqCwAElxcA+HMyDZpsbnCqbEz4DPYjAASXrwD4cm4LAASXzwD4czD2KwAEmB8A+HMwWwAEmFIDAASYOwD4cm4NmmxtJwAEmKB7AASYswACDYQIAAieDnBbAASY/gsABJjrAPhzMg2abGwA+AT0cwAEmYRbAASZYLq9BwACB/MAAVcoCAAKCwAEmgsA+HMwfwAEmoJr1BAAEGsABJtibTSTAAScmAifAAFYtFsABJxqCwAEnFcA+HMyEF5sJFsABJ0WCwAEnQMA+HMyEF5sJkwAAwACjZz8/PRzAASerFsABJ6Iuo9fAAIHzuc0BAAGCwAEnzMA+HMwAwACBf0rAASfdAYLAASfkwD4czD9JwAEoLiEWwAEoOILAASgzwD4czJu0mw8+AUnAAShkFsABKG2CwAEoaMA+HMycIZsQPgBJwAEpABzAASkKgMABKQTAPhybQQEAAYHAASkNwD4csADAAPXSPgFKwAEpTAEcwAEpUy7AAFXMAQABgMABKXPAPhybAMAAgsY+Aj0cwAEqDi7AAFX6AgACgMABKijAPhybGsABKkHAAIMjAMAAgj89isABKl/APhzMFsABKmyAwAEqZsA+HJuDZpsbPz89isABKrzAPhzMFsABKsiCwAEqw8A+HMyDZpsbPRXAASrSwD4gyAgWwAEq34LAASrawD4czJwrmx9JwAEq8CIiIiIiIRzAASr9h8ABKvTAPiC6QQEAASsAwAD10gEewAErEMAA7l4CAAIUwAErGsA+IMgIACeDnAABHsABKzHAAO5eAgACFMABKzvAPiDICAAnmSkAAR7AAStSwADuXgIAAhTAAStcwD4gyAgAJ1wAAR7AAStzwADuXgIAAhTAASt9wD4gyAgAJ4ExAAEewAErlMAA7l4CAAIUwAErnsA+IMgIACeZKgA+AknAASu0IRzAASvIhMABK7jAPh0kQQEAASsAwAD10j4BScABK9sewAEr38AAg2ECAAIng+uEwAEr78A+HSQAPgE9HMABLA0uwABVyQIAAoTAASwkwD4dJBrAASw7h3gAwACCwz4BPRzAASxtLsAAVbsCAAKEwAEsnMA+HSQawAEss4TzAMAAgsQ/SsABLOgBHMABLO8uwABWLgYABoHAAS0DwD4csIPAAS0QwD4dFoXAAS0fwD4gKIbAAS01wD4gRIfAAS0/wD4guhbAAS1PgMABLUnAPhybg2abGwDAAIJGP0nAAS1hIRzAAS1uh8ABLWXAPiC6QQEAASsAwAD10j4BPRzAAS1/LsAAVbsCAAKHwAEtqsA+ILoawAEtuoTzAMAAgsQ/SsABLeEBHMABLeguui0JAAmBwAEt9MA+HLCDwAEuAcA+HRYrK4TAAS4cwD4dJIXAAS41wD4gKIbAAS5BwD4gRBbAAS5RgMABLkvAPhybg2abGykAwACCRQbAAIJFgXzAAS5lwAEua8ABNZwAALotAAAAAQPAAS52wAE1nAAAAAkJCcABLoQAAADAAFYrYJsAAMABLp0AAAC6fWCbAADAAS64AAAAtuJgmwAAwAEu0QAAALbjYJsAAMABLu0AAAC25GCbAADAAS8KAAAAwABWCWCbAADAAS8lAAAAwABMvmDAAKOEAMABLzsAAACAsGCbAADAAS9MAAAAhEZgwADyswAAYJsAAT4NScABL14hHMABL3CBwAEvYsA+KChBAQABKwDAAPXSPgE9HMABL4EuwABVyQIAAoHAAS+YwD4oKBrAAS+thO4AwACCwz9JwAEvziEcwAEv4YPAAS/SwD4oQkEBAAErAMAA9dI+AUnAAS/yIiEcwAEwBoTAAS/2wD4oT0EBAAErAMAA9dIAHsABMBHAAINhAgACJ4PqhMABMCPAPihPAD4CPRzAATA/LsAAVckCAAKDwAEwVsA+KEIawAEwbIUSAMAAgsM9i8ABMI/APihCKz8/ScABMLgcwAEwxYbAATC8wD4oa0EBAAEawAEwyMAAo3sAwAD10j4BScABMNgcwAEw7ITAATDcwD4oT0EBAAErAMAA9dI+AT0cwAEw/y7AAFXJAgACh8ABMRbAPih8GsABMSKGEgDAAILDPz4BScABMWEiIRzAATF1hMABMWXAPihPQQEAASsAwAD10gAewAExgMAAg2ECAAIng+uEwAExkMA+KE8APgE9HMABMawuwABVyQIAAoTAATHDwD4oTxrAATHahzwAwACCwz9OwAEyCcABMg8AAI8xYJsAARzAATIahsABMhHAPihrwABV9wIAAoXAATIkwD4oXC4AwACjjUAcwAEyTRbAATJIFMABMkLAPio6CQCDZpsbQQEAAYfAATJQwD4ofADAAPXSwAEyQsABMlQATsABMm7AATJ2AACB52DAAIMIASMUwAEyeMA+KIkIABrAATKfwACDIBrAATLXwACDIQFgwACDCD2PwAEy7cA+KHwcwAEy9C7AAFXZAgACFMABMwXAPio6CQAUwAEzDMA+KqQKAADAAIJATsABMx/AATMqAADAAFYvYMAA9HkBlD0VwAEzM8A+KjoJHMABMzsuwABWMAQABIfAATNUwD4ofIfAATNawD4ofITAATNgwD4oTxTAATNxwD4oiQgAAMAAgkhDwAEzgh7AATOJwACDYQIAAieAmxbAATOdFMABM5fAPio6CQCDZpsbAD4DPY/AATOswD4ofBzAATOzLsAAVdkCAAIWwAEzyhTAATPEwD4qOgkAg2abGxTAATPQwD4qpAoAAMAAgkA9FcABM+DAPio6CRzAATPoLsAAVjAEAASHwAE0AcA+KHyHwAE0B8A+KHyEwAE0DcA+KE8UwAE0HsA+KIkIAADAAIJIPRXAATQzwD4rDQscwAE0MRTAATQzwD4rDQsAXQEAAZQAwAD1nj0VwAE0ScA+KjoJHMABNFEuwABV1gEAARTAATRhwD4qOgkAAMAAglRJwAE0bRTAATRxwD4oiQgAPgE9HMABNI4WwAE0hS6j18AAgfO24QYABoLAATSgwD4oNYPAATStwD4oQoTAATS9wD4oTxTAATTYwD4rDQsAFsABNPCAwAE05MA+KBmDZpsbFMABNPbAPio6CQAAwACBgT4BPRzAATUaFsABNREuo9fAAIHztuYGAAaCwAE1JMA+KDWDwAE1McA+KEKEwAE1QcA+KE8UwAE1XMA+Kw0LABbAATV0gMABNWjAPigZg2abGxTAATV6wD4qOgkAAMAAgQpKwAE1jAEUwAE1k8A+KjoJAAbAAIJGgXzAATWhwAE1p8ABOxIAAMAAVi4AAAABA8ABNbrAATsSAAAABgYGwAE1wQAAAMAAVitgmwAAwAE11AAAALp9YJsAAMABNe8AAADAAFYJYJsAAMABNgQAAADAAEy+YMAAo4QAwAE2FAAAALntYJsAAMABNiQAAACAsGCbAAAAYJsAAT4RPRzAATY5FsABNjAuo9fAAIHzunwCAAKAwAE2TcA+LWqBwAE2WsA+LXkAwACBgk7AATZ1wAE2ewAAjzFgmwABHMABNoaDwAE2fcA+LZXAAFX3AgACgsABNpDAPi2GLgDAAKONQBzAATa5FsABNrSGwAE2rsA+LfaDZpsbQQEAATUAAAABAGCbAAGEwAE2vcA+LaYjHMABNsaHAMA+LkdBAQABKwAAhcABNsnAPi2zhwDAPi5HAWCbAADAAPXSwAE2rsABNs4APY3AATbVwD4tsxzAATbcLsAAVdkCAAI1AAAAAQBgmwABhMABNvbAPi2mIxzAATb/hwDAPi6lQQEAASsAAIbAATcCwD4t9ocAwD4upQFgmwAawAE3G8AAgyIAwACCQE7AATdDwAE3TAAAhEBgwADyswEqScABN1kcwAE3ZoTAATddwD4tpkEBAAErAMAA9dI+AT2OwAE3d8A+LfYcwAE3fy7AAFYxAQABhcABN5LAPi2zAMAAgkc+Az2PwAE3rMA+LuwewAE3t8AAg2ECAAInmbiEwAE3x8A+LaYAPY7AATfYwD4t9oXAATfgwD4tsz0cwAE39RbAATfsLqPXwACB87j5AQABFsABOBGGwAE4C8A+LfaDZpsbAMAAgco9jsABOCLAPi32HMABOCouwABV/AQABIbAAThRwD4t9oXAAThYwD4ts4fAAThewD4u7BrAAThzwACDUQDAAIIiTsABOJbAATipAADAAFYyYImeARbAATirLrlVwACB9U7AATjBwAE4zAAAt9JgmwABFsABONSGwAE4zsA+LfaDZpsbPY7AATjewD4t9hzAATjmLrpJAQABhsABOPzAPi32AMAAgmtJwAE5CCIiIRzAATkVhMABOQzAPi2mQQEAASsAwAD10gAhFsABOSEuwABVs8AAgf8AHsABOTDAAINhAgACJ5QIhMABOUDAPi2mAD4BPRzAATlTLsAAVckCAAIUwAE5asA+MAkJABrAATl8huIAwACCwz9OwAE5osABOa0AAIPkYMAA8rMBIRzAATm9gcABOa/APi15QQEAASsAwAD10knAATnKIhTAATnOwD4wwQoAACEewAE53cAAg2ECAAInk4MWwAE58YbAATnrwD4t9oNmmxsAPgE9HMABOgAuwABVyQIAAoHAAToiwD4teRrAATo3hPAAwACCwz89jsABOmHAPi32HMABOmkuuVkDAAOGwAE6e8A+LfYqFMABOonAPjDBCgAAwACCaD0XwAE6mi65VRTAATqnwD4v6ggAwACB9T0cwAE6yBbAATq/LqPXwACB87nsAwADFsABOuaAwAE62sA+LWqDZpsbhMABOuzAPi2mhsABOvbAPi32AMAAgYNKwAE7AgGGwAE7CcA+LfYGwACCR4F8wAE7F8ABOx3AATzVAADAAFYxAAAAAQPAATsvwAE81QAAAAEBAcABOzYAAACAsGCbAAAAYJsAAT4FScABO0IhHsABO0fAAINhAgACJ1wWwAE7WoDAATtVwD4yCYNmmxsA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PgQ9HMABr9QuwABVuwIAAoLAAa/0wD53PhrAAbAAh18AwACCxD2KwAGwIMA+dz4WwAGwLILAAbAnwD53PoNmmxs9HMABsEEWwAGwOC6j18AAgfO5/wIAAoDAAbBUwD52zoLAAbBbwD53PgDAAIHNSsABsGgBgsABsG/APnc+PgNJwAGw0SIhHMABsN8WwAGw2oLAAbDVwD53PoIXmyBBAQABGsABsOybaADAAPXSACEcwAGxDBbAAbEHgsABsQLAPnc+ghebIEEBAAEawAGxGZtaAMAA9dI+AT0cwAGxty7AAFW7AgACgsABsdfAPnc+GsABseOF4wDAAILEPz0cwAGyFBbAAbILLqPXwACB87oCAgACgMABsi7APnbOgsABsjXAPnc+AMAAgc5KwAGyQgGCwAGyScA+dz4GwACCYYF8wAGyXMABsmLAAbOoAADAAFZTAAAAAQPAAbJ5wAGzqAAAAAEBAcABsoAAAACPMWCbAAAAYJsAAT4GTsABspPAAbKeAACnWGCbAAEWwAGypoDAAbKgwD55+oNmmxs9HMABsrkWwAGysC6j18AAgfO4jAEAAYHAAbLRwD56DwDAAIGbPYjAAbLiwD55+hzAAbLqLsAAVfgCAAKAwAGzC8A+efoawAGzHcAAg04AwACCJj2IwAGzKcA+efocwAGzMS7AAFZUAwADgMABs0PAPnn6KSoAwACCZD0cwAGzZRbAAbNcLqPXwACB87iVAgACgcABs3vAPnoPFsABs42AwAGzh8A+efqDZpsbAMAAgZxKwAGzmAGAwAGzn8A+efoGwACCYoF8wAGzrcABs7PAAbVIAADAAFZVAAAAAQPAAbPHwAG1SAAAAAYGBsABs9UAAABjYJsAAMABs+gAAADAAFZWYJsAAMABtAAAAACAsGCbAADAAbQVAAAAwABMvmDAAKOEAMABtDgAAACdrmDAAKORAMABtFsAAACB52DAAIMIAABgmwABPgROwAG0cMABtHgAAKe2YJsAARzAAbSEhMABtHrAPntWwABV9gIAAoLAAbSTwD57OC4AwACjmD0cwAG0rRbAAbSkLqPXwACB87iKAQABFsABtNCAwAG0ysA+ex2DZpsbAMAAgRk9HMABtOSDwAG028A+e0XAAFX3AgACgMABtO7APnsdLgDAAKONSsABtQABHMABtQcuwABWVwQABIHAAbUewD57KRbAAbUwgMABtSrAPnsdg2abG4bAAbU2wD57fCkAwACCYwbAAIJjgXzAAbhpwAG4b8ABu6UAAMAAVlcAAAABA8ABuIXAAbulAAAABAQEwAG4kwAAAMAAVlZgmwAAwAG4pQAAAIIbYJsAAMABuLIAAACntmCbAADAAbjAAAAAuI5gwADyswAAYJsAAT4KTsABuOLAAbjoAACPMWCbAAEWwAG49YDAAbjqwD58bINmmxs9HMABuQgWwAG4/y6j18AAgfPAAFVZAQABhMABuRrAPnysAMAAgSE9jMABuSbAPnysFsABuYwcwAG5Ni7AAFXZAgACgMABuUfAPnxsGsABuWXAAIMmAMAAgkCDZpsbScABuZaDwAG5msA+fJU+AT0cwAG5uC7AAFXJAgACFsABueWAwAG52sA+fGyDZpsbGsABufGGPgDAAILDPz0cwAG6JRbAAbocLqPXwACB87iFAgACgcABujXAPnx7hMABujzAPnysAMAAgSI9jMABukjAPnysHMABulAuwABV+AIAAoLAAbpxwD58iBrAAbqFwACDTgDAAIImPYzAAbqRwD58rBzAAbqZLrpIAQABhMABuq7APnysAMAAgko9jMABurrAPnysHMABusIuwABWVAMAA4TAAbrUwD58rIPAAbrbwD58lSoAwACCZEnAAbr9g8ABuwHAPnyVPgE9HMABuygWwAG7Hy6j18AAgfO4kgEAAYTAAbtDwD58rADAAIEaPgE9HMABu2cWwAG7Xi6j18AAgfO4kwEAAYTAAbuDwD58rADAAIEcSsABu5UBhMABu5zAPnysBsAAgmSBfMABvYLAAb2IwAG+wAAAwABWVAAAAAEDwAG9mcABvsAAAAADAwPAAb2nAAAAjzFgmwAAwAG9swAAAMAAVlhgwADyswDAAb3OAAAAuVpgwADyswAAYJsAAT4FTsABvfHAAb4EAADAAFYyYImeARbAAb4GLrlVwACB9T2IwAG+FsA+fq4cwAG+Hi66SQEAAYDAAb40wD5+rgDAAIJrPYjAAb5AwD5+rhzAAb5ILrlZAwADgMABvlrAPn6ugcABvmHAPn67gsABvnfAPn7MAMAAgmg9F8ABvosuuVWDwAG+mMA+fuPAAIH1SsABvrABgMABvrfAPn6uBsAAgmWBfMABvsXAAb7LwAHB/QAAwABWWQAAAAED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KT4BScACJpEewAImlcAAg2ECAAInmQmCwAImo8A+wiYAPg1AHMACJsOBwAImu8A+wg9BAQABGsACJsbAAKN8AMAA9dLAAia7wAIm1gBOwAIm58ACJvkAALhOYJsAAYLAAib7wD7CJk7AAicOwAInEgAAgxNgwADyswEWwAInFC65VMAAgfQ9F8ACJzkuuVQpwACB9D2IwAInZcA+wgIcwAInbS63GgEAAYLAAid9wD7CJgDAAIJzPYrAAieMwD7CJhbAAieZgMACJ5PAPsICg2abGz0XwAInpy65VIXAAifFwD7C0MAAgfRJwAIn0iEewAIn18AAg2ECAAInmQqCwAIn5cA+wiYAPgM9HMACKA4uwABVyQIAAoLAAig0wD7CJhzAAihXGsACKECEqYTNAQABJ5kKAIiuAMAAgsNOwAIop8ACKLAAAJvPYJsAARbAAijEhMACKLLAPsK2m8+bDUnAAijYFsACKOWGwAIo3MA+w6aUPZsUPgE9isACKUzAPsImHMACKVwWwAIpUy6vQcAAgfzAAFXoAgACgMACKWrAPsIChsACKXHAPsOmAMAAo2g+AT2KwAIp6MA+wiaGwAIp78A+w6Y/PRzAAiogFsACKhcuo9fAAIHzuE0CAAKEwAIqOMA+wraCwAIqS8A+wiYAwACBtj2IwAIqWsA+wgKCwAIqYsA+wiY9icACKnDAPsIPHsACKnrAAKODAQABgMACKpXAPsICAEnAAiqlIRzAAiqxgcACKqnAPsIPQQEAARrAAiq0wACjfADAAPXSPgI9iMACKxLAPsICHMACKyKBwAIrGsA+wg/AAFX0AgACgMACKzHAPsICLgDAAKOXQB7AAitQwACDYQIAAieDnBbAAitkgMACK17APsICg2abGwDAAitQwAIraQA/PYrAAit+wD7CJhbAAiuLgMACK4XAPsICg2abG0nAAiueHsACK6LAAINhAgACJ4OcgsACK7DAPsImAD4GScACK8EcwAIrzYHAAivFwD7CD0EBAAEawAIr0MAAo3wAwAD10j4BPRzAAiv3FsACK+4uo9fAAIHzudEBAAGCwAIsDcA+wiYAwACBlT89iMACLCbAPsICHMACLC4uwABV9AEAAYDAAiw9wD7CAgDAAIKYPRzAAixWFsACLE0uo9fAAIHztykCAAKDwAIsYcA+wkmAwAIsbcA+wgIAwACBcj2JwAIsfcA+wg8ewAIsh8AAo4MBAAGAwAIsosA+wgIAScACLLIhHMACLL6BwAIstsA+wg9BAQABGsACLMHAAKN8AMAA9dI+Aj2IwAItH8A+wgIcwAItL4HAAi0nwD7CD8AAVfQCAAKAwAItPsA+wgIuAMAAo5dAHsACLV3AAINhAgACJ4OcFsACLXGAwAIta8A+wgKDZpsbAMACLV3AAi12AD89isACLYvAPsImFsACLZiAwAItksA+wgKDZpsbPgFCwAIttQBKwAItzgGAwAIt1cA+wgIGwACCeoF8wAIt48ACLenAAjmXAADAAFaAAAAAAQPAAi31wAI5lwAAAAICAsACLfwAAACPMWCbAADAAi4VAAAAgedgwACDCAAAYJsAAT4DTsACLirAAi4vAAGCHGDAAPR5ARbAAi48FsACLjeAwAIuMcA+xvKDZpsbghybGEnAAi5GHMACLk+CwAIuSsA+xxZBAQABGsACLlKdMQDAAPWcPgFKwAIubAEcwAIucy7AAFaJAgACgMACLo7APsbygcACLpXAPsb/AMAAgodJwAIuqiIcwAIus4LAAi6uwD7HFkEBAAEawAIutp01AMAA9ZwBHMACLsiCwAIuw8A+xxZBAQABGsACLsudNwDAAPWcPgFKwAIu5gEcwAIu7S7AAFaKAQABgMACLv3APsbyAMAAgo1JwAIvEBzAAi8ZgsACLxTAPscWQQEAARrAAi8cnTQAwAD1nD4BSsACLzIBHMACLzkuwABWiwEAAYDAAi9MwD7G8gDAAIKOScACL18cwAIvaILAAi9jwD7HFkEBAAEawAIva504AMAA9Zw+AUrAAi+BARzAAi+ILsAAVkEBAAGAwAIvm8A+xvIAwACCj0nAAi+uHMACL7eCwAIvssA+xxZBAQABGsACL7qdQgDAAPWcPgFKwAIvzgEcwAIv1S7AAFaMAQABgMACL+jAPsbyAMAAgpBJwAIv+xzAAjAEgsACL//APscWQQEAARrAAjAHnTAAwAD1nD4CTsACMCvAAjAxAAGAimDAAPZdARbAAjA+FsACMDmAwAIwM8A+xvKDZpsbnCubH0nAAjBRIh7AAjBVwADuXgIAAoPAAjBfwD7I8CeTmAABHsACMHHAAO5eAgACg8ACMHvAPsjwJ5vtAD4BSsACMJYBHMACMJ0uwABWjQEAAYDAAjCuwD7G8gDAAIKTScACMMMewAIwx8AA7l4CAAKDwAIw0cA+yPAnhAIAPgFKwAIw6wEcwAIw8i7AAFaOAQABgMACMQPAPsbyAMAAgpRJwAIxGB7AAjEcwADuXgIAAoPAAjEmwD7I8CeZaAA+AUrAAjFAARzAAjFHLsAAVo8CAAKAwAIxW8A+xvKBwAIxYsA+xv8AwACCgEnAAjF5HsACMX3AAO5eAgACg8ACMYfAPsjwJ5lZAD4BSsACMaIBHMACMakuwABWkAIAAoDAAjG+wD7G8oHAAjHFwD7G/wDAAIKBScACMdwewAIx4MAA7l4CAAKDwAIx6sA+yPAnmVoAPgFKwAIyAwEcwAIyCi7AAFaRAQABgMACMh3APsbyAMAAgopJwAIyMh7AAjI2wADuXgIAAoPAAjJAwD7I8CeD7AA+AUrAAjJbARzAAjJiLsAAVpIBAAGAwAIyd8A+xvIAwACCjEnAAjKMHsACMpDAAO5eAgACg8ACMprAPsjwJ5mOAD4BSsACMrQBHMACMrsuwABWiQIAAoDAAjLWwD7G8oHAAjLdwD7G/wDAAIKHScACMvQiIRbAAjL5LsAAVbPAAIH/ACIewAIzE8AA7l4CAAKDwAIzHcA+yPAnmYgAAR7AAjMwwADuXgIAAoPAAjM6wD7I8CeZJAA+AEnAAjOJHsACM43AAO5eAgACg8ACM5fAPsjwJ5lyAD4BSsACM7MBHMACM7ouwABWOAIAAoDAAjPGwD7G8hrAAjPUwACC6QDAAIK7ScACM+4WwAIz/RbAAjP4gMACM/LAPsbyg2abG5u0mw8+AUrAAjQVARzAAjQcLsAAVokCAAKAwAI0N8A+xvKBwAI0PsA+xv8AwACCh0nAAjRVHsACNFnAAO5eAgACg8ACNGPAPsjwJ5mAAD4DPYjAAjSTwD7G8hbAAjShgMACNJvAPsbyg2abGz0cwAI0ry7AAFW7AgACgMACNM/APsbyGsACNNyHXwDAAILESsACNP4BHMACNQUuwABWgAIAAoDAAjUSwD7G8oHAAjUZwD7G/wDAAIJ6PgBJwAI1cxzAAjV8gsACNXfAPscWQQEAARrAAjV/nUUAwAD1nD4BSsACNZkBHMACNaAuwABWkwEAAYDAAjXOwD7G8gDAAIJ7ScACNeEiHMACNeqCwAI15cA+xxZBAQABGsACNe2dRADAAPWcAR7AAjYSwACDYQIAAidEFsACNieAwAI2IcA+xvKDZpsbAD4CPRzAAjY/FsACNjYuo9fAAIHzudEBAAEWwAI2W4DAAjZVwD7G8oNmmxsAwACBlUrAAjZoARzAAjZvLsAAVpQCAAKAwAI2hsA+xvIrAMAAgoJJwAI2nxzAAjaogsACNqPAPscWQQEAARrAAjarnUMAwAD1nD4CPRzAAjbWFsACNs0uo9fAAIHzudEBAAEWwAI28oDAAjbswD7G8oNmmxsAwACBlUrAAjb/ARzAAjcGLsAAVpUCAAKAwAI3IcA+xvIrAMAAgoNJwAI3OhzAAjdDgsACNz7APscWQQEAARrAAjdGnUYAwAD1nD4BSsACN1gBHMACN18uwABWlgIAAoDAAjeAwD7G8isAwACChT4AScACN/UlwAI4BBbAAjf/gMACN/nAPsbyg2abG2Cc1T4EPYjAAjgbwD7G8hbAAjgpgMACOCPAPsbyg2abG07AAjg7AAAAm75gmwAARMACOEs+Az2LwAI4uMA+zmGAwAI4w8A+xvI9HMACONIuwABWJgEAASbAAjjjAYDAAjjjwD7G8mCc1QDAAILFPYjAAjjzwD7G8hbAAjkBgMACOPvAPsbyg2abGyXAAjkcgMACORbAPsbyYJzVSsACOTIBHMACOTkuwABWgAIAAoPAAjlGwD7OYYHAAjlQwD7G/wDAAIJ6PgFKwAI5bQEcwAI5dC7AAFaFAgACgMACOX7APsbygcACOYXAPsb/AMAAgpUGwACCe4F8wAI5nMACOaLAAj8qAADAAFaTAAAAAQPAAjnPwAI/KgAAAAEBAcACOdYAAACPMWCbAAAAYJsAAT4KTsACOenAAjnuAACDZmCbAAEWwAI59oDAAjnwwD7PXINmmxtAHsACOgfAAINhAgACJ4OcgcACOhXAPs9xAMACOgfAAjoaAE7AAjonwAI6MQAAwABWl2CbAAEWwAI6QRbAAjo4gcACOjPAPs9xm8+bDYNmmxtOwAI6T8ACOlQAAIIcYMAA9HkBFsACOmCCwAI6VsA+z7eCHJsYScACOmoWwAI6bi65VMAAgfQ+AUnAAjqTIh7AAjqYwADuXgIAAoPAAjqiwD7P5RrAAjqonVcAAR7AAjrFwADuXgIAAoPAAjrPwD7P5RrAAjrVnUMAPgI9HMACOwQWwAI6+y6j18AAgfO4+QEAAYHAAjsawD7PcQDAAIHKSsACOykBHMACOzAuwABWUwEAAYDAAjtIwD7PXADAAIJhScACO10iHsACO2HAAO5eAgACg8ACO2vAPs/lGsACO3GdMAABHsACO43AAO5eAgACg8ACO5fAPs/lGsACO52dMQA+A0nAAju6Ih7AAju+wACDYQIAAieZJILAAjvQwD7PtwABHsACO97AAINhAgACJ5kigsACO+/APs+3AD4CPRzAAjwQFsACPAcuo9fAAIHzuPkBAAGBwAI8JsA+z3EAwACBykrAAjw3ARzAAjw+LsAAVlMBAAGAwAI8VsA+z1wAwACCYT89i8ACPWvAPs/lFsACPYEWwAI9fILAAj1ywD7Pt4NmmxuCHJsYScACPY8iHsACPZTAAO5eAgACg8ACPZ7APs/lGsACPaSdVwABHsACPcPAAO5eAgACg8ACPc3APs/lGsACPdOdQwA+Aj0cwAI+BBbAAj37LqPXwACB87j5AQABgcACPhrAPs9xAMAAgcpKwAI+KwEcwAI+Mi7AAFZTAQABgMACPkrAPs9cAMAAgmE/Pz9OwAI+c8ACPncAAIMTYMAA8rMBFsACPnkuuVTAAIH0PRfAAj6aLrlUKcAAgfQ9iMACPsLAPs9cHMACPsouwABWmAEAAYDAAj7nwD7PXADAAIJ9PRfAAj7zLrlUhMACPxHAPtIcwACB9ErAAj8aAYDAAj8hwD7PXAbAAIJ8gXzAAj8vwAI/NcACQN0AAMAAVpkAAAABA8ACP1HAAkDdAAAAAQEBwAI/WAAAAI8xYJsAAABgmwABPgVOwAI/a8ACP3UAAMAAVj1gmwABFsACP32AwAI/d8A+0r6DZpsbScACP4chHsACP4zAAINhAgACJ4OcgcACP5rAPtLTAD4CPRzAAj+/LsAAVckCAAKBwAI/4cA+0tMcwAJACBrAAj/yhMmEzQEAASeDnACIrgDAAILDPYnAAkAjwD7S0xzAAkA4FsACQC8ur0HAAIH8wABV5QIAAoDAAkBFwD7SvioAwACjZT89iMACQF7APtK+HMACQGYuwABWmgEAAYHAAkCHwD7S0wDAAIJ/PRzAAkCgFsACQJcuo9fAAIHztyQBAAGBwAJAvcA+0tMAwACBz0rAAkDNAYDAAkDUwD7SvgbAAIJ9gXzAAkDiwAJA6MACQaoAAMAAVpgAAAABA8ACQQTAAkGqAAAAAQEBwAJBCwAAAI8xYJsAAABgmwABPgROwAJBHsACQSQAAIIbYJsAARbAAkEsgMACQSbAPtQCg2abGz2IwAJBNsA+1AIcwAJBPi7AAFabAQABgMACQVvAPtQCAMAAgn49HMACQXAWwAJBZy6j18AAgfO3JwEAAYHAAkGOwD7UFwDAAIHQSsACQZoBgMACQaHAPtQCBsAAgn6BfMACQa/AAkG1wAJCHAAAwABWmwAAAAEDwAJB0cACQhwAAAABAQHAAkHYAAAAjzFgmwAAAGCbAAE+AUrAAkHlARzAAkHsLsAAVpoBAAEWwAJCE4DAAkINwD7UvoNmmxsAwACCfwbAAIJ/gXzAAkIhwAJCJ8ACQx0AAMAAVpoAAAABA8ACQkfAAkMdAAAAAQEBwAJCTgAAAI8xYJsAAABgmwABPgZAHsACQmLAAINhAgACJ4OcgMACQnDAPtUoAMACQmLAAkJ2AE7AAkKIwAJCjgAAghtgmi4BJsACQogBgMACQpDAPtUoYJouPYjAAkKbwD7VKBzAAkKjLrcaAQABgMACQrPAPtUoAMAAgnM9iMACQr/APtUoHMACQscuwABWAgIAAoDAAkLYwD7VKIHAAkLfwD7VYADAAIJRQB7AAkLywACDYQIAAieC2oDAAkMAwD7VKADAAkLywAJDBgBKwAJDDQGAwAJDFMA+1SgGwACCgIF8wAJDIsACQyjAAkTqAADAAFaPAAAAAQPAAkM7wAJE6gAAAAICAsACQ0IAAACPMWCbAADAAkNbAAAAgedgwACDCAAAYJsAAT4GTsACQ3DAAkN6AADAAFacYJsAAYjAAkN8wD7WMRbAAkOKgMACQ4TAPtYxg2abG0AewAJDm8AAg2ECAAInmWiCwAJDrMA+1lUAwAJDm8ACQ7YAPRzAAkPGFsACQ70uo9fAAIHzuIACAAKCwAJD28A+1lWBwAJD5sA+1j4AwACB1k7AAkP6wAJD/wAAg2ZgmwABFsACRAeAwAJEAcA+1jGDZpsbScACRBEewAJEFcAAg2ECAAIng5yDwAJEI8A+1tQAPgM9HMACRFwWwAJEUy6j18AAgfO50QEAAYPAAkRywD7W1ADAAIGVPYjAAkR/wD7WMRzAAkSHLsAAVfQBAAGAwAJElsA+1jEAwACCmD0cwAJErRbAAkSkLqPXwACB87cpAgACgsACRLjAPtZVFsACRMmAwAJEw8A+1jGDZpsbAMAAgXI/SsACRNoBgMACROHAPtYxBsAAgoGBfMACRO/AAkT1wAJHHAAAwABWkAAAAAEDwAJFCcACRxwAAAACAgLAAkUQAAAAjzFgmwAAwAJFKQAAAIHnYMAAgwgAAGCbAAE+Bk7AAkU+wAJFSQAAwABWnWCbAAGIwAJFS8A+19MWwAJFWYDAAkVTwD7X04NmmxtAHsACRWrAAINhAgACJ5lZgMACRXzAPtfTAMACRWrAAkWCAD0cwAJFkhbAAkWJLqPXwACB87iBAgACgsACRajAPtf3gcACRbTAPtfgAMAAgdNOwAJFyMACRc0AAINmYJsAARbAAkXVgMACRc/APtfTg2abG0nAAkXfHsACRePAAINhAgACJ4Ocg8ACRfHAPth2AD4DPRzAAkYlFsACRhwuo9fAAIHzudEBAAGDwAJGO8A+2HYAwACBlT2IwAJGSMA+19McwAJGUC7AAFX0AQABgMACRl/APtfTAMAAgpg9HMACRnYWwAJGbS6j18AAgfO3KQIAAoLAAkaBwD7X9xbAAkaTgMACRo3APtfTg2abGwDAAIFyScACRqUewAJGqcAAg2ECAAInnJKDwAJGuMA+2HYAPgE9HMACRscuwABVyQIAAoPAAkbewD7YdhrAAkbqhw4AwACCwz9KwAJHDAGAwAJHE8A+19MGwACCgoF8wAJI7sACSPTAAlGyAADAAFaUAAAAAQPAAkkKwAJRsgAAAAICAsACSREAAACPMWCbAADAAkkeAAAAt9ZgmwAAAGCbAAE+C07AAkk4wAJJRAAAwABWUmCbAAGAwAJJRsA+2bhOwAJJV8ACSWIAAKdYYJsAAYjAAklkwD7ZuBbAAklygMACSWzAPtm4g2abG0AiHsACSYPAAINhAgACJ5kJgMACSZHAPtm4AAEewAJJm8AAg2ECAAInRIDAAkmqwD7ZuADAAkmDwAJJsABOwAJJu8ACScEAAIDQYMAA9HkBk0nAAknKHsACSc7AAINhAgACJ0SAwAJJ3cA+2bgAPgM9iMACSe3APtm4FsACShgcwAJJ9S7AAFYEAQABgsACSgvAPtnaAMAAglaDZpsbPRzAAkotFsACSiQuo9fAAIHzt9QEAASTgMACSkLAPtm4gcACSknAPtnFFsACSl2AwAJKV8A+2biDZpsbAMAAgcBKwAJKagEWwAJKd4DAAkpxwD7ZuINmmxs/TsACSozAAkqQAACDE2DAAPKzARbAAkqSLrlUwACB9D0XwAJKsy65VCnAAIH0QUPAAkrbKT4JTsACSvbAAkr7AACDZmCbAAEWwAJLA4DAAkr9wD7ZuINmmxtJwAJLDx7AAksTwACDYQIAAieZCobAAkshwD7bUAA+Aj2IwAJLMsA+2biGwAJLOsA+21BCwAJLSAA/TsACS2HAAktpAADAAFaeYMAA9HkBk07AAkuFwAJLigAAgPtgwACjBgEewAJLjMAAowQBAAGAwAJLoMA+2bgAQ8ACS64hHMACS7oUwAJLtcA+28MIAEEBAAErAMAA9dI+A0nAAkvNFsACS9YUwAJL0cA+28MIAMAAVp/AAKMIPgE9iMACS+zAPtm4HMACS/QutxoBAAGAwAJMBMA+2bgAwACCcz4BPYjAAkwnwD7ZuBzAAkw0FMACTC/APtvDCACCxQIAAoDAAkw6wD7ZuC4AwACjCz2PwAJMWsA+260cwAJMYofAAkxawD7brV0BAAEWwAJMahTAAkxlwD7bwwgAwABWoMAAowkAwAD1nj0VwAJMhMA+28MIHMACTJAUwAJMi8A+28MIAMAAVqEBAAGAwAJMnMA+2bgAwACjDD2OwAJMssA+21AWwAJMv4DAAky5wD7ZuINmmxs9jMACTM3APtpfHMACTMuEwAJMzcA+2l9dAQABlADAAPWeScACTNohHsACTN/AAINhAgACJ4CbhsACTO3APttQAD4FScACTP4ewAJNAsAAg2ECAAInmQqGwAJNEMA+21AAPgI9iMACTSPAPtm4hsACTSvAPttQQsACTTsAP0nAAk1pIR7AAk1uwACjBQEAAYbAAk2EwD7bUAA+AknAAk2XFsACTa8WwAJNpoPAAk2bwD7Z9pvPmw2UPZsUPgE9iMACTjjAPtm4HMACTkkWwAJOQC6vQcAAgfzAAFXoAgACgMACTlfAPtm4FsACTmmDwAJOXsA+2fabz5sNAMAAo2g+Aj0cwAJO0y7AAFXJAgAChsACTvvAPttQHMACTx4awAJPB4SphM0BAAEnmQoAiK4AwACCwz2IwAJPP8A+2bgWwAJPUoPAAk9HwD7Z9pvPmw1CwAJPcgA/TsACUArAAlAQAAC4PWCa9gEfwAJQFpr/AgACGsACUC+bYBbAAlA7hsACUDbAPttQgxWbHABOwAJQUMACUFgAACJgiJMBIxzAAlBih8ACUFrAPtutgIsBAAGTAMAA9agawAJQeoS0HMACUMAawAJQqYSphM0BAAEngJsAiK4BYIiTPY7AAlDcwD7bUBzAAlDjLsAAVgYDAAOAwAJQ9cA+2bgUwAJQ/MA+3pEKABTAAlEFwD7eXAkAAMAAglU/PYjAAlEbwD7ZuIbAAlEjwD7bUD0XwAJRMy65VIXAAlFRwD7bGsAAgfQ9HMACUWMWwAJRWi6j18AAgfO31AQABITAAlF1wD7aX4PAAlF8wD7Z9oHAAlGIwD7ZxYDAAlGWwD7ZuADAAIHASsACUaIBgMACUanAPtm4BsAAgoOBfMACUkrAAlJQwAJeJQAAwABWlQAAAAEDwAJSasACXiUAAAACAgLAAlJxAAAAjzFgmwAAwAJSfgAAALfWYJsAAABgmwABPglOwAJSmMACUqIAALfcYJsAAYjAAlKkwD7fvBbAAlKygMACUqzAPt+8g2abG0AewAJSw8AAg2ECAAInmSmCwAJS0cA+394AwAJSw8ACUtsATsACUujAAlLtAACDZmCbAAEWwAJS9YDAAlLvwD7fvINmmxtJwAJS/x7AAlMDwACDYQIAAieWP4PAAlMRwD7gLQA+Aj0cwAJTKRbAAlMgLqPXwACB87ffBQAFk4LAAlNCwD7f3oHAAlNNwD7fyYPAAlNbwD7gLSoAwACBwUrAAlNvAYPAAlN2wD7gLT9OwAJTjcACU5EAAYMTYMAA8rMBFsACU5MuuVTAAIH0PRfAAlO0LrlUKcAAgfROwAJT4MACU+YAAIDQYMAA9HkBk07AAlSOAAAAt+FgwADyswBDwAJUoCk+CU7AAlS5wAJUwQAAwABWnmDAAPR5AZNOwAJU3cACVOIAAID7YMAAowYBHsACVOTAAKMEAQABgMACVPjAPt+8AEnAAlUGHMACVQ8UwAJVCsA+4SgIAEEBAAEawAJVEsAAowIAwAD10j4EPYjAAlWmwD7fvBzAAlWuLrcaAQABgMACVb7APt+8AMAAgnNOwAJV0sACVd0AAMAAVqJgwADyswEewAJV38AAg2ECAAIngqYWwAJV84DAAlXtwD7fvINmmxsAPSMcwAJWDobAAlYCwD7g+kEBAAErAMAA9dKOwAJWAsA+4PohFMACVhPAPuGdCQArAWDAAPKzScACVicUwAJWK8A+4Z0JAD4DTsACVknAAlZPAAC3OGCbAAEWwAJWV4DAAlZRwD7fvINmmxs9iMACVmfAPt+8HMACVm8utxoBAAEUwAJWf8A+4hwKAADAAIJzPRzAAlaaFsACVpEuo9fAAIHzt+4CAAIUwAJWsMA+4hwKABbAAla9gMACVrfAPt+8g2abGwDAAIFVPz4BQ8ACVuUhHMACVvEUwAJW7MA+4SgIAEEBAAErAMAA9dI+A0nAAlcGFsACVw8UwAJXCsA+4SgIAMAAVp/AAKMIPgI9iMACVyfAPt+8HMACVy8utxoBAAGAwAJXP8A+37wAwACCc0nAAldTHsACV1fAAINhAgACJ4KmFsACV2uAwAJXZcA+37yDZpsbAD4DTsACV4jAAleOAAC3OGCbAAEWwAJXloDAAleQwD7fvINmmxs9iMACV6rAPt+8HMACV7IutxoBAAEUwAJXwsA+4y0JAADAAIJzPRzAAlfhFsACV9guo9fAAIHzt+4CAAIUwAJX98A+4y0JABbAAlgEgMACV/7APt+8g2abGwDAAIFVPz4BPYjAAlg4wD7fvBzAAlhFFMACWEDAPuEoCACCxQIAAoDAAlhLwD7fvC4AwACjCz2PwAJYb8A+4RIcwAJYd4fAAlhvwD7hEl0BAAEWwAJYfxTAAlh6wD7hKAgAwABWoMAAowkAwAD1nj0VwAJYm8A+4SgIHMACWKcUwAJYosA+4SgIAMAAVqEBAAGAwAJYs8A+37wAwACjDD2NwAJY1cA+4OYcwAJY04XAAljVwD7g5l0BAAGUAMAA9Z49i8ACWOLAPuAtFsACWO+AwAJY6cA+37yDZpsbTsACWQIAAAC4PWCbAABJwAJZDx7AAlkTwACDYQIAAieAm4PAAlkhwD7gLQA+Aj0VwAJZMsA+5IYJiMACWTrAPt+8g8ACWULAPuAtPYvAAllQwD7gLRbAAlldgMACWVfAPt+8g2abGz9JwAJZcR7AAll1wACDYQIAAieWP4PAAlmDwD7gLQA+Az0cwAJZnRbAAlmULqPXwACB87ffBQAFhcACWcDAPuDmgsACWcfAPt/egcACWdLAPt/Jg8ACWeDAPuAtNQAAAAEAYMAA8rMBhsACWebAPuD6IxzAAlnyFADAPuVJCgBBAQABKwAAKhQAwD7lSQoAAWDAAPKzAMAAgcE9F8ACWgUuuVSEwAJaI8A+4LnAAIH0SsACWjABg8ACWjfAPuAtP0nAAlpMHMACWlYUwAJaUMA+5IYJAEEBAAErAMAA9dI+AUnAAlp9HsACWoHAAKMFAQABg8ACWpfAPuAtAD4DTsACW3DAAlt2AAC4PWCa9gEfwAJbfJr/AgACGsACW5WbYBbAAluhg8ACW5zAPuAtgxWbHABOwAJbuMACW8AAACJgiJMBIxzAAlvKh8ACW8LAPuESgIsBAAGTAMAA9agawAJb5IS0HMACXCwawAJcFYSphM0BAAEngJsAiK4BYIiTPYjAAlxKwD7fvBzAAlxSLsAAVgYDAAOAwAJcZMA+37wUwAJca8A+5iALABTAAlx0wD7l6woAAMAAglU+BT0cwAJcly7AAFXJAgACg8ACXL3APuAtHMACXOAawAJcyYSphM0BAAEnlj8AiK4AwACCwz2LwAJdN8A+4C0WwAJdSILAAl0+wD7f3pvPmw09HMACXWUWwAJdXC6j18AAgfO33wUABYXAAl2KwD7g5oLAAl2RwD7f3oHAAl2cwD7fyYPAAl2qwD7gLTUAAAABAGDAAPKzAYbAAl2wwD7g+iMcwAJdvBQAwD7nMwoAQQEAASsAACoUAMA+5zMKAAFgwADyswDAAIHBPRfAAl3RLrlUhMACXe/APuC5wACB9ErAAl3+AYPAAl4FwD7gLT8GwACChIF8wAJe88ACXvnAAmENAADAAFajAAAAAQPAAl8TwAJhDQAAAAEBAcACXxoAAACPMWCbAAAAYJsAAT4FQB7AAl8uwACDYQIAAieDnBbAAl9CgMACXzzAPufCg2abGwDAAl8uwAJfRwBOwAJfgcACX4YAAINmYJsAARbAAl+cFsACX5MWwAJfjoDAAl+IwD7nwoNmmxubz5sNg2abG07AAl+qwAJfrwAAghxgwAD0eQEWwAJftoHAAl+xwD7oA4IcmxhJwAJfwCIiIR7AAl/FwADuXgIAAoLAAl/PwD7oOBrAAl/VnVcAACEewAJf8cAA7l4CAAKCwAJf+8A+6DgawAJgAZ1DAAAiIR7AAmAowADuXgIAAoLAAmAywD7oOBrAAmA4nTAAASIhHsACYFfAAINhAgACJ5kkgcACYGnAPugDAAAhHsACYHPAAINhAgACJ5kigcACYITAPugDAD4BPRzAAmCULsAAVbsCAAKBwAJgtMA+6AMawAJgwIdfAMAAgsQ/SsACYOQBHMACYOsuwABWUwEAAYDAAmEDwD7nwgDAAIJhBsAAgoWBfMACYtHAAmLXwAJoKAAAwABWlgAAAAEDwAJi98ACaCgAAAACAgLAAmMLAAABY2CbAADAAmMYAAAAt9ZgmwAAAGCbAAE+CUAewAJjM8AAg2ECAAInXBbAAmNHgMACY0HAPulqg2abGwDAAmMzwAJjTABOwAJjZsACY3UAAMAAVqRgwACjkQEewAJjd8AAo4ICAAKAwAJjjcA+6WopAE7AAmOlwAJjqwAAjzFgmwABHMACY7yCwAJjrcA+6baTFwEAAYDAAmPBwD7pagDAAKOZTsACY9PAAmPYAACDZmCbAAEWwAJj4IPAAmPawD7p4oNmmxtJwAJj6h7AAmPuwACDYQIAAieDnITAAmP8wD7qFAA+A0nAAmQLIRzAAmQcgcACZA/APul2QQEAASsAwAD10j4BPRzAAmQvLsAAVbsCAAKBwAJkXMA+6XYawAJkcIdfAMAAgsQ/PYvAAmSYwD7p4hzAAmSvgsACZKDAPum2wABV9gIAAoDAAmS+wD7pai4AwACjmErAAmTSARzAAmTZLsAAVqMBAAGDwAJk9MA+6eIAwACChD89i8ACZQbAPuniHMACZR2CwAJlDsA+6bbAAFX0AgACgMACZSzAPulqLgDAAKOXScACZT4ewAJlQsAAg2ECAAInmSmEwAJlUMA+6hQAPgJJwAJlXxzAAmWEFsACZXKCwAJlY8A+6baSZ8AAo5SAiwEAAZUAwAD1qD4BPRzAAmXoFsACZd8uo9fAAIHzt8EDAAMawAJmEobeFsACZlCAwAJmSsA+6WqDZpsbg8ACZmLAPuniAMAAgeE/SsACZngBHMACZn8uwABWlQIAAoPAAmaawD7p4oHAAmahwD7pdgDAAIKDP0nAAma6IiEewAJmv8AAg2ECAAInmQmEwAJmzcA+6hQAACEewAJm18AAg2ECAAInRITAAmbmwD7qFAA+Aj0cwAJnKi7AAFXJAgAChMACZ0zAPuoUHMACZ28awAJnWISphM0BAAEnmQkAiK4AwACCwz0cwAJnkxbAAmeKLq9BwACB/MAAVcoCAAKDwAJnqsA+6eIfwAJntZr/AgACGsACZ86bcRbAAmfahMACZ9XAPuoUhBebCQAAwACjZz9KwAJn8gEcwAJn+S7AAFaUAgACg8ACaBDAPunigcACaBfAPul2AMAAgoIGwACChoF8wAJpNsACaTzAAmvsAADAAFalAAAAAQPAAmlQwAJr7AAAAAEBAcACaVcAAACPMWCbAAAAYJsAAT4DTsACajLAAmo3AACA+2DAAKMGAR7AAmo5wACjBAEAAYDAAmpNwD7s3gBDwAJqWSEcwAJqZYHAAmpgwD7s80EBAAErAMAA9dI+AknAAmp2FsACan+BwAJqesA+7PPAAFafwACjCD4EPYjAAmqTwD7s3hzAAmqbLrcaAQABgMACaqvAPuzeAMAAgnNOwAJqwcACascAALc4YJsAARzAAmrJLsAAVj4BAAGAwAJq1cA+7N4AwACCUj2IwAJq5cA+7N4cwAJq7S63GgEAAYLAAmr9wD7tfADAAIJzPRzAAmtCFsACazkuo9fAAIHzt+4CAAKCwAJrWMA+7XwWwAJrZYDAAmtfwD7s3oNmmxsAwACBVT4BPYjAAmuDwD7s3hzAAmuQgcACa4vAPuzzgsUCAAKAwAJrlsA+7N4uAMAAows9icACa7LAPuzzHMACa76BwAJrucA+7PPAAFahAQABgMACa8rAPuzeAMAAowxKwAJr3AGAwAJr48A+7N4GwACCh4F8wAJr8cACa/fAAm6sAADAAFaJAAAAAQPAAmwRwAJurAAAAAICAsACbBgAAACPMWCbAADAAmwxAAAAgedgwACDCAAAYJsAAT4GScACbEAhFsACbEUuuVTAAIH0PgFKwAJsagEcwAJscS7AAFaFAgACgMACbHvAPu6XgcACbILAPu6kAMAAgpU/TsACbJ/AAmyoAADAAEy+YMAAo4QBHsACbKrAAKOBAgACgMACbLbAPu6XKgBOwAJsz8ACbNoAAMAAVlZgmwABHMACbOWCwAJs3MA+7vrAAFX1AQABgMACbO7APu6XAMAAo45OwAJtAMACbQUAAICwYJsAARbAAm0Sg8ACbQfAPu8mg2abG0nAAm0cFsACbSWEwAJtIMA+71ybtJsPPgNOwAJtTsACbVgAAJ2uYMAAo5EBHsACbVrAAKOCAQABhMACbXDAPu9cAE7AAm2DwAJtiAAAg2ZgmwABFsACbZ8cwAJtlIXAAm2KwD7vmJMXAQABhMACbZnAPu9cAMAAo5mDZpsbScACbasewAJtr8AAg2ECAAIng5yGwAJtvcA+78EAPgFJwAJtzhzAAm3SLsAAVqYBAAEWwAJt9hbAAm3thsACbejAPu/Bm8+bDYNmmxsAwACCnz4BSsACbgkBHMACbhAuwABWVQYABoDAAm40wD7ul4PAAm47wD7vJoTAAm5HwD7vXILAAm5NwD7u+oXAAm5XwD7vmIHAAm5iwD7upADAAIJiPz8/SsACbogBHMACbo8uwABWhQIAAoDAAm6ZwD7ul4HAAm6gwD7upADAAIKVBsAAgoiBfMACbrHAAm63wAJv2AAAwABWpwAAAAEDwAJuxsACb9gAAAABAQHAAm7NAAAAjzFgmwAAAGCbAAE+A07AAm7gwAJu5QAAg2ZgmwABFsACbu2AwAJu58A+8PaDZpsbScACbvchHsACbvzAAINhAgACJ4OcgcACbwrAPvELAD4CPRzAAm8ZLsAAVckCAAKAwAJvO8A+8PYcwAJvZBrAAm9IhJ+EzQEAASeDnACIrgDAAILDPYnAAm9/wD7xCxzAAm+PFsACb4Yur0HAAIH8wABV5QIAAoDAAm+cwD7w9ioAwACjZT9KwAJvtQEcwAJvvC7AAFaoAQABgcACb8/APvELAMAAgpkGwACCiYF8wAJv3cACb+PAAnLhAADAAFapAAAAAQPAAnAGwAJy4QAAAAEBAcACcA0AAACPMWCbAAAAYJsAAT4DTsACcCDAAnAlAACDZmCbAAEWwAJwLYDAAnAnwD7yAINmmxtJwAJwNyEewAJwPMAAg2ECAAIng5yBwAJwSsA+8hUAPgNOwAJwocACcKkAAJzdYMAAo5EBHsACcKvAAKOCAQABgMACcMHAPvIAAEnAAnDPHMACcNuCwAJw08A+8llBAQABGsACcN7AAKN8AMAA9dI+AT0cwAJw+i7AAFXJAgACgMACcR7APvIAHMACcUcawAJxK4SfhM0BAAEng5wAiK4AwACCwz4EPRzAAnFzLsAAVckCAAKAwAJxl8A+8gAawAJxpIQwAMAAgsM9iMACcdLAPvIAHMACceKCwAJx2sA+8lnAAFX0AgACgMACcfHAPvIALgDAAKOXPRzAAnIQFsACcgcuo9fAAIHzuH4BAAGAwAJyK8A+8gAAwACBlD2JwAJyO8A+8hUWwAJySIDAAnJCwD7yAINmmxtJwAJyXCEewAJyYcAAg2ECAAIng5yBwAJyb8A+8hUAPgE9icACcoDAPvIVHMACcpAWwAJyhy6vQcAAgfzAAFXlAgACgMACcp3APvIAKgDAAKNlPz9KwAJyvgEcwAJyxS7AAFaoAQABgcACctjAPvIVAMAAgpkGwACCioF8wAJzRsACc0zAAnSRAADAAFaRAAAAAQPAAnNewAJ0kQAAAAEBAcACc2UAAACPMWCbAAAAYJsAAT4HTsACc3jAAnODAADAAFWPYJsAARbAAnOLgMACc4XAPvQQg2abG0AewAJznMAAg2ECAAInmVqBwAJzrMA+9CUAwAJznMACc7cAPRzAAnPHFsACc74uo9fAAIHzuGABAAGBwAJz2sA+9CUAwACBxT2IwAJz68A+9BAcwAJz8y7AAFZZAQABgcACdA3APvQlAMAAgmU9iMACdB7APvQQHMACdCYuwABWqQEAAYDAAnRKwD70EADAAIKJPRzAAnRfFsACdFYuo9fAAIHzuGYBAAGBwAJ0cMA+9CUAwACBxkrAAnSBAYDAAnSIwD70EAbAAIKLgXzAAnSWwAJ0nMACdfIAAMAAVogAAAABA8ACdLvAAnXyAAAAAgICwAJ0yQAAAI8xYJsAAMACdOMAAACc3WDAAKORAABgmwABPgZOwAJ0+MACdP4AAIIbYJsAAYDAAnUAwD71Oz0cwAJ1FBbAAnULLqPXwACB87hkAQABgMACdTTAPvU7AMAAgT49iMACdUDAPvU7HMACdUguwABWWQIAAoDAAnViwD71O4HAAnVpwD71SADAAIJlPYjAAnV3wD71OxzAAnV/LsAAVqkBAAGAwAJ1o8A+9TsAwACCiT0cwAJ1uBbAAnWvLqPXwACB87hrAQABgsACddbAPvVfAMAAgT9KwAJ14gGAwAJ16cA+9TsGwACCjIF8wAJ3j8ACd5XAAnwXAADAAFaSAAAAAQPAAnepwAJ8FwAAAAEBAcACd7AAAACPMWCbAAAAYJsAAT4MTsACd8PAAnfQAAC31mCbAAGIwAJ30sA+9lAWwAJ34IDAAnfawD72UINmmxtAHsACd/HAAINhAgACJ4PsgcACeAPAPvZlAMACd/HAAngQAE7AAngdwAJ4IgAAg2ZgmwABFsACeCqAwAJ4JMA+9lCDZpsbTsACeEHAAnhHAAGAimDAAPZdARbAAnhOgsACeEnAPva0nCubH0nAAnhfIh7AAnhkwADuXgIAAoPAAnhuwD721yeZCQABHsACeH/AAO5eAgACg8ACeInAPvbXJ0QAPgU9HMACeKkWwAJ4oC6j18AAgfO4YwEAAYLAAni7wD72tADAAIDzPRzAAnjRFsACeMguo9fAAIHzudEBAAGCwAJ458A+9rQAwACBlT2IwAJ49MA+9lAcwAJ4/C7AAFaUAgACgMACeRPAPvZQgcACeRrAPvZlAMAAgoI9HMACeTgWwAJ5Ly6j18AAgfO4ZQEAARbAAnlOgMACeUjAPvZQg2abGwDAAID0SsACeVsBgMACeWLAPvZQP0nAAnlzHsACeXfAAO5eAgACg8ACeYHAPvbXJ5kpAD4FPRzAAnmfFsACeZYuo9fAAIHzuGMBAAGCwAJ5scA+9rQAwACA8z0cwAJ5xxbAAnm+LqPXwACB87nRAQABgsACed3APva0AMAAgZU9iMACeerAPvZQHMACefIuwABWlQIAAoDAAnoNwD72UIHAAnoUwD72ZQDAAIKDPRzAAnoyFsACeikuo9fAAIHzuGUBAAEWwAJ6SIDAAnpCwD72UINmmxsAwACA9ErAAnpVAYDAAnpcwD72UD9JwAJ6bR7AAnpxwADuXgIAAoPAAnp7wD721ydcAD4EPRzAAnqZFsACepAuo9fAAIHzuGMBAAGCwAJ6q8A+9rQAwACA8z2IwAJ6uMA+9lAcwAJ6wC7AAFaWAgACgMACeuHAPvZQgcACeujAPvZlAMAAgoU9HMACewYWwAJ6/S6j18AAgfO4ZQEAARbAAnscgMACexbAPvZQg2abGwDAAID0SsACeykBgMACezDAPvZQPz0cwAJ7ShbAAntBLqPXwACB87hiAQABgcACe1/APvZlAMAAgag9iMACe3LAPvZQHMACe3ouwABWWQEAAYDAAnuUwD72UADAAIJlPYjAAnugwD72UBzAAnuoLsAAVqkBAAGAwAJ7zMA+9lAAwACCiT0cwAJ74RbAAnvYLqPXwACB87huAQABgcACe/TAPvZlAMAAgalKwAJ8BwGAwAJ8DsA+9lAGwACCjYF8wAJ8WsACfGDAAn0zAADAAFaKAAAAAQPAAnxvwAJ9MwAAAAEBAcACfHYAAACPMWCbAAAAYJsAAT4EPYjAAnyDwD76QBbAAnyRgMACfIvAPvpAg2abG0AiHsACfKLAAO5eAgACFsACfLKAwAJ8rMA++kCCHJsYGsACfLidNQABHsACfM7AAO5eAgACFsACfN6AwAJ82MA++kCCHJsYGsACfOSdNwDAAnyiwAJ89gA9HMACfQYWwAJ8/S6j18AAgfO3egEAAYDAAn0XwD76QADAAIG/SsACfSMBgMACfSrAPvpABsAAgo6BfMACfXjAAn1+wAJ+JgAAwABWiwAAAAEDwAJ9kMACfiYAAAABAQHAAn2XAAAAjzFgmwAAAGCbAAE+BD2IwAJ9pMA++ygWwAJ9soDAAn2swD77KINmmxtAHsACfcPAAO5eAgACFsACfdOAwAJ9zcA++yiCHJsYGsACfdmdNADAAn3DwAJ95gA9HMACffYWwAJ97S6j18AAgfO36AEAAYDAAn4KwD77KADAAIG+SsACfhYBgMACfh3APvsoBsAAgo+BfMACforAAn6QwAKAfgAAwABWQQAAAAEDwAJ+osACgH4AAAABAQHAAn6pAAAAjzFgmwAAAGCbAAE+CUAewAJ+vcAA7l4CAAIWwAJ+0hbAAn7NgMACfsfAPvvog2abG4IcmxgawAJ+2J04AMACfr3AAn7lAE7AAn7xwAJ+9QAAgxNgwADyswEWwAJ+9y65VMAAgfQ9F8ACfxguuVQpwACB9D2IwAJ/QMA+++gcwAJ/SC7AAFaqAQABgMACf2HAPvvoAMAAgpFOwAJ/ccACf3cAAIDQYMAA9HkBlEPAAn+AHsACf4fAAO5eAgACFsACf5wWwAJ/l4DAAn+RwD776INmmxuCHJsYGsACf6KdOAA+Aj2IwAJ/ucA+++gcwAJ/wS7AAFaqAQABgMACf9rAPvvoAMAAgpE9isACf+jAPvyIHMACf+2CwAJ/6MA+/IhdAQABlADAAPWeScACf/scwAKABYLAAn//wD78iICLAQABlADAAPWoPgE9HMACgBsWwAKAEi6j18AAgfO3dwEAAYLAAoA1wD78iADAAIFZPz0XwAKARy65VIHAAoBlwD78NsAAgfRKwAKAbgGAwAKAdcA+++gGwACCkIF8wAKA7MACgPLAAoQyAADAAFaMAAAAAQPAAoEEwAKEMgAAAAEBAcACgQsAAACPMWCbAAAAYJsAAT4FTsACgR7AAoEoAAC382CbAAGIwAKBKsA+/a8WwAKBOIDAAoEywD79r4NmmxtAHsACgUnAAINhAgACJ5YugcACgVfAPv3EAMACgUnAAoFhAD0cwAKBcRbAAoFoLqPXwACB88AAVXkBAAGBwAKBhMA+/cQAwACBeU7AAoGawAKBnwAAg2ZgmwABFsACgaeAwAKBocA+/a+DZpsbScACgbEWwAKBuoLAAoG1wD7+OoG2mxY+Az0cwAKB5BbAAoHbLqPXwACB87kEAQABgsACgfPAPv46AMAAgcs9HMACggkWwAKCAC6j18AAgfO38gIAAoHAAoIawD79xJQAwACBekrAAoIvAYLAAoI2wD7+OknAAoJHHsACgkvAAINhAgACJ5mOgsACglzAPv46AD4DPRzAAoJ0FsACgmsuo9fAAIHzuQUBAAGCwAKChcA+/joAwACBzD0cwAKCmxbAAoKSLqPXwACB87fyAgACgcACgqzAPv3ElADAAIF6SsACgsEBgsACgsjAPv46PgVOwAKC5cACgusAAIDQYMAA9HkBlD2IwAKC9sA+/a8cwAKC/i7AAFXZAgACgMACgw/APv2vGsACgyjAAIMsAMAAgkBDwAKDPh7AAoNFwACDYQIAAieBMRbAAoNZgMACg1PAPv2vg2abGwA+Aj2LwAKDasA+/0wcwAKDb4PAAoNqwD7/TF0BAAGUAMAA9Z49iMACg3vAPv2vHMACg4MuwABV2QIAAhbAAoOngMACg6HAPv2vg2abGxrAAoO/wACDLQDAAIJAPRzAAoPyFsACg+kuo9fAAIHzt/ICAAKBwAKEA8A+/cSDwAKEDsA+/0wAwACBekrAAoQcAYDAAoQjwD79rwbAAIKRgXzAAoQ3wAKEPcACiRgAAMAAVqoAAAABA8AChFXAAokYAAAAAQEBwAKEXAAAAI8xYJsAAABgmwABPgk9iMAChGnAPwB4FsAChHeAwAKEccA/AHiDZpsbQB7AAoSIwADuXgIAAhbAAoSYgMAChJLAPwB4ghybGBrAAoSenTgAwAKEiMAChKsAPRzAAoS7FsAChLIuo9fAAIHzt2gBAAGAwAKEzsA/AHgAwACBVk7AAoUcwAKFLwAAt2xgwAD0eQGTTsAChT7AAoVDAACDZmCbAAEWwAKFS4DAAoVFwD8AeINmmxtOwAKFWcAChV4AAIIcYMAA9HkBFsAChWWCwAKFYMA/ARKCHJsYQUPAAoVvIRzAAoV7g8AChXbAPwE1QQEAARrAAoV+nS8AwAD1nD4FScAChZEewAKFlcAA7l4CAAKDwAKFn8A/ATUawAKFpZ1VAD4DPYjAAoXuwD8AeBbAAoYMHMAChfYutxoBAAGCwAKGBsA/ARIAwACCc4NmmxtJwAKGGiEewAKGH8AAg2ECAAInlj+AwAKGLcA/AHgAPgI9HMAChkEuwABVyQIAAoDAAoZnwD8AeBzAAoaLGsAChnSEqYTNAQABJ5Y/AIiuAMAAgsM9iMAChqrAPwB4FsAChreCwAKGssA/ARKbz5sNPz0cwAKG3BbAAobTLqPXwACB88AAVW0CAAKCwAKG+sA/ARKAwAKHAMA/AHgAwACBV0nAAocVHsAChxnAAO5eAgACg8AChyPAPwE1GsAChymddgA+Aj2IwAKHe8A/AHgcwAKHgy65UwEAAYLAAoedwD8BEgDAAIKSPRzAAoe1FsACh6wuo9fAAIHzwABVbQIAAoLAAofTwD8BEisAwACBVz4BQsACh/cAPYnAAogOwD8A/hzAAogMgcACiA7APwD+XQEAAZQAwAD1nj2IwAKIdMA/AHgcwAKIfC7AAFYkAQABgMACiIzAPwB4AMAAgj49isACiJrAPwESFsACiKeAwAKIocA/AHiDZpsbPYvAAoizwD8BNRbAAoi/gsACiLrAPwESghybGD0cwAKI2BbAAojPLqPXwACB87drAgACgcACiOnAPwD+gsACiP3APwESAMAAgVhKwAKJCAGAwAKJD8A/AHgGwACCkoF8wAKJHcACiSPAAopkAAC5UwAAAAEDwAKJPMACimQAAAABAQHAAolDAAAAjzFgmwAAAGCbAAE+Ak7AAolWwAKJWwAAg2ZgmwABFsACiWOAwAKJXcA/A86DZpsbScACiW0iHMACiXsWwAKJdoHAAolxwD8D44IcmxhBAQABGsACiX6dMADAAPWcAB7AAomPwADuXgIAAhbAAomegcACiZnAPwPjnCubHyeZaAA+Aj0cwAKJxRbAAom8LqPXwACB87iAAgACgcACidrAPwPjGsACifLAAIMuAMAAgdZKwAKKBQGBwAKKDMA/A+M+AUrAAoolARzAAoosLsAAVoUCAAKAwAKKNsA/A84awAKKT8AAgy4AwACClQbAAIKTgXzAAoq8wAKKwsACi3YAAMAAVo0AAAABA8ACitLAAot2AAAAAQEBwAKK2QAAAI8xYJsAAABgmwABPgQ9iMACiubAPwTsFsACivSAwAKK7sA/BOyDZpsbQCIewAKLBcAAg2ECAAInm+2AwAKLF8A/BOwAAR7AAoshwACDYQIAAieTmIDAAosywD8E7ADAAosFwAKLOAA9HMACi0gWwAKLPy6j18AAgfO35QEAAYDAAotawD8E7ADAAIG4SsACi2YBgMACi23APwTsBsAAgpSBfMACi7nAAou/wAKMVwAAwABWjgAAAAEDwAKLz8ACjFcAAAABAQHAAovWAAAAjzFgmwAAAGCbAAE+BD2IwAKL48A/BboWwAKL8YDAAovrwD8FuoNmmxtAHsACjALAAINhAgACJ4QCgMACjBPAPwW6AMACjALAAowZAD0cwAKMKRbAAowgLqPXwACB87frAQABgMACjDvAPwW6AMAAgcJKwAKMRwGAwAKMTsA/BboGwACClYF8wAKMXMACjGLAAo4lAADAAFaFAAAAAQPAAoxrwAKOJQAAAAICAsACjHIAAACPMWCbAADAAoyLAAAAgedgwACDCAAAYJsAAT4GTsACjKDAAoyrAACnWGCbAAGIwAKMrcA/Bm0cwAKMtS7AAFXZAgACgMACjMbAPwZtgcACjM3APwZ6AMAAgkBOwAKM7sACjPYAAJzdYMAAo5EBHsACjPjAAKODAQABgMACjRPAPwZtAEnAAo0fIRzAAo0rg8ACjSPAPwbPQQEAARrAAo0uwACjfADAAPXSPgE9iMACjUjAPwZtHMACjViDwAKNUMA/Bs/AAFX0AgACgMACjWfAPwZtLgDAAKOXPgE9HMACjZEWwAKNiC6j18AAgfO50QEAARbAAo2tgMACjafAPwZtg2abGwDAAIGVPYjAAo2+wD8GbRzAAo3GLrlXAQABgMACjdjAPwZtAMAAgpc9HMACje0WwAKN5C6j18AAgfO3KQIAAoLAAo34wD8GkRbAAo4KgMACjgTAPwZtg2abGwDAAIFySsACjhUBgMACjhzAPwZtBsAAgpaBfMACjirAAo4wwAKO9wAAuVgAAAABA8ACjkDAAo73AAAAAQEBwAKORwAAAI8xYJsAAABgmwABPgNOwAKOWsACjl8AAINmYJsAARbAAo5ngMACjmHAPwgQg2abGz0cwAKOehbAAo5xLqPXwACB87nPAQABgcACjozAPwglAMAAgcdJwAKOlx7AAo6bwACDYQIAAieDnIHAAo6pwD8IJQA+AUrAAo64ARbAAo7EgcACjr/APwglm8+bDT4BSsACjuEBgMACjujAPwgQBsAAgpeBfMACjvzAAo8CwAKP1QAAuVcAAAABA8ACjxPAAo/VAAAAAQEBwAKPGgAAAI8xYJsAAABgmwABPgJOwAKPLcACjzIAAINmYJsAARbAAo86gMACjzTAPwjfg2abG0nAAo9EIR7AAo9JwACDYQIAAieDnIHAAo9XwD8I9AA+Aj0cwAKPbxbAAo9mLqPXwACB87nPAQABgcACj4HAPwj0AMAAgcdKwAKPjgGAwAKPlcA/CN8+AUrAAo+vARzAAo+2LsAAVfQBAAGAwAKPxcA/CN8AwACCmAbAAIKYgXzAApDjwAKQ6cACkTQAAMAAVfQAAAABA8ACkPfAApE0AAAAAQEBwAKQ/gAAAI8xYJsAAABgmwABPgFKwAKRCwEcwAKREi7AAFaoAQABFsACkSuAwAKRJcA/CbqDZpsbAMAAgpkGwACCmYF8wAKROcACkT/AApghAADAAFaoAAAAAQPAApFRwAKYIQAAAAEBAcACkVgAAACPMWCbAAAAYJsAAT4MTsACkWvAApFxAACCG2CbAAGAwAKRc8A/CiRAHsACkYXAAINhAgACJ4OcgcACkZPAPwo5AMACkYXAApGZAD0cwAKRqRbAApGgLqPXwACB88AAVUABAAGBwAKRuMA/CjkAwACA1E7AApHIwAKR1gAAso9gwAD0eQGTTsACkeTAApH5AADAAFarYMAA8rMBKk7AApILwAKSDwAAgxNgwADyswEWwAKSES65VMAAgfQ9F8ACkjIuuVQpwACB9EFDwAKSWik+Ck7AApJ1wAKSegAAg2ZgmwABFsACkoKAwAKSfMA/CiSDZpsbScACko4ewAKSksAAg2ECAAIngtqFwAKSoMA/Cv0APgI9iMACkrHAPwokhcACkrnAPwr9QsACkscAP07AApLiwAKS6AAAtzhgmwABK0nAApL2HsACkvrAAINhAgACJ4KmFsACkw2FwAKTCMA/Cv2DZpsbAD4DPYjAApMewD8KJBbAApOFHMACkzIuwABV2QIAAoDAApNDwD8KJBrAApNcwACDMADAAIJAg2abGz2OwAKTk8A/C1qAwAKTm8A/CiQ9i8ACk6rAPwqxKUnAApPUg8ACk9jAPwqxPgE9HMAClC0uwABVyQIAAoXAApREwD8K/RrAApRQhroAwACCwz89iMAClITAPwokHMAClIwutxoBAAGAwAKUnMA/CiQAwACCcz2NwAKUqsA/Cv0WwAKUt4DAApSxwD8KJINmmxtJwAKUwyEcwAKUzYbAApTHwD8LWkEBAAErAMAA9dI9HMAClN8WwAKU1i6j18AAgfO4gwEAAYbAApTzwD8LWgDAAIHEPz2KwAKVA8A/Cp0cwAKVAYLAApUDwD8KnV0BAAGUAMAA9Z5JwAKVGCEewAKVHcAAg2ECAAIngJuFwAKVK8A/Cv0APgJJwAKVPB7AApVAwACDYQIAAieC2oXAApVOwD8K/QA+Aj2IwAKVYcA/CiSFwAKVacA/Cv1CwAKVeQA/ScAClaYewAKVqsAAgwYBAAGFwAKVw8A/Cv0APgE9jcACll3APwr9HMAClmQuwABWBgMAA4DAApaFwD8KJBzAApa3GsAClqCEqYTNAQABJ4CbAIiuH8AClt2a/wIAAhrAApb2m2AWwAKXAoXAApb9wD8K/YMVmxwAAMAAglU+Aj2IwAKXJ8A/CiQcwAKXLy7AAFYCAgACgMACl0DAPwokgcACl0fAPwo5AMAAglFCwAKXWQA/PYjAApd4wD8KJIXAApeAwD8K/UAewAKXl8AAg2ECAAIngtqAwAKXpcA/CiQAwAKXl8ACl6sAPRfAApeyLrlUhMACl9DAPwrHwACB9D0cwAKX4hbAApfZLqPXwACB87chAwADgsACl+/APwqdgcACl/7APwo5gMACmAXAPwokAMAAgNVKwAKYEQGAwAKYGMA/CiQGwACCmoF8wAKYasACmHDAApoLAADAAFaCAAAAAQPAApiDwAKaCwAAAAEBAcACmIoAAACPMWCbAAAAYJsAAT4ITsACmJ3AApimAACSmmCbAAGIwAKYqMA/Do8WwAKYtoDAApiwwD8Oj4NmmxtAHsACmMfAAINhAgACJ5lmgcACmNbAPw6kAMACmMfAApjfAE7AApjswAKY8AAAuA1gmwABK0nAApj8HsACmQDAAINhAgACJ5lbFsACmRSAwAKZDsA/Do+DZpsbAD4BPYrAApkjwD8O84jAApkpwD8OjxbAApk3gMACmTHAPw6Pg2abGz9OwAKZUMACmVkAAMAATL5gwACjhAEcwAKZWy7AAFasAQABgMACmXLAPw6PAMAAgps9iMACmX7APw6PHMACmY+DwAKZhsA/D1TAAFYTAgACgMACmaHAPw6PLgDAAKOKPRzAApm8FsACmbMuo9fAAIHzuAwCAAKBwAKZzcA/DqSCwAKZ18A/DvMAwACBt0rAApnhARzAApnoLsAAVq0BAAGAwAKaAcA/Do8AwACCnQbAAIKbgXzAApoQwAKaGcACnAwAAMAAVqwAAAABA8ACmi/AApwMAAAAAQEBwAKaNgAAAI8xYJsAAABgwACjhAE+A07AAppMwAKaVQAAwABMvmDAAKOEAR7AAppXwACjgQIAAoDAAppjwD8QLCkAScACmnUWwAKagoHAApp5wD8QQ61swACjiD4CTsACmpzAApqhAACDZmCbAAEWwAKavBzAApqsgcACmqPAPxBDwABV9QEAAYDAApq1wD8QLADAAKOOg2abG0nAAprIIR7AAprNwACDawIAAoLAAprawD8QijrAAprgYMAA9l0FJ4LaJ4DWJ5ODJ5lmJ5j+AD4BPYnAApvEwD8QQxbAApvYgcACm8/APxBDwABWrsAAo4Y/P0rAApv5AYHAApwAwD8QQwbAAIKcgXzAApxPwAKcVcACnYoAAMAAVoMAAAABA8ACnGjAAp2KAAAAAQEBwAKcbwAAAI8xYJsAAABgmwABPgZOwAKcgsACnIsAAJKaYJsAAYjAApyNwD8RWxbAApybgMACnJXAPxFbg2abG0AewAKcrMAAg2ECAAInmP6BwAKcu8A/EXAAwAKcrMACnMQATsACnNTAApzdAADAAEy+YMAAo4QBHMACnN8uwABWrAEAAYDAApz2wD8RWwDAAIKbPYjAAp0CwD8RWxzAAp0TgsACnQrAPxG/wABWEwIAAoDAAp0lwD8RWy4AwACjij0cwAKdQBbAAp03LqPXwACB87gJAQABgcACnVHAPxFwAMAAgaFKwAKdYAEcwAKdZy7AAFatAQABgMACnYDAPxFbAMAAgp0GwACCnYF8wAKdj8ACnZXAAqAXAADAAFatAAAAAQPAAp2twAKgFwAAAAEBAcACnbQAAACPMWCbAAAAYJsAAT4BQ8ACncEpPglOwAKd3MACneEAAINmYJsAARbAAp3pgMACnePAPxKOg2abG07AAp38wAKeAgAAgIpgwAD2XQEWwAKeCYHAAp4EwD8Sq5wrmx9JwAKeHCIhHsACniHAAO5eAgACgsACnivAPxLOJ5lmAAAhHsACnjzAAO5eAgACgsACnkbAPxLOJ5j+AD4BSsACnl4BgMACnmXAPxKOPz0cwAKe6S7AAFW7AgACgcACnwnAPxKrGsACnxWHXwDAAILEScACnzUewAKfOcAAg2ECAAInmVsWwAKfTIHAAp9HwD8Sq4NmmxsAPgE9icACn13APxKrFsACn2mBwAKfZMA/EquDZpsbP07AAp+GwAKfjwAAwABMvmDAAKOEARzAAp+RLsAAVqwBAAGBwAKfqMA/EqsAwACCmz2IwAKftcA/Eo4cwAKfxoPAAp+9wD8TqcAAVfUBAAGBwAKfz8A/EqsAwACjjj2JwAKf3MA/EqsWwAKf6YDAAp/jwD8SjoNmmxs9isACn/XAPxLOFsACoAKBwAKf/cA/EqucK5sfBsAAgp6BfMACoITAAqCJwAKjYAAAwABWrwAAAAEDwAKgn8ACo2AAAAABAQHAAqCmAAAAjzFgmwAAAGDAAPKzAT4CScACoLMWwAKgvYDAAqC3wD8UaZu0mw8+A0nAAqDTHsACoNfAAINhAgACJ1wWwAKg64DAAqDlwD8UaYNmmxsAPgNOwAKhD8ACoRkAAJ2uYMAAo5EBHsACoRvAAKOCAQABgMACoTHAPxRpAEnAAqFBHMACoU+BwAKhRcA/FMFBAQABGsACoVLAAKN8AMAA9dI+AUrAAqFwASo/PYjAAqGQwD8UaRzAAqGigcACoZjAPxTBkxcBAAGAwAKhp8A/FGkAwACjmT89iMACob3APxRpFsACocuAwAKhxcA/FGmDZpsbScACodcewAKh28AAg2ECAAIng5yAwAKh6cA/FGkAPgI9iMACofvAPxRpFsACohIWwAKiCYDAAqIDwD8UaZvPmw2DZpsbSsACoiABIiIiHsACoifAAINhAgACJ5kpgMACojXAPxRpAAEewAKiS8AAg2ECAAInmSqAwAKiWsA/FGkAAR7AAqJwwACDYQIAAieZJIDAAqKCwD8UaQABHsACopjAAINhAgACJ5kigMACoqnAPxRpAEnAAqK+HsACosLAAINhAgACJ5kqgMACotHAPxRpAD4BSsACozEBKT8/SsACo1ABKgbAAIKfgXzAAqOqwAKjr8ACpF8AAMAAVqYAAAABA8ACo8TAAqRfAAAAAQEBwAKjywAAAI8xYJsAAABgwADyswE+AUrAAqPYASIiIh7AAqPfwACDYQIAAieZKYDAAqPtwD8WcQABHsACo//AAINhAgACJ5kqgMACpA7APxZxAAEewAKkIMAAg2ECAAInmSSAwAKkMsA/FnEAAR7AAqREwACDYQIAAieZIoDAAqRVwD8WcQAGwACCoIF8wAKkZMACpGrAAqfkAADAAFZzAAAAAQPAAqSUwAKn5AAAAAEBAcACpKEAAAFjYJsAAABgmwABPgROwAKktMACpL8AALqPYJsAARbAAqTHgMACpMHAPxcjg2abG0AewAKk2MAAg2ECAAIng+yBwAKk6sA/FzcAwAKk2MACpPUAScACpPwhHsACpQHAAKMfAQABFsACpReBwAKlDMA/FzeDZpsbAD4DTsACpS/AAqU4AADAAEy+YMAAo4QBHsACpTrAAKOBAgACgcACpUbAPxc3KgBJwAKlYBzAAqVtgsACpWTAPxekQQEAARrAAqVwwACjewDAAPXSPgROwAKliMACpY0AAINmYJsAARbAAqWagcACpY/APxc3g2abG0nAAqWoIRbAAqWyg8ACpa3APxf3m7SbDz4BSsACpcwBHMACpdMuwABWdQEAAYDAAqXswD8XIwDAAIJyPz2LwAKmBsA/F/cWwAKmEoPAAqYNwD8X94NmmxtJwAKmICEiIiIiHsACpibAAINhAgACJ4Cvg8ACpjTAPxf3AAEWwAKmZoPAAqZhwD8X95wimxEBHsACpovAAINhAgACJ5ODg8ACppnAPxf3AAEewAKmrsAAg2ECAAIngJuDwAKmvMA/F/cAAR7AAqbRwACDYQIAAieZKYPAAqbfwD8X9wA+AUrAAqbzARzAAqb6LsAAVnUBAAGAwAKnE8A/FyMAwACCcj8/SsACpzMBHMACpzouwABWYQQABIHAAqd5wD8XN4DAAqeFwD8XI4HAAqeMwD8XN4LAAqeYwD8XpADAAIKiP0rAAqetARzAAqe0LsAAVmUBAAGAwAKn2sA/FyMAwACCoQbAAIKhgXzAAqrCwAKqyMACrzgAAMAAVmUAAAABA8ACqu3AAq84AAAAAgECwAKq+gAAAWNgmwAAwAKrDQAAAMAAVrBgwADyswEqAGCbAAE+Bk7AAqtFwAKrSwAAjzFgmwABgMACq03APxmkTsACq17AAqtjAACDZmCbAAEWwAKra4LAAqtlwD8ZyoNmmxtJwAKrdR7AAqt5wACDYQIAAieDNIPAAquHwD8Z5AA+Aj2KwAKrlsA/GcocwAKrni66KwEAAYLAAquwwD8ZygDAAIIcPYvAAqu+wD8Z5BbAAqvLgsACq8XAPxnKg2abGz9OwAKr4gAAALbkYJsAAEnAAqv3HsACq/vAAKMfAQABg8ACrAbAPxnkAD4CScACrBUewAKsGcAAg2ECAAIng+uDwAKsKcA/GeQAPgI9jMACrDrAPxpnisACrEzAPxnKFsACrFqCwAKsVMA/GcqDZpsbPYvAAqxowD8Z5BbAAqx1gsACrG/APxnKg2abG0nAAqyIIh7AAqyMwACDYQIAAieD6oPAAqyewD8Z5AABHsACrKfAAINhAgACJ4Psg8ACrLnAPxnkAD4CPYzAAqzKwD8aZ4rAAqzcwD8ZyhbAAqzqgsACrOTAPxnKg2abGz2LwAKs+MA/GeQWwAKtBYLAAqz/wD8ZyoNmmxs/ScACrRoewAKtHsAAox8BAAGDwAKtKcA/GeQAPgVOwAKtZsACrXYAAMAAVrFgwACjIAEfwAKtiMAAozwBAAEuAD2KwAKtr8A/GcocwAKtx4XAAq23wD8bjcAAVrICAAGCwAKt6cA/GcoBtuSEwAKuDcA/GmfAAKMxPYvAAq4nwD8Z5BbAAq40gsACri7APxnKg2abGz2MwAKuQ8A/GmcWwAKuZYXAAq5VwD8bjbbkwACjKT2NwAKufsA/G40rPz9KwAKuqQEcwAKusC7AAFZhBQAFgsACru3APxnKgMACrvTAPxmkhMACrvvAPxpnK4HAAq8SwD8ZsADAAIKiBsAAgqKBfMACr2/AAq91wALAqAAAwABWYQAAAAEDwAKvqMACwKgAAAAFAgXAAq+8AAABwABWCWCbAADAAq/UAAABY2CbAADAAq/oAAAAtuRgmwABK8ACsA8AAADAAEy+YMAAo4QBK8ACsCQAAADAAFawYMAA8rMBKgBgmwABPg49IxzAArBfg8ACsFbAPxzAQQEAASsAwAD10ovAArBWwD8cwB7AArBjwACjgQIAAoDAArBvwD8clyoAKwFgwACjhE7AArCOwAKwlAAAjzFgmwABHMACsJ+DwAKwlsA/HMDAAFX1AQABgMACsKjAPxyXAMAAo45OwAKwv8ACsMQAAINmYJsAARbAArDMhcACsMbAPx0tg2abG0nAArDXIYTAArDcwD8c0j4BScACsQccwAKxCy7AAFavAQABhsACsSLAPx1hAMAAgp4+BknAArFiIRzAArF2gsACsWbAPxyyQQEAASsAwAD10j4BPRzAArGLLsAAVbsCAAKCwAKxusA/HLIawAKx0YTzAMAAgsQ/ScACsgAhHsACsgXAAINhAgACJ4M0FsACshmBwAKyE8A/HKaDZpsbAD4CPRzAArI1FsACsiwuo9fAAIHzwABVcAEAARbAArJNgcACskfAPxymg2abGwDAAIFfPRzAArJnFsACsl4uo9fAAIHztt8BAAGTAMAAgWA/TsACspPAArKhAADAAFazYJsAARzAArLLHsACsq/AAKOCAQABhsACssXAPx1hAMAAVfYCAAKGwAKy2sA/HWEuAMAAo5g9HMACsvgWwAKy7y6j18AAgfO4iQEAARbAArMcgcACsxbAPxymg2abGwDAAIEbPY3AArMrwD8dLRzAArM8g8ACszPAPxzAwABV9wIAAoDAArNGwD8cly4AwACjjUrAArNhARzAArNoLsAAVlcEAASFwAKzf8A/HS0WwAKzjIHAArOGwD8cpoNmmxuHwAKzksA/HnMqAMAAgmM/P0nAArO8IiIcwAKzy4DAArPAwD8cl0EBAAGBwAKzzsA/HKYAwAD10gAWwAKz6IPAArPfwD8cwK1swACjiAAWwAK0B4PAArP+wD8cwMAAVrTAAKOHPgRAHsACtCnAAINhAgACJ4DWhcACtDfAPx0tAMACtCnAArQ9AEAWwAK0UobAArRNwD8dYZu0mw/AArRNwAK0XgBOwAK0bcACtH0AAMAAVrVgmwABFsACtISGwAK0f8A/HWGDZpsbScACtQQewAK1CMAAg2ECAAIngK+HwAK1FsA/H+YAPgVOwAK1u8ACtcwAAcAAVrZgwACAzwEWwAK1zi6j18AAgfM9F8ACteAuo9cfwAK178AAov8AAAAAwACB807AArZZwAK2aQAAwABT0GCbAAEWwAK2phzAArZ3LsAAVnkBAAGHwAK2lcA/H+YAwACCdINmmxs9F8ACtrQuo9cUwAK2v8A/ICsIAMAAgfNJwAK22h7AArbewACDYQIAAieCphTAArbswD8gZgkAAD4DPYvAAreOwD8cwBrAAreZwACjez2NwAK3q8A/HS2BwAK3s8A/HKY9jsACt8TAPx1hFsACt9GFwAK3y8A/HS2DZpsbP0nAArfuIiEWwAK4A4fAArfzwD8f5pwhmxAAIR7AArgbwACDawIAAofAArgowD8f5jrAArg5YMAA9l0D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AAGBwALD7MA/J8cAwACBQUrAAsP8AYDAAsQDwD8nsgbAAIKlgXzAAsR+wALEhMACxuoAAMAAVmYAAAABA8ACxJTAAsbqAAAAAQEBwALEmwAAAI8xYJsAAABgmwABPgtOwALErsACxLYAALeNYJsAARbAAsS+gMACxLjAPying2abG0AewALEz8AAg2ECAAInmX6BwALE3sA/KLwAwALEz8ACxOYAPRzAAsT2FsACxO0uo9fAAIHzwABVXAEAAYHAAsUHwD8ovADAAIEvPYjAAsUVwD8opxzAAsUdLsAAVpkBAAGBwALFOsA/KLwAwACCfD0cwALFURbAAsVILqPXwACB87eIAQABFsACxWqAwALFZMA/KKeDZpsbAMAAgTE9iMACxXXAPyinHMACxX0uwABWXQEAAYDAAsWMwD8opwDAAIJsPRzAAsWhFsACxZguo9fAAIHzt4oBAAGAwALFssA/KKcAwACBMk7AAsXEwALFzgAAt45gmwABK0nAAsXaHsACxd7AAINhAgACJ5l/FsACxfWAwALF78A/KKeDZpsbAD4EPYrAAsYEwD8pxhbAAsYWgMACxhDAPying2abGz0cwALGKxbAAsYiLqPXwACB88AAVS4BAAGCwALGPsA/KcYAwACBMz2IwALGUMA/KKccwALGWC7AAFZdAQABgsACxmfAPynGAMAAgmw9HMACxoIWwALGeS6j18AAgfPAAFUvAQABgsACxpPAPynGAMAAgTQ/PRzAAsayFsACxqkuo9fAAIHzt4wCAAKBwALGwcA/KLyCwALGysA/KcYAwACBMErAAsbaAYDAAsbhwD8opwbAAIKmgXzAAsi9wALIw8ACy3IAAMAAVmcAAAABA8ACyNTAAstyAAAAAgICwALI2wAAAI8xYJsAAMACyOgAAAC4n2CbAAAAYJsAAT4ITsACyQDAAskJAAC3v2CbAAGIwALJC8A/KvkWwALJGYDAAskTwD8q+YNmmxtAIhzAAsk1gcACySrAPysGQQEAASsAwAD10gEewALJQMAAg2ECAAInmWuBwALJUsA/KwYAwALJKsACyV0AQB7AAslrwACDYQIAAieZd4DAAsl7wD8q+QDAAslrwALJgQA9HMACyZEWwALJiC6j18AAgfPAAFUbAQABgsACyaPAPysbAMAAgQ49iMACybPAPyr5HMACybsuwABWugIAAoHAAsnSwD8rBoLAAsnewD8rGwDAAIKnTsACyfPAAsn+AACcSmCbAAEWwALKBoDAAsoAwD8q+YNmmxs9iMACyhDAPyr5HMACyhguwABWuwMAA4DAAsotwD8q+YHAAso0wD8rBoLAAspAwD8rGwDAAIKoScACyk8iHsACylPAAINhAgACJ5ltFsACymiAwALKYsA/KvmDZpsbAAEewALKccAAg2ECAAIngqYWwALKhYDAAsp/wD8q+YNmmxsAPgFKwALKugEcwALKwS7AAFa8BAAEgMACytDAPyr5gcACytfAPysGgsACyuPAPysbg8ACyu3APyv8AMAAgqs+AUrAAss4ARzAAss/LsAAVr0DAAOBwALLTMA/KwaAwALLWMA/KvmCwALLX8A/KxsAwACCqQbAAIKngXzAAsv1wALL+8AC0vwAAMAAVroAAAABA8ACzBHAAtL8AAAAAgICwALMGAAAALifYJsAAMACzCoAAAC3v2CbAAAAYJsAAT4DTsACzEDAAsxQAAC4oGCbAAEWwALMW4HAAsxSwD8tTINmmxtJwALMZSEewALMasAAg2ECAAIng5yCwALMeMA/LWEAPgs9HMACzKQuwABVyQIAAoLAAszGwD8tYRzAAsz0GsACzN2EqYTNAQABJ4OcAIiuAMAAgsNOwALNE8ACzRoAAIMVYMAA9HkBFsACzSyCwALNHMA/LWGDFZscTsACzUbAAs1QAADAAFY9YJouASbAAs1GARzAAs1mgcACzVLAPy1MnCwBAAEfwALNcprjAgACGsACzZCbe4PAAs2cwD8t2AAAmypgmi5OwALNswAAAMAAVr5gmwAAScACzcMhHMACzdKAwALNx8A/LT9BAQABKwDAAPXSPgM9jcACzeXAPy5KHMACzfqEwALN8MA/Lf2cLAEAAR/AAs4TmvUDAAMawALOMptNJwCDwALOQsA/LdgAAJrIPY3AAs5UwD8uShzAAs50hcACzmvAPy5KnCwBAAEfwALOgJrqAgACGsACzp6aaIPAAs6iwD8t2AAAmyo9jcACzrTAPy5KHMACzsiFwALOv8A/LkqcLAEAAR/AAs7hmvUDAAMawALPAJtNJwCDwALPEMA/LdgAAJsqPgI9jcACzzHAPy5KHMACz1KEwALPSMA/Lf2cLAEAAR/AAs9emv8CAAIawALPd5uIg8ACz4LAPy3YAACayD2NwALPlMA/LkocwALPtIXAAs+rwD8uSpwsAQABH8ACz8Ca/wIAAhrAAs/Zm4iDwALP5MA/LdgAAJsqTsAC0APAAtAOAADAAFa/YJsAARzAAtAjhcAC0BrAPy5KnCwBAAEfwALQL5r/AgACGsAC0EibZIPAAtBVwD8t2AAAmyo9F8AC0G+EwALQZcA/Lf2bz4bAAtB6wD8vp5o2TsAC0JLAAtCdAACcSmCbAAEcwALQtYbAAtCfwD8vp5wsAQABH8AC0MGa9QMAAxrAAtDgm00nAIPAAtDwwD8t2AAAmypOwALRBsAC0RAAALeAYJsAARzAAtEnh8AC0RzAPzAHnCwBAAEfwALRM5r/AgACGsAC0UybiIPAAtFXwD8t2AAAmyo9HMAC0XEUwALRZ8A/MEsIAJwsAQABgsAC0XnAPy1hAJsqPYrAAtGSwD8tYYTAAtGkwD8t/T9KwALStwEcwALSvi7AAFZlAgACFsAC0u2BwALS5MA/LUyDZpsbKQDAAIKhBsAAgqiBfMAC04DAAtOGwALXswAAwABWuwAAAAEDwALTmsAC17MAAAADAwPAAtOhAAAAjzFgmwAAwALTrgAAALifYJsAAMAC08AAAAC3v2CbAAAAYJsAAT4EScAC09AhHMAC09qAwALT1MA/MRlBAQABFsAC0+aCwALT3cA/MTODZpsbAMAA9dI+Aj2IwALT9MA/MRkcwALT/C7AAFa3AgACgMAC1BrAPzEZKgDAAIKjPRzAAtQ4FsAC1C8uo9fAAIHzt7YBAAGAwALUZcA/MRkAwACBDUnAAtR4HsAC1HzAAINhAgACJ5ODFsAC1JCAwALUisA/MRmDZpsbAD4BPRzAAtSoFsAC1J8uo9fAAIHzt7IBAAEWwALU0YDAAtTLwD8xGYNmmxsAwACBCz4CPYjAAtTrwD8xGRzAAtTzLrcaAQABgMAC1QPAPzEZAMAAgnM9HMAC1RoWwALVES6j18AAgfO3tAEAAYDAAtVCwD8xGQDAAIEMTsAC1VrAAtVfAACDZmCbAAEWwALVZ4DAAtVhwD8xGYNmmxtJwALVcR7AAtV1wACDYQIAAieTg4PAAtWDwD8yZQA+AUnAAtWSIRzAAtWhgcAC1ZbAPzEmQQEAASsAwAD10j4BPRzAAtW0LsAAVckCAAKBwALVy8A/MSYawALV3YXEAMAAgsM/ScAC1gkhHsAC1g7AAINhAgACJ5ltg8AC1h3APzJlAD4BScAC1j4ewALWQsAAg2ECAAIngqaDwALWUMA/MmUAPgE9HMAC1mEuwABVyQIAAoPAAtZ4wD8yZRrAAtaEg8AAwACCw0nAAtarIRzAAta6gcAC1q/APzEmQQEAASsAwAD10j4CPRzAAtbNLsAAVckCAAKDwALW8cA/MmUcwALXFBrAAtb9hKmEzQEAASeZbQCIrgDAAILDPRzAAtc4gMAC1zLAPzEZnCwBAAE1wALXUQAAAQBgmuQBH8AC11Ga6gIAAhrAAtdvmmgWwALXeIPAAtdzwD8yZYMVmxwANQAAAAEAWwEcwALXgYTAAtd/wD8zt5wsAQABg8AC14nAPzJlAJrIhADAPzO3AJsqPz9KwALXowGAwALXqsA/MRkGwACCqYF8wALZZ8AC2W3AAtsaAADAAFa9AAAAAQPAAtl5wALbGgAAAAMDA8AC2YAAAAC4n2CbAADAAtmSAAAAjzFgmwAAwALZnwAAALe/YJsAAABgmwABPgk9icAC2a/APzRhHMAC2bcuwABWwAMAA4HAAtnNwD80YYLAAtnUwD80boDAAtnewD80VADAAIKqPRzAAtn4FsAC2e8uo9fAAIHzwABVKAEAARbAAtoUgcAC2g7APzRhg2abGwDAAIERTsAC2inAAto4AADAAFZcYMAAoxABFsAC2jouuVbAAIH2PRfAAtpJLrlWGsAC2l/AAKMYwACB9j2JwALab8A/NGEcwALady7AAFZdAQABgcAC2obAPzRhAMAAgmw9F8AC2pIuuVaDwALansA/NOrAAIH2PRzAAtq7FsAC2rIuo9fAAIHzwABVKgEAARbAAtrVgcAC2s/APzRhg2abGwDAAIESPRzAAtrpFsAC2uAuo9fAAIHzt8cBAAEWwALa/4HAAtr5wD80YYNmmxsAwACBEErAAtsKAYHAAtsRwD80YQbAAIKqgXzAAtsfwALbJcAC3wgAAMAAVsAAAAABA8AC2zrAAt8IAAAAAwMDwALbQQAAAI8xYJsAAMAC204AAAC3v2CbAADAAtteAAAAuJ9gmwAAAGCbAAE+Ck7AAtt2wALbhgAAuKBgmwABFsAC25GBwALbiMA/NgGDZpsbQB7AAtuiwACDYQIAAieZd4HAAtuywD82AQDAAtuiwALbuwBAHsAC28nAAINhAgACJ4Ocg8AC29fAPzYjAMAC28nAAtvnAE7AAtv1wALcAwAAt7tgmwABHMAC3AUuwABV1gEAAYDAAtwVwD819ADAAIJUScAC3CEewALcJcAAg2ECAAInk4MWwALcQYTAAtwzwD82jINmmxsAPgE9iMAC3FDAPzX0HMAC3FguwABWcAEAAYTAAtxswD82jADAAIK+PgE9iMAC3I/APzX0HMAC3JcuwABWdQEAAYTAAtywwD82jADAAIJyTsAC3M7AAtzeAAC4ymDAAPR5AZNBQ8AC3OcpPgVOwALdAsAC3QcAAINmYJsAARbAAt0PgMAC3QnAPzX0g2abG0nAAt0bHsAC3R/AAINhAgACJ4LahsAC3S3APzdKAD4CPYjAAt0+wD819IbAAt1GwD83SkLAAt1UAD89iMAC3WnAPzX0FsAC3YgcwALdcS63GgEAAYDAAt2BwD819ADAAIJzg2abGz2NwALdlsA/Ny0cwALdlIXAAt2WwD83LV0BAAGUAMAA9Z5JwALdrSEewALdssAAg2ECAAIngJuAwALdwMA/NfQAPgFCwALd0gA/ScAC3eshHMAC3fWAwALd78A/NfRBAQABFsAC3giDwALd+MA/NiObz5sNAMAA9dI+Aj0cwALeGi7AAFW7AgACgMAC3jrAPzX0GsAC3keHXwDAAILEPYjAAt5nwD819BbAAt5/g8AC3m/APzYjm8+bDT89HMAC3pwWwALeky6j18AAgfO3uAQABIHAAt64wD82AYPAAt7CwD82I4TAAt7TwD82jIXAAt7iwD83LQDAAIEPSsAC3vgBgMAC3v/APzX0BsAAgquBfMAC4M7AAuDUwALilQAAwABWvAAAAAEDwALg4sAC4pUAAAAEBATAAuDwAAAAjzFgmwAAwALg/QAAALifYJsAAMAC4Q8AAAC3v2CbAADAAuEfAAAAnEpgmwAAAGCbAAE+CT2IwALhMcA/OQgcwALhOS7AAFbBBAAEgMAC4VHAPzkIgcAC4VjAPzkVgsAC4WTAPzkig8AC4W7APzkvAMAAgqw9HMAC4YgWwALhfy6j18AAgfPAAFUrAQABFsAC4Z2AwALhl8A/OQiDZpsbAMAAgRdOwALhssAC4cEAAMAAVlxgwACjEAEWwALhwy65VsAAgfY9F8AC4dIuuVYawALh6MAAoxjAAIH2PYjAAuH4wD85CBzAAuIALsAAVl0BAAGAwALiD8A/OQgAwACCbD0XwALiGy65VoTAAuInwD85tMAAgfY9HMAC4kQWwALiOy6j18AAgfPAAFUtAQABFsAC4leAwALiUcA/OQiDZpsbAMAAgRg9HMAC4msWwALiYi6j18AAgfO4rAEAARbAAuJ6gMAC4nTAPzkIg2abGwDAAIEUSsAC4oUBgMAC4ozAPzkIBsAAgqyBfMAC4prAAuKgwALnYAAAwABWwQAAAAEDwALit8AC52AAAAAEBATAAuLFAAAAjzFgmwAAwALi0gAAALifYJsAAMAC4uQAAAC3v2CbAADAAuL0AAAAnEpgmwAAAGCbAAE+C07AAuMMwALjFgAAuKFgmwABFsAC4x6AwALjGMA/Or6DZpsbQB7AAuMvwACDYQIAAieZd4LAAuM/wD862ADAAuMvwALjSABAHsAC41bAAINhAgACJ4OcFsAC422CwALjZMA/OtiDZpsbAMAC41bAAuNyAEAiHsAC44DAAINhAgACJ5lthMAC44/APzr6AAEewALjncAAg2ECAAIngqaEwALjq8A/OvoAwALjgMAC47UAScAC470hFsAC482DwALjwsA/OuWbtJsPPgE9HMAC4+MuwABVuwIAAoPAAuQOwD865RrAAuQghLsAwACCxEnAAuRIIRzAAuRXg8AC5EzAPzrlQQEAAYDAAuRawD86vgDAAPXSPgFJwALkaR7AAuRtwACDYQIAAieArxbAAuSGg8AC5HvAPzrlg2abGwA+AT0cwALkly7AAFXJAgACFsAC5MaDwALku8A/OuWDZpsbGsAC5NKFggDAAILDPgE9HMAC5Q8uwABVuwIAAhbAAuVHg8AC5TzAPzrlg2abGxrAAuVTh18AwACCxEnAAuWAIiEcwALlj4HAAuWEwD86y0EBAAErAMAA9dIAIRbAAuWbLsAAVbLAAIH+PgE9HMAC5fAuwABVyQIAAoTAAuYHwD86+hrAAuYYg4oAwACCwz89HMAC5kYWwALmPS6j18AAgfO4mwEAARbAAuZlhMAC5lvAPzr6g2abGwDAAIEVPYjAAuZwwD86vhzAAuZ4LrcaAQABhMAC5ojAPzr6AMAAgnM9iMAC5pjAPzq+HMAC5qAuwABWAgIAAoDAAuaxwD86vhbAAubBgsAC5rjAPzrYg2abGwDAAIJRPRzAAubVFsAC5swuo9fAAIHzuJwBAAGAwALm6MA/Or4AwACBFj0cwALm/RbAAub0LqPXwACB87ieBAAEgcAC5xvAPzrLgsAC5yfAPzrYFsAC5zqCwALnMcA/OtiDZpsbhMAC50DAPzr6AMAAgRNKwALnUAGAwALnV8A/Or4GwACCrYF8wALnxMAC58rAAungAADAAFZpAAAAAQPAAufdwALp4AAAAAEBAcAC5+QAAACPMWCbAAAAYJsAAT4MTsAC5/fAAugCAADAAFbCYJsAARbAAugKgMAC6ATAPz4Xg2abG0AewALoG8AAg2ECAAInmXWBwALoLcA/PiwAwALoG8AC6DgAPRzAAuhIFsAC6D8uo9fAAIHzwABVIQEAAYHAAuhcwD8+LADAAIGfPYjAAuhtwD8+FxzAAuh1LsAAVpkBAAGBwALoksA/PiwAwACCfD0cwALorBbAAuijLqPXwACB88AAVSUBAAEWwALoyoDAAujEwD8+F4NmmxsAwACA+07AAujfwALo7gAAwABWXGDAAKMQARbAAujwLrlWwACB9j0XwALo/y65VhrAAukVwACjGMAAgfY9iMAC6SXAPz4XHMAC6S0uwABWXQEAAYDAAuk8wD8+FwDAAIJsPRfAAulILrlWgsAC6VTAPz7wwACB9j0cwALpcRbAAuloLqPXwACB88AAVScBAAEWwALpjYDAAumHwD8+F4NmmxsAwACA/D0cwALpoRbAAumYLqPXwACB87i5AgACgcAC6bPAPz4sFsAC6cWAwALpv8A/PheDZpsbAMAAgaBKwALp0AGAwALp18A/PhcGwACCroF8wALqSsAC6lDAAu3DAADAAFZqAAAAAQPAAuplwALtwwAAAAEBAcAC6mwAAACPMWCbAAAAYJsAAT4PTsAC6n/AAuqHAADAAFbDYJsAARbAAuqPgMAC6onAP0ADg2abG0AewALqoMAAg2ECAAInmXaBwALqr8A/QBgAwALqoMAC6rcAPRzAAurHFsAC6r4uo9fAAIHzwABVIAEAAYHAAurdwD9AGADAAID3PRzAAur0FsAC6usuo9fAAIHzwABVIgEAARbAAusWgcAC6w7AP0AYg2abGwDAAID5TsAC6yvAAus6AADAAFZcYMAAoxABFsAC6zwuuVbAAIH2PRfAAutLLrlWGsAC62HAAKMYwACB9j2IwALrccA/QAMc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A0aoh18awANG1ISxAV2IqgFhAWCbAGCIkwDAAILEScADRvYewANG+sAAg2ECAAInmSmBwANHCMA/eOMAPgE9icADRxfAP3jjHMADRx4uuVwBAAGAwANHMMA/eM4AwACCsD89HMADR0sWwANHQi6j18AAgfO5zQEAAYHAA0dswD944wDAAIF/SsADR3cBgcADR37AP3jjBsAAgseBfMADR4vAA0eRwANKsQAAwABWzgAAAAEDwANHqsADSrEAAAABAQHAA0exAAAAjzFgmwAAAGCbAAE+BkAewANHxcAAg2ECAAInmU+AwANH18A/efoAwANHxcADR90APRzAA0fkLsAAVckCAAKAwANH+8A/efoawANICIO+AMAAgsM9HMADSCsWwANIIi6j18AAgfO6LgEAAYDAA0g/wD95+gDAAIFbTsADSFHAA0hWAACDZmCbAAEWwANIXoDAA0hYwD95+oNmmxtJwANJNBbAA0k9gcADSTjAP3p6m7SbDz4DPYjAA0lswD95+oHAA0l0wD96ej2JwANJgMA/enoWwANJjYDAA0mHwD95+oNmmxtJwANKISIewANKJcAAg2ECAAInmSmBwANKM8A/enoAACEcwANKShbAA0pBgcADSjzAP3p6m8+bDUEBAAErAMAA9dI+AT2IwANKeMA/efoWwANKhYHAA0qAwD96epvPmw0/P0rAA0qhAYDAA0qowD95+gbAAILIgXzAA0q2wANKvMADTfYAAMAAVs8AAAABA8ADStTAA032AAAAAQEBwANK2wAAAI8xYJsAAABgmwABPgZAHsADSu/AAINhAgACJ5vngMADSwDAP3uBAMADSu/AA0sGAD0cwANLDS7AAFXJAgACgMADSyTAP3uBGsADSzGEmgDAAILDPRzAA0tTFsADS0ouo9fAAIHzui4BAAGAwANLZ8A/e4EAwACBW07AA0t5wANLfgAAg2ZgmwABFsADS4aAwANLgMA/e4GDZpsbScADTFsWwANMZIHAA0xfwD98AZu0mw8+Az2IwANMksA/e4GBwANMmsA/fAE9icADTKbAP3wBFsADTLOAwANMrcA/e4GDZpsbScADTL8iHsADTMPAAINhAgACJ5kpgcADTNHAP3wBAAAhHMADTOgWwANM34HAA0zawD98AZvPmw1BAQABKwDAAPXSPgE9iMADTb3AP3uBFsADTcqBwANNxcA/fAGbz5sNPz9KwANN5gGAwANN7cA/e4EGwACCyYF8wANN+8ADTgHAA0+cAADAAFbQAAAAAQPAA04cwANPnAAAAAEBAcADTiMAAACPMWCbAAAAYJsAAT4EQB7AA043wACDYQIAAieWAYDAA05LwD99CADAA043wANOUQA9HMADTlguwABVyQIAAoDAA05vwD99CBrAA058h1QAwACCwz0cwANOoRbAA06YLqPXwACB87ouAQABgMADTrXAP30IAMAAgVtKwANPjAGAwANPk8A/fQgGwACCyoF8wANQCsADUBDAA1CdAACTEQAAAAEDwANQFMADUJ0AAAACAgLAA1AgAAAAp1hgmi4AwANQMgAAAJvNYJsAAABgmwABPgM9HMADUE2AwANQQsA/fcCcLAEAAYHAA1BVwD99zQCayD0XwANQb4DAA1BkwD99wJvPgcADUHrAP33NmjZKwANQiAGAwANQj8A/fcAGwACCy4F8wANQ6cADUO/AA1LsAAC3GwAAAAEDwANRBcADUuwAAAABAQHAA1EMAAAAjzFgmwAAAGCbAAE+BEnAA1JXIRzAA1JqFsADUmGAwANSW8A/flabvpseQQEAASsAwAD10j4BSsADUnsBFsADUoiAwANSgsA/flabvpseP07AA1KiwANSqQAAny5gmwABHsADUq+bBgEAARzAA1K5lIFWAAAAAMAA9JwAPRfAA1LJgcADUsLAP36tg2aAwANS0MA/flabI0rAA1LbAYHAA1LiwD9+rQbAAILMgXzAA1NmwANTbMADVWUAAMAAVtEAAAABA8ADU3fAA1VlAAAAAQEBwANTfgAAAI8xYJsAAABgmwABPgVOwANTkcADU5oAAJ4CYJsAARbAA1OigMADU5zAP38vm6+bHU7AA1O/wANTxwAAvFZgmwABK07AA1PYwANT5AAAwABW0mDAAPKzASpDwANT8SEcwANUAYHAA1P4wD9/REEBAAErAMAA9dI+A07AA1QZwANUIAAAge5gwAD2XQEWwANUK4HAA1QiwD9/RIHumxpJwANUORzAA1REhMADVD3AP3+vgWcBAAEnupgAwAD2bz4BScADVGEhg8ADVGbAP395PgI9isADVH/AP39ngcADVInAP39EPYvAA1SdwD9/eSk/ScADVMgcwANU04TAA1TMwD9/r4FnAQABJ7qX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wANsFsA/jx+BtpsWPgFJwANsPRbAA2xMFsADbEeAwANsQcA/jx+DZpsbnCmbDj4CPRzAA2xdLsAAVuQGAAaCwANsh8A/j0eBwANsjsA/jyyDwANsn8A/j2GEwANsq8A/j8WFwANss8A/j9OAwANsu8A/jx8AwACC00rAA2zLASk/PgI9iMADbPPAP48fNQAAAAEAYJsAAYbAA2z7wD+RaCMcwANtC4cAwD+SYkEBAAErAACAwANtDsA/jx+HAMA/kmIBYJsAScADbRsWwANtKhbAA20lgMADbR/AP48fg2abG5wpmw4+A0nAA207FsADbUWAwANtP8A/jx+btJsPPgI9HMADbV8uwABW5AYABoLAA22LwD+PR4HAA22SwD+PLIPAA22jwD+PYYTAA22vwD+PxYXAA223wD+P04DAA22/wD+PHwDAAILTSsADbdEBKT9OwANt+MADbgAAAJwfYJpGARbAA24IgMADbgLAP48fnB+bF0nAA24ZIiIcwANuKIPAA24dwD+PYUEBAAErAMAA9dIAHMADbkaEwANuP8A/j8VBAQABKwDAAPXSACIiIhzAA25mh8ADbl7AP5MnQQEAARrAA25xmn4AwAD10gEcwANukYfAA26JwD+TJ0EBAAEawANunJpvAMAA9dIBHMADbryHwANutMA/kydBAQABGsADbseagADAAPXSARzAA27nh8ADbt/AP5MnQQEAARrAA27yml4AwAD10j4APz89HMADcHQWwANway6j18AAgfPAAFWQAAAAAMAAgelKwANwlAEqBsAAgtOBfMADcKnAA3CuwANyhgAAwABW5AAAAAEDwANwysADcoYAAAAGBgbAA3DYAAAAghtgmwAAwANw6QAAAMAAVYxgwAD0eQDAA3EGAAAAwABVj2CbAADAA3EeAAAAgt5gmwAAwANxMgAAALbaYJsAAMADcUYAAADAAFblYJsAAABcAT4DTsADca7AA3G0AACPMWCbAAGAwANxtsA/lFVEwANxwT4CPTUAAAABAGCbAAGGwANxzMA/lLEXwANx0ofAA3HSwD+U04MVHMADcdkWwANx0ofAA3HSwD+U04MVmxxdAQABgcADcdzAP5RiAMAA9Z6bJD2OwANx88A/lLEWwANyAYbAA3H7wD+UsYNmmxshFsADchuGwANyFcA/lLGcKZsOPRzAA3IxFsAD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wACDrAIAApYnwABXRQAEwACDhIGFg8ODwwbAAFdGAGDAAIN6ASAAwACDrAIAApcnwABXRwAEwACDhYGFg9KD0gbAAFdIAGDAAIN6ASAAwACDrAIAAjcFJ8AAV0kABMAAg4aBhYPlg+UGug0AYMAAg3oBIADAAIOsAgACNwYnwABXSgAEwACDh4GFg/SD9AbAAFdLAGDAAIN6ASAAwACDrAIAAjcHJ8AAV0wABMAAg4iBhYQAhAAGuf4AYMAAg3oBIADAAIOsAgACNwgnwABXTQAEwACDiYGFhBOEEwbAAFdOAGDAAIN6ASAAwACDrAIAAjcJJ8AAV08ABMAAg4qBhYQyhDIGwABXUABgwACDegEgAMAAg6wCAAI3CifAAFdRAATAAIOLgYWEVYRVBsAAV1IAYMAAg3oBIADAAIOsAgACNwsnwABXUwAEwACDjIGFhHCEcAbAAFdUAGDAAIN6ASAAwACDrAIAAjcMJ8AAV1UABMAAg42BhYSmhKYGwABXVgBgwACDegEgAMAAg6wCAAI3DSfAAFdXAATAAIOOgYWEuIS4BsAAStwAYMAAg3oBIADAAIOsAgACNw4nwABXWAAEwACDj4GFhMSExAbAAFdZAGDAAIN6ASAAwACDrAIAAjcPJ8AAV1oABMAAg5CBhYTchNwGkjYAYMAAg3oBIADAAIOsAgACNxAnwABXWwAEwACDkYGFhOqE6gbAAFdcAGDAAIN6ASAAwACDrAIAAjcRJ8AAV10ABMAAg5KBhYT7hPsGlOoAYMAAg3oBIADAAIOsAgACNxInwABXXgAEwACDk4GFhQ+FDwa4MwBgwACDegEgAMAAg6wCAAI3EyfAAFdfAATAAIOUgYWFI4UjBsAAV2AAYMAAg3oBIADAAIOsAgACNxQnwABXYQAEwACDlYGFhTOFMwbAAFdiAGDAAIN6ASAAwACDrAIAAjcVJ8AAV2MABMAAg5aBhYVNhU0GwABXZABgwACDegEgAMAAg6wCAAI3FifAAFdlAATAAIOXgYWFZoVmBqc8AGDAAIN6ASAAwACDrAIAAjcXJ8AAV2YABMAAg5iBhYV0hXQGugUAYMAAg3oBIADAAIOsAgACNxgnwABXZwAEwACDmYGFhYaFhga2+ABgwACDegEgAMAAg6wCAAI3GSfAAFdoAATAAIOagYWFloWWBsAAV2kAYMAAg3oBIADAAIOsAgACNxonwABXagAEwACDm4GFhaCFoAa21wBgwACDegEgAMAAg6wCAAI3GyfAAFdrAATAAIOcgYWFrIWsBsAAV2wAYMAAg3oBIADAAIOsAgACNxwnwABXbQAEwACDnYGFhbmFuQbAAFduAGDAAIN6ASAAwACDrAIAAjcdJ8AAV28ABMAAg56BhYXShdIGwABXcABgwACDegEgAMAAg6wCAAI3HifAAFdxAATAAIOfgYWF3IXcBpI/AGDAAIN6ASAAwACDrAIAAjcfJ8AAV3IABMAAg6CBhYXthe0GwABXcwBgwACDegEgAMAAg6wCAAI3ICfAAFd0AATAAIOhgYWF/IX8BpR0AGDAAIN6ASAAwACDrAIAAjchJ8AAV3UABMAAg6KBhYYEhgQGuH0AYMAAg3oBIADAAIOsAgACNyInwABXdgAEwACDo4GFhhWGFQbAAFd3AGDAAIN6ASAAwACDrAIAAjcjJ8AAV3gABMAAg6SBhYYohigGudkAYMAAg3oBIADAAIOsAgACNyQnwABXeQAEwACDpYGFhjSGNAaqRwBgwACDegEgAMAAg6wCAAI3JSfAAFd6AATAAIOmgYWGRIZEBrj4AGDAAIN6ASAAwACDrAIAAjcmJ8AAV3sABMAAg6eBhYZVhlUGwABXfABgwACDegEgAMAAg6wCAAI3JyfAAFd9AATAAIOogYWGbYZtBsAAV34AYMAAg3oBIADAAIOsAgACNygnwABXfwABBcAAg6yBhYOLg4uGeQEAAAODi4Z5AAAAAgICg4sAAAQnYMAA9HkAg4sAAAQoYMAA9l0AAGDAAIN6AT8DCADAAIN8gADAP8xjCADAAIN+gQDAP8xvCQAAwAD12wAAAAABBsAAg6qBhYOLg4uGeQAAIwAAAAEDg4uGeQAAAAAAAABgwAD2XQFKAAEPAC7AAIN+AAA/zKgAP8zYAAAAAQLAAIOtgYWGfIaLpX8HucUAAAFgwACAzwAAAQTAAIOvgYWGuobNCbbGAGDAAIPoAR+GxsAAg/gAAAAAAQXAAIPnAAAAAAQAAAMAAAAAAAAAAABgwACDrQE/AQkBAMAAge0AAAAANAbAAIOxgYWG0obmhukBAoCgARqG08AA7ksAAAEDhumG6QAAAAAAAABgwAD23gAGwACDs4GFhu6G84c7AAC5yAAAAAEDhvqHOwAAAAEBAYb/AAAAg1lgwAD0eQAAXAE+AUWHCAGHEYcTAABbYMAA9HkBkwEchxqBhxjAP82vXAEAAYCHHMA/zZkAwAD1pgGJhx/AP82vHIcggYcfwD/Nr10BAAGUAMAA9Z4+AT0chywursIAAAAAwACDvAbAAIO0gYWHq4ewiF4AALb+AAAAAQOHvoheAAAABAQEh9YAAAiUNF3AAPUdAWDAAPXFAIftAAAIp7ZbAIgIAAAAtdRgjlQAiCEAAAiSTFsAAFwBPgFKiC0BHog0mYEDAAMntv4ciFKUgVYAAAAAwAD0nBaIVi6AoMAAg7EABsAAg7WBhYjOiNaJGgAAtugAAAABA4jiiRoAAAAAAAAAWwE+AUqI6wEeiPKZgQMAAye26ByJDpSBVgAAAADAAPScFokSLoCgwACDsQAGwACDtoGFiYqJm4nyAAC3FQAAAAEDiamJ8gAAAAEBAYmzAAAAklFgjBUAAF3AAPUdAWCOYwE+AUqJwQEmicEBHonImYEDAAMntxUcieaUgVYAAAAAwAD0nBaJ6i6AoMAAg7EAXcAA9R0BYI5jBsAAg7eBhYpiimeKoQAApRcAAAABA4p1iqEAAAAAAAAAXAFKinsBHop7mYEDAAMnpRccipmUgVYAAAAAwAD0nBaKnS6AoMAAg7EABsAAg7iBhYr3iv+LkAAAo+EAAAABA4sUi5AAAAADAwOLIwAAAKPaYMAAgfEAizEAAACPMWCbAACLRQAAAJ7wYI44AABbAT4BSotXAR6LXpmBAwADJ8AAV4Aci4SUgVYAAAAAwAD0nBaLiC6AoMAAg7EABsAAg7mBhYuVi5qMAAAArsEAAAABA4uejAAAAAABAQGLpgAAAIOyYMAA9cUAAFwBPgJJi7Ici7uAi7bAP9AZQQEAASsAwAD10j0ei8SZfwQABCeEAieuwRyL3pSBVgAAAADAAPScFoviLoCgwACDsQA/PRyL8haL7C62xsAAg6+uwQEAAYCL98A/0BkAwACD8gbAAIO6gYWMBYwKjHUAALoSAAAAAQOMFIx1AAAAAgICjBsAAADAAFeBYJsAAIwyAAAAwABIOGDAAIN6AABcAT4BSYxDHIxTgIxHwD/QqkEBAAErAMAA9dI9HIxiFoxcLrbGwACDr67BAQABgYxnwD/QtwDAAIPyPwbAAIO7gYWMeoyBjK8AAJ36AAAAAQOMhYyvAAAAAAAAAGDAAPXFAUqMiwEjFoyRFoyLLrbGwACDr4NowACD7RaMpBaMni62xsAAg6+BecAAg+8rAWDAAPXFBsAAg7yBhYy0jLuM+wAArsIAAAABA4y+jPsAAAABAAGMygAAAMAASDhgwACDegErAGDAAPXFAT4BSozcARyM6RaM4y62xsAAg6+uwgEAAYCM7cA/0XsAwACD8wbAAIO9gYWNAI0HjU8AALhAAAAAAQONE41PAAAAAQEBjRsAAACAimDAAPXFAABgwAD1xQE+AUqNKAEjHI01gI0vwD/R1kEBAAErAMAA9dIrHI1GLq7CAAAAAMAAg7wBYMAA9cUGwACDvoGFjVSNWY2OAAC21AAAAAEDjWONjgAAAAEBAY1rAAAAgLBgwAD2XQAAXAE+AAbAAIO/gYWNk42YjrMAAMAAV4IAAAABA42ijrMAAAABAQGNqgAAAICwYMAA9l0AAFwBPgM9Ho22wADuYAEAASfAAFeDAEaN2Y34jeUAAACdM2DAAPXFABaN8BaN6i62xsAAg68pwACD8D4ETo4HjgkAAIT7YMAA9l0BJI4RAieDoYGOD8A/0pZOjh2OIwAAJ2DAAPR5ARyOJ4KOJcA/0riArgEAASeAowDAAPZwSY48IRyORoOOQMA/0tVBAQABHI5JlIFWAAAAAMAA9JwAwAD1nD4BPYqOV8A/0rgcjnEcjl2CjlvAP9K4gLECAAKTg45qwD/S1QDAAPZzXQEAASebggDAAPZyPz0ejojAAO5gAQABgo6OwD/SuAA9Ho6cwADuYAEAASSOrgInwABXhICOqcA/0m4ABsAAg8CBhY64jsmPJwAAwABVPgEajrnAAO5LAAABA47RjycAAAABAQGO2QAAAICwYMAA9l0AAFwBPgI9HI7lLsAAV4IBAAGAjvDAP9OsAMAAg789Ho77mX8EAASAjwXAP9OsJI8ZARaPDS6FA8AA9dkcjxuUgVYAAAAAwAD0nBaPHy6AoMAAg7EABsAAg8GBhY8sjz2Q+AAAt1gBGo8twADuSwAAAQOPTZD4AAAAAgICj1QAAACPMWCbAACPbQAAAIHnYMAAgwgAAFwBPgI9HI98LrbUAQABJ7dYAMAAg75Jj6AhFo+rgI+lwD/UNJQ9mxQ+AT0cj8AursEBAAEWj8uAj8XAP9Q0ge6bGgDAAIO5PgE9HJDELq7BAQABH5DNwACECgEAARaQ4oCQ3MA/1DSEF5sJAADAAIO5BsAAg8KBhZD9kQ6RZgAAumcBGpD+wADuSwAAAQORGpFmAAAAAQEBkSEAAACPMWCbAAAAXAE+Aj0ckS4uttQBAAEnwABVggDAAIO+PRyRSC6uwQEAARqRV8AAg5cAwACDuQbAAIPDgYWRa5F8kbsAALb6ARqRbMAA7ksAAAEDkYqRuwAAAAEBAZGRAAAAjzFgmwAAAFwBPgE9HJGeLrbUAQABJ5ToAMAAg74GwACDxIGFkcCRxZK9AAC3HQAAAAEDkc+SvQAAAAEBAZHUAAAAhBdgwAD0eQAAXAE+AUmR5haR8BaR6i62xsAAg6+DaMAAg+0+AT0ekgSZfQMAAxySRBqSH4WthM0CAAIkknEBFpJkLoUDwAD12RySgBaSeRaScy62xsAAg68pwACD8FEBAAEnqxEAwAD07wCIroCSmcA/1YgWkq8ugKDAAIOxAD8GwACDxYGFksKS05NEAADAAFV7ARqSw8AA7ksAAAEDkumTRAAAAAEBAZLwAAAAjzFgmwAAAFwBPgI9HJL9LrbUAQABJ8AAVXwAwACDvj0ckyQutx0BAAEWkzWAky/AP9Y2hBebCQDAAIPEBsAAg8aBhZNJk1qTzgAAwABVTQEak0rAAO5LAAABA5Nsk84AAAACAgKTcQAAAIDQYMAA9HkAk34AAACPMWCbAAAAXAE+Aj0ck4suttQBAAEnwABVTgDAAIO+PRyTri63HQEAARaTv4GTucA/1q2EF5sJAMAAg8QGwACDx4GFk9OT5JQxAAC6dAEak9TAAO5LAAABA5P2lDEAAAABAQGT/QAAALp1YJsAAABcAT4BPRyUEy621AEAASfAAFVEAMAAg74GwACDyIGFlDaUR5SUAAC6dgEalDfAAO5LAAABA5RUlJQAAAACAgKUWwAAALg7YJsAAJRqAAAAo/ZgwAD0eQAAXAE+AT0clHsuttQBAAEnwABVRwDAAIO+BsAAg8mBhZSZlKqVEwAAupEBGpSawADuSwAAAQOUu5UTAAAAAwMDlMIAAACCG2CbAACUzwAAALpBYJsAAJTjAAAAt3FgmwAAAFwBPgE9HJT2LrbUAQABJ7qSAMAAg74GwACDyoGFlRiVKZVyAAC6kwEalRnAAO5LAAABA5U6lXIAAAABAQGVQQAAALoxYJsAAABcAT4BPRyVVS621AEAASfAAFVIAMAAg74GwACDy4GFlXeViJXNAAC6cgEalXjAAO5LAAABA5Wglc0AAAAAAAAAXAE+AT0clakuttQBAAEnwABVRgDAAIO+BsAAg8yBhZXSleOWKAAAunMBGpXTwADuSwAAAQOV+5YoAAAAAAAAAFwBPgE9HJYELrbUAQABJ8AAVUkAwACDvgbAAIPNgYWWLZY+lrcAALpvARqWLsAA7ksAAAEDllqWtwAAAAICApZoAAAAukJgmwAAln8AAAC6cGDAAPR5AABcAT4BPRyWli621AEAASfAAFVFAMAAg74GwACDzoGFlryWzZc6AAC50QEalr3AAO5LAAABA5bilzoAAAABAQGW6QAAAI8xYJsAAABcAT4CPRyW9i621AEAASe50gDAAIO+PRyXGS6uwQEAARqXKMAAg6IAwACDuQbAAIPPgYWXP5dQl70AALj5ARqXQMAA7ksAAAEDl2WXvQAAAAEBAZdsAAAAjzFgmwAAAFwBPgI9HJd5LrbUAQABJ7j6AMAAg749HJecLq7BAQABGperwACDpgDAAIO5BsAAg9CBhZfCl9OYZwAAudMBGpfDwADuSwAAAQOYDZhnAAAAAQEBmBQAAACPMWCbAAAAXAE+AT0cmCEuttQBAAEnudQAwACDvgbAAIPRgYWYbJh9mNYAALnVARqYbcAA7ksAAAEDmImY1gAAAAEBAZiQAAAAudZgmwAAAFwBPgI9HJikLrbUAQABJ7nXAMAAg749HJi+Lq7BAQABGpjNwACDoQDAAIO5BsAAg9KBhZjbmOyZcwAAueEBGpjcwADuSwAAAQOZBJlzAAAAAgICmQsAAACPMWCbAACZHQAAAIIcYMAAg0MAAFwBPgI9HJkpLrbUAQABJ7niAMAAg749HJlPLq7BAQABGplewACDkwDAAIO5BsAAg9OBhZl4mYmZ6gAAuc8BGpl5wADuSwAAAQOZmpnqAAAAAQEBmaEAAACPMWCbAAAAXAE+Aj0cma4uttQBAAEnudAAwACDvj0cmc0ursEBAAEamdzAAIOAAMAAg7kGwACD1IGFme+aAJqJAAC6IQEamfDAAO5LAAABA5oYmokAAAACAgKaHwAAALdxYJsAAJoyAAAAt4BgmwAAAFwBPgI9HJpDLrbUAQABJ7oiAMAAg749HJppLq7BAQABGpp4wACDlADAAIO5BsAAg9WBhZqOmp+bFAAAuiMBGpqPwADuSwAAAQOavpsUAAAAAgICmsUAAAC3cWCbAACa2AAAALeAYJsAAABcAT4BPRya6S621AEAASe6JADAAIO+BsAAg9aBhZsZmyqbnwAAuiUBGpsawADuSwAAAQObSZufAAAAAgICm1AAAAC3cWCbAACbYwAAALeAYJsAAABcAT4BPRybdC621AEAASe6JgDAAIO+BsAAg9eBhZukm7WcHwAAufIBGpulwADuSwAAAQObyZwfAAAAAQEBm9AAAACPMWCbAAAAXAE+Aj0cm90uttQBAAEnufMAwACDvj0cm/8ursEBAAEanA7AAIOUAMAAg7kGwACD2IGFnCScNZyUAAC29AEanCXAAO5LAAABA5xJnJQAAAAAAAAAXAE+Aj0cnFIuttQBAAEntvUAwACDvj0cnHQursEBAAEanIPAAIOZAMAAg7kGwACD2YGFnJmcqp0IAAC3JAEanJrAAO5LAAABA5zGnQgAAAABAQGczQAAAI8xYJsAAABcAT4BPRyc2i621AEAASe3JADAAIO+BsAAg9qBhZ0NnR6deAAAtycBGp0OwADuSwAAAQOdO514AAAAAQEBnUIAAACPMWCbAAAAXAE+AT0cnU8uttQBAAEntygAwACDvgbAAIPbgYWdfZ2OnekAALdoARqdfsAA7ksAAAEDnaCd6QAAAAEBAZ2nAAAAjzFgmwAAAFwBPgI9HJ20LrbUAQABJ7doAMAAg749HJ3aLq7BAQABgJ3fwD/dwgDAAIO5BsAAg9yBhZ3unf+fLwAAt2sBGp3vwADuSwAAAQOeD58vAAAAAgICnhQAAAC3bGDAAPR5AJ4uAAAAm81gmwAAAFwBPgI9HJ4+LrbUAQABJ7drAMAAg75JnmIcnnmAnmbAP94hQQEAAZMAwAD1nD4CTp6NnpMAAI8xYJsAASaejQEcnpUursIAAAAAwACDvGCbAD0cnqIursEBAAEenqfAAH9hAwADFp68gp62wD/eaoHumxqCnsTAP95qLgAAwACDuT4BPR6e5pl+AwADJ8AAV4UWnxWBnwzAP94uhBebCRafIS6AoMAAg7EABsAAg92BhZ80n0Wf7QAAt3ABGp81wADuSwAAAQOfV5/tAAAAAgICn14AAAC3cWCbAACfcAAAALdyYMAA8rMAAFwBPgI9HJ9/LrbUAQABJ7dzAMAAg75Jn5+Bn6PAP98WPgE9HJ+0Lq7CAAAAAMAAg7w/BsAAg96BhZ/yoAOgQgAAwABVTAEan/PAAO5LAAABA6AXoEIAAAAAAAAAXAE+AT0coCAursIAAAAAwACDvAbAAIPfgYWgR6BMoOIAAMAAVVUAAAABA6BmoOIAAAACAgKgbQAAAI8xYJsAAKB8AAAAImCIkwAAXAE+Aj0coIsuttQBAAEnwABVVgDAAIO+PRygsy6uwgAAAADAAIO8BsAAg+CBhaDnoPihPQAAtzcBGqDowADuSwAAAQOhCaE9AAAAAQEBoRAAAAC3OGCbAAAAXAE+AT0coR0uttQBAAEnwABVQwDAAIO+BsAAg+GBhaFCoVOhkgAAuDgBGqFDwADuSwAAAQOhYaGSAAAAAQEBoWgAAACPMWCbAAAAXAE+AT0coXUuttQBAAEnuDkAwACDvgbAAIPigYWhl6GoosUAALfBARqhmMAA7ksAAAEDob6ixQAAAAMDA6HOAAAAImCIkwCh3QAAAJ34YJsAAKHvAAAAm81gmwAAAFwBPgM9HKH/LrbUAQABJKIlAieBVxaiHICiFMA/4K0iiJYAwACDvkmiLByiMC66UgIAAhaiR4CiP8A/4K2CGoiVgaJNwD/gtwDAAIPjSqJaAD89HKJmLp04AwADgKJxwD/grR6iesAAg2UBAAGBoonAP+C3AB6insAAg20CAAKBoqvAP+C3gqK3wD/gwgAAwACD5QbAAIPjgYWiyqLPpEsAALpSAAAAAQOi3aRLAAAAAgICouMAAACCGl2IiAFbAKLvAAAAjzFgmwAAAGDAAPKzAT4BSaL8HKMFgKMAwD/hgUEBAAEaowiGQQDAAPXSPgFKo40BKUmjpRyjroCjqcA/4YFBAQABGqOxg7sAwAD10j4BSqQVASk+AUqkNQEqBsAAg+SBhaRQpGGk/gAAwABVCQEapFHAAO5LAAABA6R0pP4AAAAEBASkhAAAACJgiJMApJMAAAiPMWCbAACkngAAAJ37YMAA9HkApLAAAABaYMAA9HkAAFwBPgE9HKS+Lp04AwADgKTJwD/iFhyk4xak2IGk0sA/4iCEF5sJXQEAAYKk5cA/4isAwAD1noOk88A/4jgAwACD5QbAAIPlgYWlA6UIpX0AAp04AAAAAQOlEqV9AAAABQMDpRsAAAAiYIiTAKUoAAAAhBdgwAD0eQClOAAAAFpgwAD0eQACpUwAAACd4GDAAPKzASqldAAAAIHnXcAA9R0BYIixAStcAAAAP81LAD/NeQA/zgUAP86CAD/OzwA/zzwAP8+HAD/P+QA/0IoAP9ECAD/RWwA/0bYAP9IaAD/STAA/04MAP9QNAD/UvgA/1R8AP9VoAD/WDQA/1ncAP9buAD/XOQA/15EAP9fwAD/YOwA/2HsAP9i7AD/ZEwA/2XIAP9nRAD/aGgA/2nkAP9rlAD/bRAA/264AP9wCAD/cVgA/3LUAP90JAD/dUgA/3ZsAP936AD/e5AA/31YAP9+TAD/f8gA/4D0AP+CGAD/hYQA/4e0AP+KHAD/i7QAAADQCwACD6IGFpYKliKzpA8AAV4YAAAFgwAD1xQAAAgTAAIPqgYWln6W6GLFKAF3AAPUdAWDAAPXFAR6lq8AA7oIBAWDAAPXFATcIAATAAIPrgYWlwqXRGLyNAGDAAPR5AZMBBcAAg/gAAAAABAAAAwAAAAAAAAAAAGDAAIPoAT8BCQEAwAD12wAAAAAIBsAAg+2BhaXWpd+l/AEAg2gAAAABA6XqpfwAAAAAAAAAYMAA8rMBSqXtARyl+Ral7S68jcAAg+uAiwEAAZMAwAD1qAbAAIPugYWmAaYJph4BAFoAAAABA6YQph4AAAAAAAAAYMAA9HkBSqYTARamEy68jcAAg+sGwACD74GFpiOmLqaPAQCBeQAAAAEDpjOmjwAAAAAAAABgwAD1xQE+Ak6mP6ZFAAGAimDAAPXFARymTBamRy6xSsAAg+pEAQABHKZZFqZNLryNwACD64FBAQABlADAAPWfAMAA9SxKpmMBIyWmcICmasA/5PJgwACDeiuApobAP+TyAWDAAPXFBsAAg/KBhaaUppmnDgAArsEAAAABA6adpw4AAAABAQGmpQAAAICKYMAA9cUAAFwBPgI9HKa3FqayLrFKwACD6oCyAgACNQAAAAEAYMAA9HkBFqa4LryNwACD6zUAAAABAGDAAPR5ARemuC68jRymw4EAwD/lll0BAAGUAMAA9Z7AAIPrgQDAP+WWgKbJwD/lcADAAPUtSabUHKblFqbeFqbYLrFKwACD6lrAAPVMQQEAARam6C68jcAAg+sAwAD1nD4BPRym/S7AAFeHwACDeQAAAADAAIP2PwbAAIPzgYWnE6caqEkAAK7CAAAAAQOnHahJAAAAAQEBpygAAADAAEg4YMAAg3oAAGDAAPXFAT4EQBynTBanQC68jcAAg+uAiwEAAZMAwAD1qKdAp08ATqdjp2kAAYCKYMAA9cUBHKdwFqdrLrFKwACD6kQBAAEXp3MuvI0cp3EWp3MuvI3AAIPrgUEBAAGUAMAA9Z/AAIPrAMAA9Sw9HKeKFqeFLrFKwACD6oCyAgACFqeLLryNwACD6ysAwAD1LUmnpCElp66Bp6jAP+aAYMAAg3o+AUqnxQGBp8zAP+aASafeIhyn7ICn4sA/5klBAQABKwDAAPXSARyn/YGn98A/5oBBAQABgKgAwD/mSQDAAPXSPgFKqBMBKz4BSqgzAYGoOsA/5oAGwACD9IGFqE6oW6t3AADAAFeIAAAAAQOoYqt3AAAAAwMDqGcAAACA0GDAAPR5AKh7AAAAgxRdwAD1HQFgwAD1xQCoiwAAAMAASDhgwACDegAAXcAA9R0BYMAA9cUBPghAHKivFqijLryNwACD64FIAQABgKiywD/ncgDAAPWpqKOotwBOqNGo1wABsUpdwAD1HQFgwAD1xQEWqN4usUrAAIPqTqjzqPoAAVpgwAD0eQEWqPwuvI3AAIPrTqkXqSIAAcAAV4lgwAD0eQEcqSuEqSTAP+f0gUEBAAGAqS3AP+dyAMAA9Z9OqT2pTgAAul9gwADyswEqRalbAalkqWYAAFtgwAD0eQGTARypbYepa8A/6EtcAQABgKlvwD/ncgDAAPWmAY+pdsA/6EscqXeHqXbAP+hLXQEAAZQAwAD1nj4ETqmHqZIAAMAAV4pgwAD0eQEcqZ+FqZTAP+gMXQEAAYepocA/6EsAwAD1nk6pt6m9AAGAimDAAPXFARypxIOpv8A/59VEAQABFKnFwD/okwgAAMAA9Sw9HKndg6nYwD/n1YCyAgACFKnewD/okwgAKwDAAPUtSan4IiIlqgIUqfzAP+i+CQBgwACDegAcqhyCqhLAP+eSQQEAASsAwAD10gEeqjHAAO5eAgACFKo7wD/ovgkAgqpCwD/nkgA+AT0cqlyBqljAP+d/gLICAAKHql3AP+hLKwDAAPUtSap1Jap/FKp5wD/ovgkAYMAAhAQ+AT2OqpzAP+g4KT4CSarMJarWFKrQwD/ovgkAYMAAg3o+AT0eqvDAAO5gAQABFKr2wD/ovgkBYMAAg3oAPz0cqxSBqxDAP+d/gLICAAKHqxXAP+hLFKsawD/ovgkAAMAA9S09F6szLryNHKs/FqszLryNwACD64FBAQABgKtCwD/ncgDAAPWfwACD60qrTgEjhqtVwD/oOCuBq2/AP+d/AV3AAPUdAWDAAPXFBsAAg/CBhat8q42sKgEAKQAAAAEDq5SsKgAAAAAAAABdwAD1HQFgwAD1xQE+BE6rpKurAAFaYMAA9HkBFqutLryNwACD606r0avWAAGDFF3AAPUdAWDAAPXFAR6r3MAA7oIBAWDAAPXFAYCr6cA/6lwAPRyr+4Gr9sA/6nSDFwMAA5OArAfAP+pcFqwPLrFKwACD6gDAAPVCSqwbAYGsIsA/6nQGwACD9oGFrC+sNKznAADAAFeHwACDeQAAAAEDrDms5wAAAAAAAABcAT4ETqxMrFMAAVpgwAD0eQEWrFsWrFUusUrAAIPqWsAA9UxOrHqsgwABvJJdwAD1HQFgwAD1xQEerInAAO6CAQFgwAD1xQEcrJ2ArJbAP+r9gz4BAAGVAMAA9aAAPRyssIGsp8A/6x2DFwQABJOArLzAP+r9FqzELrFKwACD6pMAwAD1Qj0XrNMusUqBrNvAP+sdwACD6gAAP+RRAD/klAA/5MgAP+VQAD/mKQA/51AAP+otAD/q0QA/65AAAAAIAsAAg/mBha2SrZivQwO2gwABAACB/WDAAPXFAVsBYMAA9cUAAAABBcAAg/6Bha2xrbetygEAAAOtyK3KAAAAAAAAAF3AAIP5AV8AAAE/AQkBrbfAAPXbAAAAAAIGwACD+4GFrc+t165vAACuwgAAAAEDrdqubwAAAAMCA63hAAAAtsZgwACD6ACt7AAAAIDQYMAA9HkArf4AAADAAEg4YMAAg3oBKwBdwAD1HQFfAAABPgJJrhAcrhqBrhTAP+xCQQEAAZMAwAD1nEquIAErP0quMQEmrjEBHK4+gK44wD/sNcAAV4gDAAOBrkbAP+xCHq5RwADuggEBXwAAAYGuWcA/7EIAgq5hwD/sTwDAAIP0XcAA9R0BXwAABsAAg/yBha50rnyvQQAAuDYAAAABA66Fr0EAAAAEAwSujAAAALbGYMAAg+gArpcAAACA0GDAAPR5AK6iAAAAk31gwAD0eQCuvAAAAMAASDhgwACDegErAF3AAPUdAV8AAAE+Akmuzhyu4hyu2IGu0sA/7QBdAQABgq7awD/tDQDAAPWeQQEAAZMAwAD1nEqu6AErP0qu+QEmrvkBHK8GgK8AwD/s88AAV4gDAAOBrw7AP+0AHq8ZwADuggEBXwAAARyvJ4GvIcA/7QBdAQABgq8pwD/tDQDAAPWeAIOvM8A/7RoAwACD9F3AAPUdAV8AAAAAP+wVAD/s0wA/7cQAAAACAsAAg/+Bha/Br8ewmwO2hAABAACB/WDAAPXFAVsBYMAA9cUAAAABBcAAhAOBha/br+Gv7wEAAAOv7a/vAAAAAAAAAF3AAIP/AV8AAAE/AQkBr+HAAPXbAAAAAAEGwACEAYGFr/Sv/LCZAACuwgAAAAEDr/+wmQAAAAMCA7AGAAAAtsZgwACD6ACwEQAAAIDQYMAA9HkAsCMAAADAAEg4YMAAg3oBKwBdwAD1HQFfAAABPgFKsDUBJrA1ARywQoCwPMA/7lHAAFeIAwADgbBTwD/uXh6wXsAA9SIDAV8AAAKBsG3AP+5eKwGTDymCsIvAP+5rAMAAg/RdwAD1HQFfAAAAAD/uMQA/7tYAAAABAsAAhASBhbCesKSxKAO2hwAAAWDAAPXFAAABBMAAhAaBhbDBsMsJhBcAYMAA9HkAAQXAAIQKgYWwz7DPsO4AAAADsN2w7gAAAAEBAbDjAAAEhBdgwAD0eQAAYMAAhAQBPwIIAcAAhAaAAMA/7y8JAbDPwAD12wAAAAABBsAAhAiBhbDzsPqxJgAAIwAAAAEDsQKxJgAAAAAAAABgwAD2XQFKsQgBJLEmAyfAAFeLFrEaLoQXwACEBieC2gAAP+9eAD/vngAAAAEAAAGBhQA/760AP8SnAD/M5QA/48YAP+u5AD/t1QA/7uMAP++rAAAABgA/760AAAAAAMAAhAvAAFeMgYYAAAKA+wAAmhqbpwCBKwAAiawAAQEEgceByoG7gcUAAAAFAsAAhAyBhoGega2Jrge8LwAAAWDAAPXFAAABBMAAhA+BhoIzgkEEwABXjcAAhAsAYMAAhAwBKwEFwACEGAAAAAAEAAADAAAAAAAAAAAAYMAAhAwBPwEJAQDAAPXbAAAAAAUGwACEEYGGgb6By4HWAAKDZgAAAAEDgc+B1gAAAAEBAYHUAAAAgNdgwAD0eQAAYMAAhAwABsAAhBKBhoHageeB+QACvGAAAAABA4HygfkAAAABAQGB9wAAAIDXYMAA9HkAAGDAAIQMAAbAAIQVgYaB/oITghoBApwfAAAAAQOCGoIaAAAAAAAAAGCaRgAGwACEFoGGgkWCXYQAAQHAAFeOAAAAAQOCa4QAAAAAAAAAAGDAAIQMAT4CSYJxHIKEGoJ1wACED0EBAAErAMAA9dI+BE6CooKqAACW1F3AAPUdAWDAAPZdAR6CsMAA7oIBAWDAAPZdARaC1RqCzpqIWsAA9UwARYLkAYLtgu8AAFtgwAD0eQGTARyC9oGC9MA/8XJcAQABFoMQGoMJmohawAD1TADAAPWmAYmDGMA/8XIcgxmBgxjAP/FyXQEAAZQAwAD1nj4BPRyDLoCDJ8A/8T2AsgIAAoGDL8A/8XIWg08cg0sag0WaiEQBAAGBg0zAP/FyAMAA9SyB7pugAMAA9S09HINtgINlwD/xPYCiAQABNINyA4Nyg4oAAAACAgKDcwAAAIFmYMAA9l0Ag3YAAACB2mDAAPZdAABgwAD0eQFKg3wBHIN+gYN8wD/yGIHfAQABgoOIwD/yJQDAAPZtAMAA9TA9G4OTwACEDx6DpMAAhBMEAASTgIPAwD/xPZMWg9SAg8zAP/E9WsAA9UwAP0qD5wEag+7AAIQPBsAAhBOBhoQFhBmJrAABwABXjwAAAAEDhDGJrAAAAAQEBIQ9AAAAY2DAAPR5AIRRAAAAltRdwAD1HQFgwAD2XQCEXgAAAIMVYMAA9HkAhGoAAABaYMAA9HkAAGDAAIQMAT4KToR9hIkAAMAAV5BgwADyswEpToSphK8AAJffXcAA9R0BYMAAhAwBHoS1wADuggEBYMAAhAwBHITQHITLGoTIihCBQQEAARqEzYnXAMAA9Z9dAQABlADAAPWeAEAhHITog4ThwD/y4kEBAAGTAMAA9ZyE4YTsAE6E94T9AADAAFeRYMAA9HkBk06FCoUVAADAAFeSYMAA9HkBHIUXlIFWAAAAAMAA9JxOhSSFKwAAwABXk2DAAPKzASpFhTgBhUGFQwAAW2DAAPR5AYKFRcA/8tUBHIVPFIVNwD/ztAkAXAEAARyFWIKFUcA/8tVdAQABg4VawD/y4gDAAPWeAMAA9aYBFYViwD/ztAkchWMUhWLAP/O0CQBdAQABlADAAPWePgJJhW8chYUWhX4chXqBhXPAP/LCRAEAARSFe8A/87QJAADAAPUsWsAA9mFBAQABgIWIwD/ytgDAAPWcPgE9FYWZwD/znwgpP0mFthyFzBaFxRyFwYGFusA/8sJEAQABFIXCwD/ztAkAAMAA9SxawAD2YYCLAQABgIXOwD/ytgDAAPWoPgNOheOF5QAAgNdgwAD0eQEchfIche6BhefAP/LCRAEAARSF78A/87QJAADAAPUsg9ABAAGAhf3AP/K2AMAA9mtJhg0iHIYUGoYRideBSgEAARSGF8A/9J4KAADAAPWnAByGHhSGHMA/9J4KAIFKAQABGoYhifAAwAD1pz4BPYyGMcA/8vgqP0mGWCEchmKGhlzAP/NuQQEAARSGZcA/9J4KAADAAPWcPgNJhnQhHIaDh4Z4wD/zgEEBAAEchoaUgVYAAAAAwAD0nADAAPWcPgJAHIaxHIakhYafwD/zCkQBAAEchquGhqXAP/NugUEBAAEahq2J1wDAAPWfAMAA9SxBAQABKwDAAPXShp+GuAA9HIbMhYbHwD/zCoCyAgACHIbThobNwD/zboFBAQABGobVidcAwAD1nx6G28AAhBMEAAQchwuAhwXAP/K2XQEAAZQAwAD1noGHEMA/8sKHhxnAP/OAHIcnFIclwD/ztAkAgUEBAAGHhynAP/OAAMAA9Z8AAMAA9S0/PY+HTMA/84AUh1nAP/O0CQA9jodmwD/zbhSHbsA/9J4KAD8/SYeNIRyHnIeHkcA/84BBAQABHIeflIFWAAAAAMAA9JwAwAD1nD4CQByHxByHt4WHssA/8wpEAQABHIe+hoe4wD/zboFBAQABGofAidcAwAD1nwDAAPUsQQEAASsAwAD10oeyh8sAPRyH2YWH1MA/8wqAsgIAAhyH4IaH2sA/826BQQEAARqH4onXAMAA9Z8eh+jAAIQTBAAEHIgSgIgMwD/ytl0BAAGUAMAA9Z6BiBfAP/LCh4ggwD/zgByIPByIM4KILMA/8tVdAQABg4g1wD/y4gDAAPWegUEBAAGHiD7AP/OAAMAA9Z8AAMAA9S0+AkAciGyDiGXAP/LiQQEAAZQAwAD1nIhliHAASoh5AR+IhMAAhDcBAAEciJyBiJXAP/LCRAEAAYKIncA/8tUAwAD1LABOiLiIvwAAnB1gwAD2XQEjFIjBwD/znwgAHIjRgYjKwD/ywkQBAAGCiNLAP/LVAMAA9SwrAWDAAPZdSYjmhIjqwD/y+D4CPY2I/8A/8wociQ2FiQfAP/MKgP8BAAEciRgaiRWJ94FBAQABGokaidcAwAD1nwDAAPVASoklAR+JMMAAhCgCAAKFiUvAP/MKFIlSwD/3fQkAAD4BSoluAR+JecAAhC4CAAKFiZTAP/MKFImbwD/3fQkAAAAAP/BrAD/wnwA/8NMAP/D4AD/ylAA/+DUAAAAFAsAAhBmBhonoifeM4gfAAFeUAAABYMAA9cUAAWDAAIQMAgTAAIQbgYaKPopDCZffAF3AAPUdAWDAAIQMAATAAIQcgYaKXoplCZwfAGCaRgABBcAAhCKBhopqimqK5gAAAAOKe4rmAAAAAgICioEAAASX313AAPUdAWDAAIQMAIqPAAAAnB1gwAD2XQAAYMAAhBkBPwMIAcAAhBuAAMA/+L4IAMAAhBwjHIqygYqrwD/40UEBAAErAMAA9mwrHIrdGorVmolEAQABgYrewD/40QDAAPViAWCaRgkBimrAAPXbAAAAAAMGwACEHoGGiuuK+IsDAAKDZgAAAAEDivyLAwAAAAEBAYsBAAAAgNdgwAD0eQAAYMAAhAwABsAAhB+BhosIixWLJwACvGAAAAABA4sgiycAAAABAQGLJQAAAIDXYMAA9HkAAGDAAIQMAAbAAIQggYaLLIszjOAAACMAAAABA4s7jOAAAAAAAAAAYMAA9l0BPgdOi1GLVAAAg3pgwAD2pwEfi1rAAPbGAAAAAD0ci3GAi27AP/nJghEBAAEnmQkAwAD2u0mLgSEci40Wi4UunB/AAIQcQQEAASsAwAD10j4DPRyLoYCLnsA/+cmCEQEAASeDPgDAAPa7PRyLtoCLs8A/+cmCEQEAARaLvC6cH8AAhBwAwAD2uz0ci8+Ai8zAP/nJghEBAAEngQEAwAD2uz9Oi/iL/AAAwABXlV3AAPUdAWDAAIQMARaL/i6X38AAhBtFjAkBjBKMFAAAW2DAAPR5AZMBHIwbgowZwD/6jFwBAAEWjCGBjB3AP/poWsAA9UwAwAD1pgGKjCnAP/qMHIwqgowpwD/6jF0BAAGUAMAA9Z4+AUmMNiEcjEEcjD2BjDrAP/poRAEAAYKMPsA/+owAwAD1LEEBAAErAMAA9dI+AT0cjFeAjFTAP/nJghEBAAEkAAQejGTAAPaFAQABMYx5YMAA9HkBHIx8gox6wD/6jF0BAAEajH6J9wDAAPWeACeDDhyMmYGMlsA/+mhEAQABgoyawD/6jADAAPUsJ8AAV5YAwAD2uz89HIy4gIy1wD/5yYIRAQABJ5kKAMAA9rtKjMgBHIzSgIzPwD/5ySMAAAAAwAD2wAAAP/k4AD/5bAA/+aAAP/ueAAAAAwLAAIQjgYaM5Yzrjg4DwABXlwAAAWDAAIQZAAAAAQXAAIQogYaNJI0kjbIAAAADjT6NsgAAAAICAo1SAAAAl99dwAD1HQFgwACEDACNYAAAAJwdYMAA9l0AAGDAAIQjAT4BQByNnxaNmICNksA/++xawAD1TEEBAAEcjaocjaUajaKKEIFBAQABGo2nifcAwAD1n10BAAGUAMAA9Z4AwAD1nI2Sja0AAQkAjXDAAIQiAgACgI12wD/77IGNfcA/+/8AAgbAAIQlgYaNt43EjeAAAINmAAAAAQONyI3gAAAAAQEBjc0AAACA12DAAPR5AABgwACEDAFKjdMBHI3YFo3TLpffwACEG0QBAAEcjduAjdnAP/yWgUEBAAEajd2J9wDAAPWfAMAA9SwGwACEJoGGjeWN8o4MAAC8YAAAAAEDjf2ODAAAAAEBAY4CAAAAgNdgwAD0eQAAYMAAhAwBSo4IASsAAD/8dgA//N0AP/0WAAAAAgLAAIQpgYaOEY4Xj0MDwABXmAAAAWDAAIQZAAAAAQXAAIQugYaOUI5Qjt4AAAADjmqO3gAAAAICAo5+AAAAl99dwAD1HQFgwACEDACOjAAAAJwdYMAA9l0AAGDAAIQpAT4BQByOyxaOxICOvsA//WBawAD1TEEBAAEcjtYcjtEajs6KEIFBAQABGo7TidcAwAD1n10BAAGUAMAA9Z4AwAD1nI6+jtkAAQkAjpzAAIQiAgACgI6iwD/9YIGOqcA//XMAAgbAAIQrgYaO447wjwwAAINmAAAAAQOO9I8MAAAAAQEBjvkAAACA12DAAPR5AABgwACEDAFKjv8BHI8EFo7/LpffwACEG0QBAAEcjweAjwXAP/4KgUEBAAEajwmJ1wDAAPWfAMAA9SwGwACELIGGjxGPHo9BAAC8YAAAAAEDjymPQQAAAAEBAY8uAAAAgNdgwAD0eQAAYMAAhAwBSo80ARyPORaPNC6X38AAhBtEAQABHI88gI86wD/+cYFBAQABGo8+idcAwAD1nwDAAPUsAAA//eoAP/5RAD/+uAAAAAICwACEL4GGj3uPgZCYA8AAV5kAAAFgwAD1xQABYMAAhAwBBMAAhDGBho/Fj8wJnB8AYJpGAAEFwACEN4GGj9GP0ZAeAAAAA4/hkB4AAAABAQGP6QAAAJwdYMAA9l0AAGDAAIQvAT8CCADAAIQxHJAWGpAOmolEAQABgJAXwD//GgDAAPViCQGP0cAA9dsAAAAAAwbAAIQzgYaQI5AwkEMAAINmAAAAAQOQNJBDAAAAAQEBkDkAAACA12DAAPR5AABgwACEDAFKkD8BKwbAAIQ0gYaQR5BUkG4AALxgAAAAAQOQX5BuAAAAAQEBkGQAAACA12DAAPR5AABgwACEDAFKkGoBKwbAAIQ1gYaQc5B6kJYAACMAAAABA5CCkJYAAAAAAAAAYMAA9l0BSpCIARaQkBaQiC6cH8AAhDGB7pugAAA//1sAP/+UAD//zQBAAAgAAAADAAABgYYAQAAfAD/wCQA/+FIAP/uzAD/9JwA//skAQAAdAAAABQBAAB8AAAAAAMAAhDgAgYcAAA+A2gAAnr4AAIDzAACskgAAgRUAAMAAVS+ozwCBVAAAwABWjgAAgXcAALCYAACBmwAAwABYMQAAgbwAAMAAQzQAAIHdAADAAF9cq4sAgf4AAMAAX1wAAQEBggKCHgAAwACVmQAAgk0AAIDnAACCZwAAvvcAAIKYAADAAF+RAAEBAbOAgsoAAMAAU5MAAILkAADAAGM8AAAAAALAAIQ6gYeDG8AAV5oAAF4AAQEBYMAAVr0AAVfAAIQ6AGDAAIqXAAGDRQAAAIQfYMAAVr0AAMAAhDuBh4NqwABXmwAAXgABAQFgwACKlwABV8AAhDsAYMAAipcAAYOSAAAAsUpgwACKlwAAAQLAAIQ8gYeEl4SdvCwDwABXnAAAAWDAAPXFAAFdwABWqQJgwACKl2DAAPWCCwTAAIQ+gYeFYIWzBcAAV50AYMAA9e8BHoV3wAD2BgIAASfAAFeeAcAAV58pBMAAhECBh4XOhdYJrFXAAIQ4AGCA/wAEwACEQYGHhfCF/wmrc8AAhDgAYK1qAATAAIRCgYeGHYYqCaxYwACEOABgvvgABMAAhEOBh4ZFhk0JwABDy8AAhDgAYMAAY0oABMAAhESBh4ZrhnYJrv3AAIQ4AGDAAGPGAATAAIRFgYeGj4adCa8BwACEOABgwABf0gAEwACERoGHhreGvAnAAFegwACEOABgwACVmgAEwACESIGHhuKG/AnAAFehAF4AAQEBYMAAVr0AAVfAAIQ6AGDAAIqXAATAAIRJgYeHHYctCcAAV6IAXgABAQFgwACKlwABV8AAhDsAYMAAipcABMAAhEeBh4xEjRgFwABXo8AAhDgAYMAA9e8BHoxZwAD2BgEAASQABieDgyfAAFekJ8AAV6UnwABXpifAAFenJ5yfAAEFwACEZ4GHh+mH6YjiAAAAA4f4iOIAAAAJCQmIBQAABKxVYID/AIgaAAAEq3NgrWoAiDYAAASsWGC++ACIUAAABMAAQ8tgwABjSgCIZQAABK79YMAAY8YAiH0AAASvAWDAAF/SAIiYAAAEwABXoGDAAJWaAIiqAAAEwABXoV4AAQEBYMAAVr0AAVfAAIQ6AGDAAIqXAIjRAAAEwABXol4AAQEBYMAAipcAAVfAAIQ7AGDAAIqXAABgwACEPAE/CggBwACEQIAAwEADEAgBwACEQYEAwEADGwgBwACEQoIAwEADJggBwACEQ4MAwEADMQgBwACERIQAwEADQAgBwACERYUAwEADTQgBwACERoYAwEADWggBwACESIcAwEADaQgBwACESRQAwEADiggACQGH6cAA9dsAAAAAGAbAAIRMgYeI54jziQwBAMAARPHAAIQ4AAAAAQOI/IkMAAAAAAAAAGDAAJXEAUqI/wEWiQUWiP8uwABXoMAAhDjAAIRGq7LAAJWnBsAAhE6Bh4nJidqKHAAAwABXqAAAAAEDieKKHAAAAAEBAYnxAAAAhB9gwABWvQAAYMAAipcBPgFKigEBHIoILsAASs/AAIQ4AQABgIoPwEAEmwDAAIRQBsAAhFCBh4ohijKKfQAAwABKz8AAhDgAAAABA4o4in0AAAABAQGKRwAAAIQfYMAAVr0AAGDAAIqXAT4BSopXASaKVwEcimeAil7AQAT2lA4CAAIuKwDAAFbcYMAAipcGwACEU4GHioKKn4tCAACrmgEaioPAAO5LAAABA4qsi0IAAAACAQKKwwAACIQfYMAAVuIAis4AACiAqGDAAPWCASsAYMAAipcBPgE9MIrYHoreq98CAAIaiuer8CfAAFepAAbAAIRUgYeLR4tki7cAALQRARqLSMAA7ksAAAEDi22LtwAAAAIBAouAAAAIhB9gwABW/ACLiwAAKICoYMAA9YIBKwBgwACKlwE+AUqLlQEfi6DAAIv9AAAAAAbAAIRVgYeLvIvZjDIAAL7cARqLvcAA7ksAAAEDi+mMMgAAAAIBAov7AAAIhB9gwABYJQCMBgAAKICoYMAA9YIBKwBgwACKlwE+AUqMEAEfjBvAAIv9AAAAAAbAAIRRgYeOBo4NkDkAAMAAV6rAAIQ4AAAAAQOOLpA5AAAAAQEBjjYAAADAAFerYMAA9l0AAGDAAPZdAT4LTo5QjlYAAFhgwAD14gEcjmcajljAAIRHQAEAAYCOcsBABmsAwAD1+kmOhRyOj4GOicBABoRBAQABKwDAAPXSSo6YAYCOn8BABms/To64jr0AAMAASuhgwAD2XQEcjsSBjr/AQAaERAEAAZQAwAD1606O1I7iAADAAFesYMAA9l0BHI7pgY7kwEAGhEQBAAGVAMAA9etOjvmPCAAAwABXrWDAAPZdARyPD4GPCsBABoREAQABlwDAAPXrTo8cjyUAAMAAV65gwAD0eQEejyvAAPSoAQABHI82gY8xwEAGhEQBAAE3BQDAAPXrAEmPQByPU4SPRMBABxlBAQABKwDAAPZsPYyPXMBABxknAD89jY91wEAHPhyPfoWPdcBABz6BQQEAARaPkISPgcBABxlawAD2YQDAAPWfTo+jj6oAAIEQYMAA9l0BJI/iBYKPr8BABs+Dj7bAQAb0hI/GwEAHGSeDBoWP2MBABz5AHJAEHo/2wADzSQEAAYaP/MBAB7wAQQEAAR6QDsAA80kBAAGAkBTAQAZrAADAAPWcj++QIQBKkCgBhpAvwEAHvAbAAIRWgYeQPpBblDwAALQIARqQP8AA7ksAAAEDkGOUPAAAAAIBApB1AAAIhB9gwABXFgCQgAAAKICoYMAA9YIBKwBgwACKlwE+B06QkZCXAACAimDAAPKFARaQooCQmcBACFWk0cAAVxhOkmSScwAAwABEhmDAAPZdARySe4KSdcBACHojAAAAAMAA8q9OkpKSngAAwABXr2DAAPZdAStOkq6StQAAwABXsGDAAPR5ASMWksAWkrcurFXAAIQ4wACEQIK2gSA3pxAckuIoAAAAIF+gAkKkwQAAAADAAPW0AWDAAPR5SZLvHJL/HJL5gpLzwEAIepdIAAAAAMAA8pOBSAEAAR6TBsAA8rIBAAGFkxLAQAjPAADAAPKlPgE9jJMjwEAIvRyTMS7AAFeqwACEOAEAARyTbxyTZIKTXsBACHqkTAAAAADAAPKuwABXsQAAAADAAPW3AMAAhFE/SZOTIiEck6OEk5fAQAi9QQEAASsAwAD2bAAck8EWk7qEk67AQAi9WsAA9mFcAQABFpPSg5PDwEAImVrAAPZhAMAA9aY+AT2Lk+LAQAiZhJPzwEAIvT9KlAoBH5QVwACMHwEAAYOUKcBACJkABsAAhFeBh5RBlF6V+wAAtAsBGpRCwADuSwAAAQOUaZX7AAAAAgEClH4AAAiEH2DAAFcwAJSJAAAogKhgwAD1ggErAGDAAIqXAT4CTpSalKAAAICKYMAA8ysBFpSrgJSiwEAKH6YVwABXMkmUvBaUxoKUwMBACkSWJsAA9b4+AUqU1QEclN4alNzAAIg2IAEAASfAAFeyAMAAjQRJlPIclPyClPbAQApEQQEAARqVBsAA8y4AwAD1nD4BSpUYARyVIRqVH8AAiDYgAQABJ8AAV7MAwACNBEmVNRyVP4KVOcBACkRBAQABHJVCGpVKwADzLoFWAAAAAMAA8z4AwAD1nD4BSpVcARyVZRqVY8AAiDYgAQABJ8AAV7QAwACNBD4CTpWJlZMAAMAAV7VgwAD2XQEclZUuwABXqsAAhDgBAAEklb8BgpW5wEAKRADAAIRRSpXIAR+V08AAjB8BAAGDlefAQAsZAAbAAIRYgYeWAJYdl14AALQFARqWAcAA7ksAAAEDliaXXgAAAAIBApY5AAAIhB9gwABXSACWRAAAKICoYMAA9YIBKwBgwACKlwE+AUmWThaWWxaWUi6sVcAAhDjAAIRAgraBID4BSZZ3FpaEgJZ7wEALhbHWwABWwj4BSpayARyWuxqWucAAiDYgAQABJ8AAV7YAwACNBD4BSpb3ARyXABqW/sAAiDYgAQABJ8AAV7cAwACNBD4BSpcjASMWlzOAlyrAQAuFsdbAAFbCHJc+Gpc8wACINiABAAEnk5gAwACNBByXSxqXScAAiDYgAQABJ5vtAMAAjQQBYMAAipcGwACEWYGHmCaYQ5i2AAC0DgEamCfAAO5LAAABA5hOmLYAAAACAQKYYwAACIQfYMAAV3MAmG4AACiAqGDAAPWCASsAYMAAipcBPgFKmHgBHJiCGph/wACINq8uAgABFpiZgJiQwEAMgpwrwABXdQHAAFe4KcAAjRIGwACEWoGHmLuY2JpKAACWiAEamLzAAO5LAAABA5jhmkoAAAACAQKY9AAACIQfYMAAV54AmP8AACiAqGDAAPWCASsAYMAAipcBPgROmSCZKQAAhPldwAD1HQFgwACKlwEcmW4cmUUWmTSAmSvAQAz6lY3AAFeggJ8BAWDAAIqXARaZSS7AAFehwACESADAAPTmgKEBAAABkw8qwAD08U6ZopmoAACxSmDAAIwgAR+ZrsAAjC0BAAGCmcXAQA0fAE6Z5ZnrAACAimDAAIqXARyZ7S7AAFeiAQABg5n+wEANcgDAAIRJSpoKARyaES7AAFe5AwADgJonwEAM+haaOoCaMcBADPqCF8AAV4aEmkDAQA2TAMAAhGQGwACEW4GHmk+abJ13AAC0GQEamlDAAO5LAAABA5p0nXcAAAACAQKamwAACIQfYMAAVnIAmqwAACiAqGDAAPWCASsAYMAAipcBPghOmsSazwAAqORgwABYXQEWmtqAmtHAQA4RghfAAFeGTprwmv0AAKoCYLCtARabCoKa/8BADjaTDcAAWF9Omx6bKAAAlfpgwAD2XQEWmzeDmyrAQA5VgLCwm0mbQSEem0bAAO5eAgACg5tQwEAOVRabbhabXi6rc8AAhDjAAIRBqSas+wA+AT0em42r3wIAAoObocBADlUkm+QCJ8AAV7qEm9rAQA5yAD9OnAmcEwAAVF3AAPUdAWDAAIqXATGcJ2DAAIqXARycLy7AAFehAQABFpxTgJxKwEAOEZWNwABWdADAAIRISZxpHJx2FpxtLsAAQ8vAAIQ4wACEQ8AAQ6MBAAGDnI7AQA5VAMAAY08+AT0cnK+FnKXAQA7eTwEAARycsy7AAFe7wACEOAIAAoCcycBADhEWnN6CnNPAQA42kkTAAFhgAMAAhFIAwAD1Lj9OnQudFwAAmFBgwACKlwEcnSIWnRkuwABE8cAAhDjAAIRMwABXvAEAAYOdNMBADlUAwACVzkqdRwEfnVLAAIslAgAChp1cwEAPhoWdacBADt4ABsAAhFyBh518nZmrTQAAtBwBGp19wADuSwAAAQOdoatNAAAAAgECncgAAAiEH2DAAFZ5AJ3ZAAAogKhgwAD1ggErAGDAAIqXAT4MT53jnfQAAAHAAFe9YQBgwACKlwADnfmghAAAAAAAAABgwACKlwE+A06eGZ4kAADAAESWXcAA9R0BYMAAjEkBMZ42YMAAjEkARZ5AAZ5JnksAAFtgwAD0eQGTARyeUoSeUMBAEG5cAQABFp5dgJ5UwEAP/lrAAFfHAMAA9aYBjJ5lwEAQbhyeZoSeZcBAEG5dAQABlADAAPWeQT4FTp6InowAAIOWYMAAV3MBJp6IARyemxael4CejsBAD/6B3MAAV8BEAQABhJ6cwEAQbgDAAPUsYMAAV3NJnqgcnrwWnrCFnqzAQBC/nCvAAFd1QQEAARqe8cAAVnsAwAD2bD4BQp8NAD9On3KfgAAAwABXvmDAAIvkASafcgEcn4IuwABKz8AAhDgBAAGFn4nAQBC/AMAAhFBgwACL5E6fqJ+4AADAAFe/YMAAipcBHJ/GLsAAV6EBAAEcn/AWn+qAn+HAQA/+KcAAV8FEAQABhJ/xwEAQbgDAAPUsAMAAhEg9HKAJg5/+wEAQS08BAAEfoBHAAIxVAgAChqAgwEARJ4egL8BAEVwAAMAA9S5KoFABH6BbwACMSAEAAYOgc8BAEEsAT6CLoJwAAAHAAFfAYQBgwACKlwADoKiiZwAAAAAAAABgwACKlwE+A06gyqDPAAASXcAA9R0BYMAAipcBMaDjYMAAipcARaDtAaD2oPgAAFtgwAD0eQGTARyg/4Wg/cBAEipcAQABFqEPFqEKgKEBwEAP/oHcwABXwFrAAPVMAMAA9aYBjaEXwEASKhyhGIWhF8BAEipdAQABlADAAPWePgROoTehRQAAwABXvmDAAIqXARyhUy7AAFehAQABHKF7FqF3gKFuwEAP/oHcwABXwEQBAAGFoXzAQBIqAMAA9SwAwACESE6hmqGqAADAAFe/YMAAipcBHKG4LsAAV6EBAAEcoeIWodyAodPAQA/+KcAAV8FEAQABhaHjwEASKgDAAPUsAMAAhEg9HKH1hKHwwEASCk8BAAGGofnAQBKDAMAA9S49HKIWhKIRwEASCk8BAAGHohrAQBLHAMAA9S5KojoBH6JFwACMLQEAAYSiXMBAEgoATqJ6oocAAKoCYLCtARailxaikoCiicBAD/6CF8AAV4aTDcAAWF9OoquitQAAlfpgwAD2XQEWosSEorfAQBNWgLCwm06i5qLwAABUXcAA9R0BYMAAipcBMaMEYMAAipcATqOfo7QAAMAAV8FgwAD0eQGTPRyjyxajvS6sWMAAhDjAAIRCsqoCAAKEo+DAQBNWNKP2A6P2qBsAAAADAgKkAwAAAK3LYLCtAKQaAAAAlERgsNEAAaQnAAAAsqtgwADyswErYMAA9YIBPgNJpDoUpD7AQBQKCgBKpEgAP0mkVhykZRakYBSkWsBAE/4JAICwsJtBAQABGqSOwABWgADAAPZsPgE9HKS8hqSlwEATmU8BAAEfpMTAAIwfAQABJKT8ARak9Bak7Bak5ICk28BAD/6+mMAAVoWVjcAAV6BawAD1TAAAwAD1LkmlDRylHBalFxSlEcBAE/4JAICwsJtBAQABGqVPwABWgQDAAPZsPgE9HKVzhqVpwEATmU8BAAEcpXyCpXfAQBAlIAAAAAAAAMAA9S5JpY4cpZ0WpZgUpZLAQBP+CQCAsLCbQQEAARql0MAAVoIAwAD2bD4BPRyl74al5cBAE5lPAQABHKXzLsAAV6EBAAEWpheApg7AQA/+vpjAAFaFAMAAhEgAwAD1LkmmLxymPhamORSmM8BAE/4JAICwsJtBAQABGqZxwABWgwDAAPZsPgJAIRymoxammICmj8BAD/6+mcAAVoZBAQABKwDAAPXSpo+mqgA9HKa/hqa1wEATmU8BAAEcpsMuwABXoQEAARam54Cm3sBAD/6+mcAAVoYAwACESADAAPUuSacCHKcRFqcMFKcGwEAT/gkAgLCwm0EBAAEap0TAAFaEAMAA9mw+AT0cp2aGp1zAQBOZTwEAARyndoOnasBAEeQgAAAAAAAAwAD1Lj4BPR6nkqvfAgACFKebwEAT/gkAJKftBSfAAFfCFqfVFKfPwEAT/gkAgLCwmyfAAEXrhafhwEATfCeBMQA9j6f+wEATthyoEoen/sBAE7ZdAQABlADAAPWeAL8CSagiIiIiHKgxhagnwEATfEEBAAEaqFrAAFZ9AMAA9mwAIRyokIeoe8BAE7ZBAQABlgDAAPWcASIcqKyFqKLAQBN8QQEAARqo1cAAVn4AwAD2bAAhHKkKh6j1wEATtkEBAAGXAMAA9ZwBIhypJoWpHMBAE3xBAQABGqlfwABWfwDAAPZsACEcqZaHqYHAQBO2QQEAAZQAwAD1nD4BPR6ppavfAgAChKmuwEATViSp/wMnwABXw4Wp1sBAE3wnwABXxAA/SaoNHKoaFqoRLsAAQ8vAAIQ4wACEQ8AAQ6MBAAGEqjLAQBNWAMAAY08+AT0cql6GqknAQBOZTwEAARyqYi7AAFe7wACEOAIAAoCqeMBAD/4WqpAWqouAqoLAQA/+ghfAAFeGkkTAAFhgAMAAhFIAwAD1Lj9Oqr2qyQAAmFBgwACKlwEcqtQWqssuwABE8cAAhDjAAIRMwABXvAEAAYSq5sBAE1YAwACVzk6rCqsQAACAimDAAIqXAR+rFsAAiyUCAAIUqyDAQBelCACGqy3AQBOZAEqrPQEUq0TAQBfaCQAGwACEXYGHq1KrZ6vGAADAAFfFAAAAAQOreKvGAAAAAQEBq4gAAAClvmCw1AAAYMAAi7EBPgFKq5YBJquWARyrpharnS7AAETxwACEOMAAhEyvRAEAAYCru8BAGDIAwACVzGDAAIuxBsAAhF6Bh6vLq+iuJgAAnbABGqvMwADuSwAAAQOr8a4mAAAAAgECrAQAAAiEH2DAAFePAKwPAAAogKhgwAD1ggErAGDAAIqXAT4ETqwirCcAAIIXYMAAWDYBFqxCFqwygKwpwEAYnqrnwABXkat1wABYOE+sUqxjAAABm49hAWDAAFiJYMAAipcAA6xtrV0AAAABAQGsfwAAAMAAV8ZgwABYiQAAYMAAipcBPgJOrKOsrAAAkktgwABYiQGErK7AQBkMPTCsvx6sxavfAgACGqzZq/AkAAYnwABXx4WtF8BAGSUngvsnwABXyBytR4CtPsBAGJ6hygAAAADAAFeaJ4L7AE6tda15AADAAFfJYMAAipcBHK2PFq2DLq79wACEOMAAhESvUgMAAxatpS7AAETxwACEOMAAhEyCra/AQBjDg621wEAY7QDAAGPMSq3HAR+t0sAAix0CAAIcreYuwABXxQEAARauCBat+C6rc8AAhDjAAIRBqWGtNgDAAIRdMa4cYMAAipcBhK4dwEAZewAGwACEX4GHriuuSK71AACwIAEarizAAO5LAAABA65YrvUAAAACAQKucgAACIQfYMAAV9IArn0AACiAqGDAAPWCASsAYMAAipcBPgJOrpOupAAAryJgsK0BFq6vgK6mwEAaL5k8wABX1EquuAEcrsUWrr8uwABXoMAAhDjAAIRGwABXygEAAYKu4MBAGlQAwACVswbAAIRggYeu+q8XsQMAAL7aARqu+8AA7ksAAAEDryWxAwAAAAIBAq89AAAIhB9gwABX4gCvSAAAKICoYMAA9YIBKwBgwACKlwE+AUevUhavY4CvWsBAGsG/DcAAV+UDAq+RGq+Rtn2vxRqvxbZ+AD4BSq/aAR+v5cAAjB8BAAEng80AArAgGrAgtn+wWRqwWbaAAD4BSrBnASawZwEWsHeAsG7AQBrBovfAAFfkYMAAipcAAT4BPTCwlx6wnavfAgACGrCmq/AksPgCJ8AAV8sWsPKAsOnAQBrBghzAAFfpAAbAAIRhgYexCLEltPEAALQiARqxCcAA7ksAAAEDsTW08QAAAAIBArFPAAAIhB9gwABX8wCxWgAAKICoYMAA9YIBKwBgwACKlwE+B06xcLF4AACTDWCwrQEWsYgWsYOAsXrAQBuighfAAFeGkw3AAFhfSbGVHLGhgrGZwEAbx0EBAAEWsbQWsaQuq3PAAIQ4wACEQamKrX4AwAD10j4DTrHeseIAAIO+YMAAV3MBJrHeARax+xax9Bax7YCx5MBAG6KUOsAAV/UpwAD1cYC2wAD1A2DAAFdzTrIQshYAAICKYMAA9l0BFrIcg7IYwEAcGpwrwABXdUqyLwEfsjrAAIrEAQABHLJSLsAAV8wBAAGEsmDAQBxTAMAAhGMAP06yhLKQAACYUGDAAIqXARyyoxaymi7AAETxwACEOMAAhEzAAFe8AQABFrLDFrK+gLK1wEAbooIXwABXhpMNwABYXwDAAJXOTrLosu8AAJQ6XcAA9R0BYMAAipcBMbMDYMAAipcAPRyzGRazCy6sWMAAhDjAAIRCsqoCAAKCsy7AQBvHNLM3A7M3tCQAAAADAgKzOAAAAICoYLCtALNHAAAAlERgsNEAAbNcAAAAsqtgwADyswErYMAA9YIBPgJJs2+Hs3PAQB1ASrN9AD9Js4shFrOzHLOfFrOQLq8BwACEOMAAhEWrqQEAASazrAGGs6zAQB00YMAAaG8AwABf3MAAQoHAAF/kPgE9HLPehLPXwEAc4E8BAAEcs+IuwABXoQEAARy0DBa0BoCz/cBAG6KUOsAAV/VEAQABhrQNwEAdNADAAPViAMAAhEgAwAD1Lj8AvwJJtCsctDgWtC8uwABDy8AAhDjAAIRDwABDowEAARa0Xha0WYC0UMBAG6KCF8AAV4aTDcAAWF8AwABjTz4BPRy0d4S0cMBAHOBPAQABHLR7LsAAV7vAAIQ4AgACgLSRwEAboha0qRa0pIC0m8BAG6KCF8AAV4aSRMAAWGAAwACEUgDAAPUuP0q0xAEftM/AAIslAgACg7TZwEAcmYS05sBAHOAABsAAhGKBh7T2tRO24wAAlUYBGrT3wADuSwAAAQO1JbbjAAAAAgECtUEAAAiEH2DAAFgEALVSAAAogKhgwAD1ggErAGDAAIqXAT4ETrVotWwAAJk8YLCtARy1hha1di6rc8AAhDjAAIRBqWgBAAEWtbMWtaWAtZzAQB62kkTAAFgGWsAA9UwArVVOtde13gAAlDpdwAD1HQFgwACKlwExtfJgwACKlwIctfouwABXoQEAARa2HoC2FcBAHraST8AAWAcAwACESBy2Ly7AAFe7wACEOAIAAoC2RcBAHrYWtliAtk/AQB62kkTAAFgGAMAAhFJOtoO2jwAAmFBgwACKlwEctpoWtpEuwABE8cAAhDjAAIRMwABXvAEAAYK2rMBAHtsAwACVzkq2tgEftsHAAIslAgAChLbLwEAfgoO22MBAHxkABsAAhGOBh7botu+3TAAAwABXzAAAAAEDtvy3TAAAAAEBAbcEAAAAwABXzWDAAPZdAABgwAD2XQE+AUq3GQEcty6AtyDAQB/1gqQCAAIatznAAIQ+JwAAwAD2fQbAAIRkgYe3UbdiuP0AAMAAV7kAAAABA7d3uP0AAAADAwO3jQAAAIQfYMAAVr0At6UAAACCF2DAAFhdALe8AAAAgIpgwACKlwAAYMAAipcBPgJJt8kiIiW30oG3zcBAIF1gwABYXQAhFrf0FLfvwEAgXQEBYMAAWF2qA8AAWGUAHLgTFrgKLsAAQ8vAAIQ4wACEQ8AAQ6MBAAEWuDAUuCvAQCBdAQFgwABYXZMNwABYXwDAAGNPPgFKuEIBH7hNwACLHQIAAhy4Yy7AAFfFAQABFriFFrh1LqtzwACEOMAAhEGpT60kAMAAhF0xuKRgwACKlwKCuKXAQCBqHLisLsAAV7vAAIQ4AgACgLjCwEAgUBa40RS4zMBAIF0BAWDAAFhdkkTAAFhgAMAAhFIAP0q47QGCuPTAQCBqBsAAhFKBh7kCuRO7gwAAwABXu8AAhDgAAAABA7kou4MAAAACAgK5PgAAAIQfYMAAVr0AuVcAAACSRF3AAPUdAWDAAFg2AABgwACKlwE+BE+5bLl9AAABm49hAWDAAFiJYMAAipcAA7mHuncAAAABAQG5mQAAAMAAV8ZgwABYiQAAYMAAipcBPgJOub25xgAAkktgwABYiQGDucjAQCHZPTC52R6536vfAgACGrnzq/AkAAYnwABXx4S6McBAIfIngvsnwABXyBy6YYC6WMBAIY6hygAAAADAAFbdJ4L7AE66lbqfAABUXcAA9R0BYMAAipcBMbqzYMAAipcARrq7uuS6yQAAAB9gwABYNgCButXAQCGbPgE9HLr2g7rswEAiSE8BAAEcuxEWuwUurv3AAIQ4wACERK9SAwADFrsnLsAARPHAAIQ4wACETIS7McBAImmCuzvAQCG6AMAAY8wAwAD1Lkq7UwEfu17AAIwtAQABg7t1wEAiSAAGwACEZYGHu4i7pbwqAAC+2wEau4nAAO5LAAABA7u4vCoAAAACAQK71QAACIQfYMAAWBQAu+YAACiAqGDAAPWCASsAYMAAipcBPgFKu/ABHLv3LsAAV6EBAAEWvBuAvBLAQCMIvxXAAFgWAMAAhEgAAEAELwBABHkAQATQAEAFLwBABZEAQAXrAEAGRQBACC4AQAn4AEALXgBADFsAQAzTAEAN6gBAD9cAQBgQAEAYdwBAGggAQBqaAEAbewBAHo8AQB/TAEAgLgBAIWgAQCLhAEAjUAAAABgAAAGBhwBAI7sAQAFZAEAjuQAAAAEAQCO7AAAAAADAAIRoAIGIAAAjgNoAAMAAygGC6gCA9gAAwAC31AABAQGdzIEcAABFAAEBAYHLgWEAAJ6+AACBegAArC4AAIGZAADAAGdHAAEBAq7Mrs2B4AAAnoMAAQEBn16CEQAAwABVL6jPAIJQAADAAFaOAACCcwAArJIAAQEBqX2CqgAAsJgAAILOAADAAHn7AACC7wAAwABYMQAAgxAAALHGAACDQQAAtcwAAINpAADAAF9cggIAg4cAAMAAYo4AAIO1AAC2WQAAg9oAAMAAatIAAIQMAADAAFOUAACENQAAwABrmAAAhFgAAMAAYzwAAISDAADAAJWZAACEsgAAwABnigABAQHAAEZuhOoAAMAAbyQAAIUMAADAAGVPAACFLQAAgOcAAIVHAADAAGn3AACFYAAAwABU/AABAQGoi4WdAAC+rQABAQGfqIXPAADAAF0gAAEBBKwuwABBDKwwrDKGLgAAwABAdQABAQGfrIZYAADAAKQvAACGdwAAuB4AAIaMAADAAKTbAAAAAAADAsAAhGmBiIavhr6HEwfAAFfOAAABYMAA9cUAAAABBcAAhG8AAAAABAAAAwAAAAAAAAAAAGDAAIRpAT8BCQEAwAD12wAAAAACBsAAhGuBiIbPhtqG8AEAgLAAAAABA4bfhvAAAAAAAAAAYMAA9l0BSobiASSG8AEWhuQuhQPAAPXZBsAAhG2BiIb0hvmHEQACsH4AAAABA4cDhxEAAAABAQGHCwAAAJ7VYLiIAABcAAAAQCWpAEAl4gBAJhAAAAACAsAAhHCBiIcWhxyUXAPAAFfPAAABYJ6EAAACBMAAhHKBiIdih2kJn7wAYLaFAATAAIRzgYiHjYelCb4GAGC14wABBcAAhHyBiIeqh6qIQQAAAAOHvohBAAAAAgICh9EAAACfvGC2hQCH3wAABL4GYLXjAABgwACEcAE/AwgBwACEc4EAwEAmiQgAwACEcoCIEMBAJn4JAIghnqQBAAEWiDgWiC+AiCfAQCZ+gh62jJNPnuwABQbAAIR1gYiIRohdiHkBAICwARqIR8AA7ksAAAEDiGKIeQAAAAAAAABgwAD2XQFKiGUBJ8AAV9AGwACEd4GIiH6IhYvPAADAAFfRAAAAAQOInIvPAAAABAQEiKIAAACwXmDAAPKzAIjEAAAAkw1gsNQAiOYAAACe8F3AAPUdAWDAAIt2AIj7AAAAkkxgwACJhQAAYMAAi5UBPgJPiQeJDgAAAaf1YQFgwACLpWDAAIuVAAOJFIoYAAAAAQEBiSYAAAC11GDAAIulAABgwACLlQE+AUqJPQEmiT0BHImKH4lIwACLpAMAAoKJT8BAJ0eDiVvAQCdaAbXUhYlwwEAnkq8xAQABHIn4HInIFomgLr4GwACEc66CAQABgYngwEAnPAC15a6HAQABgYoJwEAnPAC17QDAAIluYMAAi5VJih+AiiPAQCcvPgFKij4BHIpLhIpFwEAncyABAAEjFopgFopUgYpMwEAnPJT1sNiVv7DhIxaKiRaKfYGKdcBAJzyU9bDYrBew4iCKqsAAi68AAAAAIIrdwACLrgAAAAABYMAAi6UjFosYFosMgYsEwEAnPJT1sNisF7DiIIs5wACLsAAAAAAgi2vAAIutAAAAAAFgwACLpQFgwACLpQAAPgFKi5kBHIumhIugwEAncyABAAEgi63AAIutAAAAAAAABsAAhHiBiIvUi+KM4gAAvggAAAABA4vujOIAAAADAwOMBgAAAKAlYMAAZ4UAjBMAAACe1WC4iACMJwAAAJ/hYMAAQHkAAGDAAIqXAT4BSYw6FoxLFoxDgIw+wEAo85MNrIGEQrDGPgFKjFwBHIxjLsAAV9IDAAOAjHvAQCjzgYyBwEApAIKMiMBAKQsAwACEeT4BSoypARyMsC7AAFfTAwADgIy/wEAo84GMxcBAKQCCjMzAQCkLAMAAhHoGwACEeYGIjOeM9ZCZAADAAFfSAAAAAQONDJCZAAAAAwMDjSQAAACgJWDAAGeFAI0xAAAAntVguIgAjUUAAACf4WDAAEB5AABgwACKlwE+AUqNWAEcjV8uk40BAWDAAIqXATSNZwONZ5CUAAAAAAAAAGDAAIqXAT4FPRyNgRaNehaNci6fvMAAhHKvCramwABH0wIAAievLIGNl8BAKb4AwABqCE6Nt43JAACgYWC10AEcjiAcje8WjcsuvgbAAIRzroIBAAEWjgyAjgfAQCmxkw2sgQC15a6HAQABFo42gI4xwEApsZMNrIEAte1OjleOXwAAryxgwACEfQEfjmXAAIVfDQANLhaOohaOmRaOkS6fvMAAhHKCHraMb57QFo69Fo61Lp+8wACEcquyto4mjtgBFo7YFo7QLp+8wACEcq8rtrpgwABlgRaPARaO+S6fvMAAhHKvHra3Fo8nFo8fLp+8wACEcq8TtrIWj1EWj0kun7zAAIRyrxq2tRaPdRaPbS6fvMAAhHKvHLa2Fo+TFo+LLp+8wACEcq8MtqoWj6wWj6Qun7zAAIRyrwe2pRaPzxaPxy6fvMAAhHKvCramgo/hwEApyYCP+MBAKbEAPRyQDYSQBcBAKn2wfgEAAYGQGMBAKb4AwACEuUqQJgEmkCYBHJBlH5AxwACLpAIAAhaQQISQOMBAKn2e8MAAhJYWkFSEkEzAQCp9kkzAAISjAK8xAQABg5B7wEAqNADAAIluYMAAipcAnpYGwACEeoGIkJ6QrJRaAADAAFfTAAAAAQOQupRaAAAAAwMDkNIAAACgJWDAAGeFAJDfAAAAntVguIgAkPMAAACf4WDAAEB5AABgwACKlwE+AUqRBgEckQ0uk40BAWDAAIqXATSRFQORFZRVAAAAAAAAAGDAAIuVAT4GTpEvkTcAAJMNYLDUASaRLwEWkT6AkTnAQCvrkw2sgWCw1EmRTSEckWUWkVmDkVHAQCxDlPWw2EEBAAEakXSw3QDAAPXSPgE9HJGSFpGJgJGEwEAr668ywABnh8AARj0BAAEWka6DkabAQCxDlPWw2ADAAGeBP06R25HjAACvLGDAAIR9AR+R6cAAhV8NAA0uFpImFpIdFpIVLp+8wACEcoIetoxvntAWkkEWkjkun7zAAIRyq7K2jiaSXAEWklwWklQun7zAAIRyryu2umDAAGWBFpKFFpJ9Lp+8wACEcq8etrcWkqsWkqMun7zAAIRyrxO2shaS1RaSzS6fvMAAhHKvGra1FpL5FpLxLp+8wACEcq8ctrYWkxcWkw8un7zAAIRyrwy2qhaTMBaTKC6fvMAAhHKvB7alFpNTFpNLLp+8wACEcq8KtqaCk2XAQCwDgJN8wEAr6wA9HJORhJOJwEAsubB+AQABgZOcwEAr+ADAAIS5PRyTuRaTshaTqi6fvMAAhHKvCramwABH0wIAAievLIGTz8BAK/gAwABqCEqT3QEck+QuwABX0QQABBaUAoGT/MBAK/iwXriOJpQaARaUGoCUFcBAK+uTDayBYLDUFpQ1hJQtwEAsuZ7wwACElhaUSYSUQcBALLmSTMAAhKMAwACEdwCelgAAQCbWAEAnDQBAKNMAQCmPAEAryQBALjsAAAAFAsAAhH2BiJRflGXAAd9bA8AASGcAAAFgwAD1xQACXbgfAVtgvfsiBMAAhH+BiJbzlwUGwABX1ABgwAD0eQGTBMAAhICBiJcaly0GwABX1QBgwAD0eQGUBMAAhIGBiJdCl1YGwABX1gBgwAD0eQGVBMAAhIKBiJfzmBEYwABX1wBgwADyswEqBMAAhISBiJgpmDUJwABX2MAAhGgAYJ6EAATAAISFgYiYT5hXCaxVwACEaABggP8ABMAAhIaBiJhxmHkJwABE8cAAhGgAYMAAlZoABMAAhIeBiJiZmKgJwABIqsAAhGgAYMAAZYEABMAAhIiBiJjFmNgJrwbAAIRoAGDAAGsAAATAAISJgYiY+ZkQCa8EwACEaABgwABi2AAEwACEioGImTSZRQmu/MAAhGgAYMAAY74ABMAAhIuBiJljmW4Jrv3AAIRoAGDAAGPGAATAAISMgYiZfpmECa75wACEaABgwABrmQAEwACEjYGImZ6ZrgnAAFfZwACEaABgtt0ABMAAhI6BiJm/mcYJwABX2sAAhGgAYMAAaf0ABMAAhI+BiJndmekJrTnAAIRoAGDAAEB5AATAAISQgYiaA5oICcAAV9vAAIRoAGDAAGeFAATAAISRgYiaJZo2CcAAV9wAXcAA9g4BYLlkAATAAISSgYiaUppmCcAAV90AXcAA9g4BYLlkAATAAISTgYiagJqLCcAAV94AXcAA9g4BYMAAegUABMAAhJSBiJqqmrgJwABX3wBdwAD2DgFgwAB5/AAEwACElYGImtKa6AnAAFfgAF3AAPYOAWDAAHoFAATAAISWgYibBZsPCZ7wAF3AAPUdAWDAAIt2AATAAISXgYibHZstGMAAV+EAYMAAiYUABMAAhJiBiJtum30YwABX4gBdwAD1HQFgwACKlwAEwACEmYGIm5CboRjAAFfjAF3AAPUdAWDAAImFAATAAISagYicKpw3GMAAV+QAYMAApS8BKwTAAISbgYic/J0eGMAAV+UAYMAA8rMBKgTAAIScgYieNJ5RCcAAV+YAXcAA9g4BYMAA9l0ABMAAhJ2BiJ6vnr0JwABX5wBdwAD2DgFgwAD2XQAEwACEnoGInsme1RjAAFfoAGC4iAErBMAAhJ+BiJ9Qn2cYwABX6QBgvdYBKwTAAISggYif05/bGLJeAGC5EAErBMAAhKGBiKA8oEYYwABX6gBdwAC8cwFguS0BKwEFwACFX4GIoEugS6PtAAAAA6Bbo+0AAAAODQ2gaAAABMAAV9hgnoQAoIEAAASsVWCA/wCglgAABMAARPFgwACVmgCgqwAABMAASKpgwABlgQCgxwAABK8GYMAAawAAoOcAAASvBGDAAGLYAKELAAAErvxgwABjvgChKQAABK79YMAAY8YAoUEAAASu+WDAAGuZAKFUAAAEwABX2WC23QChcQAABMAAV9pgwABp/QChhQAABK05YMAAQHkAoZ4AAATAAFfbYMAAZ4UAAaG+AAAAoGFgtdABK2DAAIR9AT8ZCAHAAISEgADAQDIFCAHAAISFgQDAQDISCAHAAISGggDAQDIdCAHAAISHgwDAQDIsCAHAAISIhADAQDI7CAHAAISJhQDAQDJICAHAAISKhgDAQDJVCAHAAISLhwDAQDJiCAHAAISMFADAQDJvCAAIAcAAhI0UAMBAMnwJAAgBwACEjhQAwEAyiQoACAHAAISPFADAQDKYCwAIAcAAhJAUAMBAMqUMAAgAwACEnR6h78AAux8AAWDAAPZdAAAIAMAAhJweoirAALsfAAFgwAD2XQAACADAAISXH6JYwACJkQAAAAAIAMAAhJYxoo1gwACLdgAIAMAAhJgxorpgwACKlwAIAMAAhJkxouRgwACJhQAIAMAAhJEeowjAALsfAAFguWQAAAgAwACEkh6jQMAAux8AAWC5ZAAACADAAISTHqNvwAC7HwABYMAAegUAAAgAwACElB6jn8AAux8AAWDAAHn8AAAIAMAAhJUeo9zAALsfAAFgwAB6BQAACQGgS8AA9dsAAAAAgLgGwACEo4GImzGbPptWAQCSTAAAAAEDm0ObVgAAAAAAAABgwACJhQFKm0YBFptGLsAAV+HAAISXBsAAhKWBiKPypAakIQEAwABX68AAhGgAAAABA6QQpCEAAAAAAAAAYMAAZ2wBSqQTARakGRakEy7AAFfbwACEaMAAhJCvMsAAZ4cGwACEpoGIpCakOqRoAQCrc8AAhGgAAAABA6RKpGgAAAAAAAAAYK1qAUqkTQEWpFoWpE0urTnAAIRowACEj6q1wABAgQbAAISngYikbaR8pKIBAMAAQ2PAAIRoAAAAAQOkiKSiAAAAAAAAAGDAAFOmAUqkiwEWpJgWpIsurTnAAIRowACEj68owABAfQbAAISogYikp6S7pOsBAMAAQ3PAAIRoAAAAAQOkzKTrAAAAAAAAAGDAAGKPAUqkzwEWpNwWpM8urTnAAIRowACEj686wABAfgbAAISpgYik8KUIpUYBAMAAUJDAAIRoAAAAAQOlHaVGAAAAAAAAAGCx5AFKpSYBFqUzFqUmLq05wACEaMAAhI+phsAAQIIGwACEq4GIpUulUKW2AADAAFfsAAAAAQOlY6W2AAAAAQEBpXEAAACwW2C5ZAAAYMAA8rMBPgFKpYQBHKWdFqWLLsAAV9zAAISRgtABAAGApabAQDYOAMAA9hoGwACErIGIpbulwKdHAADAAFftAAAAAQOlz6dHAAAAAgICpd0AAACwW2C5ZACl9AAAAMAAV+5dwAD2DgFgvGoAAGDAAPKzAT4CRqYCpjCmFAAAALC+YLlkABamKICmHMBANmiwmblrPgFJpjglpkGCpjzAQDaUYLxqPgFJplQhHKZggaZZwEA2c4LQAQABFKZpwEA2lAIBYLxqAMAA9ho+Aj0cpoOBpnzAQDZzTwEAARSmh8BANpQCAWC8agDAAPYbSaaYHKacLsAAV+0CAAIUpqzAQDaUAgFgvGqBprLAQDZzAMAAhKxKprsBKT8/SabfIiElpuiCpuPAQDaUYLvdACElpvyCpvfAQDaUYLuSPgFKpxgBKT9KpzcBKgbAAIStgYin+qf+roQAAMAAV+8AAAABA6gGroQAAAABAQGoFAAAALBbYLlkAABgwAD0eQE+CU6oMag1AALAAFfwYMAA9HkBNyBPqD+oQwAAAYQfYQFguWRgwAD0eQADqEupNAAAAAEBAahZAAAAsFtguWQAAGDAAPR5AT4CSahuIiWofoOocsBAN8tgvDMAHKiaFKiOwEA3ywMBYLwzsRoAAAAAvD0+Ak6oyqjTAACEH2DAAFcWASaoygEWqOEUqNXAQDfLAwFgvDOEH7w1YMAAVxZKqPMBHKkMFqkDhKj6wEA4C6TRwABXGKTBAAAAAMAA8q0/SqkjAStJqTscqUuAqT/AQDeEsRoAAAAAudo+BE6pbKlyAACAimDAAPR5ARypfIKpdMBAN64gAQABgKl9wEA3hAAASamRHKmbg6mVwEA4dFwBAAGTAMAA9aZKqaABgamnwEA3mT9JqbIcqbyDqbbAQDh0gIsBAAEcqckcqcKUg4IBAAE3HwDAAPSVgUEBAAGUAMAA9Z8AwAD1qEqpzwGBqdbAQDeZP0qp4QEWqe6DqejAQDh0wABC88AA9K8/SaoDJaoTgKoHwEA3hGC7sD4BSqonAR6qLsAAyhsCAWDAAPR5AhyqNy7AAFfvAQABFqpMFKpAwEA3hAABYLuwlUu7RwDAAIStHKpTLsAAV+8BAAEWqmgUqlzAQDeEAAFgu7CVTLtIAMAAhK0AP0mqeyIlqouAqn/AQDeEYLunASWqpICqmMBAN4Rgu7k+BE6qxarLAADAAFfxYLuSASaqxQGAqs3AQDeEYLuSTqrkqu4AAMAAV/JgwAD0eQEcqvAuwABX7wEAARaq/4Oq+cBAOaOVS7tHAMAAhK1JqwwcqxqEqxDAQDnAQQEAAYGrHcBAN5kAwAD1nEqrIgGBqynAQDeZP0qrNAEeqzvAAMocAgFgwAD0eQKEq0TAQDnAHKtPLsAAV+8BAAEWq16Dq1jAQDmjlUy7SADAAIStAD9Jq3Elq4GAq3XAQDeEYLuVPgVOq5yrpwAAwABX82DAAPR5ARyrsYKrqcBAN64gAQABFqu+FKuywEA3hAABYLuVlUy7SAAASavMIiIcq9uDq9DAQDpkQQEAASsAwAD1nAEcq/GDq+bAQDpkXAEAAZMAwAD1pgEcrAODq/jAQDpkgIsBAAE3HwDAAPWoSqwJAYGsEMBAN5k/TqwfrCkAAMAAV/JgwAD0eQEcrCsuwABX7wEAARasQBSsNMBAN4QAAWC7lZVLu0cAwACErU6sUaxXAACBRGDAAPR5ARysY4SsWcBAOuldAQABg6xlwEA6ZADAAPWeSqx3AR6sfsAAyhsCAWDAAPR5AoWsh8BAOx2BrI7AQDeZAD9JrJ4lrK6ArKLAQDeEYLuePgVOrMqs1QAAwABX82DAAPR5ARys34Ks18BAN64gAQABFqzsFKzgwEA3hAABYLuelUy7SAAASaz6IiIcrQmDrP7AQDt7QQEAASsAwAD1nAEcrR+DrRTAQDt7XAEAAZMAwAD1pgEcrTGDrSbAQDt7gIsBAAE3HwDAAPWoSq03AYGtPsBAN5k/Tq1NrVcAAMAAV/JgwAD0eQEcrVkuwABX7wEAARatbhStYsBAN4QAAWC7npVLu0cAwACErUmtexytiYStf8BAPACBSAEAAYGtjMBAN5kAwAD1qUqtkQGBrZjAQDeZP0qtowEerarAAMocAgFgwAD0eQIcrb2ErbPAQDwAgUEBAAGDrb/AQDt7AMAA9Z+TAD9JrdklremArd3AQDeEYLtSPgFKrfoBHq4BwADKGwIBYMAA9HkCJq4XARyuF5RdAQABHq4ZwADKHAIBYMAA9Y8CHK4iLsAAV+8BAAEWrjcUrivAQDeEAAFgu1KVS7tHAMAAhK0crj4uwABX7wEAARauUxSuR8BAN4QAAWC7UpVMu0gAwACErQAAwAD1nmDAAPR5ga5mwEA3mQA/Sq52AYGufcBAN5kGwACEroGIromujrAYAADAAFf0AAAAAQOupLAYAAAAAQEBrrIAAACwW2C5ZAAAYMAA8rMBPgNJrsUWrvQcrtWArsnAQD1VrOEBAAEWrt4uwABQkMAAhGjAAISpALm4q6Sxzz4BSq8OASo/Sa8mHK9AHK8qLsAAV+8BAAGArzPAQD1VAMAAhK2BSgEAATcfAMAA9adKr0cBKj9Kr+ABHK/nLsAAV+0CAAKAr/fAQD1VHrAIwAC7HwABYLxqAAAAwACErAbAAISvgYiwh7CMsQsAAMAAV/UAAAABA7CZsQsAAAABAQGwpwAAAJJQYMAAiYAAAFwBPgJAFrDPFrC/LsAAV+LAAISYgPzAAPT/sL+w1gA9HLD5FrDuFrDdLsAAV+HAAISXlaXAAImHTwEAAYCw/cBAPhcAwAD1LgbAAISwgYixELEVsX4AAMAAV/YAAAABA7ErsX4AAAABAQGxOQAAAJJQYMAAiYAAAFwBPgE9HLFmFrFbFrFKLsAAV+HAAISXlaXAAImHnZYCAAKTgLFwwEA+jwDAAPU3BsAAhLGBiLHuse6yvwAAwABX9wAAAAEDsgeyvwAAAAICArIdAAAAkkdgwACKlwCyOwAAAKBhYLXQAABbAT4BPRyyVC7AAFf1AQABJrKSARyykh+yZsAAiZ0BAAGAsn3AQD7uAK8xAQABgbKowEA++wDAAIluYMAAiYAAwACErwbAAISygYizL7Mvs3cAAK7BAAAAAQOzM7N3AAAAAQEBs0IAAACSR2DAAIqXAABbAT4BPRyzZBazVC7AAFfiwACEmE8BAAGAs2jAQD9rAMAA9S4GwACEs4GIs3yzirO9AACuwgAAAAEDs42zvQAAAAAAAABgwACKlwE+AUqzlgEcs60Ws50uwABX4sAAhJiVpgAAAADAAPU8BsAAhLSBiLPCs8e5BQAAwABX+AAAAAEDs9i5BQAAAAEBAbPgAAAAntVguIgAAFwBPg5Ps+2z8gAAAcAAV/leAAECAWDAAIRpAcAAR9NgwADyswBcAAOz+rUSAAAAAgEBtAgAAACfx2DAAIRpAAG0FQAAAMAAR9NgwADyswEpXAE+Az0ctD4WtDEuwABX2MAAhGjAAISEk2MCAVwCFrRTgrRNwEBAQ4CwwACEazS0WQO0WbR2AAAAAAAAAFwBSrRfARy0ZYK0X8BAQEOwfgEAAYC0cMBAQAUAwACEbQCen0m0f4O0g8BAQFE+AT0ctKEWtJkuwABX2sAAhGjAAISOwABH0wIAAha0soK0rMBAQEOAsMAAhGuAtLjAQEAFAMAAagg/QBy024C01cBAQAWusAAAAAC4qLTVtOQBJLULAifAAFf6FrUFgrT/wEBAQ4CwwACEaz0ctSGBtRnAQEAYIAEAAR+1L8AApFEDAAMWtUcurFXAAIRowACEhRa1US6tOcAAhGjAAISPFrVfLsAAQ3PAAIRowACEqAAAAD0ctX+BtXfAQEAYIAEAAR+1hMAApF8AAAAAAAA9HLWogbWgwEBAGCABAAEfta3AAKRwAQABFrXELqxVwACEaMAAhIUAAAA9HLXcgbXUwEBAGCABAAEfteHAAKSIAgACFrX3LqxVwACEaMAAhIUWtgEurTnAAIRowACEjwAAAD0cth2BthXAQEAYIAEAAR+2IsAApKoDAAMWtkAuwABQkMAAhGjAAISpFrZWLsAAV9zAAISRFrZpLsAAV9nAAIRowACEjQAAAD0ctomBtoHAQEAYIAEAAR+2jsAApL0CAAIWtqEuwABX3MAAhJEWtrQuwABX3cAAhJIAAAA9HLbYgbbQwEBAGCABAAEftt3AAKTVAQABFrb1LqxVwACEaMAAhIUAAABOtx23LQAAwABX+2DAAKUKAR+3O8AApRoCAAIWt1IuwABX3MAAhJEWt2UuwABX3cAAhJIAPRy3iIG3gMBAQBggAgABgreJwEBCpAHAAEfTKgBOt8e30QAAwABX/GDAAKVaAR+318AApWsEAAQWt/UurvnAAIRowACEjBa4FYK4BcBAQqTAAFf9wAClDxa4P4K4L8BAQqTAAFf+wAClEBa4Vi7AAFfcwACEkQA9HLh2gbhuwEBAGCACAAGDuHfAQEL1AcAAR9MqAD0XuJouwABX5Ba4tIO4qsBAQvWPAMAApWHAAISaPRe4vy7AAFflHLj+FrjsFrjmg7jcwEBC9Y8AwAClYZeNwAClPoCLAQABlADAAPWowACEmwbAAIS1gYi5CrkPwABAfwAAwABX/wAAAAEDuTDAAEB/AAAAAQEBuUMAAACgYWC10AAAXAE+CUm56xa6DRa57y7AAFfmwACEnID8wAD0/0q6FgA/TrpDulAAAMAAR01dwAD1HQFgwACK9QExulJgwACK9QBOum26eAAAlaVdwAD1HQFgwACJgAEWuosWunouwABX4cAAhJeVpcAAiYdOup+6rQAAwABYAGDAAPR5AZNBQ7q3HLrMg7q+wEBEWlwBAAEWutmCus7AQEQwWsAA9UwAwAD1pkE+BEm66Ra7Cxa67S7AAFfmwACEnID8wAD0/0K7FAA/TrsuuzgAAJJQYMAAiYABHLtEgrs6wEBEMEQBAAGDu0XAQERaAMAA9SxJu1slu2mEu1/AQESyYMAAiZI+Ak67nLunAACSR2DAAIqXARa7sxS7qcBARLIEAWDAAImSkkfAAImUSbvHIiW71oW7y8BARO9gwACK4wAhFrv2FLvrwEBE7wUBYMAAiuOmhsAAiuo+Ak68HLwhAACVS2DAAIqXARa8LhS8I8BARO8FAWDAAIrjwABG5cAAiuVJvEYlvE+GvErAQEVDYMAAi1U+A068fbyCAACAsGDAAPZdARa8iRS8hMBARUMGAWDAAItVgLDAAItXTrypvK8AAICKYMAAipcBFry8FLyxwEBE7wUBYMAAiuOAisAAiudJvM8iHLzTLsAAWAHAAIRoAQABFLzmwEBFpQgAAMAAhLcAHL0eFr0ALsAAV+bAAISck+ABAAGHvSXAQEV/AMAA9h0+BE69QL1PAADAAEdMYMAAiWABHL3CH71VwACK/gIAAh+9isAAi3UBAAGHvaHAQEV/ABS9qMBARaUIAACvMQEAARa94xS92MBARO8FAWDAAIrjoGHAAIllAMAAiW49HL4Sgb4FwEBEEE8BAAEmvhYBFL4WwEBGDwkAYMAAivUAwAD1Lj2LvjfAQERaHL41g743wEBEWl0BAAGUAMAA9Z5CvlQBPz8/P0K+kABOvsK+0AAAwABYAl3AAPUdAWDAAIr1ATG+0mDAAIr1AEa+2r8NvuYAAACAsGDAAPZdABa+7i7AAFfmwACEnD4BPRy/I4S/FcBARrhPAQABH78rwACK/gIAAh+/VMAAi3UBAAGFv2vAQEbcACsAAMAA9S5Ov4i/mAAAwABYA2DAAIlgARy/7B+/psAAitQBAAEcv8+Ev8HAQEa4XQEAAYG/0cBARBAAwAD1PwCvMQEAAYDAAEACwEBD4gDAAIluPRzAAEAlgsAAQBrAQEQwvIIDAAOTg8AAQD7AQERaMcAAQE1gwACJgAEfwABAUsAAiZ0BAAEmwABAaQGFwABAacBARypgwACKlwAAwAD1RQbAAIS3gYjAAEE5wABBPsAAQWwAAMAAWAHAAIRoAAAAAQPAAEFQwABBbAAAAAEBAcAAQV8AAACDsmDAAIqXAABgwADyswFKwABBaAEpBsAAhLmBiMAAQXHAAEFxwABCQAAAsH4AAAABA8AAQXvAAEJAAAAAAQEBwABBgwAAAJ7VYLiIAABbAT4EPRzAAEGQLsAAV/gBAAGAwABBosBASDsAwACEtD0XwABBri7AAFfogMAAQb3AQEg7wACEnj0cwABByC7AAFgEAQABH8AAQdq5FwIAAhbAAEHpgMAAQePAQEg7hLq4ixbAAEH2gMAAQfDAQEg7BriMAADAAIS6PRzAAEICLsAAV/8BAAEWwABCKoDAAEIkwEBIO6BhuJUAwACEtQbAAIS6gYjAAEJFwABCSsAAQ3AAAMAAWAQAAAABA8AAQlfAAENwAAAAAQEBwABCYQAAAMAAWAVguRAAAFwBPgdOwABCfcAAQokAAMAAWAZguRABFsAAQosusl7AAISgTsAAQqzAAEK6AADAAFgHXcAAvHMBYLktARbAAEK8LsAAV+rAAIShPRfAAELMLrJegMAAQtfAQEkTwACEoD0XwABC6C7AAFfqH8AAQvnAAL0fAAFguS0AAMAAhKE9HMAAQxMuwABYCAEAARbAAEMqFsAAQyEusl7AAISgY7kSAMAAhNs9F8AAQzYuwABX6oLAAENDwEBJR8AAhKE9F8AAQ1Yusl6BwABDYcBASSjAAISgBsAAhLuBiMAARUPAAEVHwABN5AAApyIAAAABA8AARVXAAE3kAAAAAQEBwABFbQAAAID7YL3jAABgwAD0eQE+B0AlwABGk4DAAEaOwEBKIWC+CMAARo7AAEa0AE7AAEbawABG6QAAwABN1WC+CAEmwABG2gGAwABG68BASiFgvghOwABG/sAARwUAAMAAWAlguRABFsAARxaBwABHB8BASlOyYL4KTsAASIHAAEiIAACBEGDAAPR5ARrAAEiKwACEgU7AAEiswABItwAAwABYCmC5LQEWwABIwILAAEi5wEBKeGO5EkTAAEjLPgNOwABI48AASOsAAFdguWQBFsAASPiEwABI7cBASrmC0rkfQ8AASQUhHMAASRSFwABJDMBASuRBAQABFsAASSKEwABJF8BASrmBebkgAMAA9dI+A0nAAElQHMAASVyFwABJVMBASuSxAgAAAAC5pz4BSsAASXkBGsAASYDAAIR/P0nAAEoOIhbAAEohFsAAShqFwABKEsBASuSwmblrgPzAAPT/ASXAAEo0hcAASizAQErkYLrZPgE9i8AASk7AQEqdGsAASlfAAISAPz2NwABKesBASuQWwABKjIXAAEqEwEBK5INmuW5JwABKoCXAAEqshcAASqTAQErkYLvsPgE9jMAASsDAQEq5HMAASuIWwABK2ITAAErNwEBKubCjuTpEAQABkwDAAPUsScAASvQlwABLAIXAAEr4wEBK5GC6MT4BScAASyEcwABLNxbAAEslLsAAV9zAAISRgtABAAEUwABLQMBASuQFAWC6MQDAAPYaPgE9jMAATF7AQEq5HMAATIAWwABMdoTAAExrwEBKubCjuTpEAQABkwDAAPUsPgFKwABM7wEjHsAATPbAAO5eAgAChMAATQDAQEq5FsAATROCwABNDMBASniCE7kTAIPAAE0awEBKnRrAAE0jwACEfwFgwAD0eT4BSsAATYUBGsAATYzAAIR/HMAATbiCwABNscBASniC0AEAAYTAAE3BwEBKuQC5FUrAAE3TAYPAAE3awEBKnQbAAIS8gYjAAE3pwABN7sAATlsAAMAAWAsAAAABA8AATfzAAE5bAAAAAQEBwABOFAAAAID7YL3jAABgwADyswE+AUrAAE4gASEewABOKMAA7l4CAAIcwABOMi6nIgEAAYDAAE5BwEBNNgDAAIS7GsAATkjAAIR/AAbAAIS9gYjAAE5gwABOZcAAT2UAAMAAWAwAAAABA8AATnLAAE9lAAAAAQEBwABOigAAAID7YL3jAABgwADyswE+A07AAE61wABOuwAAntVgvggBJsAATrUBgMAATr3AQE2uYL4ITsAATtXAAE7cAADAAFgJYLkYARbAAE7kgcAATt7AQE3FsmC+CkrAAE73ASIhHsAATv/AAO5eAgACHMAATwkupyIBAAGAwABPGMBATa4AwACEuxrAAE8fwACEfwAAJcAAT0sWwABPRhbAAE9CgsAATzvAQE3oghO5E4F5uSBgujEGwACEvoGIwABQPsAAUEPAAFEyAADAAFgNAAAAAQPAAFBVwABRMgAAAAEBAcAAUGgAAACZbmC91gAAXAE+AUnAAFB1JcAAUH+AwABQecBATpNgvd4+AT0cwABQpxTAAFChwEBOkwABYL3elA4BAAEuAL3gPgJOwABQ58AAUPIAAJJHYL4IASbAAFDnAYDAAFD0wEBOk2C+CD0cwABRAS7AAFgEAQABFsAAURqBwABRD8BATt2yYL4KAMAAhLoGwACEv4GIwABRN8AAUUDAAFJKAADAAFgOAAAAAQPAAFFcwABSSgAAAAEBAcAAUW8AAACZbmC91gAAYMAAiYUBPgZOwABRhcAAUYwAAIEQYMAAiYUBH8AAUZLAAImRAAAAAE7AAFGxwABRvgAAwABYD2DAAImFARbAAFHALsAAV+HAAISXPRfA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QIHcAMAAhMAArzEBAAEWwACjH4DAAKMawEBzlqBhvjoAwACJbmDAAIm5PgJJwACjTiIUwACjUsBAgpMKAAGGwACjY8BAgXc+Bj0cwACjmhbAAKOPFMAAo4TAQII5CQCVpcAAiYdPAQABH8AAo6LAAIn8AQABKwAAwAD1Lk7AAKPPwACj1wAAwABYNWDAAImAAR/AAKPdwACKCAEAASsATsAApAYAAADAAFg2YMAAiYAAScAApBwWwACkPhbAAKQzhcAApCDAQIEElaXAAImHgPzAAPT/PgE9FcAApFfAQIUIDRTAAKRiwECE5QwAPgI9HMAApKwWwACkoYXAAKSOwECBBJWlwACJh08BAAEUwACksMBAhOUMAADAAPUuPRXAAKTIwECFCA2FwACk08BAgQQ9HMAApREWwAClBofAAKUBwECB3JWlwACJh08BAAEfwAClGcAAibcDAAMUwAClH8BAg8oLABTAAKUswECCOQkAFMAApTjAQIUIDQAAAMAA9S49FcAApVDAQIPKCxzAAKVeLsAAWDMCAAIpFsAApXiAwAClc8BAc5agYb46AMAAhR8/PYvAAKWiwEB0ACbAAKWiARzAAKXmH8AApa3AAInwAgACHMAApbMuwABYEAEAAYfAAKXDwECB3ADAAITAFMAApcrAQIPKCwAArzEBAAEWwACmAYDAAKX8wEBzlqBhvjoAwACJbmDAAIm5PRfAAKYnLsAAV+GEwACmOsBAgOHAAISXQsAAplAAAAE+AT0ewACmbqvfAgACFsAApoGBwACmd8BAc62wkb3nJMAApscDJ8AAWDwWwACmwIDAAKa7wEBzloIcvjMngTEATsAApuHAAKboAACBEGDAAImAAYPAAKbqwEB0AEnAAKb0HMAApwIWwACm/YDAAKb4wEBzloIcvjNBAQABGsAApxu+MQDAAPWcPgJOwACnQMAAp1QAAMAAWD1gwAD2XQEcwACnZxbAAKdgLq75wACEaMAAhIzAAEpUAQABFsAAp4aAwACngcBAc5aB0744AMAAbCc9jMAAp5XAQIblH8AAp6LAAIp9AgAChcAAp7bAQIcvhMAAp8vAQIblAD89HMAAp94uwABX9QEAARzAAKfsLsAAWCECAAKEwACn+8BAhuUWwACoCIDAAKgDwEBzlpilvjkAwACEzgDAAISvSsAAqBYBKQbAAITYgYjAAKgqwACoO8AAshsAALJSARrAAKgrwADuSwAAAQPAAKhQwACyGwAAAAEBAcAAqGoAAADAAFg+YL4dAABgwADyswE+Dk7AAKiPwACooQAAwABYP12KIwFgsJkBIMAAqKmKUwABYLCZAABOwACox8AAqNQAAMAAWA9gwACJhQEWwACo1i7AAFfhwACEl07AAKj1wACo+gAAkkxgwACJhQEfwACpAMAAiZEAAAAATsAAqSPAAKkqAACBEGDAAImAAYPAAKkswECIez0XwACpNy7AAFfhg8AAqUrAQIh7wACEl0nAAKouFsAAqkOAwACqMsBAiBqyY74iPgZGwACqV8AAqo7AAKpsAAAAmHZgwAB5/AAWwACqhoDAAKp1wECIGpilviA+AUnAAKqYFsAAqqKFwACqnMBAiPC48MAAegI+BE7AAKrHwACq0QAAsb1gwAD2XQEcwACq2hbAAKrTLq75wACEaMAAhIzAAEpSAQABhcAAquzAQIjwAMAAbCY9jMAAqv7AQIibH8AAqwvAAIp9AgAChsAAqx/AQIkvhMAAqyrAQIibAD0cwACrTBbAAKs9LsAAV9/AAISUTwEAAYXAAKtQwECI8ADAAPYbPYnAAKtiwECIMxzAAKuIgcAAq3bAQIgzg6wBAAGFwACrkMBAiPAAijA/TsAArJLAAKyZAACB02DAAHoFARbAAKysgMAArJvAQIgagdO+IU7AAKzBwACsywAAsb1gwAD2XQEcwACs1BbAAKzNLq75wACEaMAAhIzAAEpUAQABhcAArO7AQInlAMAAbCc9jMAArP3AQIibH8AArQrAAIp9AgAChsAArR7AQIoKhMAArSnAQIibAD0cwACtTxbAAK04LsAAV+DAAISVTwEAAYXAAK1TwECJ5QDAAPYbPYnAAK1iwECIMxzAAK2IgcAArXbAQIgzg6wBAAGFwACtkMBAieUAijA+AUbAAK2swACt48AArcEAAACYdmDAAHn8ABbAAK3bgMAArcrAQIgamKW+ID4BScAAre0WwACt94XAAK3xwECKybjkwAB6AT4CTsAArhnAAK4jAACxvWDAAPZdARzAAK4sFsAAriUurvnAAIRowACEjMAASlABAAGFwACuO8BAiskAwABsJD2MwACuTcBAiJsfwACuWsAAin0CAAKGwACubsBAiwiEwACuecBAiJsAP07AAK6pwACusAAAgdNgwAB6BQEWwACuw4DAAK6ywECIGoHTviFJwACuzxbAAK7ahcAArtPAQItvwABRFcAAeg0+A07AAK+cwACvpgAAsb1gwAD2XQEcwACvrxbAAK+oLq75wACEaMAAhIzAAEpRAQABhcAAr8bAQItvAMAAbCU9jMAAr9XAQIibH8AAr+LAAIp9AgAChsAAr/bAQIuxhMAAsAHAQIibAD0cwACwHBbAALAQLsAAV97AAISTTwEAAYXAALAgwECLbwDAAPYbPz0XwACwNC7AAFfhg8AAsEfAQIh7wACElz0cwACwUS7AAFgNAQABFsAAsHWAwACwZMBAiBqSTL4fAMAAhL5JwACwgRbAALCWgMAAsIXAQIgasmO+Ij4BQ8AAsKohFsAAsMSBwACwssBAiDOA/IooPgM9HMAAsOYWwACw1y7AAFffwACElJPgAQABFsAAsP+BwACw7cBAiDODroolAMAA9h09HMAAsSUWwACxDi7AAFfgwACElZPgAQABFsAAsT6BwACxLMBAiDODroolAMAA9h09icAAsU3AQIgzFsAAsXOBwACxYcBAiDODr4omPgE9HMAAsaAWwACxlC7AAFfewACEk5PgAQABFsAAsbiAwACxp8BAiBqB074hAMAA9h09F8AAscwuwABX4YLAALHfwECIWMAAhJc9HMAAsfEuwABX9QEAAYTAALH/wECImwDAAISvSsAAsgwBKQbAAITZgYjAALKDwACyiMAAtyAAAMAAWDcAAAABA8AAsp/AALcgAAAAAQEBwACytgAAAID7YL4rAABcAT4CTsAAss3AALLUAACB02DAAHoFARbAALLbgMAAstbAQI3CgdO+OEnAALLnIiEcwACy8oHAALLrwECN1UEBAAErAMAA9dIAFsAAswSBwACy/cBAjdW48MAAegw+DU7AALMnwACzNAAAwABYD2DAAImFARbAALM2LsAAV+HAAISXTsAAs1fAALNcAACSTGDAAImFAR/AALNiwACJkQAAAAA9F8AAs3ouwABX4YPAALONwECOU8AAhJdOwACzpsAAs60AAIEQYMAAiYABg8AAs6/AQI5TRsAAs7vAALPmwACz0AAAAJh2YMAAefwAFsAAs96AwACz2cBAjcKYpb45PgFJwACz8BbAALP6hcAAs/TAQI6vuPDAAHoCPgNOwAC0H8AA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AMAA0oMAAACkvmDAAPZdAABbAT4BPRzAANKNLsAAWFEDAAOAwADSoMBApACBwADSpsBApA0WwADSr4DAANKqwECkAKBhuWcAwACE4QbAAITlgYjAANM+wADTPsAA1FAAAMAAWFMAAAABA8AA01LAANRQAAAAAgICwADTYAAAAIOyYLuSAMAA020AAACkvmDAAPZdAABbAT4CPRzAANN3LrCCAgACgMAA04nAQKSEgcAA04/AQKSRAMAAhONJwADTmCIhHMAA05+BwADTnMBApJFBAQABJ5KXAMAA9mwAHMAA06suwABX9AEAAYDAANPCwECkhADAAISuPgE9HMAA09EursEBAAEmwADUGAEcwADUGB/AANPawACLNgMAAyeSlxzAANPrLq7CAAAAAMAAhLMfwADT9sAAjB8BAAEng80AAK8xAQABFsAA1DOAwADULsBApISgYblnAMAAiW5gwACKlwDAAISyPwbAAITmgYjAANRVwADUVcAA1PoAALCHAAAAAQPAANRlwADU+gAAAAICAsAA1HMAAACDsmC7wgDAANSAAAAApL5gwAD2XQAAWwE+Aj0cwADUii6wugEAARbAANSTgMAA1I7AQKWflUi7xgDAAITHPRzAANShLq7BAQABJsAA1MgBHMAA1MgfwADUs8AAi0UCAAKBwADUvcBApawcwADUwS6uwgAAAADAAISzAK8xAQABFsAA1OOAwADU3sBApZ+gYblnAMAAiW5gwACKlwDAAISyBsAAhOeBiMAA1XPAANVzwADWdAAAwABYVAAAAAEDwADVhsAA1nQAAAACAgLAANWUAAAAg7Jgu8IAwADVoQAAAKS+YMAA9l0AAFsBPgI9HMAA1asusIcCAAKAwADVvMBApnKBwADVwsBApn8AwACE5knAANXLHMAA1c8uwABX9AEAAYDAANXmwECmcgDAAISuPgE9HMAA1fUursEBAAEmwADWPAEcwADWPB/AANX+wACLNgMAAyeSlxzAANYPLq7CAAAAAMAAhLMfwADWGsAAjB8BAAEng80AAK8xAQABFsAA1leAwADWUsBApnKgYblnAMAAiW5gwACKlwDAAISyPwbAAITogYjAANZ5wADWfsAA2q4AAMAAWFUAAAABA8AA1pTAANquAAAAAwICwADWpgAAALBbYLx+AMAA1sUAAACgYWC10AABwADW5AAAAMAAWFZgwADyswEqXAE+BE7AANcCwADXBQAApL5gwAD2XQEWwADXE4DAANcHwECncrHrvIBOwADXOMAA1z0AAJVLYLlkARbAANdLgMAA1z/AQKdylUu7R07AANdiwADXaAAAlUxguWQBFsAA13aAwADXasBAp3KVTLtIScAA14EhHMAA14iDwADXhcBAp6RBAQABKwDAAPZsPgQ9HMAA15kusLoBAAGEwADXncBAp8kAwACEx07AANe4wADXvwAAwABYUmDAAIqXARzAANfBLq7CAAAAAMAAhLM9HMAA184usLoBAAGFwADX0sBAp+wAwACExz0cwADX4C6uwQEAASbAANgxARzAANgxH8AA1+nAAIs2AwADHsAA1/PAAIUjAgACg8AA2AnAQKekgsAA2A3AQKeNAIbAANgXwECoSRzAANgfLq7CAAAAAMAAhLMArzEBAAGBwADYR8BAp38AwACJbmDAAIqXAMAAhLI+CUAcwADYjxrAANiIwABW/kEBAAEnhAIAwAD2bMAA2HbAANiYAD0cwADYoS6wugEAAYTAANilwECnyQDAAITHTsAA2LzAANjLAADAAFhXYMAAiyYBH8AA2NvAAIs2AwADJ0EcwADY6y6uwgAAAADAAISzH8AA2PbAAIv9AAAAAAA9HMAA2Q8usLoBAAGFwADZE8BAp+wAwACEx07AANkrwADZOwAAwABYWGDAAIsmAR/AANlBwACLNgMAAx7AANlWwACFIwIAAidBgsAA2XLAQKeNABzAANl8Lq7CAAAAAMAAhLMfwADZh8AAi/0AAAAAAD0cwADZoC6wugEAAYXAANmkwECn7ADAAITHPRzAANmyLrC6AQABhMAA2bbAQKfJAMAAhMdOwADZzcAA2dYAAMAAWFlgwACLJgEfwADZ5sAAizYDAAMewADZ8MAAhSMCAAInnG2CwADaDcBAp40AHMAA2hcursIAAAAAwACEsxzAANoeLq7CAAAAAMAAhLMAPRzAANotLq7BAQABJsAA2nsBHMAA2nsfwADaNsAAiw4DAAOGwADaRcBAqUGHwADaVcBAqZwUwADaZsBAqicIAACvMQEAAYHAANqRwECnfwDAAIluYMAAipcAwACEsgbAAITpgYjAANqzwADav8AA2ysAALAcARrAANq0wADuSwAAAQPAANrMwADbKwAAAAEBAcAA2tcAAACDsmC8fgAAWwE+AT0cwADa4y7AAFhVAwACgMAA2vrAQKsSFsAA2wWAwADbAMBAqxKgYblnAcAAWFYqwACE6AbAAITqgYjAANswwADbPMAA228AALAGARrAANsxwADuSwAAAQPAANtEwADbbwAAAAEBAcAA20oAAACDsmC7UgAAWwFKwADbUwEcwADbUy6wggIAAoDAANtlwECriiddAMAAhOMGwACE64GIwADbc8AA23/AANu4AACwEgEawADbdMAA7ksAAAEDwADbisAA27gAAAABAQHAANuTAAAAg7Jgu1sAAFsBSsAA25wBHMAA25wusIICAAKAwADbrsBAq+4nSQDAAITjBsAAhOyBiMAA27zAANvIwADcBQAAsDQBGsAA273AAO5LAAABA8AA29XAANwFAAAAAQEBwADb4AAAAIOyYLtkAABbAUrAANvpARzAANvpLrCCAgACgMAA2/vAQKxSJ4M+AMAAhOMGwACE7YGIwADcCcAA3BXAANxSAACwRAEawADcCsAA7ksAAAEDwADcIsAA3FIAAAABAQHAANwtAAAAg7Jgu20AAFsBSsAA3DYBHMAA3DYusIICAAKAwADcSMBArLcngUEAwACE4wbAAITugYjAANxWwADcYsAA3J4AALAIARrAANxXwADuSwAAAQPAANxtwADcngAAAAEBAcAA3HYAAACDsmC7sAAAWwFKwADcfwEcwADcfy7AAFhTAgACgMAA3JTAQK0cJ4MsAMAAhOUGwACE74GIwADcosAA3K7AANzpAACwCQEawADco8AA7ksAAAEDwADcucAA3OkAAAABAQHAANzCAAAAg7Jgu90AAFsBSsAA3MsBHMAA3MsuwABYVAIAAoDAANzfwECtgyeSlQDAAITnBsAAhPCBiMAA3O3AANz5wADdMwAAsAoBGsAA3O7AAO5LAAABA8AA3QPAAN0zAAAAAQEBwADdCwAAAIOyYLunAABbAUrAAN0UARzAAN0ULsAAWFMCAAKAwADdKcBAreongN8AwACE5QbAAITxgYjAAN03wADdQ8AA3X8AALALARrAAN04wADuSwAAAQPAAN1OwADdfwAAAAEBAcAA3VcAAACDsmC7uQAAWwFKwADdYAEcwADdYC7AAFhTAgACgMAA3XXAQK5RJ4ODAMAAhOUGwACE8oGIwADdg8AA3Y/AAN3S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AQABFsABEk+AwAESSsBA09qgYblnAMAAiW5gwACKlwDAAISyPgM9HMABEncursEBAAEcwAEShRbAARJ8LsAARPHAAIRowACEhq9EAQABgcABEprAQNPtAMAAlbAAwACEsk7AARK/wAESyQAAVF3AAPUdAWDAAIqXARzAARLLLpU2AgABFsABEt+AwAES2sBA09qB5blqAWOTwACEwj0cwAES+C6uwQEAAR/AARMBwACLHQMAAhzAARMJLq7CAAAAAMAAhLOCwAETEMBA1aYBoGEWwAETPYDAARM4wEDT2qBhuWcAwACEsj0cwAETcBbAARNdLsAAV+vAAIRowACEpaxwAQABHsABE4bAAF2CAQABJsABE6kBFsABE6mAwAETpMBA09qTDbqbYLDUAADAAGd3BsAAhQuBiMABE7vAARPMwAEWpAAAsDYBGsABE7zAAO5LAAABA8ABE+PAARakAAAAAQEBwAET+AAAAIOyYLz0AABcAT4HTsABFBjAARQiAABUXcAA9R0BYMAAipcBHMABFCQulTYBAAEWwAEUOIDAARQzwEDWqYHluWoAwACEwk7AARRJwAEUUQAAqKlgwACLYgEfwAEUV8AAi2sBAAEcwAEUdhbAARRvLq75wACEaMAAhIzAAEqkAQABFsABFJ0WwAEUjS6rc8AAhGjAAISmqNasrQDAAGxKAE7AARTBwAEUygAAn+xgvr8BFsABFNGAwAEUzMBA1qmf7LpiTsABFOfAARTyAACnIGDAAIqhARzAARUMFsABFPQurwTAAIRowACEicAAQ3oDAAODwAEVMMBA11AWwAEVOi6u+cAAhGjAAISMFsABFUIurTnAAIRowACEjwDAAGLiPRzAARVVLq7BAQABJsABFZwBHMABFZwewAEVWsAAiEADAAOCwAEVc8BA1vaEwAEVfMBA13OBwAEViMBA1rwArzEBAAEWwAEVt4DAARWywEDWqaBhuWcAwACJbmDAAIqXAMAAhLJJwAEV0BbAARXdg8ABFdTAQNdQhEC+zz4BPRzAARXvLsAAWGYBAAGAwAEV/sBA1qkAwACFD0nAARYQFsABFh2DwAEWFMBA11CEQb7QPgE9HMABFi8uwABYZwEAAYDAARY+wEDWqQDAAIUOPgE9HMABFlguwABYZQEAAYDAARZtwEDWqQDAAIUNPRzAARaIFsABFn4uwABX68AAhGjAAISlwABGPAAAAADAAGd/BsAAhQyBiMABFqnAARa3wAEazQAAwABYaAAAAAEDwAEWzsABGs0AAAADAwPAARblAAAAg7Jgul8AwAEW9AAAAJ/sYL6/AMABFwwAAACr12Cx4QAAYLHhAT4CScABFxghHMABFykWwAEXIYDAARccwEDZDJMNumRBAQABKwDAAPXSPgJOwAEYR8ABGFEAAK3LYLCtARbAARhgFsABGFiAwAEYU8BA2QyTDbpkkmmwzUnAARh2HMABGJYWwAEYhxbAARh6Lq05wACEaMAAhI+l2cAAQIekYgEAAYPAARilwEDZZADAAGW2PgFKwAEYuwEcwAEY1xbAARjCLsAAUJDAAIRowACEqazDAQABg8ABGOrAQNlkALIAPgJAHMABGZQWwAEZhy6tOcAAhGjAAISPmdUBAAGDwAEZosBA2WQAwABAk8ABGYfAARmsAR7AARm6q98CAAKAwAEZ1MBA2QwkAAYnwABYaRbAARn6gMABGfXAQNkMkw26ZCeaTIPAARoJwEDZZCfAAFhqJ8AAWGsASsABGksBHMABGmcWwAEaUi7AAFCQwACEaMAAhKmsxgEAAYPAARp8wEDZZACyAz9KwAEamgE1AAAAAQBgseEBgsABGqHAQNkmIxzAARqmgwDAQNqlQQEAASsAABbAARq+FsABGqkuwABQkMAAhGjAAISpnS6x5oMAwEDapQFgseEGwACFDYGIwAEa0sABGtfAASIOAADAAFhlAAAAAQPAARrrwAEiDgAAAAEBAcABGvsAAACDsmC6XwAAXAE+BE7AARsQwAEbGQAAn+xgvr8BFsABGyCAwAEbG8BA2xuf7LpiTsABG+zAARvzAACB02CwvwEWwAEb+oDAARv1wEDbG5MNumRJwAEcByIiHMABHBOCwAEcDMBA21FBAQABKwDAAPXSARbAARwlgsABHB7AQNtRhECwyAAhHMABHb+BwAEdtsBA2y5BAQABGsABHcysVwDAAPXSPgJOwAEemsABHp8AACBgvr8BHsABHqW+8AEAAYHAAR6+wEDbLgA9HMABHtkWwAEezy7AAFfrwACEaMAAhKWsbQEAAR/AAR77wABdTAMAA4PAAR8RwEDbyCsWwAEfIoDAAR8dwEDbG5JEum4AAMAAZ3g/ScABHz0hHMABH0iCwAEfQcBA21FBAQABKwDAAPXSPgJAHMABIGuBwAEgYsBA2y6qOwEAAYLAASBzwEDbUQC+38ABIGLAASB6AR7AASCGq98CAAKAwAEgj8BA2xskwAEgugOBwAEgl8BA2y4nwABYbILAASCzwEDbUQA9HMABIM4WwAEgxC7AAFfrwACEaMAAhKWscAEAAR7AASDkwABdgwMAAybAASEGAYLAASEGwEDbUWCw1BbAASEXgcABIQ7AQNsurCW+xBbAASErgMABISbAQNsbkkS6bgAAwABndz4CTsABIV3AASFiAACr12Cx4QEcwAEhZC7AAFhoAwADgMABIXzAQNsbgcABIYLAQNsuFsABIZGAwAEhjMBA2xur17pjAMAAhQw9HMABIagWwAEhni7AAFfrwACEaMAAhKWsbQEAAR/AASHKwABdTAMAA4HAASHgwEDbLoPAASHqwEDdGRbAASH1gMABIfDAQNsbkkS6bgAAwABneAbAAIUOgYjAASITwAEiGMABJNEAAMAAWGcAAAABA8ABIibAASTRAAAAAgEBwAEiNgAAAIOyYLpfAAHAASJCAAAAsWtgwADyswEqXAE+AUnAASJcIiXAASJtFsABImWAwAEiYMBA3d6TDbpkYLDRACGBwAEigMBA3ew+AT0cwAEjnBbAASOSLsAAV+vAAIRowACEpaxwAQABHsABI7LAAF2FAQABJsABI8sBFsABI8uAwAEjxsBA3d6TDbpkYLDRAADAAGd3PgNOwAEj8sABI/sAAJ/sYL6/ARbAASQCgMABI/3AQN3en+y6Yk7AASQgwAEkJQAAq9dgseEBHMABJCcuwABYaAMAA4DAASQ/wEDd3oLAASRFwEDeehbAASRUgMABJE/AQN3eq9e6YwDAAIUMPRzAASRrFsABJGEuwABX68AAhGjAAISlrG0BAAEfwAEkjcAAXUwDAAOCwAEko8BA3nqDwAEkrcBA3p0WwAEkuIDAASSzwEDd3pJEum4AAMAAZ3gGwACFD4GIwAEk1sABJNvAASgoAADAAFhmAAAAAQPAASTpwAEoKAAAAAEBAcABJPkAAACDsmC6XwAAXAE+AUnAASUFIiEcwAElFhbAASUOgMABJQnAQN9ikw26ZEEBAAErAMAA9dIAIhbAASU3FsABJS+AwAElKsBA32KTDbpkhECwyAEWwAElUBbAASVIgMABJUPAQN9ikw26ZIRCsMY+AT0cwAEm8xbAASbpLsAAV+vAAIRowACEpaxwAQABHsABJwnAAF2EAQABFsABJyKAwAEnHcBA32KTDbpkAADAAGd3PgNOwAEnScABJ1IAAJ/sYL6/ARbAASdZgMABJ1TAQN9in+y6Yk7AASd3wAEnfAAAq9dgseEBHMABJ34uwABYaAMAA4DAASeWwEDfYoHAASecwEDgGxbAASergMABJ6bAQN9iq9e6YwDAAIUMPRzAASfCFsABJ7guwABX68AAhGjAAISlrG0BAAEfwAEn5MAAXUwDAAOBwAEn+sBA4BuCwAEoBMBA4D4WwAEoD4DAASgKwEDfYpJEum4AAMAAZ3gGwACFEIGIwAEoLcABKDnAASl+AACwJAEawAEoLsAA7ksAAAEDwAEoUcABKX4AAAABAQHAAShnAAAAg7Jguo8AAFsBPgQ9HMABKHMusLoBAAEWwAEofIDAASh3wEDhCoQ8um0AwACEx07AASiTwAEomAAAgLBgwACKoQEcwAEooRbAASiaLq75wACEaMAAhIzAAEo9AQABFsABKLWAwAEosMBA4Qqf7LpiAMAAbC89HMABKMQursEBAAEmwAEpFQEcwAEpFR7AASjJwACIQAMAAxzAASjiLq7CAAAAAMAAhLOBwAEo6cBA4UAcwAEo7y6VNgEAARbAASkDgMABKP7AQOEKgeW5agDAAITCAK8xAQABFsABKTCAwAEpK8BA4QqgYblnAMAAiW5gwACKlwDAAISyPRzAASlJLsAAWGcCAAGAwAEpWMBA4QoBsWsWwAEpb4DAASlqwEDhCrFrupHAAIUOBsAAhRGBiMABKYPAASmPwAEqtwAAsCIBGsABKYTAAO5LAAABA8ABKafAASq3AAAAAQEBwAEpvQAAAIOyYLqFAABbAT4EPRzAASnJLrC6AQABFsABKdKAwAEpzcBA4m2EPLptAMAAhMdOwAEp6cABKe4AAICwYMAAiqEBHMABKfcWwAEp8C6u+cAAhGjAAISMwABKPQEAARbAASoLgMABKgbAQOJtn+y6YgDAAGwvPRzAASoaLq7BAQABJsABKmsBHMABKmsewAEqH8AAiEADAAMcwAEqOC6uwgAAAADAAISzgcABKj/AQOKjHMABKkUulTYBAAEWwAEqWYDAASpUwEDibYHluWoAwACEwgCvMQEAARbAASqGgMABKoHAQOJtoGG5ZwDAAIluYMAAipcAwACEsj0cwAEqny7AAFhmAQABgMABKq7AQOJtAMAAhQ8GwACFEoGIwAEqvMABKsjAAS0IAACwIQEawAEqvcAA7ksAAAEDwAEq2sABLQgAAAABAQHAASrqAAAAg7JgunEAAFsBPgROwAEq/8ABKwQAACBgvr8BHsABKwq+8AEAARbAASsogMABKyPAQOO8n+y6YgA9HMABKzcusLoBAAEWwAErQIDAASs7wEDjvIQ8um0AwACExz0cwAErTy6uwQEAASbAASvEARzAASvEHsABK1TAAIhAAwADHMABK3oursIAAAAAwACEsxzAASuIFsABK4EurvnAAIRowACEjMAASj0BAAGBwAErl8BA488AwABsLxzAASueLpU2AQABFsABK7KAwAErrcBA47yB5blqAMAAhMIArzEBAAEWwAEr34DAASvawEDjvKBhuWcAwACJbmDAAIqXAMAAhLI9HMABLK4WwAEspC7AAFfrwACEaMAAhKWsbQEAAR/AASzOwABdTAMAA4HAASzkwEDjzysWwAEs9YDAASzwwEDjvJJEunMAAMAAZ3gGwACFE4GIwAEtDcABLRnAATYBAACwJQEawAEtDsAA7ksAAAEDwAEtKsABNgEAAAABAQHAAS05AAAAg7JgupkAAFsBPgROwAEtUsABLVoAAJMNYLC/ARbAAS1hgMABLVzAQOVCkw26mz01AAAAAQBdwAD1HQFgwABYXQEWwAEtc4DAAS1uwEDlQrFSup4jHMABLYaCAMBA5XlBAQABKwAAKxzAAS2GggDAQOV5g7wBAAEWwAEtmBbAAS2OLsAAV+vAAIRowACEpcAARNrAAGeAAMAA9OsBXE7AAS3JwAEt0wAAVF3AAPUdAWDAAIqXARzAAS3VLpU2AgABFsABLemAwAEt5MBA5UKB5blqAWOTwACEwknAAS4BHMABLg2BwAEuBcBA5VVBAQABFsABLiAWwAEuEC6rc8AAhGjAAISmqUitHQDAAPXSPgVAHMABL8UWwAEvvoLAAS+0wEDl51rAAPVMQQEAAZUAwAD1nMABL7TAAS/JAE7AAS/hwAEv7wAAwABYbWCw1AEWwAEwCxbAAS/7LqtzwACEaMAAhKapSa0ePRzAATA9FsABMDMuwABX68AAhGjAAISlrHABAAEewAEwXsAAXXYCAAKDwAEwdcBA5oYawAEwksAAVQEAAMAAZ3dOwAEy9MABMvoAAJVMYMAAipcBJsABMvQBHMABM2UcwAEy/hrAATL/wACINiACAAInwABYbjHAATMPYMAAipcCHMABMyIWwAEzGS7AAETxwACEaMAAhIavRAEAAYPAATM3wEDmhgDAAJWwHMABM1iCwAEzT8BA5edEAQABlADAAPUsAMAAjQSvMQEAARbAATOAgMABM3vAQOVCoGG5ZwDAAIluYMAAipc9HMABM5oursEBAAEmwAEzxgEcwAEzxhzAATOhGsABM6LAAIg2IAIAAifAAFhvMcABM69gwACKlwIcwAEzuYLAATOwwEDl50QBAAGTAMAA9SyEwAEzvsBA5vMAwACNBK8xAQABFsABM+yAwAEz58BA5UKgYblnAMAAiW5gwACKlwDAAISyPgROwAE0IsABNDAAAKwlYMAAVP0BH8ABNDbAAFUfAgACFsABNGGCwAE0V8BA5edawAD1TBbAATR8FsABNG6AwAE0acBA5UKSRLqcWsAA9UwAPRzAATSVFsABNIsuwABX68AAhGjAAISlrHABAAEjFsABNK+BwAE0p8BA5VWERbDFHsABNM3AAF2GAgACJsABNOkBgcABNOnAQOVVYLDsg8ABNPLAQOgiAB7AATURwABddgMAAybAATU3AYHAATU3wEDlVWCw1IPAATVAwEDoIhbAATVUgMABNU/AQOVCkkS6nAABYMAAXWkAwABndz0cwAE1ay6uwQEAARzAATV5FsABNXAuwABE8cAAhGjAAISGr0QBAAEmwAE1jgGBwAE1jsBA5VVgsNQAwACVsADAAISyPRzAATWfLq7BAQABH8ABNajAAIsdAwACHMABNbAursIAAAAAwACEs4LAATW3wEDl5wGgYRbAATXkgMABNd/AQOVCoGG5ZwDAAISyBsAAhRSBiMABNgbAATYSwAFAhgAAsCYBGsABNgfAAO5LAAABA8ABNiLAAUCGAAAAAQEBwAE2MAAAAIOyYLqmAABbAT4DTsABNknAATZWAADAAFhwYLC/ARbAATZdgMABNljAQOnPkw26m07AATZ2wAE2gQAAtU5gsK0BFsABNpCBwAE2g8BA6eKSabDNScABNqQWwAE2tYHAATaowEDp4oRCsMY+BE7AATbOwAE22AAAwABKeWDAAIqhARzAATbhFsABNtourvnAAIRowACEjMAASnEBAAEmwAE2+wGBwAE2+8BA6eJgsNEAwABsNz0cwAE3EC6wugEAARzAATcfFsABNxmAwAE3FMBA6c+B5blqRAEAAZMAwAD1LADAAITHTsABNz3AATdEAADAAEJSYMAAi7EBJsABNz0BHMABN3kfwAE3SsAAi78CAAIcwAE3XC6uwgAAAADAAISzg8ABN2PAQOpDAK8xAQABFsABN5SAwAE3j8BA6c+gYblnAMAAiW5gwACLsUnAATeuFsABN7eAwAE3ssBA6c+EQbqpPgM9HMABN9UWwAE3yy7AAFfrwACEaMAAhKWscAEAASMWwAE39IHAATfnwEDp4oRBsMkewAE4D8AAXX4BAAEmwAE4KAGBwAE4KMBA6eJgsNQAHsABOEjAAF19AQABJsABOGABgcABOGDAQOniYLDRAAFgwABdaQDAAGd3PRzAATh4LrC6AQABFsABOIGAwAE4fMBA6c+AirqtAMAAhMc9HMABOJEursEBAAEmwAE4xAEcwAE4xB/AATiawACK8wIAAoTAATiowEDqvRzAATiwLq7CAAAAAMAAhLMArzEBAAEWwAE434DAATjawEDpz6BhuWcAwACJbmDAAIqXAMAAhLI+Aj0cwAE5FRbAATkLLsAAV+vAAIRowACEpaxwAQABHsABOSvAAF18AQABgcABOT7AQOniAADAAGd3PRzAATlWLq7BAQABhMABOVvAQOq9AMAAhLI+Ak7AATmIwAE5kQAAn+xgvr8BFsABOZiAwAE5k8BA6c+f7LqqScABOaghHMABOb4WwAE5rS7AAFfZwACEaMAAhI2vXgIAAoHAATnpwEDp4oPAATn3wEDskgC24j4ETsABOhQAAACnIGDAAIqhAEnAATooIhbAATo1g8ABOizAQOyShEC+zwAhFsABOk+BwAE6QsBA6eKEQLDIPgROwAE7ScABO1AAAKW+YLDUARbAATtiFsABO1Iuq3PAAIRowACEpqk/rRQ9HMABO4oWwAE7gC7AAFfrwACEaMAAhKWscAEAAR7AATugwABddgMAA4XAATvGwEDtLB/AATvgwABVHwIAAhbAATwVFsABPA6AwAE8CcBA6c+B5blqWsAA9UwWwAE8MBbAATwigMABPB3AQOnPkkS6nFrAAPVMABbAATxMgMABPEfAQOnPkkS6nAAA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AAEAYLlkABzAAEOgFsAAQ5mAwABDlMBBle6wmblrgKEAAAAAwAD08T4DTsAAQ4wAAACwvmC7FwEmwABDfQGBwABDjMBBlp5guxc9HMAAQ78WwABDuYLAAEO0wEGWy5luuWyvUQIAAoLAAEPHwEGWy4DAAEPNwEGV7gC5Vj0cwABD5xbAAEPhgsAAQ9zAQZbLmW65bJPgAQABgsAAQ+7AQZbLALlTPz0cwABECC7AAFjbAQABgMAARCXAQZXuAMAAhZZKwABEMAGAwABEN8BBle4GwACFmIGJwABERMAARF3AAEfpAACwDAEawABERcAA7ksAAAEDwABEacAAR+kAAAABAQHAAERzAAAAg7JgugsAAGC5ZAE+CE7AAESSwABEmQAAgeVdwAD1HQFguWQBFsAARKCAwABEm8BBl6SB5blqQBzAAETBFsAARLqBwABEs8BBl7lawAD1TEEBAAGUAMAA9ZzAAESzwABExQBOwABE2cAARN8AAIEgYLlkARzAAETngcAAROHAQZe5RAEAAZMAwAD1LEnAAETwFsAARRocwABE+oLAAET0wEGYDqzpAQABFsAARQQuwABQkMAAhWDAAIWJALnAq6Sxzz4BSsAARTQBgsAARTvAQZgOP0nAAEZLFsAARoMcwABGZBbAAEZPLsAAUJDAAIVgwACFiYD8AQABFsAARnKCwABGbMBBmA6w97mbALINq6Sxzz4BSsAARp0BgsAARqTAQZgOP07AAEcEwABHCQAAq9dgseEBFsAARxGCwABHC8BBmA6w97mbScAARyYWwABHgBzAAEdIFsAARyouwABQkMAAhWDAAIWJrMwCAAKDwABHVcBBmNAWwABHahbAAEdbLqq1wACFh6kQrOcAsgmsrbHSPgFKwABHnAEcwABHqhbAAEejLsAAWMzAAIVgwACFhbByAgACKhbAAEfBLq05wACFYMAAhYIAuKI/SsAAR9oBgMAAR+HAQZekBsAAhZmBicAAR+7AAEgHwABJjwAAlUkBGsAAR+/AAO5LAAABA8AASA/AAEmPAAAAAQEBwABIFQAAAIOyYLxJAABguWQBPgVOwABINMAASDsAAIHlXcAA9R0BYLlkARbAAEhCgMAASD3AQZm4geW5akAcwABIYxbAAEhcgcAASFXAQZnNWsAA9UxBAQABlADAAPWcwABIVcAASGcATsAA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t4PAAOKywEH/t0EBAAEngtIAwAD2bELAAOLDAD8/SsAA40YBgMAA403AQf24SsAA410BgcAA42TAQf3NBsAAhbiBicAA43PAAOOMwADp2wAAsEIBGsAA43TAAO5LAAABA8AA453AAOnbAAAAAQEBwADjrAAAAIOyYL20AABguWQBPgxPwADkkMAA5KQAAAHAAFkIYQFguWRgwABXcwADwADkrcAA5U4AAAABAQHAAOS7AAAAsFtguWQAAGDAAFdzAT4DScAA5NAhHMAA5OGCwADk1cBCAMWxGwAAAAC520rAAOT1ASs/TsAA5RLAAOUbAACEH2C8MwEmwADlEgGCwADlHcBCAMVgvDNKwADlMAEmwADlMAEWwADlQIPAAOU3wEIBAIQfvDVgwABXc07AAOVpwADldAAAvmpgwABXcwEcwADlf4HAAOV2wEIAoCABAAEWwADlhYDAAOWAwEIAh5VLvbYAAEnAAOWQIiEcwADln4LAAOWUwEIBRkEBAAErAMAAV30AHMAA5cgWwADlwRbAAOW1gsAA5arAQgFGnCvAAFd1WsAA9mFBAQABkwDAAPWcPgFKwADl1gEWwADl4oDAAOXdwEIAh5VMvbc/TsAA5gjAAOYUAAC+a2DAAFdzARzAAOYfgcAA5hbAQgCgIAEAARbAAOYlgMAA5iDAQgCHlUy9twAAScAA5jEcwADmQYPAAOY1wEIB50EBAAErAMAAV31KwADmSgGAwADmUcBCAIc/ScAA5lscwADmfhbAAOZ3FsAA5muDwADmX8BCAeecK8AAV3VawAD2YUEBAAGTAMAA9ZxKwADmhAEWwADmkIDAAOaLwEIAh5VLvbY/TsAA5qjAAOavAACC3mC5ZAErScAA5rscwADmyoLAAOa/wEIBRkEBAAErAMAAV30+BknAAObbISXAAObpFsAA5uSAwADm38BCAIeVS722YL20SsAA5vwBgMAA5wPAQgCHP07AAOcdwADnKAAAwABZCWC9tAEmwADnHQEWwADnL4DAAOcqwEIAh5VLvbZgvbRJwADnVCEcwADncRbAAOdqFsAA52OFwADnWMBCAvmwmblrWsAA9UxBAQABlADAAPWcSsAA53cBgMAA537AQgCHPz2MwADnisBCApgWwADnnoXAAOeTwEIC+ZVLvbY9isAA56rAQgFGHMAA58CBwADnt8BCAKAg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I6i4dwAAAAARBsAAheCBicABI+TAASP8wAEkOQEAwABQkMAAhWAAAAABA8ABJBHAASQ5AAAAAAAAAGCx5AFKwAEkGgEWwAEkJhbAASQaLp/hwACF1qmGwABAggbAAIXhgYnAASRiwAEkc8ABJfEBAMAAWSAAAAABA8ABJILAASXxAAAAAAAAAGC5ZAE+AknAASSIHMABJKAWwAEkjC7AAFkfwACF3UEBAAErAMAA9dI+Ak7AASUFwAElDgAAhB9gwABWvQEfwAElFMAAV/ICAAIawAElTLZ+FsABJW4WwAElWS7AAFCQwACFYMAAheCsv7H7AD0XwAElgC7AAFkfHMABJaUWwAElnxbAASWWLpunwACF2p7VwACF9qrcAgACgMABJbHAQid3FsABJbsun+HAAIXWALibwACF3T9KwAEl0wEWwAEl2i7AAFkfwACF3QbAAIXjgYnAASZ5wAEmfsABJ30AAMAAWSEAAAABA8ABJpXAASd9AAAAAgICwAEmowAAAMAATgZguy8AwAEmuQAAAIQ8YLlkAABgwADyswE+BEnAASbJHMABJuMWwAEm3BbAASbVgMABJs3AQihBgeW5alrAAPVMXAEAAZQAwAD1pkrAASboASo/ScABJvohHMABJxMWwAEnDRbAAScGgMABJv7AQihBgeW5aoLSwAD1AUEBAAGBwAEnFsBCKFAAwAD10krAAScgASo/ScABJzIWwAEnTBbAASc+gMABJzbAQihBsZm7NMAATELAAG9DSsABJ1wBKT9KwAEnbQEqBsAAheSBicABKDTAASg5wAEuIwAAwABZIgAAAAEDwAEoUMABLiMAAAABAQHAASheAAAAsFtguWQAAGDAAPKzAT4ETsABKH7AASiHAACEPGC5ZAEcwAEolYDAASiJwEIpP7EEAQABFsABKKUun+HAAIXWALnFTsABKMTAASjMAABXYLlkARbAASjagMABKM7AQik/g2a5bkTAASjkPgZJwAEo7yIcwAEpGRzAASj8gsABKPTAQimJsQQBAAEWwAEpDC6f4cAAhdYAucVBAQABgcABKRzAQilWAMAA9dIAHMABKTuCwAEpM8BCKYmw/wEAARbAASlELsAAUJDAAIVgwACF4AC5pj4BSsABKWUBKT9JwAEpgCIlwAEpjILAASmEwEIpiWC7LwAcwAEpqS7AAFkhAgACFMABKcHAQimJAgFguy+BwAEpysBCKVYAwACF4z4BSsABKd8BKT9JwAEp+iIcwAEqBoLAASn+wEIpibD/AQABFsABKg8uwABQkMAAhWDAAIXgALmmARzAASpGFsABKjqCwAEqMsBCKYmrvLlvsP0AAAAAwABuZz4BSsABKmIBKj9OwAEqi8ABKpAAAINmYLlkARbAASqagsABKpLAQimJg2a5bknAASqmHMABKq+DwAEqqsBCKslBAQABKwDAAPXSPgNOwAEragAAAMAATuxguS0AScABK30lwAEriYLAASuBwEIpiWC77D4BPYzAASufwEIrCxbAASvEFsABK7kWwAErsxTAASurwEIpiQIBYLvsmW65bLCjuTqAtsAA9QNJwAEr2yXAASvngsABK9/AQimJYLwdPgJOwAEsT8ABLFkAAJVPYLlkARbAASxqFsABLGMUwAEsW8BCKYkCAWC8HYHluWqC0sAA9QFJwAEseyXAASyJhcABLH/AQiuAYLwzPgNOwAEsqsABLLEAALHWYMAA8rMBFsABLMYWwAEsvRTAASyzwEIrgAUBYLwzhB+8NbHWwABWwj2MwAEs2sBCKwsjhsABLObAQivLFsABLPcUwAEs78BCKYkCAWC8HbHJvCQWwAEtCxTAAS0DwEIpiQIBYLwdscq8JQFguS1AIRzAAS0zFsABLSoum6fAAIXawABZIwEAAYTAAS0/wEIrCwDAAIYAwAEtKcABLUkAPz9JwAEtaiIhHMABLXiEwAEtbsBCKwtBAQABKwDAAPXSABzAAS2QFsABLY2EwAEtg8BCKwurA7kvgIsBAAEWwAEtoBbAAS2agsABLZLAQimJmW65bKsDuS8AwAD1qD4BPYvAAS2wwEIqyRbAAS3BhMABLbfAQisLgtK5Hz8/PYrAAS3gwEIpiYPAAS3qwEIqySEcwAEuBYLAAS39wEIpiUEBAAErAMAA9dJKwAEuEwEqBsAAheWBicABLijAAS4twAEyBgAAwABZJAAAAAEDwAEuR8ABMgYAAAABAQHAAS5VAAAAsFtguWQAAGDAAPKzAT4CT8ABL0PAAS9IAAABwABZJWEBYLlkYMAA8rMAA8ABL1HAATEcAAAAAQEBwAEvXwAAALC6YLlkAABgwADyswE+AknAAS9sJcABL3SCwAEvcMBCLZNgutk+AUnAATAqHMABME8cwAEwMhTAATAuwEItkwIBYLrZsQQBAAEWwAEwQi6f4cAAhdYAutxBAQABgMABMFLAQi1TAMAA9dJKwAEwXwEpP0nAATB5JcABMIGCwAEwfcBCLZNgusg+AkAcwAEwwRzAATCkFMABMKDAQi2TAgFgusixBAEAARbAATC0Lp/hwACF1gC6zkEBAAGAwAEwxMBCLVMAwAD10sABMKDAATDPAEnAATDaHMABMN4uwABZJgEAARTAATDpwEItkwIBYLrIAMAAhedKwAEw7wEpPz9KwAExCgEqSsABMSMBIiIcwAExNoDAATEqwEItU7EAAQABFsABMUMuwABQkMAAhWDAAIXgALmkABzAATFwgMABMWTAQi1TsPwBAAEWwAExdy7AAFCQwACFYMAAheAAuaMAHMABMbIWwAExmC7AAFkewACF25iQAgACgMABMcvAQi1TNMABMdgDwAEx2MABMgEAAAAAAAAAYMAA8rMBSsABMd4BHMABMfEWwAEx6oDAATHewEItU7CZuWuTHgEAAYHAATH3wEItbgDAAPTuAMAA9WkGwACF5oGJwAEyC8ABMhDAATK2AADAAFknAAAAAQPAATIiwAEytgAAAAEBAcABMjAAAACwW2C5ZAAAYMAA8rMBPgFKwAEyQwEiJcABMlaAwAEySsBCL5hgutkAHMABMm4uwABZJAEAARzAATKVFMABMonAQi+YAAFgutmxBAEAARbAATKlLp/hwACF1gC63ADAAIXlBsAAheeBicABMrvAATLAwAE1fgAAwABZJgAAAAEDwAEyysABNX4AAAABAQHAATLYAAAAsFtguWQAAGDAAPKzAT4HScABMushFsABMwMWwAEy/IDAATLwwEIwLLCZuWuA/MAA9P9KwAEzDAEqP0nAATMeHMABMyIuwABZJwEAAYDAATM1wEIwLADAAIXmSsABM0MBKT9JwAEzVBzAATNwFsABM2SAwAEzWMBCMCyrvLlvsP0AAAAAwABuZ0rAATOCASo/ScABM5QcwAEzpIDAATOYwEIwLLD/AQABFsABM60uwABQkMAAhWDAAIXgALmmPgJJwAEzzCIcwAEz3IDAATPQwEIwLLEFAAAAALnGABzAATPvLsAAWSIBAAGAwAE0B8BCMCwAwACF5D4BSsABNNYBKT9KwAE08QEqP0nAATUJJcABNRmAwAE1DcBCMCxgvFdKwAE1LQEqP0nAATU/JcABNU+AwAE1Q8BCMCxgux5KwAE1XQEqP0rAATVvASkGwACF6IGJwAE1g8ABNZTAATZZAACwfgEawAE1hMAA7ksAAAEDwAE1nsABNlkAAAABAQHAATWmAAAAntVguIgAAFwBPgU9F8ABNbMuwABYzMAAhWCAwAE1vMBCMbLAAIXZPRfAATXHLpunH8ABNdbAAIYHAwADgMABNevAQjGyFsABNfIun+HAAIXWFsABNf8uvgXAAIXXAMAAhdo9HMABNhgWwAE2Dy6bp8AAhdrAAEWTAAAAAMAAhgE9HMABNicusFUBAAGAwAE2PsBCMbIAuHQ9HMABNkouwABZKAAAAADAAIXuBsAAhemBicABNl7AATZvwAE5XQAAsFMBGsABNl/AAO5LAAABA8ABNn7AATldAAAAAQEBwAE2iwAAAJluYLktAABcAT4HTsABNp3AATapAADAAFkjYMAA8rMBHMABNrQWwAE2qy6bp8AAhdrAAFkjAQABgMABNsDAQjKXAMAAhgA9F8ABNtKAwAE2zMBCMpewoiGBwAE23MBCMqq5OD0cwAE27S7AAFkpAQABgMABNwHAQjKXAMAAhetOwAE3YMABN2wAALBbYLlkARbAATd5FsABN3SAwAE3bsBCMpeBebkgm765bUPAATeHIRzAATeagsABN47AQjMeQQEAASsAwAD10j4DTsABN6/AATe4AACbvmC5ZAEWwAE3xoLAATe6wEIzHpu+uW1JwAE31oHAATfawEIyqj4DPRfAATfxLsAAWMciFsABOBUuwABYx8AAhdwBHMABOEYWwAE4OoLAATguwEIzHqu8uW+w/QAAAADAAG5nwACF3D0cwAE4YC7AAFkqAQABgsABOGzAQjMeAMAAhfA9HMABOIiAwAE4gsBCMpeT4AEAAYLAATiPwEIzHgC5U0nAATiqHMABOK4uwABZJgEAAYLAATi5wEIzHgDAAIXnPgE9HMABONeAwAE40cBCMpeT4AEAAYLAATjewEIzHgC5Uz89isABOPrAQjMeg8ABOQjAQjNqPRzAATkigMABORzAQjKXsMgBAAEWwAE5LS7AAFkrwACF6gC5XD0cwAE5Py7AAFksAQABgMABOVPAQjKXAMAAhe0GwACF6oGJwAE5YsABOWfAATzQAADAAFkrAAAAAQPAATlywAE8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wABQkMAAhWDAAIZArNMBAAEWwAGmt4PAAaaxwEKFJrD3uZsAshGsrLHRPgFKwAGm4wA/TsABpwjAAacUAADAAFleXcAA9R0BYLktATHAAacjYLktAE7AAac9wAGnSgAAwABZX13AAPUdAWC5LQExwAGnWWC5LQA9HMABp2IuwABZYAMAA4DAAadxwEKEzYTAAad+wEKF5IXAAaeLwEKGBgDAAIZGScABp58iFsABp6+EwAGno8BCheSA/MAA9P8AFsABp8eFwAGnusBChgaA/MAA9P9KwAGn0AA/TsABp+vAAaf3AACstmCx4QEcwAGoFhbAAagBLsAAUJDAAIVgwACGQKzKAQABFsABqCiDwAGoIsBChSaw97mbALIHRsABqD/AAahnwAGoUAAAAJluYLktAIXAAahZwEKGBj4BPRzAAahvLsAAWVsDAAOHwAGolsBChtaDwAGoncBChSaGwAGopMBChowAwACGQwbAAIZGgYnAAal8wAGpfMABr40AAMAAWWAAAAABA8ABqYrAAa+NAAAAAwMDwAGpmAAAALBbYLlkAMABqbcAAADAAFleXcAA9R0BYLktAMABqdwAAADAAFlfXcAA9R0BYLktAABbAT4BRsABqfDAAaoewAGqAgAAALC+YLlkABbAAaoWgMABqgrAQodIsJm5az4BScABqiYlwAGqL4PAAaoqwEKHjWC8HT4CPTUAAAABAF3AAPUdAWC5LQGBwAGqQcBCh1UjHMABqk6EAMBCh8hBAQABKwAAKxzAAapOhADAQofITwEAARbAAapXFMABqlLAQoeNAwFgvB2xybwkAMAA9S4BXD01AAAAAQBdwAD1HQFguS0BgsABqmvAQodqIxzAAap5hADAQogjQQEAASsAACscwAGqeYQAwEKII08BAAEWwAGqghTAAap9wEKHjQMBYLwdscq8JQDAAPUuAVxJwAGqmyXAAaqkg8ABqp/AQoeNYLwpPgE9NQAAAAEAXcAA9R0BYLktAYHAAaq+wEKHVSMcwAGqy4QAwEKIlkEBAAErAAArHMABqsuEAMBCiJZPAQABFsABquUWwAGq2hbAAarUFMABqs/AQoeNAwFgvCmZbrlssKO5OoLSwAD1AQDAAPUuAVxJwAGrkCXAAauZg8ABq5TAQoeNYLxJPgE9HMABq6wuwABZYAMAAxTAAau7wEKHjQMB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owEpP0nAAgbbJcACBuOGwAIG38BCyExgushKwAIG8QEpP0nAAgcIJcACBxCGwAIHDMBCyExgutk+AUrAAgcsASEcwAIHSBzAAgc9FsACBzcUwAIHM8BCyEwGAWC62YCKuuKxAQAAAAC5pUEBAAGEwAIHS8BCyAUAwAD10j9JwAIHbiXAAgd2hsACB3LAQshMYL6ASsACB5ABKT9JwAIHpyXAAgevhsACB6vAQshMYLrlSsACB74BKT9JwAIH1SXAAgfdhsACB9nAQshMYLocSsACB+4BKT9JwAIIBSXAAggNhsACCAnAQshMYL0eSsACCBgBKT9JwAIILyXAAgg3hsACCDPAQshMYL0wPgFKwAIIVgEhHMACCHIcwAIIZxbAAghhFMACCF3AQshMBgFgvTCAir08sQEAAAAAuaVBAQABhMACCHXAQsgFAMAA9dI/ScACCJglwAIIoIbAAgicwELITGC84krAAgixASk/ScACCMglwAII0IbAAgjMwELITGC6eD4CTsACCQTAAgkMAACTDWCwvwEWwAIJEhTAAgkOwELITAYBYLp4kw26ZEnAAgknIRzAAgkzh8ACCSvAQsoDQQEAASsAwAD10j4BScACCUwcwAIJWIfAAglQwELKA0EBAAEWwAIJdhbAAglnFsACCVsun+HAAIaIqrXAAECBqYOtegDAAPXSPgFKwAIJlAEhHMACCasWwAIJphbAAgmfFMACCZvAQshMBgFguniB5blqgXnAAPUCQQEAAYTAAgmuwELIBQDAAPXSPz8/ScACCe8lwAIJ94bAAgnzwELITGC6mT4BScACChccwAIKJxbAAgofFMACChvAQshMBgFgupmTDbqbQQEAARbAAgpVFsACCkYWwAIKOi6f4cAAhoiqtcAAQIGpSK0dAMAA9dJKwAIKhQEpPz9KwAIKqQEqScACCsocwAIK4RbAAgrahMACCs7AQsgFsJm5a5MeAQABhcACCufAQsgnAMAA9O4+AT0cwAILIhbAAgsNg8ACCwbAQseywABZecAAhotPAQABhMACCybAQsgFAIvAP0rAAgtMAYPAAgtTwELHsj89HMACC3IWwAILZi6VaMAAhomDvAEAATTAAgt6A8ACC3rAAg0RAAAAAgICwAILewAAAJMNYMAA9cUAwAILhAAAACldwAD1TgJguWRguWQAAGDAAPWC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XcAAiEMBXwAAAABfAAABSsAATLIBHMAATLqAwABMssBDs/+VrAEAAS4AwACISAbAAImhgUbAAEzYwABM2sAATToAAJUQAAAAAQPAAEznwABNOgAAAgAAk9xgwAD1xQFbAACDmWDAAPXFAVsCAgLAAEz7AAAAloldwACI0AJfAABfAQAAwABNBgAAAJURXwEAAABfAAABSsAATRQBHMAATRyAwABNFMBDtHaVrAIAAi6BwABNNsBDtIwAwACI1QbAAImigUbAAE0/wABNRMAATW4AAJQPAAAAAQPAAE1UwABNbgAAAQAAgf1gwAD1xQFbAQEBwABNZAAAAJaJXcAAiEMBXwAAAABcAT4ABsAAiaOBRsAATXPAAE14wABNsQAAwABZ1QAAAAEDwABNjMAATbEAAAIAAJPcYMAA9cUBWwAAg5lgwAD1xQFbAgICwABNoAAAAJaJXcAAiNACXwAAXwEAAMAATasAAACVEV8BAAAAXAE+AAbAAImlgUbAAE22wABNxcAATeUAAMAAS8HAAIgwAAAAAQPAAE3LwABN5QAAAAAAAABgwACJngFKwABN0QEfwABN1cAAiacAAAAAAABDs8oAQ7Q2AEO0xgBDtRMAQ7V9AEO1xwAAAAUCwACJqIFGwABN6sAATfDAAFEjA8AAWdoAAAFgwACJgAAAAwTAAImqgUbAAE4awABOIwmVTwBgwACKlwAEwACJq4FGwABON8AATjsJgTwAYMAAiYAABMAAiayBRsAATk/AAE5YCZVQAGDAAImAAAIFwACJt4FGwABOXcAATl3AAE6KAAAAA8AATl/AAE6KAAAAAwMDwABOZQAABJVPYMAAipcAwABOdQAABIE8YMAAiYAAwABOgAAABJVQYMAAiYAAAGDAAImoAT8ECAHAAImqgADAQ7Z4CAHAAImrgQDAQ7aHCAHAAImsggDAQ7aWCQHAAE5dwACJhAAAAAAFwACJuIFGwABOj8AATo/AAE7bAMAAWdsAA8AATpjAAE7bAAAAAgICwABOngAABJVPYMAAipcAwABOrgAABIE8YMAAiYAAAGDAAImoAT8ECAHAAImqgADAQ7cICAHAAImrgQDAQ7cXCADAAImsH8AATsvAAImnAAAAAAkBwABOj8AAiYQAAAAABgbAAImugUbAAE7gwABO6cAATxABAMAAWdwAAAABA8AATvHA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AggBwACK14AAwEQITwkBwACJR8AAip0AAAAABgbAAIrZgUbAAIlmwACJaMAAiasAAJQOAAAAAQPAAIlxwACJqwAAAQAAgf1gwAD1xQFbAQEBwACJgQAAAJaJXcAAiEMBXwAAAABfAAABSsAAiY0BHMAAiZWAwACJjcBECLnAAEcjAQABLgDAAIh1BsAAitqBRsAAibDAAImywACKDwAAlRAAAAABA8AAib/AAIoPAAACAACT3GDAAPXFAVsAAIOZYMAA9cUBWwICAsAAidMAAACWiV3AAIjQAl8AAF8BAADAAIneAAAAlRFfAQAAAF8AAAFKwACJ7AEcwACJ9IDAAInswEQJMsAARyMCAAIugcAAigvARAlIAMAAiQIGwACK24FGwACKFMAAihnAAIpkAACUDwAAAAEDwACKKcAAimQAAAEAAIH9YMAA9cUBWwEBAcAAijkAAACWiV3AAIhDAV8AAAAAXAE+AT0cwACKURbAAIpILsAAR7vAAIrXlA4BAV8AAAGAwACKWMBECbkAwACJaAbAAIrcgUbAAIppwACKbsAAis4AAMAAWdUAAAABA8AAioLAAIrOAAACAACT3GDAAPXFAVsAAIOZYMAA9cUBWwICAsAAipYAAACWiV3AAIjQAl8AAF8BAADAAIqhAAAAlRFfAQAAAFwBPgE9HMAAirUWwACKrC7AAEe7wACK15UQAgJfAABfAQACgMAAir3ARAo9gcAAisbARApTAMAAiWoGwACK3oFGwACK08AAit/AAIsEAADAAEvBwACIMAAAAAEDwACK5cAAiwQAAAAAAAAAYMAAitUBSsAAiusBH8AAiu/AAIriAQABFsAAivsuwABHu8AAitcABsAAiuCBRsAAiwnAAIsRwACLKwEAwABZ6QAAAAEDwACLIcAAiysAAAAAAAAAYMAA9HkBSsAAiyQBGsAAiyTAAKqAAABECIQARAjyAEQJhABECfsARAqbAEQK8wBECzUAAAAGAsAAiuOBRsAAizDAAIs2wACPQQPAAFnwAAABYMAAipcAAAMEwACK5YFGwACLacAAi3UJwABG5QBgwACKlwAEwACK5oFGwACLhsAAi4gJpL4AYMAA9l0ABMAAiueBRsAAi8nAAIvOCYCKAGDAAIqXAAIFwACK84FGwACMAsAAjALAAIxMAAAAA8AAjAzAAIxMAAAAAgIC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AAYGwACMaIFGwADU88AA1PXAANVJAACUDgAAAAEDwADU/sAA1UkAAAEAAIH9YMAA9cUBWwEBAcAA1Q4AAACWiV3AAIhDAV8AAAAAXwAAAUrAANUgARzAANUogMAA1SDARGsPwABHFgEAAS4AwACIfQbAAIxpgUbAANVOwADVUMAA1bgAAJUQAAAAAQPAANVdwADVuAAAAgAAk9xgwAD1xQFbAACDmWDAAPXFAVsCAgLAANVxAAAAloldwACI0AJfAABfAQAAwADVfAAAAJURXwEAAABfAAABSsAA1YoBHMAA1ZKAwADVisBEa4jAAEcWAgACLoHAANW0wERrngDAAIkKBsAAjGqBRsAA1b3AANXCwADV7AAAlA8AAAABA8AA1dLAANXsAAABAACB/WDAAPXFAVsBAQHAANXiAAAAloldwACIQwFfAAAAAFwBPgAGwACMa4FGwADV8cAA1fbAANYvAADAAFnVAAAAAQPAANYKwADWLwAAAgAAk9xgwAD1xQFbAACDmWDAAPXFAVsCAgLAANYeAAAAloldwACI0AJfAABfAQAAwADWKQAAAJURXwEAAABcAT4ABsAAjG2BRsAA1jTAANZLwADWgQAAwABLwcAAiDAAAAABA8AA1lHAANaBAAAAAAAAAGDAAIxkAUrAANZXAR/AANZbwACMcQEAARbAANZyLsAAQlTAAIxmAAbAAIxvgUbAANaGwADWjsAA1qgBAMAAWekAAAABA8AA1p7AANaoAAAAAAAAAGDAAPR5AUrAANahARrAANahwACqgAAARGraAERrSABEa9oARGwnAERskQBEbOkARG0rAAAABgLAAIxygUbAANatwADWs8AA2LU3wABaEgAAAWDAAIvkAAFgwACMVgABBcAAjHgAAAAABAAAAwAAAAAAAAAAAGDAAIxyAT8BCQAAwACL6wAAAAADBsAAjHSBRsAA0+XAANPpwADT9wECwABCVAAAAAEDwADT98AA0/cAAAAAAAAAWwAGwACMdYFGwADT/MAA1AXAANQoAQC1xgAAAAEDwADUDcAA1CgAAAAAAAAAYMAA8rMBSsAA1BABJcAA1B8WwADUEC7AAEJUwACMWGDAAPZdBsAAjHaBRsAA1C3AANQ2wADUWwEAtcQAAAABA8AA1EPAANRbAAAAAAAAAGDAAPKzAUrAANRGASXAANRVFsAA1EYuwABCVMAAjFhgwAD0eQAARG2fAERtzgBEbh0ARG5sAAAAAwLAAIx5gUbAANatwADWs8AA2LUDwABaEwAAAWDAAIxyAAABBMAAjHuBRsAA1vfAANcFCcAAQlQAWwABBcAAjISBRsAA1wrAANcKwADXMgAAAAPAANcdwADXMgAAAAEBAcAA1yMAAATAAEJUWwAAYMAAjHkBPwIIAcAAjHuAAMBEbuEJAcAA1wrAAIx4AAAAAAUGwACMfYFGwADXN8AA1znAANeEAACUDgAAAAEDwADXQsAA14QAAAEAAIH9YMAA9cUBWwEBAcAA11IAAACWiV3AAIhDAV8AAAAAXwAAAUrAANdeARzAANdmgMAA117ARG9HwABHGAEAAS4AwACIfgbAAIx+gUbAANeJwADXi8AA1/AAAJUQAAAAAQPAANeYwADX8AAAAgAAk9xgwAD1xQFbAACDmWDAAPXFAVsCAgLAANesAAAAloldwACI0AJfAABfAQAAwADXtwAAAJURXwEAAABfAAABSsAA18UBHMAA182AwADXxcBEb8DAAEcYAgACLoHAANfswERv1gDAAIkLBsAAjH+BRsAA1/XAANf6wADYJAAAlA8AAAABA8AA2ArAANgkAAABAACB/WDAAPXFAVsBAQHAANgaAAAAloldwACIQwFfAAAAAFwBPgAGwACMgIFGwADYKcAA2C7AANhnAADAAFnVAAAAAQPAANhCwADYZwAAAgAAk9xgwAD1xQFbAACDmWDAAPXFAVsCAgLAANhWAAAAloldwACI0AJfAABfAQAAwADYYQAAAJURXwEAAABcAT4ABsAAjIKBRsAA2GzAANiAwADYswAAwABLwcAAiDAAAAABA8AA2IbAANizAAAAAAAAAGDAAIx5AUrAANiMAR/AANiQwACMhAEAARbAANikLsAAQlTAAIx7AAAARG8SAERvgABEcBIARHBfAERwyQBEcSEAAAAFAsAAjIWBRsAA2LjAANi+wADbkDfAAFoUAAABYMAAipcAAWDAAIxWAAEFwACMiwAAAAAEAAADAAAAAAAAAAAAYMAAjIUBPwEJAADAAIqdAAAAAAMGwACMh4FGwADT5cAA0+nAANP3AQLAAEJUAAAAAQPAANP3wADT9wAAAAAAAABbAAbAAIyIgUbAANP8wADUBcAA1CgBALXGAAAAAQPAANQN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RRrAAFgwwACNRRrAAFg3wACNRRrAAFg+wACNRRrAAFhFwACNRRrAAFhMwACNRRrAAFhTwACNRRrAAFhawACNRRrAAFhswACNRRrAAFhzwACNRBrAAFh/wACNRBrAAFiLwACNRRrAAFiSwACNRRrAAFiZwACNRBrAAFixwACNRRrAAFi4wACNRRrAAFi/wACNRRrAAFjGwACNRRrAAFjNwACNRRrAAFjUwACNRRrAAFjbwACNRRrAAFjiwACNRRrAAFj2wACNRRrAAFj9wACNRRrAAFkEwACNRRrAAFkLwACNRRrAAFkSwACNRRrAAFkZwACNRRrAAFkgwACNRRrAAFknwACNRRrAAFk7wACNRRrAAFlCwACNRRrAAFlJwACNRBrAAFliwACNNhrAAFlqwACNRRrAAFlxwACNQxrAAFl3wACNMxrAAFl+wACNNhrAAFmGwACNNhrAAFmOwACNRRrAAFmkwACNORrAAFmswACNOhrAAFm0wACNNhrAAFm8wACNNhrAAFnEwACNPxrAAFnLwACNNhrAAFnTwACNOBrAAFnYwACNNhrAAFnwwACNNBrAAFn5wACNNBrAAFoCwACNNBrAAFoLwACNNBrAAFoUwACNNBrAAFoqwACNNBrAAFozwACNNBrAAFo8wACNNBrAAFpFwACNNBrAAFpOwACNNBrAAFpkwACNQRrAAFprwACNQhrAAFp2wACNNhrAAFp+wACNNhrAAFqGwACNNhrAAFqOwACNQBrAAFqVwACNRRrAAFqrwACNMxrAAFqywACNMxrAAFq5wACNMxrAAFrAwACNMxrAAFrHwACNMxrAAFrOwACNMxrAAFrVwACNMxrAAFrcwACNMxrAAFrzwACNMxrAAFr6wACNMxrAAFsBwACNMxrAAFsIwACNMxrAAFsPwACNMxrAAFsWwACNMxrAAFsdwACNMxrAAFskwACNMxrAAFs7wACNMxrAAFtCwACNMxrAAFtJwACNMxrAAFtQwACNMxrAAFtXwACNMxrAAFtewACNMxrAAFtlwACNMxrAAFtswACNMxrAAFuDwACNMxrAAFuKwACNMxrAAFuRwACNPRrAAFuawACNRRrAAFuhwACNPhrAAFuqwACNNhrAAFuywACNMxrAAFu5wACNRRrAAFvQwACNMxrAAFvXwACNMxrAAFvewACNMxrAAFvlwACN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g1HARNbJTwEAAYLAAINcwETXfQDAAPUuPgNOwACDisAAg5cAAMAATilgwAD2XQEWwACDmS7AAFpOwACNLD0cwACDri7AAFp1AQABGsAAg73AAI0zAMAAjVU9HMAAg9aAwACDz8BE1slPAQABH8AAg97AAIt9AQABgcAAg+jARNfvAADAAPUuScAAhAocwACEDi7AAFp2AQABGsAAhB3AAI0/AMAAjVZCwACEJQE/PRzAAIQ3LsAAWnUBAAEawACERsAAjToAwACNVULAAIRXAD9OwACEfgAAALXUYMAAi6UAScAAhJEcwACElS7AAFp7AQABJ5kkAMAAjVk+AUnAAIS0HMAAhLguwABaewEAASeDPgDAAI1ZPgE9icAAhNXARNimIMAAhOvAAIuvAAAAAD4BPYnAAIUdwETYpiDAAIUzwACLrgAAAABJwACFXRzAAIVhLsAAWnsBAAEnmSIAwACNWT4CScAAhX8hHMAAhYQuwABaewEAASeDPgDAAI1ZPRzAAIWXLoLoAQABJ8AAWoUAwACNWj89icAAhc3ARNimIMAAhePAAIuwAAAAAD4BPYnAAIYQwETYpiDAAIYmwACLrQAAAAA9HMAAhkYuwABadQEAARrAAIZVwACNOwDAAI1VTsAAhmjAAIZuAACZbmDAAImFARzAAIZwLsAAVmIAAAAAwACNb0rAAIaCAR/AAIaNwACLpAMAAoDAAIaRwETWyYLAAIaZwETZuAG11IHAAIavwETYpgbAAI1fgZTAAIbGwACG0cAAi3MAAMAAWn8AAAABA8AAhufAAItzAAAAAAAAAGDAAIqXAT4DTsAAhv/AAIcKAADAAESWXcAA9R0BYMAAjEkBMcAAhxZgwACMSQBBRcAAhx4AAAA+CUnAAIcvHMAAhzMuwABadgEAARrAAIdCwACNPADAAI1WQsAAh0sAP07AAIetAAAApyFgwACL5ABOwACHyMAAh9MAAJxKYMAA9l0BFsAAh9UuwABaTsAAjSxJwACH5hzAAIfqLsAAWnYBAAEawACH+cAAjTMAwACNVj4BPYnAAIgLwETamh/AAIgewACMBwEAASTAAIg7AyeDZILAAIgvwETaqieDZABJwACISxzAAIhPLsAAWnYBAAEawACIXsAAjTUAwACNVj4BPYnAAIhxwETamh/AAIiEwACMBwEAAYLAAIiSwETaqgBJwACIrBzAAIiwLsAAWnYBAAEawACIv8AAjTYAwACNVj4BPYnAAIjnwETamh/AAIj6wACMBwEAASTAAIkXAyeDZILAAIkLwETaqieDZABJwACJJxzAAIkrLsAAWnYBAAEawACJOsAAjUMAwACNVj4ETsAAiU/AAIleAADAAEJUWwEcwACJYC7AAFp8AAAAAMAAjVtOwACJicAAiZ0AAMAAWoZgwACMeQEfwACJr8AAjIQBAAGDwACJw8BE28sAPRzAAInvFsAAidwuwABaUMAAjTFPAQABhMAAifPARNvuAMAA9S49icAAihHARNqahMAAiiDARNvuPgE9HMAAikwugugBAAEnwABahwDAAI1aPRzAAIp7LsAAWnUBAAEawACKisAAjUEAwACNVU7AAIqjwACKqQAAgIpgwACKlwEcwACKqy7AAFqAAAAAAMAAjWg9HMAAis+AwACKxMBE2kJPAQABH8AAitfAAIxVAgACgcAAiuDARNqag8AAiu7ARNyGAADAAPUuScAAiv0cwACLAS7AAFp2AQABGsAAixDAAI08AMAAjVZCwACLGQA/PRzAAIsmLsAAWnUBAAEawACLNcAAjT8AwACNVUrAAItHAR/AAItSwACMSAEAAYDAAItkwETaQgAGwACNYIGUwACLeMAAi4PAAI0VAADAAFqIAAAAAQPAAIuOwACNFQAAAAAAAABgwACKlwE+A07AAIuiwACLqwAAhDxgwACKlwEcwACLrS7AAFaAAAAAAMAAjVxBQ8AAi8EpPgFJwACL1hzAAIvaLsAAWnYBAAEawACL6cAAjTgAwACNVj4BPYjAAIv5wETddhzAAIwELsAAWokBAAGAwACMDsBE3XYAwACNYknAAIwmHMAAjCouwABadgEAARrAAIw5wACNPQDAAI1WPgNOwACMWMAAjGEAAMAAWopgwACKlwEcwACMYy63GgAAAADAAI1pPRzAAIx+LsAAWnUBAAEawACMjcAAjT4AwACNVT2IwACMn8BE3XYfwACMrsAAi78CAAKAwACMvcBE3XaBwACMx8BE3g0APgFCwACM6QBKwACNAgGAwACNCcBE3XYGwACNYYGUwACNGsAAjSXAAJFiAADAAFqLAAAAAQPAAI0uwACRYgAAAAAAAABgwACKlwE+BE7AAI08wACNSAAAmFBgwADyswEcwACNSi7AAFp7AQABJ5laAMAAjVlOwACNbsAAjXcAAIQ8YMAAipcBHMAAjXkuwABaiAAAAADAAI1gQUPAAI2MKT4BScAAjaEcwACNpS7AAFp2AQABGsAAjbTAAI05AMAAjVY+BE7AAI3NwACN1wABVF3AAPUdAWDAAIqXATHAAI3lYMAAipcAScAAjfEhHMAAjfYuwABadgEAARrAAI4FwACNOgDAAI1WPgFBQ8AAjhopPgROwACOQMAAjkkAAB9gwACKlwEcwACOSy7AAFqAAAAAAMAAjWg9HMAAjnSCwACOasBE3ztPAQABg8AAjnjARN+KAMAA9S5JwACOjxzAAI6TLsAAWnYBAAEawACOosAAjToAwACNVkLAAI6rAT89HMAAjr4uwABadQEAARrAAI7NwACNPwDAAI1VPz2JwACO88BE3usjgMAAjv7ARN7DH8AAjxzAAIslAgACgcAAjyDARN7rgsAAjyrARN87AB/AAI9HwACLHQIAAoHAAI9MwETe64LAAI9WwETfOwABYMAAiw89iMAAj2rARN7DKknAAI+MIiGAwACPkcBE3sMAHMAAj6AuwABadgEAARrAAI+vwACNPQDAAI1WPgNOwACPzsAAj9cAAMAAWopgwACKlwEcwACP2S63GgAAAADAAI1pPRzAAI/0LsAAWnUBAAEawACQA8AAjT4AwACNVT2JwACQFcBE3usfwACQJMAAi78CAAKBwACQM8BE3uuCwACQPcBE4KQAScAAkFUiIYDAAJBawETewwAcwACQaS7AAFp2AQABGsAAkHjAAI04AMAAjVY+AT2JwACQiMBE3uscwACQky7AAFqJAQABgcAAkJ3ARN7rAMAAjWI+AknAAJDygMAAkPbARN7DPRzAAJEDLoLoAQABJ8AAWowAwACNWj9CwACRNgBKwACRTwGBwACRVsBE3usGwACNYoGUwACRZ8AAkXLAAJRXAADAAFqJAAAAAQPAAJF7wACUVwAAAAEBAcAAkYcAAACEPGDAAIqXAABgwACKlwE+BEnAAJGXHMAAkZsuwABadgEAARrAAJGqwACNQwDAAI1WPgROwACRvcAAkcwAAMAAQlRbARzAAJHOLsAAWnwAAAAAwACNW07AAJH2wACR/wAAtmZgwACMowEfwACSBcAAjLABAAGBwACSGsBE4gMAPRzAAJJEFsAAkjEuwABaUMAA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HMAApCuCwACkJMBE71EgAQABg8AApCzARPBLAABKwACkQQEfwACkTMAAitQBAAGBwACkZMBE7ycABsAAjWyBlMAApHzAAKSHwAClLAAAwABamgAAAAEDwACkpsAApSwAAAAAAAAAYMAAipcBPgFJwACkrxzAAKSzLsAAWnsBAAEng+sAwACNWT4BSsAApNABHMAApNcuwABalwAAAADAAI1qPgFKwAClCgEcwAClES63GgAAAADAAI1pBsAAjW2BlMAApTHAAKU8wACmJAAAkkcAAAABA8AApUbAAKYkAAAAAAAAAGDAAIqXAT4DTsAApVrAAKVlAACSR2DAAIqXARzAAKVnLsAAWpoAAAAAwACNbEnAAKWOIiEcwAClnxbAAKWSLsAAWk3AAI0rQQEAARrAAKWiwACNMgDAAPWcASEcwAClsxbAAKWqLoFAwACNLkEBAAEWwACluhbAAKW2LsAAQdTAAI0wWsAA9mEAwAD1nD4BPRzAAKXKLoLoAQABJMAApgICJ8AAWpsewACl4sAAjVABAAEWwACl8y7AAFpNwACNKwAAwACNWj9KwACmDwGAwACmFsBE8V4GwACNboGUwACmKcAApjPAAKczAACSUAAAAAEDwACmPMAApzMAAAAAAAAAYMAAiYABPgNOwACmT8AAplkAAJJQYMAAiYABHMAAplsuwABWXQAAAADAAI1wScAApnEiIRzAAKaCFsAApnUuwABaTcAAjStBAQABGsAApoXAAI0yAMAA9ZwBIRzAAKaWFsAApo0ugUDAAI0uQQEAARbAAKadFsAAppkuwABB1MAAjTBawAD2YQDAAPWcPgE9HMAApq0ugugBAAEkwACm5QInwABamx7AAKbFwACNUAEAARbAAKbWLsAAWk3AAI0rAADAAI1aP0rAAKcfAYDAAKcmwETyXwbAAI1vgZTAAKc4wACnPsAAqB0AAMAAVmIAAAABA8AAp0jAAKgdAAAAAAAAAGDAAImFAT4DTsAAp2HAAKdsAACVpV3AAPUdAWDAAImAATHAAKd5YMAAiYAAQ8AAp4IhHMAAp4ouwABadgEAARrAAKeZwACNPADAAI1WPgJOwACntMAAp74AAJJQYMAAiYABHMAAp8AuwABWXQAAAADAAI1wPRzAAKfjgMAAp9jARPNiTwEAAYHAAKfnwETzqQDAAPUuSsAAp/0B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ALByAR/AALB9wACJnQEAAYHAALCRwET5RgAGwACNcYGUwACwpcAAsK/AALFaAADAAFqcAAAAAQPAALC6wACxWgAAAAAAAABgwACJgAE+BEnAALDDHMAAsMcuwABaeAAAAADAAI1YSsAAsNoBH8AAsOXAAIoUAAAAAD9OwACw/sAAsQkAAJJHYMAAipcBHMAAsQsutxoAAAAAwACNaT0cwACxIi7AAFp3AAAAAMAAjVdKwACxOQEfwACxRMAAihQBAAGAwACxS8BE+3cABsAAjXKBlMAAsV/AALFpwACyFQAAwABaqAAAAAEDwACxc8AAshUAAAAAAAAAYMAAiYABPgROwACxgcAAsYkAALH1YMAA8rMBHMAAsYsuwABaewEAASeDPgDAAI1ZTsAAsa3AALG4AACSR2DAAIqXARzAALG6LrcaAAAAAMAAjWk9HMAAsdEuwABadwAAAADAAI1XSsAAsegBH8AAsfPAAIqWAgACgcAAsf3ARPwmgMAAsgnARPv+AAbAAI1zgZTAALIawACyJMAAsuUAAMAAWp0AAAABA8AAsi7AALLlAAAAAAAAAGDAAImAAT4EScAAsjcWwACyOy7AAFpPwACNLz0cwACySy6C6AEAASfAAFqrAMAAjVo/TsAAsorAALKVAACSR2DAAIqXARzAALKXLrcaAAAAAMAAjWk9HMAAsq4uwABadwAAAADAAI1XSsAAssUBH8AAstDAAIogAQABgMAAstbARPzgAAbAAI10gZTAALLqwACy9MAAs+gAAMAAWp4AAAABA8AAswjAALPoAAAAAQEBwACzCQAAAJhQWwAAYMAAiYABPgROwACzIMAAsysAAJxKYMAA9l0BFsAAsy0uwABaTsAAjSxJwACzPCIhFsAAs0EuwABaT8AAjS8AHMAAs1MuwABadgEAARrAALNiwACNMwDAAI1WPgI9HMAAs3IuwABadwAAAADAAI1XSsAAs4sBJsAAs4sBHMAAs52AwACzksBE/V0gAQABgcAAs57ARP1yAABgwACJgD89HMAAs7UuwABadwAAAADAAI1XSsAAs8wBJsAAs8wBHMAAs96AwACz08BE/V0gAQABKwAAYMAAiYAGwACNdYGUwACz7cAAs/fAALW/AADAAFqfAAAAAQPAALQGwAC1vwAAAAAAAABgwACJgAE+BT0cwAC0Dy7AAFp1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AMVGwACNPADAAI1VSsAAxVMBH8AAxV7AAIpIAgACgMAAxWXARQuhgcAAxWrARQv8AAbAAI1+gZTAAMV7wADFgcAAxmQAAMAAWq4AAAABA8AAxYvAAMZkAAAAAAAAAGDAAIovAT4GPRzAAMWULsAAWnUBAAEawADFo8AAjTkAwACNVU7AAMW8wADFxgAAtxFgwACKngEcwADFyC7AAFqDAAAAAMAAjXc9HMAAxeguwABadQEAARrAAMX3wACNOgDAAI1VPRzAAMYELsAAWnUBAAEawADGE8AAjTsAwACNVU7AAMYmwADGKwAAkkxgwACJhQEcwADGLS7AAFZiAAAAAMAAjW9KwADGPwEfwADGSsAAijsCAAKAwADGUMBFDROBwADGW8BFDXAAAABEtFUARLTNAES1RQBEta4ARLhBAES4uwBEuWMARL0eAETK4gBEy5MARMwnAETMjABEzXIARM4EAETOZQBEz5wARNWUAETWkwBE2gwARN1AAETejQBE4ZwARONgAETkewBE5fEAROd4AETqygBE6/IARO2JAETuYwBE7uAARPCpAETxKgBE8isARPMsAET0CgBE+xYARPvIAET8gABE/TEARP5AAET/iwBFA4AARQSzAEUFYgBFBvMARQk5AEUKEwBFC08ARQzBAEUNuQAAADICwACNgYGUwADGacAAxm/AAMipA8AAWrMAAQAAgf1gwACJYAFgwACJYAFgwAD1xQABXcAA9RYBXwAABATAAI2DgZTAAMa6wADGwFiC/QBdwAD1FgFfAAAABMAAjYSBlMAAxsbAAMbPWIE+AF8AAAAEwACNhYGUwADG2MAAxu8YwABatABgwADyswEqBMAAjYaBlMAAxvjAAMcNGMAAWrUAYMAA8rMBKgEFwACNjIGUwADHEsAAxxLAAMdCAAAAA8AAxyXAAMdCAAAAAgICwADHKwAABIL9XcAA9RYBXwAAAMAAxzgAAASBPl8AAAAAXcAAjYEBXwAAAT8DCAHAAI2DgADARQ9XCAHAAI2EgQDARQ9qCQHAAMcSwAD12wAAAAACBsAAjYiBlMAAx0fAAMdMwADISgAAVgAAAAEDwADHVMAAyEoAAAAAAAAAYMAA8rMBPgFJwADHXSEWwADHYi7AAFq1wACNhj4CPRfAAMd5LsAAWrUpwACNhkrAAMeVARzAAMejFsAAx5wu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ucBFQHqAsMAAimaBwABFy8BFQI8AwACN8cAAjow9HMAARdYuwABa1AEAARbAAEXqgMAARd7ARUB6kk/AAIpnAMAAjdQ9HMAARfkuwABaygAAAADAAI3HBsAAjfOBksAARgvAAEYLwABJigAAwABa2QAAAAEDwABGIMAASYoAAAAEAgLAAEYsAAAAg7JgwACKlwDAAEY2AAAAwABa6GDAAPR5AALAAEZWAAAAwABa12DAAPKzASvAAEZpAAAAwABa2GDAAPKzAStbAT4CTsAARorAAEabAADAAFrpYMAA8rMBIiIiIRzAAEbRgcAARr7ARUHeQQEAARrAAEbUwACqcQDAAPWcABzAAEcHFsAARveAwABG8sBFQc/AAFnpwACKmVwBAAGBwABHCcBFQd4AwAD1pgEiIoLAAEdjwEVB8AAlwABHeIDAAEdzwEVBz2DAAIsmABzAAEeNFsAAR4oUwABHhcBFQc8AAWDAAIsmpL7AAIsoQQEAASeZbQDAAPZsASKDwABH98BFQgIAIiIlwABIJIDAAEgfwEVBz2DAAIuGASXAAEhRgMAASEzARUHPYMAAi5UBJcAASHSAwABIb8BFQc9gwACMOknAAEiQhMAASJTARUIZPgU9F8AASK4uwABavyrAAI26PRfAAEjHLsAAWsAqwACNuz0cwABI5y5oAQABJ4OcAMAAjck9HMAASPcunxoBAAGAwABI/cBFQc8AwACN1T0cwABJCi5oAQABJ4LaAMAAjck+Az0XwABJJy7AAFq/gsAASTPARUHwwACNuj0XwABJRy7AAFrAg8AASVrARUICwACNuz0cwABJdS6fGgEAAYDAAEl7wEVBzwDAAI3VBsAAjfSBksAASY/AAEmbwABOAAAAwABHSwEawABJkMAA7ksAAAEDwABJt8AATgAAAAABAQHAAEnQAAAAgxRgwACKxgAAWwE+Az0cwABJ3C5oAQABJ8AAWuoAwACNyU7AAEn4wABJ/gAAloddwAD1HQFgwACJYAEWwABKBYDAAEoAwEVEBsAAR03AAIrIScAAShcWwABKGy7AAFq/wACNuj4BPRzAAEouLsAAWtUEAAKBwABKQsBFRDAawABKScAAqnICwABa1xbAAEptLsAAWr/AAI26wABa2CrAAI3WPgVOwABLOcAAS0MAAMAAWutgwADyswEiHMAAS1IWwABL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AAAAAQPAAEVDwABGcAAAAAEBAcAARU8AAACDsmDAAIrjAABeAAEBAVsAAVfAAIgzAFsBPgROwABFaMAARXkAAMAAW1BeAAEBAVsAAVfAAIgzAFsBHMAARXsunxoBAAEWwABFhoDAAEWBwEXcD8AARuXAAIrlAMAAjrtOwABFoMAARaMAAKS+YMAA9l0BFsAARaqAwABFpcBF3A+kvsAAiuZOwABFv8AARckAAMAAW11eAAEBAVsAAVfAAIgzAFsBHMAARcsuwABbMQEAARbAAEXegMAARdnARdwPgIrAAIrnAMAAjrxKwABF6gE0wABF8QPAAEXxwABGbAAAAAEBAcAARfIAAABUWwAAYMAAiuMBPgFKwABGBQEfwABGEMAAivQDAAMmwABGPwEcwABGP4HAAEYvwEXcMiABAAGEwABGQMBF3PwAAGDAAIqXgsAARkzARdx3JsAARlkBHMAARlmDwABGUMBF3J4gAQABhMAARlrARdz8AABgwACKlwAGwACO5YGTwABGdcAARoLAAEe5AADAAEdOAAAAAQPAAEadwABHuQAAAAEBAcAARrUAAACDsmDAAIr1AABeAAEBAVsAAVfAAIgzAFsBPgNOwABGzsAARt4AAMAAW1ZeAAEBAVsAAVfAAIgzAFsBHMAARuAunxoBAAEWwABG64DAAEbmwEXdp51mwACK9wDAAI67TsAARwrAAEcUAADAAFtdXgABAQFbAAFXwACIMwBbARzAAEcWLsAAWzEBAAEWwABHKYDAAEckwEXdp4CKwACK5wDAAI68SsAARzUBNMAARzwDwABHPMAAR7UAAAABAQHAAEc9AAAAVFsAAGDAAIr1AT4BSsAAR1ABH8AAR1vAAIr+AgACJsAAR4wBHMAAR4yBwABHfcBF3cogAQABg8AAR43ARd5rAABgwACKnibAAEeiARzAAEeigsAAR5nARd4NIAEAAYPAAEejwEXeawAAYMAAipcABsAAjuaBk8AAR77AAEfLwABJDAAAtG8AAAABA8AAR9vAAEkMAAAAAQEBwABH6AAAAMAAWcxgwACK/wAAXgABAQFbAAFXwACIMwBbAT4ETsAASAHAAEgPAADAAFtKXgABAQFbAAFXwACIMwBbARzAAEgRLp8aAQABFsAASByAwABIF8BF3wuVT8AAiwEAwACOu07AAEg5wABIQgAAwABbS14AAQEBWwABV8AAiDMAWwEcwABIRC6fGgEAARbAAEhPgMAASErARd8LgTzAAIsCAMAAjrtOwABIZ8AASHUAAMAAW0xeAAEBAVsAAVfAAIgzAFsBHMAASHcunxoBAAEWwABIgoDAAEh9wEXfC5VQwACLAwDAAI67SsAASJIBNMAASJkDwABImcAASQgAAAABAQHAAEiaAAAAVFsAAGDAAIr/AUrAAEioAR/AAEiswACLDgMAAybAAEjFARzAAEjFgcAASLjARd8wIAEAAYTAAEjGwEXgEgAAYMAAipcmwABI4gEcwABI4oLAAEjawEXfcyABAAGEwABI48BF4BIAAGDAAIqXJsAASPwBHMAASPyDwABI78BF37YgAQABhMAASP3AReASAABgwACKlwAGwACO54GTwABJEcAASR7AAEmCAADAAEcoAAAAAQPAAEkmwABJggAAAAEBAcAASSsAAACDsmDAAIseAABeAAEBAVsAAVfAAIgzAFsBSsAASToBHMAASTouwABbXgIAAoDAAElKwEXg2jTAAElQA8AASVDAAEmBAAAAAgICwABJUQAAAIHTWwDAAElZAAAAVFsAAGDAAIseAUrAAElnAR/AAElrwACLJQIAAibAAElvAYHAAElvwEXhKmDAAIqXJsAASXcBgsAASXfAReE1XcAA9R0BYMAAipcAAMAAjukGwACO6IGTwABJh8AASZTAAEn7AADAAEbxAAAAAQPAAEmdwABJ+wAAAAEBAcAASaMAAACDsmDAAIsPAABeAAEBAVsAAVfAAIgzAFsBSsAASbIBHMAASbIuwABbXgIAAoDAAEnCwEXhuDTAAEnIA8AAScjAAEn6AAAAAgICwABJyQAAAIHTWwDAAEnRAAAAVFsAAGDAAIsPAUrAAEnfAR/AAEnjwACLHQIAAibAAEnoAYHAAEnowEXiCGDAAIqXJsAASfABgsAASfDAReITXcAA9R0BYMAAipcAAMAAjukGwACO6YGTwABKAMAASg3AAE0CAADAAFteAAAAAQPAAEocwABNAgAAAAICAsAASiIAAACDsmDAAIsPAMAASigAAACn9WECW1tbAABeAAEBAVsAAVfAAIgzAFsBPgNOwABKVsAASmEAAMAAW19eAAEBAVsAAVfAAIgzAFsBHMAASmMunxoBAAEWwABKboDAAEppwEXiloHTwACLEQDAAI67TsAASpLAAEqhAADAAFtgXcAA9NsBXgABAQFbAAFXwACIMwBbARzAAErYHMAASroWwABKsIDAAEqrwEXillTAAIsSgJ8BAV4AAQEBWwABV8AAiDMAWwEWwABKvi7AAFs5wACOwwDAAPTmgKEAAAAAwAD08UrAAEtEATTAAEtLA8AAS0vAAEz+AAAAAQEBwABLTAAAAFRbAABbAT4ETsAAS2TAAEtrAACB02DAAIlgASbAAEtkARzAAEt3gsAAS23AReLIIAEAAYTAAEt4wEXjlwAAYMAAiWBOwABLm8AAS6kAAMAAW2FdwAD1HQFgwACKlwExwABLt2DAAIqXAEbAAEvBwABL88AAS9MAAACfPF4AAQEBWwABV8AAiDMAWwCDwABL48BF4ws+Ak7AAEwBwABMCAAAgRBbARzAAEwWh8AATArAReQQIAEAAYTAAEwXwEXjlwAAScAATCslwABMNhTAAEwvwEXkNQgAXcAA9NsBWz4BPRzAAExdhsAATE/ARePigJkBAAEmwABMZAEUwABMZMBF5DUIAV3AAPTbAVtdwAD02wFgwACKlwDAAPUvPgE9HMAATJaGwABMiMBF4+JPAQABJsAATJoBFMAATJrAReQ1CABgwACKlwDAAPUuSsAATLsBHMAATMiBwABMwsBF4qUgAgAChcAATMnAReOnHMAATN+GwABM0cBF4+KAoQEAAAGTDyrAAPTxAAAGwACO6oGTwABNB8AATRTAAE4FAAC0UwAAAAEDwABNH8AATgUAAAABAQHAAE0nAAAAg7JgwACLJgAAXgABAQFbAAFXwACIMwBbAT4ETsAATUDAAE1JAADAAFtiXgABAQFbAAFXwACIMwBbARzAAE1LLp8aAQABFsAATVaAwABNUcBF5VKVS8AAiykAwACOu07AAE1uwABNeAAAwABbY14AAQEBWwABV8AAiDMAWwEcwABNei6fGgEAARbAAE2FgMAATYDAReVSlUzAAIsqAMAAjrtOwABNmMAATZsAAKS+YMAA9l0BFsAATaKAwABNncBF5VKkvsAAiyhKwABNqgE0wABNsQPAAE2xwABOAQAAAAEBAcAATbIAAABUWwAAYMAAiyYBSsAATcgBH8AATczAAIs2AwADg8AATdPAReX7JsAATd8BHMAATd+BwABN18BF5XUgAQABhMAATeDAReY7AABgwACKlybAAE31ARzAAE31gsAATezAReW4IAEAAYTAAE32wEXmOwAAYMAAipcABsAAjuuBk8AATgrAAE4XwABOxAAAwABHLgAAAAEDwABOIsAATsQAAAABAQHAAE4qAAAAg7JgwACLNwAAXgABAQFbAAFXwACIMwBbAT4DTsAATkPAAE5PAADAAFtkXgABAQFbAAFXwACIMwBbARzAAE5RLp8aAQABFsAATlyAwABOV8BF5uQfwACLOgDAAI67TsAATnLAAE51AACkvmDAAPZdARbAAE58gMAATnfARebkpL7AAIs5SsAAToQBNMAATosDwABOi8AATsAAAAABAQHAAE6MAAAAVFsAAGDAAIs3AUrAAE6aAR/AAE6ewACLRQIAAoLAAE6lwEXnSSbAAE60ARzAAE60gcAATqnARecHIAEAAYPAAE61wEXniQAAYMAAipcABsAAjuyBk8AATsnAAE7WwABPhgAAwABHKwAAAAEDwABO4sAAT4YAAAABAQHAAE7rAAAAg7JgwACLRgAAXgABAQFbAAFXwACIMwBbAT4DTsAATwTAAE8QAADAAFtkXgABAQFbAAFXwACIMwBbARzAAE8SLp8aAQABFsAATx2AwABPGMBF6AofwACLSQDAAI67TsAATzPAAE82AACkvmDAAPZdARbAAE89gMAATzjARegKpL7AAItISsAAT0UBNMAAT0wDwABPTMAAT4IAAAABAQHAAE9NAAAAVFsAAGDAAItGAUrAAE9bAR/AAE9fwACLVAIAAoLAAE9nwEXobybAAE92ARzAAE92gcAAT2vARegtIAEAAYPAAE93wEXorwAAYMAAipcABsAAju2Bk8AAT4vAAE+YwABP7QAAwABHTwAAAAEDwABPqMAAT+0AAAABAQHAAE+1AAAAg7JgwACLYgAAXgABAQFbAAFXwACIMwBbAUrAAE/EATTAAE/EA8AAT8TAAE/tAAAAAQEBwABPxQAAAFRbAABgwACLYgFKwABP0wEfwABP18AAi2sBAAEWwABP6IDAAE/jwEXpMICwwACLVwAGwACO7oGTwABP8sAAT//AAFAwAACwRgAAAAEDwABQCMAAUDAAAAABAQHAAFAOAAAAg7JgwACLfgAAXgABAQFbAAFXwACIMwBbAUrAAFAXATTAAFAXA8AAUBfAAFAwAAAAAQEBwABQGAAA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hvyH5AAAAAICAocVAAAAg7JgwACMywCHIAAAIJURYMAAiWAAAGDAAPKzAT4DSYcrISWHM4GHL8BGCcdgwACMy0qHUAEch1cuwABbbwIAAoCHXsBGCbqBh2TARgnHAMAAjxU/ToeGh4wAAIObYMAAjMsBJoeGAYGHjsBGCcdgwACMy0qHlwEch54uwABbcAQABICHqcBGCboWh7SAh6/ARgm6wABCVMAAjM2Ch8TARgoUFofRgofLwEYKFMAAQlTAAIzNAMAAjxYGwACPHIGVh+mH+oj2AADAAEcbARqH6sAA7ksAAAEDiBSI9gAAAAICAogrAAAAg7JgwACMuACINgAAIJURYMAAiWAAAGDAAPKzAT4DSYhBISWISYGIRcBGCq5gwACMuEqIZAEciGsuwABbbwIAAoCIcsBGCqGBiHjARgquAMAAjxU/ToiYiJ4AAIObYMAAjLgBJoiYAYGIoMBGCq5gwACMuEqIqQEciLAuwABbcAQABICIu8BGCqEWiMaAiMHARgqhwABCVMAAjLqCiNbARgr7FojjgojdwEYK+8AAQlTAAIy6AMAAjxYGwACPHYGViPuJDIoEAADAAEcaARqI/MAA7ksAAAEDiSWKBAAAAAICAok7AAAAg7JgwACMowCJRgAAIJURYMAAiWAAAGDAAPKzAT4DSYlRISWJWYGJVcBGC5VgwACMo0qJcwEciXouwABbbwIAAoCJgcBGC4iBiYfARguVAMAAjxU/TommiawAAIObYMAAjKMBJommAYGJrsBGC5VgwACMo0qJtwEcib4uwABbcAQABICJycBGC4gWidSAic/ARguIwABCVMAAjKWCieTARgviFonxgonrwEYL4sAAQlTAAIylAMAAjxYGwACPHoGVigmKGosWAADAAEcZARqKCsAA7ksAAAEDijSLFgAAAAICAopLAAAAg7JgwACMjACKVgAAIJURYMAAiWAAAGDAAPKzAT4DSYphISWKaYGKZcBGDHxgwACMjEqKhAEciosuwABbbwIAAoCKksBGDG+BipjARgx8AMAAjxU/Toq4ir4AAIObYMAAjIwBJoq4AYGKwMBGDHxgwACMjEqKyQEcitAuwABbcAQABICK28BGDG8WiuaAiuHARgxvwABCVMAAjI6CivbARgzJFosDgor9wEYMycAAQlTAAIyOAMAAjxYGwACPH4GV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qibARixLwABG5cAAiuUWqj+CqjnARiylwABG5cAAiuUAwACPGAAcqlguwABbcAQABICqY8BGLEsWqm6AqmnARixLpL7AAIrmgqpywEYspRaqf4KqecBGLKWkvsAAiuYAwACPFgAcqo4uwABbdgIAAhaqnYCqmMBGLEuAisAAiucWqqqCqqTARiylgIrAAIrnAMAAjxgGwACPQYGVqrmqyqvAAADAAEdLARqqusAA7ksAAAEDquarwAAAAAICAqr/AAAAg7JgwACKxgCrCgAAIJURYMAAiWAAAGDAAPKzAT4DSasVISWrHYGrGcBGLaNgwACKxkqrOgEcq0EuwABbbwIAAoCrSMBGLZaBq07ARi2jAMAAjxU/Tqtwq3YAAIObYMAAisYBJqtwAYGreMBGLaNgwACKxkqrgQEcq4guwABbdwIAAharm4CrlsBGLZbAAEdNwACKyBarr4KrqcBGLfDAAEdNwACKyADAAI8ZBsAAj0KBlavFq9as6gAAwABHHgEaq8bAAO5LAAABA6vsrOoAAAACAgKr/wAAAIOyYMAAirYArAoAACCVEWDAAIlgAABgwADyswE+A0msFSElrB2BrBnARi58YMAAirZKrDQBHKw7LsAAW28CAAKArELARi5vgaxIwEYufADAAI8VP06sZKxqAACDm2DAAIq2ASasZAGBrGzARi58YMAAirZKrHUBIhysfC7AAFtwBAAEgKyHwEYubxaskoCsjcBGLm+FaMAAiriCrJzARi7JFqypgqyjwEYuyYVowACKuADAAI8WABysvi7AAFt3AgACFqzRgKzMwEYub4HlwACKuRas34Ks2cBGLsmB5cAAirkAwACPGQbAAI9DgZWs760ArfYAAMAAR1UBGqzwwADuSwAAAQOtDq32AAAAAgICrRkAAACDsmDAAIqKAK0kAAAglRFgwACJYAAAYMAA8rMBPgNJrS8hJa03ga0zwEYvkWDAAIqKSq1GARytTS7AAFtvAgACgK1UwEYvhIGtWsBGL5EAwACPFT9OrW6tdAAAg5tgwACKigEmrW4Bga12wEYvkWDAAIqKSq1/ASIcrYYuwABbdgIAAhatlYCtkMBGL4SSR8AAiowWraeCraHARi/ekkfAAIqMAMAAjxgAHK2+LsAAW3AEAASArcnARi+EFq3UgK3PwEYvhLH1wACKjYKt3cBGL94WreqCreTARi/esfXAAIqNAMAAjxYGwACPRIGVrfuuDK7gAADAAEchARqt/MAA7ksAAAEDriGu4AAAAAICAq4zAAAAg7JgwACKfgCuPgAAIJURYMAAiWAAAGDAAPKzAT4DSa5JISWuUYGuTcBGMKZgwACKfkquZwEcrm4uwABbbwIAAoCudcBGMJmBrnvARjCmAMAAjxU/Tq6WrpwAAIObYMAAin4BJq6WAYGunsBGMKZgwACKfkqupwEcrq4uwABbcAQABICuucBGMJkWrsSArr/ARjCZghrAAIqAgq7KwEYw8xau14Ku0cBGMPOCGsAAioAAwACPFgbAAI9FgZWu5a72r/gAAJWyARqu5sAA7ksAAAEDrwuv+AAAAAICAq8dAAAAg7JgwACKcQCvKAAAIJURYMAAiWAAAGDAAPKzAT4DSa8zISWvO4GvN8BGMYdgwACKcUqvUQEcr1guwABbbwIAAoCvX8BGMXqBr2XARjGHAMAAjxU/Tq+Ar4YAAIObYMAAinEBJq+AAYGviMBGMYdgwACKcUqvkQEiHK+YLsAAW3MEAASAr6PARjF6Fq+ugK+pwEYxeph2wACKc4KvtcBGMdQWr8KCr7zARjHUmHbAAIpzAMAAjxcAHK/ULsAAW3YCAAIWr+OAr97ARjF6kkzAAIp0Fq/vgq/pwEYx1JJMwACKdADAAI8YBsAAj0aBla/9sA6xFAAAlecBGq/+wADuSwAAAQOwJrEUAAAAAgICsDsAAACDsmDAAIpkALBGAAAglRFgwACJYAAAYMAA8rMBPgNJsFEhJbBZgbBVwEYymmDAAIpkSrByARyweS7AAFtvAgACgLCAwEYyjYGwhsBGMpoAwACPFT9OsKSwqgAAg5tgwACKZAEmsKQBgbCswEYymmDAAIpkSrC1ASIcsLwuwABbdgIAAhawy4CwxsBGMo2AsMAAimYWsNeCsNHARjLngLDAAIpmAMAAjxgAHLDoLsAAW3YCAAIWsPeAsPLARjKNkk/AAIpnFrEHgrEBwEYy55JPwACKZwDAAI8YBsAAj0eBlbEZsSqxzAAAwABG/AEasRrAAO5LAAABA7E2scwAAAACAgKxPwAAAIOyYMAAiloAsUoAACCVEWDAAIlgAABgwADyswE+A0mxVSElsV2BsVnARjOhYMAAilpKsWoBHLFxLsAAW28CAAKAsXjARjOUgbF+wEYzoQDAAI8VP06xkLGWAACDm2DAAIpaASaxkAGBsZjARjOhYMAAilpKsaEBHLGoLsAAW3YCAAIWsbeAsbLARjOUkkzAAIpLFrHDgrG9wEYz7pJMwACKSwDAAI8YBsAAj0iBlbHRseKysAAAwABG8wEasdLAAO5LAAABA7HrsrAAAAACAgKx8QAAAIOyYMAAik4AsfwAACCVEWDAAIlgAABgwADyswE+A0myByElsg+BsgvARjR2YMAAik5KshkBHLIgLsAAW28CAAKAsifARjRpgbItwEY0dgDAAI8VP06yPLJCAACDm2DAAIpOASayPAGBskTARjR2YMAAik5Ksk0BIhyyVC7AAFt2AgACFrJjgLJewEY0aZJHwACKUBaydYKyb8BGNMOSR8AAilAAwACPGAAcsowuwABbdgIAAhaym4CylsBGNGmSTMAAiksWsqeCsqHARjTDkkzAAIpLAMAAjxgGwACPSYGVsrWyxrOUAACwRQEasrbAAO5LAAABA7LRs5QAAAACAgKy2QAAAIOyYMAAijwAsuQAACCVEWDAAIlgAABgwADyswE+A0my7yElsveBsvPARjV7YMAAijxKswMBHLMKLsAAW28CAAKAsxHARjVugbMXwEY1ewDAAI8VP06zKLMuAACDm2DAAIo8ASazKAGBszDARjV7YMAAijxKszkBIhyzQC7AAFt2AgACFrNPgLNKwEY1boOWwACKPhazWoKzVMBGNciDlsAAij4AwACPGAAcs2ouwABbdwIAAhazfYCzeMBGNW6VwsAAij8Ws4qCs4TARjXIlcLAAIo/AMAAjxkGwACPSoGVs5mzqrR+AACV1QEas5rAAO5LAAABA7O0tH4AAAACAgKzuwAAAIOyYMAAii8As8YAACCVEWDAAIlgAABgwADyswE+A0mz0SEls9mBs9XARjaAYMAAii9Ks+QBHLPrLsAAW28CAAKAs/LARjZzgbP4wEY2gADAAI8VP060CLQOAACDm2DAAIovASa0CAGBtBDARjaAYMAAii9KtBkBIhy0IC7AAFt2AgACFrQvgLQqwEY2c51mwACKMRa0QoK0PMBGNs2dZsAAijEAwACPGAActFouwABbdgIAAha0aYC0ZMBGNnOSTMAAijIWtHWCtG/ARjbNkkzAAIoyAMAAjxgGwACPS4GVtIO0lLWWAACwSQEatITAAO5LAAABA7SctZYAAAACAgK0oQAAAIOyYMAAiiEAtKwAACCVEWDAAIlgAABgwADyswE+A0m0tyEltL+BtLvARjeFYMAAiiFKtMgBHLTPLsAAW28CAAKAtNbARjd4gbTcwEY3hQDAAI8VP0606rTwAACDm2DAAIohASa06gGBtPLARjeFYMAAiiFKtPsBIiIctQIuwABbdgIAAha1EYC1DMBGN3iSTMAAiiMWtR2CtRfARjfSkkzAAIojAMAAjxgAHLUuLsAAW3YCAAIWtT2AtTjARjd4wABHP8AAiiQWtU6CtUjARjfSwABHP8AAiiQAwACPGAActWQuwABbdgIAAha1c4C1bsBGN3jAAEdAwACKJRa1hoK1gMBGN9LAAEdAwACKJQDAAI8YBsAAj0yBlbWbtay2UgAAlYcBGrWcwADuSwAAAQO1trZSAAAAAgICtb0AAACDsmDAAIoVALXIAAAglRFgwACJYAAAYMAA8rMBPgNJtdMhJbXbgbXXwEY4xGDAAIoVSrXmARy17S7AAFtvAgACgLX0wEY4t4G1+sBGOMQAwACPFT9Otgq2EAAAg5tgwACKFQEmtgoBgbYSwEY4xGDAAIoVSrYbARy2Ii7AAFt2AgACFrYxgLYswEY4t5JHwACKFxa2Q4K2PcBGORGSR8AAihcAwACPGAbAAI9NgZW2V7ZotwgAALA9ARq2WMAA7ksAAAEDtnO3CAAAAAICArZ7AAAAg7JgwACKCQC2hgAAIJURYMAAiWAAAGDAAPKzAT4DSbaRISW2mYG2lcBGOZdgwACKCUq2pQEctqwuwABbbwIAAoC2s8BGOYqBtrnARjmXAMAAjxU/TrbKttAAAIObYMAAigkBJrbKAYG20sBGOZdgwACKCUq22wEctuIuwABbdgIAAha28YC27MBGOYqAisAAigsWtv6CtvjARjnkgIrAAIoLAMAAjxgGwACPToGVtw23HrfUAACwDgEatw7AAO5LAAABA7cot9QAAAACAgK3LwAAAIOyYMAAif0AtzoAACCVEWDAAIlgAABgwADyswE+A0m3RSElt02Bt0nARjpqYMAAif1Kt1gBHLdfLsAAW28CAAKAt2bARjpdgbdswEY6agDAAI8VP063fLeCAACDm2DAAIn9ASa3fAGBt4TARjpqYMAAif1Kt40BHLeULsAAW3MEAASAt5/ARjpdFreqgLelwEY6XcAARvjAAIn/gre3wEY6txa3xIK3vsBGOrfAAEb4wACJ/wDAAI8XBsAAj0+BlbfZt+q4rAAAsA8BGrfawADuSwAAAQO397isAAAAAgICuAEAAACDsmDAAInxALgMAAAglRFgwACJYAAAYMAA8rMBPgNJuBchJbgfgbgbwEY7T2DAAInxSrgtARy4NC7AAFtvAgACgLg7wEY7QoG4QcBGO08AwACPFT9OuFS4WgAAg5tgwACJ8QEmuFQBgbhcwEY7T2DAAInxSrhlARy4bC7AAFtzBAAEgLh3wEY7Qha4goC4fcBGO0LAAEb4wACJ84K4j8BGO5wWuJyCuJbARjucwABG+MAAifMAwACPFwbAAI9QgZW4sbjCuYYAAMAARv0BGriywADuSwAAAQO4ybmGAAAAAgICuM0AAACDsmDAAInlALjYAAAglRFgwACJYAAAYMAA8rMBPgNJuOMhJbjrgbjnwEY8NmDAAInlSrjzARy4+i7AAFtvAgACgLkBwEY8KYG5B8BGPDYAwACPFT9OuRS5GgAAg5tgwACJ5QEmuRQBgbkcwEY8NmDAAInlSrklASIcuSwuwABbdgIAAha5O4C5NsBGPCmVT8AAiecWuUyCuUbARjyDlU/AAInnAMAAjxgAHLliLsAAW3YCAAIWuXGAuWzARjwpkkzAAIm7Frl9grl3wEY8g5JMwACJuwDAAI8YBsAAj1GBlbmLuZy6bAAAwABHUQEauYzAAO5LAAABA7mmumwAAAACAgK5rQAAAIOyYMAAidkAubgAACCVEWDAAIlgAABgwADyswE+A0m5wyElucuBucfARj09YMAAidlKudYBHLndLsAAW28CAAKAueTARj0wgbnqwEY9PQDAAI8VP065+roAAACDm2DAAInZASa5+gGBugLARj09YMAAidlKugsBIhy6Ei7AAFt2AgACFrohgLocwEY9MJVPwACJ2xa6MoK6LMBGPYqVT8AAidsAwACPGAAcukguwABbdgIAAha6V4C6UsBGPTCSTMAAibsWumOCul3ARj2KkkzAAIm7AMAAjxgGwACPUoGVunG6gruIAADAAEcOARq6csAA7ksAAAEDuoy7iAAAAAICArqTAAAAg7JgwACJzAC6ngAAIJURYMAAiWAAAGDAAPKzAT4DSbqpISW6sYG6rcBGPkRgwACJ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AAAAAAsGwACIOIGUwABD78AAQ/3AAEQlAAGDsAAAAAEDwABEA8AARCUAAAABAQHAAEQLAAAAgIpgwAD2XQAAYMAAi/4BSsAARBUBHMAARBgawABEFcAAiDaDsAEAAYDAAEQfwEZFowDAAI0TBsAAiDmBlMAARCfAAEQ1wABEkwABwABEewAAAAEDwABEPsAARJMAAAACAQHAAEREAAAAgLBgwACKoQABwABESwAAAJcrWwEqYMAAi/4BPgFKwABEYgEcwABEbBrAAERpwACINsAARHsCAAGAwABEdsBGRgwBlyuBwABEh8BGRhzAAI0XBsAAiDqBlMAARJbAAESkwABE1AABwABaPAAAAAEDwABErsAARNQAAAABAQHAAES2AAAAgIpgwAD2XQAAYMAAi/4BSsAARMABHMAARMMawABEwMAAiDbAAFo8AQABgMAARM7ARkaQAMAAjRQGwACIO4GUwABE1sAAROjAAEVNAAHAAFo/AAAAAQPAAET0wABFTQAAAAICAsAARQcAAACDFF3AAPTbAWDAAIvkAMAARRUAAACBPmDAAIvkAABdwAD02wFgwACL5AE+AUrAAEUkARzAAEUuGsAARSvAAIg2wABaPwIAAoDAAEU7wEZG+4HAAEVBwEZHEADAAI0WBsAAiDyBlMAARVDAAEVkwABF5wABwABaPQAAAAEDwABFdsAARecAAAACAQHAAEWJAAAAlDZdwAD02wFgwACL5AABwABFlQAAAMAAWj5bASpgwACMCAE+AUrAAEWsARzAAEW2GsAARbPAAIg2wABaPQIAAYDAAEXJwEZHjAHAAFo+gcAARdvARkeiwACNFQbAAIg9gZTAAEXqwABF+MAARh0AAcAARI4AAAABA8AARf7AAEYdAAAAAQEBwABGAwAAAICKYMAA9Y8AAGDAAIwUAUrAAEYNARzAAEYQGsAARg3AAIg2wABEjgEAAYDAAEYXwEZIGgDAAI0YBsAAiD6BlMAARh/AAEYwwABGYQABwABaQAAAAAEDwABGOMAARmEAAAABAQHAAEZHAAAAgxRdwAD02wFgwAD0eQAAYMAAjCABSsAARlABHMAARlMawABGUMAAiDbAAFpAAQABgMAARlzARkiFAMAAjRoGwACIP4GUwABGY8AARnTAAEauAAHAAFpBAAAAAQPAAEZ/wABGrgAAAAEBAcAARpEAAACDFF3AAPTbAWDAAPZdAABgwACMIAFKwABGmgEcwABGnRrAAEaawACINsAAWkEBAAGAwABGqcBGSPYAwACNGwbAAIhAgZTAAEawwABGtcAAR0oAAcAAWkIAAAABA8AARsHAAEdKAAAAAwMDwABG0gAAAIQ8YMAAipcAwABG5wAAAMAASnlgwACKlwDAAEcDAAAAVF3AAPUdAWDAAIqXAABgwACLDwE+AUrAAEcSARzAAEccGsAARxnAAIg2wABaQgMAA4DAAEcpwEZJZ4HAAEczwEZJdoLAAEc+wEZJhwDAAI0dBsAAiEGBlMAAR03AAEdfwABHrAABwABaQwAAAAEDwABHbMAAR6wAAAABAQHAAEeFAAAAgJ9dwAD1TgJgwAD2XWDAAIqXAABgwACMOgE+AUrAAEeOARzAAEeYGsAAR5XAAIg2wABaQwEAAYDAAEemwEZKCwDAAI0eBsAAiEKBkoi8iMOJ4QABqGMAAAABA4jNieEAAAABAQGI0wAAAIOyYMAAiWAAAGDAAPZdAT4FToj3iP8AAG9gwACNlQEfiQXAAI2eAAAAAE6JRIlMAACB52DAAI2nAR+JWMAAja4AAAAATomFiY0AAJi/YMAAja8BH4mTwACOJQIAAoGJm8BGSo6CiaTARkqnAD0cibiDibDARkrBnxoBAAGAib7ARkp3AMAAjdVKiccBHInWgonOwEZKp7TCAAAAAMAAjawGgUaBkYGSgZOBlIGVAEZLHABDUXsAQ19FAEN2uQBDhzsAQ6PDAEOkKQBDqI4AQ6vxAEOshABDsC8AQ7NrAEO15ABDuw8AQ7utAEPBTABDxYsAQ8kmAEPMwQBDz4IAQ9JDAEPVnwBD2LQAQ93wAEPhoQBD5aAAQ+Y+AEPp2QBD7NgAQ/CJAEPz3gBD9p0AQ/n4AEP6zwBD+ykAQ/1BAEP/WQBEA/UARAfrAEQLVgBEELYARBMSAEQXpwBEHCAARB4sAEQkWgBEJ/YARCuSAEQuAABEMHYARDKSAEQ0dgBENjUARDoyAEQ+xgBEQNcAREXvAERHRwBESU0AREssAERMwABEThwARFAaAERR2ABEU9gARFc1AERZqQBEXXgARGAqAERkKABEZ98ARGkUAERqSQBEbUwARG6BAERxPgBEcnMARHX7AER3MABEejMARHtoAER+JQBEf1oARIK7AESFvQBEiRwARIvbAESmpABEqjMARQ6KAEURAgBFEmEARRP9AEUVZABFFm8ARXsNAEV82wBFg34ARYzHAEWOZQBFkDkARZ30AEWg3gBFo7oARav8AEYA9gBGBGkARkU1AAAAagBGRXkARkXgAEZGZABGRs8ARkdgAEZH7gBGSFkARkjKAEZJOwBGSd8ARkpXAEZLHAAAAAsAwACPWsAAW3uBlgAAA4ENAADAAIgwAACBMwAAwABDNAABAQG0xIFsAACByQABAQKDnYOnAAAABALAAI9dgZaDp4Oth1M3wABbfAAAAV3AAIiFAVsAAWCB7QMEwACPYAyCnYKtGIOegckAYMAA9HkBkwTAAI9hDIMYgzIYg5+ByQBdwAD1HQFgwAD2XQExgy5gwAD2XQEnAATAAI9iDIOIg58Yg6CByQBgwAD2XQEng6EBBcAAj20AAAAABAAAAwAAAAAAAAAAAGDAAI9dAT8BCQAAwACIzwAAAAAGBsAAj2QMgXWBgIJvAQCDogAAAAEDgYyCbwAAAAAAAABgwAD2XQE+AkWByQGB0oHUAABbYMAA9HkBFoHiFoHWLoOfgcmB8VrAAPVMARyB7ICB6sBGThmBSgEAARaB7y6DnoHJgfAAwAD1pwGIgf3ARk4ZHIH+gIH9wEZOGV0BAAGUAMAA9Z4+AT0cghYWggoug5+ByYHxTwEAARyCLRyCJRaCGi6Dn4HJgfFEAQABHIIogIImwEZOGYFBAQABlADAAPWfAMAA9SxdAQABFoIvLoOjgfUAwAD2cgDAAPUuSoJLARyCXRaCUi6Dn4HJgfFEAQABFoJeLoOegcmB8ADAAPUsBsAAj2UMg6ODroPRAQCDowAAAAEDg76D0QAAAAAAAABgwAD2XQFKg8EBFoPBLoOggcmB8gbAAI9nDIPVg9mEaAIAg6MAAAABA4PohGgAAAABAQGD8AAAAICKYMAA9l0AAFwBPgFJg/0hHIQHgIQBwEZPQkEBAAEWhAoug6CByYHyAMAA9mw+Aj0XhCQug6CByYCEN8BGT0KB8j0XhEQug5+ByTGEWmDAAPZdAScAgfE/BsAAj2kMhJ+EpITJAACDpAAAAAEDhK6EyQAAAAAAAABcAT4BPReEty6DnoHJHITDFoS3LoOegcmB8F0BAAGUAMAA9Z6B8AbAAI9qDIUAhQWFKgAAg6UAAAABA4UPhSoAAAAAAAAAXAE+AT0XhRgug56ByRyFJBaFGC6DnoHJgfCBQQEAAZQAwAD1n4HwBsAAj2sMhbGFsYYaAACDpgAAAAEDhbyGGgAAAAEBAYXGAAAAgShgwAD0bwAAWwE+BD0chc8ug6QAAAAAgflOheWF7AAAgRBbARyF74CF7sBGUEwgAAAAAAA9HIX3LoOlAAAAAIH6SoYJAYGGEMBGUGwAAEZN7QBGTu8ARk8jAEZPoABGT+YARlAtAEZQngAAAAYCwACPboGWg6eDrYdTN8AAW30AAAFgwACPXQABXYH+AWDAAIlgAgTAAI9wDIZhhngYg3oAYMAA9qcBH4ZqwAD2xgAAAAAEwACPcQyGiYaoGIOpAF2KIwFgwAD2XQEghpqKUwABYMAA9l0AAAEFwACPfgAAAAAEAAADAAAAAAAAAAAAYMAAj24BPwEJAADAAI9tAAAAAAoGwACPcwyGrYayhwIAAIOqAAAAAQOGuYcCAAAAAQEBhsEAAACDq2DAAPZdAABcAT4CPReGzC6DqRyG4BaG1y6DqYIBg6wBAAGAhujARlF0AIowggE9HIbyLoOkAAAAAIH5BsAAj3QMhweHDoeaAACDrQAAAAEDhxSHmgAAAAAAAABgwAD2XQE+BUAhFocuFoclLoOpggGA/IoohySHNQBOh0OHRwAAg6tgwAD2XQEWh1IWh0kug6mCAYOuiiU9F4dcLoOpFodwFodnLoOpggGDr4omggE9HId6LoOlAAAAAIH6SoeMAYCHk8BGUfUGwACPdQyHyYfOh/sAAE8AAAABA4fRh/sAAAABAQGH2QAAAIOwYMAA9l0AAFwBPgE9HIfqFofnLoN6ggCCEQEAAYCH8MBGUmAAwAD2uwbAAI92DIg4iD2IZwAAg7EAAAABA4hRiGcAAAACAgKIVAAAIIOyYMAAiWAAiF4AAACDs13AAPVOAltbAABcAT4ABsAAj3cMiUCJRYpBAACDtAAAAAEDiU2KQQAAAAMCA4lQAAAgg7JgwACJYACJXQAAAIIXYMAA9l0AiWgAAACDs13AAPVOAltbASsAXAE+B0mJdxyJgoKJe8BGUwlBAQABKwDAAPXSPYqJi8BGUwkeiZjAAPVVAAJbWwAAPz0ciaMug7UAAAAAggs9HIm+Fom7LoN6ggCCEQEAASdcAMAA9rs9HInOLoOxAgACgInjwEZS74KJ6cBGUwkAggY9HIn2LoO2AgACgYoIwEZS/IKKDsBGUwkAggo9HIoeFoobLoN6ggCCEQEAASeDtwDAAPa7PRyKMC6DqgEAAYGKOMBGUvwAggMGwACPeAyKbopzi14AAIO4AAAAAQOKg4teAAAAAwIDioYAACCDsmDAAIlgAIqTAAAAghdgwAD2XQCKngAAAIOzXcAA9U4CW1sBKwBcAT4GSYqtHIq4goqxwEZUDUEBAAErAMAA9dI9iorBwEZUDTKKyltbAD89HIrSLoO1AAAAAIILPRyK7RaK6i6DeoIAghEBAAEnXADAAPa7PRyK/S6DsQIAAoCLEsBGU/OCixjARlQNAIIGPRyLJS6DtgIAAoGLN8BGVACCiz3ARlQNAIIKPRyLTRaLSi6DeoIAghEBAAEng7kAwAD2uwbAAI95DIuDi4iMEAAAg7oAAAABA4uRjBAAAAAAAAAAXAE+BU6LoYulAACDq2DAAPZdARyLpy6DrQAAAACCBD0ci7Uug7UAAAAAggs9HIvQFovNLoN6ggCCEQEAASeDuwDAAPa7PRyL4S6DtgEAAYCL88BGVOIAggo9HIwAFov9LoN6ggCCEQEAASeDtwDAAPa7BsAAj3oMjBWMGo3YAACDtgAAAAEDjCuN2AAAAAIBAowzAAAAghdgwAD2XQCMPgAAAIOzXcAA9U4CW1sBKwBcAT4DSYxNHIxYgYxRwEZVe0EBAAErAMAA9dI9iYxhwEZVex6MbsAA9VUAAltbAAA/PRyMfBaMeS6DeoIAghEBAAEkjIsBgIyFwEZVbgDAAPa7PRyMmYGMksBGVXuDvAEAATSMoQOMoY3TAAAAAgICjKIAAACDvVsAjKUAAACA1FsAAGDAAPWCAT4DToy3AAAAgIpgwAD2XQBJjMQhHIzKg4zIwEZWBkEBAAErAMAA9dI+Ak6M5IzoAACDvmDAAPZdARyM6i6DvwEAAYOM+MBGVgYAggw9jI0EwEZWGRyNZxyNQhyNHYWNDMBGVkGCpAIAAidcJ4PAAMAA9n2CpAIAAieAiyeDwQDAAPZ9gqQCAAIng2QngvsAwAD2fT4BPYyNlMBGVhkng8I9HI23Fo20LoN6ggCCEQEAASSNywUngQGCjcDARlX9J4PDhI3EwEZWGSeDZADAAPa7AMAA9W0GwACPewyN3Y3ijhQAAIO1AAAAAQON8o4UAAAAAAAAAFwBPgE9HI3+Fo37LoN6ggCCEQEAARaOBC6DooH0AMAA9rsGwACPfAyOSY5QjnEAAIO/AAAAAQOOXY5xAAAAAQEBjmIAAACAilsAAGDAAPZdAUqObAEmjmwBgI5swEZXTWDAAPZdAABGUVUARlG2AEZSQgBGUo8ARlLQAEZT1ABGVL0ARlVPAEZW7ABGVy4ARldxAAAACgLAAI9/gZaDp4Oth1MDwABbfgAAAWDAAI9uAAABBMAAj4GBloQLhCIYg3oBGoPzwADuS2DAAPanAR+EFMAA9sYAAAAAAQXAAI+KAAAAAAQAAAMAAAAAAAAAAABgwACPfwE/AQkBAMAAj34AAAAABgbAAI+DgZaEJ4QshL0AAMAAW38AAAABA4RBhL0AAAADAgOERwAAAIOyYMAAiWAAhFQAAACCF2DAAPZdAIRfAAAAg7NdwAD1TgJbWwErAFwBPgM9HIRuLoO0AwADgIR3wEZYM4GEfcBGWECChIPARlhNAIIHPRyElYCEkMBGWDOUDwEBWwEuAMAAiWk9HISuLoO6AAAAAIIJBsAAj4SBloTChNOFJAAAwABCPQEahMPAAO5LAAABA4TchSQAAAABAQGE4gAAAIOyYMAAiWAAAFwBPgE9HITuLsAAW38CAAKAhQTARljSJIUfARaFEoCFDcBGWNKFA8AA9dkAwACPgwbAAI+FgZaFKYU6hZsAAJXrARqFKsAA7ksAAAEDhUOFmwAAAAEBAYVJAAAAg7JgwACKoQAAXAE+AT0chVUug7gDAAOAhWbARlk3JIWBARaFdICFb8BGWTeFA8AA9dkyhYNbWwEngLAWhZGAhYzARlk3gLDAAItXAIIIBsAAj4aBloWghbGGFwAAtFMBGoWhwADuSwAAAQOFvIYXAAAAAQEBhcQAAACDsmDAAIsmAABcAT4BPRyF0C7AAFt/AwADgIXmwEZZsSSGAQEWhfSAhe/ARlmxhQPAAPXZMoYDW1sBJ6S+FoYPgIYKwEZZsaS+wACLKADAAI+DBsAAj4eBloYchi2GogAAwABHIgEahh3AAO5LAAABA4Y/hqIAAAABAQGGTgAAAIOyYMAAi/4AAFwBPgE9HIZaLoO4AwADgIZrwEZaMSSGhgEWhnmAhnTARloxhQPAAPXZMoaIW1sBJ4CKFoaXgIaSwEZaMYCKwACMAACCCAbAAI+IgZaG2Ibmh1EAAcAAQkcAAAABA4bxh1EAAAABAQGG9wAAAIOyYMAAiWAAAGDAAPZdAT4DTocHhwkAAIDGYMAAj38BH4cPwACPigAAAAA9HIcogIcjwEZappQOAQFbAYGHL8BGWr0AwACJaEqHNwEch0MWh0CBhz7ARlq9g3rAAI+BIwAAAADAAPbAAABGWBEARlipAEZZEABGWYoARloIAEZahABGWxMAAAAGAsAAj4uBloeQh5aISgPAAFuAAAABYMAAjacAAWDAAEN1AAEFwACPjwAAAAAEAAADAAAAAAAAAAAAYMAAj4sBPwEJAQDAAI2uAAAAAAEGwACPjYGWh/uIDIhIAACC6AEah/zAAO5LAAABA4gRiEgAAAABAQGIGQAAACJgwAD2XQAAXAE+AT0ciC8WiCgughLAAI2pghEBAAEkiEMDJ4OEgIg5wEZbqCeDggDAAPa7AABGW4EARlviAAAAAQABBsAAj1yBloHGgc2DQwABwABbgQAAAAEDgdmDQwAAAAIBAYHfAAAAg7JgwACJYAABgesAAADAAFuCYMAA8rMBKmDAAPZdAT4EToIZgiEAAG9gwACNlQEfgifAAI2eAgAAAsAAQkohgYJfwEZcIcAAWrghgYKYwEZcIU6CuoLKAADAAFuDYMAAj4sBH4LQwACPjwAAAAA9HIMSH4LwwACOJQIAAoKC+MBGXDqDgwHARlxrAJ8aAQABgIMYwEZcEwDAAI3VSoMhARyDOIODKMBGXGu0wgAAAADAAI2sAYGWAEZczABGTUkARlC/AEZXogBGWzQARlvvAAAABABGW/EARlzMAAAAAQDAAI+QAIGXAAAEgNoAAIvzrSsAgQIAAMAAoF2tKwCBTwAAwAB2EQAAgWYAAMAAd4sAAAAAAAQCwACPkYGXgo+ClcAAlF43wABbhAAAAV2hEgFgwACQIwABYMAAd74CBMAAj5OBXIyMjKAYwABSKwBgwAB3sQErBMAAj5SBXIy7jOwYr9MAYMAAd50BH4zUwAB3qgAAAAABBcAAj5oAAAAABAAAAwAAAAAAAAAAAGDAAI+RAT8BCQAAoUgAAAAAAwbAAI+WgVyM8Yz2jgUAAMAAUiwAAAABA40KjgUAAAACAgKNFwAAAIT0YIwVAI0iAAAAgShhAFwAAFwBPgVOjT+NSAAAwABSLWDAAHexARaNSi7AAFIrwAB3wD0XjWQuwABSKyaNZAEcjY4WjXsur9PAAHfBwABSIgEAAYCNncBGXdkAwAB3o2DAAHexwAB3wD01AAAAAQBgwAB3sQGCjajARl31IxyNsoMAwEZeSUEBAAErAAArHI2ygwDARl5JwABSKAEAARaNvi7AAFIrwAB3wADAAHe4AVw9HI3agY3ZwEZd5CAAAAAAAD0XjeIuwABSK4KN+cBGXfXAAHfABsAAj5eBXI4Kjg+OugAAwABSIwAAAAEDjieOugAAAAEBAY4/AAAAg7JgkgIAAFwBPgI9NQAAAAEAYMAAd7EBFo5LLsAAUivAAHfAIxyOYYEAwEZe6UEBAAErAAArHI5hgQDARl7pwABSIwEAAYCOesBGXtcAwAB3uQFcPRyOmBaOhS6v08AAd8HAAFIjAQABgI6xwEZe1wDAAHekBsAAj5iBXI6/jsSPFQAAwABSLgAAAAEDjtqPFQAAAAAAAABcAT4BPTUAAAABAGDAAHexARaO4y7AAFIrwAB3wCMcjvmAAMBGX3pBAQABKwAAKxeO+YAAwEZfesAAUiUpwAB3tgFgwADyswAARl23AEZetQBGX1EARl+7AAAAAwLAAI+bgZeCj4KVwACUXgPAAFuFAAABYMAAj5EAAA0EwACPnoGXgxCDIgnAAFJHwACPkABgpfIABMAAj5+Bl4M/g18JwABbhsAAj5AAYMAAdhIBH4NMwAB2GgAAAAAEwACPoIGXhsyG2xjAAFuHwACPkABdwAD1HQFgjA4BKwTAAI+hgZeHx4fZGMAAW4jAAI+QAGCMFQErBMAAj6KBl4giiDoYwABbicAAj5AAYMAA8rMBKgTAAI+jgZeIjoicGMAAW4rAAI+QAGCMDgErBMAAj6SBl4mYidMYwABbi8AAj5AAXcAA9g4BYJICAR6JtsAAux8AAWCSAgAABMAAj6WBl4qKirEYwABbjMAAj5AAXcAA9g4BYIwOAR6Ko8AAux8AAWCMDgAABMAAj6aBl4sciyoYwABbjcAAj5AAYMAA8rMBKgTAAI+ngZeLYotzGMAAW47AAI+QAGDAAHYbASsEwACPqIGXi32LihjAAFuPwACPkABgwADyswErBMAAj6mBl4v6jAkYwABbkMAAj5AAYMAA9HkBkwTAAI+qgZeNL41AGMAAW5HAAI+QAGDAAHZbASsBBcAAkBWBl41FjUWNbwAAAAONVo1vAAAAAQEBjVwAAATAAFJHYKXyAABgwACPmwE/AggBwACPnoAAwEZhoAkBjUXAAI+aAAAAAGUGwACPrYGXhJaEvIT5AQDAAFuSwACPkAAAAAEDhNiE+QAAAAAAAABdwAD1TgJgjA5gwAB2KwFKhOEBFoToFoThLsAAW4bAAI+QwACPn8AATxDAAHYVBsAAj66Bl4XShfiGLgEAwABbk8AAj5AAAAABA4YMhi4AAAAAAAAAXcAA9U4CYIwVYMAAdhsBSoYVARaGHBaGFS7AAFuGwACPkMAAj5/AAE8mwAB2FgbAAI+wgZeNdI1/kdsAAMAAUhwAAAABA42LkdsAAAABAQGNlgAAAIOyYI0TAABgwAB3jAE+BUmNoiIWjauAjabARmKbg9+NHgAhFo2/gI26wEZim4PkjSM+AUqN0wEgjeDAAHeUAQAAAa/QII4TwACQMwAAAAA/SY49JY5GgI5BwEZim2CNXj4BPReOYS7AAFuPwACPkCnAAI+oSY6CIiWOi4COhsBGYptgjZ8AHI6oFo6jFI6ewEZimwABYI2fghyNokEBAAEajryN5gDAAPXSPgE9F47NLsAAW4/AAI+QKsAAj6hJju8WjviAjvPARmKblKyNIj4BPRePEi7AAFuPwACPkCnAAI+oPgE9F487LsAAW4/AAI+QKsAAj6hOj3OPiQAAr9BgwACQIwEgj5nAAJAzAAAAAEmPuyWPxICPv8BGYptgjTE+AUmP2SEcj+4Wj+IUj93ARmKbAAFgjTGSRY01QQEAASsAwAD10j4BPYmQAcBGY5gmkAEBHJAeFJAZwEZimwABYI0xlA4BAAEuAI1WYMAAkCM+Aj2JkEPARmOYIJBhwACQMQAAAAA9F5CSFpCLLsAAW4bAAI+QwACPn8AATTIfkKLAAHYoAQABFpCyLsAAW4/AAI+QwACPqADAAHYUPgJAIiWQ6YCQ5MBGYptgjZ8BJZEBgJD8wEZim2CNXpDkkRIAPRyRIICRG8BGYpuUDgEAAS4AjSlKkTgBH5FDwAB3lAMAAAOvzhaRai7AAFuGwACPkMAAj5+v0xaRji6v08AAd8Gv0IGRwcBGY5gGwACPsYGXkeCSApJpAACXTwEakeHAAO5LAAABA5INkmkAAAABAQGSFgAAAIOyYIwOAABgwACQIwFKkiUBMJIlH5IrwAD0CwEAASSSaAUnwABNW4CSTcBGZPMngwIWklqAklXARmTzhQPAAPXZJ4LaAAbAAI+ygZeSbpKEkr8AAMAAQj0AAAABA5KNkr8AAAABAQGSlgAAAIOyYIwOAABgwACQIwE+AUqSogEmkqIBNQAAAAEAYIwOAYCSqcBGZV8jHJKvgQDARmV8QQEAASsAACsckq+BAMBGZXyUDgEAAS4AjBABW2DAAJAjBsAAj7OBl5LEktqTxAAAwABToAAAAAEDkuSTxAAAAAEBAZLzAAAAloddwAD1HQFgjA4AAGDAAJAjAT4DTpMWkyEAAMAAQmFgwACQIwEgkynAAJAxAAAAAEaTT5Nrk1wAAACDsmCMDgCAk2TARmXZPgE9iZNzwEZl9ByTi4GTgMBGZfSTJgEAARyTky7AAEI9AQABgpOdwEZmFADAAI+yAMAAkChKk68BgZO2wEZl9AbAAI+0gZeUMZQ2mwcAAMAAW5QAAAABA5RSmwcAAAABAQGUXwAAAIOyYIwVAABcAT4DTpSHlKEAAMAAW5VdwAD2DgFgkgIBHpSvwAC7HwABYJICAABGlNMAlOAAAACSS2CMDgAWlOwuwABbh8AAj5DAAI+gQT4BSZU2JZVDgpU6wEZmv2CSAj4DSZVoIhaVdRSVbMBGZr8CAWCSAoPgkhIBFpWJFJWAwEZmvwIBYJICg+KSE0KVkgA/SZWkIRyVuxaVqS7AAFuLwACPkMAAj6SC0AEAARSVxMBGZr8CAWCSAgDAAPYaQpXPAD9JleEclfgWleUuwABbjMAAj5DAAI+lgtABAAEUlgHARma/AgFgkgIAwAD2Gj4BPRyWMoGWGMBGZplPAQABFJY2wEZmvwIBYJICAMAA9hs/P0mWXSEWlnyBlmLARmaZgPzAAPT/PgZAIRyWpRaWmxaWlC7AAFuGwACPkMAAj5/AAE0ywAB2FEEBAAErAMAA9dKWlJasAE6WxZbKAACTFmDAAHYbARaW0xaWzC7AAFuGwACPkMAAj5/AAE0ywAB2FE6W+QAAAMAATytgwAB2KwBOlxKXGgAAwABblmDAAHY7AR+XIMAAdkACAAIclyguwABblwAAAADAAI+1Fpc2LsAAW4jAAI+QwACPoQBJl1EiIiIll1qAl1XARmaIYJF4ASWXf4CXesBGZohgkYUBJZemgJehwEZmiGCRYgEll82Al8jARmaIYJFtPgE9i5fqwEZoER+X/sAAdjoJAAmBmCPARmaZhJhKwEZoITGYX2CSAgAWmHSCmG/ARmfnwABPMcAAdh0WmJyCmJfARmfnwABFhcAAdiEWmLyCmLfARmfnwABPH8AAdiIWmOKCmN3ARmfnwABPHsAAdiMWmQuCmQbARmfnwABPHcAAdiQWmTkuwABbj8AAj5DAAI+oAD4BPYuZYMBGaBEfmXTAAHYyCAAIgZmVwEZmmYSZvMBGaCEWmdaCmdHARmfnwABPMcAAdh0Wmf6CmfnARmfnwABFhcAAdiEWmh6CmhnARmfnwABPH8AAdiIWmkSCmj/ARmfnwABPHsAAdiMWmm2CmmjARmfnwABPHcAAdiQWmpsuwABbj8AAj5DAAI+oAD0XmsAWmrkuwABbhsAAj5DAAI+fwABNMjUAAAABAF3AAPVOAmCMDmDAAHYrARaazC7AAFuSwACPkMAAj601AAAAAQBgjBUBgJrowEZmiDUAAAABAGDAAHYrAYOa8MBGaBE1AAAAAQBcARya54Wa58BGadOAsgIAAoaa58BGafiHAMBGagkAwAD1Y4cAwEZqCcAAdhQ/BsAAj7WBl5z9nQSdOQAAwABblwAAAAEDnQ6dOQAAAAAAAABgwAD2XQE+AUqdFwEknTUCJ8AAUGg1AAAAAQBgwAD0eQEWnSYuwABbkMAAj5DAAI+pNQAAAAEAYMAA9HkBF50mLsAAW5DAAI+QHJ0xgADARmqIXQEAAZQAwAD1nsAAj6mAAMBGaogGwACPtoGXncSdyZ7xAADAAFuYAAAAAQOd1p7xAAAAAgICnd8AAACDsmCMDgCd6gAAAMAAW5lhAFwAAFwBPgZOng+eIQAAwABbml3AAPUdAWCMDgEWniMuwABbh8AAj5DAAI+gPReeOC7AAFuHwACPkDGeU2CMDgDAAI+gPRyeaIGeW8BGawUgAAAAAAA9HJ5wLsAAW5QBAAEmno0BgJ6NwEZq+mCMFQDAAI+0PRyeqhaemC7AAFuLwACPkMAAj6ST4QEAARaetC7AAFuHwACPkMAAj6AAwAD2Hz0XnsouwABbh8AAj5CCntzARmsYwACPoAbAAI+3gZee9p8Yn2wAAJU4ARqe98AA7ksAAAEDnyyfbAAAAAEBAZ9AAAAAg7JgjzsAAGDAAJAjAT4BSp9MARyfUy7AAEI9AQABFp9igJ9dwEZr8YCKjz4AwACPsgbAAI+4gZefcZ+ToJIAAJXRARqfcsAA7ksAAAEDn6CgkgAAAAEBAZ+tAAAAg7JgkcwAAGDAAJAjAT4GTp++n8cAAMAAW5tgwADyswEWn8kuwABbjcAAj5DAAI+mPRef1S7AAFuNwACPkCnAAI+mPRyf6C7AAFIsAgACgJ/9wEZsTjSgAwOgA6ApAAAAAAAAAGDAAPWCAT4BPRygDi7AAEI9AQABFqAdgKAYwEZsTpJMkc4AwACPsgDAAHfDPRygMC7AAFOgAQABFqBAgKA7wEZsTpXQkc8AwACPsz0XoE4uwABbjcAAj5CBoFfARmxjwACPpkqgZQEgoHLAAJAzAAAAAAbAAI+5gZegl6C5ob0AAJXYARqgmMAA7ksAAAEDoMihvQAAAAEBAaDXAAAAg7JgkeQAAGDAAJAjAT4GTqDooPEAAMAAW5tgwADyswEWoPMuwABbjcAAj5DAAI+mPReg/y7AAFuNwACPkCnAAI+mPRyhEi7AAFIsAgACgKEnwEZtUDShLQOhLaFTAAAAAAAAAGDAAPWCAT4BPRyhOC7AAEI9AQABFqFHgKFCwEZtUJJMkeYAwACPsgDAAHfDPRyhWi7AAEI9AQABFqFpgKFkwEZtUJXXkecAwACPsj0XoXkuwABbjcAAj5CBoYLARm1lwACPpkqhkAEgoZ3AAJAzAAAAAAbAAI+6gZehwqHkoqMAAJUVARqhw8AA7ksAAAEDofSiowAAAAEBAaIEAAAAg7JgjnYAAGDAAJAjAT4CPRyiEC7AAFucwACPkAIAAhaiKYCiJMBGblKSS454GqI/wAB2YgDAAI++SqJ2ASCig8AAkDMAAAAABsAAj7uBl6KoosqkEgAAlRcBGqKpwADuSwAAAQOi2qQSAAAAAQEBouoAAACDsmCOggAAYMAAkCMBPgY9HKMIFqL2LsAAW4vAAI+QwACPpE8BAAEWoxGAowzARm7GkkuOhADAAPYbPRyjIC7AAFucwACPkAIAAhajOYCjNMBGbsaSS46EGqNPwAB2YgDAAI++PRyjXi7AAFudAgACFqN7FqNygKNtwEZuxpJLjoSCF5IIGqONwAB2YwDAAI/cPRyjnS7AAEI9AQABFqOsgKOnwEZuxoCKjoUAwACPsj0co7guwABSIwEAARaj1oCj0cBGbsaSS46EAMAAd8RKo+UBIKPywACQMwAAAAAGwACPvYGXpBekHKUAAADAAFuewACPkAAAAAEDpDalAAAAAAICAqRVAAAAg7JgkgIApGcAAACy32DAAHZbAABcAT4DSaR0IRakfoCkecBGb8+V45IVPgE9HKSlFqSVLsAAW4fAAI+QwACPoE8BAAGApKnARm/PAMAA9S4/PRykuy7AAFudAgACFqTPgKTKwEZvz4IXkgiBpNXARm/aAMAAj9w9HKThLsAAQj0BAAEWpPCApOvARm/PkkWSCgDAAI+yBsAAj8SBl6UFpSelzQAAleUBGqUGwADuSwAAAQOlP6XNAAAAAQEBpVcAAACDsmCSAgAAYMAAkCMBPgI9HKVjLsAAW57AAI+QAgACgKV+wEZwkRqlkMAAdmMAwACPvUqloAEgpa3AAJAzAAAAAAbAAI++gZenBqcLq0oAAMAAW5zAAI+QAAAAAQOnHqtKAAAAAgICp2cAAACSS2CMDgCngwAAALLfYMAAdlsAAFwBPgRAIiWnoICnl8BGcP1gkgIBJafOgKfFwEZw/WDAAHaIp5en7ABAIRyoAIGn+sBGcQhBAQABKwDAAHZsp/qoBwBJqA4iFqgSLsAAW4nAAI+QwACPogAhHKgnLsAAW5/AAI+QAQABgKg5wEZw/QDAAI/APgFJqcwcqdaBqdDARnEIQQEAARqp5cAAdmIAwAB2bD4BPRyqGRaqCxap+S7AAFuOwACPkMAAj6fAAEWFwAB2IU8BAAGAqh3ARnD9AMAA9hs+AT0cqrMcqnIWqlEWqj8uwABbjsAAj5DAAI+nwABPH8AAdiKYkAIAAiaqfgGAqn7ARnD9YMAAdog0qogDqoiqpAAAAAAAAABdwAD2DgFgwAB2WwFKqo4BHqqSwAC7HwABYMAAdlsAAADAAPVpTwEAAYGqt8BGcQgAwAD2Gz9JqtEiFqrVLsAAW43AAI+QwACPpgAlquiAqt/ARnD9YJICPgE9HKszFqsdFqsLLsAAW47AAI+QwACPp8AATzHAAHYdTwEAARSrN8BGcP0AAWCSAgDAAPYbPwbAAI/FgZerT6txrCkAAJWDARqrUMAA7ksAAAEDq4SsKQAAAAEBAauXAAAAt0NgkHQAAGDAAJAjAT4CSautFquxLsAAW4/AAI+QwACPqD4BPRyryC7AAFugwACPkAEAARqr58AAdmIAwACPvz9Kq/wBIKwJwACQMwAAAAAGwACPxoGXrC6sULIOAACWEwEarC/AAO5LAAABA6xisg4AAAABAQGsdAAAAJ1+YJLhAABgwACQIwE+BU6slaydAACB52CMFQEWrJ8uwABbiMAAj5DAAI+hTqzTrOAAAKe0YMAAdogBHqzmwAB2jwIAAh+tD5LgAQABgK0kwEZzVAAjIRyuABat+YCt68BGc1SSUYwbQQEAASsAwAD10hauHxauGICuCsBGc1SSUYwbklGMGysBYIwVAEmuMyIiFq43LsAAW4nAAI+QwACPogAlrlOBrkvARnNpYI2fABaubhSuZsBGc2kBAWCNn4PjjcA+AT0crzouwABbocAAj5ACAAKCr1LARnOGFq9gLsAAW5HAAI+QwACPqgDAAI/DP0mvfyIlr5YWr4MuwABbiMAAj5DAAI+hYI0TACElr7kWr6YuwABbiMAAj5DAAI+hYI0xPgFJsTYWsTouwABbj8AAj5DAAI+oPgE9HLFTLsAAW6DAAI+QAQABFrFmLsAAW5HAAI+QwACPqgDAAI+/PgE9HLGRLsAAW6HAAI+QAgACgrGpwEZzhhaxty7AAFuRwACPkMAAj6oAwACPwz9Ksd0BILHqwACQMQAAAAAGwACPv4GXs0KzR7RVAADAAFugwACPkAAAAAEDs1m0VQAAAAEBAbNmAAAAst9gwAB2WwAAXAE+AUmzcxazdy7AAFuJwACPkMAAj6I+AUmzkRyzm4CzlcBGdR5BAQABGrOqwAB2YgDAAHZsPgE9F7PQFrO+LsAAW47AAI+QwACPp8AATx4pwAB2Iz4BPRy0ORa0GBa0Bi7AAFuOwACPkMAAj6fAAE8dwAB2JE8BAAGAtD3ARnUeAMAA9hs/BsAAj8eBl7RatHy2mQAAlcABGrRbwADuSwAAAQO0j7aZAAAAAQEBtKIAAACDsmCRhQAAYMAAkCMBPgVOtTa1PwAAwABbm2DAAPKzARa1QS7AAFuNwACPkMAAj6ZJtU0WtVaAtVHARnXalb+Riz4BPRe1Zy7AAFuNwACPkCnAAI+mPz0ctYAuwABbmAIAAoC1jsBGddo0tZQDtZS2LgAAAAAAAABgwAD1ggE+Aj0ctZ8uwABCPQEAARa1roC1qcBGddqSS5GIAMAAj7I9HLW/LsAAUiwCAAKAtdTARnXaNLXaA7XatiYAAAAAAAAAYMAA9YIBPgI9HLXnLsAAQj0BAAEWtfaAtfHARnXag5SRiQDAAI+yPRy2CS7AAEI9AQABFrYYgLYTwEZ12pJMkYoAwACPsgDAAHfDAMAAj7ZJtjUWtj6AtjnARnXalb+Riz4BPRe2Ty7AAFuNwACPkIG2WMBGde/AAI+mP0q2bAEgtnnAAJAzAAAAAAbAAI/IgZe2nrbAt7UAAJW2ARq2n8AA7ksAAAEDttO3tQAAAAEBAbbmAAAAg7JgkWIAAGDAAJAjAT4CPRy28i7AAFuYAgACgLcAwEZ3UjS3BgO3BreBAAAAAAAAAGDAAPWCAT4BPRy3ES7AAFIsAgACgLcmwEZ3UjS3LAO3LLd5AAAAAAAAAGDAAPWCAT4CPRy3OS7AAEI9AQABFrdIgLdDwEZ3UpVPkWQAwACPsj0ct1wuwABCPQEAARa3a4C3ZsBGd1KSTJFlAMAAj7IAwAB3wwDAAI+2SreIASC3lcAAkDMAAAAABsAAj8mBl7e6t9y4ywAAlbgBGre7wADuSwAAAQO37LjLAAAAAQEBt/wAAACDsmCRbQAAYMAAkCMBPgI9HLgILsAAW5gCAAKAuBbARng4NLgcA7gcuJcAAAAAAAAAYMAA9YIBPgE9HLgnLsAAUiwCAAKAuDzARng4NLhCA7hCuI8AAAAAAAAAYMAA9YIBPgI9HLhPLsAAQj0BAAEWuF6AuFnARng4kkyRbwDAAI+yPRy4bS7AAEI9AQABFrh8gLh3wEZ4OJVPkXAAwACPsgDAAHfDAMAAj7ZKuJ4BILirwACQMwAAAAAGwACPyoGXuNC48sAAQQwAAJW8ARq40cAA7ksAAAEDuQPAAEEMAAAAAQEBuRQAAACDsmCReAAAYMAAkCMBPgVOuT25UAAAwABPO13AAPUdAWCSAgExuXJgkgIAPRy5ei7AAFuYAgACgLmIwEZ5IjS5jgO5jr7iAAAAAAAAAGDAAPWCAT4FPRy6NS7AAFOgAQABFrpFgLpAwEZ5IpW6kXoAwACPsz0culcuwABSLAIAAoC6bMBGeSI0unIDunK6oAAAAAAAAABgwAD1ggE+AT0cun8uwABToAEAARa6j4C6isBGeSKVu5F8AMAAj7MAwAB3w0a7Rrt+u2IAAACSS2CSAgAWu3OAu27ARnkilbqRej4BSbuIIRy7oBa7jS7AAFuMwACPkMAAj6WC0AEAAYK7qcBGee4AwAD2Gj4BPRy70ha7wC7AAFuLwACPkMAAj6ST4AEAAYK72cBGee4AwAD2HT89HLyqLsAAUiwCAAKAvL/ARnkiNLzFA7zFvRIAAAAAAAAAYMAA9YIBPgI9HLzSLsAAQj0BAAEWvOGAvNzARnkilU+RewDAAI+yPRy89S7AAEI9AQABFr0EgLz/wEZ5IpJMkX0AwACPsgDAAHfDRr1jvZu9fwAAAJJLYJICABa9kIC9i8BGeSKVupF6PgFJvj4iHL5VFr5CLsAAW4zAAI+QwACPpYLQAQABgr5ewEZ6ywDAAPYaABy+iRa+dy7AAFuLwACPkMAAj6SC0AEAAYK+ksBGessAwAD2Gj4BPRy+vIG+qcBGeTdPAQABgr7AwEZ6ywDAAPUuPwDAAI+2Tr79vwMAAJ2OYMAAdisBHL8gFr8FLsAAW5LAAI+QwACPrUQBAAGAvyHARnkiAMAA9WJJvywhHL82gr8wwEZ7V0EBAAErAMAA9dI+AT0cv2IWv0cuwABbksAAj5DAAI+tgLICAAKAv2PARnkiH79vwAB2OgkACRa/mIK/ksBGe1fAAE8lwAB2Hxa/uIK/ssBGe1fAAFBXwAB2IIG/3cBGeTcWwABAAYK/+8BGe1fAAE8xwAB2HRbAAEAogsAAQCLARntXwABFhcAAdiEWwABAR4LAAEBBwEZ7V8AATx/AAHYiFsAAQGyCwABAZsBGe1fAAE8ewAB2IxbAAECUgsAAQI7ARntXwABPHcAAdiQWwABAxoLAAEDAwEZ7V8AATzLAAHYeAADAAPVjP0rAAEDfASDAAEDswACQMwAAAAAGwACPy4GXwABBEcAAQTPAAELtAACVPgEawABBEsAA7ksAAAEDwABBTcAAQu0AAAABAQHAAEFuAAAAg7Jgj2AAAGDAAJAjAT4FScAAQXoWwABBfi7AAFuPwACPkMAAj6g+AT0cwABBlS7AAFugwACPkAEAARrAAEG0wAB2YgDAAI+/P0nAAEHJFsAAQeIWwABB3BbAAEHSgMAAQc3ARnzGVI9jlQiPL4NowAD1AD4BPRzAAEH2LsAAW6ICAAIWwABCGRbAAEIPgMAAQgrARnzGVI9jlQiPLx/AAEIuwAB2dgEAARbAAEJSgMAAQk3ARnzGlRqPZgAAwACP3T89HMAAQm8uwABToAEAARbAAEKJFsAAQn+AwABCesBGfMZUj2OVKo8wAMAAj7M9HMAAQpouwABToAEAARbAAEK0FsAAQqqAwABCpcBGfMZUj2OU/Y8xAMAAj7NKwABCwAEgwABCzcAAkDMAAAAABsAAj8yBl8AAQvLAAEMUwABD4QAAlS8BGsAAQvPAAO5LAAABA8AAQynAAEPhAAAAAQEBwABDPgAAAIOyYI76AABgwACQIwE+A0nAAENKFsAAQ04uwABbj8AAj5DAAI+oPgE9HMAAQ2UuwABboMAAj5ABAAEawABDhMAAdmIAwACPvz89HMAAQ5kuwABCPQEAARbAAEOogMAAQ6PARn4vgIqO/QDAAI+ySsAAQ7QBIMAAQ8HAAJAzAAAAAAbAAI/NgZfAAEPmwABECMAARLoAAJUtARrAAEPnwADuSwAAAQPAAEQdwABEugAAAAEBAcAARDIAAACDsmCO6QAAYMAAkCMBPgJJwABEPhbAAERCLsAAW4/AAI+QwACPqD4BPRzAAERZLsAAW6DAAI+QAQABGsAARHjAAHZiAMAAj78/SsAARI0BIMAARJrAAJAzAAAAAAbAAI/OgZfAAES/wABExMAATJgAAMAAW6MAAAABA8AARNLAAEyYAAAAAgICwABE3wAAAIOyYIwVAMAAROoAAACBKGEAXAAAXAE+FEAiIiXAAEUBgMAARPzARn95YI0TASXAAEUegMAARRnARn95YJDOASXAAEVHgMAARULARn95YJInwABE/MAARWAATsAARWzAAEV/AADAAFukYMAA8rMBFsAARYEuwABbicAAj5DAAI+iTsAARaPAAEW4AADAAFulYIwVARbAAEW6LsAAW4jAAI+QwACPoU7AAEXiwABF7wAAwABNMWDAAHYbARbAAEXxLsAAW47AAI+QwACPpz0XwABGkS7AAFuJwACPkCEcwABGsxbAAEakLsAAW4rAAI+QwACPo0EBAAErAMAA9dLAAI+iPRfAAEbALsAAW4jAAI+QgMAARtXARn95wACPoT0XwABG4C7AAFuOwACPkB/AAEb4wAB2KAEAARbAAEcILsAAW4/AAI+QwACPqADAAI+nScAARx0WwABHIS7AAFuJwACPkMAAj6I+AT0cwABHThbAAEc7LsAAW5PAAI+QwACProCyAgACgMAAR0/ARn95FsAAR1cuwABbjsAAj5DAAI+nAMAA9WM+Aj0XwABHfS7AAFuKwACPkIDA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IADAAJCbAgAClyfAAFvuAATAAJCEgZqEe4R7BqwYAGDAAJB5ASAAwACQmwIAAjcFJ8AAW+8ABMAAkIWBmoSjhKMGwABb8ABgwACQeQEgAMAAkJsCAAI3BifAAFvxAATAAJCGgZqE04TTBsAAW/IAYMAAkHkBIADAAJCbAgACNwcnwABb8wAEwACQh4GahRGFEQbAAFv0AGDAAJB5ASAAwACQmwIAAjcIJ8AAW/UABMAAkIiBmoVOhU4GwABb9gBgwACQeQEgAMAAkJsCAAI3CSfAAFv3AATAAJCJgZqFooWiBsAAW/gAYMAAkHkBIADAAJCbAgACNwonwABb+QAEwACQioGaheCF4AbAAFv6AGDAAJB5ASAAwACQmwIAAjcLJ8AAW/sABMAAkIuBmoYyhjIGwABb/ABgwACQeQEgAMAAkJsCAAI3DCfAAFv9AATAAJCMgZqGfYZ9BsAAW/4AYMAAkHkBIADAAJCbAgACNw0nwABb/wAEwACQjYGahrKGsgbAAFwAAGDAAJB5ASAAwACQmwIAAjcOJ8AAXAEABMAAkI6BmobnhucGwABcAgBgwACQeQEgAMAAkJsCAAI3DyfAAFwDAATAAJCPgZqHX4dfBsAAXAQAYMAAkHkBIADAAJCbAgACNxAnwABcBQAEwACQkIGah6mHqQbAAFwGAGDAAJB5ASAAwACQmwIAAjcRJ8AAXAcABMAAkJGBmogDiAMGwABcCABgwACQeQEgAMAAkJsCAAI3EifAAFwJAATAAJCSgZqIQIhABqwWAGDAAJB5ASAAwACQmwIAAjcTJ8AAXAoABMAAkJOBmohoiGgGwABcCwBgwACQeQEgAMAAkJsCAAI3FCfAAFwMAATAAJCUgZqI34jfBsAAXA0AYMAAkHkBIADAAJCbAgACNxUnwABcDgAEwACQlYGaiUKJQgbAAFwPAGDAAJB5ASAAwACQmwIAAjcWJ8AAXBAABMAAkJaBmom6iboGwABcEQBgwACQeQEgAMAAkJsCAAI3FyfAAFwSAATAAJCXgZqKXopeBsAAXBMAYMAAkHkBIADAAJCbAgACNxgnwABcFAABBcAAkJuBmoLRgtGKegEAAAOC0Yp6AAAAAgICgtEAAAQnYMAA9HkAgtEAAAQoYMAA9l0AAGDAAJB5AT8DCADAAJB7gADARvF8CADAAJB9gQDARvGICQAA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wADQ8AInwABcnBbAANDrLoIXwACQ5AbAAJJrgZvAAND1wADRAcAA0V8AAJQOARrAAND2wADuSwAAAQPAANEHwADRXwAAAAEBAcAA0R8AAACWiV3AAJMZAVsAAFsBPgFKwADRLgEcwADRPYDAANE1wEeQNcAAXJ0BAAEuAMAAkyEGwACSbIGbwADRZMAA0XXAANHiAADAAEYKARrAANFlwADuSwAAAQPAANGCwADR4gAAAAEBAcAA0ZIAAAClu2DAAGaeAABgwADyswE+AUrAANGiASIWwADRtRbAANGpLqIAwACSZMAAXCrAAJDqAB3AANHHwABGCgEAAYDAANHVwEeQoQDAAJEBBsAAkm2Bm8AA0efAANIBwADUpwAAwABVoQEawADR6MAA7ksAAAEDwADSDMAA1KcAAAABAQHAANIcAAAApbtgwABmngAAYLHhAT4ETsAA0kDAANJUAACphmCx5AEWwADSX4DAANJWwEeRKamGwABmpU7AANKGwADSiwAAq9dgseEBFsAA0o0ughfAAJDkScAA0pciIiEcwADSsIHAANKcwEeRQKzxAQABFsAA0rwughfAAJDkALIzASEcwADS/xzAANLhgcAA0s3AR5FArPYBAAEWwADS+S6CF8AAkOQAsjVBAQABFsAA0w4WwADTAi6iAMAAkmSCF8AAkOQAwAD10gEhHMAA00scwADTMoHAANMewEeRQKz3AQABFsAA00UughfAAJDkALI2QQEAARbAANNOLsAAXJvAAJJnAMAA9Zw+AUrAANNmARzAANOBgcAA023AR5FArPIFAAUcwADTtYHAANOhwEeRQK0FAQABFsAA08cuwABD48AAkmUAskMcwADT9IHAANPgwEeRQK0GAQABFsAA1AYuwABD48AAkmUAskQcwADUM4HAANQfwEeRQK0HAQABFsAA1EguwABD48AAkmUAskUWwADUbRbAANRhLqIAwACSZIIXwACQ5BbAANR9LsAAXJvAAJJnALI0P0rAANSYAYLAANSfwEeRZQbAAJJugZvAANSswADUxsAA1PcAAMAAXDQBGsAA1K3AAO5LAAABA8AA1M7AANT3AAAAAQEBwADU3gAAAKW7YMAAZp4AAGCx4QFKwADU6wEWwADU6y7AAEPjwACSZQbAAJJvgZvAANT8wADVDcAA1WIAAKr9ARrAANT9wADu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2gwAAAClu2DAAGaeAABgseEBPgROwADaMMAA2kQAAKmGYLHkARbAANpPgMAA2kbAR5p2qYbAAGalTsAA2nbAANp7AACr12Cx4QEWwADafS6CF8AAkORJwADahyIhHMAA2qCBwADajMBHmo2kjwEAARbAANqmLoIXwACQ5ACyNwEhHMAA2uMcwADay4HAANq3wEeajaz5AQABFsAA2t0ughfAAJDkALI5QQEAARbAANryFsAA2uYuogDAAJKJghfAAJDkAMAA9dI+AUrAANsAARzAANsbgcAA2wfAR5qNrPgEAAQcwADbSYHAANs1wEeaja0FAQABFsAA21suwABD48AAkooAskMcwADbiIHAANt0wEeaja0GAQABFsAA25ouwABD48AAkooAskQcwADbx4HAANuzwEeaja0HAQABFsAA29wuwABD48AAkooAskUWwADcARbAANv1LqIAwACSiYIXwACQ5ACyOD9KwADcEgGCwADcGcBHmrIGwACSj4GbwADcJsAA3EDAANxxAADAAFw0ARrAANwnwADuSwAAAQPAANxIwADccQAAAAEBAcAA3FgAAAClu2DAAGaeAABgseEBSsAA3GUBFsAA3GUuwABD48AAkooGwACSkIGbwADcdsAA3IfAANz0AADAAEYKARrAANx3wADuSwAAAQPAANyUwADc9AAAAAEBAcAA3KQAAAClu2DAAGaeAABgwADyswE+AUrAANy0ASIWwADcxxbAANy7LqIAwACSicAAXCrAAJDqAB3AANzZwABGCgEAAYDAANznwEecgwDAAJEBBsAAkpGBm8AA3PnAAN0KwADdXwAAqv0BGsAA3PrAAO5LAAABA8AA3RHAAN1fAAAAAAAAAFwBPgM9HcAA3SCq/QAAAADAAJEFPRzAAN07FsAA3S8uogDAAJKJqv0AAAAAwACRBT0XwADdSi7AAFyXwACQ2SvAAJL6AABHmYEAR5nXAEeaQQBHm/EAR5xOAEec1gBHnU4AAAAGAsAAkpSBm8AA3c7AAN3UwADfeAPAAFylAAABYMAAkksAAAABBcAAkpmBm8AA3hTAAN4UwADewwAAAAPAAN4vwADewwAAAAMDA8AA3kQAAACphmCx5ADAAN51AAAAgedgwACROgDAAN5+AAAAogBbAABgwACSlAE/AQkAwADek8AAklIDAAOAwADemcBH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A8ABEFvAARTfAAAABAMDwAEQbgAAAJ/hYMAAQHkAwAEQiQAAAIIXYLHhAMABEJgAAACUX2DAAFg2AAHAARCuAAAArWxgwADyswEpYLHhAT4GTsABENnAARDtAACphmCx5AEWwAEQ+4DAARDvwEfPQ6mGwABAgk7AAREgAAAAwABc0mCx4QBJwAERLRbAARE8gsABETHAR89fvxzAAFg6PgFKwAERUgGBwAERWcBHz1JJwAERaBbAARF3gsABEWzAR89fqs/AAFg9PgNOwAERnMABEaoAAK84YMAAWF0BJsABEZwBgsABEazAR89fYMAAWF1JwAERvBzAARHWFsABEc6GwAERwMBH0ACTDcAAWF9BAQABFsABEfQWwAER5YDAARHZwEfPQ6q1wABAgZsNrJUAwAD10j4BSsABEgkBgcABEhDAR89SPz2NwAESIMBHz6scwAESQITAARIswEfPhqzGAQABFsABEmOGwAESVcBH0ACTDcAAWF8AsgNJwAESdhbAARKFgsABEnrAR89fsSXAAFg8PgFKwAESkwGBwAESmsBHz1JJwAESqSIWwAESuILAARKtwEfPX7IswABYPgEWwAES0ILAARLFwEfPX7EkwABYPz4BPY3AARLmwEfPqxbAARMSFsABEv6AwAES8sBHz0OphsAAQIKU3bHoScABEykWwAETOILAARMtwEfPX7EmwABYQj4BSsABE30BgcABE4TAR89SPgJAIhbAAROrgsABE6DAR89fsSPAAFhAARbAARPIgsABE73AR89fvx3AAFhBwAEToMABE94ASsABFA4BgcABFBXAR89SScABFCGDwAEUJcBHz28+AT2NwAEUN8BHz6scwAEUV4TAARRDwEfPhqzLAQABhcABFGPAR8+rALIIP0nAARR1HMABFH6BwAEUecBHz1JBAQABKwDAAPXSPgFKwAEUjQGFwAEUlMBHz6s/SsABFKUBHMABFMCEwAEUrMBHz4aT5wIAAoHAARTNwEfPUoXAARTTwEfPqwCyLwGBmwBH0jgARwKYAEcQwABHES4ARxKmAEcX2QBHGVoARxpXAEcmbgBHKosARyzkAEcuyQBHMXgARzZQAEc4pgBHRe4AR0eDAEdI7QBHTCIAR1S7AEd4FgBHfE4AR4CUAEeCnwBHhHcAR4igAEeK4wBHjfIAR5PpAEeVaABHmHcA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RATAAO5LAAABA8AARCLAAERmAAAAAQEBwABENQAAAIOyYJE5AABgwACQ3gE+AUrAAERXASsGwACTfIGcwABEa8AARHfAAEe5AACVsAEawABEbMAA7ksAAAEDwABEi8AAR7kAAAABAQHAAESfAAAAg7JgkUEAAGDAAJDeAT4LScAAROghFsAARPYWwABE7S6sVcAAkzHAAJM1grmBJD4BSsAARRQBKz9OwABF0cAARd0AAMAAXP5gwACT6gEWwABF3y7AAFzkwACTMcAAk009HMAAResuwABc/wEAARbAAEYAgMAARfvAR/nMlU+RQwDAAJOxTsAARhvAAEYyAADAAFPFYMAAk+oBFsAARjQuwABc5sAAkzHAAJNOTsAARljAAEZwAADAAFPGYMAAk+oBFsAARnIuwABc58AAkzHAAJNPPRfAAEaMLsAAXOTAAJMxH8AARpnAAJQLAQABg8AARq7AR/p/AMAAk1Y9HMAARswunxoBAAEWwABG14DAAEbSwEf5zCKRRADAAJNpTsAARvDAAEcCAADAAF0AYMAAk+oBFsAARwQuwABc5MAAkzHAAJNNPRfAAEcihMAARxDAR/rxwABc+CnAAJPwPRfAAEdALsAAXOTAAJMxHMAAR1WBwABHScBH+gzAAF0BAwADFsAAR28uwABc1MAAkzHAAJM3gsAAR3rAR/pYhMAAR5LAR/rxAMAAlADAAJNWSsAAR6oBKwbAAJN9gZzAAEe+wABHysAASaIAAJW0ARrAAEe/wADuSwAAAQPAAEfdwABJogAAAAEBAcAAR/AAAACDsmCRWAAAYMAAkN4BPgROwABIB8AASA4AAIHTYMAAegUBHMAASBsWwABIEC7AAFzXwACTMcAAkzvAAE2zAQABgMAASDHAR/u6AMAAct09F8AASEMWwABIPC7AAFzkwACTMcAAk03AAF0CKcAAk/FJwABIxhzAAEjVFsAASMouwABc18AAkzHAAJM7wABNtAEAAYDAAEjuwEf7ugDAAHLePgE9HMAASRMcwABJChbAAEj9LsAAXN7AAJMxwACTQ0QBAAGBwABJC8BH+9EAwAD1Yk8BAAEfwABJG8AAlA0BAAEWwABJMS7AAFzkwACTMcAAk00AAMAA9S4+AT0cwABJYRzAAElYFsAASU4uwABc3cAAkzHAAJNCRAEAAYHAAElZwEf70QDAAPViTwEAAR/AAElpwACUDQEAARbAAEl/LsAAXOTAAJMxwACTTQAAwAD1LkrAAEmTASsGwACTfoGcwABJp8AASbPAAEuXAACVsgEawABJqMAA7ksAAAEDwABJyMAAS5cAAAABAQHAAEndAAAAg7JgkU4AAGDAAJDeAT4DTsAASfbAAEn7AACSTGCREwEWwABKAoDAAEn9wEf9TZJMkVBJwABKDB7AAEocwAB1jAEAAYHAAEotwEf9ZAA+AT0cwABKcS6fGgEAAYHAAEp3wEf9ZADAAJNpPgVOwABKnMAASqcAAMAATWpgwAB6BQEcwABKtBbAAEqpLsAAXNfAAJMxwACTO8AATbcBAAGAwABKysBH/U0AwABy3z0cwABK1y7AAF0DwACTMQEAAYLAAErwwEf9wADAAJNePRzAAEsDLp8aAQABgcAASwnAR/1kAMAAk2k9HMAASx0WwABLFi7AAFzkwACTMcAAk03AAF0EAgACFsAASy4uwABc1MAAkzHAAJM3HMAASzkuwABdBcAAkzEBAAGCwABLRMBH/cAAwACTYADAAJQBPRzAAEtYLsAAXQbAAJMxAQABgsAAS3HAR/3AAMAAk19KwABLiAErBsAAk3+BnMAAS5zAAEuowABTTwAAlcMBGsAAS53AAO5LAAABA8AAS7zAAFNPAAAAAQEBwABL0AAAAIOyYJGTAABgwACQ3gE+CD0cwABL3C6fGgEAARbAAEvngMAAS+LAR/7pkkeRlQDAAJNpTsAATATAAEwPAADAAE1qYMAAegUBHMAATBwWwABMES7AAFzXwACTMcAAkzvAAE3AAQABgMAATDPAR/7pAMAAcuA9HMAATD4uwABdA8AAkzEBAAGBwABMV8BH/yMAwACTXk7AAEx6wABMigAAwABdB13AAPUdAWDAAHoFATHAAEyYYMAAegUARsAATKDAAEzNwABMswAAAKNYYJGeABbAAEzGgMAATMHAR/7plcKRlj4CTsAATODAAEzvAAC3rGDAAHoFARzAAE0GFsAATPsuwABc18AAkzHAAJM7wABO/gEAAYPAAE0hwEf/sgDAAHLiScAATTQhHMAATUeEwABNOMBH/9RBAQABKwDAAPXSPgE9HMAATWqCwABNWsBH/4RPAQABhMAATW7AR//UAMAA9S4/ScAATZEWwABNpYLAAE2VwEf/hINowAD1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YMAAkN4BPgNOwACuWcAArl4AAICwYMAA9l0BFsAArmmBwACuYMBITY6AsLCbPRzAAK5zLsAAXScFAAWAwACuhsBITYGDwACujMBITamEwACulsBITbaBwACunMBITY6CwACupsBITZsAwACTpEnAAK62HMAArr+FwACuusBITc1BAQABGsAArtS2hwDAAPZsPgNOwACu78AArv4AAK+xYMAAb1ABHMAArxYWwACvCi6vksAAkzHAAJNQwABOVwEAAYDAAK8xwEhNgQDAAHKuPRzAAK9SFsAArz4uwABc3MAAkzHAAJNBTwEAARbAAK9lhsAAr1bASE5Xq7zAAG9XAMAAbptKwACveQEcwACvihbAAK+ALsAAXNTAAJMxwACTN8AARbABAAGGwACvn8BITlcAwABmyEnAAK+7HMAAr8SFwACvv8BITc1BAQABGsAAr9m2iQDAAPZsPgNOwACwBMAAsBMAAK+xYMAAb1ABHMAAsCsWwACwHy6vksAAkzHAAJNQwABOTQEAAYDAALBUwEhNgQDAAHKwPRzAALB1FsAAsGEuwABc3MAAkzHAAJNBTwEAARbAALCIhsAAsHnASE8gq7zAAG9XAMAAbptKwACwnAEcwACwrRbAALCjLsAAXNTAAJMxwACTN8AARbABAAGGwACwwsBITyAAwABmyEnAALDeHMAAsOeFwACw4sBITc1BAQABGsAAsPy2iADAAPZsPgNOwACxH8AAsS4AAK+xYMAAb1ABHMAAsUYWwACxOi6vksAAkzHAAJNQwABOUwEAAYDAALFowEhNgQDAAHKvPRzAALGJFsAAsXUuwABc3MAAkzHAAJNBTwEAARbAALGchsAAsY3ASE/pq7zAAG9XAMAAbptKwACxsAEcwACxwRbAALG3LsAAXNTAAJMxwACTN8AARbABAAGGwACx1sBIT+kAwABmyEnAALHyHMAAsfuFwACx9sBITc1BAQABGsAAshC2iwDAAPZsPgFKwACyKgEWwACyOBbAALIxLsAAQ8rAAJMxwACTOJVVwACVUj4CPRzAALJrFsAAslcuwABc3MAAkzHAAJNBr30AAAAAwABumUrAALKGARbAALKUFsAAso0uwABDysAAkzHAAJM4nS7AAJVUBsAAk6eBnMAAsq7AALLKwAC3KQAAlUABGsAAsq/AAO5LAAABA8AAst/AALcpAAAAAQEBwACy9AAAAIOyYI9yAABgwACQ3gE+BU7AALMNwACzFAAAkltgsL8BHMAAsyIWwACzFi6vksAAkzHAAJNQmssBAAEWwACzMYDAALMswEhRToHTj3kAwABypU7AALNNwACzVwAAVGDAAJRbARzAALNZLsAAXPYBAAEWwACzb4DAALNqwEhRTlSPdQDAAJOZTsAAs4jAALORAACf7GC+vwEcwACznxbAALOTLq+SwACTMcAAk1DAAE3rAQABgMAAs6vASFFOAMAAcqROwACzxMAAs8kAAKvXYLHhARzAALPXFsAAs8suv/7AAJMxwACTPK46AQABgMAAs+LASFFOALUzScAAs+0cwAC0DRbAALP+FsAAs/EurTnAAJMxwACTNqq1wAB0qamSAQABgcAAtBfASFFlAK12PgFKwAC0KAEcwAC0Ly7AAF08BQAFgMAAtEPASFFOJsAAtEkBgcAAtEnASFFlYLDUgsAAtFHASFGng8AAtFzASFHchMAAtGbASFIXAMAAk6ZJwAC0eBbAALSDgcAAtHzASFFlhEWwxT4BSsAAtJoBHMAAtKEuwABc9wYABoDAALTEwEhRThbAALTPgMAAtMrASFFOVI91g8AAtNrASFHchMAAtOTASFIXJsAAtOoBgcAAtOrASFFlYLDsgsAAtPLASFGnAMAAk6M+BUAWwAC1H4HAALUYwEhRZapWsMfAALUYwAC1KQEkwAC1WQInwABdPYHAALVSwEhRZU7AALVywAC1dwAAghdgwACQ3gEcwAC1gy7AAF0nBQAFgMAAtZbASFFOg8AAtZzASFHchMAAtabASFIXgcAAtazASFFlgsAAtbTASFGnAMAAk6ROwAC108AAteAAAJTdYMAAWMkBHMAAtgsWwAC1+BbAALXsLq+SwACTMcAAk1Cf5sAAcpyqfQEAASbAALYbAYHAALYbwEhRZWCw1ACvC0nAALYqFsAAtkYWwAC2O4bAALYuwEhT0JTcwABYy78ewABYRD4BPY3AALbQwEhTfhzAALbeFsAAttcuwABDysAAkzHAAJM4wABdKAIAAoXAALbpwEhTfhzAALbvLsAATNvAAJMxAQABgMAAtv7ASFFOAMAAk1oAwACVYj9KwAC3FAGFwAC3G8BIU34GwACTqIGcwAC3LsAAt0rAALfgAACVngEawAC3L8AA7ksAAAED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aouSmo+zQQEAASeXRQDAAPZsPg5OwADWbsAA1noAAMAAXP5gwACT6gEWwADWfC7AAFzkwACTMcAAk009F8AA1oouwABc5MAAkzEfwADWl8AAlAsBAAGBwADWrMBIbX0AwACTVj0cwADWwC7AAFz/AQABFsAA1tWAwADW0MBIaouVS4+yAMAAk7FOwADW7cAA1wQAAMAAXUpgwACT6gEWwADXBi7AAFzmwACTMcAAk05OwADXLMAA10QAAMAAXUtgwACT6gEWwADXRi7AAFznwACTMcAAk089F8AA12IuwABc5MAAkzEfwADXb8AAlAsBAAGDwADXhMBIbhkAwACTVj0cwADXpC7AAFz/AQABFsAA17mAwADXtMBIaouVTI+0AMAAk7FOwADX0sAA1+oAAMAAXUxgwACT6gEWwADX7C7AAFzmwACTMcAAk05OwADYEsAA2CsAAMAAXU1gwACT6gEWwADYLS7AAFznwACTMcAAk09OwADYVMAA2GcAAMAAXU5gwACT6gEcwADYmh/AANhtwACUCwEAAYHAANiCwEhtfQDAAF0BAwADFsAA2LouwABc1MAAkzHAAJM3gsAA2MXASG3yhMAA2N3ASG6OAMAAlABOwADZCMAA2RwAAMAAXU9gwACT6gGFwADZHsBIbrVOwADZScAA2VQAAMAAXVBgwACT6gEcwADZYoHAANlWwEhtfcAAXQEDAAMWwADZfi7AAFzUwACTMcAAkzeGwADZicBIbtyHwADZncBIbzwAwACUAD0cwADZuS7AAFzowACTMQMAAxTAANnIwEhvWggAhsAA2dTASG7ch8AA2ejASG88AMAAk1lKwADaBAEWwADaEhbAANoLLsAAQ8rAAJMxwACTOJU7wACVSD89HsAA2iar3wIAAhrAANovq+8kwADagwMnwABdURbAANp3gMAA2nLASGqLkpqPsyeA8gBKwADaigErBsAAk7aBnMAA2p7AANq6wADdggAAlVIBGsAA2p/AAO5LAAABA8AA2tTAAN2CAAAAAQEBwADa7gAAAIOyYI+9AABgwACQ3gE+DE7AANsFwADbEQAAwABc/mDAAJPqARbAANsTLsAAXOTAAJMxwACTTT0cwADbHy7AAFz/AQABFsAA2zSAwADbL8BIcHGVT4+/AMAAk7FOwADbT8AA22IAAMAAXU5gwACT6gEWwADb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wACTMcAAk1C5wAEAARbAARJPgcABEkXASJ47lCiMQQDAAHKoJsABEl8BHMABEl+CwAESWcBInkiUDgEAAS4AkwhgwACQ3gDAAGa8AMAA9W1KwAESegEcwAESkBbAARKJFsABEoEug+bAAJPQwABDysAAkzHAAJM4wABdHwEAARzAARLeFsABEsEWwAEStBbAARKjLoPmwACT0K05wACTMcAAkzaphsAAdKyswwEAARzAARMFFsABEvkWwAES8S6D5sAAk9CvksAAkzHAAJNQmtIBAAEWwAETE4DAARMOwEid9JSUk5wAwAByqQCyAADAAJVnBsAAk96BnMABEyjAARNEwAET+gAAlkIBGsABEynAAO5LAAABA8ABE2XAARP6AAAAAQEBwAETjQAAAIOyYJOnAABgwACQ3gE+AUrAAROZARzAAROxFsABE6Aug+bAAJPQwABc+QEAASbAARPpARzAARPpFsABE9mAwAET1MBIn8aWQZOplA4BAAEuAJO+YMAAkN4AwACTdAbAAJPfgZzAARP/wAEUG8ABFJYAAJZJARrAARQAwADuSwAAAQPAARQvwAEUlgAAAAEBAcABFEMAAACDsmCTtgAAYMAAkN4BPgFKwAEUTwEcwAEUXhbAARRWLoPmwACT0MAAXT4CAAKAwAEUfcBIoF0WwAEUiIDAARSDwEigXYQwk7oAwACTqgbAAJPggZzAARSbwAEUt8ABFSQAAJZMARrAARScwADuSwAAAQPAARTPwAEVJAAAAAEBAcABFOcAAACDsmCTxgAAYMAAkN4BPgFKwAEU8wEcwAEVAhbAART6LoPmwACT0MAAXSQAAAAAwACTlQbAAJPhgZzAARUpwAEVRcABFeMAAJZPARrAARUqwADuSwAAAQPAARVdwAEV4wAAAAEBAcABFXUAAACDsmCT1AAAYMAAkN4BPgJAKsABFYjAARWNASTAARW3AifAAF1hgMABFbLASKFQSsABFb4BFsABFdQWwAEVzRbAARXFLoPmwACT0MAAQ8rAAJMxwACTOJ0uwACVVAAASJb6AEiXgQBIl+0ASJhrAEiY6QBImWcASJnlAEiaUQBIm7MASJy6AEidwQBIn5MASKAqAEigsQBIoR0ASKGzAAAADwLAAJPkgZzAARXowAEV7sABFlsDwABdYgAAAWDAAPXFAAACBMAAk+aBnMABFgzAARYUCZ/sAGC+vwAEwACT54GcwAEWLMABFjAJq9cAYLHhAAEFwACT6YGcwAEWNcABFjXAARZZAAAAA8ABFj/AARZZAAAAAgICwAEWRQAABJ/sYL6/AMABFlQAAASr12Cx4QAAYMAAk+QBPwMIAcAAk+aAAMBIom8IAcAAk+eBAMBIonwJAcABFjXAAPXbAAAAAAAAAEiiuQAAAAACwACT6oGcwAEWXsABFmTAATFCA8AAXWMAAAFgwAD1xQAABQTAAJPtgZzAARaHwAEWjgnAAFEHwACTMQBgwACUewAEwACT7oGcwAEWscABFrgJwABdZMAAkzEAYMAAlEwABMAAk/CBnMABFsHAARbaGMAAXPgAYMAA8rMBKgTAAJPxgZzAARbjwAEW/hjAAF0CAGDAAPKzASoEwACT74GcwAEXEMABFxkYwABdZcAAkzEAYMAAlHsABQXAAJQKgZzAARcewAEXHsABGDUAwABdZgADwAEXMMABGDUAAAABAAABwAEXNwAAAMAAXOVgwADyswErYMAAk+oBPwEKAMABF17AAJQOBQADH8ABF3jAAJSNAAAAACOAwAEXlcBIo6QfwAEXs8AAlFkAAAAAKwFgwACUTCsCwABc+CrAAF0CKgXAAJQLgZzAARg6wAEYOsABGS4AwABdZwADwAEYTsABGS4AAAABAQHAARhaAAAAg5tgwACT6gAAYMAAk+oBPwEKAMABGG7AAJQOBQADH8ABGHvAAJSOAQABFsABGJSAwAEYjsBIpCrAAFEHwACTMcAAk+0AHsABGK7AAJRSAQABFsABGNKAwAEYzMBIpCrAAF1kwACTMcAAk+4AFsABGOKAwAEY3MBIpCrAAF1lwACTMcAAk+8CwABc+CrAAF0CKgXAAJQMgZzAARkzwAEZM8ABGhoAq8EAA8ABGUXAARoaAAAAAQEBwAEZUQAAAIObYMAAk+oAAGDAAJPqAT8BCgDAARllwACUDgUAAx/AARlywACUjgEAARbAARmLgMABGYXASKTowABRB8AAkzHAAJPtAB7AARmlwACUUgEAARbAARnJgMABGcPASKTowABdZMAAkzHAAJPuACsCwABc+CrAAF0CKgXAAJQNgZzAARu9wAEbvcABHGgAwABdaAADwAEb0sABHGgAAAABAQHAARveAAAAg5tgwACT6gAAYMAAk+oBPwQIAMAAk+0fwAEb+8AAlJABAAEWwAEcGoDAARwUwEilj8AAUQfAAJMxwACT7QAIAMAAk+8WwAEcPoDAARw4wEilj8AAXWXAAJMxwACT7wgAwACT7hbAARxhgMABHFvASKWPwABdZMAAkzHAAJPuCQHAARu9wAD12wAAAAAFwACUDoGcwAEcbcABHG3AARzmAJJDAAPAARyAwAEc5gAAAAUDA8ABHIYAAATAAFEHYMAAlHsAwAEclAAABMAAXWRgwACUTADAARyiAAAEwABdZWDAAJR7AALAARy5AAAEwABc+GDAAPKzASvAARzRAAAEwABdAmDAAPKzAStgwACT6gE/BggBwACT7YAAwEimSAgBwACT7oEAwEimWQgBwACT74IAwEimaggBwACT8IMAwEimfAgBwACT8YQAwEimjgkBwAEcbcAA9dsAAAAAEwbAAJPzgZzAARofwAEaJ8ABG7gEAbhLAAAAAQPAARo6wAEbuAAAAAICAsABGkYAAACDm2DAAJPqAMABGlkAAACDsmCMFQAAYMAAk+oBPgROwAEac8ABGnoAAMAATZpgwACUewEfwAEagMAAlI8CAAIWwAEanYDAARqXwEinHcAAUQfAAJMxwACT7YHAARqmwEinLABOwAEaysABGtUAAMAAXWlgwACUTAEewAEa48AAlFIBAAEWwAEbB4DAARsBwEinHcAAXWTAAJMxwACT7gBOwAEbI8ABGywAALhLYMAAlHsBgsABGy7ASKdDSsABGzoBH8ABG0XAAJQOBQADgsABG1nASKdDg8ABG2HASKeIhMABG23ASKfEAsAAXPgqwABdAioGwACT9YGcwAEc68ABHPTAAR00AQDAAFz9AAAAAQPAARz7wAEdNAAAAAAAAABgwADyswE+AUrAAR0BASIWwAEdCC7AAFz4wACT8AEWwAEdHS7AAF0CwACT8QbAAJP2gZzAAR05wAEdQsABHYkBAMAAXO4AAAABA8ABHVDAAR2JAAAAAAAAAGDAAPKzAT4BSsABHVYBIhzAAR1lFsABHV0uwABdZMAAkzHAAJPuQQEAASsAwAD10gEWwAEdeBbAAR1wLsAAXWTAAJMxwACT7sAAXO7AAJRPBsAAk/iBnMABHY7AAR2TwAEdzgAAwABc7wAAAAEDwAEdpMABHc4AAAAAAAAAXAE+AT01AAAAAQBgwACUTAEW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AQOJfIpDAAAAAwMDiYkAAACZPGCwrQCJmQAAAICwYMAAiqEAiaoAAACSR2DAAIlgAABcAT4CTonGidAAAMAAX3pgwACWpAEcid4WidIuwABfeMAAlpvAAJavmJACAAKAierASkEINInvA4nvigQAAAAAAAAAYMAAlqQBSon1AR+J+cAAlqoAAAAAAMAA9Wk9F4oVg4oLwEpBM6iQH4olwACWowIAAoGKLsBKQROCijTASkEgAMAAlqgGwACWtIGvikiKTYwlAADAAF99AAAAAQOKXIwlAAAAAgICimsAAACgH2DAAGnrAIp4AAAAgShhAmDAAIqhYMAAiWBcAABcAT4CT4qpiq4AAAHAAF9+YQFgwACWnlwAA4q8iycAAAABAQGKxgAAAMAAX39gwACWngAAXAE+AkmK2ByK5YOK3MBKQh5BAQABKwDAAPXSSoruAD89HIr9gYr8wEpB5CACAAIWiweDiv7ASkIegLDAAJagFosWg4sNwEpCHpJHwACWoQAARosui2yLPwAAAJk8YLCtAByLTYCLRsBKQdfAAEfCAQABFotlFotZLsAAX3jAAJabwACWr4HcwAD1cADAAGnuPgROi36LiAAAwABfemDAAJakARyLlRaLii7AAF94wACWm8AAlq9EAQABg4uWwEpChADAAPViPRyLsIKLosBKQgEgAQABFou7hIuxwEpCwcAAX3XAAJamAAA9HIvYgovKwEpCASABAAEWi+OEi9nASkLBlJbAAJanAAA9HIwGgov4wEpCASABAAEWjBGEjAfASkLBqJDAAJaoAAAAAEo/RgBKQBcASkDmAEpBtQBKQ1kAAAAEAsAAlreBr4wqjDCjkQPAAF+AAAABYMAA9cUAAAcEwACWuoGvjF6MbQmrc8AAlpsAYKyTAATAAJa7ga+MhoyVCcAAX4HAAJabAGCvzwAEwACWwIGvjK+MugnAAF+CAGDAAJWaAATAAJa8ga+MyozQCa75wACWmwBgwABrmQAEwACWvYGvjO2M9wnAAF+DwACWmwBgwABjcAAEwACWvoGvjRWNIAmu/cAAlpsAYMAAY8YABMAAlr+Br41MjV4JwABfhMAAlpsAYMAAlscAAQXAAJbGga+NY41jjl0AAAADjXeOXQAAAAYGBo19AAAEq3NgrJMAjZMAAATAAF+BYK/PAI2vAAAEwABfgmDAAJWa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AEU5BCfAAGAOHMAARRIuwABfnwEAARbAAEUjgMAARR7ASpiPkke9SwDAAJcTJ7IegcAARTTASpimBsAAl1yBscAARULAAEVVwABGAQAAsCoBGsAARUPAAO5LAAABA8AARWrAAEYBAAAAAQEBwABFfQAAAIOyYL1dAABgwAD2XQE+Ak7AAEWQwABFlQAAghdgwAD2XQEcwABFqxbAAEWcgMAARZfASplMshO9XyMAAAAAwAD100rAAEW7ASTAAEX9BCfAAGAPHMAARdcuwABfnwEAARzAAEXuFsAAReiAwABF48BKmUyB5blqRAEAAZMAwAD1LADAAJcTJ7IegcAARfjASpljBsAAl12BscAARgbAAEYZwABHsQAAsEoBGsAARgfAAO5LAAABA8AARizAAEexAAAAAQEBwABGPQAAAIOyYL1yAABgwAD2XQE+BU7AAEZQwABGXQAAsL9gwAD2XQEcwABGXy7AAF+fAQABFsAARnCAwABGa8BKmhiwv72BAMAAlxNOwABGigAAAMAAXapgwAD2XQBJwABGlBzAAEarFsAARqQWwABGnYDAAEaYwEqaGIHluWpawAD1TEEBAAGVAMAA9Zw+AT2KwABGucBKmmYkwABG4wIngQEcwABGxC7AAF+fAQABFsAARtwWwABG1YDAAEbQwEqaGIHluWqBecAA9QIAwACXEz4CQBzAAEcSFsAARwsWwABHBIDAAEb/wEqaGIHluWpawAD1TEEBAAGUAMAA9ZzAAEb/wABHFgA9isAARx/ASppmJwBOwABHO8AAR0AAAIIcYMAA9l0BHMAAR0IuwABgEMAAlusBAAGAwABHVsBKmhgAwACXX0rAAEdhASTAAEetByfAAGARg8AAR3rASpsvJ4EBgcAAR4DASpovJ50AFsAAR5eAwABHksBKmhiw97mbgsAAR6jASppmBsAAl1+BscAAR7bAAEe9wABJmwAAwABgEMAAlusAAAABA8AAR9DAAEmbAAAAAQEBwABH4QAAAIOyYL1yAABgwAD2XQE+AkfAAEftFsAAR/qAwABH9cBKm9SCHL16BQHAAEgdGsAASB29dAA+AUrAAEg5ASfAAGASAcAASGsawABIa711AD4BSsAASIgBJ8AAYBMBwABIthrAAEi2vXYAPgFKwABIzwEnwABgFAHAAEj5GsAASPm9dwA+AUrAAEkbASfAAGAVAcAASVMawABJU714AD4BSsAASXABJ8AAYBZKwABJjQEngNYGwACXYIGxwABJoMAASbPAAErUAACwSwEawABJocAA7ksAAAEDwABJwcAAStQAAAABAQHAAEnNAAAAg7JgvZYAAGDAAPZdAT4EQBzAAEnzFsAASewWwABJ5YDAAEngwEqcwIHluWpawAD1TIFKAQABlQDAAPWnwABJ4MAASfcATsAASgXAAEoMAACBEGDAAPZdASTAAEpZBCfAAGAXHMAASiQuwABfnwEAARbAAEo1gMAASjDASpzAsL+6FQDAAJcTJ7IeFsAASk6AwABKScBKnMCyPL2YScAASl8hHMAASnAWwABKaIDAAEpjwEqcwLJAvahBAQABKwDAAPXSPgE9icAASoHASp0NHMAASoiBwABKgcBKnQ1dAQABJMAASrcCJ8AAYBgcwABKnC7AAF+fAQABFsAASq2AwABKqMBKnMCyQL2oAMAAlxMAwAD2cj9KwABKwwGBwABKysBKnQ0GwACXYYGxwABK2cAASuzAAEtQAACwOQEawABK2sAA7ksAAAEDwABLAMAAS1AAAAABAQHAAEsSAAAAg7Jgva0AAGDAAPZdAT4BSsAASx4BJMAAS0wCJ8AAYBkWwABLPoDAAEs5wEqeH7C/uhUGwACXYoGxwABLVcAAS2jAAEv5AACwTQEawABLVsAA7ksAAAEDwABLfMAAS/kAAAABAQHAAEuOAAAAg7JgvncAAGDAAPZdAT4CTsAAS57AAEulAACB5WDAAPZdARzAAEvEHMAAS7MWwABLrIDAAEunwEqei4HluWqAnwEBYMAA9l0BFsAAS7cuwABfn8AAlxMAwAD05lEBAAEng/IAwAD070rAAEvUASTAAEv1AifAAGAagcAAS+7ASp6iBsAAl2OBscAAS/7AAEwRwABMwwAAsE4BGsAAS//AAO5LAAABA8AATCrAAEzDAAAAAQEBwABMQQAAAIOyYL6AAABgwAD2XQE+Ak7AAExRwABMWAAAgeVgwAD2XQEcwABMdxzAAExmFsAATF+AwABMWsBKn0aB5blqgJ8BAWDAAPZdARbAAExqLsAAX5/AAJcTAMAA9OZRAQABJ4PyAMAA9O9KwABMhwEkwABMvwQnwABgGxbAAEysgMAATKfASp9Gkku+gieDoYHAAEy4wEqfXQbAAJdkgbHAAEzIwABM28AATagAALBPARrAAEzJwADuSwAAAQPAAEzywABNqAAAAAEBAcAATQcAAACDsmC+nQAAYMAA9l0BPgJOwABNF8AATR4AAIHlYMAA9l0BHMAATT0cwABNLBbAAE0lgMAATSDASqAWgeW5aoCfAQFgwAD2XQEWwABNMC7AAF+fwACXEwDAAPTmUQEAASeD8gDAAPTvSsAATU0BJAAHJ8AAYBwWwABNcIDAAE1rwEqgFrKCvqongQEWwABNhYDAAE2AwEqgFrJ/vqAngwKBwABNnMBKoC0ngtoGwACXZYGxwABNrcAATcDAAE4QAACwBwEawABNrsAA7ksAAAEDwABNysAAThAAAAABAQHAAE3SAAAAg7JgvLoAAGDAAPZdAT4BSsAATd4BJMAATgwCJ8AAYB0cwABN7y7AAF+fAQABHMAATgYWwABOAIDAAE37wEqg+4HluWpEAQABkwDAAPUsAMAAlxMGwACXZoGxwABOFcAATijAAE6SAACwTAEawABOFsAA7ksAAAEDwABOMsAATpIAAAABAQHAAE46AAAAg7JgvMMAAGDAAPZdAT4BSsAATkYBJMAATo4EJ8AAXMwjFsAATlqAwABOVcBKoYix9bzFJ4M+JwABYMAA9l0ngw4cwABOcS7AAF+fAQABHMAATogWwABOgoDAAE59wEqhiIHluWpEAQABkwDAAPUsAMAAlxMAAEpoyABKaQoASmlkAEpsvABKbS8ASm2iAEpuZABKbuAASm85AEpvkgBKcA4ASnBnAEpwwABKcXcASnJXAEpyqwBKc4sASnQGAEp0agBKdMMASnUFAEp12gBKdqkASngrAEp4kQBKeScASnn2AEp6egBKetMASnsuAEp7hwBKfJEASn3vAEp+owBKf40ASoCOAEqA5wBKgj8ASoKYAEqC8QBKg0oASoPXAEqEZABKhPEASoV+AEqGZABKhr0ASocWAEqIVQBKiWUASom+AEqKOgBKiqsASosIAEqLZQBKjLwASo0iAEqNkwBKjewASo5FAEqOoABKjvsASo9UAEqP9QBKkK4ASpEhAEqRegBKk9QASpQmAEqUsQBKlT4ASpWtAEqWHABKlnAASphcAEqZGQBKmeUASpukAEqcjQBKnewASp5YAEqfEwBKn+MASqDIAEqhVQBKogMAAABVAAABgbEASqNiAEpaFwBKXlUASmfoAEqjYAAAAAMASqNiAAAAAADAAJdpwABgHoGyAAAAAAAAAgLAAJeJgbKkpKSpreILqmcAAAFgwAD1xQAAJQTAAJeLgbKkqaSpCScAYMAA9HkABMAAl42BsqSppKkJKMAAl2kAYMAA9l0ABMAAl46BsqSppKkGKQBdwAD1HQFgwACXiQE6AGDAAJeJIhoAwACXjxoAwACXkBoAwACXkRoAwACXkhoAwACXkxoAwACXlBoAwACXlRoAwACXlhoAwACXlxoAwACXmBoAwACXmRoAwACXmhoAwACXmxoAwACXnBoAwACXnRoAwACXnhoAwACXnxoAwACXoBoAwACXoRoAwACXohoAwACXoxoAwACXpBoAwACXpRoAwACXphoAwACXpxoAwACXqBoAwACXqRoAwACXqhoAwACXqxoAwACXrBoAwACXrRoAwACXrhoAwACXrxoAwACXsATAAJePgbKkt6S3BsAAYB8AYMAAl4kBIADAAJe0AgACkyfAAGAgAATAAJeQgbKkyKTIBsAAYCEAYMAAl4kBIADAAJe0AgAClCfAAGAiAATAAJeRgbKk2aTZBsAAYCMAYMAAl4kBIADAAJe0AgAClSfAAGAkAATAAJeSgbKk6KToBsAAYCUAYMAAl4kBIADAAJe0AgAClifAAGAmAATAAJeTgbKk+KT4BsAAYCcAYMAAl4kBIADAAJe0AgAClyfAAGAoAATAAJeUgbKlCKUIBsAAYCkAYMAAl4kBIADAAJe0AgACNwUnwABgKgAEwACXlYGypRilGAbAAGArAGDAAJeJASAAwACXtAIAAjcGJ8AAYCwABMAAl5aBsqUopSgGwABgLQBgwACXiQEgAMAAl7QCAAI3ByfAAGAuAATAAJeXgbKlOKU4BsAAYC8AYMAAl4kBIADAAJe0AgACNwgnwABgMAAEwACXmIGypUilSAbAAGAxAGDAAJeJASAAwACXtAIAAjcJJ8AAYDIABMAAl5mBsqVapVoGwABgMwBgwACXiQEgAMAAl7QCAAI3CifAAGA0AATAAJeagbKlaaVpBsAAYDUAYMAAl4kBIADAAJe0AgACNwsnwABgNgAEwACXm4GypYalhgbAAGA3AGDAAJeJASAAwACXtAIAAjcMJ8AAYDgABMAAl5yBsqWlpaUGwABgOQBgwACXiQEgAMAAl7QCAAI3DSfAAGA6AATAAJedgbKlwKXABsAAYDsAYMAAl4kBIADAAJe0AgACNw4nwABgPAAEwACXnoGypdal1gbAAGA9AGDAAJeJASAAwACXtAIAAjcPJ8AAYD4ABMAAl5+BsqY7pjsGwABgPwBgwACXiQEgAMAAl7QCAAI3ECfAAGBAAATAAJeggbKml6aXBsAAYEEAYMAAl4kBIADAAJe0AgACNxEnwABgQgAEwACXoYGypyCnIAbAAGBDAGDAAJeJASAAwACXtAIAAjcSJ8AAYEQABMAAl6KBsqdOp04GwABgRQBgwACXiQEgAMAAl7QCAAI3EyfAAGBGAATAAJejgbKnhqeGBsAAYEcAYMAAl4kBIADAAJe0AgACNxQnwABgSAAEwACXpIGyqIioiAbAAGBJAGDAAJeJASAAwACXtAIAAjcVJ8AAYEoABMAAl6WBsqkGqQYGwABgSwBgwACXiQEgAMAAl7QCAAI3FifAAGBMAATAAJemgbKpgqmCBsAAYE0AYMAAl4kBIADAAJe0AgACNxcnwABgTgAEwACXp4GyqgWqBQbAAGBPAGDAAJeJASAAwACXtAIAAjcYJ8AAYFAABMAAl6iBsqqQqpAGwABgUQBgwACXiQEgAMAAl7QCAAI3GSfAAGBSAATAAJepgbKrGKsYBsAAYFMAYMAAl4kBIADAAJe0AgACNxonwABgVAAEwACXqoGyq2erZwbAAGBVAGDAAJeJASAAwACXtAIAAjcbJ8AAYFYABMAAl6uBsqvbq9sGwABgVwBgwACXiQEgAMAAl7QCAAI3HCfAAGBYAATAAJesgbKsOKw4BsAAYFkAYMAAl4kBIADAAJe0AgACNx0nwABgWgAEwACXrYGyrMGswQbAAGBbAGDAAJeJASAAwACXtAIAAjceJ8AAYFwABMAAl66Bsq0YrRgGwABgXQBgwACXiQEgAMAAl7QCAAI3HyfAAGBeAATAAJevgbKtbq1uBsAAYF8AYMAAl4kBIADAAJe0AgACNyAnwABgYAAEwACXsIGyrcityAbAAGBhAGDAAJeJASAAwACXtAIAAjchJ8AAYGIAAQXAAJe0gbKkqaSpreIBAAADpKmt4gAAAAICAqSpAAAEJ2DAAPR5AKSpAAAEKGDAAPZdAABgwACXiQE/AwgAwACXi4AAwEqqMwgAwACXjYEAwEqqPwkAAMAA9dsAAAAAAQbAAJeygbKkqaSpreIAACMAAAABA6SpreIAAAAAAAAAYMAA9l0BSgABDwAuwACXjQAASqp4AEqqqAAAAAECwACXtYGyreWt6ro2C6poAAABYMAA9cUAABAEwACXt4Gyreqt6gknAGDAAPR5AATAAJe5gbKt6q3qCSjAAJdpAGDAAPZdAATAAJe6gbKt6q3qBikAXcAA9R0BYMAAl7UBOgBgwACXtQ0aAMAAl7saAMAAl7waAMAAl70aAMAAl74aAMAAl78aAMAAl8AaAMAAl8EaAMAAl8IaAMAAl8MaAMAAl8QaAMAAl8UaAMAAl8YaAMAAl8cEwACXu4GyrxGvEQbAAGBjAGDAAJe1ASAAwACXywIAApMnwABgZAAEwACXvIGysPKw8gbAAGBlAGDAAJe1ASAAwACXywIAApQnwABgZgAEwACXvYGyse6x7gaxJABgwACXtQEgAMAAl8sCAAKVJ8AAYGcABMAAl76BsrJ6snoGwABgaABgwACXtQEgAMAAl8sCAAKWJ8AAYGkABMAAl7+BsrMCswIGwABgagBgwACXtQEgAMAAl8sCAAKXJ8AAYGsABMAAl8CBsrOMs4wGwABgbABgwACXtQEgAMAAl8sCAAI3BSfAAGBtAATAAJfBgbK0YbRhBsAAYG4AYMAAl7UBIADAAJfLAgACNwYnwABgbwAEwACXwoGytRG1EQbAAGBwAGDAAJe1ASAAwACXywIAAjcHJ8AAYHEABMAAl8OBsrXytfIGwABgcgBgwACXtQEgAMAAl8sCAAI3CCfAAGBzAATAAJfEgbK3erd6BqTSAGDAAJe1ASAAwACXywIAAjcJJ8AAYHQABMAAl8WBsrjAuMAGwABgdQBgwACXtQEgAMAAl8sCAAI3CifAAGB2AATAAJfGgbK5fLl8BsAAUDkAYMAAl7UBIADAAJfLAgACNwsnwABgdwAEwACXx4Gyui26LQaWFwBgwACXtQEgAMAAl8sCAAI3DCfAAGB4AAEFwACXy4Gyreqt6ro2AQAAA63qujYAAAACAgKt6gAABCdgwAD0eQCt6gAABChgwAD2XQAAYMAAl7UBPwMIAMAAl7eAAMBKrYUIAMAAl7mBAMBKrZEJAADAAPXbAAAAAAEGwACXyYGyreqt6ro2AAAjAAAAAQOt6ro2AAAAAAAAAGDAAPZdAUoAAQ8ALsAAl7kAAEqtygBKrfoAAAABHgTAAJdrgbKDmoPKBsAAYHkAYMAA9l0BJ8AAYHoEwACXbIGyhb2F6QbAAGB7AGDAAPZdASfAAGB8BMAAl22BsoazhucGwABgfQBgwAD2XQEnwABgfgTAAJdugbKHsofmBsAAYH8AYMAA9l0BJ8AAYIAEwACXb4GyiH2IkgbAAGCBAGDAAPZdASeR8ATAAJdwgbKJToldBsAAYIIAYMAA9l0BJ5UIBMAAl3GBsoohikcGwABggwBgwAD2XQEnwABghATAAJdygbKLBIsvBsAAYIUAYMAA9l0BJ8AAYIYEwACXc4GyjF2MewbAAGCHAGDAAPZdASfAAGCIBMAAl3SBso1kjY0GwABgiQBgwAD2XQEnwABgigTAAJd1gbKPSY9fBsAAYIsAYMAA9l0BJ8AAXx8EwACXdoGykLuQ3AbAAGCMAGDAAPZdASfAAF9EBMAAl3eBspJgknoGwABgjQBgwAD2XQEnwABfRQTAAJd4gbKTBZM0BsAAYI4AYMAA9l0BJ8AAXtEEwACXeYGyk/yULAbAAGCPAGDAAPZdASfAAGCQBMAAl3qBspS8lNwGwABgkQBgwAD2XQEnwABe9ATAAJd7gbKWNZZkBsAAYJIAYMAA9l0BJ8AAYJMEwACXfIGylzmXYAbAAGCUAGDAAPZdASfAAGCVBMAAl32BspmCma0GwABglgBgwAD2XQEnwABglwTAAJd+gbKa35sOBsAAYJgAYMAA9l0BJ8AAYJkEwACXf4Gym6WbxAbAAGCaAGDAAPZdASfAAGCbBMAAl4CBspxknI0GwABgnABgwAD2XQEnwABgnQTAAJeBgbKeCp42BsAAYJ4AYMAA9l0BJ8AAYJ8EwACXgoGyoBqgNQbAAGCgAGDAAPZdASfAAGChBMAAl4OBsqCPoLMGwABgogBgwAD2XQEnwABgowTAAJeEgbKhpKG+BsAAYKQAYMAA9l0BJ8AAYKUEwACXhYGyoiyiUAbAAGCmAGDAAPZdASfAAEWDBMAAl4aBsqK/otIGwABgpwBgwAD2XQEnwABgqATAAJeHgbKjhaOcBsAAYKkAYMAA9l0BJ4QsBMAAl4iBsqQRpCIGwABgqgBgwAD2XQEnwABgqwABgbIASrFLAEqjlwBKqrUASq4HAAAAAgBKsUsAAAAAAMAAl8zAAGCsgbMAAAaBngAAnr4AAIG3AADAAF9cggIAgdUAAMAAj1oAAIHzAADAAG7yAACCGgAAwABDNAABAQG0xIJNAAC1zAAAAAAAGQLAAJfPgbOCxoLMi3MDwABgrQAAAWC10AAAAwTAAJfRgbODJYMyCa54ARqDBcAA7ktgthUABMAAl9KBs4NYg2UJrnkBGoM4wADuS2C2FQAEwACX04Gzg4+DngmufAEag2vAAO5LXcAA9R0BYLXbAAEFwACX34Gzg6ODo4QBAAAAA4O8hAEAAAADAwODyQAABK54YLYVAIPdAAAErnlgthUAg/EAAASufF3AAPUdAWC12wAAYMAAl88BPwQIAcAAl9GAAMBKskQIAcAAl9KBAMBKsk8IAcAAl9OCAMBKsloJAYOjtdoAAAAABwbAAJfVgbOEBoQrhRABAK57ARqEB8AA7ksAAAEDhDuFEAAAAAAAAABdwAD1HQFgthUBPgROhFaEWwAAgxRdwAD1HQFgthUBMYRtYLYVAEmEdSEchIcWhHkurnjAAJfRQQEAASsAtiA+AT0chJ2AhJjASrLYTwEAARaEoS6ueMAAl9EAwAD1Lj9JhLshHITNFoS/Lq55wACX0kEBAAErALYgPgE9HITjgITewEqy2E8BAAEWhOcurnnAAJfSAMAA9S4/SoUBAYCFCMBKstgGwACX1oGzhRWFMIYQAQCTjAEahRbAAO5LAAABA4U7hhAAAAAAAAAAYKvhAT4EToVQhVkAAIS+YLYVASMhHIVxFoVjLq54wACX0UEBAAErALYgFoV7Lq54wACX0RaFiy6uecAAl9IBYLYVToWihaYAAICgYMAA9t4BFoWxgIWowEqzn66uthdOhcSFywAAgxVgwAD0eQEWhdaAhc3ASrOfgxW2GEqF4gEfhe2r7AMAA4GF+MBKs9uChf3ASrP4goYFwEqz+AAGwACX14GzhhWGKYaTAQCDiQEahhbAAO5LAAABA4YyhpMAAAAAAAAAYMAA9HkBPgFKhjgBHIZKOb7kgywBAAEchnEchmwWhmMWhlUurnjAAJfRg4m2HYM+AQABNxEAwAD1oF0BAAEchooWhoEWhnMurnnAAJfSg4m2HYM+AQABNxMAwAD1oADAAPWeAMAA9JEGwACX2oGzhpiGsoeJAwBBARqGmcAA7ksAAAEDhrSHiQAAAAEBAYa1AAAAg5tbAABgwADyswE+A0mGwh6GxsAA7l4CAAIugIbWwEq07ABKht4BKT9Jhu8hJYb5gIbzwEq07GDAAJfPSocYASo/SocqASIchz8WhzEurnjAAJfRQQEAARaHSICHQsBKtOyueAAAtiAAHIdvFodhLq55wACX0kEBAAEWh3iAh3LASrTsrnkAALYgBsAAl9yBs4f/iAaJugAAwABgrsAAl8wAAAABA4gSiboAAAABAQGIGgAAAMAAYK9gwAD2XQAAYMAA9l0BPgVOiDaIOQAAg3pgwAD2pwEfiD/AAPbGAAAAAD0ciFaBiFPASrW6ghEBAAEkiGcCgIhewEq1oSeCpgDAAPa7SYizIRyIxRaIty6ueMAAl9FBAQABKwC2ID4BPRyI2YGI1sBKtbqCEQEAASQABSeZCRaI8RaI4y6ueMAAl9GBi7YZJ4CbFokUFokGLq54wACX0YTCthonmQoAwAD2uz9JiSohHIk8FokuLq55wACX0kEBAAErALYgPgE9HIlQgYlNwEq1uoIRAQABJAAFJ8AAYLAWiWkWiVsurnnAAJfSgYu2GSeAmxaJjBaJfi6uecAAl9KEwrYaJ5kKAMAA9rs/SomiARyJrIGJqcBKtbojAAAAAMAA9sAGwACX2IGzib+J1oqkAQCsJgEaicDAAO5LAAABA4ngiqQAAAAAAAAAYMAA9l0BPgFJieYhHIn4FonqLq54wACX0UEBAAErALYgPgFKigkBHIoQLsAAYK7AAJfMAQABFopCFoo1FoorFoodLq54wACX0a6utheC0cAA9uyBecAA9QIAwACX3D4BSopcARyKYy7AAGCuwACXzAEAARaKlRaKiBaKfhaKcC6uecAAl9KurrYXgtHAAPbsgXnAAPUCAMAAl9wGwACX3YGziqmKvItxAAAjARqKqsAA7ksAAAEDisSLcQAAAAAAAABgwAD2XQE+AUmKzSEcit8WitEurnjAAJfRQQEAASsAtiA+AUqK8AEcivcuwABgrsAAl8wBAAEkiyABFosVFosHLq54wACX0a6uthcAwACX3D4BSos2ARyLPS7AAGCuwACXzAEAASSLZgEWi1sWi00urnnAAJfSrq62FwDAAJfcAABKsqMASrNwAEq0NgBKtMYASrV7AEq2zQBKt5AASrg2AAAABwLAAJfggbOLdouFjXAHwABgsQAAAWDAAPXFAAFgwABu8wABBcAAl+aBs4vmi+yMFwEAAAOMFYwXAAAAAAAAAGDAAJfgAT8BCQGL7MAA9dsAAAAAAwbAAJfigbOMHIxDjOIAAMAAQk4BGowdwADuSwAAAQOMUoziAAAAAgICjG8AAACDHWDAAG8DAIyRAAAAwABMKGDAAG74AABgwABvHwE+AUqMnwEfjKrAAJgsAgACgIzNwEq42IGM18BKuOUABsAAl+OBs4znjPiNBgAAroQBGozowADuSwAAAQONAo0GAAAAAAAAAFwBPgAGwACX5IGzjQuNKY1uAACugwEajQzAAO5LAAABA41AjW4AAAAAAAAAYLXQAT4BSo1JASCNVsAAl+0AAAAAAABKuK8ASrkaAEq5RgBKuYMAAAADAsAAl+eBs454jn6PmQPAAGCyAAABYLXQAAAAAQXAAJftgbOOr461jskBAAADjseOyQAAAAAAAABgwACX5wE/AQkBjrW12gAAAAADBsAAl+mBs47OjuWO9AEArCYBGo7PwADuSwAAAQOO7470AAAAAAAAAGDAAPZdAUqO8gEnAAbAAJfqgbOO+Y8ej0kBAK57ARqO+sAA7ksAAAEDjy6PSQAAAAAAAABdwAD1HQFgthUBSo8xATqPMWC2FQAGwACX64Gzj06PaY+XAQCTjAEaj0/AAO5LAAABA490j5cAAAAAAAAAYKvhAUqPdwEfj3ur7AMAAysrKwAAAEq54wBKuhcASrpUAEq6kAAAAAMCwACX7oGzj9SP2pI9A8AAYLMAAAFgwAD1xQAAAwTAAJfwgbOP9ZACCa54AGDAAPR5AATAAJfxgbOQEJAbCa56AGDAAPR5AATAAJfygbOQKZA4CcAAQjYAYMAA9HkAAQXAAJf3gbOQPZA9kIUAAAADkEmQhQAAAAMDA5BPAAAErnhgwAD0eQCQYwAABK56YMAA9HkAkHUAAATAAEI2YMAA9HkAAGDAAJfuAT8ECAHAAJfwgADASrsfCAHAAJfxgQDASrssCAHAAJfyggDASrs5CQGQPcAA9dsAAAAAAgbAAJf0gbOQppCqka4AAMAAYLQAAAABA5C1ka4AAAABAQGQxwAAAIIcYMAAmBMAAGDAAPR5AT4BR5DTgJDbwEq7pAMBkP8akP/AAJgZAD4BSpEOARaRFS6ueMAAl/ABkUAakUDAAJgbAD4BSpFNARaRVC6uesAAl/EBkX0akX3AAJgaAD4BSpGOARaRlS7AAEI2wACX8gbAAJf1gbORs5HGkjsAACMBGpG0wADuSwAAAQORzpI7AAAAAAAAAGDAAPZdAT4BSpHXASQACCfAAGC1FpHzLq54wACX8CeAmyfAAGC2FpIRLq56wACX8SfAAGC3FpImLsAAQjbAAJfyJ4LaAABKu4IASrwYAEq8gwAAAAICwACX+IGzknKSgZK9B8AAYLgAAAFgwAD1xQAAAAEFwACX/AAAAAAEAAADAAAAAAAAAAAAYMAAl/gBPwEJAQDAAPXbAAAAAAEGwACX+oGzkpWSq5K7AwJEAAAAAQOSrZK7AAAAAQEBkrYAAACDsmDAAIlgAABgwACX7gAAAEq83ABKvQ8AAAABAsAAl/2Bs5L9kwOVNAPAAGC5AAABYMAA9cUAAWDAAJf4AQTAAJgAgbOTUpOUGMAAYLrAAJfMAF3AAPVOAmDAAIlgYMAAl+4BHpNvwAC7FwACYMAAiWBgwACX7gAAAQXAAJgGAAAAAAQAAAMAAAAAAAAAAABgwACX/QE/AQkBAMAA9dsAAAAAAwbAAJgCgbOTmZOelGoAAMAAYLsAAAABA5OvlGoAAAAEBASTvwAAAIOyYMAAiWAAk8kAAACueGDAAPR5AJPcAAAArnpgwAD0eQCT7QAAAMAAQjZgwAD0eQAAXAE+AT0clAQuwABgvAIAAoCUIsBKvcYflCzAAJf3AwADgZQ5wEq904KUSMBKveCDlFXASr3tAADAAJgDBsAAmAOBs5RvlHSU4QAAwABgvAAAAAEDlIiU4QAAAAICApSRAAAAg7JgwACJYACUpAAAAMAAYL1gwACX7gAAXAE+AT0clMgWlLguwABgusAAl8zAAJgAgLICAAKAlMnASr5bgZTRwEq+aADAAPVjBsAAmASBs5TmlQiVMgMARAEalOfAAO5LAAABA5UKlTIAAAABAQGVEwAAAIOyYMAAiWAAAGDAAJfuAUqVHAEclSwWlRwuwABgusAAl8zAAJgARAEAAYCVLcBKvs4AwAD1YgAASr2kAEq+OQBKvqgASr8JAAAAAwLAAJgHgbOViJWNmk4LwABgvgAAAWDAAPXFAAAFBMAAmAmBs5WNlY0JJwBgwAD0eQAEwACYC4GzlY2VjQkowACXzABgwAD2XQAEwACYDIGzlY2VjQYpAF3AAPUdAWDAAJgHAToAYMAAmAcCGgDAAJgNGgDAAJgOBMAAmA2Bs5dQl1AGwABgvwBgwACYBwEgAMAAmBICAAKTJ8AAYMAABMAAmA6Bs5pHmkcGwABgwQBgwACYBwEgAMAAmBICAAKUJ8AAYMIAAQXAAJgSgbOVjZWNmk4BAAADlY2aTgAAAAICApWNAAAEJ2DAAPR5AJWNAAAEKGDAAPZdAABgwACYBwE/AwgAwACYCYAAwEq//wgAwACYC4EAwErACwkAAMAA9dsAAAAAAQbAAJgQgbOVjZWNmk4AACMAAAABA5WNmk4AAAAAAAAAYMAA9l0BSgABDwAuwACYCwAASsBEAErAdAAAAAECwACYE4GznIaci6DaC8AAYMMAAAFgwAD1xQAABgTAAJgVgbOci5yLCScAYMAA9HkABMAAmBeBs5yLnIsJKMAAl8wAYMAA9l0ABMAAmBiBs5yLnIsGKQBdwAD1HQFgwACYEwE6AGDAAJgTAxoAwACYGRoAwACYGhoAwACYGwTAAJgZgbOd9533BsAAYL8AYMAAmBMBIADAAJgfAgACkyfAAGDEAATAAJgagbOfW59bBsAAYMUAYMAAmBMBIADAAJgfAgAClCfAAGDGAATAAJgbgbOg1aDVBsAAYMcAYMAAmBMBIADAAJgfAgAClSfAAGDIAAEFwACYH4GznIuci6DaAQAAA5yLoNoAAAACAgKciwAABCdgwAD0eQCciwAABChgwAD2XQAAYMAAmBMBPwMIAMAAmBWAAMBKwY8IAMAAmBeBAMBKwZsJAADAAPXbAAAAAAEGwACYHYGznIuci6DaAAAjAAAAAQOci6DaAAAAAAAAAGDAAPZdAUoAAQ8ALsAAmBcAAErB1ABKwgQAAAABAsAAmCCBs6FloWunqAPAAGDJAAABYMAAbx8AAAYEwACYIoGzouWi7garAwBgwAD2XQEnwABgygTAAJgjgbOjDqM/CcAAYMsAYMAAl/0BH6MpwACYBgAAAAAEwACYJIGzo2GjZwnAAEwoAGDAAG74AATAAJglgbOje6OKGMAAYMwAYMAAl/gBKwTAAJgmgbOjoqOwGMAAYM0AXcAA9R0BYMAAmKABKwTAAJgngbOjyqPaGMAAYM4AYMAAmEcBKwEFwACYLIGzo9+j36YSAAAAA6QBphIAAAADAgOkFwAAAIMdYMAAbwMApCYAAATAAEwoYMAAbvgApD4AAADAAGDPYMAAmO4BKwBgwACYIAE+BD0XpE8uwABgzCMhHKRqgqRhwErDB0EBAAErAMAA9dIfpIDAAJkYAgACFqSVLsAAYMvAAJgjgqSrwErDBwAWpL8uwABgy8AAmCMBYMAAl/jAAJglTqTdpOoAAMAAYNBgwABvDwEcpPWApOzASsLrwABMLQEAARqlCMAAmCIAwABvBT0XpREuwABgzTGlImDAAJigAh+lLsAAmGACAAKDpUTASsN0FqVSLsAATCjAAJgkABelYS7AAGDOH6V4wACYUQIAAoOljsBKw3QWpZwuwABMKMAAmCQAwACYJ8AAmCZJpbAhHKW9gqW0wErDB0EBAAErAMAA9dI+AT0cpd0Wpc4uwABgzcAAmCZPAQABH6XlwACZEAIAAoKl9sBKwwcWpgAuwABMKMAAmCQAAMAA9S4/AggBwACYJIEAwErC+AkBo9/AAG8jAAAAAAIGwACYKYGzphemKKbKAADAAEJPARqmGMAA7ksAAAEDpi+mygAAAAICAqY4AAAAg7JgwACJYACmUQAAAIIaYMAAQ3UAAFwBPgI9HKabH6ZhwACY7QMAAxamci7AAGDMwACYJRamgy7AAEwowACYJBamiy7AAGDNwACYJgCp9QEAAYCmocBKxJQAwACYuT01AAAAAQBgwACYRwEWpqwuwABgzsAAmCcjHKa+ggDASsT5QQEAASsAACscpr6CAMBKxPmn9QAAAADAAJhPAVwGwACYKoGzps+m4KemAADAAEI3ARqm0MAA7ksAAAEDpuunpgAAAAQEBKb7AAAAg7JgwACJYACnBQAAAK54YMAA9HkApxgAAACuemDAAPR5AKcpAAAAwABCNmDAAPR5AABcAT4BPRynVRanQC7AAGDLwACYI8AAYLsEAASAp3DASsVggad2wErFbYKnhcBKxXqDp5LASsWHAMAAmAIAAErEawBKxTcASsXTAAAAAgLAAJgtgbOoPqhErpoDwABg0QAAAV3AAIiFAWC10AAAAQTAAJgvgbOopqisCcAATCgAYMAAbvgAAQXAAJg4gbOosai3qNkBAAADqMyo2QAAAAEBAajSAAAEwABMKGDAAG74AABgwACYLQE/AggBwACYL4AAwErGOAkBqLfAAIjPAAAAAAYGwACYMYGzqN6o8KkZAACfGgAAAAEDqPWpGQAAAAEBAaj+AAAAg7JgwACJYAAAYLXQAUqpBwE1AAAAAQBgwACJYAGAqQfASsaJIxypDYEAwErGoEEBAAErAAArHKkNgQDASsaglA4BAWC10AEuAMAAiWgBYLXQBsAAmDKBs6keqTypfgAAwABCPQEaqR/AAO5LAAABA6lFqX4AAAABAQGpTgAAAIOyYMAAiWAAAGC10AFKqV0BHKlkFqldLsAATCjAAJgvwABMKgEAAYCpecBKxwgAwABu+gbAAJgzgbOpg6mhqpYAAJWjARqphMAA7ksAAAEDqbmqlgAAAAEBAanRAAAAg7JgwACJkgAAYLXQAT4DTqnvqgEAAKBhYLXQARyqChaqAy7AAEwowACYL8AATCoBAAGAqh/ASsdnAMAAbvpJqiohHKpAgaouwErHfEEBAAErAMAA9dI+AUqqUQGBqljASsd8P0qqdQEcqnwunxoBAAEWqoeAqoLASsdnkkfAAImUAMAAmDEGwACYNIGzqpuquax3AADAAEdLARqqnMAA7ksAAAEDqtWsdwAAAAEBAar4AAAAg7JgwACKxgAAYLXQAT4ETqsWqygAAKBhYLXQARyrMRarKi7AAEwowACYL8AATCoBAAGAq0bASsgbAMAAbvpJq1EhHKtngatVwErIMEEBAAErAMAA9dI+AUqreAGBq3/ASsgwP0arnKvLq6kAAACdZmDAAIlgABarvYCruMBKyBvAAEdNwACKyD4CTqvlq/cAAKBhYLXQARyr+S6fGgEAAYKr/8BKyIkAwACYMUmsEyEcrCmDrBfASsirQQEAASsAwAD10j4BSqw8AYOsQ8BKyKs/SqxoASsGwACYNYGzrHysmq2XAADAAEdOARqsfcAA7ksAAAEDrLWtlwAAAAEBAazXAAAAg7JgwACK9QAAYLXQAT4DTqz1rQcAAKBhYLXQARytEBatCS7AAEwowACYL8AATCoBAAGArSXASskgAMAAbvpJrTAhHK1Gga00wErJNUEBAAErAMAA9dI+AUqtVwGBrV7ASsk1P0qtewEcrYIunxoBAAEWrY2ArYjASskggIrAAIrnAMAAmDEGwACYNoGzrZytuq6YAADAAEbkARqtncAA7ksAAAEDrcmumAAAAAEBAa3YAAAAg7JgwACK4wAAYLXQAT4DTq32rggAAKBhYLXQARyuERauCi7AAEwowACYL8AATCoBAAGAribASsnUAMAAbvpJrjEhHK5Hga41wErJ6UEBAAErAMAA9dI+AUquWAGBrl/ASsnpP0qufAEcroMunxoBAAEWro6AronASsnUgIrAAIrnAMAAmDEAAErGaQBKxt8ASsdAAErH8gBKyPcASsmrAErKXwAAAAYCwACYOYGzruuu+q+7B8AAYNIAAAFgwAD1xQAAAAEFwACYPwAAAAAEAAADAAAAAAAAAAAAYMAAmDkBPwEJAQDAAPXbAAAAAAIGwACYO4GzrxuvN689AQLAAEwoAAAAAQOvPa89AAAAAAAAAGDAAG74AAbAAJg9gbOvQq9Ur7kAAMAAYNMAAAABA69sr7kAAAABAQGvdQAAAIOyYMAAiWAAAGC10AE+AUqvgQEcr6ofr4zAAJg4AQABFq+iLsAATCjAAJg7AJ8aAQABgK+wwErLEwDAAJgxAABKysgASsrxAErLVgAAAAICwACYQIGzsA2wE7vUN8AAYNQAAAFgwACYoAABYMAAmDkAAQXAAJhGAAAAAAQAAAMAAAAAAAAAAABgwACYQAE/AQkAAMAAmKgAAAAAAgbAAJhCgbOvG683rz0BAsAATCgAAAABA689rz0AAAAAAAAAYMAAbvgABsAAmESBs69Cr1SvuQAAwABg0wAAAAEDr2yvuQAAAAEBAa91AAAAg7JgwACJYAAAYLXQAT4BSq+BARyvqh+vjMAAmDgBAAEWr6IuwABMKMAAmDsAnxoBAAGAr7DASsv/AMAAmDEAAErLtABKy90ASsxCAAAAAgLAAJhHgbOwDbATu9QDwABg1QAAAWDAAJhAAAADBMAAmEmBs7B8sIgJwABg0ABgwABvDwAEwACYSoGzsLawvAnAAEwoARqwjcAA7ktgwABu+AAEwACYTIGzsOOw7wnAAGDWwACXzABdwAD1TgJgwAD0eV3AAPUdAWC12wEysO1gwAD0eV3AAPUdAWC12wABBcAAmFGBs7D0sPSxKQAAAAOxCbEpAAAAAgICsQ8AAATAAGDQYMAAbw8AsSIAAATAAEwoYMAAbvgAAGDAAJhHAT8DCAHAAJhJgADASsz9CAHAAJhKgQDASs0MCQGw9MAAmEYAAAAAAgbAAJhOgbOxLrE/tMcAAMAAYNcBGrEvwADuSwAAAQOxRbTHAAAAAwMDsU4AAACDsmDAAIlgALFbAAAAgxVgwACYagCxbAAAAIIcYMAAmIQAAFwBPgVOsYqxnAAAoGFgtdABHLGeLsAAYNMBAAGAsbfASs1yAMAAmD1JscIcsdiDscbASs2fQQEAASsAwAD10kqx4QA/SbJpHLJ6FrJ0gbJtwErNf4CKwACYcEEBAAErAMAA9ZxKsoMAP0mzJyEcs0EcszIWsysuwABg1sAAl8zAAJhMRAEAARazOoGzM8BKzX+AisAAmHAAwAD1YkEBAAErAMAA9dJKs0oAP0m0LBy0NYK0MMBKzYxBAQABGrRBwACYiwDAAPXSPgE9HLRaFrRTLsAAYNbAAJfMwACYTICyAgACFrRigbRbwErNf4CKwACYcCsAwAD1Yz4BPRy0ixa0hC7AAGDWwACXzMAAmEyAsgIAAha0k4G0jMBKzX+AisAAmHAWtK6DtJzASs2frny11wDAAPVjBsAAmE+Bs7VjtWi70gAAp/UAAAABA7Vuu9IAAAAAAAAAXAE+Ak61igAAAMAAYNhdwAD1HQFgtdsARrWjALWsAAAAgxVgwAD0eQA1tcMAAAEAXcAA9R0BYMAA9HkBHLXDFrW+FrW2LsAAYNbAAJfMwACYTIHcwAD1cIChAAAAAMAA9PE1AAAAAQBbARy1zYK1y8BKzxyAogAAAADAAPUwggDASs8cQT4JTrXhtfQAAMAAYNldwAD1HQFgtdsBHLX9FrX2LsAAYNbAAJfMwACYTEQBAAGBtf7ASs8OAMAA9WJJtsgctuCAtszASs73QQEAAYK248BKz3oAwAD10kK29wA/TrcNtxUAAID8YMAA8rMBKk63KLcxAADAAGDaYMAA9HkBk063T7dWAADAAGDbXcAA9R0BYLXbATq3WGC12wBJt2gct3+Ct2zASs96QQEAASsAwAD10j4CPYy3ksBKz+QWt7GAt53ASs73WsAA9Uw9i7fBwErP1ClJt94ct/aAt+LASs73QQEAASsAwAD10j4BPY24CcBKz/aCuBLASs96PgdOuEG4RQAAm3dgwAD0eQEWuFqCuEfASs96WsAA9UxJuGocuHKGuG7AStB1gIsBAAEWuIiAuHTASs73WsAA9UwAwAD1qD2OuJDAStB1FriqgLiWwErO91rAAPVMP065OLk6AABbYMAA9HkBk0FFuUcBAAAAAQBgwAD0eQGPuUzAStDRkwEcuVWHuVPAStDRXAEAAYa5V8BK0HUAwAD1pgGPuVzAStDRHLldh7lcwErQ0V0BAAGUAMAA9Z4+AUm5bSEeuXLAAO5eAgACHLmOgrl8wErPekQBAAGHuY/AStDRAMAA9SwcuaaAuZPASs73RAEAAYe5p8BK0NEAwAD1LABCuawBPz2LucXASs/UHLnRh7nPwErQ0UEBAAGTAMAA9Zw9jLnfwErP5By6BRa5/oC56sBKzvdawAD1TIFBAQABh7oHwErQ0QDAAPWfSboSHLoYh7oWwErQ0VwBAAEWui2CuhrASs96WsAA9UwAwAD1pj4BPY26QcBKz/Ycul2CukrASs96gP8BAAGHumXAStDRAMAA9UA/PYi6gcBKzveCupfASs96Q7qyHLrENQAAAAEAYMAA9HkBhLq5wErP5DUAAAABAGDAAPR5AYy6ucBKz+QcusGGAMBK0iCBQQEAAZQAwAD1n4YAwErSIICLAQABkwDAAPWoPgE9HLrgFrrTLsAAYNDAAJhJwABMMwIAAYG67MBKzw4BgPwiHLsGhLr9wErP5EEBAAGTAMAA9ZwAg7sOwErP1MAAbxNGuya7SLs4AAAArsFgtdsAhbtAwErP9j4BPRy7Xxa7Ui7AAGDQwACYScAATDIDAAOBu2zASs8OHruAwACXzgEAARa7l4a7ksBK0rOufrXdABa7roa7qcBK0rOuf7XeAMAAbxIAAErNSQBKztEAStMRAAAAAgLAAJhSgbO8IrwowABNZTfAAGDcAAABYMAAmKAAAWDAAJg5AAEFwACYWAAAAAAEAAADAAAAAAAAAAAAYMAAmFIBPwEJAADAAJioAAAAAAIGwACYVIGzrxuvN689AQLAAEwoAAAAAQOvPa89AAAAAAAAAGDAAG74AAbAAJhWgbOvQq9Ur7kAAMAAYNMAAAABA69sr7kAAAABAQGvdQAAAIOyYMAAiWAAAGC10AE+AUqvgQEcr6ofr4zAAJg4AQABFq+iLsAATCjAAJg7AJ8aAQABgK+wwErTvADAAJgxAABK03EAStOaAErT/wAAAAICwACYWYGzvCK8KMAATWUDwABg3QAAAWDAAJhSAAACBMAAmFuBs7yRvJ0JwABg0ABgwABvDwAEwACYXIGzvMu80QnAAEwoARq8osAA7ktgwABu+AABBcAAmGCBs7zWvNa9CwAAAAO8670LAAAAAgICvPEAAATAAGDQYMAAbw8AvQQAAATAAEwoYMAAbvgAAGDAAJhZAT8DCAHAAJhbgADAStSACAHAAJhcgQDAStSPCQG81sAAmFgAAAAAAQbAAJhegbPAAEWwwABFwcAATWMAAMAAYNcBGsAARbHAAO5LAAABA8AARcfAAE1jAAAAAwMDwABF0AAAAIOyYMAAiWAAwABF3QAAAIMVYMAAmGoAwABF7gAAAIIcYMAAmIQAAFwBPgdOwABF/sAARgsAAKA/YMAA9HkBFsAARhSBwABGDcBK1RCAisAAmHBJwABGHxzAAEYwg8AARiPAStU0QQEAASsAwAD1nErAAEY5AD9JwABGRhzAAEZPgsAARkrAStUfQQEAARrAAEZbwACYmwDAAPXSPgI9HMAARnkWwABGbC7AAGDQwACYW8AATDADAAOAwABGgsBK1QGDwABGiMBK1TQgwABGnLZNAAAAAADAAG8RSsAARr0AP07AAEbiwABG9AAAoGFgtdABHMAARvYuwABg0wEAAYDAAEcPwErVAQDAAJg9ScAARxocwABHMITAAEcewErV6kEBAAErAMAA9dJKwABHOQA/T8AAR0bAAEdLAAABwABg3mEBYMAAmAdcAAPAAEdbwABIYgAAAAEBAcAAR28AAADAAGDfYMAAmAcAAFwBPgJOwABHmsAAR6kAALS3YLYVAR7AAEe1wACXzgIAAoTAAEfHwErV6obAAEfawErWYQBJwABH9SEcwABICIfAAEf5wErWeEEBAAErALYgPgE9HMAASCgWwABIGy7AAGDQwACYW8AATDADAAOAwABIMcBK1QGDwABIN8BK1TSHwABIRcBK1ngAwABvET9BR8AASGmCwABIccBK1R8FAcAASI0awABIjcAAmIoAPgI9HMAASdaFwABJxsBK1j4gAQABGsAASerAAJgNAABCwABJ+gABwABKFRrAAEoVwACYiwA+Aj0cwABKN4XAAEonwErWPiABAAEawABKS8AAmA4AAELAAEpbAAHAAEp2GsAASnbAAJiMAD4DTsAASpHAAEqeAADAAGDgYMAAmGEBHsAASrnAAJhnAQABJsAAStQBgMAAStTAStUBYMAAiw8APRzAAErzhcAASuPAStY+IAEAARbAAEsBhsAASvTASteNwABg38AAmGUAAELAAEseAA7AAEs5GsAASznAAJiOwABLVRrAAEtVwACYjcAAS24awABLbsAAmI/AAEuKGsAAS4rAAJiQwABLpRrAAEulwACYkcAAS8MawABLw8AAmJLAAEveGsAAS97AAJiTwABMCBrAAEwIwACYlMAATCoawABMKsAAmJXAAExPGsAATE/AAJiWwABMchrAAExywACYl8AATJIawABMksAAmJjAAEy3GsAATLfAAJiZwABM2RrAAEzZwACYmgA+Aj0cwABNBIXAAEz0wErWPiABAAEawABNGMAAmA0AAELAAE0oAAHAAE1DGsAATUPAAJibAD4BQsAATVQAAABK1MwAStjoAAAAAQLAAJhhgbPAAE2OwABNlMAAXpEDwABg4QAAAWDAAPXFAAADBMAAmGOBs8AATfPAAE33CYOyAGDAAIlgAATAAJhkgbPAAE/QwABP4AnAAGDiAGDAAJgTAATAAJhlgbPAAFLvwABTAQnAAGDfAGDAAJgHAAEFwACYaYGzwABTBsAAUwbAAFNNAAAAA8AAUxLAAFNNAAAAAwMDwABTGAAABIOyYMAAiWAAwABTIwAABMAAYOJgwACYEwDAAFM6AAAEwABg32DAAJgHAABgwACYYQE/BAgBwACYY4AAwErZjQgBwACYZIEAwErZnAgBwACYZYIAwErZrQkBwABTBsAA9dsAAAAAAQbAAJhngbPAAFZAwABWVMAAXo8AAcAAYOMAAAABA8AAVm7AAF6PAAAAAQEBwABWdwAAAIOyYMAAiw8AAGDAAJhhAT4BScAAVoMlwABWkxbAAFaMgMAAVofAStomgdPAAIsRYMAAi7E+BU7AAFbDwABWygAAwABCUmDAAIuxASbAAFbDARbAAFbRgMAAVszAStomgdPAAIsRYMAAi7FOwABW58AAVu4AAIHTYMAAiWABgcAAVvDAStpkTsAAVwPAAFcOAADAAGDkYMAA8rMBKkFDwABXHSXAAFcrgsAAVyTAStqYYMAAi7E+Ak7AAFddwABXagAAwABg5WDAAIuxASbAAFddAYLAAFdswEramGDAAIuxScAAV3wiJcAAV5YWwABXjYTAAFeAwEra5YQ8wACLs2DAAItiASXAAFfNFsAAV8SEwABXt8BK2uWEPMAAi7NgwACLfj4CPYvAAFflwEratClCwABYAgA+AT2KwABYJMBK2pgWwABYOoTAAFgtwEra5YQ8wACLs0nAAFhcg8AAWGDAStq0PgFKwABYvgEfwABYycAAmGkDAAOAwABY48BK2iYawABY+sAAmBkawABZFMAAmA0APgFKwABZcQEfwABZfMAAmGkDAAMWwABZnYHAAFmWwEraZJ/swACLtBrAAFm4wACYGRrAAFnSwACYDgBJwABZ7SIlwABZ/RbAAFn2gMAAWfHAStomgdPAAIsRYMAAi2IBJcAAWh4WwABaF4DAAFoSwEraJoHTwACLEWDAAIt+PgFKwABaWQEfwABaZMAAmGkDAAOAwABafMBK2iYawABak8AAmBkawABarcAAmA0AScAAWsAiIiXAAFrQFsAAWsmAwABaxMBK2iaB08AAixFgwACLlQElwABa8RbAAFrqgMAAWuXAStomgdPAAIsRYMAAix4BJcAAWxIWwABbC4DAAFsGwEraJoHTwACLEWDAAIuGPgFKwABbtgEfwABbwcAAmGkDAAMWwABb3oDAAFvZwEraJoHTwACLERrAAFv3wACYGxrAAFwPwACYDgBJwABcIiIlwABcMhbAAFwrgMAAXCbAStomgdPAAIsRYMAAiyYBJcAAXE4WwABcR4DAAFxCwEraJoHTwACLEWDAAIsPPgFKwABckwEfwABcnsAAmGkDAAMWwABcu4DAAFy2wEraJoHTwACLERrAAFzUwACYGxrAAFzswACYDgA+AkAqwABdVMAAXVkBHsAAXWWr3wIAAhrAAF19q/AkAAQnwABg5h7AAF3AwACPXAEAAYDAAF3NwEraJgAngzUewABd9sAAj4gBAAGAwABeAsBK2iYAAErAAF4rAR/AAF42wACYaQMAA4DAAF5OwEraJhrAAF5lwACYGRrAAF5/wACYDQAAAErZ+gBK3g8AAAABAsAAmGqBs8AAX+bAAF/swABoGQPAAGDnAAABYMAA9cUAAAMEwACYbIGzwABhecAAYYgJwABg6ABgwAD0eQAEwACYbYGzwABkL8AAZEIJwABg6QBgwAD0eQAEwACYboGzwABmwcAAZtIJwABg6gBgwAD0eQABBcAAmHSBs8AAZtfAAGbXwABnLAAAAAPAAGbdwABnLAAAAAMDA8AAZuoAAATAAGDoYMAA9HkAwABnAAAABMAAYOpgwAD0eQDAAGcYAAAEwABg6WDAAPR5AABgwACYagE/BAgBwACYbIAAwEretggBwACYboEAwErexwgBwACYbYIAwEre2AkBwABm18AA9dsAAAAAAgbAAJhwgbPAAGcxwABnOcAAZ1UBAICKAAAAAQPAAGc/wABnVQAAAAAAAABgwAD0eQFKwABnQgEWwABnQi7AAGDpwACYbQbAAJhygbPAAGdawABnbcAAaBcAACMBGsAAZ1vAAO5LAAABA8AAZ3XAAGgXAAAAAAAAAGDAAPZdAT4BSsAAZ34BJAAJJ8AAYOsWwABnni7AAGDowACYbCeAmyfAAGDsFsAAZ8wuwABg6sAAmG4ngJsnwABg7RbAAGf+LsAAYOnAAJhtJ5kKAABK3yUASt9qAErf8AAAAAICwACYdYGzwABoHMAAaCHAAGhfC8AAYO4AAAFgwAD1xQAACATAAJh3gbPAAGghwABoIQknAGDAAPR5AATAAJh5gbPAAGghwABoIQkowACXzABgwAD2XQAEwACYeoGzwABoIcAAaCEGKQBdwAD1HQFgwACYdQE6AGDAAJh1BRoAwACYexoAwACYfBoAwACYfRoAwACYfhoAwACYfwTAAJh7gbPAAGgwwABoMAbAAGDvAGDAAJh1ASAAwACYgwIAApMnwABg8AAEwACYfIGzwABoPcAAaD0GwABg8QBgwACYdQEgAMAAmIMCAAKUJ8AAYPIABMAAmH2Bs8AAaEXAAGhFBpvbAGDAAJh1ASAAwACYgwIAApUnwABg8wAEwACYfoGzwABoTsAAaE4Gm+8AYMAAmHUBIADAAJiDAgAClifAAGD0AATAAJh/gbPAAGhZwABoWQab2gBgwACYdQEgAMAAmIMCAAKXJ8AAYPUAAQXAAJiDgbPAAGghwABoIcAAaF8BAAADwABoIcAAaF8AAAACAgLAAGghAAAEJ2DAAPR5AMAAaCEAAAQoYMAA9l0AAGDAAJh1AT8DCADAAJh3gADASuGTCADAAJh5gQDASuGhCQAAwAD12wAAAAABBsAAmIGBs8AAaCHAAGghwABoXwAAIwAAAAEDwABoIcAAaF8AAAAAAAAAYMAA9l0BSgABDwAuwACYeQAASuHcAEriFgAAAAECwACYhIGzwABoYsAAaGfAAGlpC8AAYPYAAAFgwAD1xQAAFQTAAJiGgbPAAGhnwABoZwknAGDAAPR5AATAAJiIgbPAAGhnwABoZwkowACXzABgwAD2XQAEwACYiYGzwABoZ8AAaGcGKQBdwAD1HQFgwACYhAE6AGDAAJiEEhoAwACYihoAwACYixoAwACYjBoAwACYjRoAwACYjhoAwACYjxoAwACYkBoAwACYkRoAwACYkhoAwACYkxoAwACYlBoAwACYlRoAwACYlhoAwACYlxoAwACYmBoAwACYmRoAwACYmhoAwACYmwTAAJiKgbPAAGh0wABodAbAAGD3AGDAAJiEASAAwACYnwIAApMnwABg+AAEwACYi4GzwABogcAAaIEGwABg+QBgwACYhAEgAMAAmJ8CAAKUJ8AAYPoABMAAmIyBs8AAaI3AAGiNBrKIAGDAAJiEASAAwACYnwIAApUnwABg+wAEwACYjYGzwABolcAAaJUGm/8AYMAAmIQBIADAAJifAgAClifAAGD8AATAAJiOgbPAAGicwABonAbAAGD9AGDAAJiEASAAwACYnwIAApcnwABg/gAEwACYj4GzwABopsAAaKYGnAgAYMAAmIQBIADAAJifAgACNwUnwABg/wAEwACYkIGzwABosMAAaLAGm9kAYMAAmIQBIADAAJifAgACNwYnwABhAAAEwACYkYGzwABoucAAaLkGm98AYMAAmIQBIADAAJifAgACNwcnwABhAQAEwACYkoGzwABoxcAAaMUGnBEAYMAAmIQBIADAAJifAgACNwgnwABhAgAEwACYk4GzwABozsAAaM4GwABhAwBgwACYhAEgAMAAmJ8CAAI3CSfAAGEEAATAAJiUgbPAAGjmwABo5gbAAGEFAGDAAJiEASAAwACYnwIAAjcKJ8AAYQYABMAAmJWBs8AAaPbAAGj2BsAAYQcAYMAAmIQBIADAAJifAgACNwsnwABhCAAEwACYloGzwABpCcAAaQkGwABhCQBgwACYhAEgAMAAmJ8CAAI3DCfAAGEKAATAAJiXgbPAAGkawABpGgbAAGELAGDAAJiEASAAwACYnwIAAjcNJ8AAYQwABMAAmJiBs8AAaSjAAGkoBsAAYQ0AYMAAmIQBIADAAJifAgACNw4nwABhDgAEwACYmYGzwABpO8AAaTsGwABhDwBgwACYhAEgAMAAmJ8CAAI3DyfAAGEQAATAAJiagbPAAGlLwABpSwbAAGERAGDAAJiEASAAwACYnwIAAjcQJ8AAYRIABMAAmJuBs8AAaWDAAGlgBsAAYRMAYMAAmIQBIADAAJifAgACNxEnwABhFAABBcAAmJ+Bs8AAaGfAAGhnwABpaQEAAAPAAGhnwABpaQAAAAIC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AIgmgMAAiCHASwIPgIrAAIrnAMAAmLsGwACY04GzwACINcAAiEHAAIlrAACwHQEawACINsAA7ksAAAEDwACISMAAiWsAAAABAQHAAIhPAAAAg7JgwACJqAAAWwE+BT0XwACIWy7AAGDoHMAAiG0uwABhJAEAAYDAAIh9wEsCogDAAJjCwACYrz0cwACIiC7AAGErBAAEgMAAiKTASwKiFsAAiK+AwACIqsBLAqKVT8AAiaoWwACIui7AAGDowACYrxrAAIjUwACYlADAAJjDPRfAAIjnLsAAYOgrwACYrz0cwACJAy6fGgMAAxbAAIkOgMAAiQnASwKigTzAAImrGsAAiR/AAJh7KQDAAJi7PRzAAIk1Lp8aAwADFsAAiUCAwACJO8BLAqKVUMAAiawawACJVsAAmHsqAMAAmLsGwACY1IGzwACJcMAAiXzAAIw3AADAAEcIARrAAIlxwADuSwAAAQPAAImEwACMNwAAAAEBAcAAiYwAAACDsmDAAIm+AABbAT4KTsAAiZzAAImjAACDFWDAAPR5ARfAAImlLsAAYOgcwACJty7AAGEkAQABgMAAicfASwPKAMAAmMLAAJivPRfAAInSLsAAYOiBwACJ5MBLA9/AAJivPRfAAInwLsAAYOorwACYsEnAAIoOIRzAAIocFsAAiheAwACKEsBLA8qkusAAicBBAQABKwDAAPXSPgE9HMAAii0uwABhKwQABIDAAIpLwEsDyhbAAIpWgMAAilHASwPKpLrAAInAHMAAilwuwABhJAEAAYDAAIpswEsDygDAAJjCGsAAinzAAJiVAMAAmMM/ScAAipkhHMAAiqwWwACKooDAAIqdwEsDypVPwACJwUEBAAErAMAA9dI+AT0cwACKvS7AAGErBAAEgMAAitDASwPKFsAAituAwACK1sBLA8qVT8AAicEcwACK5i7AAGEkAQABFsAAivuAwACK9sBLA8qVT8AAicEAwACYwhrAAIsawACYlgDAAJjDPz0cwACLNS7AAGEhAQABGsAAi1HAAJh8AMAAmLY9HMAAi1wunxoBAAEWwACLZ4DAAItiwEsDypJMwACJuwDAAJi7PRfAAItzLsAAYOiBwACLhcBLA9/AAJivScAAi5EhHMAAi6EWwACLmoDAAIuVwEsDyqbFwACJwkEBAAErAMAA9dI+AT0cwACLsi7AAGEr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wABD0QAABMAAT15dwAD1TgJgjmNgklkAAGDAAJuiAT8ECAHAAJukgADATC0OCAHAAJulgQDATC0bCAHAAJumggDATC0sCQHAAEOgwAD12wAAAAABBsAAm6iBUMAAQ+LAAEP8wABE+wAAr6ABGsAAQ+PAAO5LAAABA8AARA3AAET7AAAAAQEBwABEHQAAAKsCYMAAcpgAAGDAAFhdAT4ETsAARDzAAERDAACSW2CwvwEcwABEUIDAAERFwEwts5rLAQABFsAARFoug7LAAJukAMAAcqVOwABEccAARHUAAJk8YLCtARbAAER+gcAARHfATC3MkmmwzUnAAESSIRzAAESagsAARJbATC4BQQEAASsAwAD10j4BSsAARKsBHMAARNAWwABEvYDAAESywEwts5/mwABynKp5AQABgsAARNzATC4BAK8GP0rAAETsASsAAEwtgABMLnsAAAABAsAAm6uBUMAARQDAAEUPwABGjAfAAGIAAAABYMAA9cUAAWDAAJuWAAEFwACbsQAAAAAEAAADAAAAAAAAAAAAYMAAm6sBPwEJAQDAAPXbAAAAAAMGwACbrYFQwABFN8AARUTAAEVuAAKqfQAAAAEDwABFU8AARW4AAAABAQHAAEVjAAAAqwJgwACatgAAYMAAWMkABsAAm66BUMAARXPAAEWKwABFvQACqn4AAAABA8AARaLAAEW9AAAAAQEBwABFsgAAAKsCYMAAmrYAAF3AAPUdAWDAAFiJAAbAAJuvgVDAAEXCwABFx8AARooAAqu6AAAAAQPAAEXXwABGigAAAAQDA8AARe4AAACrAmDAAHKYAMAARhMAAACsFWCw+wDAAEYyAAAAgShhA2DAAFg2YMAA9l1gwABWvVwAAcAARnkAAACV3WDAAPKzASpcAAAATC7bAEwvGwBML2EATC/WAAAAAwLAAJuygVDAAEaPwABGnsAASmUHwABiAQAAAWDAAPXFAAFgwACbqwEEwACbtYFQwABHFMAARyIYpOfAAJrRAF3AAPUdAWDAAFiJASsBBcAAm7sAAAAABAAAAwAAAAAAAAAAAGDAAJuyAT8BCQEAwAD12wAAAAACBsAAm7eBUMAARtnAAEbtwABG+QECteAAAAABA8AARvnAAEb5AAAAAAAAAGCOOAAGwACbuYFQwABHJ8AAR0rAAEpjAACqfgEawABHKMAA7ksAAAEDwABHYsAASmMAAAABAQHAAEeJAAAIqwJgwABzSgAAXcAA9R0BYMAAWIkBPgJJwABHmxzAAEeuFsAAR58upOfAAJrRwACbtUEBAAErAMAA9dI+AUnAAEe/FsAAR98WwABH0BbAAEfDLrXgwACbt5Jejj2A/MAA9P8+AT0XwABH8i6k58AAmtE6wABIA2DAAFiJAMAAm7U+Ak7AAEhCwABISQAAklFgjBUBFsAASFgWwABISy614MAAm7eSUYwbScAASGgiJcAASHOBwABIbMBMMU5gjV4BIiXAAEicgcAASJXATDFOYI2fABzAAEjLFsAASMYUwABIv8BMMU4BAWCNn4IcjaJBAQABGsAASN+N5gDAAPXSPgE9F8AASPUupOfAAJrROsAASQZgwABYiQDAAJu1PgE9F8AAST0upOfAAJrRHMAASiQcwABJeRbAAElbFsAASU4uteDAAJu3kl6OPYCfAQFgwABYiQE0wABJjwPAAEmPwABKIgAAAAEBAcAASaEAAACdfmCS4QAAYMAAWIkBPgFKwABJvgEmwABJvgEcwABJ4YDAAEnFwEwwxMAATNwBAAEfwABJ8ZLgAQABgsAASgbATDI0AADAAHOqYMAAWIkAwAD05oChAAAAAMAA9PHAAJu1P0rAAEpKARbAAEpRLqTnwACa0cAAm7UAAEwwYgBMMJEATDKzAAAAAgLAAJu8gVDAAEpowABKd8AATqIHwABiAgAAAWDAAPXFAAFgwACbqwABBcAAm8IAAAAABAAAAwAAAAAAAAAAAGDAAJu8AT8BCQEAwAD12wAAAAACBsAAm76BUMAASrXAAErJwABK1QECteAAAAABA8AAStXAAErVAAAAAAAAAGCOOAAGwACbwIFQwABK2sAASuvAAE6gAACrugEawABK28AA7ksAAAEDwABK+8AATqAAAAAEAwPAAEsSAAAAqwJgwABymADAAEs3AAAArBVgsPsAwABLVgAAAIEoYQNgwABYNmDAAPZdYMAAVr1cAAHAAEudAAAAld1gwADyswEqXAE+Ak/AAEu1wABLugAAAcAATQ9eAAECAWCSAgG11WDAAPKzAFwAA8AAS8nAAE2AAAAAAgEBwABL4QAAAIOyYJICAAHAAEvtAAAAtdVgwADyswEpXAE+BU7AAEwRwABMFgAAghdgwABYNgEcwABMI4DAAEwYwEwzecAATNwBAAEWwABMNIXAAEwvwEwz+IIXkggAwABynk7AAExIwABMTQAAgLBgwAD2XQEWwABMVIXAAExPwEwz+ICwkgZOwABMbgAAAILfYMAAVr0AScAATIKGwABMhsBMNAY+AUnAAEycIRzAAEyxFsAATKWFwABMoMBMM/iSRZIKQQEAASsAwAD10j4BPRXAAEzGwEw0fwkcwABM4IDAAEzVwEwzecAAQlsBAAEWwABM9oXAAEzxwEwz+JJFkgoAwABysj4BPRXAAE0fwEw0fwkfwABNMsAAVw8AAAAAPz0cwABNYILAAE1fwEwzlSADAAOHwABNYcBMNBsUwABNZ8BMNFoIABTAAE1twEw0fwkAAAA9HsAATYfAAHKWBAADFsAATa0uteDAAJu+gcAATbvATDOINMAATdcDwABN18AATn4AAAADAQHAAE3vAAAAgM9gkgIAAsAAThEAAACyq2DAAPKzASvAAE4AAAAAtdVgwADyswErYMAA9YIBPgFJwABOJCGGwABOKcBMNZE+AT0cwABOTITAAE49wEwzyyACAAGFwABOTcBMNYMBtdWHwABOZMBMNaEAPwHAAE9ig8AATpPATDOyAABMMxcATDNGAEw2AgAAAAICwACbw4FQwABOpcAATqvAAFYiN8AAYgMAAAFgwACbogABYMAAm7IBBMAAm8aBUMAARxTAAEciGKTnwACa0QBdwAD1HQFgwABYiQErAQXAAJvMAAAAAAQAAAMAAAAAAAMDAwAAAACDslsAAAAAAMAARfpbAAAAAADAAE9eWwAAYMAAm8MBPwEJAADAAJuqAwADgADATDZ1gQDATDZ9ggDATDaHAAIGwACbyIFQwABG2cAARu3AAEb5AQK14AAAAAEDwABG+cAARvkAAAAAAAAAYI44AAbAAJvKgVDAAEcnwABHSsAASmMAAKp+ARrAAEcowADuSwAAAQPAAEdiwABKYwAAAAEBAcAAR4kAAAirAmDAAHNKAABdwAD1HQFgwABYiQE+AknAAEebHMAAR64WwABHny6k58AAmtHAAJu1QQEAASsAwAD10j4BScAAR78WwABH3xbAAEfQFsAAR8MuteDAAJu3kl6OPYD8wAD0/z4BPRfAAEfyLqTnwACa0TrAAEgDYMAAWIkAwACbtT4CTsAASELAAEhJAACSUWCMFQEWwABIWBbAAEhLLrXgwACbt5JRjBtJwABIaCIlwABIc4HAAEhswEw3pGCNXgEiJcAASJyBwABIlcBMN6RgjZ8AHMAASMsWwABIxhTAAEi/wEw3pAEBYI2fghyNokEBAAEawABI343mAMAA9dI+AT0XwABI9S6k58AAmtE6wABJBmDAAFiJAMAAm7U+AT0XwABJPS6k58AAmtEcwABKJBzAAEl5FsAASVsWwABJTi614MAAm7eSXo49gJ8BAWDAAFiJATTAAEmPA8AASY/AAEoiAAAAAQEBwABJoQAAAJ1+YJLhAABgwABYiQE+AUrAAEm+ASbAAEm+ARzAAEnhgMAAScXATDcawABM3AEAAR/AAEnxkuABAAGCwABKBsBMOIoAAMAAc6pgwABYiQDAAPTmgKEAAAAAwAD08cAAm7U/SsAASkoBFsAASlEupOfAAJrRwACbtQAATDa4AEw25wBMOQkAAAACAsAAm82BUMAATqXAAE6rwABWIjfAAGIEAAABYMAAm8MAAWDAAJu8AAEFwACb0wAAAAAEAAADAAAAAAADAwMAAAAAg7JbAAAAAADAAEX6WwAAAAAAwABPXlsAAGDAAJvNAT8BCQAAwACbzAMAA4AAwEw5WIEAwEw5YIIAwEw5agACBsAAm8+BUMAASrXAAErJwABK1QECteAAAAABA8AAStXAAErVAAAAAAAAAGCOOAAGwACb0YFQwABK2sAASuvAAE6gAACrugEawABK28AA7ksAAAEDwABK+8AATqAAAAAEAwPAAEsSAAAAqwJgwABymADAAEs3AAAArBVgsPsAwABLVgAAAIEoYQNgwABYNmDAAPZdYMAAVr1cAAHAAEudAAAAld1gwADyswEqXAE+Ak/AAEu1wABLugAAAcAATQ9eAAECAWCSAgG11WDAAPKzAFwAA8AAS8nAAE2AAAAAAgEBwABL4QAAAIOyYJICAAHAAEvtAAAAtdVgwADyswEpXAE+BU7AAEwRwABMFgAAghdgwABYNgEcwABMI4DAAEwYwEw5/cAATNwBAAEWwABMNIXAAEwvwEw6fIIXkggAwABynk7AAExIwABMTQAAgLBgwAD2XQEWwABMVIXAAExPwEw6fICwkgZOwABMbgAAAILfYMAAVr0AScAATIKGwABMhsBMOoo+AUnAAEycIRzAAEyxFsAATKWFwABMoMBMOnyS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MMAAXskfwABe08AA9BIBAAEnwABiCwAGwACb8oFQwABfEMAAXyrAAF92AACvoAEawABfEcAA7ksAAAEDwABfO8AAX3YAAAABAQHAAF9LAAAAqwJgwABymAAAYMAAWF0BPgFKwABfXQEWwABfZC7AAE9dwACb6AAATERNAExF2gBMRyQATEd5AExH3ABMSMsATEljAExJwgAAAAcCwACb94FQwABfe8AAX4rAAGNeB8AAYgwAAAFgwAD1xQABYMAAm6sBBMAAm/mBUMAAX8/AAF/XCcAAYg0AYMAAm6sAAQXAAJwCgVDAAF/cwABf3MAAYAAAAAADwABf8cAAYAAAAAABAQHAAF/3AAAEwABiDWDAAJurAABgwACb9wE/AggBwACb+YAAwExKUAkBwABf3MAA9dsAAAAABQbAAJv7gVDAAGAFwABgHsAAYI4AAKp9ARrAAGAGwADuSwAAAQPAAGAtwABgjgAAAAEBAcAAYE0AAAirAmDAAHNKAABgwABYyQE+AUrAAGBfARzAAGBvFsAAYGYuwABiDcAAm/mqfQEAAYDAAGB/wExKuADAAJutBsAAm/yBUMAAYJPAAGC2wABhKAAAqn4BGsAAYJTAAO5LAAABA8AAYM7AAGEoAAAAAQEBwABg3gAAAKsCYMAAmrYAAF3AAPUdAWDAAFiJAT4BSsAAYPABHMAAYQAWwABg9y7AAGINwACb+ap+AQABgMAAYRnATEsvAMAAm64GwACb/YFQwABhLcAAYT7AAGJrAACrugEawABhLsAA7ksAAAEDwABhTsAAYmsAAAAEAwPAAGFlAAAAqwJgwABymADAAGGKAAAArBVgsPsAwABhqQAAAIEoYQNgwABYNmDAAPZdYMAAVr1cAAHAAGHwAAAAld1gwADyswEqXAE+AUrAAGIIARzAAGIYFsAAYg8uwABiDcAAm/mrugQAA4DAAGIpwExLrIHAAGI1wExLu4LAAGJJwExLyAGV3YPAAGJewExL5cAAm68GwACb/oFQwABicMAAYorAAGLuAACvoAEawABiccAA7ksAAAEDwABim8AAYu4AAAABAQHAAGKrAAAAqwJgwABymAAAYMAAWF0BPgFKwABivQEcwABizRbAAGLELsAAYg3AAJv5r6ABAAGAwABi38BMTHUAwACbnAbAAJwAgVDAAGLzwABjG8AAY1wBAMAAT2UBGsAAYvTAAO5LAAABA8AAYzPAAGNcAAAAAAAAAGDAAJqRAUrAAGM8ARbAAGNFFsAAYzwuwABiDcAAm/nAAE9lwACbmQAATEqFAExK/ABMS3kATExCAExMuQBMTRYAAAAFAsAAnAOBUMAAY2HAAGNnwABnqwPAAGIOAAABYMAAm/cAAAIEwACcBYFQwABkJ8AAZEIGg6sAYMAA9l0BJ8AAYg8EwACcBoFQwABkasAAZHQJwABF+gEawABkSMAA7ktgwABy+wABBcAAnA6BUMAAZHnAAGR5wABk0gAAAAPAAGSSwABk0gAAAAICAsAAZKAAAADAAGINYMAAm6sAwABkrwAABMAARfpgwABy+wAAYMAAnAMBPwIIAcAAnAaBAMBMTc8JAMAAZMPAAJwCAQABgMAAZMnATE2+AAMGwACcCIFQwABk18AAZN/AAGZ/BAGrQQAAAAEDwABlC8AAZn8AAAABAQHAAGUXAAAAgv1gwABaaQAAYMAAnAMBPgU9HMAAZSyAwABlJcBMTjeCGwEAARrAAGUywACcBQDAAFprTsAAZZbAAGWfAADAAGINYMAAm6sBJsAAZZYBHsAAZaXAAJufAQABgMAAZcTATE43AGDAAJurTsAAZeLAAGXtAADAAEX6YMAAcvsBHsAAZfvAAHMBAQABgMAAZh/ATE43AD0cwABmM4DAAGYswExON4ITAQABGsAAZjfAAJwFAMAAWmxKwABmQQEfwABmTMAAnA4CAAKBwABmZsBMTnKCwABmcMBMTqgABsAAnAqBUMAAZoTAAGaVwABnXQAAq00BGsAAZoXAAO5LAAABA8AAZqTAAGddAAAAAQEBwABmrgAAAIQBYMAAWicAAFwBPgU9HMAAZr+AwABmusBMT0ytiwEAARrAAGbZwACbjwDAAFo4PRzAAGbygMAAZu3ATE9MghsBAAEawABm+MAAnAUAwABaLD0cwABnCxbAAGcCLsAAYg3AAJv5q00BAAGAwABnG8BMT0wAwACbnT0cwABnMRbAAGcmLsAARfrAAJwGq00BAAGAwABnQcBMT0wAwABzAz0cwABnUYDAAGdMwExPTIITAQABGsAAZ1XAAJwFAMAAWi0GwACcDIFQwABnYsAAZ5LAAGepAQDAAE9eARrAAGdjwADuSwAAAQPAAGeewABnqQAAAAAAAABdwAD1TgJgjmNgklkBSsAAZ6EBO8AAZ6FgjmNgklkAAABMTg0ATE8ZAExQFABMUGkAAAADAsAAnA+BUMAAZ67AAGe9wABoWgfAAGIQAAABYMAAm6sAAAABBcAAnBMAAAAABAAAAwAAAAAAAAAAAGDAAJwPAT8BCQEAwACbsQAAAAABBsAAnBGBUMAAZ+fAAGf7wABoWAACtCkAAAABA8AAaBHAAGhYAAAAAgICwABoLgAAAKsCYMAAc0oAwABoTAAAAJhQYLDsAABgwAB9aQAAAExQzABMURkAAAABAsAAnBSBUMAAaF3AAGhjwABxRgPAAGIRAAABYMAAm9QAAWDAAJwPAwTAAJwWgVDAAGk0wABpTAaDqwBgwAD2XQEnwABiEgTAAJwYgVDAAGllwABpeRjAAGITwACa0QBgwAB9aQErBMAAnBmBUMAAaY7AAGmdGMAARlIAYMAAaCgBKwEFwACcI4FQwABposAAaaLAAGpvAAAAA8AAabbAAGpvAAAABAQEwABpwQAAAIOyYI0TAMAAadcAAAC14GCOOADAAGn8AAAAwABF+mDAAHL7AMAAaigAAADAAE9eXcAA9U4CYI5jYJJZAABgwACcFAE/AQkAwABqPcAAm+MEAASAwABqQ8BMUc6BwABqScBMUduCwABqV8BMUeiDwABqY8BMUfkABQbAAJwbgVDAAGp0wABqfMAAbWgEAatBAAAAAQPAAGqjwABtaAAAAAEBAcAAaq8AAACC/WDAAFppAABgwACcFAE+CD0cwABqxIDAAGq9wExSd4IbAQABGsAAasrAAJwWAMAAWmtOwABq3sAAauMAAIOyYI0TARzAAGrsgMAAauXATFJ3v94AAAAAwABaf07AAGsSAAAAteBgjjgAScAAayQlwABrLYHAAGsowExSsmCNnz4BPYrAAGtGwExS2xbAAGtaFMAAa1XATFKyAQFgjZ+ST42kScAAa28lwABreIHAAGtzwExSsmCNXj4BPYrAAGuTwExS2xbAAGunFMAAa6LATFKyAQFgjV6ST41iPgE9MMAAa8QfwABrzsAA9AsBAAEkwABsHwUnwABiB4HAAGwDwExSsieDAhbAAGwQgcAAbAvATFKyhQPAAPXZJ5e4AE7AAGw9wABsSAAAwABF+mDAAHL7AR7AAGxWwABzAQEAAYDAAGx6wExSdwBOwABsp8AAbLMAAMAAT15dwAD1TgJgjmNgklkBHMAAbMSAwABsvcBMUneuWwECYI5jYJJZATTAAGzUA8AAbNTAAGzzAAAAAAAAAGCSWQFKwABs2gEcwABs4YDAAGzawExSd7/nAAAAAMAAWo0AwABaiD0cwABtAYDAAGz6wExSd4ITAQABGsAAbQXAAJwWAMAAWmxKwABtDwEfwABtGsAAnCMEAASBwABtOMBMUrKCwABtPsBMUtuDwABtTMBMU56EwABtWMBMU8kABsAAnB2BUMAAbW3AAG1+wABupQAAq00BGsAAbW7AAO5LAAABA8AAbY3AAG6lAAAAAQEBwABtlwAAAIQBYMAAWicAAFwBPgc9HMAAbaiAwABto8BMVMWtiwEAARrAAG3CwACbjADAAFo4PRzAAG3ZgMAAbdTATFTFghsBAAEawABt38AAnBYAwABaLD0cwABt7oDAAG3pwExUxb+7AQABFsAAbf4ug7LAAJukAMAAWj09HMAAbhQWwABuCS7AAEX6wACbpatNAQABgMAAbiTATFTFAMAAcwNAHMAAbkYWwABuNi7AAEZSwACcGUEBAAErAMAA9dLAAG42wABuTQA9HMAAblmAwABuVMBMVMWuXgIBYJJZAhbAAG5qLsAAT17AAJumFsAAbnyAwABud8BMVMW/xMAAWksAwABaRj0cwABumYDAAG6UwExUxYITAQABGsAAbp3AAJwWAMAAWi0GwACcHoFQwABuqsAAbsrAAHDVAAC0KQEawABuq8AA7ksAAAEDwABu4MAAcNUAAAACAgLAAG79AAAAqwJgwABzSgDAAG8bAAAAmFBgsOwAAGDAAH1pAT4CScAAby4cwABvRxbAAG8yLsAAYhPAAJrRwACcGEEBAAErAMAA9dI+AUnAAG9YIiXAAG9hFsAAb1wug7LAAJukYI1eABbAAG+CgcAAb3bATFYyg+Kwyz4BPRfAAG+VLsAAYhPAAJrRHMAAb9YfwABvvMAAnVIBAAGAwABvysBMViMAwABiFAEAASbAAG/xARbAAG/xLoOywACbpGCNXgDAAJ1QwACcGD4BPR7AAHAPq98CAAKBwABwJcBMVjIkAAQnwABiFYHAAHBXwExWMieDOyfAAGIWAD9KwABwtgEWwABwvS7AAGITwACa0cAAnBgGwACcIYFQwABw2sAAcQLAAHFEAQDAAE9lARrAAHDbwADuSwAAAQPAAHEawABxRAAAAAAAAABgwACakQFKwABxIwEawABxO8AAmpkGwACcH4FQwABoY8AAaGMAABKqfQAAwACbrQEDAAAAAAABAQEAAAAIqwJgwACatgAAYMAAWMkAAABMUk0ATFSSAExV8ABMVzcATFeCAExXuQAAAAUCwACcJIFQwABxScAAcU/AAHfnA8AAYhcAAAFgwACb1AAAAQTAAJwmgVDAAHIGwAByIwaDqwBgwAD2XQEnwABiGAEFwACcLoFQwAByKMAAcijAAHL4AAAAA8AAcj/AAHL4AAAABAQEwABySgAAAIOyYI0TAMAAcmAAAAC14GCOOADAAHKFAAAAwABF+mDAAHL7AMAAcrEAAADAAE9eXcAA9U4CYI5jYJJZAABgwACcJAE/AQkAwAByxsAAm+MEAASAwAByzMBMWD2BwABy0sBMWEqCwABy4MBMWFeDwABy7MBMWGgAAwbAAJwogVDAAHL9wABzBcAAdfcEAatBAAAAAQPAAHMvwAB19wAAAAEBAcAAczsAAACC/WDAAFppAABgwACcJAE+CD0cwABzUIDAAHNJwExY5oIbAQABGsAAc1bAAJwmAMAAWmtOwABzasAAc28AAIOyYI0TARzAAHN4gMAAc3HATFjmv94AAAAAwABaf07AAHOeAAAAteBgjjgAScAAc7AlwABzuYHAAHO0wExZIWCNnz4BPYrAAHPSwExZShbAAHPmFMAAc+HATFkhAQFgjZ+ST42kScAAc/slwAB0BIHAAHP/wExZIWCNXj4BPYrAAHQfwExZShbAAHQzFMAAdC7ATFkhAQFgjV6ST41iPgE9MMAAdFAfwAB0WsAA9AsBAAEkwAB0qwUnwABiB4HAAHSPwExZISeDAhbAAHScgcAAdJfATFkhhQPAAPXZJ5e4AE7AAHTJwAB01AAAwABF+mDAAHL7AR7AAHTiwABzAQEAAYDAAHUGwExY5gBOwAB1M8AAdT8AAMAAT15dwAD1TgJgjmNgklkBHMAAdVCAwAB1ScBMWOauWwECYI5jYJJZATTAAHVgA8AAdWDAAHV/AAAAAAAAAGCSWQFKwAB1ZgEcwAB1bYDAAHVmwExY5r/nAAAAAMAAWo0AwABaiD0cwAB1jYDAAHWGwExY5oITAQABGsAAdZHAAJwmAMAAWmxKwAB1mwEfwAB1psAAnC4EAASBwAB1x8BMWSGCwAB1zcBMWUqDwAB128BMWg2EwAB158BMWjgABsAAnCqBUMAAdfzAAHYNwAB3EwAAq00BGsAAdf3AAO5LAAABA8AAdhzAAHcTAAAAAQEBwAB2JgAAAIQBYMAAWicAAFwBPgY9HMAAdjeAwAB2MsBMWzStiwEAARrAAHZRwACbjQDAAFo4PRzAAHZsgMAAdmfATFs0ghsBAAEawAB2csAAnCYAwABaLD0cwAB2gYDAAHZ8wExbNL+7AQABFsAAdpEug7LAAJukAMAAWj09HMAAdqcWwAB2nC7AAEX6wACbpatNAQABgMAAdrfATFs0AMAAcwM9HMAAdseAwAB2wsBMWzSuXgIBYJJZAhbAAHbYLsAAT17AAJumFsAAduqAwAB25cBMWzS/xMAAWksAwABaRj0cwAB3B4DAAHcCwExbNIITAQABGsAAdwvAAJwmAMAAWi0GwACcLIFQwAB3e8AAd6PAAHflAQDAAE9lARrAAHd8wADuSwAAAQPAAHe7wAB35QAAAAAAAABgwACakQFKwAB3xAEawAB33MAAmpkAAExYvABMWwEATFw4AExcgwAAAAMCwACcL4FQwAB36sAAd/nAAHioB8AAYhkAAAFgwACblgAAAAEFwACcNAAAAAAEAAADAAAAAAAAAAAAYMAAnC8BPwEJAQDAAJuhAAAAAAIGwACcMYFQwAB4HMAAeCXAAHhMAAKqgAAAAAEDwAB4McAAeEwAAAABAQHAAHhBAAAAqwJgwACatgAAYMAAWDYABsAAnDKBUMAAeFHAAHhkwAB4pgACwABPawAAAAEDwAB4fsAAeKYAAAABAQHAAHibAAAAqwJgwABzSgAAYMAAQOwAAABMXOYATF0mAExdaAAAAAICwACcNYFQwAB4q8AAeLHAAIBzA8AAYhoAAAFgwACbogABYMAAnC8DBMAAnDeBUMAAeWvAAHl9BoOrAGDAAPZdASfAAGIbBMAAnDmBUMAAeYvAAHmQGI8MwACa0QBgwABYNgErBMAAnDqBUMAAeafAAHm6GMAAYhzAAJrRAGDAAEDsASsBBcAAnEWBUMAAeb/AAHm/wAB6WQAAAAPAAHnNwAB6WQAAAAMDA8AAedcAAACDsmCNMQDAAHnuAAAAwABF+mDAAHL7AMAAeiAAAADAAE9eXcAA9U4CYI5jYJJZAABgwACcNQE/AQkAwAB6NcAAm6oDAAOAwAB6O8BMXiOBwAB6QcBMXjCCwAB6TcBMXkEABgbAAJw8gVDAAHpewAB6ZsAAfAUEAatBAAAAAQPAAHqHwAB8BQAAAAEBAcAAepMAAACC/WDAAFppAABgwACcNQE+Bj0cwAB6qIDAAHqhwExetoIbAQABGsAAeq7AAJw3AMAAWmtOwAB6wsAAescAAIOyYI0TARzAAHrQgMAAesnATF62v94AAAAAwABaf07AAHr3wAB7AgAAwABF+mDAAHL7AR7AAHsQwABzAQEAAYDAAHs0wExetgBOwAB7YcAAe20AAMAAT15dwAD1TgJgjmNgklkBHMAAe36AwAB7d8BMXrauWwECYI5jYJJZATTAAHuOA8AAe47AAHutAAAAAAAAAGCSWQFKwAB7lAEcwAB7m4DAAHuUwExetr/nAAAAAMAAWo0AwABaiD0cwAB7u4DAAHu0wExetoITAQABGsAAe7/AAJw3AMAAWmxKwAB7yQEfwAB71MAAnEUDAAMmwAB74wGBwAB748BMXvFgjTGCwAB76cBMXxqDwAB79cBMX0UABsAAnD6BUMAAfArAAHwbwAB9FwAAq00BGsAAfAvAAO5LAAABA8AAfCrAAH0XAAAAAQEBwAB8NAAAAIQBYMAAWicAAFwBPgY9HMAAfEWAwAB8QMBMYEGtiwEAARrAAHxfwACbiwDAAFo4PRzAAHxwgMAAfGvATGBBghsBAAEawAB8dsAAnDcAwABaLD0cwAB8hYDAAHyAwExgQb+7AQABFsAAfJUug7LAAJxCAMAAWj09HMAAfKsWwAB8oC7AAEX6wACbpatNAQABgMAAfLvATGBBAMAAcwM9HMAAfMuAwAB8xsBMYEGuXgIBYJJZAhbAAHzcLsAAT17AAJumFsAAfO6AwAB86cBMYEG/xMAAWksAwABaRj0cwAB9C4DAAH0GwExgQYITAQABGsAAfQ/AAJw3AMAAWi0GwACcQoFQwAB9HMAAfTXAAH1HAQCDsgEawAB9HcAA7ksAAAEDwAB9OsAAfUcAAAAAAAAAYI0xAUrAAH09ASbAAH09ARjAAH1Dg7LAAJukYI0xBsAAnD+BUMAAfUzAAH1hwAB91QAAqoABGsAAfU3AAO5LAAABA8AAfW3AAH3VAAAAAQEBwAB9jQAACKsCYMAAc0oAAGDAAFg2AT4BSsAAfZ8BNQAAAAEAYMAAWDYBFsAAfaYujwzAAJrRwACcOSMcwAB9rIEAwExh6UEBAAErAMAA9dIXwAB9pi6PDMAAmtEcwAB9u4DAAH2wwExhysAATNwBAAEWwAB9zBbAAH3HLoOywACcQoIXjTMAwABzqsAAnDmBAMBMYekBYMAAWDYGwACcQIFQwAB92sAAffnAAH+yAADAAE9rARrAAH3bwADuSwAAAQPAAH4TwAB/sgAAAAEBAcAAfjAAAACrAmDAAHNKAABgwABA7AE+AknAAH5CHMAAfloWwAB+Ri7AAGIcwACa0cAAnDpBAQABKwDAAEEBPgFJwAB+axbAAH50FsAAfm8ug7LAAJxCg+KNQD4BPRfAAH6HLsAAYhzAAJrRHMAAfscfwAB+rcAAnVIBAAGAwAB+u8BMYpoAnxoBAAEWwAB+0hbAAH7NLoOywACcQpJFjTUAwACdMsAAnDo+AT0ewAB+96vfAgACFsAAfxgWwAB/DS7AAEX6wACbpYS+wABy/yQABCfAAE9sFsAAf0IuwABF+sAAm6UngzsnwABiHQA/SsAAf5QBFsAAf5suwABiHMAAmtHAAJw6BsAAnEOBUMAAf7fAAH/fwACAcQEAwABPZQEawAB/uMAA7ksAAAEDwAB/98AAgHEAAAAAAAAAYMAAmpEBPgJJwAB//RbAAIAGFsAAgAEug7LAAJxClKyNRkrAAIAYARrAAIA3wACamj9KwACASgEawACAacAAmpcAAExejABMYA4ATGFFAExhlwBMYmUATGOhAExkGAAAAAYCwACcRoFQwACAdsAAgHzAAIMPA8AAYh4AAAFgwAD1xQAAAwTAAJxIgVDAAIEEwACBGAaDqwBgwAD2XQEnwABPrwTAAJxJgVDAAIEuwACBMgmDsgBgjKkABMAAnEqBUMAAgUjAAIFPCZSmAGDAAFhzAAEFwACcUIFQwACBVMAAgVTAAIF5AAAAA8AAgWDAAIF5AAAAAgICwACBZgAABIOyYIypAMAAgXEAAASUpmDAAFhzAABgwACcRgE/AwgBwACcSYAAwExk0AgBwACcSoEAwExk3QkBwACBVMAA9dsAAAAAAgbAAJxMgVDAAIF+wACBhsAAgnYEAatBAAAAAQPAAIGlwACCdgAAAAEBAcAAgbEAAACC/WDAAFppAABgwACcRgE+BT0cwACBxoDAAIG/wExlRoIbAQABGsAAgczAAJxIAMAAWmtOwACB4cAAgeYAAIOyYIypARzAAIHvgMAAgejATGVGv90AAAAAwABafk7AAIISwACCGgAAlKZgwABYcwEmwACCEgEcwACCI4DAAIIcwExlRpZ5AAAAAMAAWotgwABYcz0cwACCPoDAAII3wExlRoITAQABGsAAgkLAAJxIAMAAWmxKwACCTAEfwACCV8AAnFACAAKBwACCZMBMZYGCwACCasBMZaoABsAAnE6BUMAAgnvAAIKAwACDDQAAq00AAAABA8AAgo/AAIMNAAAAAQEBwACCmQAAAIQBYMAAWicAAFwBPgQ9HMAAgqqAwACCpcBMZlCCGwEAARrAAIKwwACcSADAAFosPRzAAIK/gMAAgrrATGZQlvUBAAEWwACC0C6DssAAnEkAwABaPD0cwACC4IDAAILbwExmUJZpAQABFsAAgu4ulKbAAJxKAMAAWkk9HMAAgwGAwACC/MBMZlCCEwEAARrAAIMFwACcSADAAFotAABMZRwATGYmAExm8gAAAAICwACcUYFQwACDEsAAgxjAAIZ6A8AAYh8AAAFgwAD1xQAABATAAJxTgVDAAIOqwACDxAaDqwBgwAD2XQEnwABPswTAAJxUgVDAAIPgwACD5AmDsgBgkuEABMAAnFaBUMAAg/HAAIP3GL8xwACa0QBgwABYNgErBMAAnFeBUMAAhATAAIQQGMAAYiDAAJrRAGDAAFg2ASsBBcAAnF+BUMAAhBXAAIQVwACEMQAAAAPAAIQmwACEMQAAAAEBAcAAhCwAAASDsmCS4QAAYMAAnFEBPwIIAcAAnFSAAMBMZ78JAcAAhBXAAPXbAAAAAAQGwACcWYFQwACENsAAhD7AAIUKBAGrQQAAAAEDwACEYsAAhQoAAAABAQHAAIRuAAAAgv1gwABaaQAAYMAAnFEBPgQ9HMAAhIOAwACEfMBMaBqCGwEAARrAAISJwACcUwDAAFprTsAAhKTAAISpAACDsmCS4QEcwACEsoDAAISrwExoGr/kAAAAAMAAWok9HMAAhNaAwACEz8BMaBqCEwEAARrAAITawACcUwDAAFpsSsAAhOQBH8AAhO/AAJxfAQABgcAAhQHATGhVAAbAAJxbgVDAAIUPwACFFMAAhYYAAKtNAAAAAQPAAIUjwACFhgAAAAEBAcAAhS0AAACEAWDAAFonAABcAT4DPRzAAIU+gMAAhTnATGjlghsBAAEawACFRMAAnFMAwABaLD0cwACFU4DAAIVOwExo5b/BAQABFsAAhWoug7LAAJxUAMAAWkc9HMAAhXqAwACFdcBMaOWCEwEAARrAAIV+wACcUwDAAFotBsAAnFyBUMAAhYvAAIWUwACF9gAAwABQDwAAAAEDwACFnMAAhfYAAAABAQHAAIWsAAAAqwJgwACatgAAYMAAWDYBPgFKwACFvgE1AAAAAQBgwABYNgEWwACFxS6/McAAmtHAAJxWIxzAAIXMgQDATGmtQQEAASsAwAD10hfAAIXFLr8xwACa0RzAAIXbgMAAhdDATGmOwABM3AEAARbAAIXsFsAAhecug7LAAJxUlQqS5gDAAJq4wACcVoEAwExprQFgwABYNgbAAJxdgVDAAIX7wACGBMAAhngAAMAAUBEAAAABA8AAhhLAAIZ4AAAAAQEBwACGIgAAAKsCYMAAmrYAAGDAAFg2AT4BSsAAhjQBNQAAAAEAYMAAWDYBFsAAhjsuwABiIMAAmtHAAJxXIxzAAIZIgQDATGp0QQEAASsAwAD10hfAAIY7LsAAYiDAAJrRHMAAhleAwACGTMBMalXAAEzcAQABFsAAhmgWwACGYy6DssAAnFSWEpLnAMAAmrjAAJxXgQDATGp0AWDAAFg2AABMZ/AATGi7AExpYgBMaikATGr0AAAABAAAAYFQAExrDwBL+WcAS/xvAEwCmgBMBwcATAiRAEwLuQBMFc4ATBrtAEweCgBMH5QATCKkAEwmpQBMKREATCxaAEwuiABML+sATDLEAEw2EwBMORoATDyXAExC0wBMSecATE0zAExQfgBMUSYATFfWAExcmABMXXkATGQ5AExnAwBMaw0AAAAeAExrDwAAAAAAwACcYMAAYiGBvwAABYD0AABFAAEBA4HLgcyBzYFVAACevgAAgWsAALCYAACBjAAAwABYMQAAgaoAAMAAWiEAAAAAAAMCwACcYYG/g5mDn5b1A8AAYiIAAAFgwAD1xQAAAwTAAJxjgb+EK4RDBoOrAGDAAPZdASfAAGIjBMAAnGWBv4RohG8JwABiJMAAnGAAXcAA9R0BXYojAWDAAFhdAATAAJxmgb+EjYSSCZUIAF2KIwFgwABYXQABBcAAnHeBv4SXhJeEyACSQwADhK6EyAAAAAICAoS0AAAEwABiJF3AAPUdAV2KIwFgwABYXQCEwgAABJUIXYojAWDAAFhdAABgwACcYQE/AwgBwACcZYAAwExsdQgBwACcZoEAwExsjgkBhJfAAPXbAAAAAAwGwACcaIG/hQmFEYiwBAGrQQAAAAEDhTKIsAAAAAEBAYU+AAAAgv1gwABaaQAAYMAAnGEBPgw9HIXRgIXKwExs7YIbAQABGoXXwACcYwDAAFprToXlhfAAAMAAYiVgwAD0eQEchfmAhfLATGztq0YAAAAAwABadE6GI4YzAADAAGImXYpUAWDAAFhdAR+GQYqoAAFgwABYXQAAToZ9hoMAAMAAYiddwAD1HQFdiiMBYMAAWF0BMYaFXYojAWDAAFhdAEWGjQGGloaYAABbYMAA9HkBkwEchp+Ehp3ATG2TXAEAAYGGocBMbSAAwAD1pgGMhq3ATG2THIauhIatwExtk10BAAGUAMAA9Z4+AT0chsCDhrrATG1oTwEAARyG1IKGxMBMbUWD5wEAASaG4wEchuOAhtzATGztlnkAAAAAwABai2DAAFhdAIpfAMAA9S5OhxOHGQAAlQhdiiMBYMAAWF0BHIczgocjwExtRYPwAQABIIdAilMAAWDAAFhdAAAAil09HIdig4dcwExtaE8BAAEgh2yKUwABYMAAWF0AAADAAPUuToeNh5gAAMAAYihgwAD0eQEch6GAh5rATGztq0YAAAAAwABadE6HyofRAADAAGIpXcAA9R0BXYojAWDAAFhdAR6H38AA7oIBAV2KIwFgwABYXQGFh/nATG5zAEWICgGIE4gVAABbYMAA9HkBkwEciByHiBrATG7RXAEAAYWIHsBMbnMAwAD1pgGPiCrATG7RHIgrh4gqwExu0V0BAAGUAMAA9Z4+AT0ciD2GiDfATG6YgLICAAKHiD7ATG7RHIhIg4hDwExtaEQBAAEciFCAiEnATGztq0YAAAAAwABadADAAPUsAMAA9S09HIhtgIhmwExs7YITAQABGohxwACcYwDAAFpsSoh7AR+IhsAAnHcCAAKGiJ7ATG6YhIimwExuHgAGwACca4G/iOeI7IsuAACrTQAAAAEDiPuLLgAAAAEBAYkFAAAAhAFgwABaJwAAXAE+Cj0ciRaAiRHATG+0ghsBAAEaiRzAAJxjAMAAWixOiTqJQwAAwABiKl3AAPUdAWDAAFhdARyJSxaJRS6VCMAAnGaAoQAAAACKMj0ciV6AiVnATG+0q1EBAAEWiXCBiWfATG/jWsAA9UwAwABaMkaJfYmiiZAAAACCF2DAAFhdAIGJmMBMb+M+AT0cia+AiarATG+0lmkBAAGCib3ATHA3AMAAWklOidiJ4gAAwABiK13AAPUdAWDAAPR5ATGJ5GDAAPR5AE6KAIoFAACTEV2KIwFgwABYXQEWigculQjAAJxmQ4oSIRyKHoOKGcBMcIpBAQABKwCKOT4DToozijkAACdgwAD0eQEcikMWijsuwABiJMAAnGDAAJxlgK4BAAGDikvATHCKAMAA9TJJilghHIpihIpcwExwv0EBAAEcimWUgVYAAAAAwAD0nADAAPWcPgE9HIp9gopzwExwak8BAAGEioHATHC/AMAA9S4/PYuKl8BMcIoWiqODip7ATHCKg6+KJj0ciriAirPATG+0q1EBAAEWisuCisHATHBqWsAA9UwAwABaMkaK2Ir1iuEAAACUf2DAAPR5AIKK6sBMcGo+AT0ciwKAiv3ATG+0q1EBAAGEiwvATHFyAMAAWjI9HIsigIsdwExvtIITAQABGosmwACcYwDAAFotBsAAnGmBv4szizuMZgQBquoAAAABA4tTjGYAAAABAQGLYgAAAIIXYMAAWF0AAGDAAJxhAT4ETouCi4gAAJUIXYojAWDAAFhdAR+LloqZAgFgwABYXQKAi6/ATHHgIIu7ilMAAWDAAFhdAAAATovxi/YAAIMUXcAA9R0BXYojAWDAAFhdAR6L/MAA7oIBAV2KIwFgwABYXQGUAD0cjCKCjB7ATHItgLICAAKTgYwowExx9wDAAPUtSowzAR+MPsAAnHcCAAKCjFbATHItgYxcwExx9wAGwACcbIG/jUmNWI+RAADAAFBZAAAAAQONY4+RAAAAAQEBjXIAAACCF2DAAFhdAABgwACcYQE+BkAWjZkWjZQWjY4ulQjAAJxmg66KJaoDwABYZY2OjaMBHo2tq98CAAIWjciAjcPATHK2kw3AAFhfJAAEJ8AAYiwWjgIWjfwulQjAAJxmg66KJSfAAGItJ8AAYi4ATo5UjmIAAMAAYi9diiMBYMAAWF0BH45wipkCAWDAAFhdAoCOicBMcrYWjo8ulQjAAJxmAE6OtY66AACDFF3AAPUdAV2KIwFgwABYXQEejsDAAO6CAQFdiiMBYMAAWF0BHI7hFo7aLsAAYinAAJxzXQEAAZQAwAD1ngBFjusBjvSO9gAAW2DAAPR5AZMBHI79g477wExzplwBAAEWjv8uwABiKcAAnHMAwAD1pgGLjwfATHOmHI8Ig48HwExzpl0BAAGUAMAA9Z4+AT0cjxiCjxTATHNdgLICAAKDjxnATHOmHI8lFo8eLsAAYiTAAJxgwACcZUQBAAGDjybATHOmAMAA9SwAwAD1LT0cjziCjzTATHNdgLICAAIWjzkuwABiKcAAnHOBj0PATHMpAMAA9S1Kj1YBH49hwACcdwIAAoKPecBMc12Bj3/ATHMpAAbAAJxygb+Plo+uj8YBAJo6AAAAAQOPuY/GAAAAAAAAAF2KIwFgwABYXQFKj7wBFo/CFo+8LpUIwACcZoOviiYGwACcc4G/j8uP04/rAQDAAGIpAAAAAQOP2o/rAAAAAAAAAGDAAPR5AUqP3QEWj+UWj90uwABiJMAAnGDAAJxlWsAA9UwGwACcdIG/j/CP+JAOAQDAAFAcAAAAAQOQAZAOAAAAAAAAAGDAAPR5AUqQBAEckAsWkAQuwABiKcAAnHOBQQEAAZQAwAD1nwbAAJxtgb+QE5AwkKcDAEQAAAABA5AykKcAAAABAQGQNwAAACdgwAD0eQAAXYojAWDAAFhdAT4CSZBEHJBOgJBIwEx1YVwBAAEWkFAuwABiKcAAnHMAwAD1pj4BSpBgARyQbhaQZy7AAGIkwACcYMAAnGVEAQABgJBvwEx1YQDAAPUsP0qQgQEgkI6KUwABYMAAWF0AAAbAAJx1gb+Q75D9kl0BAMAAYjAAAAABA5EKkl0AAAAAAAAAXcAA9R0BYMAA9HkBPgVOkRqRIgAAl5JdwAD1HQFgwAD0eQEekSjAAPUiAgFgwAD0eQIWkTQuwABiKcAAnHMckTyUgVYAAAAAwAD0nABOkUmRUAAAgxVgwAD0eQGTTpFtkXUAAJuAXYojAWDAAFhdARaRdy6VCMAAnGZFkYIBkYuRkQAAmiZgwAD0eQEWkZMuwABQHMAAnHQBHJGjg5GdwEx2eYFIAQABkwDAAPWpAYuRqcBMdnkcka6DkanATHZ5gUEBAAGUAMAA9Z8+AkORuiEekcLAAO5eAgACgpHMwEx2WRyR3BaR1S7AAGIkwACcYMAAnGVEAQABg5HdwEx2eQDAAPUsAD4CPYqR8MBMdlkWkgKCkfrATHZZg6+KJj2JkhDATHZJHJIWgZIQwEx2SV0BAAGUAMAA9Z49HJIvgJIowEx2CoCyAgACg5IwwEx2eYGSOcBMdkkAwAD1LUqSSwGAklLATHYKBsAAnG6Bv5JikmeUUQAAg7wAAAABA5JulFEAAAACAgKScwAAAJR/YMAA9HkAkn8AAACBKGEBYMAAWF1cAABcAT4BSZKcHJKmgJKgwEx3g1wBAAEWkqguwABiKcAAnHMAwAD1pj4DTpLMktQAAJuAXYojAWDAAFhdARyS3RaS1i7AAGIkwACcYMAAnGVEAQABgJLewEx3gwDAAPUsTpMAkwQAAIITXYojAWDAAFhdASMckxaAkxDATHeDgIsBAAGTAMAA9agckyMWkxwuwABiJMAAnGDAAJxlRAEAARyTKoCTJMBMd4OBQQEAAZQAwAD1nwDAAPUsIJM3ilMAAWDAAFhdAAABXYojAWDAAFhdQ5PPIhaT3oKT1sBMd8qDaIopACEek+3AAO5eAgACgpP3wEx3yoOUAMBMeAAAPgI9HJQRgZQQwEx3kCABAAEWlBqClBLATHfKg66KJQAAPYqUKcBMd8oWlDuClDPATHfKg6+KJj8GwACcb4G/lFaUZJa9AAC/SQAAAAEDlHCWvQAAAAICApR9AAAAmTxgsK0AlIYAAADAAFC9YMAA9HkAAGDAAFhdAT4DTpSglKYAAJR/YMAA9HkBgZSowEx5AUmUvByUxoKUwMBMeRpcAQABFpTILsAAYinAAJxzAMAA9aY+A06U7JT0AACbgF2KIwFgwABYXQEclP0WlPYuwABiJMAAnGDAAJxlRAEAAYKU/sBMeRoAwAD1LE6VIJUkAACCE12KIwFgwABYXQEjHJU2gpUwwEx5GoCLAQABkwDAAPWoHJVDFpU8LsAAYiTAAJxgwACcZUQBAAEclUqClUTATHkagUEBAAGUAMAA9Z8AwAD1LCCVV4pTAAFgwABYXQAAAV2KIwFgwABYXUOV7yIWlf6DlfbATHlUg2iKKQAhHpYNwADuXgIAAoOWF8BMeVSEliDATHmKAD4CSZYwHJY4gJY0wEx49kEBAAEWlkgWlkODljvATHlUg66KJZMNwABYXwDAAPXSPgFKll0BFpZsg5ZkwEx5VIOuiiU/PYuWhMBMeVQWlpaDlo7ATHlUg6+KJj9Klq4BKwbAAJxwgb+WwpbVlvMAACMBGpbDwADuSwAAAQOW3ZbzAAAAAAAAAGDAAPZdAUqW4wEclukWluMulQjAAJxmIwAAAACKOgAATGzNAExvlABMccAATHKUAEx0dgBMdLYATHT7AEx1QgBMddgATHdjAEx41gBMeogATHrNAAAADALAAJx4gb+YxZjUmU4HwABiMQAAAWDAAPXFAAAAAQXAAJx8AAAAAAQAAAMAAAAAAAAAAABgwACceAE/AQkBAMAA9dsAAAAAAQbAAJx6gb+Y7pj9mUwAAsAAT/sAAAABA5kRmUwAAAACAgKZJwAAAJSGYMAAWF0AmUEAAACdQF2KIwFgwABYNgAAYMAAnGEAAABMe04ATHuVAAAAAQLAAJx9gb+ZUZlgp30HwABiMgAAAWDAAPXFAAFgwACceAMEwACcf4G/mcKZ9hiAnwBdwAD1TgJgwAD0eV2KhgFgwABYXQEemdLAAPVVAAJgwAD0eV2KhgFgwABYXQAABMAAnICBv5n+mgsYwABQHABgwAD0eQEcmgmUgVYAAAAAwAD0nATAAJyBgb+aIpolCZk8AGCwrQABBcAAnI+Bv5oqmiqaTQAAAAOaQ5pNAAAAAQEBmkkAAASZPGCwrQAAYMAAnH0BPwIIAcAAnIGAAMBMfFUJAZoqwAD12wAAAAAKBsAAnIOBv5pSmmCahgACqnkAAAABA5prmoYAAAABAQGaggAACJk8YLCtAABgwABYXQAGwACchIG/moqamJrsAAK/dAAAAAEDmqaa7AAAAAICAprGAAAIghdgwABYXQCa5AAACIHnYMAAWF0AAGDAAFhdAAbAAJyFgb+a8Jr0myAAAsAART8AAAABA5sFmyAAAAABAQGbHAAACJk8YLCtAABgwAD0eQAGwACchoG/mySbM5tfAALAAFAbAAAAAQObRJtfAAAAAQEBm1sAAAiZPGCwrQAAYMAAnGEABsAAnIeBv5tkm3+deQAAwABP+wEam2XAAO5LAAABA5uTnXkAAAACAgKbqQAAAJSGYMAAWF0Am8MAAACdQF2KIwFgwABYNgAAYMAAnGEBPgY9HJwvLk8BAAGAnDPATH2GAMAAnItFnEMBnFecXAAAkxFdiiMBYMAAWDYBgZxewEx9kwEhFpxwgpxrwEx9xoD8iigBipx5wEx9xhachYKcgMBMfcaDr4omPgE9HJyTLk8BAAEmnJwBFpycgpyXwEx9xoOuiiVgwABYXQDAAJyLPRycri7AAGIzwACcYAEAAYCcwMBMfYYAwACciUWc0AGc5JzpAACTEV2KIwFgwABYNgGBnOvATH2TASEWnP2CnPjATH5MgPyKKAGKnQbATH5MFp0Sgp0NwEx+TIOviiY+AT0cnSAuwABiM8AAnGABAAEmnTcBFp03gp0ywEx+TIOuiiVgwABYXQDAAJyJPRydSC5PAQABHJ1MLqp5AQABFp1YLpk8wACcgQDAAJyDAMAAnItKnWMBHJ1qLsAAYjQAAAAAwACcjAbAAJyJgb+d6Z3un+0AAMAAYjPAAJxgAAAAAQOd/5/tAAAAAQEBng4AAACCF2DAAFhdAABcAT4ETp4mnjMAAKoCYLCtARaeOoCeNcBMfxmTDcAAWF9OnlueZgAAmjpdiiMBYMAAWF0BFp6IHJ5oLsAAUBsBAAGBnnrATH8sAMAAnIaaOsAAnHJAIRyes4KeqMBMf0lBAQABKwCKOZ6onroBHp7Eq98CAAIWntoumTzAAJyBJAAFJ8AAYjWBnwjATH8sJ4EBJ8AAYjYWnzoumTzAAJyBAEOfRiEWn1mCn07ATH9JgPyKKD4DTp94n4IAAJSGYMAAWF0BFp+Pgp+EwEx/SYOuiiU9HJ+bLk8BAAEcn58uv3QCAAKDn67ATH/dgJ+5wEx/GQDAAJyEAMAAnIs9ip/HwEx/SRaf34Kf1MBMf0mDr4omBsAAnIuBv5/yn/egpgAATwAAAAEDn/qgpgAAAAEBAaAJAAAAghdgwABYXQAAXAE+AUmgFRygJhagHoCgGcBMgFiTDcAAWF9BAQABFqApLpk8wACcgQDAAPXSPgE9HKA2LsAAYjfAAJxgAgACgKBCwEyAWBygURagSC7AAFAcwACcgF0BAAGUAMAA9Z4AwACcij4BPRygai7AAGI3wACcYAIAAoCgdsBMgFgcoHwuwABFPwEAARagk4CgjsBMgFiTDcAAWF8AwACchQDAAJyKBsAAnIqBv6CroLCjYwAAwABiN8AAnGAAAAABA6C7o2MAAAACAgKgygAAAIIXYMAAWF0AoNQAAACaJmDAAPR5AABcAT4HTqD6oP8AAMAAYjhdioYBYMAAWF0BK06hJKEpAACTEV2KhgFgwABYXQEcoS4WoSsugJ/AAJx/RAEAAYGhL8BMgTsAwAD1YkOhOyEcoUeDoULATIFkQQEAASsAipI+BU6hZqFzAADAAGI5YMAAWF0BFqF6g6F1wEyBZIOuiohJoYYcoZeEoYrATIGsQQEAAYChmsBMgS4AwABYb0qhoAA/SaGuHKHHFqG/hKGywEyBrJMNwABYX0EBAAEWoc+AocrATIEukw3AAFhfAMAA9dI+AkAqoemh7gEeofCr3wIAAhah+S6ZPMAAnIEkoiACJ8AAYjoWohwumTzAAJyBAEqiLAA/PYqiQsBMgU6DoknATIFkPYuiVcBMgWQmolUBFqJhg6JcwEyBZIOvioldioYBYMAAWF1OooqijwAAg2ZdioYBYMAAWF0BH6KVipkBAWDAAFhdAYCirsBMgS4APReivoSiucBMgoKDryuKiUmizxyi2IKi08BMgU5BAQABKwCKkj4BPRyi7Bai6S6An8AAnH+AsgIAAoGi7cBMgTuEovbATIKCAMAA9WM+AT0XoxSCow/ATIFOg6+EoxvATIKCiolJoyscozWBoy/ATIE7gIsBAAEWozcuwABQHMAAnIAAwAD1qD4BPRejSS7AAFAcgaNUwEyBO8AAnIA/BsAAnIyBv6Noo3emUAAAwABiNAAAAAEDo4CmUAAAAAAAAABgwACcYQE+BU6jo6OqAADAAGIpXcAA9R0BXYojAWDAAFhdAR6juMAA7oIBAV2KIwFgwABYXQEco9sWo9IuwABQHMAAnIBdAQABlADAAPWeAEmj5Ryj8haj6S7AAFAcwACcgFwBAAGTAMAA9aY+AUqj/wEfpArAAJx3AgACgKQiwEyDdCCkMIpTAAFgwABYXQAAAD9OpGakawAAg2ZdiiMBYMAAWF0BIKRzilMAAWDAAFhdAABFpI4BpJeknQAAmiZgwAD0eQGTARykqIKkosBMhCOBSgEAARakqy7AAFAcwACcgADAAPWnAYqktcBMhCMcpLqCpLXATIQjXQEAAZQAwAD1nj4CTqTfpOUAAILSXYqGAWDAAFhdARyk6hak5y6An8AAnH9EAQABgqTrwEyEIwDAAPViSaT5HKUDg6T9wEyEckEBAAErAIqSPgE9HKUcgKUWwEyDdICyAgACgqUdwEyEI4GlJsBMg/8AwAD1LT4FPRylSYClQ8BMg3SAsgIAAoKlSsBMhCODpVPATIRyAMAA9S1OpXulgAAAgXldioYBYMAAWF0Bg6WCwEyEckOlkSEcpaIWpZ2EpZjATIUBg6+KiUEBAAErAIo5PgE9jKW3wEyFASaltwEWpcOEpb7ATIUBg6+KiV2KhgFgwABYXT0XpeCEpdvATIUBg6+BpefATIP/iok9iaX1wEyD/4Ol/MBMhHJKphUBH6YgwACcdwIAAoCmOMBMg3QWpkeApkDATIN0gXnAAPUCAAbAAJyNgb+mVaZop3sAACMBGqZWwADuSwAAAQOmcKd7AAAAAAAAAGDAAPZdAT4DTqaGpokAAIN6YMAA9qcBH6aPwAD2xgAAAABFpqMBpqymsgAAmiZgwAD0eQGTARymvYGmt8BMhfSBSgEAARamwC7AAFAcwACcgADAAPWnAYmmysBMhfQcps+BpsrATIX0XQEAAZQAwAD1nj4EPRym3oCm28BMhdeCEQEAASSm7gKBpubATIX0J4MOAMAA9rtOpxCnFgAAgtJdioYBYMAAWF0BHKcbFqcYLoCfwACcf0QBAAGBpxzATIX0AMAA9WI9HKcwgqcqwEyGZoPxAgACgKc4wEyF1yeD8gCKjD0cp0yAp0nATIXXghEBAAEngKMAwAD2u0qnYwEcp22Ap2rATIXXIwAAAADAAPbAAABMfIIATHy0AEx89QBMfSkATH1dAEx+8wBMgDkATIEIAEyDSABMhacATIbhAAAACgAAAYG/AEyHFABMa+MATHsGAEx7ogBMhxIAAAADAEyHFAAAAAAAwACckACBwAAAB4DaAACL860rAIECAACYAK0rAIE2AACYrq0rAIFlAACdvK0rAIGWAACh560rAIHLAADAAIc3AACB6wAAwACZUgAAAAAAAQLAAJyRgcCCmYKfiV8DwABiOwAAAWDAAIdLAAFgwACZUwIEwACclIHAgw+DFQnAAEDPwACckABdwAD1TgJgjmNgklkABMAAnJWBwIM9g0UJlG4BGoMawADuS2DAAIc9AAEFwACcpYHAg0qDSoPAAAAAA4Nag8AAAAADAwODdQAAAJZFYKHqAIOLAAAEwABAz13AAPVOAmCOY2CSWQCDmAAABJRuYMAAhz0AAGDAAJyRAT8DCAHAAJyUgQDATIgOCAHAAJyVggDATIgkCQCDqsAAh3oBAAGAg7DATIgDAAwGwACcl4HAg8WD3YSJAACVBwEag8bAAO5LAAABA4PqhIkAAAABAQGD+QAAAIOyYI5jAABgklkBPgNOhBGEFgAAghdgklkBJoQRARyEHYCEGMBMiI2UDgEAAS4AjmdgkllAIRyEO4GENsBMiKBBAQABKwCSXYQ2hEIBJIRzAyfAAGI8FoRlgIRgwEyIjYUDwAD12SeBMUqEegGBhIHATIigBsAAnJmBwISOhJqFQwAAwABM28AAnJAAAAABA4SohUMAAAABAQGEtwAAAIOyYI5jAABgklkBPgNOhM+E1AAAghdgklkBHITcFoTWLsAAQM/AAJyQwACclEQBAAGAhN3ATIksAMAA9WJAIRyE9IGE78BMiT9BAQABKwCSXYTvhPsBJIUtAyfAAGI9FoUfgIUawEyJLIUDwAD12SeBMUqFNAGBhTvATIk/BsAAnJqBwIVIhWCFnQAAlRUBGoVJwADuSwAAAQOFcIWdAAAAAQEBhYAAAACDsmCOdgAAYJJZAUqFiQEchYkuwABM28AAnJABAAGAhZjATInVAMAAnJkGwACcm4HAhaKFuoX3AACVHwEahaPAAO5LAAABA4XKhfcAAAABAQGF2gAAAIOyYI6OAABgklkBSoXjARyF4y7AAEzbwACckAEAAYCF8sBMiisAwACcmQbAAJycgcCF/IYUhmMAAJUjARqF/cAA7ksAAAEDhiqGYwAAAAEBAYZAAAAAg7JgjrMAAGCSWQFKhk8BHIZPLsAATNvAAJyQAQABgIZewEyKgQDAAJyZBsAAnJ2BwIZohoCGzQAAlS0BGoZpwADuSwAAAQOGlYbNAAAAAQEBhqoAAACDsmCO6QAAYJJZAUqGuQEchrkuwABM28AAnJABAAGAhsjATIrXAMAAnJkGwACcnoHAhtKG6oc3AACVPAEahtPAAO5LAAABA4b/hzcAAAABAQGHFAAAAIOyYI9NAABgklkBSocjARyHIy7AAEzbwACckAEAAYCHMsBMiy0AwACcmQbAAJyfgcCHPIdUh60AAJUnARqHPcAA7ksAAAEDh2+HrQAAAAEBAYeKAAAAg7JgjtYAAGCSWQFKh5kBHIeZLsAATNvAAJyQAQABgIeowEyLgwDAAJyZBsAAnKCBwIeyh8qIFwAAlUABGoezwADuSwAAAQOH34gXAAAAAQEBh/QAAACDsmCPcgAAYJJZAUqIAwEciAMuwABM28AAnJABAAGAiBLATIvZAMAAnJkGwACcoYHAiByINIiLAACVPgEaiB3AAO5LAAABA4hOiIsAAAABAQGIaAAAAIOyYI9gAABgklkBSoh3ARyIdy7AAEzbwACckAEAAYCIhsBMjC8AwACcmQbAAJyigcCIkIioiP8AAJVCARqIkcAA7ksAAAEDiMKI/wAAAAEBAYjcAAAAg7Jgj4UAAGCSWQFKiOsBHIjrLsAATNvAAJyQAQABgIj6wEyMhQDAAJyZBsAAnKOBwIkEiRyJXQAAlUYBGokFwADuSwAAAQOJLoldAAAAAQEBiUAAAACDsmCPmQAAYJJZAUqJSQEciUkuwABM28AAnJABAAGAiVjATIzbAMAAnJkAAEyIZgBMiQYATImuAEyKBABMiloATIqwAEyLBgBMi1wATIuyAEyMCABMjF4ATIy0AEyNCgAAAAwAAAGBwABMjUUATIeHAEyNQwAAAAEATI1FAAAAAADAAJymwABiPoHBAAADgRUAAIvzAACBNwAAoBQAAIFeAACByQABAQKDnYOnAAAAAwLAAJyngcGBlYGbiDA3wABiPwAAAV2hEgFbAAFgge0DBMAAnKoMgp2CrRiDnoHJAGDAAPR5AZMEwACcqwyDGIMyGIOfgckAXcAA9R0BYMAA9l0BMYMuYMAA9l0BJwAEwACcrAyDiIOfGIOggckAYMAA9l0BJ4OhAQXAAJy3AAAAAAQAAAMAAAAAAAAAAABgwACcpwE/AQkAAKFIAAAAAAYGwACcrgyBdYGAgm8BAIOiAAAAAQOBjIJvAAAAAAAAAGDAAPZdAT4CRYHJAYHSgdQAAFtgwAD0eQEWgeIWgdYug5+ByYHxWsAA9UwBHIHsgIHqwEyOXIFKAQABFoHvLoOegcmB8ADAAPWnAYiB/cBMjlwcgf6Agf3ATI5cXQEAAZQAwAD1nj4BPRyCFhaCCi6Dn4HJgfFPAQABHIItHIIlFoIaLoOfgcmB8UQBAAEcgiiAgibATI5cgUEBAAGUAMAA9Z8AwAD1LF0BAAEWgi8ug6OB9QDAAPZyAMAA9S5KgksBHIJdFoJSLoOfgcmB8UQBAAEWgl4ug56ByYHwAMAA9SwGwACcrwyDo4Oug9EBAIOjAAAAAQODvoPRAAAAAAAAAGDAAPZdAUqDwQEWg8Eug6CByYHyBsAAnLEMg9WD2YRoAgCDowAAAAEDg+iEaAAAAAEBAYPwAAAAgIpgwAD2XQAAXAE+AUmD/SEchAeAhAHATI+FQQEAARaECi6DoIHJgfIAwAD2bD4CPReEJC6DoIHJgIQ3wEyPhYHyPReERC6Dn4HJMYRaYMAA9l0BJwCB8T8GwACcswyEn4SkhMkAAIOkAAAAAQOEroTJAAAAAAAAAFwBPgE9F4S3LoOegckchMMWhLcug56ByYHwXQEAAZQAwAD1noHwBsAAnLQMhQCFBYUqAACDpQAAAAEDhQ+FKgAAAAAAAABcAT4BPReFGC6DnoHJHIUkFoUYLoOegcmB8IFBAQABlADAAPWfgfAGwACctQyFsYWxhhoAAIOmAAAAAQOFvIYaAAAAAQEBhcYAAACBKGDAAPRvAABbAT4EPRyFzy6DpAAAAACB+U6F5YXsAACBEFsBHIXvgIXuwEyQjyAAAAAAAD0chfcug6UAAAAAgfpKhgkBgYYQwEyQrwAATI4wAEyPMgBMj2YATI/jAEyQKQBMkHAATJDhAAAABgLAAJy4gcGBlYGbiDA3wABiQAAAAWDAAJynAAFdgf4BYIwOAgTAAJy6DIZhhngYg3oAYMAA9qcBH4ZqwAD2xgAAAAAEwACcuwyGiYaoGIOpAF2KIwFgwAD2XQEghpqKUwABYMAA9l0AAAEFwACcyAAAAAAEAAADAAAAAAAAAAAAYMAAnLgBPwEJAADAAJy3AAAAAAoGwACcvQyGrYayhwIAAIOqAAAAAQOGuYcCAAAAAQEBhsEAAACDq2DAAPZdAABcAT4CPReGzC6DqRyG4BaG1y6DqYIBg6wBAAGAhujATJG1AIowggE9HIbyLoOkAAAAAIH5BsAAnL4MhweHDoeaAACDrQAAAAEDhxSHmgAAAAAAAABgwAD2XQE+BUAhFocuFoclLoOpggGA/IoohySHNQBOh0OHRwAAg6tgwAD2XQEWh1IWh0kug6mCAYOuiiU9F4dcLoOpFodwFodnLoOpggGDr4omggE9HId6LoOlAAAAAIH6SoeMAYCHk8BMkjYGwACcvwyHyYfOh/sAAE8AAAABA4fRh/sAAAABAQGH2QAAAIOwYMAA9l0AAFwBPgE9HIfqFofnLoN6ggCCEQEAAYCH8MBMkqEAwAD2uwbAAJzADIg4iD2IZwAAg7EAAAABA4hRiGcAAAACAgKIVAAAIIOyYIwOAIheAAAAg7NdwAD1TgJbWwAAXAE+AAbAAJzBDIlAiUWKQQAAg7QAAAABA4lNikEAAAADAgOJUAAAIIOyYIwOAIldAAAAghdgwAD2XQCJaAAAAIOzXcAA9U4CW1sBKwBcAT4HSYl3HImCgol7wEyTRkEBAAErAMAA9dI9iomLwEyTRh6JmMAA9VUAAltbAAA/PRyJoy6DtQAAAACCCz0cib4Wibsug3qCAIIRAQABJ1wAwAD2uz0cic4ug7ECAAKAiePATJMugonpwEyTRgCCBj0cifYug7YCAAKBigjATJM5gooOwEyTRgCCCj0cih4Wihsug3qCAIIRAQABJ4O3AMAA9rs9HIowLoOqAQABgYo4wEyTOQCCAwbAAJzCDIpuinOLXgAAg7gAAAABA4qDi14AAAADAgOKhgAAIIOyYIwOAIqTAAAAghdgwAD2XQCKngAAAIOzXcAA9U4CW1sBKwBcAT4GSYqtHIq4goqxwEyUSEEBAAErAMAA9dI9iorBwEyUSDKKyltbAD89HIrSLoO1AAAAAIILPRyK7RaK6i6DeoIAghEBAAEnXADAAPa7PRyK/S6DsQIAAoCLEsBMlDCCixjATJRIAIIGPRyLJS6DtgIAAoGLN8BMlDuCiz3ATJRIAIIKPRyLTRaLSi6DeoIAghEBAAEng7kAwAD2uwbAAJzDDIuDi4iMEAAAg7oAAAABA4uRjBAAAAAAAAAAXAE+BU6LoYulAACDq2DAAPZdARyLpy6DrQAAAACCBD0ci7Uug7UAAAAAggs9HIvQFovNLoN6ggCCEQEAASeDuwDAAPa7PRyL4S6DtgEAAYCL88BMlR0Aggo9HIwAFov9LoN6ggCCEQEAASeDtwDAAPa7BsAAnMQMjBWMGo3YAACDtgAAAAEDjCuN2AAAAAIBAowzAAAAghdgwAD2XQCMPgAAAIOzXcAA9U4CW1sBKwBcAT4DSYxNHIxYgYxRwEyVtkEBAAErAMAA9dI9iYxhwEyVth6MbsAA9VUAAltbAAA/PRyMfBaMeS6DeoIAghEBAAEkjIsBgIyFwEyVqQDAAPa7PRyMmYGMksBMlbaDvAEAATSMoQOMoY3TAAAAAgICjKIAAACDvVsAjKUAAACA1FsAAGDAAPWCAT4DToy3AAAAgIpgwAD2XQBJjMQhHIzKg4zIwEyWQUEBAAErAMAA9dI+Ak6M5IzoAACDvmDAAPZdARyM6i6DvwEAAYOM+MBMlkEAggw9jI0EwEyWVByNZxyNQhyNHYWNDMBMlnyCpAIAAidcJ4PAAMAA9n2CpAIAAieAiyeDwQDAAPZ9gqQCAAIng2QngvsAwAD2fT4BPYyNlMBMllQng8I9HI23Fo20LoN6ggCCEQEAASSNywUngQGCjcDATJY4J4PDhI3EwEyWVCeDZADAAPa7AMAA9W0GwACcxQyN3Y3ijhQAAIO1AAAAAQON8o4UAAAAAAAAAFwBPgE9HI3+Fo37LoN6ggCCEQEAARaOBC6DooH0AMAA9rsGwACcxgyOSY5QjnEAAIO/AAAAAQOOXY5xAAAAAQEBjmIAAACAilsAAGDAAPZdAUqObAEmjmwBgI5swEyXiGDAAPZdAABMkZYATJH3AEySgwBMktAATJMPAEyUEQBMlPgATJWKAEyXJwBMl2kATJesAAAACgLAAJzJgcGBlYGbiDADwABbfgAAAWDAAJy4AAABBMAAnMuBwYH1ggwYg3oBGoHdwADuS2DAAPanAR+B/sAA9sYAAAAAAQXAAJzXAAAAAAQAAAMAAAAAAAAAAABgwACcyQE/AQkBAMAAnMgAAAAACQbAAJzNgcGCEYIWgqcAAMAAW38AAAABA4IrgqcAAAADAgOCMQAAAIOyYIwOAII+AAAAghdgwAD2XQCCSQAAAIOzXcAA9U4CW1sBKwBcAT4DPRyCWC6DtAMAA4CCYcBMmG6BgmfATJh5goJtwEyYhgCCBz0cgn+AgnrATJhulA8BAAEuAIwRPRyCmC6DugAAAACCCQbAAJzOgcGCrIK9gxAAAJdPARqCrcAA7ksAAAEDgsiDEAAAAAEBAYLOAAAAg7JgjA4AAFwBPgE9HILaLsAAW38CAAKAgvDATJkGJIMLARaC/oCC+cBMmQaFA8AA9dkAwACczQbAAJzPgcGDFYMmg64AAJXrARqDFsAA7ksAAAEDgy+DrgAAAAEBAYM1AAAAg7JgkjIAAFwBPgE9HINBLoO4AwADgINSwEyZaSSDbQEWg2CAg1vATJlphQPAAPXZMoN3W1sCJ4CwFoOFgIOAwEyZaYCwkjUnhAk1AAAAAQBgjEcBFoObgIOWwEyZaYQJkjgjHIOkgQDATJm5QQEAASsAACsWg6SBAMBMmbmAsIxOAWDAAPZdAIIIBsAAnNCBwYOzg8SEOAAAlXYBGoO0wADuSwAAAQOD04Q4AAAAAQEBg98AAACDsmCQOgAAXAE+AT0cg+sug7gDAAOAg/zATJofJIQXARaECoCEBcBMmh+FA8AA9dkyhBlbWwEngIokhDIBFoQrgIQmwEyaH4CKkDwAgggGwACc0YHBhD2EToTTAACVFQEahD7AAO5LAAABA4RehNMAAAABAQGEawAAAIOyYI52AABcAT4BPRyEdy6DuAMAA4CEkcBMmpkkhKwBFoSfgISawEyamYUDwAD12TKErltbASeSSySEzQEWhMOAhL7ATJqZkkuOeACCCAbAAJzSgcGE2ITphV0AAJUwARqE2cAA7ksAAAEDhPeFXQAAAAEBAYUCAAAAg7JgjwwAAFwBPgE9HIUOLoO4AwADgIUfwEybEySFOgEWhS2AhSjATJsThQPAAPXZMoU8W1sBJ4HTJIVXARaFT4CFSsBMmxOB048QAIIIBsAAnNOBwYVihXOGswAAleUBGoVjwADuSwAAAQOFi4azAAAAAQEBhaAAAACDsmCSAgAAXAE+Az0chawug7QDAAOAhbXATJuNJIXQARaFw4CFvsBMm42FA8AA9dkyhdJbWwQngLAkhgEBNQAAAAEAYMAA9l0BFoXqgIXlwEybjYCwkgYjHIXvgQDATJvQQQEAASsAACfAAGJBgQDATJvQAWDAAPZdJ4PgJIYlARaGHICGF8BMm42D4JISJ4PiJIZJARaGQICGO8BMm42D4pITJ5XjJIZ+ARaGaoCGZcBMm42V45IVAIIHPRyGi4CGhsBMm42UDwEAAS4AkiE9HIakLoO6AAAAAIIJBsAAnNSBwYa4hsmHfwAAlfwBGoa5wADuSwAAAQOG24d/AAAAAQEBhuoAAACDsmCSiwAAXAE+Az0chvYug7QDAAOAhv/ATJyVJIcaARaHDYCHCMBMnJWFA8AA9dkyhxxbWwEngLAkh0QBFoc+Foc0gIcvwEyclZSUkpCAsIzUAIIHPRyHV4CHUsBMnJWUDwEAAS4Akpc9HIdwLoO6AAAAAIIJBsAAnNWBwYe1h8OILgABwABCRwAAAAEDh86ILgAAAAEBAYfUAAAAg7JgjA4AAGDAAPZdAT4DTofkh+YAAIDGYMAAnMkBH4fswACc1wAAAAA9HIgFgIgAwEydMpQOAQABgYgMwEydRwCMEEqIFAEciCAWiB2BiBvATJ1Hg3rAAJzLIwAAAADAAPbAAABMmEwATJjfAEyZQgBMmfgATJpyAEya7ABMm2YATJxuAEydEABMnZoAAAAJAAABgcEATJ3JAEyNkABMkQIATJfdAEydxwAAAAMATJ3JAAAAAADAAJzYAIHCAAAFgNoAAKySAACA/AAAsJgAAIEgAADAAFgxAACBQQAAwACcYAAAgWMAAMAAmrUAAAAAAAcCwACc2YHCgbuBwYuiA8AAYkIAAAFgwABZSQAAAwTAAJzbgcKB/IIGCasCAGDAAJq2AATAAJzcgcKCKYI3CcAAYkMAXcAAWTMBYMAAWDYABMAAnN2BwoJjgnoJwABiRABdwABZPwFgwABYNgABBcAAnO2BwoJ/gn+DRQAAAAOCjoNFAAAAAQEBgpQAAASrAmDAAJq2AABgwACc2QE/BAgBwACc24AAwEyesQgAwACc3B+CwsAAnRABAAGAgtfATJ6xAAgAwACc3R+DG8AAnR8BAAGAgzrATJ6xAAkBgn/AAFlfAAAAAAwGwACc34HCg0qDW4QkAAC/bQEag0vAAO5LAAABA4NthCQAAAADAgKDdwAAAINcYMAAWDYAg4MAAACE+2DAAFg2AAGDkgAAAL9uYMAA8rMBKWDAAPKzAT4BSoO1ARyD1BaDvC7AAGJEwACc3b9tAwACgIPnwEyfN4GD6sBMn0QBv26ChAvATJ9SwABZRgbAAJzggcKEKYQ6hJIAAKbfARqEKsAA7ksAAAEDhEaEkgAAAAICAoRQAAAAg1xgwABYNgCEXAAAAIT7YMAAWDYAAGDAAPKzAT4BSoRlASIchGwupNICAAKAhHbATJ/DgYR5wEyf0ADAAJzhARyEfy6k0gIAAoGEicBMn9CAhIzATJ/DAMAAnOEGwACc4YHChJeEqIT5AACk0gEahJjAAO5LAAABA4SxhPkAAAACAgKEuwAAAINcYMAAWDYAhMcAAACE+2DAAFg2AABgwADyswE+AUqE0AEchOYWhNcuwABiQ8AAnNyk0gIAAoCE8MBMoEuBhPPATKBYAMAAWTUGwACc4oHChP6FGIVhAACqeQEahP/AAO5LAAABA4UjhWEAAAABAQGFMAAAAJk8YLCtAABgwABYXQE+AUqFOwEchU0WhUIuqwLAAJzbqnkBAAEmhVkBgIVZwEygwGDAAIawAMAAmsMGwACc44HChWaFgIXLAAC/dQEahWfAAO5LAAABA4WMhcsAAAABAQGFmQAAAJk8YLCtAABgwABYXQE+AUqFpAEchbYWhasuqwLAAJzbwABP8wEAASaFwwGAhcPATKEmYMAAhrAAwACaxAbAAJzkgcKF0IX0hlAAALNOARqF0cAA7ksAAAEDhgGGUAAAAAEBAYYOAAAAmTxgsK0AAF3AAPTbAWDAAFhdAT4BSoYZARaGQhyGKxaGIC6rAsAAnNvAAFAbAQABJoY9AYCGPcBMoY5gwACGsADAAJrFmjrAAJxyBsAAnOWBwoZVhnmGxgAAv3YBGoZWwADuSwAAAQOGhobGAAAAAQEBhpMAAACZPGCwrQAAXcAA9NsBYMAAWF0BPgFKhp4BHIawFoalLqsCwACc2792AQABJoa+AYCGvsBMogVgwACGsADAAJrGBsAAnOaBwobLhuWHSgAAv0kBGobMwADuSwAAAQOG8YdKAAAAAgIChwAAAACCF2DAAFhdAIcSAAAAmTxgsK0AAGDAAFhdAT4BSocdARyHLxaHJC6rAsAAnNu/SQIAAoCHPMBMonGBh0LATKJ+AMAAmscGwACc54HCh0+HZIfSAAC/dAEah1DAAO5LAAABA4dyh9IAAAACAgKHfAAAAINsYMAAWDYAh5AAAACB52DAAFhdAABgwABYNgE+AUqHnwEch7EWh6YuqwLAAJzbv3QCAAKAh8DATKLigYfGwEyi7wDAAJrIBsAAnOiBwofXh/CIgQAAv0oBGofYwADuSwAAAQOH+4iBAAAAAQEBiAoAAACCF2DAAFhdAABgwABYyQE+Ak6IH4goAAC64WDAAFg2ARyINRaIKi6rAsAAnNu/SgEAAYCIQcBMo1UAwACayUqITAEjJYhcgYhTwEyjbGDAAFjJFIhuwEyjbAEBYMAAWMkrAWDAAFjJBsAAnOmBwoiGiJeLUQAAv3cBGoiHwADuSwAAAQOIsYtRAAABAACB/WDAAPXFAVsEBASIuwAAAIHnXwAAAIjZAAAAkkRdwAD1HQFgwABYNgCI/QAAAKODXcAA9R0BYMAAWDYAiRcAAAC/eGEEXwAAYMAAWDZgwABYiWDAAFg2XAAAXAE+AkAciawWiaWCiZfATKQRWsAA9UxBAQABFom9gYmvwEyj/lrAAPVMAMAA9ZyJl4nDAEWJygGJ04nZAAAnYMAA9HkBkwEcieSEid7ATKR6XAEAARaJ9IGJ5sBMo/5awAD1TADAAPWmAYyJ/MBMpHocigGEifzATKR6XQEAAZQAwAD1nj4ETooWiiMAAJVYYMAAWDYBHIoygYolwEyj/kQBAAGEijPATKR6AMAA9SxOilKKXwAAp7RgwABYiQEmilIBHIpugophwEykEUQBAAGEim/ATKR6AMAA9SxgwABYiU6KhoqMAACVCmDAAFg2ARyK2hyKpBaKji6rAsAAnNuqfAEAASaKxgEWisaGirnATKTzkw3AAFiLYMAAhsUAwACay7UHAgACgYrgwEyj/oKK78BMpBEAwABYSD0cixuDiwXATKQkIAQABICLHMBMo/OFiyXATKTKhoszwEyk84eLQcBMpSUAAAbAAJzrgcKLVot1i6ABAKq1ARqLV8AA7ksAAAEDi4SLoAAAAAAAAABgrJMBSouHARaLkhaLhy6rAsAAnNuqtcAAms0AAEyfEABMn5wATKAkAEygmQBMoP8ATKFnAEyh3gBMokoATKK7AEyjLgBMo8EATKWrAEyl7gAAAAwCwACc7oHCi6WLq442A8AAYkUAAAFgwACcfQAAAQTAAJzwgcKMAowMCasCAGDAAJq2AAEFwACc94HCjBGMEYxbAAAAA4wsjFsAAAACAgKMMgAABKsCYMAAmrYAjEoAAACZPGCwrQAAYMAAnO4BPwIIAcAAnPCAAMBMpnUJAIxRwACcjwEAAYGMV8BMpoIABAbAAJzygcKMYIx6jMMAAKp5ARqMYcAA7ksAAAEDjIWMwwAAAAEBAYySAAAImTxgsK0AAGDAAFhdAT4BSoydARyMrxaMpC6rAsAAnPCqeQEAASaMuwGAjLvATKbdYMAAhrAAwACawwbAAJzzgcKMyIzijVUAAL90ARqMycAA7ksAAAEDjPCNVQAAAAICAoz/AAAIghdgwABYXQCNEwAACIHnYMAAWF0AAGDAAFhdAT4BSo0iASaNIgEcjTQWjSkuqwLAAJzwv3QCAAKAjUPATKdDgY1JwEynUADAAJrIYMAAWF0GwACc9IHCjVqNao2/AADAAEU/ARqNW8AA7ksAAAEDjXuNvwAAAAEBAY2IAAAImTxgsK0AAGDAAPR5AT4BSo2TARyNpRaNmi6rAsAAnPDAAEU/AQABJo23AYCNt8BMp8FgwACGsADAAJrKBsAAnPWBwo3Ejd+ONAAAwABQGwEajcXAAO5LAAABA43wjjQAAAABAQGN/QAACJk8YLCtAABgwACcYQE+AUqOCAEcjhoWjg8uqwLAAJzwwABQGwEAASaOLAGAjizATKgrYMAAhrAAwACaxQAATKa2AEynHABMp5gATKgCAEyobAAAAAQCwACc+IHCjjmOSJB1B8AAYkYAAAFgwAD1xQABXcAAWQ4BYMAAWDYAAQXAAJ0BAAAAAAQAAAMAAAAAAAAAAABgwACc+AE/AQkBAMAA9dsAAAAABQbAAJz6gcKOlI6njrEBAqsCAAAAAQOOsY6xAAAAAAAAAGDAAJq2AAbAAJz7gcKOto7VjwABAKq1ARqOt8AA7ksAAAEDjuSPAAAAAAAAAABgrJMBSo7nARaO8haO5y6rAsAAnPqqtcAAms0GwACc/YHCjwWPGo+EAACqfAEajwbAAO5LAAABA48uj4QAAAABAQGPQgAAAJMNYLC5AABgwABYNgE+AUqPUQEcj2MWj1guqwLAAJz6qnwBAAEmj3gBgI94wEypaWDAAIbFAMAAmssGwACc/oHCj4mPoo/vAAC/SgEaj4rAAO5LAAABA4+tj+8AAAABAQGPvAAAAIIXYMAAWF0AAGDAAFjJAT4BSo/IASaPyAEcj9oWj88uqwLAAJz6v0oBAAGAj+bATKnPAMAAmslgwABYyQbAAJz/gcKP9JAOkHMAAL9JARqP9cAA7ksAAAEDkBqQcwAAAAICApApAAAAghdgwABYXQCQOwAAAJk8YLCtAABgwABYXQE+AUqQRgEckFgWkE0uqwLAAJz6v0kCAAKAkGXATKo3gZBrwEyqRADAAJrHAABMqNgATKj/AEypQgBMqagATKoQAEyqgQAAAAUCwACdAoHCkHiQfpEyN8AAYkcAAAFdwABZMwFgwABYNgABYMAAnPgAAQXAAJ0LAAAAAAQAAAMAAAAAAAAAAABgwACdAgE/AQkAAMAAWT4AAAAABQbAAJ0EgcKOlI6njrEBAqsCAAAAAQOOsY6xAAAAAAAAAGDAAJq2AAbAAJ0FgcKOto7VjwABAKq1ARqOt8AA7ksAAAEDjuSPAAAAAAAAAABgrJMBSo7nARaO8haO5y6rAsAAnPqqtcAAms0GwACdB4HCjwWPGo+EAACqfAEajwbAAO5LAAABA48uj4QAAAABAQGPQgAAAJMNYLC5AABgwABYNgE+AUqPUQEcj2MWj1guqwLAAJz6qnwBAAEmj3gBgI94wEyrgmDAAIbFAMAAmssGwACdCIHCj4mPoo/vAAC/SgEaj4rAAO5LAAABA4+tj+8AAAABAQGPvAAAAIIXYMAAWF0AAGDAAFjJAT4BSo/IASaPyAEcj9oWj88uqwLAAJz6v0oBAAGAj+bATKvoAMAAmslgwABYyQbAAJ0JgcKP9JAOkHMAAL9JARqP9cAA7ksAAAEDkBqQcwAAAAICApApAAAAghdgwABYXQCQOwAAAJk8YLCtAABgwABYXQE+AUqQRgEckFgWkE0uqwLAAJz6v0kCAAKAkGXATKxQgZBrwEysXQDAAJrHAABMqvEATKsYAEyrWwBMq8EATKwpAEysmgAAAAUCwACdDIHCkHiQfpEyA8AAYkgAAAFgwACdAgAAAQTAAJ0OgcKQ/JEGCasCARqQ3MAA7ktgwACatgABBcAAnRCBwpELkQuRMAAAAAORH5EwAAAAAQEBkSUAAASrAmDAAJq2AABgwACdDAE/AggBwACdDoAAwEytDAkBkQvAAJ0LAAAAAAAAAEytOwAAAAACwACdEYHCkTWRO5IMN8AAYkkAAAFdwABZPwFgwABYNgABYMAAnPgAAQXAAJ0aAAAAAAQAAAMAAAAAAAAAAABgwACdEQE/AQkAAMAAWUgAAAAABQbAAJ0TgcKOlI6njrEBAqsCAAAAAQOOsY6xAAAAAAAAAGDAAJq2AAbAAJ0UgcKOto7VjwABAKq1ARqOt8AA7ksAAAEDjuSPAAAAAAAAAABgrJMBSo7nARaO8haO5y6rAsAAnPqqtcAAms0GwACdFoHCjwWPGo+EAACqfAEajwbAAO5LAAABA48uj4QAAAABAQGPQgAAAJMNYLC5AABgwABYNgE+AUqPUQEcj2MWj1guqwLAAJz6qnwBAAEmj3gBgI94wEyuKGDAAIbFAMAAmssGwACdF4HCj4mPoo/vAAC/SgEaj4rAAO5LAAABA4+tj+8AAAABAQGPvAAAAIIXYMAAWF0AAGDAAFjJAT4BSo/IASaPyAEcj9oWj88uqwLAAJz6v0oBAAGAj+bATK6OAMAAmslgwABYyQbAAJ0YgcKP9JAOkHMAAL9JARqP9cAA7ksAAAEDkBqQcwAAAAICApApAAAAghdgwABYXQCQOwAAAJk8YLCtAABgwABYXQE+AUqQRgEckFgWkE0uqwLAAJz6v0kCAAKAkGXATK72gZBrwEyvAwDAAJrHAABMrZcATK2+AEyuAQBMrmcATK7PAEyvQAAAAAUCwACdG4HCkTWRO5IMA8AAYkoAAAFgwACdEQAAAQTAAJ0dgcKRzJHWCasCARqRrMAA7ktgwACatgABBcAAnR+BwpHbkduSCgAAAAOR+ZIKAAAAAQEBkf8AAASrAmDAAJq2AABgwACdGwE/AggBwACdHYAAwEyvsgkBkdvAAJ0aAAAAAAAAAEyv4QAAAAAAAAGBwgBMr+wATJ4pAEymJwBMqIUATKqeAEystwBMrUQATK9dAEyv6gAAAAcATK/sAAAAAADAAJ0gAIHDAAAQgNoAAIvzrSsAgQIAAJgArSsAgTYAAJiurSsAgWUAAJ28rSsAgZYAAKHnrSsAgcwAAJ6+AACB5QAAwABVL6jPAIIkAADAAH1UAACCTQAAwABAxAAAgnUAAMAAVo4AAIKYAACskgAAgroAALCYAACC3gAAwAB7IwAAgwMAAMAAWDEAAIMkAADAAJq1AACDRQAAwACQNAAAAAAABALAAJ0hgcODy4PRhZIDwABiSwAAAV2gFQFgwAD2XQAAAAEFwACdJgAAAAAEAAADAAAAAAAAAAAAYMAAnSEBPwEJAQCgSQAAAAACBsAAnSOBw4QGhBmEUAAAlXQBGoQHwADuSwAAAQOEK4RQAAAAAQEBhD0AAACDsmCQMQAAYMAA9l0BSoRGARaES4CERsBMsTWAipAzBsAAnSSBw4RVhGiFkAAAlVYBGoRWwADuSwAAAQOEgIWQAAAAAQEBhJgAAACDsmCPywAAYMAA9l0BPgNOhLGEtAAAg3pgwAD2pwEfhLrAAPbGAAAAAEaEzoUBhOEAAACSR2COYwAWhPSAhO/ATLGAlVSPzT4DToUQhRYAAICKYMAA9l0BJoUQARyFI4KFGMBMsbOUDgEAAS4AjmdgwAD2XUmFNxyFQYOFO8BMsc9BAQABKwDAAPZsSoVKASs/PRyFYIGFXcBMsZWCEQEAAYOFZsBMsc8AwAD2u0qFeAEchYKBhX/ATLGVIwAAAADAAPbAAABMsQ4ATLFZAEyySQAAAAICwACdJ4HDhe2F88AAUOgDwABiTAAAAV2gFQFgwABA7AAABATAAJ0pgcOGQYZQCcAAQlwAYMAA8rMABMAAnSqBw4ZphnMJqwIAYMAAmrYABMAAnSuBw4aDhosYwABiTQBgjBUBKwTAAJ0tgcOGxYcOCcAAYk7AAJ0gAF3AAPVOAmCSAmDAAEDsATKHDGCSAmDAAEDsAAEFwACdUoHDhxOHE4dPAAAAA4cgh08AAAACAQGHJgAABKsCYMAAmrYAAYc4AAAEwABCXGDAAPKzASlgwACdJwE/AwgBwACdKoAAwEyzCwgBwACdKYEAwEyzGQkBhxOgSQAAAAAfBsAAnTCBw4dUh2eHkwEAq3PAAJ0gAAAAAQOHd4eTAAAAAAAAAGCskwFKh3oBFoeFFod6LqsCwACdKqq1wACazQbAAJ0ygcOHmIeriVYAAJ8aAAAAAQOHsIlWAAAAAQEBh78AAACDsmCOYwAAYMAAQOwBPgNOh96H5wAAhB9gwABA7AEmh94BHIfugIfpwEyztJQOAQABLgCOZ2DAAEDsSYgAIhyIDYGIBMBMs8lBAQABKwDAAEEBABaIGC7AAEJcwACdKT4CPRyIhhaIfRaIci6rAsAAnSqfzsAAms6oVQIAAh6IpMAAkDkBAAE1AAAAAQBgjBUBFojCLsAAYk3AAJ0rIxyIy4IAwEy0QUEBAAErAACAiM7ATLO0ggDATLRBAWCMFQAaiOufvQCrx0qJDwEfiRrAAEEQAAAAAD9KiUMBgYlKwEyzyQbAAJ0zgcOJW4l6ie8AAJdZARqJXMAA7ksAAAEDiYuJ7wAAAAEBAYmaAAAAg7JgjmMAAGDAAEDsAT4CSYmmFomqLsAAQlzAAJ0pPgE9IxyJzBaJwy7AAGJNwACdK0EBAAErAMAA9dIXicMuwABiTYCJ0MBMtMPAAJ0rKwFgjBU/SongASsGwACdNYHDifSKDYtAAADAAGJPwACdIAAAAAEDihmLQAAAAAEBAYouAAAAlVRdwAD1HQFgjmMAAF3AAPUdAWDAAEDsAT4DTopail8AAIMUXcAA9R0BYMAAQOwBMYp1YMAAQOwARop9iquKkAAAAJJHYI5jAICKnsBMtUc+A06KxorPAACEH2DAAEDsARyK0S6fGgEAAYKK18BMtYoAwACdMkmK6hyK94OK7sBMtZ9BAQABKwDAAEEBSosAASs/PRyLGIGLE8BMtWhPAQABg4scwEy1nwDAAPUuSosxAYGLOMBMtWgGwACdNoHDi0WLXo1WAADAAGJQwACdIAAAAAEDi2+NVgAAAAEBAYt9AAAAg7Jgjy0AAF3AAPUdAWDAAEDsAT4ETouii6wAAFRdwAD1HQFgwABA7AExi8JgwABA7ABGi8qL+ovdAAAAH2COYwAWi+6Ai+nATLYrlSqPMD4DTowVjB4AAIQfYMAAQOwBHIwgLp8aAQABgowmwEy2ZwDAAJ0ySYw3HIxEg4w7wEy2gkEBAAErAMAAQQFKjE0BKz89HIxqgYxgwEy2Rk8BAAGDjG7ATLaCAMAA9S5GjIOMs4ybAAAAH2CPOwAWjKyAjKfATLYrlP2PMT4DTozOjNcAAIQfYMAAQOwBHIzZLp8aAQABFozogozfwEy24oCKjz4AwACdMkmM9hyNA4OM+sBMtv1BAQABKwDAAEEBSo0MASs/PRyNKYGNH8BMtkZPAQABg40twEy2/QDAAPUuSo1CAYGNScBMtkYGwACdN4HDjVuNeZALAADAAGJRwACdIAAAAAEDjZaQCwAAAAMDA42tAAAAgdNgjV4AjcgAAABUYI8tAI6oAAAAlQhdwAD1HQFgklkAAGDAAEGUAT4DTo7OjtoAAJVUXcAA9R0BYMAAQOwBHI7cLsAAYlDAAJ0gAQABgY7uwEy3mwDAAJ02SY7+HI8Og48CwEy3wEEBAAErAMAA9dJKjxcBKz9KjygBH48zwABBqQQABByPZRaPWi6rAsAAnSqqAQIAAhaPgICPecBMt5CSaY0bgo+QwEy3pQDAAJrAHI+rFo+gLqsCwACdKqMpAQABgI+6wEy3kADAAJq7HI/WFo/LLqsCwACdKsAAT3wBAAGBj+fATLebAMAAmsGDj/vATLfAAAbAAJ04gcOQEJAvkPcAAJVCARqQEcAA7ksAAAEDkEmQ9wAAAAEBAZBjAAAAg7Jgj4UAAGDAAEDsAT4CSZBvIRaQeYCQdMBMuLOD4o+JSpCCASs/SpCTARyQmi7AAGJRwACdIAMAAxaQxoCQwcBMuLOB04+MFpDTgJDOwEy4s1SPiBaQ7RaQ44CQ3sBMuLNUj4iVCI8vAMAAnTcGwACdOYHDkPyRG5PeAACVFQEakP3AAO5LAAABA5Erk94AAAABAQGROwAAAIOyYI52AABgwABA7AE+BE6RWpFjAACEH2DAAEDsARyRdxaRZS7AAGJOwACdIMAAnS1EAQABFpF9gJF4wEy5TZJLjngAwAD1YkmRjCEckZmBkZDATLliQQEAASsAwABBAT4BSpGqAYGRscBMuWI/SZHFJZHeFpHXFpHOgJHJwEy5TZJLjniSUYwbYI44PgNOkgqSEwAAkk9gjjgBJpIKARaSIxaSGoCSFcBMuU2SS454klGMG2COOE6SNZI7AAAnYMAA9HkBHJJbFpJGgpI9wEy54ZRsjj+ArgEAARaSaICSY8BMuU2SS454AMAA9TJJknkhHJKDg5J9wEy6CkEBAAEckoaUgVYAAAAAwAD0nADAAPWcPgFKkpQBH5KfwABCiQEAAYOSu8BMugoAPgJAHJL6FpLqgpLhwEy54ZRtjkCC0AEAARaTCICTA8BMuU2SS454AMAA9OqS4ZMRAEqTHAEfkyfAAEKZAQABFpNMFpNDgJM+wEy5TZJLjniAsJIGAEmTZhaTeBaTb4CTasBMuU2SS454g+KSEz4BSpOJARyTkC6fGgEAARaTpBaTm4CTlsBMuU2SS454kkWSCgDAAJ0yP0qTvAEck8Mul1kBAAGAk9XATLlNAMAAnTMGwACdOoHDk+OUApYVAACVMAEak+TAAO5LAAABA5QQlhUAAAABAQGUHgAAAIOyYI8MAABgwABA7AE+A06UNJQ7AACB02CNEwEWlEKAlD3ATLtUgdOPEEmUTiIllFmBlFLATLtpYI0xABaUbxSUaMBMu2kBAWCNMYPijUA+AUqUgAEflIvAAEH4AQABHJSuFpSjLqsCwACdKrnAAQABJpS8ARaUvICUt8BMu1SB048QYI0xAMAAmrwASZTRIiWU3IGU1cBMu2lgjZ8AHJUDFpT+FJT3wEy7aQEBYI2fghyNokEBAAEalReN4gDAAPXSPgNOlTaVPwAAkk9gsNQBHJVMFpVBLqsCwACdKsAATO8BAAEmlVsBFpVbgJVWwEy7VIHTjxBgjZ8AwACauk6Vc5V4AACCF2DAAFg2ARyVhRaVei6rAsAAnSqqfQEAARaVoRaVmoCVlcBMu1SB048Qkk+NJADAAJq+SpWyAR+VvcAAQhYCAAKCldjATLweJpXiAYOV4sBMvFlgwABYyQA/SpXzARyV+i6XWQEAAYCWDMBMu1QAwACdMwbAAJ07gcOWGpY5lowAAJV8ARqWG8AA7ksAAAEDlkmWjAAAAAEBAZZZAAAAg7JgkFUAAGDAAEDsAT4BSpZlAR+WcMAAQVkAAAAABsAAnTyBw5aRlrCXDQAAlXsBGpaSwADuSwAAAQOWwJcNAAAAAQEBltAAAACDsmCQTAAAYMAAQOwBPgFKltwBH5bnwABBHwEAARaXA4CW/sBMvUSAipBOAAbAAJ09gcOXEpcxl7QAAJV2ARqXE8AA7ksAAAEDl0CXtAAAAAEBAZdPAAAAg7JgkDoAAGDAAEDsAT4BSpdbAR+XZsAAQS4BAAEcl6Eel4nAAPKyAQABFpeagJeVwEy9nICKkDwApE4BAAE3QADAAPKrAAbAAJ0+gcOXuZfYmDsAAJV5ARqXusAA7ksAAAEDl+qYOwAAAAEBAZf8AAAAg7JgkEMAAGDAAEDsAT4BSpgIAR+YE8AAQT0BAAEWmDGAmCzATL4OgIqQRQAGwACdP4HDmECYX5jCAACVdAEamEHAAO5LAAABA5hxmMIAAAABAQGYgwAAAIOyYJAxAABgwABA7AE+AUqYjwEfmJrAAEFMAQABFpi4gJizwEy+ZoCKkDMABsAAnUCBw5jHmOaZSQAAlX8BGpjIwADuSwAAAQOY+JlJAAAAAQEBmQoAAACDsmCQXgAAYMAAQOwBPgFKmRYBH5khwABByQEAARaZP4CZOsBMvr6AipBgAAbAAJ1BgcOZTpltmlcAAJVWARqZT8AA7ksAAAEDmYWaVwAAAAEBAZmdAAAAg7Jgj8sAAGDAAEDsAT4DTpnCmc4AAJVUXcAA9R0BYMAAQOwBHJnQLsAAYk/AAJ0gAQABFpnigJndwEy/FpVUj80AwACdNUmZ9ByaBIGZ+MBMvytBAQABKwDAAPXSSpoNASs/SpoeAR+aKcAAQboBAAGBmkfATL8rAAbAAJ1CgcOaXJp7nVwAAJWOARqaXcAA7ksAAAEDmoqdXAAAAAEBAZqZAAAAg7JgkKsAAGDAAEDsAT4HSZqlIRaar4CaqsBMv7uD4pCtPgFKmsABHJrHLpdZAQABgJrZwEy/uwDAAJ0zP06a85r7AACVYWDAAFg2ARybCBaa/S6rAsAAnSrAAEzcAQABFpsZgJsUwEy/u5VhkK4AwACauE6bMJs6AACVYmDAAFg2ARybRxabPC6rAsAAnSrAAEzcAQABFptYgJtTwEy/u5VikK8AwACauE6bgZuGAACB3F3AAPUdAWDAAEDsATGbnGDAAEDsAE6bvZvEAAApXcAA9R0BYMAAQOwBMZvaYMAAQOwARpvinAqb8wAAAIS6YJC5ABacAYCb/MBMv7uVjZCwPgZOnCWcKQAAg5ZgwABA7AEcnCsunxoBAAEWnDeFnDHATMCpg5aQuwDAAJ0ySZxDHJxLhpxHwEzAxUEBAAErAMAAQQFKnFQBKz89HJxsg5xnwEzAak8BAAGGnHDATMDFAMAA9S5OnI+clQAAgIpgwABA7AEcnJcunxoBAAEWnKOFnJ3ATMCpgIqQvADAAJ0ySZyxHJy7h5y1wEzBKEEBAAErAMAAQQFKnMQBKz89HJzehJzXwEzAiE8BAAGHnOLATMEoAMAA9S5KnPQBH5z/wABBkwMAAxydLhadHi6rc8AAnSDAAJ0wpv8CAAKBnTbATL/+gp0/wEzANACtSIOdS8BMwGqEnVHATMCIAAbAAJ1DgcOdYZ2An4AAAJWLARqdYsAA7ksAAAEDnY+fgAAAAAEBAZ2eAAAAg7JgkJ4AAGDAAEDsAT4FSZ2qIRadtICdr8BMwfWD4pCgPgFKncUBHJ3MLpdZAQABgJ3ewEzB9QDAAJ0zP06d+J4EAACiAGDAAFg2ARyeERaeBi6rAsAAnSrAAEzcAQABFp4igJ4dwEzB9ZVYkKEAwACauE6eTp5VAAApXcAA9R0BYMAAQOwBMZ5rYMAAQOwARp5znqaehgAAAJJHYI5jABaemYCelMBMwfWVVJCiPgNOnsGexwAAgIpgwABA7AEcnskunxoBAAGDns/ATMKPAMAAnTJJnuIcnuyEnubATMKrQQEAASsAwABBAUqe9QErPz0cnw+CnwjATMJuTwEAAYSfE8BMwqsAwAD1LkqfJQEfnzDAAEF/AgACHJ9fFp9PLqtzwACdIMAAnTCnDQEAAYGfZ8BMwjgArUeCn3XATMJuAAbAAJ1EgcOfhZ+koagAAJWJARqfhsAA7ksAAAEDn7ShqAAAAAEBAZ/EAAAAg7JgkJEAAGDAAEDsAT4FSZ/QIRaf2oCf1cBMw2OD4pCTPgFKn+sBHJ/yLpdZAQABgKAEwEzDYwDAAJ0zP06gHqAqAACiAGDAAFg2ARygNxagLC6rAsAAnSrAAEzcAQABFqBIgKBDwEzDY5VYkJQAwACauE6gdKB7AAApXcAA9R0BYMAAQOwBMaCRYMAAQOwARqCZoMygrAAAAJJHYI5jABagv4CgusBMw2OVVJCVPgNOoOeg7QAAgIpgwABA7AEcoO8unxoBAAGDoPXATMP9AMAAnTJJoQgcoRKEoQzATMQZQQEAASsAwABBAUqhGwErPz0coTWCoS7ATMPcTwEAAYShOcBMxBkAwAD1LkqhSwEfoVbAAEFsAgACHKGGFqF2LqtzwACdIMAAnTCm5AEAAYGhj8BMw6YArUaCoZ3ATMPcAAbAAJ1FgcOhraHMpM4AAJWBARqhrsAA7ksAAAEDodykzgAAAAEBAaHsAAAAg7JgkGkAAGDAAEDsAT4ETqH/AAAAgLBgwAD2XQBOohKiFwAAghdgwABYNgEcoiQWohkuqwLAAJ0qwABM3AEAARaiNYCiMMBMxNGCF5BrAMAAmrhJokAWokmCokTATMT0hETAAFg7PgE9iaJcwEzE5ieZjUmieSWigoKifcBMxPRgwABYXT4BPYminMBMxOYWorAWoqgUoqPATMT0AgFgwABYXZMNwABYX4CwsJtJosEWosqCosXATMT0sizAAFg+PgE9iaNjwEzE5ieA1kmjeiWjiBajg4CjfsBMxNGCF5BrYJKcPgROo7SjwQAAlN1gkpwBJqO0ARajyICjw8BMxNGCF5BrYJKcQCEco/AWo+iDo9vATMW9lgGSqEEBAAErAMAA9dKj26P3AD2KpADATMT0HKQSFqQHLqsCwACdKsAAT30BAAEWpC6DpCHATMW9lgGSqADAAJq/PYmkPsBMxOYWpFoWpFKDpEXATMW9lgGSqICwjK0+AUqkcwEcpHoul1kBAAGApIzATMTRAMAAnTNKpJ0BH6SowABB2QIAAoKkv8BMxPSBpMXATMTmAAbAAJ1GgcOk06Type4AAJVyARqk1MAA7ksAAAEDpQOl7gAAAAEBAaUUAAAAg7JgkBcAAGDAAEDsAT4ETqUzpT4AAJJHYMAAQOwBHKVALp8aAQABFqVLgKVGwEzGq5VIkBoAwACdMkmlWRylaIGlXcBMxsBBAQABKwDAAEEBSqVxASs/TqWLpZAAAIIXYMAAWDYBHKWdFqWSLqsCwACdKsAATNwBAAEWpa6ApanATMargheQGwDAAJq4SqW5AR+lxMAAQeoCAAKBpdnATMbAgqXlwEzHCAAGwACdR4HDpfOmEqfaAACVRgEapfTAAO5LAAABA6Ykp9oAAAABAQGmNgAAAIOyYI+ZAABgwABA7AE+BU6mUaZfAACSRF3AAPUdAWDAAFg2ARymmBymfBamboCmacBMx4GSRI+cgJ8BAWDAAFg2ARamixamgC6rAsAAnSrAAEzcwACauADAAPTmgKEAAAAAwAD08UampqbTprQAAACVWGDAAFg2AIGmxMBMx5Y+AUmm2xam7IKm38BMx/GzM8AAWEM+AUqnDQErP06nP6dKAACSR2DAAEDsARynTC6fGgEAARanV4CnUsBMx4GSR4+bAMAAnTJJp2gcp3eCp2zATMgjQQEAASsAwABBAUqngAErP0qnkQEfp5zAAELsAgACgae8wEzHloKny8BMyCMABsAAnUiBw6ffp/6owQAAlUkBGqfgwADuSwAAAQOoBqjBAAAAAQEBqA4AAACDsmCPpQAAYMAAQOwBPgNOqC2oOAAAkkdgwABA7AEcqDounxoBAAEWqEWAqEDATMiulUiPpwDAAJ0ySahTHKhigahXwEzIw0EBAAErAMAAQQFKqGsBKz9KqHwBH6iHwABCUwIAAhqorcAAezaBqLLATMjDAAbAAJ1JgcOoxqjlqooAAJVSARqox8AA7ksAAAEDqP+qigAAAAEBAakZAAAAg7Jgj70AAGDAAEDsAT4HTqk4qUIAAJVPYMAAQOwBHKlELp8aAQABFqlPgKlKwEzJTpVPj78AwACdMkmpXxypbYGpY8BMyWNBAQABKwDAAEEBSql2ASs/TqmaqaIAALRtYMAAQOwBHKmkLp8aAQABFqmvgKmqwEzJToE8j8AAwACdMkmpuhypxoKpvsBMyatBAQABKwDAAEEBSqnPASs/TqnzqfwAALRuYMAAQOwBHKn+Lp8aAQABFqoJgKoEwEzJTpVQj8EAwACdMkmqGRyqJoOqHcBMyfNBAQABKwDAAEEBSqovASs/SqpAAR+qS8AAQnkDAAOBqmnATMljgqp0wEzJq4OqfcBMyfMABsAAnUqBw6qPqq6ryAAAlR8BGqqQwADuSwAAAQOqvqvIAAAAAQEBqs4AAACDsmCOjgAAYMAAQOwBPgRJqtohHKrtFqroFqrjgKrewEzKhYCwjpGAsJI1QQEAASdaAMAA9mw+Aj0jHKsLFqsCLsAAYk3AAJ0rQQEAASsAwAD10herAi7AAGJNgKsPwEzKhcAAnSsrAWCMFUqrGwErP06rRatOAACEPGDAAEDsARyrUC6fGgEAARarW4CrVsBMyoWEPI6QAMAAnTJJq2ocq3eBq27ATMr8QQEAASsAwABBAUqrgAErP0qrkQEfq5zAAEJlAQABgau7wEzK/AAGwACdS4HDq82r7LDMAACVPAEaq87AAO5LAAABA6wBsMwAAAABAQGsFgAAAIOyYI9NAABgwABA7AE+BEmsuBas0RasyxaswYCsvMBMy4BUj1GU/Y8xg2jAAPUAPgFKrOUBHKzsLpdZAQABgKz+wEzLgADAAJ0zP0mtDxytNBatLRatIhatGICtE8BMy4BUj1GVKo8wWsAA9UxBAQABkwDAAPWcPgNOrVAAAACSmmDAAHsxAEmtYBytcxatbhataYCtZMBMy4CAsI9QgLCSNUEBAAEWrYsarYTAAHs3spLAAHs1AMAA9mw+AT2JraPATMv/Gq28wAB7Nz4BPYmt28BMy/8erfTAAHs+AQABFq4EFq3/gK36wEzLgICwj1CAsJI1AEmuGSEcriaBrh3ATMv/QQEAASsAwAD10j4DTq5MrlcAAJJHYMAAQOwBHK5ZLp8aAQABFq5kgK5fwEzLgIQ8j08AwACdMkmudxyuhoKue8BMzJZBAQABKwDAAEEBSq6PASs/Sq6kAR+ur8AAQlMCAAKBrsfATMv/gq7RwEzMlgA/P0mu8ByvFRavDhavAxau+YCu9MBMy4BUj1GVKo8wWsAA9UxBAQABlADAAPWcPgJOrzKvOwAAkppgwAB7YQEer0zAAHt/AQABFq9cFq9XgK9SwEzLgICwj1CAsJI1AEmvaSEcr3aBr23ATM0rQQEAASsAwAD10j4FTq+cr6EAAJVLYMAAQOwBHK+jLp8aAQABFq+ugK+pwEzLgIQ8j08AwACdMkmvwRyvyoKvxcBMzXRBAQABKwDAAEEBSq/TASs/Tq/7sAEAAJVMYMAAQOwBHLADLp8aAQABFrAjFrAYFrAOgLAJwEzLgFSPUZUqjzCAtsAA9QMAwACdMkmwNBywPoOwOMBMzbxBAQABKwDAAEEBSrBHASs/SrBcAR+wZ8AAQiwDAAOCsIDATM10gbCGwEzNK4OwkMBMzbwAPz9KsKoBHLCxLpdZAQABgLDDwEzLgADAAJ0zBsAAnUyBw7DRsPC3GQAAlUABGrDSwADuSwAAAQOxBbcZAAAAAQEBsRoAAACDsmCPcgAAYMAAQOwBPgNOsTOxOgAAkltgsL8BHLFHFrE8LqsCwACdKprLAQABFrFWgLFRwEzOeIHTj3kAwACauUmxYxyxboGxZ8BMzo1BAQABFrGBFrFxLqtzwACdIMAAnTCo3KyyAMAA9dI+AUmxnCIcscEWsboWsa8WsaWAsaDATM54VI91lSqPMFrAAPVMQQEAAZUAwAD1nAAWsegWseIWsdiAsdPATM54VI91lP2PMYD8wAD0/z4FTrIOshMAAJVLYMAAQOwBHLIVLp8aAQABHLI0FrIqFrIggLIbwEzOeFSPdZUqjzBEAQABkwDAAPUsAMAAnTJJskIcskuCskbATM85QQEAASsAwABBAUqyVAErP06yfLKCAACVTGDAAEDsARyyhC6fGgEAARyyoxaymRayj4CyisBMznhUj3WVKo8wRAEAAZQAwAD1LADAAJ0ySbKxHLK7g7K1wEzPlEEBAAErAMAAQQFKssQBKz9KstkBH7LkwABCPwIAAoKzAMBMzzmDswbATM+UAD9JsyEiHLMxFrMsgbMlwEzOjYCwsJtBAQABJ5suAMAA9mwAHLNyFrNrFrNgFrNWgLNRwEzOeFSPdZUqjzBawAD1TEEBAAGUAMAA9Zw+BU6zk7OYAACAsGDAAEDsARyzmi6fGgEAARazuhazrxazpYCzoMBMznhUj3WVKo8wgLbAAPUDAMAAnTJJs8kcs9KCs83ATNBaQQEAASsAwABBAUqz2wErP060AQAAAILfYMAAQOwASbQVHLQ1FrQuFrQoFrQegLQZwEzOeFSPdZT9jzFawAD1TEEBAAGUAMAA9Zw+A0m0RSEctGoWtGUWtF4WtFgWtE6AtEnATM54VI91lP2PMYC2wAD1A4Cwjz1BAQABJ4LfAMAA9mw+AUq0iQEctJAul1kBAAGAtKLATM54AMAAnTM/PYu0u8BM0LEctMounxoBAAEWtOwWtOUWtN8WtNWAtNDATM54VI91lP2PMYC2wAD1A4CKjz4AwACdMkm0/By1DYO1AMBM0LFBAQABKwDAAEEBSrUWASs/P0m1MRy1Sxa1PIG1NcBMzo2SabDNQQEAARa1Xha1Ti6rc8AAnSDAAJ0wmuGslgDAAPXSPgFKtXMBH7V+wABCswIAAoK1pMBM0FqDtarATNCxAEm1xhy14Ba10YG1ysBMzo2SabDNQQEAARa18xa14y6rc8AAnSDAAJ0wmvSsmADAAPXSPgFKtgcBH7YSwABCvwIAAoK2N8BM0FqDtj3ATNCxAEm2WRy2cxa2ZIG2XcBMzo2SabDNQQEAARa2hha2di6rc8AAnSDAAJ0wmyGsmgDAAPXSPgFKtp0BH7aowABCywIAAoK20MBM0FqDttbATNCxAD8/Srb3ARy2/i6XWQEAAYC3EMBMzngAwACdMwbAAJ1NgcO3Hrc9uS8AAJVNARq3H8AA7ksAAAEDt1O5LwAAAAEBAbdpAAAAg7Jgj7AAAGDAAEDsAT4DTreEt40AAJKaYMAAe2EBHreewAB7fwEAARa3qYC3pMBM0sySmo+zAEm3uCIhHLfFgbe8wEzS4UEBAAErAMAA9dIAHrfxwABCHgEAAYG4A8BM0uEAPgVOuCm4LgAAlUtgwABA7AEcuDAunxoBAAEWuDuAuDbATNLMlUuPsgDAAJ0ySbhIHLhRgrhMwEzTN0EBAAErAMAAQQFKuFoBKz9OuIC4hgAAlUxgwABA7AEcuIgunxoBAAEWuJOAuI7ATNLMlUyPtADAAJ0ySbihHLirg7ilwEzTf0EBAAErAMAAQQFKuLQBKz9KuMcBH7jSwABCLAMAA4K468BM0zeBuPHATNLhg7j7wEzTfwA/SrkNARy5FC6XWQEAAYC5JsBM0swAwACdMwbAAJ1OgcO5NLlTvrkAAJWZARq5NcAA7ksAAAEDuVu+uQAAAAEBAbljAAAAg7JgkOUAAGDAAEDsAT4DTrl9uYIAAJJMYI5jARa5iYC5hMBM1CuSTJDoSbmTJbmcgbmXwEzUQGCPvT4CTrnPudkAAJVPYI5jARa54BS528BM1EABAWCPvZVPj79JufEluf+CufXATNRtYI9NPgNOui+6OAAAhDxgjmMBFrpEFLo6wEzUbQIBYI9NhDyPT066ZLpuAACVUGCOYwEWunUUunDATNRAAQFgj72VUI/BSbqIIiIiHLqgFrqbFrqWFLqMwEzUbQIBYI9NgLCPUICwkjVBAQABFrq1GrqywAB7ZYCwwAB7ZADAAPZsACW60oO6ycBM1J9gjnYAJbsZFrsSFrsHFrr9FLrzwEzUbQIBYI9NVI9RlSqPMIC2wAD1A2CQVQAlu0SEuzrATNS/YI52PgFJu2MiHLt5FrtwFLtnwEzUnwMBYI52kkuOeEEBAAEWu4GAu3zATNQrkkuQ5wDAAPXSABy7rha7pRS7m8BM1L8EAWCOdpJLjnhBAQABFru2gLuxwEzUK5JLkOcAwAD10j4FTrxVvFoAAJVLYMAAQOwBHLxcLp8aAQABFrxwFrxngLxiwEzUK5JLkOeSRZIKAMAAnTJJvIocvJOFvI7ATNXDQQEAASsAwABBAUq8nAErP068yLzOAACVTGDAAEDsARy80C6fGgEAARa82xS81sBM1EABAWCPvYE8j8AAwACdMkm87hy8+Ia88sBM1hJBAQABKwDAAEEBSr0BASs/Sr4UAR++H8AAQiwDAAOFvknATNXDGr5ewAB7eYa+Z8BM1hIAPz8/P0q+lwEcvp4ul1kBAAGAvrDATNQrAMAAnTMGwACdT4HDvr6+3b8zAACVmwEavr/AAO5LAAABA77xvzMAAAABAQG/BQAAAIOyYJDxAABgwABA7AE+AUq/EQEcvxgul1kBAAGAvyrATNbGAMAAnTMGwACdUIHDv5W/qcAAUOYAAMAAYhQAAAABA7/DwABQ5gAAAAEBAb/TAAAAg7JgjV4AAGDAAH1pAT4PQBa/64C/5sBM1xmD4o1ov+a/8gBOwABAAsAAQAYAAJk8YIzOARbAAEANgMAAQAjATNcZkmmNG07AAEAvwABANAAAghdgwABYXQEcwABAQRbAAEA2LqsCwACdKqp5AQABJsAAQFgBHMAAQFgWwABATS6rAsAAnSqa0gEAAYHAAEBhwEzXQgDAAJq9YMAAhrAAwACaw07AAECOwABAnAAAwABUU13AAPVOAltgwABA7AEywABAw1tgwABA7ABOwABAz8AAQN4AAKu5YMAA9HkBk0bAAEDnwABBPMAAQQMAAACAz2CSAgAWwABBJhbAAEEdgMAAQRjATNcZkk+NYpRsjj8+AknAAEFEHMAAQVeEwABBSMBM1+qBSAEAARbAAEFoFsAAQV+AwABBWsBM1xmST41ilMeOPgDAAPWpPgROwABBnQAAAILfYMAAQOwAScAAQbMhHMAAQc0WwABBwYXAAEG3wEzYBpJFkgpBAQABKwDAAPXSPgE9jsAAQeLATNhrHMAAQfEunxoBAAEWwABCAYXAAEH3wEzYBpJFkgoAwACdMj4BPY7AAEIqwEzYax/AAEI9wABBWQAAAABJwABCaRzAAEJ6hsAAQm3ATNhrQQEAASsAwABBAUrAAEKDASs/PRzAAEKlg8AAQpjATNfCgLICAAKEwABCpsBM1+qGwABCuMBM2GsAwAD1Yz89jMAAQtTATNfqHMAAQuKEwABC1MBM1+pdAQABlADAAPWeRsAAQvDAAEM4wABDDAAAAIDPYJICABbAAEMnFsAAQx6AwABDGcBM1xmST41ilG2OQD4DTsAAQ1PAAENgAACC32DAAEDsARzAAENiLp8aAQABFsAAQ3KFwABDaMBM2WSSRZIKAMAAnTJJwABDhhzAAEOXhsAAQ4rATNmPQQEAASsAwABBAUrAAEOgASs/PRzAAEPAg8AAQ7PATNfCgLICAAIWwABDy4XAAEPBwEzZZICwkgaGwABD08BM2Y8AwAD1Y07AAEPxwABD/wAAnYtgwADyswEiHMAARBoWwABEExbAAEQGgMAARAHATNcZlMCNY1rAAPVMQQEAAZQAwAD1nAAlwABEQxbAAEQ8FsAARC+AwABEKsBM1xmUwI1jgLbAAPUDYI4XTsAARIvAAESUAAC0MF3AAPVOAmCw0WDAAEDsATLAAES/YLDRYMAAQOwAT8AARMjAAETNAAABwABiUmECYI0xYMAAQOxcAAPAAETawABFRQAAAAICAsAAROQAAACURGCNMQDAAET+AAAAhB9gwABA7AAAXAE+AT0cwABFGIbAAEUQwEzagoCyAgACHMAARSQWwABFGS6rAsAAnSq5wAEAARTAAEUtwEza1ggAAMAAmrwUwABFN8BM2uMJAADAAPVjScAARUwhhcAARVHATNodPgFGwABFaADAAEV2AAAAlERgjTEAFsAARYOBwABFf8BM10KUOozhQT4CScAARZUWwABFnxTAAEWZwEzbWAgAg96NQULAAEWpAD9JwABFuyEcwABF0RbAAEXFFMAARb/ATNtYCACSRY01QQEAASsAwAD10j4BPRzAAEXzh8AARebATNqwIAIAAhTAAEX0wEzbWAgAHMAARfsunxoBAAEWwABGBxTAAEYBwEzbWAgAkkWNNQDAAJ0yAAA/P07AAEZRAAAAwABUVGDAAEGUAE7AAEaQwABGmwAAtDNdwAD1HQFgwABCzAExwABGt2DAAELMAEbAAEa/wABG9cAARtMAAACSRWCN6wAWwABG54DAAEbiwEzXGZTAjWM+AUnAAEb9JcAARw0UwABHAcBM3EoKAGCN+T4BPRzAAEc8h8AARy/ATNqwIAIAAhbAAEdJFMAARz3ATNxKCgFgjfmURI3+HMAAR1AunxoBAAEWwABHYhTAAEdWwEzcSgoBYI35gIqN/ADAAJ0yAABJwABHeCXAAEeIFMAAR3zATNxKCgBgjgg+AT0VwABHqsBM3AwIHMAAR8cuwABiUcAAnSADAAMWwABH/hTAAEfywEzcSgoBYI4IgdOODRbAAEgeFMAASBLATNxKCgFgjghUjgsWwABISxbAAEhBFMAASDXATNxKCgFgjghUjguVCI8vAMAAnTdJwABIYCXAAEhwFMAASGTATNxKCgBgjhc+AT0VwABImMBM3AwIHMAASLUuwABiUcAAnSADAAMWwABI7BTAAEjgwEzcSgoBYI4XgdOOHBbAAEkMFMAASQDATNxKCgFgjhdUjhoWwABJQBbAAEk3FsAASSiAwABJI8BM1xmSaY0blG6M/ZJEko4AwACdN0nAAEldJcAASW0UwABJYcBM3EoKAGCOLz4DTsAASaPAAEmtAACVT2DAAEDsARzAAEmvLp8aAQABFsAAScsWwABJwRTAAEm1wEzcSgoBYI4vklCOMZVPkUMAwACdMk7AAEnywABJ+gAAImDAAEDsASMhHMAAShoWwABKEhbAAEoIFMAASfzATNxKCgFgji+SUI4xIpFEQQEAASsAwAD10hzAAEowLp8aAQABFsAASkwWwABKQhTAAEo2wEzcSgoBYI4vklCOMSKRRADAAJ0yKwFgwABA7D0cwABKfBTAAEpxwEzcHgkATwEAAR/AAEqEwABC2wIAAhTAAEqdwEzeBgsAFMAASqjATN5JDAAAAMAA9S5JwABKwCXAAErQFMAASsTATNxKCgBgjfI+A07AAEr7wABLCwAAp8pgwAD2XQEkwABLJwMWwABLFIHAAEsQwEzXQoCwjNQngTEWwABLIYDAAEscwEzXGYCwjRc9HMAAS0UWwABLPBbAAEsxLqsCwACdKp/OwACazqhVAwADHsAAS2XAAJA5AQABFMAAS4PATNxKCgFgjfIAGsAAS6mfmjLAAEvTW1sBJ6fKFMAAS+fATN8YCwAAq8dKwABMAgEfwABMDcAAfbQAAAAAScAATDolwABMShTAAEw+wEzcSgoAYI4mPgNOwABMg8AATIwAAJJLYJICARbAAEyaFMAATI7ATNxKCgFgjiaSS44oTsAATL/AAEzIAACEH2DAAEDsARzAAEzKLp8aAQABFsAATNkUwABM0MBM3+ILAJJFkgoAwACdMknAAEzvIRzAAEz8FMAATPPATOAKDABBAQABKwDAAEEBPgE9HMAATSMWwABNES7AAGJOwACdIMAA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wAD2XQAAYLDsAT4DPRzAAEV3LsAAQOTAAJ17AQABJsAARYMBgMAARYPATSavYMAAeDkAwACdzk7AAEWewABFqgAAmFBgjRMBHMAARbsWwABFrC7AAGHlwACde8AAncJEAQABgcAARbzATSa+AMAA9WJKwABFxwEjIRzAAEXagsAARc7ATScAQQEAASsAwAD10hzAAEXvgMAAReTATSavoykBAAGCwABF/sBNJwAAwACauysBYLDsBsAAndOBxMAARhrAAEYrwABHHgAAqnYBGsAARhvAAO5LAAABA8AARj3AAEceAAAAAgICwABGVAAAAKsCYMAAmrYAwABGZQAAAIEoYQFgsOxcAABcAT4CPRzAAEaNLsAAQOTAAJ17AQABJsAARpkBgMAARpnATSeyYMAAeDkAwACdzj0cwABGwRbAAEa6FsAARqouwABh5cAAnXvAAJ3CKcAA9XGDvAEAATTAAEbJA8AARsnAAEcZAAAAAQEBwABG1AAAAJhQYI0TAABgwAD1ggE+AT0cwABG6oHAAEbpwE0nwSABAAEcwABG9oDAAEbrwE0nsqMpAQABgsAARwXATSg8AMAAmrsAAADAAPTrBsAAndSBxMAARyPAAEcowABHzQAAwABQUwAAAAEDwABHOsAAR80AAAABAQHAAEdRAAAAwABGUmCw8wAAXAE+Aj0jHMAAR30WwABHaC7AAGHmwACde8AAncdBAQABKwDAAPXSF8AAR2guwABh5sAAnXsxwABHmGCw8wDAAJ3HKwFdwAD1HQFgsPM9HMAAR7UWwABHoC7AAGHmwACde8AAncdPAQABgMAAR7nATSi5AMAA9S4GwACd1YHEwABH0sAAR+PAAEhPAACqjgEawABH08AA7ksAAAEDwABH+cAASE8AAAABAQHAAEf/AAAAgShhAWCw81wAAFwBPgE9NQAAAAEAXcAA9R0BYLDzARbAAEgrLsAAYebAAJ17wACdxyMcwABIQYEAwE0pikEBAAErAAArHMAASEGBAMBNKYqDvAEAAYDAAEhJwE0pcwDAAPTrAVwGwACd1oHEwABIVMAASGrAAE9bAACFdQEawABIVcAA7ksAAAEDwABIccAAT1sAAAACAgLAAEiBAAAAqwJgwACatgDAAEiyAAAAr5RdwAD1TgJgsL9gwABgQAAAYMAAmwwBPglOwABI4AAAAMAA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AUrAAEeVAR7AAEeZwACgSwEAAYDAAEe6wE2pCwABv9gpwABacsAAnzM9F8AAR+MuwABSCcAAnsMcwABH/IDAAEf1wE2pC6whAQAAAb/YKcAAWnjAAJ80PRfAAEggLsAAUgrAAJ7DHMAASDmAwABIMsBNqQusIQEAAAG/2CnAAFp4wACfNT0XwABIXS7AAFILwACewxzAAEh0gMAASG3ATakLq0MCAWDAAPKzATTAAEh9A8AASH3AAEiUAAAAAAAAAGDAAPKzAUrAAEiDARzAAEiKgMAASIPATakLq0IAAAAAwABacwG/2CnAAFpywACfNj0XwABIri7AAFIMwACewxzAAEjPgMAASMjATakLq0MCAWDAAPMrATTAAEjYA8AASNjAAEj2AAAAAAAAAGDAAPMrAUrAAEjeARzAAEjlgMAASN7ATakLv+4AAAAAwABaogG/2CnAAFpywACfNz0XwABJEC7AAFINwACewxzAAEkugMAASSfATakLq0MCAWDAAPR5ATTAAEk3A8AASTfAAElWAAAAAAAAAGDAAPR5AUrAAEk9ARzAAElEgMAAST3ATakLv+8AAAAAwABaowG/2CnAAFpywACfOD0XwABJcC7AAENCwACewxzAAEmKgMAASYPATakLq0MCAWDAAKBQATTAAEmcA8AASZzAAEnMAAAAAAAAAGDAAKBQAUrAAEmiAR7AAEmmwACgWAEAAYDAAEnFwE2pCwABv9gpwABacsAAnzk9F8AASjUuwABSDsAAnsMmwABKNQEcwABKWIDAAEpRwE2pC7/fAQFgjV4AAb/YKcAAWoBdwAD1HQFgjV7AAJ86PRfAAEqQLsAAUg/AAJ7DJsAASpABHMAASqWAwABKnsBNqQu/3wEBYI0xAAG/2CnAAFqAXcAA9R0BYI0xwACfOz0XwABK1y7AAFIQwACewybAAErXARzAAErwgMAASunATakLv98BAWCNnwABv9gpwABagF3AAPUdAWCNn8AAnzw9F8AASyYuwABSEsAAnsMcwABLTYDAAEtGwE2pC65ZAQFgkZMAAb/YKcAAWofAAJ89PRfAAEuHLsAAUhHAAJ7DHMAAS6+AwABLqMBNqQuuWQEBYI9yAAG/2CnAAFqHwACfPj0XwABL6i7AAFITwACewxzAAEwcgMAATBXATakLrlkBAWCPhQABv9gpwABah8AA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WicAAFwBPgQ9HMAAsdSAwACxz8BOFcyCGwEAARrAALHawACf7gDAAFosPRzAALHpgMAAseTAThXMv8QBAAEWwACx+y6CF8AAn+8AwABaSz0cwACyC4DAALIGwE4VzK2LAQABFsAAshUughzAAJ/wAMAAWjg9HMAAsiWAwACyIMBOFcyCEwEAARrAALIpwACf7gDAAFotAABOFJEAThWgAE4WbgAAAAICwACf94FawACyNsAAsjvAALLdC8AAYrYAAAFgwAD1xQAADQTAAJ/5gVrAALI7wACyOwknAGDAAPR5AATAAJ/7gVrAALI7wACyOwkowACewwBgwAD2XQAEwACf/IFawACyO8AAsjsGKQBdwAD1HQFgwACf9wE6AGDAAJ/3ChoAwACf/RoAwACf/hoAwACf/xoAwACgABoAwACgARoAwACgAhoAwACgAxoAwACgBBoAwACgBRoAwACgBgTAAJ/9gVrAALJMwACyTAbAAEGYAGDAAJ/3ASAAwACgCgIAApMnwABitwAEwACf/oFawACyXsAAsl4GwABBmgBgwACf9wEgAMAAoAoCAAKUJ8AAYrgABMAAn/+BWsAAsmvAALJrBsAASEQAYMAAn/cBIADAAKAKAgAClSfAAGK5AATAAKAAgVrAALJ5wACyeQbAAEhRAGDAAJ/3ASAAwACgCgIAApYnwABiugAEwACgAYFawACyhsAAsoYGwABBlwBgwACf9wEgAMAAoAoCAAKXJ8AAYrsABMAAoAKBWsAAspDAALKQBsAAQZkAYMAAn/cBIADAAKAKAgACNwUnwABivAAEwACgA4FawACyoMAAsqAGuygAYMAAn/cBIADAAKAKAgACNwYnwABivQAEwACgBIFawACyq8AAsqsGwABivgBgwACf9wEgAMAAoAoCAAI3ByfAAGK/AATAAKAFgVrAALK+wACyvgaU9QBgwACf9wEgAMAAoAoCAAI3CCfAAGLAAATAAKAGgVrAALLNwACyzQbAAGLBAGDAAJ/3ASAAwACgCgIAAjcJJ8AAYsIAAQXAAKAKgVrAALI7wACyO8AAst0BAAADwACyO8AAst0AAAACAgLAALI7AAAEJ2DAAPR5AMAAsjsAAAQoYMAA9l0AAGDAAJ/3AT8DCADAAJ/5gADAThkNCADAAJ/7gQDAThkbCQAAwAD12wAAAAABBsAAoAiB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msAAoNmscAEAAR7AAEVfwABdeQIAAhzAAEWHFsAARXwuqwLAAKDXmssBAAGAwABFkcBOUXAAwAB4CBzAAEWlFsAARZouqwLAAKDXwABNXQEAAYHAAEWvwE5RfQDAAHgWAADAAEAlBsAAoIqBx8AARcHAAEXSwABJEgAAwABRsQEawABFwsAA7ksAAAEDwABF6cAASRIAAAAEBATAAEXyAAAAgLBgkjIAwABF/AAAAKS3YMAA9HkAwABGJAAAAKS4XcAA9R0BYMAA9l0AwABGRgAAAJJEXcAA9R0BYJJZAABcAT4DTsAARmrAAEZxAACTMWCw1AEmwABGagEcwABGhhbAAEZ7LqsCwACg18AATekDAAIWwABGlS6lDMAAoNiAwABGpMBOUjcBmcsqwAB4DmCw1E7AAEbNwABG3wAAwABi1F3AAPUdAWDAAFg2ARzAAEbhLsAAYs/AAKBeAQABg8AARvPATlJoAMAAoN9JwABHByEcwABHEoTAAEcLwE5SgUEBAAErAMAA9dI+AT0cwABHMRbAAEcjLqyawACg2axwAQABHsAAR0fAAF17AwADhMAAR2jATlKBHsAAR37AAFUSAwADHMAAR6CBwABHjMBOUkRdAQABFsAAR7GCwABHosBOUlNawAD1TADAAPWegsAAR8fATlJTFsAAR+WDwABH18BOUmhawAD1TACFwABH+MBOUtAAAMAAQCU+Aj0cwABILhbAAEggLqyawACg2axwAQABHsAASETAAF17AgACHMAASHAWwABIZS6rAsAAoNfAAEOOAQABFsAASJMWwABIhS6lDMAAoNiSabDNAMAAeA8awABIvMAAVQEAAMAAQCU9HMAASNsWwABIzS6smsAAoNnAAGLQAQABGsAASPPAAJCPAMAArRcGwACgi4HHwABJF8AASSjAAEuVAADAAFGyARrAAEkYwADuSwAAAQPAAEk4wABLlQAAAAEBAcAASUEAAACAsGCSMgAAXAE+Ak7AAElawABJYQAAkltgsL8BHMAASXYWwABJay6rAsAAoNfAAE3pAwACFsAASYUupQzAAKDYgMAASZTATlR5AZnLKsAAeA5JwABJriEcwABJuYHAAEmywE5UjEEBAAErAMAA9dI+AUnAAEnKFsAASdWBwABJzsBOVIyqVrDHPgE9HMAASfkWwABJ6y6smsAAoNmscAEAAR7AAEoPwABdfwEAASbAAEomAYHAAEomwE5UjGCw1AAAwABAJT4BPRzAAEpVFsAASkcurJrAAKDZrHABAAEewABKa8AAXXwBAAGBwABKfsBOVIwAAMAAQCU+Aj0cwABKsRbAAEqjLqyawACg2axwAQABHsAASsfAAF17AgACHMAASvMWwABK6C6rAsAAoNfAAEOOAQABFsAASxYWwABLCC6lDMAAoNiSabDNAMAAeA8awABLP8AAVQEAAMAAQCU9HMAAS14WwABLUC6smsAAoNnAAGLQAQABGsAAS3bAAJCPAMAArRcGwACgjIHHwABLmsAAS6vAAE4bAADAAFGzARrAAEubwADuSwAAAQPAAEu7wABOGwAAAAEBAcAAS8QAAACAsGCSMgAAXAE+Ak7AAEvdwABL5AAAkltgsL8BHMAAS/kWwABL7i6rAsAAoNfAAE3pAwACFsAATAgupQzAAKDYgMAATBfATlY7AZnLKcAAeA5JwABMMCEcwABMO4HAAEw0wE5WTkEBAAErAMAA9dI+AUnAAExMFsAATFeBwABMUMBOVk6EQrDGPgE9HMAATHgWwABMai6smsAAoNmscAEAAR7AAEyOwABdfQEAASbAAEymAYHAAEymwE5WTmCw0QAAwABAJT4BPRzAAEzVFsAATMcurJrAAKDZrHABAAEewABM68AAXX4BAAEmwABNBAGBwABNBMBOVk5gsNQAAMAAQCU+Aj0cwABNNxbAAE0pLqyawACg2axwAQABHsAATU3AAF17AgACHMAATXkWwABNbi6rAsAAoNfAAEOOAQABFsAATZwWwABNji6lDMAAoNiSabDNAMAAeA8awABNxcAAVQEAAMAAQCU9HMAATeQWwABN1i6smsAAoNnAAGLQAQABGsAATfzAAJCPAMAArRcGwACgjYHHwABOIMAATjHAAFIRAADAAFGqARrAAE4hwADuSwAAAQPAAE5QwABSEQAAAAQEBMAATm8AAACqy2CSJwDAAE6IAAAApLdgwAD0eQDAAE6wAAAApLhdwAD1HQFgwAD2XQDAAE7YAAAAkkRdwAD1HQFgklkAAFwBPgROwABO+8AATwkAAKwlYMAAVP0BHsAATw/AAFUSAwADHMAATzqBwABPJsBOWBNdAQABFsAAT0uCwABPPMBOWCJawAD1TADAAPWegsAAT1vATlgiFsAA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AgACHMAARKkWwABEni6rAsAAoNeaywEAAYDAAESzwE6etQDAAHgIHMAARMcWwABEvC6rAsAAoNfAAE1dAQABgcAARNHATp7CAMAAeBYAAMAAQCUGwACg+oHHwABE48AARPTAAEW8AADAAFGRARrAAETkwADuSwAAAQPAAEUFwABFvAAAAAICAsAARRAAAACSW2CNEwDAAEUtAAAAlFdgjHUAAFwBPgE9HMAARUkWwABFOy6smsAAoNmscAEAAR7AAEVfwABdeQIAAhzAAEWHFsAARXwuqwLAAKDXmssBAAGAwABFkcBOn3wAwAB4CBzAAEWlFsAARZouqwLAAKDXwABNXQEAAYHAAEWvwE6fiQDAAHgWAADAAEAlBsAAoPuBx8AARcHAAEXSwABJEgAAwABRsQEawABFwsAA7ksAAAEDwABF6cAASRIAAAAEBATAAEXyAAAAgLBgkjIAwABF/AAAAKS3YMAA9HkAwABGJAAAAKS4XcAA9R0BYMAA9l0AwABGRgAAAJJEXcAA9R0BYJJZAABcAT4DTsAARmrAAEZxAACTMWCw1AEmwABGagEcwABGhhbAAEZ7LqsCwACg18AATekDAAIWwABGlS6lDMAAoNiAwABGpMBOoEMBmcsqwAB4DmCw1E7AAEbNwABG3wAAwABi1F3AAPUdAWDAAFg2ARzAAEbhLsAAYs/AAKBeAQABg8AARvPATqB0AMAAoN9JwABHByEcwABHEoTAAEcLwE6gjUEBAAErAMAA9dI+AT0cwABHMRbAAEcjLqyawACg2axwAQABHsAAR0fAAF17AwADhMAAR2jATqCNHsAAR37AAFUSAwADHMAAR6CBwABHjMBOoFBdAQABFsAAR7GCwABHosBOoF9awAD1TADAAPWegsAAR8fATqBfFsAAR+WDwABH18BOoHRawAD1TACFwABH+MBOoNwAAMAAQCU+Aj0cwABILhbAAEggLqyawACg2axwAQABHsAASETAAF17AgACHMAASHAWwABIZS6rAsAAoNfAAEOOAQABFsAASJMWwABIhS6lDMAAoNiSabDNAMAAeA8awABIvMAAVQEAAMAAQCU9HMAASNsWwABIzS6smsAAoNnAAGLQAQABGsAASPPAAJCPAMAArRcGwACg/IHHwABJF8AASSjAAEuVAADAAFGyARrAAEkYwADuSwAAAQPAAEk4wABLlQAAAAEBAcAASUEAAACAsGCSMgAAXAE+Ak7AAElawABJYQAAkltgsL8BHMAASXYWwABJay6rAsAAoNfAAE3pAwACFsAASYUupQzAAKDYgMAASZTATqKFAZnLKsAAeA5JwABJriEcwABJuYHAAEmywE6imEEBAAErAMAA9dI+AUnAAEnKFsAASdWBwABJzsBOopiqVrDHPgE9HMAASfkWwABJ6y6smsAAoNmscAEAAR7AAEoPwABdfwEAASbAAEomAYHAAEomwE6imGCw1AAAwABAJT4BPRzAAEpVFsAASkcurJrAAKDZrHABAAEewABKa8AAXXwBAAGBwABKfsBOopgAAMAAQCU+Aj0cwABKsRbAAEqjLqyawACg2axwAQABHsAASsfAAF17AgACHMAASvMWwABK6C6rAsAAoNfAAEOOAQABFsAASxYWwABLCC6lDMAAoNiSabDNAMAAeA8awABLP8AAVQEAAMAAQCU9HMAAS14WwABLUC6smsAAoNnAAGLQAQABGsAAS3bAAJCPAMAArRcGwACg/YHHwABLmsAAS6vAAE4bAADAAFGzARrAAEubwADuSwAAAQPAAEu7wABOGwAAAAEBAcAAS8QAAACAsGCSMgAAXAE+Ak7AAEvdwABL5AAAkltgsL8BHMAAS/kWwABL7i6rAsAAoNfAAE3pAwACFsAATAgupQzAAKDYgMAATBfATqRHAZnLKcAAeA5JwABMMCEcwABMO4HAAEw0wE6kWkEBAAErAMAA9dI+AUnAAExMFsAATFeBwABMUMBOpFqEQrDGPgE9HMAATHgWwABMai6smsAAoNmscAEAAR7AAEyOwABdfQEAASbAAEymAYHAAEymwE6kWmCw0QAAwABAJT4BPRzAAEzVFsAATMcurJrAAKDZrHABAAEewABM68AAXX4BAAEmwABNBAGBwABNBMBOpFpgsNQAAMAAQCU+Aj0cwABNNxbAAE0pLqyawACg2axwAQABHsAATU3AAF17AgACHMAATXkWwABNbi6rAsAAoNfAAEOOAQABFsAATZwWwABNji6lDMAAoNiSabDNAMAAeA8awABNxcAAVQEAAMAAQCU9HMAATeQWwABN1i6smsAAoNnAAGLQAQABGsAATfzAAJCPAMAArRcGwACg/oHHwABOIMAATjHAAFIRAADAAFGqARrAAE4h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oY2BycAAQWvAAEGCwABB5wAAt0MBGsAAQWzAAO5LAAABA8AAQZDAAEHnAAAAAQEBwABBlwAAAI8xYJsAAABgjmMBPgFKwABBpAE1wABBrwAAAQBgkHQBH8AAQa+QfAAAAAA1AAAAAQBbARfAAEHBgcAAQb/ATwi3lBMewABBzsAAg2UBAAGAwABB3cBPCJwAjByBAMBPCLcGwAChjoHJwABB7MAAQgPAAEKPAACqWwEawABB7cAA7ksAAAEDwABCEsAAQo8AAAACAgLAAEIZAAAAwABU22CbAADAAEIyAAAAkkdgjmMAAGCOYwE+AUrAAEJEATXAAEJPAAABAGCQhgEfwABCT5CQAQABgcAAQlXATwlGADUAAAABAFsBF8AAQmKCwABCYMBPCWGUEx7AAEJvwACDZQEAAYDAAEJ+wE8JNwCMHIIAwE8JYQbAAKGPgcnAAEKUwABCpcAAQsQAALb8ARrAAEKVwADuSwAAAQPAAEKswABCxAAAAAEBAcAAQrQAAACdM2DAAPXFAABgwADyswFKwABCugElwABCvIDAAEK6wE8J6mCQhgbAAKGQgcnAAELJwABC38AARFQAALhMARrAAELKwADuSwAAAQPAAELrwABEVAAAAAUFBcAAQvIAAAC4R2CbAADAAEMIAAAAkkxgkRMAwABDIAAAAMAAVNxdwAD1HQFgkdgAwABDNAAAALhIYJsAAMAAQ04AAACxwmCREwAAYJETAT4ETsAAQ2zAAENzAACBEGCREwGBwABDdcBPCldJwABDfyEcwABDkILAAEODwE8KZEEBAAErAMAA9dI+AT2NwABDocBPCpsfwABDrqlNAgAChcAAQ7/ATwqbgsAAQ8fATwpkAD9JwABD4CEcwABD8YTAAEPkwE8KhkEBAAErAMAA9dI+AT2NwABEAsBPCpsfwABED6lSAgAChcAARCLATwqbhMAARCrATwqGAD9KwABEQwGFwABESsBPCpsGwAChkYHJwABEWcAARHvAAEUFAAC3owEawABEWsAA7ksAAAEDwABEj8AARQUAAAACAgLAAESxAAAAwABHTV3AAPUdAWCSAgDAAETDAAAAgKBgwAD23gAAYMAAobMBPgFKwABEzgEfwABE2cAAob0CAAKAwABE78BPC4aBwABE/cBPC5sABsAAoZKBycAARQrAAEUwwABFvQAAt7EBGsAARQvAAO5LAAABA8AARVfAAEW9AAAAAQEBwABFdQAACLejYMAAobMAAF3AAPUdAWCSAgE+AUrAAEWRARbAAEWtgMAARZjATwwLwABHTcAAobUGwAChk4HJwABFwsAARdjAAEeIAAC2yQEawABFw8AA7ksAAAEDwABF5cAAR4gAAAABAQHAAEXwAAAAklBgkRMAAGCREwE+AUnAAEYBJcAARg+AwABGBcBPDHZgwAChsz4BSsAARjEBNcAARjwAAAEAYKeBAR/AAEY8p4cBAAEewABGWcAA9SMCAWCREwEWwABGeBTAAEZuwE8MdgABYMAAobPAAEdNwAChtQGTDykANQAAAAEAWwEXwABGoYHAAEafwE8Mq5QTFsAARrgUwABGrsBPDHYAAWDAAKGzlBOMHIwcgQDATwyrScAARs8lwABG3YDAAEbTwE8MdmCSAj4BSsAARv0BNcAARwgAAAEAYKeBAR/AAEcIp4cBAAExwABHIWCREwEUwABHIsBPDHYAAWCSAgA1AAAAAQBbARfAAEc4gcAARzbATw1KlBMWwABHTxTAAEdFwE8MdgABYJIClBOMHIwcgQDATw1KPgFKwABHbgGAwABHdcBPDHYGwAChlIHJwABHjcAAR6PAAEhTAAC4ugEawABHjsAA7ksAAAEDwABHscAASFMAAAADAwPAAEe/AAAAuJhgmwAAwABH2AAAAJVPYI5jAMAAR+0AAACSTGCREwAAYJETAT4BSsAAR/kBNcAASAQAAAEAYKmqAR/AAEgEqbACAAKBwABIEsBPDgCCwABIHcBPDg0ANQAAAAEAWwEXwABIK4PAAEgpwE8OKJQTFsAASEWAwABIOMBPDfOEF5sJjByDAMBPDigGwAChlYHJwABIWMAASG7AAEk1AAC4xgEawABIWcAA7ksAAAEDwABIfMAASTUAAAAEBATAAEiKAAAAwABU3WCbAADAAEieAAAAwABU3mCbAADAAEivAAAAkkdgjmMAwABIwQAAALeAYJsAAABgkRMBPgFKwABI0gE1wABI3QAAAQBgqbEBH8AASN2ptwIAAiEcwABI8IHAAEjrwE8OxUEBAAErAMAA9dKCwABI+cBPDtQANQAAAAEAWwEXwABJDYTAAEkLwE8O/JQTFsAASSeAwABJGsBPDraEF5sJjByEAMBPDvwGwAChloHJwABJOsAA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eHAAwACBwQFcBsAAom2By8AAQfPAAEIEwABCfwAAt2sBGsAAQfTAAO5LAAABA8AAQhTAAEJ/AAAAAgICwABCGQAAALdsYMAA9HkAwABCMwAAAJvNYJsAAABcAT4BPTUAAAABAGDAAIDPARbAAEJDLqPXwACh4CMcwABCTYIAwE95S0EBAAErAAArHMAAQk2CAMBPeUu3awIAAoDAAEJewE95KIHAAEJywE95NwDAAIFYAVwGwACiboHLwABChMAAQpXAAEMMAAC38gEawABChcAA7ksAAAEDwABCpcAAQwwAAAACAgLAAEKsAAAAt/NgmwAAwABCuwAAALf0YMAA9HkAAFwBPgE9NQAAAAEAYMAAgM8BFsAAQtIuo9fAAKHgIxzAAELcggDAT3n1QQEAASsAACscwABC3IIAwE959bfyAgACgMAAQu3AT3nSgcAAQvjAT3nfAMAAgXoBXAbAAKJvgcvAAEMRwABDIsAAQ00AALbtARrAAEMSwADuSwAAAQPAAEMrwABDTQAAAAAAAABcAT4BPTUAAAABAGDAAIDPARbAAEM0LqPXwACh4CMcwABDPoAAwE96g0EBAAErAAArHMAAQz6AAMBPeoO27QAAAADAAIFcAVwGwACicIHLwABDUsAAQ2PAAEPwAAC21QEawABDU8AA7ksAAAEDwABDbsAAQ/AAAAADAwPAAEN1AAAAp1hgmwAAwABDhwAAALbWYJsAAMAAQ58AAACbzWCbAAAAXAE+AT01AAAAAQBgwACAzwEWwABDry6j18AAoeAjHMAAQ7mDAMBPeyZBAQABKwAAKxzAAEO5gwDAT3smttUDAAOAwABDxcBPeviBwABD0cBPewWCwABD48BPexIAwACBYgFcBsAAonGBy8AAQ/XAAEQGwABESwAAtt8BGsAAQ/bAAO5LAAABA8AARBXAAERLAAAAAQEBwABEGgAAAIDQYMAA9HkAAFwBPgE9NQAAAAEAYMAAgM8BFsAARCcuo9fAAKHgIxzAAEQxgQDAT3vMQQEAASsAACscwABEMYEAwE97zLbfAQABgMAAREHAT3u2AMAAgWABXAbAAKJygcvAAERQwABEYcAARP8AALonARrAAERRwADuSwAAAQPAAERqwABE/wAAAAQEBMAARHgAAAC57WCbAADAAESIAAAAp1hgmwAAwABEmgAAALooYJsA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oAAAAJVMWwCrpwAAAID7WwAAYMAApj8BPwEJAKuvwACmMQMAAyartQGAq7XAUW+eYMAApcYmq7sBgau7wFFvp2DAAKXGgqvCwFFvsAAIBsAApkGB16vMq+asWgMAQQEaq83AAO5LAAABA6vorFoAAAABAQGr6QAAAIObWwAAYMAA8rMBPgJJq/YhJawAgKv6wFFwHGDAAKY/SqwTASo/SqwlASIcrDEWrCwulUvAAKYuQQEAARasOoCsNMBRcByVSwAAwAD10gAcrEgWrEIulUzAAKYvQQEAARasUYCsS8BRcByVTAAAwAD10gbAAKZHgdesX6xzrLMBAIOJARqsYMAA7ksAAAEDrHysswAAAAAAAABgwAD0eQFKrH8BMKx/H6yJwAD0CwEAASfAAGQjAAbAAKZCgdesuKzTrOYDAIFWARqsucAA7ksAAAEDrNSs5gAAAAAAAABgwAClxgFKrNoBHKzgFqzaLpVMwACmL4FBAQABFqziLpVLwACmLgDAAKXLBsAApkOB16zrrQauygMAXQEarOzAAO5LAAABA60HrsoAAAABAQGtDgAAAIObYMAApcYAAGDAAKXGAT4GSa0bFq0lgK0fwFFxUaS9wACl00qtLQEuP06tRK1KAACAimDAAKXGARytURatTC6VS8AApi5dAQABgK1TwFFxUQDAAKXKSa1eIiEcrWiBrWLAUXGBQQEAASCtccAAphcAAAAAAMAA9dIAISWtiYGtg8BRcYFgwACmLD4BSq2rARytuIGtssBRcYGBQQEAARatui6VTMAApi8AwAClyz89ia4kwFFxgRyuMoCuLMBRcVGBQQEAARauNC6VTMAApi8AwACly0muPyIhHK5Jga5DwFFxgUEBAAEgrlLAAKYXAAAAAADAAPXSACElrmqBrmTAUXGBYMAApiw+AUqujAEcrpgWrpMulUvAAKYuXQEAAYGumsBRcYEAwAClyj9KrqsBIK64wACmFwAAAAAGwACmRIHXrs+u6rCuAwCBQQEartDAAO5LAAABA67rsK4AAAABAQGu8gAAAIObYMAApcYAAGDAAKXGAT4GSa7/Fq8JgK8DwFFyuaS9wACl00qvEQEuP06vKK8uAACAimDAAKXGARyvNRavMC6VS8AApi6BQQEAAYCvN8BRcrkAwACly0mvQiIhHK9Mga9GwFFy6UEBAAEgr1XA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8rMBPgFKwABEXgEcwABEfBzAAERrFsAARGUulgXAAKZfm3cBAAEWwABEdYDAAERvwFGIMZYEwACmXgDAAKXOQQEAARbAAER/LpYFwACmXwDAAPXSBsAApmyB18AARI3AAESbwABE2wMAgUgAAAABA8AARJ3AAETbAAAAAQEBwABEpAAAAIObYMAAplwAAGDAAPKzAT4BSsAARLEBHMAARM8cwABEvhbAAES4LpYEwACmXsAARoEBAAEWwABEyIDAAETCwFGIwpYFwACmXwDAAKXPQQEAARbAAETSLpYEwACmXgDAAPXSBsAApnCB18AARODAAETpwABFBwEApMQAAAABA8AARPTAAEUHAAAAAAAAAGDAAPKzAUrAAET3ARbAAET9FsAARPculgXAAKZfpMTAAKXRBsAApnGB18AARQvAAEUUwABFMgEAvu4AAAABA8AARR/AAEUyAAAAAAAAAGDAAPKzAUrAAEUiARbAAEUoFsAARSIulgTAAKZevu7AAKXSBsAApnKB18AARTbAAEU/wABFXgEAwABkJwAAAAEDwABFTcAARV4AAAAAAAAAYMAA8rMBSsAARVABHMAARVYWwABFUC6WBMAApl5BAQABFsAARVkulgXAAKZfAMAA9dIGwACmbYHXwABFY8AARXbAAEWWAAAjARrAAEVkwADuSwAAAQPAAEV+wABFlgAAAAAAAABgwAD2XQFKwABFhAEkwABFlgUnmQkWwABFhy6WBMAApl4ng/IWwABFjy6WBcAApl8nmQoAAFF90ABRfnMAUYBkAFGBAgBRgaMAUYIXAFGFZgBRhisAUYaCAFGHQwBRiAcAUYiYAFGJKwBRiXkAUYnHAFGKJgBRiowAAAAQAsAApneB18AARobAAEaMwACRjwPAAGQpAAABYLisAAFgwACFYwYEwACmeYHXwABHvsAAR+AJwABkKgBdwAD1HQFgva0BMcAAR95gva0ABMAApnqB18AASGzAAEiTCcAAWL4AXcAA9U4CYLlkYMAAplwBHsAASHnAAPVVAAJguWRgwACmXAAABMAApnuB18AASKvAAEi2CZ/hAGDAAEB5AATAAKZ8gdfAAEjPwABI0wmA+wBgwACltgAEwACmfYHXwABI7sAASPcJvgUAYMAAhWoABMAApn6B18AASQPAAEkIGJ7VAGC4iAErAQXAAKacgdfAAEkNwABJDcAASZgAAAADwABJIsAASZgAAAACAgLAAEkwAAAAn+FgwABAeQDAAElCAAAEvgVgwACFagAAYMAApncBPwQIAcAApn2BAMBRi/QIAMAApnwfwABJYMAApcUAAAAACADAAKZ7gMAASY3AUYvlCQHAAEkNuQ8AAAAAGgbAAKaAgdfAAEbYwABG78AARxABAICwARrAAEbZwADuSwAAAQPAAEb0wABHEAAAAAAAAABgwAD2XQFKwABG9wEnwABkKwbAAKaCgdfAAEmdwABJrsAASyoAALB+ARrAAEmewADuSwAAAQPAAEm4wABLKgAAAAEBAcAAScAAAACe1WC4iAAAXAE+BD0XwABJ0i6e1YDAAEnawFGMv8AApn49HMAASeUusFEBAAGAwABJ+MBRjL8AuHM9HMAASrEuwABkLAAAAADAAKaDPRfAAEsXFsAASw0uvgXAAKZ9wABYvhbAAEsgLsAAWL7AAKZ6wACFbgbAAKaDgdfAAEsvwABLNMAATAMAAMAAZCwAAAABA8AAS0nAAEwDAAAAAAAAAFwBPgE9HMAAS14WwABLUi7AAGQqwACmeYO8AQABNMAAS2YDwABLZsAAS/4AAAABAQHAAEt4AAAAsFtgva0AAGDAAPWCAT4CPRzAAEufFsAAS5mAwABLjcBRjZiZbrlsr1ECAAKAwABLp8BRjZgcwABLxhbAAEvAgMAAS7TAUY2YgeW5akQBAAGTAMAA9SwAuVY9HMAAS+QWwABL3oDAAEvSwFGNmJluuWyT4AEAAYDAAEvrwFGNmAC5UwDAAPTrBsAApoSB18AATAjAAEwZwABNmQAAsFMBGsAATAnAAO5LAAABA8AATCjAAE2ZAAAAAQEBwABMNQAAAJluYLktAABcAT4DT8AATELAAExHAAABnxphAWC5ZFwAA8AATEzAAE1SAAAAAQEBwABMWgAAALBbYLlkAABcAT4CTsAATHXAAEx7AADAAGOsYMAAplwBJsAATHUBHMAATImCwABMfcBRjo+UDgEAAS4Auc1gwACmXEnAAEydFsAATO4cwABMuILAAEyhwFGOj6zfAQABFsAATM4WwABMwi6f4cAApnuphsAAQIIAubarpLHPPgJAIRzAAE0Xg8AATRHAUY6iQQEAASsAwACmaMAATRHAAE0eAD0cwABNLxbAAE0pLsAAWL7AAKZ6gLICAAKCwABNMMBRjo+DwABNP8BRjqIAwAD1Yz89HMAATV+AwABNWcBRjlmwyAEAAYHAAE1qwFGOcAC5XD0cwABNfIDAAE12wFGOWbDKAQABgcAATY/AUY5wALldBsAApoWB18AATZ7AAE2wwABPzQAAsFkBGsAATZ/AAO5LAAABA8AATcDAAE/NAAAAAQEBwABNzgAAALBbYLlkAABgwACmXAE+AUnAAE3hFsAATjYcwABN+oDAAE3lwFGP3KziAQABFsAAThgWwABODC6f4cAApnuphsAAQIIAubmrpLHPPgFKwABOUAEcwABOXBbAAE5XLoD7wACmfMAAZA0CAAIWwABOfxbAAE56LoD7wACmfMAAZATAAKW4HMAATo0WwABOiC6A+8AApnzAAGQIAQABgMAATp7AUY/cAMAApb0AwAClwknAAE64FsAATwUcwABO0YDAAE68wFGP3KzfAQABFsAATucWwABO2y6f4cAApnuphsAAQIIAubarpLHPPgJOwABPMMAATzYAAICKYMAAphgBJsAATzABHMAATz0WwABPOC6A+8AApnzAAGQHAQABgMAAT1HAUY/cAMAApbxgwACmGErAAE9lARzAAE9xFsAAT2wugPvAAKZ8wABkDQIAAoHAAE+EwFGQz4HAAE+LwFGQzwDAAKXCPgFKwABPpgEcwABPshbAAE+tLoD7wACmfMAAZAwAAAAAwAClwQbAAKaGgdfAAE/SwABP5MAAU40AALA4ARrAAE/TwADuSwAAAQPAAE/swABTjQAAAAEBAcAAT/IAAACws2C8agAAYMAAplwBPgZJwABP/RbAAFAwHMAAUAWAwABQAcBRkZ+s3wEAARbAAFAbFsAAUA8un+HAAKZ7qYbAAECCALm2rK2x0krAAFBKARzAAFBWFsAAUFEugPvAAKZ8wABkDAAAAADAAKXBP0nAAFGCHMAAUZEWwABRioDAAFGGwFGRn4HluWqBZQEAATTAAFGVA8AAUZXAAFHjAAAAAQEBwABRlgAAAFtguWQAAGDAAPKzAUrAAFGkARbAAFHRHMAAUaaBwABRpMBRkkms3wEAARbAAFG8FsAAUbAun+HAAKZ7qYbAAECCALm2rK2x0gDAAPTwPgFKwABR7gEcwABR+hbAAFH1LoD7wACmfMAAZAwAAAAAwAClwT9JwABSFxzAAFIlFsAA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AQABSsAAStQBHMAASwEcwABK1C6BJwEAATTAAEraA8AAStrAAEr/AAAAAQEBwABK2wAAAJMNXwEAAABgwADyswFKwABK5wEhHMAASu6AwABK6MBTRqOC0AEAAYHAAEr3wFNG7QDAAPYaAMAAqV+R4gAAAADAAPTyBsAAqhqB6sAATIbAAEyNwABMzQAAk+cAAAABA8AATJnAAEzNAAAAAQEBwABMpgAAAIObXcAA9g4BYMAA9cUAAF3AAPYOAV8BAAFKwABMsAEcwABMxhzAAEywLoEnAQABFsAATLyAwABMtsBTR2KC0MAA9hoAwACpX5HiAAAAAMAA9PIGwACqG4HqwABM0sAATNTAAE1rAACT3wAAAAEDwABM2sAATWsAAAABAQHAAEziAAAAkw1gwAD1xQAAXwEAAT4DScAATPEiIRzAAEz9gMAATPXAU0flQQEAASsAwAD10gAhJcAATRCAwABNCMBTR+VfAQBKwABNFwErP07AAE0swABNMAAAg5ZfAAABHMAATTIuwABlMcAAqToBAAEmwABNRwCAwABNP8BTR+VfAQAAwACqCkrAAE1TARzAAE1iFsAATVouwABlLsAAqTrAAKoJRAEAAYHAAE1jwFNINgDAAPViBsAAqhyB6sAATXDAAE11wABOUAAAk+AAAAABA8AATXvAAE5QAAAAAQEBwABNgwAAAJMNYMAA9cUAAGDAAPKzAT4FScAATZIiIRzAAE2egMAATZbAU0jHQQEAASsAwAD10gAhJcAATbGAwABNqcBTSMdfAQBKwABNuAEqP07AAE3OwABN0gAAg5ZfAAABHMAATdQuwABlMcAAqToBAAEmwABN6QCAwABN4cBTSMdfAQAAwACqCknAAE31IRzAAE4DFsAATfouwABlLsAAqTrAAKoJgd0BAAGBwABOD8BTSRoAwAD1YUrAAE4VASo/PRzAAE4wFsAATicuwABlLsAAqTrAAKoJk+ABAAGBwABON8BTSRoAwAD1a0rAAE5BASkGwACqHYHqwABOVcAATlrAAE6aAACT4QAAAAEDwABOY8AATpoAAAABAQHAAE51AAAAhPldwAD02wFgwAD1xQAAXAFKwABOggEcwABOi4DAAE6CwFNJ5oO8AQABFsAATpMuk+DAAKocAMAA9OsGwACqHoHqwABOn8AATqTAAE9eAACT4gAAAAED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wABK2V3AAPUdAWDAAKvVAKRKAAAElDpdwAD1HQFgwACrvQCkXQAABMAAZa9dwAD1HQFgwACrvQCkgwAABMAAXy1dwAD1HQFgwACr9gCkmQAABMAAZbddwAD1HQFgwACr9gCktwAABMAAZbZdwAD1HQFgwACr9gCk0gAABLLLXcAA9R0BYMAAq/YApOcAAATAAF93YMAAipcAB6UGAAAEwABeVGDAAPKzASulHgAABMAAZbhgwADyswErpTUAAASzFWDAAPKzASulWAAABJXdYMAA8rMBK6VtAAAEwABluWDAAPKzASuljAAABMAAZbpgwADyswEqpa8AAASqkGDAAPKzAStgwACrjwE+BEAhHKXhFqXWLsAAZbjAAKufQQEAASsAwAD10qXWpegAQCEcpg0WpfYusxXAAKugQQEAASsAwAD10qX2phQAQCEcpisWpiIuld3AAKuhQQEAASsAwAD10qYipjIAQCEcplMWpkAuwABlucAAq6JBAQABKwDAAPXSpkCmWgATCAHAAKuRgADAU7OQCAHAAKuSgQDAU7ObCAHAAKuTggDAU7OoCAHAAKuXgwDAU7O3CAHAAKuYhADAU7PMCAHAAKudhQDAU7PfCAHAAKubhgDAU7P0CAHAAKuchwDAU7QJCAHAAKuaFADAU7QeCAAIAcAAq5kUAMBTtDMJAAgBwACrpRQAwFO0RgoACAHAAKueFADAU7RWCwAIAcAAq58UAMBTtGYMAAgBwACroBQAwFO0dg0ACAHAAKuhFADAU7SEDgAIAcAAq6IUAMBTtJIPAAgBwACroxQAwFO0ohAACAHAAKukFADAU7SyEQAJAaPswAD12wAAAAAIBsAAq6uB76Zkpm2mjgEAwABfLgAAAAEDpoamjgAAAAAAAABgwADyswFKpokBKgbAAKusge+mk6adprYBAJSYAAAAAQOmqKa2AAAAAAAAAGDAAKuPAUqmqwEWpqsuwABltMAAqyrAAKuVBsAAq7GB76a7psCnAgAAwABluwAAAAEDps2nAgAAAAEBAabUAAAAlJhgwACrjwAAXAE+AT0XpuYuwABltMAAqyqApvTAU7bJwACrlQbAAKutge+nB6cRpyoBALsDAAAAAQOnHKcqAAAAAAAAAGDAAKuPAUqnHwEWpx8uwABltcAAqyrAAKuWBsAAq7KB76cvpzSndgAAwABl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vAEAARaaqxaaoS7AAFfrwACsF8AArDbAAGX1wACsyADAAPTrPRya3xaazhaaxC68ncAArD/AAGX2wACseYO8AQABFprxFprnLsAAV+vAAKwXwACsNsAAZffAAKzJAMAA9W09HJsjFpsRFpsHLrydwACsP8AAZfjAAKx7g7wBAAEWmzUWmysuwABX68AArBfAAKw2wABl+cAArMoAwAD1bT0cm2kWm1UWm0suvJ3AAKw/wABl+sAArHqDvAEAARabcS7AAGX7wACsF8AArGEAwAD1bT0cm7MWm5QWm4ouvJ3AAKw/wABl/MAArHyDvAEAARabxRabuy7AAFfrwACsF8AArDbAAGX5wACsygDAAPVtPRycDS7AAGX9wACsFwAAAADAAKxiPRydJRadCxadAS68ncAArD/AAGX2wACseYO8AQABNJ0tA50tnYIAAAACAgKdOQAAAICoYK8tAJ1OAAAAlDhdwAD1HQFgsK0AAGDAAPWCAT4BPRydZ4KdX8BT28WDvAEAARadby7AAGX+wACsF8AArFMAwAD06wDAAPVtPRyd4xad2i6adcAArBfAAKw6g7wBAAE0nesDneuhIAAAAAICAp34AAAAmTxgsK0AngMAAACA12DAAKuPAABgwAD1ggE+A06eGp4lAACUmGCwrQEcnjsWnicustPAAKwXwACsH6pzAQABgZ5JwFPcLgCvAkmeVSEcnmSDnlnAU9xQQQEAASsAwAD10j4CPRyeeYKed8BT3DnAAGW7AQABHJ6PFp6HLpp1wACsF8AArDpEAQABg56QwFPcUADAAPViAMAAq7FAIRyexxaevIKeusBT3DmUmMAAq6xBAQABKwDAAPXSnrqezgEentyr3wIAAoGe9sBT3C4kAAUnwABl/4OfTsBT3FAnnryCn17AU9w5J4ExAD9Jn3MiFp95gp93wFPcOcAAXy7AAKurARafl4KflcBT3DmqkMAAq6Q+A06fxp/aAADAAGYAYLCtARyf/Baf6C6y08AArBfAAKwfqpEBAAGBoBPAU9wuAK8kPRygI4KgIcBT3DnAAGW8AQABHKA5FqAxLpp1wACsF8AArDpEAQABhKA6wFPdSQDAAPViAMAAq7JAIRygehagb4KgbcBT3Dm7A8AAq61BAQABKwDAAPXSoG2ggQEeoI+r3wIAAoGgqcBT3C4kAAUnwABmAYSg3sBT3UknwABQT4GhCsBT3C4ngTEAPwDAAPVtTqE0oUIAAMAAROtdwAD1HQFgwACrjwEcobUcoXIWoU4WoUQuvJ3AAKw/wABFAsAArH+AnwEBYMAAq48BNKF2A6F2oaoAAAABAQGhgwAAAKoCYLCtAABgwACrjwFKoZQBHKGcFqGULpp1wACsF8AArDpEAQABgaGdwFPeUQDAAPViAMAA9OaAoQAAAADAAPTxTqHVofkAAMAAXxZdwAD2DgFgsK0BHKINFqIDLrydwACsP8AAZgIAAAAAwACsgT0XokAuwABl8MAArBccom0Wol8WolkuwABXoMAArBfAAKwwr6HAAJWmwABfFQMAA4Gii8BT3giCoprAU96YFqK/LsAAX5DAAKwXwACsOADAAJZywACsPT0cotguwABmA8AArBcBAAEWovUWousuwABX68AArBfAAKw2wABmBMAArMAAwACsUE6jGqMnAADAAGWdYMAAq1YBHKMpLsAAZgXAAKwXAQABFqNGFqM8LsAAV+vAAKwXwACsNsAAZgTAAKzAAMAArEdOo3CjggAAwABlnF3AAPTbAWDAAKtKARyjqxajlhajjC7AAFfrwACsF8AArDbAAGYGwACsw4CfAQFgwACrSgEWo68uwABmB8AArBfAAKxJAMAA9OZOo9yj5gAAwABKzl3AAPUdAWDAAKtKAR6j7MAA7oIBAWDAAKtKARakBRaj+y7AAFfrwACsF8AArDbAAGYIwACsxAA9HKQmhaQdwFPf4YCyAgACk4OkLMBT300AwAD1LT0cpEiFpD7AU9/hvIsCAAKUhKRSwFPfjQDAAPU5PRykay7AAGYJwACsFwAAAADAAKxDTqSSpJoAAMAAZZJdwAD1HQFgwACrQAEcpK4WpKYWpJwuwABX68AArBfAAKw2wABlksAArMKAoQEAAAGTDyrAAPTxTqTRpOQAAMAAZZRgwADyswEWpQUWpO4urwnAAKwXwACsI8AARNLAAGVlQCIhh6UwwFPgtAEWpVSBpUbAU94Ig2jAAPUApS+lXgBOpX6liQAAwABlmF3AAPUdAWDAAF9zATGli2DAAF9zARalkhaljC7AAFegwACsF8AArDCdLcAAlaFJpaolpbUWpa4urvnAAKwXwACsL2DAAF9zPgJOpdel5wAAwABmCmDAAGuZARal6S6u+cAArBfAAKwvPRymAhSl98BT4P4IAE8BAAEmphYAFKYGwFPhUgkAYMAAX3MAwAD1Lj9KpjgBH6ZDwACrPwkABoWmS8BT3+GGplbAU+ByHKZfLsAAZgvAAKwXAAAAAMAArEUcpnguwABmDMAArBcAAAAAwACsRhamnBamli7AAFegwACsF8AArDCdLcAAlaEUpq/AU+D+CAADwABllIem18BT4LTAAGWTFqcZFqcPLrydwACsP8AAZZPAAKx+wABllSEcp2YWp1UuwABl8cAArBfAAKw+QQEAASsAwAD10gbAAKxDgfCnd6d8p7gAAMAAZgnAAKwXAAAAAQOnjae4AAAAAAAAAFwBPgE9HKeWLsAAZg3AAKwXAAAAAMAArFwGwACsRIHwp72nwrG4AADAAGX0wACsFwAAAAEDp9yxuAAAAAAAAABcAT4CTqfpp/4AAMAAZg5gwAD2XQEWqAkWqAAurFXAAKwXwACsHYJFgT9JqCohHKhDgKguwFPiskEBAAErAMAA9mw+Ck6pLKk2AADAAGYPXcAA9g4BYMAA9l0BHKnBMak4YMAA9l0EJ52UJ52RJ8AAZhAnnZOR4gAAAADAAPTyTqo9qkIAAIFNYMAA5z0BHqpIwADnPwEAAYCqTcBT4rIASasOIRyrGIKrE8BT4y2DUgAAAADAAOh9PgI9HKs6FqswLp+ywACsF8AArB6TVwEAASSrcgInwABmEYCrXcBT4rIAq8RKq30AP0mrkxyrqRyrnIKrl8BT4y2DVAAAAADAAOdKQQEAAZMAwAD1nD4CPRyrwxaruS6fssAArBfAAKwek1cBAAEnwABmEgCrxEqsBQA/TqwjrCgAABJgwAD2XQEcrEkerC7AAOc/AQABgKwzwFPisgDAAGYTAAAAAMAA51pOrG+shAAAwABmFF3AAPYOAWDAAPZdASasbwEcrJwWrJcerIbAAL8mAQABg6yRwFPj4QCB3ACR4gAAAAAAXcAA9g4BYMAA9l1OrLyszQAAwABmFV3AAPYOAWCwrQEerNPAALsfAAFgsK0AAE+tKK0tAAABwABDx2EBYLCtXAADrTSuogAAAAEBAa1BAAAAkw1gsK0AAFwBPgQ9HK1lha1UwFPkWE8BAAGHrWnAU+SYAMAA9htJrXscrZMWrX8ustPAAKwXwACsH5SbAQABh62mwFPkmACvCD4BPRytw4atvMBT5H0gAQABHK3YFq3ELrLTwACsF8AArB+qkQEAAYet78BT5JgAryQAAD9OrhiuIwAAlJhgsK0BHK45Fq4lLrLTwACsF8AArB+qcwEAAYeuR8BT5JgArwJJrlkhHK5oFK5dwFPlGwgAQQEAASsAwAD10j4BPRyuhIaufcBT5H0gAQABFK6FwFPlGwgAAAA/PRyvexavahavYC68ncAArD/AAGX2wACseYO8AQABNK+DA6+DsYIAAAACAgKvhAAAAICoYK8tAK+ZAAAAhPldwAD1HQFgsK0AAGDAAPWCAT4BRq+tr9OvvgAAAJMNYLCtABSvycBT5bUIAD4CTrBWsFoAAIOWYMAA9l0BJLCNAxawbxawZxSwX8BT5dQJAIQJsK+gKrCgJ4KmFrCHFLB/wFPl1AkAgLCwm0mwmSIiHLCyhLCdwFPkEILQAQABFLC7wFPl6woAAMAA9hoBHLDdFrDRLsAAQ2PAAKwXwACsJqpuAQABFLDuwFPl1AkAAMAAU6IBHLESgbEIwFPi8oLQAQABHLE4FrErFrEjFLEbwFPl1AkAhAmwr6AqsKAjAAAAAMAA9wYAwAD2Gj4BPRyxWoaxU8BT5H0gAQABFLFbwFPl1AkAAAA/AMAA9W09F7GLLsAAZfHAAKwXhbGewFPkWMAArD4/BsAArEWB8LHwsgyzawAAwABmC8AArBcAAAABA7IZs2sAAAAAAAAAXcAA9U4CYMAA9l1dwAD1HQFgwACrSgE+A06yPrJGAADAAGWWXcAA9U4CYMAA9l1dwAD1HQFgwACrSgEysmBgwAD2XV3AAPUdAWDAAKtKAD0cspkWsoQWsnUWsmgurTnAAKwXwACsMaiBwABAi6rvr9yDvAEAATSyoQOyobNSAAAAAgICsqkAAADAAE1eYMAA9l0AssIAAACrOV3AAPUdAWCvLQAAYMAA9YIBPgE9HLLegLLXwFPnJICyAgACgbLfwFPnjhyzNByzAIKy6cBT552AnwEBYMAAq0oBNLMEA7MEsycAAAABAQGzEAAAAKqyYK8tAABgwACrSgFKsxkBHLMhFrMZLsAAZe7AAKwXwACsO0QBAAGDsyLAU+fzAMAA9WIAwAD05oChAQAAAZMPKsAA9PEAwAD1YwDAAPVtSrNZAYCzYMBT5yQGwACsRoHws3CzfrUEAADAAGYMwACsFwAAAAEDs5i1BAAAAAAAAABgwACKlwE+Ak6zurPIAADAAGYWYMAAlf8BH7POwACWGAkACRaz8C6sVcAArBfAAKwdFrQCLqtzwACsF8AArCAWtBsuwABXoMAArBfAAKwwFrQqLq8JwACsF8AArCMWtEourvnAAKwXwACsLxa0Wi6vBMAArBfAAKwsFrR7Lq8AwACsF8AArC0WtKMurFjAAKwXwACsIha0ui6tOcAArBfAAKwxAEq0zQEctOKAtNTAU+iDwABe7QAAAADAAJYWBsAArEeB8LUJtRa3RgAAwABmBcAArBcAAAABA7Uot0YAAAABAQG1NgAAAMAAZhdgwACspAAAYMAAq1YBPgNOtae1rgAAgRBgwACrVgEftbTAAKteBwAHFrXXgLXKwFPpXqrzwACsqycAHLYxLsAAZhjAAKwXAAAAAMAArEgctk0uwABmGcAArBcBAAGAtl3AU+leAMAArE8ctnQuwABmGsAArBcBAAGAto/AU+leAMAArEsctqYuwABmG8AArBcBAAGAtsrAU+leAMAArE0ctuEuwABmHMAArBcBAAGAtvHAU+leAMAArEoAPRy3DRa3BS7AAGXuwACsF8AArDuAsgIAAha3G4C3DsBT6V6q88AArKuBtynAU+l3AMAA9WNKtzUBgbc8wFPpdwbAAKxIgfC3S7dYt8sAAMAAZhjAAKwXAAAAAQO3aLfLAAAAAAAAAGDAAImAAT4BSrdxAR63jsAAlhwCAAIWt7AWt6ouwABXoMAArBfAAKwwq7LAAJWnFre5LsAAT+bAAKwXwACsNwAGwACsSYHwt9C34bnWAADAAGYHwACsFwAAAAEDt/e51gAAAAEBAbgFAAAAwABmF2DAAKykAABgwACrXwE+A064KrgxAACBEGDAAKtfAR+4N8AAq2cHAAcWuF6AuFHAU+rvqvPAAKyrHrhyrywDAAIWuIcurFXAAKwXwACsHRa4noC4kcBT6u+AsMAArKoBq3wqFrjPgLjCwFPq74CwwACsqhy43S7AAGYZwACsFwEAAYC47cBT6u8AwACsTxy5BC7AAGYawACsFwEAAYC5H8BT6u8AwACsSxy5Ni7AAGYbwACsFwEAAYC5WsBT6u8AwACsTRy5cS7AAGYcwACsFwEAAYC5gcBT6u8AwACsSgA9HLmdFrmVLsAAZe7AAKwXwACsO4CyAgACFrmrgLmewFPq76rzwACsq4G5ucBT6wgAwAD1Y0q5xQGBuczAU+sIBsAArEqB8Lnbueq7MgAAwABmHMAArBcAAAABA7n5uzIAAAABAQG6BwAAAMAAZhdgwACspAAAXcAA9R0BYMAAq2gBPgNOui+6PgAAwABmHV3AAPUdAWDAAFa9ARy6ZRa6Uha6SC68ncAArD/AAGX6wACsekQBAAEWunOAumbAU+w9qvPAAKyrAMAA9WJJuoQcupeBuojAU+xcQQEAASsAwAD10kq6oAE6uqdgwACraAA/Srq/ARy7Fxy63oG6xsBT7FyAnwEBYMAAq2gBNLriA7riuwwAAAABAQG68QAAAICKYMAAVr0AAGDAAKtoAUq6+wEcuwUWuvsuwABl78AArBfAAKw8RAEAAYK7BsBT7PEAwAD1YgDAAPTmgKEBAAABkw8qwAD08QbAAKxLgfC7N7tJvJAAAMAAZhrAAKwXAAAAAQO7Y7yQAAAAAQEBu3EAAADAAGYXYMAArKQAAF3AAPUdAWDAAKuBAT4DTruXu6wAAMAAZaNdwAD1HQFgsNEBHLveFrvAFru2LrydwACsP8AAZfzAAKx8RAEAARa77IC738BT7WSq88AArKsAwAD1Ykm7/Ry8FoG8AcBT7YNBAQABKwDAAPXSSrwfATq8JmDAAKuBAD9KvEIBHLx1HLxegbxJwFPtg4CfAQFgwACrgQEWvGIuwABmHsAArBfAAKxMAMAA9OaAoQEAAAGTDyrAAPTxBsAArEyB8LyVvKHAAEDwAADAAGYewACsFwAAAAEDvLLAAEDwAAAAAQEBvL8AAACTDWCw0QAAYMAAq4EBPgZOvOC86gAAq6dgwABf4AEcvPsWvOwurwHAAKwXwACsMqupAQABJr0IAYC9CMBT7lRgwABobwDAAF/cTr0kvTEAAJMlYMAAVr0BFr09gb0zwFPuaZMlwABf4069XQAAAIIaYMAAipcASb1nIRy9eIK9a8BT7qNBAQABKwDAAPXSPgI9HL35Fr3vLsAAV+vAAKwXwACsNsAAZh8CAAEcvg8WvggurvnAAKwXwACsL8AASqoBAAGCvifAU+6jAMAAbE4BwABloCnAAKzMPYu+YMBT7sIcvnUWvm0WvmcuwABXoMAArBfAAKwwq7LAAJWnwABYeQEAAYK+h8BT7qMAwACV1T4CQBa+uoG+sMBT7mnAAEKKwABf576wvsEAPYu+ysBT7sIcvt8WvtEuwABl68AArBfAAKwuRAEAAYC+4MBT7lQAwAD1Yk6+/L8BAACAsGDAAIqhARy/Cha/Ay6u+cAArBfAAKwvwABKcgEAAYC/JsBT7lQAwABsNErAAEAuAR/AAEA5wACrjggABYDAAEBOwFPuVITAAEBXwFPvryscwABAYy7AAGX9wACsFwAAAADAAKxig8AAQIHAU+7CA4PgKr4QKsAAZbIhHMAAQOSCwABA18BT7qNBAQABKwDAAPXSBsAArE2B8MAAQPXAAEEHwABDBwAAwABmG8AArBcAAAABA8AAQSrAAEMHAAAAAQEBwABBPwAAAMAAZhdgwACspAAAXcAA9R0BYMAAq4EBPgJOwABBacAAQXQAAMAAZiBdwAD02wFgsNEBHMAAQcEcwABBkBbAAEF2LsAAZerAAKwXwACsJcAASLcAAAAAwABrOYEnAQABNMAAQccDwABBx8AAQj8AAAABAQHAAEHUAAAAkw1gsNEAAGDAAPKzAUrAAEHsARzAAEIZHMAAQfwWwABB7C7AAF+BwACsF8AArCGrWgEAAYHAAEIQwFPw8wCv40EBAAEWwABCNYDAAEIowFPwearzwACsqwDAAPXSAMAA9OdKwABCRgEcwABC7BzAAEKdHMAAQn8cwABCXhbAAEJNLsAAUJHAAKwXwACsNcAAR8QBAWCw0QGBwABCasBT8JoAwABp8ICfAQFgwACrgQEWwABCgy7AAGYhwACsF8AArE4AwAD05oEnAQABNMAAQqMDwABCo8AAQrsAAAABAQHAAEKkAAAAlERgwACrgQAAYMAA8rMBSsAAQq4BIRzAAEK0gsAAQq7AU/HaQQEAASsAwAD10gDAAPTngKEBAAABkw8qwAD08QbAAKxOgfDAAEMMwABDGMAARkQAAMAAZiHAAKwXAAAAAQPAAEMnwABGRAAAAAEBAcAAQzQAAACTDWCw0QAAYMAAq4EBPgVOwABDUcAAQ1YAAIIaYMAAipcBHMAAQ2YWwABDWC7AAGXrwACsF8AArC5EAQABgMAAQ2fAU/JRAMAA9WJJwABEERzAAEQagcAARBXAU/JoQQEAASsAwAD10krAAEQjASs/TsAARD3AAERCAACAsGDAAIqhARzAAERLFsAAREQurvnAAKwXwACsL8AASnIBAAGAwABEZ8BT8lEAwABsNE7AAER9wABEiAAAwABKMmDAAIqhARzAAESRFsAARIourvnAAKwXwACsL8AASqcBAAGAwABEpcBT8lEAwABsS0rAAEWsAR/AAEW3wACrjgcABYDAAEXMwFPyUYLAAEXVwFPyyYPAAEXbwFPzBhzAAEXnLsAAZf3AAKwXAAAAAMAArGKBwABGBcBT8mgCg+AhFsAARiWAwABGHcBT8lGm37DKvhApBsAArE+B8MAARknAAEZXwABHtAAAwABmGcAArBcAAAABA8AARmbAAEe0AAAAAQEBwABGdAAAAMAAZhdgwACspAAAXcAA9R0BYMAAq3YBPgROwABGlsAARqAAAIQsXcAA9R0BYMAAq3YBHsAARqbAAO6CAQFgwACrdgEWwABGwYDAAEa0wFPz2VrAAKyzAE7AAEbSwABG2AAAgNBgwAD0eQGTPRzAAEbugMAARuHAU/PZg7wBAAE0wABG9gPAAEb2wABHmQAAAAMDA8AARwUAAACECWCwngDAAEcgAAAAlDhdwAD1HQFgsK0AwABHRAAAAJQ+XcAA9R0BYLC/AABgwAD1ggE+AT0cwABHXoHAAEdVwFPz+oCyAgACNQAAAAEAYMAA9HkBgsAAR1/AU/Q4NQAAAAEAYMAA9HkBisAAR1/AU/Q4HMAAR2SGAMBT9MRdAQABlADAAPWehgDAU/TEHMAAR2ouwABmIsAArBcDAAODwABHeMBT9HOEwABHgcBT9ICFwABHisBT9JMAwACsUQDAAPUtAMAArLFKwABHoAGBwABHp8BT8/oGwACsUIHwwABHucAAR77AAF3PAADAAGYDwACsFwAAAAEDwABH0MAAXc8AAAABAQHAAEfeAAAAwABmF2DAAKykAABcAT4EScAAR/IcwABH/xbAAEf2Lpp1wACsF8AArDqB3QEAARbAAEgbFsAASAsuq3PAAKwXwACsIJsNrJUAwAD1YT4CTsAASDXAAEhIAADAAGYjYMAAiqEBHMAASFEWwABISi6u+cAArBfAAKwvwABKPQEAARrAAEhqrFcAwABsLz0cwABJFxbAAEkNHMAASO8WwABI5y6adcAArBfAAKw6RAEAARbAAEkAFsAASPAuq3PAAKwXwACsIJsNrJUAwAD1YsAAXy3AAKubTwEAASbAAEkbARzAAEkbLsAAZiTAAKwXAgACH8AASTvAAG25AQABJyMAHMAASWUawABJZsAAiDYgAgACJ8AAZiWBwABJj8BT9dgAwACNBADAAKxbYMAAq/YAwAD1Lj9OwABLucAAS8oAAK8iYMAAq48BHMAAS9QWwABLzC6adcAArBfAAKw6RAEAARbAAEvlFsAAS9Uuq3PAAKwXwACsIKkUrOsAwAD1Yk7AAEwHwABMEQAAwABmJl3AAPYOAWDAAPZdAR7AAEwXwAC7HwABYMAA9l0AAD0cwABMQIDAAEwqwFP1goO8AQABNMAATEgDwABMSMAAXcoAAAADAwPAAExXAAAAhAlgsJ4AwABMcgAAAMAAZiddwAD1HQFgsK0AwABMgQAAAICoXcAA9R0BYLC/AABgwAD1ggE+AUbAAEyMwABMs8AATJ0AAACZPGCwrQCEwABMpMBT92k+AUnAAEy9HMAATM0WwABMwS7AAENjwACsF8AArCaqbgEAAYbAAEzewFP3owDAAFOiPgE9HMAATQQWwABM8C6y08AArBfAAKwfqnQCAAKGwABNHMBT96M0wABNLwPAAE0vwABdsAAAAAEBAcAATT0AAACSW2CwvwAAYMAA9YIBPghOwABNV8AATV4AAMAASjBgwAD2XQEcwABNbBbAAE1gLsAAQ2PAAKwXwACsJr22AQABFsAATZGHwABNisBT+CSAsLCbAMAAU7pJwABNpCEWwABNsIfAAE2pwFP4JJSssMRKwABNwgA/ScAATdYiIhbAAE3hh8AATdrAU/gkhECwyAEWwABN9IfAAE3twFP4JIRCsMYBFsAATgaHwABN/8BT+CSqVrDHPgJOwABOJsAATjAAALLaXcAA9U4CYL6/YMAAVHMBHMAATlIWwABORC6sWMAArBfAAKwisrMBAAEWwABOcYfAAE5qwFP4JICwsJsAvwxJwABOhiIhHMAATpQUwABOisBT+OMJAEEBAAErAMAA9dIAIRbAAE6qFMAATqDAU/jjCQCA/MAA9XM+AUbAAE7FwABO6sAATs4AAACf7GC+vwAWwABO5BTAAE7awFP44wkAgdzAAPVwPgJOwABPAsAATwsAAMAAZihgwACKoQEcwABPFBbAAE8NLq75wACsF8AArC/AAEo9AQABFMAATyPAU/lxCgAAwABsL0nAAE9AHMAAT06CwABPRMBT9whPAQABFsAAT1sUwABPUsBT+ZcLAIOWwACKqADAAPYbPgE9HMAAT5IWwABPiIHAAE93wFP2vsAAXy3AAKubTwEAASbAAE+WARzAAE+WLsAAZiTAAKwXAwACFMAAT6fAU/mXCwAcwABPyxrAAE/MwACINiACAAInwABmKTHAAE/xYMAA9l0BFMAAT/LAU/g7CAAAwACNBAGTDYfAAFAdwFP4JMAArFtgwACr9gDAAPUuPz8/ScAAUHgiFsAAUIOHwABQfMBT+CSEQbDJASIWwABQl4fAAFCQwFP4JIRCsMYAIRbAAFCqh8AAUKPAU/gkg+Kwyz4CTsAAUMjAAFDSAACy2l3AAPVOAmC+v2DAAFRzARzAAFD0FsAAUOYurFjAAKwXwACsIrK0AQABFsAAUROHwABRDMBT+CSAsLCbAL8NScAAUSgiIRzAAFE2FMAAUSzAU/rfCQBBAQABKwDAAPXSACEWwABRTBTAAFFCwFP63wkAgPzAAPVzPgJOwABRa8AAUXQAAMAAZihgwACKoQEcwABRfRbAAFF2Lq75wACsF8AArC/AAEp8AQABh8AAUY3AU/gkAMAAbDhJwABRphzAAFG0gsAAUarAU/cITwEAARbAAFHBFMAAUbjAU/tlCgCDlsAAiqgAwAD2Gz4BPRzAAFH2FsAAUeyBwABR28BT9r7AAF8twACrm08BAAEmwABR+gEcwABR+i7AAGYkwACsFwMAAhTAAFILwFP7ZQoAHMAAUi0awABSLsAAiDYgAgACJ8AAZioxwABSWmDAAPZdARTAAFJbwFP4OwgAAMAAjQQBkw2HwABShMBT+CTAAKxbYMAAq/YAwAD1Lj8/P07AAFNTwABTYgAAwABmK2DAAPKzASpOwABThMAAU5EAAJTdYMAAWMkBK0nAAFOmFsAAU7GHwABTqsBT+CSqVrDHPgJOwABT3MAAU98AAJMSYLDUASbAAFPcAYfAAFPhwFP4JGCw1D0VwABT98BT/H8KHMAAVBoWwABUBi6y08AArBfAAKwfqn0BAAEUwABUKsBT/KwLAACvC0nAAFRCFsAAVE2HwABURsBT+CSEQLDIPgE9FcAAVGfAU/xpCSk/ScAAVMEiFMAAVMXAU/xpCQABIRzAAFTkFMAAVNfAU/x/CgBBAQABKwDAAFjePgVOwABVAQAAAMAAZixgwAD0eQBOwABVHAAAAMAAZi1gwAD0eQBJwABVMyEcwABVRBTAAFU3wFP8fwoAQQEAASsAwABY3j4CPRXAAFVfwFP9VwsWwABVhRbAAFV2FMAAVWnAU/x/CgCrdsAAWMxawAD1TD0VwABVncBT/WkMHMAAVa8UwABVp8BT/VcLAF0BAAEWwABV1RbAAFW+FMAAVbHAU/x/CgCrd8AAWM1awAD1TADAAPWePgI9FcAAVgTAU/1XC5M9FcAAViHAU/1pDDfAAH//TsAAVlTAAFZeAACy2l3AAPVOAmC+v2DAAFRzARzAAFZuFsAAVmAurFjAAKwXwACsIrKyAQABFsAAVoeHwABWgMBT+CSAsLCbAL8LScAAV1wiIRzAAFdqFMAAV2DAU/4qDQBBAQABKwDAAPXSACEWwABXgBTAAFd2wFP+Kg0AgPzAAPVzPgFGwABXmwDAAFekAAAAn+xgvr8AFsAAV7oUwABXsMBT/ioNAIHcwAD1cEE+CE7AAFgawABYKAAAso9gwAD0eQEWwABYMxTAAFgqwFP+tQ4Aso++yEnAAFiWHMAAWLYWwABYoxTAAFiawFP+tQ4AspC+yYCLAQABkwDAAPWoQsAAWLsAP0nAAFjXHMAAWOkUwABY28BT/twPAFwBAAEUwABY68BT/VcLAADAAPWmQsAAWPQAP0nAAFkQHMAAWSIUwABZFMBT/twPAICLAQABFMAAWSTAU/1pDAAAwAD1qELAAFktAD9OwABZTcAAWVYAAMAAZihgwACKoQEcwABZXxbAAFlYLq75wACsF8AArC/AAEo9AQABFMAAWW7AU/61DgAAwABsL0nAAFmLIRzAAFmagsAAWZDAU/cITwEAARbAAFmnFMAAWZ7AU/+UEACDlsAAiqgAwAD2G0LAAFmtAD9OwABZzcAAWdgAAJ7wXcAA9R0BYMAA9l0BHsAAWfTAAPUlAgFgwAD2XQIUwABaCsBT/twPADTAAFoZA8AAWhnAAFolAAAAAQEBwABaGgAAAFtgwAD0eQAAYMAA9l0BSsAAWiABJMAAWiUCJ4DGFMAAWiPAVABXEQAAPRzAAFyLFsAAXIGBwABccMBT9r7AAF8twACrm08BAAEmwABcjwEcwABcjy7AAGYkwACsFwMAAhTAAFy3wFP/lBAAHMAAXNkawABc2sAAiDYgAgACJ8AAZi4xwABdKWDAAPXFAxTAAF0qwFQADxEAFMAAXTbAU/g7CAAUwABdPsBUAA8RAADAAI0EAZMNh8AAXWvAU/gkwACsW2DAAKv2AMAA9S4/PwCu/z8AwACssQbAAKxRgfDAAF5DwABeS8AAYjAAAMAAZiLAAKwXAAAAAQPAAF5YwABiMAAAAAMDA8AAXmcAAACECWCwngDAAF6CAAAAwABmJ13AAPUdAWCwrQDAAF6qAAAAwABmL13AAPUdAWCwvwAAYMAAq3YBPgdOwABex8AAXssAAICgYMAA9l0BHMAAXuIWwABe1YDAAF7NwFQBZqAqsKAjAAAAAMAA9wZOwABfBsAAXw4AAMAAYKhdwAD1HQFgwACsAgEcwABfmRzAAF9qHMAAX0ocwABfKILAAF8QwFQBiIEnAQABNMAAXy4DwABfLsAAXz8AAAABAQHAAF8vAAAAgwZgsL8AAGDAAPKzAUrAAF81ASEWwABfOITAAF82wFQCKoRCsMYAwAD055MgAAFgsNQAAMAA9OSAnwEBYMAArAIBFsAAX3wuwABmMMAArBfAAKxgAMAA9OaAoQAAAADAAPTxScAAX6gcwABftIDAAF+swFQBZkEBAAEWwABfxxbAAF+3LqtzwACsF8AArCCo1qytAMAA9dI+Aj0cwABf7ITAAF/kwFQB2oCZAQABHMAAX/MuwABmMcAArBcAAAAAwACsXQDAAPUvPRzAAGAkhMAAYBzAVAHagJkBAAEcwABgKy7AAGYywACsFwAAAADAAKxfAMAA9S8/TsAAYGPAAGBrAACUOF3AAPUdAWDAAKuPARzAAGEpHMAAYMccwABghIHAAGBtwFQBc4CfAQFgwACrjwE0wABgiAPAAGCIwABgvAAAAAEBAcAAYJUAAACqAmCwrQAAYMAAq48BSsAAYKYBHMAAYK4WwABgpi6adcAArBfAAKw6RAEAAYXAAGCvwFQDeQDAAPViAMAA9OaBJwEAATTAAGDNA8AAYM3AAGEeAAAAAQEBwABg1AAAAJk8YMAAq48AAGDAAPKzAUrAAGDoASIhFsAAYO2FwABg6cBUA9iV3cAAq6EBIRzAAGERFsAAYPouwABl8MAArBfAAKw9gtABAAGFwABhGsBUA9gAwAD2GgDAAPTngKEBAAABkw8qwAD08U7AAGFMwABhWQAAwABmM2DAAPKzASlOwABhccAAYYsAAMAAZa9dwAD1HQFgwACrvQEcwABhlS7AAGY0wACsFwIAAAKECYDAAGGrwFQBZsAAZjOGwABhwsBUBEnAAKxeSsAAYdYBH8AAYeHAAKuABQAFgMAAYfLAVAFmg8AAYfvAVAGnhMAAYgDAVAHahcAAYgnAVAMrh8AAYhLAVARfAAbAAKxSgfDAAGI1wABiOsAAYq8AAMAAZjXAAKwXAAAAAQPAAGJJwABirwAAAAEBAcAAYlYAAACTDWCwrQAAYMAA8rMBPgFKwABiZQEiIRzAAGJ9FsAAYmwuwABl8cAArBfAAKw+QQEAASsAwAD10gAhHMAAYpoWwABiiS7AAGXxwACsF8AArD6C0AEAAYDAAGKjwFQFFwDAAPYaBsAArFOB8MAAYrTAAGK6wACB5QAAwABl/sAArBcAAAABA8AAYsXAAIHlAAAAAQEBwABi0gAAAJk8YLCtAABgwACrjwE+H07AAGLiwABi7QAAwABluGDAAPKzARzAAGMRFsAAYvkWwABi7y68ncAArD/AAGY2wACseILQAQABgMAAYxrAVAWyAMAA9hpOwABjKcAAYzUAAMAAXlRgwADyswEcwABjQBbAAGM3LsAAQ8vAAKwXwACsJ8AAQ6MBAAGAwABjWMBUBbIAwABjT0nAAGNiHMAAY3IWwABjZi7AAENjwACsF8AArCaqbgEAAYDAAGODwFQFsgDAAFOiPgE9icAAZBTAVAXJKT9OwABkNsAAZEkAAMAAZblgwADyswEcwABkT4DAAGRLwFQFskEBAAEWwABkYhbAAGRSLqtzwACsF8AArCCpIqz3AMAA9dJOwABkgsAAZIoAAMAAStldwAD1HQFgwACr1QExwABkjGDAAKvVAE7AAGSlwABkrwAAwABfLV3AAPUdAWDAAKv2ATHAAGS9YMAAq/YATsAAZNnAAGTsAADAAGY3YMAAlYQBH8AAZPLAAJWYBgAFFsAAZRQWwABlDi7AAFegwACsF8AArDCrssAAlacWwABlHS6rc8AArBfAAKwgFsAAZS4urvnAAKwXwACsLxbAAGU2LqxYwACsF8AArCIWwABlRS6tOcAArBfAAKwxAYK2FsAAZXgWwABlby6sVcAArBfAAKwdgraBIE7AAGWmwABluwAAwABmOGDAAJa3AR/AAGXBwACWxgYABhbAAGXfLqtzwACsF8AArCAWwABl+C7AAF+BwACsF8AArCEWwABmES7AAFegwACsF8AArDAWwABmIC6u+cAArBfAAKwvFsAAZjAuwABfg8AArBfAAKwqFsAAZkQurv3AAKwXwACsKwBPwABmV8AAZlwAAAHAAGY5YQFgsL9cAAPAAGZvwABpdAAAAAEBAcAAZn0AAACSW2CwvwAAXAE+AknAAGaNIiEWwABmmRTAAGaSwFQIZQkAg9+wzAAhFsAAZq8UwABmqMBUCGUJAIRCsMY+AUnAAGbCISXAAGbNFMAAZsbAVAhlCQBgwABoij4CTsAAZvbAAGb9AACTMWDAAKvVARzAAGb/LsAAZjrAAKwXAQABJsAAZwwBFMAAZwzAVAhlCQBgsNQAwACsV0nAAGcfIRzAAGcqFMAAZyPAVAjICgBBAQABKwDAAPXSPRzAAGc7hMAAZzPAVAbSTwEAARTAAGc/wFQIyAoAAMAA9S4/Pz9JwABnYCIWwABnaxTAAGdkwFQIZQkAhECwyAEWwABnfhTAAGd3wFQIZQkAhEKwxj4CTsAAZ7TAAGe+AACy2l3AAPVOAmC+v2DAAFRzARzAAGfaFsAAZ8wurFjAAKwXwACsIrKyAQABFsAAZ/MUwABn7MBUCGUJAICwsJsAvwtJwABoAiIhHMAAaBAUwABoBsBUCXwKAEEBAAErAMAA9dIAIRbAAGgmFMAAaBzAVAl8CgCA/MAA9XM+Ak7AAGhXwABoagAAwABmO13AAPVOAmDAAIqhYMAAipcBHMAAaI2GwABoesBUBx7AAF5dAgACFMAAaKjAVAhlCQAUwABosMBUCXwKAADAAJWUPRzAAGjZFMAAaMbAVAoECwCDvAEAATTAAGjhA8AAaOHAAGlbAAAAAgICwABo6gAAAICwYMAAiqEAwABo/gAAAIIaYMAAipcAAGDAAPWCAT4BPRzAAGkchcAAaRLAVAb4TwEAASbAAGkgARzAAGkgLsAAZiTAAKwXAwACFMAAaTHAVAp9DAAUwABpN8BUCowNAAGTDRTAAGlGwFQIZQkAwACsW2DAAKv2AMAA9S4AwAD1bT8/T8AAaXvAAGmAAAABwABmPGEBYLC/XAADwABpi8AAafkAAAABAQHAAGmZAAAAkltgsL8AAFwBPgFJwABpqRbAAGm0FMAAaa3AVAstCgCUrLDEPgE9HMAAaeMUwABp0MBUCEQIACABAAEUwABp5MBUCy0KAAAAP07AAGoRwABqIwAAwABlt13AAPUdAWDAAKv2ATHAAGoxYMAAq/YAScAAajoiFsAAakwWwABqPi7AAEiowACsF8AArCSsAcAAYj4AHMAAam6AwABqasBUBbJBAQABFsAAaoEWwABqcS6rc8AArBfAAKwgmw2slQDAAPXSPgJOwABqrcAAarcAALLaXcAA9U4CYMAAiqFgvr8BHMAAataGwABqw8BUBx7AAF5nAAAAAMAAlZU9HMAAawgUwABq/sBUC/oLAIO8AQABNMAAaxADwABrEMAAbGQAAAACAgLAAGsZAAAAgLBgwACKoQDAAGsoAAAAn+xgvr8AAGDAAPWCAT4DTsAAa5PAAGugAACykmDAAPZdARbAAGurFMAAa6LAVAxoDQCAsL7NScAAa7kWwABrxhTAAGu9wFQMaA0AhEG+0D0VwABr0MBUDH8OJMAAa+8CFMAAa+HAVAx/DgAngK8/PRzAAGwLFMAAa/nAVAt+CgBPAQABHMAAbC+GwABsHMBUBx7AAF5sAgACFMAAbEvAVAxZDAAUwABsUcBUDGgNAADAAJWWAMAA9S4AwAD1bT9JwABscoPAAGx2wFQGjT4DTsAAbOvAAGzwAACAsGDAAIqhARzAAGz5FsAAbPIurvnAAKwXwACsL8AASn4BAAEawABtD6w/AMAAbDxOwABtI8AAbSwAAJJPYMAAi5UBJsAAbSMBHMAAbTAawABtMcAAiDYgAQABJ8AAZj0AwACNBGDAAIuVPRzAAG1khcAAbVrAVAb4TwEAASbAAG1oARzAAG1oLsAAZiTAAKwXAgACFMAAbXnAVA0/CwAUwABtf8BUDXoMAADAAKxbYMAAq/YAwAD1Lj9JwABtliIcwABtqhbAAG2aLqtzwACsF8AArCCpjgEAAYDAAG2/wFQFsgCtdQAhgcAAbcjAVAXJPgE9HMAAbeaFwABt3MBUBviAmQEAARzAAG3tLsAAZj7AAKwXAQABgMAAbgnAVAWyAMAArFoAwAD1Lz9OwABumMAAbrAAAKqQYMAA8rMBKknAAG69IYHAAG7CwFQFyT4BScAAbtYcwABu7hbAAG7aLrLTwACsF8AArB+qkAEAAYDAAG8GwFQFsgCvIz4FTsAAbynAAG8xAACUPl3AAPUdAWCwvwExwABvQWCwvwBPwABvTcAAb1IAAAFPYQFgsL9cAAPAAG9VwABv/AAAAAEBAcAAb2MAAACSW2CwvwAAXAE+AUnAAG93HMAAb5EWwABvghTAAG97wFQPCg4AkmmwzUEBAAGAwABvlMBUBbIAwAD10j4CPRzAAG+vFMAAb6fAVA7IDABPAQABFMAAb7PAVA8KDgAAwAD1Lj0VwABvyMBUDnYLKT89HMAAcBsWwABwBy6y08AArBfAAKwfqnQCAAKAwABwM8BUBbIUwABwOMBUDuwNAACu/z0cwABwWhbAAHBGLrLTwACsF8AArB+qjQIAAoDAAHB1wFQFshTAAHB6wFQO7A0AAK8gScAAcIkWwABwlRTAAHCNwFQOyAwAg2jAAPUAPgE9HMAAcMocwABwtRbAAHCtLsAAUJHAAKwXwACsNcAAR8QBAWCwvwEUwABwwcBUDsgMAADAAGnwg7wBAAEUwABw0sBUCwwJAADAAPTrP0nAAHD3IRzAAHEQFsAAcPwustPAAKwXwACsH5SbAQABgMAAcSPAVAWyAK8IPgVOwABxRsAAcU4AAJQ+XcAA9R0BYLC/ATHAAHFeYLC/AD0cwABxfhbAAHFqLrLTwACsF8AArB+qdAIAAoDAAHGWwFQFshbAAHGjFMAAcZvAVBB9DABPwAD1LgCu/z0cwABxxRbAAHGxLrLTwACsF8AArB+qjQIAAoDAAHHgwFQFshbAAHHtFMAAceXAVBB9DABPwAD1LgCvID0cwAByDxbAAHH7LrLTwACsF8AArB+qjgIAAoDAAHImwFQFshbAAHIzFMAAcivAVBB9DABPwAD1LgCvIT0cwAByXhzAAHJJFsAAckEuwABQkcAArBfAAKw1wABHxAEBYLC/ARTAAHJVwFQQfQwAAMAAafCDvAEAARTAAHJmwFQLDAkAAMAA9Os/P07AAHKLwAByngAAsX1gwADyswEcwABysRbAAHKgLsAAQ3PAAKwXwACsKLF9AQABgMAAcsTAVAWyAMAAYpdOwABy2sAAcukAAMAAZcFdwAD1HQFgwACrvQEjgcAAcuvAVAXJOsAAcwBgwACrvQAcwABzGi7AAGY0wACsFwMAAAOZPIDAAHM5wFQFssAAZjMqwABmPxTAAHOFwFQRnwwAwACsXgFdwAD1HQFgwACrvU7AAHOqwABzxAAAwABlr13AAPUdAWDAAKu9ASOBwABzxsBUBck6wABz22DAAKu9ABzAAHP1LsAAZjTAAKwXAwAAA5k8gMAAdBTAVAWywABmMynAAGY/FMAAdF/AVBGfDADAAKxeAV3AAPUdAWDAAKu9TsAAdIzAAHSWAADAAF96YMAAlqsBHMAAdK2HwAB0mMBUB7jAAF+FAwACgMAAdMbAVAWyFsAAdMsuwABl68AArBfAAKwuAcAAX4YWwAB1AC7AAGXtwACsF8AArDnAAJbCTsAAdTbAAHVFAADAAGW2XcAA9R0BYMAAq/YBMcAAdVNgwACr9gBOwAB1bMAAdXUAALLLXcAA9R0BYMAAq/YBMcAAdYNgwACr9gBJwAB1ixzAAHWbFsAAdY8uwABDY8AArBfAAKwmqm4BAAGAwAB1rMBUBbIAwABToj4BPRzAAHbIFMAAdr7AVBK+DwDAAF99AgACFsAAdtguwABQkcAArBfAAKw1NMAAduEDwAB24cAAd4cAAAACAgLAAHbqAAAAgLBgwACKoQDAAHb4AAAAghpgwACJYAAAYMAA9YIBPgE9HMAAd10WwAB3RxzAAHcQFsAAdwgumnXAAKwXwACsOkQBAAEWwAB3IRbAAHcRLqtzwACsF8AArCCpFKzrAMAA9WKyy8AAq5lPAQABJsAAd2EBHMAAd2EuwABmJMAArBcCAAIUwAB3csBUE9YSACbAAHd4ARTAAHd4wFQT5RMAYMAAipcAwACsW2DAAKv2AMAA9S4AwACWtD4CRsAAd53AAHfBwAB3qAAAAJREYMAAq70AFMAAd7HAVBHcDQA+AUnAAHfLFsAAd9UUwAB3z8BUFKASAMAAXyzAAKvEPgZAIRbAAHgDFMAAd/3AVBSgEgDAAF8rwACrysAAd/zAAHgXAE7AAHgwwAB4OAAAkw1gsNEBFsAAeEAUwAB4OsBUFKASAJMNwACrv07AAHhhwAB4ZgAAghpgwACKlwEcwAB4dhbAAHhoLsAAZevAAKwXwACsLkQBAAEUwAB4d8BUFP8TAADAAPViScAAeIscwAB4lBTAAHiPwFQVJhQAQQEAASsAwAD10j4BPRXAAHnjwFQVJhQcwAB57BrAAHntwACINiABAAEnwABmQADAAI0EP07AAHogwAB6JQAAgLBgwACKoQEcwAB6LhbAAHonLq75wACsF8AArC/AAEpmAQABFsAAekUUwAB6P8BUFKASAMAAZcPAAKvBAMAAbDk9HMAAem0UwAB6XsBUEx4QAE8BAAEmwAB6cQEcwAB6cS7AAGYkwACsFwMAAhTAAHqCwFQVrRUAFMAAeojAVBUmFAABkw0UwAB6l8BUFP8TAMAArFtgwACr9gDAAPUuPz0cwAB6xRTAAHq7wFQSvg8AwABffQIAAhbAAHrVLsAAUJHAAKwXwACsNTTAAHreA8AAet7AAHs4AAAAAgICwAB65wAAAICwYMAAiqEAwAB69QAAAIIaYMAAiWAAAGDAAPWCAT4BPRzAAHsOFMAAewXAVBNEEQBPAQABJsAAexIBHMAAexIuwABmJMAArBcCAAIUwAB7I8BUFpUSACbAAHspARTAAHspwFQWpBMAYMAAipcAwACsW2DAAKv2AMAA9S4AwACWtE7AAHtOwAB7UwAAgLBgwACKoQEcwAB7XBbAAHtVLq75wACsF8AArC+V+gEAAYDAAHtmwFQFsgDAAGxETsAAe3fAAHuCAADAAGZBYMAA9l0BHMAAe4sWwAB7hC6u+cAArBfAAKwvwABKpQEAAYDAAHugwFQFsgDAAGxITsAAfBPAAHwaAADAAESkYMAAq0ABHMAAfCYWwAB8HC7AAFfrwACsF8AArDbAAGYfAQABFMAAfDXAVBdZEwAAwACszE7AAHxLwAB8WgAApGJgwADyswEiIRzAAHxpFsAAfF0uwABDY8AArBfAAKwmqm4BAAGAwAB8esBUBbIAwABTogAcwAB8tBbAAHyYFsAAfIourFjAAKwXwACsIqxUwABUqYLQAQABgMAAfL3AVAWyAMAA9OpOwAB8zgAAAIEQYMAAq48AScAAfNoiIhzAAHzyFsAAfN4ustPAAKwXwACsH5SbAQABgMAAfQXAVAWyAK8IACGBwAB9FsBUBckAIRTAAH0twFQOdgsAPgRAIRzAAH1iFsAAfVYuwABDY8AArBfAAKwmqm8BAAGAwAB9cMBUBbIAwABTncAAfVXAAH10AEAWwAB9jITAAH2EwFQG0oD8wAD0/8AAfYTAAH2TAEAhg8AAfaTAVAaNwAB9o8AAfbYAPRXAAH3AwFQYThYfwAB9zcAAq7wMAAmAwAB96cBUBbIUwAB9+MBUFx4SABTAAH4IwFQXmBQAFMAAfhrAVBHcDQAUwAB+NMBUEk0OAIXAAH5ZwFQG+BTAAH5uwFQTHhAAFMAAfojAVBNEEQAWwAB+phTAAH6cwFQSvg8AwABfd8AAlq0DsxUUwAB+28BUF9sVAMAAXlSCwAB/AsBUBg/AAGW4gcAAfyXAVAXJPgE9FcAAf0XAVBhOFh/AAH9SwACrtRIAC4DAAH9jwFQFshTAAH9ywFQXHhIAFMAAf4LAVBeYFACEwAB/lMBUBtIUwAB/p8BUEdwNABTAAH/BwFQSTQ4AhcAAf+bAVAb4FMAAf/vAVAt+CgAUwACAGMBUEx4QABTAAIAywFQTRBEAFsAAgFAUwACARsBUEr4PAMAAX3fAAJatB7MVFMAAgIXAVBfbFQDAAF5UgsAAgKzAVAYPwABluIHAAIDPwFQFyZXdHMAAgPsWwACA7y7AAENjwACsF8AArCaqbwEAAYDAAIEJwFQFsgDAAFOdwABluYPAAIEtwFQGjcAAZbocwACBWy7AAGY1wACsFwEAAYDAAIFrwFQFsgDAAKxSqpAUwACBlMBUDnYLAD0cwACBwBbAAIG4Lpp1wACsF8AArDqAsgIAAoDAAIHBwFQFshTAAIHIwFQYThYAAMAA9WNKwACB1AEUwACB28BUGE4WAAbAAKxUgfDAAIHqwACB78AAgvoAAMAAZkLAAKwXAAAAAQPAAIIAwACC+gAAAAEBAcAAghAAAACTMWCw1AAAYMAA8rMBPgNJwACCHiXAAIIpgMAAgiLAVBtVYMAAaENKwACCPAEqP0nAAIJOJcAAglmAwACCUsBUG1VgsPNKwACCcwEqP0rAAIKFASIhHMAAgrkWwACCphbAAIKTgMAAgozAVBtVrBWw16wjsQpBAQABkwDAAPWcASEcwACC8hbAAILjFsAAgtCAwACCycBUG1WsFbDXkl6xAUEBAAGTAMAA9ZwGwACsVYHwwACC/8AAgwTAAIOaAADAAGZDwACsFwAAAAEDwACDF8AAg5oAAAABAQHAAIMnAAAAkzFgsNQAAGDAAPKzAT4BSsAAgzUBIhbAAINKFsAAgzwuwABIqMAArBfAAKwkrATAAGI8ABzAAIN3FsAAg2kuwABl7MAArBfAAKwzr2UBAAGAwACDj8BUHDcAtvEGwACsVoHwwACDsMAAg7DAAIe4AADAAGZEwACsFwAAAAEDwACDzsAAh7gAAAABAQHAAIPeAAAAkzFgsNQAAFsBPgROwACEAQAAAMAAZdNbAE7AAIQ4wACESwAArBVgsPsBFsAAhFSAwACETcBUHMqsFbDXScAAhGwWwACEkxbAAISDgsAAhHDAVBzrlG2xAINowAD1AD4CPYnAAISnwFQc3R7AAITMwAD1VQACYMAA9l1gwABWvQAAPRzAAIT+FsAAhPAurFjAAKwXwACsIqu6AgACgMAAhQ/AVBzKNMAAhSEDwACFIcAAhhUAAAADAwPAAIUrAAAAghdgwABYNgDAAIU4AAAAgLBgwAD2XQDAAIVMAAAAgt9gwABWvQAAYMAA9YIBPgFJwACFZBzAAIWLFsAAhXuCwACFaMBUHOuUbbEAgtABAAGEwACFlMBUHZkAwAD06j4CQCEcwACFu4XAAIWuwFQdqEEBAAErAMAA9dLAAIWuwACFwgA9HMAAhe2BwACFz8BUHN2AsgIAAoTAAIXuwFQdmYXAAIX2wFQdqAAAPwC/BD4DPYnAAIYrwFQc3THAAIZbYMAAVr0ATsAAhmnAAIZvAAAnYMAA9HkBkz0cwACGiBbAAIZ6LqxYwACsF8AArCKrugIAAoDAAIaZwFQcyjTAAIarA8AAhqvAAIeCAAAAAwMDwACGtQAAAIIXYMAAWDYAwACGwgAAAICwYMAA9l0AwACG1gAAAILfYMAAVr0AAGDAAPWCAT4CScAAhu4cwACG+IPAAIbywFQeWIFIAQABFsAAhw6CwACG+8BUHOusH7D+AMAA9ak+AT0cwACHTYHAAIcuwFQc3U8BAAGGwACHUcBUHsAAAD89i8AAh3LAVB5YHMAAh3eDwACHcsBUHlhdAQABlADAAPWeAL8ESsAAh48BgcAAh5bAVBzdBsAArFeB8MAAh73AAIfIwACS4gAAwABmOsAArBcAAAABA8AAh9TAAJLiAAAAAQEBwACH5AAAAJMNYLDUAABgwACr3AE+GE7AAIf7wACIAAAAgLBgwACKoQEcwACICRbAAIgCLq75wACsF8AArC+vQgEAAYDAAIgcwFQfjADAAGxGTsAAiDjAAIg9AACCGmDAAIqXARzAAIhNFsAAiD8uwABl68AArBfAAKwuRAEAAYDAAIhOwFQfjADAAPViScAAiKMcwACIrILAAIinwFQf3kEBAAErAMAA9dJKwACItQErP07AAIjMwACI1wAAwABfZWDAAPKzASpOwACI7AAAAMAAZdBgwACKoQBOwACJAsAAiRYAAMAAZdZgwADyswEqTsAAiSjAAIk5AADAAGZFYMAA8rMBIiIhFsAAiUyAwACJRMBUH4yqVrDHARbAAIligMAAiVrAVB+MhECwyAEWwACJdoDAAIluwFQfjIRBsMlOwACJisAAiZcAAMAAX2ZgwADyswEcwACJmS7AAGZDwACsFwEAAYDAAImtwFQfjADAAKxVTsAAicTAAInOAADAAGXVYMAAiqEBIxzAAInhFsAAidAuwABX2cAArBfAAKwpr2ABAAGAwACJ9sBUH4wAtuQcwACKEBbAAIoJLq75wACsF8AArC/AAEqhAQABgMAAii/AVB+MAMAAbEUrAWDAAIqhScAAik2GwACKUcBUIH0+AT2LwACKa8BUID8qPgFJwACKkhbAAIqtFsAAip6AwACKlsBUH4ySabDNrA+wsD4CPYvAAIrCwFQgPyo9jcAAit7AVCBnKT4DPYvAAIs0wFQgPxzAAItPFsAAi0EurFjAAKwXwACsIrKxAQABgMAAi2DAVB+MAL8KQCKDwACLecBUID8BIRzAAIu8FsAAi6IWwACLlC6sWMAArBfAAKwisra+/ILQAQABgMAAi8XAVB+MAMAA9OrAAIt5wACLzQA9jMAAi9jAVCBVHMAAi+0WwACL5i6u+cAArBfAAKwvwABKfQEAAYDAAIv+wFQfjADAAGw7ScAAjBuDwACMH8BUID8+AkAhJcAAjEKAwACMOsBUH4xgsOzAAIw6wACMVwEewACMWavfAQABgMAAjGLAVB+MAEAhJcAAjIKAwACMesBUH4xgsPPAAIx6wACMmwEewACMnavfAQABgMAAjKbAVB+MAD9OwACMwcAAjM8AALFeYMAA8rMBHMAAjPYWwACM5hbAAIzZLq05wACsF8AArDGvOsAAQH7AAENWAQABgMAAjQrAVB+MAMAAYphOwACNIcAAjSoAALZzYMAAiqEBK0nAAI02g8AAjTrAVCA/PgJOwACNV8AAjWQAAL42YL6/ARzAAI2SHsAAjXS+5wEAAYDAAI2JwFQfjACypAAAAAC+4z0VwACNqsBUIysKHMAAjbwWwACNtS6u+cAArBfAAKwvwABKPQEAARTAAI3LwFQjTwsAAMAAbC8/TsAAje7AAI35AADAAGZGYMAAWDYBHMAAjg8WwACN+y6y08AArBfAAKwfqn0BAAGAwACOH8BUH4wArwtOwACOOwAAAJTdYMAAipcAScAAjk2DwACOUcBUID8+Ak7AAI5wwACOewAAqvNgry0BHMAAjo0WwACOfS7AAF+BwACsF8AArCGrWgEAAYDAAI6hwFQfjACv4z0VwACOscBUI/QMHMAAjsAuwABmR8AArBcCAAImwACO1gEUwACO1sBUI7kLAGDAAFjJFMAAjuLAVCQUDQAAwACsWD9OwACPCcAAjxAAAJMxYLDUAYDAAI8SwFQfjE7AAI8ywACPRQAArBVgsPsBFsAAj04UwACPR8BUJJANAKwVsNdOwACPasAAj4EAAJTHYMAA9HkBFsAAj5YUwACPg8BUJKoOAKwfsP5OwACPwwAAAMAAZdNbAE7AAI/rwACP9gAAwABl0mDAAPR5AZNJwACP/4fAAJADwFQgzT4CPRXAAJAZwFQk9hAcwACQOi7AAGZEwACsFwEAARTAAJBZwFQkkA0AAMAArFZJwACQaBzAAJCOFsAAkH8UwACQbMBUJKoOAJJesQGAiwEAAZMAwAD1qD4BPRXAAJCdwFQlBBGUPz9KwACQwAEfwACQy8AAq/UPAAWAwACQ2sBUH4yBwACQ48BUH6OCwACQ6cBUH94cwACQ9y7AAGZIwACsFwMAA4DAAJEPwFQfjIPAAJEYwFQgP4fAAJEkwFQgzQDAAKxZFMAAkTPAVCMrCgAKwABlz4PAAJFTwFQgP8AAZdCEwACRdMBUIFXAAGXWhcAAkZ7AVCBnsV4UwACRysBUIuMJAMAAZdUUwACR7MBUIQEIAMAAX2aHwACSDcBUIM2UxxTAAJI7wFQkzw8AwABl0xTAAJJ7wFQk9hAAlN0UwACSscBUI/QMAMAAZdIUwACS08BUJQQRAAbAAKxYgfDAAJLnwACS9cAAlEYAAMAAZkfAAKwXAAAAAQPAAJMKwACURgAAAAICAsAAkx8AAACCF2DAAFjJAMAAkzAAAACq82CvLQAAYMAAipcBPgFJwACTQhbAAJNLgMAAk0bAVCawszPAAFjSPgJOwACTeMAAk4MAAMAAX4tgwACKlwEcwACThxrAAJOIwACINiABAAEnwABmSQDAAI0ESsAAk6UBHMAAk7gWwACTrC6u/cAArBfAAKwrwABD6wMAAxbAAJPTFsAAk80uwABXoMAArBfAAKwwq7LAAJWngMAAk9zAVCawgsAAk+LAVCbxAMAAY8k+AUrAAJQCARzAAJQhFsAAlA8WwACUCS7AAFegwACsF8AArDCdLcAAlaHAAF8GAgACgMAAlCvAVCawgcAAlDHAVCa/AMAAllYGwACsWYHwwACUS8AAlGXAAJZ6AADAAGZIwACsFwAAAAEDwACUfMAAlnoAAAADAwPAAJSTAAAAkw1gsNQAwACUoQAAAMAAX2VgwADyswDAAJSyAAAAwABfZmDAAPKzAABdwAD1HQFgwACr+wE+A0nAAJTGIRzAAJTLLsAAZkLAAKwXAQABgMAAlN3AVCfvAMAArFRKwACU5wE6wACU7mDAAKv7AD9OwACVKcAAlTMAALbbYMAAloYBH8AAlTnAAJaaCAAIFsAAlVkuwABXoMAArBfAAKwwFsAAlWgurvnAAKwXwACsLxbAAJV4Lq79wACsF8AArCsWwACVjS7AAENjwACsF8AArCYWwACVoi7AAENzwACsF8AArCgWwACVvC6sWMAArBfAAKwiFsAAldMurTnAAKwXwACsMRbAAJXpLsAATM7AAKwXwACsNABKwACWCgEcwACWG4PAAJYRwFQoZcAAX2QDAAGAwACWMsBUJ+8CwABfZYHAAJZPwFQn/MAAX2aCwACWacBUKA3AAJaYBsAArFqB8MAAln/AAJaQwACX4wAAwABmPsAArBcAAAABA8AAlqvAAJfjAAAAAQEBwACWuAAAAMAAXp5gsK0AAF3AAPUdAWDAAKv2AT4CTsAAlu3AAJb3AAC222DAAJXrAR/AAJb9wACV/QYABhbAAJchLsAAV6DAAKwXwACsMBbAAJcwLqtzwACsF8AArCAWwACXSS6u+cAArBfAAKwvFsAAl1kurFjAAKwXwACsIhbAAJdwLq05wACsF8AArDEWwACXhi7AAEzOwACsF8AArDQASsAAl6cBHMAAl7iBwACXrsBUKZ7AAF6lAgACgMAAl8bAVCl/KwDAAJX7BsAArFuB8MAAmGPAAJhqwACY+AAAwABmJMAArBcAAAABA8AAmHrAAJj4AAAAAwICwACYgwAAAICwYMAAiqEAwACYlwAAAIIaYMAAipcAAcAAmLEAAACTDWCwvwErYMAAq9UBPgFKwACYwQEfwACYzMAAq/oDAAKAwACY18BUKnuBwACY3cBUKooBkw2CwACY7MBUKpoGwACsXIHwwACZncAAmaLAAJsVAADAAGYNwACsFwAAAAEDwACZvsAAmxUAAAAAAAAAXAE+Ak7AAJnZwACZ3wAAjwBdwAD02wFgwACKoQEWwACaARbAAJnpLq8EwACsF8AArCzAAEN4wABi5kbAAJolwACaQcAAmjIAAACAsGDAAIqhAIDAAJo6wFQrFj4BRsAAmknAAJqvwACaWgAAAJMNYLCtABzAAJqHFsAAmm8urwTAAKwXwACsLMAAQ3kBAAGBwACaqMBUK1QAwABi4T4CTsAAmr/AAJrDAACZPGDAAKuPARzAAJrNFsAAmsUumnXAAKwXwACsOkQBAAGCwACazsBUK3cAwAD1YknAAJrgIRzAAJrog8AAmuTAVCuxQQEAASsAwAD10j0XwACa9YPAAJrxwFQrscAAQoopwACrpj8GwACsXYHwwACbGsAAmzXAAJ8YAADAAGYxwACsFwAAAAEDwACbU8AAnxgAAAAAAAAAXcAA9NsBYMAArBABPgVOwACbdcAAm4MAAMAAZhZgwACV/wEfwACbicAAlhgJAAkWwACbqy6sVcAArBfAAKwdFsAAm70uq3PAAKwXwACsIBbAAJvWLsAAV6DAAKwXwACsMBbAAJvlLq8JwACsF8AArCMWwACcBS6u+cAArBfAAKwvFsAAnBUurwTAAKwXwACsLBbAAJw2Lq8AwACsF8AArC0WwACcXi6sWMAArBfAAKwiFsAAnHUurTnAAKwXwACsMQBOwACckMAAnJsAAMAAZkFgwAD2XQEcwACcrBbAAJylLq75wACsF8AArC/AAEqkAQABFsAAnNMWwACcwy6rc8AArBfAAKwgqNasrQDAAGxKTsAAnWjAAJ1vAADAAESkYMAAq0ABHMAAnXsWwACdcS7AAFfrwACsF8AArDbAAGYfAQABgcAAnYrAVC0VAMAArMxOwACdrsAAnbQAAI8AXcAA9NsBYMAAiqEBFsAAndYWwACdvi6vBMAArBfAAKwswABDeMAAYuZKwACd+gEcwACeB4PAAJ4BwFQtpYCfAQFgwACsEAE0wACeCwPAAJ4LwACfEwAAAAEBAcAAnhQAAACAsGDAAIqhAABgwACsEAE+A07AAJ4zwACeOwAAlDhdwAD2DgFgsK0BHMAAnl8WwACeRy6vBMAArBfAAKwswABDeQEAAYTAAJ6AwFQuDADAAGLhTsAAnpvAAJ6gAACCGmDAAIqXARzAAJ6wgMAAnqLAVCxhwABesQEAAYXAAJ7NwFQuJQDAAJYRSsAAnt0BH8AAnujAAKwWAwADhMAAnvnAVC4MgsAAnv/AVC1khsAAnwfAVC5mAADAAPTmBsAArF6B8MAAnx3AAJ8pwACnWQAAwABmNMAArBcAAAABA8AAnzXAAKdZAAAABAAABMAAn0MAAADAAGYzYMAA8rMBKsAAn2MAAADAAGY/YMAA8rMBKsAAn5gAAACECWCwngErwACfswAAAJk8YLCtAStdwAD1HQFgwACrvQE+BU7AAJ/LwACf0gAAlDpdwAD1HQFgwACrvQExwACf22DAAKu9AE/AAJ/kwACf6QAAAZS9YQZgsNFgwACKoWDAAIqhYMAA8rNgwADys2DAAPKzXAADwACf88AApkQAAAAGBgbAAKAAAAAAlERgsNEAwACgDwAAAICwYMAAiqEAwACgHQAAAMAAZcNgwACKoQDAAKA4AAAAwABfKmDAAPKzAMAAoEoAAADAAGXoYMAA8rMAwACgXAAAAMAAXyxgwADyswAAXAE+Ck7AAKB8wACgiAAAwABlxGDAAPR5AZNJwACgkxTAAKCXwFQv2wkAPgFJwACgriKAwACgssBULv8BIRzAAKDgFsAAoM8uwABDc8AArBfAAKwowABDVwEAAYbAAKD6wFQvrgDAAGKZPgE9FcAAoQ7AVDAUDJQ+Aj0VwAChOsBUMBQMHMAAoUYUwAChOsBUMBQMAF0BAAGVAMAA9Z5JwACiNSGBwACiOsBULxE+AT0VwACiYsBUMBQMHMAAom4UwACiYsBUMBQMAF0BAAGUAMAA9Z4/P07AAKKdwACiqQAAwABlxWDAAPR5AZNJwACitBTAAKK4wFQv7AoAPgFJwACizyKAwACi08BULv8BIRzAAKMBFsAAovAuwABDc8AArBfAAKwowABDWAEAAYbAAKMbwFQvrgDAAGKaPgE9FcAAoy/AVDDmDZQ+Aj0VwACjW8BUMOYNHMAAo2cUwACjW8BUMOYNAF0BAAGVAMAA9Z5JwACjdyGBwACjfMBULxE+AT0VwACjpMBUMOYNHMAAo7AUwACjpMBUMOYNAF0BAAGUAMAA9Z4/P07AAKPtwACj9wAAq6dgwABf4AEcwACkCBbAAKP5Lq8BwACsF8AArDKrqQEAASbAAKQVAYbAAKQVwFQvrmDAAGhvAMAAX9xOwACkMQAAAMAAZcZgwABWvQBJwACkTxbAAKRdFMAApFPAVDG4DgDAAEKBwABf5D4BPRXAAKSBwFQx/g8WwACkpBTAAKSawFQxuA4AkyXAAF/jP07AAKTOAAAAwABCYGDAAFa9AEnAAKTjFsAApPEUwACk58BUMbgOAMAAQoDAAF/xPgE9FcAApRLAVDJREBbAAKUsFMAApSLAVDG4DgDAAEJgwABf8j89HMAApVGEwAClSsBUL05PAQABH8AApVnAAKvUCQAJhsAApWrAVC+uh8AApXvAVC+7FMAApYvAVC/KCAAUwAClo8BUMBQMABTAAKW6wFQw5g0AFMAApdHAVC/9CwAUwACl78BUMf4PABTAAKYRwFQyURAAFsAApjQUwACmKsBUMbgOALKrwABf5gAAwAD1Lk7AAKZYwACmYAAAlolgwACsjAEfwACmZsAArJ0HAAcWwACmcy6sVcAArBfAAKwdFsAApn0ustPAAKwXwACsHxbAAKaaLqtzwACsF8AArCAWwACmqy6sWMAArBfAAKwiFsAAprouwABDY8AArBfAAKwmFsAApscurvnAAKwXwACsLxbAAKbPLq05wACsF8AArDEAPRzAAKbqhsAApuLAVDM1wABmSgQAAYXAAKb2wFQvdgPAAGYzgMAApxjAVC7/hAmCwACnL8BULyOZPIPAAKc9wFQvMcAArJdKwACnSAGEwACnT8BUL04GwACsX4HwwACnXsAAp3nAAKrXAADAAGYywACsFwAAAAEDwACnlcAAqtcAAAAAAAAAXcAA9NsBYMAArBABPgVOwACnt8AAp8UAAMAAZhZgwACV/wEfwACny8AAlhgJAAkWwACn7S6sVcAArBfAAKwdFsAAp/8uq3PAAKwXwACsIBbAAKgYLsAAV6DAAKwXwACsMBbAAKgnLq8JwACsF8AArCMWwACoRy6u+cAArBfAAKwvFsAAqFcurwTAAKwXwACsLBbAAKh4Lq8AwACsF8AArC0WwACooC6sWMAArBfAAKwiFsAAqLcurTnAAKwXwACsMQBOwACo0sAAqN0AAMAAZkFgwAD2XQEcwACo7hbAAKjnLq75wACsF8AArC/AAEqkAQABFsAAqRUWwACpBS6rc8AArBfAAKwgqNasrQDAAGxKTsAAqarAAKmxAADAAESkYMAAq0ABHMAAqb0WwACpsy7AAFfrwACsF8AArDbAAGYfAQABgcAAqczAVDUQAMAArMxOwACp7MAAqfIAAI8AXcAA9R0BYMAAiqEBJsAAqewBFsAAqgwWwACp9C6vBMAArBfA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wAD10sAAQRrAAEEzAD0cwABBOy7AAGbMAgACgMAAQUfAVOGggcAAQVTAVOGvAMAArhtJwABBYxzAAEF4FsAAQWcuwABmx8AArglBAQABKwDAAPXSPgFKwABBiQEjgcAAQZDAVOGvGsAAQZvAAK2bGsAAQajAAKN7AWDAAKOEP0AhHMAAQcUWwABBwS6CE8AArgdBAQABKwDAAPXSwABBwcAAQcwASsAAQdMBLgbAAK4VgfnAAEJmwABCb8AAQ3IAAMAAYz4AAAABA8AAQn3AAENyAAAAAQEBwABCgwAAAKnwYMAA8rMAAGDAAKOEAT4GQB7AAEKawACDYQIAAieZjhbAAEKrLmPAAK4EAMAAQprAAEKxAEAewABCv8AAg2ECAAInmowWwABC2hbAAELULmPAAK4Eg2abGwDAAEK/wABC3wA9HMAAQucuwABmzAIAAhbAAELzLmPAAK4EgMAAQvrAVOLsAMAArhtJwABDCRzAAEMeFsAAQw0uwABmx8AArglBAQABKwDAAPXSPgFKwABDLwEawABDNsAAo30/QCEcwABDVRbAAENRLoITwACuB0EBAAErAMAA9dLAAENRwABDXABKwABDYwEuBsAArhaB+cAAQ/zAAEQFwABFFAAAwABjQQAAAAEDwABEGcAARRQAAAABAQHAAEQfAAAAqfBgwADyswAAYMAAo4QBPgZAHsAARDbAAKOAAQABFsAAREsuY8AArgQAwABENsAARFEAQB7AAERfwACDYQIAAieajBbAAER6FsAARHQuY8AArgSDZpsbAMAARF/AAER/AD0cwABEhy7AAGbMAgACFsAARJMuY8AArgSAwABEmsBU5AsAwACuG0nAAESpHMAARL4WwABErS7AAGbHwACuCUEBAAErAMAA9dI+AUrAAETPARrAAETWwACtmz9AIRzAAET3FsAARPMughPAAK4HQQEAASsAwAD10sAARPPAAET+AErAAEUFAS4GwACuF4H5wABFosAARavAAEb2AADAAGNCAAAAAQPAAEXHwABG9gAAAAEBAcAARc0AAACp8GDAAPKzAABgwACjhAE+B0AewABF5MAAo4ABAAEWwABF+S5jwACuBADAAEXkwABF/wBAHsAARg3AAINhAgACJ4DWFsAARiEWwABGGy5jwACuBINmmxsAwABGDcAARiYAQB7AAEY0wACDYQIAAieajBbAAEZUFsAARk8WwABGSS5jwACuBINmmxuDZpsbAMAARjTAAEZZAD0cwABGYS7AAGbMAgACFsAARm0uY8AArgSAwABGdMBU5ScAwACuG0nAAEaDHMAARpgWwABGhy7AAGbHwACuCUEBAAErAMAA9dI+AUrAAEapARrAAEawwACtnD9AIRzAAEbZFsAARtUughPAAK4HQQEAASsAwAD10sAARtXAAEbgAErAAEbnAS4GwACuGIH5wABHc8AAR3zAAEhVAADAAGM8AAAAAQPAAEeVwABIVQAAAAEBAcAAR5sAAACp8GDAAPKzAABgwACjhAE+BUAiFsAAR70WwABHuBbAAEeyLmPAAK4EghebIJvSm6gBHsAAR8rAAINhAgACJ4PrFsAAR9ouY8AArgQAwABHssAAR+AAPRfAAEfoLoITHMAAR/wWwABH7i6SRMAArgWTFwEAARbAAEgBLmPAAK4EAMAAo5nAAK4HPRzAAEgNLsAAZswCAAIWwABIGS6CE8AArgeAwABIHsBU5noAwACuG0AhHMAASDgWwABINC6CE8AArgdBAQABKwDAAPXSwABINMAASD8ASsAASEYBLgbAAK4ZgfnAAEjRwABI2sAASmQAAMAAY0AAAAABA8AASPjAAEpkAAAAAQEBwABI/gAAAKnwYMAA8rMAAGDAAKOEAT4IQB7AAEkVwACjgAEAARbAAEkqLmPAAK4EAMAASRXAAEkwAEAewABJPsAAg2ECAAInXBbAAElSFsAASUwuY8AArgSDZpsbAMAAST7AAElXAEAhHMAASXMWwABJZS6SRMAArgVBAQABGsAASXbAAKN8AMAA9dLAAEllwABJhgA9F8AASY4ughMcwABJohbAAEmULpJEwACuBZMXAQABFsAASacuY8AArgQAwACjmcAArgc9HMAASbMuwABmzAIAAhbAAEm/LoITwACuB4DAAEnEwFTnigDAAK4bScAASdQiIiGAwABJ2cBU54oAIR7AAEnmwACtpgEAARbAAEn4FsAASfQughPAAK4Hg2abGwAAHMAAShIWwABKAS7AAGbHwACuCUEBAAErAMAA9dI+AUrAAEojARrAAEoqwACjez9AIRzAAEpHFsAASkMughPAAK4HQQEAASsAwAD10sAASkPAAEpOAErAAEpVAS4GwACuGoH5wABLHMAASyXAAE0XAADAAGM9AAAAAQPAAEs4wABNFwAAAAEBAcAASz4AAACp8GDAAPKzAABgwACjhAE+CU7AAEtUwABLWgAAjzFgmwABFsAAS1wuY8AArgRJwABLZyEewABLbMAAg2ECAAIngTGBwABLesBU6VEAPgJAFsAAS5eBwABLkcBU6VGcIpsRwABLkcAAS6wAPYnAAEu1wFTpURbAAEvDgcAAS73AVOlRg2abGz9AHsAAS9rAAINhAgACJ4ExgcAAS+jAVOlRAMAAS9rAAEvuAEnAAEv1FsAATAQWwABL/4HAAEv5wFTpUYNmmxucIpsRPgE9icAATCPAVOlRFsAATDGBwABMK8BU6VGDZpsbPz0XwABMQi6CExzAAExWFsAATEgukkTAAK4FkxcBAAGBwABMW8BU6VEAwACjmcAArgc9HMAATGcuwABmzAIAAhbAAExzLoITwACuB4DAAEx4wFTpOADAAK4bScAATIciIiGAwABMjMBU6TgAIR7AAEyZwACtpgEAARbAAEyrFsAATKcughPAAK4Hg2abGwAAHMAATMUWwABMtC7AAGbHwACuCUEBAAErAMAA9dI+AUrAAEzWARrAAEzdwACjez9AIRzAAEz6FsAATPYughPAAK4HQQEAASsAwAD10sAATPbAAE0BAErAAE0IAS4GwACuG4H5wABNHMAATSHAAFIKAADAAGbMAAAAAQPAAE0swABSCgAAAAICAsAATTMAAACPMWCbAADAAE0/AAAAqfBgwADyswAAXAE+A0nAAE1PHsAATVPAAINhAgACJ4DWFsAATWeAwABNYcBU6z+DZpsbAD4CPRfAAE12LsAAZsWAwABNi8BU6z/AAK4GPRfAAE2YLoITiMAATZ7AVOs/FsAATayAwABNpsBU6z+DZpsbwACuBz89iMAATbzAVOs/FsAATcqAwABNxMBU6z+DZpsbQUPAAE3UHsAATdvAAINhAgACJ5qMgMAATfDAVOs/AD4OTsAATgbAAE4YAADAAGbNYJsAAYDAAE4awFTrPz2IwABOZMBU6z8cwABOjx7AAE5swACjggIAAoDAAE6CwFTrPykAkxcBAAGAwABOlMBU6z8AwACjmT2IwABOosBU6z8WwABOsIDAAE6qwFTrP4NmmxtJwABOvCEewABOwcAAg2ECAAIng5yAwABOz8BU6z8APgFCwABO4QA/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AKvrwABl0cAAq+BEAQABHMAArrQWwACuqRTAAK6iwFWIJwABYMAAq+vAAGXSwACr4oFBAQABlADAAPWfAMAA9SyAsMAAq9gBYMAAiqE9HMAArtOBwACuycBViEuAsgIAAh7AAK7UwACIOAEAARbAAK7kFsAArt4urwzAAK6vwABKJcAAa+AAHsAArwfAAIg5AQABg8AArxTAVYpcAADAAPVjP0nAAK9wIiEcwACvkhbAAK97FMAAr3TAVYgnAAFgwACr65THwACr5EEBAAGUAMAA9ZwBgsAAr5rAVYmTPgE9HMAAr7qBwACvsMBViEuAsgIAAh7AAK+7wACIOAEAARbAAK/LFsAAr8UurwzAAK6vwABKJ8AAa+EAHsAAr/TAAIg9AQABFsAAsAUUwACv/sBViCcAAWDAAKvrlMfAAKvkAADAAPVjP07AALA/wACwTQAAwABUU2DAAIqXARzAALBbLsAAZ57AAK5/AQABFMAAsIHAVYgnAAFgwACr6wDAAK7RScAAsPEiISXAALEDg8AAsPXAVYwdYMAAi/YBgsAAsRnAVYmTPgE9HMAAsTmBwACxL8BViEuAsgIAAh7AALE6wACIOAEAARbAALFKFsAAsUQurwzAAK6vwABKKcAAa+IAg8AAsWHAVYwdAMAA9WM/Pz9KwACxjQGBwACxlMBViEsGwACuzoH9wACyOcAAskbAAL5AAADAAGdVAAAAAQPAALJVwAC+QAAAAAIBAcAAsl8AAACDdWDAAKtKAAHAALJvAAAAwABnPmDAAPKzASpgwACJgAE+D07AALKfwACyrAAAwABnn13AAPUdAWDAAImAATHAALKuYMAAiYAATsAAssnAALLUAADAAGegXcAA9R0BYMAAiYABMcAAstZgwACJgABOwACzO8AAs0IAAMAATZpgwACu4QEfwACzRMAAruwAAAAATsAAs2TAALN2AADAAGehXcAA9g4BYMAAq48BHsAAs3jAALsfAAFgwACrjwAARsAAs4PAALOvwACzkAAAAIQJYMAAq3YAFsAAs6SAwACzm8BVjQOELMAAq00+AT0cwACzyYXAALO3wFWNnICZAQABHMAAs+sWwACz2IbAALPQwFWN0ZQ4wACre4EnAQABNMAAs/IDwACz8sAAtCMAAAABAQHAALP5AAAAmTxgwACrjwAAYMAA8rMBSsAAtAEB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0tXAAIv9AAAAAEnAANLtFsAA0viFwADS8cBVoEvAAF9mwACr4T4BPRXAANMQwFWjWQ0cwADTPS7AAGeewACufwEAAYXAANNjwFWgSwDAAK7RP07AANN/wADTigAAwABl0mDAAIwUAR7AANOMwACIPQEAARbAANOdhcAA05bAVaBLwABl0sAAq+IAScAA07EWwADTvIXAANO1wFWgS4PewACr6D4DScAA09AiIiIcwADT6xTAANPUwFWjMgwAgUoBAAGVAMAA9acAHMAA1BAWwADUCYbAANP/wFWgZFrAAPVMQQEAAZQAwAD1nAAlwADUQxTAANQkwFWjWQ0AYMAAi/YAHMAA1HYWwADUa4XAANRkwFWgS8AAZdLAAKviQQEAAZMAwAD1nD4FT8AA1IjAANSVAAABp/VhAWDAAPR5YMAAiYAAA8AA1JvAANazAAAAAQEBwADUoAAAALKYYMAA9HkAAGDAAImAAT4CTsAA1PDAANT4AADAAGe3YMAA9l0BHMAA1RGCwADVCsBVn+rAAEkyAgACJMAA1SgCJ8AAZ7gUwADVIcBVpMMQACTAANVIAifAAGe5FMAA1UHAVaTDEAAAwACu6UrAANVXARzAANVkGsAA1WHAAIg2klACAAInwABnujLAANW5YMAA9l1gwAD1xQUnwABntxTAANXUwFWk3BEAJ63phMAA1fjAVaA8J8AASjIewADWH8AAiDkBAAEWwADWM4XAANYswFWgS8AAZdDAAKvfACeAsBbAANZjh8AA1lfAVaCKgLbAAPUDJ8AAZ7sWwADWi4XAANaEwFWgS5TdwACr4wDAAI0FTsAA1sTAANbSAADAAGe8YMAAiqEBFsAA1t6GwADW1MBVoGSAtsAA9QNJwADW8BzAANcCFMAA1vTAVaXeEABBAQABFsAA1wUuwABnOcAArrkAwAD10krAANcQARzAANcdFMAA1xfAVaSeDwAgAQABkwAAP0nAANcsHMAA1z4UwADXMMBVpd4QAEEBAAEWwADXQS7AAGc6wACuugDAAPXSSsAA10wBHMAA11kUwADXU8BVpJ4PACABAAGUAAA/ScAA12gcwADXehTAANdswFWl3hAAQQEAARbAANd9LsAAZzvAAK67AMAA9dJKwADXiAEcwADXlRTAANePwFWkng8AIAEAAZUAAD8/TsAA17HAANe5AADAAGe3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VcY8AAbAAK7cgf3AARAWwAEQKMABEk4AAMAAZ+cAAAABA8ABEDTAARJOAAAAAQEBwAEQPQAAAJ2xYMAAqysAAF3AAPUdAWDAAIxJAT4ITsABEF7AARBuAADAAGfoXcAA9R0BYMAAjEkBMcABEHBgwACMSQBPwAEQecABEIUAAAHAAGfpYQJgwACKl2DAAPZdYMAAjEkAA8ABEJHAARD6AAAAAgICwAEQoAAAAJHwYMAAipcAwAEQsQAAAMAAXehgwAD2XQAAYMAAjEkBPgFKwAEQwQEfwAEQzMAAjFUCAAIewAEQ2MAAiDgBAAGEwAEQ4sBVx0wAg8ABEOvAVcc9AE7AAREFwAERDgAAwABn6mCvLQEWwAERJRbAAREYgMABERDAVcbIwABlncAAqz2q88AAq0xOwAERQ8ABEUwAAJHwYMAAipcBHMABEVaAwAERTsBVxsjAAGWZAQABg8ABEWzAVceZAMAAqzg9HMABEYuBwAERe8BVxudPAQABHMABEZuCwAERj8BVxxEgAgAChMABEZzAVcfNGsABEabAAJdvAAAAwAD1Lk7AARHEwAERygAAlQhgwACKlwEcwAER1IDAARHMwFXGyMAAZZoBAAGDwAER78BVx5kAwACrOT0cwAESDoHAARH+wFXG508BAAEcwAESHoLAARISwFXHESACAAKFwAESH8BVyEEawAESJsAAl3AAAADAAPUuSsABEjQBgcABEjvAVcbnBsAArt2B/cABEnXAARKCwAEXsgAAwABnXgAAAAEDwAESlcABF7IAAAACAgLAARKlAAAAnbFgwACrKwDAARLDAAAAwABnCGDAAK7zAABgwACJgAE+Ck7AARLxwAES+QAAwABKhl3AAPUdAWDAAIxJATHAARL7YMAAjEkAScABEwQWwAETGBbAARMQgMABEwjAVcjvwABllsAAqzKDaMAA9XQ+AT0cwAETP4LAARMswFXJGYCZAQABHMABE0YuwABn0AEAAYHAARNswFXI/gDAAK7YAMAA9S8/ScABE48hHMABE7AWwAETm4DAAROTwFXI78AAYJDAAKszQQEAASsAwAD10j4BPRzAARPJgsABE8HAVckZTwEAAR/AARPRwACMVQIAAh7AARPowACIOAEAARrAARPywACXeQAWwAEUFIDAARQMwFXI78AAYJDAAKszAADAAPUuPz0c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AIIFi7GLwoxiAACCDwEai7LAAO5LAAABA4vHjGIAAAAAAAAAXAE+BUmL0BaL1C7AAGiEwACv68AAr/xKi98APz0Xi+suwABohMAAr+spwACv/D0cjA0WjAIuwABog8AAr+vAAK/7gg8AAAAAwADBVD0cjCUWjBouwABogcAAr+vAAK/5TwEAARaMQBaMOhaMKS7AAGiCwACv68AAr/qAisAAsFKD+sAAr9oAwADBUz0cjFcWjEwuwABogcAAr+vAAK/5gg8AAAAAwADBVAAAVkBLAFZA1ABWQaAAVkJxAAAAAwAAAYIFAFZCiABWOoIAVj1YAFZChgAAAAIAVkKIAAAAAADAALADAIIGAAAGgNoAAMAAvwAAAIDxAADAAM2SAACBDAAAwACv1wAAgSIAAMAAr+IAAIE2AADAALBYAACBTwAAwACwcAAAAAAAAgLAALAJggaD1IPahLYDwABoiAAAAWDAAK/jAAABBMAAsAuCBoQFhCIJwABoewEag/DAAO5LYMAA9HkBHIQUNxCDPgEAARqEFsAAsHQAwAD1oAEFwACwEIIGhCeEJ4QuAICowACwAwADhCyELgAAAAAAAABgwACwCQE/AQkBhCfAAK/qAAAAAAEGwACwDYIGhDOEUoS0AACr6AEahDTAAO5LAAABA4RohLQAAAABAQGEdgAAIIQBXcAA9isBYMAAr9gAAGDAAMEjAUqEhQEfhInAAME9AQABH4SlwACwFwEAAYCErsBWQ6EAAAAAVkN6AFZD3AAAAAECwACwEYIGiiOKKY7ZA8AAaIkAAAFgwACwWQAAAQTAALATggaKWYpzCZIZARqKSMAA7ktgwADcOAEeimbAANw8AQABlwABBcAAsBeCBop4iniLMQAAAAOKgIsxAAAAAQEBio4AAACEAV3AAPYrAWDAAK/YAABgwACwEQE+BD0ciskWisMukhnAALATgLICAAKTOcAAaIoAwAD1LT0ciuUWit8ukhnAALATgLICAAKUOcAAaIsAwAD1LT0ciwEWivsukhnAALATgLICAAKVOcAAaIwAwAD1LT0cix0WixcukhnAALATgLICAAKWN9AyVHYAwAD1LQEJAIqWwACwbwMAAoCKnMBWREo3EAHAAGiNGoq1wADb7AEGwACwFYIGizaLR47XAADAAGiOARqLN8AA7ksAAAEDi1GO1wAAAAEB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giWdjZ2SncUAAMAAahfAALHJAAAAAQOdn53FAAAAAQEBnbYAACCBiV3AALPQAV8AAAAAXAE+AAbAALKmgiWd5Z3rns4AAMAAahjAALHJAAAAAQOd+Z7OAAAAAAAAAGDAAPN+AT4DSZ4CFp4GLrCowACykD4BSp4YAR+eI8AA9BkBAAEnwABqGQA/QBaebS7AAGoMwACxycAAspaebZ58AEqegwEfno7AAPQZAQABJ8AAahoABsAAsqyCJZ7TntifLAAATwAAAAEDntufLAAAAAEBAZ7eAAAgEl8AAAAAXAE+Akme6iEWnu8uwABqDcAAscnAALKXPTCe/RyfAy7AAGoYwACxyQAAAADAALKmPz0cnxkuwABqG8AAsckBAAGAnyPAVw5fAMAAtOcGwACyrYIlnzGfNqCqAACazgAAAAEDnz6gqgAAAAIBAp9GAAAAguhgwAD1xQCfWQAAAJXUYMAA9jEBKwBcAT4FPYifbMBXDtcen3TAALINAQABgJ+CwFcO1wBJn44hFp+TLsAAag3AALHJwACylz0wn6Ecn6cuwABqGMAAsckAAAAAwACypj9On8if1AAAlBdgwAC20wEcn+Man9vAALckwABqHAIAAoCf8cBXDteBn/jAVw7kAMAAtzpJoAkhHKAZgqANwFcPP0EBAAErAMAA9dI+Aj2IoCrAVw7XHqAywACyDQEAARagTIKgQMBXDz+C6MAAttUAPYmgWsBXDuQWoHOCoGfAVw8/ldTAALbWPz0coIkuwABqHcAAsckCAAKAoJTAVw7XgaCbwFcO5ADAALToBsAAsq6CJaCvoLahugAAgg8AAAABA6C7oboAAAAAAAAAXcAAsuoBWwE+BkmgxBagyC6wqMAAspA+AkAhHKDtFqDhLsAAagXAALHJwACyiEEBAAErAMAA9dKg4aD0AEqg/QEWoQQuwABqBcAAscnAALKIP0mhGyEWoSAuwABqDcAAscnAALKXPTChLhyhNC7AAGoYwACxyQAAAADAALKmPz0XoUouwABc5MAAsckcoVEWoUouwABc5MAAscnAALKEgN8BAAEaoVTAALKCAMAA9JLAALKETqFuoXkAAMAAah5dwACy6gFbARyhey7AAGoOwACxyQAAAADAALKfPRyhlC7AAGofwACxyQAAAADAALTpSqGlAYChrMBXEMAGwACymYIlob+hyqHlAQC8UQAAAAEDoc+h5QAAAAAAAABdwACy6gFbAUqh0gEcodIuwABqDsAAsckAAAAAwACynwbAALKvgiWh6qHxovMAAJrQAAAAAQOh+qLzAAAAAgEBogUAACCBhl3AALOZAV8AAAABohMAAADAAGnCYMAA8rMBK13AALLqAVsBPgRJoikhFqIuLsAAag3AALHJwACylz0wojwcokIuwABqGMAAsckAAAAAwACypj89F6JYLsAAXOTAALHJHKJfFqJYLsAAXOTAALHJwACyhIDfAQABGqJiwACygwDAAPSSwACyhD0XonguwABqBMAAsckfoo7AALTWAwFfAAADLoCipMBXEWc1AAAAAQBgwADyswGBoqzAVxF5IxyiuoIAwFcSGEEBAAErAAAqggDAVxIYAWDAAPKzAMAAsodKoskBFqLgFqLQLsAAagTAALHJwACyh8AAaiDAALTNBsAAsqeCJaMvozSjWgAAqx/AALHJAAAAAQOjOKNaAAAAAQEBozsAACASXwAAAABcAT4BPRyjRy7AAGobwACxyQEAAYCjUcBXEpAAwAC05wbAALKogiWjX6Nko7oAAMAAaiHAALHJAAAAAQOjbaO6AAAAAgICo3UAAACC6GDAAPXFAKOHAAAAldRgwAD2MQAAXAE+AT0co5kuwABqHcAAsckCAAKAo6TAVxLhgaOrwFcS7gDAALToBsAAsqmCJaO/o8SkdAAAwABpVMAAsckAAAABA6PKpHQAAAAAAAAAXAE+BUAWo9ouwABqDMAAscnAALKWo9qj6QBOpACkCQAAwABqIl3AALTLAVsBFqQLLsAAagTAALHJwACyhz0XpCAuwABqBMAAsckrwACyhz0XpDwuwABc5MAAsckcpEMWpDwuwABc5MAAscnAALKEgywBAAEcpEYapEfAALKDkpUAAAAAwAD0lADAAPSRwACyhD0cpGaApF3AVxNlwABp1gAAAADAALTUBsAAsqqCJaSOpJOqDQAAwABqI8AAsckAAAABA6Sjqg0AAAABAQGksAAAAIVbYQFdwAC07AFfAABcAABcAT4ISaTsFqTwLsAAafnAALHJwACylT4BPTClAx+lDcAA9BkBAAEnwABqJAA/SaVuFqVyLsAAagrAALHJwACymEqlfAA/TqWwpbMAAKsDYMAA9HkBHKW9FqW2LsAAXOTAALHJwACyhIMsAQABGqW/wACygADAAPSRPRenIi7AAFzkwACxyRynKRanIi7AAFzkwACxycAAsoSDgwEAARynPBqnLMAAsoCA3wEAARqnPsAAsoEAwAD0kgDAAPSTwACyhE6na6d4AACBiV3AALJmAV8AAAEWp3ouwABqAsAAscnAALKFQ6eSIRynpoKnmcBXFPBBAQABKwDAAPXSPgFJp7ccp8iCp7vAVxTwwABp9sAAsckBAAGBp9bAVxR0AMAAsnE+Bz01AAAAAQBdwACyZgFfAAABgqflwFcU8Ben8oOn8sBXFVTAAGnywACxyRyn/han8oOn8sBXFVTAAGnywACxycAAsmyA3wEAARqoGMAAsmoAwAD0ksAAsmw9HKg1gKgvwFcUGCABAAGCqDbAVxTwAAA9HKhagqhNwFcU8MAAafjAALHJAAAAAMAAsnJOqI6okwAAg2ZdwACyZgFfAAABFqiigqiVwFcU8MAAafPAALHJwACybUmosRaowoKotcBXFPDAAGn7wACxycAAsnk+AT0cqOIuwABqEcAAsckBAAGCqPLAVxTwAMAAsqE/PTUAAAABAF3AALJmAV8AAAGCqRPAVxTwF6kghKkgwFcWQMAAafLAALHJHKksFqkghKkgwFcWQMAAafLAALHJwACybIMsAQABHKkvGqlHwACyapKVAAAAAMAA9JQAwAD0kcAAsmw9iqlewFcU8IOpbcBXFd4+AT2KqYrAVxTwFqmmgqmZwFcU8MAAafPAALHJwACybT0Xqb8uwABc5MAAsckcqcYWqb8uwABc5MAAscnAALKEgywBAAEcqckaqcrAALKBkpUAAAAAwAD0lADAAPSRwACyhEmp3hap4i7AAGoKwACxycAAspg+AT0cqfQuwABqFcAAsckAAAAAwACyqz8GwACyq4IlqhKqF6rpAADAAGoVwACxyQAAAAEDqiSq6QAAAAAAAABcAT4DQBaqNC7AAGoKwACxycAAspiqNKo8AEmqQyIWqkcusKjAALKQABaqXxaqUy7AAGoFwACxycAAsojAAGolwACxycAAs2M+AT0cqrAWqqQuwABqBcAAscnAALKIwABqJsAAsckBAAErAMAAs34/PR6q0MAAshMBAAEWqtwuwABp4MAAsooAAABXArYAVwL+AFcDRgBXA44AVwPWAFcEFABXBFIAVwSvAFcE3QBXBRsAVwWQAFcF8wBXBlYAVwaqAFcHMQBXB38AVwjoAFcKowBXDBoAVw1LAFcNhwBXDcMAVw5AAFcOtwBXD+oAVxEGAFcRRwBXEmwAVxK7AFcTIwBXE/IAVxc/AFcX7gAAACACwACysoIlqu6q9LDQA8AAaicAAQAAgf1gwAD1xQFbAV3AALJ8AV8AAAABXcAAtDcBXwAAAAEFwACyvYIlq26rbqvQAAAAA6uMq9AAAAACAgKrkgAAAMAAad5hAFwAq6MAAADAAGngYQBcAABdwACysgFfAAABPwEJAKu3wACysQIAAoCrvcBXGMiBq8fAVxjVAAUGwACytYIlq/Sr/awtAQDAAGoNwACxyQAAAAEDrAqsLQAAAAAAAABgwADyswFKrA0BIhisE8AAag3AALHJwACylwAhFqwkLsAAafnAALHJwACylQbAALK4giWsMqwyrO0AAMAAahjAALHJAAAAAQOsQKztAAAAAAAAAGDAAPN+AT4CSaxJFqxNLsAAafnAALHJwACylT4BSqxgAR+sa8AA9BkBAAEnwABqJAA/SqzMAR2s2cAAahjAALHJAAAAAMAAsqYGwACyuYIlrPKs967RAADAAGobwACxyQAAAAEDrQCu0QAAAAEBAa0DAAAgEl8AAAAAXAE+A0mtDxatEy7AAGoKwACxycAAsphKrR0AP0mtKRatLS7AAGoLwACxycAAspQ+Bj0XrUYuwABc5MAAsckcrU0WrUYuwABc5MAAscnAALKEgN8BAAEarWvAALKBAMAA9JLAALKETq2aracAAIGJXcAAsmYBXwAAARatqS7AAGoCwACxycAAsoU9HK3Qga3DwFcaZasfwACxyQEAAYCt1cBXGfMAwAC1Az0XreIuwABc5MAAsckcrekWreIuwABc5MAAscnAALKEgywBAAEcrewargjAALKBkpUAAAAAwAD0lADAAPSRwACyhEmuHRauIS7AAGoKwACxycAAspg+AT0crjUuwABqFcAAsckAAAAAwACyqz9KrlQAPz0crmYuwABqI8AAsckBAAE0rncDrneuzAAAAAEBAa6YAAAAgYldwAC07AFfAAAAAGDAAPWCAT4BPRyuu4GursBXGzerH8AAsckBAAGArsDAVxnzAMAAtQMAwACyqgbAALK6giWu1q7br6gAAMAAah3AALHJAAAAAQOu5a+oAAAAAgICru0AAACC6GDAAPXFAK7/AAAAldRgwAD2MQAAXAE+AkmvERavFS7AAGoKwACxycAAsphKrx8APz0crysuwABqI8AAsckBAAE0rzwDrzyvowAAAAEBAa9dAAAAgYldwAC07AFfAAAAAGDAAPWCAT4BPRyvgIKvc8BXG/HAAGohwACxyQIAAoCvisBXG5yBr5HAVxupAMAAtQQAwACyqgbAALK7giWvra+ysM4AAMAAah/AALHJAAAAAQOvu7DOAAAAAAAAAFwBPgFJr8QhFq/JLsAAagrAALHJwACymD4BPRyv2y7AAGojwACxyQEAATSv7AOv7LBDAAAAAQEBsA0AAACBiV3AALTsAV8AAAAAYMAA9YIBPgE9HLAygLAlwFccmMAAaVTAALHJAAAAAMAAtQUAwACyqj4DQCEcsGwWsGAuwABqBcAAscnAALKIQQEAASsAwAD10rBgsHMAQBawjxawgy7AAGoFwACxycAAsojAAGolwACxycAAs2Owg7CbAD0csLAWsKQuwABqBcAAscnAALKIwABqJsAAsckBAAErAMAAs34AAFcZCgBXGV0AVxnNAFcbdgBXHDkAVx1CAAAABQLAALK+giWw07DZtUMDwABqKAABAACB/WDAAPXFAVsBXcAAsnwBXwAAAAAAAQXAALLFgiWxJrEmsYkAAAADsUWxiQAAAAICArFLAAAAwABp3mEAXACxXAAAAMAAaeBhAFwAAF3AALK+AV8AAAE/AQkAsXDAALKxAgACgLF2wFcdp4GxgMBXHbQAAwbAALLBgiWxrbGyspoAAMAAahvAALHJAAAAAQOxu7KaAAAAAQEBsb4AACASXwAAAABcAT4BRbHKAbHpsfYAAIGJXcAAsmYBXwAAARax+C7AAGoCwACxycAAsoUBIRyyIYGyFMBXHiJBAQABKwDAAPXSAYmyMsBXHiIWsk6BskHAVx4iwABp88AAscnAALJtPgE9HLJqgbJdwFceIsAAainAALHJAQABH7J6wAC1UwEBXwAAAYCyisBXHg8AAMAAtQkGwACywoIlsp+ypLO1AADAAGodwACxyQAAAAEDsq6ztQAAAAICArK2AAAAguhgwAD1xQCyyAAAAJXUYMAA9jEAAFwBPgFFstoBsvmzBgAAgYldwACyZgFfAAABFrMILsAAagLAALHJwACyhQEhHLMxgrMkwFce80EBAAErAMAA9dIBirNCwFce8xazXoKzUcBXHvPAAGnzwACxycAAsm0+AT0cs3qCs23AVx7zwABqKcAAsckBAAEfs4rAALVbAgACgLOYwFce0IGzn8BXHt0AAMAAtQkGwACyw4Ils7qzv7VBAADAAGofwACxyQAAAAEDs8i1QQAAAAAAAABcAT4BSbPRIRaz1i7AAGoKwACxycAAspg+AUWz6AG0B7QUAACBiV3AALJmAV8AAAEWtBYuwABqAsAAscnAALKFASEctEGAtDTAVx/EQQEAASsAwAD10gGItFTAVx/EFrRwgLRjwFcfxMAAafPAALHJwACybT4BPRy0joC0gcBXH8TAAGopwACxyQEAASC0oMAAtWQAAAAAAMAAtQk+A0AhHLTfFrTTLsAAagXAALHJwACyiEEBAAErAMAA9dK007TmAEAWtQIWtPYuwABqBcAAscnAALKIwABqJcAAscnAALNjtPa1DgA9HLUjFrUXLsAAagXAALHJwACyiMAAaibAALHJAQABKwDAALN+AABXHekAVx6qAFcffwBXILIAAAADAsAAssaCJbcktyq8jQPAAGoqAAEAAIH9YMAA9cUBWwFdwACysgFfAAAAAV3AALTkAV8AAAEEwACyyYIlt663tljAAFnAwACxyQBdwAC1eAFfAAABKwEFwACy1YIlt7u3u7gbAAAAA7fXuBsAAAACAgK33QAAAMAAad5hAFwAt+4AAADAAGngYQBcAABdwACyxgFfAAABPwEJALgCwACyvQIAAoC4CMBXITiBuBLAVyFFAAYGwACyzIIluCC4KbhdAQDAAGorwACxyQAAAAEDuDW4XQAAAAAAAABgwADyswFKuDgBIiEcuEEWuDguwABZwMAAscnAALLJQQEAASsAwAD10gAhFrhWFrhNLsAAWcDAALHJwACyyYD8wAC1fQbAALLPgiW4YrhnuNcAAMAAaizAALHJAAAAAQO4d7jXAAAAAQEBuIYAAACacl3AALVGAVsAAFwBPgI9Ixy4nBa4ky7AAFnAwACxycAAsslBAQABKwDAAPXSF7iTLsAAWcDAALHJH7ikwAC1gwABXwAAAADAALLJKwFdwAC1eAFfAAA9HLjJFrjALsAAWcDAALHJwACyyU8BAAGAuM3AVyILAMAAtX8GwACy0YIluNy44bmwAABPAAAAAQO45LmwAAAAAQEBuOcAACASXwAAAABcAT4DSbjzIiEWuPgusKjAALKQABa5BC7AAGn5wACxycAAspU+Aj0cuRcuwABqLMAAsckBAAEfuSzAALVTAQFfAAABgLk8wFciqgAAwACyz0q5SgA/PR25Yk8BAAGAuWbAVyKqAMAAsqxDuXEWuXguwABqK8AAscnAALLMPgE9HLmWFrmNLsAAWcDAALHJwACyycAAai0BAAEuAMAAtYAGwACy0oIlubW5urr1AACazgAAAAEDucK69QAAAAIBArnKAAAAguhgwAD1xQC53QAAAJXUYMAA9jEBKwBcAT4ESbnwIiEWufUusKjAALKQABa6AS7AAGn5wACxycAAspU+Aj0cuhQuwABqLMAAsckBAAEfuinAALVbAgACgLo3wFcjdIG6PsBXI4EAAMAAss9KulIAP0m6ZCEWumkuwABqDcAAscnAALK1PTC6dxy6fS7AAGoYwACxyQAAAADAALK4Pz0cupMuwABqHcAAsckCAAKAup7AVyN0gbqlwFcjgQDAALK6Q7q2Frq9LsAAaivAALHJwACyzD4BPRy62xa60i7AAFnAwACxycAAssnAAGotAQABLgDAALWABsAAstOCJbr6uwG8BgAAgg8AAAABA7sGvAYAAAAAAAAAXcAAsuoBWwE+BEm7DyIhFrsULrCowACykAAWuyAuwABp+cAAscnAALKVPgM9HLszLsAAaizAALHJAQABILtKwAC1ZAAAAAAAwACyzz0Xu2EuwABc5MAAsckcu2gWu2EuwABc5MAAscnAALKEgN8BAAEau4bAALKCAMAA9JLAALKESrubARi7qLxRwACymT9Ou7+7xgAAgRBdwACy6gFbAR27zoIPAAAAAMAAsq5AIRa74y7AAGorwACxycAAssy74rvuAEq79QGAu/zAVyUgBsAAstCCJbwLvBC8iwAAwABqFcAAsckAAAABA7wdvIsAAAAAAAAAXAE+Akm8Jha8Ki7AAGorwACxycAAssw+Aj0cvEgWvD8uwABZwMAAscnAALLJgdAAAAAAwAC1gT0XvFcuwABZwMAAsckrwACyyT89Hbx4wABqFcAAsckAAAAAwACyqwAAVyF6AFch5QBXIosAVyNUAFckbwBXJV8AVyXkAAAABgLAALLWgiaBkoG3gvIDwABqLgIagbfAAMT3IIG3wADybgEA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nNWdFgDAAGp1AAOc5p0WAAAAAgICnOkAAACAil8AAACc9QAABMAAal5gwAC3HgAAXcAAs1UBXwAAAT4BPRydAi7AAGp2wACxyQEAAYCdDMBXU/EAwACzcQIIAcAAs1+BAMBXU/wJAZzVwAD12wAAAAAFwACzi4IanRudG52jAMAAancAA50xnaMAAAACAQKdNgAAAILoWwCdSQAAAJXUYMAA9jEBKwBdwACzVQFfAAABPgE9HJ15LsAAajjAALHJAgACgJ2NwFdUa4GdlMBXVHQAwACzgAIIAMAAs18anWvAALckCQGdG8AA9dsAAAAABcAAs4yCGp3sneyeKACAigADnfmeKAAAAAEBAZ38AAAAgIpfAAAAAF3AALNVAV8AAAE/AQoAngrAALOKAgACgJ4UwFdU6BqeIMAAtyQAIgbAALNjghqeLZ42nmABAMAAaiXAALHJAAAAAQOeQ55gAAAAAAAAAGDAAPKzAUqeRgEcnk0WnkYuwABc5MAAscnAALNeQQEAARqeUMAAs1kAwAD1nAbAALNkghqeZJ5tnqIBAMAAanjAALHJAAAAAQOegJ6iAAAAAAAAAGDAAPKzAUqegwEcnooWnoMuwABc5MAAscnAALNeQQEAARqejcAAs1oAwAD1nAbAALNlghqepp6vnuEBAMAAannAALHJAAAAAQOev57hAAAAAAAAAGDAAPKzAUqewgEcnskWnsIuwABc5MAAscnAALNegUoBAAEanszAALNaAMAA9acGwACzZoIanuWe7p8TAQDAAGp6wACxyQAAAAEDnvmfEwAAAAAAAABgwADyswFKnvwBHJ8DFp78LsAAXOTAALHJwACzXkEBAAEanwbAALNbAMAA9ZwGwACzZ4IanxefIJ9EAQDAAGp7wACxyQAAAAEDnyyfRAAAAAAAAABgwADyswFKny8BHJ82Fp8vLsAAXOTAALHJwACzXoFIAQABGp85wACzXADAAPWpBsAAs2iCGp9In1GfcwEAwABqfMAAsckAAAABA59bn3MAAAAAAAAAYMAA8rMBSp9eARyfZRafXi7AAFzkwACxycAAs15BAQABGp9owACzXQDAAPWcBsAAs22CGp94n32f9wAAwABqfcAAsckAAAABA5+In/cAAAABAQGfkQAAAIL9XcAAs1UBWwAAXAE+A0AWn6YuwABqecAAscnAALNln6aftQA9F5+8LsAAXOTAALHJGp/FwACzW8AAs149F5/YLsAAanPAALHJgJ/twFdXO8AAs2AGwACzgoIan/ygBqIUAACBPAAAAAEDoA2iFAAAAQAAk9xgwAD1xQFbAgEBoBoAAACBKGEBXwAAXcAAsuYBXwEAAAGgMAAAAIF8YMAA9G8BK13AALLqAV8BAAE+A06gRaBRAADAAGp+YMAAtx4BGqBYwAC3JEmgZSEeoGrAAO5eAgACgqB0wFdX8hqggcAAsfoAPgI9iKCVwFdXwBygpYKgmcBXV/LAAGp/AQJdwACy5gFfAQBfAAABgKDLwFdXwADAALcySaDVIRyg4YGg2cBXV9dBAQABKwDAAPR0PgE9iaGawFdX1x6hpMAAsg4CAAKBobrAV1fXgqHDwFdX8gA/P0qh4wEcoeouwABqgMAAsckCAV8BAAKAogXAV1fAgaIIwFdX1wDAALNuBsAAs26CGqJCokyjHwAAwABqgMAAsckAAAABA6Jmox8AAAEAAIOTYMAA9cUBWwICAqJ6AAAAgShhAV8AAF3AALLmAV8BAACijwAAAIF8YMAA9G8AAF3AALLqAV8BAAE+A06iqaKwAACBEF3AALNVAV8BAAEforbAALOIAAFfAQAAAD0cosguwABqD8AAsckBAAEfotnAALNSAwJfAABfAQADgqL0wFdZIYCi/MBXWPCBov/AV1kGAADAALN1SqMOAYKjFcBXWSEGwACzg4IaoySjLqSrAACBggAAAAEDozikqwAAAAIBAaNCAAAAgXxgwAD0bwABo1EAAACT42EBW2DAAPKzAStdwACy6gFfAAABPgROo3CjdwAAgRBdwACzVQFfAAABH6N9wACziAABXwAAAABJo48hHqOUwADuXgIAAhajpYKjnsBXWdPAAGpewACxycAAs18ao6zAALH6AD4CPYijwMBXWaceo8rAALIOAgACgKPgwFdZpxaj8IKj6cBXWdPAAGpewACxycAAs18ASaP+IRykB4GkAsBXWbVBAQABKwDAAPXSPYmkEMBXWbUcpCQWpB6CpBfAV1nTwABqXsAAscnAALNfwABqfwECYMAA8rNbAYGkOsBXWbUAwAC3Mj8/PRykSy7AAGoPwACxyQEAAR+kXMAAs1MDAl8AAF8AAAOCpH3AV1nTgKSFwFdZp4GkjsBXWbUAAMAAs3VKpJoBgqShwFdZ0wbAALOEghqksKS6pdgAAIGPAAAAAQOkxqXYAAAAAQEBpM8AAACFW2EAWwAAXcAAsuoBXwAAAT4ETqTqpPEAAIEQXcAAs1UBXwAAAR+k98AAs4gAAV8AAAAASaUJIR6lDsAA7l4CAAIWpR+BpRjAV1skwABqXsAAscnAALNfGqUmwACx+gA+AT2IpTrAV1sLHKVQFqVKgaVDwFdbJMAAal7AALHJwACzX8AAaoEBAVsBgKVqwFdbCwDAALcxPz0cpX0uwABqD8AAsckBAAEfpY7AALNUAgJfAABfAAACgaWxwFdbJIClucBXWwsAAMAAs3VKpccBgaXOwFdbJAbAALOFghql3aXnphMAAMAAakkAAAABA6XvphMAAAAAAAAAXcAAs5kBXwAAAUql9QEepfnAALOfAQFfAAABLgAGwACzb4IaphimHaZ1AADAAGqCwACxyQAAAAEDpjCmdQAAAAAAAABcAT4CQBamQC7AAGolwACxycAAs2OmQKZMAD0XplMuwABc5MAAsckaplzAALNawACzXgbAALNwghqmeqZ/ptoAAMAAaoPAALHJAAAAAQOmlKbaAAAAAAAAAFwBPgJAFqakLsAAanjAALHJwACzZKakprYAPRemvS7AAFzkwACxyRqmxsAAs1nAALNeBsAAs2mCGqbfpu6nLwEAwABqhMAAsckAAAABA6b1py8AAAAAAAAAYMAAttMBPgJAFqcCLsAAanzAALHJwACzaKcCpwsASqcSASanEgEWpxkuwABqc8AAscnAALNgYMAAttMGwACzaoIapzSnQKeIAQDAAGqFwACxyQAAAAEDp02niAAAAAAAAABdwACzVQFbAT4CQBanWi7AAGp6wACxycAAs2anWqdkAEqnawEmp2sBFqdyLsAAanPAALHJwACzYF3AALNVAVsGwACzcYIap7anu6hMAADAAGp2wACxyQAAAAEDp8SoTAAAAAEBAafHAAAggIpfAAAAAFwBPgNAIRan3C7AAGp7wACxycAAs2en26fnAD0XqBQuwABc5MAAsckaqB3AALNcwACzXj0XqC4uwABqc8AAscmAqEPAV13HwACzYAbAALNyghqoUahWqPYAAMAAaobAALHJAAAAAQOoZaj2AAAAAQEBqHEAAACC6GDAALbTAABcAT4DQCEWqIYuwABqe8AAscnAALNnqIWokQA9F6i+LsAAXOTAALHJGqjHwACzXcAAs149F6jYLsAAanPAALHJgKjtwFdeRMAAs2AGwACzc4IaqPupAKlrAADAAGqHwACxyQAAAAEDqQmpawAAAAICAqkRAAAAguhgwAD1xQCpIwAAAJXUYMAA9jEAAFwBPgE9HKk1LsAAaobAALHJAQABH6lJwAC24AIAAoCpVMBXXsOBqVvAV17QAADAALNyBsAAs3SCGqn8qgGqrAAAwABqiMAAsckAAAABA6oNqqwAAAABAQGqFgAAAIL9XcAAs1UBWwAAXAE+BEAhFqosLsAAanvAALHJwACzZ6orqjcAQBaqTICqRcBXXzbAAGp7wACxycAAs2eqRapXAD0Xql4uwABc5MAAsckWqm6AqmfAV182wABc5MAAscnAALNewACzXj0XqnouwABqc8AAsckWqpaAqo/AV182wABqc8AAscnAALNgwACzYAbAALN1ghqqsaq2rZ4AAMAAag/AALHJAAAAAQOqwq2eAAAAAQEBqtMAAACj113AALMuAltbAABcAT4CQByrARaq84Cq6sBXX/HAAGpdwACxycAAsztBAQABKwDAAPXSquqrCABJqw8WqxMuwABqecAAscnAALNlPgI9F6s1gKsswFdf8cAAal3AALHJJqs1ARarRS7AAGpzwACxycAAs2BdwACzLgJbW8AAszs9F6tfLsAAanPAALHJgKt0wFdf8cAAs2A+A0mrkRarlS7AAGp6wACxycAAs2Y+A06sS6xSAACC/V3AALNVAVsBFqxULsAAaoXAALHJwACzakmsaiEWrHaBrG/AV2CnwABqe8AAscnAALNnPgI9HKyWgayPwFdgp8AAag/AALHJAQABgKyjwFdf8QDAALN1Sqy4AD89HKzSLsAAaojAALHJAQABgazfwFdgpwDAALN0P0AWrP0uwABqe8AAscnAALNnrP2tCAA9HK1GFq1ALsAAal7AALHJwACzX8AAaokBAAE0rVgDrVitkwAAAAAAAABgwAD1ggE+AT0erWXAALOBAgACLoCtgcBXX/EAAMAAtzsGwACzdoIaraOtqLGQAADAAGqKwACxyQAAAAEDrbmxkAAAAAEBAa3KAAAAwABhHF3AALMuAltbAABcAT4CSa3bHK3pgK3fwFdhrkEBAAErAMAA9dJKrfIAP0mt/hauAi7AAGp5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LgJbWz0cvK+BvKjAV2fSwABqfcAAsckBAAGAvLvAV2fDAMAAs209HLzRgLzKwFdnw8AAaorAALHJAQABgrzjwFdowwDAALN2BsAAs3uCGrz8vQG+cgAAwABqNsAAsckAAAABA70KvnIAAAABAQG9FwAAIICKXcAAsuYBXwAAAABcAT4CQCEWvSwuwABqe8AAscnAALNnvSu9NwBJvT4lvUiAvULAV2liXcAAsuoBXwAAPgFJvV4lvWgUvWLAV2liAAFdwACy6gFfAABdwACzVQFfAAA+AT0evYHAALN6AgACFL2SwFdpYgABXcAAs1UBXwAALgA+AT0evbfAALN5AgACFL3LwFdpYgABXcAAsuoBXwAALgA+A06+BL4OAADAAGEcXcAAsy4CW1sBHL4QLsAAao3AALHJAAAAAMAAs3c9HL4qLsAAanbAALHJAQABJr40AYC+NMBXaWJfAAAAwACzcT0evkLAALOBAgACLoG+XsBXag0ABsAAs3yCGr53vny/TgAAwABqQcAAsckAAAABA76Ov04AAAABAQG+kQAAIICKXwAAAABcAT4FQCEWvqYuwABqe8AAscnAALNnvqW+sQBAISW+xYC+v8BXapFdwACy6gFfAAC+v77SAE6+6r70AADAAGEcXcAAsy4CW1sBHL72LsAAao3AALHJAAAAAMAAs3c9HL8OLsAAanbAALHJAQABgL8YwFdqkQDAALNxPR6/JMAAs4ECAAIugb9AwFdq0wAGwACzfYIav1O/WMAAQC8AAMAAakDAALHJAAAAAQO/ZsAAQC8AAAACAQK/bgAAAILoYMAA9cUAv4EAAACV1GDAAPYxASsAXAE+BEAhFr+cLsAAanvAALHJwACzZ7+bv6cATr+/v8kAAMAAYRxdwACzLgJbWwEcv8suwABqjcAAsckAAAAAwACzdz0cv+MuwABqh8AAsckCAAKAv+3AV2tUgb/0wFdrYQDAALNzPR7AAEAFwACzgQIAAi6CwABAIcBXa4wABsAAs36CGsAAQDTAAEA5wABDlgAAwABqJsAAsckAAAABA8AAQEfAAEOWAAAAAQEBwABAVAAAIICKXcAAsuYBXwAAAABcAT4EQCEWwABAaS7AAGp7wACxycAAs2fAAEBowABAdABJwABC5iXAAELwgMAAQurAV2weXcAAsuoBXwAAPgI9HMAAQwYuwABqkMAAsckBAAEUwABDE8BXbB4AAV3AALLqAV8AAADAALN/SsAAQyEAPz0cwABDMy7AAGqCwACxyQAAAADAALNvPRzAAENUFsAAQ04uwABqXsAAscnAALNfwABqiQEAATTAAENmA8AAQ2bAAEORAAAAAAAAAGDAAPWCAT4BPRzAAENxLsAAakHAALHJAQABJsAAQ4QBgMAAQ4TAV2weXwAAAMAAs3wAwAC3OwbAALN/ghrAAEObwABDoMAARX4AAMAAapDAALHJAAAAAQPAAEOswABFfgAAAAEBAcAAQ7cAACCAil3AALLqAV8AAAAAXAE+AknAAEPEJcAAQ86AwABDyMBXbVRdwACzVQFfAAA+AknAAEPlFsAAQ+8UwABD6cBXbVQAAV3AALNVAV8AAMAAanzAALHJwACzaD4CPRzAAERJLsAAaoLAALHJAAAAAMAAs289HMAARG4WwABEaC7AAGpewACxycAAs1/AAGqJAQABNMAARIADwABEgMAARLcAAAAAAAAAYMAA9YIBPgE9HsAARI/AALN6AgACFMAARKDAV21UAAFdwACzVQFfAAAuAADAALc7PgE9HsAARNHAALN6AgACFMAAROLAV21UAAFdwACzVQFfAAAuAErAAET+AD89HsAARVrAALN5AgACgMAARW7AV21ULgAGwACzgIIawABFg8AARYjAAEZGAADAAGo4wACxyQAAAAEDwABFm8AARkYAAAACAgLAAEWcAAAAguhbAMAARa4AAACV1GDAAPYxAABcAT4DQCEWwABFyC7AAGp7wACxycAAs2fAAEXHwABF0wA9HMAARdsuwABqgsAAsckAAAAAwACzbz0cwABF/BbAAEX2LsAAal7AALHJwACzX8AAaokBAAE0wABGDgPAAEYOwABGQQAAAAAAAABgwAD1ggE+AT0cwABGGS7AAGpAwACxyQIAAoDAAEYowFdupYHAAEYvwFdusADAALN9AMAAtzsGwACzgYIawABGwMAARszAAF9tAAHAAGqRwACxyQAAAAEDwABG4cAAX20AAAACAgLAAEbqAAAAgv1dwACzVQFbAMAARwIAAADAAGEcXcAAsy4CW1sAAFwBPgFDwABHEylBPg1AFsAARzaAwABHL8BXb5LAAGp7wACxycAAs2fAAEcvwABHQQBOwABHT8AAR1gAAMAAapJgwADyswEWwABHYYDAAEdawFdvksAAanzAALHJwACzaEnAAEdyHMAAR4CBwABHdsBXb6NBAQABKwDAAPXSPgJJwABHk4LAAEeXwFdv6j4CTsAAR7jAAEfDAADAAGprYMAAttMBFsAAR8yAwABHxcBXb5LAAGqEwACxycAAs2k9HMAAR/oWwABH5YDAAEfewFdvksAAal7AALHJwACzX8AAapMCAAIWwABIGYPAAEgOwFdwSILowAC21RbAAEgrg8AASCDAV3BIldTAALbWAMAAtyg/SsAASEoAP0PAAEknIRzAAElGFsAASTiBwABJLsBXb6PAAGpdwACxycAAsztBAQABKwDAAPXSPgROwABJacAASXIAAKPXXcAAsy4CW1sBgcAASXTAV2+jPYnAAEmHwFdvoxbAAEmcg8AASZPAV3EEwABqXcAAscnAALM7PRfAAEm8g8AASbPAV3EEwABqXcAAsckrwACzOz0ewABJ2sAAs4ECAAKAwABJ8MBXb5KDwABJ+MBXcQQATsAASiHAAEoqAACj113AALMuAltbAYHAAEoswFdvo07AAEpDwABKUAABwABqaVsBFsAASlmAwABKUsBXb5LAAGpzwACxycAAs2BOwABMKMAATDkAAMAAapRgwADyswGCwABMO8BXb+pOwABMT8AATGQAAMAAapVbAYTAAExmwFdxoknAAE1ZIiKCwABNXcBXb+oBFsAATXKDwABNacBXcYPAAGpfwACzRwEWwABNi4PAAE2CwFdxg8AAamLAALNKPgpOwABNq8AATbAAAJ93YMAAtx4BFsAATbuDwABNssBXcYPAAGpewACxycAAs0JJwABNyiKCwABNzsBXb+oAIRzAAE3oFsAATeKAwABN28BXb5LAAGpewACxycAAs1/AAGqWAQABh8AATfjAV3JFAMAAtyk+A07AAE5MwABOVwAAwABqa2DAALbTARbAAE5ggMAATlnAV2+SwABqhMAAscnAALNpPRzAAE6OFsAATnmAwABOcsBXb5LAAGpewACxycAAs1/AAGqTAgACFsAATq0UwABOosBXcrkIAILowAC21RbAAE6/FMAATrTAV3K5CACV1MAAttYAwAC3KErAAE7WAD9OwABO9gAAAMAAapdgwAC3HgBJwABPByEewABPDMAA7l4CAAIawABPG8AAtySHwABPJMBXckUAPgE9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AAAAYMAA9YIBPgJJwACvtoLAAK+6wFe1Ez4CPRzAAK/cgMAAr9XAV7TewABqNsAAsckBAAGBwACv5sBXtQUAwACze0rAAK/7AD9LPgE9MMAAsCsewACwRsAAyCsAAAAAAQHAALBfWwHAALBmAAABgwZbAAHAALBpAAABhPtgwAD2MQA+AT0ewACwesAAsgsDAAOAwACwlcBXtN6EwACwncBXtrSFwACwoMBXtsAAwABpwinAALOnSsAAsN0BgMAAsOTAV7TeBsAAs8CCHMAAtVLAALVcwAC4mwAAkyMAAAABA8AAtWbAALibAAAAAgEBwAC1bAAAAJPjYQFfAABgwADyswABwAC1gAAAIJMkYQBfAAABK13AALLqAV8AAAE+BE7AALWcwAC1owAAgW1dwACzVQFfAAABH8AAtanAALOIAAFfAAAAAE7AALXLAAAAgYldwACz0AFbAD2LwAC13cBXt5UcwAC18S6BigQAATTAALYBA8AAtgHAALbyAAAAAQEBwAC2BAAAAICKXwAAAABgwAD1ggE+AT0ewAC2F8AAshcDAWDAAPKzAzTAALYkA8AAtiTAALY1AAAAAAAAAGDAAPKzAUrAALYqARzAALYugMAAtirAV7c8IAEAAYTAALYvwFe3zwAANMAAtjcDwAC2N8AAtrgAAAABAQHAALY9AAAAwABUkWDAAPKzAABgwAD1ggE+AUnAALZUhcAAtljAV7hJPgE9HsAAtnHAALIbAwADg8AAtoHAV7eVgsAAto/AV7duhMAAtpfAV7fPAD8ewAC2usAAshoCAAKDwAC20cBXt5WCwAC238BXt24AAAOBfBbAALcMgsAAtwXAV7duwABqQMAAscnAALN9gz80wAC3LAPAALcswAC4ZgAAAAAAAABgwAD1ggE+AknAALc7IRzAALdGgcAAtz/AV7dRQQEAASsAwAD10j4CPR7AALddwACyFwMBXwAAA4HAALdqwFe3URbAALd5gsAAt3LAV7duwABqNsAAscnAALN7FsAAt4uCwAC3hMBXt27AAGpAwACxycAAs30ASsAAt6gAP0s+AT0wwAC32B7AALfzwADIKwAAAAABAcAAuAxbAcAAuBMAAAGDBlsAAcAAuBYAAAGE+2DAAPYxAD4BPR7AALgnwACyCwMAA4LAALhCwFe3boTAALhKwFe5jIXAALhNwFe5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YMAA8rMBSsAASxoBIRzAAEs3HMAASyIWwABLGy7AAFzkwACxycAAtFSDLAEAARrAAEskwAC0TgDAAPSRQQEAAZMAwAD1nAbAALRfgh3AAEt0wABLfcAAS8sBAMAAauTAALHJAAAAAQPAAEuNwABLywAAAAAAAABgwADyswFKwABLlgEcwABLuhzAAEueFsAAS5cuwABc5MAAscnAALRUgywBAAEawABLoMAAtFAAwAD0kUEBAAEawABLvcAAtE0AwAD1nAbAALRlgh3AAEvQwABL2cAATAIBALCoAAAAAQPAAEviwABMAgAAAAAAAABgwADyswFKwABL5QEhHMAAS/4cwABL7RbAAEvmLsAAXOTAALHJwAC0VIMsAQABGsAAS+/AALRRAMAA9JFBAQABkwDAAPWcBsAAtGaCHcAATAfAAEwQwABMWwEAwABp5AAAAAEDwABMGcAATFsAAAAAAAAAYMAA8rMBSsAATCIBIxbAAEwiLsAAaefAALRkFsAATD4WwABMMC6bGcAAscnAALRjwABq5cAAscnAALUYIRbAAExQLsAAauPAALHJwAC0XgFgwADyswbAALRggh3AAExgwABMacAATJwBAMAAagzAALHJAAAAAQPAAEx5wABMnAAAAAAAAABgwADyswFKwABMfAEhHMAATJgcwABMhBbAAEx9LsAAXOTAALHJwAC0VIMsAQABGsAATIbAALRSAMAA9JFBAQABkwDAAPWcBsAAtGGCHcAATOjAAEzxwABNGQEAwABqDcAAsckAAAABA8AATP7AAE0ZAAAAAAAAAGDAAPKzAUrAAE0BARzAAE0JFsAATQIuwABc5MAAscnAALRUXAEAARrAAE0LwAC0UQDAAPWmBsAAtGKCHcAATqXAAE67wABPdwEAwABq5sAAsckAAAABA8AATsrAAE93AAAAAAAAAF3AALVlAV8AAAE+BEAWwABO1y7AAGrkwACxycAAtF/AAE7XwABO5gBJwABO7SEWwABO8i7AAGoMwACxycAAtGA+AUrAAE8LASbAAE8LARbAAE8SLsAAauLAALHJwAC0U13AALVlAV8AAD9OwABPScAAT08AAIHiXcAAtNcBXwAAASbAAE9JARbAAE9RLsAAauLAALHJwAC0U13AALTXAV8AAErAAE9fASbAAE9fARbAAE9sgMAAT2bAV+q0wABq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zwAAqx/AALHJAAAAAQOhIaHPAAAAAQEBoSQAACASXwAAAABcAT4DQCEWoTguwABohMAAscnAALUZoTehQQBJoUgWoUwuwABq48AAscnAALUaSqFZAD9JoWUWoWkuwABrFsAAscnAALUfPgE9HKF7LsAAahvAALHJAQABgKGFwFgqaADAALUKPgE9HKGfLsAAainAALHJAQABH6GvwAC1UwEBXwAAAYChv8BYKmgAAMAAtQkGwAC1BIIeodSh2aLPAADAAGohwACxyQAAAAEDoeKizwAAAAICAqHqAAAAguhgwAD1xQCh/AAAAJXUYMAA9jEAAFwBPgJJog4WohIuwABq48AAscnAALUaSqIfAD9JoisWoi8uwABrFsAAscnAALUfPgE9HKJBLsAAah3AALHJAgACgKJMwFgrKYGiU8BYKzYAwAC1Cz4BPRyilC7AAGopwACxyQEAAR+ipMAAtVsCAAKAorLAWCspgaK5wFgrNgAAwAC1CQbAALUFgh6i1KLZo5sAAMAAaVTAALHJAAAAAQOi36ObAAAAAAAAAFwBPgRAIRai8C7AAGiEwACxycAAtRmi76L5AEmjABajBC7AAGrjwACxycAAtRpKoxEAPz0Xox0uwABc5MAAsckcoyQWox0uwABc5MAAscnAALT7gN8BAAEaoyfAALTwAMAA9JLAALT7SaM6FqM+LsAAaxbAALHJwAC1Hz4BPRyjUC7AAGofwACxyQAAAADAALUMPgE9HKNwLsAAainAALHJAQABIKOCwAC1ZAAAAAAAwAC1CQbAALUGgh6kiaSOpLkAAMAAafzAALHJAAAAAQOklqS5AAAAAAAAAFwBPgFAFqSmLsAAauXAALHJwAC1GKSmpLQABsAAtQeCHqS+pMOk8AAAwABp/cAAsckAAAABA6TMpPAAAAAAAAAAXAE+AUAhFqTdLsAAauXAALHJwAC1GKTcpOsABsAAtQiCHqT1pPylNgAAwABq9sAAsckAAAABA6UFpTYAAAAAAAAAXcAAsuoBWwE+AkAWpRUuwABq48AAscnAALUapRWlIABKpScBKwbAALUJgh6l9aX6p0AAAMAAainAALHJAAAAAQOmBadAAAAAAQEBphQAAACacl3AALVGAVsAAFwBPgROpjamPgAAwABrGF3AALV4AV8AAAEmpjYBFqZALsAAWcDAALHJwAC0/V3AALV4AV8AAEmmThymWxamUi7AAFnAwACxycAAtP1BAQABKwDAAPXSPgE9iaZswFgtrRemdi7AAFnAwACxyR+mhcAAtYMAAV8AAAAAwAC0/T89HKavgaanwFgtrU8BAAGAprPAWC2YAMAAtX9Jpr8hFqbELsAAaivAALHJwAC1HT4CPRem2S7AAFzkwACxyRym4Bam2S7AAFzkwACxycAAtPuA3wEAARqm48AAtPUAwAD0ksAAtPtJpv0hFqcCLsAAaw3AALHJwAC1Hj4BPRynIBanFy7AAFnAwACxycAAtP3AAGsIAQABLgDAALVyPz8GwAC1CoIep2inbaiJAADAAGobwACxyQAAAAEDp3aoiQAAAAEBAad5AAAgEl8AAAAAXAE+CEAhFqeNLsAAauPAALHJwAC1GqeMp5gAQCEWp6cuwABrDcAAscnAALUep6ansABAIRanvy7AAGsQwACxycAAtRynvqfKAE6n1qflAADAAGsOYMAA8rMBFqfnLsAAauXAALHJwAC1GD0Xp/suwABc5MAAsckcqAIWp/suwABc5MAAscnAALT7gN8BAAEaqAXAALT0AMAA9JLAALT7PRyoIxaoHS7AAGpewACxycAAtPrAAGrBAgFfAAACFqgzLsAAawXAALHJwAC094CoPMBYLuwAwAC3Lz0XqEcuwABc5MAAsckcqE4WqEcuwABc5MAAscnAALT7gywBAAEcqFEaqFLAALT0kpUAAAAAwAD0lADAAPSRwAC0+z0cqGouwABrGcAAsckBAAGBqHbAWC9BAMAAtQ4GwAC1C4IeqI6ok61DAADAAGodwACxyQAAAAEDqJ2tQwAAAAICAqilAAAAguhgwAD1xQCotwAAAJXUYMAA9jEAAFwBPgZAIRao0S7AAGrjwACxycAAtRqo0KjcAEAhFqjrLsAAaw3AALHJwAC1HqjqqPQAQCEWqQMuwABrEMAAscnAALUcqQKpDgBOqRqpKQAAwABrDmDAAPKzARapKy7AAGrlwACxycAAtRhPqUCpRQAAAcAAaxphAFwAA6lOq7kAAAAAAAAAXAE+BUmp3SIWqeEuwABq48AAscnAALUaACEWqfEuwABrFcAAscnAALUbSqoCAD89F6oQLsAAXOTAALHJHKoXFqoQLsAAXOTAALHJwAC0+4DfAQABGqoawAC09ADAAPSSwAC0+06qcKp4AACBfGDAAPRvARaqei7AAGpkwACxycAAtPhJqoolqpaEqo7AWDFaYQJgwAD1xWDAAPYxXD4BPRyqzBaqxi7AAGpewACxycAAtPrAAGsbAwJgwAD1xWDAAPYxAxSq8cBYMVoEAWECYMAA9cVgwAD2MVyAqvrAWDBUgasBwFgwYQDAALcwPgJAJas1FqssLsAAamTAALHJwAC0+GEBYMAA9cVcqyyrTQA9HKteFqtYLsAAal7AALHJwAC0+sAAasECAWDAAPXFAiardgEWq3YuwABqZMAAscnAALT4YQFgwAD1xVyAq4DAWDBUAMAAty89F6uWLsAAXOTAALHJHKudFquWLsAAXOTAALHJwAC0+4MsAQABHKugGquhwAC09JKVAAAAAMAA9JQAwAD0kcAAtPtJq8AWq8QuwABrF8AAscnAALUhPgM9F6vcLsAAXOTAALHJHKvjFqvcLsAAXOTAALHJwAC0+4DfAQABGqvmwAC08wDAAPSSwAC0+z0crAQuwABrE8AAsckAAAAAwAC1AUmsFSIhHKwnFqwZLsAAawfAALHJwAC0/EEBAAErAMAA9dIAIR6sPcAA7l4CAAIWrEcuwABrB8AAscnAALT8GqxdwACy7QA+AT0crIMWrHUuwABrB8AAscnAALT8gY8BAAGDrJDAWDDcAMAAsv8+AT0crLyDrLPAWDDcIAAAAAAAPgI9HKzkg6zbwFgw3CAAAAAAAD0crR4uwABrGcAAsckBAAGCrSrAWDC5AMAAtQ4GwAC1DIIerUitTa/iAADAAGofwACxyQAAAAEDrVav4gAAAAAAAABcAT4HQCEWrWcuwABq48AAscnAALUarWatcgBAIRatgS7AAGsNwACxycAAtR6tgK2KAEAhFq2ZLsAAaxDAALHJwAC1HK2YraQAT62srbEAAAHAAGscYQBcAAOtua79AAAAAAAAAFwBPgRJrk0hFq5SLsAAaxXAALHJwAC1G0quYwA/PReucS7AAFzkwACxyRyueBaucS7AAFzkwACxycAAtPuA3wEAARyunByujBqufMAAtPKA3wEAARqujsAAtPAAwAD0koDfAQABGq6ewAC09ADAAPSSAMAA9JLAALT7PRyuvxauuS7AAGpewACxycAAtPrAAGsdAQABFq7KLsAAawbAALHJwAC0+QDAALcuPReu2i7AAFzk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wACxyQBdwACyxgFfAAABKwTAALWngh7AAFwjwABcMFibGcAAsckAXcAAs9ABXwAAASsBBcAAtbWCHsAAXDXAAFw1wABewAAAAAPAAFxHwABewAAAAAMDA8AAXFQAAASxK13AALOZAV8AAADAAFxoAAAAwABq2WEBXcAAs9ABXwAAXADAAFyoAAAAwABq2mEBXcAAs9ABXwAAXAAAXcAAtZ8BXwAAAT4BPRfAAF51LsAAahLAALHJH8AAXofAALLVAgFfAAACFsAAXqcuwABrIMAAscnAALWwFsAAXrIuwABq9sAAscnAALWvAMAAtaYFCAHAALWigADAWFhcCADAALWjHMAAXWsawABdVsAAtyTAAGp/AQJbXcAAs9ABXwAAAYHAAF2ywFhYbwDAALcyCADAALWkHMAAXfkawABd5MAAtyTAAGp/AQJbXcAAs9ABXwAAAYLAAF5AwFhYhwDAALcyCADAALWlGsAAXmfAALckCQHAAFw1wACzzQAAAAAIBsAAtamCHsAAXsXAAF7OwABe4QEAwABp7QAAAAEDwABe2sAAXuEAAAAAAAAAYMAA8rMBSsAAXt0BKQbAALWtgh7AAF7mwABe/MAAYTEAAIGKAAAAAQPAAF8CwABhMQAAAAQBAcAAXwgAAADAAGn1YQFfAABcAAPAAF8oAAAAgXxgwAD0bwErwABfNgAAAIM/YQBcASvAAF9FAAAAwABpwmDAAPKzAStdwACz0AFfAAABPgRJwABfWyIcwABfaxbAAF9fLsAAahLAALHJwAC1pkEBAAErAMAA9dIBFsAAX4IWwABfdi7AAGoSwACxycAAtaawqMAAspA+AUrAAGACAR/AAGANwAC1ngEBXwAAAYLAAGAowFhaCwA/PSMcwABgSRbAAGA7LpsZwACxycAAtadBAQABKwDAAPXSF8AAYDsumxnAALHJHMAAYFUWwABgTS6xK8AAscnAALWigYoDAAEWwABgaBbAAGBcLsAAahLAALHJwAC1pk/AALLRAoF8FsAAYIoWwABgfi7AAGoSwACxycAAtaaazsAAstKDPxbAAGCoFsAAYJwuwABqEsAAscnAALWmgg/AALLTwACzp8AAtacrAV3AALPQAV8AAD2LwABgtMBYWhkewABgxMAA7l4CAAIpg8AAYNTAWFoZAErAAGDoARzAAGD7FsAAYO8uwABqEsAAscnAALWmwABqE8AAsckEAASAwABhBsBYWeiBwABhDsBYWfuCwABhF8BYWguDwABhH8BYWhkAwACyogbAALWvgh7AAGE2wABhO8AAYpoAAMAAavbAALHJAAAAAQPAAGFEwABimgAAAAAAAABcAT4DTsAAYVLAAGFbAADAAGs+YMAA8rMBIhzAAGFqFsAAYV4uwABqEsAAscnAALWmQQEAASsAwAD10gEWwABhghbAAGF2LsAAahLAALHJwAC1prCowACykEnAAGGQIRzAAGGlFsAAYZQuwABrPcAAscnAALWkQQEAASsAwAD10j4BPRzAAGG8FsAAYbYuwABqXsAAscnAALWln3MCAlxdwAC1tgFfAAACFsAAYdAuwABrPcAAscnAALWkH8AAYebAALXFAQFfAAABLgAAwAC3LD9JwABiGYDAAGIdwFhb+z4BScAAYi8hHMAAYkEWwABiMy6bGcAAscnAALWnQQEAASsAwAD10j4CPRzAAGJiFsAAYlQumxnAALHJwAC1p5sbAAAAAMAAs9I9F8AAYnQumxnAALHJK8AAtac/PwbAALWwgh7AAGKfwABipMAAYz0AAMAAayDAALHJAAAAAQPAAGKtwABjPQAAAAAAAABcAT4BScAAYrYhHMAAYssWwABiui7AAGs8wACxycAAtaNBAQABKwDAAPXSPgE9HMAAYuIWwABi3C7AAGpewACxycAAtaWfcwICXF3AALW2AV8AAAIWwABi9i7AAGs8wACxycAAtaMfwABjDMAAtcUBAV8AAAEuAADAALcsPwbAALWxgh7AAGN6wABjf8AAZK8AAMAAaz/AALHJAAAAAQPAAGOSwABkrwAAAAAAAABcAT4FScAAY5scwABjrRbAAGOfLpsZwACxycAAtadBAQABKwDAAPXSSsAAY7YAP07AAGQVwABkIgAAgYldwACz0AFbARbAAGQkLpsZwACxycAAtac9F8AAZDcumxnAALHJK8AAtac9F8AAZFEuwABqEsAAsckrwAC1pj0cwABko4DAAGSWwFheQpsbAAAAAMAAs9IGwAC1soIewABktMAAZLnAAGUzAADAAGtAwACxyQAAAAEDwABky8AAZTMAAAABAQHAAGTTAAAAwABqxV3AALLqAVsAAFwBPgJJwABk5xzAAGT5FsAAZOsumxnAALHJwAC1p0EBAAEr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oPvAWScWQQEAASsAwAD10sAAoPvAAKERAE7AAKElwAChNAAAwABroGDAALcNAR7AAKE2wACyHQEAARbAAKFVgsAAoUbAWScWn3fAALbjAE7AAKFzwAChewAATl4ABQUFYMAAtx5gwAC3DWDAALceYMAA809hAFwAAVfAALHvAGDAALbGARbAAKGMgsAAoX3AWScWkk/AALbkSsAAoZoBHMAAoaiEwAChocBZJ8AgBQAFFsAAobiCwAChqcBZJxafd8AAtuODwAChvsBZJ4ougMAAodTAWSbwgcAAod7AWSb/AAAGwAC3noIhwACh6cAAoe/AAKNdAADAAGt6AAAAAQPAAKICwACjXQAAAAICAsAAogwAAACBQ2DAAPNPAMAAohsAAACBKGEBYMAAtsZcAABgwAC2xgE+BU7AAKI1wACiRAAAwABrkl3AALbhAV4ABQUFYMAAtx5gwAC3DWDAALceYMAA809hAWDAALbGXAABV8AAsfAAYMAAtsYBFsAAoksuwABrf8AAscnAALd9QCEcwACie4LAAKJswFkoqkEBAAErAMAA9dLAAKJswACiggBOwACilsAAoqUAAMAAa6BgwAC3DQEewACip8AAsh0BAAEWwACixoLAAKK3wFkoqp93wAC24wBOwACi7MAAovQAAE5eAAUFBWDAALceYMAAtw1gwAC3HmDAAPNPYQFgwAC2xlwAAVfAALHwAGDAALbGARbAAKMFgsAAovbAWSiqkk/AALbkSsAAoxMBHMAAoyGEwACjGsBZKVkgBQAFFsAAozGCwACjIsBZKKqfd8AAtuODwACjN8BZKSMugMAAo03AWSh/gcAAo1fAWSiOAAAGwAC3n4IhwACjYsAAo2fAAKSJAADAAElBAAAAAQPAAKNswACkiQAAAAEBAcAAo3QAAACBi2DAAPZdAABcAT4FTsAAo4TAAKOTAADAAGuSXcAAtuEBXgAEBARgwAC3HmDAALcNYMAAtx5gwAD2XQABV8AAsfEAXAEWwACjmi7AAGuawACxycAAt35AIRzAAKO8gcAAo63AWSoyQQEAASsAwAD10sAAo63AAKPDAE7AAKPXwACj5gAAwABroGDAALcNAR7AAKPowACyHQEAARbAAKQHgcAAo/jAWSoyn3fAALbjAE7AAKQfwACkJwAATl4ABAQEYMAAtx5gwAC3DWDAALce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AACV1GDAAPYxAABcAT4BPR7AAKT+wACyEgEAATTAAKUdA8AApR3AAKWUAAAAAAAAAGDAAPWCAT4DPSMcwAClLIPAAKUmwFlfoEEBAAErAMAA9dKLwAClJsBZX6AfwAClNMAA85wAAAAAKwFbScAApUscwAClWoTAAKVPwFlfq0EBAAErAMAA9dI9MMAApWODwAClacBZX6A/PR7AAKV0wACyHwIAAoPAAKV9wFlfoITAAKWEwFlfqwAABsAAsh+CIqO3o8OkBwAFwABr1MAAsckCGqPDwADE9yCjw8AAxUMBAAEnwABr1QAAAAEDo8ukBwAAAAICAqPTAAAAguhgwAD1xQCj5QAAAJXUYMAA9jEAAFwABsAAsiCCIcAApdjAAKXawACmpAABwABr1sAAsckAAAABA8AApeXAAKakAAABAACT3GDAAPXFAVsEBATAAKXrAAAAmPNgwAC3HgDAAKX+AAAAklFgwAC3DQDAAKYLAAAAn3dgwAC3HgDAAKYTAAAAgShhAF8AAAAAXwAAAT4DScAAphwcwACmLhrAAKYlwAC3IkEBAAGCwACmMcBZYR0AwAD10krAAKY3ARzAAKY/g8AApj7AWWEsIAAAAAAAP07AAKZLwACmTwAAgxNgwAC3HgEewACmVsAAt0ABAAGCwACmXcBZYR0ATD4BSsAApnABHMAApniDwACmd8BZYSwgAAAAAAA+AT0ewACmk8AAt0EBAAGEwACmmsBZYYMABsAAsiGCIcAApqfAAKapwACnkgABwABr18AAsckAAAABA8AAprzAAKeSAAACAACT3GDAAPXFAVsAAIH9YMAA9cUBWwUFBcAApscAAACY82DAALceAMAAptoAAACSUWDAALcNAMAApucAAACfd2DAALceAMAApu8AAACBKGEBXwEAXwAAAMAApvsAAACVEV8BAAAAXwAAAT4DScAApwQcwACnFhrAAKcNwAC3IkEBAAGCwACnGcBZYkUAwAD10krAAKcfARzAAKcng8AApybAWWJUIAEAAYTAAKcowFliZgAAP07AAKc2wACnOgAAgxNgwAC3HgEewACnQcAAt0ABAAGCwACnSMBZYkUATD4BSsAAp1sBHMAAp2ODwACnYsBZYlQgAQABhMAAp2TAWWJmAAA+AT0ewACngcAAt0EBAAGFwACniMBZYsQABsAAsiKCIcAA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wACt98AAsfqCwACuAsBZafAAPgE9jMAArkjAWWoOHMAArliCwACuU8BZafDAAGuLAQJbYMAAtsYBhMAArnrAWWoOAMAAtzU/SsAArosBHsAArpjAALbPAgACg8AArq3AWWn/hMAArrfAWWoOAAbAALIqgiHAAK7FwACuysAArycAAcAAa+HAALHJAAAAAQPAAK7UwACvJwAAAAQEBMAArtoAAACY82DAALceAMAAru0AAACSUWDAALcNAMAArvoAAACfd2DAALceAMAArwcAAACBi2DAAPZdAABcAT4BPR7AAK8RwADFCgEAAYPAAK8gwFlrBgAGwACyK4IhwACvKsAAry/AAK9nAAHAAGviwACxyQAAAAEDwACvO8AAr2cAAAABAQHAAK9DAAAAgYtgwAD2XQAAXAE+AT0cwACvWhrAAK9SwAC3JMAASUEBAAGAwACvYMBZa2EAwAC3PgbAALIsgiHAAK9qwACvb8AAspwAAcAAa+PAALHJAAAAAQPAAK94wACynAAAAAUFBcAAr34AAACY82DAALceAMAAr5EAAACSUWDAALcNAMAAr54AAACfd2DAALceAMAAr7oAAADAAGnTYMAAtucAwACvzQAAAIVcXcAA9U4CW1sAAGDAALceAT4FPRvAALB9wADE+RrAALCLwACyK0nAALCcHMAAsK6DwACwoMBZa/ZBAQABKwDAAPXSPgE9i8AAsL3AWWv2IMAAsNPAALcMAAAAAEnAALDxISXAALEDg8AAsPXAWWv2YMAAtvw+AT0wwACxIR/AALErwADzrAEAASQAAifAAGvkJ8AAa+UAP07AALGZAAAAwABr5l3AAPVOAltbAEnAALGlHMAAsbSEwACxqcBZbAdBAQABKwDAAPXSPgFJwACxwyXAALHMgsAAscfAWWvnYMAAt1o+AT2NwACx3sBZbKgWwACx7hTAALHpwFlr5wIBYMAAt1qkc8AAscnAALdrPgE9jcAAsgfAWWyoHsAAshbAALrMAAJbWwAAPgE9jcAAsjbAWWyoHsAAskXAALrOAQJbWwGEwACyUsBZbAcASsAAsmUBH8AAsnDAALehAwADJsAAsnwBgsAAsnzAWWvnYMAAt1qDwACygsBZa/aFwACykcBZbKgABsAAsi+CIcAAzxXAAM8XwADVmgABhUoAAAABA8AAzyLAANWaAAABAACT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wABJ+MBaxe0AK4HAAEoEwFrF7QFgwAD1xV8AAAbAALqSgjDAAEoOwABKE8AASlAAAILQAAAAAQPAAEobwABKUAAAAAEBAcAASiMAAACDlmDAAPXFAABgwADyswFKwABKKwEhHsAASizAAO5eAgACFsAASjYurmvAALfUwAC4sxzAAEo9LsAAbHjAALfUAQABgMAASkvAWsaOAMAAuowABsAAupOCMMAASlXAAEpawABNXwAAk+AAAAABA8AASmDAAE1fAAAAAQEBwABKaAAAAIOWYMAA9cUAAGDAAPKzAT4JTsAASn3AAEqCAAGX/2DAAPR5ARbAAEqLFsAASoQulADAALfUwAC4sVrAAPVMTsAASqHAAEqqAAHAAGxFYMAA9HkBHMAASrGBwABKrMBaxyqBQQEAAZQAwAD1n07AAErEwABKzwABwABsXGDAAPR5ARzAAErWgcAAStHAWscqg4QBAAGUAMAA9JZOwABK6sAASvMAAcAAbEFgwAD0eQEcwABK9S6V/8AAt9QBAAGAwABK/8BaxxEAwAC44k7AAEsTwABLHwABwABsWmDAAPR5AR7AAEsrwAC40wMAA4TAAEs4wFrHsxbAAEtCLsAAbCXAALfUwAC4soHAAEtNwFrHKgBOwABLXMAAS14AAFtgwAD0eQEewABLasAAuNQCAAKEwABLdsBax7OCwABLgMBax1cATsAAS5PAAEuYAACk3GDAAPR5ARzAAEugFsAAS5oulADAALfUwAC4sUQBAAGGwABLocBayCsAwAD1LEPAAEupIRzAAEu1h8AAS7DAWshcQQEAARrAAEvCwAC4zgDAAPWcPgNJwABL2CEcwABL4YfAAEvcwFrIXEEBAAEawABL7sAAuM8AwAD1nD4CTsAATBHAAEwTAAGTe2DAAPR5ARzAAEwhhcAATBXAWsflg4MBAAGHwABMI8BayFwAwAD0k0nAAEwxIhzAAEw3FMAATDXAWsjmCABcAQABg8AATDnAWseFAMAA9aYAHMAATEcus/zAALfUAgACgMAATE/AWscRHMAATFkWwABMVC6ua8AAt9TAALizRAEAARTAAExawFrI5ggAAMAA9SwAwAC44z4EPRzAAExxFsAATGsulADAALfUwAC4sYCyAgAChsAATHLAWsgrGsAATIHAALjPAMAA9S09HsAATKTAALjXAgACFsAA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AMAA9JFBAQABGsAA0uzAAMAmAMAA9Zw+AUnAANMEFsAA0wguln3AAMAvPgI9HMAA0yQuwABt0QEAATfAAP/9AMAAwDI9icAA00PAXWjvHMAA00uBwADTQ8BdaO9dAQABlADAAPWePgE9MMAA02ofwADTdMAA9FQDAAMnwABt2oDAANO5wF1o24HAANO/wF1o7wBJwADT4RzAANPqhcAA0+XAXWswXAEAATeA4ADAAPWmPgE9icAA1CLAXWjvHMAA1C0uwABtzgYABoDAANRKwF1o2xzAANRZgcAA1FDAXWjvXQEAAZQAwAD1noLAANRewF1o/pSUHMAA1G6FwADUacBdazCDLAEAARrAANRwwADAIQDAAPSRAMAAwDFJwADUjRzAANSWhcAA1JHAXWswXAEAATeA8ADAAPWmPgE9icAA1NDAXWjvHMAA1NsuwABtzgYABoDAANT4wF1o2xzAANUHgcAA1P7AXWjvXQEAAZQAwAD1noLAANUMwF1o/pWVHMAA1RyFwADVF8BdazCDLAEAARrAANUewADAIgDAAPSRAMAAwDFJwADVPRzAANVGhcAA1UHAXWswXAEAATeA+ADAAPWmPgE9icAA1X/AXWjvHMAA1YouwABtzgYABoDAANWnwF1o2xzAANW2gcAA1a3AXWjvXQEAAZQAwAD1noLAANW7wF1o/paWHMAA1cuFwADVxsBdazCDLAEAARrAANXNwADAIwDAAPSRAMAAwDE+AUnAANX1FsAA1fkuln3AAMAvPgI9HMAA1hUuwABt0QEAATfAAP/9AMAAwDI9icAA1jTAXWjvHMAA1jyBwADWNMBdaO9dAQABlADAAPWePgE9MMAA1lsfwADWZcAA9FQDAAMkwADWnwInwABt24XAANaawF1rMIDAANahwF1o24HAANanwF1o7wA9i8AA1srAXWrAFsAA1tIuWsAAwCw9jMAA1uDAXWrdFsAA1vIWwADW6y6CEsAAwCtawAD1TD0XwADXBC5ag8AA1w3AXWrAwADALAbAAMA3gjvAANcbwADXIsAA2oMAACMAAAABA8AA1yrAANqDAAAAAAAAAGDAAPZdAT4CScAA1zMhHMAA10QWwADXNy7AAG18wADALUEBAAEawADXR8AAwBwAwAD1nD4BScAA11sWwADXXy6WfcAAwC8+Aj0XwADXeS7AAG18GsAA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AEtHwADBARrAAEtLwADBARrAAEtPwADBARrAAEtTwADBARrAAEtXwADBARrAAEtbwADBARrAAEtfwADBARrAAEtjwADBARrAAEtnwADBARrAAEtrwADBARrAAEtvwADBARrAAEtzwADBARrAAEt3wADBARrAAEt7wADBARrAAEuGwADBARrAAEuKwADBARrAAEuOwADBARrAAEuSwADBARrAAEuWwADBARrAAEuawADBARrAAEuewADBARrAAEuiwADBARrAAEumwADBARrAAEuqwADBARrAAEuuwADBARrAAEuywADBARrAAEu2wADBARrAAEu6wADBARrAAEu+wADBARrAAEvCwADBARrAAEvNwADBARrAAEvRwADBARrAAEvVwADBARrAAEvZwADBARrAAEvdwADBARrAAEvhwADBAhrAAEvlwADBARrAAEvpwADBARrAAEvtwADBARrAAEvxwADBARrAAEv1wADBATc+GsAAS/3AAMEBNz4awABMBcAAwQE3Pzc0NzU3Njc3Nzg3OTc6Nzs3PDc9GsAATDzAAMEBGsAATEDAAMEBGsAATETAAMEBGsAATEjAAMECGsAATEzAAMEBGsAATFDAAMEBGsAATFvAAMEBk5SVlpc3BTcGNwc3CDcJNwo3CzcMNw03DjcPNxA3ETcSNxM3FDcVNxY3FzcYNxkawABMzsAAwQEawABM0sAAwQEawABM1sAAwQEawABM2sAAwQE3PxrAAEzpwADBATcaNxs3HDcdNx43HzcgNyE3IjcjNyQ3JTcmNyc3KDcpNyo3KzcsNy03LjcvNzA3MTcyNzMawABNXMAAwQEawABNYMAAwQEawABNZMAAwQEawABNaMAAwQEawABNbMAAwQEABMAAwQSCPcAATafAAE27BsAAbinAAL8AAGDAAPR5ATclBMAAwQWCPcAATdjAAE3mBsAAbirAAL8AAGDAAPR5ATczBMAAwQaCPcAATgPAAE4RBsAAbivAAL8AAGDAAPR5ATdkBMAAwQeCPcAAUX3AAFGHGMAAXOTAAL8AAGDAAPR5AZMBBcAAwRcAAAAABAAAAwAAAAAAAAAAAGDAAMD6AT8BCQEAwAD12wAAAAAMBsAAwQqCPcAAUdLAAFHdwABSYQABwABuLMAAvwAAAAABA8AAUfLAAFJhAAAAAgICwABR9wAAAIDQYMAA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swAAYMAA8rMBSsAAST8BKgbAAMfZgljAAElJwABJS8AASdMAAJMjAAAAAQPAAElVwABJ0wAAAAIBAcAASVsAAACT42EBXwAAYMAA8rMAAcAASW8AACCTJGEAXwAAAStfAAABPgJJwABJgCEcwABJi4HAAEmEwGAJE0EBAAErAMAA9dJKwABJlAEcwABJoYHAAEmbwGAJEyAAAAAAAD89MMAASakewABJxMAAyCsAAAAABsAAx9qCWMAASdjAAEnawABKYQAAkykAAAABA8AASePAAEphAAAAAgEBwABJ6QAAAJPjYQFfAABgwADyswABwABJ/QAAIJMkYQBfAAABK18AAAE+AknAAEoOIRzAAEoZgcAAShLAYAm0QQEAASsAwAD10krAAEoiARzAAEovgcAASinAYAm0IAAAAAAAPz0wwABKNx7AAEpSwADIKwAAAAAGwADH24JYwABKZsAASmjAAErxAACTLAAAAAEDwABKc8AASvEAAAACAQHAAEp5AAAAk+NhAV8AAGDAAPKzAAHAAEqNAAAgkyRhAF8AAAErXwAAAT4CScAASp4hHMAASqmBwABKosBgClVBAQABKwDAAPXSSsAASrIBHMAASr+BwABKucBgClUgAAAAAAA/PTDAAErHHsAASuLAAMgrAAAAAAbAAMfcgljAAEr2wABK/cAASyAAAFEAAAABA8AASwHAAEsgAAAAAQABwABLCgAAAIE+YMAA9l0BJwAAYMAA9l0BSsAASx4BJwAGwADH3YJYwABLJcAASzHAAEtUAACBJwAAAAEDwABLNsAAS1QAAAABAQHAAEs8AAAAk+NhAV8AAGDAAPKzAABdwAD02wFfAAABSsAAS1ABLgbAAMfegljAAEtZwABLZcAAS5UAAICfAAAAAQPAAEtrwABLlQAAAQAAgf1gwAD1xQFbAQEBwABLbgAAAIEoYQFfAABfAQAAAF3AAPTbAV8BAAFKwABLfwEfwABLg8AAx+gAAV8BAAAABsAAx9+CWMAAS5rAAEucwABL8gAAkyoAAAABA8AAS6LAAEvyAAAAAQEBwABLpQAAIJMmYQJfAABfAABfAAAAAF8AAAE+AT0wwABLyB7AAEvjwADIKwAAAAAGwADH4IJYwABL98AAS/nAAExVAACDEgAAAAEDwABMAMAATFUAAAEAAIH9YMAA9cUBWwICAsAA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wADJx4JmwABEysAARNjAAEWpAADAAHH8ARrAAETYwADE9wAAAQPAAETswABFqQAAAAEBAcAARPYAAADAAHH7YMAAydUAAFwBPgJOwABFDsAARRIAAIMMXcAA9R0BWwE1wABFGAAAAQBdwAD1HQFbAR7AAEUYwADuggEBWwGWADUAAAABAFsBHMAARSiBwABFJsBgzgSAsgIAApOTAMAA9S01AAAAAQBbARzAAEVbgcAARVnAYM4EgLICAAKUGsAARWHAAMmrAMAA9S01AAAAAQBbARzAAEVzgcAARXHAYM4EgLICAAKVgMAARXnAYM3YAMAA9S2BAMBgzgQ9HsAARYvAAMm6AgACFsAARZQuwABva8AAybGBwABFocBgze8ABsAAyciCZsAARa7AAEW8wABGrAAAwABx/QEawABFvMAAxPcAAAEDwABFysAARqwAAAABAQHAAEXQAAAAwABx2GDAAPKzAABcAT4CTsAARerAAEXuAACDDF3AAPUdAVsBNcAARfQAAAEAXcAA9R0BWwEewABF9MAA7oIBAVsBlwA1AAAAAQBbARzAAEYEgcAARgLAYM8lgLICAAKTkwDAAPUtNQAAAAEAWwEcwABGN4HAAEY1wGDPJYCyAgAClBrAAEY9wADJrgDAAPUtNQAAAAEAWwEcwABGUoHAAEZQwGDPJYCyAgAClRbAAEZYLsAAcczAAMmzAMAA9S01AAAAAQBbARzAAEZ0gcAARnLAYM8lgLICAAKWgMAARnrAYM75AMAA9S2BAMBgzyU9HsAARo7AAMm6AgACFsAARpcuwABva8AAybGBwABGpMBgzxAABsAAycmCZsAARrHAAEa/wABHpAAAwABZUQEawABGv8AAxPcAAAEDwABGw8AAR6QAAAABAAABwABGyQAAAMAAcf5gwAD0eQEawABG08AAybBcAT4CTsAARu/AAEbzAACDDF3AAPUdAVsBNcAARvkAAAEAXcAA9R0BWwEewABG+cAA7oIBAVsBlwA1AAAAAQBbARzAAEcJgcAARwfAYNB+gLICAAKTkwDAAPUtNQAAAAEAWwEcwABHPIHAAEc6wGDQfoCyAgAClBrAAEdCwADJqQDAAPUtNQAAAAEAWwEcwABHUIHAAEdOwGDQfoCyAgAClRbAAEdWLsAAcczAAMmzAMAA9S01AAAAAQBbARzAAEdygcAAR3DAYNB+gLICAAKWgMAAR3jAYNBKAMAA9S2BAMBg0H49HsAAR4bAAMm6AgACFsAAR48uwABva8AAybGBwABHnMBg0GkABsAAycqCZsAAR6nAAEe3wABIzgAAwABLfQEawABHt8AAxPcAAAEDwABHu8AASM4AAAADAQHAAEfFAAAAwABx+2DAAMnVAALAAEfbAAAAgwpgwAD1xQErwABH6QAAAMAAcf5gwAD0eQEawABH88AAya9cAT4CTsAASAnAAEgNAACDDF3AAPUdAVsBNcAASBMAAAEAXcAA9R0BWwEewABIE8AA7oIBAVsBNwUANQAAAAEAWwEcwABII4PAAEghwGDR+ICyAgACk5MAwAD1LTUAAAABAFsBHMAASFaDwABIVMBg0fiAsgIAApQawABIXMAAyagAwAD1LTUAAAABAFsBHMAASGqDwABIaMBg0fiAsgIAApWAwABIcMBg0aIAwAD1LTUAAAABAFsBHMAASIWDwABIg8Bg0fiAsgIAApaCwABIi8Bg0cQAwAD1LTUAAAABAFsBHMAASJyDwABImsBg0fiAsgIAApeBwABIosBg0bQAwAD1LYMAwGDR+D0ewABIsMAAyboCAAIWwABIuS7AAG9rwADJsYPAAEjGwGDR4wAGwADJy4JmwABI08AASOHAAEmfAADAAHH/ARrAAEjhwADE9wAAAQPAAEjxwABJnwAAAAEBAcAASPsAAACDc2DAAMnVAABcAT4CTsAASQvAAEkPAACDDF3AAPUdAVsBNcAASRUAAAEAXcAA9R0BWwEewABJFcAA7oIBAVsBlgA1AAAAAQBbARzAAEklgcAASSPAYNNsgLICAAKTkwDAAPUtNQAAAAEAWwEcwABJWIHAAElWwGDTbICyAgAClBrAAElewADJrADAAPUtNQAAAAEAWwEcwABJcYHAAElvwGDTbICyAgAClYDAAEl3wGDTQgDAAPUtgQDAYNNsPR7AAEmBwADJugIAAhbAAEmKLsAAb2vAAMmxgcAASZfAYNNXAAbAAMnMgmbAAEmkwABJssAASnMAAMAAcgABGsAASbLAAMT3AAABA8AAScXAAEpzAAAAAQEBwABJzwAAAINzYMAAydUAAFwBPgJOwABJ38AASeMAAIMMXcAA9R0BWwE1wABJ6QAAAQBdwAD1HQFbAR7AAEnpwADuggEBWwGWADUA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APVjSsAARnoBF8AARoEuwAByuMAAyp4fwABGncAAvHIBAmDAAPbPYMAAzN8BgMAARszAYV7IAMAAy18GwADLcIJwwABHK8AARzTAAEenAQDAAHLKwADKngAAAAEDwABHUcAAR6cAAAAAAAAAYMAA8rMBPgJJwABHVxzAAEdhFsAAR1sulJrAAMtzQQEAAS4AwADNOkrAAEdqASo/SsAAR5gBKQbAAMt3gnDAAEfXwABH9MAASqABAKODAAAAAQPAAEgCwABKoAAAAAAAAABdwAD1HQFgwADNRQE+AknAAEgIHMAASBsWwABIDC6k58AAyp7AAMtgQQEAASsAwAD10j4HScAASCwiIRbAAEgxLsAAcrDAAMqewADLVgAWwABIUy7AAHLKwADKnsAAy3A+AUrAAEh7ARfAAEiCLqTnwADKnjrAAEiTYMAAzUUAwADLYD89F8AASL8upOfAAMqeHsAASNTAAPAkAQFgwADNRQGTAMAAy2BOwABI/MAASQMAAIOzXcAA9R0BWwEewABJBcAAy5IBAAEWwABJIS7AAHKSwADKnsAAyxoATsAASUDAAElGAACnrmDAAM0uARbAAElILsAAcsvAAMt6TsAASWcAAADAAHLMWwBFwABJdQHAAEl+wABJgAAAW2DAAPR5AZMBHMAASYeDwABJhcBhYytcAQABFsAASZCAwABJicBhYsNawAD1TADAAPWmAYvAAEmYwGFjKxzAAEmag8AASZjAYWMrXQEAAZUAwAD1nj4CPYrAAEmqwGFjGB/AAEm3wADL4AMAAxzAAEnWgMAASdDAYWLDRAEAARzAAEnZg8AASdfAYWMrXQEAAZQAwAD1ngDAAPUsJsAASeUBHMAASeWAwABJ38BhYsNEAQABg8AASebAYWMrAMAA9SxgwAD2XYHAAEnqwGFi9wA9HMAASgkWwABJ+i6k58AAyp7AAMtgTwEAASbAAEoNAYLAAEoNwGFjGGDAAM1FAMAA9S49F8AASiQupOfAAMqeH8AASkPAALrGAQFgwADNRQEWwABKbC6k58AAyp7AAMtgAMAAy2A/SsAASocBFsAASo4upOfAAMqewADLYAbAAMt4gnDAAErIwABK3cAATHABAJJEAAAAAQPAAErrwABMcAAAAAAAAABdwAD1HQFgwADNIQE+AknAAErxHMAASwQWwABK9S7AAEEI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1iHAYudmQQEAASsAwAD1nInAANYhwGLnZhzAANZRHMAA1kAWwADWMi7AAGkkwADO9oFBAQABgMAA1kLAYudWAMAA9Z+SmAEAARrAANZdwADcDgDAAPWjKwFgwAD0eT0ewADWcsAAzaYDAAMWwADWjC7AAGkkwADO9oDAANabwGLnVhzAANaxgcAA1qrAYudmgz4BAAEawADWvMAA3A4AwAD1oABKwADW0gEewADW3cAA1+sDAAMWwADW8S6ua8AAzZLAAM7xgMAA1vjAYudWgcAA1wfAYudmAAbAAM78gnXAANcXwADXIcAA2FQAAJekAAAAAQPAANcswADYVAAAAAIAAsAA1zIAAACj1mDAAPR5AZPAANdJAAAAWmDAAPR5ASsAYMAA3BMBPgM9IxzAANdfgcAA11jAYuibQQEAASsAwAD1nInAANdYwGLomxzAANeQHMAA138WwADXcS7AAGkkwADO9oFBAQABgMAA14HAYuiLAMAA9Z+SmAEAARrAANedwADcFQDAAPWjKwFgwAD0eT0ewADXssAAzaYDAAMWwADXzC7AAGkkwADO9oDAANfbwGLoixzAANfxgcAA1+rAYuibgz4BAAEawADX/cAA3BUAwAD1oABKwADYEwEewADYHsAA2DMDAAMWwADYMy6ua8AAzZLAAM7xgMAA2DrAYuiLgcAA2EnAYuibAAbAAM79gnXAANhZwADYasAA2bgAAMAAc6EAAAABA8AA2HzAANm4AAAAAgACwADYggAAAKPWYMAA9HkBk8AA2JkAAABaYMAA9HkBKwBgwADcHAE+Az0jHMAA2K+BwADYqMBi6dJBAQABKwDAAPWcicAA2KjAYunSHMAA2NgcwADYxxbAANi5LsAAaSTAAM72gUEBAAGAwADYycBi6cIAwAD1n5KYAQABGsAA2PTAANweAMAA9aMrAWDAAPR5PR7AANkJwADNpgMAAxbAANkaLsAAaSTAAM72gMAA2SnAYunCHMAA2UeBwADZQMBi6dKDPgEAARrAANlawADcHgDAAPWgAErAANlwAR7AANl7wADYewMAAxbAANmXLq5rwADNksAAzvGAwADZnsBi6cKBwADZrcBi6dIABsAAzv6CdcAA2b3AANnHwADbPwAAwABzogAAAAEDwADZ0sAA2z8AAAACAALAANnYAAAAo9ZgwAD0eQGTwADZ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D8BknuBcAQABgcAASBPAZJ69AMAA9aYBisAASBjAZJ7gHMAASBmCwABIGMBknuBdAQABlADAAPWePgE9HMAASCaAwABIJcBknqUgAQABHMAASCsuRAEAAYLAAEgswGSe4ADAAPUsAAAGwADR6YJ1wABIPsAASEXAAElPAACTKgAAAAEDwABIS8AASU8AAAABAQHAAEhTAAAgkyZhAmDAAPMrYMAA8ytgwADzKwAAYMAA8ysBPgVOwABIhMAASIgAAJblYMAA9HkBFsAASI8uWsAA9UxJwABImxzAAEijgcAASJ/AZJ+zQQEAAZMAwAD1nD0wwABIqR7AAEjEwADIKwAAAAA/TsAASNnAAEjfAACAimDAAPMrARzAAEjlLkQBAAGTAMAA9SxFwABI7gHAAEj3wABI+QAAW2DAAPR5AZQBHMAASQCDwABI/sBkoCpcAQABgcAASQLAZJ+zAMAA9aYBi8AASQnAZKAqHMAASQeDwABJCcBkoCpdAQABlADAAPWePgE9isAASRTAZKACHMAASSOAwABJHMBkn44gAgACgsAASSTAZKACHMAASS8uRAEAAYPAAEkwwGSgKgDAAPUsAABKwABJPwGCwABJRsBkoAIGwADR6oJ1wABJVMAASVbAAEowAACDEgAAAAEDwABJXcAASjAAAAEAAIH9YMAA9cUBWwICAsAASWAAAACTJV8AAADAAElwAAAAkyZhAl8AAGDAAPMrXwAAAABfAAABPgNOwABJo8AASacAAJblYMAA9HkBFsAASa4uWsAA9UxFwABJugHAAEnDwABJxQAAW2DAAPR5AZMBHMAAScyDwABJysBkoVNcAQABgsAASc7AZKEwAMAA9aYBi8AASdXAZKFTHMAASdODwABJ1cBkoVNdAQABlADAAPWePgE9iMAASeDAZKEEHMAASfaBwABJ78BkoREgAgACgMAASffAZKEEHMAASgkuRAEAAYPAAEoKwGShUwDAAPUsAABKwABKGQGAwABKIMBkoQQGwADR64J1wABKNcAASkHAAEqMAACAnwAAAAEDwABKR8AASowAAAEAAIH9YMAA9cUBWwEBAcAASkoAAACBKGEBYMAA8ytfAAAAAF3AAPTbAV8AAAFKwABKZgEewABKasAAxw8CAmDAAPMrXwAAAi6AwABKisBkoi0ABsAA0eyCdcAASpHAAEqd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YMAA8ysBPgVOwABIhMAASIgAAJblYMAA9HkBFsAASI8uWsAA9UxJwABImxzAAEijgcAASJ/AZNA9QQEAAZMAwAD1nD0wwABIqR7AAEjEwADIKwAAAAA/TsAASNnAAEjfAACAimDAAPMrARzAAEjlLkQBAAGTAMAA9SxFwABI7gHAAEj3wABI+QAAW2DAAPR5AZQBHMAASQCDwABI/sBk0LRcAQABgcAASQLAZNA9AMAA9aYBi8AASQnAZNC0HMAASQeDwABJCcBk0LRdAQABlADAAPWePgE9isAASRTAZNCMHMAASSOAwABJHMBk0BggAgACgsAASSTAZNCMHMAASS8uRAEAAYPAAEkwwGTQtADAAPUsAABKwABJPwGCwABJRsBk0IwGwADSNIJ1wABJVMAASVbAAEowAACDEgAAAAEDwABJXcAASjAAAAEAAIH9YMAA9cUBWwICAsAASWAAAACTJV8AAADAAElwAAAAkyZhAl8AAGDAAPMrXwAAAABfAAABPgNOwABJo8AASacAAJblYMAA9HkBFsAASa4uWsAA9UxFwABJugHAAEnDwABJxQAAW2DAAPR5AZMBHMAAScyDwABJysBk0d1cAQABgsAASc7AZNG6AMAA9aYBi8AASdXAZNHdHMAASdODwABJ1cBk0d1dAQABlADAAPWePgE9iMAASeDAZNGOHMAASfaBwABJ78Bk0ZsgAgACgMAASffAZNGOHMAASgkuRAEAAYPAAEoKwGTR3QDAAPUsAABKwABKGQGAwABKIMBk0Y4GwADSNYJ1wABKNcAASkHAAEqMAACAnwAAAAEDwABKR8AASowAAAEAAIH9YMAA9cUBWwEBAcAASkoAAACBKGEBYMAA8ytfAAAAAF3AAPTbAV8AAAFKwABKZgEewABKasAAxw8CAmDAAPMrXwAAAi6AwABKisBk0rcABsAA0jaCdcAASpHAAEqdwABK9QAAkyIAAAABA8AASqbAAEr1AAABAACB/WDAAPXFAVsBAQHAAEqzAAAAgShhAWDAAPMrXcAA9NsBXwAAAABdwAD02wFfAAABSsAASs8BH8AAStPAAMdUAgJgwADzK18AAAIugMAASvPAZNMwAAbAANI3gnXAAEr6wABK/8AAS5wAAJMeAAAAAQPAAEsEwABLnAAAAAEBAcAASwoAAACBKGEBYMAA8ytgwADy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AGUTOgBlE4UAZRPeAGUUOwBlFJgAZRUVAGUVrABlFlsAZReNAGUYSABlGVcAAAA2AsAA0piCdcABM5DAATOwwAE3owPAAHQNASDAATORwADyhAEAASfAAGnYAAABYMAA0lsAAWDAANxbAAEFwADSpAAAAAAEAAADAAAAAAAAAAAAYMAA0pgBPwEJAQDAANJdAAAAAAcGwADSmoJ1wAE0EMABNFHAATTxAwBEASDAATQRwADyhAIAAifAAGwqLWDAANc/AAAAAQPAATRTwAE08QAAAAEBAcABNFgAAAAnYMAA9HkAAGDAANx2AT4CScABNGUiHMABNG+AwAE0acBlGt5cAQABkwDAAPWmARzAATR8gMABNHbAZRregUgBAAEWwAE0fy5awADPEQDAAPWpPgE9MMABNI8fwAE0mcAA888DAAOAwAE0qsBlGt4uJycAP0rAATTLARzAATTSLsAAdA7AAM2SAQABgMABNOfAZRreAMAA0p4GwADSm4J1wAE09sABNQTAATW2AwCAsgAAAAEDwAE1B8ABNbYAAAACAgLAATUMAAAAJ2DAAPR5AMABNR0AACCAimDAANx2AABcAT4CScABNSoiHMABNTSAwAE1LsBlG6hcAQABkwDAAPWmARzAATVBgMABNTvAZRuogUgBAAEWwAE1RC5awADPEQDAAPWpPgE9MMABNVQfwAE1XsAA888DAAOAwAE1b8BlG6guJycAPz0cwAE1kC7AAHQPwADNkgIAAoDAATWlwGUbqIHAATWswGUbtgDAANKfBsAA0qKCdcABNfDAATX4wAE2OQEAwABpfwAAAAEDwAE2C8ABNjkAAAAAAAAAYMAA9HkBPgFKwAE2EQEawAE2JsAA3F0GwADSnYJ1wAE2XcABNmvAATatAADAAHOUwADNkgAAAAEDwAE2dsABNq0AAAABAQHAATZ7AAAAWmDAAPR5AABgwADcWwE+AUrAATaJAR7AATaUwADcXwEAAYDAATaiwGUcywAGwADSnoJ1wAE2ssABNrzAATchAADAAHQOwADNkgAAAAEDwAE20MABNyEAAAABAQHAATbVAAAAJ2DAAPR5AABgwADcdgE+AUrAATbiARzAATbpLsAAc9fAAM2SAQABHMABNv2AwAE298BlHS6DPgEAARrAATcNwADcXQDAAPWgAMAAzygGwADSn4J1wAE3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APXFAABgwADyswE+A07AALCSwACwlgAAluVgwAD0eQEWwACwnS5awAD1TEXAALCpAcAAsLLAALC0AABbYMAA9HkBkwEcwACwu4LAALC5wGVZgVwBAAGBwACwvcBlWV4AwAD1pgGKwACwxMBlWYEcwACwwoLAALDEwGVZgV0BAAGUAMAA9Z4+AUnAALDPHMAAsNscwACw1y5EAQABgsAAsNjAZVmBAMAA9SxBAQABgMAAsN7AZVlFAMAA9dJKwACw5wEpP0rAALD+ASoGwADTBYJ1wACxE8AAsRjAALIBAAC8eQAAAAEDwACxH8AAsgEAAAABAAHAALEoAAAAvHpgwADKZAErAFwBPgM9IxzAALE+gMAAsTfAZVpFQQEAASsAwAD10ojAALE3wGVaRR7AALFGwADKZgAAAAArAWDAAMpkTsAAsVjAALFaAABbYMAA9HkBFsAAsWEuWsAA9UxDwACxbRzAALF2gcAAsXTAZVqSgIsBAAGUAMAA9ag+BU7AALGHwACxiwAAvHtgwAD0eQEcwACxlIDAALGNwGVaRbx8AQABgcAAsZzAZVqSAMAAymk9icAAsabAZVqSHMAAsaiBwACxpsBlWpKBQQEAAZQAwAD1n07AALG4wACxvAAAu3lgwADevwEcwACxwi5EAQABgcAAscPAZVqSAMAA9Sw9HMAAsdEugLICAAKBwACx0sBlWpIcwACx2y5EAQABgsAAsdzAZVrPAMAA9SwAwAD1LT0cwACx7C6AsgIAAoLAALHtwGVaz4PAALH0wGVbJgDAAPUtBsAA0waCdcAAsgbAALILwAC63wAAgxcAAAABA8AAshPAALrfAAAABAMEwACyGAAAAGNgwAD0eQDAALIjAAAAghNgwAD0eQDAALI8AAAgkxZdwAD02wFgwADevwDAALJNAAAAvH9gwAD0eQGTAFwBPgtJwACyeCIiHMAAsn6TgIsBAAGAwACygMBlW88AwAD1qAEcwACyj4DAALKJwGVbz4CLAQABgcAAspHAZVvdAMAA9agBHMAAspyBwACymMBlW92AiwEAARbAALKeLlrAAPVMAMAA9ag+Aj0ewACyucAA87oDAAOAwACyycBlW8+BwACy0MBlW90WwACy1S5awAD1TABAKsAAsv3AALMCAD9JwACzDxzAALMdg8AAsxPAZVwBXAEAAZMAwAD1pj4B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AAABA8AArA/AAKxxAAAAAQEBwACsJAAAIIObXcAA9NsBYMAA3r8AAF3AAPTbAWDAAN6/AUrAAKw0AR7AAKw4wADH9gIBYMAA3r8CLoDAAKxrwGfLKgAGwADXBoJ1wACsdsAArH7AAKysAACTIAAAAAEDwACshcAArKwAAAEAAJPcYMAA9cUBWwAAAABdwAD1HQFfAAABSsAArIsBHsAArJDAAPUoAQJgwADev18AAAEuAAbAANcwgnXAAKywwACsucAArSgCAILSAAAAAQPAAKy+wACtKAAAAAEBAcAArMkAACCAimDAAN6/AABcAT4CScAArNYcwACs5hbAAKzfLlrAAPVMQQEAAZMAwAD1nD0wwACs7B/AAKz2wADzzwIAApMuAD89HMAArRkugLICAAKTgMAArR/AZ8v0AMAA9S0GwADXMYJ1wACtLcAArTbAAK2yAgCBeQAAAAEDwACtOsAArbIAAAABAQHAAK1FAAAggIpgwADevwAAXAE+AknAAK1SHMAArWIWwACtWy5awAD1TEEBAAGTAMAA9Zw9MMAArWgfwACtcsAA888CAAKTLgA/PRzAAK2VLoCyAgACHMAAraIWwACtmy5awAD1TIFBAQABlADAAPWfgMAAranAZ8yCAMAA9S0GwADXB4J1wACtt8AArbvAAK56AAC8hwAAAAEDwACtxcAArnoAAAACAQLAAK3LAAAAk+NhAWDAAN6/YMAA8rMAwACt6QAAAGNgwAD0eQGTAGDAAPR5AT4DScAArfscwACuBYHAAK3/wGfNQFwBAAGTAMAA9aY9icAArgrAZ81Akz9FwACuGQHAAK4iwACuJAAAW2DAAPR5AYHAAK4mwGfNQAEcwACuL4LAAK4twGfNh1wBAAEWwACuMS5awAD1TADAAPWmAYrAAK45wGfNhxzAAK46gsAArjnAZ82HXQEAAZQAwAD1nj4BScAArkYcwACuToDAAK5KwGfNKiABAAEcwACuUy5EAQABgsAArlTAZ82HAMAA9SwAAErAAK5ZAYLAAK5gwGfNhz9KwACubQEcwACudJSBVgAAAADAAPScBsAA1wiCdcAArn/AAK6DwACvaAAAvIgAAAABA8AArpHAAK9oAAAAAgECwACulwAAAJPjYQFgwADev2DAAPKzAMAArrUAAABjYMAA9HkBKwBgwAD0eQE+A0nAAK7D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AYrAAEv+wGm6mRzAAEv8gsAAS/7AabqZXQEAAZQAwAD1nj4BScAATAkcwABMDoDAAEwNwGm6ViABAAEcwABMEy5EAQABgsAATBTAabqZAMAA9SwAAErAAEwZASk/SsAATDABKgbAANpegnXAAExFwABMTMAATWkAAJMjAAAAAQPAAExWwABNaQAAAAIBAcAATFwAAACT42EBYMAA8ytgwADyswABwABMegAAIJMkYQBgwADzKwErYMAA8ysBPgROwABMj8AATJMAAJblYMAA9HkBFsAATJouWsAA9UxFwABMpgHAAEyvwABMsQAAW2DAAPR5AZMBHMAATLiDwABMtsBpu69cAQABgsAATLrAabuMAMAA9aYBi8AATMHAabuvHMAATL+DwABMwcBpu69dAQABlADAAPWePgJOwABM0MAATNgAAJMNYMAA8ysBHMAATN4uRAEAAYPAAEzfwGm7rwDAAPUsScAATOkcwABM8YDAAEztwGm7WiABAAGEwABM8sBpvAcAAErAAEz8AYTAAE0DwGm8Bz9JwABNFiEcwABNIYHAAE0awGm7cUEBAAErAMAA9dJKwABNKgEcwABNN4HAAE0xwGm7cSAAAAAAAD89MMAATT8ewABNWsAAyCsAAAAABsAA2l+CdcAATW7AAE11wABOqAAAkykAAAABA8AATX7AAE6oAAAAAgEBwABNhAAAAJPjYQFgwADzK2DAAPKzAAHAAE2iAAAgkyRhAGDAAPMrAStgwADzKwE+BE7AAE23wABNuwAAluVgwAD0eQEWwABNwi5awAD1TEXAAE3OAcAATdfAAE3ZAABbYMAA9HkBHMAATd+CwABN28BpvQuBQQEAAZQAwAD1nwEcwABN5oPAAE3kwGm9LoFIAQABkwDAAPWpAYvAAE3uwGm9LhzAAE3sg8AATe7Aab0ugUEBAAGUAMAA9Z8+Ak7AAE39wABOBQAAkw1gwADzKwEcwABOCy5EAQABg8AATgzAab0uAMAA9SxJwABOFhzAAE4egMAAThrAabzZIAEAAYTAAE4fwGm9mAAAPgFKwABOMwGEwABOOsBpvZg/ScAATlUhHMAATmCBwABOWcBpvPBBAQABKwDAAPXSSsAATmkBHMAATnaBwABOcMBpvPAgAAAAAAA/PTDAAE5+HsAATpnAAMgrAAAAAAbAANpggnXAAE6twABO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OQAAg7wAAAABA8AAR8XAAEg5AAAAAQEBwABHywAAAIEoYQFgwADzK1wAAFwBPgJOwABH6MAAR+wAAJblYMAA9HkBFsAAR/MuWsAA9UxFwABH/wHAAEgIwABICgAAW2DAAPR5AZMBHMAASBGCwABID8Bp5U9cAQABgcAASBPAaeUsAMAA9aYBisAASBjAaeVPHMAASBmCwABIGMBp5U9dAQABlADAAPWePgE9HMAASCaAwABIJcBp5RQgAQABHMAASCsuRAEAAYLAAEgswGnlTwDAAPUsAAAGwADaoIJ1wABIPsAASEXAAElPAACTKgAAAAEDwABIS8AASU8AAAABAQHAAEhTAAAgkyZhAmDAAPMrYMAA8ytgwADzKwAAYMAA8ysBPgVOwABIhMAASIgAAJblYMAA9HkBFsAASI8uWsAA9UxJwABImxzAAEijgcAASJ/AaeYiQQEAAZMAwAD1nD0wwABIqR7AAEjEwADIKwAAAAA/TsAASNnAAEjfAACAimDAAPMrARzAAEjlLkQBAAGTAMAA9SxFwABI7gHAAEj3wABI+QAAW2DAAPR5AZQBHMAASQCDwABI/sBp5plcAQABgcAASQLAaeYiAMAA9aYBi8AASQnAaeaZHMAASQeDwABJCcBp5pldAQABlADAAPWePgE9isAASRTAaeZxHMAASSOAwABJHMBp5f0gAgACgsAASSTAaeZxHMAASS8uRAEAAYPAAEkwwGnmmQDAAPUsAABKwABJPwGCwABJRsBp5nEGwADaoYJ1wABJVMAASVbAAEowAACDEgAAAAEDwABJXcAASjAAAAEAAIH9YMAA9cUBWwICAsAASWAAAACTJV8AAADAAElwAAAAkyZhAl8AAGDAAPMrXwAAAABfAAABPgNOwABJo8AASacAAJblYMAA9HkBFsAASa4uWsAA9UxFwABJugHAAEnDwABJxQAAW2DAAPR5AZMBHMAAScyDwABJysBp58JcAQABgsAASc7AaeefAMAA9aYBi8AASdXAaefCHMAASdODwABJ1cBp58JdAQABlADAAPWePgE9iMAASeDAaedzHMAASfaBwABJ78Bp54AgAgACgMAASffAaedzHMAASgkuRAEAAYPAAEoKwGnnwgDAAPUsAABKwABKGQGAwABKIMBp53MGwADaooJ1wABKNcAASkHAAEqMAACAnwAA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wADauwAgAMAAxUMBAAEnwAB0vAAAAAEDwAHJ38ABykMAAAADAwPAAcnrAAAAghJgwADPCwDAAcn3AAAAo9ZgwAD0eQDAAcoKAAAAWmDAAPR5AABgwADauwAGwADav4J1wAHKdMAByoTAActfAwBEAAAAAQPAAcqGwAHLXwAAAAEBAcAByosAAAAnYMAA9HkAAGDAAPMrAT4CScABypgiHMAByqKAwAHKnMBp/hpcAQABkwDAAPWmARzAAcqvgMAByqnAaf4agUgBAAEWwAHKsi5awADXqQDAAPWpPgE9MMABysIfwAHKzMAA888DAAOAwAHK3cBp/houJycAP0rAAcr+ARzAAcsZFsABywUuwAB0l8AAzZLAANenwABz08AAzZIBAAEcwAHLMxbAAcslLqPWwADN/V0BAAEcwAHLPIDAAcs2wGn+GoM+AQABGsABy0rAANxWAMAA9aAAwAD1ngDAAM8mBsAA2sCCdcABy2TAActywAHMXAMAgLIAAAABA8ABy3XAAcxcAAAAAgICwAHLegAAACdgwAD0eQDAAcuIAAAggIpgwADzKwAAXAE+AknAAcuVIhzAAcufgMABy5nAaf8nXAEAAZMAwAD1pgEcwAHLrIDAAcumwGn/J4FIAQABFsABy68uWsAA16kAwAD1qT4BPTDAAcu/H8ABy8nAAPPPAwADgMABy9rAaf8nLicnAD89HMABzAYWwAHL+y7AAHSXwADNksAA16fAAHPVwADNkgIAAhzAAcwpFsABzBsuo9bAAM39XQEAARzAAcwygMABzCzAaf8ngz4BAAEawAHMQMAA3FYAwAD1oADAAPWegcABzFLAaf81AMAAzycGwADaxYJ1wAHMksABzJrAAczZAQDAAGl/AAAAAQPAAcytwAHM2QAAAAAAAABgwAD0eQE+AUrAAcyzARrAAczGwADcVgbAANrCgnXAAcz9wAHNCcABzUkAAMAAc5TAAM2SAAAAAQPAAc0UwAHNSQAAAAEBAcABzRkAAABaYMAA9HkAAGDAANxUAT4BSsABzScBHsABzTLAANxYAQABgMABzT7AagCNAAbAANrDgnXAAckdwAHJHQAAELyCAMAAzbXAAM21AQMAAAAAAAMDAwAAAABjYMAA9HkAAAAAAIITYMAA9HkAAAAAIIOUXcAA9NsBWwAAXAFKAAEdALyCAwADgADA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ALEOAACC0AAAAAEDwACwd8AAsQ4AAAABAQHAALB/AAAAkw1gwAD1xQAAYMAA8rMBPgNOwACwksAAsJYAAJblYMAA9HkBFsAAsJ0uWsAA9UxFwACwqQHAALCywACwtAAAW2DAAPR5AZMBHMAAsLuCwACwucBqbm5cAQABgcAAsL3Aam5LAMAA9aYBisAAsMTAam5uHMAAsMKCwACwxMBqbm5dAQABlADAAPWePgFJwACwzxzAALDbHMAAsNcuRAEAAYLAALDYwGpubgDAAPUsQQEAAYDAALDewGpuMgDAAPXSSsAAsOcBKT9KwACw/gEqBsAA22yCdcAAsRPAALEYwACyAQAAvHkAAAABA8AAsR/AALIBAAAAAQABwACxKAAAALx6YMAAymQBKwBcAT4DPSMcwACxPoDAALE3wGpvMkEBAAErAMAA9dKIwACxN8BqbzIewACxRsAAymYAAAAAKwFgwADKZE7AALFYwACxWgAAW2DAAPR5ARbAALFhLlrAAPVMQ8AAsW0cwACxdoHAALF0wGpvf4CLAQABlADAAPWoPgVOwACxh8AAsYsAALx7YMAA9HkBHMAAsZSAwACxjcBqbzK8fAEAAYHAALGcwGpvfwDAAMppPYnAALGmwGpvfxzAALGogcAAsabAam9/gUEBAAGUAMAA9Z9OwACxuMAAsbwAALt5YMAA3r8BHMAAscIuRAEAAYHAALHDwGpvfwDAAPUsPRzAALHRLoCyAgACgcAAsdLAam9/HMAAsdsuRAEAAYLAALHcwGpvvADAAPUsAMAA9S09HMAAsewugLICAAKCwACx7cBqb7yDwACx9MBqcBMAwAD1LQbAANttgnXAALIGwACyC8AAut8AAIMXAAAAAQPAALITwAC63wAAAAQDBMAAshgAAABjYMAA9HkAwACyIwAAAIITYMAA9HkAwACyPAAAIJMWXcAA9NsBYMAA3r8AwACyTQAAALx/YMAA9HkBkwBcAT4LScAAsngiIhzAALJ+k4CLAQABgMAAsoDAanC8AMAA9agBHMAAso+AwACyicBqcLyAiwEAAYHAALKRwGpwygDAAPWoARzAALKcgcAAspjAanDKgIsBAAEWwACyni5awAD1TADAAPWoPgI9HsAAsrnAAPO6AwADgMAAssnAanC8gcAAstDAanDKFsAAstUuWsAA9UwAQCrAALL9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AACyF2DAAPKzAABgwADmkQE/AQkAwABLasAA5qACAAKAwABLcMBuxM4ewABLkMAA5oQDAAOBwABLp8BuxN2CwABLs8BuxO6DwABLv8BuxQMAAAAAAG7FWwAAAAACwADmlIKUwABLycAAS8/AAFGOA8AAe2YAAAFgwADBIwAABATAAOaXgpTAAEwOwABMFQm8dcAA4qsAYMAA5nsABMAA5piClMAATDLAAEw3CZa0wADiqwBgwADBIwAEwADmmYKUwABMQMAATE8YsyvAAOKrAGDAAPKzASoEwADmmoKUwABMWMAATGUYqgjAAOKrAGDAAPKzASkBBcAA5qCClMAATGrAAExqwABMjwAAAAPAAEx1wABMjwAAAAICAsAATHsAAASWtGDAAMEjAMAATIcAAAS8dWDAAOZ7AABgwADmlAE/AwgBwADmmIAAwG7GIwgBwADml4EAwG7GMgkBwABMasAAwS0AAAAAAwbAAOacgpTAAEyUwABMmcAATNwAAE8AAAABA8AATJzAAEzcAAAAAQEBwABMpwAAIBJdwAD1HQFgwAD0eQAAXAE+AT0cwABMsy7AAGiGBAAEgMAATLzAbsaakxbAAEzKgMAATMXAbsaaWsAA9UwqAMAA5p0GwADmnYKUwABM4cAATObAAE96AADAAGiGAAAAAQPAAEzuwABPegAAAAQEBMAATPkAAAASXcAA9R0BYMAA9HkAwABNAwAAAGNgwAD0eQDAAE0OAAAAghNgwAD0eQDAAE0YAAAAwABoh2DAAPKzAABcAT4FScAATSYWwABNKi6zK8AA4qvAAOaZSsAATTMAP0nAAE0/HMAATUeCwABNQ8BuxzJBAQABKwDAAPWcPTDAAE1QH8AATVrAAPOuAQABJ4ITAD89HsAATYfAAPO6AwADgcAATZfAbsckgsAATZ7AbscyFsAATaiAwABNo8BuxxBawAD1TABLPgU9F8AATcEuqgjAAOKrKsAA5ppOwABN58AATfYAAMAAejNgwADmGAEewABOAsAA4uADAAOAwABOJcBuxxCBwABOK8BuxySCwABOMsBuxzIAPRzAAE5GFsAATj4uvHXAAOKrwADml8AAQk8DAAMWwABOXYTAAE5OwG7H8IISwADmGhbAAE50hMAATmXAbsfwY8AA5hscwABOiYLAAE6FwG7HMoFBAQABHMAATpKBwABO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wAD1HQFgwAD0eQAGwADnVoKawABCVsAAQl3AAEKgAAKEBQAAAAEDwABCZsAAQqAAAAACAAACwABCcQAAAIFRYMAA5x0BGsAAQoDAAOchwABCkAAAAMAARHdgwADBnwEawABCmsAAvxhgwADpVQAGwADnV4KawABDWMAAQ2rAAEN3AAKEhgAAAAEDwABDdcAAQ3cAAAAAAAAAXcAAsuoBXcAA9R0BYMAA9HkABsAA51iCmsAARA7AAEQYwABEKQACg/sAAAABA8AARCfAAEQpAAAAAAAAAF3AAPUdAWDAAPR5AAbAAOdZgprAAET5wABFCMAARS8AAoSHAAAAAQPAAEUUwABFLwAAAAEAAAHAAEUfAAAAwABEd2DAAMGfARrAAEUpwAC/GF3AALLqAWDAAPZdAAbAAOdagprAAEXfwABF5sAARhEAAsAAZhMAAAABA8AARfbAAEYRAAAAAQAAAcAARgEAAADAAER3YMAAwZ8BGsAARgvAAL8YYMAA9l0ABsAA51uCmsAARuvAAEcAwABHJgACwAB73gAAAAEDwABHC8AARyYAAAABAAABwABHFgAAAMAARHdgwADBnwEawABHIMAAvxhdwACy6gFdwAD1HQFgwAD2XQAGwADnXIKawABH28AAR+jAAEgSAALAAHvfAAAAAQPAAEf3wABIEgAAAAEAAAHAAEgCAAAAwABEd2DAAMGfARrAAEgMwAC/GF3AAPUdAWDAAPZdAAbAAOddgprAAEp/wABKjMAASuMAAsAAdlAAAAABA8AASpjAAErjAAAAAwEBwABKowAAAIP6XcAA9R0BYMAA9HkAAsAASroAAACBUWDAAOcdARrAAErJwADnIcAAStUAAACEB2DAAPKzASpdwACy6gFgwADnPQAGwADnXoKawABNFsAATRvAAE12AAKncgAAAAEDwABNK8AATXYAAAADAQHAAE02AAAAg/pdwAD1HQFgwAD0eQACwABNTQAAAIFRYMAA5x0BGsAATVzAAOchwABNaAAAAIQHYMAA8rMBKlwABsAA51+CmsAAT+vAAE/4wABQdQACwAB74AAAAAEDwABQBcAAUHUAAAAEAQHAAFANAAAAhOxgwAD2XQADwABQJwAAAIFRYMAA5x0BGsAAUDbAAOchwABQTAAAAMAARHdgwADBnwEawABQVsAAvxjAAFBnAAAAhAdg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AIE8AQFgwADyswE0wABkwwPAAGTDwABk8AAAAAEBAcAAZMQAAACCF2DAAOg5AABgwADyswFKwABkzQEcwABk04HAAGTOwG+ws0EBAAEawABk68AA6D8AwAD10gDAALL9BsAA6KCCnMAAZT/AAGVTwABlxwABwAB8mQAAAAEDwABlWcAAZccAAAABAQHAAGVhAAAAR2DAAPZdAABdwACy6gFgwADyswFKwABlagEcwABllB7AAGVqwADolwIAAh7AAGVzwADojAEAAYDAAGWAwG+xIAApAIE8AQFgwADyswE0wABlmQPAAGWZwABlxgAAAAEBAcAAZZoAAACCF2DAAOg5AABgwADyswFKwABlowEcwABlqYHAAGWkwG+xiEEBAAEawABlwcAA6DsAwAD10gDAALL9BsAA6KGCnMAAZhrAAGYuwABmtgABRgAAAAEDwABmOcAAZrYAAAABAQHAAGZBAAAAR2DAAPZdAABdwACy6gFgwADyswFKwABmUAEcwABmfh7AAGZQwADolwIAAh7AAGZZwADojAEAAYDAAGZmwG+x8gApAIE8AQFgwADyswE0wABmgwPAAGaDwABmtQAAAAEBAcAAZoQAAACCF2DAAOg5AABgwADyswFKwABmjQEcwABmk4HAAGaOwG+yWkEBAAEawABmq8AA6D0AwAD10gDAALL9BsAA6KKCnMAAZy/AAGc7wABneAABwAB8mgAAAAEDwABnRcAAZ3gAAAABAQHAAGdNAAAAR2DAAPZdAABgwADyswFKwABnVgEewABnVsAA6JABAAEewABnZcAA6IwBAAGAwABncsBvsscAAAbAAOiQgpzAAGd9wABnicAAZ+UAAcAAfJvAAOKrAAAAAQPAAGeXwABn5QAAAAEBAcAAZ5gAAADAAHt3WwAAYMAA8rMBSsAAZ6oBHMAAZ8gewABnq8AA6JUCAAImwABnuAGAwABnuMBvszVgwADcEyoAQQEAARrAAGfgwADoPwDAAPXSBsAA6KOCnMAAaErAAGhWwABovAABwAB8nAAAAAEDwABoYMAAaLwAAAABAQHAAGhoAAAAR2DAAPZdAABgwADyswFKwABodwEcwABonx7AAGh4wADolQIAAh7AAGiFwADojAEAAYDAAGiSwG+ztAApAEEBAAEawABot8AA6DsAwAD10gbAAOikgpzAAGkmwABp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FYKnwABZT8AAWV4GwAB94QEgwABZEcAA8m4BAAEnwAB+EwBgwADq7wEawABZWMAA6vgEwADrFoKnwABZosAAWbMGwAB94wEgwABZY8AA8m4BAAEnwAB+FABgwADq7wEawABZrMAA6vkEwADrF4KnwABZ98AAWggGwAB95QEgwABZuMAA8m4BAAEnwAB+FQBgwADq7wEawABaAcAA6voEwADrGIKnwABaTMAAWl0GwAB95wEgwABaDcAA8m4BAAEnwAB+FgBgwADq7wEawABaVsAA6vsEwADrGYKnwABaocAAWrIGwAB96QEgwABaYsAA8m4BAAEnwAB+FwBgwADq7wEawABaq8AA6vwEwADrGoKnwABa9sAAWwcGwAB96wEgwABat8AA8m4BAAEnwAB+GABgwADq7wEawABbAMAA6v0EwADrG4KnwABbS8AAW1wGwAB97QEgwABbDMAA8m4BAAEnwAB+GQBgwADq7wEawABbVcAA6v4EwADrHIKnwABboMAAW7EGwAB97wEgwABbYcAA8m4BAAEnwAB+GgBgwADq7wEawABbqsAA6v8EwADrHYKnwABb9cAAXAYGwAB98QEgwABbtsAA8m4BAAEnwAB+GwBgwADq7wEawABb/8AA6wAEwADrHoKnwABcSsAAXFsGwAB98wEgwABcC8AA8m4BAAEnwAB+HABgwADq7wEawABcVMAA6wEEwADrH4KnwABcn8AAXLAGwAB99QEgwABcYMAA8m4BAAEnwAB+HQBgwADq7wEawABcqcAA6wIEwADrIIKnwABc9MAAXQUGwAB99wEgwABctcAA8m4BAAEnwAB+HgBgwADq7wEawABc/sAA6wMEwADrIYKnwABdScAAXVoGwAB9+QEgwABdCsAA8m4BAAEnwAB+HwBgwADq7wEawABdU8AA6wQEwADrIoKnwABdnsAAXa8GwAB9+wEgwABdX8AA8m4BAAEnwAB+IABgwADq7wEawABdqMAA6wUEwADrI4KnwABd8sAAXgEGwAB9/QEgwABdtMAA8m4BAAEnwAB+IQBgwADq7wEawABd+8AA6wYEwADrJIKnwABeRcAAXlYGwAB9/wEgwABeBsAA8m4BAAEnwAB+IgBgwADq7wEawABeT8AA6wcEwADrJYKnwABemsAAXqsGwAB+AQEgwABeW8AA8m4BAAEnwAB+IwBg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RMrAAETeBsAAfk0AYMAA9HkBlgTAAOusgqnAAETzwABFAgbAAH5OAGDAAPR5AZcEwADrroKpwABFoMAARacYwAB6fcAA4qsAYMAA7QMABMAA66+CqcAARc3AAEYJCcAAfk/AAOKrAF3AALMKAWDAAOujAR7AAEXswACzDAABYMAA66MAAATAAOuwgqnAAEYuwABGORjAAGoSwADiqwBdwAC0HwFgwADs6AErBMAA67GCqcAARlTAAEZbGMAAasfAAOKrAF3AALOZAWDAAOzoASsEwADrsoKpwABGgsAARpUYwAB+UMAA4qsAXcAAs9ABYMAA7OgABMAA67OCqcAARqPAAEawGMAAflHAAOKrAF3AAPUdAWDAAPR5AATAAOu0gqnAAEa4wABGzhjAAH5SwADiqwBgwAD0eQGTBMAA68WCqcAARujAAEbvCcAAb9YAYMAA7G8ABMAA68aCqcAARv7AAEcHCcAAerYAYMAA8rMABMAA68eCqcAARxvAAEciGIHnAGDAAOw4AATAAOvIgqnAAEcxwABHSQnAAHqrAGDAAPKzAATAAOvJgqnAAEdYwABHcAnAAHqsAGDAAPKzAATAAOvKgqnAAEeDwABHkwnAAH44AGDAAPRvAATAAOu1gqnAAEecwABHtRjAAH5TwADiqwBgwAD0eQEawABHpsAA66UEwADrtoKpwABHvsAAR9gYwAB6h8AA4qsAYMAA8rMBKQTAAOu3gqnAAEfhwABH+hjAAHqGwADiqwBgwADyswEpBMAA67iCqcAASALAAEgRGMAAflTAAOKrAGDAAPR5AZMEwADruYKpwABIGsAASDMYwAB+VcAA4qsAYMAA8rMBKgTAAOu6gqnAAEg8wABIVRjAAH5WwADiqwBgwADyswEqBMAA67uCqcAASIvAAEilGMAAflfAAOKrAGDAAPKzASoEwADrvIKpwABI28AASO4YwAB+WMAA4qsAYMAA8rMBKgTAAOu9gqnAAEkpwABJPRjAAH5ZwADiqwBgwADyswEqBMAA676CqcAASa/AAEnhGMAAe+7AAOKrAF3AALMKAWDAAOuAAR7AAEnFwACzDAABYMAA64AAAATAAOu/gqnAAEnzwABKFhjAAH5awADiqwBgwADrmAEfwABKB8AA66IAAAAABMAA68CCqcAASh/AAEo1GMAAflvAAOKrAGDAAPKz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wACBfsByIdrAAIA1wADuIAIAAoPAAIGTwHIiDykAwADu68AAgDPAAO4gAgACGsAAgbDAAO7RKQDAAO7pP0rAAIHKARzAAIHRLsAAgDfAAO4gAgACgcAAgd/AciELKgDAAO7tP07AAIISAAAAgMZbAE7AAIIVAAAAg1lbAEnAAIIcFsAAgiAuwAB/6MAA7iDAAO7IPgI9isAAgjXAciLBgcAAgjnAciELPYvAAIJGwHIizS4+Aj2KwACCfMByIsEuPYvAAIKMwHIizYHAAIKQwHIhC07AAILswACC7wAAwACAPFsBHMAAgvODwACC8cByIs3AAIA0wADuIAIAAhrAAIMCwADu0SkAAErAAINVASbAAINVARzAAIN6HMAAg1+EwACDXMByIzDAAIA2wADuIAIAAoLAAINxwHIiwSkAAMAAgDPAAO4gAgACGsAAg4nAAO7RKQAAYMAA7rIGwADvAoK4wACFBcAAhRrAAIiiAwCDgwAAAAEDwACFG8AAiKIAAAABAQHAAIUjAAAAwACALWDAAPKFAABgwADusgE+CU7AAIU9wACFQwAAg5tgwADusgEmwACFPQGAwACFRcByI+FgwADusknAAIVRFsAAhVUuwACADMAA7iDAAO8cSsAAhV4BgcAAhWXAciP8P0nAAIVwFsAAhXqBwACFdMByI/zAAIAMwADuIMAA7xxKwACFgwEuP0nAAIWUHMAAhaQWwACFmC7AAH/owADuIMAA7shBAQABFsAAha2BwACFp8ByI/zAAH/owADuIMAA7sgAwAD10j4CScAAhcIWwACFxi7AAH/owADuIMAA7sg+A07AAIYxwACGNwAAwACAOmDAAO6yARzAAIY5LsAAgDTAAO4gAgACGsAAhkjAAO7RKQDAAO7qTsAAhmDAAIZnAADAAIA7YMAA7rIBHMAAhm+BwACGacByI/zAAIA0wADuIAIAAhrAAIZ+wADu0SkAwADu6krAAIaSARzAAIafgsAAhpnAciTLwACAOcAA7iACAAKDwACGrsByJQAqAMAA7u4/SsAAhswBHMAAhtMuwACAOcAA7iACAAKBwACG4sByI/wqAMAA7u4/TsAAhyMAAACAxlsATsAAhyYAAACDWVsAScAAhy0WwACHMS7AAH/owADuIMAA7sg+Aj2KwACHRsByJZOBwACHSsByI/w9i8AAh1fAciWf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wACs88AArQAAAMAAgE9gwAD0eQEcwACtEhrAAK0CwADuxYFBAQABGsAArRTAAO7GAMAA9Z9OwACtKsAArTUAAMAAgFBgwADcOAEewACtN8AA7twEAAQawACtTcAA7sQawACtYMAA7sYawACtbsAA7sWCwACtf8ByRYQATsAArZbAAK2aAADAAIBRYMAA7rIBH8AAraDAAO8rAwADKoLAAK21wHJFhIPAAK3DwHJFugBJwACt1CIhHMAAreUWwACt2S7AAH/owADuIMAA7shBAQABFsAAre6BwACt6MByRLjAAH/owADuIMAA7sgAwAD10gAcwACuCRbAAK4DhMAArf/AckYAwABxjcAA7iDAAO7KgIsBAAGTAMAA9ag+AT2MwACuF8ByRgAcwACuHYTAAK4ewHJGAIFWAAAAAMAA7vs/SsAAri0BhMAArjTAckYABsAA7vWCuMAArofAAK6TwACw6wAAwACAUsAA7iAAAAABA8AArpfAALDrAAAAAQEBwACunwAAAMAAgC1gwADyhQAAYMAA7rIBPglOwACuucAArr8AAIObYMAA7rIBJsAArrkBgMAArsHAckcEYMAA7rJAHMAAruAWwACu2oHAAK7UwHJHH8AAcY3AAO4gwADuyoCLAQABkwDAAPWowACu1MAAruMAScAAruocwACu9BbAAK7uLsAAcY3AAO4gwADuylwBAAEWwACu/IHAAK72wHJHH8AAcY3AAO4gwADuygDAAPWmPgFKwACvCwEuPz0cwACvIi7AAIBOwADuIAEAAYHAAK8qwHJHHwDAAO72TsAAr6XAAK+vAADAAIBTYMAA3DgBHsAAr7nAAO7cBAAEGsAAr8bAAO7EkxrAAK/cwADuxhrAAK/qwADuxgBOwACwAcAAsAUAAMAAgFRgwADusgEfwACwC8AA7ysDAAMqGsAAsCDAAO7GgsAAsC7AckfjAEnAALA+HMAAsE8awACwQsAA7seAiwEAAZMAwAD1qD4BPYvAALBcwHJIIRzAALBmg8AAsGLAckghg4QBAAEawACwacAA7scAwADu/j9JwACwmyIWwACwny7AAH/owADuIMAA7sgAHMAAsLkWwACws4PAALCvwHJIIcAAcY3AAO4gwADuyoCLAQABkwDAAPWoPgE9i8AAsMfAckghHMAAsM2DwACwzsBySCGBVgAAAADAAO77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AMAA9aYBHMAA08YcwADTvhTAANOywHJdyQgARAEAARzAANPBFMAA07/Acl5MCgCBQQEAAZQAwAD1nwDAAPUsXAEAARzAANPMhsAA08jAcl2pRAEAARrAANPNwADuzgDAAPUsAMAA9aY+Bk7AANPvwADT9wAAwABsWGDAAPR5AR7AANP5wADu3gQABITAANQIwHJdh4PAANQSwHJddhTAANQZwHJekgsAh8AA1BzAcl24AD0ewADUMsAA7ugFAAUUwADUOsByXckIABTAANRIwHJd5AkAh8AA1FTAcl24FMAA1F/AcmWTDwAUwADUaMByXckIAABJwADUgRzAANSaHMAA1ImGwADUhcByXalEAQABGsAA1IrAAO7OAMAA9SxBAQABkwDAAPWcPgE9NQAAAAEAYMAA3DgBhsAA1LDAcl2pNQAAAAEAYMAA9HkBGsAA1LXAAO7PNQAAAAEAYMAA9HkBHMAA1K4cwADUtBTAANS0wHJmVRAARAEAARTAANS0wHJmahEAAMAA9SyBQQEAAZQAwAD1nzUAAAABAFwBHMAA1LQUwADUtMByZlUQAICyAgACFMAA1LTAcmZqEQAUAMByZn8SAADAAPUtFADAcmZ/EgA/PTUAAAABAGDAANw4AYbAANTiwHJdqTUAAAABAGDAAPR5ARrAANTnwADuzjUAAAABAGDAAPR5ARzAANTgHMAA1OYUwADU5sByZv4QAEQBAAEUwADU5sByZxMRAADAAPUsgUEBAAGUAMAA9Z81AAAAAQBcARzAANTmFMAA1ObAcmb+EACAsgIAAhTAANTmwHJnExEAFADAcmcoEgAAwAD1LRQAwHJnKBIAQBzAANUZHMAA1RUUwADVCcByXckIAEQBAAEUwADVFsByXkwKAADAAPUsgUoBAAEcwADVIIbAANUcwHJdqUQBAAEawADVIcAA7s8AwAD1LADAAPWnwADVCcAA1TQAQ8AA1UEiHMAA1VkcwADVVRTAANVJwHJdyQgARAEAARTAANVWwHJeTAoAAMAA9SxcAQABHMAA1V+GwADVW8ByXalEAQABGsAA1WDAAO7PAMAA9SwAwAD1pgEcwADVmxzAANWTFMAA1YfAcl3JCABEAQABHMAA1ZYUwADVlMByXkwKAIFBAQABlADAAPWfAMAA9SxcAQABHMAA1aGGwADVncByXalEAQABGsAA1aLAAO7OAMAA9SwAwAD1pj4EPR7AANXCwADu6AUABRTAANXKwHJdyQgAFMAA1djAcl3kCQCHwADV5MByXbgUwADV78ByZZMPABTAANX4wHJdyQgAAEnAANYTHMAA1iwcwADWG4bAANYXwHJdqUQBAAEawADWHMAA7s4AwAD1LEEBAAGTAMAA9Zw+AT01AAAAAQBgwADcOAGGwADWRMByXak1AAAAAQBgwAD0eQEawADWScAA7s81AAAAAQBgwAD0eQEcwADWQhzAANZIFMAA1kjAcmk5EABEAQABFMAA1kjAcmlOEQAAwAD1LIFBAQABlADAAPWfNQAAAAEAXAEcwADWSBTAANZIwHJpORAAgLICAAIUwADWSMByaU4RABQAwHJpYxIAAMAA9S0UAMByaWMSAD89NQAAAAEAYMAA3DgBhsAA1nrAcl2pNQAAAAEAYMAA9HkBGsAA1n/AAO7ONQAAAAEAYMAA9HkBHMAA1ngcwADWfhTAANZ+wHJp4hAARAEAARTAANZ+wHJp9xEAAMAA9SyBQQEAAZQAwAD1nzUAAAABAFwBHMAA1n4UwADWfsByaeIQAICyAgACFMAA1n7Acmn3EQAUAMByagwSAADAAPUtFADAcmoMEgBAHMAA1rMcwADWrxTAANajwHJdyQgARAEAARTAANawwHJeTAoAAMAA9SyBSgEAARzAANa6hsAA1rbAcl2pRAEAARrAANa7wADuzwDAAPUsAMAA9afAANajwADWzgA/PRXAANb1wHJeTAocwADW9xTAANb1wHJeTAoAgUEBAAEUwADW+sByYS4NAADAAPWfPRXAANdNwHJd5AmDwADXWsByXXZJwADXZRzAANdthcAA12nAcl2YgIsBAAGTAMAA9ag+AT0VwADXmsByXeQJHsAA16fAAO7kBAAEFMAA17XAcl3JCAAUwADXw8ByXeQJAIXAANfPwHJdmBTAANfUwHJdyQgAAD9KwADX7QEUwADX9MByXeQJAAbAAO8dgrjAANgHwADYD8AA2yQBAIOJAAAAAQPAANgYwADbJAAAAAAAAABgwAD0eQE+Bk/AANjJwADYzQAAAZMmYQJgwAD0eWDAAPR5YMAA9HkAA8AA2NTAANl7AAAAAgICwADY2QAAAIOQYMAA9HkAwADY4wAAAICKYMAA9HkAAGDAAPR5AT4DPYnAANjywHJsABzAANkEN9////+DLAEAARzAANkMgcAA2QfAcmwAXQEAAYLAANkOwHJsDwDAAPWeAMAA9JE9icAA2RzAcmwAHMAA2S433////4MsAQABHMAA2TaBwADZMcBybABdAQABHMAA2U0cwADZRTfAB///gywBAAGBwADZR8BybAAAwAD0kYOCAQABNwoAwAD0lQDAAPWeAMAA9JFKwADZXAEcwADZaIHAANljwHJsAIODAQABHMAA2XCBwADZa8BybACDhAEAATcGAMAA9JYAwAD0k0/AANmCwADZhgAAAaf1YQFgwAD0eWDAAPR5AAPAANmMwADaPgAAAAEBAcAA2ZEAAACDkGDAAPR5AABgwAD0eQE+Az2KwADZn8BybSocwADZsTff////gywBAAEcwADZuYLAANm0wHJtKl0BAAEcwADZ0BzAANnIN8P///+DLAEAAYLAANnKwHJtKgDAAPSRg4IBAAGWAMAA9JUAwAD1ngDAAPSRPYrAANnewHJtKhzAANnqgsAA2eXAcm0qg4MBAAEcwADZ8oLAANntwHJtKoOEAQABNwsAwAD0lgDAAPSTSsAA2gABHMAA2hI33////4MsAQABHMAA2hqCwADaFcBybSpdAQABHMAA2jEcwADaKTe//4MsAQABgsAA2ivAcm0qAMAA9JGDggEAATcPAMAA9JUAwAD1ngDAAPSRScAA2kUWwADaSS7AAIAMwADuIMAA7xxKwADaUgE3mjM/TsAA2oDAANqFAACDkGDAAPR5ASMWwADahy7AAH/owADuIMAA7sg3wAFGgTfABo55AWDAAPR5RcAA2rkBwADawsAA2sQAAFtgwAD0eQGTARzAANrLg8AA2snAcm6aXAEAARbAANrNLsAAcY3AAO4gwADuygDAAPWmAYvAANrUwHJumhzAANrVg8AA2tTAcm6aXQEAAZQAwAD1nj4BPYrAANrhwHJuXxzAANrvgMAA2ujAcmvWIAIAAoLAANrwwHJuXxzAANr9FsAA2vYuwAB/6cAA7iDAAO7JRAEAAYPAANr+wHJumgDAAPUsAABKwADbDQEcwADbGoHAANsUwHJtBSABAAGCwADbG8Bybl8AAAbAAO8HgrjAANwRwADcH8AA3GYDAEEAAAABA8AA3CHAANxmAAAAAQEBwADcKQAAAIObYMAA9cUAAGDAAPKzAUrAANw5ASIl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3DgAPgI9HsABEFHAAO7oBQAFg8ABEFnAcpPHh8ABEGLAcpSDJsABEGsBFMABEGvAcpuSEABgwADcOIfAARB0wHKUgybAARB9ARTAARB9wHKbkhAAYMAA3DgAPRXAARCVwHKbzhQpPz0ewAEQzcAA7uMEAAQmwAEQ0gEUwAEQ0sBym4QPAGDAANw4FMABENvAcpr/DQCUJsABEOgBFMABEOjAcpuEDwBgwADcOABJwAERARzAAREWHMABEREcwAERDRTAAREGwHKbkhAARAEAAZMAAIMsAQABlAAAQQEAAZQAwAD10j4BScABESgUwAERLMBym84UAD4BPR7AARFHwADu5wUABSbAARFPARTAARFPwHKbkhAAYMAA3DgUwAERWMBymv8NAIPAARFiwHKTx4fAARFrwHKUgybAARF0ARTAARF0wHKbkhAAYMAA3DgAScABEY8iIRzAARGlHMABEZsUwAERlMBym5IQAEQBAAGHwAERnMBylIMAAEEBAAGTAMAA9dIBHMABEfAewAERvcAA7uYEAAQmwAERzAEUwAERzMBym5IQAGDAANw4h8ABEdXAcpSDg8ABEd7AcpPHh8ABEefAcpSDAICLAQABkwDAAPWoPgE9HsABEgTAAO7oBQAFJsABEgwBFMABEgzAcpuSEABgwADcOBTAARIVwHKa/w0Ag8ABEh/AcpPHh8ABEijAcpSDJsABEjEBFMABEjHAcpuSEABgwADcOAA+Aj0ewAESWsAA7ugFAAWDwAESYsByk8eHwAESa8BylIMmwAESdAEUwAESdMBym5IQAGDAANw4h8ABEn3AcpSDJsABEoYBFMABEobAcpuSEABgwADcOAA9FcABEpzAcpvOFCk/PR7AARLOwADu4wQABCbAARLTARTAARLTwHKbkhAAYMAA3DgUwAES3MBymv8NAJQmwAES6QEUwAES6cBym5IQAGDAANw4AEPAARMBHMABExkcwAETFBzAARMQFMABEwnAcppkCwBEAQABkwDAAPUsgywBAAGUAMAA9JFBAQABkwDAAPWcPgM9HsABEynAAO7jBAAEFMABEy7AcppkCwCHwAETN8BylIOUFMABE0PAcppkCwAAScABE1UUwAETWcBymrMMAD4CScABE2kiHMABE38cwAETehzAARN2FMABE2/AcpugEQBEAQABkwAAgywBAAGU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yAEUwAEgyMBym64SAGDAANw4FMABINHAcpr/DQAmwAEg2wEUwAEg28Bym5IQAGDAANw4FMABIOTAcpr/DQAmwAEg7gEUwAEg7sBym64SAGDAANw4AD4CPR7AASEXwADu6AUABSbAASEfARTAASEfwHKbkhAAYMAA3DgUwAEhKMBymv8NACbAASEyARTAASEywHKbrhIAYMAA3DgUwAEhO8Bymv8NACbAASFFARTAASFFwHKbrhIAYMAA3DgAPRXAASFbwHKb8hYiIRTAASFqwHKb8hYAACEcwAEhghTAASF6wHKx6hcAQQEAAZMAwAD1nD4BPR7AASGwwADu5wUABSbAASG4ARTAASG4wHKbrhIAYMAA3DgUwAEhwcBymv8NACbAASHLARTAASHLwHKbkhAAYMAA3DgUwAEh1MBymv8NACbAASHeARTAASHewHKbrhIAYMAA3DgATsABIiLAASIkAABbYMAA9HkBh8ABIibAcpSDQ8ABIjUiHMABIj8UwAEiPcBys9oXAICLAQABkwDAAPWoABzAASJXHMABIk8UwAEiSMBymiQKAEQBAAEcwAEiUhTAASJQwHKz2hcAgUEBAAGUAMAA9Z8AwAD1LEEBAAGTAMAA9Zw9FcABImDAcrPaFxzAASJeFMABImDAcrPaFwCBQQEAAZQAwAD1n0nAASJpHMABIm8UwAEibcBys9oXAEEBAAGTAMAA9ZxCwAEidQA/ScABIoYhgsABIovAcpOsPgJJwAEimBzAASKoFMABIpzAcpVmCQCAiwEAAZMAwAD1qD4BPY/AASK3wHKUgx7AASLBwADu4gQABBTAASLPwHKaZAsAh8ABItjAcpSDFMABIuHAcpVmCQAUwAEi7sBymmQLAAA/SsABIwYBH8ABIxHAAO8rAwADKofAASMmwHKUgxTAASMvwHKaZAsAAD9OwAEjZMABI2YAAFtgwAD0eQEcwAEjcIfAASNowHKUg4FBAQABlADAAPWfQ8ABI3kiHMABI4MUwAEjgcBytUQXAICLAQABkwDAAPWoABzAASOXHMABI5MUwAEjjMBymmQLAEQBAAEUwAEjlMBytUQXAADAAPUsQQEAAZMAwAD1nD0VwAEjoMBytUQXHMABI54UwAEjoMBytUQXAIFBAQABlADAAPWfScABI6ciIRzAASOuFMABI6zAcrVEFwBBAQABkwDAAPWcASEcwAEjwxzAASO/FMABI7jAcppkCwBEAQABkwDAAPUsQQEAAZQAwAD1nD4BPTDAASPSHsABI9zAAPREAQABJ8AAgHoAP0nAASQBFMABJAXAcpvyFgA+AUnAASQaIiEcwAEkMBzAASQmFMABJB/AcpuuEgBEAQABh8ABJCfAcpSDAABBAQABkwDAAPXSARzAASR3HsABJETAAO7mBAAEJsABJFMBFMABJFPAcpuuEgBgwADcOIfAASRcwHKUg4PAASRlwHKTx4fAASRuwHKUgwCAiwEAAZMAwAD1qD4CPR7AASSHwADu6AUABSbAASSPARTAASSPwHKbrhIAYMAA3DgUwAEkmMBymv8NAIPAASSiwHKTx4fAASSrwHKUgybAASS0ARTAASS0wHKbrhIAYMAA3DgAScABJMYiIRzAASTcHMABJNIUwAEky8Bym64SAEQBAAGHwAEk08BylIMAAEEBAAGTAMAA9dIBHMABJSUewAEk8sAA7uYEAAQmwAElAQEUwAElAcBym64SAGDAANw4h8ABJQrAcpSDg8ABJRPAcpPHh8ABJRzAcpSDAICLAQABkwDAAPWoPgE9HsABJTfAAO7oBQAFJsABJT8BFMABJT/AcpuuEgBgwADcOBTAASVIwHKa/w0Ag8ABJVLAcpPHh8ABJVvAcpSDJsABJWQBFMABJWTAcpuuEgBgwADcOAA+Aj0ewAElicAA7ugFAAWDwAElkcByk8eHwAElmsBylIMmwAElowEUwAElo8Bym64SAGDAANw4h8ABJazAcpSDJsABJbUBFMABJbXAcpuuEgBgwADcOAA9FcABJcnAcpvyFio+Aj0ewAEl/8AA7ugFAAWDwAEmB8Byk8eHwAEmEMBylIMmwAEmGQEUwAEmGcBym64SAGDAANw4h8ABJiLAcpSDJsABJisBFMABJivAcpuuEgBgwADcOAA9FcABJj3AcpvyFipJwAEmZSIhHMABJnscwAEmcRTAASZqwHKbrhIARAEAAYfAASZywHKUgwAAQQEAAZMAwAD10gEcwAEmwB7AASaNwADu5gQABCbAASacARTAASacwHKbrhIAYMAA3DiHwAEmpcBylIODwAEmrsByk8eHwAEmt8BylIMAgIsBAAGTAMAA9ag+Aj0ewAEmzsAA7ugFAAUmwAEm1gEUwAEm1sBym64SAGDAANw4FMABJt/Acpr/DQCDwAEm6cByk8eHwAEm8sBylIMmwAEm+wEUwAEm+8Bym64SAGDAANw4AEnAAScLIiEcwAEnIRzAAScXFMABJxDAcpuuEgBEAQABh8ABJxjAcpSDAABBAQABkwDAAPXSARzAASdoHsABJzXAAO7mBAAEJsABJ0QBFMABJ0TAcpuuEgBgwADcOIfAASdNwHKUg4PAASdWwHKTx4fAASdfwHKUgwCAiwEAAZMAwAD1qD4BPR7AASd4wADu6AUABSbAASeAARTAASeAwHKbrhIAYMAA3DgUwAEnicBymv8NAIPAASeTwHKTx4fAASecwHKUgybAASelARTAASelwHKbrhIAYMAA3DgAPz9KwAEnwQEfwAEnzMAA7ysDAAMqh8ABJ+HAcpSDJsABJ+oBFMABJ+rAcpuuEgBgwADcOAAGwADvEoK4wAEo9MABKQDAASptAADAAICOAAAAAQPAASkKwAEqbQAAAAEBAcABKRIAAADAAIAtYMAA8oUAAGDAAO6yAT4GTsABKSzAASk0AADAAIBiYMAA7rIBJsABKSwBgMABKTbAcrr9YMAA7rJJwAEpQhzAASlOgcABKUbAcrsYgUoBAAEawAEpUcAA7tAAwADvDD4BPTDAASlfH8ABKWnAAPOsAQABJMABKaQCJ8AAgI+BwAEpnMByuxgAP0nAASmxHMABKb2BwAEptcByuxhBAQABGsABKcDAAO7RAMAA7wdKwAEpxQEawAEpzMAA7tA/TsABKdrAASneAAC7eWDAAO6yAS5JwAEp6iIWwAEp8oLAASnuwHK7xsAAf+jAAO4gwADuyAEcwAEqGxzAASoGgsABKgLAcrvGwACALMAA7iABAAGBwAEqEsByuxgAwADu5YFIAQABkwDAAPWpPgE9isABKirAcrvGHMABKi6CwAEqKsByu8aSlgEAAYHAASoxwHK7GADAAO8PP0rAASpEAR7AASpLwADu+AMAA4HAASpWwHK7GILAASpfwHK7xikABsAA7xOCuMABLD7AASxKwAEs+wAAwACAkAAAAAEDwAEsTcABLPsAAAABAQHAASxVAAAAwACALWDAAPKFAABgwADusgE+BE7AASxvwAEsdQAAg5tgwADusgEmwAEsbwGAwAEsd8ByvLFgwADusknAASyDFsABLIcuwACADMAA7iDAAO8cSsAB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LUMAcy2JAAAAAQLAAO/fgirAAEoywABKUsAAStUDoysBIMAASjPAAPKEAQABJ8AAadgAAAFgwADzfgAAAQTAAO/igirAAEqDwABKjAnAAIEewADuIABgwAD2XQABBcAA7+aCKsAASpDAAEqQwABKsQAAAAPAAEqhwABKsQAAAAEBAcAASqcAAATAAIEeYMAA9l0AAGDAAO/fAT8CCAHAAO/igADAcy4OCQHAAEqQwADzigAAAAABBsAA7+SCKsAASrXAAEq8wABK0wAAIwAAAAEDwABKxMAAStMAAAAAAAAAYMAA9l0BSsAASsoBFsAASsouwACBHsAA7iDAAO/iAABzLkMAcy6LAAAAAQLAAO/ngirAAEvAwABLxsAATIADoy0AAAFgwADzfgAAAQTAAO/qgirAAEwGwABMCwkowADuIABgwAD2XQABBcAA7+6CKsAATBDAAEwQwABMPAAAAAPAAEwwwABMPAAAAAEBAcAATDYAAAQoYMAA9l0AAGDAAO/nAT8CCAHAAO/qgADAcy77CQHAAEwQwADzigAAAAABBsAA7+yCKsAATEHAAExBwABMfgAAIwAAAAEDwABMScAATH4AAAAAAAAAYMAA9l0BSsAATE8BJMAATH4DJ8AAgSEWwABMXy4owADuIMAA7+onwACBIgAAcy8tAHMvggAAAAECwADv74K6gPmBGYcfA8AAgSMBIID6wADyhAEAASfAAGnYAAABYMAA9cUAAWDAAPRvBgTAAO/ygrqEO4RXGMAAgSTAAO4gASCEHMAA8oQBAAEnwABp2ABbASsEwADv84K6hHuEkxjAAIElwADuIAEghFzAAPKEAQABJ8AAadgAWwErBMAA7/SCuoS3hM4YwACBJsAA7iABIISYwADyhAEAASfAAGnYAFsBKwTAAO/1grqE8oT7GMAAcqbAAO4gASCE08AA8oQBAAEnwABp2ABbASsEwADv9oK6hR+FJxjAAH40wADuIAEghQDAAPKEAQABJ8AAadgAWwErBMAA7/eCuocRhx0YwABof8AA7iABIIbywADyhAEAASfAAGnYAFsBKwEFwADwAQAAAAAEAAADAAAAAAAAAAAAYMAA7+8BPwEJAQDAAPXbAAAAAAUGwADv+YK6gTqBSIFwAwRBASAAwADFQwEAASfAAIEnAAAAAQOBSoFwAAAAAQEBgVIAAACD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J8AAgXsnwACBfCfAAIF9J8AAgX4nwACBfyfAAIGAJ8AAgYEnwACBgifAAIGDJ8AAgYQnwACBhSfAAIGGJ8AAgYcnwACBiCfAAIGJJ8AAgYonwACBiyfAAIGMJ8AAgY0nwACBjifAAIGPJ8AAgZAnwACBkSfAAIGSJ8AAgZMnwACBlCfAAIGVJ8AAgZYnwACBlyfAAIGYJ8AAgZknwACBmifAAIGbJ8AAgZwnwACBnSfAAIGeJ8AAgZ8nwACBoCfAAIGhJ8AAgaInwACBoyfAAIGkJ8AAgaUnwACBpifAAIGnJ8AAgagnwACBqSfAAIGqJ8AAgasnwACBrCfAAIGtJ8AAga4nwACBryfAAIGwJ8AAgbEnwACBsifAAIGzJ8AAgbQnwACBtSfAAIG2J8AAgbcnwACBuCfAAIG5J8AAgbonwACBuyfAAIG8J8AAgb0nwACBvifAAIG/J8AAgcAnwACBwSfAAIHCJ8AAgcMnwACBxCfAAIHFJ8AAgcYnwACBxyfAAIHIJ8AAgcknwACByifAAIHLJ8AAgcwnwACBzSfAAIHOJ8AAgc8nwACB0CfAAIHRJ8AAgdInwABEjSfAAESLJ4PNJ8AAQvQnwACB0yfAAIHUJ8AAgdUnwACB1ifAAIHXJ8AAgdgnwACB2SfAAIHaJ8AAgdsnwACB3CfAAIHdJ8AAgd4nwACB3yfAAIHgJ8AAgeEnwACB4ifAAIHjJ8AAgeQnwACB5SfAAIHmJ8AAgecnwACB6CfAAIHpJ8AAgeonwACB6yfAAIHsJ8AAge0nwACB7ifAAIHvJ8AAgfAnwACB8SfAAIHyJ8AAgfMnwACB9CfAAIH1J8AAgfYnwACB9yfAAIH4J8AAgfknwACB+ifAAIH7J8AAgfwnwACB/SfAAIH+J8AAgf8nwACCACfAAIIBJ8AAggInwACCAyfAAIIEJ8AAggUnwACCBifAAIIHJ8AAgggnwACCCSfAAIIKJ8AAggsnwACCDCfAAIINJ8AAgg4nwACCDyfAAIIQJ8AAghEnwACCEifAAIITJ8AAghQnwACCFSfAAIIWJ8AAghcnwACCGCfAAIIZJ8AAghonwACCGyfAAIIcJ8AAgh0nwACCHifAAIIfJ8AAgiAnwACCISfAAIIiJ8AAgiMnwACCJCfAAIIlJ8AAgiYnwACCJyfAAIIoJ8AAgiknwACCKifA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wACG8wBgwAD2XQEawABAa8AA+CsEwAD4W4LywABAtcAAQMQGwACG9AEgwABAgsAA8m4BAAEnwACG9QBgwAD2XQEawABAu8AA+CwEwAD4XILywABA/sAAQREGwACG9gEgwABAycAA8m4BAAEnwACG9wBgwAD2XQEawABBBsAA+C0EwAD4XYLywABBU8AAQXYGwACG+AEgwABBFsAA8m4BAAEnwACG+QBgwAD2XQEawABBY8AA+C4EwAD4XoLywABBt8AAQdkGwACG+gEgwABBe8AA8m4BAAEnwACG+wBgwAD2XQEawABBx8AA+C8EwAD4X4LywABCGMAAQjUGwACG/AEgwABB3sAA8m4BAAEnwACG/QBgwAD2XQEawABCJcAA+DAEwAD4YILywABCecAAQqEGwACG/gEgwABCOsAA8m4BAAEnwACG/wBgwAD2XQEawABCjMAA+DEEwAD4YYLywABC5cAAQw0GwACHAAEgwABCpsAA8m4BAAEnwACHAQBgwAD2XQEawABC+MAA+DIEwAD4YoLywABDT8AAQ3MGwACHAgEgwABDEsAA8m4BAAEnwACHAwBgwAD2XQEawABDYMAA+DMEwAD4Y4LywABDt8AAQ98GwACHBAEgwABDeMAA8m4BAAEnwACHBQBgwAD2XQEawABDysAA+DQEwAD4ZILywABEHsAARDwGwACHBgEgwABD5MAA8m4BAAEnwACHBwBgwAD2XQEawABELMAA+DUEwAD4ZYLywABEfcAARJ8GwACHCAEgwABEQcAA8m4BAAEnwACHCQBgwAD2XQEawABEjcAA+DYEwAD4ZoLywABE38AARP8GwACHCgEgwABEpMAA8m4BAAEnwACHCwBgwAD2XQEawABE7sAA+DcEwAD4Z4LywABFOMAARUkGwACHDAEgwABFBMAA8m4BAAEnwACHDQBgwAD2XQEawABFP8AA+DgEwAD4aILywABFgsAARZMGwACHDgEgwABFTsAA8m4BAAEnwACHDwBgwAD2XQEawABFicAA+DkEwAD4aYLywABFzsAAReMGwACHEAEgwABFmMAA8m4BAAEnwACHEQBgwAD2XQEawABF18AA+DoEwAD4aoLywABGH8AARjYGwACHEgEgwABF6MAA8m4BAAEnwACHEwBgwAD2XQEawABGKcAA+DsEwAD4a4LywABGb8AARoAGwACHFAEgwABGO8AA8m4BAAEnwACHFQBgwAD2XQEawABGdsAA+DwEwAD4bILywABGucAARsoGwACHFgEgwABGhcAA8m4BAAEnwACHFwBgwAD2XQEawABGwMAA+D0EwAD4bYLywABHBsAARx4GwACHGAEgwABGz8AA8m4BAAEnwACHGQBgwAD2XQEawABHEcAA+D4EwAD4boLywABHYsAAR4sGwACHGgEgwABHI8AA8m4BAAEnwACHGwBgwAD2XQEawABHdsAA+D8EwAD4b4LywABHy8AAR+wGwACHHAEgwABHkMAA8m4BAAEnwACHHQBgwAD2XQEawABH28AA+EAEwAD4cILywABIKMAASEAGwACHHgEgwABH8cAA8m4BAAEnwACHHwBgwAD2XQEawABIM8AA+EEEwAD4cYLywABIhsAASLMGwACHIAEgwABIRcAA8m4BAAEnwACHIQBgwAD2XQEawABInMAA+EIEwAD4coLywABI9MAASRYGwACHIgEgwABIuMAA8m4BAAEnwACHIwBgwAD2XQEawABJBMAA+EMEwAD4c4LywABJU8AASWwGwACHJAEgwABJG8AA8m4BAAEnwACHJQBgwAD2XQEawABJXsAA+EQEwAD4dILywABJrMAAScwGwACHJgEgwABJccAA8m4BAAEnwACHJwBgwAD2XQEawABJu8AA+EUEwAD4dYLywABKB8AAShwGwACHKAEgwABJ0cAA8m4BAAEnwACHKQBgwAD2XQEawABKEMAA+EYEwAD4doLywABKYsAASo4GwACHKgEgwABKIcAA8m4BAAEnwACHKwBgwAD2XQEawABKd8AA+EcEwAD4d4LywABK1cAASwMGwACHLAEgwABKk8AA8m4BAAEnwACHLQBgwAD2XQEawABK68AA+EgEwAD4eILywABLPcAAS1AGwACHLgEgwABLCMAA8m4BAAEnwACHLwBgwAD2XQEawABLRcAA+EkEwAD4eYLywABLjMAAS6MGwACHMAEgwABLVcAA8m4BAAEnwACHMQBgwAD2XQEawABLlsAA+EoEwAD4eoLywABL4sAATAAGwACHMgEgwABLqMAA8m4BAAEnwACHMwBgwAD2XQEawABL8MAA+EsEwAD4e4LywABMO8AATFAGwACHNAEgwABMBcAA8m4BAAEnwACHNQBgwAD2XQEawABMRMAA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AUrAAG2JASfAAIjRAcAAbbwawABtvMAAxWEAPgFKwABt0AEnwACI0gHAAG38GsAAbfzAAMViAD4BSsAAbhIBJ8AAiNMBwABuPxrAAG4/wADFYwA+AUrAAG5YASfAAIjUAcAAbokawABuicAAxWQAPgFKwABunAEnwACI1QHAAG7GGsAAbsbAAMVlAD4BSsAAbtgBJ8AAiNYBwABvAhrAAG8CwADFZgA+AUrAAG8cASfAAIjXAcAAb08awABvT8AAxWcAPgFKwABvZgEnwACI2AHAAG+VGsAAb5XAAMVoAD4BSsAAb7oBJ8AAiNkBwABv+BrAAG/4wADFaQA+AUrAAHAQASfAAIjaAcAAcEEawABwQcAAxWoAPgFKwABwUwEnwACI2wHAAHB8GsAAcHzAAMVrAD4BSsAAcIoBJ8AAiNwBwABwrxrAAHCvwADFbAA+AUrAAHDHASfAAIjdAcAAcPcawABw98AAxW0APgFKwABxEwEnwACI3gHAAHFHGsAAcUfAAMVuAD4BSsAAcWYBJ8AAiN8BwABxnxrAAHGfwADFbwA+AUrAAHG6ASfAAIjgAcAAce8awABx78AAxXAAPgFKwAByDQEnwACI4QHAAHJEGsAAckTAAMVxAD4BSsAAcmoBJ8AAiOIBwAByqhrAAHKqwADFcgA+AUrAAHLFASfAAIjjAcAAcvgawABy+MAAxX4APgFKwABzFQEnwACI5AHAAHNLGsAAc0vAAMV/AD4BSsAAc2MBJ8AAiOUBwABzkxrAAHOTwADFgAA+AUrAAHOnASfAAIjmAcAAc9MawABz08AAxYEAPgFKwABz7wEnwACI5wHAAHQjGsAAdCPAAMWCAD4BSsAAdDsBJ8AAiOgBwAB0bBrAAHRswADFgwA+AUrAAHSNASfAAIjpAAE+AUrAAHTJASTAAHTkAifAAIjqgMAAdNnAeSE3AAB5EvAAeRNhAHkUAQB5FEoAeRThAHkVOgB5FdEAeRbMAHkYsAB5GQQAeRlPAHkapgB5IQcAeSYeAAAADQLAAPsKgvPAAHTzwAB0+cAAiGYDwACI6wAAAV3AAPrTAWDAAPkzAAFgwAD5IQsEwAD7DILzwAB1b8AAdXUJkzEAYMAA9l0ABMAA+w2C88AAdYPAAHWGCYCgAGDAAPbeAATAAPsOgvPAAHWdwAB1uQnAAId1AF3AAPUdAWDA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aC7AAHp9wAD388AA+14cwADVfRbAANVxLsAAiRbAAPfzwAD7YcAAiS8AAAAAwAD9egAAwACy/QbAAPttgvPAANWYwADVncAA1f4AAMAAeZEAAAABA8AA1aTAANX+AAAAAAAAAFwBPgM9F8AA1a0uwABJACnAAPtpPRzAANXMFsAA1cAuwAB3AMAA9/PAAPtjwACIk8AA9/MBAAEuAMAA+8o9HMAA1fEWwADV6S7AAHp9wAD388AA+17AAHmRAAAAAMAA7SAGwAD7boLzwADWA8AA1gjAANa1AACCDwAAAAEDwADWDcAA1rUAAAAAAAAAXAE+Az0XwADWFi7AAEkAKcAA+2k9HMAA1jUWwADWKS7AAHcAwAD388AA+2PAAIiTwAD38wEAAS4AwAD7yj0cwADWkxzAANZpFsAA1lIuwACJG8AA9/PAAPtowABqSgEAARbAANZ9FsAA1nEuwAB3AMAA9/PAAPtjwACGkMAA+60AwACzAYE8AQFcATTAANaYA8AA1pjAANawAAAAAQEBwADWmQAAAICoYMAA7RkAAFwBSsAA1p8BHMAA1qcWwADWny7AAHp9wAD388AA+17AAHmRAAAAAMAA7SAAwACy/QbAAPtvgvPAANa6wADW2MAA25cAAMAAiTAAAAABA8AA1unAANuXAAAABAQEwADW8QAAAINyYMAA9l0AwADW+wAAAINzYMAA9HkAwADXDgAAAMAAhjRgwAD8TgDAANcaAAAAmTNhAWDAAOuMYMAA8rMAAF3AALLqAWDAAPtaAT4DTsAA11rAANdiAACDCWDAAPsKARzAANdsLrdKBAAEHsAA13XAAPdQAgAAAoNygMAA13/AeXmvg3OBwADXi8B5eb6BwADXksB5eb4nwACI94LAANejwHl5zQDAAPtrScAA168WwADXuYLAANezwHl5zcAAiSLAAPxWPgJOwADYSMAA2E0AAMAAiSNgwAD2XQEewADYXMAA+YEBAAEcwADYehrAANh1wAC/GJIUAQABJMAA2KYDFsAA2IqCwADYhMB5ec3AAIecwAD8UieCphbAANicgsAA2JbAeXnNwAB60MAA/FMAwADBbgA9HMAA2MAWwADYuITAANiwwHl6BJ0BwAD62pQIAgACGsAA2NDAAPhIJMAA2PcCJ8AAiSSFwADY8sB5en4AwAD55T9KwADZBAEcwADa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g8ABETHAebUhAMAA+83AAHoSBAAEgMABEU7AebTugcABEVfAebT/h8ABEWDAebYELgDAAPuWgYIBAAGFwAERtMB5tYEAwACy/krAARHJARzAARHXhcABEdDAebWBIAEAAR/AARHcwAD5aAEAASfAAIleAAAABsAA+8+C88ABEgfAARIYwAEUGgAAwACInsAA9/MAAAABA8ABEijAARQaAAAAAgECwAESLQAAAMAAS1pgwAD23gDAARJJAAAAgUxgwAD8hAErAGDAAPyhAT4CTsABEobAARKJAADAAIaLYMAA/KEBHMABEqAWwAESky7AAIlPwAD388AA+5+DEgIBYMAA/KECKzTAARKrA8ABEqvAARQGAAAAAgICwAESvQAAAMAAYjhgwAD8oQDAARLDAAAAgIpgwAD8kQAAYMAA/KEBPgJOwAES1sABEuYAAMAAiV9gwAD8oQEmwAES7gCDwAES6MB5uCdgwAD8oUnAARMJHMABEx2EwAETDcB5uECqOwIAAoDAARMlwHm3oYHAARMqwHm3sgDAAPylPgJJwAETPRzAARNGgsABE0HAebgWQQEAASsAwAD10krAARNPASbAARNPAYPAARNWwHm4J2DAAPyhP0rAARNlASMcwAETjBbAAROFFsABE4AWwAETfITAARNswHm4QICgwAD8o0fAAPbpWsAA9mGAiwEAARbAAROcFsABE5cWwAETk4LAAROOwHm4FoCgwAD8o0fAAPbpWsAA9mEAwAD1qITAAROxwHm4QILAARPPwHm4FgFgwAD8oT4BSsABE+wBgsABE/PAebgWAMAA9O1KwAEUDQGCwAEUFMB5t8wGwAD70ILzwAEUH8ABFDHAARVKAADAAIicwAD38wAAAAEDwAEURsABFUoAAAACAQLAARROAAAAwACGNGDAAPxOAMABFHIAAACBTGDAAPyEASsAYMAA/KkBPgNOwAEUosABFKUAAMAAbHVdwAD1FgFgwAD8qQEWwAEUuRbAARSnLsAAiSXAAPfzwAD7oFXAAPT9Q8ABFMccwAEU0YLAARTOwHm5z1YAAAAAwAD1GD4BScABFOUcwAEU9BbAARTsgsABFOnAebnPV8AA9RqqOwIAAoDAART8wHm5pIHAARUDwHm5tQDAAPyuPgFKwAEVFgEWwAEVIILAARUdwHm5z1fAAPUaP0rAARU7ASsG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/VU9F8AARckuwACJ9sAA9/McwABF2hbAAEXJLsAAifbAAPfzwAD9S10BAAGUAMAA9Z7AAP1LScAARfEcwABF+oDAAEX1wHpVW0EBAAEawABGB8AA/O4AwAD1nD4DPRfAAEY/LsAAifzAAPfzGsAARlvAAP0ZwAD9Uz0XwABGcS7AAIglwAD38yrAAP1VPRfAAEaeLsAAifbAAPfzHMAARq8WwABGni7AAIn2wAD388AA/UtdAQABlADAAPWewAD9Sz4BPTDAAEbWH8AARuDAAPloAQABJ8AAig8APgFJwABHNRzAAEc+gMAARznAelVbQQEAARrAAEdLwAD86ADAAPWcPgE9F8AAR18uwABc5MAA9/MawABHb8AA/P3AAP1KPgM9HMAAR6cuwACKEcAA9/MCAAKAwABHr8B6VVsawABHv8AA/OcAwAD9dD0XwABH0i7AAIn3wAD38xrAAEfuwAD9IMAA/Uw9F8AASAUuwABc5MAA9/MawABIFcAA/QHAAP1KQsAASEcAAcAASGMawABIY8AA/P0APgQ9HMAASIIuwACKEcAA9/MCAAKAwABIisB6VVsawABImsAA/OcAwAD9dD0XwABIqS7AAIn3wAD38xrAAEjFwAD9IMAA/Uw9F8AASNguwABc5MAA9/MawABI6MAA/QHAAP1KQsAASQAAAcAASRwawABJHMAA/P4APgJJwABJQRzAAElKgMAASUXAelVbQQEAARrAAElXwAD86QDAAPWcPgE9F8AASWkuwABc5MAA9/MawABJecAA/P/AAP1KScAASaccwABJsIDAAEmrwHpVW0EBAAEawABJvcAA/OgAwAD1nD4BPRfAAEpELsAAXOTAAPfzGsAASlTAAP0AwAD9Sj4CPRfAAEqJLsAAifjAAPfzHMAASpoWwABKiS7AAIn4wAD388AA/U5dAQABlADAAPWewAD9TknAAEqqIiIcwABKtIDAAEqvwHpVW1wBAAE3MADAAPWmABzAAErDNzlcAQABgMAASsXAelVbAMAA9aYBHMAASuAWwABKzi7AAIn4wAD388AA/U6AiwEAAZYAwAD1qD4BPTDAAEr1H8AASv/AAPloAQABJ8AAihMAPgE9F8AAS1EuwACItsAA9/McwABLdxzAAEtwHMAAS2sWwABLXy7AAIi2wAD388AA/U2DPgEAATcKAMAA9aBd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eQovLy8gZGFydDJqcyBkZXZlbG9wZXJzLiBUbyBydW4gdGhlIGNvbXBpbGVyIHlvdSBub3cgY2FuOgovLy8gICAqIGNhbGwgYHB1YiBnZXRgIGluIHRoZSBwa2cvY29tcGlsZXIgZm9sZGVyLgovLy8gICAqIHNpbXBseSBjYWxsIGBkYXJ0IHBhdGgtdG8tcGtnL2NvbXBpbGVyL2Jpbi9kYXJ0MmpzLmRhcnQgZm9vLmRhcnRgCi8vIFRPRE8oc2lnbXVuZCk6IG1vdmUgYG1haW5gIGhlcmUsIGFuZCBjaGFuZ2Ugb3VyIHNkayBidWlsZCB0b29scyB0byBqdXN0IHVzZQovLyB0aGlzIGVudHJ5cG9pbnQgaW5zdGVhZC4KbGlicmFyeSBjb21waWxlci5iaW4uZGFydDJqczsKCmV4cG9ydCAncGFja2FnZTpjb21waWxlci9zcmMvZGFydDJqcy5kYXJ0JzsKDwBOTjwBTjkzSk8cHgEsASZzZGtyb290Oi9wa2cvY29tcGlsZXIvYmluL2RhcnQyanMuZGFydCpzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9kYXJ0MmpzLmRhcnTAAJNnLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5jbWRsaW5lOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJyBzaG93IEZ1dHVyZTsKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgdXRmOCwgTGluZVNwbGl0dGVyOwppbXBvcnQgJ2RhcnQ6aW8nIHNob3cgZXhpdCwgRmlsZSwgRmlsZU1vZGUsIFBsYXRmb3JtLCBzdGRpbiwgc3RkZXJyOwppbXBvcnQgJ2RhcnQ6aXNvbGF0ZScgc2hvdyBJc29sYXRlOwoKaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL2RhcnQyanMuZGFydCcgYXMgZmU7CgppbXBvcnQgJy4uL2NvbXBpbGVyX25ldy5kYXJ0JyBhcyBhcGk7CmltcG9ydCAnY29tbWFuZGxpbmVfb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICdmaWxlbmFtZXMuZGFydCc7CmltcG9ydCAnb3B0aW9ucy5kYXJ0JyBzaG93IENvbXBpbGVyT3B0aW9uczsKaW1wb3J0ICdzb3VyY2VfZmlsZV9wcm92aWRlci5kYXJ0JzsKaW1wb3J0ICd1dGlsL2NvbW1hbmRfbGluZS5kYXJ0JzsKaW1wb3J0ICd1dGlsL3VyaV9leHRyYXMuZGFydCc7CmltcG9ydCAndXRpbC91dGlsLmRhcnQnIHNob3cgc3RhY2tUcmFjZUZpbGVQcmVmaXg7Cgpjb25zdCBTdHJpbmcgX2RlZmF1bHRTcGVjaWZpY2F0aW9uVXJpID0gJy4uLy4uLy4uLy4uL3Nkay9saWIvbGlicmFyaWVzLmpzb24nOwpjb25zdCBTdHJpbmcgT1VUUFVUX0xBTkdVQUdFX0RBUlQgPSAnRGFydCc7CgovLy8gQSBzdHJpbmcgdG8gaWRlbnRpZnkgdGhlIHJldmlzaW9uIG9yIGJ1aWxkLgovLy8KLy8vIFRoaXMgSUQgaXMgZGlzcGxheWVkIGlmIHRoZSBjb21waWxlciBjcmFzaGVzIGFuZCBpbiB2ZXJib3NlIG1vZGUsIGFuZCBpcwovLy8gYW4gYWlkIGluIHJlcHJvZHVjaW5nIGJ1ZyByZXBvcnRzLgovLy8KLy8vIFRoZSBhY3R1YWwgc3RyaW5nIGlzIHJld3JpdHRlbiBieSBhIHdyYXBwZXIgc2NyaXB0IHdoZW4gaW5jbHVkZWQgaW4gdGhlIHNkay4KU3RyaW5nIEJVSUxEX0lEID0gbnVsbDsKCi8vLyBUaGUgZGF0YSBwYXNzZWQgdG8gdGhlIFtIYW5kbGVPcHRpb25dIGNhbGxiYWNrIGlzIGVpdGhlciBhIHNpbmdsZQovLy8gc3RyaW5nIGFyZ3VtZW50LCBvciB0aGUgYXJndW1lbnRzIGl0ZXJhdG9yIGZvciBtdWx0aXBsZSBhcmd1bWVudHMKLy8vIGhhbmRsZXJzLgp0eXBlZGVmIHZvaWQgSGFuZGxlT3B0aW9uKE51bGwgZGF0YSk7CgpjbGFzcyBPcHRpb25IYW5kbGVyIHsKICBmaW5hbCBTdHJpbmcgcGF0dGVybjsKICBmaW5hbCBIYW5kbGVPcHRpb24gX2hhbmRsZTsKICBmaW5hbCBib29sIG11bHRpcGxlQXJndW1lbnRzOwoKICB2b2lkIGhhbmRsZShhcmd1bWVudCkgewogICAgKF9oYW5kbGUgYXMgZHluYW1pYykoYXJndW1lbnQpOwogIH0KCiAgT3B0aW9uSGFuZGxlcih0aGlzLnBhdHRlcm4sIHRoaXMuX2hhbmRsZSwge3RoaXMubXVsdGlwbGVBcmd1bWVudHM6IGZhbHNlfSk7Cn0KCi8vLyBFeHRyYWN0IHRoZSBwYXJhbWV0ZXIgb2YgYW4gb3B0aW9uLgovLy8KLy8vIEZvciBleGFtcGxlLCBpbiBbJy0tb3V0PWZpc2suanMnXSBhbmQgWyctb2hlc3QuanMnXSwgdGhlIHBhcmFtZXRlcnMKLy8vIGFyZSBbJ2Zpc2suanMnXSBhbmQgWydoZXN0LmpzJ10sIHJlc3BlY3RpdmVseS4KU3RyaW5nIGV4dHJhY3RQYXJhbWV0ZXIoU3RyaW5nIGFyZ3VtZW50LCB7Ym9vbCBpc09wdGlvbmFsQXJndW1lbnQ6IGZhbHNlfSkgewogIC8vIG1bMF0gaXMgdGhlIGVudGlyZSBtYXRjaCAod2hpY2ggd2lsbCBiZSBlcXVhbCB0byBhcmd1bWVudCkuIG1bMV0KICAvLyBpcyBzb21ldGhpbmcgbGlrZSAiLW8iIG9yICItLW91dD0iLCBhbmQgbVsyXSBpcyB0aGUgcGFyYW1ldGVyLgogIE1hdGNoIG0gPSBuZXcgUmVnRXhwKCdeKC1bYS16QS1aXXwtLS4rPSkoLiopJykuZmlyc3RNYXRjaChhcmd1bWVudCk7CiAgaWYgKG0gPT0gbnVsbCkgewogICAgaWYgKGlzT3B0aW9uYWxBcmd1bWVudCkgcmV0dXJuIG51bGw7CiAgICBoZWxwQW5kRmFpbCgnVW5rbm93biBvcHRpb24gIiRhcmd1bWVudCIuJyk7CiAgfQogIHJldHVybiBtWzJdOwp9CgpTdHJpbmcgZXh0cmFjdFBhdGgoU3RyaW5nIGFyZ3VtZW50LCB7Ym9vbCBpc0RpcmVjdG9yeTogdHJ1ZX0pIHsKICBTdHJpbmcgcGF0aCA9IG5hdGl2ZVRvVXJpUGF0aChleHRyYWN0UGFyYW1ldGVyKGFyZ3VtZW50KSk7CiAgcmV0dXJuICFwYXRoLmVuZHNXaXRoKCIvIikgJiYgaXNEaXJlY3RvcnkgPyAiJHBhdGgvIiA6IHBhdGg7Cn0KCnZvaWQgcGFyc2VDb21tYW5kTGluZShMaXN0PE9wdGlvbkhhbmRsZXI+IGhhbmRsZXJzLCBMaXN0PFN0cmluZz4gYXJndikgewogIC8vIFRPRE8oYWhlKTogVXNlIC4uLy4uL2FyZ3MvYXJncy5kYXJ0IGZvciBwYXJzaW5nIG9wdGlvbnMgaW5zdGVhZC4KICB2YXIgcGF0dGVybnMgPSA8U3RyaW5nPltdOwogIGZvciAoT3B0aW9uSGFuZGxlciBoYW5kbGVyIGluIGhhbmRsZXJzKSB7CiAgICBwYXR0ZXJucy5hZGQoaGFuZGxlci5wYXR0ZXJuKTsKICB9CiAgdmFyIHBhdHRlcm4gPSBuZXcgUmVnRXhwKCdeKCR7cGF0dGVybnMuam9pbigiKVwkfF4oIil9KVwkJyk7CgogIEl0ZXJhdG9yPFN0cmluZz4gYXJndW1lbnRzID0gYXJndi5pdGVyYXRvcjsKICBPVVRFUjoKICB3aGlsZSAoYXJndW1lbnRzLm1vdmVOZXh0KCkpIHsKICAgIFN0cmluZyBhcmd1bWVudCA9IGFyZ3VtZW50cy5jdXJyZW50OwogICAgTWF0Y2ggbWF0Y2ggPSBwYXR0ZXJuLmZpcnN0TWF0Y2goYXJndW1lbnQpOwogICAgYXNzZXJ0KG1hdGNoLmdyb3VwQ291bnQgPT0gaGFuZGxlcnMubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFuZGxlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKG1hdGNoW2kgKyAxXSAhPSBudWxsKSB7CiAgICAgICAgT3B0aW9uSGFuZGxlciBoYW5kbGVyID0gaGFuZGxlcnNbaV07CiAgICAgICAgaWYgKGhhbmRsZXIubXVsdGlwbGVBcmd1bWVudHMpIHsKICAgICAgICAgIGhhbmRsZXIuaGFuZGxlKGFyZ3VtZW50cyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhhbmRsZXIuaGFuZGxlKGFyZ3VtZW50KTsKICAgICAgICB9CiAgICAgICAgY29udGludWUgT1VURVI7CiAgICAgIH0KICAgIH0KICAgIHRocm93ICdJbnRlcm5hbCBlcnJvcjogIiRhcmd1bWVudCIgZGlkIG5vdCBtYXRjaCc7CiAgfQp9CgpGb3JtYXR0aW5nRGlhZ25vc3RpY0hhbmRsZXIgZGlhZ25vc3RpY0hhbmRsZXI7CgpGdXR1cmU8YXBpLkNvbXBpbGF0aW9uUmVzdWx0PiBjb21waWxlKExpc3Q8U3RyaW5nPiBhcmd2LAogICAge2ZlLkluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZSBrZXJuZWxJbml0aWFsaXplZENvbXBpbGVyU3RhdGV9KSB7CiAgU3RvcHdhdGNoIHdhbGxjbG9jayA9IG5ldyBTdG9wd2F0Y2goKS4uc3RhcnQoKTsKICBzdGFja1RyYWNlRmlsZVByZWZpeCA9ICckY3VycmVudERpcmVjdG9yeSc7CiAgVXJpIGxpYnJhcmllc1NwZWNpZmljYXRpb25VcmkgPQogICAgICBjdXJyZW50RGlyZWN0b3J5LnJlc29sdmUoJ2xpYi9saWJyYXJpZXMuanNvbicpOwogIGJvb2wgb3V0cHV0U3BlY2lmaWVkID0gZmFsc2U7CiAgVXJpIG91dDsKICBVcmkgc291cmNlTWFwT3V0OwogIFVyaSByZWFkRGF0YVVyaTsKICBVcmkgd3JpdGVEYXRhVXJpOwogIExpc3Q8U3RyaW5nPiBiYXplbFBhdGhzOwogIFVyaSBwYWNrYWdlQ29uZmlnID0gbnVsbDsKICBVcmkgcGFja2FnZVJvb3QgPSBudWxsOwogIExpc3Q8U3RyaW5nPiBvcHRpb25zID0gbmV3IExpc3Q8U3RyaW5nPigpOwogIGJvb2wgd2FudEhlbHAgPSBmYWxzZTsKICBib29sIHdhbnRWZXJzaW9uID0gZmFsc2U7CiAgYm9vbCB0cnVzdFR5cGVBbm5vdGF0aW9ucyA9IGZhbHNlOwogIGJvb2wgY2hlY2tlZE1vZGUgPSBmYWxzZTsKICBib29sIHN0cm9uZ01vZGUgPSB0cnVlOwogIExpc3Q8U3RyaW5nPiBoaW50cyA9IDxTdHJpbmc+W107CiAgYm9vbCB2ZXJib3NlOwogIGJvb2wgdGhyb3dPbkVycm9yOwogIGludCB0aHJvd09uRXJyb3JDb3VudDsKICBib29sIHNob3dXYXJuaW5nczsKICBib29sIHNob3dIaW50czsKICBib29sIGVuYWJsZUNvbG9yczsKICBpbnQgb3B0aW1pemF0aW9uTGV2ZWwgPSBudWxsOwogIFVyaSBwbGF0Zm9ybUJpbmFyaWVzOwogIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52aXJvbm1lbnQgPSBuZXcgTWFwPFN0cmluZywgU3RyaW5nPigpOwogIENvbXBpbGF0aW9uU3RyYXRlZ3kgY29tcGlsYXRpb25TdHJhdGVneSA9IENvbXBpbGF0aW9uU3RyYXRlZ3kuZGlyZWN0OwoKICB2b2lkIHBhc3NUaHJvdWdoKFN0cmluZyBhcmd1bWVudCkgPT4gb3B0aW9ucy5hZGQoYXJndW1lbnQpOwogIHZvaWQgaWdub3JlT3B0aW9uKFN0cmluZyBhcmd1bWVudCkge30KCiAgaWYgKEJVSUxEX0lEICE9IG51bGwpIHsKICAgIHBhc3NUaHJvdWdoKCItLWJ1aWxkLWlkPSRCVUlMRF9JRCIpOwogIH0KCiAgdm9pZCBzZXRMaWJyYXJ5U3BlY2lmaWNhdGlvblVyaShTdHJpbmcgYXJndW1lbnQpIHsKICAgIGxpYnJhcmllc1NwZWNpZmljYXRpb25VcmkgPQogICAgICAgIGN1cnJlbnREaXJlY3RvcnkucmVzb2x2ZShleHRyYWN0UGF0aChhcmd1bWVudCwgaXNEaXJlY3Rvcnk6IGZhbHNlKSk7CiAgfQoKICB2b2lkIHNldFBhY2thZ2VSb290KFN0cmluZyBhcmd1bWVudCkgewogICAgcGFja2FnZVJvb3QgPSBjdXJyZW50RGlyZWN0b3J5LnJlc29sdmUoZXh0cmFjdFBhdGgoYXJndW1lbnQpKTsKICB9CgogIHZvaWQgc2V0UGFja2FnZUNvbmZpZyhTdHJpbmcgYXJndW1lbnQpIHsKICAgIHBhY2thZ2VDb25maWcgPQogICAgICAgIGN1cnJlbnREaXJlY3RvcnkucmVzb2x2ZShleHRyYWN0UGF0aChhcmd1bWVudCwgaXNEaXJlY3Rvcnk6IGZhbHNlKSk7CiAgfQoKICB2b2lkIHNldE91dHB1dChJdGVyYXRvcjxTdHJpbmc+IGFyZ3VtZW50cykgewogICAgb3V0cHV0U3BlY2lmaWVkID0gdHJ1ZTsKICAgIFN0cmluZyBwYXRoOwogICAgaWYgKGFyZ3VtZW50cy5jdXJyZW50ID09ICctbycpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubW92ZU5leHQoKSkgewogICAgICAgIGhlbHBBbmRGYWlsKCdFcnJvcjogTWlzc2luZyBmaWxlIGFmdGVyIC1vIG9wdGlvbi4nKTsKICAgICAgfQogICAgICBwYXRoID0gYXJndW1lbnRzLmN1cnJlbnQ7CiAgICB9IGVsc2UgewogICAgICBwYXRoID0gZXh0cmFjdFBhcmFtZXRlcihhcmd1bWVudHMuY3VycmVudCk7CiAgICB9CiAgICBvdXQgPSBjdXJyZW50RGlyZWN0b3J5LnJlc29sdmUobmF0aXZlVG9VcmlQYXRoKHBhdGgpKTsKICB9CgogIHZvaWQgc2V0T3B0aW1pemF0aW9uTGV2ZWwoU3RyaW5nIGFyZ3VtZW50KSB7CiAgICBpbnQgdmFsdWUgPSBpbnQudHJ5UGFyc2UoZXh0cmFjdFBhcmFtZXRlcihhcmd1bWVudCkpOwogICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPCAwIHx8IHZhbHVlID4gNCkgewogICAgICBoZWxwQW5kRmFpbCgiRXJyb3I6IFVuc3VwcG9ydGVkIG9wdGltaXphdGlvbiBsZXZlbCAnJGFyZ3VtZW50JywgIgogICAgICAgICAgInN1cHBvcnRlZCBsZXZlbHMgYXJlOiAwLCAxLCAyLCAzLCA0Iik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIG9wdGltaXphdGlvbkxldmVsID0gdmFsdWU7CiAgfQoKICB2b2lkIHNldE91dHB1dFR5cGUoU3RyaW5nIGFyZ3VtZW50KSB7CiAgICBpZiAoYXJndW1lbnQgPT0gJy0tb3V0cHV0LXR5cGU9ZGFydCcgfHwKICAgICAgICBhcmd1bWVudCA9PSAnLS1vdXRwdXQtdHlwZT1kYXJ0LW11bHRpJykgewogICAgICBoZWxwQW5kRmFpbCgKICAgICAgICAgICItLW91dHB1dC10eXBlPWRhcnQgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gSXQgd2FzIGRlcHJlY2F0ZWQgIgogICAgICAgICAgInNpbmNlIERhcnQgMS4xMSBhbmQgcmVtb3ZlZCBpbiBEYXJ0IDEuMTkuIik7CiAgICB9CiAgfQoKICBzZXRTdHJpcChTdHJpbmcgYXJndW1lbnQpIHsKICAgIGhlbHBBbmRGYWlsKCJPcHRpb24gJy0tZm9yY2Utc3RyaXAnIGlzIG5vdCBpbiB1c2Ugbm93IHRoYXQiCiAgICAgICAgIi0tb3V0cHV0LXR5cGU9ZGFydCBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiIpOwogIH0KCiAgdm9pZCBzZXRCYXplbFBhdGhzKFN0cmluZyBhcmd1bWVudCkgewogICAgU3RyaW5nIHBhdGhzID0gZXh0cmFjdFBhcmFtZXRlcihhcmd1bWVudCk7CiAgICBiYXplbFBhdGhzID0gPFN0cmluZz5bXS4uYWRkQWxsKHBhdGhzLnNwbGl0KCcsJykpOwogIH0KCiAgU3RyaW5nIGdldERlcHNPdXRwdXQoSXRlcmFibGU8VXJpPiBzb3VyY2VGaWxlcykgewogICAgdmFyIGZpbGVuYW1lcyA9IHNvdXJjZUZpbGVzLm1hcCgodXJpKSA9PiAnJHVyaScpLnRvTGlzdCgpOwogICAgZmlsZW5hbWVzLnNvcnQoKTsKICAgIHJldHVybiBmaWxlbmFtZXMuam9pbigiXG4iKTsKICB9CgogIHZvaWQgc2V0QWxsb3dOYXRpdmVFeHRlbnNpb25zKFN0cmluZyBhcmd1bWVudCkgewogICAgaGVscEFuZEZhaWwoIk9wdGlvbiAnJHtGbGFncy5hbGxvd05hdGl2ZUV4dGVuc2lvbnN9JyBpcyBub3Qgc3VwcG9ydGVkLiIpOwogIH0KCiAgdm9pZCBzZXRWZXJib3NlKF8pIHsKICAgIHZlcmJvc2UgPSB0cnVlOwogICAgcGFzc1Rocm91Z2goJy0tdmVyYm9zZScpOwogIH0KCiAgdm9pZCBzZXRUcnVzdFR5cGVBbm5vdGF0aW9ucyhTdHJpbmcgYXJndW1lbnQpIHsKICAgIHRydXN0VHlwZUFubm90YXRpb25zID0gdHJ1ZTsKICB9CgogIHZvaWQgc2V0Q2hlY2tlZE1vZGUoU3RyaW5nIGFyZ3VtZW50KSB7CiAgICBjaGVja2VkTW9kZSA9IHRydWU7CiAgICBwYXNzVGhyb3VnaChhcmd1bWVudCk7CiAgfQoKICB2b2lkIGFkZEluRW52aXJvbm1lbnQoU3RyaW5nIGFyZ3VtZW50KSB7CiAgICBpbnQgZXFJbmRleCA9IGFyZ3VtZW50LmluZGV4T2YoJz0nKTsKICAgIFN0cmluZyBuYW1lID0gYXJndW1lbnQuc3Vic3RyaW5nKDIsIGVxSW5kZXgpOwogICAgU3RyaW5nIHZhbHVlID0gYXJndW1lbnQuc3Vic3RyaW5nKGVxSW5kZXggKyAxKTsKICAgIGVudmlyb25tZW50W25hbWVdID0gdmFsdWU7CiAgfQoKICB2b2lkIHNldENhdGVnb3JpZXMoU3RyaW5nIGFyZ3VtZW50KSB7CiAgICBMaXN0PFN0cmluZz4gY2F0ZWdvcmllcyA9IGV4dHJhY3RQYXJhbWV0ZXIoYXJndW1lbnQpLnNwbGl0KCcsJyk7CiAgICBib29sIGlzU2VydmVyTW9kZSA9IGNhdGVnb3JpZXMubGVuZ3RoID09IDEgJiYgY2F0ZWdvcmllcy5zaW5nbGUgPT0gIlNlcnZlciI7CiAgICBpZiAoaXNTZXJ2ZXJNb2RlKSB7CiAgICAgIGhpbnRzLmFkZCgiVGhlIC0tY2F0ZWdvcmllcyBmbGFnIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgZGVsZXRlZCBpbiBhICIKICAgICAgICAgICJmdXR1cmUgcmVsZWFzZSwgcGxlYXNlIHVzZSAnJHtGbGFncy5zZXJ2ZXJNb2RlfScgaW5zdGVhZCBvZiAiCiAgICAgICAgICAiJy0tY2F0ZWdvcmllcz1TZXJ2ZXInLiIpOwogICAgICBwYXNzVGhyb3VnaChGbGFncy5zZXJ2ZXJNb2RlKTsKICAgIH0gZWxzZSB7CiAgICAgIGhpbnRzLmFkZCgKICAgICAgICAgICJUaGUgLS1jYXRlZ29yaWVzIGZsYWcgaXMgZGVwcmVjYXRlZCwgc2VlIHRoZSB1c2FnZSBmb3IgZGV0YWlscy4iKTsKICAgIH0KICB9CgogIHZvaWQgc2V0UGxhdGZvcm1CaW5hcmllcyhTdHJpbmcgYXJndW1lbnQpIHsKICAgIHBsYXRmb3JtQmluYXJpZXMgPQogICAgICAgIGN1cnJlbnREaXJlY3RvcnkucmVzb2x2ZShleHRyYWN0UGF0aChhcmd1bWVudCwgaXNEaXJlY3Rvcnk6IHRydWUpKTsKICB9CgogIHZvaWQgc2V0UmVhZERhdGEoU3RyaW5nIGFyZ3VtZW50KSB7CiAgICBpZiAoY29tcGlsYXRpb25TdHJhdGVneSA9PSBDb21waWxhdGlvblN0cmF0ZWd5LnRvRGF0YSkgewogICAgICBmYWlsKCJDYW5ub3QgcmVhZCBhbmQgd3JpdGUgc2VyaWFsaXplZCBzaW11bHRhbmVvdXNseS4iKTsKICAgIH0KICAgIGlmIChhcmd1bWVudCAhPSBGbGFncy5yZWFkRGF0YSkgewogICAgICByZWFkRGF0YVVyaSA9IG5hdGl2ZVRvVXJpKGV4dHJhY3RQYXRoKGFyZ3VtZW50LCBpc0RpcmVjdG9yeTogZmFsc2UpKTsKICAgIH0KICAgIGNvbXBpbGF0aW9uU3RyYXRlZ3kgPSBDb21waWxhdGlvblN0cmF0ZWd5LmZyb21EYXRhOwogIH0KCiAgdm9pZCBzZXREaWxsRGVwZW5kZW5jaWVzKFN0cmluZyBhcmd1bWVudCkgewogICAgU3RyaW5nIGRlcGVuZGVuY2llcyA9IGV4dHJhY3RQYXJhbWV0ZXIoYXJndW1lbnQpOwogICAgU3RyaW5nIHVyaURlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcy5zcGxpdE1hcEpvaW4oJywnLAogICAgICAgIG9uTWF0Y2g6IChfKSA9PiAnLCcsIG9uTm9uTWF0Y2g6IChwKSA9PiAnJHtuYXRpdmVUb1VyaShwKX0nKTsKICAgIG9wdGlvbnMuYWRkKCcke0ZsYWdzLmRpbGxEZXBlbmRlbmNpZXN9PSR7dXJpRGVwZW5kZW5jaWVzfScpOwogIH0KCiAgdm9pZCBzZXRDZmVPbmx5KFN0cmluZyBhcmd1bWVudCkgewogICAgY29tcGlsYXRpb25TdHJhdGVneSA9IENvbXBpbGF0aW9uU3RyYXRlZ3kudG9LZXJuZWw7CiAgfQoKICB2b2lkIHNldFdyaXRlRGF0YShTdHJpbmcgYXJndW1lbnQpIHsKICAgIGlmIChjb21waWxhdGlvblN0cmF0ZWd5ID09IENvbXBpbGF0aW9uU3RyYXRlZ3kuZnJvbURhdGEpIHsKICAgICAgZmFpbCgiQ2Fubm90IHJlYWQgYW5kIHdyaXRlIHNlcmlhbGl6ZWQgc2ltdWx0YW5lb3VzbHkuIik7CiAgICB9CiAgICBpZiAoYXJndW1lbnQgIT0gRmxhZ3Mud3JpdGVEYXRhKSB7CiAgICAgIHdyaXRlRGF0YVVyaSA9IG5hdGl2ZVRvVXJpKGV4dHJhY3RQYXRoKGFyZ3VtZW50LCBpc0RpcmVjdG9yeTogZmFsc2UpKTsKICAgIH0KICAgIGNvbXBpbGF0aW9uU3RyYXRlZ3kgPSBDb21waWxhdGlvblN0cmF0ZWd5LnRvRGF0YTsKICB9CgogIHZvaWQgc2V0RHVtcEluZm8oU3RyaW5nIGFyZ3VtZW50KSB7CiAgICBwYXNzVGhyb3VnaChGbGFncy5kdW1wSW5mbyk7CiAgICBpZiAoYXJndW1lbnQgPT0gRmxhZ3MuZHVtcEluZm8gfHwgYXJndW1lbnQgPT0gIiR7RmxhZ3MuZHVtcEluZm99PWpzb24iKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChhcmd1bWVudCA9PSAiJHtGbGFncy5kdW1wSW5mb309YmluYXJ5IikgewogICAgICBwYXNzVGhyb3VnaChhcmd1bWVudCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGhlbHBBbmRGYWlsKCJFcnJvcjogVW5zdXBwb3J0ZWQgZHVtcC1pbmZvIGZvcm1hdCAnJGFyZ3VtZW50JywgIgogICAgICAgICJzdXBwb3J0ZWQgZm9ybWF0cyBhcmU6IGpzb24gb3IgYmluYXJ5Iik7CiAgfQoKICB2b2lkIGhhbmRsZVRocm93T25FcnJvcihTdHJpbmcgYXJndW1lbnQpIHsKICAgIHRocm93T25FcnJvciA9IHRydWU7CiAgICBTdHJpbmcgcGFyYW1ldGVyID0gZXh0cmFjdFBhcmFtZXRlcihhcmd1bWVudCwgaXNPcHRpb25hbEFyZ3VtZW50OiB0cnVlKTsKICAgIGlmIChwYXJhbWV0ZXIgIT0gbnVsbCkgewogICAgICB2YXIgY291bnQgPSBpbnQucGFyc2UocGFyYW1ldGVyKTsKICAgICAgdGhyb3dPbkVycm9yQ291bnQgPSBjb3VudDsKICAgIH0KICB9CgogIHZvaWQgaGFuZGxlU2hvcnRPcHRpb25zKFN0cmluZyBhcmd1bWVudCkgewogICAgdmFyIHNob3J0T3B0aW9ucyA9IGFyZ3VtZW50LnN1YnN0cmluZygxKS5zcGxpdCgiIik7CiAgICBmb3IgKHZhciBzaG9ydE9wdGlvbiBpbiBzaG9ydE9wdGlvbnMpIHsKICAgICAgc3dpdGNoIChzaG9ydE9wdGlvbikgewogICAgICAgIGNhc2UgJ3YnOgogICAgICAgICAgc2V0VmVyYm9zZShudWxsKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2gnOgogICAgICAgIGNhc2UgJz8nOgogICAgICAgICAgd2FudEhlbHAgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnYyc6CiAgICAgICAgICBzZXRDaGVja2VkTW9kZShGbGFncy5lbmFibGVDaGVja2VkTW9kZSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdtJzoKICAgICAgICAgIHBhc3NUaHJvdWdoKEZsYWdzLm1pbmlmeSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgJ0ludGVybmFsIGVycm9yOiAiJHNob3J0T3B0aW9uIiBkaWQgbm90IG1hdGNoJzsKICAgICAgfQogICAgfQogIH0KCiAgTGlzdDxTdHJpbmc+IGFyZ3VtZW50cyA9IDxTdHJpbmc+W107CiAgTGlzdDxPcHRpb25IYW5kbGVyPiBoYW5kbGVycyA9IDxPcHRpb25IYW5kbGVyPlsKICAgIG5ldyBPcHRpb25IYW5kbGVyKCctW2Nodm0/XSsnLCBoYW5kbGVTaG9ydE9wdGlvbnMpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoJy0tdGhyb3ctb24tZXJyb3IoPzo9WzAtOV0rKT8nLCBoYW5kbGVUaHJvd09uRXJyb3IpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3Muc3VwcHJlc3NXYXJuaW5ncywgKFN0cmluZyBhcmd1bWVudCkgewogICAgICBzaG93V2FybmluZ3MgPSBmYWxzZTsKICAgICAgcGFzc1Rocm91Z2goYXJndW1lbnQpOwogICAgfSksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5mYXRhbFdhcm5pbmdzLCBwYXNzVGhyb3VnaCksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5zdXBwcmVzc0hpbnRzLCAoU3RyaW5nIGFyZ3VtZW50KSB7CiAgICAgIHNob3dIaW50cyA9IGZhbHNlOwogICAgICBwYXNzVGhyb3VnaChhcmd1bWVudCk7CiAgICB9KSwKICAgIC8vIFRPRE8oc2lnbXVuZCk6IHJlbW92ZSBlbnRpcmVseSBhZnRlciBEYXJ0IDEuMjAKICAgIG5ldyBPcHRpb25IYW5kbGVyKAogICAgICAgICctLW91dHB1dC10eXBlPWRhcnR8LS1vdXRwdXQtdHlwZT1kYXJ0LW11bHRpfC0tb3V0cHV0LXR5cGU9anMnLAogICAgICAgIHNldE91dHB1dFR5cGUpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoJy0tdXNlLWtlcm5lbCcsIGlnbm9yZU9wdGlvbiksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5wbGF0Zm9ybUJpbmFyaWVzLCBzZXRQbGF0Zm9ybUJpbmFyaWVzKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLm5vRnJlcXVlbmN5QmFzZWRNaW5pZmljYXRpb24sIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLnZlcmJvc2UsIHNldFZlcmJvc2UpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MucHJvZ3Jlc3MsIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLnZlcnNpb24sIChfKSA9PiB3YW50VmVyc2lvbiA9IHRydWUpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoJy0tbGlicmFyeS1yb290PS4rJywgaWdub3JlT3B0aW9uKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKCctLWxpYnJhcmllcy1zcGVjPS4rJywgc2V0TGlicmFyeVNwZWNpZmljYXRpb25VcmkpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoJyR7RmxhZ3MuZGlsbERlcGVuZGVuY2llc309LisnLCBzZXREaWxsRGVwZW5kZW5jaWVzKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKCcke0ZsYWdzLnJlYWREYXRhfXwke0ZsYWdzLnJlYWREYXRhfT0uKycsIHNldFJlYWREYXRhKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKCcke0ZsYWdzLndyaXRlRGF0YX18JHtGbGFncy53cml0ZURhdGF9PS4rJywgc2V0V3JpdGVEYXRhKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLmNmZU9ubHksIHNldENmZU9ubHkpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MuZGVidWdHbG9iYWxJbmZlcmVuY2UsIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKCctLW91dD0uK3wtby4qJywgc2V0T3V0cHV0LCBtdWx0aXBsZUFyZ3VtZW50czogdHJ1ZSksCiAgICBuZXcgT3B0aW9uSGFuZGxlcignLU8uKicsIHNldE9wdGltaXphdGlvbkxldmVsKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLmFsbG93TW9ja0NvbXBpbGF0aW9uLCBpZ25vcmVPcHRpb24pLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MuZmFzdFN0YXJ0dXAsIGlnbm9yZU9wdGlvbiksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5nZW5lcmljTWV0aG9kU3ludGF4LCBpZ25vcmVPcHRpb24pLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MuaW5pdGlhbGl6aW5nRm9ybWFsQWNjZXNzLCBpZ25vcmVPcHRpb24pLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MubWluaWZ5LCBwYXNzVGhyb3VnaCksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5ub01pbmlmeSwgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MucHJlc2VydmVVcmlzLCBpZ25vcmVPcHRpb24pLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoJy0tZm9yY2Utc3RyaXA9LionLCBzZXRTdHJpcCksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5kaXNhYmxlRGlhZ25vc3RpY0NvbG9ycywgKF8pIHsKICAgICAgZW5hYmxlQ29sb3JzID0gZmFsc2U7CiAgICB9KSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLmVuYWJsZURpYWdub3N0aWNDb2xvcnMsIChfKSB7CiAgICAgIGVuYWJsZUNvbG9ycyA9IHRydWU7CiAgICB9KSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKCctLWVuYWJsZVtfLV1jaGVja2VkW18tXW1vZGV8LS1jaGVja2VkJywKICAgICAgICAoXykgPT4gc2V0Q2hlY2tlZE1vZGUoRmxhZ3MuZW5hYmxlQ2hlY2tlZE1vZGUpKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLmVuYWJsZUFzc2VydHMsIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLnRydXN0VHlwZUFubm90YXRpb25zLCBzZXRUcnVzdFR5cGVBbm5vdGF0aW9ucyksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy50cnVzdFByaW1pdGl2ZXMsIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLnRydXN0SlNJbnRlcm9wVHlwZUFubm90YXRpb25zLCBwYXNzVGhyb3VnaCksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihyJy0taGVscHwvXD98L2gnLCAoXykgPT4gd2FudEhlbHAgPSB0cnVlKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKCctLXBhY2thZ2VzPS4rJywgc2V0UGFja2FnZUNvbmZpZyksCiAgICBuZXcgT3B0aW9uSGFuZGxlcignLS1wYWNrYWdlLXJvb3Q9Lit8LXAuKycsIHNldFBhY2thZ2VSb290KSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLm5vU291cmNlTWFwcywgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoT3B0aW9uLnJlc29sdXRpb25JbnB1dCwgaWdub3JlT3B0aW9uKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKE9wdGlvbi5iYXplbFBhdGhzLCBzZXRCYXplbFBhdGhzKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLnJlc29sdmVPbmx5LCBpZ25vcmVPcHRpb24pLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MuZGlzYWJsZU5hdGl2ZUxpdmVUeXBlQW5hbHlzaXMsIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKCctLWNhdGVnb3JpZXM9LionLCBzZXRDYXRlZ29yaWVzKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLnNlcnZlck1vZGUsIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLmRpc2FibGVJbmxpbmluZywgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MuZGlzYWJsZVByb2dyYW1TcGxpdCwgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MuZGlzYWJsZVR5cGVJbmZlcmVuY2UsIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLnVzZVRyaXZpYWxBYnN0cmFjdFZhbHVlRG9tYWluLCBwYXNzVGhyb3VnaCksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5kaXNhYmxlUnRpT3B0aW1pemF0aW9uLCBwYXNzVGhyb3VnaCksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy50ZXJzZSwgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoJy0tZGVmZXJyZWQtbWFwPS4rJywgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MubmV3RGVmZXJyZWRTcGxpdCwgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MucmVwb3J0SW52YWxpZEluZmVycmVkRGVmZXJyZWRUeXBlcywgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoJyR7RmxhZ3MuZHVtcEluZm99fCR7RmxhZ3MuZHVtcEluZm99PS4rJywgc2V0RHVtcEluZm8pLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoJy0tZGlzYWxsb3ctdW5zYWZlLWV2YWwnLCBpZ25vcmVPcHRpb24pLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoT3B0aW9uLnNob3dQYWNrYWdlV2FybmluZ3MsIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKE9wdGlvbi5lbmFibGVMYW5ndWFnZUV4cGVyaW1lbnRzLCBwYXNzVGhyb3VnaCksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy51c2VDb250ZW50U2VjdXJpdHlQb2xpY3ksIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKCctLWVuYWJsZS1leHBlcmltZW50YWwtbWlycm9ycycsIGlnbm9yZU9wdGlvbiksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5lbmFibGVBc3NlcnRNZXNzYWdlLCBwYXNzVGhyb3VnaCksCiAgICBuZXcgT3B0aW9uSGFuZGxlcignLS1zdHJvbmcnLCBpZ25vcmVPcHRpb24pLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MucHJldmlld0RhcnQyLCBpZ25vcmVPcHRpb24pLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3Mub21pdEltcGxpY2l0Q2hlY2tzLCBwYXNzVGhyb3VnaCksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5vbWl0QXNDYXN0cywgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MubGF4UnVudGltZVR5cGVUb1N0cmluZywgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MuYmVuY2htYXJraW5nUHJvZHVjdGlvbiwgcGFzc1Rocm91Z2gpLAoKICAgIC8vIFRPRE8oZmxvaXRzY2gpOiByZW1vdmUgY29uZGl0aW9uYWwgZGlyZWN0aXZlcyBmbGFnLgogICAgLy8gV2UgZG9uJ3QgcHJvdmlkZSB0aGUgaW5mby1tZXNzYWdlIHlldCwgc2luY2Ugd2UgaGF2ZW4ndCBwdWJsaWNseQogICAgLy8gbGF1bmNoZWQgdGhlIGZlYXR1cmUgeWV0LgogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MuY29uZGl0aW9uYWxEaXJlY3RpdmVzLCBpZ25vcmVPcHRpb24pLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoJy0tZW5hYmxlLWFzeW5jJywgaWdub3JlT3B0aW9uKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKCctLWVuYWJsZS1udWxsLWF3YXJlLW9wZXJhdG9ycycsIGlnbm9yZU9wdGlvbiksCiAgICBuZXcgT3B0aW9uSGFuZGxlcignLS1lbmFibGUtZW51bScsIGlnbm9yZU9wdGlvbiksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5hbGxvd05hdGl2ZUV4dGVuc2lvbnMsIHNldEFsbG93TmF0aXZlRXh0ZW5zaW9ucyksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5nZW5lcmF0ZUNvZGVXaXRoQ29tcGlsZVRpbWVFcnJvcnMsIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLnVzZU11bHRpU291cmNlSW5mbywgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MudXNlTmV3U291cmNlSW5mbywgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MudGVzdE1vZGUsIHBhc3NUaHJvdWdoKSwKCiAgICAvLyBFeHBlcmltZW50YWwgZmVhdHVyZXMuCiAgICAvLyBXZSBkb24ndCBwcm92aWRlIGRvY3VtZW50YXRpb24gZm9yIHRoZXNlIHlldC4KICAgIC8vIFRPRE8oMjk1NzQpOiBwcm92aWRlIGRvY3VtZW50YXRpb24gd2hlbiB0aGlzIGZlYXR1cmUgaXMgc3VwcG9ydGVkLgogICAgLy8gVE9ETygyOTU3NCk6IHByb3ZpZGUgYSB3YXJuaW5nL2hpbnQvZXJyb3IsIHdoZW4gcHJvZmlsZS1iYXNlZCBkYXRhIGlzCiAgICAvLyB1c2VkIHdpdGhvdXQgYC0tZmFzdC1zdGFydHVwYC4KICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLmV4cGVyaW1lbnRhbFRyYWNrQWxsb2NhdGlvbnMsIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKCIke0ZsYWdzLmV4cGVyaW1lbnRhbEFsbG9jYXRpb25zUGF0aH09LisiLCBwYXNzVGhyb3VnaCksCgogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MuZXhwZXJpbWVudExvY2FsTmFtZXMsIGlnbm9yZU9wdGlvbiksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5leHBlcmltZW50U3RhcnR1cEZ1bmN0aW9ucywgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MuZXhwZXJpbWVudFRvQm9vbGVhbiwgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MuZXhwZXJpbWVudENhbGxJbnN0cnVtZW50YXRpb24sIHBhc3NUaHJvdWdoKSwKCiAgICAvLyBUaGUgZm9sbG93aW5nIHRocmVlIG9wdGlvbnMgbXVzdCBjb21lIGxhc3QuCiAgICBuZXcgT3B0aW9uSGFuZGxlcignLUQuKz0uKicsIGFkZEluRW52aXJvbm1lbnQpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoJy0uKicsIChTdHJpbmcgYXJndW1lbnQpIHsKICAgICAgaGVscEFuZEZhaWwoIlVua25vd24gb3B0aW9uICckYXJndW1lbnQnLiIpOwogICAgfSksCiAgICBuZXcgT3B0aW9uSGFuZGxlcignLionLCAoU3RyaW5nIGFyZ3VtZW50KSB7CiAgICAgIGFyZ3VtZW50cy5hZGQobmF0aXZlVG9VcmlQYXRoKGFyZ3VtZW50KSk7CiAgICB9KQogIF07CgogIHBhcnNlQ29tbWFuZExpbmUoaGFuZGxlcnMsIGFyZ3YpOwoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNZWFzdXJlIHRpbWUgZm9yIHJlYWRpbmcgZmlsZXMuCiAgU291cmNlRmlsZVByb3ZpZGVyIGlucHV0UHJvdmlkZXI7CiAgaWYgKGJhemVsUGF0aHMgIT0gbnVsbCkgewogICAgaW5wdXRQcm92aWRlciA9IG5ldyBCYXplbElucHV0UHJvdmlkZXIoYmF6ZWxQYXRocyk7CiAgfSBlbHNlIHsKICAgIGlucHV0UHJvdmlkZXIgPSBuZXcgQ29tcGlsZXJTb3VyY2VGaWxlUHJvdmlkZXIoKTsKICB9CgogIGRpYWdub3N0aWNIYW5kbGVyID0gbmV3IEZvcm1hdHRpbmdEaWFnbm9zdGljSGFuZGxlcihpbnB1dFByb3ZpZGVyKTsKICBpZiAodmVyYm9zZSAhPSBudWxsKSB7CiAgICBkaWFnbm9zdGljSGFuZGxlci52ZXJib3NlID0gdmVyYm9zZTsKICB9CiAgaWYgKHRocm93T25FcnJvciAhPSBudWxsKSB7CiAgICBkaWFnbm9zdGljSGFuZGxlci50aHJvd09uRXJyb3IgPSB0aHJvd09uRXJyb3I7CiAgfQogIGlmICh0aHJvd09uRXJyb3JDb3VudCAhPSBudWxsKSB7CiAgICBkaWFnbm9zdGljSGFuZGxlci50aHJvd09uRXJyb3JDb3VudCA9IHRocm93T25FcnJvckNvdW50OwogIH0KICBpZiAoc2hvd1dhcm5pbmdzICE9IG51bGwpIHsKICAgIGRpYWdub3N0aWNIYW5kbGVyLnNob3dXYXJuaW5ncyA9IHNob3dXYXJuaW5nczsKICB9CiAgaWYgKHNob3dIaW50cyAhPSBudWxsKSB7CiAgICBkaWFnbm9zdGljSGFuZGxlci5zaG93SGludHMgPSBzaG93SGludHM7CiAgfQogIGlmIChlbmFibGVDb2xvcnMgIT0gbnVsbCkgewogICAgZGlhZ25vc3RpY0hhbmRsZXIuZW5hYmxlQ29sb3JzID0gZW5hYmxlQ29sb3JzOwogIH0KCiAgaWYgKGNoZWNrZWRNb2RlICYmIHN0cm9uZ01vZGUpIHsKICAgIGNoZWNrZWRNb2RlID0gZmFsc2U7CiAgICBoaW50cy5hZGQoIk9wdGlvbiAnJHtGbGFncy5lbmFibGVDaGVja2VkTW9kZX0nIGlzIG5vdCBuZWVkZWQgaW4gRGFydCAyLjAuICIKICAgICAgICAiVG8gZW5hYmxlIGFzc2VydGlvbnMgdXNlICcke0ZsYWdzLmVuYWJsZUFzc2VydHN9JyBpbnN0ZWFkLiIpOwogIH0KCiAgaWYgKHRydXN0VHlwZUFubm90YXRpb25zICYmIHN0cm9uZ01vZGUpIHsKICAgIGhpbnRzLmFkZCgiT3B0aW9uICcke0ZsYWdzLnRydXN0VHlwZUFubm90YXRpb25zfScgaXMgbm90IGF2YWlsYWJsZSAiCiAgICAgICAgImluIERhcnQgMi4wLiBUcnkgdXNpbmcgJyR7RmxhZ3Mub21pdEltcGxpY2l0Q2hlY2tzfScgaW5zdGVhZC4iKTsKICB9CgogIGZvciAoU3RyaW5nIGhpbnQgaW4gaGludHMpIHsKICAgIGRpYWdub3N0aWNIYW5kbGVyLmluZm8oaGludCwgYXBpLkRpYWdub3N0aWMuSElOVCk7CiAgfQoKICBpZiAod2FudEhlbHAgfHwgd2FudFZlcnNpb24pIHsKICAgIGhlbHBBbmRFeGl0KHdhbnRIZWxwLCB3YW50VmVyc2lvbiwgZGlhZ25vc3RpY0hhbmRsZXIudmVyYm9zZSk7CiAgfQoKICBpZiAoYXJndW1lbnRzLmlzRW1wdHkpIHsKICAgIGhlbHBBbmRGYWlsKCdObyBEYXJ0IGZpbGUgc3BlY2lmaWVkLicpOwogIH0KICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKICAgIHZhciBleHRyYSA9IGFyZ3VtZW50cy5zdWJsaXN0KDEpOwogICAgaGVscEFuZEZhaWwoJ0V4dHJhIGFyZ3VtZW50czogJHtleHRyYS5qb2luKCIgIil9Jyk7CiAgfQoKICBpZiAodHJ1c3RUeXBlQW5ub3RhdGlvbnMgJiYgY2hlY2tlZE1vZGUpIHsKICAgIGhlbHBBbmRGYWlsKCJPcHRpb24gJyR7RmxhZ3MudHJ1c3RUeXBlQW5ub3RhdGlvbnN9JyBtYXkgbm90IGJlIHVzZWQgaW4gIgogICAgICAgICJjaGVja2VkIG1vZGUuIik7CiAgfQoKICBpZiAocGFja2FnZVJvb3QgIT0gbnVsbCAmJiBwYWNrYWdlQ29uZmlnICE9IG51bGwpIHsKICAgIGhlbHBBbmRGYWlsKCJDYW5ub3Qgc3BlY2lmeSBib3RoICctLXBhY2thZ2Utcm9vdCcgYW5kICctLXBhY2thZ2VzLiIpOwogIH0KCiAgU3RyaW5nIHNjcmlwdE5hbWUgPSBhcmd1bWVudHNbMF07CgogIHN3aXRjaCAoY29tcGlsYXRpb25TdHJhdGVneSkgewogICAgY2FzZSBDb21waWxhdGlvblN0cmF0ZWd5LmRpcmVjdDoKICAgICAgb3V0ID8/PSBjdXJyZW50RGlyZWN0b3J5LnJlc29sdmUoJ291dC5qcycpOwogICAgICBicmVhazsKICAgIGNhc2UgQ29tcGlsYXRpb25TdHJhdGVneS50b0tlcm5lbDoKICAgICAgb3V0ID8/PSBjdXJyZW50RGlyZWN0b3J5LnJlc29sdmUoJ291dC5kaWxsJyk7CiAgICAgIG9wdGlvbnMuYWRkKEZsYWdzLmNmZU9ubHkpOwogICAgICBicmVhazsKICAgIGNhc2UgQ29tcGlsYXRpb25TdHJhdGVneS50b0RhdGE6CiAgICAgIG91dCA/Pz0gY3VycmVudERpcmVjdG9yeS5yZXNvbHZlKCdvdXQuZGlsbCcpOwogICAgICB3cml0ZURhdGFVcmkgPz89IGN1cnJlbnREaXJlY3RvcnkucmVzb2x2ZSgnJG91dC5kYXRhJyk7CiAgICAgIG9wdGlvbnMuYWRkKCcke0ZsYWdzLndyaXRlRGF0YX09JHt3cml0ZURhdGFVcml9Jyk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBDb21waWxhdGlvblN0cmF0ZWd5LmZyb21EYXRhOgogICAgICBvdXQgPz89IGN1cnJlbnREaXJlY3RvcnkucmVzb2x2ZSgnb3V0LmpzJyk7CiAgICAgIHJlYWREYXRhVXJpID8/PSBjdXJyZW50RGlyZWN0b3J5LnJlc29sdmUoJyRzY3JpcHROYW1lLmRhdGEnKTsKICAgICAgb3B0aW9ucy5hZGQoJyR7RmxhZ3MucmVhZERhdGF9PSR7cmVhZERhdGFVcml9Jyk7CiAgICAgIGJyZWFrOwogIH0KICBvcHRpb25zLmFkZCgnLS1vdXQ9JG91dCcpOwogIHNvdXJjZU1hcE91dCA9IFVyaS5wYXJzZSgnJG91dC5tYXAnKTsKICBvcHRpb25zLmFkZCgnLS1zb3VyY2UtbWFwPSR7c291cmNlTWFwT3V0fScpOwoKICBSYW5kb21BY2Nlc3NGaWxlT3V0cHV0UHJvdmlkZXIgb3V0cHV0UHJvdmlkZXIgPQogICAgICBuZXcgUmFuZG9tQWNjZXNzRmlsZU91dHB1dFByb3ZpZGVyKG91dCwgc291cmNlTWFwT3V0LAogICAgICAgICAgb25JbmZvOiBkaWFnbm9zdGljSGFuZGxlci5pbmZvLCBvbkZhaWx1cmU6IGZhaWwpOwoKICBhcGkuQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25Eb25lKGFwaS5Db21waWxhdGlvblJlc3VsdCByZXN1bHQpIHsKICAgIGlmICghcmVzdWx0LmlzU3VjY2VzcykgewogICAgICBmYWlsKCdDb21waWxhdGlvbiBmYWlsZWQuJyk7CiAgICB9CiAgICB3cml0ZVN0cmluZygKICAgICAgICBVcmkucGFyc2UoJyRvdXQuZGVwcycpLCBnZXREZXBzT3V0cHV0KGlucHV0UHJvdmlkZXIuZ2V0U291cmNlVXJpcygpKSk7CiAgICBzd2l0Y2ggKGNvbXBpbGF0aW9uU3RyYXRlZ3kpIHsKICAgICAgY2FzZSBDb21waWxhdGlvblN0cmF0ZWd5LmRpcmVjdDoKICAgICAgICBpbnQgZGFydENoYXJhY3RlcnNSZWFkID0gaW5wdXRQcm92aWRlci5kYXJ0Q2hhcmFjdGVyc1JlYWQ7CiAgICAgICAgaW50IGpzQ2hhcmFjdGVyc1dyaXR0ZW4gPQogICAgICAgICAgICBvdXRwdXRQcm92aWRlci50b3RhbENoYXJhY3RlcnNXcml0dGVuSmF2YVNjcmlwdDsKICAgICAgICBpbnQganNDaGFyYWN0ZXJzUHJpbWFyeSA9IG91dHB1dFByb3ZpZGVyLnRvdGFsQ2hhcmFjdGVyc1dyaXR0ZW5QcmltYXJ5OwogICAgICAgIHByaW50KCdDb21waWxlZCAnCiAgICAgICAgICAgICcke19mb3JtYXRDaGFyYWN0ZXJDb3VudChkYXJ0Q2hhcmFjdGVyc1JlYWQpfSBjaGFyYWN0ZXJzIERhcnQgdG8gJwogICAgICAgICAgICAnJHtfZm9ybWF0Q2hhcmFjdGVyQ291bnQoanNDaGFyYWN0ZXJzV3JpdHRlbil9IGNoYXJhY3RlcnMgJwogICAgICAgICAgICAnSmF2YVNjcmlwdCBpbiAnCiAgICAgICAgICAgICcke19mb3JtYXREdXJhdGlvbkFzU2Vjb25kcyh3YWxsY2xvY2suZWxhcHNlZCl9IHNlY29uZHMnKTsKCiAgICAgICAgZGlhZ25vc3RpY0hhbmRsZXIKICAgICAgICAgICAgLmluZm8oJyR7X2Zvcm1hdENoYXJhY3RlckNvdW50KGpzQ2hhcmFjdGVyc1ByaW1hcnkpfSBjaGFyYWN0ZXJzICcKICAgICAgICAgICAgICAgICdKYXZhU2NyaXB0IGluICcKICAgICAgICAgICAgICAgICcke3JlbGF0aXZpemUoY3VycmVudERpcmVjdG9yeSwgb3V0LCBQbGF0Zm9ybS5pc1dpbmRvd3MpfScpOwogICAgICAgIGlmIChvdXRwdXRTcGVjaWZpZWQgfHwgZGlhZ25vc3RpY0hhbmRsZXIudmVyYm9zZSkgewogICAgICAgICAgU3RyaW5nIGlucHV0ID0gdXJpUGF0aFRvTmF0aXZlKHNjcmlwdE5hbWUpOwogICAgICAgICAgU3RyaW5nIG91dHB1dCA9IHJlbGF0aXZpemUoY3VycmVudERpcmVjdG9yeSwgb3V0LCBQbGF0Zm9ybS5pc1dpbmRvd3MpOwogICAgICAgICAgcHJpbnQoJ0RhcnQgZmlsZSAoJGlucHV0KSBjb21waWxlZCB0byBKYXZhU2NyaXB0OiAkb3V0cHV0Jyk7CiAgICAgICAgICBpZiAoZGlhZ25vc3RpY0hhbmRsZXIudmVyYm9zZSkgewogICAgICAgICAgICB2YXIgZmlsZXMgPSBvdXRwdXRQcm92aWRlci5hbGxPdXRwdXRGaWxlczsKICAgICAgICAgICAgaW50IGpzQ291bnQgPSBmaWxlcy53aGVyZSgoZikgPT4gZi5lbmRzV2l0aCgnLmpzJykpLmxlbmd0aDsKICAgICAgICAgICAgcHJpbnQoJ0VtaXR0ZWQgZmlsZSAkanNDb3VudCBKYXZhU2NyaXB0IGZpbGVzLicpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb21waWxhdGlvblN0cmF0ZWd5LnRvS2VybmVsOgogICAgICAgIGludCBkYXJ0Q2hhcmFjdGVyc1JlYWQgPSBpbnB1dFByb3ZpZGVyLmRhcnRDaGFyYWN0ZXJzUmVhZDsKICAgICAgICBpbnQgZGF0YUJ5dGVzV3JpdHRlbiA9IG91dHB1dFByb3ZpZGVyLnRvdGFsRGF0YVdyaXR0ZW47CiAgICAgICAgcHJpbnQoJ0NvbXBpbGVkICcKICAgICAgICAgICAgJyR7X2Zvcm1hdENoYXJhY3RlckNvdW50KGRhcnRDaGFyYWN0ZXJzUmVhZCl9IGNoYXJhY3RlcnMgRGFydCB0byAnCiAgICAgICAgICAgICcke19mb3JtYXRDaGFyYWN0ZXJDb3VudChkYXRhQnl0ZXNXcml0dGVuKX0ga2VybmVsIGJ5dGVzIGluICcKICAgICAgICAgICAgJyR7X2Zvcm1hdER1cmF0aW9uQXNTZWNvbmRzKHdhbGxjbG9jay5lbGFwc2VkKX0gc2Vjb25kcycpOwogICAgICAgIFN0cmluZyBpbnB1dCA9IHVyaVBhdGhUb05hdGl2ZShzY3JpcHROYW1lKTsKICAgICAgICBTdHJpbmcgZGlsbE91dHB1dCA9CiAgICAgICAgICAgIHJlbGF0aXZpemUoY3VycmVudERpcmVjdG9yeSwgb3V0LCBQbGF0Zm9ybS5pc1dpbmRvd3MpOwogICAgICAgIHByaW50KCdEYXJ0IGZpbGUgKCRpbnB1dCkgY29tcGlsZWQgdG8gJHtkaWxsT3V0cHV0fS4nKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb21waWxhdGlvblN0cmF0ZWd5LnRvRGF0YToKICAgICAgICBpbnQgZGFydENoYXJhY3RlcnNSZWFkID0gaW5wdXRQcm92aWRlci5kYXJ0Q2hhcmFjdGVyc1JlYWQ7CiAgICAgICAgaW50IGRhdGFCeXRlc1dyaXR0ZW4gPSBvdXRwdXRQcm92aWRlci50b3RhbERhdGFXcml0dGVuOwogICAgICAgIHByaW50KCdTZXJpYWxpemVkICcKICAgICAgICAgICAgJyR7X2Zvcm1hdENoYXJhY3RlckNvdW50KGRhcnRDaGFyYWN0ZXJzUmVhZCl9IGNoYXJhY3RlcnMgRGFydCB0byAnCiAgICAgICAgICAgICcke19mb3JtYXRDaGFyYWN0ZXJDb3VudChkYXRhQnl0ZXNXcml0dGVuKX0gYnl0ZXMgZGF0YSBpbiAnCiAgICAgICAgICAgICcke19mb3JtYXREdXJhdGlvbkFzU2Vjb25kcyh3YWxsY2xvY2suZWxhcHNlZCl9IHNlY29uZHMnKTsKICAgICAgICBTdHJpbmcgaW5wdXQgPSB1cmlQYXRoVG9OYXRpdmUoc2NyaXB0TmFtZSk7CiAgICAgICAgU3RyaW5nIGRpbGxPdXRwdXQgPQogICAgICAgICAgICByZWxhdGl2aXplKGN1cnJlbnREaXJlY3RvcnksIG91dCwgUGxhdGZvcm0uaXNXaW5kb3dzKTsKICAgICAgICBTdHJpbmcgZGF0YU91dHB1dCA9CiAgICAgICAgICAgIHJlbGF0aXZpemUoY3VycmVudERpcmVjdG9yeSwgd3JpdGVEYXRhVXJpLCBQbGF0Zm9ybS5pc1dpbmRvd3MpOwogICAgICAgIHByaW50KCdEYXJ0IGZpbGUgKCRpbnB1dCkgc2VyaWFsaXplZCB0byAnCiAgICAgICAgICAgICcke2RpbGxPdXRwdXR9IGFuZCAke2RhdGFPdXRwdXR9LicpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENvbXBpbGF0aW9uU3RyYXRlZ3kuZnJvbURhdGE6CiAgICAgICAgaW50IGRhdGFDaGFyYWN0ZXJzUmVhZCA9IGlucHV0UHJvdmlkZXIuZGFydENoYXJhY3RlcnNSZWFkOwogICAgICAgIGludCBqc0NoYXJhY3RlcnNXcml0dGVuID0KICAgICAgICAgICAgb3V0cHV0UHJvdmlkZXIudG90YWxDaGFyYWN0ZXJzV3JpdHRlbkphdmFTY3JpcHQ7CiAgICAgICAgaW50IGpzQ2hhcmFjdGVyc1ByaW1hcnkgPSBvdXRwdXRQcm92aWRlci50b3RhbENoYXJhY3RlcnNXcml0dGVuUHJpbWFyeTsKICAgICAgICBwcmludCgnQ29tcGlsZWQgJwogICAgICAgICAgICAnJHtfZm9ybWF0Q2hhcmFjdGVyQ291bnQoZGF0YUNoYXJhY3RlcnNSZWFkKX0gYnl0ZXMgZGF0YSB0byAnCiAgICAgICAgICAgICcke19mb3JtYXRDaGFyYWN0ZXJDb3VudChqc0NoYXJhY3RlcnNXcml0dGVuKX0gY2hhcmFjdGVycyAnCiAgICAgICAgICAgICdKYXZhU2NyaXB0IGluICcKICAgICAgICAgICAgJyR7X2Zvcm1hdER1cmF0aW9uQXNTZWNvbmRzKHdhbGxjbG9jay5lbGFwc2VkKX0gc2Vjb25kcycpOwoKICAgICAgICBkaWFnbm9zdGljSGFuZGxlcgogICAgICAgICAgICAuaW5mbygnJHtfZm9ybWF0Q2hhcmFjdGVyQ291bnQoanNDaGFyYWN0ZXJzUHJpbWFyeSl9IGNoYXJhY3RlcnMgJwogICAgICAgICAgICAgICAgJ0phdmFTY3JpcHQgaW4gJwogICAgICAgICAgICAgICAgJyR7cmVsYXRpdml6ZShjdXJyZW50RGlyZWN0b3J5LCBvdXQsIFBsYXRmb3JtLmlzV2luZG93cyl9Jyk7CiAgICAgICAgaWYgKG91dHB1dFNwZWNpZmllZCB8fCBkaWFnbm9zdGljSGFuZGxlci52ZXJib3NlKSB7CiAgICAgICAgICBTdHJpbmcgaW5wdXQgPSB1cmlQYXRoVG9OYXRpdmUoc2NyaXB0TmFtZSk7CiAgICAgICAgICBTdHJpbmcgb3V0cHV0ID0gcmVsYXRpdml6ZShjdXJyZW50RGlyZWN0b3J5LCBvdXQsIFBsYXRmb3JtLmlzV2luZG93cyk7CiAgICAgICAgICBwcmludCgnRGFydCBmaWxlICgkaW5wdXQpIGNvbXBpbGVkIHRvIEphdmFTY3JpcHQ6ICRvdXRwdXQnKTsKICAgICAgICAgIGlmIChkaWFnbm9zdGljSGFuZGxlci52ZXJib3NlKSB7CiAgICAgICAgICAgIHZhciBmaWxlcyA9IG91dHB1dFByb3ZpZGVyLmFsbE91dHB1dEZpbGVzOwogICAgICAgICAgICBpbnQganNDb3VudCA9IGZpbGVzLndoZXJlKChmKSA9PiBmLmVuZHNXaXRoKCcuanMnKSkubGVuZ3RoOwogICAgICAgICAgICBwcmludCgnRW1pdHRlZCBmaWxlICRqc0NvdW50IEphdmFTY3JpcHQgZmlsZXMuJyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgfQoKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBVcmkgc2NyaXB0ID0gY3VycmVudERpcmVjdG9yeS5yZXNvbHZlKHNjcmlwdE5hbWUpOwoKICBkaWFnbm9zdGljSGFuZGxlci5hdXRvUmVhZEZpbGVVcmkgPSB0cnVlOwogIENvbXBpbGVyT3B0aW9ucyBjb21waWxlck9wdGlvbnMgPSBDb21waWxlck9wdGlvbnMucGFyc2Uob3B0aW9ucywKICAgICAgbGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaTogbGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaSwKICAgICAgcGxhdGZvcm1CaW5hcmllczogcGxhdGZvcm1CaW5hcmllcykKICAgIC4uZW50cnlQb2ludCA9IHNjcmlwdAogICAgLi5wYWNrYWdlUm9vdCA9IHBhY2thZ2VSb290CiAgICAuLnBhY2thZ2VDb25maWcgPSBwYWNrYWdlQ29uZmlnCiAgICAuLmVudmlyb25tZW50ID0gZW52aXJvbm1lbnQKICAgIC4ua2VybmVsSW5pdGlhbGl6ZWRDb21waWxlclN0YXRlID0ga2VybmVsSW5pdGlhbGl6ZWRDb21waWxlclN0YXRlCiAgICAuLm9wdGltaXphdGlvbkxldmVsID0gb3B0aW1pemF0aW9uTGV2ZWw7CiAgcmV0dXJuIGNvbXBpbGVGdW5jKAogICAgICAgICAgY29tcGlsZXJPcHRpb25zLCBpbnB1dFByb3ZpZGVyLCBkaWFnbm9zdGljSGFuZGxlciwgb3V0cHV0UHJvdmlkZXIpCiAgICAgIC50aGVuKGNvbXBpbGF0aW9uRG9uZSk7Cn0KCi8vLyBSZXR1cm5zIHRoZSBub24tbmVnYXRpdmUgaW50ZWdlciBmb3JtYXR0ZWQgd2l0aCBhIHRob3VzYW5kcyBzZXBhcmF0b3IuClN0cmluZyBfZm9ybWF0Q2hhcmFjdGVyQ291bnQoaW50IHZhbHVlLCBbU3RyaW5nIHNlcGFyYXRvciA9ICcsJ10pIHsKICBTdHJpbmcgdGV4dCA9ICckdmFsdWUnOwogIC8vICdJbnNlcnQnIHNlcGFyYXRvcnMgcmlnaHQtdG8tbGVmdC4gSW5lZmZpY2llbnQsIGJ1dCB1c2VkIGp1c3QgYSBmZXcgdGltZXMuCiAgZm9yIChpbnQgcG9zaXRpb24gPSB0ZXh0Lmxlbmd0aCAtIDM7IHBvc2l0aW9uID4gMDsgcG9zaXRpb24gLT0gMykgewogICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHBvc2l0aW9uKSArIHNlcGFyYXRvciArIHRleHQuc3Vic3RyaW5nKHBvc2l0aW9uKTsKICB9CiAgcmV0dXJuIHRleHQ7Cn0KCi8vLyBGb3JtYXRzIFtkdXJhdGlvbl0gaW4gc2Vjb25kcyBpbiBmaXhlZC1wb2ludCBmb3JtYXQsIHByZWZlcnJpbmcgdG8ga2VlcCB0aGUKLy8vIHJlc3VsdCBhdCB0byBiZWxvdyBbd2lkdGhdIGNoYXJhY3RlcnMuClN0cmluZyBfZm9ybWF0RHVyYXRpb25Bc1NlY29uZHMoRHVyYXRpb24gZHVyYXRpb24sIFtpbnQgd2lkdGggPSA0XSkgewogIG51bSBzZWNvbmRzID0gZHVyYXRpb24uaW5NaWxsaXNlY29uZHMgLyAxMDAwLjA7CiAgU3RyaW5nIHRleHQ7CiAgZm9yIChpbnQgZGlnaXRzID0gMzsgZGlnaXRzID49IDA7IGRpZ2l0cy0tKSB7CiAgICB0ZXh0ID0gc2Vjb25kcy50b1N0cmluZ0FzRml4ZWQoZGlnaXRzKTsKICAgIGlmICh0ZXh0Lmxlbmd0aCA8PSB3aWR0aCkgcmV0dXJuIHRleHQ7CiAgfQogIHJldHVybiB0ZXh0Owp9CgpjbGFzcyBBYm9ydExlZyB7CiAgZmluYWwgbWVzc2FnZTsKICBBYm9ydExlZyh0aGlzLm1lc3NhZ2UpOwogIEBvdmVycmlkZQogIHRvU3RyaW5nKCkgPT4gJ0Fib3J0ZWQgZHVlIHRvIC0tdGhyb3ctb24tZXJyb3I6ICRtZXNzYWdlJzsKfQoKdm9pZCB3cml0ZVN0cmluZyhVcmkgdXJpLCBTdHJpbmcgdGV4dCkgewogIGlmICghZW5hYmxlV3JpdGVTdHJpbmcpIHJldHVybjsKICBpZiAodXJpLnNjaGVtZSAhPSAnZmlsZScpIHsKICAgIGZhaWwoJ1VuaGFuZGxlZCBzY2hlbWUgJHt1cmkuc2NoZW1lfS4nKTsKICB9CiAgdmFyIGZpbGUgPSBuZXcgRmlsZSh1cmkudG9GaWxlUGF0aCgpKS5vcGVuU3luYyhtb2RlOiBGaWxlTW9kZS53cml0ZSk7CiAgZmlsZS53cml0ZVN0cmluZ1N5bmModGV4dCk7CiAgZmlsZS5jbG9zZVN5bmMoKTsKfQoKdm9pZCBmYWlsKFN0cmluZyBtZXNzYWdlKSB7CiAgaWYgKGRpYWdub3N0aWNIYW5kbGVyICE9IG51bGwpIHsKICAgIGRpYWdub3N0aWNIYW5kbGVyLnJlcG9ydChudWxsLCBudWxsLCAtMSwgLTEsIG1lc3NhZ2UsIGFwaS5EaWFnbm9zdGljLkVSUk9SKTsKICB9IGVsc2UgewogICAgcHJpbnQoJ0Vycm9yOiAkbWVzc2FnZScpOwogIH0KICBleGl0RnVuYygxKTsKfQoKRnV0dXJlPGFwaS5Db21waWxhdGlvblJlc3VsdD4gY29tcGlsZXJNYWluKExpc3Q8U3RyaW5nPiBhcmd1bWVudHMsCiAgICB7ZmUuSW5pdGlhbGl6ZWRDb21waWxlclN0YXRlIGtlcm5lbEluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZX0pIGFzeW5jIHsKICBpZiAoIWFyZ3VtZW50cy5hbnkoKGEpID0+IGEuc3RhcnRzV2l0aCgnLS1saWJyYXJpZXMtc3BlYz0nKSkpIHsKICAgIFVyaSBzY3JpcHQgPSBQbGF0Zm9ybS5zY3JpcHQ7CiAgICBpZiAoc2NyaXB0LmlzU2NoZW1lKCJwYWNrYWdlIikpIHsKICAgICAgc2NyaXB0ID0gYXdhaXQgSXNvbGF0ZS5yZXNvbHZlUGFja2FnZVVyaShzY3JpcHQpOwogICAgfQogICAgVXJpIGxpYnJhcmllc0pzb24gPSBzY3JpcHQucmVzb2x2ZShfZGVmYXVsdFNwZWNpZmljYXRpb25VcmkpOwogICAgYXJndW1lbnRzID0gPFN0cmluZz5bJy0tbGlicmFyaWVzLXNwZWM9JHtsaWJyYXJpZXNKc29uLnRvRmlsZVBhdGgoKX0nXQogICAgICAuLmFkZEFsbChhcmd1bWVudHMpOwogIH0KICByZXR1cm4gY29tcGlsZShhcmd1bWVudHMsCiAgICAgIGtlcm5lbEluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZToga2VybmVsSW5pdGlhbGl6ZWRDb21waWxlclN0YXRlKTsKfQoKdm9pZCBoZWxwKCkgewogIC8vIFRoaXMgbWVzc2FnZSBzaG91bGQgYmUgbm8gbG9uZ2VyIHRoYW4gMjAgbGluZXMuIFRoZSBkZWZhdWx0CiAgLy8gdGVybWluYWwgc2l6ZSBub3JtYWxseSA4MHgyNC4gVHdvIGxpbmVzIGFyZSB1c2VkIGZvciB0aGUgcHJvbXB0cwogIC8vIGJlZm9yZSBhbmQgYWZ0ZXIgcnVubmluZyB0aGUgY29tcGlsZXIuIEFub3RoZXIgdHdvIGxpbmVzIG1heSBiZQogIC8vIHVzZWQgdG8gcHJpbnQgYW4gZXJyb3IgbWVzc2FnZS4KICBwcmludCgnJycKVXNhZ2U6IGRhcnQyanMgW29wdGlvbnNdIGRhcnRmaWxlCgpDb21waWxlcyBEYXJ0IHRvIEphdmFTY3JpcHQuCgpDb21tb24gb3B0aW9uczoKICAtbyA8ZmlsZT4gR2VuZXJhdGUgdGhlIG91dHB1dCBpbnRvIDxmaWxlPi4KICAtbSAgICAgICAgR2VuZXJhdGUgbWluaWZpZWQgb3V0cHV0LgogIC1oICAgICAgICBEaXNwbGF5IHRoaXMgbWVzc2FnZSAoYWRkIC12IGZvciBpbmZvcm1hdGlvbiBhYm91dCBhbGwgb3B0aW9ucykuJycnKTsKfQoKdm9pZCB2ZXJib3NlSGVscCgpIHsKICBwcmludChyJycnClVzYWdlOiBkYXJ0MmpzIFtvcHRpb25zXSBkYXJ0ZmlsZQoKQ29tcGlsZXMgRGFydCB0byBKYXZhU2NyaXB0LgoKU3VwcG9ydGVkIG9wdGlvbnM6CiAgLWgsIC9oLCAvPywgLS1oZWxwCiAgICBEaXNwbGF5IHRoaXMgbWVzc2FnZSAoYWRkIC12IGZvciBpbmZvcm1hdGlvbiBhYm91dCBhbGwgb3B0aW9ucykuCgogIC1vIDxmaWxlPiwgLS1vdXQ9PGZpbGU+CiAgICBHZW5lcmF0ZSB0aGUgb3V0cHV0IGludG8gPGZpbGU+LgoKICAtbSwgLS1taW5pZnkKICAgIEdlbmVyYXRlIG1pbmlmaWVkIG91dHB1dC4KCiAgLS1lbmFibGUtYXNzZXJ0cwogICAgRW5hYmxlIGFzc2VydGlvbnMuCgogIC12LCAtLXZlcmJvc2UKICAgIERpc3BsYXkgdmVyYm9zZSBpbmZvcm1hdGlvbi4KCiAgLUQ8bmFtZT49PHZhbHVlPgogICAgRGVmaW5lIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLgoKICAtLXZlcnNpb24KICAgIERpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbi4KCiAgLS1wYWNrYWdlcz08cGF0aD4KICAgIFBhdGggdG8gdGhlIHBhY2thZ2UgcmVzb2x1dGlvbiBjb25maWd1cmF0aW9uIGZpbGUsIHdoaWNoIHN1cHBsaWVzIGEgbWFwcGluZwogICAgb2YgcGFja2FnZSBuYW1lcyB0byBwYXRocy4KCiAgLS1zdXBwcmVzcy13YXJuaW5ncwogICAgRG8gbm90IGRpc3BsYXkgYW55IHdhcm5pbmdzLgoKICAtLWZhdGFsLXdhcm5pbmdzCiAgICBUcmVhdCB3YXJuaW5ncyBhcyBjb21waWxhdGlvbiBlcnJvcnMuCgogIC0tc3VwcHJlc3MtaGludHMKICAgIERvIG5vdCBkaXNwbGF5IGFueSBoaW50cy4KCiAgLS1lbmFibGUtZGlhZ25vc3RpYy1jb2xvcnMKICAgIEFkZCBjb2xvcnMgdG8gZGlhZ25vc3RpYyBtZXNzYWdlcy4KCiAgLS10ZXJzZQogICAgRW1pdCBkaWFnbm9zdGljcyB3aXRob3V0IHN1Z2dlc3Rpb25zIGZvciBob3cgdG8gZ2V0IHJpZCBvZiB0aGUgZGlhZ25vc2VkCiAgICBwcm9ibGVtcy4KCiAgLS1zaG93LXBhY2thZ2Utd2FybmluZ3MKICAgIFNob3cgd2FybmluZ3MgYW5kIGhpbnRzIGdlbmVyYXRlZCBmcm9tIHBhY2thZ2VzLgoKICAtLWNzcAogICAgRGlzYWJsZSBkeW5hbWljIGdlbmVyYXRpb24gb2YgY29kZSBpbiB0aGUgZ2VuZXJhdGVkIG91dHB1dC4gVGhpcyBpcwogICAgbmVjZXNzYXJ5IHRvIHNhdGlzZnkgQ1NQIHJlc3RyaWN0aW9ucyAoc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUC8pLgoKICAtLW5vLXNvdXJjZS1tYXBzCiAgICBEbyBub3QgZ2VuZXJhdGUgYSBzb3VyY2UgbWFwIGZpbGUuCgogIC1PPDAsMSwyLDMsND4KICAgIENvbnRyb2xzIG9wdGltaXphdGlvbnMgdGhhdCBjYW4gaGVscCByZWR1Y2UgY29kZS1zaXplIGFuZCBpbXByb3ZlCiAgICBwZXJmb3JtYW5jZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUgZm9yIGRlcGxveW1lbnQuCgogICAgLU8wCiAgICAgICBEaXNhYmxlcyBhbGwgb3B0aW1pemF0aW9ucy4gRXF1aXZhbGVudCB0byBjYWxsaW5nIGRhcnQyanMgd2l0aCB0aGVzZQogICAgICAgZXh0cmEgZmxhZ3M6CiAgICAgICAgLS1kaXNhYmxlLWlubGluaW5nCiAgICAgICAgLS1kaXNhYmxlLXR5cGUtaW5mZXJlbmNlCiAgICAgICAgLS1kaXNhYmxlLXJ0aS1vcHRpbWl6YXRpb25zCgoKICAgICAgIFNvbWUgb3B0aW1pemF0aW9ucyBjYW5ub3QgYmUgZGlzc2FibGVkIGF0IHRoaXMgdGltZSwgYXMgd2UgYWRkIHRoZSBvcHRpb24KICAgICAgIHRvIGRpc2FibGUgdGhlbSwgdGhleSB3aWxsIGJlIGFkZGVkIGhlcmUgYXMgd2VsbC4KCiAgICAtTzEKICAgICAgIEVuYWJsZXMgZGVmYXVsdCBvcHRpbWl6YXRpb25zLiBFcXVpdmFsZW50IHRvIGNhbGxpbmcgZGFydDJqcyB3aXRoIG5vCiAgICAgICBleHRyYSBmbGFncy4KCiAgICAtTzIKICAgICAgIEVuYWJsZXMgb3B0aW1pemF0aW9ucyB0aGF0IHJlc3BlY3QgdGhlIGxhbmd1YWdlIHNlbWFudGljcyBhbmQgYXJlIHNhZmUKICAgICAgIGZvciBhbGwgcHJvZ3JhbXMuIEl0IGhvd2V2ZXIgY2hhbmdlcyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHR5cGVzLAogICAgICAgd2hpY2ggd2lsbCBubyBsb25nZXIgYmUgY29uc2lzdGVudCB3aXRoIHRoZSBEYXJ0IFZNIG9yIEREQy4KCiAgICAgICBFcXVpdmFsZW50IHRvIGNhbGxpbmcgZGFydDJqcyB3aXRoIHRoZXNlIGV4dHJhIGZsYWdzOgogICAgICAgIC0tbWluaWZ5CiAgICAgICAgLS1sYXgtcnVudGltZS10eXBlLXRvLXN0cmluZwoKICAgIC1PMwogICAgICAgRW5hYmxlcyBvcHRpbWl6YXRpb25zIHRoYXQgcmVzcGVjdCB0aGUgbGFuZ3VhZ2Ugc2VtYW50aWNzIG9ubHkgb24KICAgICAgIHByb2dyYW1zIHRoYXQgZG9uJ3QgZXZlciB0aHJvdyBhbnkgc3VidHlwZSBvZiBgRXJyb3JgLiAgVGhlc2UKICAgICAgIG9wdGltaXphdGlvbnMgaW1wcm92ZSB0aGUgZ2VuZXJhdGVkIGNvZGUsIGJ1dCB0aGV5IG1heSBjYXVzZSBwcm9ncmFtcyB0bwogICAgICAgYmVoYXZlIHVuZXhwZWN0ZWRseSBpZiB0aGlzIGFzc3VtcHRpb24gaXMgbm90IG1ldC4gIFRvIHVzZSB0aGlzCiAgICAgICBvcHRpb24sIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBwcm9wZXJseSB0ZXN0IHlvdXIgYXBwbGljYXRpb24gZmlyc3QKICAgICAgIHdpdGhvdXQgaXQsIGFuZCBlbnN1cmUgdGhhdCBubyBzdWJ0eXBlIG9mIGBFcnJvcmAgKHN1Y2ggYXMgYFR5cGVFcnJvcmApCiAgICAgICBpcyBldmVyIHRocm93bi4KCiAgICAgICBFcXVpdmFsZW50IHRvIGNhbGxpbmcgZGFydDJqcyB3aXRoIHRoZXNlIGV4dHJhIGZsYWdzOgogICAgICAgICAtTzIKICAgICAgICAgLS1vbWl0LWltcGxpY2l0LWNoZWNrcwoKICAgIC1PNAogICAgICAgRW5hYmxlcyBtb3JlIGFnZ3Jlc3NpdmUgb3B0aW1pemF0aW9ucyB0aGFuIC1PMywgYnV0IHdpdGggdGhlIHNhbWUKICAgICAgIGFzc3VtcHRpb25zLiBUaGVzZSBvcHRpbWl6YXRpb25zIGFyZSBvbiBhIHNlcGFyYXRlIGdyb3VwIGJlY2F1c2UgdGhleQogICAgICAgYXJlIG1vcmUgc3VzY2VwdGlibGUgdG8gdmFyaWF0aW9ucyBpbiBpbnB1dCBkYXRhLiBUbyB1c2UgdGhpcyBvcHRpb24gd2UKICAgICAgIHJlY29tbWVuZCB0byBwYXkgc3BlY2lhbCBhdHRlbnRpb24gdG8gdGVzdCBlZGdlIGNhc2VzIGluIHVzZXIgaW5wdXQuCgogICAgICAgRXF1aXZhbGVudCB0byBjYWxsaW5nIGRhcnQyanMgd2l0aCB0aGVzZSBleHRyYSBmbGFnczoKICAgICAgICAgLU8zCiAgICAgICAgIC0tdHJ1c3QtcHJpbWl0aXZlcwoKICAgIFdoaWxlIHNvbWUgb2YgdGhlIGluZGl2aWR1YWwgb3B0aW1pemF0aW9ucyBhbmQgZmxhZ3MgbWF5IGNoYW5nZSB3aXRoIHRpbWUsCiAgICB3ZSBpbnRlbmQgdG8ga2VlcCB0aGUgLU8qIGZsYWdzIHN0YWJsZS4gTmV3IHNhZmUgb3B0aW1pemF0aW9ucyBtYXkgYmUgYWRkZWQKICAgIG9uIGFueSBsZXZlbCwgYW5kIG9wdGltaXphdGlvbnMgdGhhdCBvbmx5IHdvcmsgb24gc29tZSBwcm9ncmFtcyBtYXkgbW92ZSB1cAogICAgZnJvbSBvbmUgbGV2ZWwgdG8gdGhlIG5leHQgKGZvciBpbnN0YW5jZSwgb25jZSBhbHRlcm5hdGl2ZSBzYWZlCiAgICBvcHRpbWl6YXRpb25zIGFyZSBpbXBsZW1lbnRlZCwgYG9taXQtaW1wbGljaXQtY2hlY2tzYCBtYXkgYmUgcmVtb3ZlZCBvciBtYXkKICAgIG1vdmUgdG8gdGhlIE80IGxldmVsKS4KClRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbCBvcHRpb25zIGFyZSBpbmNsdWRlZCBpbiBzb21lIG9mIHRoZSAtTyBvcHRpbWl6YXRpb24KbGV2ZWxzIGFib3ZlLiBUaGV5IGhlbHAgcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBnZW5lcmF0ZWQgY29kZSwgYnV0IHRoZXkgbWF5CmNhdXNlIHByb2dyYW1zIHRvIGJlaGF2ZSB1bmV4cGVjdGVkbHkgaWYgYXNzdW1wdGlvbnMgYXJlIG5vdCBtZXQuIE9ubHkgdHVybiBvbgp0aGVzZSBmbGFncyBpZiB5b3UgaGF2ZSBlbm91Z2ggdGVzdCBjb3ZlcmFnZSB0byBlbnN1cmUgdGhleSBhcmUgc2FmZSB0byB1c2U6CgogIC0tb21pdC1pbXBsaWNpdC1jaGVja3MKICAgIE9taXQgaW1wbGljaXQgcnVudGltZSBjaGVja3MsIHN1Y2ggYXMgcGFyYW1ldGVyIGNoZWNrcyBhbmQgaW1wbGljaXQKICAgIGRvd25jYXN0cy4gVGhlc2UgY2hlY2tzIGFyZSBpbmNsdWRlZCBieSBkZWZhdWx0IGluIERhcnQgMi4wLiBCeQogICAgdXNpbmcgdGhpcyBmbGFnIHRoZSBjaGVja3MgYXJlIHJlbW92ZWQsIGhvd2V2ZXIgdGhlIGNvbXBpbGVyIHdpbGwgYXNzdW1lCiAgICB0aGF0IGFsbCBzdWNoIGNoZWNrcyB3ZXJlIHZhbGlkIGFuZCBtYXkgdXNlIHRoaXMgaW5mb3JtYXRpb24gZm9yCiAgICBvcHRpbWl6YXRpb25zLiBVc2UgdGhpcyBvcHRpb24gb25seSBpZiB5b3UgaGF2ZSBlbm91Z2ggdGVzdGluZyB0byBlbnN1cmUKICAgIHRoYXQgeW91ciBwcm9ncmFtIHdvcmtzIHdpdGggdGhlIGNoZWNrcy4KCiAgLS10cnVzdC1wcmltaXRpdmVzCiAgICBBc3N1bWUgdGhhdCBvcGVyYXRpb25zIG9uIG51bWJlcnMsIHN0cmluZ3MsIGFuZCBsaXN0cyBoYXZlIHZhbGlkIGlucHV0cy4KICAgIFRoaXMgb3B0aW9uIGFsbG93cyB0aGUgY29tcGlsZXIgdG8gZHJvcCBydW50aW1lIGNoZWNrcyBmb3IgdGhvc2Ugb3BlcmF0aW9ucy4KICAgIE5vdGU6IGEgd2VsbC10eXBlZCBwcm9ncmFtIGlzIG5vdCBndWFyYW50ZWVkIHRvIGhhdmUgdmFsaWQgaW5wdXRzLiBGb3IKICAgIGV4YW1wbGUsIGFuIGludCBpbmRleCBhcmd1bWVudCBtYXkgYmUgbnVsbCBvciBvdXQgb2YgcmFuZ2UuCgogIC0tbGF4LXJ1bnRpbWUtdHlwZS10by1zdHJpbmcKICAgIE9taXRzIHJlaWZpZWQgY2xhc3MgdHlwZSBhcmd1bWVudHMgd2hlbiB0aGVzZSBhcmUgb25seSBuZWVkZWQgZm9yIGB0b1N0cmluZ2AKICAgIG9uIGBydW50aW1lVHlwZWAuIFRoaXMgaXMgdXNlZnVsIGlmIGBydW50aW1lVHlwZS50b1N0cmluZygpYCBpcyBvbmx5IHVzZWQKICAgIGZvciBkZWJ1Z2dpbmcuIE5vdGUgdGhhdCBzZW1hbnRpY3Mgb2Ygb3RoZXIgdXNlcyBvZiBgLnJ1bnRpbWVUeXBlYCwgZm9yCiAgICBpbnN0YW5jZSBgYS5ydW50aW1lVHlwZSA9PSBiLnJ1bnRpbWVUeXBlYCwgaXMgbm90IGFmZmVjdGVkIGJ5IHRoaXMgZmxhZy4KClRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgb25seSB1c2VkIGZvciBjb21waWxlciBkZXZlbG9wbWVudCBhbmQgbWF5CmJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbjoKCiAgLS10aHJvdy1vbi1lcnJvcgogICAgVGhyb3cgYW4gZXhjZXB0aW9uIGlmIGEgY29tcGlsZS10aW1lIGVycm9yIGlzIGRldGVjdGVkLgoKICAtLWxpYnJhcmllcy1zcGVjPTxmaWxlPgogICAgQSAuanNvbiBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpYnJhcmllcyBzcGVjaWZpY2F0aW9uIGZvciBkYXJ0MmpzLgoKICAtLWFsbG93LW1vY2stY29tcGlsYXRpb24KICAgIERvIG5vdCBnZW5lcmF0ZSBhIGNhbGwgdG8gbWFpbiBpZiBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZwogICAgbGlicmFyaWVzIGFyZSB1c2VkOiBkYXJ0OmRvbSwgZGFydDpodG1sIGRhcnQ6aW8uCgogIC0tZGlzYWJsZS1uYXRpdmUtbGl2ZS10eXBlLWFuYWx5c2lzCiAgICBEaXNhYmxlIHRoZSBvcHRpbWl6YXRpb24gdGhhdCByZW1vdmVzIHVudXNlZCBuYXRpdmUgdHlwZXMgZnJvbSBkYXJ0Omh0bWwKICAgIGFuZCByZWxhdGVkIGxpYnJhcmllcy4KCiAgLS1zZXJ2ZXItbW9kZQogICAgQ29tcGlsZSB3aXRoIHNlcnZlciBzdXBwb3J0LiBUaGUgY29tcGlsZXIgd2lsbCB1c2UgYSBsaWJyYXJ5IHNwZWNpZmljYXRpb24KICAgIHRoYXQgZGlzYWJsZXMgZGFydDpodG1sIGJ1dCBzdXBwb3J0cyBkYXJ0OmpzIGluIGNvbmRpdGlvbmFsIGltcG9ydHMuCgogIC0tY2F0ZWdvcmllcz08Y2F0ZWdvcmllcz4KICAgIChkZXByZWNhdGVkKQogICAgVXNlICctLXNlcnZlci1tb2RlJyBpbnN0ZWFkIG9mICctLWNhdGVnb3JpZXM9U2VydmVyJy4gQWxsIG90aGVyIGNhdGVnb3J5CiAgICB2YWx1ZXMgaGF2ZSBubyBlZmZlY3Qgb24gdGhlIGNvbXBpbGVyIGJlaGF2aW9yLgoKICAtLWRlZmVycmVkLW1hcD08ZmlsZT4KICAgIEdlbmVyYXRlcyBhIGpzb24gZmlsZSB3aXRoIGEgbWFwcGluZyBmcm9tIGVhY2ggZGVmZXJyZWQgaW1wb3J0IHRvIGEgbGlzdCBvZgogICAgdGhlIHBhcnQuanMgZmlsZXMgdGhhdCB3aWxsIGJlIGxvYWRlZC4KCiAgLS1kdW1wLWluZm9bPTxmb3JtYXQ+XQogICAgR2VuZXJhdGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBnZW5lcmF0ZWQgY29kZS4gJ2Zvcm1hdCcgY2FuIGJlIGVpdGhlcgogICAgJ2pzb24nIG9yICdiaW5hcnknLgogICAgWW91IGNhbiBpbnNwZWN0IHRoZSBnZW5lcmF0ZWQgZGF0YSB1c2luZyB0b29scyBmcm9tICdwYWNrYWdlOmRhcnQyanNfaW5mbycuCgogIC0tZ2VuZXJhdGUtY29kZS13aXRoLWNvbXBpbGUtdGltZS1lcnJvcnMKICAgIEdlbmVyYXRlcyBvdXRwdXQgZXZlbiBpZiB0aGUgcHJvZ3JhbSBjb250YWlucyBjb21waWxlLXRpbWUgZXJyb3JzLiBVc2UgdGhlCiAgICBleGl0IGNvZGUgdG8gZGV0ZXJtaW5lIGlmIGNvbXBpbGF0aW9uIGZhaWxlZC4KCiAgLS1uby1mcmVxdWVuY3ktYmFzZWQtbWluaWZpY2F0aW9uCiAgICBFeHBlcmltZW50YWwuICBEaXNhYmxlZCB0aGUgbmV3IGZyZXF1ZW5jeSBiYXNlZCBtaW5pZnlpbmcgbmFtZXIgYW5kIHVzZSB0aGUKICAgIG9sZCBuYW1lciBpbnN0ZWFkLgonJycKICAgICAgLnRyaW0oKSk7Cn0KCnZvaWQgaGVscEFuZEV4aXQoYm9vbCB3YW50SGVscCwgYm9vbCB3YW50VmVyc2lvbiwgYm9vbCB2ZXJib3NlKSB7CiAgaWYgKHdhbnRWZXJzaW9uKSB7CiAgICB2YXIgdmVyc2lvbiA9IChCVUlMRF9JRCA9PSBudWxsKSA/ICc8bm9uLVNESyBidWlsZD4nIDogQlVJTERfSUQ7CiAgICBwcmludCgnRGFydC10by1KYXZhU2NyaXB0IGNvbXBpbGVyIChkYXJ0MmpzKSB2ZXJzaW9uOiAkdmVyc2lvbicpOwogIH0KICBpZiAod2FudEhlbHApIHsKICAgIGlmICh2ZXJib3NlKSB7CiAgICAgIHZlcmJvc2VIZWxwKCk7CiAgICB9IGVsc2UgewogICAgICBoZWxwKCk7CiAgICB9CiAgfQogIGV4aXRGdW5jKDApOwp9Cgp2b2lkIGhlbHBBbmRGYWlsKFN0cmluZyBtZXNzYWdlKSB7CiAgaGVscCgpOwogIHByaW50KCcnKTsKICBmYWlsKG1lc3NhZ2UpOwp9Cgp2b2lkIG1haW4oTGlzdDxTdHJpbmc+IGFyZ3VtZW50cykgewogIC8vIFNpbmNlIHRoZSBzZGsvYmluL2RhcnQyanMgc2NyaXB0IGFkZHMgaXRzIG93biBhcmd1bWVudHMgaW4gZnJvbnQgb2YKICAvLyB1c2VyLXN1cHBsaWVkIGFyZ3VtZW50cyB3ZSBzZWFyY2ggZm9yICctLWJhdGNoJyBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LgogIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHMubGFzdCA9PSAiLS1iYXRjaCIpIHsKICAgIGJhdGNoTWFpbihhcmd1bWVudHMuc3VibGlzdCgwLCBhcmd1bWVudHMubGVuZ3RoIC0gMSkpOwogICAgcmV0dXJuOwogIH0KICBpbnRlcm5hbE1haW4oYXJndW1lbnRzKTsKfQoKdHlwZWRlZiB2b2lkIEV4aXRGdW5jKGludCBleGl0Q29kZSk7CnR5cGVkZWYgRnV0dXJlPGFwaS5Db21waWxhdGlvblJlc3VsdD4gQ29tcGlsZUZ1bmMoCiAgICBDb21waWxlck9wdGlvbnMgY29tcGlsZXJPcHRpb25zLAogICAgYXBpLkNvbXBpbGVySW5wdXQgY29tcGlsZXJJbnB1dCwKICAgIGFwaS5Db21waWxlckRpYWdub3N0aWNzIGNvbXBpbGVyRGlhZ25vc3RpY3MsCiAgICBhcGkuQ29tcGlsZXJPdXRwdXQgY29tcGlsZXJPdXRwdXQpOwoKRXhpdEZ1bmMgZXhpdEZ1bmMgPSBleGl0OwpDb21waWxlRnVuYyBjb21waWxlRnVuYyA9IGFwaS5jb21waWxlOwoKLy8vIElmIGB0cnVlYCBhICcuZGVwcycgZmlsZSB3aWxsIGJlIGdlbmVyYXRlZCBhZnRlciBjb21waWxhdGlvbi4KLy8vCi8vLyBTZXQgdGhpcyB0byBgZmFsc2VgIGluIGVuZC10by1lbmQgdGVzdHMgdG8gYXZvaWQgZ2VuZXJhdGluZyAnLmRlcHMnIGZpbGVzLgpib29sIGVuYWJsZVdyaXRlU3RyaW5nID0gdHJ1ZTsKCkZ1dHVyZTxhcGkuQ29tcGlsYXRpb25SZXN1bHQ+IGludGVybmFsTWFpbihMaXN0PFN0cmluZz4gYXJndW1lbnRzLAogICAge2ZlLkluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZSBrZXJuZWxJbml0aWFsaXplZENvbXBpbGVyU3RhdGV9KSB7CiAgRnV0dXJlPGFwaS5Db21waWxhdGlvblJlc3VsdD4gb25FcnJvcihleGNlcHRpb24sIHRyYWNlKSB7CiAgICAvLyBJZiB3ZSBhcmUgYWxyZWFkeSB0cnlpbmcgdG8gZXhpdCwganVzdCBjb250aW51ZSBleGl0aW5nLgogICAgaWYgKGV4Y2VwdGlvbiA9PSBfRVhJVF9TSUdOQUwpIHRocm93IGV4Y2VwdGlvbjsKCiAgICB0cnkgewogICAgICBwcmludCgnVGhlIGNvbXBpbGVyIGNyYXNoZWQ6ICRleGNlcHRpb24nKTsKICAgIH0gY2F0Y2ggKGlnbm9yZWQpIHsKICAgICAgcHJpbnQoJ1RoZSBjb21waWxlciBjcmFzaGVkOiBlcnJvciB3aGlsZSBwcmludGluZyBleGNlcHRpb24nKTsKICAgIH0KCiAgICB0cnkgewogICAgICBpZiAodHJhY2UgIT0gbnVsbCkgewogICAgICAgIHByaW50KHRyYWNlKTsKICAgICAgfQogICAgfSBmaW5hbGx5IHsKICAgICAgZXhpdEZ1bmMoMjUzKTsgLy8gMjUzIGlzIHJlY29nbml6ZWQgYXMgYSBjcmFzaCBieSBvdXIgdGVzdCBzY3JpcHRzLgogICAgfQogICAgcmV0dXJuIG5ldyBGdXR1cmUuZXJyb3IoZXhjZXB0aW9uLCB0cmFjZSk7CiAgfQoKICB0cnkgewogICAgcmV0dXJuIGNvbXBpbGVyTWFpbihhcmd1bWVudHMsCiAgICAgICAgICAgIGtlcm5lbEluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZToga2VybmVsSW5pdGlhbGl6ZWRDb21waWxlclN0YXRlKQogICAgICAgIC5jYXRjaEVycm9yKG9uRXJyb3IpOwogIH0gY2F0Y2ggKGV4Y2VwdGlvbiwgdHJhY2UpIHsKICAgIHJldHVybiBvbkVycm9yKGV4Y2VwdGlvbiwgdHJhY2UpOwogIH0KfQoKY2xhc3MgX0V4aXRTaWduYWwgewogIGNvbnN0IF9FeGl0U2lnbmFsKCk7Cn0KCmNvbnN0IF9FWElUX1NJR05BTCA9IGNvbnN0IF9FeGl0U2lnbmFsKCk7Cgp2b2lkIGJhdGNoTWFpbihMaXN0PFN0cmluZz4gYmF0Y2hBcmd1bWVudHMpIHsKICBpbnQgZXhpdENvZGU7CiAgZXhpdEZ1bmMgPSAoZXJyb3JDb2RlKSB7CiAgICAvLyBTaW5jZSB3ZSBvbmx5IHRocm93IGFub3RoZXIgcGFydCBvZiB0aGUgY29tcGlsZXIgbWlnaHQgaW50ZXJjZXB0IG91cgogICAgLy8gZXhjZXB0aW9uIGFuZCB0cnkgdG8gZXhpdCB3aXRoIGEgZGlmZmVyZW50IGNvZGUuCiAgICBpZiAoZXhpdENvZGUgPT0gMCkgewogICAgICBleGl0Q29kZSA9IGVycm9yQ29kZTsKICAgIH0KICAgIHRocm93IF9FWElUX1NJR05BTDsKICB9OwoKICB2YXIgc3RyZWFtID0gc3RkaW4udHJhbnNmb3JtKHV0ZjguZGVjb2RlcikudHJhbnNmb3JtKG5ldyBMaW5lU3BsaXR0ZXIoKSk7CiAgdmFyIHN1YnNjcmlwdGlvbjsKICBmZS5Jbml0aWFsaXplZENvbXBpbGVyU3RhdGUga2VybmVsSW5pdGlhbGl6ZWRDb21waWxlclN0YXRlOwogIHN1YnNjcmlwdGlvbiA9IHN0cmVhbS5saXN0ZW4oKGxpbmUpIHsKICAgIG5ldyBGdXR1cmUuc3luYygoKSB7CiAgICAgIHN1YnNjcmlwdGlvbi5wYXVzZSgpOwogICAgICBleGl0Q29kZSA9IDA7CiAgICAgIGlmIChsaW5lID09IG51bGwpIGV4aXQoMCk7CiAgICAgIExpc3Q8U3RyaW5nPiBhcmdzID0gPFN0cmluZz5bXTsKICAgICAgYXJncy5hZGRBbGwoYmF0Y2hBcmd1bWVudHMpOwogICAgICBhcmdzLmFkZEFsbChzcGxpdExpbmUobGluZSwgd2luZG93czogUGxhdGZvcm0uaXNXaW5kb3dzKSk7CiAgICAgIHJldHVybiBpbnRlcm5hbE1haW4oYXJncywKICAgICAgICAgIGtlcm5lbEluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZToga2VybmVsSW5pdGlhbGl6ZWRDb21waWxlclN0YXRlKTsKICAgIH0pLmNhdGNoRXJyb3IoKGV4Y2VwdGlvbiwgdHJhY2UpIHsKICAgICAgaWYgKCFpZGVudGljYWwoZXhjZXB0aW9uLCBfRVhJVF9TSUdOQUwpKSB7CiAgICAgICAgZXhpdENvZGUgPSAyNTM7CiAgICAgIH0KICAgIH0pLnRoZW4oKGFwaS5Db21waWxhdGlvblJlc3VsdCByZXN1bHQpIHsKICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CiAgICAgICAga2VybmVsSW5pdGlhbGl6ZWRDb21waWxlclN0YXRlID0gcmVzdWx0Lmtlcm5lbEluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZTsKICAgICAgfQogICAgfSkud2hlbkNvbXBsZXRlKCgpIHsKICAgICAgLy8gVGhlIHRlc3RpbmcgZnJhbWV3b3JrIHdhaXRzIGZvciBhIHN0YXR1cyBsaW5lIG9uIHN0ZG91dCBhbmQKICAgICAgLy8gc3RkZXJyIGJlZm9yZSBtb3ZpbmcgdG8gdGhlIG5leHQgdGVzdC4KICAgICAgaWYgKGV4aXRDb2RlID09IDApIHsKICAgICAgICBwcmludCgiPj4+IFRFU1QgT0siKTsKICAgICAgfSBlbHNlIGlmIChleGl0Q29kZSA9PSAyNTMpIHsKICAgICAgICBwcmludCgiPj4+IFRFU1QgQ1JBU0giKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwcmludCgiPj4+IFRFU1QgRkFJTCIpOwogICAgICB9CiAgICAgIHN0ZGVyci53cml0ZWxuKCI+Pj4gRU9GIFNUREVSUiIpOwogICAgICBzdWJzY3JpcHRpb24ucmVzdW1lKCk7CiAgICB9KTsKICB9KTsKfQoKZW51bSBDb21waWxhdGlvblN0cmF0ZWd5IHsgZGlyZWN0LCB0b0tlcm5lbCwgdG9EYXRhLCBmcm9tRGF0YSB9CoQXAE5OPAEZASEvRSQBQAEmIxksJCEfMwFOLAEwBE0nBFEYAUZGDiYBFhgeIAEaJAQBTgIBKARIM01GREcTKTAEDwIBQD0/AgFJRh0sIwQ/AS4JISkwMTAiLSklESQKGAgGNwQCAS8BOUQyLiI2IAsUExQbHBotGRwlHBojEBUZFRIVIBg/SAE+KAEaKQQBNSBNBAEpQwQBKxRNBAEvHBElIz0IIA0yBjsEAS86M0gyDgYfBAEoLDITSjgGBAEeQDcEASgvNwQBND8WIQQBM04EARcUHgQBMiEEASkYGwQBKykyNB8EAShFURhQSSUlDRFOBgQBLhdMBAEmPUAGJkwGOAQBLjY8RkEEASU4BAEnP0AGJ00GNgQBJiFODgYyHQ4GRDIEAS0ZTR0oIQYEAS04LB0SHBESEhsREjMREiUREUAIBgQBJzI4S0IcHQg5PxkdCDYXSBg1REgyNEE6SkxOUTJATDVBOEBFMjQ5NTscCDobCD85OUw7SUE6QTg9OThJOTY7P0BJQjE5PE5OP0BGREY/MTk+N0JCATtIIUI3RjZOTT48NAEeNUpNJkhPAUFGP0kBMzQxMggwMAcFASQBOiQcOAs2BAFGGSkEHjMEIz0EHjMEGy0EHjMEASMZUEcEASxJSgQBHzcEASFDBAEbLAQeJjgEAS1NGgQBNkoEASQBISUyDSc0Ig0lND45DScyRDcNBB0oLwEyPDwBSB0jBhFPIydDIj1QGk9IHUcBGk4hTTw2UUcrN0g+DAoPKUNAGk9KRzQcQ0APJ0NAHE9IRzQcQxxMMjEPKUMiPVAaSkgdRwEaTiFNPDZRRys3SD4MCg8GARMEATUBLEM8KhogJCBGLRZNHgIBS0QaUEZPBA8CAVArRjIPMCwrBA8CARERGgw9AgEpIh4tBEgeFAIBHCNRCx4EDwIBQ0pCIiY4BkJLGwQcRwIBDkFGRSUMIgEdARAtJlICARUNIgEdARMVRQEaJQEPHgETFwEQIQETJAEMIQEUUB8BFiEBEyoBEx4BHScBCk0OARo1AQhISwETJwEQRjYBCEwUGyEkAQFROQEITBQBCE5QQwE9ESUBCElFUEdKTxcBPQ0gAQhJTU9MAT0NHAFPUFBEUBsBTUxPTQEZSERNRU0tARVNUUtAAR9RTkxNAUUgARM8ARpFARs+NQEmTRsBEE9JARwRTTQBGFArARlLGFABK08yASRQFwQQAgFCFUVGBBITFQ0OBgQPAgEjCg0RAgEkSU09OwwEGwIBJTMlJTEoARonAUIETx8BQ0Q8QDQBCjEYRQYBChsWCBBKBi8EAQgjTB4fJgQCARQXAgEqAS4QG0w4GRwGGAUBTBQ+KBkcFCEmI0EgSycxGAgtHFAIGUUwGx4kIQ8gCCgdCAYCAUABIXBhY2thZ2U6Y29tcGlsZXIvc3JjL2RhcnQyanMuZGFydDhzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvYXBpX3Vuc3RhYmxlL2RhcnQyanMuZGFydJx8Ly8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDphc3luYycgc2hvdyBGdXR1cmU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2tlcm5lbC5kYXJ0JyBzaG93IENvbXBvbmVudDsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdGFyZ2V0L3RhcmdldHMuZGFydCcgc2hvdyBUYXJnZXQ7CgppbXBvcnQgJy4uL2FwaV9wcm90b3R5cGUvY29tcGlsZXJfb3B0aW9ucy5kYXJ0JyBzaG93IENvbXBpbGVyT3B0aW9uczsKCmltcG9ydCAnLi4vYXBpX3Byb3RvdHlwZS9kaWFnbm9zdGljX21lc3NhZ2UuZGFydCcgc2hvdyBEaWFnbm9zdGljTWVzc2FnZUhhbmRsZXI7CgppbXBvcnQgJy4uL2FwaV9wcm90b3R5cGUvZXhwZXJpbWVudGFsX2ZsYWdzLmRhcnQnIHNob3cgRXhwZXJpbWVudGFsRmxhZzsKCmltcG9ydCAnLi4vYXBpX3Byb3RvdHlwZS9maWxlX3N5c3RlbS5kYXJ0JyBzaG93IEZpbGVTeXN0ZW07CgppbXBvcnQgJy4uL2Jhc2UvcHJvY2Vzc2VkX29wdGlvbnMuZGFydCcgc2hvdyBQcm9jZXNzZWRPcHRpb25zOwoKaW1wb3J0ICcuLi9iYXNlL2xpYnJhcmllc19zcGVjaWZpY2F0aW9uLmRhcnQnIHNob3cgTGlicmFyaWVzU3BlY2lmaWNhdGlvbjsKCmltcG9ydCAnLi4vZmFzdGEvY29tcGlsZXJfY29udGV4dC5kYXJ0JyBzaG93IENvbXBpbGVyQ29udGV4dDsKCmltcG9ydCAnLi4vZmFzdGEvZmFzdGFfY29kZXMuZGFydCcgc2hvdyBtZXNzYWdlTWlzc2luZ01haW47CgppbXBvcnQgJy4uL2Zhc3RhL3NldmVyaXR5LmRhcnQnIHNob3cgU2V2ZXJpdHk7CgppbXBvcnQgJy4uL2tlcm5lbF9nZW5lcmF0b3JfaW1wbC5kYXJ0JyBzaG93IGdlbmVyYXRlS2VybmVsSW50ZXJuYWw7CgppbXBvcnQgJy4uL2Zhc3RhL3NjYW5uZXIuZGFydCcgc2hvdyBFcnJvclRva2VuLCBTdHJpbmdUb2tlbiwgVG9rZW47CgppbXBvcnQgJ2NvbXBpbGVyX3N0YXRlLmRhcnQnIHNob3cgSW5pdGlhbGl6ZWRDb21waWxlclN0YXRlOwoKZXhwb3J0ICcuLi9hcGlfcHJvdG90eXBlL2NvbXBpbGVyX29wdGlvbnMuZGFydCcKICAgIHNob3cgQ29tcGlsZXJPcHRpb25zLCBwYXJzZUV4cGVyaW1lbnRhbEZsYWdzOwoKZXhwb3J0ICcuLi9hcGlfcHJvdG90eXBlL2RpYWdub3N0aWNfbWVzc2FnZS5kYXJ0JwogICAgc2hvdwogICAgICAgIERpYWdub3N0aWNNZXNzYWdlLAogICAgICAgIGdldE1lc3NhZ2VDaGFyT2Zmc2V0LAogICAgICAgIGdldE1lc3NhZ2VIZWFkZXJUZXh0LAogICAgICAgIGdldE1lc3NhZ2VMZW5ndGgsCiAgICAgICAgZ2V0TWVzc2FnZVJlbGF0ZWRJbmZvcm1hdGlvbiwKICAgICAgICBnZXRNZXNzYWdlVXJpOwoKZXhwb3J0ICcuLi9hcGlfcHJvdG90eXBlL2V4cGVyaW1lbnRhbF9mbGFncy5kYXJ0JwogICAgc2hvdyBkZWZhdWx0RXhwZXJpbWVudGFsRmxhZ3MsIEV4cGVyaW1lbnRhbEZsYWc7CgpleHBvcnQgJy4uL2FwaV9wcm90b3R5cGUvZmlsZV9zeXN0ZW0uZGFydCcKICAgIHNob3cgRmlsZVN5c3RlbSwgRmlsZVN5c3RlbUVudGl0eSwgRmlsZVN5c3RlbUV4Y2VwdGlvbjsKCmV4cG9ydCAnLi4vYXBpX3Byb3RvdHlwZS9rZXJuZWxfZ2VuZXJhdG9yLmRhcnQnIHNob3cga2VybmVsRm9yUHJvZ3JhbTsKCmV4cG9ydCAnLi4vYXBpX3Byb3RvdHlwZS9zdGFuZGFyZF9maWxlX3N5c3RlbS5kYXJ0JyBzaG93IERhdGFGaWxlU3lzdGVtRW50aXR5OwoKZXhwb3J0ICcuLi9jb21wdXRlX3BsYXRmb3JtX2JpbmFyaWVzX2xvY2F0aW9uLmRhcnQnCiAgICBzaG93IGNvbXB1dGVQbGF0Zm9ybUJpbmFyaWVzTG9jYXRpb247CgpleHBvcnQgJy4uL2Zhc3RhL2Zhc3RhX2NvZGVzLmRhcnQnIHNob3cgTG9jYXRlZE1lc3NhZ2U7CgpleHBvcnQgJy4uL2Zhc3RhL2tlcm5lbC9yZWRpcmVjdGluZ19mYWN0b3J5X2JvZHkuZGFydCcKICAgIHNob3cgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keTsKCmV4cG9ydCAnLi4vZmFzdGEvb3BlcmF0b3IuZGFydCcgc2hvdyBvcGVyYXRvckZyb21TdHJpbmc7CgpleHBvcnQgJy4uL2Zhc3RhL3BhcnNlci9hc3luY19tb2RpZmllci5kYXJ0JyBzaG93IEFzeW5jTW9kaWZpZXI7CgpleHBvcnQgJy4uL2Zhc3RhL3NjYW5uZXIuZGFydCcgc2hvdyBpc1VzZXJEZWZpbmFibGVPcGVyYXRvciwgaXNNaW51c09wZXJhdG9yOwoKZXhwb3J0ICcuLi9mYXN0YS9zY2FubmVyL2NoYXJhY3RlcnMuZGFydCcKICAgIHNob3cKICAgICAgICAkJCwKICAgICAgICAkMCwKICAgICAgICAkOSwKICAgICAgICAkQSwKICAgICAgICAkQkFDS1NMQVNILAogICAgICAgICRDUiwKICAgICAgICAkREVMLAogICAgICAgICREUSwKICAgICAgICAkSEFTSCwKICAgICAgICAkTEYsCiAgICAgICAgJExTLAogICAgICAgICRQUywKICAgICAgICAkVEFCLAogICAgICAgICRaLAogICAgICAgICRfLAogICAgICAgICRhLAogICAgICAgICRnLAogICAgICAgICRzLAogICAgICAgICR6OwoKZXhwb3J0ICcuLi9mYXN0YS9zZXZlcml0eS5kYXJ0JyBzaG93IFNldmVyaXR5OwoKZXhwb3J0ICcuLi9mYXN0YS91dGlsL2xpbmsuZGFydCcgc2hvdyBMaW5rLCBMaW5rQnVpbGRlcjsKCmV4cG9ydCAnLi4vZmFzdGEvdXRpbC9saW5rX2ltcGxlbWVudGF0aW9uLmRhcnQnIHNob3cgTGlua0VudHJ5OwoKZXhwb3J0ICcuLi9mYXN0YS91dGlsL3JlbGF0aXZpemUuZGFydCcgc2hvdyByZWxhdGl2aXplVXJpOwoKZXhwb3J0ICdjb21waWxlcl9zdGF0ZS5kYXJ0JyBzaG93IEluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZTsKCnZvaWQgY2xlYXJTdHJpbmdUb2tlbkNhbm9uaWNhbGl6ZXIoKSB7CiAgLy8gVE9ETyhhaGUpOiBXZSBzaG91bGQgYmUgYWJsZSB0byByZW1vdmUgdGhpcy4gRmFzdGEgc2hvdWxkIHRha2UgY2FyZSBvZgogIC8vIGNsZWFyaW5nIHRoZSBjYWNoZSB3aGVuLgogIFN0cmluZ1Rva2VuLmNhbm9uaWNhbGl6ZXIuY2xlYXIoKTsKfQoKSW5pdGlhbGl6ZWRDb21waWxlclN0YXRlIGluaXRpYWxpemVDb21waWxlcigKICAgIEluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZSBvbGRTdGF0ZSwKICAgIFRhcmdldCB0YXJnZXQsCiAgICBVcmkgbGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaSwKICAgIExpc3Q8VXJpPiBsaW5rZWREZXBlbmRlbmNpZXMsCiAgICBVcmkgcGFja2FnZXNGaWxlVXJpLAogICAge0xpc3Q8VXJpPiBkZXBlbmRlbmNpZXMsCiAgICBNYXA8RXhwZXJpbWVudGFsRmxhZywgYm9vbD4gZXhwZXJpbWVudGFsRmxhZ3MsCiAgICBib29sIHZlcmlmeTogZmFsc2UsCiAgICBib29sIGVuYWJsZUFzc2VydHM6IGZhbHNlfSkgewogIGJvb2wgbWFwRXF1YWwoTWFwPEV4cGVyaW1lbnRhbEZsYWcsIGJvb2w+IGEsIE1hcDxFeHBlcmltZW50YWxGbGFnLCBib29sPiBiKSB7CiAgICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgcmV0dXJuIGEgPT0gYjsKICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogICAgZm9yICh2YXIgZmxhZyBpbiBhLmtleXMpIHsKICAgICAgaWYgKCFiLmNvbnRhaW5zS2V5KGZsYWcpIHx8IGFbZmxhZ10gIT0gYltmbGFnXSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBib29sIGxpc3RFcXVhbChMaXN0PFVyaT4gYSwgTGlzdDxVcmk+IGIpIHsKICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgKytpKSB7CiAgICAgIGlmIChhW2ldICE9IGJbaV0pIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgbGlua2VkRGVwZW5kZW5jaWVzLnNvcnQoKGEsIGIpID0+IGEudG9TdHJpbmcoKS5jb21wYXJlVG8oYi50b1N0cmluZygpKSk7CgogIGlmIChvbGRTdGF0ZSAhPSBudWxsICYmCiAgICAgIG9sZFN0YXRlLm9wdGlvbnMucGFja2FnZXNGaWxlVXJpID09IHBhY2thZ2VzRmlsZVVyaSAmJgogICAgICBvbGRTdGF0ZS5vcHRpb25zLmxpYnJhcmllc1NwZWNpZmljYXRpb25VcmkgPT0gbGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaSAmJgogICAgICBsaXN0RXF1YWwob2xkU3RhdGUub3B0aW9ucy5saW5rZWREZXBlbmRlbmNpZXMsIGxpbmtlZERlcGVuZGVuY2llcykgJiYKICAgICAgbWFwRXF1YWwob2xkU3RhdGUub3B0aW9ucy5leHBlcmltZW50YWxGbGFncywgZXhwZXJpbWVudGFsRmxhZ3MpKSB7CiAgICByZXR1cm4gb2xkU3RhdGU7CiAgfQoKICBDb21waWxlck9wdGlvbnMgb3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnMoKQogICAgLi50YXJnZXQgPSB0YXJnZXQKICAgIC4ubGVnYWN5TW9kZSA9IHRhcmdldC5sZWdhY3lNb2RlCiAgICAuLmxpbmtlZERlcGVuZGVuY2llcyA9IGxpbmtlZERlcGVuZGVuY2llcwogICAgLi5saWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpID0gbGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaQogICAgLi5wYWNrYWdlc0ZpbGVVcmkgPSBwYWNrYWdlc0ZpbGVVcmkKICAgIC4uZXhwZXJpbWVudGFsRmxhZ3MgPSBleHBlcmltZW50YWxGbGFncwogICAgLi52ZXJpZnkgPSB2ZXJpZnkKICAgIC4uZW5hYmxlQXNzZXJ0cyA9IGVuYWJsZUFzc2VydHM7CgogIFByb2Nlc3NlZE9wdGlvbnMgcHJvY2Vzc2VkT3B0cyA9IG5ldyBQcm9jZXNzZWRPcHRpb25zKG9wdGlvbnM6IG9wdGlvbnMpOwoKICByZXR1cm4gbmV3IEluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZShvcHRpb25zLCBwcm9jZXNzZWRPcHRzKTsKfQoKRnV0dXJlPENvbXBvbmVudD4gY29tcGlsZSgKICAgIEluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZSBzdGF0ZSwKICAgIGJvb2wgdmVyYm9zZSwKICAgIEZpbGVTeXN0ZW0gZmlsZVN5c3RlbSwKICAgIERpYWdub3N0aWNNZXNzYWdlSGFuZGxlciBvbkRpYWdub3N0aWMsCiAgICBVcmkgaW5wdXQpIGFzeW5jIHsKICBDb21waWxlck9wdGlvbnMgb3B0aW9ucyA9IHN0YXRlLm9wdGlvbnM7CiAgb3B0aW9ucwogICAgLi5vbkRpYWdub3N0aWMgPSBvbkRpYWdub3N0aWMKICAgIC4udmVyYm9zZSA9IHZlcmJvc2UKICAgIC4uZmlsZVN5c3RlbSA9IGZpbGVTeXN0ZW07CgogIFByb2Nlc3NlZE9wdGlvbnMgcHJvY2Vzc2VkT3B0cyA9IHN0YXRlLnByb2Nlc3NlZE9wdHM7CiAgcHJvY2Vzc2VkT3B0cy5pbnB1dHMuY2xlYXIoKTsKICBwcm9jZXNzZWRPcHRzLmlucHV0cy5hZGQoaW5wdXQpOwogIHByb2Nlc3NlZE9wdHMuY2xlYXJGaWxlU3lzdGVtQ2FjaGUoKTsKCiAgdmFyIGNvbXBpbGVyUmVzdWx0ID0gYXdhaXQgQ29tcGlsZXJDb250ZXh0LnJ1bldpdGhPcHRpb25zKHByb2Nlc3NlZE9wdHMsCiAgICAgIChDb21waWxlckNvbnRleHQgY29udGV4dCkgYXN5bmMgewogICAgdmFyIGNvbXBpbGVyUmVzdWx0ID0gYXdhaXQgZ2VuZXJhdGVLZXJuZWxJbnRlcm5hbCgpOwogICAgQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvbXBpbGVyUmVzdWx0Py5jb21wb25lbnQ7CiAgICBpZiAoY29tcG9uZW50ID09IG51bGwpIHJldHVybiBudWxsOwogICAgaWYgKGNvbXBvbmVudC5tYWluTWV0aG9kID09IG51bGwpIHsKICAgICAgY29udGV4dC5vcHRpb25zLnJlcG9ydCgKICAgICAgICAgIG1lc3NhZ2VNaXNzaW5nTWFpbi53aXRoTG9jYXRpb24oaW5wdXQsIC0xLCAwKSwgU2V2ZXJpdHkuZXJyb3IpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBjb21waWxlclJlc3VsdDsKICB9KTsKCiAgLy8gUmVtb3ZlIHRoZXNlIHBhcmFtZXRlcnMgZnJvbSBbb3B0aW9uc10gLSB0aGV5IGFyZSBubyBsb25nZXIgbmVlZGVkIGFuZAogIC8vIHJldGFpbiBzdGF0ZSBmcm9tIHRoZSBwcmV2aW91cyBjb21waWxlLiAoaHR0cDovL2RhcnRidWcuY29tLzMzNzA4KQogIG9wdGlvbnMub25EaWFnbm9zdGljID0gbnVsbDsKICBvcHRpb25zLmZpbGVTeXN0ZW0gPSBudWxsOwogIHJldHVybiBjb21waWxlclJlc3VsdD8uY29tcG9uZW50Owp9CgpPYmplY3QgdG9rZW5Ub1N0cmluZyhPYmplY3QgdmFsdWUpIHsKICAvLyBUT0RPKGFoZSk6IFRoaXMgbWV0aG9kIGlzIG1vc3QgbGlrZWx5IHVubmVjZXNzYXJ5LiBEYXJ0MmpzIGRvZXNuJ3Qgc2VlCiAgLy8gdG9rZW5zIGFueW1vcmUuCiAgaWYgKHZhbHVlIGlzIEVycm9yVG9rZW4pIHsKICAgIC8vIFNob3VsZG4ndCBoYXBwZW4uCiAgICByZXR1cm4gdmFsdWUuYXNzZXJ0aW9uTWVzc2FnZS5tZXNzYWdlOwogIH0gZWxzZSBpZiAodmFsdWUgaXMgVG9rZW4pIHsKICAgIHJldHVybiB2YWx1ZS5sZXhlbWU7CiAgfSBlbHNlIHsKICAgIHJldHVybiB2YWx1ZTsKICB9Cn0KCi8vLyBSZXRyaWV2ZSB0aGUgbmFtZSBvZiB0aGUgbGlicmFyaWVzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSBbdGFyZ2V0XSBhY2NvcmRpbmcKLy8vIHRvIHRoZSBsaWJyYXJpZXMgc3BlY2lmaWNhdGlvbiBbanNvbl0gZmlsZS4KLy8vCi8vLyBEYXJ0MmpzIHVzZXMgdGhlc2UgbmFtZXMgdG8gZGV0ZXJtaW5lIHRoZSB2YWx1ZSBvZiBsaWJyYXJ5IGVudmlyb25tZW50Ci8vLyBjb25zdGFudHMsIHN1Y2ggYXMgYGNvbnN0IGJvb2wuZnJvbUVudmlyb25tZW50KCJkYXJ0LmxpYnJhcnkuaW8iKWAuCi8vIFRPRE8oc2lnbXVuZCk6IHJlZmFjdG9yIGRhcnQyanMgc28gdGhhdCB3ZSBjYW4gcmV0cmlldmUgdGhpcyBkYXRhIGxhdGVyIGluCi8vIHRoZSBjb21waWxhdGlvbiBwaXBlbGluZS4gQXQgdGhhdCBwb2ludCB3ZSBjYW4gZ2V0IGl0IGZyb20gdGhlIENGRQovLyByZXN1bHRzIGRpcmVjdGx5IGFuZCBjb21wbGV0ZWx5IGhpZGUgdGhlIGxpYnJhcmllcyBzcGVjaWZpY2F0aW9uIGZpbGUgZnJvbQovLyBkYXJ0MmpzLgovLyBUT0RPKHNpZ211bmQpOiBkZWxldGUgYWZ0ZXIgYWxsIGNvbnN0YW50IGV2YWx1YXRpb24gaXMgZG9uZSBpbiB0aGUgQ0ZFLCBhcwovLyB0aGlzIGRhdGEgd2lsbCBubyBsb25nZXIgYmUgbmVlZGVkIG9uIHRoZSBkYXJ0MmpzIHNpZGUuCkl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGVkTGlicmFyeU5hbWVzKAogICAgVXJpIGxpYnJhcmllc1NwZWNpZmljYXRpb25VcmksIFN0cmluZyBqc29uLCBTdHJpbmcgdGFyZ2V0KSB7CiAgcmV0dXJuIExpYnJhcmllc1NwZWNpZmljYXRpb24ucGFyc2UobGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaSwganNvbikKICAgICAgLnNwZWNpZmljYXRpb25Gb3IodGFyZ2V0KQogICAgICAuYWxsTGlicmFyaWVzCiAgICAgIC53aGVyZSgobCkgPT4gbC5pc1N1cHBvcnRlZCkKICAgICAgLm1hcCgobCkgPT4gbC5uYW1lKTsKfQqA5wBOTjwBIQE0ATkBRgFRAUkBPAE/AUsBPgE8AS8BRAFEATwBMDIBMgkbHh4aJhcBMjUBKzwBRwFPATQqATgBNyEBOQFBAU4BKgkMDAwMFA0ODQ8NDQ0ODAwMDAwMAS8BOQFAATsBPAEnTB4lAgEtJxMjIhkdMxgiUC8sH0QGEQQBLSwpJgYRBAFLARo9UUxJFQQBMhYlLjwoLBYlAUsBPwIBGyQSGysXKwoiGB8BOCAjKAFLKDk1KCgeShMGGwYBTEgfHSQCASVMFR0ZKx8ZCxIEAgFQMARLSE5GTgxOOytBRyAUIxsCAS9wYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL2RhcnQyanMuZGFydCtzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL2NvbXBpbGVyX25ldy5kYXJ0muIvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIE5ldyBDb21waWxlciBBUEkuIFRoaXMgQVBJIGlzIHVuZGVyIGNvbnN0cnVjdGlvbiwgdXNlIG9ubHkgaW50ZXJuYWxseSBvcgovLy8gaW4gdW5pdHRlc3RzLgoKbGlicmFyeSBjb21waWxlcl9uZXc7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnOwoKaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL2RhcnQyanMuZGFydCcgYXMgZmU7CgppbXBvcnQgJ2NvbXBpbGVyLmRhcnQnIHNob3cgRGlhZ25vc3RpYzsKaW1wb3J0ICdzcmMvYXBpaW1wbC5kYXJ0JzsKaW1wb3J0ICdzcmMvb3B0aW9ucy5kYXJ0JyBzaG93IENvbXBpbGVyT3B0aW9uczsKCmV4cG9ydCAnY29tcGlsZXIuZGFydCcgc2hvdyBEaWFnbm9zdGljOwoKLy8gVW5sZXNzIGV4cGxpY2l0bHkgYWxsb3dlZCwgcGFzc2luZyBgbnVsbGAgZm9yIGFueSBhcmd1bWVudCB0byB0aGUKLy8gbWV0aG9kcyBvZiBsaWJyYXJ5IHdpbGwgcmVzdWx0IGluIGFuIEVycm9yIGJlaW5nIHRocm93bi4KCi8vLyBJbnB1dCBraW5kcyB1c2VkIGJ5IFtDb21waWxlcklucHV0LnJlYWRGcm9tVXJpXS4KZW51bSBJbnB1dEtpbmQgewogIC8vLyBEYXRhIGlzIHJlYWQgYXMgVVRGOCBlaXRoZXIgYXMgYSBbU3RyaW5nXSBvciBhIHplcm8tdGVybWluYXRlZAogIC8vLyBgTGlzdDxpbnQ+YC4KICBVVEY4LAoKICAvLy8gRGF0YSBpcyByZWFkIGFzIGJ5dGVzIGluIGEgYExpc3Q8aW50PmAuCiAgYmluYXJ5LAp9CgovLy8gSW50ZXJmYWNlIGZvciBkYXRhIHJlYWQgdGhyb3VnaCBbQ29tcGlsZXJJbnB1dC5yZWFkRnJvbVVyaV0uCmFic3RyYWN0IGNsYXNzIElucHV0PFQ+IHsKICAvLy8gVGhlIFVSSSBmcm9tIHdoaWNoIGRhdGEgd2FzIHJlYWQuCiAgVXJpIGdldCB1cmk7CgogIC8vLyBUaGUgZm9ybWF0IG9mIHRoZSByZWFkIFtkYXRhXS4KICBJbnB1dEtpbmQgZ2V0IGlucHV0S2luZDsKCiAgLy8vIFRoZSByYXcgZGF0YSByZWFkIGZyb20gW3VyaV0uCiAgVCBnZXQgZGF0YTsKfQoKLy8vIEludGVyZmFjZSBmb3IgcHJvdmlkaW5nIHRoZSBjb21waWxlciB3aXRoIGlucHV0LiBUaGF0IGlzLCBEYXJ0IHNvdXJjZSBmaWxlcywKLy8vIHBhY2thZ2UgY29uZmlnIGZpbGVzLCBldGMuCmFic3RyYWN0IGNsYXNzIENvbXBpbGVySW5wdXQgewogIC8vLyBSZXR1cm5zIGEgZnV0dXJlIHRoYXQgY29tcGxldGVzIHRvIHRoZSBzb3VyY2UgY29ycmVzcG9uZGluZyB0byBbdXJpXS4KICAvLy8gSWYgYW4gZXhjZXB0aW9uIG9jY3VycywgdGhlIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCB0aGlzIGV4Y2VwdGlvbi4KICAvLy8KICAvLy8gSWYgW2lucHV0S2luZF0gaXMgYElucHV0S2luZC5VVEY4YCB0aGUgc291cmNlIGNhbiBiZSByZXByZXNlbnRlZCBlaXRoZXIgYXMKICAvLy8gYSB6ZXJvLXRlcm1pbmF0ZWQgYExpc3Q8aW50PmAgb2YgVVRGLTggYnl0ZXMgb3IgYXMgYSBbU3RyaW5nXS4gSWYKICAvLy8gW2lucHV0S2luZF0gaXMgYElucHV0S2luZC5iaW5hcnlgIHRoZSBzb3VyY2UgaXMgYSByZWFkIGEgYExpc3Q8aW50PmAuCiAgLy8vCiAgLy8vIFRoZSBmb2xsb3dpbmcgdGV4dCBpcyBub24tbm9ybWF0aXZlOgogIC8vLwogIC8vLyBJdCBpcyByZWNvbW1lbmRlZCB0byByZXR1cm4gYSBVVEYtOCBlbmNvZGVkIGxpc3Qgb2YgYnl0ZXMgYmVjYXVzZSB0aGUKICAvLy8gc2Nhbm5lciBpcyBtb3JlIGVmZmljaWVudCBpbiB0aGlzIGNhc2UuIEluIGVpdGhlciBjYXNlLCB0aGUgZGF0YSBzdHJ1Y3R1cmUKICAvLy8gaXMgZXhwZWN0ZWQgdG8gaG9sZCBhIHplcm8gZWxlbWVudCBhdCB0aGUgbGFzdCBwb3NpdGlvbi4gSWYgdGhpcyBpcyBub3QKICAvLy8gdGhlIGNhc2UsIHRoZSBlbnRpcmUgZGF0YSBzdHJ1Y3R1cmUgaXMgY29waWVkIGJlZm9yZSBzY2FubmluZy4KICBGdXR1cmU8SW5wdXQ+IHJlYWRGcm9tVXJpKFVyaSB1cmksIHtJbnB1dEtpbmQgaW5wdXRLaW5kOiBJbnB1dEtpbmQuVVRGOH0pOwp9CgovLy8gT3V0cHV0IHR5cGVzIHVzZWQgaW4gYENvbXBpbGVyT3V0cHV0LmNyZWF0ZU91dHB1dFNpbmtgLgplbnVtIE91dHB1dFR5cGUgewogIC8vLyBUaGUgbWFpbiBKYXZhU2NyaXB0IG91dHB1dC4KICBqcywKCiAgLy8vIEEgZGVmZXJyZWQgSmF2YVNjcmlwdCBvdXRwdXQgcGFydC4KICBqc1BhcnQsCgogIC8vLyBBIHNvdXJjZSBtYXAgZm9yIGEgSmF2YVNjcmlwdCBvdXRwdXQuCiAgc291cmNlTWFwLAoKICAvLy8gRHVtcCBpbmZvIG91dHB1dC4KICBkdW1wSW5mbywKCiAgLy8vIERlZmVycmVkIG1hcCBvdXRwdXQuCiAgZGVmZXJyZWRNYXAsCgogIC8vLyBJbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBvdXRwdXQgdXNlZCBmb3IgZGVidWdnaW5nIHRoZSBjb21waWxlci4KICBkZWJ1ZywKfQoKLy8vIFNpbmsgaW50ZXJmYWNlIHVzZWQgZm9yIGdlbmVyYXRpbmcgb3V0cHV0IGZyb20gdGhlIGNvbXBpbGVyLgphYnN0cmFjdCBjbGFzcyBPdXRwdXRTaW5rIHsKICAvLy8gQWRkcyBbdGV4dF0gdG8gdGhlIHNpbmsuCiAgdm9pZCBhZGQoU3RyaW5nIHRleHQpOwoKICAvLy8gQ2xvc2VzIHRoZSBzaW5rLgogIHZvaWQgY2xvc2UoKTsKfQoKLy8vIFNpbmsgaW50ZXJmYWNlIHVzZWQgZm9yIGdlbmVyYXRpbmcgYmluYXJ5IGRhdGEgZnJvbSB0aGUgY29tcGlsZXIuCmFic3RyYWN0IGNsYXNzIEJpbmFyeU91dHB1dFNpbmsgewogIC8vLyBXcml0ZXMgaW5kaWNlcyBbc3RhcnRdIHRvIFtlbmRdIG9mIFtidWZmZXJdIHRvIHRoZSBzaW5rLgogIHZvaWQgd3JpdGUoTGlzdDxpbnQ+IGJ1ZmZlciwgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKTsKCiAgLy8vIENsb3NlcyB0aGUgc2luay4KICB2b2lkIGNsb3NlKCk7Cn0KCi8vLyBJbnRlcmZhY2UgZm9yIHByb2R1Y2luZyBvdXRwdXQgZnJvbSB0aGUgY29tcGlsZXIuIFRoYXQgaXMsIEphdmFTY3JpcHQgdGFyZ2V0Ci8vLyBmaWxlcywgc291cmNlIG1hcCBmaWxlcywgZHVtcCBpbmZvIGZpbGVzLCBldGMuCmFic3RyYWN0IGNsYXNzIENvbXBpbGVyT3V0cHV0IHsKICAvLy8gUmV0dXJucyBhbiBbT3V0cHV0U2lua10gdGhhdCB3aWxsIHNlcnZlIGFzIGNvbXBpbGVyIG91dHB1dCBmb3IgdGhlIGdpdmVuCiAgLy8vIGNvbXBvbmVudC4KICAvLy8KICAvLy8gQ29tcG9uZW50cyBhcmUgaWRlbnRpZmllZCBieSBbbmFtZV0sIFtleHRlbnNpb25dLCBhbmQgW3R5cGVdLiBCeQogIC8vLyBjb252ZW50aW9uLCB0aGUgZW1wdHkgc3RyaW5nIGAiImAgd2lsbCByZXByZXNlbnQgdGhlIG1haW4gb3V0cHV0IG9mIHRoZQogIC8vLyBwcm92aWRlZCBbdHlwZV0uIFtuYW1lXSBhbmQgW2V4dGVuc2lvbl0gYXJlIG90aGVyd2lzZSBzdWdnZXN0aXZlLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlcGxhY2UgW25hbWVdIGFuZCBbZXh0ZW5zaW9uXSB3aXRoIHNvbWV0aGluZyBsaWtlCiAgLy8gW2lkXSBhbmQgW3VyaV0uCiAgT3V0cHV0U2luayBjcmVhdGVPdXRwdXRTaW5rKFN0cmluZyBuYW1lLCBTdHJpbmcgZXh0ZW5zaW9uLCBPdXRwdXRUeXBlIHR5cGUpOwoKICAvLy8gUmV0dXJucyBhbiBbQmluYXJ5T3V0cHV0U2lua10gdGhhdCB3aWxsIHNlcnZlIGFzIGNvbXBpbGVyIG91dHB1dCBmb3IgdGhlCiAgLy8vIGdpdmVuIFVSSS4KICBCaW5hcnlPdXRwdXRTaW5rIGNyZWF0ZUJpbmFyeVNpbmsoVXJpIHVyaSk7Cn0KCi8vLyBJbnRlcmZhY2UgZm9yIHJlY2VpdmluZyBkaWFnbm9zdGljIG1lc3NhZ2UgZnJvbSB0aGUgY29tcGlsZXIuIFRoYXQgaXMsCi8vLyBlcnJvcnMsIHdhcm5pbmdzLCBoaW50cywgZXRjLgphYnN0cmFjdCBjbGFzcyBDb21waWxlckRpYWdub3N0aWNzIHsKICAvLy8gSW52b2tlZCBieSB0aGUgY29tcGlsZXIgdG8gcmVwb3J0IGRpYWdub3N0aWNzLiBJZiBbdXJpXSBpcyBgbnVsbGAsIHNvIGFyZQogIC8vLyBbYmVnaW5dIGFuZCBbZW5kXS4gTm8gb3RoZXIgYXJndW1lbnRzIG1heSBiZSBgbnVsbGAuIElmIFt1cmldIGlzIG5vdAogIC8vLyBgbnVsbGAsIG5laXRoZXIgYXJlIFtiZWdpbl0gYW5kIFtlbmRdLiBbdXJpXSBpbmRpY2F0ZXMgdGhlIGNvbXBpbGF0aW9uCiAgLy8vIHVuaXQgZnJvbSB3aGVyZSB0aGUgZGlhZ25vc3RpYyBvcmlnaW5hdGVzLiBbYmVnaW5dIGFuZCBbZW5kXSBhcmUKICAvLy8gemVyby1iYXNlZCBjaGFyYWN0ZXIgb2Zmc2V0cyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQuCiAgLy8vIFttZXNzYWdlXSBpcyB0aGUgZGlhZ25vc3RpYyBtZXNzYWdlLCBhbmQgW2tpbmRdIGluZGljYXRlcyBpbmRpY2F0ZXMgd2hhdAogIC8vLyBraW5kIG9mIGRpYWdub3N0aWMgaXQgaXMuCiAgLy8vCiAgLy8vIEV4cGVyaW1lbnRhbDogW2NvZGVdIGdpdmVzIGFjY2VzcyB0byBhbiBpZCBmb3IgdGhlIG1lc3NhZ2VzLiBDdXJyZW50bHkgaXQKICAvLy8gaXMgdGhlIFtNZXNzYWdlXSB1c2VkIHRvIGNyZWF0ZSB0aGUgZGlhZ25vc3RpYywgaWYgYXZhaWxhYmxlLCBmcm9tIHdoaWNoCiAgLy8vIHRoZSBbTWVzc2FnZUtpbmRdIGlzIGFjY2Vzc2libGUuCiAgdm9pZCByZXBvcnQoCiAgICAgIHZhciBjb2RlLCBVcmkgdXJpLCBpbnQgYmVnaW4sIGludCBlbmQsIFN0cmluZyB0ZXh0LCBEaWFnbm9zdGljIGtpbmQpOwp9CgovLy8gSW5mb3JtYXRpb24gcmVzdWx0aW5nIGZyb20gdGhlIGNvbXBpbGF0aW9uLgpjbGFzcyBDb21waWxhdGlvblJlc3VsdCB7CiAgLy8vIGB0cnVlYCBpZiB0aGUgY29tcGlsYXRpb24gc3VjY2VlZGVkLCB0aGF0IGlzLCBjb21waWxhdGlvbiBkaWRuJ3QgZmFpbCBkdWUKICAvLy8gdG8gY29tcGlsZS10aW1lIGVycm9ycyBhbmQvb3IgaW50ZXJuYWwgZXJyb3JzLgogIGZpbmFsIGJvb2wgaXNTdWNjZXNzOwoKICAvLy8gVGhlIGNvbXBpbGVyIG9iamVjdCB1c2VkIGZvciB0aGUgY29tcGlsYXRpb24uCiAgLy8vCiAgLy8vIE5vdGU6IFRoZSB0eXBlIG9mIFtjb21waWxlcl0gaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGFuZCBtYXkgdmFyeS4KICAvLy8gVXNlIG9ubHkgZm9yIGRlYnVnZ2luZyBhbmQgdGVzdGluZy4KICBmaW5hbCBjb21waWxlcjsKCiAgLy8vIFNoYXJlZCBzdGF0ZSBiZXR3ZWVuIGNvbXBpbGF0aW9ucy4KICAvLy8KICAvLy8gVGhpcyBpcyB1c2VkIHRvIHNwZWVkIHVwIGJhdGNoIG1vZGUuCiAgZmluYWwgZmUuSW5pdGlhbGl6ZWRDb21waWxlclN0YXRlIGtlcm5lbEluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZTsKCiAgQ29tcGlsYXRpb25SZXN1bHQodGhpcy5jb21waWxlciwKICAgICAge3RoaXMuaXNTdWNjZXNzOiB0cnVlLCB0aGlzLmtlcm5lbEluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZTogbnVsbH0pOwp9CgovLy8gUmV0dXJucyBhIGZ1dHVyZSB0aGF0IGNvbXBsZXRlcyB0byBhIFtDb21waWxhdGlvblJlc3VsdF0gd2hlbiB0aGUgRGFydAovLy8gc291cmNlcyBpbiBbb3B0aW9uc10gaGF2ZSBiZWVuIGNvbXBpbGVkLgovLy8KLy8vIFRoZSBnZW5lcmF0ZWQgY29tcGlsZXIgb3V0cHV0IGlzIG9idGFpbmVkIGJ5IHByb3ZpZGluZyBhIFtjb21waWxlck91dHB1dF0uCi8vLwovLy8gSWYgdGhlIGNvbXBpbGF0aW9uIGZhaWxzLCB0aGUgZnV0dXJlJ3MgYENvbXBpbGF0aW9uUmVzdWx0LmlzU3VjY2Vzc2AgaXMKLy8vIGBmYWxzZWAgYW5kIFtDb21waWxlckRpYWdub3N0aWNzLnJlcG9ydF0gb24gW2NvbXBpbGVyRGlhZ25vc3RpY3NdCi8vLyBpcyBpbnZva2VkIGF0IGxlYXN0IG9uY2Ugd2l0aCBga2luZCA9PSBEaWFnbm9zdGljLkVSUk9SYCBvcgovLy8gYGtpbmQgPT0gRGlhZ25vc3RpYy5DUkFTSGAuCkZ1dHVyZTxDb21waWxhdGlvblJlc3VsdD4gY29tcGlsZSgKICAgIENvbXBpbGVyT3B0aW9ucyBjb21waWxlck9wdGlvbnMsCiAgICBDb21waWxlcklucHV0IGNvbXBpbGVySW5wdXQsCiAgICBDb21waWxlckRpYWdub3N0aWNzIGNvbXBpbGVyRGlhZ25vc3RpY3MsCiAgICBDb21waWxlck91dHB1dCBjb21waWxlck91dHB1dCkgewogIGlmIChjb21waWxlck9wdGlvbnMgPT0gbnVsbCkgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoImNvbXBpbGVyT3B0aW9ucyBtdXN0IGJlIG5vbi1udWxsIik7CiAgfQogIGlmIChjb21waWxlcklucHV0ID09IG51bGwpIHsKICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJjb21waWxlcklucHV0IG11c3QgYmUgbm9uLW51bGwiKTsKICB9CiAgaWYgKGNvbXBpbGVyRGlhZ25vc3RpY3MgPT0gbnVsbCkgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoImNvbXBpbGVyRGlhZ25vc3RpY3MgbXVzdCBiZSBub24tbnVsbCIpOwogIH0KICBpZiAoY29tcGlsZXJPdXRwdXQgPT0gbnVsbCkgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoImNvbXBpbGVyT3V0cHV0IG11c3QgYmUgbm9uLW51bGwiKTsKICB9CgogIENvbXBpbGVySW1wbCBjb21waWxlciA9IG5ldyBDb21waWxlckltcGwoCiAgICAgIGNvbXBpbGVySW5wdXQsIGNvbXBpbGVyT3V0cHV0LCBjb21waWxlckRpYWdub3N0aWNzLCBjb21waWxlck9wdGlvbnMpOwogIHJldHVybiBjb21waWxlci5ydW4oY29tcGlsZXJPcHRpb25zLmVudHJ5UG9pbnQpLnRoZW4oKGJvb2wgc3VjY2VzcykgewogICAgcmV0dXJuIG5ldyBDb21waWxhdGlvblJlc3VsdChjb21waWxlciwKICAgICAgICBpc1N1Y2Nlc3M6IHN1Y2Nlc3MsCiAgICAgICAga2VybmVsSW5pdGlhbGl6ZWRDb21waWxlclN0YXRlOgogICAgICAgICAgICBjb21waWxlci5rZXJuZWxMb2FkZXIuaW5pdGlhbGl6ZWRDb21waWxlclN0YXRlKTsKICB9KTsKfQqAxQBOTjwBTRIBFgEVAUABKBswASgBRTwBNRFFEwgBLgoCAUEaKA8BJRsBJA4CAVEfH0xIBlFITAYrBkxRTkVNAgE8EiIGASkKASwNARgMARsPAUYJAgFBHB8ZARcQAgFGIj86ARcQAgFRMyBPEQZHTkhNFU8BTxEuAgFLIiVQS01HT08gBlBPJw9MAgEwGlA1GAE0Bk0qEgEpBitEASNKAgFLLQRPBExGQCAjJSEtJSFBBB8/BCVFBCBABAEsTEgrHCg9BgIBInBhY2thZ2U6Y29tcGlsZXIvY29tcGlsZXJfbmV3LmRhcnQ2c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvY29tbWFuZGxpbmVfb3B0aW9ucy5kYXJ0mqkvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmNtZGxpbmUub3B0aW9uczsKCi8vLyBDb21tYW5kbGluZSBmbGFncyB1c2VkIGluIGBkYXJ0MmpzLmRhcnRgIGFuZC9vciBgYXBpaW1wbC5kYXJ0YC4KY2xhc3MgRmxhZ3MgewogIHN0YXRpYyBjb25zdCBTdHJpbmcgYWxsb3dNb2NrQ29tcGlsYXRpb24gPSAnLS1hbGxvdy1tb2NrLWNvbXBpbGF0aW9uJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGFsbG93TmF0aXZlRXh0ZW5zaW9ucyA9ICctLWFsbG93LW5hdGl2ZS1leHRlbnNpb25zJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGRpc2FibGVJbmxpbmluZyA9ICctLWRpc2FibGUtaW5saW5pbmcnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgZGlzYWJsZVByb2dyYW1TcGxpdCA9ICctLWRpc2FibGUtcHJvZ3JhbS1zcGxpdCc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBkaXNhYmxlRGlhZ25vc3RpY0NvbG9ycyA9ICctLWRpc2FibGUtZGlhZ25vc3RpYy1jb2xvcnMnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgZGlzYWJsZU5hdGl2ZUxpdmVUeXBlQW5hbHlzaXMgPQogICAgICAnLS1kaXNhYmxlLW5hdGl2ZS1saXZlLXR5cGUtYW5hbHlzaXMnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgdXNlVHJpdmlhbEFic3RyYWN0VmFsdWVEb21haW4gPQogICAgICAnLS11c2UtdHJpdmlhbC1hYnN0cmFjdC12YWx1ZS1kb21haW4nOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgZGlzYWJsZVR5cGVJbmZlcmVuY2UgPSAnLS1kaXNhYmxlLXR5cGUtaW5mZXJlbmNlJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGRpc2FibGVSdGlPcHRpbWl6YXRpb24gPSAnLS1kaXNhYmxlLXJ0aS1vcHRpbWl6YXRpb24nOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgZHVtcEluZm8gPSAnLS1kdW1wLWluZm8nOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgZW5hYmxlQXNzZXJ0TWVzc2FnZSA9ICctLWFzc2VydC1tZXNzYWdlJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGVuYWJsZUNoZWNrZWRNb2RlID0gJy0tZW5hYmxlLWNoZWNrZWQtbW9kZSc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBlbmFibGVBc3NlcnRzID0gJy0tZW5hYmxlLWFzc2VydHMnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgZW5hYmxlRGlhZ25vc3RpY0NvbG9ycyA9ICctLWVuYWJsZS1kaWFnbm9zdGljLWNvbG9ycyc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBleHBlcmltZW50YWxUcmFja0FsbG9jYXRpb25zID0KICAgICAgJy0tZXhwZXJpbWVudGFsLXRyYWNrLWFsbG9jYXRpb25zJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGV4cGVyaW1lbnRhbEFsbG9jYXRpb25zUGF0aCA9CiAgICAgICctLWV4cGVyaW1lbnRhbC1hbGxvY2F0aW9ucy1wYXRoJzsKCiAgLy8gVGVtcG9yYXJ5IGV4cGVyaW1lbnQgZm9yIGNvZGUgZ2VuZXJhdGlvbiBvZiBsb2NhbHMgZm9yIGZyZXF1ZW50bHkgdXNlZAogIC8vICd0aGlzJyBhbmQgY29uc3RhbnRzLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgZXhwZXJpbWVudExvY2FsTmFtZXMgPSAnLS1leHBlcmltZW50LWNvZGUtMSc7CgogIC8vIEV4cGVyaW1lbnRhbGx5IHRyeSB0byBmb3JjZSBwYXJ0LWZpbGUgZnVuY3Rpb25zIHRvIGJlIHNlZW4gYXMgSUlGRXMuCiAgc3RhdGljIGNvbnN0IFN0cmluZyBleHBlcmltZW50U3RhcnR1cEZ1bmN0aW9ucyA9ICctLWV4cGVyaW1lbnQtY29kZS0yJzsKCiAgLy8gRXhwZXJpbWVudGFsbHkgcmVseSBvbiBKYXZhU2NyaXB0IFRvQm9vbGVhbiBjb252ZXJzaW9ucy4KICBzdGF0aWMgY29uc3QgU3RyaW5nIGV4cGVyaW1lbnRUb0Jvb2xlYW4gPSAnLS1leHBlcmltZW50LWNvZGUtMyc7CgogIC8vIEFkZCBpbnN0cnVtZW50YXRpb24gdG8gbG9nIGV2ZXJ5IG1ldGhvZCBjYWxsLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgZXhwZXJpbWVudENhbGxJbnN0cnVtZW50YXRpb24gPQogICAgICAnLS1leHBlcmltZW50LWNhbGwtaW5zdHJ1bWVudGF0aW9uJzsKCiAgc3RhdGljIGNvbnN0IFN0cmluZyBlbmFibGVMYW5ndWFnZUV4cGVyaW1lbnRzID0gJy0tZW5hYmxlLWV4cGVyaW1lbnQnOwoKICBzdGF0aWMgY29uc3QgU3RyaW5nIGZhc3RTdGFydHVwID0gJy0tZmFzdC1zdGFydHVwJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGZhdGFsV2FybmluZ3MgPSAnLS1mYXRhbC13YXJuaW5ncyc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBnZW5lcmF0ZUNvZGVXaXRoQ29tcGlsZVRpbWVFcnJvcnMgPQogICAgICAnLS1nZW5lcmF0ZS1jb2RlLXdpdGgtY29tcGlsZS10aW1lLWVycm9ycyc7CgogIHN0YXRpYyBjb25zdCBTdHJpbmcgcHJldmlld0RhcnQyID0gJy0tcHJldmlldy1kYXJ0LTInOwoKICBzdGF0aWMgY29uc3QgU3RyaW5nIG9taXRJbXBsaWNpdENoZWNrcyA9ICctLW9taXQtaW1wbGljaXQtY2hlY2tzJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIG9taXRBc0Nhc3RzID0gJy0tb21pdC1hcy1jYXN0cyc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBsYXhSdW50aW1lVHlwZVRvU3RyaW5nID0gJy0tbGF4LXJ1bnRpbWUtdHlwZS10by1zdHJpbmcnOwoKICBzdGF0aWMgY29uc3QgU3RyaW5nIHBsYXRmb3JtQmluYXJpZXMgPSAnLS1wbGF0Zm9ybS1iaW5hcmllcz0uKyc7CgogIHN0YXRpYyBjb25zdCBTdHJpbmcgbWluaWZ5ID0gJy0tbWluaWZ5JzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIG5vRnJlcXVlbmN5QmFzZWRNaW5pZmljYXRpb24gPQogICAgICAnLS1uby1mcmVxdWVuY3ktYmFzZWQtbWluaWZpY2F0aW9uJzsKICAvLyBEaXNhYmxlcyBtaW5pZmljYXRpb24gZXZlbiBpZiBlbmFibGVkIGJ5IG90aGVyIG9wdGlvbnMsIGUuZy4gJy1PMicuCiAgc3RhdGljIGNvbnN0IFN0cmluZyBub01pbmlmeSA9ICctLW5vLW1pbmlmeSc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBub1NvdXJjZU1hcHMgPSAnLS1uby1zb3VyY2UtbWFwcyc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBwcmVzZXJ2ZVVyaXMgPSAnLS1wcmVzZXJ2ZS11cmlzJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHNob3dQYWNrYWdlV2FybmluZ3MgPSAnLS1zaG93LXBhY2thZ2Utd2FybmluZ3MnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgc3VwcHJlc3NIaW50cyA9ICctLXN1cHByZXNzLWhpbnRzJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHN1cHByZXNzV2FybmluZ3MgPSAnLS1zdXBwcmVzcy13YXJuaW5ncyc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0ZXJzZSA9ICctLXRlcnNlJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRlc3RNb2RlID0gJy0tdGVzdC1tb2RlJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRydXN0UHJpbWl0aXZlcyA9ICctLXRydXN0LXByaW1pdGl2ZXMnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgdHJ1c3RUeXBlQW5ub3RhdGlvbnMgPSAnLS10cnVzdC10eXBlLWFubm90YXRpb25zJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRydXN0SlNJbnRlcm9wVHlwZUFubm90YXRpb25zID0KICAgICAgJy0tZXhwZXJpbWVudGFsLXRydXN0LWpzLWludGVyb3AtdHlwZS1hbm5vdGF0aW9ucyc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB1c2VDb250ZW50U2VjdXJpdHlQb2xpY3kgPSAnLS1jc3AnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgdXNlTXVsdGlTb3VyY2VJbmZvID0gJy0tdXNlLW11bHRpLXNvdXJjZS1pbmZvJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHVzZU5ld1NvdXJjZUluZm8gPSAnLS11c2UtbmV3LXNvdXJjZS1pbmZvJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHZlcmJvc2UgPSAnLS12ZXJib3NlJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHByb2dyZXNzID0gJy0tc2hvdy1pbnRlcm5hbC1wcm9ncmVzcyc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB2ZXJzaW9uID0gJy0tdmVyc2lvbic7CgogIHN0YXRpYyBjb25zdCBTdHJpbmcgZGlsbERlcGVuZGVuY2llcyA9ICctLWRpbGwtZGVwZW5kZW5jaWVzJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHJlYWREYXRhID0gJy0tcmVhZC1kYXRhJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHdyaXRlRGF0YSA9ICctLXdyaXRlLWRhdGEnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgY2ZlT25seSA9ICctLWNmZS1vbmx5JzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGRlYnVnR2xvYmFsSW5mZXJlbmNlID0gJy0tZGVidWctZ2xvYmFsLWluZmVyZW5jZSc7CgogIHN0YXRpYyBjb25zdCBTdHJpbmcgc2VydmVyTW9kZSA9ICctLXNlcnZlci1tb2RlJzsKCiAgc3RhdGljIGNvbnN0IFN0cmluZyBuZXdEZWZlcnJlZFNwbGl0ID0gJy0tbmV3LWRlZmVycmVkLXNwbGl0JzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHJlcG9ydEludmFsaWRJbmZlcnJlZERlZmVycmVkVHlwZXMgPQogICAgICAnLS1yZXBvcnQtaW52YWxpZC1kZWZlcnJlZC10eXBlcyc7CgogIC8vLyBGbGFnIGZvciBhIGNvbWJpbmF0aW9uIG9mIGZsYWdzIGZvciAncHJvZHVjdGlvbicgbW9kZS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIGJlbmNobWFya2luZ1Byb2R1Y3Rpb24gPSAnLS1iZW5jaG1hcmtpbmctcHJvZHVjdGlvbic7CgogIHN0YXRpYyBjb25zdCBTdHJpbmcgY29uZGl0aW9uYWxEaXJlY3RpdmVzID0gJy0tY29uZGl0aW9uYWwtZGlyZWN0aXZlcyc7CgogIC8vIFRoZSBzeW50YXgtb25seSBsZXZlbCBvZiBzdXBwb3J0IGZvciBnZW5lcmljIG1ldGhvZHMgaXMgaW5jbHVkZWQgaW4gdGhlCiAgLy8gMS41MCBtaWxlc3RvbmUgZm9yIERhcnQuIEl0IGlzIG5vdCBleHBlcmltZW50YWwsIGJ1dCBhbHNvIG5vdCBwZXJtYW5lbnQ6CiAgLy8gYSBmdWxsIGltcGxlbWVudGF0aW9uIGlzIGV4cGVjdGVkIGluIHRoZSBmdXR1cmUuIEhlbmNlLCB0aGUKICAvLyAnR0VORVJJQ19NRVRIT0RTJyBjb21tZW50cyB3aGljaCB3ZXJlIGFkZGVkIHdoZW4gdGhpcyBmZWF0dXJlIHdhcwogIC8vIGV4cGVyaW1lbnRhbCBoYXZlIGJlZW4gcHJlc2VydmVkLCBzdWNoIHRoYXQgaXQgd2lsbCBiZSBlYXN5IHRvIGZpbmQgdGhlCiAgLy8gcmVsZXZhbnQgbG9jYXRpb25zIHRvIHVwZGF0ZSB3aGVuIGdlbmVyaWMgbWV0aG9kcyBhcmUgaW1wbGVtZW50ZWQgZnVsbHkuCiAgLy8KICAvLyBUaGUgb3B0aW9uIGlzIHN0aWxsIGFjY2VwdGVkLCBidXQgaXQgaGFzIG5vIGVmZmVjdDogVGhlIGZlYXR1cmUgaXMgZW5hYmxlZAogIC8vIGJ5IGRlZmF1bHQgYW5kIGl0IGNhbm5vdCBiZSBkaXNhYmxlZC4KICAvLwogIC8vIFRoZSBhcHByb2FjaCB0YWtlbiBpbiB0aGUgaW1wbGVtZW50YXRpb24gaXMgdG8gcGFyc2UgZ2VuZXJpYyBtZXRob2RzLAogIC8vIGludHJvZHVjZSBBU1Qgbm9kZXMgZm9yIHRoZW0sIGdlbmVyYXRlIGNvcnJlc3BvbmRpbmcgdHlwZXMgKHN1Y2ggdGhhdAogIC8vIGZyb250IGVuZCB0cmVhdG1lbnQgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBjb2RlIHRoYXQgcHJvZ3JhbW1lcnMgd3JvdGUpLAogIC8vIGJ1dCBjb25zaWRlcmluZyBhbGwgbWV0aG9kIHR5cGUgdmFyaWFibGVzIHRvIGhhdmUgYm91bmQgYGR5bmFtaWNgIG5vCiAgLy8gbWF0dGVyIHdoaWNoIGJvdW5kIHRoZXkgaGF2ZSBzeW50YWN0aWNhbGx5IChzdWNoIHRoYXQgdGhlaXIgdmFsdWUgYXMgdHlwZXMKICAvLyBpcyB1bmNoZWNrZWQpLCBhbmQgdGhlbiByZXBsYWNpbmcgbWV0aG9kIHR5cGUgdmFyaWFibGVzIGJ5IGEgYER5bmFtaWNUeXBlYAogIC8vIChzdWNoIHRoYXQgdGhlIGJhY2tlbmQgZG9lcyBub3QgbmVlZCB0byB0YWtlIG1ldGhvZCB0eXBlIGFyZ3VtZW50cyBpbnRvCiAgLy8gYWNjb3VudCkuCiAgLy8KICAvLyBUaGUgZmVhdHVyZSBoYXMgYW4gaW5mb3JtYWwgc3BlY2lmaWNhdGlvbiB3aGljaCBpcyBhdmFpbGFibGUgYXQKICAvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9lZXJuc3RnLzQzNTNkN2I0ZjY2OTc0NWJlZDNhNTQyM2UwNGE0NTNjLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgZ2VuZXJpY01ldGhvZFN5bnRheCA9ICctLWdlbmVyaWMtbWV0aG9kLXN5bnRheCc7CgogIC8vIEluaXRpYWxpemluZy1mb3JtYWwgYWNjZXNzIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBhbmQgY2Fubm90IGJlIGRpc2FibGVkLgogIC8vIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHRoZSBvcHRpb24gaXMgc3RpbGwgYWNjZXB0ZWQsIGJ1dCBpdCBpcyBpZ25vcmVkLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgaW5pdGlhbGl6aW5nRm9ybWFsQWNjZXNzID0gJy0taW5pdGlhbGl6aW5nLWZvcm1hbC1hY2Nlc3MnOwoKICAvLyBFeHBlcmltZW50YWwgZmxhZ3MuCiAgc3RhdGljIGNvbnN0IFN0cmluZyByZXNvbHZlT25seSA9ICctLXJlc29sdmUtb25seSc7Cn0KCmNsYXNzIE9wdGlvbiB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBzaG93UGFja2FnZVdhcm5pbmdzID0KICAgICAgJyR7RmxhZ3Muc2hvd1BhY2thZ2VXYXJuaW5nc318JHtGbGFncy5zaG93UGFja2FnZVdhcm5pbmdzfT0uKic7CgogIHN0YXRpYyBjb25zdCBTdHJpbmcgZW5hYmxlTGFuZ3VhZ2VFeHBlcmltZW50cyA9CiAgICAgICcke0ZsYWdzLmVuYWJsZUxhbmd1YWdlRXhwZXJpbWVudHN9fCcKICAgICAgJyR7RmxhZ3MuZW5hYmxlTGFuZ3VhZ2VFeHBlcmltZW50c309LionOwoKICAvLyBFeHBlcmltZW50YWwgb3B0aW9ucy4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHJlc29sdXRpb25JbnB1dCA9ICctLXJlc29sdXRpb24taW5wdXQ9LisnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgYmF6ZWxQYXRocyA9ICctLWJhemVsLXBhdGhzPS4rJzsKfQqAjwBOTjwBIQFEDklLPkdPNi02LUlNMEBDOk01KjQpAUwbRAFKSgE+QwEzNisBSQE2OjoyATkBRTdPAUMBKzUrSTA5OEc6QCkwPkk2OjpGQi09LQFAMDIuSQE0AUE7KQE9TAFKAU1OQUdNTgVQKwVLS05KUFBNDwVFR0cBTlFRARk2AgEPLEYBMiwvARtBNwIBLXBhY2thZ2U6Y29tcGlsZXIvc3JjL2NvbW1hbmRsaW5lX29wdGlvbnMuZGFydCxzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9maWxlbmFtZXMuZGFydITSLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmlsZW5hbWVzOwoKaW1wb3J0ICdkYXJ0OmlvJyBzaG93IFBsYXRmb3JtOwoKLy8gRm9yIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBjb252ZXJ0IFdpbmRvd3MgZmlsZSBuYW1lcyB0byBVUklzOgovLyBodHRwOi8vYmxvZ3MubXNkbi5jb20vYi9pZS9hcmNoaXZlLzIwMDYvMTIvMDYvZmlsZS11cmlzLWluLXdpbmRvd3MuYXNweAoKU3RyaW5nIG5hdGl2ZVRvVXJpUGF0aChTdHJpbmcgZmlsZW5hbWUpIHsKICAvLyBUT0RPKGFoZSk6IEl0IHdvdWxkIGJlIG5pY2UgdG8gdXNlIGEgRGFydCBsaWJyYXJ5IGluc3RlYWQuCiAgaWYgKCFQbGF0Zm9ybS5pc1dpbmRvd3MpIHJldHVybiBmaWxlbmFtZTsKICBmaWxlbmFtZSA9IGZpbGVuYW1lLnJlcGxhY2VBbGwoJ1xcJywgJy8nKTsKICBpZiAoZmlsZW5hbWUubGVuZ3RoID4gMiAmJiBmaWxlbmFtZVsxXSA9PSAnOicpIHsKICAgIGZpbGVuYW1lID0gIi8kZmlsZW5hbWUiOwogIH0KICByZXR1cm4gZmlsZW5hbWU7Cn0KClN0cmluZyB1cmlQYXRoVG9OYXRpdmUoU3RyaW5nIHBhdGgpIHsKICAvLyBUT0RPKGFoZSk6IEl0IHdvdWxkIGJlIG5pY2UgdG8gdXNlIGEgRGFydCBsaWJyYXJ5IGluc3RlYWQuCiAgaWYgKCFQbGF0Zm9ybS5pc1dpbmRvd3MpIHJldHVybiBwYXRoOwogIGlmIChwYXRoLmxlbmd0aCA+IDMgJiYgcGF0aFswXSA9PSAnLycgJiYgcGF0aFsyXSA9PSAnOicpIHsKICAgIHJldHVybiBwYXRoLnN1YnN0cmluZygxKS5yZXBsYWNlQWxsKCcvJywgJ1xcJyk7CiAgfSBlbHNlIHsKICAgIHJldHVybiBwYXRoLnJlcGxhY2VBbGwoJy8nLCAnXFwnKTsKICB9Cn0KCmZpbmFsIFVyaSBjdXJyZW50RGlyZWN0b3J5ID0gVXJpLmJhc2U7CgpVcmkgbmF0aXZlVG9VcmkoU3RyaW5nIGZpbGVuYW1lKSA9PgogICAgY3VycmVudERpcmVjdG9yeS5yZXNvbHZlKG5hdGl2ZVRvVXJpUGF0aChmaWxlbmFtZSkpOwoKU3RyaW5nIGFwcGVuZFNsYXNoKFN0cmluZyBwYXRoKSA9PiBwYXRoLmVuZHNXaXRoKCcvJykgPyBwYXRoIDogJyRwYXRoLyc7CicATk48ARMBIAFESwEqQCwtMx0EEwIBJkAoPTQLJwQCAScBJDkBSQEjcGFja2FnZTpjb21waWxlci9zcmMvZmlsZW5hbWVzLmRhcnQqc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvb3B0aW9ucy5kYXJ0wABXNC8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuc3JjLm9wdGlvbnM7CgppbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfdW5zdGFibGUvZGFydDJqcy5kYXJ0JyBhcyBmZTsKCmltcG9ydCAnY29tbWFuZGxpbmVfb3B0aW9ucy5kYXJ0JyBzaG93IEZsYWdzOwppbXBvcnQgJ3V0aWwvdXRpbC5kYXJ0JzsKCi8vLyBPcHRpb25zIHVzZWQgZm9yIGNvbnRyb2xsaW5nIGRpYWdub3N0aWMgbWVzc2FnZXMuCmFic3RyYWN0IGNsYXNzIERpYWdub3N0aWNPcHRpb25zIHsKICBjb25zdCBEaWFnbm9zdGljT3B0aW9ucygpOwoKICAvLy8gSWYgYHRydWVgLCB3YXJuaW5ncyBjYXVzZSB0aGUgY29tcGlsYXRpb24gdG8gZmFpbC4KICBib29sIGdldCBmYXRhbFdhcm5pbmdzOwoKICAvLy8gRW1pdCB0ZXJzZSBkaWFnbm9zdGljcyB3aXRob3V0IGhvd1RvRml4LgogIGJvb2wgZ2V0IHRlcnNlRGlhZ25vc3RpY3M7CgogIC8vLyBJZiBgdHJ1ZWAsIHdhcm5pbmdzIGFyZSBub3QgcmVwb3J0ZWQuCiAgYm9vbCBnZXQgc3VwcHJlc3NXYXJuaW5nczsKCiAgLy8vIElmIGB0cnVlYCwgaGludHMgYXJlIG5vdCByZXBvcnRlZC4KICBib29sIGdldCBzdXBwcmVzc0hpbnRzOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgd2FybmluZ3MgYW5kIGhpbnRzIGFyZSBzaG93biBmb3IgYWxsIHBhY2thZ2VzLgogIGJvb2wgZ2V0IHNob3dBbGxQYWNrYWdlV2FybmluZ3M7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB3YXJuaW5ncyBhbmQgaGludHMgYXJlIGhpZGRlbiBmb3IgYWxsIHBhY2thZ2VzLgogIGJvb2wgZ2V0IGhpZGVQYWNrYWdlV2FybmluZ3M7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB3YXJuaW5ncyBzaG91bGQgYmUgc2hvdWxkIGZvciBbdXJpXS4KICBib29sIHNob3dQYWNrYWdlV2FybmluZ3NGb3IoVXJpIHVyaSk7Cn0KCi8vLyBPYmplY3QgZm9yIHBhc3Npbmcgb3B0aW9ucyB0byB0aGUgY29tcGlsZXIuIFN1cGVyY2xhc3NlcyBhcmUgdXNlZCB0byBzZWxlY3QKLy8vIHN1YnNldHMgb2YgdGhlc2Ugb3B0aW9ucywgZW5hYmxpbmcgZWFjaCBwYXJ0IG9mIHRoZSBjb21waWxlciB0byBkZXBlbmQgb24KLy8vIGFzIGZldyBhcyBwb3NzaWJsZS4KY2xhc3MgQ29tcGlsZXJPcHRpb25zIGltcGxlbWVudHMgRGlhZ25vc3RpY09wdGlvbnMgewogIC8vLyBUaGUgZW50cnkgcG9pbnQgb2YgdGhlIGFwcGxpY2F0aW9uIHRoYXQgaXMgYmVpbmcgY29tcGlsZWQuCiAgVXJpIGVudHJ5UG9pbnQ7CgogIC8vLyBQYWNrYWdlIHJvb3QgbG9jYXRpb24uCiAgLy8vCiAgLy8vIElmIG5vdCBudWxsIHRoZW4gW3BhY2thZ2VDb25maWddIHNob3VsZCBiZSBudWxsLgogIFVyaSBwYWNrYWdlUm9vdDsKCiAgLy8vIExvY2F0aW9uIG9mIHRoZSBwYWNrYWdlIGNvbmZpZ3VyYXRpb24gZmlsZS4KICAvLy8KICAvLy8gSWYgbm90IG51bGwgdGhlbiBbcGFja2FnZVJvb3RdIHNob3VsZCBiZSBudWxsLgogIFVyaSBwYWNrYWdlQ29uZmlnOwoKICAvLy8gTGlzdCBvZiBrZXJuZWwgZmlsZXMgdG8gbG9hZC4KICAvLy8KICAvLy8gV2hlbiBjb21waWxpbmcgbW9kdWxhcmx5LCB0aGlzIGNvbnRhaW5zIGtlcm5lbCBmaWxlcyB0aGF0IGFyZSBuZWVkZWQKICAvLy8gdG8gY29tcGlsZSBhIHNpbmdsZSBtb2R1bGUuCiAgLy8vCiAgLy8vIFdoZW4gbGlua2luZywgdGhpcyBjb250YWlucyBhbGwga2VybmVsIGZpbGVzIHRoYXQgZm9ybSBwYXJ0IG9mIHRoZSBmaW5hbAogIC8vLyBwcm9ncmFtLgogIC8vLwogIC8vLyBBdCB0aGlzIHRpbWUsIHRoaXMgbGlzdCBwb2ludHMgdG8gZnVsbCBrZXJuZWwgZmlsZXMuIEluIHRoZSBmdXR1cmUsIHdlIG1heQogIC8vLyB1c2UgYSBsaXN0IG9mIG91dGxpbmUgZmlsZXMgZm9yIG1vZHVsYXIgY29tcGlsZXMsIGFuZCBvbmx5IHVzZSBmdWxsIGtlcm5lbAogIC8vLyBmaWxlcyBmb3IgbGlua2luZy4KICBMaXN0PFVyaT4gZGlsbERlcGVuZGVuY2llczsKCiAgLy8vIExvY2F0aW9uIGZyb20gd2hpY2ggc2VyaWFsaXplZCBpbmZlcmVuY2UgZGF0YSBpcyByZWFkLgogIC8vLwogIC8vLyBJZiB0aGlzIGlzIHNldCwgdGhlIFtlbnRyeVBvaW50XSBpcyBleHBlY3RlZCB0byBiZSBhIC5kaWxsIGZpbGUgYW5kIHRoZQogIC8vLyBmcm9udGVuZCB3b3JrIGlzIHNraXBwZWQuCiAgVXJpIHJlYWREYXRhVXJpOwoKICAvLy8gTG9jYXRpb24gdG8gd2hpY2ggaW5mZXJlbmNlIGRhdGEgaXMgc2VyaWFsaXplZC4KICAvLy8KICAvLy8gSWYgdGhpcyBpcyBzZXQsIHRoZSBjb21waWxhdGlvbiBzdG9wcyBhZnRlciB0eXBlIGluZmVyZW5jZS4KICBVcmkgd3JpdGVEYXRhVXJpOwoKICAvLy8gV2hldGhlciB0byBydW4gb25seSB0aGUgQ0ZFIGFuZCBlbWl0IHRoZSBnZW5lcmF0ZWQga2VybmVsIGZpbGUgaW4KICAvLy8gW291dHB1dFVyaV0uCiAgYm9vbCBjZmVPbmx5ID0gZmFsc2U7CgogIC8vLyBGbGFnIG9ubHkgbWVhbnQgZm9yIGRhcnQyanMgZGV2ZWxvcGVycyB0byBpdGVyYXRlIG9uIGdsb2JhbCBpbmZlcmVuY2UKICAvLy8gY2hhbmdlcy4KICAvLy8KICAvLy8gV2hlbiB3b3JraW5nIG9uIGxhcmdlIGFwcHMgdGhpcyBmbGFnIGFsbG93cyB0byBsb2FkIHNlcmlhbGl6ZWQgZGF0YSBmb3IKICAvLy8gdGhlIGFwcCAodmlhIC0tcmVhZC1kYXRhKSwgcmV1c2UgaXRzIGNsb3NlZCB3b3JsZCwgYW5kIHJlcnVuIHRoZSBnbG9iYWwKICAvLy8gaW5mZXJlbmNlIHBoYXNlIChldmVuIHRob3VnaCB0aGUgc2VyaWFsaXplZCBkYXRhIGFscmVhZHkgY29udGFpbnMgYSBnbG9iYWwKICAvLy8gaW5mZXJlbmNlIHJlc3VsdCkuCiAgYm9vbCBkZWJ1Z0dsb2JhbEluZmVyZW5jZSA9IGZhbHNlOwoKICAvLy8gUmVzb2x2ZWQgY29uc3RhbnQgImVudmlyb25tZW50IiB2YWx1ZXMgcGFzc2VkIHRvIHRoZSBjb21waWxlciB2aWEgdGhlIGAtRGAKICAvLy8gZmxhZ3MuCiAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudCA9IGNvbnN0IDxTdHJpbmcsIFN0cmluZz57fTsKCiAgLy8vIEZsYWdzIGVuYWJsaW5nIGxhbmd1YWdlIGV4cGVyaW1lbnRzLgogIE1hcDxmZS5FeHBlcmltZW50YWxGbGFnLCBib29sPiBsYW5ndWFnZUV4cGVyaW1lbnRzID0ge307CgogIC8vLyBgdHJ1ZWAgaWYgQ0ZFIHBlcmZvcm1zIGNvbnN0YW50IGV2YWx1YXRpb24uCiAgYm9vbCBnZXQgdXNlQ0ZFQ29uc3RhbnRzID0+CiAgICAgIGxhbmd1YWdlRXhwZXJpbWVudHNbZmUuRXhwZXJpbWVudGFsRmxhZy5jb25zdGFudFVwZGF0ZTIwMThdOwoKICAvLy8gQSBwb3NzaWJseSBudWxsIHN0YXRlIG9iamVjdCBmb3Iga2VybmVsIGNvbXBpbGF0aW9uLgogIGZlLkluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZSBrZXJuZWxJbml0aWFsaXplZENvbXBpbGVyU3RhdGU7CgogIC8vLyBXaGV0aGVyIHdlIGFsbG93IG1vY2tpbmcgY29tcGlsYXRpb24gb2YgbGlicmFyaWVzIHN1Y2ggYXMgZGFydDppbyBhbmQKICAvLy8gZGFydDpodG1sIGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMuCiAgYm9vbCBhbGxvd01vY2tDb21waWxhdGlvbiA9IGZhbHNlOwoKICAvLy8gU2V0cyBhIGNvbWJpbmF0aW9uIG9mIGZsYWdzIGZvciBiZW5jaG1hcmtpbmcgJ3Byb2R1Y3Rpb24nIG1vZGUuCiAgYm9vbCBiZW5jaG1hcmtpbmdQcm9kdWN0aW9uID0gZmFsc2U7CgogIC8vLyBJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZGsgYnVpbGQuCiAgU3RyaW5nIGJ1aWxkSWQgPSBfVU5ERVRFUk1JTkVEX0JVSUxEX0lEOwoKICAvLy8gV2hldGhlciB0aGVyZSBpcyBhIGJ1aWxkLWlkIGF2YWlsYWJsZSBzbyB3ZSBjYW4gdXNlIGl0IG9uIGVycm9yIG1lc3NhZ2VzCiAgLy8vIGFuZCBpbiB0aGUgZW1pdHRlZCBvdXRwdXQgb2YgdGhlIGNvbXBpbGVyLgogIGJvb2wgZ2V0IGhhc0J1aWxkSWQgPT4gYnVpbGRJZCAhPSBfVU5ERVRFUk1JTkVEX0JVSUxEX0lEOwoKICAvLy8gV2hldGhlciB0byBjb21waWxlIGZvciB0aGUgc2VydmVyIGNhdGVnb3J5LiBUaGlzIGlzIHVzZWQgdG8gY29tcGlsZSB0byBKUwogIC8vLyB0aGF0IGlzIGludGVuZGVkIHRvIGJlIHJ1biBvbiBzZXJ2ZXItc2lkZSBWTXMgbGlrZSBub2RlanMuCiAgYm9vbCBjb21waWxlRm9yU2VydmVyID0gZmFsc2U7CgogIC8vLyBMb2NhdGlvbiB3aGVyZSB0byBnZW5lcmF0ZSBhIG1hcCBjb250YWluaW5nIGRldGFpbHMgb2YgaG93IGRlZmVycmVkCiAgLy8vIGxpYnJhcmllcyBhcmUgc3ViZGl2aWRlZC4KICBVcmkgZGVmZXJyZWRNYXBVcmk7CgogIC8vLyBXaGV0aGVyIHRvIGFwcGx5IHRoZSBuZXcgZGVmZXJyZWQgc3BsaXQgZml4ZXMuIFRoZSBmaXhlcyBpbXByb3ZlIG9uCiAgLy8vIHBlcmZvcm1hbmNlIGFuZCBmaXggYSBzb3VuZG5lc3MgaXNzdWUgd2l0aCBpbmZlcnJlZCB0eXBlcy4gVGhlIGxhdHRlciB3aWxsCiAgLy8vIG1vdmUgbW9yZSBjb2RlIHRvIHRoZSBtYWluIG91dHB1dCB1bml0LCBiZWNhdXNlIG9mIHRoYXQgd2UgYXJlIG5vdAogIC8vLyBlbmFibGluZyB0aGUgZmVhdHVyZSBieSBkZWZhdWx0IHJpZ2h0IGF3YXkuCiAgLy8vCiAgLy8vIFdoZW4gW3JlcG9ydEludmFsaWRJbmZlcnJlZERlZmVycmVkVHlwZXNdIHNob3dzIG5vIGVycm9ycywgd2UgZXhwZWN0IHRoaXMKICAvLy8gZmxhZyB0byBwcm9kdWNlIHRoZSBzYW1lIG9yIGJldHRlciByZXN1bHRzIHRoYW4gdGhlIGN1cnJlbnQgdW5zb3VuZAogIC8vLyBpbXBsZW1lbnRhdGlvbi4KICBib29sIG5ld0RlZmVycmVkU3BsaXQgPSBmYWxzZTsKCiAgLy8vIFNob3cgZXJyb3JzIHdoZW4gYSBkZWZlcnJlZCB0eXBlIGlzIGluZmVycmVkIGFzIGEgcmV0dXJuIHR5cGUgb2YgYSBjbG9zdXJlCiAgLy8vIG9yIGluIGEgdHlwZSBwYXJhbWV0ZXIuIFRob3NlIGNhc2VzIGNhdXNlIHRoZSBjb21waWxlciB0b2RheSB0byBiZWhhdmUKICAvLy8gdW5zb3VuZGx5IGJ5IHB1dHRpbmcgdGhlIGNvZGUgaW4gYSBkZWZlcnJlZCBvdXRwdXQgdW5pdC4gSW4gdGhlIGZ1dHVyZQogIC8vLyB3aGVuIFtuZXdEZWZlcnJlZFNwbGl0XSBpcyBvbiBieSBkZWZhdWx0LCB0aG9zZSBjYXNlcyB3aWxsIGJlIHRyZWF0ZWQKICAvLy8gc291bmRseSBhbmQgd2lsbCBjYXVzZSBtb3JlIGNvZGUgdG8gYmUgbW92ZWQgdG8gdGhlIG1haW4gb3V0cHV0IHVuaXQuCiAgLy8vCiAgLy8vIFRoaXMgZmxhZyBpcyBwcmVzZW50ZWQgdG8gaGVscCBkZXZlbG9wZXJzIGZpbmQgYW5kIGZpeCB0aGUgYWZmZWN0ZWQgY29kZS4KICBib29sIHJlcG9ydEludmFsaWRJbmZlcnJlZERlZmVycmVkVHlwZXMgPSBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgdG8gZGlzYWJsZSBpbmxpbmluZyBkdXJpbmcgdGhlIGJhY2tlbmQgb3B0aW1pemF0aW9ucy4KICAvLyBUT0RPKHNpZ211bmQpOiBuZWdhdGUsIHNvIGFsbCBmbGFncyBhcmUgcG9zaXRpdmUKICBib29sIGRpc2FibGVJbmxpbmluZyA9IGZhbHNlOwoKICAvLy8gRGlzYWJsZSBkZWZlcnJlZCBsb2FkaW5nLCBpbnN0ZWFkIGdlbmVyYXRlIGV2ZXJ5dGhpbmcgaW4gb25lIG91dHB1dCB1bml0LgogIC8vLyBOb3RlOiB0aGUgcmVzdWx0aW5nIHByb2dyYW0gc3RpbGwgY29ycmVjdGx5IGNoZWNrcyB0aGF0IGxvYWRMaWJyYXJ5ICYKICAvLy8gY2hlY2tMaWJyYXJ5IGNhbGxzIGFyZSBjb3JyZWN0LgogIGJvb2wgZGlzYWJsZVByb2dyYW1TcGxpdCA9IGZhbHNlOwoKICAvLy8gRGlhZ25vc3RpYyBvcHRpb246IElmIGB0cnVlYCwgd2FybmluZ3MgY2F1c2UgdGhlIGNvbXBpbGF0aW9uIHRvIGZhaWwuCiAgQG92ZXJyaWRlCiAgYm9vbCBmYXRhbFdhcm5pbmdzID0gZmFsc2U7CgogIC8vLyBEaWFnbm9zdGljIG9wdGlvbjogRW1pdCB0ZXJzZSBkaWFnbm9zdGljcyB3aXRob3V0IGhvd1RvRml4LgogIEBvdmVycmlkZQogIGJvb2wgdGVyc2VEaWFnbm9zdGljcyA9IGZhbHNlOwoKICAvLy8gRGlhZ25vc3RpYyBvcHRpb246IElmIGB0cnVlYCwgd2FybmluZ3MgYXJlIG5vdCByZXBvcnRlZC4KICBAb3ZlcnJpZGUKICBib29sIHN1cHByZXNzV2FybmluZ3MgPSBmYWxzZTsKCiAgLy8vIERpYWdub3N0aWMgb3B0aW9uOiBJZiBgdHJ1ZWAsIGhpbnRzIGFyZSBub3QgcmVwb3J0ZWQuCiAgQG92ZXJyaWRlCiAgYm9vbCBzdXBwcmVzc0hpbnRzID0gZmFsc2U7CgogIC8vLyBEaWFnbm9zdGljIG9wdGlvbjogTGlzdCBvZiBwYWNrYWdlcyBmb3Igd2hpY2ggd2FybmluZ3MgYW5kIGhpbnRzIGFyZQogIC8vLyByZXBvcnRlZC4gSWYgYG51bGxgLCBubyBwYWNrYWdlIHdhcm5pbmdzIG9yIGhpbnRzIGFyZSByZXBvcnRlZC4gSWYKICAvLy8gZW1wdHksIGFsbCB3YXJuaW5ncyBhbmQgaGludHMgYXJlIHJlcG9ydGVkLgogIExpc3Q8U3RyaW5nPiBzaG93blBhY2thZ2VXYXJuaW5nczsgLy8gJiYmJiYKCiAgLy8vIFdoZXRoZXIgdG8gZGlzYWJsZSBnbG9iYWwgdHlwZSBpbmZlcmVuY2UuCiAgYm9vbCBkaXNhYmxlVHlwZUluZmVyZW5jZSA9IGZhbHNlOwoKICAvLy8gV2hldGhlciB0byB1c2UgdGhlIHRyaXZpYWwgYWJzdHJhY3QgdmFsdWUgZG9tYWluLgogIGJvb2wgdXNlVHJpdmlhbEFic3RyYWN0VmFsdWVEb21haW4gPSBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgdG8gZGlzYWJsZSBvcHRpbWl6YXRpb24gZm9yIG5lZWQgcnVudGltZSB0eXBlIGluZm9ybWF0aW9uLgogIGJvb2wgZGlzYWJsZVJ0aU9wdGltaXphdGlvbiA9IGZhbHNlOwoKICAvLy8gV2hldGhlciB0byBlbWl0IGEgc3VtbWFyeSBvZiB0aGUgaW5mb3JtYXRpb24gdXNlZCBieSB0aGUgY29tcGlsZXIgZHVyaW5nCiAgLy8vIG9wdGltaXphdGlvbi4gVGhpcyBpbmNsdWRlcyByZXNvbHV0aW9uIGRldGFpbHMsIGRlcGVuZGVuY2llcyBiZXR3ZWVuCiAgLy8vIGVsZW1lbnRzLCByZXN1bHRzIG9mIHR5cGUgaW5mZXJlbmNlLCBhbmQgZGF0YSBhYm91dCBnZW5lcmF0ZWQgY29kZS4KICBib29sIGR1bXBJbmZvID0gZmFsc2U7CgogIC8vLyBXaGV0aGVyIHRvIHVzZSB0aGUgbmV3IGR1bXAtaW5mbyBiaW5hcnkgZm9ybWF0LiBUaGlzIHdpbGwgYmUgdGhlIGRlZmF1bHQKICAvLy8gYWZ0ZXIgYSB0cmFuc2l0aW9uYWwgcGVyaW9kLgogIGJvb2wgdXNlRHVtcEluZm9CaW5hcnlGb3JtYXQgPSBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgd2UgYWxsb3cgcGFzc2luZyBhbiBleHRyYSBhcmd1bWVudCB0byBgYXNzZXJ0YCwgY29udGFpbmluZyBhCiAgLy8vIHJlYXNvbiBmb3Igd2h5IGFuIGFzc2VydGlvbiBmYWlscy4gKGV4cGVyaW1lbnRhbCkKICAvLy8KICAvLy8gVGhpcyBpcyBvbmx5IGluY2x1ZGVkIHNvIHRoYXQgdGVzdHMgY2FuIHBhc3MgdGhlIC0tYXNzZXJ0LW1lc3NhZ2UgZmxhZwogIC8vLyB3aXRob3V0IGNhdXNpbmcgZGFydDJqcyB0byBjcmFzaC4gVGhlIGZsYWcgaGFzIG5vIGVmZmVjdC4KICBib29sIGVuYWJsZUFzc2VydE1lc3NhZ2UgPSB0cnVlOwoKICAvLy8gV2hldGhlciB0byBlbmFibGUgbWluaWZpY2F0aW9uCiAgLy8gVE9ETyhzaWdtdW5kKTogcmVuYW1lIHRvIG1pbmlmeQogIGJvb2wgZW5hYmxlTWluaWZpY2F0aW9uID0gZmFsc2U7CgogIC8vLyBGbGFnIHRvIHR1cm4gb2ZmIG1pbmlmaWNhdGlvbiBldmVuIGlmIGVuYWJsZWQgZWxzZXdoZXJlLCBlLmcuIHZpYQogIC8vLyAtTzIuIEJvdGggW2VuYWJsZU1pbmlmaWNhdGlvbl0gYW5kIFtfZGlzYWJsZU1pbmlmaWNhdGlvbl0gY2FuIGJlIHRydWUsIGluCiAgLy8vIHdoaWNoIGNhc2UgW19kaXNhYmxlTWluaWZpY2F0aW9uXSB3aW5zLgogIGJvb2wgX2Rpc2FibGVNaW5pZmljYXRpb24gPSBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgdG8gbW9kZWwgd2hpY2ggbmF0aXZlIGNsYXNzZXMgYXJlIGxpdmUgYmFzZWQgb24gYW5ub3RhdGlvbnMgb24gdGhlCiAgLy8vIGNvcmUgbGlicmFyaWVzLiBJZiBmYWxzZSwgYWxsIG5hdGl2ZSBjbGFzc2VzIHdpbGwgYmUgaW5jbHVkZWQgYnkgZGVmYXVsdC4KICBib29sIGVuYWJsZU5hdGl2ZUxpdmVUeXBlQW5hbHlzaXMgPSB0cnVlOwoKICAvLy8gV2hldGhlciB0byBnZW5lcmF0ZSBjb2RlIGNvbnRhaW5pbmcgdXNlcidzIGBhc3NlcnRgIHN0YXRlbWVudHMuCiAgYm9vbCBlbmFibGVVc2VyQXNzZXJ0aW9ucyA9IGZhbHNlOwoKICAvLy8gV2hldGhlciB0byBnZW5lcmF0ZSBvdXRwdXQgZXZlbiB3aGVuIHRoZXJlIGFyZSBjb21waWxlLXRpbWUgZXJyb3JzLgogIGJvb2wgZ2VuZXJhdGVDb2RlV2l0aENvbXBpbGVUaW1lRXJyb3JzID0gZmFsc2U7CgogIC8vLyBXaGV0aGVyIHRvIGdlbmVyYXRlIGEgc291cmNlLW1hcCBmaWxlIHRvZ2V0aGVyIHdpdGggdGhlIG91dHB1dCBwcm9ncmFtLgogIGJvb2wgZ2VuZXJhdGVTb3VyY2VNYXAgPSB0cnVlOwoKICAvLy8gVVJJIG9mIHRoZSBtYWluIG91dHB1dCBvZiB0aGUgY29tcGlsZXIuCiAgVXJpIG91dHB1dFVyaTsKCiAgLy8vIExvY2F0aW9uIG9mIHRoZSBsaWJyYXJpZXMgc3BlY2lmaWNhdGlvbiBmaWxlLgogIFVyaSBsaWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpOwoKICAvLy8gTG9jYXRpb24gb2YgdGhlIGtlcm5lbCBwbGF0Zm9ybSBgLmRpbGxgIGZpbGVzLgogIFVyaSBwbGF0Zm9ybUJpbmFyaWVzOwoKICAvLy8gVVJJIHdoZXJlIHRoZSBjb21waWxlciBzaG91bGQgZ2VuZXJhdGUgdGhlIG91dHB1dCBzb3VyY2UgbWFwIGZpbGUuCiAgVXJpIHNvdXJjZU1hcFVyaTsKCiAgLy8vIFRoZSBjb21waWxlciBpcyBydW4gZnJvbSB0aGUgYnVpbGQgYm90LgogIGJvb2wgdGVzdE1vZGUgPSBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgdG8gdHJ1c3QgSlMtaW50ZXJvcCBhbm5vdGF0aW9ucy4gKGV4cGVyaW1lbnRhbCkKICBib29sIHRydXN0SlNJbnRlcm9wVHlwZUFubm90YXRpb25zID0gZmFsc2U7CgogIC8vLyBXaGV0aGVyIHRvIHRydXN0IHByaW1pdGl2ZSB0eXBlcyBkdXJpbmcgaW5mZXJlbmNlIGFuZCBvcHRpbWl6YXRpb25zLgogIGJvb2wgdHJ1c3RQcmltaXRpdmVzID0gZmFsc2U7CgogIC8vLyBXaGV0aGVyIHRvIG9taXQgaW1wbGljaXQgc3Ryb25nIG1vZGUgY2hlY2tzLgogIGJvb2wgb21pdEltcGxpY2l0Q2hlY2tzID0gZmFsc2U7CgogIC8vLyBXaGV0aGVyIHRvIG9taXQgYXMgY2FzdHMuCiAgYm9vbCBvbWl0QXNDYXN0cyA9IGZhbHNlOwoKICAvLy8gV2hldGhlciB0byBvbWl0IGNsYXNzIHR5cGUgYXJndW1lbnRzIG9ubHkgbmVlZGVkIGZvciBgdG9TdHJpbmdgIG9uCiAgLy8vIGBPYmplY3QucnVudGltZVR5cGVgLgogIGJvb2wgbGF4UnVudGltZVR5cGVUb1N0cmluZyA9IGZhbHNlOwoKICAvLy8gV2hhdCBzaG91bGQgdGhlIGNvbXBpbGVyIGRvIHdpdGggdHlwZSBhc3NlcnRpb25zIG9mIGFzc2lnbm1lbnRzLgogIC8vLwogIC8vLyBUaGlzIGlzIGFuIGludGVybmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGRlcml2ZWQgZnJvbSBvdGhlciBmbGFncy4KICBDaGVja1BvbGljeSBhc3NpZ25tZW50Q2hlY2tQb2xpY3k7CgogIC8vLyBXaGF0IHNob3VsZCB0aGUgY29tcGlsZXIgZG8gd2l0aCBwYXJhbWV0ZXIgdHlwZSBhc3NlcnRpb25zLgogIC8vLwogIC8vLyBUaGlzIGlzIGFuIGludGVybmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGRlcml2ZWQgZnJvbSBvdGhlciBmbGFncy4KICBDaGVja1BvbGljeSBwYXJhbWV0ZXJDaGVja1BvbGljeTsKCiAgLy8vIFdoYXQgc2hvdWxkIHRoZSBjb21waWxlciBkbyB3aXRoIGltcGxpY2l0IGRvd25jYXN0cy4KICAvLy8KICAvLy8gVGhpcyBpcyBhbiBpbnRlcm5hbCBjb25maWd1cmF0aW9uIG9wdGlvbiBkZXJpdmVkIGZyb20gb3RoZXIgZmxhZ3MuCiAgQ2hlY2tQb2xpY3kgaW1wbGljaXREb3duY2FzdENoZWNrUG9saWN5OwoKICAvLy8gV2hhdCB0aGUgY29tcGlsZXIgc2hvdWxkIGRvIHdpdGggYSBib29sZWFuIHZhbHVlIGluIGEgY29uZGl0aW9uIGNvbnRleHQKICAvLy8gd2hlbiB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWNhdGlvbiBzYXlzIGl0IGlzIGEgcnVudGltZSBlcnJvciBmb3IgaXQgdG8gYmUKICAvLy8gbnVsbC4KICAvLy8KICAvLy8gVGhpcyBpcyBhbiBpbnRlcm5hbCBjb25maWd1cmF0aW9uIG9wdGlvbiBkZXJpdmVkIGZyb20gb3RoZXIgZmxhZ3MuCiAgQ2hlY2tQb2xpY3kgY29uZGl0aW9uQ2hlY2tQb2xpY3k7CgogIC8vLyBXaGV0aGVyIHRvIGdlbmVyYXRlIGNvZGUgY29tcGxpYW50IHdpdGggY29udGVudCBzZWN1cml0eSBwb2xpY3kgKENTUCkuCiAgYm9vbCB1c2VDb250ZW50U2VjdXJpdHlQb2xpY3kgPSBmYWxzZTsKCiAgLy8vIFdoZW4gb2JmdXNjYXRpbmcgZm9yIG1pbmlmaWNhdGlvbiwgd2hldGhlciB0byB1c2UgdGhlIGZyZXF1ZW5jeSBvZiBhIG5hbWUKICAvLy8gYXMgYW4gaGV1cmlzdGljIHRvIHBpY2sgc2hvcnRlciBuYW1lcy4KICBib29sIHVzZUZyZXF1ZW5jeU5hbWVyID0gdHJ1ZTsKCiAgLy8vIFdoZXRoZXIgdG8gZ2VuZXJhdGUgc291cmNlLWluZm9ybWF0aW9uIGZyb20gYm90aCB0aGUgb2xkIGFuZCB0aGUgbmV3CiAgLy8vIHNvdXJjZS1pbmZvcm1hdGlvbiBlbmdpbmVzLiAoZXhwZXJpbWVudGFsKQogIGJvb2wgdXNlTXVsdGlTb3VyY2VJbmZvID0gZmFsc2U7CgogIC8vLyBXaGV0aGVyIHRvIHVzZSB0aGUgbmV3IHNvdXJjZS1pbmZvcm1hdGlvbiBpbXBsZW1lbnRhdGlvbiBmb3Igc291cmNlLW1hcHMuCiAgLy8vIChleHBlcmltZW50YWwpCiAgYm9vbCB1c2VOZXdTb3VyY2VJbmZvID0gZmFsc2U7CgogIC8vLyBFbmFibGUgdmVyYm9zZSBwcmludGluZyBkdXJpbmcgY29tcGlsYXRpb24uIEluY2x1ZGVzIGEgdGltZS1icmVha2Rvd24KICAvLy8gYmV0d2VlbiBwaGFzZXMgYXQgdGhlIGVuZC4KICBib29sIHZlcmJvc2UgPSBmYWxzZTsKCiAgLy8vIE9uIHRvcCBvZiAtLXZlcmJvc2UsIGVuYWJsZSBtb3JlIHZlcmJvc2UgcHJpbnRpbmcsIGxpa2UgcHJvZ3Jlc3MgbWVzc2FnZXMKICAvLy8gZHVyaW5nIGVhY2ggcGhhc2Ugb2YgY29tcGlsYXRpb24uCiAgYm9vbCBzaG93SW50ZXJuYWxQcm9ncmVzcyA9IGZhbHNlOwoKICAvLy8gVHJhY2sgYWxsb2NhdGlvbnMgaW4gdGhlIEpTIG91dHB1dC4KICAvLy8KICAvLy8gVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZS4KICBib29sIGV4cGVyaW1lbnRhbFRyYWNrQWxsb2NhdGlvbnMgPSBmYWxzZTsKCiAgLy8vIEV4cGVyaW1lbnRhbCBwYXJ0IGZpbGUgZnVuY3Rpb24gZ2VuZXJhdGlvbi4KICBib29sIGV4cGVyaW1lbnRTdGFydHVwRnVuY3Rpb25zID0gZmFsc2U7CgogIC8vLyBFeHBlcmltZW50YWwgcmVsaWFuY2Ugb24gSmF2YVNjcmlwdCBUb0Jvb2xlYW4gY29udmVyc2lvbnMuCiAgYm9vbCBleHBlcmltZW50VG9Cb29sZWFuID0gZmFsc2U7CgogIC8vLyBFeHBlcmltZW50YWwgaW5zdHJ1bWVudGF0aW9uIHRvIGludmVzdGlnYXRlIGNvZGUgYmxvYXQuCiAgLy8vCiAgLy8vIElmIFt0cnVlXSwgdGhlIGNvbXBpbGVyIHdpbGwgZW1pdCBjb2RlIHRoYXQgbG9ncyB3aGVuZXZlciBhIG1ldGhvZCBpcwogIC8vLyBjYWxsZWQuCiAgYm9vbCBleHBlcmltZW50Q2FsbEluc3RydW1lbnRhdGlvbiA9IGZhbHNlOwoKICAvLy8gVGhlIHBhdGggdG8gdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgcHJvZmlsZWQgYWxsb2NhdGlvbnMuCiAgLy8vCiAgLy8vIFRoZSBmaWxlIG11c3QgY29udGFpbiB0aGUgTWFwIHRoYXQgd2FzIHByb2R1Y2VkIGJ5IHVzaW5nCiAgLy8vIFtleHBlcmltZW50YWxUcmFja0FsbG9jYXRpb25zXSBlbmNvZGVkIGFzIGEgSlNPTiBtYXAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUuCiAgU3RyaW5nIGV4cGVyaW1lbnRhbEFsbG9jYXRpb25zUGF0aDsKCiAgLy8vIElmIHNwZWNpZmllZCwgYSBidW5kbGUgb2Ygb3B0aW1pemF0aW9ucyB0byBlbmFibGUgKG9yIGRpc2FibGUpLgogIGludCBvcHRpbWl6YXRpb25MZXZlbCA9IG51bGw7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBPcHRpb25zIGZvciBkZXByZWNhdGVkIGZlYXR1cmVzCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLy8gQ3JlYXRlIGFuIG9wdGlvbnMgb2JqZWN0IGJ5IHBhcnNpbmcgZmxhZ3MgZnJvbSBbb3B0aW9uc10uCiAgc3RhdGljIENvbXBpbGVyT3B0aW9ucyBwYXJzZShMaXN0PFN0cmluZz4gb3B0aW9ucywKICAgICAge1VyaSBsaWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpLCBVcmkgcGxhdGZvcm1CaW5hcmllc30pIHsKICAgIE1hcDxmZS5FeHBlcmltZW50YWxGbGFnLCBib29sPiBsYW5ndWFnZUV4cGVyaW1lbnRzID0KICAgICAgICBfZXh0cmFjdEV4cGVyaW1lbnRzKG9wdGlvbnMpOwogICAgaWYgKGVxdWFsTWFwcyhsYW5ndWFnZUV4cGVyaW1lbnRzLCBmZS5kZWZhdWx0RXhwZXJpbWVudGFsRmxhZ3MpKSB7CiAgICAgIHBsYXRmb3JtQmluYXJpZXMgPz89IGZlLmNvbXB1dGVQbGF0Zm9ybUJpbmFyaWVzTG9jYXRpb24oKTsKICAgIH0KICAgIHJldHVybiBuZXcgQ29tcGlsZXJPcHRpb25zKCkKICAgICAgLi5saWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpID0gbGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaQogICAgICAuLmFsbG93TW9ja0NvbXBpbGF0aW9uID0gX2hhc09wdGlvbihvcHRpb25zLCBGbGFncy5hbGxvd01vY2tDb21waWxhdGlvbikKICAgICAgLi5iZW5jaG1hcmtpbmdQcm9kdWN0aW9uID0KICAgICAgICAgIF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MuYmVuY2htYXJraW5nUHJvZHVjdGlvbikKICAgICAgLi5idWlsZElkID0KICAgICAgICAgIF9leHRyYWN0U3RyaW5nT3B0aW9uKG9wdGlvbnMsICctLWJ1aWxkLWlkPScsIF9VTkRFVEVSTUlORURfQlVJTERfSUQpCiAgICAgIC4uY29tcGlsZUZvclNlcnZlciA9IF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3Muc2VydmVyTW9kZSkKICAgICAgLi5kZWZlcnJlZE1hcFVyaSA9IF9leHRyYWN0VXJpT3B0aW9uKG9wdGlvbnMsICctLWRlZmVycmVkLW1hcD0nKQogICAgICAuLm5ld0RlZmVycmVkU3BsaXQgPSBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLm5ld0RlZmVycmVkU3BsaXQpCiAgICAgIC4ucmVwb3J0SW52YWxpZEluZmVycmVkRGVmZXJyZWRUeXBlcyA9CiAgICAgICAgICBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLnJlcG9ydEludmFsaWRJbmZlcnJlZERlZmVycmVkVHlwZXMpCiAgICAgIC4uZmF0YWxXYXJuaW5ncyA9IF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MuZmF0YWxXYXJuaW5ncykKICAgICAgLi50ZXJzZURpYWdub3N0aWNzID0gX2hhc09wdGlvbihvcHRpb25zLCBGbGFncy50ZXJzZSkKICAgICAgLi5zdXBwcmVzc1dhcm5pbmdzID0gX2hhc09wdGlvbihvcHRpb25zLCBGbGFncy5zdXBwcmVzc1dhcm5pbmdzKQogICAgICAuLnN1cHByZXNzSGludHMgPSBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLnN1cHByZXNzSGludHMpCiAgICAgIC4uc2hvd25QYWNrYWdlV2FybmluZ3MgPQogICAgICAgICAgX2V4dHJhY3RPcHRpb25hbENzdk9wdGlvbihvcHRpb25zLCBGbGFncy5zaG93UGFja2FnZVdhcm5pbmdzKQogICAgICAuLmxhbmd1YWdlRXhwZXJpbWVudHMgPSBsYW5ndWFnZUV4cGVyaW1lbnRzCiAgICAgIC4uZGlzYWJsZUlubGluaW5nID0gX2hhc09wdGlvbihvcHRpb25zLCBGbGFncy5kaXNhYmxlSW5saW5pbmcpCiAgICAgIC4uZGlzYWJsZVByb2dyYW1TcGxpdCA9IF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MuZGlzYWJsZVByb2dyYW1TcGxpdCkKICAgICAgLi5kaXNhYmxlVHlwZUluZmVyZW5jZSA9IF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MuZGlzYWJsZVR5cGVJbmZlcmVuY2UpCiAgICAgIC4udXNlVHJpdmlhbEFic3RyYWN0VmFsdWVEb21haW4gPQogICAgICAgICAgX2hhc09wdGlvbihvcHRpb25zLCBGbGFncy51c2VUcml2aWFsQWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgLi5kaXNhYmxlUnRpT3B0aW1pemF0aW9uID0KICAgICAgICAgIF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MuZGlzYWJsZVJ0aU9wdGltaXphdGlvbikKICAgICAgLi5kdW1wSW5mbyA9IF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MuZHVtcEluZm8pCiAgICAgIC4udXNlRHVtcEluZm9CaW5hcnlGb3JtYXQgPQogICAgICAgICAgX2hhc09wdGlvbihvcHRpb25zLCAiJHtGbGFncy5kdW1wSW5mb309YmluYXJ5IikKICAgICAgLi5lbmFibGVNaW5pZmljYXRpb24gPSBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLm1pbmlmeSkKICAgICAgLi5fZGlzYWJsZU1pbmlmaWNhdGlvbiA9IF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3Mubm9NaW5pZnkpCiAgICAgIC4uZW5hYmxlTmF0aXZlTGl2ZVR5cGVBbmFseXNpcyA9CiAgICAgICAgICAhX2hhc09wdGlvbihvcHRpb25zLCBGbGFncy5kaXNhYmxlTmF0aXZlTGl2ZVR5cGVBbmFseXNpcykKICAgICAgLi5lbmFibGVVc2VyQXNzZXJ0aW9ucyA9IF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MuZW5hYmxlQ2hlY2tlZE1vZGUpIHx8CiAgICAgICAgICBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLmVuYWJsZUFzc2VydHMpCiAgICAgIC4uZXhwZXJpbWVudGFsVHJhY2tBbGxvY2F0aW9ucyA9CiAgICAgICAgICBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLmV4cGVyaW1lbnRhbFRyYWNrQWxsb2NhdGlvbnMpCiAgICAgIC4uZXhwZXJpbWVudGFsQWxsb2NhdGlvbnNQYXRoID0gX2V4dHJhY3RTdHJpbmdPcHRpb24oCiAgICAgICAgICBvcHRpb25zLCAiJHtGbGFncy5leHBlcmltZW50YWxBbGxvY2F0aW9uc1BhdGh9PSIsIG51bGwpCiAgICAgIC4uZXhwZXJpbWVudFN0YXJ0dXBGdW5jdGlvbnMgPQogICAgICAgICAgX2hhc09wdGlvbihvcHRpb25zLCBGbGFncy5leHBlcmltZW50U3RhcnR1cEZ1bmN0aW9ucykKICAgICAgLi5leHBlcmltZW50VG9Cb29sZWFuID0gX2hhc09wdGlvbihvcHRpb25zLCBGbGFncy5leHBlcmltZW50VG9Cb29sZWFuKQogICAgICAuLmV4cGVyaW1lbnRDYWxsSW5zdHJ1bWVudGF0aW9uID0KICAgICAgICAgIF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MuZXhwZXJpbWVudENhbGxJbnN0cnVtZW50YXRpb24pCiAgICAgIC4uZ2VuZXJhdGVDb2RlV2l0aENvbXBpbGVUaW1lRXJyb3JzID0KICAgICAgICAgIF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MuZ2VuZXJhdGVDb2RlV2l0aENvbXBpbGVUaW1lRXJyb3JzKQogICAgICAuLmdlbmVyYXRlU291cmNlTWFwID0gIV9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3Mubm9Tb3VyY2VNYXBzKQogICAgICAuLm91dHB1dFVyaSA9IF9leHRyYWN0VXJpT3B0aW9uKG9wdGlvbnMsICctLW91dD0nKQogICAgICAuLnBsYXRmb3JtQmluYXJpZXMgPQogICAgICAgICAgcGxhdGZvcm1CaW5hcmllcyA/PyBfZXh0cmFjdFVyaU9wdGlvbihvcHRpb25zLCAnLS1wbGF0Zm9ybS1iaW5hcmllcz0nKQogICAgICAuLnNvdXJjZU1hcFVyaSA9IF9leHRyYWN0VXJpT3B0aW9uKG9wdGlvbnMsICctLXNvdXJjZS1tYXA9JykKICAgICAgLi5vbWl0SW1wbGljaXRDaGVja3MgPSBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLm9taXRJbXBsaWNpdENoZWNrcykKICAgICAgLi5vbWl0QXNDYXN0cyA9IF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3Mub21pdEFzQ2FzdHMpCiAgICAgIC4ubGF4UnVudGltZVR5cGVUb1N0cmluZyA9CiAgICAgICAgICBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLmxheFJ1bnRpbWVUeXBlVG9TdHJpbmcpCiAgICAgIC4udGVzdE1vZGUgPSBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLnRlc3RNb2RlKQogICAgICAuLnRydXN0SlNJbnRlcm9wVHlwZUFubm90YXRpb25zID0KICAgICAgICAgIF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MudHJ1c3RKU0ludGVyb3BUeXBlQW5ub3RhdGlvbnMpCiAgICAgIC4udHJ1c3RQcmltaXRpdmVzID0gX2hhc09wdGlvbihvcHRpb25zLCBGbGFncy50cnVzdFByaW1pdGl2ZXMpCiAgICAgIC4udXNlQ29udGVudFNlY3VyaXR5UG9saWN5ID0KICAgICAgICAgIF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MudXNlQ29udGVudFNlY3VyaXR5UG9saWN5KQogICAgICAuLnVzZUZyZXF1ZW5jeU5hbWVyID0KICAgICAgICAgICFfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLm5vRnJlcXVlbmN5QmFzZWRNaW5pZmljYXRpb24pCiAgICAgIC4udXNlTXVsdGlTb3VyY2VJbmZvID0gX2hhc09wdGlvbihvcHRpb25zLCBGbGFncy51c2VNdWx0aVNvdXJjZUluZm8pCiAgICAgIC4udXNlTmV3U291cmNlSW5mbyA9IF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MudXNlTmV3U291cmNlSW5mbykKICAgICAgLi52ZXJib3NlID0gX2hhc09wdGlvbihvcHRpb25zLCBGbGFncy52ZXJib3NlKQogICAgICAuLnNob3dJbnRlcm5hbFByb2dyZXNzID0gX2hhc09wdGlvbihvcHRpb25zLCBGbGFncy5wcm9ncmVzcykKICAgICAgLi5kaWxsRGVwZW5kZW5jaWVzID0KICAgICAgICAgIF9leHRyYWN0VXJpTGlzdE9wdGlvbihvcHRpb25zLCAnJHtGbGFncy5kaWxsRGVwZW5kZW5jaWVzfScpCiAgICAgIC4ucmVhZERhdGFVcmkgPSBfZXh0cmFjdFVyaU9wdGlvbihvcHRpb25zLCAnJHtGbGFncy5yZWFkRGF0YX09JykKICAgICAgLi53cml0ZURhdGFVcmkgPSBfZXh0cmFjdFVyaU9wdGlvbihvcHRpb25zLCAnJHtGbGFncy53cml0ZURhdGF9PScpCiAgICAgIC4uY2ZlT25seSA9IF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MuY2ZlT25seSkKICAgICAgLi5kZWJ1Z0dsb2JhbEluZmVyZW5jZSA9IF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MuZGVidWdHbG9iYWxJbmZlcmVuY2UpOwogIH0KCiAgdm9pZCB2YWxpZGF0ZSgpIHsKICAgIC8vIFRPRE8oc2lnbXVuZCk6IHNob3VsZCBlbnRyeXBvaW50IGJlIGhlcmU/IHNob3VsZCB3ZSB2YWxpZGF0ZSBpdCBpcyBub3QKICAgIC8vIG51bGw/IEluIHVuaXR0ZXN0cyB3ZSB1c2UgdGhlIHNhbWUgY29tcGlsZXIgdG8gYW5hbHl6ZSBvciBidWlsZCBtdWx0aXBsZQogICAgLy8gZW50cnlwb2ludHMuCiAgICBpZiAobGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaSA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJbbGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaV0gaXMgbnVsbC4iKTsKICAgIH0KICAgIGlmIChsaWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpLnBhdGguZW5kc1dpdGgoJy8nKSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigKICAgICAgICAgICJbbGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaV0gc2hvdWxkIGJlIGEgZmlsZTogJGxpYnJhcmllc1NwZWNpZmljYXRpb25VcmkiKTsKICAgIH0KICAgIGlmIChwYWNrYWdlUm9vdCAhPSBudWxsICYmIHBhY2thZ2VDb25maWcgIT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiT25seSBvbmUgb2YgW3BhY2thZ2VSb290XSBvciBbcGFja2FnZUNvbmZpZ10gIgogICAgICAgICAgIm1heSBiZSBnaXZlbi4iKTsKICAgIH0KICAgIGlmIChwYWNrYWdlUm9vdCAhPSBudWxsICYmICFwYWNrYWdlUm9vdC5wYXRoLmVuZHNXaXRoKCIvIikpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIltwYWNrYWdlUm9vdF0gbXVzdCBlbmQgd2l0aCBhIC8iKTsKICAgIH0KICAgIGlmIChwbGF0Zm9ybUJpbmFyaWVzID09IG51bGwgJiYKICAgICAgICBlcXVhbE1hcHMobGFuZ3VhZ2VFeHBlcmltZW50cywgZmUuZGVmYXVsdEV4cGVyaW1lbnRhbEZsYWdzKSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiTWlzc2luZyByZXF1aXJlZCAke0ZsYWdzLnBsYXRmb3JtQmluYXJpZXN9Iik7CiAgICB9CiAgfQoKICB2b2lkIGRlcml2ZU9wdGlvbnMoKSB7CiAgICBpZiAoYmVuY2htYXJraW5nUHJvZHVjdGlvbikgewogICAgICB0cnVzdFByaW1pdGl2ZXMgPSB0cnVlOwogICAgICBvbWl0SW1wbGljaXRDaGVja3MgPSB0cnVlOwogICAgfQoKICAgIGlmIChvcHRpbWl6YXRpb25MZXZlbCAhPSBudWxsKSB7CiAgICAgIGlmIChvcHRpbWl6YXRpb25MZXZlbCA9PSAwKSB7CiAgICAgICAgZGlzYWJsZUlubGluaW5nID0gdHJ1ZTsKICAgICAgICBkaXNhYmxlVHlwZUluZmVyZW5jZSA9IHRydWU7CiAgICAgICAgZGlzYWJsZVJ0aU9wdGltaXphdGlvbiA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKG9wdGltaXphdGlvbkxldmVsID49IDIpIHsKICAgICAgICBlbmFibGVNaW5pZmljYXRpb24gPSB0cnVlOwogICAgICAgIGxheFJ1bnRpbWVUeXBlVG9TdHJpbmcgPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChvcHRpbWl6YXRpb25MZXZlbCA+PSAzKSB7CiAgICAgICAgb21pdEltcGxpY2l0Q2hlY2tzID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAob3B0aW1pemF0aW9uTGV2ZWwgPT0gNCkgewogICAgICAgIHRydXN0UHJpbWl0aXZlcyA9IHRydWU7CiAgICAgIH0KICAgIH0KCiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTaG91bGQgd2Ugc3VwcG9ydCB0aGlzIGluIHRoZSBmdXR1cmU/CiAgICBnZW5lcmF0ZUNvZGVXaXRoQ29tcGlsZVRpbWVFcnJvcnMgPSBmYWxzZTsKCiAgICAvLyBTdHJvbmcgbW9kZSBhbHdheXMgdHJ1c3RzIHR5cGUgYW5ub3RhdGlvbnMgKGluZmVycmVkIG9yIGV4cGxpY2l0KSwgc28KICAgIC8vIGFzc2lnbm1lbnRzIGNoZWNrcyBzaG91bGQgYmUgdHJ1c3RlZC4KICAgIGFzc2lnbm1lbnRDaGVja1BvbGljeSA9IENoZWNrUG9saWN5LnRydXN0ZWQ7CiAgICBpZiAob21pdEltcGxpY2l0Q2hlY2tzKSB7CiAgICAgIHBhcmFtZXRlckNoZWNrUG9saWN5ID0gQ2hlY2tQb2xpY3kudHJ1c3RlZDsKICAgICAgaW1wbGljaXREb3duY2FzdENoZWNrUG9saWN5ID0gQ2hlY2tQb2xpY3kudHJ1c3RlZDsKICAgICAgY29uZGl0aW9uQ2hlY2tQb2xpY3kgPSBDaGVja1BvbGljeS50cnVzdGVkOwogICAgfSBlbHNlIHsKICAgICAgcGFyYW1ldGVyQ2hlY2tQb2xpY3kgPSBDaGVja1BvbGljeS5jaGVja2VkOwogICAgICBpbXBsaWNpdERvd25jYXN0Q2hlY2tQb2xpY3kgPSBDaGVja1BvbGljeS5jaGVja2VkOwogICAgICBjb25kaXRpb25DaGVja1BvbGljeSA9IENoZWNrUG9saWN5LmNoZWNrZWQ7CiAgICB9CgogICAgaWYgKF9kaXNhYmxlTWluaWZpY2F0aW9uKSB7CiAgICAgIGVuYWJsZU1pbmlmaWNhdGlvbiA9IGZhbHNlOwogICAgfQogIH0KCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHdhcm5pbmdzIGFuZCBoaW50cyBhcmUgc2hvd24gZm9yIGFsbCBwYWNrYWdlcy4KICBAb3ZlcnJpZGUKICBib29sIGdldCBzaG93QWxsUGFja2FnZVdhcm5pbmdzIHsKICAgIHJldHVybiBzaG93blBhY2thZ2VXYXJuaW5ncyAhPSBudWxsICYmIHNob3duUGFja2FnZVdhcm5pbmdzLmlzRW1wdHk7CiAgfQoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgd2FybmluZ3MgYW5kIGhpbnRzIGFyZSBoaWRkZW4gZm9yIGFsbCBwYWNrYWdlcy4KICBAb3ZlcnJpZGUKICBib29sIGdldCBoaWRlUGFja2FnZVdhcm5pbmdzID0+IHNob3duUGFja2FnZVdhcm5pbmdzID09IG51bGw7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB3YXJuaW5ncyBzaG91bGQgYmUgc2hvdWxkIGZvciBbdXJpXS4KICBAb3ZlcnJpZGUKICBib29sIHNob3dQYWNrYWdlV2FybmluZ3NGb3IoVXJpIHVyaSkgewogICAgaWYgKHNob3dBbGxQYWNrYWdlV2FybmluZ3MpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoc2hvd25QYWNrYWdlV2FybmluZ3MgIT0gbnVsbCkgewogICAgICByZXR1cm4gdXJpLnNjaGVtZSA9PSAncGFja2FnZScgJiYKICAgICAgICAgIHNob3duUGFja2FnZVdhcm5pbmdzLmNvbnRhaW5zKHVyaS5wYXRoU2VnbWVudHMuZmlyc3QpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KfQoKLy8vIFBvbGljeSBmb3Igd2hhdCB0byBkbyB3aXRoIGEgdHlwZSBhc3NlcnRpb24gY2hlY2suCi8vLwovLy8gVGhpcyBlbnVtLWxpa2UgY2xhc3MgaXMgdXNlZCB0byBjb25maWd1cmUgaG93IHRoZSBjb21waWxlciB0cmVhdHMgdHlwZQovLy8gYXNzZXJ0aW9ucyBkdXJpbmcgZ2xvYmFsIHR5cGUgaW5mZXJlbmNlIGFuZCBjb2RlZ2VuLgpjbGFzcyBDaGVja1BvbGljeSB7CiAgLy8vIFdoZXRoZXIgdGhlIHR5cGUgYXNzZXJ0aW9uIHNob3VsZCBiZSB0cnVzdGVkLgogIGZpbmFsIGJvb2wgaXNUcnVzdGVkOwoKICAvLy8gV2hldGhlciB0aGUgdHlwZSBhc3NlcnRpb24gc2hvdWxkIGJlIGVtaXR0ZWQgYW5kIGNoZWNrZWQuCiAgZmluYWwgYm9vbCBpc0VtaXR0ZWQ7CgogIGNvbnN0IENoZWNrUG9saWN5KHt0aGlzLmlzVHJ1c3RlZDogZmFsc2UsIHRoaXMuaXNFbWl0dGVkOiBmYWxzZX0pOwoKICBzdGF0aWMgY29uc3QgdHJ1c3RlZCA9IGNvbnN0IENoZWNrUG9saWN5KGlzVHJ1c3RlZDogdHJ1ZSk7CiAgc3RhdGljIGNvbnN0IGNoZWNrZWQgPSBjb25zdCBDaGVja1BvbGljeShpc0VtaXR0ZWQ6IHRydWUpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnQ2hlY2tQb2xpY3koaXNUcnVzdGVkPSRpc1RydXN0ZWQsJwogICAgICAnaXNFbWl0dGVkPSRpc0VtaXR0ZWQpJzsKfQoKU3RyaW5nIF9leHRyYWN0U3RyaW5nT3B0aW9uKAogICAgTGlzdDxTdHJpbmc+IG9wdGlvbnMsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKICBmb3IgKFN0cmluZyBvcHRpb24gaW4gb3B0aW9ucykgewogICAgaWYgKG9wdGlvbi5zdGFydHNXaXRoKHByZWZpeCkpIHsKICAgICAgcmV0dXJuIG9wdGlvbi5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCk7CiAgICB9CiAgfQogIHJldHVybiBkZWZhdWx0VmFsdWU7Cn0KClVyaSBfZXh0cmFjdFVyaU9wdGlvbihMaXN0PFN0cmluZz4gb3B0aW9ucywgU3RyaW5nIHByZWZpeCkgewogIHZhciBvcHRpb24gPSBfZXh0cmFjdFN0cmluZ09wdGlvbihvcHRpb25zLCBwcmVmaXgsIG51bGwpOwogIHJldHVybiAob3B0aW9uID09IG51bGwpID8gbnVsbCA6IFVyaS5wYXJzZShvcHRpb24pOwp9Cgpib29sIF9oYXNPcHRpb24oTGlzdDxTdHJpbmc+IG9wdGlvbnMsIFN0cmluZyBvcHRpb24pIHsKICByZXR1cm4gb3B0aW9ucy5pbmRleE9mKG9wdGlvbikgPj0gMDsKfQoKLy8vIEV4dHJhY3QgbGlzdCBvZiBjb21tYSBzZXBhcmF0ZWQgdmFsdWVzIHByb3ZpZGVkIGZvciBbZmxhZ10uIFJldHVybnMgYW4KLy8vIGVtcHR5IGxpc3QgaWYgW29wdGlvbl0gY29udGFpbiBbZmxhZ10gd2l0aG91dCBhcmd1bWVudHMuIFJldHVybnMgYG51bGxgIGlmCi8vLyBbb3B0aW9uXSBkb2Vzbid0IGNvbnRhaW4gW2ZsYWddIHdpdGggb3Igd2l0aG91dCBhcmd1bWVudHMuCkxpc3Q8U3RyaW5nPiBfZXh0cmFjdE9wdGlvbmFsQ3N2T3B0aW9uKExpc3Q8U3RyaW5nPiBvcHRpb25zLCBTdHJpbmcgZmxhZykgewogIFN0cmluZyBwcmVmaXggPSAnJGZsYWc9JzsKICBmb3IgKFN0cmluZyBvcHRpb24gaW4gb3B0aW9ucykgewogICAgaWYgKG9wdGlvbiA9PSBmbGFnKSB7CiAgICAgIHJldHVybiBjb25zdCA8U3RyaW5nPltdOwogICAgfQogICAgaWYgKG9wdGlvbi5zdGFydHNXaXRoKGZsYWcpKSB7CiAgICAgIHJldHVybiBvcHRpb24uc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpLnNwbGl0KCcsJyk7CiAgICB9CiAgfQogIHJldHVybiBudWxsOwp9CgovLy8gRXh0cmFjdCBsaXN0IG9mIGNvbW1hIHNlcGFyYXRlZCBVcmlzIHByb3ZpZGVkIGZvciBbZmxhZ10uIFJldHVybnMgYW4KLy8vIGVtcHR5IGxpc3QgaWYgW29wdGlvbl0gY29udGFpbiBbZmxhZ10gd2l0aG91dCBhcmd1bWVudHMuIFJldHVybnMgYG51bGxgIGlmCi8vLyBbb3B0aW9uXSBkb2Vzbid0IGNvbnRhaW4gW2ZsYWddIHdpdGggb3Igd2l0aG91dCBhcmd1bWVudHMuCkxpc3Q8VXJpPiBfZXh0cmFjdFVyaUxpc3RPcHRpb24oTGlzdDxTdHJpbmc+IG9wdGlvbnMsIFN0cmluZyBmbGFnKSB7CiAgTGlzdDxTdHJpbmc+IHN0cmluZ1VyaXMgPSBfZXh0cmFjdE9wdGlvbmFsQ3N2T3B0aW9uKG9wdGlvbnMsIGZsYWcpOwogIGlmIChzdHJpbmdVcmlzID09IG51bGwpIHJldHVybiBudWxsOwogIHJldHVybiBzdHJpbmdVcmlzLm1hcChVcmkucGFyc2UpLnRvTGlzdCgpOwp9CgpNYXA8ZmUuRXhwZXJpbWVudGFsRmxhZywgYm9vbD4gX2V4dHJhY3RFeHBlcmltZW50cyhMaXN0PFN0cmluZz4gb3B0aW9ucykgewogIExpc3Q8U3RyaW5nPiBleHBlcmltZW50cyA9CiAgICAgIF9leHRyYWN0T3B0aW9uYWxDc3ZPcHRpb24ob3B0aW9ucywgRmxhZ3MuZW5hYmxlTGFuZ3VhZ2VFeHBlcmltZW50cyk7CiAgcmV0dXJuIGZlLnBhcnNlRXhwZXJpbWVudGFsRmxhZ3MoCiAgICAgIGV4cGVyaW1lbnRzLCAoU3RyaW5nIGVycm9yKSA9PiB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihlcnJvcikpOwp9Cgpjb25zdCBTdHJpbmcgX1VOREVURVJNSU5FRF9CVUlMRF9JRCA9ICJidWlsZCBudW1iZXIgY291bGQgbm90IGJlIGRldGVybWluZWQiOwqCRgBOTjwBHQFAAS4ZATYjHQE5GgEvHQEsHQEpGgFHIwFIIAE9KAIBUE4YNUESAR0GNxMBMgY1FQEkBksiBk8PBlFRGR4BPQZOIBMBNgZCFAFIExgBTA8GTk5RGSUBUQ0+ASs7ATIeQwE7PgFMKyUBRicBKSsBTzE8AVBBIQFKIBYBSlFJMgZQShYhAVFNTUxMBlAzAUQ2IAFQTCYkAUwMHgFCDCEBPwwhATwMHgFLSTIuATAlATguAUknAU9LShkBTyMoAUs4Bk1AIwElJSMBSFAuJQFRUCwBRiUBSjIBTiEBLhEBNCEBNRgBSRQBLhkBPi4BSyABMyMBIBwBSRwnAUcGSSUBQgZJJAE7BkkrAU5ODAZJJAFNKQFQLSEBSzEjAVAVIQFMIRgBUCglASoGJy0BMisBQSQBPgZMDi4BQwY/PAYnJgFGIAE3JTcBQDU/OSZHQQYhPk8hPBJPQUdHLUhBPEdBH0gyRU1PKEMhPDciOj9DJ0RPMydCPEIlQE0oQyxHRTkbUUNLPSE8NyhDRSM+HENLRzVDG0ZHSTVQBAEUTlAULUcGOB9XBjhOHAZCQgYkR00GBAEZIh4hBgElJCAlJwgkIycIJCMIJCAIBgFCLwFNLTEeMjkyDTI5MgYBICIGBAFHDCRJBAFIDEABPQwpIhMGKChBBhIEAgE3BEs5FDQYAUAYAUUBPT0BDDsfAgEdQCMlLgYEFwIBPTw2AgE3JwIBS08/TBwjGh8GIzkGBA8CAUlPP0VGJy0CAUsdSyRGAgFOASFwYWNrYWdlOmNvbXBpbGVyL3NyYy9vcHRpb25zLmRhcnQ3c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvc291cmNlX2ZpbGVfcHJvdmlkZXIuZGFydMAASCcvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBzb3VyY2VfZmlsZV9wcm92aWRlcjsKCmltcG9ydCAnZGFydDphc3luYyc7CmltcG9ydCAnZGFydDppbyc7CmltcG9ydCAnZGFydDptYXRoJyBhcyBtYXRoOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CgppbXBvcnQgJy4uL2NvbXBpbGVyLmRhcnQnIGFzIGFwaSBzaG93IERpYWdub3N0aWM7CmltcG9ydCAnLi4vY29tcGlsZXJfbmV3LmRhcnQnIGFzIGFwaTsKaW1wb3J0ICcuLi9jb21waWxlcl9uZXcuZGFydCc7CmltcG9ydCAnY29sb3JzLmRhcnQnIGFzIGNvbG9yczsKaW1wb3J0ICdkYXJ0MmpzLmRhcnQnIHNob3cgQWJvcnRMZWc7CmltcG9ydCAnZmlsZW5hbWVzLmRhcnQnOwppbXBvcnQgJ2lvL3NvdXJjZV9maWxlLmRhcnQnOwppbXBvcnQgJ3V0aWwvdXJpX2V4dHJhcy5kYXJ0JzsKCmFic3RyYWN0IGNsYXNzIFNvdXJjZUZpbGVQcm92aWRlciBpbXBsZW1lbnRzIENvbXBpbGVySW5wdXQgewogIGJvb2wgaXNXaW5kb3dzID0gKFBsYXRmb3JtLm9wZXJhdGluZ1N5c3RlbSA9PSAnd2luZG93cycpOwogIFVyaSBjd2QgPSBjdXJyZW50RGlyZWN0b3J5OwogIE1hcDxVcmksIGFwaS5JbnB1dD4gdXRmOFNvdXJjZUZpbGVzID0gPFVyaSwgYXBpLklucHV0Pnt9OwogIE1hcDxVcmksIGFwaS5JbnB1dD4gYmluYXJ5U291cmNlRmlsZXMgPSA8VXJpLCBhcGkuSW5wdXQ+e307CiAgaW50IGRhcnRDaGFyYWN0ZXJzUmVhZCA9IDA7CgogIEZ1dHVyZTxhcGkuSW5wdXQ8TGlzdDxpbnQ+Pj4gcmVhZEJ5dGVzRnJvbVVyaSgKICAgICAgVXJpIHJlc291cmNlVXJpLCBhcGkuSW5wdXRLaW5kIGlucHV0S2luZCkgewogICAgaWYgKCFyZXNvdXJjZVVyaS5pc0Fic29sdXRlKSB7CiAgICAgIHJlc291cmNlVXJpID0gY3dkLnJlc29sdmVVcmkocmVzb3VyY2VVcmkpOwogICAgfQogICAgYXBpLklucHV0PExpc3Q8aW50Pj4gaW5wdXQ7CiAgICBzd2l0Y2ggKGlucHV0S2luZCkgewogICAgICBjYXNlIGFwaS5JbnB1dEtpbmQuVVRGODoKICAgICAgICBpbnB1dCA9IHV0ZjhTb3VyY2VGaWxlc1tyZXNvdXJjZVVyaV07CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgYXBpLklucHV0S2luZC5iaW5hcnk6CiAgICAgICAgaW5wdXQgPSBiaW5hcnlTb3VyY2VGaWxlc1tyZXNvdXJjZVVyaV07CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoaW5wdXQgIT0gbnVsbCkgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUoaW5wdXQpOwoKICAgIGlmIChyZXNvdXJjZVVyaS5zY2hlbWUgPT0gJ2ZpbGUnKSB7CiAgICAgIHJldHVybiBfcmVhZEZyb21GaWxlKHJlc291cmNlVXJpLCBpbnB1dEtpbmQpOwogICAgfSBlbHNlIGlmIChyZXNvdXJjZVVyaS5zY2hlbWUgPT0gJ2h0dHAnIHx8IHJlc291cmNlVXJpLnNjaGVtZSA9PSAnaHR0cHMnKSB7CiAgICAgIHJldHVybiBfcmVhZEZyb21IdHRwKHJlc291cmNlVXJpLCBpbnB1dEtpbmQpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIlVua25vd24gc2NoZW1lIGluIHVyaSAnJHJlc291cmNlVXJpJyIpOwogICAgfQogIH0KCiAgYXBpLklucHV0IF9yZWFkRnJvbUZpbGVTeW5jKFVyaSByZXNvdXJjZVVyaSwgYXBpLklucHV0S2luZCBpbnB1dEtpbmQpIHsKICAgIGFzc2VydChyZXNvdXJjZVVyaS5zY2hlbWUgPT0gJ2ZpbGUnKTsKICAgIExpc3Q8aW50PiBzb3VyY2U7CiAgICB0cnkgewogICAgICBzb3VyY2UgPSByZWFkQWxsKHJlc291cmNlVXJpLnRvRmlsZVBhdGgoKSwKICAgICAgICAgIHplcm9UZXJtaW5hdGVkOiBpbnB1dEtpbmQgPT0gYXBpLklucHV0S2luZC5VVEY4KTsKICAgIH0gb24gRmlsZVN5c3RlbUV4Y2VwdGlvbiBjYXRjaCAoZXgpIHsKICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBleC5vc0Vycm9yPy5tZXNzYWdlOwogICAgICBTdHJpbmcgZGV0YWlsID0gbWVzc2FnZSAhPSBudWxsID8gJyAoJG1lc3NhZ2UpJyA6ICcnOwogICAgICB0aHJvdyAiRXJyb3IgcmVhZGluZyAnJHtyZWxhdGl2aXplVXJpKHJlc291cmNlVXJpKX0nICRkZXRhaWwiOwogICAgfQogICAgZGFydENoYXJhY3RlcnNSZWFkICs9IHNvdXJjZS5sZW5ndGg7CiAgICBhcGkuSW5wdXQgaW5wdXQ7CiAgICBzd2l0Y2ggKGlucHV0S2luZCkgewogICAgICBjYXNlIGFwaS5JbnB1dEtpbmQuVVRGODoKICAgICAgICBpbnB1dCA9IHV0ZjhTb3VyY2VGaWxlc1tyZXNvdXJjZVVyaV0gPSBuZXcgQ2FjaGluZ1V0ZjhCeXRlc1NvdXJjZUZpbGUoCiAgICAgICAgICAgIHJlc291cmNlVXJpLCByZWxhdGl2aXplVXJpKHJlc291cmNlVXJpKSwgc291cmNlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBhcGkuSW5wdXRLaW5kLmJpbmFyeToKICAgICAgICBpbnB1dCA9CiAgICAgICAgICAgIGJpbmFyeVNvdXJjZUZpbGVzW3Jlc291cmNlVXJpXSA9IG5ldyBCaW5hcnkocmVzb3VyY2VVcmksIHNvdXJjZSk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gaW5wdXQ7CiAgfQoKICAvLy8gUmVhZCBbcmVzb3VyY2VVcmldIGRpcmVjdGx5IGFzIGEgVVRGLTggZmlsZS4gSWYgcmVhZGluZyBmYWlscywgYG51bGxgIGlzCiAgLy8vIHJldHVybmVkLgogIGFwaS5JbnB1dCBhdXRvUmVhZEZyb21GaWxlKFVyaSByZXNvdXJjZVVyaSkgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIF9yZWFkRnJvbUZpbGVTeW5jKHJlc291cmNlVXJpLCBJbnB1dEtpbmQuVVRGOCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIC8vIFNpbGVuY2UgdGhlIGVycm9yLiBUaGUgW3Jlc291cmNlVXJpXSB3YXMgbm90IHJlcXVlc3RlZCBieSB0aGUgdXNlciBhbmQKICAgICAgLy8gd2FzIG9ubHkgbmVlZGVkIHRvIGdpdmUgYmV0dGVyIGVycm9yIG1lc3NhZ2VzLgogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBGdXR1cmU8YXBpLklucHV0PExpc3Q8aW50Pj4+IF9yZWFkRnJvbUZpbGUoCiAgICAgIFVyaSByZXNvdXJjZVVyaSwgYXBpLklucHV0S2luZCBpbnB1dEtpbmQpIHsKICAgIGFwaS5JbnB1dDxMaXN0PGludD4+IGlucHV0OwogICAgdHJ5IHsKICAgICAgaW5wdXQgPSBfcmVhZEZyb21GaWxlU3luYyhyZXNvdXJjZVVyaSwgaW5wdXRLaW5kKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcmV0dXJuIG5ldyBGdXR1cmUuZXJyb3IoZSk7CiAgICB9CiAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZShpbnB1dCk7CiAgfQoKICBGdXR1cmU8YXBpLklucHV0PExpc3Q8aW50Pj4+IF9yZWFkRnJvbUh0dHAoCiAgICAgIFVyaSByZXNvdXJjZVVyaSwgYXBpLklucHV0S2luZCBpbnB1dEtpbmQpIHsKICAgIGFzc2VydChyZXNvdXJjZVVyaS5zY2hlbWUgPT0gJ2h0dHAnKTsKICAgIEh0dHBDbGllbnQgY2xpZW50ID0gbmV3IEh0dHBDbGllbnQoKTsKICAgIHJldHVybiBjbGllbnQKICAgICAgICAuZ2V0VXJsKHJlc291cmNlVXJpKQogICAgICAgIC50aGVuKChIdHRwQ2xpZW50UmVxdWVzdCByZXF1ZXN0KSA9PiByZXF1ZXN0LmNsb3NlKCkpCiAgICAgICAgLnRoZW4oKEh0dHBDbGllbnRSZXNwb25zZSByZXNwb25zZSkgewogICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSAhPSBIdHRwU3RhdHVzLk9LKSB7CiAgICAgICAgU3RyaW5nIG1zZyA9ICdGYWlsdXJlIGdldHRpbmcgJHJlc291cmNlVXJpOiAnCiAgICAgICAgICAgICcke3Jlc3BvbnNlLnN0YXR1c0NvZGV9ICR7cmVzcG9uc2UucmVhc29uUGhyYXNlfSc7CiAgICAgICAgdGhyb3cgbXNnOwogICAgICB9CiAgICAgIHJldHVybiByZXNwb25zZS50b0xpc3QoKTsKICAgIH0pLnRoZW4oKExpc3Q8TGlzdDxpbnQ+PiBzcGxpdENvbnRlbnQpIHsKICAgICAgaW50IHRvdGFsTGVuZ3RoID0gc3BsaXRDb250ZW50LmZvbGQoMCwgKGludCBvbGQsIExpc3QgbGlzdCkgewogICAgICAgIHJldHVybiBvbGQgKyBsaXN0Lmxlbmd0aDsKICAgICAgfSk7CiAgICAgIFVpbnQ4TGlzdCByZXN1bHQgPSBuZXcgVWludDhMaXN0KHRvdGFsTGVuZ3RoKTsKICAgICAgaW50IG9mZnNldCA9IDA7CiAgICAgIGZvciAoTGlzdDxpbnQ+IGNvbnRlbnRQYXJ0IGluIHNwbGl0Q29udGVudCkgewogICAgICAgIHJlc3VsdC5zZXRSYW5nZShvZmZzZXQsIG9mZnNldCArIGNvbnRlbnRQYXJ0Lmxlbmd0aCwgY29udGVudFBhcnQpOwogICAgICAgIG9mZnNldCArPSBjb250ZW50UGFydC5sZW5ndGg7CiAgICAgIH0KICAgICAgZGFydENoYXJhY3RlcnNSZWFkICs9IHRvdGFsTGVuZ3RoOwogICAgICBhcGkuSW5wdXQ8TGlzdDxpbnQ+PiBpbnB1dDsKICAgICAgc3dpdGNoIChpbnB1dEtpbmQpIHsKICAgICAgICBjYXNlIGFwaS5JbnB1dEtpbmQuVVRGODoKICAgICAgICAgIGlucHV0ID0gdXRmOFNvdXJjZUZpbGVzW3Jlc291cmNlVXJpXSA9IG5ldyBDYWNoaW5nVXRmOEJ5dGVzU291cmNlRmlsZSgKICAgICAgICAgICAgICByZXNvdXJjZVVyaSwgcmVzb3VyY2VVcmkudG9TdHJpbmcoKSwgcmVzdWx0KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgYXBpLklucHV0S2luZC5iaW5hcnk6CiAgICAgICAgICBpbnB1dCA9CiAgICAgICAgICAgICAgYmluYXJ5U291cmNlRmlsZXNbcmVzb3VyY2VVcmldID0gbmV3IEJpbmFyeShyZXNvdXJjZVVyaSwgcmVzdWx0KTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHJldHVybiBpbnB1dDsKICAgIH0pOwogIH0KCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMgd2hlbiBubyBsb25nZXIgbmVlZGVkIGZvciB0aGUgb2xkIGNvbXBpbGVyCiAgLy8gQVBJLgogIEZ1dHVyZSAvKiA8TGlzdDxpbnQ+IHwgU3RyaW5nPiAqLyBjYWxsKFVyaSByZXNvdXJjZVVyaSkgewogICAgdGhyb3cgInVuaW1wbGVtZW50ZWQiOwogIH0KCiAgcmVsYXRpdml6ZVVyaShVcmkgdXJpKSA9PiByZWxhdGl2aXplKGN3ZCwgdXJpLCBpc1dpbmRvd3MpOwoKICBTb3VyY2VGaWxlPExpc3Q8aW50Pj4gZ2V0VXRmOFNvdXJjZUZpbGUoVXJpIHJlc291cmNlVXJpKSB7CiAgICByZXR1cm4gdXRmOFNvdXJjZUZpbGVzW3Jlc291cmNlVXJpXTsKICB9CgogIEl0ZXJhYmxlPFVyaT4gZ2V0U291cmNlVXJpcygpIHsKICAgIFNldDxVcmk+IHVyaXMgPSBuZXcgU2V0PFVyaT4oKTsKICAgIHVyaXMuYWRkQWxsKHV0ZjhTb3VyY2VGaWxlcy5rZXlzKTsKICAgIHVyaXMuYWRkQWxsKGJpbmFyeVNvdXJjZUZpbGVzLmtleXMpOwogICAgcmV0dXJuIHVyaXM7CiAgfQp9CgpMaXN0PGludD4gcmVhZEFsbChTdHJpbmcgZmlsZW5hbWUsIHtib29sIHplcm9UZXJtaW5hdGVkOiB0cnVlfSkgewogIFJhbmRvbUFjY2Vzc0ZpbGUgZmlsZSA9IChuZXcgRmlsZShmaWxlbmFtZSkpLm9wZW5TeW5jKCk7CiAgaW50IGxlbmd0aCA9IGZpbGUubGVuZ3RoU3luYygpOwogIGludCBidWZmZXJMZW5ndGggPSBsZW5ndGg7CiAgaWYgKHplcm9UZXJtaW5hdGVkKSB7CiAgICAvLyArMSB0byBoYXZlIGEgMCB0ZXJtaW5hdGVkIGxpc3QsIHNlZSBbU2Nhbm5lcl0uCiAgICBidWZmZXJMZW5ndGgrKzsKICB9CiAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OExpc3QoYnVmZmVyTGVuZ3RoKTsKICBmaWxlLnJlYWRJbnRvU3luYyhidWZmZXIsIDAsIGxlbmd0aCk7CiAgZmlsZS5jbG9zZVN5bmMoKTsKICByZXR1cm4gYnVmZmVyOwp9CgpjbGFzcyBDb21waWxlclNvdXJjZUZpbGVQcm92aWRlciBleHRlbmRzIFNvdXJjZUZpbGVQcm92aWRlciB7CiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMgd2hlbiBubyBsb25nZXIgbmVlZGVkIGZvciB0aGUgb2xkIGNvbXBpbGVyCiAgLy8gQVBJLgogIEBvdmVycmlkZQogIEZ1dHVyZTxMaXN0PGludD4+IGNhbGwoVXJpIHJlc291cmNlVXJpKSA9PgogICAgICByZWFkRnJvbVVyaShyZXNvdXJjZVVyaSkudGhlbigoaW5wdXQpID0+IGlucHV0LmRhdGEpOwoKICBAb3ZlcnJpZGUKICBGdXR1cmU8YXBpLklucHV0PExpc3Q8aW50Pj4+IHJlYWRGcm9tVXJpKFVyaSB1cmksCiAgICAgICAgICB7SW5wdXRLaW5kIGlucHV0S2luZDogSW5wdXRLaW5kLlVURjh9KSA9PgogICAgICByZWFkQnl0ZXNGcm9tVXJpKHVyaSwgaW5wdXRLaW5kKTsKfQoKY2xhc3MgRm9ybWF0dGluZ0RpYWdub3N0aWNIYW5kbGVyIGltcGxlbWVudHMgQ29tcGlsZXJEaWFnbm9zdGljcyB7CiAgZmluYWwgU291cmNlRmlsZVByb3ZpZGVyIHByb3ZpZGVyOwogIGJvb2wgc2hvd1dhcm5pbmdzID0gdHJ1ZTsKICBib29sIHNob3dIaW50cyA9IHRydWU7CiAgYm9vbCB2ZXJib3NlID0gZmFsc2U7CiAgYm9vbCBpc0Fib3J0aW5nID0gZmFsc2U7CiAgYm9vbCBlbmFibGVDb2xvcnMgPSBmYWxzZTsKICBib29sIHRocm93T25FcnJvciA9IGZhbHNlOwogIGJvb2wgYXV0b1JlYWRGaWxlVXJpID0gZmFsc2U7CiAgaW50IHRocm93T25FcnJvckNvdW50ID0gMDsKICBhcGkuRGlhZ25vc3RpYyBsYXN0S2luZCA9IG51bGw7CiAgaW50IGZhdGFsQ291bnQgPSAwOwoKICBmaW5hbCBpbnQgRkFUQUwgPSBhcGkuRGlhZ25vc3RpYy5DUkFTSC5vcmRpbmFsIHwgYXBpLkRpYWdub3N0aWMuRVJST1Iub3JkaW5hbDsKICBmaW5hbCBpbnQgSU5GTyA9CiAgICAgIGFwaS5EaWFnbm9zdGljLklORk8ub3JkaW5hbCB8IGFwaS5EaWFnbm9zdGljLlZFUkJPU0VfSU5GTy5vcmRpbmFsOwoKICBGb3JtYXR0aW5nRGlhZ25vc3RpY0hhbmRsZXIoW1NvdXJjZUZpbGVQcm92aWRlciBwcm92aWRlcl0pCiAgICAgIDogdGhpcy5wcm92aWRlciA9CiAgICAgICAgICAgIChwcm92aWRlciA9PSBudWxsKSA/IG5ldyBDb21waWxlclNvdXJjZUZpbGVQcm92aWRlcigpIDogcHJvdmlkZXI7CgogIHZvaWQgaW5mbyh2YXIgbWVzc2FnZSwgW2FwaS5EaWFnbm9zdGljIGtpbmQgPSBhcGkuRGlhZ25vc3RpYy5WRVJCT1NFX0lORk9dKSB7CiAgICBpZiAoIXZlcmJvc2UgJiYga2luZCA9PSBhcGkuRGlhZ25vc3RpYy5WRVJCT1NFX0lORk8pIHJldHVybjsKICAgIGlmIChlbmFibGVDb2xvcnMpIHsKICAgICAgcHJpbnQoJyR7Y29sb3JzLmdyZWVuKCJJbmZvOiIpfSAkbWVzc2FnZScpOwogICAgfSBlbHNlIHsKICAgICAgcHJpbnQoJ0luZm86ICRtZXNzYWdlJyk7CiAgICB9CiAgfQoKICAvLy8gQWRkcyBba2luZF0gc3BlY2lmaWMgcHJlZml4IHRvIFttZXNzYWdlXS4KICBTdHJpbmcgcHJlZml4TWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgYXBpLkRpYWdub3N0aWMga2luZCkgewogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgYXBpLkRpYWdub3N0aWMuRVJST1I6CiAgICAgICAgcmV0dXJuICdFcnJvcjogJG1lc3NhZ2UnOwogICAgICBjYXNlIGFwaS5EaWFnbm9zdGljLldBUk5JTkc6CiAgICAgICAgcmV0dXJuICdXYXJuaW5nOiAkbWVzc2FnZSc7CiAgICAgIGNhc2UgYXBpLkRpYWdub3N0aWMuSElOVDoKICAgICAgICByZXR1cm4gJ0hpbnQ6ICRtZXNzYWdlJzsKICAgICAgY2FzZSBhcGkuRGlhZ25vc3RpYy5DUkFTSDoKICAgICAgICByZXR1cm4gJ0ludGVybmFsIEVycm9yOiAkbWVzc2FnZSc7CiAgICAgIGNhc2UgYXBpLkRpYWdub3N0aWMuSU5GTzoKICAgICAgY2FzZSBhcGkuRGlhZ25vc3RpYy5WRVJCT1NFX0lORk86CiAgICAgICAgcmV0dXJuICdJbmZvOiAkbWVzc2FnZSc7CiAgICB9CiAgICB0aHJvdyAnVW5leHBlY3RlZCBkaWFnbm9zdGljIGtpbmQ6ICRraW5kICgke2tpbmQub3JkaW5hbH0pJzsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVwb3J0KHZhciBjb2RlLCBVcmkgdXJpLCBpbnQgYmVnaW4sIGludCBlbmQsIFN0cmluZyBtZXNzYWdlLAogICAgICBhcGkuRGlhZ25vc3RpYyBraW5kKSB7CiAgICBpZiAoaXNBYm9ydGluZykgcmV0dXJuOwogICAgaXNBYm9ydGluZyA9IChraW5kID09IGFwaS5EaWFnbm9zdGljLkNSQVNIKTsKCiAgICBib29sIGZhdGFsID0gKGtpbmQub3JkaW5hbCAmIEZBVEFMKSAhPSAwOwogICAgYm9vbCBpc0luZm8gPSAoa2luZC5vcmRpbmFsICYgSU5GTykgIT0gMDsKICAgIGlmIChpc0luZm8gJiYgdXJpID09IG51bGwgJiYga2luZCAhPSBhcGkuRGlhZ25vc3RpYy5JTkZPKSB7CiAgICAgIGluZm8obWVzc2FnZSwga2luZCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBtZXNzYWdlID0gcHJlZml4TWVzc2FnZShtZXNzYWdlLCBraW5kKTsKCiAgICAvLyBbbGFzdEtpbmRdIHJlY29yZHMgdGhlIHByZXZpb3VzIG5vbi1JTkZPIGtpbmQgd2Ugc2F3LgogICAgLy8gVGhpcyBpcyB1c2VkIHRvIHN1cHByZXNzIGluZm8gYWJvdXQgYSB3YXJuaW5nIHdoZW4gd2FybmluZ3MgYXJlCiAgICAvLyBzdXBwcmVzc2VkLCBhbmQgc2ltaWxhciBmb3IgaGludHMuCiAgICBpZiAoa2luZCAhPSBhcGkuRGlhZ25vc3RpYy5JTkZPKSB7CiAgICAgIGxhc3RLaW5kID0ga2luZDsKICAgIH0KICAgIHZhciBjb2xvcjsKICAgIGlmIChraW5kID09IGFwaS5EaWFnbm9zdGljLkVSUk9SKSB7CiAgICAgIGNvbG9yID0gY29sb3JzLnJlZDsKICAgIH0gZWxzZSBpZiAoa2luZCA9PSBhcGkuRGlhZ25vc3RpYy5XQVJOSU5HKSB7CiAgICAgIGlmICghc2hvd1dhcm5pbmdzKSByZXR1cm47CiAgICAgIGNvbG9yID0gY29sb3JzLm1hZ2VudGE7CiAgICB9IGVsc2UgaWYgKGtpbmQgPT0gYXBpLkRpYWdub3N0aWMuSElOVCkgewogICAgICBpZiAoIXNob3dIaW50cykgcmV0dXJuOwogICAgICBjb2xvciA9IGNvbG9ycy5jeWFuOwogICAgfSBlbHNlIGlmIChraW5kID09IGFwaS5EaWFnbm9zdGljLkNSQVNIKSB7CiAgICAgIGNvbG9yID0gY29sb3JzLnJlZDsKICAgIH0gZWxzZSBpZiAoa2luZCA9PSBhcGkuRGlhZ25vc3RpYy5JTkZPKSB7CiAgICAgIGlmIChsYXN0S2luZCA9PSBhcGkuRGlhZ25vc3RpYy5XQVJOSU5HICYmICFzaG93V2FybmluZ3MpIHJldHVybjsKICAgICAgaWYgKGxhc3RLaW5kID09IGFwaS5EaWFnbm9zdGljLkhJTlQgJiYgIXNob3dIaW50cykgcmV0dXJuOwogICAgICBjb2xvciA9IGNvbG9ycy5ncmVlbjsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICdVbmtub3duIGtpbmQ6ICRraW5kICgke2tpbmQub3JkaW5hbH0pJzsKICAgIH0KICAgIGlmICghZW5hYmxlQ29sb3JzKSB7CiAgICAgIGNvbG9yID0gKFN0cmluZyB4KSA9PiB4OwogICAgfQogICAgaWYgKHVyaSA9PSBudWxsKSB7CiAgICAgIHByaW50KCcke2NvbG9yKG1lc3NhZ2UpfScpOwogICAgfSBlbHNlIHsKICAgICAgYXBpLklucHV0IGZpbGUgPSBwcm92aWRlci5nZXRVdGY4U291cmNlRmlsZSh1cmkpOwogICAgICBpZiAoZmlsZSA9PSBudWxsICYmCiAgICAgICAgICBhdXRvUmVhZEZpbGVVcmkgJiYKICAgICAgICAgICh1cmkuc2NoZW1lID09ICdmaWxlJyB8fCAhdXJpLmlzQWJzb2x1dGUpICYmCiAgICAgICAgICB1cmkucGF0aC5lbmRzV2l0aCgnLmRhcnQnKSkgewogICAgICAgIGlmICghdXJpLmlzQWJzb2x1dGUpIHsKICAgICAgICAgIHVyaSA9IHByb3ZpZGVyLmN3ZC5yZXNvbHZlVXJpKHVyaSk7CiAgICAgICAgfQogICAgICAgIC8vIFdoZW4gcmVhZGluZyBmcm9tIC5kaWxsIGZpbGVzLCB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGVzIGhhdmVuJ3QgYmVlbgogICAgICAgIC8vIGxvYWRlZC4gTG9hZCB0aGUgZmlsZSBpZiBwb3NzaWJsZSB0byBwcm92aWRlIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UuCiAgICAgICAgZmlsZSA9IHByb3ZpZGVyLmF1dG9SZWFkRnJvbUZpbGUodXJpKTsKICAgICAgfQogICAgICBpZiAoZmlsZSBpcyBTb3VyY2VGaWxlKSB7CiAgICAgICAgcHJpbnQoZmlsZS5nZXRMb2NhdGlvbk1lc3NhZ2UoY29sb3IobWVzc2FnZSksIGJlZ2luLCBlbmQsCiAgICAgICAgICAgIGNvbG9yaXplOiBjb2xvcikpOwogICAgICB9IGVsc2UgewogICAgICAgIFN0cmluZyBwb3NpdGlvbiA9IGVuZCAtIGJlZ2luID4gMCA/ICdAJGJlZ2luKyR7ZW5kIC0gYmVnaW59JyA6ICcnOwogICAgICAgIHByaW50KCcke3Byb3ZpZGVyLnJlbGF0aXZpemVVcmkodXJpKX0kcG9zaXRpb246XG4nCiAgICAgICAgICAgICcke2NvbG9yKG1lc3NhZ2UpfScpOwogICAgICB9CiAgICB9CiAgICBpZiAoZmF0YWwgJiYgKytmYXRhbENvdW50ID49IHRocm93T25FcnJvckNvdW50ICYmIHRocm93T25FcnJvcikgewogICAgICBpc0Fib3J0aW5nID0gdHJ1ZTsKICAgICAgdGhyb3cgbmV3IEFib3J0TGVnKG1lc3NhZ2UpOwogICAgfQogIH0KCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMgd2hlbiBubyBsb25nZXIgbmVlZGVkIGZvciB0aGUgb2xkIGNvbXBpbGVyCiAgLy8gQVBJLgogIHZvaWQgY2FsbChVcmkgdXJpLCBpbnQgYmVnaW4sIGludCBlbmQsIFN0cmluZyBtZXNzYWdlLCBhcGkuRGlhZ25vc3RpYyBraW5kKSB7CiAgICByZXR1cm4gcmVwb3J0KG51bGwsIHVyaSwgYmVnaW4sIGVuZCwgbWVzc2FnZSwga2luZCk7CiAgfQp9Cgp0eXBlZGVmIHZvaWQgTWVzc2FnZUNhbGxiYWNrKFN0cmluZyBtZXNzYWdlKTsKCmNsYXNzIFJhbmRvbUFjY2Vzc0ZpbGVPdXRwdXRQcm92aWRlciBpbXBsZW1lbnRzIENvbXBpbGVyT3V0cHV0IHsKICBmaW5hbCBVcmkgb3V0OwogIGZpbmFsIFVyaSBzb3VyY2VNYXBPdXQ7CiAgZmluYWwgTWVzc2FnZUNhbGxiYWNrIG9uSW5mbzsKICBmaW5hbCBNZXNzYWdlQ2FsbGJhY2sgb25GYWlsdXJlOwoKICBpbnQgdG90YWxDaGFyYWN0ZXJzV3JpdHRlbiA9IDA7CiAgaW50IHRvdGFsQ2hhcmFjdGVyc1dyaXR0ZW5QcmltYXJ5ID0gMDsKICBpbnQgdG90YWxDaGFyYWN0ZXJzV3JpdHRlbkphdmFTY3JpcHQgPSAwOwogIGludCB0b3RhbERhdGFXcml0dGVuID0gMDsKCiAgTGlzdDxTdHJpbmc+IGFsbE91dHB1dEZpbGVzID0gPFN0cmluZz5bXTsKCiAgUmFuZG9tQWNjZXNzRmlsZU91dHB1dFByb3ZpZGVyKHRoaXMub3V0LCB0aGlzLnNvdXJjZU1hcE91dCwKICAgICAge3RoaXMub25JbmZvLCB0aGlzLm9uRmFpbHVyZX0pOwoKICBVcmkgY3JlYXRlVXJpKFN0cmluZyBuYW1lLCBTdHJpbmcgZXh0ZW5zaW9uLCBPdXRwdXRUeXBlIHR5cGUpIHsKICAgIFVyaSB1cmk7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVbmlmeSBoYW5kbGUgb2YgW25hbWVdIGFuZCBbZXh0ZW5zaW9uXSB0byBwcmVwYXJlCiAgICAvLyBmb3IgdXNpbmcgYSBzaW5nbGUsIHBvc3NpYmx5IHJlbGF0aXZlLCBbdXJpXSBhcyBpbnB1dC4KICAgIHN3aXRjaCAodHlwZSkgewogICAgICBjYXNlIE91dHB1dFR5cGUuanM6CiAgICAgICAgaWYgKG5hbWUgPT0gJycpIHsKICAgICAgICAgIHVyaSA9IG91dDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdXJpID0gb3V0LnJlc29sdmUoJyRuYW1lLiRleHRlbnNpb24nKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgT3V0cHV0VHlwZS5zb3VyY2VNYXA6CiAgICAgICAgaWYgKG5hbWUgPT0gJycpIHsKICAgICAgICAgIHVyaSA9IHNvdXJjZU1hcE91dDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdXJpID0gb3V0LnJlc29sdmUoJyRuYW1lLiRleHRlbnNpb24nKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgT3V0cHV0VHlwZS5qc1BhcnQ6CiAgICAgICAgdXJpID0gb3V0LnJlc29sdmUoJyRuYW1lLiRleHRlbnNpb24nKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBPdXRwdXRUeXBlLmR1bXBJbmZvOgogICAgICBjYXNlIE91dHB1dFR5cGUuZGVmZXJyZWRNYXA6CiAgICAgICAgaWYgKG5hbWUgPT0gJycpIHsKICAgICAgICAgIG5hbWUgPSBvdXQucGF0aFNlZ21lbnRzLmxhc3Q7CiAgICAgICAgfQogICAgICAgIGlmIChleHRlbnNpb24gPT0gJycpIHsKICAgICAgICAgIHVyaSA9IG91dC5yZXNvbHZlKG5hbWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB1cmkgPSBvdXQucmVzb2x2ZSgnJG5hbWUuJGV4dGVuc2lvbicpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBPdXRwdXRUeXBlLmRlYnVnOgogICAgICAgIHVyaSA9IG91dC5yZXNvbHZlKCckbmFtZS4kZXh0ZW5zaW9uJyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgb25GYWlsdXJlKCdVbmtub3duIG91dHB1dCB0eXBlOiAkdHlwZScpOwogICAgfQogICAgcmV0dXJuIHVyaTsKICB9CgogIEBvdmVycmlkZQogIE91dHB1dFNpbmsgY3JlYXRlT3V0cHV0U2luayhTdHJpbmcgbmFtZSwgU3RyaW5nIGV4dGVuc2lvbiwgT3V0cHV0VHlwZSB0eXBlKSB7CiAgICBVcmkgdXJpID0gY3JlYXRlVXJpKG5hbWUsIGV4dGVuc2lvbiwgdHlwZSk7CiAgICBib29sIGlzUHJpbWFyeU91dHB1dCA9IHVyaSA9PSBvdXQ7CgogICAgaWYgKHVyaS5zY2hlbWUgIT0gJ2ZpbGUnKSB7CiAgICAgIG9uRmFpbHVyZSgnVW5oYW5kbGVkIHNjaGVtZSAke3VyaS5zY2hlbWV9IGluICR1cmkuJyk7CiAgICB9CgogICAgUmFuZG9tQWNjZXNzRmlsZSBvdXRwdXQ7CiAgICB0cnkgewogICAgICBvdXRwdXQgPSBuZXcgRmlsZSh1cmkudG9GaWxlUGF0aCgpKS5vcGVuU3luYyhtb2RlOiBGaWxlTW9kZS5XUklURSk7CiAgICB9IG9uIEZpbGVTeXN0ZW1FeGNlcHRpb24gY2F0Y2ggKGUpIHsKICAgICAgb25GYWlsdXJlKCckZScpOwogICAgfQoKICAgIGFsbE91dHB1dEZpbGVzLmFkZChyZWxhdGl2aXplKGN1cnJlbnREaXJlY3RvcnksIHVyaSwgUGxhdGZvcm0uaXNXaW5kb3dzKSk7CgogICAgaW50IGNoYXJhY3RlcnNXcml0dGVuID0gMDsKCiAgICB2b2lkIHdyaXRlU3RyaW5nU3luYyhTdHJpbmcgZGF0YSkgewogICAgICAvLyBXcml0ZSB0aGUgZGF0YSBpbiBjaHVua3Mgb2YgOGtiLCBvdGhlcndpc2Ugd2UgcmlzayBydW5uaW5nIE9PTS4KICAgICAgaW50IGNodW5rU2l6ZSA9IDggKiAxMDI0OwoKICAgICAgaW50IG9mZnNldCA9IDA7CiAgICAgIHdoaWxlIChvZmZzZXQgPCBkYXRhLmxlbmd0aCkgewogICAgICAgIG91dHB1dC53cml0ZVN0cmluZ1N5bmMoCiAgICAgICAgICAgIGRhdGEuc3Vic3RyaW5nKG9mZnNldCwgbWF0aC5taW4ob2Zmc2V0ICsgY2h1bmtTaXplLCBkYXRhLmxlbmd0aCkpKTsKICAgICAgICBvZmZzZXQgKz0gY2h1bmtTaXplOwogICAgICB9CiAgICAgIGNoYXJhY3RlcnNXcml0dGVuICs9IGRhdGEubGVuZ3RoOwogICAgfQoKICAgIHZvaWQgb25Eb25lKCkgewogICAgICBvdXRwdXQuY2xvc2VTeW5jKCk7CiAgICAgIHRvdGFsQ2hhcmFjdGVyc1dyaXR0ZW4gKz0gY2hhcmFjdGVyc1dyaXR0ZW47CiAgICAgIGlmIChpc1ByaW1hcnlPdXRwdXQpIHsKICAgICAgICB0b3RhbENoYXJhY3RlcnNXcml0dGVuUHJpbWFyeSArPSBjaGFyYWN0ZXJzV3JpdHRlbjsKICAgICAgfQogICAgICBpZiAodHlwZSA9PSBPdXRwdXRUeXBlLmpzIHx8IHR5cGUgPT0gT3V0cHV0VHlwZS5qc1BhcnQpIHsKICAgICAgICB0b3RhbENoYXJhY3RlcnNXcml0dGVuSmF2YVNjcmlwdCArPSBjaGFyYWN0ZXJzV3JpdHRlbjsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBuZXcgX091dHB1dFNpbmtXcmFwcGVyKHdyaXRlU3RyaW5nU3luYywgb25Eb25lKTsKICB9CgogIEBvdmVycmlkZQogIEJpbmFyeU91dHB1dFNpbmsgY3JlYXRlQmluYXJ5U2luayhVcmkgdXJpKSB7CiAgICB1cmkgPSBjdXJyZW50RGlyZWN0b3J5LnJlc29sdmVVcmkodXJpKTsKCiAgICBhbGxPdXRwdXRGaWxlcy5hZGQocmVsYXRpdml6ZShjdXJyZW50RGlyZWN0b3J5LCB1cmksIFBsYXRmb3JtLmlzV2luZG93cykpOwoKICAgIGlmICh1cmkuc2NoZW1lICE9ICdmaWxlJykgewogICAgICBvbkZhaWx1cmUoJ1VuaGFuZGxlZCBzY2hlbWUgJHt1cmkuc2NoZW1lfSBpbiAkdXJpLicpOwogICAgfQoKICAgIFJhbmRvbUFjY2Vzc0ZpbGUgb3V0cHV0OwogICAgdHJ5IHsKICAgICAgb3V0cHV0ID0gbmV3IEZpbGUodXJpLnRvRmlsZVBhdGgoKSkub3BlblN5bmMobW9kZTogRmlsZU1vZGUuV1JJVEUpOwogICAgfSBvbiBGaWxlU3lzdGVtRXhjZXB0aW9uIGNhdGNoIChlKSB7CiAgICAgIG9uRmFpbHVyZSgnJGUnKTsKICAgIH0KCiAgICBpbnQgYnl0ZXNXcml0dGVuID0gMDsKCiAgICB2b2lkIHdyaXRlQnl0ZXNTeW5jKExpc3Q8aW50PiBkYXRhLCBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pIHsKICAgICAgb3V0cHV0LndyaXRlRnJvbVN5bmMoZGF0YSwgc3RhcnQsIGVuZCk7CiAgICAgIGJ5dGVzV3JpdHRlbiArPSAoZW5kID8/IGRhdGEubGVuZ3RoKSAtIHN0YXJ0OwogICAgfQoKICAgIHZvaWQgb25Eb25lKCkgewogICAgICBvdXRwdXQuY2xvc2VTeW5jKCk7CiAgICAgIHRvdGFsRGF0YVdyaXR0ZW4gKz0gYnl0ZXNXcml0dGVuOwogICAgfQoKICAgIHJldHVybiBuZXcgX0JpbmFyeU91dHB1dFNpbmtXcmFwcGVyKHdyaXRlQnl0ZXNTeW5jLCBvbkRvbmUpOwogIH0KfQoKY2xhc3MgUmFuZG9tQWNjZXNzQmluYXJ5T3V0cHV0U2luayBpbXBsZW1lbnRzIGFwaS5CaW5hcnlPdXRwdXRTaW5rIHsKICBmaW5hbCBSYW5kb21BY2Nlc3NGaWxlIG91dHB1dDsKCiAgUmFuZG9tQWNjZXNzQmluYXJ5T3V0cHV0U2luayhVcmkgdXJpKQogICAgICA6IG91dHB1dCA9IG5ldyBGaWxlLmZyb21VcmkodXJpKS5vcGVuU3luYyhtb2RlOiBGaWxlTW9kZS53cml0ZSk7CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGUoTGlzdDxpbnQ+IGJ1ZmZlciwgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKSB7CiAgICBvdXRwdXQud3JpdGVGcm9tU3luYyhidWZmZXIsIHN0YXJ0LCBlbmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjbG9zZSgpIHsKICAgIG91dHB1dC5jbG9zZVN5bmMoKTsKICB9Cn0KCmNsYXNzIF9PdXRwdXRTaW5rV3JhcHBlciBleHRlbmRzIE91dHB1dFNpbmsgewogIHZvaWQgRnVuY3Rpb24oU3RyaW5nKSBvbkFkZDsKICB2b2lkIEZ1bmN0aW9uKCkgb25DbG9zZTsKCiAgX091dHB1dFNpbmtXcmFwcGVyKHRoaXMub25BZGQsIHRoaXMub25DbG9zZSk7CgogIEBvdmVycmlkZQogIHZvaWQgYWRkKFN0cmluZyBkYXRhKSA9PiBvbkFkZChkYXRhKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBjbG9zZSgpID0+IG9uQ2xvc2UoKTsKfQoKY2xhc3MgX0JpbmFyeU91dHB1dFNpbmtXcmFwcGVyIGV4dGVuZHMgQmluYXJ5T3V0cHV0U2luayB7CiAgdm9pZCBGdW5jdGlvbihMaXN0PGludD4sIFtpbnQsIGludF0pIG9uV3JpdGU7CiAgdm9pZCBGdW5jdGlvbigpIG9uQ2xvc2U7CgogIF9CaW5hcnlPdXRwdXRTaW5rV3JhcHBlcih0aGlzLm9uV3JpdGUsIHRoaXMub25DbG9zZSk7CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGUoTGlzdDxpbnQ+IGRhdGEsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgPT4KICAgICAgb25Xcml0ZShkYXRhLCBzdGFydCwgZW5kKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBjbG9zZSgpID0+IG9uQ2xvc2UoKTsKfQoKLy8vIEFkYXB0ZXIgdG8gaW50ZWdyYXRlIGRhcnQyanMgaW4gYmF6ZWwuCi8vLwovLy8gVG8gaGFuZGxlIGJhemVsJ3Mgc3BlY2lhbCBsYXlvdXQ6Ci8vLwovLy8gICogV2Ugc3BlY2lmeSBhIC5wYWNrYWdlcyBjb25maWd1cmF0aW9uIGZpbGUgdGhhdCBleHBhbmRzIHBhY2thZ2VzIHRvIHRoZWlyCi8vLyAgICBjb3JyZXNwb25kaW5nIGJhemVsIGxvY2F0aW9uLiBUaGlzIHdheSB0aGVyZSBpcyBubyBuZWVkIHRvIGNyZWF0ZSBhIHB1YgovLy8gICAgY2FjaGUgcHJpb3IgdG8gaW52b2tpbmcgZGFydDJqcy4KLy8vCi8vLyAgKiBXZSBwcm92aWRlIGFuIGltcGxpY2l0IG1hcHBpbmcgdGhhdCBjYW4gbWFrZSBhbGwgdXJscyByZWxhdGl2ZSB0byB0aGUKLy8vICBiYXplbCByb290LgovLy8gICAgVG8gdGhlIGNvbXBpbGVyLCBVUklzIGxvb2sgbGlrZToKLy8vICAgICAgZmlsZTovLy9iYXplbC1yb290L2EvYi9jLmRhcnQKLy8vCi8vLyAgICBldmVuIHRob3VnaCBpbiB0aGUgZmlsZSBzeXN0ZW0gdGhlIGZpbGUgaXMgbG9jYXRlZCBhdDoKLy8vICAgICAgZmlsZTovLy9wYXRoL3RvL3RoZS9hY3R1YWwvYmF6ZWwvcm9vdC9hL2IvYy5kYXJ0Ci8vLwovLy8gICAgVGhpcyBtYXBwaW5nIHNlcnZlcyB0d28gcHVycG9zZXM6Ci8vLyAgICAgIC0gSXQgbWFrZXMgY29tcGlsZXIgcmVzdWx0cyBpbmRlcGVuZGVudCBvZiB0aGUgbWFjaGluZSBsYXlvdXQsIHdoaWNoCi8vLyAgICAgICAgZW5hYmxlcyB1cyB0byBzaGFyZSByZXN1bHRzIGFjcm9zcyBiYXplbCBydW5zIGFuZCBhY3Jvc3MgbWFjaGluZXMuCi8vLwovLy8gICAgICAtIEl0IGhpZGVzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGdlbmVyYXRlZCBhbmQgc291cmNlIGZpbGVzLiBUaGF0IHdheQovLy8gICAgICB3ZSBjYW4gdXNlIHRoZSBzdGFuZGFyZCBwYWNrYWdlLXJlc29sdXRpb24gbWVjaGFuaXNtIGFuZCBpZ25vcmUgdGhlCi8vLyAgICAgIGludGVybmFscyBvZiBob3cgZmlsZXMgYXJlIG9yZ2FuaXplZCB3aXRoaW4gYmF6ZWwuCi8vLwovLy8gV2hlbiBpbnZva2luZyB0aGUgY29tcGlsZXIsIGJhemVsIHdpbGwgdXNlIGBwYWNrYWdlOmAgYW5kCi8vLyBgZmlsZTovLy9iYXplbC1yb290L2AgVVJJcyB0byBzcGVjaWZ5IGVudHJ5cG9pbnRzLgovLy8KLy8vIFRoZSBtYXBwaW5nIGlzIHNwZWNpZmllZCB1c2luZyBzZWFyY2ggcGF0aHMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQKLy8vIGRpcmVjdG9yeS4gV2hlbiB0aGlzIHByb3ZpZGVyIGxvb2tzIHVwIGEgZmlsZSwgdGhlIGJhemVsLXJvb3QgZm9sZGVyIGlzCi8vLyByZXBsYWNlZCBieSB0aGUgZmlyc3QgZGlyZWN0b3J5IGluIHRoZSBzZWFyY2ggcGF0aCBjb250YWluaW5nIHRoZSBmaWxlLCBpZgovLy8gYW55LiBGb3IgZXhhbXBsZSwgZ2l2ZW4gdGhlIHNlYXJjaCBwYXRoICIuLGJhemVsLWJpbi8iLCBhbmQgYSBVUkwKLy8vIG9mIHRoZSBmb3JtIGBmaWxlOi8vL2JhemVsLXJvb3QvYS9iLmRhcnRgLCB0aGlzIHByb3ZpZGVyIHdpbGwgY2hlY2sgaWYgdGhlCi8vLyBmaWxlIGV4aXN0cyB1bmRlciAiLi9hL2IuZGFydCIsIHRoZW4gY2hlY2sgdW5kZXIgImJhemVsLWJpbi9hL2IuZGFydCIuICBJZgovLy8gbm9uZSBvZiB0aGUgcGF0aHMgbWF0Y2hlcywgaXQgd2lsbCBhdHRlbXB0IHRvIGxvYWQgdGhlIGZpbGUgZnJvbQovLy8gYC9iYXplbC1yb290L2EvYi5kYXJ0YCB3aGljaCB3aWxsIGxpa2VseSBmYWlsLgpjbGFzcyBCYXplbElucHV0UHJvdmlkZXIgZXh0ZW5kcyBTb3VyY2VGaWxlUHJvdmlkZXIgewogIGZpbmFsIExpc3Q8VXJpPiBkaXJzOwoKICBCYXplbElucHV0UHJvdmlkZXIoTGlzdDxTdHJpbmc+IHNlYXJjaFBhdGhzKQogICAgICA6IGRpcnMgPSBzZWFyY2hQYXRocy5tYXAoX3Jlc29sdmUpLnRvTGlzdCgpOwoKICBzdGF0aWMgVXJpIF9yZXNvbHZlKFN0cmluZyBwYXRoKSA9PiBjdXJyZW50RGlyZWN0b3J5LnJlc29sdmUocGF0aCk7CgogIEBvdmVycmlkZQogIEZ1dHVyZTxhcGkuSW5wdXQ8TGlzdDxpbnQ+Pj4gcmVhZEZyb21VcmkoVXJpIHVyaSwKICAgICAge0lucHV0S2luZCBpbnB1dEtpbmQ6IElucHV0S2luZC5VVEY4fSkgYXN5bmMgewogICAgdmFyIHJlc29sdmVkVXJpID0gdXJpOwogICAgdmFyIHBhdGggPSB1cmkucGF0aDsKICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoJy9iYXplbC1yb290JykpIHsKICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKCcvYmF6ZWwtcm9vdC8nLmxlbmd0aCk7CiAgICAgIGZvciAodmFyIGRpciBpbiBkaXJzKSB7CiAgICAgICAgdmFyIGZpbGUgPSBkaXIucmVzb2x2ZShwYXRoKTsKICAgICAgICBpZiAoYXdhaXQgbmV3IEZpbGUuZnJvbVVyaShmaWxlKS5leGlzdHMoKSkgewogICAgICAgICAgcmVzb2x2ZWRVcmkgPSBmaWxlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBhcGkuSW5wdXQ8TGlzdDxpbnQ+PiByZXN1bHQgPQogICAgICAgIGF3YWl0IHJlYWRCeXRlc0Zyb21VcmkocmVzb2x2ZWRVcmksIGlucHV0S2luZCk7CiAgICBzd2l0Y2ggKGlucHV0S2luZCkgewogICAgICBjYXNlIElucHV0S2luZC5VVEY4OgogICAgICAgIHV0ZjhTb3VyY2VGaWxlc1t1cmldID0gdXRmOFNvdXJjZUZpbGVzW3Jlc29sdmVkVXJpXTsKICAgICAgICBicmVhazsKICAgICAgY2Fz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b3VsZCBzcGxpdCBhcmd1bWVudHMuIElmIFt3aW5kb3dzXQovLy8gaXMgYHRydWVgIGVzY2FwZXMgd2lsbCBiZSBoYW5kbGVkIGxpa2Ugb24gdGhlIFdpbmRvd3MgY29tbWFuZC1saW5lLgovLy8KLy8vIEV4YW1wbGU6Ci8vLwovLy8gICAgIHNwbGl0bGluZSgiIiItLWFyZ3MgImFiImMgJ3dpdGggIiBcJ3NwYWNlcyciIiIpLmZvckVhY2gocHJpbnQpOwovLy8gICAgIC8vIC0tYXJncwovLy8gICAgIC8vIGFiYwovLy8gICAgIC8vIHdpdGggIiAnc3BhY2VzCkxpc3Q8U3RyaW5nPiBzcGxpdExpbmUoU3RyaW5nIGxpbmUsIHtib29sIHdpbmRvd3M6IGZhbHNlfSkgewogIExpc3Q8U3RyaW5nPiByZXN1bHQgPSA8U3RyaW5nPltdOwogIGJvb2wgaW5RdW90ZXMgPSBmYWxzZTsKICBTdHJpbmcgb3BlbmluZ1F1b3RlOwogIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7CiAgICBTdHJpbmcgYyA9IGxpbmVbaV07CiAgICBpZiAoaW5RdW90ZXMgJiYgYyA9PSBvcGVuaW5nUXVvdGUpIHsKICAgICAgaW5RdW90ZXMgPSBmYWxzZTsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAoIWluUXVvdGVzICYmIChjID09ICciJyB8fCAoYyA9PSAiJyIgJiYgIXdpbmRvd3MpKSkgewogICAgICBpblF1b3RlcyA9IHRydWU7CiAgICAgIG9wZW5pbmdRdW90ZSA9IGM7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKGMgPT0gJ1xcJykgewogICAgICBpZiAoaSA9PSBsaW5lLmxlbmd0aCAtIDEpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKCJVbmZpbmlzaGVkIGVzY2FwZTogJGxpbmUiKTsKICAgICAgfQogICAgICBpZiAod2luZG93cykgewogICAgICAgIFN0cmluZyBuZXh0ID0gbGluZVtpICsgMV07CiAgICAgICAgaWYgKG5leHQgPT0gJyInIHx8IG5leHQgPT0gcidcJykgewogICAgICAgICAgYnVmZmVyLndyaXRlKG5leHQpOwogICAgICAgICAgaSsrOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGkrKzsKCiAgICAgICAgYyA9IGxpbmVbaV07CiAgICAgICAgU3RyaW5nIG1hcHBlZCA9IEVTQ0FQRV9NQVBQSU5HW2NdOwogICAgICAgIGlmIChtYXBwZWQgPT0gbnVsbCkgbWFwcGVkID0gYzsKICAgICAgICBidWZmZXIud3JpdGUobWFwcGVkKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgfQogICAgaWYgKCFpblF1b3RlcyAmJiBjID09ICIgIikgewogICAgICBpZiAoYnVmZmVyLmlzTm90RW1wdHkpIHJlc3VsdC5hZGQoYnVmZmVyLnRvU3RyaW5nKCkpOwogICAgICBidWZmZXIuY2xlYXIoKTsKICAgICAgY29udGludWU7CiAgICB9CiAgICBidWZmZXIud3JpdGUoYyk7CiAgfQogIGlmIChpblF1b3RlcykgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiVW5jbG9zZWQgcXVvdGVzOiAkbGluZSIpOwogIGlmIChidWZmZXIuaXNOb3RFbXB0eSkgcmVzdWx0LmFkZChidWZmZXIudG9TdHJpbmcoKSk7CiAgcmV0dXJuIHJlc3VsdDsKfQpOAE5OPAEjAUAESS0NDQ0NDQ0OAwFPSAQNBEgSDxo9JBkXLCoYKRgQBj0XGBAGFSI/CBUjKx4PFAoPDQEVKygeEggGITwWEAYVBEU4EQIBK3BhY2thZ2U6Y29tcGlsZXIvc3JjL3V0aWwvY29tbWFuZF9saW5lLmRhcnQyc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvdXRpbC91cmlfZXh0cmFzLmRhcnSIcy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IHVyaV9leHRyYXM7CgppbXBvcnQgJ2RhcnQ6bWF0aCc7CgpTdHJpbmcgcmVsYXRpdml6ZShVcmkgYmFzZSwgVXJpIHVyaSwgYm9vbCBpc1dpbmRvd3MpIHsKICBib29sIGVxdWFsc05DUyhTdHJpbmcgYSwgU3RyaW5nIGIpIHsKICAgIHJldHVybiBhLnRvTG93ZXJDYXNlKCkgPT0gYi50b0xvd2VyQ2FzZSgpOwogIH0KCiAgaWYgKCFlcXVhbHNOQ1MoYmFzZS5zY2hlbWUsIHVyaS5zY2hlbWUpIHx8CiAgICAgIGVxdWFsc05DUyhiYXNlLnNjaGVtZSwgJ2RhcnQnKSB8fAogICAgICBlcXVhbHNOQ1MoYmFzZS5zY2hlbWUsICdwYWNrYWdlJykpIHsKICAgIHJldHVybiB1cmkudG9TdHJpbmcoKTsKICB9CgogIGlmICghZXF1YWxzTkNTKGJhc2Uuc2NoZW1lLCAnZmlsZScpKSB7CiAgICBpc1dpbmRvd3MgPSBmYWxzZTsKICB9CgogIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIHBhdGgpIHsKICAgIGlmIChpc1dpbmRvd3MpIHsKICAgICAgcmV0dXJuIHBhdGgudG9Mb3dlckNhc2UoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBwYXRoOwogICAgfQogIH0KCiAgaWYgKGJhc2UudXNlckluZm8gPT0gdXJpLnVzZXJJbmZvICYmCiAgICAgIGVxdWFsc05DUyhiYXNlLmhvc3QsIHVyaS5ob3N0KSAmJgogICAgICBiYXNlLnBvcnQgPT0gdXJpLnBvcnQgJiYKICAgICAgdXJpLnF1ZXJ5ID09ICIiICYmCiAgICAgIHVyaS5mcmFnbWVudCA9PSAiIikgewogICAgaWYgKG5vcm1hbGl6ZSh1cmkucGF0aCkuc3RhcnRzV2l0aChub3JtYWxpemUoYmFzZS5wYXRoKSkpIHsKICAgICAgcmV0dXJuIHVyaS5wYXRoLnN1YnN0cmluZyhiYXNlLnBhdGgubGFzdEluZGV4T2YoJy8nKSArIDEpOwogICAgfQoKICAgIGlmICghYmFzZS5wYXRoLnN0YXJ0c1dpdGgoJy8nKSB8fCAhdXJpLnBhdGguc3RhcnRzV2l0aCgnLycpKSB7CiAgICAgIHJldHVybiB1cmkudG9TdHJpbmcoKTsKICAgIH0KCiAgICBMaXN0PFN0cmluZz4gdXJpUGFydHMgPSB1cmkucGF0aC5zcGxpdCgnLycpOwogICAgTGlzdDxTdHJpbmc+IGJhc2VQYXJ0cyA9IGJhc2UucGF0aC5zcGxpdCgnLycpOwogICAgaW50IGNvbW1vbiA9IDA7CiAgICBpbnQgbGVuZ3RoID0gbWluKHVyaVBhcnRzLmxlbmd0aCwgYmFzZVBhcnRzLmxlbmd0aCk7CiAgICB3aGlsZSAoY29tbW9uIDwgbGVuZ3RoICYmCiAgICAgICAgbm9ybWFsaXplKHVyaVBhcnRzW2NvbW1vbl0pID09IG5vcm1hbGl6ZShiYXNlUGFydHNbY29tbW9uXSkpIHsKICAgICAgY29tbW9uKys7CiAgICB9CiAgICBpZiAoY29tbW9uID09IDEgfHwgKGlzV2luZG93cyAmJiBjb21tb24gPT0gMikpIHsKICAgICAgLy8gVGhlIGZpcnN0IHBhcnQgd2lsbCBhbHdheXMgYmUgYW4gZW1wdHkgc3RyaW5nIGJlY2F1c2UgdGhlCiAgICAgIC8vIHBhdGhzIGFyZSBhYnNvbHV0ZS4gT24gV2luZG93cywgd2UgbXVzdCBhbHNvIGNvbnNpZGVyIGRyaXZlCiAgICAgIC8vIGxldHRlcnMgb3IgaG9zdG5hbWVzLgogICAgICBpZiAoYmFzZVBhcnRzLmxlbmd0aCA+IGNvbW1vbiArIDEpIHsKICAgICAgICAvLyBBdm9pZCB1c2luZyAnLi4nIHRvIGdvIHRvIHRoZSByb290LCB1bmxlc3Mgd2UgYXJlIGFscmVhZHkgdGhlcmUuCiAgICAgICAgcmV0dXJuIHVyaS5wYXRoOwogICAgICB9CiAgICB9CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBmb3IgKGludCBpID0gY29tbW9uICsgMTsgaSA8IGJhc2VQYXJ0cy5sZW5ndGg7IGkrKykgewogICAgICBzYi53cml0ZSgnLi4vJyk7CiAgICB9CiAgICBmb3IgKGludCBpID0gY29tbW9uOyBpIDwgdXJpUGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgIHNiLndyaXRlKCcke3VyaVBhcnRzW2ldfS8nKTsKICAgIH0KICAgIHNiLndyaXRlKCcke3VyaVBhcnRzLmxhc3R9Jyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CiAgcmV0dXJuIHVyaS50b1N0cmluZygpOwp9CksATk48ARQBFAE3Jy8EAS0oKxsEASkXBAEiFSENEwYEAScoHxkcQEEGAUMdBgExMxQ5HkcQBjVDRR8rTBkIBio6FwY5IwYiGgQZAgEpcGFja2FnZTpjb21waWxlci9zcmMvdXRpbC91cmlfZXh0cmFzLmRhcnQsc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvdXRpbC91dGlsLmRhcnSifC8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMudXRpbDsKCmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV91bnN0YWJsZS9kYXJ0MmpzLmRhcnQnCiAgICBzaG93ICRCQUNLU0xBU0gsICRDUiwgJERFTCwgJERRLCAkTEYsICRMUywgJFBTLCAkVEFCLCBMaW5rLCBMaW5rQnVpbGRlcjsKCmV4cG9ydCAnZW1wdHlzZXQuZGFydCc7CmV4cG9ydCAnbWFwbGV0LmRhcnQnOwpleHBvcnQgJ3NldGxldC5kYXJ0JzsKCnBhcnQgJ2luZGVudGF0aW9uLmRhcnQnOwoKLy8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGNyZWF0aW5nIGhhc2ggY29kZXMuCmNsYXNzIEhhc2hpbmcgewogIC8vLyBJZiBhbiBpbnRlZ2VyIGlzIG1hc2tlZCBieSB0aGlzIGNvbnN0YW50LCB0aGUgcmVzdWx0IGlzIGd1YXJhbnRlZWQgdG8gYmUKICAvLy8gaW4gU21pIHJhbmdlLgogIHN0YXRpYyBjb25zdCBpbnQgU01JX01BU0sgPSAweDNmZmZmZmZmOwoKICAvLy8gTWl4IHRoZSBiaXRzIG9mIFt2YWx1ZV0gYW5kIG1lcmdlIHRoZW0gd2l0aCBbZXhpc3RpbmddLgogIHN0YXRpYyBpbnQgbWl4SGFzaENvZGVCaXRzKGludCBleGlzdGluZywgaW50IHZhbHVlKSB7CiAgICAvLyBTcHJlYWQgdGhlIGJpdHMgb2YgdmFsdWUuIFRyeSB0byBzdGF5IGluIHRoZSAzMC1iaXQgcmFuZ2UgdG8KICAgIC8vIGF2b2lkIG92ZXJmbG93aW5nIGludG8gYSBtb3JlIGV4cGVuc2l2ZSBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uLgogICAgaW50IGggPSB2YWx1ZSAmIDB4MWZmZmZmZmY7CiAgICBoICs9ICgoaCAmIDB4M2ZmZikgPDwgMTUpIF4gMHgxZmZmY2Q3ZDsKICAgIGggXj0gKGggPj4gMTApOwogICAgaCArPSAoKGggJiAweDNmZmZmZmYpIDw8IDMpOwogICAgaCBePSAoaCA+PiA2KTsKICAgIGggKz0gKChoICYgMHg3ZmZmZmZmKSA8PCAyKSArICgoaCAmIDB4N2ZmZikgPDwgMTQpOwogICAgaCBePSAoaCA+PiAxNik7CiAgICAvLyBDb21iaW5lIHRoZSB0d28gaGFzaCB2YWx1ZXMuCiAgICBpbnQgaGlnaCA9IGV4aXN0aW5nID4+IDE1OwogICAgaW50IGxvdyA9IGV4aXN0aW5nICYgMHg3ZmZmOwogICAgcmV0dXJuICgoaGlnaCAqIDEzKSBeIChsb3cgKiA5OTcpIF4gaCkgJiBTTUlfTUFTSzsKICB9CgogIC8vLyBNaXggdGhlIGJpdHMgb2YgYG9iamVjdC5oYXNoQ29kZWAgd2l0aCBbZXhpc3RpbmddLgogIHN0YXRpYyBpbnQgb2JqZWN0SGFzaChPYmplY3Qgb2JqZWN0LCBbaW50IGV4aXN0aW5nID0gMF0pIHsKICAgIHJldHVybiBtaXhIYXNoQ29kZUJpdHMoZXhpc3RpbmcsIG9iamVjdC5oYXNoQ29kZSk7CiAgfQoKICAvLy8gTWl4IHRoZSBiaXRzIG9mIGAuaGFzaENvZGVgIGFsbCBub24tbnVsbCBvYmplY3RzLgogIHN0YXRpYyBpbnQgb2JqZWN0c0hhc2goT2JqZWN0IG9iajEsCiAgICAgIFtPYmplY3Qgb2JqMiwgT2JqZWN0IG9iajMsIE9iamVjdCBvYmo0LCBPYmplY3Qgb2JqNV0pIHsKICAgIGludCBoYXNoID0gMDsKICAgIGlmIChvYmo1ICE9IG51bGwpIGhhc2ggPSBvYmplY3RIYXNoKG9iajUsIGhhc2gpOwogICAgaWYgKG9iajQgIT0gbnVsbCkgaGFzaCA9IG9iamVjdEhhc2gob2JqNCwgaGFzaCk7CiAgICBpZiAob2JqMyAhPSBudWxsKSBoYXNoID0gb2JqZWN0SGFzaChvYmozLCBoYXNoKTsKICAgIGlmIChvYmoyICE9IG51bGwpIGhhc2ggPSBvYmplY3RIYXNoKG9iajIsIGhhc2gpOwogICAgcmV0dXJuIG9iamVjdEhhc2gob2JqMSwgaGFzaCk7CiAgfQoKICAvLy8gTWl4IHRoZSBiaXRzIG9mIHRoZSBlbGVtZW50IGhhc2ggY29kZXMgb2YgW2xpc3RdIHdpdGggW2V4aXN0aW5nXS4KICBzdGF0aWMgaW50IGxpc3RIYXNoKExpc3QgbGlzdCwgW2ludCBleGlzdGluZyA9IDBdKSB7CiAgICBpbnQgaCA9IGV4aXN0aW5nOwogICAgaWYgKGxpc3QgIT0gbnVsbCkgewogICAgICBpbnQgbGVuZ3RoID0gbGlzdC5sZW5ndGg7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICBoID0gbWl4SGFzaENvZGVCaXRzKGgsIGxpc3RbaV0uaGFzaENvZGUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaDsKICB9CgogIC8vLyBNaXggdGhlIGJpdHMgb2YgdGhlIGVsZW1lbnQgaGFzaCBjb2RlcyBvZiBbaXRlcmFibGVdIHdpdGggW2V4aXN0aW5nXS4KICBzdGF0aWMgaW50IHNldEhhc2g8RT4oSXRlcmFibGU8RT4gaXRlcmFibGUsIFtpbnQgZXhpc3RpbmcgPSAwXSkgewogICAgaW50IGggPSBleGlzdGluZzsKICAgIGlmIChpdGVyYWJsZSAhPSBudWxsKSB7CiAgICAgIGZvciAoRSBlIGluIGl0ZXJhYmxlKSB7CiAgICAgICAgaCArPSBvYmplY3RzSGFzaChlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGggJiBTTUlfTUFTSzsKICB9CgogIC8vLyBNaXggdGhlIGJpdHMgb2YgdGhlIGhhc2ggY29kZXMgb2YgdGhlIHVub3JkZXJlZCBrZXkvdmFsdWUgZnJvbSBbbWFwXSB3aXRoCiAgLy8vIFtleGlzdGluZ10uCiAgc3RhdGljIGludCB1bm9yZGVyZWRNYXBIYXNoKE1hcCBtYXAsIFtpbnQgZXhpc3RpbmcgPSAwXSkgewogICAgaW50IGggPSAwOwogICAgZm9yICh2YXIga2V5IGluIG1hcC5rZXlzKSB7CiAgICAgIGggXj0gb2JqZWN0SGFzaChrZXksIG9iamVjdEhhc2gobWFwW2tleV0pKTsKICAgIH0KICAgIHJldHVybiBtaXhIYXNoQ29kZUJpdHMoaCwgZXhpc3RpbmcpOwogIH0KCiAgLy8vIE1peCB0aGUgYml0cyBvZiB0aGUga2V5L3ZhbHVlIGhhc2ggY29kZXMgZnJvbSBbbWFwXSB3aXRoIFtleGlzdGluZ10uCiAgc3RhdGljIGludCBtYXBIYXNoKE1hcCBtYXAsIFtpbnQgZXhpc3RpbmcgPSAwXSkgewogICAgaW50IGggPSBleGlzdGluZzsKICAgIGZvciAodmFyIGtleSBpbiBtYXAua2V5cykgewogICAgICBoID0gbWl4SGFzaENvZGVCaXRzKGgsIGtleS5oYXNoQ29kZSk7CiAgICAgIGggPSBtaXhIYXNoQ29kZUJpdHMoaCwgbWFwW2tleV0uaGFzaENvZGUpOwogICAgfQogICAgcmV0dXJuIGg7CiAgfQp9Cgpib29sIGVxdWFsRWxlbWVudHM8RT4oTGlzdDxFPiBhLCBMaXN0PEU+IGIpIHsKICBpZiAoaWRlbnRpY2FsKGEsIGIpKSByZXR1cm4gdHJ1ZTsKICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBhLmxlbmd0aDsgaW5kZXgrKykgewogICAgaWYgKGFbaW5kZXhdICE9IGJbaW5kZXhdKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgcmV0dXJuIHRydWU7Cn0KCmJvb2wgZXF1YWxTZXRzPEU+KFNldDxFPiBhLCBTZXQ8RT4gYikgewogIGlmIChpZGVudGljYWwoYSwgYikpIHJldHVybiB0cnVlOwogIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgcmV0dXJuIGEubGVuZ3RoID09IGIubGVuZ3RoICYmIGEuY29udGFpbnNBbGwoYikgJiYgYi5jb250YWluc0FsbChhKTsKfQoKYm9vbCBlcXVhbE1hcHM8SywgVj4oTWFwPEssIFY+IGEsIE1hcDxLLCBWPiBiKSB7CiAgaWYgKGlkZW50aWNhbChhLCBiKSkgcmV0dXJuIHRydWU7CiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBmYWxzZTsKICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTsKICBmb3IgKEsga2V5IGluIGEua2V5cykgewogICAgaWYgKGFba2V5XSAhPSBiW2tleV0pIHJldHVybiBmYWxzZTsKICB9CiAgcmV0dXJuIHRydWU7Cn0KCi8vLyBGaWxlIG5hbWUgcHJlZml4IHVzZWQgdG8gc2hvcnRlbiB0aGUgZmlsZSBuYW1lIGluIHN0YWNrIHRyYWNlcyBwcmludGVkIGJ5Ci8vLyBbdHJhY2VdLgpTdHJpbmcgc3RhY2tUcmFjZUZpbGVQcmVmaXggPSBudWxsOwoKLy8vIFdyaXRlcyB0aGUgY2hhcmFjdGVycyBvZiBbc3RyaW5nXSBvbiBbYnVmZmVyXS4gIFRoZSBjaGFyYWN0ZXJzCi8vLyBhcmUgZXNjYXBlZCBhcyBzdWl0YWJsZSBmb3IgSmF2YVNjcmlwdCBhbmQgSlNPTi4gIFtidWZmZXJdIGlzCi8vLyBhbnl0aGluZyB3aGljaCBzdXBwb3J0cyBbOndyaXRlOl0gYW5kIFs6d3JpdGVDaGFyQ29kZTpdLCBmb3IgZXhhbXBsZSwKLy8vIFtTdHJpbmdCdWZmZXJdLiAgTm90ZSB0aGF0IEpTIHN1cHBvcnRzIFx4bm4gYW5kIFx1bm5ubiB3aGVyZWFzIEpTT04gb25seQovLy8gc3VwcG9ydHMgdGhlIFx1bm5ubiBub3RhdGlvbi4gIFRoZXJlZm9yZSB3ZSB1c2UgdGhlIFx1bm5ubiBub3RhdGlvbi4Kdm9pZCB3cml0ZUpzb25Fc2NhcGVkQ2hhcnNPbihTdHJpbmcgc3RyaW5nLCBidWZmZXIpIHsKICB2b2lkIGFkZENvZGVVbml0RXNjYXBlZCh2YXIgYnVmZmVyLCBpbnQgY29kZSkgewogICAgYXNzZXJ0KGNvZGUgPCAweDEwMDAwKTsKICAgIGJ1ZmZlci53cml0ZShyJ1x1Jyk7CiAgICBpZiAoY29kZSA8IDB4MTAwMCkgewogICAgICBidWZmZXIud3JpdGUoJzAnKTsKICAgICAgaWYgKGNvZGUgPCAweDEwMCkgewogICAgICAgIGJ1ZmZlci53cml0ZSgnMCcpOwogICAgICAgIGlmIChjb2RlIDwgMHgxMCkgewogICAgICAgICAgYnVmZmVyLndyaXRlKCcwJyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBidWZmZXIud3JpdGUoY29kZS50b1JhZGl4U3RyaW5nKDE2KSk7CiAgfQoKICB2b2lkIHdyaXRlRXNjYXBlZE9uKFN0cmluZyBzdHJpbmcsIHZhciBidWZmZXIpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aDsgaSsrKSB7CiAgICAgIGludCBjb2RlID0gc3RyaW5nLmNvZGVVbml0QXQoaSk7CiAgICAgIGlmIChjb2RlID09ICREUSkgewogICAgICAgIGJ1ZmZlci53cml0ZShyJ1wiJyk7CiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSAkVEFCKSB7CiAgICAgICAgYnVmZmVyLndyaXRlKHInXHQnKTsKICAgICAgfSBlbHNlIGlmIChjb2RlID09ICRMRikgewogICAgICAgIGJ1ZmZlci53cml0ZShyJ1xuJyk7CiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSAkQ1IpIHsKICAgICAgICBidWZmZXIud3JpdGUocidccicpOwogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gJERFTCkgewogICAgICAgIGFkZENvZGVVbml0RXNjYXBlZChidWZmZXIsICRERUwpOwogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gJExTKSB7CiAgICAgICAgLy8gVGhpcyBVbmljb2RlIGxpbmUgdGVybWluYXRvciBhbmQgJFBTIGFyZSBpbnZhbGlkIGluIEpTIHN0cmluZwogICAgICAgIC8vIGxpdGVyYWxzLgogICAgICAgIGFkZENvZGVVbml0RXNjYXBlZChidWZmZXIsICRMUyk7IC8vIDB4MjAyOC4KICAgICAgfSBlbHNlIGlmIChjb2RlID09ICRQUykgewogICAgICAgIGFkZENvZGVVbml0RXNjYXBlZChidWZmZXIsICRQUyk7IC8vIDB4MjAyOS4KICAgICAgfSBlbHNlIGlmIChjb2RlID09ICRCQUNLU0xBU0gpIHsKICAgICAgICBidWZmZXIud3JpdGUocidcXCcpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChjb2RlIDwgMHgyMCkgewogICAgICAgICAgYWRkQ29kZVVuaXRFc2NhcGVkKGJ1ZmZlciwgY29kZSk7CiAgICAgICAgICAvLyBXZSBlbWl0IERFTCAoQVNDSUkgMHg3ZikgYXMgYW4gZXNjYXBlIGJlY2F1c2UgaXQgd291bGQgYmUgY29uZnVzaW5nCiAgICAgICAgICAvLyB0byBoYXZlIGl0IHVuZXNjYXBlZCBpbiBhIHN0cmluZyBsaXRlcmFsLiAgV2UgYWxzbyBlc2NhcGUKICAgICAgICAgIC8vIGV2ZXJ5dGhpbmcgYWJvdmUgMHg3ZiBiZWNhdXNlIHRoYXQgbWVhbnMgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeQogICAgICAgICAgLy8gYWJvdXQgd2hldGhlciB0aGUgd2ViIHNlcnZlciBzZXJ2ZXMgaXQgdXAgYXMgTGF0aW4xIG9yIFVURi04LgogICAgICAgIH0gZWxzZSBpZiAoY29kZSA8IDB4N2YpIHsKICAgICAgICAgIGJ1ZmZlci53cml0ZUNoYXJDb2RlKGNvZGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBUaGlzIHdpbGwgb3V0cHV0IHN1cnJvZ2F0ZSBwYWlycyBpbiB0aGUgZm9ybSBcdWR4eHhcdWR5eXksIHJhdGhlcgogICAgICAgICAgLy8gdGhhbiB0aGUgbW9yZSBsb2dpY2FsIFx1e3p6enp6en0uICBUaGlzIHNob3VsZCB3b3JrIGluIEphdmFTY3JpcHQKICAgICAgICAgIC8vIChlc3BlY2lhbGx5IG9sZCBVQ1MtMiBiYXNlZCBpbXBsZW1lbnRhdGlvbnMpIGFuZCBpcyB0aGUgb25seQogICAgICAgICAgLy8gZm9ybWF0IHRoYXQgaXMgYWxsb3dlZCBpbiBKU09OLgogICAgICAgICAgYWRkQ29kZVVuaXRFc2NhcGVkKGJ1ZmZlciwgY29kZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7IGkrKykgewogICAgaW50IGNvZGUgPSBzdHJpbmcuY29kZVVuaXRBdChpKTsKICAgIGlmIChjb2RlIDwgMHgyMCB8fAogICAgICAgIGNvZGUgPT0gJERFTCB8fAogICAgICAgIGNvZGUgPT0gJERRIHx8CiAgICAgICAgY29kZSA9PSAkTFMgfHwKICAgICAgICBjb2RlID09ICRQUyB8fAogICAgICAgIGNvZGUgPT0gJEJBQ0tTTEFTSCB8fAogICAgICAgIGNvZGUgPj0gMHg4MCkgewogICAgICB3cml0ZUVzY2FwZWRPbihzdHJpbmcsIGJ1ZmZlcik7CiAgICAgIHJldHVybjsKICAgIH0KICB9CiAgYnVmZmVyLndyaXRlKHN0cmluZyk7Cn0KCmludCBjb21wdXRlSGFzaENvZGUocGFydDEsIFtwYXJ0MiwgcGFydDMsIHBhcnQ0LCBwYXJ0NV0pIHsKICByZXR1cm4gKHBhcnQxLmhhc2hDb2RlIF4KICAgICAgICAgIHBhcnQyLmhhc2hDb2RlIF4KICAgICAgICAgIHBhcnQzLmhhc2hDb2RlIF4KICAgICAgICAgIHBhcnQ0Lmhhc2hDb2RlIF4KICAgICAgICAgIHBhcnQ1Lmhhc2hDb2RlKSAmCiAgICAgIDB4M2ZmZmZmZmY7Cn0KClN0cmluZyBtb2RpZmllcnNUb1N0cmluZygKICAgIHtib29sIGlzU3RhdGljOiBmYWxzZSwKICAgIGJvb2wgaXNBYnN0cmFjdDogZmFsc2UsCiAgICBib29sIGlzRmluYWw6IGZhbHNlLAogICAgYm9vbCBpc1ZhcjogZmFsc2UsCiAgICBib29sIGlzQ29uc3Q6IGZhbHNlLAogICAgYm9vbCBpc0ZhY3Rvcnk6IGZhbHNlLAogICAgYm9vbCBpc0V4dGVybmFsOiBmYWxzZSwKICAgIGJvb2wgaXNDb3ZhcmlhbnQ6IGZhbHNlfSkgewogIExpbmtCdWlsZGVyPFN0cmluZz4gYnVpbGRlciA9IG5ldyBMaW5rQnVpbGRlcjxTdHJpbmc+KCk7CiAgaWYgKGlzU3RhdGljKSBidWlsZGVyLmFkZExhc3QoJ3N0YXRpYycpOwogIGlmIChpc0Fic3RyYWN0KSBidWlsZGVyLmFkZExhc3QoJ2Fic3RyYWN0Jyk7CiAgaWYgKGlzRmluYWwpIGJ1aWxkZXIuYWRkTGFzdCgnZmluYWwnKTsKICBpZiAoaXNWYXIpIGJ1aWxkZXIuYWRkTGFzdCgndmFyJyk7CiAgaWYgKGlzQ29uc3QpIGJ1aWxkZXIuYWRkTGFzdCgnY29uc3QnKTsKICBpZiAoaXNGYWN0b3J5KSBidWlsZGVyLmFkZExhc3QoJ2ZhY3RvcnknKTsKICBpZiAoaXNFeHRlcm5hbCkgYnVpbGRlci5hZGRMYXN0KCdleHRlcm5hbCcpOwogIGlmIChpc0NvdmFyaWFudCkgYnVpbGRlci5hZGRMYXN0KCdjb3ZhcmlhbnQnKTsKICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogIGJ1aWxkZXIudG9MaW5rKGNvbnN0IExpbms8U3RyaW5nPigpKS5wcmludE9uKGJ1ZmZlciwgJywgJyk7CiAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwp9CgpjbGFzcyBQYWlyPEEsIEI+IHsKICBmaW5hbCBBIGE7CiAgZmluYWwgQiBiOwoKICBQYWlyKHRoaXMuYSwgdGhpcy5iKTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiAxMyAqIGEuaGFzaENvZGUgKyAxNyAqIGIuaGFzaENvZGU7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0odmFyIG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIFBhaXIpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBhID09IG90aGVyLmEgJiYgYiA9PSBvdGhlci5iOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJygkYSwkYiknOwp9CgppbnQgbG9uZ2VzdENvbW1vblByZWZpeExlbmd0aChMaXN0IGEsIExpc3QgYikgewogIGludCBpbmRleCA9IDA7CiAgZm9yICg7IGluZGV4IDwgYS5sZW5ndGggJiYgaW5kZXggPCBiLmxlbmd0aDsgaW5kZXgrKykgewogICAgaWYgKGFbaW5kZXhdICE9IGJbaW5kZXhdKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICByZXR1cm4gaW5kZXg7Cn0KCi8vLyBSZXR1cm5zIFtzdWdnZXN0ZWROYW1lXSBpZiBpdCBpcyBub3QgaW4gW3VzZWROYW1lc10uIE90aGVyd2lzZSBjb25jYXRlbmF0ZXMKLy8vIHRoZSBzbWFsbGVzdCBudW1iZXIgdGhhdCBtYWtlcyBpdCBub3QgYXBwZWFyIGluIFt1c2VkTmFtZXNdLgovLy8KLy8vIEFkZHMgdGhlIHJlc3VsdCB0byBbdXNlZE5hbWVzXS4KU3RyaW5nIG1ha2VVbmlxdWUoU3RyaW5nIHN1Z2dlc3RlZE5hbWUsIFNldDxTdHJpbmc+IHVzZWROYW1lcywKICAgIFtTdHJpbmcgc2VwYXJhdG9yID0gJyddKSB7CiAgU3RyaW5nIHJlc3VsdCA9IHN1Z2dlc3RlZE5hbWU7CiAgaWYgKHVzZWROYW1lcy5jb250YWlucyhzdWdnZXN0ZWROYW1lKSkgewogICAgaW50IGNvdW50ZXIgPSAwOwogICAgd2hpbGUgKHVzZWROYW1lcy5jb250YWlucyhyZXN1bHQpKSB7CiAgICAgIGNvdW50ZXIrKzsKICAgICAgcmVzdWx0ID0gIiRzdWdnZXN0ZWROYW1lJHNlcGFyYXRvciRjb3VudGVyIjsKICAgIH0KICB9CiAgdXNlZE5hbWVzLmFkZChyZXN1bHQpOwogIHJldHVybiByZXN1bHQ7Cn0KgSEATk48ARYBOU0BGBYWARkBLhBPFCoBPjhERyAsFCETOBQkHyE3BAE5PTcEATgmPhI1NTU1IwQBSDcWGCApMggGDgQBTEQWHB4dCAYZBAFQEj0PIDIGKQQBSzQWICwxBg4EAgEuJCwqMyAUBgQPAgEoJCxHAgExJCwqGigEDwIBTg0kAUNCSk1JNjIcGRkZGhsbHQoIBioEATMuJxkdIR0gHSAdISogSRU0IDQnHQ8bLFFHTUsiJhFPT0otLAoIBgQBLCUXGBcXFx4YJg4GBBgCATsbGxsbHBICARobHBkXGRscIDsrLyklKS0vMSw+HAIBEw0NARgBDDkBDCAtJikEAQwiAgEwETogDQYEEAIBUEEEJD8fISsVKREzBgQZEQIBI3BhY2thZ2U6Y29tcGlsZXIvc3JjL3V0aWwvdXRpbC5kYXJ0M3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3V0aWwvaW5kZW50YXRpb24uZGFydI50Ly8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydDJqcy51dGlsOwoKLy8vIEluZGVudGF0aW9uIHV0aWxpdHkgY2xhc3MuIFNob3VsZCBiZSB1c2VkIGFzIGEgbWl4aW4gaW4gbW9zdCBjYXNlcy4KY2xhc3MgSW5kZW50YXRpb24gewogIC8vLyBUaGUgY3VycmVudCBpbmRlbnRhdGlvbiBzdHJpbmcuCiAgU3RyaW5nIGdldCBpbmRlbnRhdGlvbiB7CiAgICAvLyBMYXppbHkgYWRkIG5ldyBpbmRlbnRhdGlvbiBzdHJpbmdzIGFzIHJlcXVpcmVkLgogICAgZm9yIChpbnQgaSA9IF9pbmRlbnRMaXN0Lmxlbmd0aDsgaSA8PSBfaW5kZW50TGV2ZWw7IGkrKykgewogICAgICBfaW5kZW50TGlzdC5hZGQoX2luZGVudExpc3RbaSAtIDFdICsgaW5kZW50YXRpb25Vbml0KTsKICAgIH0KICAgIHJldHVybiBfaW5kZW50TGlzdFtfaW5kZW50TGV2ZWxdOwogIH0KCiAgLy8vIFRoZSBjdXJyZW50IGluZGVudGF0aW9uIGxldmVsLgogIGludCBfaW5kZW50TGV2ZWwgPSAwOwoKICAvLy8gQSBjYWNoZSBvZiBhbGwgaW5kZW50YXRpb24gc3RyaW5ncyB1c2VkIHNvIGZhci4KICAvLy8gQWx3YXlzIGF0IGxlYXN0IG9mIGxlbmd0aCAxLgogIExpc3Q8U3RyaW5nPiBfaW5kZW50TGlzdCA9IDxTdHJpbmc+WyIiXTsKCiAgLy8vIFRoZSBpbmRlbnRhdGlvbiB1bml0LCBkZWZhdWx0aW5nIHRvIHR3byBzcGFjZXMuIE1heSBiZSBvdmVyd3JpdHRlbi4KICBTdHJpbmcgX2luZGVudGF0aW9uVW5pdCA9ICIgICI7CiAgU3RyaW5nIGdldCBpbmRlbnRhdGlvblVuaXQgPT4gX2luZGVudGF0aW9uVW5pdDsKICBzZXQgaW5kZW50YXRpb25Vbml0KFN0cmluZyB2YWx1ZSkgewogICAgaWYgKHZhbHVlICE9IF9pbmRlbnRhdGlvblVuaXQpIHsKICAgICAgX2luZGVudGF0aW9uVW5pdCA9IHZhbHVlOwogICAgICBfaW5kZW50TGlzdCA9IDxTdHJpbmc+WyIiXTsKICAgIH0KICB9CgogIC8vLyBJbmNyZWFzZXMgdGhlIGN1cnJlbnQgbGV2ZWwgb2YgaW5kZW50YXRpb24uCiAgdm9pZCBpbmRlbnRNb3JlKCkgewogICAgX2luZGVudExldmVsKys7CiAgfQoKICAvLy8gRGVjcmVhc2VzIHRoZSBjdXJyZW50IGxldmVsIG9mIGluZGVudGF0aW9uLgogIHZvaWQgaW5kZW50TGVzcygpIHsKICAgIF9pbmRlbnRMZXZlbC0tOwogIH0KCiAgLy8vIENhbGxzIFtmXSB3aXRoIG9uZSBtb3JlIGluZGVudGF0aW9uIGxldmVsLCByZXN0b3JpbmcgaW5kZW50YXRpb24gY29udGV4dAogIC8vLyB1cG9uIHJldHVybiBvZiBbZl0gYW5kIHJldHVybmluZyBpdHMgcmVzdWx0LgogIGluZGVudEJsb2NrKEZ1bmN0aW9uIGYpIHsKICAgIGluZGVudE1vcmUoKTsKICAgIHZhciByZXN1bHQgPSBmKCk7CiAgICBpbmRlbnRMZXNzKCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgVGFnZ2luZzxOPiBpbXBsZW1lbnRzIEluZGVudGF0aW9uIHsKICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgTGluazxTdHJpbmc+IHRhZ1N0YWNrID0gY29uc3QgTGluazxTdHJpbmc+KCk7CgogIHZvaWQgcHVzaFRhZyhTdHJpbmcgdGFnKSB7CiAgICB0YWdTdGFjayA9IHRhZ1N0YWNrLnByZXBlbmQodGFnKTsKICAgIGluZGVudE1vcmUoKTsKICB9CgogIFN0cmluZyBwb3BUYWcoKSB7CiAgICBhc3NlcnQoIXRhZ1N0YWNrLmlzRW1wdHkpOwogICAgU3RyaW5nIHRhZyA9IHRhZ1N0YWNrLmhlYWQ7CiAgICB0YWdTdGFjayA9IHRhZ1N0YWNrLnRhaWw7CiAgICBpbmRlbnRMZXNzKCk7CiAgICByZXR1cm4gdGFnOwogIH0KCiAgLy8vIEFkZHMgZ2l2ZW4gc3RyaW5nIHRvIHJlc3VsdCBzdHJpbmcuCiAgdm9pZCBhZGQoU3RyaW5nIHN0cmluZykgewogICAgc2Iud3JpdGUoc3RyaW5nKTsKICB9CgogIC8vLyBBZGRzIGRlZmF1bHQgcGFyYW1ldGVycyBmb3IgW25vZGVdIGludG8gW3BhcmFtc10uCiAgdm9pZCBhZGREZWZhdWx0UGFyYW1ldGVycyhOIG5vZGUsIE1hcCBwYXJhbXMpIHt9CgogIC8vLyBBZGRzIGdpdmVuIG5vZGUgdHlwZSB0byByZXN1bHQgc3RyaW5nLgogIC8vLyBUaGUgbWV0aG9kICJvcGVucyIgdGhlIG5vZGUsIG1lYW5pbmcgdGhhdCBhbGwgb3V0cHV0IGFmdGVyIGNhbGxpbmcKICAvLy8gdGhpcyBtZXRob2QgYW5kIGJlZm9yZSBjYWxsaW5nIGNsb3NlTm9kZSgpIHdpbGwgcmVwcmVzZW50IGNvbnRlbnRzCiAgLy8vIG9mIGdpdmVuIG5vZGUuCiAgdm9pZCBvcGVuTm9kZShOIG5vZGUsIFN0cmluZyB0eXBlLCBbTWFwIHBhcmFtc10pIHsKICAgIGlmIChwYXJhbXMgPT0gbnVsbCkgcGFyYW1zID0gbmV3IE1hcCgpOwogICAgYWRkQ3VycmVudEluZGVudCgpOwogICAgc2Iud3JpdGUoIjwiKTsKICAgIGFkZERlZmF1bHRQYXJhbWV0ZXJzKG5vZGUsIHBhcmFtcyk7CiAgICBhZGRUeXBlV2l0aFBhcmFtcyh0eXBlLCBwYXJhbXMpOwogICAgc2Iud3JpdGUoIj5cbiIpOwogICAgcHVzaFRhZyh0eXBlKTsKICB9CgogIC8vLyBBZGRzIGdpdmVuIG5vZGUgdG8gcmVzdWx0IHN0cmluZy4KICB2b2lkIG9wZW5BbmRDbG9zZU5vZGUoTiBub2RlLCBTdHJpbmcgdHlwZSwgW01hcCBwYXJhbXNdKSB7CiAgICBpZiAocGFyYW1zID09IG51bGwpIHBhcmFtcyA9IHt9OwogICAgYWRkQ3VycmVudEluZGVudCgpOwogICAgc2Iud3JpdGUoIjwiKTsKICAgIGFkZERlZmF1bHRQYXJhbWV0ZXJzKG5vZGUsIHBhcmFtcyk7CiAgICBhZGRUeXBlV2l0aFBhcmFtcyh0eXBlLCBwYXJhbXMpOwogICAgc2Iud3JpdGUoIi8+XG4iKTsKICB9CgogIC8vLyBDbG9zZXMgY3VycmVudCBub2RlIHR5cGUuCiAgdm9pZCBjbG9zZU5vZGUoKSB7CiAgICBTdHJpbmcgdGFnID0gcG9wVGFnKCk7CiAgICBhZGRDdXJyZW50SW5kZW50KCk7CiAgICBzYi53cml0ZSgiPC8iKTsKICAgIGFkZFR5cGVXaXRoUGFyYW1zKHRhZyk7CiAgICBzYi53cml0ZSgiPlxuIik7CiAgfQoKICB2b2lkIGFkZFR5cGVXaXRoUGFyYW1zKFN0cmluZyB0eXBlLCBbTWFwIHBhcmFtc10pIHsKICAgIGlmIChwYXJhbXMgPT0gbnVsbCkgcGFyYW1zID0gbmV3IE1hcCgpOwogICAgc2Iud3JpdGUoIiR7dHlwZX0iKTsKICAgIHBhcmFtcy5mb3JFYWNoKChrLCB2KSB7CiAgICAgIFN0cmluZyB2YWx1ZTsKICAgICAgaWYgKHYgIT0gbnVsbCkgewogICAgICAgIFN0cmluZyBzdHIgPSB2YWx1ZVRvU3RyaW5nKHYpOwogICAgICAgIHZhbHVlID0gc3RyCiAgICAgICAgICAgIC5yZXBsYWNlQWxsKCI8IiwgIiZsdDsiKQogICAgICAgICAgICAucmVwbGFjZUFsbCgiPiIsICImZ3Q7IikKICAgICAgICAgICAgLnJlcGxhY2VBbGwoJyInLCAiJyIpOwogICAgICB9IGVsc2UgewogICAgICAgIHZhbHVlID0gIltudWxsXSI7CiAgICAgIH0KICAgICAgc2Iud3JpdGUoJyAkaz0iJHZhbHVlIicpOwogICAgfSk7CiAgfQoKICB2b2lkIGFkZEN1cnJlbnRJbmRlbnQoKSB7CiAgICBzYi53cml0ZShpbmRlbnRhdGlvbik7CiAgfQoKICAvLy8gQ29udmVydHMgYSBwYXJhbWV0ZXIgdmFsdWUgaW50byBhIHN0cmluZy4KICBTdHJpbmcgdmFsdWVUb1N0cmluZyh2YXIgdmFsdWUpID0+IHZhbHVlOwp9CoCLAE5OPAEWAUgUJhs3Pz0GJgQBJRgBNiMrAUoiMiYlICIGBAEyFhQEATIWFAQBTzMcEhYSEwQCATMoMAEdJhIEARQfIB4SEAQBKhwWBAE4MwEtSUkVNSwYEyglFRMEASg9JRgTKCUWBAEgFRsYFBwVBAE2LBkcFBcnFCUlIw8aCCAIBAEcGwQBMCwCASpwYWNrYWdlOmNvbXBpbGVyL3NyYy91dGlsL2luZGVudGF0aW9uLmRhcnQjc2Rrcm9vdDovcGtnL2tlcm5lbC9saWIva2VybmVsLmRhcnSKQC8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gQ29udmVudGlvbnMgZm9yIHBhdGhzOgovLy8KLy8vIC0gVXNlIHRoZSBbVXJpXSBjbGFzcyBmb3IgcGF0aHMgdGhhdCBtYXkgaGF2ZSB0aGUgYGZpbGVgLCBgZGFydGAgb3IKLy8vICAgYHBhY2thZ2VgIHNjaGVtZS4gIE5ldmVyIHVzZSBbVXJpXSBmb3IgcmVsYXRpdmUgcGF0aHMuCi8vLyAtIFVzZSBbU3RyaW5nXXMgZm9yIGFsbCBmaWxlbmFtZXMgYW5kIHBhdGhzIHRoYXQgaGF2ZSBubyBzY2hlbWUgcHJlZml4LgovLy8gLSBOZXZlciB0cmFuc2xhdGUgYSBgZGFydDpgIG9yIGBwYWNrYWdlOmAgVVJJIGludG8gYSBgZmlsZTpgIFVSSSwgaW5zdGVhZAovLy8gICB0cmFuc2xhdGUgaXQgdG8gYSBbU3RyaW5nXSBpZiB0aGUgZmlsZSBzeXN0ZW0gcGF0aCBpcyBuZWVkZWQuCi8vLyAtIE9ubHkgdXNlIFtGaWxlXSBmcm9tIGRhcnQ6aW8gYXQgdGhlIGxhc3QgbW9tZW50IHdoZW4gaXQgaXMgbmVlZGVkLgovLy8KbGlicmFyeSBrZXJuZWw7CgppbXBvcnQgJ2FzdC5kYXJ0JzsKaW1wb3J0ICdiaW5hcnkvYXN0X3RvX2JpbmFyeS5kYXJ0JzsKaW1wb3J0ICdiaW5hcnkvYXN0X2Zyb21fYmluYXJ5LmRhcnQnOwppbXBvcnQgJ2RhcnQ6YXN5bmMnOwppbXBvcnQgJ2RhcnQ6aW8nOwppbXBvcnQgJ3RleHQvYXN0X3RvX3RleHQuZGFydCc7CgpleHBvcnQgJ2FzdC5kYXJ0JzsKCkNvbXBvbmVudCBsb2FkQ29tcG9uZW50RnJvbUJpbmFyeShTdHJpbmcgcGF0aCwgW0NvbXBvbmVudCBjb21wb25lbnRdKSB7CiAgTGlzdDxpbnQ+IGJ5dGVzID0gbmV3IEZpbGUocGF0aCkucmVhZEFzQnl0ZXNTeW5jKCk7CiAgcmV0dXJuIGxvYWRDb21wb25lbnRGcm9tQnl0ZXMoYnl0ZXMsIGNvbXBvbmVudCk7Cn0KCkNvbXBvbmVudCBsb2FkQ29tcG9uZW50RnJvbUJ5dGVzKExpc3Q8aW50PiBieXRlcywgW0NvbXBvbmVudCBjb21wb25lbnRdKSB7CiAgY29tcG9uZW50ID8/PSBuZXcgQ29tcG9uZW50KCk7CiAgbmV3IEJpbmFyeUJ1aWxkZXIoYnl0ZXMpLnJlYWRDb21wb25lbnQoY29tcG9uZW50KTsKICByZXR1cm4gY29tcG9uZW50Owp9CgpDb21wb25lbnQgbG9hZENvbXBvbmVudFNvdXJjZUZyb21CeXRlcyhMaXN0PGludD4gYnl0ZXMsIFtDb21wb25lbnQgY29tcG9uZW50XSkgewogIGNvbXBvbmVudCA/Pz0gbmV3IENvbXBvbmVudCgpOwogIG5ldyBCaW5hcnlCdWlsZGVyKGJ5dGVzKS5yZWFkQ29tcG9uZW50U291cmNlKGNvbXBvbmVudCk7CiAgcmV0dXJuIGNvbXBvbmVudDsKfQoKRnV0dXJlIHdyaXRlQ29tcG9uZW50VG9CaW5hcnkoQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIHBhdGgpIHsKICB2YXIgc2luazsKICBpZiAocGF0aCA9PSAnbnVsbCcgfHwgcGF0aCA9PSAnc3Rkb3V0JykgewogICAgc2luayA9IHN0ZG91dC5ub25CbG9ja2luZzsKICB9IGVsc2UgewogICAgc2luayA9IG5ldyBGaWxlKHBhdGgpLm9wZW5Xcml0ZSgpOwogIH0KCiAgdmFyIGZ1dHVyZTsKICB0cnkgewogICAgbmV3IEJpbmFyeVByaW50ZXIoc2luaykud3JpdGVDb21wb25lbnRGaWxlKGNvbXBvbmVudCk7CiAgfSBmaW5hbGx5IHsKICAgIGlmIChzaW5rID09IHN0ZG91dC5ub25CbG9ja2luZykgewogICAgICBmdXR1cmUgPSBzaW5rLmZsdXNoKCk7CiAgICB9IGVsc2UgewogICAgICBmdXR1cmUgPSBzaW5rLmNsb3NlKCk7CiAgICB9CiAgfQoKICByZXR1cm4gZnV0dXJlOwp9Cgp2b2lkIHdyaXRlTGlicmFyeVRvVGV4dChMaWJyYXJ5IGxpYnJhcnksIHtTdHJpbmcgcGF0aH0pIHsKICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogIG5ldyBQcmludGVyKGJ1ZmZlcikud3JpdGVMaWJyYXJ5RmlsZShsaWJyYXJ5KTsKICBpZiAocGF0aCA9PSBudWxsKSB7CiAgICBwcmludChidWZmZXIpOwogIH0gZWxzZSB7CiAgICBuZXcgRmlsZShwYXRoKS53cml0ZUFzU3RyaW5nU3luYygnJGJ1ZmZlcicpOwogIH0KfQoKdm9pZCB3cml0ZUNvbXBvbmVudFRvVGV4dChDb21wb25lbnQgY29tcG9uZW50LAogICAge1N0cmluZyBwYXRoLAogICAgYm9vbCBzaG93RXh0ZXJuYWw6IGZhbHNlLAogICAgYm9vbCBzaG93T2Zmc2V0czogZmFsc2UsCiAgICBib29sIHNob3dNZXRhZGF0YTogZmFsc2V9KSB7CiAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICBuZXcgUHJpbnRlcihidWZmZXIsCiAgICAgICAgICBzaG93RXh0ZXJuYWw6IHNob3dFeHRlcm5hbCwKICAgICAgICAgIHNob3dPZmZzZXRzOiBzaG93T2Zmc2V0cywKICAgICAgICAgIHNob3dNZXRhZGF0YTogc2hvd01ldGFkYXRhKQogICAgICAud3JpdGVDb21wb25lbnRGaWxlKGNvbXBvbmVudCk7CiAgaWYgKHBhdGggPT0gbnVsbCkgewogICAgcHJpbnQoYnVmZmVyKTsKICB9IGVsc2UgewogICAgbmV3IEZpbGUocGF0aCkud3JpdGVBc1N0cmluZ1N5bmMoJyRidWZmZXInKTsKICB9Cn0KXABOTjwBGwRIPUxOREkEEAETJCYVEiABEwFINjMCAUshNRQCAVEhOxQCAUIMLB8LJwQBDgg7DiYdDR0GBAERAgE6LDEWEwsxBAIBLxIeHSEsFiYkJiYWEwsxBAIBGnBhY2thZ2U6a2VybmVsL2tlcm5lbC5kYXJ0K3Nka3Jvb3Q6L3BrZy9rZXJuZWwvbGliL3RhcmdldC90YXJnZXRzLmRhcnSnJC8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCmxpYnJhcnkga2VybmVsLnRhcmdldC50YXJnZXRzOwoKaW1wb3J0ICcuLi9hc3QuZGFydCc7CmltcG9ydCAnLi4vY2xhc3NfaGllcmFyY2h5LmRhcnQnOwppbXBvcnQgJy4uL2NvcmVfdHlwZXMuZGFydCc7CgpmaW5hbCBMaXN0PFN0cmluZz4gdGFyZ2V0TmFtZXMgPSB0YXJnZXRzLmtleXMudG9MaXN0KCk7CgpjbGFzcyBUYXJnZXRGbGFncyB7CiAgZmluYWwgYm9vbCBsZWdhY3lNb2RlOwoKICBUYXJnZXRGbGFncyh7dGhpcy5sZWdhY3lNb2RlOiBmYWxzZX0pOwp9Cgp0eXBlZGVmIFRhcmdldCBfVGFyZ2V0QnVpbGRlcihUYXJnZXRGbGFncyBmbGFncyk7CgpmaW5hbCBNYXA8U3RyaW5nLCBfVGFyZ2V0QnVpbGRlcj4gdGFyZ2V0cyA9IDxTdHJpbmcsIF9UYXJnZXRCdWlsZGVyPnsKICAnbm9uZSc6IChUYXJnZXRGbGFncyBmbGFncykgPT4gbmV3IE5vbmVUYXJnZXQoZmxhZ3MpLAp9OwoKVGFyZ2V0IGdldFRhcmdldChTdHJpbmcgbmFtZSwgVGFyZ2V0RmxhZ3MgZmxhZ3MpIHsKICB2YXIgYnVpbGRlciA9IHRhcmdldHNbbmFtZV07CiAgaWYgKGJ1aWxkZXIgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgcmV0dXJuIGJ1aWxkZXIoZmxhZ3MpOwp9CgphYnN0cmFjdCBjbGFzcyBEaWFnbm9zdGljUmVwb3J0ZXI8TSwgQz4gewogIHZvaWQgcmVwb3J0KE0gbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgsIFVyaSBmaWxlVXJpLAogICAgICB7TGlzdDxDPiBjb250ZXh0fSk7Cn0KCi8vLyBUaGUgZGlmZmVyZW50IGtpbmRzIG9mIG51bWJlciBzZW1hbnRpY3Mgc3VwcG9ydGVkIGJ5IHRoZSBjb25zdGFudCBldmFsdWF0b3IuCmVudW0gTnVtYmVyU2VtYW50aWNzIHsKICAvLy8gRGFydCBWTSBudW1iZXIgc2VtYW50aWNzLgogIHZtLAoKICAvLy8gSmF2YVNjcmlwdCAoRGFydDJqcyBhbmQgRERDKSBudW1iZXIgc2VtYW50aWNzLgogIGpzLAp9CgovLyBCYWNrZW5kIHNwZWNpZmljIGNvbnN0YW50IGV2YWx1YXRpb24gYmVoYXZpb3IKY2xhc3MgQ29uc3RhbnRzQmFja2VuZCB7CiAgY29uc3QgQ29uc3RhbnRzQmFja2VuZCgpOwoKICAvLy8gTG93ZXJpbmcgb2YgYSBsaXN0IGNvbnN0YW50IHRvIGEgYmFja2VuZC1zcGVjaWZpYyByZXByZXNlbnRhdGlvbi4KICBDb25zdGFudCBsb3dlckxpc3RDb25zdGFudChMaXN0Q29uc3RhbnQgY29uc3RhbnQpID0+IGNvbnN0YW50OwoKICAvLy8gTG93ZXJpbmcgb2YgYSBzZXQgY29uc3RhbnQgdG8gYSBiYWNrZW5kLXNwZWNpZmljIHJlcHJlc2VudGF0aW9uLgogIENvbnN0YW50IGxvd2VyU2V0Q29uc3RhbnQoU2V0Q29uc3RhbnQgY29uc3RhbnQpID0+IGNvbnN0YW50OwoKICAvLy8gTG93ZXJpbmcgb2YgYSBtYXAgY29uc3RhbnQgdG8gYSBiYWNrZW5kLXNwZWNpZmljIHJlcHJlc2VudGF0aW9uLgogIENvbnN0YW50IGxvd2VyTWFwQ29uc3RhbnQoTWFwQ29uc3RhbnQgY29uc3RhbnQpID0+IGNvbnN0YW50OwoKICAvLy8gTnVtYmVyIHNlbWFudGljcyB0byB1c2UgZm9yIHRoaXMgYmFja2VuZC4KICBOdW1iZXJTZW1hbnRpY3MgZ2V0IG51bWJlclNlbWFudGljcyA9PiBOdW1iZXJTZW1hbnRpY3Mudm07Cn0KCi8vLyBBIHRhcmdldCBwcm92aWRlcyBiYWNrZW5kLXNwZWNpZmljIG9wdGlvbnMgZm9yIGdlbmVyYXRpbmcga2VybmVsIElSLgphYnN0cmFjdCBjbGFzcyBUYXJnZXQgewogIFN0cmluZyBnZXQgbmFtZTsKCiAgLy8vIEEgbGlzdCBvZiBVUklzIG9mIHJlcXVpcmVkIGxpYnJhcmllcywgbm90IGluY2x1ZGluZyBkYXJ0OmNvcmUuCiAgLy8vCiAgLy8vIExpYnJhcmllcyB3aWxsIGJlIGxvYWRlZCBpbiBvcmRlci4KICBMaXN0PFN0cmluZz4gZ2V0IGV4dHJhUmVxdWlyZWRMaWJyYXJpZXMgPT4gPFN0cmluZz5bXTsKCiAgLy8vIEFkZGl0aW9uYWwgZGVjbGFyZWQgdmFyaWFibGVzIGltcGxpZWQgYnkgdGhpcyB0YXJnZXQuCiAgLy8vCiAgLy8vIFRoZXNlIGNhbiBhbHNvIGJlIHBhc3NlZCBvbiB0aGUgY29tbWFuZC1saW5lIG9mIGZvcm0gYC1EPG5hbWU+PTx2YWx1ZT5gLAogIC8vLyBhbmQgdGhvc2UgcHJvdmlkZWQgb24gdGhlIGNvbW1hbmQtbGluZSB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aG9zZSBkZWZpbmVkCiAgLy8vIGJ5IHRoZSB0YXJnZXQuCiAgTWFwPFN0cmluZywgU3RyaW5nPiBnZXQgZXh0cmFEZWNsYXJlZFZhcmlhYmxlcyA9PiBjb25zdCA8U3RyaW5nLCBTdHJpbmc+e307CgogIC8vLyBDbGFzc2VzIGZyb20gdGhlIFNESyB3aG9zZSBpbnRlcmZhY2UgaXMgcmVxdWlyZWQgZm9yIHRoZSBtb2R1bGFyCiAgLy8vIHRyYW5zZm9ybWF0aW9ucy4KICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGdldCByZXF1aXJlZFNka0NsYXNzZXMgPT4gQ29yZVR5cGVzLnJlcXVpcmVkQ2xhc3NlczsKCiAgYm9vbCBnZXQgbGVnYWN5TW9kZTsKCiAgLy8vIEEgZGVyaXZlZCBjbGFzcyBtYXkgY2hhbmdlIHRoaXMgdG8gYHRydWVgIHRvIGVuYWJsZSBmb3J3YXJkZXJzIHRvCiAgLy8vIHVzZXItZGVmaW5lZCBgbm9TdWNoTWV0aG9kYCB0aGF0IGFyZSBnZW5lcmF0ZWQgZm9yIGVhY2ggYWJzdHJhY3QgbWVtYmVyCiAgLy8vIGlmIHN1Y2ggYG5vU3VjaE1ldGhvZGAgaXMgcHJlc2VudC4KICAvLy8KICAvLy8gVGhlIGZvcndhcmRlcnMgYXJlIGFic3RyYWN0IFtQcm9jZWR1cmVdcyB3aXRoIFtpc05vU3VjaE1ldGhvZEZvcndhcmRlcl0KICAvLy8gYml0IHNldC4gIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYmVoYXZpb3Igb2Ygc3VjaCBmb3J3YXJkZXJzIGlzIHVwCiAgLy8vIGZvciB0aGUgdGFyZ2V0IGJhY2tlbmQuCiAgYm9vbCBnZXQgZW5hYmxlTm9TdWNoTWV0aG9kRm9yd2FyZGVycyA9PiBmYWxzZTsKCiAgLy8vIEEgZGVyaXZlZCBjbGFzcyBtYXkgY2hhbmdlIHRoaXMgdG8gYHRydWVgIHRvIGVuYWJsZSBGbHV0dGVyIHNwZWNpZmljCiAgLy8vICJzdXBlci1taXhpbnMiIHNlbWFudGljcy4KICAvLy8KICAvLy8gVGhpcyBzZW1hbnRpY3MgcmVsYXhlcyBhIG51bWJlciBvZiBjb25zdHJhaW50IHByZXZpb3VzbHkgaW1wb3NlZCBvbgogIC8vLyBtaXhpbnMuIEltcG9ydGFudGx5IGl0IGltcG9zZXMgdGhlIGZvbGxvd2luZyBjaGFuZ2U6CiAgLy8vCiAgLy8vICAgICBBbiBhYnN0cmFjdCBjbGFzcyBtYXkgY29udGFpbiBhIG1lbWJlciB3aXRoIGEgc3VwZXItaW52b2NhdGlvbiB0aGF0CiAgLy8vICAgICBjb3JyZXNwb25kcyB0byBhIG1lbWJlciBvZiB0aGUgc3VwZXJjbGFzcyBpbnRlcmZhY2UsIGJ1dCB3aGVyZSB0aGUKICAvLy8gICAgIGFjdHVhbCBzdXBlcmNsYXNzIGRvZXMgbm90IGRlY2xhcmUgb3IgaW5oZXJpdCBhIG1hdGNoaW5nIG1ldGhvZC4KICAvLy8gICAgIFNpbmNlIG5vIGFtb3VudCBvZiBvdmVycmlkaW5nIGNhbiBjaGFuZ2UgdGhpcyBwcm9wZXJ0eSwgc3VjaCBhIGNsYXNzCiAgLy8vICAgICBjYW5ub3QgYmUgZXh0ZW5kZWQgdG8gYSBjbGFzcyB0aGF0IGlzIG5vdCBhYnN0cmFjdCwgaXQgY2FuIG9ubHkgYmUKICAvLy8gICAgIHVzZWQgdG8gZGVyaXZlIGEgbWl4aW4gZnJvbS4KICAvLy8KICAvLy8gU2VlIGRhcnRidWcuY29tLzMxNTQyIGZvciBkZXRhaWxzIG9mIHRoZSBzZW1hbnRpY3MuCiAgYm9vbCBnZXQgZW5hYmxlU3VwZXJNaXhpbnMgPT4gZmFsc2U7CgogIC8vLyBQZXJmb3JtIHRhcmdldC1zcGVjaWZpYyB0cmFuc2Zvcm1hdGlvbnMgb24gdGhlIG91dGxpbmVzIHN0b3JlZCBpbgogIC8vLyBbQ29tcG9uZW50XSB3aGVuIGdlbmVyYXRpbmcgc3VtbWFyaWVzLgogIC8vLwogIC8vLyBUaGlzIHRyYW5zZm9ybWF0aW9uIGlzIHVzZWQgdG8gYWRkIG1ldGFkYXRhIG9uIG91dGxpbmVzIGFuZCB0byBmaWx0ZXIKICAvLy8gdW5uZWNlc3NhcnkgaW5mb3JtYXRpb24gYmVmb3JlIGdlbmVyYXRpbmcgcHJvZ3JhbSBzdW1tYXJpZXMuIFRoaXMKICAvLy8gdHJhbnNmb3JtYXRpb24gaXMgbm90IGFwcGxpZWQgd2hlbiBjb21waWxpbmcgZnVsbCBrZXJuZWwgcHJvZ3JhbXMgdG8KICAvLy8gcHJldmVudCBhZmZlY3RpbmcgdGhlIGludGVybmFsIGludmFyaWFudHMgb2YgdGhlIGNvbXBpbGVyIGFuZCBhY2NpZGVudGFsbHkKICAvLy8gc2xvd2luZyBkb3duIGNvbXBpbGF0aW9uLgogIHZvaWQgcGVyZm9ybU91dGxpbmVUcmFuc2Zvcm1hdGlvbnMoQ29tcG9uZW50IGNvbXBvbmVudCkge30KCiAgLy8vIFBlcmZvcm0gdGFyZ2V0LXNwZWNpZmljIG1vZHVsYXIgdHJhbnNmb3JtYXRpb25zIG9uIHRoZSBnaXZlbiBsaWJyYXJpZXMuCiAgdm9pZCBwZXJmb3JtTW9kdWxhclRyYW5zZm9ybWF0aW9uc09uTGlicmFyaWVzKAogICAgICBDb21wb25lbnQgY29tcG9uZW50LAogICAgICBDb3JlVHlwZXMgY29yZVR5cGVzLAogICAgICBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHksCiAgICAgIExpc3Q8TGlicmFyeT4gbGlicmFyaWVzLAogICAgICBEaWFnbm9zdGljUmVwb3J0ZXIgZGlhZ25vc3RpY1JlcG9ydGVyLAogICAgICB7dm9pZCBsb2dnZXIoU3RyaW5nIG1zZyl9KTsKCiAgLy8vIFBlcmZvcm0gdGFyZ2V0LXNwZWNpZmljIG1vZHVsYXIgdHJhbnNmb3JtYXRpb25zIG9uIHRoZSBnaXZlbiBwcm9ncmFtLgogIC8vLwogIC8vLyBUaGlzIGlzIHVzZWQgd2hlbiBhbiBpbmRpdmlkdWFsIGV4cHJlc3Npb24gaXMgY29tcGlsZWQsIGUuZy4gZm9yIGRlYnVnZ2luZwogIC8vLyBwdXJwb3Nlcy4gSXQgaXMgaWxsZWdhbCB0byBtb2RpZnkgYW55IG9mIHRoZSBlbmNsb3Npbmcgbm9kZXMgb2YgdGhlCiAgLy8vIHByb2NlZHVyZS4KICB2b2lkIHBlcmZvcm1UcmFuc2Zvcm1hdGlvbnNPblByb2NlZHVyZSgKICAgICAgQ29yZVR5cGVzIGNvcmVUeXBlcywgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5LCBQcm9jZWR1cmUgcHJvY2VkdXJlLAogICAgICB7dm9pZCBsb2dnZXIoU3RyaW5nIG1zZyl9KSB7fQoKICAvLy8gV2hldGhlciBhIHBsYXRmb3JtIGxpYnJhcnkgbWF5IGRlZmluZSBhIHJlc3RyaWN0ZWQgdHlwZSwgc3VjaCBhcyBgYm9vbGAsCiAgLy8vIGBpbnRgLCBgZG91YmxlYCwgYG51bWAsIGFuZCBgU3RyaW5nYC4KICAvLy8KICAvLy8gQnkgZGVmYXVsdCBvbmx5IGBkYXJ0OmNvcmVgIG1heSBkZWZpbmUgcmVzdHJpY3RlZCB0eXBlcywgYnV0IHNvbWUgdGFyZ2V0CiAgLy8vIGltcGxlbWVudGF0aW9ucyBvdmVycmlkZSB0aGlzLgogIGJvb2wgbWF5RGVmaW5lUmVzdHJpY3RlZFR5cGUoVXJpIHVyaSkgPT4KICAgICAgdXJpLnNjaGVtZSA9PSAnZGFydCcgJiYgdXJpLnBhdGggPT0gJ2NvcmUnOwoKICAvLy8gV2hldGhlciBhIGxpYnJhcnkgaXMgYWxsb3dlZCB0byBpbXBvcnQgYSBwbGF0Zm9ybSBwcml2YXRlIGxpYnJhcnkuCiAgLy8vCiAgLy8vIEJ5IGRlZmF1bHQgb25seSBgZGFydDoqYCBsaWJyYXJpZXMgYXJlIGFsbG93ZWQuIE1heSBiZSBvdmVycmlkZGVuIGZvcgogIC8vLyB0ZXN0aW5nIHB1cnBvc2VzLgogIGJvb2wgYWxsb3dQbGF0Zm9ybVByaXZhdGVMaWJyYXJ5QWNjZXNzKFVyaSBpbXBvcnRlciwgVXJpIGltcG9ydGVkKSA9PgogICAgICBpbXBvcnRlZC5zY2hlbWUgIT0gImRhcnQiIHx8CiAgICAgICFpbXBvcnRlZC5wYXRoLnN0YXJ0c1dpdGgoIl8iKSB8fAogICAgICBpbXBvcnRlci5zY2hlbWUgPT0gImRhcnQiIHx8CiAgICAgIChpbXBvcnRlci5zY2hlbWUgPT0gInBhY2thZ2UiICYmCiAgICAgICAgICBpbXBvcnRlci5wYXRoLnN0YXJ0c1dpdGgoImRhcnRfaW50ZXJuYWwvIikpOwoKICAvLy8gV2hldGhlciB0aGUgYG5hdGl2ZWAgbGFuZ3VhZ2UgZXh0ZW5zaW9uIGlzIHN1cHBvcnRlZCB3aXRoaW4gW2xpYnJhcnldLgogIC8vLwogIC8vLyBUaGUgYG5hdGl2ZWAgbGFuZ3VhZ2UgZXh0ZW5zaW9uIGlzIG5vdCBwYXJ0IG9mIHRoZSBsYW5ndWFnZSBzcGVjaWZpY2F0aW9uLAogIC8vLyBpdCBtZWFucyBzb21ldGhpbmcgZWxzZSB0byBlYWNoIHRhcmdldCwgYW5kIGl0IGlzIGVuYWJsZWQgdW5kZXIgZGlmZmVyZW50CiAgLy8vIGNpcmN1bXN0YW5jZXMgZm9yIGVhY2ggdGFyZ2V0IGltcGxlbWVudGF0aW9uLiBGb3IgZXhhbXBsZSwgdGhlIFZNIHRhcmdldAogIC8vLyBlbmFibGVzIGl0IGV2ZXJ5d2hlcmUgYmVjYXVzZSBvZiBleGlzdGluZyBzdXBwb3J0IGZvciAiZGFydC1leHQ6IiBuYXRpdmUKICAvLy8gZXh0ZW5zaW9ucywgYnV0IHRhcmdldHMgbGlrZSBkYXJ0MmpzIG9ubHkgZW5hYmxlIGl0IG9uIHRoZSBjb3JlIGxpYnJhcmllcy4KICBib29sIGVuYWJsZU5hdGl2ZShVcmkgdXJpKSA9PiBmYWxzZTsKCiAgLy8vIFRoZXJlIGFyZSB0d28gdmFyaWFudHMgb2YgdGhlIGBuYXRpdmVgIGxhbmd1YWdlIGV4dGVuc2lvbi4gVGhlIFZNIGV4cGVjdHMKICAvLy8gdGhlIG5hdGl2ZSB0b2tlbiB0byBiZSBmb2xsb3dlZCBieSBzdHJpbmcsIHdoZXJlYXMgZGFydDJqcyBhbmQgRERDIGRvIG5vdC4KICAvLyBUT0RPKHNpZ211bmQsIGFoZSk6IGlkZWFsbHkgd2Ugc2hvdWxkIHJlbW92ZSB0aGUgYG5hdGl2ZWAgc3ludGF4LCBpZiBub3QsCiAgLy8gd2Ugc2hvdWxkIGF0IGxlYXN0IHVuaWZ5IHRoZSBWTSBhbmQgbm9uLVZNIHZhcmlhbnRzLgogIGJvb2wgZ2V0IG5hdGl2ZUV4dGVuc2lvbkV4cGVjdHNTdHJpbmcgPT4gZmFsc2U7CgogIC8vLyBXaGV0aGVyIGludGVnZXIgbGl0ZXJhbHMgdGhhdCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgZXhhY3RseSBvbiB0aGUgd2ViCiAgLy8vIChpLmUuIGluIEphdmFzY3JpcHQpIHNob3VsZCBjYXVzZSBhbiBlcnJvciB0byBiZSBpc3N1ZWQuCiAgLy8vIEFuIGV4YW1wbGUgb2Ygc3VjaCBhIG51bWJlciBpcyBgMl41MyArIDFgIHdoZXJlIGluIEphdmFzY3JpcHQgLSBiZWNhdXNlCiAgLy8vIGludGVnZXJzIGFyZSByZXByZXNlbnRlZCBhcyBkb3VibGVzCiAgLy8vIGBNYXRoLnBvdygyLCA1MykgPSBNYXRoLnBvdygyLCA1MykgKyAxYC4KICBib29sIGdldCBlcnJvck9uVW5leGFjdFdlYkludExpdGVyYWxzID0+IGZhbHNlOwoKICAvLy8gV2hldGhlciBzZXQgbGl0ZXJhbHMgYXJlIG5hdGl2ZWx5IHN1cHBvcnRlZCBieSB0aGlzIHRhcmdldC4gSWYgc2V0CiAgLy8vIGxpdGVyYWxzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB0YXJnZXQsIHRoZXkgd2lsbCBiZSBkZXN1Z2FyZWQgaW50bwogIC8vLyBleHBsaWNpdCBgU2V0YCBjcmVhdGlvbiAoZm9yIG5vbi1jb25zdCBzZXQgbGl0ZXJhbHMpIG9yIHdyYXBwZWQgbWFwCiAgLy8vIGxpdGVyYWxzIChmb3IgY29uc3Qgc2V0IGxpdGVyYWxzKS4KICBib29sIGdldCBzdXBwb3J0c1NldExpdGVyYWxzID0+IGZhbHNlOwoKICAvLy8gQnVpbGRzIGFuIGV4cHJlc3Npb24gdGhhdCBpbnN0YW50aWF0ZXMgYW4gW0ludm9jYXRpb25dIHRoYXQgY2FuIGJlIHBhc3NlZAogIC8vLyB0byBbbm9TdWNoTWV0aG9kXS4KICBFeHByZXNzaW9uIGluc3RhbnRpYXRlSW52b2NhdGlvbihDb3JlVHlwZXMgY29yZVR5cGVzLCBFeHByZXNzaW9uIHJlY2VpdmVyLAogICAgICBTdHJpbmcgbmFtZSwgQXJndW1lbnRzIGFyZ3VtZW50cywgaW50IG9mZnNldCwgYm9vbCBpc1N1cGVyKTsKCiAgRXhwcmVzc2lvbiBpbnN0YW50aWF0ZU5vU3VjaE1ldGhvZEVycm9yKENvcmVUeXBlcyBjb3JlVHlwZXMsCiAgICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIsIFN0cmluZyBuYW1lLCBBcmd1bWVudHMgYXJndW1lbnRzLCBpbnQgb2Zmc2V0LAogICAgICB7Ym9vbCBpc01ldGhvZDogZmFsc2UsCiAgICAgIGJvb2wgaXNHZXR0ZXI6IGZhbHNlLAogICAgICBib29sIGlzU2V0dGVyOiBmYWxzZSwKICAgICAgYm9vbCBpc0ZpZWxkOiBmYWxzZSwKICAgICAgYm9vbCBpc0xvY2FsVmFyaWFibGU6IGZhbHNlLAogICAgICBib29sIGlzRHluYW1pYzogZmFsc2UsCiAgICAgIGJvb2wgaXNTdXBlcjogZmFsc2UsCiAgICAgIGJvb2wgaXNTdGF0aWM6IGZhbHNlLAogICAgICBib29sIGlzQ29uc3RydWN0b3I6IGZhbHNlLAogICAgICBib29sIGlzVG9wTGV2ZWw6IGZhbHNlfSk7CgogIC8vLyBDb25maWd1cmUgdGhlIGdpdmVuIFtDb21wb25lbnRdIGluIGEgdGFyZ2V0IHNwZWNpZmljIHdheS4KICAvLy8gUmV0dXJucyB0aGUgY29uZmlndXJlZCBjb21wb25lbnQuCiAgQ29tcG9uZW50IGNvbmZpZ3VyZUNvbXBvbmVudChDb21wb25lbnQgY29tcG9uZW50KSA9PiBjb21wb25lbnQ7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICdUYXJnZXQoJG5hbWUpJzsKCiAgQ2xhc3MgY29uY3JldGVMaXN0TGl0ZXJhbENsYXNzKENvcmVUeXBlcyBjb3JlVHlwZXMpID0+IG51bGw7CiAgQ2xhc3MgY29uY3JldGVDb25zdExpc3RMaXRlcmFsQ2xhc3MoQ29yZVR5cGVzIGNvcmVUeXBlcykgPT4gbnVsbDsKCiAgQ2xhc3MgY29uY3JldGVNYXBMaXRlcmFsQ2xhc3MoQ29yZVR5cGVzIGNvcmVUeXBlcykgPT4gbnVsbDsKICBDbGFzcyBjb25jcmV0ZUNvbnN0TWFwTGl0ZXJhbENsYXNzKENvcmVUeXBlcyBjb3JlVHlwZXMpID0+IG51bGw7CgogIENsYXNzIGNvbmNyZXRlSW50TGl0ZXJhbENsYXNzKENvcmVUeXBlcyBjb3JlVHlwZXMsIGludCB2YWx1ZSkgPT4gbnVsbDsKICBDbGFzcyBjb25jcmV0ZVN0cmluZ0xpdGVyYWxDbGFzcyhDb3JlVHlwZXMgY29yZVR5cGVzLCBTdHJpbmcgdmFsdWUpID0+IG51bGw7CgogIENvbnN0YW50c0JhY2tlbmQgY29uc3RhbnRzQmFja2VuZChDb3JlVHlwZXMgY29yZVR5cGVzKTsKfQoKY2xhc3MgTm9uZVRhcmdldCBleHRlbmRzIFRhcmdldCB7CiAgZmluYWwgVGFyZ2V0RmxhZ3MgZmxhZ3M7CgogIE5vbmVUYXJnZXQodGhpcy5mbGFncyk7CgogIGJvb2wgZ2V0IGxlZ2FjeU1vZGUgPT4gZmxhZ3MubGVnYWN5TW9kZTsKICBTdHJpbmcgZ2V0IG5hbWUgPT4gJ25vbmUnOwogIExpc3Q8U3RyaW5nPiBnZXQgZXh0cmFSZXF1aXJlZExpYnJhcmllcyA9PiA8U3RyaW5nPltdOwogIHZvaWQgcGVyZm9ybU1vZHVsYXJUcmFuc2Zvcm1hdGlvbnNPbkxpYnJhcmllcygKICAgICAgQ29tcG9uZW50IGNvbXBvbmVudCwKICAgICAgQ29yZVR5cGVzIGNvcmVUeXBlcywKICAgICAgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5LAogICAgICBMaXN0PExpYnJhcnk+IGxpYnJhcmllcywKICAgICAgRGlhZ25vc3RpY1JlcG9ydGVyIGRpYWdub3N0aWNSZXBvcnRlciwKICAgICAge3ZvaWQgbG9nZ2VyKFN0cmluZyBtc2cpfSkge30KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBpbnN0YW50aWF0ZUludm9jYXRpb24oQ29yZVR5cGVzIGNvcmVUeXBlcywgRXhwcmVzc2lvbiByZWNlaXZlciwKICAgICAgU3RyaW5nIG5hbWUsIEFyZ3VtZW50cyBhcmd1bWVudHMsIGludCBvZmZzZXQsIGJvb2wgaXNTdXBlcikgewogICAgcmV0dXJuIG5ldyBJbnZhbGlkRXhwcmVzc2lvbihudWxsKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gaW5zdGFudGlhdGVOb1N1Y2hNZXRob2RFcnJvcihDb3JlVHlwZXMgY29yZVR5cGVzLAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLCBTdHJpbmcgbmFtZSwgQXJndW1lbnRzIGFyZ3VtZW50cywgaW50IG9mZnNldCwKICAgICAge2Jvb2wgaXNNZXRob2Q6IGZhbHNlLAogICAgICBib29sIGlzR2V0dGVyOiBmYWxzZSwKICAgICAgYm9vbCBpc1NldHRlcjogZmFsc2UsCiAgICAgIGJvb2wgaXNGaWVsZDogZmFsc2UsCiAgICAgIGJvb2wgaXNMb2NhbFZhcmlhYmxlOiBmYWxzZSwKICAgICAgYm9vbCBpc0R5bmFtaWM6IGZhbHNlLAogICAgICBib29sIGlzU3VwZXI6IGZhbHNlLAogICAgICBib29sIGlzU3RhdGljOiBmYWxzZSwKICAgICAgYm9vbCBpc0NvbnN0cnVjdG9yOiBmYWxzZSwKICAgICAgYm9vbCBpc1RvcExldmVsOiBmYWxzZX0pIHsKICAgIHJldHVybiBuZXcgSW52YWxpZEV4cHJlc3Npb24obnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudHNCYWNrZW5kIGNvbnN0YW50c0JhY2tlbmQoQ29yZVR5cGVzIGNvcmVUeXBlcykgPT4KICAgICAgY29uc3QgQ29uc3RhbnRzQmFja2VuZCgpOwp9CoEGAE5OPB8BFiIdATgBFBkBKQIBMgFGOAMBMx8kGQIBKkIaAgFRFyAGATUGAgExGRwBSEEBRz8BRz8BMD0CAUkYEwFFBik5ATwGT1AVTgFHF1EBFwFITikGTkweMgFLIAZKOwZOTUtPTScGOicBSC0GTEhLUSA9AU4xGxsgHy0iAUwGUUoRKkokAU8sBk8lKzIBSQZMGEgjKCMnNwFNBlFQT09RJwFQUU86MgFNP04qLzIBSUxKKSkBUBlNQwE/SR0cHBsjHRscISABQChCASgBP0QBPkMBSU8BOgIBIhsBGgErHTkxGxsgHy0kAQxNRCgEAQw/SR0cHBsjHRscISEoBAEMPCACASJwYWNrYWdlOmtlcm5lbC90YXJnZXQvdGFyZ2V0cy5kYXJ0QnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9hcGlfcHJvdG90eXBlL2NvbXBpbGVyX29wdGlvbnMuZGFydKXOLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZnJvbnRfZW5kLmNvbXBpbGVyX29wdGlvbnM7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3RhcmdldC90YXJnZXRzLmRhcnQnIHNob3cgVGFyZ2V0OwoKaW1wb3J0ICdkaWFnbm9zdGljX21lc3NhZ2UuZGFydCcgc2hvdyBEaWFnbm9zdGljTWVzc2FnZUhhbmRsZXI7CgppbXBvcnQgJ2V4cGVyaW1lbnRhbF9mbGFncy5kYXJ0JwogICAgc2hvdyBkZWZhdWx0RXhwZXJpbWVudGFsRmxhZ3MsIEV4cGVyaW1lbnRhbEZsYWcsIHBhcnNlRXhwZXJpbWVudGFsRmxhZzsKCmltcG9ydCAnZmlsZV9zeXN0ZW0uZGFydCcgc2hvdyBGaWxlU3lzdGVtOwoKaW1wb3J0ICdzdGFuZGFyZF9maWxlX3N5c3RlbS5kYXJ0JyBzaG93IFN0YW5kYXJkRmlsZVN5c3RlbTsKCmV4cG9ydCAnZGlhZ25vc3RpY19tZXNzYWdlLmRhcnQnIHNob3cgRGlhZ25vc3RpY01lc3NhZ2U7CgovLy8gRnJvbnQtZW5kIG9wdGlvbnMgcmVsZXZhbnQgdG8gY29tcGlsZXIgYmFjayBlbmRzLgovLy8KLy8vIE5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBvciBleHRlbmRlZCBieSBjbGllbnRzLgpjbGFzcyBDb21waWxlck9wdGlvbnMgewogIC8vLyBUaGUgVVJJIG9mIHRoZSByb290IG9mIHRoZSBEYXJ0IFNESyAodHlwaWNhbGx5IGEgImZpbGU6IiBVUkkpLgogIC8vLwogIC8vLyBJZiBgbnVsbGAsIHRoZSBTREsgd2lsbCBiZSBzZWFyY2hlZCBmb3IgdXNpbmcKICAvLy8gW1BsYXRmb3JtLnJlc29sdmVkRXhlY3V0YWJsZV0gYXMgYSBzdGFydGluZyBwb2ludC4KICBVcmkgc2RrUm9vdDsKCiAgLy8vIFVyaSB0byBhIHBsYXRmb3JtIGxpYnJhcmllcyBzcGVjaWZpY2F0aW9uIGZpbGUuCiAgLy8vCiAgLy8vIEEgbGlicmFyaWVzIHNwZWNpZmljYXRpb24gZmlsZSBpcyBhIEpTT04gZmlsZSB0aGF0IGRlc2NyaWJlcyBob3cgdG8gbWFwCiAgLy8vIGBkYXJ0OipgIGxpYnJhcmllcyB0byBVUklzIGluIHRoZSB1bmRlcmx5aW5nIFtmaWxlU3lzdGVtXS4gIFNlZQogIC8vLyBgcGFja2FnZTpmcm9udF9lbmQvc3JjL2Jhc2UvbGlicmFyaWVzX3NwZWNpZmljYXRpb24uZGFydGAgZm9yIGRldGFpbHMgb24KICAvLy8gdGhlIGZvcm1hdC4KICAvLy8KICAvLy8gSWYgYSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkIGFuZCBgY29tcGlsZVNkayA9IHRydWVgLCB0aGUgY29tcGlsZXIgd2lsbAogIC8vLyBpbmZlciBhdCBhIGRlZmF1bHQgbG9jYXRpb24gdW5kZXIgW3Nka1Jvb3RdLCB0eXBpY2FsbHkgdW5kZXIKICAvLy8gYGxpYi9saWJyYXJpZXMuanNvbmAuCiAgVXJpIGxpYnJhcmllc1NwZWNpZmljYXRpb25Vcmk7CgogIERpYWdub3N0aWNNZXNzYWdlSGFuZGxlciBvbkRpYWdub3N0aWM7CgogIC8vLyBVUkkgb2YgdGhlICIucGFja2FnZXMiIGZpbGUgKHR5cGljYWxseSBhICJmaWxlOiIgVVJJKS4KICAvLy8KICAvLy8gSWYgYG51bGxgLCB0aGUgIi5wYWNrYWdlcyIgZmlsZSB3aWxsIGJlIGZvdW5kIHZpYSB0aGUgc3RhbmRhcmQKICAvLy8gcGFja2FnZV9jb25maWcgc2VhcmNoIGFsZ29yaXRobS4KICAvLy8KICAvLy8gSWYgdGhlIFVSSSdzIHBhdGggY29tcG9uZW50IGlzIGVtcHR5IChlLmcuIGBuZXcgVXJpKClgKSwgbm8gcGFja2FnZXMgZmlsZQogIC8vLyB3aWxsIGJlIHVzZWQuCiAgVXJpIHBhY2thZ2VzRmlsZVVyaTsKCiAgLy8vIFVSSXMgb2YgaW5wdXQgc3VtbWFyeSBmaWxlcyAoZXhjbHVkaW5nIHRoZSBTREsgc3VtbWFyeTsgdHlwaWNhbGx5IHRoZXNlCiAgLy8vIHdpbGwgYmUgImZpbGU6IiBVUklzKS4KICAvLy8KICAvLy8gVGhlc2UgZmlsZXMgc2hvdWxkIGJlIHN1bW1hcnkgZmlsZXMgZ2VuZXJhdGVkIGJ5IHRoaXMgcGFja2FnZSAoYW5kIG5vdCB0aGUKICAvLy8gc2ltaWxhcmx5IG5hbWVkIHN1bW1hcnkgZmlsZXMgZnJvbSBgcGFja2FnZTphbmFseXplcmAuKQogIC8vLwogIC8vLyBTdW1tYXJpZXMgbWF5IGJlIHByb3ZpZGVkIGluIGFueSBvcmRlciwgYnV0IHRoZXkgc2hvdWxkIGJlIGFjeWNsaWMgYW5kCiAgLy8vIGNsb3NlZDogYW55IGxpYnJhcmllcyB0aGF0IHRoZXkgcmVmZXJlbmNlIHNob3VsZCBiZSBkZWZpbmVkIGluIGVpdGhlciBvbmUKICAvLy8gb2YgW2lucHV0U3VtbWFyaWVzXSBvciBbc2RrU3VtbWFyeV0uCiAgTGlzdDxVcmk+IGlucHV0U3VtbWFyaWVzID0gW107CgogIC8vLyBVUklzIG9mIG90aGVyIGtlcm5lbCBjb21wb25lbnRzIHRvIGxpbmsuCiAgLy8vCiAgLy8vIENvbW1vbmx5IHVzZWQgdG8gbGluayB0aGUgY29kZSBmb3IgdGhlIFNESyBsaWJyYXJpZXMgdGhhdCB3YXMgY29tcGlsZWQKICAvLy8gc2VwYXJhdGVseS4gRm9yIGV4YW1wbGUsIGRhcnQyanMgbmVlZHMgdG8gbGluayB0aGUgU0RLIHNvIGl0IGNhbgogIC8vLyBvcHRpbWl6ZSBhbmQgdHJlZS1zaGFrZSB0aGUgY29kZSBmb3IgdGhlIGFwcGxpY2F0aW9uLCB3aGVyZWFzIHRoZSBWTQogIC8vLyBhbHdheXMgZW1iZWRzIHRoZSBTREsgaW50ZXJuYWxseSBhbmQgZG9lc24ndCBuZWVkIGl0IGFzIHBhcnQgb2YgdGhlCiAgLy8vIHByb2dyYW0uCiAgLy8vCiAgLy8vIFRoZSBjb21wb25lbnRzIHByb3ZpZGVkIGhlcmUgc2hvdWxkIGJlIGNsb3NlZCBhbmQgYWN5Y2xpYzogYW55IGxpYnJhcmllcwogIC8vLyB0aGF0IHRoZXkgcmVmZXJlbmNlIHNob3VsZCBiZSBkZWZpbmVkIGluIGEgY29tcG9uZW50IGluCiAgLy8vIFtsaW5rZWREZXBlbmRlbmNpZXNdIG9yIGFueSBvZiB0aGUgW2lucHV0U3VtbWFyaWVzXSBvciBbc2RrU3VtbWFyeV0uCiAgTGlzdDxVcmk+IGxpbmtlZERlcGVuZGVuY2llcyA9IFtdOwoKICAvLy8gVVJJIG9mIHRoZSBTREsgc3VtbWFyeSBmaWxlICh0eXBpY2FsbHkgYSAiZmlsZToiIFVSSSkuCiAgLy8vCiAgLy8vIFRoaXMgc2hvdWxkIHNob3VsZCBiZSBhIHN1bW1hcnkgcHJldmlvc2x5IGdlbmVyYXRlZCBieSB0aGlzIHBhY2thZ2UgKGFuZAogIC8vLyBub3QgdGhlIHNpbWlsYXJseSBuYW1lZCBzdW1tYXJ5IGZpbGVzIGZyb20gYHBhY2thZ2U6YW5hbHl6ZXJgLikKICAvLy8KICAvLy8gSWYgYG51bGxgIGFuZCBbY29tcGlsZVNka10gaXMgZmFsc2UsIHRoZSBTREsgc3VtbWFyeSB3aWxsIGJlIHNlYXJjaGVkIGZvcgogIC8vLyBhdCBhIGRlZmF1bHQgbG9jYXRpb24gd2l0aGluIFtzZGtSb290XS4KICBVcmkgc2RrU3VtbWFyeTsKCiAgLy8vIFRoZSBkZWNsYXJlZCB2YXJpYWJsZXMgZm9yIHVzZSBieSBjb25maWd1cmFibGUgaW1wb3J0cyBhbmQgY29uc3RhbnQKICAvLy8gZXZhbHVhdGlvbi4KICBNYXA8U3RyaW5nLCBTdHJpbmc+IGRlY2xhcmVkVmFyaWFibGVzOwoKICAvLy8gVGhlIFtGaWxlU3lzdGVtXSB3aGljaCBzaG91bGQgYmUgdXNlZCBieSB0aGUgZnJvbnQgZW5kIHRvIGFjY2VzcyBmaWxlcy4KICAvLy8KICAvLy8gQWxsIGZpbGUgc3lzdGVtIGFjY2VzcyBwZXJmb3JtZWQgYnkgdGhlIGZyb250IGVuZCBnb2VzIHRocm91Z2ggdGhpcwogIC8vLyBtZWNoYW5pc20sIHdpdGggb25lIGV4Y2VwdGlvbjogaWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkIGZvcgogIC8vLyBbcGFja2FnZXNGaWxlVXJpXSwgdGhlIHBhY2thZ2VzIGZpbGUgaXMgbG9jYXRlZCB1c2luZyB0aGUgYWN0dWFsIHBoeXNpY2FsCiAgLy8vIGZpbGUgc3lzdGVtLiAgVE9ETyhwYXVsYmVycnkpOiBmaXggdGhpcy4KICBGaWxlU3lzdGVtIGZpbGVTeXN0ZW0gPSBTdGFuZGFyZEZpbGVTeXN0ZW0uaW5zdGFuY2U7CgogIC8vLyBXaGV0aGVyIHRvIGdlbmVyYXRlIGNvZGUgZm9yIHRoZSBTREsuCiAgLy8vCiAgLy8vIEJ5IGRlZmF1bHQgdGhlIGZyb250IGVuZCByZXNvbHZlcyBjb21wb25lbnRzIHVzaW5nIGEgcHJlYnVpbHQgU0RLIHN1bW1hcnkuCiAgLy8vIFdoZW4gdGhpcyBvcHRpb24gaXMgYHRydWVgLCBbc2RrU3VtbWFyeV0gbXVzdCBiZSBudWxsLgogIGJvb2wgY29tcGlsZVNkayA9IGZhbHNlOwoKICBAZGVwcmVjYXRlZAogIGJvb2wgY2hhc2VEZXBlbmRlbmNpZXM7CgogIC8vLyBUcnVlIGlmIGVuYWJsaW5nIGxlZ2FjeSBtb2RlIChEYXJ0IDEgY29tcGF0aWJpbGl0eSkuCiAgYm9vbCBsZWdhY3lNb2RlID0gZmFsc2U7CgogIC8vLyBQYXRjaCBmaWxlcyB0byBhcHBseSBvbiB0aGUgY29yZSBsaWJyYXJpZXMgZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IHBsYXRmb3JtLgogIC8vLwogIC8vLyBLZXlzIGluIHRoZSBtYXAgYXJlIHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IHdpdGggbm8gYGRhcnQ6YCBwcmVmaXgsIGZvcgogIC8vLyBleGFtcGxlOgogIC8vLwogIC8vLyAgICAgIHsnY29yZSc6IFsKICAvLy8gICAgICAgICAnZmlsZTovLy9sb2NhdGlvbi9vZi9jb3JlL3BhdGNoX2ZpbGUxLmRhcnQnLAogIC8vLyAgICAgICAgICdmaWxlOi8vL2xvY2F0aW9uL29mL2NvcmUvcGF0Y2hfZmlsZTIuZGFydCcsCiAgLy8vICAgICAgICAgXX0KICAvLy8KICAvLy8gVGhlIHZhbHVlcyBjYW4gYmUgZWl0aGVyIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSSXMuIEFic29sdXRlIFVSSXMgYXJlIHJlYWQKICAvLy8gZGlyZWN0bHksIHdoaWxlIHJlbGF0aXZlIFVSSXMgYXJlIHJlc29sdmVkIGZyb20gdGhlIFtzZGtSb290XS4KICAvLyBUT0RPKHNpZ211bmQpOiBwcm92aWRlIGFsc28gYSBmbGFnIHRvIGxvYWQgdGhpcyBkYXRhIGZyb20gYSBmaWxlIChsaWtlCiAgLy8gbGlicmFyaWVzLmpzb24pCiAgTWFwPFN0cmluZywgTGlzdDxVcmk+PiB0YXJnZXRQYXRjaGVzID0gPFN0cmluZywgTGlzdDxVcmk+Pnt9OwoKICAvLy8gRW5hYmxlIG9yIGRpc2FibGUgZXhwZXJpbWVudGFsIGZlYXR1cmVzLiBGZWF0dXJlcyBtYXBwaW5nIHRvIGB0cnVlYCBhcmUKICAvLy8gZXhwbGljaXRseSBlbmFibGVkLiBGZWF0dXJlcyBtYXBwaW5nIHRvIGBmYWxzZWAgYXJlIGV4cGxpY2l0bHkgZGlzYWJsZWQuCiAgLy8vIEZlYXR1cmVzIG5vdCBtZW50aW9uZWQgaW4gdGhlIG1hcCB3aWxsIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZS4KICBNYXA8RXhwZXJpbWVudGFsRmxhZywgYm9vbD4gZXhwZXJpbWVudGFsRmxhZ3MgPSA8RXhwZXJpbWVudGFsRmxhZywgYm9vbD57fTsKCiAgLy8vIEVudmlyb25tZW50IG1hcCB1c2VkIHdoZW4gZXZhbHVhdGluZyBgYm9vbC5mcm9tRW52aXJvbm1lbnRgLAogIC8vLyBgaW50LmZyb21FbnZpcm9ubWVudGAgYW5kIGBTdHJpbmcuZnJvbUVudmlyb25tZW50YCBkdXJpbmcgY29uc3RhbnQKICAvLy8gZXZhbHVhdGlvbi4gSWYgdGhlIG1hcCBpcyBgbnVsbGAsIGFsbCBlbnZpcm9ubWVudCBjb25zdGFudHMgd2lsbCBiZSBsZWZ0CiAgLy8vIHVuZXZhbHVhdGVkIGFuZCBjYW4gYmUgZXZhbHVhdGVkIGJ5IGEgY29uc3RhbnQgZXZhbHVhdG9yIGxhdGVyLgogIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52aXJvbm1lbnREZWZpbmVzID0gbnVsbDsKCiAgLy8vIFRoZSB0YXJnZXQgcGxhdGZvcm0gdGhhdCB3aWxsIGNvbnN1bWUgdGhlIGNvbXBpbGVkIGNvZGUuCiAgLy8vCiAgLy8vIFVzZWQgdG8gcHJvdmlkZSBwbGF0Zm9ybS1zcGVjaWZpYyBkZXRhaWxzIHRvIHRoZSBjb21waWxlciBsaWtlOgogIC8vLyAgICogdGhlIHNldCBvZiBsaWJyYXJpZXMgYXJlIHBhcnQgb2YgYSBwbGF0Zm9ybSdzIFNESyAoZS5nLiBkYXJ0Omh0bWwgZm9yCiAgLy8vICAgICBkYXJ0MmpzLCBkYXJ0OnVpIGZvciBmbHV0dGVyKS4KICAvLy8KICAvLy8gICAqIHdoYXQga2VybmVsIHRyYW5zZm9ybWF0aW9ucyBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgY29tcG9uZW50CiAgLy8vICAgICAoYXN5bmMvYXdhaXQsIG1peGluIGlubGluaW5nLCBldGMpLgogIC8vLwogIC8vLyAgICogaG93IHRvIGRlYWwgd2l0aCBub24tc3RhbmRhcmQgZmVhdHVyZXMgbGlrZSBgbmF0aXZlYCBleHRlbnNpb25zLgogIC8vLwogIC8vLyBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB0YXJnZXQgaXMgdGhlIFZNLgogIFRhcmdldCB0YXJnZXQ7CgogIC8vLyBXaGV0aGVyIGFzc2VydHMgaW4gaW5pdGlhbGl6ZXJzIGluIGNvbnN0IGNvbnN0cnVjdG9ycyBhcmUgY2hlY2tlZCBkdXJpbmcKICAvLy8gY29uc3RhbnQgZXZhbHVhdGlvbi4KICBib29sIGVuYWJsZUFzc2VydHMgPSBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgdG8gc2hvdyB2ZXJib3NlIG1lc3NhZ2VzIChtYWlubHkgZm9yIGRlYnVnZ2luZyBhbmQgcGVyZm9ybWFuY2UKICAvLy8gdHJhY2tpbmcpLgogIC8vLwogIC8vLyBNZXNzYWdlcyBhcmUgcHJpbnRlZCBvbiBzdGRvdXQuCiAgLy8gVE9ETyhzaWdtdW5kKTogaW1wcm92ZSB0aGUgZGlhZ25vdGljcyBBUEkgdG8gcHJvdmlkZSBtZWNoYW5pc20gdG8gaW50ZXJjZXB0CiAgLy8gdmVyYm9zZSBkYXRhIChJc3N1ZSAjMzAwNTYpCiAgYm9vbCB2ZXJib3NlID0gZmFsc2U7CgogIC8vLyBXaGV0aGVyIHRvIHJ1biBleHRyYSB2ZXJpZmljYXRpb24gc3RlcHMgdG8gdmFsaWRhdGUgdGhhdCBjb21waWxlZAogIC8vLyBjb21wb25lbnRzIGFyZSB3ZWxsIGZvcm1lZC4KICAvLy8KICAvLy8gRXJyb3JzIGFyZSByZXBvcnRlZCB2aWEgdGhlIFtvbkRpYWdub3N0aWNdIGNhbGxiYWNrLgogIGJvb2wgdmVyaWZ5ID0gZmFsc2U7CgogIC8vLyBXaGV0aGVyIHRvIGR1bXAgZ2VuZXJhdGVkIGNvbXBvbmVudHMgaW4gYSB0ZXh0IGZvcm1hdCAoYWxzbyBtYWlubHkgZm9yCiAgLy8vIGRlYnVnZ2luZykuCiAgLy8vCiAgLy8vIER1bXBlZCBkYXRhIGlzIHByaW50ZWQgaW4gc3Rkb3V0LgogIGJvb2wgZGVidWdEdW1wID0gZmFsc2U7CgogIC8vLyBXaGV0aGVyIHRvIG9taXQgdGhlIHBsYXRmb3JtIHdoZW4gc2VyaWFsaXppbmcgdGhlIHJlc3VsdCBmcm9tIGEgYGZhc3RhCiAgLy8vIGNvbXBpbGVgIHJ1bi4KICBib29sIG9taXRQbGF0Zm9ybSA9IGZhbHNlOwoKICAvLy8gV2hldGhlciB0byBzZXQgdGhlIGV4aXQgY29kZSB0byBub24temVybyBpZiBhbnkgcHJvYmxlbSAoaW5jbHVkaW5nCiAgLy8vIHdhcm5pbmcsIGV0Yy4pIGlzIGVuY291bnRlcmVkIGR1cmluZyBjb21waWxhdGlvbi4KICBib29sIHNldEV4aXRDb2RlT25Qcm9ibGVtID0gZmFsc2U7CgogIC8vLyBXaGV0aGVyIHRvIGVtYmVkIHRoZSBpbnB1dCBzb3VyY2VzIGluIGdlbmVyYXRlZCBrZXJuZWwgY29tcG9uZW50cy4KICAvLy8KICAvLy8gVGhlIGtlcm5lbCBgQ29tcG9uZW50YCBBUEkgaW5jbHVkZXMgYSBgdXJpVG9Tb3VyY2VgIG1hcCBmaWVsZCB0aGF0IGlzIHVzZWQKICAvLy8gdG8gZW1iZWQgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgc291cmNlIGZpbGVzLiBUaGlzIHBhcnQgb2YgdGhlIGtlcm5lbAogIC8vLyBBUEkgaXMgaW4gZmx1eCBhbmQgaXQgaXMgbm90IG5lY2Vzc2FyeSBmb3Igc29tZSB0b29scy4gVG9kYXkgaXQgaXMgdXNlZAogIC8vLyBmb3IgdHJhbnNsYXRpbmcgZXJyb3IgbG9jYXRpb25zIGFuZCBzdGFjayB0cmFjZXMgaW4gdGhlIFZNLgogIC8vIFRPRE8oc2lnbXVuZCk6IGNoYW5nZSB0aGUgZGVmYXVsdC4KICBib29sIGVtYmVkU291cmNlVGV4dCA9IHRydWU7CgogIC8vLyBXaGV0aGVyIHRoZSBjb21waWxlciBzaG91bGQgdGhyb3cgYXMgc29vbiBhcyBpdCBlbmNvdW50ZXJzIGEKICAvLy8gY29tcGlsYXRpb24gZXJyb3IuCiAgLy8vCiAgLy8vIFR5cGljYWxseSB1c2VkIGJ5IGRldmVsb3BlcnMgdG8gZGVidWcgaW50ZXJuYWxzIG9mIHRoZSBjb21waWxlci4KICBib29sIHRocm93T25FcnJvcnNGb3JEZWJ1Z2dpbmcgPSBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgdGhlIGNvbXBpbGVyIHNob3VsZCB0aHJvdyBhcyBzb29uIGFzIGl0IGVuY291bnRlcnMgYQogIC8vLyBjb21waWxhdGlvbiB3YXJuaW5nLgogIC8vLwogIC8vLyBUeXBpY2FsbHkgdXNlZCBieSBkZXZlbG9wZXJzIHRvIGRlYnVnIGludGVybmFscyBvZiB0aGUgY29tcGlsZXIuCiAgYm9vbCB0aHJvd09uV2FybmluZ3NGb3JEZWJ1Z2dpbmcgPSBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgdG8gZ2VuZXJhdGUgYnl0ZWNvZGUuCiAgYm9vbCBieXRlY29kZSA9IGZhbHNlOwoKICAvLy8gV2hldGhlciB0byB3cml0ZSBhIGZpbGUgKGUuZy4gYSBkaWxsIGZpbGUpIHdoZW4gcmVwb3J0aW5nIGEgY3Jhc2guCiAgYm9vbCB3cml0ZUZpbGVPbkNyYXNoUmVwb3J0ID0gdHJ1ZTsKfQoKLy8vIFBhcnNlIGV4cGVyaW1lbnRhbCBmbGFncyBmcm9tIGEgbGlzdCBvZiBzdHJpbmdzLCBlYWNoIG9mIHdoaWNoIGlzIGVpdGhlciBhCi8vLyBmbGFnIG5hbWUgb3IgYSBmbGFnIG5hbWUgcHJlZml4ZWQgYnkgJ25vLScuIFJldHVybiBhIG1hcCBvZiBmbGFncyB0byB0aGVpcgovLy8gdmFsdWVzIHRoYXQgY2FuIGJlIHBhc3NlZCB0byBbZXhwZXJpbWVudGFsRmxhZ3NdLiBUaGUgcmV0dXJuZWQgbWFwIGlzCi8vLyBub3JtYWxpemVkIHRvIGNvbnRhaW4gZGVmYXVsdCB2YWx1ZXMgZm9yIHVubWVudGlvbmVkIGZsYWdzLgovLy8KLy8vIElmIGFuIHVua25vd24gZmxhZyBpcyBtZW50aW9uZWQsIG9yIGEgZmxhZyBpcyBtZW50aW9uZWQgbW9yZSB0aGFuIG9uY2UsCi8vLyB0aGUgc3VwcGxpZWQgZXJyb3IgaGFuZGxlciBpcyBjYWxsZWQgd2l0aCBhbiBlcnJvciBtZXNzYWdlLgpNYXA8RXhwZXJpbWVudGFsRmxhZywgYm9vbD4gcGFyc2VFeHBlcmltZW50YWxGbGFncygKICAgIEl0ZXJhYmxlPFN0cmluZz4gZXhwZXJpbWVudHMsIHZvaWQgb25FcnJvcihTdHJpbmcgbWVzc2FnZSkpIHsKICBNYXA8RXhwZXJpbWVudGFsRmxhZywgYm9vbD4gZmxhZ3MgPSA8RXhwZXJpbWVudGFsRmxhZywgYm9vbD57fTsKICBpZiAoZXhwZXJpbWVudHMgIT0gbnVsbCkgewogICAgZm9yIChTdHJpbmcgZXhwZXJpbWVudCBpbiBleHBlcmltZW50cykgewogICAgICBib29sIHZhbHVlID0gdHJ1ZTsKICAgICAgaWYgKGV4cGVyaW1lbnQuc3RhcnRzV2l0aCgibm8tIikpIHsKICAgICAgICB2YWx1ZSA9IGZhbHNlOwogICAgICAgIGV4cGVyaW1lbnQgPSBleHBlcmltZW50LnN1YnN0cmluZygzKTsKICAgICAgfQogICAgICBFeHBlcmltZW50YWxGbGFnIGZsYWcgPSBwYXJzZUV4cGVyaW1lbnRhbEZsYWcoZXhwZXJpbWVudCk7CiAgICAgIGlmIChmbGFnID09IG51bGwpIHsKICAgICAgICBvbkVycm9yKCJVbmtub3duIGV4cGVyaW1lbnQ6ICIgKyBleHBlcmltZW50KTsKICAgICAgfSBlbHNlIGlmIChmbGFncy5jb250YWluc0tleShmbGFnKSkgewogICAgICAgIGlmIChmbGFnc1tmbGFnXSAhPSB2YWx1ZSkgewogICAgICAgICAgb25FcnJvcigKICAgICAgICAgICAgICAiRXhwZXJpbWVudCBzcGVjaWZpZWQgd2l0aCBjb25mbGljdGluZyB2YWx1ZXM6ICIgKyBleHBlcmltZW50KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZmxhZ3NbZmxhZ10gPSB2YWx1ZTsKICAgICAgfQogICAgfQogIH0KICBmb3IgKEV4cGVyaW1lbnRhbEZsYWcgZmxhZyBpbiBFeHBlcmltZW50YWxGbGFnLnZhbHVlcykgewogICAgYXNzZXJ0KGRlZmF1bHRFeHBlcmltZW50YWxGbGFncy5jb250YWluc0tleShmbGFnKSwKICAgICAgICAiTm8gZGVmYXVsdCB2YWx1ZSBmb3IgJGZsYWcuIik7CiAgICBmbGFnc1tmbGFnXSA/Pz0gZGVmYXVsdEV4cGVyaW1lbnRhbEZsYWdzW2ZsYWddOwogIH0KICByZXR1cm4gZmxhZ3M7Cn0KgPkATk48ASQBOQFAASFMASsBPAE5ATYEOxhFBjQ5DwE2Bk5GTxIGTUMcIQEpAT0GRScGUBQXAU4dBlE+Bk1QKyEBLwZNR0tKDwZPPkslAT0GT0YGUC4SAUoSKQFOBkpCUC83ASwGUT0bAQ4aATsbAVEGTg8GFjs7EQZRRUwVQAFOT0dOAUNJT0YxAT8GRlApBkkuBksGNhEBTxseAU0RBiZRIRgBSCIGOxcBTRIGKBoBTRQdAUk4JQFJBlFQTkIoHwFDGQZHKgFDGwZHLAEkGQFJJgIBT09KQARMQDRCQh0tGSoXLghBGjYsJBNOCg8dCAYEOzcoNAQQAgE5cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUvY29tcGlsZXJfb3B0aW9ucy5kYXJ0RHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9hcGlfcHJvdG90eXBlL2RpYWdub3N0aWNfbWVzc2FnZS5kYXJ0itwvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmcm9udF9lbmQuZGlhZ25vc3RpY19tZXNzYWdlOwoKaW1wb3J0ICcuLi9mYXN0YS9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdyBDb2RlLCBEaWFnbm9zdGljTWVzc2FnZUZyb21Kc29uLCBGb3JtYXR0ZWRNZXNzYWdlOwoKaW1wb3J0ICcuLi9mYXN0YS9zZXZlcml0eS5kYXJ0JyBzaG93IFNldmVyaXR5OwoKLy8vIFRoZSB0eXBlIG9mIGEgZGlhZ25vc3RpYyBtZXNzYWdlIGNhbGxiYWNrLiBGb3IgZXhhbXBsZToKLy8vCi8vLyAgICB2b2lkIGhhbmRsZXIoRGlhZ25vc3RpY01lc3NhZ2UgbWVzc2FnZSkgewovLy8gICAgICBpZiAoZW5hYmxlVGVybWluYWxDb2xvcnMpIHsgLy8gU2VlIFt0ZXJtaW5hbF9jb2xvcl9zdXBwb3J0LmRhcnRdLgovLy8gICAgICAgIG1lc3NhZ2UuYW5zaUZvcm1hdHRlZC5mb3JFYWNoKHN0ZGVyci53cml0ZWxuKTsKLy8vICAgICAgfSBlbHNlIHsKLy8vICAgICAgICBtZXNzYWdlLnBsYWluVGV4dEZvcm1hdHRlZC5mb3JFYWNoKHN0ZGVyci53cml0ZWxuKTsKLy8vICAgICAgfQovLy8gICAgfQp0eXBlZGVmIERpYWdub3N0aWNNZXNzYWdlSGFuZGxlciA9IHZvaWQgRnVuY3Rpb24oRGlhZ25vc3RpY01lc3NhZ2UpOwoKLy8vIFJlcHJlc2VudHMgYSBkaWFnbm9zdGljIG1lc3NhZ2UgdGhhdCBjYW4gYmUgcmVwb3J0ZWQgZnJvbSBhIHRvb2wsIGZvcgovLy8gZXhhbXBsZSwgYSBjb21waWxlci4KLy8vCi8vLyBUaGUgd29yZCAqZGlhZ25vc3RpYyogaXMgdXNlZCBsb29zZWx5IGhlcmUsIGFzIGEgdG9vbCBtYXkgYWxzbyB1c2UgdGhpcyBmb3IKLy8vIHJlcG9ydGluZyBhbnkga2luZCBvZiBtZXNzYWdlLCBpbmNsdWRpbmcgbm9uLWRpYWdub3N0aWMgbWVzc2FnZXMgc3VjaCBhcwovLy8gbGljZW5zaW5nLCBpbmZvcm1hbCwgb3IgbG9nZ2luZyBpbmZvcm1hdGlvbi4gVGhpcyBhbGxvd3MgYSB3ZWxsLWJlaGF2ZWQKLy8vIHRvb2wgdG8gbmV2ZXIgZGlyZWN0bHkgd3JpdGUgdG8gc3Rkb3V0IG9yIHN0ZGVyci4KYWJzdHJhY3QgY2xhc3MgRGlhZ25vc3RpY01lc3NhZ2UgewogIERpYWdub3N0aWNNZXNzYWdlLl8oKTsgLy8gUHJldmVudCBzdWJjbGFzc2luZy4KCiAgSXRlcmFibGU8U3RyaW5nPiBnZXQgYW5zaUZvcm1hdHRlZDsKCiAgSXRlcmFibGU8U3RyaW5nPiBnZXQgcGxhaW5UZXh0Rm9ybWF0dGVkOwoKICBTZXZlcml0eSBnZXQgc2V2ZXJpdHk7Cn0KCi8vLyBUaGlzIG1ldGhvZCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KVXJpIGdldE1lc3NhZ2VVcmkoRGlhZ25vc3RpY01lc3NhZ2UgbWVzc2FnZSkgewogIHJldHVybiBtZXNzYWdlIGlzIEZvcm1hdHRlZE1lc3NhZ2UKICAgICAgPyBtZXNzYWdlLnVyaQogICAgICA6IG1lc3NhZ2UgaXMgRGlhZ25vc3RpY01lc3NhZ2VGcm9tSnNvbiA/IG1lc3NhZ2UudXJpIDogbnVsbDsKfQoKLy8vIFRoaXMgbWV0aG9kIGlzIHN1YmplY3QgdG8gY2hhbmdlLgppbnQgZ2V0TWVzc2FnZUNoYXJPZmZzZXQoRGlhZ25vc3RpY01lc3NhZ2UgbWVzc2FnZSkgewogIHJldHVybiBtZXNzYWdlIGlzIEZvcm1hdHRlZE1lc3NhZ2UgPyBtZXNzYWdlLmNoYXJPZmZzZXQgOiBudWxsOwp9CgovLy8gVGhpcyBtZXRob2QgaXMgc3ViamVjdCB0byBjaGFuZ2UuCmludCBnZXRNZXNzYWdlTGVuZ3RoKERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UpIHsKICByZXR1cm4gbWVzc2FnZSBpcyBGb3JtYXR0ZWRNZXNzYWdlID8gbWVzc2FnZS5sZW5ndGggOiBudWxsOwp9CgovLy8gVGhpcyBtZXRob2QgaXMgc3ViamVjdCB0byBjaGFuZ2UuCkNvZGUgZ2V0TWVzc2FnZUNvZGVPYmplY3QoRGlhZ25vc3RpY01lc3NhZ2UgbWVzc2FnZSkgewogIHJldHVybiBtZXNzYWdlIGlzIEZvcm1hdHRlZE1lc3NhZ2UgPyBtZXNzYWdlLmNvZGUgOiBudWxsOwp9CgovLy8gVGhpcyBtZXRob2QgaXMgc3ViamVjdCB0byBjaGFuZ2UuClN0cmluZyBnZXRNZXNzYWdlSGVhZGVyVGV4dChEaWFnbm9zdGljTWVzc2FnZSBtZXNzYWdlKSB7CiAgcmV0dXJuIG1lc3NhZ2UgaXMgRm9ybWF0dGVkTWVzc2FnZSA/IG1lc3NhZ2UubWVzc2FnZSA6IG51bGw7Cn0KCi8vLyBUaGlzIG1ldGhvZCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KaW50IGdldE1lc3NhZ2VDb2RlKERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UpIHsKICByZXR1cm4gbWVzc2FnZSBpcyBGb3JtYXR0ZWRNZXNzYWdlID8gbWVzc2FnZS5jb2RlLmluZGV4IDogLTE7Cn0KCi8vLyBUaGlzIG1ldGhvZCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KTWFwPFN0cmluZywgZHluYW1pYz4gZ2V0TWVzc2FnZUFyZ3VtZW50cyhEaWFnbm9zdGljTWVzc2FnZSBtZXNzYWdlKSB7CiAgcmV0dXJuIG1lc3NhZ2UgaXMgRm9ybWF0dGVkTWVzc2FnZSA/IG1lc3NhZ2UuYXJndW1lbnRzIDogbnVsbDsKfQoKLy8vIFRoaXMgbWV0aG9kIGlzIHN1YmplY3QgdG8gY2hhbmdlLgpJdGVyYWJsZTxEaWFnbm9zdGljTWVzc2FnZT4gZ2V0TWVzc2FnZVJlbGF0ZWRJbmZvcm1hdGlvbigKICAgIERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UpIHsKICByZXR1cm4gbWVzc2FnZSBpcyBGb3JtYXR0ZWRNZXNzYWdlID8gbWVzc2FnZS5yZWxhdGVkSW5mb3JtYXRpb24gOiBudWxsOwp9ClMATk48ASYBIzwBLwE8BDFLOhI/CwlFAUoZBFBNTDYjMQEmASsBGQIBJi8lFEMCASY2QgIBJjI+AgEmNzwCASY5PwIBJjBAAgEmRkECASY6IUoCATtwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS9kaWFnbm9zdGljX21lc3NhZ2UuZGFydERzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvYXBpX3Byb3RvdHlwZS9leHBlcmltZW50YWxfZmxhZ3MuZGFydIQdLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIFRPRE8oYXNrZXNjKTogR2VuZXJhdGUgdGhpcyBmaWxlIGZyb20gYSBmbGFnIHNwZWNpZmljYXRpb24uCgplbnVtIEV4cGVyaW1lbnRhbEZsYWcgewogIGNvbnN0YW50VXBkYXRlMjAxOCwKICBjb250cm9sRmxvd0NvbGxlY3Rpb25zLAogIHNldExpdGVyYWxzLAogIHNwcmVhZENvbGxlY3Rpb25zLAp9CgpFeHBlcmltZW50YWxGbGFnIHBhcnNlRXhwZXJpbWVudGFsRmxhZyhTdHJpbmcgZmxhZykgewogIHN3aXRjaCAoZmxhZykgewogICAgY2FzZSAiY29uc3RhbnQtdXBkYXRlLTIwMTgiOgogICAgICByZXR1cm4gRXhwZXJpbWVudGFsRmxhZy5jb25zdGFudFVwZGF0ZTIwMTg7CiAgICBjYXNlICJjb250cm9sLWZsb3ctY29sbGVjdGlvbnMiOgogICAgICByZXR1cm4gRXhwZXJpbWVudGFsRmxhZy5jb250cm9sRmxvd0NvbGxlY3Rpb25zOwogICAgY2FzZSAic2V0LWxpdGVyYWxzIjoKICAgICAgcmV0dXJuIEV4cGVyaW1lbnRhbEZsYWcuc2V0TGl0ZXJhbHM7CiAgICBjYXNlICJzcHJlYWQtY29sbGVjdGlvbnMiOgogICAgICByZXR1cm4gRXhwZXJpbWVudGFsRmxhZy5zcHJlYWRDb2xsZWN0aW9uczsKICB9CiAgcmV0dXJuIG51bGw7Cn0KCmNvbnN0IE1hcDxFeHBlcmltZW50YWxGbGFnLCBib29sPiBkZWZhdWx0RXhwZXJpbWVudGFsRmxhZ3MgPSB7CiAgRXhwZXJpbWVudGFsRmxhZy5jb25zdGFudFVwZGF0ZTIwMTg6IGZhbHNlLAogIEV4cGVyaW1lbnRhbEZsYWcuY29udHJvbEZsb3dDb2xsZWN0aW9uczogZmFsc2UsCiAgRXhwZXJpbWVudGFsRmxhZy5zZXRMaXRlcmFsczogdHJ1ZSwKICBFeHBlcmltZW50YWxGbGFnLnNwcmVhZENvbGxlY3Rpb25zOiBmYWxzZSwKfTsKIwBOTjwBPwEYFhoPFQIBNhIhMiU2GSsfMQQPAgE/LjImLQMBO3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfcHJvdG90eXBlL2V4cGVyaW1lbnRhbF9mbGFncy5kYXJ0PXNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9hcGlfcHJvdG90eXBlL2ZpbGVfc3lzdGVtLmRhcnSKYy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZyb250X2VuZC5maWxlX3N5c3RlbTsKCmltcG9ydCAnZGFydDphc3luYyc7CgovLy8gQWJzdHJhY3QgaW50ZXJmYWNlIHRvIGZpbGUgc3lzdGVtIG9wZXJhdGlvbnMuCi8vLwovLy8gQWxsIGZyb250IGVuZCBpbnRlcmFjdGlvbiB3aXRoIHRoZSBmaWxlIHN5c3RlbSBnb2VzIHRocm91Z2ggdGhpcyBpbnRlcmZhY2U7Ci8vLyB0aGlzIG1ha2VzIGl0IHBvc3NpYmxlIGZvciBjbGllbnRzIHRvIHVzZSB0aGUgZnJvbnQgZW5kIGluIGEgd2F5IHRoYXQKLy8vIGRvZXNuJ3QgcmVxdWlyZSBmaWxlIHN5c3RlbSBhY2Nlc3MgKGUuZy4gdG8gcnVuIHVuaXQgdGVzdHMsIG9yIHRvIHJ1bgovLy8gaW5zaWRlIGEgYnJvd3NlcikuCi8vLwovLy8gTm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIG9yIGV4dGVuZGVkIGJ5IGNsaWVudHMuCmFic3RyYWN0IGNsYXNzIEZpbGVTeXN0ZW0gewogIC8vLyBSZXR1cm5zIGEgW0ZpbGVTeXN0ZW1FbnRpdHldIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIFt1cmldLgogIC8vLwogIC8vLyBVc2VzIG9mIGAuLmAgYW5kIGAuYCBpbiB0aGUgVVJJIGFyZSBub3JtYWxpemVkIGJlZm9yZSByZXR1cm5pbmcuCiAgLy8vCiAgLy8vIElmIHRoZSBVUkkgc2NoZW1lIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlIHN5c3RlbSwgYW4gW0Vycm9yXSB3aWxsIGJlCiAgLy8vIHRocm93bi4KICAvLy8KICAvLy8gRG9lcyBub3QgY2hlY2sgd2hldGhlciBhIGZpbGUgb3IgZm9sZGVyIGV4aXN0cyBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24uCiAgRmlsZVN5c3RlbUVudGl0eSBlbnRpdHlGb3JVcmkoVXJpIHVyaSk7Cn0KCi8vLyBBYnN0cmFjdCByZXByZXNlbnRhdGlvbiBvZiBhIGZpbGUgc3lzdGVtIGVudGl0eSB0aGF0IG1heSBvciBtYXkgbm90IGV4aXN0LgovLy8KLy8vIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGhhdmUgc3VpdGFibGUgaW1wbGVtZW50YXRpb25zIG9mIGVxdWFsaXR5IHRlc3RzIGFuZAovLy8gaGFzaENvZGUuCi8vLwovLy8gTm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIG9yIGV4dGVuZGVkIGJ5IGNsaWVudHMuCmFic3RyYWN0IGNsYXNzIEZpbGVTeXN0ZW1FbnRpdHkgewogIC8vLyBUaGUgYWJzb2x1dGUgbm9ybWFsaXplZCBVUkkgcmVwcmVzZW50ZWQgYnkgdGhpcyBmaWxlIHN5c3RlbSBlbnRpdHkuCiAgLy8vCiAgLy8vIE5vdGU6IHRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBVUkkgdGhhdCB3YXMgcGFzc2VkIHRvCiAgLy8vIFtGaWxlU3lzdGVtLmVudGl0eUZvclVyaV0sIHNpbmNlIHRoZSBVUkkgbWlnaHQgaGF2ZSBiZWVuIG5vcm1hbGl6ZWQuCiAgVXJpIGdldCB1cmk7CgogIC8vLyBXaGV0aGVyIHRoaXMgZmlsZSBzeXN0ZW0gZW50aXR5IGV4aXN0cy4KICBGdXR1cmU8Ym9vbD4gZXhpc3RzKCk7CgogIC8vLyBBdHRlbXB0cyB0byBhY2Nlc3MgdGhpcyBmaWxlIHN5c3RlbSBlbnRpdHkgYXMgYSBmaWxlIGFuZCByZWFkIGl0cyBjb250ZW50cwogIC8vLyBhcyByYXcgYnl0ZXMuCiAgLy8vCiAgLy8vIElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBhdHRlbXB0aW5nIHRvIHJlYWQgdGhlIGZpbGUgKGUuZy4gYmVjYXVzZSBubyBzdWNoCiAgLy8vIGZpbGUgZXhpc3RzLCBvciB0aGUgZW50aXR5IGlzIGEgZGlyZWN0b3J5KSwgdGhlIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aAogIC8vLyBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0uCiAgRnV0dXJlPExpc3Q8aW50Pj4gcmVhZEFzQnl0ZXMoKTsKCiAgLy8vIEF0dGVtcHRzIHRvIGFjY2VzcyB0aGlzIGZpbGUgc3lzdGVtIGVudGl0eSBhcyBhIGZpbGUgYW5kIHJlYWQgaXRzIGNvbnRlbnRzCiAgLy8vIGFzIGEgc3RyaW5nLgogIC8vLwogIC8vLyBUaGUgZmlsZSBpcyBhc3N1bWVkIHRvIGJlIFVURi04IGVuY29kZWQuCiAgLy8vCiAgLy8vIElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBhdHRlbXB0aW5nIHRvIHJlYWQgdGhlIGZpbGUgKGUuZy4gYmVjYXVzZSBubyBzdWNoCiAgLy8vIGZpbGUgZXhpc3RzLCB0aGUgZW50aXR5IGlzIGEgZGlyZWN0b3J5LCBvciB0aGUgZmlsZSBpcyBub3QgdmFsaWQgVVRGLTgpLAogIC8vLyB0aGUgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIFtGaWxlU3lzdGVtRXhjZXB0aW9uXS4KICBGdXR1cmU8U3RyaW5nPiByZWFkQXNTdHJpbmcoKTsKfQoKLyoqCiAqIEJhc2UgY2xhc3MgZm9yIGFsbCBmaWxlIHN5c3RlbSBleGNlcHRpb25zLgogKi8KY2xhc3MgRmlsZVN5c3RlbUV4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbiB7CiAgZmluYWwgVXJpIHVyaTsKICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKCiAgRmlsZVN5c3RlbUV4Y2VwdGlvbih0aGlzLnVyaSwgdGhpcy5tZXNzYWdlKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0ZpbGVTeXN0ZW1FeGNlcHRpb24odXJpPSR1cmk7IG1lc3NhZ2U9JG1lc3NhZ2UpJzsKfQpNAE5OPAEfARUBMgRQSkoXBDscRQZHBlEOBkwqAgFPBFAOBDsiSgZLSw8BLhkBURQGUU8dIwFREwYvBlFPOiECAQQuBDERGAEvAQxKAgE0cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUvZmlsZV9zeXN0ZW0uZGFydDpzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvYmFzZS9wcm9jZXNzZWRfb3B0aW9ucy5kYXJ0wABfui8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6aW8nIHNob3cgZXhpdENvZGU7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnIHNob3cgRnV0dXJlOwoKaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9iaW5hcnkvYXN0X2Zyb21fYmluYXJ5LmRhcnQnIHNob3cgQmluYXJ5QnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwva2VybmVsLmRhcnQnIHNob3cgQ2Fub25pY2FsTmFtZSwgQ29tcG9uZW50LCBMb2NhdGlvbjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdGFyZ2V0L3RhcmdldHMuZGFydCcKICAgIHNob3cgTm9uZVRhcmdldCwgVGFyZ2V0LCBUYXJnZXRGbGFnczsKCmltcG9ydCAncGFja2FnZTpwYWNrYWdlX2NvbmZpZy9wYWNrYWdlcy5kYXJ0JyBzaG93IFBhY2thZ2VzOwoKaW1wb3J0ICdwYWNrYWdlOnBhY2thZ2VfY29uZmlnL3BhY2thZ2VzX2ZpbGUuZGFydCcgYXMgcGFja2FnZV9jb25maWc7CgppbXBvcnQgJ3BhY2thZ2U6cGFja2FnZV9jb25maWcvc3JjL3BhY2thZ2VzX2ltcGwuZGFydCcgc2hvdyBNYXBQYWNrYWdlczsKCmltcG9ydCAnLi4vYXBpX3Byb3RvdHlwZS9jb21waWxlcl9vcHRpb25zLmRhcnQnCiAgICBzaG93IENvbXBpbGVyT3B0aW9ucywgRGlhZ25vc3RpY01lc3NhZ2U7CgppbXBvcnQgJy4uL2FwaV9wcm90b3R5cGUvZXhwZXJpbWVudGFsX2ZsYWdzLmRhcnQnCiAgICBzaG93IGRlZmF1bHRFeHBlcmltZW50YWxGbGFncywgRXhwZXJpbWVudGFsRmxhZzsKCmltcG9ydCAnLi4vYXBpX3Byb3RvdHlwZS9maWxlX3N5c3RlbS5kYXJ0JwogICAgc2hvdyBGaWxlU3lzdGVtLCBGaWxlU3lzdGVtRW50aXR5LCBGaWxlU3lzdGVtRXhjZXB0aW9uOwoKaW1wb3J0ICcuLi9hcGlfcHJvdG90eXBlL3Rlcm1pbmFsX2NvbG9yX3N1cHBvcnQuZGFydCcKICAgIHNob3cgcHJpbnREaWFnbm9zdGljTWVzc2FnZTsKCmltcG9ydCAnLi4vZmFzdGEvY29tbWFuZF9saW5lX3JlcG9ydGluZy5kYXJ0JyBhcyBjb21tYW5kX2xpbmVfcmVwb3J0aW5nOwoKaW1wb3J0ICcuLi9mYXN0YS9jb21waWxlcl9jb250ZXh0LmRhcnQnIHNob3cgQ29tcGlsZXJDb250ZXh0OwoKaW1wb3J0ICcuLi9mYXN0YS9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIEZvcm1hdHRlZE1lc3NhZ2UsCiAgICAgICAgTG9jYXRlZE1lc3NhZ2UsCiAgICAgICAgTWVzc2FnZSwKICAgICAgICBtZXNzYWdlQ2FudEluZmVyUGFja2FnZXNGcm9tTWFueUlucHV0cywKICAgICAgICBtZXNzYWdlQ2FudEluZmVyUGFja2FnZXNGcm9tUGFja2FnZVVyaSwKICAgICAgICBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtUHJvdmlkZWRCb3RoQ29tcGlsZVNka0FuZFNka1N1bW1hcnksCiAgICAgICAgbWVzc2FnZU1pc3NpbmdJbnB1dCwKICAgICAgICBub0xlbmd0aCwKICAgICAgICB0ZW1wbGF0ZUNhbm5vdFJlYWRTZGtTcGVjaWZpY2F0aW9uLAogICAgICAgIHRlbXBsYXRlQ2FudFJlYWRGaWxlLAogICAgICAgIHRlbXBsYXRlSW5wdXRGaWxlTm90Rm91bmQsCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbnN1cHBvcnRlZCwKICAgICAgICB0ZW1wbGF0ZVBhY2thZ2VzRmlsZUZvcm1hdCwKICAgICAgICB0ZW1wbGF0ZVNka1Jvb3ROb3RGb3VuZCwKICAgICAgICB0ZW1wbGF0ZVNka1NwZWNpZmljYXRpb25Ob3RGb3VuZCwKICAgICAgICB0ZW1wbGF0ZVNka1N1bW1hcnlOb3RGb3VuZDsKCmltcG9ydCAnLi4vZmFzdGEvbWVzc2FnZXMuZGFydCcgc2hvdyBnZXRMb2NhdGlvbjsKCmltcG9ydCAnLi4vZmFzdGEvcHJvYmxlbXMuZGFydCcgc2hvdyBEZWJ1Z0Fib3J0LCB1bmltcGxlbWVudGVkOwoKaW1wb3J0ICcuLi9mYXN0YS9zZXZlcml0eS5kYXJ0JyBzaG93IFNldmVyaXR5OwoKaW1wb3J0ICcuLi9mYXN0YS90aWNrZXIuZGFydCcgc2hvdyBUaWNrZXI7CgppbXBvcnQgJy4uL2Zhc3RhL3VyaV90cmFuc2xhdG9yLmRhcnQnIHNob3cgVXJpVHJhbnNsYXRvcjsKCmltcG9ydCAnbGlicmFyaWVzX3NwZWNpZmljYXRpb24uZGFydCcKICAgIHNob3cKICAgICAgICBMaWJyYXJpZXNTcGVjaWZpY2F0aW9uLAogICAgICAgIExpYnJhcmllc1NwZWNpZmljYXRpb25FeGNlcHRpb24sCiAgICAgICAgVGFyZ2V0TGlicmFyaWVzU3BlY2lmaWNhdGlvbjsKCi8vLyBBbGwgb3B0aW9ucyBuZWVkZWQgZm9yIHRoZSBmcm9udCBlbmQgaW1wbGVtZW50YXRpb24uCi8vLwovLy8gVGhpcyBpbmNsdWRlczogYWxsIG9mIFtDb21waWxlck9wdGlvbnNdIGluIGEgZm9ybSB1c2VmdWwgdG8gdGhlCi8vLyBpbXBsZW1lbnRhdGlvbiwgZGVmYXVsdCB2YWx1ZXMgZm9yIG9wdGlvbnMgdGhhdCB3ZXJlIG5vdCBwcm92aWRlZCwKLy8vIGFuZCBpbmZvcm1hdGlvbiBkZXJpdmVkIGZyb20gaG93IHRoZSBjb21waWxlciB3YXMgaW52b2tlZCAobGlrZSB0aGUKLy8vIGVudHJ5LXBvaW50cyBnaXZlbiB0byB0aGUgY29tcGlsZXIgYW5kIHdoZXRoZXIgYSBtb2R1bGFyIG9yIHdob2xlLXByb2dyYW0KLy8vIEFQSSB3YXMgdXNlZCkuCi8vLwovLy8gVGhlIGludGVudCBpcyB0aGF0IHRoZSBmcm9udCBlbmQgc2hvdWxkIGltbWVkaWF0ZWx5IHdyYXAgYW55IGluY29taW5nCi8vLyBbQ29tcGlsZXJPcHRpb25zXSBvYmplY3QgaW4gdGhpcyBjbGFzcyBiZWZvcmUgZG9pbmcgZnVydGhlciBwcm9jZXNzaW5nLCBhbmQKLy8vIHNob3VsZCB0aGVyZWFmdGVyIGFjY2VzcyBhbGwgb3B0aW9ucyB2aWEgdGhlIHdyYXBwZXIuICBUaGlzIGVuc3VyZXMgdGhhdAovLy8gb3B0aW9ucyBhcmUgaW50ZXJwcmV0ZWQgaW4gYSBjb25zaXN0ZW50IHdheSBhbmQgdGhhdCBkYXRhIGRlcml2ZWQgZnJvbQovLy8gb3B0aW9ucyBpcyBub3QgdW5uZWNlc3NhcmlseSByZWNvbXB1dGVkLgpjbGFzcyBQcm9jZXNzZWRPcHRpb25zIHsKICAvLy8gVGhlIHJhdyBbQ29tcGlsZXJPcHRpb25zXSB3aGljaCB0aGlzIGNsYXNzIHdyYXBzLgogIGZpbmFsIENvbXBpbGVyT3B0aW9ucyBfcmF3OwoKICAvLy8gVGhlIHBhY2thZ2UgbWFwIGRlcml2ZWQgZnJvbSB0aGUgb3B0aW9ucywgb3IgYG51bGxgIGlmIHRoZSBwYWNrYWdlIG1hcCBoYXMKICAvLy8gbm90IGJlZW4gY29tcHV0ZWQgeWV0LgogIFBhY2thZ2VzIF9wYWNrYWdlczsKCiAgLy8vIFRoZSB1cmkgZm9yIC5wYWNrYWdlcyBkZXJpdmVkIGZyb20gdGhlIG9wdGlvbnMsIG9yIGBudWxsYCBpZiB0aGUgcGFja2FnZQogIC8vLyBtYXAgaGFzIG5vdCBiZWVuIGNvbXB1dGVkIHlldCBvciB0aGVyZSBpcyBubyAucGFja2FnZXMgaW4gZWZmZWN0LgogIFVyaSBfcGFja2FnZXNVcmk7CiAgVXJpIGdldCBwYWNrYWdlc1VyaSA9PiBfcGFja2FnZXNVcmk7CgogIC8vLyBUaGUgb2JqZWN0IHRoYXQga25vd3MgaG93IHRvIHJlc29sdmUgInBhY2thZ2U6IiBhbmQgImRhcnQ6IiBVUklzLAogIC8vLyBvciBgbnVsbGAgaWYgaXQgaGFzIG5vdCBiZWVuIGNvbXB1dGVkIHlldC4KICBVcmlUcmFuc2xhdG9yIF91cmlUcmFuc2xhdG9yOwoKICAvLy8gVGhlIFNESyBzdW1tYXJ5LCBvciBgbnVsbGAgaWYgaXQgaGFzIG5vdCBiZWVuIHJlYWQgeWV0LgogIC8vLwogIC8vLyBBIHN1bW1hcnksIGFsc28gcmVmZXJyZWQgdG8gYXMgIm91dGxpbmUiIGludGVybmFsbHksIGlzIGEgW0NvbXBvbmVudF0KICAvLy8gd2hlcmUgYWxsIG1ldGhvZCBib2RpZXMgYXJlIGxlZnQgb3V0LiBJbiBlc3NlbmNlLCBpdCBjb250YWlucyBqdXN0IEFQSQogIC8vLyBzaWduYXR1cmVzIGFuZCBjb25zdGFudHMuIFRoZSBzdW1tYXJ5IHNob3VsZCBpbmNsdWRlIGluZmVycmVkIHRvcC1sZXZlbAogIC8vLyB0eXBlcyB1bmxlc3MgbGVnYWN5IG1vZGUgaXMgZW5hYmxlZC4KICBDb21wb25lbnQgX3Nka1N1bW1hcnlDb21wb25lbnQ7CgogIC8vLyBUaGUgc3VtbWFyeSBmb3IgZWFjaCB1cmkgaW4gYG9wdGlvbnMuaW5wdXRTdW1tYXJpZXNgLgogIC8vLwogIC8vLyBBIHN1bW1hcnksIGFsc28gcmVmZXJyZWQgdG8gYXMgIm91dGxpbmUiIGludGVybmFsbHksIGlzIGEgW0NvbXBvbmVudF0KICAvLy8gd2hlcmUgYWxsIG1ldGhvZCBib2RpZXMgYXJlIGxlZnQgb3V0LiBJbiBlc3NlbmNlLCBpdCBjb250YWlucyBqdXN0IEFQSQogIC8vLyBzaWduYXR1cmVzIGFuZCBjb25zdGFudHMuIFRoZSBzdW1tYXJpZXMgc2hvdWxkIGluY2x1ZGUgaW5mZXJyZWQgdG9wLWxldmVsCiAgLy8vIHR5cGVzIHVubGVzcyBsZWdhY3kgbW9kZSBpcyBlbmFibGVkLgogIExpc3Q8Q29tcG9uZW50PiBfaW5wdXRTdW1tYXJpZXNDb21wb25lbnRzOwoKICAvLy8gT3RoZXIgY29tcG9uZW50cyB0aGF0IGFyZSBtZWFudCB0byBiZSBsaW5rZWQgYW5kIGNvbXBpbGVkIHdpdGggdGhlIGlucHV0CiAgLy8vIHNvdXJjZXMuCiAgTGlzdDxDb21wb25lbnQ+IF9saW5rZWREZXBlbmRlbmNpZXM7CgogIC8vLyBUaGUgbG9jYXRpb24gb2YgdGhlIFNESywgb3IgYG51bGxgIGlmIHRoZSBsb2NhdGlvbiBoYXNuJ3QgYmVlbiBkZXRlcm1pbmVkCiAgLy8vIHlldC4KICBVcmkgX3Nka1Jvb3Q7CiAgVXJpIGdldCBzZGtSb290IHsKICAgIF9lbnN1cmVTZGtEZWZhdWx0cygpOwogICAgcmV0dXJuIF9zZGtSb290OwogIH0KCiAgVXJpIF9zZGtTdW1tYXJ5OwogIFVyaSBnZXQgc2RrU3VtbWFyeSB7CiAgICBfZW5zdXJlU2RrRGVmYXVsdHMoKTsKICAgIHJldHVybiBfc2RrU3VtbWFyeTsKICB9CgogIExpc3Q8aW50PiBfc2RrU3VtbWFyeUJ5dGVzOwoKICAvLy8gR2V0IHRoZSBieXRlcyBvZiB0aGUgU0RLIG91dGxpbmUsIGlmIGFueS4KICBGdXR1cmU8TGlzdDxpbnQ+PiBsb2FkU2RrU3VtbWFyeUJ5dGVzKCkgYXN5bmMgewogICAgaWYgKF9zZGtTdW1tYXJ5Qnl0ZXMgPT0gbnVsbCkgewogICAgICBpZiAoc2RrU3VtbWFyeSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgdmFyIGVudHJ5ID0gZmlsZVN5c3RlbS5lbnRpdHlGb3JVcmkoc2RrU3VtbWFyeSk7CiAgICAgIF9zZGtTdW1tYXJ5Qnl0ZXMgPSBhd2FpdCBfcmVhZEFzQnl0ZXMoZW50cnkpOwogICAgfQogICAgcmV0dXJuIF9zZGtTdW1tYXJ5Qnl0ZXM7CiAgfQoKICBVcmkgX2xpYnJhcmllc1NwZWNpZmljYXRpb25Vcmk7CiAgVXJpIGdldCBsaWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpIHsKICAgIF9lbnN1cmVTZGtEZWZhdWx0cygpOwogICAgcmV0dXJuIF9saWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpOwogIH0KCiAgVGlja2VyIHRpY2tlcjsKCiAgVXJpIGdldCBwYWNrYWdlc1VyaVJhdyA9PiBfcmF3LnBhY2thZ2VzRmlsZVVyaTsKCiAgYm9vbCBnZXQgZW5hYmxlQXNzZXJ0cyA9PiBfcmF3LmVuYWJsZUFzc2VydHM7CgogIGJvb2wgZ2V0IHZlcmJvc2UgPT4gX3Jhdy52ZXJib3NlOwoKICBib29sIGdldCB2ZXJpZnkgPT4gX3Jhdy52ZXJpZnk7CgogIGJvb2wgZ2V0IGRlYnVnRHVtcCA9PiBfcmF3LmRlYnVnRHVtcDsKCiAgYm9vbCBnZXQgb21pdFBsYXRmb3JtID0+IF9yYXcub21pdFBsYXRmb3JtOwoKICBib29sIGdldCBzZXRFeGl0Q29kZU9uUHJvYmxlbSA9PiBfcmF3LnNldEV4aXRDb2RlT25Qcm9ibGVtOwoKICBib29sIGdldCBlbWJlZFNvdXJjZVRleHQgPT4gX3Jhdy5lbWJlZFNvdXJjZVRleHQ7CgogIGJvb2wgZ2V0IHRocm93T25FcnJvcnNGb3JEZWJ1Z2dpbmcgPT4gX3Jhdy50aHJvd09uRXJyb3JzRm9yRGVidWdnaW5nOwoKICBib29sIGdldCB0aHJvd09uV2FybmluZ3NGb3JEZWJ1Z2dpbmcgPT4gX3Jhdy50aHJvd09uV2FybmluZ3NGb3JEZWJ1Z2dpbmc7CgogIC8vLyBUaGUgZW50cnktcG9pbnRzIHByb3ZpZGVkIHRvIHRoZSBjb21waWxlci4KICBmaW5hbCBMaXN0PFVyaT4gaW5wdXRzOwoKICAvLy8gVGhlIFVyaSB3aGVyZSBvdXRwdXQgaXMgZ2VuZXJhdGVkLCBtYXkgYmUgbnVsbC4KICBmaW5hbCBVcmkgb3V0cHV0OwoKICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50RGVmaW5lczsKCiAgLy8vIEluaXRpYWxpemVzIGEgW1Byb2Nlc3NlZE9wdGlvbnNdIG9iamVjdCB3cmFwcGluZyB0aGUgZ2l2ZW4gW3Jhd09wdGlvbnNdLgogIFByb2Nlc3NlZE9wdGlvbnMoe0NvbXBpbGVyT3B0aW9ucyBvcHRpb25zLCBMaXN0PFVyaT4gaW5wdXRzLCB0aGlzLm91dHB1dH0pCiAgICAgIDogdGhpcy5fcmF3ID0gb3B0aW9ucyA/PyBuZXcgQ29tcGlsZXJPcHRpb25zKCksCiAgICAgICAgdGhpcy5pbnB1dHMgPSBpbnB1dHMgPz8gPFVyaT5bXSwKICAgICAgICAvLyBUT0RPKGFza2VzYyk6IENvcHkgdGhlIG1hcCB3aGVuIGtlcm5lbF9zZXJ2aWNlIHN1cHBvcnRzIHRoYXQuCiAgICAgICAgdGhpcy5lbnZpcm9ubWVudERlZmluZXMgPSBvcHRpb25zPy5lbnZpcm9ubWVudERlZmluZXMsCiAgICAgICAgLy8gVE9ETyhzaWdtdW5kLCBhaGUpOiBjcmVhdGUgdGlja2VyIGV2ZW4gZWFybGllciBvciBwYXNzIGluIGEgc3RvcHdhdGNoCiAgICAgICAgLy8gY29sbGVjdGluZyB0aW1lIHNpbmNlIHRoZSBzdGFydCBvZiB0aGUgVk0uCiAgICAgICAgdGhpcy50aWNrZXIgPSBuZXcgVGlja2VyKGlzVmVyYm9zZTogb3B0aW9ucz8udmVyYm9zZSA/PyBmYWxzZSk7CgogIEZvcm1hdHRlZE1lc3NhZ2UgZm9ybWF0KAogICAgICBMb2NhdGVkTWVzc2FnZSBtZXNzYWdlLCBTZXZlcml0eSBzZXZlcml0eSwgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dCkgewogICAgaW50IG9mZnNldCA9IG1lc3NhZ2UuY2hhck9mZnNldDsKICAgIFVyaSB1cmkgPSBtZXNzYWdlLnVyaTsKICAgIExvY2F0aW9uIGxvY2F0aW9uID0gb2Zmc2V0ID09IC0xID8gbnVsbCA6IGdldExvY2F0aW9uKHVyaSwgb2Zmc2V0KTsKICAgIFN0cmluZyBmb3JtYXR0ZWQgPQogICAgICAgIGNvbW1hbmRfbGluZV9yZXBvcnRpbmcuZm9ybWF0KG1lc3NhZ2UsIHNldmVyaXR5LCBsb2NhdGlvbjogbG9jYXRpb24pOwogICAgTGlzdDxGb3JtYXR0ZWRNZXNzYWdlPiBmb3JtYXR0ZWRDb250ZXh0OwogICAgaWYgKGNvbnRleHQgIT0gbnVsbCAmJiBjb250ZXh0LmlzTm90RW1wdHkpIHsKICAgICAgZm9ybWF0dGVkQ29udGV4dCA9IG5ldyBMaXN0PEZvcm1hdHRlZE1lc3NhZ2U+KGNvbnRleHQubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgZm9ybWF0dGVkQ29udGV4dFtpXSA9IGZvcm1hdChjb250ZXh0W2ldLCBTZXZlcml0eS5jb250ZXh0LCBudWxsKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG1lc3NhZ2Uud2l0aEZvcm1hdHRpbmcoZm9ybWF0dGVkLCBsb2NhdGlvbj8ubGluZSA/PyAtMSwKICAgICAgICBsb2NhdGlvbj8uY29sdW1uID8/IC0xLCBzZXZlcml0eSwgZm9ybWF0dGVkQ29udGV4dCk7CiAgfQoKICB2b2lkIHJlcG9ydChMb2NhdGVkTWVzc2FnZSBtZXNzYWdlLCBTZXZlcml0eSBzZXZlcml0eSwKICAgICAge0xpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHR9KSB7CiAgICBpZiAoY29tbWFuZF9saW5lX3JlcG9ydGluZy5pc0hpZGRlbihzZXZlcml0eSkpIHJldHVybjsKICAgIGlmIChjb21tYW5kX2xpbmVfcmVwb3J0aW5nLmlzQ29tcGlsZVRpbWVFcnJvcihzZXZlcml0eSkpIHsKICAgICAgQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQubG9nRXJyb3IobWVzc2FnZSwgc2V2ZXJpdHkpOwogICAgfQogICAgaWYgKENvbXBpbGVyQ29udGV4dC5jdXJyZW50Lm9wdGlvbnMuc2V0RXhpdENvZGVPblByb2JsZW0pIHsKICAgICAgZXhpdENvZGUgPSAxOwogICAgfQogICAgcmVwb3J0RGlhZ25vc3RpY01lc3NhZ2UoZm9ybWF0KG1lc3NhZ2UsIHNldmVyaXR5LCBjb250ZXh0KSk7CiAgICBpZiAoY29tbWFuZF9saW5lX3JlcG9ydGluZy5zaG91bGRUaHJvd09uKHNldmVyaXR5KSkgewogICAgICB0aHJvdyBuZXcgRGVidWdBYm9ydCgKICAgICAgICAgIG1lc3NhZ2UudXJpLCBtZXNzYWdlLmNoYXJPZmZzZXQsIHNldmVyaXR5LCBTdGFja1RyYWNlLmN1cnJlbnQpOwogICAgfQogIH0KCiAgdm9pZCByZXBvcnREaWFnbm9zdGljTWVzc2FnZShEaWFnbm9zdGljTWVzc2FnZSBtZXNzYWdlKSB7CiAgICAoX3Jhdy5vbkRpYWdub3N0aWMgPz8gX2RlZmF1bHREaWFnbm9zdGljTWVzc2FnZUhhbmRsZXIpKG1lc3NhZ2UpOwogIH0KCiAgdm9pZCBfZGVmYXVsdERpYWdub3N0aWNNZXNzYWdlSGFuZGxlcihEaWFnbm9zdGljTWVzc2FnZSBtZXNzYWdlKSB7CiAgICBwcmludERpYWdub3N0aWNNZXNzYWdlKG1lc3NhZ2UsIHByaW50KTsKICB9CgogIC8vIFRPRE8oYXNrZXNjKTogUmVtb3ZlIHRoaXMgYW5kIGRpcmVjdCBjYWxsZXJzIGRpcmVjdGx5IHRvIHJlcG9ydC4KICB2b2lkIHJlcG9ydFdpdGhvdXRMb2NhdGlvbihNZXNzYWdlIG1lc3NhZ2UsIFNldmVyaXR5IHNldmVyaXR5KSB7CiAgICByZXBvcnQobWVzc2FnZS53aXRob3V0TG9jYXRpb24oKSwgc2V2ZXJpdHkpOwogIH0KCiAgLy8vIFJ1bnMgdmFyaW91cyB2YWxpZGF0aW9ucyBjaGVja3Mgb24gdGhlIGlucHV0IG9wdGlvbnMuIEZvciBpbnN0YW5jZSwKICAvLy8gaWYgYW4gb3B0aW9uIGlzIGEgcGF0aCB0byBhIGZpbGUsIGl0IGNoZWNrcyB0aGF0IHRoZSBmaWxlIGV4aXN0cy4KICBGdXR1cmU8Ym9vbD4gdmFsaWRhdGVPcHRpb25zKHtib29sIGVycm9yT25NaXNzaW5nSW5wdXQ6IHRydWV9KSBhc3luYyB7CiAgICBpZiAodmVyYm9zZSkgcHJpbnQoZGVidWdTdHJpbmcoKSk7CgogICAgaWYgKGVycm9yT25NaXNzaW5nSW5wdXQgJiYgaW5wdXRzLmlzRW1wdHkpIHsKICAgICAgcmVwb3J0V2l0aG91dExvY2F0aW9uKG1lc3NhZ2VNaXNzaW5nSW5wdXQsIFNldmVyaXR5LmVycm9yKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGlmIChfcmF3LnNka1Jvb3QgIT0gbnVsbCAmJgogICAgICAgICFhd2FpdCBmaWxlU3lzdGVtLmVudGl0eUZvclVyaShzZGtSb290KS5leGlzdHMoKSkgewogICAgICByZXBvcnRXaXRob3V0TG9jYXRpb24oCiAgICAgICAgICB0ZW1wbGF0ZVNka1Jvb3ROb3RGb3VuZC53aXRoQXJndW1lbnRzKHNka1Jvb3QpLCBTZXZlcml0eS5lcnJvcik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICB2YXIgc3VtbWFyeSA9IHNka1N1bW1hcnk7CiAgICBpZiAoc3VtbWFyeSAhPSBudWxsICYmICFhd2FpdCBmaWxlU3lzdGVtLmVudGl0eUZvclVyaShzdW1tYXJ5KS5leGlzdHMoKSkgewogICAgICByZXBvcnRXaXRob3V0TG9jYXRpb24oCiAgICAgICAgICB0ZW1wbGF0ZVNka1N1bW1hcnlOb3RGb3VuZC53aXRoQXJndW1lbnRzKHN1bW1hcnkpLCBTZXZlcml0eS5lcnJvcik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBpZiAoY29tcGlsZVNkayAmJiBzdW1tYXJ5ICE9IG51bGwpIHsKICAgICAgcmVwb3J0V2l0aG91dExvY2F0aW9uKAogICAgICAgICAgbWVzc2FnZUludGVybmFsUHJvYmxlbVByb3ZpZGVkQm90aENvbXBpbGVTZGtBbmRTZGtTdW1tYXJ5LAogICAgICAgICAgU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGZvciAoVXJpIHNvdXJjZSBpbiBfcmF3LmxpbmtlZERlcGVuZGVuY2llcykgewogICAgICAvLyBUT0RPKGFoZSk6IFJlbW92ZSB0aGlzIGNoZWNrLCB0aGUgY29tcGlsZXIgaXRzZWxmIHNob3VsZCBoYW5kbGUgYW5kCiAgICAgIC8vIHJlY292ZXIgZnJvbSB0aGlzLgogICAgICBpZiAoIWF3YWl0IGZpbGVTeXN0ZW0uZW50aXR5Rm9yVXJpKHNvdXJjZSkuZXhpc3RzKCkpIHsKICAgICAgICByZXBvcnRXaXRob3V0TG9jYXRpb24oCiAgICAgICAgICAgIHRlbXBsYXRlSW5wdXRGaWxlTm90Rm91bmQud2l0aEFyZ3VtZW50cyhzb3VyY2UpLCBTZXZlcml0eS5lcnJvcik7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0byBnZW5lcmF0ZSBjb2RlIGZvciB0aGUgU0RLIHdoZW4gY29tcGlsaW5nIGEKICAvLy8gd2hvbGUtcHJvZ3JhbS4KICBib29sIGdldCBjb21waWxlU2RrID0+IF9yYXcuY29tcGlsZVNkazsKCiAgRmlsZVN5c3RlbSBfZmlsZVN5c3RlbTsKCiAgLy8vIEdldCB0aGUgW0ZpbGVTeXN0ZW1dIHdoaWNoIHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBmcm9udCBlbmQgdG8gYWNjZXNzCiAgLy8vIGZpbGVzLgogIEZpbGVTeXN0ZW0gZ2V0IGZpbGVTeXN0ZW0gPT4gX2ZpbGVTeXN0ZW0gPz89IF9jcmVhdGVGaWxlU3lzdGVtKCk7CgogIC8vLyBDbGVhciB0aGUgZmlsZSBzeXN0ZW0gc28gYW55IENvbXBpbGVyT3B0aW9ucyBmaWxlU3lzdGVtIGNoYW5nZSB3aWxsIGhhdmUKICAvLy8gZWZmZWN0LgogIHZvaWQgY2xlYXJGaWxlU3lzdGVtQ2FjaGUoKSA9PiBfZmlsZVN5c3RlbSA9IG51bGw7CgogIGJvb2wgZ2V0IGxlZ2FjeU1vZGUgPT4gX3Jhdy5sZWdhY3lNb2RlOwoKICAvLy8gV2hldGhlciB0byBnZW5lcmF0ZSBieXRlY29kZS4KICBib29sIGdldCBieXRlY29kZSA9PiBfcmF3LmJ5dGVjb2RlOwoKICAvLy8gV2hldGhlciB0byB3cml0ZSBhIGZpbGUgKGUuZy4gYSBkaWxsIGZpbGUpIHdoZW4gcmVwb3J0aW5nIGEgY3Jhc2guCiAgYm9vbCBnZXQgd3JpdGVGaWxlT25DcmFzaFJlcG9ydCA9PiBfcmF3LndyaXRlRmlsZU9uQ3Jhc2hSZXBvcnQ7CgogIFRhcmdldCBfdGFyZ2V0OwogIFRhcmdldCBnZXQgdGFyZ2V0ID0+IF90YXJnZXQgPz89CiAgICAgIF9yYXcudGFyZ2V0ID8/IG5ldyBOb25lVGFyZ2V0KG5ldyBUYXJnZXRGbGFncyhsZWdhY3lNb2RlOiBsZWdhY3lNb2RlKSk7CgogIGJvb2wgaXNFeHBlcmltZW50RW5hYmxlZChFeHBlcmltZW50YWxGbGFnIGZsYWcpIHsKICAgIGFzc2VydChkZWZhdWx0RXhwZXJpbWVudGFsRmxhZ3MuY29udGFpbnNLZXkoZmxhZyksCiAgICAgICAgIk5vIGRlZmF1bHQgdmFsdWUgZm9yICRmbGFnLiIpOwogICAgLy8gVE9ETyhhc2tlc2MpOiBEZXRlcm1pbmUgZGVmYXVsdCBmbGFnIHZhbHVlIGZyb20gc3BlY2lmaWNhdGlvbiBmaWxlLgogICAgaWYgKGZsYWcgPT0gRXhwZXJpbWVudGFsRmxhZy5zZXRMaXRlcmFscykgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gX3Jhdy5leHBlcmltZW50YWxGbGFnc1tmbGFnXSA/PyBkZWZhdWx0RXhwZXJpbWVudGFsRmxhZ3NbZmxhZ107CiAgfQoKICAvLy8gR2V0IGFuIG91dGxpbmUgY29tcG9uZW50IHRoYXQgc3VtbWFyaXplcyB0aGUgU0RLLCBpZiBhbnkuCiAgLy8gVE9ETyhzaWdtdW5kKTogbW92ZSwgdGhpcyBkb2Vzbid0IGZlZWwgbGlrZSBhbiAib3B0aW9uIi4KICBGdXR1cmU8Q29tcG9uZW50PiBsb2FkU2RrU3VtbWFyeShDYW5vbmljYWxOYW1lIG5hbWVSb290KSBhc3luYyB7CiAgICBpZiAoX3Nka1N1bW1hcnlDb21wb25lbnQgPT0gbnVsbCkgewogICAgICBpZiAoc2RrU3VtbWFyeSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgdmFyIGJ5dGVzID0gYXdhaXQgbG9hZFNka1N1bW1hcnlCeXRlcygpOwogICAgICBpZiAoYnl0ZXMgIT0gbnVsbCAmJiBieXRlcy5pc05vdEVtcHR5KSB7CiAgICAgICAgX3Nka1N1bW1hcnlDb21wb25lbnQgPSBsb2FkQ29tcG9uZW50KGJ5dGVzLCBuYW1lUm9vdCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfc2RrU3VtbWFyeUNvbXBvbmVudDsKICB9CgogIHZvaWQgc2V0IHNka1N1bW1hcnlDb21wb25lbnQoQ29tcG9uZW50IHBsYXRmb3JtKSB7CiAgICBpZiAoX3Nka1N1bW1hcnlDb21wb25lbnQgIT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigic2RrU3VtbWFyeSBhbHJlYWR5IGxvYWRlZC4iKTsKICAgIH0KICAgIF9zZGtTdW1tYXJ5Q29tcG9uZW50ID0gcGxhdGZvcm07CiAgfQoKICAvLy8gR2V0IHRoZSBzdW1tYXJ5IHByb2dyYW1zIGZvciBlYWNoIG9mIHRoZSB1bmRlcmx5aW5nIGBpbnB1dFN1bW1hcmllc2AKICAvLy8gcHJvdmlkZWQgdmlhIFtDb21waWxlck9wdGlvbnNdLgogIC8vIFRPRE8oc2lnbXVuZCk6IG1vdmUsIHRoaXMgZG9lc24ndCBmZWVsIGxpa2UgYW4gIm9wdGlvbiIuCiAgRnV0dXJlPExpc3Q8Q29tcG9uZW50Pj4gbG9hZElucHV0U3VtbWFyaWVzKENhbm9uaWNhbE5hbWUgbmFtZVJvb3QpIGFzeW5jIHsKICAgIGlmIChfaW5wdXRTdW1tYXJpZXNDb21wb25lbnRzID09IG51bGwpIHsKICAgICAgdmFyIHVyaXMgPSBfcmF3LmlucHV0U3VtbWFyaWVzOwogICAgICBpZiAodXJpcyA9PSBudWxsIHx8IHVyaXMuaXNFbXB0eSkgcmV0dXJuIGNvbnN0IDxDb21wb25lbnQ+W107CiAgICAgIC8vIFRPRE8oc2lnbXVuZCk6IHRocm90dGxlICMgb2YgY29uY3VycmVudCBvcHJlYXRpb25zLgogICAgICB2YXIgYWxsQnl0ZXMgPSBhd2FpdCBGdXR1cmUud2FpdCgKICAgICAgICAgIHVyaXMubWFwKCh1cmkpID0+IF9yZWFkQXNCeXRlcyhmaWxlU3lzdGVtLmVudGl0eUZvclVyaSh1cmkpKSkpOwogICAgICBfaW5wdXRTdW1tYXJpZXNDb21wb25lbnRzID0KICAgICAgICAgIGFsbEJ5dGVzLm1hcCgoYnl0ZXMpID0+IGxvYWRDb21wb25lbnQoYnl0ZXMsIG5hbWVSb290KSkudG9MaXN0KCk7CiAgICB9CiAgICByZXR1cm4gX2lucHV0U3VtbWFyaWVzQ29tcG9uZW50czsKICB9CgogIHZvaWQgc2V0IGlucHV0U3VtbWFyaWVzQ29tcG9uZW50cyhMaXN0PENvbXBvbmVudD4gY29tcG9uZW50cykgewogICAgaWYgKF9pbnB1dFN1bW1hcmllc0NvbXBvbmVudHMgIT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiaW5wdXRTdW1tYXJpZXNDb21wb25lbnRzIGFscmVhZHkgbG9hZGVkLiIpOwogICAgfQogICAgX2lucHV0U3VtbWFyaWVzQ29tcG9uZW50cyA9IGNvbXBvbmVudHM7CiAgfQoKICAvLy8gTG9hZCBlYWNoIG9mIHRoZSBbQ29tcGlsZXJPcHRpb25zLmxpbmtlZERlcGVuZGVuY2llc10gY29tcG9uZW50cy4KICAvLyBUT0RPKHNpZ211bmQpOiBtb3ZlLCB0aGlzIGRvZXNuJ3QgZmVlbCBsaWtlIGFuICJvcHRpb24iLgogIEZ1dHVyZTxMaXN0PENvbXBvbmVudD4+IGxvYWRMaW5rRGVwZW5kZW5jaWVzKENhbm9uaWNhbE5hbWUgbmFtZVJvb3QpIGFzeW5jIHsKICAgIGlmIChfbGlua2VkRGVwZW5kZW5jaWVzID09IG51bGwpIHsKICAgICAgdmFyIHVyaXMgPSBfcmF3LmxpbmtlZERlcGVuZGVuY2llczsKICAgICAgaWYgKHVyaXMgPT0gbnVsbCB8fCB1cmlzLmlzRW1wdHkpIHJldHVybiBjb25zdCA8Q29tcG9uZW50PltdOwogICAgICAvLyBUT0RPKHNpZ211bmQpOiB0aHJvdHRsZSAjIG9mIGNvbmN1cnJlbnQgb3ByZWF0aW9ucy4KICAgICAgdmFyIGFsbEJ5dGVzID0gYXdhaXQgRnV0dXJlLndhaXQoCiAgICAgICAgICB1cmlzLm1hcCgodXJpKSA9PiBfcmVhZEFzQnl0ZXMoZmlsZVN5c3RlbS5lbnRpdHlGb3JVcmkodXJpKSkpKTsKICAgICAgX2xpbmtlZERlcGVuZGVuY2llcyA9CiAgICAgICAgICBhbGxCeXRlcy5tYXAoKGJ5dGVzKSA9PiBsb2FkQ29tcG9uZW50KGJ5dGVzLCBuYW1lUm9vdCkpLnRvTGlzdCgpOwogICAgfQogICAgcmV0dXJuIF9saW5rZWREZXBlbmRlbmNpZXM7CiAgfQoKICAvLy8gSGVscGVyIHRvIGxvYWQgYSAuZGlsbCBmaWxlIGZyb20gW3VyaV0gdXNpbmcgdGhlIGV4aXN0aW5nIFtuYW1lUm9vdF0uCiAgQ29tcG9uZW50IGxvYWRDb21wb25lbnQoTGlzdDxpbnQ+IGJ5dGVzLCBDYW5vbmljYWxOYW1lIG5hbWVSb290KSB7CiAgICBDb21wb25lbnQgY29tcG9uZW50ID0KICAgICAgICB0YXJnZXQuY29uZmlndXJlQ29tcG9uZW50KG5ldyBDb21wb25lbnQobmFtZVJvb3Q6IG5hbWVSb290KSk7CiAgICAvLyBUT0RPKGFoZSk6IFBhc3MgZmlsZSBuYW1lIHRvIEJpbmFyeUJ1aWxkZXIuCiAgICAvLyBUT0RPKGFoZSk6IENvbnRyb2wgbGF6eSBsb2FkaW5nIHZpYSBhbiBvcHRpb24uCiAgICBuZXcgQmluYXJ5QnVpbGRlcihieXRlcywgZmlsZW5hbWU6IG51bGwsIGRpc2FibGVMYXp5UmVhZGluZzogZmFsc2UpCiAgICAgICAgLnJlYWRDb21wb25lbnQoY29tcG9uZW50KTsKICAgIHJldHVybiBjb21wb25lbnQ7CiAgfQoKICAvLy8gR2V0IHRoZSBbVXJpVHJhbnNsYXRvcl0gd2hpY2ggcmVzb2x2ZXMgInBhY2thZ2U6IiBhbmQgImRhcnQ6IiBVUklzLgogIC8vLwogIC8vLyBUaGlzIGlzIGFuIGFzeW5jaHJvbm91cyBtZXRob2Qgc2luY2UgZmlsZSBzeXN0ZW0gb3BlcmF0aW9ucyBtYXkgYmUKICAvLy8gcmVxdWlyZWQgdG8gbG9jYXRlL3JlYWQgdGhlIHBhY2thZ2VzIGZpbGUgYXMgd2VsbCBhcyBTREsgbWV0YWRhdGEuCiAgRnV0dXJlPFVyaVRyYW5zbGF0b3I+IGdldFVyaVRyYW5zbGF0b3Ioe2Jvb2wgYnlwYXNzQ2FjaGU6IGZhbHNlfSkgYXN5bmMgewogICAgaWYgKGJ5cGFzc0NhY2hlKSB7CiAgICAgIF91cmlUcmFuc2xhdG9yID0gbnVsbDsKICAgICAgX3BhY2thZ2VzID0gbnVsbDsKICAgIH0KICAgIGlmIChfdXJpVHJhbnNsYXRvciA9PSBudWxsKSB7CiAgICAgIHRpY2tlci5sb2dNcygiU3RhcnRlZCBidWlsZGluZyBVcmlUcmFuc2xhdG9yIik7CiAgICAgIHZhciBsaWJyYXJpZXMgPSBhd2FpdCBfY29tcHV0ZUxpYnJhcnlTcGVjaWZpY2F0aW9uKCk7CiAgICAgIHRpY2tlci5sb2dNcygiUmVhZCBsaWJyYXJpZXMgZmlsZSIpOwogICAgICB2YXIgcGFja2FnZXMgPSBhd2FpdCBfZ2V0UGFja2FnZXMoKTsKICAgICAgdGlja2VyLmxvZ01zKCJSZWFkIHBhY2thZ2VzIGZpbGUiKTsKICAgICAgX3VyaVRyYW5zbGF0b3IgPSBuZXcgVXJpVHJhbnNsYXRvcihsaWJyYXJpZXMsIHBhY2thZ2VzKTsKICAgIH0KICAgIHJldHVybiBfdXJpVHJhbnNsYXRvcjsKICB9CgogIEZ1dHVyZTxUYXJnZXRMaWJyYXJpZXNTcGVjaWZpY2F0aW9uPiBfY29tcHV0ZUxpYnJhcnlTcGVjaWZpY2F0aW9uKCkgYXN5bmMgewogICAgdmFyIG5hbWUgPSB0YXJnZXQubmFtZTsKICAgIC8vIFRPRE8oc2lnbXVuZCk6IEVlayEgV2Ugc2hvdWxkIGdldCB0byB0aGUgcG9pbnQgd2hlcmUgdGhlcmUgaXMgbm8KICAgIC8vIGZhc3RhLXNwZWNpZmljIHRhcmdldHMgYW5kIHRoZSB0YXJnZXQgbmFtZXMgYXJlIG1lYW5pbmdmdWwuCiAgICBpZiAobmFtZS5lbmRzV2l0aCgnX2Zhc3RhJykpIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCAtIDYpOwoKICAgIGlmIChsaWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpID09IG51bGwgfHwKICAgICAgICAhYXdhaXQgZmlsZVN5c3RlbS5lbnRpdHlGb3JVcmkobGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaSkuZXhpc3RzKCkpIHsKICAgICAgaWYgKGNvbXBpbGVTZGspIHsKICAgICAgICByZXBvcnRXaXRob3V0TG9jYXRpb24oCiAgICAgICAgICAgIHRlbXBsYXRlU2RrU3BlY2lmaWNhdGlvbk5vdEZvdW5kCiAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhsaWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpKSwKICAgICAgICAgICAgU2V2ZXJpdHkuZXJyb3IpOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgVGFyZ2V0TGlicmFyaWVzU3BlY2lmaWNhdGlvbihuYW1lKTsKICAgIH0KCiAgICB2YXIganNvbiA9CiAgICAgICAgYXdhaXQgZmlsZVN5c3RlbS5lbnRpdHlGb3JVcmkobGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaSkucmVhZEFzU3RyaW5nKCk7CiAgICB0cnkgewogICAgICB2YXIgc3BlYyA9CiAgICAgICAgICBhd2FpdCBMaWJyYXJpZXNTcGVjaWZpY2F0aW9uLnBhcnNlKGxpYnJhcmllc1NwZWNpZmljYXRpb25VcmksIGpzb24pOwogICAgICByZXR1cm4gc3BlYy5zcGVjaWZpY2F0aW9uRm9yKG5hbWUpOwogICAgfSBvbiBMaWJyYXJpZXNTcGVjaWZpY2F0aW9uRXhjZXB0aW9uIGNhdGNoIChlKSB7CiAgICAgIHJlcG9ydFdpdGhvdXRMb2NhdGlvbigKICAgICAgICAgIHRlbXBsYXRlQ2Fubm90UmVhZFNka1NwZWNpZmljYXRpb24ud2l0aEFyZ3VtZW50cygnJHtlLmVycm9yfScpLAogICAgICAgICAgU2V2ZXJpdHkuZXJyb3IpOwogICAgICByZXR1cm4gbmV3IFRhcmdldExpYnJhcmllc1NwZWNpZmljYXRpb24obmFtZSk7CiAgICB9CiAgfQoKICAvLy8gR2V0IHRoZSBwYWNrYWdlIG1hcCB3aGljaCBtYXBzIHBhY2thZ2UgbmFtZXMgdG8gVVJJcy4KICAvLy8KICAvLy8gVGhpcyBpcyBhbiBhc3luY2hyb25vdXMgZ2V0dGVyIHNpbmNlIGZpbGUgc3lzdGVtIG9wZXJhdGlvbnMgbWF5IGJlCiAgLy8vIHJlcXVpcmVkIHRvIGxvY2F0ZS9yZWFkIHRoZSBwYWNrYWdlcyBmaWxlLgogIEZ1dHVyZTxQYWNrYWdlcz4gX2dldFBhY2thZ2VzKCkgYXN5bmMgewogICAgaWYgKF9wYWNrYWdlcyAhPSBudWxsKSByZXR1cm4gX3BhY2thZ2VzOwogICAgX3BhY2thZ2VzVXJpID0gbnVsbDsKICAgIGlmIChfcmF3LnBhY2thZ2VzRmlsZVVyaSAhPSBudWxsKSB7CiAgICAgIHJldHVybiBfcGFja2FnZXMgPSBhd2FpdCBjcmVhdGVQYWNrYWdlc0Zyb21GaWxlKF9yYXcucGFja2FnZXNGaWxlVXJpKTsKICAgIH0KCiAgICBpZiAoaW5wdXRzLmxlbmd0aCA+IDEpIHsKICAgICAgLy8gVE9ETyhzaWdtdW5kKTogY29uc2lkZXIgbm90IHJlcG9ydGluZyBhbiBlcnJvciBpZiB3ZSB3b3VsZCBpbmZlcgogICAgICAvLyB0aGUgc2FtZSAucGFja2FnZXMgZmlsZSBmcm9tIGFsbCBvZiB0aGUgaW5wdXRzLgogICAgICByZXBvcnRXaXRob3V0TG9jYXRpb24oCiAgICAgICAgICBtZXNzYWdlQ2FudEluZmVyUGFja2FnZXNGcm9tTWFueUlucHV0cywgU2V2ZXJpdHkuZXJyb3IpOwogICAgICByZXR1cm4gX3BhY2thZ2VzID0gUGFja2FnZXMubm9QYWNrYWdlczsKICAgIH0KCiAgICB2YXIgaW5wdXQgPSBpbnB1dHMuZmlyc3Q7CgogICAgLy8gV2hlbiBjb21waWxpbmcgdGhlIFNESyB0aGUgaW5wdXQgZmlsZXMgYXJlIG5vcm1hbHkgYGRhcnQ6YCBVUklzLgogICAgaWYgKGlucHV0LnNjaGVtZSA9PSAnZGFydCcpIHJldHVybiBfcGFja2FnZXMgPSBQYWNrYWdlcy5ub1BhY2thZ2VzOwoKICAgIGlmIChpbnB1dC5zY2hlbWUgPT0gJ3BhY2thZ2VzJykgewogICAgICByZXBvcnQoCiAgICAgICAgICBtZXNzYWdlQ2FudEluZmVyUGFja2FnZXNGcm9tUGFja2FnZVVyaS53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgaW5wdXQsIC0xLCBub0xlbmd0aCksCiAgICAgICAgICBTZXZlcml0eS5lcnJvcik7CiAgICAgIHJldHVybiBfcGFja2FnZXMgPSBQYWNrYWdlcy5ub1BhY2thZ2VzOwogICAgfQoKICAgIHJldHVybiBfcGFja2FnZXMgPSBhd2FpdCBfZmluZFBhY2thZ2VzKGlucHV0cy5maXJzdCk7CiAgfQoKICAvLy8gQ3JlYXRlIGEgW1BhY2thZ2VzXSBnaXZlbiB0aGUgVXJpIHRvIGEgYC5wYWNrYWdlc2AgZmlsZS4KICBGdXR1cmU8UGFja2FnZXM+IGNyZWF0ZVBhY2thZ2VzRnJvbUZpbGUoVXJpIGZpbGUpIGFzeW5jIHsKICAgIExpc3Q8aW50PiBjb250ZW50czsKICAgIHRyeSB7CiAgICAgIC8vIFRPRE8oYWhlKTogV2UgbmVlZCB0byBjb21wdXRlIGxpbmUgZW5kaW5ncyBmb3IgdGhpcyBmaWxlLgogICAgICBjb250ZW50cyA9IGF3YWl0IGZpbGVTeXN0ZW0uZW50aXR5Rm9yVXJpKGZpbGUpLnJlYWRBc0J5dGVzKCk7CiAgICB9IG9uIEZpbGVTeXN0ZW1FeGNlcHRpb24gY2F0Y2ggKGUpIHsKICAgICAgcmVwb3J0V2l0aG91dExvY2F0aW9uKAogICAgICAgICAgdGVtcGxhdGVDYW50UmVhZEZpbGUud2l0aEFyZ3VtZW50cyhmaWxlLCBlLm1lc3NhZ2UpLCBTZXZlcml0eS5lcnJvcik7CiAgICB9CiAgICBpZiAoY29udGVudHMgIT0gbnVsbCkgewogICAgICBfcGFja2FnZXNVcmkgPSBmaWxlOwogICAgICB0cnkgewogICAgICAgIE1hcDxTdHJpbmcsIFVyaT4gbWFwID0gcGFja2FnZV9jb25maWcucGFyc2UoY29udGVudHMsIGZpbGUpOwogICAgICAgIHJldHVybiBuZXcgTWFwUGFja2FnZXMobWFwKTsKICAgICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gY2F0Y2ggKGUpIHsKICAgICAgICByZXBvcnQoCiAgICAgICAgICAgIHRlbXBsYXRlUGFja2FnZXNGaWxlRm9ybWF0CiAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhlLm1lc3NhZ2UpCiAgICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKGZpbGUsIGUub2Zmc2V0LCBub0xlbmd0aCksCiAgICAgICAgICAgIFNldmVyaXR5LmVycm9yKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHJlcG9ydFdpdGhvdXRMb2NhdGlvbigKICAgICAgICAgICAgdGVtcGxhdGVDYW50UmVhZEZpbGUud2l0aEFyZ3VtZW50cyhmaWxlLCAiJGUiKSwgU2V2ZXJpdHkuZXJyb3IpOwogICAgICB9CiAgICB9CiAgICBfcGFja2FnZXNVcmkgPSBudWxsOwogICAgcmV0dXJuIFBhY2thZ2VzLm5vUGFja2FnZXM7CiAgfQoKICAvLy8gRmluZHMgYSBwYWNrYWdlIHJlc29sdXRpb24gc3RyYXRlZ3kgdXNpbmcgYSBbRmlsZVN5c3RlbV0uCiAgLy8vCiAgLy8vIFRoZSBbc2NyaXB0VXJpXSBwb2ludHMgdG8gYSBEYXJ0IHNjcmlwdCB3aXRoIGEgdmFsaWQgc2NoZW1lIGFjY2VwdGVkIGJ5CiAgLy8vIHRoZSBbRmlsZVN5c3RlbV0uCiAgLy8vCiAgLy8vIFRoaXMgZnVuY3Rpb24gZmlyc3QgdHJpZXMgdG8gbG9jYXRlIGEgYC5wYWNrYWdlc2AgZmlsZSBpbiB0aGUgYHNjcmlwdFVyaWAKICAvLy8gZGlyZWN0b3J5LiBJZiB0aGF0IGlzIG5vdCBmb3VuZCwgaXQgc3RhcnRzIGNoZWNraW5nIHBhcmVudCBkaXJlY3RvcmllcyBmb3IKICAvLy8gYSBgLnBhY2thZ2VzYCBmaWxlLCBhbmQgc3RvcHMgaWYgaXQgZmluZHMgaXQuIE90aGVyd2lzZSBpdCBnaXZlcyB1cCBhbmQKICAvLy8gcmV0dXJucyBbUGFja2FnZXMubm9QYWNrYWdlc10uCiAgLy8vCiAgLy8vIE5vdGU6IHRoaXMgaXMgYSBmb3JrIGZyb20gYHBhY2thZ2U6cGFja2FnZV9jb25maWcvZGlzY292ZXJ5LmRhcnRgIHRvIGFkYXB0CiAgLy8vIGl0IHRvIHVzZSBbRmlsZVN5c3RlbV0uIFRoZSBsb2dpYyBoZXJlIGlzIGEgbWl4IG9mIHRoZSBsb2dpYyBpbiB0aGUKICAvLy8gYGZpbmRQYWNrYWdlc0Zyb21GaWxlYCBhbmQgYGZpbmRQYWNrYWdlc0Zyb21Ob25GaWxlYDoKICAvLy8KICAvLy8gICAgKiBMaWtlIGBmaW5kUGFja2FnZXNGcm9tRmlsZWAgcmVzb2x1dGlvbiBzZWFyY2hlcyBmb3IgcGFyZW50CiAgLy8vICAgIGRpcmVjdG9yaWVzCiAgLy8vCiAgLy8vICAgICogVW5saWtlIHBhY2thZ2U6cGFja2FnZV9jb25maWcsIGl0IGRvZXMgbm90IGxvb2sgZm9yIGEgYHBhY2thZ2VzL2AKICAvLy8gICAgZGlyZWN0b3J5LCBhcyB0aGF0IHdvbid0IGJlIHN1cHBvcnRlZCBpbiBEYXJ0IDIuCiAgRnV0dXJlPFBhY2thZ2VzPiBfZmluZFBhY2thZ2VzKFVyaSBzY3JpcHRVcmkpIGFzeW5jIHsKICAgIHZhciBkaXIgPSBzY3JpcHRVcmkucmVzb2x2ZSgnLicpOwogICAgaWYgKCFkaXIuaXNBYnNvbHV0ZSkgewogICAgICByZXBvcnRXaXRob3V0TG9jYXRpb24oCiAgICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuc3VwcG9ydGVkCiAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoIkV4cGVjdGVkIGlucHV0IFVyaSB0byBiZSBhYnNvbHV0ZTogJHNjcmlwdFVyaS4iKSwKICAgICAgICAgIFNldmVyaXR5LmludGVybmFsUHJvYmxlbSk7CiAgICAgIHJldHVybiBQYWNrYWdlcy5ub1BhY2thZ2VzOwogICAgfQoKICAgIEZ1dHVyZTxVcmk+IGNoZWNrSW5EaXIoVXJpIGRpcikgYXN5bmMgewogICAgICBVcmkgY2FuZGlkYXRlID0gZGlyLnJlc29sdmUoJy5wYWNrYWdlcycpOwogICAgICBpZiAoYXdhaXQgZmlsZVN5c3RlbS5lbnRpdHlGb3JVcmkoY2FuZGlkYXRlKS5leGlzdHMoKSkgcmV0dXJuIGNhbmRpZGF0ZTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLy8gQ2hlY2sgZm9yICRjd2QvLnBhY2thZ2VzCiAgICB2YXIgY2FuZGlkYXRlID0gYXdhaXQgY2hlY2tJbkRpcihkaXIpOwogICAgaWYgKGNhbmRpZGF0ZSAhPSBudWxsKSByZXR1cm4gY3JlYXRlUGFja2FnZXNGcm9tRmlsZShjYW5kaWRhdGUpOwoKICAgIC8vIENoZWNrIGZvciBjd2QoLy4uKSsvLnBhY2thZ2VzCiAgICB2YXIgcGFyZW50RGlyID0gZGlyLnJlc29sdmUoJy4uJyk7CiAgICB3aGlsZSAocGFyZW50RGlyLnBhdGggIT0gZGlyLnBhdGgpIHsKICAgICAgY2FuZGlkYXRlID0gYXdhaXQgY2hlY2tJbkRpcihwYXJlbnREaXIpOwogICAgICBpZiAoY2FuZGlkYXRlICE9IG51bGwpIGJyZWFrOwogICAgICBkaXIgPSBwYXJlbnREaXI7CiAgICAgIHBhcmVudERpciA9IGRpci5yZXNvbHZlKCcuLicpOwogICAgfQoKICAgIGlmIChjYW5kaWRhdGUgIT0gbnVsbCkgcmV0dXJuIGNyZWF0ZVBhY2thZ2VzRnJvbUZpbGUoY2FuZGlkYXRlKTsKICAgIHJldHVybiBQYWNrYWdlcy5ub1BhY2thZ2VzOwogIH0KCiAgYm9vbCBfY29tcHV0ZWRTZGtEZWZhdWx0cyA9IGZhbHNlOwoKICAvLy8gRW5zdXJlIFtfc2RrUm9vdF0sIFtfc2RrU3VtbWFyeV0gYW5kIFtfbGlicmFyeVNwZWNVcmldIGFyZSBpbml0aWFsaXplZC4KICAvLy8KICAvLy8gSWYgdGhleSBhcmUgbm90IHNldCBleHBsaWNpdGx5LCB0aGV5IGFyZSBpbmZlcmVkIGJhc2VkIG9uIHRoZSBkZWZhdWx0CiAgLy8vIGJlaGF2aW9yIGRlc2NyaWJlZCBpbiBbQ29tcGlsZXJPcHRpb25zXS4KICB2b2lkIF9lbnN1cmVTZGtEZWZhdWx0cygpIHsKICAgIGlmIChfY29tcHV0ZWRTZGtEZWZhdWx0cykgcmV0dXJuOwogICAgX2NvbXB1dGVkU2RrRGVmYXVsdHMgPSB0cnVlOwogICAgdmFyIHJvb3QgPSBfcmF3LnNka1Jvb3Q7CiAgICBpZiAocm9vdCAhPSBudWxsKSB7CiAgICAgIC8vIE5vcm1hbGl6ZSB0byBhbHdheXMgZW5kIGluICcvJwogICAgICBpZiAoIXJvb3QucGF0aC5lbmRzV2l0aCgnLycpKSB7CiAgICAgICAgcm9vdCA9IHJvb3QucmVwbGFjZShwYXRoOiByb290LnBhdGggKyAnLycpOwogICAgICB9CiAgICAgIF9zZGtSb290ID0gcm9vdDsKICAgIH0gZWxzZSBpZiAoY29tcGlsZVNkaykgewogICAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IGltcGxlbWVudCB0aGUgYWxnb3JpdGhtIGZvciBmaW5kaW5nIHRoZSBTREsKICAgICAgLy8gYXV0b21hZ2ljYWxseS4KICAgICAgdW5pbXBsZW1lbnRlZCgnaW5mZXIgdGhlIGRlZmF1bHQgc2RrIGxvY2F0aW9uJywgLTEsIG51bGwpOwogICAgfQoKICAgIGlmIChfcmF3LnNka1N1bW1hcnkgIT0gbnVsbCkgewogICAgICBfc2RrU3VtbWFyeSA9IF9yYXcuc2RrU3VtbWFyeTsKICAgIH0gZWxzZSBpZiAoIWNvbXBpbGVTZGspIHsKICAgICAgLy8gSW5mZXIgYmFzZWQgb24gdGhlIHNka1Jvb3QsIGJ1dCBvbmx5IHdoZW4gYGNvbXBpbGVTZGtgIGlzIGZhbHNlLAogICAgICAvLyBvdGhlcndpc2UgdGhlIGRlZmF1bHQgaW50ZW50IHdhcyB0byBjb21waWxlIHRoZSBzZGsgZnJvbSBzb3VyY2VzIGFuZAogICAgICAvLyBub3QgdG8gbG9hZCBhbiBzZGsgc3VtbWFyeSBmaWxlLgogICAgICBfc2RrU3VtbWFyeSA9IHJvb3Q/LnJlc29sdmUoInZtX3BsYXRmb3JtX3N0cm9uZy5kaWxsIik7CiAgICB9CgogICAgaWYgKF9yYXcubGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaSAhPSBudWxsKSB7CiAgICAgIF9saWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpID0gX3Jhdy5saWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpOwogICAgfSBlbHNlIGlmIChjb21waWxlU2RrKSB7CiAgICAgIF9saWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpID0gc2RrUm9vdC5yZXNvbHZlKCdsaWIvbGlicmFyaWVzLmpzb24nKTsKICAgIH0KICB9CgogIC8vLyBDcmVhdGUgYSBbRmlsZVN5c3RlbV0gc3BlY2lmaWMgdG8gdGhlIGN1cnJlbnQgb3B0aW9ucy4KICBGaWxlU3lzdGVtIF9jcmVhdGVGaWxlU3lzdGVtKCkgewogICAgcmV0dXJuIF9yYXcuZmlsZVN5c3RlbTsKICB9CgogIFN0cmluZyBkZWJ1Z1N0cmluZygpIHsKICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHdyaXRlTGlzdChTdHJpbmcgbmFtZSwgTGlzdCBlbGVtZW50cykgewogICAgICBpZiAoZWxlbWVudHMuaXNFbXB0eSkgewogICAgICAgIHNiLndyaXRlbG4oJyRuYW1lOiA8ZW1wdHk+Jyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHNiLndyaXRlbG4oJyRuYW1lOicpOwogICAgICBlbGVtZW50cy5mb3JFYWNoKChzKSB7CiAgICAgICAgc2Iud3JpdGVsbignICAtICRzJyk7CiAgICAgIH0pOwogICAgfQoKICAgIHNiLndyaXRlbG4oJ0lucHV0czogJHtpbnB1dHN9Jyk7CiAgICBzYi53cml0ZWxuKCdPdXRwdXQ6ICR7b3V0cHV0fScpOwoKICAgIHNiLndyaXRlbG4oJ1dhcyBkaWFnbm9zdGljIG1lc3NhZ2UgaGFuZGxlciBwcm92aWRlZDogJwogICAgICAgICcke19yYXcub25EaWFnbm9zdGljID09IG51bGwgPyAibm8iIDogInllcyJ9Jyk7CgogICAgc2Iud3JpdGVsbignRmlsZVN5c3RlbTogJHtfZmlsZVN5c3RlbS5ydW50aW1lVHlwZX0gJwogICAgICAgICcocHJvdmlkZWQ6ICR7X3Jhdy5maWxlU3lzdGVtLnJ1bnRpbWVUeXBlfSknKTsKCiAgICB3cml0ZUxpc3QoJ0lucHV0IFN1bW1hcmllcycsIF9yYXcuaW5wdXRTdW1tYXJpZXMpOwogICAgd3JpdGVMaXN0KCdMaW5rZWQgRGVwZW5kZW5jaWVzJywgX3Jhdy5saW5rZWREZXBlbmRlbmNpZXMpOwoKICAgIHNiLndyaXRlbG4oJ1BhY2thZ2VzIHVyaTogJHtfcmF3LnBhY2thZ2VzRmlsZVVyaX0nKTsKICAgIHNiLndyaXRlbG4oJ1BhY2thZ2VzOiAke19wYWNrYWdlc30nKTsKCiAgICBzYi53cml0ZWxuKCdDb21waWxlIFNESzogJHtjb21waWxlU2RrfScpOwogICAgc2Iud3JpdGVsbignU0RLIHJvb3Q6ICR7X3Nka1Jvb3R9IChwcm92aWRlZDogJHtfcmF3LnNka1Jvb3R9KScpOwogICAgc2Iud3JpdGVsbignU0RLIHNwZWNpZmljYXRpb246ICR7X2xpYnJhcmllc1NwZWNpZmljYXRpb25Vcml9ICcKICAgICAgICAnKHByb3ZpZGVkOiAke19yYXcubGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaX0pJyk7CiAgICBzYi53cml0ZWxuKCdTREsgc3VtbWFyeTogJHtfc2RrU3VtbWFyeX0gKHByb3ZpZGVkOiAke19yYXcuc2RrU3VtbWFyeX0pJyk7CgogICAgc2Iud3JpdGVsbignTGVnYWN5IG1vZGU6ICR7bGVnYWN5TW9kZX0nKTsKICAgIHNiLndyaXRlbG4oJ1RhcmdldDogJHtfdGFyZ2V0Py5uYW1lfSAocHJvdmlkZWQ6ICR7X3Jhdy50YXJnZXQ/Lm5hbWV9KScpOwoKICAgIHNiLndyaXRlbG4oJ3Rocm93T25FcnJvcnNGb3JEZWJ1Z2dpbmc6ICR7dGhyb3dPbkVycm9yc0ZvckRlYnVnZ2luZ30nKTsKICAgIHNiLndyaXRlbG4oJ3Rocm93T25XYXJuaW5nc0ZvckRlYnVnZ2luZzogJHt0aHJvd09uV2FybmluZ3NGb3JEZWJ1Z2dpbmd9Jyk7CiAgICBzYi53cml0ZWxuKCdleGl0IG9uIHByb2JsZW06ICR7c2V0RXhpdENvZGVPblByb2JsZW19Jyk7CiAgICBzYi53cml0ZWxuKCdFbWJlZCBzb3VyY2VzOiAke2VtYmVkU291cmNlVGV4dH0nKTsKICAgIHNiLndyaXRlbG4oJ2RlYnVnRHVtcDogJHtkZWJ1Z0R1bXB9Jyk7CiAgICBzYi53cml0ZWxuKCd2ZXJib3NlOiAke3ZlcmJvc2V9Jyk7CiAgICBzYi53cml0ZWxuKCd2ZXJpZnk6ICR7dmVyaWZ5fScpOwogICAgcmV0dXJuICckc2InOwogIH0KCiAgRnV0dXJlPExpc3Q8aW50Pj4gX3JlYWRBc0J5dGVzKEZpbGVTeXN0ZW1FbnRpdHkgZmlsZSkgYXN5bmMgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIGF3YWl0IGZpbGUucmVhZEFzQnl0ZXMoKTsKICAgIH0gb24gRmlsZVN5c3RlbUV4Y2VwdGlvbiBjYXRjaCAoZXJyb3IpIHsKICAgICAgcmVwb3J0KAogICAgICAgICAgdGVtcGxhdGVDYW50UmVhZEZpbGUKICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhlcnJvci51cmksIGVycm9yLm1lc3NhZ2UpCiAgICAgICAgICAgICAgLndpdGhvdXRMb2NhdGlvbigpLAogICAgICAgICAgU2V2ZXJpdHkuZXJyb3IpOwogICAgICByZXR1cm4gbmV3IFVpbnQ4TGlzdCgwKTsKICAgIH0KICB9Cn0KCi8vLyBBIFtGaWxlU3lzdGVtXSB0aGF0IG9ubHkgYWxsb3dzIGFjY2VzcyB0byBmaWxlcyB0aGF0IGhhdmUgYmVlbiBleHBsaWNpdGx5Ci8vLyB3aGl0ZWxpc3RlZC4KY2xhc3MgSGVybWV0aWNGaWxlU3lzdGVtIGltcGxlbWVudHMgRmlsZVN5c3RlbSB7CiAgZmluYWwgU2V0PFVyaT4gaW5jbHVkZWRGaWxlczsKICBmaW5hbCBGaWxlU3lzdGVtIF9yZWFsRmlsZVN5c3RlbTsKCiAgSGVybWV0aWNGaWxlU3lzdGVtKHRoaXMuaW5jbHVkZWRGaWxlcywgdGhpcy5fcmVhbEZpbGVTeXN0ZW0pOwoKICBGaWxlU3lzdGVtRW50aXR5IGVudGl0eUZvclVyaShVcmkgdXJpKSB7CiAgICBpZiAoaW5jbHVkZWRGaWxlcy5jb250YWlucyh1cmkpKSByZXR1cm4gX3JlYWxGaWxlU3lzdGVtLmVudGl0eUZvclVyaSh1cmkpOwogICAgdGhyb3cgbmV3IEhlcm1ldGljQWNjZXNzRXhjZXB0aW9uKHVyaSk7CiAgfQp9CgpjbGFzcyBIZXJtZXRpY0FjY2Vzc0V4Y2VwdGlvbiBleHRlbmRzIEZpbGVTeXN0ZW1FeGNlcHRpb24gewogIEhlcm1ldGljQWNjZXNzRXhjZXB0aW9uKFVyaSB1cmkpCiAgICAgIDogc3VwZXIoCiAgICAgICAgICAgIHVyaSwKICAgICAgICAgICAgJ0ludmFsaWQgYWNjZXNzIHRvICR1cmk6ICcKICAgICAgICAgICAgJ3RoZSBmaWxlIGlzIGFjY2Vzc2VkIGluIGEgbW9kdWxhciBoZXJtZXRpYyBidWlsZCwgJwogICAgICAgICAgICAnYnV0IGl0IHdhcyBub3QgZXhwbGljaXRseSBsaXN0ZWQgYXMgYW4gaW5wdXQuJyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IG1lc3NhZ2U7Cn0KgrAATk48ASABIQEpAUgBTQEsKgE9AUYBSQEwLQEyNQErPAE2IQFJAT4BIwkaGBEwMEMdEiweIywkISokATIBQAEvASsBOgEmCSApJgE5BERHSE4TBEpQTUstGTgeAVEdFgFPSBQnAUgxIAE+BkxNTisiATwGTE1QKy0BTw8nAVALEBQaFQQBExcaGAQBHgEwMiQrNzQGHQQBIiYaJwQBEQEyATABJAEiASgBLgE+ATQBSAFMATEaATYUATABT002KUk/UTZIARtRJRtIF04tMUUxSggGQz0EATkoOz87BkAUBkE6HEoGBAE8RgQBRSwEAUZDMQQBSkhJJwExQhQGASA8HUsUBgEeTx1OFAYBKR1FJRQGATJNHD0fThYIBhEEAUYVKgEaAUsNRAFPDjUBKgEkJgFJQgESI04BNDcoSztLBAFAPkMoKy8vPwgGIQQBNSg6BiUEAUsmPk0tJkQ9KEoiTAYmBAFCLUgGLAQBSD5PJypEPShKHEwGIAQBTEUaRjM2SCMWBAFKBklJTBcdGAYiNjwrKyo/BhsEAU4cSENMAS1OGB8tOx0INQYBD1EKEU8qNR1KGzUGBAE8BkkxKi0ZKE0GAR1KOR1DLgYBHgFISAEmDj8kGy4GAToEAT88GApDRCkdUAYcGwxFJScQJyo5HRQfTQgGGSAEAUAGThgGUFFOJQZRSjwGRhUGTTo4JhsdLVAlIgYBLDBPEwYBICtFASUnKS8kFyUGAUUgBAElAU4GTC8eJiEdGCgmNAgXHUYYQQYBIyUeSk4qPgYBMkMdSgYEAT0jHAQBGSEsHiYQCBwdHgoGASUlATs4ATk3ATc/ATkqAS5FQzpOAS5NAUtPPDUrJyUSBAFACictDh83IhsfBgQCAU4RMSAkAUABK08sBAIBPCMPESdBPgEMIAIBMXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9iYXNlL3Byb2Nlc3NlZF9vcHRpb25zLmRhcnRAc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Jhc2UvbGlicmFyaWVzX3NwZWNpZmljYXRpb24uZGFydKdOLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBMaWJyYXJ5IHNwZWNpZmljYXRpb24gaW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uLgovLy8KLy8vIE1hbnkgZGFydCB0b29scyBhcmUgY29uZmlndXJhYmxlIHRvIHN1cHBvcnQgZGlmZmVyZW50IHRhcmdldCBwbGF0Zm9ybXMuICBGb3IKLy8vIGEgZ2l2ZW4gdGFyZ2V0LCB0aGV5IG5lZWQgdG8ga25vdyB3aGF0IGxpYnJhcmllcyBhcmUgYXZhaWxhYmxlIGFuZCB3aGVyZSBhcmUKLy8vIHRoZSBzb3VyY2VzIGFuZCB0YXJnZXQtc3BlY2lmaWMgcGF0Y2hlcy4KLy8vCi8vLyBIZXJlIHdlIGRlZmluZSBBUElzIHRvIHJlcHJlc2VudCB0aGlzIHNwZWNpZmljYXRpb24gYW5kIGltcGxlbWVudAovLy8gc2VyaWFsaXphdGlvbiB0byAoYW5kIGRlc2VyaWFsaXphdGlvbiBmcm9tKSBhIEpTT04gZmlsZS4KLy8vCi8vLyBIZXJlIGlzIGFuIGV4YW1wbGUgc3BlY2lmaWNhdGlvbiBKU09OIGZpbGU6Ci8vLwovLy8gICAgIHsKLy8vICAgICAgICJ2bSI6IHsKLy8vICAgICAgICAgImxpYnJhcmllcyI6IHsKLy8vICAgICAgICAgICAgICJjb3JlIjogewovLy8gICAgICAgICAgICAgICAgInVyaSI6ICJhc3luYy9jb3JlLmRhcnQiLAovLy8gICAgICAgICAgICAgICAgInBhdGNoZXMiOiBbCi8vLyAgICAgICAgICAgICAgICAgICAgInBhdGgvdG8vY29yZV9wYXRjaC5kYXJ0IiwKLy8vICAgICAgICAgICAgICAgICAgICAicGF0aC90by9saXN0X3BhdGNoLmRhcnQiCi8vLyAgICAgICAgICAgICAgICBdCi8vLyAgICAgICAgICAgICB9Ci8vLyAgICAgICAgICAgICAiYXN5bmMiOiB7Ci8vLyAgICAgICAgICAgICAgICAidXJpIjogImFzeW5jL2FzeW5jLmRhcnQiLAovLy8gICAgICAgICAgICAgICAgInBhdGNoZXMiOiAicGF0aC90by9hc3luY19wYXRjaC5kYXJ0IgovLy8gICAgICAgICAgICAgfQovLy8gICAgICAgICAgICAgImNvbnZlcnQiOiB7Ci8vLyAgICAgICAgICAgICAgICAidXJpIjogImNvbnZlcnQvY29udmVydC5kYXJ0IiwKLy8vICAgICAgICAgICAgIH0KLy8vICAgICAgICAgICAgICJtaXJyb3JzIjogewovLy8gICAgICAgICAgICAgICAgInVyaSI6ICJtaXJyb3JzL21pcnJvcnMuZGFydCIsCi8vLyAgICAgICAgICAgICAgICAic3VwcG9ydGVkIjogZmFsc2UKLy8vICAgICAgICAgICAgIH0KLy8vICAgICAgICAgfQovLy8gICAgICAgfQovLy8gICAgIH0KLy8vCi8vLyBUaGUgZm9ybWF0IGNvbnRhaW5zOgovLy8gICAtIGEgdG9wIGxldmVsIGVudHJ5IGZvciBlYWNoIHRhcmdldC4gS2V5cyBhcmUgdGFyZ2V0IG5hbWVzIChlLmcuICJ2bSIKLy8vICAgICBhYm92ZSksIGFuZCB2YWx1ZXMgY29udGFpbiB0aGUgZW50aXJlIHNwZWNpZmljYXRpb24gb2YgYSB0YXJnZXQuCi8vLwovLy8gICAtIGVhY2ggdGFyZ2V0IHNwZWNpZmljYXRpb24gaXMgYSBtYXAuIFRvZGF5LCBvbmx5IG9uZSBrZXkgaXMgc3VwcG9ydGVkIG9uCi8vLyAgICAgdGhpcyBtYXA6ICJsaWJyYXJpZXMiLgovLy8KLy8vICAgLSBUaGUgImxpYnJhcmllcyIgZW50cnkgY29udGFpbnMgZGV0YWlscyBmb3IgaG93IGVhY2ggcGxhdGZvcm0gbGlicmFyeSBpcwovLy8gICAgIGltcGxlbWVudGVkLiBUaGUgZW50cnkgaXMgYSBtYXAsIHdoZXJlIGtleXMgYXJlIHRoZSBuYW1lIG9mIHRoZSBwbGF0Zm9ybQovLy8gICAgIGxpYnJhcnkgYW5kIHZhbHVlcyBjb250YWluIGRldGFpbHMgZm9yIHdoZXJlIHRvIGZpbmQgdGhlIGltcGxlbWVudGF0aW9uCi8vLyAgICAgZm8gdGhhdCBsaWJyYXJ5LgovLy8KLy8vICAgLSBUaGUgbmFtZSBvZiB0aGUgbGlicmFyeSBpcyBhIHNpbmdsZSB0b2tlbiAoZS5nLiAiY29yZSIpIHRoYXQgbWF0Y2hlcyB0aGUKLy8vICAgICBVcmkgcGF0aCB1c2VkIGFmdGVyIGBkYXJ0OmAgKGUuZy4gImRhcnQ6Y29yZSIpLgovLy8KLy8vICAgLSBUaGUgInVyaSIgZW50cnkgb24gdGhlIGxpYnJhcnkgaW5mb3JtYXRpb24gaXMgbWFuZGF0b3J5LiBUaGUgdmFsdWUgaXMgYQovLy8gICAgIHN0cmluZyBVUkkgcmVmZXJlbmNlLiBUaGUgInBhdGNoZXMiIGVudHJ5IGlzIG9wdGlvbmFsIGFuZCBtYXkgaGF2ZSBhcyBhCi8vLyAgICAgdmFsdWUgYSBzdHJpbmcgVVJJIHJlZmVyZW5jZSBvciBhIGxpc3Qgb2YgVVJJIHJlZmVyZW5jZXMuCi8vLwovLy8gICAgIEFsbCBVUkkgcmVmZXJlbmNlcyBjYW4gZWl0aGVyIGJlIGEgZmlsZSBVUkkgb3IgYSByZWxhdGl2ZSBVUkkgcGF0aCwKLy8vICAgICB3aGljaCB3aWxsIGJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeQovLy8gICAgIHNwZWNpZmljYXRpb24gZmlsZS4KLy8vCi8vLyAgIC0gVGhlICJzdXBwb3J0ZWQiIGVudHJ5IG9uIHRoZSBsaWJyYXJ5IGluZm9ybWF0aW9uIGlzIG9wdGlvbmFsLiBUaGUgdmFsdWUKLy8vICAgICBpcyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBsaWJyYXJ5IGlzIHN1cHBvcnRlZCBpbiB0aGUKLy8vICAgICB1bmRlcmx5aW5nIHRhcmdldC4gIEhvd2V2ZXIsIHNpbmNlIHRoZSBsaWJyYXJpZXMgYXJlIGFzc3VtZWQgdG8gYmUKLy8vICAgICBzdXBwb3J0ZWQgYnkgZGVmYXVsdCwgd2Ugb25seSBleHBlY3QgdXNlcnMgdG8gdXNlIGBmYWxzZWAuCi8vLwovLy8gICAgIFRoZSBwdXJwb3NlIG9mIHRoaXMgdmFsdWUgaXMgdG8gY29uZmlndXJlIGNvbmRpdGlvbmFsIGltcG9ydHMgYW5kCi8vLyAgICAgZW52aXJvbm1lbnQgY29uc3RhbnRzLiBCeSBkZWZhdWx0IGV2ZXJ5IHBsYXRmb3JtIGxpYnJhcnkgdGhhdCBpcwovLy8gICAgIGF2YWlsYWJsZSBpbiB0aGUgImxpYnJhcmllcyIgc2VjdGlvbiBpbXBsaWNpdGx5IGRlZmluZXMgYW4gZW52aXJvbm1lbnQKLy8vICAgICB2YXJpYWJsZSBgZGFydC5saWJyYXJ5Lm5hbWVgIGFzIGAidHJ1ZSJgLCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBsaWJyYXJ5Ci8vLyAgICAgaXMgc3VwcG9ydGVkLiAgU29tZSBiYWNrZW5kcyBhbGxvdyBpbXBvcnRzIHRvIGFuIHVuc3VwcG9ydGVkIHBsYXRmb3JtCi8vLyAgICAgbGlicmFyeSAodHVybmluZyBhIHN0YXRpYyBlcnJvciBpbnRvIGEgcnVudGltZSBlcnJvciB3aGVuIHRoZSBsaWJyYXJ5IGlzCi8vLyAgICAgZXZlbnR1YWxseSBhY2Nlc3NlZCkuIFRoZXNlIGJhY2tlbmRzIGNhbiB1c2UgYHN1cHBvcnRlZDogZmFsc2VgIHRvCi8vLyAgICAgcmVwb3J0IHRoYXQgc3VjaCBsaWJyYXJ5IGlzIHN0aWxsIG5vdCBzdXBwb3J0ZWQgaW4gY29uZGl0aW9uYWwgaW1wb3J0cwovLy8gICAgIGFuZCBjb25zdCBgZnJvbUVudmlyb25tZW50YCBleHByZXNzaW9ucy4KLy8vCi8vLwovLy8gTm90ZTogd2UgY3VycmVudGx5IGhhdmUgc2V2ZXJhbCBkaWZmZXJlbnQgZmlsZXMgdGhhdCBuZWVkIHRvIGJlIHVwZGF0ZWQKLy8vIHdoZW4gY2hhbmdpbmcgbGlicmFyaWVzLCBzb3VyY2VzLCBhbmQgcGF0Y2ggZmlsZXM6Ci8vLyAgICAqIC5wbGF0Zm9ybSBmaWxlcyAoZm9yIGRhcnQyanMpCi8vLyAgICAqIC5neXBpIGZpbGVzIChmb3Igdm0pCi8vLyAgICAqIHNka19saWJyYXJ5X21ldGFkYXRhL2xpYi9saWJyYXJpZXMuZGFydCAoZm9yIGFuYWx5emVyLCBkZGMpCi8vLwovLy8gd2UgYXJlIGluIHRoZSBwcm9jZXNzIG9mIHVuaWZ5aW5nIHRoZW0gYWxsIHVuZGVyIHRoaXMgZm9ybWF0IChzZWUKLy8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8yODgzNiksIGJ1dCBmb3Igbm93IHdlIG5lZWQgdG8gcGF5Ci8vLyBjbG9zZSBhdHRlbnRpb24gdG8gY2hhbmdlIHRoZW0gY29uc2lzdGVudGx5LgoKLy8gVE9ETyhzaWdtdW5kKTogbW92ZSB0aGlzIGZpbGUgdG8gYSBzaGFyZWQgcGFja2FnZS4KaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cganNvbkRlY29kZSwganNvbkVuY29kZTsKCmltcG9ydCAnLi4vZmFzdGEvdXRpbC9yZWxhdGl2aXplLmRhcnQnOwoKLy8vIENvbnRlbnRzIGZyb20gYSBzaW5nbGUgbGlicmFyeSBzcGVjaWZpY2F0aW9uIGZpbGUuCi8vLwovLy8gQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGxpYnJhcmllcyBvbiBhbGwgdGFyZ2V0IHBsYXRmb3JtcyBkZWZpbmVkIGluCi8vLyB0aGF0IGZpbGUuCmNsYXNzIExpYnJhcmllc1NwZWNpZmljYXRpb24gewogIGZpbmFsIE1hcDxTdHJpbmcsIFRhcmdldExpYnJhcmllc1NwZWNpZmljYXRpb24+IF90YXJnZXRzOwoKICBjb25zdCBMaWJyYXJpZXNTcGVjaWZpY2F0aW9uKAogICAgICBbdGhpcy5fdGFyZ2V0cyA9IGNvbnN0IDxTdHJpbmcsIFRhcmdldExpYnJhcmllc1NwZWNpZmljYXRpb24+e31dKTsKCiAgLy8vIFRoZSBsaWJyYXJ5IHNwZWNpZmljYXRpb24gZm9yIGEgZ2l2ZW4gW3RhcmdldF0sIG9yIHRocm93cyBpZiBub25lIGlzCiAgLy8vIGF2YWlsYWJsZS4KICBUYXJnZXRMaWJyYXJpZXNTcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb25Gb3IoU3RyaW5nIHRhcmdldCkgewogICAgdmFyIHRhcmdldFNwZWMgPSBfdGFyZ2V0c1t0YXJnZXRdOwogICAgaWYgKHRhcmdldFNwZWMgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgTGlicmFyaWVzU3BlY2lmaWNhdGlvbkV4Y2VwdGlvbigKICAgICAgICAgICdObyBsaWJyYXJ5IHNwZWNpZmljYXRpb24gZm9yIHRhcmdldCAiJHRhcmdldCInKTsKICAgIH0KICAgIHJldHVybiB0YXJnZXRTcGVjOwogIH0KCiAgLy8vIFBhcnNlIHRoZSBnaXZlbiBbanNvbl0gYXMgYSBsaWJyYXJ5IHNwZWNpZmljYXRpb24sIHJlc29sdmluZyBhbnkgcmVsYXRpdmUKICAvLy8gcGF0aHMgZnJvbSBbYmFzZVVyaV0uCiAgLy8vCiAgLy8vIE1heSB0aHJvdyBhbiBleGNlcHRpb24gaWYgW2pzb25dIGlzIG5vdCBwcm9wZXJseSBmb3JtYXR0ZWQgb3IgY29udGFpbnMKICAvLy8gaW52YWxpZCB2YWx1ZXMuCiAgc3RhdGljIExpYnJhcmllc1NwZWNpZmljYXRpb24gcGFyc2UoVXJpIGJhc2VVcmksIFN0cmluZyBqc29uKSB7CiAgICBpZiAoanNvbiA9PSBudWxsKSByZXR1cm4gY29uc3QgTGlicmFyaWVzU3BlY2lmaWNhdGlvbigpOwogICAgdmFyIGpzb25EYXRhOwogICAgdHJ5IHsKICAgICAgdmFyIGRhdGEgPSBqc29uRGVjb2RlKGpzb24pOwogICAgICBpZiAoZGF0YSBpcyEgTWFwKSB7CiAgICAgICAgcmV0dXJuIF9yZXBvcnRFcnJvcigndG9wLWxldmVsIHNwZWNpZmljYXRpb24gaXMgbm90IGEgbWFwJyk7CiAgICAgIH0KICAgICAganNvbkRhdGEgPSBkYXRhIGFzIE1hcDsKICAgIH0gb24gRm9ybWF0RXhjZXB0aW9uIGNhdGNoIChlKSB7CiAgICAgIHRocm93IG5ldyBMaWJyYXJpZXNTcGVjaWZpY2F0aW9uRXhjZXB0aW9uKGUpOwogICAgfQogICAgdmFyIHRhcmdldHMgPSA8U3RyaW5nLCBUYXJnZXRMaWJyYXJpZXNTcGVjaWZpY2F0aW9uPnt9OwogICAganNvbkRhdGEuZm9yRWFjaCgoU3RyaW5nIHRhcmdldE5hbWUsIHRhcmdldERhdGEpIHsKICAgICAgaWYgKHRhcmdldE5hbWUuc3RhcnRzV2l0aCgiY29tbWVudDoiKSkgcmV0dXJuIG51bGw7CiAgICAgIE1hcDxTdHJpbmcsIExpYnJhcnlJbmZvPiBsaWJyYXJpZXMgPSA8U3RyaW5nLCBMaWJyYXJ5SW5mbz57fTsKICAgICAgaWYgKHRhcmdldERhdGEgaXMhIE1hcCkgewogICAgICAgIHJldHVybiBfcmVwb3J0RXJyb3IoCiAgICAgICAgICAgICJ0YXJnZXQgc3BlY2lmaWNhdGlvbiBmb3IgJyR0YXJnZXROYW1lJyBpcyBub3QgYSBtYXAiKTsKICAgICAgfQogICAgICBpZiAoIXRhcmdldERhdGEuY29udGFpbnNLZXkoImxpYnJhcmllcyIpKSB7CiAgICAgICAgcmV0dXJuIF9yZXBvcnRFcnJvcigidGFyZ2V0IHNwZWNpZmljYXRpb24gIgogICAgICAgICAgICAiZm9yICckdGFyZ2V0TmFtZScgZG9lc24ndCBoYXZlIGEgbGlicmFyaWVzIGVudHJ5Iik7CiAgICAgIH0KICAgICAgdmFyIGxpYnJhcmllc0RhdGEgPSB0YXJnZXREYXRhWyJsaWJyYXJpZXMiXTsKICAgICAgaWYgKGxpYnJhcmllc0RhdGEgaXMhIE1hcCkgewogICAgICAgIHJldHVybiBfcmVwb3J0RXJyb3IoImxpYnJhcmllcyBlbnRyeSBmb3IgJyR0YXJnZXROYW1lJyBpcyBub3QgYSBtYXAiKTsKICAgICAgfQogICAgICBsaWJyYXJpZXNEYXRhLmZvckVhY2goKFN0cmluZyBuYW1lLCBkYXRhKSB7CiAgICAgICAgaWYgKGRhdGEgaXMhIE1hcCkgewogICAgICAgICAgcmV0dXJuIF9yZXBvcnRFcnJvcigKICAgICAgICAgICAgICAibGlicmFyeSBkYXRhIGZvciAnJG5hbWUnIGluIHRhcmdldCAnJHRhcmdldE5hbWUnIGlzIG5vdCBhIG1hcCIpOwogICAgICAgIH0KICAgICAgICBVcmkgY2hlY2tBbmRSZXNvbHZlKHVyaVN0cmluZykgewogICAgICAgICAgaWYgKHVyaVN0cmluZyBpcyEgU3RyaW5nKSB7CiAgICAgICAgICAgIHJldHVybiBfcmVwb3J0RXJyb3IoInVyaSB2YWx1ZSAnJHVyaVN0cmluZycgaXMgbm90IGEgc3RyaW5nIgogICAgICAgICAgICAgICAgIihmcm9tIGxpYnJhcnkgJyRuYW1lJyBpbiB0YXJnZXQgJyR0YXJnZXROYW1lJykiKTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciB1cmkgPSBVcmkucGFyc2UodXJpU3RyaW5nKTsKICAgICAgICAgIGlmICh1cmkuc2NoZW1lICE9ICcnICYmIHVyaS5zY2hlbWUgIT0gJ2ZpbGUnKSB7CiAgICAgICAgICAgIHJldHVybiBfcmVwb3J0RXJyb3IoInVyaSBzY2hlbWUgaW4gJyR1cmlTdHJpbmcnIGlzIG5vdCBzdXBwb3J0ZWQuIik7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gYmFzZVVyaS5yZXNvbHZlVXJpKHVyaSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgdXJpID0gY2hlY2tBbmRSZXNvbHZlKGRhdGFbJ3VyaSddKTsKICAgICAgICBMaXN0PFVyaT4gcGF0Y2hlczsKICAgICAgICBpZiAoZGF0YVsncGF0Y2hlcyddIGlzIExpc3QpIHsKICAgICAgICAgIHBhdGNoZXMgPQogICAgICAgICAgICAgIGRhdGFbJ3BhdGNoZXMnXS5tYXA8VXJpPigocykgPT4gYmFzZVVyaS5yZXNvbHZlKHMpKS50b0xpc3QoKTsKICAgICAgICB9IGVsc2UgaWYgKGRhdGFbJ3BhdGNoZXMnXSBpcyBTdHJpbmcpIHsKICAgICAgICAgIHBhdGNoZXMgPSBbY2hlY2tBbmRSZXNvbHZlKGRhdGFbJ3BhdGNoZXMnXSldOwogICAgICAgIH0gZWxzZSBpZiAoZGF0YVsncGF0Y2hlcyddID09IG51bGwpIHsKICAgICAgICAgIHBhdGNoZXMgPSBjb25zdCBbXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIF9yZXBvcnRFcnJvcigKICAgICAgICAgICAgICAicGF0Y2hlcyBlbnRyeSBmb3IgJyRuYW1lJyBpcyBub3QgYSBsaXN0IG9yIGEgc3RyaW5nIik7CiAgICAgICAgfQoKICAgICAgICB2YXIgc3VwcG9ydGVkID0gZGF0YVsnc3VwcG9ydGVkJ10gPz8gdHJ1ZTsKICAgICAgICBpZiAoc3VwcG9ydGVkIGlzISBib29sKSB7CiAgICAgICAgICByZXR1cm4gX3JlcG9ydEVycm9yKCJcInN1cHBvcnRlZFwiIGVudHJ5OiBleHBlY3RlZCBhICdib29sJyBidXQgIgogICAgICAgICAgICAgICJnb3QgYSAnJHtzdXBwb3J0ZWQucnVudGltZVR5cGV9JyAoJyRzdXBwb3J0ZWQnKSIpOwogICAgICAgIH0KICAgICAgICBsaWJyYXJpZXNbbmFtZV0gPQogICAgICAgICAgICBuZXcgTGlicmFyeUluZm8obmFtZSwgdXJpLCBwYXRjaGVzLCBpc1N1cHBvcnRlZDogc3VwcG9ydGVkKTsKICAgICAgfSk7CiAgICAgIHRhcmdldHNbdGFyZ2V0TmFtZV0gPQogICAgICAgICAgbmV3IFRhcmdldExpYnJhcmllc1NwZWNpZmljYXRpb24odGFyZ2V0TmFtZSwgbGlicmFyaWVzKTsKICAgIH0pOwogICAgcmV0dXJuIG5ldyBMaWJyYXJpZXNTcGVjaWZpY2F0aW9uKHRhcmdldHMpOwogIH0KCiAgc3RhdGljIF9yZXBvcnRFcnJvcihTdHJpbmcgZXJyb3IpID0+CiAgICAgIHRocm93IG5ldyBMaWJyYXJpZXNTcGVjaWZpY2F0aW9uRXhjZXB0aW9uKGVycm9yKTsKCiAgLy8vIFNlcmlhbGl6ZSB0aGlzIHNwZWNpZmljYXRpb24gdG8ganNvbi4KICAvLy8KICAvLy8gSWYgcG9zc2libGUgc2VyaWFsaXplcyBwYXRocyByZWxhdGl2ZSB0byBbb3V0cHV0VXJpXS4KICBTdHJpbmcgdG9Kc29uU3RyaW5nKFVyaSBvdXRwdXRVcmkpID0+IGpzb25FbmNvZGUodG9Kc29uTWFwKG91dHB1dFVyaSkpOwoKICBNYXAgdG9Kc29uTWFwKFVyaSBvdXRwdXRVcmkpIHsKICAgIHZhciByZXN1bHQgPSB7fTsKICAgIHZhciBkaXIgPSBvdXRwdXRVcmkucmVzb2x2ZSgnLicpOwogICAgU3RyaW5nIHBhdGhGb3IoVXJpIHVyaSkgPT4gcmVsYXRpdml6ZVVyaSh1cmksIGJhc2U6IGRpcik7CiAgICBfdGFyZ2V0cy5mb3JFYWNoKCh0YXJnZXROYW1lLCB0YXJnZXQpIHsKICAgICAgdmFyIGxpYnJhcmllcyA9IHt9OwogICAgICB0YXJnZXQuX2xpYnJhcmllcy5mb3JFYWNoKChuYW1lLCBsaWIpIHsKICAgICAgICBsaWJyYXJpZXNbbmFtZV0gPSB7CiAgICAgICAgICAndXJpJzogcGF0aEZvcihsaWIudXJpKSwKICAgICAgICAgICdwYXRjaGVzJzogbGliLnBhdGNoZXMubWFwKHBhdGhGb3IpLnRvTGlzdCgpLAogICAgICAgIH07CiAgICAgICAgaWYgKCFsaWIuaXNTdXBwb3J0ZWQpIHsKICAgICAgICAgIGxpYnJhcmllc1tuYW1lXVsnc3VwcG9ydGVkJ10gPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICByZXN1bHRbdGFyZ2V0TmFtZV0gPSB7J2xpYnJhcmllcyc6IGxpYnJhcmllc307CiAgICB9KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CgovLy8gU3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IGFsbCBsaWJyYXJpZXMgc3VwcG9ydGVkIGJ5IGEgZ2l2ZW4gdGFyZ2V0LgpjbGFzcyBUYXJnZXRMaWJyYXJpZXNTcGVjaWZpY2F0aW9uIHsKICAvLy8gTmFtZSBvZiB0aGUgdGFyZ2V0IHBsYXRmb3JtLgogIGZpbmFsIFN0cmluZyB0YXJnZXROYW1lOwoKICBmaW5hbCBNYXA8U3RyaW5nLCBMaWJyYXJ5SW5mbz4gX2xpYnJhcmllczsKCiAgY29uc3QgVGFyZ2V0TGlicmFyaWVzU3BlY2lmaWNhdGlvbih0aGlzLnRhcmdldE5hbWUsCiAgICAgIFt0aGlzLl9saWJyYXJpZXMgPSBjb25zdCA8U3RyaW5nLCBMaWJyYXJ5SW5mbz57fV0pOwoKICAvLy8gRGV0YWlscyBhYm91dCBhIGxpYnJhcnkgd2hvc2UgaW1wb3J0IGlzIGBkYXJ0OiRuYW1lYC4KICBMaWJyYXJ5SW5mbyBsaWJyYXJ5SW5mb0ZvcihTdHJpbmcgbmFtZSkgPT4gX2xpYnJhcmllc1tuYW1lXTsKCiAgSXRlcmFibGU8TGlicmFyeUluZm8+IGdldCBhbGxMaWJyYXJpZXMgPT4gX2xpYnJhcmllcy52YWx1ZXM7Cn0KCi8vLyBJbmZvcm1hdGlvbiBhYm91dCBhIGBkYXJ0OmAgbGlicmFyeSBpbiBhIHNwZWNpZmljIHRhcmdldCBwbGF0Zm9ybS4KY2xhc3MgTGlicmFyeUluZm8gewogIC8vLyBUaGUgbmFtZSBvZiB0aGUgbGlicmFyeSwgd2hpY2ggaXMgdGhlIHBhdGggZGV2ZWxvcGVycyB1c2UgdG8gaW1wb3J0IHRoaXMKICAvLy8gbGlicmFyeSAoYXMgYGRhcnQ6JG5hbWVgKS4KICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgLy8vIFRoZSBmaWxlIGRlZmluaW5nIHRoZSBtYWluIGltcGxlbWVudGF0aW9uIG9mIHRoZSBsaWJyYXJ5LgogIGZpbmFsIFVyaSB1cmk7CgogIC8vLyBQYXRjaCBmaWxlcyB1c2VkIGZvciB0aGlzIGxpYnJhcnkgaW4gdGhlIHRhcmdldCBwbGF0Zm9ybSwgaWYgYW55LgogIGZpbmFsIExpc3Q8VXJpPiBwYXRjaGVzOwoKICAvLy8gV2hldGhlciB0aGUgbGlicmFyeSBpcyBzdXBwb3J0ZWQgYW5kIHRodXMgYGRhcnQubGlicmFyeS5uYW1lYCBpcyAidHJ1ZSIKICAvLy8gZm9yIGNvbmRpdGlvbmFsIGltcG9ydHMgYW5kIGZyb21FbnZpcm9ubWVudCBjb25zdGFudHMuCiAgZmluYWwgYm9vbCBpc1N1cHBvcnRlZDsKCiAgY29uc3QgTGlicmFyeUluZm8odGhpcy5uYW1lLCB0aGlzLnVyaSwgdGhpcy5wYXRjaGVzLAogICAgICB7dGhpcy5pc1N1cHBvcnRlZDogdHJ1ZX0pOwp9CgpjbGFzcyBMaWJyYXJpZXNTcGVjaWZpY2F0aW9uRXhjZXB0aW9uIHsKICBPYmplY3QgZXJyb3I7CiAgTGlicmFyaWVzU3BlY2lmaWNhdGlvbkV4Y2VwdGlvbih0aGlzLmVycm9yKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyRlcnJvcic7Cn0KgQoATk48ATQEUVEtBEY9BDAEChIbGi0gMjEVEhsuORIdMhIdMiYSDgwKBBlMSQRQHwRQUVAZBFE4BFBQQgRMRxwEUEhLQwRKSU9PTlFLTzEEBEw3Jx5FBEZPMQE2MwEoATcEUA8fPAEgSQFLEUEnHjE8BhcEAVAcBk0WQj0SCiMaRQgeJTQGPDc6RCAdRAgyNEEIMyNPCDIcH1AKKSZJQwwqOlEMKgoBMBsnFEwwOC4eER9GCgEzIkxCChpJChxDCDAEASc4ASwGPEoBIRUmPiwaLhwjOAsgMAoKNQgTBAIBSyUjGwEtATY6ATw/AT8CAUcUTyEVAUARAUgbAU49GgE3IQIBKBAvASECATdwYWNrYWdlOmZyb250X2VuZC9zcmMvYmFzZS9saWJyYXJpZXNfc3BlY2lmaWNhdGlvbi5kYXJ0OnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9jb21waWxlcl9jb250ZXh0LmRhcnSUJy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmNvbXBpbGVyX2NvbnRleHQ7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnIHNob3cgRnV0dXJlLCBab25lLCBydW5ab25lZDsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgU291cmNlOwoKaW1wb3J0ICcuLi9hcGlfcHJvdG90eXBlL2ZpbGVfc3lzdGVtLmRhcnQnIHNob3cgRmlsZVN5c3RlbTsKCmltcG9ydCAnLi4vYmFzZS9wcm9jZXNzZWRfb3B0aW9ucy5kYXJ0JyBzaG93IFByb2Nlc3NlZE9wdGlvbnM7CgppbXBvcnQgJ3NjYW5uZXIvdG9rZW4uZGFydCcgc2hvdyBTdHJpbmdUb2tlbjsKCmltcG9ydCAnY29tbWFuZF9saW5lX3JlcG9ydGluZy5kYXJ0JyBhcyBjb21tYW5kX2xpbmVfcmVwb3J0aW5nOwoKaW1wb3J0ICdjb2xvcnMuZGFydCcgc2hvdyBjb21wdXRlRW5hYmxlQ29sb3JzOwoKaW1wb3J0ICdmYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdyBMb2NhdGVkTWVzc2FnZSwgTWVzc2FnZSwgbWVzc2FnZUludGVybmFsUHJvYmxlbU1pc3NpbmdDb250ZXh0OwoKaW1wb3J0ICdzZXZlcml0eS5kYXJ0JyBzaG93IFNldmVyaXR5OwoKZmluYWwgT2JqZWN0IGNvbXBpbGVyQ29udGV4dEtleSA9IG5ldyBPYmplY3QoKTsKCi8vLyBTaGFyZWQgY29udGV4dCB1c2VkIHRocm91Z2hvdXQgdGhlIGNvbXBpbGVyLgovLy8KLy8vIFRoZSBjb21waWxlciB3b3JrcyB3aXRoIGEgc2luZ2xlIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuIFRvIGF2b2lkCi8vLyBwYXNzaW5nIGl0IGFyb3VuZCBhcyBhbiBhcmd1bWVudCBldmVyeXdoZXJlLCBpdCBpcyBzdG9yZWQgYXMgYSB6b25lLXZhbHVlLgovLy8KLy8vIEZvciBjb252ZW5pZW5jZSB0aGUgc3RhdGljIGdldHRlciBbQ29tcGlsZXJDb250ZXh0LmN1cnJlbnRdIHJldHJpZXZlcyB0aGUKLy8vIGNvbnRleHQgc3RvcmVkIGluIHRoZSBjdXJyZW50IHpvbmUuCmNsYXNzIENvbXBpbGVyQ29udGV4dCB7CiAgLy8gVE9ETyhzaWdtdW5kKTogTW92ZSBoZXJlIGFueSBtZXRob2QgaW4gUHJvY2Vzc2VkT3B0aW9ucyB0aGF0IGRvZXNuJ3Qgc2VlbQogIC8vIGFwcHJvcHJpYXRlIGFzIGFuICJvcHRpb24iLCBvciBjb25zaWRlciBtZXJnaW5nIFByb2Nlc3NlZE9wdGlvbnMgZW50aXJlbHkKICAvLyB3aXRoaW4gdGhpcyBjbGFzcywgYW5kIGRlcGVuZCBvbmx5IG9uIHRoZSByYXcgb3B0aW9ucyBoZXJlLgogIGZpbmFsIFByb2Nlc3NlZE9wdGlvbnMgb3B0aW9uczsKCiAgLy8vIFNvdXJjZXMgc2VlbiBieSB0aGUgY29tcGlsZXIuCiAgLy8vCiAgLy8vIFRoaXMgaXMgcG9wdWxhdGVkIGFzIHRoZSBjb21waWxlciByZWFkcyBmaWxlcywgYW5kIGl0IGlzIHVzZWQgZm9yIGVycm9yCiAgLy8vIHJlcG9ydGluZyBhbmQgdG8gZ2VuZXJhdGUgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uIGluIHRoZSBjb21waWxlZAogIC8vLyBwcm9ncmFtcy4KICBmaW5hbCBNYXA8VXJpLCBTb3VyY2U+IHVyaVRvU291cmNlID0gPFVyaSwgU291cmNlPnt9OwoKICAvLyBUT0RPKGFoZSk6IFJlbW92ZSB0aGlzLgogIGZpbmFsIExpc3Q8T2JqZWN0PiBlcnJvcnMgPSA8T2JqZWN0PltdOwoKICBmaW5hbCBMaXN0PFVyaT4gZGVwZW5kZW5jaWVzID0gPFVyaT5bXTsKCiAgRmlsZVN5c3RlbSBnZXQgZmlsZVN5c3RlbSA9PiBvcHRpb25zLmZpbGVTeXN0ZW07CgogIGJvb2wgZW5hYmxlQ29sb3JzQ2FjaGVkID0gbnVsbDsKCiAgVXJpIGNhY2hlZFNka1Jvb3QgPSBudWxsOwoKICBDb21waWxlckNvbnRleHQodGhpcy5vcHRpb25zKTsKCiAgdm9pZCBkaXNhYmxlQ29sb3JzKCkgewogICAgZW5hYmxlQ29sb3JzQ2FjaGVkID0gZmFsc2U7CiAgfQoKICAvLy8gUmVwb3J0IFttZXNzYWdlXSwgZm9yIGV4YW1wbGUsIGJ5IHByaW50aW5nIGl0LgogIHZvaWQgcmVwb3J0KExvY2F0ZWRNZXNzYWdlIG1lc3NhZ2UsIFNldmVyaXR5IHNldmVyaXR5LAogICAgICB7TGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dH0pIHsKICAgIG9wdGlvbnMucmVwb3J0KG1lc3NhZ2UsIHNldmVyaXR5LCBjb250ZXh0OiBjb250ZXh0KTsKICB9CgogIC8vLyBSZXBvcnQgW21lc3NhZ2VdLCBmb3IgZXhhbXBsZSwgYnkgcHJpbnRpbmcgaXQuCiAgLy8gVE9ETyhhc2tlc2MpOiBSZW1vdmUgdGhpcyBhbmQgZGlyZWN0IGNhbGxlcnMgZGlyZWN0bHkgdG8gcmVwb3J0LgogIHZvaWQgcmVwb3J0V2l0aG91dExvY2F0aW9uKE1lc3NhZ2UgbWVzc2FnZSwgU2V2ZXJpdHkgc2V2ZXJpdHkpIHsKICAgIG9wdGlvbnMucmVwb3J0V2l0aG91dExvY2F0aW9uKG1lc3NhZ2UsIHNldmVyaXR5KTsKICB9CgogIC8vLyBGb3JtYXQgW21lc3NhZ2VdIGFzIGEgdGV4dCBzdHJpbmcgdGhhdCBjYW4gYmUgaW5jbHVkZWQgaW4gZ2VuZXJhdGVkIGNvZGUuCiAgU3RyaW5nIGZvcm1hdChMb2NhdGVkTWVzc2FnZSBtZXNzYWdlLCBTZXZlcml0eSBzZXZlcml0eSkgewogICAgcmV0dXJuIGNvbW1hbmRfbGluZV9yZXBvcnRpbmcuZm9ybWF0KG1lc3NhZ2UsIHNldmVyaXR5KTsKICB9CgogIC8vLyBGb3JtYXQgW21lc3NhZ2VdIGFzIGEgdGV4dCBzdHJpbmcgdGhhdCBjYW4gYmUgaW5jbHVkZWQgaW4gZ2VuZXJhdGVkIGNvZGUuCiAgLy8gVE9ETyhhc2tlc2MpOiBSZW1vdmUgdGhpcyBhbmQgZGlyZWN0IGNhbGxlcnMgZGlyZWN0bHkgdG8gZm9ybWF0LgogIFN0cmluZyBmb3JtYXRXaXRob3V0TG9jYXRpb24oTWVzc2FnZSBtZXNzYWdlLCBTZXZlcml0eSBzZXZlcml0eSkgewogICAgcmV0dXJuIGNvbW1hbmRfbGluZV9yZXBvcnRpbmcuZm9ybWF0KG1lc3NhZ2Uud2l0aG91dExvY2F0aW9uKCksIHNldmVyaXR5KTsKICB9CgogIC8vIFRPRE8oYWhlKTogUmVtb3ZlIHRoaXMuCiAgdm9pZCBsb2dFcnJvcihPYmplY3QgbWVzc2FnZSwgU2V2ZXJpdHkgc2V2ZXJpdHkpIHsKICAgIGVycm9ycy5hZGQobWVzc2FnZSk7CiAgICBlcnJvcnMuYWRkKHNldmVyaXR5KTsKICB9CgogIHN0YXRpYyB2b2lkIHJlY29yZERlcGVuZGVuY3koVXJpIHVyaSkgewogICAgaWYgKHVyaS5zY2hlbWUgIT0gImZpbGUiKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJFeHBlY3RlZCBhIGZpbGUtVVJJLCBidXQgZ290OiAnJHVyaScuIik7CiAgICB9CiAgICBDb21waWxlckNvbnRleHQgY29udGV4dCA9IFpvbmUuY3VycmVudFtjb21waWxlckNvbnRleHRLZXldOwogICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgewogICAgICBjb250ZXh0LmRlcGVuZGVuY2llcy5hZGQodXJpKTsKICAgIH0KICB9CgogIHN0YXRpYyBDb21waWxlckNvbnRleHQgZ2V0IGN1cnJlbnQgewogICAgQ29tcGlsZXJDb250ZXh0IGNvbnRleHQgPSBab25lLmN1cnJlbnRbY29tcGlsZXJDb250ZXh0S2V5XTsKICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKICAgICAgLy8gTm90ZTogd2UgdGhyb3cgZGlyZWN0bHkgYW5kIGRvbid0IHVzZSBpbnRlcm5hbFByb2JsZW0sIGJlY2F1c2UKICAgICAgLy8gaW50ZXJuYWxQcm9ibGVtIGRlcGVuZHMgb24gaGF2aW5nIGEgY29tcGlsZXIgY29udGV4dCBhdmFpbGFibGUuCiAgICAgIHZhciBtZXNzYWdlID0gbWVzc2FnZUludGVybmFsUHJvYmxlbU1pc3NpbmdDb250ZXh0Lm1lc3NhZ2U7CiAgICAgIHZhciB0aXAgPSBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtTWlzc2luZ0NvbnRleHQudGlwOwogICAgICB0aHJvdyAiSW50ZXJuYWwgcHJvYmxlbTogJG1lc3NhZ2VcblRpcDogJHRpcCI7CiAgICB9CiAgICByZXR1cm4gY29udGV4dDsKICB9CgogIHN0YXRpYyBib29sIGdldCBpc0FjdGl2ZSA9PiBab25lLmN1cnJlbnRbY29tcGlsZXJDb250ZXh0S2V5XSAhPSBudWxsOwoKICAvLy8gUGVyZm9ybSBbYWN0aW9uXSBpbiBhIFtab25lXSB3aGVyZSBbdGhpc10gd2lsbCBiZSBhdmFpbGFibGUgYXMKICAvLy8gYENvbXBpbGVyQ29udGV4dC5jdXJyZW50YC4KICBGdXR1cmU8VD4gcnVuSW5Db250ZXh0PFQ+KEZ1dHVyZTxUPiBhY3Rpb24oQ29tcGlsZXJDb250ZXh0IGMpKSB7CiAgICByZXR1cm4gcnVuWm9uZWQoCiAgICAgICAgKCkgPT4gbmV3IEZ1dHVyZTxUPi5zeW5jKCgpID0+IGFjdGlvbih0aGlzKSkud2hlbkNvbXBsZXRlKGNsZWFyKSwKICAgICAgICB6b25lVmFsdWVzOiB7Y29tcGlsZXJDb250ZXh0S2V5OiB0aGlzfSk7CiAgfQoKICAvLy8gUGVyZm9ybSBbYWN0aW9uXSBpbiBhIFtab25lXSB3aGVyZSBbb3B0aW9uc10gd2lsbCBiZSBhdmFpbGFibGUgYXMKICAvLy8gYENvbXBpbGVyQ29udGV4dC5jdXJyZW50Lm9wdGlvbnNgLgogIHN0YXRpYyBGdXR1cmU8VD4gcnVuV2l0aE9wdGlvbnM8VD4oCiAgICAgIFByb2Nlc3NlZE9wdGlvbnMgb3B0aW9ucywgRnV0dXJlPFQ+IGFjdGlvbihDb21waWxlckNvbnRleHQgYyksCiAgICAgIHtib29sIGVycm9yT25NaXNzaW5nSW5wdXQ6IHRydWV9KSB7CiAgICByZXR1cm4gbmV3IENvbXBpbGVyQ29udGV4dChvcHRpb25zKQogICAgICAgIC5ydW5JbkNvbnRleHQ8VD4oKENvbXBpbGVyQ29udGV4dCBjKSBhc3luYyB7CiAgICAgIGF3YWl0IG9wdGlvbnMudmFsaWRhdGVPcHRpb25zKGVycm9yT25NaXNzaW5nSW5wdXQ6IGVycm9yT25NaXNzaW5nSW5wdXQpOwogICAgICByZXR1cm4gYWN0aW9uKGMpOwogICAgfSk7CiAgfQoKICBzdGF0aWMgRnV0dXJlPFQ+IHJ1bldpdGhEZWZhdWx0T3B0aW9uczxUPigKICAgICAgRnV0dXJlPFQ+IGFjdGlvbihDb21waWxlckNvbnRleHQgYykpIHsKICAgIHJldHVybiBuZXcgQ29tcGlsZXJDb250ZXh0KG5ldyBQcm9jZXNzZWRPcHRpb25zKCkpLnJ1bkluQ29udGV4dDxUPihhY3Rpb24pOwogIH0KCiAgc3RhdGljIGJvb2wgZ2V0IGVuYWJsZUNvbG9ycyB7CiAgICByZXR1cm4gY3VycmVudC5lbmFibGVDb2xvcnNDYWNoZWQgPz89IGNvbXB1dGVFbmFibGVDb2xvcnMoY3VycmVudCk7CiAgfQoKICB2b2lkIGNsZWFyKCkgewogICAgU3RyaW5nVG9rZW4uY2Fub25pY2FsaXplci5jbGVhcigpOwogICAgZXJyb3JzLmNsZWFyKCk7CiAgICBkZXBlbmRlbmNpZXMuY2xlYXIoKTsKICB9Cn0KgJoATk48ASABMQEuATwBPwEuAUABLwEaSAEmATABMQRGTwROKBhPT0EiASQGTkwQOAEdKgEqATMBIgEcASEBGSAEATU5KDkEATVGQzYEAVA9PQQBUEZFTwQBHTUZGgQBKiBIBkAbJQYEASdAG0hJQjo1BhQEAUgBRSFDFUoxBAFIKSZFKig1TxgIBAEtLVAEASFIBAERJxQaBAIBMXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9jb21waWxlcl9jb250ZXh0LmRhcnQ1c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2Zhc3RhX2NvZGVzLmRhcnSbLC8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmNvZGVzOwoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgSnNvbkVuY29kZXIsIGpzb247CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdyBDb25zdGFudCwgRGFydFR5cGUsIGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWU7CgppbXBvcnQgJy4uL2FwaV9wcm90b3R5cGUvZGlhZ25vc3RpY19tZXNzYWdlLmRhcnQnIHNob3cgRGlhZ25vc3RpY01lc3NhZ2U7CgppbXBvcnQgJy4uL3NjYW5uZXIvdG9rZW4uZGFydCcgc2hvdyBUb2tlbjsKCmltcG9ydCAna2VybmVsL3R5cGVfbGFiZWxlci5kYXJ0JzsKCmltcG9ydCAnc2V2ZXJpdHkuZGFydCcgc2hvdyBTZXZlcml0eTsKCmltcG9ydCAndXRpbC9yZWxhdGl2aXplLmRhcnQnIGFzIHV0aWwgc2hvdyByZWxhdGl2aXplVXJpOwoKcGFydCAnZmFzdGFfY29kZXNfZ2VuZXJhdGVkLmRhcnQnOwoKY29uc3QgaW50IG5vTGVuZ3RoID0gMTsKCmNsYXNzIENvZGU8VD4gewogIGZpbmFsIFN0cmluZyBuYW1lOwoKICAvLy8gVGhlIHVuaXF1ZSBwb3NpdGl2ZSBpbnRlZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvZGUsCiAgLy8vIG9yIGAtMWAgaWYgbm9uZS4gVGhpcyBpbmRleCBpcyB1c2VkIHdoZW4gdHJhbnNsYXRpbmcKICAvLy8gdGhpcyBlcnJvciB0byBpdHMgY29ycmVzcG9uZGluZyBBbmFseXplciBlcnJvci4KICBmaW5hbCBpbnQgaW5kZXg7CgogIGZpbmFsIFRlbXBsYXRlPFQ+IHRlbXBsYXRlOwoKICBmaW5hbCBMaXN0PFN0cmluZz4gYW5hbHl6ZXJDb2RlczsKCiAgZmluYWwgU2V2ZXJpdHkgc2V2ZXJpdHk7CgogIGNvbnN0IENvZGUodGhpcy5uYW1lLCB0aGlzLnRlbXBsYXRlLAogICAgICB7aW50IGluZGV4LCB0aGlzLmFuYWx5emVyQ29kZXMsIHRoaXMuc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yfSkKICAgICAgOiB0aGlzLmluZGV4ID0gaW5kZXggPz8gLTE7CgogIFN0cmluZyB0b1N0cmluZygpID0+IG5hbWU7Cn0KCmNsYXNzIE1lc3NhZ2UgewogIGZpbmFsIENvZGUgY29kZTsKCiAgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CgogIGZpbmFsIFN0cmluZyB0aXA7CgogIGZpbmFsIE1hcDxTdHJpbmcsIGR5bmFtaWM+IGFyZ3VtZW50czsKCiAgY29uc3QgTWVzc2FnZSh0aGlzLmNvZGUsIHt0aGlzLm1lc3NhZ2UsIHRoaXMudGlwLCB0aGlzLmFyZ3VtZW50c30pOwoKICBMb2NhdGVkTWVzc2FnZSB3aXRoTG9jYXRpb24oVXJpIHVyaSwgaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgTG9jYXRlZE1lc3NhZ2UodXJpLCBjaGFyT2Zmc2V0LCBsZW5ndGgsIHRoaXMpOwogIH0KCiAgTG9jYXRlZE1lc3NhZ2Ugd2l0aG91dExvY2F0aW9uKCkgewogICAgcmV0dXJuIG5ldyBMb2NhdGVkTWVzc2FnZShudWxsLCAtMSwgbm9MZW5ndGgsIHRoaXMpOwogIH0KfQoKY2xhc3MgTWVzc2FnZUNvZGUgZXh0ZW5kcyBDb2RlPE51bGw+IGltcGxlbWVudHMgTWVzc2FnZSB7CiAgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CgogIGZpbmFsIFN0cmluZyB0aXA7CgogIGNvbnN0IE1lc3NhZ2VDb2RlKFN0cmluZyBuYW1lLAogICAgICB7aW50IGluZGV4LAogICAgICBMaXN0PFN0cmluZz4gYW5hbHl6ZXJDb2RlcywKICAgICAgU2V2ZXJpdHkgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yLAogICAgICB0aGlzLm1lc3NhZ2UsCiAgICAgIHRoaXMudGlwfSkKICAgICAgOiBzdXBlcihuYW1lLCBudWxsLAogICAgICAgICAgICBpbmRleDogaW5kZXgsIGFuYWx5emVyQ29kZXM6IGFuYWx5emVyQ29kZXMsIHNldmVyaXR5OiBzZXZlcml0eSk7CgogIE1hcDxTdHJpbmcsIGR5bmFtaWM+IGdldCBhcmd1bWVudHMgPT4gY29uc3QgPFN0cmluZywgZHluYW1pYz57fTsKCiAgQ29kZSBnZXQgY29kZSA9PiB0aGlzOwoKICBAb3ZlcnJpZGUKICBMb2NhdGVkTWVzc2FnZSB3aXRoTG9jYXRpb24oVXJpIHVyaSwgaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgTG9jYXRlZE1lc3NhZ2UodXJpLCBjaGFyT2Zmc2V0LCBsZW5ndGgsIHRoaXMpOwogIH0KCiAgTG9jYXRlZE1lc3NhZ2Ugd2l0aG91dExvY2F0aW9uKCkgewogICAgcmV0dXJuIG5ldyBMb2NhdGVkTWVzc2FnZShudWxsLCAtMSwgbm9MZW5ndGgsIHRoaXMpOwogIH0KfQoKY2xhc3MgVGVtcGxhdGU8VD4gewogIGZpbmFsIFN0cmluZyBtZXNzYWdlVGVtcGxhdGU7CgogIGZpbmFsIFN0cmluZyB0aXBUZW1wbGF0ZTsKCiAgZmluYWwgVCB3aXRoQXJndW1lbnRzOwoKICBjb25zdCBUZW1wbGF0ZSh7dGhpcy5tZXNzYWdlVGVtcGxhdGUsIHRoaXMudGlwVGVtcGxhdGUsIHRoaXMud2l0aEFyZ3VtZW50c30pOwp9CgpjbGFzcyBMb2NhdGVkTWVzc2FnZSBpbXBsZW1lbnRzIENvbXBhcmFibGU8TG9jYXRlZE1lc3NhZ2U+IHsKICBmaW5hbCBVcmkgdXJpOwoKICBmaW5hbCBpbnQgY2hhck9mZnNldDsKCiAgZmluYWwgaW50IGxlbmd0aDsKCiAgZmluYWwgTWVzc2FnZSBtZXNzYWdlT2JqZWN0OwoKICBjb25zdCBMb2NhdGVkTWVzc2FnZSgKICAgICAgdGhpcy51cmksIHRoaXMuY2hhck9mZnNldCwgdGhpcy5sZW5ndGgsIHRoaXMubWVzc2FnZU9iamVjdCk7CgogIENvZGUgZ2V0IGNvZGUgPT4gbWVzc2FnZU9iamVjdC5jb2RlOwoKICBTdHJpbmcgZ2V0IG1lc3NhZ2UgPT4gbWVzc2FnZU9iamVjdC5tZXNzYWdlOwoKICBTdHJpbmcgZ2V0IHRpcCA9PiBtZXNzYWdlT2JqZWN0LnRpcDsKCiAgTWFwPFN0cmluZywgZHluYW1pYz4gZ2V0IGFyZ3VtZW50cyA9PiBtZXNzYWdlT2JqZWN0LmFyZ3VtZW50czsKCiAgaW50IGNvbXBhcmVUbyhMb2NhdGVkTWVzc2FnZSBvdGhlcikgewogICAgaW50IHJlc3VsdCA9ICIke3VyaX0iLmNvbXBhcmVUbygiJHtvdGhlci51cml9Iik7CiAgICBpZiAocmVzdWx0ICE9IDApIHJldHVybiByZXN1bHQ7CiAgICByZXN1bHQgPSBjaGFyT2Zmc2V0LmNvbXBhcmVUbyhvdGhlci5jaGFyT2Zmc2V0KTsKICAgIGlmIChyZXN1bHQgIT0gMCkgcmV0dXJuIHJlc3VsdDsKICAgIHJldHVybiBtZXNzYWdlLmNvbXBhcmVUbyhtZXNzYWdlKTsKICB9CgogIEZvcm1hdHRlZE1lc3NhZ2Ugd2l0aEZvcm1hdHRpbmcoU3RyaW5nIGZvcm1hdHRlZCwgaW50IGxpbmUsIGludCBjb2x1bW4sCiAgICAgIFNldmVyaXR5IHNldmVyaXR5LCBMaXN0PEZvcm1hdHRlZE1lc3NhZ2U+IHJlbGF0ZWRJbmZvcm1hdGlvbikgewogICAgcmV0dXJuIG5ldyBGb3JtYXR0ZWRNZXNzYWdlKAogICAgICAgIHRoaXMsIGZvcm1hdHRlZCwgbGluZSwgY29sdW1uLCBzZXZlcml0eSwgcmVsYXRlZEluZm9ybWF0aW9uKTsKICB9Cn0KCmNsYXNzIEZvcm1hdHRlZE1lc3NhZ2UgaW1wbGVtZW50cyBEaWFnbm9zdGljTWVzc2FnZSB7CiAgZmluYWwgTG9jYXRlZE1lc3NhZ2UgbG9jYXRlZE1lc3NhZ2U7CgogIGZpbmFsIFN0cmluZyBmb3JtYXR0ZWQ7CgogIGZpbmFsIGludCBsaW5lOwoKICBmaW5hbCBpbnQgY29sdW1uOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTZXZlcml0eSBzZXZlcml0eTsKCiAgZmluYWwgTGlzdDxGb3JtYXR0ZWRNZXNzYWdlPiByZWxhdGVkSW5mb3JtYXRpb247CgogIGNvbnN0IEZvcm1hdHRlZE1lc3NhZ2UodGhpcy5sb2NhdGVkTWVzc2FnZSwgdGhpcy5mb3JtYXR0ZWQsIHRoaXMubGluZSwKICAgICAgdGhpcy5jb2x1bW4sIHRoaXMuc2V2ZXJpdHksIHRoaXMucmVsYXRlZEluZm9ybWF0aW9uKTsKCiAgQ29kZSBnZXQgY29kZSA9PiBsb2NhdGVkTWVzc2FnZS5jb2RlOwoKICBTdHJpbmcgZ2V0IG1lc3NhZ2UgPT4gbG9jYXRlZE1lc3NhZ2UubWVzc2FnZTsKCiAgU3RyaW5nIGdldCB0aXAgPT4gbG9jYXRlZE1lc3NhZ2UudGlwOwoKICBNYXA8U3RyaW5nLCBkeW5hbWljPiBnZXQgYXJndW1lbnRzID0+IGxvY2F0ZWRNZXNzYWdlLmFyZ3VtZW50czsKCiAgVXJpIGdldCB1cmkgPT4gbG9jYXRlZE1lc3NhZ2UudXJpOwoKICBpbnQgZ2V0IGNoYXJPZmZzZXQgPT4gbG9jYXRlZE1lc3NhZ2UuY2hhck9mZnNldDsKCiAgaW50IGdldCBsZW5ndGggPT4gbG9jYXRlZE1lc3NhZ2UubGVuZ3RoOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxTdHJpbmc+IGdldCBhbnNpRm9ybWF0dGVkIHN5bmMqIHsKICAgIHlpZWxkIGZvcm1hdHRlZDsKICAgIGlmIChyZWxhdGVkSW5mb3JtYXRpb24gIT0gbnVsbCkgewogICAgICBmb3IgKEZvcm1hdHRlZE1lc3NhZ2UgbSBpbiByZWxhdGVkSW5mb3JtYXRpb24pIHsKICAgICAgICB5aWVsZCBtLmZvcm1hdHRlZDsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8U3RyaW5nPiBnZXQgcGxhaW5UZXh0Rm9ybWF0dGVkIHsKICAgIC8vIFRPRE8oYWhlKTogSW1wbGVtZW50IHRoaXMgY29ycmVjdGx5LgogICAgcmV0dXJuIGFuc2lGb3JtYXR0ZWQ7CiAgfQoKICBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvSnNvbigpIHsKICAgIC8vIFRoaXMgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIHBhY2thZ2U6a2VybmVsL3Byb2JsZW1zLm1kCiAgICByZXR1cm4gPFN0cmluZywgT2JqZWN0PnsKICAgICAgImFuc2lGb3JtYXR0ZWQiOiBhbnNpRm9ybWF0dGVkLnRvTGlzdCgpLAogICAgICAicGxhaW5UZXh0Rm9ybWF0dGVkIjogcGxhaW5UZXh0Rm9ybWF0dGVkLnRvTGlzdCgpLAogICAgICAic2V2ZXJpdHkiOiBzZXZlcml0eS5pbmRleCwKICAgICAgInVyaSI6IHVyaS50b1N0cmluZygpLAogICAgfTsKICB9CgogIFN0cmluZyB0b0pzb25TdHJpbmcoKSB7CiAgICBKc29uRW5jb2RlciBlbmNvZGVyID0gbmV3IEpzb25FbmNvZGVyLndpdGhJbmRlbnQoIiAgIik7CiAgICByZXR1cm4gZW5jb2Rlci5jb252ZXJ0KHRoaXMpOwogIH0KfQoKY2xhc3MgRGlhZ25vc3RpY01lc3NhZ2VGcm9tSnNvbiBpbXBsZW1lbnRzIERpYWdub3N0aWNNZXNzYWdlIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IGFuc2lGb3JtYXR0ZWQ7CgogIEBvdmVycmlkZQogIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gcGxhaW5UZXh0Rm9ybWF0dGVkOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTZXZlcml0eSBzZXZlcml0eTsKCiAgZmluYWwgVXJpIHVyaTsKCiAgRGlhZ25vc3RpY01lc3NhZ2VGcm9tSnNvbigKICAgICAgdGhpcy5hbnNpRm9ybWF0dGVkLCB0aGlzLnBsYWluVGV4dEZvcm1hdHRlZCwgdGhpcy5zZXZlcml0eSwgdGhpcy51cmkpOwoKICBmYWN0b3J5IERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24uZnJvbUpzb24oU3RyaW5nIGpzb25TdHJpbmcpIHsKICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gZGVjb2RlZCA9IGpzb24uZGVjb2RlKGpzb25TdHJpbmcpOwogICAgTGlzdDxTdHJpbmc+IGFuc2lGb3JtYXR0ZWQgPQogICAgICAgIG5ldyBMaXN0PFN0cmluZz4uZnJvbShkZWNvZGVkWyJhbnNpRm9ybWF0dGVkIl0pOwogICAgTGlzdDxTdHJpbmc+IHBsYWluVGV4dEZvcm1hdHRlZCA9CiAgICAgICAgbmV3IExpc3Q8U3RyaW5nPi5mcm9tKGRlY29kZWRbInBsYWluVGV4dEZvcm1hdHRlZCJdKTsKICAgIFNldmVyaXR5IHNldmVyaXR5ID0gU2V2ZXJpdHkudmFsdWVzW2RlY29kZWRbInNldmVyaXR5Il1dOwogICAgVXJpIHVyaSA9IFVyaS5wYXJzZShkZWNvZGVkWyJ1cmkiXSk7CgogICAgcmV0dXJuIG5ldyBEaWFnbm9zdGljTWVzc2FnZUZyb21Kc29uKAogICAgICAgIGFuc2lGb3JtYXR0ZWQsIHBsYWluVGV4dEZvcm1hdHRlZCwgc2V2ZXJpdHksIHVyaSk7CiAgfQoKICBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvSnNvbigpIHsKICAgIC8vIFRoaXMgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIHBhY2thZ2U6a2VybmVsL3Byb2JsZW1zLm1kCiAgICByZXR1cm4gPFN0cmluZywgT2JqZWN0PnsKICAgICAgImFuc2lGb3JtYXR0ZWQiOiBhbnNpRm9ybWF0dGVkLnRvTGlzdCgpLAogICAgICAicGxhaW5UZXh0Rm9ybWF0dGVkIjogcGxhaW5UZXh0Rm9ybWF0dGVkLnRvTGlzdCgpLAogICAgICAic2V2ZXJpdHkiOiBzZXZlcml0eS5pbmRleCwKICAgICAgInVyaSI6IHVyaS50b1N0cmluZygpLAogICAgfTsKICB9CgogIFN0cmluZyB0b0pzb25TdHJpbmcoKSB7CiAgICBKc29uRW5jb2RlciBlbmNvZGVyID0gbmV3IEpzb25FbmNvZGVyLndpdGhJbmRlbnQoIiAgIik7CiAgICByZXR1cm4gZW5jb2Rlci5jb252ZXJ0KHRoaXMpOwogIH0KfQoKU3RyaW5nIHJlbGF0aXZpemVVcmkoVXJpIHVyaSkgewogIC8vIFdlIGhhdmUgdGhpcyBtZXRob2QgaGVyZSBmb3IgdHdvIHJlYXNvbnM6CiAgLy8KICAvLyAxLiBJdCBhbGxvd3MgdXMgdG8gaW1wbGVtZW50ICN1cmkgbWVzc2FnZSBhcmd1bWVudCB3aXRob3V0IHVzaW5nIGl0CiAgLy8gKG90aGVyd2lzZSwgd2UgbWlnaHQgZ2V0IGFuIGBVTlVTRURfSU1QT1JUYCB3YXJuaW5nKS4KICAvLwogIC8vIDIuIFdlIGNhbiBjaGFuZ2UgYGJhc2VgIGFyZ3VtZW50IGhlcmUgaWYgbmVlZGVkLgogIHJldHVybiB1dGlsLnJlbGF0aXZpemVVcmkodXJpLCBiYXNlOiBVcmkuYmFzZSk7Cn0KCnR5cGVkZWYgU3VtbWFyeVRlbXBsYXRlID0gTWVzc2FnZSBGdW5jdGlvbihpbnQsIGludCwgbnVtLCBudW0sIG51bSk7CgpTdHJpbmcgaXRlbWl6ZU5hbWVzKExpc3Q8U3RyaW5nPiBuYW1lcykgewogIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGggLSAxOyBpKyspIHsKICAgIGJ1ZmZlci53cml0ZSgiIC0gIik7CiAgICBidWZmZXIud3JpdGVsbihuYW1lc1tpXSk7CiAgfQogIGJ1ZmZlci53cml0ZSgiIC0gIik7CiAgYnVmZmVyLndyaXRlKG5hbWVzLmxhc3QpOwogIHJldHVybiAiJGJ1ZmZlciI7Cn0KgQ4ATk48ARUBLgEhOwFKASsBIwEmAToBIwEYARAVAT07NhMBHgEkARsBJ0YiAR0CARATARgBFAEoAUYBRT4EASU5BAIBOhgBFAEhEiIpFBEaTQFDARkBDEU+BAElOQQCARQgARwBGQFQAgE9EQEYARQBHwEYQwEnAS8BJwFBASg1JDUkJwQBSkYhRgQCATYnARoBEgEUAQwbATMBSTwBKAEwASgBQgElATMBKwEMLRUmNxsIBgQBDCwsGgQBIUMdLzkiHQcEARo8IgQCAT8MKAEMLQEMGwERAR1NAUI7ITkmPj4pASo7BAEhQx0vOSIdBwQBGjwiBAIBIC8FSTsFNjICAUUBKiwvGR4EFxwUAgEscGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2Zhc3RhX2NvZGVzLmRhcnQ/c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2Zhc3RhX2NvZGVzX2dlbmVyYXRlZC5kYXJ0wAas8S8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBOT1RFOiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBETyBOT1QgRURJVC4KLy8KLy8gSW5zdGVhZCBtb2RpZnkgJ3BrZy9mcm9udF9lbmQvbWVzc2FnZXMueWFtbCcgYW5kIHJ1bgovLyAncGtnL2Zyb250X2VuZC90b29sL2Zhc3RhIGdlbmVyYXRlLW1lc3NhZ2VzJyB0byB1cGRhdGUuCgpwYXJ0IG9mIGZhc3RhLmNvZGVzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUaGUgY2xhc3MgJyNuYW1lJyBpcyBhYnN0cmFjdCBhbmQgY2FuJ3QgYmUgaW5zdGFudGlhdGVkLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0Fic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb24iLCB0ZW1wbGF0ZUFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJORVdfV0lUSF9BQlNUUkFDVF9DTEFTUyJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0Fic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb24sCiAgICAgIG1lc3NhZ2U6ICIiIlRoZSBjbGFzcyAnJHtuYW1lfScgaXMgYWJzdHJhY3QgYW5kIGNhbid0IGJlIGluc3RhbnRpYXRlZC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVBYnN0cmFjdENsYXNzTWVtYmVyID0gbWVzc2FnZUFic3RyYWN0Q2xhc3NNZW1iZXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQWJzdHJhY3RDbGFzc01lbWJlciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkFic3RyYWN0Q2xhc3NNZW1iZXIiLAogICAgaW5kZXg6IDUxLAogICAgbWVzc2FnZTogciIiIk1lbWJlcnMgb2YgY2xhc3NlcyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSAnYWJzdHJhY3QnLiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiVHJ5IHJlbW92aW5nIHRoZSAnYWJzdHJhY3QnIGtleXdvcmQuIFlvdSBjYW4gYWRkIHRoZSAnYWJzdHJhY3QnIGtleXdvcmQgYmVmb3JlIHRoZSBjbGFzcyBkZWNsYXJhdGlvbi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQWJzdHJhY3ROb3RTeW5jID0gbWVzc2FnZUFic3RyYWN0Tm90U3luYzsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VBYnN0cmFjdE5vdFN5bmMgPSBjb25zdCBNZXNzYWdlQ29kZSgiQWJzdHJhY3ROb3RTeW5jIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJOT05fU1lOQ19BQlNUUkFDVF9NRVRIT0QiXSwKICAgIG1lc3NhZ2U6IHIiIiJBYnN0cmFjdCBtZXRob2RzIGNhbid0IHVzZSAnYXN5bmMnLCAnYXN5bmMqJywgb3IgJ3N5bmMqJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lKT4gdGVtcGxhdGVBYnN0cmFjdFJlZGlyZWN0ZWRDbGFzc0luc3RhbnRpYXRpb24gPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkZhY3RvcnkgcmVkaXJlY3RzIHRvIGNsYXNzICcjbmFtZScsIHdoaWNoIGlzIGFic3RyYWN0IGFuZCBjYW4ndCBiZSBpbnN0YW50aWF0ZWQuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNBYnN0cmFjdFJlZGlyZWN0ZWRDbGFzc0luc3RhbnRpYXRpb24pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIGNvZGVBYnN0cmFjdFJlZGlyZWN0ZWRDbGFzc0luc3RhbnRpYXRpb24gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkFic3RyYWN0UmVkaXJlY3RlZENsYXNzSW5zdGFudGlhdGlvbiIsCiAgICAgICAgdGVtcGxhdGVBYnN0cmFjdFJlZGlyZWN0ZWRDbGFzc0luc3RhbnRpYXRpb24sCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkZBQ1RPUllfUkVESVJFQ1RTX1RPX0FCU1RSQUNUX0NMQVNTIl0sCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQWJzdHJhY3RSZWRpcmVjdGVkQ2xhc3NJbnN0YW50aWF0aW9uKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQWJzdHJhY3RSZWRpcmVjdGVkQ2xhc3NJbnN0YW50aWF0aW9uLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiRmFjdG9yeSByZWRpcmVjdHMgdG8gY2xhc3MgJyR7bmFtZX0nLCB3aGljaCBpcyBhYnN0cmFjdCBhbmQgY2FuJ3QgYmUgaW5zdGFudGlhdGVkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUFjY2Vzc0Vycm9yID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJBY2Nlc3MgZXJyb3I6ICcjbmFtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQWNjZXNzRXJyb3IpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUFjY2Vzc0Vycm9yID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICJBY2Nlc3NFcnJvciIsCiAgdGVtcGxhdGVBY2Nlc3NFcnJvciwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNBY2Nlc3NFcnJvcihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUFjY2Vzc0Vycm9yLAogICAgICBtZXNzYWdlOiAiIiJBY2Nlc3MgZXJyb3I6ICcke25hbWV9Jy4iIiIsIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4KICAgIHRlbXBsYXRlQW1iaWd1b3VzU3VwZXJ0eXBlcyA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiJyNuYW1lJyBjYW4ndCBpbXBsZW1lbnQgYm90aCAnI3R5cGUnIGFuZCAnI3R5cGUyJyIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0FtYmlndW91c1N1cGVydHlwZXMpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4KICAgIGNvZGVBbWJpZ3VvdXNTdXBlcnR5cGVzID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgICAgICJBbWJpZ3VvdXNTdXBlcnR5cGVzIiwgdGVtcGxhdGVBbWJpZ3VvdXNTdXBlcnR5cGVzLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJBTUJJR1VPVVNfU1VQRVJUWVBFUyJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNBbWJpZ3VvdXNTdXBlcnR5cGVzKAogICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUFtYmlndW91c1N1cGVydHlwZXMsCiAgICAgIG1lc3NhZ2U6ICIiIicke25hbWV9JyBjYW4ndCBpbXBsZW1lbnQgYm90aCAnJHt0eXBlfScgYW5kICcke3R5cGUyfSciIiIgKwogICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAndHlwZSc6IF90eXBlLCAndHlwZTInOiBfdHlwZTJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQW5vbnltb3VzQnJlYWtUYXJnZXRPdXRzaWRlRnVuY3Rpb24gPQogICAgbWVzc2FnZUFub255bW91c0JyZWFrVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUFub255bW91c0JyZWFrVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJBbm9ueW1vdXNCcmVha1RhcmdldE91dHNpZGVGdW5jdGlvbiIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkxBQkVMX0lOX09VVEVSX1NDT1BFIl0sCiAgICAgICAgbWVzc2FnZTogciIiIkNhbid0IGJyZWFrIHRvIGEgdGFyZ2V0IGluIGEgZGlmZmVyZW50IGZ1bmN0aW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVBbm9ueW1vdXNDb250aW51ZVRhcmdldE91dHNpZGVGdW5jdGlvbiA9CiAgICBtZXNzYWdlQW5vbnltb3VzQ29udGludWVUYXJnZXRPdXRzaWRlRnVuY3Rpb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQW5vbnltb3VzQ29udGludWVUYXJnZXRPdXRzaWRlRnVuY3Rpb24gPQogICAgY29uc3QgTWVzc2FnZUNvZGUoIkFub255bW91c0NvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uIiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTEFCRUxfSU5fT1VURVJfU0NPUEUiXSwKICAgICAgICBtZXNzYWdlOiByIiIiQ2FuJ3QgY29udGludWUgYXQgYSB0YXJnZXQgaW4gYSBkaWZmZXJlbnQgZnVuY3Rpb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZQogICAgICAgICAgICBfdHlwZTIpPiB0ZW1wbGF0ZUFyZ3VtZW50VHlwZU5vdEFzc2lnbmFibGUgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIGFyZ3VtZW50IHR5cGUgJyN0eXBlJyBjYW4ndCBiZSBhc3NpZ25lZCB0byB0aGUgcGFyYW1ldGVyIHR5cGUgJyN0eXBlMicuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBjaGFuZ2luZyB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyLCBvciBjYXN0aW5nIHRoZSBhcmd1bWVudCB0byAnI3R5cGUyJy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0FyZ3VtZW50VHlwZU5vdEFzc2lnbmFibGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZUFyZ3VtZW50VHlwZU5vdEFzc2lnbmFibGUgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPigKICAgICAgICAiQXJndW1lbnRUeXBlTm90QXNzaWduYWJsZSIsIHRlbXBsYXRlQXJndW1lbnRUeXBlTm90QXNzaWduYWJsZSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQVJHVU1FTlRfVFlQRV9OT1RfQVNTSUdOQUJMRSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNBcmd1bWVudFR5cGVOb3RBc3NpZ25hYmxlKAogICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMikgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVBcmd1bWVudFR5cGVOb3RBc3NpZ25hYmxlLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIGFyZ3VtZW50IHR5cGUgJyR7dHlwZX0nIGNhbid0IGJlIGFzc2lnbmVkIHRvIHRoZSBwYXJhbWV0ZXIgdHlwZSAnJHt0eXBlMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOiAiIiJUcnkgY2hhbmdpbmcgdGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlciwgb3IgY2FzdGluZyB0aGUgYXJndW1lbnQgdG8gJyR7dHlwZTJ9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgaW50CiAgICAgICAgICAgIGNvZGVQb2ludCk+IHRlbXBsYXRlQXNjaWlDb250cm9sQ2hhcmFjdGVyID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihpbnQgY29kZVBvaW50KT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBjb250cm9sIGNoYXJhY3RlciAjdW5pY29kZSBjYW4gb25seSBiZSB1c2VkIGluIHN0cmluZ3MgYW5kIGNvbW1lbnRzLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQXNjaWlDb250cm9sQ2hhcmFjdGVyKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihpbnQgY29kZVBvaW50KT4gY29kZUFzY2lpQ29udHJvbENoYXJhY3RlciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oaW50IGNvZGVQb2ludCk+KAogICAgICAgICJBc2NpaUNvbnRyb2xDaGFyYWN0ZXIiLCB0ZW1wbGF0ZUFzY2lpQ29udHJvbENoYXJhY3RlciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSUxMRUdBTF9DSEFSQUNURVIiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQXNjaWlDb250cm9sQ2hhcmFjdGVyKGludCBjb2RlUG9pbnQpIHsKICBTdHJpbmcgdW5pY29kZSA9CiAgICAgICJVKyR7Y29kZVBvaW50LnRvUmFkaXhTdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkucGFkTGVmdCg0LCAnMCcpfSI7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVBc2NpaUNvbnRyb2xDaGFyYWN0ZXIsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgY29udHJvbCBjaGFyYWN0ZXIgJHt1bmljb2RlfSBjYW4gb25seSBiZSB1c2VkIGluIHN0cmluZ3MgYW5kIGNvbW1lbnRzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J2NvZGVQb2ludCc6IGNvZGVQb2ludH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVBc3NlcnRBc0V4cHJlc3Npb24gPSBtZXNzYWdlQXNzZXJ0QXNFeHByZXNzaW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUFzc2VydEFzRXhwcmVzc2lvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkFzc2VydEFzRXhwcmVzc2lvbiIsCiAgICBtZXNzYWdlOiByIiIiYGFzc2VydGAgY2FuJ3QgYmUgdXNlZCBhcyBhbiBleHByZXNzaW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVBc3NlcnRFeHRyYW5lb3VzQXJndW1lbnQgPSBtZXNzYWdlQXNzZXJ0RXh0cmFuZW91c0FyZ3VtZW50OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUFzc2VydEV4dHJhbmVvdXNBcmd1bWVudCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkFzc2VydEV4dHJhbmVvdXNBcmd1bWVudCIsCiAgICBtZXNzYWdlOiByIiIiYGFzc2VydGAgY2FuJ3QgaGF2ZSBtb3JlIHRoYW4gdHdvIGFyZ3VtZW50cy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQXN5bmNBc0lkZW50aWZpZXIgPSBtZXNzYWdlQXN5bmNBc0lkZW50aWZpZXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQXN5bmNBc0lkZW50aWZpZXIgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJBc3luY0FzSWRlbnRpZmllciIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQVNZTkNfS0VZV09SRF9VU0VEX0FTX0lERU5USUZJRVIiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIidhc3luYycgY2FuJ3QgYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyIGluICdhc3luYycsICdhc3luYyonLCBvciAnc3luYyonIG1ldGhvZHMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUF3YWl0QXNJZGVudGlmaWVyID0gbWVzc2FnZUF3YWl0QXNJZGVudGlmaWVyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUF3YWl0QXNJZGVudGlmaWVyID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQXdhaXRBc0lkZW50aWZpZXIiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkFTWU5DX0tFWVdPUkRfVVNFRF9BU19JREVOVElGSUVSIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiInYXdhaXQnIGNhbid0IGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBpbiAnYXN5bmMnLCAnYXN5bmMqJywgb3IgJ3N5bmMqJyBtZXRob2RzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVBd2FpdEZvck5vdEFzeW5jID0gbWVzc2FnZUF3YWl0Rm9yTm90QXN5bmM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQXdhaXRGb3JOb3RBc3luYyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkF3YWl0Rm9yTm90QXN5bmMiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkFTWU5DX0ZPUl9JTl9XUk9OR19DT05URVhUIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJUaGUgYXN5bmNocm9ub3VzIGZvci1pbiBjYW4gb25seSBiZSB1c2VkIGluIGZ1bmN0aW9ucyBtYXJrZWQgd2l0aCAnYXN5bmMnIG9yICdhc3luYyonLiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiVHJ5IG1hcmtpbmcgdGhlIGZ1bmN0aW9uIGJvZHkgd2l0aCBlaXRoZXIgJ2FzeW5jJyBvciAnYXN5bmMqJywgb3IgcmVtb3ZpbmcgdGhlICdhd2FpdCcgYmVmb3JlIHRoZSBmb3IgbG9vcC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQXdhaXROb3RBc3luYyA9IG1lc3NhZ2VBd2FpdE5vdEFzeW5jOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUF3YWl0Tm90QXN5bmMgPSBjb25zdCBNZXNzYWdlQ29kZSgiQXdhaXROb3RBc3luYyIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQVdBSVRfSU5fV1JPTkdfQ09OVEVYVCJdLAogICAgbWVzc2FnZTogciIiIidhd2FpdCcgY2FuIG9ubHkgYmUgdXNlZCBpbiAnYXN5bmMnIG9yICdhc3luYyonIG1ldGhvZHMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZTIpPiB0ZW1wbGF0ZUJvdW5kSXNzdWVWaWFDeWNsZU5vblNpbXBsaWNpdHkgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLAogICAgICAgICAgICBTdHJpbmcgbmFtZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiR2VuZXJpYyB0eXBlICcjbmFtZScgY2FuJ3QgYmUgdXNlZCB3aXRob3V0IHR5cGUgYXJndW1lbnRzIGluIHRoZSBib3VuZHMgb2YgaXRzIG93biB0eXBlIHZhcmlhYmxlcy4gSXQgaXMgcmVmZXJlbmNlZCBpbmRpcmVjdGx5IHRocm91Z2ggJyNuYW1lMicuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBwcm92aWRpbmcgdHlwZSBhcmd1bWVudHMgdG8gJyNuYW1lMicgaGVyZSBvciB0byBzb21lIG90aGVyIHJhdyB0eXBlcyBpbiB0aGUgYm91bmRzIGFsb25nIHRoZSByZWZlcmVuY2UgY2hhaW4uIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNCb3VuZElzc3VlVmlhQ3ljbGVOb25TaW1wbGljaXR5KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4KICAgIGNvZGVCb3VuZElzc3VlVmlhQ3ljbGVOb25TaW1wbGljaXR5ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICAgICAgIkJvdW5kSXNzdWVWaWFDeWNsZU5vblNpbXBsaWNpdHkiLAogICAgICAgIHRlbXBsYXRlQm91bmRJc3N1ZVZpYUN5Y2xlTm9uU2ltcGxpY2l0eSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9UX0lOU1RBTlRJQVRFRF9CT1VORCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNCb3VuZElzc3VlVmlhQ3ljbGVOb25TaW1wbGljaXR5KAogICAgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMikgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVCb3VuZElzc3VlVmlhQ3ljbGVOb25TaW1wbGljaXR5LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiR2VuZXJpYyB0eXBlICcke25hbWV9JyBjYW4ndCBiZSB1c2VkIHdpdGhvdXQgdHlwZSBhcmd1bWVudHMgaW4gdGhlIGJvdW5kcyBvZiBpdHMgb3duIHR5cGUgdmFyaWFibGVzLiBJdCBpcyByZWZlcmVuY2VkIGluZGlyZWN0bHkgdGhyb3VnaCAnJHtuYW1lMn0nLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgcHJvdmlkaW5nIHR5cGUgYXJndW1lbnRzIHRvICcke25hbWUyfScgaGVyZSBvciB0byBzb21lIG90aGVyIHJhdyB0eXBlcyBpbiB0aGUgYm91bmRzIGFsb25nIHRoZSByZWZlcmVuY2UgY2hhaW4uIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICduYW1lMic6IG5hbWUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlQm91bmRJc3N1ZVZpYUxvb3BOb25TaW1wbGljaXR5ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJHZW5lcmljIHR5cGUgJyNuYW1lJyBjYW4ndCBiZSB1c2VkIHdpdGhvdXQgdHlwZSBhcmd1bWVudHMgaW4gdGhlIGJvdW5kcyBvZiBpdHMgb3duIHR5cGUgdmFyaWFibGVzLiIiIiwKICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IHByb3ZpZGluZyB0eXBlIGFyZ3VtZW50cyB0byAnI25hbWUnIGhlcmUuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNCb3VuZElzc3VlVmlhTG9vcE5vblNpbXBsaWNpdHkpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUJvdW5kSXNzdWVWaWFMb29wTm9uU2ltcGxpY2l0eSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigiQm91bmRJc3N1ZVZpYUxvb3BOb25TaW1wbGljaXR5IiwKICAgICAgICB0ZW1wbGF0ZUJvdW5kSXNzdWVWaWFMb29wTm9uU2ltcGxpY2l0eSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9UX0lOU1RBTlRJQVRFRF9CT1VORCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNCb3VuZElzc3VlVmlhTG9vcE5vblNpbXBsaWNpdHkoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVCb3VuZElzc3VlVmlhTG9vcE5vblNpbXBsaWNpdHksCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJHZW5lcmljIHR5cGUgJyR7bmFtZX0nIGNhbid0IGJlIHVzZWQgd2l0aG91dCB0eXBlIGFyZ3VtZW50cyBpbiB0aGUgYm91bmRzIG9mIGl0cyBvd24gdHlwZSB2YXJpYWJsZXMuIiIiLAogICAgICB0aXA6ICIiIlRyeSBwcm92aWRpbmcgdHlwZSBhcmd1bWVudHMgdG8gJyR7bmFtZX0nIGhlcmUuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUJvdW5kSXNzdWVWaWFSYXdUeXBlV2l0aE5vblNpbXBsZUJvdW5kcyA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiR2VuZXJpYyB0eXBlICcjbmFtZScgY2FuJ3QgYmUgdXNlZCB3aXRob3V0IHR5cGUgYXJndW1lbnRzIGluIGEgdHlwZSB2YXJpYWJsZSBib3VuZC4iIiIsCiAgICAgICAgdGlwVGVtcGxhdGU6IHIiIiJUcnkgcHJvdmlkaW5nIHR5cGUgYXJndW1lbnRzIHRvICcjbmFtZScgaGVyZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNCb3VuZElzc3VlVmlhUmF3VHlwZVdpdGhOb25TaW1wbGVCb3VuZHMpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIGNvZGVCb3VuZElzc3VlVmlhUmF3VHlwZVdpdGhOb25TaW1wbGVCb3VuZHMgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkJvdW5kSXNzdWVWaWFSYXdUeXBlV2l0aE5vblNpbXBsZUJvdW5kcyIsCiAgICAgICAgdGVtcGxhdGVCb3VuZElzc3VlVmlhUmF3VHlwZVdpdGhOb25TaW1wbGVCb3VuZHMsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PVF9JTlNUQU5USUFURURfQk9VTkQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQm91bmRJc3N1ZVZpYVJhd1R5cGVXaXRoTm9uU2ltcGxlQm91bmRzKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQm91bmRJc3N1ZVZpYVJhd1R5cGVXaXRoTm9uU2ltcGxlQm91bmRzLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiR2VuZXJpYyB0eXBlICcke25hbWV9JyBjYW4ndCBiZSB1c2VkIHdpdGhvdXQgdHlwZSBhcmd1bWVudHMgaW4gYSB0eXBlIHZhcmlhYmxlIGJvdW5kLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgcHJvdmlkaW5nIHR5cGUgYXJndW1lbnRzIHRvICcke25hbWV9JyBoZXJlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUJyZWFrT3V0c2lkZU9mTG9vcCA9IG1lc3NhZ2VCcmVha091dHNpZGVPZkxvb3A7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQnJlYWtPdXRzaWRlT2ZMb29wID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQnJlYWtPdXRzaWRlT2ZMb29wIiwKICAgIGluZGV4OiA1MiwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkEgYnJlYWsgc3RhdGVtZW50IGNhbid0IGJlIHVzZWQgb3V0c2lkZSBvZiBhIGxvb3Agb3Igc3dpdGNoIHN0YXRlbWVudC4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGJyZWFrIHN0YXRlbWVudC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUJyZWFrVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDYW4ndCBicmVhayB0byAnI25hbWUnIGluIGEgZGlmZmVyZW50IGZ1bmN0aW9uLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0JyZWFrVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVCcmVha1RhcmdldE91dHNpZGVGdW5jdGlvbiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQnJlYWtUYXJnZXRPdXRzaWRlRnVuY3Rpb24iLCB0ZW1wbGF0ZUJyZWFrVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJMQUJFTF9JTl9PVVRFUl9TQ09QRSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNCcmVha1RhcmdldE91dHNpZGVGdW5jdGlvbihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUJyZWFrVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uLAogICAgICBtZXNzYWdlOiAiIiJDYW4ndCBicmVhayB0byAnJHtuYW1lfScgaW4gYSBkaWZmZXJlbnQgZnVuY3Rpb24uIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IHRlbXBsYXRlQnVpbHRJbklkZW50aWZpZXJBc1R5cGUgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlRoZSBidWlsdC1pbiBpZGVudGlmaWVyICcjbGV4ZW1lJyBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZS4iIiIsCiAgICAgICAgdGlwVGVtcGxhdGU6IHIiIiJUcnkgY29ycmVjdGluZyB0aGUgbmFtZSB0byBtYXRjaCBhbiBleGlzdGluZyB0eXBlLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0J1aWx0SW5JZGVudGlmaWVyQXNUeXBlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IGNvZGVCdWlsdEluSWRlbnRpZmllckFzVHlwZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICAiQnVpbHRJbklkZW50aWZpZXJBc1R5cGUiLCB0ZW1wbGF0ZUJ1aWx0SW5JZGVudGlmaWVyQXNUeXBlLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJCVUlMVF9JTl9JREVOVElGSUVSX0FTX1RZUEUiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQnVpbHRJbklkZW50aWZpZXJBc1R5cGUoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQnVpbHRJbklkZW50aWZpZXJBc1R5cGUsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgYnVpbHQtaW4gaWRlbnRpZmllciAnJHtsZXhlbWV9JyBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZS4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gbWF0Y2ggYW4gZXhpc3RpbmcgdHlwZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPgogICAgdGVtcGxhdGVCdWlsdEluSWRlbnRpZmllckluRGVjbGFyYXRpb24gPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNhbid0IHVzZSAnI2xleGVtZScgYXMgYSBuYW1lIGhlcmUuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQnVpbHRJbklkZW50aWZpZXJJbkRlY2xhcmF0aW9uKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IGNvZGVCdWlsdEluSWRlbnRpZmllckluRGVjbGFyYXRpb24gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oIkJ1aWx0SW5JZGVudGlmaWVySW5EZWNsYXJhdGlvbiIsCiAgICAgICAgdGVtcGxhdGVCdWlsdEluSWRlbnRpZmllckluRGVjbGFyYXRpb24sCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkJVSUxUX0lOX0lERU5USUZJRVJfSU5fREVDTEFSQVRJT04iXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQnVpbHRJbklkZW50aWZpZXJJbkRlY2xhcmF0aW9uKFRva2VuIHRva2VuKSB7CiAgU3RyaW5nIGxleGVtZSA9IHRva2VuLmxleGVtZTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUJ1aWx0SW5JZGVudGlmaWVySW5EZWNsYXJhdGlvbiwKICAgICAgbWVzc2FnZTogIiIiQ2FuJ3QgdXNlICcke2xleGVtZX0nIGFzIGEgbmFtZSBoZXJlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3Rva2VuJzogdG9rZW59KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ2FuZGlkYXRlRm91bmQgPSBtZXNzYWdlQ2FuZGlkYXRlRm91bmQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ2FuZGlkYXRlRm91bmQgPSBjb25zdCBNZXNzYWdlQ29kZSgiQ2FuZGlkYXRlRm91bmQiLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQsCiAgICBtZXNzYWdlOiByIiIiRm91bmQgdGhpcyBjYW5kaWRhdGUsIGJ1dCB0aGUgYXJndW1lbnRzIGRvbid0IG1hdGNoLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlQ2FuZGlkYXRlRm91bmRJc0RlZmF1bHRDb25zdHJ1Y3RvciA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiVGhlIGNsYXNzICcjbmFtZScgaGFzIGEgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ2FuZGlkYXRlRm91bmRJc0RlZmF1bHRDb25zdHJ1Y3Rvcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgY29kZUNhbmRpZGF0ZUZvdW5kSXNEZWZhdWx0Q29uc3RydWN0b3IgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkNhbmRpZGF0ZUZvdW5kSXNEZWZhdWx0Q29uc3RydWN0b3IiLAogICAgICAgIHRlbXBsYXRlQ2FuZGlkYXRlRm91bmRJc0RlZmF1bHRDb25zdHJ1Y3RvciwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ2FuZGlkYXRlRm91bmRJc0RlZmF1bHRDb25zdHJ1Y3RvcihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNhbmRpZGF0ZUZvdW5kSXNEZWZhdWx0Q29uc3RydWN0b3IsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgY2xhc3MgJyR7bmFtZX0nIGhhcyBhIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNhbm5vdEFzc2lnblRvUGFyZW50aGVzaXplZEV4cHJlc3Npb24gPQogICAgbWVzc2FnZUNhbm5vdEFzc2lnblRvUGFyZW50aGVzaXplZEV4cHJlc3Npb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ2Fubm90QXNzaWduVG9QYXJlbnRoZXNpemVkRXhwcmVzc2lvbiA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiQ2Fubm90QXNzaWduVG9QYXJlbnRoZXNpemVkRXhwcmVzc2lvbiIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkFTU0lHTk1FTlRfVE9fUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OIl0sCiAgICAgICAgbWVzc2FnZTogciIiIkNhbid0IGFzc2lnbiB0byBhIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ2Fubm90QXNzaWduVG9TdXBlciA9IG1lc3NhZ2VDYW5ub3RBc3NpZ25Ub1N1cGVyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNhbm5vdEFzc2lnblRvU3VwZXIgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDYW5ub3RBc3NpZ25Ub1N1cGVyIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJOT1RfQU5fTFZBTFVFIl0sCiAgICBtZXNzYWdlOiByIiIiQ2FuJ3QgYXNzaWduIHRvIHN1cGVyLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPgogICAgdGVtcGxhdGVDYW5ub3RSZWFkU2RrU3BlY2lmaWNhdGlvbiA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJVbmFibGUgdG8gcmVhZCB0aGUgJ2xpYnJhcmllcy5qc29uJyBzcGVjaWZpY2F0aW9uIGZpbGU6CiAgI3N0cmluZy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDYW5ub3RSZWFkU2RrU3BlY2lmaWNhdGlvbik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+IGNvZGVDYW5ub3RSZWFkU2RrU3BlY2lmaWNhdGlvbiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICJDYW5ub3RSZWFkU2RrU3BlY2lmaWNhdGlvbiIsCiAgdGVtcGxhdGVDYW5ub3RSZWFkU2RrU3BlY2lmaWNhdGlvbiwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDYW5ub3RSZWFkU2RrU3BlY2lmaWNhdGlvbihTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNhbm5vdFJlYWRTZGtTcGVjaWZpY2F0aW9uLAogICAgICBtZXNzYWdlOiAiIiJVbmFibGUgdG8gcmVhZCB0aGUgJ2xpYnJhcmllcy5qc29uJyBzcGVjaWZpY2F0aW9uIGZpbGU6CiAgJHtzdHJpbmd9LiIiIiwgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZ30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDYW50RGlzYW1iaWd1YXRlQW1iaWd1b3VzSW5mb3JtYXRpb24gPQogICAgbWVzc2FnZUNhbnREaXNhbWJpZ3VhdGVBbWJpZ3VvdXNJbmZvcm1hdGlvbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDYW50RGlzYW1iaWd1YXRlQW1iaWd1b3VzSW5mb3JtYXRpb24gPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDYW50RGlzYW1iaWd1YXRlQW1iaWd1b3VzSW5mb3JtYXRpb24iLAogICAgbWVzc2FnZToKICAgICAgICByIiIiQm90aCBJdGVyYWJsZSBhbmQgTWFwIHNwcmVhZCBlbGVtZW50cyBlbmNvdW50ZXJlZCBpbiBhbWJpZ3VvdXMgbGl0ZXJhbC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ2FudERpc2FtYmlndWF0ZU5vdEVub3VnaEluZm9ybWF0aW9uID0KICAgIG1lc3NhZ2VDYW50RGlzYW1iaWd1YXRlTm90RW5vdWdoSW5mb3JtYXRpb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ2FudERpc2FtYmlndWF0ZU5vdEVub3VnaEluZm9ybWF0aW9uID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ2FudERpc2FtYmlndWF0ZU5vdEVub3VnaEluZm9ybWF0aW9uIiwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIk5vdCBlbm91Z2ggdHlwZSBpbmZvcm1hdGlvbiB0byBkaXNhbWJpZ3VhdGUgYmV0d2VlbiBsaXRlcmFsIHNldCBhbmQgbGl0ZXJhbCBtYXAuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgcHJvdmlkaW5nIHR5cGUgYXJndW1lbnRzIGZvciB0aGUgbGl0ZXJhbCBleHBsaWNpdGx5IHRvIGRpc2FtYmlndWF0ZSBpdC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ2FudEluZmVyUGFja2FnZXNGcm9tTWFueUlucHV0cyA9CiAgICBtZXNzYWdlQ2FudEluZmVyUGFja2FnZXNGcm9tTWFueUlucHV0czsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDYW50SW5mZXJQYWNrYWdlc0Zyb21NYW55SW5wdXRzID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ2FudEluZmVyUGFja2FnZXNGcm9tTWFueUlucHV0cyIsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJDYW4ndCBpbmZlciBhIC5wYWNrYWdlcyBmaWxlIHdoZW4gY29tcGlsaW5nIG11bHRpcGxlIGlucHV0cy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgc3BlY2lmeWluZyB0aGUgZmlsZSBleHBsaWNpdGx5IHdpdGggdGhlIC0tcGFja2FnZXMgb3B0aW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDYW50SW5mZXJQYWNrYWdlc0Zyb21QYWNrYWdlVXJpID0KICAgIG1lc3NhZ2VDYW50SW5mZXJQYWNrYWdlc0Zyb21QYWNrYWdlVXJpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNhbnRJbmZlclBhY2thZ2VzRnJvbVBhY2thZ2VVcmkgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDYW50SW5mZXJQYWNrYWdlc0Zyb21QYWNrYWdlVXJpIiwKICAgIG1lc3NhZ2U6IHIiIiJDYW4ndCBpbmZlciBhIC5wYWNrYWdlcyBmaWxlIGZyb20gYW4gaW5wdXQgJ3BhY2thZ2U6KicgVVJJLiIiIiwKICAgIHRpcDogciIiIlRyeSBzcGVjaWZ5aW5nIHRoZSBmaWxlIGV4cGxpY2l0bHkgd2l0aCB0aGUgLS1wYWNrYWdlcyBvcHRpb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgc3RyaW5nKT4gdGVtcGxhdGVDYW50SW5mZXJUeXBlRHVlVG9DaXJjdWxhcml0eSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJDYW4ndCBpbmZlciB0aGUgdHlwZSBvZiAnI3N0cmluZyc6IGNpcmN1bGFyaXR5IGZvdW5kIGR1cmluZyB0eXBlIGluZmVyZW5jZS4iIiIsCiAgICB0aXBUZW1wbGF0ZTogciIiIlNwZWNpZnkgdGhlIHR5cGUgZXhwbGljaXRseS4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NhbnRJbmZlclR5cGVEdWVUb0NpcmN1bGFyaXR5KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gY29kZUNhbnRJbmZlclR5cGVEdWVUb0NpcmN1bGFyaXR5ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgIkNhbnRJbmZlclR5cGVEdWVUb0NpcmN1bGFyaXR5IiwgdGVtcGxhdGVDYW50SW5mZXJUeXBlRHVlVG9DaXJjdWxhcml0eSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUkVDVVJTSVZFX0NPTVBJTEVfVElNRV9DT05TVEFOVCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDYW50SW5mZXJUeXBlRHVlVG9DaXJjdWxhcml0eShTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNhbnRJbmZlclR5cGVEdWVUb0NpcmN1bGFyaXR5LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQ2FuJ3QgaW5mZXIgdGhlIHR5cGUgb2YgJyR7c3RyaW5nfSc6IGNpcmN1bGFyaXR5IGZvdW5kIGR1cmluZyB0eXBlIGluZmVyZW5jZS4iIiIsCiAgICAgIHRpcDogIiIiU3BlY2lmeSB0aGUgdHlwZSBleHBsaWNpdGx5LiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZ30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlQ2FudEluZmVyVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJDYW4ndCBpbmZlciBhIHR5cGUgZm9yICcjbmFtZScgYXMgc29tZSBvZiB0aGUgaW5oZXJpdGVkIG1lbWJlcnMgaGF2ZSBkaWZmZXJlbnQgdHlwZXMuIiIiLAogICAgICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IGFkZGluZyBhbiBleHBsaWNpdCB0eXBlLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NhbnRJbmZlclR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlcyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgY29kZUNhbnRJbmZlclR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlcyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQ2FudEluZmVyVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzIiwKICAgICAgICB0ZW1wbGF0ZUNhbnRJbmZlclR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlcywKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9NRVRIT0RfT1ZFUlJJREUiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ2FudEluZmVyVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ2FudEluZmVyVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQ2FuJ3QgaW5mZXIgYSB0eXBlIGZvciAnJHtuYW1lfScgYXMgc29tZSBvZiB0aGUgaW5oZXJpdGVkIG1lbWJlcnMgaGF2ZSBkaWZmZXJlbnQgdHlwZXMuIiIiLAogICAgICB0aXA6ICIiIlRyeSBhZGRpbmcgYW4gZXhwbGljaXQgdHlwZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfLCBTdHJpbmcgc3RyaW5nKT4gdGVtcGxhdGVDYW50UmVhZEZpbGUgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXywgU3RyaW5nIHN0cmluZyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkVycm9yIHdoZW4gcmVhZGluZyAnI3VyaSc6ICNzdHJpbmciIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDYW50UmVhZEZpbGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfLCBTdHJpbmcgc3RyaW5nKT4gY29kZUNhbnRSZWFkRmlsZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8sIFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiQ2FudFJlYWRGaWxlIiwgdGVtcGxhdGVDYW50UmVhZEZpbGUsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlVSSV9ET0VTX05PVF9FWElTVCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDYW50UmVhZEZpbGUoVXJpIHVyaV8sIFN0cmluZyBzdHJpbmcpIHsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ2FudFJlYWRGaWxlLAogICAgICBtZXNzYWdlOiAiIiJFcnJvciB3aGVuIHJlYWRpbmcgJyR7dXJpfSc6ICR7c3RyaW5nfSIiIiwKICAgICAgYXJndW1lbnRzOiB7J3VyaSc6IHVyaV8sICdzdHJpbmcnOiBzdHJpbmd9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFRva2VuCiAgICAgICAgICAgIHRva2VuKT4gdGVtcGxhdGVDYW50VXNlRGVmZXJyZWRQcmVmaXhBc0NvbnN0YW50ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiInI2xleGVtZScgY2FuJ3QgYmUgdXNlZCBpbiBhIGNvbnN0YW50IGV4cHJlc3Npb24gYmVjYXVzZSBpdCdzIG1hcmtlZCBhcyAnZGVmZXJyZWQnIHdoaWNoIG1lYW5zIGl0IGlzbid0IGF2YWlsYWJsZSB1bnRpbCBsb2FkZWQuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBtb3ZpbmcgdGhlIGNvbnN0YW50IGZyb20gdGhlIGRlZmVycmVkIGxpYnJhcnksIG9yIHJlbW92aW5nICdkZWZlcnJlZCcgZnJvbSB0aGUgaW1wb3J0LgoiIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NhbnRVc2VEZWZlcnJlZFByZWZpeEFzQ29uc3RhbnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gY29kZUNhbnRVc2VEZWZlcnJlZFByZWZpeEFzQ29uc3RhbnQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oIkNhbnRVc2VEZWZlcnJlZFByZWZpeEFzQ29uc3RhbnQiLAogICAgICAgIHRlbXBsYXRlQ2FudFVzZURlZmVycmVkUHJlZml4QXNDb25zdGFudCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09OU1RfREVGRVJSRURfQ0xBU1MiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ2FudFVzZURlZmVycmVkUHJlZml4QXNDb25zdGFudChUb2tlbiB0b2tlbikgewogIFN0cmluZyBsZXhlbWUgPSB0b2tlbi5sZXhlbWU7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDYW50VXNlRGVmZXJyZWRQcmVmaXhBc0NvbnN0YW50LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiJyR7bGV4ZW1lfScgY2FuJ3QgYmUgdXNlZCBpbiBhIGNvbnN0YW50IGV4cHJlc3Npb24gYmVjYXVzZSBpdCdzIG1hcmtlZCBhcyAnZGVmZXJyZWQnIHdoaWNoIG1lYW5zIGl0IGlzbid0IGF2YWlsYWJsZSB1bnRpbCBsb2FkZWQuIiIiLAogICAgICB0aXA6ICIiIlRyeSBtb3ZpbmcgdGhlIGNvbnN0YW50IGZyb20gdGhlIGRlZmVycmVkIGxpYnJhcnksIG9yIHJlbW92aW5nICdkZWZlcnJlZCcgZnJvbSB0aGUgaW1wb3J0LgoiIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNhbnRVc2VQcmVmaXhBc0V4cHJlc3Npb24gPQogICAgbWVzc2FnZUNhbnRVc2VQcmVmaXhBc0V4cHJlc3Npb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ2FudFVzZVByZWZpeEFzRXhwcmVzc2lvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNhbnRVc2VQcmVmaXhBc0V4cHJlc3Npb24iLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlBSRUZJWF9JREVOVElGSUVSX05PVF9GT0xMT1dFRF9CWV9ET1QiXSwKICAgIG1lc3NhZ2U6IHIiIiJBIHByZWZpeCBjYW4ndCBiZSB1c2VkIGFzIGFuIGV4cHJlc3Npb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNhbnRVc2VQcmVmaXhXaXRoTnVsbEF3YXJlID0KICAgIG1lc3NhZ2VDYW50VXNlUHJlZml4V2l0aE51bGxBd2FyZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDYW50VXNlUHJlZml4V2l0aE51bGxBd2FyZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNhbnRVc2VQcmVmaXhXaXRoTnVsbEF3YXJlIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJQUkVGSVhfSURFTlRJRklFUl9OT1RfRk9MTE9XRURfQllfRE9UIl0sCiAgICBtZXNzYWdlOiByIiIiQSBwcmVmaXggY2FuJ3QgYmUgdXNlZCB3aXRoIG51bGwtYXdhcmUgb3BlcmF0b3JzLiIiIiwKICAgIHRpcDogciIiIkl0IHNob3VsZCBiZSBzYWZlIHRvIHJlbW92ZSB0aGUgJz8nIGFzIGEgcHJlZml4IGlzIG5ldmVyIG51bGwuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNhdGNoU3ludGF4ID0gbWVzc2FnZUNhdGNoU3ludGF4OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNhdGNoU3ludGF4ID0gY29uc3QgTWVzc2FnZUNvZGUoIkNhdGNoU3ludGF4IiwKICAgIGluZGV4OiA4NCwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIidjYXRjaCcgbXVzdCBiZSBmb2xsb3dlZCBieSAnKGlkZW50aWZpZXIpJyBvciAnKGlkZW50aWZpZXIsIGlkZW50aWZpZXIpJy4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIk5vIHR5cGVzIGFyZSBuZWVkZWQsIHRoZSBmaXJzdCBpcyBnaXZlbiBieSAnb24nLCB0aGUgc2Vjb25kIGlzIGFsd2F5cyAnU3RhY2tUcmFjZScuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNhdGNoU3ludGF4RXh0cmFQYXJhbWV0ZXJzID0KICAgIG1lc3NhZ2VDYXRjaFN5bnRheEV4dHJhUGFyYW1ldGVyczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDYXRjaFN5bnRheEV4dHJhUGFyYW1ldGVycyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNhdGNoU3ludGF4RXh0cmFQYXJhbWV0ZXJzIiwKICAgIGluZGV4OiA4MywKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIidjYXRjaCcgbXVzdCBiZSBmb2xsb3dlZCBieSAnKGlkZW50aWZpZXIpJyBvciAnKGlkZW50aWZpZXIsIGlkZW50aWZpZXIpJy4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIk5vIHR5cGVzIGFyZSBuZWVkZWQsIHRoZSBmaXJzdCBpcyBnaXZlbiBieSAnb24nLCB0aGUgc2Vjb25kIGlzIGFsd2F5cyAnU3RhY2tUcmFjZScuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNsYXNzSW5DbGFzcyA9IG1lc3NhZ2VDbGFzc0luQ2xhc3M7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ2xhc3NJbkNsYXNzID0gY29uc3QgTWVzc2FnZUNvZGUoIkNsYXNzSW5DbGFzcyIsCiAgICBpbmRleDogNTMsCiAgICBtZXNzYWdlOiByIiIiQ2xhc3NlcyBjYW4ndCBiZSBkZWNsYXJlZCBpbnNpZGUgb3RoZXIgY2xhc3Nlcy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgbW92aW5nIHRoZSBjbGFzcyB0byB0aGUgdG9wLWxldmVsLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb2xvbkluUGxhY2VPZkluID0gbWVzc2FnZUNvbG9uSW5QbGFjZU9mSW47CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29sb25JblBsYWNlT2ZJbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNvbG9uSW5QbGFjZU9mSW4iLAogICAgaW5kZXg6IDU0LAogICAgbWVzc2FnZTogciIiIkZvci1pbiBsb29wcyB1c2UgJ2luJyByYXRoZXIgdGhhbiBhIGNvbG9uLiIiIiwKICAgIHRpcDogciIiIlRyeSByZXBsYWNpbmcgdGhlIGNvbG9uIHdpdGggdGhlIGtleXdvcmQgJ2luJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlQ29uZmxpY3RzV2l0aENvbnN0cnVjdG9yID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDb25mbGljdHMgd2l0aCBjb25zdHJ1Y3RvciAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhDb25zdHJ1Y3Rvcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlQ29uZmxpY3RzV2l0aENvbnN0cnVjdG9yID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJDb25mbGljdHNXaXRoQ29uc3RydWN0b3IiLCB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhDb25zdHJ1Y3RvciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09ORkxJQ1RTX1dJVEhfQ09OU1RSVUNUT1IiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ29uZmxpY3RzV2l0aENvbnN0cnVjdG9yKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uZmxpY3RzV2l0aENvbnN0cnVjdG9yLAogICAgICBtZXNzYWdlOiAiIiJDb25mbGljdHMgd2l0aCBjb25zdHJ1Y3RvciAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlQ29uZmxpY3RzV2l0aEZhY3RvcnkgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNvbmZsaWN0cyB3aXRoIGZhY3RvcnkgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDb25mbGljdHNXaXRoRmFjdG9yeSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlQ29uZmxpY3RzV2l0aEZhY3RvcnkgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgIkNvbmZsaWN0c1dpdGhGYWN0b3J5IiwKICB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhGYWN0b3J5LAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhGYWN0b3J5KFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uZmxpY3RzV2l0aEZhY3RvcnksCiAgICAgIG1lc3NhZ2U6ICIiIkNvbmZsaWN0cyB3aXRoIGZhY3RvcnkgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhNZW1iZXIgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNvbmZsaWN0cyB3aXRoIG1lbWJlciAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhNZW1iZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUNvbmZsaWN0c1dpdGhNZW1iZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkNvbmZsaWN0c1dpdGhNZW1iZXIiLCB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhNZW1iZXIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTkZMSUNUU19XSVRIX01FTUJFUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25mbGljdHNXaXRoTWVtYmVyKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uZmxpY3RzV2l0aE1lbWJlciwKICAgICAgbWVzc2FnZTogIiIiQ29uZmxpY3RzIHdpdGggbWVtYmVyICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlQ29uZmxpY3RzV2l0aE1lbWJlcldhcm5pbmcgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNvbmZsaWN0cyB3aXRoIG1lbWJlciAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhNZW1iZXJXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVDb25mbGljdHNXaXRoTWVtYmVyV2FybmluZyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQ29uZmxpY3RzV2l0aE1lbWJlcldhcm5pbmciLCB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhNZW1iZXJXYXJuaW5nLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJDT05GTElDVFNfV0lUSF9NRU1CRVIiXSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25mbGljdHNXaXRoTWVtYmVyV2FybmluZyhTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbmZsaWN0c1dpdGhNZW1iZXJXYXJuaW5nLAogICAgICBtZXNzYWdlOiAiIiJDb25mbGljdHMgd2l0aCBtZW1iZXIgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhTZXR0ZXIgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNvbmZsaWN0cyB3aXRoIHNldHRlciAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhTZXR0ZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUNvbmZsaWN0c1dpdGhTZXR0ZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkNvbmZsaWN0c1dpdGhTZXR0ZXIiLCB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhTZXR0ZXIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTkZMSUNUU19XSVRIX01FTUJFUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25mbGljdHNXaXRoU2V0dGVyKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uZmxpY3RzV2l0aFNldHRlciwKICAgICAgbWVzc2FnZTogIiIiQ29uZmxpY3RzIHdpdGggc2V0dGVyICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlQ29uZmxpY3RzV2l0aFNldHRlcldhcm5pbmcgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNvbmZsaWN0cyB3aXRoIHNldHRlciAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhTZXR0ZXJXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVDb25mbGljdHNXaXRoU2V0dGVyV2FybmluZyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQ29uZmxpY3RzV2l0aFNldHRlcldhcm5pbmciLCB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhTZXR0ZXJXYXJuaW5nLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJDT05GTElDVFNfV0lUSF9NRU1CRVIiXSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25mbGljdHNXaXRoU2V0dGVyV2FybmluZyhTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbmZsaWN0c1dpdGhTZXR0ZXJXYXJuaW5nLAogICAgICBtZXNzYWdlOiAiIiJDb25mbGljdHMgd2l0aCBzZXR0ZXIgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDb25mbGljdHMgd2l0aCB0eXBlIHZhcmlhYmxlICcjbmFtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uZmxpY3RzV2l0aFR5cGVWYXJpYWJsZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlQ29uZmxpY3RzV2l0aFR5cGVWYXJpYWJsZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQ29uZmxpY3RzV2l0aFR5cGVWYXJpYWJsZSIsIHRlbXBsYXRlQ29uZmxpY3RzV2l0aFR5cGVWYXJpYWJsZSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09ORkxJQ1RJTkdfVFlQRV9WQVJJQUJMRV9BTkRfTUVNQkVSIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhUeXBlVmFyaWFibGUoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlLAogICAgICBtZXNzYWdlOiAiIiJDb25mbGljdHMgd2l0aCB0eXBlIHZhcmlhYmxlICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlQ2F1c2UgPQogICAgbWVzc2FnZUNvbmZsaWN0c1dpdGhUeXBlVmFyaWFibGVDYXVzZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlQ2F1c2UgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlQ2F1c2UiLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQsCiAgICBtZXNzYWdlOiByIiIiVGhpcyBpcyB0aGUgdHlwZSB2YXJpYWJsZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RBZnRlckZhY3RvcnkgPSBtZXNzYWdlQ29uc3RBZnRlckZhY3Rvcnk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RBZnRlckZhY3RvcnkgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb25zdEFmdGVyRmFjdG9yeSIsCiAgICBpbmRleDogNTYsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJUaGUgbW9kaWZpZXIgJ2NvbnN0JyBzaG91bGQgYmUgYmVmb3JlIHRoZSBtb2RpZmllciAnZmFjdG9yeScuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlLW9yZGVyaW5nIHRoZSBtb2RpZmllcnMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0QW5kQ292YXJpYW50ID0gbWVzc2FnZUNvbnN0QW5kQ292YXJpYW50OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0QW5kQ292YXJpYW50ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29uc3RBbmRDb3ZhcmlhbnQiLAogICAgaW5kZXg6IDU3LAogICAgbWVzc2FnZToKICAgICAgICByIiIiTWVtYmVycyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSBib3RoICdjb25zdCcgYW5kICdjb3ZhcmlhbnQnLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyBlaXRoZXIgdGhlICdjb25zdCcgb3IgJ2NvdmFyaWFudCcga2V5d29yZC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RBbmRGaW5hbCA9IG1lc3NhZ2VDb25zdEFuZEZpbmFsOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0QW5kRmluYWwgPSBjb25zdCBNZXNzYWdlQ29kZSgiQ29uc3RBbmRGaW5hbCIsCiAgICBpbmRleDogNTgsCiAgICBtZXNzYWdlOiByIiIiTWVtYmVycyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSBib3RoICdjb25zdCcgYW5kICdmaW5hbCcuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nIGVpdGhlciB0aGUgJ2NvbnN0JyBvciAnZmluYWwnIGtleXdvcmQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0QW5kVmFyID0gbWVzc2FnZUNvbnN0QW5kVmFyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0QW5kVmFyID0gY29uc3QgTWVzc2FnZUNvZGUoIkNvbnN0QW5kVmFyIiwKICAgIGluZGV4OiA1OSwKICAgIG1lc3NhZ2U6IHIiIiJNZW1iZXJzIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlIGJvdGggJ2NvbnN0JyBhbmQgJ3ZhcicuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nIGVpdGhlciB0aGUgJ2NvbnN0JyBvciAndmFyJyBrZXl3b3JkLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb25zdENsYXNzID0gbWVzc2FnZUNvbnN0Q2xhc3M7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RDbGFzcyA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJDb25zdENsYXNzIiwKICAgIGluZGV4OiA2MCwKICAgIG1lc3NhZ2U6IHIiIiJDbGFzc2VzIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlICdjb25zdCcuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgcmVtb3ZpbmcgdGhlICdjb25zdCcga2V5d29yZC4gSWYgeW91J3JlIHRyeWluZyB0byBpbmRpY2F0ZSB0aGF0IGluc3RhbmNlcyBvZiB0aGUgY2xhc3MgY2FuIGJlIGNvbnN0YW50cywgcGxhY2UgdGhlICdjb25zdCcga2V5d29yZCBvbiAgdGhlIGNsYXNzJyBjb25zdHJ1Y3RvcihzKS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RDb25zdHJ1Y3Rvck5vbkZpbmFsRmllbGQgPQogICAgbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JOb25GaW5hbEZpZWxkOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JOb25GaW5hbEZpZWxkID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29uc3RDb25zdHJ1Y3Rvck5vbkZpbmFsRmllbGQiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTlNUX0NPTlNUUlVDVE9SX1dJVEhfTk9OX0ZJTkFMX0ZJRUxEIl0sCiAgICBtZXNzYWdlOiByIiIiQ29uc3RydWN0b3IgaXMgbWFya2VkICdjb25zdCcgc28gYWxsIGZpZWxkcyBtdXN0IGJlIGZpbmFsLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb25zdENvbnN0cnVjdG9yTm9uRmluYWxGaWVsZENhdXNlID0KICAgIG1lc3NhZ2VDb25zdENvbnN0cnVjdG9yTm9uRmluYWxGaWVsZENhdXNlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JOb25GaW5hbEZpZWxkQ2F1c2UgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb25zdENvbnN0cnVjdG9yTm9uRmluYWxGaWVsZENhdXNlIiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LAogICAgbWVzc2FnZTogciIiIkZpZWxkIGlzbid0IGZpbmFsLCBidXQgY29uc3RydWN0b3IgaXMgJ2NvbnN0Jy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RDb25zdHJ1Y3RvclJlZGlyZWN0aW9uVG9Ob25Db25zdCA9CiAgICBtZXNzYWdlQ29uc3RDb25zdHJ1Y3RvclJlZGlyZWN0aW9uVG9Ob25Db25zdDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdENvbnN0cnVjdG9yUmVkaXJlY3Rpb25Ub05vbkNvbnN0ID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJDb25zdENvbnN0cnVjdG9yUmVkaXJlY3Rpb25Ub05vbkNvbnN0IiwKICAgICAgICBtZXNzYWdlOgogICAgICAgICAgICByIiIiQSBjb25zdGFudCBjb25zdHJ1Y3RvciBjYW4ndCBjYWxsIGEgbm9uLWNvbnN0YW50IGNvbnN0cnVjdG9yLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb25zdENvbnN0cnVjdG9yV2l0aEJvZHkgPSBtZXNzYWdlQ29uc3RDb25zdHJ1Y3RvcldpdGhCb2R5OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JXaXRoQm9keSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNvbnN0Q29uc3RydWN0b3JXaXRoQm9keSIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09OU1RfQ09OU1RSVUNUT1JfV0lUSF9CT0RZIl0sCiAgICBtZXNzYWdlOiByIiIiQSBjb25zdCBjb25zdHJ1Y3RvciBjYW4ndCBoYXZlIGEgYm9keS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgZWl0aGVyIHRoZSAnY29uc3QnIGtleXdvcmQgb3IgdGhlIGJvZHkuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0Q29uc3RydWN0b3JXaXRoTm9uQ29uc3RTdXBlciA9CiAgICBtZXNzYWdlQ29uc3RDb25zdHJ1Y3RvcldpdGhOb25Db25zdFN1cGVyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JXaXRoTm9uQ29uc3RTdXBlciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNvbnN0Q29uc3RydWN0b3JXaXRoTm9uQ29uc3RTdXBlciIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09OU1RfQ09OU1RSVUNUT1JfV0lUSF9OT05fQ09OU1RfU1VQRVIiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkNvbnN0YW50IGNvbnN0cnVjdG9yIGNhbid0IGNhbGwgbm9uLWNvbnN0YW50IHN1cGVyIGNvbnN0cnVjdG9ycy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RFdmFsQ2lyY3VsYXJpdHkgPSBtZXNzYWdlQ29uc3RFdmFsQ2lyY3VsYXJpdHk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RFdmFsQ2lyY3VsYXJpdHkgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb25zdEV2YWxDaXJjdWxhcml0eSIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUkVDVVJTSVZFX0NPTVBJTEVfVElNRV9DT05TVEFOVCJdLAogICAgbWVzc2FnZTogciIiIkNvbnN0YW50IGV4cHJlc3Npb24gZGVwZW5kcyBvbiBpdHNlbGYuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0RXZhbENvbnRleHQgPSBtZXNzYWdlQ29uc3RFdmFsQ29udGV4dDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdEV2YWxDb250ZXh0ID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJDb25zdEV2YWxDb250ZXh0IiwgbWVzc2FnZTogciIiIldoaWxlIGFuYWx5emluZzoiIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lKT4gdGVtcGxhdGVDb25zdEV2YWxEZWZlcnJlZExpYnJhcnkgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIicjbmFtZScgY2FuJ3QgYmUgdXNlZCBpbiBhIGNvbnN0YW50IGV4cHJlc3Npb24gYmVjYXVzZSBpdCdzIG1hcmtlZCBhcyAnZGVmZXJyZWQnIHdoaWNoIG1lYW5zIGl0IGlzbid0IGF2YWlsYWJsZSB1bnRpbCBsb2FkZWQuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBtb3ZpbmcgdGhlIGNvbnN0YW50IGZyb20gdGhlIGRlZmVycmVkIGxpYnJhcnksIG9yIHJlbW92aW5nICdkZWZlcnJlZCcgZnJvbSB0aGUgaW1wb3J0LgoiIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbERlZmVycmVkTGlicmFyeSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlQ29uc3RFdmFsRGVmZXJyZWRMaWJyYXJ5ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJDb25zdEV2YWxEZWZlcnJlZExpYnJhcnkiLCB0ZW1wbGF0ZUNvbnN0RXZhbERlZmVycmVkTGlicmFyeSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsKICAgICAgIk5PTl9DT05TVEFOVF9ERUZBVUxUX1ZBTFVFX0ZST01fREVGRVJSRURfTElCUkFSWSIKICAgIF0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbERlZmVycmVkTGlicmFyeShTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnN0RXZhbERlZmVycmVkTGlicmFyeSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIicke25hbWV9JyBjYW4ndCBiZSB1c2VkIGluIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBiZWNhdXNlIGl0J3MgbWFya2VkIGFzICdkZWZlcnJlZCcgd2hpY2ggbWVhbnMgaXQgaXNuJ3QgYXZhaWxhYmxlIHVudGlsIGxvYWRlZC4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IG1vdmluZyB0aGUgY29uc3RhbnQgZnJvbSB0aGUgZGVmZXJyZWQgbGlicmFyeSwgb3IgcmVtb3ZpbmcgJ2RlZmVycmVkJyBmcm9tIHRoZSBpbXBvcnQuCiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBDb25zdGFudAogICAgICAgICAgICBfY29uc3RhbnQpPiB0ZW1wbGF0ZUNvbnN0RXZhbER1cGxpY2F0ZUVsZW1lbnQgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgZWxlbWVudCAnI2NvbnN0YW50JyBjb25mbGljdHMgd2l0aCBhbm90aGVyIGV4aXN0aW5nIGVsZW1lbnQgaW4gdGhlIHNldC4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbER1cGxpY2F0ZUVsZW1lbnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCk+IGNvZGVDb25zdEV2YWxEdXBsaWNhdGVFbGVtZW50ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihDb25zdGFudCBfY29uc3RhbnQpPigKICAgICAgICAiQ29uc3RFdmFsRHVwbGljYXRlRWxlbWVudCIsIHRlbXBsYXRlQ29uc3RFdmFsRHVwbGljYXRlRWxlbWVudCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVFVQUxfRUxFTUVOVFNfSU5fQ09OU1RfU0VUIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbER1cGxpY2F0ZUVsZW1lbnQoQ29uc3RhbnQgX2NvbnN0YW50KSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiBjb25zdGFudFBhcnRzID0gbGFiZWxlci5sYWJlbENvbnN0YW50KF9jb25zdGFudCk7CiAgU3RyaW5nIGNvbnN0YW50ID0gY29uc3RhbnRQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDb25zdEV2YWxEdXBsaWNhdGVFbGVtZW50LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIGVsZW1lbnQgJyR7Y29uc3RhbnR9JyBjb25mbGljdHMgd2l0aCBhbm90aGVyIGV4aXN0aW5nIGVsZW1lbnQgaW4gdGhlIHNldC4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeydjb25zdGFudCc6IF9jb25zdGFudH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgQ29uc3RhbnQKICAgICAgICAgICAgX2NvbnN0YW50KT4gdGVtcGxhdGVDb25zdEV2YWxEdXBsaWNhdGVLZXkgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUga2V5ICcjY29uc3RhbnQnIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgZXhpc3Rpbmcga2V5IGluIHRoZSBtYXAuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDb25zdEV2YWxEdXBsaWNhdGVLZXkpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCk+IGNvZGVDb25zdEV2YWxEdXBsaWNhdGVLZXkgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCk+KAogICAgICAgICJDb25zdEV2YWxEdXBsaWNhdGVLZXkiLCB0ZW1wbGF0ZUNvbnN0RXZhbER1cGxpY2F0ZUtleSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVFVQUxfS0VZU19JTl9DT05TVF9NQVAiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ29uc3RFdmFsRHVwbGljYXRlS2V5KENvbnN0YW50IF9jb25zdGFudCkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gY29uc3RhbnRQYXJ0cyA9IGxhYmVsZXIubGFiZWxDb25zdGFudChfY29uc3RhbnQpOwogIFN0cmluZyBjb25zdGFudCA9IGNvbnN0YW50UGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RFdmFsRHVwbGljYXRlS2V5LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIGtleSAnJHtjb25zdGFudH0nIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgZXhpc3Rpbmcga2V5IGluIHRoZSBtYXAuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsnY29uc3RhbnQnOiBfY29uc3RhbnR9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIENvbnN0YW50CiAgICAgICAgICAgIF9jb25zdGFudCk+IHRlbXBsYXRlQ29uc3RFdmFsRWxlbWVudEltcGxlbWVudHNFcXVhbCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50KT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBlbGVtZW50ICcjY29uc3RhbnQnIGRvZXMgbm90IGhhdmUgYSBwcmltaXRpdmUgb3BlcmF0b3IgJz09Jy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEVsZW1lbnRJbXBsZW1lbnRzRXF1YWwpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCk+CiAgICBjb2RlQ29uc3RFdmFsRWxlbWVudEltcGxlbWVudHNFcXVhbCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50KT4oCiAgICAgICAgIkNvbnN0RXZhbEVsZW1lbnRJbXBsZW1lbnRzRXF1YWwiLAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsRWxlbWVudEltcGxlbWVudHNFcXVhbCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09OU1RfU0VUX0VMRU1FTlRfVFlQRV9JTVBMRU1FTlRTX0VRVUFMUyJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25zdEV2YWxFbGVtZW50SW1wbGVtZW50c0VxdWFsKENvbnN0YW50IF9jb25zdGFudCkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gY29uc3RhbnRQYXJ0cyA9IGxhYmVsZXIubGFiZWxDb25zdGFudChfY29uc3RhbnQpOwogIFN0cmluZyBjb25zdGFudCA9IGNvbnN0YW50UGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RFdmFsRWxlbWVudEltcGxlbWVudHNFcXVhbCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBlbGVtZW50ICcke2NvbnN0YW50fScgZG9lcyBub3QgaGF2ZSBhIHByaW1pdGl2ZSBvcGVyYXRvciAnPT0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J2NvbnN0YW50JzogX2NvbnN0YW50fSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0RXZhbEZhaWxlZEFzc2VydGlvbiA9IG1lc3NhZ2VDb25zdEV2YWxGYWlsZWRBc3NlcnRpb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RFdmFsRmFpbGVkQXNzZXJ0aW9uID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29uc3RFdmFsRmFpbGVkQXNzZXJ0aW9uIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJDT05TVF9FVkFMX1RIUk9XU19FWENFUFRJT04iXSwKICAgIG1lc3NhZ2U6IHIiIiJUaGlzIGFzc2VydGlvbiBmYWlsZWQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+CiAgICB0ZW1wbGF0ZUNvbnN0RXZhbEZhaWxlZEFzc2VydGlvbldpdGhNZXNzYWdlID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlRoaXMgYXNzZXJ0aW9uIGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICNzdHJpbmciIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDb25zdEV2YWxGYWlsZWRBc3NlcnRpb25XaXRoTWVzc2FnZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+CiAgICBjb2RlQ29uc3RFdmFsRmFpbGVkQXNzZXJ0aW9uV2l0aE1lc3NhZ2UgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiQ29uc3RFdmFsRmFpbGVkQXNzZXJ0aW9uV2l0aE1lc3NhZ2UiLAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsRmFpbGVkQXNzZXJ0aW9uV2l0aE1lc3NhZ2UsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTlNUX0VWQUxfVEhST1dTX0VYQ0VQVElPTiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25zdEV2YWxGYWlsZWRBc3NlcnRpb25XaXRoTWVzc2FnZShTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnN0RXZhbEZhaWxlZEFzc2VydGlvbldpdGhNZXNzYWdlLAogICAgICBtZXNzYWdlOiAiIiJUaGlzIGFzc2VydGlvbiBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke3N0cmluZ30iIiIsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmd9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIERhcnRUeXBlCiAgICAgICAgICAgIF90eXBlKT4gdGVtcGxhdGVDb25zdEV2YWxGcmVlVHlwZVBhcmFtZXRlciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIHR5cGUgJyN0eXBlJyBpcyBub3QgYSBjb25zdGFudCBiZWNhdXNlIGl0IGRlcGVuZHMgb24gYSB0eXBlIHBhcmFtZXRlciwgb25seSBpbnN0YW50aWF0ZWQgdHlwZXMgYXJlIGFsbG93ZWQuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDb25zdEV2YWxGcmVlVHlwZVBhcmFtZXRlcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUpPiBjb2RlQ29uc3RFdmFsRnJlZVR5cGVQYXJhbWV0ZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlKT4oCiAgIkNvbnN0RXZhbEZyZWVUeXBlUGFyYW1ldGVyIiwKICB0ZW1wbGF0ZUNvbnN0RXZhbEZyZWVUeXBlUGFyYW1ldGVyLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEZyZWVUeXBlUGFyYW1ldGVyKERhcnRUeXBlIF90eXBlKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RFdmFsRnJlZVR5cGVQYXJhbWV0ZXIsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgdHlwZSAnJHt0eXBlfScgaXMgbm90IGEgY29uc3RhbnQgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIGEgdHlwZSBwYXJhbWV0ZXIsIG9ubHkgaW5zdGFudGlhdGVkIHR5cGVzIGFyZSBhbGxvd2VkLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIHN0cmluZywKICAgICAgICBDb25zdGFudCBfY29uc3RhbnQsCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUyKT4gdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkQmluYXJ5T3BlcmFuZFR5cGUgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIENvbnN0YW50IF9jb25zdGFudCwgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJCaW5hcnkgb3BlcmF0b3IgJyNzdHJpbmcnIG9uICcjY29uc3RhbnQnIHJlcXVpcmVzIG9wZXJhbmQgb2YgdHlwZSAnI3R5cGUnLCBidXQgd2FzIG9mIHR5cGUgJyN0eXBlMicuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDb25zdEV2YWxJbnZhbGlkQmluYXJ5T3BlcmFuZFR5cGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgQ29uc3RhbnQgX2NvbnN0YW50LCBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZSBfdHlwZTIpPiBjb2RlQ29uc3RFdmFsSW52YWxpZEJpbmFyeU9wZXJhbmRUeXBlID0gY29uc3QgQ29kZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIHN0cmluZywgQ29uc3RhbnQgX2NvbnN0YW50LCBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgIkNvbnN0RXZhbEludmFsaWRCaW5hcnlPcGVyYW5kVHlwZSIsCiAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkQmluYXJ5T3BlcmFuZFR5cGUsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZEJpbmFyeU9wZXJhbmRUeXBlKAogICAgU3RyaW5nIHN0cmluZywgQ29uc3RhbnQgX2NvbnN0YW50LCBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IGNvbnN0YW50UGFydHMgPSBsYWJlbGVyLmxhYmVsQ29uc3RhbnQoX2NvbnN0YW50KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBTdHJpbmcgY29uc3RhbnQgPSBjb25zdGFudFBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDb25zdEV2YWxJbnZhbGlkQmluYXJ5T3BlcmFuZFR5cGUsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJCaW5hcnkgb3BlcmF0b3IgJyR7c3RyaW5nfScgb24gJyR7Y29uc3RhbnR9JyByZXF1aXJlcyBvcGVyYW5kIG9mIHR5cGUgJyR7dHlwZX0nLCBidXQgd2FzIG9mIHR5cGUgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogewogICAgICAgICdzdHJpbmcnOiBzdHJpbmcsCiAgICAgICAgJ2NvbnN0YW50JzogX2NvbnN0YW50LAogICAgICAgICd0eXBlJzogX3R5cGUsCiAgICAgICAgJ3R5cGUyJzogX3R5cGUyCiAgICAgIH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgQ29uc3RhbnQgX2NvbnN0YW50LAogICAgICAgIERhcnRUeXBlCiAgICAgICAgICAgIF90eXBlKT4gdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkRXF1YWxzT3BlcmFuZFR5cGUgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCwgRGFydFR5cGUgX3R5cGUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiQmluYXJ5IG9wZXJhdG9yICc9PScgcmVxdWlyZXMgcmVjZWl2ZXIgY29uc3RhbnQgJyNjb25zdGFudCcgb2YgdHlwZSAnTnVsbCcsICdib29sJywgJ2ludCcsICdkb3VibGUnLCBvciAnU3RyaW5nJywgYnV0IHdhcyBvZiB0eXBlICcjdHlwZScuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDb25zdEV2YWxJbnZhbGlkRXF1YWxzT3BlcmFuZFR5cGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCwgRGFydFR5cGUgX3R5cGUpPgogICAgY29kZUNvbnN0RXZhbEludmFsaWRFcXVhbHNPcGVyYW5kVHlwZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50LCBEYXJ0VHlwZSBfdHlwZSk+KAogICJDb25zdEV2YWxJbnZhbGlkRXF1YWxzT3BlcmFuZFR5cGUiLAogIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZEVxdWFsc09wZXJhbmRUeXBlLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRFcXVhbHNPcGVyYW5kVHlwZSgKICAgIENvbnN0YW50IF9jb25zdGFudCwgRGFydFR5cGUgX3R5cGUpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IGNvbnN0YW50UGFydHMgPSBsYWJlbGVyLmxhYmVsQ29uc3RhbnQoX2NvbnN0YW50KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIFN0cmluZyBjb25zdGFudCA9IGNvbnN0YW50UGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnN0RXZhbEludmFsaWRFcXVhbHNPcGVyYW5kVHlwZSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkJpbmFyeSBvcGVyYXRvciAnPT0nIHJlcXVpcmVzIHJlY2VpdmVyIGNvbnN0YW50ICcke2NvbnN0YW50fScgb2YgdHlwZSAnTnVsbCcsICdib29sJywgJ2ludCcsICdkb3VibGUnLCBvciAnU3RyaW5nJywgYnV0IHdhcyBvZiB0eXBlICcke3R5cGV9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeydjb25zdGFudCc6IF9jb25zdGFudCwgJ3R5cGUnOiBfdHlwZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIHN0cmluZywKICAgICAgICBDb25zdGFudAogICAgICAgICAgICBfY29uc3RhbnQpPiB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRNZXRob2RJbnZvY2F0aW9uID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBDb25zdGFudCBfY29uc3RhbnQpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIG1ldGhvZCAnI3N0cmluZycgY2FuJ3QgYmUgaW52b2tlZCBvbiAnI2NvbnN0YW50JyB3aXRoaW4gYSBjb25zdCBjb250ZXh0LiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZE1ldGhvZEludm9jYXRpb24pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIENvbnN0YW50IF9jb25zdGFudCk+CiAgICBjb2RlQ29uc3RFdmFsSW52YWxpZE1ldGhvZEludm9jYXRpb24gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIENvbnN0YW50IF9jb25zdGFudCk+KAogICAgICAgICJDb25zdEV2YWxJbnZhbGlkTWV0aG9kSW52b2NhdGlvbiIsCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkTWV0aG9kSW52b2NhdGlvbiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5ERUZJTkVEX09QRVJBVE9SIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRNZXRob2RJbnZvY2F0aW9uKAogICAgU3RyaW5nIHN0cmluZywgQ29uc3RhbnQgX2NvbnN0YW50KSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IGNvbnN0YW50UGFydHMgPSBsYWJlbGVyLmxhYmVsQ29uc3RhbnQoX2NvbnN0YW50KTsKICBTdHJpbmcgY29uc3RhbnQgPSBjb25zdGFudFBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnN0RXZhbEludmFsaWRNZXRob2RJbnZvY2F0aW9uLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIG1ldGhvZCAnJHtzdHJpbmd9JyBjYW4ndCBiZSBpbnZva2VkIG9uICcke2NvbnN0YW50fScgd2l0aGluIGEgY29uc3QgY29udGV4dC4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmcsICdjb25zdGFudCc6IF9jb25zdGFudH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIHN0cmluZywKICAgICAgICBDb25zdGFudAogICAgICAgICAgICBfY29uc3RhbnQpPiB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRQcm9wZXJ0eUdldCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgQ29uc3RhbnQgX2NvbnN0YW50KT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBwcm9wZXJ0eSAnI3N0cmluZycgY2FuJ3QgYmUgYWNjZXNzZWQgb24gJyNjb25zdGFudCcgd2l0aGluIGEgY29uc3QgY29udGV4dC4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRQcm9wZXJ0eUdldCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgQ29uc3RhbnQgX2NvbnN0YW50KT4KICAgIGNvZGVDb25zdEV2YWxJbnZhbGlkUHJvcGVydHlHZXQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIENvbnN0YW50IF9jb25zdGFudCk+KAogICAgICAgICJDb25zdEV2YWxJbnZhbGlkUHJvcGVydHlHZXQiLCB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRQcm9wZXJ0eUdldCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09OU1RfRVZBTF9USFJPV1NfRVhDRVBUSU9OIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRQcm9wZXJ0eUdldCgKICAgIFN0cmluZyBzdHJpbmcsIENvbnN0YW50IF9jb25zdGFudCkgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiBjb25zdGFudFBhcnRzID0gbGFiZWxlci5sYWJlbENvbnN0YW50KF9jb25zdGFudCk7CiAgU3RyaW5nIGNvbnN0YW50ID0gY29uc3RhbnRQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDb25zdEV2YWxJbnZhbGlkUHJvcGVydHlHZXQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgcHJvcGVydHkgJyR7c3RyaW5nfScgY2FuJ3QgYmUgYWNjZXNzZWQgb24gJyR7Y29uc3RhbnR9JyB3aXRoaW4gYSBjb25zdCBjb250ZXh0LiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZywgJ2NvbnN0YW50JzogX2NvbnN0YW50fSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFN0YXRpY0ludm9jYXRpb24gPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBpbnZvY2F0aW9uIG9mICcjbmFtZScgaXMgbm90IGFsbG93ZWQgd2l0aGluIGEgY29uc3QgY29udGV4dC4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRTdGF0aWNJbnZvY2F0aW9uKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVDb25zdEV2YWxJbnZhbGlkU3RhdGljSW52b2NhdGlvbiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQ29uc3RFdmFsSW52YWxpZFN0YXRpY0ludm9jYXRpb24iLAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFN0YXRpY0ludm9jYXRpb24sCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTlNUX0lOSVRJQUxJWkVEX1dJVEhfTk9OX0NPTlNUQU5UX1ZBTFVFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRTdGF0aWNJbnZvY2F0aW9uKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RFdmFsSW52YWxpZFN0YXRpY0ludm9jYXRpb24sCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgaW52b2NhdGlvbiBvZiAnJHtuYW1lfScgaXMgbm90IGFsbG93ZWQgd2l0aGluIGEgY29uc3QgY29udGV4dC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCk+CiAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRTdHJpbmdJbnRlcnBvbGF0aW9uT3BlcmFuZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlRoZSAnI2NvbnN0YW50JyBjYW4ndCBiZSB1c2VkIGFzIHBhcnQgb2YgYSBzdHJpbmcgaW50ZXJwb2xhdGlvbiB3aXRoaW4gYSBjb25zdCBjb250ZXh0LCBvbmx5IHZhbHVlcyBvZiB0eXBlICdudWxsJywgJ2Jvb2wnLCAnaW50JywgJ2RvdWJsZScsIG9yICdTdHJpbmcnIGNhbiBiZSB1c2VkLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOgogICAgICAgICAgICBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRTdHJpbmdJbnRlcnBvbGF0aW9uT3BlcmFuZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50KT4KICAgIGNvZGVDb25zdEV2YWxJbnZhbGlkU3RyaW5nSW50ZXJwb2xhdGlvbk9wZXJhbmQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCk+KAogICAgICAgICJDb25zdEV2YWxJbnZhbGlkU3RyaW5nSW50ZXJwb2xhdGlvbk9wZXJhbmQiLAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFN0cmluZ0ludGVycG9sYXRpb25PcGVyYW5kLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJDT05TVF9FVkFMX1RZUEVfQk9PTF9OVU1fU1RSSU5HIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRTdHJpbmdJbnRlcnBvbGF0aW9uT3BlcmFuZCgKICAgIENvbnN0YW50IF9jb25zdGFudCkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gY29uc3RhbnRQYXJ0cyA9IGxhYmVsZXIubGFiZWxDb25zdGFudChfY29uc3RhbnQpOwogIFN0cmluZyBjb25zdGFudCA9IGNvbnN0YW50UGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RFdmFsSW52YWxpZFN0cmluZ0ludGVycG9sYXRpb25PcGVyYW5kLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlICcke2NvbnN0YW50fScgY2FuJ3QgYmUgdXNlZCBhcyBwYXJ0IG9mIGEgc3RyaW5nIGludGVycG9sYXRpb24gd2l0aGluIGEgY29uc3QgY29udGV4dCwgb25seSB2YWx1ZXMgb2YgdHlwZSAnbnVsbCcsICdib29sJywgJ2ludCcsICdkb3VibGUnLCBvciAnU3RyaW5nJyBjYW4gYmUgdXNlZC4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeydjb25zdGFudCc6IF9jb25zdGFudH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgQ29uc3RhbnQKICAgICAgICAgICAgX2NvbnN0YW50KT4gdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkU3ltYm9sTmFtZSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50KT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBzeW1ib2wgbmFtZSBtdXN0IGJlIGEgdmFsaWQgcHVibGljIERhcnQgbWVtYmVyIG5hbWUsIHB1YmxpYyBjb25zdHJ1Y3RvciBuYW1lLCBvciBsaWJyYXJ5IG5hbWUsIG9wdGlvbmFsbHkgcXVhbGlmaWVkLCBidXQgd2FzICcjY29uc3RhbnQnLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZFN5bWJvbE5hbWUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCk+CiAgICBjb2RlQ29uc3RFdmFsSW52YWxpZFN5bWJvbE5hbWUgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCk+KAogICAgICAgICJDb25zdEV2YWxJbnZhbGlkU3ltYm9sTmFtZSIsIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFN5bWJvbE5hbWUsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTlNUX0VWQUxfVEhST1dTX0VYQ0VQVElPTiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25zdEV2YWxJbnZhbGlkU3ltYm9sTmFtZShDb25zdGFudCBfY29uc3RhbnQpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IGNvbnN0YW50UGFydHMgPSBsYWJlbGVyLmxhYmVsQ29uc3RhbnQoX2NvbnN0YW50KTsKICBTdHJpbmcgY29uc3RhbnQgPSBjb25zdGFudFBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnN0RXZhbEludmFsaWRTeW1ib2xOYW1lLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIHN5bWJvbCBuYW1lIG11c3QgYmUgYSB2YWxpZCBwdWJsaWMgRGFydCBtZW1iZXIgbmFtZSwgcHVibGljIGNvbnN0cnVjdG9yIG5hbWUsIG9yIGxpYnJhcnkgbmFtZSwgb3B0aW9uYWxseSBxdWFsaWZpZWQsIGJ1dCB3YXMgJyR7Y29uc3RhbnR9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeydjb25zdGFudCc6IF9jb25zdGFudH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgQ29uc3RhbnQgX2NvbnN0YW50LAogICAgICAgIERhcnRUeXBlIF90eXBlLAogICAgICAgIERhcnRUeXBlCiAgICAgICAgICAgIF90eXBlMik+IHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFR5cGUgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCwgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJFeHBlY3RlZCBjb25zdGFudCAnI2NvbnN0YW50JyB0byBiZSBvZiB0eXBlICcjdHlwZScsIGJ1dCB3YXMgb2YgdHlwZSAnI3R5cGUyJy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRUeXBlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihDb25zdGFudCBfY29uc3RhbnQsIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZUNvbnN0RXZhbEludmFsaWRUeXBlID0gY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCwgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICJDb25zdEV2YWxJbnZhbGlkVHlwZSIsCiAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkVHlwZSwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25zdEV2YWxJbnZhbGlkVHlwZSgKICAgIENvbnN0YW50IF9jb25zdGFudCwgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMikgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gY29uc3RhbnRQYXJ0cyA9IGxhYmVsZXIubGFiZWxDb25zdGFudChfY29uc3RhbnQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIFN0cmluZyBjb25zdGFudCA9IGNvbnN0YW50UGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnN0RXZhbEludmFsaWRUeXBlLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiRXhwZWN0ZWQgY29uc3RhbnQgJyR7Y29uc3RhbnR9JyB0byBiZSBvZiB0eXBlICcke3R5cGV9JywgYnV0IHdhcyBvZiB0eXBlICcke3R5cGUyfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsnY29uc3RhbnQnOiBfY29uc3RhbnQsICd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb25zdEV2YWxJdGVyYXRpb25JbkNvbnN0TGlzdCA9CiAgICBtZXNzYWdlQ29uc3RFdmFsSXRlcmF0aW9uSW5Db25zdExpc3Q7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RFdmFsSXRlcmF0aW9uSW5Db25zdExpc3QgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb25zdEV2YWxJdGVyYXRpb25JbkNvbnN0TGlzdCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9OX0NPTlNUQU5UX0xJU1RfRUxFTUVOVCJdLAogICAgbWVzc2FnZTogciIiIkl0ZXJhdGlvbiBjYW4ndCBiZSB1c2VkIGluIGEgY29uc3RhbnQgbGlzdC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RFdmFsSXRlcmF0aW9uSW5Db25zdE1hcCA9CiAgICBtZXNzYWdlQ29uc3RFdmFsSXRlcmF0aW9uSW5Db25zdE1hcDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdEV2YWxJdGVyYXRpb25JbkNvbnN0TWFwID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29uc3RFdmFsSXRlcmF0aW9uSW5Db25zdE1hcCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9OX0NPTlNUQU5UX01BUF9FTEVNRU5UIl0sCiAgICBtZXNzYWdlOiByIiIiSXRlcmF0aW9uIGNhbid0IGJlIHVzZWQgaW4gYSBjb25zdGFudCBtYXAuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0RXZhbEl0ZXJhdGlvbkluQ29uc3RTZXQgPQogICAgbWVzc2FnZUNvbnN0RXZhbEl0ZXJhdGlvbkluQ29uc3RTZXQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RFdmFsSXRlcmF0aW9uSW5Db25zdFNldCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNvbnN0RXZhbEl0ZXJhdGlvbkluQ29uc3RTZXQiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PTl9DT05TVEFOVF9TRVRfRUxFTUVOVCJdLAogICAgbWVzc2FnZTogciIiIkl0ZXJhdGlvbiBjYW4ndCBiZSB1c2VkIGluIGEgY29uc3RhbnQgc2V0LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCk+CiAgICB0ZW1wbGF0ZUNvbnN0RXZhbEtleUltcGxlbWVudHNFcXVhbCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlRoZSBrZXkgJyNjb25zdGFudCcgZG9lcyBub3QgaGF2ZSBhIHByaW1pdGl2ZSBvcGVyYXRvciAnPT0nLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEtleUltcGxlbWVudHNFcXVhbCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50KT4KICAgIGNvZGVDb25zdEV2YWxLZXlJbXBsZW1lbnRzRXF1YWwgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCk+KAogICAgICAgICJDb25zdEV2YWxLZXlJbXBsZW1lbnRzRXF1YWwiLCB0ZW1wbGF0ZUNvbnN0RXZhbEtleUltcGxlbWVudHNFcXVhbCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsKICAgICAgIkNPTlNUX01BUF9LRVlfRVhQUkVTU0lPTl9UWVBFX0lNUExFTUVOVFNfRVFVQUxTIgogICAgXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ29uc3RFdmFsS2V5SW1wbGVtZW50c0VxdWFsKENvbnN0YW50IF9jb25zdGFudCkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gY29uc3RhbnRQYXJ0cyA9IGxhYmVsZXIubGFiZWxDb25zdGFudChfY29uc3RhbnQpOwogIFN0cmluZyBjb25zdGFudCA9IGNvbnN0YW50UGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RFdmFsS2V5SW1wbGVtZW50c0VxdWFsLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIGtleSAnJHtjb25zdGFudH0nIGRvZXMgbm90IGhhdmUgYSBwcmltaXRpdmUgb3BlcmF0b3IgJz09Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeydjb25zdGFudCc6IF9jb25zdGFudH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIHN0cmluZywKICAgICAgICBTdHJpbmcgc3RyaW5nMiwKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgc3RyaW5nMyk+IHRlbXBsYXRlQ29uc3RFdmFsTmVnYXRpdmVTaGlmdCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIsIFN0cmluZyBzdHJpbmczKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkJpbmFyeSBvcGVyYXRvciAnI3N0cmluZycgb24gJyNzdHJpbmcyJyByZXF1aXJlcyBub24tbmVnYXRpdmUgb3BlcmFuZCwgYnV0IHdhcyAnI3N0cmluZzMnLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uc3RFdmFsTmVnYXRpdmVTaGlmdCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIsIFN0cmluZyBzdHJpbmczKT4KICAgIGNvZGVDb25zdEV2YWxOZWdhdGl2ZVNoaWZ0ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIHN0cmluZzMpPigKICAiQ29uc3RFdmFsTmVnYXRpdmVTaGlmdCIsCiAgdGVtcGxhdGVDb25zdEV2YWxOZWdhdGl2ZVNoaWZ0LAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbE5lZ2F0aXZlU2hpZnQoCiAgICBTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIHN0cmluZzMpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIGlmIChzdHJpbmcyLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIGlmIChzdHJpbmczLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RFdmFsTmVnYXRpdmVTaGlmdCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkJpbmFyeSBvcGVyYXRvciAnJHtzdHJpbmd9JyBvbiAnJHtzdHJpbmcyfScgcmVxdWlyZXMgbm9uLW5lZ2F0aXZlIG9wZXJhbmQsIGJ1dCB3YXMgJyR7c3RyaW5nM30nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZywgJ3N0cmluZzInOiBzdHJpbmcyLCAnc3RyaW5nMyc6IHN0cmluZzN9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZwogICAgICAgICAgICBzdHJpbmcpPiB0ZW1wbGF0ZUNvbnN0RXZhbE5vbkNvbnN0YW50TGl0ZXJhbCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJDYW4ndCBoYXZlIGEgbm9uLWNvbnN0YW50ICNzdHJpbmcgbGl0ZXJhbCB3aXRoaW4gYSBjb25zdCBjb250ZXh0LiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uc3RFdmFsTm9uQ29uc3RhbnRMaXRlcmFsKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gY29kZUNvbnN0RXZhbE5vbkNvbnN0YW50TGl0ZXJhbCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgICJDb25zdEV2YWxOb25Db25zdGFudExpdGVyYWwiLCB0ZW1wbGF0ZUNvbnN0RXZhbE5vbkNvbnN0YW50TGl0ZXJhbCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9OX0NPTlNUQU5UX0RFRkFVTFRfVkFMVUUiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ29uc3RFdmFsTm9uQ29uc3RhbnRMaXRlcmFsKFN0cmluZyBzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RFdmFsTm9uQ29uc3RhbnRMaXRlcmFsLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQ2FuJ3QgaGF2ZSBhIG5vbi1jb25zdGFudCAke3N0cmluZ30gbGl0ZXJhbCB3aXRoaW4gYSBjb25zdCBjb250ZXh0LiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZ30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIHN0cmluZyk+IHRlbXBsYXRlQ29uc3RFdmFsTm9uQ29uc3RhbnRWYXJpYWJsZUdldCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgdmFyaWFibGUgJyNzdHJpbmcnIGlzIG5vdCBhIGNvbnN0YW50LCBvbmx5IGNvbnN0YW50IGV4cHJlc3Npb25zIGFyZSBhbGxvd2VkLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uc3RFdmFsTm9uQ29uc3RhbnRWYXJpYWJsZUdldCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+CiAgICBjb2RlQ29uc3RFdmFsTm9uQ29uc3RhbnRWYXJpYWJsZUdldCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgICJDb25zdEV2YWxOb25Db25zdGFudFZhcmlhYmxlR2V0IiwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbE5vbkNvbnN0YW50VmFyaWFibGVHZXQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PTl9DT05TVEFOVF9WQUxVRV9JTl9JTklUSUFMSVpFUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25zdEV2YWxOb25Db25zdGFudFZhcmlhYmxlR2V0KFN0cmluZyBzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RFdmFsTm9uQ29uc3RhbnRWYXJpYWJsZUdldCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSB2YXJpYWJsZSAnJHtzdHJpbmd9JyBpcyBub3QgYSBjb25zdGFudCwgb25seSBjb25zdGFudCBleHByZXNzaW9ucyBhcmUgYWxsb3dlZC4iIiIsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmd9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RFdmFsTm90TGlzdE9yU2V0SW5TcHJlYWQgPQogICAgbWVzc2FnZUNvbnN0RXZhbE5vdExpc3RPclNldEluU3ByZWFkOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0RXZhbE5vdExpc3RPclNldEluU3ByZWFkID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29uc3RFdmFsTm90TGlzdE9yU2V0SW5TcHJlYWQiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTlNUX1NQUkVBRF9FWFBFQ1RFRF9MSVNUX09SX1NFVCJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiT25seSBsaXN0cyBhbmQgc2V0cyBjYW4gYmUgdXNlZCBpbiBzcHJlYWRzIGluIGNvbnN0YW50IGxpc3RzIGFuZCBzZXRzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb25zdEV2YWxOb3RNYXBJblNwcmVhZCA9IG1lc3NhZ2VDb25zdEV2YWxOb3RNYXBJblNwcmVhZDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdEV2YWxOb3RNYXBJblNwcmVhZCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNvbnN0RXZhbE5vdE1hcEluU3ByZWFkIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJDT05TVF9TUFJFQURfRVhQRUNURURfTUFQIl0sCiAgICBtZXNzYWdlOiByIiIiT25seSBtYXBzIGNhbiBiZSB1c2VkIGluIHNwcmVhZHMgaW4gY29uc3RhbnQgbWFwcy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RFdmFsTnVsbFZhbHVlID0gbWVzc2FnZUNvbnN0RXZhbE51bGxWYWx1ZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdEV2YWxOdWxsVmFsdWUgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb25zdEV2YWxOdWxsVmFsdWUiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTlNUX0VWQUxfVEhST1dTX0VYQ0VQVElPTiJdLAogICAgbWVzc2FnZTogciIiIk51bGwgdmFsdWUgZHVyaW5nIGNvbnN0YW50IGV2YWx1YXRpb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgc3RyaW5nLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBzdHJpbmcyKT4gdGVtcGxhdGVDb25zdEV2YWxaZXJvRGl2aXNvciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiQmluYXJ5IG9wZXJhdG9yICcjc3RyaW5nJyBvbiAnI3N0cmluZzInIHJlcXVpcmVzIG5vbi16ZXJvIGRpdmlzb3IsIGJ1dCBkaXZpc29yIHdhcyAnMCcuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDb25zdEV2YWxaZXJvRGl2aXNvcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPgogICAgY29kZUNvbnN0RXZhbFplcm9EaXZpc29yID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMik+KAogICAgICAgICJDb25zdEV2YWxaZXJvRGl2aXNvciIsIHRlbXBsYXRlQ29uc3RFdmFsWmVyb0Rpdmlzb3IsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTlNUX0VWQUxfVEhST1dTX0lEQlpFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbFplcm9EaXZpc29yKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICBpZiAoc3RyaW5nMi5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnN0RXZhbFplcm9EaXZpc29yLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQmluYXJ5IG9wZXJhdG9yICcke3N0cmluZ30nIG9uICcke3N0cmluZzJ9JyByZXF1aXJlcyBub24temVybyBkaXZpc29yLCBidXQgZGl2aXNvciB3YXMgJzAnLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZywgJ3N0cmluZzInOiBzdHJpbmcyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0RmFjdG9yeSA9IG1lc3NhZ2VDb25zdEZhY3Rvcnk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RGYWN0b3J5ID0gY29uc3QgTWVzc2FnZUNvZGUoIkNvbnN0RmFjdG9yeSIsCiAgICBpbmRleDogNjIsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJPbmx5IHJlZGlyZWN0aW5nIGZhY3RvcnkgY29uc3RydWN0b3JzIGNhbiBiZSBkZWNsYXJlZCB0byBiZSAnY29uc3QnLiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiVHJ5IHJlbW92aW5nIHRoZSAnY29uc3QnIGtleXdvcmQsIG9yIHJlcGxhY2luZyB0aGUgYm9keSB3aXRoICc9JyBmb2xsb3dlZCBieSBhIHZhbGlkIHRhcmdldC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RGYWN0b3J5UmVkaXJlY3Rpb25Ub05vbkNvbnN0ID0KICAgIG1lc3NhZ2VDb25zdEZhY3RvcnlSZWRpcmVjdGlvblRvTm9uQ29uc3Q7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RGYWN0b3J5UmVkaXJlY3Rpb25Ub05vbkNvbnN0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29uc3RGYWN0b3J5UmVkaXJlY3Rpb25Ub05vbkNvbnN0IiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJSRURJUkVDVF9UT19OT05fQ09OU1RfQ09OU1RSVUNUT1IiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkNvbnN0YW50IGZhY3RvcnkgY29uc3RydWN0b3IgY2FuJ3QgZGVsZWdhdGUgdG8gYSBub24tY29uc3RhbnQgY29uc3RydWN0b3IuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgcmVkaXJlY3RpbmcgdG8gYSBkaWZmZXJlbnQgY29uc3RydWN0b3Igb3IgbWFya2luZyB0aGUgdGFyZ2V0IGNvbnN0cnVjdG9yICdjb25zdCcuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlQ29uc3RGaWVsZFdpdGhvdXRJbml0aWFsaXplciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlRoZSBjb25zdCB2YXJpYWJsZSAnI25hbWUnIG11c3QgYmUgaW5pdGlhbGl6ZWQuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBhZGRpbmcgYW4gaW5pdGlhbGl6ZXIgKCc9IDxleHByZXNzaW9uPicpIHRvIHRoZSBkZWNsYXJhdGlvbi4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnN0RmllbGRXaXRob3V0SW5pdGlhbGl6ZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUNvbnN0RmllbGRXaXRob3V0SW5pdGlhbGl6ZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkNvbnN0RmllbGRXaXRob3V0SW5pdGlhbGl6ZXIiLCB0ZW1wbGF0ZUNvbnN0RmllbGRXaXRob3V0SW5pdGlhbGl6ZXIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTlNUX05PVF9JTklUSUFMSVpFRCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25zdEZpZWxkV2l0aG91dEluaXRpYWxpemVyKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RGaWVsZFdpdGhvdXRJbml0aWFsaXplciwKICAgICAgbWVzc2FnZTogIiIiVGhlIGNvbnN0IHZhcmlhYmxlICcke25hbWV9JyBtdXN0IGJlIGluaXRpYWxpemVkLiIiIiwKICAgICAgdGlwOgogICAgICAgICAgIiIiVHJ5IGFkZGluZyBhbiBpbml0aWFsaXplciAoJz0gPGV4cHJlc3Npb24+JykgdG8gdGhlIGRlY2xhcmF0aW9uLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0SW5zdGFuY2VGaWVsZCA9IG1lc3NhZ2VDb25zdEluc3RhbmNlRmllbGQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RJbnN0YW5jZUZpZWxkID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29uc3RJbnN0YW5jZUZpZWxkIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJDT05TVF9JTlNUQU5DRV9GSUVMRCJdLAogICAgbWVzc2FnZTogciIiIk9ubHkgc3RhdGljIGZpZWxkcyBjYW4gYmUgZGVjbGFyZWQgYXMgY29uc3QuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgdXNpbmcgJ2ZpbmFsJyBpbnN0ZWFkIG9mICdjb25zdCcsIG9yIGFkZGluZyB0aGUga2V5d29yZCAnc3RhdGljJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RNZXRob2QgPSBtZXNzYWdlQ29uc3RNZXRob2Q7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RNZXRob2QgPSBjb25zdCBNZXNzYWdlQ29kZSgiQ29uc3RNZXRob2QiLAogICAgaW5kZXg6IDYzLAogICAgbWVzc2FnZToKICAgICAgICByIiIiR2V0dGVycywgc2V0dGVycyBhbmQgbWV0aG9kcyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSAnY29uc3QnLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyB0aGUgJ2NvbnN0JyBrZXl3b3JkLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb25zdHJ1Y3RvckN5Y2xpYyA9IG1lc3NhZ2VDb25zdHJ1Y3RvckN5Y2xpYzsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdHJ1Y3RvckN5Y2xpYyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNvbnN0cnVjdG9yQ3ljbGljIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJSRUNVUlNJVkVfQ09OU1RSVUNUT1JfUkVESVJFQ1QiXSwKICAgIG1lc3NhZ2U6IHIiIiJSZWRpcmVjdGluZyBjb25zdHJ1Y3RlcnMgY2FuJ3QgYmUgY3ljbGljLiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiVHJ5IHRvIGhhdmUgYWxsIGNvbnN0cnVjdG9ycyBldmVudHVhbGx5IHJlZGlyZWN0IHRvIGEgbm9uLXJlZGlyZWN0aW5nIGNvbnN0cnVjdG9yLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVDb25zdHJ1Y3Rvck5vdEZvdW5kID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDb3VsZG4ndCBmaW5kIGNvbnN0cnVjdG9yICcjbmFtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uc3RydWN0b3JOb3RGb3VuZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlQ29uc3RydWN0b3JOb3RGb3VuZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQ29uc3RydWN0b3JOb3RGb3VuZCIsIHRlbXBsYXRlQ29uc3RydWN0b3JOb3RGb3VuZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09OU1RSVUNUT1JfTk9UX0ZPVU5EIl0sCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ29uc3RydWN0b3JOb3RGb3VuZChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnN0cnVjdG9yTm90Rm91bmQsCiAgICAgIG1lc3NhZ2U6ICIiIkNvdWxkbid0IGZpbmQgY29uc3RydWN0b3IgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0cnVjdG9yTm90U3luYyA9IG1lc3NhZ2VDb25zdHJ1Y3Rvck5vdFN5bmM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RydWN0b3JOb3RTeW5jID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29uc3RydWN0b3JOb3RTeW5jIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJOT05fU1lOQ19DT05TVFJVQ1RPUiJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiQ29uc3RydWN0b3IgYm9kaWVzIGNhbid0IHVzZSAnYXN5bmMnLCAnYXN5bmMqJywgb3IgJ3N5bmMqJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RydWN0b3JXaXRoUmV0dXJuVHlwZSA9CiAgICBtZXNzYWdlQ29uc3RydWN0b3JXaXRoUmV0dXJuVHlwZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdHJ1Y3RvcldpdGhSZXR1cm5UeXBlID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29uc3RydWN0b3JXaXRoUmV0dXJuVHlwZSIsCiAgICBpbmRleDogNTUsCiAgICBtZXNzYWdlOiByIiIiQ29uc3RydWN0b3JzIGNhbid0IGhhdmUgYSByZXR1cm4gdHlwZS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlIHJldHVybiB0eXBlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb25zdHJ1Y3RvcldpdGhUeXBlQXJndW1lbnRzID0KICAgIG1lc3NhZ2VDb25zdHJ1Y3RvcldpdGhUeXBlQXJndW1lbnRzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0cnVjdG9yV2l0aFR5cGVBcmd1bWVudHMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb25zdHJ1Y3RvcldpdGhUeXBlQXJndW1lbnRzIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJXUk9OR19OVU1CRVJfT0ZfVFlQRV9BUkdVTUVOVFNfQ09OU1RSVUNUT1IiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkEgY29uc3RydWN0b3IgaW52b2NhdGlvbiBjYW4ndCBoYXZlIHR5cGUgYXJndW1lbnRzIG9uIHRoZSBjb25zdHJ1Y3RvciBuYW1lLiIiIiwKICAgIHRpcDogciIiIlRyeSB0byBwbGFjZSB0aGUgdHlwZSBhcmd1bWVudHMgb24gdGhlIGNsYXNzIG5hbWUuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0cnVjdG9yV2l0aFR5cGVQYXJhbWV0ZXJzID0KICAgIG1lc3NhZ2VDb25zdHJ1Y3RvcldpdGhUeXBlUGFyYW1ldGVyczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdHJ1Y3RvcldpdGhUeXBlUGFyYW1ldGVycyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNvbnN0cnVjdG9yV2l0aFR5cGVQYXJhbWV0ZXJzIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJUWVBFX1BBUkFNRVRFUl9PTl9DT05TVFJVQ1RPUiJdLAogICAgbWVzc2FnZTogciIiIkNvbnN0cnVjdG9ycyBjYW4ndCBoYXZlIHR5cGUgcGFyYW1ldGVycy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RydWN0b3JXaXRoV3JvbmdOYW1lID0gbWVzc2FnZUNvbnN0cnVjdG9yV2l0aFdyb25nTmFtZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdHJ1Y3RvcldpdGhXcm9uZ05hbWUgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb25zdHJ1Y3RvcldpdGhXcm9uZ05hbWUiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfQ09OU1RSVUNUT1JfTkFNRSJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiVGhlIG5hbWUgb2YgYSBjb25zdHJ1Y3RvciBtdXN0IG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBlbmNsb3NpbmcgY2xhc3MuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVDb25zdHJ1Y3RvcldpdGhXcm9uZ05hbWVDb250ZXh0ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJUaGUgbmFtZSBvZiB0aGUgZW5jbG9zaW5nIGNsYXNzIGlzICcjbmFtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uc3RydWN0b3JXaXRoV3JvbmdOYW1lQ29udGV4dCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlQ29uc3RydWN0b3JXaXRoV3JvbmdOYW1lQ29udGV4dCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigiQ29uc3RydWN0b3JXaXRoV3JvbmdOYW1lQ29udGV4dCIsCiAgICAgICAgdGVtcGxhdGVDb25zdHJ1Y3RvcldpdGhXcm9uZ05hbWVDb250ZXh0LAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25zdHJ1Y3RvcldpdGhXcm9uZ05hbWVDb250ZXh0KFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RydWN0b3JXaXRoV3JvbmdOYW1lQ29udGV4dCwKICAgICAgbWVzc2FnZTogIiIiVGhlIG5hbWUgb2YgdGhlIGVuY2xvc2luZyBjbGFzcyBpcyAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29udGludWVMYWJlbE5vdFRhcmdldCA9IG1lc3NhZ2VDb250aW51ZUxhYmVsTm90VGFyZ2V0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnRpbnVlTGFiZWxOb3RUYXJnZXQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb250aW51ZUxhYmVsTm90VGFyZ2V0IiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJMQUJFTF9VTkRFRklORUQiXSwKICAgIG1lc3NhZ2U6IHIiIiJUYXJnZXQgb2YgY29udGludWUgbXVzdCBiZSBhIGxhYmVsLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb250aW51ZU91dHNpZGVPZkxvb3AgPSBtZXNzYWdlQ29udGludWVPdXRzaWRlT2ZMb29wOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnRpbnVlT3V0c2lkZU9mTG9vcCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNvbnRpbnVlT3V0c2lkZU9mTG9vcCIsCiAgICBpbmRleDogMiwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkEgY29udGludWUgc3RhdGVtZW50IGNhbid0IGJlIHVzZWQgb3V0c2lkZSBvZiBhIGxvb3Agb3Igc3dpdGNoIHN0YXRlbWVudC4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGNvbnRpbnVlIHN0YXRlbWVudC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUNvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJDYW4ndCBjb250aW51ZSBhdCAnI25hbWUnIGluIGEgZGlmZmVyZW50IGZ1bmN0aW9uLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVDb250aW51ZVRhcmdldE91dHNpZGVGdW5jdGlvbiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQ29udGludWVUYXJnZXRPdXRzaWRlRnVuY3Rpb24iLCB0ZW1wbGF0ZUNvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJMQUJFTF9JTl9PVVRFUl9TQ09QRSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb250aW51ZVRhcmdldE91dHNpZGVGdW5jdGlvbihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uLAogICAgICBtZXNzYWdlOiAiIiJDYW4ndCBjb250aW51ZSBhdCAnJHtuYW1lfScgaW4gYSBkaWZmZXJlbnQgZnVuY3Rpb24uIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29udGludWVXaXRob3V0TGFiZWxJbkNhc2UgPQogICAgbWVzc2FnZUNvbnRpbnVlV2l0aG91dExhYmVsSW5DYXNlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnRpbnVlV2l0aG91dExhYmVsSW5DYXNlID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29udGludWVXaXRob3V0TGFiZWxJbkNhc2UiLAogICAgaW5kZXg6IDY0LAogICAgbWVzc2FnZToKICAgICAgICByIiIiQSBjb250aW51ZSBzdGF0ZW1lbnQgaW4gYSBzd2l0Y2ggc3RhdGVtZW50IG11c3QgaGF2ZSBhIGxhYmVsIGFzIGEgdGFyZ2V0LiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiVHJ5IGFkZGluZyBhIGxhYmVsIGFzc29jaWF0ZWQgd2l0aCBvbmUgb2YgdGhlIGNhc2UgY2xhdXNlcyB0byB0aGUgY29udGludWUgc3RhdGVtZW50LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4KICAgIHRlbXBsYXRlQ291bGROb3RQYXJzZVVyaSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiQ291bGRuJ3QgcGFyc2UgVVJJICcjc3RyaW5nJzoKICAjc3RyaW5nMi4iIiIsIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ291bGROb3RQYXJzZVVyaSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPgogICAgY29kZUNvdWxkTm90UGFyc2VVcmkgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4oCiAgIkNvdWxkTm90UGFyc2VVcmkiLAogIHRlbXBsYXRlQ291bGROb3RQYXJzZVVyaSwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb3VsZE5vdFBhcnNlVXJpKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICBpZiAoc3RyaW5nMi5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvdWxkTm90UGFyc2VVcmksCiAgICAgIG1lc3NhZ2U6ICIiIkNvdWxkbid0IHBhcnNlIFVSSSAnJHtzdHJpbmd9JzoKICAke3N0cmluZzJ9LiIiIiwgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZywgJ3N0cmluZzInOiBzdHJpbmcyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvdmFyaWFudEFmdGVyRmluYWwgPSBtZXNzYWdlQ292YXJpYW50QWZ0ZXJGaW5hbDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb3ZhcmlhbnRBZnRlckZpbmFsID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ292YXJpYW50QWZ0ZXJGaW5hbCIsCiAgICBpbmRleDogNjUsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJUaGUgbW9kaWZpZXIgJ2NvdmFyaWFudCcgc2hvdWxkIGJlIGJlZm9yZSB0aGUgbW9kaWZpZXIgJ2ZpbmFsJy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmUtb3JkZXJpbmcgdGhlIG1vZGlmaWVycy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ292YXJpYW50QWZ0ZXJWYXIgPSBtZXNzYWdlQ292YXJpYW50QWZ0ZXJWYXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ292YXJpYW50QWZ0ZXJWYXIgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb3ZhcmlhbnRBZnRlclZhciIsCiAgICBpbmRleDogOCwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIlRoZSBtb2RpZmllciAnY292YXJpYW50JyBzaG91bGQgYmUgYmVmb3JlIHRoZSBtb2RpZmllciAndmFyJy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmUtb3JkZXJpbmcgdGhlIG1vZGlmaWVycy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ292YXJpYW50QW5kU3RhdGljID0gbWVzc2FnZUNvdmFyaWFudEFuZFN0YXRpYzsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb3ZhcmlhbnRBbmRTdGF0aWMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb3ZhcmlhbnRBbmRTdGF0aWMiLAogICAgaW5kZXg6IDY2LAogICAgbWVzc2FnZToKICAgICAgICByIiIiTWVtYmVycyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSBib3RoICdjb3ZhcmlhbnQnIGFuZCAnc3RhdGljJy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgZWl0aGVyIHRoZSAnY292YXJpYW50JyBvciAnc3RhdGljJyBrZXl3b3JkLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb3ZhcmlhbnRNZW1iZXIgPSBtZXNzYWdlQ292YXJpYW50TWVtYmVyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvdmFyaWFudE1lbWJlciA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJDb3ZhcmlhbnRNZW1iZXIiLAogICAgaW5kZXg6IDY3LAogICAgbWVzc2FnZToKICAgICAgICByIiIiR2V0dGVycywgc2V0dGVycyBhbmQgbWV0aG9kcyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSAnY292YXJpYW50Jy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlICdjb3ZhcmlhbnQnIGtleXdvcmQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgc3RyaW5nKT4gdGVtcGxhdGVDeWNsZUluVHlwZVZhcmlhYmxlcyA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBzdHJpbmcpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlR5cGUgJyNuYW1lJyBpcyBhIGJvdW5kIG9mIGl0c2VsZiB2aWEgJyNzdHJpbmcnLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgYnJlYWtpbmcgdGhlIGN5Y2xlIGJ5IHJlbW92aW5nIGF0IGxlYXN0IG9uIG9mIHRoZSAnZXh0ZW5kcycgY2xhdXNlcyBpbiB0aGUgY3ljbGUuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDeWNsZUluVHlwZVZhcmlhYmxlcyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBzdHJpbmcpPgogICAgY29kZUN5Y2xlSW5UeXBlVmFyaWFibGVzID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHN0cmluZyk+KAogICAgICAgICJDeWNsZUluVHlwZVZhcmlhYmxlcyIsIHRlbXBsYXRlQ3ljbGVJblR5cGVWYXJpYWJsZXMsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlRZUEVfUEFSQU1FVEVSX1NVUEVSVFlQRV9PRl9JVFNfQk9VTkQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ3ljbGVJblR5cGVWYXJpYWJsZXMoU3RyaW5nIG5hbWUsIFN0cmluZyBzdHJpbmcpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUN5Y2xlSW5UeXBlVmFyaWFibGVzLAogICAgICBtZXNzYWdlOiAiIiJUeXBlICcke25hbWV9JyBpcyBhIGJvdW5kIG9mIGl0c2VsZiB2aWEgJyR7c3RyaW5nfScuIiIiLAogICAgICB0aXA6CiAgICAgICAgICAiIiJUcnkgYnJlYWtpbmcgdGhlIGN5Y2xlIGJ5IHJlbW92aW5nIGF0IGxlYXN0IG9uIG9mIHRoZSAnZXh0ZW5kcycgY2xhdXNlcyBpbiB0aGUgY3ljbGUuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICdzdHJpbmcnOiBzdHJpbmd9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlQ3ljbGljQ2xhc3NIaWVyYXJjaHkgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIicjbmFtZScgaXMgYSBzdXBlcnR5cGUgb2YgaXRzZWxmLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0N5Y2xpY0NsYXNzSGllcmFyY2h5KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVDeWNsaWNDbGFzc0hpZXJhcmNoeSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQ3ljbGljQ2xhc3NIaWVyYXJjaHkiLCB0ZW1wbGF0ZUN5Y2xpY0NsYXNzSGllcmFyY2h5LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJSRUNVUlNJVkVfSU5URVJGQUNFX0lOSEVSSVRBTkNFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0N5Y2xpY0NsYXNzSGllcmFyY2h5KFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ3ljbGljQ2xhc3NIaWVyYXJjaHksCiAgICAgIG1lc3NhZ2U6ICIiIicke25hbWV9JyBpcyBhIHN1cGVydHlwZSBvZiBpdHNlbGYuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUN5Y2xpY1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycyA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiQ3ljbGljIGRlZmluaXRpb24gb2YgZmFjdG9yeSAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0N5Y2xpY1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgY29kZUN5Y2xpY1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQ3ljbGljUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JzIiwKICAgICAgICB0ZW1wbGF0ZUN5Y2xpY1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycywKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUkVDVVJTSVZFX0ZBQ1RPUllfUkVESVJFQ1QiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ3ljbGljUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JzKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ3ljbGljUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JzLAogICAgICBtZXNzYWdlOiAiIiJDeWNsaWMgZGVmaW5pdGlvbiBvZiBmYWN0b3J5ICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVDeWNsaWNUeXBlZGVmID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJUaGUgdHlwZWRlZiAnI25hbWUnIGhhcyBhIHJlZmVyZW5jZSB0byBpdHNlbGYuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ3ljbGljVHlwZWRlZik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlQ3ljbGljVHlwZWRlZiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQ3ljbGljVHlwZWRlZiIsIHRlbXBsYXRlQ3ljbGljVHlwZWRlZiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVFlQRV9BTElBU19DQU5OT1RfUkVGRVJFTkNFX0lUU0VMRiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDeWNsaWNUeXBlZGVmKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ3ljbGljVHlwZWRlZiwKICAgICAgbWVzc2FnZTogIiIiVGhlIHR5cGVkZWYgJyR7bmFtZX0nIGhhcyBhIHJlZmVyZW5jZSB0byBpdHNlbGYuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVyID0KICAgIG1lc3NhZ2VEZWNsYXJlZE1lbWJlckNvbmZsaWN0c1dpdGhJbmhlcml0ZWRNZW1iZXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVyID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJEZWNsYXJlZE1lbWJlckNvbmZsaWN0c1dpdGhJbmhlcml0ZWRNZW1iZXIiLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJERUNMQVJFRF9NRU1CRVJfQ09ORkxJQ1RTX1dJVEhfSU5IRVJJVEVEIl0sCiAgICAgICAgbWVzc2FnZToKICAgICAgICAgICAgciIiIkNhbid0IGRlY2xhcmUgYSBtZW1iZXIgdGhhdCBjb25mbGljdHMgd2l0aCBhbiBpbmhlcml0ZWQgb25lLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVEZWNsYXJlZE1lbWJlckNvbmZsaWN0c1dpdGhJbmhlcml0ZWRNZW1iZXJDYXVzZSA9CiAgICBtZXNzYWdlRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVyQ2F1c2U7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVyQ2F1c2UgPQogICAgY29uc3QgTWVzc2FnZUNvZGUoIkRlY2xhcmVkTWVtYmVyQ29uZmxpY3RzV2l0aEluaGVyaXRlZE1lbWJlckNhdXNlIiwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCwKICAgICAgICBtZXNzYWdlOiByIiIiVGhpcyBpcyB0aGUgaW5oZXJpdGVkIG1lbWJlci4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZURlZmF1bHRWYWx1ZUluUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkNhbid0IGhhdmUgYSBkZWZhdWx0IHZhbHVlIGhlcmUgYmVjYXVzZSBhbnkgZGVmYXVsdCB2YWx1ZXMgb2YgJyNuYW1lJyB3b3VsZCBiZSB1c2VkIGluc3RlYWQuIiIiLAogICAgICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IHJlbW92aW5nIHRoZSBkZWZhdWx0IHZhbHVlLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOgogICAgICAgICAgICBfd2l0aEFyZ3VtZW50c0RlZmF1bHRWYWx1ZUluUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIGNvZGVEZWZhdWx0VmFsdWVJblJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJEZWZhdWx0VmFsdWVJblJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIiwKICAgICAgICB0ZW1wbGF0ZURlZmF1bHRWYWx1ZUluUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bCiAgICAgICJERUZBVUxUX1ZBTFVFX0lOX1JFRElSRUNUSU5HX0ZBQ1RPUllfQ09OU1RSVUNUT1IiCiAgICBdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEZWZhdWx0VmFsdWVJblJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRGVmYXVsdFZhbHVlSW5SZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkNhbid0IGhhdmUgYSBkZWZhdWx0IHZhbHVlIGhlcmUgYmVjYXVzZSBhbnkgZGVmYXVsdCB2YWx1ZXMgb2YgJyR7bmFtZX0nIHdvdWxkIGJlIHVzZWQgaW5zdGVhZC4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IHJlbW92aW5nIHRoZSBkZWZhdWx0IHZhbHVlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZURlZmVycmVkQWZ0ZXJQcmVmaXggPSBtZXNzYWdlRGVmZXJyZWRBZnRlclByZWZpeDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VEZWZlcnJlZEFmdGVyUHJlZml4ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRGVmZXJyZWRBZnRlclByZWZpeCIsCiAgICBpbmRleDogNjgsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJUaGUgZGVmZXJyZWQga2V5d29yZCBzaG91bGQgY29tZSBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIHByZWZpeCAoJ2FzJyBjbGF1c2UpLiIiIiwKICAgIHRpcDogciIiIlRyeSBtb3ZpbmcgdGhlIGRlZmVycmVkIGtleXdvcmQgYmVmb3JlIHRoZSBwcmVmaXguIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJDYW4ndCB1c2UgdGhlIG5hbWUgJyNuYW1lJyBmb3IgYSBkZWZlcnJlZCBsaWJyYXJ5LCBhcyB0aGUgbmFtZSBpcyB1c2VkIGVsc2V3aGVyZS4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0RlZmVycmVkUHJlZml4RHVwbGljYXRlZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWQiLCB0ZW1wbGF0ZURlZmVycmVkUHJlZml4RHVwbGljYXRlZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiU0hBUkVEX0RFRkVSUkVEX1BSRUZJWCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWQoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDYW4ndCB1c2UgdGhlIG5hbWUgJyR7bmFtZX0nIGZvciBhIGRlZmVycmVkIGxpYnJhcnksIGFzIHRoZSBuYW1lIGlzIHVzZWQgZWxzZXdoZXJlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWRDYXVzZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiJyNuYW1lJyBpcyB1c2VkIGhlcmUuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkQ2F1c2UpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZURlZmVycmVkUHJlZml4RHVwbGljYXRlZENhdXNlID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWRDYXVzZSIsIHRlbXBsYXRlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkQ2F1c2UsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0RlZmVycmVkUHJlZml4RHVwbGljYXRlZENhdXNlKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkQ2F1c2UsCiAgICAgIG1lc3NhZ2U6ICIiIicke25hbWV9JyBpcyB1c2VkIGhlcmUuIiIiLCBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIERhcnRUeXBlIF90eXBlLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lKT4gdGVtcGxhdGVEZWZlcnJlZFR5cGVBbm5vdGF0aW9uID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIHR5cGUgJyN0eXBlJyBpcyBkZWZlcnJlZCBsb2FkZWQgdmlhIHByZWZpeCAnI25hbWUnIGFuZCBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZSBhbm5vdGF0aW9uLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgcmVtb3ZpbmcgJ2RlZmVycmVkJyBmcm9tIHRoZSBpbXBvcnQgb2YgJyNuYW1lJyBvciB1c2UgYSBzdXBlcnR5cGUgb2YgJyN0eXBlJyB0aGF0IGlzbid0IGRlZmVycmVkLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRGVmZXJyZWRUeXBlQW5ub3RhdGlvbik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIFN0cmluZyBuYW1lKT4KICAgIGNvZGVEZWZlcnJlZFR5cGVBbm5vdGF0aW9uID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgU3RyaW5nIG5hbWUpPigKICAgICAgICAiRGVmZXJyZWRUeXBlQW5ub3RhdGlvbiIsIHRlbXBsYXRlRGVmZXJyZWRUeXBlQW5ub3RhdGlvbiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVFlQRV9BTk5PVEFUSU9OX0RFRkVSUkVEX0NMQVNTIl0sCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRGVmZXJyZWRUeXBlQW5ub3RhdGlvbihEYXJ0VHlwZSBfdHlwZSwgU3RyaW5nIG5hbWUpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRGVmZXJyZWRUeXBlQW5ub3RhdGlvbiwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSB0eXBlICcke3R5cGV9JyBpcyBkZWZlcnJlZCBsb2FkZWQgdmlhIHByZWZpeCAnJHtuYW1lfScgYW5kIGNhbid0IGJlIHVzZWQgYXMgYSB0eXBlIGFubm90YXRpb24uIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6ICIiIlRyeSByZW1vdmluZyAnZGVmZXJyZWQnIGZyb20gdGhlIGltcG9ydCBvZiAnJHtuYW1lfScgb3IgdXNlIGEgc3VwZXJ0eXBlIG9mICcke3R5cGV9JyB0aGF0IGlzbid0IGRlZmVycmVkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIGludCBjb3VudCwgaW50IGNvdW50MiwgbnVtIF9udW0xLCBudW0gX251bTIsIG51bSBfbnVtMyk+CiAgICB0ZW1wbGF0ZURpbGxPdXRsaW5lU3VtbWFyeSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgY291bnQyLCBudW0gX251bTEsIG51bSBfbnVtMiwgbnVtIF9udW0zKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiSW5kZXhlZCAjY291bnQgbGlicmFyaWVzICgjY291bnQyIGJ5dGVzKSBpbiAjbnVtMSUuM21zLCB0aGF0IGlzLAojbnVtMiUxMi4zIGJ5dGVzL21zLCBhbmQKI251bTMlMTIuMyBtcy9saWJyYXJpZXMuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRGlsbE91dGxpbmVTdW1tYXJ5KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKGludCBjb3VudCwgaW50IGNvdW50MiwgbnVtIF9udW0xLCBudW0gX251bTIsCiAgICAgICAgbnVtIF9udW0zKT4gY29kZURpbGxPdXRsaW5lU3VtbWFyeSA9IGNvbnN0IENvZGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKGludCBjb3VudCwgaW50IGNvdW50MiwgbnVtIF9udW0xLCBudW0gX251bTIsIG51bSBfbnVtMyk+KAogICJEaWxsT3V0bGluZVN1bW1hcnkiLAogIHRlbXBsYXRlRGlsbE91dGxpbmVTdW1tYXJ5LAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0RpbGxPdXRsaW5lU3VtbWFyeSgKICAgIGludCBjb3VudCwgaW50IGNvdW50MiwgbnVtIF9udW0xLCBudW0gX251bTIsIG51bSBfbnVtMykgewogIGlmIChjb3VudCA9PSBudWxsKSB0aHJvdyAnTm8gY291bnQgcHJvdmlkZWQnOwogIGlmIChjb3VudDIgPT0gbnVsbCkgdGhyb3cgJ05vIGNvdW50IHByb3ZpZGVkJzsKICBpZiAoX251bTEgPT0gbnVsbCkgdGhyb3cgJ05vIG51bWJlciBwcm92aWRlZCc7CiAgU3RyaW5nIG51bTEgPSBfbnVtMS50b1N0cmluZ0FzRml4ZWQoMyk7CiAgaWYgKF9udW0yID09IG51bGwpIHRocm93ICdObyBudW1iZXIgcHJvdmlkZWQnOwogIFN0cmluZyBudW0yID0gX251bTIudG9TdHJpbmdBc0ZpeGVkKDMpLnBhZExlZnQoMTIpOwogIGlmIChfbnVtMyA9PSBudWxsKSB0aHJvdyAnTm8gbnVtYmVyIHByb3ZpZGVkJzsKICBTdHJpbmcgbnVtMyA9IF9udW0zLnRvU3RyaW5nQXNGaXhlZCgzKS5wYWRMZWZ0KDEyKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZURpbGxPdXRsaW5lU3VtbWFyeSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkluZGV4ZWQgJHtjb3VudH0gbGlicmFyaWVzICgke2NvdW50Mn0gYnl0ZXMpIGluICR7bnVtMX1tcywgdGhhdCBpcywKJHtudW0yfSBieXRlcy9tcywgYW5kCiR7bnVtM30gbXMvbGlicmFyaWVzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7CiAgICAgICAgJ2NvdW50JzogY291bnQsCiAgICAgICAgJ2NvdW50Mic6IGNvdW50MiwKICAgICAgICAnbnVtMSc6IF9udW0xLAogICAgICAgICdudW0yJzogX251bTIsCiAgICAgICAgJ251bTMnOiBfbnVtMwogICAgICB9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lKT4gdGVtcGxhdGVEaXJlY3RDeWNsZUluVHlwZVZhcmlhYmxlcyA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlR5cGUgJyNuYW1lJyBjYW4ndCB1c2UgaXRzZWxmIGFzIGEgYm91bmQuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBicmVha2luZyB0aGUgY3ljbGUgYnkgcmVtb3ZpbmcgYXQgbGVhc3Qgb24gb2YgdGhlICdleHRlbmRzJyBjbGF1c2VzIGluIHRoZSBjeWNsZS4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0RpcmVjdEN5Y2xlSW5UeXBlVmFyaWFibGVzKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVEaXJlY3RDeWNsZUluVHlwZVZhcmlhYmxlcyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiRGlyZWN0Q3ljbGVJblR5cGVWYXJpYWJsZXMiLCB0ZW1wbGF0ZURpcmVjdEN5Y2xlSW5UeXBlVmFyaWFibGVzLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJUWVBFX1BBUkFNRVRFUl9TVVBFUlRZUEVfT0ZfSVRTX0JPVU5EIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0RpcmVjdEN5Y2xlSW5UeXBlVmFyaWFibGVzKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRGlyZWN0Q3ljbGVJblR5cGVWYXJpYWJsZXMsCiAgICAgIG1lc3NhZ2U6ICIiIlR5cGUgJyR7bmFtZX0nIGNhbid0IHVzZSBpdHNlbGYgYXMgYSBib3VuZC4iIiIsCiAgICAgIHRpcDoKICAgICAgICAgICIiIlRyeSBicmVha2luZyB0aGUgY3ljbGUgYnkgcmVtb3ZpbmcgYXQgbGVhc3Qgb24gb2YgdGhlICdleHRlbmRzJyBjbGF1c2VzIGluIHRoZSBjeWNsZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVEaXJlY3RpdmVBZnRlckRlY2xhcmF0aW9uID0KICAgIG1lc3NhZ2VEaXJlY3RpdmVBZnRlckRlY2xhcmF0aW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZURpcmVjdGl2ZUFmdGVyRGVjbGFyYXRpb24gPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJEaXJlY3RpdmVBZnRlckRlY2xhcmF0aW9uIiwKICAgIGluZGV4OiA2OSwKICAgIG1lc3NhZ2U6IHIiIiJEaXJlY3RpdmVzIG11c3QgYXBwZWFyIGJlZm9yZSBhbnkgZGVjbGFyYXRpb25zLiIiIiwKICAgIHRpcDogciIiIlRyeSBtb3ZpbmcgdGhlIGRpcmVjdGl2ZSBiZWZvcmUgYW55IGRlY2xhcmF0aW9ucy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRHVwbGljYXRlRGVmZXJyZWQgPSBtZXNzYWdlRHVwbGljYXRlRGVmZXJyZWQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRHVwbGljYXRlRGVmZXJyZWQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJEdXBsaWNhdGVEZWZlcnJlZCIsCiAgICBpbmRleDogNzEsCiAgICBtZXNzYWdlOiByIiIiQW4gaW1wb3J0IGRpcmVjdGl2ZSBjYW4gb25seSBoYXZlIG9uZSAnZGVmZXJyZWQnIGtleXdvcmQuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nIGFsbCBidXQgb25lICdkZWZlcnJlZCcga2V5d29yZC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUR1cGxpY2F0ZUxhYmVsSW5Td2l0Y2hTdGF0ZW1lbnQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlRoZSBsYWJlbCAnI25hbWUnIHdhcyBhbHJlYWR5IHVzZWQgaW4gdGhpcyBzd2l0Y2ggc3RhdGVtZW50LiIiIiwKICAgICAgICB0aXBUZW1wbGF0ZTogciIiIlRyeSBjaG9vc2luZyBhIGRpZmZlcmVudCBuYW1lIGZvciB0aGlzIGxhYmVsLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZUxhYmVsSW5Td2l0Y2hTdGF0ZW1lbnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUR1cGxpY2F0ZUxhYmVsSW5Td2l0Y2hTdGF0ZW1lbnQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oIkR1cGxpY2F0ZUxhYmVsSW5Td2l0Y2hTdGF0ZW1lbnQiLAogICAgICAgIHRlbXBsYXRlRHVwbGljYXRlTGFiZWxJblN3aXRjaFN0YXRlbWVudCwKICAgICAgICBpbmRleDogNzIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZUxhYmVsSW5Td2l0Y2hTdGF0ZW1lbnQoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEdXBsaWNhdGVMYWJlbEluU3dpdGNoU3RhdGVtZW50LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIGxhYmVsICcke25hbWV9JyB3YXMgYWxyZWFkeSB1c2VkIGluIHRoaXMgc3dpdGNoIHN0YXRlbWVudC4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IGNob29zaW5nIGEgZGlmZmVyZW50IG5hbWUgZm9yIHRoaXMgbGFiZWwuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRHVwbGljYXRlUHJlZml4ID0gbWVzc2FnZUR1cGxpY2F0ZVByZWZpeDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VEdXBsaWNhdGVQcmVmaXggPSBjb25zdCBNZXNzYWdlQ29kZSgiRHVwbGljYXRlUHJlZml4IiwKICAgIGluZGV4OiA3MywKICAgIG1lc3NhZ2U6IHIiIiJBbiBpbXBvcnQgZGlyZWN0aXZlIGNhbiBvbmx5IGhhdmUgb25lIHByZWZpeCAoJ2FzJyBjbGF1c2UpLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyBhbGwgYnV0IG9uZSBwcmVmaXguIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbiA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiJyNuYW1lJyBpcyBhbHJlYWR5IGRlY2xhcmVkIGluIHRoaXMgc2NvcGUuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRHVwbGljYXRlZERlY2xhcmF0aW9uKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVEdXBsaWNhdGVkRGVjbGFyYXRpb24gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkR1cGxpY2F0ZWREZWNsYXJhdGlvbiIsIHRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJEVVBMSUNBVEVfREVGSU5JVElPTiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkRGVjbGFyYXRpb24oU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEdXBsaWNhdGVkRGVjbGFyYXRpb24sCiAgICAgIG1lc3NhZ2U6ICIiIicke25hbWV9JyBpcyBhbHJlYWR5IGRlY2xhcmVkIGluIHRoaXMgc2NvcGUuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbkNhdXNlID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJQcmV2aW91cyBkZWNsYXJhdGlvbiBvZiAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWREZWNsYXJhdGlvbkNhdXNlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVEdXBsaWNhdGVkRGVjbGFyYXRpb25DYXVzZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiRHVwbGljYXRlZERlY2xhcmF0aW9uQ2F1c2UiLCB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbkNhdXNlLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkRGVjbGFyYXRpb25DYXVzZShTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUR1cGxpY2F0ZWREZWNsYXJhdGlvbkNhdXNlLAogICAgICBtZXNzYWdlOiAiIiJQcmV2aW91cyBkZWNsYXJhdGlvbiBvZiAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lKT4gdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25TeW50aGV0aWNDYXVzZSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiUHJldmlvdXMgZGVjbGFyYXRpb24gb2YgJyNuYW1lJyBpcyBpbXBsaWVkIGJ5IHRoaXMgZGVmaW5pdGlvbi4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWREZWNsYXJhdGlvblN5bnRoZXRpY0NhdXNlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICBjb2RlRHVwbGljYXRlZERlY2xhcmF0aW9uU3ludGhldGljQ2F1c2UgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkR1cGxpY2F0ZWREZWNsYXJhdGlvblN5bnRoZXRpY0NhdXNlIiwKICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvblN5bnRoZXRpY0NhdXNlLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkRGVjbGFyYXRpb25TeW50aGV0aWNDYXVzZShTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUR1cGxpY2F0ZWREZWNsYXJhdGlvblN5bnRoZXRpY0NhdXNlLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiUHJldmlvdXMgZGVjbGFyYXRpb24gb2YgJyR7bmFtZX0nIGlzIGltcGxpZWQgYnkgdGhpcyBkZWZpbml0aW9uLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvblVzZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiQ2FuJ3QgdXNlICcjbmFtZScgYmVjYXVzZSBpdCBpcyBkZWNsYXJlZCBtb3JlIHRoYW4gb25jZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2UpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUR1cGxpY2F0ZWREZWNsYXJhdGlvblVzZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAiRHVwbGljYXRlZERlY2xhcmF0aW9uVXNlIiwKICB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvblVzZSwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2UoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2UsCiAgICAgIG1lc3NhZ2U6ICIiIkNhbid0IHVzZSAnJHtuYW1lfScgYmVjYXVzZSBpdCBpcyBkZWNsYXJlZCBtb3JlIHRoYW4gb25jZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4KICAgIHRlbXBsYXRlRHVwbGljYXRlZEV4cG9ydCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiJyNuYW1lJyBpcyBleHBvcnRlZCBmcm9tIGJvdGggJyN1cmknIGFuZCAnI3VyaTInLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRFeHBvcnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4KICAgIGNvZGVEdXBsaWNhdGVkRXhwb3J0ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+KAogICAgICAgICJEdXBsaWNhdGVkRXhwb3J0IiwgdGVtcGxhdGVEdXBsaWNhdGVkRXhwb3J0LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJBTUJJR1VPVVNfRVhQT1JUIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRFeHBvcnQoU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgU3RyaW5nIHVyaTIgPSByZWxhdGl2aXplVXJpKHVyaTJfKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUR1cGxpY2F0ZWRFeHBvcnQsCiAgICAgIG1lc3NhZ2U6ICIiIicke25hbWV9JyBpcyBleHBvcnRlZCBmcm9tIGJvdGggJyR7dXJpfScgYW5kICcke3VyaTJ9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3VyaSc6IHVyaV8sICd1cmkyJzogdXJpMl99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+CiAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWRFeHBvcnRJblR5cGUgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIicjbmFtZScgaXMgZXhwb3J0ZWQgZnJvbSBib3RoICcjdXJpJyBhbmQgJyN1cmkyJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkRXhwb3J0SW5UeXBlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+CiAgICBjb2RlRHVwbGljYXRlZEV4cG9ydEluVHlwZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPigKICAgICAgICAiRHVwbGljYXRlZEV4cG9ydEluVHlwZSIsIHRlbXBsYXRlRHVwbGljYXRlZEV4cG9ydEluVHlwZSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkRXhwb3J0SW5UeXBlKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIFN0cmluZyB1cmkyID0gcmVsYXRpdml6ZVVyaSh1cmkyXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEdXBsaWNhdGVkRXhwb3J0SW5UeXBlLAogICAgICBtZXNzYWdlOiAiIiInJHtuYW1lfScgaXMgZXhwb3J0ZWQgZnJvbSBib3RoICcke3VyaX0nIGFuZCAnJHt1cmkyfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd1cmknOiB1cmlfLCAndXJpMic6IHVyaTJffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPgogICAgdGVtcGxhdGVEdXBsaWNhdGVkSW1wb3J0ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiInI25hbWUnIGlzIGltcG9ydGVkIGZyb20gYm90aCAnI3VyaScgYW5kICcjdXJpMicuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRHVwbGljYXRlZEltcG9ydCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPgogICAgY29kZUR1cGxpY2F0ZWRJbXBvcnQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4oCiAgICAgICAgIkR1cGxpY2F0ZWRJbXBvcnQiLCB0ZW1wbGF0ZUR1cGxpY2F0ZWRJbXBvcnQsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lmlnbm9yZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRJbXBvcnQoU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgU3RyaW5nIHVyaTIgPSByZWxhdGl2aXplVXJpKHVyaTJfKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUR1cGxpY2F0ZWRJbXBvcnQsCiAgICAgIG1lc3NhZ2U6ICIiIicke25hbWV9JyBpcyBpbXBvcnRlZCBmcm9tIGJvdGggJyR7dXJpfScgYW5kICcke3VyaTJ9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3VyaSc6IHVyaV8sICd1cmkyJzogdXJpMl99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+CiAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWRJbXBvcnRJblR5cGUgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIicjbmFtZScgaXMgaW1wb3J0ZWQgZnJvbSBib3RoICcjdXJpJyBhbmQgJyN1cmkyJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkSW1wb3J0SW5UeXBlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+CiAgICBjb2RlRHVwbGljYXRlZEltcG9ydEluVHlwZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPigKICAgICAgICAiRHVwbGljYXRlZEltcG9ydEluVHlwZSIsIHRlbXBsYXRlRHVwbGljYXRlZEltcG9ydEluVHlwZSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQU1CSUdVT1VTX0lNUE9SVCJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRJbXBvcnRJblR5cGUoU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgU3RyaW5nIHVyaTIgPSByZWxhdGl2aXplVXJpKHVyaTJfKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUR1cGxpY2F0ZWRJbXBvcnRJblR5cGUsCiAgICAgIG1lc3NhZ2U6ICIiIicke25hbWV9JyBpcyBpbXBvcnRlZCBmcm9tIGJvdGggJyR7dXJpfScgYW5kICcke3VyaTJ9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3VyaSc6IHVyaV8sICd1cmkyJzogdXJpMl99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlRHVwbGljYXRlZExpYnJhcnlFeHBvcnQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkEgbGlicmFyeSB3aXRoIG5hbWUgJyNuYW1lJyBpcyBleHBvcnRlZCBtb3JlIHRoYW4gb25jZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkTGlicmFyeUV4cG9ydCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRHVwbGljYXRlZExpYnJhcnlFeHBvcnQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkR1cGxpY2F0ZWRMaWJyYXJ5RXhwb3J0IiwgdGVtcGxhdGVEdXBsaWNhdGVkTGlicmFyeUV4cG9ydCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVhQT1JUX0RVUExJQ0FURURfTElCUkFSWV9OQU1FRCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkTGlicmFyeUV4cG9ydChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUR1cGxpY2F0ZWRMaWJyYXJ5RXhwb3J0LAogICAgICBtZXNzYWdlOiAiIiJBIGxpYnJhcnkgd2l0aCBuYW1lICcke25hbWV9JyBpcyBleHBvcnRlZCBtb3JlIHRoYW4gb25jZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlRHVwbGljYXRlZExpYnJhcnlFeHBvcnRDb250ZXh0ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiInI25hbWUnIGlzIGFsc28gZXhwb3J0ZWQgaGVyZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkTGlicmFyeUV4cG9ydENvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUR1cGxpY2F0ZWRMaWJyYXJ5RXhwb3J0Q29udGV4dCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigiRHVwbGljYXRlZExpYnJhcnlFeHBvcnRDb250ZXh0IiwKICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWRMaWJyYXJ5RXhwb3J0Q29udGV4dCwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRHVwbGljYXRlZExpYnJhcnlFeHBvcnRDb250ZXh0KFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRHVwbGljYXRlZExpYnJhcnlFeHBvcnRDb250ZXh0LAogICAgICBtZXNzYWdlOiAiIiInJHtuYW1lfScgaXMgYWxzbyBleHBvcnRlZCBoZXJlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUR1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJBIGxpYnJhcnkgd2l0aCBuYW1lICcjbmFtZScgaXMgaW1wb3J0ZWQgbW9yZSB0aGFuIG9uY2UuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRHVwbGljYXRlZExpYnJhcnlJbXBvcnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUR1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJEdXBsaWNhdGVkTGlicmFyeUltcG9ydCIsIHRlbXBsYXRlRHVwbGljYXRlZExpYnJhcnlJbXBvcnQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklNUE9SVF9EVVBMSUNBVEVEX0xJQlJBUllfTkFNRUQiXSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkud2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRHVwbGljYXRlZExpYnJhcnlJbXBvcnQoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEdXBsaWNhdGVkTGlicmFyeUltcG9ydCwKICAgICAgbWVzc2FnZTogIiIiQSBsaWJyYXJ5IHdpdGggbmFtZSAnJHtuYW1lfScgaXMgaW1wb3J0ZWQgbW9yZSB0aGFuIG9uY2UuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0Q29udGV4dCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiJyNuYW1lJyBpcyBhbHNvIGltcG9ydGVkIGhlcmUuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRHVwbGljYXRlZExpYnJhcnlJbXBvcnRDb250ZXh0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVEdXBsaWNhdGVkTGlicmFyeUltcG9ydENvbnRleHQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oIkR1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0Q29udGV4dCIsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkTGlicmFyeUltcG9ydENvbnRleHQsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0Q29udGV4dChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUR1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0Q29udGV4dCwKICAgICAgbWVzc2FnZTogIiIiJyR7bmFtZX0nIGlzIGFsc28gaW1wb3J0ZWQgaGVyZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gdGVtcGxhdGVEdXBsaWNhdGVkTW9kaWZpZXIgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlRoZSBtb2RpZmllciAnI2xleGVtZScgd2FzIGFscmVhZHkgc3BlY2lmaWVkLiIiIiwKICAgICAgICB0aXBUZW1wbGF0ZTogciIiIlRyeSByZW1vdmluZyBhbGwgYnV0IG9uZSBvY2N1cmVuY2Ugb2YgdGhlIG1vZGlmaWVyLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRNb2RpZmllcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiBjb2RlRHVwbGljYXRlZE1vZGlmaWVyID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgICJEdXBsaWNhdGVkTW9kaWZpZXIiLCB0ZW1wbGF0ZUR1cGxpY2F0ZWRNb2RpZmllciwKICAgICAgICBpbmRleDogNzApOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRNb2RpZmllcihUb2tlbiB0b2tlbikgewogIFN0cmluZyBsZXhlbWUgPSB0b2tlbi5sZXhlbWU7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEdXBsaWNhdGVkTW9kaWZpZXIsCiAgICAgIG1lc3NhZ2U6ICIiIlRoZSBtb2RpZmllciAnJHtsZXhlbWV9JyB3YXMgYWxyZWFkeSBzcGVjaWZpZWQuIiIiLAogICAgICB0aXA6ICIiIlRyeSByZW1vdmluZyBhbGwgYnV0IG9uZSBvY2N1cmVuY2Ugb2YgdGhlIG1vZGlmaWVyLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3Rva2VuJzogdG9rZW59KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lKT4gdGVtcGxhdGVEdXBsaWNhdGVkTmFtZVByZXZpb3VzbHlVc2VkID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJDYW4ndCBkZWNsYXJlICcjbmFtZScgYmVjYXVzZSBpdCB3YXMgYWxyZWFkeSB1c2VkIGluIHRoaXMgc2NvcGUuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkTmFtZVByZXZpb3VzbHlVc2VkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVEdXBsaWNhdGVkTmFtZVByZXZpb3VzbHlVc2VkID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJEdXBsaWNhdGVkTmFtZVByZXZpb3VzbHlVc2VkIiwgdGVtcGxhdGVEdXBsaWNhdGVkTmFtZVByZXZpb3VzbHlVc2VkLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJSRUZFUkVOQ0VEX0JFRk9SRV9ERUNMQVJBVElPTiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkTmFtZVByZXZpb3VzbHlVc2VkKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkNhbid0IGRlY2xhcmUgJyR7bmFtZX0nIGJlY2F1c2UgaXQgd2FzIGFscmVhZHkgdXNlZCBpbiB0aGlzIHNjb3BlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVEdXBsaWNhdGVkTmFtZVByZXZpb3VzbHlVc2VkQ2F1c2UgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlByZXZpb3VzIHVzZSBvZiAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWROYW1lUHJldmlvdXNseVVzZWRDYXVzZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgY29kZUR1cGxpY2F0ZWROYW1lUHJldmlvdXNseVVzZWRDYXVzZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZENhdXNlIiwKICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWROYW1lUHJldmlvdXNseVVzZWRDYXVzZSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZENhdXNlKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZENhdXNlLAogICAgICBtZXNzYWdlOiAiIiJQcmV2aW91cyB1c2Ugb2YgJyR7bmFtZX0nLiIiIiwgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUR1cGxpY2F0ZWROYW1lZEFyZ3VtZW50ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJEdXBsaWNhdGVkIG5hbWVkIGFyZ3VtZW50ICcjbmFtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRHVwbGljYXRlZE5hbWVkQXJndW1lbnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUR1cGxpY2F0ZWROYW1lZEFyZ3VtZW50ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJEdXBsaWNhdGVkTmFtZWRBcmd1bWVudCIsIHRlbXBsYXRlRHVwbGljYXRlZE5hbWVkQXJndW1lbnQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkRVUExJQ0FURV9OQU1FRF9BUkdVTUVOVCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkTmFtZWRBcmd1bWVudChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUR1cGxpY2F0ZWROYW1lZEFyZ3VtZW50LAogICAgICBtZXNzYWdlOiAiIiJEdXBsaWNhdGVkIG5hbWVkIGFyZ3VtZW50ICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiRHVwbGljYXRlZCBwYXJhbWV0ZXIgbmFtZSAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiRHVwbGljYXRlZFBhcmFtZXRlck5hbWUiLCB0ZW1wbGF0ZUR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJEVVBMSUNBVEVfREVGSU5JVElPTiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZShTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lLAogICAgICBtZXNzYWdlOiAiIiJEdXBsaWNhdGVkIHBhcmFtZXRlciBuYW1lICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlRHVwbGljYXRlZFBhcmFtZXRlck5hbWVDYXVzZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiT3RoZXIgcGFyYW1ldGVyIG5hbWVkICcjbmFtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRHVwbGljYXRlZFBhcmFtZXRlck5hbWVDYXVzZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRHVwbGljYXRlZFBhcmFtZXRlck5hbWVDYXVzZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiRHVwbGljYXRlZFBhcmFtZXRlck5hbWVDYXVzZSIsIHRlbXBsYXRlRHVwbGljYXRlZFBhcmFtZXRlck5hbWVDYXVzZSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRHVwbGljYXRlZFBhcmFtZXRlck5hbWVDYXVzZShTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lQ2F1c2UsCiAgICAgIG1lc3NhZ2U6ICIiIk90aGVyIHBhcmFtZXRlciBuYW1lZCAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRW1wdHlOYW1lZFBhcmFtZXRlckxpc3QgPSBtZXNzYWdlRW1wdHlOYW1lZFBhcmFtZXRlckxpc3Q7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRW1wdHlOYW1lZFBhcmFtZXRlckxpc3QgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJFbXB0eU5hbWVkUGFyYW1ldGVyTGlzdCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTUlTU0lOR19JREVOVElGSUVSIl0sCiAgICBtZXNzYWdlOiByIiIiTmFtZWQgcGFyYW1ldGVyIGxpc3RzIGNhbm5vdCBiZSBlbXB0eS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgYWRkaW5nIGEgbmFtZWQgcGFyYW1ldGVyIHRvIHRoZSBsaXN0LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFbXB0eU9wdGlvbmFsUGFyYW1ldGVyTGlzdCA9CiAgICBtZXNzYWdlRW1wdHlPcHRpb25hbFBhcmFtZXRlckxpc3Q7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRW1wdHlPcHRpb25hbFBhcmFtZXRlckxpc3QgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJFbXB0eU9wdGlvbmFsUGFyYW1ldGVyTGlzdCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTUlTU0lOR19JREVOVElGSUVSIl0sCiAgICBtZXNzYWdlOiByIiIiT3B0aW9uYWwgcGFyYW1ldGVyIGxpc3RzIGNhbm5vdCBiZSBlbXB0eS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgYWRkaW5nIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB0byB0aGUgbGlzdC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRW5jb2RpbmcgPSBtZXNzYWdlRW5jb2Rpbmc7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRW5jb2RpbmcgPSBjb25zdCBNZXNzYWdlQ29kZSgiRW5jb2RpbmciLAogICAgbWVzc2FnZTogciIiIlVuYWJsZSB0byBkZWNvZGUgYnl0ZXMgYXMgVVRGLTguIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlRW51bUNvbnN0YW50U2FtZU5hbWVBc0VuY2xvc2luZyA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiTmFtZSBvZiBlbnVtIGNvbnN0YW50ICcjbmFtZScgY2FuJ3QgYmUgdGhlIHNhbWUgYXMgdGhlIGVudW0ncyBvd24gbmFtZS4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0VudW1Db25zdGFudFNhbWVOYW1lQXNFbmNsb3NpbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUVudW1Db25zdGFudFNhbWVOYW1lQXNFbmNsb3NpbmcgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oIkVudW1Db25zdGFudFNhbWVOYW1lQXNFbmNsb3NpbmciLAogICAgICAgIHRlbXBsYXRlRW51bUNvbnN0YW50U2FtZU5hbWVBc0VuY2xvc2luZywKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRU5VTV9DT05TVEFOVF9XSVRIX0VOVU1fTkFNRSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNFbnVtQ29uc3RhbnRTYW1lTmFtZUFzRW5jbG9zaW5nKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRW51bUNvbnN0YW50U2FtZU5hbWVBc0VuY2xvc2luZywKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIk5hbWUgb2YgZW51bSBjb25zdGFudCAnJHtuYW1lfScgY2FuJ3QgYmUgdGhlIHNhbWUgYXMgdGhlIGVudW0ncyBvd24gbmFtZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFbnVtRGVjbGFyYXRpb25FbXB0eSA9IG1lc3NhZ2VFbnVtRGVjbGFyYXRpb25FbXB0eTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFbnVtRGVjbGFyYXRpb25FbXB0eSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkVudW1EZWNsYXJhdGlvbkVtcHR5IiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJFTVBUWV9FTlVNX0JPRFkiXSwKICAgIG1lc3NhZ2U6IHIiIiJBbiBlbnVtIGRlY2xhcmF0aW9uIGNhbid0IGJlIGVtcHR5LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFbnVtSW5DbGFzcyA9IG1lc3NhZ2VFbnVtSW5DbGFzczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFbnVtSW5DbGFzcyA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJFbnVtSW5DbGFzcyIsCiAgICBpbmRleDogNzQsCiAgICBtZXNzYWdlOiByIiIiRW51bXMgY2FuJ3QgYmUgZGVjbGFyZWQgaW5zaWRlIGNsYXNzZXMuIiIiLAogICAgdGlwOiByIiIiVHJ5IG1vdmluZyB0aGUgZW51bSB0byB0aGUgdG9wLWxldmVsLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFbnVtSW5zdGFudGlhdGlvbiA9IG1lc3NhZ2VFbnVtSW5zdGFudGlhdGlvbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFbnVtSW5zdGFudGlhdGlvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkVudW1JbnN0YW50aWF0aW9uIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlNUQU5USUFURV9FTlVNIl0sCiAgICBtZXNzYWdlOiByIiIiRW51bXMgY2FuJ3QgYmUgaW5zdGFudGlhdGVkLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFcXVhbGl0eUNhbm5vdEJlRXF1YWxpdHlPcGVyYW5kID0KICAgIG1lc3NhZ2VFcXVhbGl0eUNhbm5vdEJlRXF1YWxpdHlPcGVyYW5kOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUVxdWFsaXR5Q2Fubm90QmVFcXVhbGl0eU9wZXJhbmQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJFcXVhbGl0eUNhbm5vdEJlRXF1YWxpdHlPcGVyYW5kIiwKICAgIGluZGV4OiAxLAogICAgbWVzc2FnZToKICAgICAgICByIiIiQW4gZXF1YWxpdHkgZXhwcmVzc2lvbiBjYW4ndCBiZSBhbiBvcGVyYW5kIG9mIGFub3RoZXIgZXF1YWxpdHkgZXhwcmVzc2lvbi4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmUtd3JpdGluZyB0aGUgZXhwcmVzc2lvbi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gdGVtcGxhdGVFeHBlY3RlZEFmdGVyQnV0R290ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkV4cGVjdGVkICcjc3RyaW5nJyBhZnRlciB0aGlzLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0V4cGVjdGVkQWZ0ZXJCdXRHb3QpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPiBjb2RlRXhwZWN0ZWRBZnRlckJ1dEdvdCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgICJFeHBlY3RlZEFmdGVyQnV0R290IiwgdGVtcGxhdGVFeHBlY3RlZEFmdGVyQnV0R290LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJFWFBFQ1RFRF9UT0tFTiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNFeHBlY3RlZEFmdGVyQnV0R290KFN0cmluZyBzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXhwZWN0ZWRBZnRlckJ1dEdvdCwKICAgICAgbWVzc2FnZTogIiIiRXhwZWN0ZWQgJyR7c3RyaW5nfScgYWZ0ZXIgdGhpcy4iIiIsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmd9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXhwZWN0ZWRBbkluaXRpYWxpemVyID0gbWVzc2FnZUV4cGVjdGVkQW5Jbml0aWFsaXplcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHBlY3RlZEFuSW5pdGlhbGl6ZXIgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJFeHBlY3RlZEFuSW5pdGlhbGl6ZXIiLAogICAgaW5kZXg6IDM2LAogICAgbWVzc2FnZTogciIiIkV4cGVjdGVkIGFuIGluaXRpYWxpemVyLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFeHBlY3RlZEJsb2NrID0gbWVzc2FnZUV4cGVjdGVkQmxvY2s7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRXhwZWN0ZWRCbG9jayA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJFeHBlY3RlZEJsb2NrIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJFWFBFQ1RFRF9UT0tFTiJdLAogICAgbWVzc2FnZTogciIiIkV4cGVjdGVkIGEgYmxvY2suIiIiLAogICAgdGlwOiByIiIiVHJ5IGFkZGluZyB7fS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXhwZWN0ZWRCbG9ja1RvU2tpcCA9IG1lc3NhZ2VFeHBlY3RlZEJsb2NrVG9Ta2lwOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUV4cGVjdGVkQmxvY2tUb1NraXAgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJFeHBlY3RlZEJsb2NrVG9Ta2lwIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNSVNTSU5HX0ZVTkNUSU9OX0JPRFkiXSwKICAgIG1lc3NhZ2U6IHIiIiJFeHBlY3RlZCBhIGZ1bmN0aW9uIGJvZHkgb3IgJz0+Jy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgYWRkaW5nIHt9LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFeHBlY3RlZEJvZHkgPSBtZXNzYWdlRXhwZWN0ZWRCb2R5OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUV4cGVjdGVkQm9keSA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJFeHBlY3RlZEJvZHkiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk1JU1NJTkdfRlVOQ1RJT05fQk9EWSJdLAogICAgbWVzc2FnZTogciIiIkV4cGVjdGVkIGEgZnVuY3Rpb24gYm9keSBvciAnPT4nLiIiIiwKICAgIHRpcDogciIiIlRyeSBhZGRpbmcge30uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+IHRlbXBsYXRlRXhwZWN0ZWRCdXRHb3QgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiRXhwZWN0ZWQgJyNzdHJpbmcnIGJlZm9yZSB0aGlzLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0V4cGVjdGVkQnV0R290KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gY29kZUV4cGVjdGVkQnV0R290ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgIkV4cGVjdGVkQnV0R290IiwgdGVtcGxhdGVFeHBlY3RlZEJ1dEdvdCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVhQRUNURURfVE9LRU4iXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRXhwZWN0ZWRCdXRHb3QoU3RyaW5nIHN0cmluZykgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVFeHBlY3RlZEJ1dEdvdCwKICAgICAgbWVzc2FnZTogIiIiRXhwZWN0ZWQgJyR7c3RyaW5nfScgYmVmb3JlIHRoaXMuIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiB0ZW1wbGF0ZUV4cGVjdGVkQ2xhc3NCb2R5VG9Ta2lwID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJFeHBlY3RlZCBhIGNsYXNzIG9yIG1peGluIGJvZHksIGJ1dCBnb3QgJyNsZXhlbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0V4cGVjdGVkQ2xhc3NCb2R5VG9Ta2lwKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IGNvZGVFeHBlY3RlZENsYXNzQm9keVRvU2tpcCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICAiRXhwZWN0ZWRDbGFzc0JvZHlUb1NraXAiLCB0ZW1wbGF0ZUV4cGVjdGVkQ2xhc3NCb2R5VG9Ta2lwLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNSVNTSU5HX0NMQVNTX0JPRFkiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRXhwZWN0ZWRDbGFzc0JvZHlUb1NraXAoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXhwZWN0ZWRDbGFzc0JvZHlUb1NraXAsCiAgICAgIG1lc3NhZ2U6ICIiIkV4cGVjdGVkIGEgY2xhc3Mgb3IgbWl4aW4gYm9keSwgYnV0IGdvdCAnJHtsZXhlbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiB0ZW1wbGF0ZUV4cGVjdGVkQ2xhc3NNZW1iZXIgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkV4cGVjdGVkIGEgY2xhc3MgbWVtYmVyLCBidXQgZ290ICcjbGV4ZW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBlY3RlZENsYXNzTWVtYmVyKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IGNvZGVFeHBlY3RlZENsYXNzTWVtYmVyID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgICJFeHBlY3RlZENsYXNzTWVtYmVyIiwgdGVtcGxhdGVFeHBlY3RlZENsYXNzTWVtYmVyLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJFWFBFQ1RFRF9DTEFTU19NRU1CRVIiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRXhwZWN0ZWRDbGFzc01lbWJlcihUb2tlbiB0b2tlbikgewogIFN0cmluZyBsZXhlbWUgPSB0b2tlbi5sZXhlbWU7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVFeHBlY3RlZENsYXNzTWVtYmVyLAogICAgICBtZXNzYWdlOiAiIiJFeHBlY3RlZCBhIGNsYXNzIG1lbWJlciwgYnV0IGdvdCAnJHtsZXhlbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiB0ZW1wbGF0ZUV4cGVjdGVkQ2xhc3NPck1peGluQm9keSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiRXhwZWN0ZWQgYSBjbGFzcyBvciBtaXhpbiBib2R5LCBidXQgZ290ICcjbGV4ZW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBlY3RlZENsYXNzT3JNaXhpbkJvZHkpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gY29kZUV4cGVjdGVkQ2xhc3NPck1peGluQm9keSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICAiRXhwZWN0ZWRDbGFzc09yTWl4aW5Cb2R5IiwgdGVtcGxhdGVFeHBlY3RlZENsYXNzT3JNaXhpbkJvZHksCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk1JU1NJTkdfQ0xBU1NfQk9EWSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNFeHBlY3RlZENsYXNzT3JNaXhpbkJvZHkoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXhwZWN0ZWRDbGFzc09yTWl4aW5Cb2R5LAogICAgICBtZXNzYWdlOiAiIiJFeHBlY3RlZCBhIGNsYXNzIG9yIG1peGluIGJvZHksIGJ1dCBnb3QgJyR7bGV4ZW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsndG9rZW4nOiB0b2tlbn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gdGVtcGxhdGVFeHBlY3RlZERlY2xhcmF0aW9uID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCBhIGRlY2xhcmF0aW9uLCBidXQgZ290ICcjbGV4ZW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBlY3RlZERlY2xhcmF0aW9uKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IGNvZGVFeHBlY3RlZERlY2xhcmF0aW9uID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgICJFeHBlY3RlZERlY2xhcmF0aW9uIiwgdGVtcGxhdGVFeHBlY3RlZERlY2xhcmF0aW9uLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJFWFBFQ1RFRF9FWEVDVVRBQkxFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0V4cGVjdGVkRGVjbGFyYXRpb24oVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXhwZWN0ZWREZWNsYXJhdGlvbiwKICAgICAgbWVzc2FnZTogIiIiRXhwZWN0ZWQgYSBkZWNsYXJhdGlvbiwgYnV0IGdvdCAnJHtsZXhlbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4cGVjdGVkRWxzZU9yQ29tbWEgPSBtZXNzYWdlRXhwZWN0ZWRFbHNlT3JDb21tYTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHBlY3RlZEVsc2VPckNvbW1hID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRXhwZWN0ZWRFbHNlT3JDb21tYSIsCiAgICBpbmRleDogOTQsCiAgICBtZXNzYWdlOiByIiIiRXhwZWN0ZWQgJ2Vsc2UnIG9yIGNvbW1hLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiB0ZW1wbGF0ZUV4cGVjdGVkRW51bUJvZHkgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCBhIGVudW0gYm9keSwgYnV0IGdvdCAnI2xleGVtZScuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIkFuIGVudW0gZGVmaW5pdGlvbiBtdXN0IGhhdmUgYSBib2R5IHdpdGggYXQgbGVhc3Qgb25lIGNvbnN0YW50IG5hbWUuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBlY3RlZEVudW1Cb2R5KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IGNvZGVFeHBlY3RlZEVudW1Cb2R5ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgICJFeHBlY3RlZEVudW1Cb2R5IiwgdGVtcGxhdGVFeHBlY3RlZEVudW1Cb2R5LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNSVNTSU5HX0VOVU1fQk9EWSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNFeHBlY3RlZEVudW1Cb2R5KFRva2VuIHRva2VuKSB7CiAgU3RyaW5nIGxleGVtZSA9IHRva2VuLmxleGVtZTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUV4cGVjdGVkRW51bUJvZHksCiAgICAgIG1lc3NhZ2U6ICIiIkV4cGVjdGVkIGEgZW51bSBib2R5LCBidXQgZ290ICcke2xleGVtZX0nLiIiIiwKICAgICAgdGlwOgogICAgICAgICAgIiIiQW4gZW51bSBkZWZpbml0aW9uIG11c3QgaGF2ZSBhIGJvZHkgd2l0aCBhdCBsZWFzdCBvbmUgY29uc3RhbnQgbmFtZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiB0ZW1wbGF0ZUV4cGVjdGVkRnVuY3Rpb25Cb2R5ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCBhIGZ1bmN0aW9uIGJvZHksIGJ1dCBnb3QgJyNsZXhlbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0V4cGVjdGVkRnVuY3Rpb25Cb2R5KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IGNvZGVFeHBlY3RlZEZ1bmN0aW9uQm9keSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICAiRXhwZWN0ZWRGdW5jdGlvbkJvZHkiLCB0ZW1wbGF0ZUV4cGVjdGVkRnVuY3Rpb25Cb2R5LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNSVNTSU5HX0ZVTkNUSU9OX0JPRFkiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRXhwZWN0ZWRGdW5jdGlvbkJvZHkoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXhwZWN0ZWRGdW5jdGlvbkJvZHksCiAgICAgIG1lc3NhZ2U6ICIiIkV4cGVjdGVkIGEgZnVuY3Rpb24gYm9keSwgYnV0IGdvdCAnJHtsZXhlbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4cGVjdGVkSGV4RGlnaXQgPSBtZXNzYWdlRXhwZWN0ZWRIZXhEaWdpdDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHBlY3RlZEhleERpZ2l0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRXhwZWN0ZWRIZXhEaWdpdCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTUlTU0lOR19IRVhfRElHSVQiXSwKICAgIG1lc3NhZ2U6IHIiIiJBIGhleCBkaWdpdCAoMC05IG9yIEEtRikgbXVzdCBmb2xsb3cgJzB4Jy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IHRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCBhbiBpZGVudGlmaWVyLCBidXQgZ290ICcjbGV4ZW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBlY3RlZElkZW50aWZpZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gY29kZUV4cGVjdGVkSWRlbnRpZmllciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICAiRXhwZWN0ZWRJZGVudGlmaWVyIiwgdGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk1JU1NJTkdfSURFTlRJRklFUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNFeHBlY3RlZElkZW50aWZpZXIoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXhwZWN0ZWRJZGVudGlmaWVyLAogICAgICBtZXNzYWdlOiAiIiJFeHBlY3RlZCBhbiBpZGVudGlmaWVyLCBidXQgZ290ICcke2xleGVtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3Rva2VuJzogdG9rZW59KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gdGVtcGxhdGVFeHBlY3RlZEluc3RlYWQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiRXhwZWN0ZWQgJyNzdHJpbmcnIGluc3RlYWQgb2YgdGhpcy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBlY3RlZEluc3RlYWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPiBjb2RlRXhwZWN0ZWRJbnN0ZWFkID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgIkV4cGVjdGVkSW5zdGVhZCIsIHRlbXBsYXRlRXhwZWN0ZWRJbnN0ZWFkLAogICAgICAgIGluZGV4OiA0MSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRXhwZWN0ZWRJbnN0ZWFkKFN0cmluZyBzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXhwZWN0ZWRJbnN0ZWFkLAogICAgICBtZXNzYWdlOiAiIiJFeHBlY3RlZCAnJHtzdHJpbmd9JyBpbnN0ZWFkIG9mIHRoaXMuIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4cGVjdGVkTmFtZWRBcmd1bWVudCA9IG1lc3NhZ2VFeHBlY3RlZE5hbWVkQXJndW1lbnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRXhwZWN0ZWROYW1lZEFyZ3VtZW50ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRXhwZWN0ZWROYW1lZEFyZ3VtZW50IiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJFWFRSQV9QT1NJVElPTkFMX0FSR1VNRU5UUyJdLAogICAgbWVzc2FnZTogciIiIkV4cGVjdGVkIG5hbWVkIGFyZ3VtZW50LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFeHBlY3RlZE9uZUV4cHJlc3Npb24gPSBtZXNzYWdlRXhwZWN0ZWRPbmVFeHByZXNzaW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUV4cGVjdGVkT25lRXhwcmVzc2lvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkV4cGVjdGVkT25lRXhwcmVzc2lvbiIsCiAgICBtZXNzYWdlOiByIiIiRXhwZWN0ZWQgb25lIGV4cHJlc3Npb24sIGJ1dCBmb3VuZCBhZGRpdGlvbmFsIGlucHV0LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFeHBlY3RlZE9wZW5QYXJlbnMgPSBtZXNzYWdlRXhwZWN0ZWRPcGVuUGFyZW5zOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUV4cGVjdGVkT3BlblBhcmVucyA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiRXhwZWN0ZWRPcGVuUGFyZW5zIiwgbWVzc2FnZTogciIiIkV4cGVjdGVkICcoJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXhwZWN0ZWRTdGF0ZW1lbnQgPSBtZXNzYWdlRXhwZWN0ZWRTdGF0ZW1lbnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRXhwZWN0ZWRTdGF0ZW1lbnQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJFeHBlY3RlZFN0YXRlbWVudCIsCiAgICBpbmRleDogMjksCiAgICBtZXNzYWdlOiByIiIiRXhwZWN0ZWQgYSBzdGF0ZW1lbnQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiB0ZW1wbGF0ZUV4cGVjdGVkU3RyaW5nID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCBhIFN0cmluZywgYnV0IGdvdCAnI2xleGVtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRXhwZWN0ZWRTdHJpbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gY29kZUV4cGVjdGVkU3RyaW5nID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgICJFeHBlY3RlZFN0cmluZyIsIHRlbXBsYXRlRXhwZWN0ZWRTdHJpbmcsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVYUEVDVEVEX1NUUklOR19MSVRFUkFMIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0V4cGVjdGVkU3RyaW5nKFRva2VuIHRva2VuKSB7CiAgU3RyaW5nIGxleGVtZSA9IHRva2VuLmxleGVtZTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUV4cGVjdGVkU3RyaW5nLAogICAgICBtZXNzYWdlOiAiIiJFeHBlY3RlZCBhIFN0cmluZywgYnV0IGdvdCAnJHtsZXhlbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+IHRlbXBsYXRlRXhwZWN0ZWRUb2tlbiA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCB0byBmaW5kICcjc3RyaW5nJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBlY3RlZFRva2VuKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gY29kZUV4cGVjdGVkVG9rZW4gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiRXhwZWN0ZWRUb2tlbiIsIHRlbXBsYXRlRXhwZWN0ZWRUb2tlbiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVhQRUNURURfVE9LRU4iXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRXhwZWN0ZWRUb2tlbihTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUV4cGVjdGVkVG9rZW4sCiAgICAgIG1lc3NhZ2U6ICIiIkV4cGVjdGVkIHRvIGZpbmQgJyR7c3RyaW5nfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiB0ZW1wbGF0ZUV4cGVjdGVkVHlwZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiRXhwZWN0ZWQgYSB0eXBlLCBidXQgZ290ICcjbGV4ZW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBlY3RlZFR5cGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gY29kZUV4cGVjdGVkVHlwZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICAiRXhwZWN0ZWRUeXBlIiwgdGVtcGxhdGVFeHBlY3RlZFR5cGUsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVYUEVDVEVEX1RZUEVfTkFNRSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNFeHBlY3RlZFR5cGUoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXhwZWN0ZWRUeXBlLAogICAgICBtZXNzYWdlOiAiIiJFeHBlY3RlZCBhIHR5cGUsIGJ1dCBnb3QgJyR7bGV4ZW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsndG9rZW4nOiB0b2tlbn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFeHBlY3RlZFVyaSA9IG1lc3NhZ2VFeHBlY3RlZFVyaTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHBlY3RlZFVyaSA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiRXhwZWN0ZWRVcmkiLCBtZXNzYWdlOiByIiIiRXhwZWN0ZWQgYSBVUkkuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgc3RyaW5nKT4gdGVtcGxhdGVFeHBlcmltZW50Tm90RW5hYmxlZCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGlzIHJlcXVpcmVzIHRoZSAtLSNzdHJpbmcgZXhwZXJpbWVudCB0byBiZSBlbmFibGVkLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgZW5hYmxpbmcgdGhpcyBleHBlcmltZW50IGJ5IGFkZGluZyBpdCB0byB0aGUgY29tbWFuZCBsaW5lIHdoZW4gY29tcGlsaW5nIGFuZCBydW5uaW5nLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRXhwZXJpbWVudE5vdEVuYWJsZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPiBjb2RlRXhwZXJpbWVudE5vdEVuYWJsZWQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiRXhwZXJpbWVudE5vdEVuYWJsZWQiLCB0ZW1wbGF0ZUV4cGVyaW1lbnROb3RFbmFibGVkLAogICAgICAgIGluZGV4OiA5Myk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRXhwZXJpbWVudE5vdEVuYWJsZWQoU3RyaW5nIHN0cmluZykgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVFeHBlcmltZW50Tm90RW5hYmxlZCwKICAgICAgbWVzc2FnZTogIiIiVGhpcyByZXF1aXJlcyB0aGUgLS0ke3N0cmluZ30gZXhwZXJpbWVudCB0byBiZSBlbmFibGVkLiIiIiwKICAgICAgdGlwOgogICAgICAgICAgIiIiVHJ5IGVuYWJsaW5nIHRoaXMgZXhwZXJpbWVudCBieSBhZGRpbmcgaXQgdG8gdGhlIGNvbW1hbmQgbGluZSB3aGVuIGNvbXBpbGluZyBhbmQgcnVubmluZy4iIiIsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmd9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXhwb3J0QWZ0ZXJQYXJ0ID0gbWVzc2FnZUV4cG9ydEFmdGVyUGFydDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHBvcnRBZnRlclBhcnQgPSBjb25zdCBNZXNzYWdlQ29kZSgiRXhwb3J0QWZ0ZXJQYXJ0IiwKICAgIGluZGV4OiA3NSwKICAgIG1lc3NhZ2U6IHIiIiJFeHBvcnQgZGlyZWN0aXZlcyBtdXN0IHByZWNlZGUgcGFydCBkaXJlY3RpdmVzLiIiIiwKICAgIHRpcDogciIiIlRyeSBtb3ZpbmcgdGhlIGV4cG9ydCBkaXJlY3RpdmVzIGJlZm9yZSB0aGUgcGFydCBkaXJlY3RpdmVzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4KICAgIHRlbXBsYXRlRXhwb3J0SGlkZXNFeHBvcnQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkV4cG9ydCBvZiAnI25hbWUnIChmcm9tICcjdXJpJykgaGlkZXMgZXhwb3J0IGZyb20gJyN1cmkyJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBvcnRIaWRlc0V4cG9ydCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPgogICAgY29kZUV4cG9ydEhpZGVzRXhwb3J0ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+KAogICAgICAgICJFeHBvcnRIaWRlc0V4cG9ydCIsIHRlbXBsYXRlRXhwb3J0SGlkZXNFeHBvcnQsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lmlnbm9yZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0V4cG9ydEhpZGVzRXhwb3J0KFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIFN0cmluZyB1cmkyID0gcmVsYXRpdml6ZVVyaSh1cmkyXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVFeHBvcnRIaWRlc0V4cG9ydCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkV4cG9ydCBvZiAnJHtuYW1lfScgKGZyb20gJyR7dXJpfScpIGhpZGVzIGV4cG9ydCBmcm9tICcke3VyaTJ9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3VyaSc6IHVyaV8sICd1cmkyJzogdXJpMl99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXhwcmVzc2lvbk5vdE1ldGFkYXRhID0gbWVzc2FnZUV4cHJlc3Npb25Ob3RNZXRhZGF0YTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHByZXNzaW9uTm90TWV0YWRhdGEgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJFeHByZXNzaW9uTm90TWV0YWRhdGEiLAogICAgbWVzc2FnZToKICAgICAgICByIiIiVGhpcyBjYW4ndCBiZSB1c2VkIGFzIG1ldGFkYXRhOyBtZXRhZGF0YSBzaG91bGQgYmUgYSByZWZlcmVuY2UgdG8gYSBjb21waWxlLXRpbWUgY29uc3RhbnQgdmFyaWFibGUsIG9yIGEgY2FsbCB0byBhIGNvbnN0YW50IGNvbnN0cnVjdG9yLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVFeHRlbmRpbmdFbnVtID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiInI25hbWUnIGlzIGFuIGVudW0gYW5kIGNhbid0IGJlIGV4dGVuZGVkIG9yIGltcGxlbWVudGVkLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0V4dGVuZGluZ0VudW0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUV4dGVuZGluZ0VudW0gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkV4dGVuZGluZ0VudW0iLCB0ZW1wbGF0ZUV4dGVuZGluZ0VudW0sCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVYVEVORFNfRU5VTSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNFeHRlbmRpbmdFbnVtKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXh0ZW5kaW5nRW51bSwKICAgICAgbWVzc2FnZTogIiIiJyR7bmFtZX0nIGlzIGFuIGVudW0gYW5kIGNhbid0IGJlIGV4dGVuZGVkIG9yIGltcGxlbWVudGVkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUV4dGVuZGluZ1Jlc3RyaWN0ZWQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIicjbmFtZScgaXMgcmVzdHJpY3RlZCBhbmQgY2FuJ3QgYmUgZXh0ZW5kZWQgb3IgaW1wbGVtZW50ZWQuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRXh0ZW5kaW5nUmVzdHJpY3RlZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRXh0ZW5kaW5nUmVzdHJpY3RlZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiRXh0ZW5kaW5nUmVzdHJpY3RlZCIsIHRlbXBsYXRlRXh0ZW5kaW5nUmVzdHJpY3RlZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVhURU5EU19ESVNBTExPV0VEX0NMQVNTIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0V4dGVuZGluZ1Jlc3RyaWN0ZWQoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVFeHRlbmRpbmdSZXN0cmljdGVkLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiJyR7bmFtZX0nIGlzIHJlc3RyaWN0ZWQgYW5kIGNhbid0IGJlIGV4dGVuZGVkIG9yIGltcGxlbWVudGVkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4dGVybmFsQWZ0ZXJDb25zdCA9IG1lc3NhZ2VFeHRlcm5hbEFmdGVyQ29uc3Q7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRXh0ZXJuYWxBZnRlckNvbnN0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRXh0ZXJuYWxBZnRlckNvbnN0IiwKICAgIGluZGV4OiA0NiwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIlRoZSBtb2RpZmllciAnZXh0ZXJuYWwnIHNob3VsZCBiZSBiZWZvcmUgdGhlIG1vZGlmaWVyICdjb25zdCcuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlLW9yZGVyaW5nIHRoZSBtb2RpZmllcnMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4dGVybmFsQWZ0ZXJGYWN0b3J5ID0gbWVzc2FnZUV4dGVybmFsQWZ0ZXJGYWN0b3J5OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUV4dGVybmFsQWZ0ZXJGYWN0b3J5ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRXh0ZXJuYWxBZnRlckZhY3RvcnkiLAogICAgaW5kZXg6IDQ3LAogICAgbWVzc2FnZToKICAgICAgICByIiIiVGhlIG1vZGlmaWVyICdleHRlcm5hbCcgc2hvdWxkIGJlIGJlZm9yZSB0aGUgbW9kaWZpZXIgJ2ZhY3RvcnknLiIiIiwKICAgIHRpcDogciIiIlRyeSByZS1vcmRlcmluZyB0aGUgbW9kaWZpZXJzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFeHRlcm5hbEFmdGVyU3RhdGljID0gbWVzc2FnZUV4dGVybmFsQWZ0ZXJTdGF0aWM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRXh0ZXJuYWxBZnRlclN0YXRpYyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkV4dGVybmFsQWZ0ZXJTdGF0aWMiLAogICAgaW5kZXg6IDQ4LAogICAgbWVzc2FnZToKICAgICAgICByIiIiVGhlIG1vZGlmaWVyICdleHRlcm5hbCcgc2hvdWxkIGJlIGJlZm9yZSB0aGUgbW9kaWZpZXIgJ3N0YXRpYycuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlLW9yZGVyaW5nIHRoZSBtb2RpZmllcnMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4dGVybmFsQ2xhc3MgPSBtZXNzYWdlRXh0ZXJuYWxDbGFzczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHRlcm5hbENsYXNzID0gY29uc3QgTWVzc2FnZUNvZGUoIkV4dGVybmFsQ2xhc3MiLAogICAgaW5kZXg6IDMsCiAgICBtZXNzYWdlOiByIiIiQ2xhc3NlcyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSAnZXh0ZXJuYWwnLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyB0aGUga2V5d29yZCAnZXh0ZXJuYWwnLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFeHRlcm5hbENvbnN0cnVjdG9yV2l0aEJvZHkgPQogICAgbWVzc2FnZUV4dGVybmFsQ29uc3RydWN0b3JXaXRoQm9keTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHRlcm5hbENvbnN0cnVjdG9yV2l0aEJvZHkgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJFeHRlcm5hbENvbnN0cnVjdG9yV2l0aEJvZHkiLAogICAgaW5kZXg6IDg3LAogICAgbWVzc2FnZTogciIiIkV4dGVybmFsIGNvbnN0cnVjdG9ycyBjYW4ndCBoYXZlIGEgYm9keS4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIlRyeSByZW1vdmluZyB0aGUgYm9keSBvZiB0aGUgY29uc3RydWN0b3IsIG9yIHJlbW92aW5nIHRoZSBrZXl3b3JkICdleHRlcm5hbCcuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4dGVybmFsQ29uc3RydWN0b3JXaXRoRmllbGRJbml0aWFsaXplcnMgPQogICAgbWVzc2FnZUV4dGVybmFsQ29uc3RydWN0b3JXaXRoRmllbGRJbml0aWFsaXplcnM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRXh0ZXJuYWxDb25zdHJ1Y3RvcldpdGhGaWVsZEluaXRpYWxpemVycyA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiRXh0ZXJuYWxDb25zdHJ1Y3RvcldpdGhGaWVsZEluaXRpYWxpemVycyIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVYVEVSTkFMX0NPTlNUUlVDVE9SX1dJVEhfRklFTERfSU5JVElBTElaRVJTIl0sCiAgICAgICAgbWVzc2FnZTogciIiIkFuIGV4dGVybmFsIGNvbnN0cnVjdG9yIGNhbid0IGluaXRpYWxpemUgZmllbGRzLiIiIiwKICAgICAgICB0aXA6CiAgICAgICAgICAgIHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGZpZWxkIGluaXRpYWxpemVycywgb3IgcmVtb3ZpbmcgdGhlIGtleXdvcmQgJ2V4dGVybmFsJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXh0ZXJuYWxFbnVtID0gbWVzc2FnZUV4dGVybmFsRW51bTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHRlcm5hbEVudW0gPSBjb25zdCBNZXNzYWdlQ29kZSgiRXh0ZXJuYWxFbnVtIiwKICAgIGluZGV4OiA1LAogICAgbWVzc2FnZTogciIiIkVudW1zIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlICdleHRlcm5hbCcuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nIHRoZSBrZXl3b3JkICdleHRlcm5hbCcuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4dGVybmFsRmFjdG9yeVJlZGlyZWN0aW9uID0KICAgIG1lc3NhZ2VFeHRlcm5hbEZhY3RvcnlSZWRpcmVjdGlvbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHRlcm5hbEZhY3RvcnlSZWRpcmVjdGlvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkV4dGVybmFsRmFjdG9yeVJlZGlyZWN0aW9uIiwKICAgIGluZGV4OiA4NSwKICAgIG1lc3NhZ2U6IHIiIiJBIHJlZGlyZWN0aW5nIGZhY3RvcnkgY2FuJ3QgYmUgZXh0ZXJuYWwuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nIHRoZSAnZXh0ZXJuYWwnIG1vZGlmaWVyLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFeHRlcm5hbEZhY3RvcnlXaXRoQm9keSA9IG1lc3NhZ2VFeHRlcm5hbEZhY3RvcnlXaXRoQm9keTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHRlcm5hbEZhY3RvcnlXaXRoQm9keSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkV4dGVybmFsRmFjdG9yeVdpdGhCb2R5IiwKICAgIGluZGV4OiA4NiwKICAgIG1lc3NhZ2U6IHIiIiJFeHRlcm5hbCBmYWN0b3JpZXMgY2FuJ3QgaGF2ZSBhIGJvZHkuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGJvZHkgb2YgdGhlIGZhY3RvcnksIG9yIHJlbW92aW5nIHRoZSBrZXl3b3JkICdleHRlcm5hbCcuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4dGVybmFsRmllbGQgPSBtZXNzYWdlRXh0ZXJuYWxGaWVsZDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHRlcm5hbEZpZWxkID0gY29uc3QgTWVzc2FnZUNvZGUoIkV4dGVybmFsRmllbGQiLAogICAgaW5kZXg6IDUwLAogICAgbWVzc2FnZTogciIiIkZpZWxkcyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSAnZXh0ZXJuYWwnLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyB0aGUga2V5d29yZCAnZXh0ZXJuYWwnLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFeHRlcm5hbE1ldGhvZFdpdGhCb2R5ID0gbWVzc2FnZUV4dGVybmFsTWV0aG9kV2l0aEJvZHk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRXh0ZXJuYWxNZXRob2RXaXRoQm9keSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkV4dGVybmFsTWV0aG9kV2l0aEJvZHkiLAogICAgaW5kZXg6IDQ5LAogICAgbWVzc2FnZTogciIiIkFuIGV4dGVybmFsIG9yIG5hdGl2ZSBtZXRob2QgY2FuJ3QgaGF2ZSBhIGJvZHkuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4dGVybmFsVHlwZWRlZiA9IG1lc3NhZ2VFeHRlcm5hbFR5cGVkZWY7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRXh0ZXJuYWxUeXBlZGVmID0gY29uc3QgTWVzc2FnZUNvZGUoIkV4dGVybmFsVHlwZWRlZiIsCiAgICBpbmRleDogNzYsCiAgICBtZXNzYWdlOiByIiIiVHlwZWRlZnMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgJ2V4dGVybmFsJy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGtleXdvcmQgJ2V4dGVybmFsJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IHRlbXBsYXRlRXh0cmFuZW91c01vZGlmaWVyID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDYW4ndCBoYXZlIG1vZGlmaWVyICcjbGV4ZW1lJyBoZXJlLiIiIiwKICAgICAgICB0aXBUZW1wbGF0ZTogciIiIlRyeSByZW1vdmluZyAnI2xleGVtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRXh0cmFuZW91c01vZGlmaWVyKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IGNvZGVFeHRyYW5lb3VzTW9kaWZpZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oCiAgICAgICAgIkV4dHJhbmVvdXNNb2RpZmllciIsIHRlbXBsYXRlRXh0cmFuZW91c01vZGlmaWVyLAogICAgICAgIGluZGV4OiA3Nyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRXh0cmFuZW91c01vZGlmaWVyKFRva2VuIHRva2VuKSB7CiAgU3RyaW5nIGxleGVtZSA9IHRva2VuLmxleGVtZTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUV4dHJhbmVvdXNNb2RpZmllciwKICAgICAgbWVzc2FnZTogIiIiQ2FuJ3QgaGF2ZSBtb2RpZmllciAnJHtsZXhlbWV9JyBoZXJlLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgcmVtb3ZpbmcgJyR7bGV4ZW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsndG9rZW4nOiB0b2tlbn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVGYWN0b3J5Tm90U3luYyA9IG1lc3NhZ2VGYWN0b3J5Tm90U3luYzsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VGYWN0b3J5Tm90U3luYyA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJGYWN0b3J5Tm90U3luYyIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9OX1NZTkNfRkFDVE9SWSJdLAogICAgbWVzc2FnZTogciIiIkZhY3RvcnkgYm9kaWVzIGNhbid0IHVzZSAnYXN5bmMnLCAnYXN5bmMqJywgb3IgJ3N5bmMqJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRmFjdG9yeVRvcExldmVsRGVjbGFyYXRpb24gPQogICAgbWVzc2FnZUZhY3RvcnlUb3BMZXZlbERlY2xhcmF0aW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUZhY3RvcnlUb3BMZXZlbERlY2xhcmF0aW9uID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRmFjdG9yeVRvcExldmVsRGVjbGFyYXRpb24iLAogICAgaW5kZXg6IDc4LAogICAgbWVzc2FnZTogciIiIlRvcC1sZXZlbCBkZWNsYXJhdGlvbnMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgJ2ZhY3RvcnknLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyB0aGUga2V5d29yZCAnZmFjdG9yeScuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUZhc3RhQ0xJQXJndW1lbnRSZXF1aXJlZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiRXhwZWN0ZWQgdmFsdWUgYWZ0ZXIgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNGYXN0YUNMSUFyZ3VtZW50UmVxdWlyZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUZhc3RhQ0xJQXJndW1lbnRSZXF1aXJlZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAiRmFzdGFDTElBcmd1bWVudFJlcXVpcmVkIiwKICB0ZW1wbGF0ZUZhc3RhQ0xJQXJndW1lbnRSZXF1aXJlZCwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNGYXN0YUNMSUFyZ3VtZW50UmVxdWlyZWQoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVGYXN0YUNMSUFyZ3VtZW50UmVxdWlyZWQsCiAgICAgIG1lc3NhZ2U6ICIiIkV4cGVjdGVkIHZhbHVlIGFmdGVyICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVGYXN0YVVzYWdlTG9uZyA9IG1lc3NhZ2VGYXN0YVVzYWdlTG9uZzsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VGYXN0YVVzYWdlTG9uZyA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiRmFzdGFVc2FnZUxvbmciLCBtZXNzYWdlOiByIiIiU3VwcG9ydGVkIG9wdGlvbnM6CgogIC1vIDxmaWxlPiwgLS1vdXRwdXQ9PGZpbGU+CiAgICBHZW5lcmF0ZSB0aGUgb3V0cHV0IGludG8gPGZpbGU+LgoKICAtaCwgL2gsIC8/LCAtLWhlbHAKICAgIERpc3BsYXkgdGhpcyBtZXNzYWdlIChhZGQgLXYgZm9yIGluZm9ybWF0aW9uIGFib3V0IGFsbCBvcHRpb25zKS4KCiAgLXYsIC0tdmVyYm9zZQogICAgRGlzcGxheSB2ZXJib3NlIGluZm9ybWF0aW9uLgoKICAtRG5hbWUKICAtRG5hbWU9dmFsdWUKICAgIERlZmluZSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbiB0aGUgY29tcGlsZS10aW1lIGVudmlyb25tZW50LgoKICAtLW5vLWRlZmluZXMKICAgIElnbm9yZSBhbGwgLUQgb3B0aW9ucyBhbmQgbGVhdmUgZW52aXJvbm1lbnQgY29uc3RhbnRzIHVuZXZhbHVhdGVkLgoKICAtLQogICAgU3RvcCBvcHRpb24gcGFyc2luZywgdGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmQgbGluZSBpcyBhc3N1bWVkIHRvIGJlCiAgICBmaWxlIG5hbWVzIG9yIGFyZ3VtZW50cyB0byB0aGUgRGFydCBwcm9ncmFtLgoKICAtLXBhY2thZ2VzPTxmaWxlPgogICAgVXNlIHBhY2thZ2UgcmVzb2x1dGlvbiBjb25maWd1cmF0aW9uIDxmaWxlPiwgd2hpY2ggc2hvdWxkIGNvbnRhaW4gYSBtYXBwaW5nCiAgICBvZiBwYWNrYWdlIG5hbWVzIHRvIHBhdGhzLgoKICAtLXBsYXRmb3JtPTxmaWxlPgogICAgUmVhZCB0aGUgU0RLIHBsYXRmb3JtIGZyb20gPGZpbGU+LCB3aGljaCBzaG91bGQgYmUgaW4gRGlsbC9LZXJuZWwgSVIgZm9ybWF0CiAgICBhbmQgY29udGFpbiB0aGUgRGFydCBTREsuCgogIC0tdGFyZ2V0PWRhcnQyanN8ZGFydDJqc19zZXJ2ZXJ8ZGFydF9ydW5uZXJ8Zmx1dHRlcnxmbHV0dGVyX3J1bm5lcnxub25lfHZtCiAgICBTcGVjaWZ5IHRoZSB0YXJnZXQgY29uZmlndXJhdGlvbi4KCiAgLS1lbmFibGUtYXNzZXJ0cwogICAgQ2hlY2sgYXNzZXJ0cyBpbiBpbml0aWFsaXplcnMgZHVyaW5nIGNvbnN0YW50IGV2YWx1YXRpb24uCgogIC0tdmVyaWZ5CiAgICBDaGVjayB0aGF0IHRoZSBnZW5lcmF0ZWQgb3V0cHV0IGlzIGZyZWUgb2YgdmFyaW91cyBwcm9ibGVtcy4gVGhpcyBpcyBtb3N0bHkKICAgIHVzZWZ1bCBmb3IgZGV2ZWxvcGVycyBvZiB0aGlzIGNvbXBpbGVyIG9yIEtlcm5lbCB0cmFuc2Zvcm1hdGlvbnMuCgogIC0tZHVtcC1pcgogICAgUHJpbnQgY29tcGlsZWQgbGlicmFyaWVzIGluIEtlcm5lbCBzb3VyY2Ugbm90YXRpb24uCgogIC0tb21pdC1wbGF0Zm9ybQogICAgRXhjbHVkZSB0aGUgcGxhdGZvcm0gZnJvbSB0aGUgc2VyaWFsaXplZCBkaWxsIGZpbGUuCgogIC0tYnl0ZWNvZGUKICAgIEdlbmVyYXRlIGJ5dGVjb2RlLiBTdXBwb3J0ZWQgb25seSBmb3IgU0RLIHBsYXRmb3JtIGNvbXBpbGF0aW9uLgoKICAtLWV4Y2x1ZGUtc291cmNlCiAgICBEbyBub3QgaW5jbHVkZSBzb3VyY2UgY29kZSBpbiB0aGUgZGlsbCBmaWxlLgoKICAtLWNvbXBpbGUtc2RrPTxzZGs+CiAgICBDb21waWxlIHRoZSBTREsgZnJvbSBzY3JhdGNoIGluc3RlYWQgb2YgcmVhZGluZyBpdCBmcm9tIGEgLmRpbGwgZmlsZQogICAgKHNlZSAtLXBsYXRmb3JtKS4KCiAgLS1zZGs9PHNkaz4KICAgIExvY2F0aW9uIG9mIHRoZSBTREsgc291cmNlcyBmb3IgdXNlIHdoZW4gY29tcGlsaW5nIGFkZGl0aW9uYWwgcGxhdGZvcm0KICAgIGxpYnJhcmllcy4KCiAgLS1zdXBlcm1peGluCiAgICBJZ25vcmVkIGZvciBub3cuCgogIC0tc2luZ2xlLXJvb3Qtc2NoZW1lPVN0cmluZwogIC0tc2luZ2xlLXJvb3QtYmFzZT08ZGlyPgogICAgU3BlY2lmeSBhIGN1c3RvbSBVUkkgc2NoZW1lIGFuZCBhIGxvY2F0aW9uIG9uIGRpc2sgd2hlcmUgc3VjaCBVUklzIGFyZQogICAgbWFwcGVkIHRvLgoKICAgIFdoZW4gc3BlY2lmaWVkLCB0aGUgY29tcGlsZXIgY2FuIGJlIGludm9rZWQgd2l0aCBpbnB1dHMgdXNpbmcgdGhlIGN1c3RvbQogICAgVVJJIHNjaGVtZS4gVGhlIGNvbXBpbGVyIGNhbiBpZ25vcmUgdGhlIGV4YWN0IGxvY2F0aW9uIG9mIGZpbGVzIG9uIGRpc2sKICAgIGFuZCBhcyBhIHJlc3VsdCB0byBwcm9kdWNlIG91dHB1dCB0aGF0IGlzIGluZGVwZW5kZW5kZW50IG9mIHRoZSBhYnNvbHV0ZQogICAgbG9jYXRpb24gb2YgZmlsZXMgb24gZGlzay4gVGhpcyBpcyBtb3N0bHkgdXNlZnVsIGZvciBpbnRlZ3JhdGluZyB3aXRoCiAgICBidWlsZCBzeXN0ZW1zLgoKICAtLWZhdGFsPWVycm9ycwogIC0tZmF0YWw9d2FybmluZ3MKICAgIE1ha2VzIG1lc3NhZ2VzIG9mIHRoZSBnaXZlbiBraW5kcyBmYXRhbCwgdGhhdCBpcywgaW1tZWRpYXRlbHkgc3RvcCB0aGUKICAgIGNvbXBpbGVyIHdpdGggYSBub24temVybyBleGl0LWNvZGUuIEluIC0tdmVyYm9zZSBtb2RlLCBhbHNvIGRpc3BsYXkgYW4KICAgIGludGVybmFsIHN0YWNrIHRyYWNlIGZyb20gdGhlIGNvbXBpbGVyLiBNdWx0aXBsZSBraW5kcyBjYW4gYmUgc2VwYXJhdGVkIGJ5CiAgICBjb21tYXMsIGZvciBleGFtcGxlLCAtLWZhdGFsPWVycm9ycyx3YXJuaW5ncy4KCiAgLS1lbmFibGUtZXhwZXJpbWVudD08ZmxhZz4KICAgIEVuYWJsZSBvciBkaXNhYmxlIGFuIGV4cGVyaW1lbnRhbCBmbGFnLCB1c2VkIHRvIGd1YXJkIGZlYXR1cmVzIGN1cnJlbnRseQogICAgaW4gZGV2ZWxvcG1lbnQuIFByZWZpeCBhbiBleHBlcmltZW50IG5hbWUgd2l0aCAnbm8tJyB0byBkaXNhYmxlIGl0LgogICAgTXVsdGlwbGUgZXhwZXJpbWVudHMgY2FuIGJlIHNlcGFyYXRlZCBieSBjb21tYXMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUZhc3RhVXNhZ2VTaG9ydCA9IG1lc3NhZ2VGYXN0YVVzYWdlU2hvcnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRmFzdGFVc2FnZVNob3J0ID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJGYXN0YVVzYWdlU2hvcnQiLCBtZXNzYWdlOiByIiIiRnJlcXVlbnRseSB1c2VkIG9wdGlvbnM6CgogIC1vIDxmaWxlPiBHZW5lcmF0ZSB0aGUgb3V0cHV0IGludG8gPGZpbGU+LgogIC1oICAgICAgICBEaXNwbGF5IHRoaXMgbWVzc2FnZSAoYWRkIC12IGZvciBpbmZvcm1hdGlvbiBhYm91dCBhbGwgb3B0aW9ucykuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlRmZpRmllbGRBbm5vdGF0aW9uID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJGaWVsZCAnI25hbWUnIHJlcXVpcmVzIGV4YWN0bHkgb25lIGFubm90YXRpb24gdG8gZGVjbGFyZSBpdHMgQysrIHR5cGUsIHdoaWNoIGNhbm5vdCBiZSBWb2lkLiBkYXJ0OmZmaSBzdHJ1Y3RzIChQb2ludGVyPFZvaWQ+KSBjYW5ub3QgaGF2ZSByZWd1bGFyIERhcnQgZmllbGRzLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRmZpRmllbGRBbm5vdGF0aW9uKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVGZmlGaWVsZEFubm90YXRpb24gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgIkZmaUZpZWxkQW5ub3RhdGlvbiIsCiAgdGVtcGxhdGVGZmlGaWVsZEFubm90YXRpb24sCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRmZpRmllbGRBbm5vdGF0aW9uKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRmZpRmllbGRBbm5vdGF0aW9uLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiRmllbGQgJyR7bmFtZX0nIHJlcXVpcmVzIGV4YWN0bHkgb25lIGFubm90YXRpb24gdG8gZGVjbGFyZSBpdHMgQysrIHR5cGUsIHdoaWNoIGNhbm5vdCBiZSBWb2lkLiBkYXJ0OmZmaSBzdHJ1Y3RzIChQb2ludGVyPFZvaWQ+KSBjYW5ub3QgaGF2ZSByZWd1bGFyIERhcnQgZmllbGRzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlRmZpRmllbGRJbml0aWFsaXplciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiRmllbGQgJyNuYW1lJyBpcyBhIGRhcnQ6ZmZpIFBvaW50ZXIgdG8gYSBzdHJ1Y3QgZmllbGQgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNvbnN0cnVjdG9yIGV4ZWN1dGlvbi4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ZmaUZpZWxkSW5pdGlhbGl6ZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUZmaUZpZWxkSW5pdGlhbGl6ZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgIkZmaUZpZWxkSW5pdGlhbGl6ZXIiLAogIHRlbXBsYXRlRmZpRmllbGRJbml0aWFsaXplciwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNGZmlGaWVsZEluaXRpYWxpemVyKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRmZpRmllbGRJbml0aWFsaXplciwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkZpZWxkICcke25hbWV9JyBpcyBhIGRhcnQ6ZmZpIFBvaW50ZXIgdG8gYSBzdHJ1Y3QgZmllbGQgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNvbnN0cnVjdG9yIGV4ZWN1dGlvbi4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUZmaU5vdFN0YXRpYyA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiI25hbWUgZXhwZWN0cyBhIHN0YXRpYyBmdW5jdGlvbiBhcyBwYXJhbWV0ZXIuIGRhcnQ6ZmZpIG9ubHkgc3VwcG9ydHMgY2FsbGluZyBzdGF0aWMgRGFydCBmdW5jdGlvbnMgZnJvbSBjLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRmZpTm90U3RhdGljKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVGZmlOb3RTdGF0aWMgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgIkZmaU5vdFN0YXRpYyIsCiAgdGVtcGxhdGVGZmlOb3RTdGF0aWMsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRmZpTm90U3RhdGljKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRmZpTm90U3RhdGljLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiJHtuYW1lfSBleHBlY3RzIGEgc3RhdGljIGZ1bmN0aW9uIGFzIHBhcmFtZXRlci4gZGFydDpmZmkgb25seSBzdXBwb3J0cyBjYWxsaW5nIHN0YXRpYyBEYXJ0IGZ1bmN0aW9ucyBmcm9tIGMuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVGZmlTdHJ1Y3RBbm5vdGF0aW9uID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJDbGFzcyAnI25hbWUnIGlzIGEgZGFydDpmZmkgUG9pbnRlciBidXQgaGFzIG5vIHN0cnVjdCBhbm5vdGF0aW9uLiBPbmx5IHN0cnVjdCBQb2ludGVycyBjYW4gaGF2ZSBmaWVsZHMuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNGZmlTdHJ1Y3RBbm5vdGF0aW9uKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVGZmlTdHJ1Y3RBbm5vdGF0aW9uID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICJGZmlTdHJ1Y3RBbm5vdGF0aW9uIiwKICB0ZW1wbGF0ZUZmaVN0cnVjdEFubm90YXRpb24sCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRmZpU3RydWN0QW5ub3RhdGlvbihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUZmaVN0cnVjdEFubm90YXRpb24sCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDbGFzcyAnJHtuYW1lfScgaXMgYSBkYXJ0OmZmaSBQb2ludGVyIGJ1dCBoYXMgbm8gc3RydWN0IGFubm90YXRpb24uIE9ubHkgc3RydWN0IFBvaW50ZXJzIGNhbiBoYXZlIGZpZWxkcy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUpPiB0ZW1wbGF0ZUZmaVR5cGVJbnZhbGlkID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJFeHBlY3RlZCB0eXBlICcjdHlwZScgdG8gYmUgYSB2YWxpZCBhbmQgaW5zdGFudGlhdGVkIHN1YnR5cGUgb2YgJ05hdGl2ZVR5cGUnLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRmZpVHlwZUludmFsaWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlKT4gY29kZUZmaVR5cGVJbnZhbGlkID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSk+KAogICJGZmlUeXBlSW52YWxpZCIsCiAgdGVtcGxhdGVGZmlUeXBlSW52YWxpZCwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNGZmlUeXBlSW52YWxpZChEYXJ0VHlwZSBfdHlwZSkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUZmaVR5cGVJbnZhbGlkLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiRXhwZWN0ZWQgdHlwZSAnJHt0eXBlfScgdG8gYmUgYSB2YWxpZCBhbmQgaW5zdGFudGlhdGVkIHN1YnR5cGUgb2YgJ05hdGl2ZVR5cGUnLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUgX3R5cGUyLAogICAgICAgIERhcnRUeXBlCiAgICAgICAgICAgIF90eXBlMyk+IHRlbXBsYXRlRmZpVHlwZU1pc21hdGNoID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBEYXJ0VHlwZSBfdHlwZTMpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiRXhwZWN0ZWQgdHlwZSAnI3R5cGUnIHRvIGJlICcjdHlwZTInLCB3aGljaCBpcyB0aGUgRGFydCB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gJyN0eXBlMycuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNGZmlUeXBlTWlzbWF0Y2gpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIERhcnRUeXBlIF90eXBlMyk+CiAgICBjb2RlRmZpVHlwZU1pc21hdGNoID0gY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIERhcnRUeXBlIF90eXBlMyk+KAogICJGZmlUeXBlTWlzbWF0Y2giLAogIHRlbXBsYXRlRmZpVHlwZU1pc21hdGNoLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ZmaVR5cGVNaXNtYXRjaCgKICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIERhcnRUeXBlIF90eXBlMykgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBMaXN0PE9iamVjdD4gdHlwZTNQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMyk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMyA9IHR5cGUzUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRmZpVHlwZU1pc21hdGNoLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiRXhwZWN0ZWQgdHlwZSAnJHt0eXBlfScgdG8gYmUgJyR7dHlwZTJ9Jywgd2hpY2ggaXMgdGhlIERhcnQgdHlwZSBjb3JyZXNwb25kaW5nIHRvICcke3R5cGUzfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsndHlwZSc6IF90eXBlLCAndHlwZTInOiBfdHlwZTIsICd0eXBlMyc6IF90eXBlM30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUpPiB0ZW1wbGF0ZUZmaVR5cGVVbnNpemVkID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiTWV0aG9kICcjbmFtZScgY2Fubm90IGJlIGNhbGxlZCBvbiBzb21ldGhpbmcgb2YgdHlwZSAnI3R5cGUnIGFzIHRoaXMgdHlwZSBpcyB1bnNpemVkLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRmZpVHlwZVVuc2l6ZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSk+IGNvZGVGZmlUeXBlVW5zaXplZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlKT4oCiAgIkZmaVR5cGVVbnNpemVkIiwKICB0ZW1wbGF0ZUZmaVR5cGVVbnNpemVkLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ZmaVR5cGVVbnNpemVkKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVGZmlUeXBlVW5zaXplZCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIk1ldGhvZCAnJHtuYW1lfScgY2Fubm90IGJlIGNhbGxlZCBvbiBzb21ldGhpbmcgb2YgdHlwZSAnJHt0eXBlfScgYXMgdGhpcyB0eXBlIGlzIHVuc2l6ZWQuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd0eXBlJzogX3R5cGV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRmllbGRJbml0aWFsaXplZE91dHNpZGVEZWNsYXJpbmdDbGFzcyA9CiAgICBtZXNzYWdlRmllbGRJbml0aWFsaXplZE91dHNpZGVEZWNsYXJpbmdDbGFzczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VGaWVsZEluaXRpYWxpemVkT3V0c2lkZURlY2xhcmluZ0NsYXNzID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRmllbGRJbml0aWFsaXplZE91dHNpZGVEZWNsYXJpbmdDbGFzcyIsCiAgICBpbmRleDogODgsCiAgICBtZXNzYWdlOiByIiIiQSBmaWVsZCBjYW4gb25seSBiZSBpbml0aWFsaXplZCBpbiBpdCdzIGRlY2xhcmluZyBjbGFzcyIiIiwKICAgIHRpcDoKICAgICAgICByIiIiVHJ5IHBhc3NpbmcgYSB2YWx1ZSBpbnRvIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLCBvciBtb3ZpbmcgdGhlIGluaXRpYWxpemF0aW9uIGludG8gdGhlIGNvbnN0cnVjdG9yIGJvZHkuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUZpZWxkSW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3IgPQogICAgbWVzc2FnZUZpZWxkSW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3I7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRmllbGRJbml0aWFsaXplck91dHNpZGVDb25zdHJ1Y3RvciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkZpZWxkSW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3IiLAogICAgaW5kZXg6IDc5LAogICAgbWVzc2FnZTogciIiIkZpZWxkIGZvcm1hbCBwYXJhbWV0ZXJzIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBjb25zdHJ1Y3Rvci4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgJ3RoaXMuJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRmluYWxBbmRDb3ZhcmlhbnQgPSBtZXNzYWdlRmluYWxBbmRDb3ZhcmlhbnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRmluYWxBbmRDb3ZhcmlhbnQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJGaW5hbEFuZENvdmFyaWFudCIsCiAgICBpbmRleDogODAsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJNZW1iZXJzIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlIGJvdGggJ2ZpbmFsJyBhbmQgJ2NvdmFyaWFudCcuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nIGVpdGhlciB0aGUgJ2ZpbmFsJyBvciAnY292YXJpYW50JyBrZXl3b3JkLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVGaW5hbEFuZFZhciA9IG1lc3NhZ2VGaW5hbEFuZFZhcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VGaW5hbEFuZFZhciA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJGaW5hbEFuZFZhciIsCiAgICBpbmRleDogODEsCiAgICBtZXNzYWdlOiByIiIiTWVtYmVycyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSBib3RoICdmaW5hbCcgYW5kICd2YXInLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyB0aGUga2V5d29yZCAndmFyJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lKT4gdGVtcGxhdGVGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWQgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJGaW5hbCBmaWVsZCAnI25hbWUnIGlzIG5vdCBpbml0aWFsaXplZC4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IHRvIGluaXRpYWxpemUgdGhlIGZpZWxkIGluIHRoZSBkZWNsYXJhdGlvbiBvciBpbiBldmVyeSBjb25zdHJ1Y3Rvci4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ZpbmFsRmllbGROb3RJbml0aWFsaXplZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRmluYWxGaWVsZE5vdEluaXRpYWxpemVkID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWQiLCB0ZW1wbGF0ZUZpbmFsRmllbGROb3RJbml0aWFsaXplZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRklOQUxfTk9UX0lOSVRJQUxJWkVEIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ZpbmFsRmllbGROb3RJbml0aWFsaXplZChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUZpbmFsRmllbGROb3RJbml0aWFsaXplZCwKICAgICAgbWVzc2FnZTogIiIiRmluYWwgZmllbGQgJyR7bmFtZX0nIGlzIG5vdCBpbml0aWFsaXplZC4iIiIsCiAgICAgIHRpcDoKICAgICAgICAgICIiIlRyeSB0byBpbml0aWFsaXplIHRoZSBmaWVsZCBpbiB0aGUgZGVjbGFyYXRpb24gb3IgaW4gZXZlcnkgY29uc3RydWN0b3IuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lKT4gdGVtcGxhdGVGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWRCeUNvbnN0cnVjdG9yID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJGaW5hbCBmaWVsZCAnI25hbWUnIGlzIG5vdCBpbml0aWFsaXplZCBieSB0aGlzIGNvbnN0cnVjdG9yLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQgdXNpbmcgYW4gaW5pdGlhbGl6aW5nIGZvcm1hbCBvciBhIGZpZWxkIGluaXRpYWxpemVyLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRmluYWxGaWVsZE5vdEluaXRpYWxpemVkQnlDb25zdHJ1Y3Rvcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgY29kZUZpbmFsRmllbGROb3RJbml0aWFsaXplZEJ5Q29uc3RydWN0b3IgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkZpbmFsRmllbGROb3RJbml0aWFsaXplZEJ5Q29uc3RydWN0b3IiLAogICAgICAgIHRlbXBsYXRlRmluYWxGaWVsZE5vdEluaXRpYWxpemVkQnlDb25zdHJ1Y3RvciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRklOQUxfTk9UX0lOSVRJQUxJWkVEX0NPTlNUUlVDVE9SXzEiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRmluYWxGaWVsZE5vdEluaXRpYWxpemVkQnlDb25zdHJ1Y3RvcihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUZpbmFsRmllbGROb3RJbml0aWFsaXplZEJ5Q29uc3RydWN0b3IsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJGaW5hbCBmaWVsZCAnJHtuYW1lfScgaXMgbm90IGluaXRpYWxpemVkIGJ5IHRoaXMgY29uc3RydWN0b3IuIiIiLAogICAgICB0aXA6CiAgICAgICAgICAiIiJUcnkgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQgdXNpbmcgYW4gaW5pdGlhbGl6aW5nIGZvcm1hbCBvciBhIGZpZWxkIGluaXRpYWxpemVyLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlRmluYWxGaWVsZFdpdGhvdXRJbml0aWFsaXplciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlRoZSBmaW5hbCB2YXJpYWJsZSAnI25hbWUnIG11c3QgYmUgaW5pdGlhbGl6ZWQuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBhZGRpbmcgYW4gaW5pdGlhbGl6ZXIgKCc9IDxleHByZXNzaW9uPicpIHRvIHRoZSBkZWNsYXJhdGlvbi4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ZpbmFsRmllbGRXaXRob3V0SW5pdGlhbGl6ZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUZpbmFsRmllbGRXaXRob3V0SW5pdGlhbGl6ZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkZpbmFsRmllbGRXaXRob3V0SW5pdGlhbGl6ZXIiLCB0ZW1wbGF0ZUZpbmFsRmllbGRXaXRob3V0SW5pdGlhbGl6ZXIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkZJTkFMX05PVF9JTklUSUFMSVpFRCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNGaW5hbEZpZWxkV2l0aG91dEluaXRpYWxpemVyKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRmluYWxGaWVsZFdpdGhvdXRJbml0aWFsaXplciwKICAgICAgbWVzc2FnZTogIiIiVGhlIGZpbmFsIHZhcmlhYmxlICcke25hbWV9JyBtdXN0IGJlIGluaXRpYWxpemVkLiIiIiwKICAgICAgdGlwOgogICAgICAgICAgIiIiVHJ5IGFkZGluZyBhbiBpbml0aWFsaXplciAoJz0gPGV4cHJlc3Npb24+JykgdG8gdGhlIGRlY2xhcmF0aW9uLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIicjbmFtZScgaXMgYSBmaW5hbCBpbnN0YW5jZSB2YXJpYWJsZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICBjb2RlRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWQiLAogICAgICAgIHRlbXBsYXRlRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJGSU5BTF9JTklUSUFMSVpFRF9NVUxUSVBMRV9USU1FUyJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ZpbmFsSW5zdGFuY2VWYXJpYWJsZUFscmVhZHlJbml0aWFsaXplZChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUZpbmFsSW5zdGFuY2VWYXJpYWJsZUFscmVhZHlJbml0aWFsaXplZCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIicke25hbWV9JyBpcyBhIGZpbmFsIGluc3RhbmNlIHZhcmlhYmxlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkQ2F1c2UgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIicjbmFtZScgd2FzIGluaXRpYWxpemVkIGhlcmUuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6CiAgICAgICAgICAgIF93aXRoQXJndW1lbnRzRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkQ2F1c2UpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIGNvZGVGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWRDYXVzZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkQ2F1c2UiLAogICAgICAgIHRlbXBsYXRlRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkQ2F1c2UsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ZpbmFsSW5zdGFuY2VWYXJpYWJsZUFscmVhZHlJbml0aWFsaXplZENhdXNlKAogICAgU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWRDYXVzZSwKICAgICAgbWVzc2FnZTogIiIiJyR7bmFtZX0nIHdhcyBpbml0aWFsaXplZCBoZXJlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZQogICAgICAgICAgICBfdHlwZTIpPiB0ZW1wbGF0ZUZvckluTG9vcEVsZW1lbnRUeXBlTm90QXNzaWduYWJsZSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJBIHZhbHVlIG9mIHR5cGUgJyN0eXBlJyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJyN0eXBlMicuIiIiLAogICAgdGlwVGVtcGxhdGU6IHIiIiJUcnkgY2hhbmdpbmcgdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRm9ySW5Mb29wRWxlbWVudFR5cGVOb3RBc3NpZ25hYmxlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4KICAgIGNvZGVGb3JJbkxvb3BFbGVtZW50VHlwZU5vdEFzc2lnbmFibGUgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPigKICAgICAgICAiRm9ySW5Mb29wRWxlbWVudFR5cGVOb3RBc3NpZ25hYmxlIiwKICAgICAgICB0ZW1wbGF0ZUZvckluTG9vcEVsZW1lbnRUeXBlTm90QXNzaWduYWJsZSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRk9SX0lOX09GX0lOVkFMSURfRUxFTUVOVF9UWVBFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ZvckluTG9vcEVsZW1lbnRUeXBlTm90QXNzaWduYWJsZSgKICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRm9ySW5Mb29wRWxlbWVudFR5cGVOb3RBc3NpZ25hYmxlLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQSB2YWx1ZSBvZiB0eXBlICcke3R5cGV9JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiVHJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVGb3JJbkxvb3BFeGFjdGx5T25lVmFyaWFibGUgPQogICAgbWVzc2FnZUZvckluTG9vcEV4YWN0bHlPbmVWYXJpYWJsZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VGb3JJbkxvb3BFeGFjdGx5T25lVmFyaWFibGUgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJGb3JJbkxvb3BFeGFjdGx5T25lVmFyaWFibGUiLAogICAgbWVzc2FnZTogciIiIkEgZm9yLWluIGxvb3AgY2FuJ3QgaGF2ZSBtb3JlIHRoYW4gb25lIGxvb3AgdmFyaWFibGUuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUZvckluTG9vcE5vdEFzc2lnbmFibGUgPSBtZXNzYWdlRm9ySW5Mb29wTm90QXNzaWduYWJsZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VGb3JJbkxvb3BOb3RBc3NpZ25hYmxlID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRm9ySW5Mb29wTm90QXNzaWduYWJsZSIsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJDYW4ndCBhc3NpZ24gdG8gdGhpcywgc28gaXQgY2FuJ3QgYmUgdXNlZCBpbiBhIGZvci1pbiBsb29wLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUyKT4gdGVtcGxhdGVGb3JJbkxvb3BUeXBlTm90SXRlcmFibGUgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIHR5cGUgJyN0eXBlJyB1c2VkIGluIHRoZSAnZm9yJyBsb29wIG11c3QgaW1wbGVtZW50ICcjdHlwZTInLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRm9ySW5Mb29wVHlwZU5vdEl0ZXJhYmxlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4KICAgIGNvZGVGb3JJbkxvb3BUeXBlTm90SXRlcmFibGUgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPigKICAgICAgICAiRm9ySW5Mb29wVHlwZU5vdEl0ZXJhYmxlIiwgdGVtcGxhdGVGb3JJbkxvb3BUeXBlTm90SXRlcmFibGUsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkZPUl9JTl9PRl9JTlZBTElEX1RZUEUiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRm9ySW5Mb29wVHlwZU5vdEl0ZXJhYmxlKAogICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMikgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVGb3JJbkxvb3BUeXBlTm90SXRlcmFibGUsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgdHlwZSAnJHt0eXBlfScgdXNlZCBpbiB0aGUgJ2ZvcicgbG9vcCBtdXN0IGltcGxlbWVudCAnJHt0eXBlMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUZvckluTG9vcFdpdGhDb25zdFZhcmlhYmxlID0KICAgIG1lc3NhZ2VGb3JJbkxvb3BXaXRoQ29uc3RWYXJpYWJsZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VGb3JJbkxvb3BXaXRoQ29uc3RWYXJpYWJsZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkZvckluTG9vcFdpdGhDb25zdFZhcmlhYmxlIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJGT1JfSU5fV0lUSF9DT05TVF9WQVJJQUJMRSJdLAogICAgbWVzc2FnZTogciIiIkEgZm9yLWluIGxvb3AtdmFyaWFibGUgY2FuJ3QgYmUgJ2NvbnN0Jy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlICdjb25zdCcgbW9kaWZpZXIuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUZ1bmN0aW9uVHlwZURlZmF1bHRWYWx1ZSA9IG1lc3NhZ2VGdW5jdGlvblR5cGVEZWZhdWx0VmFsdWU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRnVuY3Rpb25UeXBlRGVmYXVsdFZhbHVlID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRnVuY3Rpb25UeXBlRGVmYXVsdFZhbHVlIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJERUZBVUxUX1ZBTFVFX0lOX0ZVTkNUSU9OX1RZUEUiXSwKICAgIG1lc3NhZ2U6IHIiIiJDYW4ndCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSBpbiBhIGZ1bmN0aW9uIHR5cGUuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUZ1bmN0aW9uVHlwZWRQYXJhbWV0ZXJWYXIgPQogICAgbWVzc2FnZUZ1bmN0aW9uVHlwZWRQYXJhbWV0ZXJWYXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRnVuY3Rpb25UeXBlZFBhcmFtZXRlclZhciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkZ1bmN0aW9uVHlwZWRQYXJhbWV0ZXJWYXIiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkZVTkNUSU9OX1RZUEVEX1BBUkFNRVRFUl9WQVIiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkZ1bmN0aW9uLXR5cGVkIHBhcmFtZXRlcnMgY2FuJ3Qgc3BlY2lmeSAnY29uc3QnLCAnZmluYWwnIG9yICd2YXInIGluIHBsYWNlIG9mIGEgcmV0dXJuIHR5cGUuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlcGxhY2luZyB0aGUga2V5d29yZCB3aXRoIGEgcmV0dXJuIHR5cGUuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUdlbmVyYXRvclJldHVybnNWYWx1ZSA9IG1lc3NhZ2VHZW5lcmF0b3JSZXR1cm5zVmFsdWU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlR2VuZXJhdG9yUmV0dXJuc1ZhbHVlID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiR2VuZXJhdG9yUmV0dXJuc1ZhbHVlIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJSRVRVUk5fSU5fR0VORVJBVE9SIl0sCiAgICBtZXNzYWdlOiByIiIiJ3N5bmMqJyBhbmQgJ2FzeW5jKicgY2FuJ3QgcmV0dXJuIGEgdmFsdWUuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUdlbmVyaWNGdW5jdGlvblR5cGVJbkJvdW5kID0KICAgIG1lc3NhZ2VHZW5lcmljRnVuY3Rpb25UeXBlSW5Cb3VuZDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VHZW5lcmljRnVuY3Rpb25UeXBlSW5Cb3VuZCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkdlbmVyaWNGdW5jdGlvblR5cGVJbkJvdW5kIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJHRU5FUklDX0ZVTkNUSU9OX1RZUEVfQ0FOTk9UX0JFX0JPVU5EIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJUeXBlIHZhcmlhYmxlcyBjYW4ndCBoYXZlIGdlbmVyaWMgZnVuY3Rpb24gdHlwZXMgaW4gdGhlaXIgYm91bmRzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlKT4KICAgIHRlbXBsYXRlR2VuZXJpY0Z1bmN0aW9uVHlwZUluZmVycmVkQXNBY3R1YWxUeXBlQXJndW1lbnQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlVuZXhwZWN0ZWQgZ2VuZXJpYyBmdW5jdGlvbiB0eXBlICcjdHlwZScgaW5mZXJyZWQgYXMgYSB0eXBlIGFyZ3VtZW50LiIiIiwKICAgICAgICB0aXBUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlRyeSBwcm92aWRpbmcgYSBub24tZ2VuZXJpYyBmdW5jdGlvbiB0eXBlIGV4cGxpY2l0bHkuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6CiAgICAgICAgICAgIF93aXRoQXJndW1lbnRzR2VuZXJpY0Z1bmN0aW9uVHlwZUluZmVycmVkQXNBY3R1YWxUeXBlQXJndW1lbnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlKT4KICAgIGNvZGVHZW5lcmljRnVuY3Rpb25UeXBlSW5mZXJyZWRBc0FjdHVhbFR5cGVBcmd1bWVudCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUpPigKICAgICAgICAiR2VuZXJpY0Z1bmN0aW9uVHlwZUluZmVycmVkQXNBY3R1YWxUeXBlQXJndW1lbnQiLAogICAgICAgIHRlbXBsYXRlR2VuZXJpY0Z1bmN0aW9uVHlwZUluZmVycmVkQXNBY3R1YWxUeXBlQXJndW1lbnQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkdFTkVSSUNfRlVOQ1RJT05fQ0FOTk9UX0JFX1RZUEVfQVJHVU1FTlQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzR2VuZXJpY0Z1bmN0aW9uVHlwZUluZmVycmVkQXNBY3R1YWxUeXBlQXJndW1lbnQoCiAgICBEYXJ0VHlwZSBfdHlwZSkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUdlbmVyaWNGdW5jdGlvblR5cGVJbmZlcnJlZEFzQWN0dWFsVHlwZUFyZ3VtZW50LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVW5leHBlY3RlZCBnZW5lcmljIGZ1bmN0aW9uIHR5cGUgJyR7dHlwZX0nIGluZmVycmVkIGFzIGEgdHlwZSBhcmd1bWVudC4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiVHJ5IHByb3ZpZGluZyBhIG5vbi1nZW5lcmljIGZ1bmN0aW9uIHR5cGUgZXhwbGljaXRseS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlR2VuZXJpY0Z1bmN0aW9uVHlwZVVzZWRBc0FjdHVhbFR5cGVBcmd1bWVudCA9CiAgICBtZXNzYWdlR2VuZXJpY0Z1bmN0aW9uVHlwZVVzZWRBc0FjdHVhbFR5cGVBcmd1bWVudDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VHZW5lcmljRnVuY3Rpb25UeXBlVXNlZEFzQWN0dWFsVHlwZUFyZ3VtZW50ID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJHZW5lcmljRnVuY3Rpb25UeXBlVXNlZEFzQWN0dWFsVHlwZUFyZ3VtZW50IiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiR0VORVJJQ19GVU5DVElPTl9DQU5OT1RfQkVfVFlQRV9BUkdVTUVOVCJdLAogICAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAgIHIiIiJVbmV4cGVjdGVkIGdlbmVyaWMgZnVuY3Rpb24gdHlwZSBmb3VuZCBpbiBhIHR5cGUgYXJndW1lbnQuIiIiLAogICAgICAgIHRpcDogciIiIlRyeSB1c2luZyBhIG5vbi1nZW5lcmljIGZ1bmN0aW9uIHR5cGUuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUdldHRlck5vdEZvdW5kID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJHZXR0ZXIgbm90IGZvdW5kOiAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0dldHRlck5vdEZvdW5kKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVHZXR0ZXJOb3RGb3VuZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiR2V0dGVyTm90Rm91bmQiLCB0ZW1wbGF0ZUdldHRlck5vdEZvdW5kLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJVTkRFRklORURfR0VUVEVSIl0sCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzR2V0dGVyTm90Rm91bmQoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVHZXR0ZXJOb3RGb3VuZCwKICAgICAgbWVzc2FnZTogIiIiR2V0dGVyIG5vdCBmb3VuZDogJyR7bmFtZX0nLiIiIiwgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUdldHRlcldpdGhGb3JtYWxzID0gbWVzc2FnZUdldHRlcldpdGhGb3JtYWxzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUdldHRlcldpdGhGb3JtYWxzID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiR2V0dGVyV2l0aEZvcm1hbHMiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkdFVFRFUl9XSVRIX1BBUkFNRVRFUlMiXSwKICAgIG1lc3NhZ2U6IHIiIiJBIGdldHRlciBjYW4ndCBoYXZlIGZvcm1hbCBwYXJhbWV0ZXJzLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyAnKC4uLiknLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbGxlZ2FsQXNzaWdubWVudFRvTm9uQXNzaWduYWJsZSA9CiAgICBtZXNzYWdlSWxsZWdhbEFzc2lnbm1lbnRUb05vbkFzc2lnbmFibGU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSWxsZWdhbEFzc2lnbm1lbnRUb05vbkFzc2lnbmFibGUgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbGxlZ2FsQXNzaWdubWVudFRvTm9uQXNzaWduYWJsZSIsCiAgICBpbmRleDogNDUsCiAgICBtZXNzYWdlOiByIiIiSWxsZWdhbCBhc3NpZ25tZW50IHRvIG5vbi1hc3NpZ25hYmxlIGV4cHJlc3Npb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUlsbGVnYWxBc3luY0dlbmVyYXRvclJldHVyblR5cGUgPQogICAgbWVzc2FnZUlsbGVnYWxBc3luY0dlbmVyYXRvclJldHVyblR5cGU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSWxsZWdhbEFzeW5jR2VuZXJhdG9yUmV0dXJuVHlwZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIklsbGVnYWxBc3luY0dlbmVyYXRvclJldHVyblR5cGUiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklMTEVHQUxfQVNZTkNfR0VORVJBVE9SX1JFVFVSTl9UWVBFIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJGdW5jdGlvbnMgbWFya2VkICdhc3luYyonIG11c3QgaGF2ZSBhIHJldHVybiB0eXBlIGFzc2lnbmFibGUgdG8gJ1N0cmVhbScuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUlsbGVnYWxBc3luY0dlbmVyYXRvclZvaWRSZXR1cm5UeXBlID0KICAgIG1lc3NhZ2VJbGxlZ2FsQXN5bmNHZW5lcmF0b3JWb2lkUmV0dXJuVHlwZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbGxlZ2FsQXN5bmNHZW5lcmF0b3JWb2lkUmV0dXJuVHlwZSA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiSWxsZWdhbEFzeW5jR2VuZXJhdG9yVm9pZFJldHVyblR5cGUiLAogICAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAgIHIiIiJGdW5jdGlvbnMgbWFya2VkICdhc3luYyonIGNhbid0IGhhdmUgcmV0dXJuIHR5cGUgJ3ZvaWQnLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbGxlZ2FsQXN5bmNSZXR1cm5UeXBlID0gbWVzc2FnZUlsbGVnYWxBc3luY1JldHVyblR5cGU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSWxsZWdhbEFzeW5jUmV0dXJuVHlwZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIklsbGVnYWxBc3luY1JldHVyblR5cGUiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklMTEVHQUxfQVNZTkNfUkVUVVJOX1RZUEUiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkZ1bmN0aW9ucyBtYXJrZWQgJ2FzeW5jJyBtdXN0IGhhdmUgYSByZXR1cm4gdHlwZSBhc3NpZ25hYmxlIHRvICdGdXR1cmUnLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVJbGxlZ2FsTWl4aW4gPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlRoZSB0eXBlICcjbmFtZScgY2FuJ3QgYmUgbWl4ZWQgaW4uIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSWxsZWdhbE1peGluKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVJbGxlZ2FsTWl4aW4gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIklsbGVnYWxNaXhpbiIsIHRlbXBsYXRlSWxsZWdhbE1peGluLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTExFR0FMX01JWElOIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0lsbGVnYWxNaXhpbihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUlsbGVnYWxNaXhpbiwKICAgICAgbWVzc2FnZTogIiIiVGhlIHR5cGUgJyR7bmFtZX0nIGNhbid0IGJlIG1peGVkIGluLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9ycyA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiQ2FuJ3QgdXNlICcjbmFtZScgYXMgYSBtaXhpbiBiZWNhdXNlIGl0IGhhcyBjb25zdHJ1Y3RvcnMuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnMpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUlsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9ycyIsIHRlbXBsYXRlSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnMsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk1JWElOX0RFQ0xBUkVTX0NPTlNUUlVDVE9SIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0lsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnMsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDYW4ndCB1c2UgJyR7bmFtZX0nIGFzIGEgbWl4aW4gYmVjYXVzZSBpdCBoYXMgY29uc3RydWN0b3JzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9yc0NhdXNlID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUaGlzIGNvbnN0cnVjdG9yIHByZXZlbnRzIHVzaW5nICcjbmFtZScgYXMgYSBtaXhpbi4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9yc0NhdXNlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICBjb2RlSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnNDYXVzZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnNDYXVzZSIsCiAgICAgICAgdGVtcGxhdGVJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9yc0NhdXNlLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9yc0NhdXNlKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnNDYXVzZSwKICAgICAgbWVzc2FnZTogIiIiVGhpcyBjb25zdHJ1Y3RvciBwcmV2ZW50cyB1c2luZyAnJHtuYW1lfScgYXMgYSBtaXhpbi4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbGxlZ2FsU3luY0dlbmVyYXRvclJldHVyblR5cGUgPQogICAgbWVzc2FnZUlsbGVnYWxTeW5jR2VuZXJhdG9yUmV0dXJuVHlwZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbGxlZ2FsU3luY0dlbmVyYXRvclJldHVyblR5cGUgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbGxlZ2FsU3luY0dlbmVyYXRvclJldHVyblR5cGUiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklMTEVHQUxfU1lOQ19HRU5FUkFUT1JfUkVUVVJOX1RZUEUiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkZ1bmN0aW9ucyBtYXJrZWQgJ3N5bmMqJyBtdXN0IGhhdmUgYSByZXR1cm4gdHlwZSBhc3NpZ25hYmxlIHRvICdJdGVyYWJsZScuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUlsbGVnYWxTeW5jR2VuZXJhdG9yVm9pZFJldHVyblR5cGUgPQogICAgbWVzc2FnZUlsbGVnYWxTeW5jR2VuZXJhdG9yVm9pZFJldHVyblR5cGU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSWxsZWdhbFN5bmNHZW5lcmF0b3JWb2lkUmV0dXJuVHlwZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIklsbGVnYWxTeW5jR2VuZXJhdG9yVm9pZFJldHVyblR5cGUiLAogICAgbWVzc2FnZTogciIiIkZ1bmN0aW9ucyBtYXJrZWQgJ3N5bmMqJyBjYW4ndCBoYXZlIHJldHVybiB0eXBlICd2b2lkJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW1wbGVtZW50c0JlZm9yZUV4dGVuZHMgPSBtZXNzYWdlSW1wbGVtZW50c0JlZm9yZUV4dGVuZHM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW1wbGVtZW50c0JlZm9yZUV4dGVuZHMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbXBsZW1lbnRzQmVmb3JlRXh0ZW5kcyIsCiAgICBpbmRleDogNDQsCiAgICBtZXNzYWdlOiByIiIiVGhlIGV4dGVuZHMgY2xhdXNlIG11c3QgYmUgYmVmb3JlIHRoZSBpbXBsZW1lbnRzIGNsYXVzZS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgbW92aW5nIHRoZSBleHRlbmRzIGNsYXVzZSBiZWZvcmUgdGhlIGltcGxlbWVudHMgY2xhdXNlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbXBsZW1lbnRzQmVmb3JlT24gPSBtZXNzYWdlSW1wbGVtZW50c0JlZm9yZU9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUltcGxlbWVudHNCZWZvcmVPbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkltcGxlbWVudHNCZWZvcmVPbiIsCiAgICBpbmRleDogNDMsCiAgICBtZXNzYWdlOiByIiIiVGhlIG9uIGNsYXVzZSBtdXN0IGJlIGJlZm9yZSB0aGUgaW1wbGVtZW50cyBjbGF1c2UuIiIiLAogICAgdGlwOiByIiIiVHJ5IG1vdmluZyB0aGUgb24gY2xhdXNlIGJlZm9yZSB0aGUgaW1wbGVtZW50cyBjbGF1c2UuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUltcGxlbWVudHNCZWZvcmVXaXRoID0gbWVzc2FnZUltcGxlbWVudHNCZWZvcmVXaXRoOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUltcGxlbWVudHNCZWZvcmVXaXRoID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiSW1wbGVtZW50c0JlZm9yZVdpdGgiLAogICAgaW5kZXg6IDQyLAogICAgbWVzc2FnZTogciIiIlRoZSB3aXRoIGNsYXVzZSBtdXN0IGJlIGJlZm9yZSB0aGUgaW1wbGVtZW50cyBjbGF1c2UuIiIiLAogICAgdGlwOiByIiIiVHJ5IG1vdmluZyB0aGUgd2l0aCBjbGF1c2UgYmVmb3JlIHRoZSBpbXBsZW1lbnRzIGNsYXVzZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW1wbGVtZW50c0Z1dHVyZU9yID0gbWVzc2FnZUltcGxlbWVudHNGdXR1cmVPcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbXBsZW1lbnRzRnV0dXJlT3IgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbXBsZW1lbnRzRnV0dXJlT3IiLAogICAgbWVzc2FnZTogciIiIidGdXR1cmVPcicgY2FuJ3QgYmUgdXNlZCBpbiBhbiAnaW1wbGVtZW50cycgY2xhdXNlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBpbnQgY291bnQpPgogICAgdGVtcGxhdGVJbXBsZW1lbnRzUmVwZWF0ZWQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgaW50IGNvdW50KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiJyNuYW1lJyBjYW4gb25seSBiZSBpbXBsZW1lbnRlZCBvbmNlLiIiIiwKICAgICAgICB0aXBUZW1wbGF0ZTogciIiIlRyeSByZW1vdmluZyAjY291bnQgb2YgdGhlIG9jY3VycmVuY2VzLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ltcGxlbWVudHNSZXBlYXRlZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIGludCBjb3VudCk+IGNvZGVJbXBsZW1lbnRzUmVwZWF0ZWQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBpbnQgY291bnQpPigKICAgICAgICAiSW1wbGVtZW50c1JlcGVhdGVkIiwgdGVtcGxhdGVJbXBsZW1lbnRzUmVwZWF0ZWQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklNUExFTUVOVFNfUkVQRUFURUQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW1wbGVtZW50c1JlcGVhdGVkKFN0cmluZyBuYW1lLCBpbnQgY291bnQpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKGNvdW50ID09IG51bGwpIHRocm93ICdObyBjb3VudCBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbXBsZW1lbnRzUmVwZWF0ZWQsCiAgICAgIG1lc3NhZ2U6ICIiIicke25hbWV9JyBjYW4gb25seSBiZSBpbXBsZW1lbnRlZCBvbmNlLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgcmVtb3ZpbmcgJHtjb3VudH0gb2YgdGhlIG9jY3VycmVuY2VzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAnY291bnQnOiBjb3VudH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUpPiB0ZW1wbGF0ZUltcGxlbWVudHNTdXBlckNsYXNzID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiInI25hbWUnIGNhbid0IGJlIHVzZWQgaW4gYm90aCAnZXh0ZW5kcycgYW5kICdpbXBsZW1lbnRzJyBjbGF1c2VzLiIiIiwKICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IHJlbW92aW5nIG9uZSBvZiB0aGUgb2NjdXJyZW5jZXMuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbXBsZW1lbnRzU3VwZXJDbGFzcyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlSW1wbGVtZW50c1N1cGVyQ2xhc3MgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkltcGxlbWVudHNTdXBlckNsYXNzIiwgdGVtcGxhdGVJbXBsZW1lbnRzU3VwZXJDbGFzcywKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU1QTEVNRU5UU19TVVBFUl9DTEFTUyJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbXBsZW1lbnRzU3VwZXJDbGFzcyhTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUltcGxlbWVudHNTdXBlckNsYXNzLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiJyR7bmFtZX0nIGNhbid0IGJlIHVzZWQgaW4gYm90aCAnZXh0ZW5kcycgYW5kICdpbXBsZW1lbnRzJyBjbGF1c2VzLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgcmVtb3Zpbmcgb25lIG9mIHRoZSBvY2N1cnJlbmNlcy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUpPiB0ZW1wbGF0ZUltcGxpY2l0Q2FsbE9mTm9uTWV0aG9kID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJDYW5ub3QgaW52b2tlIGFuIGluc3RhbmNlIG9mICcjdHlwZScgYmVjYXVzZSBpdCBkZWNsYXJlcyAnY2FsbCcgdG8gYmUgc29tZXRoaW5nIG90aGVyIHRoYW4gYSBtZXRob2QuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBjaGFuZ2luZyAnY2FsbCcgdG8gYSBtZXRob2Qgb3IgZXhwbGljaXRseSBpbnZva2UgJ2NhbGwnLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW1wbGljaXRDYWxsT2ZOb25NZXRob2QpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlKT4gY29kZUltcGxpY2l0Q2FsbE9mTm9uTWV0aG9kID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSk+KAogICAgICAgICJJbXBsaWNpdENhbGxPZk5vbk1ldGhvZCIsIHRlbXBsYXRlSW1wbGljaXRDYWxsT2ZOb25NZXRob2QsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklNUExJQ0lUX0NBTExfT0ZfTk9OX01FVEhPRCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbXBsaWNpdENhbGxPZk5vbk1ldGhvZChEYXJ0VHlwZSBfdHlwZSkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUltcGxpY2l0Q2FsbE9mTm9uTWV0aG9kLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQ2Fubm90IGludm9rZSBhbiBpbnN0YW5jZSBvZiAnJHt0eXBlfScgYmVjYXVzZSBpdCBkZWNsYXJlcyAnY2FsbCcgdG8gYmUgc29tZXRoaW5nIG90aGVyIHRoYW4gYSBtZXRob2QuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6ICIiIlRyeSBjaGFuZ2luZyAnY2FsbCcgdG8gYSBtZXRob2Qgb3IgZXhwbGljaXRseSBpbnZva2UgJ2NhbGwnLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUyKT4gdGVtcGxhdGVJbXBsaWNpdE1peGluT3ZlcnJpZGVDb250ZXh0ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIk92ZXJyaWRlIHdhcyBpbnRyb2R1Y2VkIHdoZW4gdGhlIG1peGluICcjbmFtZScgd2FzIGFwcGxpZWQgdG8gJyNuYW1lMicuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbXBsaWNpdE1peGluT3ZlcnJpZGVDb250ZXh0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4KICAgIGNvZGVJbXBsaWNpdE1peGluT3ZlcnJpZGVDb250ZXh0ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICAgICAgIkltcGxpY2l0TWl4aW5PdmVycmlkZUNvbnRleHQiLCB0ZW1wbGF0ZUltcGxpY2l0TWl4aW5PdmVycmlkZUNvbnRleHQsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ltcGxpY2l0TWl4aW5PdmVycmlkZUNvbnRleHQoU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMikgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbXBsaWNpdE1peGluT3ZlcnJpZGVDb250ZXh0LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiT3ZlcnJpZGUgd2FzIGludHJvZHVjZWQgd2hlbiB0aGUgbWl4aW4gJyR7bmFtZX0nIHdhcyBhcHBsaWVkIHRvICcke25hbWUyfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICduYW1lMic6IG5hbWUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUltcG9ydEFmdGVyUGFydCA9IG1lc3NhZ2VJbXBvcnRBZnRlclBhcnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW1wb3J0QWZ0ZXJQYXJ0ID0gY29uc3QgTWVzc2FnZUNvZGUoIkltcG9ydEFmdGVyUGFydCIsCiAgICBpbmRleDogMTAsCiAgICBtZXNzYWdlOiByIiIiSW1wb3J0IGRpcmVjdGl2ZXMgbXVzdCBwcmVjZWRlIHBhcnQgZGlyZWN0aXZlcy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgbW92aW5nIHRoZSBpbXBvcnQgZGlyZWN0aXZlcyBiZWZvcmUgdGhlIHBhcnQgZGlyZWN0aXZlcy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+CiAgICB0ZW1wbGF0ZUltcG9ydEhpZGVzSW1wb3J0ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJJbXBvcnQgb2YgJyNuYW1lJyAoZnJvbSAnI3VyaScpIGhpZGVzIGltcG9ydCBmcm9tICcjdXJpMicuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW1wb3J0SGlkZXNJbXBvcnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4KICAgIGNvZGVJbXBvcnRIaWRlc0ltcG9ydCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPigKICAgICAgICAiSW1wb3J0SGlkZXNJbXBvcnQiLCB0ZW1wbGF0ZUltcG9ydEhpZGVzSW1wb3J0LAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pZ25vcmVkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbXBvcnRIaWRlc0ltcG9ydChTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXykgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICBTdHJpbmcgdXJpMiA9IHJlbGF0aXZpemVVcmkodXJpMl8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW1wb3J0SGlkZXNJbXBvcnQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJJbXBvcnQgb2YgJyR7bmFtZX0nIChmcm9tICcke3VyaX0nKSBoaWRlcyBpbXBvcnQgZnJvbSAnJHt1cmkyfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd1cmknOiB1cmlfLCAndXJpMic6IHVyaTJffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZQogICAgICAgICAgICBfdHlwZTIpPiB0ZW1wbGF0ZUluY29tcGF0aWJsZVJlZGlyZWN0ZWVGdW5jdGlvblR5cGUgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHR5cGUgJyN0eXBlJyBpc24ndCBhIHN1YnR5cGUgb2YgJyN0eXBlMicuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbmNvbXBhdGlibGVSZWRpcmVjdGVlRnVuY3Rpb25UeXBlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4KICAgIGNvZGVJbmNvbXBhdGlibGVSZWRpcmVjdGVlRnVuY3Rpb25UeXBlID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICAgICAgIkluY29tcGF0aWJsZVJlZGlyZWN0ZWVGdW5jdGlvblR5cGUiLAogICAgICAgIHRlbXBsYXRlSW5jb21wYXRpYmxlUmVkaXJlY3RlZUZ1bmN0aW9uVHlwZSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUkVESVJFQ1RfVE9fSU5WQUxJRF9UWVBFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0luY29tcGF0aWJsZVJlZGlyZWN0ZWVGdW5jdGlvblR5cGUoCiAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUluY29tcGF0aWJsZVJlZGlyZWN0ZWVGdW5jdGlvblR5cGUsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgY29uc3RydWN0b3IgZnVuY3Rpb24gdHlwZSAnJHt0eXBlfScgaXNuJ3QgYSBzdWJ0eXBlIG9mICcke3R5cGUyfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsndHlwZSc6IF90eXBlLCAndHlwZTInOiBfdHlwZTJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIERhcnRUeXBlIF90eXBlLAogICAgICAgIERhcnRUeXBlIF90eXBlMiwKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZTIpPiB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVHlwZSBhcmd1bWVudCAnI3R5cGUnIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJyN0eXBlMicgb2YgdGhlIHR5cGUgdmFyaWFibGUgJyNuYW1lJyBvbiAnI25hbWUyJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IGNoYW5naW5nIHR5cGUgYXJndW1lbnRzIHNvIHRoYXQgdGhleSBjb25mb3JtIHRvIHRoZSBib3VuZHMuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbmNvcnJlY3RUeXBlQXJndW1lbnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4KICAgIGNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnQgPSBjb25zdCBDb2RlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgICAgICJJbmNvcnJlY3RUeXBlQXJndW1lbnQiLCB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVFlQRV9BUkdVTUVOVF9OT1RfTUFUQ0hJTkdfQk9VTkRTIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0luY29ycmVjdFR5cGVBcmd1bWVudCgKICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIGlmIChuYW1lMi5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZTIgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUyKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUeXBlIGFyZ3VtZW50ICcke3R5cGV9JyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIGJvdW5kICcke3R5cGUyfScgb2YgdGhlIHR5cGUgdmFyaWFibGUgJyR7bmFtZX0nIG9uICcke25hbWUyfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6ICIiIlRyeSBjaGFuZ2luZyB0eXBlIGFyZ3VtZW50cyBzbyB0aGF0IHRoZXkgY29uZm9ybSB0byB0aGUgYm91bmRzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7CiAgICAgICAgJ3R5cGUnOiBfdHlwZSwKICAgICAgICAndHlwZTInOiBfdHlwZTIsCiAgICAgICAgJ25hbWUnOiBuYW1lLAogICAgICAgICduYW1lMic6IG5hbWUyCiAgICAgIH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUgX3R5cGUyLAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lMik+IHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5SZXR1cm5UeXBlID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUeXBlIGFyZ3VtZW50ICcjdHlwZScgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnI3R5cGUyJyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnI25hbWUnIG9uICcjbmFtZTInIGluIHRoZSByZXR1cm4gdHlwZS4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IGNoYW5naW5nIHR5cGUgYXJndW1lbnRzIHNvIHRoYXQgdGhleSBjb25mb3JtIHRvIHRoZSBib3VuZHMuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbmNvcnJlY3RUeXBlQXJndW1lbnRJblJldHVyblR5cGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4KICAgIGNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblJldHVyblR5cGUgPSBjb25zdCBDb2RlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgICAgICJJbmNvcnJlY3RUeXBlQXJndW1lbnRJblJldHVyblR5cGUiLAogICAgICAgIHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5SZXR1cm5UeXBlLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJUWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFMiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5SZXR1cm5UeXBlKAogICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMikgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKG5hbWUyLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lMiA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUluY29ycmVjdFR5cGVBcmd1bWVudEluUmV0dXJuVHlwZSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlR5cGUgYXJndW1lbnQgJyR7dHlwZX0nIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJyR7dHlwZTJ9JyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnJHtuYW1lfScgb24gJyR7bmFtZTJ9JyBpbiB0aGUgcmV0dXJuIHR5cGUuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6ICIiIlRyeSBjaGFuZ2luZyB0eXBlIGFyZ3VtZW50cyBzbyB0aGF0IHRoZXkgY29uZm9ybSB0byB0aGUgYm91bmRzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7CiAgICAgICAgJ3R5cGUnOiBfdHlwZSwKICAgICAgICAndHlwZTInOiBfdHlwZTIsCiAgICAgICAgJ25hbWUnOiBuYW1lLAogICAgICAgICduYW1lMic6IG5hbWUyCiAgICAgIH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUgX3R5cGUyLAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIFN0cmluZyBuYW1lMiwKICAgICAgICBTdHJpbmcgbmFtZTMsCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWU0KT4gdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgIFN0cmluZyBuYW1lMiwgU3RyaW5nIG5hbWUzLCBTdHJpbmcgbmFtZTQpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVHlwZSBhcmd1bWVudCAnI3R5cGUnIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJyN0eXBlMicgb2YgdGhlIHR5cGUgdmFyaWFibGUgJyNuYW1lJyBvbiAnI25hbWUyJyBpbiB0aGUgc3VwZXJ0eXBlICcjbmFtZTMnIG9mIGNsYXNzICcjbmFtZTQnLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgY2hhbmdpbmcgdHlwZSBhcmd1bWVudHMgc28gdGhhdCB0aGV5IGNvbmZvcm0gdG8gdGhlIGJvdW5kcy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0luY29ycmVjdFR5cGVBcmd1bWVudEluU3VwZXJ0eXBlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwKICAgICAgICAgICAgU3RyaW5nIG5hbWUyLCBTdHJpbmcgbmFtZTMsIFN0cmluZyBuYW1lNCk+CiAgICBjb2RlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGUgPSBjb25zdCBDb2RlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lLAogICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUyLCBTdHJpbmcgbmFtZTMsIFN0cmluZyBuYW1lNCk+KAogICAgICAgICJJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZSIsCiAgICAgICAgdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVFlQRV9BUkdVTUVOVF9OT1RfTUFUQ0hJTkdfQk9VTkRTIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0luY29ycmVjdFR5cGVBcmd1bWVudEluU3VwZXJ0eXBlKERhcnRUeXBlIF90eXBlLAogICAgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyLCBTdHJpbmcgbmFtZTMsIFN0cmluZyBuYW1lNCkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKG5hbWUyLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lMiA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZTIpOwogIGlmIChuYW1lMy5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZTMgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUzKTsKICBpZiAobmFtZTQuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWU0ID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lNCk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGUsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUeXBlIGFyZ3VtZW50ICcke3R5cGV9JyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIGJvdW5kICcke3R5cGUyfScgb2YgdGhlIHR5cGUgdmFyaWFibGUgJyR7bmFtZX0nIG9uICcke25hbWUyfScgaW4gdGhlIHN1cGVydHlwZSAnJHtuYW1lM30nIG9mIGNsYXNzICcke25hbWU0fScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6CiAgICAgICAgICAiIiJUcnkgY2hhbmdpbmcgdHlwZSBhcmd1bWVudHMgc28gdGhhdCB0aGV5IGNvbmZvcm0gdG8gdGhlIGJvdW5kcy4iIiIsCiAgICAgIGFyZ3VtZW50czogewogICAgICAgICd0eXBlJzogX3R5cGUsCiAgICAgICAgJ3R5cGUyJzogX3R5cGUyLAogICAgICAgICduYW1lJzogbmFtZSwKICAgICAgICAnbmFtZTInOiBuYW1lMiwKICAgICAgICAnbmFtZTMnOiBuYW1lMywKICAgICAgICAnbmFtZTQnOiBuYW1lNAogICAgICB9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIERhcnRUeXBlIF90eXBlLAogICAgICAgIERhcnRUeXBlIF90eXBlMiwKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBTdHJpbmcgbmFtZTIsCiAgICAgICAgU3RyaW5nIG5hbWUzLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lNCk+IHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGVJbmZlcnJlZCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsCiAgICAgICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgICAgICBTdHJpbmcgbmFtZTIsCiAgICAgICAgICAgIFN0cmluZyBuYW1lMywKICAgICAgICAgICAgU3RyaW5nCiAgICAgICAgICAgICAgICBuYW1lNCk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJJbmZlcnJlZCB0eXBlIGFyZ3VtZW50ICcjdHlwZScgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnI3R5cGUyJyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnI25hbWUnIG9uICcjbmFtZTInIGluIHRoZSBzdXBlcnR5cGUgJyNuYW1lMycgb2YgY2xhc3MgJyNuYW1lNCcuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBzcGVjaWZ5aW5nIHR5cGUgYXJndW1lbnRzIGV4cGxpY2l0bHkgc28gdGhhdCB0aGV5IGNvbmZvcm0gdG8gdGhlIGJvdW5kcy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0luY29ycmVjdFR5cGVBcmd1bWVudEluU3VwZXJ0eXBlSW5mZXJyZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lLAogICAgICAgICAgICBTdHJpbmcgbmFtZTIsIFN0cmluZyBuYW1lMywgU3RyaW5nIG5hbWU0KT4KICAgIGNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZUluZmVycmVkID0gY29uc3QgQ29kZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwKICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lMiwgU3RyaW5nIG5hbWUzLCBTdHJpbmcgbmFtZTQpPigKICAgICAgICAiSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGVJbmZlcnJlZCIsCiAgICAgICAgdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZUluZmVycmVkLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJUWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFMiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGVJbmZlcnJlZChEYXJ0VHlwZSBfdHlwZSwKICAgIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMiwgU3RyaW5nIG5hbWUzLCBTdHJpbmcgbmFtZTQpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIGlmIChuYW1lMi5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZTIgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUyKTsKICBpZiAobmFtZTMuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUzID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMyk7CiAgaWYgKG5hbWU0LmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lNCA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZTQpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUluY29ycmVjdFR5cGVBcmd1bWVudEluU3VwZXJ0eXBlSW5mZXJyZWQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJJbmZlcnJlZCB0eXBlIGFyZ3VtZW50ICcke3R5cGV9JyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIGJvdW5kICcke3R5cGUyfScgb2YgdGhlIHR5cGUgdmFyaWFibGUgJyR7bmFtZX0nIG9uICcke25hbWUyfScgaW4gdGhlIHN1cGVydHlwZSAnJHtuYW1lM30nIG9mIGNsYXNzICcke25hbWU0fScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6CiAgICAgICAgICAiIiJUcnkgc3BlY2lmeWluZyB0eXBlIGFyZ3VtZW50cyBleHBsaWNpdGx5IHNvIHRoYXQgdGhleSBjb25mb3JtIHRvIHRoZSBib3VuZHMuIiIiLAogICAgICBhcmd1bWVudHM6IHsKICAgICAgICAndHlwZSc6IF90eXBlLAogICAgICAgICd0eXBlMic6IF90eXBlMiwKICAgICAgICAnbmFtZSc6IG5hbWUsCiAgICAgICAgJ25hbWUyJzogbmFtZTIsCiAgICAgICAgJ25hbWUzJzogbmFtZTMsCiAgICAgICAgJ25hbWU0JzogbmFtZTQKICAgICAgfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUyKT4gdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJbmZlcnJlZCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiSW5mZXJyZWQgdHlwZSBhcmd1bWVudCAnI3R5cGUnIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJyN0eXBlMicgb2YgdGhlIHR5cGUgdmFyaWFibGUgJyNuYW1lJyBvbiAnI25hbWUyJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IHNwZWNpZnlpbmcgdHlwZSBhcmd1bWVudHMgZXhwbGljaXRseSBzbyB0aGF0IHRoZXkgY29uZm9ybSB0byB0aGUgYm91bmRzLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5mZXJyZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4KICAgIGNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJbmZlcnJlZCA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICAgICAgIkluY29ycmVjdFR5cGVBcmd1bWVudEluZmVycmVkIiwgdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJbmZlcnJlZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVFlQRV9BUkdVTUVOVF9OT1RfTUFUQ0hJTkdfQk9VTkRTIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0luY29ycmVjdFR5cGVBcmd1bWVudEluZmVycmVkKAogICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMikgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKG5hbWUyLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lMiA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUluY29ycmVjdFR5cGVBcmd1bWVudEluZmVycmVkLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiSW5mZXJyZWQgdHlwZSBhcmd1bWVudCAnJHt0eXBlfScgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnJHt0eXBlMn0nIG9mIHRoZSB0eXBlIHZhcmlhYmxlICcke25hbWV9JyBvbiAnJHtuYW1lMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOiAiIiJUcnkgc3BlY2lmeWluZyB0eXBlIGFyZ3VtZW50cyBleHBsaWNpdGx5IHNvIHRoYXQgdGhleSBjb25mb3JtIHRvIHRoZSBib3VuZHMuIiIiLAogICAgICBhcmd1bWVudHM6IHsKICAgICAgICAndHlwZSc6IF90eXBlLAogICAgICAgICd0eXBlMic6IF90eXBlMiwKICAgICAgICAnbmFtZSc6IG5hbWUsCiAgICAgICAgJ25hbWUyJzogbmFtZTIKICAgICAgfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgRGFydFR5cGUgX3R5cGUzLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lMik+IHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50UXVhbGlmaWVkID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlMiwKICAgICAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlMywKICAgICAgICAgICAgU3RyaW5nCiAgICAgICAgICAgICAgICBuYW1lMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUeXBlIGFyZ3VtZW50ICcjdHlwZScgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnI3R5cGUyJyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnI25hbWUnIG9uICcjdHlwZTMuI25hbWUyJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IGNoYW5naW5nIHR5cGUgYXJndW1lbnRzIHNvIHRoYXQgdGhleSBjb25mb3JtIHRvIHRoZSBib3VuZHMuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lLAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZTMsIFN0cmluZyBuYW1lMik+IGNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWQgPQogICAgY29uc3QgQ29kZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwKICAgICAgICAgICAgICAgIERhcnRUeXBlIF90eXBlMywgU3RyaW5nIG5hbWUyKT4oCiAgICAgICAgIkluY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZCIsCiAgICAgICAgdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlRZUEVfQVJHVU1FTlRfTk9UX01BVENISU5HX0JPVU5EUyJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWQoRGFydFR5cGUgX3R5cGUsCiAgICBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZTMsIFN0cmluZyBuYW1lMikgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUzUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTMpOwogIGlmIChuYW1lMi5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZTIgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUyKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUzID0gdHlwZTNQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUeXBlIGFyZ3VtZW50ICcke3R5cGV9JyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIGJvdW5kICcke3R5cGUyfScgb2YgdGhlIHR5cGUgdmFyaWFibGUgJyR7bmFtZX0nIG9uICcke3R5cGUzfS4ke25hbWUyfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6ICIiIlRyeSBjaGFuZ2luZyB0eXBlIGFyZ3VtZW50cyBzbyB0aGF0IHRoZXkgY29uZm9ybSB0byB0aGUgYm91bmRzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7CiAgICAgICAgJ3R5cGUnOiBfdHlwZSwKICAgICAgICAndHlwZTInOiBfdHlwZTIsCiAgICAgICAgJ25hbWUnOiBuYW1lLAogICAgICAgICd0eXBlMyc6IF90eXBlMywKICAgICAgICAnbmFtZTInOiBuYW1lMgogICAgICB9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIERhcnRUeXBlIF90eXBlLAogICAgICAgIERhcnRUeXBlIF90eXBlMiwKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBEYXJ0VHlwZSBfdHlwZTMsCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUyKT4gdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWRJbmZlcnJlZCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlMywgU3RyaW5nIG5hbWUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkluZmVycmVkIHR5cGUgYXJndW1lbnQgJyN0eXBlJyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIGJvdW5kICcjdHlwZTInIG9mIHRoZSB0eXBlIHZhcmlhYmxlICcjbmFtZScgb24gJyN0eXBlMy4jbmFtZTInLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgc3BlY2lmeWluZyB0eXBlIGFyZ3VtZW50cyBleHBsaWNpdGx5IHNvIHRoYXQgdGhleSBjb25mb3JtIHRvIHRoZSBib3VuZHMuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWRJbmZlcnJlZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlMywgU3RyaW5nIG5hbWUyKT4KICAgIGNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWRJbmZlcnJlZCA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZTMsIFN0cmluZyBuYW1lMik+KAogICAgICAgICJJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWRJbmZlcnJlZCIsCiAgICAgICAgdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWRJbmZlcnJlZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVFlQRV9BUkdVTUVOVF9OT1RfTUFUQ0hJTkdfQk9VTkRTIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0luY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZEluZmVycmVkKERhcnRUeXBlIF90eXBlLAogICAgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUzLCBTdHJpbmcgbmFtZTIpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIExpc3Q8T2JqZWN0PiB0eXBlM1BhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUzKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMyA9IHR5cGUzUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW5jb3JyZWN0VHlwZUFyZ3VtZW50UXVhbGlmaWVkSW5mZXJyZWQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJJbmZlcnJlZCB0eXBlIGFyZ3VtZW50ICcke3R5cGV9JyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIGJvdW5kICcke3R5cGUyfScgb2YgdGhlIHR5cGUgdmFyaWFibGUgJyR7bmFtZX0nIG9uICcke3R5cGUzfS4ke25hbWUyfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6ICIiIlRyeSBzcGVjaWZ5aW5nIHR5cGUgYXJndW1lbnRzIGV4cGxpY2l0bHkgc28gdGhhdCB0aGV5IGNvbmZvcm0gdG8gdGhlIGJvdW5kcy4iIiIsCiAgICAgIGFyZ3VtZW50czogewogICAgICAgICd0eXBlJzogX3R5cGUsCiAgICAgICAgJ3R5cGUyJzogX3R5cGUyLAogICAgICAgICduYW1lJzogbmFtZSwKICAgICAgICAndHlwZTMnOiBfdHlwZTMsCiAgICAgICAgJ25hbWUyJzogbmFtZTIKICAgICAgfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUluY29ycmVjdFR5cGVBcmd1bWVudFZhcmlhYmxlID0KICAgIG1lc3NhZ2VJbmNvcnJlY3RUeXBlQXJndW1lbnRWYXJpYWJsZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbmNvcnJlY3RUeXBlQXJndW1lbnRWYXJpYWJsZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkluY29ycmVjdFR5cGVBcmd1bWVudFZhcmlhYmxlIiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LAogICAgbWVzc2FnZTogciIiIlRoaXMgaXMgdGhlIHR5cGUgdmFyaWFibGUgd2hvc2UgYm91bmQgaXNuJ3QgY29uZm9ybWVkIHRvLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4gdGVtcGxhdGVJbmZlcnJlZFBhY2thZ2VVcmkgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkludGVycHJldGluZyB0aGlzIGFzIHBhY2thZ2UgVVJJLCAnI3VyaScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW5mZXJyZWRQYWNrYWdlVXJpKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+IGNvZGVJbmZlcnJlZFBhY2thZ2VVcmkgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4oCiAgICAgICAgIkluZmVycmVkUGFja2FnZVVyaSIsIHRlbXBsYXRlSW5mZXJyZWRQYWNrYWdlVXJpLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS53YXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbmZlcnJlZFBhY2thZ2VVcmkoVXJpIHVyaV8pIHsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUluZmVycmVkUGFja2FnZVVyaSwKICAgICAgbWVzc2FnZTogIiIiSW50ZXJwcmV0aW5nIHRoaXMgYXMgcGFja2FnZSBVUkksICcke3VyaX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3VyaSc6IHVyaV99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW5oZXJpdGVkTWVtYmVyc0NvbmZsaWN0ID0gbWVzc2FnZUluaGVyaXRlZE1lbWJlcnNDb25mbGljdDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3QgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3QiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTkZMSUNUU19XSVRIX0lOSEVSSVRFRF9NRU1CRVIiXSwKICAgIG1lc3NhZ2U6IHIiIiJDYW4ndCBpbmhlcml0IG1lbWJlcnMgdGhhdCBjb25mbGljdCB3aXRoIGVhY2ggb3RoZXIuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUluaGVyaXRlZE1lbWJlcnNDb25mbGljdENhdXNlMSA9CiAgICBtZXNzYWdlSW5oZXJpdGVkTWVtYmVyc0NvbmZsaWN0Q2F1c2UxOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUluaGVyaXRlZE1lbWJlcnNDb25mbGljdENhdXNlMSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkluaGVyaXRlZE1lbWJlcnNDb25mbGljdENhdXNlMSIsCiAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCwKICAgIG1lc3NhZ2U6IHIiIiJUaGlzIGlzIG9uZSBpbmhlcml0ZWQgbWVtYmVyLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3RDYXVzZTIgPQogICAgbWVzc2FnZUluaGVyaXRlZE1lbWJlcnNDb25mbGljdENhdXNlMjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3RDYXVzZTIgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3RDYXVzZTIiLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQsCiAgICBtZXNzYWdlOiByIiIiVGhpcyBpcyB0aGUgb3RoZXIgaW5oZXJpdGVkIG1lbWJlci4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBzdHJpbmcsCiAgICAgICAgVXJpCiAgICAgICAgICAgIHVyaV8pPiB0ZW1wbGF0ZUluaXRpYWxpemVGcm9tRGlsbE5vdFNlbGZDb250YWluZWQgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFVyaSB1cmlfKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRyaWVkIHRvIGluaXRpYWxpemUgZnJvbSBhIHByZXZpb3VzIGNvbXBpbGF0aW9uICgjc3RyaW5nKSwgYnV0IHRoZSBmaWxlIHdhcyBub3Qgc2VsZi1jb250YWluZWQuIFRoaXMgbWlnaHQgYmUgYSBidWcuCgpUaGUgRGFydCB0ZWFtIHdvdWxkIGdyZWF0bHkgYXBwcmVjaWF0ZSBpdCBpZiB5b3Ugd291bGQgdGFrZSBhIG1vbWVudCB0byByZXBvcnQgdGhpcyBwcm9ibGVtIGF0IGh0dHA6Ly9kYXJ0YnVnLmNvbS9uZXcuCklmIHlvdSBhcmUgY29tZm9ydGFibGUgd2l0aCBpdCwgaXQgd291bGQgaW1wcm92ZSB0aGUgY2hhbmNlcyBvZiBmaXhpbmcgYW55IGJ1ZyBpZiB5b3UgaW5jbHVkZWQgdGhlIGZpbGUgI3VyaSBpbiB5b3VyIGVycm9yIHJlcG9ydCwgYnV0IGJlIGF3YXJlIHRoYXQgdGhpcyBmaWxlIGluY2x1ZGVzIHlvdXIgc291cmNlIGNvZGUuCkVpdGhlciB3YXksIHlvdSBzaG91bGQgcHJvYmFibHkgZGVsZXRlIHRoZSBmaWxlIHNvIGl0IGRvZXNuJ3QgdXNlIHVubmVjZXNzYXJ5IGRpc2sgc3BhY2UuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBVcmkgdXJpXyk+CiAgICBjb2RlSW5pdGlhbGl6ZUZyb21EaWxsTm90U2VsZkNvbnRhaW5lZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgVXJpIHVyaV8pPigKICAgICAgICAiSW5pdGlhbGl6ZUZyb21EaWxsTm90U2VsZkNvbnRhaW5lZCIsCiAgICAgICAgdGVtcGxhdGVJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS53YXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkKAogICAgU3RyaW5nIHN0cmluZywgVXJpIHVyaV8pIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW5pdGlhbGl6ZUZyb21EaWxsTm90U2VsZkNvbnRhaW5lZCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRyaWVkIHRvIGluaXRpYWxpemUgZnJvbSBhIHByZXZpb3VzIGNvbXBpbGF0aW9uICgke3N0cmluZ30pLCBidXQgdGhlIGZpbGUgd2FzIG5vdCBzZWxmLWNvbnRhaW5lZC4gVGhpcyBtaWdodCBiZSBhIGJ1Zy4KClRoZSBEYXJ0IHRlYW0gd291bGQgZ3JlYXRseSBhcHByZWNpYXRlIGl0IGlmIHlvdSB3b3VsZCB0YWtlIGEgbW9tZW50IHRvIHJlcG9ydCB0aGlzIHByb2JsZW0gYXQgaHR0cDovL2RhcnRidWcuY29tL25ldy4KSWYgeW91IGFyZSBjb21mb3J0YWJsZSB3aXRoIGl0LCBpdCB3b3VsZCBpbXByb3ZlIHRoZSBjaGFuY2VzIG9mIGZpeGluZyBhbnkgYnVnIGlmIHlvdSBpbmNsdWRlZCB0aGUgZmlsZSAke3VyaX0gaW4geW91ciBlcnJvciByZXBvcnQsIGJ1dCBiZSBhd2FyZSB0aGF0IHRoaXMgZmlsZSBpbmNsdWRlcyB5b3VyIHNvdXJjZSBjb2RlLgpFaXRoZXIgd2F5LCB5b3Ugc2hvdWxkIHByb2JhYmx5IGRlbGV0ZSB0aGUgZmlsZSBzbyBpdCBkb2Vzbid0IHVzZSB1bm5lY2Vzc2FyeSBkaXNrIHNwYWNlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZywgJ3VyaSc6IHVyaV99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4KICAgIHRlbXBsYXRlSW5pdGlhbGl6ZUZyb21EaWxsTm90U2VsZkNvbnRhaW5lZE5vRHVtcCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUcmllZCB0byBpbml0aWFsaXplIGZyb20gYSBwcmV2aW91cyBjb21waWxhdGlvbiAoI3N0cmluZyksIGJ1dCB0aGUgZmlsZSB3YXMgbm90IHNlbGYtY29udGFpbmVkLiBUaGlzIG1pZ2h0IGJlIGEgYnVnLgoKVGhlIERhcnQgdGVhbSB3b3VsZCBncmVhdGx5IGFwcHJlY2lhdGUgaXQgaWYgeW91IHdvdWxkIHRha2UgYSBtb21lbnQgdG8gcmVwb3J0IHRoaXMgcHJvYmxlbSBhdCBodHRwOi8vZGFydGJ1Zy5jb20vbmV3LiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0luaXRpYWxpemVGcm9tRGlsbE5vdFNlbGZDb250YWluZWROb0R1bXApOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPgogICAgY29kZUluaXRpYWxpemVGcm9tRGlsbE5vdFNlbGZDb250YWluZWROb0R1bXAgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiSW5pdGlhbGl6ZUZyb21EaWxsTm90U2VsZkNvbnRhaW5lZE5vRHVtcCIsCiAgICAgICAgdGVtcGxhdGVJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkTm9EdW1wLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS53YXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkTm9EdW1wKFN0cmluZyBzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW5pdGlhbGl6ZUZyb21EaWxsTm90U2VsZkNvbnRhaW5lZE5vRHVtcCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRyaWVkIHRvIGluaXRpYWxpemUgZnJvbSBhIHByZXZpb3VzIGNvbXBpbGF0aW9uICgke3N0cmluZ30pLCBidXQgdGhlIGZpbGUgd2FzIG5vdCBzZWxmLWNvbnRhaW5lZC4gVGhpcyBtaWdodCBiZSBhIGJ1Zy4KClRoZSBEYXJ0IHRlYW0gd291bGQgZ3JlYXRseSBhcHByZWNpYXRlIGl0IGlmIHlvdSB3b3VsZCB0YWtlIGEgbW9tZW50IHRvIHJlcG9ydCB0aGlzIHByb2JsZW0gYXQgaHR0cDovL2RhcnRidWcuY29tL25ldy4iIiIsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmd9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBzdHJpbmcsCiAgICAgICAgU3RyaW5nIHN0cmluZzIsCiAgICAgICAgU3RyaW5nIHN0cmluZzMsCiAgICAgICAgVXJpCiAgICAgICAgICAgIHVyaV8pPiB0ZW1wbGF0ZUluaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIsIFN0cmluZyBzdHJpbmczLCBVcmkgdXJpXyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUcmllZCB0byBpbml0aWFsaXplIGZyb20gYSBwcmV2aW91cyBjb21waWxhdGlvbiAoI3N0cmluZyksIGJ1dCBjb3VsZG4ndC4KRXJyb3IgbWVzc2FnZSB3YXMgJyNzdHJpbmcyJy4KU3RhY2t0cmFjZSBpbmNsdWRlZCAnI3N0cmluZzMnLgpUaGlzIG1pZ2h0IGJlIGEgYnVnLgoKVGhlIERhcnQgdGVhbSB3b3VsZCBncmVhdGx5IGFwcHJlY2lhdGUgaXQgaWYgeW91IHdvdWxkIHRha2UgYSBtb21lbnQgdG8gcmVwb3J0IHRoaXMgcHJvYmxlbSBhdCBodHRwOi8vZGFydGJ1Zy5jb20vbmV3LgpJZiB5b3UgYXJlIGNvbWZvcnRhYmxlIHdpdGggaXQsIGl0IHdvdWxkIGltcHJvdmUgdGhlIGNoYW5jZXMgb2YgZml4aW5nIGFueSBidWcgaWYgeW91IGluY2x1ZGVkIHRoZSBmaWxlICN1cmkgaW4geW91ciBlcnJvciByZXBvcnQsIGJ1dCBiZSBhd2FyZSB0aGF0IHRoaXMgZmlsZSBpbmNsdWRlcyB5b3VyIHNvdXJjZSBjb2RlLgpFaXRoZXIgd2F5LCB5b3Ugc2hvdWxkIHByb2JhYmx5IGRlbGV0ZSB0aGUgZmlsZSBzbyBpdCBkb2Vzbid0IHVzZSB1bm5lY2Vzc2FyeSBkaXNrIHNwYWNlLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIHN0cmluZzMsIFVyaSB1cmlfKT4KICAgIGNvZGVJbml0aWFsaXplRnJvbURpbGxVbmtub3duUHJvYmxlbSA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIHN0cmluZzMsIFVyaSB1cmlfKT4oCiAgICAgICAgIkluaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtIiwKICAgICAgICB0ZW1wbGF0ZUluaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS53YXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbml0aWFsaXplRnJvbURpbGxVbmtub3duUHJvYmxlbSgKICAgIFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyLCBTdHJpbmcgc3RyaW5nMywgVXJpIHVyaV8pIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIGlmIChzdHJpbmcyLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIGlmIChzdHJpbmczLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW0sCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUcmllZCB0byBpbml0aWFsaXplIGZyb20gYSBwcmV2aW91cyBjb21waWxhdGlvbiAoJHtzdHJpbmd9KSwgYnV0IGNvdWxkbid0LgpFcnJvciBtZXNzYWdlIHdhcyAnJHtzdHJpbmcyfScuClN0YWNrdHJhY2UgaW5jbHVkZWQgJyR7c3RyaW5nM30nLgpUaGlzIG1pZ2h0IGJlIGEgYnVnLgoKVGhlIERhcnQgdGVhbSB3b3VsZCBncmVhdGx5IGFwcHJlY2lhdGUgaXQgaWYgeW91IHdvdWxkIHRha2UgYSBtb21lbnQgdG8gcmVwb3J0IHRoaXMgcHJvYmxlbSBhdCBodHRwOi8vZGFydGJ1Zy5jb20vbmV3LgpJZiB5b3UgYXJlIGNvbWZvcnRhYmxlIHdpdGggaXQsIGl0IHdvdWxkIGltcHJvdmUgdGhlIGNoYW5jZXMgb2YgZml4aW5nIGFueSBidWcgaWYgeW91IGluY2x1ZGVkIHRoZSBmaWxlICR7dXJpfSBpbiB5b3VyIGVycm9yIHJlcG9ydCwgYnV0IGJlIGF3YXJlIHRoYXQgdGhpcyBmaWxlIGluY2x1ZGVzIHlvdXIgc291cmNlIGNvZGUuCkVpdGhlciB3YXksIHlvdSBzaG91bGQgcHJvYmFibHkgZGVsZXRlIHRoZSBmaWxlIHNvIGl0IGRvZXNuJ3QgdXNlIHVubmVjZXNzYXJ5IGRpc2sgc3BhY2UuIiIiLAogICAgICBhcmd1bWVudHM6IHsKICAgICAgICAnc3RyaW5nJzogc3RyaW5nLAogICAgICAgICdzdHJpbmcyJzogc3RyaW5nMiwKICAgICAgICAnc3RyaW5nMyc6IHN0cmluZzMsCiAgICAgICAgJ3VyaSc6IHVyaV8KICAgICAgfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIsIFN0cmluZyBzdHJpbmczKT4KICAgIHRlbXBsYXRlSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW1Ob0R1bXAgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIHN0cmluZzMpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUcmllZCB0byBpbml0aWFsaXplIGZyb20gYSBwcmV2aW91cyBjb21waWxhdGlvbiAoI3N0cmluZyksIGJ1dCBjb3VsZG4ndC4KRXJyb3IgbWVzc2FnZSB3YXMgJyNzdHJpbmcyJy4KU3RhY2t0cmFjZSBpbmNsdWRlZCAnI3N0cmluZzMnLgpUaGlzIG1pZ2h0IGJlIGEgYnVnLgoKVGhlIERhcnQgdGVhbSB3b3VsZCBncmVhdGx5IGFwcHJlY2lhdGUgaXQgaWYgeW91IHdvdWxkIHRha2UgYSBtb21lbnQgdG8gcmVwb3J0IHRoaXMgcHJvYmxlbSBhdCBodHRwOi8vZGFydGJ1Zy5jb20vbmV3LiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0luaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtTm9EdW1wKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIHN0cmluZzMpPgogICAgY29kZUluaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtTm9EdW1wID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIHN0cmluZzMpPigKICAgICAgICAiSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW1Ob0R1bXAiLAogICAgICAgIHRlbXBsYXRlSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW1Ob0R1bXAsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lndhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0luaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtTm9EdW1wKAogICAgU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIsIFN0cmluZyBzdHJpbmczKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICBpZiAoc3RyaW5nMi5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICBpZiAoc3RyaW5nMy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUluaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtTm9EdW1wLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVHJpZWQgdG8gaW5pdGlhbGl6ZSBmcm9tIGEgcHJldmlvdXMgY29tcGlsYXRpb24gKCR7c3RyaW5nfSksIGJ1dCBjb3VsZG4ndC4KRXJyb3IgbWVzc2FnZSB3YXMgJyR7c3RyaW5nMn0nLgpTdGFja3RyYWNlIGluY2x1ZGVkICcke3N0cmluZzN9Jy4KVGhpcyBtaWdodCBiZSBhIGJ1Zy4KClRoZSBEYXJ0IHRlYW0gd291bGQgZ3JlYXRseSBhcHByZWNpYXRlIGl0IGlmIHlvdSB3b3VsZCB0YWtlIGEgbW9tZW50IHRvIHJlcG9ydCB0aGlzIHByb2JsZW0gYXQgaHR0cDovL2RhcnRidWcuY29tL25ldy4iIiIsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmcsICdzdHJpbmcyJzogc3RyaW5nMiwgJ3N0cmluZzMnOiBzdHJpbmczfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUluaXRpYWxpemVkVmFyaWFibGVJbkZvckVhY2ggPQogICAgbWVzc2FnZUluaXRpYWxpemVkVmFyaWFibGVJbkZvckVhY2g7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW5pdGlhbGl6ZWRWYXJpYWJsZUluRm9yRWFjaCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkluaXRpYWxpemVkVmFyaWFibGVJbkZvckVhY2giLAogICAgaW5kZXg6IDgyLAogICAgbWVzc2FnZTogciIiIlRoZSBsb29wIHZhcmlhYmxlIGluIGEgZm9yLWVhY2ggbG9vcCBjYW4ndCBiZSBpbml0aWFsaXplZC4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIlRyeSByZW1vdmluZyB0aGUgaW5pdGlhbGl6ZXIsIG9yIHVzaW5nIGEgZGlmZmVyZW50IGtpbmQgb2YgbG9vcC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUluaXRpYWxpemVyRm9yU3RhdGljRmllbGQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIicjbmFtZScgaXNuJ3QgYW4gaW5zdGFuY2UgZmllbGQgb2YgdGhpcyBjbGFzcy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbml0aWFsaXplckZvclN0YXRpY0ZpZWxkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVJbml0aWFsaXplckZvclN0YXRpY0ZpZWxkID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJJbml0aWFsaXplckZvclN0YXRpY0ZpZWxkIiwgdGVtcGxhdGVJbml0aWFsaXplckZvclN0YXRpY0ZpZWxkLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTklUSUFMSVpFUl9GT1JfU1RBVElDX0ZJRUxEIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0luaXRpYWxpemVyRm9yU3RhdGljRmllbGQoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbml0aWFsaXplckZvclN0YXRpY0ZpZWxkLAogICAgICBtZXNzYWdlOiAiIiInJHtuYW1lfScgaXNuJ3QgYW4gaW5zdGFuY2UgZmllbGQgb2YgdGhpcyBjbGFzcy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUpPiB0ZW1wbGF0ZUluaXRpYWxpemVyT3V0c2lkZUNvbnN0cnVjdG9yID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJPbmx5IGNvbnN0cnVjdG9ycyBjYW4gaGF2ZSBpbml0aWFsaXplcnMsIGFuZCAnI25hbWUnIGlzIG5vdCBhIGNvbnN0cnVjdG9yLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3IpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUluaXRpYWxpemVyT3V0c2lkZUNvbnN0cnVjdG9yID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJJbml0aWFsaXplck91dHNpZGVDb25zdHJ1Y3RvciIsIHRlbXBsYXRlSW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3IsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOSVRJQUxJWkVSX09VVFNJREVfQ09OU1RSVUNUT1IiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3IoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbml0aWFsaXplck91dHNpZGVDb25zdHJ1Y3RvciwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIk9ubHkgY29uc3RydWN0b3JzIGNhbiBoYXZlIGluaXRpYWxpemVycywgYW5kICcke25hbWV9JyBpcyBub3QgYSBjb25zdHJ1Y3Rvci4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUyKT4gdGVtcGxhdGVJbml0aWFsaXppbmdGb3JtYWxUeXBlTWlzbWF0Y2ggPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSB0eXBlIG9mIHBhcmFtZXRlciAnI25hbWUnLCAnI3R5cGUnIGlzIG5vdCBhIHN1YnR5cGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGQncyB0eXBlLCAnI3R5cGUyJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIHBhcmFtZXRlciAnI25hbWUnIHRvIGEgc3VidHlwZSBvZiAnI3R5cGUyJy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0luaXRpYWxpemluZ0Zvcm1hbFR5cGVNaXNtYXRjaCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZUluaXRpYWxpemluZ0Zvcm1hbFR5cGVNaXNtYXRjaCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPigKICAgICAgICAiSW5pdGlhbGl6aW5nRm9ybWFsVHlwZU1pc21hdGNoIiwKICAgICAgICB0ZW1wbGF0ZUluaXRpYWxpemluZ0Zvcm1hbFR5cGVNaXNtYXRjaCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9QQVJBTUVURVJfREVDTEFSQVRJT04iXSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbml0aWFsaXppbmdGb3JtYWxUeXBlTWlzbWF0Y2goCiAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMikgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW5pdGlhbGl6aW5nRm9ybWFsVHlwZU1pc21hdGNoLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIHR5cGUgb2YgcGFyYW1ldGVyICcke25hbWV9JywgJyR7dHlwZX0nIGlzIG5vdCBhIHN1YnR5cGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGQncyB0eXBlLCAnJHt0eXBlMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOiAiIiJUcnkgY2hhbmdpbmcgdGhlIHR5cGUgb2YgcGFyYW1ldGVyICcke25hbWV9JyB0byBhIHN1YnR5cGUgb2YgJyR7dHlwZTJ9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUluaXRpYWxpemluZ0Zvcm1hbFR5cGVNaXNtYXRjaEZpZWxkID0KICAgIG1lc3NhZ2VJbml0aWFsaXppbmdGb3JtYWxUeXBlTWlzbWF0Y2hGaWVsZDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbml0aWFsaXppbmdGb3JtYWxUeXBlTWlzbWF0Y2hGaWVsZCA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiSW5pdGlhbGl6aW5nRm9ybWFsVHlwZU1pc21hdGNoRmllbGQiLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LAogICAgICAgIG1lc3NhZ2U6IHIiIiJUaGUgZmllbGQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgcGFyYW1ldGVyLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4gdGVtcGxhdGVJbnB1dEZpbGVOb3RGb3VuZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiSW5wdXQgZmlsZSBub3QgZm91bmQ6ICN1cmkuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW5wdXRGaWxlTm90Rm91bmQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4gY29kZUlucHV0RmlsZU5vdEZvdW5kID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KAogICJJbnB1dEZpbGVOb3RGb3VuZCIsCiAgdGVtcGxhdGVJbnB1dEZpbGVOb3RGb3VuZCwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnB1dEZpbGVOb3RGb3VuZChVcmkgdXJpXykgewogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW5wdXRGaWxlTm90Rm91bmQsCiAgICAgIG1lc3NhZ2U6ICIiIklucHV0IGZpbGUgbm90IGZvdW5kOiAke3VyaX0uIiIiLCBhcmd1bWVudHM6IHsndXJpJzogdXJpX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIHN0cmluZyk+IHRlbXBsYXRlSW50ZWdlckxpdGVyYWxJc091dE9mUmFuZ2UgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIGludGVnZXIgbGl0ZXJhbCAjc3RyaW5nIGNhbid0IGJlIHJlcHJlc2VudGVkIGluIDY0IGJpdHMuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSB1c2luZyB0aGUgQmlnSW50IGNsYXNzIGlmIHlvdSBuZWVkIGFuIGludGVnZXIgbGFyZ2VyIHRoYW4gOSwyMjMsMzcyLDAzNiw4NTQsNzc1LDgwNyBvciBsZXNzIHRoYW4gLTksMjIzLDM3MiwwMzYsODU0LDc3NSw4MDguIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnRlZ2VyTGl0ZXJhbElzT3V0T2ZSYW5nZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+IGNvZGVJbnRlZ2VyTGl0ZXJhbElzT3V0T2ZSYW5nZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgICJJbnRlZ2VyTGl0ZXJhbElzT3V0T2ZSYW5nZSIsIHRlbXBsYXRlSW50ZWdlckxpdGVyYWxJc091dE9mUmFuZ2UsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVEVHRVJfTElURVJBTF9PVVRfT0ZfUkFOR0UiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW50ZWdlckxpdGVyYWxJc091dE9mUmFuZ2UoU3RyaW5nIHN0cmluZykgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnRlZ2VyTGl0ZXJhbElzT3V0T2ZSYW5nZSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBpbnRlZ2VyIGxpdGVyYWwgJHtzdHJpbmd9IGNhbid0IGJlIHJlcHJlc2VudGVkIGluIDY0IGJpdHMuIiIiLAogICAgICB0aXA6CiAgICAgICAgICAiIiJUcnkgdXNpbmcgdGhlIEJpZ0ludCBjbGFzcyBpZiB5b3UgbmVlZCBhbiBpbnRlZ2VyIGxhcmdlciB0aGFuIDksMjIzLDM3MiwwMzYsODU0LDc3NSw4MDcgb3IgbGVzcyB0aGFuIC05LDIyMywzNzIsMDM2LDg1NCw3NzUsODA4LiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZ30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUpPiB0ZW1wbGF0ZUludGVyZmFjZUNoZWNrQ29udGV4dCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiQm90aCBtZW1iZXJzIGFyZSBpbmhlcml0ZWQgYnkgdGhlIG5vbi1hYnN0cmFjdCBjbGFzcyAnI25hbWUnLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW50ZXJmYWNlQ2hlY2tDb250ZXh0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVJbnRlcmZhY2VDaGVja0NvbnRleHQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkludGVyZmFjZUNoZWNrQ29udGV4dCIsIHRlbXBsYXRlSW50ZXJmYWNlQ2hlY2tDb250ZXh0LAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnRlcmZhY2VDaGVja0NvbnRleHQoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnRlcmZhY2VDaGVja0NvbnRleHQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJCb3RoIG1lbWJlcnMgYXJlIGluaGVyaXRlZCBieSB0aGUgbm9uLWFic3RyYWN0IGNsYXNzICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnRlcm5hbFByb2JsZW1BbHJlYWR5SW5pdGlhbGl6ZWQgPQogICAgbWVzc2FnZUludGVybmFsUHJvYmxlbUFscmVhZHlJbml0aWFsaXplZDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbnRlcm5hbFByb2JsZW1BbHJlYWR5SW5pdGlhbGl6ZWQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbnRlcm5hbFByb2JsZW1BbHJlYWR5SW5pdGlhbGl6ZWQiLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmludGVybmFsUHJvYmxlbSwKICAgIG1lc3NhZ2U6IHIiIiJBdHRlbXB0IHRvIHNldCBpbml0aWFsaXplciBvbiBmaWVsZCB3aXRob3V0IGluaXRpYWxpemVyLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnRlcm5hbFByb2JsZW1Cb2R5T25BYnN0cmFjdE1ldGhvZCA9CiAgICBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtQm9keU9uQWJzdHJhY3RNZXRob2Q7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtQm9keU9uQWJzdHJhY3RNZXRob2QgPQogICAgY29uc3QgTWVzc2FnZUNvZGUoIkludGVybmFsUHJvYmxlbUJvZHlPbkFic3RyYWN0TWV0aG9kIiwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtLAogICAgICAgIG1lc3NhZ2U6IHIiIiJBdHRlbXB0aW5nIHRvIHNldCBib2R5IG9uIGFic3RyYWN0IG1ldGhvZC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPgogICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Db25zdHJ1Y3Rvck5vdEZvdW5kID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiTm8gY29uc3RydWN0b3IgbmFtZWQgJyNuYW1lJyBpbiAnI3VyaScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtQ29uc3RydWN0b3JOb3RGb3VuZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfKT4KICAgIGNvZGVJbnRlcm5hbFByb2JsZW1Db25zdHJ1Y3Rvck5vdEZvdW5kID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPigKICAgICAgICAiSW50ZXJuYWxQcm9ibGVtQ29uc3RydWN0b3JOb3RGb3VuZCIsCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Db25zdHJ1Y3Rvck5vdEZvdW5kLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbUNvbnN0cnVjdG9yTm90Rm91bmQoCiAgICBTdHJpbmcgbmFtZSwgVXJpIHVyaV8pIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnRlcm5hbFByb2JsZW1Db25zdHJ1Y3Rvck5vdEZvdW5kLAogICAgICBtZXNzYWdlOiAiIiJObyBjb25zdHJ1Y3RvciBuYW1lZCAnJHtuYW1lfScgaW4gJyR7dXJpfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd1cmknOiB1cmlffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+CiAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbUNvbnRleHRTZXZlcml0eSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJOb24tY29udGV4dCBtZXNzYWdlIGhhcyBjb250ZXh0IHNldmVyaXR5OiAjc3RyaW5nIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtQ29udGV4dFNldmVyaXR5KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gY29kZUludGVybmFsUHJvYmxlbUNvbnRleHRTZXZlcml0eSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgICJJbnRlcm5hbFByb2JsZW1Db250ZXh0U2V2ZXJpdHkiLAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtQ29udGV4dFNldmVyaXR5LAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbUNvbnRleHRTZXZlcml0eShTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludGVybmFsUHJvYmxlbUNvbnRleHRTZXZlcml0eSwKICAgICAgbWVzc2FnZTogIiIiTm9uLWNvbnRleHQgbWVzc2FnZSBoYXMgY29udGV4dCBzZXZlcml0eTogJHtzdHJpbmd9IiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBzdHJpbmcpPgogICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1EZWJ1Z0Fib3J0ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBzdHJpbmcpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDb21waWxhdGlvbiBhYm9ydGVkIGR1ZSB0byBmYXRhbCAnI25hbWUnIGF0Ogojc3RyaW5nIiIiLCB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbURlYnVnQWJvcnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgc3RyaW5nKT4KICAgIGNvZGVJbnRlcm5hbFByb2JsZW1EZWJ1Z0Fib3J0ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHN0cmluZyk+KAogICAgICAgICJJbnRlcm5hbFByb2JsZW1EZWJ1Z0Fib3J0IiwgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1EZWJ1Z0Fib3J0LAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbURlYnVnQWJvcnQoU3RyaW5nIG5hbWUsIFN0cmluZyBzdHJpbmcpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludGVybmFsUHJvYmxlbURlYnVnQWJvcnQsCiAgICAgIG1lc3NhZ2U6ICIiIkNvbXBpbGF0aW9uIGFib3J0ZWQgZHVlIHRvIGZhdGFsICcke25hbWV9JyBhdDoKJHtzdHJpbmd9IiIiLCBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICdzdHJpbmcnOiBzdHJpbmd9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW50ZXJuYWxQcm9ibGVtRXh0ZW5kaW5nVW5tb2RpZmlhYmxlU2NvcGUgPQogICAgbWVzc2FnZUludGVybmFsUHJvYmxlbUV4dGVuZGluZ1VubW9kaWZpYWJsZVNjb3BlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUludGVybmFsUHJvYmxlbUV4dGVuZGluZ1VubW9kaWZpYWJsZVNjb3BlID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJJbnRlcm5hbFByb2JsZW1FeHRlbmRpbmdVbm1vZGlmaWFibGVTY29wZSIsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmludGVybmFsUHJvYmxlbSwKICAgICAgICBtZXNzYWdlOiByIiIiQ2FuJ3QgZXh0ZW5kIGFuIHVubW9kaWZpYWJsZSBzY29wZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW50ZXJuYWxQcm9ibGVtTGFiZWxVc2FnZUluVmFyaWFibGVzRGVjbGFyYXRpb24gPQogICAgbWVzc2FnZUludGVybmFsUHJvYmxlbUxhYmVsVXNhZ2VJblZhcmlhYmxlc0RlY2xhcmF0aW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUludGVybmFsUHJvYmxlbUxhYmVsVXNhZ2VJblZhcmlhYmxlc0RlY2xhcmF0aW9uID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJJbnRlcm5hbFByb2JsZW1MYWJlbFVzYWdlSW5WYXJpYWJsZXNEZWNsYXJhdGlvbiIsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmludGVybmFsUHJvYmxlbSwKICAgICAgICBtZXNzYWdlOgogICAgICAgICAgICByIiIiVW5leHBlY3RlZCB1c2FnZSBvZiBsYWJlbCBpbnNpZGUgZGVjbGFyYXRpb24gb2YgdmFyaWFibGVzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnRlcm5hbFByb2JsZW1NaXNzaW5nQ29udGV4dCA9CiAgICBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtTWlzc2luZ0NvbnRleHQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtTWlzc2luZ0NvbnRleHQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbnRlcm5hbFByb2JsZW1NaXNzaW5nQ29udGV4dCIsCiAgICBzZXZlcml0eTogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtLAogICAgbWVzc2FnZTogciIiIkNvbXBpbGVyIGNhbm5vdCBydW4gd2l0aG91dCBhIGNvbXBpbGVyIGNvbnRleHQuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJBcmUgY2FsbHMgdG8gdGhlIGNvbXBpbGVyIHdyYXBwZWQgaW4gQ29tcGlsZXJDb250ZXh0LnJ1bkluQ29udGV4dD8iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbU5vSW5mZXJyZWRUeXBlU3RvcmVkID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJUaGVyZSdzIG5vIGluZmVycmVkIHR5cGUgZm9yICcjbmFtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtTm9JbmZlcnJlZFR5cGVTdG9yZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIGNvZGVJbnRlcm5hbFByb2JsZW1Ob0luZmVycmVkVHlwZVN0b3JlZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiSW50ZXJuYWxQcm9ibGVtTm9JbmZlcnJlZFR5cGVTdG9yZWQiLAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtTm9JbmZlcnJlZFR5cGVTdG9yZWQsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmludGVybmFsUHJvYmxlbSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtTm9JbmZlcnJlZFR5cGVTdG9yZWQoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnRlcm5hbFByb2JsZW1Ob0luZmVycmVkVHlwZVN0b3JlZCwKICAgICAgbWVzc2FnZTogIiIiVGhlcmUncyBubyBpbmZlcnJlZCB0eXBlIGZvciAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtTm90Rm91bmQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNvdWxkbid0IGZpbmQgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlSW50ZXJuYWxQcm9ibGVtTm90Rm91bmQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkludGVybmFsUHJvYmxlbU5vdEZvdW5kIiwgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZCwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludGVybmFsUHJvYmxlbU5vdEZvdW5kLAogICAgICBtZXNzYWdlOiAiIiJDb3VsZG4ndCBmaW5kICcke25hbWV9Jy4iIiIsIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPgogICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZEluID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNvdWxkbid0IGZpbmQgJyNuYW1lJyBpbiAnI25hbWUyJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZEluKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4KICAgIGNvZGVJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZEluID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICAgICAgIkludGVybmFsUHJvYmxlbU5vdEZvdW5kSW4iLCB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbU5vdEZvdW5kSW4sCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmludGVybmFsUHJvYmxlbSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtTm90Rm91bmRJbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIGlmIChuYW1lMi5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZTIgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUyKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludGVybmFsUHJvYmxlbU5vdEZvdW5kSW4sCiAgICAgIG1lc3NhZ2U6ICIiIkNvdWxkbid0IGZpbmQgJyR7bmFtZX0nIGluICcke25hbWUyfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICduYW1lMic6IG5hbWUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUludGVybmFsUHJvYmxlbVByZXZpb3VzVG9rZW5Ob3RGb3VuZCA9CiAgICBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtUHJldmlvdXNUb2tlbk5vdEZvdW5kOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUludGVybmFsUHJvYmxlbVByZXZpb3VzVG9rZW5Ob3RGb3VuZCA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiSW50ZXJuYWxQcm9ibGVtUHJldmlvdXNUb2tlbk5vdEZvdW5kIiwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtLAogICAgICAgIG1lc3NhZ2U6IHIiIiJDb3VsZG4ndCBmaW5kIHByZXZpb3VzIHRva2VuLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtUHJpdmF0ZUNvbnN0cnVjdG9yQWNjZXNzID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDYW4ndCBhY2Nlc3MgcHJpdmF0ZSBjb25zdHJ1Y3RvciAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVByaXZhdGVDb25zdHJ1Y3RvckFjY2Vzcyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgY29kZUludGVybmFsUHJvYmxlbVByaXZhdGVDb25zdHJ1Y3RvckFjY2VzcyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiSW50ZXJuYWxQcm9ibGVtUHJpdmF0ZUNvbnN0cnVjdG9yQWNjZXNzIiwKICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVByaXZhdGVDb25zdHJ1Y3RvckFjY2VzcywKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1Qcml2YXRlQ29uc3RydWN0b3JBY2Nlc3MoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnRlcm5hbFByb2JsZW1Qcml2YXRlQ29uc3RydWN0b3JBY2Nlc3MsCiAgICAgIG1lc3NhZ2U6ICIiIkNhbid0IGFjY2VzcyBwcml2YXRlIGNvbnN0cnVjdG9yICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnRlcm5hbFByb2JsZW1Qcm92aWRlZEJvdGhDb21waWxlU2RrQW5kU2RrU3VtbWFyeSA9CiAgICBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtUHJvdmlkZWRCb3RoQ29tcGlsZVNka0FuZFNka1N1bW1hcnk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtUHJvdmlkZWRCb3RoQ29tcGlsZVNka0FuZFNka1N1bW1hcnkgPQogICAgY29uc3QgTWVzc2FnZUNvZGUoIkludGVybmFsUHJvYmxlbVByb3ZpZGVkQm90aENvbXBpbGVTZGtBbmRTZGtTdW1tYXJ5IiwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtLAogICAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAgIHIiIiJUaGUgY29tcGlsZVNkayBhbmQgc2RrU3VtbWFyeSBvcHRpb25zIGFyZSBtdXR1YWxseSBleGNsdXNpdmUiIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHN0cmluZyk+CiAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVN0YWNrTm90RW1wdHkgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHN0cmluZyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIiNuYW1lLnN0YWNrIGlzbid0IGVtcHR5OgogICNzdHJpbmciIiIsIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtU3RhY2tOb3RFbXB0eSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBzdHJpbmcpPgogICAgY29kZUludGVybmFsUHJvYmxlbVN0YWNrTm90RW1wdHkgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgIkludGVybmFsUHJvYmxlbVN0YWNrTm90RW1wdHkiLCB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVN0YWNrTm90RW1wdHksCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmludGVybmFsUHJvYmxlbSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtU3RhY2tOb3RFbXB0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHN0cmluZykgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW50ZXJuYWxQcm9ibGVtU3RhY2tOb3RFbXB0eSwKICAgICAgbWVzc2FnZTogIiIiJHtuYW1lfS5zdGFjayBpc24ndCBlbXB0eToKICAke3N0cmluZ30iIiIsIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3N0cmluZyc6IHN0cmluZ30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVN0b3JpbmdNdWx0aXBsZUluZmVycmVkVHlwZXMgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUaGVyZSdzIGFscmVhZHkgYW4gaW5mZXJyZWQgdHlwZSwgJyN0eXBlJywgZm9yICcjbmFtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6CiAgICAgICAgICAgIF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtU3RvcmluZ011bHRpcGxlSW5mZXJyZWRUeXBlcyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIFN0cmluZyBuYW1lKT4KICAgIGNvZGVJbnRlcm5hbFByb2JsZW1TdG9yaW5nTXVsdGlwbGVJbmZlcnJlZFR5cGVzID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgU3RyaW5nIG5hbWUpPigKICAgICAgICAiSW50ZXJuYWxQcm9ibGVtU3RvcmluZ011bHRpcGxlSW5mZXJyZWRUeXBlcyIsCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1TdG9yaW5nTXVsdGlwbGVJbmZlcnJlZFR5cGVzLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVN0b3JpbmdNdWx0aXBsZUluZmVycmVkVHlwZXMoCiAgICBEYXJ0VHlwZSBfdHlwZSwgU3RyaW5nIG5hbWUpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW50ZXJuYWxQcm9ibGVtU3RvcmluZ011bHRpcGxlSW5mZXJyZWRUeXBlcywKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZXJlJ3MgYWxyZWFkeSBhbiBpbmZlcnJlZCB0eXBlLCAnJHt0eXBlfScsIGZvciAnJHtuYW1lfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsndHlwZSc6IF90eXBlLCAnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMik+CiAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuZXhwZWN0ZWQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMik+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkV4cGVjdGVkICcjc3RyaW5nJywgYnV0IGdvdCAnI3N0cmluZzInLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVVuZXhwZWN0ZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4KICAgIGNvZGVJbnRlcm5hbFByb2JsZW1VbmV4cGVjdGVkID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMik+KAogICAgICAgICJJbnRlcm5hbFByb2JsZW1VbmV4cGVjdGVkIiwgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmV4cGVjdGVkLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVVuZXhwZWN0ZWQoU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIGlmIChzdHJpbmcyLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW50ZXJuYWxQcm9ibGVtVW5leHBlY3RlZCwKICAgICAgbWVzc2FnZTogIiIiRXhwZWN0ZWQgJyR7c3RyaW5nfScsIGJ1dCBnb3QgJyR7c3RyaW5nMn0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZywgJ3N0cmluZzInOiBzdHJpbmcyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPgogICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmhhbmRsZWQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMik+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlVuaGFuZGxlZCAjc3RyaW5nIGluICNzdHJpbmcyLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVVuaGFuZGxlZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPgogICAgY29kZUludGVybmFsUHJvYmxlbVVuaGFuZGxlZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPigKICAgICAgICAiSW50ZXJuYWxQcm9ibGVtVW5oYW5kbGVkIiwgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmhhbmRsZWQsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmludGVybmFsUHJvYmxlbSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtVW5oYW5kbGVkKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICBpZiAoc3RyaW5nMi5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludGVybmFsUHJvYmxlbVVuaGFuZGxlZCwKICAgICAgbWVzc2FnZTogIiIiVW5oYW5kbGVkICR7c3RyaW5nfSBpbiAke3N0cmluZzJ9LiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZywgJ3N0cmluZzInOiBzdHJpbmcyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+CiAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuaW1wbGVtZW50ZWQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiVW5pbXBsZW1lbnRlZCAjc3RyaW5nLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVVuaW1wbGVtZW50ZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPiBjb2RlSW50ZXJuYWxQcm9ibGVtVW5pbXBsZW1lbnRlZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgICJJbnRlcm5hbFByb2JsZW1VbmltcGxlbWVudGVkIiwgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmltcGxlbWVudGVkLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVVuaW1wbGVtZW50ZWQoU3RyaW5nIHN0cmluZykgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnRlcm5hbFByb2JsZW1VbmltcGxlbWVudGVkLAogICAgICBtZXNzYWdlOiAiIiJVbmltcGxlbWVudGVkICR7c3RyaW5nfS4iIiIsIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmd9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuc3VwcG9ydGVkID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJVbnN1cHBvcnRlZCBvcGVyYXRpb246ICcjbmFtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtVW5zdXBwb3J0ZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUludGVybmFsUHJvYmxlbVVuc3VwcG9ydGVkID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJJbnRlcm5hbFByb2JsZW1VbnN1cHBvcnRlZCIsIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVW5zdXBwb3J0ZWQsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmludGVybmFsUHJvYmxlbSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtVW5zdXBwb3J0ZWQoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnRlcm5hbFByb2JsZW1VbnN1cHBvcnRlZCwKICAgICAgbWVzc2FnZTogIiIiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+CiAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVyaU1pc3NpbmdTY2hlbWUgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlRoZSBVUkkgJyN1cmknIGhhcyBubyBzY2hlbWUuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtVXJpTWlzc2luZ1NjaGVtZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPiBjb2RlSW50ZXJuYWxQcm9ibGVtVXJpTWlzc2luZ1NjaGVtZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPigiSW50ZXJuYWxQcm9ibGVtVXJpTWlzc2luZ1NjaGVtZSIsCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VcmlNaXNzaW5nU2NoZW1lLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVVyaU1pc3NpbmdTY2hlbWUoVXJpIHVyaV8pIHsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludGVybmFsUHJvYmxlbVVyaU1pc3NpbmdTY2hlbWUsCiAgICAgIG1lc3NhZ2U6ICIiIlRoZSBVUkkgJyR7dXJpfScgaGFzIG5vIHNjaGVtZS4iIiIsIGFyZ3VtZW50czogeyd1cmknOiB1cmlffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+CiAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVZlcmlmaWNhdGlvbkVycm9yID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlZlcmlmaWNhdGlvbiBvZiB0aGUgZ2VuZXJhdGVkIHByb2dyYW0gZmFpbGVkOgojc3RyaW5nIiIiLCB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVZlcmlmaWNhdGlvbkVycm9yKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4KICAgIGNvZGVJbnRlcm5hbFByb2JsZW1WZXJpZmljYXRpb25FcnJvciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgICJJbnRlcm5hbFByb2JsZW1WZXJpZmljYXRpb25FcnJvciIsCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1WZXJpZmljYXRpb25FcnJvciwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1WZXJpZmljYXRpb25FcnJvcihTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludGVybmFsUHJvYmxlbVZlcmlmaWNhdGlvbkVycm9yLAogICAgICBtZXNzYWdlOiAiIiJWZXJpZmljYXRpb24gb2YgdGhlIGdlbmVyYXRlZCBwcm9ncmFtIGZhaWxlZDoKJHtzdHJpbmd9IiIiLCBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUludGVycG9sYXRpb25JblVyaSA9IG1lc3NhZ2VJbnRlcnBvbGF0aW9uSW5Vcmk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW50ZXJwb2xhdGlvbkluVXJpID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiSW50ZXJwb2xhdGlvbkluVXJpIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlZBTElEX0xJVEVSQUxfSU5fQ09ORklHVVJBVElPTiJdLAogICAgbWVzc2FnZTogciIiIkNhbid0IHVzZSBzdHJpbmcgaW50ZXJwb2xhdGlvbiBpbiBhIFVSSS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIERhcnRUeXBlIF90eXBlLAogICAgICAgIERhcnRUeXBlCiAgICAgICAgICAgIF90eXBlMik+IHRlbXBsYXRlSW50ZXJzZWN0aW9uVHlwZUFzVHlwZUFyZ3VtZW50ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJDYW4ndCBpbmZlciBhIHR5cGUgZm9yICcjbmFtZScsIGl0IGNhbiBiZSBlaXRoZXIgJyN0eXBlJyBvciAnI3R5cGUyJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IGFkZGluZyBhIHR5cGUgYXJndW1lbnQgc2VsZWN0aW5nIG9uZSBvZiB0aGUgb3B0aW9ucy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludGVyc2VjdGlvblR5cGVBc1R5cGVBcmd1bWVudCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZUludGVyc2VjdGlvblR5cGVBc1R5cGVBcmd1bWVudCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPigKICAiSW50ZXJzZWN0aW9uVHlwZUFzVHlwZUFyZ3VtZW50IiwKICB0ZW1wbGF0ZUludGVyc2VjdGlvblR5cGVBc1R5cGVBcmd1bWVudCwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnRlcnNlY3Rpb25UeXBlQXNUeXBlQXJndW1lbnQoCiAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMikgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW50ZXJzZWN0aW9uVHlwZUFzVHlwZUFyZ3VtZW50LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQ2FuJ3QgaW5mZXIgYSB0eXBlIGZvciAnJHtuYW1lfScsIGl0IGNhbiBiZSBlaXRoZXIgJyR7dHlwZX0nIG9yICcke3R5cGUyfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6ICIiIlRyeSBhZGRpbmcgYSB0eXBlIGFyZ3VtZW50IHNlbGVjdGluZyBvbmUgb2YgdGhlIG9wdGlvbnMuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUyKT4gdGVtcGxhdGVJbnZhbGlkQXNzaWdubWVudCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJBIHZhbHVlIG9mIHR5cGUgJyN0eXBlJyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJyN0eXBlMicuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBjaGFuZ2luZyB0aGUgdHlwZSBvZiB0aGUgbGVmdCBoYW5kIHNpZGUsIG9yIGNhc3RpbmcgdGhlIHJpZ2h0IGhhbmQgc2lkZSB0byAnI3R5cGUyJy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludmFsaWRBc3NpZ25tZW50KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4KICAgIGNvZGVJbnZhbGlkQXNzaWdubWVudCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgICAgICJJbnZhbGlkQXNzaWdubWVudCIsIHRlbXBsYXRlSW52YWxpZEFzc2lnbm1lbnQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfQVNTSUdOTUVOVCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnZhbGlkQXNzaWdubWVudChEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludmFsaWRBc3NpZ25tZW50LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQSB2YWx1ZSBvZiB0eXBlICcke3R5cGV9JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiVHJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIHRoZSBsZWZ0IGhhbmQgc2lkZSwgb3IgY2FzdGluZyB0aGUgcmlnaHQgaGFuZCBzaWRlIHRvICcke3R5cGUyfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsndHlwZSc6IF90eXBlLCAndHlwZTInOiBfdHlwZTJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW52YWxpZEF3YWl0Rm9yID0gbWVzc2FnZUludmFsaWRBd2FpdEZvcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbnZhbGlkQXdhaXRGb3IgPSBjb25zdCBNZXNzYWdlQ29kZSgiSW52YWxpZEF3YWl0Rm9yIiwKICAgIGluZGV4OiA5LAogICAgbWVzc2FnZToKICAgICAgICByIiIiVGhlIGtleXdvcmQgJ2F3YWl0JyBpc24ndCBhbGxvd2VkIGZvciBhIG5vcm1hbCAnZm9yJyBzdGF0ZW1lbnQuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nIHRoZSBrZXl3b3JkLCBvciB1c2UgYSBmb3ItZWFjaCBzdGF0ZW1lbnQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUludmFsaWRCcmVha1RhcmdldCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiQ2FuJ3QgYnJlYWsgdG8gJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnZhbGlkQnJlYWtUYXJnZXQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUludmFsaWRCcmVha1RhcmdldCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAiSW52YWxpZEJyZWFrVGFyZ2V0IiwKICB0ZW1wbGF0ZUludmFsaWRCcmVha1RhcmdldCwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnZhbGlkQnJlYWtUYXJnZXQoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnZhbGlkQnJlYWtUYXJnZXQsCiAgICAgIG1lc3NhZ2U6ICIiIkNhbid0IGJyZWFrIHRvICcke25hbWV9Jy4iIiIsIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUyKT4gdGVtcGxhdGVJbnZhbGlkQ2FzdEZ1bmN0aW9uRXhwciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgZnVuY3Rpb24gZXhwcmVzc2lvbiB0eXBlICcjdHlwZScgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnI3R5cGUyJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbiBleHByZXNzaW9uIG9yIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIHVzZWQuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdEZ1bmN0aW9uRXhwcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+CiAgICBjb2RlSW52YWxpZENhc3RGdW5jdGlvbkV4cHIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPigKICAgICAgICAiSW52YWxpZENhc3RGdW5jdGlvbkV4cHIiLCB0ZW1wbGF0ZUludmFsaWRDYXN0RnVuY3Rpb25FeHByLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlZBTElEX0NBU1RfRlVOQ1RJT05fRVhQUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdEZ1bmN0aW9uRXhwcihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludmFsaWRDYXN0RnVuY3Rpb25FeHByLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIGZ1bmN0aW9uIGV4cHJlc3Npb24gdHlwZSAnJHt0eXBlfScgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnJHt0eXBlMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOiAiIiJDaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIGV4cHJlc3Npb24gb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUyKT4gdGVtcGxhdGVJbnZhbGlkQ2FzdExpdGVyYWxMaXN0ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBsaXN0IGxpdGVyYWwgdHlwZSAnI3R5cGUnIGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJyN0eXBlMicuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIkNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgbGlzdCBsaXRlcmFsIG9yIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIHVzZWQuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdExpdGVyYWxMaXN0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4KICAgIGNvZGVJbnZhbGlkQ2FzdExpdGVyYWxMaXN0ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICAgICAgIkludmFsaWRDYXN0TGl0ZXJhbExpc3QiLCB0ZW1wbGF0ZUludmFsaWRDYXN0TGl0ZXJhbExpc3QsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfQ0FTVF9MSVRFUkFMX0xJU1QiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW52YWxpZENhc3RMaXRlcmFsTGlzdChEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludmFsaWRDYXN0TGl0ZXJhbExpc3QsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgbGlzdCBsaXRlcmFsIHR5cGUgJyR7dHlwZX0nIGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBsaXN0IGxpdGVyYWwgb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUyKT4gdGVtcGxhdGVJbnZhbGlkQ2FzdExpdGVyYWxNYXAgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIG1hcCBsaXRlcmFsIHR5cGUgJyN0eXBlJyBpc24ndCBvZiBleHBlY3RlZCB0eXBlICcjdHlwZTInLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJDaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIG1hcCBsaXRlcmFsIG9yIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIHVzZWQuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdExpdGVyYWxNYXApOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZUludmFsaWRDYXN0TGl0ZXJhbE1hcCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgICAgICJJbnZhbGlkQ2FzdExpdGVyYWxNYXAiLCB0ZW1wbGF0ZUludmFsaWRDYXN0TGl0ZXJhbE1hcCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9DQVNUX0xJVEVSQUxfTUFQIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0TGl0ZXJhbE1hcChEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludmFsaWRDYXN0TGl0ZXJhbE1hcCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBtYXAgbGl0ZXJhbCB0eXBlICcke3R5cGV9JyBpc24ndCBvZiBleHBlY3RlZCB0eXBlICcke3R5cGUyfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6ICIiIkNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgbWFwIGxpdGVyYWwgb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUyKT4gdGVtcGxhdGVJbnZhbGlkQ2FzdExpdGVyYWxTZXQgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIHNldCBsaXRlcmFsIHR5cGUgJyN0eXBlJyBpc24ndCBvZiBleHBlY3RlZCB0eXBlICcjdHlwZTInLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJDaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIHNldCBsaXRlcmFsIG9yIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIHVzZWQuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdExpdGVyYWxTZXQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZUludmFsaWRDYXN0TGl0ZXJhbFNldCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgICAgICJJbnZhbGlkQ2FzdExpdGVyYWxTZXQiLCB0ZW1wbGF0ZUludmFsaWRDYXN0TGl0ZXJhbFNldCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9DQVNUX0xJVEVSQUxfU0VUIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0TGl0ZXJhbFNldChEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludmFsaWRDYXN0TGl0ZXJhbFNldCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBzZXQgbGl0ZXJhbCB0eXBlICcke3R5cGV9JyBpc24ndCBvZiBleHBlY3RlZCB0eXBlICcke3R5cGUyfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6ICIiIkNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgc2V0IGxpdGVyYWwgb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUyKT4gdGVtcGxhdGVJbnZhbGlkQ2FzdExvY2FsRnVuY3Rpb24gPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIGxvY2FsIGZ1bmN0aW9uIGhhcyB0eXBlICcjdHlwZScgdGhhdCBpc24ndCBvZiBleHBlY3RlZCB0eXBlICcjdHlwZTInLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJDaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIG9yIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIHVzZWQuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdExvY2FsRnVuY3Rpb24pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZUludmFsaWRDYXN0TG9jYWxGdW5jdGlvbiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgICAgICJJbnZhbGlkQ2FzdExvY2FsRnVuY3Rpb24iLCB0ZW1wbGF0ZUludmFsaWRDYXN0TG9jYWxGdW5jdGlvbiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9DQVNUX0ZVTkNUSU9OIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0TG9jYWxGdW5jdGlvbigKICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW52YWxpZENhc3RMb2NhbEZ1bmN0aW9uLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIGxvY2FsIGZ1bmN0aW9uIGhhcyB0eXBlICcke3R5cGV9JyB0aGF0IGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbiBvciB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyB1c2VkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZQogICAgICAgICAgICBfdHlwZTIpPiB0ZW1wbGF0ZUludmFsaWRDYXN0TmV3RXhwciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgY29uc3RydWN0b3IgcmV0dXJucyB0eXBlICcjdHlwZScgdGhhdCBpc24ndCBvZiBleHBlY3RlZCB0eXBlICcjdHlwZTInLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJDaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBiZWluZyBjb25zdHJ1Y3RlZCBvciB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyB1c2VkLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW52YWxpZENhc3ROZXdFeHByKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4KICAgIGNvZGVJbnZhbGlkQ2FzdE5ld0V4cHIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPigKICAgICAgICAiSW52YWxpZENhc3ROZXdFeHByIiwgdGVtcGxhdGVJbnZhbGlkQ2FzdE5ld0V4cHIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfQ0FTVF9ORVdfRVhQUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdE5ld0V4cHIoRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMikgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnZhbGlkQ2FzdE5ld0V4cHIsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgY29uc3RydWN0b3IgcmV0dXJucyB0eXBlICcke3R5cGV9JyB0aGF0IGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgYmVpbmcgY29uc3RydWN0ZWQgb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUyKT4gdGVtcGxhdGVJbnZhbGlkQ2FzdFN0YXRpY01ldGhvZCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgc3RhdGljIG1ldGhvZCBoYXMgdHlwZSAnI3R5cGUnIHRoYXQgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnI3R5cGUyJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBtZXRob2Qgb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0U3RhdGljTWV0aG9kKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4KICAgIGNvZGVJbnZhbGlkQ2FzdFN0YXRpY01ldGhvZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgICAgICJJbnZhbGlkQ2FzdFN0YXRpY01ldGhvZCIsIHRlbXBsYXRlSW52YWxpZENhc3RTdGF0aWNNZXRob2QsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfQ0FTVF9NRVRIT0QiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW52YWxpZENhc3RTdGF0aWNNZXRob2QoRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMikgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnZhbGlkQ2FzdFN0YXRpY01ldGhvZCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBzdGF0aWMgbWV0aG9kIGhhcyB0eXBlICcke3R5cGV9JyB0aGF0IGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBtZXRob2Qgb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUyKT4gdGVtcGxhdGVJbnZhbGlkQ2FzdFRvcExldmVsRnVuY3Rpb24gPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIHRvcCBsZXZlbCBmdW5jdGlvbiBoYXMgdHlwZSAnI3R5cGUnIHRoYXQgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnI3R5cGUyJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbiBvciB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyB1c2VkLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW52YWxpZENhc3RUb3BMZXZlbEZ1bmN0aW9uKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4KICAgIGNvZGVJbnZhbGlkQ2FzdFRvcExldmVsRnVuY3Rpb24gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPigKICAgICAgICAiSW52YWxpZENhc3RUb3BMZXZlbEZ1bmN0aW9uIiwgdGVtcGxhdGVJbnZhbGlkQ2FzdFRvcExldmVsRnVuY3Rpb24sCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfQ0FTVF9GVU5DVElPTiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdFRvcExldmVsRnVuY3Rpb24oCiAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludmFsaWRDYXN0VG9wTGV2ZWxGdW5jdGlvbiwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSB0b3AgbGV2ZWwgZnVuY3Rpb24gaGFzIHR5cGUgJyR7dHlwZX0nIHRoYXQgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnJHt0eXBlMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOiAiIiJDaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIG9yIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIHVzZWQuIiIiLAogICAgICBhcmd1bWVudHM6IHsndHlwZSc6IF90eXBlLCAndHlwZTInOiBfdHlwZTJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW52YWxpZENhdGNoQXJndW1lbnRzID0gbWVzc2FnZUludmFsaWRDYXRjaEFyZ3VtZW50czsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbnZhbGlkQ2F0Y2hBcmd1bWVudHMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbnZhbGlkQ2F0Y2hBcmd1bWVudHMiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfQ0FUQ0hfQVJHVU1FTlRTIl0sCiAgICBtZXNzYWdlOiByIiIiSW52YWxpZCBjYXRjaCBhcmd1bWVudHMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUludmFsaWRDb2RlUG9pbnQgPSBtZXNzYWdlSW52YWxpZENvZGVQb2ludDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbnZhbGlkQ29kZVBvaW50ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiSW52YWxpZENvZGVQb2ludCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9DT0RFX1BPSU5UIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJUaGUgZXNjYXBlIHNlcXVlbmNlIHN0YXJ0aW5nIHdpdGggJ1x1JyBpc24ndCBhIHZhbGlkIGNvZGUgcG9pbnQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUludmFsaWRDb250aW51ZVRhcmdldCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiQ2FuJ3QgY29udGludWUgYXQgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnZhbGlkQ29udGludWVUYXJnZXQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUludmFsaWRDb250aW51ZVRhcmdldCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAiSW52YWxpZENvbnRpbnVlVGFyZ2V0IiwKICB0ZW1wbGF0ZUludmFsaWRDb250aW51ZVRhcmdldCwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnZhbGlkQ29udGludWVUYXJnZXQoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnZhbGlkQ29udGludWVUYXJnZXQsCiAgICAgIG1lc3NhZ2U6ICIiIkNhbid0IGNvbnRpbnVlIGF0ICcke25hbWV9Jy4iIiIsIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnZhbGlkSGV4RXNjYXBlID0gbWVzc2FnZUludmFsaWRIZXhFc2NhcGU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW52YWxpZEhleEVzY2FwZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkludmFsaWRIZXhFc2NhcGUiLAogICAgaW5kZXg6IDQwLAogICAgbWVzc2FnZToKICAgICAgICByIiIiQW4gZXNjYXBlIHNlcXVlbmNlIHN0YXJ0aW5nIHdpdGggJ1x4JyBtdXN0IGJlIGZvbGxvd2VkIGJ5IDIgaGV4YWRlY2ltYWwgZGlnaXRzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnZhbGlkSW5pdGlhbGl6ZXIgPSBtZXNzYWdlSW52YWxpZEluaXRpYWxpemVyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUludmFsaWRJbml0aWFsaXplciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkludmFsaWRJbml0aWFsaXplciIsCiAgICBtZXNzYWdlOiByIiIiTm90IGEgdmFsaWQgaW5pdGlhbGl6ZXIuIiIiLAogICAgdGlwOiByIiIiVG8gaW5pdGlhbGl6ZSBhIGZpZWxkLCB1c2UgdGhlIHN5bnRheCAnbmFtZSA9IHZhbHVlJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW52YWxpZElubGluZUZ1bmN0aW9uVHlwZSA9CiAgICBtZXNzYWdlSW52YWxpZElubGluZUZ1bmN0aW9uVHlwZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbnZhbGlkSW5saW5lRnVuY3Rpb25UeXBlID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiSW52YWxpZElubGluZUZ1bmN0aW9uVHlwZSIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9JTkxJTkVfRlVOQ1RJT05fVFlQRSJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiSW5saW5lIGZ1bmN0aW9uIHR5cGVzIGNhbm5vdCBiZSB1c2VkIGZvciBwYXJhbWV0ZXJzIGluIGEgZ2VuZXJpYyBmdW5jdGlvbiB0eXBlLiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiVHJ5IGNoYW5naW5nIHRoZSBpbmxpbmUgZnVuY3Rpb24gdHlwZSAoYXMgaW4gJ2ludCBmKCknKSB0byBhIHByZWZpeGVkIGZ1bmN0aW9uIHR5cGUgdXNpbmcgdGhlIGBGdW5jdGlvbmAga2V5d29yZCAoYXMgaW4gJ2ludCBGdW5jdGlvbigpIGYnKS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IHRlbXBsYXRlSW52YWxpZE9wZXJhdG9yID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUaGUgc3RyaW5nICcjbGV4ZW1lJyBpc24ndCBhIHVzZXItZGVmaW5hYmxlIG9wZXJhdG9yLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludmFsaWRPcGVyYXRvcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiBjb2RlSW52YWxpZE9wZXJhdG9yID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgICJJbnZhbGlkT3BlcmF0b3IiLCB0ZW1wbGF0ZUludmFsaWRPcGVyYXRvciwKICAgICAgICBpbmRleDogMzkpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludmFsaWRPcGVyYXRvcihUb2tlbiB0b2tlbikgewogIFN0cmluZyBsZXhlbWUgPSB0b2tlbi5sZXhlbWU7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnZhbGlkT3BlcmF0b3IsCiAgICAgIG1lc3NhZ2U6ICIiIlRoZSBzdHJpbmcgJyR7bGV4ZW1lfScgaXNuJ3QgYSB1c2VyLWRlZmluYWJsZSBvcGVyYXRvci4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8sIFN0cmluZyBzdHJpbmcpPgogICAgdGVtcGxhdGVJbnZhbGlkUGFja2FnZVVyaSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfLCBTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiSW52YWxpZCBwYWNrYWdlIFVSSSAnI3VyaSc6CiAgI3N0cmluZy4iIiIsIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW52YWxpZFBhY2thZ2VVcmkpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfLCBTdHJpbmcgc3RyaW5nKT4gY29kZUludmFsaWRQYWNrYWdlVXJpID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXywgU3RyaW5nIHN0cmluZyk+KAogICJJbnZhbGlkUGFja2FnZVVyaSIsCiAgdGVtcGxhdGVJbnZhbGlkUGFja2FnZVVyaSwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnZhbGlkUGFja2FnZVVyaShVcmkgdXJpXywgU3RyaW5nIHN0cmluZykgewogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnZhbGlkUGFja2FnZVVyaSwKICAgICAgbWVzc2FnZTogIiIiSW52YWxpZCBwYWNrYWdlIFVSSSAnJHt1cml9JzoKICAke3N0cmluZ30uIiIiLCBhcmd1bWVudHM6IHsndXJpJzogdXJpXywgJ3N0cmluZyc6IHN0cmluZ30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnZhbGlkU3VwZXJJbkluaXRpYWxpemVyID0KICAgIG1lc3NhZ2VJbnZhbGlkU3VwZXJJbkluaXRpYWxpemVyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUludmFsaWRTdXBlckluSW5pdGlhbGl6ZXIgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbnZhbGlkU3VwZXJJbkluaXRpYWxpemVyIiwKICAgIGluZGV4OiA5NSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkNhbiBvbmx5IHVzZSAnc3VwZXInIGluIGFuIGluaXRpYWxpemVyIGZvciBjYWxsaW5nIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yIChlLmcuICdzdXBlcigpJyBvciAnc3VwZXIubmFtZWRDb25zdHJ1Y3RvcigpJykiIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW52YWxpZFN5bmNNb2RpZmllciA9IG1lc3NhZ2VJbnZhbGlkU3luY01vZGlmaWVyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUludmFsaWRTeW5jTW9kaWZpZXIgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbnZhbGlkU3luY01vZGlmaWVyIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNSVNTSU5HX1NUQVJfQUZURVJfU1lOQyJdLAogICAgbWVzc2FnZTogciIiIkludmFsaWQgbW9kaWZpZXIgJ3N5bmMnLiIiIiwKICAgIHRpcDogciIiIlRyeSByZXBsYWNpbmcgJ3N5bmMnIHdpdGggJ3N5bmMqJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW52YWxpZFRoaXNJbkluaXRpYWxpemVyID0gbWVzc2FnZUludmFsaWRUaGlzSW5Jbml0aWFsaXplcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbnZhbGlkVGhpc0luSW5pdGlhbGl6ZXIgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbnZhbGlkVGhpc0luSW5pdGlhbGl6ZXIiLAogICAgaW5kZXg6IDk2LAogICAgbWVzc2FnZToKICAgICAgICByIiIiQ2FuIG9ubHkgdXNlICd0aGlzJyBpbiBhbiBpbml0aWFsaXplciBmb3IgZmllbGQgaW5pdGlhbGl6YXRpb24gKGUuZy4gJ3RoaXMueCA9IHNvbWV0aGluZycpIGFuZCBjb25zdHJ1Y3RvciByZWRpcmVjdGlvbiAoZS5nLiAndGhpcygpJyBvciAndGhpcy5uYW1lZENvbnN0cnVjdG9yKCkpIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUludmFsaWRVbmljb2RlRXNjYXBlID0gbWVzc2FnZUludmFsaWRVbmljb2RlRXNjYXBlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUludmFsaWRVbmljb2RlRXNjYXBlID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiSW52YWxpZFVuaWNvZGVFc2NhcGUiLAogICAgaW5kZXg6IDM4LAogICAgbWVzc2FnZToKICAgICAgICByIiIiQW4gZXNjYXBlIHNlcXVlbmNlIHN0YXJ0aW5nIHdpdGggJ1x1JyBtdXN0IGJlIGZvbGxvd2VkIGJ5IDQgaGV4YWRlY2ltYWwgZGlnaXRzIG9yIGZyb20gMSB0byA2IGRpZ2l0cyBiZXR3ZWVuICd7JyBhbmQgJ30nLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnZhbGlkVXNlT2ZOdWxsQXdhcmVBY2Nlc3MgPQogICAgbWVzc2FnZUludmFsaWRVc2VPZk51bGxBd2FyZUFjY2VzczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbnZhbGlkVXNlT2ZOdWxsQXdhcmVBY2Nlc3MgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbnZhbGlkVXNlT2ZOdWxsQXdhcmVBY2Nlc3MiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfVVNFX09GX05VTExfQVdBUkVfQUNDRVNTIl0sCiAgICBtZXNzYWdlOiByIiIiQ2Fubm90IHVzZSAnPy4nIGhlcmUuIiIiLAogICAgdGlwOiByIiIiVHJ5IHVzaW5nICcuJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW52YWxpZFZvaWQgPSBtZXNzYWdlSW52YWxpZFZvaWQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW52YWxpZFZvaWQgPSBjb25zdCBNZXNzYWdlQ29kZSgiSW52YWxpZFZvaWQiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVYUEVDVEVEX1RZUEVfTkFNRSJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiVHlwZSAndm9pZCcgY2FuJ3QgYmUgdXNlZCBoZXJlIGJlY2F1c2UgaXQgaXNuJ3QgYSByZXR1cm4gdHlwZS4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIlRyeSByZW1vdmluZyAndm9pZCcga2V5d29yZCBvciByZXBsYWNlIGl0IHdpdGggJ3ZhcicsICdmaW5hbCcsIG9yIGEgdHlwZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlSW52b2tlTm9uRnVuY3Rpb24gPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIicjbmFtZScgaXNuJ3QgYSBmdW5jdGlvbiBvciBtZXRob2QgYW5kIGNhbid0IGJlIGludm9rZWQuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW52b2tlTm9uRnVuY3Rpb24pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUludm9rZU5vbkZ1bmN0aW9uID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJJbnZva2VOb25GdW5jdGlvbiIsIHRlbXBsYXRlSW52b2tlTm9uRnVuY3Rpb24sCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVk9DQVRJT05fT0ZfTk9OX0ZVTkNUSU9OIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludm9rZU5vbkZ1bmN0aW9uKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW52b2tlTm9uRnVuY3Rpb24sCiAgICAgIG1lc3NhZ2U6ICIiIicke25hbWV9JyBpc24ndCBhIGZ1bmN0aW9uIG9yIG1ldGhvZCBhbmQgY2FuJ3QgYmUgaW52b2tlZC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUxhYmVsTm90Rm91bmQgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDYW4ndCBmaW5kIGxhYmVsICcjbmFtZScuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBkZWZpbmluZyB0aGUgbGFiZWwsIG9yIGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gbWF0Y2ggYW4gZXhpc3RpbmcgbGFiZWwuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNMYWJlbE5vdEZvdW5kKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVMYWJlbE5vdEZvdW5kID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJMYWJlbE5vdEZvdW5kIiwgdGVtcGxhdGVMYWJlbE5vdEZvdW5kLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJMQUJFTF9VTkRFRklORUQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzTGFiZWxOb3RGb3VuZChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUxhYmVsTm90Rm91bmQsCiAgICAgIG1lc3NhZ2U6ICIiIkNhbid0IGZpbmQgbGFiZWwgJyR7bmFtZX0nLiIiIiwKICAgICAgdGlwOgogICAgICAgICAgIiIiVHJ5IGRlZmluaW5nIHRoZSBsYWJlbCwgb3IgY29ycmVjdGluZyB0aGUgbmFtZSB0byBtYXRjaCBhbiBleGlzdGluZyBsYWJlbC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVMaWJyYXJ5RGlyZWN0aXZlTm90Rmlyc3QgPSBtZXNzYWdlTGlicmFyeURpcmVjdGl2ZU5vdEZpcnN0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUxpYnJhcnlEaXJlY3RpdmVOb3RGaXJzdCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkxpYnJhcnlEaXJlY3RpdmVOb3RGaXJzdCIsCiAgICBpbmRleDogMzcsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJUaGUgbGlicmFyeSBkaXJlY3RpdmUgbXVzdCBhcHBlYXIgYmVmb3JlIGFsbCBvdGhlciBkaXJlY3RpdmVzLiIiIiwKICAgIHRpcDogciIiIlRyeSBtb3ZpbmcgdGhlIGxpYnJhcnkgZGlyZWN0aXZlIGJlZm9yZSBhbnkgb3RoZXIgZGlyZWN0aXZlcy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTGlzdExpdGVyYWxUb29NYW55VHlwZUFyZ3VtZW50cyA9CiAgICBtZXNzYWdlTGlzdExpdGVyYWxUb29NYW55VHlwZUFyZ3VtZW50czsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VMaXN0TGl0ZXJhbFRvb01hbnlUeXBlQXJndW1lbnRzID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTGlzdExpdGVyYWxUb29NYW55VHlwZUFyZ3VtZW50cyIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVhQRUNURURfT05FX0xJU1RfVFlQRV9BUkdVTUVOVFMiXSwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcsCiAgICBtZXNzYWdlOiByIiIiTGlzdCBsaXRlcmFsIHJlcXVpcmVzIGV4YWN0bHkgb25lIHR5cGUgYXJndW1lbnQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+IHRlbXBsYXRlTG9hZExpYnJhcnlIaWRlc01lbWJlciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIGxpYnJhcnkgJyN1cmknIGRlZmluZXMgYSB0b3AtbGV2ZWwgbWVtYmVyIG5hbWVkICdsb2FkTGlicmFyeScuIFRoaXMgbWVtYmVyIGlzIGhpZGRlbiBieSB0aGUgc3BlY2lhbCBtZW1iZXIgJ2xvYWRMaWJyYXJ5JyB0aGF0IHRoZSBsYW5ndWFnZSBhZGRzIHRvIHN1cHBvcnQgZGVmZXJyZWQgbG9hZGluZy4iIiIsCiAgICB0aXBUZW1wbGF0ZTogciIiIlRyeSB0byByZW5hbWUgb3IgaGlkZSB0aGUgbWVtYmVyLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTG9hZExpYnJhcnlIaWRlc01lbWJlcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPiBjb2RlTG9hZExpYnJhcnlIaWRlc01lbWJlciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPigKICAgICAgICAiTG9hZExpYnJhcnlIaWRlc01lbWJlciIsIHRlbXBsYXRlTG9hZExpYnJhcnlIaWRlc01lbWJlciwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaWdub3JlZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzTG9hZExpYnJhcnlIaWRlc01lbWJlcihVcmkgdXJpXykgewogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTG9hZExpYnJhcnlIaWRlc01lbWJlciwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBsaWJyYXJ5ICcke3VyaX0nIGRlZmluZXMgYSB0b3AtbGV2ZWwgbWVtYmVyIG5hbWVkICdsb2FkTGlicmFyeScuIFRoaXMgbWVtYmVyIGlzIGhpZGRlbiBieSB0aGUgc3BlY2lhbCBtZW1iZXIgJ2xvYWRMaWJyYXJ5JyB0aGF0IHRoZSBsYW5ndWFnZSBhZGRzIHRvIHN1cHBvcnQgZGVmZXJyZWQgbG9hZGluZy4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IHRvIHJlbmFtZSBvciBoaWRlIHRoZSBtZW1iZXIuIiIiLAogICAgICBhcmd1bWVudHM6IHsndXJpJzogdXJpX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVMb2FkTGlicmFyeVRha2VzTm9Bcmd1bWVudHMgPQogICAgbWVzc2FnZUxvYWRMaWJyYXJ5VGFrZXNOb0FyZ3VtZW50czsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VMb2FkTGlicmFyeVRha2VzTm9Bcmd1bWVudHMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJMb2FkTGlicmFyeVRha2VzTm9Bcmd1bWVudHMiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkxPQURfTElCUkFSWV9UQUtFU19OT19BUkdVTUVOVFMiXSwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcsCiAgICBtZXNzYWdlOiByIiIiJ2xvYWRMaWJyYXJ5JyB0YWtlcyBubyBhcmd1bWVudHMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfKT4KICAgIHRlbXBsYXRlTG9jYWxEZWZpbml0aW9uSGlkZXNFeHBvcnQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJMb2NhbCBkZWZpbml0aW9uIG9mICcjbmFtZScgaGlkZXMgZXhwb3J0IGZyb20gJyN1cmknLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0xvY2FsRGVmaW5pdGlvbkhpZGVzRXhwb3J0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPgogICAgY29kZUxvY2FsRGVmaW5pdGlvbkhpZGVzRXhwb3J0ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPigKICAgICAgICAiTG9jYWxEZWZpbml0aW9uSGlkZXNFeHBvcnQiLCB0ZW1wbGF0ZUxvY2FsRGVmaW5pdGlvbkhpZGVzRXhwb3J0LAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pZ25vcmVkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNMb2NhbERlZmluaXRpb25IaWRlc0V4cG9ydChTdHJpbmcgbmFtZSwgVXJpIHVyaV8pIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVMb2NhbERlZmluaXRpb25IaWRlc0V4cG9ydCwKICAgICAgbWVzc2FnZTogIiIiTG9jYWwgZGVmaW5pdGlvbiBvZiAnJHtuYW1lfScgaGlkZXMgZXhwb3J0IGZyb20gJyR7dXJpfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd1cmknOiB1cmlffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfKT4KICAgIHRlbXBsYXRlTG9jYWxEZWZpbml0aW9uSGlkZXNJbXBvcnQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJMb2NhbCBkZWZpbml0aW9uIG9mICcjbmFtZScgaGlkZXMgaW1wb3J0IGZyb20gJyN1cmknLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0xvY2FsRGVmaW5pdGlvbkhpZGVzSW1wb3J0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPgogICAgY29kZUxvY2FsRGVmaW5pdGlvbkhpZGVzSW1wb3J0ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPigKICAgICAgICAiTG9jYWxEZWZpbml0aW9uSGlkZXNJbXBvcnQiLCB0ZW1wbGF0ZUxvY2FsRGVmaW5pdGlvbkhpZGVzSW1wb3J0LAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pZ25vcmVkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNMb2NhbERlZmluaXRpb25IaWRlc0ltcG9ydChTdHJpbmcgbmFtZSwgVXJpIHVyaV8pIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVMb2NhbERlZmluaXRpb25IaWRlc0ltcG9ydCwKICAgICAgbWVzc2FnZTogIiIiTG9jYWwgZGVmaW5pdGlvbiBvZiAnJHtuYW1lfScgaGlkZXMgaW1wb3J0IGZyb20gJyR7dXJpfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd1cmknOiB1cmlffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU1hcExpdGVyYWxUeXBlQXJndW1lbnRNaXNtYXRjaCA9CiAgICBtZXNzYWdlTWFwTGl0ZXJhbFR5cGVBcmd1bWVudE1pc21hdGNoOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU1hcExpdGVyYWxUeXBlQXJndW1lbnRNaXNtYXRjaCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk1hcExpdGVyYWxUeXBlQXJndW1lbnRNaXNtYXRjaCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVhQRUNURURfVFdPX01BUF9UWVBFX0FSR1VNRU5UUyJdLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZywKICAgIG1lc3NhZ2U6IHIiIiJBIG1hcCBsaXRlcmFsIHJlcXVpcmVzIGV4YWN0bHkgdHdvIHR5cGUgYXJndW1lbnRzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNZW1iZXJXaXRoU2FtZU5hbWVBc0NsYXNzID0KICAgIG1lc3NhZ2VNZW1iZXJXaXRoU2FtZU5hbWVBc0NsYXNzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU1lbWJlcldpdGhTYW1lTmFtZUFzQ2xhc3MgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJNZW1iZXJXaXRoU2FtZU5hbWVBc0NsYXNzIiwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkEgY2xhc3MgbWVtYmVyIGNhbid0IGhhdmUgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZW5jbG9zaW5nIGNsYXNzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNZXRhZGF0YVR5cGVBcmd1bWVudHMgPSBtZXNzYWdlTWV0YWRhdGFUeXBlQXJndW1lbnRzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU1ldGFkYXRhVHlwZUFyZ3VtZW50cyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk1ldGFkYXRhVHlwZUFyZ3VtZW50cyIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQU5OT1RBVElPTl9XSVRIX1RZUEVfQVJHVU1FTlRTIl0sCiAgICBtZXNzYWdlOiByIiIiQW4gYW5ub3RhdGlvbiAobWV0YWRhdGEpIGNhbid0IHVzZSB0eXBlIGFyZ3VtZW50cy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlTWV0aG9kTm90Rm91bmQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIk1ldGhvZCBub3QgZm91bmQ6ICcjbmFtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTWV0aG9kTm90Rm91bmQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZU1ldGhvZE5vdEZvdW5kID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJNZXRob2ROb3RGb3VuZCIsIHRlbXBsYXRlTWV0aG9kTm90Rm91bmQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlVOREVGSU5FRF9NRVRIT0QiXSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNNZXRob2ROb3RGb3VuZChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU1ldGhvZE5vdEZvdW5kLAogICAgICBtZXNzYWdlOiAiIiJNZXRob2Qgbm90IGZvdW5kOiAnJHtuYW1lfScuIiIiLCBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTWlzc2luZ0FyZ3VtZW50TGlzdCA9IG1lc3NhZ2VNaXNzaW5nQXJndW1lbnRMaXN0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU1pc3NpbmdBcmd1bWVudExpc3QgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJNaXNzaW5nQXJndW1lbnRMaXN0IiwKICAgIG1lc3NhZ2U6IHIiIiJDb25zdHJ1Y3RvciBpbnZvY2F0aW9ucyBtdXN0IGhhdmUgYW4gYXJndW1lbnQgbGlzdC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTWlzc2luZ0Fzc2lnbmFibGVTZWxlY3RvciA9CiAgICBtZXNzYWdlTWlzc2luZ0Fzc2lnbmFibGVTZWxlY3RvcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VNaXNzaW5nQXNzaWduYWJsZVNlbGVjdG9yID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTWlzc2luZ0Fzc2lnbmFibGVTZWxlY3RvciIsCiAgICBpbmRleDogMzUsCiAgICBtZXNzYWdlOiByIiIiTWlzc2luZyBzZWxlY3RvciBzdWNoIGFzICcuPGlkZW50aWZpZXI+JyBvciAnWzBdJy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgYWRkaW5nIGEgc2VsZWN0b3IuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU1pc3NpbmdBc3NpZ25tZW50SW5Jbml0aWFsaXplciA9CiAgICBtZXNzYWdlTWlzc2luZ0Fzc2lnbm1lbnRJbkluaXRpYWxpemVyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU1pc3NpbmdBc3NpZ25tZW50SW5Jbml0aWFsaXplciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk1pc3NpbmdBc3NpZ25tZW50SW5Jbml0aWFsaXplciIsCiAgICBpbmRleDogMzQsCiAgICBtZXNzYWdlOiByIiIiRXhwZWN0ZWQgYW4gYXNzaWdubWVudCBhZnRlciB0aGUgZmllbGQgbmFtZS4iIiIsCiAgICB0aXA6IHIiIiJUbyBpbml0aWFsaXplIGEgZmllbGQsIHVzZSB0aGUgc3ludGF4ICduYW1lID0gdmFsdWUnLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNaXNzaW5nQ29uc3RGaW5hbFZhck9yVHlwZSA9CiAgICBtZXNzYWdlTWlzc2luZ0NvbnN0RmluYWxWYXJPclR5cGU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTWlzc2luZ0NvbnN0RmluYWxWYXJPclR5cGUgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJNaXNzaW5nQ29uc3RGaW5hbFZhck9yVHlwZSIsCiAgICBpbmRleDogMzMsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJWYXJpYWJsZXMgbXVzdCBiZSBkZWNsYXJlZCB1c2luZyB0aGUga2V5d29yZHMgJ2NvbnN0JywgJ2ZpbmFsJywgJ3Zhcicgb3IgYSB0eXBlIG5hbWUuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgYWRkaW5nIHRoZSBuYW1lIG9mIHRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZSBvciB0aGUga2V5d29yZCAndmFyJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQpPgogICAgdGVtcGxhdGVNaXNzaW5nRXhwbGljaXRUeXBlQXJndW1lbnRzID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oaW50IGNvdW50KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiTm8gdHlwZSBhcmd1bWVudHMgcHJvdmlkZWQsICNjb3VudCBwb3NzaWJsZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNNaXNzaW5nRXhwbGljaXRUeXBlQXJndW1lbnRzKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQpPiBjb2RlTWlzc2luZ0V4cGxpY2l0VHlwZUFyZ3VtZW50cyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oaW50IGNvdW50KT4oCiAgICAgICAgIk1pc3NpbmdFeHBsaWNpdFR5cGVBcmd1bWVudHMiLCB0ZW1wbGF0ZU1pc3NpbmdFeHBsaWNpdFR5cGVBcmd1bWVudHMsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lmlnbm9yZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c01pc3NpbmdFeHBsaWNpdFR5cGVBcmd1bWVudHMoaW50IGNvdW50KSB7CiAgaWYgKGNvdW50ID09IG51bGwpIHRocm93ICdObyBjb3VudCBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVNaXNzaW5nRXhwbGljaXRUeXBlQXJndW1lbnRzLAogICAgICBtZXNzYWdlOiAiIiJObyB0eXBlIGFyZ3VtZW50cyBwcm92aWRlZCwgJHtjb3VudH0gcG9zc2libGUuIiIiLAogICAgICBhcmd1bWVudHM6IHsnY291bnQnOiBjb3VudH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNaXNzaW5nRXhwb25lbnQgPSBtZXNzYWdlTWlzc2luZ0V4cG9uZW50OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU1pc3NpbmdFeHBvbmVudCA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJNaXNzaW5nRXhwb25lbnQiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk1JU1NJTkdfRElHSVQiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIk51bWJlcnMgaW4gZXhwb25lbnRpYWwgbm90YXRpb24gc2hvdWxkIGFsd2F5cyBjb250YWluIGFuIGV4cG9uZW50IChhbiBpbnRlZ2VyIG51bWJlciB3aXRoIGFuIG9wdGlvbmFsIHNpZ24pLiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiTWFrZSBzdXJlIHRoZXJlIGlzIGFuIGV4cG9uZW50LCBhbmQgcmVtb3ZlIGFueSB3aGl0ZXNwYWNlIGJlZm9yZSBpdC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTWlzc2luZ0V4cHJlc3Npb25JblRocm93ID0gbWVzc2FnZU1pc3NpbmdFeHByZXNzaW9uSW5UaHJvdzsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VNaXNzaW5nRXhwcmVzc2lvbkluVGhyb3cgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJNaXNzaW5nRXhwcmVzc2lvbkluVGhyb3ciLAogICAgaW5kZXg6IDMyLAogICAgbWVzc2FnZTogciIiIk1pc3NpbmcgZXhwcmVzc2lvbiBhZnRlciAndGhyb3cnLiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiQWRkIGFuIGV4cHJlc3Npb24gYWZ0ZXIgJ3Rocm93JyBvciB1c2UgJ3JldGhyb3cnIHRvIHRocm93IGEgY2F1Z2h0IGV4Y2VwdGlvbiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNaXNzaW5nRnVuY3Rpb25QYXJhbWV0ZXJzID0KICAgIG1lc3NhZ2VNaXNzaW5nRnVuY3Rpb25QYXJhbWV0ZXJzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU1pc3NpbmdGdW5jdGlvblBhcmFtZXRlcnMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJNaXNzaW5nRnVuY3Rpb25QYXJhbWV0ZXJzIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNSVNTSU5HX0ZVTkNUSU9OX1BBUkFNRVRFUlMiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkEgZnVuY3Rpb24gZGVjbGFyYXRpb24gbmVlZHMgYW4gZXhwbGljaXQgbGlzdCBvZiBwYXJhbWV0ZXJzLiIiIiwKICAgIHRpcDogciIiIlRyeSBhZGRpbmcgYSBwYXJhbWV0ZXIgbGlzdCB0byB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVNaXNzaW5nSW1wbGVtZW50YXRpb25DYXVzZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiJyNuYW1lJyBpcyBkZWZpbmVkIGhlcmUuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTWlzc2luZ0ltcGxlbWVudGF0aW9uQ2F1c2UpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZU1pc3NpbmdJbXBsZW1lbnRhdGlvbkNhdXNlID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJNaXNzaW5nSW1wbGVtZW50YXRpb25DYXVzZSIsIHRlbXBsYXRlTWlzc2luZ0ltcGxlbWVudGF0aW9uQ2F1c2UsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c01pc3NpbmdJbXBsZW1lbnRhdGlvbkNhdXNlKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTWlzc2luZ0ltcGxlbWVudGF0aW9uQ2F1c2UsCiAgICAgIG1lc3NhZ2U6ICIiIicke25hbWV9JyBpcyBkZWZpbmVkIGhlcmUuIiIiLCBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIExpc3Q8U3RyaW5nPgogICAgICAgICAgICBfbmFtZXMpPiB0ZW1wbGF0ZU1pc3NpbmdJbXBsZW1lbnRhdGlvbk5vdEFic3RyYWN0ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgTGlzdDxTdHJpbmc+IF9uYW1lcyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgbm9uLWFic3RyYWN0IGNsYXNzICcjbmFtZScgaXMgbWlzc2luZyBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZXNlIG1lbWJlcnM6CiNuYW1lcyIiIiwKICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IHRvIGVpdGhlcgogLSBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uLAogLSBpbmhlcml0IGFuIGltcGxlbWVudGF0aW9uIGZyb20gYSBzdXBlcmNsYXNzIG9yIG1peGluLAogLSBtYXJrIHRoZSBjbGFzcyBhcyBhYnN0cmFjdCwgb3IKIC0gcHJvdmlkZSBhICdub1N1Y2hNZXRob2QnIGltcGxlbWVudGF0aW9uLgoiIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c01pc3NpbmdJbXBsZW1lbnRhdGlvbk5vdEFic3RyYWN0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgTGlzdDxTdHJpbmc+IF9uYW1lcyk+CiAgICBjb2RlTWlzc2luZ0ltcGxlbWVudGF0aW9uTm90QWJzdHJhY3QgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBMaXN0PFN0cmluZz4gX25hbWVzKT4oCiAgICAgICAgIk1pc3NpbmdJbXBsZW1lbnRhdGlvbk5vdEFic3RyYWN0IiwKICAgICAgICB0ZW1wbGF0ZU1pc3NpbmdJbXBsZW1lbnRhdGlvbk5vdEFic3RyYWN0LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJDT05DUkVURV9DTEFTU19XSVRIX0FCU1RSQUNUX01FTUJFUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNNaXNzaW5nSW1wbGVtZW50YXRpb25Ob3RBYnN0cmFjdCgKICAgIFN0cmluZyBuYW1lLCBMaXN0PFN0cmluZz4gX25hbWVzKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIGlmIChfbmFtZXMuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWVzIHByb3ZpZGVkJzsKICBTdHJpbmcgbmFtZXMgPSBpdGVtaXplTmFtZXMoX25hbWVzKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU1pc3NpbmdJbXBsZW1lbnRhdGlvbk5vdEFic3RyYWN0LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIG5vbi1hYnN0cmFjdCBjbGFzcyAnJHtuYW1lfScgaXMgbWlzc2luZyBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZXNlIG1lbWJlcnM6CiR7bmFtZXN9IiIiLAogICAgICB0aXA6ICIiIlRyeSB0byBlaXRoZXIKIC0gcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiwKIC0gaW5oZXJpdCBhbiBpbXBsZW1lbnRhdGlvbiBmcm9tIGEgc3VwZXJjbGFzcyBvciBtaXhpbiwKIC0gbWFyayB0aGUgY2xhc3MgYXMgYWJzdHJhY3QsIG9yCiAtIHByb3ZpZGUgYSAnbm9TdWNoTWV0aG9kJyBpbXBsZW1lbnRhdGlvbi4KIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICduYW1lcyc6IF9uYW1lc30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNaXNzaW5nSW5wdXQgPSBtZXNzYWdlTWlzc2luZ0lucHV0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU1pc3NpbmdJbnB1dCA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJNaXNzaW5nSW5wdXQiLAogICAgbWVzc2FnZTogciIiIk5vIGlucHV0IGZpbGUgcHJvdmlkZWQgdG8gdGhlIGNvbXBpbGVyLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNaXNzaW5nTWFpbiA9IG1lc3NhZ2VNaXNzaW5nTWFpbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VNaXNzaW5nTWFpbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJNaXNzaW5nTWFpbiIsCiAgICBtZXNzYWdlOiByIiIiTm8gJ21haW4nIG1ldGhvZCBmb3VuZC4iIiIsCiAgICB0aXA6IHIiIiJUcnkgYWRkaW5nIGEgbWV0aG9kIG5hbWVkICdtYWluJyB0byB5b3VyIHByb2dyYW0uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU1pc3NpbmdNZXRob2RQYXJhbWV0ZXJzID0gbWVzc2FnZU1pc3NpbmdNZXRob2RQYXJhbWV0ZXJzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU1pc3NpbmdNZXRob2RQYXJhbWV0ZXJzID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTWlzc2luZ01ldGhvZFBhcmFtZXRlcnMiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk1JU1NJTkdfTUVUSE9EX1BBUkFNRVRFUlMiXSwKICAgIG1lc3NhZ2U6IHIiIiJBIG1ldGhvZCBkZWNsYXJhdGlvbiBuZWVkcyBhbiBleHBsaWNpdCBsaXN0IG9mIHBhcmFtZXRlcnMuIiIiLAogICAgdGlwOiByIiIiVHJ5IGFkZGluZyBhIHBhcmFtZXRlciBsaXN0IHRvIHRoZSBtZXRob2QgZGVjbGFyYXRpb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU1pc3NpbmdPcGVyYXRvcktleXdvcmQgPSBtZXNzYWdlTWlzc2luZ09wZXJhdG9yS2V5d29yZDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VNaXNzaW5nT3BlcmF0b3JLZXl3b3JkID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTWlzc2luZ09wZXJhdG9yS2V5d29yZCIsCiAgICBpbmRleDogMzEsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJPcGVyYXRvciBkZWNsYXJhdGlvbnMgbXVzdCBiZSBwcmVjZWRlZCBieSB0aGUga2V5d29yZCAnb3BlcmF0b3InLiIiIiwKICAgIHRpcDogciIiIlRyeSBhZGRpbmcgdGhlIGtleXdvcmQgJ29wZXJhdG9yJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4gdGVtcGxhdGVNaXNzaW5nUGFydE9mID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJDYW4ndCB1c2UgJyN1cmknIGFzIGEgcGFydCwgYmVjYXVzZSBpdCBoYXMgbm8gJ3BhcnQgb2YnIGRlY2xhcmF0aW9uLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTWlzc2luZ1BhcnRPZik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPiBjb2RlTWlzc2luZ1BhcnRPZiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPigKICAgICAgICAiTWlzc2luZ1BhcnRPZiIsIHRlbXBsYXRlTWlzc2luZ1BhcnRPZiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUEFSVF9PRl9OT05fUEFSVCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNNaXNzaW5nUGFydE9mKFVyaSB1cmlfKSB7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVNaXNzaW5nUGFydE9mLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQ2FuJ3QgdXNlICcke3VyaX0nIGFzIGEgcGFydCwgYmVjYXVzZSBpdCBoYXMgbm8gJ3BhcnQgb2YnIGRlY2xhcmF0aW9uLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3VyaSc6IHVyaV99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTWlzc2luZ1ByZWZpeEluRGVmZXJyZWRJbXBvcnQgPQogICAgbWVzc2FnZU1pc3NpbmdQcmVmaXhJbkRlZmVycmVkSW1wb3J0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU1pc3NpbmdQcmVmaXhJbkRlZmVycmVkSW1wb3J0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTWlzc2luZ1ByZWZpeEluRGVmZXJyZWRJbXBvcnQiLAogICAgaW5kZXg6IDMwLAogICAgbWVzc2FnZTogciIiIkRlZmVycmVkIGltcG9ydHMgc2hvdWxkIGhhdmUgYSBwcmVmaXguIiIiLAogICAgdGlwOiByIiIiVHJ5IGFkZGluZyBhIHByZWZpeCB0byB0aGUgaW1wb3J0LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNaXNzaW5nVHlwZWRlZlBhcmFtZXRlcnMgPSBtZXNzYWdlTWlzc2luZ1R5cGVkZWZQYXJhbWV0ZXJzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU1pc3NpbmdUeXBlZGVmUGFyYW1ldGVycyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk1pc3NpbmdUeXBlZGVmUGFyYW1ldGVycyIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTUlTU0lOR19UWVBFREVGX1BBUkFNRVRFUlMiXSwKICAgIG1lc3NhZ2U6IHIiIiJBIHR5cGVkZWYgbmVlZHMgYW4gZXhwbGljaXQgbGlzdCBvZiBwYXJhbWV0ZXJzLiIiIiwKICAgIHRpcDogciIiIlRyeSBhZGRpbmcgYSBwYXJhbWV0ZXIgbGlzdCB0byB0aGUgdHlwZWRlZi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBEYXJ0VHlwZSBfdHlwZTMpPgogICAgdGVtcGxhdGVNaXhpbkFwcGxpY2F0aW9uSW5jb21wYXRpYmxlU3VwZXJ0eXBlID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgRGFydFR5cGUgX3R5cGUzKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiJyN0eXBlJyBkb2Vzbid0IGltcGxlbWVudCAnI3R5cGUyJyBzbyBpdCBjYW4ndCBiZSB1c2VkIHdpdGggJyN0eXBlMycuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTWl4aW5BcHBsaWNhdGlvbkluY29tcGF0aWJsZVN1cGVydHlwZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgRGFydFR5cGUgX3R5cGUzKT4KICAgIGNvZGVNaXhpbkFwcGxpY2F0aW9uSW5jb21wYXRpYmxlU3VwZXJ0eXBlID0gY29uc3QgQ29kZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBEYXJ0VHlwZSBfdHlwZTMpPigKICAgICAgICAiTWl4aW5BcHBsaWNhdGlvbkluY29tcGF0aWJsZVN1cGVydHlwZSIsCiAgICAgICAgdGVtcGxhdGVNaXhpbkFwcGxpY2F0aW9uSW5jb21wYXRpYmxlU3VwZXJ0eXBlLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNSVhJTl9BUFBMSUNBVElPTl9OT1RfSU1QTEVNRU5URURfSU5URVJGQUNFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c01peGluQXBwbGljYXRpb25JbmNvbXBhdGlibGVTdXBlcnR5cGUoCiAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBEYXJ0VHlwZSBfdHlwZTMpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgTGlzdDxPYmplY3Q+IHR5cGUzUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTMpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTMgPSB0eXBlM1BhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU1peGluQXBwbGljYXRpb25JbmNvbXBhdGlibGVTdXBlcnR5cGUsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiInJHt0eXBlfScgZG9lc24ndCBpbXBsZW1lbnQgJyR7dHlwZTJ9JyBzbyBpdCBjYW4ndCBiZSB1c2VkIHdpdGggJyR7dHlwZTN9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMiwgJ3R5cGUzJzogX3R5cGUzfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBTdHJpbmcgbmFtZTIsCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUpPiB0ZW1wbGF0ZU1peGluSW5mZXJlbmNlTm9NYXRjaGluZ0NsYXNzID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyLCBEYXJ0VHlwZSBfdHlwZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUeXBlIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIGluZmVycmVkIGZvciB0aGUgbWl4aW4gJyNuYW1lJyBiZWNhdXNlICcjbmFtZTInIGRvZXMgbm90IGltcGxlbWVudCB0aGUgbWl4aW4ncyBzdXBlcnR5cGUgY29uc3RyYWludCAnI3R5cGUnLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTWl4aW5JbmZlcmVuY2VOb01hdGNoaW5nQ2xhc3MpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIsIERhcnRUeXBlIF90eXBlKT4KICAgIGNvZGVNaXhpbkluZmVyZW5jZU5vTWF0Y2hpbmdDbGFzcyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMiwgRGFydFR5cGUgX3R5cGUpPigKICAgICAgICAiTWl4aW5JbmZlcmVuY2VOb01hdGNoaW5nQ2xhc3MiLCB0ZW1wbGF0ZU1peGluSW5mZXJlbmNlTm9NYXRjaGluZ0NsYXNzLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNSVhJTl9JTkZFUkVOQ0VfTk9fUE9TU0lCTEVfU1VCU1RJVFVUSU9OIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c01peGluSW5mZXJlbmNlTm9NYXRjaGluZ0NsYXNzKAogICAgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMiwgRGFydFR5cGUgX3R5cGUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKG5hbWUyLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lMiA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZTIpOwogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU1peGluSW5mZXJlbmNlTm9NYXRjaGluZ0NsYXNzLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVHlwZSBwYXJhbWV0ZXJzIGNvdWxkIG5vdCBiZSBpbmZlcnJlZCBmb3IgdGhlIG1peGluICcke25hbWV9JyBiZWNhdXNlICcke25hbWUyfScgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBtaXhpbidzIHN1cGVydHlwZSBjb25zdHJhaW50ICcke3R5cGV9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ25hbWUyJzogbmFtZTIsICd0eXBlJzogX3R5cGV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTW9yZVRoYW5PbmVTdXBlck9yVGhpc0luaXRpYWxpemVyID0KICAgIG1lc3NhZ2VNb3JlVGhhbk9uZVN1cGVyT3JUaGlzSW5pdGlhbGl6ZXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTW9yZVRoYW5PbmVTdXBlck9yVGhpc0luaXRpYWxpemVyID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTW9yZVRoYW5PbmVTdXBlck9yVGhpc0luaXRpYWxpemVyIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJTVVBFUl9JTl9SRURJUkVDVElOR19DT05TVFJVQ1RPUiJdLAogICAgbWVzc2FnZTogciIiIkNhbid0IGhhdmUgbW9yZSB0aGFuIG9uZSAnc3VwZXInIG9yICd0aGlzJyBpbml0aWFsaXplci4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTXVsdGlwbGVFeHRlbmRzID0gbWVzc2FnZU11bHRpcGxlRXh0ZW5kczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VNdWx0aXBsZUV4dGVuZHMgPSBjb25zdCBNZXNzYWdlQ29kZSgiTXVsdGlwbGVFeHRlbmRzIiwKICAgIGluZGV4OiAyOCwKICAgIG1lc3NhZ2U6IHIiIiJFYWNoIGNsYXNzIGRlZmluaXRpb24gY2FuIGhhdmUgYXQgbW9zdCBvbmUgZXh0ZW5kcyBjbGF1c2UuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgY2hvb3Npbmcgb25lIHN1cGVyY2xhc3MgYW5kIGRlZmluZSB5b3VyIGNsYXNzIHRvIGltcGxlbWVudCAob3IgbWl4IGluKSB0aGUgb3RoZXJzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNdWx0aXBsZUltcGxlbWVudHMgPSBtZXNzYWdlTXVsdGlwbGVJbXBsZW1lbnRzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU11bHRpcGxlSW1wbGVtZW50cyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk11bHRpcGxlSW1wbGVtZW50cyIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTVVMVElQTEVfSU1QTEVNRU5UU19DTEFVU0VTIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJFYWNoIGNsYXNzIGRlZmluaXRpb24gY2FuIGhhdmUgYXQgbW9zdCBvbmUgaW1wbGVtZW50cyBjbGF1c2UuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgY29tYmluaW5nIGFsbCBvZiB0aGUgaW1wbGVtZW50cyBjbGF1c2VzIGludG8gYSBzaW5nbGUgY2xhdXNlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNdWx0aXBsZUxpYnJhcnlEaXJlY3RpdmVzID0KICAgIG1lc3NhZ2VNdWx0aXBsZUxpYnJhcnlEaXJlY3RpdmVzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU11bHRpcGxlTGlicmFyeURpcmVjdGl2ZXMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJNdWx0aXBsZUxpYnJhcnlEaXJlY3RpdmVzIiwKICAgIGluZGV4OiAyNywKICAgIG1lc3NhZ2U6IHIiIiJPbmx5IG9uZSBsaWJyYXJ5IGRpcmVjdGl2ZSBtYXkgYmUgZGVjbGFyZWQgaW4gYSBmaWxlLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyBhbGwgYnV0IG9uZSBvZiB0aGUgbGlicmFyeSBkaXJlY3RpdmVzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNdWx0aXBsZU9uQ2xhdXNlcyA9IG1lc3NhZ2VNdWx0aXBsZU9uQ2xhdXNlczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VNdWx0aXBsZU9uQ2xhdXNlcyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk11bHRpcGxlT25DbGF1c2VzIiwKICAgIGluZGV4OiAyNiwKICAgIG1lc3NhZ2U6IHIiIiJFYWNoIG1peGluIGRlZmluaXRpb24gY2FuIGhhdmUgYXQgbW9zdCBvbmUgb24gY2xhdXNlLiIiIiwKICAgIHRpcDogciIiIlRyeSBjb21iaW5pbmcgYWxsIG9mIHRoZSBvbiBjbGF1c2VzIGludG8gYSBzaW5nbGUgY2xhdXNlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNdWx0aXBsZVdpdGggPSBtZXNzYWdlTXVsdGlwbGVXaXRoOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU11bHRpcGxlV2l0aCA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJNdWx0aXBsZVdpdGgiLAogICAgaW5kZXg6IDI0LAogICAgbWVzc2FnZTogciIiIkVhY2ggY2xhc3MgZGVmaW5pdGlvbiBjYW4gaGF2ZSBhdCBtb3N0IG9uZSB3aXRoIGNsYXVzZS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgY29tYmluaW5nIGFsbCBvZiB0aGUgd2l0aCBjbGF1c2VzIGludG8gYSBzaW5nbGUgY2xhdXNlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVOYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbiA9IG1lc3NhZ2VOYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VOYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk5hbWVkRnVuY3Rpb25FeHByZXNzaW9uIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJOQU1FRF9GVU5DVElPTl9FWFBSRVNTSU9OIl0sCiAgICBtZXNzYWdlOiByIiIiQSBmdW5jdGlvbiBleHByZXNzaW9uIGNhbid0IGhhdmUgYSBuYW1lLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUpPiB0ZW1wbGF0ZU5hbWVkTWl4aW5PdmVycmlkZUNvbnRleHQgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIk92ZXJyaWRlIHdhcyBpbnRyb2R1Y2VkIGluIHRoZSBtaXhpbiBhcHBsaWNhdGlvbiBjbGFzcyAnI25hbWUnLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTmFtZWRNaXhpbk92ZXJyaWRlQ29udGV4dCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlTmFtZWRNaXhpbk92ZXJyaWRlQ29udGV4dCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiTmFtZWRNaXhpbk92ZXJyaWRlQ29udGV4dCIsIHRlbXBsYXRlTmFtZWRNaXhpbk92ZXJyaWRlQ29udGV4dCwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzTmFtZWRNaXhpbk92ZXJyaWRlQ29udGV4dChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU5hbWVkTWl4aW5PdmVycmlkZUNvbnRleHQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJPdmVycmlkZSB3YXMgaW50cm9kdWNlZCBpbiB0aGUgbWl4aW4gYXBwbGljYXRpb24gY2xhc3MgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU5hdGl2ZUNsYXVzZVNob3VsZEJlQW5ub3RhdGlvbiA9CiAgICBtZXNzYWdlTmF0aXZlQ2xhdXNlU2hvdWxkQmVBbm5vdGF0aW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU5hdGl2ZUNsYXVzZVNob3VsZEJlQW5ub3RhdGlvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk5hdGl2ZUNsYXVzZVNob3VsZEJlQW5ub3RhdGlvbiIsCiAgICBpbmRleDogMjMsCiAgICBtZXNzYWdlOiByIiIiTmF0aXZlIGNsYXVzZSBpbiB0aGlzIGZvcm0gaXMgZGVwcmVjYXRlZC4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIlRyeSByZW1vdmluZyB0aGlzIG5hdGl2ZSBjbGF1c2UgYW5kIGFkZGluZyBAbmF0aXZlKCkgb3IgQG5hdGl2ZSgnbmF0aXZlLW5hbWUnKSBiZWZvcmUgdGhlIGRlY2xhcmF0aW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiB0ZW1wbGF0ZU5vRm9ybWFscyA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkEgZnVuY3Rpb24gc2hvdWxkIGhhdmUgZm9ybWFsIHBhcmFtZXRlcnMuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBhZGRpbmcgJygpJyBhZnRlciAnI2xleGVtZScsIG9yIGFkZCAnZ2V0JyBiZWZvcmUgJyNsZXhlbWUnIHRvIGRlY2xhcmUgYSBnZXR0ZXIuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNOb0Zvcm1hbHMpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gY29kZU5vRm9ybWFscyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigiTm9Gb3JtYWxzIiwgdGVtcGxhdGVOb0Zvcm1hbHMsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk1JU1NJTkdfRlVOQ1RJT05fUEFSQU1FVEVSUyJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNOb0Zvcm1hbHMoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTm9Gb3JtYWxzLAogICAgICBtZXNzYWdlOiAiIiJBIGZ1bmN0aW9uIHNob3VsZCBoYXZlIGZvcm1hbCBwYXJhbWV0ZXJzLiIiIiwKICAgICAgdGlwOgogICAgICAgICAgIiIiVHJ5IGFkZGluZyAnKCknIGFmdGVyICcke2xleGVtZX0nLCBvciBhZGQgJ2dldCcgYmVmb3JlICcke2xleGVtZX0nIHRvIGRlY2xhcmUgYSBnZXR0ZXIuIiIiLAogICAgICBhcmd1bWVudHM6IHsndG9rZW4nOiB0b2tlbn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVOb1N1Y2hOYW1lZFBhcmFtZXRlciA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiTm8gbmFtZWQgcGFyYW1ldGVyIHdpdGggdGhlIG5hbWUgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNOb1N1Y2hOYW1lZFBhcmFtZXRlcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlTm9TdWNoTmFtZWRQYXJhbWV0ZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIk5vU3VjaE5hbWVkUGFyYW1ldGVyIiwgdGVtcGxhdGVOb1N1Y2hOYW1lZFBhcmFtZXRlciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5ERUZJTkVEX05BTUVEX1BBUkFNRVRFUiJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c05vU3VjaE5hbWVkUGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTm9TdWNoTmFtZWRQYXJhbWV0ZXIsCiAgICAgIG1lc3NhZ2U6ICIiIk5vIG5hbWVkIHBhcmFtZXRlciB3aXRoIHRoZSBuYW1lICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVOb1VubmFtZWRDb25zdHJ1Y3RvckluT2JqZWN0ID0KICAgIG1lc3NhZ2VOb1VubmFtZWRDb25zdHJ1Y3RvckluT2JqZWN0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU5vVW5uYW1lZENvbnN0cnVjdG9ySW5PYmplY3QgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJOb1VubmFtZWRDb25zdHJ1Y3RvckluT2JqZWN0IiwKICAgIG1lc3NhZ2U6IHIiIiInT2JqZWN0JyBoYXMgbm8gdW5uYW1lZCBjb25zdHJ1Y3Rvci4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBjaGFyYWN0ZXIsCiAgICAgICAgaW50CiAgICAgICAgICAgIGNvZGVQb2ludCk+IHRlbXBsYXRlTm9uQXNjaWlJZGVudGlmaWVyID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgY2hhcmFjdGVyLCBpbnQgY29kZVBvaW50KT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBub24tQVNDSUkgY2hhcmFjdGVyICcjY2hhcmFjdGVyJyAoI3VuaWNvZGUpIGNhbid0IGJlIHVzZWQgaW4gaWRlbnRpZmllcnMsIG9ubHkgaW4gc3RyaW5ncyBhbmQgY29tbWVudHMuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSB1c2luZyBhbiBVUy1BU0NJSSBsZXR0ZXIsIGEgZGlnaXQsICdfJyAoYW4gdW5kZXJzY29yZSksIG9yICckJyAoYSBkb2xsYXIgc2lnbikuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNOb25Bc2NpaUlkZW50aWZpZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBjaGFyYWN0ZXIsIGludCBjb2RlUG9pbnQpPgogICAgY29kZU5vbkFzY2lpSWRlbnRpZmllciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIGNoYXJhY3RlciwgaW50IGNvZGVQb2ludCk+KAogICAgICAgICJOb25Bc2NpaUlkZW50aWZpZXIiLCB0ZW1wbGF0ZU5vbkFzY2lpSWRlbnRpZmllciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSUxMRUdBTF9DSEFSQUNURVIiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzTm9uQXNjaWlJZGVudGlmaWVyKFN0cmluZyBjaGFyYWN0ZXIsIGludCBjb2RlUG9pbnQpIHsKICBpZiAoY2hhcmFjdGVyLnJ1bmVzLmxlbmd0aCAhPSAxKSB0aHJvdyAiTm90IGEgY2hhcmFjdGVyICcke2NoYXJhY3Rlcn0nIjsKICBTdHJpbmcgdW5pY29kZSA9CiAgICAgICJVKyR7Y29kZVBvaW50LnRvUmFkaXhTdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkucGFkTGVmdCg0LCAnMCcpfSI7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVOb25Bc2NpaUlkZW50aWZpZXIsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgbm9uLUFTQ0lJIGNoYXJhY3RlciAnJHtjaGFyYWN0ZXJ9JyAoJHt1bmljb2RlfSkgY2FuJ3QgYmUgdXNlZCBpbiBpZGVudGlmaWVycywgb25seSBpbiBzdHJpbmdzIGFuZCBjb21tZW50cy4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IHVzaW5nIGFuIFVTLUFTQ0lJIGxldHRlciwgYSBkaWdpdCwgJ18nIChhbiB1bmRlcnNjb3JlKSwgb3IgJ1wkJyAoYSBkb2xsYXIgc2lnbikuIiIiLAogICAgICBhcmd1bWVudHM6IHsnY2hhcmFjdGVyJzogY2hhcmFjdGVyLCAnY29kZVBvaW50JzogY29kZVBvaW50fSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBpbnQKICAgICAgICAgICAgY29kZVBvaW50KT4gdGVtcGxhdGVOb25Bc2NpaVdoaXRlc3BhY2UgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKGludCBjb2RlUG9pbnQpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIG5vbi1BU0NJSSBzcGFjZSBjaGFyYWN0ZXIgI3VuaWNvZGUgY2FuIG9ubHkgYmUgdXNlZCBpbiBzdHJpbmdzIGFuZCBjb21tZW50cy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c05vbkFzY2lpV2hpdGVzcGFjZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oaW50IGNvZGVQb2ludCk+IGNvZGVOb25Bc2NpaVdoaXRlc3BhY2UgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKGludCBjb2RlUG9pbnQpPigKICAgICAgICAiTm9uQXNjaWlXaGl0ZXNwYWNlIiwgdGVtcGxhdGVOb25Bc2NpaVdoaXRlc3BhY2UsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklMTEVHQUxfQ0hBUkFDVEVSIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c05vbkFzY2lpV2hpdGVzcGFjZShpbnQgY29kZVBvaW50KSB7CiAgU3RyaW5nIHVuaWNvZGUgPQogICAgICAiVSske2NvZGVQb2ludC50b1JhZGl4U3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLnBhZExlZnQoNCwgJzAnKX0iOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTm9uQXNjaWlXaGl0ZXNwYWNlLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIG5vbi1BU0NJSSBzcGFjZSBjaGFyYWN0ZXIgJHt1bmljb2RlfSBjYW4gb25seSBiZSB1c2VkIGluIHN0cmluZ3MgYW5kIGNvbW1lbnRzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J2NvZGVQb2ludCc6IGNvZGVQb2ludH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVOb25Db25zdENvbnN0cnVjdG9yID0gbWVzc2FnZU5vbkNvbnN0Q29uc3RydWN0b3I7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTm9uQ29uc3RDb25zdHJ1Y3RvciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk5vbkNvbnN0Q29uc3RydWN0b3IiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PVF9DT05TVEFOVF9FWFBSRVNTSU9OIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJDYW5ub3QgaW52b2tlIGEgbm9uLSdjb25zdCcgY29uc3RydWN0b3Igd2hlcmUgYSBjb25zdCBleHByZXNzaW9uIGlzIGV4cGVjdGVkLiIiIiwKICAgIHRpcDogciIiIlRyeSB1c2luZyBhIGNvbnN0cnVjdG9yIG9yIGZhY3RvcnkgdGhhdCBpcyAnY29uc3QnLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVOb25Db25zdEZhY3RvcnkgPSBtZXNzYWdlTm9uQ29uc3RGYWN0b3J5OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU5vbkNvbnN0RmFjdG9yeSA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJOb25Db25zdEZhY3RvcnkiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PVF9DT05TVEFOVF9FWFBSRVNTSU9OIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJDYW5ub3QgaW52b2tlIGEgbm9uLSdjb25zdCcgZmFjdG9yeSB3aGVyZSBhIGNvbnN0IGV4cHJlc3Npb24gaXMgZXhwZWN0ZWQuIiIiLAogICAgdGlwOiByIiIiVHJ5IHVzaW5nIGEgY29uc3RydWN0b3Igb3IgZmFjdG9yeSB0aGF0IGlzICdjb25zdCcuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU5vbkluc3RhbmNlVHlwZVZhcmlhYmxlVXNlID0KICAgIG1lc3NhZ2VOb25JbnN0YW5jZVR5cGVWYXJpYWJsZVVzZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VOb25JbnN0YW5jZVR5cGVWYXJpYWJsZVVzZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk5vbkluc3RhbmNlVHlwZVZhcmlhYmxlVXNlIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJUWVBFX1BBUkFNRVRFUl9SRUZFUkVOQ0VEX0JZX1NUQVRJQyJdLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZywKICAgIG1lc3NhZ2U6IHIiIiJDYW4gb25seSB1c2UgdHlwZSB2YXJpYWJsZXMgaW4gaW5zdGFuY2UgbWV0aG9kcy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTm9uTnVsbEF3YXJlU3ByZWFkSXNOdWxsID0gbWVzc2FnZU5vbk51bGxBd2FyZVNwcmVhZElzTnVsbDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VOb25OdWxsQXdhcmVTcHJlYWRJc051bGwgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJOb25OdWxsQXdhcmVTcHJlYWRJc051bGwiLAogICAgbWVzc2FnZTogciIiIkNhbid0IHNwcmVhZCBhIHZhbHVlIHdpdGggc3RhdGljIHR5cGUgTnVsbC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTm9uUGFydE9mRGlyZWN0aXZlSW5QYXJ0ID0gbWVzc2FnZU5vblBhcnRPZkRpcmVjdGl2ZUluUGFydDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VOb25QYXJ0T2ZEaXJlY3RpdmVJblBhcnQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJOb25QYXJ0T2ZEaXJlY3RpdmVJblBhcnQiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PTl9QQVJUX09GX0RJUkVDVElWRV9JTl9QQVJUIl0sCiAgICBtZXNzYWdlOiByIiIiVGhlIHBhcnQtb2YgZGlyZWN0aXZlIG11c3QgYmUgdGhlIG9ubHkgZGlyZWN0aXZlIGluIGEgcGFydC4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIlRyeSByZW1vdmluZyB0aGUgb3RoZXIgZGlyZWN0aXZlcywgb3IgbW92aW5nIHRoZW0gdG8gdGhlIGxpYnJhcnkgZm9yIHdoaWNoIHRoaXMgaXMgYSBwYXJ0LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlTm9uU2ltcGxlQm91bmRWaWFSZWZlcmVuY2UgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkJvdW5kIG9mIHRoaXMgdmFyaWFibGUgcmVmZXJlbmNlcyByYXcgdHlwZSAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c05vblNpbXBsZUJvdW5kVmlhUmVmZXJlbmNlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVOb25TaW1wbGVCb3VuZFZpYVJlZmVyZW5jZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiTm9uU2ltcGxlQm91bmRWaWFSZWZlcmVuY2UiLCB0ZW1wbGF0ZU5vblNpbXBsZUJvdW5kVmlhUmVmZXJlbmNlLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNOb25TaW1wbGVCb3VuZFZpYVJlZmVyZW5jZShTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU5vblNpbXBsZUJvdW5kVmlhUmVmZXJlbmNlLAogICAgICBtZXNzYWdlOiAiIiJCb3VuZCBvZiB0aGlzIHZhcmlhYmxlIHJlZmVyZW5jZXMgcmF3IHR5cGUgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlTm9uU2ltcGxlQm91bmRWaWFWYXJpYWJsZSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiQm91bmQgb2YgdGhpcyB2YXJpYWJsZSByZWZlcmVuY2VzIHZhcmlhYmxlICcjbmFtZScgZnJvbSB0aGUgc2FtZSBkZWNsYXJhdGlvbi4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c05vblNpbXBsZUJvdW5kVmlhVmFyaWFibGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZU5vblNpbXBsZUJvdW5kVmlhVmFyaWFibGUgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIk5vblNpbXBsZUJvdW5kVmlhVmFyaWFibGUiLCB0ZW1wbGF0ZU5vblNpbXBsZUJvdW5kVmlhVmFyaWFibGUsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c05vblNpbXBsZUJvdW5kVmlhVmFyaWFibGUoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVOb25TaW1wbGVCb3VuZFZpYVZhcmlhYmxlLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQm91bmQgb2YgdGhpcyB2YXJpYWJsZSByZWZlcmVuY2VzIHZhcmlhYmxlICcke25hbWV9JyBmcm9tIHRoZSBzYW1lIGRlY2xhcmF0aW9uLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU5vdEFDb25zdGFudEV4cHJlc3Npb24gPSBtZXNzYWdlTm90QUNvbnN0YW50RXhwcmVzc2lvbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VOb3RBQ29uc3RhbnRFeHByZXNzaW9uID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTm90QUNvbnN0YW50RXhwcmVzc2lvbiIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9UX0NPTlNUQU5UX0VYUFJFU1NJT04iXSwKICAgIG1lc3NhZ2U6IHIiIiJOb3QgYSBjb25zdGFudCBleHByZXNzaW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUyKT4gdGVtcGxhdGVOb3RBUHJlZml4SW5UeXBlQW5ub3RhdGlvbiA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiInI25hbWUuI25hbWUyJyBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZSBiZWNhdXNlICcjbmFtZScgZG9lc24ndCByZWZlciB0byBhbiBpbXBvcnQgcHJlZml4LiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTm90QVByZWZpeEluVHlwZUFubm90YXRpb24pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPgogICAgY29kZU5vdEFQcmVmaXhJblR5cGVBbm5vdGF0aW9uID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICAgICAgIk5vdEFQcmVmaXhJblR5cGVBbm5vdGF0aW9uIiwgdGVtcGxhdGVOb3RBUHJlZml4SW5UeXBlQW5ub3RhdGlvbiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9UX0FfVFlQRSJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c05vdEFQcmVmaXhJblR5cGVBbm5vdGF0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKG5hbWUyLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lMiA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZTIpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTm90QVByZWZpeEluVHlwZUFubm90YXRpb24sCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiInJHtuYW1lfS4ke25hbWUyfScgY2FuJ3QgYmUgdXNlZCBhcyBhIHR5cGUgYmVjYXVzZSAnJHtuYW1lfScgZG9lc24ndCByZWZlciB0byBhbiBpbXBvcnQgcHJlZml4LiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAnbmFtZTInOiBuYW1lMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVOb3RBVHlwZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiJyNuYW1lJyBpc24ndCBhIHR5cGUuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTm90QVR5cGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZU5vdEFUeXBlID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KCJOb3RBVHlwZSIsIHRlbXBsYXRlTm90QVR5cGUsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PVF9BX1RZUEUiXSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNOb3RBVHlwZShTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU5vdEFUeXBlLAogICAgICBtZXNzYWdlOiAiIiInJHtuYW1lfScgaXNuJ3QgYSB0eXBlLiIiIiwgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU5vdEFUeXBlQ29udGV4dCA9IG1lc3NhZ2VOb3RBVHlwZUNvbnRleHQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTm90QVR5cGVDb250ZXh0ID0gY29uc3QgTWVzc2FnZUNvZGUoIk5vdEFUeXBlQ29udGV4dCIsCiAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCwgbWVzc2FnZTogciIiIlRoaXMgaXNuJ3QgYSB0eXBlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVOb3RBbkx2YWx1ZSA9IG1lc3NhZ2VOb3RBbkx2YWx1ZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VOb3RBbkx2YWx1ZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJOb3RBbkx2YWx1ZSIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9UX0FOX0xWQUxVRSJdLAogICAgbWVzc2FnZTogciIiIkNhbid0IGFzc2lnbiB0byB0aGlzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gdGVtcGxhdGVOb3RCaW5hcnlPcGVyYXRvciA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiJyNsZXhlbWUnIGlzbid0IGEgYmluYXJ5IG9wZXJhdG9yLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c05vdEJpbmFyeU9wZXJhdG9yKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IGNvZGVOb3RCaW5hcnlPcGVyYXRvciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAiTm90QmluYXJ5T3BlcmF0b3IiLAogIHRlbXBsYXRlTm90QmluYXJ5T3BlcmF0b3IsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzTm90QmluYXJ5T3BlcmF0b3IoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTm90QmluYXJ5T3BlcmF0b3IsCiAgICAgIG1lc3NhZ2U6ICIiIicke2xleGVtZX0nIGlzbid0IGEgYmluYXJ5IG9wZXJhdG9yLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3Rva2VuJzogdG9rZW59KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gdGVtcGxhdGVOb3RDb25zdGFudEV4cHJlc3Npb24gPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiI3N0cmluZyBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c05vdENvbnN0YW50RXhwcmVzc2lvbik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+IGNvZGVOb3RDb25zdGFudEV4cHJlc3Npb24gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiTm90Q29uc3RhbnRFeHByZXNzaW9uIiwgdGVtcGxhdGVOb3RDb25zdGFudEV4cHJlc3Npb24sCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PVF9DT05TVEFOVF9FWFBSRVNTSU9OIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c05vdENvbnN0YW50RXhwcmVzc2lvbihTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU5vdENvbnN0YW50RXhwcmVzc2lvbiwKICAgICAgbWVzc2FnZTogIiIiJHtzdHJpbmd9IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24uIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU9iamVjdEV4dGVuZHMgPSBtZXNzYWdlT2JqZWN0RXh0ZW5kczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VPYmplY3RFeHRlbmRzID0gY29uc3QgTWVzc2FnZUNvZGUoIk9iamVjdEV4dGVuZHMiLAogICAgbWVzc2FnZTogciIiIlRoZSBjbGFzcyAnT2JqZWN0JyBjYW4ndCBoYXZlIGEgc3VwZXJjbGFzcy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlT2JqZWN0SW1wbGVtZW50cyA9IG1lc3NhZ2VPYmplY3RJbXBsZW1lbnRzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU9iamVjdEltcGxlbWVudHMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJPYmplY3RJbXBsZW1lbnRzIiwKICAgIG1lc3NhZ2U6IHIiIiJUaGUgY2xhc3MgJ09iamVjdCcgY2FuJ3QgaW1wbGVtZW50IGFueXRoaW5nLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVPYmplY3RNaXhlc0luID0gbWVzc2FnZU9iamVjdE1peGVzSW47CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlT2JqZWN0TWl4ZXNJbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJPYmplY3RNaXhlc0luIiwKICAgIG1lc3NhZ2U6IHIiIiJUaGUgY2xhc3MgJ09iamVjdCcgY2FuJ3QgdXNlIG1peGlucy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlT25seVRyeSA9IG1lc3NhZ2VPbmx5VHJ5OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU9ubHlUcnkgPSBjb25zdCBNZXNzYWdlQ29kZSgiT25seVRyeSIsCiAgICBpbmRleDogOTIsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJBIHRyeSBibG9jayBtdXN0IGJlIGZvbGxvd2VkIGJ5IGFuICdvbicsICdjYXRjaCcsIG9yICdmaW5hbGx5JyBjbGF1c2UuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgYWRkaW5nIGVpdGhlciBhIGNhdGNoIG9yIGZpbmFsbHkgY2xhdXNlLCBvciByZW1vdmUgdGhlIHRyeSBzdGF0ZW1lbnQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlT3BlcmF0b3JNaW51c1BhcmFtZXRlck1pc21hdGNoID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiT3BlcmF0b3IgJyNuYW1lJyBzaG91bGQgaGF2ZSB6ZXJvIG9yIG9uZSBwYXJhbWV0ZXIuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIldpdGggemVybyBwYXJhbWV0ZXJzLCBpdCBoYXMgdGhlIHN5bnRhY3RpYyBmb3JtICctYScsIGZvcm1hbGx5IGtub3duIGFzICd1bmFyeS0nLiBXaXRoIG9uZSBwYXJhbWV0ZXIsIGl0IGhhcyB0aGUgc3ludGFjdGljIGZvcm0gJ2EgLSBiJywgZm9ybWFsbHkga25vd24gYXMgJy0nLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzT3BlcmF0b3JNaW51c1BhcmFtZXRlck1pc21hdGNoKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVPcGVyYXRvck1pbnVzUGFyYW1ldGVyTWlzbWF0Y2ggPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oIk9wZXJhdG9yTWludXNQYXJhbWV0ZXJNaXNtYXRjaCIsCiAgICAgICAgdGVtcGxhdGVPcGVyYXRvck1pbnVzUGFyYW1ldGVyTWlzbWF0Y2gsIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WwogICJXUk9OR19OVU1CRVJfT0ZfUEFSQU1FVEVSU19GT1JfT1BFUkFUT1JfTUlOVVMiCl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c09wZXJhdG9yTWludXNQYXJhbWV0ZXJNaXNtYXRjaChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU9wZXJhdG9yTWludXNQYXJhbWV0ZXJNaXNtYXRjaCwKICAgICAgbWVzc2FnZTogIiIiT3BlcmF0b3IgJyR7bmFtZX0nIHNob3VsZCBoYXZlIHplcm8gb3Igb25lIHBhcmFtZXRlci4iIiIsCiAgICAgIHRpcDoKICAgICAgICAgICIiIldpdGggemVybyBwYXJhbWV0ZXJzLCBpdCBoYXMgdGhlIHN5bnRhY3RpYyBmb3JtICctYScsIGZvcm1hbGx5IGtub3duIGFzICd1bmFyeS0nLiBXaXRoIG9uZSBwYXJhbWV0ZXIsIGl0IGhhcyB0aGUgc3ludGFjdGljIGZvcm0gJ2EgLSBiJywgZm9ybWFsbHkga25vd24gYXMgJy0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiT3BlcmF0b3IgJyNuYW1lJyBzaG91bGRuJ3QgaGF2ZSBhbnkgcGFyYW1ldGVycy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDAgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgIk9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gwIiwKICB0ZW1wbGF0ZU9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gwLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c09wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gwKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDAsCiAgICAgIG1lc3NhZ2U6ICIiIk9wZXJhdG9yICcke25hbWV9JyBzaG91bGRuJ3QgaGF2ZSBhbnkgcGFyYW1ldGVycy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDEgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIk9wZXJhdG9yICcjbmFtZScgc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgcGFyYW1ldGVyLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c09wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gxKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDEiLCB0ZW1wbGF0ZU9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gxLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJXUk9OR19OVU1CRVJfT0ZfUEFSQU1FVEVSU19GT1JfT1BFUkFUT1IiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDEoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMSwKICAgICAgbWVzc2FnZTogIiIiT3BlcmF0b3IgJyR7bmFtZX0nIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIHBhcmFtZXRlci4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDIgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIk9wZXJhdG9yICcjbmFtZScgc2hvdWxkIGhhdmUgZXhhY3RseSB0d28gcGFyYW1ldGVycy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIk9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gyIiwgdGVtcGxhdGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiV1JPTkdfTlVNQkVSX09GX1BBUkFNRVRFUlNfRk9SX09QRVJBVE9SIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c09wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gyKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDIsCiAgICAgIG1lc3NhZ2U6ICIiIk9wZXJhdG9yICcke25hbWV9JyBzaG91bGQgaGF2ZSBleGFjdGx5IHR3byBwYXJhbWV0ZXJzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU9wZXJhdG9yV2l0aE9wdGlvbmFsRm9ybWFscyA9CiAgICBtZXNzYWdlT3BlcmF0b3JXaXRoT3B0aW9uYWxGb3JtYWxzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU9wZXJhdG9yV2l0aE9wdGlvbmFsRm9ybWFscyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk9wZXJhdG9yV2l0aE9wdGlvbmFsRm9ybWFscyIsCiAgICBtZXNzYWdlOiByIiIiQW4gb3BlcmF0b3IgY2FuJ3QgaGF2ZSBvcHRpb25hbCBwYXJhbWV0ZXJzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVPdmVycmlkZGVuTWV0aG9kQ2F1c2UgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlRoaXMgaXMgdGhlIG92ZXJyaWRkZW4gbWV0aG9kICgnI25hbWUnKS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNPdmVycmlkZGVuTWV0aG9kQ2F1c2UpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZU92ZXJyaWRkZW5NZXRob2RDYXVzZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiT3ZlcnJpZGRlbk1ldGhvZENhdXNlIiwgdGVtcGxhdGVPdmVycmlkZGVuTWV0aG9kQ2F1c2UsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c092ZXJyaWRkZW5NZXRob2RDYXVzZShTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU92ZXJyaWRkZW5NZXRob2RDYXVzZSwKICAgICAgbWVzc2FnZTogIiIiVGhpcyBpcyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QgKCcke25hbWV9JykuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lMik+IHRlbXBsYXRlT3ZlcnJpZGVGZXdlck5hbWVkQXJndW1lbnRzID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBtZXRob2QgJyNuYW1lJyBoYXMgZmV3ZXIgbmFtZWQgYXJndW1lbnRzIHRoYW4gdGhvc2Ugb2Ygb3ZlcnJpZGRlbiBtZXRob2QgJyNuYW1lMicuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNPdmVycmlkZUZld2VyTmFtZWRBcmd1bWVudHMpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPgogICAgY29kZU92ZXJyaWRlRmV3ZXJOYW1lZEFyZ3VtZW50cyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgICAgICJPdmVycmlkZUZld2VyTmFtZWRBcmd1bWVudHMiLCB0ZW1wbGF0ZU92ZXJyaWRlRmV3ZXJOYW1lZEFyZ3VtZW50cywKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9PVkVSUklERV9OQU1FRCJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c092ZXJyaWRlRmV3ZXJOYW1lZEFyZ3VtZW50cyhTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIGlmIChuYW1lMi5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZTIgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUyKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU92ZXJyaWRlRmV3ZXJOYW1lZEFyZ3VtZW50cywKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBtZXRob2QgJyR7bmFtZX0nIGhhcyBmZXdlciBuYW1lZCBhcmd1bWVudHMgdGhhbiB0aG9zZSBvZiBvdmVycmlkZGVuIG1ldGhvZCAnJHtuYW1lMn0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAnbmFtZTInOiBuYW1lMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUyKT4gdGVtcGxhdGVPdmVycmlkZUZld2VyUG9zaXRpb25hbEFyZ3VtZW50cyA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgbWV0aG9kICcjbmFtZScgaGFzIGZld2VyIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRoYW4gdGhvc2Ugb2Ygb3ZlcnJpZGRlbiBtZXRob2QgJyNuYW1lMicuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNPdmVycmlkZUZld2VyUG9zaXRpb25hbEFyZ3VtZW50cyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+CiAgICBjb2RlT3ZlcnJpZGVGZXdlclBvc2l0aW9uYWxBcmd1bWVudHMgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPigKICAgICAgICAiT3ZlcnJpZGVGZXdlclBvc2l0aW9uYWxBcmd1bWVudHMiLAogICAgICAgIHRlbXBsYXRlT3ZlcnJpZGVGZXdlclBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfT1ZFUlJJREVfUE9TSVRJT05BTCJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c092ZXJyaWRlRmV3ZXJQb3NpdGlvbmFsQXJndW1lbnRzKAogICAgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMikgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVPdmVycmlkZUZld2VyUG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBtZXRob2QgJyR7bmFtZX0nIGhhcyBmZXdlciBwb3NpdGlvbmFsIGFyZ3VtZW50cyB0aGFuIHRob3NlIG9mIG92ZXJyaWRkZW4gbWV0aG9kICcke25hbWUyfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICduYW1lMic6IG5hbWUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBTdHJpbmcgbmFtZTIsCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUzKT4gdGVtcGxhdGVPdmVycmlkZU1pc21hdGNoTmFtZWRQYXJhbWV0ZXIgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIsIFN0cmluZyBuYW1lMyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgbWV0aG9kICcjbmFtZScgZG9lc24ndCBoYXZlIHRoZSBuYW1lZCBwYXJhbWV0ZXIgJyNuYW1lMicgb2Ygb3ZlcnJpZGRlbiBtZXRob2QgJyNuYW1lMycuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNPdmVycmlkZU1pc21hdGNoTmFtZWRQYXJhbWV0ZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIsIFN0cmluZyBuYW1lMyk+CiAgICBjb2RlT3ZlcnJpZGVNaXNtYXRjaE5hbWVkUGFyYW1ldGVyID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyLCBTdHJpbmcgbmFtZTMpPigKICAgICAgICAiT3ZlcnJpZGVNaXNtYXRjaE5hbWVkUGFyYW1ldGVyIiwKICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRlTWlzbWF0Y2hOYW1lZFBhcmFtZXRlciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9PVkVSUklERV9OQU1FRCJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c092ZXJyaWRlTWlzbWF0Y2hOYW1lZFBhcmFtZXRlcigKICAgIFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIsIFN0cmluZyBuYW1lMykgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgaWYgKG5hbWUzLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lMyA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZTMpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlT3ZlcnJpZGVNaXNtYXRjaE5hbWVkUGFyYW1ldGVyLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIG1ldGhvZCAnJHtuYW1lfScgZG9lc24ndCBoYXZlIHRoZSBuYW1lZCBwYXJhbWV0ZXIgJyR7bmFtZTJ9JyBvZiBvdmVycmlkZGVuIG1ldGhvZCAnJHtuYW1lM30nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAnbmFtZTInOiBuYW1lMiwgJ25hbWUzJzogbmFtZTN9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lMik+IHRlbXBsYXRlT3ZlcnJpZGVNb3JlUmVxdWlyZWRBcmd1bWVudHMgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIG1ldGhvZCAnI25hbWUnIGhhcyBtb3JlIHJlcXVpcmVkIGFyZ3VtZW50cyB0aGFuIHRob3NlIG9mIG92ZXJyaWRkZW4gbWV0aG9kICcjbmFtZTInLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzT3ZlcnJpZGVNb3JlUmVxdWlyZWRBcmd1bWVudHMpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPgogICAgY29kZU92ZXJyaWRlTW9yZVJlcXVpcmVkQXJndW1lbnRzID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICAgICAgIk92ZXJyaWRlTW9yZVJlcXVpcmVkQXJndW1lbnRzIiwgdGVtcGxhdGVPdmVycmlkZU1vcmVSZXF1aXJlZEFyZ3VtZW50cywKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9PVkVSUklERV9SRVFVSVJFRCJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c092ZXJyaWRlTW9yZVJlcXVpcmVkQXJndW1lbnRzKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKG5hbWUyLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lMiA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZTIpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlT3ZlcnJpZGVNb3JlUmVxdWlyZWRBcmd1bWVudHMsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgbWV0aG9kICcke25hbWV9JyBoYXMgbW9yZSByZXF1aXJlZCBhcmd1bWVudHMgdGhhbiB0aG9zZSBvZiBvdmVycmlkZGVuIG1ldGhvZCAnJHtuYW1lMn0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAnbmFtZTInOiBuYW1lMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgU3RyaW5nIG5hbWUyLAogICAgICAgIERhcnRUeXBlIF90eXBlLAogICAgICAgIERhcnRUeXBlIF90eXBlMiwKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZTMpPiB0ZW1wbGF0ZU92ZXJyaWRlVHlwZU1pc21hdGNoUGFyYW1ldGVyID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgIFN0cmluZyBuYW1lMiwKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlMiwKICAgICAgICAgICAgU3RyaW5nCiAgICAgICAgICAgICAgICBuYW1lMyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgcGFyYW1ldGVyICcjbmFtZScgb2YgdGhlIG1ldGhvZCAnI25hbWUyJyBoYXMgdHlwZSAnI3R5cGUnLCB3aGljaCBkb2VzIG5vdCBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyB0eXBlLCAnI3R5cGUyJywgaW4gdGhlIG92ZXJyaWRkZW4gbWV0aG9kLCAnI25hbWUzJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiQ2hhbmdlIHRvIGEgc3VwZXJ0eXBlIG9mICcjdHlwZTInLCBvciwgZm9yIGEgY292YXJpYW50IHBhcmFtZXRlciwgYSBzdWJ0eXBlLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzT3ZlcnJpZGVUeXBlTWlzbWF0Y2hQYXJhbWV0ZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIsIERhcnRUeXBlIF90eXBlLAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lMyk+IGNvZGVPdmVycmlkZVR5cGVNaXNtYXRjaFBhcmFtZXRlciA9CiAgICBjb25zdCBDb2RlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIsIERhcnRUeXBlIF90eXBlLAogICAgICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZTMpPigKICAgICAgICAiT3ZlcnJpZGVUeXBlTWlzbWF0Y2hQYXJhbWV0ZXIiLCB0ZW1wbGF0ZU92ZXJyaWRlVHlwZU1pc21hdGNoUGFyYW1ldGVyLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlZBTElEX01FVEhPRF9PVkVSUklERSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNPdmVycmlkZVR5cGVNaXNtYXRjaFBhcmFtZXRlcigKICAgIFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIsIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lMykgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIGlmIChuYW1lMy5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZTMgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUzKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVPdmVycmlkZVR5cGVNaXNtYXRjaFBhcmFtZXRlciwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBwYXJhbWV0ZXIgJyR7bmFtZX0nIG9mIHRoZSBtZXRob2QgJyR7bmFtZTJ9JyBoYXMgdHlwZSAnJHt0eXBlfScsIHdoaWNoIGRvZXMgbm90IG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nIHR5cGUsICcke3R5cGUyfScsIGluIHRoZSBvdmVycmlkZGVuIG1ldGhvZCwgJyR7bmFtZTN9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiQ2hhbmdlIHRvIGEgc3VwZXJ0eXBlIG9mICcke3R5cGUyfScsIG9yLCBmb3IgYSBjb3ZhcmlhbnQgcGFyYW1ldGVyLCBhIHN1YnR5cGUuIiIiLAogICAgICBhcmd1bWVudHM6IHsKICAgICAgICAnbmFtZSc6IG5hbWUsCiAgICAgICAgJ25hbWUyJzogbmFtZTIsCiAgICAgICAgJ3R5cGUnOiBfdHlwZSwKICAgICAgICAndHlwZTInOiBfdHlwZTIsCiAgICAgICAgJ25hbWUzJzogbmFtZTMKICAgICAgfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUyKT4gdGVtcGxhdGVPdmVycmlkZVR5cGVNaXNtYXRjaFJldHVyblR5cGUgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbWV0aG9kICcjbmFtZScgaXMgJyN0eXBlJywgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlIHJldHVybiB0eXBlLCAnI3R5cGUyJywgb2YgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLCAnI25hbWUyJy4iIiIsCiAgICB0aXBUZW1wbGF0ZTogciIiIkNoYW5nZSB0byBhIHN1YnR5cGUgb2YgJyN0eXBlMicuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNPdmVycmlkZVR5cGVNaXNtYXRjaFJldHVyblR5cGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUyKT4KICAgIGNvZGVPdmVycmlkZVR5cGVNaXNtYXRjaFJldHVyblR5cGUgPSBjb25zdCBDb2RlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lMik+KAogICAgICAgICJPdmVycmlkZVR5cGVNaXNtYXRjaFJldHVyblR5cGUiLAogICAgICAgIHRlbXBsYXRlT3ZlcnJpZGVUeXBlTWlzbWF0Y2hSZXR1cm5UeXBlLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlZBTElEX01FVEhPRF9PVkVSUklERSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNPdmVycmlkZVR5cGVNaXNtYXRjaFJldHVyblR5cGUoCiAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUyKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlT3ZlcnJpZGVUeXBlTWlzbWF0Y2hSZXR1cm5UeXBlLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QgJyR7bmFtZX0nIGlzICcke3R5cGV9Jywgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlIHJldHVybiB0eXBlLCAnJHt0eXBlMn0nLCBvZiB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsICcke25hbWUyfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6ICIiIkNoYW5nZSB0byBhIHN1YnR5cGUgb2YgJyR7dHlwZTJ9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogewogICAgICAgICduYW1lJzogbmFtZSwKICAgICAgICAndHlwZSc6IF90eXBlLAogICAgICAgICd0eXBlMic6IF90eXBlMiwKICAgICAgICAnbmFtZTInOiBuYW1lMgogICAgICB9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lMik+IHRlbXBsYXRlT3ZlcnJpZGVUeXBlVmFyaWFibGVzTWlzbWF0Y2ggPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiRGVjbGFyZWQgdHlwZSB2YXJpYWJsZXMgb2YgJyNuYW1lJyBkb2Vzbid0IG1hdGNoIHRob3NlIG9uIG92ZXJyaWRkZW4gbWV0aG9kICcjbmFtZTInLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzT3ZlcnJpZGVUeXBlVmFyaWFibGVzTWlzbWF0Y2gpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPgogICAgY29kZU92ZXJyaWRlVHlwZVZhcmlhYmxlc01pc21hdGNoID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICAgICAgIk92ZXJyaWRlVHlwZVZhcmlhYmxlc01pc21hdGNoIiwgdGVtcGxhdGVPdmVycmlkZVR5cGVWYXJpYWJsZXNNaXNtYXRjaCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9NRVRIT0RfT1ZFUlJJREVfVFlQRV9QQVJBTUVURVJTIl0sCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzT3ZlcnJpZGVUeXBlVmFyaWFibGVzTWlzbWF0Y2goU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMikgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVPdmVycmlkZVR5cGVWYXJpYWJsZXNNaXNtYXRjaCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkRlY2xhcmVkIHR5cGUgdmFyaWFibGVzIG9mICcke25hbWV9JyBkb2Vzbid0IG1hdGNoIHRob3NlIG9uIG92ZXJyaWRkZW4gbWV0aG9kICcke25hbWUyfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICduYW1lMic6IG5hbWUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfKT4gdGVtcGxhdGVQYWNrYWdlTm90Rm91bmQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJDb3VsZCBub3QgcmVzb2x2ZSB0aGUgcGFja2FnZSAnI25hbWUnIGluICcjdXJpJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNQYWNrYWdlTm90Rm91bmQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+IGNvZGVQYWNrYWdlTm90Rm91bmQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+KAogICJQYWNrYWdlTm90Rm91bmQiLAogIHRlbXBsYXRlUGFja2FnZU5vdEZvdW5kLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1BhY2thZ2VOb3RGb3VuZChTdHJpbmcgbmFtZSwgVXJpIHVyaV8pIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVQYWNrYWdlTm90Rm91bmQsCiAgICAgIG1lc3NhZ2U6ICIiIkNvdWxkIG5vdCByZXNvbHZlIHRoZSBwYWNrYWdlICcke25hbWV9JyBpbiAnJHt1cml9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3VyaSc6IHVyaV99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gdGVtcGxhdGVQYWNrYWdlc0ZpbGVGb3JtYXQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiUHJvYmxlbSBpbiBwYWNrYWdlcyBjb25maWd1cmF0aW9uIGZpbGU6ICNzdHJpbmciIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNQYWNrYWdlc0ZpbGVGb3JtYXQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPiBjb2RlUGFja2FnZXNGaWxlRm9ybWF0ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgIlBhY2thZ2VzRmlsZUZvcm1hdCIsCiAgdGVtcGxhdGVQYWNrYWdlc0ZpbGVGb3JtYXQsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzUGFja2FnZXNGaWxlRm9ybWF0KFN0cmluZyBzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlUGFja2FnZXNGaWxlRm9ybWF0LAogICAgICBtZXNzYWdlOiAiIiJQcm9ibGVtIGluIHBhY2thZ2VzIGNvbmZpZ3VyYXRpb24gZmlsZTogJHtzdHJpbmd9IiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVBhcnRFeHBvcnQgPSBtZXNzYWdlUGFydEV4cG9ydDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VQYXJ0RXhwb3J0ID0gY29uc3QgTWVzc2FnZUNvZGUoIlBhcnRFeHBvcnQiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVYUE9SVF9PRl9OT05fTElCUkFSWSJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiQ2FuJ3QgZXhwb3J0IHRoaXMgZmlsZSBiZWNhdXNlIGl0IGNvbnRhaW5zIGEgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVQYXJ0RXhwb3J0Q29udGV4dCA9IG1lc3NhZ2VQYXJ0RXhwb3J0Q29udGV4dDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VQYXJ0RXhwb3J0Q29udGV4dCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlBhcnRFeHBvcnRDb250ZXh0IiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LAogICAgbWVzc2FnZTogciIiIlRoaXMgaXMgdGhlIGZpbGUgdGhhdCBjYW4ndCBiZSBleHBvcnRlZC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUGFydEluUGFydCA9IG1lc3NhZ2VQYXJ0SW5QYXJ0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVBhcnRJblBhcnQgPSBjb25zdCBNZXNzYWdlQ29kZSgiUGFydEluUGFydCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9OX1BBUlRfT0ZfRElSRUNUSVZFX0lOX1BBUlQiXSwKICAgIG1lc3NhZ2U6IHIiIiJBIGZpbGUgdGhhdCdzIGEgcGFydCBvZiBhIGxpYnJhcnkgY2FuJ3QgaGF2ZSBwYXJ0cyBpdHNlbGYuIiIiLAogICAgdGlwOiByIiIiVHJ5IG1vdmluZyB0aGUgJ3BhcnQnIGRlY2xhcmF0aW9uIHRvIHRoZSBjb250YWluaW5nIGxpYnJhcnkuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVBhcnRJblBhcnRMaWJyYXJ5Q29udGV4dCA9IG1lc3NhZ2VQYXJ0SW5QYXJ0TGlicmFyeUNvbnRleHQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlUGFydEluUGFydExpYnJhcnlDb250ZXh0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiUGFydEluUGFydExpYnJhcnlDb250ZXh0IiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LAogICAgbWVzc2FnZTogciIiIlRoaXMgaXMgdGhlIGNvbnRhaW5pbmcgbGlicmFyeS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4gdGVtcGxhdGVQYXJ0T2ZJbkxpYnJhcnkgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkNhbid0IGltcG9ydCAnI3VyaScsIGJlY2F1c2UgaXQgaGFzIGEgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgcmVtb3ZpbmcgdGhlICdwYXJ0IG9mJyBkZWNsYXJhdGlvbiwgb3IgdXNpbmcgJyN1cmknIGFzIGEgcGFydC4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1BhcnRPZkluTGlicmFyeSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPiBjb2RlUGFydE9mSW5MaWJyYXJ5ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KAogICAgICAgICJQYXJ0T2ZJbkxpYnJhcnkiLCB0ZW1wbGF0ZVBhcnRPZkluTGlicmFyeSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU1QT1JUX09GX05PTl9MSUJSQVJZIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1BhcnRPZkluTGlicmFyeShVcmkgdXJpXykgewogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlUGFydE9mSW5MaWJyYXJ5LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQ2FuJ3QgaW1wb3J0ICcke3VyaX0nLCBiZWNhdXNlIGl0IGhhcyBhICdwYXJ0IG9mJyBkZWNsYXJhdGlvbi4iIiIsCiAgICAgIHRpcDoKICAgICAgICAgICIiIlRyeSByZW1vdmluZyB0aGUgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uLCBvciB1c2luZyAnJHt1cml9JyBhcyBhIHBhcnQuIiIiLAogICAgICBhcmd1bWVudHM6IHsndXJpJzogdXJpX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgVXJpIHVyaV8sCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUyKT4gdGVtcGxhdGVQYXJ0T2ZMaWJyYXJ5TmFtZU1pc21hdGNoID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXywgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJVc2luZyAnI3VyaScgYXMgcGFydCBvZiAnI25hbWUnIGJ1dCBpdHMgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uIHNheXMgJyNuYW1lMicuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNQYXJ0T2ZMaWJyYXJ5TmFtZU1pc21hdGNoKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXywgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+CiAgICBjb2RlUGFydE9mTGlicmFyeU5hbWVNaXNtYXRjaCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8sIFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPigKICAgICAgICAiUGFydE9mTGlicmFyeU5hbWVNaXNtYXRjaCIsIHRlbXBsYXRlUGFydE9mTGlicmFyeU5hbWVNaXNtYXRjaCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUEFSVF9PRl9ESUZGRVJFTlRfTElCUkFSWSJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1BhcnRPZkxpYnJhcnlOYW1lTWlzbWF0Y2goCiAgICBVcmkgdXJpXywgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMikgewogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVQYXJ0T2ZMaWJyYXJ5TmFtZU1pc21hdGNoLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVXNpbmcgJyR7dXJpfScgYXMgcGFydCBvZiAnJHtuYW1lfScgYnV0IGl0cyAncGFydCBvZicgZGVjbGFyYXRpb24gc2F5cyAnJHtuYW1lMn0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3VyaSc6IHVyaV8sICduYW1lJzogbmFtZSwgJ25hbWUyJzogbmFtZTJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUGFydE9mU2VsZiA9IG1lc3NhZ2VQYXJ0T2ZTZWxmOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVBhcnRPZlNlbGYgPSBjb25zdCBNZXNzYWdlQ29kZSgiUGFydE9mU2VsZiIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUEFSVF9PRl9OT05fUEFSVCJdLAogICAgbWVzc2FnZTogciIiIkEgZmlsZSBjYW4ndCBiZSBhIHBhcnQgb2YgaXRzZWxmLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVQYXJ0T2ZUd2ljZSA9IG1lc3NhZ2VQYXJ0T2ZUd2ljZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VQYXJ0T2ZUd2ljZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJQYXJ0T2ZUd2ljZSIsCiAgICBpbmRleDogMjUsCiAgICBtZXNzYWdlOiByIiIiT25seSBvbmUgcGFydC1vZiBkaXJlY3RpdmUgbWF5IGJlIGRlY2xhcmVkIGluIGEgZmlsZS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgYWxsIGJ1dCBvbmUgb2YgdGhlIHBhcnQtb2YgZGlyZWN0aXZlcy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUGFydE9mVHdvTGlicmFyaWVzID0gbWVzc2FnZVBhcnRPZlR3b0xpYnJhcmllczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VQYXJ0T2ZUd29MaWJyYXJpZXMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJQYXJ0T2ZUd29MaWJyYXJpZXMiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlBBUlRfT0ZfRElGRkVSRU5UX0xJQlJBUlkiXSwKICAgIG1lc3NhZ2U6IHIiIiJBIGZpbGUgY2FuJ3QgYmUgcGFydCBvZiBtb3JlIHRoYW4gb25lIGxpYnJhcnkuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgbW92aW5nIHRoZSBzaGFyZWQgZGVjbGFyYXRpb25zIGludG8gdGhlIGxpYnJhcmllcywgb3IgaW50byBhIG5ldyBsaWJyYXJ5LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVQYXJ0T2ZUd29MaWJyYXJpZXNDb250ZXh0ID0KICAgIG1lc3NhZ2VQYXJ0T2ZUd29MaWJyYXJpZXNDb250ZXh0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVBhcnRPZlR3b0xpYnJhcmllc0NvbnRleHQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJQYXJ0T2ZUd29MaWJyYXJpZXNDb250ZXh0IiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LAogICAgbWVzc2FnZTogciIiIlVzZWQgYXMgYSBwYXJ0IGluIHRoaXMgbGlicmFyeS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFVyaSB1cmlfLAogICAgICAgIFVyaSB1cmkyXywKICAgICAgICBVcmkKICAgICAgICAgICAgdXJpM18pPiB0ZW1wbGF0ZVBhcnRPZlVyaU1pc21hdGNoID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXywgVXJpIHVyaTJfLCBVcmkgdXJpM18pPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVXNpbmcgJyN1cmknIGFzIHBhcnQgb2YgJyN1cmkyJyBidXQgaXRzICdwYXJ0IG9mJyBkZWNsYXJhdGlvbiBzYXlzICcjdXJpMycuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNQYXJ0T2ZVcmlNaXNtYXRjaCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8sIFVyaSB1cmkyXywgVXJpIHVyaTNfKT4KICAgIGNvZGVQYXJ0T2ZVcmlNaXNtYXRjaCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8sIFVyaSB1cmkyXywgVXJpIHVyaTNfKT4oCiAgICAgICAgIlBhcnRPZlVyaU1pc21hdGNoIiwgdGVtcGxhdGVQYXJ0T2ZVcmlNaXNtYXRjaCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUEFSVF9PRl9ESUZGRVJFTlRfTElCUkFSWSJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1BhcnRPZlVyaU1pc21hdGNoKFVyaSB1cmlfLCBVcmkgdXJpMl8sIFVyaSB1cmkzXykgewogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIFN0cmluZyB1cmkyID0gcmVsYXRpdml6ZVVyaSh1cmkyXyk7CiAgU3RyaW5nIHVyaTMgPSByZWxhdGl2aXplVXJpKHVyaTNfKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVBhcnRPZlVyaU1pc21hdGNoLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVXNpbmcgJyR7dXJpfScgYXMgcGFydCBvZiAnJHt1cmkyfScgYnV0IGl0cyAncGFydCBvZicgZGVjbGFyYXRpb24gc2F5cyAnJHt1cmkzfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsndXJpJzogdXJpXywgJ3VyaTInOiB1cmkyXywgJ3VyaTMnOiB1cmkzX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgVXJpIHVyaV8sCiAgICAgICAgVXJpIHVyaTJfLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lKT4gdGVtcGxhdGVQYXJ0T2ZVc2VVcmkgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfLCBVcmkgdXJpMl8sIFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlVzaW5nICcjdXJpJyBhcyBwYXJ0IG9mICcjdXJpMicgYnV0IGl0cyAncGFydCBvZicgZGVjbGFyYXRpb24gc2F5cyAnI25hbWUnLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgY2hhbmdpbmcgdGhlICdwYXJ0IG9mJyBkZWNsYXJhdGlvbiB0byB1c2UgYSByZWxhdGl2ZSBmaWxlIG5hbWUuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNQYXJ0T2ZVc2VVcmkpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfLCBVcmkgdXJpMl8sIFN0cmluZyBuYW1lKT4KICAgIGNvZGVQYXJ0T2ZVc2VVcmkgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfLCBVcmkgdXJpMl8sIFN0cmluZyBuYW1lKT4oCiAgICAgICAgIlBhcnRPZlVzZVVyaSIsIHRlbXBsYXRlUGFydE9mVXNlVXJpLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJQQVJUX09GX1VOTkFNRURfTElCUkFSWSJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1BhcnRPZlVzZVVyaShVcmkgdXJpXywgVXJpIHVyaTJfLCBTdHJpbmcgbmFtZSkgewogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIFN0cmluZyB1cmkyID0gcmVsYXRpdml6ZVVyaSh1cmkyXyk7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlUGFydE9mVXNlVXJpLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVXNpbmcgJyR7dXJpfScgYXMgcGFydCBvZiAnJHt1cmkyfScgYnV0IGl0cyAncGFydCBvZicgZGVjbGFyYXRpb24gc2F5cyAnJHtuYW1lfScuIiIiLAogICAgICB0aXA6ICIiIlRyeSBjaGFuZ2luZyB0aGUgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uIHRvIHVzZSBhIHJlbGF0aXZlIGZpbGUgbmFtZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd1cmknOiB1cmlfLCAndXJpMic6IHVyaTJfLCAnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUGFydE9ycGhhbiA9IG1lc3NhZ2VQYXJ0T3JwaGFuOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVBhcnRPcnBoYW4gPSBjb25zdCBNZXNzYWdlQ29kZSgiUGFydE9ycGhhbiIsCiAgICBtZXNzYWdlOiByIiIiVGhpcyBwYXJ0IGRvZXNuJ3QgaGF2ZSBhIGNvbnRhaW5pbmcgbGlicmFyeS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlICdwYXJ0IG9mJyBkZWNsYXJhdGlvbi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+IHRlbXBsYXRlUGFydFR3aWNlID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDYW4ndCB1c2UgJyN1cmknIGFzIGEgcGFydCBtb3JlIHRoYW4gb25jZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNQYXJ0VHdpY2UpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4gY29kZVBhcnRUd2ljZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPigiUGFydFR3aWNlIiwgdGVtcGxhdGVQYXJ0VHdpY2UsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkRVUExJQ0FURV9QQVJUIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1BhcnRUd2ljZShVcmkgdXJpXykgewogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlUGFydFR3aWNlLAogICAgICBtZXNzYWdlOiAiIiJDYW4ndCB1c2UgJyR7dXJpfScgYXMgYSBwYXJ0IG1vcmUgdGhhbiBvbmNlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3VyaSc6IHVyaV99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUGF0Y2hDbGFzc09yaWdpbiA9IG1lc3NhZ2VQYXRjaENsYXNzT3JpZ2luOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVBhdGNoQ2xhc3NPcmlnaW4gPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJQYXRjaENsYXNzT3JpZ2luIiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LAogICAgbWVzc2FnZTogciIiIlRoaXMgaXMgdGhlIG9yaWdpbiBjbGFzcy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUGF0Y2hDbGFzc1R5cGVWYXJpYWJsZXNNaXNtYXRjaCA9CiAgICBtZXNzYWdlUGF0Y2hDbGFzc1R5cGVWYXJpYWJsZXNNaXNtYXRjaDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VQYXRjaENsYXNzVHlwZVZhcmlhYmxlc01pc21hdGNoID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiUGF0Y2hDbGFzc1R5cGVWYXJpYWJsZXNNaXNtYXRjaCIsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJBIHBhdGNoIGNsYXNzIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgdHlwZSB2YXJpYWJsZXMgYXMgaXRzIG9yaWdpbiBjbGFzcy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUGF0Y2hEZWNsYXJhdGlvbk1pc21hdGNoID0gbWVzc2FnZVBhdGNoRGVjbGFyYXRpb25NaXNtYXRjaDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VQYXRjaERlY2xhcmF0aW9uTWlzbWF0Y2ggPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJQYXRjaERlY2xhcmF0aW9uTWlzbWF0Y2giLAogICAgbWVzc2FnZTogciIiIlRoaXMgcGF0Y2ggZG9lc24ndCBtYXRjaCBvcmlnaW4gZGVjbGFyYXRpb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVBhdGNoRGVjbGFyYXRpb25PcmlnaW4gPSBtZXNzYWdlUGF0Y2hEZWNsYXJhdGlvbk9yaWdpbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VQYXRjaERlY2xhcmF0aW9uT3JpZ2luID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiUGF0Y2hEZWNsYXJhdGlvbk9yaWdpbiIsCiAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCwKICAgIG1lc3NhZ2U6IHIiIiJUaGlzIGlzIHRoZSBvcmlnaW4gZGVjbGFyYXRpb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfKT4KICAgIHRlbXBsYXRlUGF0Y2hJbmplY3Rpb25GYWlsZWQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDYW4ndCBpbmplY3QgJyNuYW1lJyBpbnRvICcjdXJpJy4iIiIsCiAgICAgICAgdGlwVGVtcGxhdGU6IHIiIiJUcnkgYWRkaW5nICdAcGF0Y2gnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1BhdGNoSW5qZWN0aW9uRmFpbGVkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPiBjb2RlUGF0Y2hJbmplY3Rpb25GYWlsZWQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+KAogICJQYXRjaEluamVjdGlvbkZhaWxlZCIsCiAgdGVtcGxhdGVQYXRjaEluamVjdGlvbkZhaWxlZCwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNQYXRjaEluamVjdGlvbkZhaWxlZChTdHJpbmcgbmFtZSwgVXJpIHVyaV8pIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVQYXRjaEluamVjdGlvbkZhaWxlZCwKICAgICAgbWVzc2FnZTogIiIiQ2FuJ3QgaW5qZWN0ICcke25hbWV9JyBpbnRvICcke3VyaX0nLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgYWRkaW5nICdAcGF0Y2gnLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAndXJpJzogdXJpX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVQYXRjaE5vbkV4dGVybmFsID0gbWVzc2FnZVBhdGNoTm9uRXh0ZXJuYWw7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlUGF0Y2hOb25FeHRlcm5hbCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlBhdGNoTm9uRXh0ZXJuYWwiLAogICAgbWVzc2FnZToKICAgICAgICByIiIiQ2FuJ3QgYXBwbHkgdGhpcyBwYXRjaCBhcyBpdHMgb3JpZ2luIGRlY2xhcmF0aW9uIGlzbid0IGV4dGVybmFsLiIiIiwKICAgIHRpcDogciIiIlRyeSBhZGRpbmcgJ2V4dGVybmFsJyB0byB0aGUgb3JpZ2luIGRlY2xhcmF0aW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVQbGF0Zm9ybVByaXZhdGVMaWJyYXJ5QWNjZXNzID0KICAgIG1lc3NhZ2VQbGF0Zm9ybVByaXZhdGVMaWJyYXJ5QWNjZXNzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVBsYXRmb3JtUHJpdmF0ZUxpYnJhcnlBY2Nlc3MgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJQbGF0Zm9ybVByaXZhdGVMaWJyYXJ5QWNjZXNzIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTVBPUlRfSU5URVJOQUxfTElCUkFSWSJdLAogICAgbWVzc2FnZTogciIiIkNhbid0IGFjY2VzcyBwbGF0Zm9ybSBwcml2YXRlIGxpYnJhcnkuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVBvc2l0aW9uYWxBZnRlck5hbWVkQXJndW1lbnQgPQogICAgbWVzc2FnZVBvc2l0aW9uYWxBZnRlck5hbWVkQXJndW1lbnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlUG9zaXRpb25hbEFmdGVyTmFtZWRBcmd1bWVudCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlBvc2l0aW9uYWxBZnRlck5hbWVkQXJndW1lbnQiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlBPU0lUSU9OQUxfQUZURVJfTkFNRURfQVJHVU1FTlQiXSwKICAgIG1lc3NhZ2U6IHIiIiJQbGFjZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBiZWZvcmUgbmFtZWQgYXJndW1lbnRzLiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiVHJ5IG1vdmluZyB0aGUgcG9zaXRpb25hbCBhcmd1bWVudCBiZWZvcmUgdGhlIG5hbWVkIGFyZ3VtZW50cywgb3IgYWRkIGEgbmFtZSB0byB0aGUgYXJndW1lbnQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVBvc2l0aW9uYWxQYXJhbWV0ZXJXaXRoRXF1YWxzID0KICAgIG1lc3NhZ2VQb3NpdGlvbmFsUGFyYW1ldGVyV2l0aEVxdWFsczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VQb3NpdGlvbmFsUGFyYW1ldGVyV2l0aEVxdWFscyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlBvc2l0aW9uYWxQYXJhbWV0ZXJXaXRoRXF1YWxzIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJXUk9OR19TRVBBUkFUT1JfRk9SX1BPU0lUSU9OQUxfUEFSQU1FVEVSIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJQb3NpdGlvbmFsIG9wdGlvbmFsIHBhcmFtZXRlcnMgY2FuJ3QgdXNlICc6JyB0byBzcGVjaWZ5IGEgZGVmYXVsdCB2YWx1ZS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVwbGFjaW5nICc6JyB3aXRoICc9Jy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUHJlZml4QWZ0ZXJDb21iaW5hdG9yID0gbWVzc2FnZVByZWZpeEFmdGVyQ29tYmluYXRvcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VQcmVmaXhBZnRlckNvbWJpbmF0b3IgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJQcmVmaXhBZnRlckNvbWJpbmF0b3IiLAogICAgaW5kZXg6IDYsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJUaGUgcHJlZml4ICgnYXMnIGNsYXVzZSkgc2hvdWxkIGNvbWUgYmVmb3JlIGFueSBzaG93L2hpZGUgY29tYmluYXRvcnMuIiIiLAogICAgdGlwOiByIiIiVHJ5IG1vdmluZyB0aGUgcHJlZml4IGJlZm9yZSB0aGUgY29tYmluYXRvcnMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVByaXZhdGVOYW1lZFBhcmFtZXRlciA9IG1lc3NhZ2VQcml2YXRlTmFtZWRQYXJhbWV0ZXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlUHJpdmF0ZU5hbWVkUGFyYW1ldGVyID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiUHJpdmF0ZU5hbWVkUGFyYW1ldGVyIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJQUklWQVRFX09QVElPTkFMX1BBUkFNRVRFUiJdLAogICAgbWVzc2FnZTogciIiIkFuIG9wdGlvbmFsIG5hbWVkIHBhcmFtZXRlciBjYW4ndCBzdGFydCB3aXRoICdfJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUmVkaXJlY3RpbmdDb25zdHJ1Y3RvcldpdGhCb2R5ID0KICAgIG1lc3NhZ2VSZWRpcmVjdGluZ0NvbnN0cnVjdG9yV2l0aEJvZHk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlUmVkaXJlY3RpbmdDb25zdHJ1Y3RvcldpdGhCb2R5ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiUmVkaXJlY3RpbmdDb25zdHJ1Y3RvcldpdGhCb2R5IiwKICAgIGluZGV4OiAyMiwKICAgIG1lc3NhZ2U6IHIiIiJSZWRpcmVjdGluZyBjb25zdHJ1Y3RvcnMgY2FuJ3QgaGF2ZSBhIGJvZHkuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGJvZHksIG9yIG5vdCBtYWtpbmcgdGhpcyBhIHJlZGlyZWN0aW5nIGNvbnN0cnVjdG9yLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgdGVtcGxhdGVSZWRpcmVjdGluZ0ZhY3RvcnlJbmNvbXBhdGlibGVUeXBlQXJndW1lbnQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiVGhlIHR5cGUgJyN0eXBlJyBkb2Vzbid0IGV4dGVuZCAnI3R5cGUyJy4iIiIsCiAgICAgICAgdGlwVGVtcGxhdGU6IHIiIiJUcnkgdXNpbmcgYSBkaWZmZXJlbnQgdHlwZSBhcyBhcmd1bWVudC4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czoKICAgICAgICAgICAgX3dpdGhBcmd1bWVudHNSZWRpcmVjdGluZ0ZhY3RvcnlJbmNvbXBhdGlibGVUeXBlQXJndW1lbnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZVJlZGlyZWN0aW5nRmFjdG9yeUluY29tcGF0aWJsZVR5cGVBcmd1bWVudCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgICAgICJSZWRpcmVjdGluZ0ZhY3RvcnlJbmNvbXBhdGlibGVUeXBlQXJndW1lbnQiLAogICAgICAgIHRlbXBsYXRlUmVkaXJlY3RpbmdGYWN0b3J5SW5jb21wYXRpYmxlVHlwZUFyZ3VtZW50LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJUWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFMiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzUmVkaXJlY3RpbmdGYWN0b3J5SW5jb21wYXRpYmxlVHlwZUFyZ3VtZW50KAogICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMikgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVSZWRpcmVjdGluZ0ZhY3RvcnlJbmNvbXBhdGlibGVUeXBlQXJndW1lbnQsCiAgICAgIG1lc3NhZ2U6ICIiIlRoZSB0eXBlICcke3R5cGV9JyBkb2Vzbid0IGV4dGVuZCAnJHt0eXBlMn0nLiIiIiArCiAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6ICIiIlRyeSB1c2luZyBhIGRpZmZlcmVudCB0eXBlIGFzIGFyZ3VtZW50LiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVJlZGlyZWN0aW9uSW5Ob25GYWN0b3J5ID0gbWVzc2FnZVJlZGlyZWN0aW9uSW5Ob25GYWN0b3J5OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVJlZGlyZWN0aW9uSW5Ob25GYWN0b3J5ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiUmVkaXJlY3Rpb25Jbk5vbkZhY3RvcnkiLAogICAgaW5kZXg6IDIxLAogICAgbWVzc2FnZTogciIiIk9ubHkgZmFjdG9yeSBjb25zdHJ1Y3RvciBjYW4gc3BlY2lmeSAnPScgcmVkaXJlY3Rpb24uIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgbWFraW5nIHRoaXMgYSBmYWN0b3J5IGNvbnN0cnVjdG9yLCBvciByZW1vdmUgdGhlIHJlZGlyZWN0aW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlUmVkaXJlY3Rpb25UYXJnZXROb3RGb3VuZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiUmVkaXJlY3Rpb24gY29uc3RydWN0b3IgdGFyZ2V0IG5vdCBmb3VuZDogJyNuYW1lJyIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1JlZGlyZWN0aW9uVGFyZ2V0Tm90Rm91bmQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZVJlZGlyZWN0aW9uVGFyZ2V0Tm90Rm91bmQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIlJlZGlyZWN0aW9uVGFyZ2V0Tm90Rm91bmQiLCB0ZW1wbGF0ZVJlZGlyZWN0aW9uVGFyZ2V0Tm90Rm91bmQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlJFRElSRUNUX1RPX01JU1NJTkdfQ09OU1RSVUNUT1IiXSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNSZWRpcmVjdGlvblRhcmdldE5vdEZvdW5kKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlUmVkaXJlY3Rpb25UYXJnZXROb3RGb3VuZCwKICAgICAgbWVzc2FnZTogIiIiUmVkaXJlY3Rpb24gY29uc3RydWN0b3IgdGFyZ2V0IG5vdCBmb3VuZDogJyR7bmFtZX0nIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUmVxdWlyZWRQYXJhbWV0ZXJXaXRoRGVmYXVsdCA9CiAgICBtZXNzYWdlUmVxdWlyZWRQYXJhbWV0ZXJXaXRoRGVmYXVsdDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VSZXF1aXJlZFBhcmFtZXRlcldpdGhEZWZhdWx0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiUmVxdWlyZWRQYXJhbWV0ZXJXaXRoRGVmYXVsdCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTkFNRURfUEFSQU1FVEVSX09VVFNJREVfR1JPVVAiXSwKICAgIG1lc3NhZ2U6IHIiIiJOb24tb3B0aW9uYWwgcGFyYW1ldGVycyBjYW4ndCBoYXZlIGEgZGVmYXVsdCB2YWx1ZS4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIlRyeSByZW1vdmluZyB0aGUgZGVmYXVsdCB2YWx1ZSBvciBtYWtpbmcgdGhlIHBhcmFtZXRlciBvcHRpb25hbC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUmV0aHJvd05vdENhdGNoID0gbWVzc2FnZVJldGhyb3dOb3RDYXRjaDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VSZXRocm93Tm90Q2F0Y2ggPSBjb25zdCBNZXNzYWdlQ29kZSgiUmV0aHJvd05vdENhdGNoIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJSRVRIUk9XX09VVFNJREVfQ0FUQ0giXSwKICAgIG1lc3NhZ2U6IHIiIiIncmV0aHJvdycgY2FuIG9ubHkgYmUgdXNlZCBpbiBjYXRjaCBjbGF1c2VzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVSZXR1cm5Gcm9tVm9pZEZ1bmN0aW9uID0gbWVzc2FnZVJldHVybkZyb21Wb2lkRnVuY3Rpb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlUmV0dXJuRnJvbVZvaWRGdW5jdGlvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlJldHVybkZyb21Wb2lkRnVuY3Rpb24iLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlJFVFVSTl9PRl9JTlZBTElEX1RZUEUiXSwKICAgIG1lc3NhZ2U6IHIiIiJDYW4ndCByZXR1cm4gYSB2YWx1ZSBmcm9tIGEgdm9pZCBmdW5jdGlvbi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUmV0dXJuVHlwZUZ1bmN0aW9uRXhwcmVzc2lvbiA9CiAgICBtZXNzYWdlUmV0dXJuVHlwZUZ1bmN0aW9uRXhwcmVzc2lvbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VSZXR1cm5UeXBlRnVuY3Rpb25FeHByZXNzaW9uID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiUmV0dXJuVHlwZUZ1bmN0aW9uRXhwcmVzc2lvbiIsCiAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nLAogICAgbWVzc2FnZTogciIiIkEgZnVuY3Rpb24gZXhwcmVzc2lvbiBjYW4ndCBoYXZlIGEgcmV0dXJuIHR5cGUuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVJldHVybldpdGhvdXRFeHByZXNzaW9uID0gbWVzc2FnZVJldHVybldpdGhvdXRFeHByZXNzaW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVJldHVybldpdGhvdXRFeHByZXNzaW9uID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiUmV0dXJuV2l0aG91dEV4cHJlc3Npb24iLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlJFVFVSTl9XSVRIT1VUX1ZBTFVFIl0sCiAgICBzZXZlcml0eTogU2V2ZXJpdHkud2FybmluZywKICAgIG1lc3NhZ2U6IHIiIiJNdXN0IGV4cGxpY2l0bHkgcmV0dXJuIGEgdmFsdWUgZnJvbSBhIG5vbi12b2lkIGZ1bmN0aW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4gdGVtcGxhdGVTZGtSb290Tm90Rm91bmQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlNESyByb290IGRpcmVjdG9yeSBub3QgZm91bmQ6ICN1cmkuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzU2RrUm9vdE5vdEZvdW5kKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+IGNvZGVTZGtSb290Tm90Rm91bmQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4oCiAgIlNka1Jvb3ROb3RGb3VuZCIsCiAgdGVtcGxhdGVTZGtSb290Tm90Rm91bmQsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU2RrUm9vdE5vdEZvdW5kKFVyaSB1cmlfKSB7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTZGtSb290Tm90Rm91bmQsCiAgICAgIG1lc3NhZ2U6ICIiIlNESyByb290IGRpcmVjdG9yeSBub3QgZm91bmQ6ICR7dXJpfS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd1cmknOiB1cmlffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBVcmkKICAgICAgICAgICAgdXJpXyk+IHRlbXBsYXRlU2RrU3BlY2lmaWNhdGlvbk5vdEZvdW5kID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiU0RLIGxpYnJhcmllcyBzcGVjaWZpY2F0aW9uIG5vdCBmb3VuZDogI3VyaS4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiTm9ybWFsbHksIHRoZSBzcGVjaWZpY2F0aW9uIGlzIGEgZmlsZSBuYW1lZCAnbGlicmFyaWVzLmpzb24nIGluIHRoZSBEYXJ0IFNESyBpbnN0YWxsIGxvY2F0aW9uLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzU2RrU3BlY2lmaWNhdGlvbk5vdEZvdW5kKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+IGNvZGVTZGtTcGVjaWZpY2F0aW9uTm90Rm91bmQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4oCiAgIlNka1NwZWNpZmljYXRpb25Ob3RGb3VuZCIsCiAgdGVtcGxhdGVTZGtTcGVjaWZpY2F0aW9uTm90Rm91bmQsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU2RrU3BlY2lmaWNhdGlvbk5vdEZvdW5kKFVyaSB1cmlfKSB7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTZGtTcGVjaWZpY2F0aW9uTm90Rm91bmQsCiAgICAgIG1lc3NhZ2U6ICIiIlNESyBsaWJyYXJpZXMgc3BlY2lmaWNhdGlvbiBub3QgZm91bmQ6ICR7dXJpfS4iIiIsCiAgICAgIHRpcDoKICAgICAgICAgICIiIk5vcm1hbGx5LCB0aGUgc3BlY2lmaWNhdGlvbiBpcyBhIGZpbGUgbmFtZWQgJ2xpYnJhcmllcy5qc29uJyBpbiB0aGUgRGFydCBTREsgaW5zdGFsbCBsb2NhdGlvbi4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd1cmknOiB1cmlffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPiB0ZW1wbGF0ZVNka1N1bW1hcnlOb3RGb3VuZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiU0RLIHN1bW1hcnkgbm90IGZvdW5kOiAjdXJpLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1Nka1N1bW1hcnlOb3RGb3VuZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPiBjb2RlU2RrU3VtbWFyeU5vdEZvdW5kID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KAogICJTZGtTdW1tYXJ5Tm90Rm91bmQiLAogIHRlbXBsYXRlU2RrU3VtbWFyeU5vdEZvdW5kLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1Nka1N1bW1hcnlOb3RGb3VuZChVcmkgdXJpXykgewogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlU2RrU3VtbWFyeU5vdEZvdW5kLAogICAgICBtZXNzYWdlOiAiIiJTREsgc3VtbWFyeSBub3QgZm91bmQ6ICR7dXJpfS4iIiIsIGFyZ3VtZW50czogeyd1cmknOiB1cmlffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVNldExpdGVyYWxUb29NYW55VHlwZUFyZ3VtZW50cyA9CiAgICBtZXNzYWdlU2V0TGl0ZXJhbFRvb01hbnlUeXBlQXJndW1lbnRzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVNldExpdGVyYWxUb29NYW55VHlwZUFyZ3VtZW50cyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlNldExpdGVyYWxUb29NYW55VHlwZUFyZ3VtZW50cyIsCiAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nLAogICAgbWVzc2FnZTogciIiIkEgc2V0IGxpdGVyYWwgcmVxdWlyZXMgZXhhY3RseSBvbmUgdHlwZSBhcmd1bWVudC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlU2V0TGl0ZXJhbHNOb3RTdXBwb3J0ZWQgPSBtZXNzYWdlU2V0TGl0ZXJhbHNOb3RTdXBwb3J0ZWQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU2V0TGl0ZXJhbHNOb3RTdXBwb3J0ZWQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJTZXRMaXRlcmFsc05vdFN1cHBvcnRlZCIsCiAgICBtZXNzYWdlOiByIiIiU2V0IGxpdGVyYWxzIGFyZSBub3Qgc3VwcG9ydGVkIHlldC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlU2V0T3JNYXBMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHMgPQogICAgbWVzc2FnZVNldE9yTWFwTGl0ZXJhbFRvb01hbnlUeXBlQXJndW1lbnRzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVNldE9yTWFwTGl0ZXJhbFRvb01hbnlUeXBlQXJndW1lbnRzID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiU2V0T3JNYXBMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHMiLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZywKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkEgc2V0IG9yIG1hcCBsaXRlcmFsIHJlcXVpcmVzIGV4YWN0bHkgb25lIG9yIHR3byB0eXBlIGFyZ3VtZW50cywgcmVzcGVjdGl2ZWx5LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVTZXR0ZXJOb3RGb3VuZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiU2V0dGVyIG5vdCBmb3VuZDogJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNTZXR0ZXJOb3RGb3VuZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlU2V0dGVyTm90Rm91bmQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIlNldHRlck5vdEZvdW5kIiwgdGVtcGxhdGVTZXR0ZXJOb3RGb3VuZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5ERUZJTkVEX1NFVFRFUiJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1NldHRlck5vdEZvdW5kKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlU2V0dGVyTm90Rm91bmQsCiAgICAgIG1lc3NhZ2U6ICIiIlNldHRlciBub3QgZm91bmQ6ICcke25hbWV9Jy4iIiIsIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTZXR0ZXJOb3RTeW5jID0gbWVzc2FnZVNldHRlck5vdFN5bmM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU2V0dGVyTm90U3luYyA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJTZXR0ZXJOb3RTeW5jIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlZBTElEX01PRElGSUVSX09OX1NFVFRFUiJdLAogICAgbWVzc2FnZTogciIiIlNldHRlcnMgY2FuJ3QgdXNlICdhc3luYycsICdhc3luYyonLCBvciAnc3luYyonLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTZXR0ZXJXaXRoV3JvbmdOdW1iZXJPZkZvcm1hbHMgPQogICAgbWVzc2FnZVNldHRlcldpdGhXcm9uZ051bWJlck9mRm9ybWFsczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VTZXR0ZXJXaXRoV3JvbmdOdW1iZXJPZkZvcm1hbHMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJTZXR0ZXJXaXRoV3JvbmdOdW1iZXJPZkZvcm1hbHMiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIldST05HX05VTUJFUl9PRl9QQVJBTUVURVJTX0ZPUl9TRVRURVIiXSwKICAgIG1lc3NhZ2U6IHIiIiJBIHNldHRlciBzaG91bGQgaGF2ZSBleGFjdGx5IG9uZSBmb3JtYWwgcGFyYW1ldGVyLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgaW50IGNvdW50LAogICAgICAgIGludCBjb3VudDIsCiAgICAgICAgbnVtIF9udW0xLAogICAgICAgIG51bSBfbnVtMiwKICAgICAgICBudW0KICAgICAgICAgICAgX251bTMpPiB0ZW1wbGF0ZVNvdXJjZUJvZHlTdW1tYXJ5ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgY291bnQyLCBudW0gX251bTEsIG51bSBfbnVtMiwgbnVtIF9udW0zKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkJ1aWx0IGJvZGllcyBmb3IgI2NvdW50IGNvbXBpbGF0aW9uIHVuaXRzICgjY291bnQyIGJ5dGVzKSBpbiAjbnVtMSUuM21zLCB0aGF0IGlzLAojbnVtMiUxMi4zIGJ5dGVzL21zLCBhbmQKI251bTMlMTIuMyBtcy9jb21waWxhdGlvbiB1bml0LiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzU291cmNlQm9keVN1bW1hcnkpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oaW50IGNvdW50LCBpbnQgY291bnQyLCBudW0gX251bTEsIG51bSBfbnVtMiwKICAgICAgICBudW0gX251bTMpPiBjb2RlU291cmNlQm9keVN1bW1hcnkgPSBjb25zdCBDb2RlPAogICAgTWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQsIGludCBjb3VudDIsIG51bSBfbnVtMSwgbnVtIF9udW0yLCBudW0gX251bTMpPigKICAiU291cmNlQm9keVN1bW1hcnkiLAogIHRlbXBsYXRlU291cmNlQm9keVN1bW1hcnksCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU291cmNlQm9keVN1bW1hcnkoCiAgICBpbnQgY291bnQsIGludCBjb3VudDIsIG51bSBfbnVtMSwgbnVtIF9udW0yLCBudW0gX251bTMpIHsKICBpZiAoY291bnQgPT0gbnVsbCkgdGhyb3cgJ05vIGNvdW50IHByb3ZpZGVkJzsKICBpZiAoY291bnQyID09IG51bGwpIHRocm93ICdObyBjb3VudCBwcm92aWRlZCc7CiAgaWYgKF9udW0xID09IG51bGwpIHRocm93ICdObyBudW1iZXIgcHJvdmlkZWQnOwogIFN0cmluZyBudW0xID0gX251bTEudG9TdHJpbmdBc0ZpeGVkKDMpOwogIGlmIChfbnVtMiA9PSBudWxsKSB0aHJvdyAnTm8gbnVtYmVyIHByb3ZpZGVkJzsKICBTdHJpbmcgbnVtMiA9IF9udW0yLnRvU3RyaW5nQXNGaXhlZCgzKS5wYWRMZWZ0KDEyKTsKICBpZiAoX251bTMgPT0gbnVsbCkgdGhyb3cgJ05vIG51bWJlciBwcm92aWRlZCc7CiAgU3RyaW5nIG51bTMgPSBfbnVtMy50b1N0cmluZ0FzRml4ZWQoMykucGFkTGVmdCgxMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTb3VyY2VCb2R5U3VtbWFyeSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkJ1aWx0IGJvZGllcyBmb3IgJHtjb3VudH0gY29tcGlsYXRpb24gdW5pdHMgKCR7Y291bnQyfSBieXRlcykgaW4gJHtudW0xfW1zLCB0aGF0IGlzLAoke251bTJ9IGJ5dGVzL21zLCBhbmQKJHtudW0zfSBtcy9jb21waWxhdGlvbiB1bml0LiIiIiwKICAgICAgYXJndW1lbnRzOiB7CiAgICAgICAgJ2NvdW50JzogY291bnQsCiAgICAgICAgJ2NvdW50Mic6IGNvdW50MiwKICAgICAgICAnbnVtMSc6IF9udW0xLAogICAgICAgICdudW0yJzogX251bTIsCiAgICAgICAgJ251bTMnOiBfbnVtMwogICAgICB9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIGludCBjb3VudCwKICAgICAgICBpbnQgY291bnQyLAogICAgICAgIG51bSBfbnVtMSwKICAgICAgICBudW0gX251bTIsCiAgICAgICAgbnVtCiAgICAgICAgICAgIF9udW0zKT4gdGVtcGxhdGVTb3VyY2VPdXRsaW5lU3VtbWFyeSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIGludCBjb3VudCwgaW50IGNvdW50MiwgbnVtIF9udW0xLCBudW0gX251bTIsIG51bSBfbnVtMyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJCdWlsdCBvdXRsaW5lcyBmb3IgI2NvdW50IGNvbXBpbGF0aW9uIHVuaXRzICgjY291bnQyIGJ5dGVzKSBpbiAjbnVtMSUuM21zLCB0aGF0IGlzLAojbnVtMiUxMi4zIGJ5dGVzL21zLCBhbmQKI251bTMlMTIuMyBtcy9jb21waWxhdGlvbiB1bml0LiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzU291cmNlT3V0bGluZVN1bW1hcnkpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oaW50IGNvdW50LCBpbnQgY291bnQyLCBudW0gX251bTEsIG51bSBfbnVtMiwKICAgICAgICBudW0gX251bTMpPiBjb2RlU291cmNlT3V0bGluZVN1bW1hcnkgPSBjb25zdCBDb2RlPAogICAgTWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQsIGludCBjb3VudDIsIG51bSBfbnVtMSwgbnVtIF9udW0yLCBudW0gX251bTMpPigKICAiU291cmNlT3V0bGluZVN1bW1hcnkiLAogIHRlbXBsYXRlU291cmNlT3V0bGluZVN1bW1hcnksCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU291cmNlT3V0bGluZVN1bW1hcnkoCiAgICBpbnQgY291bnQsIGludCBjb3VudDIsIG51bSBfbnVtMSwgbnVtIF9udW0yLCBudW0gX251bTMpIHsKICBpZiAoY291bnQgPT0gbnVsbCkgdGhyb3cgJ05vIGNvdW50IHByb3ZpZGVkJzsKICBpZiAoY291bnQyID09IG51bGwpIHRocm93ICdObyBjb3VudCBwcm92aWRlZCc7CiAgaWYgKF9udW0xID09IG51bGwpIHRocm93ICdObyBudW1iZXIgcHJvdmlkZWQnOwogIFN0cmluZyBudW0xID0gX251bTEudG9TdHJpbmdBc0ZpeGVkKDMpOwogIGlmIChfbnVtMiA9PSBudWxsKSB0aHJvdyAnTm8gbnVtYmVyIHByb3ZpZGVkJzsKICBTdHJpbmcgbnVtMiA9IF9udW0yLnRvU3RyaW5nQXNGaXhlZCgzKS5wYWRMZWZ0KDEyKTsKICBpZiAoX251bTMgPT0gbnVsbCkgdGhyb3cgJ05vIG51bWJlciBwcm92aWRlZCc7CiAgU3RyaW5nIG51bTMgPSBfbnVtMy50b1N0cmluZ0FzRml4ZWQoMykucGFkTGVmdCgxMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTb3VyY2VPdXRsaW5lU3VtbWFyeSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkJ1aWx0IG91dGxpbmVzIGZvciAke2NvdW50fSBjb21waWxhdGlvbiB1bml0cyAoJHtjb3VudDJ9IGJ5dGVzKSBpbiAke251bTF9bXMsIHRoYXQgaXMsCiR7bnVtMn0gYnl0ZXMvbXMsIGFuZAoke251bTN9IG1zL2NvbXBpbGF0aW9uIHVuaXQuIiIiLAogICAgICBhcmd1bWVudHM6IHsKICAgICAgICAnY291bnQnOiBjb3VudCwKICAgICAgICAnY291bnQyJzogY291bnQyLAogICAgICAgICdudW0xJzogX251bTEsCiAgICAgICAgJ251bTInOiBfbnVtMiwKICAgICAgICAnbnVtMyc6IF9udW0zCiAgICAgIH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTcHJlYWRFbGVtZW50ID0gbWVzc2FnZVNwcmVhZEVsZW1lbnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU3ByZWFkRWxlbWVudCA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJTcHJlYWRFbGVtZW50IiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LCBtZXNzYWdlOiByIiIiSXRlcmFibGUgc3ByZWFkLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUyKT4gdGVtcGxhdGVTcHJlYWRFbGVtZW50VHlwZU1pc21hdGNoID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkNhbid0IGFzc2lnbiBzcHJlYWQgZWxlbWVudHMgb2YgdHlwZSAnI3R5cGUnIHRvIGNvbGxlY3Rpb24gZWxlbWVudHMgb2YgdHlwZSAnI3R5cGUyJy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1NwcmVhZEVsZW1lbnRUeXBlTWlzbWF0Y2gpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZVNwcmVhZEVsZW1lbnRUeXBlTWlzbWF0Y2ggPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPigKICAgICAgICAiU3ByZWFkRWxlbWVudFR5cGVNaXNtYXRjaCIsIHRlbXBsYXRlU3ByZWFkRWxlbWVudFR5cGVNaXNtYXRjaCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTElTVF9FTEVNRU5UX1RZUEVfTk9UX0FTU0lHTkFCTEUiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU3ByZWFkRWxlbWVudFR5cGVNaXNtYXRjaCgKICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlU3ByZWFkRWxlbWVudFR5cGVNaXNtYXRjaCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkNhbid0IGFzc2lnbiBzcHJlYWQgZWxlbWVudHMgb2YgdHlwZSAnJHt0eXBlfScgdG8gY29sbGVjdGlvbiBlbGVtZW50cyBvZiB0eXBlICcke3R5cGUyfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsndHlwZSc6IF90eXBlLCAndHlwZTInOiBfdHlwZTJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlU3ByZWFkTWFwRWxlbWVudCA9IG1lc3NhZ2VTcHJlYWRNYXBFbGVtZW50OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVNwcmVhZE1hcEVsZW1lbnQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJTcHJlYWRNYXBFbGVtZW50IiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LAogICAgbWVzc2FnZTogciIiIk1hcCBzcHJlYWQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZQogICAgICAgICAgICBfdHlwZTIpPiB0ZW1wbGF0ZVNwcmVhZE1hcEVudHJ5RWxlbWVudEtleVR5cGVNaXNtYXRjaCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJDYW4ndCBhc3NpZ24gc3ByZWFkIGVudHJ5IGtleXMgb2YgdHlwZSAnI3R5cGUnIHRvIG1hcCBlbnRyeSBrZXlzIG9mIHR5cGUgJyN0eXBlMicuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNTcHJlYWRNYXBFbnRyeUVsZW1lbnRLZXlUeXBlTWlzbWF0Y2gpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZVNwcmVhZE1hcEVudHJ5RWxlbWVudEtleVR5cGVNaXNtYXRjaCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgICAgICJTcHJlYWRNYXBFbnRyeUVsZW1lbnRLZXlUeXBlTWlzbWF0Y2giLAogICAgICAgIHRlbXBsYXRlU3ByZWFkTWFwRW50cnlFbGVtZW50S2V5VHlwZU1pc21hdGNoLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNQVBfS0VZX1RZUEVfTk9UX0FTU0lHTkFCTEUiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU3ByZWFkTWFwRW50cnlFbGVtZW50S2V5VHlwZU1pc21hdGNoKAogICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMikgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTcHJlYWRNYXBFbnRyeUVsZW1lbnRLZXlUeXBlTWlzbWF0Y2gsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDYW4ndCBhc3NpZ24gc3ByZWFkIGVudHJ5IGtleXMgb2YgdHlwZSAnJHt0eXBlfScgdG8gbWFwIGVudHJ5IGtleXMgb2YgdHlwZSAnJHt0eXBlMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+CiAgICB0ZW1wbGF0ZVNwcmVhZE1hcEVudHJ5RWxlbWVudFZhbHVlVHlwZU1pc21hdGNoID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkNhbid0IGFzc2lnbiBzcHJlYWQgZW50cnkgdmFsdWVzIG9mIHR5cGUgJyN0eXBlJyB0byBtYXAgZW50cnkgdmFsdWVzIG9mIHR5cGUgJyN0eXBlMicuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzU3ByZWFkTWFwRW50cnlFbGVtZW50VmFsdWVUeXBlTWlzbWF0Y2gpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZVNwcmVhZE1hcEVudHJ5RWxlbWVudFZhbHVlVHlwZU1pc21hdGNoID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICAgICAgIlNwcmVhZE1hcEVudHJ5RWxlbWVudFZhbHVlVHlwZU1pc21hdGNoIiwKICAgICAgICB0ZW1wbGF0ZVNwcmVhZE1hcEVudHJ5RWxlbWVudFZhbHVlVHlwZU1pc21hdGNoLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNQVBfVkFMVUVfVFlQRV9OT1RfQVNTSUdOQUJMRSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNTcHJlYWRNYXBFbnRyeUVsZW1lbnRWYWx1ZVR5cGVNaXNtYXRjaCgKICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlU3ByZWFkTWFwRW50cnlFbGVtZW50VmFsdWVUeXBlTWlzbWF0Y2gsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDYW4ndCBhc3NpZ24gc3ByZWFkIGVudHJ5IHZhbHVlcyBvZiB0eXBlICcke3R5cGV9JyB0byBtYXAgZW50cnkgdmFsdWVzIG9mIHR5cGUgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUpPiB0ZW1wbGF0ZVNwcmVhZE1hcEVudHJ5VHlwZU1pc21hdGNoID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJVbmV4cGVjdGVkIHR5cGUgJyN0eXBlJyBvZiBhIG1hcCBzcHJlYWQgZW50cnkuICBFeHBlY3RlZCAnZHluYW1pYycgb3IgYSBNYXAuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNTcHJlYWRNYXBFbnRyeVR5cGVNaXNtYXRjaCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUpPiBjb2RlU3ByZWFkTWFwRW50cnlUeXBlTWlzbWF0Y2ggPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlKT4oCiAgIlNwcmVhZE1hcEVudHJ5VHlwZU1pc21hdGNoIiwKICB0ZW1wbGF0ZVNwcmVhZE1hcEVudHJ5VHlwZU1pc21hdGNoLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1NwcmVhZE1hcEVudHJ5VHlwZU1pc21hdGNoKERhcnRUeXBlIF90eXBlKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlU3ByZWFkTWFwRW50cnlUeXBlTWlzbWF0Y2gsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJVbmV4cGVjdGVkIHR5cGUgJyR7dHlwZX0nIG9mIGEgbWFwIHNwcmVhZCBlbnRyeS4gIEV4cGVjdGVkICdkeW5hbWljJyBvciBhIE1hcC4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIERhcnRUeXBlCiAgICAgICAgICAgIF90eXBlKT4gdGVtcGxhdGVTcHJlYWRUeXBlTWlzbWF0Y2ggPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlVuZXhwZWN0ZWQgdHlwZSAnI3R5cGUnIG9mIGEgc3ByZWFkLiAgRXhwZWN0ZWQgJ2R5bmFtaWMnIG9yIGFuIEl0ZXJhYmxlLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzU3ByZWFkVHlwZU1pc21hdGNoKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSk+IGNvZGVTcHJlYWRUeXBlTWlzbWF0Y2ggPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlKT4oCiAgIlNwcmVhZFR5cGVNaXNtYXRjaCIsCiAgdGVtcGxhdGVTcHJlYWRUeXBlTWlzbWF0Y2gsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU3ByZWFkVHlwZU1pc21hdGNoKERhcnRUeXBlIF90eXBlKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlU3ByZWFkVHlwZU1pc21hdGNoLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVW5leHBlY3RlZCB0eXBlICcke3R5cGV9JyBvZiBhIHNwcmVhZC4gIEV4cGVjdGVkICdkeW5hbWljJyBvciBhbiBJdGVyYWJsZS4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlU3RhY2tPdmVyZmxvdyA9IG1lc3NhZ2VTdGFja092ZXJmbG93OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVN0YWNrT3ZlcmZsb3cgPSBjb25zdCBNZXNzYWdlQ29kZSgiU3RhY2tPdmVyZmxvdyIsCiAgICBpbmRleDogOTEsCiAgICBtZXNzYWdlOiByIiIiVGhlIGZpbGUgaGFzIHRvbyBtYW55IG5lc3RlZCBleHByZXNzaW9ucyBvciBzdGF0ZW1lbnRzLiIiIiwKICAgIHRpcDogciIiIlRyeSBzaW1wbGlmeWluZyB0aGUgY29kZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlU3RhdGljQWZ0ZXJDb25zdCA9IG1lc3NhZ2VTdGF0aWNBZnRlckNvbnN0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVN0YXRpY0FmdGVyQ29uc3QgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJTdGF0aWNBZnRlckNvbnN0IiwKICAgIGluZGV4OiAyMCwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIlRoZSBtb2RpZmllciAnc3RhdGljJyBzaG91bGQgYmUgYmVmb3JlIHRoZSBtb2RpZmllciAnY29uc3QnLiIiIiwKICAgIHRpcDogciIiIlRyeSByZS1vcmRlcmluZyB0aGUgbW9kaWZpZXJzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTdGF0aWNBZnRlckZpbmFsID0gbWVzc2FnZVN0YXRpY0FmdGVyRmluYWw7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU3RhdGljQWZ0ZXJGaW5hbCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlN0YXRpY0FmdGVyRmluYWwiLAogICAgaW5kZXg6IDE5LAogICAgbWVzc2FnZToKICAgICAgICByIiIiVGhlIG1vZGlmaWVyICdzdGF0aWMnIHNob3VsZCBiZSBiZWZvcmUgdGhlIG1vZGlmaWVyICdmaW5hbCcuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlLW9yZGVyaW5nIHRoZSBtb2RpZmllcnMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVN0YXRpY0FmdGVyVmFyID0gbWVzc2FnZVN0YXRpY0FmdGVyVmFyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVN0YXRpY0FmdGVyVmFyID0gY29uc3QgTWVzc2FnZUNvZGUoIlN0YXRpY0FmdGVyVmFyIiwKICAgIGluZGV4OiAxOCwKICAgIG1lc3NhZ2U6IHIiIiJUaGUgbW9kaWZpZXIgJ3N0YXRpYycgc2hvdWxkIGJlIGJlZm9yZSB0aGUgbW9kaWZpZXIgJ3ZhcicuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlLW9yZGVyaW5nIHRoZSBtb2RpZmllcnMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVN0YXRpY0FuZEluc3RhbmNlQ29uZmxpY3QgPQogICAgbWVzc2FnZVN0YXRpY0FuZEluc3RhbmNlQ29uZmxpY3Q7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU3RhdGljQW5kSW5zdGFuY2VDb25mbGljdCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlN0YXRpY0FuZEluc3RhbmNlQ29uZmxpY3QiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTkZMSUNUSU5HX1NUQVRJQ19BTkRfSU5TVEFOQ0UiXSwKICAgIG1lc3NhZ2U6IHIiIiJUaGlzIHN0YXRpYyBtZW1iZXIgY29uZmxpY3RzIHdpdGggYW4gaW5zdGFuY2UgbWVtYmVyLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTdGF0aWNBbmRJbnN0YW5jZUNvbmZsaWN0Q2F1c2UgPQogICAgbWVzc2FnZVN0YXRpY0FuZEluc3RhbmNlQ29uZmxpY3RDYXVzZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VTdGF0aWNBbmRJbnN0YW5jZUNvbmZsaWN0Q2F1c2UgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJTdGF0aWNBbmRJbnN0YW5jZUNvbmZsaWN0Q2F1c2UiLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQsCiAgICBtZXNzYWdlOiByIiIiVGhpcyBpcyB0aGUgaW5zdGFuY2UgbWVtYmVyLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTdGF0aWNDb25zdHJ1Y3RvciA9IG1lc3NhZ2VTdGF0aWNDb25zdHJ1Y3RvcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VTdGF0aWNDb25zdHJ1Y3RvciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlN0YXRpY0NvbnN0cnVjdG9yIiwKICAgIGluZGV4OiA0LAogICAgbWVzc2FnZTogciIiIkNvbnN0cnVjdG9ycyBjYW4ndCBiZSBzdGF0aWMuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nIHRoZSBrZXl3b3JkICdzdGF0aWMnLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTdGF0aWNPcGVyYXRvciA9IG1lc3NhZ2VTdGF0aWNPcGVyYXRvcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VTdGF0aWNPcGVyYXRvciA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJTdGF0aWNPcGVyYXRvciIsCiAgICBpbmRleDogMTcsCiAgICBtZXNzYWdlOiByIiIiT3BlcmF0b3JzIGNhbid0IGJlIHN0YXRpYy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGtleXdvcmQgJ3N0YXRpYycuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVN1cGVyQXNFeHByZXNzaW9uID0gbWVzc2FnZVN1cGVyQXNFeHByZXNzaW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVN1cGVyQXNFeHByZXNzaW9uID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiU3VwZXJBc0V4cHJlc3Npb24iLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlNVUEVSX0FTX0VYUFJFU1NJT04iXSwKICAgIG1lc3NhZ2U6IHIiIiJDYW4ndCB1c2UgJ3N1cGVyJyBhcyBhbiBleHByZXNzaW9uLiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiVG8gZGVsZWdhdGUgYSBjb25zdHJ1Y3RvciB0byBhIHN1cGVyIGNvbnN0cnVjdG9yLCBwdXQgdGhlIHN1cGVyIGNhbGwgYXMgYW4gaW5pdGlhbGl6ZXIuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVN1cGVyQXNJZGVudGlmaWVyID0gbWVzc2FnZVN1cGVyQXNJZGVudGlmaWVyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVN1cGVyQXNJZGVudGlmaWVyID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiU3VwZXJBc0lkZW50aWZpZXIiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlNVUEVSX0FTX0VYUFJFU1NJT04iXSwKICAgIG1lc3NhZ2U6IHIiIiJFeHBlY3RlZCBpZGVudGlmaWVyLCBidXQgZ290ICdzdXBlcicuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVN1cGVySW5pdGlhbGl6ZXJOb3RMYXN0ID0gbWVzc2FnZVN1cGVySW5pdGlhbGl6ZXJOb3RMYXN0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVN1cGVySW5pdGlhbGl6ZXJOb3RMYXN0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiU3VwZXJJbml0aWFsaXplck5vdExhc3QiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfU1VQRVJfSU5WT0NBVElPTiJdLAogICAgbWVzc2FnZTogciIiIkNhbid0IGhhdmUgaW5pdGlhbGl6ZXJzIGFmdGVyICdzdXBlcicuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVN1cGVyTnVsbEF3YXJlID0gbWVzc2FnZVN1cGVyTnVsbEF3YXJlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVN1cGVyTnVsbEF3YXJlID0gY29uc3QgTWVzc2FnZUNvZGUoIlN1cGVyTnVsbEF3YXJlIiwKICAgIGluZGV4OiA5MCwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIlRoZSBvcGVyYXRvciAnPy4nIGNhbm5vdCBiZSB1c2VkIHdpdGggJ3N1cGVyJyBiZWNhdXNlICdzdXBlcicgY2Fubm90IGJlIG51bGwuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlcGxhY2luZyAnPy4nIHdpdGggJy4nIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9Db25zdHJ1Y3RvciA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiU3VwZXJjbGFzcyBoYXMgbm8gY29uc3RydWN0b3IgbmFtZWQgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNTdXBlcmNsYXNzSGFzTm9Db25zdHJ1Y3Rvcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlU3VwZXJjbGFzc0hhc05vQ29uc3RydWN0b3IgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIlN1cGVyY2xhc3NIYXNOb0NvbnN0cnVjdG9yIiwgdGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9Db25zdHJ1Y3RvciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsKICAgICAgICAgICJVTkRFRklORURfQ09OU1RSVUNUT1JfSU5fSU5JVElBTElaRVIiLAogICAgICAgICAgIlVOREVGSU5FRF9DT05TVFJVQ1RPUl9JTl9JTklUSUFMSVpFUl9ERUZBVUxUIgogICAgICAgIF0sCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU3VwZXJjbGFzc0hhc05vQ29uc3RydWN0b3IoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTdXBlcmNsYXNzSGFzTm9Db25zdHJ1Y3RvciwKICAgICAgbWVzc2FnZTogIiIiU3VwZXJjbGFzcyBoYXMgbm8gY29uc3RydWN0b3IgbmFtZWQgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlU3VwZXJjbGFzc0hhc05vRGVmYXVsdENvbnN0cnVjdG9yID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgc3VwZXJjbGFzcywgJyNuYW1lJywgaGFzIG5vIHVubmFtZWQgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNTdXBlcmNsYXNzSGFzTm9EZWZhdWx0Q29uc3RydWN0b3IpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIGNvZGVTdXBlcmNsYXNzSGFzTm9EZWZhdWx0Q29uc3RydWN0b3IgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIlN1cGVyY2xhc3NIYXNOb0RlZmF1bHRDb25zdHJ1Y3RvciIsCiAgICAgICAgdGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9EZWZhdWx0Q29uc3RydWN0b3IsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PX0RFRkFVTFRfU1VQRVJfQ09OU1RSVUNUT1JfSU1QTElDSVQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU3VwZXJjbGFzc0hhc05vRGVmYXVsdENvbnN0cnVjdG9yKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlU3VwZXJjbGFzc0hhc05vRGVmYXVsdENvbnN0cnVjdG9yLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIHN1cGVyY2xhc3MsICcke25hbWV9JywgaGFzIG5vIHVubmFtZWQgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlU3VwZXJjbGFzc0hhc05vR2V0dGVyID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJTdXBlcmNsYXNzIGhhcyBubyBnZXR0ZXIgbmFtZWQgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNTdXBlcmNsYXNzSGFzTm9HZXR0ZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZVN1cGVyY2xhc3NIYXNOb0dldHRlciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiU3VwZXJjbGFzc0hhc05vR2V0dGVyIiwgdGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9HZXR0ZXIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlVOREVGSU5FRF9TVVBFUl9HRVRURVIiXSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNTdXBlcmNsYXNzSGFzTm9HZXR0ZXIoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTdXBlcmNsYXNzSGFzTm9HZXR0ZXIsCiAgICAgIG1lc3NhZ2U6ICIiIlN1cGVyY2xhc3MgaGFzIG5vIGdldHRlciBuYW1lZCAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlU3VwZXJjbGFzc0hhc05vTWV0aG9kID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJTdXBlcmNsYXNzIGhhcyBubyBtZXRob2QgbmFtZWQgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNTdXBlcmNsYXNzSGFzTm9NZXRob2QpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZVN1cGVyY2xhc3NIYXNOb01ldGhvZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiU3VwZXJjbGFzc0hhc05vTWV0aG9kIiwgdGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9NZXRob2QsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlVOREVGSU5FRF9TVVBFUl9NRVRIT0QiXSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNTdXBlcmNsYXNzSGFzTm9NZXRob2QoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTdXBlcmNsYXNzSGFzTm9NZXRob2QsCiAgICAgIG1lc3NhZ2U6ICIiIlN1cGVyY2xhc3MgaGFzIG5vIG1ldGhvZCBuYW1lZCAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlU3VwZXJjbGFzc0hhc05vU2V0dGVyID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJTdXBlcmNsYXNzIGhhcyBubyBzZXR0ZXIgbmFtZWQgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNTdXBlcmNsYXNzSGFzTm9TZXR0ZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZVN1cGVyY2xhc3NIYXNOb1NldHRlciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiU3VwZXJjbGFzc0hhc05vU2V0dGVyIiwgdGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9TZXR0ZXIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlVOREVGSU5FRF9TVVBFUl9TRVRURVIiXSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNTdXBlcmNsYXNzSGFzTm9TZXR0ZXIoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTdXBlcmNsYXNzSGFzTm9TZXR0ZXIsCiAgICAgIG1lc3NhZ2U6ICIiIlN1cGVyY2xhc3MgaGFzIG5vIHNldHRlciBuYW1lZCAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lKT4gdGVtcGxhdGVTdXBlcmNsYXNzTWV0aG9kQXJndW1lbnRNaXNtYXRjaCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiU3VwZXJjbGFzcyBkb2Vzbid0IGhhdmUgYSBtZXRob2QgbmFtZWQgJyNuYW1lJyB3aXRoIG1hdGNoaW5nIGFyZ3VtZW50cy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1N1cGVyY2xhc3NNZXRob2RBcmd1bWVudE1pc21hdGNoKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVTdXBlcmNsYXNzTWV0aG9kQXJndW1lbnRNaXNtYXRjaCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiU3VwZXJjbGFzc01ldGhvZEFyZ3VtZW50TWlzbWF0Y2giLAogICAgICAgIHRlbXBsYXRlU3VwZXJjbGFzc01ldGhvZEFyZ3VtZW50TWlzbWF0Y2gsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU3VwZXJjbGFzc01ldGhvZEFyZ3VtZW50TWlzbWF0Y2goU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTdXBlcmNsYXNzTWV0aG9kQXJndW1lbnRNaXNtYXRjaCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlN1cGVyY2xhc3MgZG9lc24ndCBoYXZlIGEgbWV0aG9kIG5hbWVkICcke25hbWV9JyB3aXRoIG1hdGNoaW5nIGFyZ3VtZW50cy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTdXBlcnR5cGVJc0Z1bmN0aW9uID0gbWVzc2FnZVN1cGVydHlwZUlzRnVuY3Rpb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU3VwZXJ0eXBlSXNGdW5jdGlvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlN1cGVydHlwZUlzRnVuY3Rpb24iLAogICAgbWVzc2FnZTogciIiIkNhbid0IHVzZSBhIGZ1bmN0aW9uIHR5cGUgYXMgc3VwZXJ0eXBlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVTdXBlcnR5cGVJc0lsbGVnYWwgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlRoZSB0eXBlICcjbmFtZScgY2FuJ3QgYmUgdXNlZCBhcyBzdXBlcnR5cGUuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzU3VwZXJ0eXBlSXNJbGxlZ2FsKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVTdXBlcnR5cGVJc0lsbGVnYWwgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIlN1cGVydHlwZUlzSWxsZWdhbCIsIHRlbXBsYXRlU3VwZXJ0eXBlSXNJbGxlZ2FsLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJFWFRFTkRTX05PTl9DTEFTUyJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNTdXBlcnR5cGVJc0lsbGVnYWwoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTdXBlcnR5cGVJc0lsbGVnYWwsCiAgICAgIG1lc3NhZ2U6ICIiIlRoZSB0eXBlICcke25hbWV9JyBjYW4ndCBiZSB1c2VkIGFzIHN1cGVydHlwZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVTdXBlcnR5cGVJc1R5cGVWYXJpYWJsZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiVGhlIHR5cGUgdmFyaWFibGUgJyNuYW1lJyBjYW4ndCBiZSB1c2VkIGFzIHN1cGVydHlwZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNTdXBlcnR5cGVJc1R5cGVWYXJpYWJsZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlU3VwZXJ0eXBlSXNUeXBlVmFyaWFibGUgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIlN1cGVydHlwZUlzVHlwZVZhcmlhYmxlIiwgdGVtcGxhdGVTdXBlcnR5cGVJc1R5cGVWYXJpYWJsZSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVhURU5EU19OT05fQ0xBU1MiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU3VwZXJ0eXBlSXNUeXBlVmFyaWFibGUoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTdXBlcnR5cGVJc1R5cGVWYXJpYWJsZSwKICAgICAgbWVzc2FnZTogIiIiVGhlIHR5cGUgdmFyaWFibGUgJyR7bmFtZX0nIGNhbid0IGJlIHVzZWQgYXMgc3VwZXJ0eXBlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVN3aXRjaENhc2VGYWxsVGhyb3VnaCA9IG1lc3NhZ2VTd2l0Y2hDYXNlRmFsbFRocm91Z2g7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU3dpdGNoQ2FzZUZhbGxUaHJvdWdoID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiU3dpdGNoQ2FzZUZhbGxUaHJvdWdoIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJDQVNFX0JMT0NLX05PVF9URVJNSU5BVEVEIl0sCiAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nLAogICAgbWVzc2FnZTogciIiIlN3aXRjaCBjYXNlIG1heSBmYWxsIHRocm91Z2ggdG8gdGhlIG5leHQgY2FzZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIERhcnRUeXBlIF90eXBlLAogICAgICAgIERhcnRUeXBlCiAgICAgICAgICAgIF90eXBlMik+IHRlbXBsYXRlU3dpdGNoRXhwcmVzc2lvbk5vdEFzc2lnbmFibGUgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVHlwZSAnI3R5cGUnIG9mIHRoZSBzd2l0Y2ggZXhwcmVzc2lvbiBpc24ndCBhc3NpZ25hYmxlIHRvIHRoZSB0eXBlICcjdHlwZTInIG9mIHRoaXMgY2FzZSBleHByZXNzaW9uLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzU3dpdGNoRXhwcmVzc2lvbk5vdEFzc2lnbmFibGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZVN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICAgICAgIlN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlIiwgdGVtcGxhdGVTd2l0Y2hFeHByZXNzaW9uTm90QXNzaWduYWJsZSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiU1dJVENIX0VYUFJFU1NJT05fTk9UX0FTU0lHTkFCTEUiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU3dpdGNoRXhwcmVzc2lvbk5vdEFzc2lnbmFibGUoCiAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVHlwZSAnJHt0eXBlfScgb2YgdGhlIHN3aXRjaCBleHByZXNzaW9uIGlzbid0IGFzc2lnbmFibGUgdG8gdGhlIHR5cGUgJyR7dHlwZTJ9JyBvZiB0aGlzIGNhc2UgZXhwcmVzc2lvbi4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTd2l0Y2hFeHByZXNzaW9uTm90QXNzaWduYWJsZUNhdXNlID0KICAgIG1lc3NhZ2VTd2l0Y2hFeHByZXNzaW9uTm90QXNzaWduYWJsZUNhdXNlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlQ2F1c2UgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJTd2l0Y2hFeHByZXNzaW9uTm90QXNzaWduYWJsZUNhdXNlIiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LAogICAgbWVzc2FnZTogciIiIlRoZSBzd2l0Y2ggZXhwcmVzc2lvbiBpcyBoZXJlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTd2l0Y2hIYXNDYXNlQWZ0ZXJEZWZhdWx0ID0KICAgIG1lc3NhZ2VTd2l0Y2hIYXNDYXNlQWZ0ZXJEZWZhdWx0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVN3aXRjaEhhc0Nhc2VBZnRlckRlZmF1bHQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJTd2l0Y2hIYXNDYXNlQWZ0ZXJEZWZhdWx0IiwKICAgIGluZGV4OiAxNiwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIlRoZSBkZWZhdWx0IGNhc2Ugc2hvdWxkIGJlIHRoZSBsYXN0IGNhc2UgaW4gYSBzd2l0Y2ggc3RhdGVtZW50LiIiIiwKICAgIHRpcDogciIiIlRyeSBtb3ZpbmcgdGhlIGRlZmF1bHQgY2FzZSBhZnRlciB0aGUgb3RoZXIgY2FzZSBjbGF1c2VzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTd2l0Y2hIYXNNdWx0aXBsZURlZmF1bHRzID0KICAgIG1lc3NhZ2VTd2l0Y2hIYXNNdWx0aXBsZURlZmF1bHRzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVN3aXRjaEhhc011bHRpcGxlRGVmYXVsdHMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJTd2l0Y2hIYXNNdWx0aXBsZURlZmF1bHRzIiwKICAgIGluZGV4OiAxNSwKICAgIG1lc3NhZ2U6IHIiIiJUaGUgJ2RlZmF1bHQnIGNhc2UgY2FuIG9ubHkgYmUgZGVjbGFyZWQgb25jZS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgYWxsIGJ1dCBvbmUgZGVmYXVsdCBjYXNlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTeW50aGV0aWNUb2tlbiA9IG1lc3NhZ2VTeW50aGV0aWNUb2tlbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VTeW50aGV0aWNUb2tlbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJTeW50aGV0aWNUb2tlbiIsCiAgICBtZXNzYWdlOiByIiIiVGhpcyBjb3VsZG4ndCBiZSBwYXJzZWQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVUaGlzQWNjZXNzSW5GaWVsZEluaXRpYWxpemVyID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJDYW4ndCBhY2Nlc3MgJ3RoaXMnIGluIGEgZmllbGQgaW5pdGlhbGl6ZXIgdG8gcmVhZCAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1RoaXNBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZVRoaXNBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIlRoaXNBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXIiLCB0ZW1wbGF0ZVRoaXNBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlRISVNfQUNDRVNTX0ZST01fRklFTERfSU5JVElBTElaRVIiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzVGhpc0FjY2Vzc0luRmllbGRJbml0aWFsaXplcihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVRoaXNBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXIsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDYW4ndCBhY2Nlc3MgJ3RoaXMnIGluIGEgZmllbGQgaW5pdGlhbGl6ZXIgdG8gcmVhZCAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlVGhpc0FzSWRlbnRpZmllciA9IG1lc3NhZ2VUaGlzQXNJZGVudGlmaWVyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVRoaXNBc0lkZW50aWZpZXIgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJUaGlzQXNJZGVudGlmaWVyIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlZBTElEX1JFRkVSRU5DRV9UT19USElTIl0sCiAgICBtZXNzYWdlOiByIiIiRXhwZWN0ZWQgaWRlbnRpZmllciwgYnV0IGdvdCAndGhpcycuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVRoaXNJbml0aWFsaXplck5vdEFsb25lID0gbWVzc2FnZVRoaXNJbml0aWFsaXplck5vdEFsb25lOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVRoaXNJbml0aWFsaXplck5vdEFsb25lID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiVGhpc0luaXRpYWxpemVyTm90QWxvbmUiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkZJRUxEX0lOSVRJQUxJWkVSX1JFRElSRUNUSU5HX0NPTlNUUlVDVE9SIl0sCiAgICBtZXNzYWdlOiByIiIiQ2FuJ3QgaGF2ZSBvdGhlciBpbml0aWFsaXplcnMgdG9nZXRoZXIgd2l0aCAndGhpcycuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+CiAgICB0ZW1wbGF0ZVRoaXNPclN1cGVyQWNjZXNzSW5GaWVsZEluaXRpYWxpemVyID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNhbid0IGFjY2VzcyAnI3N0cmluZycgaW4gYSBmaWVsZCBpbml0aWFsaXplci4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNUaGlzT3JTdXBlckFjY2Vzc0luRmllbGRJbml0aWFsaXplcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+CiAgICBjb2RlVGhpc09yU3VwZXJBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiVGhpc09yU3VwZXJBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXIiLAogICAgICAgIHRlbXBsYXRlVGhpc09yU3VwZXJBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlRISVNfQUNDRVNTX0ZST01fSU5JVElBTElaRVIiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzVGhpc09yU3VwZXJBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXIoU3RyaW5nIHN0cmluZykgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVUaGlzT3JTdXBlckFjY2Vzc0luRmllbGRJbml0aWFsaXplciwKICAgICAgbWVzc2FnZTogIiIiQ2FuJ3QgYWNjZXNzICcke3N0cmluZ30nIGluIGEgZmllbGQgaW5pdGlhbGl6ZXIuIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBpbnQgY291bnQsCiAgICAgICAgaW50CiAgICAgICAgICAgIGNvdW50Mik+IHRlbXBsYXRlVG9vRmV3QXJndW1lbnRzID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQsIGludCBjb3VudDIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVG9vIGZldyBwb3NpdGlvbmFsIGFyZ3VtZW50czogI2NvdW50IHJlcXVpcmVkLCAjY291bnQyIGdpdmVuLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVG9vRmV3QXJndW1lbnRzKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQsIGludCBjb3VudDIpPiBjb2RlVG9vRmV3QXJndW1lbnRzID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQsIGludCBjb3VudDIpPigKICAgICAgICAiVG9vRmV3QXJndW1lbnRzIiwgdGVtcGxhdGVUb29GZXdBcmd1bWVudHMsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PVF9FTk9VR0hfUkVRVUlSRURfQVJHVU1FTlRTIl0sCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzVG9vRmV3QXJndW1lbnRzKGludCBjb3VudCwgaW50IGNvdW50MikgewogIGlmIChjb3VudCA9PSBudWxsKSB0aHJvdyAnTm8gY291bnQgcHJvdmlkZWQnOwogIGlmIChjb3VudDIgPT0gbnVsbCkgdGhyb3cgJ05vIGNvdW50IHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVRvb0Zld0FyZ3VtZW50cywKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRvbyBmZXcgcG9zaXRpb25hbCBhcmd1bWVudHM6ICR7Y291bnR9IHJlcXVpcmVkLCAke2NvdW50Mn0gZ2l2ZW4uIiIiLAogICAgICBhcmd1bWVudHM6IHsnY291bnQnOiBjb3VudCwgJ2NvdW50Mic6IGNvdW50Mn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgaW50IGNvdW50LAogICAgICAgIGludAogICAgICAgICAgICBjb3VudDIpPiB0ZW1wbGF0ZVRvb01hbnlBcmd1bWVudHMgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKGludCBjb3VudCwgaW50IGNvdW50Mik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUb28gbWFueSBwb3NpdGlvbmFsIGFyZ3VtZW50czogI2NvdW50IGFsbG93ZWQsIGJ1dCAjY291bnQyIGZvdW5kLiIiIiwKICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IHJlbW92aW5nIHRoZSBleHRyYSBwb3NpdGlvbmFsIGFyZ3VtZW50cy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1Rvb01hbnlBcmd1bWVudHMpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKGludCBjb3VudCwgaW50IGNvdW50Mik+IGNvZGVUb29NYW55QXJndW1lbnRzID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQsIGludCBjb3VudDIpPigKICAgICAgICAiVG9vTWFueUFyZ3VtZW50cyIsIHRlbXBsYXRlVG9vTWFueUFyZ3VtZW50cywKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVhUUkFfUE9TSVRJT05BTF9BUkdVTUVOVFMiXSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNUb29NYW55QXJndW1lbnRzKGludCBjb3VudCwgaW50IGNvdW50MikgewogIGlmIChjb3VudCA9PSBudWxsKSB0aHJvdyAnTm8gY291bnQgcHJvdmlkZWQnOwogIGlmIChjb3VudDIgPT0gbnVsbCkgdGhyb3cgJ05vIGNvdW50IHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVRvb01hbnlBcmd1bWVudHMsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUb28gbWFueSBwb3NpdGlvbmFsIGFyZ3VtZW50czogJHtjb3VudH0gYWxsb3dlZCwgYnV0ICR7Y291bnQyfSBmb3VuZC4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IHJlbW92aW5nIHRoZSBleHRyYSBwb3NpdGlvbmFsIGFyZ3VtZW50cy4iIiIsCiAgICAgIGFyZ3VtZW50czogeydjb3VudCc6IGNvdW50LCAnY291bnQyJzogY291bnQyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVRvcExldmVsT3BlcmF0b3IgPSBtZXNzYWdlVG9wTGV2ZWxPcGVyYXRvcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VUb3BMZXZlbE9wZXJhdG9yID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiVG9wTGV2ZWxPcGVyYXRvciIsCiAgICBpbmRleDogMTQsCiAgICBtZXNzYWdlOiByIiIiT3BlcmF0b3JzIG11c3QgYmUgZGVjbGFyZWQgd2l0aGluIGEgY2xhc3MuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgcmVtb3ZpbmcgdGhlIG9wZXJhdG9yLCBtb3ZpbmcgaXQgdG8gYSBjbGFzcywgb3IgY29udmVydGluZyBpdCB0byBiZSBhIGZ1bmN0aW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVUeXBlQWZ0ZXJWYXIgPSBtZXNzYWdlVHlwZUFmdGVyVmFyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVR5cGVBZnRlclZhciA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJUeXBlQWZ0ZXJWYXIiLAogICAgaW5kZXg6IDg5LAogICAgbWVzc2FnZToKICAgICAgICByIiIiVmFyaWFibGVzIGNhbid0IGJlIGRlY2xhcmVkIHVzaW5nIGJvdGggJ3ZhcicgYW5kIGEgdHlwZSBuYW1lLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyAndmFyLiciIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQpPiB0ZW1wbGF0ZVR5cGVBcmd1bWVudE1pc21hdGNoID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oaW50IGNvdW50KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiRXhwZWN0ZWQgI2NvdW50IHR5cGUgYXJndW1lbnRzLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1R5cGVBcmd1bWVudE1pc21hdGNoKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQpPiBjb2RlVHlwZUFyZ3VtZW50TWlzbWF0Y2ggPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKGludCBjb3VudCk+KAogICAgICAgICJUeXBlQXJndW1lbnRNaXNtYXRjaCIsIHRlbXBsYXRlVHlwZUFyZ3VtZW50TWlzbWF0Y2gsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIldST05HX05VTUJFUl9PRl9UWVBFX0FSR1VNRU5UUyJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1R5cGVBcmd1bWVudE1pc21hdGNoKGludCBjb3VudCkgewogIGlmIChjb3VudCA9PSBudWxsKSB0aHJvdyAnTm8gY291bnQgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVHlwZUFyZ3VtZW50TWlzbWF0Y2gsCiAgICAgIG1lc3NhZ2U6ICIiIkV4cGVjdGVkICR7Y291bnR9IHR5cGUgYXJndW1lbnRzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J2NvdW50JzogY291bnR9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZVR5cGVBcmd1bWVudHNPblR5cGVWYXJpYWJsZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiQ2FuJ3QgdXNlIHR5cGUgYXJndW1lbnRzIHdpdGggdHlwZSB2YXJpYWJsZSAnI25hbWUnLiIiIiwKICAgICAgICB0aXBUZW1wbGF0ZTogciIiIlRyeSByZW1vdmluZyB0aGUgdHlwZSBhcmd1bWVudHMuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVHlwZUFyZ3VtZW50c09uVHlwZVZhcmlhYmxlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVUeXBlQXJndW1lbnRzT25UeXBlVmFyaWFibGUgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIlR5cGVBcmd1bWVudHNPblR5cGVWYXJpYWJsZSIsIHRlbXBsYXRlVHlwZUFyZ3VtZW50c09uVHlwZVZhcmlhYmxlLAogICAgICAgIGluZGV4OiAxMywgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzVHlwZUFyZ3VtZW50c09uVHlwZVZhcmlhYmxlKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVHlwZUFyZ3VtZW50c09uVHlwZVZhcmlhYmxlLAogICAgICBtZXNzYWdlOiAiIiJDYW4ndCB1c2UgdHlwZSBhcmd1bWVudHMgd2l0aCB0eXBlIHZhcmlhYmxlICcke25hbWV9Jy4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IHJlbW92aW5nIHRoZSB0eXBlIGFyZ3VtZW50cy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVUeXBlQmVmb3JlRmFjdG9yeSA9IG1lc3NhZ2VUeXBlQmVmb3JlRmFjdG9yeTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VUeXBlQmVmb3JlRmFjdG9yeSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlR5cGVCZWZvcmVGYWN0b3J5IiwKICAgIGluZGV4OiA5NywKICAgIG1lc3NhZ2U6IHIiIiJGYWN0b3J5IGNvbnN0cnVjdG9ycyBjYW5ub3QgaGF2ZSBhIHJldHVybiB0eXBlLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyB0aGUgdHlwZSBhcHBlYXJpbmcgYmVmb3JlICdmYWN0b3J5Jy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlVHlwZU5vdEZvdW5kID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJUeXBlICcjbmFtZScgbm90IGZvdW5kLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1R5cGVOb3RGb3VuZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlVHlwZU5vdEZvdW5kID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJUeXBlTm90Rm91bmQiLCB0ZW1wbGF0ZVR5cGVOb3RGb3VuZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5ERUZJTkVEX0NMQVNTIl0sCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzVHlwZU5vdEZvdW5kKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVHlwZU5vdEZvdW5kLAogICAgICBtZXNzYWdlOiAiIiJUeXBlICcke25hbWV9JyBub3QgZm91bmQuIiIiLCBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPiB0ZW1wbGF0ZVR5cGVPcmlnaW4gPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiInI25hbWUnIGlzIGZyb20gJyN1cmknLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1R5cGVPcmlnaW4pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+IGNvZGVUeXBlT3JpZ2luID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPigKICAiVHlwZU9yaWdpbiIsCiAgdGVtcGxhdGVUeXBlT3JpZ2luLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1R5cGVPcmlnaW4oU3RyaW5nIG5hbWUsIFVyaSB1cmlfKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVHlwZU9yaWdpbiwKICAgICAgbWVzc2FnZTogIiIiJyR7bmFtZX0nIGlzIGZyb20gJyR7dXJpfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd1cmknOiB1cmlffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPgogICAgdGVtcGxhdGVUeXBlT3JpZ2luV2l0aEZpbGVVcmkgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIicjbmFtZScgaXMgZnJvbSAnI3VyaScgKCcjdXJpMicpLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1R5cGVPcmlnaW5XaXRoRmlsZVVyaSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPgogICAgY29kZVR5cGVPcmlnaW5XaXRoRmlsZVVyaSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPigKICAiVHlwZU9yaWdpbldpdGhGaWxlVXJpIiwKICB0ZW1wbGF0ZVR5cGVPcmlnaW5XaXRoRmlsZVVyaSwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNUeXBlT3JpZ2luV2l0aEZpbGVVcmkoU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgU3RyaW5nIHVyaTIgPSByZWxhdGl2aXplVXJpKHVyaTJfKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVR5cGVPcmlnaW5XaXRoRmlsZVVyaSwKICAgICAgbWVzc2FnZTogIiIiJyR7bmFtZX0nIGlzIGZyb20gJyR7dXJpfScgKCcke3VyaTJ9JykuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd1cmknOiB1cmlfLCAndXJpMic6IHVyaTJffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVR5cGVWYXJpYWJsZUR1cGxpY2F0ZWROYW1lID0KICAgIG1lc3NhZ2VUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlR5cGVWYXJpYWJsZUR1cGxpY2F0ZWROYW1lIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJEVVBMSUNBVEVfREVGSU5JVElPTiJdLAogICAgbWVzc2FnZTogciIiIkEgdHlwZSB2YXJpYWJsZSBjYW4ndCBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgYW5vdGhlci4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZVR5cGVWYXJpYWJsZUR1cGxpY2F0ZWROYW1lQ2F1c2UgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlRoZSBvdGhlciB0eXBlIHZhcmlhYmxlIG5hbWVkICcjbmFtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVHlwZVZhcmlhYmxlRHVwbGljYXRlZE5hbWVDYXVzZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlVHlwZVZhcmlhYmxlRHVwbGljYXRlZE5hbWVDYXVzZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigiVHlwZVZhcmlhYmxlRHVwbGljYXRlZE5hbWVDYXVzZSIsCiAgICAgICAgdGVtcGxhdGVUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZUNhdXNlLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZUNhdXNlKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVHlwZVZhcmlhYmxlRHVwbGljYXRlZE5hbWVDYXVzZSwKICAgICAgbWVzc2FnZTogIiIiVGhlIG90aGVyIHR5cGUgdmFyaWFibGUgbmFtZWQgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVR5cGVWYXJpYWJsZUluQ29uc3RhbnRDb250ZXh0ID0KICAgIG1lc3NhZ2VUeXBlVmFyaWFibGVJbkNvbnN0YW50Q29udGV4dDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VUeXBlVmFyaWFibGVJbkNvbnN0YW50Q29udGV4dCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlR5cGVWYXJpYWJsZUluQ29uc3RhbnRDb250ZXh0IiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJUWVBFX1BBUkFNRVRFUl9JTl9DT05TVF9FWFBSRVNTSU9OIl0sCiAgICBtZXNzYWdlOiByIiIiVHlwZSB2YXJpYWJsZXMgY2FuJ3QgYmUgdXNlZCBhcyBjb25zdGFudHMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVR5cGVWYXJpYWJsZUluU3RhdGljQ29udGV4dCA9CiAgICBtZXNzYWdlVHlwZVZhcmlhYmxlSW5TdGF0aWNDb250ZXh0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVR5cGVWYXJpYWJsZUluU3RhdGljQ29udGV4dCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlR5cGVWYXJpYWJsZUluU3RhdGljQ29udGV4dCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVFlQRV9QQVJBTUVURVJfUkVGRVJFTkNFRF9CWV9TVEFUSUMiXSwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcsCiAgICBtZXNzYWdlOiByIiIiVHlwZSB2YXJpYWJsZXMgY2FuJ3QgYmUgdXNlZCBpbiBzdGF0aWMgbWVtYmVycy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlVHlwZVZhcmlhYmxlU2FtZU5hbWVBc0VuY2xvc2luZyA9CiAgICBtZXNzYWdlVHlwZVZhcmlhYmxlU2FtZU5hbWVBc0VuY2xvc2luZzsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VUeXBlVmFyaWFibGVTYW1lTmFtZUFzRW5jbG9zaW5nID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiVHlwZVZhcmlhYmxlU2FtZU5hbWVBc0VuY2xvc2luZyIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09ORkxJQ1RJTkdfVFlQRV9WQVJJQUJMRV9BTkRfQ0xBU1MiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkEgdHlwZSB2YXJpYWJsZSBjYW4ndCBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgaXRzIGVuY2xvc2luZyBkZWNsYXJhdGlvbi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlVHlwZWRlZkluQ2xhc3MgPSBtZXNzYWdlVHlwZWRlZkluQ2xhc3M7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlVHlwZWRlZkluQ2xhc3MgPSBjb25zdCBNZXNzYWdlQ29kZSgiVHlwZWRlZkluQ2xhc3MiLAogICAgaW5kZXg6IDcsCiAgICBtZXNzYWdlOiByIiIiVHlwZWRlZnMgY2FuJ3QgYmUgZGVjbGFyZWQgaW5zaWRlIGNsYXNzZXMuIiIiLAogICAgdGlwOiByIiIiVHJ5IG1vdmluZyB0aGUgdHlwZWRlZiB0byB0aGUgdG9wLWxldmVsLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVUeXBlZGVmTm90RnVuY3Rpb24gPSBtZXNzYWdlVHlwZWRlZk5vdEZ1bmN0aW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVR5cGVkZWZOb3RGdW5jdGlvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlR5cGVkZWZOb3RGdW5jdGlvbiIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9HRU5FUklDX0ZVTkNUSU9OX1RZUEUiXSwKICAgIG1lc3NhZ2U6IHIiIiJDYW4ndCBjcmVhdGUgdHlwZWRlZiBmcm9tIG5vbi1mdW5jdGlvbiB0eXBlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUpPiB0ZW1wbGF0ZVVuZGVmaW5lZEdldHRlciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBnZXR0ZXIgJyNuYW1lJyBpc24ndCBkZWZpbmVkIGZvciB0aGUgY2xhc3MgJyN0eXBlJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgZ2V0dGVyLCBvciBkZWZpbmluZyBhIGdldHRlciBvciBmaWVsZCBuYW1lZCAnI25hbWUnLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVW5kZWZpbmVkR2V0dGVyKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUpPiBjb2RlVW5kZWZpbmVkR2V0dGVyID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUpPigKICAgICAgICAiVW5kZWZpbmVkR2V0dGVyIiwgdGVtcGxhdGVVbmRlZmluZWRHZXR0ZXIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlVOREVGSU5FRF9HRVRURVIiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzVW5kZWZpbmVkR2V0dGVyKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVVbmRlZmluZWRHZXR0ZXIsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgZ2V0dGVyICcke25hbWV9JyBpc24ndCBkZWZpbmVkIGZvciB0aGUgY2xhc3MgJyR7dHlwZX0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOgogICAgICAgICAgIiIiVHJ5IGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgZ2V0dGVyLCBvciBkZWZpbmluZyBhIGdldHRlciBvciBmaWVsZCBuYW1lZCAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd0eXBlJzogX3R5cGV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIERhcnRUeXBlCiAgICAgICAgICAgIF90eXBlKT4gdGVtcGxhdGVVbmRlZmluZWRNZXRob2QgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgbWV0aG9kICcjbmFtZScgaXNuJ3QgZGVmaW5lZCBmb3IgdGhlIGNsYXNzICcjdHlwZScuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBjb3JyZWN0aW5nIHRoZSBuYW1lIHRvIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIG1ldGhvZCwgb3IgZGVmaW5pbmcgYSBtZXRob2QgbmFtZWQgJyNuYW1lJy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1VuZGVmaW5lZE1ldGhvZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlKT4gY29kZVVuZGVmaW5lZE1ldGhvZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlKT4oCiAgICAgICAgIlVuZGVmaW5lZE1ldGhvZCIsIHRlbXBsYXRlVW5kZWZpbmVkTWV0aG9kLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJVTkRFRklORURfTUVUSE9EIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1VuZGVmaW5lZE1ldGhvZChTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVW5kZWZpbmVkTWV0aG9kLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIG1ldGhvZCAnJHtuYW1lfScgaXNuJ3QgZGVmaW5lZCBmb3IgdGhlIGNsYXNzICcke3R5cGV9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDoKICAgICAgICAgICIiIlRyeSBjb3JyZWN0aW5nIHRoZSBuYW1lIHRvIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIG1ldGhvZCwgb3IgZGVmaW5pbmcgYSBtZXRob2QgbmFtZWQgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAndHlwZSc6IF90eXBlfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBEYXJ0VHlwZQogICAgICAgICAgICBfdHlwZSk+IHRlbXBsYXRlVW5kZWZpbmVkU2V0dGVyID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIHNldHRlciAnI25hbWUnIGlzbid0IGRlZmluZWQgZm9yIHRoZSBjbGFzcyAnI3R5cGUnLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgY29ycmVjdGluZyB0aGUgbmFtZSB0byB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBzZXR0ZXIsIG9yIGRlZmluaW5nIGEgc2V0dGVyIG9yIGZpZWxkIG5hbWVkICcjbmFtZScuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNVbmRlZmluZWRTZXR0ZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSk+IGNvZGVVbmRlZmluZWRTZXR0ZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSk+KAogICAgICAgICJVbmRlZmluZWRTZXR0ZXIiLCB0ZW1wbGF0ZVVuZGVmaW5lZFNldHRlciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5ERUZJTkVEX1NFVFRFUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNVbmRlZmluZWRTZXR0ZXIoU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVVuZGVmaW5lZFNldHRlciwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBzZXR0ZXIgJyR7bmFtZX0nIGlzbid0IGRlZmluZWQgZm9yIHRoZSBjbGFzcyAnJHt0eXBlfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6CiAgICAgICAgICAiIiJUcnkgY29ycmVjdGluZyB0aGUgbmFtZSB0byB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBzZXR0ZXIsIG9yIGRlZmluaW5nIGEgc2V0dGVyIG9yIGZpZWxkIG5hbWVkICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3R5cGUnOiBfdHlwZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVVbmV4cGVjdGVkRG9sbGFySW5TdHJpbmcgPSBtZXNzYWdlVW5leHBlY3RlZERvbGxhckluU3RyaW5nOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVVuZXhwZWN0ZWREb2xsYXJJblN0cmluZyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlVuZXhwZWN0ZWREb2xsYXJJblN0cmluZyIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5FWFBFQ1RFRF9ET0xMQVJfSU5fU1RSSU5HIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJBICckJyBoYXMgc3BlY2lhbCBtZWFuaW5nIGluc2lkZSBhIHN0cmluZywgYW5kIG11c3QgYmUgZm9sbG93ZWQgYnkgYW4gaWRlbnRpZmllciBvciBhbiBleHByZXNzaW9uIGluIGN1cmx5IGJyYWNlcyAoe30pLiIiIiwKICAgIHRpcDogciIiIlRyeSBhZGRpbmcgYSBiYWNrc2xhc2ggKFwpIHRvIGVzY2FwZSB0aGUgJyQnLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gdGVtcGxhdGVVbmV4cGVjdGVkVG9rZW4gPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlVuZXhwZWN0ZWQgdG9rZW4gJyNsZXhlbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1VuZXhwZWN0ZWRUb2tlbik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiBjb2RlVW5leHBlY3RlZFRva2VuID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgICJVbmV4cGVjdGVkVG9rZW4iLCB0ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5FWFBFQ1RFRF9UT0tFTiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNVbmV4cGVjdGVkVG9rZW4oVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVW5leHBlY3RlZFRva2VuLAogICAgICBtZXNzYWdlOiAiIiJVbmV4cGVjdGVkIHRva2VuICcke2xleGVtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3Rva2VuJzogdG9rZW59KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBUb2tlbiB0b2tlbik+CiAgICB0ZW1wbGF0ZVVubWF0Y2hlZFRva2VuID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDYW4ndCBmaW5kICcjc3RyaW5nJyB0byBtYXRjaCAnI2xleGVtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVW5tYXRjaGVkVG9rZW4pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFRva2VuIHRva2VuKT4gY29kZVVubWF0Y2hlZFRva2VuID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBUb2tlbiB0b2tlbik+KAogICAgICAgICJVbm1hdGNoZWRUb2tlbiIsIHRlbXBsYXRlVW5tYXRjaGVkVG9rZW4sCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVYUEVDVEVEX1RPS0VOIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1VubWF0Y2hlZFRva2VuKFN0cmluZyBzdHJpbmcsIFRva2VuIHRva2VuKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVW5tYXRjaGVkVG9rZW4sCiAgICAgIG1lc3NhZ2U6ICIiIkNhbid0IGZpbmQgJyR7c3RyaW5nfScgdG8gbWF0Y2ggJyR7bGV4ZW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nLCAndG9rZW4nOiB0b2tlbn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUyKT4gdGVtcGxhdGVVbnJlc29sdmVkUHJlZml4SW5UeXBlQW5ub3RhdGlvbiA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiInI25hbWUuI25hbWUyJyBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZSBiZWNhdXNlICcjbmFtZScgaXNuJ3QgZGVmaW5lZC4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1VucmVzb2x2ZWRQcmVmaXhJblR5cGVBbm5vdGF0aW9uKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4KICAgIGNvZGVVbnJlc29sdmVkUHJlZml4SW5UeXBlQW5ub3RhdGlvbiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgICAgICJVbnJlc29sdmVkUHJlZml4SW5UeXBlQW5ub3RhdGlvbiIsCiAgICAgICAgdGVtcGxhdGVVbnJlc29sdmVkUHJlZml4SW5UeXBlQW5ub3RhdGlvbiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9UX0FfVFlQRSJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1VucmVzb2x2ZWRQcmVmaXhJblR5cGVBbm5vdGF0aW9uKAogICAgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMikgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVVbnJlc29sdmVkUHJlZml4SW5UeXBlQW5ub3RhdGlvbiwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIicke25hbWV9LiR7bmFtZTJ9JyBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZSBiZWNhdXNlICcke25hbWV9JyBpc24ndCBkZWZpbmVkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAnbmFtZTInOiBuYW1lMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPiB0ZW1wbGF0ZVVuc3BlY2lmaWVkID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIiNzdHJpbmciIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNVbnNwZWNpZmllZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+IGNvZGVVbnNwZWNpZmllZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICJVbnNwZWNpZmllZCIsCiAgdGVtcGxhdGVVbnNwZWNpZmllZCwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNVbnNwZWNpZmllZChTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVVuc3BlY2lmaWVkLAogICAgICBtZXNzYWdlOiAiIiIke3N0cmluZ30iIiIsIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmd9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IHRlbXBsYXRlVW5zdXBwb3J0ZWRPcGVyYXRvciA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiVGhlICcjbGV4ZW1lJyBvcGVyYXRvciBpcyBub3Qgc3VwcG9ydGVkLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1Vuc3VwcG9ydGVkT3BlcmF0b3IpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gY29kZVVuc3VwcG9ydGVkT3BlcmF0b3IgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oCiAgICAgICAgIlVuc3VwcG9ydGVkT3BlcmF0b3IiLCB0ZW1wbGF0ZVVuc3VwcG9ydGVkT3BlcmF0b3IsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlVOU1VQUE9SVEVEX09QRVJBVE9SIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1Vuc3VwcG9ydGVkT3BlcmF0b3IoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVW5zdXBwb3J0ZWRPcGVyYXRvciwKICAgICAgbWVzc2FnZTogIiIiVGhlICcke2xleGVtZX0nIG9wZXJhdG9yIGlzIG5vdCBzdXBwb3J0ZWQuIiIiLAogICAgICBhcmd1bWVudHM6IHsndG9rZW4nOiB0b2tlbn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVVbnN1cHBvcnRlZFByZWZpeFBsdXMgPSBtZXNzYWdlVW5zdXBwb3J0ZWRQcmVmaXhQbHVzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVVuc3VwcG9ydGVkUHJlZml4UGx1cyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlVuc3VwcG9ydGVkUHJlZml4UGx1cyIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTUlTU0lOR19JREVOVElGSUVSIl0sCiAgICBtZXNzYWdlOiByIiIiJysnIGlzIG5vdCBhIHByZWZpeCBvcGVyYXRvci4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgJysnLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVVbnRlcm1pbmF0ZWRDb21tZW50ID0gbWVzc2FnZVVudGVybWluYXRlZENvbW1lbnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlVW50ZXJtaW5hdGVkQ29tbWVudCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlVudGVybWluYXRlZENvbW1lbnQiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlVOVEVSTUlOQVRFRF9NVUxUSV9MSU5FX0NPTU1FTlQiXSwKICAgIG1lc3NhZ2U6IHIiIiJDb21tZW50IHN0YXJ0aW5nIHdpdGggJy8qJyBtdXN0IGVuZCB3aXRoICcqLycuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPgogICAgdGVtcGxhdGVVbnRlcm1pbmF0ZWRTdHJpbmcgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMik+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlN0cmluZyBzdGFydGluZyB3aXRoICNzdHJpbmcgbXVzdCBlbmQgd2l0aCAjc3RyaW5nMi4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNVbnRlcm1pbmF0ZWRTdHJpbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4KICAgIGNvZGVVbnRlcm1pbmF0ZWRTdHJpbmcgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4oCiAgICAgICAgIlVudGVybWluYXRlZFN0cmluZyIsIHRlbXBsYXRlVW50ZXJtaW5hdGVkU3RyaW5nLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJVTlRFUk1JTkFURURfU1RSSU5HX0xJVEVSQUwiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzVW50ZXJtaW5hdGVkU3RyaW5nKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICBpZiAoc3RyaW5nMi5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVVudGVybWluYXRlZFN0cmluZywKICAgICAgbWVzc2FnZTogIiIiU3RyaW5nIHN0YXJ0aW5nIHdpdGggJHtzdHJpbmd9IG11c3QgZW5kIHdpdGggJHtzdHJpbmcyfS4iIiIsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmcsICdzdHJpbmcyJzogc3RyaW5nMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVVbnRlcm1pbmF0ZWRUb2tlbiA9IG1lc3NhZ2VVbnRlcm1pbmF0ZWRUb2tlbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VVbnRlcm1pbmF0ZWRUb2tlbiA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiVW50ZXJtaW5hdGVkVG9rZW4iLCBtZXNzYWdlOiByIiIiSW5jb21wbGV0ZSB0b2tlbi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+IHRlbXBsYXRlVW50cmFuc2xhdGFibGVVcmkgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIk5vdCBmb3VuZDogJyN1cmknIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVW50cmFuc2xhdGFibGVVcmkpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4gY29kZVVudHJhbnNsYXRhYmxlVXJpID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KAogICAgICAgICJVbnRyYW5zbGF0YWJsZVVyaSIsIHRlbXBsYXRlVW50cmFuc2xhdGFibGVVcmksCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlVSSV9ET0VTX05PVF9FWElTVCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNVbnRyYW5zbGF0YWJsZVVyaShVcmkgdXJpXykgewogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVW50cmFuc2xhdGFibGVVcmksCiAgICAgIG1lc3NhZ2U6ICIiIk5vdCBmb3VuZDogJyR7dXJpfSciIiIsIGFyZ3VtZW50czogeyd1cmknOiB1cmlffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVVc2VPZkRlcHJlY2F0ZWRJZGVudGlmaWVyID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiInI25hbWUnIGlzIGRlcHJlY2F0ZWQuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVXNlT2ZEZXByZWNhdGVkSWRlbnRpZmllcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlVXNlT2ZEZXByZWNhdGVkSWRlbnRpZmllciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiVXNlT2ZEZXByZWNhdGVkSWRlbnRpZmllciIsIHRlbXBsYXRlVXNlT2ZEZXByZWNhdGVkSWRlbnRpZmllciwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaWdub3JlZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzVXNlT2ZEZXByZWNhdGVkSWRlbnRpZmllcihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVVzZU9mRGVwcmVjYXRlZElkZW50aWZpZXIsCiAgICAgIG1lc3NhZ2U6ICIiIicke25hbWV9JyBpcyBkZXByZWNhdGVkLiIiIiwgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVZhckFzVHlwZU5hbWUgPSBtZXNzYWdlVmFyQXNUeXBlTmFtZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VWYXJBc1R5cGVOYW1lID0gY29uc3QgTWVzc2FnZUNvZGUoIlZhckFzVHlwZU5hbWUiLAogICAgaW5kZXg6IDYxLCBtZXNzYWdlOiByIiIiVGhlIGtleXdvcmQgJ3ZhcicgY2FuJ3QgYmUgdXNlZCBhcyBhIHR5cGUgbmFtZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlVmFyUmV0dXJuVHlwZSA9IG1lc3NhZ2VWYXJSZXR1cm5UeXBlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVZhclJldHVyblR5cGUgPSBjb25zdCBNZXNzYWdlQ29kZSgiVmFyUmV0dXJuVHlwZSIsCiAgICBpbmRleDogMTIsCiAgICBtZXNzYWdlOiByIiIiVGhlIHJldHVybiB0eXBlIGNhbid0IGJlICd2YXInLiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiVHJ5IHJlbW92aW5nIHRoZSBrZXl3b3JkICd2YXInLCBvciByZXBsYWNpbmcgaXQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgcmV0dXJuIHR5cGUuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVZvaWRFeHByZXNzaW9uID0gbWVzc2FnZVZvaWRFeHByZXNzaW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVZvaWRFeHByZXNzaW9uID0gY29uc3QgTWVzc2FnZUNvZGUoIlZvaWRFeHByZXNzaW9uIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJVU0VfT0ZfVk9JRF9SRVNVTFQiXSwKICAgIG1lc3NhZ2U6IHIiIiJUaGlzIGV4cHJlc3Npb24gaGFzIHR5cGUgJ3ZvaWQnIGFuZCBjYW4ndCBiZSB1c2VkLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIHN0cmluZywKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgc3RyaW5nMik+IHRlbXBsYXRlV2ViTGl0ZXJhbENhbm5vdEJlUmVwcmVzZW50ZWRFeGFjdGx5ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgaW50ZWdlciBsaXRlcmFsICNzdHJpbmcgY2FuJ3QgYmUgcmVwcmVzZW50ZWQgZXhhY3RseSBpbiBKYXZhU2NyaXB0LiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgY2hhbmdpbmcgdGhlIGxpdGVyYWwgdG8gc29tZXRoaW5nIHRoYXQgY2FuIGJlIHJlcHJlc2VudGVkIGluIEphdmFzY3JpcHQuIEluIEphdmFzY3JpcHQgI3N0cmluZzIgaXMgdGhlIG5lYXJlc3QgdmFsdWUgdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgZXhhY3RseS4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1dlYkxpdGVyYWxDYW5ub3RCZVJlcHJlc2VudGVkRXhhY3RseSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPgogICAgY29kZVdlYkxpdGVyYWxDYW5ub3RCZVJlcHJlc2VudGVkRXhhY3RseSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPigKICAiV2ViTGl0ZXJhbENhbm5vdEJlUmVwcmVzZW50ZWRFeGFjdGx5IiwKICB0ZW1wbGF0ZVdlYkxpdGVyYWxDYW5ub3RCZVJlcHJlc2VudGVkRXhhY3RseSwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNXZWJMaXRlcmFsQ2Fubm90QmVSZXByZXNlbnRlZEV4YWN0bHkoCiAgICBTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMikgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgaWYgKHN0cmluZzIuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVXZWJMaXRlcmFsQ2Fubm90QmVSZXByZXNlbnRlZEV4YWN0bHksCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgaW50ZWdlciBsaXRlcmFsICR7c3RyaW5nfSBjYW4ndCBiZSByZXByZXNlbnRlZCBleGFjdGx5IGluIEphdmFTY3JpcHQuIiIiLAogICAgICB0aXA6ICIiIlRyeSBjaGFuZ2luZyB0aGUgbGl0ZXJhbCB0byBzb21ldGhpbmcgdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gSmF2YXNjcmlwdC4gSW4gSmF2YXNjcmlwdCAke3N0cmluZzJ9IGlzIHRoZSBuZWFyZXN0IHZhbHVlIHRoYXQgY2FuIGJlIHJlcHJlc2VudGVkIGV4YWN0bHkuIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nLCAnc3RyaW5nMic6IHN0cmluZzJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlV2l0aEJlZm9yZUV4dGVuZHMgPSBtZXNzYWdlV2l0aEJlZm9yZUV4dGVuZHM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlV2l0aEJlZm9yZUV4dGVuZHMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJXaXRoQmVmb3JlRXh0ZW5kcyIsCiAgICBpbmRleDogMTEsCiAgICBtZXNzYWdlOiByIiIiVGhlIGV4dGVuZHMgY2xhdXNlIG11c3QgYmUgYmVmb3JlIHRoZSB3aXRoIGNsYXVzZS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgbW92aW5nIHRoZSBleHRlbmRzIGNsYXVzZSBiZWZvcmUgdGhlIHdpdGggY2xhdXNlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVZaWVsZEFzSWRlbnRpZmllciA9IG1lc3NhZ2VZaWVsZEFzSWRlbnRpZmllcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VZaWVsZEFzSWRlbnRpZmllciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIllpZWxkQXNJZGVudGlmaWVyIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJBU1lOQ19LRVlXT1JEX1VTRURfQVNfSURFTlRJRklFUiJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiJ3lpZWxkJyBjYW4ndCBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIgaW4gJ2FzeW5jJywgJ2FzeW5jKicsIG9yICdzeW5jKicgbWV0aG9kcy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlWWllbGROb3RHZW5lcmF0b3IgPSBtZXNzYWdlWWllbGROb3RHZW5lcmF0b3I7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlWWllbGROb3RHZW5lcmF0b3IgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJZaWVsZE5vdEdlbmVyYXRvciIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiWUlFTERfSU5fTk9OX0dFTkVSQVRPUiJdLAogICAgbWVzc2FnZTogciIiIid5aWVsZCcgY2FuIG9ubHkgYmUgdXNlZCBpbiAnc3luYyonIG9yICdhc3luYyonIG1ldGhvZHMuIiIiKTsKppQATk48AS4DODsBFQE5LikzGU1CATlLL0o8MAE5QC4tNVEiAgE5RwE5QhsPTAl3ATk/ATlQOVABORAWD1IoFWFIATkqLy8wNkgwATlKLi0/D2QiAgE5RDM4MwE5PC8RFwMBOTEuLSZLAgE5TzJNGUY7ATlLHlA8OgE5KzQuLSs1NyIkLk8iQgIBOTswATk/PTlLATk+MwE5QkA5TgE5EBYYEUkpHxVcEV09ATk+JENIQgE5MScrNTciJDQPYiZhNAIBORAWDEgqFVk5ATlIMUA3ATk9E0gwD1wsAgE5RQE5QRo/ATlRATlHIEMBOUMBOUAZQQ1iATlDATlAGUENYgE5QQE5Pxg7DWcJfQE5OwE5TDdPATkQFhUPTiYcFYChEYCCQwE5OCo9KzE8ATk3IS4tLy86D4CmgIYyAgE5EBYPTCgVc0dCATlPUDA8ATlELi05D3ZCIgIBOS42MxloS08BOSoyLzM5PAE5TS4tQg9nQiICATlFATlBGg8NVzQBOS4pM1FCATlLL0o6ATlALi01SCICATlQMxlPUD8BOUgvREEBOT0gMg9ORSQCATkuLTNFRgE5T1AwSAE5RCA5PCQCATk9ATlOIEsBOS4xMxlRSgE5Ki0vLjQlATlILi09D1AiAgE5PTIBOUE/S0YBOUcBOUIbLi0BOTApNRlID0IBOU0xICYDATlCMjVKMQIBOTwxATlTLA1ZATk8MQE5UywNYQldATk3LAE5TicNTVEBOTcsATlOJ1FRATkQFg9NKhVcNkEBOVAxUEUBOUUyOA9fLyYCATkuNjMZajpPATkqMi8zOT0BOU0uLUIPaS8iAgE5UT9ENAE5STsuOAE5PiQyJz0zAgE5EBYOTigVgJARZwVDATlQUTE6ATlFIDoPgJNpBSQCATkxJgE5SCFGPwE5MicBOUkiRkdRATk3ATlIDw1aCWUBOTInATlJIg8NWgllATk5ATlKD0U5ATlBATk/GA9AQQE5UTNFQAE5SS9GQAE5Pi4tMzwiAgE5TTNBPAE5RS8aIAMBOTouLS84IgIBOUwzQDsBOUQvPDsBOTkuLS43IgIBOS4pM0BCATlLL0o6MAE5QC4tNTciAgE5TDNAOwE5RC88OwE5OS4tLjciAgE5LikzQEIBOUsvSjowATlALi01NyICATkuKDNHQQE5Si9ISgE5Py4tND4iAgE5NisBOU0mIDEBOUMBOUAZDw1OMQE5QwE5QBkPDU5KATk7ATlMD09GATk3ATlID01EATk1ATlGDz4JgLcBOTUqATlMJUdRATk6LwE5USogRQE5PTIBOUE/EVMBOVEBOUcgPDxHATk5LgE5UClHDVIBOUkBOUMcQD0BOUEBOSxNATkQFg9GKBWAjhFnBTwBOUkvRiE5CAE5Pi4tMw+AkWkFIgIBORAWEUwvFVw9ATlRNkhBATlGK0EqNA9gJisCATkQFhFILxVUOQE5TTZAPQE5QitBKjAPWCYrAgE5EBYRUi8VUUMBOTEqNisxTgE5TCtBKjoPVSYrAgE5UQE5RyA8LQE5MDI1TUsBOSwuMS81QQE5SzI+RCYCATkQFhFJKxWAgD4BOU4yICYDATlDKzUiNQ+AhCYjAgE5EBYXHBgRUUwfFXVFATkMSE4WTictAwE5OUoyK0E1NyoiJDwPfyYTGh8XGAoCATkQFhwRUD8VgJtFATlBLEYnLQMBOTkqK0E1KiI8D4ChJjoCATkQFhcRUz4VXUQBOUArRSwyOAE5OCkyK0EqOw9jJj0CATkQFhcRTj4VYD8BOUAmRUxBATkzKTIrQSo2D2YmPQIBORAWD04oFVFEATlRLywyTwE5Ri4tOw9UIgIBOTU5OhmAuhdHATkxNTY2PEUBOUIaK0EqRQ+AuiYrAgE5EBYRTS8VgJ4+ATkxJTZKQQE5RytBKjUPgKImKwIBORAWHBgRRFAVXzgBOQxPK1AaIAMBOSw7K0E1NyoiJC8PZyZLAgE5NSoBOUwlOkIBOTQpATlLJDlBATk0KQE5SyQ5QQE5NSo6GVFDATkxJjZMITgIATlIK0EqNg9RJisCATkQFhcYD0dKFWs6ATlMIVEcIgMBOS41MjMzMQ9yTgIBORAWD0sqFVI/ATlOMUxAATlDMjYPVSYCATkQFg9PKhVhQwE5LCoxKzFHATlHMjoPZCYCATk1KgE5TCVCDVgBOU8BOUYfOkkBOUUBOUEaPD0BORAWFw9FOhVoOAE5PB9BPj0BOUwyMy8PbToCATk5ATlKDw1VCW4BOTkuATlQKUINWwlnATkQFg9KKE0RUUABOU0vTjsBOUIuLTdIC1IiAgE5RQE5QRo1QglXATk3ATlIDw1ONAE5QwE5QBk/PwlkATlMM0Q7ATlELzw6MAE5OS4tLjsiAgE5RQE5QRo1DU0BOTEmATlIIQ88MAE5NCkBOUskSw1cRQE5NSoBOUwlPj8BOVEBOUcgOQ1XATkuLjNNRwE5UFExJQE5RS4tOkQiAgE5TQE5RR4wOgE5SwE5RB0ODVo3ATkuLDMZR0UBOU4vUDoBOUMuLThLIgIBOTInATlJIg8NWglnATlAH0U7QAE5PBtBFhwDATlIMjMrMkYCATlHATlCGw8NUDEBOUMBOUAZDg1OMQE5RQE5QRoPDU9LATk/ATlQDw1SOAE5EBYVD0Q3ThFmOAE5OR8+PksBOUkuLTIvSwtnNAIBOU0zQzwBOUUvPkUBOTouLS86IgIBOS4zM0dMATkqLy8wNkABOUouLT8+IgIBOUYzUDUBOT4vMEgBOTMuLShHIgIBOUI3ATlGRE0RUgE5RzwBOUtJJDgBOS46MxlxPRdIATkqNi83PSE5CAE5US4tRg9wMiICATlHATlCGw8NXkUBORAWD0YoFWI8ATlJL0Y8ATk+Li0zD2UiAgE5LiwzN0UBOU4vUCUBOUMuLThKAgE5EBYYD0Q4FW8RdjoBOTohP0JDMAE5TCs1Li0iMQ91JnwxAgE5EBpFMR5KGVEZHToBOQxCOU8YHgMBOSo+MDExKjE2MTYtD1EWGhMYGhcXFgoCATkQFg9IKEcRZj4BOUsvSksBOUAuLTVCC2ciAgE5MSYBOUghD0VEATlDATlAGQ9PPwE5Li4zGVFLRwE5UFExFAE5RS4tOg9QQCICATk/ATlQD1EzATlOM0w9ATlGL0A6ATk7Li0wQyICATkuKTNCQgE5Sy9KJQE5QC4tNTkiAgE5EBYPUSgVT0cBOSouLy81JQE5SS4tPg9SIgIBOVEzGU1AATlJLx4kAwE5Pi4tM1EiAgE5Qx9IGUY4ATk/G0Q2NgE5Sy4tJCYrTj4CATlDJUgZRj4BOT8hREIwATlRLi0kJjFOPgIBOUMfSBlGOAE5PxtENiUBOUsuLSQmK04+AgE5QyVIGUY+ATk/IURCNTABOVEuLSQmMU4+AgE5UDMZTD8BOUgvREUBOT0uLTJQIgIBOS4tM0BGATlPUDAlATlELi05NyICATlQMxlMPwE5SC9ERCUBOT0uLTJQIgIBOS4tM0BGATlPUDAlATlELi05NyICATlLM09ROgE5Qy86FAE5OCAtRkYkAgE5EBYPSigVUUABOU0vTkMBOUIuLTcPVCICATkuMDM6SQE5KiwvLTMlATlHLi08TQIBOVAzRD8BOUgvRD4BOT0uLTI7IgIBOVAzRD8BOUgvRDoBOT0uLTI7IgIBOS4rM0BEATlNL04lATlCLi03NyICATlPATlGHzM8PAE5MicBOUkiMz9AATkxATlCNwE5EBYPTSgVWEMBOVBRMUIBOUUuLToPWyICATlJATlDHDA6ATk3ATlIDz04ATlDATlAGTEzATk3LAE5TicODVsxATlONUA7ATlGMTw0ATk7Mi43JgIBOUsBOUQdDy8BOTsBOUwvJyEBOUcBOUIbNjchATk5ATlKNjchATlJNUE2ATlBMTI0ATk2Mik4JgIBOVAzGUc/ATlIL0Q4ATk9IDJLJAIBOUwzTTsBOUQvPDsBOTkgLkQkAgE5UTMZR0ABOUkvRjgBOT4gM0skAgE5TDNMOwE5RC88OQE5OSAuQyQCATlHATlCGw8wATkQTihGEVU0ATlBLzY3ATk2ICtBC1YkAgE5TTNOPAE5RS8+OwE5OiAvRSQCATlBATk/GDJBATlLM0w6ATlDLzo4ATk4IC1DJAIBOUo1RTcBOUIxNBQBOTcyKjwmAgE5SwE5RB07LwE5SwE5RB1LATlFATkuTAE5QwE5QBkPLAE5RzNHNgE5Py8yPQE5NCApPiQCATlINT01ATlAMTA0ATk1Mig0JgIBOUUzRTQBOT0vLjgBOTIgJzwkAgE5NwE5J0cBORAWD0QqFUYRajgBOUcxPhQBOTwyL04LayYCATk/ATlQD0VPATlDIEgZTzkBOT8cRDglATlMLi0kJiwPUj4CATlLATlEHQ2AmgE5RjMZTTUBOT4vMDIBOTMuLShRIgIBOUwzGVA7ATlELzw+ATk5Li0uD08iAgE5RQE5QRoPDU8xATlJATlDHA8NUTEBOUcBOUIbDw1QMQE5OwE5TA5BNwE5MygBOUojDz4JXwE5QDUBOURCUUoNXgE5OQE5Sg4/NwE5MicBOUkiDz44ATlPATlGHw87CVsBOTsBOUwPQDcBOU0BOUUeD0YBOT8BOVAPQjcBOUszRTU6ATlDLzoUATk4IC08LCQCATk9ATlOMU4BOTInATlJIg9PNgE5UTM/QAE5SS8eJAMBOT4uLTM2IgIBOT0BOSpIAR0lARVFARAhAQkPRAEPRwEFRzEBFFAfARRQHgFNJgETPgELUEYBDDgBEjgBDUQBEzEBFkkWAQ5LDwEPFQEeG0sPAU1MTUoTARETS0tPMgEdTUg6ATk/ATkrTwEtUgE5EFAoFYCvNgE5Qy8YHgMBOTguLS0PgLIiAgE5EFEoFYCINwE5RC8ZHwMBOTkuLS4PgIsiAgE5EEooFXswATk9LxIYAwE5Mi4tJw9+IgIBORBRKBV4NwE5RC8ZHwMBOTkuLS4PeyICATkQTysVXjIBOUIyFBoDATk3KzUiKQ9iJiMCATkQFhgZET9NFWgzATlPJk0VGwMBOSc4KzU3NyIkJCoPcCZFAgE5EBYVET04FWYyATlPPxQaAwE5RC4tKzUiKQ9sJjECATk9MgE5VC0PTQl+ATk6LwE5USoPUCgBOUMBOUAZDw1OSgE5NwE5SA9NMgE5EBYPRihFEVg8ATlJL0Y7ATk+Li0zQAtZIgIBORAWD1MoFUwRYUkBOSowLzE3SQE5Sy4tQA9PC2IiAgE5EBYPSihNEVFAATlNL047ATlCLi03SAtSIgIBOS42MxlcTwE5KjIvMzlFMAE5TS4tQg9bIgIBOS47Mz8XSQE5KjcvOD4lATlEEy4tRzYiAgE5EBYYEVE8FVpARQE5PixDLTNEATk5Jys1NyIkPA9gJjk0AgE5MygBOUojTAE5TQE5RR4NTQE5EBYYEUg8FVE8ATk+I0NGPAE5MCcrNTciJDMPVyY0AgE5MicBOUkiOz41ATlRATlHID9FATkxJgE5SCE9DW1AATlLATlEHTRBATkyJwE5SSJGDVMBOTE+NhlaFUoXTAE5LToyO0FOATlHFis1IkoPWiZIIwIBOUM4ATlHRU0RTz0BOUczPDYBOT8vMjUwATk0Li0pTwIBOUMBOUAZNzwoATk4LQE5TygPRwE5NywBOU4nRA1bATk7MAE5Pz0RTgE5TQE5RR46DVoBOUUzRTQBOT0vLjMBOTIuLSc8IgIBOS4sMxlORQE5Ti9QQAE5Qy4tOA9NIgIBOS4xMxlISgE5Ki0vLjQlATlILi09TCICATk2KwE5TSZDDVwBOTovATlRKk4BOU8BOUYfD05OATlFATlBGg9JSQE5SQE5QxwPS0sBOUUBOUEaSgE5OSE+R0U6ATlOOjo5ATlDLi0wLT48MgIBORAWD0IoFVI+OAE5RS8+PAE5Oi4tLw9VNyICATkQFhFGKxV1EU07ATlLMkRBATlAKzUiMg95Jk8jAgE5EBYVD0s2FVhAATk4Jz1OJQE5UC4tLy83D10yAgE5PwE5UA9FTwE5QyBIGU85ATk/HEQ4JQE5TC4tJCYsD1I+AgE5EBYYEVI8FVNGATk+LUMuND4BOTonKzU3IiQ9D1kmNAIBORAWGBkVD0QaShV2EVA5ATkMGkksHk5ARwE5LUIrNTcuLS8vIiQwD4CAJlITFxkWFwoCATkQFhgZFQ9QGkoVgIkRUEUBOQwaSTgeTi0zRwE5OUIrNTcuLS8vIiQ8D4CTJlITFxkWFwoCATkQFhgZFRYWD09HOBWAohFQRAE5DEc3N0s8LDJHATlHTis1Ny4tLy8vLy8vIiQ7D4CwJgtRExcZFhgYFwoCATkQFhgZFRYWD1caHB0ZGhoTGRWAqxFdTAE5DEc3P0s8NDpHATlPTis1Ny4tLy8vLy8vIiRDD4C5JgteExcZFhgYFwoCATkQFhgZFQ9MGkoVfxFdQQE5DBpJNB5OUEcBOTVCKzU3Li0vLyIkOA+AiSZfExcZFhcKAgE5EBYYGRUZD00aHB0ZHRMZFX0RUEIBOQxHURBLMSowRwE5RUMrNTcuLTcvLyIkJDkPgIkmUhMXGRYZFwoCATkQFhgZFRkPVUctFYCGEV1KATkMRyw9SzEyOEcBOU1DKzU3Li03Ly8iJCRBD4CSJl8TFxkWGRcKAgE5NSoBOUwlIFABOUgwSzoBOUAsOiUBOTUkLUIhAgE5UQE5RyBASwE5NisBOU0mIDQBOTYrATlNJiA6ATkQFhcMUDQVgIEBd4C6XkYBOTYtOy40JQE5Oh8yJD0PgIQBd4C8XjMCATkwNzUZgIUBe1ABOSwzMTQ6JQE5UDJDD4CEAXsmAgE5EBYXGBgMThpHFVUeIBUBd4C6XkQBOQwaRjceSywyJQE5OD8yMzMkOw9YICIVAXeAvF4TGhwcFAoCATlQRU4ZWR4gFQF7TgE5TDFRMjglATk+NTIzM0EPWCAiFQF7TgIBOTQpATlLJA9QCVIBOS4oM1BBATlKL0hCATk/Li00RyICATkQFg9LKBVbQQE5Ti9QRQE5Qy4tOA9eIgIBORAWFRgRTkkVdRFVQgE5SylQKjBCMAE5NjQuLSs1NyIkOQ99JltCAgE5OzABOT89JEcBOUcwPTkBOT8sFx0DATk0JCxPAgE5EBYPSioVTRGAkT4BOU0xSkIBOUIyNQ9QC4CSJgIBORAWD0MoFU45ATlGL0AlATk7Li0wD1EiAgE5OS4BOVApKE8BOTswATk/PSxFATk4MT1JSgE5NC05LjQtATk6HS4tJD1CLwIBOTAtNRlGRgE5UTEqMC0BOUYyOUomAgE5PShCSkUBOTkkPkgtATlOLi0yNEE8AgE5QTYBOUVDLD4BOUc8ATlLSSwRUAE5NSoBOUwlKEUJVAE5LjIzR0sBOSouLy81LQE5SS4tPj4iAgE5UDM4PwE5SC9ELQE5PS4tMksCATk8KEFEQQE5OCQ9SC0BOU0uLS8vND0yAgE5PDEBOUA+LDgBOS42M0tPATkqMi8zOS0BOU0uLUJCIgIBOUo/ATlOTCwRUgE5PStCNkoBOTknPk4tATlRLi0yNy0+AgE5PjpDGUwXSAE5OjY/Nz0tATlDIys1Li0iRg9OJjECATlAKEVJQQE5PCRBSC0BOVEyMzRCOgIBOUAnRUBAATk8I0FGLQE5UDIzMzk6AgE5MCs1OEQBOU8xTi0BOUQyN08CATkuKTNBQgE5Sy9KLQE5QC4tNTgiAgE5Ky4wP0cBOU1OMS0BOUIkOlECATkwLzVLTAE5LCsxLDItATlIMjtALgIBOUUBOUEaQT8BORAWFRgRTkkVVhFJQgE5SylQJCoDATk2NC4tKzU3IiQ5D14mS0ICATkQFhgRQTwVWhFpNQE5PhxDODgBOUsrNTciJCwPYCZtNAIBOT8BOVAODVBJATlLMzk6ATlDLxgeAwE5OC4tLUwCATkQFhgRRzwVVhFfOwE5PiJDREABOVErNTciJDIPXCZhNAIBORAWGBFGPBVPEVg6ATk+IUNCPwE5UCs1NyIkMQ9VJlo0AgE5EBYYEUU8FU4RVzkBOT4gQ0A+ATlPKzU3IiQwD1QmWTQCATkQFhgRRTwVThFXOQE5PiBDQD4BOU8rNTciJDAPVCZZNAIBORAWGBFIPBVaEVQ8ATk+I0NGOwE5MCcrNTciJDMPYCZWNAIBORAWGBFCPBVbEWQ2ATk+HUM6OwE5TCs1NyIkLQ9hJmY0AgE5EBYYEUc8FVkRUjsBOT4iQ0Q5ATlRKzU3IiQyD18mVDQCATkQFhgRSzwVXhFUPwE5PiZDTDsBOTMnKzU3IiQ2D2QmVjQCATlLATlEHTgvATlBATk/GDMNUgE5TjM8PQE5Ri8bIQMBOTsuLTBPAgE5QQE5PxgPDWEBOUUBOUEaLkgBOTEmATlIIT0NYAmAngE5SDMZSjcBOUAvNBQBOTUgKk4kAgE5OiA/OUABOU47Fx0DATlDJDIsMD4CATkxJgE5SCEPDYCOATlHATlCGzguNQE5UQE5RyAPDYC0ATlJATlDHA8NgIsBOTMoATlKI0ErIQE5NwE5SDMNTwlbATlKMxlNOQE5Qi84QAE5Ny4tLFEiAgE5EEsoNxFbMQE5Pi8wNQE5My4tKDILXCICATlRATlHIA8NT1ABOTcsATlOJ0ErRwE5EFElFYDBOzoBOUQsQiUBOTkkMQ+AxDQhAgE5MygBOUojQCs4ATk4KT0ZSkIBOTQlOUolATlKLi0kNVAvAgE5OCk9GUpCATk0JTlKJQE5Si4tJDVQLwIBOTYrATlNJkArSQE5MSYBOUghDVEBOUsBOUQdP0kBOUczPDYBOT8vMjUwATk0Li0pTwIBOUcBOUIbSgE5MSYBOUghD0gpATk2KwE5TSYPQkgBOTInATlJIg8NZglXATksKzFORAE5Sy1OJQE5QDA3RSQCATk/ATlQLg19CVYBOVEBOUcgDzcJXgE5MSYBOUghPA1NSwE5LikzOkIBOUsvSiUBOUAuLTVNAgE5EBYVFVA9FVkLIx45IiwFRAE5PytELDJJATk4KC4tMSc7D1wNHB45IiwFMwIBOTkBOUo+ATk3ATlILUQBOU8BOUYfOlBJATlNATlFHg8NUjUBORBIJRVVMQE5OywwNgE5MCQoD1ghAgE5NSoBOUwlDzw1ATlRATlHIDtFPgE5EExEURlaTQE5TzxRMTdRATk9OCs1NzciJCRAD14mRQIBORAWFRYRTEYVgJpBATlIKE1QTgE5NTEuLS8vKzUiOA+AoiZBAgE5OS4BOVApQU4BOT8BOVAPUAloATlFATlBGjwNTglTATkxJgE5SCEPS0YBOUMBOUAZD0tMATk5ATlKD01OATlPATlGHzo/ATkQFg9HKBVQPQE5Si9IJQE5Py4tNA9TIgIBOTYrATlNJg8/CXgBORBHKEcRZC0BOTpOQQE5LyAkQAtpJAIBOU0zSzwBOUUvPj4wATk6Li0vQiICATk0KQE5SyQ7ATkQFhoMRTwVfBFkNgE5Ph1DOjcBOUxLE0gtD4CBZ0QCATkQFgxFKhVhNgE5RTE6NwE5OhNILQ9kLAIBOUcBOUIbOA1eRgE5PwE5UDgNWkYBOTInATlJIkQrRwE5UQE5RyBCATlRATlHID5RCWwBOS4pMxlIQgE5Sy9KJQE5QC4tNUwiAgE5EBYPRygVXj0BOUovSCUBOT8uLTQPYSICATlNATlFHjgxATkQFhUPSTYVaj4BOTglPUovMAE5Ti4tLy81D3EyAgE5QTM3MAE5OUwvMAE5Li4tI0oCATk/ATlQRQE5NwE5SC4sATlKM0Q5ATlCLxcdAwE5NyAsOyQCATlQNUc9ATlIMUA9ATk9MjA+JgIBOTsBOUxCATlBATk/GEMBOTsBOUw7ATkvATlADw1XCVsBORAWD0woURGAsEIBOU9QSTIEATlELi05TAuAsSICATkuKTNRQgE5Sy8gJgMBOUAuLTVIIgIBOS4pMxlIQgE5Sy9KTQE5QC4tNUwiAgE5LikzGUlCATlLL0pNATlALi01TSICATkzKAE5SiNCATlOM0o9ATlGL0AlATk7Li0wQSICATkQFhUPSjYVZz8BOTgmPUw7MAE5Ty4tLy82D2wyAgE5EBYVD082FWxEATk4Kz0sMkAwATk4IS4tLy87D3EyAgE5EBYVFg9NRBVsQgE5RilLKjA7MAE5Ni8uLS8vLy85D3NCAgE5EBYVD0w2FWlBATk4KD1QPjABOVEuLS8vOA9uMgIBORAWFRYYGQ9MGhkaHB0TGRWAqhFdQQE5DERQEEgxUD0BOTVQLi0vLys1Ny8vIiQ4D4C2JmETFhgXGRcKAgE5EBYVGBkPTRpKFYCWOkIBOQwaSTUeTiowPQE5NkIuLSs1Ny8vIiQ5D4CgJjUTFhcZFwoCATkQFhUPTDYVZkEBOTgoPVBMMAE5US4tLy84D2syAgE5EEs9GUU3ATlKORUbAwE5Py4tJCpLLwIBOU01UToBOUUxGB4DATk6Mi1IJgIBOTUBOUY2DVUBOUMBOUAZID8BOTUBOUY+UE8BOVEBOUcgIDYBORBKJRVNEVMzATk9LDQ7ATkyJCoPUAtWIQIBORAWEhUPSEAVXT0BOUIkR0g+MAE5MSskLi0vLzQPZD8CATk1ATlGMTgBOTcBOUgPS0YBOUUBOUEaOkQJXwE5MSYBOUghIDYBORAWEhMMQDsVXDUBOT0cQjg+MAE5SiQmJiwPYz8CATkQFhITDzo9FVwRVDABOT8XRC48MAE5RyQmLi0nD2NWPgIBOTUBOUZCOgE5PzBMMQE5N0s0ATksJCRDIQIBOUEBOT8YIDABOTcsATlOJw1gATlRATlHIEMBOU0BOUUeIDYBOTgjPUMyPAE5TzkaIAMBOUQuLSQvPCcvAgE5QQE5PxgNUUMBOTQpATlLJDg9ATk0KQE5SyRASAlvATk1KgE5TCVJDVkuATlLATlEHQ4NV0ABOUsBOUQdO0gBOTYrATlNJg9BCVYBOUI5R0tFF0cBOT41QzY8RwE5QicrNTciJEVFIjo0AgE5TwE5Rh8PSwlTATkuKDMZRkEBOUovSEQwATk/Li00SiICATk0KQE5SyQ+SQlSATk/ATlQNkMBOU0BOUUeN0EBOTQpATlLJCtGATlPATlGHzUgTwE5RTBFNwE5PSwVGwMBOTIkKjwhAgE5EBYMRiVKEW88ATlGLB4kAwE5OyQzRQtwIQIBOUgwPjoBOUAsGB4DATk1JC1QAgE5NisBOU0mK0gBOU8BOUYfOgE5OzABOVIrKw1gATlHMzw2ATk/LzI1MAE5NC4tKU8CATk7ATlMO0cBOTYrATlNJkZJATkQFhMUExMMQBpGFV4ZJDUBOQxCOE8XHQMBOSk+MDExKjE2MTYsD2IWIRMYGhcXFgoCATkQFhMUExMMQxpGFWAZJDgBOQxCO08aIAMBOSw+MDExKjE2MTYvD2QWIRMYGhcXFgoCATk7ATlMQwE5EBYYEUk8FWY9ATk+JENIRgE5MScrNTciJDQPbCY0AgE5QQE5PxggIgE5EBYYEVQ8FWNIATk+L0MwNkEBOTwnKzU3IiQ/D2kmNAIBOUI1RxlrTgE5PjFDMjhDATk+Jys1NyIkQQ9tJjQCATkQFhFJKxVdPgE5TjIgJgMBOUMrNSI1D2EmIwIBORAWEUErFVk2ATlGMhgeAwE5Oys1Ii0PXSYjAgE5OwE5TA9NLAE5QQE5PxgPDU0xATlBATk/GA8NTTEBOT0BOU4PUDEBOTEmATlIIUBMATk2KwE5TSYgMwE5QwE5QBkOMzUBOT0BOU4PMDUBOUMBOUAZNDkJaQE5QwE5QBk0PAE5TwE5Rh85PQE5PQE5Tg8NXi4BOS4pM05CATlLL0ohMjkLMAE5QC4tNUUiAgE5EBYPTygVXUUBOSosLy0zSwE5Ry4tPA9gIgIBOU4zST0BOUYvQDswATk7Li0wQCICATlOM0k9ATlGL0A7MAE5Oy4tMEAiAgE5TjNJPQE5Ri9AOzABOTsuLTBAIgIBORAWD04oFVhEATlRLywyMAE5Ri4tOw9bIgIBOUcBOUIbPgE5SzNOOgE5Qy86NwE5OC4tLUUiAgE5UDMZSj8BOUgvRDcBOT0uLTJOIgIBOUsBOUQdOitFATkQFhgRTTwVdUEBOT4oQ1BGATk1Jys1NyIkOA97JjQCATk6LwE5USogNQE5MSYBOUghDw1QTAE5MSYBOUghD0M5ATk9ATlOLwE5LiszGVBEATlNL05IATlCLi03D08iAgE5QQE5Pxg6OwE5TwE5Rh9KSgE5MDI1UEsBOSwuMS81QgE5SzI+RyYCATkQFhMMPzIVTjMBOUo5NEIwATk/MDEqD1M2AgE5EBYTDEAyFVJGNAE5Szk2PzABOUAwMSsPVz82AgE5QQE5PxgPQAllATk5ATlKDw1OJgE5SzFBPAE5Qy0+QzABOTgwLzgkAgE5LiozGUk+QwE5TC9MOwE5QS4tNk0zIgIBOUMBOUAZD0VEATlFMzk0ATk9Ly40MAE5Mi4tJ0wCATlNPTkyATlFORAWAwE5Oi4tJCUyLwIBOUMkSEM9ATk/IEQbIQMBOVAuLSQmMD4+AgE5MicBOUkiNUsBOS4uM0hHATlQUTElATlFLi06PyICATk1KgE5TCVDQQE5MygBOUojRCtGATk3LAE5TidEDVgBOT0BOU4OQDsBOUUBOUEaPkMBORAWFRE+OBVIEXgzATlQPzQ2ATlFLi0rNSIqD04mC3sxAgE5EBYVET44FUgRbzMBOVA/NDYBOUUuLSs1IioPTiYLcjECATkQFhURPjgVSBF4MwE5UD80NgE5RS4tKzUiKg9OJgt7MQIBOVEBOUcgPA2AiEABOUgzPTcBOUAvNDYBOTUgKjQkAgE5PR1CSjYBOU4+MjQBOUMyIClDNgIBORAWFQ9PNhVWRAE5OCs9LDIvMAE5OCEuLS8vOw9dMgIBOUY1KTMBOT4xERcDATkzMiZAAgE5TDNKOwE5RC88OgE5OSAuQSQCATlLATlEHTMzJAE5RwE5QhtARQE5QCFFGUk6ATk8HUE6QQE5SjIzLU86AgE5QwE5LU8BOUcwMzkBOT8sODgBOTQkLEUCATkuKDM4QQE5Si9IJQE5Py4tNEsCATk7ATlMUQE5OwE5TA81CWMBOT0BOU4zSQE5EBYXD1U6FVgRgKpIATk8L0EqMAMBOTwlMjM/D1uArjoCATlDATlAGQ9ISAE5QwE5QBlBDWIBOUMBOUAZN08BNnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9mYXN0YV9jb2Rlc19nZW5lcmF0ZWQuZGFydDJzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvc2V2ZXJpdHkuZGFydIUtLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuc2V2ZXJpdHk7CgplbnVtIFNldmVyaXR5IHsKICBjb250ZXh0LAogIGVycm9yLAogIGVycm9yTGVnYWN5V2FybmluZywKICBpZ25vcmVkLAogIGludGVybmFsUHJvYmxlbSwKICB3YXJuaW5nLAp9Cgpjb25zdCBNYXA8U3RyaW5nLCBTdHJpbmc+IHNldmVyaXR5RW51bU5hbWVzID0gY29uc3QgPFN0cmluZywgU3RyaW5nPnsKICAnQ09OVEVYVCc6ICdjb250ZXh0JywKICAnRVJST1InOiAnZXJyb3InLAogICdFUlJPUl9MRUdBQ1lfV0FSTklORyc6ICdlcnJvckxlZ2FjeVdhcm5pbmcnLAogICdJR05PUkVEJzogJ2lnbm9yZWQnLAogICdJTlRFUk5BTF9QUk9CTEVNJzogJ2ludGVybmFsUHJvYmxlbScsCiAgJ1dBUk5JTkcnOiAnd2FybmluZycsCn07Cgpjb25zdCBNYXA8U3RyaW5nLCBTZXZlcml0eT4gc2V2ZXJpdHlFbnVtVmFsdWVzID0gY29uc3QgPFN0cmluZywgU2V2ZXJpdHk+ewogICdDT05URVhUJzogU2V2ZXJpdHkuY29udGV4dCwKICAnRVJST1InOiBTZXZlcml0eS5lcnJvciwKICAnRVJST1JfTEVHQUNZX1dBUk5JTkcnOiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcsCiAgJ0lHTk9SRUQnOiBTZXZlcml0eS5pZ25vcmVkLAogICdJTlRFUk5BTF9QUk9CTEVNJzogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtLAogICdXQVJOSU5HJzogU2V2ZXJpdHkud2FybmluZywKfTsKCmNvbnN0IE1hcDxTZXZlcml0eSwgU3RyaW5nPiBzZXZlcml0eVByZWZpeGVzID0gY29uc3QgPFNldmVyaXR5LCBTdHJpbmc+ewogIFNldmVyaXR5LmVycm9yOiAiRXJyb3IiLAogIFNldmVyaXR5LmludGVybmFsUHJvYmxlbTogIkludGVybmFsIHByb2JsZW0iLAogIFNldmVyaXR5Lndhcm5pbmc6ICJXYXJuaW5nIiwKICBTZXZlcml0eS5jb250ZXh0OiAiQ29udGV4dCIsCn07Cgpjb25zdCBNYXA8U2V2ZXJpdHksIFN0cmluZz4gc2V2ZXJpdHlUZXh0cyA9IGNvbnN0IDxTZXZlcml0eSwgU3RyaW5nPnsKICBTZXZlcml0eS5lcnJvcjogImVycm9yIiwKICBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW06ICJpbnRlcm5hbCBwcm9ibGVtIiwKICBTZXZlcml0eS53YXJuaW5nOiAid2FybmluZyIsCiAgU2V2ZXJpdHkuY29udGV4dDogImNvbnRleHQiLAp9OwowAE5OPAEYARALCRYLEwsCAUYYFDAYKRgDAUsfGzcfMB8DAUkbMB8fAwFGGzAfHwMBKXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zZXZlcml0eS5kYXJ0OXNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9rZXJuZWxfZ2VuZXJhdG9yX2ltcGwuZGFydJpDLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBEZWZpbmVzIHRoZSBmcm9udC1lbmQgQVBJIGZvciBjb252ZXJ0aW5nIHNvdXJjZSBjb2RlIHRvIERhcnQgS2VybmVsIG9iamVjdHMuCmxpYnJhcnkgZnJvbnRfZW5kLmtlcm5lbF9nZW5lcmF0b3JfaW1wbDsKCmltcG9ydCAnZGFydDphc3luYycgc2hvdyBGdXR1cmU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2tlcm5lbC5kYXJ0JyBzaG93IENvbXBvbmVudCwgQ2Fub25pY2FsTmFtZTsKCmltcG9ydCAnYmFzZS9wcm9jZXNzZWRfb3B0aW9ucy5kYXJ0JyBzaG93IFByb2Nlc3NlZE9wdGlvbnM7CgppbXBvcnQgJ2Zhc3RhL2NvbXBpbGVyX2NvbnRleHQuZGFydCcgc2hvdyBDb21waWxlckNvbnRleHQ7CgppbXBvcnQgJ2Zhc3RhL2NyYXNoLmRhcnQnIHNob3cgd2l0aENyYXNoUmVwb3J0aW5nOwoKaW1wb3J0ICdmYXN0YS9kaWxsL2RpbGxfdGFyZ2V0LmRhcnQnIHNob3cgRGlsbFRhcmdldDsKCmltcG9ydCAnZmFzdGEva2VybmVsL2tlcm5lbF90YXJnZXQuZGFydCcgc2hvdyBLZXJuZWxUYXJnZXQ7CgppbXBvcnQgJ2Zhc3RhL2tlcm5lbC91dGlscy5kYXJ0JyBzaG93IHByaW50Q29tcG9uZW50VGV4dCwgc2VyaWFsaXplQ29tcG9uZW50OwoKaW1wb3J0ICdmYXN0YS9rZXJuZWwvdmVyaWZpZXIuZGFydCcgc2hvdyB2ZXJpZnlDb21wb25lbnQ7CgppbXBvcnQgJ2Zhc3RhL2xvYWRlci5kYXJ0JyBzaG93IExvYWRlcjsKCmltcG9ydCAnZmFzdGEvc2V2ZXJpdHkuZGFydCcgc2hvdyBTZXZlcml0eTsKCmltcG9ydCAnZmFzdGEvdXJpX3RyYW5zbGF0b3IuZGFydCcgc2hvdyBVcmlUcmFuc2xhdG9yOwoKLy8vIEltcGxlbWVudGF0aW9uIGZvciB0aGUKLy8vIGBwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS9rZXJuZWxfZ2VuZXJhdG9yLmRhcnRgIGFuZAovLy8gYHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfcHJvdG90eXBlL3N1bW1hcnlfZ2VuZXJhdG9yLmRhcnRgIEFQSXMuCkZ1dHVyZTxDb21waWxlclJlc3VsdD4gZ2VuZXJhdGVLZXJuZWwoUHJvY2Vzc2VkT3B0aW9ucyBvcHRpb25zLAogICAge2Jvb2wgYnVpbGRTdW1tYXJ5OiBmYWxzZSwKICAgIGJvb2wgYnVpbGRDb21wb25lbnQ6IHRydWUsCiAgICBib29sIHRydW5jYXRlU3VtbWFyeTogZmFsc2V9KSBhc3luYyB7CiAgcmV0dXJuIGF3YWl0IENvbXBpbGVyQ29udGV4dC5ydW5XaXRoT3B0aW9ucyhvcHRpb25zLCAoXykgYXN5bmMgewogICAgcmV0dXJuIGF3YWl0IGdlbmVyYXRlS2VybmVsSW50ZXJuYWwoCiAgICAgICAgYnVpbGRTdW1tYXJ5OiBidWlsZFN1bW1hcnksCiAgICAgICAgYnVpbGRDb21wb25lbnQ6IGJ1aWxkQ29tcG9uZW50LAogICAgICAgIHRydW5jYXRlU3VtbWFyeTogdHJ1bmNhdGVTdW1tYXJ5KTsKICB9KTsKfQoKRnV0dXJlPENvbXBpbGVyUmVzdWx0PiBnZW5lcmF0ZUtlcm5lbEludGVybmFsKAogICAge2Jvb2wgYnVpbGRTdW1tYXJ5OiBmYWxzZSwKICAgIGJvb2wgYnVpbGRDb21wb25lbnQ6IHRydWUsCiAgICBib29sIHRydW5jYXRlU3VtbWFyeTogZmFsc2V9KSBhc3luYyB7CiAgdmFyIG9wdGlvbnMgPSBDb21waWxlckNvbnRleHQuY3VycmVudC5vcHRpb25zOwogIHZhciBmcyA9IG9wdGlvbnMuZmlsZVN5c3RlbTsKCiAgTG9hZGVyIHNvdXJjZUxvYWRlcjsKICByZXR1cm4gd2l0aENyYXNoUmVwb3J0aW5nPENvbXBpbGVyUmVzdWx0PigoKSBhc3luYyB7CiAgICBVcmlUcmFuc2xhdG9yIHVyaVRyYW5zbGF0b3IgPSBhd2FpdCBvcHRpb25zLmdldFVyaVRyYW5zbGF0b3IoKTsKCiAgICB2YXIgZGlsbFRhcmdldCA9CiAgICAgICAgbmV3IERpbGxUYXJnZXQob3B0aW9ucy50aWNrZXIsIHVyaVRyYW5zbGF0b3IsIG9wdGlvbnMudGFyZ2V0KTsKCiAgICBTZXQ8VXJpPiBleHRlcm5hbExpYnMoQ29tcG9uZW50IGNvbXBvbmVudCkgewogICAgICByZXR1cm4gY29tcG9uZW50LmxpYnJhcmllcwogICAgICAgICAgLndoZXJlKChsaWIpID0+IGxpYi5pc0V4dGVybmFsKQogICAgICAgICAgLm1hcCgobGliKSA9PiBsaWIuaW1wb3J0VXJpKQogICAgICAgICAgLnRvU2V0KCk7CiAgICB9CgogICAgdmFyIHNka1N1bW1hcnkgPSBhd2FpdCBvcHRpb25zLmxvYWRTZGtTdW1tYXJ5KG51bGwpOwogICAgLy8gQnkgdXNpbmcgdGhlIG5hbWVSb290IG9mIHRoZSB0aGUgc3VtbWFyeSwgd2UgZW5hYmxlIHNoYXJpbmcgdGhlCiAgICAvLyBzZGtTdW1tYXJ5IGJldHdlZW4gbXVsdGlwbGUgaW52b2NhdGlvbnMuCiAgICBDYW5vbmljYWxOYW1lIG5hbWVSb290ID0gc2RrU3VtbWFyeT8ucm9vdCA/PyBuZXcgQ2Fub25pY2FsTmFtZS5yb290KCk7CiAgICBpZiAoc2RrU3VtbWFyeSAhPSBudWxsKSB7CiAgICAgIHZhciBleGNsdWRlZCA9IGV4dGVybmFsTGlicyhzZGtTdW1tYXJ5KTsKICAgICAgZGlsbFRhcmdldC5sb2FkZXIuYXBwZW5kTGlicmFyaWVzKHNka1N1bW1hcnksCiAgICAgICAgICBmaWx0ZXI6ICh1cmkpID0+ICFleGNsdWRlZC5jb250YWlucyh1cmkpKTsKICAgIH0KCiAgICAvLyBUT0RPKHNpZ211bmQpOiBwcm92aWRlIGJldHRlciBlcnJvciByZXBvcnRpbmcgaWYgaW5wdXQgc3VtbWFyaWVzIG9yCiAgICAvLyBsaW5rZWQgZGVwZW5kZW5jaWVzIHdlcmUgbGlzdGVkIG91dCBvZiBvcmRlciAob3IgcHJvdmlkZSBtZWNoYW5pc20gdG8KICAgIC8vIHNvcnQgdGhlbSkuCiAgICBmb3IgKHZhciBpbnB1dFN1bW1hcnkgaW4gYXdhaXQgb3B0aW9ucy5sb2FkSW5wdXRTdW1tYXJpZXMobmFtZVJvb3QpKSB7CiAgICAgIHZhciBleGNsdWRlZCA9IGV4dGVybmFsTGlicyhpbnB1dFN1bW1hcnkpOwogICAgICBkaWxsVGFyZ2V0LmxvYWRlci5hcHBlbmRMaWJyYXJpZXMoaW5wdXRTdW1tYXJ5LAogICAgICAgICAgZmlsdGVyOiAodXJpKSA9PiAhZXhjbHVkZWQuY29udGFpbnModXJpKSk7CiAgICB9CgogICAgLy8gQWxsIHN1bW1hcmllcyBhcmUgY29uc2lkZXJlZCBleHRlcm5hbCBhbmQgc2hvdWxkbid0IGluY2x1ZGUgc291cmNlLWluZm8uCiAgICBkaWxsVGFyZ2V0LmxvYWRlci5saWJyYXJpZXMuZm9yRWFjaCgobGliKSB7CiAgICAgIC8vIFRPRE8oYWhlKTogRG9uJ3QgZG8gdGhpcywgYW5kIHJlbW92ZSBbZXh0ZXJuYWxfc3RhdGVfc25hcHNob3QuZGFydF0uCiAgICAgIGxpYi5pc0V4dGVybmFsID0gdHJ1ZTsKICAgIH0pOwoKICAgIC8vIExpbmtlZCBkZXBlbmRlbmNpZXMgYXJlIG1lYW50IHRvIGJlIHBhcnQgb2YgdGhlIGNvbXBvbmVudCBzbyB0aGV5IGFyZSBub3QKICAgIC8vIG1hcmtlZCBleHRlcm5hbC4KICAgIGZvciAodmFyIGRlcGVuZGVuY3kgaW4gYXdhaXQgb3B0aW9ucy5sb2FkTGlua0RlcGVuZGVuY2llcyhuYW1lUm9vdCkpIHsKICAgICAgdmFyIGV4Y2x1ZGVkID0gZXh0ZXJuYWxMaWJzKGRlcGVuZGVuY3kpOwogICAgICBkaWxsVGFyZ2V0LmxvYWRlci5hcHBlbmRMaWJyYXJpZXMoZGVwZW5kZW5jeSwKICAgICAgICAgIGZpbHRlcjogKHVyaSkgPT4gIWV4Y2x1ZGVkLmNvbnRhaW5zKHVyaSkpOwogICAgfQoKICAgIGF3YWl0IGRpbGxUYXJnZXQuYnVpbGRPdXRsaW5lcygpOwoKICAgIHZhciBrZXJuZWxUYXJnZXQgPSBuZXcgS2VybmVsVGFyZ2V0KGZzLCBmYWxzZSwgZGlsbFRhcmdldCwgdXJpVHJhbnNsYXRvcik7CiAgICBzb3VyY2VMb2FkZXIgPSBrZXJuZWxUYXJnZXQubG9hZGVyOwogICAga2VybmVsVGFyZ2V0LnNldEVudHJ5UG9pbnRzKG9wdGlvbnMuaW5wdXRzKTsKICAgIENvbXBvbmVudCBzdW1tYXJ5Q29tcG9uZW50ID0KICAgICAgICBhd2FpdCBrZXJuZWxUYXJnZXQuYnVpbGRPdXRsaW5lcyhuYW1lUm9vdDogbmFtZVJvb3QpOwogICAgTGlzdDxpbnQ+IHN1bW1hcnkgPSBudWxsOwogICAgaWYgKGJ1aWxkU3VtbWFyeSkgewogICAgICBpZiAob3B0aW9ucy52ZXJpZnkpIHsKICAgICAgICBmb3IgKHZhciBlcnJvciBpbiB2ZXJpZnlDb21wb25lbnQoc3VtbWFyeUNvbXBvbmVudCkpIHsKICAgICAgICAgIG9wdGlvbnMucmVwb3J0KGVycm9yLCBTZXZlcml0eS5lcnJvcik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChvcHRpb25zLmRlYnVnRHVtcCkgewogICAgICAgIHByaW50Q29tcG9uZW50VGV4dChzdW1tYXJ5Q29tcG9uZW50LAogICAgICAgICAgICBsaWJyYXJ5RmlsdGVyOiBrZXJuZWxUYXJnZXQuaXNTb3VyY2VMaWJyYXJ5KTsKICAgICAgfQoKICAgICAgLy8gQ3JlYXRlIHRoZSByZXF1ZXN0ZWQgY29tcG9uZW50ICgidHJ1bmNhdGluZyIgb3Igbm90KS4KICAgICAgLy8KICAgICAgLy8gTm90ZTogd2UgZG9uJ3QgcGFzcyB0aGUgbGlicmFyeSBhcmd1bWVudCB0byB0aGUgY29uc3RydWN0b3IgdG8KICAgICAgLy8gcHJlc2VydmUgdGhlIHRoZSBsaWJyYXJpZXMgcGFyZW50IHBvaW50ZXIgKGl0IHNob3VsZCBjb250aW51ZSB0byBwb2ludAogICAgICAvLyB0byB0aGUgY29tcG9uZW50IHdpdGhpbiBLZXJuZWxUYXJnZXQpLgogICAgICB2YXIgdHJpbW1lZFN1bW1hcnlDb21wb25lbnQgPQogICAgICAgICAgbmV3IENvbXBvbmVudChuYW1lUm9vdDogc3VtbWFyeUNvbXBvbmVudC5yb290KQogICAgICAgICAgICAuLmxpYnJhcmllcy5hZGRBbGwodHJ1bmNhdGVTdW1tYXJ5CiAgICAgICAgICAgICAgICA/IGtlcm5lbFRhcmdldC5sb2FkZXIubGlicmFyaWVzCiAgICAgICAgICAgICAgICA6IHN1bW1hcnlDb21wb25lbnQubGlicmFyaWVzKTsKICAgICAgdHJpbW1lZFN1bW1hcnlDb21wb25lbnQubWV0YWRhdGEuYWRkQWxsKHN1bW1hcnlDb21wb25lbnQubWV0YWRhdGEpOwogICAgICB0cmltbWVkU3VtbWFyeUNvbXBvbmVudC51cmlUb1NvdXJjZS5hZGRBbGwoc3VtbWFyeUNvbXBvbmVudC51cmlUb1NvdXJjZSk7CgogICAgICAvLyBBcyBkb2N1bWVudGVkLCB3ZSBvbmx5IHJ1biBvdXRsaW5lIHRyYW5zZm9ybWF0aW9ucyB3aGVuIHdlIGFyZSBidWlsZGluZwogICAgICAvLyBzdW1tYXJpZXMgd2l0aG91dCBidWlsZGluZyBhIGZ1bGwgY29tcG9uZW50IChhdCB0aGlzIHRpbWUsIHRoYXQncwogICAgICAvLyB0aGUgb25seSBuZWVkIHdlIGhhdmUgZm9yIHRoZXNlIHRyYW5zZm9ybWF0aW9ucykuCiAgICAgIGlmICghYnVpbGRDb21wb25lbnQpIHsKICAgICAgICBvcHRpb25zLnRhcmdldC5wZXJmb3JtT3V0bGluZVRyYW5zZm9ybWF0aW9ucyh0cmltbWVkU3VtbWFyeUNvbXBvbmVudCk7CiAgICAgICAgb3B0aW9ucy50aWNrZXIubG9nTXMoIlRyYW5zZm9ybWVkIG91dGxpbmUiKTsKICAgICAgfQogICAgICAvLyBEb24ndCBpbmNsdWRlIHNvdXJjZSAoYnV0IGRvIGFkZCBpdCBhYm92ZSB0byBpbmNsdWRlIGltcG9ydFVyaXMpLgogICAgICBzdW1tYXJ5ID0KICAgICAgICAgIHNlcmlhbGl6ZUNvbXBvbmVudCh0cmltbWVkU3VtbWFyeUNvbXBvbmVudCwgaW5jbHVkZVNvdXJjZXM6IGZhbHNlKTsKICAgICAgb3B0aW9ucy50aWNrZXIubG9nTXMoIkdlbmVyYXRlZCBvdXRsaW5lIik7CiAgICB9CgogICAgQ29tcG9uZW50IGNvbXBvbmVudDsKICAgIGlmIChidWlsZENvbXBvbmVudCkgewogICAgICBjb21wb25lbnQgPSBhd2FpdCBrZXJuZWxUYXJnZXQuYnVpbGRDb21wb25lbnQodmVyaWZ5OiBvcHRpb25zLnZlcmlmeSk7CiAgICAgIGlmIChvcHRpb25zLmRlYnVnRHVtcCkgewogICAgICAgIHByaW50Q29tcG9uZW50VGV4dChjb21wb25lbnQsCiAgICAgICAgICAgIGxpYnJhcnlGaWx0ZXI6IGtlcm5lbFRhcmdldC5pc1NvdXJjZUxpYnJhcnkpOwogICAgICB9CiAgICAgIG9wdGlvbnMudGlja2VyLmxvZ01zKCJHZW5lcmF0ZWQgY29tcG9uZW50Iik7CiAgICB9CgogICAgcmV0dXJuIG5ldyBDb21waWxlclJlc3VsdCgKICAgICAgICBzdW1tYXJ5OiBzdW1tYXJ5LAogICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50LAogICAgICAgIGRlcHM6IG5ldyBMaXN0PFVyaT4uZnJvbShDb21waWxlckNvbnRleHQuY3VycmVudC5kZXBlbmRlbmNpZXMpKTsKICB9LCAoKSA9PiBzb3VyY2VMb2FkZXI/LmN1cnJlbnRVcmlGb3JDcmFzaFJlcG9ydGluZyA/PyBvcHRpb25zLmlucHV0cy5maXJzdCk7Cn0KCi8vLyBSZXN1bHQgb2JqZWN0IG9mIFtnZW5lcmF0ZUtlcm5lbF0uCmNsYXNzIENvbXBpbGVyUmVzdWx0IHsKICAvLy8gVGhlIGdlbmVyYXRlZCBzdW1tYXJ5IGJ5dGVzLCBpZiBpdCB3YXMgcmVxdWVzdGVkLgogIGZpbmFsIExpc3Q8aW50PiBzdW1tYXJ5OwoKICAvLy8gVGhlIGdlbmVyYXRlZCBjb21wb25lbnQsIGlmIGl0IHdhcyByZXF1ZXN0ZWQuCiAgZmluYWwgQ29tcG9uZW50IGNvbXBvbmVudDsKCiAgLy8vIERlcGVuZGVuY2llcyB0cmF2ZXJzZWQgYnkgdGhlIGNvbXBpbGVyLiBVc2VkIG9ubHkgZm9yIGdlbmVyYXRpbmcKICAvLy8gZGVwZW5kZW5jeSAuR04gZmlsZXMgaW4gdGhlIGRhcnQtc2RrIGJ1aWxkIHN5c3RlbS4KICAvLy8gTm90ZSB0aGlzIG1pZ2h0IGJlIHJlbW92ZWQgd2hlbiB3ZSBzd2l0Y2ggdG8gY29tcHV0ZSBkZXBlbmNlbmNpZXMgd2l0aG91dAogIC8vLyB1c2luZyB0aGUgY29tcGlsZXIgaXRzZWxmLgogIGZpbmFsIExpc3Q8VXJpPiBkZXBzOwoKICBDb21waWxlclJlc3VsdCh7dGhpcy5zdW1tYXJ5LCB0aGlzLmNvbXBvbmVudCwgdGhpcy5kZXBzfSk7Cn0KgLQATk48AVEpASEBQwE8ATsBMwE2ATwBTgE6ASgBLAE3ARtER0AfHypDKSQoKwYCAS8fHyoxHwEXN0QBFUcBMSEqJxQGATlHMEseLzQ1BgFLTRNLMTY1BgFQME4dCAFRGEsvNDUGASYBTygxIT4eGBw/MQoIHy06CAE/CUhQMCQ5LzAvSlABUUs7HU81CEsQTjEGARkaTR8mOggzBgEfGh5JTwIBJxc4GwE0HQFHOVAhGAE9AgEwcGFja2FnZTpmcm9udF9lbmQvc3JjL2tlcm5lbF9nZW5lcmF0b3JfaW1wbC5kYXJ0MXNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zY2FubmVyLmRhcnSMIS8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UubWQgZmlsZS4KCmxpYnJhcnkgZmFzdGEuc2Nhbm5lcjsKCmltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IHVuaWNvZGVSZXBsYWNlbWVudENoYXJhY3RlclJ1bmUsIHV0Zjg7CgppbXBvcnQgJy4uL3NjYW5uZXIvdG9rZW4uZGFydCcgc2hvdyBUb2tlbjsKCmltcG9ydCAnc2Nhbm5lci9zdHJpbmdfc2Nhbm5lci5kYXJ0JyBzaG93IFN0cmluZ1NjYW5uZXI7CgppbXBvcnQgJ3NjYW5uZXIvdXRmOF9ieXRlc19zY2FubmVyLmRhcnQnIHNob3cgVXRmOEJ5dGVzU2Nhbm5lcjsKCmltcG9ydCAnc2Nhbm5lci9yZWNvdmVyLmRhcnQnIHNob3cgZGVmYXVsdFJlY292ZXJ5U3RyYXRlZ3k7CgpleHBvcnQgJ3NjYW5uZXIvdG9rZW4uZGFydCcKICAgIHNob3cKICAgICAgICBTdHJpbmdUb2tlbiwKICAgICAgICBpc0JpbmFyeU9wZXJhdG9yLAogICAgICAgIGlzTWludXNPcGVyYXRvciwKICAgICAgICBpc1Rlcm5hcnlPcGVyYXRvciwKICAgICAgICBpc1VuYXJ5T3BlcmF0b3IsCiAgICAgICAgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I7CgpleHBvcnQgJ3NjYW5uZXIvZXJyb3JfdG9rZW4uZGFydCcKICAgIHNob3cgRXJyb3JUb2tlbiwgYnVpbGRVbmV4cGVjdGVkQ2hhcmFjdGVyVG9rZW47CgpleHBvcnQgJ3NjYW5uZXIvdG9rZW5fY29uc3RhbnRzLmRhcnQnIHNob3cgRU9GX1RPS0VOOwoKZXhwb3J0ICdzY2FubmVyL3V0ZjhfYnl0ZXNfc2Nhbm5lci5kYXJ0JyBzaG93IFV0ZjhCeXRlc1NjYW5uZXI7CgpleHBvcnQgJ3NjYW5uZXIvc3RyaW5nX3NjYW5uZXIuZGFydCcgc2hvdyBTdHJpbmdTY2FubmVyOwoKZXhwb3J0ICcuLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgS2V5d29yZCwgVG9rZW47Cgpjb25zdCBpbnQgdW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyID0gdW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyUnVuZTsKCnR5cGVkZWYgVG9rZW4gUmVjb3ZlcihMaXN0PGludD4gYnl0ZXMsIFRva2VuIHRva2VucywgTGlzdDxpbnQ+IGxpbmVTdGFydHMpOwoKYWJzdHJhY3QgY2xhc3MgU2Nhbm5lciB7CiAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cmVkIGR1cmluZyBbdG9rZW5pemVdLgogIGJvb2wgZ2V0IGhhc0Vycm9yczsKCiAgTGlzdDxpbnQ+IGdldCBsaW5lU3RhcnRzOwoKICBUb2tlbiB0b2tlbml6ZSgpOwp9CgpjbGFzcyBTY2FubmVyUmVzdWx0IHsKICBmaW5hbCBUb2tlbiB0b2tlbnM7CiAgZmluYWwgTGlzdDxpbnQ+IGxpbmVTdGFydHM7CiAgZmluYWwgYm9vbCBoYXNFcnJvcnM7CgogIFNjYW5uZXJSZXN1bHQodGhpcy50b2tlbnMsIHRoaXMubGluZVN0YXJ0cywgdGhpcy5oYXNFcnJvcnMpOwp9CgovLy8gU2Nhbi90b2tlbml6ZSB0aGUgZ2l2ZW4gVVRGOCBbYnl0ZXNdLgovLy8gSWYgW3JlY292ZXJdIGlzIG51bGwsIHRoZW4gdGhlIFtkZWZhdWx0UmVjb3ZlcnlTdHJhdGVneV0gaXMgdXNlZC4KU2Nhbm5lclJlc3VsdCBzY2FuKExpc3Q8aW50PiBieXRlcywKICAgIHtib29sIGluY2x1ZGVDb21tZW50czogZmFsc2UsIFJlY292ZXIgcmVjb3Zlcn0pIHsKICBpZiAoYnl0ZXMubGFzdCAhPSAwKSB7CiAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiW2J5dGVzXTogdGhlIGxhc3QgYnl0ZSBtdXN0IGJlIG51bGwuIik7CiAgfQogIFNjYW5uZXIgc2Nhbm5lciA9CiAgICAgIG5ldyBVdGY4Qnl0ZXNTY2FubmVyKGJ5dGVzLCBpbmNsdWRlQ29tbWVudHM6IGluY2x1ZGVDb21tZW50cyk7CiAgcmV0dXJuIF90b2tlbml6ZUFuZFJlY292ZXIoc2Nhbm5lciwgcmVjb3ZlciwgYnl0ZXM6IGJ5dGVzKTsKfQoKLy8vIFNjYW4vdG9rZW5pemUgdGhlIGdpdmVuIFtzb3VyY2VdLgovLy8gSWYgW3JlY292ZXJdIGlzIG51bGwsIHRoZW4gdGhlIFtkZWZhdWx0UmVjb3ZlcnlTdHJhdGVneV0gaXMgdXNlZC4KU2Nhbm5lclJlc3VsdCBzY2FuU3RyaW5nKFN0cmluZyBzb3VyY2UsCiAgICB7Ym9vbCBlbmFibGVHdEd0R3Q6IGZhbHNlLAogICAgYm9vbCBlbmFibGVHdEd0R3RFcTogZmFsc2UsCiAgICBib29sIGluY2x1ZGVDb21tZW50czogZmFsc2UsCiAgICBib29sIHNjYW5MYXp5QXNzaWdubWVudE9wZXJhdG9yczogZmFsc2UsCiAgICBSZWNvdmVyIHJlY292ZXJ9KSB7CiAgLy8gVE9ETyhicmlhbndpbGtlcnNvbik6IFJlbW92ZSB0aGUgcGFyYW1ldGVyIGBlbmFibGVHdEd0R3RgIGFmdGVyIHRoZSBmZWF0dXJlCiAgLy8gaGFzIGJlZW4gYW5hYmxlZCBieSBkZWZhdWx0LgogIGFzc2VydChzb3VyY2UgIT0gbnVsbCwgJ3NvdXJjZSBtdXN0IG5vdCBiZSBudWxsJyk7CiAgU3RyaW5nU2Nhbm5lciBzY2FubmVyID0KICAgICAgbmV3IFN0cmluZ1NjYW5uZXIoc291cmNlLCBpbmNsdWRlQ29tbWVudHM6IGluY2x1ZGVDb21tZW50cyk7CiAgc2Nhbm5lci5lbmFibGVHdEd0R3QgPSBlbmFibGVHdEd0R3Q7CiAgc2Nhbm5lci5lbmFibGVHdEd0R3RFcSA9IGVuYWJsZUd0R3RHdEVxOwogIHJldHVybiBfdG9rZW5pemVBbmRSZWNvdmVyKHNjYW5uZXIsIHJlY292ZXIsIHNvdXJjZTogc291cmNlKTsKfQoKU2Nhbm5lclJlc3VsdCBfdG9rZW5pemVBbmRSZWNvdmVyKFNjYW5uZXIgc2Nhbm5lciwgUmVjb3ZlciByZWNvdmVyLAogICAge0xpc3Q8aW50PiBieXRlcywgU3RyaW5nIHNvdXJjZX0pIHsKICBUb2tlbiB0b2tlbnMgPSBzY2FubmVyLnRva2VuaXplKCk7CiAgaWYgKHNjYW5uZXIuaGFzRXJyb3JzKSB7CiAgICBpZiAoYnl0ZXMgPT0gbnVsbCkgYnl0ZXMgPSB1dGY4LmVuY29kZShzb3VyY2UpOwogICAgcmVjb3ZlciA/Pz0gZGVmYXVsdFJlY292ZXJ5U3RyYXRlZ3k7CiAgICB0b2tlbnMgPSByZWNvdmVyKGJ5dGVzLCB0b2tlbnMsIHNjYW5uZXIubGluZVN0YXJ0cyk7CiAgfQogIHJldHVybiBuZXcgU2Nhbm5lclJlc3VsdCh0b2tlbnMsIHNjYW5uZXIubGluZVN0YXJ0cywgc2Nhbm5lci5oYXNFcnJvcnMpOwp9CmMATU4/ARcBQgErATkBQAE8ARwJFRoZGxkhASI0ATYBQAE5ATQBSQFMARk6FgEcARQCARYWHhgBPwIBKkYkNhlFBBRFPgIBJkYoHyAhLRhRIjUaQycrQAIBRCglGzQpOQRLAgEocGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NjYW5uZXIuZGFydD9zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvYXBpX3Vuc3RhYmxlL2NvbXBpbGVyX3N0YXRlLmRhcnSGHi8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uL2FwaV9wcm90b3R5cGUvY29tcGlsZXJfb3B0aW9ucy5kYXJ0JyBzaG93IENvbXBpbGVyT3B0aW9uczsKCmltcG9ydCAnLi4vYmFzZS9wcm9jZXNzZWRfb3B0aW9ucy5kYXJ0JyBzaG93IFByb2Nlc3NlZE9wdGlvbnM7CgppbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9pbmNyZW1lbnRhbF9jb21waWxlci5kYXJ0JwogICAgc2hvdyBJbmNyZW1lbnRhbENvbXBpbGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9rZXJuZWwuZGFydCcgc2hvdyBDb21wb25lbnQ7CgpjbGFzcyBJbml0aWFsaXplZENvbXBpbGVyU3RhdGUgewogIGZpbmFsIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zOwogIGZpbmFsIFByb2Nlc3NlZE9wdGlvbnMgcHJvY2Vzc2VkT3B0czsKICBmaW5hbCBNYXA8VXJpLCBXb3JrZXJJbnB1dENvbXBvbmVudD4gd29ya2VySW5wdXRDYWNoZTsKICBmaW5hbCBJbmNyZW1lbnRhbENvbXBpbGVyIGluY3JlbWVudGFsQ29tcGlsZXI7CgogIEluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZSh0aGlzLm9wdGlvbnMsIHRoaXMucHJvY2Vzc2VkT3B0cywKICAgICAge3RoaXMud29ya2VySW5wdXRDYWNoZSwgdGhpcy5pbmNyZW1lbnRhbENvbXBpbGVyfSk7Cn0KCi8vLyBBIGNhY2hlZCBbQ29tcG9uZW50XSBmb3IgYSBzdW1tYXJ5IGlucHV0IGZpbGUuCi8vLwovLy8gVHJhY2tzIHRoZSBvcmlnaW5hbGx5IG1hcmtlZCAiZXh0ZXJuYWwiIGxpYnMgc28gdGhhdCB0aGV5IGNhbiBiZSByZXN0b3JlZCwKLy8vIHNpbmNlIHRoZSBrZXJuZWwgZ2VuZXJhdG9yIG11dGF0ZXMgdGhlIHN0YXRlLgpjbGFzcyBXb3JrZXJJbnB1dENvbXBvbmVudCB7CiAgZmluYWwgTGlzdDxpbnQ+IGRpZ2VzdDsKICBmaW5hbCBDb21wb25lbnQgY29tcG9uZW50OwogIGZpbmFsIFNldDxVcmk+IGV4dGVybmFsTGliczsKICBXb3JrZXJJbnB1dENvbXBvbmVudCh0aGlzLmRpZ2VzdCwgdGhpcy5jb21wb25lbnQpCiAgICAgIDogZXh0ZXJuYWxMaWJzID0gY29tcG9uZW50LmxpYnJhcmllcwogICAgICAgICAgICAud2hlcmUoKGxpYikgPT4gbGliLmlzRXh0ZXJuYWwpCiAgICAgICAgICAgIC5tYXAoKGxpYikgPT4gbGliLmltcG9ydFVyaSkKICAgICAgICAgICAgLnRvU2V0KCk7Cn0KCmJvb2wgZGlnZXN0c0VxdWFsKExpc3Q8aW50PiBhLCBMaXN0PGludD4gYikgewogIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CiAgICBpZiAoYVtpXSAhPSBiW2ldKSByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiB0cnVlOwp9CjAATk48AUYBPwE/HgE0ASEhKDkxAT06AgEzBE8yHRodHzQrLCkWAgEuLConJAQPAgE2cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV91bnN0YWJsZS9jb21waWxlcl9zdGF0ZS5kYXJ0QnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9hcGlfcHJvdG90eXBlL2tlcm5lbF9nZW5lcmF0b3IuZGFydI4ULy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBEZWZpbmVzIHRoZSBmcm9udC1lbmQgQVBJIGZvciBjb252ZXJ0aW5nIHNvdXJjZSBjb2RlIHRvIERhcnQgS2VybmVsIG9iamVjdHMuCmxpYnJhcnkgZnJvbnRfZW5kLmtlcm5lbF9nZW5lcmF0b3I7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnIHNob3cgRnV0dXJlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9rZXJuZWwuZGFydCcgc2hvdyBDb21wb25lbnQ7CgppbXBvcnQgJy4uL2Jhc2UvcHJvY2Vzc2VkX29wdGlvbnMuZGFydCcgc2hvdyBQcm9jZXNzZWRPcHRpb25zOwoKaW1wb3J0ICcuLi9mYXN0YS9jb21waWxlcl9jb250ZXh0LmRhcnQnIHNob3cgQ29tcGlsZXJDb250ZXh0OwoKaW1wb3J0ICcuLi9mYXN0YS9mYXN0YV9jb2Rlcy5kYXJ0JyBzaG93IG1lc3NhZ2VNaXNzaW5nTWFpbiwgbm9MZW5ndGg7CgppbXBvcnQgJy4uL2Zhc3RhL3NldmVyaXR5LmRhcnQnIHNob3cgU2V2ZXJpdHk7CgppbXBvcnQgJy4uL2tlcm5lbF9nZW5lcmF0b3JfaW1wbC5kYXJ0JwogICAgc2hvdyBnZW5lcmF0ZUtlcm5lbCwgZ2VuZXJhdGVLZXJuZWxJbnRlcm5hbDsKCmltcG9ydCAnY29tcGlsZXJfb3B0aW9ucy5kYXJ0JyBzaG93IENvbXBpbGVyT3B0aW9uczsKCi8vLyBHZW5lcmF0ZXMgYSBrZXJuZWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb2dyYW0gd2hvc2UgbWFpbiBsaWJyYXJ5IGlzIGluCi8vLyB0aGUgZ2l2ZW4gW3NvdXJjZV0uCi8vLwovLy8gSW50ZW5kZWQgZm9yIHdob2xlLXByb2dyYW0gKG5vbi1tb2R1bGFyKSBjb21waWxhdGlvbi4KLy8vCi8vLyBHaXZlbiB0aGUgVXJpIG9mIGEgZmlsZSBjb250YWluaW5nIGEgcHJvZ3JhbSdzIGBtYWluYCBtZXRob2QsIHRoaXMgZnVuY3Rpb24KLy8vIGZvbGxvd3MgYGltcG9ydGAsIGBleHBvcnRgLCBhbmQgYHBhcnRgIGRlY2xhcmF0aW9ucyB0byBkaXNjb3ZlciB0aGUgd2hvbGUKLy8vIHByb2dyYW0sIGFuZCBjb252ZXJ0cyB0aGUgcmVzdWx0IHRvIERhcnQgS2VybmVsIGZvcm1hdC4KLy8vCi8vLyBJZiBgY29tcGlsZVNka2AgaW4gW29wdGlvbnNdIGlzIHRydWUsIHRoZSBnZW5lcmF0ZWQgY29tcG9uZW50IHdpbGwgaW5jbHVkZQovLy8gY29kZSBmb3IgdGhlIFNESy4KLy8vCi8vLyBJZiBzdW1tYXJpZXMgYXJlIHByb3ZpZGVkIGluIFtvcHRpb25zXSwgdGhlIGNvbXBpbGVyIHdpbGwgdXNlIHRoZW0gaW5zdGVhZAovLy8gb2YgY29tcGlsaW5nIHRoZSBsaWJyYXJpZXMgY29udGFpbmVkIGluIHRob3NlIHN1bW1hcmllcy4gVGhpcyBpcyB1c2VmdWwsIGZvcgovLy8gZXhhbXBsZSwgd2hlbiBjb21waWxpbmcgZm9yIHBsYXRmb3JtcyB0aGF0IGFscmVhZHkgZW1iZWQgdGhvc2Ugc291cmNlcyAobGlrZQovLy8gdGhlIHNkayBpbiB0aGUgc3RhbmRhbG9uZSBWTSkuCi8vLwovLy8gVGhlIGlucHV0IFtzb3VyY2VdIGlzIGV4cGVjdGVkIHRvIGJlIGEgc2NyaXB0IHdpdGggYSBtYWluIG1ldGhvZCwgb3RoZXJ3aXNlCi8vLyBhbiBlcnJvciBpcyByZXBvcnRlZC4KLy8gVE9ETyhzaWdtdW5kKTogcmVuYW1lIHRvIGtlcm5lbEZvclNjcmlwdD8KRnV0dXJlPENvbXBvbmVudD4ga2VybmVsRm9yUHJvZ3JhbShVcmkgc291cmNlLCBDb21waWxlck9wdGlvbnMgb3B0aW9ucykgYXN5bmMgewogIHZhciBwT3B0aW9ucyA9IG5ldyBQcm9jZXNzZWRPcHRpb25zKG9wdGlvbnM6IG9wdGlvbnMsIGlucHV0czogW3NvdXJjZV0pOwogIHJldHVybiBhd2FpdCBDb21waWxlckNvbnRleHQucnVuV2l0aE9wdGlvbnMocE9wdGlvbnMsIChjb250ZXh0KSBhc3luYyB7CiAgICB2YXIgY29tcG9uZW50ID0gKGF3YWl0IGdlbmVyYXRlS2VybmVsSW50ZXJuYWwoKSk/LmNvbXBvbmVudDsKICAgIGlmIChjb21wb25lbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CgogICAgaWYgKGNvbXBvbmVudC5tYWluTWV0aG9kID09IG51bGwpIHsKICAgICAgY29udGV4dC5vcHRpb25zLnJlcG9ydCgKICAgICAgICAgIG1lc3NhZ2VNaXNzaW5nTWFpbi53aXRoTG9jYXRpb24oc291cmNlLCAtMSwgbm9MZW5ndGgpLAogICAgICAgICAgU2V2ZXJpdHkuZXJyb3IpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBjb21wb25lbnQ7CiAgfSk7Cn0KCi8vLyBHZW5lcmF0ZXMgYSBrZXJuZWwgcmVwcmVzZW50YXRpb24gZm9yIGEgYnVpbGQgdW5pdCBjb250YWluaW5nIFtzb3VyY2VzXS4KLy8vCi8vLyBBIGJ1aWxkIHVuaXQgaXMgYSBjb2xsZWN0aW9uIG9mIGxpYnJhcmllcyB0aGF0IGFyZSBjb21waWxlZCB0b2dldGhlci4KLy8vIExpYnJhcmllcyBpbiB0aGUgYnVpbGQgdW5pdCBtYXkgZGVwZW5kIG9uIGVhY2ggb3RoZXIgYW5kIG1heSBoYXZlCi8vLyBkZXBlbmRlbmNpZXMgdG8gbGlicmFyaWVzIGluIG90aGVyIGJ1aWxkIHVuaXRzLiBVbmxpbmtlIGxpYnJhcnkKLy8vIGRlcGVuZGVuY2llcywgYnVpbGQgdW5pdCBkZXBlbmRlbmNpZXMgbXVzdCBiZSBhY3ljbGljLgovLy8KLy8vIFRoaXMgQVBJIGlzIGludGVuZGVkIGZvciBtb2R1bGFyIGNvbXBpbGF0aW9uLiBEZXBlbmRlbmNpZXMgdG8gb3RoZXIgYnVpbGQKLy8vIHVuaXRzIGFyZSBzcGVjaWZpZWQgdXNpbmcgW0NvbXBpbGVyT3B0aW9ucy5pbnB1dFN1bW1hcmllc10uICBBbnkgZGVwZW5kZW5jeQovLy8gb2YgW3NvdXJjZXNdIHRoYXQgaXMgbm90IGxpc3RlZCBpbiBbQ29tcGlsZXJPcHRpb25zLmlucHV0U3VtbWFyaWVzXSBhbmQKLy8vIFtDb21waWxlck9wdGlvbnMuc2RrU3VtbWFyeV0gaXMgdHJlYXRlZCBhcyBhbiBhZGRpdGlvbmFsIHNvdXJjZSBmaWxlIGZvciB0aGUKLy8vIGJ1aWxkIHVuaXQuCi8vLwovLy8gQW55IGBwYXJ0YCBkZWNsYXJhdGlvbnMgZm91bmQgaW4gW3NvdXJjZXNdIG11c3QgcmVmZXIgdG8gcGFydCBmaWxlcyB3aGljaAovLy8gYXJlIGFsc28gbGlzdGVkIGluIHRoZSBidWlsZCB1bml0IHNvdXJjZXMsIG90aGVyd2lzZSBhbiBlcnJvciByZXN1bHRzLiAgKEl0Ci8vLyBpcyBub3QgcGVybWl0dGVkIHRvIHJlZmVyIHRvIGEgcGFydCBmaWxlIGRlY2xhcmVkIGluIGFub3RoZXIgYnVpbGQgdW5pdCkuCi8vLwovLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBhIFtDb21wb25lbnRdIG9iamVjdCB3aXRoIG5vIG1haW4gbWV0aG9kIHNldC4gVGhlCi8vLyBbQ29tcG9uZW50XSBpbmNsdWRlcyBleHRlcm5hbCBsaWJyYXJpZXMgZm9yIHRob3NlIGxpYnJhcmllcyBsb2FkZWQgdGhyb3VnaAovLy8gc3VtbWFyaWVzLgpGdXR1cmU8Q29tcG9uZW50PiBrZXJuZWxGb3JDb21wb25lbnQoCiAgICBMaXN0PFVyaT4gc291cmNlcywgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMpIGFzeW5jIHsKICByZXR1cm4gKGF3YWl0IGdlbmVyYXRlS2VybmVsKAogICAgICAgICAgbmV3IFByb2Nlc3NlZE9wdGlvbnMob3B0aW9uczogb3B0aW9ucywgaW5wdXRzOiBzb3VyY2VzKSkpCiAgICAgID8uY29tcG9uZW50Owp9ClgATk48AVEkASEBNAE/AT4BRgEvAScxATUBThgEOgRQTjwETxYET1FRIwRQGi1QS0pBKAEoHkEbEwYWBgIBTQRKRkQ7BE5QTFEQBE5QTgRKTw8mOCBEEwIBOXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfcHJvdG90eXBlL2tlcm5lbF9nZW5lcmF0b3IuZGFydEZzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvYXBpX3Byb3RvdHlwZS9zdGFuZGFyZF9maWxlX3N5c3RlbS5kYXJ0jRcvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmcm9udF9lbmQuc3RhbmRhcmRfZmlsZV9zeXN0ZW07CgppbXBvcnQgJ2RhcnQ6YXN5bmMnOwppbXBvcnQgJ2RhcnQ6aW8nIGFzIGlvOwoKaW1wb3J0ICdmaWxlX3N5c3RlbS5kYXJ0JzsKCmltcG9ydCAnLi4vZmFzdGEvY29tcGlsZXJfY29udGV4dC5kYXJ0JyBzaG93IENvbXBpbGVyQ29udGV4dDsKCi8vLyBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBbRmlsZVN5c3RlbV0gaGFuZGxpbmcgc3RhbmRhcmQgVVJJIHNjaGVtZXMuCi8vLwovLy8gZmlsZTogVVJJcyBhcmUgaGFuZGxlZCB1c2luZyBmaWxlIEkvTy4KLy8vIGRhdGE6IFVSSXMgcmV0dXJuIHRoZWlyIGRhdGEgY29udGVudHMuCi8vLwovLy8gTm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIG9yIGV4dGVuZGVkIGJ5IGNsaWVudHMuCmNsYXNzIFN0YW5kYXJkRmlsZVN5c3RlbSBpbXBsZW1lbnRzIEZpbGVTeXN0ZW0gewogIHN0YXRpYyBmaW5hbCBTdGFuZGFyZEZpbGVTeXN0ZW0gaW5zdGFuY2UgPSBuZXcgU3RhbmRhcmRGaWxlU3lzdGVtLl8oKTsKCiAgU3RhbmRhcmRGaWxlU3lzdGVtLl8oKTsKCiAgQG92ZXJyaWRlCiAgRmlsZVN5c3RlbUVudGl0eSBlbnRpdHlGb3JVcmkoVXJpIHVyaSkgewogICAgaWYgKHVyaS5zY2hlbWUgPT0gJ2ZpbGUnIHx8IHVyaS5zY2hlbWUgPT0gJycpIHsKICAgICAgLy8gVE9ETyhhc2tlc2MpOiBFbXB0eSBzY2hlbWVzIHNob3VsZCBoYXZlIGJlZW4gaGFuZGxlZCBlbHNld2hlcmUuCiAgICAgIHJldHVybiBuZXcgX0lvRmlsZVN5c3RlbUVudGl0eShVcmkuYmFzZS5yZXNvbHZlVXJpKHVyaSkpOwogICAgfSBlbHNlIGlmICh1cmkuc2NoZW1lID09ICdkYXRhJykgewogICAgICByZXR1cm4gbmV3IERhdGFGaWxlU3lzdGVtRW50aXR5KFVyaS5iYXNlLnJlc29sdmVVcmkodXJpKSk7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigKICAgICAgICAgIHVyaSwgJ1N0YW5kYXJkRmlsZVN5c3RlbSBvbmx5IHN1cHBvcnRzIGZpbGU6KiBhbmQgZGF0YToqIFVSSXMnKTsKICAgIH0KICB9Cn0KCi8vLyBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBbRmlsZVN5c3RlbUVudGl0eV0gZm9yIGZpbGU6IFVSSXMuCmNsYXNzIF9Jb0ZpbGVTeXN0ZW1FbnRpdHkgaW1wbGVtZW50cyBGaWxlU3lzdGVtRW50aXR5IHsKICBAb3ZlcnJpZGUKICBmaW5hbCBVcmkgdXJpOwoKICBfSW9GaWxlU3lzdGVtRW50aXR5KHRoaXMudXJpKTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiB1cmkuaGFzaENvZGU7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSA9PgogICAgICBvdGhlciBpcyBfSW9GaWxlU3lzdGVtRW50aXR5ICYmIG90aGVyLnVyaSA9PSB1cmk7CgogIEBvdmVycmlkZQogIEZ1dHVyZTxib29sPiBleGlzdHMoKSBhc3luYyB7CiAgICBpZiAoYXdhaXQgaW8uRmlsZVN5c3RlbUVudGl0eS5pc0RpcmVjdG9yeSh1cmkudG9GaWxlUGF0aCgpKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgaW8uRmlsZS5mcm9tVXJpKHVyaSkuZXhpc3RzKCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBGdXR1cmU8TGlzdDxpbnQ+PiByZWFkQXNCeXRlcygpIGFzeW5jIHsKICAgIHRyeSB7CiAgICAgIENvbXBpbGVyQ29udGV4dC5yZWNvcmREZXBlbmRlbmN5KHVyaSk7CiAgICAgIHJldHVybiBuZXcgaW8uRmlsZS5mcm9tVXJpKHVyaSkucmVhZEFzQnl0ZXNTeW5jKCk7CiAgICB9IG9uIGlvLkZpbGVTeXN0ZW1FeGNlcHRpb24gY2F0Y2ggKGV4Y2VwdGlvbikgewogICAgICB0aHJvdyBfdG9GaWxlU3lzdGVtRXhjZXB0aW9uKGV4Y2VwdGlvbik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBGdXR1cmU8U3RyaW5nPiByZWFkQXNTdHJpbmcoKSBhc3luYyB7CiAgICB0cnkgewogICAgICBDb21waWxlckNvbnRleHQucmVjb3JkRGVwZW5kZW5jeSh1cmkpOwogICAgICByZXR1cm4gYXdhaXQgbmV3IGlvLkZpbGUuZnJvbVVyaSh1cmkpLnJlYWRBc1N0cmluZygpOwogICAgfSBvbiBpby5GaWxlU3lzdGVtRXhjZXB0aW9uIGNhdGNoIChleGNlcHRpb24pIHsKICAgICAgdGhyb3cgX3RvRmlsZVN5c3RlbUV4Y2VwdGlvbihleGNlcHRpb24pOwogICAgfQogIH0KCiAgLyoqCiAgICogUmV0dXJuIHRoZSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gZm9yIHRoZSBnaXZlbiBJL08gZXhjZXB0aW9uLgogICAqLwogIEZpbGVTeXN0ZW1FeGNlcHRpb24gX3RvRmlsZVN5c3RlbUV4Y2VwdGlvbihpby5GaWxlU3lzdGVtRXhjZXB0aW9uIGV4Y2VwdGlvbikgewogICAgU3RyaW5nIG1lc3NhZ2UgPSBleGNlcHRpb24ubWVzc2FnZTsKICAgIFN0cmluZyBvc01lc3NhZ2UgPSBleGNlcHRpb24ub3NFcnJvcj8ubWVzc2FnZTsKICAgIGlmIChvc01lc3NhZ2UgIT0gbnVsbCAmJiBvc01lc3NhZ2UuaXNOb3RFbXB0eSkgewogICAgICBtZXNzYWdlID0gb3NNZXNzYWdlOwogICAgfQogICAgcmV0dXJuIG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKHVyaSwgbWVzc2FnZSk7CiAgfQp9CgovLy8gQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgW0ZpbGVTeXN0ZW1FbnRpdHldIGZvciBkYXRhOiBVUklzLgpjbGFzcyBEYXRhRmlsZVN5c3RlbUVudGl0eSBpbXBsZW1lbnRzIEZpbGVTeXN0ZW1FbnRpdHkgewogIEBvdmVycmlkZQogIGZpbmFsIFVyaSB1cmk7CgogIERhdGFGaWxlU3lzdGVtRW50aXR5KHRoaXMudXJpKTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiB1cmkuaGFzaENvZGU7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSA9PgogICAgICBvdGhlciBpcyBEYXRhRmlsZVN5c3RlbUVudGl0eSAmJiBvdGhlci51cmkgPT0gdXJpOwoKICBAb3ZlcnJpZGUKICBGdXR1cmU8Ym9vbD4gZXhpc3RzKCkgYXN5bmMgewogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBGdXR1cmU8TGlzdDxpbnQ+PiByZWFkQXNCeXRlcygpIGFzeW5jIHsKICAgIHJldHVybiB1cmkuZGF0YS5jb250ZW50QXNCeXRlcygpOwogIH0KCiAgQG92ZXJyaWRlCiAgRnV0dXJlPFN0cmluZz4gcmVhZEFzU3RyaW5nKCkgYXN5bmMgewogICAgcmV0dXJuIHVyaS5kYXRhLmNvbnRlbnRBc1N0cmluZygpOwogIH0KfQp9AE5OPAEoARUYARsBPgFLBCsrBDsxSQEaAQwrNElAJ0ENJUsGBAIBQjgMEQEhAQwkAQwkOAEMIEMTDTAGBAEMKgotOTQvBgQBDCgKLTw0LwYEAQZDBlEoMzUbBjIEAgFCOQwRASIBDCQBDCQ5AQwgEQQBDComBAEMKCcEAgE9cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUvc3RhbmRhcmRfZmlsZV9zeXN0ZW0uZGFydEZzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvY29tcHV0ZV9wbGF0Zm9ybV9iaW5hcmllc19sb2NhdGlvbi5kYXJ0jNIvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICJkYXJ0OmlvIiBzaG93IEZpbGUsIFBsYXRmb3JtOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBTb3VyY2U7CgppbXBvcnQgJ2Jhc2UvcHJvY2Vzc2VkX29wdGlvbnMuZGFydCcgc2hvdyBQcm9jZXNzZWRPcHRpb25zOwoKaW1wb3J0ICdmYXN0YS9jb21waWxlcl9jb250ZXh0LmRhcnQnIHNob3cgQ29tcGlsZXJDb250ZXh0OwoKLy8vIENvbXB1dGVzIHRoZSBsb2NhdGlvbiBvZiBwbGF0Zm9ybSBiaW5hcmllcywgdGhhdCBpcywgY29tcGlsZWQgYC5kaWxsYCBmaWxlcwovLy8gb2YgdGhlIHBsYXRmb3JtIGxpYnJhcmllcyB0aGF0IGFyZSB1c2VkIHRvIGF2b2lkIHJlY29tcGlsaW5nIHRob3NlCi8vLyBsaWJyYXJpZXMuClVyaSBjb21wdXRlUGxhdGZvcm1CaW5hcmllc0xvY2F0aW9uKHtib29sIGZvcmNlQnVpbGREaXI6IGZhbHNlfSkgewogIC8vIFRoZSBkaXJlY3Rvcnkgb2YgdGhlIERhcnQgVk0gZXhlY3V0YWJsZS4KICBVcmkgdm1EaXJlY3RvcnkgPSBVcmkuYmFzZQogICAgICAucmVzb2x2ZVVyaShuZXcgVXJpLmZpbGUoUGxhdGZvcm0ucmVzb2x2ZWRFeGVjdXRhYmxlKSkKICAgICAgLnJlc29sdmUoIi4iKTsKICBpZiAodm1EaXJlY3RvcnkucGF0aC5lbmRzV2l0aCgiL2Jpbi8iKSkgewogICAgLy8gTG9va3MgbGlrZSB0aGUgVk0gaXMgaW4gYSBgL2Jpbi9gIGRpcmVjdG9yeSwgc28gdGhpcyBpcyBydW5uaW5nIGZyb20gYQogICAgLy8gYnVpbHQgU0RLLgogICAgcmV0dXJuIHZtRGlyZWN0b3J5LnJlc29sdmUoZm9yY2VCdWlsZERpciA/ICIuLi8uLi8iIDogIi4uL2xpYi9faW50ZXJuYWwvIik7CiAgfSBlbHNlIHsKICAgIC8vIFdlIGFzc3VtZSB0aGlzIGlzIHJ1bm5pbmcgZnJvbSBhIGJ1aWxkIGRpcmVjdG9yeSAoZm9yIGV4YW1wbGUsCiAgICAvLyBgb3V0L1JlbGVhc2VYNjRgIG9yIGB4Y29kZWJ1aWxkL1JlbGVhc2VYNjRgKS4KICAgIHJldHVybiB2bURpcmVjdG9yeTsKICB9Cn0KCi8vLyBUcmFuc2xhdGVzIGFuIFNESyBVUkkgKCJvcmctZGFydGxhbmctc2RrOi8vLy4uLiIpIHRvIGEgZmlsZSBVUkkuClVyaSB0cmFuc2xhdGVTZGsoVXJpIHVyaSkgewogIGlmIChDb21waWxlckNvbnRleHQuaXNBY3RpdmUpIHsKICAgIGlmICh1cmkuc2NoZW1lID09ICJvcmctZGFydGxhbmctc2RrIikgewogICAgICBTdHJpbmcgcGF0aCA9IHVyaS5wYXRoOwogICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCIvc2RrLyIpKSB7CiAgICAgICAgQ29tcGlsZXJDb250ZXh0IGNvbnRleHQgPSBDb21waWxlckNvbnRleHQuY3VycmVudDsKICAgICAgICBVcmkgc2RrUm9vdCA9IGNvbnRleHQuY2FjaGVkU2RrUm9vdDsKICAgICAgICBpZiAoc2RrUm9vdCA9PSBudWxsKSB7CiAgICAgICAgICBQcm9jZXNzZWRPcHRpb25zIG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnM7CiAgICAgICAgICBzZGtSb290ID0gb3B0aW9ucy5zZGtSb290OwogICAgICAgICAgaWYgKHNka1Jvb3QgPT0gbnVsbCkgewogICAgICAgICAgICBzZGtSb290ID0gb3B0aW9ucy5saWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpPy5yZXNvbHZlKCIuLi8iKTsKICAgICAgICAgICAgaWYgKHNka1Jvb3QgIT0gbnVsbCkgewogICAgICAgICAgICAgIGlmICghaXNFeGlzdGluZ0ZpbGUoc2RrUm9vdC5yZXNvbHZlKCJsaWIvbGlicmFyaWVzLmpzb24iKSkpIHsKICAgICAgICAgICAgICAgIHNka1Jvb3QgPSBudWxsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHNka1Jvb3QgPT0gbnVsbCkgewogICAgICAgICAgICBzZGtSb290ID0gKG9wdGlvbnMuc2RrU3VtbWFyeSA/PyBjb21wdXRlUGxhdGZvcm1CaW5hcmllc0xvY2F0aW9uKCkpCiAgICAgICAgICAgICAgICAucmVzb2x2ZSgiLi4vLi4vIik7CiAgICAgICAgICAgIGlmIChzZGtSb290ICE9IG51bGwpIHsKICAgICAgICAgICAgICBpZiAoIWlzRXhpc3RpbmdGaWxlKHNka1Jvb3QucmVzb2x2ZSgibGliL2xpYnJhcmllcy5qc29uIikpKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNFeGlzdGluZ0ZpbGUoc2RrUm9vdC5yZXNvbHZlKCJzZGsvbGliL2xpYnJhcmllcy5qc29uIikpKSB7CiAgICAgICAgICAgICAgICAgIHNka1Jvb3QgPSBzZGtSb290LnJlc29sdmUoInNkay8iKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHNka1Jvb3QgPSBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgc2RrUm9vdCA/Pz0gVXJpLnBhcnNlKCJvcmctZGFydGxhbmctc2RrOi8vL3Nkay8iKTsKICAgICAgICAgIGNvbnRleHQuY2FjaGVkU2RrUm9vdCA9IHNka1Jvb3Q7CiAgICAgICAgfQogICAgICAgIFVyaSBjYW5kaWRhdGUgPSBzZGtSb290LnJlc29sdmUocGF0aC5zdWJzdHJpbmcoNSkpOwogICAgICAgIGlmIChpc0V4aXN0aW5nRmlsZShjYW5kaWRhdGUpKSB7CiAgICAgICAgICBNYXA8VXJpLCBTb3VyY2U+IHVyaVRvU291cmNlID0gQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQudXJpVG9Tb3VyY2U7CiAgICAgICAgICBTb3VyY2Ugc291cmNlID0gdXJpVG9Tb3VyY2VbdXJpXTsKICAgICAgICAgIGlmIChzb3VyY2Uuc291cmNlLmlzRW1wdHkpIHsKICAgICAgICAgICAgdXJpVG9Tb3VyY2VbdXJpXSA9IG5ldyBTb3VyY2UoCiAgICAgICAgICAgICAgICBzb3VyY2UubGluZVN0YXJ0cywKICAgICAgICAgICAgICAgIG5ldyBGaWxlLmZyb21VcmkoY2FuZGlkYXRlKS5yZWFkQXNCeXRlc1N5bmMoKSwKICAgICAgICAgICAgICAgIHNvdXJjZS5pbXBvcnRVcmksCiAgICAgICAgICAgICAgICBzb3VyY2UuZmlsZVVyaSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBjYW5kaWRhdGU7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHVyaTsKfQoKYm9vbCBpc0V4aXN0aW5nRmlsZShVcmkgdXJpKSB7CiAgaWYgKHVyaS5zY2hlbWUgPT0gImZpbGUiKSB7CiAgICByZXR1cm4gbmV3IEZpbGUuZnJvbVVyaSh1cmkpLmV4aXN0c1N5bmMoKTsKICB9IGVsc2UgewogICAgcmV0dXJuIGZhbHNlOwogIH0KfQpeAE5OPAEmAS4BPAE7AVBHD0MuHT0VLE4SUAtGNRgEAgFFHCIsHiY7LR82JSFJI0wgEA4MIVAkI0xRNRkiEhAODD0rCjwpTiwnKyM/IiEMChoIBgQOAgEfHi8LEgQCAT1wYWNrYWdlOmZyb250X2VuZC9zcmMvY29tcHV0ZV9wbGF0Zm9ybV9iaW5hcmllc19sb2NhdGlvbi5kYXJ0SXNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvcmVkaXJlY3RpbmdfZmFjdG9yeV9ib2R5LmRhcnSXYC8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnJlZGlyZWN0aW5nX2ZhY3RvcnlfYm9keTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgRGFydFR5cGUsCiAgICAgICAgRHluYW1pY1R5cGUsCiAgICAgICAgRXhwcmVzc2lvbiwKICAgICAgICBFeHByZXNzaW9uU3RhdGVtZW50LAogICAgICAgIEZ1bmN0aW9uTm9kZSwKICAgICAgICBJbnZhbGlkRXhwcmVzc2lvbiwKICAgICAgICBMZXQsCiAgICAgICAgTWVtYmVyLAogICAgICAgIE51bGxMaXRlcmFsLAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBTdGF0aWNHZXQsCiAgICAgICAgU3RyaW5nTGl0ZXJhbCwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgc2hvdyBTdWJzdGl0dXRpb247Cgpjb25zdCBTdHJpbmcgbGV0TmFtZSA9ICIjcmVkaXJlY3RpbmdfZmFjdG9yeSI7CgpjbGFzcyBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5IGV4dGVuZHMgRXhwcmVzc2lvblN0YXRlbWVudCB7CiAgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keS5pbnRlcm5hbChFeHByZXNzaW9uIHZhbHVlLAogICAgICBbTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50c10pCiAgICAgIDogc3VwZXIobmV3IExldChuZXcgVmFyaWFibGVEZWNsYXJhdGlvbihsZXROYW1lLCBpbml0aWFsaXplcjogdmFsdWUpLAogICAgICAgICAgICBlbmNvZGVUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMpKSk7CgogIFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkoTWVtYmVyIHRhcmdldCwgW0xpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHNdKQogICAgICA6IHRoaXMuaW50ZXJuYWwobmV3IFN0YXRpY0dldCh0YXJnZXQpLCB0eXBlQXJndW1lbnRzKTsKCiAgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keS51bnJlc29sdmVkKFN0cmluZyBuYW1lKQogICAgICA6IHRoaXMuaW50ZXJuYWwobmV3IFN0cmluZ0xpdGVyYWwobmFtZSkpOwoKICBNZW1iZXIgZ2V0IHRhcmdldCB7CiAgICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShleHByZXNzaW9uKTsKICAgIHJldHVybiB2YWx1ZSBpcyBTdGF0aWNHZXQgPyB2YWx1ZS50YXJnZXQgOiBudWxsOwogIH0KCiAgU3RyaW5nIGdldCB1bnJlc29sdmVkTmFtZSB7CiAgICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShleHByZXNzaW9uKTsKICAgIHJldHVybiB2YWx1ZSBpcyBTdHJpbmdMaXRlcmFsID8gdmFsdWUudmFsdWUgOiBudWxsOwogIH0KCiAgYm9vbCBnZXQgaXNVbnJlc29sdmVkID0+IHVucmVzb2x2ZWROYW1lICE9IG51bGw7CgogIExpc3Q8RGFydFR5cGU+IGdldCB0eXBlQXJndW1lbnRzIHsKICAgIGlmIChleHByZXNzaW9uIGlzIExldCkgewogICAgICBMZXQgYm9keUV4cHJlc3Npb24gPSBleHByZXNzaW9uOwogICAgICBpZiAoYm9keUV4cHJlc3Npb24udmFyaWFibGUubmFtZSA9PSBsZXROYW1lKSB7CiAgICAgICAgcmV0dXJuIGRlY29kZVR5cGVBcmd1bWVudHMoYm9keUV4cHJlc3Npb24uYm9keSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgc3RhdGljIGdldFZhbHVlKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogICAgaWYgKGV4cHJlc3Npb24gaXMgTGV0KSB7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSBleHByZXNzaW9uLnZhcmlhYmxlOwogICAgICBpZiAodmFyaWFibGUubmFtZSA9PSBsZXROYW1lKSB7CiAgICAgICAgcmV0dXJuIHZhcmlhYmxlLmluaXRpYWxpemVyOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHN0YXRpYyB2b2lkIHJlc3RvcmVGcm9tRGlsbChQcm9jZWR1cmUgZmFjdG9yeSkgewogICAgLy8gVGhpcyBpcyBhIGhhY2sgLyB3b3JrIGFyb3VuZCBmb3Igc3RvcmluZyByZWRpcmVjdGluZyBjb25zdHJ1Y3RvcnMgaW4KICAgIC8vIGRpbGwgZmlsZXMuIFNlZSBgS2VybmVsQ2xhc3NCdWlsZGVyLmFkZFJlZGlyZWN0aW5nQ29uc3RydWN0b3JgIGluCiAgICAvLyBba2VybmVsX2NsYXNzX2J1aWxkZXIuZGFydF0oa2VybmVsX2NsYXNzX2J1aWxkZXIuZGFydCkuCiAgICBGdW5jdGlvbk5vZGUgZnVuY3Rpb24gPSBmYWN0b3J5LmZ1bmN0aW9uOwogICAgRXhwcmVzc2lvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSBmdW5jdGlvbi5ib2R5OwogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKICAgIGlmIChzdGF0ZW1lbnQuZXhwcmVzc2lvbiBpcyBMZXQpIHsKICAgICAgTGV0IGV4cHJlc3Npb24gPSBzdGF0ZW1lbnQuZXhwcmVzc2lvbjsKICAgICAgdHlwZUFyZ3VtZW50cyA9IGRlY29kZVR5cGVBcmd1bWVudHMoZXhwcmVzc2lvbi5ib2R5KTsKICAgIH0KICAgIGZ1bmN0aW9uLmJvZHkgPSBuZXcgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keS5pbnRlcm5hbCgKICAgICAgICBnZXRWYWx1ZShzdGF0ZW1lbnQuZXhwcmVzc2lvbiksIHR5cGVBcmd1bWVudHMpCiAgICAgIC4ucGFyZW50ID0gZnVuY3Rpb247CiAgfQoKICBzdGF0aWMgRXhwcmVzc2lvbiBlbmNvZGVUeXBlQXJndW1lbnRzKExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIFN0cmluZyB2YXJOYW1lUHJlZml4ID0gIiN0eXBlQXJnIjsKICAgIEV4cHJlc3Npb24gcmVzdWx0ID0gbmV3IEludmFsaWRFeHByZXNzaW9uKG51bGwpOwogICAgaWYgKHR5cGVBcmd1bWVudHMgPT0gbnVsbCkgewogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZm9yIChpbnQgaSA9IHR5cGVBcmd1bWVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgcmVzdWx0ID0gbmV3IExldCgKICAgICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKCIkdmFyTmFtZVByZWZpeCRpIiwKICAgICAgICAgICAgICB0eXBlOiB0eXBlQXJndW1lbnRzW2ldLCBpbml0aWFsaXplcjogbmV3IE51bGxMaXRlcmFsKCkpLAogICAgICAgICAgcmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMgTGlzdDxEYXJ0VHlwZT4gZGVjb2RlVHlwZUFyZ3VtZW50cyhFeHByZXNzaW9uIGVuY29kZWQpIHsKICAgIGlmIChlbmNvZGVkIGlzIEludmFsaWRFeHByZXNzaW9uKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgTGlzdDxEYXJ0VHlwZT4gcmVzdWx0ID0gPERhcnRUeXBlPltdOwogICAgd2hpbGUgKGVuY29kZWQgaXMgTGV0KSB7CiAgICAgIExldCBoZWFkID0gZW5jb2RlZDsKICAgICAgcmVzdWx0LmFkZChoZWFkLnZhcmlhYmxlLnR5cGUpOwogICAgICBlbmNvZGVkID0gaGVhZC5ib2R5OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KCmJvb2wgaXNSZWRpcmVjdGluZ0ZhY3RvcnkoTWVtYmVyIG1lbWJlcikgewogIHJldHVybiBtZW1iZXIgaXMgUHJvY2VkdXJlICYmIG1lbWJlci5mdW5jdGlvbi5ib2R5IGlzIFJlZGlyZWN0aW5nRmFjdG9yeUJvZHk7Cn0KClJlZGlyZWN0aW5nRmFjdG9yeUJvZHkgZ2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keShNZW1iZXIgbWVtYmVyKSB7CiAgcmV0dXJuIGlzUmVkaXJlY3RpbmdGYWN0b3J5KG1lbWJlcikgPyBtZW1iZXIuZnVuY3Rpb24uYm9keSA6IG51bGw7Cn0KCmNsYXNzIFJlZGlyZWN0aW9uVGFyZ2V0IHsKICBmaW5hbCBNZW1iZXIgdGFyZ2V0OwogIGZpbmFsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHM7CgogIFJlZGlyZWN0aW9uVGFyZ2V0KHRoaXMudGFyZ2V0LCB0aGlzLnR5cGVBcmd1bWVudHMpOwp9CgpSZWRpcmVjdGlvblRhcmdldCBnZXRSZWRpcmVjdGlvblRhcmdldChQcm9jZWR1cmUgbWVtYmVyLCB7Ym9vbCBsZWdhY3lNb2RlfSkgewogIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPSA8RGFydFR5cGU+W10uLmxlbmd0aCA9CiAgICAgIG1lbWJlci5mdW5jdGlvbi50eXBlUGFyYW1ldGVycy5sZW5ndGg7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICB0eXBlQXJndW1lbnRzW2ldID0gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlKG1lbWJlci5mdW5jdGlvbi50eXBlUGFyYW1ldGVyc1tpXSk7CiAgfQoKICAvLyBXZSB1c2UgdGhlIFt0b3J0b2lzZSBhbmQgaGFyZSBhbGdvcml0aG1dCiAgLy8gKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N5Y2xlX2RldGVjdGlvbiNUb3J0b2lzZV9hbmRfaGFyZSkgdG8KICAvLyBoYW5kbGUgY3ljbGVzLgogIE1lbWJlciB0b3J0b2lzZSA9IG1lbWJlcjsKICBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5IHRvcnRvaXNlQm9keSA9IGdldFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkodG9ydG9pc2UpOwogIE1lbWJlciBoYXJlID0gdG9ydG9pc2VCb2R5Py50YXJnZXQ7CiAgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keSBoYXJlQm9keSA9IGdldFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkoaGFyZSk7CiAgd2hpbGUgKHRvcnRvaXNlICE9IGhhcmUpIHsKICAgIGlmICh0b3J0b2lzZUJvZHk/LmlzVW5yZXNvbHZlZCA/PyB0cnVlKQogICAgICByZXR1cm4gbmV3IFJlZGlyZWN0aW9uVGFyZ2V0KHRvcnRvaXNlLCB0eXBlQXJndW1lbnRzKTsKICAgIE1lbWJlciBuZXh0VG9ydG9pc2UgPSB0b3J0b2lzZUJvZHkudGFyZ2V0OwogICAgTGlzdDxEYXJ0VHlwZT4gbmV4dFR5cGVBcmd1bWVudHMgPSB0b3J0b2lzZUJvZHkudHlwZUFyZ3VtZW50czsKICAgIGlmICghbGVnYWN5TW9kZSAmJiBuZXh0VHlwZUFyZ3VtZW50cyA9PSBudWxsKSB7CiAgICAgIG5leHRUeXBlQXJndW1lbnRzID0gPERhcnRUeXBlPltdOwogICAgfQoKICAgIGlmICghbGVnYWN5TW9kZSB8fCBuZXh0VHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIFN1YnN0aXR1dGlvbiBzdWIgPSBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKAogICAgICAgICAgdG9ydG9pc2UuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMsIHR5cGVBcmd1bWVudHMpOwogICAgICB0eXBlQXJndW1lbnRzID0gPERhcnRUeXBlPltdLi5sZW5ndGggPSBuZXh0VHlwZUFyZ3VtZW50cy5sZW5ndGg7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgIHR5cGVBcmd1bWVudHNbaV0gPSBzdWIuc3Vic3RpdHV0ZVR5cGUobmV4dFR5cGVBcmd1bWVudHNbaV0pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBJbiBEYXJ0IDEsIHdlIG5lZWQgdG8gdGhyb3cgYXdheSB0aGUgZXh0cmEgdHlwZSBhcmd1bWVudHMgYW5kIHVzZQogICAgICAvLyBgZHluYW1pY2AgaW4gcGxhY2Ugb2YgdGhlIG1pc3Npbmcgb25lcy4KICAgICAgaW50IHR5cGVBcmd1bWVudENvdW50ID0gdHlwZUFyZ3VtZW50cy5sZW5ndGg7CiAgICAgIGludCBuZXh0VHlwZUFyZ3VtZW50Q291bnQgPQogICAgICAgICAgbmV4dFRvcnRvaXNlLmVuY2xvc2luZ0NsYXNzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsKICAgICAgdHlwZUFyZ3VtZW50cy5sZW5ndGggPSBuZXh0VHlwZUFyZ3VtZW50Q291bnQ7CiAgICAgIGZvciAoaW50IGkgPSB0eXBlQXJndW1lbnRDb3VudDsgaSA8IG5leHRUeXBlQXJndW1lbnRDb3VudDsgaSsrKSB7CiAgICAgICAgdHlwZUFyZ3VtZW50c1tpXSA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgIH0KICAgIH0KCiAgICB0b3J0b2lzZSA9IG5leHRUb3J0b2lzZTsKICAgIHRvcnRvaXNlQm9keSA9IGdldFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkodG9ydG9pc2UpOwogICAgaGFyZSA9IGdldFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkoaGFyZUJvZHk/LnRhcmdldCk/LnRhcmdldDsKICAgIGhhcmVCb2R5ID0gZ2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keShoYXJlKTsKICB9CiAgcmV0dXJuIG51bGw7Cn0KgLYATk48ASgBIQkSFRQdFhsNEBUTExcbHQE9AS8BOzQmTDIBSD0BMTABFiY1BAEeJjgEATMBJR0nNTkIBhEEASsdOiYlCAYRBAEzTEk/LjMiJy08Bjk3GwQBSCc1IRUGOhg2RxMGEwQBQigTBiodGiYbBhMEAgErUAIBQkUCARoXJgE2AgFOOC0zUQQBLkoUHE0mRR0sPS9DNCgGATQxPEc3RQgNSzE0Ij00SDAIBgEdOEAwBA8CAUBwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL3JlZGlyZWN0aW5nX2ZhY3RvcnlfYm9keS5kYXJ0MnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9vcGVyYXRvci5kYXJ0jucvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5vcGVyYXRvcnM7CgovLy8gVGhlIHVzZXItZGVmaW5hYmxlIG9wZXJhdG9ycyBpbiBEYXJ0LgovLy8KLy8vIFRoZSBuYW1lcyBoYXZlIGJlZW4gY2hvc2VuIHRvIHJlcHJlc2VudCB0aGVpciBub3JtYWwgc2VtYW50aWMgbWVhbmluZy4KZW51bSBPcGVyYXRvciB7CiAgYWRkLAogIGJpdHdpc2VBbmQsCiAgYml0d2lzZU5vdCwKICBiaXR3aXNlT3IsCiAgYml0d2lzZVhvciwKICBkaXZpZGUsCiAgZXF1YWxzLAogIGdyZWF0ZXJUaGFuLAogIGdyZWF0ZXJUaGFuRXF1YWxzLAogIGluZGV4R2V0LAogIGluZGV4U2V0LAogIGxlZnRTaGlmdCwKICBsZXNzVGhhbiwKICBsZXNzVGhhbkVxdWFscywKICBtb2R1bG8sCiAgbXVsdGlwbHksCiAgcmlnaHRTaGlmdCwKICB0cmlwbGVTaGlmdCwKICBzdWJ0cmFjdCwKICB0cnVuY2F0aW5nRGl2aWRlLAogIHVuYXJ5TWludXMsCn0KCk9wZXJhdG9yIG9wZXJhdG9yRnJvbVN0cmluZyhTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKGlkZW50aWNhbCgiKyIsIHN0cmluZykpIHJldHVybiBPcGVyYXRvci5hZGQ7CiAgaWYgKGlkZW50aWNhbCgiJiIsIHN0cmluZykpIHJldHVybiBPcGVyYXRvci5iaXR3aXNlQW5kOwogIGlmIChpZGVudGljYWwoIn4iLCBzdHJpbmcpKSByZXR1cm4gT3BlcmF0b3IuYml0d2lzZU5vdDsKICBpZiAoaWRlbnRpY2FsKCJ8Iiwgc3RyaW5nKSkgcmV0dXJuIE9wZXJhdG9yLmJpdHdpc2VPcjsKICBpZiAoaWRlbnRpY2FsKCJeIiwgc3RyaW5nKSkgcmV0dXJuIE9wZXJhdG9yLmJpdHdpc2VYb3I7CiAgaWYgKGlkZW50aWNhbCgiLyIsIHN0cmluZykpIHJldHVybiBPcGVyYXRvci5kaXZpZGU7CiAgaWYgKGlkZW50aWNhbCgiPT0iLCBzdHJpbmcpKSByZXR1cm4gT3BlcmF0b3IuZXF1YWxzOwogIGlmIChpZGVudGljYWwoIj4iLCBzdHJpbmcpKSByZXR1cm4gT3BlcmF0b3IuZ3JlYXRlclRoYW47CiAgaWYgKGlkZW50aWNhbCgiPj0iLCBzdHJpbmcpKSByZXR1cm4gT3BlcmF0b3IuZ3JlYXRlclRoYW5FcXVhbHM7CiAgaWYgKGlkZW50aWNhbCgiW10iLCBzdHJpbmcpKSByZXR1cm4gT3BlcmF0b3IuaW5kZXhHZXQ7CiAgaWYgKGlkZW50aWNhbCgiW109Iiwgc3RyaW5nKSkgcmV0dXJuIE9wZXJhdG9yLmluZGV4U2V0OwogIGlmIChpZGVudGljYWwoIjw8Iiwgc3RyaW5nKSkgcmV0dXJuIE9wZXJhdG9yLmxlZnRTaGlmdDsKICBpZiAoaWRlbnRpY2FsKCI8Iiwgc3RyaW5nKSkgcmV0dXJuIE9wZXJhdG9yLmxlc3NUaGFuOwogIGlmIChpZGVudGljYWwoIjw9Iiwgc3RyaW5nKSkgcmV0dXJuIE9wZXJhdG9yLmxlc3NUaGFuRXF1YWxzOwogIGlmIChpZGVudGljYWwoIiUiLCBzdHJpbmcpKSByZXR1cm4gT3BlcmF0b3IubW9kdWxvOwogIGlmIChpZGVudGljYWwoIioiLCBzdHJpbmcpKSByZXR1cm4gT3BlcmF0b3IubXVsdGlwbHk7CiAgaWYgKGlkZW50aWNhbCgiPj4iLCBzdHJpbmcpKSByZXR1cm4gT3BlcmF0b3IucmlnaHRTaGlmdDsKICBpZiAoaWRlbnRpY2FsKCI+Pj4iLCBzdHJpbmcpKSByZXR1cm4gT3BlcmF0b3IudHJpcGxlU2hpZnQ7CiAgaWYgKGlkZW50aWNhbCgiLSIsIHN0cmluZykpIHJldHVybiBPcGVyYXRvci5zdWJ0cmFjdDsKICBpZiAoaWRlbnRpY2FsKCJ+LyIsIHN0cmluZykpIHJldHVybiBPcGVyYXRvci50cnVuY2F0aW5nRGl2aWRlOwogIGlmIChpZGVudGljYWwoInVuYXJ5LSIsIHN0cmluZykpIHJldHVybiBPcGVyYXRvci51bmFyeU1pbnVzOwogIHJldHVybiBudWxsOwp9CgpTdHJpbmcgb3BlcmF0b3JUb1N0cmluZyhPcGVyYXRvciBvcGVyYXRvcikgewogIHN3aXRjaCAob3BlcmF0b3IpIHsKICAgIGNhc2UgT3BlcmF0b3IuYWRkOgogICAgICByZXR1cm4gIisiOwogICAgY2FzZSBPcGVyYXRvci5iaXR3aXNlQW5kOgogICAgICByZXR1cm4gIiYiOwogICAgY2FzZSBPcGVyYXRvci5iaXR3aXNlTm90OgogICAgICByZXR1cm4gIn4iOwogICAgY2FzZSBPcGVyYXRvci5iaXR3aXNlT3I6CiAgICAgIHJldHVybiAifCI7CiAgICBjYXNlIE9wZXJhdG9yLmJpdHdpc2VYb3I6CiAgICAgIHJldHVybiAiXiI7CiAgICBjYXNlIE9wZXJhdG9yLmRpdmlkZToKICAgICAgcmV0dXJuICIvIjsKICAgIGNhc2UgT3BlcmF0b3IuZXF1YWxzOgogICAgICByZXR1cm4gIj09IjsKICAgIGNhc2UgT3BlcmF0b3IuZ3JlYXRlclRoYW46CiAgICAgIHJldHVybiAiPiI7CiAgICBjYXNlIE9wZXJhdG9yLmdyZWF0ZXJUaGFuRXF1YWxzOgogICAgICByZXR1cm4gIj49IjsKICAgIGNhc2UgT3BlcmF0b3IuaW5kZXhHZXQ6CiAgICAgIHJldHVybiAiW10iOwogICAgY2FzZSBPcGVyYXRvci5pbmRleFNldDoKICAgICAgcmV0dXJuICJbXT0iOwogICAgY2FzZSBPcGVyYXRvci5sZWZ0U2hpZnQ6CiAgICAgIHJldHVybiAiPDwiOwogICAgY2FzZSBPcGVyYXRvci5sZXNzVGhhbjoKICAgICAgcmV0dXJuICI8IjsKICAgIGNhc2UgT3BlcmF0b3IubGVzc1RoYW5FcXVhbHM6CiAgICAgIHJldHVybiAiPD0iOwogICAgY2FzZSBPcGVyYXRvci5tb2R1bG86CiAgICAgIHJldHVybiAiJSI7CiAgICBjYXNlIE9wZXJhdG9yLm11bHRpcGx5OgogICAgICByZXR1cm4gIioiOwogICAgY2FzZSBPcGVyYXRvci5yaWdodFNoaWZ0OgogICAgICByZXR1cm4gIj4+IjsKICAgIGNhc2UgT3BlcmF0b3IudHJpcGxlU2hpZnQ6CiAgICAgIHJldHVybiAiPj4+IjsKICAgIGNhc2UgT3BlcmF0b3Iuc3VidHJhY3Q6CiAgICAgIHJldHVybiAiLSI7CiAgICBjYXNlIE9wZXJhdG9yLnRydW5jYXRpbmdEaXZpZGU6CiAgICAgIHJldHVybiAifi8iOwogICAgY2FzZSBPcGVyYXRvci51bmFyeU1pbnVzOgogICAgICByZXR1cm4gInVuYXJ5LSI7CiAgfQogIHJldHVybiBudWxsOwp9CgppbnQgb3BlcmF0b3JSZXF1aXJlZEFyZ3VtZW50Q291bnQoT3BlcmF0b3Igb3BlcmF0b3IpIHsKICBzd2l0Y2ggKG9wZXJhdG9yKSB7CiAgICBjYXNlIE9wZXJhdG9yLmJpdHdpc2VOb3Q6CiAgICBjYXNlIE9wZXJhdG9yLnVuYXJ5TWludXM6CiAgICAgIHJldHVybiAwOwoKICAgIGNhc2UgT3BlcmF0b3IuYWRkOgogICAgY2FzZSBPcGVyYXRvci5iaXR3aXNlQW5kOgogICAgY2FzZSBPcGVyYXRvci5iaXR3aXNlT3I6CiAgICBjYXNlIE9wZXJhdG9yLmJpdHdpc2VYb3I6CiAgICBjYXNlIE9wZXJhdG9yLmRpdmlkZToKICAgIGNhc2UgT3BlcmF0b3IuZXF1YWxzOgogICAgY2FzZSBPcGVyYXRvci5ncmVhdGVyVGhhbjoKICAgIGNhc2UgT3BlcmF0b3IuZ3JlYXRlclRoYW5FcXVhbHM6CiAgICBjYXNlIE9wZXJhdG9yLmluZGV4R2V0OgogICAgY2FzZSBPcGVyYXRvci5sZWZ0U2hpZnQ6CiAgICBjYXNlIE9wZXJhdG9yLmxlc3NUaGFuOgogICAgY2FzZSBPcGVyYXRvci5sZXNzVGhhbkVxdWFsczoKICAgIGNhc2UgT3BlcmF0b3IubW9kdWxvOgogICAgY2FzZSBPcGVyYXRvci5tdWx0aXBseToKICAgIGNhc2UgT3BlcmF0b3IucmlnaHRTaGlmdDoKICAgIGNhc2UgT3BlcmF0b3IudHJpcGxlU2hpZnQ6CiAgICBjYXNlIE9wZXJhdG9yLnN1YnRyYWN0OgogICAgY2FzZSBPcGVyYXRvci50cnVuY2F0aW5nRGl2aWRlOgogICAgICByZXR1cm4gMTsKCiAgICBjYXNlIE9wZXJhdG9yLmluZGV4U2V0OgogICAgICByZXR1cm4gMjsKICB9CiAgcmV0dXJuIC0xOwp9CoCLAE5OPAEZASoESxAHDg4NDgoKDxUMDA0MEgoMDg8MFA4CAS0zOjo5OjY3O0I5Ojo4PzY4Oz04QT8PAgEtFhcSHhIeEh0SHhIaEhoTHxIlExwTHBQdExwSIhMaEhwSHhMfFBwSJBMeFwQPAgE3Fh4eEAEXHh0eGhofJRwdHCIaHB4fHCQQARwQBA0CASlwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvb3BlcmF0b3IuZGFydD9zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvcGFyc2VyL2FzeW5jX21vZGlmaWVyLmRhcnSBQC8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnBhcnNlci5hc3luY19tb2RpZmllcjsKCmVudW0gQXN5bmNNb2RpZmllciB7CiAgU3luYywKICBTeW5jU3RhciwKICBBc3luYywKICBBc3luY1N0YXIsCn0KDgBOTjwBJQEVCAwJDQIBNnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvYXN5bmNfbW9kaWZpZXIuZGFydDxzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvc2Nhbm5lci9jaGFyYWN0ZXJzLmRhcnSNFC8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnNjYW5uZXIuY2hhcmFjdGVyczsKCmNvbnN0IGludCAkRU9GID0gMDsKY29uc3QgaW50ICRTVFggPSAyOwpjb25zdCBpbnQgJEJTID0gODsKY29uc3QgaW50ICRUQUIgPSA5Owpjb25zdCBpbnQgJExGID0gMTA7CmNvbnN0IGludCAkVlRBQiA9IDExOwpjb25zdCBpbnQgJEZGID0gMTI7CmNvbnN0IGludCAkQ1IgPSAxMzsKY29uc3QgaW50ICRTUEFDRSA9IDMyOwpjb25zdCBpbnQgJEJBTkcgPSAzMzsKY29uc3QgaW50ICREUSA9IDM0Owpjb25zdCBpbnQgJEhBU0ggPSAzNTsKY29uc3QgaW50ICQkID0gMzY7CmNvbnN0IGludCAkUEVSQ0VOVCA9IDM3Owpjb25zdCBpbnQgJEFNUEVSU0FORCA9IDM4Owpjb25zdCBpbnQgJFNRID0gMzk7CmNvbnN0IGludCAkT1BFTl9QQVJFTiA9IDQwOwpjb25zdCBpbnQgJENMT1NFX1BBUkVOID0gNDE7CmNvbnN0IGludCAkU1RBUiA9IDQyOwpjb25zdCBpbnQgJFBMVVMgPSA0MzsKY29uc3QgaW50ICRDT01NQSA9IDQ0Owpjb25zdCBpbnQgJE1JTlVTID0gNDU7CmNvbnN0IGludCAkUEVSSU9EID0gNDY7CmNvbnN0IGludCAkU0xBU0ggPSA0NzsKY29uc3QgaW50ICQwID0gNDg7CmNvbnN0IGludCAkMSA9IDQ5Owpjb25zdCBpbnQgJDIgPSA1MDsKY29uc3QgaW50ICQzID0gNTE7CmNvbnN0IGludCAkNCA9IDUyOwpjb25zdCBpbnQgJDUgPSA1MzsKY29uc3QgaW50ICQ2ID0gNTQ7CmNvbnN0IGludCAkNyA9IDU1Owpjb25zdCBpbnQgJDggPSA1NjsKY29uc3QgaW50ICQ5ID0gNTc7CmNvbnN0IGludCAkQ09MT04gPSA1ODsKY29uc3QgaW50ICRTRU1JQ09MT04gPSA1OTsKY29uc3QgaW50ICRMVCA9IDYwOwpjb25zdCBpbnQgJEVRID0gNjE7CmNvbnN0IGludCAkR1QgPSA2MjsKY29uc3QgaW50ICRRVUVTVElPTiA9IDYzOwpjb25zdCBpbnQgJEFUID0gNjQ7CmNvbnN0IGludCAkQSA9IDY1Owpjb25zdCBpbnQgJEIgPSA2NjsKY29uc3QgaW50ICRDID0gNjc7CmNvbnN0IGludCAkRCA9IDY4Owpjb25zdCBpbnQgJEUgPSA2OTsKY29uc3QgaW50ICRGID0gNzA7CmNvbnN0IGludCAkRyA9IDcxOwpjb25zdCBpbnQgJEggPSA3MjsKY29uc3QgaW50ICRJID0gNzM7CmNvbnN0IGludCAkSiA9IDc0Owpjb25zdCBpbnQgJEsgPSA3NTsKY29uc3QgaW50ICRMID0gNzY7CmNvbnN0IGludCAkTSA9IDc3Owpjb25zdCBpbnQgJE4gPSA3ODsKY29uc3QgaW50ICRPID0gNzk7CmNvbnN0IGludCAkUCA9IDgwOwpjb25zdCBpbnQgJFEgPSA4MTsKY29uc3QgaW50ICRSID0gODI7CmNvbnN0IGludCAkUyA9IDgzOwpjb25zdCBpbnQgJFQgPSA4NDsKY29uc3QgaW50ICRVID0gODU7CmNvbnN0IGludCAkViA9IDg2Owpjb25zdCBpbnQgJFcgPSA4NzsKY29uc3QgaW50ICRYID0gODg7CmNvbnN0IGludCAkWSA9IDg5Owpjb25zdCBpbnQgJFogPSA5MDsKY29uc3QgaW50ICRPUEVOX1NRVUFSRV9CUkFDS0VUID0gOTE7CmNvbnN0IGludCAkQkFDS1NMQVNIID0gOTI7CmNvbnN0IGludCAkQ0xPU0VfU1FVQVJFX0JSQUNLRVQgPSA5MzsKY29uc3QgaW50ICRDQVJFVCA9IDk0Owpjb25zdCBpbnQgJF8gPSA5NTsKY29uc3QgaW50ICRCQUNLUElORyA9IDk2Owpjb25zdCBpbnQgJGEgPSA5NzsKY29uc3QgaW50ICRiID0gOTg7CmNvbnN0IGludCAkYyA9IDk5Owpjb25zdCBpbnQgJGQgPSAxMDA7CmNvbnN0IGludCAkZSA9IDEwMTsKY29uc3QgaW50ICRmID0gMTAyOwpjb25zdCBpbnQgJGcgPSAxMDM7CmNvbnN0IGludCAkaCA9IDEwNDsKY29uc3QgaW50ICRpID0gMTA1Owpjb25zdCBpbnQgJGogPSAxMDY7CmNvbnN0IGludCAkayA9IDEwNzsKY29uc3QgaW50ICRsID0gMTA4Owpjb25zdCBpbnQgJG0gPSAxMDk7CmNvbnN0IGludCAkbiA9IDExMDsKY29uc3QgaW50ICRvID0gMTExOwpjb25zdCBpbnQgJHAgPSAxMTI7CmNvbnN0IGludCAkcSA9IDExMzsKY29uc3QgaW50ICRyID0gMTE0Owpjb25zdCBpbnQgJHMgPSAxMTU7CmNvbnN0IGludCAkdCA9IDExNjsKY29uc3QgaW50ICR1ID0gMTE3Owpjb25zdCBpbnQgJHYgPSAxMTg7CmNvbnN0IGludCAkdyA9IDExOTsKY29uc3QgaW50ICR4ID0gMTIwOwpjb25zdCBpbnQgJHkgPSAxMjE7CmNvbnN0IGludCAkeiA9IDEyMjsKY29uc3QgaW50ICRPUEVOX0NVUkxZX0JSQUNLRVQgPSAxMjM7CmNvbnN0IGludCAkQkFSID0gMTI0Owpjb25zdCBpbnQgJENMT1NFX0NVUkxZX0JSQUNLRVQgPSAxMjU7CmNvbnN0IGludCAkVElMREUgPSAxMjY7CmNvbnN0IGludCAkREVMID0gMTI3Owpjb25zdCBpbnQgJE5CU1AgPSAxNjA7CmNvbnN0IGludCAkTFMgPSAweDIwMjg7CmNvbnN0IGludCAkUFMgPSAweDIwMjk7Cgpjb25zdCBpbnQgJEZJUlNUX1NVUlJPR0FURSA9IDB4ZDgwMDsKY29uc3QgaW50ICRMQVNUX1NVUlJPR0FURSA9IDB4ZGZmZjsKY29uc3QgaW50ICRMQVNUX0NPREVfUE9JTlQgPSAweDEwZmZmZjsKCmJvb2wgaXNIZXhEaWdpdChpbnQgY2hhcmFjdGVyQ29kZSkgewogIGlmIChjaGFyYWN0ZXJDb2RlIDw9ICQ5KSByZXR1cm4gJDAgPD0gY2hhcmFjdGVyQ29kZTsKICBjaGFyYWN0ZXJDb2RlIHw9ICRhIF4gJEE7CiAgcmV0dXJuICgkYSA8PSBjaGFyYWN0ZXJDb2RlICYmIGNoYXJhY3RlckNvZGUgPD0gJGYpOwp9CgppbnQgaGV4RGlnaXRWYWx1ZShpbnQgaGV4RGlnaXQpIHsKICBhc3NlcnQoaXNIZXhEaWdpdChoZXhEaWdpdCkpOwogIC8vIGhleERpZ2l0IGlzIG9uZSBvZiAnMCcuLic5JywgJ0EnLi4nRicgYW5kICdhJy4uJ2YnLgogIGlmIChoZXhEaWdpdCA8PSAkOSkgcmV0dXJuIGhleERpZ2l0IC0gJDA7CiAgcmV0dXJuIChoZXhEaWdpdCB8ICgkYSBeICRBKSkgLSAoJGEgLSAxMCk7Cn0KCmJvb2wgaXNVbmljb2RlU2NhbGFyVmFsdWUoaW50IHZhbHVlKSB7CiAgcmV0dXJuIHZhbHVlIDwgJEZJUlNUX1NVUlJPR0FURSB8fAogICAgICAodmFsdWUgPiAkTEFTVF9TVVJST0dBVEUgJiYgdmFsdWUgPD0gJExBU1RfQ09ERV9QT0lOVCk7Cn0KCmJvb2wgaXNVdGYxNkxlYWRTdXJyb2dhdGUoaW50IHZhbHVlKSB7CiAgcmV0dXJuIHZhbHVlID49IDB4ZDgwMCAmJiB2YWx1ZSA8PSAweGRiZmY7Cn0KCmJvb2wgaXNVdGYxNlRyYWlsU3Vycm9nYXRlKGludCB2YWx1ZSkgewogIHJldHVybiB2YWx1ZSA+PSAweGRjMDAgJiYgdmFsdWUgPD0gMHhkZmZmOwp9CoCRAE5OPAEiARQUExQUFhQUFxYUFhMZGxQcHRYWFxcYFxMTExMTExMTExMXGxQUFBoUExMTExMTExMTExMTExMTExMTExMTExMTExMlGyYXExoTExMUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCUWJhgWFxgYASUkJwElNxw3AgEiIDksLQIBJyU+AgEnLQIBKC0CATNwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc2Nhbm5lci9jaGFyYWN0ZXJzLmRhcnQzc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3V0aWwvbGluay5kYXJ0lNovLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS51dGlsLmxpbms7CgppbXBvcnQgJ2xpbmtfaW1wbGVtZW50YXRpb24uZGFydCcKICAgIHNob3cgTGlua0J1aWxkZXJJbXBsZW1lbnRhdGlvbiwgTGlua0VudHJ5LCBMaW5rSXRlcmF0b3IsIE1hcHBlZExpbmtJdGVyYWJsZTsKCmNsYXNzIExpbms8VD4gaW1wbGVtZW50cyBJdGVyYWJsZTxUPiB7CiAgVCBnZXQgaGVhZCA9PiB0aHJvdyBuZXcgU3RhdGVFcnJvcigibm8gZWxlbWVudHMiKTsKICBMaW5rPFQ+IGdldCB0YWlsID0+IG51bGw7CgogIGNvbnN0IExpbmsoKTsKCiAgTGluazxUPiBwcmVwZW5kKFQgZWxlbWVudCkgewogICAgcmV0dXJuIG5ldyBMaW5rRW50cnk8VD4oZWxlbWVudCwgdGhpcyk7CiAgfQoKICBJdGVyYXRvcjxUPiBnZXQgaXRlcmF0b3IgPT4gbmV3IExpbmtJdGVyYXRvcjxUPih0aGlzKTsKCiAgdm9pZCBwcmludE9uKFN0cmluZ0J1ZmZlciBidWZmZXIsIFtzZXBhcmF0ZWRCeV0pIHt9CgogIExpc3Q8VD4gdG9MaXN0KHtib29sIGdyb3dhYmxlOiB0cnVlfSkgewogICAgTGlzdDxUPiByZXN1bHQ7CiAgICBpZiAoIWdyb3dhYmxlKSB7CiAgICAgIHJlc3VsdCA9IG5ldyBMaXN0PFQ+KHNsb3dMZW5ndGgoKSk7CiAgICB9IGVsc2UgewogICAgICByZXN1bHQgPSBuZXcgTGlzdDxUPigpOwogICAgICByZXN1bHQubGVuZ3RoID0gc2xvd0xlbmd0aCgpOwogICAgfQogICAgaW50IGkgPSAwOwogICAgZm9yIChMaW5rPFQ+IGxpbmsgPSB0aGlzOyAhbGluay5pc0VtcHR5OyBsaW5rID0gbGluay50YWlsKSB7CiAgICAgIHJlc3VsdFtpKytdID0gbGluay5oZWFkOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBMYXppbHkgbWFwcyBvdmVyIHRoaXMgbGlua2VkIGxpc3QsIHJldHVybmluZyBhbiBbSXRlcmFibGVdLgogIEl0ZXJhYmxlPEs+IG1hcDxLPihLIGZuKFQgaXRlbSkpIHsKICAgIHJldHVybiBuZXcgTWFwcGVkTGlua0l0ZXJhYmxlPFQsIEs+KHRoaXMsIGZuKTsKICB9CgogIC8vLyBJbnZva2VzIGBmbmAgZm9yIGV2ZXJ5IGl0ZW0gaW4gdGhlIGxpbmtlZCBsaXN0IGFuZCByZXR1cm5zIHRoZSByZXN1bHRzCiAgLy8vIGluIGEgW0xpc3RdLgogIExpc3QgbWFwVG9MaXN0KGR5bmFtaWMgZm4oVCBpdGVtKSwge2Jvb2wgZ3Jvd2FibGU6IHRydWV9KSB7CiAgICBMaXN0IHJlc3VsdDsKICAgIGlmICghZ3Jvd2FibGUpIHsKICAgICAgcmVzdWx0ID0gbmV3IExpc3Qoc2xvd0xlbmd0aCgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IG5ldyBMaXN0KCk7CiAgICAgIHJlc3VsdC5sZW5ndGggPSBzbG93TGVuZ3RoKCk7CiAgICB9CiAgICBpbnQgaSA9IDA7CiAgICBmb3IgKExpbms8VD4gbGluayA9IHRoaXM7ICFsaW5rLmlzRW1wdHk7IGxpbmsgPSBsaW5rLnRhaWwpIHsKICAgICAgcmVzdWx0W2krK10gPSBmbihsaW5rLmhlYWQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gdHJ1ZTsKICBib29sIGdldCBpc05vdEVtcHR5ID0+IGZhbHNlOwoKICBMaW5rPFQ+IHJldmVyc2UoTGluazxUPiB0YWlsKSA9PiB0aGlzOwoKICBMaW5rPFQ+IHJldmVyc2VQcmVwZW5kQWxsKExpbms8VD4gZnJvbSkgewogICAgaWYgKGZyb20uaXNFbXB0eSkgcmV0dXJuIHRoaXM7CiAgICByZXR1cm4gdGhpcy5wcmVwZW5kKGZyb20uaGVhZCkucmV2ZXJzZVByZXBlbmRBbGwoZnJvbS50YWlsKTsKICB9CgogIExpbms8VD4gc2tpcChpbnQgbikgewogICAgaWYgKG4gPT0gMCkgcmV0dXJuIHRoaXM7CiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggJG4gb3V0IG9mIHJhbmdlJyk7CiAgfQoKICB2b2lkIGZvckVhY2godm9pZCBmKFQgZWxlbWVudCkpIHt9CgogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyEgTGluazxUPikgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIG90aGVyLmlzRW1wdHk7CiAgfQoKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdMaW5rLmhhc2hDb2RlJyk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJbXSI7CgogIGdldCBsZW5ndGggewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ2dldDpsZW5ndGgnKTsKICB9CgogIGludCBzbG93TGVuZ3RoKCkgPT4gMDsKCiAgLy8gVE9ETyhhaGUpOiBSZW1vdmUgdGhpcyBtZXRob2Q/CiAgYm9vbCBjb250YWlucyhPYmplY3QgZWxlbWVudCkgewogICAgZm9yIChMaW5rPFQ+IGxpbmsgPSB0aGlzOyAhbGluay5pc0VtcHR5OyBsaW5rID0gbGluay50YWlsKSB7CiAgICAgIGlmIChsaW5rLmhlYWQgPT0gZWxlbWVudCkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLyBUT0RPKGFoZSk6IFJlbW92ZSB0aGlzIG1ldGhvZD8KICBUIGdldCBzaW5nbGUgewogICAgaWYgKGlzRW1wdHkpIHRocm93IG5ldyBTdGF0ZUVycm9yKCdObyBlbGVtZW50cycpOwogICAgaWYgKCF0YWlsLmlzRW1wdHkpIHRocm93IG5ldyBTdGF0ZUVycm9yKCdNb3JlIHRoYW4gb25lIGVsZW1lbnQnKTsKICAgIHJldHVybiBoZWFkOwogIH0KCiAgLy8gVE9ETyhhaGUpOiBSZW1vdmUgdGhpcyBtZXRob2Q/CiAgVCBnZXQgZmlyc3QgewogICAgaWYgKGlzRW1wdHkpIHRocm93IG5ldyBTdGF0ZUVycm9yKCdObyBlbGVtZW50cycpOwogICAgcmV0dXJuIGhlYWQ7CiAgfQoKICAvLy8gUmV0dXJucyB0cnVlIGlmIGYgcmV0dXJucyB0cnVlIGZvciBhbGwgZWxlbWVudHMgb2YgdGhpcyBsaXN0LgogIC8vLwogIC8vLyBSZXR1cm5zIHRydWUgZm9yIHRoZSBlbXB0eSBsaXN0LgogIGJvb2wgZXZlcnkoYm9vbCBmKFQgZSkpIHsKICAgIGZvciAoTGluazxUPiBsaW5rID0gdGhpczsgIWxpbmsuaXNFbXB0eTsgbGluayA9IGxpbmsudGFpbCkgewogICAgICBpZiAoIWYobGluay5oZWFkKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvLwogIC8vIFVuc3VwcG9ydGVkIEl0ZXJhYmxlPFQ+IG1ldGhvZHMuCiAgLy8KICBib29sIGFueShib29sIGYoVCBlKSkgPT4gX3Vuc3VwcG9ydGVkKCdhbnknKTsKICBJdGVyYWJsZTxUPiBjYXN0PFQ+KCkgPT4gX3Vuc3VwcG9ydGVkKCdjYXN0Jyk7CiAgVCBlbGVtZW50QXQoaW50IGkpID0+IF91bnN1cHBvcnRlZCgnZWxlbWVudEF0Jyk7CiAgSXRlcmFibGU8Sz4gZXhwYW5kPEs+KEl0ZXJhYmxlPEs+IGYoVCBlKSkgPT4gX3Vuc3VwcG9ydGVkKCdleHBhbmQnKTsKICBUIGZpcnN0V2hlcmUoYm9vbCBmKFQgZSksIHtUIG9yRWxzZSgpfSkgPT4gX3Vuc3VwcG9ydGVkKCdmaXJzdFdoZXJlJyk7CiAgSyBmb2xkPEs+KEsgaW5pdGlhbFZhbHVlLCBLIGNvbWJpbmUoSyB2YWx1ZSwgVCBlbGVtZW50KSkgewogICAgcmV0dXJuIF91bnN1cHBvcnRlZCgnZm9sZCcpOwogIH0KCiAgSXRlcmFibGU8VD4gZm9sbG93ZWRCeShJdGVyYWJsZTxUPiBvdGhlcikgPT4gX3Vuc3VwcG9ydGVkKCdmb2xsb3dlZEJ5Jyk7CiAgVCBnZXQgbGFzdCA9PiBfdW5zdXBwb3J0ZWQoJ2dldDpsYXN0Jyk7CiAgVCBsYXN0V2hlcmUoYm9vbCBmKFQgZSksIHtUIG9yRWxzZSgpfSkgPT4gX3Vuc3VwcG9ydGVkKCdsYXN0V2hlcmUnKTsKICBTdHJpbmcgam9pbihbc2VwYXJhdG9yID0gJyddKSA9PiBfdW5zdXBwb3J0ZWQoJ2pvaW4nKTsKICBUIHJlZHVjZShUIGNvbWJpbmUoVCBhLCBUIGIpKSA9PiBfdW5zdXBwb3J0ZWQoJ3JlZHVjZScpOwogIEl0ZXJhYmxlPFQ+IHJldHlwZTxUPigpID0+IF91bnN1cHBvcnRlZCgncmV0eXBlJyk7CiAgVCBzaW5nbGVXaGVyZShib29sIGYoVCBlKSwge1Qgb3JFbHNlKCl9KSA9PiBfdW5zdXBwb3J0ZWQoJ3NpbmdsZVdoZXJlJyk7CiAgSXRlcmFibGU8VD4gc2tpcFdoaWxlKGJvb2wgZihUIGUpKSA9PiBfdW5zdXBwb3J0ZWQoJ3NraXBXaGlsZScpOwogIEl0ZXJhYmxlPFQ+IHRha2UoaW50IG4pID0+IF91bnN1cHBvcnRlZCgndGFrZScpOwogIEl0ZXJhYmxlPFQ+IHRha2VXaGlsZShib29sIGYoVCBlKSkgPT4gX3Vuc3VwcG9ydGVkKCd0YWtlV2hpbGUnKTsKICBTZXQ8VD4gdG9TZXQoKSA9PiBfdW5zdXBwb3J0ZWQoJ3RvU2V0Jyk7CiAgSXRlcmFibGU8VD4gd2hlcmVUeXBlPFQ+KCkgPT4gX3Vuc3VwcG9ydGVkKCd3aGVyZVR5cGUnKTsKICBJdGVyYWJsZTxUPiB3aGVyZShib29sIGYoVCBlKSkgPT4gX3Vuc3VwcG9ydGVkKCd3aGVyZScpOwoKICBfdW5zdXBwb3J0ZWQoU3RyaW5nIG1ldGhvZCkgPT4gdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IobWV0aG9kKTsKfQoKLy8vIEJ1aWxkZXIgb2JqZWN0IGZvciBjcmVhdGluZyBsaW5rZWQgbGlzdHMgdXNpbmcgW0xpbmtdIG9yIGZpeGVkLWxlbmd0aCBbTGlzdF0KLy8vIG9iamVjdHMuCmFic3RyYWN0IGNsYXNzIExpbmtCdWlsZGVyPFQ+IHsKICBmYWN0b3J5IExpbmtCdWlsZGVyKCkgPSBMaW5rQnVpbGRlckltcGxlbWVudGF0aW9uPFQ+OwoKICAvLy8gUHJlcGVuZHMgYWxsIGVsZW1lbnRzIGFkZGVkIHRvIHRoZSBidWlsZGVyIHRvIFt0YWlsXS4gVGhlIHJlc3VsdGluZyBsaXN0CiAgLy8vIGlzIHJldHVybmVkIGFuZCB0aGUgYnVpbGRlciBpcyBjbGVhcmVkLgogIExpbms8VD4gdG9MaW5rKExpbms8VD4gdGFpbCk7CgogIC8vLyBDcmVhdGVzIGEgbmV3IGZpeGVkIGxlbmd0aCBjb250YWluaW5nIGFsbCBhZGRlZCBlbGVtZW50cy4gVGhlCiAgLy8vIHJlc3VsdGluZyBsaXN0IGlzIHJldHVybmVkIGFuZCB0aGUgYnVpbGRlciBpcyBjbGVhcmVkLgogIExpc3Q8VD4gdG9MaXN0KCk7CgogIC8vLyBBZGRzIHRoZSBlbGVtZW50IFt0XSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IGJlaW5nIGJ1aWx0LgogIExpbms8VD4gYWRkTGFzdChUIHQpOwoKICAvLy8gUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgbGlzdCBiZWluZyBidWlsdC4KICBUIGdldCBmaXJzdDsKCiAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCBiZWluZyBidWlsdC4KICBmaW5hbCBpbnQgbGVuZ3RoOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGxpc3QgYmVpbmcgYnVpbHQgaXMgZW1wdHkuCiAgZmluYWwgYm9vbCBpc0VtcHR5OwoKICAvLy8gUmVtb3ZlcyBhbGwgYWRkZWQgZWxlbWVudHMgYW5kIHJlc2V0cyB0aGUgYnVpbGRlci4KICB2b2lkIGNsZWFyKCk7Cn0KgLYATk48ARkBIlEBJzUcARABHywEATkBNgEqFBUqDR4kBg9BHwYTBAFCJTMEAU0TPhEVJw0bJAYPQSMGEwQBHCABKQEsI0EEARgdMwQBJQEcKRoEAUMBHQEPLgQBGQEkIkEtBhIEASQRNkYRBAEkEDYRBAFEBiccQScGEQQBBSYFMDEzR0k9IQQBSypHOTs1S0MzQys7OwFFAgFRDSA4AU8uIAFEPRQBPxgBOQ8BPhQBNxYBORACASpwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdXRpbC9saW5rLmRhcnRCc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3V0aWwvbGlua19pbXBsZW1lbnRhdGlvbi5kYXJ0klMvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS51dGlsLmxpbmtfaW1wbGVtZW50YXRpb247CgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbicgc2hvdyBJdGVyYWJsZUJhc2U7CgppbXBvcnQgJ2xpbmsuZGFydCcgc2hvdyBMaW5rLCBMaW5rQnVpbGRlcjsKCmNsYXNzIExpbmtJdGVyYXRvcjxUPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPFQ+IHsKICBUIF9jdXJyZW50OwogIExpbms8VD4gX2xpbms7CgogIExpbmtJdGVyYXRvcih0aGlzLl9saW5rKTsKCiAgVCBnZXQgY3VycmVudCA9PiBfY3VycmVudDsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmIChfbGluay5pc0VtcHR5KSB7CiAgICAgIF9jdXJyZW50ID0gbnVsbDsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgX2N1cnJlbnQgPSBfbGluay5oZWFkOwogICAgX2xpbmsgPSBfbGluay50YWlsOwogICAgcmV0dXJuIHRydWU7CiAgfQp9Cgp0eXBlZGVmIFQgVHJhbnNmb3JtYXRpb248UywgVD4oUyBpbnB1dCk7CgpjbGFzcyBNYXBwZWRMaW5rSXRlcmF0b3I8UywgVD4gZXh0ZW5kcyBJdGVyYXRvcjxUPiB7CiAgVHJhbnNmb3JtYXRpb248UywgVD4gX3RyYW5zZm9ybWF0aW9uOwogIExpbms8Uz4gX2xpbms7CiAgVCBfY3VycmVudDsKCiAgTWFwcGVkTGlua0l0ZXJhdG9yKHRoaXMuX2xpbmssIHRoaXMuX3RyYW5zZm9ybWF0aW9uKTsKCiAgVCBnZXQgY3VycmVudCA9PiBfY3VycmVudDsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmIChfbGluay5pc0VtcHR5KSB7CiAgICAgIF9jdXJyZW50ID0gbnVsbDsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgX2N1cnJlbnQgPSBfdHJhbnNmb3JtYXRpb24oX2xpbmsuaGVhZCk7CiAgICBfbGluayA9IF9saW5rLnRhaWw7CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn0KCmNsYXNzIE1hcHBlZExpbmtJdGVyYWJsZTxTLCBUPiBleHRlbmRzIEl0ZXJhYmxlQmFzZTxUPiB7CiAgVHJhbnNmb3JtYXRpb248UywgVD4gX3RyYW5zZm9ybWF0aW9uOwogIExpbms8Uz4gX2xpbms7CgogIE1hcHBlZExpbmtJdGVyYWJsZSh0aGlzLl9saW5rLCB0aGlzLl90cmFuc2Zvcm1hdGlvbik7CgogIEl0ZXJhdG9yPFQ+IGdldCBpdGVyYXRvciB7CiAgICByZXR1cm4gbmV3IE1hcHBlZExpbmtJdGVyYXRvcjxTLCBUPihfbGluaywgX3RyYW5zZm9ybWF0aW9uKTsKICB9Cn0KCmNsYXNzIExpbmtFbnRyeTxUPiBleHRlbmRzIExpbms8VD4gewogIGZpbmFsIFQgaGVhZDsKICBMaW5rPFQ+IHRhaWw7CgogIExpbmtFbnRyeSh0aGlzLmhlYWQsIFtMaW5rPFQ+IHRhaWxdKSA6IHRhaWwgPSB0YWlsID8/IGNvbnN0IExpbms8TnVsbD4oKTsKCiAgTGluazxUPiBwcmVwZW5kKFQgZWxlbWVudCkgewogICAgLy8gVE9ETyhhaGUpOiBVc2UgbmV3IExpbms8VD4sIGJ1dCB0aGlzIGNvc3QgOCUgcGVyZm9ybWFuY2Ugb24gVk0uCiAgICByZXR1cm4gbmV3IExpbmtFbnRyeTxUPihlbGVtZW50LCB0aGlzKTsKICB9CgogIHZvaWQgcHJpbnRPbihTdHJpbmdCdWZmZXIgYnVmZmVyLCBbc2VwYXJhdGVkQnldKSB7CiAgICBidWZmZXIud3JpdGUoaGVhZCk7CiAgICBpZiAoc2VwYXJhdGVkQnkgPT0gbnVsbCkgc2VwYXJhdGVkQnkgPSAnJzsKICAgIGZvciAoTGluayBsaW5rID0gdGFpbDsgbGluay5pc05vdEVtcHR5OyBsaW5rID0gbGluay50YWlsKSB7CiAgICAgIGJ1ZmZlci53cml0ZShzZXBhcmF0ZWRCeSk7CiAgICAgIGJ1ZmZlci53cml0ZShsaW5rLmhlYWQpOwogICAgfQogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGJ1ZmZlci53cml0ZSgnWyAnKTsKICAgIHByaW50T24oYnVmZmVyLCAnLCAnKTsKICAgIGJ1ZmZlci53cml0ZSgnIF0nKTsKICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9CgogIEBvdmVycmlkZQogIExpbms8VD4gcmV2ZXJzZShMaW5rPFQ+IHRhaWwpIHsKICAgIExpbms8VD4gcmVzdWx0ID0gdGFpbDsKICAgIGZvciAoTGluazxUPiBsaW5rID0gdGhpczsgbGluay5pc05vdEVtcHR5OyBsaW5rID0gbGluay50YWlsKSB7CiAgICAgIHJlc3VsdCA9IHJlc3VsdC5wcmVwZW5kKGxpbmsuaGVhZCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgTGluazxUPiByZXZlcnNlUHJlcGVuZEFsbChMaW5rPFQ+IGZyb20pIHsKICAgIExpbms8VD4gcmVzdWx0OwogICAgZm9yIChyZXN1bHQgPSB0aGlzOyBmcm9tLmlzTm90RW1wdHk7IGZyb20gPSBmcm9tLnRhaWwpIHsKICAgICAgcmVzdWx0ID0gcmVzdWx0LnByZXBlbmQoZnJvbS5oZWFkKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBMaW5rPFQ+IHNraXAoaW50IG4pIHsKICAgIExpbms8VD4gbGluayA9IHRoaXM7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICBpZiAobGluay5pc0VtcHR5KSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4ICRuIG91dCBvZiByYW5nZScpOwogICAgICB9CiAgICAgIGxpbmsgPSBsaW5rLnRhaWw7CiAgICB9CiAgICByZXR1cm4gbGluazsKICB9CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiB0cnVlOwoKICB2b2lkIGZvckVhY2godm9pZCBmKFQgZWxlbWVudCkpIHsKICAgIGZvciAoTGluazxUPiBsaW5rID0gdGhpczsgbGluay5pc05vdEVtcHR5OyBsaW5rID0gbGluay50YWlsKSB7CiAgICAgIGYobGluay5oZWFkKTsKICAgIH0KICB9CgogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyEgTGluazxUPikgcmV0dXJuIGZhbHNlOwogICAgTGluazxUPiBteUVsZW1lbnRzID0gdGhpczsKICAgIHdoaWxlIChteUVsZW1lbnRzLmlzTm90RW1wdHkgJiYgb3RoZXIuaXNOb3RFbXB0eSkgewogICAgICBpZiAobXlFbGVtZW50cy5oZWFkICE9IG90aGVyLmhlYWQpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgbXlFbGVtZW50cyA9IG15RWxlbWVudHMudGFpbDsKICAgICAgb3RoZXIgPSBvdGhlci50YWlsOwogICAgfQogICAgcmV0dXJuIG15RWxlbWVudHMuaXNFbXB0eSAmJiBvdGhlci5pc0VtcHR5OwogIH0KCiAgaW50IGdldCBoYXNoQ29kZSA9PiB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignTGlua0VudHJ5Lmhhc2hDb2RlJyk7CgogIGludCBzbG93TGVuZ3RoKCkgewogICAgaW50IGxlbmd0aCA9IDA7CiAgICBmb3IgKExpbmsgY3VycmVudCA9IHRoaXM7IGN1cnJlbnQuaXNOb3RFbXB0eTsgY3VycmVudCA9IGN1cnJlbnQudGFpbCkgewogICAgICArK2xlbmd0aDsKICAgIH0KICAgIHJldHVybiBsZW5ndGg7CiAgfQp9CgpjbGFzcyBMaW5rQnVpbGRlckltcGxlbWVudGF0aW9uPFQ+IGltcGxlbWVudHMgTGlua0J1aWxkZXI8VD4gewogIExpbmtFbnRyeTxUPiBoZWFkID0gbnVsbDsKICBMaW5rRW50cnk8VD4gbGFzdExpbmsgPSBudWxsOwogIGludCBsZW5ndGggPSAwOwoKICBMaW5rQnVpbGRlckltcGxlbWVudGF0aW9uKCk7CgogIEBvdmVycmlkZQogIExpbms8VD4gdG9MaW5rKExpbms8VD4gdGFpbCkgewogICAgaWYgKGhlYWQgPT0gbnVsbCkgcmV0dXJuIHRhaWw7CiAgICBsYXN0TGluay50YWlsID0gdGFpbDsKICAgIExpbms8VD4gbGluayA9IGhlYWQ7CiAgICBsYXN0TGluayA9IG51bGw7CiAgICBoZWFkID0gbnVsbDsKICAgIGxlbmd0aCA9IDA7CiAgICByZXR1cm4gbGluazsKICB9CgogIExpc3Q8VD4gdG9MaXN0KCkgewogICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gbmV3IExpc3Q8VD4oMCk7CiAgICBMaXN0PFQ+IGxpc3QgPSBuZXcgTGlzdDxUPihsZW5ndGgpOwogICAgaW50IGluZGV4ID0gMDsKICAgIExpbms8VD4gbGluayA9IGhlYWQ7CiAgICB3aGlsZSAobGluay5pc05vdEVtcHR5KSB7CiAgICAgIGxpc3RbaW5kZXhdID0gbGluay5oZWFkOwogICAgICBsaW5rID0gbGluay50YWlsOwogICAgICBpbmRleCsrOwogICAgfQogICAgbGFzdExpbmsgPSBudWxsOwogICAgaGVhZCA9IG51bGw7CiAgICBsZW5ndGggPSAwOwogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICBMaW5rPFQ+IGFkZExhc3QoVCB0KSB7CiAgICBsZW5ndGgrKzsKICAgIExpbmtFbnRyeTxUPiBlbnRyeSA9IG5ldyBMaW5rRW50cnk8VD4odCwgbnVsbCk7CiAgICBpZiAoaGVhZCA9PSBudWxsKSB7CiAgICAgIGhlYWQgPSBlbnRyeTsKICAgIH0gZWxzZSB7CiAgICAgIGxhc3RMaW5rLnRhaWwgPSBlbnRyeTsKICAgIH0KICAgIGxhc3RMaW5rID0gZW50cnk7CiAgICByZXR1cm4gZW50cnk7CiAgfQoKICBib29sIGdldCBpc0VtcHR5ID0+IGxlbmd0aCA9PSAwOwoKICBUIGdldCBmaXJzdCB7CiAgICBpZiAoaGVhZCAhPSBudWxsKSB7CiAgICAgIHJldHVybiBoZWFkLmhlYWQ7CiAgICB9CiAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigibm8gZWxlbWVudHMiKTsKICB9CgogIHZvaWQgY2xlYXIoKSB7CiAgICBoZWFkID0gbnVsbDsKICAgIGxhc3RMaW5rID0gbnVsbDsKICAgIGxlbmd0aCA9IDA7CiAgfQp9CoDWAE5OPAEoASwBKwEvDhEBHAEdARQZFxQGGxgRBAIBKQE1KBEOATgBHQEUGRcUBiwYEQQCATkoEQE4AR1BBAIBJRAQAUwBH0csBAE1GC9AIR8GBAEWLhgbGB4EAQwiG0MqBhMEASwUPSoGEwQBGBkiGjcIGAYRBAEdHwEkQxQGBAEcKR84KxYIJBoGMAQBSAEVFEwQBhMEAgE/HCASAR8BDCEjGhkVERARBAEVLCgTGR4fGA8GFREQEQQBGQ40GBQNHQYWEgQBIwEQGBgGKQQBEREVEAQCATlwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdXRpbC9saW5rX2ltcGxlbWVudGF0aW9uLmRhcnQ5c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3V0aWwvcmVsYXRpdml6ZS5kYXJ0gkwvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS51dGlsLnJlbGF0aXZpemU7CgovLyBUT0RPKGFoZSk6IE1vdmUgbW9yZSBhZHZhbmNlZCB2ZXJzaW9uIGZyb20gZGFydDJqcyBoZXJlLgoKZmluYWwgVXJpIGN1cnJlbnREaXJlY3RvcnkgPSBVcmkuYmFzZTsKClN0cmluZyByZWxhdGl2aXplVXJpKFVyaSB1cmksIHtVcmkgYmFzZX0pIHsKICBpZiAodXJpID09IG51bGwpIHJldHVybiBudWxsOwogIGJhc2UgPz89IGN1cnJlbnREaXJlY3Rvcnk7CiAgU3RyaW5nIHJlc3VsdCA9ICIkdXJpIjsKICBmaW5hbCBwcmVmaXggPSAiJGJhc2UiOwogIHJldHVybiByZXN1bHQuc3RhcnRzV2l0aChwcmVmaXgpID8gcmVzdWx0LnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKSA6IHJlc3VsdDsKfQoTAE5OPAEfATwBJwEsIB0aGk8CATBwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdXRpbC9yZWxhdGl2aXplLmRhcnQnc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9jb21waWxlci5kYXJ0mxMvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBjb21waWxlcjsKCmltcG9ydCAnZGFydDphc3luYyc7CgppbXBvcnQgJ2NvbXBpbGVyX25ldy5kYXJ0JyBhcyBuZXdfYXBpOwppbXBvcnQgJ3NyYy9vbGRfdG9fbmV3X2FwaS5kYXJ0JzsKaW1wb3J0ICdzcmMvb3B0aW9ucy5kYXJ0JyBzaG93IENvbXBpbGVyT3B0aW9uczsKCi8vIFVubGVzcyBleHBsaWNpdGx5IGFsbG93ZWQsIHBhc3NpbmcgWzpudWxsOl0gZm9yIGFueSBhcmd1bWVudCB0byB0aGUKLy8gbWV0aG9kcyBvZiBsaWJyYXJ5IHdpbGwgcmVzdWx0IGluIGFuIEVycm9yIGJlaW5nIHRocm93bi4KCi8vLyBSZXR1cm5zIGEgZnV0dXJlIHRoYXQgY29tcGxldGVzIHRvIHRoZSBzb3VyY2UgY29ycmVzcG9uZGluZyB0byBbdXJpXS4KLy8vIElmIGFuIGV4Y2VwdGlvbiBvY2N1cnMsIHRoZSBmdXR1cmUgY29tcGxldGVzIHdpdGggdGhpcyBleGNlcHRpb24uCi8vLwovLy8gVGhlIHNvdXJjZSBjYW4gYmUgcmVwcmVzZW50ZWQgZWl0aGVyIGFzIGEgWzpMaXN0PGludD46XSBvZiBVVEYtOCBieXRlcyBvciBhcwovLy8gYSBbU3RyaW5nXS4KLy8vCi8vLyBUaGUgZm9sbG93aW5nIHRleHQgaXMgbm9uLW5vcm1hdGl2ZToKLy8vCi8vLyBJdCBpcyByZWNvbW1lbmRlZCB0byByZXR1cm4gYSBVVEYtOCBlbmNvZGVkIGxpc3Qgb2YgYnl0ZXMgYmVjYXVzZSB0aGUKLy8vIHNjYW5uZXIgaXMgbW9yZSBlZmZpY2llbnQgaW4gdGhpcyBjYXNlLiBJbiBlaXRoZXIgY2FzZSwgdGhlIGRhdGEgc3RydWN0dXJlCi8vLyBpcyBleHBlY3RlZCB0byBob2xkIGEgemVybyBlbGVtZW50IGF0IHRoZSBsYXN0IHBvc2l0aW9uLiBJZiB0aGlzIGlzIG5vdCB0aGUKLy8vIGNhc2UsIHRoZSBlbnRpcmUgZGF0YSBzdHJ1Y3R1cmUgaXMgY29waWVkIGJlZm9yZSBzY2FubmluZy4KdHlwZWRlZiBGdXR1cmUgLyogPFN0cmluZyB8IExpc3Q8aW50Pj4gKi8gQ29tcGlsZXJJbnB1dFByb3ZpZGVyKFVyaSB1cmkpOwoKLy8vIERlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgW0NvbXBpbGVySW5wdXRQcm92aWRlcl0gaW5zdGVhZC4KdHlwZWRlZiBGdXR1cmU8U3RyaW5nPiBSZWFkU3RyaW5nRnJvbVVyaShVcmkgdXJpKTsKCi8vLyBSZXR1cm5zIGFuIFtFdmVudFNpbmtdIHRoYXQgd2lsbCBzZXJ2ZSBhcyBjb21waWxlciBvdXRwdXQgZm9yIHRoZSBnaXZlbgovLy8gY29tcG9uZW50LgovLy8KLy8vIENvbXBvbmVudHMgYXJlIGlkZW50aWZpZWQgYnkgW25hbWVdIGFuZCBbZXh0ZW5zaW9uXS4gQnkgY29udmVudGlvbiwKLy8vIHRoZSBlbXB0eSBzdHJpbmcgWzoiIjpdIHdpbGwgcmVwcmVzZW50IHRoZSBtYWluIHNjcmlwdAovLy8gKGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNjcmlwdCBwYXJhbWV0ZXIgb2YgW2NvbXBpbGVdKSBldmVuIGlmIHRoZQovLy8gbWFpbiBzY3JpcHQgaXMgYSBsaWJyYXJ5LiBGb3IgbGlicmFyaWVzIHRoYXQgYXJlIGNvbXBpbGVkCi8vLyBzZXBhcmF0ZWx5LCB0aGUgbGlicmFyeSBuYW1lIGlzIHVzZWQuCi8vLwovLy8gQXQgbGVhc3QgdGhlIGZvbGxvd2luZyBleHRlbnNpb25zIGNhbiBiZSBleHBlY3RlZDoKLy8vCi8vLyAqICJqcyIgZm9yIEphdmFTY3JpcHQgb3V0cHV0LgovLy8gKiAianMubWFwIiBmb3Igc291cmNlIG1hcHMuCi8vLyAqICJkYXJ0IiBmb3IgRGFydCBvdXRwdXQuCi8vLyAqICJkYXJ0Lm1hcCIgZm9yIHNvdXJjZSBtYXBzLgovLy8KLy8vIEFzIG1vcmUgZmVhdHVyZXMgYXJlIGFkZGVkIHRvIHRoZSBjb21waWxlciwgbmV3IG5hbWVzIGFuZAovLy8gZXh0ZW5zaW9ucyBtYXkgYmUgaW50cm9kdWNlZC4KdHlwZWRlZiBFdmVudFNpbms8U3RyaW5nPiBDb21waWxlck91dHB1dFByb3ZpZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgZXh0ZW5zaW9uKTsKCi8vLyBJbnZva2VkIGJ5IHRoZSBjb21waWxlciB0byByZXBvcnQgZGlhZ25vc3RpY3MuIElmIFt1cmldIGlzCi8vLyBbOm51bGw6XSwgc28gYXJlIFtiZWdpbl0gYW5kIFtlbmRdLiBObyBvdGhlciBhcmd1bWVudHMgbWF5IGJlCi8vLyBbOm51bGw6XS4gSWYgW3VyaV0gaXMgbm90IFs6bnVsbDpdLCBuZWl0aGVyIGFyZSBbYmVnaW5dIGFuZAovLy8gW2VuZF0uIFt1cmldIGluZGljYXRlcyB0aGUgY29tcGlsYXRpb24gdW5pdCBmcm9tIHdoZXJlIHRoZQovLy8gZGlhZ25vc3RpYyBvcmlnaW5hdGVzLiBbYmVnaW5dIGFuZCBbZW5kXSBhcmUgemVyby1iYXNlZCBjaGFyYWN0ZXIKLy8vIG9mZnNldHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LiBbbWVzc2FnZV0gaXMgdGhlCi8vLyBkaWFnbm9zdGljIG1lc3NhZ2UsIGFuZCBba2luZF0gaW5kaWNhdGVzIGluZGljYXRlcyB3aGF0IGtpbmQgb2YKLy8vIGRpYWdub3N0aWMgaXQgaXMuCnR5cGVkZWYgdm9pZCBEaWFnbm9zdGljSGFuZGxlcigKICAgIFVyaSB1cmksIGludCBiZWdpbiwgaW50IGVuZCwgU3RyaW5nIG1lc3NhZ2UsIERpYWdub3N0aWMga2luZCk7CgovLy8gSW5mb3JtYXRpb24gcmVzdWx0aW5nIGZyb20gdGhlIGNvbXBpbGF0aW9uLgpjbGFzcyBDb21waWxhdGlvblJlc3VsdCB7CiAgLy8vIGB0cnVlYCBpZiB0aGUgY29tcGlsYXRpb24gc3VjY2VlZGVkLCB0aGF0IGlzLCBjb21waWxhdGlvbiBkaWRuJ3QgZmFpbCBkdWUKICAvLy8gdG8gY29tcGlsZS10aW1lIGVycm9ycyBhbmQvb3IgaW50ZXJuYWwgZXJyb3JzLgogIGZpbmFsIGJvb2wgaXNTdWNjZXNzOwoKICAvLy8gVGhlIGNvbXBpbGVyIG9iamVjdCB1c2VkIGZvciB0aGUgY29tcGlsYXRpb24uCiAgLy8vCiAgLy8vIE5vdGU6IFRoZSB0eXBlIG9mIFtjb21waWxlcl0gaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGFuZCBtYXkgdmFyeS4KICAvLy8gVXNlIG9ubHkgZm9yIGRlYnVnZ2luZyBhbmQgdGVzdGluZy4KICBmaW5hbCBjb21waWxlcjsKCiAgQ29tcGlsYXRpb25SZXN1bHQodGhpcy5jb21waWxlciwge3RoaXMuaXNTdWNjZXNzOiB0cnVlfSk7Cn0KCi8vLyBSZXR1cm5zIGEgZnV0dXJlIHRoYXQgY29tcGxldGVzIHRvIGEgbm9uLW51bGwgU3RyaW5nIHdoZW4gW3NjcmlwdF0KLy8vIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb21waWxlZC4KLy8vCi8vLyBUaGUgY29tcGlsZXIgb3V0cHV0IGlzIG9idGFpbmVkIGJ5IHByb3ZpZGluZyBhbiBbb3V0cHV0UHJvdmlkZXJdLgovLy8KLy8vIElmIHRoZSBjb21waWxhdGlvbiBmYWlscywgdGhlIGZ1dHVyZSdzIHZhbHVlIHdpbGwgYmUgWzpudWxsOl0gYW5kCi8vLyBbaGFuZGxlcl0gd2lsbCBoYXZlIGJlZW4gaW52b2tlZCBhdCBsZWFzdCBvbmNlIHdpdGggWzpraW5kID09Ci8vLyBEaWFnbm9zdGljLkVSUk9SOl0gb3IgWzpraW5kID09IERpYWdub3N0aWMuQ1JBU0g6XS4KLy8vCi8vLyBEZXByZWNhdGVkOiBpZiBubyBbb3V0cHV0UHJvdmlkZXJdIGlzIGdpdmVuLCB0aGUgZnV0dXJlIGNvbXBsZXRlcwovLy8gdG8gdGhlIGNvbXBpbGVkIHNjcmlwdC4gVGhpcyBiZWhhdmlvciB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZQovLy8gYXMgdGhlIGNvbXBpbGVyIG1heSBjcmVhdGUgbXVsdGlwbGUgZmlsZXMgdG8gc3VwcG9ydCBsYXp5IGxvYWRpbmcKLy8vIG9mIGxpYnJhcmllcy4KRnV0dXJlPENvbXBpbGF0aW9uUmVzdWx0PiBjb21waWxlKAogICAgVXJpIHNjcmlwdCwKICAgIFVyaSBsaWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpLAogICAgVXJpIHBhY2thZ2VSb290LAogICAgQ29tcGlsZXJJbnB1dFByb3ZpZGVyIGlucHV0UHJvdmlkZXIsCiAgICBEaWFnbm9zdGljSGFuZGxlciBoYW5kbGVyLAogICAgW0xpc3Q8U3RyaW5nPiBvcHRpb25zID0gY29uc3QgW10sCiAgICBDb21waWxlck91dHB1dFByb3ZpZGVyIG91dHB1dFByb3ZpZGVyLAogICAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudCA9IGNvbnN0IHt9LAogICAgVXJpIHBhY2thZ2VDb25maWddKSB7CiAgQ29tcGlsZXJPcHRpb25zIGNvbXBpbGVyT3B0aW9ucyA9IENvbXBpbGVyT3B0aW9ucy5wYXJzZShvcHRpb25zLAogICAgICBsaWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpOiBsaWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpKQogICAgLi5lbnRyeVBvaW50ID0gc2NyaXB0CiAgICAuLnBhY2thZ2VSb290ID0gcGFja2FnZVJvb3QKICAgIC4ucGFja2FnZUNvbmZpZyA9IHBhY2thZ2VDb25maWcKICAgIC4uZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKCiAgbmV3X2FwaS5Db21waWxlcklucHV0IGNvbXBpbGVySW5wdXQgPSBuZXcgTGVnYWN5Q29tcGlsZXJJbnB1dChpbnB1dFByb3ZpZGVyKTsKICBuZXdfYXBpLkNvbXBpbGVyRGlhZ25vc3RpY3MgY29tcGlsZXJEaWFnbm9zdGljcyA9CiAgICAgIG5ldyBMZWdhY3lDb21waWxlckRpYWdub3N0aWNzKGhhbmRsZXIpOwogIG5ld19hcGkuQ29tcGlsZXJPdXRwdXQgY29tcGlsZXJPdXRwdXQgPQogICAgICBuZXcgTGVnYWN5Q29tcGlsZXJPdXRwdXQob3V0cHV0UHJvdmlkZXIpOwoKICByZXR1cm4gbmV3X2FwaQogICAgICAuY29tcGlsZSgKICAgICAgICAgIGNvbXBpbGVyT3B0aW9ucywgY29tcGlsZXJJbnB1dCwgY29tcGlsZXJEaWFnbm9zdGljcywgY29tcGlsZXJPdXRwdXQpCiAgICAgIC50aGVuKChuZXdfYXBpLkNvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCkgewogICAgcmV0dXJuIG5ldyBDb21waWxhdGlvblJlc3VsdChyZXN1bHQuY29tcGlsZXIsIGlzU3VjY2VzczogcmVzdWx0LmlzU3VjY2Vzcyk7CiAgfSk7Cn0KCi8vLyBLaW5kIG9mIGRpYWdub3N0aWNzIHRoYXQgdGhlIGNvbXBpbGVyIGNhbiByZXBvcnQuCmNsYXNzIERpYWdub3N0aWMgewogIC8vLyBBbiBlcnJvciBhcyBpZGVudGlmaWVkIGJ5IHRoZSAiRGFydCBQcm9ncmFtbWluZyBMYW5ndWFnZQogIC8vLyBTcGVjaWZpY2F0aW9uIiBbaHR0cDovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy9zcGVjL10uCiAgLy8vCiAgLy8vIE5vdGU6IHRoZSBjb21waWxlciBtYXkgc3RpbGwgcHJvZHVjZSBhbiBleGVjdXRhYmxlIHJlc3VsdCBhZnRlcgogIC8vLyByZXBvcnRpbmcgYSBjb21waWxhdGlvbiBlcnJvci4gVGhlIHNwZWNpZmljYXRpb24gc2F5czoKICAvLy8KICAvLy8gIkEgY29tcGlsZS10aW1lIGVycm9yIG11c3QgYmUgcmVwb3J0ZWQgYnkgYSBEYXJ0IGNvbXBpbGVyIGJlZm9yZQogIC8vLyB0aGUgZXJyb25lb3VzIGNvZGUgaXMgZXhlY3V0ZWQuIiBhbmQgIklmIGEgY29tcGlsZS10aW1lIGVycm9yCiAgLy8vIG9jY3VycyB3aXRoaW4gdGhlIGNvZGUgb2YgYSBydW5uaW5nIGlzb2xhdGUgQSwgQSBpcyBpbW1lZGlhdGVseQogIC8vLyBzdXNwZW5kZWQuIgogIC8vLwogIC8vLyBUaGlzIG1lYW5zIHRoYXQgdGhlIGNvbXBpbGVyIGNhbiBnZW5lcmF0ZSBjb2RlIHRoYXQgd2hlbiBleGVjdXRlZAogIC8vLyB0ZXJtaW5hdGVzIGV4ZWN1dGlvbi4KICBzdGF0aWMgY29uc3QgRGlhZ25vc3RpYyBFUlJPUiA9IGNvbnN0IERpYWdub3N0aWMoMSwgJ2Vycm9yJyk7CgogIC8vLyBBIHdhcm5pbmcgYXMgaWRlbnRpZmllZCBieSB0aGUgIkRhcnQgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UKICAvLy8gU3BlY2lmaWNhdGlvbiIgW2h0dHA6Ly93d3cuZGFydGxhbmcub3JnL2RvY3Mvc3BlYy9dLgogIHN0YXRpYyBjb25zdCBEaWFnbm9zdGljIFdBUk5JTkcgPSBjb25zdCBEaWFnbm9zdGljKDIsICd3YXJuaW5nJyk7CgogIC8vLyBBbnkgb3RoZXIgd2FybmluZyB0aGF0IGlzIG5vdCBjb3ZlcmVkIGJ5IFtXQVJOSU5HXS4KICBzdGF0aWMgY29uc3QgRGlhZ25vc3RpYyBISU5UID0gY29uc3QgRGlhZ25vc3RpYyg0LCAnaGludCcpOwoKICAvLy8gQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJlY2VkaW5nIG5vbi1pbmZvIGRpYWdub3N0aWMgZnJvbSB0aGUKICAvLy8gY29tcGlsZXIuCiAgLy8vCiAgLy8vIEZvciBleGFtcGxlLCBjb25zaWRlciBhIGR1cGxpY2F0ZWQgZGVmaW5pdGlvbi4gVGhlIGNvbXBpbGVyIGZpcnN0IGVtaXRzIGEKICAvLy8gbWVzc2FnZSBhYm91dCB0aGUgZHVwbGljYXRlZCBkZWZpbml0aW9uLCB0aGVuIGVtaXRzIGFuIGluZm8gbWVzc2FnZSBhYm91dAogIC8vLyB0aGUgbG9jYXRpb24gb2YgdGhlIGV4aXN0aW5nIGRlZmluaXRpb24uCiAgc3RhdGljIGNvbnN0IERpYWdub3N0aWMgSU5GTyA9IGNvbnN0IERpYWdub3N0aWMoOCwgJ2luZm8nKTsKCiAgLy8vIEluZm9ybWF0aW9uYWwgbWVzc2FnZXMgdGhhdCBzaG91bGRuJ3QgYmUgcHJpbnRlZCB1bmxlc3MKICAvLy8gZXhwbGljaXRseSByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIgb2YgYSBjb21waWxlci4KICBzdGF0aWMgY29uc3QgRGlhZ25vc3RpYyBWRVJCT1NFX0lORk8gPSBjb25zdCBEaWFnbm9zdGljKDE2LCAndmVyYm9zZSBpbmZvJyk7CgogIC8vLyBBbiBpbnRlcm5hbCBlcnJvciBpbiB0aGUgY29tcGlsZXIuCiAgc3RhdGljIGNvbnN0IERpYWdub3N0aWMgQ1JBU0ggPSBjb25zdCBEaWFnbm9zdGljKDMyLCAnY3Jhc2gnKTsKCiAgLy8vIEFuIFtpbnRdIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMga2luZC4gVGhlIG9yZGluYWxzIGFyZSBkZXNpZ25lZAogIC8vLyB0byBiZSB1c2VkIGFzIGJpdHNldHMuCiAgZmluYWwgaW50IG9yZGluYWw7CgogIC8vLyBUaGUgbmFtZSBvZiB0aGlzIGtpbmQuCiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIC8vLyBUaGlzIGNvbnN0cnVjdG9yIGlzIG5vdCBwcml2YXRlIHRvIHN1cHBvcnQgdXNlci1kZWZpbmVkCiAgLy8vIGRpYWdub3N0aWMga2luZHMuCiAgY29uc3QgRGlhZ25vc3RpYyh0aGlzLm9yZGluYWwsIHRoaXMubmFtZSk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IG5hbWU7Cn0KgLEATk48ARIBFQEnIjABRzwBSkYEURAEKQRKT1A/SgE8MwFMDwRIO0U+KgQ3BCIgHiIEPiJRAT9CQD9GSUQWIEMBMBpQNRgBNAZNKhIBPAIBRyQERgRGQjgERkhGEiMQIxUpHyYrMBpDPBogJCEBUDQuKjABERBPMVAGAgE2Ez87BkY9BkdERhIGSBxAAUA7RAE6PgFOEAZQUC8+AT42TwEpQQFGHRUBHRUBPhgtAQwdAgEecGFja2FnZTpjb21waWxlci9jb21waWxlci5kYXJ0KnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2FwaWltcGwuZGFydKLfLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgbGVnX2FwaWltcGw7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnOwppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyB1dGY4OwoKaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL2RhcnQyanMuZGFydCcKICAgIHNob3cgZ2V0U3VwcG9ydGVkTGlicmFyeU5hbWVzOwoKaW1wb3J0ICcuLi9jb21waWxlcl9uZXcuZGFydCcgYXMgYXBpOwppbXBvcnQgJ2NvbW1vbi90YXNrcy5kYXJ0JyBzaG93IEdlbmVyaWNUYXNrLCBNZWFzdXJlcjsKaW1wb3J0ICdjb21tb24uZGFydCc7CmltcG9ydCAnY29tcGlsZXIuZGFydCc7CmltcG9ydCAnZGlhZ25vc3RpY3MvbWVzc2FnZXMuZGFydCcgc2hvdyBNZXNzYWdlOwppbXBvcnQgJ2Vudmlyb25tZW50LmRhcnQnOwppbXBvcnQgJ2lvL3NvdXJjZV9maWxlLmRhcnQnOwppbXBvcnQgJ29wdGlvbnMuZGFydCcgc2hvdyBDb21waWxlck9wdGlvbnM7CgovLy8gSW1wbGVtZW50cyB0aGUgW0NvbXBpbGVyXSB1c2luZyBhIFthcGkuQ29tcGlsZXJJbnB1dF0gZm9yIHN1cHBseWluZyB0aGUKLy8vIHNvdXJjZXMuCmNsYXNzIENvbXBpbGVySW1wbCBleHRlbmRzIENvbXBpbGVyIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBNZWFzdXJlciBtZWFzdXJlcjsKICBAb3ZlcnJpZGUKICBhcGkuQ29tcGlsZXJJbnB1dCBwcm92aWRlcjsKICBhcGkuQ29tcGlsZXJEaWFnbm9zdGljcyBoYW5kbGVyOwoKICBHZW5lcmljVGFzayB1c2VySGFuZGxlclRhc2s7CiAgR2VuZXJpY1Rhc2sgdXNlclByb3ZpZGVyVGFzazsKCiAgQ29tcGlsZXJJbXBsKHRoaXMucHJvdmlkZXIsIGFwaS5Db21waWxlck91dHB1dCBvdXRwdXRQcm92aWRlciwgdGhpcy5oYW5kbGVyLAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgICAge01ha2VSZXBvcnRlckZ1bmN0aW9uIG1ha2VSZXBvcnRlcn0pCiAgICAgIC8vIE5PVEU6IGFsbG9jYXRpbmcgbWVhc3VyZXIgaXMgZG9uZSB1cGZyb250IHRvIGVuc3VyZSB0aGUgd2FsbGNsb2NrIGlzCiAgICAgIC8vIHN0YXJ0ZWQgYmVmb3JlIG90aGVyIGNvbXB1dGF0aW9ucy4KICAgICAgOiBtZWFzdXJlciA9IG5ldyBNZWFzdXJlcihlbmFibGVUYXNrTWVhc3VyZW1lbnRzOiBvcHRpb25zLnZlcmJvc2UpLAogICAgICAgIHN1cGVyKAogICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zLAogICAgICAgICAgICBvdXRwdXRQcm92aWRlcjogb3V0cHV0UHJvdmlkZXIsCiAgICAgICAgICAgIGVudmlyb25tZW50OiBuZXcgX0Vudmlyb25tZW50KG9wdGlvbnMuZW52aXJvbm1lbnQpLAogICAgICAgICAgICBtYWtlUmVwb3J0ZXI6IG1ha2VSZXBvcnRlcikgewogICAgdGFza3MuYWRkQWxsKFsKICAgICAgdXNlckhhbmRsZXJUYXNrID0gbmV3IEdlbmVyaWNUYXNrKCdEaWFnbm9zdGljIGhhbmRsZXInLCBtZWFzdXJlciksCiAgICAgIHVzZXJQcm92aWRlclRhc2sgPSBuZXcgR2VuZXJpY1Rhc2soJ0lucHV0IHByb3ZpZGVyJywgbWVhc3VyZXIpLAogICAgXSk7CiAgfQoKICB2b2lkIGxvZyhtZXNzYWdlKSB7CiAgICBjYWxsVXNlckhhbmRsZXIoCiAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbWVzc2FnZSwgYXBpLkRpYWdub3N0aWMuVkVSQk9TRV9JTkZPKTsKICB9CgogIEZ1dHVyZSBzZXR1cFNkaygpIHsKICAgIHZhciBmdXR1cmUgPSBuZXcgRnV0dXJlLnZhbHVlKG51bGwpOwogICAgX0Vudmlyb25tZW50IGVudiA9IGVudmlyb25tZW50OwogICAgaWYgKGVudi5zdXBwb3J0ZWRMaWJyYXJpZXMgPT0gbnVsbCkgewogICAgICBmdXR1cmUgPSBmdXR1cmUudGhlbigoXykgewogICAgICAgIFVyaSBzcGVjaWZpY2F0aW9uVXJpID0gb3B0aW9ucy5saWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpOwogICAgICAgIHJldHVybiBwcm92aWRlci5yZWFkRnJvbVVyaShzcGVjaWZpY2F0aW9uVXJpKS50aGVuKChhcGkuSW5wdXQgc3BlYykgewogICAgICAgICAgU3RyaW5nIGpzb24gPSBudWxsOwogICAgICAgICAgLy8gVE9ETyhzaWdtdW5kKTogc2ltcGxpZnkgdGhpcywgd2UgaGF2ZSBzb21lIEFQSSBpbmNvbnNpc3RlbmNpZXMgd2hlbgogICAgICAgICAgLy8gb3VyIGludGVybmFsIGlucHV0IGFkZHMgYSB0ZXJtaW5hdGluZyB6ZXJvLgogICAgICAgICAgaWYgKHNwZWMgaXMgU291cmNlRmlsZSkgewogICAgICAgICAgICBqc29uID0gc3BlYy5zbG93VGV4dCgpOwogICAgICAgICAgfSBlbHNlIGlmIChzcGVjIGlzIEJpbmFyeSkgewogICAgICAgICAgICBqc29uID0gdXRmOC5kZWNvZGUoc3BlYy5kYXRhKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBUT0RPKHNpZ211bmQpOiB3b3VsZCBiZSBuaWNlIHRvIGZyb250LWxvYWQgc29tZSBvZiB0aGUgQ0ZFIG9wdGlvbgogICAgICAgICAgLy8gcHJvY2Vzc2luZyBhbmQgcGFyc2UgdGhpcyAuanNvbiBmaWxlIG9ubHkgb25jZS4KICAgICAgICAgIGVudi5zdXBwb3J0ZWRMaWJyYXJpZXMgPSBnZXRTdXBwb3J0ZWRMaWJyYXJ5TmFtZXMoc3BlY2lmaWNhdGlvblVyaSwKICAgICAgICAgICAgICAgICAganNvbiwgb3B0aW9ucy5jb21waWxlRm9yU2VydmVyID8gImRhcnQyanNfc2VydmVyIiA6ICJkYXJ0MmpzIikKICAgICAgICAgICAgICAudG9TZXQoKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGlzIGRvZXMgbm90IGFwcGx5IGFueW1vcmUuCiAgICAvLyBUaGUgaW5jcmVtZW50YWwgY29tcGlsZXIgc2V0cyB1cCB0aGUgc2RrIGJlZm9yZSBydW4uCiAgICAvLyBUaGVyZWZvcmUgdGhpcyB3aWxsIGJlIGNhbGxlZCBhIHNlY29uZCB0aW1lLgogICAgcmV0dXJuIGZ1dHVyZTsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxib29sPiBydW4oVXJpIHVyaSkgewogICAgRHVyYXRpb24gc2V0dXBEdXJhdGlvbiA9IG1lYXN1cmVyLmVsYXBzZWRXYWxsQ2xvY2s7CiAgICByZXR1cm4gc2VsZlRhc2subWVhc3VyZVN1YnRhc2soImltcGwucnVuIiwgKCkgewogICAgICByZXR1cm4gc2V0dXBTZGsoKS50aGVuKChfKSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLnJ1bih1cmkpOwogICAgICB9KS50aGVuKChib29sIHN1Y2Nlc3MpIHsKICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7CiAgICAgICAgICBTdHJpbmdCdWZmZXIgdGltaW5ncyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgICAgIGNvbXB1dGVUaW1pbmdzKHNldHVwRHVyYXRpb24sIHRpbWluZ3MpOwogICAgICAgICAgbG9nKCIkdGltaW5ncyIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3VjY2VzczsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIFN0cmluZyBfZm9ybWF0TXMoaW50IG1zKSB7CiAgICByZXR1cm4gKG1zIC8gMTAwMCkudG9TdHJpbmdBc0ZpeGVkKDMpICsgJ3MnOwogIH0KCiAgdm9pZCBjb21wdXRlVGltaW5ncyhEdXJhdGlvbiBzZXR1cER1cmF0aW9uLCBTdHJpbmdCdWZmZXIgdGltaW5ncykgewogICAgdGltaW5ncy53cml0ZWxuKCJUaW1pbmdzOiIpOwogICAgRHVyYXRpb24gdG90YWxEdXJhdGlvbiA9IG1lYXN1cmVyLmVsYXBzZWRXYWxsQ2xvY2s7CiAgICBEdXJhdGlvbiBhc3luY0R1cmF0aW9uID0gbWVhc3VyZXIuZWxhcHNlZEFzeW5jV2FsbENsb2NrOwogICAgRHVyYXRpb24gY3VtdWxhdGVkRHVyYXRpb24gPSBEdXJhdGlvbi56ZXJvOwogICAgTGlzdDxfVGltaW5nRGF0YT4gdGltaW5nRGF0YSA9IFtdOwogICAgZm9yIChmaW5hbCB0YXNrIGluIHRhc2tzKSB7CiAgICAgIFN0cmluZyBydW5uaW5nID0gdGFzay5pc1J1bm5pbmcgPyAiKiIgOiAiICI7CiAgICAgIER1cmF0aW9uIGR1cmF0aW9uID0gdGFzay5kdXJhdGlvbjsKICAgICAgaWYgKGR1cmF0aW9uICE9IER1cmF0aW9uLnplcm8pIHsKICAgICAgICBjdW11bGF0ZWREdXJhdGlvbiArPSBkdXJhdGlvbjsKICAgICAgICBpbnQgbWlsbGlzZWNvbmRzID0gZHVyYXRpb24uaW5NaWxsaXNlY29uZHM7CiAgICAgICAgdGltaW5nRGF0YS5hZGQoX1RpbWluZ0RhdGEoJyAgICRydW5uaW5nJHt0YXNrLm5hbWV9OicsIG1pbGxpc2Vjb25kcywKICAgICAgICAgICAgbWlsbGlzZWNvbmRzICogMTAwIC8gdG90YWxEdXJhdGlvbi5pbk1pbGxpc2Vjb25kcykpOwogICAgICAgIGZvciAoU3RyaW5nIHN1YnRhc2sgaW4gdGFzay5zdWJ0YXNrcykgewogICAgICAgICAgaW50IHN1YnRpbWUgPSB0YXNrLmdldFN1YnRhc2tUaW1lKHN1YnRhc2spOwogICAgICAgICAgU3RyaW5nIHJ1bm5pbmcgPSB0YXNrLmdldFN1YnRhc2tJc1J1bm5pbmcoc3VidGFzaykgPyAiKiIgOiAiICI7CiAgICAgICAgICB0aW1pbmdEYXRhLmFkZChfVGltaW5nRGF0YSgnICAgJHJ1bm5pbmcke3Rhc2submFtZX0gPiAkc3VidGFzazonLAogICAgICAgICAgICAgIHN1YnRpbWUsIHN1YnRpbWUgKiAxMDAgLyB0b3RhbER1cmF0aW9uLmluTWlsbGlzZWNvbmRzKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpbnQgbG9uZ2VzdERlc2NyaXB0aW9uID0gdGltaW5nRGF0YQogICAgICAgIC5tYXAoKGQpID0+IGQuZGVzY3JpcHRpb24ubGVuZ3RoKQogICAgICAgIC5mb2xkKDAsIChhLCBiKSA9PiBhIDwgYiA/IGIgOiBhKTsKICAgIGZvciAodmFyIGRhdGEgaW4gdGltaW5nRGF0YSkgewogICAgICB2YXIgbXMgPSBfZm9ybWF0TXMoZGF0YS5taWxsaXNlY29uZHMpOwogICAgICB2YXIgcGFkZGluZyA9CiAgICAgICAgICAiICIgKiAobG9uZ2VzdERlc2NyaXB0aW9uICsgMTAgLSBkYXRhLmRlc2NyaXB0aW9uLmxlbmd0aCAtIG1zLmxlbmd0aCk7CiAgICAgIHZhciBwZXJjZW50UGFkZGluZyA9IGRhdGEucGVyY2VudCA8IDEwID8gIiAiIDogIiI7CiAgICAgIHRpbWluZ3Mud3JpdGVsbignJHtkYXRhLmRlc2NyaXB0aW9ufSRwYWRkaW5nICRtcyAnCiAgICAgICAgICAnJHBlcmNlbnRQYWRkaW5nKCR7ZGF0YS5wZXJjZW50LnRvU3RyaW5nQXNGaXhlZCgxKX0lKScpOwogICAgfQogICAgRHVyYXRpb24gdW5hY2NvdW50ZWREdXJhdGlvbiA9CiAgICAgICAgdG90YWxEdXJhdGlvbiAtIGN1bXVsYXRlZER1cmF0aW9uIC0gc2V0dXBEdXJhdGlvbiAtIGFzeW5jRHVyYXRpb247CiAgICBkb3VibGUgcGVyY2VudCA9CiAgICAgICAgdW5hY2NvdW50ZWREdXJhdGlvbi5pbk1pbGxpc2Vjb25kcyAqIDEwMCAvIHRvdGFsRHVyYXRpb24uaW5NaWxsaXNlY29uZHM7CiAgICB0aW1pbmdzLndyaXRlKAogICAgICAgICcgICAgVG90YWwgY29tcGlsZS10aW1lICR7X2Zvcm1hdE1zKHRvdGFsRHVyYXRpb24uaW5NaWxsaXNlY29uZHMpfTsnCiAgICAgICAgJyBzZXR1cCAke19mb3JtYXRNcyhzZXR1cER1cmF0aW9uLmluTWlsbGlzZWNvbmRzKX07JwogICAgICAgICcgYXN5bmMgJHtfZm9ybWF0TXMoYXN5bmNEdXJhdGlvbi5pbk1pbGxpc2Vjb25kcyl9OycKICAgICAgICAnIHVuYWNjb3VudGVkICR7X2Zvcm1hdE1zKHVuYWNjb3VudGVkRHVyYXRpb24uaW5NaWxsaXNlY29uZHMpfScKICAgICAgICAnICgke3BlcmNlbnQudG9TdHJpbmdBc0ZpeGVkKDIpfSUpJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlcG9ydERpYWdub3N0aWMoRGlhZ25vc3RpY01lc3NhZ2UgbWVzc2FnZSwKICAgICAgTGlzdDxEaWFnbm9zdGljTWVzc2FnZT4gaW5mb3MsIGFwaS5EaWFnbm9zdGljIGtpbmQpIHsKICAgIF9yZXBvcnREaWFnbm9zdGljTWVzc2FnZShtZXNzYWdlLCBraW5kKTsKICAgIGZvciAoRGlhZ25vc3RpY01lc3NhZ2UgaW5mbyBpbiBpbmZvcykgewogICAgICBfcmVwb3J0RGlhZ25vc3RpY01lc3NhZ2UoaW5mbywgYXBpLkRpYWdub3N0aWMuSU5GTyk7CiAgICB9CiAgfQoKICB2b2lkIF9yZXBvcnREaWFnbm9zdGljTWVzc2FnZSgKICAgICAgRGlhZ25vc3RpY01lc3NhZ2UgZGlhZ25vc3RpY01lc3NhZ2UsIGFwaS5EaWFnbm9zdGljIGtpbmQpIHsKICAgIC8vIFs6c3Bhbi51cmk6XSBtaWdodCBiZSBbOm51bGw6XSBpbiBjYXNlIG9mIGEgW1NjcmlwdF0gd2l0aCBubyBbdXJpXS4gRm9yCiAgICAvLyBpbnN0YW5jZSBpbiB0aGUgW1R5cGVzXSBjb25zdHJ1Y3RvciBpbiB0eXBlY2hlY2tlci5kYXJ0LgogICAgU291cmNlU3BhbiBzcGFuID0gZGlhZ25vc3RpY01lc3NhZ2Uuc291cmNlU3BhbjsKICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGRpYWdub3N0aWNNZXNzYWdlLm1lc3NhZ2U7CiAgICBpZiAoc3BhbiA9PSBudWxsIHx8IHNwYW4udXJpID09IG51bGwpIHsKICAgICAgY2FsbFVzZXJIYW5kbGVyKG1lc3NhZ2UsIG51bGwsIG51bGwsIG51bGwsICckbWVzc2FnZScsIGtpbmQpOwogICAgfSBlbHNlIHsKICAgICAgY2FsbFVzZXJIYW5kbGVyKAogICAgICAgICAgbWVzc2FnZSwgc3Bhbi51cmksIHNwYW4uYmVnaW4sIHNwYW4uZW5kLCAnJG1lc3NhZ2UnLCBraW5kKTsKICAgIH0KICB9CgogIHZvaWQgY2FsbFVzZXJIYW5kbGVyKE1lc3NhZ2UgbWVzc2FnZSwgVXJpIHVyaSwgaW50IGJlZ2luLCBpbnQgZW5kLAogICAgICBTdHJpbmcgdGV4dCwgYXBpLkRpYWdub3N0aWMga2luZCkgewogICAgdHJ5IHsKICAgICAgdXNlckhhbmRsZXJUYXNrLm1lYXN1cmUoKCkgewogICAgICAgIGhhbmRsZXIucmVwb3J0KG1lc3NhZ2UsIHVyaSwgYmVnaW4sIGVuZCwgdGV4dCwga2luZCk7CiAgICAgIH0pOwogICAgfSBjYXRjaCAoZXgsIHMpIHsKICAgICAgcmVwb3J0Q3Jhc2hJblVzZXJDb2RlKCdVbmNhdWdodCBleGNlcHRpb24gaW4gZGlhZ25vc3RpYyBoYW5kbGVyJywgZXgsIHMpOwogICAgICByZXRocm93OwogICAgfQogIH0KCiAgRnV0dXJlPGFwaS5JbnB1dD4gY2FsbFVzZXJQcm92aWRlcihVcmkgdXJpLCBhcGkuSW5wdXRLaW5kIGlucHV0S2luZCkgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIHVzZXJQcm92aWRlclRhc2sKICAgICAgICAgIC5tZWFzdXJlSW8oKCkgPT4gcHJvdmlkZXIucmVhZEZyb21VcmkodXJpLCBpbnB1dEtpbmQ6IGlucHV0S2luZCkpOwogICAgfSBjYXRjaCAoZXgsIHMpIHsKICAgICAgcmVwb3J0Q3Jhc2hJblVzZXJDb2RlKCdVbmNhdWdodCBleGNlcHRpb24gaW4gaW5wdXQgcHJvdmlkZXInLCBleCwgcyk7CiAgICAgIHJldGhyb3c7CiAgICB9CiAgfQp9CgpjbGFzcyBfRW52aXJvbm1lbnQgaW1wbGVtZW50cyBFbnZpcm9ubWVudCB7CiAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBkZWZpbml0aW9uczsKICBNYXA8U3RyaW5nLCBTdHJpbmc+IF9jb21wbGV0ZU1hcDsKICBTZXQ8U3RyaW5nPiBzdXBwb3J0ZWRMaWJyYXJpZXM7CgogIF9FbnZpcm9ubWVudCh0aGlzLmRlZmluaXRpb25zKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZhbHVlT2YoU3RyaW5nIG5hbWUpIHsKICAgIGlmIChfY29tcGxldGVNYXAgIT0gbnVsbCkgcmV0dXJuIF9jb21wbGV0ZU1hcFtuYW1lXTsKICAgIHZhciByZXN1bHQgPSBkZWZpbml0aW9uc1tuYW1lXTsKICAgIGlmIChyZXN1bHQgIT0gbnVsbCB8fCBkZWZpbml0aW9ucy5jb250YWluc0tleShuYW1lKSkgcmV0dXJuIHJlc3VsdDsKICAgIGlmICghbmFtZS5zdGFydHNXaXRoKF9kYXJ0TGlicmFyeUVudmlyb25tZW50UHJlZml4KSkgcmV0dXJuIG51bGw7CgogICAgU3RyaW5nIGxpYnJhcnlOYW1lID0gbmFtZS5zdWJzdHJpbmcoX2RhcnRMaWJyYXJ5RW52aXJvbm1lbnRQcmVmaXgubGVuZ3RoKTsKCiAgICAvLyBQcml2YXRlIGxpYnJhcmllcyBhcmUgbm90IGV4cG9zZWQgdG8gdGhlIHVzZXJzLgogICAgaWYgKGxpYnJhcnlOYW1lLnN0YXJ0c1dpdGgoIl8iKSkgcmV0dXJuIG51bGw7CiAgICBpZiAoc3VwcG9ydGVkTGlicmFyaWVzLmNvbnRhaW5zKGxpYnJhcnlOYW1lKSkgcmV0dXJuICJ0cnVlIjsKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgTWFwPFN0cmluZywgU3RyaW5nPiB0b01hcCgpIHsKICAgIGlmIChfY29tcGxldGVNYXAgPT0gbnVsbCkgewogICAgICBfY29tcGxldGVNYXAgPSBuZXcgTWFwPFN0cmluZywgU3RyaW5nPi5mcm9tKGRlZmluaXRpb25zKTsKICAgICAgZm9yIChTdHJpbmcgbGlicmFyeU5hbWUgaW4gc3VwcG9ydGVkTGlicmFyaWVzKSB7CiAgICAgICAgaWYgKCFsaWJyYXJ5TmFtZS5zdGFydHNXaXRoKCJfIikpIHsKICAgICAgICAgIFN0cmluZyBrZXkgPSAnJHtfZGFydExpYnJhcnlFbnZpcm9ubWVudFByZWZpeH0ke2xpYnJhcnlOYW1lfSc7CiAgICAgICAgICBpZiAoIWRlZmluaXRpb25zLmNvbnRhaW5zS2V5KGtleSkpIHsKICAgICAgICAgICAgX2NvbXBsZXRlTWFwW2tleV0gPSAidHJ1ZSI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gX2NvbXBsZXRlTWFwOwogIH0KfQoKLy8vIEZvciBldmVyeSAnZGFydDonIGxpYnJhcnksIGEgY29ycmVzcG9uZGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQKLy8vIHRvICJ0cnVlIi4gVGhlIGVudmlyb25tZW50IHZhcmlhYmxlJ3MgbmFtZSBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZgovLy8gdGhpcyBwcmVmaXggYW5kIHRoZSBuYW1lICh3aXRob3V0IHRoZSAnZGFydDonLgovLy8KLy8vIEZvciBleGFtcGxlICdkYXJ0Omh0bWwnIGhhcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJ2RhcnQubGlicmFyeS5odG1sJyBzZXQKLy8vIHRvICJ0cnVlIi4KY29uc3QgU3RyaW5nIF9kYXJ0TGlicmFyeUVudmlyb25tZW50UHJlZml4ID0gJ2RhcnQubGlicmFyeS4nOwoKY2xhc3MgX1RpbWluZ0RhdGEgewogIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbjsKICBmaW5hbCBpbnQgbWlsbGlzZWNvbmRzOwogIGZpbmFsIGRvdWJsZSBwZXJjZW50OwoKICBfVGltaW5nRGF0YSh0aGlzLmRlc2NyaXB0aW9uLCB0aGlzLm1pbGxpc2Vjb25kcywgdGhpcy5wZXJjZW50KTsKfQqA/QBOTjwBFQEVIQE5IwEmNxYYMRseLAFMDSYMGwweIwEfIAFPHytOLEoPHixAKhNJRggEARYVRwQBFikkKiFCTh5ROSQkJysMAU89TlEYDAoGOTw0EwQBDB44NCMfHx81MhsKGAoIBAEdMQQBRiE4PTAnIDMpJyc0TUEwNkpMRwoIBigqKyMtFFE5OUMGI0sVURNNPT1ILgQBDDM8LSw7BgQBIUJPQDQxLEQNF0YGBAFFKgojPgoWUA8GBAFJCh5NFkwPBgQCASwpJCIBIgEMIDkkSEYBTwE3MkERBAEMICBANyxJLygMCggGGQQCAUtHMwRRDz4BFBwaGAFCAgEhcGFja2FnZTpjb21waWxlci9zcmMvYXBpaW1wbC5kYXJ0KXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2NvbG9ycy5kYXJ0hO4vLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmNvbG9yczsKCi8vIFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjQ1NJX2NvZGVzCmNvbnN0IFN0cmluZyBSRVNFVCA9ICdcdTAwMWJbMG0nOwoKLy8gU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQU5TSV9lc2NhcGVfY29kZSNDb2xvcnMKY29uc3QgU3RyaW5nIEJMQUNLX0NPTE9SID0gJ1x1MDAxYlszMG0nOwpjb25zdCBTdHJpbmcgUkVEX0NPTE9SID0gJ1x1MDAxYlszMW0nOwpjb25zdCBTdHJpbmcgR1JFRU5fQ09MT1IgPSAnXHUwMDFiWzMybSc7CmNvbnN0IFN0cmluZyBZRUxMT1dfQ09MT1IgPSAnXHUwMDFiWzMzbSc7CmNvbnN0IFN0cmluZyBCTFVFX0NPTE9SID0gJ1x1MDAxYlszNG0nOwpjb25zdCBTdHJpbmcgTUFHRU5UQV9DT0xPUiA9ICdcdTAwMWJbMzVtJzsKY29uc3QgU3RyaW5nIENZQU5fQ09MT1IgPSAnXHUwMDFiWzM2bSc7CmNvbnN0IFN0cmluZyBXSElURV9DT0xPUiA9ICdcdTAwMWJbMzdtJzsKClN0cmluZyB3cmFwKFN0cmluZyBzdHJpbmcsIFN0cmluZyBjb2xvcikgPT4gIiR7Y29sb3J9JHN0cmluZyR7UkVTRVR9IjsKClN0cmluZyBibGFjayhTdHJpbmcgc3RyaW5nKSA9PiB3cmFwKHN0cmluZywgQkxBQ0tfQ09MT1IpOwpTdHJpbmcgcmVkKFN0cmluZyBzdHJpbmcpID0+IHdyYXAoc3RyaW5nLCBSRURfQ09MT1IpOwpTdHJpbmcgZ3JlZW4oU3RyaW5nIHN0cmluZykgPT4gd3JhcChzdHJpbmcsIEdSRUVOX0NPTE9SKTsKU3RyaW5nIHllbGxvdyhTdHJpbmcgc3RyaW5nKSA9PiB3cmFwKHN0cmluZywgWUVMTE9XX0NPTE9SKTsKU3RyaW5nIGJsdWUoU3RyaW5nIHN0cmluZykgPT4gd3JhcChzdHJpbmcsIEJMVUVfQ09MT1IpOwpTdHJpbmcgbWFnZW50YShTdHJpbmcgc3RyaW5nKSA9PiB3cmFwKHN0cmluZywgTUFHRU5UQV9DT0xPUik7ClN0cmluZyBjeWFuKFN0cmluZyBzdHJpbmcpID0+IHdyYXAoc3RyaW5nLCBDWUFOX0NPTE9SKTsKU3RyaW5nIHdoaXRlKFN0cmluZyBzdHJpbmcpID0+IHdyYXAoc3RyaW5nLCBXSElURV9DT0xPUik7Ch8ATk48ARgBPyIBPCknKSooKygpAUcBOjY6PDg+ODoBIHBhY2thZ2U6Y29tcGlsZXIvc3JjL2NvbG9ycy5kYXJ0MXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2lvL3NvdXJjZV9maWxlLmRhcnSixy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuaW8uc291cmNlX2ZpbGU7CgppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyB1dGY4OwppbXBvcnQgJ2RhcnQ6bWF0aCc7CmltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGtlcm5lbCBzaG93IExvY2F0aW9uLCBTb3VyY2U7CgppbXBvcnQgJ2xvY2F0aW9uX3Byb3ZpZGVyLmRhcnQnIHNob3cgTG9jYXRpb25Qcm92aWRlcjsKaW1wb3J0ICcuLi8uLi9jb21waWxlcl9uZXcuZGFydCc7CgovLy8gUmVwcmVzZW50cyBhIGZpbGUgb2Ygc291cmNlIGNvZGUuIFRoZSBjb250ZW50IGNhbiBiZSBlaXRoZXIgYSBbU3RyaW5nXSBvcgovLy8gYSBVVEYtOCBlbmNvZGVkIFtMaXN0PGludD5dIG9mIGJ5dGVzLgphYnN0cmFjdCBjbGFzcyBTb3VyY2VGaWxlPFQ+IGltcGxlbWVudHMgSW5wdXQ8VD4sIExvY2F0aW9uUHJvdmlkZXIgewogIC8vLyBUaGUgYWJzb2x1dGUgVVJJIG9mIHRoZSBzb3VyY2UgZmlsZS4KICBAb3ZlcnJpZGUKICBVcmkgZ2V0IHVyaTsKCiAgQG92ZXJyaWRlCiAgSW5wdXRLaW5kIGdldCBpbnB1dEtpbmQgPT4gSW5wdXRLaW5kLlVURjg7CgogIGtlcm5lbC5Tb3VyY2UgY2FjaGVkS2VybmVsU291cmNlOwoKICBrZXJuZWwuU291cmNlIGdldCBrZXJuZWxTb3VyY2UgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogSW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBTb3VyY2Ugb2JqZWN0LAogICAgLy8gd2Ugc2hvdWxkIHVzZSB0aGUgb25lIHByb3ZpZGVkIGJ5IHRoZSBmcm9udC1lbmQuCiAgICByZXR1cm4gY2FjaGVkS2VybmVsU291cmNlID8/PSBuZXcga2VybmVsLlNvdXJjZSgKICAgICAgICBsaW5lU3RhcnRzLAogICAgICAgIHNsb3dVdGY4WmVyb1Rlcm1pbmF0ZWRCeXRlcygpLAogICAgICAgIHVyaSAvKiBUT0RPKGplbnNqKTogV2hhdCBpcyB0aGUgaW1wb3J0IFVSST8gKi8sCiAgICAgICAgdXJpKQogICAgICAuLmNhY2hlZFRleHQgPSBzbG93VGV4dCgpOwogIH0KCiAgLy8vIFRoZSBuYW1lIG9mIHRoZSBmaWxlLgogIC8vLwogIC8vLyBUaGlzIGlzIFt1cmldLCBtYXliZSByZWxhdGl2aXplZCB0byBhIG1vcmUgaHVtYW4tcmVhZGFibGUgZm9ybS4KICBTdHJpbmcgZ2V0IGZpbGVuYW1lID0+IHVyaS50b1N0cmluZygpOwoKICAvLy8gVGhlIHRleHQgY29udGVudCBvZiB0aGUgZmlsZSByZXByZXNlbnRlZCBhcyBhIFN0cmluZwogIFN0cmluZyBzbG93VGV4dCgpOwoKICAvLy8gVGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgcmVwcmVzZW50ZWQgYXMgYSBVVEYtOCBlbmNvZGVkIFtMaXN0PGludD5dLAogIC8vLyB0ZXJtaW5hdGVkIHdpdGggYSB0cmFpbGluZyAwIGJ5dGUuCiAgTGlzdDxpbnQ+IHNsb3dVdGY4WmVyb1Rlcm1pbmF0ZWRCeXRlcygpOwoKICAvLy8gVGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc291cmNlIGZpbGUsIGkuZS4sCiAgLy8vIGVxdWl2YWxlbnQgdG8gWzpzbG93VGV4dCgpLmxlbmd0aDpdLCBidXQgZmFzdGVyLgogIGludCBnZXQgbGVuZ3RoOwoKICAvLy8gU2V0cyB0aGUgc3RyaW5nIGxlbmd0aCBvZiB0aGlzIHNvdXJjZSBmaWxlLiBGb3Igc291cmNlIGZpbGVzIGJhc2VkIG9uCiAgLy8vIFVURi04IGJ5dGUgYXJyYXlzLCB0aGUgc3RyaW5nIGxlbmd0aCBpcyBjb21wdXRlZCBhbmQgYXNzaWduZWQgYnkgdGhlCiAgLy8vIHNjYW5uZXIuCiAgc2V0IGxlbmd0aChpbnQgdik7CgogIC8vLyBBIG1hcCBmcm9tIGxpbmUgbnVtYmVycyB0byBvZmZzZXRzIGluIHRoZSBzdHJpbmcgdGV4dCByZXByZXNlbnRhdGlvbiBvZgogIC8vLyB0aGlzIHNvdXJjZSBmaWxlLgogIExpc3Q8aW50PiBnZXQgbGluZVN0YXJ0cyB7CiAgICBpZiAobGluZVN0YXJ0c0NhY2hlID09IG51bGwpIHsKICAgICAgLy8gV2hlbiByZXBvcnRpbmcgZXJyb3JzIGR1cmluZyBzY2FubmluZywgdGhlIGxpbmUgbnVtYmVycyBhcmUgbm90IHlldAogICAgICAvLyBhdmFpbGFibGUgYW5kIG5lZWQgdG8gYmUgY29tcHV0ZWQgdXNpbmcgdGhpcyBzbG93IHBhdGguCiAgICAgIGxpbmVTdGFydHNDYWNoZSA9IGxpbmVTdGFydHNGcm9tU3RyaW5nKHNsb3dUZXh0KCkpOwogICAgfQogICAgcmV0dXJuIGxpbmVTdGFydHNDYWNoZTsKICB9CgogIC8vLyBTZXRzIHRoZSBsaW5lIG51bWJlcnMgbWFwIGZvciB0aGlzIHNvdXJjZSBmaWxlLiBUaGlzIG1hcCBpcyBjb21wdXRlZCBhbmQKICAvLy8gYXNzaWduZWQgYnkgdGhlIHNjYW5uZXIsIGF2b2lkaW5nIGEgc2VwYXJhdGUgdHJhdmVyc2FsIG9mIHRoZSBzb3VyY2UgZmlsZS4KICAvLy8KICAvLy8gVGhlIG1hcCBjb250YWlucyBvbmUgYWRkaXRpb25hbCBlbnRyeSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhcyBpZiB0aGUKICAvLy8gc291cmNlIGZpbGUgaGFkIG9uZSBtb3JlIGVtcHR5IGxpbmUgYXQgdGhlIGVuZC4gVGhpcyBzaW1wbGlmaWVzIHRoZSBiaW5hcnkKICAvLy8gc2VhcmNoIGluIFtnZXRMb2NhdGlvbl0uCiAgc2V0IGxpbmVTdGFydHMoTGlzdDxpbnQ+IHYpID0+IGxpbmVTdGFydHNDYWNoZSA9IHY7CgogIExpc3Q8aW50PiBsaW5lU3RhcnRzQ2FjaGU7CgogIExpc3Q8aW50PiBsaW5lU3RhcnRzRnJvbVN0cmluZyhTdHJpbmcgdGV4dCkgewogICAgdmFyIHN0YXJ0cyA9IFswXTsKICAgIHZhciBpbmRleCA9IDA7CiAgICB3aGlsZSAoaW5kZXggPCB0ZXh0Lmxlbmd0aCkgewogICAgICBpbmRleCA9IHRleHQuaW5kZXhPZignXG4nLCBpbmRleCkgKyAxOwogICAgICBpZiAoaW5kZXggPD0gMCkgYnJlYWs7CiAgICAgIHN0YXJ0cy5hZGQoaW5kZXgpOwogICAgfQogICAgc3RhcnRzLmFkZCh0ZXh0Lmxlbmd0aCArIDEpOyAvLyBPbmUgYWRkaXRpb25hbCBsaW5lIHN0YXJ0IGF0IHRoZSBlbmQuCiAgICByZXR1cm4gc3RhcnRzOwogIH0KCiAgQG92ZXJyaWRlCiAga2VybmVsLkxvY2F0aW9uIGdldExvY2F0aW9uKGludCBvZmZzZXQpIHsKICAgIHJldHVybiBrZXJuZWxTb3VyY2UuZ2V0TG9jYXRpb24obnVsbCwgb2Zmc2V0KTsKICB9CgogIFN0cmluZyBzbG93U3Vic3RyaW5nKGludCBzdGFydCwgaW50IGVuZCk7CgogIC8vLyBDcmVhdGUgYSBwcmV0dHkgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGZvciBbbWVzc2FnZV0gZnJvbSBhIGNoYXJhY3RlcgogIC8vLyByYW5nZSBgW3N0YXJ0LCBlbmRdYCBpbiB0aGlzIGZpbGUuCiAgLy8vCiAgLy8vIElmIFtpbmNsdWRlU291cmNlTGluZV0gaXMgYHRydWVgIHRoZSBmaXJzdCBzb3VyY2UgbGluZSBjb2RlIGxpbmUgdGhhdAogIC8vLyBjb250YWlucyB0aGUgcmFuZ2Ugd2lsbCBiZSBpbmNsdWRlZCBhcyB3ZWxsIGFzIG1hcmtlciBjaGFyYWN0ZXJzICgnXicpCiAgLy8vIHVuZGVybGluaW5nIHRoZSByYW5nZS4KICAvLy8KICAvLy8gVXNlIFtjb2xvcml6ZV0gdG8gd3JhcCBzb3VyY2UgY29kZSB0ZXh0IGFuZCBtYXJrZXIgY2hhcmFjdGVycyBpbiBjb2xvcgogIC8vLyBlc2NhcGUgY29kZXMuCiAgU3RyaW5nIGdldExvY2F0aW9uTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IHN0YXJ0LCBpbnQgZW5kLAogICAgICB7Ym9vbCBpbmNsdWRlU291cmNlTGluZTogdHJ1ZSwgU3RyaW5nIGNvbG9yaXplKFN0cmluZyB0ZXh0KX0pIHsKICAgIGlmIChjb2xvcml6ZSA9PSBudWxsKSB7CiAgICAgIGNvbG9yaXplID0gKHRleHQpID0+IHRleHQ7CiAgICB9CgogICAga2VybmVsLkxvY2F0aW9uIHN0YXJ0TG9jYXRpb24gPSBrZXJuZWxTb3VyY2UuZ2V0TG9jYXRpb24obnVsbCwgc3RhcnQpOwogICAga2VybmVsLkxvY2F0aW9uIGVuZExvY2F0aW9uID0ga2VybmVsU291cmNlLmdldExvY2F0aW9uKG51bGwsIGVuZCk7CiAgICBpbnQgbGluZVN0YXJ0ID0gc3RhcnRMb2NhdGlvbi5saW5lIC0gMTsKICAgIGludCBjb2x1bW5TdGFydCA9IHN0YXJ0TG9jYXRpb24uY29sdW1uIC0gMTsKICAgIGludCBsaW5lRW5kID0gZW5kTG9jYXRpb24ubGluZSAtIDE7CiAgICBpbnQgY29sdW1uRW5kID0gZW5kTG9jYXRpb24uY29sdW1uIC0gMTsKCiAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcignJHtmaWxlbmFtZX06Jyk7CiAgICBpZiAoc3RhcnQgIT0gZW5kIHx8IHN0YXJ0ICE9IDApIHsKICAgICAgLy8gTGluZS9jb2x1bW4gaW5mbyBpcyByZWxldmFudC4KICAgICAgYnVmLndyaXRlKCcke2xpbmVTdGFydCArIDF9OiR7Y29sdW1uU3RhcnQgKyAxfTonKTsKICAgIH0KICAgIGJ1Zi53cml0ZSgnXG4kbWVzc2FnZVxuJyk7CgogICAgaWYgKHN0YXJ0ICE9IGVuZCAmJiBpbmNsdWRlU291cmNlTGluZSkgewogICAgICBpZiAobGluZVN0YXJ0ID09IGxpbmVFbmQpIHsKICAgICAgICBTdHJpbmcgdGV4dExpbmUgPSBrZXJuZWxTb3VyY2UuZ2V0VGV4dExpbmUoc3RhcnRMb2NhdGlvbi5saW5lKTsKCiAgICAgICAgaW50IHRvQ29sdW1uID0gbWluKGNvbHVtblN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSwgdGV4dExpbmUubGVuZ3RoKTsKICAgICAgICBidWYud3JpdGUodGV4dExpbmUuc3Vic3RyaW5nKDAsIGNvbHVtblN0YXJ0KSk7CiAgICAgICAgYnVmLndyaXRlKGNvbG9yaXplKHRleHRMaW5lLnN1YnN0cmluZyhjb2x1bW5TdGFydCwgdG9Db2x1bW4pKSk7CiAgICAgICAgYnVmLndyaXRlbG4odGV4dExpbmUuc3Vic3RyaW5nKHRvQ29sdW1uKSk7CgogICAgICAgIGludCBpID0gMDsKICAgICAgICBmb3IgKDsgaSA8IGNvbHVtblN0YXJ0OyBpKyspIHsKICAgICAgICAgIGJ1Zi53cml0ZSgnICcpOwogICAgICAgIH0KCiAgICAgICAgZm9yICg7IGkgPCB0b0NvbHVtbjsgaSsrKSB7CiAgICAgICAgICBidWYud3JpdGUoY29sb3JpemUoJ14nKSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvciAoaW50IGxpbmUgPSBsaW5lU3RhcnQ7IGxpbmUgPD0gbGluZUVuZDsgbGluZSsrKSB7CiAgICAgICAgICBTdHJpbmcgdGV4dExpbmUgPSBrZXJuZWxTb3VyY2UuZ2V0VGV4dExpbmUobGluZSArIDEpOwogICAgICAgICAgaWYgKGxpbmUgPT0gbGluZVN0YXJ0KSB7CiAgICAgICAgICAgIGlmIChjb2x1bW5TdGFydCA+IHRleHRMaW5lLmxlbmd0aCkgewogICAgICAgICAgICAgIGNvbHVtblN0YXJ0ID0gdGV4dExpbmUubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJ1Zi53cml0ZSh0ZXh0TGluZS5zdWJzdHJpbmcoMCwgY29sdW1uU3RhcnQpKTsKICAgICAgICAgICAgYnVmLndyaXRlbG4oY29sb3JpemUodGV4dExpbmUuc3Vic3RyaW5nKGNvbHVtblN0YXJ0KSkpOwogICAgICAgICAgfSBlbHNlIGlmIChsaW5lID09IGxpbmVFbmQpIHsKICAgICAgICAgICAgaWYgKGNvbHVtbkVuZCA+IHRleHRMaW5lLmxlbmd0aCkgewogICAgICAgICAgICAgIGNvbHVtbkVuZCA9IHRleHRMaW5lLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBidWYud3JpdGUoY29sb3JpemUodGV4dExpbmUuc3Vic3RyaW5nKDAsIGNvbHVtbkVuZCkpKTsKICAgICAgICAgICAgYnVmLndyaXRlbG4odGV4dExpbmUuc3Vic3RyaW5nKGNvbHVtbkVuZCkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYnVmLndyaXRlbG4oY29sb3JpemUodGV4dExpbmUpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CiAgfQoKICBpbnQgZ2V0IGxpbmVzID0+IGxpbmVTdGFydHMubGVuZ3RoIC0gMTsKfQoKTGlzdDxpbnQ+IF96ZXJvVGVybWluYXRlSWZOZWNlc3NhcnkoTGlzdDxpbnQ+IGJ5dGVzKSB7CiAgaWYgKGJ5dGVzLmxlbmd0aCA+IDAgJiYgYnl0ZXMubGFzdCA9PSAwKSByZXR1cm4gYnl0ZXM7CiAgTGlzdDxpbnQ+IHJlc3VsdCA9IG5ldyBVaW50OExpc3QoYnl0ZXMubGVuZ3RoICsgMSk7CiAgcmVzdWx0LnNldFJhbmdlKDAsIGJ5dGVzLmxlbmd0aCwgYnl0ZXMpOwogIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPSAwOwogIHJldHVybiByZXN1bHQ7Cn0KCmNsYXNzIFV0ZjhCeXRlc1NvdXJjZUZpbGUgZXh0ZW5kcyBTb3VyY2VGaWxlPExpc3Q8aW50Pj4gewogIEBvdmVycmlkZQogIGZpbmFsIFVyaSB1cmk7CgogIC8vLyBUaGUgVVRGLTggZW5jb2RlZCBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZS4KICBmaW5hbCBMaXN0PGludD4gemVyb1Rlcm1pbmF0ZWRDb250ZW50OwoKICAvLy8gQ3JlYXRlcyBhIFV0ZjhCeXRlc1NvdXJjZUZpbGUuCiAgLy8vCiAgLy8vIElmIHBvc3NpYmxlLCB0aGUgZ2l2ZW4gW2NvbnRlbnRdIHNob3VsZCBiZSB6ZXJvLXRlcm1pbmF0ZWQuIElmIGl0IGlzbid0LAogIC8vLyB0aGUgY29uc3RydWN0b3IgY2xvbmVzIHRoZSBjb250ZW50IGFuZCBhZGRzIGEgdHJhaWxpbmcgMC4KICBVdGY4Qnl0ZXNTb3VyY2VGaWxlKHRoaXMudXJpLCBMaXN0PGludD4gY29udGVudCkKICAgICAgOiB0aGlzLnplcm9UZXJtaW5hdGVkQ29udGVudCA9IF96ZXJvVGVybWluYXRlSWZOZWNlc3NhcnkoY29udGVudCk7CgogIEBvdmVycmlkZQogIExpc3Q8aW50PiBnZXQgZGF0YSA9PiB6ZXJvVGVybWluYXRlZENvbnRlbnQ7CgogIEBvdmVycmlkZQogIFN0cmluZyBzbG93VGV4dCgpIHsKICAgIC8vIERvbid0IGNvbnZlcnQgdGhlIHRyYWlsaW5nIHplcm8gYnl0ZS4KICAgIHJldHVybiB1dGY4LmRlY29kZXIKICAgICAgICAuY29udmVydCh6ZXJvVGVybWluYXRlZENvbnRlbnQsIDAsIHplcm9UZXJtaW5hdGVkQ29udGVudC5sZW5ndGggLSAxKTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8aW50PiBzbG93VXRmOFplcm9UZXJtaW5hdGVkQnl0ZXMoKSA9PiB6ZXJvVGVybWluYXRlZENvbnRlbnQ7CgogIEBvdmVycmlkZQogIFN0cmluZyBzbG93U3Vic3RyaW5nKGludCBzdGFydCwgaW50IGVuZCkgewogICAgLy8gVE9ETyhscnkpOiB0byBtYWtlIHRoaXMgZmFzdGVyLCB0aGUgc2Nhbm5lciBjb3VsZCByZWNvcmQgdGhlIFVURi04IHNsYWNrCiAgICAvLyBmb3IgYWxsIHBvc2l0aW9ucyBvZiB0aGUgc291cmNlIHRleHQuIFdlIGNvdWxkIHVzZSBbOmNvbnRlbnQuc3VibGlzdDpdLgogICAgcmV0dXJuIHNsb3dUZXh0KCkuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsZW5ndGggewogICAgaWYgKGxlbmd0aENhY2hlID09IC0xKSB7CiAgICAgIC8vIER1cmluZyBzY2FubmluZyB0aGUgbGVuZ3RoIGlzIG5vdCB5ZXQgYXNzaWduZWQsIHNvIHdlIHVzZSBhIHNsb3cgcGF0aC4KICAgICAgbGVuZ3RoQ2FjaGUgPSBzbG93VGV4dCgpLmxlbmd0aDsKICAgIH0KICAgIHJldHVybiBsZW5ndGhDYWNoZTsKICB9CgogIEBvdmVycmlkZQogIHNldCBsZW5ndGgoaW50IHYpID0+IGxlbmd0aENhY2hlID0gdjsKICBpbnQgbGVuZ3RoQ2FjaGUgPSAtMTsKfQoKY2xhc3MgQ2FjaGluZ1V0ZjhCeXRlc1NvdXJjZUZpbGUgZXh0ZW5kcyBVdGY4Qnl0ZXNTb3VyY2VGaWxlIHsKICBTdHJpbmcgY2FjaGVkVGV4dDsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgZmlsZW5hbWU7CgogIENhY2hpbmdVdGY4Qnl0ZXNTb3VyY2VGaWxlKFVyaSB1cmksIHRoaXMuZmlsZW5hbWUsIExpc3Q8aW50PiBjb250ZW50KQogICAgICA6IHN1cGVyKHVyaSwgY29udGVudCk7CgogIEBvdmVycmlkZQogIFN0cmluZyBzbG93VGV4dCgpIHsKICAgIGlmIChjYWNoZWRUZXh0ID09IG51bGwpIHsKICAgICAgY2FjaGVkVGV4dCA9IHN1cGVyLnNsb3dUZXh0KCk7CiAgICB9CiAgICByZXR1cm4gY2FjaGVkVGV4dDsKICB9Cn0KCmNsYXNzIFN0cmluZ1NvdXJjZUZpbGUgZXh0ZW5kcyBTb3VyY2VGaWxlPExpc3Q8aW50Pj4gewogIEBvdmVycmlkZQogIGZpbmFsIFVyaSB1cmk7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIGZpbGVuYW1lOwogIGZpbmFsIFN0cmluZyB0ZXh0OwoKICBTdHJpbmdTb3VyY2VGaWxlKHRoaXMudXJpLCB0aGlzLmZpbGVuYW1lLCB0aGlzLnRleHQpOwoKICBTdHJpbmdTb3VyY2VGaWxlLmZyb21VcmkoVXJpIHVyaSwgU3RyaW5nIHRleHQpCiAgICAgIDogdGhpcyh1cmksIHVyaS50b1N0cmluZygpLCB0ZXh0KTsKCiAgU3RyaW5nU291cmNlRmlsZS5mcm9tTmFtZShTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyB0ZXh0KQogICAgICA6IHRoaXMobmV3IFVyaShwYXRoOiBmaWxlbmFtZSksIGZpbGVuYW1lLCB0ZXh0KTsKCiAgQG92ZXJyaWRlCiAgTGlzdDxpbnQ+IGdldCBkYXRhID0+IHV0ZjguZW5jb2RlKHRleHQpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGxlbmd0aCA9PiB0ZXh0Lmxlbmd0aDsKICBAb3ZlcnJpZGUKICBzZXQgbGVuZ3RoKGludCB2KSB7fQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgc2xvd1RleHQoKSA9PiB0ZXh0OwoKICBAb3ZlcnJpZGUKICBMaXN0PGludD4gc2xvd1V0ZjhaZXJvVGVybWluYXRlZEJ5dGVzKCkgewogICAgcmV0dXJuIF96ZXJvVGVybWluYXRlSWZOZWNlc3NhcnkodXRmOC5lbmNvZGUodGV4dCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHNsb3dTdWJzdHJpbmcoaW50IHN0YXJ0LCBpbnQgZW5kKSA9PiB0ZXh0LnN1YnN0cmluZyhzdGFydCwgZW5kKTsKfQoKLy8vIEJpbmFyeSBpbnB1dCBkYXRhLgpjbGFzcyBCaW5hcnkgaW1wbGVtZW50cyBJbnB1dDxMaXN0PGludD4+IHsKICBAb3ZlcnJpZGUKICBmaW5hbCBVcmkgdXJpOwogIEBvdmVycmlkZQogIGZpbmFsIExpc3Q8aW50PiBkYXRhOwoKICBCaW5hcnkodGhpcy51cmksIHRoaXMuZGF0YSk7CgogIEBvdmVycmlkZQogIElucHV0S2luZCBnZXQgaW5wdXRLaW5kID0+IElucHV0S2luZC5iaW5hcnk7Cn0KgScATk48ASABIRQpAUIBNyIBTipFKwwPAQwtASQBI0U4NRQnOA0hBAEcBkYpATsVAUopKwFJNxIBTEsPFQFOGB0jTUE6BhwEAU9RBk5RHzYBHQEwFhMiLR0ZBkoTBAEMLDMEASwBSykGTE0dBk0UQEYcIQYBS0csMCgsATkmJzkGHwEtIkgBSjdIMwETJxoKASQkCg8+QCMxLQ47RCgvKw5DOBMtDAoIBgEbBAEqAgE3OTYrIRECAToMEQE0KQElBk9AM0kBDC8BDBYtGE4EAQxEAQwtUE8tBAEMEx1QJwYYBAEMKBgCAT8VDBkBSB0BDBYeJQYXBAIBNwwRDBkVATgBMSkBOjcBDCsBDCEMFwEMHQEMLDkEAQxKAgEXKwwRDBgBHwEMLwIBKHBhY2thZ2U6Y29tcGlsZXIvc3JjL2lvL3NvdXJjZV9maWxlLmRhcnQwc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvdXRpbC9lbXB0eXNldC5kYXJ0hscvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLnV0aWwuZW1wdHlzZXQ7CgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbicgc2hvdyBJdGVyYWJsZUJhc2U7CgpjbGFzcyBJbW11dGFibGVFbXB0eVNldDxFPiBleHRlbmRzIEl0ZXJhYmxlQmFzZTxFPiBpbXBsZW1lbnRzIFNldDxFPiB7CiAgY29uc3QgSW1tdXRhYmxlRW1wdHlTZXQoKTsKCiAgQG92ZXJyaWRlCiAgU2V0PFI+IGNhc3Q8Uj4oKSA9PiBuZXcgSW1tdXRhYmxlRW1wdHlTZXQ8Uj4oKTsKICBAb3ZlcnJpZGUKICBnZXQgaXRlcmF0b3IgPT4gY29uc3QgX0VtcHR5U2V0SXRlcmF0b3IoKTsKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGxlbmd0aCA9PiAwOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gdHJ1ZTsKCiAgZ2V0IF9pbW11dGFibGVFcnJvciA9PiB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiRW1wdHlTZXQgaXMgaW1tdXRhYmxlIik7CgogIEBvdmVycmlkZQogIGJvb2wgYWRkKEUgZWxlbWVudCkgPT4gX2ltbXV0YWJsZUVycm9yOwogIEBvdmVycmlkZQogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGVsZW1lbnRzKSA9PiBfaW1tdXRhYmxlRXJyb3I7CgogIEBvdmVycmlkZQogIEUgbG9va3VwKE9iamVjdCBlbGVtZW50KSA9PiBudWxsOwogIEBvdmVycmlkZQogIGJvb2wgcmVtb3ZlKE9iamVjdCBlbGVtZW50KSA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICB2b2lkIHJlbW92ZUFsbChJdGVyYWJsZTxPYmplY3Q+IGVsZW1lbnRzKSB7fQogIEBvdmVycmlkZQogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHt9CiAgQG92ZXJyaWRlCiAgdm9pZCByZXRhaW5BbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cykge30KICBAb3ZlcnJpZGUKICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7fQogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaCh2b2lkIGFjdGlvbihFIGVsZW1lbnQpKSB7fQogIEBvdmVycmlkZQogIHZvaWQgY2xlYXIoKSB7fQoKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KSA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPE9iamVjdD4gb3RoZXIpID0+IG90aGVyLmlzRW1wdHk7CgogIEBvdmVycmlkZQogIFNldDxFPiB1bmlvbihTZXQ8RT4gb3RoZXIpID0+IG5ldyBTZXQuZnJvbShvdGhlcik7CiAgQG92ZXJyaWRlCiAgU2V0PEU+IGludGVyc2VjdGlvbihTZXQ8T2JqZWN0PiBvdGhlcikgPT4gdGhpczsKICBAb3ZlcnJpZGUKICBTZXQ8RT4gZGlmZmVyZW5jZShTZXQ8T2JqZWN0PiBvdGhlcikgPT4gdGhpczsKICBAb3ZlcnJpZGUKICBTZXQ8RT4gdG9TZXQoKSA9PiBuZXcgU2V0PEU+KCk7Cn0KCmNsYXNzIF9FbXB0eVNldEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8TnVsbD4gewogIGNvbnN0IF9FbXB0eVNldEl0ZXJhdG9yKCk7CgogIEBvdmVycmlkZQogIE51bGwgZ2V0IGN1cnJlbnQgPT4gbnVsbDsKICBAb3ZlcnJpZGUKICBib29sIG1vdmVOZXh0KCkgPT4gZmFsc2U7Cn0KRQBOTjwBHwEsAUcdAQwyDC0MFwwcAU4BDCoMOAEMJAwoDC8MLAwvDCwMKgwSAQwqDD0BDDUMMgwwDCICATQdAQwcDBwCASdwYWNrYWdlOmNvbXBpbGVyL3NyYy91dGlsL2VtcHR5c2V0LmRhcnQuc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvdXRpbC9tYXBsZXQuZGFydJ4dLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy51dGlsLm1hcGxldDsKCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJyBzaG93IE1hcEJhc2UsIEl0ZXJhYmxlQmFzZTsKCmNsYXNzIE1hcGxldDxLLCBWPiBleHRlbmRzIE1hcEJhc2U8SywgVj4gewogIHN0YXRpYyBjb25zdCBfTWFwbGV0TWFya2VyIF9NQVJLRVIgPSBjb25zdCBfTWFwbGV0TWFya2VyKCk7CiAgc3RhdGljIGNvbnN0IGludCBDQVBBQ0lUWSA9IDg7CgovLyBUaGUgbWFwbGV0IGNhbiBiZSBpbiBvbmUgb2YgZm91ciBzdGF0ZXM6CiAgLy8KICAvLyAgICogRW1wdHkgICAgICAgICAgKGV4dHJhOiBudWxsLCAgIGtleTogbWFya2VyLCB2YWx1ZTogbnVsbCkKICAvLyAgICogU2luZ2xlIGVsZW1lbnQgKGV4dHJhOiBudWxsLCAgIGtleToga2V5LCAgICB2YWx1ZTogdmFsdWUpCiAgLy8gICAqIExpc3QtYmFja2VkICAgIChleHRyYTogbGVuZ3RoLCBrZXk6IGxpc3QsICAgdmFsdWU6IG51bGwpCiAgLy8gICAqIE1hcC1iYWNrZWQgICAgIChleHRyYTogbWFya2VyLCBrZXk6IG1hcCwgICAgdmFsdWU6IG51bGwpCiAgLy8KICAvLyBXaGVuIHRoZSBtYXBsZXQgaXMgbGlzdC1iYWNrZWQsIHRoZSBsaXN0IGhhcyB0d28gc2VjdGlvbnM6IE9uZQogIC8vIGZvciBrZXlzIGFuZCBvbmUgZm9yIHZhbHVlcy4gVGhlIGZpcnN0IFtDQVBBQ0lUWV0gZW50cmllcyBhcmUKICAvLyB0aGUga2V5cyBhbmQgdGhleSBtYXkgY29udGFpbiBtYXJrZXJzIGZvciBkZWxldGVkIGVsZW1lbnRzLiBBZnRlcgogIC8vIHRoZSBrZXlzIHRoZXJlIGFyZSBbQ0FQQUNJVFldIGVudHJpZXMgZm9yIHRoZSB2YWx1ZXMuCgogIGR5bmFtaWMgX2tleSA9IF9NQVJLRVI7CiAgdmFyIF92YWx1ZTsKICB2YXIgX2V4dHJhOwoKICBNYXBsZXQoKTsKCiAgTWFwbGV0LmZyb20oTWFwbGV0PEssIFY+IG90aGVyKSB7CiAgICBvdGhlci5mb3JFYWNoKChLIGtleSwgViB2YWx1ZSkgewogICAgICB0aGlzW2tleV0gPSB2YWx1ZTsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFbXB0eSB7CiAgICBpZiAoX2V4dHJhID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9NQVJLRVIgPT0gX2tleTsKICAgIH0gZWxzZSBpZiAoX01BUktFUiA9PSBfZXh0cmEpIHsKICAgICAgcmV0dXJuIF9rZXkuaXNFbXB0eTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfZXh0cmEgPT0gMDsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgbGVuZ3RoIHsKICAgIGlmIChfZXh0cmEgPT0gbnVsbCkgewogICAgICByZXR1cm4gKF9NQVJLRVIgPT0gX2tleSkgPyAwIDogMTsKICAgIH0gZWxzZSBpZiAoX01BUktFUiA9PSBfZXh0cmEpIHsKICAgICAgcmV0dXJuIF9rZXkubGVuZ3RoOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9leHRyYTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewogICAgaWYgKF9leHRyYSA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfa2V5ID09IGtleTsKICAgIH0gZWxzZSBpZiAoX01BUktFUiA9PSBfZXh0cmEpIHsKICAgICAgcmV0dXJuIF9rZXkuY29udGFpbnNLZXkoa2V5KTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoaW50IHJlbWFpbmluZyA9IF9leHRyYSwgaSA9IDA7IHJlbWFpbmluZyA+IDAgJiYgaSA8IENBUEFDSVRZOyBpKyspIHsKICAgICAgICB2YXIgY2FuZGlkYXRlID0gX2tleVtpXTsKICAgICAgICBpZiAoX01BUktFUiA9PSBjYW5kaWRhdGUpIGNvbnRpbnVlOwogICAgICAgIGlmIChjYW5kaWRhdGUgPT0ga2V5KSByZXR1cm4gdHJ1ZTsKICAgICAgICByZW1haW5pbmctLTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBWIG9wZXJhdG9yIFtdKE9iamVjdCBrZXkpIHsKICAgIGlmIChfZXh0cmEgPT0gbnVsbCkgewogICAgICByZXR1cm4gKF9rZXkgPT0ga2V5KSA/IF92YWx1ZSA6IG51bGw7CiAgICB9IGVsc2UgaWYgKF9NQVJLRVIgPT0gX2V4dHJhKSB7CiAgICAgIHJldHVybiBfa2V5W2tleV07CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCByZW1haW5pbmcgPSBfZXh0cmEsIGkgPSAwOyByZW1haW5pbmcgPiAwICYmIGkgPCBDQVBBQ0lUWTsgaSsrKSB7CiAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IF9rZXlbaV07CiAgICAgICAgaWYgKF9NQVJLRVIgPT0gY2FuZGlkYXRlKSBjb250aW51ZTsKICAgICAgICBpZiAoY2FuZGlkYXRlID09IGtleSkgcmV0dXJuIF9rZXlbaSArIENBUEFDSVRZXTsKICAgICAgICByZW1haW5pbmctLTsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgb3BlcmF0b3IgW109KEsga2V5LCBWIHZhbHVlKSB7CiAgICBpZiAoX2V4dHJhID09IG51bGwpIHsKICAgICAgaWYgKF9NQVJLRVIgPT0gX2tleSkgewogICAgICAgIF9rZXkgPSBrZXk7CiAgICAgICAgX3ZhbHVlID0gdmFsdWU7CiAgICAgIH0gZWxzZSBpZiAoX2tleSA9PSBrZXkpIHsKICAgICAgICBfdmFsdWUgPSB2YWx1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBMaXN0IGxpc3QgPSBuZXcgTGlzdChDQVBBQ0lUWSAqIDIpOwogICAgICAgIGxpc3RbMF0gPSBfa2V5OwogICAgICAgIGxpc3RbMV0gPSBrZXk7CiAgICAgICAgbGlzdFtDQVBBQ0lUWV0gPSBfdmFsdWU7CiAgICAgICAgbGlzdFtDQVBBQ0lUWSArIDFdID0gdmFsdWU7CiAgICAgICAgX2tleSA9IGxpc3Q7CiAgICAgICAgX3ZhbHVlID0gbnVsbDsKICAgICAgICBfZXh0cmEgPSAyOyAvLyBUd28gZWxlbWVudHMuCiAgICAgIH0KICAgIH0gZWxzZSBpZiAoX01BUktFUiA9PSBfZXh0cmEpIHsKICAgICAgX2tleVtrZXldID0gdmFsdWU7CiAgICB9IGVsc2UgewogICAgICBpbnQgcmVtYWluaW5nID0gX2V4dHJhOwogICAgICBpbnQgaW5kZXggPSAwOwogICAgICBpbnQgY29weVRvLCBjb3B5RnJvbTsKICAgICAgd2hpbGUgKHJlbWFpbmluZyA+IDAgJiYgaW5kZXggPCBDQVBBQ0lUWSkgewogICAgICAgIHZhciBjYW5kaWRhdGUgPSBfa2V5W2luZGV4XTsKICAgICAgICBpZiAoX01BUktFUiA9PSBjYW5kaWRhdGUpIHsKICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgcmFuZ2Ugb2YgZW1wdHkgc2xvdHMgaW4gdGhlCiAgICAgICAgICAvLyBsaXN0LiBXaGVuIHdlJ3JlIGRvbmUgd2UnbGwgbW92ZSBhbGwgdGhlIGVsZW1lbnRzCiAgICAgICAgICAvLyBhZnRlciB0aG9zZSBlbXB0eSBzbG90cyBkb3duLCBzbyB0aGF0IGFkZGluZyBhbiBlbGVtZW50CiAgICAgICAgICAvLyBhZnRlciB0aGF0IHdpbGwgcHJlc2VydmUgdGhlIGluc2VydGlvbiBvcmRlci4KICAgICAgICAgIGlmIChjb3B5RnJvbSA9PSBpbmRleCkgewogICAgICAgICAgICBjb3B5RnJvbSsrOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29weVRvID0gaW5kZXg7CiAgICAgICAgICAgIGNvcHlGcm9tID0gaW5kZXggKyAxOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY2FuZGlkYXRlID09IGtleSkgewogICAgICAgICAgX2tleVtDQVBBQ0lUWSArIGluZGV4XSA9IHZhbHVlOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBTa2lwcGVkIGFuIGVsZW1lbnQgdGhhdCBkaWRuJ3QgbWF0Y2guCiAgICAgICAgICByZW1haW5pbmctLTsKICAgICAgICB9CiAgICAgICAgaW5kZXgrKzsKICAgICAgfQogICAgICBpZiAoaW5kZXggPCBDQVBBQ0lUWSkgewogICAgICAgIF9rZXlbaW5kZXhdID0ga2V5OwogICAgICAgIF9rZXlbQ0FQQUNJVFkgKyBpbmRleF0gPSB2YWx1ZTsKICAgICAgICBfZXh0cmErKzsKICAgICAgfSBlbHNlIGlmIChfZXh0cmEgPCBDQVBBQ0lUWSkgewogICAgICAgIC8vIE1vdmUgdGhlIGxhc3QgZWxlbWVudHMgZG93biBpbnRvIHRoZSBsYXN0IGVtcHR5IHNsb3RzCiAgICAgICAgLy8gc28gdGhhdCB3ZSBoYXZlIGVtcHR5IHNsb3RzIGFmdGVyIHRoZSBsYXN0IGVsZW1lbnQuCiAgICAgICAgd2hpbGUgKGNvcHlGcm9tIDwgQ0FQQUNJVFkpIHsKICAgICAgICAgIF9rZXlbY29weVRvXSA9IF9rZXlbY29weUZyb21dOwogICAgICAgICAgX2tleVtDQVBBQ0lUWSArIGNvcHlUb10gPSBfa2V5W0NBUEFDSVRZICsgY29weUZyb21dOwogICAgICAgICAgY29weVRvKys7CiAgICAgICAgICBjb3B5RnJvbSsrOwogICAgICAgIH0KICAgICAgICAvLyBJbnNlcnQgdGhlIG5ldyBlbGVtZW50IGFzIHRoZSBsYXN0IGVsZW1lbnQuCiAgICAgICAgX2tleVtjb3B5VG9dID0ga2V5OwogICAgICAgIF9rZXlbQ0FQQUNJVFkgKyBjb3B5VG9dID0gdmFsdWU7CiAgICAgICAgY29weVRvKys7CiAgICAgICAgLy8gQWRkIG9uZSB0byB0aGUgbGVuZ3RoIGVuY29kZWQgaW4gdGhlIGV4dHJhIGZpZWxkLgogICAgICAgIF9leHRyYSsrOwogICAgICAgIC8vIENsZWFyIGFsbCBlbGVtZW50cyBhZnRlciB0aGUgbmV3IGxhc3QgZWxlbWVudHMgdG8KICAgICAgICAvLyBtYWtlIHN1cmUgd2UgZG9uJ3Qga2VlcCBleHRyYSBzdHVmZiBhbGl2ZS4KICAgICAgICB3aGlsZSAoY29weVRvIDwgQ0FQQUNJVFkpIHsKICAgICAgICAgIF9rZXlbY29weVRvXSA9IF9rZXlbQ0FQQUNJVFkgKyBjb3B5VG9dID0gbnVsbDsKICAgICAgICAgIGNvcHlUbysrOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgbWFwID0gbmV3IE1hcDxLLCBWPigpOwogICAgICAgIGZvckVhY2goKGVhY2hLZXksIGVhY2hWYWx1ZSkgPT4gbWFwW2VhY2hLZXldID0gZWFjaFZhbHVlKTsKICAgICAgICBtYXBba2V5XSA9IHZhbHVlOwogICAgICAgIF9rZXkgPSBtYXA7CiAgICAgICAgX2V4dHJhID0gX01BUktFUjsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgViByZW1vdmUoT2JqZWN0IGtleSkgewogICAgaWYgKF9leHRyYSA9PSBudWxsKSB7CiAgICAgIGlmIChfa2V5ICE9IGtleSkgcmV0dXJuIG51bGw7CiAgICAgIF9rZXkgPSBfTUFSS0VSOwogICAgICBWIHJlc3VsdCA9IF92YWx1ZTsKICAgICAgX3ZhbHVlID0gbnVsbDsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0gZWxzZSBpZiAoX01BUktFUiA9PSBfZXh0cmEpIHsKICAgICAgcmV0dXJuIF9rZXkucmVtb3ZlKGtleSk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCByZW1haW5pbmcgPSBfZXh0cmEsIGkgPSAwOyByZW1haW5pbmcgPiAwICYmIGkgPCBDQVBBQ0lUWTsgaSsrKSB7CiAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IF9rZXlbaV07CiAgICAgICAgaWYgKF9NQVJLRVIgPT0gY2FuZGlkYXRlKSBjb250aW51ZTsKICAgICAgICBpZiAoY2FuZGlkYXRlID09IGtleSkgewogICAgICAgICAgaW50IHZhbHVlSW5kZXggPSBDQVBBQ0lUWSArIGk7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gX2tleVt2YWx1ZUluZGV4XTsKICAgICAgICAgIF9rZXlbaV0gPSBfTUFSS0VSOwogICAgICAgICAgX2tleVt2YWx1ZUluZGV4XSA9IG51bGw7CiAgICAgICAgICBfZXh0cmEtLTsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIHJlbWFpbmluZy0tOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoKHZvaWQgYWN0aW9uKEsga2V5LCBWIHZhbHVlKSkgewogICAgaWYgKF9leHRyYSA9PSBudWxsKSB7CiAgICAgIGlmIChfTUFSS0VSICE9IF9rZXkpIGFjdGlvbihfa2V5LCBfdmFsdWUpOwogICAgfSBlbHNlIGlmIChfTUFSS0VSID09IF9leHRyYSkgewogICAgICBfa2V5LmZvckVhY2goYWN0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoaW50IHJlbWFpbmluZyA9IF9leHRyYSwgaSA9IDA7IHJlbWFpbmluZyA+IDAgJiYgaSA8IENBUEFDSVRZOyBpKyspIHsKICAgICAgICB2YXIgY2FuZGlkYXRlID0gX2tleVtpXTsKICAgICAgICBpZiAoX01BUktFUiA9PSBjYW5kaWRhdGUpIGNvbnRpbnVlOwogICAgICAgIGFjdGlvbihjYW5kaWRhdGUsIF9rZXlbQ0FQQUNJVFkgKyBpXSk7CiAgICAgICAgcmVtYWluaW5nLS07CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2xlYXIoKSB7CiAgICBfa2V5ID0gX01BUktFUjsKICAgIF92YWx1ZSA9IF9leHRyYSA9IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxLPiBnZXQga2V5cyA9PiBuZXcgX01hcGxldEtleUl0ZXJhYmxlPEs+KHRoaXMpOwp9CgpjbGFzcyBfTWFwbGV0TWFya2VyIHsKICBjb25zdCBfTWFwbGV0TWFya2VyKCk7Cn0KCmNsYXNzIF9NYXBsZXRLZXlJdGVyYWJsZTxLPiBleHRlbmRzIEl0ZXJhYmxlQmFzZTxLPiB7CiAgZmluYWwgTWFwbGV0PEssIGR5bmFtaWM+IG1hcGxldDsKCiAgX01hcGxldEtleUl0ZXJhYmxlKHRoaXMubWFwbGV0KTsKCiAgQG92ZXJyaWRlCiAgSXRlcmF0b3I8Sz4gZ2V0IGl0ZXJhdG9yIHsKICAgIGlmIChtYXBsZXQuX2V4dHJhID09IG51bGwpIHsKICAgICAgcmV0dXJuIG5ldyBfTWFwbGV0U2luZ2xlSXRlcmF0b3I8Sz4obWFwbGV0Ll9rZXkpOwogICAgfSBlbHNlIGlmIChNYXBsZXQuX01BUktFUiA9PSBtYXBsZXQuX2V4dHJhKSB7CiAgICAgIHJldHVybiBtYXBsZXQuX2tleS5rZXlzLml0ZXJhdG9yOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBfTWFwbGV0TGlzdEl0ZXJhdG9yPEs+KG1hcGxldC5fa2V5LCBtYXBsZXQuX2V4dHJhKTsKICAgIH0KICB9Cn0KCmNsYXNzIF9NYXBsZXRTaW5nbGVJdGVyYXRvcjxLPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEs+IHsKICB2YXIgX2VsZW1lbnQ7CiAgSyBfY3VycmVudDsKCiAgX01hcGxldFNpbmdsZUl0ZXJhdG9yKHRoaXMuX2VsZW1lbnQpOwoKICBAb3ZlcnJpZGUKICBLIGdldCBjdXJyZW50ID0+IF9jdXJyZW50OwoKICBAb3ZlcnJpZGUKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKE1hcGxldC5fTUFSS0VSID09IF9lbGVtZW50KSB7CiAgICAgIF9jdXJyZW50ID0gbnVsbDsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgX2N1cnJlbnQgPSBfZWxlbWVudDsKICAgIF9lbGVtZW50ID0gTWFwbGV0Ll9NQVJLRVI7CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn0KCmNsYXNzIF9NYXBsZXRMaXN0SXRlcmF0b3I8Sz4gaW1wbGVtZW50cyBJdGVyYXRvcjxLPiB7CiAgZmluYWwgTGlzdCBfbGlzdDsKICBpbnQgX3JlbWFpbmluZzsKICBpbnQgX2luZGV4ID0gMDsKICBLIF9jdXJyZW50OwoKICBfTWFwbGV0TGlzdEl0ZXJhdG9yKHRoaXMuX2xpc3QsIHRoaXMuX3JlbWFpbmluZyk7CgogIEBvdmVycmlkZQogIEsgZ2V0IGN1cnJlbnQgPT4gX2N1cnJlbnQ7CgogIEBvdmVycmlkZQogIGJvb2wgbW92ZU5leHQoKSB7CiAgICB3aGlsZSAoX3JlbWFpbmluZyA+IDApIHsKICAgICAgdmFyIGNhbmRpZGF0ZSA9IF9saXN0W19pbmRleCsrXTsKICAgICAgaWYgKE1hcGxldC5fTUFSS0VSICE9IGNhbmRpZGF0ZSkgewogICAgICAgIF9jdXJyZW50ID0gY2FuZGlkYXRlOwogICAgICAgIF9yZW1haW5pbmctLTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgX2N1cnJlbnQgPSBudWxsOwogICAgcmV0dXJuIGZhbHNlOwogIH0KfQqBKABOTjwBHQE1ASs+IQEsBUJDQkIFRENHOwEaDg4BDAEkJRkIBAEMFRoeJBsNGgYEAQwTGigkGg0VBgQBDCEaGiQkDVAhLCsVCBQGBAEMHhosJBgNUCEsORUIEwYEAQwmGh0UGCAYDywYFyEkFRclCCQZDR4VHDIlJEA/RTsjGBMcIgwnKhIRMxcKEQgeGygSJkE/Jik/FBYKNxwpEj0SPTYkORQKDyNDGhQaCAYEAQwZGiQWGRUVJB8NUCEsICkpHSMUGQoVCBMGBAEMLhoxJBwNUCEsLxUIBgQBDBEUHAQBDDsCARYZAgE2IwEjAQwdITgyKA1FBgQCATgQDgEoAQwdAQwUJhcUBhkfEQQCATYUEhIOATQBDB0BDBQdJykeFhUIBhUSBAIBJXBhY2thZ2U6Y29tcGlsZXIvc3JjL3V0aWwvbWFwbGV0LmRhcnQuc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvdXRpbC9zZXRsZXQuZGFydKI4Ly8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy51dGlsLnNldGxldDsKCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJyBzaG93IFNldEJhc2U7CgpjbGFzcyBTZXRsZXQ8RT4gZXh0ZW5kcyBTZXRCYXNlPEU+IHsKICBzdGF0aWMgY29uc3QgX1NldGxldE1hcmtlciBfTUFSS0VSID0gY29uc3QgX1NldGxldE1hcmtlcigpOwogIHN0YXRpYyBjb25zdCBpbnQgQ0FQQUNJVFkgPSA4OwoKICAvLyBUaGUgc2V0bGV0IGNhbiBiZSBpbiBvbmUgb2YgZm91ciBzdGF0ZXM6CiAgLy8KICAvLyAgICogRW1wdHkgICAgICAgICAgKGV4dHJhOiBudWxsLCAgIGNvbnRlbnRzOiBtYXJrZXIpCiAgLy8gICAqIFNpbmdsZSBlbGVtZW50IChleHRyYTogbnVsbCwgICBjb250ZW50czogZWxlbWVudCkKICAvLyAgICogTGlzdC1iYWNrZWQgICAgKGV4dHJhOiBsZW5ndGgsIGNvbnRlbnRzOiBsaXN0KQogIC8vICAgKiBTZXQtYmFja2VkICAgICAoZXh0cmE6IG1hcmtlciwgY29udGVudHM6IHNldCkKICAvLwogIC8vIFdoZW4gdGhlIHNldGxldCBpcyBsaXN0LWJhY2tlZCwgdGhlIGxpc3QgaW4gdGhlIGNvbnRlbnRzIGZpZWxkCiAgLy8gbWF5IGhhdmUgZW1wdHkgc2xvdHMgZmlsbGVkIHdpdGggdGhlIG1hcmtlciB2YWx1ZS4KICBkeW5hbWljIF9jb250ZW50cyA9IF9NQVJLRVI7CiAgdmFyIF9leHRyYTsKCiAgU2V0bGV0KCk7CiAgU2V0bGV0LmZyb20oSXRlcmFibGU8RT4gZWxlbWVudHMpIHsKICAgIGFkZEFsbChlbGVtZW50cyk7CiAgfQoKICBzdGF0aWMgU2V0PFI+IF9uZXdTZXQ8Uj4oKSA9PiBuZXcgU2V0bGV0PFI+KCk7CgogIEBvdmVycmlkZQogIFNldDxSPiBjYXN0PFI+KCkgPT4gU2V0LmNhc3RGcm9tPEUsIFI+KHRoaXMsIG5ld1NldDogX25ld1NldCk7CiAgQG92ZXJyaWRlCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yIHsKICAgIGlmIChfZXh0cmEgPT0gbnVsbCkgewogICAgICByZXR1cm4gbmV3IF9TZXRsZXRTaW5nbGVJdGVyYXRvcjxFPihfY29udGVudHMpOwogICAgfSBlbHNlIGlmIChfTUFSS0VSID09IF9leHRyYSkgewogICAgICByZXR1cm4gX2NvbnRlbnRzLml0ZXJhdG9yOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBfU2V0bGV0TGlzdEl0ZXJhdG9yPEU+KF9jb250ZW50cywgX2V4dHJhKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgbGVuZ3RoIHsKICAgIGlmIChfZXh0cmEgPT0gbnVsbCkgewogICAgICByZXR1cm4gKF9NQVJLRVIgPT0gX2NvbnRlbnRzKSA/IDAgOiAxOwogICAgfSBlbHNlIGlmIChfTUFSS0VSID09IF9leHRyYSkgewogICAgICByZXR1cm4gX2NvbnRlbnRzLmxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfZXh0cmE7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0VtcHR5IHsKICAgIGlmIChfZXh0cmEgPT0gbnVsbCkgewogICAgICByZXR1cm4gX01BUktFUiA9PSBfY29udGVudHM7CiAgICB9IGVsc2UgaWYgKF9NQVJLRVIgPT0gX2V4dHJhKSB7CiAgICAgIHJldHVybiBfY29udGVudHMuaXNFbXB0eTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfZXh0cmEgPT0gMDsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnMoT2JqZWN0IGVsZW1lbnQpIHsKICAgIGlmIChfZXh0cmEgPT0gbnVsbCkgewogICAgICByZXR1cm4gX2NvbnRlbnRzID09IGVsZW1lbnQ7CiAgICB9IGVsc2UgaWYgKF9NQVJLRVIgPT0gX2V4dHJhKSB7CiAgICAgIHJldHVybiBfY29udGVudHMuY29udGFpbnMoZWxlbWVudCk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCByZW1haW5pbmcgPSBfZXh0cmEsIGkgPSAwOyByZW1haW5pbmcgPiAwICYmIGkgPCBDQVBBQ0lUWTsgaSsrKSB7CiAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IF9jb250ZW50c1tpXTsKICAgICAgICBpZiAoX01BUktFUiA9PSBjYW5kaWRhdGUpIGNvbnRpbnVlOwogICAgICAgIGlmIChjYW5kaWRhdGUgPT0gZWxlbWVudCkgcmV0dXJuIHRydWU7CiAgICAgICAgcmVtYWluaW5nLS07CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBhZGQoRSBlbGVtZW50KSB7CiAgICBpZiAoX2V4dHJhID09IG51bGwpIHsKICAgICAgaWYgKF9NQVJLRVIgPT0gX2NvbnRlbnRzKSB7CiAgICAgICAgX2NvbnRlbnRzID0gZWxlbWVudDsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChfY29udGVudHMgPT0gZWxlbWVudCkgewogICAgICAgIC8vIERvIG5vdGhpbmcuCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9IGVsc2UgewogICAgICAgIExpc3QgbGlzdCA9IG5ldyBMaXN0KENBUEFDSVRZKTsKICAgICAgICBsaXN0WzBdID0gX2NvbnRlbnRzOwogICAgICAgIGxpc3RbMV0gPSBlbGVtZW50OwogICAgICAgIF9jb250ZW50cyA9IGxpc3Q7CiAgICAgICAgX2V4dHJhID0gMjsgLy8gVHdvIGVsZW1lbnRzLgogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9IGVsc2UgaWYgKF9NQVJLRVIgPT0gX2V4dHJhKSB7CiAgICAgIHJldHVybiBfY29udGVudHMuYWRkKGVsZW1lbnQpOwogICAgfSBlbHNlIHsKICAgICAgaW50IHJlbWFpbmluZyA9IF9leHRyYTsKICAgICAgaW50IGluZGV4ID0gMDsKICAgICAgaW50IGNvcHlUbywgY29weUZyb207CiAgICAgIHdoaWxlIChyZW1haW5pbmcgPiAwICYmIGluZGV4IDwgQ0FQQUNJVFkpIHsKICAgICAgICB2YXIgY2FuZGlkYXRlID0gX2NvbnRlbnRzW2luZGV4KytdOwogICAgICAgIGlmIChfTUFSS0VSID09IGNhbmRpZGF0ZSkgewogICAgICAgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgbGFzdCByYW5nZSBvZiBlbXB0eSBzbG90cyBpbiB0aGUKICAgICAgICAgIC8vIGxpc3QuIFdoZW4gd2UncmUgZG9uZSB3ZSdsbCBtb3ZlIGFsbCB0aGUgZWxlbWVudHMKICAgICAgICAgIC8vIGFmdGVyIHRob3NlIGVtcHR5IHNsb3RzIGRvd24sIHNvIHRoYXQgYWRkaW5nIGFuIGVsZW1lbnQKICAgICAgICAgIC8vIGFmdGVyIHRoYXQgd2lsbCBwcmVzZXJ2ZSB0aGUgaW5zZXJ0aW9uIG9yZGVyLgogICAgICAgICAgaWYgKGNvcHlGcm9tID09IGluZGV4IC0gMSkgewogICAgICAgICAgICBjb3B5RnJvbSsrOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29weVRvID0gaW5kZXggLSAxOwogICAgICAgICAgICBjb3B5RnJvbSA9IGluZGV4OwogICAgICAgICAgfQogICAgICAgICAgY29udGludWU7CiAgICAgICAgfSBlbHNlIGlmIChjYW5kaWRhdGUgPT0gZWxlbWVudCkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZW1haW5pbmctLTsKICAgICAgfQogICAgICBpZiAoaW5kZXggPCBDQVBBQ0lUWSkgewogICAgICAgIF9jb250ZW50c1tpbmRleF0gPSBlbGVtZW50OwogICAgICAgIF9leHRyYSsrOwogICAgICB9IGVsc2UgaWYgKF9leHRyYSA8IENBUEFDSVRZKSB7CiAgICAgICAgLy8gTW92ZSB0aGUgbGFzdCBlbGVtZW50cyBkb3duIGludG8gdGhlIGxhc3QgZW1wdHkgc2xvdHMKICAgICAgICAvLyBzbyB0aGF0IHdlIGhhdmUgZW1wdHkgc2xvdHMgYWZ0ZXIgdGhlIGxhc3QgZWxlbWVudC4KICAgICAgICB3aGlsZSAoY29weUZyb20gPCBDQVBBQ0lUWSkgewogICAgICAgICAgX2NvbnRlbnRzW2NvcHlUbysrXSA9IF9jb250ZW50c1tjb3B5RnJvbSsrXTsKICAgICAgICB9CiAgICAgICAgLy8gSW5zZXJ0IHRoZSBuZXcgZWxlbWVudCBhcyB0aGUgbGFzdCBlbGVtZW50LgogICAgICAgIF9jb250ZW50c1tjb3B5VG8rK10gPSBlbGVtZW50OwogICAgICAgIF9leHRyYSsrOwogICAgICAgIC8vIENsZWFyIGFsbCBlbGVtZW50cyBhZnRlciB0aGUgbmV3IGxhc3QgZWxlbWVudHMgdG8KICAgICAgICAvLyBtYWtlIHN1cmUgd2UgZG9uJ3Qga2VlcCBleHRyYSBzdHVmZiBhbGl2ZS4KICAgICAgICB3aGlsZSAoY29weVRvIDwgQ0FQQUNJVFkpIF9jb250ZW50c1tjb3B5VG8rK10gPSBudWxsOwogICAgICB9IGVsc2UgewogICAgICAgIF9jb250ZW50cyA9IG5ldyBTZXQ8RT4oKQogICAgICAgICAgLi5hZGRBbGwoKF9jb250ZW50cyBhcyBMaXN0KS5jYXN0PEU+KCkpCiAgICAgICAgICAuLmFkZChlbGVtZW50KTsKICAgICAgICBfZXh0cmEgPSBfTUFSS0VSOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gZWxlbWVudHMpIHsKICAgIGVsZW1lbnRzLmZvckVhY2goKGVhY2gpID0+IGFkZChlYWNoKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFIGxvb2t1cChPYmplY3QgZWxlbWVudCkgewogICAgaWYgKF9leHRyYSA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfY29udGVudHMgPT0gZWxlbWVudCA/IF9jb250ZW50cyA6IG51bGw7CiAgICB9IGVsc2UgaWYgKF9NQVJLRVIgPT0gX2V4dHJhKSB7CiAgICAgIHJldHVybiBfY29udGVudHMubG9va3VwKGVsZW1lbnQpOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChpbnQgcmVtYWluaW5nID0gX2V4dHJhLCBpID0gMDsgcmVtYWluaW5nID4gMCAmJiBpIDwgQ0FQQUNJVFk7IGkrKykgewogICAgICAgIHZhciBjYW5kaWRhdGUgPSBfY29udGVudHNbaV07CiAgICAgICAgaWYgKF9NQVJLRVIgPT0gY2FuZGlkYXRlKSBjb250aW51ZTsKICAgICAgICBpZiAoY2FuZGlkYXRlID09IGVsZW1lbnQpIHJldHVybiBjYW5kaWRhdGU7CiAgICAgICAgcmVtYWluaW5nLS07CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHJlbW92ZShPYmplY3QgZWxlbWVudCkgewogICAgaWYgKF9leHRyYSA9PSBudWxsKSB7CiAgICAgIGlmIChfY29udGVudHMgPT0gZWxlbWVudCkgewogICAgICAgIF9jb250ZW50cyA9IF9NQVJLRVI7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9IGVsc2UgaWYgKF9NQVJLRVIgPT0gX2V4dHJhKSB7CiAgICAgIHJldHVybiBfY29udGVudHMucmVtb3ZlKGVsZW1lbnQpOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChpbnQgcmVtYWluaW5nID0gX2V4dHJhLCBpID0gMDsgcmVtYWluaW5nID4gMCAmJiBpIDwgQ0FQQUNJVFk7IGkrKykgewogICAgICAgIHZhciBjYW5kaWRhdGUgPSBfY29udGVudHNbaV07CiAgICAgICAgaWYgKF9NQVJLRVIgPT0gY2FuZGlkYXRlKSBjb250aW51ZTsKICAgICAgICBpZiAoY2FuZGlkYXRlID09IGVsZW1lbnQpIHsKICAgICAgICAgIF9jb250ZW50c1tpXSA9IF9NQVJLRVI7CiAgICAgICAgICBfZXh0cmEtLTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZW1haW5pbmctLTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlbW92ZUFsbChJdGVyYWJsZTxPYmplY3Q+IG90aGVyKSB7CiAgICBvdGhlci5mb3JFYWNoKHJlbW92ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICBpZiAoX2V4dHJhID09IG51bGwpIHsKICAgICAgaWYgKHRlc3QoX2NvbnRlbnRzKSkgewogICAgICAgIF9jb250ZW50cyA9IF9NQVJLRVI7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoX01BUktFUiA9PSBfZXh0cmEpIHsKICAgICAgX2NvbnRlbnRzLnJlbW92ZVdoZXJlKHRlc3QpOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChpbnQgcmVtYWluaW5nID0gX2V4dHJhLCBpID0gMDsgcmVtYWluaW5nID4gMCAmJiBpIDwgQ0FQQUNJVFk7IGkrKykgewogICAgICAgIHZhciBjYW5kaWRhdGUgPSBfY29udGVudHNbaV07CiAgICAgICAgaWYgKF9NQVJLRVIgPT0gY2FuZGlkYXRlKSBjb250aW51ZTsKICAgICAgICBpZiAodGVzdChjYW5kaWRhdGUpKSB7CiAgICAgICAgICBfY29udGVudHNbaV0gPSBfTUFSS0VSOwogICAgICAgICAgX2V4dHJhLS07CiAgICAgICAgfQogICAgICAgIHJlbWFpbmluZy0tOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICByZW1vdmVXaGVyZSgoRSBlbGVtZW50KSA9PiAhdGVzdChlbGVtZW50KSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJldGFpbkFsbChJdGVyYWJsZTxPYmplY3Q+IGVsZW1lbnRzKSB7CiAgICBTZXQgc2V0ID0gZWxlbWVudHMgaXMgU2V0ID8gZWxlbWVudHMgOiBlbGVtZW50cy50b1NldCgpOwogICAgcmVtb3ZlV2hlcmUoKEUgZWxlbWVudCkgPT4gIXNldC5jb250YWlucyhlbGVtZW50KSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2godm9pZCBhY3Rpb24oRSBlbGVtZW50KSkgewogICAgaWYgKF9leHRyYSA9PSBudWxsKSB7CiAgICAgIGlmIChfTUFSS0VSICE9IF9jb250ZW50cykgYWN0aW9uKF9jb250ZW50cyk7CiAgICB9IGVsc2UgaWYgKF9NQVJLRVIgPT0gX2V4dHJhKSB7CiAgICAgIF9jb250ZW50cy5mb3JFYWNoKGFjdGlvbik7CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCByZW1haW5pbmcgPSBfZXh0cmEsIGkgPSAwOyByZW1haW5pbmcgPiAwICYmIGkgPCBDQVBBQ0lUWTsgaSsrKSB7CiAgICAgICAgdmFyIGVsZW1lbnQgPSBfY29udGVudHNbaV07CiAgICAgICAgaWYgKF9NQVJLRVIgPT0gZWxlbWVudCkgY29udGludWU7CiAgICAgICAgYWN0aW9uKGVsZW1lbnQpOwogICAgICAgIHJlbWFpbmluZy0tOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPE9iamVjdD4gb3RoZXIpIHsKICAgIGZvciAoRSBlIGluIG90aGVyKSB7CiAgICAgIGlmICghdGhpcy5jb250YWlucyhlKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBjbGVhcigpIHsKICAgIF9jb250ZW50cyA9IF9NQVJLRVI7CiAgICBfZXh0cmEgPSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgU2V0PEU+IHVuaW9uKFNldDxFPiBvdGhlcikgPT4gbmV3IFNldDxFPi5mcm9tKHRoaXMpLi5hZGRBbGwob3RoZXIpOwoKICBAb3ZlcnJpZGUKICBTZXRsZXQ8RT4gaW50ZXJzZWN0aW9uKFNldDxPYmplY3Q+IG90aGVyKSA9PgogICAgICBuZXcgU2V0bGV0PEU+LmZyb20odGhpcy53aGVyZSgoZSkgPT4gb3RoZXIuY29udGFpbnMoZSkpKTsKCiAgQG92ZXJyaWRlCiAgU2V0bGV0PEU+IGRpZmZlcmVuY2UoU2V0PE9iamVjdD4gb3RoZXIpID0+CiAgICAgIG5ldyBTZXRsZXQ8RT4uZnJvbSh0aGlzLndoZXJlKChlKSA9PiAhb3RoZXIuY29udGFpbnMoZSkpKTsKCiAgQG92ZXJyaWRlCiAgU2V0bGV0PEU+IHRvU2V0KCkgewogICAgU2V0bGV0PEU+IHJlc3VsdCA9IG5ldyBTZXRsZXQ8RT4oKTsKICAgIGlmIChfZXh0cmEgPT0gbnVsbCkgewogICAgICByZXN1bHQuX2NvbnRlbnRzID0gX2NvbnRlbnRzOwogICAgfSBlbHNlIGlmIChfZXh0cmEgPT0gX01BUktFUikgewogICAgICByZXN1bHQuX2V4dHJhID0gX01BUktFUjsKICAgICAgcmVzdWx0Ll9jb250ZW50cyA9IF9jb250ZW50cy50b1NldCgpOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0Ll9leHRyYSA9IF9leHRyYTsKICAgICAgcmVzdWx0Ll9jb250ZW50cyA9IF9jb250ZW50cy50b0xpc3QoKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CgpjbGFzcyBfU2V0bGV0TWFya2VyIHsKICBjb25zdCBfU2V0bGV0TWFya2VyKCk7CiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAiLSI7Cn0KCmNsYXNzIF9TZXRsZXRTaW5nbGVJdGVyYXRvcjxFPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKICB2YXIgX2VsZW1lbnQ7CiAgRSBfY3VycmVudDsKICBfU2V0bGV0U2luZ2xlSXRlcmF0b3IodGhpcy5fZWxlbWVudCk7CgogIEBvdmVycmlkZQogIEUgZ2V0IGN1cnJlbnQgPT4gX2N1cnJlbnQ7CgogIEBvdmVycmlkZQogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBpZiAoU2V0bGV0Ll9NQVJLRVIgPT0gX2VsZW1lbnQpIHsKICAgICAgX2N1cnJlbnQgPSBudWxsOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBfY3VycmVudCA9IF9lbGVtZW50OwogICAgX2VsZW1lbnQgPSBTZXRsZXQuX01BUktFUjsKICAgIHJldHVybiB0cnVlOwogIH0KfQoKY2xhc3MgX1NldGxldExpc3RJdGVyYXRvcjxFPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKICBmaW5hbCBMaXN0IF9saXN0OwogIGludCBfcmVtYWluaW5nOwogIGludCBfaW5kZXggPSAwOwogIEUgX2N1cnJlbnQ7CiAgX1NldGxldExpc3RJdGVyYXRvcih0aGlzLl9saXN0LCB0aGlzLl9yZW1haW5pbmcpOwoKICBAb3ZlcnJpZGUKICBFIGdldCBjdXJyZW50ID0+IF9jdXJyZW50OwoKICBAb3ZlcnJpZGUKICBib29sIG1vdmVOZXh0KCkgewogICAgd2hpbGUgKF9yZW1haW5pbmcgPiAwKSB7CiAgICAgIHZhciBjYW5kaWRhdGUgPSBfbGlzdFtfaW5kZXgrK107CiAgICAgIGlmIChTZXRsZXQuX01BUktFUiAhPSBjYW5kaWRhdGUpIHsKICAgICAgICBfY3VycmVudCA9IGNhbmRpZGF0ZTsKICAgICAgICBfcmVtYWluaW5nLS07CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIF9jdXJyZW50ID0gbnVsbDsKICAgIHJldHVybiBmYWxzZTsKICB9Cn0KgVgATk48AR0BJwElPiEBLgU6Ozg3BUQ4Hw4BDCYWBAExAQxBDB0aNiQhDTwGBAEMExotJB8NFQYEAQwVGiMkIA0aBgQBDCIaIyQqDVAmLC8VCBQGBAEMGBoiHRUpFxYPKB0bGiUVCCQlDR4VHDIsJEA/RTsnGBMgHgwUKxgKFQgeJBImQT8mNwo3JxI9Nj4PITIaGggTBgQBDCYrBAEMHRo2JCgNUCYsNBUIEwYEAQwgGiIdFQ8WCCQoDVAmLCQiFBcKFQgUBgQBDCsbBAEMKxodHQgkIw1QJiwfIhQKFQgGBAEMKzAEAQwuPTgEAQwpGjMkIQ1QJCoZFQgGBAEMLRkrBhEEAQwMGRMEAQxGAQwvQAEMLUEBDBYoGiQkHywNHi0GEwQCARYZDBUCATgQDigBDB0BDBQmFxQGGR8RBAIBNhQSEg40AQwdAQwUHScpHhYVCAYVEgQCASVwYWNrYWdlOmNvbXBpbGVyL3NyYy91dGlsL3NldGxldC5kYXJ0IHNka3Jvb3Q6L3BrZy9rZXJuZWwvbGliL2FzdC5kYXJ0wALYuS8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENIQU5HSU5HIFRISVMgRklMRToKLy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLwovLy8gSWYgeW91IGFyZSBhZGRpbmcvcmVtb3ZpbmcvbW9kaWZ5aW5nIGZpZWxkcy9jbGFzc2VzIG9mIHRoZSBBU1QsIHlvdSBtdXN0Ci8vLyBhbHNvIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGZpbGVzOgovLy8KLy8vICAgLSBiaW5hcnkvYXN0X3RvX2JpbmFyeS5kYXJ0Ci8vLyAgIC0gYmluYXJ5L2FzdF9mcm9tX2JpbmFyeS5kYXJ0Ci8vLyAgIC0gdGV4dC9hc3RfdG9fdGV4dC5kYXJ0Ci8vLyAgIC0gY2xvbmUuZGFydAovLy8gICAtIGJpbmFyeS5tZAovLy8gICAtIHR5cGVfY2hlY2tlci5kYXJ0IChpZiByZWxldmFudCkKLy8vCi8vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJPUiBIQU5ETElORwovLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vCi8vLyBBcyBhIHJ1bGUgb2YgdGh1bWIsIGVycm9ycyB0aGF0IGNhbiBiZSBkZXRlY3RlZCBzdGF0aWNhbGx5IGFyZSBoYW5kbGVkIGJ5Ci8vLyB0aGUgZnJvbnRlbmQsIHR5cGljYWxseSBieSB0cmFuc2xhdGluZyB0aGUgZXJyb25lb3VzIGNvZGUgaW50byBhICd0aHJvdycgb3IKLy8vIGEgY2FsbCB0byAnbm9TdWNoTWV0aG9kJy4KLy8vCi8vLyBGb3IgZXhhbXBsZSwgdGhlcmUgYXJlIG5vIGFyaXR5IG1pc21hdGNoZXMgaW4gc3RhdGljIGludm9jYXRpb25zLCBhbmQKLy8vIHRoZXJlIGFyZSBubyBkaXJlY3QgaW52b2NhdGlvbnMgb2YgYSBjb25zdHJ1Y3RvciBvbiBhIGFic3RyYWN0IGNsYXNzLgovLy8KLy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRJQyB2cyBUT1AtTEVWRUwKLy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLwovLy8gVGhlIHRlcm0gYHN0YXRpY2AgaW5jbHVkZXMgYm90aCBzdGF0aWMgY2xhc3MgbWVtYmVycyBhbmQgdG9wLWxldmVsIG1lbWJlcnMuCi8vLwovLy8gIlN0YXRpYyBjbGFzcyBtZW1iZXIiIGlzIHRoZSBwcmVmZXJyZWQgdGVybSBmb3Igbm9uLXRvcCBsZXZlbCBzdGF0aWNzLgovLy8KLy8vIFN0YXRpYyBjbGFzcyBtZW1iZXJzIGFyZSBub3QgbGlmdGVkIHRvIHRoZSBsaWJyYXJ5IGxldmVsIGJlY2F1c2UgbWlycm9ycwovLy8gYW5kIHN0YWNrIHRyYWNlcyBjYW4gb2JzZXJ2ZSB0aGF0IHRoZXkgYXJlIGNsYXNzIG1lbWJlcnMuCi8vLwovLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VEVVJFUwovLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vCi8vLyAiUHJvY2VkdXJlIiBpcyBhbiB1bWJyZWxsYSB0ZXJtIGZvciBtZXRob2QsIGdldHRlciwgc2V0dGVyLCBpbmRleC1nZXR0ZXIsCi8vLyBpbmRleC1zZXR0ZXIsIG9wZXJhdG9yIG92ZXJsb2FkZXIsIGFuZCBmYWN0b3J5IGNvbnN0cnVjdG9yLgovLy8KLy8vIEdlbmVyYXRpdmUgY29uc3RydWN0b3JzLCBmaWVsZCBpbml0aWFsaXplcnMsIGxvY2FsIGZ1bmN0aW9ucyBhcmUgTk9UCi8vLyBwcm9jZWR1cmVzLgovLy8KLy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU0ZPUk1BVElPTlMKLy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLwovLy8gQVNUIHRyYW5zZm9ybWF0aW9ucyBjYW4gYmUgcGVyZm9ybWVkIHVzaW5nIFtUcmVlTm9kZS5yZXBsYWNlV2l0aF0gb3IgdGhlCi8vLyBbVHJhbnNmb3JtZXJdIHZpc2l0b3IgY2xhc3MuCi8vLwovLy8gVXNlIFtUcmFuc2Zvcm1lcl0gZm9yIGJ1bGsgdHJhbnNmb3JtYXRpb25zIHRoYXQgYXJlIGxpa2VseSB0byB0cmFuc2Zvcm0gbG90cwovLy8gb2Ygbm9kZXMsIGFuZCBbVHJlZU5vZGUucmVwbGFjZVdpdGhdIGZvciBzcGFyc2UgdHJhbnNmb3JtYXRpb25zIHRoYXQgbXV0YXRlCi8vLyByZWxhdGl2ZWx5IGZldyBub2Rlcy4gIE9yIHVzZSB3aGljaGV2ZXIgaXMgbW9yZSBjb252ZW5pZW50LgovLy8KLy8vIFRoZSBBU1QgY2FuIGFsc28gYmUgbXV0YXRlZCBieSBkaXJlY3QgZmllbGQgbWFuaXB1bGF0aW9uLCBidXQgdGhlIHVzZXIgdGhlbgovLy8gaGFzIHRvIHVwZGF0ZSBwYXJlbnQgcG9pbnRlcnMgbWFudWFsbHkuCi8vLwpsaWJyYXJ5IGtlcm5lbC5hc3Q7CgppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyB1dGY4OwoKaW1wb3J0ICd2aXNpdG9yLmRhcnQnOwpleHBvcnQgJ3Zpc2l0b3IuZGFydCc7CgppbXBvcnQgJ2Nhbm9uaWNhbF9uYW1lLmRhcnQnIHNob3cgQ2Fub25pY2FsTmFtZTsKZXhwb3J0ICdjYW5vbmljYWxfbmFtZS5kYXJ0JyBzaG93IENhbm9uaWNhbE5hbWU7CgppbXBvcnQgJ3RyYW5zZm9ybWF0aW9ucy9mbGFncy5kYXJ0JzsKaW1wb3J0ICd0ZXh0L2FzdF90b190ZXh0LmRhcnQnOwppbXBvcnQgJ3R5cGVfYWxnZWJyYS5kYXJ0JzsKaW1wb3J0ICd0eXBlX2Vudmlyb25tZW50LmRhcnQnOwppbXBvcnQgJ2NvcV9hbm5vdC5kYXJ0JzsKCi8vLyBBbnkgdHlwZSBvZiBub2RlIGluIHRoZSBJUi4KYWJzdHJhY3QgY2xhc3MgTm9kZSB7CiAgY29uc3QgTm9kZSgpOwoKICBhY2NlcHQoVmlzaXRvciB2KTsKICB2b2lkIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KTsKCiAgLy8vIFJldHVybnMgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBub2RlIGZvciB1c2UgaW4gZGVidWdnaW5nLgogIC8vLwogIC8vLyBbdG9TdHJpbmddIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGRlYnVnZ2luZyBhbmQgc2hvcnQtcnVubmluZyB0ZXN0IHRvb2xzCiAgLy8vIGFzIGl0IGNhbiBjYXVzZSBzZXJpb3VzIG1lbW9yeSBsZWFrcy4KICAvLy8KICAvLy8gU3ludGhldGljIG5hbWVzIGFyZSBjYWNoZWQgZ2xvYmFsbHkgdG8gcmV0YWluIGNvbnNpc3RlbmN5IGFjcm9zcyBkaWZmZXJlbnQKICAvLy8gW3RvU3RyaW5nXSBjYWxscyAoaGVuY2UgdGhlIG1lbW9yeSBsZWFrKS4KICAvLy8KICAvLy8gTm9kZXMgdGhhdCBhcmUgbmFtZWQsIHN1Y2ggYXMgW0NsYXNzXSBhbmQgW01lbWJlcl0sIHJldHVybiB0aGVpcgogIC8vLyAocG9zc2libHkgc3ludGhlc2l6ZWQpIG5hbWUsIHdoZXJlYXMgb3RoZXIgQVNUIG5vZGVzIHJldHVybiB0aGUgY29tcGxldGUKICAvLy8gdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGVpciBzdWJ0cmVlLgogIFN0cmluZyB0b1N0cmluZygpID0+IGRlYnVnTm9kZVRvU3RyaW5nKHRoaXMpOwp9CgovLy8gQSBtdXRhYmxlIEFTVCBub2RlIHdpdGggYSBwYXJlbnQgcG9pbnRlci4KLy8vCi8vLyBUaGlzIGlzIGFueXRoaW5nIG90aGVyIHRoYW4gW05hbWVdIGFuZCBbRGFydFR5cGVdIG5vZGVzLgphYnN0cmFjdCBjbGFzcyBUcmVlTm9kZSBleHRlbmRzIE5vZGUgewogIHN0YXRpYyBpbnQgX2hhc2hDb3VudGVyID0gMDsKICBmaW5hbCBpbnQgaGFzaENvZGUgPSBfaGFzaENvdW50ZXIgPSAoX2hhc2hDb3VudGVyICsgMSkgJiAweDNmZmZmZmZmOwogIHN0YXRpYyBjb25zdCBpbnQgbm9PZmZzZXQgPSAtMTsKCiAgVHJlZU5vZGUgcGFyZW50OwoKICAvLy8gT2Zmc2V0IGluIHRoZSBzb3VyY2UgZmlsZSBpdCBjb21lcyBmcm9tLgogIC8vLwogIC8vLyBWYWxpZCB2YWx1ZXMgYXJlIGZyb20gMCBhbmQgdXAsIG9yIC0xIChbbm9PZmZzZXRdKSBpZiB0aGUgZmlsZSBvZmZzZXQgaXMKICAvLy8gbm90IGF2YWlsYWJsZSAodGhpcyBpcyB0aGUgZGVmYXVsdCBpZiBub25lIGlzIHNwZWNpZmljYWxseSBzZXQpLgogIGludCBmaWxlT2Zmc2V0ID0gbm9PZmZzZXQ7CgogIGFjY2VwdChUcmVlVmlzaXRvciB2KTsKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdik7CiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdik7CgogIC8vLyBSZXBsYWNlcyBbY2hpbGRdIHdpdGggW3JlcGxhY2VtZW50XS4KICAvLy8KICAvLy8gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCB0aGUgQVNUIHJlbWFpbnMgYSB0cmVlLiAgSW4KICAvLy8gcGFydGljdWxhciwgW3JlcGxhY2VtZW50XSBzaG91bGQgYmUgYW4gb3JwaGFuIG9yIGJlIHBhcnQgb2YgYW4gb3JwaGFuZWQKICAvLy8gc3VidHJlZS4KICAvLy8KICAvLy8gSGFzIG5vIGVmZmVjdCBpZiBbY2hpbGRdIGlzIG5vdCBhY3R1YWxseSBhIGNoaWxkIG9mIHRoaXMgbm9kZS4KICAvLy8KICAvLy8gSWYgW3JlcGxhY2VtZW50XSBpcyBgbnVsbGAsIHRoaXMgd2lsbCBbcmVtb3ZlXSB0aGUgW2NoaWxkXSBub2RlLgogIHZvaWQgcmVwbGFjZUNoaWxkKFRyZWVOb2RlIGNoaWxkLCBUcmVlTm9kZSByZXBsYWNlbWVudCkgewogICAgdHJhbnNmb3JtQ2hpbGRyZW4obmV3IF9DaGlsZFJlcGxhY2VyKGNoaWxkLCByZXBsYWNlbWVudCkpOwogIH0KCiAgLy8vIEluc2VydHMgYW5vdGhlciBub2RlIGluIHBsYWNlIG9mIHRoaXMgb25lLgogIC8vLwogIC8vLyBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHRoZSBBU1QgcmVtYWlucyBhIHRyZWUuICBJbgogIC8vLyBwYXJ0aWN1bGFyLCBbcmVwbGFjZW1lbnRdIHNob3VsZCBiZSBhbiBvcnBoYW4gb3IgYmUgcGFydCBvZiBhbiBvcnBoYW5lZAogIC8vLyBzdWJ0cmVlLgogIC8vLwogIC8vLyBJZiBbcmVwbGFjZW1lbnRdIGlzIGBudWxsYCwgdGhpcyB3aWxsIFtyZW1vdmVdIHRoZSBub2RlLgogIHZvaWQgcmVwbGFjZVdpdGgoVHJlZU5vZGUgcmVwbGFjZW1lbnQpIHsKICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQodGhpcywgcmVwbGFjZW1lbnQpOwogICAgcGFyZW50ID0gbnVsbDsKICB9CgogIC8vLyBSZW1vdmVzIHRoaXMgbm9kZSBmcm9tIHRoZSBbTGlzdF0gaXQgaXMgY3VycmVudGx5IHN0b3JlZCBpbiwgb3IgYXNzaWducwogIC8vLyBgbnVsbGAgdG8gdGhlIGZpZWxkIG9uIHRoZSBwYXJlbnQgY3VycmVudGx5IHBvaW50aW5nIHRvIHRoZSBub2RlLgogIC8vLwogIC8vLyBIYXMgbm8gZWZmZWN0IGlmIHRoZSBub2RlIGlzIG9ycGhhbmVkIG9yIGlmIHRoZSBwYXJlbnQgcG9pbnRlciBpcyBzdGFsZS4KICB2b2lkIHJlbW92ZSgpIHsKICAgIHBhcmVudD8ucmVwbGFjZUNoaWxkKHRoaXMsIG51bGwpOwogICAgcGFyZW50ID0gbnVsbDsKICB9CgogIENvbXBvbmVudCBnZXQgZW5jbG9zaW5nQ29tcG9uZW50ID0+IHBhcmVudD8uZW5jbG9zaW5nQ29tcG9uZW50OwoKICAvLy8gUmV0dXJucyB0aGUgYmVzdCBrbm93biBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIGdpdmVuIEFTVCBub2RlLCBvciBgbnVsbGAgaWYKICAvLy8gdGhlIG5vZGUgaXMgb3JwaGFuZWQuCiAgLy8vCiAgLy8vIFRoaXMgZ2V0dGVyIGlzIGludGVuZGVkIGZvciBkaWFnbm9zdGljcyBhbmQgZGVidWdnaW5nLCBhbmQgc2hvdWxkIGJlCiAgLy8vIGF2b2lkZWQgaW4gcHJvZHVjdGlvbiBjb2RlLgogIExvY2F0aW9uIGdldCBsb2NhdGlvbiB7CiAgICBpZiAoZmlsZU9mZnNldCA9PSBub09mZnNldCkgcmV0dXJuIHBhcmVudD8ubG9jYXRpb247CiAgICByZXR1cm4gX2dldExvY2F0aW9uSW5FbmNsb3NpbmdGaWxlKGZpbGVPZmZzZXQpOwogIH0KCiAgTG9jYXRpb24gX2dldExvY2F0aW9uSW5FbmNsb3NpbmdGaWxlKGludCBvZmZzZXQpIHsKICAgIHJldHVybiBwYXJlbnQ/Ll9nZXRMb2NhdGlvbkluRW5jbG9zaW5nRmlsZShvZmZzZXQpOwogIH0KfQoKLy8vIEFuIEFTVCBub2RlIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgYnkgb3RoZXIgbm9kZXMuCi8vLwovLy8gVGhlcmUgaXMgYSBzaW5nbGUgW3JlZmVyZW5jZV0gYmVsb25naW5nIHRvIHRoaXMgbm9kZSwgcHJvdmlkaW5nIGEgbGV2ZWwgb2YKLy8vIGluZGlyZWN0aW9uIHRoYXQgaXMgbmVlZGVkIGR1cmluZyBzZXJpYWxpemF0aW9uLgpAY29xCmFic3RyYWN0IGNsYXNzIE5hbWVkTm9kZSBleHRlbmRzIFRyZWVOb2RlIHsKICBAY29xZGVmCiAgZmluYWwgUmVmZXJlbmNlIHJlZmVyZW5jZTsKCiAgTmFtZWROb2RlKFJlZmVyZW5jZSByZWZlcmVuY2UpCiAgICAgIDogdGhpcy5yZWZlcmVuY2UgPSByZWZlcmVuY2UgPz8gbmV3IFJlZmVyZW5jZSgpIHsKICAgIHRoaXMucmVmZXJlbmNlLm5vZGUgPSB0aGlzOwogIH0KCiAgQ2Fub25pY2FsTmFtZSBnZXQgY2Fub25pY2FsTmFtZSA9PiByZWZlcmVuY2U/LmNhbm9uaWNhbE5hbWU7Cn0KCmFic3RyYWN0IGNsYXNzIEZpbGVVcmlOb2RlIGV4dGVuZHMgVHJlZU5vZGUgewogIC8vLyBUaGUgVVJJIG9mIHRoZSBzb3VyY2UgZmlsZSB0aGlzIG5vZGUgd2FzIGxvYWRlZCBmcm9tLgogIFVyaSBnZXQgZmlsZVVyaTsKfQoKLy8vIEluZGlyZWN0aW9uIGJldHdlZW4gYSByZWZlcmVuY2UgYW5kIGl0cyBkZWZpbml0aW9uLgovLy8KLy8vIFRoZXJlIGlzIG9ubHkgb25lIHJlZmVyZW5jZSBvYmplY3QgcGVyIFtOYW1lZE5vZGVdLgpAY29xcmVmCmNsYXNzIFJlZmVyZW5jZSB7CiAgQ2Fub25pY2FsTmFtZSBjYW5vbmljYWxOYW1lOwoKICBAbm9jb3EKICBOYW1lZE5vZGUgbm9kZTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgaWYgKGNhbm9uaWNhbE5hbWUgIT0gbnVsbCkgewogICAgICByZXR1cm4gJ1JlZmVyZW5jZSB0byAkY2Fub25pY2FsTmFtZSc7CiAgICB9CiAgICBpZiAobm9kZSAhPSBudWxsKSB7CiAgICAgIHJldHVybiAnUmVmZXJlbmNlIHRvICRub2RlJzsKICAgIH0KICAgIHJldHVybiAnVW5ib3VuZCByZWZlcmVuY2UnOwogIH0KCiAgTGlicmFyeSBnZXQgYXNMaWJyYXJ5IHsKICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgdGhyb3cgJyR0aGlzIGlzIG5vdCBib3VuZCB0byBhbiBBU1Qgbm9kZS4gQSBsaWJyYXJ5IHdhcyBleHBlY3RlZCc7CiAgICB9CiAgICByZXR1cm4gbm9kZSBhcyBMaWJyYXJ5OwogIH0KCiAgQ2xhc3MgZ2V0IGFzQ2xhc3MgewogICAgaWYgKG5vZGUgPT0gbnVsbCkgewogICAgICB0aHJvdyAnJHRoaXMgaXMgbm90IGJvdW5kIHRvIGFuIEFTVCBub2RlLiBBIGNsYXNzIHdhcyBleHBlY3RlZCc7CiAgICB9CiAgICByZXR1cm4gbm9kZSBhcyBDbGFzczsKICB9CgogIE1lbWJlciBnZXQgYXNNZW1iZXIgewogICAgaWYgKG5vZGUgPT0gbnVsbCkgewogICAgICB0aHJvdyAnJHRoaXMgaXMgbm90IGJvdW5kIHRvIGFuIEFTVCBub2RlLiBBIG1lbWJlciB3YXMgZXhwZWN0ZWQnOwogICAgfQogICAgcmV0dXJuIG5vZGUgYXMgTWVtYmVyOwogIH0KCiAgRmllbGQgZ2V0IGFzRmllbGQgewogICAgaWYgKG5vZGUgPT0gbnVsbCkgewogICAgICB0aHJvdyAnJHRoaXMgaXMgbm90IGJvdW5kIHRvIGFuIEFTVCBub2RlLiBBIGZpZWxkIHdhcyBleHBlY3RlZCc7CiAgICB9CiAgICByZXR1cm4gbm9kZSBhcyBGaWVsZDsKICB9CgogIENvbnN0cnVjdG9yIGdldCBhc0NvbnN0cnVjdG9yIHsKICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgdGhyb3cgJyR0aGlzIGlzIG5vdCBib3VuZCB0byBhbiBBU1Qgbm9kZS4gQSBjb25zdHJ1Y3RvciB3YXMgZXhwZWN0ZWQnOwogICAgfQogICAgcmV0dXJuIG5vZGUgYXMgQ29uc3RydWN0b3I7CiAgfQoKICBQcm9jZWR1cmUgZ2V0IGFzUHJvY2VkdXJlIHsKICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgdGhyb3cgJyR0aGlzIGlzIG5vdCBib3VuZCB0byBhbiBBU1Qgbm9kZS4gQSBwcm9jZWR1cmUgd2FzIGV4cGVjdGVkJzsKICAgIH0KICAgIHJldHVybiBub2RlIGFzIFByb2NlZHVyZTsKICB9CgogIFR5cGVkZWYgZ2V0IGFzVHlwZWRlZiB7CiAgICBpZiAobm9kZSA9PSBudWxsKSB7CiAgICAgIHRocm93ICckdGhpcyBpcyBub3QgYm91bmQgdG8gYW4gQVNUIG5vZGUuIEEgdHlwZWRlZiB3YXMgZXhwZWN0ZWQnOwogICAgfQogICAgcmV0dXJuIG5vZGUgYXMgVHlwZWRlZjsKICB9Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgICAgICAgICAgICAgICAgICAgICBMSUJSQVJJRVMgYW5kIENMQVNTRVMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpAY29xCmNsYXNzIExpYnJhcnkgZXh0ZW5kcyBOYW1lZE5vZGUgaW1wbGVtZW50cyBDb21wYXJhYmxlPExpYnJhcnk+LCBGaWxlVXJpTm9kZSB7CiAgLy8vIEFuIGltcG9ydCBwYXRoIHRvIHRoaXMgbGlicmFyeS4KICAvLy8KICAvLy8gVGhlIFtVcmldIHNob3VsZCBoYXZlIHRoZSBgZGFydGAsIGBwYWNrYWdlYCwgYGFwcGAsIG9yIGBmaWxlYCBzY2hlbWUuCiAgLy8vCiAgLy8vIElmIHRoZSBVUkkgaGFzIHRoZSBgYXBwYCBzY2hlbWUsIGl0IGlzIHJlbGF0aXZlIHRvIHRoZSBhcHBsaWNhdGlvbiByb290LgogIFVyaSBpbXBvcnRVcmk7CgogIC8vLyBUaGUgVVJJIG9mIHRoZSBzb3VyY2UgZmlsZSB0aGlzIGxpYnJhcnkgd2FzIGxvYWRlZCBmcm9tLgogIFVyaSBmaWxlVXJpOwoKICBzdGF0aWMgY29uc3QgaW50IEV4dGVybmFsRmxhZyA9IDEgPDwgMDsKICBzdGF0aWMgY29uc3QgaW50IFN5bnRoZXRpY0ZsYWcgPSAxIDw8IDE7CgogIGludCBmbGFncyA9IDA7CgogIC8vLyBJZiB0cnVlLCB0aGUgbGlicmFyeSBpcyBwYXJ0IG9mIGFub3RoZXIgYnVpbGQgdW5pdCBhbmQgaXRzIGNvbnRlbnRzCiAgLy8vIGFyZSBvbmx5IHBhcnRpYWxseSBsb2FkZWQuCiAgLy8vCiAgLy8vIENsYXNzZXMgb2YgYW4gZXh0ZXJuYWwgbGlicmFyeSBhcmUgbG9hZGVkIGF0IG9uZSBvZiB0aGUgW0NsYXNzTGV2ZWxdcwogIC8vLyBvdGhlciB0aGFuIFtDbGFzc0xldmVsLkJvZHldLiAgTWVtYmVycyBpbiBhbiBleHRlcm5hbCBsaWJyYXJ5IGhhdmUgbm8KICAvLy8gYm9keSwgYnV0IGhhdmUgdGhlaXIgdHlwZWQgaW50ZXJmYWNlIHByZXNlbnQuCiAgLy8vCiAgLy8vIElmIHRoZSBsaWJyYXJ5IGlzIG5vbi1leHRlcm5hbCwgdGhlbiBpdHMgY2xhc3NlcyBhcmUgYXQgW0NsYXNzTGV2ZWwuQm9keV0KICAvLy8gYW5kIGFsbCBtZW1iZXJzIGFyZSBsb2FkZWQuCiAgYm9vbCBnZXQgaXNFeHRlcm5hbCA9PiAoZmxhZ3MgJiBFeHRlcm5hbEZsYWcpICE9IDA7CiAgdm9pZCBzZXQgaXNFeHRlcm5hbChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRXh0ZXJuYWxGbGFnKSA6IChmbGFncyAmIH5FeHRlcm5hbEZsYWcpOwogIH0KCiAgLy8vIElmIHRydWUsIHRoZSBsaWJyYXJ5IGlzIHN5bnRoZXRpYywgZm9yIGluc3RhbmNlIGxpYnJhcnkgdGhhdCBkb2Vzbid0CiAgLy8vIHJlcHJlc2VudHMgYW4gYWN0dWFsIGZpbGUgYW5kIGlzIGNyZWF0ZWQgYXMgdGhlIHJlc3VsdCBvZiBlcnJvciByZWNvdmVyeS4KICBib29sIGdldCBpc1N5bnRoZXRpYyA9PiBmbGFncyAmIFN5bnRoZXRpY0ZsYWcgIT0gMDsKICB2b2lkIHNldCBpc1N5bnRoZXRpYyhib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgU3ludGhldGljRmxhZykgOiAoZmxhZ3MgJiB+U3ludGhldGljRmxhZyk7CiAgfQoKICBTdHJpbmcgbmFtZTsKCiAgLy8vIFByb2JsZW1zIGluIHRoaXMgW0xpYnJhcnldIGVuY29kZWQgYXMganNvbiBvYmplY3RzLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgdGhpcyBmaWVsZCBjYW4gYmUgbnVsbCwgYW5kIGJ5IGNvbnZlbnRpb24gc2hvdWxkIGJlIG51bGwgaWYgdGhlCiAgLy8vIGxpc3QgaXMgZW1wdHkuCiAgTGlzdDxTdHJpbmc+IHByb2JsZW1zQXNKc29uOwoKICBAbm9jb3EKICBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zOwoKICBmaW5hbCBMaXN0PExpYnJhcnlEZXBlbmRlbmN5PiBkZXBlbmRlbmNpZXM7CgogIC8vLyBSZWZlcmVuY2VzIHRvIG5vZGVzIGV4cG9ydGVkIGJ5IGBleHBvcnRgIGRlY2xhcmF0aW9ucyB0aGF0OgogIC8vLyAtIGFyZW4ndCBhbWJpZ3VvdXMsIG9yCiAgLy8vIC0gYXJlbid0IGhpZGRlbiBieSBsb2NhbCBkZWNsYXJhdGlvbnMuCiAgQG5vY29xCiAgZmluYWwgTGlzdDxSZWZlcmVuY2U+IGFkZGl0aW9uYWxFeHBvcnRzID0gPFJlZmVyZW5jZT5bXTsKCiAgQGluZm9ybWF0aXZlCiAgZmluYWwgTGlzdDxMaWJyYXJ5UGFydD4gcGFydHM7CgogIGZpbmFsIExpc3Q8VHlwZWRlZj4gdHlwZWRlZnM7CiAgZmluYWwgTGlzdDxDbGFzcz4gY2xhc3NlczsKICBmaW5hbCBMaXN0PFByb2NlZHVyZT4gcHJvY2VkdXJlczsKICBmaW5hbCBMaXN0PEZpZWxkPiBmaWVsZHM7CgogIExpYnJhcnkodGhpcy5pbXBvcnRVcmksCiAgICAgIHt0aGlzLm5hbWUsCiAgICAgIGJvb2wgaXNFeHRlcm5hbDogZmFsc2UsCiAgICAgIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMsCiAgICAgIExpc3Q8TGlicmFyeURlcGVuZGVuY3k+IGRlcGVuZGVuY2llcywKICAgICAgTGlzdDxMaWJyYXJ5UGFydD4gcGFydHMsCiAgICAgIExpc3Q8VHlwZWRlZj4gdHlwZWRlZnMsCiAgICAgIExpc3Q8Q2xhc3M+IGNsYXNzZXMsCiAgICAgIExpc3Q8UHJvY2VkdXJlPiBwcm9jZWR1cmVzLAogICAgICBMaXN0PEZpZWxkPiBmaWVsZHMsCiAgICAgIHRoaXMuZmlsZVVyaSwKICAgICAgUmVmZXJlbmNlIHJlZmVyZW5jZX0pCiAgICAgIDogdGhpcy5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zID8/IDxFeHByZXNzaW9uPltdLAogICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzID8/IDxMaWJyYXJ5RGVwZW5kZW5jeT5bXSwKICAgICAgICB0aGlzLnBhcnRzID0gcGFydHMgPz8gPExpYnJhcnlQYXJ0PltdLAogICAgICAgIHRoaXMudHlwZWRlZnMgPSB0eXBlZGVmcyA/PyA8VHlwZWRlZj5bXSwKICAgICAgICB0aGlzLmNsYXNzZXMgPSBjbGFzc2VzID8/IDxDbGFzcz5bXSwKICAgICAgICB0aGlzLnByb2NlZHVyZXMgPSBwcm9jZWR1cmVzID8/IDxQcm9jZWR1cmU+W10sCiAgICAgICAgdGhpcy5maWVsZHMgPSBmaWVsZHMgPz8gPEZpZWxkPltdLAogICAgICAgIHN1cGVyKHJlZmVyZW5jZSkgewogICAgdGhpcy5pc0V4dGVybmFsID0gaXNFeHRlcm5hbDsKICAgIHNldFBhcmVudHModGhpcy5kZXBlbmRlbmNpZXMsIHRoaXMpOwogICAgc2V0UGFyZW50cyh0aGlzLnBhcnRzLCB0aGlzKTsKICAgIHNldFBhcmVudHModGhpcy50eXBlZGVmcywgdGhpcyk7CiAgICBzZXRQYXJlbnRzKHRoaXMuY2xhc3NlcywgdGhpcyk7CiAgICBzZXRQYXJlbnRzKHRoaXMucHJvY2VkdXJlcywgdGhpcyk7CiAgICBzZXRQYXJlbnRzKHRoaXMuZmllbGRzLCB0aGlzKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSB0b3AtbGV2ZWwgZmllbGRzIGFuZCBwcm9jZWR1cmVzIGRlZmluZWQgaW4gdGhpcyBsaWJyYXJ5LgogIC8vLwogIC8vLyBUaGlzIGdldHRlciBpcyBmb3IgY29udmVuaWVuY2UsIG5vdCBlZmZpY2llbmN5LiAgQ29uc2lkZXIgbWFudWFsbHkKICAvLy8gaXRlcmF0aW5nIHRoZSBtZW1iZXJzIHRvIHNwZWVkIHVwIGNvZGUgaW4gcHJvZHVjdGlvbi4KICBJdGVyYWJsZTxNZW1iZXI+IGdldCBtZW1iZXJzID0+CiAgICAgIDxJdGVyYWJsZTxNZW1iZXI+PltmaWVsZHMsIHByb2NlZHVyZXNdLmV4cGFuZCgoeCkgPT4geCk7CgogIHZvaWQgYWRkTWVtYmVyKE1lbWJlciBtZW1iZXIpIHsKICAgIG1lbWJlci5wYXJlbnQgPSB0aGlzOwogICAgaWYgKG1lbWJlciBpcyBQcm9jZWR1cmUpIHsKICAgICAgcHJvY2VkdXJlcy5hZGQobWVtYmVyKTsKICAgIH0gZWxzZSBpZiAobWVtYmVyIGlzIEZpZWxkKSB7CiAgICAgIGZpZWxkcy5hZGQobWVtYmVyKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKG1lbWJlcik7CiAgICB9CiAgfQoKICB2b2lkIGFkZEFubm90YXRpb24oRXhwcmVzc2lvbiBub2RlKSB7CiAgICBub2RlLnBhcmVudCA9IHRoaXM7CiAgICBhbm5vdGF0aW9ucy5hZGQobm9kZSk7CiAgfQoKICB2b2lkIGFkZENsYXNzKENsYXNzIGNsYXNzXykgewogICAgY2xhc3NfLnBhcmVudCA9IHRoaXM7CiAgICBjbGFzc2VzLmFkZChjbGFzc18pOwogIH0KCiAgdm9pZCBhZGRGaWVsZChGaWVsZCBmaWVsZCkgewogICAgZmllbGQucGFyZW50ID0gdGhpczsKICAgIGZpZWxkcy5hZGQoZmllbGQpOwogIH0KCiAgdm9pZCBhZGRQcm9jZWR1cmUoUHJvY2VkdXJlIHByb2NlZHVyZSkgewogICAgcHJvY2VkdXJlLnBhcmVudCA9IHRoaXM7CiAgICBwcm9jZWR1cmVzLmFkZChwcm9jZWR1cmUpOwogIH0KCiAgdm9pZCBhZGRUeXBlZGVmKFR5cGVkZWYgdHlwZWRlZl8pIHsKICAgIHR5cGVkZWZfLnBhcmVudCA9IHRoaXM7CiAgICB0eXBlZGVmcy5hZGQodHlwZWRlZl8pOwogIH0KCiAgdm9pZCBjb21wdXRlQ2Fub25pY2FsTmFtZXMoKSB7CiAgICBhc3NlcnQoY2Fub25pY2FsTmFtZSAhPSBudWxsKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZWRlZnMubGVuZ3RoOyArK2kpIHsKICAgICAgVHlwZWRlZiB0eXBlZGVmXyA9IHR5cGVkZWZzW2ldOwogICAgICBjYW5vbmljYWxOYW1lLmdldENoaWxkRnJvbVR5cGVkZWYodHlwZWRlZl8pLmJpbmRUbyh0eXBlZGVmXy5yZWZlcmVuY2UpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyArK2kpIHsKICAgICAgRmllbGQgZmllbGQgPSBmaWVsZHNbaV07CiAgICAgIGNhbm9uaWNhbE5hbWUuZ2V0Q2hpbGRGcm9tTWVtYmVyKGZpZWxkKS5iaW5kVG8oZmllbGQucmVmZXJlbmNlKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvY2VkdXJlcy5sZW5ndGg7ICsraSkgewogICAgICBQcm9jZWR1cmUgbWVtYmVyID0gcHJvY2VkdXJlc1tpXTsKICAgICAgY2Fub25pY2FsTmFtZS5nZXRDaGlsZEZyb21NZW1iZXIobWVtYmVyKS5iaW5kVG8obWVtYmVyLnJlZmVyZW5jZSk7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyArK2kpIHsKICAgICAgQ2xhc3MgY2xhc3NfID0gY2xhc3Nlc1tpXTsKICAgICAgY2Fub25pY2FsTmFtZS5nZXRDaGlsZChjbGFzc18ubmFtZSkuYmluZFRvKGNsYXNzXy5yZWZlcmVuY2UpOwogICAgICBjbGFzc18uY29tcHV0ZUNhbm9uaWNhbE5hbWVzKCk7CiAgICB9CiAgfQoKICB2b2lkIGFkZERlcGVuZGVuY3koTGlicmFyeURlcGVuZGVuY3kgbm9kZSkgewogICAgZGVwZW5kZW5jaWVzLmFkZChub2RlLi5wYXJlbnQgPSB0aGlzKTsKICB9CgogIHZvaWQgYWRkUGFydChMaWJyYXJ5UGFydCBub2RlKSB7CiAgICBwYXJ0cy5hZGQobm9kZS4ucGFyZW50ID0gdGhpcyk7CiAgfQoKICBhY2NlcHQoVHJlZVZpc2l0b3IgdikgPT4gdi52aXNpdExpYnJhcnkodGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3QoYW5ub3RhdGlvbnMsIHYpOwogICAgdmlzaXRMaXN0KGRlcGVuZGVuY2llcywgdik7CiAgICB2aXNpdExpc3QocGFydHMsIHYpOwogICAgdmlzaXRMaXN0KHR5cGVkZWZzLCB2KTsKICAgIHZpc2l0TGlzdChjbGFzc2VzLCB2KTsKICAgIHZpc2l0TGlzdChwcm9jZWR1cmVzLCB2KTsKICAgIHZpc2l0TGlzdChmaWVsZHMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChhbm5vdGF0aW9ucywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1MaXN0KGRlcGVuZGVuY2llcywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1MaXN0KHBhcnRzLCB2LCB0aGlzKTsKICAgIHRyYW5zZm9ybUxpc3QodHlwZWRlZnMsIHYsIHRoaXMpOwogICAgdHJhbnNmb3JtTGlzdChjbGFzc2VzLCB2LCB0aGlzKTsKICAgIHRyYW5zZm9ybUxpc3QocHJvY2VkdXJlcywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1MaXN0KGZpZWxkcywgdiwgdGhpcyk7CiAgfQoKICBzdGF0aWMgaW50IF9saWJyYXJ5SWRDb3VudGVyID0gMDsKICBpbnQgX2xpYnJhcnlJZCA9ICsrX2xpYnJhcnlJZENvdW50ZXI7CgogIGludCBjb21wYXJlVG8oTGlicmFyeSBvdGhlcikgPT4gX2xpYnJhcnlJZCAtIG90aGVyLl9saWJyYXJ5SWQ7CgogIC8vLyBSZXR1cm5zIGEgcG9zc2libHkgc3ludGhlc2l6ZWQgbmFtZSBmb3IgdGhpcyBsaWJyYXJ5LCBjb25zaXN0ZW50IHdpdGgKICAvLy8gdGhlIG5hbWVzIGFjcm9zcyBhbGwgW3RvU3RyaW5nXSBjYWxscy4KICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBkZWJ1Z0xpYnJhcnlOYW1lKHRoaXMpOwoKICBMb2NhdGlvbiBfZ2V0TG9jYXRpb25JbkVuY2xvc2luZ0ZpbGUoaW50IG9mZnNldCkgewogICAgcmV0dXJuIF9nZXRMb2NhdGlvbkluQ29tcG9uZW50KGVuY2xvc2luZ0NvbXBvbmVudCwgZmlsZVVyaSwgb2Zmc2V0KTsKICB9Cn0KCi8vLyBBbiBpbXBvcnQgb3IgZXhwb3J0IGRlY2xhcmF0aW9uIGluIGEgbGlicmFyeS4KLy8vCi8vLyBJdCBjYW4gcmVwcmVzZW50IGFueSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zLAovLy8KLy8vICAgICBpbXBvcnQgPHVybD47Ci8vLyAgICAgaW1wb3J0IDx1cmw+IGFzIDxuYW1lPjsKLy8vICAgICBpbXBvcnQgPHVybD4gZGVmZXJyZWQgYXMgPG5hbWU+OwovLy8gICAgIGV4cG9ydCA8dXJsPjsKLy8vCi8vLyBvcHRpb25hbGx5IHdpdGggbWV0YWRhdGEgYW5kIFtDb21iaW5hdG9yc10uCmNsYXNzIExpYnJhcnlEZXBlbmRlbmN5IGV4dGVuZHMgVHJlZU5vZGUgewogIGludCBmbGFnczsKCiAgZmluYWwgTGlzdDxFeHByZXNzaW9uPiBhbm5vdGF0aW9uczsKCiAgUmVmZXJlbmNlIGltcG9ydGVkTGlicmFyeVJlZmVyZW5jZTsKCiAgLy8vIFRoZSBuYW1lIG9mIHRoZSBpbXBvcnQgcHJlZml4LCBpZiBhbnksIG9yIGBudWxsYCBpZiB0aGlzIGlzIG5vdCBhbiBpbXBvcnQKICAvLy8gd2l0aCBhIHByZWZpeC4KICAvLy8KICAvLy8gTXVzdCBiZSBub24tbnVsbCBmb3IgZGVmZXJyZWQgaW1wb3J0cywgYW5kIG11c3QgYmUgbnVsbCBmb3IgZXhwb3J0cy4KICBTdHJpbmcgbmFtZTsKCiAgZmluYWwgTGlzdDxDb21iaW5hdG9yPiBjb21iaW5hdG9yczsKCiAgTGlicmFyeURlcGVuZGVuY3koaW50IGZsYWdzLCBMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zLAogICAgICBMaWJyYXJ5IGltcG9ydGVkTGlicmFyeSwgU3RyaW5nIG5hbWUsIExpc3Q8Q29tYmluYXRvcj4gY29tYmluYXRvcnMpCiAgICAgIDogdGhpcy5ieVJlZmVyZW5jZSgKICAgICAgICAgICAgZmxhZ3MsIGFubm90YXRpb25zLCBpbXBvcnRlZExpYnJhcnkucmVmZXJlbmNlLCBuYW1lLCBjb21iaW5hdG9ycyk7CgogIExpYnJhcnlEZXBlbmRlbmN5LmRlZmVycmVkSW1wb3J0KExpYnJhcnkgaW1wb3J0ZWRMaWJyYXJ5LCBTdHJpbmcgbmFtZSwKICAgICAge0xpc3Q8Q29tYmluYXRvcj4gY29tYmluYXRvcnMsIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnN9KQogICAgICA6IHRoaXMuYnlSZWZlcmVuY2UoRGVmZXJyZWRGbGFnLCBhbm5vdGF0aW9ucyA/PyA8RXhwcmVzc2lvbj5bXSwKICAgICAgICAgICAgaW1wb3J0ZWRMaWJyYXJ5LnJlZmVyZW5jZSwgbmFtZSwgY29tYmluYXRvcnMgPz8gPENvbWJpbmF0b3I+W10pOwoKICBMaWJyYXJ5RGVwZW5kZW5jeS5pbXBvcnQoTGlicmFyeSBpbXBvcnRlZExpYnJhcnksCiAgICAgIHtTdHJpbmcgbmFtZSwgTGlzdDxDb21iaW5hdG9yPiBjb21iaW5hdG9ycywgTGlzdDxFeHByZXNzaW9uPiBhbm5vdGF0aW9uc30pCiAgICAgIDogdGhpcy5ieVJlZmVyZW5jZSgwLCBhbm5vdGF0aW9ucyA/PyA8RXhwcmVzc2lvbj5bXSwKICAgICAgICAgICAgaW1wb3J0ZWRMaWJyYXJ5LnJlZmVyZW5jZSwgbmFtZSwgY29tYmluYXRvcnMgPz8gPENvbWJpbmF0b3I+W10pOwoKICBMaWJyYXJ5RGVwZW5kZW5jeS5leHBvcnQoTGlicmFyeSBpbXBvcnRlZExpYnJhcnksCiAgICAgIHtMaXN0PENvbWJpbmF0b3I+IGNvbWJpbmF0b3JzLCBMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zfSkKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKEV4cG9ydEZsYWcsIGFubm90YXRpb25zID8/IDxFeHByZXNzaW9uPltdLAogICAgICAgICAgICBpbXBvcnRlZExpYnJhcnkucmVmZXJlbmNlLCBudWxsLCBjb21iaW5hdG9ycyA/PyA8Q29tYmluYXRvcj5bXSk7CgogIExpYnJhcnlEZXBlbmRlbmN5LmJ5UmVmZXJlbmNlKHRoaXMuZmxhZ3MsIHRoaXMuYW5ub3RhdGlvbnMsCiAgICAgIHRoaXMuaW1wb3J0ZWRMaWJyYXJ5UmVmZXJlbmNlLCB0aGlzLm5hbWUsIHRoaXMuY29tYmluYXRvcnMpIHsKICAgIHNldFBhcmVudHMoYW5ub3RhdGlvbnMsIHRoaXMpOwogICAgc2V0UGFyZW50cyhjb21iaW5hdG9ycywgdGhpcyk7CiAgfQoKICBMaWJyYXJ5IGdldCBlbmNsb3NpbmdMaWJyYXJ5ID0+IHBhcmVudDsKICBMaWJyYXJ5IGdldCB0YXJnZXRMaWJyYXJ5ID0+IGltcG9ydGVkTGlicmFyeVJlZmVyZW5jZS5hc0xpYnJhcnk7CgogIHN0YXRpYyBjb25zdCBpbnQgRXhwb3J0RmxhZyA9IDEgPDwgMDsKICBzdGF0aWMgY29uc3QgaW50IERlZmVycmVkRmxhZyA9IDEgPDwgMTsKCiAgYm9vbCBnZXQgaXNFeHBvcnQgPT4gZmxhZ3MgJiBFeHBvcnRGbGFnICE9IDA7CiAgYm9vbCBnZXQgaXNJbXBvcnQgPT4gIWlzRXhwb3J0OwogIGJvb2wgZ2V0IGlzRGVmZXJyZWQgPT4gZmxhZ3MgJiBEZWZlcnJlZEZsYWcgIT0gMDsKCiAgdm9pZCBhZGRBbm5vdGF0aW9uKEV4cHJlc3Npb24gYW5ub3RhdGlvbikgewogICAgYW5ub3RhdGlvbnMuYWRkKGFubm90YXRpb24uLnBhcmVudCA9IHRoaXMpOwogIH0KCiAgYWNjZXB0KFRyZWVWaXNpdG9yIHYpID0+IHYudmlzaXRMaWJyYXJ5RGVwZW5kZW5jeSh0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdChhbm5vdGF0aW9ucywgdik7CiAgICB2aXNpdExpc3QoY29tYmluYXRvcnMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChhbm5vdGF0aW9ucywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1MaXN0KGNvbWJpbmF0b3JzLCB2LCB0aGlzKTsKICB9Cn0KCi8vLyBBIHBhcnQgZGVjbGFyYXRpb24gaW4gYSBsaWJyYXJ5LgovLy8KLy8vICAgICBwYXJ0IDx1cmw+OwovLy8KLy8vIG9wdGlvbmFsbHkgd2l0aCBtZXRhZGF0YS4KY2xhc3MgTGlicmFyeVBhcnQgZXh0ZW5kcyBUcmVlTm9kZSB7CiAgZmluYWwgTGlzdDxFeHByZXNzaW9uPiBhbm5vdGF0aW9uczsKICBmaW5hbCBTdHJpbmcgcGFydFVyaTsKCiAgTGlicmFyeVBhcnQodGhpcy5hbm5vdGF0aW9ucywgdGhpcy5wYXJ0VXJpKSB7CiAgICBzZXRQYXJlbnRzKGFubm90YXRpb25zLCB0aGlzKTsKICB9CgogIHZvaWQgYWRkQW5ub3RhdGlvbihFeHByZXNzaW9uIGFubm90YXRpb24pIHsKICAgIGFubm90YXRpb25zLmFkZChhbm5vdGF0aW9uLi5wYXJlbnQgPSB0aGlzKTsKICB9CgogIGFjY2VwdChUcmVlVmlzaXRvciB2KSA9PiB2LnZpc2l0TGlicmFyeVBhcnQodGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3QoYW5ub3RhdGlvbnMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChhbm5vdGF0aW9ucywgdiwgdGhpcyk7CiAgfQp9CgovLy8gQSBgc2hvd2Agb3IgYGhpZGVgIGNsYXVzZSBmb3IgYW4gaW1wb3J0IG9yIGV4cG9ydC4KY2xhc3MgQ29tYmluYXRvciBleHRlbmRzIFRyZWVOb2RlIHsKICBib29sIGlzU2hvdzsKCiAgZmluYWwgTGlzdDxTdHJpbmc+IG5hbWVzOwoKICBMaWJyYXJ5RGVwZW5kZW5jeSBnZXQgZGVwZW5kZW5jeSA9PiBwYXJlbnQ7CgogIENvbWJpbmF0b3IodGhpcy5pc1Nob3csIHRoaXMubmFtZXMpOwogIENvbWJpbmF0b3Iuc2hvdyh0aGlzLm5hbWVzKSA6IGlzU2hvdyA9IHRydWU7CiAgQ29tYmluYXRvci5oaWRlKHRoaXMubmFtZXMpIDogaXNTaG93ID0gZmFsc2U7CgogIGJvb2wgZ2V0IGlzSGlkZSA9PiAhaXNTaG93OwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoVHJlZVZpc2l0b3IgdikgPT4gdi52aXNpdENvbWJpbmF0b3IodGhpcyk7CgogIEBvdmVycmlkZQogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQoKICBAb3ZlcnJpZGUKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7fQp9CgovLy8gRGVjbGFyYXRpb24gb2YgYSB0eXBlIGFsaWFzLgpjbGFzcyBUeXBlZGVmIGV4dGVuZHMgTmFtZWROb2RlIGltcGxlbWVudHMgRmlsZVVyaU5vZGUgewogIC8vLyBUaGUgVVJJIG9mIHRoZSBzb3VyY2UgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGlzIHR5cGVkZWYuCiAgVXJpIGZpbGVVcmk7CiAgTGlzdDxFeHByZXNzaW9uPiBhbm5vdGF0aW9ucyA9IGNvbnN0IDxFeHByZXNzaW9uPltdOwogIFN0cmluZyBuYW1lOwogIGZpbmFsIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnM7CiAgRGFydFR5cGUgdHlwZTsKCiAgLy8gVGhlIGZvbGxvd2luZyB0d28gZmllbGRzIGRlc2NyaWJlIHBhcmFtZXRlcnMgb2YgdGhlIHVuZGVybHlpbmcgZnVuY3Rpb24KICAvLyB0eXBlLiAgVGhleSBhcmUgbmVlZGVkIHRvIGtlZXAgc3VjaCBhdHRyaWJ1dGVzIGFzIG5hbWVzIGFuZCBhbm5vdGF0aW9ucy4KICBmaW5hbCBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzT2ZGdW5jdGlvblR5cGU7CiAgZmluYWwgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBwb3NpdGlvbmFsUGFyYW1ldGVyczsKICBmaW5hbCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVyczsKCiAgVHlwZWRlZih0aGlzLm5hbWUsIHRoaXMudHlwZSwKICAgICAge1JlZmVyZW5jZSByZWZlcmVuY2UsCiAgICAgIHRoaXMuZmlsZVVyaSwKICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycywKICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyc09mRnVuY3Rpb25UeXBlLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVyc30pCiAgICAgIDogdGhpcy50eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzID8/IDxUeXBlUGFyYW1ldGVyPltdLAogICAgICAgIHRoaXMudHlwZVBhcmFtZXRlcnNPZkZ1bmN0aW9uVHlwZSA9CiAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzT2ZGdW5jdGlvblR5cGUgPz8gPFR5cGVQYXJhbWV0ZXI+W10sCiAgICAgICAgdGhpcy5wb3NpdGlvbmFsUGFyYW1ldGVycyA9CiAgICAgICAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzID8/IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdLAogICAgICAgIHRoaXMubmFtZWRQYXJhbWV0ZXJzID0gbmFtZWRQYXJhbWV0ZXJzID8/IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdLAogICAgICAgIHN1cGVyKHJlZmVyZW5jZSkgewogICAgc2V0UGFyZW50cyh0aGlzLnR5cGVQYXJhbWV0ZXJzLCB0aGlzKTsKICB9CgogIExpYnJhcnkgZ2V0IGVuY2xvc2luZ0xpYnJhcnkgPT4gcGFyZW50OwoKICBUeXBlZGVmVHlwZSBnZXQgdGhpc1R5cGUgewogICAgcmV0dXJuIG5ldyBUeXBlZGVmVHlwZSh0aGlzLCBfZ2V0QXNUeXBlQXJndW1lbnRzKHR5cGVQYXJhbWV0ZXJzKSk7CiAgfQoKICBhY2NlcHQoVHJlZVZpc2l0b3IgdikgewogICAgcmV0dXJuIHYudmlzaXRUeXBlZGVmKHRoaXMpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChhbm5vdGF0aW9ucywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1MaXN0KHR5cGVQYXJhbWV0ZXJzLCB2LCB0aGlzKTsKICAgIGlmICh0eXBlICE9IG51bGwpIHsKICAgICAgdHlwZSA9IHYudmlzaXREYXJ0VHlwZSh0eXBlKTsKICAgIH0KICB9CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3QoYW5ub3RhdGlvbnMsIHYpOwogICAgdmlzaXRMaXN0KHR5cGVQYXJhbWV0ZXJzLCB2KTsKICAgIHR5cGU/LmFjY2VwdCh2KTsKICB9CgogIHZvaWQgYWRkQW5ub3RhdGlvbihFeHByZXNzaW9uIG5vZGUpIHsKICAgIGlmIChhbm5vdGF0aW9ucy5pc0VtcHR5KSB7CiAgICAgIGFubm90YXRpb25zID0gPEV4cHJlc3Npb24+W107CiAgICB9CiAgICBhbm5vdGF0aW9ucy5hZGQobm9kZSk7CiAgICBub2RlLnBhcmVudCA9IHRoaXM7CiAgfQoKICBMb2NhdGlvbiBfZ2V0TG9jYXRpb25JbkVuY2xvc2luZ0ZpbGUoaW50IG9mZnNldCkgewogICAgcmV0dXJuIF9nZXRMb2NhdGlvbkluQ29tcG9uZW50KGVuY2xvc2luZ0NvbXBvbmVudCwgZmlsZVVyaSwgb2Zmc2V0KTsKICB9Cn0KCi8vLyBUaGUgZGVncmVlIHRvIHdoaWNoIHRoZSBjb250ZW50cyBvZiBhIGNsYXNzIGhhdmUgYmVlbiBsb2FkZWQgaW50byBtZW1vcnkuCi8vLwovLy8gRWFjaCBsZXZlbCBpbXBseSB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBwcmV2aW91cyBvbmVzLgplbnVtIENsYXNzTGV2ZWwgewogIC8vLyBUZW1wb3JhcnkgbG9hZGluZyBsZXZlbCBmb3IgaW50ZXJuYWwgdXNlIGJ5IElSIHByb2R1Y2Vycy4gIENvbnN1bWVycyBvZgogIC8vLyBrZXJuZWwgY29kZSBzaG91bGQgbm90IGV4cGVjdCB0byBzZWUgY2xhc3NlcyBhdCB0aGlzIGxldmVsLgogIFRlbXBvcmFyeSwKCiAgLy8vIFRoZSBjbGFzcyBtYXkgYmUgdXNlZCBhcyBhIHR5cGUsIGFuZCBpdCBtYXkgY29udGFpbiBtZW1iZXJzIHRoYXQgYXJlCiAgLy8vIHJlZmVyZW5jZWQgZnJvbSB0aGlzIGJ1aWxkIHVuaXQuCiAgLy8vCiAgLy8vIFRoZSB0eXBlIHBhcmFtZXRlcnMgYW5kIHRoZWlyIGJvdW5kcyBhcmUgcHJlc2VudC4KICAvLy8KICAvLy8gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYWxsIG1lbWJlcnMgYXJlIHByZXNlbnQuCiAgLy8vCiAgLy8vIEFsbCBzdXBlcnR5cGVzIG9mIHRoaXMgY2xhc3MgYXJlIGF0IFtUeXBlXSBsZXZlbCBvciBoaWdoZXIuCiAgVHlwZSwKCiAgLy8vIEFsbCBpbnN0YW5jZSBtZW1iZXJzIG9mIHRoZSBjbGFzcyBhcmUgcHJlc2VudC4KICAvLy8KICAvLy8gQWxsIHN1cGVydHlwZXMgb2YgdGhpcyBjbGFzcyBhcmUgYXQgW0hpZXJhcmNoeV0gbGV2ZWwgb3IgaGlnaGVyLgogIC8vLwogIC8vLyBUaGlzIGxldmVsIGV4aXN0cyBzbyBzdXBlcnR5cGVzIG9mIGEgZnVsbHkgbG9hZGVkIGNsYXNzIGNvbnRhaW4gYWxsIHRoZQogIC8vLyBtZW1iZXJzIG5lZWRlZCB0byBkZXRlY3Qgb3ZlcnJpZGUgY29uc3RyYWludHMuCiAgSGllcmFyY2h5LAoKICAvLy8gQWxsIGluc3RhbmNlIG1lbWJlcnMgb2YgdGhlIGNsYXNzIGhhdmUgdGhlaXIgYm9keSBsb2FkZWQsIGFuZCB0aGVpcgogIC8vLyBhbm5vdGF0aW9ucyBhcmUgcHJlc2VudC4KICAvLy8KICAvLy8gQWxsIHN1cGVydHlwZXMgb2YgdGhpcyBjbGFzcyBhcmUgYXQgW0hpZXJhcmNoeV0gbGV2ZWwgb3IgaGlnaGVyLgogIC8vLwogIC8vLyBJZiB0aGlzIGNsYXNzIGlzIGEgbWl4aW4gYXBwbGljYXRpb24sIHRoZW4gaXRzIG1peGluIGlzIGxvYWRlZCBhdCBbTWl4aW5dCiAgLy8vIGxldmVsIG9yIGhpZ2hlci4KICAvLy8KICAvLy8gVGhpcyBsZXZlbCBleGlzdHMgc28gdGhlIGNvbnRlbnRzIG9mIGEgbWl4aW4gY2FuIGJlIGNsb25lZCBpbnRvIGEKICAvLy8gbWl4aW4gYXBwbGljYXRpb24uCiAgTWl4aW4sCgogIC8vLyBBbGwgbWVtYmVycyBvZiB0aGUgY2xhc3MgYXJlIGZ1bGx5IGxvYWRlZCBhbmQgYXJlIGluIHRoZSBjb3JyZWN0IG9yZGVyLgogIC8vLwogIC8vLyBBbm5vdGF0aW9ucyBhcmUgcHJlc2VudCBvbiBjbGFzc2VzIGFuZCBtZW1iZXJzLgogIC8vLwogIC8vLyBBbGwgc3VwZXJ0eXBlcyBvZiB0aGlzIGNsYXNzIGFyZSBhdCBbSGllcmFyY2h5XSBsZXZlbCBvciBoaWdoZXIsCiAgLy8vIG5vdCBuZWNlc3NhcmlseSBhdCBbQm9keV0gbGV2ZWwuCiAgQm9keSwKfQoKLy8vIERlY2xhcmF0aW9uIG9mIGEgcmVndWxhciBjbGFzcyBvciBhIG1peGluIGFwcGxpY2F0aW9uLgovLy8KLy8vIE1peGluIGFwcGxpY2F0aW9ucyBtYXkgbm90IGNvbnRhaW4gZmllbGRzIG9yIHByb2NlZHVyZXMsIGFzIHRoZXkgaW1wbGljaXRseQovLy8gdXNlIHRob3NlIGZyb20gaXRzIG1peGVkLWluIHR5cGUuICBIb3dldmVyLCB0aGUgSVIgZG9lcyBub3QgZW5mb3JjZSB0aGlzCi8vLyBydWxlIGRpcmVjdGx5LCBhcyBkb2luZyBzbyBjYW4gb2JzdHJ1Y3QgdHJhbnNmb3JtYXRpb25zLiAgSXQgaXMgcG9zc2libGUgdG8KLy8vIHRyYW5zZm9ybSBhIG1peGluIGFwcGxpY2F0aW9uIHRvIGJlY29tZSBhIHJlZ3VsYXIgY2xhc3MsIGFuZCB2aWNlIHZlcnNhLgpAY29xCmNsYXNzIENsYXNzIGV4dGVuZHMgTmFtZWROb2RlIGltcGxlbWVudHMgRmlsZVVyaU5vZGUgewogIC8vLyBTdGFydCBvZmZzZXQgb2YgdGhlIGNsYXNzIGluIHRoZSBzb3VyY2UgZmlsZSBpdCBjb21lcyBmcm9tLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgdGhpcyBpbmNsdWRlcyBhbm5vdGF0aW9ucyBpZiBhbnkuCiAgLy8vCiAgLy8vIFZhbGlkIHZhbHVlcyBhcmUgZnJvbSAwIGFuZCB1cCwgb3IgLTEgKFtUcmVlTm9kZS5ub09mZnNldF0pIGlmIHRoZSBmaWxlCiAgLy8vIHN0YXJ0IG9mZnNldCBpcyBub3QgYXZhaWxhYmxlICh0aGlzIGlzIHRoZSBkZWZhdWx0IGlmIG5vbmUgaXMgc3BlY2lmaWNhbGx5CiAgLy8vIHNldCkuCiAgaW50IHN0YXJ0RmlsZU9mZnNldCA9IFRyZWVOb2RlLm5vT2Zmc2V0OwoKICAvLy8gRW5kIG9mZnNldCBpbiB0aGUgc291cmNlIGZpbGUgaXQgY29tZXMgZnJvbS4gVmFsaWQgdmFsdWVzIGFyZSBmcm9tIDAgYW5kCiAgLy8vIHVwLCBvciAtMSAoW1RyZWVOb2RlLm5vT2Zmc2V0XSkgaWYgdGhlIGZpbGUgZW5kIG9mZnNldCBpcyBub3QgYXZhaWxhYmxlCiAgLy8vICh0aGlzIGlzIHRoZSBkZWZhdWx0IGlmIG5vbmUgaXMgc3BlY2lmaWNhbGx5IHNldCkuCiAgaW50IGZpbGVFbmRPZmZzZXQgPSBUcmVlTm9kZS5ub09mZnNldDsKCiAgLy8vIFRoZSBkZWdyZWUgdG8gd2hpY2ggdGhlIGNvbnRlbnRzIG9mIHRoZSBjbGFzcyBoYXZlIGJlZW4gbG9hZGVkLgogIENsYXNzTGV2ZWwgbGV2ZWwgPSBDbGFzc0xldmVsLkJvZHk7CgogIC8vLyBMaXN0IG9mIG1ldGFkYXRhIGFubm90YXRpb25zIG9uIHRoZSBjbGFzcy4KICAvLy8KICAvLy8gVGhpcyBkZWZhdWx0cyB0byBhbiBpbW11dGFibGUgZW1wdHkgbGlzdC4gVXNlIFthZGRBbm5vdGF0aW9uXSB0byBhZGQKICAvLy8gYW5ub3RhdGlvbnMgaWYgbmVlZGVkLgogIEBub2NvcQogIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMgPSBjb25zdCA8RXhwcmVzc2lvbj5bXTsKCiAgLy8vIE5hbWUgb2YgdGhlIGNsYXNzLgogIC8vLwogIC8vLyBNdXN0IGJlIG5vbi1udWxsIGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGxpYnJhcnkuCiAgLy8vCiAgLy8vIFRoZSBuYW1lIG1heSBjb250YWluIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IHZhbGlkIGluIGEgRGFydCBpZGVudGlmaWVyLAogIC8vLyBpbiBwYXJ0aWN1bGFyLCB0aGUgc3ltYm9sICcmJyBpcyB1c2VkIGluIGNsYXNzIG5hbWVzIGdlbmVyYXRlZCBmb3IgbWl4aW4KICAvLy8gYXBwbGljYXRpb25zLgogIEBjb3EKICBTdHJpbmcgbmFtZTsKCiAgLy8gTXVzdCBtYXRjaCBzZXJpYWxpemVkIGJpdCBwb3NpdGlvbnMuCiAgc3RhdGljIGNvbnN0IGludCBMZXZlbE1hc2sgPSAweDM7IC8vIEJpdHMgMCBhbmQgMS4KICBzdGF0aWMgY29uc3QgaW50IEZsYWdBYnN0cmFjdCA9IDEgPDwgMjsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdFbnVtID0gMSA8PCAzOwogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0Fub255bW91c01peGluID0gMSA8PCA0OwogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0VsaW1pbmF0ZWRNaXhpbiA9IDEgPDwgNTsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdNaXhpbkRlY2xhcmF0aW9uID0gMSA8PCA2OwoKICBpbnQgZmxhZ3MgPSAwOwoKICBib29sIGdldCBpc0Fic3RyYWN0ID0+IGZsYWdzICYgRmxhZ0Fic3RyYWN0ICE9IDA7CgogIHZvaWQgc2V0IGlzQWJzdHJhY3QoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZSA/IChmbGFncyB8IEZsYWdBYnN0cmFjdCkgOiAoZmxhZ3MgJiB+RmxhZ0Fic3RyYWN0KTsKICB9CgogIC8vLyBXaGV0aGVyIHRoaXMgY2xhc3MgaXMgYW4gZW51bS4KICBib29sIGdldCBpc0VudW0gPT4gZmxhZ3MgJiBGbGFnRW51bSAhPSAwOwoKICB2b2lkIHNldCBpc0VudW0oYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZSA/IChmbGFncyB8IEZsYWdFbnVtKSA6IChmbGFncyAmIH5GbGFnRW51bSk7CiAgfQoKICAvLy8gV2hldGhlciB0aGlzIGNsYXNzIGlzIGEgc3ludGhldGljIGltcGxlbWVudGF0aW9uIGNyZWF0ZWQgZm9yIGVhY2gKICAvLy8gbWl4ZWQtaW4gY2xhc3MuIEZvciBleGFtcGxlIHRoZSBmb2xsb3dpbmcgY29kZToKICAvLy8gY2xhc3MgWiBleHRlbmRzIEEgd2l0aCBCLCBDLCBEIHt9CiAgLy8vIGNsYXNzIEEge30KICAvLy8gY2xhc3MgQiB7fQogIC8vLyBjbGFzcyBDIHt9CiAgLy8vIGNsYXNzIEQge30KICAvLy8gLi4uY3JlYXRlczoKICAvLy8gYWJzdHJhY3QgY2xhc3MgX1omQSZCIGV4dGVuZHMgQSBtaXhlZEluIEIge30KICAvLy8gYWJzdHJhY3QgY2xhc3MgX1omQSZCJkMgZXh0ZW5kcyBBJkIgbWl4ZWRJbiBDIHt9CiAgLy8vIGFic3RyYWN0IGNsYXNzIF9aJkEmQiZDJkQgZXh0ZW5kcyBBJkImQyBtaXhlZEluIEQge30KICAvLy8gY2xhc3MgWiBleHRlbmRzIF9aJkEmQiZDJkQge30KICAvLy8gQWxsIFgmWSBjbGFzc2VzIGFyZSBtYXJrZWQgYXMgc3ludGhldGljLgogIGJvb2wgZ2V0IGlzQW5vbnltb3VzTWl4aW4gPT4gZmxhZ3MgJiBGbGFnQW5vbnltb3VzTWl4aW4gIT0gMDsKCiAgdm9pZCBzZXQgaXNBbm9ueW1vdXNNaXhpbihib29sIHZhbHVlKSB7CiAgICBmbGFncyA9CiAgICAgICAgdmFsdWUgPyAoZmxhZ3MgfCBGbGFnQW5vbnltb3VzTWl4aW4pIDogKGZsYWdzICYgfkZsYWdBbm9ueW1vdXNNaXhpbik7CiAgfQoKICAvLy8gV2hldGhlciB0aGlzIGNsYXNzIHdhcyB0cmFuc2Zvcm1lZCBmcm9tIGEgbWl4aW4gYXBwbGljYXRpb24uCiAgLy8vIEluIHN1Y2ggY2FzZSwgaXRzIG1peGVkLWluIHR5cGUgd2FzIHB1bGxlZCBpbnRvIHRoZSBlbmQgb2YgaW1wbGVtZW50ZWQKICAvLy8gdHlwZXMgbGlzdC4KICBib29sIGdldCBpc0VsaW1pbmF0ZWRNaXhpbiA9PiBmbGFncyAmIEZsYWdFbGltaW5hdGVkTWl4aW4gIT0gMDsKCiAgdm9pZCBzZXQgaXNFbGltaW5hdGVkTWl4aW4oYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPQogICAgICAgIHZhbHVlID8gKGZsYWdzIHwgRmxhZ0VsaW1pbmF0ZWRNaXhpbikgOiAoZmxhZ3MgJiB+RmxhZ0VsaW1pbmF0ZWRNaXhpbik7CiAgfQoKICAvLy8gVHJ1ZSBpZiB0aGlzIGNsYXNzIHdhcyBhIG1peGluIGRlY2xhcmF0aW9uIGluIERhcnQuCiAgLy8vCiAgLy8vIE1peGlucyBhcmUgZGVjbGFyZWQgaW4gRGFydCB3aXRoIHRoZSBgbWl4aW5gIGtleXdvcmQuICBUaGV5IGFyZSBjb21waWxlZAogIC8vLyB0byBLZXJuZWwgY2xhc3Nlcy4KICBib29sIGdldCBpc01peGluRGVjbGFyYXRpb24gPT4gZmxhZ3MgJiBGbGFnTWl4aW5EZWNsYXJhdGlvbiAhPSAwOwoKICB2b2lkIHNldCBpc01peGluRGVjbGFyYXRpb24oYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZQogICAgICAgID8gKGZsYWdzIHwgRmxhZ01peGluRGVjbGFyYXRpb24pCiAgICAgICAgOiAoZmxhZ3MgJiB+RmxhZ01peGluRGVjbGFyYXRpb24pOwogIH0KCiAgTGlzdDxTdXBlcnR5cGU+IHN1cGVyY2xhc3NDb25zdHJhaW50cygpIHsKICAgIHZhciBjb25zdHJhaW50cyA9IDxTdXBlcnR5cGU+W107CgogICAgLy8gTm90IGEgbWl4aW4gZGVjbGFyYXRpb24uCiAgICBpZiAoIWlzTWl4aW5EZWNsYXJhdGlvbikgcmV0dXJuIGNvbnN0cmFpbnRzOwoKICAgIC8vIE90aGVyd2lzZSB3ZSBoYXZlIGEgbGVmdC1saW5lYXIgYmluYXJ5IHRyZWUgKHN1YnRyZWVzIGFyZSBzdXBlcnR5cGUgYW5kCiAgICAvLyBtaXhlZEluVHlwZSkgb2YgY29uc3RyYWludHMsIHdoZXJlIGFsbCB0aGUgaW50ZXJpb3Igbm9kZXMgYXJlIGFub255bW91cwogICAgLy8gbWl4aW4gYXBwbGljYXRpb25zLgogICAgU3VwZXJ0eXBlIGN1cnJlbnQgPSBzdXBlcnR5cGU7CiAgICB3aGlsZSAoY3VycmVudCAhPSBudWxsICYmIGN1cnJlbnQuY2xhc3NOb2RlLmlzQW5vbnltb3VzTWl4aW4pIHsKICAgICAgQ2xhc3MgY3VycmVudENsYXNzID0gY3VycmVudC5jbGFzc05vZGU7CiAgICAgIGFzc2VydChjdXJyZW50Q2xhc3MuaW1wbGVtZW50ZWRUeXBlcy5sZW5ndGggPT0gMik7CiAgICAgIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbVN1cGVydHlwZShjdXJyZW50KTsKICAgICAgY29uc3RyYWludHMuYWRkKAogICAgICAgICAgc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVTdXBlcnR5cGUoY3VycmVudENsYXNzLmltcGxlbWVudGVkVHlwZXNbMV0pKTsKICAgICAgY3VycmVudCA9CiAgICAgICAgICBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVN1cGVydHlwZShjdXJyZW50Q2xhc3MuaW1wbGVtZW50ZWRUeXBlc1swXSk7CiAgICB9CiAgICByZXR1cm4gY29uc3RyYWludHMuLmFkZChjdXJyZW50KTsKICB9CgogIC8vLyBUaGUgVVJJIG9mIHRoZSBzb3VyY2UgZmlsZSB0aGlzIGNsYXNzIHdhcyBsb2FkZWQgZnJvbS4KICBVcmkgZmlsZVVyaTsKCiAgZmluYWwgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyczsKCiAgLy8vIFRoZSBpbW1lZGlhdGUgc3VwZXIgdHlwZSwgb3IgYG51bGxgIGlmIHRoaXMgaXMgdGhlIHJvb3QgY2xhc3MuCiAgU3VwZXJ0eXBlIHN1cGVydHlwZTsKCiAgLy8vIFRoZSBtaXhlZC1pbiB0eXBlIGlmIHRoaXMgaXMgYSBtaXhpbiBhcHBsaWNhdGlvbiwgb3RoZXJ3aXNlIGBudWxsYC4KICBTdXBlcnR5cGUgbWl4ZWRJblR5cGU7CgogIC8vLyBUaGUgdHlwZXMgZnJvbSB0aGUgYGltcGxlbWVudHNgIGNsYXVzZS4KICBmaW5hbCBMaXN0PFN1cGVydHlwZT4gaW1wbGVtZW50ZWRUeXBlczsKCiAgLy8vIEZpZWxkcyBkZWNsYXJlZCBpbiB0aGUgY2xhc3MuCiAgLy8vCiAgLy8vIEZvciBtaXhpbiBhcHBsaWNhdGlvbnMgdGhpcyBzaG91bGQgYmUgZW1wdHkuCiAgZmluYWwgTGlzdDxGaWVsZD4gZmllbGRzOwoKICAvLy8gQ29uc3RydWN0b3JzIGRlY2xhcmVkIGluIHRoZSBjbGFzcy4KICBmaW5hbCBMaXN0PENvbnN0cnVjdG9yPiBjb25zdHJ1Y3RvcnM7CgogIC8vLyBQcm9jZWR1cmVzIGRlY2xhcmVkIGluIHRoZSBjbGFzcy4KICAvLy8KICAvLy8gRm9yIG1peGluIGFwcGxpY2F0aW9ucyB0aGlzIHNob3VsZCBvbmx5IGNvbnRhaW4gZm9yd2FyZGluZyBzdHVicy4KICBmaW5hbCBMaXN0PFByb2NlZHVyZT4gcHJvY2VkdXJlczsKCiAgLy8vIFJlZGlyZWN0aW5nIGZhY3RvcnkgY29uc3RydWN0b3JzIGRlY2xhcmVkIGluIHRoZSBjbGFzcy4KICAvLy8KICAvLy8gRm9yIG1peGluIGFwcGxpY2F0aW9ucyB0aGlzIHNob3VsZCBiZSBlbXB0eS4KICBmaW5hbCBMaXN0PFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yPiByZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnM7CgogIENsYXNzKAogICAgICB7dGhpcy5uYW1lLAogICAgICBib29sIGlzQWJzdHJhY3Q6IGZhbHNlLAogICAgICBib29sIGlzQW5vbnltb3VzTWl4aW46IGZhbHNlLAogICAgICB0aGlzLnN1cGVydHlwZSwKICAgICAgdGhpcy5taXhlZEluVHlwZSwKICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycywKICAgICAgTGlzdDxTdXBlcnR5cGU+IGltcGxlbWVudGVkVHlwZXMsCiAgICAgIExpc3Q8Q29uc3RydWN0b3I+IGNvbnN0cnVjdG9ycywKICAgICAgTGlzdDxQcm9jZWR1cmU+IHByb2NlZHVyZXMsCiAgICAgIExpc3Q8RmllbGQ+IGZpZWxkcywKICAgICAgTGlzdDxSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvcj4gcmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JzLAogICAgICB0aGlzLmZpbGVVcmksCiAgICAgIFJlZmVyZW5jZSByZWZlcmVuY2V9KQogICAgICA6IHRoaXMudHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVycyA/PyA8VHlwZVBhcmFtZXRlcj5bXSwKICAgICAgICB0aGlzLmltcGxlbWVudGVkVHlwZXMgPSBpbXBsZW1lbnRlZFR5cGVzID8/IDxTdXBlcnR5cGU+W10sCiAgICAgICAgdGhpcy5maWVsZHMgPSBmaWVsZHMgPz8gPEZpZWxkPltdLAogICAgICAgIHRoaXMuY29uc3RydWN0b3JzID0gY29uc3RydWN0b3JzID8/IDxDb25zdHJ1Y3Rvcj5bXSwKICAgICAgICB0aGlzLnByb2NlZHVyZXMgPSBwcm9jZWR1cmVzID8/IDxQcm9jZWR1cmU+W10sCiAgICAgICAgdGhpcy5yZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnMgPQogICAgICAgICAgICByZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnMgPz8gPFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yPltdLAogICAgICAgIHN1cGVyKHJlZmVyZW5jZSkgewogICAgc2V0UGFyZW50cyh0aGlzLnR5cGVQYXJhbWV0ZXJzLCB0aGlzKTsKICAgIHNldFBhcmVudHModGhpcy5jb25zdHJ1Y3RvcnMsIHRoaXMpOwogICAgc2V0UGFyZW50cyh0aGlzLnByb2NlZHVyZXMsIHRoaXMpOwogICAgc2V0UGFyZW50cyh0aGlzLmZpZWxkcywgdGhpcyk7CiAgICBzZXRQYXJlbnRzKHRoaXMucmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JzLCB0aGlzKTsKICAgIHRoaXMuaXNBYnN0cmFjdCA9IGlzQWJzdHJhY3Q7CiAgICB0aGlzLmlzQW5vbnltb3VzTWl4aW4gPSBpc0Fub255bW91c01peGluOwogIH0KCiAgdm9pZCBjb21wdXRlQ2Fub25pY2FsTmFtZXMoKSB7CiAgICBhc3NlcnQoY2Fub25pY2FsTmFtZSAhPSBudWxsKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgKytpKSB7CiAgICAgIEZpZWxkIG1lbWJlciA9IGZpZWxkc1tpXTsKICAgICAgY2Fub25pY2FsTmFtZS5nZXRDaGlsZEZyb21NZW1iZXIobWVtYmVyKS5iaW5kVG8obWVtYmVyLnJlZmVyZW5jZSk7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2NlZHVyZXMubGVuZ3RoOyArK2kpIHsKICAgICAgUHJvY2VkdXJlIG1lbWJlciA9IHByb2NlZHVyZXNbaV07CiAgICAgIGNhbm9uaWNhbE5hbWUuZ2V0Q2hpbGRGcm9tTWVtYmVyKG1lbWJlcikuYmluZFRvKG1lbWJlci5yZWZlcmVuY2UpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zdHJ1Y3RvcnMubGVuZ3RoOyArK2kpIHsKICAgICAgQ29uc3RydWN0b3IgbWVtYmVyID0gY29uc3RydWN0b3JzW2ldOwogICAgICBjYW5vbmljYWxOYW1lLmdldENoaWxkRnJvbU1lbWJlcihtZW1iZXIpLmJpbmRUbyhtZW1iZXIucmVmZXJlbmNlKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JzLmxlbmd0aDsgKytpKSB7CiAgICAgIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIG1lbWJlciA9IHJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yc1tpXTsKICAgICAgY2Fub25pY2FsTmFtZS5nZXRDaGlsZEZyb21NZW1iZXIobWVtYmVyKS5iaW5kVG8obWVtYmVyLnJlZmVyZW5jZSk7CiAgICB9CiAgfQoKICAvLy8gVGhlIGltbWVkaWF0ZSBzdXBlciBjbGFzcywgb3IgYG51bGxgIGlmIHRoaXMgaXMgdGhlIHJvb3QgY2xhc3MuCiAgQ2xhc3MgZ2V0IHN1cGVyY2xhc3MgPT4gc3VwZXJ0eXBlPy5jbGFzc05vZGU7CgogIC8vLyBUaGUgbWl4ZWQtaW4gY2xhc3MgaWYgdGhpcyBpcyBhIG1peGluIGFwcGxpY2F0aW9uLCBvdGhlcndpc2UgYG51bGxgLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgdGhpcyBtYXkgaXRzZWxmIGJlIGEgbWl4aW4gYXBwbGljYXRpb24uICBVc2UgW21peGluXSB0byBnZXQgdGhlCiAgLy8vIGNsYXNzIHRoYXQgaGFzIHRoZSBmaWVsZHMgYW5kIHByb2NlZHVyZXMuCiAgQ2xhc3MgZ2V0IG1peGVkSW5DbGFzcyA9PiBtaXhlZEluVHlwZT8uY2xhc3NOb2RlOwoKICAvLy8gVGhlIGNsYXNzIHRoYXQgZGVjbGFyZXMgdGhlIGZpZWxkIGFuZCBwcm9jZWR1cmVzIG9mIHRoaXMgY2xhc3MuCiAgQ2xhc3MgZ2V0IG1peGluID0+IG1peGVkSW5DbGFzcz8ubWl4aW4gPz8gdGhpczsKCiAgYm9vbCBnZXQgaXNNaXhpbkFwcGxpY2F0aW9uID0+IG1peGVkSW5UeXBlICE9IG51bGw7CgogIFN0cmluZyBnZXQgZGVtYW5nbGVkTmFtZSB7CiAgICBpZiAoaXNBbm9ueW1vdXNNaXhpbikgcmV0dXJuIG5hbWVBc01peGluQXBwbGljYXRpb247CiAgICBhc3NlcnQoIW5hbWUuY29udGFpbnMoJyYnKSk7CiAgICByZXR1cm4gbmFtZTsKICB9CgogIFN0cmluZyBnZXQgbmFtZUFzTWl4aW5BcHBsaWNhdGlvbiB7CiAgICBhc3NlcnQoaXNBbm9ueW1vdXNNaXhpbik7CiAgICByZXR1cm4gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICB9CgogIFN0cmluZyBnZXQgbmFtZUFzTWl4aW5BcHBsaWNhdGlvblN1YmNsYXNzIHsKICAgIGFzc2VydChpc0Fub255bW91c01peGluKTsKICAgIHJldHVybiBkZW1hbmdsZU1peGluQXBwbGljYXRpb25TdWJjbGFzc05hbWUobmFtZSk7CiAgfQoKICAvLy8gTWVtYmVycyBkZWNsYXJlZCBpbiB0aGlzIGNsYXNzLgogIC8vLwogIC8vLyBUaGlzIGdldHRlciBpcyBmb3IgY29udmVuaWVuY2UsIG5vdCBlZmZpY2llbmN5LiAgQ29uc2lkZXIgbWFudWFsbHkKICAvLy8gaXRlcmF0aW5nIHRoZSBtZW1iZXJzIHRvIHNwZWVkIHVwIGNvZGUgaW4gcHJvZHVjdGlvbi4KICBJdGVyYWJsZTxNZW1iZXI+IGdldCBtZW1iZXJzID0+IDxJdGVyYWJsZTxNZW1iZXI+PlsKICAgICAgICBmaWVsZHMsCiAgICAgICAgY29uc3RydWN0b3JzLAogICAgICAgIHByb2NlZHVyZXMsCiAgICAgICAgcmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JzCiAgICAgIF0uZXhwYW5kKCh4KSA9PiB4KTsKCiAgLy8vIFRoZSBpbW1lZGlhdGVseSBleHRlbmRlZCwgbWl4ZWQtaW4sIGFuZCBpbXBsZW1lbnRlZCB0eXBlcy4KICAvLy8KICAvLy8gVGhpcyBnZXR0ZXIgaXMgZm9yIGNvbnZlbmllbmNlLCBub3QgZWZmaWNpZW5jeS4gIENvbnNpZGVyIG1hbnVhbGx5CiAgLy8vIGl0ZXJhdGluZyB0aGUgc3VwZXIgdHlwZXMgdG8gc3BlZWQgdXAgY29kZSBpbiBwcm9kdWN0aW9uLgogIEl0ZXJhYmxlPFN1cGVydHlwZT4gZ2V0IHN1cGVycyA9PiA8SXRlcmFibGU8U3VwZXJ0eXBlPj5bCiAgICAgICAgc3VwZXJ0eXBlID09IG51bGwgPyBjb25zdCBbXSA6IFtzdXBlcnR5cGVdLAogICAgICAgIG1peGVkSW5UeXBlID09IG51bGwgPyBjb25zdCBbXSA6IFttaXhlZEluVHlwZV0sCiAgICAgICAgaW1wbGVtZW50ZWRUeXBlcwogICAgICBdLmV4cGFuZCgoeCkgPT4geCk7CgogIC8vLyBUaGUgbGlicmFyeSBjb250YWluaW5nIHRoaXMgY2xhc3MuCiAgTGlicmFyeSBnZXQgZW5jbG9zaW5nTGlicmFyeSA9PiBwYXJlbnQ7CgogIC8vLyBBZGRzIGEgbWVtYmVyIHRvIHRoaXMgY2xhc3MuCiAgLy8vCiAgLy8vIFRocm93cyBhbiBlcnJvciBpZiBhdHRlbXB0aW5nIHRvIGFkZCBhIGZpZWxkIG9yIHByb2NlZHVyZSB0byBhIG1peGluCiAgLy8vIGFwcGxpY2F0aW9uLgogIHZvaWQgYWRkTWVtYmVyKE1lbWJlciBtZW1iZXIpIHsKICAgIG1lbWJlci5wYXJlbnQgPSB0aGlzOwogICAgaWYgKG1lbWJlciBpcyBDb25zdHJ1Y3RvcikgewogICAgICBjb25zdHJ1Y3RvcnMuYWRkKG1lbWJlcik7CiAgICB9IGVsc2UgaWYgKG1lbWJlciBpcyBQcm9jZWR1cmUpIHsKICAgICAgcHJvY2VkdXJlcy5hZGQobWVtYmVyKTsKICAgIH0gZWxzZSBpZiAobWVtYmVyIGlzIEZpZWxkKSB7CiAgICAgIGZpZWxkcy5hZGQobWVtYmVyKTsKICAgIH0gZWxzZSBpZiAobWVtYmVyIGlzIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yKSB7CiAgICAgIHJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycy5hZGQobWVtYmVyKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKG1lbWJlcik7CiAgICB9CiAgfQoKICB2b2lkIGFkZEFubm90YXRpb24oRXhwcmVzc2lvbiBub2RlKSB7CiAgICBpZiAoYW5ub3RhdGlvbnMuaXNFbXB0eSkgewogICAgICBhbm5vdGF0aW9ucyA9IDxFeHByZXNzaW9uPltdOwogICAgfQogICAgYW5ub3RhdGlvbnMuYWRkKG5vZGUpOwogICAgbm9kZS5wYXJlbnQgPSB0aGlzOwogIH0KCiAgYWNjZXB0KFRyZWVWaXNpdG9yIHYpID0+IHYudmlzaXRDbGFzcyh0aGlzKTsKICBhY2NlcHRSZWZlcmVuY2UoVmlzaXRvciB2KSA9PiB2LnZpc2l0Q2xhc3NSZWZlcmVuY2UodGhpcyk7CgogIC8vLyBJZiB0cnVlLCB0aGUgY2xhc3MgaXMgcGFydCBvZiBhbiBleHRlcm5hbCBsaWJyYXJ5LCB0aGF0IGlzLCBpdCBpcyBkZWZpbmVkCiAgLy8vIGluIGFub3RoZXIgYnVpbGQgdW5pdC4gIE9ubHkgYSBzdWJzZXQgb2YgaXRzIG1lbWJlcnMgYXJlIHByZXNlbnQuCiAgLy8vCiAgLy8vIFRoZXNlIGNsYXNzZXMgc2hvdWxkIGJlIGxvYWRlZCBhdCBlaXRoZXIgW0NsYXNzTGV2ZWwuVHlwZV0gb3IKICAvLy8gW0NsYXNzTGV2ZWwuSGllcmFyY2h5XSBsZXZlbC4KICBib29sIGdldCBpc0luRXh0ZXJuYWxMaWJyYXJ5ID0+IGVuY2xvc2luZ0xpYnJhcnkuaXNFeHRlcm5hbDsKCiAgU3VwZXJ0eXBlIGdldCBhc1Jhd1N1cGVydHlwZSB7CiAgICByZXR1cm4gbmV3IFN1cGVydHlwZSh0aGlzLAogICAgICAgIG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQodHlwZVBhcmFtZXRlcnMubGVuZ3RoLCBjb25zdCBEeW5hbWljVHlwZSgpKSk7CiAgfQoKICBTdXBlcnR5cGUgZ2V0IGFzVGhpc1N1cGVydHlwZSB7CiAgICByZXR1cm4gbmV3IFN1cGVydHlwZSh0aGlzLCBfZ2V0QXNUeXBlQXJndW1lbnRzKHR5cGVQYXJhbWV0ZXJzKSk7CiAgfQoKICBAbm9jb3EKICBJbnRlcmZhY2VUeXBlIF9yYXdUeXBlOwogIEludGVyZmFjZVR5cGUgZ2V0IHJhd1R5cGUgPT4gX3Jhd1R5cGUgPz89IG5ldyBJbnRlcmZhY2VUeXBlKHRoaXMpOwoKICBAbm9jb3EKICBJbnRlcmZhY2VUeXBlIF90aGlzVHlwZTsKICBJbnRlcmZhY2VUeXBlIGdldCB0aGlzVHlwZSB7CiAgICByZXR1cm4gX3RoaXNUeXBlID8/PQogICAgICAgIG5ldyBJbnRlcmZhY2VUeXBlKHRoaXMsIF9nZXRBc1R5cGVBcmd1bWVudHModHlwZVBhcmFtZXRlcnMpKTsKICB9CgogIEBub2NvcQogIEludGVyZmFjZVR5cGUgX2JvdHRvbVR5cGU7CiAgSW50ZXJmYWNlVHlwZSBnZXQgYm90dG9tVHlwZSB7CiAgICByZXR1cm4gX2JvdHRvbVR5cGUgPz89IG5ldyBJbnRlcmZhY2VUeXBlKHRoaXMsCiAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCh0eXBlUGFyYW1ldGVycy5sZW5ndGgsIGNvbnN0IEJvdHRvbVR5cGUoKSkpOwogIH0KCiAgLy8vIFJldHVybnMgYSBwb3NzaWJseSBzeW50aGVzaXplZCBuYW1lIGZvciB0aGlzIGNsYXNzLCBjb25zaXN0ZW50IHdpdGgKICAvLy8gdGhlIG5hbWVzIHVzZWQgYWNyb3NzIGFsbCBbdG9TdHJpbmddIGNhbGxzLgogIFN0cmluZyB0b1N0cmluZygpID0+IGRlYnVnUXVhbGlmaWVkQ2xhc3NOYW1lKHRoaXMpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdmlzaXRMaXN0KGFubm90YXRpb25zLCB2KTsKICAgIHZpc2l0TGlzdCh0eXBlUGFyYW1ldGVycywgdik7CiAgICBzdXBlcnR5cGU/LmFjY2VwdCh2KTsKICAgIG1peGVkSW5UeXBlPy5hY2NlcHQodik7CiAgICB2aXNpdExpc3QoaW1wbGVtZW50ZWRUeXBlcywgdik7CiAgICB2aXNpdExpc3QoY29uc3RydWN0b3JzLCB2KTsKICAgIHZpc2l0TGlzdChwcm9jZWR1cmVzLCB2KTsKICAgIHZpc2l0TGlzdChmaWVsZHMsIHYpOwogICAgdmlzaXRMaXN0KHJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycywgdik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICB0cmFuc2Zvcm1MaXN0KGFubm90YXRpb25zLCB2LCB0aGlzKTsKICAgIHRyYW5zZm9ybUxpc3QodHlwZVBhcmFtZXRlcnMsIHYsIHRoaXMpOwogICAgaWYgKHN1cGVydHlwZSAhPSBudWxsKSB7CiAgICAgIHN1cGVydHlwZSA9IHYudmlzaXRTdXBlcnR5cGUoc3VwZXJ0eXBlKTsKICAgIH0KICAgIGlmIChtaXhlZEluVHlwZSAhPSBudWxsKSB7CiAgICAgIG1peGVkSW5UeXBlID0gdi52aXNpdFN1cGVydHlwZShtaXhlZEluVHlwZSk7CiAgICB9CiAgICB0cmFuc2Zvcm1TdXBlcnR5cGVMaXN0KGltcGxlbWVudGVkVHlwZXMsIHYpOwogICAgdHJhbnNmb3JtTGlzdChjb25zdHJ1Y3RvcnMsIHYsIHRoaXMpOwogICAgdHJhbnNmb3JtTGlzdChwcm9jZWR1cmVzLCB2LCB0aGlzKTsKICAgIHRyYW5zZm9ybUxpc3QoZmllbGRzLCB2LCB0aGlzKTsKICAgIHRyYW5zZm9ybUxpc3QocmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JzLCB2LCB0aGlzKTsKICB9CgogIExvY2F0aW9uIF9nZXRMb2NhdGlvbkluRW5jbG9zaW5nRmlsZShpbnQgb2Zmc2V0KSB7CiAgICByZXR1cm4gX2dldExvY2F0aW9uSW5Db21wb25lbnQoZW5jbG9zaW5nQ29tcG9uZW50LCBmaWxlVXJpLCBvZmZzZXQpOwogIH0KfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FTUJFUlMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpAY29xCmFic3RyYWN0IGNsYXNzIE1lbWJlciBleHRlbmRzIE5hbWVkTm9kZSBpbXBsZW1lbnRzIEZpbGVVcmlOb2RlIHsKICAvLy8gRW5kIG9mZnNldCBpbiB0aGUgc291cmNlIGZpbGUgaXQgY29tZXMgZnJvbS4KICAvLy8KICAvLy8gVmFsaWQgdmFsdWVzIGFyZSBmcm9tIDAgYW5kIHVwLCBvciAtMSAoW1RyZWVOb2RlLm5vT2Zmc2V0XSkgaWYgdGhlIGZpbGUKICAvLy8gZW5kIG9mZnNldCBpcyBub3QgYXZhaWxhYmxlICh0aGlzIGlzIHRoZSBkZWZhdWx0IGlmIG5vbmUgaXMgc3BlY2lmaWNhbGx5CiAgLy8vIHNldCkuCiAgaW50IGZpbGVFbmRPZmZzZXQgPSBUcmVlTm9kZS5ub09mZnNldDsKCiAgLy8vIExpc3Qgb2YgbWV0YWRhdGEgYW5ub3RhdGlvbnMgb24gdGhlIG1lbWJlci4KICAvLy8KICAvLy8gVGhpcyBkZWZhdWx0cyB0byBhbiBpbW11dGFibGUgZW1wdHkgbGlzdC4gVXNlIFthZGRBbm5vdGF0aW9uXSB0byBhZGQKICAvLy8gYW5ub3RhdGlvbnMgaWYgbmVlZGVkLgogIEBub2NvcQogIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMgPSBjb25zdCA8RXhwcmVzc2lvbj5bXTsKCiAgTmFtZSBuYW1lOwoKICAvLy8gVGhlIFVSSSBvZiB0aGUgc291cmNlIGZpbGUgdGhpcyBtZW1iZXIgd2FzIGxvYWRlZCBmcm9tLgogIFVyaSBmaWxlVXJpOwoKICAvLy8gRmxhZ3Mgc3VtbWFyaXppbmcgdGhlIGtpbmRzIG9mIEFTVCBub2RlcyBjb250YWluZWQgaW4gdGhpcyBtZW1iZXIsIGZvcgogIC8vLyBzcGVlZGluZyB1cCB0cmFuc2Zvcm1hdGlvbnMgdGhhdCBvbmx5IGFmZmVjdCBjZXJ0YWluIHR5cGVzIG9mIG5vZGVzLgogIC8vLwogIC8vLyBTZWUgW1RyYW5zZm9ybWVyRmxhZ10gZm9yIHRoZSBtZWFuaW5nIG9mIGVhY2ggYml0LgogIC8vLwogIC8vLyBUaGVzZSBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGFueSBwdXJwb3NlIG90aGVyIHRoYW4gc2tpcHBpbmcgY2VydGFpbgogIC8vLyBtZW1iZXJzIGlmIGl0IGNhbiBiZSBkZXRlcm1pbmVkIHRoYXQgbm8gd29yayBpcyBuZWVkZWQgaW4gdGhlcmUuCiAgLy8vCiAgLy8vIEl0IGlzIHZhbGlkIGZvciB0aGVzZSBmbGFncyB0byBiZSBmYWxzZSBwb3NpdGl2ZXMgaW4gcmFyZSBjYXNlcywgc28KICAvLy8gdHJhbnNmb3JtZXJzIG11c3QgdG9sZXJhdGUgdGhlIGNhc2Ugd2hlcmUgYSBmbGFnIGlzIHNwdXJpb3VzbHkgc2V0LgogIC8vLwogIC8vLyBUaGlzIHZhbHVlIGlzIG5vdCBzZXJpYWxpemVkOyBpdCBpcyBwb3B1bGF0ZWQgYnkgdGhlIGZyb250ZW5kIGFuZCB0aGUKICAvLy8gZGVzZXJpYWxpemVyLgogIC8vCiAgLy8gVE9ETyhhc2dlcmYpOiBJdCBtaWdodCBiZSB3b3J0aHdoaWxlIHRvIHB1dCB0aGlzIG9uIGNsYXNzZXMgYXMgd2VsbC4KICBpbnQgdHJhbnNmb3JtZXJGbGFncyA9IDA7CgogIE1lbWJlcih0aGlzLm5hbWUsIHRoaXMuZmlsZVVyaSwgUmVmZXJlbmNlIHJlZmVyZW5jZSkgOiBzdXBlcihyZWZlcmVuY2UpOwoKICBDbGFzcyBnZXQgZW5jbG9zaW5nQ2xhc3MgPT4gcGFyZW50IGlzIENsYXNzID8gcGFyZW50IDogbnVsbDsKICBMaWJyYXJ5IGdldCBlbmNsb3NpbmdMaWJyYXJ5ID0+IHBhcmVudCBpcyBDbGFzcyA/IHBhcmVudC5wYXJlbnQgOiBwYXJlbnQ7CgogIGFjY2VwdChNZW1iZXJWaXNpdG9yIHYpOwogIGFjY2VwdFJlZmVyZW5jZShNZW1iZXJSZWZlcmVuY2VWaXNpdG9yIHYpOwoKICAvLy8gSWYgdHJ1ZSwgdGhlIG1lbWJlciBpcyBwYXJ0IG9mIGFuIGV4dGVybmFsIGxpYnJhcnksIHRoYXQgaXMsIGl0IGlzIGRlZmluZWQKICAvLy8gaW4gYW5vdGhlciBidWlsZCB1bml0LiAgU3VjaCBtZW1iZXJzIGhhdmUgbm8gYm9keSBvciBpbml0aWFsaXplciBwcmVzZW50CiAgLy8vIGluIHRoZSBJUi4KICBib29sIGdldCBpc0luRXh0ZXJuYWxMaWJyYXJ5ID0+IGVuY2xvc2luZ0xpYnJhcnkuaXNFeHRlcm5hbDsKCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGFuIGFic3RyYWN0IHByb2NlZHVyZS4KICBib29sIGdldCBpc0Fic3RyYWN0ID0+IGZhbHNlOwoKICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBtZW1iZXIgaGFzIHRoZSAnY29uc3QnIG1vZGlmaWVyLgogIGJvb2wgZ2V0IGlzQ29uc3Q7CgogIC8vLyBUcnVlIGlmIHRoaXMgaXMgYSBmaWVsZCBvciBub24tc2V0dGVyIHByb2NlZHVyZS4KICAvLy8KICAvLy8gTm90ZSB0aGF0IG9wZXJhdG9ycyBhbmQgZmFjdG9yaWVzIHJldHVybiBgdHJ1ZWAsIGV2ZW4gdGhvdWdoIHRoZXJlIGFyZQogIC8vLyBub3JtYWxseSBubyBjYWxscyB0byB0aGVpciBnZXR0ZXIuCiAgYm9vbCBnZXQgaGFzR2V0dGVyOwoKICAvLy8gVHJ1ZSBpZiB0aGlzIGlzIGEgc2V0dGVyIG9yIGEgbXV0YWJsZSBmaWVsZC4KICBib29sIGdldCBoYXNTZXR0ZXI7CgogIC8vLyBUcnVlIGlmIHRoaXMgaXMgYSBub24tc3RhdGljIGZpZWxkIG9yIHByb2NlZHVyZS4KICBib29sIGdldCBpc0luc3RhbmNlTWVtYmVyOwoKICAvLy8gVHJ1ZSBpZiB0aGUgbWVtYmVyIGhhcyB0aGUgYGV4dGVybmFsYCBtb2RpZmllciwgaW1wbHlpbmcgdGhhdCB0aGUKICAvLy8gaW1wbGVtZW50YXRpb24gaXMgcHJvdmlkZWQgYnkgdGhlIGJhY2tlbmQsIGFuZCBpcyBub3QgbmVjZXNzYXJpbHkgd3JpdHRlbgogIC8vLyBpbiBEYXJ0LgogIC8vLwogIC8vLyBNZW1iZXJzIGNhbiBoYXZlIHRoaXMgbW9kaWZpZXIgaW5kZXBlbmRlbnRseSBvZiB3aGV0aGVyIHRoZSBlbmNsb3NpbmcKICAvLy8gbGlicmFyeSBpcyBleHRlcm5hbC4KICBib29sIGdldCBpc0V4dGVybmFsOwogIHZvaWQgc2V0IGlzRXh0ZXJuYWwoYm9vbCB2YWx1ZSk7CgogIC8vLyBUaGUgYm9keSBvZiB0aGUgcHJvY2VkdXJlIG9yIGNvbnN0cnVjdG9yLCBvciBgbnVsbGAgaWYgdGhpcyBpcyBhIGZpZWxkLgogIEZ1bmN0aW9uTm9kZSBnZXQgZnVuY3Rpb24gPT4gbnVsbDsKCiAgLy8vIFJldHVybnMgYSBwb3NzaWJseSBzeW50aGVzaXplZCBuYW1lIGZvciB0aGlzIG1lbWJlciwgY29uc2lzdGVudCB3aXRoCiAgLy8vIHRoZSBuYW1lcyB1c2VkIGFjcm9zcyBhbGwgW3RvU3RyaW5nXSBjYWxscy4KICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBkZWJ1Z1F1YWxpZmllZE1lbWJlck5hbWUodGhpcyk7CgogIHZvaWQgYWRkQW5ub3RhdGlvbihFeHByZXNzaW9uIG5vZGUpIHsKICAgIGlmIChhbm5vdGF0aW9ucy5pc0VtcHR5KSB7CiAgICAgIGFubm90YXRpb25zID0gPEV4cHJlc3Npb24+W107CiAgICB9CiAgICBhbm5vdGF0aW9ucy5hZGQobm9kZSk7CiAgICBub2RlLnBhcmVudCA9IHRoaXM7CiAgfQoKICBEYXJ0VHlwZSBnZXQgZ2V0dGVyVHlwZTsKICBEYXJ0VHlwZSBnZXQgc2V0dGVyVHlwZTsKCiAgYm9vbCBnZXQgY29udGFpbnNTdXBlckNhbGxzIHsKICAgIHJldHVybiB0cmFuc2Zvcm1lckZsYWdzICYgVHJhbnNmb3JtZXJGbGFnLnN1cGVyQ2FsbHMgIT0gMDsKICB9Cn0KCi8vLyBBIGZpZWxkIGRlY2xhcmF0aW9uLgovLy8KLy8vIFRoZSBpbXBsaWVkIGdldHRlciBhbmQgc2V0dGVyIGZvciB0aGUgZmllbGQgYXJlIG5vdCByZXByZXNlbnRlZCBleHBsaWNpdGx5LAovLy8gYnV0IGNhbiBiZSBtYWRlIGV4cGxpY2l0IGlmIG5lZWRlZC4KY2xhc3MgRmllbGQgZXh0ZW5kcyBNZW1iZXIgewogIERhcnRUeXBlIHR5cGU7IC8vIE5vdCBudWxsLiBEZWZhdWx0cyB0byBEeW5hbWljVHlwZS4KICBpbnQgZmxhZ3MgPSAwOwogIEV4cHJlc3Npb24gaW5pdGlhbGl6ZXI7IC8vIE1heSBiZSBudWxsLgoKICBGaWVsZChOYW1lIG5hbWUsCiAgICAgIHt0aGlzLnR5cGU6IGNvbnN0IER5bmFtaWNUeXBlKCksCiAgICAgIHRoaXMuaW5pdGlhbGl6ZXIsCiAgICAgIGJvb2wgaXNDb3ZhcmlhbnQ6IGZhbHNlLAogICAgICBib29sIGlzRmluYWw6IGZhbHNlLAogICAgICBib29sIGlzQ29uc3Q6IGZhbHNlLAogICAgICBib29sIGlzU3RhdGljOiBmYWxzZSwKICAgICAgYm9vbCBoYXNJbXBsaWNpdEdldHRlciwKICAgICAgYm9vbCBoYXNJbXBsaWNpdFNldHRlciwKICAgICAgaW50IHRyYW5zZm9ybWVyRmxhZ3M6IDAsCiAgICAgIFVyaSBmaWxlVXJpLAogICAgICBSZWZlcmVuY2UgcmVmZXJlbmNlfSkKICAgICAgOiBzdXBlcihuYW1lLCBmaWxlVXJpLCByZWZlcmVuY2UpIHsKICAgIGFzc2VydCh0eXBlICE9IG51bGwpOwogICAgaW5pdGlhbGl6ZXI/LnBhcmVudCA9IHRoaXM7CiAgICB0aGlzLmlzQ292YXJpYW50ID0gaXNDb3ZhcmlhbnQ7CiAgICB0aGlzLmlzRmluYWwgPSBpc0ZpbmFsOwogICAgdGhpcy5pc0NvbnN0ID0gaXNDb25zdDsKICAgIHRoaXMuaXNTdGF0aWMgPSBpc1N0YXRpYzsKICAgIHRoaXMuaGFzSW1wbGljaXRHZXR0ZXIgPSBoYXNJbXBsaWNpdEdldHRlciA/PyAhaXNTdGF0aWM7CiAgICB0aGlzLmhhc0ltcGxpY2l0U2V0dGVyID0gaGFzSW1wbGljaXRTZXR0ZXIgPz8gKCFpc1N0YXRpYyAmJiAhaXNGaW5hbCk7CiAgICB0aGlzLnRyYW5zZm9ybWVyRmxhZ3MgPSB0cmFuc2Zvcm1lckZsYWdzOwogIH0KCiAgc3RhdGljIGNvbnN0IGludCBGbGFnRmluYWwgPSAxIDw8IDA7IC8vIE11c3QgbWF0Y2ggc2VyaWFsaXplZCBiaXQgcG9zaXRpb25zLgogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0NvbnN0ID0gMSA8PCAxOwogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ1N0YXRpYyA9IDEgPDwgMjsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdIYXNJbXBsaWNpdEdldHRlciA9IDEgPDwgMzsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdIYXNJbXBsaWNpdFNldHRlciA9IDEgPDwgNDsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdDb3ZhcmlhbnQgPSAxIDw8IDU7CiAgc3RhdGljIGNvbnN0IGludCBGbGFnR2VuZXJpY0NvdmFyaWFudEltcGwgPSAxIDw8IDY7CgogIC8vLyBXaGV0aGVyIHRoZSBmaWVsZCBpcyBkZWNsYXJlZCB3aXRoIHRoZSBgY292YXJpYW50YCBrZXl3b3JkLgogIGJvb2wgZ2V0IGlzQ292YXJpYW50ID0+IGZsYWdzICYgRmxhZ0NvdmFyaWFudCAhPSAwOwoKICBib29sIGdldCBpc0ZpbmFsID0+IGZsYWdzICYgRmxhZ0ZpbmFsICE9IDA7CiAgYm9vbCBnZXQgaXNDb25zdCA9PiBmbGFncyAmIEZsYWdDb25zdCAhPSAwOwogIGJvb2wgZ2V0IGlzU3RhdGljID0+IGZsYWdzICYgRmxhZ1N0YXRpYyAhPSAwOwoKICAvLy8gSWYgdHJ1ZSwgYSBnZXR0ZXIgc2hvdWxkIGJlIGdlbmVyYXRlZCBmb3IgdGhpcyBmaWVsZC4KICAvLy8KICAvLy8gSWYgZmFsc2UsIHRoZXJlIG1heSBvciBtYXkgbm90IGV4aXN0IGFuIGV4cGxpY2l0IGdldHRlciBpbiB0aGUgc2FtZSBjbGFzcwogIC8vLyB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGZpZWxkLgogIC8vLwogIC8vLyBCeSBkZWZhdWx0LCBhbGwgbm9uLXN0YXRpYyBmaWVsZHMgaGF2ZSBpbXBsaWNpdCBnZXR0ZXJzLgogIGJvb2wgZ2V0IGhhc0ltcGxpY2l0R2V0dGVyID0+IGZsYWdzICYgRmxhZ0hhc0ltcGxpY2l0R2V0dGVyICE9IDA7CgogIC8vLyBJZiB0cnVlLCBhIHNldHRlciBzaG91bGQgYmUgZ2VuZXJhdGVkIGZvciB0aGlzIGZpZWxkLgogIC8vLwogIC8vLyBJZiBmYWxzZSwgdGhlcmUgbWF5IG9yIG1heSBub3QgZXhpc3QgYW4gZXhwbGljaXQgc2V0dGVyIGluIHRoZSBzYW1lIGNsYXNzCiAgLy8vIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgZmllbGQuCiAgLy8vCiAgLy8vIEZpbmFsIGZpZWxkcyBuZXZlciBoYXZlIGltcGxpY2l0IHNldHRlcnMsIGJ1dCBhIGZpZWxkIHdpdGhvdXQgYW4gaW1wbGljaXQKICAvLy8gc2V0dGVyIGlzIG5vdCBuZWNlc3NhcmlseSBmaW5hbCwgYXMgaXQgbWF5IGJlIG11dGF0ZWQgYnkgZGlyZWN0IGZpZWxkCiAgLy8vIGFjY2Vzcy4KICAvLy8KICAvLy8gQnkgZGVmYXVsdCwgYWxsIG5vbi1zdGF0aWMsIG5vbi1maW5hbCBmaWVsZHMgaGF2ZSBpbXBsaWNpdCBzZXR0ZXJzLgogIGJvb2wgZ2V0IGhhc0ltcGxpY2l0U2V0dGVyID0+IGZsYWdzICYgRmxhZ0hhc0ltcGxpY2l0U2V0dGVyICE9IDA7CgogIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW1wbGljaXQgc2V0dGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpZWxkIG5lZWRzIHRvCiAgLy8vIGNvbnRhaW4gYSBydW50aW1lIHR5cGUgY2hlY2sgdG8gZGVhbCB3aXRoIGdlbmVyaWMgY292YXJpYW5jZS4KICAvLy8KICAvLy8gV2hlbiBgdHJ1ZWAsIHJ1bnRpbWUgY2hlY2tzIG1heSBuZWVkIHRvIGJlIHBlcmZvcm1lZDsgc2VlCiAgLy8vIFtEaXNwYXRjaENhdGVnb3J5XSBmb3IgZGV0YWlscy4KICBib29sIGdldCBpc0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0+IGZsYWdzICYgRmxhZ0dlbmVyaWNDb3ZhcmlhbnRJbXBsICE9IDA7CgogIHZvaWQgc2V0IGlzQ292YXJpYW50KGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUgPyAoZmxhZ3MgfCBGbGFnQ292YXJpYW50KSA6IChmbGFncyAmIH5GbGFnQ292YXJpYW50KTsKICB9CgogIHZvaWQgc2V0IGlzRmluYWwoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZSA/IChmbGFncyB8IEZsYWdGaW5hbCkgOiAoZmxhZ3MgJiB+RmxhZ0ZpbmFsKTsKICB9CgogIHZvaWQgc2V0IGlzQ29uc3QoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZSA/IChmbGFncyB8IEZsYWdDb25zdCkgOiAoZmxhZ3MgJiB+RmxhZ0NvbnN0KTsKICB9CgogIHZvaWQgc2V0IGlzU3RhdGljKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUgPyAoZmxhZ3MgfCBGbGFnU3RhdGljKSA6IChmbGFncyAmIH5GbGFnU3RhdGljKTsKICB9CgogIHZvaWQgc2V0IGhhc0ltcGxpY2l0R2V0dGVyKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUKICAgICAgICA/IChmbGFncyB8IEZsYWdIYXNJbXBsaWNpdEdldHRlcikKICAgICAgICA6IChmbGFncyAmIH5GbGFnSGFzSW1wbGljaXRHZXR0ZXIpOwogIH0KCiAgdm9pZCBzZXQgaGFzSW1wbGljaXRTZXR0ZXIoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZQogICAgICAgID8gKGZsYWdzIHwgRmxhZ0hhc0ltcGxpY2l0U2V0dGVyKQogICAgICAgIDogKGZsYWdzICYgfkZsYWdIYXNJbXBsaWNpdFNldHRlcik7CiAgfQoKICB2b2lkIHNldCBpc0dlbmVyaWNDb3ZhcmlhbnRJbXBsKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUKICAgICAgICA/IChmbGFncyB8IEZsYWdHZW5lcmljQ292YXJpYW50SW1wbCkKICAgICAgICA6IChmbGFncyAmIH5GbGFnR2VuZXJpY0NvdmFyaWFudEltcGwpOwogIH0KCiAgLy8vIFRydWUgaWYgdGhlIGZpZWxkIGlzIG5laXRoZXIgZmluYWwgbm9yIGNvbnN0LgogIGJvb2wgZ2V0IGlzTXV0YWJsZSA9PiBmbGFncyAmIChGbGFnRmluYWwgfCBGbGFnQ29uc3QpID09IDA7CiAgYm9vbCBnZXQgaXNJbnN0YW5jZU1lbWJlciA9PiAhaXNTdGF0aWM7CiAgYm9vbCBnZXQgaGFzR2V0dGVyID0+IHRydWU7CiAgYm9vbCBnZXQgaGFzU2V0dGVyID0+IGlzTXV0YWJsZTsKCiAgYm9vbCBnZXQgaXNFeHRlcm5hbCA9PiBmYWxzZTsKICB2b2lkIHNldCBpc0V4dGVybmFsKGJvb2wgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSkgdGhyb3cgJ0ZpZWxkcyBjYW5ub3QgYmUgZXh0ZXJuYWwnOwogIH0KCiAgYWNjZXB0KE1lbWJlclZpc2l0b3IgdikgPT4gdi52aXNpdEZpZWxkKHRoaXMpOwoKICBhY2NlcHRSZWZlcmVuY2UoTWVtYmVyUmVmZXJlbmNlVmlzaXRvciB2KSA9PiB2LnZpc2l0RmllbGRSZWZlcmVuY2UodGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3QoYW5ub3RhdGlvbnMsIHYpOwogICAgdHlwZT8uYWNjZXB0KHYpOwogICAgbmFtZT8uYWNjZXB0KHYpOwogICAgaW5pdGlhbGl6ZXI/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIHR5cGUgPSB2LnZpc2l0RGFydFR5cGUodHlwZSk7CiAgICB0cmFuc2Zvcm1MaXN0KGFubm90YXRpb25zLCB2LCB0aGlzKTsKICAgIGlmIChpbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgIGluaXRpYWxpemVyID0gaW5pdGlhbGl6ZXIuYWNjZXB0KHYpOwogICAgICBpbml0aWFsaXplcj8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9CgogIERhcnRUeXBlIGdldCBnZXR0ZXJUeXBlID0+IHR5cGU7CiAgRGFydFR5cGUgZ2V0IHNldHRlclR5cGUgPT4gaXNNdXRhYmxlID8gdHlwZSA6IGNvbnN0IEJvdHRvbVR5cGUoKTsKCiAgTG9jYXRpb24gX2dldExvY2F0aW9uSW5FbmNsb3NpbmdGaWxlKGludCBvZmZzZXQpIHsKICAgIHJldHVybiBfZ2V0TG9jYXRpb25JbkNvbXBvbmVudChlbmNsb3NpbmdDb21wb25lbnQsIGZpbGVVcmksIG9mZnNldCk7CiAgfQp9CgovLy8gQSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yLCBwb3NzaWJseSByZWRpcmVjdGluZy4KLy8vCi8vLyBOb3RlIHRoYXQgZmFjdG9yeSBjb25zdHJ1Y3RvcnMgYXJlIHRyZWF0ZWQgYXMgW1Byb2NlZHVyZV1zLgovLy8KLy8vIENvbnN0cnVjdG9ycyBkbyBub3QgdGFrZSB0eXBlIHBhcmFtZXRlcnMuICBUeXBlIGFyZ3VtZW50cyBmcm9tIGEgY29uc3RydWN0b3IKLy8vIGludm9jYXRpb24gc2hvdWxkIGJlIG1hdGNoZWQgd2l0aCB0aGUgdHlwZSBwYXJhbWV0ZXJzIGRlY2xhcmVkIGluIHRoZSBjbGFzcy4KLy8vCi8vLyBGb3IgdW5uYW1lZCBjb25zdHJ1Y3RvcnMsIHRoZSBuYW1lIGlzIGFuIGVtcHR5IHN0cmluZyAoaW4gYSBbTmFtZV0pLgpjbGFzcyBDb25zdHJ1Y3RvciBleHRlbmRzIE1lbWJlciB7CiAgLy8vIFN0YXJ0IG9mZnNldCBvZiB0aGUgY29uc3RydWN0b3IgaW4gdGhlIHNvdXJjZSBmaWxlIGl0IGNvbWVzIGZyb20uCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCB0aGlzIGluY2x1ZGVzIGFubm90YXRpb25zIGlmIGFueS4KICAvLy8KICAvLy8gVmFsaWQgdmFsdWVzIGFyZSBmcm9tIDAgYW5kIHVwLCBvciAtMSAoW1RyZWVOb2RlLm5vT2Zmc2V0XSkgaWYgdGhlIGZpbGUKICAvLy8gc3RhcnQgb2Zmc2V0IGlzIG5vdCBhdmFpbGFibGUgKHRoaXMgaXMgdGhlIGRlZmF1bHQgaWYgbm9uZSBpcyBzcGVjaWZpY2FsbHkKICAvLy8gc2V0KS4KICBpbnQgc3RhcnRGaWxlT2Zmc2V0ID0gVHJlZU5vZGUubm9PZmZzZXQ7CgogIGludCBmbGFncyA9IDA7CiAgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uOwogIExpc3Q8SW5pdGlhbGl6ZXI+IGluaXRpYWxpemVyczsKCiAgQ29uc3RydWN0b3IodGhpcy5mdW5jdGlvbiwKICAgICAge05hbWUgbmFtZSwKICAgICAgYm9vbCBpc0NvbnN0OiBmYWxzZSwKICAgICAgYm9vbCBpc0V4dGVybmFsOiBmYWxzZSwKICAgICAgYm9vbCBpc1N5bnRoZXRpYzogZmFsc2UsCiAgICAgIExpc3Q8SW5pdGlhbGl6ZXI+IGluaXRpYWxpemVycywKICAgICAgaW50IHRyYW5zZm9ybWVyRmxhZ3M6IDAsCiAgICAgIFVyaSBmaWxlVXJpLAogICAgICBSZWZlcmVuY2UgcmVmZXJlbmNlfSkKICAgICAgOiB0aGlzLmluaXRpYWxpemVycyA9IGluaXRpYWxpemVycyA/PyA8SW5pdGlhbGl6ZXI+W10sCiAgICAgICAgc3VwZXIobmFtZSwgZmlsZVVyaSwgcmVmZXJlbmNlKSB7CiAgICBmdW5jdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIHNldFBhcmVudHModGhpcy5pbml0aWFsaXplcnMsIHRoaXMpOwogICAgdGhpcy5pc0NvbnN0ID0gaXNDb25zdDsKICAgIHRoaXMuaXNFeHRlcm5hbCA9IGlzRXh0ZXJuYWw7CiAgICB0aGlzLmlzU3ludGhldGljID0gaXNTeW50aGV0aWM7CiAgICB0aGlzLnRyYW5zZm9ybWVyRmxhZ3MgPSB0cmFuc2Zvcm1lckZsYWdzOwogIH0KCiAgc3RhdGljIGNvbnN0IGludCBGbGFnQ29uc3QgPSAxIDw8IDA7IC8vIE11c3QgbWF0Y2ggc2VyaWFsaXplZCBiaXQgcG9zaXRpb25zLgogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0V4dGVybmFsID0gMSA8PCAxOwogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ1N5bnRoZXRpYyA9IDEgPDwgMjsKCiAgYm9vbCBnZXQgaXNDb25zdCA9PiBmbGFncyAmIEZsYWdDb25zdCAhPSAwOwogIGJvb2wgZ2V0IGlzRXh0ZXJuYWwgPT4gZmxhZ3MgJiBGbGFnRXh0ZXJuYWwgIT0gMDsKCiAgLy8vIFRydWUgaWYgdGhpcyBpcyBhIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciBpbnNlcnRlZCBpbiBhIGNsYXNzIHRoYXQKICAvLy8gZG9lcyBub3Qgb3RoZXJ3aXNlIGRlY2xhcmUgYW55IGNvbnN0cnVjdG9ycy4KICBib29sIGdldCBpc1N5bnRoZXRpYyA9PiBmbGFncyAmIEZsYWdTeW50aGV0aWMgIT0gMDsKCiAgdm9pZCBzZXQgaXNDb25zdChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ0NvbnN0KSA6IChmbGFncyAmIH5GbGFnQ29uc3QpOwogIH0KCiAgdm9pZCBzZXQgaXNFeHRlcm5hbChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ0V4dGVybmFsKSA6IChmbGFncyAmIH5GbGFnRXh0ZXJuYWwpOwogIH0KCiAgdm9pZCBzZXQgaXNTeW50aGV0aWMoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZSA/IChmbGFncyB8IEZsYWdTeW50aGV0aWMpIDogKGZsYWdzICYgfkZsYWdTeW50aGV0aWMpOwogIH0KCiAgYm9vbCBnZXQgaXNJbnN0YW5jZU1lbWJlciA9PiBmYWxzZTsKICBib29sIGdldCBoYXNHZXR0ZXIgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaGFzU2V0dGVyID0+IGZhbHNlOwoKICBhY2NlcHQoTWVtYmVyVmlzaXRvciB2KSA9PiB2LnZpc2l0Q29uc3RydWN0b3IodGhpcyk7CgogIGFjY2VwdFJlZmVyZW5jZShNZW1iZXJSZWZlcmVuY2VWaXNpdG9yIHYpID0+CiAgICAgIHYudmlzaXRDb25zdHJ1Y3RvclJlZmVyZW5jZSh0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdChhbm5vdGF0aW9ucywgdik7CiAgICBuYW1lPy5hY2NlcHQodik7CiAgICB2aXNpdExpc3QoaW5pdGlhbGl6ZXJzLCB2KTsKICAgIGZ1bmN0aW9uPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICB0cmFuc2Zvcm1MaXN0KGFubm90YXRpb25zLCB2LCB0aGlzKTsKICAgIHRyYW5zZm9ybUxpc3QoaW5pdGlhbGl6ZXJzLCB2LCB0aGlzKTsKICAgIGlmIChmdW5jdGlvbiAhPSBudWxsKSB7CiAgICAgIGZ1bmN0aW9uID0gZnVuY3Rpb24uYWNjZXB0KHYpOwogICAgICBmdW5jdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9CgogIERhcnRUeXBlIGdldCBnZXR0ZXJUeXBlID0+IGNvbnN0IEJvdHRvbVR5cGUoKTsKICBEYXJ0VHlwZSBnZXQgc2V0dGVyVHlwZSA9PiBjb25zdCBCb3R0b21UeXBlKCk7CgogIExvY2F0aW9uIF9nZXRMb2NhdGlvbkluRW5jbG9zaW5nRmlsZShpbnQgb2Zmc2V0KSB7CiAgICByZXR1cm4gX2dldExvY2F0aW9uSW5Db21wb25lbnQoZW5jbG9zaW5nQ29tcG9uZW50LCBmaWxlVXJpLCBvZmZzZXQpOwogIH0KfQoKLy8vIFJlc2lkdWUgb2YgYSByZWRpcmVjdGluZyBmYWN0b3J5IGNvbnN0cnVjdG9yIGZvciB0aGUgbGlua2luZyBwaGFzZS4KLy8vCi8vLyBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIGBiYXJgIGlzIGEgcmVkaXJlY3RpbmcgZmFjdG9yeSBjb25zdHJ1Y3Rvci4KLy8vCi8vLyAgICAgY2xhc3MgQSB7Ci8vLyAgICAgICBBLmZvbygpOwovLy8gICAgICAgZmFjdG9yeSBBLmJhcigpID0gQS5mb287Ci8vLyAgICAgfQovLy8KLy8vIEFuIGludm9jYXRpb24gb2YgYG5ldyBBLmJhcigpYCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIGFuIGludm9jYXRpb24gb2YKLy8vIGBuZXcgQS5mb28oKWAuICBJbiBLZXJuZWwsIHRoZSBpbnZvY2F0aW9ucyBvZiBgYmFyYCBhcmUgcmVwbGFjZWQgd2l0aAovLy8gaW52b2NhdGlvbnMgb2YgYGZvb2AsIGFuZCBhZnRlciBpdCBpcyBkb25lLCB0aGUgcmVkaXJlY3RpbmcgY29uc3RydWN0b3IgY2FuCi8vLyBiZSByZW1vdmVkIGZyb20gdGhlIGNsYXNzLiAgSG93ZXZlciwgaXQgaXMgbmVlZGVkIGR1cmluZyB0aGUgbGlua2luZyBwaGFzZSwKLy8vIGJlY2F1c2Ugb3RoZXIgbW9kdWxlcyBjYW4gcmVmZXIgdG8gdGhhdCBjb25zdHJ1Y3Rvci4KLy8vCi8vLyBbUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JdcyBjb250YWluIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yCi8vLyBsaW5raW5nIGFuZCBhcmUgdHJlYXRlZCBhcyBub24tcnVubmFibGUgbWVtYmVycyBvZiBjbGFzc2VzIHRoYXQgbWVyZWx5IHNlcnZlCi8vLyBhcyBjb250YWluZXJzIGZvciB0aGF0IGluZm9ybWF0aW9uLgovLy8KLy8vIFJlZGlyZWN0aW5nIGZhY3RvcnkgY29uc3RydWN0b3JzIGNhbiBiZSB1bm5hbWVkLiAgSW4gdGhpcyBjYXNlLCB0aGUgbmFtZSBpcwovLy8gYW4gZW1wdHkgc3RyaW5nIChpbiBhIFtOYW1lXSkuCmNsYXNzIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIGV4dGVuZHMgTWVtYmVyIHsKICBpbnQgZmxhZ3MgPSAwOwoKICAvLy8gW1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yXXMgbWF5IHJlZGlyZWN0IHRvIGNvbnN0cnVjdG9ycyBvciBmYWN0b3JpZXMKICAvLy8gb2YgaW5zdGFudGlhdGVkIGdlbmVyaWMgdHlwZXMsIHRoYXQgaXMsIGdlbmVyaWMgdHlwZXMgd2l0aCBzdXBwbGllZCB0eXBlCiAgLy8vIGFyZ3VtZW50cy4gIFRoZSBzdXBwbGllZCB0eXBlIGFyZ3VtZW50cyBhcmUgc3RvcmVkIGluIHRoaXMgZmllbGQuCiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKCiAgLy8vIFJlZmVyZW5jZSB0byB0aGUgY29uc3RydWN0b3Igb3IgdGhlIGZhY3RvcnkgdGhhdCB0aGlzCiAgLy8vIFtSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvcl0gcmVkaXJlY3RzIHRvLgogIFJlZmVyZW5jZSB0YXJnZXRSZWZlcmVuY2U7CgogIC8vLyBbdHlwZVBhcmFtZXRlcnNdIGFyZSBkdXBsaWNhdGVzIG9mIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgdGhlIGVuY2xvc2luZwogIC8vLyBjbGFzcy4gIEJlY2F1c2UgW1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yXXMgYXJlbid0IGluc3RhbmNlIG1lbWJlcnMsCiAgLy8vIHJlZmVyZW5jZXMgdG8gdGhlIHR5cGUgcGFyYW1ldGVycyBvZiB0aGUgZW5jbG9zaW5nIGNsYXNzIGluIHRoZQogIC8vLyByZWRpcmVjdGlvbiB0YXJnZXQgZGVzY3JpcHRpb24gYXJlIGVuY29kZWQgd2l0aCByZWZlcmVuY2VzIHRvIHRoZSBlbGVtZW50cwogIC8vLyBvZiBbdHlwZVBhcmFtZXRlcnNdLgogIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnM7CgogIC8vLyBQb3NpdGlvbmFsIHBhcmFtZXRlcnMgb2YgW1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yXXMgc2hvdWxkIGJlCiAgLy8vIGNvbXBhdGlibGUgd2l0aCB0aGF0IG9mIHRoZSB0YXJnZXQgY29uc3RydWN0b3IuCiAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBwb3NpdGlvbmFsUGFyYW1ldGVyczsKICBpbnQgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDsKCiAgLy8vIE5hbWVkIHBhcmFtZXRlcnMgb2YgW1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yXXMgc2hvdWxkIGJlIGNvbXBhdGlibGUKICAvLy8gd2l0aCB0aGF0IG9mIHRoZSB0YXJnZXQgY29uc3RydWN0b3IuCiAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBuYW1lZFBhcmFtZXRlcnM7CgogIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yKHRoaXMudGFyZ2V0UmVmZXJlbmNlLAogICAgICB7TmFtZSBuYW1lLAogICAgICBib29sIGlzQ29uc3Q6IGZhbHNlLAogICAgICBib29sIGlzRXh0ZXJuYWw6IGZhbHNlLAogICAgICBpbnQgdHJhbnNmb3JtZXJGbGFnczogMCwKICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cywKICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycywKICAgICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBwb3NpdGlvbmFsUGFyYW1ldGVycywKICAgICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBuYW1lZFBhcmFtZXRlcnMsCiAgICAgIGludCByZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICBVcmkgZmlsZVVyaSwKICAgICAgUmVmZXJlbmNlIHJlZmVyZW5jZX0pCiAgICAgIDogdGhpcy50eXBlQXJndW1lbnRzID0gdHlwZUFyZ3VtZW50cyA/PyA8RGFydFR5cGU+W10sCiAgICAgICAgdGhpcy50eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzID8/IDxUeXBlUGFyYW1ldGVyPltdLAogICAgICAgIHRoaXMucG9zaXRpb25hbFBhcmFtZXRlcnMgPQogICAgICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVycyA/PyA8VmFyaWFibGVEZWNsYXJhdGlvbj5bXSwKICAgICAgICB0aGlzLm5hbWVkUGFyYW1ldGVycyA9IG5hbWVkUGFyYW1ldGVycyA/PyA8VmFyaWFibGVEZWNsYXJhdGlvbj5bXSwKICAgICAgICB0aGlzLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPQogICAgICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50ID8/IHBvc2l0aW9uYWxQYXJhbWV0ZXJzPy5sZW5ndGggPz8gMCwKICAgICAgICBzdXBlcihuYW1lLCBmaWxlVXJpLCByZWZlcmVuY2UpIHsKICAgIHNldFBhcmVudHModGhpcy50eXBlUGFyYW1ldGVycywgdGhpcyk7CiAgICBzZXRQYXJlbnRzKHRoaXMucG9zaXRpb25hbFBhcmFtZXRlcnMsIHRoaXMpOwogICAgc2V0UGFyZW50cyh0aGlzLm5hbWVkUGFyYW1ldGVycywgdGhpcyk7CiAgICB0aGlzLmlzQ29uc3QgPSBpc0NvbnN0OwogICAgdGhpcy5pc0V4dGVybmFsID0gaXNFeHRlcm5hbDsKICAgIHRoaXMudHJhbnNmb3JtZXJGbGFncyA9IHRyYW5zZm9ybWVyRmxhZ3M7CiAgfQoKICBzdGF0aWMgY29uc3QgaW50IEZsYWdDb25zdCA9IDEgPDwgMDsgLy8gTXVzdCBtYXRjaCBzZXJpYWxpemVkIGJpdCBwb3NpdGlvbnMuCiAgc3RhdGljIGNvbnN0IGludCBGbGFnRXh0ZXJuYWwgPSAxIDw8IDE7CgogIGJvb2wgZ2V0IGlzQ29uc3QgPT4gZmxhZ3MgJiBGbGFnQ29uc3QgIT0gMDsKICBib29sIGdldCBpc0V4dGVybmFsID0+IGZsYWdzICYgRmxhZ0V4dGVybmFsICE9IDA7CgogIHZvaWQgc2V0IGlzQ29uc3QoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZSA/IChmbGFncyB8IEZsYWdDb25zdCkgOiAoZmxhZ3MgJiB+RmxhZ0NvbnN0KTsKICB9CgogIHZvaWQgc2V0IGlzRXh0ZXJuYWwoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZSA/IChmbGFncyB8IEZsYWdFeHRlcm5hbCkgOiAoZmxhZ3MgJiB+RmxhZ0V4dGVybmFsKTsKICB9CgogIGJvb2wgZ2V0IGlzSW5zdGFuY2VNZW1iZXIgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaGFzR2V0dGVyID0+IGZhbHNlOwogIGJvb2wgZ2V0IGhhc1NldHRlciA9PiBmYWxzZTsKCiAgYm9vbCBnZXQgaXNVbnJlc29sdmVkID0+IHRhcmdldFJlZmVyZW5jZSA9PSBudWxsOwoKICBNZW1iZXIgZ2V0IHRhcmdldCA9PiB0YXJnZXRSZWZlcmVuY2U/LmFzTWVtYmVyOwoKICB2b2lkIHNldCB0YXJnZXQoTWVtYmVyIG1lbWJlcikgewogICAgYXNzZXJ0KG1lbWJlciBpcyBDb25zdHJ1Y3RvciB8fAogICAgICAgIChtZW1iZXIgaXMgUHJvY2VkdXJlICYmIG1lbWJlci5raW5kID09IFByb2NlZHVyZUtpbmQuRmFjdG9yeSkpOwogICAgdGFyZ2V0UmVmZXJlbmNlID0gZ2V0TWVtYmVyUmVmZXJlbmNlKG1lbWJlcik7CiAgfQoKICBhY2NlcHQoTWVtYmVyVmlzaXRvciB2KSA9PiB2LnZpc2l0UmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IodGhpcyk7CgogIGFjY2VwdFJlZmVyZW5jZShNZW1iZXJSZWZlcmVuY2VWaXNpdG9yIHYpID0+CiAgICAgIHYudmlzaXRSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvclJlZmVyZW5jZSh0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdChhbm5vdGF0aW9ucywgdik7CiAgICB0YXJnZXQ/LmFjY2VwdFJlZmVyZW5jZSh2KTsKICAgIHZpc2l0TGlzdCh0eXBlQXJndW1lbnRzLCB2KTsKICAgIG5hbWU/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIHRyYW5zZm9ybUxpc3QoYW5ub3RhdGlvbnMsIHYsIHRoaXMpOwogICAgdHJhbnNmb3JtVHlwZUxpc3QodHlwZUFyZ3VtZW50cywgdik7CiAgfQoKICBEYXJ0VHlwZSBnZXQgZ2V0dGVyVHlwZSA9PiBjb25zdCBCb3R0b21UeXBlKCk7CiAgRGFydFR5cGUgZ2V0IHNldHRlclR5cGUgPT4gY29uc3QgQm90dG9tVHlwZSgpOwoKICBMb2NhdGlvbiBfZ2V0TG9jYXRpb25JbkVuY2xvc2luZ0ZpbGUoaW50IG9mZnNldCkgewogICAgcmV0dXJuIF9nZXRMb2NhdGlvbkluQ29tcG9uZW50KGVuY2xvc2luZ0NvbXBvbmVudCwgZmlsZVVyaSwgb2Zmc2V0KTsKICB9Cn0KCi8vLyBBIG1ldGhvZCwgZ2V0dGVyLCBzZXR0ZXIsIGluZGV4LWdldHRlciwgaW5kZXgtc2V0dGVyLCBvcGVyYXRvciBvdmVybG9hZGVyLAovLy8gb3IgZmFjdG9yeS4KLy8vCi8vLyBQcm9jZWR1cmVzIGNhbiBoYXZlIHRoZSBzdGF0aWMsIGFic3RyYWN0LCBhbmQvb3IgZXh0ZXJuYWwgbW9kaWZpZXIsIGFsdGhvdWdoCi8vLyBvbmx5IHRoZSBzdGF0aWMgYW5kIGV4dGVybmFsIG1vZGlmaWVycyBtYXkgYmUgdXNlZCB0b2dldGhlci4KLy8vCi8vLyBGb3Igbm9uLXN0YXRpYyBwcm9jZWR1cmVzIHRoZSBuYW1lIGlzIHJlcXVpcmVkIGZvciBkeW5hbWljIGRpc3BhdGNoLgovLy8gRm9yIGV4dGVybmFsIHByb2NlZHVyZXMgdGhlIG5hbWUgaXMgcmVxdWlyZWQgZm9yIGlkZW50aWZ5aW5nIHRoZSBleHRlcm5hbAovLy8gaW1wbGVtZW50YXRpb24uCi8vLwovLy8gRm9yIG1ldGhvZHMsIGdldHRlcnMsIGFuZCBzZXR0ZXJzIHRoZSBuYW1lIGlzIGp1c3QgYXMgaXQgd2FzIGRlY2xhcmVkLgovLy8gRm9yIHNldHRlcnMgdGhpcyBkb2VzIG5vdCBpbmNsdWRlIGEgdHJhaWxpbmcgYD1gLgovLy8gRm9yIGluZGV4LWdldHRlcnMvc2V0dGVycywgdGhpcyBpcyBgW11gIGFuZCBgW109YC4KLy8vIEZvciBvcGVyYXRvcnMsIHRoaXMgaXMgdGhlIHRva2VuIGZvciB0aGUgb3BlcmF0b3IsIGUuZy4gYCtgIG9yIGA9PWAsCi8vLyBleGNlcHQgZm9yIHRoZSB1bmFyeSBtaW51cyBvcGVyYXRvciwgd2hvc2UgbmFtZSBpcyBgdW5hcnktYC4KQGNvcQpjbGFzcyBQcm9jZWR1cmUgZXh0ZW5kcyBNZW1iZXIgewogIC8vLyBTdGFydCBvZmZzZXQgb2YgdGhlIGZ1bmN0aW9uIGluIHRoZSBzb3VyY2UgZmlsZSBpdCBjb21lcyBmcm9tLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgdGhpcyBpbmNsdWRlcyBhbm5vdGF0aW9ucyBpZiBhbnkuCiAgLy8vCiAgLy8vIFZhbGlkIHZhbHVlcyBhcmUgZnJvbSAwIGFuZCB1cCwgb3IgLTEgKFtUcmVlTm9kZS5ub09mZnNldF0pIGlmIHRoZSBmaWxlCiAgLy8vIHN0YXJ0IG9mZnNldCBpcyBub3QgYXZhaWxhYmxlICh0aGlzIGlzIHRoZSBkZWZhdWx0IGlmIG5vbmUgaXMgc3BlY2lmaWNhbGx5CiAgLy8vIHNldCkuCiAgaW50IHN0YXJ0RmlsZU9mZnNldCA9IFRyZWVOb2RlLm5vT2Zmc2V0OwoKICBQcm9jZWR1cmVLaW5kIGtpbmQ7CiAgaW50IGZsYWdzID0gMDsKICAvLyBmdW5jdGlvbiBpcyBudWxsIGlmIGFuZCBvbmx5IGlmIGFic3RyYWN0LCBleHRlcm5hbC4KICBGdW5jdGlvbk5vZGUgZnVuY3Rpb247CgogIC8vIFRoZSBmdW5jdGlvbiBub2RlJ3MgYm9keSBtaWdodCBiZSBsYXppbHkgbG9hZGVkLCBtZWFuaW5nIHRoYXQgdGhpcyB2YWx1ZQogIC8vIG1pZ2h0IG5vdCBiZSBzZXQgY29ycmVjdGx5IHlldC4gTWFrZSBzdXJlIHRoZSBib2R5IGlzIGxvYWRlZCBiZWZvcmUKICAvLyByZXR1cm5pbmcgYW55dGhpbmcuCiAgaW50IGdldCB0cmFuc2Zvcm1lckZsYWdzIHsKICAgIGZ1bmN0aW9uPy5ib2R5OwogICAgcmV0dXJuIHN1cGVyLnRyYW5zZm9ybWVyRmxhZ3M7CiAgfQoKICAvLyBUaGUgZnVuY3Rpb24gbm9kZSdzIGJvZHkgbWlnaHQgYmUgbGF6aWx5IGxvYWRlZCwgbWVhbmluZyB0aGF0IHRoaXMgdmFsdWUKICAvLyBtaWdodCBnZXQgb3ZlcndyaXR0ZW4gbGF0ZXIgKHdoZW4gdGhlIGJvZHkgaXMgcmVhZCkuIFRvIGF2b2lkIHRoYXQgcmVhZCB0aGUKICAvLyBib2R5IG5vdyBhbmQgb25seSBzZXQgdGhlIHZhbHVlIGFmdGVyd2FyZHMuCiAgdm9pZCBzZXQgdHJhbnNmb3JtZXJGbGFncyhpbnQgbmV3VmFsdWUpIHsKICAgIGZ1bmN0aW9uPy5ib2R5OwogICAgc3VwZXIudHJhbnNmb3JtZXJGbGFncyA9IG5ld1ZhbHVlOwogIH0KCiAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHNldCB0aGUgdHJhbnNmb3JtZXIgZmxhZ3Mgd2l0aG91dCBsb2FkaW5nIHRoZSBib2R5LgogIC8vIFVzZWQgd2hlbiByZWFkaW5nIHRoZSBiaW5hcnkuIEZvciBvdGhlciBjYXNlcyBvbmUgc2hvdWxkIHByb2JhYmx5IHVzZQogIC8vIGB0cmFuc2Zvcm1lckZsYWdzID0gdmFsdWU7YC4KICB2b2lkIHNldFRyYW5zZm9ybWVyRmxhZ3NXaXRob3V0TGF6eUxvYWRpbmcoaW50IG5ld1ZhbHVlKSB7CiAgICBzdXBlci50cmFuc2Zvcm1lckZsYWdzID0gbmV3VmFsdWU7CiAgfQoKICBSZWZlcmVuY2UgZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldFJlZmVyZW5jZTsKICBSZWZlcmVuY2UgZm9yd2FyZGluZ1N0dWJJbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2U7CgogIFByb2NlZHVyZShOYW1lIG5hbWUsIFByb2NlZHVyZUtpbmQga2luZCwgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uLAogICAgICB7Ym9vbCBpc0Fic3RyYWN0OiBmYWxzZSwKICAgICAgYm9vbCBpc1N0YXRpYzogZmFsc2UsCiAgICAgIGJvb2wgaXNFeHRlcm5hbDogZmFsc2UsCiAgICAgIGJvb2wgaXNDb25zdDogZmFsc2UsCiAgICAgIGJvb2wgaXNGb3J3YXJkaW5nU3R1YjogZmFsc2UsCiAgICAgIGJvb2wgaXNGb3J3YXJkaW5nU2VtaVN0dWI6IGZhbHNlLAogICAgICBpbnQgdHJhbnNmb3JtZXJGbGFnczogMCwKICAgICAgVXJpIGZpbGVVcmksCiAgICAgIFJlZmVyZW5jZSByZWZlcmVuY2UsCiAgICAgIE1lbWJlciBmb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0LAogICAgICBNZW1iZXIgZm9yd2FyZGluZ1N0dWJJbnRlcmZhY2VUYXJnZXR9KQogICAgICA6IHRoaXMuYnlSZWZlcmVuY2UobmFtZSwga2luZCwgZnVuY3Rpb24sCiAgICAgICAgICAgIGlzQWJzdHJhY3Q6IGlzQWJzdHJhY3QsCiAgICAgICAgICAgIGlzU3RhdGljOiBpc1N0YXRpYywKICAgICAgICAgICAgaXNFeHRlcm5hbDogaXNFeHRlcm5hbCwKICAgICAgICAgICAgaXNDb25zdDogaXNDb25zdCwKICAgICAgICAgICAgaXNGb3J3YXJkaW5nU3R1YjogaXNGb3J3YXJkaW5nU3R1YiwKICAgICAgICAgICAgaXNGb3J3YXJkaW5nU2VtaVN0dWI6IGlzRm9yd2FyZGluZ1NlbWlTdHViLAogICAgICAgICAgICB0cmFuc2Zvcm1lckZsYWdzOiB0cmFuc2Zvcm1lckZsYWdzLAogICAgICAgICAgICBmaWxlVXJpOiBmaWxlVXJpLAogICAgICAgICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZSwKICAgICAgICAgICAgZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldFJlZmVyZW5jZToKICAgICAgICAgICAgICAgIGdldE1lbWJlclJlZmVyZW5jZShmb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0KSwKICAgICAgICAgICAgZm9yd2FyZGluZ1N0dWJJbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2U6CiAgICAgICAgICAgICAgICBnZXRNZW1iZXJSZWZlcmVuY2UoZm9yd2FyZGluZ1N0dWJJbnRlcmZhY2VUYXJnZXQpKTsKCiAgUHJvY2VkdXJlLmJ5UmVmZXJlbmNlKE5hbWUgbmFtZSwgdGhpcy5raW5kLCB0aGlzLmZ1bmN0aW9uLAogICAgICB7Ym9vbCBpc0Fic3RyYWN0OiBmYWxzZSwKICAgICAgYm9vbCBpc1N0YXRpYzogZmFsc2UsCiAgICAgIGJvb2wgaXNFeHRlcm5hbDogZmFsc2UsCiAgICAgIGJvb2wgaXNDb25zdDogZmFsc2UsCiAgICAgIGJvb2wgaXNGb3J3YXJkaW5nU3R1YjogZmFsc2UsCiAgICAgIGJvb2wgaXNGb3J3YXJkaW5nU2VtaVN0dWI6IGZhbHNlLAogICAgICBpbnQgdHJhbnNmb3JtZXJGbGFnczogMCwKICAgICAgVXJpIGZpbGVVcmksCiAgICAgIFJlZmVyZW5jZSByZWZlcmVuY2UsCiAgICAgIHRoaXMuZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldFJlZmVyZW5jZSwKICAgICAgdGhpcy5mb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldFJlZmVyZW5jZX0pCiAgICAgIDogc3VwZXIobmFtZSwgZmlsZVVyaSwgcmVmZXJlbmNlKSB7CiAgICBmdW5jdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIHRoaXMuaXNBYnN0cmFjdCA9IGlzQWJzdHJhY3Q7CiAgICB0aGlzLmlzU3RhdGljID0gaXNTdGF0aWM7CiAgICB0aGlzLmlzRXh0ZXJuYWwgPSBpc0V4dGVybmFsOwogICAgdGhpcy5pc0NvbnN0ID0gaXNDb25zdDsKICAgIHRoaXMuaXNGb3J3YXJkaW5nU3R1YiA9IGlzRm9yd2FyZGluZ1N0dWI7CiAgICB0aGlzLmlzRm9yd2FyZGluZ1NlbWlTdHViID0gaXNGb3J3YXJkaW5nU2VtaVN0dWI7CiAgICB0aGlzLnRyYW5zZm9ybWVyRmxhZ3MgPSB0cmFuc2Zvcm1lckZsYWdzOwogIH0KCiAgc3RhdGljIGNvbnN0IGludCBGbGFnU3RhdGljID0gMSA8PCAwOyAvLyBNdXN0IG1hdGNoIHNlcmlhbGl6ZWQgYml0IHBvc2l0aW9ucy4KICBzdGF0aWMgY29uc3QgaW50IEZsYWdBYnN0cmFjdCA9IDEgPDwgMTsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdFeHRlcm5hbCA9IDEgPDwgMjsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdDb25zdCA9IDEgPDwgMzsgLy8gT25seSBmb3IgZXh0ZXJuYWwgY29uc3QgZmFjdG9yaWVzLgogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0ZvcndhcmRpbmdTdHViID0gMSA8PCA0OwogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0ZvcndhcmRpbmdTZW1pU3R1YiA9IDEgPDwgNTsKICAvLyBUT0RPKDI5ODQxKTogUmVtb3ZlIHRoaXMgZmxhZyBhZnRlciB0aGUgaXNzdWUgaXMgcmVzb2x2ZWQuCiAgc3RhdGljIGNvbnN0IGludCBGbGFnUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IgPSAxIDw8IDY7CiAgc3RhdGljIGNvbnN0IGludCBGbGFnTm9TdWNoTWV0aG9kRm9yd2FyZGVyID0gMSA8PCA3OwoKICBib29sIGdldCBpc1N0YXRpYyA9PiBmbGFncyAmIEZsYWdTdGF0aWMgIT0gMDsKICBib29sIGdldCBpc0Fic3RyYWN0ID0+IGZsYWdzICYgRmxhZ0Fic3RyYWN0ICE9IDA7CiAgYm9vbCBnZXQgaXNFeHRlcm5hbCA9PiBmbGFncyAmIEZsYWdFeHRlcm5hbCAhPSAwOwoKICAvLy8gVHJ1ZSBpZiB0aGlzIGhhcyB0aGUgYGNvbnN0YCBtb2RpZmllci4gIFRoaXMgaXMgb25seSBwb3NzaWJsZSBmb3IgZXh0ZXJuYWwKICAvLy8gY29uc3RhbnQgZmFjdG9yaWVzLCBzdWNoIGFzIGBTdHJpbmcuZnJvbUVudmlyb25tZW50YC4KICBib29sIGdldCBpc0NvbnN0ID0+IGZsYWdzICYgRmxhZ0NvbnN0ICE9IDA7CgogIC8vLyBJZiBzZXQsIHRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGlzIGZ1bmN0aW9uJ3MgaW1wbGVtZW50YXRpb24gZXhpc3RzCiAgLy8vIHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgdHlwZSBjaGVja2luZyBhcmd1bWVudHMgYW5kIGZvcndhcmRpbmcgdG8KICAvLy8gW2ZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXRdLgogIC8vLwogIC8vLyBOb3RlIHRoYXQganVzdCBiZWNhdXNlIHRoaXMgYml0IGlzIHNldCBkb2Vzbid0IG1lYW4gdGhhdCB0aGUgZnVuY3Rpb24gd2FzCiAgLy8vIG5vdCBkZWNsYXJlZCBpbiB0aGUgc291cmNlOyBpdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBpcyBhIGZvcndhcmRpbmcKICAvLy8gc2VtaS1zdHViIChzZWUgaXNGb3J3YXJkaW5nU2VtaVN0dWIpLiAgVG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBmdW5jdGlvbgogIC8vLyB3YXMgcHJlc2VudCBpbiB0aGUgc291cmNlLCBjb25zdWx0IFtpc1N5bnRoZXRpY0ZvcndhcmRlcl0uCiAgYm9vbCBnZXQgaXNGb3J3YXJkaW5nU3R1YiA9PiBmbGFncyAmIEZsYWdGb3J3YXJkaW5nU3R1YiAhPSAwOwoKICAvLy8gSWYgc2V0LCB0aGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgYWx0aG91Z2ggdGhpcyBmdW5jdGlvbiBpcyBhIGZvcndhcmRpbmcKICAvLy8gc3R1YiwgaXQgd2FzIHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSBhcyBhbiBhYnN0cmFjdCBtZXRob2QuCiAgYm9vbCBnZXQgaXNGb3J3YXJkaW5nU2VtaVN0dWIgPT4gZmxhZ3MgJiBGbGFnRm9yd2FyZGluZ1NlbWlTdHViICE9IDA7CgogIC8vIEluZGljYXRlcyBpZiB0aGlzIFtQcm9jZWR1cmVdIHJlcHJlc2VudHMgYSByZWRpcmVjdGluZyBmYWN0b3J5IGNvbnN0cnVjdG9yCiAgLy8gYW5kIGRvZXNuJ3QgaGF2ZSBhIHJ1bm5hYmxlIGJvZHkuCiAgYm9vbCBnZXQgaXNSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciB7CiAgICByZXR1cm4gZmxhZ3MgJiBGbGFnUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IgIT0gMDsKICB9CgogIC8vLyBJZiBzZXQsIHRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGlzIGZ1bmN0aW9uIHdhcyBub3QgcHJlc2VudCBpbiB0aGUKICAvLy8gc291cmNlLCBhbmQgaXQgZXhpc3RzIHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgdHlwZSBjaGVja2luZyBhcmd1bWVudHMKICAvLy8gYW5kIGZvcndhcmRpbmcgdG8gW2ZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXRdLgogIGJvb2wgZ2V0IGlzU3ludGhldGljRm9yd2FyZGVyID0+IGlzRm9yd2FyZGluZ1N0dWIgJiYgIWlzRm9yd2FyZGluZ1NlbWlTdHViOwoKICBib29sIGdldCBpc05vU3VjaE1ldGhvZEZvcndhcmRlciA9PiBmbGFncyAmIEZsYWdOb1N1Y2hNZXRob2RGb3J3YXJkZXIgIT0gMDsKCiAgdm9pZCBzZXQgaXNTdGF0aWMoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZSA/IChmbGFncyB8IEZsYWdTdGF0aWMpIDogKGZsYWdzICYgfkZsYWdTdGF0aWMpOwogIH0KCiAgdm9pZCBzZXQgaXNBYnN0cmFjdChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ0Fic3RyYWN0KSA6IChmbGFncyAmIH5GbGFnQWJzdHJhY3QpOwogIH0KCiAgdm9pZCBzZXQgaXNFeHRlcm5hbChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ0V4dGVybmFsKSA6IChmbGFncyAmIH5GbGFnRXh0ZXJuYWwpOwogIH0KCiAgdm9pZCBzZXQgaXNDb25zdChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ0NvbnN0KSA6IChmbGFncyAmIH5GbGFnQ29uc3QpOwogIH0KCiAgdm9pZCBzZXQgaXNGb3J3YXJkaW5nU3R1Yihib29sIHZhbHVlKSB7CiAgICBmbGFncyA9CiAgICAgICAgdmFsdWUgPyAoZmxhZ3MgfCBGbGFnRm9yd2FyZGluZ1N0dWIpIDogKGZsYWdzICYgfkZsYWdGb3J3YXJkaW5nU3R1Yik7CiAgfQoKICB2b2lkIHNldCBpc0ZvcndhcmRpbmdTZW1pU3R1Yihib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlCiAgICAgICAgPyAoZmxhZ3MgfCBGbGFnRm9yd2FyZGluZ1NlbWlTdHViKQogICAgICAgIDogKGZsYWdzICYgfkZsYWdGb3J3YXJkaW5nU2VtaVN0dWIpOwogIH0KCiAgdm9pZCBzZXQgaXNSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvcihib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlCiAgICAgICAgPyAoZmxhZ3MgfCBGbGFnUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IpCiAgICAgICAgOiAoZmxhZ3MgJiB+RmxhZ1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yKTsKICB9CgogIHZvaWQgc2V0IGlzTm9TdWNoTWV0aG9kRm9yd2FyZGVyKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUKICAgICAgICA/IChmbGFncyB8IEZsYWdOb1N1Y2hNZXRob2RGb3J3YXJkZXIpCiAgICAgICAgOiAoZmxhZ3MgJiB+RmxhZ05vU3VjaE1ldGhvZEZvcndhcmRlcik7CiAgfQoKICBib29sIGdldCBpc0luc3RhbmNlTWVtYmVyID0+ICFpc1N0YXRpYzsKICBib29sIGdldCBpc0dldHRlciA9PiBraW5kID09IFByb2NlZHVyZUtpbmQuR2V0dGVyOwogIGJvb2wgZ2V0IGlzU2V0dGVyID0+IGtpbmQgPT0gUHJvY2VkdXJlS2luZC5TZXR0ZXI7CiAgYm9vbCBnZXQgaXNBY2Nlc3NvciA9PiBpc0dldHRlciB8fCBpc1NldHRlcjsKICBib29sIGdldCBoYXNHZXR0ZXIgPT4ga2luZCAhPSBQcm9jZWR1cmVLaW5kLlNldHRlcjsKICBib29sIGdldCBoYXNTZXR0ZXIgPT4ga2luZCA9PSBQcm9jZWR1cmVLaW5kLlNldHRlcjsKICBib29sIGdldCBpc0ZhY3RvcnkgPT4ga2luZCA9PSBQcm9jZWR1cmVLaW5kLkZhY3Rvcnk7CgogIE1lbWJlciBnZXQgZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldCA9PgogICAgICBmb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0UmVmZXJlbmNlPy5hc01lbWJlcjsKCiAgdm9pZCBzZXQgZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldChNZW1iZXIgdGFyZ2V0KSB7CiAgICBmb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0UmVmZXJlbmNlID0gZ2V0TWVtYmVyUmVmZXJlbmNlKHRhcmdldCk7CiAgfQoKICBNZW1iZXIgZ2V0IGZvcndhcmRpbmdTdHViSW50ZXJmYWNlVGFyZ2V0ID0+CiAgICAgIGZvcndhcmRpbmdTdHViSW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlPy5hc01lbWJlcjsKCiAgdm9pZCBzZXQgZm9yd2FyZGluZ1N0dWJJbnRlcmZhY2VUYXJnZXQoTWVtYmVyIHRhcmdldCkgewogICAgZm9yd2FyZGluZ1N0dWJJbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UgPSBnZXRNZW1iZXJSZWZlcmVuY2UodGFyZ2V0KTsKICB9CgogIGFjY2VwdChNZW1iZXJWaXNpdG9yIHYpID0+IHYudmlzaXRQcm9jZWR1cmUodGhpcyk7CgogIGFjY2VwdFJlZmVyZW5jZShNZW1iZXJSZWZlcmVuY2VWaXNpdG9yIHYpID0+IHYudmlzaXRQcm9jZWR1cmVSZWZlcmVuY2UodGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3QoYW5ub3RhdGlvbnMsIHYpOwogICAgbmFtZT8uYWNjZXB0KHYpOwogICAgZnVuY3Rpb24/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIHRyYW5zZm9ybUxpc3QoYW5ub3RhdGlvbnMsIHYsIHRoaXMpOwogICAgaWYgKGZ1bmN0aW9uICE9IG51bGwpIHsKICAgICAgZnVuY3Rpb24gPSBmdW5jdGlvbi5hY2NlcHQodik7CiAgICAgIGZ1bmN0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KCiAgRGFydFR5cGUgZ2V0IGdldHRlclR5cGUgewogICAgcmV0dXJuIGlzR2V0dGVyID8gZnVuY3Rpb24ucmV0dXJuVHlwZSA6IGZ1bmN0aW9uLmZ1bmN0aW9uVHlwZTsKICB9CgogIERhcnRUeXBlIGdldCBzZXR0ZXJUeXBlIHsKICAgIHJldHVybiBpc1NldHRlcgogICAgICAgID8gZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnNbMF0udHlwZQogICAgICAgIDogY29uc3QgQm90dG9tVHlwZSgpOwogIH0KCiAgTG9jYXRpb24gX2dldExvY2F0aW9uSW5FbmNsb3NpbmdGaWxlKGludCBvZmZzZXQpIHsKICAgIHJldHVybiBfZ2V0TG9jYXRpb25JbkNvbXBvbmVudChlbmNsb3NpbmdDb21wb25lbnQsIGZpbGVVcmksIG9mZnNldCk7CiAgfQp9CgplbnVtIFByb2NlZHVyZUtpbmQgewogIE1ldGhvZCwKICBHZXR0ZXIsCiAgU2V0dGVyLAogIE9wZXJhdG9yLAogIEZhY3RvcnksCn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgICAgICAgICAgICAgICAgICAgIENPTlNUUlVDVE9SIElOSVRJQUxJWkVSUwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLyBQYXJ0IG9mIGFuIGluaXRpYWxpemVyIGxpc3QgaW4gYSBjb25zdHJ1Y3Rvci4KYWJzdHJhY3QgY2xhc3MgSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmVlTm9kZSB7CiAgLy8vIFRydWUgaWYgdGhpcyBpcyBhIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciBpbml0aWFsaXplci4KICBAaW5mb3JtYXRpdmUKICBib29sIGlzU3ludGhldGljID0gZmFsc2U7CgogIGFjY2VwdChJbml0aWFsaXplclZpc2l0b3Igdik7Cn0KCi8vLyBBbiBpbml0aWFsaXplciB3aXRoIGEgY29tcGlsZS10aW1lIGVycm9yLgovLy8KLy8vIFNob3VsZCB0aHJvdyBhbiBleGNlcHRpb24gYXQgcnVudGltZS4KLy8KLy8gREVTSUdOIFRPRE86IFRoZSBmcm9udGVuZCBzaG91bGQgdXNlIHRoaXMgaW4gYSBsb3QgbW9yZSBjYXNlcyB0byBjYXRjaAovLyBpbnZhbGlkIGNhc2VzLgpjbGFzcyBJbnZhbGlkSW5pdGlhbGl6ZXIgZXh0ZW5kcyBJbml0aWFsaXplciB7CiAgYWNjZXB0KEluaXRpYWxpemVyVmlzaXRvciB2KSA9PiB2LnZpc2l0SW52YWxpZEluaXRpYWxpemVyKHRoaXMpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdikge30KICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7fQp9CgovLy8gQSBmaWVsZCBhc3NpZ25tZW50IGBmaWVsZCA9IHZhbHVlYCBvY2N1cnJpbmcgaW4gdGhlIGluaXRpYWxpemVyIGxpc3Qgb2YKLy8vIGEgY29uc3RydWN0b3IuCi8vLwovLy8gVGhpcyBub2RlIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggZGVjbGFyYXRpb24tc2l0ZSBmaWVsZCBpbml0aWFsaXplcnM7IHRob3NlCi8vLyBhcmUgW0V4cHJlc3Npb25dcyBzdG9yZWQgaW4gW0ZpZWxkLmluaXRpYWxpemVyXS4KLy8KLy8gVE9ETzogVGhlIGZyb250ZW5kIHNob3VsZCBjaGVjayB0aGF0IGFsbCBmaW5hbCBmaWVsZHMgYXJlIGluaXRpYWxpemVkCi8vICBleGFjdGx5IG9uY2UsIGFuZCB0aGF0IG5vIGZpZWxkcyBhcmUgYXNzaWduZWQgdHdpY2UgaW4gdGhlIGluaXRpYWxpemVyIGxpc3QuCmNsYXNzIEZpZWxkSW5pdGlhbGl6ZXIgZXh0ZW5kcyBJbml0aWFsaXplciB7CiAgLy8vIFJlZmVyZW5jZSB0byB0aGUgZmllbGQgYmVpbmcgaW5pdGlhbGl6ZWQuICBOb3QgbnVsbC4KICBSZWZlcmVuY2UgZmllbGRSZWZlcmVuY2U7CiAgRXhwcmVzc2lvbiB2YWx1ZTsKCiAgRmllbGRJbml0aWFsaXplcihGaWVsZCBmaWVsZCwgRXhwcmVzc2lvbiB2YWx1ZSkKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKGZpZWxkPy5yZWZlcmVuY2UsIHZhbHVlKTsKCiAgRmllbGRJbml0aWFsaXplci5ieVJlZmVyZW5jZSh0aGlzLmZpZWxkUmVmZXJlbmNlLCB0aGlzLnZhbHVlKSB7CiAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICB9CgogIEZpZWxkIGdldCBmaWVsZCA9PiBmaWVsZFJlZmVyZW5jZT8ubm9kZTsKCiAgdm9pZCBzZXQgZmllbGQoRmllbGQgZmllbGQpIHsKICAgIGZpZWxkUmVmZXJlbmNlID0gZmllbGQ/LnJlZmVyZW5jZTsKICB9CgogIGFjY2VwdChJbml0aWFsaXplclZpc2l0b3IgdikgPT4gdi52aXNpdEZpZWxkSW5pdGlhbGl6ZXIodGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBmaWVsZD8uYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgdmFsdWU/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIHZhbHVlID0gdmFsdWUuYWNjZXB0KHYpOwogICAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBBIHN1cGVyIGNhbGwgYHN1cGVyKHgseSlgIG9jY3VycmluZyBpbiB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBvZiBhCi8vLyBjb25zdHJ1Y3Rvci4KLy8vCi8vLyBUaGVyZSBhcmUgbm8gdHlwZSBhcmd1bWVudHMgb24gdGhpcyBjYWxsLgovLwovLyBUT0RPOiBUaGUgZnJvbnRlbmQgc2hvdWxkIGNoZWNrIHRoYXQgdGhlcmUgaXMgbm8gbW9yZSB0aGFuIG9uZSBzdXBlciBjYWxsLgovLwovLyBERVNJR04gVE9ETzogQ29uc2lkZXIgaWYgdGhlIGZyb250ZW5kIHNob3VsZCBpbnNlcnQgdHlwZSBhcmd1bWVudHMgZGVyaXZlZAovLyBmcm9tIHRoZSBleHRlbmRzIGNsYXVzZS4KY2xhc3MgU3VwZXJJbml0aWFsaXplciBleHRlbmRzIEluaXRpYWxpemVyIHsKICAvLy8gUmVmZXJlbmNlIHRvIHRoZSBjb25zdHJ1Y3RvciBiZWluZyBpbnZva2VkIGluIHRoZSBzdXBlciBjbGFzcy4gTm90IG51bGwuCiAgUmVmZXJlbmNlIHRhcmdldFJlZmVyZW5jZTsKICBBcmd1bWVudHMgYXJndW1lbnRzOwoKICBTdXBlckluaXRpYWxpemVyKENvbnN0cnVjdG9yIHRhcmdldCwgQXJndW1lbnRzIGFyZ3VtZW50cykKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKGdldE1lbWJlclJlZmVyZW5jZSh0YXJnZXQpLCBhcmd1bWVudHMpOwoKICBTdXBlckluaXRpYWxpemVyLmJ5UmVmZXJlbmNlKHRoaXMudGFyZ2V0UmVmZXJlbmNlLCB0aGlzLmFyZ3VtZW50cykgewogICAgYXJndW1lbnRzPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQ29uc3RydWN0b3IgZ2V0IHRhcmdldCA9PiB0YXJnZXRSZWZlcmVuY2U/LmFzQ29uc3RydWN0b3I7CgogIHZvaWQgc2V0IHRhcmdldChDb25zdHJ1Y3RvciB0YXJnZXQpIHsKICAgIHRhcmdldFJlZmVyZW5jZSA9IGdldE1lbWJlclJlZmVyZW5jZSh0YXJnZXQpOwogIH0KCiAgYWNjZXB0KEluaXRpYWxpemVyVmlzaXRvciB2KSA9PiB2LnZpc2l0U3VwZXJJbml0aWFsaXplcih0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHRhcmdldD8uYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgYXJndW1lbnRzPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgYXJndW1lbnRzID0gYXJndW1lbnRzLmFjY2VwdCh2KTsKICAgICAgYXJndW1lbnRzPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEEgcmVkaXJlY3RpbmcgY2FsbCBgdGhpcyh4LHkpYCBvY2N1cnJpbmcgaW4gdGhlIGluaXRpYWxpemVyIGxpc3Qgb2YKLy8vIGEgY29uc3RydWN0b3IuCi8vCi8vIFRPRE86IFRoZSBmcm9udGVuZCBzaG91bGQgY2hlY2sgdGhhdCB0aGlzIGlzIHRoZSBvbmx5IGluaXRpYWxpemVyIGFuZCBpZiB0aGUKLy8gY29uc3RydWN0b3IgaGFzIGEgYm9keSBvciBpZiB0aGVyZSBpcyBhIGN5Y2xlIGluIHRoZSBpbml0aWFsaXplciBjYWxscy4KY2xhc3MgUmVkaXJlY3RpbmdJbml0aWFsaXplciBleHRlbmRzIEluaXRpYWxpemVyIHsKICAvLy8gUmVmZXJlbmNlIHRvIHRoZSBjb25zdHJ1Y3RvciBiZWluZyBpbnZva2VkIGluIHRoZSBzYW1lIGNsYXNzLiBOb3QgbnVsbC4KICBSZWZlcmVuY2UgdGFyZ2V0UmVmZXJlbmNlOwogIEFyZ3VtZW50cyBhcmd1bWVudHM7CgogIFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIoQ29uc3RydWN0b3IgdGFyZ2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKQogICAgICA6IHRoaXMuYnlSZWZlcmVuY2UoZ2V0TWVtYmVyUmVmZXJlbmNlKHRhcmdldCksIGFyZ3VtZW50cyk7CgogIFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIuYnlSZWZlcmVuY2UodGhpcy50YXJnZXRSZWZlcmVuY2UsIHRoaXMuYXJndW1lbnRzKSB7CiAgICBhcmd1bWVudHM/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBDb25zdHJ1Y3RvciBnZXQgdGFyZ2V0ID0+IHRhcmdldFJlZmVyZW5jZT8uYXNDb25zdHJ1Y3RvcjsKCiAgdm9pZCBzZXQgdGFyZ2V0KENvbnN0cnVjdG9yIHRhcmdldCkgewogICAgdGFyZ2V0UmVmZXJlbmNlID0gZ2V0TWVtYmVyUmVmZXJlbmNlKHRhcmdldCk7CiAgfQoKICBhY2NlcHQoSW5pdGlhbGl6ZXJWaXNpdG9yIHYpID0+IHYudmlzaXRSZWRpcmVjdGluZ0luaXRpYWxpemVyKHRoaXMpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdGFyZ2V0Py5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICBhcmd1bWVudHM/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBhcmd1bWVudHMgPSBhcmd1bWVudHMuYWNjZXB0KHYpOwogICAgICBhcmd1bWVudHM/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gQmluZGluZyBvZiBhIHRlbXBvcmFyeSB2YXJpYWJsZSBpbiB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBvZiBhIGNvbnN0cnVjdG9yLgovLy8KLy8vIFRoZSB2YXJpYWJsZSBpcyBpbiBzY29wZSBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgaW5pdGlhbGl6ZXIgbGlzdCwgYnV0IGlzCi8vLyBub3QgaW4gc2NvcGUgaW4gdGhlIGNvbnN0cnVjdG9yIGJvZHkuCmNsYXNzIExvY2FsSW5pdGlhbGl6ZXIgZXh0ZW5kcyBJbml0aWFsaXplciB7CiAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZTsKCiAgTG9jYWxJbml0aWFsaXplcih0aGlzLnZhcmlhYmxlKSB7CiAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICB9CgogIGFjY2VwdChJbml0aWFsaXplclZpc2l0b3IgdikgPT4gdi52aXNpdExvY2FsSW5pdGlhbGl6ZXIodGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2YXJpYWJsZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHZhcmlhYmxlICE9IG51bGwpIHsKICAgICAgdmFyaWFibGUgPSB2YXJpYWJsZS5hY2NlcHQodik7CiAgICAgIHZhcmlhYmxlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKY2xhc3MgQXNzZXJ0SW5pdGlhbGl6ZXIgZXh0ZW5kcyBJbml0aWFsaXplciB7CiAgQXNzZXJ0U3RhdGVtZW50IHN0YXRlbWVudDsKCiAgQXNzZXJ0SW5pdGlhbGl6ZXIodGhpcy5zdGF0ZW1lbnQpIHsKICAgIHN0YXRlbWVudC5wYXJlbnQgPSB0aGlzOwogIH0KCiAgYWNjZXB0KEluaXRpYWxpemVyVmlzaXRvciB2KSA9PiB2LnZpc2l0QXNzZXJ0SW5pdGlhbGl6ZXIodGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBzdGF0ZW1lbnQuYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgc3RhdGVtZW50ID0gc3RhdGVtZW50LmFjY2VwdCh2KTsKICAgIHN0YXRlbWVudC5wYXJlbnQgPSB0aGlzOwogIH0KfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZVTkNUSU9OUwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLyBBIGZ1bmN0aW9uIGRlY2xhcmVzIHBhcmFtZXRlcnMgYW5kIGhhcyBhIGJvZHkuCi8vLwovLy8gVGhpcyBtYXkgb2NjdXIgaW4gYSBwcm9jZWR1cmUsIGNvbnN0cnVjdG9yLCBmdW5jdGlvbiBleHByZXNzaW9uLCBvciBsb2NhbAovLy8gZnVuY3Rpb24gZGVjbGFyYXRpb24uCkBjb3EKY2xhc3MgRnVuY3Rpb25Ob2RlIGV4dGVuZHMgVHJlZU5vZGUgewogIC8vLyBFbmQgb2Zmc2V0IGluIHRoZSBzb3VyY2UgZmlsZSBpdCBjb21lcyBmcm9tLiBWYWxpZCB2YWx1ZXMgYXJlIGZyb20gMCBhbmQKICAvLy8gdXAsIG9yIC0xIChbVHJlZU5vZGUubm9PZmZzZXRdKSBpZiB0aGUgZmlsZSBlbmQgb2Zmc2V0IGlzIG5vdCBhdmFpbGFibGUKICAvLy8gKHRoaXMgaXMgdGhlIGRlZmF1bHQgaWYgbm9uZSBpcyBzcGVjaWZpY2FsbHkgc2V0KS4KICBpbnQgZmlsZUVuZE9mZnNldCA9IFRyZWVOb2RlLm5vT2Zmc2V0OwoKICAvLy8gS2VybmVsIGFzeW5jIG1hcmtlciBmb3IgdGhlIGZ1bmN0aW9uLgogIC8vLwogIC8vLyBTZWUgYWxzbyBbZGFydEFzeW5jTWFya2VyXS4KICBBc3luY01hcmtlciBhc3luY01hcmtlcjsKCiAgLy8vIERhcnQgYXN5bmMgbWFya2VyIGZvciB0aGUgZnVuY3Rpb24uCiAgLy8vCiAgLy8vIFNlZSBhbHNvIFthc3luY01hcmtlcl0uCiAgLy8vCiAgLy8vIEEgS2VybmVsIGZ1bmN0aW9uIGNhbiByZXByZXNlbnQgYSBEYXJ0IGZ1bmN0aW9uIHdpdGggYSBkaWZmZXJlbnQgYXN5bmMKICAvLy8gbWFya2VyLgogIC8vLwogIC8vLyBGb3IgZXhhbXBsZSwgd2hlbiBhc3luYy9hd2FpdCBpcyB0cmFuc2xhdGVkIGF3YXksCiAgLy8vIGEgRGFydCBhc3luYyBmdW5jdGlvbiBtaWdodCBiZSByZXByZXNlbnRlZCBieSBhIEtlcm5lbCBzeW5jIGZ1bmN0aW9uLgogIEFzeW5jTWFya2VyIGRhcnRBc3luY01hcmtlcjsKCiAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyczsKICBpbnQgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDsKICBAY29xc2luZ2xlZGVmCiAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBwb3NpdGlvbmFsUGFyYW1ldGVyczsKICBAbm9jb3EKICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVyczsKICBEYXJ0VHlwZSByZXR1cm5UeXBlOyAvLyBOb3QgbnVsbC4KICBTdGF0ZW1lbnQgX2JvZHk7CgogIHZvaWQgRnVuY3Rpb24oKSBsYXp5QnVpbGRlcjsKCiAgdm9pZCBfYnVpbGRMYXp5KCkgewogICAgaWYgKGxhenlCdWlsZGVyICE9IG51bGwpIHsKICAgICAgdmFyIGxhenlCdWlsZGVyTG9jYWwgPSBsYXp5QnVpbGRlcjsKICAgICAgbGF6eUJ1aWxkZXIgPSBudWxsOwogICAgICBsYXp5QnVpbGRlckxvY2FsKCk7CiAgICB9CiAgfQoKICBTdGF0ZW1lbnQgZ2V0IGJvZHkgewogICAgX2J1aWxkTGF6eSgpOwogICAgcmV0dXJuIF9ib2R5OwogIH0KCiAgdm9pZCBzZXQgYm9keShTdGF0ZW1lbnQgYm9keSkgewogICAgX2J1aWxkTGF6eSgpOwogICAgX2JvZHkgPSBib2R5OwogIH0KCiAgRnVuY3Rpb25Ob2RlKHRoaXMuX2JvZHksCiAgICAgIHtMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVycywKICAgICAgaW50IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgIHRoaXMucmV0dXJuVHlwZTogY29uc3QgRHluYW1pY1R5cGUoKSwKICAgICAgdGhpcy5hc3luY01hcmtlcjogQXN5bmNNYXJrZXIuU3luYywKICAgICAgdGhpcy5kYXJ0QXN5bmNNYXJrZXJ9KQogICAgICA6IHRoaXMucG9zaXRpb25hbFBhcmFtZXRlcnMgPQogICAgICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVycyA/PyA8VmFyaWFibGVEZWNsYXJhdGlvbj5bXSwKICAgICAgICB0aGlzLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPQogICAgICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50ID8/IHBvc2l0aW9uYWxQYXJhbWV0ZXJzPy5sZW5ndGggPz8gMCwKICAgICAgICB0aGlzLm5hbWVkUGFyYW1ldGVycyA9IG5hbWVkUGFyYW1ldGVycyA/PyA8VmFyaWFibGVEZWNsYXJhdGlvbj5bXSwKICAgICAgICB0aGlzLnR5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnMgPz8gPFR5cGVQYXJhbWV0ZXI+W10gewogICAgYXNzZXJ0KHJldHVyblR5cGUgIT0gbnVsbCk7CiAgICBzZXRQYXJlbnRzKHRoaXMudHlwZVBhcmFtZXRlcnMsIHRoaXMpOwogICAgc2V0UGFyZW50cyh0aGlzLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLCB0aGlzKTsKICAgIHNldFBhcmVudHModGhpcy5uYW1lZFBhcmFtZXRlcnMsIHRoaXMpOwogICAgX2JvZHk/LnBhcmVudCA9IHRoaXM7CiAgICBkYXJ0QXN5bmNNYXJrZXIgPz89IGFzeW5jTWFya2VyOwogIH0KCiAgc3RhdGljIERhcnRUeXBlIF9nZXRUeXBlT2ZWYXJpYWJsZShWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpID0+IG5vZGUudHlwZTsKCiAgc3RhdGljIE5hbWVkVHlwZSBfZ2V0TmFtZWRUeXBlT2ZWYXJpYWJsZShWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgTmFtZWRUeXBlKG5vZGUubmFtZSwgbm9kZS50eXBlKTsKICB9CgogIEZ1bmN0aW9uVHlwZSBnZXQgZnVuY3Rpb25UeXBlIHsKICAgIFRyZWVOb2RlIHBhcmVudCA9IHRoaXMucGFyZW50OwogICAgTGlzdDxOYW1lZFR5cGU+IG5hbWVkID0KICAgICAgICBuYW1lZFBhcmFtZXRlcnMubWFwKF9nZXROYW1lZFR5cGVPZlZhcmlhYmxlKS50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICAgIG5hbWVkLnNvcnQoKTsKICAgIC8vIFdlIG5lZWQgY3JlYXRlIGEgY29weSBvZiB0aGUgbGlzdCBvZiB0eXBlIHBhcmFtZXRlcnMsIG90aGVyd2lzZQogICAgLy8gdHJhbnNmb3JtYXRpb25zIGxpa2UgZXJhc3VyZSBkb24ndCB3b3JrLgogICAgdmFyIHR5cGVQYXJhbWV0ZXJzQ29weSA9IG5ldyBMaXN0PFR5cGVQYXJhbWV0ZXI+LmZyb20ocGFyZW50IGlzIENvbnN0cnVjdG9yCiAgICAgICAgPyBwYXJlbnQuZW5jbG9zaW5nQ2xhc3MudHlwZVBhcmFtZXRlcnMKICAgICAgICA6IHR5cGVQYXJhbWV0ZXJzKTsKICAgIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlKAogICAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzLm1hcChfZ2V0VHlwZU9mVmFyaWFibGUpLnRvTGlzdChncm93YWJsZTogZmFsc2UpLAogICAgICAgIHJldHVyblR5cGUsCiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzOiBuYW1lZCwKICAgICAgICB0eXBlUGFyYW1ldGVyczogdHlwZVBhcmFtZXRlcnNDb3B5LAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQpOwogIH0KCiAgYWNjZXB0KFRyZWVWaXNpdG9yIHYpID0+IHYudmlzaXRGdW5jdGlvbk5vZGUodGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3QodHlwZVBhcmFtZXRlcnMsIHYpOwogICAgdmlzaXRMaXN0KHBvc2l0aW9uYWxQYXJhbWV0ZXJzLCB2KTsKICAgIHZpc2l0TGlzdChuYW1lZFBhcmFtZXRlcnMsIHYpOwogICAgcmV0dXJuVHlwZT8uYWNjZXB0KHYpOwogICAgYm9keT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdCh0eXBlUGFyYW1ldGVycywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1MaXN0KHBvc2l0aW9uYWxQYXJhbWV0ZXJzLCB2LCB0aGlzKTsKICAgIHRyYW5zZm9ybUxpc3QobmFtZWRQYXJhbWV0ZXJzLCB2LCB0aGlzKTsKICAgIHJldHVyblR5cGUgPSB2LnZpc2l0RGFydFR5cGUocmV0dXJuVHlwZSk7CiAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgIGJvZHkgPSBib2R5LmFjY2VwdCh2KTsKICAgICAgYm9keT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCmVudW0gQXN5bmNNYXJrZXIgewogIC8vIERvIG5vdCBjaGFuZ2UgdGhlIG9yZGVyIG9mIHRoZXNlLCB0aGUgZnJvbnRlbmRzIGRlcGVuZCBvbiBpdC4KICBTeW5jLAogIFN5bmNTdGFyLAogIEFzeW5jLAogIEFzeW5jU3RhciwKCiAgLy8gYFN5bmNZaWVsZGluZ2AgaXMgYSBtYXJrZXIgdGhhdCB0ZWxscyBEYXJ0IFZNIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBhbgogIC8vIGFydGlmaWNpYWwgY2xvc3VyZSBpbnRyb2R1Y2VkIGJ5IGFuIGFzeW5jIHRyYW5zZm9ybWVyIHdoaWNoIGRlc3VnYXJlZCBhbGwKICAvLyBhc3luYyBzeW50YXggaW50byBhIGNvbWJpbmF0aW9uIG9mIG5hdGl2ZSB5aWVsZHMgYW5kIGhlbHBlciBtZXRob2QgY2FsbHMuCiAgLy8KICAvLyBOYXRpdmUgeWllbGRzIChmb3JtYXR0ZWQgYXMgYFt5aWVsZF1gKSBhcmUgc2VtYW50aWNhbGx5IGNsb3NlIHRvCiAgLy8gYHlpZWxkIHhgIHN0YXRlbWVudDogdGhleSBkZW5vdGUgYSB5aWVsZC9yZXN1bWUgcG9pbnQgd2l0aGluIGEgZnVuY3Rpb24KICAvLyBidXQgYXJlIGNvbXBsZXRlbHkgZGVjb3VwbGVkIGZyb20gdGhlIG5vdGlvbiBvZiBpdGVyYXRvcnMuIFdoZW4KICAvLyBleGVjdXRpb24gb2YgdGhlIGNsb3N1cmUgcmVhY2hlcyBgW3lpZWxkXSB4YCBpdCBzdG9wcyBhbmQgcmV0dXJuIHRoZQogIC8vIHZhbHVlIG9mIGB4YCB0byB0aGUgY2FsbGVyLiBJZiBjbG9zdXJlIGlzIGNhbGxlZCBhZ2FpbiBpdCBjb250aW51ZXMKICAvLyB0byB0aGUgbmV4dCBzdGF0ZW1lbnQgYWZ0ZXIgdGhpcyB5aWVsZCBhcyBpZiBpdCB3YXMgc3VzcGVuZGVkIGFuZCByZXN1bWVkLgogIC8vCiAgLy8gQ29uc2lkZXIgdGhpcyBleGFtcGxlOgogIC8vCiAgLy8gICBnKCkgewogIC8vICAgICB2YXIgOmF3YWl0X2p1bXBfdmFyID0gMDsKICAvLyAgICAgdmFyIDphd2FpdF9jdHhfdmFyOwogIC8vCiAgLy8gICAgIGYoeCkgeWllbGRpbmcgewogIC8vICAgICAgIFt5aWVsZF0gJyR7eH06MCc7CiAgLy8gICAgICAgW3lpZWxkXSAnJHt4fToxJzsKICAvLyAgICAgICBbeWllbGRdICcke3h9OjInOwogIC8vICAgICB9CiAgLy8KICAvLyAgICAgcmV0dXJuIGY7CiAgLy8gICB9CiAgLy8KICAvLyAgIHByaW50KGYoJ2EnKSk7ICAvKiBwcmludHMgJ2E6MCcsIDphd2FpdF9qdW1wX3ZhciA9IDEgICovCiAgLy8gICBwcmludChmKCdiJykpOyAgLyogcHJpbnRzICdiOjEnLCA6YXdhaXRfanVtcF92YXIgPSAyICAqLwogIC8vICAgcHJpbnQoZignYycpKTsgIC8qIHByaW50cyAnYzoyJywgOmF3YWl0X2p1bXBfdmFyID0gMyAgKi8KICAvLwogIC8vIE5vdGU6IGN1cnJlbnRseSBEYXJ0IFZNIGltcGxpY2l0bHkgcmVsaWVzIG9uIGFzeW5jIHRyYW5zZm9ybWVyIHRvCiAgLy8gaW5qZWN0IGNlcnRhaW4gYXJ0aWZpY2lhbCB2YXJpYWJsZXMgaW50byBnIChsaWtlIGA6YXdhaXRfanVtcF92YXJgKS4KICAvLyBBcyBzdWNoIFN5bmNZaWVsZGluZyBhbmQgbmF0aXZlIHlpZWxkIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiB0aGVpcgogIC8vIG93biwgYnV0IGFyZSByYXRoZXIgYW4gaW1wbGVtZW50YXRpb24gYXJ0aWZhY3Qgb2YgdGhlIGFzeW5jIHRyYW5zZm9ybWVyCiAgLy8gaXRzZWxmLgogIFN5bmNZaWVsZGluZywKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFBSRVNTSU9OUwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkBjb3EKYWJzdHJhY3QgY2xhc3MgRXhwcmVzc2lvbiBleHRlbmRzIFRyZWVOb2RlIHsKICAvLy8gUmV0dXJucyB0aGUgc3RhdGljIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24uCiAgLy8vCiAgLy8vIFNob3VsZG4ndCBiZSB1c2VkIG9uIGNvZGUgY29tcGlsZWQgaW4gbGVnYWN5IG1vZGUsIGFzIHRoaXMgbWV0aG9kIGFzc3VtZXMKICAvLy8gdGhlIElSIGlzIHN0cm9uZ2x5IHR5cGVkLgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKTsKCiAgLy8vIFJldHVybnMgdGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBleHByZXNzaW9uIGFzIGFuIGluc3RhbnRpYXRpb24gb2YKICAvLy8gW3N1cGVyY2xhc3NdLgogIC8vLwogIC8vLyBTaG91bGRuJ3QgYmUgdXNlZCBvbiBjb2RlIGNvbXBpbGVkIGluIGxlZ2FjeSBtb2RlLCBhcyB0aGlzIG1ldGhvZCBhc3N1bWVzCiAgLy8vIHRoZSBJUiBpcyBzdHJvbmdseSB0eXBlZC4KICAvLy8KICAvLy8gVGhpcyBtZXRob2QgZnVydGhlcm1vcmUgYXNzdW1lcyB0aGF0IHRoZSB0eXBlIG9mIHRoZSBleHByZXNzaW9uIGFjdHVhbGx5CiAgLy8vIGlzIGEgc3VidHlwZSBvZiAoc29tZSBpbnN0YW50aWF0aW9uIG9mKSB0aGUgZ2l2ZW4gW3N1cGVyY2xhc3NdLgogIC8vLyBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgZWl0aGVyIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gb3IgdGhlIHJhdyB0eXBlIG9mCiAgLy8vIFtzdXBlcmNsYXNzXSBpcyByZXR1cm5lZC4KICBJbnRlcmZhY2VUeXBlIGdldFN0YXRpY1R5cGVBc0luc3RhbmNlT2YoCiAgICAgIENsYXNzIHN1cGVyY2xhc3MsIFR5cGVFbnZpcm9ubWVudCB0eXBlcykgewogICAgLy8gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGUgcHJvZ3JhbSBpcyBjb3JyZWN0bHkgdHlwZWQsIHNvIGlmIHRoZSBzdXBlcmNsYXNzCiAgICAvLyBpcyBub3QgZ2VuZXJpYywgd2UgY2FuIGp1c3QgcmV0dXJuIGl0cyByYXcgdHlwZSB3aXRob3V0IGNvbXB1dGluZyB0aGUKICAgIC8vIHR5cGUgb2YgdGhpcyBleHByZXNzaW9uLiAgSXQgYWxzbyBlbnN1cmVzIHRoYXQgYWxsIHR5cGVzIGFyZSBjb25zaWRlcmVkCiAgICAvLyBzdWJ0eXBlcyBvZiBPYmplY3QgKG5vdCBqdXN0IGludGVyZmFjZSB0eXBlcyksIGFuZCBmdW5jdGlvbiB0eXBlcyBhcmUKICAgIC8vIGNvbnNpZGVyZWQgc3VidHlwZXMgb2YgRnVuY3Rpb24uCiAgICBpZiAoc3VwZXJjbGFzcy50eXBlUGFyYW1ldGVycy5pc0VtcHR5KSB7CiAgICAgIHJldHVybiBzdXBlcmNsYXNzLnJhd1R5cGU7CiAgICB9CiAgICB2YXIgdHlwZSA9IGdldFN0YXRpY1R5cGUodHlwZXMpOwogICAgd2hpbGUgKHR5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGUpIHsKICAgICAgdHlwZSA9ICh0eXBlIGFzIFR5cGVQYXJhbWV0ZXJUeXBlKS5wYXJhbWV0ZXIuYm91bmQ7CiAgICB9CiAgICBpZiAodHlwZSA9PSB0eXBlcy5udWxsVHlwZSkgewogICAgICByZXR1cm4gc3VwZXJjbGFzcy5ib3R0b21UeXBlOwogICAgfQogICAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICB2YXIgdXBjYXN0VHlwZSA9IHR5cGVzLmdldFR5cGVBc0luc3RhbmNlT2YodHlwZSwgc3VwZXJjbGFzcyk7CiAgICAgIGlmICh1cGNhc3RUeXBlICE9IG51bGwpIHJldHVybiB1cGNhc3RUeXBlOwogICAgfSBlbHNlIGlmICh0eXBlIGlzIEJvdHRvbVR5cGUpIHsKICAgICAgcmV0dXJuIHN1cGVyY2xhc3MuYm90dG9tVHlwZTsKICAgIH0KICAgIHR5cGVzLnR5cGVFcnJvcih0aGlzLCAnJHR5cGUgaXMgbm90IGEgc3VidHlwZSBvZiAkc3VwZXJjbGFzcycpOwogICAgcmV0dXJuIHN1cGVyY2xhc3MucmF3VHlwZTsKICB9CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpOwp9CgovLy8gQW4gZXhwcmVzc2lvbiBjb250YWluaW5nIGNvbXBpbGUtdGltZSBlcnJvcnMuCi8vLwovLy8gU2hvdWxkIHRocm93IGEgcnVudGltZSBlcnJvciB3aGVuIGV2YWx1YXRlZC4KY2xhc3MgSW52YWxpZEV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBTdHJpbmcgbWVzc2FnZTsKCiAgSW52YWxpZEV4cHJlc3Npb24odGhpcy5tZXNzYWdlKTsKCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpID0+IGNvbnN0IEJvdHRvbVR5cGUoKTsKCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRJbnZhbGlkRXhwcmVzc2lvbih0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRJbnZhbGlkRXhwcmVzc2lvbih0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdikge30KICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7fQp9CgovLy8gUmVhZCBhIGxvY2FsIHZhcmlhYmxlLCBhIGxvY2FsIGZ1bmN0aW9uLCBvciBhIGZ1bmN0aW9uIHBhcmFtZXRlci4KQGNvcQpjbGFzcyBWYXJpYWJsZUdldCBleHRlbmRzIEV4cHJlc3Npb24gewogIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGU7CiAgQG5vY29xCiAgRGFydFR5cGUgcHJvbW90ZWRUeXBlOyAvLyBOdWxsIGlmIG5vdCBwcm9tb3RlZC4KCiAgVmFyaWFibGVHZXQodGhpcy52YXJpYWJsZSwgW3RoaXMucHJvbW90ZWRUeXBlXSk7CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSB7CiAgICByZXR1cm4gcHJvbW90ZWRUeXBlID8/IHZhcmlhYmxlLnR5cGU7CiAgfQoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdFZhcmlhYmxlR2V0KHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdFZhcmlhYmxlR2V0KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBwcm9tb3RlZFR5cGU/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChwcm9tb3RlZFR5cGUgIT0gbnVsbCkgewogICAgICBwcm9tb3RlZFR5cGUgPSB2LnZpc2l0RGFydFR5cGUocHJvbW90ZWRUeXBlKTsKICAgIH0KICB9Cn0KCi8vLyBBc3NpZ24gYSBsb2NhbCB2YXJpYWJsZSBvciBmdW5jdGlvbiBwYXJhbWV0ZXIuCi8vLwovLy8gRXZhbHVhdGVzIHRvIHRoZSB2YWx1ZSBvZiBbdmFsdWVdLgpjbGFzcyBWYXJpYWJsZVNldCBleHRlbmRzIEV4cHJlc3Npb24gewogIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGU7CiAgRXhwcmVzc2lvbiB2YWx1ZTsKCiAgVmFyaWFibGVTZXQodGhpcy52YXJpYWJsZSwgdGhpcy52YWx1ZSkgewogICAgdmFsdWU/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gdmFsdWUuZ2V0U3RhdGljVHlwZSh0eXBlcyk7CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0VmFyaWFibGVTZXQodGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0VmFyaWFibGVTZXQodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZhbHVlPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICB2YWx1ZSA9IHZhbHVlLmFjY2VwdCh2KTsKICAgICAgdmFsdWU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gRXhwcmVzc2lvbiBvZiBmb3JtIGB4LmZpZWxkYC4KLy8vCi8vLyBUaGlzIG1heSBpbnZva2UgYSBnZXR0ZXIsIHJlYWQgYSBmaWVsZCwgb3IgdGVhciBvZmYgYSBtZXRob2QuCkBjb3EKY2xhc3MgUHJvcGVydHlHZXQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBFeHByZXNzaW9uIHJlY2VpdmVyOwogIEBjb3EKICBOYW1lIG5hbWU7CgogIEBub2NvcQogIFJlZmVyZW5jZSBpbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2U7CgogIFByb3BlcnR5R2V0KEV4cHJlc3Npb24gcmVjZWl2ZXIsIE5hbWUgbmFtZSwgW01lbWJlciBpbnRlcmZhY2VUYXJnZXRdKQogICAgICA6IHRoaXMuYnlSZWZlcmVuY2UocmVjZWl2ZXIsIG5hbWUsIGdldE1lbWJlclJlZmVyZW5jZShpbnRlcmZhY2VUYXJnZXQpKTsKCiAgUHJvcGVydHlHZXQuYnlSZWZlcmVuY2UoCiAgICAgIHRoaXMucmVjZWl2ZXIsIHRoaXMubmFtZSwgdGhpcy5pbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpIHsKICAgIHJlY2VpdmVyPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgTWVtYmVyIGdldCBpbnRlcmZhY2VUYXJnZXQgPT4gaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlPy5hc01lbWJlcjsKCiAgdm9pZCBzZXQgaW50ZXJmYWNlVGFyZ2V0KE1lbWJlciBtZW1iZXIpIHsKICAgIGludGVyZmFjZVRhcmdldFJlZmVyZW5jZSA9IGdldE1lbWJlclJlZmVyZW5jZShtZW1iZXIpOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpIHsKICAgIHZhciBpbnRlcmZhY2VUYXJnZXQgPSB0aGlzLmludGVyZmFjZVRhcmdldDsKICAgIGlmIChpbnRlcmZhY2VUYXJnZXQgIT0gbnVsbCkgewogICAgICBDbGFzcyBzdXBlcmNsYXNzID0gaW50ZXJmYWNlVGFyZ2V0LmVuY2xvc2luZ0NsYXNzOwogICAgICB2YXIgcmVjZWl2ZXJUeXBlID0gcmVjZWl2ZXIuZ2V0U3RhdGljVHlwZUFzSW5zdGFuY2VPZihzdXBlcmNsYXNzLCB0eXBlcyk7CiAgICAgIHJldHVybiBTdWJzdGl0dXRpb24uZnJvbUludGVyZmFjZVR5cGUocmVjZWl2ZXJUeXBlKQogICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKGludGVyZmFjZVRhcmdldC5nZXR0ZXJUeXBlKTsKICAgIH0KICAgIC8vIFRyZWF0IHRoZSBwcm9wZXJ0aWVzIG9mIE9iamVjdCBzcGVjaWFsbHkuCiAgICBTdHJpbmcgbmFtZVN0cmluZyA9IG5hbWUubmFtZTsKICAgIGlmIChuYW1lU3RyaW5nID09ICdoYXNoQ29kZScpIHsKICAgICAgcmV0dXJuIHR5cGVzLmludFR5cGU7CiAgICB9IGVsc2UgaWYgKG5hbWVTdHJpbmcgPT0gJ3J1bnRpbWVUeXBlJykgewogICAgICByZXR1cm4gdHlwZXMudHlwZVR5cGU7CiAgICB9CiAgICByZXR1cm4gY29uc3QgRHluYW1pY1R5cGUoKTsKICB9CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0UHJvcGVydHlHZXQodGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0UHJvcGVydHlHZXQodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHJlY2VpdmVyPy5hY2NlcHQodik7CiAgICBuYW1lPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAocmVjZWl2ZXIgIT0gbnVsbCkgewogICAgICByZWNlaXZlciA9IHJlY2VpdmVyLmFjY2VwdCh2KTsKICAgICAgcmVjZWl2ZXI/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gRXhwcmVzc2lvbiBvZiBmb3JtIGB4LmZpZWxkID0gdmFsdWVgLgovLy8KLy8vIFRoaXMgbWF5IGludm9rZSBhIHNldHRlciBvciBhc3NpZ24gYSBmaWVsZC4KLy8vCi8vLyBFdmFsdWF0ZXMgdG8gdGhlIHZhbHVlIG9mIFt2YWx1ZV0uCmNsYXNzIFByb3BlcnR5U2V0IGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgRXhwcmVzc2lvbiByZWNlaXZlcjsKICBOYW1lIG5hbWU7CiAgRXhwcmVzc2lvbiB2YWx1ZTsKCiAgUmVmZXJlbmNlIGludGVyZmFjZVRhcmdldFJlZmVyZW5jZTsKCiAgUHJvcGVydHlTZXQoRXhwcmVzc2lvbiByZWNlaXZlciwgTmFtZSBuYW1lLCBFeHByZXNzaW9uIHZhbHVlLAogICAgICBbTWVtYmVyIGludGVyZmFjZVRhcmdldF0pCiAgICAgIDogdGhpcy5ieVJlZmVyZW5jZSgKICAgICAgICAgICAgcmVjZWl2ZXIsIG5hbWUsIHZhbHVlLCBnZXRNZW1iZXJSZWZlcmVuY2UoaW50ZXJmYWNlVGFyZ2V0KSk7CgogIFByb3BlcnR5U2V0LmJ5UmVmZXJlbmNlKAogICAgICB0aGlzLnJlY2VpdmVyLCB0aGlzLm5hbWUsIHRoaXMudmFsdWUsIHRoaXMuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKSB7CiAgICByZWNlaXZlcj8ucGFyZW50ID0gdGhpczsKICAgIHZhbHVlPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgTWVtYmVyIGdldCBpbnRlcmZhY2VUYXJnZXQgPT4gaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlPy5hc01lbWJlcjsKCiAgdm9pZCBzZXQgaW50ZXJmYWNlVGFyZ2V0KE1lbWJlciBtZW1iZXIpIHsKICAgIGludGVyZmFjZVRhcmdldFJlZmVyZW5jZSA9IGdldE1lbWJlclJlZmVyZW5jZShtZW1iZXIpOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpID0+IHZhbHVlLmdldFN0YXRpY1R5cGUodHlwZXMpOwoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdFByb3BlcnR5U2V0KHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdFByb3BlcnR5U2V0KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICByZWNlaXZlcj8uYWNjZXB0KHYpOwogICAgbmFtZT8uYWNjZXB0KHYpOwogICAgdmFsdWU/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChyZWNlaXZlciAhPSBudWxsKSB7CiAgICAgIHJlY2VpdmVyID0gcmVjZWl2ZXIuYWNjZXB0KHYpOwogICAgICByZWNlaXZlcj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIHZhbHVlID0gdmFsdWUuYWNjZXB0KHYpOwogICAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBEaXJlY3RseSByZWFkIGEgZmllbGQsIGNhbGwgYSBnZXR0ZXIsIG9yIHRlYXIgb2ZmIGEgbWV0aG9kLgpjbGFzcyBEaXJlY3RQcm9wZXJ0eUdldCBleHRlbmRzIEV4cHJlc3Npb24gewogIEV4cHJlc3Npb24gcmVjZWl2ZXI7CiAgUmVmZXJlbmNlIHRhcmdldFJlZmVyZW5jZTsKCiAgRGlyZWN0UHJvcGVydHlHZXQoRXhwcmVzc2lvbiByZWNlaXZlciwgTWVtYmVyIHRhcmdldCkKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKHJlY2VpdmVyLCBnZXRNZW1iZXJSZWZlcmVuY2UodGFyZ2V0KSk7CgogIERpcmVjdFByb3BlcnR5R2V0LmJ5UmVmZXJlbmNlKHRoaXMucmVjZWl2ZXIsIHRoaXMudGFyZ2V0UmVmZXJlbmNlKSB7CiAgICByZWNlaXZlcj8ucGFyZW50ID0gdGhpczsKICB9CgogIE1lbWJlciBnZXQgdGFyZ2V0ID0+IHRhcmdldFJlZmVyZW5jZT8uYXNNZW1iZXI7CgogIHZvaWQgc2V0IHRhcmdldChNZW1iZXIgdGFyZ2V0KSB7CiAgICB0YXJnZXRSZWZlcmVuY2UgPSBnZXRNZW1iZXJSZWZlcmVuY2UodGFyZ2V0KTsKICB9CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICByZWNlaXZlcj8uYWNjZXB0KHYpOwogICAgdGFyZ2V0Py5hY2NlcHRSZWZlcmVuY2Uodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAocmVjZWl2ZXIgIT0gbnVsbCkgewogICAgICByZWNlaXZlciA9IHJlY2VpdmVyLmFjY2VwdCh2KTsKICAgICAgcmVjZWl2ZXI/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdERpcmVjdFByb3BlcnR5R2V0KHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdERpcmVjdFByb3BlcnR5R2V0KHRoaXMsIGFyZyk7CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSB7CiAgICBDbGFzcyBzdXBlcmNsYXNzID0gdGFyZ2V0LmVuY2xvc2luZ0NsYXNzOwogICAgdmFyIHJlY2VpdmVyVHlwZSA9IHJlY2VpdmVyLmdldFN0YXRpY1R5cGVBc0luc3RhbmNlT2Yoc3VwZXJjbGFzcywgdHlwZXMpOwogICAgcmV0dXJuIFN1YnN0aXR1dGlvbi5mcm9tSW50ZXJmYWNlVHlwZShyZWNlaXZlclR5cGUpCiAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHRhcmdldC5nZXR0ZXJUeXBlKTsKICB9Cn0KCi8vLyBEaXJlY3RseSBhc3NpZ24gYSBmaWVsZCwgb3IgY2FsbCBhIHNldHRlci4KLy8vCi8vLyBFdmFsdWF0ZXMgdG8gdGhlIHZhbHVlIG9mIFt2YWx1ZV0uCmNsYXNzIERpcmVjdFByb3BlcnR5U2V0IGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgRXhwcmVzc2lvbiByZWNlaXZlcjsKICBSZWZlcmVuY2UgdGFyZ2V0UmVmZXJlbmNlOwogIEV4cHJlc3Npb24gdmFsdWU7CgogIERpcmVjdFByb3BlcnR5U2V0KEV4cHJlc3Npb24gcmVjZWl2ZXIsIE1lbWJlciB0YXJnZXQsIEV4cHJlc3Npb24gdmFsdWUpCiAgICAgIDogdGhpcy5ieVJlZmVyZW5jZShyZWNlaXZlciwgZ2V0TWVtYmVyUmVmZXJlbmNlKHRhcmdldCksIHZhbHVlKTsKCiAgRGlyZWN0UHJvcGVydHlTZXQuYnlSZWZlcmVuY2UoCiAgICAgIHRoaXMucmVjZWl2ZXIsIHRoaXMudGFyZ2V0UmVmZXJlbmNlLCB0aGlzLnZhbHVlKSB7CiAgICByZWNlaXZlcj8ucGFyZW50ID0gdGhpczsKICAgIHZhbHVlPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgTWVtYmVyIGdldCB0YXJnZXQgPT4gdGFyZ2V0UmVmZXJlbmNlPy5hc01lbWJlcjsKCiAgdm9pZCBzZXQgdGFyZ2V0KE1lbWJlciB0YXJnZXQpIHsKICAgIHRhcmdldFJlZmVyZW5jZSA9IGdldE1lbWJlclJlZmVyZW5jZSh0YXJnZXQpOwogIH0KCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHJlY2VpdmVyPy5hY2NlcHQodik7CiAgICB0YXJnZXQ/LmFjY2VwdFJlZmVyZW5jZSh2KTsKICAgIHZhbHVlPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAocmVjZWl2ZXIgIT0gbnVsbCkgewogICAgICByZWNlaXZlciA9IHJlY2VpdmVyLmFjY2VwdCh2KTsKICAgICAgcmVjZWl2ZXI/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICB2YWx1ZSA9IHZhbHVlLmFjY2VwdCh2KTsKICAgICAgdmFsdWU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdERpcmVjdFByb3BlcnR5U2V0KHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdERpcmVjdFByb3BlcnR5U2V0KHRoaXMsIGFyZyk7CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PiB2YWx1ZS5nZXRTdGF0aWNUeXBlKHR5cGVzKTsKfQoKLy8vIERpcmVjdGx5IGNhbGwgYW4gaW5zdGFuY2UgbWV0aG9kLCBieXBhc3Npbmcgb3JkaW5hcnkgZGlzcGF0Y2guCmNsYXNzIERpcmVjdE1ldGhvZEludm9jYXRpb24gZXh0ZW5kcyBJbnZvY2F0aW9uRXhwcmVzc2lvbiB7CiAgRXhwcmVzc2lvbiByZWNlaXZlcjsKICBSZWZlcmVuY2UgdGFyZ2V0UmVmZXJlbmNlOwogIEFyZ3VtZW50cyBhcmd1bWVudHM7CgogIERpcmVjdE1ldGhvZEludm9jYXRpb24oCiAgICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIsIFByb2NlZHVyZSB0YXJnZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpCiAgICAgIDogdGhpcy5ieVJlZmVyZW5jZShyZWNlaXZlciwgZ2V0TWVtYmVyUmVmZXJlbmNlKHRhcmdldCksIGFyZ3VtZW50cyk7CgogIERpcmVjdE1ldGhvZEludm9jYXRpb24uYnlSZWZlcmVuY2UoCiAgICAgIHRoaXMucmVjZWl2ZXIsIHRoaXMudGFyZ2V0UmVmZXJlbmNlLCB0aGlzLmFyZ3VtZW50cykgewogICAgcmVjZWl2ZXI/LnBhcmVudCA9IHRoaXM7CiAgICBhcmd1bWVudHM/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBQcm9jZWR1cmUgZ2V0IHRhcmdldCA9PiB0YXJnZXRSZWZlcmVuY2U/LmFzUHJvY2VkdXJlOwoKICB2b2lkIHNldCB0YXJnZXQoUHJvY2VkdXJlIHRhcmdldCkgewogICAgdGFyZ2V0UmVmZXJlbmNlID0gZ2V0TWVtYmVyUmVmZXJlbmNlKHRhcmdldCk7CiAgfQoKICBOYW1lIGdldCBuYW1lID0+IHRhcmdldD8ubmFtZTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHJlY2VpdmVyPy5hY2NlcHQodik7CiAgICB0YXJnZXQ/LmFjY2VwdFJlZmVyZW5jZSh2KTsKICAgIGFyZ3VtZW50cz8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHJlY2VpdmVyICE9IG51bGwpIHsKICAgICAgcmVjZWl2ZXIgPSByZWNlaXZlci5hY2NlcHQodik7CiAgICAgIHJlY2VpdmVyPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGFyZ3VtZW50cyA9IGFyZ3VtZW50cy5hY2NlcHQodik7CiAgICAgIGFyZ3VtZW50cz8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0RGlyZWN0TWV0aG9kSW52b2NhdGlvbih0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+CiAgICAgIHYudmlzaXREaXJlY3RNZXRob2RJbnZvY2F0aW9uKHRoaXMsIGFyZyk7CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSB7CiAgICBpZiAodHlwZXMuaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yKHRhcmdldCkpIHsKICAgICAgcmV0dXJuIHR5cGVzLmdldFR5cGVPZk92ZXJsb2FkZWRBcml0aG1ldGljKHJlY2VpdmVyLmdldFN0YXRpY1R5cGUodHlwZXMpLAogICAgICAgICAgYXJndW1lbnRzLnBvc2l0aW9uYWxbMF0uZ2V0U3RhdGljVHlwZSh0eXBlcykpOwogICAgfQogICAgQ2xhc3Mgc3VwZXJjbGFzcyA9IHRhcmdldC5lbmNsb3NpbmdDbGFzczsKICAgIHZhciByZWNlaXZlclR5cGUgPSByZWNlaXZlci5nZXRTdGF0aWNUeXBlQXNJbnN0YW5jZU9mKHN1cGVyY2xhc3MsIHR5cGVzKTsKICAgIHZhciByZXR1cm5UeXBlID0gU3Vic3RpdHV0aW9uLmZyb21JbnRlcmZhY2VUeXBlKHJlY2VpdmVyVHlwZSkKICAgICAgICAuc3Vic3RpdHV0ZVR5cGUodGFyZ2V0LmZ1bmN0aW9uLnJldHVyblR5cGUpOwogICAgcmV0dXJuIFN1YnN0aXR1dGlvbi5mcm9tUGFpcnMoCiAgICAgICAgICAgIHRhcmdldC5mdW5jdGlvbi50eXBlUGFyYW1ldGVycywgYXJndW1lbnRzLnR5cGVzKQogICAgICAgIC5zdWJzdGl0dXRlVHlwZShyZXR1cm5UeXBlKTsKICB9Cn0KCi8vLyBFeHByZXNzaW9uIG9mIGZvcm0gYHN1cGVyLmZpZWxkYC4KLy8vCi8vLyBUaGlzIG1heSBpbnZva2UgYSBnZXR0ZXIsIHJlYWQgYSBmaWVsZCwgb3IgdGVhciBvZmYgYSBtZXRob2QuCmNsYXNzIFN1cGVyUHJvcGVydHlHZXQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBOYW1lIG5hbWU7CgogIFJlZmVyZW5jZSBpbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2U7CgogIFN1cGVyUHJvcGVydHlHZXQoTmFtZSBuYW1lLCBbTWVtYmVyIGludGVyZmFjZVRhcmdldF0pCiAgICAgIDogdGhpcy5ieVJlZmVyZW5jZShuYW1lLCBnZXRNZW1iZXJSZWZlcmVuY2UoaW50ZXJmYWNlVGFyZ2V0KSk7CgogIFN1cGVyUHJvcGVydHlHZXQuYnlSZWZlcmVuY2UodGhpcy5uYW1lLCB0aGlzLmludGVyZmFjZVRhcmdldFJlZmVyZW5jZSk7CgogIE1lbWJlciBnZXQgaW50ZXJmYWNlVGFyZ2V0ID0+IGludGVyZmFjZVRhcmdldFJlZmVyZW5jZT8uYXNNZW1iZXI7CgogIHZvaWQgc2V0IGludGVyZmFjZVRhcmdldChNZW1iZXIgbWVtYmVyKSB7CiAgICBpbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UgPSBnZXRNZW1iZXJSZWZlcmVuY2UobWVtYmVyKTsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSB7CiAgICBDbGFzcyBkZWNsYXJpbmdDbGFzcyA9IGludGVyZmFjZVRhcmdldC5lbmNsb3NpbmdDbGFzczsKICAgIGlmIChkZWNsYXJpbmdDbGFzcy50eXBlUGFyYW1ldGVycy5pc0VtcHR5KSB7CiAgICAgIHJldHVybiBpbnRlcmZhY2VUYXJnZXQuZ2V0dGVyVHlwZTsKICAgIH0KICAgIHZhciByZWNlaXZlciA9IHR5cGVzLmdldFR5cGVBc0luc3RhbmNlT2YodHlwZXMudGhpc1R5cGUsIGRlY2xhcmluZ0NsYXNzKTsKICAgIHJldHVybiBTdWJzdGl0dXRpb24uZnJvbUludGVyZmFjZVR5cGUocmVjZWl2ZXIpCiAgICAgICAgLnN1YnN0aXR1dGVUeXBlKGludGVyZmFjZVRhcmdldC5nZXR0ZXJUeXBlKTsKICB9CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0U3VwZXJQcm9wZXJ0eUdldCh0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRTdXBlclByb3BlcnR5R2V0KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBuYW1lPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7fQp9CgovLy8gRXhwcmVzc2lvbiBvZiBmb3JtIGBzdXBlci5maWVsZCA9IHZhbHVlYC4KLy8vCi8vLyBUaGlzIG1heSBpbnZva2UgYSBzZXR0ZXIgb3IgYXNzaWduIGEgZmllbGQuCi8vLwovLy8gRXZhbHVhdGVzIHRvIHRoZSB2YWx1ZSBvZiBbdmFsdWVdLgpjbGFzcyBTdXBlclByb3BlcnR5U2V0IGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgTmFtZSBuYW1lOwogIEV4cHJlc3Npb24gdmFsdWU7CgogIFJlZmVyZW5jZSBpbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2U7CgogIFN1cGVyUHJvcGVydHlTZXQoTmFtZSBuYW1lLCBFeHByZXNzaW9uIHZhbHVlLCBNZW1iZXIgaW50ZXJmYWNlVGFyZ2V0KQogICAgICA6IHRoaXMuYnlSZWZlcmVuY2UobmFtZSwgdmFsdWUsIGdldE1lbWJlclJlZmVyZW5jZShpbnRlcmZhY2VUYXJnZXQpKTsKCiAgU3VwZXJQcm9wZXJ0eVNldC5ieVJlZmVyZW5jZSgKICAgICAgdGhpcy5uYW1lLCB0aGlzLnZhbHVlLCB0aGlzLmludGVyZmFjZVRhcmdldFJlZmVyZW5jZSkgewogICAgdmFsdWU/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBNZW1iZXIgZ2V0IGludGVyZmFjZVRhcmdldCA9PiBpbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2U/LmFzTWVtYmVyOwoKICB2b2lkIHNldCBpbnRlcmZhY2VUYXJnZXQoTWVtYmVyIG1lbWJlcikgewogICAgaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlID0gZ2V0TWVtYmVyUmVmZXJlbmNlKG1lbWJlcik7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gdmFsdWUuZ2V0U3RhdGljVHlwZSh0eXBlcyk7CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0U3VwZXJQcm9wZXJ0eVNldCh0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRTdXBlclByb3BlcnR5U2V0KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBuYW1lPy5hY2NlcHQodik7CiAgICB2YWx1ZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgdmFsdWUgPSB2YWx1ZS5hY2NlcHQodik7CiAgICAgIHZhbHVlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIFJlYWQgYSBzdGF0aWMgZmllbGQsIGNhbGwgYSBzdGF0aWMgZ2V0dGVyLCBvciB0ZWFyIG9mZiBhIHN0YXRpYyBtZXRob2QuCmNsYXNzIFN0YXRpY0dldCBleHRlbmRzIEV4cHJlc3Npb24gewogIC8vLyBBIHN0YXRpYyBmaWVsZCwgZ2V0dGVyLCBvciBtZXRob2QgKGZvciB0ZWFyLW9mZikuCiAgUmVmZXJlbmNlIHRhcmdldFJlZmVyZW5jZTsKCiAgU3RhdGljR2V0KE1lbWJlciB0YXJnZXQpIDogdGhpcy5ieVJlZmVyZW5jZShnZXRNZW1iZXJSZWZlcmVuY2UodGFyZ2V0KSk7CgogIFN0YXRpY0dldC5ieVJlZmVyZW5jZSh0aGlzLnRhcmdldFJlZmVyZW5jZSk7CgogIE1lbWJlciBnZXQgdGFyZ2V0ID0+IHRhcmdldFJlZmVyZW5jZT8uYXNNZW1iZXI7CgogIHZvaWQgc2V0IHRhcmdldChNZW1iZXIgdGFyZ2V0KSB7CiAgICB0YXJnZXRSZWZlcmVuY2UgPSBnZXRNZW1iZXJSZWZlcmVuY2UodGFyZ2V0KTsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PiB0YXJnZXQuZ2V0dGVyVHlwZTsKCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRTdGF0aWNHZXQodGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0U3RhdGljR2V0KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB0YXJnZXQ/LmFjY2VwdFJlZmVyZW5jZSh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHt9Cn0KCi8vLyBBc3NpZ24gYSBzdGF0aWMgZmllbGQgb3IgY2FsbCBhIHN0YXRpYyBzZXR0ZXIuCi8vLwovLy8gRXZhbHVhdGVzIHRvIHRoZSB2YWx1ZSBvZiBbdmFsdWVdLgpjbGFzcyBTdGF0aWNTZXQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICAvLy8gQSBtdXRhYmxlIHN0YXRpYyBmaWVsZCBvciBhIHN0YXRpYyBzZXR0ZXIuCiAgUmVmZXJlbmNlIHRhcmdldFJlZmVyZW5jZTsKICBFeHByZXNzaW9uIHZhbHVlOwoKICBTdGF0aWNTZXQoTWVtYmVyIHRhcmdldCwgRXhwcmVzc2lvbiB2YWx1ZSkKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKGdldE1lbWJlclJlZmVyZW5jZSh0YXJnZXQpLCB2YWx1ZSk7CgogIFN0YXRpY1NldC5ieVJlZmVyZW5jZSh0aGlzLnRhcmdldFJlZmVyZW5jZSwgdGhpcy52YWx1ZSkgewogICAgdmFsdWU/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBNZW1iZXIgZ2V0IHRhcmdldCA9PiB0YXJnZXRSZWZlcmVuY2U/LmFzTWVtYmVyOwoKICB2b2lkIHNldCB0YXJnZXQoTWVtYmVyIHRhcmdldCkgewogICAgdGFyZ2V0UmVmZXJlbmNlID0gZ2V0TWVtYmVyUmVmZXJlbmNlKHRhcmdldCk7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gdmFsdWUuZ2V0U3RhdGljVHlwZSh0eXBlcyk7CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0U3RhdGljU2V0KHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdFN0YXRpY1NldCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdGFyZ2V0Py5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICB2YWx1ZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgdmFsdWUgPSB2YWx1ZS5hY2NlcHQodik7CiAgICAgIHZhbHVlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIFRoZSBhcmd1bWVudHMgdG8gYSBmdW5jdGlvbiBjYWxsLCBkaXZpZGVkIGludG8gdHlwZSBhcmd1bWVudHMsCi8vLyBwb3NpdGlvbmFsIGFyZ3VtZW50cywgYW5kIG5hbWVkIGFyZ3VtZW50cy4KQGNvcQpjbGFzcyBBcmd1bWVudHMgZXh0ZW5kcyBUcmVlTm9kZSB7CiAgQG5vY29xCiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gdHlwZXM7CiAgQGNvcXNpbmdsZQogIGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gcG9zaXRpb25hbDsKICBMaXN0PE5hbWVkRXhwcmVzc2lvbj4gbmFtZWQ7CgogIEFyZ3VtZW50cyh0aGlzLnBvc2l0aW9uYWwsCiAgICAgIHtMaXN0PERhcnRUeXBlPiB0eXBlcywgTGlzdDxOYW1lZEV4cHJlc3Npb24+IG5hbWVkfSkKICAgICAgOiB0aGlzLnR5cGVzID0gdHlwZXMgPz8gPERhcnRUeXBlPltdLAogICAgICAgIHRoaXMubmFtZWQgPSBuYW1lZCA/PyA8TmFtZWRFeHByZXNzaW9uPltdIHsKICAgIHNldFBhcmVudHModGhpcy5wb3NpdGlvbmFsLCB0aGlzKTsKICAgIHNldFBhcmVudHModGhpcy5uYW1lZCwgdGhpcyk7CiAgfQoKICBBcmd1bWVudHMuZW1wdHkoKQogICAgICA6IHR5cGVzID0gPERhcnRUeXBlPltdLAogICAgICAgIHBvc2l0aW9uYWwgPSA8RXhwcmVzc2lvbj5bXSwKICAgICAgICBuYW1lZCA9IDxOYW1lZEV4cHJlc3Npb24+W107CgogIGZhY3RvcnkgQXJndW1lbnRzLmZvcndhcmRlZChGdW5jdGlvbk5vZGUgZnVuY3Rpb24pIHsKICAgIHJldHVybiBuZXcgQXJndW1lbnRzKAogICAgICAgIGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLm1hcCgocCkgPT4gbmV3IFZhcmlhYmxlR2V0KHApKS50b0xpc3QoKSwKICAgICAgICBuYW1lZDogZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzCiAgICAgICAgICAgIC5tYXAoKHApID0+IG5ldyBOYW1lZEV4cHJlc3Npb24ocC5uYW1lLCBuZXcgVmFyaWFibGVHZXQocCkpKQogICAgICAgICAgICAudG9MaXN0KCksCiAgICAgICAgdHlwZXM6IGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzCiAgICAgICAgICAgIC5tYXAoKHApID0+IG5ldyBUeXBlUGFyYW1ldGVyVHlwZShwKSkKICAgICAgICAgICAgLnRvTGlzdCgpKTsKICB9CgogIGFjY2VwdChUcmVlVmlzaXRvciB2KSA9PiB2LnZpc2l0QXJndW1lbnRzKHRoaXMpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdmlzaXRMaXN0KHR5cGVzLCB2KTsKICAgIHZpc2l0TGlzdChwb3NpdGlvbmFsLCB2KTsKICAgIHZpc2l0TGlzdChuYW1lZCwgdik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICB0cmFuc2Zvcm1UeXBlTGlzdCh0eXBlcywgdik7CiAgICB0cmFuc2Zvcm1MaXN0KHBvc2l0aW9uYWwsIHYsIHRoaXMpOwogICAgdHJhbnNmb3JtTGlzdChuYW1lZCwgdiwgdGhpcyk7CiAgfQp9CgovLy8gQSBuYW1lZCBhcmd1bWVudCwgYG5hbWU6IHZhbHVlYC4KY2xhc3MgTmFtZWRFeHByZXNzaW9uIGV4dGVuZHMgVHJlZU5vZGUgewogIFN0cmluZyBuYW1lOwogIEV4cHJlc3Npb24gdmFsdWU7CgogIE5hbWVkRXhwcmVzc2lvbih0aGlzLm5hbWUsIHRoaXMudmFsdWUpIHsKICAgIHZhbHVlPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgYWNjZXB0KFRyZWVWaXNpdG9yIHYpID0+IHYudmlzaXROYW1lZEV4cHJlc3Npb24odGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2YWx1ZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgdmFsdWUgPSB2YWx1ZS5hY2NlcHQodik7CiAgICAgIHZhbHVlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIENvbW1vbiBzdXBlciBjbGFzcyBmb3IgW0RpcmVjdE1ldGhvZEludm9jYXRpb25dLCBbTWV0aG9kSW52b2NhdGlvbl0sCi8vLyBbU3VwZXJNZXRob2RJbnZvY2F0aW9uXSwgW1N0YXRpY0ludm9jYXRpb25dLCBhbmQgW0NvbnN0cnVjdG9ySW52b2NhdGlvbl0uCkBjb3EKYWJzdHJhY3QgY2xhc3MgSW52b2NhdGlvbkV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBBcmd1bWVudHMgZ2V0IGFyZ3VtZW50czsKICBzZXQgYXJndW1lbnRzKEFyZ3VtZW50cyB2YWx1ZSk7CgogIC8vLyBOYW1lIG9mIHRoZSBpbnZva2VkIG1ldGhvZC4KICAvLy8KICAvLy8gTWF5IGJlIGBudWxsYCBpZiB0aGUgdGFyZ2V0IGlzIGEgc3ludGhldGljIHN0YXRpYyBtZW1iZXIgd2l0aG91dCBhIG5hbWUuCiAgTmFtZSBnZXQgbmFtZTsKfQoKLy8vIEV4cHJlc3Npb24gb2YgZm9ybSBgeC5mb28oeSlgLgpAY29xCmNsYXNzIE1ldGhvZEludm9jYXRpb24gZXh0ZW5kcyBJbnZvY2F0aW9uRXhwcmVzc2lvbiB7CiAgRXhwcmVzc2lvbiByZWNlaXZlcjsKICBOYW1lIG5hbWU7CiAgQXJndW1lbnRzIGFyZ3VtZW50czsKCiAgUmVmZXJlbmNlIGludGVyZmFjZVRhcmdldFJlZmVyZW5jZTsKCiAgTWV0aG9kSW52b2NhdGlvbihFeHByZXNzaW9uIHJlY2VpdmVyLCBOYW1lIG5hbWUsIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIFtNZW1iZXIgaW50ZXJmYWNlVGFyZ2V0XSkKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKAogICAgICAgICAgICByZWNlaXZlciwgbmFtZSwgYXJndW1lbnRzLCBnZXRNZW1iZXJSZWZlcmVuY2UoaW50ZXJmYWNlVGFyZ2V0KSk7CgogIE1ldGhvZEludm9jYXRpb24uYnlSZWZlcmVuY2UoCiAgICAgIHRoaXMucmVjZWl2ZXIsIHRoaXMubmFtZSwgdGhpcy5hcmd1bWVudHMsIHRoaXMuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKSB7CiAgICByZWNlaXZlcj8ucGFyZW50ID0gdGhpczsKICAgIGFyZ3VtZW50cz8ucGFyZW50ID0gdGhpczsKICB9CgogIE1lbWJlciBnZXQgaW50ZXJmYWNlVGFyZ2V0ID0+IGludGVyZmFjZVRhcmdldFJlZmVyZW5jZT8uYXNNZW1iZXI7CgogIHZvaWQgc2V0IGludGVyZmFjZVRhcmdldChNZW1iZXIgdGFyZ2V0KSB7CiAgICBpbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UgPSBnZXRNZW1iZXJSZWZlcmVuY2UodGFyZ2V0KTsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSB7CiAgICB2YXIgaW50ZXJmYWNlVGFyZ2V0ID0gdGhpcy5pbnRlcmZhY2VUYXJnZXQ7CiAgICBpZiAoaW50ZXJmYWNlVGFyZ2V0ICE9IG51bGwpIHsKICAgICAgaWYgKGludGVyZmFjZVRhcmdldCBpcyBQcm9jZWR1cmUgJiYKICAgICAgICAgIHR5cGVzLmlzT3ZlcmxvYWRlZEFyaXRobWV0aWNPcGVyYXRvcihpbnRlcmZhY2VUYXJnZXQpKSB7CiAgICAgICAgcmV0dXJuIHR5cGVzLmdldFR5cGVPZk92ZXJsb2FkZWRBcml0aG1ldGljKAogICAgICAgICAgICByZWNlaXZlci5nZXRTdGF0aWNUeXBlKHR5cGVzKSwKICAgICAgICAgICAgYXJndW1lbnRzLnBvc2l0aW9uYWxbMF0uZ2V0U3RhdGljVHlwZSh0eXBlcykpOwogICAgICB9CiAgICAgIENsYXNzIHN1cGVyY2xhc3MgPSBpbnRlcmZhY2VUYXJnZXQuZW5jbG9zaW5nQ2xhc3M7CiAgICAgIHZhciByZWNlaXZlclR5cGUgPSByZWNlaXZlci5nZXRTdGF0aWNUeXBlQXNJbnN0YW5jZU9mKHN1cGVyY2xhc3MsIHR5cGVzKTsKICAgICAgdmFyIGdldHRlclR5cGUgPSBTdWJzdGl0dXRpb24uZnJvbUludGVyZmFjZVR5cGUocmVjZWl2ZXJUeXBlKQogICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKGludGVyZmFjZVRhcmdldC5nZXR0ZXJUeXBlKTsKICAgICAgaWYgKGdldHRlclR5cGUgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgcmV0dXJuIFN1YnN0aXR1dGlvbi5mcm9tUGFpcnMoCiAgICAgICAgICAgICAgICBnZXR0ZXJUeXBlLnR5cGVQYXJhbWV0ZXJzLCBhcmd1bWVudHMudHlwZXMpCiAgICAgICAgICAgIC5zdWJzdGl0dXRlVHlwZShnZXR0ZXJUeXBlLnJldHVyblR5cGUpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgICB9CiAgICB9CiAgICBpZiAobmFtZS5uYW1lID09ICdjYWxsJykgewogICAgICB2YXIgcmVjZWl2ZXJUeXBlID0gcmVjZWl2ZXIuZ2V0U3RhdGljVHlwZSh0eXBlcyk7CiAgICAgIGlmIChyZWNlaXZlclR5cGUgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgaWYgKHJlY2VpdmVyVHlwZS50eXBlUGFyYW1ldGVycy5sZW5ndGggIT0gYXJndW1lbnRzLnR5cGVzLmxlbmd0aCkgewogICAgICAgICAgcmV0dXJuIGNvbnN0IEJvdHRvbVR5cGUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFN1YnN0aXR1dGlvbi5mcm9tUGFpcnMoCiAgICAgICAgICAgICAgICByZWNlaXZlclR5cGUudHlwZVBhcmFtZXRlcnMsIGFyZ3VtZW50cy50eXBlcykKICAgICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHJlY2VpdmVyVHlwZS5yZXR1cm5UeXBlKTsKICAgICAgfQogICAgfQogICAgaWYgKG5hbWUubmFtZSA9PSAnPT0nKSB7CiAgICAgIC8vIFdlIHVzZSB0aGlzIHNwZWNpYWwgY2FzZSB0byBzaW1wbGlmeSBnZW5lcmF0aW9uIG9mICc9PScgY2hlY2tzLgogICAgICByZXR1cm4gdHlwZXMuYm9vbFR5cGU7CiAgICB9CiAgICByZXR1cm4gY29uc3QgRHluYW1pY1R5cGUoKTsKICB9CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0TWV0aG9kSW52b2NhdGlvbih0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRNZXRob2RJbnZvY2F0aW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICByZWNlaXZlcj8uYWNjZXB0KHYpOwogICAgbmFtZT8uYWNjZXB0KHYpOwogICAgYXJndW1lbnRzPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAocmVjZWl2ZXIgIT0gbnVsbCkgewogICAgICByZWNlaXZlciA9IHJlY2VpdmVyLmFjY2VwdCh2KTsKICAgICAgcmVjZWl2ZXI/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgYXJndW1lbnRzID0gYXJndW1lbnRzLmFjY2VwdCh2KTsKICAgICAgYXJndW1lbnRzPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEV4cHJlc3Npb24gb2YgZm9ybSBgc3VwZXIuZm9vKHgpYC4KLy8vCi8vLyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzIG1pZ2h0IG5vdCBtYXRjaCB0aGUgcGFyYW1ldGVycyBvZiB0aGUgdGFyZ2V0LgpjbGFzcyBTdXBlck1ldGhvZEludm9jYXRpb24gZXh0ZW5kcyBJbnZvY2F0aW9uRXhwcmVzc2lvbiB7CiAgTmFtZSBuYW1lOwogIEFyZ3VtZW50cyBhcmd1bWVudHM7CgogIFJlZmVyZW5jZSBpbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2U7CgogIFN1cGVyTWV0aG9kSW52b2NhdGlvbihOYW1lIG5hbWUsIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIFtQcm9jZWR1cmUgaW50ZXJmYWNlVGFyZ2V0XSkKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKG5hbWUsIGFyZ3VtZW50cywgZ2V0TWVtYmVyUmVmZXJlbmNlKGludGVyZmFjZVRhcmdldCkpOwoKICBTdXBlck1ldGhvZEludm9jYXRpb24uYnlSZWZlcmVuY2UoCiAgICAgIHRoaXMubmFtZSwgdGhpcy5hcmd1bWVudHMsIHRoaXMuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKSB7CiAgICBhcmd1bWVudHM/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBQcm9jZWR1cmUgZ2V0IGludGVyZmFjZVRhcmdldCA9PiBpbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2U/LmFzUHJvY2VkdXJlOwoKICB2b2lkIHNldCBpbnRlcmZhY2VUYXJnZXQoUHJvY2VkdXJlIHRhcmdldCkgewogICAgaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlID0gZ2V0TWVtYmVyUmVmZXJlbmNlKHRhcmdldCk7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgewogICAgaWYgKGludGVyZmFjZVRhcmdldCA9PSBudWxsKSByZXR1cm4gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIENsYXNzIHN1cGVyY2xhc3MgPSBpbnRlcmZhY2VUYXJnZXQuZW5jbG9zaW5nQ2xhc3M7CiAgICB2YXIgcmVjZWl2ZXJUeXBlID0gdHlwZXMuZ2V0VHlwZUFzSW5zdGFuY2VPZih0eXBlcy50aGlzVHlwZSwgc3VwZXJjbGFzcyk7CiAgICB2YXIgcmV0dXJuVHlwZSA9IFN1YnN0aXR1dGlvbi5mcm9tSW50ZXJmYWNlVHlwZShyZWNlaXZlclR5cGUpCiAgICAgICAgLnN1YnN0aXR1dGVUeXBlKGludGVyZmFjZVRhcmdldC5mdW5jdGlvbi5yZXR1cm5UeXBlKTsKICAgIHJldHVybiBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKAogICAgICAgICAgICBpbnRlcmZhY2VUYXJnZXQuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMsIGFyZ3VtZW50cy50eXBlcykKICAgICAgICAuc3Vic3RpdHV0ZVR5cGUocmV0dXJuVHlwZSk7CiAgfQoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbih0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRTdXBlck1ldGhvZEludm9jYXRpb24odGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIG5hbWU/LmFjY2VwdCh2KTsKICAgIGFyZ3VtZW50cz8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGFyZ3VtZW50cyA9IGFyZ3VtZW50cy5hY2NlcHQodik7CiAgICAgIGFyZ3VtZW50cz8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBFeHByZXNzaW9uIG9mIGZvcm0gYGZvbyh4KWAsIG9yIGBjb25zdCBmb28oeClgIGlmIHRoZSB0YXJnZXQgaXMgYW4KLy8vIGV4dGVybmFsIGNvbnN0YW50IGZhY3RvcnkuCi8vLwovLy8gVGhlIHByb3ZpZGVkIGFyZ3VtZW50cyBtaWdodCBub3QgbWF0Y2ggdGhlIHBhcmFtZXRlcnMgb2YgdGhlIHRhcmdldC4KY2xhc3MgU3RhdGljSW52b2NhdGlvbiBleHRlbmRzIEludm9jYXRpb25FeHByZXNzaW9uIHsKICBSZWZlcmVuY2UgdGFyZ2V0UmVmZXJlbmNlOwogIEFyZ3VtZW50cyBhcmd1bWVudHM7CgogIC8vLyBUcnVlIGlmIHRoaXMgaXMgYSBjb25zdGFudCBjYWxsIHRvIGFuIGV4dGVybmFsIGNvbnN0YW50IGZhY3RvcnkuCiAgYm9vbCBpc0NvbnN0OwoKICBOYW1lIGdldCBuYW1lID0+IHRhcmdldD8ubmFtZTsKCiAgU3RhdGljSW52b2NhdGlvbihQcm9jZWR1cmUgdGFyZ2V0LCBBcmd1bWVudHMgYXJndW1lbnRzLCB7Ym9vbCBpc0NvbnN0OiBmYWxzZX0pCiAgICAgIDogdGhpcy5ieVJlZmVyZW5jZShnZXRNZW1iZXJSZWZlcmVuY2UodGFyZ2V0KSwgYXJndW1lbnRzLAogICAgICAgICAgICBpc0NvbnN0OiBpc0NvbnN0KTsKCiAgU3RhdGljSW52b2NhdGlvbi5ieVJlZmVyZW5jZSh0aGlzLnRhcmdldFJlZmVyZW5jZSwgdGhpcy5hcmd1bWVudHMsCiAgICAgIHt0aGlzLmlzQ29uc3Q6IGZhbHNlfSkgewogICAgYXJndW1lbnRzPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgUHJvY2VkdXJlIGdldCB0YXJnZXQgPT4gdGFyZ2V0UmVmZXJlbmNlPy5hc1Byb2NlZHVyZTsKCiAgdm9pZCBzZXQgdGFyZ2V0KFByb2NlZHVyZSB0YXJnZXQpIHsKICAgIHRhcmdldFJlZmVyZW5jZSA9IGdldE1lbWJlclJlZmVyZW5jZSh0YXJnZXQpOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpIHsKICAgIHJldHVybiBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKAogICAgICAgICAgICB0YXJnZXQuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMsIGFyZ3VtZW50cy50eXBlcykKICAgICAgICAuc3Vic3RpdHV0ZVR5cGUodGFyZ2V0LmZ1bmN0aW9uLnJldHVyblR5cGUpOwogIH0KCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRTdGF0aWNJbnZvY2F0aW9uKHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdFN0YXRpY0ludm9jYXRpb24odGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHRhcmdldD8uYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgYXJndW1lbnRzPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgYXJndW1lbnRzID0gYXJndW1lbnRzLmFjY2VwdCh2KTsKICAgICAgYXJndW1lbnRzPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEV4cHJlc3Npb24gb2YgZm9ybSBgbmV3IEZvbyh4KWAgb3IgYGNvbnN0IEZvbyh4KWAuCi8vLwovLy8gVGhlIHByb3ZpZGVkIGFyZ3VtZW50cyBtaWdodCBub3QgbWF0Y2ggdGhlIHBhcmFtZXRlcnMgb2YgdGhlIHRhcmdldC4KLy8KLy8gREVTSUdOIFRPRE86IFNob3VsZCB3ZSBwYXNzIHR5cGUgYXJndW1lbnRzIGluIGEgc2VwYXJhdGUgZmllbGQKLy8gYGNsYXNzVHlwZUFyZ3VtZW50c2A/IFRoZXkgYXJlIHF1aXRlIGRpZmZlcmVudCBmcm9tIHR5cGUgYXJndW1lbnRzIHRvCi8vIGdlbmVyaWMgZnVuY3Rpb25zLgpAY29xCmNsYXNzIENvbnN0cnVjdG9ySW52b2NhdGlvbiBleHRlbmRzIEludm9jYXRpb25FeHByZXNzaW9uIHsKICBSZWZlcmVuY2UgdGFyZ2V0UmVmZXJlbmNlOwogIEBub2NvcQogIEFyZ3VtZW50cyBhcmd1bWVudHM7CiAgYm9vbCBpc0NvbnN0OwoKICBOYW1lIGdldCBuYW1lID0+IHRhcmdldD8ubmFtZTsKCiAgQ29uc3RydWN0b3JJbnZvY2F0aW9uKENvbnN0cnVjdG9yIHRhcmdldCwgQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAge2Jvb2wgaXNDb25zdDogZmFsc2V9KQogICAgICA6IHRoaXMuYnlSZWZlcmVuY2UoZ2V0TWVtYmVyUmVmZXJlbmNlKHRhcmdldCksIGFyZ3VtZW50cywKICAgICAgICAgICAgaXNDb25zdDogaXNDb25zdCk7CgogIENvbnN0cnVjdG9ySW52b2NhdGlvbi5ieVJlZmVyZW5jZSh0aGlzLnRhcmdldFJlZmVyZW5jZSwgdGhpcy5hcmd1bWVudHMsCiAgICAgIHt0aGlzLmlzQ29uc3Q6IGZhbHNlfSkgewogICAgYXJndW1lbnRzPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQ29uc3RydWN0b3IgZ2V0IHRhcmdldCA9PiB0YXJnZXRSZWZlcmVuY2U/LmFzQ29uc3RydWN0b3I7CgogIHZvaWQgc2V0IHRhcmdldChDb25zdHJ1Y3RvciB0YXJnZXQpIHsKICAgIHRhcmdldFJlZmVyZW5jZSA9IGdldE1lbWJlclJlZmVyZW5jZSh0YXJnZXQpOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpIHsKICAgIHJldHVybiBhcmd1bWVudHMudHlwZXMuaXNFbXB0eQogICAgICAgID8gdGFyZ2V0LmVuY2xvc2luZ0NsYXNzLnJhd1R5cGUKICAgICAgICA6IG5ldyBJbnRlcmZhY2VUeXBlKHRhcmdldC5lbmNsb3NpbmdDbGFzcywgYXJndW1lbnRzLnR5cGVzKTsKICB9CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbih0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdGFyZ2V0Py5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICBhcmd1bWVudHM/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBhcmd1bWVudHMgPSBhcmd1bWVudHMuYWNjZXB0KHYpOwogICAgICBhcmd1bWVudHM/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBjb25zdHJ1Y3RlZFR5cGUgewogICAgcmV0dXJuIGFyZ3VtZW50cy50eXBlcy5pc0VtcHR5CiAgICAgICAgPyB0YXJnZXQuZW5jbG9zaW5nQ2xhc3MucmF3VHlwZQogICAgICAgIDogbmV3IEludGVyZmFjZVR5cGUodGFyZ2V0LmVuY2xvc2luZ0NsYXNzLCBhcmd1bWVudHMudHlwZXMpOwogIH0KfQoKLy8vIEFuIGV4cGxpY2l0IHR5cGUgaW5zdGFudGlhdGlvbiBvZiBhIGdlbmVyaWMgZnVuY3Rpb24uCmNsYXNzIEluc3RhbnRpYXRpb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBFeHByZXNzaW9uIGV4cHJlc3Npb247CiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKCiAgSW5zdGFudGlhdGlvbih0aGlzLmV4cHJlc3Npb24sIHRoaXMudHlwZUFyZ3VtZW50cykgewogICAgZXhwcmVzc2lvbj8ucGFyZW50ID0gdGhpczsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSB7CiAgICBGdW5jdGlvblR5cGUgdHlwZSA9IGV4cHJlc3Npb24uZ2V0U3RhdGljVHlwZSh0eXBlcyk7CiAgICByZXR1cm4gU3Vic3RpdHV0aW9uLmZyb21QYWlycyh0eXBlLnR5cGVQYXJhbWV0ZXJzLCB0eXBlQXJndW1lbnRzKQogICAgICAgIC5zdWJzdGl0dXRlVHlwZSh0eXBlLndpdGhvdXRUeXBlUGFyYW1ldGVycyk7CiAgfQoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdEluc3RhbnRpYXRpb24odGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0SW5zdGFudGlhdGlvbih0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgZXhwcmVzc2lvbj8uYWNjZXB0KHYpOwogICAgdmlzaXRMaXN0KHR5cGVBcmd1bWVudHMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkgewogICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5hY2NlcHQodik7CiAgICAgIGV4cHJlc3Npb24/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICB0cmFuc2Zvcm1UeXBlTGlzdCh0eXBlQXJndW1lbnRzLCB2KTsKICB9Cn0KCi8vLyBFeHByZXNzaW9uIG9mIGZvcm0gYCF4YC4KLy8vCi8vLyBUaGUgYGlzIWAgYW5kIGAhPWAgb3BlcmF0b3JzIGFyZSBkZXN1Z2FyZWQgaW50byBbTm90XSBub2RlcyB3aXRoIGBpc2AgYW5kCi8vLyBgPT1gIGV4cHJlc3Npb25zIGluc2lkZSwgcmVzcGVjdGl2ZWx5LgpjbGFzcyBOb3QgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBFeHByZXNzaW9uIG9wZXJhbmQ7CgogIE5vdCh0aGlzLm9wZXJhbmQpIHsKICAgIG9wZXJhbmQ/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gdHlwZXMuYm9vbFR5cGU7CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0Tm90KHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdE5vdCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgb3BlcmFuZD8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKG9wZXJhbmQgIT0gbnVsbCkgewogICAgICBvcGVyYW5kID0gb3BlcmFuZC5hY2NlcHQodik7CiAgICAgIG9wZXJhbmQ/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gRXhwcmVzc2lvbiBvZiBmb3JtIGB4ICYmIHlgIG9yIGB4IHx8IHlgCmNsYXNzIExvZ2ljYWxFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgRXhwcmVzc2lvbiBsZWZ0OwogIFN0cmluZyBvcGVyYXRvcjsgLy8gJiYgb3IgfHwgb3IgPz8KICBFeHByZXNzaW9uIHJpZ2h0OwoKICBMb2dpY2FsRXhwcmVzc2lvbih0aGlzLmxlZnQsIHRoaXMub3BlcmF0b3IsIHRoaXMucmlnaHQpIHsKICAgIGxlZnQ/LnBhcmVudCA9IHRoaXM7CiAgICByaWdodD8ucGFyZW50ID0gdGhpczsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PiB0eXBlcy5ib29sVHlwZTsKCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRMb2dpY2FsRXhwcmVzc2lvbih0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRMb2dpY2FsRXhwcmVzc2lvbih0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgbGVmdD8uYWNjZXB0KHYpOwogICAgcmlnaHQ/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChsZWZ0ICE9IG51bGwpIHsKICAgICAgbGVmdCA9IGxlZnQuYWNjZXB0KHYpOwogICAgICBsZWZ0Py5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHJpZ2h0ICE9IG51bGwpIHsKICAgICAgcmlnaHQgPSByaWdodC5hY2NlcHQodik7CiAgICAgIHJpZ2h0Py5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEV4cHJlc3Npb24gb2YgZm9ybSBgeCA/IHkgOiB6YC4KY2xhc3MgQ29uZGl0aW9uYWxFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgRXhwcmVzc2lvbiBjb25kaXRpb247CiAgRXhwcmVzc2lvbiB0aGVuOwogIEV4cHJlc3Npb24gb3RoZXJ3aXNlOwoKICAvLy8gVGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBleHByZXNzaW9uLiBTaG91bGQgbm90IGJlIGBudWxsYC4KICBEYXJ0VHlwZSBzdGF0aWNUeXBlOwoKICBDb25kaXRpb25hbEV4cHJlc3Npb24oCiAgICAgIHRoaXMuY29uZGl0aW9uLCB0aGlzLnRoZW4sIHRoaXMub3RoZXJ3aXNlLCB0aGlzLnN0YXRpY1R5cGUpIHsKICAgIGNvbmRpdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIHRoZW4/LnBhcmVudCA9IHRoaXM7CiAgICBvdGhlcndpc2U/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gc3RhdGljVHlwZTsKCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRDb25kaXRpb25hbEV4cHJlc3Npb24odGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBjb25kaXRpb24/LmFjY2VwdCh2KTsKICAgIHRoZW4/LmFjY2VwdCh2KTsKICAgIG90aGVyd2lzZT8uYWNjZXB0KHYpOwogICAgc3RhdGljVHlwZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGNvbmRpdGlvbiAhPSBudWxsKSB7CiAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbi5hY2NlcHQodik7CiAgICAgIGNvbmRpdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmICh0aGVuICE9IG51bGwpIHsKICAgICAgdGhlbiA9IHRoZW4uYWNjZXB0KHYpOwogICAgICB0aGVuPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKG90aGVyd2lzZSAhPSBudWxsKSB7CiAgICAgIG90aGVyd2lzZSA9IG90aGVyd2lzZS5hY2NlcHQodik7CiAgICAgIG90aGVyd2lzZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChzdGF0aWNUeXBlICE9IG51bGwpIHsKICAgICAgc3RhdGljVHlwZSA9IHYudmlzaXREYXJ0VHlwZShzdGF0aWNUeXBlKTsKICAgIH0KICB9Cn0KCi8vLyBDb252ZXJ0IGV4cHJlc3Npb25zIHRvIHN0cmluZ3MgYW5kIGNvbmNhdGVuYXRlIHRoZW0uICBTZW1hbnRpY2FsbHksIGNhbGxzCi8vLyBgdG9TdHJpbmdgIG9uIGV2ZXJ5IGFyZ3VtZW50LCBjaGVja3MgdGhhdCBhIHN0cmluZyBpcyByZXR1cm5lZCwgYW5kIHJldHVybnMKLy8vIHRoZSBjb25jYXRlbmF0aW9uIG9mIGFsbCB0aGUgc3RyaW5ncy4KLy8vCi8vLyBJZiBbZXhwcmVzc2lvbnNdIGlzIGVtcHR5IHRoZW4gYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgovLy8KLy8vIFRoZXNlIGFyaXNlIGZyb20gc3RyaW5nIGludGVycG9sYXRpb25zIGFuZCBhZGphY2VudCBzdHJpbmcgbGl0ZXJhbHMuCmNsYXNzIFN0cmluZ0NvbmNhdGVuYXRpb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zOwoKICBTdHJpbmdDb25jYXRlbmF0aW9uKHRoaXMuZXhwcmVzc2lvbnMpIHsKICAgIHNldFBhcmVudHMoZXhwcmVzc2lvbnMsIHRoaXMpOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpID0+IHR5cGVzLnN0cmluZ1R5cGU7CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0U3RyaW5nQ29uY2F0ZW5hdGlvbih0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3QoZXhwcmVzc2lvbnMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChleHByZXNzaW9ucywgdiwgdGhpcyk7CiAgfQp9CgovLy8gQ29uY2F0ZW5hdGUgbGlzdHMgaW50byBhIHNpbmdsZSBsaXN0LgovLy8KLy8vIElmIFtsaXN0c10gaXMgZW1wdHkgdGhlbiBhbiBlbXB0eSBsaXN0IGlzIHJldHVybmVkLgovLy8KLy8vIFRoZXNlIGFyaXNlIGZyb20gc3ByZWFkIGFuZCBjb250cm9sLWZsb3cgZWxlbWVudHMgaW4gY29uc3QgbGlzdCBsaXRlcmFscwovLy8gY29udGFpbmluZyB1bmV2YWx1YXRlZCBzdWJleHByZXNzaW9ucy4gVGhleSBvbmx5IGV2ZXIgb2NjdXIgd2l0aGluCi8vLyB1bmV2YWx1YXRlZCBjb25zdGFudHMgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMuCmNsYXNzIExpc3RDb25jYXRlbmF0aW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgRGFydFR5cGUgdHlwZUFyZ3VtZW50OwogIGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gbGlzdHM7CgogIExpc3RDb25jYXRlbmF0aW9uKHRoaXMubGlzdHMsIHt0aGlzLnR5cGVBcmd1bWVudDogY29uc3QgRHluYW1pY1R5cGUoKX0pIHsKICAgIHNldFBhcmVudHMobGlzdHMsIHRoaXMpOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpIHsKICAgIHJldHVybiB0eXBlcy5saXRlcmFsTGlzdFR5cGUodHlwZUFyZ3VtZW50KTsKICB9CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0TGlzdENvbmNhdGVuYXRpb24odGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0TGlzdENvbmNhdGVuYXRpb24odGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHR5cGVBcmd1bWVudD8uYWNjZXB0KHYpOwogICAgdmlzaXRMaXN0KGxpc3RzLCB2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIHR5cGVBcmd1bWVudCA9IHYudmlzaXREYXJ0VHlwZSh0eXBlQXJndW1lbnQpOwogICAgdHJhbnNmb3JtTGlzdChsaXN0cywgdiwgdGhpcyk7CiAgfQp9CgovLy8gQ29uY2F0ZW5hdGUgc2V0cyBpbnRvIGEgc2luZ2xlIHNldC4KLy8vCi8vLyBJZiBbc2V0c10gaXMgZW1wdHkgdGhlbiBhbiBlbXB0eSBzZXQgaXMgcmV0dXJuZWQuCi8vLwovLy8gVGhlc2UgYXJpc2UgZnJvbSBzcHJlYWQgYW5kIGNvbnRyb2wtZmxvdyBlbGVtZW50cyBpbiBjb25zdCBzZXQgbGl0ZXJhbHMKLy8vIGNvbnRhaW5pbmcgdW5ldmFsdWF0ZWQgc3ViZXhwcmVzc2lvbnMuIFRoZXkgb25seSBldmVyIG9jY3VyIHdpdGhpbgovLy8gdW5ldmFsdWF0ZWQgY29uc3RhbnRzIGluIGNvbnN0YW50IGV4cHJlc3Npb25zLgovLy8KLy8vIER1cGxpY2F0ZWQgdmFsdWVzIGluIG9yIGFjcm9zcyB0aGUgc2V0cyB3aWxsIHJlc3VsdCBpbiBhIGNvbXBpbGUtdGltZSBlcnJvcgovLy8gZHVyaW5nIGNvbnN0YW50IGV2YWx1YXRpb24uCmNsYXNzIFNldENvbmNhdGVuYXRpb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBEYXJ0VHlwZSB0eXBlQXJndW1lbnQ7CiAgZmluYWwgTGlzdDxFeHByZXNzaW9uPiBzZXRzOwoKICBTZXRDb25jYXRlbmF0aW9uKHRoaXMuc2V0cywge3RoaXMudHlwZUFyZ3VtZW50OiBjb25zdCBEeW5hbWljVHlwZSgpfSkgewogICAgc2V0UGFyZW50cyhzZXRzLCB0aGlzKTsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSB7CiAgICByZXR1cm4gdHlwZXMubGl0ZXJhbFNldFR5cGUodHlwZUFyZ3VtZW50KTsKICB9CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0U2V0Q29uY2F0ZW5hdGlvbih0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRTZXRDb25jYXRlbmF0aW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB0eXBlQXJndW1lbnQ/LmFjY2VwdCh2KTsKICAgIHZpc2l0TGlzdChzZXRzLCB2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIHR5cGVBcmd1bWVudCA9IHYudmlzaXREYXJ0VHlwZSh0eXBlQXJndW1lbnQpOwogICAgdHJhbnNmb3JtTGlzdChzZXRzLCB2LCB0aGlzKTsKICB9Cn0KCi8vLyBDb25jYXRlbmF0ZSBtYXBzIGludG8gYSBzaW5nbGUgbWFwLgovLy8KLy8vIElmIFttYXBzXSBpcyBlbXB0eSB0aGVuIGFuIGVtcHR5IG1hcCBpcyByZXR1cm5lZC4KLy8vCi8vLyBUaGVzZSBhcmlzZSBmcm9tIHNwcmVhZCBhbmQgY29udHJvbC1mbG93IGVsZW1lbnRzIGluIGNvbnN0IG1hcCBsaXRlcmFscwovLy8gY29udGFpbmluZyB1bmV2YWx1YXRlZCBzdWJleHByZXNzaW9ucy4gVGhleSBvbmx5IGV2ZXIgb2NjdXIgd2l0aGluCi8vLyB1bmV2YWx1YXRlZCBjb25zdGFudHMgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMuCi8vLwovLy8gRHVwbGljYXRlZCBrZXlzIGluIG9yIGFjcm9zcyB0aGUgbWFwcyB3aWxsIHJlc3VsdCBpbiBhIGNvbXBpbGUtdGltZSBlcnJvcgovLy8gZHVyaW5nIGNvbnN0YW50IGV2YWx1YXRpb24uCmNsYXNzIE1hcENvbmNhdGVuYXRpb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBEYXJ0VHlwZSBrZXlUeXBlOwogIERhcnRUeXBlIHZhbHVlVHlwZTsKICBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IG1hcHM7CgogIE1hcENvbmNhdGVuYXRpb24odGhpcy5tYXBzLAogICAgICB7dGhpcy5rZXlUeXBlOiBjb25zdCBEeW5hbWljVHlwZSgpLAogICAgICB0aGlzLnZhbHVlVHlwZTogY29uc3QgRHluYW1pY1R5cGUoKX0pIHsKICAgIHNldFBhcmVudHMobWFwcywgdGhpcyk7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgewogICAgcmV0dXJuIHR5cGVzLmxpdGVyYWxNYXBUeXBlKGtleVR5cGUsIHZhbHVlVHlwZSk7CiAgfQoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdE1hcENvbmNhdGVuYXRpb24odGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0TWFwQ29uY2F0ZW5hdGlvbih0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAga2V5VHlwZT8uYWNjZXB0KHYpOwogICAgdmFsdWVUeXBlPy5hY2NlcHQodik7CiAgICB2aXNpdExpc3QobWFwcywgdik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBrZXlUeXBlID0gdi52aXNpdERhcnRUeXBlKGtleVR5cGUpOwogICAgdmFsdWVUeXBlID0gdi52aXNpdERhcnRUeXBlKHZhbHVlVHlwZSk7CiAgICB0cmFuc2Zvcm1MaXN0KG1hcHMsIHYsIHRoaXMpOwogIH0KfQoKLy8vIENyZWF0ZSBhbiBpbnN0YW5jZSBkaXJlY3RseSBmcm9tIHRoZSBmaWVsZCB2YWx1ZXMuCi8vLwovLy8gVGhpcyBleHByZXNzaW9uIGFyaXNlcyBmcm9tIGNvbnN0IGNvbnN0cnVjdG9yIGNhbGxzIHdoZW4gb25lIG9yIG1vcmUgZmllbGQKLy8vIGluaXRpYWxpemluZyBleHByZXNzaW9ucywgZmllbGQgaW5pdGlhbGl6ZXJzIG9yIGFzc2VydCBpbml0aWFsaXplcnMgY29udGFpbgovLy8gdW5ldmFsdWF0ZWQgZXhwcmVzc2lvbnMuIFRoZXkgb25seSBldmVyIG9jY3VyIHdpdGhpbiB1bmV2YWx1YXRlZCBjb25zdGFudHMKLy8vIGluIGNvbnN0YW50IGV4cHJlc3Npb25zLgpjbGFzcyBJbnN0YW5jZUNyZWF0aW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgZmluYWwgUmVmZXJlbmNlIGNsYXNzUmVmZXJlbmNlOwogIGZpbmFsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHM7CiAgZmluYWwgTWFwPFJlZmVyZW5jZSwgRXhwcmVzc2lvbj4gZmllbGRWYWx1ZXM7CiAgZmluYWwgTGlzdDxBc3NlcnRTdGF0ZW1lbnQ+IGFzc2VydHM7CgogIEluc3RhbmNlQ3JlYXRpb24oCiAgICAgIHRoaXMuY2xhc3NSZWZlcmVuY2UsIHRoaXMudHlwZUFyZ3VtZW50cywgdGhpcy5maWVsZFZhbHVlcywgdGhpcy5hc3NlcnRzKTsKCiAgQ2xhc3MgZ2V0IGNsYXNzTm9kZSA9PiBjbGFzc1JlZmVyZW5jZS5hc0NsYXNzOwoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgewogICAgcmV0dXJuIHR5cGVBcmd1bWVudHMuaXNFbXB0eQogICAgICAgID8gY2xhc3NOb2RlLnJhd1R5cGUKICAgICAgICA6IG5ldyBJbnRlcmZhY2VUeXBlKGNsYXNzTm9kZSwgdHlwZUFyZ3VtZW50cyk7CiAgfQoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdEluc3RhbmNlQ3JlYXRpb24odGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0SW5zdGFuY2VDcmVhdGlvbih0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgY2xhc3NSZWZlcmVuY2UuYXNDbGFzcy5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICB2aXNpdExpc3QodHlwZUFyZ3VtZW50cywgdik7CiAgICBmb3IgKGZpbmFsIFJlZmVyZW5jZSByZWZlcmVuY2UgaW4gZmllbGRWYWx1ZXMua2V5cykgewogICAgICByZWZlcmVuY2UuYXNGaWVsZC5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICB9CiAgICBmb3IgKGZpbmFsIEV4cHJlc3Npb24gdmFsdWUgaW4gZmllbGRWYWx1ZXMudmFsdWVzKSB7CiAgICAgIHZhbHVlLmFjY2VwdCh2KTsKICAgIH0KICAgIHZpc2l0TGlzdChhc3NlcnRzLCB2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGZpZWxkVmFsdWVzLmZvckVhY2goKFJlZmVyZW5jZSBmaWVsZFJlZiwgRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgICBFeHByZXNzaW9uIHRyYW5zZm9ybWVkID0gdmFsdWUuYWNjZXB0KHYpOwogICAgICBpZiAodHJhbnNmb3JtZWQgIT0gbnVsbCAmJiAhaWRlbnRpY2FsKHZhbHVlLCB0cmFuc2Zvcm1lZCkpIHsKICAgICAgICBmaWVsZFZhbHVlc1tmaWVsZFJlZl0gPSB0cmFuc2Zvcm1lZDsKICAgICAgICB0cmFuc2Zvcm1lZC5wYXJlbnQgPSB0aGlzOwogICAgICB9CiAgICB9KTsKICAgIHRyYW5zZm9ybUxpc3QoYXNzZXJ0cywgdiwgdGhpcyk7CiAgfQp9CgovLy8gRXhwcmVzc2lvbiBvZiBmb3JtIGB4IGlzIFRgLgpjbGFzcyBJc0V4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBFeHByZXNzaW9uIG9wZXJhbmQ7CiAgRGFydFR5cGUgdHlwZTsKCiAgSXNFeHByZXNzaW9uKHRoaXMub3BlcmFuZCwgdGhpcy50eXBlKSB7CiAgICBvcGVyYW5kPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpID0+IHR5cGVzLmJvb2xUeXBlOwoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdElzRXhwcmVzc2lvbih0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRJc0V4cHJlc3Npb24odGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIG9wZXJhbmQ/LmFjY2VwdCh2KTsKICAgIHR5cGU/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChvcGVyYW5kICE9IG51bGwpIHsKICAgICAgb3BlcmFuZCA9IG9wZXJhbmQuYWNjZXB0KHYpOwogICAgICBvcGVyYW5kPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgdHlwZSA9IHYudmlzaXREYXJ0VHlwZSh0eXBlKTsKICB9Cn0KCi8vLyBFeHByZXNzaW9uIG9mIGZvcm0gYHggYXMgVGAuCmNsYXNzIEFzRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24gewogIGludCBmbGFncyA9IDA7CiAgRXhwcmVzc2lvbiBvcGVyYW5kOwogIERhcnRUeXBlIHR5cGU7CgogIEFzRXhwcmVzc2lvbih0aGlzLm9wZXJhbmQsIHRoaXMudHlwZSkgewogICAgb3BlcmFuZD8ucGFyZW50ID0gdGhpczsKICB9CgogIC8vIE11c3QgbWF0Y2ggc2VyaWFsaXplZCBiaXQgcG9zaXRpb25zLgogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ1R5cGVFcnJvciA9IDEgPDwgMDsKCiAgLy8vIEluZGljYXRlcyB0aGUgdHlwZSBvZiBlcnJvciB0aGF0IHNob3VsZCBiZSB0aHJvd24gaWYgdGhlIGNoZWNrIGZhaWxzLgogIC8vLwogIC8vLyBgdHJ1ZWAgbWVhbnMgdGhhdCBhIFR5cGVFcnJvciBzaG91bGQgYmUgdGhyb3duLiAgYGZhbHNlYCBtZWFucyB0aGF0IGEKICAvLy8gQ2FzdEVycm9yIHNob3VsZCBiZSB0aHJvd24uCiAgYm9vbCBnZXQgaXNUeXBlRXJyb3IgPT4gZmxhZ3MgJiBGbGFnVHlwZUVycm9yICE9IDA7CgogIHZvaWQgc2V0IGlzVHlwZUVycm9yKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUgPyAoZmxhZ3MgfCBGbGFnVHlwZUVycm9yKSA6IChmbGFncyAmIH5GbGFnVHlwZUVycm9yKTsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PiB0eXBlOwoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdEFzRXhwcmVzc2lvbih0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRBc0V4cHJlc3Npb24odGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIG9wZXJhbmQ/LmFjY2VwdCh2KTsKICAgIHR5cGU/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChvcGVyYW5kICE9IG51bGwpIHsKICAgICAgb3BlcmFuZCA9IG9wZXJhbmQuYWNjZXB0KHYpOwogICAgICBvcGVyYW5kPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgdHlwZSA9IHYudmlzaXREYXJ0VHlwZSh0eXBlKTsKICB9Cn0KCi8vLyBBbiBpbnRlZ2VyLCBkb3VibGUsIGJvb2xlYW4sIHN0cmluZywgb3IgbnVsbCBjb25zdGFudC4KYWJzdHJhY3QgY2xhc3MgQmFzaWNMaXRlcmFsIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgT2JqZWN0IGdldCB2YWx1ZTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHt9CiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikge30KfQoKY2xhc3MgU3RyaW5nTGl0ZXJhbCBleHRlbmRzIEJhc2ljTGl0ZXJhbCB7CiAgU3RyaW5nIHZhbHVlOwoKICBTdHJpbmdMaXRlcmFsKHRoaXMudmFsdWUpOwoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gdHlwZXMuc3RyaW5nVHlwZTsKCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRTdHJpbmdMaXRlcmFsKHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdFN0cmluZ0xpdGVyYWwodGhpcywgYXJnKTsKfQoKY2xhc3MgSW50TGl0ZXJhbCBleHRlbmRzIEJhc2ljTGl0ZXJhbCB7CiAgLy8vIE5vdGUgdGhhdCB0aGlzIHZhbHVlIGhvbGRzIGEgdWludDY0IHZhbHVlLgogIC8vLyBFLmcuICIweDgwMDAwMDAwMDAwMDAwMDAiIHdpbGwgYmUgc2F2ZWQgYXMgIi05MjIzMzcyMDM2ODU0Nzc1ODA4IiBkZXNwaXRlCiAgLy8vIHRlY2huaWNhbGx5IChvbiBzb21lIHBsYXRmb3JtcywgcGFydGljdWxhcmx5IEphdmFzY3JpcHQpIGJlaW5nIHBvc2l0aXZlLgogIC8vLyBJZiB0aGUgbnVtYmVyIGlzIG1lYW50IHRvIGJlIG5lZ2F0aXZlIGl0IHdpbGwgYmUgd3JhcHBlZCBpbiBhICJ1bmFyeS0iLgogIGludCB2YWx1ZTsKCiAgSW50TGl0ZXJhbCh0aGlzLnZhbHVlKTsKCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpID0+IHR5cGVzLmludFR5cGU7CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0SW50TGl0ZXJhbCh0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRJbnRMaXRlcmFsKHRoaXMsIGFyZyk7Cn0KCmNsYXNzIERvdWJsZUxpdGVyYWwgZXh0ZW5kcyBCYXNpY0xpdGVyYWwgewogIGRvdWJsZSB2YWx1ZTsKCiAgRG91YmxlTGl0ZXJhbCh0aGlzLnZhbHVlKTsKCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpID0+IHR5cGVzLmRvdWJsZVR5cGU7CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0RG91YmxlTGl0ZXJhbCh0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXREb3VibGVMaXRlcmFsKHRoaXMsIGFyZyk7Cn0KCmNsYXNzIEJvb2xMaXRlcmFsIGV4dGVuZHMgQmFzaWNMaXRlcmFsIHsKICBib29sIHZhbHVlOwoKICBCb29sTGl0ZXJhbCh0aGlzLnZhbHVlKTsKCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpID0+IHR5cGVzLmJvb2xUeXBlOwoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdEJvb2xMaXRlcmFsKHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdEJvb2xMaXRlcmFsKHRoaXMsIGFyZyk7Cn0KCmNsYXNzIE51bGxMaXRlcmFsIGV4dGVuZHMgQmFzaWNMaXRlcmFsIHsKICBPYmplY3QgZ2V0IHZhbHVlID0+IG51bGw7CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PiB0eXBlcy5udWxsVHlwZTsKCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXROdWxsTGl0ZXJhbCh0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXROdWxsTGl0ZXJhbCh0aGlzLCBhcmcpOwp9CgpjbGFzcyBTeW1ib2xMaXRlcmFsIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgU3RyaW5nIHZhbHVlOyAvLyBFdmVyeXRoaW5nIHN0cmljdGx5IGFmdGVyIHRoZSAnIycuCgogIFN5bWJvbExpdGVyYWwodGhpcy52YWx1ZSk7CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PiB0eXBlcy5zeW1ib2xUeXBlOwoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdFN5bWJvbExpdGVyYWwodGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0U3ltYm9sTGl0ZXJhbCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdikge30KICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7fQp9CgpjbGFzcyBUeXBlTGl0ZXJhbCBleHRlbmRzIEV4cHJlc3Npb24gewogIERhcnRUeXBlIHR5cGU7CgogIFR5cGVMaXRlcmFsKHRoaXMudHlwZSk7CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PiB0eXBlcy50eXBlVHlwZTsKCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRUeXBlTGl0ZXJhbCh0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRUeXBlTGl0ZXJhbCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdHlwZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHlwZSA9IHYudmlzaXREYXJ0VHlwZSh0eXBlKTsKICB9Cn0KCmNsYXNzIFRoaXNFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpID0+IHR5cGVzLnRoaXNUeXBlOwoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdFRoaXNFeHByZXNzaW9uKHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdFRoaXNFeHByZXNzaW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHt9Cn0KCmNsYXNzIFJldGhyb3cgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gY29uc3QgQm90dG9tVHlwZSgpOwoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdFJldGhyb3codGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0UmV0aHJvdyh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdikge30KICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7fQp9CgpjbGFzcyBUaHJvdyBleHRlbmRzIEV4cHJlc3Npb24gewogIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKCiAgVGhyb3codGhpcy5leHByZXNzaW9uKSB7CiAgICBleHByZXNzaW9uPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpID0+IGNvbnN0IEJvdHRvbVR5cGUoKTsKCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRUaHJvdyh0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRUaHJvdyh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgZXhwcmVzc2lvbj8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkgewogICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5hY2NlcHQodik7CiAgICAgIGV4cHJlc3Npb24/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgpjbGFzcyBMaXN0TGl0ZXJhbCBleHRlbmRzIEV4cHJlc3Npb24gewogIGJvb2wgaXNDb25zdDsKICBEYXJ0VHlwZSB0eXBlQXJndW1lbnQ7IC8vIE5vdCBudWxsLCBkZWZhdWx0cyB0byBEeW5hbWljVHlwZS4KICBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zOwoKICBMaXN0TGl0ZXJhbCh0aGlzLmV4cHJlc3Npb25zLAogICAgICB7dGhpcy50eXBlQXJndW1lbnQ6IGNvbnN0IER5bmFtaWNUeXBlKCksIHRoaXMuaXNDb25zdDogZmFsc2V9KSB7CiAgICBhc3NlcnQodHlwZUFyZ3VtZW50ICE9IG51bGwpOwogICAgc2V0UGFyZW50cyhleHByZXNzaW9ucywgdGhpcyk7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgewogICAgcmV0dXJuIHR5cGVzLmxpdGVyYWxMaXN0VHlwZSh0eXBlQXJndW1lbnQpOwogIH0KCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRMaXN0TGl0ZXJhbCh0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRMaXN0TGl0ZXJhbCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdHlwZUFyZ3VtZW50Py5hY2NlcHQodik7CiAgICB2aXNpdExpc3QoZXhwcmVzc2lvbnMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHlwZUFyZ3VtZW50ID0gdi52aXNpdERhcnRUeXBlKHR5cGVBcmd1bWVudCk7CiAgICB0cmFuc2Zvcm1MaXN0KGV4cHJlc3Npb25zLCB2LCB0aGlzKTsKICB9Cn0KCmNsYXNzIFNldExpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBib29sIGlzQ29uc3Q7CiAgRGFydFR5cGUgdHlwZUFyZ3VtZW50OyAvLyBOb3QgbnVsbCwgZGVmYXVsdHMgdG8gRHluYW1pY1R5cGUuCiAgZmluYWwgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9uczsKCiAgU2V0TGl0ZXJhbCh0aGlzLmV4cHJlc3Npb25zLAogICAgICB7dGhpcy50eXBlQXJndW1lbnQ6IGNvbnN0IER5bmFtaWNUeXBlKCksIHRoaXMuaXNDb25zdDogZmFsc2V9KSB7CiAgICBhc3NlcnQodHlwZUFyZ3VtZW50ICE9IG51bGwpOwogICAgc2V0UGFyZW50cyhleHByZXNzaW9ucywgdGhpcyk7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgewogICAgcmV0dXJuIHR5cGVzLmxpdGVyYWxTZXRUeXBlKHR5cGVBcmd1bWVudCk7CiAgfQoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdFNldExpdGVyYWwodGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0U2V0TGl0ZXJhbCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdHlwZUFyZ3VtZW50Py5hY2NlcHQodik7CiAgICB2aXNpdExpc3QoZXhwcmVzc2lvbnMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHlwZUFyZ3VtZW50ID0gdi52aXNpdERhcnRUeXBlKHR5cGVBcmd1bWVudCk7CiAgICB0cmFuc2Zvcm1MaXN0KGV4cHJlc3Npb25zLCB2LCB0aGlzKTsKICB9Cn0KCmNsYXNzIE1hcExpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBib29sIGlzQ29uc3Q7CiAgRGFydFR5cGUga2V5VHlwZTsgLy8gTm90IG51bGwsIGRlZmF1bHRzIHRvIER5bmFtaWNUeXBlLgogIERhcnRUeXBlIHZhbHVlVHlwZTsgLy8gTm90IG51bGwsIGRlZmF1bHRzIHRvIER5bmFtaWNUeXBlLgogIGZpbmFsIExpc3Q8TWFwRW50cnk+IGVudHJpZXM7CgogIE1hcExpdGVyYWwodGhpcy5lbnRyaWVzLAogICAgICB7dGhpcy5rZXlUeXBlOiBjb25zdCBEeW5hbWljVHlwZSgpLAogICAgICB0aGlzLnZhbHVlVHlwZTogY29uc3QgRHluYW1pY1R5cGUoKSwKICAgICAgdGhpcy5pc0NvbnN0OiBmYWxzZX0pIHsKICAgIGFzc2VydChrZXlUeXBlICE9IG51bGwpOwogICAgYXNzZXJ0KHZhbHVlVHlwZSAhPSBudWxsKTsKICAgIHNldFBhcmVudHMoZW50cmllcywgdGhpcyk7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgewogICAgcmV0dXJuIHR5cGVzLmxpdGVyYWxNYXBUeXBlKGtleVR5cGUsIHZhbHVlVHlwZSk7CiAgfQoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdE1hcExpdGVyYWwodGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0TWFwTGl0ZXJhbCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAga2V5VHlwZT8uYWNjZXB0KHYpOwogICAgdmFsdWVUeXBlPy5hY2NlcHQodik7CiAgICB2aXNpdExpc3QoZW50cmllcywgdik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBrZXlUeXBlID0gdi52aXNpdERhcnRUeXBlKGtleVR5cGUpOwogICAgdmFsdWVUeXBlID0gdi52aXNpdERhcnRUeXBlKHZhbHVlVHlwZSk7CiAgICB0cmFuc2Zvcm1MaXN0KGVudHJpZXMsIHYsIHRoaXMpOwogIH0KfQoKY2xhc3MgTWFwRW50cnkgZXh0ZW5kcyBUcmVlTm9kZSB7CiAgRXhwcmVzc2lvbiBrZXk7CiAgRXhwcmVzc2lvbiB2YWx1ZTsKCiAgTWFwRW50cnkodGhpcy5rZXksIHRoaXMudmFsdWUpIHsKICAgIGtleT8ucGFyZW50ID0gdGhpczsKICAgIHZhbHVlPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgYWNjZXB0KFRyZWVWaXNpdG9yIHYpID0+IHYudmlzaXRNYXBFbnRyeSh0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGtleT8uYWNjZXB0KHYpOwogICAgdmFsdWU/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChrZXkgIT0gbnVsbCkgewogICAgICBrZXkgPSBrZXkuYWNjZXB0KHYpOwogICAgICBrZXk/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICB2YWx1ZSA9IHZhbHVlLmFjY2VwdCh2KTsKICAgICAgdmFsdWU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gRXhwcmVzc2lvbiBvZiBmb3JtIGBhd2FpdCB4YC4KY2xhc3MgQXdhaXRFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgRXhwcmVzc2lvbiBvcGVyYW5kOwoKICBBd2FpdEV4cHJlc3Npb24odGhpcy5vcGVyYW5kKSB7CiAgICBvcGVyYW5kPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpIHsKICAgIHJldHVybiB0eXBlcy51bmZ1dHVyZVR5cGUob3BlcmFuZC5nZXRTdGF0aWNUeXBlKHR5cGVzKSk7CiAgfQoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdEF3YWl0RXhwcmVzc2lvbih0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRBd2FpdEV4cHJlc3Npb24odGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIG9wZXJhbmQ/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChvcGVyYW5kICE9IG51bGwpIHsKICAgICAgb3BlcmFuZCA9IG9wZXJhbmQuYWNjZXB0KHYpOwogICAgICBvcGVyYW5kPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEV4cHJlc3Npb24gb2YgZm9ybSBgKHgseSkgPT4gLi4uYCBvciBgKHgseSkgeyAuLi4gfWAKLy8vCi8vLyBUaGUgYXJyb3ctYm9keSBmb3JtIGA9PiBlYCBpcyBkZXN1Z2FyZWQgaW50byBgcmV0dXJuIGU7YC4KY2xhc3MgRnVuY3Rpb25FeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uOwoKICBGdW5jdGlvbkV4cHJlc3Npb24odGhpcy5mdW5jdGlvbikgewogICAgZnVuY3Rpb24/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gZnVuY3Rpb24uZnVuY3Rpb25UeXBlOwoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbih0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRGdW5jdGlvbkV4cHJlc3Npb24odGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGZ1bmN0aW9uPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoZnVuY3Rpb24gIT0gbnVsbCkgewogICAgICBmdW5jdGlvbiA9IGZ1bmN0aW9uLmFjY2VwdCh2KTsKICAgICAgZnVuY3Rpb24/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgpjbGFzcyBDb25zdGFudEV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBDb25zdGFudCBjb25zdGFudDsKICBEYXJ0VHlwZSB0eXBlOwoKICBDb25zdGFudEV4cHJlc3Npb24odGhpcy5jb25zdGFudCwgW3RoaXMudHlwZSA9IGNvbnN0IER5bmFtaWNUeXBlKCldKSB7CiAgICBhc3NlcnQoY29uc3RhbnQgIT0gbnVsbCk7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gdHlwZTsKCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRDb25zdGFudEV4cHJlc3Npb24odGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0Q29uc3RhbnRFeHByZXNzaW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBjb25zdGFudD8uYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgdHlwZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgY29uc3RhbnQgPSB2LnZpc2l0Q29uc3RhbnQoY29uc3RhbnQpOwogICAgdHlwZSA9IHYudmlzaXREYXJ0VHlwZSh0eXBlKTsKICB9Cn0KCi8vLyBTeW50aGV0aWMgZXhwcmVzc2lvbiBvZiBmb3JtIGBsZXQgdiA9IHggaW4geWAKY2xhc3MgTGV0IGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZTsgLy8gTXVzdCBoYXZlIGFuIGluaXRpYWxpemVyLgogIEV4cHJlc3Npb24gYm9keTsKCiAgTGV0KHRoaXMudmFyaWFibGUsIHRoaXMuYm9keSkgewogICAgdmFyaWFibGU/LnBhcmVudCA9IHRoaXM7CiAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpID0+IGJvZHkuZ2V0U3RhdGljVHlwZSh0eXBlcyk7CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0TGV0KHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdExldCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdmFyaWFibGU/LmFjY2VwdCh2KTsKICAgIGJvZHk/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmICh2YXJpYWJsZSAhPSBudWxsKSB7CiAgICAgIHZhcmlhYmxlID0gdmFyaWFibGUuYWNjZXB0KHYpOwogICAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgYm9keSA9IGJvZHkuYWNjZXB0KHYpOwogICAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKY2xhc3MgQmxvY2tFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgQmxvY2sgYm9keTsKICBFeHByZXNzaW9uIHZhbHVlOwoKICBCbG9ja0V4cHJlc3Npb24odGhpcy5ib2R5LCB0aGlzLnZhbHVlKSB7CiAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogICAgdmFsdWU/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gdmFsdWUuZ2V0U3RhdGljVHlwZSh0eXBlcyk7CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0QmxvY2tFeHByZXNzaW9uKHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdEJsb2NrRXhwcmVzc2lvbih0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgYm9keT8uYWNjZXB0KHYpOwogICAgdmFsdWU/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgYm9keSA9IGJvZHkuYWNjZXB0KHYpOwogICAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgdmFsdWUgPSB2YWx1ZS5hY2NlcHQodik7CiAgICAgIHZhbHVlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgbGlicmFyeSByZWZlcnJlZCB0byBieSBhIGRlZmVycmVkIGltcG9ydC4KLy8vCi8vLyBUaGlzIGluc3RydWN0aW9uIGlzIGNvbmNlcm5lZCB3aXRoOgovLy8gLSBrZWVwaW5nIHRyYWNrIHdoZXRoZXIgdGhlIGRlZmVycmVkIGltcG9ydCBpcyBtYXJrZWQgYXMgJ2xvYWRlZCcKLy8vIC0ga2VlcGluZyB0cmFjayBvZiB3aGV0aGVyIHRoZSBsaWJyYXJ5IGNvZGUgaGFzIGFscmVhZHkgYmVlbiBkb3dubG9hZGVkCi8vLyAtIGFjdHVhbGx5IGRvd25sb2FkaW5nIGFuZCBsaW5raW5nIHRoZSBsaWJyYXJ5Ci8vLwovLy8gU2hvdWxkIHJldHVybiBhIGZ1dHVyZS4gIFRoZSB2YWx1ZSBpbiB0aGlzIGZ1dHVyZSB3aWxsIGJlIHRoZSBzYW1lIHZhbHVlCi8vLyBzZWVuIGJ5IGNhbGxlcnMgb2YgYGxvYWRMaWJyYXJ5YCBmdW5jdGlvbnMuCi8vLwovLy8gT24gYmFja2VuZHMgdGhhdCBsaW5rIHRoZSBlbnRpcmUgcHJvZ3JhbSBlYWdlcmx5LCB0aGlzIGluc3RydWN0aW9uIG5lZWRzCi8vLyB0byBtYXJrIHRoZSBkZWZlcnJlZCBpbXBvcnQgYXMgJ2xvYWRlZCcgYW5kIHJldHVybiBhIGZ1dHVyZS4KY2xhc3MgTG9hZExpYnJhcnkgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICAvLy8gUmVmZXJlbmNlIHRvIGEgZGVmZXJyZWQgaW1wb3J0IGluIHRoZSBlbmNsb3NpbmcgbGlicmFyeS4KICBMaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQ7CgogIExvYWRMaWJyYXJ5KHRoaXMuaW1wb3J0KTsKCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpIHsKICAgIHJldHVybiB0eXBlcy5mdXR1cmVUeXBlKGNvbnN0IER5bmFtaWNUeXBlKCkpOwogIH0KCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRMb2FkTGlicmFyeSh0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRMb2FkTGlicmFyeSh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdikge30KICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7fQp9CgovLy8gQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIGRlZmVycmVkIGltcG9ydCBoYXMgYmVlbiBtYXJrZWQgYXMgJ2xvYWRlZCcuCmNsYXNzIENoZWNrTGlicmFyeUlzTG9hZGVkIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgLy8vIFJlZmVyZW5jZSB0byBhIGRlZmVycmVkIGltcG9ydCBpbiB0aGUgZW5jbG9zaW5nIGxpYnJhcnkuCiAgTGlicmFyeURlcGVuZGVuY3kgaW1wb3J0OwoKICBDaGVja0xpYnJhcnlJc0xvYWRlZCh0aGlzLmltcG9ydCk7CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSB7CiAgICByZXR1cm4gdHlwZXMub2JqZWN0VHlwZTsKICB9CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0Q2hlY2tMaWJyYXJ5SXNMb2FkZWQodGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0Q2hlY2tMaWJyYXJ5SXNMb2FkZWQodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHt9CiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikge30KfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBVEVNRU5UUwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkBjb3EKYWJzdHJhY3QgY2xhc3MgU3RhdGVtZW50IGV4dGVuZHMgVHJlZU5vZGUgewogIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yIHYpOwogIGFjY2VwdDEoU3RhdGVtZW50VmlzaXRvcjEgdiwgYXJnKTsKfQoKQGNvcQpjbGFzcyBFeHByZXNzaW9uU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKICBFeHByZXNzaW9uIGV4cHJlc3Npb247CgogIEV4cHJlc3Npb25TdGF0ZW1lbnQodGhpcy5leHByZXNzaW9uKSB7CiAgICBleHByZXNzaW9uPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgYWNjZXB0KFN0YXRlbWVudFZpc2l0b3IgdikgPT4gdi52aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQodGhpcyk7CiAgYWNjZXB0MShTdGF0ZW1lbnRWaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBleHByZXNzaW9uPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoZXhwcmVzc2lvbiAhPSBudWxsKSB7CiAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLmFjY2VwdCh2KTsKICAgICAgZXhwcmVzc2lvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCkBjb3EKY2xhc3MgQmxvY2sgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIGZpbmFsIExpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzOwoKICBCbG9jayh0aGlzLnN0YXRlbWVudHMpIHsKICAgIC8vIEVuc3VyZSBzdGF0ZW1lbnRzIGlzIG11dGFibGUuCiAgICBhc3NlcnQoKHN0YXRlbWVudHMKICAgICAgICAgIC4uYWRkKG51bGwpCiAgICAgICAgICAuLnJlbW92ZUxhc3QoKSkgIT0KICAgICAgICBudWxsKTsKICAgIHNldFBhcmVudHMoc3RhdGVtZW50cywgdGhpcyk7CiAgfQoKICBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciB2KSA9PiB2LnZpc2l0QmxvY2sodGhpcyk7CiAgYWNjZXB0MShTdGF0ZW1lbnRWaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRCbG9jayh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdmlzaXRMaXN0KHN0YXRlbWVudHMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChzdGF0ZW1lbnRzLCB2LCB0aGlzKTsKICB9CgogIHZvaWQgYWRkU3RhdGVtZW50KFN0YXRlbWVudCBub2RlKSB7CiAgICBzdGF0ZW1lbnRzLmFkZChub2RlKTsKICAgIG5vZGUucGFyZW50ID0gdGhpczsKICB9Cn0KCi8vLyBBIGJsb2NrIHRoYXQgaXMgb25seSBleGVjdXRlZCB3aGVuIGFzc2VydHMgYXJlIGVuYWJsZWQuCi8vLwovLy8gU29tZXRpbWVzIGFyYml0cmFyeSBzdGF0ZW1lbnRzIG11c3QgYmUgZ3VhcmRlZCBieSB3aGV0aGVyIGFzc2VydHMgYXJlCi8vLyBlbmFibGVkLiAgRm9yIGV4YW1wbGUsIHdoZW4gYSBzdWJleHByZXNzaW9uIG9mIGFuIGFzc2VydCBpbiBhc3luYyBjb2RlIGlzCi8vLyBsaW5lYXJpemVkIGFuZCBuYW1lZCwgaXQgY2FuIHByb2R1Y2Ugc3VjaCBhIGJsb2NrIG9mIHN0YXRlbWVudHMuCmNsYXNzIEFzc2VydEJsb2NrIGV4dGVuZHMgU3RhdGVtZW50IHsKICBmaW5hbCBMaXN0PFN0YXRlbWVudD4gc3RhdGVtZW50czsKCiAgQXNzZXJ0QmxvY2sodGhpcy5zdGF0ZW1lbnRzKSB7CiAgICAvLyBFbnN1cmUgc3RhdGVtZW50cyBpcyBtdXRhYmxlLgogICAgYXNzZXJ0KChzdGF0ZW1lbnRzCiAgICAgICAgICAuLmFkZChudWxsKQogICAgICAgICAgLi5yZW1vdmVMYXN0KCkpICE9CiAgICAgICAgbnVsbCk7CiAgICBzZXRQYXJlbnRzKHN0YXRlbWVudHMsIHRoaXMpOwogIH0KCiAgYWNjZXB0KFN0YXRlbWVudFZpc2l0b3IgdikgPT4gdi52aXNpdEFzc2VydEJsb2NrKHRoaXMpOwogIGFjY2VwdDEoU3RhdGVtZW50VmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0QXNzZXJ0QmxvY2sodGhpcywgYXJnKTsKCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChzdGF0ZW1lbnRzLCB2LCB0aGlzKTsKICB9CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3Qoc3RhdGVtZW50cywgdik7CiAgfQoKICB2b2lkIGFkZFN0YXRlbWVudChTdGF0ZW1lbnQgbm9kZSkgewogICAgc3RhdGVtZW50cy5hZGQobm9kZSk7CiAgICBub2RlLnBhcmVudCA9IHRoaXM7CiAgfQp9CgpjbGFzcyBFbXB0eVN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CiAgYWNjZXB0KFN0YXRlbWVudFZpc2l0b3IgdikgPT4gdi52aXNpdEVtcHR5U3RhdGVtZW50KHRoaXMpOwogIGFjY2VwdDEoU3RhdGVtZW50VmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0RW1wdHlTdGF0ZW1lbnQodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHt9CiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikge30KfQoKY2xhc3MgQXNzZXJ0U3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKICBFeHByZXNzaW9uIGNvbmRpdGlvbjsKICBFeHByZXNzaW9uIG1lc3NhZ2U7IC8vIE1heSBiZSBudWxsLgogIGludCBjb25kaXRpb25TdGFydE9mZnNldDsKICBpbnQgY29uZGl0aW9uRW5kT2Zmc2V0OwoKICBBc3NlcnRTdGF0ZW1lbnQodGhpcy5jb25kaXRpb24sCiAgICAgIHt0aGlzLm1lc3NhZ2UsIHRoaXMuY29uZGl0aW9uU3RhcnRPZmZzZXQsIHRoaXMuY29uZGl0aW9uRW5kT2Zmc2V0fSkgewogICAgY29uZGl0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgbWVzc2FnZT8ucGFyZW50ID0gdGhpczsKICB9CgogIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yIHYpID0+IHYudmlzaXRBc3NlcnRTdGF0ZW1lbnQodGhpcyk7CiAgYWNjZXB0MShTdGF0ZW1lbnRWaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRBc3NlcnRTdGF0ZW1lbnQodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGNvbmRpdGlvbj8uYWNjZXB0KHYpOwogICAgbWVzc2FnZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGNvbmRpdGlvbiAhPSBudWxsKSB7CiAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbi5hY2NlcHQodik7CiAgICAgIGNvbmRpdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UuYWNjZXB0KHYpOwogICAgICBtZXNzYWdlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEEgdGFyZ2V0IG9mIGEgW0JyZWFrXSBzdGF0ZW1lbnQuCi8vLwovLy8gVGhlIGxhYmVsIGl0c2VsZiBoYXMgbm8gbmFtZTsgYnJlYWtzIHJlZmVyZW5jZSB0aGUgc3RhdGVtZW50IGRpcmVjdGx5LgovLy8KLy8vIFRoZSBmcm9udGVuZCBkb2VzIG5vdCBnZW5lcmF0ZSBsYWJlbGVkIHN0YXRlbWVudHMgd2l0aG91dCB1c2VzLgpjbGFzcyBMYWJlbGVkU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKICBTdGF0ZW1lbnQgYm9keTsKCiAgTGFiZWxlZFN0YXRlbWVudCh0aGlzLmJvZHkpIHsKICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciB2KSA9PiB2LnZpc2l0TGFiZWxlZFN0YXRlbWVudCh0aGlzKTsKICBhY2NlcHQxKFN0YXRlbWVudFZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdExhYmVsZWRTdGF0ZW1lbnQodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGJvZHk/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgYm9keSA9IGJvZHkuYWNjZXB0KHYpOwogICAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEJyZWFrcyBvdXQgb2YgYW4gZW5jbG9zaW5nIFtMYWJlbGVkU3RhdGVtZW50XS4KLy8vCi8vLyBCb3RoIGBicmVha2AgYW5kIGxvb3AgYGNvbnRpbnVlYCBzdGF0ZW1lbnRzIGFyZSB0cmFuc2xhdGVkIGludG8gdGhpcyBub2RlLgovLy8KLy8vIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGxvb3Agd2l0aCBhIGBjb250aW51ZWAgd2lsbCBiZSBkZXN1Z2FyZWQ6Ci8vLwovLy8gICAgIHdoaWxlKHgpIHsKLy8vICAgICAgIGlmICh5KSBjb250aW51ZTsKLy8vICAgICAgIEJPRFknCi8vLyAgICAgfQovLy8KLy8vICAgICA9PT4KLy8vCi8vLyAgICAgd2hpbGUoeCkgewovLy8gICAgICAgTDogewovLy8gICAgICAgICBpZiAoeSkgYnJlYWsgTDsKLy8vICAgICAgICAgQk9EWScKLy8vICAgICAgIH0KLy8vICAgICB9Ci8vCmNsYXNzIEJyZWFrU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKICBMYWJlbGVkU3RhdGVtZW50IHRhcmdldDsKCiAgQnJlYWtTdGF0ZW1lbnQodGhpcy50YXJnZXQpOwoKICBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciB2KSA9PiB2LnZpc2l0QnJlYWtTdGF0ZW1lbnQodGhpcyk7CiAgYWNjZXB0MShTdGF0ZW1lbnRWaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRCcmVha1N0YXRlbWVudCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdikge30KICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7fQp9CgpjbGFzcyBXaGlsZVN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CiAgRXhwcmVzc2lvbiBjb25kaXRpb247CiAgU3RhdGVtZW50IGJvZHk7CgogIFdoaWxlU3RhdGVtZW50KHRoaXMuY29uZGl0aW9uLCB0aGlzLmJvZHkpIHsKICAgIGNvbmRpdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciB2KSA9PiB2LnZpc2l0V2hpbGVTdGF0ZW1lbnQodGhpcyk7CiAgYWNjZXB0MShTdGF0ZW1lbnRWaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRXaGlsZVN0YXRlbWVudCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgY29uZGl0aW9uPy5hY2NlcHQodik7CiAgICBib2R5Py5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoY29uZGl0aW9uICE9IG51bGwpIHsKICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uLmFjY2VwdCh2KTsKICAgICAgY29uZGl0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKGJvZHkgIT0gbnVsbCkgewogICAgICBib2R5ID0gYm9keS5hY2NlcHQodik7CiAgICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgpjbGFzcyBEb1N0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CiAgU3RhdGVtZW50IGJvZHk7CiAgRXhwcmVzc2lvbiBjb25kaXRpb247CgogIERvU3RhdGVtZW50KHRoaXMuYm9keSwgdGhpcy5jb25kaXRpb24pIHsKICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgICBjb25kaXRpb24/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciB2KSA9PiB2LnZpc2l0RG9TdGF0ZW1lbnQodGhpcyk7CiAgYWNjZXB0MShTdGF0ZW1lbnRWaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXREb1N0YXRlbWVudCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgYm9keT8uYWNjZXB0KHYpOwogICAgY29uZGl0aW9uPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgIGJvZHkgPSBib2R5LmFjY2VwdCh2KTsKICAgICAgYm9keT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChjb25kaXRpb24gIT0gbnVsbCkgewogICAgICBjb25kaXRpb24gPSBjb25kaXRpb24uYWNjZXB0KHYpOwogICAgICBjb25kaXRpb24/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgpjbGFzcyBGb3JTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIGZpbmFsIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gdmFyaWFibGVzOyAvLyBNYXkgYmUgZW1wdHksIGJ1dCBub3QgbnVsbC4KICBFeHByZXNzaW9uIGNvbmRpdGlvbjsgLy8gTWF5IGJlIG51bGwuCiAgZmluYWwgTGlzdDxFeHByZXNzaW9uPiB1cGRhdGVzOyAvLyBNYXkgYmUgZW1wdHksIGJ1dCBub3QgbnVsbC4KICBTdGF0ZW1lbnQgYm9keTsKCiAgRm9yU3RhdGVtZW50KHRoaXMudmFyaWFibGVzLCB0aGlzLmNvbmRpdGlvbiwgdGhpcy51cGRhdGVzLCB0aGlzLmJvZHkpIHsKICAgIHNldFBhcmVudHModmFyaWFibGVzLCB0aGlzKTsKICAgIGNvbmRpdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIHNldFBhcmVudHModXBkYXRlcywgdGhpcyk7CiAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogIH0KCiAgYWNjZXB0KFN0YXRlbWVudFZpc2l0b3IgdikgPT4gdi52aXNpdEZvclN0YXRlbWVudCh0aGlzKTsKICBhY2NlcHQxKFN0YXRlbWVudFZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdEZvclN0YXRlbWVudCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdmlzaXRMaXN0KHZhcmlhYmxlcywgdik7CiAgICBjb25kaXRpb24/LmFjY2VwdCh2KTsKICAgIHZpc2l0TGlzdCh1cGRhdGVzLCB2KTsKICAgIGJvZHk/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIHRyYW5zZm9ybUxpc3QodmFyaWFibGVzLCB2LCB0aGlzKTsKICAgIGlmIChjb25kaXRpb24gIT0gbnVsbCkgewogICAgICBjb25kaXRpb24gPSBjb25kaXRpb24uYWNjZXB0KHYpOwogICAgICBjb25kaXRpb24/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICB0cmFuc2Zvcm1MaXN0KHVwZGF0ZXMsIHYsIHRoaXMpOwogICAgaWYgKGJvZHkgIT0gbnVsbCkgewogICAgICBib2R5ID0gYm9keS5hY2NlcHQodik7CiAgICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgpjbGFzcyBGb3JJblN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CiAgLy8vIE9mZnNldCBpbiB0aGUgc291cmNlIGZpbGUgaXQgY29tZXMgZnJvbS4KICAvLy8KICAvLy8gVmFsaWQgdmFsdWVzIGFyZSBmcm9tIDAgYW5kIHVwLCBvciAtMSAoW1RyZWVOb2RlLm5vT2Zmc2V0XSkgaWYgdGhlIGZpbGUKICAvLy8gb2Zmc2V0IGlzIG5vdCBhdmFpbGFibGUgKHRoaXMgaXMgdGhlIGRlZmF1bHQgaWYgbm9uZSBpcyBzcGVjaWZpY2FsbHkgc2V0KS4KICBpbnQgYm9keU9mZnNldCA9IFRyZWVOb2RlLm5vT2Zmc2V0OwoKICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlOyAvLyBIYXMgbm8gaW5pdGlhbGl6ZXIuCiAgRXhwcmVzc2lvbiBpdGVyYWJsZTsKICBTdGF0ZW1lbnQgYm9keTsKICBib29sIGlzQXN5bmM7IC8vIFRydWUgaWYgdGhpcyBpcyBhbiAnYXdhaXQgZm9yJyBsb29wLgoKICBGb3JJblN0YXRlbWVudCh0aGlzLnZhcmlhYmxlLCB0aGlzLml0ZXJhYmxlLCB0aGlzLmJvZHksCiAgICAgIHt0aGlzLmlzQXN5bmM6IGZhbHNlfSkgewogICAgdmFyaWFibGU/LnBhcmVudCA9IHRoaXM7CiAgICBpdGVyYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciB2KSA9PiB2LnZpc2l0Rm9ySW5TdGF0ZW1lbnQodGhpcyk7CiAgYWNjZXB0MShTdGF0ZW1lbnRWaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRGb3JJblN0YXRlbWVudCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdmFyaWFibGU/LmFjY2VwdCh2KTsKICAgIGl0ZXJhYmxlPy5hY2NlcHQodik7CiAgICBib2R5Py5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAodmFyaWFibGUgIT0gbnVsbCkgewogICAgICB2YXJpYWJsZSA9IHZhcmlhYmxlLmFjY2VwdCh2KTsKICAgICAgdmFyaWFibGU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAoaXRlcmFibGUgIT0gbnVsbCkgewogICAgICBpdGVyYWJsZSA9IGl0ZXJhYmxlLmFjY2VwdCh2KTsKICAgICAgaXRlcmFibGU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgIGJvZHkgPSBib2R5LmFjY2VwdCh2KTsKICAgICAgYm9keT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBTdGF0ZW1lbnQgb2YgZm9ybSBgc3dpdGNoIChlKSB7IGNhc2UgeDogLi4uIH1gLgovLy8KLy8vIEFkamFjZW50IGNhc2UgY2xhdXNlcyBoYXZlIGJlZW4gbWVyZ2VkIGludG8gYSBzaW5nbGUgW1N3aXRjaENhc2VdLiBBIHJ1bnRpbWUKLy8vIGV4Y2VwdGlvbiBtdXN0IGJlIHRocm93biBpZiBvbmUgW1N3aXRjaENhc2VdIGZhbGxzIHRocm91Z2ggdG8gYW5vdGhlciBjYXNlLgpjbGFzcyBTd2l0Y2hTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKICBmaW5hbCBMaXN0PFN3aXRjaENhc2U+IGNhc2VzOwoKICBTd2l0Y2hTdGF0ZW1lbnQodGhpcy5leHByZXNzaW9uLCB0aGlzLmNhc2VzKSB7CiAgICBleHByZXNzaW9uPy5wYXJlbnQgPSB0aGlzOwogICAgc2V0UGFyZW50cyhjYXNlcywgdGhpcyk7CiAgfQoKICBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciB2KSA9PiB2LnZpc2l0U3dpdGNoU3RhdGVtZW50KHRoaXMpOwogIGFjY2VwdDEoU3RhdGVtZW50VmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0U3dpdGNoU3RhdGVtZW50KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBleHByZXNzaW9uPy5hY2NlcHQodik7CiAgICB2aXNpdExpc3QoY2FzZXMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkgewogICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5hY2NlcHQodik7CiAgICAgIGV4cHJlc3Npb24/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICB0cmFuc2Zvcm1MaXN0KGNhc2VzLCB2LCB0aGlzKTsKICB9Cn0KCi8vLyBBIGdyb3VwIG9mIGBjYXNlYCBjbGF1c2VzIGFuZC9vciBhIGBkZWZhdWx0YCBjbGF1c2UuCi8vLwovLy8gVGhpcyBpcyBhIHBvdGVudGlhbCB0YXJnZXQgb2YgW0NvbnRpbnVlU3dpdGNoU3RhdGVtZW50XS4KY2xhc3MgU3dpdGNoQ2FzZSBleHRlbmRzIFRyZWVOb2RlIHsKICBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zOwogIGZpbmFsIExpc3Q8aW50PiBleHByZXNzaW9uT2Zmc2V0czsKICBTdGF0ZW1lbnQgYm9keTsKICBib29sIGlzRGVmYXVsdDsKCiAgU3dpdGNoQ2FzZSh0aGlzLmV4cHJlc3Npb25zLCB0aGlzLmV4cHJlc3Npb25PZmZzZXRzLCB0aGlzLmJvZHksCiAgICAgIHt0aGlzLmlzRGVmYXVsdDogZmFsc2V9KSB7CiAgICBzZXRQYXJlbnRzKGV4cHJlc3Npb25zLCB0aGlzKTsKICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBTd2l0Y2hDYXNlLmRlZmF1bHRDYXNlKHRoaXMuYm9keSkKICAgICAgOiBpc0RlZmF1bHQgPSB0cnVlLAogICAgICAgIGV4cHJlc3Npb25zID0gPEV4cHJlc3Npb24+W10sCiAgICAgICAgZXhwcmVzc2lvbk9mZnNldHMgPSA8aW50PltdIHsKICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBTd2l0Y2hDYXNlLmVtcHR5KCkKICAgICAgOiBleHByZXNzaW9ucyA9IDxFeHByZXNzaW9uPltdLAogICAgICAgIGV4cHJlc3Npb25PZmZzZXRzID0gPGludD5bXSwKICAgICAgICBib2R5ID0gbnVsbCwKICAgICAgICBpc0RlZmF1bHQgPSBmYWxzZTsKCiAgYWNjZXB0KFRyZWVWaXNpdG9yIHYpID0+IHYudmlzaXRTd2l0Y2hDYXNlKHRoaXMpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdmlzaXRMaXN0KGV4cHJlc3Npb25zLCB2KTsKICAgIGJvZHk/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIHRyYW5zZm9ybUxpc3QoZXhwcmVzc2lvbnMsIHYsIHRoaXMpOwogICAgaWYgKGJvZHkgIT0gbnVsbCkgewogICAgICBib2R5ID0gYm9keS5hY2NlcHQodik7CiAgICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gSnVtcCB0byBhIGNhc2UgaW4gYW4gZW5jbG9zaW5nIHN3aXRjaC4KY2xhc3MgQ29udGludWVTd2l0Y2hTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIFN3aXRjaENhc2UgdGFyZ2V0OwoKICBDb250aW51ZVN3aXRjaFN0YXRlbWVudCh0aGlzLnRhcmdldCk7CgogIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yIHYpID0+IHYudmlzaXRDb250aW51ZVN3aXRjaFN0YXRlbWVudCh0aGlzKTsKICBhY2NlcHQxKFN0YXRlbWVudFZpc2l0b3IxIHYsIGFyZykgPT4KICAgICAgdi52aXNpdENvbnRpbnVlU3dpdGNoU3RhdGVtZW50KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHt9Cn0KCmNsYXNzIElmU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKICBFeHByZXNzaW9uIGNvbmRpdGlvbjsKICBTdGF0ZW1lbnQgdGhlbjsKICBTdGF0ZW1lbnQgb3RoZXJ3aXNlOwoKICBJZlN0YXRlbWVudCh0aGlzLmNvbmRpdGlvbiwgdGhpcy50aGVuLCB0aGlzLm90aGVyd2lzZSkgewogICAgY29uZGl0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgdGhlbj8ucGFyZW50ID0gdGhpczsKICAgIG90aGVyd2lzZT8ucGFyZW50ID0gdGhpczsKICB9CgogIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yIHYpID0+IHYudmlzaXRJZlN0YXRlbWVudCh0aGlzKTsKICBhY2NlcHQxKFN0YXRlbWVudFZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdElmU3RhdGVtZW50KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBjb25kaXRpb24/LmFjY2VwdCh2KTsKICAgIHRoZW4/LmFjY2VwdCh2KTsKICAgIG90aGVyd2lzZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGNvbmRpdGlvbiAhPSBudWxsKSB7CiAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbi5hY2NlcHQodik7CiAgICAgIGNvbmRpdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmICh0aGVuICE9IG51bGwpIHsKICAgICAgdGhlbiA9IHRoZW4uYWNjZXB0KHYpOwogICAgICB0aGVuPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKG90aGVyd2lzZSAhPSBudWxsKSB7CiAgICAgIG90aGVyd2lzZSA9IG90aGVyd2lzZS5hY2NlcHQodik7CiAgICAgIG90aGVyd2lzZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCkBjb3EKY2xhc3MgUmV0dXJuU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKICBFeHByZXNzaW9uIGV4cHJlc3Npb247IC8vIE1heSBiZSBudWxsLgoKICBSZXR1cm5TdGF0ZW1lbnQoW3RoaXMuZXhwcmVzc2lvbl0pIHsKICAgIGV4cHJlc3Npb24/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciB2KSA9PiB2LnZpc2l0UmV0dXJuU3RhdGVtZW50KHRoaXMpOwogIGFjY2VwdDEoU3RhdGVtZW50VmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0UmV0dXJuU3RhdGVtZW50KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBleHByZXNzaW9uPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoZXhwcmVzc2lvbiAhPSBudWxsKSB7CiAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLmFjY2VwdCh2KTsKICAgICAgZXhwcmVzc2lvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCmNsYXNzIFRyeUNhdGNoIGV4dGVuZHMgU3RhdGVtZW50IHsKICBTdGF0ZW1lbnQgYm9keTsKICBMaXN0PENhdGNoPiBjYXRjaGVzOwogIGJvb2wgaXNTeW50aGV0aWM7CgogIFRyeUNhdGNoKHRoaXMuYm9keSwgdGhpcy5jYXRjaGVzLCB7dGhpcy5pc1N5bnRoZXRpYzogZmFsc2V9KSB7CiAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogICAgc2V0UGFyZW50cyhjYXRjaGVzLCB0aGlzKTsKICB9CgogIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yIHYpID0+IHYudmlzaXRUcnlDYXRjaCh0aGlzKTsKICBhY2NlcHQxKFN0YXRlbWVudFZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdFRyeUNhdGNoKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBib2R5Py5hY2NlcHQodik7CiAgICB2aXNpdExpc3QoY2F0Y2hlcywgdik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgIGJvZHkgPSBib2R5LmFjY2VwdCh2KTsKICAgICAgYm9keT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIHRyYW5zZm9ybUxpc3QoY2F0Y2hlcywgdiwgdGhpcyk7CiAgfQp9CgpjbGFzcyBDYXRjaCBleHRlbmRzIFRyZWVOb2RlIHsKICBEYXJ0VHlwZSBndWFyZDsgLy8gTm90IG51bGwsIGRlZmF1bHRzIHRvIGR5bmFtaWMuCiAgVmFyaWFibGVEZWNsYXJhdGlvbiBleGNlcHRpb247IC8vIE1heSBiZSBudWxsLgogIFZhcmlhYmxlRGVjbGFyYXRpb24gc3RhY2tUcmFjZTsgLy8gTWF5IGJlIG51bGwuCiAgU3RhdGVtZW50IGJvZHk7CgogIENhdGNoKHRoaXMuZXhjZXB0aW9uLCB0aGlzLmJvZHksCiAgICAgIHt0aGlzLmd1YXJkOiBjb25zdCBEeW5hbWljVHlwZSgpLCB0aGlzLnN0YWNrVHJhY2V9KSB7CiAgICBhc3NlcnQoZ3VhcmQgIT0gbnVsbCk7CiAgICBleGNlcHRpb24/LnBhcmVudCA9IHRoaXM7CiAgICBzdGFja1RyYWNlPy5wYXJlbnQgPSB0aGlzOwogICAgYm9keT8ucGFyZW50ID0gdGhpczsKICB9CgogIGFjY2VwdChUcmVlVmlzaXRvciB2KSA9PiB2LnZpc2l0Q2F0Y2godGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBndWFyZD8uYWNjZXB0KHYpOwogICAgZXhjZXB0aW9uPy5hY2NlcHQodik7CiAgICBzdGFja1RyYWNlPy5hY2NlcHQodik7CiAgICBib2R5Py5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBndWFyZCA9IHYudmlzaXREYXJ0VHlwZShndWFyZCk7CiAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpIHsKICAgICAgZXhjZXB0aW9uID0gZXhjZXB0aW9uLmFjY2VwdCh2KTsKICAgICAgZXhjZXB0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHN0YWNrVHJhY2UgIT0gbnVsbCkgewogICAgICBzdGFja1RyYWNlID0gc3RhY2tUcmFjZS5hY2NlcHQodik7CiAgICAgIHN0YWNrVHJhY2U/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgIGJvZHkgPSBib2R5LmFjY2VwdCh2KTsKICAgICAgYm9keT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCmNsYXNzIFRyeUZpbmFsbHkgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIFN0YXRlbWVudCBib2R5OwogIFN0YXRlbWVudCBmaW5hbGl6ZXI7CgogIFRyeUZpbmFsbHkodGhpcy5ib2R5LCB0aGlzLmZpbmFsaXplcikgewogICAgYm9keT8ucGFyZW50ID0gdGhpczsKICAgIGZpbmFsaXplcj8ucGFyZW50ID0gdGhpczsKICB9CgogIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yIHYpID0+IHYudmlzaXRUcnlGaW5hbGx5KHRoaXMpOwogIGFjY2VwdDEoU3RhdGVtZW50VmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0VHJ5RmluYWxseSh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgYm9keT8uYWNjZXB0KHYpOwogICAgZmluYWxpemVyPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgIGJvZHkgPSBib2R5LmFjY2VwdCh2KTsKICAgICAgYm9keT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChmaW5hbGl6ZXIgIT0gbnVsbCkgewogICAgICBmaW5hbGl6ZXIgPSBmaW5hbGl6ZXIuYWNjZXB0KHYpOwogICAgICBmaW5hbGl6ZXI/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gU3RhdGVtZW50IG9mIGZvcm0gYHlpZWxkIHhgIG9yIGB5aWVsZCogeGAuCi8vLwovLy8gRm9yIG5hdGl2ZSB5aWVsZCBzZW1hbnRpY3Mgc2VlIGBBc3luY01hcmtlci5TeW5jWWllbGRpbmdgLgpjbGFzcyBZaWVsZFN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CiAgRXhwcmVzc2lvbiBleHByZXNzaW9uOwogIGludCBmbGFncyA9IDA7CgogIFlpZWxkU3RhdGVtZW50KHRoaXMuZXhwcmVzc2lvbiwKICAgICAge2Jvb2wgaXNZaWVsZFN0YXI6IGZhbHNlLCBib29sIGlzTmF0aXZlOiBmYWxzZX0pIHsKICAgIGV4cHJlc3Npb24/LnBhcmVudCA9IHRoaXM7CiAgICB0aGlzLmlzWWllbGRTdGFyID0gaXNZaWVsZFN0YXI7CiAgICB0aGlzLmlzTmF0aXZlID0gaXNOYXRpdmU7CiAgfQoKICBzdGF0aWMgY29uc3QgaW50IEZsYWdZaWVsZFN0YXIgPSAxIDw8IDA7CiAgc3RhdGljIGNvbnN0IGludCBGbGFnTmF0aXZlID0gMSA8PCAxOwoKICBib29sIGdldCBpc1lpZWxkU3RhciA9PiBmbGFncyAmIEZsYWdZaWVsZFN0YXIgIT0gMDsKICBib29sIGdldCBpc05hdGl2ZSA9PiBmbGFncyAmIEZsYWdOYXRpdmUgIT0gMDsKCiAgdm9pZCBzZXQgaXNZaWVsZFN0YXIoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZSA/IChmbGFncyB8IEZsYWdZaWVsZFN0YXIpIDogKGZsYWdzICYgfkZsYWdZaWVsZFN0YXIpOwogIH0KCiAgdm9pZCBzZXQgaXNOYXRpdmUoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZSA/IChmbGFncyB8IEZsYWdOYXRpdmUpIDogKGZsYWdzICYgfkZsYWdOYXRpdmUpOwogIH0KCiAgYWNjZXB0KFN0YXRlbWVudFZpc2l0b3IgdikgPT4gdi52aXNpdFlpZWxkU3RhdGVtZW50KHRoaXMpOwogIGFjY2VwdDEoU3RhdGVtZW50VmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0WWllbGRTdGF0ZW1lbnQodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGV4cHJlc3Npb24/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChleHByZXNzaW9uICE9IG51bGwpIHsKICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uYWNjZXB0KHYpOwogICAgICBleHByZXNzaW9uPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIERlY2xhcmF0aW9uIG9mIGEgbG9jYWwgdmFyaWFibGUuCi8vLwovLy8gVGhpcyBtYXkgb2NjdXIgYXMgYSBzdGF0ZW1lbnQsIGJ1dCBpcyBhbHNvIHVzZWQgaW4gc2V2ZXJhbCBub24tc3RhdGVtZW50Ci8vLyBjb250ZXh0cywgc3VjaCBhcyBpbiBbRm9yU3RhdGVtZW50XSwgW0NhdGNoXSwgYW5kIFtGdW5jdGlvbk5vZGVdLgovLy8KLy8vIFdoZW4gdGhpcyBvY2N1cnMgYXMgYSBzdGF0ZW1lbnQsIGl0IG11c3QgYmUgYSBkaXJlY3QgY2hpbGQgb2YgYSBbQmxvY2tdLgovLwovLyBERVNJR04gVE9ETzogU2hvdWxkIHdlIHJlbW92ZSB0aGUgJ2ZpbmFsJyBtb2RpZmllciBmcm9tIHZhcmlhYmxlcz8KQGNvcXJlZgpjbGFzcyBWYXJpYWJsZURlY2xhcmF0aW9uIGV4dGVuZHMgU3RhdGVtZW50IHsKICAvLy8gT2Zmc2V0IG9mIHRoZSBlcXVhbHMgc2lnbiBpbiB0aGUgc291cmNlIGZpbGUgaXQgY29tZXMgZnJvbS4KICAvLy8KICAvLy8gVmFsaWQgdmFsdWVzIGFyZSBmcm9tIDAgYW5kIHVwLCBvciAtMSAoW1RyZWVOb2RlLm5vT2Zmc2V0XSkKICAvLy8gaWYgdGhlIGVxdWFscyBzaWduIG9mZnNldCBpcyBub3QgYXZhaWxhYmxlIChlLmcuIGlmIG5vdCBpbml0aWFsaXplZCkKICAvLy8gKHRoaXMgaXMgdGhlIGRlZmF1bHQgaWYgbm9uZSBpcyBzcGVjaWZpY2FsbHkgc2V0KS4KICBpbnQgZmlsZUVxdWFsc09mZnNldCA9IFRyZWVOb2RlLm5vT2Zmc2V0OwoKICAvLy8gTGlzdCBvZiBtZXRhZGF0YSBhbm5vdGF0aW9ucyBvbiB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24uCiAgLy8vCiAgLy8vIFRoaXMgZGVmYXVsdHMgdG8gYW4gaW1tdXRhYmxlIGVtcHR5IGxpc3QuIFVzZSBbYWRkQW5ub3RhdGlvbl0gdG8gYWRkCiAgLy8vIGFubm90YXRpb25zIGlmIG5lZWRlZC4KICBMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zID0gY29uc3QgPEV4cHJlc3Npb24+W107CgogIC8vLyBGb3IgbmFtZWQgcGFyYW1ldGVycywgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyLiBObyB0d28gbmFtZWQKICAvLy8gcGFyYW1ldGVycyAoaW4gdGhlIHNhbWUgcGFyYW1ldGVyIGxpc3QpIGNhbiBoYXZlIHRoZSBzYW1lIG5hbWUuCiAgLy8vCiAgLy8vIEluIGFsbCBvdGhlciBjYXNlcywgdGhlIG5hbWUgaXMgY29zbWV0aWMsIG1heSBiZSBlbXB0eSBvciBudWxsLAogIC8vLyBhbmQgaXMgbm90IG5lY2Vzc2FyaWx5IHVuaXF1ZS4KICBTdHJpbmcgbmFtZTsKICBpbnQgZmxhZ3MgPSAwOwogIERhcnRUeXBlIHR5cGU7IC8vIE5vdCBudWxsLCBkZWZhdWx0cyB0byBkeW5hbWljLgoKICAvLy8gT2Zmc2V0IG9mIHRoZSBkZWNsYXJhdGlvbiwgc2V0IGFuZCB1c2VkIHdoZW4gd3JpdGluZyB0aGUgYmluYXJ5LgogIGludCBiaW5hcnlPZmZzZXROb1RhZyA9IC0xOwoKICAvLy8gRm9yIGxvY2FscywgdGhpcyBpcyB0aGUgaW5pdGlhbCB2YWx1ZS4KICAvLy8gRm9yIHBhcmFtZXRlcnMsIHRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUuCiAgLy8vCiAgLy8vIFNob3VsZCBiZSBudWxsIGluIG90aGVyIGNhc2VzLgogIEBjb3FvcHQKICBFeHByZXNzaW9uIGluaXRpYWxpemVyOyAvLyBNYXkgYmUgbnVsbC4KCiAgVmFyaWFibGVEZWNsYXJhdGlvbih0aGlzLm5hbWUsCiAgICAgIHt0aGlzLmluaXRpYWxpemVyLAogICAgICB0aGlzLnR5cGU6IGNvbnN0IER5bmFtaWNUeXBlKCksCiAgICAgIGludCBmbGFnczogLTEsCiAgICAgIGJvb2wgaXNGaW5hbDogZmFsc2UsCiAgICAgIGJvb2wgaXNDb25zdDogZmFsc2UsCiAgICAgIGJvb2wgaXNGaWVsZEZvcm1hbDogZmFsc2UsCiAgICAgIGJvb2wgaXNDb3ZhcmlhbnQ6IGZhbHNlfSkgewogICAgYXNzZXJ0KHR5cGUgIT0gbnVsbCk7CiAgICBpbml0aWFsaXplcj8ucGFyZW50ID0gdGhpczsKICAgIGlmIChmbGFncyAhPSAtMSkgewogICAgICB0aGlzLmZsYWdzID0gZmxhZ3M7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmlzRmluYWwgPSBpc0ZpbmFsOwogICAgICB0aGlzLmlzQ29uc3QgPSBpc0NvbnN0OwogICAgICB0aGlzLmlzRmllbGRGb3JtYWwgPSBpc0ZpZWxkRm9ybWFsOwogICAgICB0aGlzLmlzQ292YXJpYW50ID0gaXNDb3ZhcmlhbnQ7CiAgICB9CiAgfQoKICAvLy8gQ3JlYXRlcyBhIHN5bnRoZXRpYyB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBleHByZXNzaW9uIGFzIGluaXRpYWxpemVyLgogIFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUodGhpcy5pbml0aWFsaXplciwKICAgICAge2Jvb2wgaXNGaW5hbDogdHJ1ZSwKICAgICAgYm9vbCBpc0NvbnN0OiBmYWxzZSwKICAgICAgYm9vbCBpc0ZpZWxkRm9ybWFsOiBmYWxzZSwKICAgICAgdGhpcy50eXBlOiBjb25zdCBEeW5hbWljVHlwZSgpfSkgewogICAgYXNzZXJ0KHR5cGUgIT0gbnVsbCk7CiAgICBpbml0aWFsaXplcj8ucGFyZW50ID0gdGhpczsKICAgIHRoaXMuaXNGaW5hbCA9IGlzRmluYWw7CiAgICB0aGlzLmlzQ29uc3QgPSBpc0NvbnN0OwogICAgdGhpcy5pc0ZpZWxkRm9ybWFsID0gaXNGaWVsZEZvcm1hbDsKICB9CgogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0ZpbmFsID0gMSA8PCAwOyAvLyBNdXN0IG1hdGNoIHNlcmlhbGl6ZWQgYml0IHBvc2l0aW9ucy4KICBzdGF0aWMgY29uc3QgaW50IEZsYWdDb25zdCA9IDEgPDwgMTsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdGaWVsZEZvcm1hbCA9IDEgPDwgMjsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdDb3ZhcmlhbnQgPSAxIDw8IDM7CiAgc3RhdGljIGNvbnN0IGludCBGbGFnSW5TY29wZSA9IDEgPDwgNDsgLy8gVGVtcG9yYXJ5IGZsYWcgdXNlZCBieSB2ZXJpZmllci4KICBzdGF0aWMgY29uc3QgaW50IEZsYWdHZW5lcmljQ292YXJpYW50SW1wbCA9IDEgPDwgNTsKCiAgYm9vbCBnZXQgaXNGaW5hbCA9PiBmbGFncyAmIEZsYWdGaW5hbCAhPSAwOwogIGJvb2wgZ2V0IGlzQ29uc3QgPT4gZmxhZ3MgJiBGbGFnQ29uc3QgIT0gMDsKCiAgLy8vIFdoZXRoZXIgdGhlIHBhcmFtZXRlciBpcyBkZWNsYXJlZCB3aXRoIHRoZSBgY292YXJpYW50YCBrZXl3b3JkLgogIGJvb2wgZ2V0IGlzQ292YXJpYW50ID0+IGZsYWdzICYgRmxhZ0NvdmFyaWFudCAhPSAwOwoKICAvLy8gV2hldGhlciB0aGUgdmFyaWFibGUgaXMgZGVjbGFyZWQgYXMgYSBmaWVsZCBmb3JtYWwgcGFyYW1ldGVyIG9mCiAgLy8vIGEgY29uc3RydWN0b3IuCiAgQGluZm9ybWF0aXZlCiAgYm9vbCBnZXQgaXNGaWVsZEZvcm1hbCA9PiBmbGFncyAmIEZsYWdGaWVsZEZvcm1hbCAhPSAwOwoKICAvLy8gSWYgdGhpcyBbVmFyaWFibGVEZWNsYXJhdGlvbl0gaXMgYSBwYXJhbWV0ZXIgb2YgYSBtZXRob2QsIGluZGljYXRlcwogIC8vLyB3aGV0aGVyIHRoZSBtZXRob2QgaW1wbGVtZW50YXRpb24gbmVlZHMgdG8gY29udGFpbiBhIHJ1bnRpbWUgdHlwZSBjaGVjayB0bwogIC8vLyBkZWFsIHdpdGggZ2VuZXJpYyBjb3ZhcmlhbmNlLgogIC8vLwogIC8vLyBXaGVuIGB0cnVlYCwgcnVudGltZSBjaGVja3MgbWF5IG5lZWQgdG8gYmUgcGVyZm9ybWVkOyBzZWUKICAvLy8gW0Rpc3BhdGNoQ2F0ZWdvcnldIGZvciBkZXRhaWxzLgogIGJvb2wgZ2V0IGlzR2VuZXJpY0NvdmFyaWFudEltcGwgPT4gZmxhZ3MgJiBGbGFnR2VuZXJpY0NvdmFyaWFudEltcGwgIT0gMDsKCiAgdm9pZCBzZXQgaXNGaW5hbChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ0ZpbmFsKSA6IChmbGFncyAmIH5GbGFnRmluYWwpOwogIH0KCiAgdm9pZCBzZXQgaXNDb25zdChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ0NvbnN0KSA6IChmbGFncyAmIH5GbGFnQ29uc3QpOwogIH0KCiAgdm9pZCBzZXQgaXNDb3ZhcmlhbnQoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZSA/IChmbGFncyB8IEZsYWdDb3ZhcmlhbnQpIDogKGZsYWdzICYgfkZsYWdDb3ZhcmlhbnQpOwogIH0KCiAgQGluZm9ybWF0aXZlCiAgdm9pZCBzZXQgaXNGaWVsZEZvcm1hbChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ0ZpZWxkRm9ybWFsKSA6IChmbGFncyAmIH5GbGFnRmllbGRGb3JtYWwpOwogIH0KCiAgdm9pZCBzZXQgaXNHZW5lcmljQ292YXJpYW50SW1wbChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlCiAgICAgICAgPyAoZmxhZ3MgfCBGbGFnR2VuZXJpY0NvdmFyaWFudEltcGwpCiAgICAgICAgOiAoZmxhZ3MgJiB+RmxhZ0dlbmVyaWNDb3ZhcmlhbnRJbXBsKTsKICB9CgogIHZvaWQgYWRkQW5ub3RhdGlvbihFeHByZXNzaW9uIGFubm90YXRpb24pIHsKICAgIGlmIChhbm5vdGF0aW9ucy5pc0VtcHR5KSB7CiAgICAgIGFubm90YXRpb25zID0gPEV4cHJlc3Npb24+W107CiAgICB9CiAgICBhbm5vdGF0aW9ucy5hZGQoYW5ub3RhdGlvbi4ucGFyZW50ID0gdGhpcyk7CiAgfQoKICBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciB2KSA9PiB2LnZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbih0aGlzKTsKICBhY2NlcHQxKFN0YXRlbWVudFZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24odGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdChhbm5vdGF0aW9ucywgdik7CiAgICB0eXBlPy5hY2NlcHQodik7CiAgICBpbml0aWFsaXplcj8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChhbm5vdGF0aW9ucywgdiwgdGhpcyk7CiAgICB0eXBlID0gdi52aXNpdERhcnRUeXBlKHR5cGUpOwogICAgaWYgKGluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgaW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplci5hY2NlcHQodik7CiAgICAgIGluaXRpYWxpemVyPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KCiAgLy8vIFJldHVybnMgYSBwb3NzaWJseSBzeW50aGVzaXplZCBuYW1lIGZvciB0aGlzIHZhcmlhYmxlLCBjb25zaXN0ZW50IHdpdGgKICAvLy8gdGhlIG5hbWVzIHVzZWQgYWNyb3NzIGFsbCBbdG9TdHJpbmddIGNhbGxzLgogIFN0cmluZyB0b1N0cmluZygpID0+IGRlYnVnVmFyaWFibGVEZWNsYXJhdGlvbk5hbWUodGhpcyk7Cn0KCi8vLyBEZWNsYXJhdGlvbiBhIGxvY2FsIGZ1bmN0aW9uLgovLy8KLy8vIFRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbiBtYXkgdXNlIFt2YXJpYWJsZV0gYXMgaXRzIHNlbGYtcmVmZXJlbmNlLgpjbGFzcyBGdW5jdGlvbkRlY2xhcmF0aW9uIGV4dGVuZHMgU3RhdGVtZW50IHsKICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlOyAvLyBJcyBmaW5hbCBhbmQgaGFzIG5vIGluaXRpYWxpemVyLgogIEZ1bmN0aW9uTm9kZSBmdW5jdGlvbjsKCiAgRnVuY3Rpb25EZWNsYXJhdGlvbih0aGlzLnZhcmlhYmxlLCB0aGlzLmZ1bmN0aW9uKSB7CiAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIGZ1bmN0aW9uPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgYWNjZXB0KFN0YXRlbWVudFZpc2l0b3IgdikgPT4gdi52aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24odGhpcyk7CiAgYWNjZXB0MShTdGF0ZW1lbnRWaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2YXJpYWJsZT8uYWNjZXB0KHYpOwogICAgZnVuY3Rpb24/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmICh2YXJpYWJsZSAhPSBudWxsKSB7CiAgICAgIHZhcmlhYmxlID0gdmFyaWFibGUuYWNjZXB0KHYpOwogICAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChmdW5jdGlvbiAhPSBudWxsKSB7CiAgICAgIGZ1bmN0aW9uID0gZnVuY3Rpb24uYWNjZXB0KHYpOwogICAgICBmdW5jdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFNRVMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLy8gQSBwdWJsaWMgbmFtZSwgb3IgYSBwcml2YXRlIG5hbWUgcXVhbGlmaWVkIGJ5IGEgbGlicmFyeS4KLy8vCi8vLyBOYW1lcyBhcmUgb25seSB1c2VkIGZvciBleHByZXNzaW9ucyB3aXRoIGR5bmFtaWMgZGlzcGF0Y2gsIGFzIGFsbAovLy8gc3RhdGljYWxseSByZXNvbHZlZCByZWZlcmVuY2VzIGFyZSByZXByZXNlbnRlZCBpbiBuYW1lbGVzcyBmb3JtLgovLy8KLy8vIFtOYW1lXXMgYXJlIGltbXV0YWJsZSBhbmQgY29tcGFyZSBiYXNlZCBvbiBzdHJ1Y3R1cmFsIGVxdWFsaXR5LCBhbmQgdGhleQovLy8gYXJlIG5vdCBBU1Qgbm9kZXMuCi8vLwovLy8gVGhlIFt0b1N0cmluZ10gbWV0aG9kIHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgdGhhdCBpbmNsdWRlcyB0aGUKLy8vIGxpYnJhcnkgbmFtZSBmb3IgcHJpdmF0ZSBuYW1lczsgdW5pcXVlbmVzcyBpcyBub3QgZ3VhcmFudGVlZC4KQGNvcQphYnN0cmFjdCBjbGFzcyBOYW1lIGltcGxlbWVudHMgTm9kZSB7CiAgZmluYWwgaW50IGhhc2hDb2RlOwogIEBjb3EKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBAbm9jb3EKICBSZWZlcmVuY2UgZ2V0IGxpYnJhcnlOYW1lOwogIEBub2NvcQogIExpYnJhcnkgZ2V0IGxpYnJhcnk7CiAgYm9vbCBnZXQgaXNQcml2YXRlOwoKICBOYW1lLl9pbnRlcm5hbCh0aGlzLmhhc2hDb2RlLCB0aGlzLm5hbWUpOwoKICBmYWN0b3J5IE5hbWUoU3RyaW5nIG5hbWUsIFtMaWJyYXJ5IGxpYnJhcnldKSA9PgogICAgICBuZXcgTmFtZS5ieVJlZmVyZW5jZShuYW1lLCBsaWJyYXJ5Py5yZWZlcmVuY2UpOwoKICBmYWN0b3J5IE5hbWUuYnlSZWZlcmVuY2UoU3RyaW5nIG5hbWUsIFJlZmVyZW5jZSBsaWJyYXJ5TmFtZSkgewogICAgLy8vIFVzZSBzZXBhcmF0ZSBzdWJjbGFzc2VzIGZvciB0aGUgcHVibGljIGFuZCBwcml2YXRlIGNhc2UgdG8gc2F2ZSBtZW1vcnkKICAgIC8vLyBmb3IgcHVibGljIG5hbWVzLgogICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgnXycpKSB7CiAgICAgIGFzc2VydChsaWJyYXJ5TmFtZSAhPSBudWxsKTsKICAgICAgcmV0dXJuIG5ldyBfUHJpdmF0ZU5hbWUobmFtZSwgbGlicmFyeU5hbWUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBfUHVibGljTmFtZShuYW1lKTsKICAgIH0KICB9CgogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIHJldHVybiBvdGhlciBpcyBOYW1lICYmIG5hbWUgPT0gb3RoZXIubmFtZSAmJiBsaWJyYXJ5ID09IG90aGVyLmxpYnJhcnk7CiAgfQoKICBhY2NlcHQoVmlzaXRvciB2KSA9PiB2LnZpc2l0TmFtZSh0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIC8vIERFU0lHTiBUT0RPOiBTaG91bGQgd2UgdmlzaXQgdGhlIGxpYnJhcnkgYXMgYSBsaWJyYXJ5IHJlZmVyZW5jZT8KICB9Cn0KCmNsYXNzIF9Qcml2YXRlTmFtZSBleHRlbmRzIE5hbWUgewogIGZpbmFsIFJlZmVyZW5jZSBsaWJyYXJ5TmFtZTsKICBib29sIGdldCBpc1ByaXZhdGUgPT4gdHJ1ZTsKCiAgX1ByaXZhdGVOYW1lKFN0cmluZyBuYW1lLCBSZWZlcmVuY2UgbGlicmFyeU5hbWUpCiAgICAgIDogdGhpcy5saWJyYXJ5TmFtZSA9IGxpYnJhcnlOYW1lLAogICAgICAgIHN1cGVyLl9pbnRlcm5hbChfY29tcHV0ZUhhc2hDb2RlKG5hbWUsIGxpYnJhcnlOYW1lKSwgbmFtZSk7CgogIFN0cmluZyB0b1N0cmluZygpID0+IGxpYnJhcnkgIT0gbnVsbCA/ICckbGlicmFyeTo6JG5hbWUnIDogbmFtZTsKCiAgTGlicmFyeSBnZXQgbGlicmFyeSA9PiBsaWJyYXJ5TmFtZS5hc0xpYnJhcnk7CgogIHN0YXRpYyBpbnQgX2NvbXB1dGVIYXNoQ29kZShTdHJpbmcgbmFtZSwgUmVmZXJlbmNlIGxpYnJhcnlOYW1lKSB7CiAgICAvLyBUT0RPKGRtaXRyeWFzKTogRmFjdG9yIGluIFtsaWJyYXJ5TmFtZV0gaW4gYSBub24tZGV0ZXJtaW5pc3RpYyB3YXkgaW50bwogICAgLy8gdGhlIHJlc3VsdC4gIE5vdGUsIHRoZSBwcmV2aW91cyBjb2RlIGhlcmUgd2FzIHRoZSBmb2xsb3dpbmc6CiAgICAvLyAgICAgcmV0dXJuIDEzMSAqIG5hbWUuaGFzaENvZGUgKyAxNyAqIGxpYnJhcnlOYW1lLmFzTGlicmFyeS5fbGlicmFyeUlkOwogICAgcmV0dXJuIG5hbWUuaGFzaENvZGU7CiAgfQp9CgpjbGFzcyBfUHVibGljTmFtZSBleHRlbmRzIE5hbWUgewogIFJlZmVyZW5jZSBnZXQgbGlicmFyeU5hbWUgPT4gbnVsbDsKICBMaWJyYXJ5IGdldCBsaWJyYXJ5ID0+IG51bGw7CiAgYm9vbCBnZXQgaXNQcml2YXRlID0+IGZhbHNlOwoKICBfUHVibGljTmFtZShTdHJpbmcgbmFtZSkgOiBzdXBlci5faW50ZXJuYWwobmFtZS5oYXNoQ29kZSwgbmFtZSk7CgogIFN0cmluZyB0b1N0cmluZygpID0+IG5hbWU7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRVMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLy8gQSBzeW50YXgtaW5kZXBlbmRlbnQgbm90aW9uIG9mIGEgdHlwZS4KLy8vCi8vLyBbRGFydFR5cGVdcyBhcmUgbm90IEFTVCBub2RlcyBhbmQgbWF5IGJlIHNoYXJlZCBiZXR3ZWVuIGRpZmZlcmVudCBwYXJlbnRzLgovLy8KLy8vIFtEYXJ0VHlwZV0gb2JqZWN0cyBzaG91bGQgYmUgdHJlYXRlZCBhcyB1bm1vZGlmaWFibGUgb2JqZWN0cywgYWx0aG91Z2gKLy8vIGltbXV0YWJpbGl0eSBpcyBub3QgZW5mb3JjZWQgZm9yIExpc3QgZmllbGRzLCBhbmQgW1R5cGVQYXJhbWV0ZXJdcyBhcmUKLy8vIGN5Y2xpYyBzdHJ1Y3R1cmVzIHRoYXQgYXJlIGNvbnN0cnVjdGVkIGJ5IG11dGF0aW9uLgovLy8KLy8vIFRoZSBgPT1gIG9wZXJhdG9yIG9uIFtEYXJ0VHlwZV1zIGNvbXBhcmUgYmFzZWQgb24gdHlwZSBlcXVhbGl0eSwgbm90Ci8vLyBvYmplY3QgaWRlbnRpdHkuCkBjb3EKYWJzdHJhY3QgY2xhc3MgRGFydFR5cGUgZXh0ZW5kcyBOb2RlIHsKICBjb25zdCBEYXJ0VHlwZSgpOwoKICBhY2NlcHQoRGFydFR5cGVWaXNpdG9yIHYpOwogIGFjY2VwdDEoRGFydFR5cGVWaXNpdG9yMSB2LCBhcmcpOwoKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcik7CgogIC8vLyBJZiB0aGlzIGlzIGEgdHlwZWRlZiB0eXBlLCByZXBlYXRlZGx5IHVuZm9sZHMgaXRzIHR5cGUgZGVmaW5pdGlvbiB1bnRpbAogIC8vLyB0aGUgcm9vdCB0ZXJtIGlzIG5vdCBhIHR5cGVkZWYgdHlwZSwgb3RoZXJ3aXNlIHJldHVybnMgdGhlIHR5cGUgaXRzZWxmLgogIC8vLwogIC8vLyBXaWxsIG5ldmVyIHJldHVybiBhIHR5cGVkZWYgdHlwZS4KICBEYXJ0VHlwZSBnZXQgdW5hbGlhcyA9PiB0aGlzOwoKICAvLy8gSWYgdGhpcyBpcyBhIHR5cGVkZWYgdHlwZSwgdW5mb2xkcyBpdHMgdHlwZSBkZWZpbml0aW9uIG9uY2UsIG90aGVyd2lzZQogIC8vLyByZXR1cm5zIHRoZSB0eXBlIGl0c2VsZi4KICBEYXJ0VHlwZSBnZXQgdW5hbGlhc09uY2UgPT4gdGhpczsKfQoKLy8vIFRoZSB0eXBlIGFyaXNpbmcgZnJvbSBpbnZhbGlkIHR5cGUgYW5ub3RhdGlvbnMuCi8vLwovLy8gQ2FuIHVzdWFsbHkgYmUgdHJlYXRlZCBhcyAnZHluYW1pYycsIGJ1dCBzaG91bGQgb2NjYXNpb25hbGx5IGJlIGhhbmRsZWQKLy8vIGRpZmZlcmVudGx5LCBlLmcuIGB4IGlzIEVSUk9SYCBzaG91bGQgZXZhbHVhdGUgdG8gZmFsc2UuCmNsYXNzIEludmFsaWRUeXBlIGV4dGVuZHMgRGFydFR5cGUgewogIGZpbmFsIGludCBoYXNoQ29kZSA9IDEyMzQ1OwoKICBjb25zdCBJbnZhbGlkVHlwZSgpOwoKICBhY2NlcHQoRGFydFR5cGVWaXNpdG9yIHYpID0+IHYudmlzaXRJbnZhbGlkVHlwZSh0aGlzKTsKICBhY2NlcHQxKERhcnRUeXBlVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0SW52YWxpZFR5cGUodGhpcywgYXJnKTsKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdikge30KCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpID0+IG90aGVyIGlzIEludmFsaWRUeXBlOwp9CgpjbGFzcyBEeW5hbWljVHlwZSBleHRlbmRzIERhcnRUeXBlIHsKICBmaW5hbCBpbnQgaGFzaENvZGUgPSA1NDMyMTsKCiAgY29uc3QgRHluYW1pY1R5cGUoKTsKCiAgYWNjZXB0KERhcnRUeXBlVmlzaXRvciB2KSA9PiB2LnZpc2l0RHluYW1pY1R5cGUodGhpcyk7CiAgYWNjZXB0MShEYXJ0VHlwZVZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdER5bmFtaWNUeXBlKHRoaXMsIGFyZyk7CiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHt9CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSA9PiBvdGhlciBpcyBEeW5hbWljVHlwZTsKfQoKY2xhc3MgVm9pZFR5cGUgZXh0ZW5kcyBEYXJ0VHlwZSB7CiAgZmluYWwgaW50IGhhc2hDb2RlID0gMTIzMTIxOwoKICBjb25zdCBWb2lkVHlwZSgpOwoKICBhY2NlcHQoRGFydFR5cGVWaXNpdG9yIHYpID0+IHYudmlzaXRWb2lkVHlwZSh0aGlzKTsKICBhY2NlcHQxKERhcnRUeXBlVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0Vm9pZFR5cGUodGhpcywgYXJnKTsKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdikge30KCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpID0+IG90aGVyIGlzIFZvaWRUeXBlOwp9CgpjbGFzcyBCb3R0b21UeXBlIGV4dGVuZHMgRGFydFR5cGUgewogIGZpbmFsIGludCBoYXNoQ29kZSA9IDUxNDIxMzsKCiAgY29uc3QgQm90dG9tVHlwZSgpOwoKICBhY2NlcHQoRGFydFR5cGVWaXNpdG9yIHYpID0+IHYudmlzaXRCb3R0b21UeXBlKHRoaXMpOwogIGFjY2VwdDEoRGFydFR5cGVWaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRCb3R0b21UeXBlKHRoaXMsIGFyZyk7CiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHt9CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSA9PiBvdGhlciBpcyBCb3R0b21UeXBlOwp9CgpAY29xCmNsYXNzIEludGVyZmFjZVR5cGUgZXh0ZW5kcyBEYXJ0VHlwZSB7CiAgUmVmZXJlbmNlIGNsYXNzTmFtZTsKICBAbm9jb3EKICBmaW5hbCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzOwoKICAvLy8gVGhlIFt0eXBlQXJndW1lbnRzXSBsaXN0IG11c3Qgbm90IGJlIG1vZGlmaWVkIGFmdGVyIHRoaXMgY2FsbC4gSWYgdGhlCiAgLy8vIGxpc3QgaXMgb21pdHRlZCwgJ2R5bmFtaWMnIHR5cGUgYXJndW1lbnRzIGFyZSBmaWxsZWQgaW4uCiAgSW50ZXJmYWNlVHlwZShDbGFzcyBjbGFzc05vZGUsIFtMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzXSkKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKGdldENsYXNzUmVmZXJlbmNlKGNsYXNzTm9kZSksCiAgICAgICAgICAgIHR5cGVBcmd1bWVudHMgPz8gX2RlZmF1bHRUeXBlQXJndW1lbnRzKGNsYXNzTm9kZSkpOwoKICBJbnRlcmZhY2VUeXBlLmJ5UmVmZXJlbmNlKHRoaXMuY2xhc3NOYW1lLCB0aGlzLnR5cGVBcmd1bWVudHMpOwoKICBDbGFzcyBnZXQgY2xhc3NOb2RlID0+IGNsYXNzTmFtZS5hc0NsYXNzOwoKICBzdGF0aWMgTGlzdDxEYXJ0VHlwZT4gX2RlZmF1bHRUeXBlQXJndW1lbnRzKENsYXNzIGNsYXNzTm9kZSkgewogICAgaWYgKGNsYXNzTm9kZS50eXBlUGFyYW1ldGVycy5sZW5ndGggPT0gMCkgewogICAgICAvLyBBdm9pZCBhbGxvY2F0aW5nIGEgbGlzdCBpbiB0aGlzIHZlcnkgY29tbW9uIGNhc2UuCiAgICAgIHJldHVybiBjb25zdCA8RGFydFR5cGU+W107CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCgKICAgICAgICAgIGNsYXNzTm9kZS50eXBlUGFyYW1ldGVycy5sZW5ndGgsIGNvbnN0IER5bmFtaWNUeXBlKCkpOwogICAgfQogIH0KCiAgYWNjZXB0KERhcnRUeXBlVmlzaXRvciB2KSA9PiB2LnZpc2l0SW50ZXJmYWNlVHlwZSh0aGlzKTsKICBhY2NlcHQxKERhcnRUeXBlVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0SW50ZXJmYWNlVHlwZSh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgY2xhc3NOb2RlLmFjY2VwdFJlZmVyZW5jZSh2KTsKICAgIHZpc2l0TGlzdCh0eXBlQXJndW1lbnRzLCB2KTsKICB9CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICBpZiAoY2xhc3NOYW1lICE9IG90aGVyLmNsYXNzTmFtZSkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAodHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gb3RoZXIudHlwZUFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKHR5cGVBcmd1bWVudHNbaV0gIT0gb3RoZXIudHlwZUFyZ3VtZW50c1tpXSkgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICBpbnQgaGFzaCA9IDB4M2ZmZmZmZmYgJiBjbGFzc05hbWUuaGFzaENvZGU7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgaGFzaCA9IDB4M2ZmZmZmZmYgJiAoaGFzaCAqIDMxICsgKGhhc2ggXiB0eXBlQXJndW1lbnRzW2ldLmhhc2hDb2RlKSk7CiAgICB9CiAgICByZXR1cm4gaGFzaDsKICB9Cn0KCi8vLyBBIHBvc3NpYmx5IGdlbmVyaWMgZnVuY3Rpb24gdHlwZS4KQGNvcQpjbGFzcyBGdW5jdGlvblR5cGUgZXh0ZW5kcyBEYXJ0VHlwZSB7CiAgZmluYWwgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyczsKICBmaW5hbCBpbnQgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDsKICBAY29xc2luZ2xlCiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gcG9zaXRpb25hbFBhcmFtZXRlcnM7CiAgZmluYWwgTGlzdDxOYW1lZFR5cGU+IG5hbWVkUGFyYW1ldGVyczsgLy8gTXVzdCBiZSBzb3J0ZWQuCgogIC8vLyBUaGUgW1R5cGVkZWZdIHRoaXMgZnVuY3Rpb24gdHlwZSBpcyBjcmVhdGVkIGZvci4KICBmaW5hbCBUeXBlZGVmVHlwZSB0eXBlZGVmVHlwZTsKCiAgZmluYWwgRGFydFR5cGUgcmV0dXJuVHlwZTsKICBpbnQgX2hhc2hDb2RlOwoKICBGdW5jdGlvblR5cGUoTGlzdDxEYXJ0VHlwZT4gcG9zaXRpb25hbFBhcmFtZXRlcnMsIHRoaXMucmV0dXJuVHlwZSwKICAgICAge3RoaXMubmFtZWRQYXJhbWV0ZXJzOiBjb25zdCA8TmFtZWRUeXBlPltdLAogICAgICB0aGlzLnR5cGVQYXJhbWV0ZXJzOiBjb25zdCA8VHlwZVBhcmFtZXRlcj5bXSwKICAgICAgaW50IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgIHRoaXMudHlwZWRlZlR5cGV9KQogICAgICA6IHRoaXMucG9zaXRpb25hbFBhcmFtZXRlcnMgPSBwb3NpdGlvbmFsUGFyYW1ldGVycywKICAgICAgICB0aGlzLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPQogICAgICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50ID8/IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsKCiAgQG5vY29xCiAgUmVmZXJlbmNlIGdldCB0eXBlZGVmUmVmZXJlbmNlID0+IHR5cGVkZWZUeXBlPy50eXBlZGVmUmVmZXJlbmNlOwoKICBUeXBlZGVmIGdldCB0eXBlZGVmID0+IHR5cGVkZWZSZWZlcmVuY2U/LmFzVHlwZWRlZjsKCiAgYWNjZXB0KERhcnRUeXBlVmlzaXRvciB2KSA9PiB2LnZpc2l0RnVuY3Rpb25UeXBlKHRoaXMpOwogIGFjY2VwdDEoRGFydFR5cGVWaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRGdW5jdGlvblR5cGUodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdCh0eXBlUGFyYW1ldGVycywgdik7CiAgICB2aXNpdExpc3QocG9zaXRpb25hbFBhcmFtZXRlcnMsIHYpOwogICAgdmlzaXRMaXN0KG5hbWVkUGFyYW1ldGVycywgdik7CiAgICB0eXBlZGVmVHlwZT8uYWNjZXB0KHYpOwogICAgcmV0dXJuVHlwZS5hY2NlcHQodik7CiAgfQoKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICBpZiAodHlwZVBhcmFtZXRlcnMubGVuZ3RoICE9IG90aGVyLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCB8fAogICAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCAhPSBvdGhlci5yZXF1aXJlZFBhcmFtZXRlckNvdW50IHx8CiAgICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGggIT0gb3RoZXIucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoIHx8CiAgICAgICAgICBuYW1lZFBhcmFtZXRlcnMubGVuZ3RoICE9IG90aGVyLm5hbWVkUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKHR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICBpZiAocG9zaXRpb25hbFBhcmFtZXRlcnNbaV0gIT0gb3RoZXIucG9zaXRpb25hbFBhcmFtZXRlcnNbaV0pIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVkUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICAgICAgaWYgKG5hbWVkUGFyYW1ldGVyc1tpXSAhPSBvdGhlci5uYW1lZFBhcmFtZXRlcnNbaV0pIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0dXJuVHlwZSA9PSBvdGhlci5yZXR1cm5UeXBlOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFN0cnVjdHVyYWwgZXF1YWxpdHkgZG9lcyBub3QgdGVsbCB1cyBpZiB0d28gZ2VuZXJpYyBmdW5jdGlvbiB0eXBlcwogICAgICAgIC8vIGFyZSB0aGUgc2FtZSB0eXBlLiAgSWYgdGhleSBhcmUgdW5pZmlhYmxlIHdpdGhvdXQgc3Vic3RpdHV0aW5nIGFueQogICAgICAgIC8vIHR5cGUgdmFyaWFibGVzLCB0aGV5IGFyZSBlcXVhbC4KICAgICAgICByZXR1cm4gdW5pZnlUeXBlcyh0aGlzLCBvdGhlciwgbmV3IFNldDxUeXBlUGFyYW1ldGVyPigpKSAhPSBudWxsOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvLy8gUmV0dXJucyBhIHZhcmlhbnQgb2YgdGhpcyBmdW5jdGlvbiB0eXBlIHRoYXQgZG9lcyBub3QgZGVjbGFyZSBhbnkgdHlwZQogIC8vLyBwYXJhbWV0ZXJzLgogIC8vLwogIC8vLyBBbnkgdXNlcyBvZiBpdHMgdHlwZSBwYXJhbWV0ZXJzIGJlY29tZSBmcmVlIHZhcmlhYmxlcyBpbiB0aGUgcmV0dXJuZWQKICAvLy8gdHlwZS4KICBGdW5jdGlvblR5cGUgZ2V0IHdpdGhvdXRUeXBlUGFyYW1ldGVycyB7CiAgICBpZiAodHlwZVBhcmFtZXRlcnMuaXNFbXB0eSkgcmV0dXJuIHRoaXM7CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uVHlwZShwb3NpdGlvbmFsUGFyYW1ldGVycywgcmV0dXJuVHlwZSwKICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiByZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgIG5hbWVkUGFyYW1ldGVyczogbmFtZWRQYXJhbWV0ZXJzLAogICAgICAgIHR5cGVkZWZUeXBlOiB0eXBlZGVmVHlwZSk7CiAgfQoKICAvLy8gTG9va3MgdXAgdGhlIHR5cGUgb2YgdGhlIG5hbWVkIHBhcmFtZXRlciB3aXRoIHRoZSBnaXZlbiBuYW1lLgogIC8vLwogIC8vLyBSZXR1cm5zIGBudWxsYCBpZiB0aGVyZSBpcyBubyBuYW1lZCBwYXJhbWV0ZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KICBEYXJ0VHlwZSBnZXROYW1lZFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgewogICAgaW50IGxvd2VyID0gMDsKICAgIGludCB1cHBlciA9IG5hbWVkUGFyYW1ldGVycy5sZW5ndGggLSAxOwogICAgd2hpbGUgKGxvd2VyIDw9IHVwcGVyKSB7CiAgICAgIGludCBwaXZvdCA9IChsb3dlciArIHVwcGVyKSB+LyAyOwogICAgICB2YXIgbmFtZWRQYXJhbWV0ZXIgPSBuYW1lZFBhcmFtZXRlcnNbcGl2b3RdOwogICAgICBpbnQgY29tcGFyaXNvbiA9IG5hbWUuY29tcGFyZVRvKG5hbWVkUGFyYW1ldGVyLm5hbWUpOwogICAgICBpZiAoY29tcGFyaXNvbiA9PSAwKSB7CiAgICAgICAgcmV0dXJuIG5hbWVkUGFyYW1ldGVyLnR5cGU7CiAgICAgIH0gZWxzZSBpZiAoY29tcGFyaXNvbiA8IDApIHsKICAgICAgICB1cHBlciA9IHBpdm90IC0gMTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsb3dlciA9IHBpdm90ICsgMTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBpbnQgZ2V0IGhhc2hDb2RlID0+IF9oYXNoQ29kZSA/Pz0gX2NvbXB1dGVIYXNoQ29kZSgpOwoKICBpbnQgX2NvbXB1dGVIYXNoQ29kZSgpIHsKICAgIGludCBoYXNoID0gMTIzNzsKICAgIGhhc2ggPSAweDNmZmZmZmZmICYgKGhhc2ggKiAzMSArIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICBUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciA9IHR5cGVQYXJhbWV0ZXJzW2ldOwogICAgICBfdGVtcG9yYXJ5SGFzaENvZGVUYWJsZVtwYXJhbWV0ZXJdID0gX3RlbXBvcmFyeUhhc2hDb2RlVGFibGUubGVuZ3RoOwogICAgICBoYXNoID0gMHgzZmZmZmZmZiAmIChoYXNoICogMzEgKyBwYXJhbWV0ZXIuYm91bmQuaGFzaENvZGUpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICBoYXNoID0gMHgzZmZmZmZmZiAmIChoYXNoICogMzEgKyBwb3NpdGlvbmFsUGFyYW1ldGVyc1tpXS5oYXNoQ29kZSk7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVkUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICBoYXNoID0gMHgzZmZmZmZmZiAmIChoYXNoICogMzEgKyBuYW1lZFBhcmFtZXRlcnNbaV0uaGFzaENvZGUpOwogICAgfQogICAgaGFzaCA9IDB4M2ZmZmZmZmYgJiAoaGFzaCAqIDMxICsgcmV0dXJuVHlwZS5oYXNoQ29kZSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgIC8vIFJlbW92ZSB0aGUgdHlwZSBwYXJhbWV0ZXJzIGZyb20gdGhlIHNjb3BlIGFnYWluLgogICAgICBfdGVtcG9yYXJ5SGFzaENvZGVUYWJsZS5yZW1vdmUodHlwZVBhcmFtZXRlcnNbaV0pOwogICAgfQogICAgcmV0dXJuIGhhc2g7CiAgfQp9CgovLy8gQSB1c2Ugb2YgYSBbVHlwZWRlZl0gYXMgYSB0eXBlLgovLy8KLy8vIFRoZSB1bmRlcmx5aW5nIHR5cGUgY2FuIGJlIGV4dHJhY3RlZCB1c2luZyBbdW5hbGlhc10uCmNsYXNzIFR5cGVkZWZUeXBlIGV4dGVuZHMgRGFydFR5cGUgewogIGZpbmFsIFJlZmVyZW5jZSB0eXBlZGVmUmVmZXJlbmNlOwogIGZpbmFsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHM7CgogIFR5cGVkZWZUeXBlKFR5cGVkZWYgdHlwZWRlZk5vZGUsIFtMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzXSkKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKAogICAgICAgICAgICB0eXBlZGVmTm9kZS5yZWZlcmVuY2UsIHR5cGVBcmd1bWVudHMgPz8gY29uc3QgPERhcnRUeXBlPltdKTsKCiAgVHlwZWRlZlR5cGUuYnlSZWZlcmVuY2UodGhpcy50eXBlZGVmUmVmZXJlbmNlLCB0aGlzLnR5cGVBcmd1bWVudHMpOwoKICBUeXBlZGVmIGdldCB0eXBlZGVmTm9kZSA9PiB0eXBlZGVmUmVmZXJlbmNlLmFzVHlwZWRlZjsKCiAgYWNjZXB0KERhcnRUeXBlVmlzaXRvciB2KSA9PiB2LnZpc2l0VHlwZWRlZlR5cGUodGhpcyk7CiAgYWNjZXB0MShEYXJ0VHlwZVZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdFR5cGVkZWZUeXBlKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3QodHlwZUFyZ3VtZW50cywgdik7CiAgICB2LnZpc2l0VHlwZWRlZlJlZmVyZW5jZSh0eXBlZGVmTm9kZSk7CiAgfQoKICBEYXJ0VHlwZSBnZXQgdW5hbGlhc09uY2UgewogICAgcmV0dXJuIFN1YnN0aXR1dGlvbi5mcm9tVHlwZWRlZlR5cGUodGhpcykuc3Vic3RpdHV0ZVR5cGUodHlwZWRlZk5vZGUudHlwZSk7CiAgfQoKICBEYXJ0VHlwZSBnZXQgdW5hbGlhcyB7CiAgICByZXR1cm4gdW5hbGlhc09uY2UudW5hbGlhczsKICB9CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMgVHlwZWRlZlR5cGUpIHsKICAgICAgaWYgKHR5cGVkZWZSZWZlcmVuY2UgIT0gb3RoZXIudHlwZWRlZlJlZmVyZW5jZSB8fAogICAgICAgICAgdHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gb3RoZXIudHlwZUFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKHR5cGVBcmd1bWVudHNbaV0gIT0gb3RoZXIudHlwZUFyZ3VtZW50c1tpXSkgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICBpbnQgaGFzaCA9IDB4M2ZmZmZmZmYgJiB0eXBlZGVmTm9kZS5oYXNoQ29kZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgewogICAgICBoYXNoID0gMHgzZmZmZmZmZiAmIChoYXNoICogMzEgKyAoaGFzaCBeIHR5cGVBcmd1bWVudHNbaV0uaGFzaENvZGUpKTsKICAgIH0KICAgIHJldHVybiBoYXNoOwogIH0KfQoKLy8vIEEgbmFtZWQgcGFyYW1ldGVyIGluIFtGdW5jdGlvblR5cGVdLgpjbGFzcyBOYW1lZFR5cGUgZXh0ZW5kcyBOb2RlIGltcGxlbWVudHMgQ29tcGFyYWJsZTxOYW1lZFR5cGU+IHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBmaW5hbCBEYXJ0VHlwZSB0eXBlOwoKICBOYW1lZFR5cGUodGhpcy5uYW1lLCB0aGlzLnR5cGUpOwoKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgcmV0dXJuIG90aGVyIGlzIE5hbWVkVHlwZSAmJiBuYW1lID09IG90aGVyLm5hbWUgJiYgdHlwZSA9PSBvdGhlci50eXBlOwogIH0KCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICByZXR1cm4gbmFtZS5oYXNoQ29kZSAqIDMxICsgdHlwZS5oYXNoQ29kZSAqIDM3OwogIH0KCiAgaW50IGNvbXBhcmVUbyhOYW1lZFR5cGUgb3RoZXIpID0+IG5hbWUuY29tcGFyZVRvKG90aGVyLm5hbWUpOwoKICBhY2NlcHQoVmlzaXRvciB2KSA9PiB2LnZpc2l0TmFtZWRUeXBlKHRoaXMpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB0eXBlLmFjY2VwdCh2KTsKICB9Cn0KCi8vLyBTdG9yZXMgdGhlIGhhc2ggY29kZSBvZiBmdW5jdGlvbiB0eXBlIHBhcmFtZXRlcnMgd2hpbGUgY29tcHV0aW5nIHRoZSBoYXNoCi8vLyBjb2RlIG9mIGEgW0Z1bmN0aW9uVHlwZV0gb2JqZWN0LgovLy8KLy8vIFRoaXMgZW5zdXJlcyB0aGF0IGRpc3RpbmN0IFtGdW5jdGlvblR5cGVdIG9iamVjdHMgZ2V0IHRoZSBzYW1lIGhhc2ggY29kZQovLy8gaWYgdGhleSByZXByZXNlbnQgdGhlIHNhbWUgdHlwZSwgZXZlbiB0aG91Z2ggdGhlaXIgdHlwZSBwYXJhbWV0ZXJzIGFyZQovLy8gcmVwcmVzZW50ZWQgYnkgZGlmZmVyZW50IG9iamVjdHMuCmZpbmFsIE1hcDxUeXBlUGFyYW1ldGVyLCBpbnQ+IF90ZW1wb3JhcnlIYXNoQ29kZVRhYmxlID0gPFR5cGVQYXJhbWV0ZXIsIGludD57fTsKCi8vLyBSZWZlcmVuY2UgdG8gYSB0eXBlIHZhcmlhYmxlLgovLy8KLy8vIEEgdHlwZSB2YXJpYWJsZSBoYXMgYW4gb3B0aW9uYWwgYm91bmQgYmVjYXVzZSB0eXBlIHByb21vdGlvbiBjYW4gY2hhbmdlIHRoZQovLy8gYm91bmQuICBBIGJvdW5kIG9mIGBudWxsYCBpbmRpY2F0ZXMgdGhhdCB0aGUgYm91bmQgaGFzIG5vdCBiZWVuIHByb21vdGVkIGFuZAovLy8gaXMgdGhlIHNhbWUgYXMgdGhlIFtUeXBlUGFyYW1ldGVyXSdzIGJvdW5kLiAgVGhpcyBhbGxvd3Mgb25lIHRvIGRldGVjdAovLy8gd2hldGhlciB0aGUgYm91bmQgaGFzIGJlZW4gcHJvbW90ZWQuCmNsYXNzIFR5cGVQYXJhbWV0ZXJUeXBlIGV4dGVuZHMgRGFydFR5cGUgewogIFR5cGVQYXJhbWV0ZXIgcGFyYW1ldGVyOwoKICAvLy8gQW4gb3B0aW9uYWwgcHJvbW90ZWQgYm91bmQgb24gdGhlIHR5cGUgcGFyYW1ldGVyLgogIC8vLwogIC8vLyAnbnVsbCcgaW5kaWNhdGVzIHRoYXQgdGhlIHR5cGUgcGFyYW1ldGVyJ3MgYm91bmQgaGFzIG5vdCBiZWVuIHByb21vdGVkIGFuZAogIC8vLyBpcyB0aGVyZWZvcmUgdGhlIHNhbWUgYXMgdGhlIGJvdW5kIG9mIFtwYXJhbWV0ZXJdLgogIERhcnRUeXBlIHByb21vdGVkQm91bmQ7CgogIFR5cGVQYXJhbWV0ZXJUeXBlKHRoaXMucGFyYW1ldGVyLCBbdGhpcy5wcm9tb3RlZEJvdW5kXSk7CgogIGFjY2VwdChEYXJ0VHlwZVZpc2l0b3IgdikgPT4gdi52aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKHRoaXMpOwogIGFjY2VwdDEoRGFydFR5cGVWaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRUeXBlUGFyYW1ldGVyVHlwZSh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdikge30KCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpIHsKICAgIHJldHVybiBvdGhlciBpcyBUeXBlUGFyYW1ldGVyVHlwZSAmJiBwYXJhbWV0ZXIgPT0gb3RoZXIucGFyYW1ldGVyOwogIH0KCiAgaW50IGdldCBoYXNoQ29kZSA9PiBfdGVtcG9yYXJ5SGFzaENvZGVUYWJsZVtwYXJhbWV0ZXJdID8/IHBhcmFtZXRlci5oYXNoQ29kZTsKCiAgLy8vIFJldHVybnMgdGhlIGJvdW5kIG9mIHRoZSB0eXBlIHBhcmFtZXRlciwgYWNjb3VudGluZyBmb3IgcHJvbW90aW9ucy4KICBEYXJ0VHlwZSBnZXQgYm91bmQgPT4gcHJvbW90ZWRCb3VuZCA/PyBwYXJhbWV0ZXIuYm91bmQ7Cn0KCi8vLyBEZWNsYXJhdGlvbiBvZiBhIHR5cGUgdmFyaWFibGUuCi8vLwovLy8gVHlwZSBwYXJhbWV0ZXJzIGRlY2xhcmVkIGluIGEgW0NsYXNzXSBvciBbRnVuY3Rpb25Ob2RlXSBhcmUgcGFydCBvZiB0aGUgQVNULAovLy8gaGF2ZSBhIHBhcmVudCBwb2ludGVyIHRvIGl0cyBkZWNsYXJpbmcgY2xhc3Mgb3IgZnVuY3Rpb24sIGFuZCB3aWxsIGJlIHNlZW4KLy8vIGJ5IHRyZWUgdmlzaXRvcnMuCi8vLwovLy8gVHlwZSBwYXJhbWV0ZXJzIGRlY2xhcmVkIGJ5IGEgW0Z1bmN0aW9uVHlwZV0gYXJlIG9ycGhhbnMgYW5kIGhhdmUgYSBgbnVsbGAKLy8vIHBhcmVudCBwb2ludGVyLiAgW1R5cGVQYXJhbWV0ZXJdIG9iamVjdHMgc2hvdWxkIG5vdCBiZSBzaGFyZWQgYmV0d2VlbgovLy8gZGlmZmVyZW50IFtGdW5jdGlvblR5cGVdIG9iamVjdHMuCmNsYXNzIFR5cGVQYXJhbWV0ZXIgZXh0ZW5kcyBUcmVlTm9kZSB7CiAgaW50IGZsYWdzID0gMDsKCiAgLy8vIExpc3Qgb2YgbWV0YWRhdGEgYW5ub3RhdGlvbnMgb24gdGhlIHR5cGUgcGFyYW1ldGVyLgogIC8vLwogIC8vLyBUaGlzIGRlZmF1bHRzIHRvIGFuIGltbXV0YWJsZSBlbXB0eSBsaXN0LiBVc2UgW2FkZEFubm90YXRpb25dIHRvIGFkZAogIC8vLyBhbm5vdGF0aW9ucyBpZiBuZWVkZWQuCiAgTGlzdDxFeHByZXNzaW9uPiBhbm5vdGF0aW9ucyA9IGNvbnN0IDxFeHByZXNzaW9uPltdOwoKICBTdHJpbmcgbmFtZTsgLy8gQ29zbWV0aWMgbmFtZS4KCiAgLy8vIFRoZSBib3VuZCBvbiB0aGUgdHlwZSB2YXJpYWJsZS4KICAvLy8KICAvLy8gU2hvdWxkIG5vdCBiZSBudWxsIGV4Y2VwdCB0ZW1wb3JhcmlseSBkdXJpbmcgSVIgY29uc3RydWN0aW9uLiAgU2hvdWxkCiAgLy8vIGJlIHNldCB0byB0aGUgcm9vdCBjbGFzcyBmb3IgdHlwZSBwYXJhbWV0ZXJzIHdpdGhvdXQgYW4gZXhwbGljaXQgYm91bmQuCiAgRGFydFR5cGUgYm91bmQ7CgogIC8vLyBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgdHlwZSB2YXJpYWJsZS4gSXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZQogIC8vLyBjb3JyZXNwb25kaW5nIG1pc3NpbmcgdHlwZSBhcmd1bWVudCBpbiB0eXBlIGFubm90YXRpb25zIGFuZCBhcyB0aGUKICAvLy8gZmFsbC1iYWNrIHR5cGUgdmFsdWUgaW4gdHlwZSBpbmZlcmVuY2UgYXQgY29tcGlsZSB0aW1lLiBBdCBydW4gdGltZSwKICAvLy8gW2RlZmF1bHRUeXBlXSBpcyB1c2VkIGJ5IHRoZSBiYWNrZW5kcyBpbiBwbGFjZSBvZiB0aGUgbWlzc2luZyB0eXBlCiAgLy8vIGFyZ3VtZW50IG9mIGEgZHluYW1pYyBpbnZvY2F0aW9uIG9mIGEgZ2VuZXJpYyBmdW5jdGlvbi4KICBEYXJ0VHlwZSBkZWZhdWx0VHlwZTsKCiAgVHlwZVBhcmFtZXRlcihbdGhpcy5uYW1lLCB0aGlzLmJvdW5kLCB0aGlzLmRlZmF1bHRUeXBlXSk7CgogIC8vIE11c3QgbWF0Y2ggc2VyaWFsaXplZCBiaXQgcG9zaXRpb25zLgogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0gMSA8PCAwOwoKICAvLy8gSWYgdGhpcyBbVHlwZVBhcmFtZXRlcl0gaXMgYSB0eXBlIHBhcmFtZXRlciBvZiBhIGdlbmVyaWMgbWV0aG9kLCBpbmRpY2F0ZXMKICAvLy8gd2hldGhlciB0aGUgbWV0aG9kIGltcGxlbWVudGF0aW9uIG5lZWRzIHRvIGNvbnRhaW4gYSBydW50aW1lIHR5cGUgY2hlY2sgdG8KICAvLy8gZGVhbCB3aXRoIGdlbmVyaWMgY292YXJpYW5jZS4KICAvLy8KICAvLy8gV2hlbiBgdHJ1ZWAsIHJ1bnRpbWUgY2hlY2tzIG1heSBuZWVkIHRvIGJlIHBlcmZvcm1lZDsgc2VlCiAgLy8vIFtEaXNwYXRjaENhdGVnb3J5XSBmb3IgZGV0YWlscy4KICBib29sIGdldCBpc0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0+IGZsYWdzICYgRmxhZ0dlbmVyaWNDb3ZhcmlhbnRJbXBsICE9IDA7CgogIHZvaWQgc2V0IGlzR2VuZXJpY0NvdmFyaWFudEltcGwoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZQogICAgICAgID8gKGZsYWdzIHwgRmxhZ0dlbmVyaWNDb3ZhcmlhbnRJbXBsKQogICAgICAgIDogKGZsYWdzICYgfkZsYWdHZW5lcmljQ292YXJpYW50SW1wbCk7CiAgfQoKICB2b2lkIGFkZEFubm90YXRpb24oRXhwcmVzc2lvbiBhbm5vdGF0aW9uKSB7CiAgICBpZiAoYW5ub3RhdGlvbnMuaXNFbXB0eSkgewogICAgICBhbm5vdGF0aW9ucyA9IDxFeHByZXNzaW9uPltdOwogICAgfQogICAgYW5ub3RhdGlvbnMuYWRkKGFubm90YXRpb24uLnBhcmVudCA9IHRoaXMpOwogIH0KCiAgYWNjZXB0KFRyZWVWaXNpdG9yIHYpID0+IHYudmlzaXRUeXBlUGFyYW1ldGVyKHRoaXMpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdmlzaXRMaXN0KGFubm90YXRpb25zLCB2KTsKICAgIGJvdW5kLmFjY2VwdCh2KTsKICAgIGRlZmF1bHRUeXBlPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICB0cmFuc2Zvcm1MaXN0KGFubm90YXRpb25zLCB2LCB0aGlzKTsKICAgIGJvdW5kID0gdi52aXNpdERhcnRUeXBlKGJvdW5kKTsKICAgIGlmIChkZWZhdWx0VHlwZSAhPSBudWxsKSB7CiAgICAgIGRlZmF1bHRUeXBlID0gdi52aXNpdERhcnRUeXBlKGRlZmF1bHRUeXBlKTsKICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIGEgcG9zc2libHkgc3ludGhlc2l6ZWQgbmFtZSBmb3IgdGhpcyB0eXBlIHBhcmFtZXRlciwgY29uc2lzdGVudAogIC8vLyB3aXRoIHRoZSBuYW1lcyB1c2VkIGFjcm9zcyBhbGwgW3RvU3RyaW5nXSBjYWxscy4KICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBkZWJ1Z1F1YWxpZmllZFR5cGVQYXJhbWV0ZXJOYW1lKHRoaXMpOwoKICBib29sIGdldCBpc0Z1bmN0aW9uVHlwZVR5cGVQYXJhbWV0ZXIgPT4gcGFyZW50ID09IG51bGw7Cn0KCmNsYXNzIFN1cGVydHlwZSBleHRlbmRzIE5vZGUgewogIFJlZmVyZW5jZSBjbGFzc05hbWU7CiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKCiAgU3VwZXJ0eXBlKENsYXNzIGNsYXNzTm9kZSwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKGdldENsYXNzUmVmZXJlbmNlKGNsYXNzTm9kZSksIHR5cGVBcmd1bWVudHMpOwoKICBTdXBlcnR5cGUuYnlSZWZlcmVuY2UodGhpcy5jbGFzc05hbWUsIHRoaXMudHlwZUFyZ3VtZW50cyk7CgogIENsYXNzIGdldCBjbGFzc05vZGUgPT4gY2xhc3NOYW1lLmFzQ2xhc3M7CgogIGFjY2VwdChWaXNpdG9yIHYpID0+IHYudmlzaXRTdXBlcnR5cGUodGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBjbGFzc05vZGUuYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgdmlzaXRMaXN0KHR5cGVBcmd1bWVudHMsIHYpOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXQgYXNJbnRlcmZhY2VUeXBlIHsKICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZShjbGFzc05vZGUsIHR5cGVBcmd1bWVudHMpOwogIH0KCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyBTdXBlcnR5cGUpIHsKICAgICAgaWYgKGNsYXNzTmFtZSAhPSBvdGhlci5jbGFzc05hbWUpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoICE9IG90aGVyLnR5cGVBcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgewogICAgICAgIGlmICh0eXBlQXJndW1lbnRzW2ldICE9IG90aGVyLnR5cGVBcmd1bWVudHNbaV0pIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIGludCBnZXQgaGFzaENvZGUgewogICAgaW50IGhhc2ggPSAweDNmZmZmZmZmICYgY2xhc3NOYW1lLmhhc2hDb2RlOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgIGhhc2ggPSAweDNmZmZmZmZmICYgKGhhc2ggKiAzMSArIChoYXNoIF4gdHlwZUFyZ3VtZW50c1tpXS5oYXNoQ29kZSkpOwogICAgfQogICAgcmV0dXJuIGhhc2g7CiAgfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlNUQU5UUwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmFic3RyYWN0IGNsYXNzIENvbnN0YW50IGV4dGVuZHMgTm9kZSB7CiAgLy8vIENhbGxzIHRoZSBgdmlzaXQqQ29uc3RhbnRSZWZlcmVuY2UoKWAgbWV0aG9kIG9uIHZpc2l0b3IgW3ZdIGZvciBhbGwKICAvLy8gY29uc3RhbnRzIHJlZmVyZW5jZWQgaW4gdGhpcyBjb25zdGFudC4KICAvLy8KICAvLy8gKE5vdGUgdGhhdCBhIGNvbnN0YW50IGNhbiBiZSBzZWVuIGFzIGEgREFHIChkaXJlY3RlZCBhY3ljbGljIGdyYXBoKSBhbmQKICAvLy8gIG5vdCBhIHRyZWUhKQogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KTsKCiAgLy8vIENhbGxzIHRoZSBgdmlzaXQqQ29uc3RhbnQoKWAgbWV0aG9kIG9uIHRoZSB2aXNpdG9yIFt2XS4KICBhY2NlcHQoQ29uc3RhbnRWaXNpdG9yIHYpOwoKICAvLy8gQ2FsbHMgdGhlIGB2aXNpdCpDb25zdGFudFJlZmVyZW5jZSgpYCBtZXRob2Qgb24gdGhlIHZpc2l0b3IgW3ZdLgogIGFjY2VwdFJlZmVyZW5jZShWaXNpdG9yIHYpOwoKICAvLy8gVGhlIEtlcm5lbCBBU1Qgd2lsbCByZWZlcmVuY2UgW0NvbnN0YW50XXMgdmlhIFtDb25zdGFudEV4cHJlc3Npb25dcy4gIFRoZQogIC8vLyBjb25zdGFudHMgYXJlIG5vdCByZXF1aXJlZCB0byBiZSBjYW5vbmljYWxpemVkLCBidXQgdGhleSBoYXZlIHRvIGJlIGRlZXBseQogIC8vLyBjb21wYXJhYmxlIHZpYSBoYXNoQ29kZS89PSEKICBpbnQgZ2V0IGhhc2hDb2RlOwogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKTsKCiAgLy8vIEdldHMgdGhlIHR5cGUgb2YgdGhpcyBjb25zdGFudC4KICBEYXJ0VHlwZSBnZXRUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcyk7CgogIEV4cHJlc3Npb24gYXNFeHByZXNzaW9uKCkgewogICAgcmV0dXJuIG5ldyBDb25zdGFudEV4cHJlc3Npb24odGhpcyk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBQcmltaXRpdmVDb25zdGFudDxUPiBleHRlbmRzIENvbnN0YW50IHsKICBmaW5hbCBUIHZhbHVlOwoKICBQcmltaXRpdmVDb25zdGFudCh0aGlzLnZhbHVlKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyR2YWx1ZSc7CgogIGludCBnZXQgaGFzaENvZGUgPT4gdmFsdWUuaGFzaENvZGU7CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSA9PgogICAgICBvdGhlciBpcyBQcmltaXRpdmVDb25zdGFudDxUPiAmJiBvdGhlci52YWx1ZSA9PSB2YWx1ZTsKfQoKY2xhc3MgTnVsbENvbnN0YW50IGV4dGVuZHMgUHJpbWl0aXZlQ29uc3RhbnQ8TnVsbD4gewogIE51bGxDb25zdGFudCgpIDogc3VwZXIobnVsbCk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQogIGFjY2VwdChDb25zdGFudFZpc2l0b3IgdikgPT4gdi52aXNpdE51bGxDb25zdGFudCh0aGlzKTsKICBhY2NlcHRSZWZlcmVuY2UoVmlzaXRvciB2KSA9PiB2LnZpc2l0TnVsbENvbnN0YW50UmVmZXJlbmNlKHRoaXMpOwoKICBEYXJ0VHlwZSBnZXRUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gdHlwZXMubnVsbFR5cGU7Cn0KCmNsYXNzIEJvb2xDb25zdGFudCBleHRlbmRzIFByaW1pdGl2ZUNvbnN0YW50PGJvb2w+IHsKICBCb29sQ29uc3RhbnQoYm9vbCB2YWx1ZSkgOiBzdXBlcih2YWx1ZSk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQogIGFjY2VwdChDb25zdGFudFZpc2l0b3IgdikgPT4gdi52aXNpdEJvb2xDb25zdGFudCh0aGlzKTsKICBhY2NlcHRSZWZlcmVuY2UoVmlzaXRvciB2KSA9PiB2LnZpc2l0Qm9vbENvbnN0YW50UmVmZXJlbmNlKHRoaXMpOwoKICBEYXJ0VHlwZSBnZXRUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gdHlwZXMuYm9vbFR5cGU7Cn0KCmNsYXNzIEludENvbnN0YW50IGV4dGVuZHMgUHJpbWl0aXZlQ29uc3RhbnQ8aW50PiB7CiAgSW50Q29uc3RhbnQoaW50IHZhbHVlKSA6IHN1cGVyKHZhbHVlKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHt9CiAgYWNjZXB0KENvbnN0YW50VmlzaXRvciB2KSA9PiB2LnZpc2l0SW50Q29uc3RhbnQodGhpcyk7CiAgYWNjZXB0UmVmZXJlbmNlKFZpc2l0b3IgdikgPT4gdi52aXNpdEludENvbnN0YW50UmVmZXJlbmNlKHRoaXMpOwoKICBEYXJ0VHlwZSBnZXRUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gdHlwZXMuaW50VHlwZTsKfQoKY2xhc3MgRG91YmxlQ29uc3RhbnQgZXh0ZW5kcyBQcmltaXRpdmVDb25zdGFudDxkb3VibGU+IHsKICBEb3VibGVDb25zdGFudChkb3VibGUgdmFsdWUpIDogc3VwZXIodmFsdWUpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdikge30KICBhY2NlcHQoQ29uc3RhbnRWaXNpdG9yIHYpID0+IHYudmlzaXREb3VibGVDb25zdGFudCh0aGlzKTsKICBhY2NlcHRSZWZlcmVuY2UoVmlzaXRvciB2KSA9PiB2LnZpc2l0RG91YmxlQ29uc3RhbnRSZWZlcmVuY2UodGhpcyk7CgogIGludCBnZXQgaGFzaENvZGUgPT4gdmFsdWUuaXNOYU4gPyAxOTkgOiBzdXBlci5oYXNoQ29kZTsKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgPT4KICAgICAgb3RoZXIgaXMgRG91YmxlQ29uc3RhbnQgJiYgaWRlbnRpY2FsKHZhbHVlLCBvdGhlci52YWx1ZSk7CgogIERhcnRUeXBlIGdldFR5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PiB0eXBlcy5kb3VibGVUeXBlOwp9CgpjbGFzcyBTdHJpbmdDb25zdGFudCBleHRlbmRzIFByaW1pdGl2ZUNvbnN0YW50PFN0cmluZz4gewogIFN0cmluZ0NvbnN0YW50KFN0cmluZyB2YWx1ZSkgOiBzdXBlcih2YWx1ZSkgewogICAgYXNzZXJ0KHZhbHVlICE9IG51bGwpOwogIH0KCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHt9CiAgYWNjZXB0KENvbnN0YW50VmlzaXRvciB2KSA9PiB2LnZpc2l0U3RyaW5nQ29uc3RhbnQodGhpcyk7CiAgYWNjZXB0UmVmZXJlbmNlKFZpc2l0b3IgdikgPT4gdi52aXNpdFN0cmluZ0NvbnN0YW50UmVmZXJlbmNlKHRoaXMpOwoKICBEYXJ0VHlwZSBnZXRUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gdHlwZXMuc3RyaW5nVHlwZTsKfQoKY2xhc3MgU3ltYm9sQ29uc3RhbnQgZXh0ZW5kcyBDb25zdGFudCB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgZmluYWwgUmVmZXJlbmNlIGxpYnJhcnlSZWZlcmVuY2U7CgogIFN5bWJvbENvbnN0YW50KHRoaXMubmFtZSwgdGhpcy5saWJyYXJ5UmVmZXJlbmNlKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHt9CgogIGFjY2VwdChDb25zdGFudFZpc2l0b3IgdikgPT4gdi52aXNpdFN5bWJvbENvbnN0YW50KHRoaXMpOwogIGFjY2VwdFJlZmVyZW5jZShWaXNpdG9yIHYpID0+IHYudmlzaXRTeW1ib2xDb25zdGFudFJlZmVyZW5jZSh0aGlzKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuIGxpYnJhcnlSZWZlcmVuY2UgIT0gbnVsbAogICAgICAgID8gJyMke2xpYnJhcnlSZWZlcmVuY2UuYXNMaWJyYXJ5LmltcG9ydFVyaX06OiRuYW1lJwogICAgICAgIDogJyMkbmFtZSc7CiAgfQoKICBpbnQgZ2V0IGhhc2hDb2RlID0+IG5hbWUuaGFzaENvZGUgXiBsaWJyYXJ5UmVmZXJlbmNlLmhhc2hDb2RlOwoKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgPT4KICAgICAgaWRlbnRpY2FsKHRoaXMsIG90aGVyKSB8fAogICAgICAob3RoZXIgaXMgU3ltYm9sQ29uc3RhbnQgJiYKICAgICAgICAgIG90aGVyLm5hbWUgPT0gbmFtZSAmJgogICAgICAgICAgb3RoZXIubGlicmFyeVJlZmVyZW5jZSA9PSBsaWJyYXJ5UmVmZXJlbmNlKTsKCiAgRGFydFR5cGUgZ2V0VHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpID0+IHR5cGVzLnN5bWJvbFR5cGU7Cn0KCmNsYXNzIE1hcENvbnN0YW50IGV4dGVuZHMgQ29uc3RhbnQgewogIGZpbmFsIERhcnRUeXBlIGtleVR5cGU7CiAgZmluYWwgRGFydFR5cGUgdmFsdWVUeXBlOwogIGZpbmFsIExpc3Q8Q29uc3RhbnRNYXBFbnRyeT4gZW50cmllczsKCiAgTWFwQ29uc3RhbnQodGhpcy5rZXlUeXBlLCB0aGlzLnZhbHVlVHlwZSwgdGhpcy5lbnRyaWVzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGtleVR5cGUuYWNjZXB0KHYpOwogICAgdmFsdWVUeXBlLmFjY2VwdCh2KTsKICAgIGZvciAoZmluYWwgQ29uc3RhbnRNYXBFbnRyeSBlbnRyeSBpbiBlbnRyaWVzKSB7CiAgICAgIGVudHJ5LmtleS5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICAgIGVudHJ5LnZhbHVlLmFjY2VwdFJlZmVyZW5jZSh2KTsKICAgIH0KICB9CgogIGFjY2VwdChDb25zdGFudFZpc2l0b3IgdikgPT4gdi52aXNpdE1hcENvbnN0YW50KHRoaXMpOwogIGFjY2VwdFJlZmVyZW5jZShWaXNpdG9yIHYpID0+IHYudmlzaXRNYXBDb25zdGFudFJlZmVyZW5jZSh0aGlzKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyR7dGhpcy5ydW50aW1lVHlwZX08JGtleVR5cGUsICR2YWx1ZVR5cGU+KCRlbnRyaWVzKSc7CgogIC8vIFRPRE8oa3VzdGVybWFubik6IENvbnNpZGVyIGNvbWJpbmluZyB0aGUgaGFzaCBjb2RlcyBpbiBhIGJldHRlciB3YXkgKGFsc28KICAvLyBiZWxvdyBhbmQgaW4gW2xpc3RIYXNoQ29kZV0vW21hcEhhc2hDb2RlXS4KICBpbnQgX2NhY2hlZEhhc2hDb2RlOwogIGludCBnZXQgaGFzaENvZGUgewogICAgcmV0dXJuIF9jYWNoZWRIYXNoQ29kZSA/Pz0KICAgICAgICBrZXlUeXBlLmhhc2hDb2RlIF4gdmFsdWVUeXBlLmhhc2hDb2RlIF4gbGlzdEhhc2hDb2RlKGVudHJpZXMpOwogIH0KCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpID0+CiAgICAgIGlkZW50aWNhbCh0aGlzLCBvdGhlcikgfHwKICAgICAgKG90aGVyIGlzIE1hcENvbnN0YW50ICYmCiAgICAgICAgICBvdGhlci5rZXlUeXBlID09IGtleVR5cGUgJiYKICAgICAgICAgIG90aGVyLnZhbHVlVHlwZSA9PSB2YWx1ZVR5cGUgJiYKICAgICAgICAgIGxpc3RFcXVhbHMob3RoZXIuZW50cmllcywgZW50cmllcykpOwoKICBEYXJ0VHlwZSBnZXRUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4KICAgICAgdHlwZXMubGl0ZXJhbE1hcFR5cGUoa2V5VHlwZSwgdmFsdWVUeXBlKTsKfQoKY2xhc3MgQ29uc3RhbnRNYXBFbnRyeSB7CiAgZmluYWwgQ29uc3RhbnQga2V5OwogIGZpbmFsIENvbnN0YW50IHZhbHVlOwogIENvbnN0YW50TWFwRW50cnkodGhpcy5rZXksIHRoaXMudmFsdWUpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJGtleTogJHZhbHVlJzsKCiAgaW50IGdldCBoYXNoQ29kZSA9PiBrZXkuaGFzaENvZGUgXiB2YWx1ZS5oYXNoQ29kZTsKCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpID0+CiAgICAgIG90aGVyIGlzIENvbnN0YW50TWFwRW50cnkgJiYgb3RoZXIua2V5ID09IGtleSAmJiBvdGhlci52YWx1ZSA9PSB2YWx1ZTsKfQoKY2xhc3MgTGlzdENvbnN0YW50IGV4dGVuZHMgQ29uc3RhbnQgewogIGZpbmFsIERhcnRUeXBlIHR5cGVBcmd1bWVudDsKICBmaW5hbCBMaXN0PENvbnN0YW50PiBlbnRyaWVzOwoKICBMaXN0Q29uc3RhbnQodGhpcy50eXBlQXJndW1lbnQsIHRoaXMuZW50cmllcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB0eXBlQXJndW1lbnQuYWNjZXB0KHYpOwogICAgZm9yIChmaW5hbCBDb25zdGFudCBjb25zdGFudCBpbiBlbnRyaWVzKSB7CiAgICAgIGNvbnN0YW50LmFjY2VwdFJlZmVyZW5jZSh2KTsKICAgIH0KICB9CgogIGFjY2VwdChDb25zdGFudFZpc2l0b3IgdikgPT4gdi52aXNpdExpc3RDb25zdGFudCh0aGlzKTsKICBhY2NlcHRSZWZlcmVuY2UoVmlzaXRvciB2KSA9PiB2LnZpc2l0TGlzdENvbnN0YW50UmVmZXJlbmNlKHRoaXMpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJHt0aGlzLnJ1bnRpbWVUeXBlfTwkdHlwZUFyZ3VtZW50PigkZW50cmllcyknOwoKICBpbnQgX2NhY2hlZEhhc2hDb2RlOwogIGludCBnZXQgaGFzaENvZGUgewogICAgcmV0dXJuIF9jYWNoZWRIYXNoQ29kZSA/Pz0gdHlwZUFyZ3VtZW50Lmhhc2hDb2RlIF4gbGlzdEhhc2hDb2RlKGVudHJpZXMpOwogIH0KCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpID0+CiAgICAgIGlkZW50aWNhbCh0aGlzLCBvdGhlcikgfHwKICAgICAgKG90aGVyIGlzIExpc3RDb25zdGFudCAmJgogICAgICAgICAgb3RoZXIudHlwZUFyZ3VtZW50ID09IHR5cGVBcmd1bWVudCAmJgogICAgICAgICAgbGlzdEVxdWFscyhvdGhlci5lbnRyaWVzLCBlbnRyaWVzKSk7CgogIERhcnRUeXBlIGdldFR5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PgogICAgICB0eXBlcy5saXRlcmFsTGlzdFR5cGUodHlwZUFyZ3VtZW50KTsKfQoKY2xhc3MgU2V0Q29uc3RhbnQgZXh0ZW5kcyBDb25zdGFudCB7CiAgZmluYWwgRGFydFR5cGUgdHlwZUFyZ3VtZW50OwogIGZpbmFsIExpc3Q8Q29uc3RhbnQ+IGVudHJpZXM7CgogIFNldENvbnN0YW50KHRoaXMudHlwZUFyZ3VtZW50LCB0aGlzLmVudHJpZXMpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdHlwZUFyZ3VtZW50LmFjY2VwdCh2KTsKICAgIGZvciAoZmluYWwgQ29uc3RhbnQgY29uc3RhbnQgaW4gZW50cmllcykgewogICAgICBjb25zdGFudC5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICB9CiAgfQoKICBhY2NlcHQoQ29uc3RhbnRWaXNpdG9yIHYpID0+IHYudmlzaXRTZXRDb25zdGFudCh0aGlzKTsKICBhY2NlcHRSZWZlcmVuY2UoVmlzaXRvciB2KSA9PiB2LnZpc2l0U2V0Q29uc3RhbnRSZWZlcmVuY2UodGhpcyk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICcke3RoaXMucnVudGltZVR5cGV9PCR0eXBlQXJndW1lbnQ+KCRlbnRyaWVzKSc7CgogIGludCBfY2FjaGVkSGFzaENvZGU7CiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICByZXR1cm4gX2NhY2hlZEhhc2hDb2RlID8/PSB0eXBlQXJndW1lbnQuaGFzaENvZGUgXiBsaXN0SGFzaENvZGUoZW50cmllcyk7CiAgfQoKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgPT4KICAgICAgaWRlbnRpY2FsKHRoaXMsIG90aGVyKSB8fAogICAgICAob3RoZXIgaXMgU2V0Q29uc3RhbnQgJiYKICAgICAgICAgIG90aGVyLnR5cGVBcmd1bWVudCA9PSB0eXBlQXJndW1lbnQgJiYKICAgICAgICAgIGxpc3RFcXVhbHMob3RoZXIuZW50cmllcywgZW50cmllcykpOwoKICBEYXJ0VHlwZSBnZXRUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gdHlwZXMubGl0ZXJhbFNldFR5cGUodHlwZUFyZ3VtZW50KTsKfQoKY2xhc3MgSW5zdGFuY2VDb25zdGFudCBleHRlbmRzIENvbnN0YW50IHsKICBmaW5hbCBSZWZlcmVuY2UgY2xhc3NSZWZlcmVuY2U7CiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKICBmaW5hbCBNYXA8UmVmZXJlbmNlLCBDb25zdGFudD4gZmllbGRWYWx1ZXM7CgogIEluc3RhbmNlQ29uc3RhbnQodGhpcy5jbGFzc1JlZmVyZW5jZSwgdGhpcy50eXBlQXJndW1lbnRzLCB0aGlzLmZpZWxkVmFsdWVzKTsKCiAgQ2xhc3MgZ2V0IGNsYXNzTm9kZSA9PiBjbGFzc1JlZmVyZW5jZS5hc0NsYXNzOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgY2xhc3NSZWZlcmVuY2UuYXNDbGFzcy5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICB2aXNpdExpc3QodHlwZUFyZ3VtZW50cywgdik7CiAgICBmb3IgKGZpbmFsIFJlZmVyZW5jZSByZWZlcmVuY2UgaW4gZmllbGRWYWx1ZXMua2V5cykgewogICAgICByZWZlcmVuY2UuYXNGaWVsZC5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICB9CiAgICBmb3IgKGZpbmFsIENvbnN0YW50IGNvbnN0YW50IGluIGZpZWxkVmFsdWVzLnZhbHVlcykgewogICAgICBjb25zdGFudC5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICB9CiAgfQoKICBhY2NlcHQoQ29uc3RhbnRWaXNpdG9yIHYpID0+IHYudmlzaXRJbnN0YW5jZUNvbnN0YW50KHRoaXMpOwogIGFjY2VwdFJlZmVyZW5jZShWaXNpdG9yIHYpID0+IHYudmlzaXRJbnN0YW5jZUNvbnN0YW50UmVmZXJlbmNlKHRoaXMpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBmaW5hbCBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCcke2NsYXNzUmVmZXJlbmNlLmFzQ2xhc3N9Jyk7CiAgICBpZiAoIWNsYXNzUmVmZXJlbmNlLmFzQ2xhc3MudHlwZVBhcmFtZXRlcnMuaXNFbXB0eSkgewogICAgICBzYi53cml0ZSgnPCcpOwogICAgICBzYi53cml0ZSh0eXBlQXJndW1lbnRzLm1hcCgodHlwZSkgPT4gdHlwZS50b1N0cmluZygpKS5qb2luKCcsICcpKTsKICAgICAgc2Iud3JpdGUoJz4nKTsKICAgIH0KICAgIHNiLndyaXRlKCcgeycpOwogICAgZmllbGRWYWx1ZXMuZm9yRWFjaCgoUmVmZXJlbmNlIGZpZWxkUmVmLCBDb25zdGFudCBjb25zdGFudCkgewogICAgICBzYi53cml0ZSgnJHtmaWVsZFJlZi5hc0ZpZWxkLm5hbWV9OiAkY29uc3RhbnQsICcpOwogICAgfSk7CiAgICBzYi53cml0ZSgnfScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQoKICBpbnQgX2NhY2hlZEhhc2hDb2RlOwogIGludCBnZXQgaGFzaENvZGUgewogICAgcmV0dXJuIF9jYWNoZWRIYXNoQ29kZSA/Pz0gY2xhc3NSZWZlcmVuY2UuaGFzaENvZGUgXgogICAgICAgIGxpc3RIYXNoQ29kZSh0eXBlQXJndW1lbnRzKSBeCiAgICAgICAgbWFwSGFzaENvZGUoZmllbGRWYWx1ZXMpOwogIH0KCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpIHsKICAgIHJldHVybiBpZGVudGljYWwodGhpcywgb3RoZXIpIHx8CiAgICAgICAgKG90aGVyIGlzIEluc3RhbmNlQ29uc3RhbnQgJiYKICAgICAgICAgICAgb3RoZXIuY2xhc3NSZWZlcmVuY2UgPT0gY2xhc3NSZWZlcmVuY2UgJiYKICAgICAgICAgICAgbGlzdEVxdWFscyhvdGhlci50eXBlQXJndW1lbnRzLCB0eXBlQXJndW1lbnRzKSAmJgogICAgICAgICAgICBtYXBFcXVhbHMob3RoZXIuZmllbGRWYWx1ZXMsIGZpZWxkVmFsdWVzKSk7CiAgfQoKICBEYXJ0VHlwZSBnZXRUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4KICAgICAgbmV3IEludGVyZmFjZVR5cGUoY2xhc3NOb2RlLCB0eXBlQXJndW1lbnRzKTsKfQoKY2xhc3MgUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCBleHRlbmRzIENvbnN0YW50IHsKICBmaW5hbCBUZWFyT2ZmQ29uc3RhbnQgdGVhck9mZkNvbnN0YW50OwogIGZpbmFsIExpc3Q8RGFydFR5cGU+IHR5cGVzOwoKICBQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50KHRoaXMudGVhck9mZkNvbnN0YW50LCB0aGlzLnR5cGVzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHRlYXJPZmZDb25zdGFudC5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICB2aXNpdExpc3QodHlwZXMsIHYpOwogIH0KCiAgYWNjZXB0KENvbnN0YW50VmlzaXRvciB2KSA9PiB2LnZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCh0aGlzKTsKICBhY2NlcHRSZWZlcmVuY2UoVmlzaXRvciB2KSA9PgogICAgICB2LnZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudFJlZmVyZW5jZSh0aGlzKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICcke3J1bnRpbWVUeXBlfSgke3RlYXJPZmZDb25zdGFudC5wcm9jZWR1cmV9PCR7dHlwZXMuam9pbignLCAnKX0+KSc7CiAgfQoKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHRlYXJPZmZDb25zdGFudC5oYXNoQ29kZSBeIGxpc3RIYXNoQ29kZSh0eXBlcyk7CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSB7CiAgICByZXR1cm4gb3RoZXIgaXMgUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCAmJgogICAgICAgIG90aGVyLnRlYXJPZmZDb25zdGFudCA9PSB0ZWFyT2ZmQ29uc3RhbnQgJiYKICAgICAgICBsaXN0RXF1YWxzKG90aGVyLnR5cGVzLCB0eXBlcyk7CiAgfQoKICBEYXJ0VHlwZSBnZXRUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQpIHsKICAgIGZpbmFsIEZ1bmN0aW9uVHlwZSB0eXBlID0gdGVhck9mZkNvbnN0YW50LmdldFR5cGUodHlwZUVudmlyb25tZW50KTsKICAgIGZpbmFsIG1hcHBpbmcgPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICBmb3IgKGZpbmFsIHBhcmFtZXRlciBpbiB0eXBlLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgIG1hcHBpbmdbcGFyYW1ldGVyXSA9IHR5cGVzW21hcHBpbmcubGVuZ3RoXTsKICAgIH0KICAgIHJldHVybiBzdWJzdGl0dXRlKHR5cGUud2l0aG91dFR5cGVQYXJhbWV0ZXJzLCBtYXBwaW5nKTsKICB9Cn0KCmNsYXNzIFRlYXJPZmZDb25zdGFudCBleHRlbmRzIENvbnN0YW50IHsKICBmaW5hbCBSZWZlcmVuY2UgcHJvY2VkdXJlUmVmZXJlbmNlOwoKICBUZWFyT2ZmQ29uc3RhbnQoUHJvY2VkdXJlIHByb2NlZHVyZSkKICAgICAgOiBwcm9jZWR1cmVSZWZlcmVuY2UgPSBwcm9jZWR1cmUucmVmZXJlbmNlIHsKICAgIGFzc2VydChwcm9jZWR1cmUuaXNTdGF0aWMpOwogIH0KCiAgVGVhck9mZkNvbnN0YW50LmJ5UmVmZXJlbmNlKHRoaXMucHJvY2VkdXJlUmVmZXJlbmNlKTsKCiAgUHJvY2VkdXJlIGdldCBwcm9jZWR1cmUgPT4gcHJvY2VkdXJlUmVmZXJlbmNlPy5hc1Byb2NlZHVyZTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHByb2NlZHVyZVJlZmVyZW5jZS5hc1Byb2NlZHVyZS5hY2NlcHRSZWZlcmVuY2Uodik7CiAgfQoKICBhY2NlcHQoQ29uc3RhbnRWaXNpdG9yIHYpID0+IHYudmlzaXRUZWFyT2ZmQ29uc3RhbnQodGhpcyk7CiAgYWNjZXB0UmVmZXJlbmNlKFZpc2l0b3IgdikgPT4gdi52aXNpdFRlYXJPZmZDb25zdGFudFJlZmVyZW5jZSh0aGlzKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICcke3J1bnRpbWVUeXBlfSgke3Byb2NlZHVyZX0pJzsKICB9CgogIGludCBnZXQgaGFzaENvZGUgPT4gcHJvY2VkdXJlLmhhc2hDb2RlOwoKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgcmV0dXJuIG90aGVyIGlzIFRlYXJPZmZDb25zdGFudCAmJiBvdGhlci5wcm9jZWR1cmUgPT0gcHJvY2VkdXJlOwogIH0KCiAgRnVuY3Rpb25UeXBlIGdldFR5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PgogICAgICBwcm9jZWR1cmUuZnVuY3Rpb24uZnVuY3Rpb25UeXBlOwp9CgpjbGFzcyBUeXBlTGl0ZXJhbENvbnN0YW50IGV4dGVuZHMgQ29uc3RhbnQgewogIGZpbmFsIERhcnRUeXBlIHR5cGU7CgogIFR5cGVMaXRlcmFsQ29uc3RhbnQodGhpcy50eXBlKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHR5cGUuYWNjZXB0KHYpOwogIH0KCiAgYWNjZXB0KENvbnN0YW50VmlzaXRvciB2KSA9PiB2LnZpc2l0VHlwZUxpdGVyYWxDb25zdGFudCh0aGlzKTsKICBhY2NlcHRSZWZlcmVuY2UoVmlzaXRvciB2KSA9PiB2LnZpc2l0VHlwZUxpdGVyYWxDb25zdGFudFJlZmVyZW5jZSh0aGlzKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyR7cnVudGltZVR5cGV9KCR7dHlwZX0pJzsKCiAgaW50IGdldCBoYXNoQ29kZSA9PiB0eXBlLmhhc2hDb2RlOwoKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgcmV0dXJuIG90aGVyIGlzIFR5cGVMaXRlcmFsQ29uc3RhbnQgJiYgb3RoZXIudHlwZSA9PSB0eXBlOwogIH0KCiAgRGFydFR5cGUgZ2V0VHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpID0+IHR5cGVzLnR5cGVUeXBlOwp9CgpjbGFzcyBVbmV2YWx1YXRlZENvbnN0YW50IGV4dGVuZHMgQ29uc3RhbnQgewogIGZpbmFsIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKCiAgVW5ldmFsdWF0ZWRDb25zdGFudCh0aGlzLmV4cHJlc3Npb24pIHsKICAgIGV4cHJlc3Npb24/LnBhcmVudCA9IG51bGw7CiAgfQoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgZXhwcmVzc2lvbi5hY2NlcHQodik7CiAgfQoKICBhY2NlcHQoQ29uc3RhbnRWaXNpdG9yIHYpID0+IHYudmlzaXRVbmV2YWx1YXRlZENvbnN0YW50KHRoaXMpOwogIGFjY2VwdFJlZmVyZW5jZShWaXNpdG9yIHYpID0+IHYudmlzaXRVbmV2YWx1YXRlZENvbnN0YW50UmVmZXJlbmNlKHRoaXMpOwoKICBEYXJ0VHlwZSBnZXRUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gZXhwcmVzc2lvbi5nZXRTdGF0aWNUeXBlKHR5cGVzKTsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBhc0V4cHJlc3Npb24oKSA9PiBleHByZXNzaW9uOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVAovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLyBBIHdheSB0byBidW5kbGUgdXAgbGlicmFyaWVzIGluIGEgY29tcG9uZW50LgpjbGFzcyBDb21wb25lbnQgZXh0ZW5kcyBUcmVlTm9kZSB7CiAgZmluYWwgQ2Fub25pY2FsTmFtZSByb290OwoKICAvLy8gUHJvYmxlbXMgaW4gdGhpcyBbQ29tcG9uZW50XSBlbmNvZGVkIGFzIGpzb24gb2JqZWN0cy4KICAvLy8KICAvLy8gTm90ZSB0aGF0IHRoaXMgZmllbGQgY2FuIGJlIG51bGwsIGFuZCBieSBjb252ZW50aW9uIHNob3VsZCBiZSBudWxsIGlmIHRoZQogIC8vLyBsaXN0IGlzIGVtcHR5LgogIExpc3Q8U3RyaW5nPiBwcm9ibGVtc0FzSnNvbjsKCiAgZmluYWwgTGlzdDxMaWJyYXJ5PiBsaWJyYXJpZXM7CgogIC8vLyBNYXAgZnJvbSBhIHNvdXJjZSBmaWxlIFVSSSB0byBhIGxpbmUtc3RhcnRzIHRhYmxlIGFuZCBzb3VyY2UgY29kZS4KICAvLy8gR2l2ZW4gYSBzb3VyY2UgZmlsZSBVUkkgYW5kIGEgb2Zmc2V0IGluIHRoYXQgZmlsZSBvbmUgY2FuIHRyYW5zbGF0ZQogIC8vLyBpdCB0byBhIGxpbmU6Y29sdW1uIHBvc2l0aW9uIGluIHRoYXQgZmlsZS4KICBmaW5hbCBNYXA8VXJpLCBTb3VyY2U+IHVyaVRvU291cmNlOwoKICAvLy8gTWFwcGluZyBiZXR3ZWVuIHN0cmluZyB0YWdzIGFuZCBbTWV0YWRhdGFSZXBvc2l0b3J5XSBjb3JyZXNwb25kaW5nIHRvCiAgLy8vIHRob3NlIHRhZ3MuCiAgZmluYWwgTWFwPFN0cmluZywgTWV0YWRhdGFSZXBvc2l0b3J5PGR5bmFtaWM+PiBtZXRhZGF0YSA9CiAgICAgIDxTdHJpbmcsIE1ldGFkYXRhUmVwb3NpdG9yeTxkeW5hbWljPj57fTsKCiAgLy8vIFJlZmVyZW5jZSB0byB0aGUgbWFpbiBtZXRob2QgaW4gb25lIG9mIHRoZSBsaWJyYXJpZXMuCiAgUmVmZXJlbmNlIG1haW5NZXRob2ROYW1lOwoKICBDb21wb25lbnQoCiAgICAgIHtDYW5vbmljYWxOYW1lIG5hbWVSb290LAogICAgICBMaXN0PExpYnJhcnk+IGxpYnJhcmllcywKICAgICAgTWFwPFVyaSwgU291cmNlPiB1cmlUb1NvdXJjZX0pCiAgICAgIDogcm9vdCA9IG5hbWVSb290ID8/IG5ldyBDYW5vbmljYWxOYW1lLnJvb3QoKSwKICAgICAgICBsaWJyYXJpZXMgPSBsaWJyYXJpZXMgPz8gPExpYnJhcnk+W10sCiAgICAgICAgdXJpVG9Tb3VyY2UgPSB1cmlUb1NvdXJjZSA/PyA8VXJpLCBTb3VyY2U+e30gewogICAgYWRvcHRDaGlsZHJlbigpOwogIH0KCiAgdm9pZCBhZG9wdENoaWxkcmVuKCkgewogICAgaWYgKGxpYnJhcmllcyAhPSBudWxsKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlicmFyaWVzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgLy8gVGhlIGxpYnJhcmllcyBhcmUgb3duZWQgYnkgdGhpcyBjb21wb25lbnQsIGFuZCBzbyBhcmUgdGhlaXIgY2Fub25pY2FsCiAgICAgICAgLy8gbmFtZXMgaWYgdGhleSBleGlzdC4KICAgICAgICBMaWJyYXJ5IGxpYnJhcnkgPSBsaWJyYXJpZXNbaV07CiAgICAgICAgbGlicmFyeS5wYXJlbnQgPSB0aGlzOwogICAgICAgIENhbm9uaWNhbE5hbWUgbmFtZSA9IGxpYnJhcnkucmVmZXJlbmNlLmNhbm9uaWNhbE5hbWU7CiAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLnBhcmVudCAhPSByb290KSB7CiAgICAgICAgICByb290LmFkb3B0Q2hpbGQobmFtZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGNvbXB1dGVDYW5vbmljYWxOYW1lcygpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlicmFyaWVzLmxlbmd0aDsgKytpKSB7CiAgICAgIGNvbXB1dGVDYW5vbmljYWxOYW1lc0ZvckxpYnJhcnkobGlicmFyaWVzW2ldKTsKICAgIH0KICB9CgogIHZvaWQgY29tcHV0ZUNhbm9uaWNhbE5hbWVzRm9yTGlicmFyeShMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIHJvb3QuZ2V0Q2hpbGRGcm9tVXJpKGxpYnJhcnkuaW1wb3J0VXJpKS5iaW5kVG8obGlicmFyeS5yZWZlcmVuY2UpOwogICAgbGlicmFyeS5jb21wdXRlQ2Fub25pY2FsTmFtZXMoKTsKICB9CgogIHZvaWQgdW5iaW5kQ2Fub25pY2FsTmFtZXMoKSB7CiAgICByb290LnVuYmluZEFsbCgpOwogIH0KCiAgUHJvY2VkdXJlIGdldCBtYWluTWV0aG9kID0+IG1haW5NZXRob2ROYW1lPy5hc1Byb2NlZHVyZTsKCiAgdm9pZCBzZXQgbWFpbk1ldGhvZChQcm9jZWR1cmUgbWFpbikgewogICAgbWFpbk1ldGhvZE5hbWUgPSBnZXRNZW1iZXJSZWZlcmVuY2UobWFpbik7CiAgfQoKICBhY2NlcHQoVHJlZVZpc2l0b3IgdikgPT4gdi52aXNpdENvbXBvbmVudCh0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdChsaWJyYXJpZXMsIHYpOwogICAgbWFpbk1ldGhvZD8uYWNjZXB0UmVmZXJlbmNlKHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChsaWJyYXJpZXMsIHYsIHRoaXMpOwogIH0KCiAgQ29tcG9uZW50IGdldCBlbmNsb3NpbmdDb21wb25lbnQgPT4gdGhpczsKCiAgLy8vIFRyYW5zbGF0ZXMgYW4gb2Zmc2V0IHRvIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzIGluIHRoZSBnaXZlbiBmaWxlLgogIExvY2F0aW9uIGdldExvY2F0aW9uKFVyaSBmaWxlLCBpbnQgb2Zmc2V0KSB7CiAgICByZXR1cm4gdXJpVG9Tb3VyY2VbZmlsZV0/LmdldExvY2F0aW9uKGZpbGUsIG9mZnNldCk7CiAgfQoKICB2b2lkIGFkZE1ldGFkYXRhUmVwb3NpdG9yeShNZXRhZGF0YVJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgewogICAgbWV0YWRhdGFbcmVwb3NpdG9yeS50YWddID0gcmVwb3NpdG9yeTsKICB9Cn0KCi8vLyBBIHR1cGxlIHdpdGggZmlsZSwgbGluZSwgYW5kIGNvbHVtbiBudW1iZXIsIGZvciBkaXNwbGF5aW5nIGh1bWFuLXJlYWRhYmxlCi8vLyBsb2NhdGlvbnMuCmNsYXNzIExvY2F0aW9uIHsKICBmaW5hbCBVcmkgZmlsZTsKICBmaW5hbCBpbnQgbGluZTsgLy8gMS1iYXNlZC4KICBmaW5hbCBpbnQgY29sdW1uOyAvLyAxLWJhc2VkLgoKICBMb2NhdGlvbih0aGlzLmZpbGUsIHRoaXMubGluZSwgdGhpcy5jb2x1bW4pOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJGZpbGU6JGxpbmU6JGNvbHVtbic7Cn0KCmFic3RyYWN0IGNsYXNzIE1ldGFkYXRhUmVwb3NpdG9yeTxUPiB7CiAgLy8vIFVuaXF1ZSBzdHJpbmcgdGFnIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcG9zaXRvcnkuCiAgU3RyaW5nIGdldCB0YWc7CgogIC8vLyBNdXRhYmxlIG1hcHBpbmcgYmV0d2VlbiBub2RlcyBhbmQgdGhlaXIgbWV0YWRhdGEuCiAgTWFwPFRyZWVOb2RlLCBUPiBnZXQgbWFwcGluZzsKCiAgLy8vIFdyaXRlIFttZXRhZGF0YV0gb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIFtOb2RlXSBpbnRvCiAgLy8vIHRoZSBnaXZlbiBbQmluYXJ5U2lua10uCiAgLy8vCiAgLy8vIE1ldGFkYXRhIGlzIHNlcmlhbGl6ZWQgaW1tZWRpYXRlbHkgYmVmb3JlIHNlcmlhbGl6aW5nIFtub2RlXSwKICAvLy8gc28gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgY2FuIHVzZSBzZXJpYWxpemF0aW9uIGNvbnRleHQgb2YKICAvLy8gW25vZGVdJ3MgcGFyZW50cyAoc3VjaCBhcyBkZWNsYXJlZCB0eXBlIHBhcmFtZXRlcnMgYW5kIHZhcmlhYmxlcykuCiAgLy8vIEluIG9yZGVyIHRvIHVzZSBzY29wZSBkZWNsYXJlZCBieSB0aGUgW25vZGVdIGl0c2VsZiwgaW1wbGVtZW50YXRpb24gb2YKICAvLy8gdGhpcyBtZXRob2QgY2FuIHVzZSBbQmluYXJ5U2luay5lbnRlclNjb3BlXSBhbmQgW0JpbmFyeVNpbmsubGVhdmVTY29wZV0KICAvLy8gbWV0aG9kcy4KICAvLy8KICAvLy8gW21ldGFkYXRhXSBtdXN0IGJlIGFuIG9iamVjdCBvd25lZCBieSB0aGlzIHJlcG9zaXRvcnkuCiAgdm9pZCB3cml0ZVRvQmluYXJ5KFQgbWV0YWRhdGEsIE5vZGUgbm9kZSwgQmluYXJ5U2luayBzaW5rKTsKCiAgLy8vIENvbnN0cnVjdCBhIG1ldGFkYXRhIG9iamVjdCBmcm9tIGl0cyBiaW5hcnkgcGF5bG9hZCByZWFkIGZyb20gdGhlCiAgLy8vIGdpdmVuIFtCaW5hcnlTb3VyY2VdLgogIC8vLwogIC8vLyBNZXRhZGF0YSBpcyBkZXNlcmlhbGl6ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZGVzZXJpYWxpemluZyBbbm9kZV0sCiAgLy8vIHNvIGl0IGNhbiB1c2UgZGVzZXJpYWxpemF0aW9uIGNvbnRleHQgb2YgW25vZGVdJ3MgcGFyZW50cy4KICAvLy8gSW4gb3JkZXIgdG8gdXNlIHNjb3BlIGRlY2xhcmVkIGJ5IHRoZSBbbm9kZV0gaXRzZWxmLCBpbXBsZW1lbnRhdGlvbiBvZgogIC8vLyB0aGlzIG1ldGhvZCBjYW4gdXNlIFtCaW5hcnlTb3VyY2UuZW50ZXJTY29wZV0gYW5kCiAgLy8vIFtCaW5hcnlTb3VyY2UubGVhdmVTY29wZV0gbWV0aG9kcy4KICBUIHJlYWRGcm9tQmluYXJ5KE5vZGUgbm9kZSwgQmluYXJ5U291cmNlIHNvdXJjZSk7CgogIC8vLyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBhIG5vZGUgY2FuIGhhdmUgbWV0YWRhdGEgYXR0YWNoZWQgdG8gaXQKICAvLy8gb3IgcmVmZXJlbmNlZCBmcm9tIHRoZSBtZXRhZGF0YSBwYXlsb2FkLgogIC8vLwogIC8vLyBDdXJyZW50bHkgZHVlIHRvIGJpbmFyeSBmb3JtYXQgc3BlY2lmaWNzIENhdGNoIGFuZCBNYXBFbnRyeSBub2RlcwogIC8vLyBjYW4ndCBoYXZlIG1ldGFkYXRhIGF0dGFjaGVkIHRvIHRoZW0uCiAgc3RhdGljIGJvb2wgaXNTdXBwb3J0ZWQoVHJlZU5vZGUgbm9kZSkgewogICAgcmV0dXJuICEobm9kZSBpcyBNYXBFbnRyeSB8fCBub2RlIGlzIENhdGNoKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIEJpbmFyeVNpbmsgewogIGludCBnZXRCdWZmZXJPZmZzZXQoKTsKCiAgdm9pZCB3cml0ZUJ5dGUoaW50IGJ5dGUpOwogIHZvaWQgd3JpdGVCeXRlcyhMaXN0PGludD4gYnl0ZXMpOwogIHZvaWQgd3JpdGVVSW50MzIoaW50IHZhbHVlKTsKICB2b2lkIHdyaXRlVUludDMwKGludCB2YWx1ZSk7CgogIC8vLyBXcml0ZSBMaXN0PEJ5dGU+IGludG8gdGhlIHNpbmsuCiAgdm9pZCB3cml0ZUJ5dGVMaXN0KExpc3Q8aW50PiBieXRlcyk7CgogIHZvaWQgd3JpdGVOdWxsQWxsb3dlZENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoQ2Fub25pY2FsTmFtZSBuYW1lKTsKICB2b2lkIHdyaXRlU3RyaW5nUmVmZXJlbmNlKFN0cmluZyBzdHIpOwogIHZvaWQgd3JpdGVOYW1lKE5hbWUgbm9kZSk7CiAgdm9pZCB3cml0ZURhcnRUeXBlKERhcnRUeXBlIHR5cGUpOwogIHZvaWQgd3JpdGVOb2RlKE5vZGUgbm9kZSk7CgogIHZvaWQgZW50ZXJTY29wZSgKICAgICAge0xpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMsCiAgICAgIGJvb2wgbWVtYmVyU2NvcGU6IGZhbHNlLAogICAgICBib29sIHZhcmlhYmxlU2NvcGU6IGZhbHNlfSk7CiAgdm9pZCBsZWF2ZVNjb3BlKAogICAgICB7TGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycywKICAgICAgYm9vbCBtZW1iZXJTY29wZTogZmFsc2UsCiAgICAgIGJvb2wgdmFyaWFibGVTY29wZTogZmFsc2V9KTsKfQoKYWJzdHJhY3QgY2xhc3MgQmluYXJ5U291cmNlIHsKICBpbnQgZ2V0IGN1cnJlbnRPZmZzZXQ7CiAgTGlzdDxpbnQ+IGdldCBieXRlczsKCiAgaW50IHJlYWRCeXRlKCk7CiAgTGlzdDxpbnQ+IHJlYWRCeXRlcyhpbnQgbGVuZ3RoKTsKICBpbnQgcmVhZFVJbnQoKTsKICBpbnQgcmVhZFVpbnQzMigpOwoKICAvLy8gUmVhZCBMaXN0PEJ5dGU+IGZyb20gdGhlIHNvdXJjZS4KICBMaXN0PGludD4gcmVhZEJ5dGVMaXN0KCk7CgogIENhbm9uaWNhbE5hbWUgcmVhZENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoKTsKICBTdHJpbmcgcmVhZFN0cmluZ1JlZmVyZW5jZSgpOwogIE5hbWUgcmVhZE5hbWUoKTsKICBEYXJ0VHlwZSByZWFkRGFydFR5cGUoKTsKICBGdW5jdGlvbk5vZGUgcmVhZEZ1bmN0aW9uTm9kZSgpOwoKICB2b2lkIGVudGVyU2NvcGUoe0xpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnN9KTsKICB2b2lkIGxlYXZlU2NvcGUoe0xpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnN9KTsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRFUk5BTCBGVU5DVElPTlMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp2b2lkIHNldFBhcmVudHMoTGlzdDxUcmVlTm9kZT4gbm9kZXMsIFRyZWVOb2RlIHBhcmVudCkgewogIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyArK2kpIHsKICAgIG5vZGVzW2ldLnBhcmVudCA9IHBhcmVudDsKICB9Cn0KCnZvaWQgdmlzaXRMaXN0KExpc3Q8Tm9kZT4gbm9kZXMsIFZpc2l0b3IgdmlzaXRvcikgewogIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyArK2kpIHsKICAgIG5vZGVzW2ldLmFjY2VwdCh2aXNpdG9yKTsKICB9Cn0KCnZvaWQgdmlzaXRJdGVyYWJsZShJdGVyYWJsZTxOb2RlPiBub2RlcywgVmlzaXRvciB2aXNpdG9yKSB7CiAgZm9yICh2YXIgbm9kZSBpbiBub2RlcykgewogICAgbm9kZS5hY2NlcHQodmlzaXRvcik7CiAgfQp9Cgp2b2lkIHRyYW5zZm9ybVR5cGVMaXN0KExpc3Q8RGFydFR5cGU+IG5vZGVzLCBUcmFuc2Zvcm1lciB2aXNpdG9yKSB7CiAgaW50IHN0b3JlSW5kZXggPSAwOwogIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyArK2kpIHsKICAgIHZhciByZXN1bHQgPSB2aXNpdG9yLnZpc2l0RGFydFR5cGUobm9kZXNbaV0pOwogICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CiAgICAgIG5vZGVzW3N0b3JlSW5kZXhdID0gcmVzdWx0OwogICAgICArK3N0b3JlSW5kZXg7CiAgICB9CiAgfQogIGlmIChzdG9yZUluZGV4IDwgbm9kZXMubGVuZ3RoKSB7CiAgICBub2Rlcy5sZW5ndGggPSBzdG9yZUluZGV4OwogIH0KfQoKdm9pZCB0cmFuc2Zvcm1TdXBlcnR5cGVMaXN0KExpc3Q8U3VwZXJ0eXBlPiBub2RlcywgVHJhbnNmb3JtZXIgdmlzaXRvcikgewogIGludCBzdG9yZUluZGV4ID0gMDsKICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgKytpKSB7CiAgICB2YXIgcmVzdWx0ID0gdmlzaXRvci52aXNpdFN1cGVydHlwZShub2Rlc1tpXSk7CiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKICAgICAgbm9kZXNbc3RvcmVJbmRleF0gPSByZXN1bHQ7CiAgICAgICsrc3RvcmVJbmRleDsKICAgIH0KICB9CiAgaWYgKHN0b3JlSW5kZXggPCBub2Rlcy5sZW5ndGgpIHsKICAgIG5vZGVzLmxlbmd0aCA9IHN0b3JlSW5kZXg7CiAgfQp9Cgp2b2lkIHRyYW5zZm9ybUxpc3QoTGlzdDxUcmVlTm9kZT4gbm9kZXMsIFRyYW5zZm9ybWVyIHZpc2l0b3IsIFRyZWVOb2RlIHBhcmVudCkgewogIGludCBzdG9yZUluZGV4ID0gMDsKICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgKytpKSB7CiAgICB2YXIgcmVzdWx0ID0gbm9kZXNbaV0uYWNjZXB0KHZpc2l0b3IpOwogICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CiAgICAgIG5vZGVzW3N0b3JlSW5kZXhdID0gcmVzdWx0OwogICAgICByZXN1bHQucGFyZW50ID0gcGFyZW50OwogICAgICArK3N0b3JlSW5kZXg7CiAgICB9CiAgfQogIGlmIChzdG9yZUluZGV4IDwgbm9kZXMubGVuZ3RoKSB7CiAgICBub2Rlcy5sZW5ndGggPSBzdG9yZUluZGV4OwogIH0KfQoKTGlzdDxEYXJ0VHlwZT4gX2dldEFzVHlwZUFyZ3VtZW50cyhMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKSB7CiAgaWYgKHR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHJldHVybiBjb25zdCA8RGFydFR5cGU+W107CiAgcmV0dXJuIG5ldyBMaXN0PERhcnRUeXBlPi5nZW5lcmF0ZSgKICAgICAgdHlwZVBhcmFtZXRlcnMubGVuZ3RoLCAoaSkgPT4gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlKHR5cGVQYXJhbWV0ZXJzW2ldKSwKICAgICAgZ3Jvd2FibGU6IGZhbHNlKTsKfQoKY2xhc3MgX0NoaWxkUmVwbGFjZXIgZXh0ZW5kcyBUcmFuc2Zvcm1lciB7CiAgZmluYWwgVHJlZU5vZGUgY2hpbGQ7CiAgZmluYWwgVHJlZU5vZGUgcmVwbGFjZW1lbnQ7CgogIF9DaGlsZFJlcGxhY2VyKHRoaXMuY2hpbGQsIHRoaXMucmVwbGFjZW1lbnQpOwoKICBAb3ZlcnJpZGUKICBkZWZhdWx0VHJlZU5vZGUoVHJlZU5vZGUgbm9kZSkgewogICAgaWYgKG5vZGUgPT0gY2hpbGQpIHsKICAgICAgcmV0dXJuIHJlcGxhY2VtZW50OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CiAgfQp9CgpjbGFzcyBTb3VyY2UgewogIGZpbmFsIExpc3Q8aW50PiBsaW5lU3RhcnRzOwoKICBmaW5hbCBMaXN0PGludD4gc291cmNlOwoKICBmaW5hbCBVcmkgaW1wb3J0VXJpOwoKICBmaW5hbCBVcmkgZmlsZVVyaTsKCiAgU3RyaW5nIGNhY2hlZFRleHQ7CgogIFNvdXJjZSh0aGlzLmxpbmVTdGFydHMsIHRoaXMuc291cmNlLCB0aGlzLmltcG9ydFVyaSwgdGhpcy5maWxlVXJpKTsKCiAgLy8vIFJldHVybiB0aGUgdGV4dCBjb3JyZXNwb25kaW5nIHRvIFtsaW5lXSB3aGljaCBpcyBhIDEtYmFzZWQgbGluZQogIC8vLyBudW1iZXIuIFRoZSByZXR1cm5lZCBsaW5lIGNvbnRhaW5zIG5vIGxpbmUgc2VwYXJhdG9ycy4KICBTdHJpbmcgZ2V0VGV4dExpbmUoaW50IGxpbmUpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWx1ZUluSW50ZXJ2YWwobGluZSwgMSwgbGluZVN0YXJ0cy5sZW5ndGgsICdsaW5lJyk7CiAgICBpZiAoc291cmNlID09IG51bGwgfHwgc291cmNlLmlzRW1wdHkpIHJldHVybiBudWxsOwoKICAgIGNhY2hlZFRleHQgPz89IHV0ZjguZGVjb2RlKHNvdXJjZSwgYWxsb3dNYWxmb3JtZWQ6IHRydWUpOwogICAgLy8gLTEgYXMgbGluZSBudW1iZXJzIHN0YXJ0IGF0IDEuCiAgICBpbnQgaW5kZXggPSBsaW5lIC0gMTsKICAgIGlmIChpbmRleCArIDEgPT0gbGluZVN0YXJ0cy5sZW5ndGgpIHsKICAgICAgLy8gTGFzdCBsaW5lLgogICAgICByZXR1cm4gY2FjaGVkVGV4dC5zdWJzdHJpbmcobGluZVN0YXJ0c1tpbmRleF0pOwogICAgfSBlbHNlIGlmIChpbmRleCA8IGxpbmVTdGFydHMubGVuZ3RoKSB7CiAgICAgIC8vIFdlIHN1YnRyYWN0IDEgZnJvbSB0aGUgbmV4dCBsaW5lIGZvciB0d28gcmVhc29uczoKICAgICAgLy8gMS4gSWYgdGhlIGZpbGUgaXNuJ3QgdGVybWluYXRlZCBieSBhIG5ld2xpbmUsIHRoYXQgaW5kZXggaXMgaW52YWxpZC4KICAgICAgLy8gMi4gVG8gcmVtb3ZlIHRoZSBuZXdsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuCiAgICAgIGludCBlbmRPZkxpbmUgPSBsaW5lU3RhcnRzW2luZGV4ICsgMV0gLSAxOwogICAgICBpZiAoZW5kT2ZMaW5lID4gaW5kZXggJiYgY2FjaGVkVGV4dFtlbmRPZkxpbmUgLSAxXSA9PSAiXHIiKSB7CiAgICAgICAgLS1lbmRPZkxpbmU7IC8vIFdpbmRvd3MgbGluZSBlbmRpbmdzLgogICAgICB9CiAgICAgIHJldHVybiBjYWNoZWRUZXh0LnN1YnN0cmluZyhsaW5lU3RhcnRzW2luZGV4XSwgZW5kT2ZMaW5lKTsKICAgIH0KICAgIC8vIFRoaXMgc2hvdWxkbid0IGhhcHBlbjogc2hvdWxkIGhhdmUgYmVlbiBjYXVnaHQgYnkgdGhlIHJhbmdlIGNoZWNrIGFib3ZlLgogICAgdGhyb3cgIkludGVybmFsIGVycm9yIjsKICB9CgogIC8vLyBUcmFuc2xhdGVzIGFuIG9mZnNldCB0byBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycyBpbiB0aGUgZ2l2ZW4gZmlsZS4KICBMb2NhdGlvbiBnZXRMb2NhdGlvbihVcmkgZmlsZSwgaW50IG9mZnNldCkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbHVlSW5JbnRlcnZhbChvZmZzZXQsIDAsIGxpbmVTdGFydHMubGFzdCwgJ29mZnNldCcpOwogICAgaW50IGxvdyA9IDAsIGhpZ2ggPSBsaW5lU3RhcnRzLmxlbmd0aCAtIDE7CiAgICB3aGlsZSAobG93IDwgaGlnaCkgewogICAgICBpbnQgbWlkID0gaGlnaCAtICgoaGlnaCAtIGxvdykgPj4gMSk7IC8vIEdldCBtaWRkbGUsIHJvdW5kaW5nIHVwLgogICAgICBpbnQgcGl2b3QgPSBsaW5lU3RhcnRzW21pZF07CiAgICAgIGlmIChwaXZvdCA8PSBvZmZzZXQpIHsKICAgICAgICBsb3cgPSBtaWQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaGlnaCA9IG1pZCAtIDE7CiAgICAgIH0KICAgIH0KICAgIGludCBsaW5lSW5kZXggPSBsb3c7CiAgICBpbnQgbGluZVN0YXJ0ID0gbGluZVN0YXJ0c1tsaW5lSW5kZXhdOwogICAgaW50IGxpbmVOdW1iZXIgPSAxICsgbGluZUluZGV4OwogICAgaW50IGNvbHVtbk51bWJlciA9IDEgKyBvZmZzZXQgLSBsaW5lU3RhcnQ7CiAgICByZXR1cm4gbmV3IExvY2F0aW9uKGZpbGUsIGxpbmVOdW1iZXIsIGNvbHVtbk51bWJlcik7CiAgfQp9CgovLy8gUmV0dXJucyB0aGUgW1JlZmVyZW5jZV0gb2JqZWN0IGZvciB0aGUgZ2l2ZW4gbWVtYmVyLgovLy8KLy8vIFJldHVybnMgYG51bGxgIGlmIHRoZSBtZW1iZXIgaXMgYG51bGxgLgpSZWZlcmVuY2UgZ2V0TWVtYmVyUmVmZXJlbmNlKE1lbWJlciBtZW1iZXIpIHsKICByZXR1cm4gbWVtYmVyPy5yZWZlcmVuY2U7Cn0KCi8vLyBSZXR1cm5zIHRoZSBbUmVmZXJlbmNlXSBvYmplY3QgZm9yIHRoZSBnaXZlbiBjbGFzcy4KLy8vCi8vLyBSZXR1cm5zIGBudWxsYCBpZiB0aGUgY2xhc3MgaXMgYG51bGxgLgpSZWZlcmVuY2UgZ2V0Q2xhc3NSZWZlcmVuY2UoQ2xhc3MgY2xhc3NfKSB7CiAgcmV0dXJuIGNsYXNzXz8ucmVmZXJlbmNlOwp9CgovLy8gUmV0dXJucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgW21lbWJlcl0sIG9yIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlCi8vLyBtZW1iZXIgaGFzIG5vdCBiZWVuIGFzc2lnbmVkIGEgY2Fub25pY2FsIG5hbWUgeWV0LgovLy8KLy8vIFJldHVybnMgYG51bGxgIGlmIHRoZSBtZW1iZXIgaXMgYG51bGxgLgpDYW5vbmljYWxOYW1lIGdldENhbm9uaWNhbE5hbWVPZk1lbWJlcihNZW1iZXIgbWVtYmVyKSB7CiAgaWYgKG1lbWJlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKICBpZiAobWVtYmVyLmNhbm9uaWNhbE5hbWUgPT0gbnVsbCkgewogICAgdGhyb3cgJyRtZW1iZXIgaGFzIG5vIGNhbm9uaWNhbCBuYW1lJzsKICB9CiAgcmV0dXJuIG1lbWJlci5jYW5vbmljYWxOYW1lOwp9CgovLy8gUmV0dXJucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgW2NsYXNzX10sIG9yIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlCi8vLyBjbGFzcyBoYXMgbm90IGJlZW4gYXNzaWduZWQgYSBjYW5vbmljYWwgbmFtZSB5ZXQuCi8vLwovLy8gUmV0dXJucyBgbnVsbGAgaWYgdGhlIGNsYXNzIGlzIGBudWxsYC4KQ2Fub25pY2FsTmFtZSBnZXRDYW5vbmljYWxOYW1lT2ZDbGFzcyhDbGFzcyBjbGFzc18pIHsKICBpZiAoY2xhc3NfID09IG51bGwpIHJldHVybiBudWxsOwogIGlmIChjbGFzc18uY2Fub25pY2FsTmFtZSA9PSBudWxsKSB7CiAgICB0aHJvdyAnJGNsYXNzXyBoYXMgbm8gY2Fub25pY2FsIG5hbWUnOwogIH0KICByZXR1cm4gY2xhc3NfLmNhbm9uaWNhbE5hbWU7Cn0KCi8vLyBSZXR1cm5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiBbbGlicmFyeV0sIG9yIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlCi8vLyBsaWJyYXJ5IGhhcyBub3QgYmVlbiBhc3NpZ25lZCBhIGNhbm9uaWNhbCBuYW1lIHlldC4KLy8vCi8vLyBSZXR1cm5zIGBudWxsYCBpZiB0aGUgbGlicmFyeSBpcyBgbnVsbGAuCkNhbm9uaWNhbE5hbWUgZ2V0Q2Fub25pY2FsTmFtZU9mTGlicmFyeShMaWJyYXJ5IGxpYnJhcnkpIHsKICBpZiAobGlicmFyeSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICBpZiAobGlicmFyeS5jYW5vbmljYWxOYW1lID09IG51bGwpIHsKICAgIHRocm93ICckbGlicmFyeSBoYXMgbm8gY2Fub25pY2FsIG5hbWUnOwogIH0KICByZXR1cm4gbGlicmFyeS5jYW5vbmljYWxOYW1lOwp9CgppbnQgbGlzdEhhc2hDb2RlKExpc3QgbGlzdCkgewogIHJldHVybiBsaXN0LmZvbGQoMCwgKGludCB2YWx1ZSwgT2JqZWN0IGl0ZW0pID0+IHZhbHVlIF4gaXRlbS5oYXNoQ29kZSk7Cn0KCmludCBtYXBIYXNoQ29kZShNYXAgbWFwKSB7CiAgaW50IHZhbHVlID0gMDsKICBmb3IgKGZpbmFsIE9iamVjdCB4IGluIG1hcC5rZXlzKSB2YWx1ZSBePSB4Lmhhc2hDb2RlOwogIGZvciAoZmluYWwgT2JqZWN0IHggaW4gbWFwLnZhbHVlcykgdmFsdWUgXj0geC5oYXNoQ29kZTsKICByZXR1cm4gdmFsdWU7Cn0KCmJvb2wgbGlzdEVxdWFscyhMaXN0IGEsIExpc3QgYikgewogIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogIGZvciAoaW50IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgewogICAgaWYgKGFbaV0gIT0gYltpXSkgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gdHJ1ZTsKfQoKYm9vbCBtYXBFcXVhbHMoTWFwIGEsIE1hcCBiKSB7CiAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgZm9yIChmaW5hbCBPYmplY3Qga2V5IGluIGEua2V5cykgewogICAgaWYgKCFiLmNvbnRhaW5zS2V5KGtleSkgfHwgYVtrZXldICE9IGJba2V5XSkgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gdHJ1ZTsKfQoKLy8vIFJldHVybnMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIFt0eXBlZGVmX10sIG9yIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlCi8vLyB0eXBlZGVmIGhhcyBub3QgYmVlbiBhc3NpZ25lZCBhIGNhbm9uaWNhbCBuYW1lIHlldC4KLy8vCi8vLyBSZXR1cm5zIGBudWxsYCBpZiB0aGUgdHlwZWRlZiBpcyBgbnVsbGAuCkNhbm9uaWNhbE5hbWUgZ2V0Q2Fub25pY2FsTmFtZU9mVHlwZWRlZihUeXBlZGVmIHR5cGVkZWZfKSB7CiAgaWYgKHR5cGVkZWZfID09IG51bGwpIHJldHVybiBudWxsOwogIGlmICh0eXBlZGVmXy5jYW5vbmljYWxOYW1lID09IG51bGwpIHsKICAgIHRocm93ICckdHlwZWRlZl8gaGFzIG5vIGNhbm9uaWNhbCBuYW1lJzsKICB9CiAgcmV0dXJuIHR5cGVkZWZfLmNhbm9uaWNhbE5hbWU7Cn0KCi8vLyBBbm5vdGF0aW9uIGRlc2NyaWJpbmcgaW5mb3JtYXRpb24gd2hpY2ggaXMgbm90IHBhcnQgb2YgRGFydCBzZW1hbnRpY3M7IGluCi8vLyBvdGhlciB3b3JkcywgaWYgdGhpcyBpbmZvcm1hdGlvbiAob3IgYW55IGluZm9ybWF0aW9uIGl0IHJlZmVycyB0bykgY2hhbmdlcywKLy8vIHN0YXRpYyBhbmFseXNpcyBhbmQgcnVudGltZSBiZWhhdmlvciBvZiB0aGUgbGlicmFyeSBhcmUgdW5hZmZlY3RlZC4KY29uc3QgaW5mb3JtYXRpdmUgPSBudWxsOwoKTG9jYXRpb24gX2dldExvY2F0aW9uSW5Db21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCwgVXJpIGZpbGVVcmksIGludCBvZmZzZXQpIHsKICBpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKICAgIHJldHVybiBjb21wb25lbnQuZ2V0TG9jYXRpb24oZmlsZVVyaSwgb2Zmc2V0KTsKICB9IGVsc2UgewogICAgcmV0dXJuIG5ldyBMb2NhdGlvbihmaWxlVXJpLCBUcmVlTm9kZS5ub09mZnNldCwgVHJlZU5vZGUubm9PZmZzZXQpOwogIH0KfQoKLy8vIENvbnZlcnQgdGhlIHN5bnRoZXRpYyBuYW1lIG9mIGFuIGltcGxpY2l0IG1peGluIGFwcGxpY2F0aW9uIGNsYXNzCi8vLyBpbnRvIGEgbmFtZSBzdWl0YWJsZSBmb3IgdXNlci1mYWNlZCBzdHJpbmdzLgovLy8KLy8vIEZvciBleGFtcGxlLCB3aGVuIGNvbXBpbGluZyAiY2xhc3MgQSBleHRlbmRzIFMgd2l0aCBNMSwgTTIiLCB0aGUKLy8vIHR3byBzeW50aGV0aWMgY2xhc3NlcyB3aWxsIGJlIG5hbWVkICJfQSZTJk0xIiBhbmQgIl9BJlMmTTEmTTIiLgovLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAiUyB3aXRoIE0xIiBhbmQgIlMgd2l0aCBNMSwgTTIiLCByZXNwZWN0aXZlbHkuClN0cmluZyBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKFN0cmluZyBuYW1lKSB7CiAgTGlzdDxTdHJpbmc+IG5hbWVQYXJ0cyA9IG5hbWUuc3BsaXQoJyYnKTsKICBpZiAobmFtZVBhcnRzLmxlbmd0aCA8IDIgfHwgbmFtZSA9PSAiJiIpIHJldHVybiBuYW1lOwogIFN0cmluZyBkZW1hbmdsZWROYW1lID0gbmFtZVBhcnRzWzFdOwogIGZvciAoaW50IGkgPSAyOyBpIDwgbmFtZVBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICBkZW1hbmdsZWROYW1lICs9IChpID09IDIgPyAiIHdpdGggIiA6ICIsICIpICsgbmFtZVBhcnRzW2ldOwogIH0KICByZXR1cm4gZGVtYW5nbGVkTmFtZTsKfQoKLy8vIEV4dHJhY3QgZnJvbSB0aGUgc3ludGhldGljIG5hbWUgb2YgYW4gaW1wbGljaXQgbWl4aW4gYXBwbGljYXRpb24gY2xhc3MKLy8vIHRoZSBuYW1lIG9mIHRoZSBmaW5hbCBzdWJjbGFzcyBvZiB0aGUgbWl4aW4gYXBwbGljYXRpb24uCi8vLwovLy8g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dGhlbiBiZQovLy8gZGlzY2FyZGVkLgpjbGFzcyBCaW5hcnlQcmludGVyIGltcGxlbWVudHMgVmlzaXRvcjx2b2lkPiwgQmluYXJ5U2luayB7CiAgVmFyaWFibGVJbmRleGVyIF92YXJpYWJsZUluZGV4ZXI7CiAgTGFiZWxJbmRleGVyIF9sYWJlbEluZGV4ZXI7CiAgU3dpdGNoQ2FzZUluZGV4ZXIgX3N3aXRjaENhc2VJbmRleGVyOwogIGZpbmFsIFR5cGVQYXJhbWV0ZXJJbmRleGVyIF90eXBlUGFyYW1ldGVySW5kZXhlciA9IG5ldyBUeXBlUGFyYW1ldGVySW5kZXhlcigpOwogIGZpbmFsIFN0cmluZ0luZGV4ZXIgc3RyaW5nSW5kZXhlcjsKICBDb25zdGFudEluZGV4ZXIgX2NvbnN0YW50SW5kZXhlcjsKICBmaW5hbCBVcmlJbmRleGVyIF9zb3VyY2VVcmlJbmRleGVyID0gbmV3IFVyaUluZGV4ZXIoKTsKICBib29sIF9jdXJyZW50bHlJbk5vbmltcGxlbWVudGF0aW9uID0gZmFsc2U7CiAgZmluYWwgTGlzdDxib29sPiBfc291cmNlc0Zyb21SZWFsSW1wbGVtZW50YXRpb24gPSBuZXcgTGlzdDxib29sPigpOwogIGZpbmFsIExpc3Q8Ym9vbD4gX3NvdXJjZXNGcm9tUmVhbEltcGxlbWVudGF0aW9uSW5MaWJyYXJ5ID0gbmV3IExpc3Q8Ym9vbD4oKTsKICBNYXA8TGlicmFyeURlcGVuZGVuY3ksIGludD4gX2xpYnJhcnlEZXBlbmRlbmN5SW5kZXggPQogICAgICA8TGlicmFyeURlcGVuZGVuY3ksIGludD57fTsKCiAgTGlzdDxfTWV0YWRhdGFTdWJzZWN0aW9uPiBfbWV0YWRhdGFTdWJzZWN0aW9uczsKCiAgZmluYWwgQnVmZmVyZWRTaW5rIF9tYWluU2luazsKICBmaW5hbCBCdWZmZXJlZFNpbmsgX21ldGFkYXRhU2luazsKICBmaW5hbCBCeXRlc1NpbmsgX2NvbnN0YW50c0J5dGVzU2luazsKICBCdWZmZXJlZFNpbmsgX2NvbnN0YW50c1Npbms7CiAgQnVmZmVyZWRTaW5rIF9zaW5rOwogIGJvb2wgaW5jbHVkZVNvdXJjZXM7CgogIExpc3Q8aW50PiBsaWJyYXJ5T2Zmc2V0czsKICBMaXN0PGludD4gY2xhc3NPZmZzZXRzOwogIExpc3Q8aW50PiBwcm9jZWR1cmVPZmZzZXRzOwogIGludCBfYmluYXJ5T2Zmc2V0Rm9yU291cmNlVGFibGUgPSAtMTsKICBpbnQgX2JpbmFyeU9mZnNldEZvckxpbmtUYWJsZSA9IC0xOwogIGludCBfYmluYXJ5T2Zmc2V0Rm9yTWV0YWRhdGFQYXlsb2FkcyA9IC0xOwogIGludCBfYmluYXJ5T2Zmc2V0Rm9yTWV0YWRhdGFNYXBwaW5ncyA9IC0xOwogIGludCBfYmluYXJ5T2Zmc2V0Rm9yU3RyaW5nVGFibGUgPSAtMTsKICBpbnQgX2JpbmFyeU9mZnNldEZvckNvbnN0YW50VGFibGUgPSAtMTsKCiAgTGlzdDxDYW5vbmljYWxOYW1lPiBfY2Fub25pY2FsTmFtZUxpc3Q7CiAgU2V0PENhbm9uaWNhbE5hbWU+IF9rbm93bkNhbm9uaWNhbE5hbWVOb25Sb290VG9wcyA9IG5ldyBTZXQ8Q2Fub25pY2FsTmFtZT4oKTsKICBTZXQ8Q2Fub25pY2FsTmFtZT4gX3JlaW5kZXhlZENhbm9uaWNhbE5hbWVzID0gbmV3IFNldDxDYW5vbmljYWxOYW1lPigpOwoKICAvLy8gQ3JlYXRlIGEgcHJpbnRlciB0aGF0IHdyaXRlcyB0byB0aGUgZ2l2ZW4gW3NpbmtdLgogIC8vLwogIC8vLyBUaGUgQmluYXJ5UHJpbnRlciB3aWxsIHVzZSBpdHMgb3duIGJ1ZmZlciwgc28gdGhlIFtzaW5rXSBkb2VzIG5vdCBuZWVkCiAgLy8vIG9uZS4KICBCaW5hcnlQcmludGVyKFNpbms8TGlzdDxpbnQ+PiBzaW5rLAogICAgICB7U3RyaW5nSW5kZXhlciBzdHJpbmdJbmRleGVyLCB0aGlzLmluY2x1ZGVTb3VyY2VzID0gdHJ1ZX0pCiAgICAgIDogX21haW5TaW5rID0gbmV3IEJ1ZmZlcmVkU2luayhzaW5rKSwKICAgICAgICBfbWV0YWRhdGFTaW5rID0gbmV3IEJ1ZmZlcmVkU2luayhuZXcgQnl0ZXNTaW5rKCkpLAogICAgICAgIF9jb25zdGFudHNCeXRlc1NpbmsgPSBuZXcgQnl0ZXNTaW5rKCksCiAgICAgICAgc3RyaW5nSW5kZXhlciA9IHN0cmluZ0luZGV4ZXIgPz8gbmV3IFN0cmluZ0luZGV4ZXIoKSB7CiAgICBfY29uc3RhbnRzU2luayA9IG5ldyBCdWZmZXJlZFNpbmsoX2NvbnN0YW50c0J5dGVzU2luayk7CiAgICBfY29uc3RhbnRJbmRleGVyID0gbmV3IENvbnN0YW50SW5kZXhlcih0aGlzLnN0cmluZ0luZGV4ZXIsIHRoaXMpOwogICAgX3NpbmsgPSBfbWFpblNpbms7CiAgfQoKICB2b2lkIF9mbHVzaCgpIHsKICAgIF9zaW5rLmZsdXNoQW5kRGVzdHJveSgpOwogIH0KCiAgdm9pZCB3cml0ZUJ5dGUoaW50IGJ5dGUpIHsKICAgIF9zaW5rLmFkZEJ5dGUoYnl0ZSk7CiAgfQoKICB2b2lkIHdyaXRlQnl0ZXMoTGlzdDxpbnQ+IGJ5dGVzKSB7CiAgICBfc2luay5hZGRCeXRlcyhieXRlcyk7CiAgfQoKICB2b2lkIHdyaXRlVUludDMwKGludCB2YWx1ZSkgewogICAgYXNzZXJ0KHZhbHVlID49IDAgJiYgdmFsdWUgPj4gMzAgPT0gMCk7CiAgICBpZiAodmFsdWUgPCAweDgwKSB7CiAgICAgIF9zaW5rLmFkZEJ5dGUodmFsdWUpOwogICAgfSBlbHNlIGlmICh2YWx1ZSA8IDB4NDAwMCkgewogICAgICBfc2luay5hZGRCeXRlMigodmFsdWUgPj4gOCkgfCAweDgwLCB2YWx1ZSAmIDB4RkYpOwogICAgfSBlbHNlIHsKICAgICAgX3NpbmsuYWRkQnl0ZTQoKHZhbHVlID4+IDI0KSB8IDB4QzAsICh2YWx1ZSA+PiAxNikgJiAweEZGLAogICAgICAgICAgKHZhbHVlID4+IDgpICYgMHhGRiwgdmFsdWUgJiAweEZGKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVVSW50MzIoaW50IHZhbHVlKSB7CiAgICBfc2luay5hZGRCeXRlNCgodmFsdWUgPj4gMjQpICYgMHhGRiwgKHZhbHVlID4+IDE2KSAmIDB4RkYsCiAgICAgICAgKHZhbHVlID4+IDgpICYgMHhGRiwgdmFsdWUgJiAweEZGKTsKICB9CgogIHZvaWQgd3JpdGVCeXRlTGlzdChMaXN0PGludD4gdXRmOEJ5dGVzKSB7CiAgICB3cml0ZVVJbnQzMCh1dGY4Qnl0ZXMubGVuZ3RoKTsKICAgIHdyaXRlQnl0ZXModXRmOEJ5dGVzKTsKICB9CgogIGludCBnZXRCdWZmZXJPZmZzZXQoKSB7CiAgICByZXR1cm4gX3Npbmsub2Zmc2V0OwogIH0KCiAgdm9pZCB3cml0ZVN0cmluZ1RhYmxlKFN0cmluZ0luZGV4ZXIgaW5kZXhlcikgewogICAgX2JpbmFyeU9mZnNldEZvclN0cmluZ1RhYmxlID0gZ2V0QnVmZmVyT2Zmc2V0KCk7CgogICAgLy8gQ29udGFpbmVycyBmb3IgdGhlIHV0ZjggZW5jb2RlZCBzdHJpbmdzLgogICAgZmluYWwgTGlzdDxVaW50OExpc3Q+IGRhdGEgPSBuZXcgTGlzdDxVaW50OExpc3Q+KCk7CiAgICBpbnQgdG90YWxMZW5ndGggPSAwOwogICAgY29uc3QgaW50IG1pbkxlbmd0aCA9IDEgPDwgMTY7CiAgICBVaW50OExpc3QgYnVmZmVyOwogICAgaW50IGluZGV4ID0gMDsKCiAgICAvLyBXcml0ZSB0aGUgZW5kIG9mZnNldHMuCiAgICB3cml0ZVVJbnQzMChpbmRleGVyLmluZGV4Lmxlbmd0aCk7CiAgICBmb3IgKFN0cmluZyBrZXkgaW4gaW5kZXhlci5pbmRleC5rZXlzKSB7CiAgICAgIGlmIChrZXkuaXNOb3RFbXB0eSkgewogICAgICAgIGludCByZXF1aXJlZE1pbkxlbmd0aCA9IGtleS5sZW5ndGg7CiAgICAgICAgaW50IGFsbG9jYXRlTWluTGVuZ3RoID0gcmVxdWlyZWRNaW5MZW5ndGggKiAzOwogICAgICAgIGludCBuZXdJbmRleDsKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsIHx8IGluZGV4ICsgcmVxdWlyZWRNaW5MZW5ndGggPj0gYnVmZmVyLmxlbmd0aCkgewogICAgICAgICAgICBpbnQgbmV3TGVuZ3RoID0gbWluTGVuZ3RoOwogICAgICAgICAgICBpZiAoYWxsb2NhdGVNaW5MZW5ndGggPiBuZXdMZW5ndGgpIG5ld0xlbmd0aCA9IGFsbG9jYXRlTWluTGVuZ3RoOwogICAgICAgICAgICBpZiAoYnVmZmVyICE9IG51bGwgJiYgaW5kZXggPiAwKSB7CiAgICAgICAgICAgICAgZGF0YS5hZGQobmV3IFVpbnQ4TGlzdC52aWV3KGJ1ZmZlci5idWZmZXIsIDAsIGluZGV4KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5kZXggPSAwOwogICAgICAgICAgICBidWZmZXIgPSBuZXcgVWludDhMaXN0KG5ld0xlbmd0aCk7CiAgICAgICAgICB9CiAgICAgICAgICBuZXdJbmRleCA9IE5vdFF1aXRlU3RyaW5nLndyaXRlVXRmOChidWZmZXIsIGluZGV4LCBrZXkpOwogICAgICAgICAgaWYgKG5ld0luZGV4ICE9IC0xKSBicmVhazsKICAgICAgICAgIHJlcXVpcmVkTWluTGVuZ3RoID0gYWxsb2NhdGVNaW5MZW5ndGg7CiAgICAgICAgfQogICAgICAgIGlmIChuZXdJbmRleCA8IDApIHsKICAgICAgICAgIC8vIFV0ZjggZW5jb2RpbmcgZmFpbGVkLgogICAgICAgICAgaWYgKGJ1ZmZlciAhPSBudWxsICYmIGluZGV4ID4gMCkgewogICAgICAgICAgICBkYXRhLmFkZChuZXcgVWludDhMaXN0LnZpZXcoYnVmZmVyLmJ1ZmZlciwgMCwgaW5kZXgpKTsKICAgICAgICAgICAgYnVmZmVyID0gbnVsbDsKICAgICAgICAgICAgaW5kZXggPSAwOwogICAgICAgICAgfQogICAgICAgICAgTGlzdDxpbnQ+IGNvbnZlcnRlZCA9IHV0ZjguZW5jb2Rlci5jb252ZXJ0KGtleSk7CiAgICAgICAgICBkYXRhLmFkZChjb252ZXJ0ZWQpOwogICAgICAgICAgdG90YWxMZW5ndGggKz0gY29udmVydGVkLmxlbmd0aDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdG90YWxMZW5ndGggKz0gbmV3SW5kZXggLSBpbmRleDsKICAgICAgICAgIGluZGV4ID0gbmV3SW5kZXg7CiAgICAgICAgfQogICAgICB9CiAgICAgIHdyaXRlVUludDMwKHRvdGFsTGVuZ3RoKTsKICAgIH0KICAgIGlmIChidWZmZXIgIT0gbnVsbCAmJiBpbmRleCA+IDApIHsKICAgICAgZGF0YS5hZGQoVWludDhMaXN0LnZpZXcoYnVmZmVyLmJ1ZmZlciwgMCwgaW5kZXgpKTsKICAgIH0KCiAgICAvLyBXcml0ZSB0aGUgVVRGLTggZW5jb2RlZCBzdHJpbmdzLgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKSB7CiAgICAgIHdyaXRlQnl0ZXMoZGF0YVtpXSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlU3RyaW5nUmVmZXJlbmNlKFN0cmluZyBzdHJpbmcpIHsKICAgIHdyaXRlVUludDMwKHN0cmluZ0luZGV4ZXIucHV0KHN0cmluZykpOwogIH0KCiAgdm9pZCB3cml0ZVN0cmluZ1JlZmVyZW5jZUxpc3QoTGlzdDxTdHJpbmc+IHN0cmluZ3MpIHsKICAgIHdyaXRlTGlzdChzdHJpbmdzLCB3cml0ZVN0cmluZ1JlZmVyZW5jZSk7CiAgfQoKICB2b2lkIHdyaXRlQ29uc3RhbnRSZWZlcmVuY2UoQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIHdyaXRlVUludDMwKF9jb25zdGFudEluZGV4ZXIucHV0KGNvbnN0YW50KSk7CiAgfQoKICB2b2lkIHdyaXRlQ29uc3RhbnRUYWJsZShDb25zdGFudEluZGV4ZXIgaW5kZXhlcikgewogICAgX2JpbmFyeU9mZnNldEZvckNvbnN0YW50VGFibGUgPSBnZXRCdWZmZXJPZmZzZXQoKTsKCiAgICB3cml0ZVVJbnQzMChpbmRleGVyLmVudHJpZXMubGVuZ3RoKTsKICAgIGFzc2VydChpZGVudGljYWwoX3NpbmssIF9tYWluU2luaykpOwogICAgX2NvbnN0YW50c1NpbmsuZmx1c2hBbmREZXN0cm95KCk7CiAgICB3cml0ZUJ5dGVzKF9jb25zdGFudHNCeXRlc1NpbmsuYnVpbGRlci50YWtlQnl0ZXMoKSk7CiAgfQoKICBpbnQgd3JpdGVDb25zdGFudFRhYmxlRW50cnkoQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIEJ1ZmZlcmVkU2luayBvbGRTaW5rID0gX3Npbms7CiAgICBfc2luayA9IF9jb25zdGFudHNTaW5rOwogICAgaW50IGluaXRpYWxPZmZzZXQgPSBfc2luay5vZmZzZXQ7CiAgICBpZiAoY29uc3RhbnQgaXMgTnVsbENvbnN0YW50KSB7CiAgICAgIHdyaXRlQnl0ZShDb25zdGFudFRhZy5OdWxsQ29uc3RhbnQpOwogICAgfSBlbHNlIGlmIChjb25zdGFudCBpcyBCb29sQ29uc3RhbnQpIHsKICAgICAgd3JpdGVCeXRlKENvbnN0YW50VGFnLkJvb2xDb25zdGFudCk7CiAgICAgIHdyaXRlQnl0ZShjb25zdGFudC52YWx1ZSA/IDEgOiAwKTsKICAgIH0gZWxzZSBpZiAoY29uc3RhbnQgaXMgSW50Q29uc3RhbnQpIHsKICAgICAgd3JpdGVCeXRlKENvbnN0YW50VGFnLkludENvbnN0YW50KTsKICAgICAgd3JpdGVJbnRlZ2VyKGNvbnN0YW50LnZhbHVlKTsKICAgIH0gZWxzZSBpZiAoY29uc3RhbnQgaXMgRG91YmxlQ29uc3RhbnQpIHsKICAgICAgd3JpdGVCeXRlKENvbnN0YW50VGFnLkRvdWJsZUNvbnN0YW50KTsKICAgICAgd3JpdGVEb3VibGUoY29uc3RhbnQudmFsdWUpOwogICAgfSBlbHNlIGlmIChjb25zdGFudCBpcyBTdHJpbmdDb25zdGFudCkgewogICAgICB3cml0ZUJ5dGUoQ29uc3RhbnRUYWcuU3RyaW5nQ29uc3RhbnQpOwogICAgICB3cml0ZVN0cmluZ1JlZmVyZW5jZShjb25zdGFudC52YWx1ZSk7CiAgICB9IGVsc2UgaWYgKGNvbnN0YW50IGlzIFN5bWJvbENvbnN0YW50KSB7CiAgICAgIHdyaXRlQnl0ZShDb25zdGFudFRhZy5TeW1ib2xDb25zdGFudCk7CiAgICAgIHdyaXRlTnVsbEFsbG93ZWRSZWZlcmVuY2UoY29uc3RhbnQubGlicmFyeVJlZmVyZW5jZSk7CiAgICAgIHdyaXRlU3RyaW5nUmVmZXJlbmNlKGNvbnN0YW50Lm5hbWUpOwogICAgfSBlbHNlIGlmIChjb25zdGFudCBpcyBNYXBDb25zdGFudCkgewogICAgICB3cml0ZUJ5dGUoQ29uc3RhbnRUYWcuTWFwQ29uc3RhbnQpOwogICAgICB3cml0ZURhcnRUeXBlKGNvbnN0YW50LmtleVR5cGUpOwogICAgICB3cml0ZURhcnRUeXBlKGNvbnN0YW50LnZhbHVlVHlwZSk7CiAgICAgIHdyaXRlVUludDMwKGNvbnN0YW50LmVudHJpZXMubGVuZ3RoKTsKICAgICAgZm9yIChmaW5hbCBDb25zdGFudE1hcEVudHJ5IGVudHJ5IGluIGNvbnN0YW50LmVudHJpZXMpIHsKICAgICAgICB3cml0ZUNvbnN0YW50UmVmZXJlbmNlKGVudHJ5LmtleSk7CiAgICAgICAgd3JpdGVDb25zdGFudFJlZmVyZW5jZShlbnRyeS52YWx1ZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY29uc3RhbnQgaXMgTGlzdENvbnN0YW50KSB7CiAgICAgIHdyaXRlQnl0ZShDb25zdGFudFRhZy5MaXN0Q29uc3RhbnQpOwogICAgICB3cml0ZURhcnRUeXBlKGNvbnN0YW50LnR5cGVBcmd1bWVudCk7CiAgICAgIHdyaXRlVUludDMwKGNvbnN0YW50LmVudHJpZXMubGVuZ3RoKTsKICAgICAgY29uc3RhbnQuZW50cmllcy5mb3JFYWNoKHdyaXRlQ29uc3RhbnRSZWZlcmVuY2UpOwogICAgfSBlbHNlIGlmIChjb25zdGFudCBpcyBTZXRDb25zdGFudCkgewogICAgICB3cml0ZUJ5dGUoQ29uc3RhbnRUYWcuU2V0Q29uc3RhbnQpOwogICAgICB3cml0ZURhcnRUeXBlKGNvbnN0YW50LnR5cGVBcmd1bWVudCk7CiAgICAgIHdyaXRlVUludDMwKGNvbnN0YW50LmVudHJpZXMubGVuZ3RoKTsKICAgICAgY29uc3RhbnQuZW50cmllcy5mb3JFYWNoKHdyaXRlQ29uc3RhbnRSZWZlcmVuY2UpOwogICAgfSBlbHNlIGlmIChjb25zdGFudCBpcyBJbnN0YW5jZUNvbnN0YW50KSB7CiAgICAgIHdyaXRlQnl0ZShDb25zdGFudFRhZy5JbnN0YW5jZUNvbnN0YW50KTsKICAgICAgd3JpdGVDbGFzc1JlZmVyZW5jZShjb25zdGFudC5jbGFzc05vZGUpOwogICAgICB3cml0ZVVJbnQzMChjb25zdGFudC50eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgICAgIGNvbnN0YW50LnR5cGVBcmd1bWVudHMuZm9yRWFjaCh3cml0ZURhcnRUeXBlKTsKICAgICAgd3JpdGVVSW50MzAoY29uc3RhbnQuZmllbGRWYWx1ZXMubGVuZ3RoKTsKICAgICAgY29uc3RhbnQuZmllbGRWYWx1ZXMuZm9yRWFjaCgoUmVmZXJlbmNlIGZpZWxkUmVmLCBDb25zdGFudCB2YWx1ZSkgewogICAgICAgIHdyaXRlTm9uTnVsbENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoZmllbGRSZWYuY2Fub25pY2FsTmFtZSk7CiAgICAgICAgd3JpdGVDb25zdGFudFJlZmVyZW5jZSh2YWx1ZSk7CiAgICAgIH0pOwogICAgfSBlbHNlIGlmIChjb25zdGFudCBpcyBQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50KSB7CiAgICAgIHdyaXRlQnl0ZShDb25zdGFudFRhZy5QYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50KTsKICAgICAgd3JpdGVDb25zdGFudFJlZmVyZW5jZShjb25zdGFudC50ZWFyT2ZmQ29uc3RhbnQpOwogICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gY29uc3RhbnQudHlwZXMubGVuZ3RoOwogICAgICB3cml0ZVVJbnQzMChsZW5ndGgpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgd3JpdGVEYXJ0VHlwZShjb25zdGFudC50eXBlc1tpXSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY29uc3RhbnQgaXMgVGVhck9mZkNvbnN0YW50KSB7CiAgICAgIHdyaXRlQnl0ZShDb25zdGFudFRhZy5UZWFyT2ZmQ29uc3RhbnQpOwogICAgICB3cml0ZU5vbk51bGxDYW5vbmljYWxOYW1lUmVmZXJlbmNlKGNvbnN0YW50LnByb2NlZHVyZS5jYW5vbmljYWxOYW1lKTsKICAgIH0gZWxzZSBpZiAoY29uc3RhbnQgaXMgVHlwZUxpdGVyYWxDb25zdGFudCkgewogICAgICB3cml0ZUJ5dGUoQ29uc3RhbnRUYWcuVHlwZUxpdGVyYWxDb25zdGFudCk7CiAgICAgIHdyaXRlRGFydFR5cGUoY29uc3RhbnQudHlwZSk7CiAgICB9IGVsc2UgaWYgKGNvbnN0YW50IGlzIFVuZXZhbHVhdGVkQ29uc3RhbnQpIHsKICAgICAgd3JpdGVCeXRlKENvbnN0YW50VGFnLlVuZXZhbHVhdGVkQ29uc3RhbnQpOwogICAgICB3cml0ZU5vZGUoY29uc3RhbnQuZXhwcmVzc2lvbik7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignVW5zdXBwb3J0ZWQgY29uc3RhbnQgJGNvbnN0YW50Jyk7CiAgICB9CiAgICBfc2luayA9IG9sZFNpbms7CiAgICByZXR1cm4gX2NvbnN0YW50c1Npbmsub2Zmc2V0IC0gaW5pdGlhbE9mZnNldDsKICB9CgogIHZvaWQgd3JpdGVEYXJ0VHlwZShEYXJ0VHlwZSB0eXBlKSB7CiAgICB0eXBlLmFjY2VwdCh0aGlzKTsKICB9CgogIC8vIFJldHVybnMgdGhlIG5ldyBhY3RpdmUgZmlsZSB1cmkuCiAgdm9pZCB3cml0ZVVyaVJlZmVyZW5jZShVcmkgdXJpKSB7CiAgICBmaW5hbCBpbnQgaW5kZXggPSBfc291cmNlVXJpSW5kZXhlci5wdXQodXJpKTsKICAgIHdyaXRlVUludDMwKGluZGV4KTsKICAgIGlmICghX2N1cnJlbnRseUluTm9uaW1wbGVtZW50YXRpb24pIHsKICAgICAgaWYgKF9zb3VyY2VzRnJvbVJlYWxJbXBsZW1lbnRhdGlvbkluTGlicmFyeS5sZW5ndGggPD0gaW5kZXgpIHsKICAgICAgICBfc291cmNlc0Zyb21SZWFsSW1wbGVtZW50YXRpb25JbkxpYnJhcnkubGVuZ3RoID0gaW5kZXggKyAxOwogICAgICB9CiAgICAgIF9zb3VyY2VzRnJvbVJlYWxJbXBsZW1lbnRhdGlvbkluTGlicmFyeVtpbmRleF0gPSB0cnVlOwogICAgICBpZiAoX3NvdXJjZXNGcm9tUmVhbEltcGxlbWVudGF0aW9uLmxlbmd0aCA8PSBpbmRleCkgewogICAgICAgIF9zb3VyY2VzRnJvbVJlYWxJbXBsZW1lbnRhdGlvbi5sZW5ndGggPSBpbmRleCArIDE7CiAgICAgIH0KICAgICAgX3NvdXJjZXNGcm9tUmVhbEltcGxlbWVudGF0aW9uW2luZGV4XSA9IHRydWU7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlTGlzdDxUPihMaXN0PFQ+IGl0ZW1zLCB2b2lkIHdyaXRlSXRlbShUIHgpKSB7CiAgICB3cml0ZVVJbnQzMChpdGVtcy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkgewogICAgICB3cml0ZUl0ZW0oaXRlbXNbaV0pOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZU5vZGVMaXN0KExpc3Q8Tm9kZT4gbm9kZXMpIHsKICAgIGZpbmFsIGxlbiA9IG5vZGVzLmxlbmd0aDsKICAgIHdyaXRlVUludDMwKGxlbik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGZpbmFsIG5vZGUgPSBub2Rlc1tpXTsKICAgICAgd3JpdGVOb2RlKG5vZGUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZVByb2NlZHVyZU5vZGVMaXN0KExpc3Q8UHJvY2VkdXJlPiBub2RlcykgewogICAgZmluYWwgbGVuID0gbm9kZXMubGVuZ3RoOwogICAgd3JpdGVVSW50MzAobGVuKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgZmluYWwgbm9kZSA9IG5vZGVzW2ldOwogICAgICB3cml0ZVByb2NlZHVyZU5vZGUobm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlRmllbGROb2RlTGlzdChMaXN0PEZpZWxkPiBub2RlcykgewogICAgZmluYWwgbGVuID0gbm9kZXMubGVuZ3RoOwogICAgd3JpdGVVSW50MzAobGVuKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgZmluYWwgbm9kZSA9IG5vZGVzW2ldOwogICAgICB3cml0ZUZpZWxkTm9kZShub2RlKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVDbGFzc05vZGVMaXN0KExpc3Q8Q2xhc3M+IG5vZGVzKSB7CiAgICBmaW5hbCBsZW4gPSBub2Rlcy5sZW5ndGg7CiAgICB3cml0ZVVJbnQzMChsZW4pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBmaW5hbCBub2RlID0gbm9kZXNbaV07CiAgICAgIHdyaXRlQ2xhc3NOb2RlKG5vZGUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZUNvbnN0cnVjdG9yTm9kZUxpc3QoTGlzdDxDb25zdHJ1Y3Rvcj4gbm9kZXMpIHsKICAgIGZpbmFsIGxlbiA9IG5vZGVzLmxlbmd0aDsKICAgIHdyaXRlVUludDMwKGxlbik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGZpbmFsIG5vZGUgPSBub2Rlc1tpXTsKICAgICAgd3JpdGVDb25zdHJ1Y3Rvck5vZGUobm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JOb2RlTGlzdCgKICAgICAgTGlzdDxSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvcj4gbm9kZXMpIHsKICAgIGZpbmFsIGxlbiA9IG5vZGVzLmxlbmd0aDsKICAgIHdyaXRlVUludDMwKGxlbik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGZpbmFsIG5vZGUgPSBub2Rlc1tpXTsKICAgICAgd3JpdGVSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvck5vZGUobm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlU3dpdGNoQ2FzZU5vZGVMaXN0KExpc3Q8U3dpdGNoQ2FzZT4gbm9kZXMpIHsKICAgIGZpbmFsIGxlbiA9IG5vZGVzLmxlbmd0aDsKICAgIHdyaXRlVUludDMwKGxlbik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGZpbmFsIG5vZGUgPSBub2Rlc1tpXTsKICAgICAgd3JpdGVTd2l0Y2hDYXNlTm9kZShub2RlKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVDYXRjaE5vZGVMaXN0KExpc3Q8Q2F0Y2g+IG5vZGVzKSB7CiAgICBmaW5hbCBsZW4gPSBub2Rlcy5sZW5ndGg7CiAgICB3cml0ZVVJbnQzMChsZW4pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBmaW5hbCBub2RlID0gbm9kZXNbaV07CiAgICAgIHdyaXRlQ2F0Y2hOb2RlKG5vZGUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZVR5cGVkZWZOb2RlTGlzdChMaXN0PFR5cGVkZWY+IG5vZGVzKSB7CiAgICBmaW5hbCBsZW4gPSBub2Rlcy5sZW5ndGg7CiAgICB3cml0ZVVJbnQzMChsZW4pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBmaW5hbCBub2RlID0gbm9kZXNbaV07CiAgICAgIHdyaXRlVHlwZWRlZk5vZGUobm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlTm9kZShOb2RlIG5vZGUpIHsKICAgIGlmIChfbWV0YWRhdGFTdWJzZWN0aW9ucyAhPSBudWxsKSB7CiAgICAgIF93cml0ZU5vZGVNZXRhZGF0YShub2RlKTsKICAgIH0KICAgIG5vZGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgdm9pZCB3cml0ZUZ1bmN0aW9uTm9kZShGdW5jdGlvbk5vZGUgbm9kZSkgewogICAgaWYgKF9tZXRhZGF0YVN1YnNlY3Rpb25zICE9IG51bGwpIHsKICAgICAgX3dyaXRlTm9kZU1ldGFkYXRhKG5vZGUpOwogICAgfQogICAgbm9kZS5hY2NlcHQodGhpcyk7CiAgfQoKICB2b2lkIHdyaXRlQXJndW1lbnRzTm9kZShBcmd1bWVudHMgbm9kZSkgewogICAgaWYgKF9tZXRhZGF0YVN1YnNlY3Rpb25zICE9IG51bGwpIHsKICAgICAgX3dyaXRlTm9kZU1ldGFkYXRhKG5vZGUpOwogICAgfQogICAgbm9kZS5hY2NlcHQodGhpcyk7CiAgfQoKICB2b2lkIHdyaXRlTGlicmFyeU5vZGUoTGlicmFyeSBub2RlKSB7CiAgICBpZiAoX21ldGFkYXRhU3Vic2VjdGlvbnMgIT0gbnVsbCkgewogICAgICBfd3JpdGVOb2RlTWV0YWRhdGEobm9kZSk7CiAgICB9CiAgICBub2RlLmFjY2VwdCh0aGlzKTsKICB9CgogIHZvaWQgd3JpdGVQcm9jZWR1cmVOb2RlKFByb2NlZHVyZSBub2RlKSB7CiAgICBpZiAoX21ldGFkYXRhU3Vic2VjdGlvbnMgIT0gbnVsbCkgewogICAgICBfd3JpdGVOb2RlTWV0YWRhdGEobm9kZSk7CiAgICB9CiAgICBub2RlLmFjY2VwdCh0aGlzKTsKICB9CgogIHZvaWQgd3JpdGVGaWVsZE5vZGUoRmllbGQgbm9kZSkgewogICAgaWYgKF9tZXRhZGF0YVN1YnNlY3Rpb25zICE9IG51bGwpIHsKICAgICAgX3dyaXRlTm9kZU1ldGFkYXRhKG5vZGUpOwogICAgfQogICAgbm9kZS5hY2NlcHQodGhpcyk7CiAgfQoKICB2b2lkIHdyaXRlQ2xhc3NOb2RlKENsYXNzIG5vZGUpIHsKICAgIGlmIChfbWV0YWRhdGFTdWJzZWN0aW9ucyAhPSBudWxsKSB7CiAgICAgIF93cml0ZU5vZGVNZXRhZGF0YShub2RlKTsKICAgIH0KICAgIG5vZGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgdm9pZCB3cml0ZUNvbnN0cnVjdG9yTm9kZShDb25zdHJ1Y3RvciBub2RlKSB7CiAgICBpZiAoX21ldGFkYXRhU3Vic2VjdGlvbnMgIT0gbnVsbCkgewogICAgICBfd3JpdGVOb2RlTWV0YWRhdGEobm9kZSk7CiAgICB9CiAgICBub2RlLmFjY2VwdCh0aGlzKTsKICB9CgogIHZvaWQgd3JpdGVSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvck5vZGUoCiAgICAgIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIG5vZGUpIHsKICAgIGlmIChfbWV0YWRhdGFTdWJzZWN0aW9ucyAhPSBudWxsKSB7CiAgICAgIF93cml0ZU5vZGVNZXRhZGF0YShub2RlKTsKICAgIH0KICAgIG5vZGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgdm9pZCB3cml0ZVN3aXRjaENhc2VOb2RlKFN3aXRjaENhc2Ugbm9kZSkgewogICAgaWYgKF9tZXRhZGF0YVN1YnNlY3Rpb25zICE9IG51bGwpIHsKICAgICAgX3dyaXRlTm9kZU1ldGFkYXRhKG5vZGUpOwogICAgfQogICAgbm9kZS5hY2NlcHQodGhpcyk7CiAgfQoKICB2b2lkIHdyaXRlQ2F0Y2hOb2RlKENhdGNoIG5vZGUpIHsKICAgIGlmIChfbWV0YWRhdGFTdWJzZWN0aW9ucyAhPSBudWxsKSB7CiAgICAgIF93cml0ZU5vZGVNZXRhZGF0YShub2RlKTsKICAgIH0KICAgIG5vZGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgdm9pZCB3cml0ZVR5cGVkZWZOb2RlKFR5cGVkZWYgbm9kZSkgewogICAgaWYgKF9tZXRhZGF0YVN1YnNlY3Rpb25zICE9IG51bGwpIHsKICAgICAgX3dyaXRlTm9kZU1ldGFkYXRhKG5vZGUpOwogICAgfQogICAgbm9kZS5hY2NlcHQodGhpcyk7CiAgfQoKICB2b2lkIHdyaXRlT3B0aW9uYWxOb2RlKE5vZGUgbm9kZSkgewogICAgaWYgKG5vZGUgPT0gbnVsbCkgewogICAgICB3cml0ZUJ5dGUoVGFnLk5vdGhpbmcpOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVCeXRlKFRhZy5Tb21ldGhpbmcpOwogICAgICB3cml0ZU5vZGUobm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlT3B0aW9uYWxGdW5jdGlvbk5vZGUoRnVuY3Rpb25Ob2RlIG5vZGUpIHsKICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgd3JpdGVCeXRlKFRhZy5Ob3RoaW5nKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlQnl0ZShUYWcuU29tZXRoaW5nKTsKICAgICAgd3JpdGVGdW5jdGlvbk5vZGUobm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlTGlua1RhYmxlKENvbXBvbmVudCBjb21wb25lbnQpIHsKICAgIF9iaW5hcnlPZmZzZXRGb3JMaW5rVGFibGUgPSBnZXRCdWZmZXJPZmZzZXQoKTsKICAgIHdyaXRlTGlzdChfY2Fub25pY2FsTmFtZUxpc3QsIHdyaXRlQ2Fub25pY2FsTmFtZUVudHJ5KTsKICB9CgogIHZvaWQgaW5kZXhMaW5rVGFibGUoQ29tcG9uZW50IGNvbXBvbmVudCkgewogICAgX2Nhbm9uaWNhbE5hbWVMaXN0ID0gPENhbm9uaWNhbE5hbWU+W107CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudC5saWJyYXJpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgTGlicmFyeSBsaWJyYXJ5ID0gY29tcG9uZW50LmxpYnJhcmllc1tpXTsKICAgICAgaWYgKCFzaG91bGRXcml0ZUxpYnJhcnlDYW5vbmljYWxOYW1lcyhsaWJyYXJ5KSkgY29udGludWU7CiAgICAgIF9pbmRleExpbmtUYWJsZUludGVybmFsKGxpYnJhcnkuY2Fub25pY2FsTmFtZSk7CiAgICAgIF9rbm93bkNhbm9uaWNhbE5hbWVOb25Sb290VG9wcy5hZGQobGlicmFyeS5jYW5vbmljYWxOYW1lKTsKICAgIH0KICB9CgogIHZvaWQgX2luZGV4TGlua1RhYmxlSW50ZXJuYWwoQ2Fub25pY2FsTmFtZSBub2RlKSB7CiAgICBub2RlLmluZGV4ID0gX2Nhbm9uaWNhbE5hbWVMaXN0Lmxlbmd0aDsKICAgIF9jYW5vbmljYWxOYW1lTGlzdC5hZGQobm9kZSk7CiAgICBJdGVyYWJsZTxDYW5vbmljYWxOYW1lPiBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW5Pck51bGw7CiAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewogICAgICBmb3IgKENhbm9uaWNhbE5hbWUgY2hpbGQgaW4gY2hpbGRyZW4pIHsKICAgICAgICBfaW5kZXhMaW5rVGFibGVJbnRlcm5hbChjaGlsZCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBDb21wdXRlIGNhbm9uaWNhbCBuYW1lcyBmb3IgdGhlIHdob2xlIGNvbXBvbmVudCBvciBwYXJ0cyBvZiBpdC4KICB2b2lkIGNvbXB1dGVDYW5vbmljYWxOYW1lcyhDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBjb21wb25lbnQuY29tcHV0ZUNhbm9uaWNhbE5hbWVzKCk7CiAgfQoKICAvLy8gUmV0dXJuIGB0cnVlYCBpZiBhbGwgY2Fub25pY2FsIG5hbWVzIG9mIHRoZSBbbGlicmFyeV0gc2hvdWxkIGJlIHdyaXR0ZW4KICAvLy8gaW50byB0aGUgbGluayB0YWJsZS4gIElmIHNvbWUgbGlicmFyaWVzIG9mIHRoZSBjb21wb25lbnQgYXJlIHNraXBwZWQsCiAgLy8vIHRoZW4gYWxsIHRoZSBhZGRpdGlvbmFsIG5hbWVzIHJlZmVyZW5jZWQgYnkgdGhlIGxpYnJhcmllcyB0aGF0IGFyZSB3cml0dGVuCiAgLy8vIGJ5IFt3cml0ZUxpYnJhcmllc10gYXJlIGF1dG9tYXRpY2FsbHkgYWRkZWQuCiAgYm9vbCBzaG91bGRXcml0ZUxpYnJhcnlDYW5vbmljYWxOYW1lcyhMaWJyYXJ5IGxpYnJhcnkpID0+IHRydWU7CgogIHZvaWQgd3JpdGVDYW5vbmljYWxOYW1lRW50cnkoQ2Fub25pY2FsTmFtZSBub2RlKSB7CiAgICBDYW5vbmljYWxOYW1lIHBhcmVudCA9IG5vZGUucGFyZW50OwogICAgaWYgKHBhcmVudC5pc1Jvb3QpIHsKICAgICAgd3JpdGVVSW50MzAoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZVVJbnQzMChwYXJlbnQuaW5kZXggKyAxKTsKICAgIH0KICAgIHdyaXRlU3RyaW5nUmVmZXJlbmNlKG5vZGUubmFtZSk7CiAgfQoKICB2b2lkIHdyaXRlQ29tcG9uZW50RmlsZShDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBjb21wdXRlQ2Fub25pY2FsTmFtZXMoY29tcG9uZW50KTsKICAgIGZpbmFsIGNvbXBvbmVudE9mZnNldCA9IGdldEJ1ZmZlck9mZnNldCgpOwogICAgd3JpdGVVSW50MzIoVGFnLkNvbXBvbmVudEZpbGUpOwogICAgd3JpdGVVSW50MzIoVGFnLkJpbmFyeUZvcm1hdFZlcnNpb24pOwogICAgd3JpdGVMaXN0T2ZTdHJpbmdzKGNvbXBvbmVudC5wcm9ibGVtc0FzSnNvbik7CiAgICBpbmRleExpbmtUYWJsZShjb21wb25lbnQpOwogICAgX2NvbGxlY3RNZXRhZGF0YShjb21wb25lbnQpOwogICAgaWYgKF9tZXRhZGF0YVN1YnNlY3Rpb25zICE9IG51bGwpIHsKICAgICAgX3dyaXRlTm9kZU1ldGFkYXRhSW1wbChjb21wb25lbnQsIGNvbXBvbmVudE9mZnNldCk7CiAgICB9CiAgICBsaWJyYXJ5T2Zmc2V0cyA9IDxpbnQ+W107CiAgICBDYW5vbmljYWxOYW1lIG1haW4gPSBnZXRDYW5vbmljYWxOYW1lT2ZNZW1iZXIoY29tcG9uZW50Lm1haW5NZXRob2QpOwogICAgaWYgKG1haW4gIT0gbnVsbCkgewogICAgICBjaGVja0Nhbm9uaWNhbE5hbWUobWFpbik7CiAgICB9CiAgICB3cml0ZUxpYnJhcmllcyhjb21wb25lbnQpOwogICAgd3JpdGVVcmlUb1NvdXJjZShjb21wb25lbnQudXJpVG9Tb3VyY2UpOwogICAgd3JpdGVMaW5rVGFibGUoY29tcG9uZW50KTsKICAgIF93cml0ZU1ldGFkYXRhU2VjdGlvbihjb21wb25lbnQpOwogICAgd3JpdGVTdHJpbmdUYWJsZShzdHJpbmdJbmRleGVyKTsKICAgIHdyaXRlQ29uc3RhbnRUYWJsZShfY29uc3RhbnRJbmRleGVyKTsKICAgIHdyaXRlQ29tcG9uZW50SW5kZXgoY29tcG9uZW50LCBjb21wb25lbnQubGlicmFyaWVzKTsKCiAgICBfZmx1c2goKTsKICB9CgogIHZvaWQgd3JpdGVMaXN0T2ZTdHJpbmdzKExpc3Q8U3RyaW5nPiBzdHJpbmdzKSB7CiAgICB3cml0ZVVJbnQzMChzdHJpbmdzPy5sZW5ndGggPz8gMCk7CiAgICBpZiAoc3RyaW5ncyAhPSBudWxsKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGg7IGkrKykgewogICAgICAgIFN0cmluZyBzID0gc3RyaW5nc1tpXTsKICAgICAgICAvLyBUaGlzIGlzIHNsb3csIGJ1dCB3ZSBleHBlY3QgdGhlcmUgdG8gaW4gZ2VuZXJhbCBiZSBubyBwcm9ibGVtcy4gSWYgdGhpcwogICAgICAgIC8vIHR1cm5zIG91dCB0byBiZSB3cm9uZyB3ZSBjYW4gb3B0aW1pemUgaXQgYXMgd2UgZG8gVVJMcyBmb3IgaW5zdGFuY2UuCiAgICAgICAgd3JpdGVCeXRlTGlzdCh1dGY4LmVuY29kZXIuY29udmVydChzKSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBDb2xsZWN0IG5vbi1lbXB0eSBtZXRhZGF0YSByZXBvc2l0b3JpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21wb25lbnQuCiAgdm9pZCBfY29sbGVjdE1ldGFkYXRhKENvbXBvbmVudCBjb21wb25lbnQpIHsKICAgIGNvbXBvbmVudC5tZXRhZGF0YS5mb3JFYWNoKCh0YWcsIHJlcG9zaXRvcnkpIHsKICAgICAgaWYgKHJlcG9zaXRvcnkubWFwcGluZy5pc0VtcHR5KSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBfbWV0YWRhdGFTdWJzZWN0aW9ucyA/Pz0gPF9NZXRhZGF0YVN1YnNlY3Rpb24+W107CiAgICAgIF9tZXRhZGF0YVN1YnNlY3Rpb25zLmFkZChuZXcgX01ldGFkYXRhU3Vic2VjdGlvbihyZXBvc2l0b3J5KSk7CiAgICB9KTsKICB9CgogIC8vLyBXcml0ZXMgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBbTm9kZV0uCiAgdm9pZCBfd3JpdGVOb2RlTWV0YWRhdGEoTm9kZSBub2RlKSB7CiAgICBfd3JpdGVOb2RlTWV0YWRhdGFJbXBsKG5vZGUsIGdldEJ1ZmZlck9mZnNldCgpKTsKICB9CgogIHZvaWQgX3dyaXRlTm9kZU1ldGFkYXRhSW1wbChOb2RlIG5vZGUsIGludCBub2RlT2Zmc2V0KSB7CiAgICBmb3IgKF9NZXRhZGF0YVN1YnNlY3Rpb24gc3Vic2VjdGlvbiBpbiBfbWV0YWRhdGFTdWJzZWN0aW9ucykgewogICAgICBmaW5hbCByZXBvc2l0b3J5ID0gc3Vic2VjdGlvbi5yZXBvc2l0b3J5OwogICAgICBmaW5hbCB2YWx1ZSA9IHJlcG9zaXRvcnkubWFwcGluZ1tub2RlXTsKICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgaWYgKCFNZXRhZGF0YVJlcG9zaXRvcnkuaXNTdXBwb3J0ZWQobm9kZSkpIHsKICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigKICAgICAgICAgICAgIk5vZGVzIG9mIHR5cGUgJHtub2RlLnJ1bnRpbWVUeXBlfSBjYW4ndCBoYXZlIG1ldGFkYXRhLiIpOwogICAgICB9CgogICAgICBpZiAoIWlkZW50aWNhbChfc2luaywgX21haW5TaW5rKSkgewogICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKAogICAgICAgICAgICAiTm9kZSB3cml0dGVuIGludG8gbWV0YWRhdGEgY2FuJ3QgaGF2ZSBtZXRhZGF0YSAiCiAgICAgICAgICAgICIobWV0YWRhdGE6ICR7cmVwb3NpdG9yeS50YWd9LCBub2RlOiAke25vZGUucnVudGltZVR5cGV9ICRub2RlKSIpOwogICAgICB9CgogICAgICBfc2luayA9IF9tZXRhZGF0YVNpbms7CiAgICAgIHN1YnNlY3Rpb24ubWV0YWRhdGFNYXBwaW5nLmFkZChub2RlT2Zmc2V0KTsKICAgICAgc3Vic2VjdGlvbi5tZXRhZGF0YU1hcHBpbmcuYWRkKGdldEJ1ZmZlck9mZnNldCgpKTsKICAgICAgcmVwb3NpdG9yeS53cml0ZVRvQmluYXJ5KHZhbHVlLCBub2RlLCB0aGlzKTsKICAgICAgX3NpbmsgPSBfbWFpblNpbms7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVudGVyU2NvcGUoCiAgICAgIHtMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLAogICAgICBib29sIG1lbWJlclNjb3BlOiBmYWxzZSwKICAgICAgYm9vbCB2YXJpYWJsZVNjb3BlOiBmYWxzZX0pIHsKICAgIGlmICh0eXBlUGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIF90eXBlUGFyYW1ldGVySW5kZXhlci5lbnRlcih0eXBlUGFyYW1ldGVycyk7CiAgICB9CiAgICBpZiAobWVtYmVyU2NvcGUpIHsKICAgICAgX3ZhcmlhYmxlSW5kZXhlciA9IG51bGw7CiAgICB9CiAgICBpZiAodmFyaWFibGVTY29wZSkgewogICAgICBfdmFyaWFibGVJbmRleGVyID8/PSBuZXcgVmFyaWFibGVJbmRleGVyKCk7CiAgICAgIF92YXJpYWJsZUluZGV4ZXIucHVzaFNjb3BlKCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGxlYXZlU2NvcGUoCiAgICAgIHtMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLAogICAgICBib29sIG1lbWJlclNjb3BlOiBmYWxzZSwKICAgICAgYm9vbCB2YXJpYWJsZVNjb3BlOiBmYWxzZX0pIHsKICAgIGlmICh2YXJpYWJsZVNjb3BlKSB7CiAgICAgIF92YXJpYWJsZUluZGV4ZXIucG9wU2NvcGUoKTsKICAgIH0KICAgIGlmIChtZW1iZXJTY29wZSkgewogICAgICBfdmFyaWFibGVJbmRleGVyID0gbnVsbDsKICAgIH0KICAgIGlmICh0eXBlUGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIF90eXBlUGFyYW1ldGVySW5kZXhlci5leGl0KHR5cGVQYXJhbWV0ZXJzKTsKICAgIH0KICB9CgogIHZvaWQgX3dyaXRlTWV0YWRhdGFTZWN0aW9uKENvbXBvbmVudCBjb21wb25lbnQpIHsKICAgIC8vIE1ha2Ugc3VyZSBtZXRhZGF0YSBwYXlsb2FkcyBzZWN0aW9uIGlzIDgtYnl0ZSBhbGlnbmVkLAogICAgLy8gc28gY2VydGFpbiBraW5kcyBvZiBtZXRhZGF0YSBjYW4gY29udGFpbiBhbGlnbmVkIGRhdGEuCiAgICBjb25zdCBpbnQgbWV0YWRhdGFQYXlsb2Fkc0FsaWdubWVudCA9IDg7CiAgICBpbnQgcGFkZGluZyA9ICgoZ2V0QnVmZmVyT2Zmc2V0KCkgKyBtZXRhZGF0YVBheWxvYWRzQWxpZ25tZW50IC0gMSkgJgogICAgICAgICAgICAtbWV0YWRhdGFQYXlsb2Fkc0FsaWdubWVudCkgLQogICAgICAgIGdldEJ1ZmZlck9mZnNldCgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWRkaW5nOyArK2kpIHsKICAgICAgd3JpdGVCeXRlKDApOwogICAgfQoKICAgIF9iaW5hcnlPZmZzZXRGb3JNZXRhZGF0YVBheWxvYWRzID0gZ2V0QnVmZmVyT2Zmc2V0KCk7CgogICAgaWYgKF9tZXRhZGF0YVN1YnNlY3Rpb25zID09IG51bGwpIHsKICAgICAgX2JpbmFyeU9mZnNldEZvck1ldGFkYXRhTWFwcGluZ3MgPSBnZXRCdWZmZXJPZmZzZXQoKTsKICAgICAgd3JpdGVVSW50MzIoMCk7IC8vIEVtcHR5IHNlY3Rpb24uCiAgICAgIHJldHVybjsKICAgIH0KCiAgICBhc3NlcnQoaWRlbnRpY2FsKF9zaW5rLCBfbWFpblNpbmspKTsKICAgIF9tZXRhZGF0YVNpbmsuZmx1c2hBbmREZXN0cm95KCk7CiAgICB3cml0ZUJ5dGVzKChfbWV0YWRhdGFTaW5rLl9zaW5rIGFzIEJ5dGVzU2luaykuYnVpbGRlci50YWtlQnl0ZXMoKSk7CgogICAgLy8gUkxpc3Q8TWV0YWRhdGFNYXBwaW5nPiBtZXRhZGF0YU1hcHBpbmdzCiAgICBfYmluYXJ5T2Zmc2V0Rm9yTWV0YWRhdGFNYXBwaW5ncyA9IGdldEJ1ZmZlck9mZnNldCgpOwogICAgZm9yIChfTWV0YWRhdGFTdWJzZWN0aW9uIHN1YnNlY3Rpb24gaW4gX21ldGFkYXRhU3Vic2VjdGlvbnMpIHsKICAgICAgLy8gVUludDMyIHRhZwogICAgICB3cml0ZVVJbnQzMihzdHJpbmdJbmRleGVyLnB1dChzdWJzZWN0aW9uLnJlcG9zaXRvcnkudGFnKSk7CgogICAgICAvLyBSTGlzdDxQYWlyPFVJbnQzMiwgVUludDMyPj4gbm9kZU9mZnNldFRvTWV0YWRhdGFPZmZzZXQKICAgICAgZmluYWwgbWFwcGluZ0xlbmd0aCA9IHN1YnNlY3Rpb24ubWV0YWRhdGFNYXBwaW5nLmxlbmd0aDsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBwaW5nTGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICB3cml0ZVVJbnQzMihzdWJzZWN0aW9uLm1ldGFkYXRhTWFwcGluZ1tpXSk7IC8vIG5vZGUgb2Zmc2V0CiAgICAgICAgd3JpdGVVSW50MzIoc3Vic2VjdGlvbi5tZXRhZGF0YU1hcHBpbmdbaSArIDFdKTsgLy8gbWV0YWRhdGEgb2Zmc2V0CiAgICAgIH0KICAgICAgd3JpdGVVSW50MzIobWFwcGluZ0xlbmd0aCB+LyAyKTsKICAgIH0KICAgIHdyaXRlVUludDMyKF9tZXRhZGF0YVN1YnNlY3Rpb25zLmxlbmd0aCk7CiAgfQoKICAvLy8gV3JpdGUgYWxsIG9mIHNvbWUgb2YgdGhlIGxpYnJhcmllcyBvZiB0aGUgW2NvbXBvbmVudF0uCiAgdm9pZCB3cml0ZUxpYnJhcmllcyhDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudC5saWJyYXJpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgd3JpdGVMaWJyYXJ5Tm9kZShjb21wb25lbnQubGlicmFyaWVzW2ldKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVDb21wb25lbnRJbmRleChDb21wb25lbnQgY29tcG9uZW50LCBMaXN0PExpYnJhcnk+IGxpYnJhcmllcykgewogICAgLy8gSXQgaXMgYWxsb3dlZCB0byBjb25jYXRlbmF0ZSBzZXZlcmFsIGtlcm5lbCBiaW5hcmllcyB0byBjcmVhdGUgYQogICAgLy8gbXVsdGktY29tcG9uZW50IGtlcm5lbCBmaWxlLiBJbiBvcmRlciB0byBtYWludGFpbiBhbGlnbm1lbnQgb2YKICAgIC8vIG1ldGFkYXRhIHNlY3Rpb25zIHdpdGhpbiBrZXJuZWwgYmluYXJpZXMgYWZ0ZXIgY29uY2F0ZW5hdGlvbiwKICAgIC8vIHNpemUgb2YgZWFjaCBrZXJuZWwgYmluYXJ5IHNob3VsZCBiZSBhbGlnbmVkLgogICAgLy8gQ29tcG9uZW50IGluZGV4IGlzIGxvY2F0ZWQgYXQgdGhlIGVuZCBvZiBhIGtlcm5lbCBiaW5hcnksIHNvIHBhZGRpbmcKICAgIC8vIGlzIGFkZGVkIGJlZm9yZSBjb21wb25lbnQgaW5kZXguCiAgICBjb25zdCBpbnQga2VybmVsRmlsZUFsaWdubWVudCA9IDg7CgogICAgLy8gS2VlcCB0aGlzIGluIHN5bmMgd2l0aCBudW1iZXIgb2Ygd3JpdGVVSW50MzIgYmVsb3cuCiAgICBpbnQgbnVtQ29tcG9uZW50SW5kZXhFbnRyaWVzID0gNyArIGxpYnJhcnlPZmZzZXRzLmxlbmd0aCArIDM7CgogICAgaW50IHVuYWxpZ25lZFNpemUgPSBnZXRCdWZmZXJPZmZzZXQoKSArIG51bUNvbXBvbmVudEluZGV4RW50cmllcyAqIDQ7CiAgICBpbnQgcGFkZGluZyA9CiAgICAgICAgKCh1bmFsaWduZWRTaXplICsga2VybmVsRmlsZUFsaWdubWVudCAtIDEpICYgLWtlcm5lbEZpbGVBbGlnbm1lbnQpIC0KICAgICAgICAgICAgdW5hbGlnbmVkU2l6ZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFkZGluZzsgKytpKSB7CiAgICAgIHdyaXRlQnl0ZSgwKTsKICAgIH0KCiAgICAvLyBGaXhlZC1zaXplIGludHMgYXQgdGhlIGVuZCB1c2VkIGFzIGFuIGluZGV4LgogICAgYXNzZXJ0KF9iaW5hcnlPZmZzZXRGb3JTb3VyY2VUYWJsZSA+PSAwKTsKICAgIHdyaXRlVUludDMyKF9iaW5hcnlPZmZzZXRGb3JTb3VyY2VUYWJsZSk7CiAgICBhc3NlcnQoX2JpbmFyeU9mZnNldEZvckxpbmtUYWJsZSA+PSAwKTsKICAgIHdyaXRlVUludDMyKF9iaW5hcnlPZmZzZXRGb3JMaW5rVGFibGUpOwogICAgYXNzZXJ0KF9iaW5hcnlPZmZzZXRGb3JNZXRhZGF0YVBheWxvYWRzID49IDApOwogICAgd3JpdGVVSW50MzIoX2JpbmFyeU9mZnNldEZvck1ldGFkYXRhUGF5bG9hZHMpOwogICAgYXNzZXJ0KF9iaW5hcnlPZmZzZXRGb3JNZXRhZGF0YU1hcHBpbmdzID49IDApOwogICAgd3JpdGVVSW50MzIoX2JpbmFyeU9mZnNldEZvck1ldGFkYXRhTWFwcGluZ3MpOwogICAgYXNzZXJ0KF9iaW5hcnlPZmZzZXRGb3JTdHJpbmdUYWJsZSA+PSAwKTsKICAgIHdyaXRlVUludDMyKF9iaW5hcnlPZmZzZXRGb3JTdHJpbmdUYWJsZSk7CiAgICBhc3NlcnQoX2JpbmFyeU9mZnNldEZvckNvbnN0YW50VGFibGUgPj0gMCk7CiAgICB3cml0ZVVJbnQzMihfYmluYXJ5T2Zmc2V0Rm9yQ29uc3RhbnRUYWJsZSk7CgogICAgQ2Fub25pY2FsTmFtZSBtYWluID0gZ2V0Q2Fub25pY2FsTmFtZU9mTWVtYmVyKGNvbXBvbmVudC5tYWluTWV0aG9kKTsKICAgIGlmIChtYWluID09IG51bGwpIHsKICAgICAgd3JpdGVVSW50MzIoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZVVJbnQzMihtYWluLmluZGV4ICsgMSk7CiAgICB9CgogICAgYXNzZXJ0KGxpYnJhcnlPZmZzZXRzLmxlbmd0aCA9PSBsaWJyYXJpZXMubGVuZ3RoKTsKICAgIGZvciAoaW50IG9mZnNldCBpbiBsaWJyYXJ5T2Zmc2V0cykgewogICAgICB3cml0ZVVJbnQzMihvZmZzZXQpOwogICAgfQogICAgd3JpdGVVSW50MzIoX2JpbmFyeU9mZnNldEZvclNvdXJjZVRhYmxlKTsgLy8gZW5kIG9mIGxhc3QgbGlicmFyeS4KICAgIHdyaXRlVUludDMyKGxpYnJhcmllcy5sZW5ndGgpOwoKICAgIHdyaXRlVUludDMyKGdldEJ1ZmZlck9mZnNldCgpICsgNCk7IC8vIHRvdGFsIHNpemUuCiAgfQoKICB2b2lkIHdyaXRlVXJpVG9Tb3VyY2UoTWFwPFVyaSwgU291cmNlPiB1cmlUb1NvdXJjZSkgewogICAgX2JpbmFyeU9mZnNldEZvclNvdXJjZVRhYmxlID0gZ2V0QnVmZmVyT2Zmc2V0KCk7CgogICAgaW50IGxlbmd0aCA9IF9zb3VyY2VVcmlJbmRleGVyLmluZGV4Lmxlbmd0aDsKICAgIHdyaXRlVUludDMyKGxlbmd0aCk7CiAgICBMaXN0PGludD4gaW5kZXggPSBuZXcgTGlzdDxpbnQ+KGxlbmd0aCk7CgogICAgLy8gV3JpdGUgZGF0YS4KICAgIGludCBpID0gMDsKICAgIFVpbnQ4TGlzdCBidWZmZXIgPSBuZXcgVWludDhMaXN0KDEgPDwgMTYpOwogICAgZm9yIChVcmkgdXJpIGluIF9zb3VyY2VVcmlJbmRleGVyLmluZGV4LmtleXMpIHsKICAgICAgaW5kZXhbaV0gPSBnZXRCdWZmZXJPZmZzZXQoKTsKICAgICAgU291cmNlIHNvdXJjZSA9IHVyaVRvU291cmNlW3VyaV07CiAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCB8fAogICAgICAgICAgIShpbmNsdWRlU291cmNlcyAmJgogICAgICAgICAgICAgIF9zb3VyY2VzRnJvbVJlYWxJbXBsZW1lbnRhdGlvbi5sZW5ndGggPiBpICYmCiAgICAgICAgICAgICAgX3NvdXJjZXNGcm9tUmVhbEltcGxlbWVudGF0aW9uW2ldID09IHRydWUpKSB7CiAgICAgICAgc291cmNlID0gbmV3IFNvdXJjZSgKICAgICAgICAgICAgPGludD5bXSwgY29uc3QgPGludD5bXSwgc291cmNlPy5pbXBvcnRVcmksIHNvdXJjZT8uZmlsZVVyaSk7CiAgICAgIH0KCiAgICAgIFN0cmluZyB1cmlBc1N0cmluZyA9IHVyaSA9PSBudWxsID8gIiIgOiAiJHVyaSI7CiAgICAgIG91dHB1dFN0cmluZ1ZpYUJ1ZmZlcih1cmlBc1N0cmluZywgYnVmZmVyKTsKCiAgICAgIHdyaXRlQnl0ZUxpc3Qoc291cmNlLnNvdXJjZSk7CgogICAgICBMaXN0PGludD4gbGluZVN0YXJ0cyA9IHNvdXJjZS5saW5lU3RhcnRzOwogICAgICB3cml0ZVVJbnQzMChsaW5lU3RhcnRzLmxlbmd0aCk7CiAgICAgIGludCBwcmV2aW91c0xpbmVTdGFydCA9IDA7CiAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGluZVN0YXJ0cy5sZW5ndGg7ICsraikgewogICAgICAgIGludCBsaW5lU3RhcnQgPSBsaW5lU3RhcnRzW2pdOwogICAgICAgIHdyaXRlVUludDMwKGxpbmVTdGFydCAtIHByZXZpb3VzTGluZVN0YXJ0KTsKICAgICAgICBwcmV2aW91c0xpbmVTdGFydCA9IGxpbmVTdGFydDsKICAgICAgfQoKICAgICAgU3RyaW5nIGltcG9ydFVyaUFzU3RyaW5nID0KICAgICAgICAgIHNvdXJjZS5pbXBvcnRVcmkgPT0gbnVsbCA/ICIiIDogIiR7c291cmNlLmltcG9ydFVyaX0iOwogICAgICBvdXRwdXRTdHJpbmdWaWFCdWZmZXIoaW1wb3J0VXJpQXNTdHJpbmcsIGJ1ZmZlcik7CgogICAgICBpKys7CiAgICB9CgogICAgLy8gV3JpdGUgaW5kZXggZm9yIHJhbmRvbSBhY2Nlc3MuCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGV4Lmxlbmd0aDsgKytpKSB7CiAgICAgIHdyaXRlVUludDMyKGluZGV4W2ldKTsKICAgIH0KICB9CgogIHZvaWQgb3V0cHV0U3RyaW5nVmlhQnVmZmVyKFN0cmluZyB1cmlBc1N0cmluZywgVWludDhMaXN0IGJ1ZmZlcikgewogICAgaWYgKHVyaUFzU3RyaW5nLmxlbmd0aCAqIDMgPCBidWZmZXIubGVuZ3RoKSB7CiAgICAgIGludCBsZW5ndGggPSBOb3RRdWl0ZVN0cmluZy53cml0ZVV0ZjgoYnVmZmVyLCAwLCB1cmlBc1N0cmluZyk7CiAgICAgIGlmIChsZW5ndGggPCAwKSB7CiAgICAgICAgLy8gVXRmOCBlbmNvZGluZyBmYWlsZWQuCiAgICAgICAgd3JpdGVCeXRlTGlzdCh1dGY4LmVuY29kZXIuY29udmVydCh1cmlBc1N0cmluZykpOwogICAgICB9IGVsc2UgewogICAgICAgIHdyaXRlVUludDMwKGxlbmd0aCk7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7IGorKykgewogICAgICAgICAgd3JpdGVCeXRlKGJ1ZmZlcltqXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBVbmNvbW1vbiBjYXNlIHdpdGggdmVyeSBsb25nIHVybC4KICAgICAgd3JpdGVCeXRlTGlzdCh1dGY4LmVuY29kZXIuY29udmVydCh1cmlBc1N0cmluZykpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZUxpYnJhcnlEZXBlbmRlbmN5UmVmZXJlbmNlKExpYnJhcnlEZXBlbmRlbmN5IG5vZGUpIHsKICAgIGludCBpbmRleCA9IF9saWJyYXJ5RGVwZW5kZW5jeUluZGV4W25vZGVdOwogICAgaWYgKGluZGV4ID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAnUmVmZXJlbmNlIHRvIGxpYnJhcnkgZGVwZW5kZW5jeSAkbm9kZSBvdXQgb2Ygc2NvcGUnKTsKICAgIH0KICAgIHdyaXRlVUludDMwKGluZGV4KTsKICB9CgogIHZvaWQgd3JpdGVOdWxsQWxsb3dlZFJlZmVyZW5jZShSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CiAgICBpZiAocmVmZXJlbmNlID09IG51bGwpIHsKICAgICAgd3JpdGVVSW50MzAoMCk7CiAgICB9IGVsc2UgewogICAgICBDYW5vbmljYWxOYW1lIG5hbWUgPSByZWZlcmVuY2UuY2Fub25pY2FsTmFtZTsKICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewogICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdNaXNzaW5nIGNhbm9uaWNhbCBuYW1lIGZvciAkcmVmZXJlbmNlJyk7CiAgICAgIH0KICAgICAgY2hlY2tDYW5vbmljYWxOYW1lKG5hbWUpOwogICAgICB3cml0ZVVJbnQzMChuYW1lLmluZGV4ICsgMSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlTm9uTnVsbFJlZmVyZW5jZShSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CiAgICBpZiAocmVmZXJlbmNlID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ0dvdCBudWxsIHJlZmVyZW5jZScpOwogICAgfSBlbHNlIHsKICAgICAgQ2Fub25pY2FsTmFtZSBuYW1lID0gcmVmZXJlbmNlLmNhbm9uaWNhbE5hbWU7CiAgICAgIGlmIChuYW1lID09IG51bGwpIHsKICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignTWlzc2luZyBjYW5vbmljYWwgbmFtZSBmb3IgJHJlZmVyZW5jZScpOwogICAgICB9CiAgICAgIGNoZWNrQ2Fub25pY2FsTmFtZShuYW1lKTsKICAgICAgd3JpdGVVSW50MzAobmFtZS5pbmRleCArIDEpOwogICAgfQogIH0KCiAgdm9pZCBjaGVja0Nhbm9uaWNhbE5hbWUoQ2Fub25pY2FsTmFtZSBub2RlKSB7CiAgICBpZiAoX2tub3duQ2Fub25pY2FsTmFtZU5vblJvb3RUb3BzLmNvbnRhaW5zKG5vZGUubm9uUm9vdFRvcCkpIHJldHVybjsKICAgIGlmIChub2RlID09IG51bGwgfHwgbm9kZS5pc1Jvb3QpIHJldHVybjsKICAgIGlmIChfcmVpbmRleGVkQ2Fub25pY2FsTmFtZXMuY29udGFpbnMobm9kZSkpIHJldHVybjsKCiAgICBjaGVja0Nhbm9uaWNhbE5hbWUobm9kZS5wYXJlbnQpOwogICAgbm9kZS5pbmRleCA9IF9jYW5vbmljYWxOYW1lTGlzdC5sZW5ndGg7CiAgICBfY2Fub25pY2FsTmFtZUxpc3QuYWRkKG5vZGUpOwogICAgX3JlaW5kZXhlZENhbm9uaWNhbE5hbWVzLmFkZChub2RlKTsKICB9CgogIHZvaWQgd3JpdGVOdWxsQWxsb3dlZENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoQ2Fub25pY2FsTmFtZSBuYW1lKSB7CiAgICBpZiAobmFtZSA9PSBudWxsKSB7CiAgICAgIHdyaXRlVUludDMwKDApOwogICAgfSBlbHNlIHsKICAgICAgY2hlY2tDYW5vbmljYWxOYW1lKG5hbWUpOwogICAgICB3cml0ZVVJbnQzMChuYW1lLmluZGV4ICsgMSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlTm9uTnVsbENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoQ2Fub25pY2FsTmFtZSBuYW1lKSB7CiAgICBpZiAobmFtZSA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKAogICAgICAgICAgJ0V4cGVjdGVkIGEgY2Fub25pY2FsIG5hbWUgdG8gYmUgdmFsaWQgYnV0IHdhcyBgbnVsbGAuJyk7CiAgICB9IGVsc2UgewogICAgICBjaGVja0Nhbm9uaWNhbE5hbWUobmFtZSk7CiAgICAgIHdyaXRlVUludDMwKG5hbWUuaW5kZXggKyAxKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVMaWJyYXJ5UmVmZXJlbmNlKExpYnJhcnkgbm9kZSwge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmIChub2RlLmNhbm9uaWNhbE5hbWUgPT0gbnVsbCAmJiAhYWxsb3dOdWxsKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKAogICAgICAgICAgJ0V4cGVjdGVkIGEgbGlicmFyeSByZWZlcmVuY2UgdG8gYmUgdmFsaWQgYnV0IHdhcyBgbnVsbGAuJyk7CiAgICB9CiAgICB3cml0ZU51bGxBbGxvd2VkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZShub2RlLmNhbm9uaWNhbE5hbWUpOwogIH0KCiAgd3JpdGVPZmZzZXQoaW50IG9mZnNldCkgewogICAgLy8gVE9ETyhqZW5zaik6IERlbHRhLWVuY29kaW5nLgogICAgLy8gRmlsZSBvZmZzZXQgcmFuZ2VzIGZyb20gLTEgYW5kIHVwLAogICAgLy8gYnV0IGlzIGhlcmUgc2F2ZWQgYXMgdW5zaWduZWQgKHRodXMgdGhlICsxKQogICAgd3JpdGVVSW50MzAob2Zmc2V0ICsgMSk7CiAgfQoKICB2b2lkIHdyaXRlQ2xhc3NSZWZlcmVuY2UoQ2xhc3MgY2xhc3NfKSB7CiAgICBpZiAoY2xhc3NfID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAnRXhwZWN0ZWQgYSBjbGFzcyByZWZlcmVuY2UgdG8gYmUgdmFsaWQgYnV0IHdhcyBgbnVsbGAuJyk7CiAgICB9CiAgICB3cml0ZU5vbk51bGxDYW5vbmljYWxOYW1lUmVmZXJlbmNlKGdldENhbm9uaWNhbE5hbWVPZkNsYXNzKGNsYXNzXykpOwogIH0KCiAgdm9pZCB3cml0ZU5hbWUoTmFtZSBub2RlKSB7CiAgICBpZiAoX21ldGFkYXRhU3Vic2VjdGlvbnMgIT0gbnVsbCkgewogICAgICBfd3JpdGVOb2RlTWV0YWRhdGEobm9kZSk7CiAgICB9CiAgICB3cml0ZVN0cmluZ1JlZmVyZW5jZShub2RlLm5hbWUpOwogICAgLy8gVE9ETzogQ29uc2lkZXIgYSBtb3JlIGNvbXByZXNzZWQgZm9ybWF0IGZvciBwcml2YXRlIG5hbWVzIHdpdGhpbiB0aGUKICAgIC8vIGVuY2xvc2luZyBsaWJyYXJ5LgogICAgaWYgKG5vZGUuaXNQcml2YXRlKSB7CiAgICAgIHdyaXRlTGlicmFyeVJlZmVyZW5jZShub2RlLmxpYnJhcnkpOwogICAgfQogIH0KCiAgYm9vbCBpbnNpZGVFeHRlcm5hbExpYnJhcnkgPSBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExpYnJhcnkoTGlicmFyeSBub2RlKSB7CiAgICBpbnNpZGVFeHRlcm5hbExpYnJhcnkgPSBub2RlLmlzRXh0ZXJuYWw7CiAgICBsaWJyYXJ5T2Zmc2V0cy5hZGQoZ2V0QnVmZmVyT2Zmc2V0KCkpOwogICAgd3JpdGVCeXRlKG5vZGUuZmxhZ3MpOwogICAgd3JpdGVOb25OdWxsQ2Fub25pY2FsTmFtZVJlZmVyZW5jZShnZXRDYW5vbmljYWxOYW1lT2ZMaWJyYXJ5KG5vZGUpKTsKICAgIHdyaXRlU3RyaW5nUmVmZXJlbmNlKG5vZGUubmFtZSA/PyAnJyk7CiAgICB3cml0ZVVyaVJlZmVyZW5jZShub2RlLmZpbGVVcmkpOwogICAgd3JpdGVMaXN0T2ZTdHJpbmdzKG5vZGUucHJvYmxlbXNBc0pzb24pOwogICAgZW50ZXJTY29wZShtZW1iZXJTY29wZTogdHJ1ZSk7CiAgICB3cml0ZUFubm90YXRpb25MaXN0KG5vZGUuYW5ub3RhdGlvbnMpOwogICAgd3JpdGVMaWJyYXJ5RGVwZW5kZW5jaWVzKG5vZGUpOwogICAgd3JpdGVBZGRpdGlvbmFsRXhwb3J0cyhub2RlLmFkZGl0aW9uYWxFeHBvcnRzKTsKICAgIHdyaXRlTGlicmFyeVBhcnRzKG5vZGUpOwogICAgbGVhdmVTY29wZShtZW1iZXJTY29wZTogdHJ1ZSk7CgogICAgd3JpdGVUeXBlZGVmTm9kZUxpc3Qobm9kZS50eXBlZGVmcyk7CiAgICBjbGFzc09mZnNldHMgPSBuZXcgTGlzdDxpbnQ+KCk7CiAgICB3cml0ZUNsYXNzTm9kZUxpc3Qobm9kZS5jbGFzc2VzKTsKICAgIGNsYXNzT2Zmc2V0cy5hZGQoZ2V0QnVmZmVyT2Zmc2V0KCkpOwogICAgd3JpdGVGaWVsZE5vZGVMaXN0KG5vZGUuZmllbGRzKTsKICAgIHByb2NlZHVyZU9mZnNldHMgPSBuZXcgTGlzdDxpbnQ+KCk7CiAgICB3cml0ZVByb2NlZHVyZU5vZGVMaXN0KG5vZGUucHJvY2VkdXJlcyk7CiAgICBwcm9jZWR1cmVPZmZzZXRzLmFkZChnZXRCdWZmZXJPZmZzZXQoKSk7CgogICAgLy8gRHVtcCBhbGwgc291cmNlLXJlZmVyZW5jZXMgdXNlZCBpbiB0aGlzIGxpYnJhcnk7IHVzZWQgYnkgdGhlIFZNLgogICAgaW50IHNvdXJjZVJlZmVyZW5jZXNPZmZzZXQgPSBnZXRCdWZmZXJPZmZzZXQoKTsKICAgIGludCBzb3VyY2VSZWZlcmVuY2VzQ291bnQgPSAwOwogICAgLy8gTm90ZTogV2Ugc3RhcnQgYXQgMSBiZWNhdXNlIDAgaXMgdGhlIG51bGwtZW50cnkgYW5kIHdlIGRvbid0IHdhbnQgdG8KICAgIC8vIGluY2x1ZGUgdGhhdC4KICAgIGZvciAoaW50IGkgPSAxOyBpIDwgX3NvdXJjZXNGcm9tUmVhbEltcGxlbWVudGF0aW9uSW5MaWJyYXJ5Lmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChfc291cmNlc0Zyb21SZWFsSW1wbGVtZW50YXRpb25JbkxpYnJhcnlbaV0gPT0gdHJ1ZSkgewogICAgICAgIHNvdXJjZVJlZmVyZW5jZXNDb3VudCsrOwogICAgICB9CiAgICB9CiAgICB3cml0ZVVJbnQzMChzb3VyY2VSZWZlcmVuY2VzQ291bnQpOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPCBfc291cmNlc0Zyb21SZWFsSW1wbGVtZW50YXRpb25JbkxpYnJhcnkubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKF9zb3VyY2VzRnJvbVJlYWxJbXBsZW1lbnRhdGlvbkluTGlicmFyeVtpXSA9PSB0cnVlKSB7CiAgICAgICAgd3JpdGVVSW50MzAoaSk7CiAgICAgICAgX3NvdXJjZXNGcm9tUmVhbEltcGxlbWVudGF0aW9uSW5MaWJyYXJ5W2ldID0gZmFsc2U7CiAgICAgIH0KICAgIH0KCiAgICAvLyBGaXhlZC1zaXplIGludHMgYXQgdGhlIGVuZCB1c2VkIGFzIGFuIGluZGV4LgogICAgd3JpdGVVSW50MzIoc291cmNlUmVmZXJlbmNlc09mZnNldCk7CiAgICBhc3NlcnQoY2xhc3NPZmZzZXRzLmxlbmd0aCA+IDApOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc09mZnNldHMubGVuZ3RoOyArK2kpIHsKICAgICAgaW50IG9mZnNldCA9IGNsYXNzT2Zmc2V0c1tpXTsKICAgICAgd3JpdGVVSW50MzIob2Zmc2V0KTsKICAgIH0KICAgIHdyaXRlVUludDMyKGNsYXNzT2Zmc2V0cy5sZW5ndGggLSAxKTsKCiAgICBhc3NlcnQocHJvY2VkdXJlT2Zmc2V0cy5sZW5ndGggPiAwKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvY2VkdXJlT2Zmc2V0cy5sZW5ndGg7ICsraSkgewogICAgICBpbnQgb2Zmc2V0ID0gcHJvY2VkdXJlT2Zmc2V0c1tpXTsKICAgICAgd3JpdGVVSW50MzIob2Zmc2V0KTsKICAgIH0KICAgIHdyaXRlVUludDMyKHByb2NlZHVyZU9mZnNldHMubGVuZ3RoIC0gMSk7CiAgfQoKICB2b2lkIHdyaXRlTGlicmFyeURlcGVuZGVuY2llcyhMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIF9saWJyYXJ5RGVwZW5kZW5jeUluZGV4ID0gbGlicmFyeS5kZXBlbmRlbmNpZXMuaXNFbXB0eQogICAgICAgID8gY29uc3QgPExpYnJhcnlEZXBlbmRlbmN5LCBpbnQ+e30KICAgICAgICA6IDxMaWJyYXJ5RGVwZW5kZW5jeSwgaW50Pnt9OwogICAgd3JpdGVVSW50MzAobGlicmFyeS5kZXBlbmRlbmNpZXMubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlicmFyeS5kZXBlbmRlbmNpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgTGlicmFyeURlcGVuZGVuY3kgaW1wb3J0Tm9kZSA9IGxpYnJhcnkuZGVwZW5kZW5jaWVzW2ldOwogICAgICBfbGlicmFyeURlcGVuZGVuY3lJbmRleFtpbXBvcnROb2RlXSA9IGk7CiAgICAgIHdyaXRlTGlicmFyeURlcGVuZGVuY3koaW1wb3J0Tm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlQWRkaXRpb25hbEV4cG9ydHMoTGlzdDxSZWZlcmVuY2U+IGFkZGl0aW9uYWxFeHBvcnRzKSB7CiAgICB3cml0ZVVJbnQzMChhZGRpdGlvbmFsRXhwb3J0cy5sZW5ndGgpOwogICAgZm9yIChSZWZlcmVuY2UgcmVmIGluIGFkZGl0aW9uYWxFeHBvcnRzKSB7CiAgICAgIHdyaXRlTm9uTnVsbFJlZmVyZW5jZShyZWYpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZUxpYnJhcnlEZXBlbmRlbmN5KExpYnJhcnlEZXBlbmRlbmN5IG5vZGUpIHsKICAgIGlmIChfbWV0YWRhdGFTdWJzZWN0aW9ucyAhPSBudWxsKSB7CiAgICAgIF93cml0ZU5vZGVNZXRhZGF0YShub2RlKTsKICAgIH0KICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZUJ5dGUobm9kZS5mbGFncyk7CiAgICB3cml0ZUFubm90YXRpb25MaXN0KG5vZGUuYW5ub3RhdGlvbnMpOwogICAgd3JpdGVMaWJyYXJ5UmVmZXJlbmNlKG5vZGUudGFyZ2V0TGlicmFyeSwgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHdyaXRlU3RyaW5nUmVmZXJlbmNlKG5vZGUubmFtZSA/PyAnJyk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUuY29tYmluYXRvcnMpOwogIH0KCiAgdm9pZCB2aXNpdENvbWJpbmF0b3IoQ29tYmluYXRvciBub2RlKSB7CiAgICB3cml0ZUJ5dGUobm9kZS5pc1Nob3cgPyAxIDogMCk7CiAgICB3cml0ZVN0cmluZ1JlZmVyZW5jZUxpc3Qobm9kZS5uYW1lcyk7CiAgfQoKICB2b2lkIHdyaXRlTGlicmFyeVBhcnRzKExpYnJhcnkgbGlicmFyeSkgewogICAgd3JpdGVVSW50MzAobGlicmFyeS5wYXJ0cy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaWJyYXJ5LnBhcnRzLmxlbmd0aDsgKytpKSB7CiAgICAgIExpYnJhcnlQYXJ0IHBhcnROb2RlID0gbGlicmFyeS5wYXJ0c1tpXTsKICAgICAgd3JpdGVMaWJyYXJ5UGFydChwYXJ0Tm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlTGlicmFyeVBhcnQoTGlicmFyeVBhcnQgbm9kZSkgewogICAgaWYgKF9tZXRhZGF0YVN1YnNlY3Rpb25zICE9IG51bGwpIHsKICAgICAgX3dyaXRlTm9kZU1ldGFkYXRhKG5vZGUpOwogICAgfQogICAgd3JpdGVBbm5vdGF0aW9uTGlzdChub2RlLmFubm90YXRpb25zKTsKICAgIHdyaXRlU3RyaW5nUmVmZXJlbmNlKG5vZGUucGFydFVyaSk7CiAgfQoKICB2b2lkIHZpc2l0VHlwZWRlZihUeXBlZGVmIG5vZGUpIHsKICAgIGVudGVyU2NvcGUobWVtYmVyU2NvcGU6IHRydWUpOwogICAgd3JpdGVOb25OdWxsQ2Fub25pY2FsTmFtZVJlZmVyZW5jZShnZXRDYW5vbmljYWxOYW1lT2ZUeXBlZGVmKG5vZGUpKTsKICAgIHdyaXRlVXJpUmVmZXJlbmNlKG5vZGUuZmlsZVVyaSk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVTdHJpbmdSZWZlcmVuY2Uobm9kZS5uYW1lKTsKICAgIHdyaXRlQW5ub3RhdGlvbkxpc3Qobm9kZS5hbm5vdGF0aW9ucyk7CgogICAgZW50ZXJTY29wZSh0eXBlUGFyYW1ldGVyczogbm9kZS50eXBlUGFyYW1ldGVycywgdmFyaWFibGVTY29wZTogdHJ1ZSk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUudHlwZVBhcmFtZXRlcnMpOwogICAgd3JpdGVOb2RlKG5vZGUudHlwZSk7CgogICAgZW50ZXJTY29wZSh0eXBlUGFyYW1ldGVyczogbm9kZS50eXBlUGFyYW1ldGVyc09mRnVuY3Rpb25UeXBlKTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS50eXBlUGFyYW1ldGVyc09mRnVuY3Rpb25UeXBlKTsKICAgIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbkxpc3Qobm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycyk7CiAgICB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KG5vZGUubmFtZWRQYXJhbWV0ZXJzKTsKCiAgICBsZWF2ZVNjb3BlKHR5cGVQYXJhbWV0ZXJzOiBub2RlLnR5cGVQYXJhbWV0ZXJzT2ZGdW5jdGlvblR5cGUpOwogICAgbGVhdmVTY29wZSh0eXBlUGFyYW1ldGVyczogbm9kZS50eXBlUGFyYW1ldGVycywgdmFyaWFibGVTY29wZTogdHJ1ZSk7CiAgICBsZWF2ZVNjb3BlKG1lbWJlclNjb3BlOiB0cnVlKTsKICB9CgogIHZvaWQgd3JpdGVBbm5vdGF0aW9uKEV4cHJlc3Npb24gYW5ub3RhdGlvbikgewogICAgd3JpdGVOb2RlKGFubm90YXRpb24pOwogIH0KCiAgdm9pZCB3cml0ZUFubm90YXRpb25MaXN0KExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMpIHsKICAgIGZpbmFsIGxlbiA9IGFubm90YXRpb25zLmxlbmd0aDsKICAgIHdyaXRlVUludDMwKGxlbik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGZpbmFsIGFubm90YXRpb24gPSBhbm5vdGF0aW9uc1tpXTsKICAgICAgd3JpdGVBbm5vdGF0aW9uKGFubm90YXRpb24pOwogICAgfQogIH0KCiAgaW50IF9lbmNvZGVDbGFzc0ZsYWdzKGludCBmbGFncywgQ2xhc3NMZXZlbCBsZXZlbCkgewogICAgYXNzZXJ0KChmbGFncyAmIENsYXNzLkxldmVsTWFzaykgPT0gMCk7CiAgICBmaW5hbCBsZXZlbEluZGV4ID0gbGV2ZWwuaW5kZXggLSAxOwogICAgYXNzZXJ0KChsZXZlbEluZGV4ICYgQ2xhc3MuTGV2ZWxNYXNrKSA9PSBsZXZlbEluZGV4KTsKICAgIHJldHVybiBmbGFncyB8IGxldmVsSW5kZXg7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2xhc3MoQ2xhc3Mgbm9kZSkgewogICAgY2xhc3NPZmZzZXRzLmFkZChnZXRCdWZmZXJPZmZzZXQoKSk7CgogICAgaWYgKG5vZGUuaXNBbm9ueW1vdXNNaXhpbikgX2N1cnJlbnRseUluTm9uaW1wbGVtZW50YXRpb24gPSB0cnVlOwoKICAgIGludCBmbGFncyA9IF9lbmNvZGVDbGFzc0ZsYWdzKG5vZGUuZmxhZ3MsIG5vZGUubGV2ZWwpOwogICAgaWYgKG5vZGUuY2Fub25pY2FsTmFtZSA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdNaXNzaW5nIGNhbm9uaWNhbCBuYW1lIGZvciAkbm9kZScpOwogICAgfQogICAgd3JpdGVCeXRlKFRhZy5DbGFzcyk7CiAgICB3cml0ZU5vbk51bGxDYW5vbmljYWxOYW1lUmVmZXJlbmNlKGdldENhbm9uaWNhbE5hbWVPZkNsYXNzKG5vZGUpKTsKICAgIHdyaXRlVXJpUmVmZXJlbmNlKG5vZGUuZmlsZVVyaSk7CiAgICB3cml0ZU9mZnNldChub2RlLnN0YXJ0RmlsZU9mZnNldCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlRW5kT2Zmc2V0KTsKCiAgICB3cml0ZUJ5dGUoZmxhZ3MpOwogICAgd3JpdGVTdHJpbmdSZWZlcmVuY2Uobm9kZS5uYW1lID8/ICcnKTsKCiAgICBlbnRlclNjb3BlKG1lbWJlclNjb3BlOiB0cnVlKTsKICAgIHdyaXRlQW5ub3RhdGlvbkxpc3Qobm9kZS5hbm5vdGF0aW9ucyk7CiAgICBsZWF2ZVNjb3BlKG1lbWJlclNjb3BlOiB0cnVlKTsKICAgIGVudGVyU2NvcGUodHlwZVBhcmFtZXRlcnM6IG5vZGUudHlwZVBhcmFtZXRlcnMpOwogICAgd3JpdGVOb2RlTGlzdChub2RlLnR5cGVQYXJhbWV0ZXJzKTsKICAgIHdyaXRlT3B0aW9uYWxOb2RlKG5vZGUuc3VwZXJ0eXBlKTsKICAgIHdyaXRlT3B0aW9uYWxOb2RlKG5vZGUubWl4ZWRJblR5cGUpOwogICAgd3JpdGVOb2RlTGlzdChub2RlLmltcGxlbWVudGVkVHlwZXMpOwogICAgd3JpdGVGaWVsZE5vZGVMaXN0KG5vZGUuZmllbGRzKTsKICAgIHdyaXRlQ29uc3RydWN0b3JOb2RlTGlzdChub2RlLmNvbnN0cnVjdG9ycyk7CiAgICBwcm9jZWR1cmVPZmZzZXRzID0gPGludD5bXTsKICAgIHdyaXRlUHJvY2VkdXJlTm9kZUxpc3Qobm9kZS5wcm9jZWR1cmVzKTsKICAgIHByb2NlZHVyZU9mZnNldHMuYWRkKGdldEJ1ZmZlck9mZnNldCgpKTsKICAgIHdyaXRlUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JOb2RlTGlzdCgKICAgICAgICBub2RlLnJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycyk7CiAgICBsZWF2ZVNjb3BlKHR5cGVQYXJhbWV0ZXJzOiBub2RlLnR5cGVQYXJhbWV0ZXJzKTsKCiAgICBhc3NlcnQocHJvY2VkdXJlT2Zmc2V0cy5sZW5ndGggPiAwKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvY2VkdXJlT2Zmc2V0cy5sZW5ndGg7ICsraSkgewogICAgICBpbnQgb2Zmc2V0ID0gcHJvY2VkdXJlT2Zmc2V0c1tpXTsKICAgICAgd3JpdGVVSW50MzIob2Zmc2V0KTsKICAgIH0KICAgIHdyaXRlVUludDMyKHByb2NlZHVyZU9mZnNldHMubGVuZ3RoIC0gMSk7CiAgICBfY3VycmVudGx5SW5Ob25pbXBsZW1lbnRhdGlvbiA9IGZhbHNlOwogIH0KCiAgc3RhdGljIGZpbmFsIE5hbWUgX2VtcHR5TmFtZSA9IG5ldyBOYW1lKCcnKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbnN0cnVjdG9yKENvbnN0cnVjdG9yIG5vZGUpIHsKICAgIGlmIChub2RlLmNhbm9uaWNhbE5hbWUgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignTWlzc2luZyBjYW5vbmljYWwgbmFtZSBmb3IgJG5vZGUnKTsKICAgIH0KICAgIGVudGVyU2NvcGUobWVtYmVyU2NvcGU6IHRydWUpOwogICAgd3JpdGVCeXRlKFRhZy5Db25zdHJ1Y3Rvcik7CiAgICB3cml0ZU5vbk51bGxDYW5vbmljYWxOYW1lUmVmZXJlbmNlKGdldENhbm9uaWNhbE5hbWVPZk1lbWJlcihub2RlKSk7CiAgICB3cml0ZVVyaVJlZmVyZW5jZShub2RlLmZpbGVVcmkpOwogICAgd3JpdGVPZmZzZXQobm9kZS5zdGFydEZpbGVPZmZzZXQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZUVuZE9mZnNldCk7CgogICAgd3JpdGVCeXRlKG5vZGUuZmxhZ3MpOwogICAgd3JpdGVOYW1lKG5vZGUubmFtZSA/PyBfZW1wdHlOYW1lKTsKCiAgICB3cml0ZUFubm90YXRpb25MaXN0KG5vZGUuYW5ub3RhdGlvbnMpOwogICAgYXNzZXJ0KG5vZGUuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMuaXNFbXB0eSk7CiAgICB3cml0ZUZ1bmN0aW9uTm9kZShub2RlLmZ1bmN0aW9uKTsKICAgIC8vIFBhcmFtZXRlcnMgYXJlIGluIHNjb3BlIGluIHRoZSBpbml0aWFsaXplcnMuCiAgICBfdmFyaWFibGVJbmRleGVyID8/PSBuZXcgVmFyaWFibGVJbmRleGVyKCk7CiAgICBfdmFyaWFibGVJbmRleGVyLnJlc3RvcmVTY29wZShub2RlLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCArCiAgICAgICAgbm9kZS5mdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS5pbml0aWFsaXplcnMpOwoKICAgIGxlYXZlU2NvcGUobWVtYmVyU2NvcGU6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFByb2NlZHVyZShQcm9jZWR1cmUgbm9kZSkgewogICAgcHJvY2VkdXJlT2Zmc2V0cy5hZGQoZ2V0QnVmZmVyT2Zmc2V0KCkpOwoKICAgIGlmIChub2RlLmNhbm9uaWNhbE5hbWUgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignTWlzc2luZyBjYW5vbmljYWwgbmFtZSBmb3IgJG5vZGUnKTsKICAgIH0KCiAgICBmaW5hbCBib29sIGN1cnJlbnRseUluTm9uaW1wbGVtZW50YXRpb25TYXZlZCA9CiAgICAgICAgX2N1cnJlbnRseUluTm9uaW1wbGVtZW50YXRpb247CiAgICBpZiAobm9kZS5pc05vU3VjaE1ldGhvZEZvcndhcmRlciB8fCBub2RlLmlzU3ludGhldGljRm9yd2FyZGVyKSB7CiAgICAgIF9jdXJyZW50bHlJbk5vbmltcGxlbWVudGF0aW9uID0gdHJ1ZTsKICAgIH0KCiAgICBlbnRlclNjb3BlKG1lbWJlclNjb3BlOiB0cnVlKTsKICAgIHdyaXRlQnl0ZShUYWcuUHJvY2VkdXJlKTsKICAgIHdyaXRlTm9uTnVsbENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoZ2V0Q2Fub25pY2FsTmFtZU9mTWVtYmVyKG5vZGUpKTsKICAgIHdyaXRlVXJpUmVmZXJlbmNlKG5vZGUuZmlsZVVyaSk7CiAgICB3cml0ZU9mZnNldChub2RlLnN0YXJ0RmlsZU9mZnNldCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlRW5kT2Zmc2V0KTsKICAgIHdyaXRlQnl0ZShub2RlLmtpbmQuaW5kZXgpOwogICAgd3JpdGVCeXRlKG5vZGUuZmxhZ3MpOwogICAgd3JpdGVOYW1lKG5vZGUubmFtZSA/PyBfZW1wdHlOYW1lKTsKICAgIHdyaXRlQW5ub3RhdGlvbkxpc3Qobm9kZS5hbm5vdGF0aW9ucyk7CiAgICB3cml0ZU51bGxBbGxvd2VkUmVmZXJlbmNlKG5vZGUuZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldFJlZmVyZW5jZSk7CiAgICB3cml0ZU51bGxBbGxvd2VkUmVmZXJlbmNlKG5vZGUuZm9yd2FyZGluZ1N0dWJJbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpOwogICAgd3JpdGVPcHRpb25hbEZ1bmN0aW9uTm9kZShub2RlLmZ1bmN0aW9uKTsKICAgIGxlYXZlU2NvcGUobWVtYmVyU2NvcGU6IHRydWUpOwoKICAgIF9jdXJyZW50bHlJbk5vbmltcGxlbWVudGF0aW9uID0gY3VycmVudGx5SW5Ob25pbXBsZW1lbnRhdGlvblNhdmVkOwogICAgYXNzZXJ0KChub2RlLmZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXQgIT0gbnVsbCkgfHwKICAgICAgICAhKG5vZGUuaXNGb3J3YXJkaW5nU3R1YiAmJiBub2RlLmZ1bmN0aW9uLmJvZHkgIT0gbnVsbCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZpZWxkKEZpZWxkIG5vZGUpIHsKICAgIGlmIChub2RlLmNhbm9uaWNhbE5hbWUgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignTWlzc2luZyBjYW5vbmljYWwgbmFtZSBmb3IgJG5vZGUnKTsKICAgIH0KICAgIGVudGVyU2NvcGUobWVtYmVyU2NvcGU6IHRydWUpOwogICAgd3JpdGVCeXRlKFRhZy5GaWVsZCk7CiAgICB3cml0ZU5vbk51bGxDYW5vbmljYWxOYW1lUmVmZXJlbmNlKGdldENhbm9uaWNhbE5hbWVPZk1lbWJlcihub2RlKSk7CiAgICB3cml0ZVVyaVJlZmVyZW5jZShub2RlLmZpbGVVcmkpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZUVuZE9mZnNldCk7CiAgICB3cml0ZUJ5dGUobm9kZS5mbGFncyk7CiAgICB3cml0ZU5hbWUobm9kZS5uYW1lKTsKICAgIHdyaXRlQW5ub3RhdGlvbkxpc3Qobm9kZS5hbm5vdGF0aW9ucyk7CiAgICB3cml0ZU5vZGUobm9kZS50eXBlKTsKICAgIHdyaXRlT3B0aW9uYWxOb2RlKG5vZGUuaW5pdGlhbGl6ZXIpOwogICAgbGVhdmVTY29wZShtZW1iZXJTY29wZTogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IoUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3Igbm9kZSkgewogICAgaWYgKG5vZGUuY2Fub25pY2FsTmFtZSA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdNaXNzaW5nIGNhbm9uaWNhbCBuYW1lIGZvciAkbm9kZScpOwogICAgfQogICAgd3JpdGVCeXRlKFRhZy5SZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvcik7CiAgICBlbnRlclNjb3BlKAogICAgICAgIHR5cGVQYXJhbWV0ZXJzOiBub2RlLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgIG1lbWJlclNjb3BlOiB0cnVlLAogICAgICAgIHZhcmlhYmxlU2NvcGU6IHRydWUpOwogICAgd3JpdGVOb25OdWxsQ2Fub25pY2FsTmFtZVJlZmVyZW5jZShnZXRDYW5vbmljYWxOYW1lT2ZNZW1iZXIobm9kZSkpOwogICAgd3JpdGVVcmlSZWZlcmVuY2Uobm9kZS5maWxlVXJpKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVFbmRPZmZzZXQpOwogICAgd3JpdGVCeXRlKG5vZGUuZmxhZ3MpOwogICAgd3JpdGVOYW1lKG5vZGUubmFtZSk7CgogICAgd3JpdGVBbm5vdGF0aW9uTGlzdChub2RlLmFubm90YXRpb25zKTsKICAgIHdyaXRlTm9uTnVsbFJlZmVyZW5jZShub2RlLnRhcmdldFJlZmVyZW5jZSk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUudHlwZUFyZ3VtZW50cyk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUudHlwZVBhcmFtZXRlcnMpOwogICAgd3JpdGVVSW50MzAobm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGggKyBub2RlLm5hbWVkUGFyYW1ldGVycy5sZW5ndGgpOwogICAgd3JpdGVVSW50MzAobm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50KTsKICAgIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbkxpc3Qobm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycyk7CiAgICB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KG5vZGUubmFtZWRQYXJhbWV0ZXJzKTsKCiAgICBsZWF2ZVNjb3BlKAogICAgICAgIHR5cGVQYXJhbWV0ZXJzOiBub2RlLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgIG1lbWJlclNjb3BlOiB0cnVlLAogICAgICAgIHZhcmlhYmxlU2NvcGU6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludmFsaWRJbml0aWFsaXplcihJbnZhbGlkSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5JbnZhbGlkSW5pdGlhbGl6ZXIpOwogICAgd3JpdGVCeXRlKG5vZGUuaXNTeW50aGV0aWMgPyAxIDogMCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RmllbGRJbml0aWFsaXplcihGaWVsZEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuRmllbGRJbml0aWFsaXplcik7CiAgICB3cml0ZUJ5dGUobm9kZS5pc1N5bnRoZXRpYyA/IDEgOiAwKTsKICAgIHdyaXRlTm9uTnVsbFJlZmVyZW5jZShub2RlLmZpZWxkUmVmZXJlbmNlKTsKICAgIHdyaXRlTm9kZShub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdXBlckluaXRpYWxpemVyKFN1cGVySW5pdGlhbGl6ZXIgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5TdXBlckluaXRpYWxpemVyKTsKICAgIHdyaXRlQnl0ZShub2RlLmlzU3ludGhldGljID8gMSA6IDApOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9uTnVsbFJlZmVyZW5jZShub2RlLnRhcmdldFJlZmVyZW5jZSk7CiAgICB3cml0ZUFyZ3VtZW50c05vZGUobm9kZS5hcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIoUmVkaXJlY3RpbmdJbml0aWFsaXplciBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLlJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIpOwogICAgd3JpdGVCeXRlKG5vZGUuaXNTeW50aGV0aWMgPyAxIDogMCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb25OdWxsUmVmZXJlbmNlKG5vZGUudGFyZ2V0UmVmZXJlbmNlKTsKICAgIHdyaXRlQXJndW1lbnRzTm9kZShub2RlLmFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TG9jYWxJbml0aWFsaXplcihMb2NhbEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuTG9jYWxJbml0aWFsaXplcik7CiAgICB3cml0ZUJ5dGUobm9kZS5pc1N5bnRoZXRpYyA/IDEgOiAwKTsKICAgIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbihub2RlLnZhcmlhYmxlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRBc3NlcnRJbml0aWFsaXplcihBc3NlcnRJbml0aWFsaXplciBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkFzc2VydEluaXRpYWxpemVyKTsKICAgIHdyaXRlQnl0ZShub2RlLmlzU3ludGhldGljID8gMSA6IDApOwogICAgd3JpdGVOb2RlKG5vZGUuc3RhdGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGdW5jdGlvbk5vZGUoRnVuY3Rpb25Ob2RlIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuRnVuY3Rpb25Ob2RlKTsKICAgIGVudGVyU2NvcGUodHlwZVBhcmFtZXRlcnM6IG5vZGUudHlwZVBhcmFtZXRlcnMsIHZhcmlhYmxlU2NvcGU6IHRydWUpOwogICAgTGFiZWxJbmRleGVyIG9sZExhYmVscyA9IF9sYWJlbEluZGV4ZXI7CiAgICBfbGFiZWxJbmRleGVyID0gbnVsbDsKICAgIFN3aXRjaENhc2VJbmRleGVyIG9sZENhc2VzID0gX3N3aXRjaENhc2VJbmRleGVyOwogICAgX3N3aXRjaENhc2VJbmRleGVyID0gbnVsbDsKICAgIC8vIE5vdGU6IEZ1bmN0aW9uTm9kZSBoYXMgbm8gdGFnLgogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZUVuZE9mZnNldCk7CiAgICB3cml0ZUJ5dGUobm9kZS5hc3luY01hcmtlci5pbmRleCk7CiAgICB3cml0ZUJ5dGUobm9kZS5kYXJ0QXN5bmNNYXJrZXIuaW5kZXgpOwogICAgd3JpdGVOb2RlTGlzdChub2RlLnR5cGVQYXJhbWV0ZXJzKTsKICAgIHdyaXRlVUludDMwKG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoICsgbm9kZS5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKTsKICAgIHdyaXRlVUludDMwKG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCk7CiAgICB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMpOwogICAgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChub2RlLm5hbWVkUGFyYW1ldGVycyk7CiAgICB3cml0ZU5vZGUobm9kZS5yZXR1cm5UeXBlKTsKICAgIHdyaXRlT3B0aW9uYWxOb2RlKG5vZGUuYm9keSk7CiAgICBfbGFiZWxJbmRleGVyID0gb2xkTGFiZWxzOwogICAgX3N3aXRjaENhc2VJbmRleGVyID0gb2xkQ2FzZXM7CiAgICBsZWF2ZVNjb3BlKHR5cGVQYXJhbWV0ZXJzOiBub2RlLnR5cGVQYXJhbWV0ZXJzLCB2YXJpYWJsZVNjb3BlOiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnZhbGlkRXhwcmVzc2lvbihJbnZhbGlkRXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkludmFsaWRFeHByZXNzaW9uKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZVN0cmluZ1JlZmVyZW5jZShub2RlLm1lc3NhZ2UgPz8gJycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFZhcmlhYmxlR2V0KFZhcmlhYmxlR2V0IG5vZGUpIHsKICAgIF92YXJpYWJsZUluZGV4ZXIgPz89IG5ldyBWYXJpYWJsZUluZGV4ZXIoKTsKICAgIGludCBpbmRleCA9IF92YXJpYWJsZUluZGV4ZXJbbm9kZS52YXJpYWJsZV07CiAgICBhc3NlcnQoaW5kZXggIT0gbnVsbCk7CiAgICBpZiAoaW5kZXggJiBUYWcuU3BlY2lhbGl6ZWRQYXlsb2FkTWFzayA9PSBpbmRleCAmJgogICAgICAgIG5vZGUucHJvbW90ZWRUeXBlID09IG51bGwpIHsKICAgICAgd3JpdGVCeXRlKFRhZy5TcGVjaWFsaXplZFZhcmlhYmxlR2V0ICsgaW5kZXgpOwogICAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgICB3cml0ZVVJbnQzMChub2RlLnZhcmlhYmxlLmJpbmFyeU9mZnNldE5vVGFnKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlQnl0ZShUYWcuVmFyaWFibGVHZXQpOwogICAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgICB3cml0ZVVJbnQzMChub2RlLnZhcmlhYmxlLmJpbmFyeU9mZnNldE5vVGFnKTsKICAgICAgd3JpdGVVSW50MzAoaW5kZXgpOwogICAgICB3cml0ZU9wdGlvbmFsTm9kZShub2RlLnByb21vdGVkVHlwZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VmFyaWFibGVTZXQoVmFyaWFibGVTZXQgbm9kZSkgewogICAgX3ZhcmlhYmxlSW5kZXhlciA/Pz0gbmV3IFZhcmlhYmxlSW5kZXhlcigpOwogICAgaW50IGluZGV4ID0gX3ZhcmlhYmxlSW5kZXhlcltub2RlLnZhcmlhYmxlXTsKICAgIGFzc2VydChpbmRleCAhPSBudWxsKTsKICAgIGlmIChpbmRleCAmIFRhZy5TcGVjaWFsaXplZFBheWxvYWRNYXNrID09IGluZGV4KSB7CiAgICAgIHdyaXRlQnl0ZShUYWcuU3BlY2lhbGl6ZWRWYXJpYWJsZVNldCArIGluZGV4KTsKICAgICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgICAgd3JpdGVVSW50MzAobm9kZS52YXJpYWJsZS5iaW5hcnlPZmZzZXROb1RhZyk7CiAgICAgIHdyaXRlTm9kZShub2RlLnZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlQnl0ZShUYWcuVmFyaWFibGVTZXQpOwogICAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgICB3cml0ZVVJbnQzMChub2RlLnZhcmlhYmxlLmJpbmFyeU9mZnNldE5vVGFnKTsKICAgICAgd3JpdGVVSW50MzAoaW5kZXgpOwogICAgICB3cml0ZU5vZGUobm9kZS52YWx1ZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UHJvcGVydHlHZXQoUHJvcGVydHlHZXQgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5Qcm9wZXJ0eUdldCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb2RlKG5vZGUucmVjZWl2ZXIpOwogICAgd3JpdGVOYW1lKG5vZGUubmFtZSk7CiAgICB3cml0ZU51bGxBbGxvd2VkUmVmZXJlbmNlKG5vZGUuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRQcm9wZXJ0eVNldChQcm9wZXJ0eVNldCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLlByb3BlcnR5U2V0KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5vZGUobm9kZS5yZWNlaXZlcik7CiAgICB3cml0ZU5hbWUobm9kZS5uYW1lKTsKICAgIHdyaXRlTm9kZShub2RlLnZhbHVlKTsKICAgIHdyaXRlTnVsbEFsbG93ZWRSZWZlcmVuY2Uobm9kZS5pbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN1cGVyUHJvcGVydHlHZXQoU3VwZXJQcm9wZXJ0eUdldCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLlN1cGVyUHJvcGVydHlHZXQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTmFtZShub2RlLm5hbWUpOwogICAgd3JpdGVOdWxsQWxsb3dlZFJlZmVyZW5jZShub2RlLmludGVyZmFjZVRhcmdldFJlZmVyZW5jZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3VwZXJQcm9wZXJ0eVNldChTdXBlclByb3BlcnR5U2V0IG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuU3VwZXJQcm9wZXJ0eVNldCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOYW1lKG5vZGUubmFtZSk7CiAgICB3cml0ZU5vZGUobm9kZS52YWx1ZSk7CiAgICB3cml0ZU51bGxBbGxvd2VkUmVmZXJlbmNlKG5vZGUuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREaXJlY3RQcm9wZXJ0eUdldChEaXJlY3RQcm9wZXJ0eUdldCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkRpcmVjdFByb3BlcnR5R2V0KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5vZGUobm9kZS5yZWNlaXZlcik7CiAgICB3cml0ZU5vbk51bGxSZWZlcmVuY2Uobm9kZS50YXJnZXRSZWZlcmVuY2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERpcmVjdFByb3BlcnR5U2V0KERpcmVjdFByb3BlcnR5U2V0IG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuRGlyZWN0UHJvcGVydHlTZXQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9kZShub2RlLnJlY2VpdmVyKTsKICAgIHdyaXRlTm9uTnVsbFJlZmVyZW5jZShub2RlLnRhcmdldFJlZmVyZW5jZSk7CiAgICB3cml0ZU5vZGUobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RhdGljR2V0KFN0YXRpY0dldCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLlN0YXRpY0dldCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb25OdWxsUmVmZXJlbmNlKG5vZGUudGFyZ2V0UmVmZXJlbmNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdGF0aWNTZXQoU3RhdGljU2V0IG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuU3RhdGljU2V0KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5vbk51bGxSZWZlcmVuY2Uobm9kZS50YXJnZXRSZWZlcmVuY2UpOwogICAgd3JpdGVOb2RlKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE1ldGhvZEludm9jYXRpb24oTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLk1ldGhvZEludm9jYXRpb24pOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9kZShub2RlLnJlY2VpdmVyKTsKICAgIHdyaXRlTmFtZShub2RlLm5hbWUpOwogICAgd3JpdGVBcmd1bWVudHNOb2RlKG5vZGUuYXJndW1lbnRzKTsKICAgIHdyaXRlTnVsbEFsbG93ZWRSZWZlcmVuY2Uobm9kZS5pbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbihTdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5TdXBlck1ldGhvZEludm9jYXRpb24pOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTmFtZShub2RlLm5hbWUpOwogICAgd3JpdGVBcmd1bWVudHNOb2RlKG5vZGUuYXJndW1lbnRzKTsKICAgIHdyaXRlTnVsbEFsbG93ZWRSZWZlcmVuY2Uobm9kZS5pbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERpcmVjdE1ldGhvZEludm9jYXRpb24oRGlyZWN0TWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkRpcmVjdE1ldGhvZEludm9jYXRpb24pOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9kZShub2RlLnJlY2VpdmVyKTsKICAgIHdyaXRlTm9uTnVsbFJlZmVyZW5jZShub2RlLnRhcmdldFJlZmVyZW5jZSk7CiAgICB3cml0ZUFyZ3VtZW50c05vZGUobm9kZS5hcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN0YXRpY0ludm9jYXRpb24oU3RhdGljSW52b2NhdGlvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUobm9kZS5pc0NvbnN0ID8gVGFnLkNvbnN0U3RhdGljSW52b2NhdGlvbiA6IFRhZy5TdGF0aWNJbnZvY2F0aW9uKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5vbk51bGxSZWZlcmVuY2Uobm9kZS50YXJnZXRSZWZlcmVuY2UpOwogICAgd3JpdGVBcmd1bWVudHNOb2RlKG5vZGUuYXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShub2RlLmlzQ29uc3QKICAgICAgICA/IFRhZy5Db25zdENvbnN0cnVjdG9ySW52b2NhdGlvbgogICAgICAgIDogVGFnLkNvbnN0cnVjdG9ySW52b2NhdGlvbik7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb25OdWxsUmVmZXJlbmNlKG5vZGUudGFyZ2V0UmVmZXJlbmNlKTsKICAgIHdyaXRlQXJndW1lbnRzTm9kZShub2RlLmFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXJndW1lbnRzKEFyZ3VtZW50cyBub2RlKSB7CiAgICB3cml0ZVVJbnQzMChub2RlLnBvc2l0aW9uYWwubGVuZ3RoICsgbm9kZS5uYW1lZC5sZW5ndGgpOwogICAgd3JpdGVOb2RlTGlzdChub2RlLnR5cGVzKTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS5wb3NpdGlvbmFsKTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS5uYW1lZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TmFtZWRFeHByZXNzaW9uKE5hbWVkRXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZVN0cmluZ1JlZmVyZW5jZShub2RlLm5hbWUpOwogICAgd3JpdGVOb2RlKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE5vdChOb3Qgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5Ob3QpOwogICAgd3JpdGVOb2RlKG5vZGUub3BlcmFuZCk7CiAgfQoKICBpbnQgbG9naWNhbE9wZXJhdG9ySW5kZXgoU3RyaW5nIG9wZXJhdG9yKSB7CiAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7CiAgICAgIGNhc2UgJyYmJzoKICAgICAgICByZXR1cm4gMDsKICAgICAgY2FzZSAnfHwnOgogICAgICAgIHJldHVybiAxOwogICAgfQogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ05vdCBhIGxvZ2ljYWwgb3BlcmF0b3I6ICRvcGVyYXRvcicpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExvZ2ljYWxFeHByZXNzaW9uKExvZ2ljYWxFeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuTG9naWNhbEV4cHJlc3Npb24pOwogICAgd3JpdGVOb2RlKG5vZGUubGVmdCk7CiAgICB3cml0ZUJ5dGUobG9naWNhbE9wZXJhdG9ySW5kZXgobm9kZS5vcGVyYXRvcikpOwogICAgd3JpdGVOb2RlKG5vZGUucmlnaHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbmRpdGlvbmFsRXhwcmVzc2lvbihDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5Db25kaXRpb25hbEV4cHJlc3Npb24pOwogICAgd3JpdGVOb2RlKG5vZGUuY29uZGl0aW9uKTsKICAgIHdyaXRlTm9kZShub2RlLnRoZW4pOwogICAgd3JpdGVOb2RlKG5vZGUub3RoZXJ3aXNlKTsKICAgIHdyaXRlT3B0aW9uYWxOb2RlKG5vZGUuc3RhdGljVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RyaW5nQ29uY2F0ZW5hdGlvbihTdHJpbmdDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuU3RyaW5nQ29uY2F0ZW5hdGlvbik7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb2RlTGlzdChub2RlLmV4cHJlc3Npb25zKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaXN0Q29uY2F0ZW5hdGlvbihMaXN0Q29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkxpc3RDb25jYXRlbmF0aW9uKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5vZGUobm9kZS50eXBlQXJndW1lbnQpOwogICAgd3JpdGVOb2RlTGlzdChub2RlLmxpc3RzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTZXRDb25jYXRlbmF0aW9uKFNldENvbmNhdGVuYXRpb24gbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5TZXRDb25jYXRlbmF0aW9uKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5vZGUobm9kZS50eXBlQXJndW1lbnQpOwogICAgd3JpdGVOb2RlTGlzdChub2RlLnNldHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE1hcENvbmNhdGVuYXRpb24oTWFwQ29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLk1hcENvbmNhdGVuYXRpb24pOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9kZShub2RlLmtleVR5cGUpOwogICAgd3JpdGVOb2RlKG5vZGUudmFsdWVUeXBlKTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS5tYXBzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnN0YW5jZUNyZWF0aW9uKEluc3RhbmNlQ3JlYXRpb24gbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5JbnN0YW5jZUNyZWF0aW9uKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5vbk51bGxSZWZlcmVuY2Uobm9kZS5jbGFzc1JlZmVyZW5jZSk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUudHlwZUFyZ3VtZW50cyk7CiAgICB3cml0ZVVJbnQzMChub2RlLmZpZWxkVmFsdWVzLmxlbmd0aCk7CiAgICBub2RlLmZpZWxkVmFsdWVzLmZvckVhY2goKFJlZmVyZW5jZSBmaWVsZFJlZiwgRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgICB3cml0ZU5vbk51bGxSZWZlcmVuY2UoZmllbGRSZWYpOwogICAgICB3cml0ZU5vZGUodmFsdWUpOwogICAgfSk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUuYXNzZXJ0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SXNFeHByZXNzaW9uKElzRXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLklzRXhwcmVzc2lvbik7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb2RlKG5vZGUub3BlcmFuZCk7CiAgICB3cml0ZU5vZGUobm9kZS50eXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRBc0V4cHJlc3Npb24oQXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuQXNFeHByZXNzaW9uKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZUJ5dGUobm9kZS5mbGFncyk7CiAgICB3cml0ZU5vZGUobm9kZS5vcGVyYW5kKTsKICAgIHdyaXRlTm9kZShub2RlLnR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN0cmluZ0xpdGVyYWwoU3RyaW5nTGl0ZXJhbCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLlN0cmluZ0xpdGVyYWwpOwogICAgd3JpdGVTdHJpbmdSZWZlcmVuY2Uobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW50TGl0ZXJhbChJbnRMaXRlcmFsIG5vZGUpIHsKICAgIHdyaXRlSW50ZWdlcihub2RlLnZhbHVlKTsKICB9CgogIHdyaXRlSW50ZWdlcihpbnQgdmFsdWUpIHsKICAgIGludCBiaWFzZWRWYWx1ZSA9IHZhbHVlICsgVGFnLlNwZWNpYWxpemVkSW50TGl0ZXJhbEJpYXM7CiAgICBpZiAoYmlhc2VkVmFsdWUgPj0gMCAmJgogICAgICAgIGJpYXNlZFZhbHVlICYgVGFnLlNwZWNpYWxpemVkUGF5bG9hZE1hc2sgPT0gYmlhc2VkVmFsdWUpIHsKICAgICAgd3JpdGVCeXRlKFRhZy5TcGVjaWFsaXplZEludExpdGVyYWwgKyBiaWFzZWRWYWx1ZSk7CiAgICB9IGVsc2UgaWYgKHZhbHVlLmFicygpID4+IDMwID09IDApIHsKICAgICAgaWYgKHZhbHVlIDwgMCkgewogICAgICAgIHdyaXRlQnl0ZShUYWcuTmVnYXRpdmVJbnRMaXRlcmFsKTsKICAgICAgICB3cml0ZVVJbnQzMCgtdmFsdWUpOwogICAgICB9IGVsc2UgewogICAgICAgIHdyaXRlQnl0ZShUYWcuUG9zaXRpdmVJbnRMaXRlcmFsKTsKICAgICAgICB3cml0ZVVJbnQzMCh2YWx1ZSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIFRPRE86IFBpY2sgYSBiZXR0ZXIgZm9ybWF0IGZvciBiaWcgaW50IGxpdGVyYWxzLgogICAgICB3cml0ZUJ5dGUoVGFnLkJpZ0ludExpdGVyYWwpOwogICAgICB3cml0ZVN0cmluZ1JlZmVyZW5jZSgnJHZhbHVlJyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RG91YmxlTGl0ZXJhbChEb3VibGVMaXRlcmFsIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuRG91YmxlTGl0ZXJhbCk7CiAgICB3cml0ZURvdWJsZShub2RlLnZhbHVlKTsKICB9CgogIHdyaXRlRG91YmxlKGRvdWJsZSB2YWx1ZSkgewogICAgX3NpbmsuYWRkRG91YmxlKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCb29sTGl0ZXJhbChCb29sTGl0ZXJhbCBub2RlKSB7CiAgICB3cml0ZUJ5dGUobm9kZS52YWx1ZSA/IFRhZy5UcnVlTGl0ZXJhbCA6IFRhZy5GYWxzZUxpdGVyYWwpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE51bGxMaXRlcmFsKE51bGxMaXRlcmFsIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuTnVsbExpdGVyYWwpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN5bWJvbExpdGVyYWwoU3ltYm9sTGl0ZXJhbCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLlN5bWJvbExpdGVyYWwpOwogICAgd3JpdGVTdHJpbmdSZWZlcmVuY2Uobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZUxpdGVyYWwoVHlwZUxpdGVyYWwgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5UeXBlTGl0ZXJhbCk7CiAgICB3cml0ZU5vZGUobm9kZS50eXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUaGlzRXhwcmVzc2lvbihUaGlzRXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLlRoaXNFeHByZXNzaW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRSZXRocm93KFJldGhyb3cgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5SZXRocm93KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VGhyb3coVGhyb3cgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5UaHJvdyk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb2RlKG5vZGUuZXhwcmVzc2lvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGlzdExpdGVyYWwoTGlzdExpdGVyYWwgbm9kZSkgewogICAgd3JpdGVCeXRlKG5vZGUuaXNDb25zdCA/IFRhZy5Db25zdExpc3RMaXRlcmFsIDogVGFnLkxpc3RMaXRlcmFsKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5vZGUobm9kZS50eXBlQXJndW1lbnQpOwogICAgd3JpdGVOb2RlTGlzdChub2RlLmV4cHJlc3Npb25zKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTZXRMaXRlcmFsKFNldExpdGVyYWwgbm9kZSkgewogICAgd3JpdGVCeXRlKG5vZGUuaXNDb25zdCA/IFRhZy5Db25zdFNldExpdGVyYWwgOiBUYWcuU2V0TGl0ZXJhbCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb2RlKG5vZGUudHlwZUFyZ3VtZW50KTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS5leHByZXNzaW9ucyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TWFwTGl0ZXJhbChNYXBMaXRlcmFsIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShub2RlLmlzQ29uc3QgPyBUYWcuQ29uc3RNYXBMaXRlcmFsIDogVGFnLk1hcExpdGVyYWwpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9kZShub2RlLmtleVR5cGUpOwogICAgd3JpdGVOb2RlKG5vZGUudmFsdWVUeXBlKTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS5lbnRyaWVzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRNYXBFbnRyeShNYXBFbnRyeSBub2RlKSB7CiAgICAvLyBOb3RlOiB0aGVyZSBpcyBubyB0YWcgb24gTWFwRW50cnkKICAgIHdyaXRlTm9kZShub2RlLmtleSk7CiAgICB3cml0ZU5vZGUobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXdhaXRFeHByZXNzaW9uKEF3YWl0RXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkF3YWl0RXhwcmVzc2lvbik7CiAgICB3cml0ZU5vZGUobm9kZS5vcGVyYW5kKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oRnVuY3Rpb25FeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuRnVuY3Rpb25FeHByZXNzaW9uKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZUZ1bmN0aW9uTm9kZShub2RlLmZ1bmN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMZXQoTGV0IG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuTGV0KTsKICAgIF92YXJpYWJsZUluZGV4ZXIgPz89IG5ldyBWYXJpYWJsZUluZGV4ZXIoKTsKICAgIF92YXJpYWJsZUluZGV4ZXIucHVzaFNjb3BlKCk7CiAgICB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb24obm9kZS52YXJpYWJsZSk7CiAgICB3cml0ZU5vZGUobm9kZS5ib2R5KTsKICAgIF92YXJpYWJsZUluZGV4ZXIucG9wU2NvcGUoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCbG9ja0V4cHJlc3Npb24oQmxvY2tFeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuQmxvY2tFeHByZXNzaW9uKTsKICAgIF92YXJpYWJsZUluZGV4ZXIgPz89IG5ldyBWYXJpYWJsZUluZGV4ZXIoKTsKICAgIF92YXJpYWJsZUluZGV4ZXIucHVzaFNjb3BlKCk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUuYm9keS5zdGF0ZW1lbnRzKTsKICAgIHdyaXRlTm9kZShub2RlLnZhbHVlKTsKICAgIF92YXJpYWJsZUluZGV4ZXIucG9wU2NvcGUoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnN0YW50aWF0aW9uKEluc3RhbnRpYXRpb24gbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5JbnN0YW50aWF0aW9uKTsKICAgIHdyaXRlTm9kZShub2RlLmV4cHJlc3Npb24pOwogICAgd3JpdGVOb2RlTGlzdChub2RlLnR5cGVBcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExvYWRMaWJyYXJ5KExvYWRMaWJyYXJ5IG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuTG9hZExpYnJhcnkpOwogICAgd3JpdGVMaWJyYXJ5RGVwZW5kZW5jeVJlZmVyZW5jZShub2RlLmltcG9ydCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2hlY2tMaWJyYXJ5SXNMb2FkZWQoQ2hlY2tMaWJyYXJ5SXNMb2FkZWQgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5DaGVja0xpYnJhcnlJc0xvYWRlZCk7CiAgICB3cml0ZUxpYnJhcnlEZXBlbmRlbmN5UmVmZXJlbmNlKG5vZGUuaW1wb3J0KTsKICB9CgogIHdyaXRlU3RhdGVtZW50T3JFbXB0eShTdGF0ZW1lbnQgbm9kZSkgewogICAgaWYgKG5vZGUgPT0gbnVsbCkgewogICAgICB3cml0ZUJ5dGUoVGFnLkVtcHR5U3RhdGVtZW50KTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlTm9kZShub2RlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5FeHByZXNzaW9uU3RhdGVtZW50KTsKICAgIHdyaXRlTm9kZShub2RlLmV4cHJlc3Npb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJsb2NrKEJsb2NrIG5vZGUpIHsKICAgIF92YXJpYWJsZUluZGV4ZXIgPz89IG5ldyBWYXJpYWJsZUluZGV4ZXIoKTsKICAgIF92YXJpYWJsZUluZGV4ZXIucHVzaFNjb3BlKCk7CiAgICB3cml0ZUJ5dGUoVGFnLkJsb2NrKTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS5zdGF0ZW1lbnRzKTsKICAgIF92YXJpYWJsZUluZGV4ZXIucG9wU2NvcGUoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRBc3NlcnRCbG9jayhBc3NlcnRCbG9jayBub2RlKSB7CiAgICBfdmFyaWFibGVJbmRleGVyID8/PSBuZXcgVmFyaWFibGVJbmRleGVyKCk7CiAgICBfdmFyaWFibGVJbmRleGVyLnB1c2hTY29wZSgpOwogICAgd3JpdGVCeXRlKFRhZy5Bc3NlcnRCbG9jayk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUuc3RhdGVtZW50cyk7CiAgICBfdmFyaWFibGVJbmRleGVyLnBvcFNjb3BlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RW1wdHlTdGF0ZW1lbnQoRW1wdHlTdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5FbXB0eVN0YXRlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXNzZXJ0U3RhdGVtZW50KEFzc2VydFN0YXRlbWVudCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkFzc2VydFN0YXRlbWVudCk7CiAgICB3cml0ZU5vZGUobm9kZS5jb25kaXRpb24pOwogICAgd3JpdGVPZmZzZXQobm9kZS5jb25kaXRpb25TdGFydE9mZnNldCk7CiAgICB3cml0ZU9mZnNldChub2RlLmNvbmRpdGlvbkVuZE9mZnNldCk7CiAgICB3cml0ZU9wdGlvbmFsTm9kZShub2RlLm1lc3NhZ2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExhYmVsZWRTdGF0ZW1lbnQoTGFiZWxlZFN0YXRlbWVudCBub2RlKSB7CiAgICBpZiAoX2xhYmVsSW5kZXhlciA9PSBudWxsKSB7CiAgICAgIF9sYWJlbEluZGV4ZXIgPSBuZXcgTGFiZWxJbmRleGVyKCk7CiAgICB9CiAgICBfbGFiZWxJbmRleGVyLmVudGVyKG5vZGUpOwogICAgd3JpdGVCeXRlKFRhZy5MYWJlbGVkU3RhdGVtZW50KTsKICAgIHdyaXRlTm9kZShub2RlLmJvZHkpOwogICAgX2xhYmVsSW5kZXhlci5leGl0KCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29uc3RhbnRFeHByZXNzaW9uKENvbnN0YW50RXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkNvbnN0YW50RXhwcmVzc2lvbik7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVEYXJ0VHlwZShub2RlLnR5cGUpOwogICAgd3JpdGVDb25zdGFudFJlZmVyZW5jZShub2RlLmNvbnN0YW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCcmVha1N0YXRlbWVudChCcmVha1N0YXRlbWVudCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkJyZWFrU3RhdGVtZW50KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZVVJbnQzMChfbGFiZWxJbmRleGVyW25vZGUudGFyZ2V0XSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0V2hpbGVTdGF0ZW1lbnQoV2hpbGVTdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5XaGlsZVN0YXRlbWVudCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb2RlKG5vZGUuY29uZGl0aW9uKTsKICAgIHdyaXRlTm9kZShub2RlLmJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERvU3RhdGVtZW50KERvU3RhdGVtZW50IG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuRG9TdGF0ZW1lbnQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9kZShub2RlLmJvZHkpOwogICAgd3JpdGVOb2RlKG5vZGUuY29uZGl0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGb3JTdGF0ZW1lbnQoRm9yU3RhdGVtZW50IG5vZGUpIHsKICAgIF92YXJpYWJsZUluZGV4ZXIgPz89IG5ldyBWYXJpYWJsZUluZGV4ZXIoKTsKICAgIF92YXJpYWJsZUluZGV4ZXIucHVzaFNjb3BlKCk7CiAgICB3cml0ZUJ5dGUoVGFnLkZvclN0YXRlbWVudCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChub2RlLnZhcmlhYmxlcyk7CiAgICB3cml0ZU9wdGlvbmFsTm9kZShub2RlLmNvbmRpdGlvbik7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUudXBkYXRlcyk7CiAgICB3cml0ZU5vZGUobm9kZS5ib2R5KTsKICAgIF92YXJpYWJsZUluZGV4ZXIucG9wU2NvcGUoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGb3JJblN0YXRlbWVudChGb3JJblN0YXRlbWVudCBub2RlKSB7CiAgICBfdmFyaWFibGVJbmRleGVyID8/PSBuZXcgVmFyaWFibGVJbmRleGVyKCk7CiAgICBfdmFyaWFibGVJbmRleGVyLnB1c2hTY29wZSgpOwogICAgd3JpdGVCeXRlKG5vZGUuaXNBc3luYyA/IFRhZy5Bc3luY0ZvckluU3RhdGVtZW50IDogVGFnLkZvckluU3RhdGVtZW50KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU9mZnNldChub2RlLmJvZHlPZmZzZXQpOwogICAgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUudmFyaWFibGUpOwogICAgd3JpdGVOb2RlKG5vZGUuaXRlcmFibGUpOwogICAgd3JpdGVOb2RlKG5vZGUuYm9keSk7CiAgICBfdmFyaWFibGVJbmRleGVyLnBvcFNjb3BlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3dpdGNoU3RhdGVtZW50KFN3aXRjaFN0YXRlbWVudCBub2RlKSB7CiAgICBpZiAoX3N3aXRjaENhc2VJbmRleGVyID09IG51bGwpIHsKICAgICAgX3N3aXRjaENhc2VJbmRleGVyID0gbmV3IFN3aXRjaENhc2VJbmRleGVyKCk7CiAgICB9CiAgICBfc3dpdGNoQ2FzZUluZGV4ZXIuZW50ZXIobm9kZSk7CiAgICB3cml0ZUJ5dGUoVGFnLlN3aXRjaFN0YXRlbWVudCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb2RlKG5vZGUuZXhwcmVzc2lvbik7CiAgICB3cml0ZVN3aXRjaENhc2VOb2RlTGlzdChub2RlLmNhc2VzKTsKICAgIF9zd2l0Y2hDYXNlSW5kZXhlci5leGl0KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN3aXRjaENhc2UoU3dpdGNoQ2FzZSBub2RlKSB7CiAgICAvLyBOb3RlOiB0aGVyZSBpcyBubyB0YWcgb24gU3dpdGNoQ2FzZS4KICAgIGludCBsZW5ndGggPSBub2RlLmV4cHJlc3Npb25zLmxlbmd0aDsKICAgIHdyaXRlVUludDMwKGxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIHdyaXRlT2Zmc2V0KG5vZGUuZXhwcmVzc2lvbk9mZnNldHNbaV0pOwogICAgICB3cml0ZU5vZGUobm9kZS5leHByZXNzaW9uc1tpXSk7CiAgICB9CiAgICB3cml0ZUJ5dGUobm9kZS5pc0RlZmF1bHQgPyAxIDogMCk7CiAgICB3cml0ZU5vZGUobm9kZS5ib2R5KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDb250aW51ZVN3aXRjaFN0YXRlbWVudChDb250aW51ZVN3aXRjaFN0YXRlbWVudCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkNvbnRpbnVlU3dpdGNoU3RhdGVtZW50KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZVVJbnQzMChfc3dpdGNoQ2FzZUluZGV4ZXJbbm9kZS50YXJnZXRdKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJZlN0YXRlbWVudChJZlN0YXRlbWVudCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLklmU3RhdGVtZW50KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5vZGUobm9kZS5jb25kaXRpb24pOwogICAgd3JpdGVOb2RlKG5vZGUudGhlbik7CiAgICB3cml0ZVN0YXRlbWVudE9yRW1wdHkobm9kZS5vdGhlcndpc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFJldHVyblN0YXRlbWVudChSZXR1cm5TdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5SZXR1cm5TdGF0ZW1lbnQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlT3B0aW9uYWxOb2RlKG5vZGUuZXhwcmVzc2lvbik7CiAgfQoKICBpbnQgX2VuY29kZVRyeUNhdGNoRmxhZ3MoYm9vbCBuZWVkc1N0YWNrVHJhY2UsIGJvb2wgaXNTeW50aGV0aWMpIHsKICAgIHJldHVybiAobmVlZHNTdGFja1RyYWNlID8gMSA6IDApIHwgKGlzU3ludGhldGljID8gMiA6IDApOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFRyeUNhdGNoKFRyeUNhdGNoIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuVHJ5Q2F0Y2gpOwogICAgd3JpdGVOb2RlKG5vZGUuYm9keSk7CiAgICBib29sIG5lZWRzU3RhY2tUcmFjZSA9IG5vZGUuY2F0Y2hlcy5hbnkoKENhdGNoIGMpID0+IGMuc3RhY2tUcmFjZSAhPSBudWxsKTsKICAgIHdyaXRlQnl0ZShfZW5jb2RlVHJ5Q2F0Y2hGbGFncyhuZWVkc1N0YWNrVHJhY2UsIG5vZGUuaXNTeW50aGV0aWMpKTsKICAgIHdyaXRlQ2F0Y2hOb2RlTGlzdChub2RlLmNhdGNoZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENhdGNoKENhdGNoIG5vZGUpIHsKICAgIC8vIE5vdGU6IHRoZXJlIGlzIG5vIHRhZyBvbiBDYXRjaC4KICAgIF92YXJpYWJsZUluZGV4ZXIgPz89IG5ldyBWYXJpYWJsZUluZGV4ZXIoKTsKICAgIF92YXJpYWJsZUluZGV4ZXIucHVzaFNjb3BlKCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb2RlKG5vZGUuZ3VhcmQpOwogICAgd3JpdGVPcHRpb25hbFZhcmlhYmxlRGVjbGFyYXRpb24obm9kZS5leGNlcHRpb24pOwogICAgd3JpdGVPcHRpb25hbFZhcmlhYmxlRGVjbGFyYXRpb24obm9kZS5zdGFja1RyYWNlKTsKICAgIHdyaXRlTm9kZShub2RlLmJvZHkpOwogICAgX3ZhcmlhYmxlSW5kZXhlci5wb3BTY29wZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFRyeUZpbmFsbHkoVHJ5RmluYWxseSBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLlRyeUZpbmFsbHkpOwogICAgd3JpdGVOb2RlKG5vZGUuYm9keSk7CiAgICB3cml0ZU5vZGUobm9kZS5maW5hbGl6ZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFlpZWxkU3RhdGVtZW50KFlpZWxkU3RhdGVtZW50IG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuWWllbGRTdGF0ZW1lbnQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlQnl0ZShub2RlLmZsYWdzKTsKICAgIHdyaXRlTm9kZShub2RlLmV4cHJlc3Npb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLlZhcmlhYmxlRGVjbGFyYXRpb24pOwogICAgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUpOwogIH0KCiAgdm9pZCB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICBpZiAoX21ldGFkYXRhU3Vic2VjdGlvbnMgIT0gbnVsbCkgewogICAgICBfd3JpdGVOb2RlTWV0YWRhdGEobm9kZSk7CiAgICB9CiAgICBub2RlLmJpbmFyeU9mZnNldE5vVGFnID0gZ2V0QnVmZmVyT2Zmc2V0KCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlRXF1YWxzT2Zmc2V0KTsKICAgIHdyaXRlQW5ub3RhdGlvbkxpc3Qobm9kZS5hbm5vdGF0aW9ucyk7CiAgICB3cml0ZUJ5dGUobm9kZS5mbGFncyk7CiAgICB3cml0ZVN0cmluZ1JlZmVyZW5jZShub2RlLm5hbWUgPz8gJycpOwogICAgd3JpdGVOb2RlKG5vZGUudHlwZSk7CiAgICB3cml0ZU9wdGlvbmFsTm9kZShub2RlLmluaXRpYWxpemVyKTsKICAgIC8vIERlY2xhcmUgdGhlIHZhcmlhYmxlIGFmdGVyIGl0cyBpbml0aWFsaXplci4gSXQgaXMgbm90IGluIHNjb3BlIGluIGl0cwogICAgLy8gb3duIGluaXRpYWxpemVyLgogICAgX3ZhcmlhYmxlSW5kZXhlciA/Pz0gbmV3IFZhcmlhYmxlSW5kZXhlcigpOwogICAgX3ZhcmlhYmxlSW5kZXhlci5kZWNsYXJlKG5vZGUpOwogIH0KCiAgdm9pZCB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gbm9kZXMpIHsKICAgIHdyaXRlTGlzdChub2Rlcywgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uKTsKICB9CgogIHZvaWQgd3JpdGVPcHRpb25hbFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICBpZiAobm9kZSA9PSBudWxsKSB7CiAgICAgIHdyaXRlQnl0ZShUYWcuTm90aGluZyk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUJ5dGUoVGFnLlNvbWV0aGluZyk7CiAgICAgIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbihub2RlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKEZ1bmN0aW9uRGVjbGFyYXRpb24gbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5GdW5jdGlvbkRlY2xhcmF0aW9uKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb24obm9kZS52YXJpYWJsZSk7CiAgICB3cml0ZUZ1bmN0aW9uTm9kZShub2RlLmZ1bmN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCb3R0b21UeXBlKEJvdHRvbVR5cGUgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5Cb3R0b21UeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnZhbGlkVHlwZShJbnZhbGlkVHlwZSBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkludmFsaWRUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREeW5hbWljVHlwZShEeW5hbWljVHlwZSBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkR5bmFtaWNUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLlZvaWRUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgbm9kZSkgewogICAgaWYgKG5vZGUudHlwZUFyZ3VtZW50cy5pc0VtcHR5KSB7CiAgICAgIHdyaXRlQnl0ZShUYWcuU2ltcGxlSW50ZXJmYWNlVHlwZSk7CiAgICAgIHdyaXRlTm9uTnVsbFJlZmVyZW5jZShub2RlLmNsYXNzTmFtZSk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUJ5dGUoVGFnLkludGVyZmFjZVR5cGUpOwogICAgICB3cml0ZU5vbk51bGxSZWZlcmVuY2Uobm9kZS5jbGFzc05hbWUpOwogICAgICB3cml0ZU5vZGVMaXN0KG5vZGUudHlwZUFyZ3VtZW50cyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3VwZXJ0eXBlKFN1cGVydHlwZSBub2RlKSB7CiAgICBpZiAobm9kZS50eXBlQXJndW1lbnRzLmlzRW1wdHkpIHsKICAgICAgd3JpdGVCeXRlKFRhZy5TaW1wbGVJbnRlcmZhY2VUeXBlKTsKICAgICAgd3JpdGVOb25OdWxsUmVmZXJlbmNlKG5vZGUuY2xhc3NOYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlQnl0ZShUYWcuSW50ZXJmYWNlVHlwZSk7CiAgICAgIHdyaXRlTm9uTnVsbFJlZmVyZW5jZShub2RlLmNsYXNzTmFtZSk7CiAgICAgIHdyaXRlTm9kZUxpc3Qobm9kZS50eXBlQXJndW1lbnRzKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIG5vZGUpIHsKICAgIGlmIChub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPT0gbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGggJiYKICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkgJiYKICAgICAgICBub2RlLm5hbWVkUGFyYW1ldGVycy5pc0VtcHR5ICYmCiAgICAgICAgbm9kZS50eXBlZGVmVHlwZSA9PSBudWxsKSB7CiAgICAgIHdyaXRlQnl0ZShUYWcuU2ltcGxlRnVuY3Rpb25UeXBlKTsKICAgICAgd3JpdGVOb2RlTGlzdChub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKTsKICAgICAgd3JpdGVOb2RlKG5vZGUucmV0dXJuVHlwZSk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUJ5dGUoVGFnLkZ1bmN0aW9uVHlwZSk7CiAgICAgIGVudGVyU2NvcGUodHlwZVBhcmFtZXRlcnM6IG5vZGUudHlwZVBhcmFtZXRlcnMpOwogICAgICB3cml0ZU5vZGVMaXN0KG5vZGUudHlwZVBhcmFtZXRlcnMpOwogICAgICB3cml0ZVVJbnQzMChub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpOwogICAgICB3cml0ZVVJbnQzMCgKICAgICAgICAgIG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoICsgbm9kZS5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKTsKICAgICAgd3JpdGVOb2RlTGlzdChub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKTsKICAgICAgd3JpdGVOb2RlTGlzdChub2RlLm5hbWVkUGFyYW1ldGVycyk7CiAgICAgIHdyaXRlT3B0aW9uYWxOb2RlKG5vZGUudHlwZWRlZlR5cGUpOwogICAgICB3cml0ZU5vZGUobm9kZS5yZXR1cm5UeXBlKTsKICAgICAgbGVhdmVTY29wZSh0eXBlUGFyYW1ldGVyczogbm9kZS50eXBlUGFyYW1ldGVycyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TmFtZWRUeXBlKE5hbWVkVHlwZSBub2RlKSB7CiAgICB3cml0ZVN0cmluZ1JlZmVyZW5jZShub2RlLm5hbWUpOwogICAgd3JpdGVOb2RlKG5vZGUudHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZVBhcmFtZXRlclR5cGUoVHlwZVBhcmFtZXRlclR5cGUgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5UeXBlUGFyYW1ldGVyVHlwZSk7CiAgICB3cml0ZVVJbnQzMChfdHlwZVBhcmFtZXRlckluZGV4ZXJbbm9kZS5wYXJhbWV0ZXJdKTsKICAgIHdyaXRlT3B0aW9uYWxOb2RlKG5vZGUucHJvbW90ZWRCb3VuZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5UeXBlZGVmVHlwZSk7CiAgICB3cml0ZU51bGxBbGxvd2VkUmVmZXJlbmNlKG5vZGUudHlwZWRlZlJlZmVyZW5jZSk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUudHlwZUFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZVBhcmFtZXRlcihUeXBlUGFyYW1ldGVyIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShub2RlLmZsYWdzKTsKICAgIHdyaXRlQW5ub3RhdGlvbkxpc3Qobm9kZS5hbm5vdGF0aW9ucyk7CiAgICB3cml0ZVN0cmluZ1JlZmVyZW5jZShub2RlLm5hbWUgPz8gJycpOwogICAgd3JpdGVOb2RlKG5vZGUuYm91bmQpOwogICAgd3JpdGVPcHRpb25hbE5vZGUobm9kZS5kZWZhdWx0VHlwZSk7CiAgfQoKICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLy8gVGhlc2UgYXJlIG5vZGVzIHRoYXQgYXJlIG5ldmVyIHNlcmlhbGl6ZWQgZGlyZWN0bHkuICBSZWFjaGluZyBvbmUKICAvLyBkdXJpbmcgc2VyaWFsaXphdGlvbiBpcyBhbiBlcnJvci4KICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHROb2RlKE5vZGUgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBOb2RlcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBkZWZhdWx0Q29uc3RhbnQoQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBDb25zdGFudHMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZGVmYXVsdEJhc2ljTGl0ZXJhbChCYXNpY0xpdGVyYWwgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBCYXNpY0xpdGVyYWxzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShDb25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBnZW5lcmljIENvbnN0YW50IHJlZmVyZW5jZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZGVmYXVsdERhcnRUeXBlKERhcnRUeXBlIG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIGdlbmVyaWMgRGFydFR5cGVzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRFeHByZXNzaW9uKEV4cHJlc3Npb24gbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBFeHByZXNzaW9ucycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBkZWZhdWx0SW5pdGlhbGl6ZXIoSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBJbml0aWFsaXplcnMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZGVmYXVsdE1lbWJlcihNZW1iZXIgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBNZW1iZXJzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRNZW1iZXJSZWZlcmVuY2UoTWVtYmVyIG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIGdlbmVyaWMgTWVtYmVyIHJlZmVyZW5jZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZGVmYXVsdFN0YXRlbWVudChTdGF0ZW1lbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBTdGF0ZW1lbnRzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRUcmVlTm9kZShUcmVlTm9kZSBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBnZW5lcmljIFRyZWVOb2RlcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJvb2xDb25zdGFudChCb29sQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgQm9vbENvbnN0YW50cycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJvb2xDb25zdGFudFJlZmVyZW5jZShCb29sQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgQm9vbENvbnN0YW50IHJlZmVyZW5jZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDbGFzc1JlZmVyZW5jZShDbGFzcyBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBDbGFzcyByZWZlcmVuY2VzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29uc3RydWN0b3JSZWZlcmVuY2UoQ29uc3RydWN0b3Igbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgQ29uc3RydWN0b3IgcmVmZXJlbmNlcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERvdWJsZUNvbnN0YW50KERvdWJsZUNvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIERvdWJsZUNvbnN0YW50cycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERvdWJsZUNvbnN0YW50UmVmZXJlbmNlKERvdWJsZUNvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIERvdWJsZUNvbnN0YW50IHJlZmVyZW5jZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGaWVsZFJlZmVyZW5jZShGaWVsZCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBGaWVsZCByZWZlcmVuY2VzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW5zdGFuY2VDb25zdGFudChJbnN0YW5jZUNvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIEluc3RhbmNlQ29uc3RhbnRzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW5zdGFuY2VDb25zdGFudFJlZmVyZW5jZShJbnN0YW5jZUNvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIEluc3RhbmNlQ29uc3RhbnQgcmVmZXJlbmNlcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludENvbnN0YW50KEludENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIEludENvbnN0YW50cycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludENvbnN0YW50UmVmZXJlbmNlKEludENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIEludENvbnN0YW50IHJlZmVyZW5jZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaWJyYXJ5RGVwZW5kZW5jeShMaWJyYXJ5RGVwZW5kZW5jeSBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBMaWJyYXJ5RGVwZW5kZW5jeXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaWJyYXJ5UGFydChMaWJyYXJ5UGFydCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBMaWJyYXJ5UGFydHMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaXN0Q29uc3RhbnQoTGlzdENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIExpc3RDb25zdGFudHMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaXN0Q29uc3RhbnRSZWZlcmVuY2UoTGlzdENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIExpc3RDb25zdGFudCByZWZlcmVuY2VzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U2V0Q29uc3RhbnQoU2V0Q29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgU2V0Q29uc3RhbnRzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U2V0Q29uc3RhbnRSZWZlcmVuY2UoU2V0Q29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgU2V0Q29uc3RhbnQgcmVmZXJlbmNlcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE1hcENvbnN0YW50KE1hcENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIE1hcENvbnN0YW50cycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE1hcENvbnN0YW50UmVmZXJlbmNlKE1hcENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIE1hcENvbnN0YW50IHJlZmVyZW5jZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXROYW1lKE5hbWUgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgTmFtZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXROdWxsQ29uc3RhbnQoTnVsbENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIE51bGxDb25zdGFudHMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXROdWxsQ29uc3RhbnRSZWZlcmVuY2UoTnVsbENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIE51bGxDb25zdGFudCByZWZlcmVuY2VzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UHJvY2VkdXJlUmVmZXJlbmNlKFByb2NlZHVyZSBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBQcm9jZWR1cmUgcmVmZXJlbmNlcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbXBvbmVudChDb21wb25lbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgQ29tcG9uZW50cycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yUmVmZXJlbmNlKAogICAgICBSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAnc2VyaWFsaXphdGlvbiBvZiBSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciByZWZlcmVuY2VzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RyaW5nQ29uc3RhbnQoU3RyaW5nQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgU3RyaW5nQ29uc3RhbnRzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RyaW5nQ29uc3RhbnRSZWZlcmVuY2UoU3RyaW5nQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgU3RyaW5nQ29uc3RhbnQgcmVmZXJlbmNlcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN5bWJvbENvbnN0YW50KFN5bWJvbENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIFN5bWJvbENvbnN0YW50cycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN5bWJvbENvbnN0YW50UmVmZXJlbmNlKFN5bWJvbENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIFN5bWJvbENvbnN0YW50IHJlZmVyZW5jZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50KFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgJ3NlcmlhbGl6YXRpb24gb2YgUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudHMgJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudFJlZmVyZW5jZSgKICAgICAgUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAnc2VyaWFsaXphdGlvbiBvZiBQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50IHJlZmVyZW5jZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUZWFyT2ZmQ29uc3RhbnQoVGVhck9mZkNvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIFRlYXJPZmZDb25zdGFudHMgJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VGVhck9mZkNvbnN0YW50UmVmZXJlbmNlKFRlYXJPZmZDb25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBUZWFyT2ZmQ29uc3RhbnQgcmVmZXJlbmNlcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVMaXRlcmFsQ29uc3RhbnQoVHlwZUxpdGVyYWxDb25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBUeXBlTGl0ZXJhbENvbnN0YW50cycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVMaXRlcmFsQ29uc3RhbnRSZWZlcmVuY2UoVHlwZUxpdGVyYWxDb25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAnc2VyaWFsaXphdGlvbiBvZiBUeXBlTGl0ZXJhbENvbnN0YW50IHJlZmVyZW5jZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlZGVmUmVmZXJlbmNlKFR5cGVkZWYgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgVHlwZWRlZiByZWZlcmVuY2VzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VW5ldmFsdWF0ZWRDb25zdGFudChVbmV2YWx1YXRlZENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIFVuZXZhbHVhdGVkQ29uc3RhbnRzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VW5ldmFsdWF0ZWRDb25zdGFudFJlZmVyZW5jZShVbmV2YWx1YXRlZENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICdzZXJpYWxpemF0aW9uIG9mIFVuZXZhbHVhdGVkQ29uc3RhbnQgcmVmZXJlbmNlcycpOwogIH0KfQoKdHlwZWRlZiBib29sIExpYnJhcnlGaWx0ZXIoTGlicmFyeSBfKTsKCmNsYXNzIFZhcmlhYmxlSW5kZXhlciB7CiAgTWFwPFZhcmlhYmxlRGVjbGFyYXRpb24sIGludD4gaW5kZXg7CiAgTGlzdDxpbnQ+IHNjb3BlczsKICBpbnQgc3RhY2tIZWlnaHQgPSAwOwoKICB2b2lkIGRlY2xhcmUoVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICBpbmRleCA/Pz0gPFZhcmlhYmxlRGVjbGFyYXRpb24sIGludD57fTsKICAgIGluZGV4W25vZGVdID0gc3RhY2tIZWlnaHQrKzsKICB9CgogIHZvaWQgcHVzaFNjb3BlKCkgewogICAgc2NvcGVzID8/PSBuZXcgTGlzdDxpbnQ+KCk7CiAgICBzY29wZXMuYWRkKHN0YWNrSGVpZ2h0KTsKICB9CgogIHZvaWQgcG9wU2NvcGUoKSB7CiAgICBzdGFja0hlaWdodCA9IHNjb3Blcy5yZW1vdmVMYXN0KCk7CiAgfQoKICB2b2lkIHJlc3RvcmVTY29wZShpbnQgbnVtYmVyT2ZWYXJpYWJsZXMpIHsKICAgIHN0YWNrSGVpZ2h0ICs9IG51bWJlck9mVmFyaWFibGVzOwogIH0KCiAgaW50IG9wZXJhdG9yIFtdKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgcmV0dXJuIGluZGV4ID09IG51bGwgPyBudWxsIDogaW5kZXhbbm9kZV07CiAgfQp9CgpjbGFzcyBMYWJlbEluZGV4ZXIgewogIGZpbmFsIE1hcDxMYWJlbGVkU3RhdGVtZW50LCBpbnQ+IGluZGV4ID0gPExhYmVsZWRTdGF0ZW1lbnQsIGludD57fTsKICBpbnQgc3RhY2tIZWlnaHQgPSAwOwoKICB2b2lkIGVudGVyKExhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgewogICAgaW5kZXhbbm9kZV0gPSBzdGFja0hlaWdodCsrOwogIH0KCiAgdm9pZCBleGl0KCkgewogICAgLS1zdGFja0hlaWdodDsKICB9CgogIGludCBvcGVyYXRvciBbXShMYWJlbGVkU3RhdGVtZW50IG5vZGUpID0+IGluZGV4W25vZGVdOwp9CgpjbGFzcyBTd2l0Y2hDYXNlSW5kZXhlciB7CiAgZmluYWwgTWFwPFN3aXRjaENhc2UsIGludD4gaW5kZXggPSA8U3dpdGNoQ2FzZSwgaW50Pnt9OwogIGludCBzdGFja0hlaWdodCA9IDA7CgogIHZvaWQgZW50ZXIoU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIGZvciAoU3dpdGNoQ2FzZSBjYXNlTm9kZSBpbiBub2RlLmNhc2VzKSB7CiAgICAgIGluZGV4W2Nhc2VOb2RlXSA9IHN0YWNrSGVpZ2h0Kys7CiAgICB9CiAgfQoKICB2b2lkIGV4aXQoU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIHN0YWNrSGVpZ2h0IC09IG5vZGUuY2FzZXMubGVuZ3RoOwogIH0KCiAgaW50IG9wZXJhdG9yIFtdKFN3aXRjaENhc2Ugbm9kZSkgPT4gaW5kZXhbbm9kZV07Cn0KCmNsYXNzIENvbnN0YW50SW5kZXhlciBleHRlbmRzIFJlY3Vyc2l2ZVZpc2l0b3IgewogIGZpbmFsIFN0cmluZ0luZGV4ZXIgc3RyaW5nSW5kZXhlcjsKCiAgZmluYWwgTGlzdDxDb25zdGFudD4gZW50cmllcyA9IDxDb25zdGFudD5bXTsKICBmaW5hbCBNYXA8Q29uc3RhbnQsIGludD4gb2Zmc2V0cyA9IDxDb25zdGFudCwgaW50Pnt9OwogIGludCBuZXh0T2Zmc2V0ID0gMDsKCiAgZmluYWwgQmluYXJ5UHJpbnRlciBfcHJpbnRlcjsKCiAgQ29uc3RhbnRJbmRleGVyKHRoaXMuc3RyaW5nSW5kZXhlciwgdGhpcy5fcHJpbnRlcik7CgogIGludCBwdXQoQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIGZpbmFsIGludCBvbGRPZmZzZXQgPSBvZmZzZXRzW2NvbnN0YW50XTsKICAgIGlmIChvbGRPZmZzZXQgIT0gbnVsbCkgcmV0dXJuIG9sZE9mZnNldDsKCiAgICAvLyBUcmF2ZXJzZSBEQUcgaW4gcG9zdC1vcmRlciB0byBlbnN1cmUgY2hpbGRyZW4gaGF2ZSB0aGVpciBvZmZzZXRzIGFzc2lnbmVkCiAgICAvLyBiZWZvcmUgdGhlIHBhcmVudC4KICAgIGNvbnN0YW50LnZpc2l0Q2hpbGRyZW4odGhpcyk7CgogICAgaWYgKGNvbnN0YW50IGlzIFN0cmluZ0NvbnN0YW50KSB7CiAgICAgIHN0cmluZ0luZGV4ZXIucHV0KGNvbnN0YW50LnZhbHVlKTsKICAgIH0gZWxzZSBpZiAoY29uc3RhbnQgaXMgU3ltYm9sQ29uc3RhbnQpIHsKICAgICAgc3RyaW5nSW5kZXhlci5wdXQoY29uc3RhbnQubmFtZSk7CiAgICB9IGVsc2UgaWYgKGNvbnN0YW50IGlzIERvdWJsZUNvbnN0YW50KSB7CiAgICAgIHN0cmluZ0luZGV4ZXIucHV0KCcke2NvbnN0YW50LnZhbHVlfScpOwogICAgfSBlbHNlIGlmIChjb25zdGFudCBpcyBJbnRDb25zdGFudCkgewogICAgICBmaW5hbCBpbnQgdmFsdWUgPSBjb25zdGFudC52YWx1ZTsKICAgICAgaWYgKCh2YWx1ZS5hYnMoKSA+PiAzMCkgIT0gMCkgewogICAgICAgIHN0cmluZ0luZGV4ZXIucHV0KCckdmFsdWUnKTsKICAgICAgfQogICAgfQoKICAgIGZpbmFsIGludCBuZXdPZmZzZXQgPSBuZXh0T2Zmc2V0OwogICAgZW50cmllcy5hZGQoY29uc3RhbnQpOwogICAgbmV4dE9mZnNldCArPSBfcHJpbnRlci53cml0ZUNvbnN0YW50VGFibGVFbnRyeShjb25zdGFudCk7CiAgICByZXR1cm4gb2Zmc2V0c1tjb25zdGFudF0gPSBuZXdPZmZzZXQ7CiAgfQoKICBkZWZhdWx0Q29uc3RhbnRSZWZlcmVuY2UoQ29uc3RhbnQgbm9kZSkgewogICAgcHV0KG5vZGUpOwogIH0KCiAgaW50IG9wZXJhdG9yIFtdKENvbnN0YW50IG5vZGUpID0+IG9mZnNldHNbbm9kZV07Cn0KCmNsYXNzIFR5cGVQYXJhbWV0ZXJJbmRleGVyIHsKICBmaW5hbCBNYXA8VHlwZVBhcmFtZXRlciwgaW50PiBpbmRleCA9IDxUeXBlUGFyYW1ldGVyLCBpbnQ+e307CiAgaW50IHN0YWNrSGVpZ2h0ID0gMDsKCiAgdm9pZCBlbnRlcihMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgIFR5cGVQYXJhbWV0ZXIgcGFyYW1ldGVyID0gdHlwZVBhcmFtZXRlcnNbaV07CiAgICAgIGluZGV4W3BhcmFtZXRlcl0gPSBzdGFja0hlaWdodDsKICAgICAgKytzdGFja0hlaWdodDsKICAgIH0KICB9CgogIHZvaWQgZXhpdChMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKSB7CiAgICBzdGFja0hlaWdodCAtPSB0eXBlUGFyYW1ldGVycy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgIGluZGV4LnJlbW92ZSh0eXBlUGFyYW1ldGVyc1tpXSk7CiAgICB9CiAgfQoKICBpbnQgb3BlcmF0b3IgW10oVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIpID0+CiAgICAgIGluZGV4W3BhcmFtZXRlcl0gPz8KICAgICAgKHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdUeXBlIHBhcmFtZXRlciAkcGFyYW1ldGVyIGlzIG5vdCBpbmRleGVkJykpOwp9CgpjbGFzcyBTdHJpbmdJbmRleGVyIHsKICAvLyBOb3RlIHRoYXQgdGhlIGl0ZXJhdGlvbiBvcmRlciBpcyBpbXBvcnRhbnQuCiAgZmluYWwgTWFwPFN0cmluZywgaW50PiBpbmRleCA9IG5ldyBNYXA8U3RyaW5nLCBpbnQ+KCk7CgogIFN0cmluZ0luZGV4ZXIoKSB7CiAgICBwdXQoJycpOwogIH0KCiAgaW50IHB1dChTdHJpbmcgc3RyaW5nKSB7CiAgICBpbnQgcmVzdWx0ID0gaW5kZXhbc3RyaW5nXTsKICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewogICAgICByZXN1bHQgPSBpbmRleC5sZW5ndGg7CiAgICAgIGluZGV4W3N0cmluZ10gPSByZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgaW50IG9wZXJhdG9yIFtdKFN0cmluZyBzdHJpbmcpID0+IGluZGV4W3N0cmluZ107Cn0KCmNsYXNzIFVyaUluZGV4ZXIgewogIC8vIE5vdGUgdGhhdCB0aGUgaXRlcmF0aW9uIG9yZGVyIGlzIGltcG9ydGFudC4KICBmaW5hbCBNYXA8VXJpLCBpbnQ+IGluZGV4ID0gbmV3IE1hcDxVcmksIGludD4oKTsKCiAgVXJpSW5kZXhlcigpIHsKICAgIHB1dChudWxsKTsKICB9CgogIGludCBwdXQoVXJpIHVyaSkgewogICAgaW50IHJlc3VsdCA9IGluZGV4W3VyaV07CiAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKICAgICAgcmVzdWx0ID0gaW5kZXgubGVuZ3RoOwogICAgICBpbmRleFt1cmldID0gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KCi8vLyBQdXRzIGEgYnVmZmVyIGluIGZyb250IG9mIGEgW1Npbms8TGlzdDxpbnQ+Pl0uCmNsYXNzIEJ1ZmZlcmVkU2luayB7CiAgc3RhdGljIGNvbnN0IGludCBTSVpFID0gMTAwMDAwOwogIHN0YXRpYyBjb25zdCBpbnQgU0FGRV9TSVpFID0gU0laRSAtIDU7CiAgc3RhdGljIGNvbnN0IGludCBTTUFMTCA9IDEwMDAwOwogIGZpbmFsIFNpbms8TGlzdDxpbnQ+PiBfc2luazsKICBVaW50OExpc3QgX2J1ZmZlciA9IG5ldyBVaW50OExpc3QoU0laRSk7CiAgaW50IGxlbmd0aCA9IDA7CiAgaW50IGZsdXNoZWRMZW5ndGggPSAwOwoKICBGbG9hdDY0TGlzdCBfZG91YmxlQnVmZmVyID0gbmV3IEZsb2F0NjRMaXN0KDEpOwogIFVpbnQ4TGlzdCBfZG91YmxlQnVmZmVyVWludDg7CgogIGludCBnZXQgb2Zmc2V0ID0+IGxlbmd0aCArIGZsdXNoZWRMZW5ndGg7CgogIEJ1ZmZlcmVkU2luayh0aGlzLl9zaW5rKTsKCiAgdm9pZCBhZGREb3VibGUoZG91YmxlIGQpIHsKICAgIF9kb3VibGVCdWZmZXJVaW50OCA/Pz0gX2RvdWJsZUJ1ZmZlci5idWZmZXIuYXNVaW50OExpc3QoKTsKICAgIF9kb3VibGVCdWZmZXJbMF0gPSBkOwogICAgYWRkQnl0ZTQoX2RvdWJsZUJ1ZmZlclVpbnQ4WzBdLCBfZG91YmxlQnVmZmVyVWludDhbMV0sCiAgICAgICAgX2RvdWJsZUJ1ZmZlclVpbnQ4WzJdLCBfZG91YmxlQnVmZmVyVWludDhbM10pOwogICAgYWRkQnl0ZTQoX2RvdWJsZUJ1ZmZlclVpbnQ4WzRdLCBfZG91YmxlQnVmZmVyVWludDhbNV0sCiAgICAgICAgX2RvdWJsZUJ1ZmZlclVpbnQ4WzZdLCBfZG91YmxlQnVmZmVyVWludDhbN10pOwogIH0KCiAgdm9pZCBhZGRCeXRlKGludCBieXRlKSB7CiAgICBfYnVmZmVyW2xlbmd0aCsrXSA9IGJ5dGU7CiAgICBpZiAobGVuZ3RoID09IFNJWkUpIHsKICAgICAgX3NpbmsuYWRkKF9idWZmZXIpOwogICAgICBfYnVmZmVyID0gbmV3IFVpbnQ4TGlzdChTSVpFKTsKICAgICAgbGVuZ3RoID0gMDsKICAgICAgZmx1c2hlZExlbmd0aCArPSBTSVpFOwogICAgfQogIH0KCiAgdm9pZCBhZGRCeXRlMihpbnQgYnl0ZTEsIGludCBieXRlMikgewogICAgaWYgKGxlbmd0aCA8IFNBRkVfU0laRSkgewogICAgICBfYnVmZmVyW2xlbmd0aCsrXSA9IGJ5dGUxOwogICAgICBfYnVmZmVyW2xlbmd0aCsrXSA9IGJ5dGUyOwogICAgfSBlbHNlIHsKICAgICAgYWRkQnl0ZShieXRlMSk7CiAgICAgIGFkZEJ5dGUoYnl0ZTIpOwogICAgfQogIH0KCiAgdm9pZCBhZGRCeXRlNChpbnQgYnl0ZTEsIGludCBieXRlMiwgaW50IGJ5dGUzLCBpbnQgYnl0ZTQpIHsKICAgIGlmIChsZW5ndGggPCBTQUZFX1NJWkUpIHsKICAgICAgX2J1ZmZlcltsZW5ndGgrK10gPSBieXRlMTsKICAgICAgX2J1ZmZlcltsZW5ndGgrK10gPSBieXRlMjsKICAgICAgX2J1ZmZlcltsZW5ndGgrK10gPSBieXRlMzsKICAgICAgX2J1ZmZlcltsZW5ndGgrK10gPSBieXRlNDsKICAgIH0gZWxzZSB7CiAgICAgIGFkZEJ5dGUoYnl0ZTEpOwogICAgICBhZGRCeXRlKGJ5dGUyKTsKICAgICAgYWRkQnl0ZShieXRlMyk7CiAgICAgIGFkZEJ5dGUoYnl0ZTQpOwogICAgfQogIH0KCiAgdm9pZCBhZGRCeXRlcyhMaXN0PGludD4gYnl0ZXMpIHsKICAgIC8vIEF2b2lkIGNvcHlpbmcgYSBsYXJnZSBidWZmZXIgaW50byB0aGUgYW5vdGhlciBsYXJnZSBidWZmZXIuIEFsc28sIGlmCiAgICAvLyB0aGUgYnl0ZXMgYnVmZmVyIGlzIHRvbyBsYXJnZSB0byBmaXQgaW4gb3VyIG93biBidWZmZXIsIGp1c3QgZW1pdCBib3RoLgogICAgaWYgKGxlbmd0aCArIGJ5dGVzLmxlbmd0aCA8IFNJWkUgJiYKICAgICAgICAoYnl0ZXMubGVuZ3RoIDwgU01BTEwgfHwgbGVuZ3RoIDwgU01BTEwpKSB7CiAgICAgIF9idWZmZXIuc2V0UmFuZ2UobGVuZ3RoLCBsZW5ndGggKyBieXRlcy5sZW5ndGgsIGJ5dGVzKTsKICAgICAgbGVuZ3RoICs9IGJ5dGVzLmxlbmd0aDsKICAgIH0gZWxzZSBpZiAoYnl0ZXMubGVuZ3RoIDwgU01BTEwpIHsKICAgICAgLy8gRmx1c2ggYXMgbXVjaCBhcyB3ZSBjYW4gaW4gdGhlIGN1cnJlbnQgYnVmZmVyLgogICAgICBfYnVmZmVyLnNldFJhbmdlKGxlbmd0aCwgU0laRSwgYnl0ZXMpOwogICAgICBfc2luay5hZGQoX2J1ZmZlcik7CiAgICAgIC8vIENvcHkgb3ZlciB0aGUgcmVtYWluZGVyIGludG8gYSBuZXcgYnVmZmVyLiBJdCBpcyBndWFyYW50ZWVkIHRvIGZpdAogICAgICAvLyBiZWNhdXNlIHRoZSBpbnB1dCBieXRlIGFycmF5IGlzIHNtYWxsLgogICAgICBpbnQgYWxyZWFkeUVtaXR0ZWQgPSBTSVpFIC0gbGVuZ3RoOwogICAgICBpbnQgcmVtYWluZGVyID0gYnl0ZXMubGVuZ3RoIC0gYWxyZWFkeUVtaXR0ZWQ7CiAgICAgIF9idWZmZXIgPSBuZXcgVWludDhMaXN0KFNJWkUpOwogICAgICBfYnVmZmVyLnNldFJhbmdlKDAsIHJlbWFpbmRlciwgYnl0ZXMsIGFscmVhZHlFbWl0dGVkKTsKICAgICAgbGVuZ3RoID0gcmVtYWluZGVyOwogICAgICBmbHVzaGVkTGVuZ3RoICs9IFNJWkU7CiAgICB9IGVsc2UgewogICAgICBmbHVzaCgpOwogICAgICBfc2luay5hZGQoYnl0ZXMpOwogICAgICBmbHVzaGVkTGVuZ3RoICs9IGJ5dGVzLmxlbmd0aDsKICAgIH0KICB9CgogIHZvaWQgZmx1c2goKSB7CiAgICBfc2luay5hZGQoX2J1ZmZlci5zdWJsaXN0KDAsIGxlbmd0aCkpOwogICAgX2J1ZmZlciA9IG5ldyBVaW50OExpc3QoU0laRSk7CiAgICBmbHVzaGVkTGVuZ3RoICs9IGxlbmd0aDsKICAgIGxlbmd0aCA9IDA7CiAgfQoKICB2b2lkIGZsdXNoQW5kRGVzdHJveSgpIHsKICAgIF9zaW5rLmFkZChfYnVmZmVyLnN1Ymxpc3QoMCwgbGVuZ3RoKSk7CiAgfQp9CgovLy8gTm9uLWVtcHR5IG1ldGFkYXRhIHN1YnNlY3Rpb24uCmNsYXNzIF9NZXRhZGF0YVN1YnNlY3Rpb24gewogIGZpbmFsIE1ldGFkYXRhUmVwb3NpdG9yeTxPYmplY3Q+IHJlcG9zaXRvcnk7CgogIC8vLyBMaXN0IG9mIChub2RlT2Zmc2V0LCBtZXRhZGF0YU9mZnNldCkgcGFpcnMuCiAgLy8vIEdyYWR1YWxseSBmaWxsZWQgYnkgdGhlIHdyaXRlciBhcyB3cml0aW5nIHByb2dyZXNzZXMsIHdoaWNoIGJ5CiAgLy8vIGNvbnN0cnVjdGlvbiBndWFyYW50ZWVzIHRoYXQgcGFpcnMgYXJlIHNvcnRlZCBieSBmaXJzdCBjb21wb25lbnQKICAvLy8gKG5vZGVPZmZzZXQpIGluIGFzY2VuZGluZyBvcmRlci4KICBmaW5hbCBMaXN0PGludD4gbWV0YWRhdGFNYXBwaW5nID0gPGludD5bXTsKCiAgX01ldGFkYXRhU3Vic2VjdGlvbih0aGlzLnJlcG9zaXRvcnkpOwp9CgovLy8gQSBbU2lua10gdGhhdCBkaXJlY3RseSB3cml0ZXMgZGF0YSBpbnRvIGEgYnl0ZSBidWlsZGVyLgovLyBUT0RPKGRhcnRidWcuY29tLzI4MzE2KTogUmVtb3ZlIHRoaXMgd3JhcHBlciBjbGFzcy4KY2xhc3MgQnl0ZXNTaW5rIGltcGxlbWVudHMgU2luazxMaXN0PGludD4+IHsKICBmaW5hbCBCeXRlc0J1aWxkZXIgYnVpbGRlciA9IG5ldyBCeXRlc0J1aWxkZXIoKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGRhdGEpIHsKICAgIGJ1aWxkZXIuYWRkKGRhdGEpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjbG9zZSgpIHsKICAgIC8vIE5vdGhpbmcgdG8gZG8uCiAgfQp9CgpjbGFzcyBOb3RRdWl0ZVN0cmluZyB7CiAgLyoqCiAgICogV3JpdGUgW3NvdXJjZV0gc3RyaW5nIGludG8gW3RhcmdldF0gc3RhcnRpbmcgYXQgaW5kZXggW2luZGV4XS4KICAgKgogICAqIE9wdGlvbmFsbHkgb25seSB3cml0ZSBwYXJ0IG9mIHRoZSBpbnB1dCBbc291cmNlXSBzdGFydGluZyBhdCBbc3RhcnRdIGFuZAogICAqIGVuZGluZyBhdCBbZW5kXS4KICAgKgogICAqIFRoZSBvdXRwdXQgc3BhY2UgbmVlZGVkIGlzIGF0IG1vc3QgW3NvdXJjZS5sZW5ndGhdICogMy4KICAgKgogICAqIFJldHVybnMKICAgKiAgKiBOb24tbmVnYXRpdmUgb24gc3VjY2VzcyAodGhlIG5ldyBpbmRleCBpbiBbdGFyZ2V0XSkuCiAgICogICogLTEgd2hlbiBbdGFyZ2V0XSBkb2Vzbid0IGhhdmUgZW5vdWdoIHNwYWNlLiBOb3RlIHRoYXQgW3RhcmdldF0gY2FuIGJlCiAgICogICAgcG9sdXRlZCBzdGFydGluZyBhdCBbaW5kZXhdLgogICAqICAqIC0yIG9uIGlucHV0IGVycm9yLCBpLmUuIGFuIHVucGFpcmVkIGxlYWQgb3IgdGFpbCBzdXJyb2dhdGUuCiAgICovCiAgc3RhdGljIGludCB3cml0ZVV0ZjgoTGlzdDxpbnQ+IHRhcmdldCwgaW50IGluZGV4LCBTdHJpbmcgc291cmNlLAogICAgICBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZEluZGV4KGluZGV4LCB0YXJnZXQsIG51bGwsIHRhcmdldC5sZW5ndGgpOwogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgc291cmNlLmxlbmd0aCk7CiAgICBpZiAoc3RhcnQgPT0gZW5kKSByZXR1cm4gaW5kZXg7CiAgICBpbnQgaSA9IHN0YXJ0OwogICAgaW50IGxlbmd0aCA9IHRhcmdldC5sZW5ndGg7CiAgICBkbyB7CiAgICAgIGludCBjb2RlVW5pdCA9IHNvdXJjZS5jb2RlVW5pdEF0KGkrKyk7CiAgICAgIHdoaWxlIChjb2RlVW5pdCA8IDEyOCkgewogICAgICAgIGlmIChpbmRleCA+PSBsZW5ndGgpIHJldHVybiAtMTsKICAgICAgICB0YXJnZXRbaW5kZXgrK10gPSBjb2RlVW5pdDsKICAgICAgICBpZiAoaSA+PSBlbmQpIHJldHVybiBpbmRleDsKICAgICAgICBjb2RlVW5pdCA9IHNvdXJjZS5jb2RlVW5pdEF0KGkrKyk7CiAgICAgIH0KICAgICAgaWYgKGNvZGVVbml0IDwgMHg4MDApIHsKICAgICAgICBpbmRleCArPSAyOwogICAgICAgIGlmIChpbmRleCA+IGxlbmd0aCkgcmV0dXJuIC0xOwogICAgICAgIHRhcmdldFtpbmRleCAtIDJdID0gMHhDMCB8IChjb2RlVW5pdCA+PiA2KTsKICAgICAgICB0YXJnZXRbaW5kZXggLSAxXSA9IDB4ODAgfCAoY29kZVVuaXQgJiAweDNmKTsKICAgICAgfSBlbHNlIGlmIChjb2RlVW5pdCAmIDB4RjgwMCAhPSAweEQ4MDApIHsKICAgICAgICAvLyBOb3QgYSBzdXJyb2dhdGUuCiAgICAgICAgaW5kZXggKz0gMzsKICAgICAgICBpZiAoaW5kZXggPiBsZW5ndGgpIHJldHVybiAtMTsKICAgICAgICB0YXJnZXRbaW5kZXggLSAzXSA9IDB4RTAgfCAoY29kZVVuaXQgPj4gMTIpOwogICAgICAgIHRhcmdldFtpbmRleCAtIDJdID0gMHg4MCB8ICgoY29kZVVuaXQgPj4gNikgJiAweDNmKTsKICAgICAgICB0YXJnZXRbaW5kZXggLSAxXSA9IDB4ODAgfCAoY29kZVVuaXQgJiAweDNmKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoY29kZVVuaXQgPj0gMHhEQzAwKSByZXR1cm4gLTI7IC8vIFVucGFpcmVkIHRhaWwgc3Vycm9nYXRlLgogICAgICAgIGlmIChpID49IGVuZCkgcmV0dXJuIC0yOyAvLyBVbnBhaXJlZCBsZWFkIHN1cnJvZ2F0ZS4KICAgICAgICBpbnQgbmV4dENoYXIgPSBzb3VyY2UuY29kZVVuaXRBdChpKyspOwogICAgICAgIGlmIChuZXh0Q2hhciAmIDB4RkMwMCAhPSAweERDMDApIHJldHVybiAtMjsgLy8gVW5wYWlyZWQgbGVhZCBzdXJyb2dhdGUuCiAgICAgICAgaW5kZXggKz0gNDsKICAgICAgICBpZiAoaW5kZXgg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b3IgewogIFN0cmluZyBmaWxlbmFtZTsKICBpbnQgYnl0ZUluZGV4OwogIFN0cmluZyBtZXNzYWdlOwogIFN0cmluZyBwYXRoOwoKICBQYXJzZUVycm9yKHRoaXMubWVzc2FnZSwge3RoaXMuZmlsZW5hbWUsIHRoaXMuYnl0ZUluZGV4LCB0aGlzLnBhdGh9KTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyRmaWxlbmFtZTokYnl0ZUluZGV4OiAkbWVzc2FnZSBhdCAkcGF0aCc7Cn0KCmNsYXNzIEludmFsaWRLZXJuZWxWZXJzaW9uRXJyb3IgewogIGZpbmFsIGludCB2ZXJzaW9uOwoKICBJbnZhbGlkS2VybmVsVmVyc2lvbkVycm9yKHRoaXMudmVyc2lvbik7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnVW5leHBlY3RlZCBLZXJuZWwgdmVyc2lvbiAke3ZlcnNpb259ICcKICAgICAgICAnKGV4cGVjdGVkICR7VGFnLkJpbmFyeUZvcm1hdFZlcnNpb259KS4nOwogIH0KfQoKY2xhc3MgQ2Fub25pY2FsTmFtZUVycm9yIHsKICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKCiAgQ2Fub25pY2FsTmFtZUVycm9yKHRoaXMubWVzc2FnZSk7Cn0KCmNsYXNzIF9Db21wb25lbnRJbmRleCB7CiAgc3RhdGljIGNvbnN0IG51bWJlck9mRml4ZWRGaWVsZHMgPSA5OwoKICBpbnQgYmluYXJ5T2Zmc2V0Rm9yU291cmNlVGFibGU7CiAgaW50IGJpbmFyeU9mZnNldEZvckNhbm9uaWNhbE5hbWVzOwogIGludCBiaW5hcnlPZmZzZXRGb3JNZXRhZGF0YVBheWxvYWRzOwogIGludCBiaW5hcnlPZmZzZXRGb3JNZXRhZGF0YU1hcHBpbmdzOwogIGludCBiaW5hcnlPZmZzZXRGb3JTdHJpbmdUYWJsZTsKICBpbnQgYmluYXJ5T2Zmc2V0Rm9yQ29uc3RhbnRUYWJsZTsKICBpbnQgbWFpbk1ldGhvZFJlZmVyZW5jZTsKICBMaXN0PGludD4gbGlicmFyeU9mZnNldHM7CiAgaW50IGxpYnJhcnlDb3VudDsKICBpbnQgY29tcG9uZW50RmlsZVNpemVJbkJ5dGVzOwp9CgpjbGFzcyBCaW5hcnlCdWlsZGVyIHsKICBmaW5hbCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlU3RhY2sgPSA8VmFyaWFibGVEZWNsYXJhdGlvbj5bXTsKICBmaW5hbCBMaXN0PExhYmVsZWRTdGF0ZW1lbnQ+IGxhYmVsU3RhY2sgPSA8TGFiZWxlZFN0YXRlbWVudD5bXTsKICBpbnQgbGFiZWxTdGFja0Jhc2UgPSAwOwogIGZpbmFsIExpc3Q8U3dpdGNoQ2FzZT4gc3dpdGNoQ2FzZVN0YWNrID0gPFN3aXRjaENhc2U+W107CiAgZmluYWwgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyU3RhY2sgPSA8VHlwZVBhcmFtZXRlcj5bXTsKICBmaW5hbCBTdHJpbmcgZmlsZW5hbWU7CiAgZmluYWwgTGlzdDxpbnQ+IF9ieXRlczsKICBpbnQgX2J5dGVPZmZzZXQgPSAwOwogIGZpbmFsIExpc3Q8U3RyaW5nPiBfc3RyaW5nVGFibGUgPSA8U3RyaW5nPltdOwogIGZpbmFsIExpc3Q8VXJpPiBfc291cmNlVXJpVGFibGUgPSA8VXJpPltdOwogIE1hcDxpbnQsIENvbnN0YW50PiBfY29uc3RhbnRUYWJsZSA9IDxpbnQsIENvbnN0YW50Pnt9OwogIExpc3Q8Q2Fub25pY2FsTmFtZT4gX2xpbmtUYWJsZTsKICBpbnQgX3RyYW5zZm9ybWVyRmxhZ3MgPSAwOwogIExpYnJhcnkgX2N1cnJlbnRMaWJyYXJ5OwogIGludCBfY29tcG9uZW50U3RhcnRPZmZzZXQgPSAwOwoKICAvLyBJZiBzb21ldGhpbmcgZ29lcyB3cm9uZywgdGhpcyBsaXN0IHNob3VsZCBpbmRpY2F0ZSB3aGF0IGxpYnJhcnksCiAgLy8gY2xhc3MsIGFuZCBtZW1iZXIgd2FzIGJlaW5nIGJ1aWx0LgogIExpc3Q8U3RyaW5nPiBkZWJ1Z1BhdGggPSA8U3RyaW5nPltdOwoKICBib29sIF9pc1JlYWRpbmdMaWJyYXJ5SW1wbGVtZW50YXRpb24gPSBmYWxzZTsKCiAgLy8vIElmIGJpbmFyeSBjb250YWlucyBtZXRhZGF0YSBzZWN0aW9uIHdpdGggcGF5bG9hZHMgcmVmZXJlbmNpbmcgb3RoZXIgbm9kZXMKICAvLy8gc3VjaCBLZXJuZWwgYmluYXJ5IGNhbid0IGJlIHJlYWQgbGF6aWx5IGJlY2F1c2UgbWV0YWRhdGEgY3Jvc3MgcmVmZXJlbmNlcwogIC8vLyB3aWxsIG5vdCBiZSByZXNvbHZlZCBjb3JyZWN0bHkuCiAgYm9vbCBfZGlzYWJsZUxhenlSZWFkaW5nID0gZmFsc2U7CgogIEJpbmFyeUJ1aWxkZXIodGhpcy5fYnl0ZXMsIHt0aGlzLmZpbGVuYW1lLCBkaXNhYmxlTGF6eVJlYWRpbmcgPSBmYWxzZX0pCiAgICAgIDogX2Rpc2FibGVMYXp5UmVhZGluZyA9IGRpc2FibGVMYXp5UmVhZGluZzsKCiAgZmFpbChTdHJpbmcgbWVzc2FnZSkgewogICAgdGhyb3cgUGFyc2VFcnJvcihtZXNzYWdlLAogICAgICAgIGJ5dGVJbmRleDogX2J5dGVPZmZzZXQsIGZpbGVuYW1lOiBmaWxlbmFtZSwgcGF0aDogZGVidWdQYXRoLmpvaW4oJzo6JykpOwogIH0KCiAgaW50IGdldCBieXRlT2Zmc2V0ID0+IF9ieXRlT2Zmc2V0OwoKICBpbnQgcmVhZEJ5dGUoKSA9PiBfYnl0ZXNbX2J5dGVPZmZzZXQrK107CgogIGludCByZWFkVUludCgpIHsKICAgIHZhciBieXRlID0gcmVhZEJ5dGUoKTsKICAgIGlmIChieXRlICYgMHg4MCA9PSAwKSB7CiAgICAgIC8vIDB4eHh4eHh4CiAgICAgIHJldHVybiBieXRlOwogICAgfSBlbHNlIGlmIChieXRlICYgMHg0MCA9PSAwKSB7CiAgICAgIC8vIDEweHh4eHh4CiAgICAgIHJldHVybiAoKGJ5dGUgJiAweDNGKSA8PCA4KSB8IHJlYWRCeXRlKCk7CiAgICB9IGVsc2UgewogICAgICAvLyAxMXh4eHh4eAogICAgICByZXR1cm4gKChieXRlICYgMHgzRikgPDwgMjQpIHwKICAgICAgICAgIChyZWFkQnl0ZSgpIDw8IDE2KSB8CiAgICAgICAgICAocmVhZEJ5dGUoKSA8PCA4KSB8CiAgICAgICAgICByZWFkQnl0ZSgpOwogICAgfQogIH0KCiAgaW50IHJlYWRVaW50MzIoKSB7CiAgICByZXR1cm4gKHJlYWRCeXRlKCkgPDwgMjQpIHwKICAgICAgICAocmVhZEJ5dGUoKSA8PCAxNikgfAogICAgICAgIChyZWFkQnl0ZSgpIDw8IDgpIHwKICAgICAgICByZWFkQnl0ZSgpOwogIH0KCiAgZmluYWwgRmxvYXQ2NExpc3QgX2RvdWJsZUJ1ZmZlciA9IG5ldyBGbG9hdDY0TGlzdCgxKTsKICBVaW50OExpc3QgX2RvdWJsZUJ1ZmZlclVpbnQ4OwoKICBkb3VibGUgcmVhZERvdWJsZSgpIHsKICAgIF9kb3VibGVCdWZmZXJVaW50OCA/Pz0gX2RvdWJsZUJ1ZmZlci5idWZmZXIuYXNVaW50OExpc3QoKTsKICAgIF9kb3VibGVCdWZmZXJVaW50OFswXSA9IHJlYWRCeXRlKCk7CiAgICBfZG91YmxlQnVmZmVyVWludDhbMV0gPSByZWFkQnl0ZSgpOwogICAgX2RvdWJsZUJ1ZmZlclVpbnQ4WzJdID0gcmVhZEJ5dGUoKTsKICAgIF9kb3VibGVCdWZmZXJVaW50OFszXSA9IHJlYWRCeXRlKCk7CiAgICBfZG91YmxlQnVmZmVyVWludDhbNF0gPSByZWFkQnl0ZSgpOwogICAgX2RvdWJsZUJ1ZmZlclVpbnQ4WzVdID0gcmVhZEJ5dGUoKTsKICAgIF9kb3VibGVCdWZmZXJVaW50OFs2XSA9IHJlYWRCeXRlKCk7CiAgICBfZG91YmxlQnVmZmVyVWludDhbN10gPSByZWFkQnl0ZSgpOwogICAgcmV0dXJuIF9kb3VibGVCdWZmZXJbMF07CiAgfQoKICBMaXN0PGludD4gcmVhZEJ5dGVzKGludCBsZW5ndGgpIHsKICAgIExpc3Q8aW50PiBieXRlcyA9IG5ldyBVaW50OExpc3QobGVuZ3RoKTsKICAgIGJ5dGVzLnNldFJhbmdlKDAsIGJ5dGVzLmxlbmd0aCwgX2J5dGVzLCBfYnl0ZU9mZnNldCk7CiAgICBfYnl0ZU9mZnNldCArPSBieXRlcy5sZW5ndGg7CiAgICByZXR1cm4gYnl0ZXM7CiAgfQoKICBMaXN0PGludD4gcmVhZEJ5dGVMaXN0KCkgewogICAgcmV0dXJuIHJlYWRCeXRlcyhyZWFkVUludCgpKTsKICB9CgogIFN0cmluZyByZWFkU3RyaW5nRW50cnkoaW50IG51bUJ5dGVzKSB7CiAgICAvLyBVdGY4RGVjb2RlciB3aWxsIHNraXAgbGVhZGluZyBCT00gY2hhcmFjdGVycywgYnV0IHdlIG11c3QgcHJlc2VydmUgdGhlbS4KICAgIC8vIENvbGxlY3QgbGVhZGluZyBCT01zIGJlZm9yZSBwYXNzaW5nIHRoZSBieXRlcyBvbnRvIFV0ZjhEZWNvZGVyLgogICAgaW50IG51bUJ5dGVPcmRlck1hcmtzID0gMDsKICAgIHdoaWxlIChfYnl0ZU9mZnNldCArIDIgPCBfYnl0ZXMubGVuZ3RoICYmCiAgICAgICAgX2J5dGVzW19ieXRlT2Zmc2V0XSA9PSAweGVmICYmCiAgICAgICAgX2J5dGVzW19ieXRlT2Zmc2V0ICsgMV0gPT0gMHhiYiAmJgogICAgICAgIF9ieXRlc1tfYnl0ZU9mZnNldCArIDJdID09IDB4YmYpIHsKICAgICAgKytudW1CeXRlT3JkZXJNYXJrczsKICAgICAgX2J5dGVPZmZzZXQgKz0gMzsKICAgICAgbnVtQnl0ZXMgLT0gMzsKICAgIH0KICAgIFN0cmluZyBzdHJpbmcgPSBjb25zdCBVdGY4RGVjb2RlcigpCiAgICAgICAgLmNvbnZlcnQoX2J5dGVzLCBfYnl0ZU9mZnNldCwgX2J5dGVPZmZzZXQgKyBudW1CeXRlcyk7CiAgICBfYnl0ZU9mZnNldCArPSBudW1CeXRlczsKICAgIGlmIChudW1CeXRlT3JkZXJNYXJrcyA+IDApIHsKICAgICAgcmV0dXJuICdcdWZlZmYnICogbnVtQnl0ZU9yZGVyTWFya3MgKyBzdHJpbmc7CiAgICB9CiAgICByZXR1cm4gc3RyaW5nOwogIH0KCiAgLy8vIFJlYWQgbWV0YWRhdGFNYXBwaW5ncyBzZWN0aW9uIGZyb20gdGhlIGJpbmFyeS4KICB2b2lkIF9yZWFkTWV0YWRhdGFNYXBwaW5ncygKICAgICAgQ29tcG9uZW50IGNvbXBvbmVudCwgaW50IGJpbmFyeU9mZnNldEZvck1ldGFkYXRhUGF5bG9hZHMpIHsKICAgIC8vIERlZmF1bHQgcmVhZGVyIGlnbm9yZXMgbWV0YWRhdGEgc2VjdGlvbiBlbnRpcmVseS4KICB9CgogIC8vLyBSZWFkcyBtZXRhZGF0YSBmb3IgdGhlIGdpdmVuIFtub2RlXS4KICBOb2RlIF9hc3NvY2lhdGVNZXRhZGF0YShOb2RlIG5vZGUsIGludCBub2RlT2Zmc2V0KSB7CiAgICAvLyBEZWZhdWx0IHJlYWRlciBpZ25vcmVzIG1ldGFkYXRhIHNlY3Rpb24gZW50aXJlbHkuCiAgICByZXR1cm4gbm9kZTsKICB9CgogIHZvaWQgcmVhZFN0cmluZ1RhYmxlKExpc3Q8U3RyaW5nPiB0YWJsZSkgewogICAgLy8gUmVhZCB0aGUgdGFibGUgb2YgZW5kIG9mZnNldHMuCiAgICBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIExpc3Q8aW50PiBlbmRPZmZzZXRzID0gbmV3IExpc3Q8aW50PihsZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICBlbmRPZmZzZXRzW2ldID0gcmVhZFVJbnQoKTsKICAgIH0KICAgIC8vIFJlYWQgdGhlIFVURi04IGVuY29kZWQgc3RyaW5ncy4KICAgIHRhYmxlLmxlbmd0aCA9IGxlbmd0aDsKICAgIGludCBzdGFydE9mZnNldCA9IDA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIHRhYmxlW2ldID0gcmVhZFN0cmluZ0VudHJ5KGVuZE9mZnNldHNbaV0gLSBzdGFydE9mZnNldCk7CiAgICAgIHN0YXJ0T2Zmc2V0ID0gZW5kT2Zmc2V0c1tpXTsKICAgIH0KICB9CgogIHZvaWQgcmVhZENvbnN0YW50VGFibGUoKSB7CiAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIGZpbmFsIGludCBzdGFydE9mZnNldCA9IGJ5dGVPZmZzZXQ7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIF9jb25zdGFudFRhYmxlW2J5dGVPZmZzZXQgLSBzdGFydE9mZnNldF0gPSByZWFkQ29uc3RhbnRUYWJsZUVudHJ5KCk7CiAgICB9CiAgfQoKICBDb25zdGFudCByZWFkQ29uc3RhbnRUYWJsZUVudHJ5KCkgewogICAgZmluYWwgaW50IGNvbnN0YW50VGFnID0gcmVhZEJ5dGUoKTsKICAgIHN3aXRjaCAoY29uc3RhbnRUYWcpIHsKICAgICAgY2FzZSBDb25zdGFudFRhZy5OdWxsQ29uc3RhbnQ6CiAgICAgICAgcmV0dXJuIG5ldyBOdWxsQ29uc3RhbnQoKTsKICAgICAgY2FzZSBDb25zdGFudFRhZy5Cb29sQ29uc3RhbnQ6CiAgICAgICAgcmV0dXJuIG5ldyBCb29sQ29uc3RhbnQocmVhZEJ5dGUoKSA9PSAxKTsKICAgICAgY2FzZSBDb25zdGFudFRhZy5JbnRDb25zdGFudDoKICAgICAgICByZXR1cm4gbmV3IEludENvbnN0YW50KChyZWFkRXhwcmVzc2lvbigpIGFzIEludExpdGVyYWwpLnZhbHVlKTsKICAgICAgY2FzZSBDb25zdGFudFRhZy5Eb3VibGVDb25zdGFudDoKICAgICAgICByZXR1cm4gbmV3IERvdWJsZUNvbnN0YW50KHJlYWREb3VibGUoKSk7CiAgICAgIGNhc2UgQ29uc3RhbnRUYWcuU3RyaW5nQ29uc3RhbnQ6CiAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdDb25zdGFudChyZWFkU3RyaW5nUmVmZXJlbmNlKCkpOwogICAgICBjYXNlIENvbnN0YW50VGFnLlN5bWJvbENvbnN0YW50OgogICAgICAgIFJlZmVyZW5jZSBsaWJyYXJ5UmVmZXJlbmNlID0gcmVhZExpYnJhcnlSZWZlcmVuY2UoYWxsb3dOdWxsOiB0cnVlKTsKICAgICAgICByZXR1cm4gbmV3IFN5bWJvbENvbnN0YW50KHJlYWRTdHJpbmdSZWZlcmVuY2UoKSwgbGlicmFyeVJlZmVyZW5jZSk7CiAgICAgIGNhc2UgQ29uc3RhbnRUYWcuTWFwQ29uc3RhbnQ6CiAgICAgICAgZmluYWwgRGFydFR5cGUga2V5VHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIGZpbmFsIERhcnRUeXBlIHZhbHVlVHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIGZpbmFsIGludCBsZW5ndGggPSByZWFkVUludCgpOwogICAgICAgIGZpbmFsIExpc3Q8Q29uc3RhbnRNYXBFbnRyeT4gZW50cmllcyA9CiAgICAgICAgICAgIG5ldyBMaXN0PENvbnN0YW50TWFwRW50cnk+LmZpbGxlZChsZW5ndGgsIG51bGwsIGdyb3dhYmxlOiB0cnVlKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBmaW5hbCBDb25zdGFudCBrZXkgPSByZWFkQ29uc3RhbnRSZWZlcmVuY2UoKTsKICAgICAgICAgIGZpbmFsIENvbnN0YW50IHZhbHVlID0gcmVhZENvbnN0YW50UmVmZXJlbmNlKCk7CiAgICAgICAgICBlbnRyaWVzW2ldID0gbmV3IENvbnN0YW50TWFwRW50cnkoa2V5LCB2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgTWFwQ29uc3RhbnQoa2V5VHlwZSwgdmFsdWVUeXBlLCBlbnRyaWVzKTsKICAgICAgY2FzZSBDb25zdGFudFRhZy5MaXN0Q29uc3RhbnQ6CiAgICAgICAgZmluYWwgRGFydFR5cGUgdHlwZUFyZ3VtZW50ID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICAgICAgZmluYWwgTGlzdDxDb25zdGFudD4gZW50cmllcyA9CiAgICAgICAgICAgIG5ldyBMaXN0PENvbnN0YW50Pi5maWxsZWQobGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgZW50cmllc1tpXSA9IHJlYWRDb25zdGFudFJlZmVyZW5jZSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IExpc3RDb25zdGFudCh0eXBlQXJndW1lbnQsIGVudHJpZXMpOwogICAgICBjYXNlIENvbnN0YW50VGFnLlNldENvbnN0YW50OgogICAgICAgIGZpbmFsIERhcnRUeXBlIHR5cGVBcmd1bWVudCA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIGZpbmFsIGludCBsZW5ndGggPSByZWFkVUludCgpOwogICAgICAgIGZpbmFsIExpc3Q8Q29uc3RhbnQ+IGVudHJpZXMgPQogICAgICAgICAgICBuZXcgTGlzdDxDb25zdGFudD4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGVudHJpZXNbaV0gPSByZWFkQ29uc3RhbnRSZWZlcmVuY2UoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBTZXRDb25zdGFudCh0eXBlQXJndW1lbnQsIGVudHJpZXMpOwogICAgICBjYXNlIENvbnN0YW50VGFnLkluc3RhbmNlQ29uc3RhbnQ6CiAgICAgICAgZmluYWwgUmVmZXJlbmNlIGNsYXNzUmVmZXJlbmNlID0gcmVhZENsYXNzUmVmZXJlbmNlKCk7CiAgICAgICAgZmluYWwgaW50IHR5cGVBcmd1bWVudENvdW50ID0gcmVhZFVJbnQoKTsKICAgICAgICBmaW5hbCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0KICAgICAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCh0eXBlQXJndW1lbnRDb3VudCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50Q291bnQ7IGkrKykgewogICAgICAgICAgdHlwZUFyZ3VtZW50c1tpXSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIH0KICAgICAgICBmaW5hbCBpbnQgZmllbGRWYWx1ZUNvdW50ID0gcmVhZFVJbnQoKTsKICAgICAgICBmaW5hbCBNYXA8UmVmZXJlbmNlLCBDb25zdGFudD4gZmllbGRWYWx1ZXMgPSA8UmVmZXJlbmNlLCBDb25zdGFudD57fTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkVmFsdWVDb3VudDsgaSsrKSB7CiAgICAgICAgICBmaW5hbCBSZWZlcmVuY2UgZmllbGRSZWYgPQogICAgICAgICAgICAgIHJlYWRDYW5vbmljYWxOYW1lUmVmZXJlbmNlKCkuZ2V0UmVmZXJlbmNlKCk7CiAgICAgICAgICBmaW5hbCBDb25zdGFudCBjb25zdGFudCA9IHJlYWRDb25zdGFudFJlZmVyZW5jZSgpOwogICAgICAgICAgZmllbGRWYWx1ZXNbZmllbGRSZWZdID0gY29uc3RhbnQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgSW5zdGFuY2VDb25zdGFudChjbGFzc1JlZmVyZW5jZSwgdHlwZUFyZ3VtZW50cywgZmllbGRWYWx1ZXMpOwogICAgICBjYXNlIENvbnN0YW50VGFnLlBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQ6CiAgICAgICAgZmluYWwgdGVhck9mZkNvbnN0YW50ID0gcmVhZENvbnN0YW50UmVmZXJlbmNlKCkgYXMgVGVhck9mZkNvbnN0YW50OwogICAgICAgIGZpbmFsIGludCBsZW5ndGggPSByZWFkVUludCgpOwogICAgICAgIGZpbmFsIExpc3Q8RGFydFR5cGU+IHR5cGVzID0gbmV3IExpc3Q8RGFydFR5cGU+KGxlbmd0aCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgdHlwZXNbaV0gPSByZWFkRGFydFR5cGUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50KHRlYXJPZmZDb25zdGFudCwgdHlwZXMpOwogICAgICBjYXNlIENvbnN0YW50VGFnLlRlYXJPZmZDb25zdGFudDoKICAgICAgICBmaW5hbCBSZWZlcmVuY2UgcmVmZXJlbmNlID0gcmVhZENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoKS5nZXRSZWZlcmVuY2UoKTsKICAgICAgICByZXR1cm4gbmV3IFRlYXJPZmZDb25zdGFudC5ieVJlZmVyZW5jZShyZWZlcmVuY2UpOwogICAgICBjYXNlIENvbnN0YW50VGFnLlR5cGVMaXRlcmFsQ29uc3RhbnQ6CiAgICAgICAgZmluYWwgRGFydFR5cGUgdHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIHJldHVybiBuZXcgVHlwZUxpdGVyYWxDb25zdGFudCh0eXBlKTsKICAgICAgY2FzZSBDb25zdGFudFRhZy5VbmV2YWx1YXRlZENvbnN0YW50OgogICAgICAgIGZpbmFsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHJlYWRFeHByZXNzaW9uKCk7CiAgICAgICAgcmV0dXJuIG5ldyBVbmV2YWx1YXRlZENvbnN0YW50KGV4cHJlc3Npb24pOwogICAgfQoKICAgIHRocm93IGZhaWwoJ3VuZXhwZWN0ZWQgY29uc3RhbnQgdGFnOiAkY29uc3RhbnRUYWcnKTsKICB9CgogIENvbnN0YW50IHJlYWRDb25zdGFudFJlZmVyZW5jZSgpIHsKICAgIGZpbmFsIGludCBvZmZzZXQgPSByZWFkVUludCgpOwogICAgQ29uc3RhbnQgY29uc3RhbnQgPSBfY29uc3RhbnRUYWJsZVtvZmZzZXRdOwogICAgYXNzZXJ0KGNvbnN0YW50ICE9IG51bGwpOwogICAgcmV0dXJuIGNvbnN0YW50OwogIH0KCiAgVXJpIHJlYWRVcmlSZWZlcmVuY2UoKSB7CiAgICByZXR1cm4gX3NvdXJjZVVyaVRhYmxlW3JlYWRVSW50KCldOwogIH0KCiAgU3RyaW5nIHJlYWRTdHJpbmdSZWZlcmVuY2UoKSB7CiAgICByZXR1cm4gX3N0cmluZ1RhYmxlW3JlYWRVSW50KCldOwogIH0KCiAgTGlzdDxTdHJpbmc+IHJlYWRTdHJpbmdSZWZlcmVuY2VMaXN0KCkgewogICAgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICBMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IExpc3Q8U3RyaW5nPi5maWxsZWQobGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIHJlc3VsdFtpXSA9IHJlYWRTdHJpbmdSZWZlcmVuY2UoKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBTdHJpbmcgcmVhZFN0cmluZ09yTnVsbElmRW1wdHkoKSB7CiAgICB2YXIgc3RyaW5nID0gcmVhZFN0cmluZ1JlZmVyZW5jZSgpOwogICAgcmV0dXJuIHN0cmluZy5pc0VtcHR5ID8gbnVsbCA6IHN0cmluZzsKICB9CgogIGJvb2wgcmVhZEFuZENoZWNrT3B0aW9uVGFnKCkgewogICAgaW50IHRhZyA9IHJlYWRCeXRlKCk7CiAgICBpZiAodGFnID09IFRhZy5Ob3RoaW5nKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZSBpZiAodGFnID09IFRhZy5Tb21ldGhpbmcpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBmYWlsKCd1bmV4cGVjdGVkIG9wdGlvbiB0YWc6ICR0YWcnKTsKICAgIH0KICB9CgogIExpc3Q8RXhwcmVzc2lvbj4gcmVhZEFubm90YXRpb25MaXN0KFRyZWVOb2RlIHBhcmVudCkgewogICAgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBjb25zdCA8RXhwcmVzc2lvbj5bXTsKICAgIExpc3Q8RXhwcmVzc2lvbj4gbGlzdCA9CiAgICAgICAgbmV3IExpc3Q8RXhwcmVzc2lvbj4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICBsaXN0W2ldID0gcmVhZEV4cHJlc3Npb24oKS4ucGFyZW50ID0gcGFyZW50OwogICAgfQogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICB2b2lkIF9maWxsVHJlZU5vZGVMaXN0KAogICAgICBMaXN0PFRyZWVOb2RlPiBsaXN0LCBUcmVlTm9kZSBidWlsZE9iamVjdChpbnQgaW5kZXgpLCBUcmVlTm9kZSBwYXJlbnQpIHsKICAgIHZhciBsZW5ndGggPSByZWFkVUludCgpOwogICAgbGlzdC5sZW5ndGggPSBsZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIFRyZWVOb2RlIG9iamVjdCA9IGJ1aWxkT2JqZWN0KGkpOwogICAgICBsaXN0W2ldID0gb2JqZWN0Li5wYXJlbnQgPSBwYXJlbnQ7CiAgICB9CiAgfQoKICB2b2lkIF9maWxsTm9uVHJlZU5vZGVMaXN0KExpc3Q8Tm9kZT4gbGlzdCwgTm9kZSBidWlsZE9iamVjdCgpKSB7CiAgICB2YXIgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIGxpc3QubGVuZ3RoID0gbGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICBOb2RlIG9iamVjdCA9IGJ1aWxkT2JqZWN0KCk7CiAgICAgIGxpc3RbaV0gPSBvYmplY3Q7CiAgICB9CiAgfQoKICB2b2lkIF9za2lwTm9kZUxpc3QoTm9kZSBza2lwT2JqZWN0KCkpIHsKICAgIHZhciBsZW5ndGggPSByZWFkVUludCgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICBza2lwT2JqZWN0KCk7CiAgICB9CiAgfQoKICAvLy8gUmVhZHMgYSBsaXN0IG9mIG5hbWVkIG5vZGVzLCByZXVzaW5nIGFueSBleGlzdGluZyBvYmplY3RzIGFscmVhZHkgaW4gdGhlCiAgLy8vIGxpbmtpbmcgdHJlZS4gVGhlIG5vZGVzIGFyZSBtZXJnZWQgaW50byBbbGlzdF0sIGFuZCBpZiByZWFkaW5nIHRoZSBsaWJyYXJ5CiAgLy8vIGltcGxlbWVudGF0aW9uLCB0aGUgb3JkZXIgaXMgY29ycmVjdGVkLgogIC8vLwogIC8vLyBbcmVhZE9iamVjdF0gc2hvdWxkIHJlYWQgdGhlIG9iamVjdCBkZWZpbml0aW9uIGFuZCBpdHMgY2Fub25pY2FsIG5hbWUuCiAgLy8vIElmIGFuIGV4aXN0aW5nIG9iamVjdCBpcyBib3VuZCB0byB0aGUgY2Fub25pY2FsIG5hbWUsIHRoZSBleGlzdGluZyBvYmplY3QKICAvLy8gbXVzdCBiZSByZXVzZWQgYW5kIHJldHVybmVkLgogIHZvaWQgX21lcmdlTmFtZWROb2RlTGlzdCgKICAgICAgTGlzdDxOYW1lZE5vZGU+IGxpc3QsIE5hbWVkTm9kZSByZWFkT2JqZWN0KGludCBpbmRleCksIFRyZWVOb2RlIHBhcmVudCkgewogICAgaWYgKF9pc1JlYWRpbmdMaWJyYXJ5SW1wbGVtZW50YXRpb24pIHsKICAgICAgLy8gV2hlbiByZWFkaW5nIHRoZSBsaWJyYXJ5IGltcGxlbWVudGF0aW9uLCBvdmVyd3JpdGUgdGhlIHdob2xlIGxpc3QKICAgICAgLy8gd2l0aCB0aGUgbmV3IG9uZS4KICAgICAgX2ZpbGxUcmVlTm9kZUxpc3QobGlzdCwgcmVhZE9iamVjdCwgcGFyZW50KTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFdoZW4gcmVhZGluZyBhbiBleHRlcm5hbCBsaWJyYXJ5LCB0aGUgcmVzdWx0cyBzaG91bGQgZWl0aGVyIGJlOgogICAgICAvLyAtIG1lcmdlZCB3aXRoIHRoZSBleGlzdGluZyBleHRlcm5hbCBsaWJyYXJ5IGRlZmluaXRpb24gKGlmIGFueSkKICAgICAgLy8gLSBpZ25vcmVkIGlmIHRoZSBsaWJyYXJ5IGltcGxlbWVudGF0aW9uIGlzIGFscmVhZHkgaW4gbWVtb3J5CiAgICAgIGludCBudW1iZXJPZk5vZGVzID0gcmVhZFVJbnQoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZk5vZGVzOyArK2kpIHsKICAgICAgICB2YXIgdmFsdWUgPSByZWFkT2JqZWN0KGkpOwogICAgICAgIC8vIFdlIHVzZSB0aGUgcGFyZW50IHBvaW50ZXIgb2YgYSBub2RlIHRvIGRldGVybWluZSBpZiBpdCBhbHJlYWR5IGlzIGluCiAgICAgICAgLy8gdGhlIEFTVCBhbmQgaGVuY2Ugc2hvdWxkIG5vdCBiZSBhZGRlZCBhZ2Fpbi4KICAgICAgICBpZiAodmFsdWUucGFyZW50ID09IG51bGwpIHsKICAgICAgICAgIGxpc3QuYWRkKHZhbHVlLi5wYXJlbnQgPSBwYXJlbnQpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgdm9pZCByZWFkTGlua1RhYmxlKENhbm9uaWNhbE5hbWUgbGlua1Jvb3QpIHsKICAgIGludCBsZW5ndGggPSByZWFkVUludCgpOwogICAgX2xpbmtUYWJsZSA9IG5ldyBMaXN0PENhbm9uaWNhbE5hbWU+KGxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIGludCBiaWFzZWRQYXJlbnRJbmRleCA9IHJlYWRVSW50KCk7CiAgICAgIFN0cmluZyBuYW1lID0gcmVhZFN0cmluZ1JlZmVyZW5jZSgpOwogICAgICB2YXIgcGFyZW50ID0KICAgICAgICAgIGJpYXNlZFBhcmVudEluZGV4ID09IDAgPyBsaW5rUm9vdCA6IF9saW5rVGFibGVbYmlhc2VkUGFyZW50SW5kZXggLSAxXTsKICAgICAgX2xpbmtUYWJsZVtpXSA9IHBhcmVudC5nZXRDaGlsZChuYW1lKTsKICAgIH0KICB9CgogIExpc3Q8aW50PiBfaW5kZXhDb21wb25lbnRzKCkgewogICAgaW50IHNhdmVkQnl0ZU9mZnNldCA9IF9ieXRlT2Zmc2V0OwogICAgX2J5dGVPZmZzZXQgPSBfYnl0ZXMubGVuZ3RoIC0gNDsKICAgIExpc3Q8aW50PiBpbmRleCA9IDxpbnQ+W107CiAgICB3aGlsZSAoX2J5dGVPZmZzZXQgPiAwKSB7CiAgICAgIGludCBzaXplID0gcmVhZFVpbnQzMigpOwogICAgICBpbnQgc3RhcnQgPSBfYnl0ZU9mZnNldCAtIHNpemU7CiAgICAgIGlmIChzdGFydCA8IDApIHsKICAgICAgICB0aHJvdyBmYWlsKCJpbmRpY2F0ZWQgc2l6ZSBkb2VzIG5vdCBtYXRjaCBmaWxlIHNpemUiKTsKICAgICAgfQogICAgICBpbmRleC5hZGQoc2l6ZSk7CiAgICAgIF9ieXRlT2Zmc2V0ID0gc3RhcnQgLSA0OwogICAgfQogICAgX2J5dGVPZmZzZXQgPSBzYXZlZEJ5dGVPZmZzZXQ7CiAgICByZXR1cm4gbmV3IExpc3QuZnJvbShpbmRleC5yZXZlcnNlZCk7CiAgfQoKICAvLy8gRGVzZXJpYWxpemVzIGEga2VybmVsIGNvbXBvbmVudCBhbmQgc3RvcmVzIGl0IGluIFtjb21wb25lbnRdLgogIC8vLwogIC8vLyBXaGVuIGxpbmtpbmcgd2l0aCBhIG5vbi1lbXB0eSBjb21wb25lbnQsIGNhbm9uaWNhbCBuYW1lcyBtdXN0IGhhdmUgYmVlbgogIC8vLyBjb21wdXRlZCBhaGVhZCBvZiB0aW1lLgogIC8vLwogIC8vLyBUaGUgaW5wdXQgYnl0ZXMgbWF5IGNvbnRhaW4gbXVsdGlwbGUgZmlsZXMgY29uY2F0ZW5hdGVkLgogIHZvaWQgcmVhZENvbXBvbmVudChDb21wb25lbnQgY29tcG9uZW50LCB7Ym9vbCBjaGVja0Nhbm9uaWNhbE5hbWVzOiBmYWxzZX0pIHsKICAgIC8vIENoZWNrIHRoYXQgd2UgaGF2ZSBhIC5kaWxsIGZpbGUgYW5kIGl0IGhhcyB0aGUgY29ycmVjdCB2ZXJzaW9uIGJlZm9yZSB3ZQogICAgLy8gc3RhcnQgZGVjb2RpbmcgaXQuICBPdGhlcndpc2Ugd2Ugd2lsbCBmYWlsIGZvciBjcnlwdGljIHJlYXNvbnMuCiAgICBpbnQgb2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBpbnQgbWFnaWMgPSByZWFkVWludDMyKCk7CiAgICBpZiAobWFnaWMgIT0gVGFnLkNvbXBvbmVudEZpbGUpIHsKICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcignTm90IGEgLmRpbGwgZmlsZSAod3JvbmcgbWFnaWMgbnVtYmVyKS4nKTsKICAgIH0KICAgIGludCB2ZXJzaW9uID0gcmVhZFVpbnQzMigpOwogICAgaWYgKHZlcnNpb24gIT0gVGFnLkJpbmFyeUZvcm1hdFZlcnNpb24pIHsKICAgICAgdGhyb3cgSW52YWxpZEtlcm5lbFZlcnNpb25FcnJvcih2ZXJzaW9uKTsKICAgIH0KICAgIF9ieXRlT2Zmc2V0ID0gb2Zmc2V0OwogICAgTGlzdDxpbnQ+IGNvbXBvbmVudEZpbGVTaXplcyA9IF9pbmRleENvbXBvbmVudHMoKTsKICAgIGlmIChjb21wb25lbnRGaWxlU2l6ZXMubGVuZ3RoID4gMSkgewogICAgICBfZGlzYWJsZUxhenlSZWFkaW5nID0gdHJ1ZTsKICAgIH0KICAgIGludCBjb21wb25lbnRGaWxlSW5kZXggPSAwOwogICAgd2hpbGUgKF9ieXRlT2Zmc2V0IDwgX2J5dGVzLmxlbmd0aCkgewogICAgICBfcmVhZE9uZUNvbXBvbmVudChjb21wb25lbnQsIGNvbXBvbmVudEZpbGVTaXplc1tjb21wb25lbnRGaWxlSW5kZXhdKTsKICAgICAgKytjb21wb25lbnRGaWxlSW5kZXg7CiAgICB9CgogICAgaWYgKGNoZWNrQ2Fub25pY2FsTmFtZXMpIHsKICAgICAgX2NoZWNrQ2Fub25pY2FsTmFtZUNoaWxkcmVuKGNvbXBvbmVudC5yb290KTsKICAgIH0KICB9CgogIC8vLyBEZXNlcmlhbGl6ZXMgdGhlIHNvdXJjZSBhbmQgc3RvcmVzIGl0IGluIFtjb21wb25lbnRdLgogIC8vLwogIC8vLyBUaGUgaW5wdXQgYnl0ZXMgbWF5IGNvbnRhaW4gbXVsdGlwbGUgZmlsZXMgY29uY2F0ZW5hdGVkLgogIHZvaWQgcmVhZENvbXBvbmVudFNvdXJjZShDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBMaXN0PGludD4gY29tcG9uZW50RmlsZVNpemVzID0gX2luZGV4Q29tcG9uZW50cygpOwogICAgaWYgKGNvbXBvbmVudEZpbGVTaXplcy5sZW5ndGggPiAxKSB7CiAgICAgIF9kaXNhYmxlTGF6eVJlYWRpbmcgPSB0cnVlOwogICAgfQogICAgaW50IGNvbXBvbmVudEZpbGVJbmRleCA9IDA7CiAgICB3aGlsZSAoX2J5dGVPZmZzZXQgPCBfYnl0ZXMubGVuZ3RoKSB7CiAgICAgIF9yZWFkT25lQ29tcG9uZW50U291cmNlKAogICAgICAgICAgY29tcG9uZW50LCBjb21wb25lbnRGaWxlU2l6ZXNbY29tcG9uZW50RmlsZUluZGV4XSk7CiAgICAgICsrY29tcG9uZW50RmlsZUluZGV4OwogICAgfQogIH0KCiAgLy8vIFJlYWRzIGEgc2luZ2xlIGNvbXBvbmVudCBmaWxlIGZyb20gdGhlIGlucHV0IGFuZCBsb2FkcyBpdCBpbnRvIFtjb21wb25lbnRdLAogIC8vLyBvdmVyd3JpdGluZyBhbmQgcmV1c2luZyBhbnkgZXhpc3RpbmcgZGF0YSBpbiB0aGUgY29tcG9uZW50LgogIC8vLwogIC8vLyBXaGVuIGxpbmtpbmcgd2l0aCBhIG5vbi1lbXB0eSBjb21wb25lbnQsIGNhbm9uaWNhbCBuYW1lcyBtdXN0IGhhdmUgYmVlbgogIC8vLyBjb21wdXRlZCBhaGVhZCBvZiB0aW1lLgogIC8vLwogIC8vLyBUaGlzIHNob3VsZCAqb25seSogYmUgdXNlZCB3aGVuIHRoZXJlIGlzIGEgcmVhc29uIHRvIG5vdCBhbGxvdwogIC8vLyBjb25jYXRlbmF0ZWQgZmlsZXMuCiAgdm9pZCByZWFkU2luZ2xlRmlsZUNvbXBvbmVudChDb21wb25lbnQgY29tcG9uZW50LAogICAgICB7Ym9vbCBjaGVja0Nhbm9uaWNhbE5hbWVzOiBmYWxzZX0pIHsKICAgIExpc3Q8aW50PiBjb21wb25lbnRGaWxlU2l6ZXMgPSBfaW5kZXhDb21wb25lbnRzKCk7CiAgICBpZiAoY29tcG9uZW50RmlsZVNpemVzLmlzRW1wdHkpIHRocm93IGZhaWwoImludmFsaWQgY29tcG9uZW50IGRhdGEiKTsKICAgIF9yZWFkT25lQ29tcG9uZW50KGNvbXBvbmVudCwgY29tcG9uZW50RmlsZVNpemVzWzBdKTsKICAgIGlmIChfYnl0ZU9mZnNldCA8IF9ieXRlcy5sZW5ndGgpIHsKICAgICAgaWYgKF9ieXRlT2Zmc2V0ICsgMyA8IF9ieXRlcy5sZW5ndGgpIHsKICAgICAgICBpbnQgbWFnaWMgPSByZWFkVWludDMyKCk7CiAgICAgICAgaWYgKG1hZ2ljID09IFRhZy5Db21wb25lbnRGaWxlKSB7CiAgICAgICAgICB0aHJvdyAnQ29uY2F0ZW5hdGVkIGNvbXBvbmVudCBmaWxlIGdpdmVuIHdoZW4gYSBzaW5nbGUgY29tcG9uZW50ICcKICAgICAgICAgICAgICAnd2FzIGV4cGVjdGVkLic7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRocm93ICdVbnJlY29nbml6ZWQgYnl0ZXMgZm9sbG93aW5nIGNvbXBvbmVudCBkYXRhJzsKICAgIH0KCiAgICBpZiAoY2hlY2tDYW5vbmljYWxOYW1lcykgewogICAgICBfY2hlY2tDYW5vbmljYWxOYW1lQ2hpbGRyZW4oY29tcG9uZW50LnJvb3QpOwogICAgfQogIH0KCiAgdm9pZCBfY2hlY2tDYW5vbmljYWxOYW1lQ2hpbGRyZW4oQ2Fub25pY2FsTmFtZSBwYXJlbnQpIHsKICAgIEl0ZXJhYmxlPENhbm9uaWNhbE5hbWU+IHBhcmVudENoaWxkcmVuID0gcGFyZW50LmNoaWxkcmVuT3JOdWxsOwogICAgaWYgKHBhcmVudENoaWxkcmVuICE9IG51bGwpIHsKICAgICAgZm9yIChDYW5vbmljYWxOYW1lIGNoaWxkIGluIHBhcmVudENoaWxkcmVuKSB7CiAgICAgICAgaWYgKGNoaWxkLm5hbWUgIT0gJ0BtZXRob2RzJyAmJgogICAgICAgICAgICBjaGlsZC5uYW1lICE9ICdAdHlwZWRlZnMnICYmCiAgICAgICAgICAgIGNoaWxkLm5hbWUgIT0gJ0BmaWVsZHMnICYmCiAgICAgICAgICAgIGNoaWxkLm5hbWUgIT0gJ0BnZXR0ZXJzJyAmJgogICAgICAgICAgICBjaGlsZC5uYW1lICE9ICdAc2V0dGVycycgJiYKICAgICAgICAgICAgY2hpbGQubmFtZSAhPSAnQGZhY3RvcmllcycgJiYKICAgICAgICAgICAgY2hpbGQubmFtZSAhPSAnQGNvbnN0cnVjdG9ycycpIHsKICAgICAgICAgIGJvb2wgY2hlY2tSZWZlcmVuY2VOb2RlID0gdHJ1ZTsKICAgICAgICAgIGlmIChjaGlsZC5yZWZlcmVuY2UgPT0gbnVsbCkgewogICAgICAgICAgICAvLyBPSyBmb3IgImlmIHByaXZhdGU6IFVSSSBvZiBsaWJyYXJ5IiBwYXJ0IG9mICJRdWFsaWZpZWQgbmFtZSIuLi4KICAgICAgICAgICAgSXRlcmFibGU8Q2Fub25pY2FsTmFtZT4gY2hpbGRyZW4gPSBjaGlsZC5jaGlsZHJlbk9yTnVsbDsKICAgICAgICAgICAgaWYgKHBhcmVudC5wYXJlbnQgIT0gbnVsbCAmJgogICAgICAgICAgICAgICAgY2hpbGRyZW4gIT0gbnVsbCAmJgogICAgICAgICAgICAgICAgY2hpbGRyZW4uaXNOb3RFbXB0eSAmJgogICAgICAgICAgICAgICAgY2hpbGRyZW4uZmlyc3QubmFtZS5zdGFydHNXaXRoKCJfIikpIHsKICAgICAgICAgICAgICAvLyBPSyB0aGVuLgogICAgICAgICAgICAgIGNoZWNrUmVmZXJlbmNlTm9kZSA9IGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRocm93IG5ldyBDYW5vbmljYWxOYW1lRXJyb3IoCiAgICAgICAgICAgICAgICAgICJOdWxsIHJlZmVyZW5jZSAoJHtjaGlsZC5uYW1lfSkgKCRjaGlsZCkuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChjaGVja1JlZmVyZW5jZU5vZGUpIHsKICAgICAgICAgICAgaWYgKGNoaWxkLnJlZmVyZW5jZS5jYW5vbmljYWxOYW1lICE9IGNoaWxkKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IENhbm9uaWNhbE5hbWVFcnJvcigKICAgICAgICAgICAgICAgICAgIkNhbm9uaWNhbCBuYW1lIGFuZCByZWZlcmVuY2UgZG9lc24ndCBhZ3JlZS4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hpbGQucmVmZXJlbmNlLm5vZGUgPT0gbnVsbCkgewogICAgICAgICAgICAgIHRocm93IG5ldyBDYW5vbmljYWxOYW1lRXJyb3IoCiAgICAgICAgICAgICAgICAgICJSZWZlcmVuY2UgaXMgbnVsbCAoJHtjaGlsZC5uYW1lfSkgKCRjaGlsZCkuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgX2NoZWNrQ2Fub25pY2FsTmFtZUNoaWxkcmVuKGNoaWxkKTsKICAgICAgfQogICAgfQogIH0KCiAgX0NvbXBvbmVudEluZGV4IF9yZWFkQ29tcG9uZW50SW5kZXgoaW50IGNvbXBvbmVudEZpbGVTaXplKSB7CiAgICBpbnQgc2F2ZWRCeXRlSW5kZXggPSBfYnl0ZU9mZnNldDsKCiAgICBfQ29tcG9uZW50SW5kZXggcmVzdWx0ID0gbmV3IF9Db21wb25lbnRJbmRleCgpOwoKICAgIC8vIFRoZXJlIGFyZSB0d28gZmllbGRzOiBmaWxlIHNpemUgYW5kIGxpYnJhcnkgY291bnQuCiAgICBfYnl0ZU9mZnNldCA9IF9jb21wb25lbnRTdGFydE9mZnNldCArIGNvbXBvbmVudEZpbGVTaXplIC0gKDIpICogNDsKICAgIHJlc3VsdC5saWJyYXJ5Q291bnQgPSByZWFkVWludDMyKCk7CiAgICAvLyBMaWJyYXJ5IG9mZnNldHMgYXJlIHVzZWQgZm9yIHN0YXJ0IGFuZCBlbmQgb2Zmc2V0cywgc28gdGhlcmUgaXMgb25lIGV4dHJhCiAgICAvLyBlbGVtZW50IHRoYXQgdGhpcyB0aGUgZW5kIG9mZnNldCBvZiB0aGUgbGFzdCBsaWJyYXJ5CiAgICByZXN1bHQubGlicmFyeU9mZnNldHMgPSBuZXcgTGlzdDxpbnQ+KHJlc3VsdC5saWJyYXJ5Q291bnQgKyAxKTsKICAgIHJlc3VsdC5jb21wb25lbnRGaWxlU2l6ZUluQnl0ZXMgPSByZWFkVWludDMyKCk7CiAgICBpZiAocmVzdWx0LmNvbXBvbmVudEZpbGVTaXplSW5CeXRlcyAhPSBjb21wb25lbnRGaWxlU2l6ZSkgewogICAgICB0aHJvdyAnTWFsZm9ybWVkIGJpbmFyeTogVGhpcyBjb21wb25lbnQgZmlsZVwncyBjb21wb25lbnQgaW5kZXggaW5kaWNhdGVzIHRoYXQnCiAgICAgICAgICAnIHRoZSBmaWxlc2l6ZSBzaG91bGQgYmUgJGNvbXBvbmVudEZpbGVTaXplIGJ1dCBvdGhlciBjb21wb25lbnQgaW5kZXhlcycKICAgICAgICAgICcgaGFzIGluZGljYXRlZCB0aGF0IHRoZSBzaXplIHNob3VsZCBiZSAnCiAgICAgICAgICAnJHtyZXN1bHQuY29tcG9uZW50RmlsZVNpemVJbkJ5dGVzfS4nOwogICAgfQoKICAgIC8vIFNraXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBpbmRleC4KICAgIF9ieXRlT2Zmc2V0IC09CiAgICAgICAgKChyZXN1bHQubGlicmFyeUNvdW50ICsgMSkgKyBfQ29tcG9uZW50SW5kZXgubnVtYmVyT2ZGaXhlZEZpZWxkcykgKiA0OwoKICAgIC8vIE5vdyByZWFkIHRoZSBjb21wb25lbnQgaW5kZXguCiAgICByZXN1bHQuYmluYXJ5T2Zmc2V0Rm9yU291cmNlVGFibGUgPSBfY29tcG9uZW50U3RhcnRPZmZzZXQgKyByZWFkVWludDMyKCk7CiAgICByZXN1bHQuYmluYXJ5T2Zmc2V0Rm9yQ2Fub25pY2FsTmFtZXMgPSBfY29tcG9uZW50U3RhcnRPZmZzZXQgKyByZWFkVWludDMyKCk7CiAgICByZXN1bHQuYmluYXJ5T2Zmc2V0Rm9yTWV0YWRhdGFQYXlsb2FkcyA9CiAgICAgICAgX2NvbXBvbmVudFN0YXJ0T2Zmc2V0ICsgcmVhZFVpbnQzMigpOwogICAgcmVzdWx0LmJpbmFyeU9mZnNldEZvck1ldGFkYXRhTWFwcGluZ3MgPQogICAgICAgIF9jb21wb25lbnRTdGFydE9mZnNldCArIHJlYWRVaW50MzIoKTsKICAgIHJlc3VsdC5iaW5hcnlPZmZzZXRGb3JTdHJpbmdUYWJsZSA9IF9jb21wb25lbnRTdGFydE9mZnNldCArIHJlYWRVaW50MzIoKTsKICAgIHJlc3VsdC5iaW5hcnlPZmZzZXRGb3JDb25zdGFudFRhYmxlID0gX2NvbXBvbmVudFN0YXJ0T2Zmc2V0ICsgcmVhZFVpbnQzMigpOwogICAgcmVzdWx0Lm1haW5NZXRob2RSZWZlcmVuY2UgPSByZWFkVWludDMyKCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5saWJyYXJ5Q291bnQgKyAxOyArK2kpIHsKICAgICAgcmVzdWx0LmxpYnJhcnlPZmZzZXRzW2ldID0gX2NvbXBvbmVudFN0YXJ0T2Zmc2V0ICsgcmVhZFVpbnQzMigpOwogICAgfQoKICAgIF9ieXRlT2Zmc2V0ID0gc2F2ZWRCeXRlSW5kZXg7CgogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgX3JlYWRPbmVDb21wb25lbnRTb3VyY2UoQ29tcG9uZW50IGNvbXBvbmVudCwgaW50IGNvbXBvbmVudEZpbGVTaXplKSB7CiAgICBfY29tcG9uZW50U3RhcnRPZmZzZXQgPSBfYnl0ZU9mZnNldDsKCiAgICBmaW5hbCBpbnQgbWFnaWMgPSByZWFkVWludDMyKCk7CiAgICBpZiAobWFnaWMgIT0gVGFnLkNvbXBvbmVudEZpbGUpIHsKICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcignTm90IGEgLmRpbGwgZmlsZSAod3JvbmcgbWFnaWMgbnVtYmVyKS4nKTsKICAgIH0KCiAgICBmaW5hbCBpbnQgZm9ybWF0VmVyc2lvbiA9IHJlYWRVaW50MzIoKTsKICAgIGlmIChmb3JtYXRWZXJzaW9uICE9IFRhZy5CaW5hcnlGb3JtYXRWZXJzaW9uKSB7CiAgICAgIHRocm93IEludmFsaWRLZXJuZWxWZXJzaW9uRXJyb3IoZm9ybWF0VmVyc2lvbik7CiAgICB9CgogICAgLy8gUmVhZCBjb21wb25lbnQgaW5kZXggZnJvbSB0aGUgZW5kIG9mIHRoaXMgQ29tcG9uZW50RmlsZXMgc2VyaWFsaXplZCBkYXRhLgogICAgX0NvbXBvbmVudEluZGV4IGluZGV4ID0gX3JlYWRDb21wb25lbnRJbmRleChjb21wb25lbnRGaWxlU2l6ZSk7CgogICAgX2J5dGVPZmZzZXQgPSBpbmRleC5iaW5hcnlPZmZzZXRGb3JTb3VyY2VUYWJsZTsKICAgIE1hcDxVcmksIFNvdXJjZT4gdXJpVG9Tb3VyY2UgPSByZWFkVXJpVG9Tb3VyY2UoKTsKICAgIGNvbXBvbmVudC51cmlUb1NvdXJjZS5hZGRBbGwodXJpVG9Tb3VyY2UpOwoKICAgIF9ieXRlT2Zmc2V0ID0gX2NvbXBvbmVudFN0YXJ0T2Zmc2V0ICsgY29tcG9uZW50RmlsZVNpemU7CiAgfQoKICB2b2lkIF9yZWFkT25lQ29tcG9uZW50KENvbXBvbmVudCBjb21wb25lbnQsIGludCBjb21wb25lbnRGaWxlU2l6ZSkgewogICAgX2NvbXBvbmVudFN0YXJ0T2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CgogICAgZmluYWwgaW50IG1hZ2ljID0gcmVhZFVpbnQzMigpOwogICAgaWYgKG1hZ2ljICE9IFRhZy5Db21wb25lbnRGaWxlKSB7CiAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoJ05vdCBhIC5kaWxsIGZpbGUgKHdyb25nIG1hZ2ljIG51bWJlcikuJyk7CiAgICB9CgogICAgZmluYWwgaW50IGZvcm1hdFZlcnNpb24gPSByZWFkVWludDMyKCk7CiAgICBpZiAoZm9ybWF0VmVyc2lvbiAhPSBUYWcuQmluYXJ5Rm9ybWF0VmVyc2lvbikgewogICAgICB0aHJvdyBJbnZhbGlkS2VybmVsVmVyc2lvbkVycm9yKGZvcm1hdFZlcnNpb24pOwogICAgfQoKICAgIExpc3Q8U3RyaW5nPiBwcm9ibGVtc0FzSnNvbiA9IHJlYWRMaXN0T2ZTdHJpbmdzKCk7CiAgICBpZiAocHJvYmxlbXNBc0pzb24gIT0gbnVsbCkgewogICAgICBjb21wb25lbnQucHJvYmxlbXNBc0pzb24gPz89IDxTdHJpbmc+W107CiAgICAgIGNvbXBvbmVudC5wcm9ibGVtc0FzSnNvbi5hZGRBbGwocHJvYmxlbXNBc0pzb24pOwogICAgfQoKICAgIC8vIFJlYWQgY29tcG9uZW50IGluZGV4IGZyb20gdGhlIGVuZCBvZiB0aGlzIENvbXBvbmVudEZpbGVzIHNlcmlhbGl6ZWQgZGF0YS4KICAgIF9Db21wb25lbnRJbmRleCBpbmRleCA9IF9yZWFkQ29tcG9uZW50SW5kZXgoY29tcG9uZW50RmlsZVNpemUpOwoKICAgIF9ieXRlT2Zmc2V0ID0gaW5kZXguYmluYXJ5T2Zmc2V0Rm9yU3RyaW5nVGFibGU7CiAgICByZWFkU3RyaW5nVGFibGUoX3N0cmluZ1RhYmxlKTsKCiAgICBfYnl0ZU9mZnNldCA9IGluZGV4LmJpbmFyeU9mZnNldEZvckNhbm9uaWNhbE5hbWVzOwogICAgcmVhZExpbmtUYWJsZShjb21wb25lbnQucm9vdCk7CgogICAgLy8gVE9ETyhhbGV4bWFya292KTogcmV2ZXJzZSBtZXRhZGF0YSBtYXBwaW5ncyBhbmQgcmVhZCBmb3J3YXJkcwogICAgX2J5dGVPZmZzZXQgPSBpbmRleC5iaW5hcnlPZmZzZXRGb3JTdHJpbmdUYWJsZTsgLy8gUmVhZCBiYWNrd2FyZHMuCiAgICBfcmVhZE1ldGFkYXRhTWFwcGluZ3MoY29tcG9uZW50LCBpbmRleC5iaW5hcnlPZmZzZXRGb3JNZXRhZGF0YVBheWxvYWRzKTsKCiAgICBfYXNzb2NpYXRlTWV0YWRhdGEoY29tcG9uZW50LCBfY29tcG9uZW50U3RhcnRPZmZzZXQpOwoKICAgIF9ieXRlT2Zmc2V0ID0gaW5kZXguYmluYXJ5T2Zmc2V0Rm9yU291cmNlVGFibGU7CiAgICBNYXA8VXJpLCBTb3VyY2U+IHVyaVRvU291cmNlID0gcmVhZFVyaVRvU291cmNlKCk7CiAgICBjb21wb25lbnQudXJpVG9Tb3VyY2UuYWRkQWxsKHVyaVRvU291cmNlKTsKCiAgICBfYnl0ZU9mZnNldCA9IGluZGV4LmJpbmFyeU9mZnNldEZvckNvbnN0YW50VGFibGU7CiAgICByZWFkQ29uc3RhbnRUYWJsZSgpOwoKICAgIGludCBudW1iZXJPZkxpYnJhcmllcyA9IGluZGV4LmxpYnJhcnlDb3VudDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZMaWJyYXJpZXM7ICsraSkgewogICAgICBfYnl0ZU9mZnNldCA9IGluZGV4LmxpYnJhcnlPZmZzZXRzW2ldOwogICAgICByZWFkTGlicmFyeShjb21wb25lbnQsIGluZGV4LmxpYnJhcnlPZmZzZXRzW2kgKyAxXSk7CiAgICB9CgogICAgdmFyIG1haW5NZXRob2QgPQogICAgICAgIGdldE1lbWJlclJlZmVyZW5jZUZyb21JbnQoaW5kZXgubWFpbk1ldGhvZFJlZmVyZW5jZSwgYWxsb3dOdWxsOiB0cnVlKTsKICAgIGNvbXBvbmVudC5tYWluTWV0aG9kTmFtZSA/Pz0gbWFpbk1ldGhvZDsKCiAgICBfYnl0ZU9mZnNldCA9IF9jb21wb25lbnRTdGFydE9mZnNldCArIGNvbXBvbmVudEZpbGVTaXplOwogIH0KCiAgLy8vIFJlYWQgYSBsaXN0IG9mIHN0cmluZ3MuIElmIHRoZSBsaXN0IGlzIGVtcHR5LCBbbnVsbF0gaXMgcmV0dXJuZWQuCiAgTGlzdDxTdHJpbmc+IHJlYWRMaXN0T2ZTdHJpbmdzKCkgewogICAgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBudWxsOwogICAgTGlzdDxTdHJpbmc+IHN0cmluZ3MgPQogICAgICAgIG5ldyBMaXN0PFN0cmluZz4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBTdHJpbmcgcyA9IGNvbnN0IFV0ZjhEZWNvZGVyKCkuY29udmVydChyZWFkQnl0ZUxpc3QoKSk7CiAgICAgIHN0cmluZ3NbaV0gPSBzOwogICAgfQogICAgcmV0dXJuIHN0cmluZ3M7CiAgfQoKICBNYXA8VXJpLCBTb3VyY2U+IHJlYWRVcmlUb1NvdXJjZSgpIHsKICAgIGludCBsZW5ndGggPSByZWFkVWludDMyKCk7CgogICAgLy8gUmVhZCBkYXRhLgogICAgX3NvdXJjZVVyaVRhYmxlLmxlbmd0aCA9IGxlbmd0aDsKICAgIE1hcDxVcmksIFNvdXJjZT4gdXJpVG9Tb3VyY2UgPSA8VXJpLCBTb3VyY2U+e307CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIExpc3Q8aW50PiB1cmlCeXRlcyA9IHJlYWRCeXRlTGlzdCgpOwogICAgICBVcmkgdXJpID0gdXJpQnl0ZXMuaXNFbXB0eQogICAgICAgICAgPyBudWxsCiAgICAgICAgICA6IFVyaS5wYXJzZShjb25zdCBVdGY4RGVjb2RlcigpLmNvbnZlcnQodXJpQnl0ZXMpKTsKICAgICAgX3NvdXJjZVVyaVRhYmxlW2ldID0gdXJpOwogICAgICBMaXN0PGludD4gc291cmNlQ29kZSA9IHJlYWRCeXRlTGlzdCgpOwogICAgICBpbnQgbGluZUNvdW50ID0gcmVhZFVJbnQoKTsKICAgICAgTGlzdDxpbnQ+IGxpbmVTdGFydHMgPSBuZXcgTGlzdDxpbnQ+KGxpbmVDb3VudCk7CiAgICAgIGludCBwcmV2aW91c0xpbmVTdGFydCA9IDA7CiAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGluZUNvdW50OyArK2opIHsKICAgICAgICBpbnQgbGluZVN0YXJ0ID0gcmVhZFVJbnQoKSArIHByZXZpb3VzTGluZVN0YXJ0OwogICAgICAgIGxpbmVTdGFydHNbal0gPSBsaW5lU3RhcnQ7CiAgICAgICAgcHJldmlvdXNMaW5lU3RhcnQgPSBsaW5lU3RhcnQ7CiAgICAgIH0KICAgICAgTGlzdDxpbnQ+IGltcG9ydFVyaUJ5dGVzID0gcmVhZEJ5dGVMaXN0KCk7CiAgICAgIFVyaSBpbXBvcnRVcmkgPSBpbXBvcnRVcmlCeXRlcy5pc0VtcHR5CiAgICAgICAgICA/IG51bGwKICAgICAgICAgIDogVXJpLnBhcnNlKGNvbnN0IFV0ZjhEZWNvZGVyKCkuY29udmVydChpbXBvcnRVcmlCeXRlcykpOwogICAgICB1cmlUb1NvdXJjZVt1cmldID0gbmV3IFNvdXJjZShsaW5lU3RhcnRzLCBzb3VyY2VDb2RlLCBpbXBvcnRVcmksIHVyaSk7CiAgICB9CgogICAgLy8gUmVhZCBpbmRleC4KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgcmVhZFVpbnQzMigpOwogICAgfQogICAgcmV0dXJuIHVyaVRvU291cmNlOwogIH0KCiAgQ2Fub25pY2FsTmFtZSByZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZSgpIHsKICAgIHZhciBpbmRleCA9IHJlYWRVSW50KCk7CiAgICBpZiAoaW5kZXggPT0gMCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gX2xpbmtUYWJsZVtpbmRleCAtIDFdOwogIH0KCiAgQ2Fub25pY2FsTmFtZSBnZXRDYW5vbmljYWxOYW1lUmVmZXJlbmNlRnJvbUludChpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA9PSAwKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBfbGlua1RhYmxlW2luZGV4IC0gMV07CiAgfQoKICBSZWZlcmVuY2UgcmVhZExpYnJhcnlSZWZlcmVuY2Uoe2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIENhbm9uaWNhbE5hbWUgY2Fub25pY2FsTmFtZSA9IHJlYWRDYW5vbmljYWxOYW1lUmVmZXJlbmNlKCk7CiAgICBpZiAoY2Fub25pY2FsTmFtZSAhPSBudWxsKSByZXR1cm4gY2Fub25pY2FsTmFtZS5nZXRSZWZlcmVuY2UoKTsKICAgIGlmIChhbGxvd051bGwpIHJldHVybiBudWxsOwogICAgdGhyb3cgJ0V4cGVjdGVkIGEgbGlicmFyeSByZWZlcmVuY2UgdG8gYmUgdmFsaWQgYnV0IHdhcyBgbnVsbGAuJzsKICB9CgogIExpYnJhcnlEZXBlbmRlbmN5IHJlYWRMaWJyYXJ5RGVwZW5kZW5jeVJlZmVyZW5jZSgpIHsKICAgIGludCBpbmRleCA9IHJlYWRVSW50KCk7CiAgICByZXR1cm4gX2N1cnJlbnRMaWJyYXJ5LmRlcGVuZGVuY2llc1tpbmRleF07CiAgfQoKICBSZWZlcmVuY2UgcmVhZENsYXNzUmVmZXJlbmNlKHtib29sIGFsbG93TnVsbDogZmFsc2V9KSB7CiAgICB2YXIgbmFtZSA9IHJlYWRDYW5vbmljYWxOYW1lUmVmZXJlbmNlKCk7CiAgICBpZiAobmFtZSA9PSBudWxsICYmICFhbGxvd051bGwpIHsKICAgICAgdGhyb3cgJ0V4cGVjdGVkIGEgY2xhc3MgcmVmZXJlbmNlIHRvIGJlIHZhbGlkIGJ1dCB3YXMgYG51bGxgLic7CiAgICB9CiAgICByZXR1cm4gbmFtZT8uZ2V0UmVmZXJlbmNlKCk7CiAgfQoKICBSZWZlcmVuY2UgcmVhZE1lbWJlclJlZmVyZW5jZSh7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgdmFyIG5hbWUgPSByZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZSgpOwogICAgaWYgKG5hbWUgPT0gbnVsbCAmJiAhYWxsb3dOdWxsKSB7CiAgICAgIHRocm93ICdFeHBlY3RlZCBhIG1lbWJlciByZWZlcmVuY2UgdG8gYmUgdmFsaWQgYnV0IHdhcyBgbnVsbGAuJzsKICAgIH0KICAgIHJldHVybiBuYW1lPy5nZXRSZWZlcmVuY2UoKTsKICB9CgogIFJlZmVyZW5jZSBnZXRNZW1iZXJSZWZlcmVuY2VGcm9tSW50KGludCBpbmRleCwge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIHZhciBuYW1lID0gZ2V0Q2Fub25pY2FsTmFtZVJlZmVyZW5jZUZyb21JbnQoaW5kZXgpOwogICAgaWYgKG5hbWUgPT0gbnVsbCAmJiAhYWxsb3dOdWxsKSB7CiAgICAgIHRocm93ICdFeHBlY3RlZCBhIG1lbWJlciByZWZlcmVuY2UgdG8gYmUgdmFsaWQgYnV0IHdhcyBgbnVsbGAuJzsKICAgIH0KICAgIHJldHVybiBuYW1lPy5nZXRSZWZlcmVuY2UoKTsKICB9CgogIFJlZmVyZW5jZSByZWFkVHlwZWRlZlJlZmVyZW5jZSgpIHsKICAgIHJldHVybiByZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZSgpPy5nZXRSZWZlcmVuY2UoKTsKICB9CgogIE5hbWUgcmVhZE5hbWUoKSB7CiAgICBTdHJpbmcgdGV4dCA9IHJlYWRTdHJpbmdSZWZlcmVuY2UoKTsKICAgIGlmICh0ZXh0LmlzTm90RW1wdHkgJiYgdGV4dFswXSA9PSAnXycpIHsKICAgICAgcmV0dXJuIG5ldyBOYW1lLmJ5UmVmZXJlbmNlKHRleHQsIHJlYWRMaWJyYXJ5UmVmZXJlbmNlKCkpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBOYW1lKHRleHQpOwogICAgfQogIH0KCiAgTGlicmFyeSByZWFkTGlicmFyeShDb21wb25lbnQgY29tcG9uZW50LCBpbnQgZW5kT2Zmc2V0KSB7CiAgICAvLyBSZWFkIGluZGV4LgogICAgaW50IHNhdmVkQnl0ZU9mZnNldCA9IF9ieXRlT2Zmc2V0OwoKICAgIC8vIFRoZXJlIGlzIGEgZmllbGQgZm9yIHRoZSBwcm9jZWR1cmUgY291bnQuCiAgICBfYnl0ZU9mZnNldCA9IGVuZE9mZnNldCAtICgxKSAqIDQ7CiAgICBpbnQgcHJvY2VkdXJlQ291bnQgPSByZWFkVWludDMyKCk7CiAgICBMaXN0PGludD4gcHJvY2VkdXJlT2Zmc2V0cyA9IG5ldyBMaXN0PGludD4ocHJvY2VkdXJlQ291bnQgKyAxKTsKCiAgICAvLyBUaGVyZSBpcyBhIGZpZWxkIGZvciB0aGUgcHJvY2VkdXJlIGNvdW50LCB0aGF0IG51bWJlciArIDEgKGZvciB0aGUgZW5kKQogICAgLy8gb2Zmc2V0cywgYW5kIHRoZW4gdGhlIGNsYXNzIGNvdW50IChpLmUuIHByb2NlZHVyZSBjb3VudCArIDMgZmllbGRzKS4KICAgIF9ieXRlT2Zmc2V0ID0gZW5kT2Zmc2V0IC0gKHByb2NlZHVyZUNvdW50ICsgMykgKiA0OwogICAgaW50IGNsYXNzQ291bnQgPSByZWFkVWludDMyKCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2NlZHVyZUNvdW50ICsgMTsgaSsrKSB7CiAgICAgIHByb2NlZHVyZU9mZnNldHNbaV0gPSBfY29tcG9uZW50U3RhcnRPZmZzZXQgKyByZWFkVWludDMyKCk7CiAgICB9CiAgICBMaXN0PGludD4gY2xhc3NPZmZzZXRzID0gbmV3IExpc3Q8aW50PihjbGFzc0NvdW50ICsgMSk7CgogICAgLy8gVGhlcmUgaXMgYSBmaWVsZCBmb3IgdGhlIHByb2NlZHVyZSBjb3VudCwgdGhhdCBudW1iZXIgKyAxIChmb3IgdGhlIGVuZCkKICAgIC8vIG9mZnNldHMsIHRoZW4gdGhlIGNsYXNzIGNvdW50IGFuZCB0aGF0IG51bWJlciArIDEgKGZvciB0aGUgZW5kKSBvZmZzZXRzLgogICAgLy8gKGkuZS4gcHJvY2VkdXJlIGNvdW50ICsgY2xhc3MgY291bnQgKyA0IGZpZWxkcykuCiAgICBfYnl0ZU9mZnNldCA9IGVuZE9mZnNldCAtIChwcm9jZWR1cmVDb3VudCArIGNsYXNzQ291bnQgKyA0KSAqIDQ7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzQ291bnQgKyAxOyBpKyspIHsKICAgICAgY2xhc3NPZmZzZXRzW2ldID0gX2NvbXBvbmVudFN0YXJ0T2Zmc2V0ICsgcmVhZFVpbnQzMigpOwogICAgfQogICAgX2J5dGVPZmZzZXQgPSBzYXZlZEJ5dGVPZmZzZXQ7CgogICAgaW50IGZsYWdzID0gcmVhZEJ5dGUoKTsKICAgIGJvb2wgaXNFeHRlcm5hbCA9IChmbGFncyAmIExpYnJhcnkuRXh0ZXJuYWxGbGFnKSAhPSAwOwogICAgX2lzUmVhZGluZ0xpYnJhcnlJbXBsZW1lbnRhdGlvbiA9ICFpc0V4dGVybmFsOwogICAgdmFyIGNhbm9uaWNhbE5hbWUgPSByZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZSgpOwogICAgUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNhbm9uaWNhbE5hbWUuZ2V0UmVmZXJlbmNlKCk7CiAgICBMaWJyYXJ5IGxpYnJhcnkgPSByZWZlcmVuY2Uubm9kZTsKICAgIGJvb2wgc2hvdWxkV3JpdGVEYXRhID0gbGlicmFyeSA9PSBudWxsIHx8IF9pc1JlYWRpbmdMaWJyYXJ5SW1wbGVtZW50YXRpb247CiAgICBpZiAobGlicmFyeSA9PSBudWxsKSB7CiAgICAgIGxpYnJhcnkgPQogICAgICAgICAgbmV3IExpYnJhcnkoVXJpLnBhcnNlKGNhbm9uaWNhbE5hbWUubmFtZSksIHJlZmVyZW5jZTogcmVmZXJlbmNlKTsKICAgICAgY29tcG9uZW50LmxpYnJhcmllcy5hZGQobGlicmFyeS4ucGFyZW50ID0gY29tcG9uZW50KTsKICAgIH0KICAgIF9jdXJyZW50TGlicmFyeSA9IGxpYnJhcnk7CiAgICBTdHJpbmcgbmFtZSA9IHJlYWRTdHJpbmdPck51bGxJZkVtcHR5KCk7CgogICAgLy8gVE9ETyhqZW5zaik6IFdlIGN1cnJlbnRseSBzYXZlIChhbG1vc3QgdGhlIHNhbWUpIHVyaSB0d2ljZS4KICAgIFVyaSBmaWxlVXJpID0gcmVhZFVyaVJlZmVyZW5jZSgpOwoKICAgIExpc3Q8U3RyaW5nPiBwcm9ibGVtc0FzSnNvbiA9IHJlYWRMaXN0T2ZTdHJpbmdzKCk7CgogICAgaWYgKHNob3VsZFdyaXRlRGF0YSkgewogICAgICBsaWJyYXJ5LmZsYWdzID0gZmxhZ3M7CiAgICAgIGxpYnJhcnkubmFtZSA9IG5hbWU7CiAgICAgIGxpYnJhcnkuZmlsZVVyaSA9IGZpbGVVcmk7CiAgICAgIGxpYnJhcnkucHJvYmxlbXNBc0pzb24gPSBwcm9ibGVtc0FzSnNvbjsKICAgIH0KCiAgICBhc3NlcnQoKCkgewogICAgICBkZWJ1Z1BhdGguYWRkKGxpYnJhcnkubmFtZSA/PyBsaWJyYXJ5LmltcG9ydFVyaT8udG9TdHJpbmcoKSA/PyAnbGlicmFyeScpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0oKSk7CgogICAgaWYgKHNob3VsZFdyaXRlRGF0YSkgewogICAgICBfZmlsbFRyZWVOb2RlTGlzdCgKICAgICAgICAgIGxpYnJhcnkuYW5ub3RhdGlvbnMsIChpbmRleCkgPT4gcmVhZEV4cHJlc3Npb24oKSwgbGlicmFyeSk7CiAgICB9IGVsc2UgewogICAgICBfc2tpcE5vZGVMaXN0KHJlYWRFeHByZXNzaW9uKTsKICAgIH0KICAgIF9yZWFkTGlicmFyeURlcGVuZGVuY2llcyhsaWJyYXJ5KTsKICAgIF9yZWFkQWRkaXRpb25hbEV4cG9ydHMobGlicmFyeSk7CiAgICBfcmVhZExpYnJhcnlQYXJ0cyhsaWJyYXJ5KTsKICAgIF9tZXJnZU5hbWVkTm9kZUxpc3QobGlicmFyeS50eXBlZGVmcywgKGluZGV4KSA9PiByZWFkVHlwZWRlZigpLCBsaWJyYXJ5KTsKCiAgICBfbWVyZ2VOYW1lZE5vZGVMaXN0KGxpYnJhcnkuY2xhc3NlcywgKGluZGV4KSB7CiAgICAgIF9ieXRlT2Zmc2V0ID0gY2xhc3NPZmZzZXRzW2luZGV4XTsKICAgICAgcmV0dXJuIHJlYWRDbGFzcyhjbGFzc09mZnNldHNbaW5kZXggKyAxXSk7CiAgICB9LCBsaWJyYXJ5KTsKICAgIF9ieXRlT2Zmc2V0ID0gY2xhc3NPZmZzZXRzLmxhc3Q7CiAgICBfbWVyZ2VOYW1lZE5vZGVMaXN0KGxpYnJhcnkuZmllbGRzLCAoaW5kZXgpID0+IHJlYWRGaWVsZCgpLCBsaWJyYXJ5KTsKICAgIF9tZXJnZU5hbWVkTm9kZUxpc3QobGlicmFyeS5wcm9jZWR1cmVzLCAoaW5kZXgpIHsKICAgICAgX2J5dGVPZmZzZXQgPSBwcm9jZWR1cmVPZmZzZXRzW2luZGV4XTsKICAgICAgcmV0dXJuIHJlYWRQcm9jZWR1cmUocHJvY2VkdXJlT2Zmc2V0c1tpbmRleCArIDFdKTsKICAgIH0sIGxpYnJhcnkpOwogICAgX2J5dGVPZmZzZXQgPSBwcm9jZWR1cmVPZmZzZXRzLmxhc3Q7CgogICAgYXNzZXJ0KCgoXykgPT4gdHJ1ZSkoZGVidWdQYXRoLnJlbW92ZUxhc3QoKSkpOwogICAgX2N1cnJlbnRMaWJyYXJ5ID0gbnVsbDsKICAgIHJldHVybiBsaWJyYXJ5OwogIH0KCiAgdm9pZCBfcmVhZExpYnJhcnlEZXBlbmRlbmNpZXMoTGlicmFyeSBsaWJyYXJ5KSB7CiAgICBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIGxpYnJhcnkuZGVwZW5kZW5jaWVzLmxlbmd0aCA9IGxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgbGlicmFyeS5kZXBlbmRlbmNpZXNbaV0gPSByZWFkTGlicmFyeURlcGVuZGVuY3kobGlicmFyeSk7CiAgICB9CiAgfQoKICBMaWJyYXJ5RGVwZW5kZW5jeSByZWFkTGlicmFyeURlcGVuZGVuY3koTGlicmFyeSBsaWJyYXJ5KSB7CiAgICB2YXIgZmlsZU9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgIHZhciBmbGFncyA9IHJlYWRCeXRlKCk7CiAgICB2YXIgYW5ub3RhdGlvbnMgPSByZWFkRXhwcmVzc2lvbkxpc3QoKTsKICAgIHZhciB0YXJnZXRMaWJyYXJ5ID0gcmVhZExpYnJhcnlSZWZlcmVuY2UoYWxsb3dOdWxsOiB0cnVlKTsKICAgIHZhciBwcmVmaXhOYW1lID0gcmVhZFN0cmluZ09yTnVsbElmRW1wdHkoKTsKICAgIHZhciBuYW1lcyA9IHJlYWRDb21iaW5hdG9yTGlzdCgpOwogICAgcmV0dXJuIG5ldyBMaWJyYXJ5RGVwZW5kZW5jeS5ieVJlZmVyZW5jZSgKICAgICAgICBmbGFncywgYW5ub3RhdGlvbnMsIHRhcmdldExpYnJhcnksIHByZWZpeE5hbWUsIG5hbWVzKQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0CiAgICAgIC4ucGFyZW50ID0gbGlicmFyeTsKICB9CgogIHZvaWQgX3JlYWRBZGRpdGlvbmFsRXhwb3J0cyhMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIGludCBudW1FeHBvcnRlZFJlZmVyZW5jZSA9IHJlYWRVSW50KCk7CiAgICBpZiAobnVtRXhwb3J0ZWRSZWZlcmVuY2UgIT0gMCkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUV4cG9ydGVkUmVmZXJlbmNlOyBpKyspIHsKICAgICAgICBDYW5vbmljYWxOYW1lIGV4cG9ydGVkTmFtZSA9IHJlYWRDYW5vbmljYWxOYW1lUmVmZXJlbmNlKCk7CiAgICAgICAgUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGV4cG9ydGVkTmFtZS5nZXRSZWZlcmVuY2UoKTsKICAgICAgICBsaWJyYXJ5LmFkZGl0aW9uYWxFeHBvcnRzLmFkZChyZWZlcmVuY2UpOwogICAgICB9CiAgICB9CiAgfQoKICBDb21iaW5hdG9yIHJlYWRDb21iaW5hdG9yKCkgewogICAgdmFyIGlzU2hvdyA9IHJlYWRCeXRlKCkgPT0gMTsKICAgIHZhciBuYW1lcyA9IHJlYWRTdHJpbmdSZWZlcmVuY2VMaXN0KCk7CiAgICByZXR1cm4gbmV3IENvbWJpbmF0b3IoaXNTaG93LCBuYW1lcyk7CiAgfQoKICBMaXN0PENvbWJpbmF0b3I+IHJlYWRDb21iaW5hdG9yTGlzdCgpIHsKICAgIGludCBsZW5ndGggPSByZWFkVUludCgpOwogICAgTGlzdDxDb21iaW5hdG9yPiByZXN1bHQgPQogICAgICAgIG5ldyBMaXN0PENvbWJpbmF0b3I+LmZpbGxlZChsZW5ndGgsIG51bGwsIGdyb3dhYmxlOiB0cnVlKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgcmVzdWx0W2ldID0gcmVhZENvbWJpbmF0b3IoKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIF9yZWFkTGlicmFyeVBhcnRzKExpYnJhcnkgbGlicmFyeSkgewogICAgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICBsaWJyYXJ5LnBhcnRzLmxlbmd0aCA9IGxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgbGlicmFyeS5wYXJ0c1tpXSA9IHJlYWRMaWJyYXJ5UGFydChsaWJyYXJ5KTsKICAgIH0KICB9CgogIExpYnJhcnlQYXJ0IHJlYWRMaWJyYXJ5UGFydChMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMgPSByZWFkRXhwcmVzc2lvbkxpc3QoKTsKICAgIFN0cmluZyBwYXJ0VXJpID0gcmVhZFN0cmluZ1JlZmVyZW5jZSgpOwogICAgcmV0dXJuIG5ldyBMaWJyYXJ5UGFydChhbm5vdGF0aW9ucywgcGFydFVyaSkuLnBhcmVudCA9IGxpYnJhcnk7CiAgfQoKICBUeXBlZGVmIHJlYWRUeXBlZGVmKCkgewogICAgdmFyIGNhbm9uaWNhbE5hbWUgPSByZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZSgpOwogICAgdmFyIHJlZmVyZW5jZSA9IGNhbm9uaWNhbE5hbWUuZ2V0UmVmZXJlbmNlKCk7CiAgICBUeXBlZGVmIG5vZGUgPSByZWZlcmVuY2Uubm9kZTsKICAgIGJvb2wgc2hvdWxkV3JpdGVEYXRhID0gbm9kZSA9PSBudWxsIHx8IF9pc1JlYWRpbmdMaWJyYXJ5SW1wbGVtZW50YXRpb247CiAgICBpZiAobm9kZSA9PSBudWxsKSB7CiAgICAgIG5vZGUgPSBuZXcgVHlwZWRlZihudWxsLCBudWxsLCByZWZlcmVuY2U6IHJlZmVyZW5jZSk7CiAgICB9CiAgICBVcmkgZmlsZVVyaSA9IHJlYWRVcmlSZWZlcmVuY2UoKTsKICAgIGludCBmaWxlT2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgU3RyaW5nIG5hbWUgPSByZWFkU3RyaW5nUmVmZXJlbmNlKCk7CiAgICBub2RlLmFubm90YXRpb25zID0gcmVhZEFubm90YXRpb25MaXN0KG5vZGUpOwogICAgcmVhZEFuZFB1c2hUeXBlUGFyYW1ldGVyTGlzdChub2RlLnR5cGVQYXJhbWV0ZXJzLCBub2RlKTsKICAgIHZhciB0eXBlID0gcmVhZERhcnRUeXBlKCk7CiAgICByZWFkQW5kUHVzaFR5cGVQYXJhbWV0ZXJMaXN0KG5vZGUudHlwZVBhcmFtZXRlcnNPZkZ1bmN0aW9uVHlwZSwgbm9kZSk7CiAgICBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmFkZEFsbChyZWFkQW5kUHVzaFZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KCkpOwogICAgbm9kZS5uYW1lZFBhcmFtZXRlcnMuYWRkQWxsKHJlYWRBbmRQdXNoVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoKSk7CiAgICB0eXBlUGFyYW1ldGVyU3RhY2subGVuZ3RoID0gMDsKICAgIHZhcmlhYmxlU3RhY2subGVuZ3RoID0gMDsKICAgIGlmIChzaG91bGRXcml0ZURhdGEpIHsKICAgICAgbm9kZS5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgICAgbm9kZS5uYW1lID0gbmFtZTsKICAgICAgbm9kZS5maWxlVXJpID0gZmlsZVVyaTsKICAgICAgbm9kZS50eXBlID0gdHlwZTsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgQ2xhc3MgcmVhZENsYXNzKGludCBlbmRPZmZzZXQpIHsKICAgIGludCB0YWcgPSByZWFkQnl0ZSgpOwogICAgYXNzZXJ0KHRhZyA9PSBUYWcuQ2xhc3MpOwoKICAgIC8vIFJlYWQgaW5kZXguCiAgICBpbnQgc2F2ZWRCeXRlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICAvLyBUaGVyZSBpcyBhIGZpZWxkIGZvciB0aGUgcHJvY2VkdXJlIGNvdW50LgogICAgX2J5dGVPZmZzZXQgPSBlbmRPZmZzZXQgLSAoMSkgKiA0OwogICAgaW50IHByb2NlZHVyZUNvdW50ID0gcmVhZFVpbnQzMigpOwogICAgTGlzdDxpbnQ+IHByb2NlZHVyZU9mZnNldHMgPSBuZXcgTGlzdDxpbnQ+KHByb2NlZHVyZUNvdW50ICsgMSk7CiAgICAvLyBUaGVyZSBpcyBhIGZpZWxkIGZvciB0aGUgcHJvY2VkdXJlIGNvdW50LCB0aGF0IG51bWJlciArIDEgKGZvciB0aGUgZW5kKQogICAgLy8gb2Zmc2V0cyAoaS5lLiBwcm9jZWR1cmUgY291bnQgKyAyIGZpZWxkcykuCiAgICBfYnl0ZU9mZnNldCA9IGVuZE9mZnNldCAtIChwcm9jZWR1cmVDb3VudCArIDIpICogNDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvY2VkdXJlQ291bnQgKyAxOyBpKyspIHsKICAgICAgcHJvY2VkdXJlT2Zmc2V0c1tpXSA9IF9jb21wb25lbnRTdGFydE9mZnNldCArIHJlYWRVaW50MzIoKTsKICAgIH0KICAgIF9ieXRlT2Zmc2V0ID0gc2F2ZWRCeXRlT2Zmc2V0OwoKICAgIHZhciBjYW5vbmljYWxOYW1lID0gcmVhZENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoKTsKICAgIHZhciByZWZlcmVuY2UgPSBjYW5vbmljYWxOYW1lLmdldFJlZmVyZW5jZSgpOwogICAgQ2xhc3Mgbm9kZSA9IHJlZmVyZW5jZS5ub2RlOwogICAgYm9vbCBzaG91bGRXcml0ZURhdGEgPSBub2RlID09IG51bGwgfHwgX2lzUmVhZGluZ0xpYnJhcnlJbXBsZW1lbnRhdGlvbjsKICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgbm9kZSA9IG5ldyBDbGFzcyhyZWZlcmVuY2U6IHJlZmVyZW5jZSkuLmxldmVsID0gQ2xhc3NMZXZlbC5UZW1wb3Jhcnk7CiAgICB9CgogICAgdmFyIGZpbGVVcmkgPSByZWFkVXJpUmVmZXJlbmNlKCk7CiAgICBub2RlLnN0YXJ0RmlsZU9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgIG5vZGUuZmlsZU9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgIG5vZGUuZmlsZUVuZE9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgIGludCBmbGFncyA9IHJlYWRCeXRlKCk7CiAgICBub2RlLmZsYWdzID0gZmxhZ3MgJiB+Q2xhc3MuTGV2ZWxNYXNrOwogICAgaW50IGxldmVsSW5kZXggPSBmbGFncyAmIENsYXNzLkxldmVsTWFzazsKICAgIHZhciBsZXZlbCA9IENsYXNzTGV2ZWwudmFsdWVzW2xldmVsSW5kZXggKyAxXTsKICAgIGlmIChsZXZlbC5pbmRleCA+PSBub2RlLmxldmVsLmluZGV4KSB7CiAgICAgIG5vZGUubGV2ZWwgPSBsZXZlbDsKICAgIH0KICAgIHZhciBuYW1lID0gcmVhZFN0cmluZ09yTnVsbElmRW1wdHkoKTsKICAgIHZhciBhbm5vdGF0aW9ucyA9IHJlYWRBbm5vdGF0aW9uTGlzdChub2RlKTsKICAgIGFzc2VydCgoKSB7CiAgICAgIGRlYnVnUGF0aC5hZGQobm9kZS5uYW1lID8/ICdub3JtYWwtY2xhc3MnKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9KCkpOwogICAgcmVhZEFuZFB1c2hUeXBlUGFyYW1ldGVyTGlzdChub2RlLnR5cGVQYXJhbWV0ZXJzLCBub2RlKTsKICAgIHZhciBzdXBlcnR5cGUgPSByZWFkU3VwZXJ0eXBlT3B0aW9uKCk7CiAgICB2YXIgbWl4ZWRJblR5cGUgPSByZWFkU3VwZXJ0eXBlT3B0aW9uKCk7CiAgICBpZiAoc2hvdWxkV3JpdGVEYXRhKSB7CiAgICAgIF9maWxsTm9uVHJlZU5vZGVMaXN0KG5vZGUuaW1wbGVtZW50ZWRUeXBlcywgcmVhZFN1cGVydHlwZSk7CiAgICB9IGVsc2UgewogICAgICBfc2tpcE5vZGVMaXN0KHJlYWRTdXBlcnR5cGUpOwogICAgfQogICAgX21lcmdlTmFtZWROb2RlTGlzdChub2RlLmZpZWxkcywgKGluZGV4KSA9PiByZWFkRmllbGQoKSwgbm9kZSk7CiAgICBfbWVyZ2VOYW1lZE5vZGVMaXN0KG5vZGUuY29uc3RydWN0b3JzLCAoaW5kZXgpID0+IHJlYWRDb25zdHJ1Y3RvcigpLCBub2RlKTsKCiAgICBfbWVyZ2VOYW1lZE5vZGVMaXN0KG5vZGUucHJvY2VkdXJlcywgKGluZGV4KSB7CiAgICAgIF9ieXRlT2Zmc2V0ID0gcHJvY2VkdXJlT2Zmc2V0c1tpbmRleF07CiAgICAgIHJldHVybiByZWFkUHJvY2VkdXJlKHByb2NlZHVyZU9mZnNldHNbaW5kZXggKyAxXSk7CiAgICB9LCBub2RlKTsKICAgIF9ieXRlT2Zmc2V0ID0gcHJvY2VkdXJlT2Zmc2V0cy5sYXN0OwogICAgX21lcmdlTmFtZWROb2RlTGlzdChub2RlLnJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycywKICAgICAgICAoaW5kZXgpID0+IHJlYWRSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcigpLCBub2RlKTsKICAgIHR5cGVQYXJhbWV0ZXJTdGFjay5sZW5ndGggPSAwOwogICAgYXNzZXJ0KGRlYnVnUGF0aC5yZW1vdmVMYXN0KCkgIT0gbnVsbCk7CiAgICBpZiAoc2hvdWxkV3JpdGVEYXRhKSB7CiAgICAgIG5vZGUubmFtZSA9IG5hbWU7CiAgICAgIG5vZGUuZmlsZVVyaSA9IGZpbGVVcmk7CiAgICAgIG5vZGUuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKICAgICAgbm9kZS5zdXBlcnR5cGUgPSBzdXBlcnR5cGU7CiAgICAgIG5vZGUubWl4ZWRJblR5cGUgPSBtaXhlZEluVHlwZTsKICAgIH0KCiAgICBfYnl0ZU9mZnNldCA9IGVuZE9mZnNldDsKCiAgICByZXR1cm4gbm9kZTsKICB9CgogIGludCBnZXRBbmRSZXNldFRyYW5zZm9ybWVyRmxhZ3MoKSB7CiAgICBpbnQgZmxhZ3MgPSBfdHJhbnNmb3JtZXJGbGFnczsKICAgIF90cmFuc2Zvcm1lckZsYWdzID0gMDsKICAgIHJldHVybiBmbGFnczsKICB9CgogIC8vLyBBZGRzIHRoZSBnaXZlbiBmbGFnIHRvIHRoZSBjdXJyZW50IFtNZW1iZXIudHJhbnNmb3JtZXJGbGFnc10uCiAgdm9pZCBhZGRUcmFuc2Zvcm1lckZsYWcoaW50IGZsYWdzKSB7CiAgICBfdHJhbnNmb3JtZXJGbGFncyB8PSBmbGFnczsKICB9CgogIEZpZWxkIHJlYWRGaWVsZCgpIHsKICAgIGludCB0YWcgPSByZWFkQnl0ZSgpOwogICAgYXNzZXJ0KHRhZyA9PSBUYWcuRmllbGQpOwogICAgdmFyIGNhbm9uaWNhbE5hbWUgPSByZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZSgpOwogICAgdmFyIHJlZmVyZW5jZSA9IGNhbm9uaWNhbE5hbWUuZ2V0UmVmZXJlbmNlKCk7CiAgICBGaWVsZCBub2RlID0gcmVmZXJlbmNlLm5vZGU7CiAgICBib29sIHNob3VsZFdyaXRlRGF0YSA9IG5vZGUgPT0gbnVsbCB8fCBfaXNSZWFkaW5nTGlicmFyeUltcGxlbWVudGF0aW9uOwogICAgaWYgKG5vZGUgPT0gbnVsbCkgewogICAgICBub2RlID0gbmV3IEZpZWxkKG51bGwsIHJlZmVyZW5jZTogcmVmZXJlbmNlKTsKICAgIH0KICAgIHZhciBmaWxlVXJpID0gcmVhZFVyaVJlZmVyZW5jZSgpOwogICAgaW50IGZpbGVPZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICBpbnQgZmlsZUVuZE9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgIGludCBmbGFncyA9IHJlYWRCeXRlKCk7CiAgICB2YXIgbmFtZSA9IHJlYWROYW1lKCk7CiAgICB2YXIgYW5ub3RhdGlvbnMgPSByZWFkQW5ub3RhdGlvbkxpc3Qobm9kZSk7CiAgICBhc3NlcnQoKCkgewogICAgICBkZWJ1Z1BhdGguYWRkKG5vZGUubmFtZT8ubmFtZSA/PyAnZmllbGQnKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9KCkpOwogICAgdmFyIHR5cGUgPSByZWFkRGFydFR5cGUoKTsKICAgIHZhciBpbml0aWFsaXplciA9IHJlYWRFeHByZXNzaW9uT3B0aW9uKCk7CiAgICBpbnQgdHJhbnNmb3JtZXJGbGFncyA9IGdldEFuZFJlc2V0VHJhbnNmb3JtZXJGbGFncygpOwogICAgYXNzZXJ0KCgoXykgPT4gdHJ1ZSkoZGVidWdQYXRoLnJlbW92ZUxhc3QoKSkpOwogICAgaWYgKHNob3VsZFdyaXRlRGF0YSkgewogICAgICBub2RlLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgICBub2RlLmZpbGVFbmRPZmZzZXQgPSBmaWxlRW5kT2Zmc2V0OwogICAgICBub2RlLmZsYWdzID0gZmxhZ3M7CiAgICAgIG5vZGUubmFtZSA9IG5hbWU7CiAgICAgIG5vZGUuZmlsZVVyaSA9IGZpbGVVcmk7CiAgICAgIG5vZGUuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKICAgICAgbm9kZS50eXBlID0gdHlwZTsKICAgICAgbm9kZS5pbml0aWFsaXplciA9IGluaXRpYWxpemVyOwogICAgICBub2RlLmluaXRpYWxpemVyPy5wYXJlbnQgPSBub2RlOwogICAgICBub2RlLnRyYW5zZm9ybWVyRmxhZ3MgPSB0cmFuc2Zvcm1lckZsYWdzOwogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBDb25zdHJ1Y3RvciByZWFkQ29uc3RydWN0b3IoKSB7CiAgICBpbnQgdGFnID0gcmVhZEJ5dGUoKTsKICAgIGFzc2VydCh0YWcgPT0gVGFnLkNvbnN0cnVjdG9yKTsKICAgIHZhciBjYW5vbmljYWxOYW1lID0gcmVhZENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoKTsKICAgIHZhciByZWZlcmVuY2UgPSBjYW5vbmljYWxOYW1lLmdldFJlZmVyZW5jZSgpOwogICAgQ29uc3RydWN0b3Igbm9kZSA9IHJlZmVyZW5jZS5ub2RlOwogICAgYm9vbCBzaG91bGRXcml0ZURhdGEgPSBub2RlID09IG51bGwgfHwgX2lzUmVhZGluZ0xpYnJhcnlJbXBsZW1lbnRhdGlvbjsKICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgbm9kZSA9IG5ldyBDb25zdHJ1Y3RvcihudWxsLCByZWZlcmVuY2U6IHJlZmVyZW5jZSk7CiAgICB9CiAgICB2YXIgZmlsZVVyaSA9IHJlYWRVcmlSZWZlcmVuY2UoKTsKICAgIHZhciBzdGFydEZpbGVPZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICB2YXIgZmlsZU9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgIHZhciBmaWxlRW5kT2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgdmFyIGZsYWdzID0gcmVhZEJ5dGUoKTsKICAgIHZhciBuYW1lID0gcmVhZE5hbWUoKTsKICAgIHZhciBhbm5vdGF0aW9ucyA9IHJlYWRBbm5vdGF0aW9uTGlzdChub2RlKTsKICAgIGFzc2VydCgoKSB7CiAgICAgIGRlYnVnUGF0aC5hZGQobm9kZS5uYW1lPy5uYW1lID8/ICdjb25zdHJ1Y3RvcicpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0oKSk7CiAgICB2YXIgZnVuY3Rpb24gPSByZWFkRnVuY3Rpb25Ob2RlKCk7CiAgICBwdXNoVmFyaWFibGVEZWNsYXJhdGlvbnMoZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMpOwogICAgcHVzaFZhcmlhYmxlRGVjbGFyYXRpb25zKGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycyk7CiAgICBpZiAoc2hvdWxkV3JpdGVEYXRhKSB7CiAgICAgIF9maWxsVHJlZU5vZGVMaXN0KG5vZGUuaW5pdGlhbGl6ZXJzLCAoaW5kZXgpID0+IHJlYWRJbml0aWFsaXplcigpLCBub2RlKTsKICAgIH0gZWxzZSB7CiAgICAgIF9za2lwTm9kZUxpc3QocmVhZEluaXRpYWxpemVyKTsKICAgIH0KICAgIHZhcmlhYmxlU3RhY2subGVuZ3RoID0gMDsKICAgIHZhciB0cmFuc2Zvcm1lckZsYWdzID0gZ2V0QW5kUmVzZXRUcmFuc2Zvcm1lckZsYWdzKCk7CiAgICBhc3NlcnQoKChfKSA9PiB0cnVlKShkZWJ1Z1BhdGgucmVtb3ZlTGFzdCgpKSk7CiAgICBpZiAoc2hvdWxkV3JpdGVEYXRhKSB7CiAgICAgIG5vZGUuc3RhcnRGaWxlT2Zmc2V0ID0gc3RhcnRGaWxlT2Zmc2V0OwogICAgICBub2RlLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgICBub2RlLmZpbGVFbmRPZmZzZXQgPSBmaWxlRW5kT2Zmc2V0OwogICAgICBub2RlLmZsYWdzID0gZmxhZ3M7CiAgICAgIG5vZGUubmFtZSA9IG5hbWU7CiAgICAgIG5vZGUuZmlsZVVyaSA9IGZpbGVVcmk7CiAgICAgIG5vZGUuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKICAgICAgbm9kZS5mdW5jdGlvbiA9IGZ1bmN0aW9uLi5wYXJlbnQgPSBub2RlOwogICAgICBub2RlLnRyYW5zZm9ybWVyRmxhZ3MgPSB0cmFuc2Zvcm1lckZsYWdzOwogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBQcm9jZWR1cmUgcmVhZFByb2NlZHVyZShpbnQgZW5kT2Zmc2V0KSB7CiAgICBpbnQgdGFnID0gcmVhZEJ5dGUoKTsKICAgIGFzc2VydCh0YWcgPT0gVGFnLlByb2NlZHVyZSk7CiAgICB2YXIgY2Fub25pY2FsTmFtZSA9IHJlYWRDYW5vbmljYWxOYW1lUmVmZXJlbmNlKCk7CiAgICB2YXIgcmVmZXJlbmNlID0gY2Fub25pY2FsTmFtZS5nZXRSZWZlcmVuY2UoKTsKICAgIFByb2NlZHVyZSBub2RlID0gcmVmZXJlbmNlLm5vZGU7CiAgICBib29sIHNob3VsZFdyaXRlRGF0YSA9IG5vZGUgPT0gbnVsbCB8fCBfaXNSZWFkaW5nTGlicmFyeUltcGxlbWVudGF0aW9uOwogICAgaWYgKG5vZGUgPT0gbnVsbCkgewogICAgICBub2RlID0gbmV3IFByb2NlZHVyZShudWxsLCBudWxsLCBudWxsLCByZWZlcmVuY2U6IHJlZmVyZW5jZSk7CiAgICB9CiAgICB2YXIgZmlsZVVyaSA9IHJlYWRVcmlSZWZlcmVuY2UoKTsKICAgIHZhciBzdGFydEZpbGVPZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICB2YXIgZmlsZU9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgIHZhciBmaWxlRW5kT2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgaW50IGtpbmRJbmRleCA9IHJlYWRCeXRlKCk7CiAgICB2YXIga2luZCA9IFByb2NlZHVyZUtpbmQudmFsdWVzW2tpbmRJbmRleF07CiAgICB2YXIgZmxhZ3MgPSByZWFkQnl0ZSgpOwogICAgdmFyIG5hbWUgPSByZWFkTmFtZSgpOwogICAgdmFyIGFubm90YXRpb25zID0gcmVhZEFubm90YXRpb25MaXN0KG5vZGUpOwogICAgYXNzZXJ0KCgpIHsKICAgICAgZGVidWdQYXRoLmFkZChub2RlLm5hbWU/Lm5hbWUgPz8gJ3Byb2NlZHVyZScpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0oKSk7CiAgICBpbnQgZnVuY3Rpb25Ob2RlU2l6ZSA9IGVuZE9mZnNldCAtIF9ieXRlT2Zmc2V0OwogICAgLy8gUmVhZCBzbWFsbCBmYWN0b3JpZXMgdXAgZnJvbnQuIFBvc3Rwb25lIGV2ZXJ5dGhpbmcgZWxzZS4KICAgIGJvb2wgcmVhZEZ1bmN0aW9uTm9kZU5vdyA9CiAgICAgICAgKGtpbmQgPT0gUHJvY2VkdXJlS2luZC5GYWN0b3J5ICYmIGZ1bmN0aW9uTm9kZVNpemUgPD0gNTApIHx8CiAgICAgICAgICAgIF9kaXNhYmxlTGF6eVJlYWRpbmc7CiAgICB2YXIgZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldFJlZmVyZW5jZSA9CiAgICAgICAgcmVhZE1lbWJlclJlZmVyZW5jZShhbGxvd051bGw6IHRydWUpOwogICAgdmFyIGZvcndhcmRpbmdTdHViSW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlID0KICAgICAgICByZWFkTWVtYmVyUmVmZXJlbmNlKGFsbG93TnVsbDogdHJ1ZSk7CiAgICB2YXIgZnVuY3Rpb24gPSByZWFkRnVuY3Rpb25Ob2RlT3B0aW9uKCFyZWFkRnVuY3Rpb25Ob2RlTm93LCBlbmRPZmZzZXQpOwogICAgdmFyIHRyYW5zZm9ybWVyRmxhZ3MgPSBnZXRBbmRSZXNldFRyYW5zZm9ybWVyRmxhZ3MoKTsKICAgIGFzc2VydCgoKF8pID0+IHRydWUpKGRlYnVnUGF0aC5yZW1vdmVMYXN0KCkpKTsKICAgIGlmIChzaG91bGRXcml0ZURhdGEpIHsKICAgICAgbm9kZS5zdGFydEZpbGVPZmZzZXQgPSBzdGFydEZpbGVPZmZzZXQ7CiAgICAgIG5vZGUuZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICAgIG5vZGUuZmlsZUVuZE9mZnNldCA9IGZpbGVFbmRPZmZzZXQ7CiAgICAgIG5vZGUua2luZCA9IGtpbmQ7CiAgICAgIG5vZGUuZmxhZ3MgPSBmbGFnczsKICAgICAgbm9kZS5uYW1lID0gbmFtZTsKICAgICAgbm9kZS5maWxlVXJpID0gZmlsZVVyaTsKICAgICAgbm9kZS5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zOwogICAgICBub2RlLmZ1bmN0aW9uID0gZnVuY3Rpb247CiAgICAgIGZ1bmN0aW9uPy5wYXJlbnQgPSBub2RlOwogICAgICBub2RlLnNldFRyYW5zZm9ybWVyRmxhZ3NXaXRob3V0TGF6eUxvYWRpbmcodHJhbnNmb3JtZXJGbGFncyk7CiAgICAgIG5vZGUuZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldFJlZmVyZW5jZSA9CiAgICAgICAgICBmb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0UmVmZXJlbmNlOwogICAgICBub2RlLmZvcndhcmRpbmdTdHViSW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlID0KICAgICAgICAgIGZvcndhcmRpbmdTdHViSW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlOwoKICAgICAgYXNzZXJ0KChub2RlLmZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXRSZWZlcmVuY2UgIT0gbnVsbCkgfHwKICAgICAgICAgICEobm9kZS5pc0ZvcndhcmRpbmdTdHViICYmIG5vZGUuZnVuY3Rpb24uYm9keSAhPSBudWxsKSk7CiAgICB9CiAgICBfYnl0ZU9mZnNldCA9IGVuZE9mZnNldDsKICAgIHJldHVybiBub2RlOwogIH0KCiAgUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IgcmVhZFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yKCkgewogICAgaW50IHRhZyA9IHJlYWRCeXRlKCk7CiAgICBhc3NlcnQodGFnID09IFRhZy5SZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvcik7CiAgICB2YXIgY2Fub25pY2FsTmFtZSA9IHJlYWRDYW5vbmljYWxOYW1lUmVmZXJlbmNlKCk7CiAgICB2YXIgcmVmZXJlbmNlID0gY2Fub25pY2FsTmFtZS5nZXRSZWZlcmVuY2UoKTsKICAgIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIG5vZGUgPSByZWZlcmVuY2Uubm9kZTsKICAgIGJvb2wgc2hvdWxkV3JpdGVEYXRhID0gbm9kZSA9PSBudWxsIHx8IF9pc1JlYWRpbmdMaWJyYXJ5SW1wbGVtZW50YXRpb247CiAgICBpZiAobm9kZSA9PSBudWxsKSB7CiAgICAgIG5vZGUgPSBuZXcgUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IobnVsbCwgcmVmZXJlbmNlOiByZWZlcmVuY2UpOwogICAgfQogICAgdmFyIGZpbGVVcmkgPSByZWFkVXJpUmVmZXJlbmNlKCk7CiAgICB2YXIgZmlsZU9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgIHZhciBmaWxlRW5kT2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgdmFyIGZsYWdzID0gcmVhZEJ5dGUoKTsKICAgIHZhciBuYW1lID0gcmVhZE5hbWUoKTsKICAgIHZhciBhbm5vdGF0aW9ucyA9IHJlYWRBbm5vdGF0aW9uTGlzdChub2RlKTsKICAgIGFzc2VydCgoKSB7CiAgICAgIGRlYnVnUGF0aC5hZGQobm9kZS5uYW1lPy5uYW1lID8/ICdyZWRpcmVjdGluZy1mYWN0b3J5LWNvbnN0cnVjdG9yJyk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSgpKTsKICAgIHZhciB0YXJnZXRSZWZlcmVuY2UgPSByZWFkTWVtYmVyUmVmZXJlbmNlKCk7CiAgICB2YXIgdHlwZUFyZ3VtZW50cyA9IHJlYWREYXJ0VHlwZUxpc3QoKTsKICAgIGludCB0eXBlUGFyYW1ldGVyU3RhY2tIZWlnaHQgPSB0eXBlUGFyYW1ldGVyU3RhY2subGVuZ3RoOwogICAgdmFyIHR5cGVQYXJhbWV0ZXJzID0gcmVhZEFuZFB1c2hUeXBlUGFyYW1ldGVyTGlzdCgpOwogICAgcmVhZFVJbnQoKTsgLy8gVG90YWwgcGFyYW1ldGVyIGNvdW50LgogICAgdmFyIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPSByZWFkVUludCgpOwogICAgaW50IHZhcmlhYmxlU3RhY2tIZWlnaHQgPSB2YXJpYWJsZVN0YWNrLmxlbmd0aDsKICAgIHZhciBwb3NpdGlvbmFsID0gcmVhZEFuZFB1c2hWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCgpOwogICAgdmFyIG5hbWVkID0gcmVhZEFuZFB1c2hWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCgpOwogICAgdmFyaWFibGVTdGFjay5sZW5ndGggPSB2YXJpYWJsZVN0YWNrSGVpZ2h0OwogICAgdHlwZVBhcmFtZXRlclN0YWNrLmxlbmd0aCA9IHR5cGVQYXJhbWV0ZXJTdGFja0hlaWdodDsKICAgIGRlYnVnUGF0aC5yZW1vdmVMYXN0KCk7CiAgICBpZiAoc2hvdWxkV3JpdGVEYXRhKSB7CiAgICAgIG5vZGUuZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICAgIG5vZGUuZmlsZUVuZE9mZnNldCA9IGZpbGVFbmRPZmZzZXQ7CiAgICAgIG5vZGUuZmxhZ3MgPSBmbGFnczsKICAgICAgbm9kZS5uYW1lID0gbmFtZTsKICAgICAgbm9kZS5maWxlVXJpID0gZmlsZVVyaTsKICAgICAgbm9kZS5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zOwogICAgICBub2RlLnRhcmdldFJlZmVyZW5jZSA9IHRhcmdldFJlZmVyZW5jZTsKICAgICAgbm9kZS50eXBlQXJndW1lbnRzLmFkZEFsbCh0eXBlQXJndW1lbnRzKTsKICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOwogICAgICBub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPSByZXF1aXJlZFBhcmFtZXRlckNvdW50OwogICAgICBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzID0gcG9zaXRpb25hbDsKICAgICAgbm9kZS5uYW1lZFBhcmFtZXRlcnMgPSBuYW1lZDsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgSW5pdGlhbGl6ZXIgcmVhZEluaXRpYWxpemVyKCkgewogICAgaW50IHRhZyA9IHJlYWRCeXRlKCk7CiAgICBib29sIGlzU3ludGhldGljID0gcmVhZEJ5dGUoKSA9PSAxOwogICAgc3dpdGNoICh0YWcpIHsKICAgICAgY2FzZSBUYWcuSW52YWxpZEluaXRpYWxpemVyOgogICAgICAgIHJldHVybiBuZXcgSW52YWxpZEluaXRpYWxpemVyKCk7CiAgICAgIGNhc2UgVGFnLkZpZWxkSW5pdGlhbGl6ZXI6CiAgICAgICAgdmFyIHJlZmVyZW5jZSA9IHJlYWRNZW1iZXJSZWZlcmVuY2UoKTsKICAgICAgICB2YXIgdmFsdWUgPSByZWFkRXhwcmVzc2lvbigpOwogICAgICAgIHJldHVybiBuZXcgRmllbGRJbml0aWFsaXplci5ieVJlZmVyZW5jZShyZWZlcmVuY2UsIHZhbHVlKQogICAgICAgICAgLi5pc1N5bnRoZXRpYyA9IGlzU3ludGhldGljOwogICAgICBjYXNlIFRhZy5TdXBlckluaXRpYWxpemVyOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgdmFyIHJlZmVyZW5jZSA9IHJlYWRNZW1iZXJSZWZlcmVuY2UoKTsKICAgICAgICB2YXIgYXJndW1lbnRzID0gcmVhZEFyZ3VtZW50cygpOwogICAgICAgIHJldHVybiBuZXcgU3VwZXJJbml0aWFsaXplci5ieVJlZmVyZW5jZShyZWZlcmVuY2UsIGFyZ3VtZW50cykKICAgICAgICAgIC4uaXNTeW50aGV0aWMgPSBpc1N5bnRoZXRpYwogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5SZWRpcmVjdGluZ0luaXRpYWxpemVyOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBSZWRpcmVjdGluZ0luaXRpYWxpemVyLmJ5UmVmZXJlbmNlKAogICAgICAgICAgICByZWFkTWVtYmVyUmVmZXJlbmNlKCksIHJlYWRBcmd1bWVudHMoKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuTG9jYWxJbml0aWFsaXplcjoKICAgICAgICByZXR1cm4gbmV3IExvY2FsSW5pdGlhbGl6ZXIocmVhZEFuZFB1c2hWYXJpYWJsZURlY2xhcmF0aW9uKCkpOwogICAgICBjYXNlIFRhZy5Bc3NlcnRJbml0aWFsaXplcjoKICAgICAgICByZXR1cm4gbmV3IEFzc2VydEluaXRpYWxpemVyKHJlYWRTdGF0ZW1lbnQoKSk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgZmFpbCgndW5leHBlY3RlZCBpbml0aWFsaXplciB0YWc6ICR0YWcnKTsKICAgIH0KICB9CgogIEZ1bmN0aW9uTm9kZSByZWFkRnVuY3Rpb25Ob2RlT3B0aW9uKGJvb2wgbGF6eUxvYWRCb2R5LCBpbnQgb3V0ZXJFbmRPZmZzZXQpIHsKICAgIHJldHVybiByZWFkQW5kQ2hlY2tPcHRpb25UYWcoKQogICAgICAgID8gcmVhZEZ1bmN0aW9uTm9kZSgKICAgICAgICAgICAgbGF6eUxvYWRCb2R5OiBsYXp5TG9hZEJvZHksIG91dGVyRW5kT2Zmc2V0OiBvdXRlckVuZE9mZnNldCkKICAgICAgICA6IG51bGw7CiAgfQoKICBGdW5jdGlvbk5vZGUgcmVhZEZ1bmN0aW9uTm9kZSgKICAgICAge2Jvb2wgbGF6eUxvYWRCb2R5OiBmYWxzZSwgaW50IG91dGVyRW5kT2Zmc2V0OiAtMX0pIHsKICAgIGludCB0YWcgPSByZWFkQnl0ZSgpOwogICAgYXNzZXJ0KHRhZyA9PSBUYWcuRnVuY3Rpb25Ob2RlKTsKICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICBpbnQgZW5kT2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgQXN5bmNNYXJrZXIgYXN5bmNNYXJrZXIgPSBBc3luY01hcmtlci52YWx1ZXNbcmVhZEJ5dGUoKV07CiAgICBBc3luY01hcmtlciBkYXJ0QXN5bmNNYXJrZXIgPSBBc3luY01hcmtlci52YWx1ZXNbcmVhZEJ5dGUoKV07CiAgICBpbnQgdHlwZVBhcmFtZXRlclN0YWNrSGVpZ2h0ID0gdHlwZVBhcmFtZXRlclN0YWNrLmxlbmd0aDsKICAgIHZhciB0eXBlUGFyYW1ldGVycyA9IHJlYWRBbmRQdXNoVHlwZVBhcmFtZXRlckxpc3QoKTsKICAgIHJlYWRVSW50KCk7IC8vIHRvdGFsIHBhcmFtZXRlciBjb3VudC4KICAgIHZhciByZXF1aXJlZFBhcmFtZXRlckNvdW50ID0gcmVhZFVJbnQoKTsKICAgIGludCB2YXJpYWJsZVN0YWNrSGVpZ2h0ID0gdmFyaWFibGVTdGFjay5sZW5ndGg7CiAgICB2YXIgcG9zaXRpb25hbCA9IHJlYWRBbmRQdXNoVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoKTsKICAgIHZhciBuYW1lZCA9IHJlYWRBbmRQdXNoVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoKTsKICAgIHZhciByZXR1cm5UeXBlID0gcmVhZERhcnRUeXBlKCk7CiAgICBpbnQgb2xkTGFiZWxTdGFja0Jhc2UgPSBsYWJlbFN0YWNrQmFzZTsKCiAgICBpZiAobGF6eUxvYWRCb2R5ICYmIG91dGVyRW5kT2Zmc2V0ID4gMCkgewogICAgICBsYXp5TG9hZEJvZHkgPSBvdXRlckVuZE9mZnNldCAtIF9ieXRlT2Zmc2V0ID4KICAgICAgICAgIDI7IC8vIGUuZy4gb3V0bGluZSBoYXMgVGFnLlNvbWV0aGluZyBhbmQgVGFnLkVtcHR5U3RhdGVtZW50CiAgICB9CgogICAgdmFyIGJvZHk7CiAgICBpZiAoIWxhenlMb2FkQm9keSkgewogICAgICBsYWJlbFN0YWNrQmFzZSA9IGxhYmVsU3RhY2subGVuZ3RoOwogICAgICBib2R5ID0gcmVhZFN0YXRlbWVudE9wdGlvbigpOwogICAgfQoKICAgIEZ1bmN0aW9uTm9kZSByZXN1bHQgPSBuZXcgRnVuY3Rpb25Ob2RlKGJvZHksCiAgICAgICAgdHlwZVBhcmFtZXRlcnM6IHR5cGVQYXJhbWV0ZXJzLAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnM6IHBvc2l0aW9uYWwsCiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzOiBuYW1lZCwKICAgICAgICByZXR1cm5UeXBlOiByZXR1cm5UeXBlLAogICAgICAgIGFzeW5jTWFya2VyOiBhc3luY01hcmtlciwKICAgICAgICBkYXJ0QXN5bmNNYXJrZXI6IGRhcnRBc3luY01hcmtlcikKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0CiAgICAgIC4uZmlsZUVuZE9mZnNldCA9IGVuZE9mZnNldDsKCiAgICBpZiAobGF6eUxvYWRCb2R5KSB7CiAgICAgIF9zZXRMYXp5TG9hZEZ1bmN0aW9uKHJlc3VsdCwgb2xkTGFiZWxTdGFja0Jhc2UsIHZhcmlhYmxlU3RhY2tIZWlnaHQsCiAgICAgICAgICB0eXBlUGFyYW1ldGVyU3RhY2tIZWlnaHQpOwogICAgfQoKICAgIGxhYmVsU3RhY2tCYXNlID0gb2xkTGFiZWxTdGFja0Jhc2U7CiAgICB2YXJpYWJsZVN0YWNrLmxlbmd0aCA9IHZhcmlhYmxlU3RhY2tIZWlnaHQ7CiAgICB0eXBlUGFyYW1ldGVyU3RhY2subGVuZ3RoID0gdHlwZVBhcmFtZXRlclN0YWNrSGVpZ2h0OwoKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIF9zZXRMYXp5TG9hZEZ1bmN0aW9uKEZ1bmN0aW9uTm9kZSByZXN1bHQsIGludCBvbGRMYWJlbFN0YWNrQmFzZSwKICAgICAgaW50IHZhcmlhYmxlU3RhY2tIZWlnaHQsIGludCB0eXBlUGFyYW1ldGVyU3RhY2tIZWlnaHQpIHsKICAgIGZpbmFsIGludCBzYXZlZEJ5dGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKICAgIGZpbmFsIGludCBjb21wb25lbnRTdGFydE9mZnNldCA9IF9jb21wb25lbnRTdGFydE9mZnNldDsKICAgIGZpbmFsIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVyU3RhY2sudG9MaXN0KCk7CiAgICBmaW5hbCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlcyA9IHZhcmlhYmxlU3RhY2sudG9MaXN0KCk7CiAgICBmaW5hbCBMaWJyYXJ5IGN1cnJlbnRMaWJyYXJ5ID0gX2N1cnJlbnRMaWJyYXJ5OwogICAgcmVzdWx0LmxhenlCdWlsZGVyID0gKCkgewogICAgICBfYnl0ZU9mZnNldCA9IHNhdmVkQnl0ZU9mZnNldDsKICAgICAgX2N1cnJlbnRMaWJyYXJ5ID0gY3VycmVudExpYnJhcnk7CiAgICAgIHR5cGVQYXJhbWV0ZXJTdGFjay5jbGVhcigpOwogICAgICB0eXBlUGFyYW1ldGVyU3RhY2suYWRkQWxsKHR5cGVQYXJhbWV0ZXJzKTsKICAgICAgdmFyaWFibGVTdGFjay5jbGVhcigpOwogICAgICB2YXJpYWJsZVN0YWNrLmFkZEFsbCh2YXJpYWJsZXMpOwogICAgICBfY29tcG9uZW50U3RhcnRPZmZzZXQgPSBjb21wb25lbnRTdGFydE9mZnNldDsKCiAgICAgIHJlc3VsdC5ib2R5ID0gcmVhZFN0YXRlbWVudE9wdGlvbigpOwogICAgICByZXN1bHQuYm9keT8ucGFyZW50ID0gcmVzdWx0OwogICAgICBsYWJlbFN0YWNrQmFzZSA9IG9sZExhYmVsU3RhY2tCYXNlOwogICAgICB2YXJpYWJsZVN0YWNrLmxlbmd0aCA9IHZhcmlhYmxlU3RhY2tIZWlnaHQ7CiAgICAgIHR5cGVQYXJhbWV0ZXJTdGFjay5sZW5ndGggPSB0eXBlUGFyYW1ldGVyU3RhY2tIZWlnaHQ7CiAgICAgIGlmIChyZXN1bHQucGFyZW50IGlzIFByb2NlZHVyZSkgewogICAgICAgIFByb2NlZHVyZSBwYXJlbnQgPSByZXN1bHQucGFyZW50OwogICAgICAgIHBhcmVudC50cmFuc2Zvcm1lckZsYWdzIHw9IGdldEFuZFJlc2V0VHJhbnNmb3JtZXJGbGFncygpOwogICAgICB9CiAgICB9OwogIH0KCiAgdm9pZCBwdXNoVmFyaWFibGVEZWNsYXJhdGlvbihWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSB7CiAgICB2YXJpYWJsZVN0YWNrLmFkZCh2YXJpYWJsZSk7CiAgfQoKICB2b2lkIHB1c2hWYXJpYWJsZURlY2xhcmF0aW9ucyhMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlcykgewogICAgdmFyaWFibGVTdGFjay5hZGRBbGwodmFyaWFibGVzKTsKICB9CgogIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVhZFZhcmlhYmxlUmVmZXJlbmNlKCkgewogICAgaW50IGluZGV4ID0gcmVhZFVJbnQoKTsKICAgIGlmIChpbmRleCA+PSB2YXJpYWJsZVN0YWNrLmxlbmd0aCkgewogICAgICB0aHJvdyBmYWlsKCd1bmV4cGVjdGVkIHZhcmlhYmxlIGluZGV4OiAkaW5kZXgnKTsKICAgIH0KICAgIHJldHVybiB2YXJpYWJsZVN0YWNrW2luZGV4XTsKICB9CgogIFN0cmluZyBsb2dpY2FsT3BlcmF0b3JUb1N0cmluZyhpbnQgaW5kZXgpIHsKICAgIHN3aXRjaCAoaW5kZXgpIHsKICAgICAgY2FzZSAwOgogICAgICAgIHJldHVybiAnJiYnOwogICAgICBjYXNlIDE6CiAgICAgICAgcmV0dXJuICd8fCc7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgZmFpbCgndW5leHBlY3RlZCBsb2dpY2FsIG9wZXJhdG9yIGluZGV4OiAkaW5kZXgnKTsKICAgIH0KICB9CgogIExpc3Q8RXhwcmVzc2lvbj4gcmVhZEV4cHJlc3Npb25MaXN0KCkgewogICAgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICBMaXN0PEV4cHJlc3Npb24+IHJlc3VsdCA9CiAgICAgICAgbmV3IExpc3Q8RXhwcmVzc2lvbj4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSByZWFkRXhwcmVzc2lvbigpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEV4cHJlc3Npb24gcmVhZEV4cHJlc3Npb25PcHRpb24oKSB7CiAgICByZXR1cm4gcmVhZEFuZENoZWNrT3B0aW9uVGFnKCkgPyByZWFkRXhwcmVzc2lvbigpIDogbnVsbDsKICB9CgogIEV4cHJlc3Npb24gcmVhZEV4cHJlc3Npb24oKSB7CiAgICBpbnQgdGFnQnl0ZSA9IHJlYWRCeXRlKCk7CiAgICBpbnQgdGFnID0gdGFnQnl0ZSAmIFRhZy5TcGVjaWFsaXplZFRhZ0hpZ2hCaXQgPT0gMAogICAgICAgID8gdGFnQnl0ZQogICAgICAgIDogKHRhZ0J5dGUgJiBUYWcuU3BlY2lhbGl6ZWRUYWdNYXNrKTsKICAgIHN3aXRjaCAodGFnKSB7CiAgICAgIGNhc2UgVGFnLkxvYWRMaWJyYXJ5OgogICAgICAgIHJldHVybiBuZXcgTG9hZExpYnJhcnkocmVhZExpYnJhcnlEZXBlbmRlbmN5UmVmZXJlbmNlKCkpOwogICAgICBjYXNlIFRhZy5DaGVja0xpYnJhcnlJc0xvYWRlZDoKICAgICAgICByZXR1cm4gbmV3IENoZWNrTGlicmFyeUlzTG9hZGVkKHJlYWRMaWJyYXJ5RGVwZW5kZW5jeVJlZmVyZW5jZSgpKTsKICAgICAgY2FzZSBUYWcuSW52YWxpZEV4cHJlc3Npb246CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IEludmFsaWRFeHByZXNzaW9uKHJlYWRTdHJpbmdPck51bGxJZkVtcHR5KCkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlZhcmlhYmxlR2V0OgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmVhZFVJbnQoKTsgLy8gb2Zmc2V0IG9mIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBpbiB0aGUgYmluYXJ5LgogICAgICAgIHJldHVybiBuZXcgVmFyaWFibGVHZXQocmVhZFZhcmlhYmxlUmVmZXJlbmNlKCksIHJlYWREYXJ0VHlwZU9wdGlvbigpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5TcGVjaWFsaXplZFZhcmlhYmxlR2V0OgogICAgICAgIGludCBpbmRleCA9IHRhZ0J5dGUgJiBUYWcuU3BlY2lhbGl6ZWRQYXlsb2FkTWFzazsKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHJlYWRVSW50KCk7IC8vIG9mZnNldCBvZiB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gaW4gdGhlIGJpbmFyeS4KICAgICAgICByZXR1cm4gbmV3IFZhcmlhYmxlR2V0KHZhcmlhYmxlU3RhY2tbaW5kZXhdKS4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuVmFyaWFibGVTZXQ6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZWFkVUludCgpOyAvLyBvZmZzZXQgb2YgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGluIHRoZSBiaW5hcnkuCiAgICAgICAgcmV0dXJuIG5ldyBWYXJpYWJsZVNldChyZWFkVmFyaWFibGVSZWZlcmVuY2UoKSwgcmVhZEV4cHJlc3Npb24oKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuU3BlY2lhbGl6ZWRWYXJpYWJsZVNldDoKICAgICAgICBpbnQgaW5kZXggPSB0YWdCeXRlICYgVGFnLlNwZWNpYWxpemVkUGF5bG9hZE1hc2s7CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZWFkVUludCgpOyAvLyBvZmZzZXQgb2YgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGluIHRoZSBiaW5hcnkuCiAgICAgICAgcmV0dXJuIG5ldyBWYXJpYWJsZVNldCh2YXJpYWJsZVN0YWNrW2luZGV4XSwgcmVhZEV4cHJlc3Npb24oKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuUHJvcGVydHlHZXQ6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5R2V0LmJ5UmVmZXJlbmNlKAogICAgICAgICAgICByZWFkRXhwcmVzc2lvbigpLCByZWFkTmFtZSgpLCByZWFkTWVtYmVyUmVmZXJlbmNlKGFsbG93TnVsbDogdHJ1ZSkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlByb3BlcnR5U2V0OgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVNldC5ieVJlZmVyZW5jZShyZWFkRXhwcmVzc2lvbigpLCByZWFkTmFtZSgpLAogICAgICAgICAgICByZWFkRXhwcmVzc2lvbigpLCByZWFkTWVtYmVyUmVmZXJlbmNlKGFsbG93TnVsbDogdHJ1ZSkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlN1cGVyUHJvcGVydHlHZXQ6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICBhZGRUcmFuc2Zvcm1lckZsYWcoVHJhbnNmb3JtZXJGbGFnLnN1cGVyQ2FsbHMpOwogICAgICAgIHJldHVybiBuZXcgU3VwZXJQcm9wZXJ0eUdldC5ieVJlZmVyZW5jZSgKICAgICAgICAgICAgcmVhZE5hbWUoKSwgcmVhZE1lbWJlclJlZmVyZW5jZShhbGxvd051bGw6IHRydWUpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5TdXBlclByb3BlcnR5U2V0OgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgYWRkVHJhbnNmb3JtZXJGbGFnKFRyYW5zZm9ybWVyRmxhZy5zdXBlckNhbGxzKTsKICAgICAgICByZXR1cm4gbmV3IFN1cGVyUHJvcGVydHlTZXQuYnlSZWZlcmVuY2UoCiAgICAgICAgICAgIHJlYWROYW1lKCksIHJlYWRFeHByZXNzaW9uKCksIHJlYWRNZW1iZXJSZWZlcmVuY2UoYWxsb3dOdWxsOiB0cnVlKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuRGlyZWN0UHJvcGVydHlHZXQ6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IERpcmVjdFByb3BlcnR5R2V0LmJ5UmVmZXJlbmNlKAogICAgICAgICAgICByZWFkRXhwcmVzc2lvbigpLCByZWFkTWVtYmVyUmVmZXJlbmNlKCkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLkRpcmVjdFByb3BlcnR5U2V0OgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBEaXJlY3RQcm9wZXJ0eVNldC5ieVJlZmVyZW5jZSgKICAgICAgICAgICAgcmVhZEV4cHJlc3Npb24oKSwgcmVhZE1lbWJlclJlZmVyZW5jZSgpLCByZWFkRXhwcmVzc2lvbigpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5TdGF0aWNHZXQ6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IFN0YXRpY0dldC5ieVJlZmVyZW5jZShyZWFkTWVtYmVyUmVmZXJlbmNlKCkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlN0YXRpY1NldDoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHJldHVybiBuZXcgU3RhdGljU2V0LmJ5UmVmZXJlbmNlKAogICAgICAgICAgICByZWFkTWVtYmVyUmVmZXJlbmNlKCksIHJlYWRFeHByZXNzaW9uKCkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLk1ldGhvZEludm9jYXRpb246CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IE1ldGhvZEludm9jYXRpb24uYnlSZWZlcmVuY2UocmVhZEV4cHJlc3Npb24oKSwgcmVhZE5hbWUoKSwKICAgICAgICAgICAgcmVhZEFyZ3VtZW50cygpLCByZWFkTWVtYmVyUmVmZXJlbmNlKGFsbG93TnVsbDogdHJ1ZSkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlN1cGVyTWV0aG9kSW52b2NhdGlvbjoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIGFkZFRyYW5zZm9ybWVyRmxhZyhUcmFuc2Zvcm1lckZsYWcuc3VwZXJDYWxscyk7CiAgICAgICAgcmV0dXJuIG5ldyBTdXBlck1ldGhvZEludm9jYXRpb24uYnlSZWZlcmVuY2UoCiAgICAgICAgICAgIHJlYWROYW1lKCksIHJlYWRBcmd1bWVudHMoKSwgcmVhZE1lbWJlclJlZmVyZW5jZShhbGxvd051bGw6IHRydWUpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5EaXJlY3RNZXRob2RJbnZvY2F0aW9uOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBEaXJlY3RNZXRob2RJbnZvY2F0aW9uLmJ5UmVmZXJlbmNlKAogICAgICAgICAgICByZWFkRXhwcmVzc2lvbigpLCByZWFkTWVtYmVyUmVmZXJlbmNlKCksIHJlYWRBcmd1bWVudHMoKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuU3RhdGljSW52b2NhdGlvbjoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHJldHVybiBuZXcgU3RhdGljSW52b2NhdGlvbi5ieVJlZmVyZW5jZSgKICAgICAgICAgICAgcmVhZE1lbWJlclJlZmVyZW5jZSgpLCByZWFkQXJndW1lbnRzKCksCiAgICAgICAgICAgIGlzQ29uc3Q6IGZhbHNlKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5Db25zdFN0YXRpY0ludm9jYXRpb246CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IFN0YXRpY0ludm9jYXRpb24uYnlSZWZlcmVuY2UoCiAgICAgICAgICAgIHJlYWRNZW1iZXJSZWZlcmVuY2UoKSwgcmVhZEFyZ3VtZW50cygpLAogICAgICAgICAgICBpc0NvbnN0OiB0cnVlKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5Db25zdHJ1Y3Rvckludm9jYXRpb246CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9ySW52b2NhdGlvbi5ieVJlZmVyZW5jZSgKICAgICAgICAgICAgcmVhZE1lbWJlclJlZmVyZW5jZSgpLCByZWFkQXJndW1lbnRzKCksCiAgICAgICAgICAgIGlzQ29uc3Q6IGZhbHNlKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5Db25zdENvbnN0cnVjdG9ySW52b2NhdGlvbjoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3JJbnZvY2F0aW9uLmJ5UmVmZXJlbmNlKAogICAgICAgICAgICByZWFkTWVtYmVyUmVmZXJlbmNlKCksIHJlYWRBcmd1bWVudHMoKSwKICAgICAgICAgICAgaXNDb25zdDogdHJ1ZSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuTm90OgogICAgICAgIHJldHVybiBuZXcgTm90KHJlYWRFeHByZXNzaW9uKCkpOwogICAgICBjYXNlIFRhZy5Mb2dpY2FsRXhwcmVzc2lvbjoKICAgICAgICByZXR1cm4gbmV3IExvZ2ljYWxFeHByZXNzaW9uKHJlYWRFeHByZXNzaW9uKCksCiAgICAgICAgICAgIGxvZ2ljYWxPcGVyYXRvclRvU3RyaW5nKHJlYWRCeXRlKCkpLCByZWFkRXhwcmVzc2lvbigpKTsKICAgICAgY2FzZSBUYWcuQ29uZGl0aW9uYWxFeHByZXNzaW9uOgogICAgICAgIHJldHVybiBuZXcgQ29uZGl0aW9uYWxFeHByZXNzaW9uKHJlYWRFeHByZXNzaW9uKCksIHJlYWRFeHByZXNzaW9uKCksCiAgICAgICAgICAgIHJlYWRFeHByZXNzaW9uKCksIHJlYWREYXJ0VHlwZU9wdGlvbigpKTsKICAgICAgY2FzZSBUYWcuU3RyaW5nQ29uY2F0ZW5hdGlvbjoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHJldHVybiBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbihyZWFkRXhwcmVzc2lvbkxpc3QoKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuTGlzdENvbmNhdGVuYXRpb246CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICB2YXIgdHlwZUFyZ3VtZW50ID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBMaXN0Q29uY2F0ZW5hdGlvbihyZWFkRXhwcmVzc2lvbkxpc3QoKSwKICAgICAgICAgICAgdHlwZUFyZ3VtZW50OiB0eXBlQXJndW1lbnQpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlNldENvbmNhdGVuYXRpb246CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICB2YXIgdHlwZUFyZ3VtZW50ID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBTZXRDb25jYXRlbmF0aW9uKHJlYWRFeHByZXNzaW9uTGlzdCgpLAogICAgICAgICAgICB0eXBlQXJndW1lbnQ6IHR5cGVBcmd1bWVudCkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuTWFwQ29uY2F0ZW5hdGlvbjoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHZhciBrZXlUeXBlID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgdmFyIHZhbHVlVHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIHJldHVybiBuZXcgTWFwQ29uY2F0ZW5hdGlvbihyZWFkRXhwcmVzc2lvbkxpc3QoKSwKICAgICAgICAgICAga2V5VHlwZToga2V5VHlwZSwgdmFsdWVUeXBlOiB2YWx1ZVR5cGUpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLkluc3RhbmNlQ3JlYXRpb246CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICBSZWZlcmVuY2UgY2xhc3NSZWZlcmVuY2UgPSByZWFkQ2xhc3NSZWZlcmVuY2UoKTsKICAgICAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0gcmVhZERhcnRUeXBlTGlzdCgpOwogICAgICAgIGludCBmaWVsZFZhbHVlQ291bnQgPSByZWFkVUludCgpOwogICAgICAgIE1hcDxSZWZlcmVuY2UsIEV4cHJlc3Npb24+IGZpZWxkVmFsdWVzID0gPFJlZmVyZW5jZSwgRXhwcmVzc2lvbj57fTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkVmFsdWVDb3VudDsgaSsrKSB7CiAgICAgICAgICBmaW5hbCBSZWZlcmVuY2UgZmllbGRSZWYgPQogICAgICAgICAgICAgIHJlYWRDYW5vbmljYWxOYW1lUmVmZXJlbmNlKCkuZ2V0UmVmZXJlbmNlKCk7CiAgICAgICAgICBmaW5hbCBFeHByZXNzaW9uIHZhbHVlID0gcmVhZEV4cHJlc3Npb24oKTsKICAgICAgICAgIGZpZWxkVmFsdWVzW2ZpZWxkUmVmXSA9IHZhbHVlOwogICAgICAgIH0KICAgICAgICBpbnQgYXNzZXJ0Q291bnQgPSByZWFkVUludCgpOwogICAgICAgIExpc3Q8QXNzZXJ0U3RhdGVtZW50PiBhc3NlcnRzID0gbmV3IExpc3Q8QXNzZXJ0U3RhdGVtZW50Pihhc3NlcnRDb3VudCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhc3NlcnRDb3VudDsgaSsrKSB7CiAgICAgICAgICBhc3NlcnRzW2ldID0gcmVhZFN0YXRlbWVudCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IEluc3RhbmNlQ3JlYXRpb24oCiAgICAgICAgICAgIGNsYXNzUmVmZXJlbmNlLCB0eXBlQXJndW1lbnRzLCBmaWVsZFZhbHVlcywgYXNzZXJ0cykKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuSXNFeHByZXNzaW9uOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBJc0V4cHJlc3Npb24ocmVhZEV4cHJlc3Npb24oKSwgcmVhZERhcnRUeXBlKCkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLkFzRXhwcmVzc2lvbjoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIGludCBmbGFncyA9IHJlYWRCeXRlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBBc0V4cHJlc3Npb24ocmVhZEV4cHJlc3Npb24oKSwgcmVhZERhcnRUeXBlKCkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQKICAgICAgICAgIC4uZmxhZ3MgPSBmbGFnczsKICAgICAgY2FzZSBUYWcuU3RyaW5nTGl0ZXJhbDoKICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0xpdGVyYWwocmVhZFN0cmluZ1JlZmVyZW5jZSgpKTsKICAgICAgY2FzZSBUYWcuU3BlY2lhbGl6ZWRJbnRMaXRlcmFsOgogICAgICAgIGludCBiaWFzZWRWYWx1ZSA9IHRhZ0J5dGUgJiBUYWcuU3BlY2lhbGl6ZWRQYXlsb2FkTWFzazsKICAgICAgICByZXR1cm4gbmV3IEludExpdGVyYWwoYmlhc2VkVmFsdWUgLSBUYWcuU3BlY2lhbGl6ZWRJbnRMaXRlcmFsQmlhcyk7CiAgICAgIGNhc2UgVGFnLlBvc2l0aXZlSW50TGl0ZXJhbDoKICAgICAgICByZXR1cm4gbmV3IEludExpdGVyYWwocmVhZFVJbnQoKSk7CiAgICAgIGNhc2UgVGFnLk5lZ2F0aXZlSW50TGl0ZXJhbDoKICAgICAgICByZXR1cm4gbmV3IEludExpdGVyYWwoLXJlYWRVSW50KCkpOwogICAgICBjYXNlIFRhZy5CaWdJbnRMaXRlcmFsOgogICAgICAgIHJldHVybiBuZXcgSW50TGl0ZXJhbChpbnQucGFyc2UocmVhZFN0cmluZ1JlZmVyZW5jZSgpKSk7CiAgICAgIGNhc2UgVGFnLkRvdWJsZUxpdGVyYWw6CiAgICAgICAgcmV0dXJuIG5ldyBEb3VibGVMaXRlcmFsKHJlYWREb3VibGUoKSk7CiAgICAgIGNhc2UgVGFnLlRydWVMaXRlcmFsOgogICAgICAgIHJldHVybiBuZXcgQm9vbExpdGVyYWwodHJ1ZSk7CiAgICAgIGNhc2UgVGFnLkZhbHNlTGl0ZXJhbDoKICAgICAgICByZXR1cm4gbmV3IEJvb2xMaXRlcmFsKGZhbHNlKTsKICAgICAgY2FzZSBUYWcuTnVsbExpdGVyYWw6CiAgICAgICAgcmV0dXJuIG5ldyBOdWxsTGl0ZXJhbCgpOwogICAgICBjYXNlIFRhZy5TeW1ib2xMaXRlcmFsOgogICAgICAgIHJldHVybiBuZXcgU3ltYm9sTGl0ZXJhbChyZWFkU3RyaW5nUmVmZXJlbmNlKCkpOwogICAgICBjYXNlIFRhZy5UeXBlTGl0ZXJhbDoKICAgICAgICByZXR1cm4gbmV3IFR5cGVMaXRlcmFsKHJlYWREYXJ0VHlwZSgpKTsKICAgICAgY2FzZSBUYWcuVGhpc0V4cHJlc3Npb246CiAgICAgICAgcmV0dXJuIG5ldyBUaGlzRXhwcmVzc2lvbigpOwogICAgICBjYXNlIFRhZy5SZXRocm93OgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBSZXRocm93KCkuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlRocm93OgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBUaHJvdyhyZWFkRXhwcmVzc2lvbigpKS4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuTGlzdExpdGVyYWw6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICB2YXIgdHlwZUFyZ3VtZW50ID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBMaXN0TGl0ZXJhbChyZWFkRXhwcmVzc2lvbkxpc3QoKSwKICAgICAgICAgICAgdHlwZUFyZ3VtZW50OiB0eXBlQXJndW1lbnQsIGlzQ29uc3Q6IGZhbHNlKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5Db25zdExpc3RMaXRlcmFsOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgdmFyIHR5cGVBcmd1bWVudCA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIHJldHVybiBuZXcgTGlzdExpdGVyYWwocmVhZEV4cHJlc3Npb25MaXN0KCksCiAgICAgICAgICAgIHR5cGVBcmd1bWVudDogdHlwZUFyZ3VtZW50LCBpc0NvbnN0OiB0cnVlKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5TZXRMaXRlcmFsOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgdmFyIHR5cGVBcmd1bWVudCA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIHJldHVybiBuZXcgU2V0TGl0ZXJhbChyZWFkRXhwcmVzc2lvbkxpc3QoKSwKICAgICAgICAgICAgdHlwZUFyZ3VtZW50OiB0eXBlQXJndW1lbnQsIGlzQ29uc3Q6IGZhbHNlKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5Db25zdFNldExpdGVyYWw6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICB2YXIgdHlwZUFyZ3VtZW50ID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBTZXRMaXRlcmFsKHJlYWRFeHByZXNzaW9uTGlzdCgpLAogICAgICAgICAgICB0eXBlQXJndW1lbnQ6IHR5cGVBcmd1bWVudCwgaXNDb25zdDogdHJ1ZSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuTWFwTGl0ZXJhbDoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHZhciBrZXlUeXBlID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgdmFyIHZhbHVlVHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIHJldHVybiBuZXcgTWFwTGl0ZXJhbChyZWFkTWFwRW50cnlMaXN0KCksCiAgICAgICAgICAgIGtleVR5cGU6IGtleVR5cGUsIHZhbHVlVHlwZTogdmFsdWVUeXBlLCBpc0NvbnN0OiBmYWxzZSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuQ29uc3RNYXBMaXRlcmFsOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgdmFyIGtleVR5cGUgPSByZWFkRGFydFR5cGUoKTsKICAgICAgICB2YXIgdmFsdWVUeXBlID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBNYXBMaXRlcmFsKHJlYWRNYXBFbnRyeUxpc3QoKSwKICAgICAgICAgICAga2V5VHlwZToga2V5VHlwZSwgdmFsdWVUeXBlOiB2YWx1ZVR5cGUsIGlzQ29uc3Q6IHRydWUpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLkF3YWl0RXhwcmVzc2lvbjoKICAgICAgICByZXR1cm4gbmV3IEF3YWl0RXhwcmVzc2lvbihyZWFkRXhwcmVzc2lvbigpKTsKICAgICAgY2FzZSBUYWcuRnVuY3Rpb25FeHByZXNzaW9uOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbkV4cHJlc3Npb24ocmVhZEZ1bmN0aW9uTm9kZSgpKS4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuTGV0OgogICAgICAgIHZhciB2YXJpYWJsZSA9IHJlYWRWYXJpYWJsZURlY2xhcmF0aW9uKCk7CiAgICAgICAgaW50IHN0YWNrSGVpZ2h0ID0gdmFyaWFibGVTdGFjay5sZW5ndGg7CiAgICAgICAgcHVzaFZhcmlhYmxlRGVjbGFyYXRpb24odmFyaWFibGUpOwogICAgICAgIHZhciBib2R5ID0gcmVhZEV4cHJlc3Npb24oKTsKICAgICAgICB2YXJpYWJsZVN0YWNrLmxlbmd0aCA9IHN0YWNrSGVpZ2h0OwogICAgICAgIHJldHVybiBuZXcgTGV0KHZhcmlhYmxlLCBib2R5KTsKICAgICAgY2FzZSBUYWcuQmxvY2tFeHByZXNzaW9uOgogICAgICAgIGludCBzdGFja0hlaWdodCA9IHZhcmlhYmxlU3RhY2subGVuZ3RoOwogICAgICAgIHZhciBzdGF0ZW1lbnRzID0gcmVhZFN0YXRlbWVudExpc3QoKTsKICAgICAgICB2YXIgdmFsdWUgPSByZWFkRXhwcmVzc2lvbigpOwogICAgICAgIHZhcmlhYmxlU3RhY2subGVuZ3RoID0gc3RhY2tIZWlnaHQ7CiAgICAgICAgcmV0dXJuIG5ldyBCbG9ja0V4cHJlc3Npb24obmV3IEJsb2NrKHN0YXRlbWVudHMpLCB2YWx1ZSk7CiAgICAgIGNhc2UgVGFnLkluc3RhbnRpYXRpb246CiAgICAgICAgdmFyIGV4cHJlc3Npb24gPSByZWFkRXhwcmVzc2lvbigpOwogICAgICAgIHZhciB0eXBlQXJndW1lbnRzID0gcmVhZERhcnRUeXBlTGlzdCgpOwogICAgICAgIHJldHVybiBuZXcgSW5zdGFudGlhdGlvbihleHByZXNzaW9uLCB0eXBlQXJndW1lbnRzKTsKICAgICAgY2FzZSBUYWcuQ29uc3RhbnRFeHByZXNzaW9uOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgRGFydFR5cGUgdHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIENvbnN0YW50IGNvbnN0YW50ID0gcmVhZENvbnN0YW50UmVmZXJlbmNlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBDb25zdGFudEV4cHJlc3Npb24oY29uc3RhbnQsIHR5cGUpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IGZhaWwoJ3VuZXhwZWN0ZWQgZXhwcmVzc2lvbiB0YWc6ICR0YWcnKTsKICAgIH0KICB9CgogIExpc3Q8TWFwRW50cnk+IHJlYWRNYXBFbnRyeUxpc3QoKSB7CiAgICBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIExpc3Q8TWFwRW50cnk+IHJlc3VsdCA9CiAgICAgICAgbmV3IExpc3Q8TWFwRW50cnk+LmZpbGxlZChsZW5ndGgsIG51bGwsIGdyb3dhYmxlOiB0cnVlKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgcmVzdWx0W2ldID0gcmVhZE1hcEVudHJ5KCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgTWFwRW50cnkgcmVhZE1hcEVudHJ5KCkgewogICAgcmV0dXJuIG5ldyBNYXBFbnRyeShyZWFkRXhwcmVzc2lvbigpLCByZWFkRXhwcmVzc2lvbigpKTsKICB9CgogIExpc3Q8U3RhdGVtZW50PiByZWFkU3RhdGVtZW50TGlzdCgpIHsKICAgIGludCBsZW5ndGggPSByZWFkVUludCgpOwogICAgTGlzdDxTdGF0ZW1lbnQ+IHJlc3VsdCA9CiAgICAgICAgbmV3IExpc3Q8U3RhdGVtZW50Pi5maWxsZWQobGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIHJlc3VsdFtpXSA9IHJlYWRTdGF0ZW1lbnQoKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBTdGF0ZW1lbnQgcmVhZFN0YXRlbWVudE9yTnVsbElmRW1wdHkoKSB7CiAgICB2YXIgbm9kZSA9IHJlYWRTdGF0ZW1lbnQoKTsKICAgIGlmIChub2RlIGlzIEVtcHR5U3RhdGVtZW50KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CiAgfQoKICBTdGF0ZW1lbnQgcmVhZFN0YXRlbWVudE9wdGlvbigpIHsKICAgIHJldHVybiByZWFkQW5kQ2hlY2tPcHRpb25UYWcoKSA/IHJlYWRTdGF0ZW1lbnQoKSA6IG51bGw7CiAgfQoKICBTdGF0ZW1lbnQgcmVhZFN0YXRlbWVudCgpIHsKICAgIGludCB0YWcgPSByZWFkQnl0ZSgpOwogICAgc3dpdGNoICh0YWcpIHsKICAgICAgY2FzZSBUYWcuRXhwcmVzc2lvblN0YXRlbWVudDoKICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQocmVhZEV4cHJlc3Npb24oKSk7CiAgICAgIGNhc2UgVGFnLkJsb2NrOgogICAgICAgIHJldHVybiByZWFkQmxvY2soKTsKICAgICAgY2FzZSBUYWcuQXNzZXJ0QmxvY2s6CiAgICAgICAgcmV0dXJuIHJlYWRBc3NlcnRCbG9jaygpOwogICAgICBjYXNlIFRhZy5FbXB0eVN0YXRlbWVudDoKICAgICAgICByZXR1cm4gbmV3IEVtcHR5U3RhdGVtZW50KCk7CiAgICAgIGNhc2UgVGFnLkFzc2VydFN0YXRlbWVudDoKICAgICAgICByZXR1cm4gbmV3IEFzc2VydFN0YXRlbWVudChyZWFkRXhwcmVzc2lvbigpLAogICAgICAgICAgICBjb25kaXRpb25TdGFydE9mZnNldDogcmVhZE9mZnNldCgpLAogICAgICAgICAgICBjb25kaXRpb25FbmRPZmZzZXQ6IHJlYWRPZmZzZXQoKSwKICAgICAgICAgICAgbWVzc2FnZTogcmVhZEV4cHJlc3Npb25PcHRpb24oKSk7CiAgICAgIGNhc2UgVGFnLkxhYmVsZWRTdGF0ZW1lbnQ6CiAgICAgICAgdmFyIGxhYmVsID0gbmV3IExhYmVsZWRTdGF0ZW1lbnQobnVsbCk7CiAgICAgICAgbGFiZWxTdGFjay5hZGQobGFiZWwpOwogICAgICAgIGxhYmVsLmJvZHkgPSByZWFkU3RhdGVtZW50KCkuLnBhcmVudCA9IGxhYmVsOwogICAgICAgIGxhYmVsU3RhY2sucmVtb3ZlTGFzdCgpOwogICAgICAgIHJldHVybiBsYWJlbDsKICAgICAgY2FzZSBUYWcuQnJlYWtTdGF0ZW1lbnQ6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICBpbnQgaW5kZXggPSByZWFkVUludCgpOwogICAgICAgIHJldHVybiBuZXcgQnJlYWtTdGF0ZW1lbnQobGFiZWxTdGFja1tsYWJlbFN0YWNrQmFzZSArIGluZGV4XSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuV2hpbGVTdGF0ZW1lbnQ6CiAgICAgICAgdmFyIG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IFdoaWxlU3RhdGVtZW50KHJlYWRFeHByZXNzaW9uKCksIHJlYWRTdGF0ZW1lbnQoKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuRG9TdGF0ZW1lbnQ6CiAgICAgICAgdmFyIG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IERvU3RhdGVtZW50KHJlYWRTdGF0ZW1lbnQoKSwgcmVhZEV4cHJlc3Npb24oKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuRm9yU3RhdGVtZW50OgogICAgICAgIGludCB2YXJpYWJsZVN0YWNrSGVpZ2h0ID0gdmFyaWFibGVTdGFjay5sZW5ndGg7CiAgICAgICAgdmFyIG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICB2YXIgdmFyaWFibGVzID0gcmVhZEFuZFB1c2hWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCgpOwogICAgICAgIHZhciBjb25kaXRpb24gPSByZWFkRXhwcmVzc2lvbk9wdGlvbigpOwogICAgICAgIHZhciB1cGRhdGVzID0gcmVhZEV4cHJlc3Npb25MaXN0KCk7CiAgICAgICAgdmFyIGJvZHkgPSByZWFkU3RhdGVtZW50KCk7CiAgICAgICAgdmFyaWFibGVTdGFjay5sZW5ndGggPSB2YXJpYWJsZVN0YWNrSGVpZ2h0OwogICAgICAgIHJldHVybiBuZXcgRm9yU3RhdGVtZW50KHZhcmlhYmxlcywgY29uZGl0aW9uLCB1cGRhdGVzLCBib2R5KQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5Gb3JJblN0YXRlbWVudDoKICAgICAgY2FzZSBUYWcuQXN5bmNGb3JJblN0YXRlbWVudDoKICAgICAgICBib29sIGlzQXN5bmMgPSB0YWcgPT0gVGFnLkFzeW5jRm9ySW5TdGF0ZW1lbnQ7CiAgICAgICAgaW50IHZhcmlhYmxlU3RhY2tIZWlnaHQgPSB2YXJpYWJsZVN0YWNrLmxlbmd0aDsKICAgICAgICB2YXIgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHZhciBib2R5T2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHZhciB2YXJpYWJsZSA9IHJlYWRBbmRQdXNoVmFyaWFibGVEZWNsYXJhdGlvbigpOwogICAgICAgIHZhciBpdGVyYWJsZSA9IHJlYWRFeHByZXNzaW9uKCk7CiAgICAgICAgdmFyIGJvZHkgPSByZWFkU3RhdGVtZW50KCk7CiAgICAgICAgdmFyaWFibGVTdGFjay5sZW5ndGggPSB2YXJpYWJsZVN0YWNrSGVpZ2h0OwogICAgICAgIHJldHVybiBuZXcgRm9ySW5TdGF0ZW1lbnQodmFyaWFibGUsIGl0ZXJhYmxlLCBib2R5LCBpc0FzeW5jOiBpc0FzeW5jKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0CiAgICAgICAgICAuLmJvZHlPZmZzZXQgPSBib2R5T2Zmc2V0OwogICAgICBjYXNlIFRhZy5Td2l0Y2hTdGF0ZW1lbnQ6CiAgICAgICAgdmFyIG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICB2YXIgZXhwcmVzc2lvbiA9IHJlYWRFeHByZXNzaW9uKCk7CiAgICAgICAgaW50IGNvdW50ID0gcmVhZFVJbnQoKTsKICAgICAgICBMaXN0PFN3aXRjaENhc2U+IGNhc2VzID0KICAgICAgICAgICAgbmV3IExpc3Q8U3dpdGNoQ2FzZT4uZmlsbGVkKGNvdW50LCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgICAgICBjYXNlc1tpXSA9IG5ldyBTd2l0Y2hDYXNlLmVtcHR5KCk7CiAgICAgICAgfQogICAgICAgIHN3aXRjaENhc2VTdGFjay5hZGRBbGwoY2FzZXMpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgIHJlYWRTd2l0Y2hDYXNlSW50byhjYXNlc1tpXSk7CiAgICAgICAgfQogICAgICAgIHN3aXRjaENhc2VTdGFjay5sZW5ndGggLT0gY291bnQ7CiAgICAgICAgcmV0dXJuIG5ldyBTd2l0Y2hTdGF0ZW1lbnQoZXhwcmVzc2lvbiwgY2FzZXMpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5Db250aW51ZVN3aXRjaFN0YXRlbWVudDoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIGludCBpbmRleCA9IHJlYWRVSW50KCk7CiAgICAgICAgcmV0dXJuIG5ldyBDb250aW51ZVN3aXRjaFN0YXRlbWVudChzd2l0Y2hDYXNlU3RhY2tbaW5kZXhdKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5JZlN0YXRlbWVudDoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHJldHVybiBuZXcgSWZTdGF0ZW1lbnQoCiAgICAgICAgICAgIHJlYWRFeHByZXNzaW9uKCksIHJlYWRTdGF0ZW1lbnQoKSwgcmVhZFN0YXRlbWVudE9yTnVsbElmRW1wdHkoKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuUmV0dXJuU3RhdGVtZW50OgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBSZXR1cm5TdGF0ZW1lbnQocmVhZEV4cHJlc3Npb25PcHRpb24oKSkuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlRyeUNhdGNoOgogICAgICAgIFN0YXRlbWVudCBib2R5ID0gcmVhZFN0YXRlbWVudCgpOwogICAgICAgIGludCBmbGFncyA9IHJlYWRCeXRlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBUcnlDYXRjaChib2R5LCByZWFkQ2F0Y2hMaXN0KCksIGlzU3ludGhldGljOiBmbGFncyAmIDIgPT0gMik7CiAgICAgIGNhc2UgVGFnLlRyeUZpbmFsbHk6CiAgICAgICAgcmV0dXJuIG5ldyBUcnlGaW5hbGx5KHJlYWRTdGF0ZW1lbnQoKSwgcmVhZFN0YXRlbWVudCgpKTsKICAgICAgY2FzZSBUYWcuWWllbGRTdGF0ZW1lbnQ6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICBpbnQgZmxhZ3MgPSByZWFkQnl0ZSgpOwogICAgICAgIHJldHVybiBuZXcgWWllbGRTdGF0ZW1lbnQocmVhZEV4cHJlc3Npb24oKSwKICAgICAgICAgICAgaXNZaWVsZFN0YXI6IGZsYWdzICYgWWllbGRTdGF0ZW1lbnQuRmxhZ1lpZWxkU3RhciAhPSAwLAogICAgICAgICAgICBpc05hdGl2ZTogZmxhZ3MgJiBZaWVsZFN0YXRlbWVudC5GbGFnTmF0aXZlICE9IDApCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlZhcmlhYmxlRGVjbGFyYXRpb246CiAgICAgICAgdmFyIHZhcmlhYmxlID0gcmVhZFZhcmlhYmxlRGVjbGFyYXRpb24oKTsKICAgICAgICB2YXJpYWJsZVN0YWNrLmFkZCh2YXJpYWJsZSk7IC8vIFdpbGwgYmUgcG9wcGVkIGJ5IHRoZSBlbmNsb3Npbmcgc2NvcGUuCiAgICAgICAgcmV0dXJuIHZhcmlhYmxlOwogICAgICBjYXNlIFRhZy5GdW5jdGlvbkRlY2xhcmF0aW9uOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgdmFyIHZhcmlhYmxlID0gcmVhZFZhcmlhYmxlRGVjbGFyYXRpb24oKTsKICAgICAgICB2YXJpYWJsZVN0YWNrLmFkZCh2YXJpYWJsZSk7IC8vIFdpbGwgYmUgcG9wcGVkIGJ5IHRoZSBlbmNsb3Npbmcgc2NvcGUuCiAgICAgICAgdmFyIGZ1bmN0aW9uID0gcmVhZEZ1bmN0aW9uTm9kZSgpOwogICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25EZWNsYXJhdGlvbih2YXJpYWJsZSwgZnVuY3Rpb24pLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IGZhaWwoJ3VuZXhwZWN0ZWQgc3RhdGVtZW50IHRhZzogJHRhZycpOwogICAgfQogIH0KCiAgdm9pZCByZWFkU3dpdGNoQ2FzZUludG8oU3dpdGNoQ2FzZSBjYXNlTm9kZSkgewogICAgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICBjYXNlTm9kZS5leHByZXNzaW9ucy5sZW5ndGggPSBsZW5ndGg7CiAgICBjYXNlTm9kZS5leHByZXNzaW9uT2Zmc2V0cy5sZW5ndGggPSBsZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIGNhc2VOb2RlLmV4cHJlc3Npb25PZmZzZXRzW2ldID0gcmVhZE9mZnNldCgpOwogICAgICBjYXNlTm9kZS5leHByZXNzaW9uc1tpXSA9IHJlYWRFeHByZXNzaW9uKCkuLnBhcmVudCA9IGNhc2VOb2RlOwogICAgfQogICAgY2FzZU5vZGUuaXNEZWZhdWx0ID0gcmVhZEJ5dGUoKSA9PSAxOwogICAgY2FzZU5vZGUuYm9keSA9IHJlYWRTdGF0ZW1lbnQoKS4ucGFyZW50ID0gY2FzZU5vZGU7CiAgfQoKICBMaXN0PENhdGNoPiByZWFkQ2F0Y2hMaXN0KCkgewogICAgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICBMaXN0PENhdGNoPiByZXN1bHQgPSBuZXcgTGlzdDxDYXRjaD4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSByZWFkQ2F0Y2goKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBDYXRjaCByZWFkQ2F0Y2goKSB7CiAgICBpbnQgdmFyaWFibGVTdGFja0hlaWdodCA9IHZhcmlhYmxlU3RhY2subGVuZ3RoOwogICAgdmFyIG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgIHZhciBndWFyZCA9IHJlYWREYXJ0VHlwZSgpOwogICAgdmFyIGV4Y2VwdGlvbiA9IHJlYWRBbmRQdXNoVmFyaWFibGVEZWNsYXJhdGlvbk9wdGlvbigpOwogICAgdmFyIHN0YWNrVHJhY2UgPSByZWFkQW5kUHVzaFZhcmlhYmxlRGVjbGFyYXRpb25PcHRpb24oKTsKICAgIHZhciBib2R5ID0gcmVhZFN0YXRlbWVudCgpOwogICAgdmFyaWFibGVTdGFjay5sZW5ndGggPSB2YXJpYWJsZVN0YWNrSGVpZ2h0OwogICAgcmV0dXJuIG5ldyBDYXRjaChleGNlcHRpb24sIGJvZHksIGd1YXJkOiBndWFyZCwgc3RhY2tUcmFjZTogc3RhY2tUcmFjZSkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogIH0KCiAgQmxvY2sgcmVhZEJsb2NrKCkgewogICAgaW50IHN0YWNrSGVpZ2h0ID0gdmFyaWFibGVTdGFjay5sZW5ndGg7CiAgICB2YXIgYm9keSA9IHJlYWRTdGF0ZW1lbnRMaXN0KCk7CiAgICB2YXJpYWJsZVN0YWNrLmxlbmd0aCA9IHN0YWNrSGVpZ2h0OwogICAgcmV0dXJuIG5ldyBCbG9jayhib2R5KTsKICB9CgogIEFzc2VydEJsb2NrIHJlYWRBc3NlcnRCbG9jaygpIHsKICAgIGludCBzdGFja0hlaWdodCA9IHZhcmlhYmxlU3RhY2subGVuZ3RoOwogICAgdmFyIGJvZHkgPSByZWFkU3RhdGVtZW50TGlzdCgpOwogICAgdmFyaWFibGVTdGFjay5sZW5ndGggPSBzdGFja0hlaWdodDsKICAgIHJldHVybiBuZXcgQXNzZXJ0QmxvY2soYm9keSk7CiAgfQoKICBTdXBlcnR5cGUgcmVhZFN1cGVydHlwZSgpIHsKICAgIEludGVyZmFjZVR5cGUgdHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgcmV0dXJuIG5ldyBTdXBlcnR5cGUuYnlSZWZlcmVuY2UodHlwZS5jbGFzc05hbWUsIHR5cGUudHlwZUFyZ3VtZW50cyk7CiAgfQoKICBTdXBlcnR5cGUgcmVhZFN1cGVydHlwZU9wdGlvbigpIHsKICAgIHJldHVybiByZWFkQW5kQ2hlY2tPcHRpb25UYWcoKSA/IHJlYWRTdXBlcnR5cGUoKSA6IG51bGw7CiAgfQoKICBMaXN0PFN1cGVydHlwZT4gcmVhZFN1cGVydHlwZUxpc3QoKSB7CiAgICBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIExpc3Q8U3VwZXJ0eXBlPiByZXN1bHQgPQogICAgICAgIG5ldyBMaXN0PFN1cGVydHlwZT4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSByZWFkU3VwZXJ0eXBlKCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgTGlzdDxEYXJ0VHlwZT4gcmVhZERhcnRUeXBlTGlzdCgpIHsKICAgIGludCBsZW5ndGggPSByZWFkVUludCgpOwogICAgTGlzdDxEYXJ0VHlwZT4gcmVzdWx0ID0KICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSByZWFkRGFydFR5cGUoKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBMaXN0PE5hbWVkVHlwZT4gcmVhZE5hbWVkVHlwZUxpc3QoKSB7CiAgICBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIExpc3Q8TmFtZWRUeXBlPiByZXN1bHQgPQogICAgICAgIG5ldyBMaXN0PE5hbWVkVHlwZT4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSByZWFkTmFtZWRUeXBlKCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgTmFtZWRUeXBlIHJlYWROYW1lZFR5cGUoKSB7CiAgICByZXR1cm4gbmV3IE5hbWVkVHlwZShyZWFkU3RyaW5nUmVmZXJlbmNlKCksIHJlYWREYXJ0VHlwZSgpKTsKICB9CgogIERhcnRUeXBlIHJlYWREYXJ0VHlwZU9wdGlvbigpIHsKICAgIHJldHVybiByZWFkQW5kQ2hlY2tPcHRpb25UYWcoKSA/IHJlYWREYXJ0VHlwZSgpIDogbnVsbDsKICB9CgogIERhcnRUeXBlIHJlYWREYXJ0VHlwZSgpIHsKICAgIGludCB0YWcgPSByZWFkQnl0ZSgpOwogICAgc3dpdGNoICh0YWcpIHsKICAgICAgY2FzZSBUYWcuVHlwZWRlZlR5cGU6CiAgICAgICAgcmV0dXJuIG5ldyBUeXBlZGVmVHlwZS5ieVJlZmVyZW5jZSgKICAgICAgICAgICAgcmVhZFR5cGVkZWZSZWZlcmVuY2UoKSwgcmVhZERhcnRUeXBlTGlzdCgpKTsKICAgICAgY2FzZSBUYWcuQm90dG9tVHlwZToKICAgICAgICByZXR1cm4gY29uc3QgQm90dG9tVHlwZSgpOwogICAgICBjYXNlIFRhZy5JbnZhbGlkVHlwZToKICAgICAgICByZXR1cm4gY29uc3QgSW52YWxpZFR5cGUoKTsKICAgICAgY2FzZSBUYWcuRHluYW1pY1R5cGU6CiAgICAgICAgcmV0dXJuIGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgIGNhc2UgVGFnLlZvaWRUeXBlOgogICAgICAgIHJldHVybiBjb25zdCBWb2lkVHlwZSgpOwogICAgICBjYXNlIFRhZy5JbnRlcmZhY2VUeXBlOgogICAgICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZS5ieVJlZmVyZW5jZSgKICAgICAgICAgICAgcmVhZENsYXNzUmVmZXJlbmNlKCksIHJlYWREYXJ0VHlwZUxpc3QoKSk7CiAgICAgIGNhc2UgVGFnLlNpbXBsZUludGVyZmFjZVR5cGU6CiAgICAgICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlLmJ5UmVmZXJlbmNlKAogICAgICAgICAgICByZWFkQ2xhc3NSZWZlcmVuY2UoKSwgY29uc3QgPERhcnRUeXBlPltdKTsKICAgICAgY2FzZSBUYWcuRnVuY3Rpb25UeXBlOgogICAgICAgIGludCB0eXBlUGFyYW1ldGVyU3RhY2tIZWlnaHQgPSB0eXBlUGFyYW1ldGVyU3RhY2subGVuZ3RoOwogICAgICAgIHZhciB0eXBlUGFyYW1ldGVycyA9IHJlYWRBbmRQdXNoVHlwZVBhcmFtZXRlckxpc3QoKTsKICAgICAgICB2YXIgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA9IHJlYWRVSW50KCk7CiAgICAgICAgdmFyIHRvdGFsUGFyYW1ldGVyQ291bnQgPSByZWFkVUludCgpOwogICAgICAgIHZhciBwb3NpdGlvbmFsID0gcmVhZERhcnRUeXBlTGlzdCgpOwogICAgICAgIHZhciBuYW1lZCA9IHJlYWROYW1lZFR5cGVMaXN0KCk7CiAgICAgICAgdmFyIHR5cGVkZWZUeXBlID0gcmVhZERhcnRUeXBlT3B0aW9uKCk7CiAgICAgICAgYXNzZXJ0KHBvc2l0aW9uYWwubGVuZ3RoICsgbmFtZWQubGVuZ3RoID09IHRvdGFsUGFyYW1ldGVyQ291bnQpOwogICAgICAgIHZhciByZXR1cm5UeXBlID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgdHlwZVBhcmFtZXRlclN0YWNrLmxlbmd0aCA9IHR5cGVQYXJhbWV0ZXJTdGFja0hlaWdodDsKICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uVHlwZShwb3NpdGlvbmFsLCByZXR1cm5UeXBlLAogICAgICAgICAgICB0eXBlUGFyYW1ldGVyczogdHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgICAgIG5hbWVkUGFyYW1ldGVyczogbmFtZWQsCiAgICAgICAgICAgIHR5cGVkZWZUeXBlOiB0eXBlZGVmVHlwZSk7CiAgICAgIGNhc2UgVGFnLlNpbXBsZUZ1bmN0aW9uVHlwZToKICAgICAgICB2YXIgcG9zaXRpb25hbCA9IHJlYWREYXJ0VHlwZUxpc3QoKTsKICAgICAgICB2YXIgcmV0dXJuVHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlKHBvc2l0aW9uYWwsIHJldHVyblR5cGUpOwogICAgICBjYXNlIFRhZy5UeXBlUGFyYW1ldGVyVHlwZToKICAgICAgICBpbnQgaW5kZXggPSByZWFkVUludCgpOwogICAgICAgIHZhciBib3VuZCA9IHJlYWREYXJ0VHlwZU9wdGlvbigpOwogICAgICAgIHJldHVybiBuZXcgVHlwZVBhcmFtZXRlclR5cGUodHlwZVBhcmFtZXRlclN0YWNrW2luZGV4XSwgYm91bmQpOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IGZhaWwoJ3VuZXhwZWN0ZWQgZGFydCB0eXBlIHRhZzogJHRhZycpOwogICAgfQogIH0KCiAgTGlzdDxUeXBlUGFyYW1ldGVyPiByZWFkQW5kUHVzaFR5cGVQYXJhbWV0ZXJMaXN0KAogICAgICBbTGlzdDxUeXBlUGFyYW1ldGVyPiBsaXN0LCBUcmVlTm9kZSBwYXJlbnRdKSB7CiAgICBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIGxpc3QgPz8gPFR5cGVQYXJhbWV0ZXI+W107CiAgICBpZiAobGlzdCA9PSBudWxsKSB7CiAgICAgIGxpc3QgPSBuZXcgTGlzdDxUeXBlUGFyYW1ldGVyPi5maWxsZWQobGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICBsaXN0W2ldID0gbmV3IFR5cGVQYXJhbWV0ZXIobnVsbCwgbnVsbCkuLnBhcmVudCA9IHBhcmVudDsKICAgICAgfQogICAgfSBlbHNlIGlmIChsaXN0Lmxlbmd0aCAhPSBsZW5ndGgpIHsKICAgICAgbGlzdC5sZW5ndGggPSBsZW5ndGg7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICBsaXN0W2ldID0gbmV3IFR5cGVQYXJhbWV0ZXIobnVsbCwgbnVsbCkuLnBhcmVudCA9IHBhcmVudDsKICAgICAgfQogICAgfQogICAgdHlwZVBhcmFtZXRlclN0YWNrLmFkZEFsbChsaXN0KTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkgewogICAgICByZWFkVHlwZVBhcmFtZXRlcihsaXN0W2ldKTsKICAgIH0KICAgIHJldHVybiBsaXN0OwogIH0KCiAgdm9pZCByZWFkVHlwZVBhcmFtZXRlcihUeXBlUGFyYW1ldGVyIG5vZGUpIHsKICAgIG5vZGUuZmxhZ3MgPSByZWFkQnl0ZSgpOwogICAgbm9kZS5hbm5vdGF0aW9ucyA9IHJlYWRBbm5vdGF0aW9uTGlzdChub2RlKTsKICAgIG5vZGUubmFtZSA9IHJlYWRTdHJpbmdPck51bGxJZkVtcHR5KCk7CiAgICBub2RlLmJvdW5kID0gcmVhZERhcnRUeXBlKCk7CiAgICBub2RlLmRlZmF1bHRUeXBlID0gcmVhZERhcnRUeXBlT3B0aW9uKCk7CiAgfQoKICBBcmd1bWVudHMgcmVhZEFyZ3VtZW50cygpIHsKICAgIHZhciBudW1Bcmd1bWVudHMgPSByZWFkVUludCgpOwogICAgdmFyIHR5cGVBcmd1bWVudHMgPSByZWFkRGFydFR5cGVMaXN0KCk7CiAgICB2YXIgcG9zaXRpb25hbCA9IHJlYWRFeHByZXNzaW9uTGlzdCgpOwogICAgdmFyIG5hbWVkID0gcmVhZE5hbWVkRXhwcmVzc2lvbkxpc3QoKTsKICAgIGFzc2VydChudW1Bcmd1bWVudHMgPT0gcG9zaXRpb25hbC5sZW5ndGggKyBuYW1lZC5sZW5ndGgpOwogICAgcmV0dXJuIG5ldyBBcmd1bWVudHMocG9zaXRpb25hbCwgdHlwZXM6IHR5cGVBcmd1bWVudHMsIG5hbWVkOiBuYW1lZCk7CiAgfQoKICBMaXN0PE5hbWVkRXhwcmVzc2lvbj4gcmVhZE5hbWVkRXhwcmVzc2lvbkxpc3QoKSB7CiAgICBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIExpc3Q8TmFtZWRFeHByZXNzaW9uPiByZXN1bHQgPQogICAgICAgIG5ldyBMaXN0PE5hbWVkRXhwcmVzc2lvbj4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSByZWFkTmFtZWRFeHByZXNzaW9uKCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgTmFtZWRFeHByZXNzaW9uIHJlYWROYW1lZEV4cHJlc3Npb24oKSB7CiAgICByZXR1cm4gbmV3IE5hbWVkRXhwcmVzc2lvbihyZWFkU3RyaW5nUmVmZXJlbmNlKCksIHJlYWRFeHByZXNzaW9uKCkpOwogIH0KCiAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiByZWFkQW5kUHVzaFZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KCkgewogICAgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHJlc3VsdCA9CiAgICAgICAgbmV3IExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSByZWFkQW5kUHVzaFZhcmlhYmxlRGVjbGFyYXRpb24oKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlYWRBbmRQdXNoVmFyaWFibGVEZWNsYXJhdGlvbk9wdGlvbigpIHsKICAgIHJldHVybiByZWFkQW5kQ2hlY2tPcHRpb25UYWcoKSA/IHJlYWRBbmRQdXNoVmFyaWFibGVEZWNsYXJhdGlvbigpIDogbnVsbDsKICB9CgogIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVhZEFuZFB1c2hWYXJpYWJsZURlY2xhcmF0aW9uKCkgewogICAgdmFyIHZhcmlhYmxlID0gcmVhZFZhcmlhYmxlRGVjbGFyYXRpb24oKTsKICAgIHZhcmlhYmxlU3RhY2suYWRkKHZhcmlhYmxlKTsKICAgIHJldHVybiB2YXJpYWJsZTsKICB9CgogIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVhZFZhcmlhYmxlRGVjbGFyYXRpb24oKSB7CiAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgaW50IGZpbGVFcXVhbHNPZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAvLyBUaGUgW1ZhcmlhYmxlRGVjbGFyYXRpb25dIGluc3RhbmNlIGlzIG5vdCBjcmVhdGVkIGF0IHRoaXMgcG9pbnQgeWV0LAogICAgLy8gc28gYG51bGxgIGlzIHRlbXBvcmFyaWx5IHNldCBhcyB0aGUgcGFyZW50IG9mIHRoZSBhbm5vdGF0aW9uIG5vZGVzLgogICAgdmFyIGFubm90YXRpb25zID0gcmVhZEFubm90YXRpb25MaXN0KG51bGwpOwogICAgaW50IGZsYWdzID0gcmVhZEJ5dGUoKTsKICAgIHZhciBub2RlID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24ocmVhZFN0cmluZ09yTnVsbElmRW1wdHkoKSwKICAgICAgICB0eXBlOiByZWFkRGFydFR5cGUoKSwgaW5pdGlhbGl6ZXI6IHJlYWRFeHByZXNzaW9uT3B0aW9uKCksIGZsYWdzOiBmbGFncykKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0CiAgICAgIC4uZmlsZUVxdWFsc09mZnNldCA9IGZpbGVFcXVhbHNPZmZzZXQ7CiAgICBpZiAoYW5ub3RhdGlvbnMuaXNOb3RFbXB0eSkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIGFubm90YXRpb24gPSBhbm5vdGF0aW9uc1tpXTsKICAgICAgICBhbm5vdGF0aW9uLnBhcmVudCA9IG5vZGU7CiAgICAgIH0KICAgICAgbm9kZS5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zOwogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBpbnQgcmVhZE9mZnNldCgpIHsKICAgIC8vIE9mZnNldCBpcyBzYXZlZCBhcyB1bnNpZ25lZCwKICAgIC8vIGJ1dCBhY3R1YWxseSByYW5nZXMgZnJvbSAtMSBhbmQgdXAgKHRodXMgdGhlIC0xKQogICAgcmV0dXJuIHJlYWRVSW50KCkgLSAxOwogIH0KfQoKY2xhc3MgQmluYXJ5QnVpbGRlcldpdGhNZXRhZGF0YSBleHRlbmRzIEJpbmFyeUJ1aWxkZXIgaW1wbGVtZW50cyBCaW5hcnlTb3VyY2UgewogIC8vLyBMaXN0IG9mIG1ldGFkYXRhIHN1YnNlY3Rpb25zIHRoYXQgaGF2ZSBjb3JyZXNwb25kaW5nIFtNZXRhZGF0YVJlcG9zaXRvcnldCiAgLy8vIGFuZCBhcmUgYXdhaXRpbmcgdG8gYmUgcGFyc2VkIGFuZCBhdHRhY2hlZCB0byBub2Rlcy4KICBMaXN0PF9NZXRhZGF0YVN1YnNlY3Rpb24+IF9zdWJzZWN0aW9uczsKCiAgQmluYXJ5QnVpbGRlcldpdGhNZXRhZGF0YShieXRlcywgW2ZpbGVuYW1lXSkKICAgICAgOiBzdXBlcihieXRlcywgZmlsZW5hbWU6IGZpbGVuYW1lKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBfcmVhZE1ldGFkYXRhTWFwcGluZ3MoCiAgICAgIENvbXBvbmVudCBjb21wb25lbnQsIGludCBiaW5hcnlPZmZzZXRGb3JNZXRhZGF0YVBheWxvYWRzKSB7CiAgICAvLyBBdCB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgZnVuY3Rpb24gX2J5dGVPZmZzZXQgcG9pbnRzIHJpZ2h0IHBhc3QKICAgIC8vIG1ldGFkYXRhTWFwcGluZ3MgdG8gc3RyaW5nIHRhYmxlLgoKICAgIC8vIFJlYWQgdGhlIGxlbmd0aCBvZiBtZXRhZGF0YU1hcHBpbmdzLgogICAgX2J5dGVPZmZzZXQgLT0gNDsKICAgIGZpbmFsIHN1YlNlY3Rpb25Db3VudCA9IHJlYWRVaW50MzIoKTsKCiAgICBpbnQgZW5kT2Zmc2V0ID0gX2J5dGVPZmZzZXQgLSA0OyAvLyBFbmQgb2Zmc2V0IG9mIHRoZSBjdXJyZW50IHN1YnNlY3Rpb24uCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN1YlNlY3Rpb25Db3VudDsgaSsrKSB7CiAgICAgIC8vIFJMaXN0PFBhaXI8VUludDMyLCBVSW50MzI+PiBub2RlT2Zmc2V0VG9NZXRhZGF0YU9mZnNldAogICAgICBfYnl0ZU9mZnNldCA9IGVuZE9mZnNldCAtIDQ7CiAgICAgIGZpbmFsIG1hcHBpbmdMZW5ndGggPSByZWFkVWludDMyKCk7CiAgICAgIGZpbmFsIG1hcHBpbmdTdGFydCA9IChlbmRPZmZzZXQgLSA0KSAtIDQgKiAyICogbWFwcGluZ0xlbmd0aDsKICAgICAgX2J5dGVPZmZzZXQgPSBtYXBwaW5nU3RhcnQgLSA0OwoKICAgICAgLy8gVUludDMyIHRhZyAoZml4ZWQgc2l6ZSBTdHJpbmdSZWZlcmVuY2UpCiAgICAgIGZpbmFsIHRhZyA9IF9zdHJpbmdUYWJsZVtyZWFkVWludDMyKCldOwoKICAgICAgZmluYWwgcmVwb3NpdG9yeSA9IGNvbXBvbmVudC5tZXRhZGF0YVt0YWddOwogICAgICBpZiAocmVwb3NpdG9yeSAhPSBudWxsKSB7CiAgICAgICAgLy8gUmVhZCBub2RlT2Zmc2V0VG9NZXRhZGF0YU9mZnNldCBtYXBwaW5nLgogICAgICAgIGZpbmFsIG1hcHBpbmcgPSA8aW50LCBpbnQ+e307CiAgICAgICAgX2J5dGVPZmZzZXQgPSBtYXBwaW5nU3RhcnQ7CiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBtYXBwaW5nTGVuZ3RoOyBqKyspIHsKICAgICAgICAgIGZpbmFsIG5vZGVPZmZzZXQgPSByZWFkVWludDMyKCk7CiAgICAgICAgICBmaW5hbCBtZXRhZGF0YU9mZnNldCA9IGJpbmFyeU9mZnNldEZvck1ldGFkYXRhUGF5bG9hZHMgKyByZWFkVWludDMyKCk7CiAgICAgICAgICBtYXBwaW5nW25vZGVPZmZzZXRdID0gbWV0YWRhdGFPZmZzZXQ7CiAgICAgICAgfQoKICAgICAgICBfc3Vic2VjdGlvbnMgPz89IDxfTWV0YWRhdGFTdWJzZWN0aW9uPltdOwogICAgICAgIF9zdWJzZWN0aW9ucy5hZGQobmV3IF9NZXRhZGF0YVN1YnNlY3Rpb24ocmVwb3NpdG9yeSwgbWFwcGluZykpOwogICAgICB9CgogICAgICAvLyBTdGFydCBvZiB0aGUgc3Vic2VjdGlvbiBhbmQgdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgb25lLgogICAgICBlbmRPZmZzZXQgPSBtYXBwaW5nU3RhcnQgLSA0OwogICAgfQogIH0KCiAgT2JqZWN0IF9yZWFkTWV0YWRhdGEoTm9kZSBub2RlLCBNZXRhZGF0YVJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgaW50IG9mZnNldCkgewogICAgZmluYWwgaW50IHNhdmVkT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBfYnl0ZU9mZnNldCA9IG9mZnNldDsKCiAgICBmaW5hbCBtZXRhZGF0YSA9IHJlcG9zaXRvcnkucmVhZEZyb21CaW5hcnkobm9kZSwgdGhpcyk7CgogICAgX2J5dGVPZmZzZXQgPSBzYXZlZE9mZnNldDsKICAgIHJldHVybiBtZXRhZGF0YTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW50ZXJTY29wZSh7TGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyc30pIHsKICAgIGlmICh0eXBlUGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIHR5cGVQYXJhbWV0ZXJTdGFjay5hZGRBbGwodHlwZVBhcmFtZXRlcnMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBsZWF2ZVNjb3BlKHtMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzfSkgewogICAgaWYgKHR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgdHlwZVBhcmFtZXRlclN0YWNrLmxlbmd0aCAtPSB0eXBlUGFyYW1ldGVycy5sZW5ndGg7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBOb2RlIF9hc3NvY2lhdGVNZXRhZGF0YShOb2RlIG5vZGUsIGludCBub2RlT2Zmc2V0KSB7CiAgICBpZiAoX3N1YnNlY3Rpb25zID09IG51bGwpIHsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgZm9yICh2YXIgc3Vic2VjdGlvbiBpbiBfc3Vic2VjdGlvbnMpIHsKICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhlcmUgaXMgYW55IG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCiAgICAgIGZpbmFsIG1ldGFkYXRhT2Zmc2V0ID0gc3Vic2VjdGlvbi5tYXBwaW5nW25vZGVPZmZzZXRdOwogICAgICBpZiAobWV0YWRhdGFPZmZzZXQgIT0gbnVsbCkgewogICAgICAgIHN1YnNlY3Rpb24ucmVwb3NpdG9yeS5tYXBwaW5nW25vZGVdID0KICAgICAgICAgICAgX3JlYWRNZXRhZGF0YShub2RlLCBzdWJzZWN0aW9uLnJlcG9zaXRvcnksIG1ldGFkYXRhT2Zmc2V0KTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgcmVhZERhcnRUeXBlKCkgewogICAgZmluYWwgbm9kZU9mZnNldCA9IF9ieXRlT2Zmc2V0OwogICAgZmluYWwgcmVzdWx0ID0gc3VwZXIucmVhZERhcnRUeXBlKCk7CiAgICByZXR1cm4gX2Fzc29jaWF0ZU1ldGFkYXRhKHJlc3VsdCwgbm9kZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaWJyYXJ5IHJlYWRMaWJyYXJ5KENvbXBvbmVudCBjb21wb25lbnQsIGludCBlbmRPZmZzZXQpIHsKICAgIGZpbmFsIG5vZGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKICAgIGZpbmFsIHJlc3VsdCA9IHN1cGVyLnJlYWRMaWJyYXJ5KGNvbXBvbmVudCwgZW5kT2Zmc2V0KTsKICAgIHJldHVybiBfYXNzb2NpYXRlTWV0YWRhdGEocmVzdWx0LCBub2RlT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVkZWYgcmVhZFR5cGVkZWYoKSB7CiAgICBmaW5hbCBub2RlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBmaW5hbCByZXN1bHQgPSBzdXBlci5yZWFkVHlwZWRlZigpOwogICAgcmV0dXJuIF9hc3NvY2lhdGVNZXRhZGF0YShyZXN1bHQsIG5vZGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3MgcmVhZENsYXNzKGludCBlbmRPZmZzZXQpIHsKICAgIGZpbmFsIG5vZGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKICAgIGZpbmFsIHJlc3VsdCA9IHN1cGVyLnJlYWRDbGFzcyhlbmRPZmZzZXQpOwogICAgcmV0dXJuIF9hc3NvY2lhdGVNZXRhZGF0YShyZXN1bHQsIG5vZGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRmllbGQgcmVhZEZpZWxkKCkgewogICAgZmluYWwgbm9kZU9mZnNldCA9IF9ieXRlT2Zmc2V0OwogICAgZmluYWwgcmVzdWx0ID0gc3VwZXIucmVhZEZpZWxkKCk7CiAgICByZXR1cm4gX2Fzc29jaWF0ZU1ldGFkYXRhKHJlc3VsdCwgbm9kZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdHJ1Y3RvciByZWFkQ29uc3RydWN0b3IoKSB7CiAgICBmaW5hbCBub2RlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBmaW5hbCByZXN1bHQgPSBzdXBlci5yZWFkQ29uc3RydWN0b3IoKTsKICAgIHJldHVybiBfYXNzb2NpYXRlTWV0YWRhdGEocmVzdWx0LCBub2RlT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIFByb2NlZHVyZSByZWFkUHJvY2VkdXJlKGludCBlbmRPZmZzZXQpIHsKICAgIGZpbmFsIG5vZGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKICAgIGZpbmFsIHJlc3VsdCA9IHN1cGVyLnJlYWRQcm9jZWR1cmUoZW5kT2Zmc2V0KTsKICAgIHJldHVybiBfYXNzb2NpYXRlTWV0YWRhdGEocmVzdWx0LCBub2RlT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIHJlYWRSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcigpIHsKICAgIGZpbmFsIG5vZGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKICAgIGZpbmFsIHJlc3VsdCA9IHN1cGVyLnJlYWRSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcigpOwogICAgcmV0dXJuIF9hc3NvY2lhdGVNZXRhZGF0YShyZXN1bHQsIG5vZGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXIgcmVhZEluaXRpYWxpemVyKCkgewogICAgZmluYWwgbm9kZU9mZnNldCA9IF9ieXRlT2Zmc2V0OwogICAgZmluYWwgcmVzdWx0ID0gc3VwZXIucmVhZEluaXRpYWxpemVyKCk7CiAgICByZXR1cm4gX2Fzc29jaWF0ZU1ldGFkYXRhKHJlc3VsdCwgbm9kZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbk5vZGUgcmVhZEZ1bmN0aW9uTm9kZSgKICAgICAge2Jvb2wgbGF6eUxvYWRCb2R5OiBmYWxzZSwgaW50IG91dGVyRW5kT2Zmc2V0OiAtMX0pIHsKICAgIGZpbmFsIG5vZGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKICAgIGZpbmFsIHJlc3VsdCA9IHN1cGVyLnJlYWRGdW5jdGlvbk5vZGUoCiAgICAgICAgbGF6eUxvYWRCb2R5OiBsYXp5TG9hZEJvZHksIG91dGVyRW5kT2Zmc2V0OiBvdXRlckVuZE9mZnNldCk7CiAgICByZXR1cm4gX2Fzc29jaWF0ZU1ldGFkYXRhKHJlc3VsdCwgbm9kZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIHJlYWRFeHByZXNzaW9uKCkgewogICAgZmluYWwgbm9kZU9mZnNldCA9IF9ieXRlT2Zmc2V0OwogICAgZmluYWwgcmVzdWx0ID0gc3VwZXIucmVhZEV4cHJlc3Npb24oKTsKICAgIHJldHVybiBfYXNzb2NpYXRlTWV0YWRhdGEocmVzdWx0LCBub2RlT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIEFyZ3VtZW50cyByZWFkQXJndW1lbnRzKCkgewogICAgZmluYWwgbm9kZU9mZnNldCA9IF9ieXRlT2Zmc2V0OwogICAgZmluYWwgcmVzdWx0ID0gc3VwZXIucmVhZEFyZ3VtZW50cygpOwogICAgcmV0dXJuIF9hc3NvY2lhdGVNZXRhZGF0YShyZXN1bHQsIG5vZGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgTmFtZWRFeHByZXNzaW9uIHJlYWROYW1lZEV4cHJlc3Npb24oKSB7CiAgICBmaW5hbCBub2RlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBmaW5hbCByZXN1bHQgPSBzdXBlci5yZWFkTmFtZWRFeHByZXNzaW9uKCk7CiAgICByZXR1cm4gX2Fzc29jaWF0ZU1ldGFkYXRhKHJlc3VsdCwgbm9kZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlYWRWYXJpYWJsZURlY2xhcmF0aW9uKCkgewogICAgZmluYWwgbm9kZU9mZnNldCA9IF9ieXRlT2Zmc2V0OwogICAgZmluYWwgcmVzdWx0ID0gc3VwZXIucmVhZFZhcmlhYmxlRGVjbGFyYXRpb24oKTsKICAgIHJldHVybiBfYXNzb2NpYXRlTWV0YWRhdGEocmVzdWx0LCBub2RlT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIFN0YXRlbWVudCByZWFkU3RhdGVtZW50KCkgewogICAgZmluYWwgbm9kZU9mZnNldCA9IF9ieXRlT2Zmc2V0OwogICAgZmluYWwgcmVzdWx0ID0gc3VwZXIucmVhZFN0YXRlbWVudCgpOwogICAgcmV0dXJuIF9hc3NvY2lhdGVNZXRhZGF0YShyZXN1bHQsIG5vZGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29tYmluYXRvciByZWFkQ29tYmluYXRvcigpIHsKICAgIGZpbmFsIG5vZGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKICAgIGZpbmFsIHJlc3VsdCA9IHN1cGVyLnJlYWRDb21iaW5hdG9yKCk7CiAgICByZXR1cm4gX2Fzc29jaWF0ZU1ldGFkYXRhKHJlc3VsdCwgbm9kZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaWJyYXJ5RGVwZW5kZW5jeSByZWFkTGlicmFyeURlcGVuZGVuY3koTGlicmFyeSBsaWJyYXJ5KSB7CiAgICBmaW5hbCBub2RlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBmaW5hbCByZXN1bHQgPSBzdXBlci5yZWFkTGlicmFyeURlcGVuZGVuY3kobGlicmFyeSk7CiAgICByZXR1cm4gX2Fzc29jaWF0ZU1ldGFkYXRhKHJlc3VsdCwgbm9kZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaWJyYXJ5UGFydCByZWFkTGlicmFyeVBhcnQoTGlicmFyeSBsaWJyYXJ5KSB7CiAgICBmaW5hbCBub2RlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBmaW5hbCByZXN1bHQgPSBzdXBlci5yZWFkTGlicmFyeVBhcnQobGlicmFyeSk7CiAgICByZXR1cm4gX2Fzc29jaWF0ZU1ldGFkYXRhKHJlc3VsdCwgbm9kZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlYWRTd2l0Y2hDYXNlSW50byhTd2l0Y2hDYXNlIGNhc2VOb2RlKSB7CiAgICBfYXNzb2NpYXRlTWV0YWRhdGEoY2FzZU5vZGUsIF9ieXRlT2Zmc2V0KTsKICAgIHN1cGVyLnJlYWRTd2l0Y2hDYXNlSW50byhjYXNlTm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlYWRUeXBlUGFyYW1ldGVyKFR5cGVQYXJhbWV0ZXIgcGFyYW0pIHsKICAgIF9hc3NvY2lhdGVNZXRhZGF0YShwYXJhbSwgX2J5dGVPZmZzZXQpOwogICAgc3VwZXIucmVhZFR5cGVQYXJhbWV0ZXIocGFyYW0pOwogIH0KCiAgQG92ZXJyaWRlCiAgU3VwZXJ0eXBlIHJlYWRTdXBlcnR5cGUoKSB7CiAgICBmaW5hbCBub2RlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBJbnRlcmZhY2VUeXBlIHR5cGUgPSBzdXBlci5yZWFkRGFydFR5cGUoKTsKICAgIHJldHVybiBfYXNzb2NpYXRlTWV0YWRhdGEoCiAgICAgICAgbmV3IFN1cGVydHlwZS5ieVJlZmVyZW5jZSh0eXBlLmNsYXNzTmFtZSwgdHlwZS50eXBlQXJndW1lbnRzKSwKICAgICAgICBub2RlT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIE5hbWUgcmVhZE5hbWUoKSB7CiAgICBmaW5hbCBub2RlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBmaW5hbCByZXN1bHQgPSBzdXBlci5yZWFkTmFtZSgpOwogICAgcmV0dXJuIF9hc3NvY2lhdGVNZXRhZGF0YShyZXN1bHQsIG5vZGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBjdXJyZW50T2Zmc2V0ID0+IF9ieXRlT2Zmc2V0OwoKICBAb3ZlcnJpZGUKICBMaXN0PGludD4gZ2V0IGJ5dGVzID0+IF9ieXRlczsKfQoKLy8vIERlc2VyaWFsaXplZCBNZXRhZGF0YU1hcHBpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gbWV0YWRhdGEgcmVwb3NpdG9yeS4KY2xhc3MgX01ldGFkYXRhU3Vic2VjdGlvbiB7CiAgLy8vIFtNZXRhZGF0YVJlcG9zaXRvcnldIHRoYXQgY2FuIHJlYWQgdGhpcyBzdWJzZWN0aW9uLgogIGZpbmFsIE1ldGFkYXRhUmVwb3NpdG9yeSByZXBvc2l0b3J5OwoKICAvLy8gRGVzZXJpYWxpemVkIG1hcHBpbmcgZnJvbSBub2RlIG9mZnNldHMgdG8gbWV0YWRhdGEgb2Zmc2V0cy4KICBmaW5hbCBNYXA8aW50LCBpbnQ+IG1hcHBpbmc7CgogIF9NZXRhZGF0YVN1YnNlY3Rpb24odGhpcy5yZXBvc2l0b3J5LCB0aGlzLm1hcHBpbmcpOwp9CokYAE5OPCABIhcaARYoEwETExESDwFIAUICASIVASsBFjMyBAIBGxgBJAIBGCgBIiUnJyIkGxwUIAIBFktCGjtEGRoXMC05Ih0bIQFGKCcBMAFQUCYkAUoyARkeUQQBJQErARMbHBITIxIwDRIlHx4WBgQBFSAdHBQEATggARg/KCgoKCgoKCgdBAEkLTohEgQBHSIEASlQRx8uJysrGxgVBig/HSE0BhMEATUeQjkE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OwoKICBTdHJpbmcgZ2V0TmFtZShUIGtleSkgPT4gbWFwLnB1dElmQWJzZW50KGtleSwgKCkgPT4gJyRwcmVmaXgkeysraW5kZXh9Jyk7CgogIFN0cmluZyBnZXQgcHJlZml4Owp9CgpjbGFzcyBOb3JtYWxOYW1lcjxUPiBleHRlbmRzIE5hbWVyPFQ+IHsKICBmaW5hbCBTdHJpbmcgcHJlZml4OwogIE5vcm1hbE5hbWVyKHRoaXMucHJlZml4KTsKfQoKY2xhc3MgQ29uc3RhbnROYW1lciBleHRlbmRzIFJlY3Vyc2l2ZVZpc2l0b3I8TnVsbD4gd2l0aCBOYW1lcjxDb25zdGFudD4gewogIGZpbmFsIFN0cmluZyBwcmVmaXg7CiAgQ29uc3RhbnROYW1lcih0aGlzLnByZWZpeCk7CgogIFN0cmluZyBnZXROYW1lKENvbnN0YW50IGNvbnN0YW50KSB7CiAgICBpZiAoIW1hcC5jb250YWluc0tleShjb25zdGFudCkpIHsKICAgICAgLy8gTmFtZSBldmVyeXRoaW5nIGluIHBvc3Qtb3JkZXIgdmlzaXQgb2YgREFHLgogICAgICBjb25zdGFudC52aXNpdENoaWxkcmVuKHRoaXMpOwogICAgfQogICAgcmV0dXJuIHN1cGVyLmdldE5hbWUoY29uc3RhbnQpOwogIH0KCiAgZGVmYXVsdENvbnN0YW50UmVmZXJlbmNlKENvbnN0YW50IGNvbnN0YW50KSB7CiAgICBnZXROYW1lKGNvbnN0YW50KTsKICB9Cn0KCmNsYXNzIERpc2FtYmlndWF0b3I8VCwgVT4gewogIGZpbmFsIE1hcDxULCBTdHJpbmc+IG5hbWVzVCA9IDxULCBTdHJpbmc+e307CiAgZmluYWwgTWFwPFUsIFN0cmluZz4gbmFtZXNVID0gPFUsIFN0cmluZz57fTsKICBmaW5hbCBTZXQ8U3RyaW5nPiB1c2VkTmFtZXMgPSBuZXcgU2V0PFN0cmluZz4oKTsKCiAgU3RyaW5nIGRpc2FtYmlndWF0ZShUIGtleTEsIFUga2V5MiwgU3RyaW5nIHByb3Bvc2VOYW1lKCkpIHsKICAgIGdldE5ld05hbWUoKSB7CiAgICAgIHZhciBwcm9wb3NlZE5hbWUgPSBwcm9wb3NlTmFtZSgpOwogICAgICBpZiAodXNlZE5hbWVzLmFkZChwcm9wb3NlZE5hbWUpKSByZXR1cm4gcHJvcG9zZWROYW1lOwogICAgICBpbnQgaSA9IDI7CiAgICAgIHdoaWxlICghdXNlZE5hbWVzLmFkZCgnJHByb3Bvc2VkTmFtZSRpJykpIHsKICAgICAgICArK2k7CiAgICAgIH0KICAgICAgcmV0dXJuICckcHJvcG9zZWROYW1lJGknOwogICAgfQoKICAgIGlmIChrZXkxICE9IG51bGwpIHsKICAgICAgU3RyaW5nIHJlc3VsdCA9IG5hbWVzVFtrZXkxXTsKICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSByZXR1cm4gcmVzdWx0OwogICAgICByZXR1cm4gbmFtZXNUW2tleTFdID0gZ2V0TmV3TmFtZSgpOwogICAgfQogICAgaWYgKGtleTIgIT0gbnVsbCkgewogICAgICBTdHJpbmcgcmVzdWx0ID0gbmFtZXNVW2tleTJdOwogICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHJldHVybiByZXN1bHQ7CiAgICAgIHJldHVybiBuYW1lc1Vba2V5Ml0gPSBnZXROZXdOYW1lKCk7CiAgICB9CiAgICB0aHJvdyAiQ2Fubm90IGRpc2FtYmlndWF0ZSI7CiAgfQp9CgpOYW1lU3lzdGVtIGdsb2JhbERlYnVnZ2luZ05hbWVzID0gbmV3IE5hbWVTeXN0ZW0oKTsKClN0cmluZyBkZWJ1Z0xpYnJhcnlOYW1lKExpYnJhcnkgbm9kZSkgewogIHJldHVybiBub2RlID09IG51bGwKICAgICAgPyAnbnVsbCcKICAgICAgOiBub2RlLm5hbWUgPz8gZ2xvYmFsRGVidWdnaW5nTmFtZXMubmFtZUxpYnJhcnkobm9kZSk7Cn0KClN0cmluZyBkZWJ1Z0NsYXNzTmFtZShDbGFzcyBub2RlKSB7CiAgcmV0dXJuIG5vZGUgPT0gbnVsbAogICAgICA/ICdudWxsJwogICAgICA6IG5vZGUubmFtZSA/PyBnbG9iYWxEZWJ1Z2dpbmdOYW1lcy5uYW1lQ2xhc3Mobm9kZSk7Cn0KClN0cmluZyBkZWJ1Z1F1YWxpZmllZENsYXNzTmFtZShDbGFzcyBub2RlKSB7CiAgcmV0dXJuIGRlYnVnTGlicmFyeU5hbWUobm9kZS5lbmNsb3NpbmdMaWJyYXJ5KSArICc6OicgKyBkZWJ1Z0NsYXNzTmFtZShub2RlKTsKfQoKU3RyaW5nIGRlYnVnTWVtYmVyTmFtZShNZW1iZXIgbm9kZSkgewogIHJldHVybiBub2RlLm5hbWU/Lm5hbWUgPz8gZ2xvYmFsRGVidWdnaW5nTmFtZXMubmFtZU1lbWJlcihub2RlKTsKfQoKU3RyaW5nIGRlYnVnUXVhbGlmaWVkTWVtYmVyTmFtZShNZW1iZXIgbm9kZSkgewogIGlmIChub2RlLmVuY2xvc2luZ0NsYXNzICE9IG51bGwpIHsKICAgIHJldHVybiBkZWJ1Z1F1YWxpZmllZENsYXNzTmFtZShub2RlLmVuY2xvc2luZ0NsYXNzKSArCiAgICAgICAgJzo6JyArCiAgICAgICAgZGVidWdNZW1iZXJOYW1lKG5vZGUpOwogIH0gZWxzZSB7CiAgICByZXR1cm4gZGVidWdMaWJyYXJ5TmFtZShub2RlLmVuY2xvc2luZ0xpYnJhcnkpICsKICAgICAgICAnOjonICsKICAgICAgICBkZWJ1Z01lbWJlck5hbWUobm9kZSk7CiAgfQp9CgpTdHJpbmcgZGVidWdUeXBlUGFyYW1ldGVyTmFtZShUeXBlUGFyYW1ldGVyIG5vZGUpIHsKICByZXR1cm4gbm9kZS5uYW1lID8/IGdsb2JhbERlYnVnZ2luZ05hbWVzLm5hbWVUeXBlUGFyYW1ldGVyKG5vZGUpOwp9CgpTdHJpbmcgZGVidWdRdWFsaWZpZWRUeXBlUGFyYW1ldGVyTmFtZShUeXBlUGFyYW1ldGVyIG5vZGUpIHsKICBpZiAobm9kZS5wYXJlbnQgaXMgQ2xhc3MpIHsKICAgIHJldHVybiBkZWJ1Z1F1YWxpZmllZENsYXNzTmFtZShub2RlLnBhcmVudCkgKwogICAgICAgICc6OicgKwogICAgICAgIGRlYnVnVHlwZVBhcmFtZXRlck5hbWUobm9kZSk7CiAgfQogIGlmIChub2RlLnBhcmVudCBpcyBNZW1iZXIpIHsKICAgIHJldHVybiBkZWJ1Z1F1YWxpZmllZE1lbWJlck5hbWUobm9kZS5wYXJlbnQpICsKICAgICAgICAnOjonICsKICAgICAgICBkZWJ1Z1R5cGVQYXJhbWV0ZXJOYW1lKG5vZGUpOwogIH0KICByZXR1cm4gZGVidWdUeXBlUGFyYW1ldGVyTmFtZShub2RlKTsKfQoKU3RyaW5nIGRlYnVnVmFyaWFibGVEZWNsYXJhdGlvbk5hbWUoVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgcmV0dXJuIG5vZGUubmFtZSA/PyBnbG9iYWxEZWJ1Z2dpbmdOYW1lcy5uYW1lVmFyaWFibGUobm9kZSk7Cn0KClN0cmluZyBkZWJ1Z05vZGVUb1N0cmluZyhOb2RlIG5vZGUpIHsKICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogIG5ldyBQcmludGVyKGJ1ZmZlciwgc3ludGhldGljTmFtZXM6IGdsb2JhbERlYnVnZ2luZ05hbWVzKS53cml0ZU5vZGUobm9kZSk7CiAgcmV0dXJuICckYnVmZmVyJzsKfQoKU3RyaW5nIGNvbXBvbmVudFRvU3RyaW5nKENvbXBvbmVudCBub2RlKSB7CiAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICBuZXcgUHJpbnRlcihidWZmZXIsIHN5bnRoZXRpY05hbWVzOiBuZXcgTmFtZVN5c3RlbSgpKQogICAgICAud3JpdGVDb21wb25lbnRGaWxlKG5vZGUpOwogIHJldHVybiAnJGJ1ZmZlcic7Cn0KCmNsYXNzIE5hbWVTeXN0ZW0gewogIGZpbmFsIE5hbWVyPFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlcyA9CiAgICAgIG5ldyBOb3JtYWxOYW1lcjxWYXJpYWJsZURlY2xhcmF0aW9uPignI3QnKTsKICBmaW5hbCBOYW1lcjxNZW1iZXI+IG1lbWJlcnMgPSBuZXcgTm9ybWFsTmFtZXI8TWVtYmVyPignI20nKTsKICBmaW5hbCBOYW1lcjxDbGFzcz4gY2xhc3NlcyA9IG5ldyBOb3JtYWxOYW1lcjxDbGFzcz4oJyNjbGFzcycpOwogIGZpbmFsIE5hbWVyPExpYnJhcnk+IGxpYnJhcmllcyA9IG5ldyBOb3JtYWxOYW1lcjxMaWJyYXJ5PignI2xpYicpOwogIGZpbmFsIE5hbWVyPFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzID0KICAgICAgbmV3IE5vcm1hbE5hbWVyPFR5cGVQYXJhbWV0ZXI+KCcjVCcpOwogIGZpbmFsIE5hbWVyPFRyZWVOb2RlPiBsYWJlbHMgPSBuZXcgTm9ybWFsTmFtZXI8VHJlZU5vZGU+KCcjTCcpOwogIGZpbmFsIE5hbWVyPENvbnN0YW50PiBjb25zdGFudHMgPSBuZXcgQ29uc3RhbnROYW1lcignI0MnKTsKICBmaW5hbCBEaXNhbWJpZ3VhdG9yPFJlZmVyZW5jZSwgQ2Fub25pY2FsTmFtZT4gcHJlZml4ZXMgPQogICAgICBuZXcgRGlzYW1iaWd1YXRvcjxSZWZlcmVuY2UsIENhbm9uaWNhbE5hbWU+KCk7CgogIG5hbWVWYXJpYWJsZShWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpID0+IHZhcmlhYmxlcy5nZXROYW1lKG5vZGUpOwogIG5hbWVNZW1iZXIoTWVtYmVyIG5vZGUpID0+IG1lbWJlcnMuZ2V0TmFtZShub2RlKTsKICBuYW1lQ2xhc3MoQ2xhc3Mgbm9kZSkgPT4gY2xhc3Nlcy5nZXROYW1lKG5vZGUpOwogIG5hbWVMaWJyYXJ5KExpYnJhcnkgbm9kZSkgPT4gbGlicmFyaWVzLmdldE5hbWUobm9kZSk7CiAgbmFtZVR5cGVQYXJhbWV0ZXIoVHlwZVBhcmFtZXRlciBub2RlKSA9PiB0eXBlUGFyYW1ldGVycy5nZXROYW1lKG5vZGUpOwogIG5hbWVTd2l0Y2hDYXNlKFN3aXRjaENhc2Ugbm9kZSkgPT4gbGFiZWxzLmdldE5hbWUobm9kZSk7CiAgbmFtZUxhYmVsZWRTdGF0ZW1lbnQoTGFiZWxlZFN0YXRlbWVudCBub2RlKSA9PiBsYWJlbHMuZ2V0TmFtZShub2RlKTsKICBuYW1lQ29uc3RhbnQoQ29uc3RhbnQgbm9kZSkgPT4gY29uc3RhbnRzLmdldE5hbWUobm9kZSk7CgogIGZpbmFsIFJlZ0V4cCBwYXRoU2VwYXJhdG9yID0gbmV3IFJlZ0V4cCgnW1xcL10nKTsKCiAgbmFtZUxpYnJhcnlQcmVmaXgoTGlicmFyeSBub2RlLCB7U3RyaW5nIHByb3Bvc2VkTmFtZX0pIHsKICAgIHJldHVybiBwcmVmaXhlcy5kaXNhbWJpZ3VhdGUobm9kZS5yZWZlcmVuY2UsIG5vZGUucmVmZXJlbmNlLmNhbm9uaWNhbE5hbWUsCiAgICAgICAgKCkgewogICAgICBpZiAocHJvcG9zZWROYW1lICE9IG51bGwpIHJldHVybiBwcm9wb3NlZE5hbWU7CiAgICAgIGlmIChub2RlLm5hbWUgIT0gbnVsbCkgcmV0dXJuIGFiYnJldmlhdGVOYW1lKG5vZGUubmFtZSk7CiAgICAgIGlmIChub2RlLmltcG9ydFVyaSAhPSBudWxsKSB7CiAgICAgICAgdmFyIHBhdGggPSBub2RlLmltcG9ydFVyaS5oYXNFbXB0eVBhdGgKICAgICAgICAgICAgPyAnJHtub2RlLmltcG9ydFVyaX0nCiAgICAgICAgICAgIDogbm9kZS5pbXBvcnRVcmkucGF0aFNlZ21lbnRzLmxhc3Q7CiAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoJy5kYXJ0JykpIHsKICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCAtICcuZGFydCcubGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFiYnJldmlhdGVOYW1lKHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiAnTCc7CiAgICB9KTsKICB9CgogIG5hbWVDYW5vbmljYWxOYW1lQXNMaWJyYXJ5UHJlZml4KFJlZmVyZW5jZSBub2RlLCBDYW5vbmljYWxOYW1lIG5hbWUsCiAgICAgIHtTdHJpbmcgcHJvcG9zZWROYW1lfSkgewogICAgcmV0dXJuIHByZWZpeGVzLmRpc2FtYmlndWF0ZShub2RlLCBuYW1lLCAoKSB7CiAgICAgIGlmIChwcm9wb3NlZE5hbWUgIT0gbnVsbCkgcmV0dXJuIHByb3Bvc2VkTmFtZTsKICAgICAgQ2Fub25pY2FsTmFtZSBjYW5vbmljYWxOYW1lID0gbmFtZSA/PyBub2RlLmNhbm9uaWNhbE5hbWU7CiAgICAgIGlmIChjYW5vbmljYWxOYW1lPy5uYW1lICE9IG51bGwpIHsKICAgICAgICB2YXIgcGF0aCA9IGNhbm9uaWNhbE5hbWUubmFtZTsKICAgICAgICBpbnQgc2xhc2ggPSBwYXRoLmxhc3RJbmRleE9mKHBhdGhTZXBhcmF0b3IpOwogICAgICAgIGlmIChzbGFzaCA+PSAwKSB7CiAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoc2xhc2ggKyAxKTsKICAgICAgICB9CiAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoJy5kYXJ0JykpIHsKICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCAtICcuZGFydCcubGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFiYnJldmlhdGVOYW1lKHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiAnTCc7CiAgICB9KTsKICB9CgogIGZpbmFsIFJlZ0V4cCBwdW5jdHVhdGlvbiA9IG5ldyBSZWdFeHAoJ1suOl0nKTsKCiAgU3RyaW5nIGFiYnJldmlhdGVOYW1lKFN0cmluZyBuYW1lKSB7CiAgICBpbnQgZG90ID0gbmFtZS5sYXN0SW5kZXhPZihwdW5jdHVhdGlvbik7CiAgICBpZiAoZG90ICE9IC0xKSB7CiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhkb3QgKyAxKTsKICAgIH0KICAgIGlmIChuYW1lLmxlbmd0aCA+IDQpIHsKICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIDMpOwogICAgfQogICAgcmV0dXJuIG5hbWU7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBBbm5vdGF0b3IgewogIFN0cmluZyBhbm5vdGF0ZVZhcmlhYmxlKFByaW50ZXIgcHJpbnRlciwgVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKTsKICBTdHJpbmcgYW5ub3RhdGVSZXR1cm4oUHJpbnRlciBwcmludGVyLCBGdW5jdGlvbk5vZGUgbm9kZSk7CiAgU3RyaW5nIGFubm90YXRlRmllbGQoUHJpbnRlciBwcmludGVyLCBGaWVsZCBub2RlKTsKfQoKLy8vIEEgcXVpY2sgYW5kIGRpcnR5IGFtYmlndW91cyB0ZXh0IHByaW50ZXIuCmNsYXNzIFByaW50ZXIgZXh0ZW5kcyBWaXNpdG9yPE51bGw+IHsKICBmaW5hbCBOYW1lU3lzdGVtIHN5bnRoZXRpY05hbWVzOwogIGZpbmFsIFN0cmluZ1Npbmsgc2luazsKICBmaW5hbCBBbm5vdGF0b3IgYW5ub3RhdG9yOwogIGZpbmFsIE1hcDxTdHJpbmcsIE1ldGFkYXRhUmVwb3NpdG9yeTxPYmplY3Q+PiBtZXRhZGF0YTsKICBJbXBvcnRUYWJsZSBpbXBvcnRUYWJsZTsKICBpbnQgaW5kZW50YXRpb24gPSAwOwogIGludCBjb2x1bW4gPSAwOwogIGJvb2wgc2hvd0V4dGVybmFsOwogIGJvb2wgc2hvd09mZnNldHM7CiAgYm9vbCBzaG93TWV0YWRhdGE7CgogIHN0YXRpYyBpbnQgU1BBQ0UgPSAwOwogIHN0YXRpYyBpbnQgV09SRCA9IDE7CiAgc3RhdGljIGludCBTWU1CT0wgPSAyOwogIGludCBzdGF0ZSA9IFNQQUNFOwoKICBQcmludGVyKHRoaXMuc2luaywKICAgICAge05hbWVTeXN0ZW0gc3ludGhldGljTmFtZXMsCiAgICAgIHRoaXMuc2hvd0V4dGVybmFsLAogICAgICB0aGlzLnNob3dPZmZzZXRzOiBmYWxzZSwKICAgICAgdGhpcy5zaG93TWV0YWRhdGE6IGZhbHNlLAogICAgICB0aGlzLmltcG9ydFRhYmxlLAogICAgICB0aGlzLmFubm90YXRvciwKICAgICAgdGhpcy5tZXRhZGF0YX0pCiAgICAgIDogdGhpcy5zeW50aGV0aWNOYW1lcyA9IHN5bnRoZXRpY05hbWVzID8/IG5ldyBOYW1lU3lzdGVtKCk7CgogIFByaW50ZXIgY3JlYXRlSW5uZXIoSW1wb3J0VGFibGUgaW1wb3J0VGFibGUsCiAgICAgIE1hcDxTdHJpbmcsIE1ldGFkYXRhUmVwb3NpdG9yeTxPYmplY3Q+PiBtZXRhZGF0YSkgewogICAgcmV0dXJuIG5ldyBQcmludGVyKHNpbmssCiAgICAgICAgaW1wb3J0VGFibGU6IGltcG9ydFRhYmxlLAogICAgICAgIG1ldGFkYXRhOiBtZXRhZGF0YSwKICAgICAgICBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMsCiAgICAgICAgYW5ub3RhdG9yOiBhbm5vdGF0b3IsCiAgICAgICAgc2hvd0V4dGVybmFsOiBzaG93RXh0ZXJuYWwsCiAgICAgICAgc2hvd09mZnNldHM6IHNob3dPZmZzZXRzLAogICAgICAgIHNob3dNZXRhZGF0YTogc2hvd01ldGFkYXRhKTsKICB9CgogIGJvb2wgc2hvdWxkSGlnaGxpZ2h0KE5vZGUgbm9kZSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgdm9pZCBzdGFydEhpZ2hsaWdodChOb2RlIG5vZGUpIHt9CiAgdm9pZCBlbmRIaWdobGlnaHQoTm9kZSBub2RlKSB7fQoKICBTdHJpbmcgZ2V0TGlicmFyeU5hbWUoTGlicmFyeSBub2RlKSB7CiAgICByZXR1cm4gbm9kZS5uYW1lID8/IHN5bnRoZXRpY05hbWVzLm5hbWVMaWJyYXJ5KG5vZGUpOwogIH0KCiAgU3RyaW5nIGdldExpYnJhcnlSZWZlcmVuY2UoTGlicmFyeSBub2RlKSB7CiAgICBpZiAobm9kZSA9PSBudWxsKSByZXR1cm4gJzxObyBMaWJyYXJ5Pic7CiAgICBpZiAoaW1wb3J0VGFibGUgIT0gbnVsbCAmJiBpbXBvcnRUYWJsZS5nZXRJbXBvcnRJbmRleChub2RlKSAhPSAtMSkgewogICAgICByZXR1cm4gc3ludGhldGljTmFtZXMubmFtZUxpYnJhcnlQcmVmaXgobm9kZSk7CiAgICB9CiAgICByZXR1cm4gZ2V0TGlicmFyeU5hbWUobm9kZSk7CiAgfQoKICBTdHJpbmcgZ2V0Q2xhc3NOYW1lKENsYXNzIG5vZGUpIHsKICAgIHJldHVybiBub2RlLm5hbWUgPz8gc3ludGhldGljTmFtZXMubmFtZUNsYXNzKG5vZGUpOwogIH0KCiAgU3RyaW5nIGdldENsYXNzUmVmZXJlbmNlKENsYXNzIG5vZGUpIHsKICAgIGlmIChub2RlID09IG51bGwpIHJldHVybiAnPE5vIENsYXNzPic7CiAgICBTdHJpbmcgbmFtZSA9IGdldENsYXNzTmFtZShub2RlKTsKICAgIFN0cmluZyBsaWJyYXJ5ID0gZ2V0TGlicmFyeVJlZmVyZW5jZShub2RlLmVuY2xvc2luZ0xpYnJhcnkpOwogICAgcmV0dXJuICckbGlicmFyeTo6JG5hbWUnOwogIH0KCiAgU3RyaW5nIGdldFR5cGVkZWZSZWZlcmVuY2UoVHlwZWRlZiBub2RlKSB7CiAgICBpZiAobm9kZSA9PSBudWxsKSByZXR1cm4gJzxObyBUeXBlZGVmPic7CiAgICBTdHJpbmcgbGlicmFyeSA9IGdldExpYnJhcnlSZWZlcmVuY2Uobm9kZS5lbmNsb3NpbmdMaWJyYXJ5KTsKICAgIHJldHVybiAnJGxpYnJhcnk6OiR7bm9kZS5uYW1lfSc7CiAgfQoKICBzdGF0aWMgZmluYWwgU3RyaW5nIGVtcHR5TmFtZVN0cmluZyA9ICfigKInOwogIHN0YXRpYyBmaW5hbCBOYW1lIGVtcHR5TmFtZSA9IG5ldyBOYW1lKGVtcHR5TmFtZVN0cmluZyk7CgogIE5hbWUgZ2V0TWVtYmVyTmFtZShNZW1iZXIgbm9kZSkgewogICAgaWYgKG5vZGUubmFtZT8ubmFtZSA9PSAnJykgcmV0dXJuIGVtcHR5TmFtZTsKICAgIGlmIChub2RlLm5hbWUgIT0gbnVsbCkgcmV0dXJuIG5vZGUubmFtZTsKICAgIHJldHVybiBuZXcgTmFtZShzeW50aGV0aWNOYW1lcy5uYW1lTWVtYmVyKG5vZGUpKTsKICB9CgogIFN0cmluZyBnZXRNZW1iZXJSZWZlcmVuY2UoTWVtYmVyIG5vZGUpIHsKICAgIGlmIChub2RlID09IG51bGwpIHJldHVybiAnPE5vIE1lbWJlcj4nOwogICAgU3RyaW5nIG5hbWUgPSBnZXRNZW1iZXJOYW1lKG5vZGUpLm5hbWU7CiAgICBpZiAobm9kZS5wYXJlbnQgaXMgQ2xhc3MpIHsKICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzUmVmZXJlbmNlKG5vZGUucGFyZW50KTsKICAgICAgcmV0dXJuICckY2xhc3NOYW1lOjokbmFtZSc7CiAgICB9IGVsc2UgewogICAgICBTdHJpbmcgbGlicmFyeSA9IGdldExpYnJhcnlSZWZlcmVuY2Uobm9kZS5lbmNsb3NpbmdMaWJyYXJ5KTsKICAgICAgcmV0dXJuICckbGlicmFyeTo6JG5hbWUnOwogICAgfQogIH0KCiAgU3RyaW5nIGdldFZhcmlhYmxlTmFtZShWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIHJldHVybiBub2RlLm5hbWUgPz8gc3ludGhldGljTmFtZXMubmFtZVZhcmlhYmxlKG5vZGUpOwogIH0KCiAgU3RyaW5nIGdldFZhcmlhYmxlUmVmZXJlbmNlKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgaWYgKG5vZGUgPT0gbnVsbCkgcmV0dXJuICc8Tm8gVmFyaWFibGVEZWNsYXJhdGlvbj4nOwogICAgcmV0dXJuIGdldFZhcmlhYmxlTmFtZShub2RlKTsKICB9CgogIFN0cmluZyBnZXRUeXBlUGFyYW1ldGVyTmFtZShUeXBlUGFyYW1ldGVyIG5vZGUpIHsKICAgIHJldHVybiBub2RlLm5hbWUgPz8gc3ludGhldGljTmFtZXMubmFtZVR5cGVQYXJhbWV0ZXIobm9kZSk7CiAgfQoKICBTdHJpbmcgZ2V0VHlwZVBhcmFtZXRlclJlZmVyZW5jZShUeXBlUGFyYW1ldGVyIG5vZGUpIHsKICAgIGlmIChub2RlID09IG51bGwpIHJldHVybiAnPE5vIFR5cGVQYXJhbWV0ZXI+JzsKICAgIFN0cmluZyBuYW1lID0gZ2V0VHlwZVBhcmFtZXRlck5hbWUobm9kZSk7CiAgICBpZiAobm9kZS5wYXJlbnQgaXMgRnVuY3Rpb25Ob2RlICYmIG5vZGUucGFyZW50LnBhcmVudCBpcyBNZW1iZXIpIHsKICAgICAgU3RyaW5nIG1lbWJlciA9IGdldE1lbWJlclJlZmVyZW5jZShub2RlLnBhcmVudC5wYXJlbnQpOwogICAgICByZXR1cm4gJyRtZW1iZXI6OiRuYW1lJzsKICAgIH0gZWxzZSBpZiAobm9kZS5wYXJlbnQgaXMgQ2xhc3MpIHsKICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzUmVmZXJlbmNlKG5vZGUucGFyZW50KTsKICAgICAgcmV0dXJuICckY2xhc3NOYW1lOjokbmFtZSc7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmFtZTsgLy8gQm91bmQgaW5zaWRlIGEgZnVuY3Rpb24gdHlwZS4KICAgIH0KICB9CgogIHZvaWQgd3JpdGVDb21wb25lbnRQcm9ibGVtcyhDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICB3cml0ZVByb2JsZW1zQXNKc29uKCJQcm9ibGVtcyBpbiBjb21wb25lbnQiLCBjb21wb25lbnQucHJvYmxlbXNBc0pzb24pOwogIH0KCiAgdm9pZCB3cml0ZVByb2JsZW1zQXNKc29uKFN0cmluZyBoZWFkZXIsIExpc3Q8U3RyaW5nPiBwcm9ibGVtc0FzSnNvbikgewogICAgaWYgKHByb2JsZW1zQXNKc29uPy5pc0VtcHR5ID09IGZhbHNlKSB7CiAgICAgIGVuZExpbmUoIi8vIik7CiAgICAgIHdyaXRlKCIvLyAiKTsKICAgICAgd3JpdGUoaGVhZGVyKTsKICAgICAgZW5kTGluZSgiOiIpOwogICAgICBlbmRMaW5lKCIvLyIpOwogICAgICBmb3IgKFN0cmluZyBzIGluIHByb2JsZW1zQXNKc29uKSB7CiAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBkZWNvZGVkID0ganNvbi5kZWNvZGUocyk7CiAgICAgICAgTGlzdDxPYmplY3Q+IHBsYWluVGV4dEZvcm1hdHRlZCA9IGRlY29kZWRbInBsYWluVGV4dEZvcm1hdHRlZCJdOwogICAgICAgIExpc3Q8U3RyaW5nPiBsaW5lcyA9IHBsYWluVGV4dEZvcm1hdHRlZC5qb2luKCJcbiIpLnNwbGl0KCJcbiIpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHdyaXRlKCIvLyIpOwogICAgICAgICAgU3RyaW5nIHRyaW1tZWQgPSBsaW5lc1tpXS50cmltUmlnaHQoKTsKICAgICAgICAgIGlmICh0cmltbWVkLmlzTm90RW1wdHkpIHdyaXRlKCIgIik7CiAgICAgICAgICBlbmRMaW5lKHRyaW1tZWQpOwogICAgICAgIH0KICAgICAgICBpZiAobGluZXMuaXNOb3RFbXB0eSkgZW5kTGluZSgiLy8iKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCB3cml0ZUxpYnJhcnlGaWxlKExpYnJhcnkgbGlicmFyeSkgewogICAgd3JpdGVBbm5vdGF0aW9uTGlzdChsaWJyYXJ5LmFubm90YXRpb25zKTsKICAgIHdyaXRlV29yZCgnbGlicmFyeScpOwogICAgaWYgKGxpYnJhcnkubmFtZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlV29yZChsaWJyYXJ5Lm5hbWUpOwogICAgfQogICAgZW5kTGluZSgnOycpOwoKICAgIExpYnJhcnlJbXBvcnRUYWJsZSBpbXBvcnRzID0gbmV3IExpYnJhcnlJbXBvcnRUYWJsZShsaWJyYXJ5KTsKICAgIFByaW50ZXIgaW5uZXIgPSBjcmVhdGVJbm5lcihpbXBvcnRzLCBsaWJyYXJ5LmVuY2xvc2luZ0NvbXBvbmVudD8ubWV0YWRhdGEpOwogICAgaW5uZXIud3JpdGVTdGFuZGFyZExpYnJhcnlDb250ZW50KGxpYnJhcnksCiAgICAgICAgb3V0ZXJQcmludGVyOiB0aGlzLCBpbXBvcnRzVG9QcmludDogaW1wb3J0cyk7CiAgfQoKICB2b2lkIHByaW50TGlicmFyeUltcG9ydFRhYmxlKExpYnJhcnlJbXBvcnRUYWJsZSBpbXBvcnRzKSB7CiAgICBmb3IgKHZhciBsaWJyYXJ5IGluIGltcG9ydHMuaW1wb3J0ZWRMaWJyYXJpZXMpIHsKICAgICAgdmFyIGltcG9ydFBhdGggPSBpbXBvcnRzLmdldEltcG9ydFBhdGgobGlicmFyeSk7CiAgICAgIGlmIChpbXBvcnRQYXRoID09ICIiKSB7CiAgICAgICAgdmFyIHByZWZpeCA9CiAgICAgICAgICAgIHN5bnRoZXRpY05hbWVzLm5hbWVMaWJyYXJ5UHJlZml4KGxpYnJhcnksIHByb3Bvc2VkTmFtZTogJ3NlbGYnKTsKICAgICAgICBlbmRMaW5lKCdpbXBvcnQgc2VsZiBhcyAkcHJlZml4OycpOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBwcmVmaXggPSBzeW50aGV0aWNOYW1lcy5uYW1lTGlicmFyeVByZWZpeChsaWJyYXJ5KTsKICAgICAgICBlbmRMaW5lKCdpbXBvcnQgIiRpbXBvcnRQYXRoIiBhcyAkcHJlZml4OycpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlU3RhbmRhcmRMaWJyYXJ5Q29udGVudChMaWJyYXJ5IGxpYnJhcnksCiAgICAgIHtQcmludGVyIG91dGVyUHJpbnRlciwgTGlicmFyeUltcG9ydFRhYmxlIGltcG9ydHNUb1ByaW50fSkgewogICAgb3V0ZXJQcmludGVyID8/PSB0aGlzOwogICAgb3V0ZXJQcmludGVyLndyaXRlUHJvYmxlbXNBc0pzb24oCiAgICAgICAgIlByb2JsZW1zIGluIGxpYnJhcnkiLCBsaWJyYXJ5LnByb2JsZW1zQXNKc29uKTsKCiAgICBpZiAoaW1wb3J0c1RvUHJpbnQgIT0gbnVsbCkgewogICAgICBvdXRlclByaW50ZXIucHJpbnRMaWJyYXJ5SW1wb3J0VGFibGUoaW1wb3J0c1RvUHJpbnQpOwogICAgfQoKICAgIHdyaXRlQWRkaXRpb25hbEV4cG9ydHMobGlicmFyeS5hZGRpdGlvbmFsRXhwb3J0cyk7CiAgICBlbmRMaW5lKCk7CiAgICBsaWJyYXJ5LmRlcGVuZGVuY2llcy5mb3JFYWNoKHdyaXRlTm9kZSk7CiAgICBpZiAobGlicmFyeS5kZXBlbmRlbmNpZXMuaXNOb3RFbXB0eSkgZW5kTGluZSgpOwogICAgbGlicmFyeS5wYXJ0cy5mb3JFYWNoKHdyaXRlTm9kZSk7CiAgICBsaWJyYXJ5LnR5cGVkZWZzLmZvckVhY2god3JpdGVOb2RlKTsKICAgIGxpYnJhcnkuY2xhc3Nlcy5mb3JFYWNoKHdyaXRlTm9kZSk7CiAgICBsaWJyYXJ5LmZpZWxkcy5mb3JFYWNoKHdyaXRlTm9kZSk7CiAgICBsaWJyYXJ5LnByb2NlZHVyZXMuZm9yRWFjaCh3cml0ZU5vZGUpOwogIH0KCiAgdm9pZCB3cml0ZUFkZGl0aW9uYWxFeHBvcnRzKExpc3Q8UmVmZXJlbmNlPiBhZGRpdGlvbmFsRXhwb3J0cykgewogICAgaWYgKGFkZGl0aW9uYWxFeHBvcnRzLmlzRW1wdHkpIHJldHVybjsKICAgIHdyaXRlKCdhZGRpdGlvbmFsRXhwb3J0cyA9ICgnKTsKICAgIGJvb2wgaXNGaXJzdCA9IHRydWU7CiAgICBmb3IgKFJlZmVyZW5jZSByZWZlcmVuY2UgaW4gYWRkaXRpb25hbEV4cG9ydHMpIHsKICAgICAgaWYgKGlzRmlyc3QpIHsKICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd3JpdGUoJywgJyk7CiAgICAgIH0KICAgICAgdmFyIG5vZGUgPSByZWZlcmVuY2Uubm9kZTsKICAgICAgaWYgKG5vZGUgaXMgQ2xhc3MpIHsKICAgICAgICBMaWJyYXJ5IG5vZGVMaWJyYXJ5ID0gbm9kZS5lbmNsb3NpbmdMaWJyYXJ5OwogICAgICAgIFN0cmluZyBwcmVmaXggPSBzeW50aGV0aWNOYW1lcy5uYW1lTGlicmFyeVByZWZpeChub2RlTGlicmFyeSk7CiAgICAgICAgd3JpdGUocHJlZml4ICsgJzo6JyArIG5vZGUubmFtZSk7CiAgICAgIH0gZWxzZSBpZiAobm9kZSBpcyBGaWVsZCkgewogICAgICAgIExpYnJhcnkgbm9kZUxpYnJhcnkgPSBub2RlLmVuY2xvc2luZ0xpYnJhcnk7CiAgICAgICAgU3RyaW5nIHByZWZpeCA9IHN5bnRoZXRpY05hbWVzLm5hbWVMaWJyYXJ5UHJlZml4KG5vZGVMaWJyYXJ5KTsKICAgICAgICB3cml0ZShwcmVmaXggKyAnOjonICsgbm9kZS5uYW1lLm5hbWUpOwogICAgICB9IGVsc2UgaWYgKG5vZGUgaXMgUHJvY2VkdXJlKSB7CiAgICAgICAgTGlicmFyeSBub2RlTGlicmFyeSA9IG5vZGUuZW5jbG9zaW5nTGlicmFyeTsKICAgICAgICBTdHJpbmcgcHJlZml4ID0gc3ludGhldGljTmFtZXMubmFtZUxpYnJhcnlQcmVmaXgobm9kZUxpYnJhcnkpOwogICAgICAgIHdyaXRlKHByZWZpeCArICc6OicgKyBub2RlLm5hbWUubmFtZSk7CiAgICAgIH0gZWxzZSBpZiAobm9kZSBpcyBUeXBlZGVmKSB7CiAgICAgICAgTGlicmFyeSBub2RlTGlicmFyeSA9IG5vZGUuZW5jbG9zaW5nTGlicmFyeTsKICAgICAgICBTdHJpbmcgcHJlZml4ID0gc3ludGhldGljTmFtZXMubmFtZUxpYnJhcnlQcmVmaXgobm9kZUxpYnJhcnkpOwogICAgICAgIHdyaXRlKHByZWZpeCArICc6OicgKyBub2RlLm5hbWUpOwogICAgICB9IGVsc2UgaWYgKHJlZmVyZW5jZS5jYW5vbmljYWxOYW1lICE9IG51bGwpIHsKICAgICAgICB3cml0ZShyZWZlcmVuY2UuY2Fub25pY2FsTmFtZS50b1N0cmluZygpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCcke25vZGUucnVudGltZVR5cGV9Jyk7CiAgICAgIH0KICAgICAgZW5kTGluZSgnKScpOwogICAgfQoKICAgIGVuZExpbmUoKTsKICB9CgogIHZvaWQgd3JpdGVDb21wb25lbnRGaWxlKENvbXBvbmVudCBjb21wb25lbnQpIHsKICAgIEltcG9ydFRhYmxlIGltcG9ydHMgPSBuZXcgQ29tcG9uZW50SW1wb3J0VGFibGUoY29tcG9uZW50KTsKICAgIHZhciBpbm5lciA9IGNyZWF0ZUlubmVyKGltcG9ydHMsIGNvbXBvbmVudC5tZXRhZGF0YSk7CiAgICB3cml0ZVdvcmQoJ21haW4nKTsKICAgIHdyaXRlU3BhY2VkKCc9Jyk7CiAgICBpbm5lci53cml0ZU1lbWJlclJlZmVyZW5jZUZyb21SZWZlcmVuY2UoY29tcG9uZW50Lm1haW5NZXRob2ROYW1lKTsKICAgIGVuZExpbmUoJzsnKTsKICAgIGlmIChzaG93TWV0YWRhdGEpIHsKICAgICAgaW5uZXIud3JpdGVNZXRhZGF0YShjb21wb25lbnQpOwogICAgfQogICAgd3JpdGVDb21wb25lbnRQcm9ibGVtcyhjb21wb25lbnQpOwogICAgZm9yICh2YXIgbGlicmFyeSBpbiBjb21wb25lbnQubGlicmFyaWVzKSB7CiAgICAgIGlmIChsaWJyYXJ5LmlzRXh0ZXJuYWwpIHsKICAgICAgICBpZiAoIXNob3dFeHRlcm5hbCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHdyaXRlV29yZCgnZXh0ZXJuYWwnKTsKICAgICAgfQogICAgICBpZiAoc2hvd01ldGFkYXRhKSB7CiAgICAgICAgaW5uZXIud3JpdGVNZXRhZGF0YShsaWJyYXJ5KTsKICAgICAgfQogICAgICB3cml0ZUFubm90YXRpb25MaXN0KGxpYnJhcnkuYW5ub3RhdGlvbnMpOwogICAgICB3cml0ZVdvcmQoJ2xpYnJhcnknKTsKICAgICAgaWYgKGxpYnJhcnkubmFtZSAhPSBudWxsKSB7CiAgICAgICAgd3JpdGVXb3JkKGxpYnJhcnkubmFtZSk7CiAgICAgIH0KICAgICAgaWYgKGxpYnJhcnkuaW1wb3J0VXJpICE9IG51bGwpIHsKICAgICAgICB3cml0ZVNwYWNlZCgnZnJvbScpOwogICAgICAgIHdyaXRlV29yZCgnIiR7bGlicmFyeS5pbXBvcnRVcml9IicpOwogICAgICB9CiAgICAgIHZhciBwcmVmaXggPSBzeW50aGV0aWNOYW1lcy5uYW1lTGlicmFyeVByZWZpeChsaWJyYXJ5KTsKICAgICAgd3JpdGVTcGFjZWQoJ2FzJyk7CiAgICAgIHdyaXRlV29yZChwcmVmaXgpOwogICAgICBlbmRMaW5lKCcgeycpOwogICAgICArK2lubmVyLmluZGVudGF0aW9uOwoKICAgICAgaW5uZXIud3JpdGVTdGFuZGFyZExpYnJhcnlDb250ZW50KGxpYnJhcnkpOwogICAgICAtLWlubmVyLmluZGVudGF0aW9uOwogICAgICBlbmRMaW5lKCd9Jyk7CiAgICB9CiAgICB3cml0ZUNvbnN0YW50VGFibGUoY29tcG9uZW50KTsKICB9CgogIHZvaWQgd3JpdGVDb25zdGFudFRhYmxlKENvbXBvbmVudCBjb21wb25lbnQpIHsKICAgIGlmIChzeW50aGV0aWNOYW1lcy5jb25zdGFudHMubWFwLmlzRW1wdHkpIHJldHVybjsKICAgIEltcG9ydFRhYmxlIGltcG9ydHMgPSBuZXcgQ29tcG9uZW50SW1wb3J0VGFibGUoY29tcG9uZW50KTsKICAgIHZhciBpbm5lciA9IGNyZWF0ZUlubmVyKGltcG9ydHMsIGNvbXBvbmVudC5tZXRhZGF0YSk7CiAgICB3cml0ZVdvcmQoJ2NvbnN0YW50cyAnKTsKICAgIGVuZExpbmUoJyB7Jyk7CiAgICArK2lubmVyLmluZGVudGF0aW9uOwogICAgZm9yIChmaW5hbCBDb25zdGFudCBjb25zdGFudAogICAgICAgIGluIHN5bnRoZXRpY05hbWVzLmNvbnN0YW50cy5tYXAua2V5cy50b0xpc3QoKSkgewogICAgICBpbm5lci53cml0ZU5vZGUoY29uc3RhbnQpOwogICAgfQogICAgLS1pbm5lci5pbmRlbnRhdGlvbjsKICAgIGVuZExpbmUoJ30nKTsKICB9CgogIGludCBnZXRQcmVjZWRlbmNlKFRyZWVOb2RlIG5vZGUpIHsKICAgIHJldHVybiBQcmVjZWRlbmNlLm9mKG5vZGUpOwogIH0KCiAgdm9pZCB3cml0ZShTdHJpbmcgc3RyaW5nKSB7CiAgICBzaW5rLndyaXRlKHN0cmluZyk7CiAgICBjb2x1bW4gKz0gc3RyaW5nLmxlbmd0aDsKICB9CgogIHZvaWQgd3JpdGVTcGFjZShbU3RyaW5nIHN0cmluZyA9ICcgJ10pIHsKICAgIHdyaXRlKHN0cmluZyk7CiAgICBzdGF0ZSA9IFNQQUNFOwogIH0KCiAgdm9pZCBlbnN1cmVTcGFjZSgpIHsKICAgIGlmIChzdGF0ZSAhPSBTUEFDRSkgd3JpdGVTcGFjZSgpOwogIH0KCiAgdm9pZCB3cml0ZVN5bWJvbChTdHJpbmcgc3RyaW5nKSB7CiAgICB3cml0ZShzdHJpbmcpOwogICAgc3RhdGUgPSBTWU1CT0w7CiAgfQoKICB2b2lkIHdyaXRlU3BhY2VkKFN0cmluZyBzdHJpbmcpIHsKICAgIGVuc3VyZVNwYWNlKCk7CiAgICB3cml0ZShzdHJpbmcpOwogICAgd3JpdGVTcGFjZSgpOwogIH0KCiAgdm9pZCB3cml0ZUNvbW1hKFtTdHJpbmcgc3RyaW5nID0gJywnXSkgewogICAgd3JpdGUoc3RyaW5nKTsKICAgIHdyaXRlU3BhY2UoKTsKICB9CgogIHZvaWQgd3JpdGVXb3JkKFN0cmluZyBzdHJpbmcpIHsKICAgIGlmIChzdHJpbmcuaXNFbXB0eSkgcmV0dXJuOwogICAgZW5zdXJlV29yZEJvdW5kYXJ5KCk7CiAgICB3cml0ZShzdHJpbmcpOwogICAgc3RhdGUgPSBXT1JEOwogIH0KCiAgdm9pZCBlbnN1cmVXb3JkQm91bmRhcnkoKSB7CiAgICBpZiAoc3RhdGUgPT0gV09SRCkgewogICAgICB3cml0ZVNwYWNlKCk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlSW5kZW50YXRpb24oKSB7CiAgICB3cml0ZVNwYWNlKCcgICcgKiBpbmRlbnRhdGlvbik7CiAgfQoKICB2b2lkIHdyaXRlTm9kZShOb2RlIG5vZGUpIHsKICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgd3JpdGVTeW1ib2woIjxOdWxsPiIpOwogICAgfSBlbHNlIHsKICAgICAgZmluYWwgaGlnaGxpZ2h0ID0gc2hvdWxkSGlnaGxpZ2h0KG5vZGUpOwogICAgICBpZiAoaGlnaGxpZ2h0KSB7CiAgICAgICAgc3RhcnRIaWdobGlnaHQobm9kZSk7CiAgICAgIH0KCiAgICAgIGlmIChzaG93T2Zmc2V0cyAmJiBub2RlIGlzIFRyZWVOb2RlKSB7CiAgICAgICAgd3JpdGVXb3JkKCJbJHtub2RlLmZpbGVPZmZzZXR9XSIpOwogICAgICB9CiAgICAgIGlmIChzaG93TWV0YWRhdGEgJiYgbm9kZSBpcyBUcmVlTm9kZSkgewogICAgICAgIHdyaXRlTWV0YWRhdGEobm9kZSk7CiAgICAgIH0KCiAgICAgIG5vZGUuYWNjZXB0KHRoaXMpOwoKICAgICAgaWYgKGhpZ2hsaWdodCkgewogICAgICAgIGVuZEhpZ2hsaWdodChub2RlKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCB3cml0ZU9wdGlvbmFsTm9kZShOb2RlIG5vZGUpIHsKICAgIGlmIChub2RlICE9IG51bGwpIHsKICAgICAgbm9kZS5hY2NlcHQodGhpcyk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlTWV0YWRhdGEoVHJlZU5vZGUgbm9kZSkgewogICAgaWYgKG1ldGFkYXRhICE9IG51bGwpIHsKICAgICAgZm9yICh2YXIgbWQgaW4gbWV0YWRhdGEudmFsdWVzKSB7CiAgICAgICAgZmluYWwgbm9kZU1ldGFkYXRhID0gbWQubWFwcGluZ1tub2RlXTsKICAgICAgICBpZiAobm9kZU1ldGFkYXRhICE9IG51bGwpIHsKICAgICAgICAgIHdyaXRlV29yZCgiW0Ake21kLnRhZ309JHtub2RlTWV0YWRhdGF9XSIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgdm9pZCB3cml0ZUFubm90YXRlZFR5cGUoRGFydFR5cGUgdHlwZSwgU3RyaW5nIGFubm90YXRpb24pIHsKICAgIHdyaXRlVHlwZSh0eXBlKTsKICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKICAgICAgd3JpdGUoJy8nKTsKICAgICAgd3JpdGUoYW5ub3RhdGlvbik7CiAgICAgIHN0YXRlID0gV09SRDsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVUeXBlKERhcnRUeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlID09IG51bGwpIHsKICAgICAgd3JpdGUoJzxObyBEYXJ0VHlwZT4nKTsKICAgIH0gZWxzZSB7CiAgICAgIHR5cGUuYWNjZXB0KHRoaXMpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZU9wdGlvbmFsVHlwZShEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZSAhPSBudWxsKSB7CiAgICAgIHR5cGUuYWNjZXB0KHRoaXMpOwogICAgfQogIH0KCiAgdmlzaXRTdXBlcnR5cGUoU3VwZXJ0eXBlIHR5cGUpIHsKICAgIGlmICh0eXBlID09IG51bGwpIHsKICAgICAgd3JpdGUoJzxObyBTdXBlcnR5cGU+Jyk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUNsYXNzUmVmZXJlbmNlRnJvbVJlZmVyZW5jZSh0eXBlLmNsYXNzTmFtZSk7CiAgICAgIGlmICh0eXBlLnR5cGVBcmd1bWVudHMuaXNOb3RFbXB0eSkgewogICAgICAgIHdyaXRlU3ltYm9sKCc8Jyk7CiAgICAgICAgd3JpdGVMaXN0KHR5cGUudHlwZUFyZ3VtZW50cywgd3JpdGVUeXBlKTsKICAgICAgICB3cml0ZVN5bWJvbCgnPicpOwogICAgICB9CiAgICB9CiAgfQoKICB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIHR5cGUpIHsKICAgIHdyaXRlVHlwZWRlZlJlZmVyZW5jZSh0eXBlLnR5cGVkZWZOb2RlKTsKICAgIGlmICh0eXBlLnR5cGVBcmd1bWVudHMuaXNOb3RFbXB0eSkgewogICAgICB3cml0ZVN5bWJvbCgnPCcpOwogICAgICB3cml0ZUxpc3QodHlwZS50eXBlQXJndW1lbnRzLCB3cml0ZVR5cGUpOwogICAgICB3cml0ZVN5bWJvbCgnPicpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZU1vZGlmaWVyKGJvb2wgaXNUaGVyZSwgU3RyaW5nIG5hbWUpIHsKICAgIGlmIChpc1RoZXJlKSB7CiAgICAgIHdyaXRlV29yZChuYW1lKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVOYW1lKE5hbWUgbmFtZSkgewogICAgaWYgKG5hbWU/Lm5hbWUgPT0gJycpIHsKICAgICAgd3JpdGVXb3JkKGVtcHR5TmFtZVN0cmluZyk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZVdvcmQobmFtZT8ubmFtZSA/PyAnPGFub24+Jyk7IC8vIFRPRE86IHdyaXRlIGxpYnJhcnkgbmFtZQogICAgfQogIH0KCiAgdm9pZCBlbmRMaW5lKFtTdHJpbmcgc3RyaW5nXSkgewogICAgaWYgKHN0cmluZyAhPSBudWxsKSB7CiAgICAgIHdyaXRlKHN0cmluZyk7CiAgICB9CiAgICB3cml0ZSgnXG4nKTsKICAgIHN0YXRlID0gU1BBQ0U7CiAgICBjb2x1bW4gPSAwOwogIH0KCiAgdm9pZCB3cml0ZUZ1bmN0aW9uKEZ1bmN0aW9uTm9kZSBmdW5jdGlvbiwKICAgICAge25hbWUsIExpc3Q8SW5pdGlhbGl6ZXI+IGluaXRpYWxpemVycywgYm9vbCB0ZXJtaW5hdGVMaW5lOiB0cnVlfSkgewogICAgaWYgKG5hbWUgaXMgU3RyaW5nKSB7CiAgICAgIHdyaXRlV29yZChuYW1lKTsKICAgIH0gZWxzZSBpZiAobmFtZSBpcyBOYW1lKSB7CiAgICAgIHdyaXRlTmFtZShuYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChuYW1lID09IG51bGwpOwogICAgfQogICAgd3JpdGVUeXBlUGFyYW1ldGVyTGlzdChmdW5jdGlvbi50eXBlUGFyYW1ldGVycyk7CiAgICB3cml0ZVBhcmFtZXRlckxpc3QoZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMsIGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycywKICAgICAgICBmdW5jdGlvbi5yZXF1aXJlZFBhcmFtZXRlckNvdW50KTsKICAgIHdyaXRlUmV0dXJuVHlwZSgKICAgICAgICBmdW5jdGlvbi5yZXR1cm5UeXBlLCBhbm5vdGF0b3I/LmFubm90YXRlUmV0dXJuKHRoaXMsIGZ1bmN0aW9uKSk7CiAgICBpZiAoaW5pdGlhbGl6ZXJzICE9IG51bGwgJiYgaW5pdGlhbGl6ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgZW5kTGluZSgpOwogICAgICArK2luZGVudGF0aW9uOwogICAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICAgIHdyaXRlQ29tbWEoJzonKTsKICAgICAgd3JpdGVMaXN0KGluaXRpYWxpemVycywgd3JpdGVOb2RlKTsKICAgICAgLS1pbmRlbnRhdGlvbjsKICAgIH0KICAgIGlmIChmdW5jdGlvbi5hc3luY01hcmtlciAhPSBBc3luY01hcmtlci5TeW5jKSB7CiAgICAgIHdyaXRlU3BhY2VkKGdldEFzeW5jTWFya2VyS2V5d29yZChmdW5jdGlvbi5hc3luY01hcmtlcikpOwogICAgfQogICAgaWYgKGZ1bmN0aW9uLmRhcnRBc3luY01hcmtlciAhPSBBc3luY01hcmtlci5TeW5jICYmCiAgICAgICAgZnVuY3Rpb24uZGFydEFzeW5jTWFya2VyICE9IGZ1bmN0aW9uLmFzeW5jTWFya2VyKSB7CiAgICAgIHdyaXRlU3BhY2VkKCIvKiBvcmlnaW5hbGx5Iik7CiAgICAgIHdyaXRlU3BhY2VkKGdldEFzeW5jTWFya2VyS2V5d29yZChmdW5jdGlvbi5kYXJ0QXN5bmNNYXJrZXIpKTsKICAgICAgd3JpdGVTcGFjZWQoIiovIik7CiAgICB9CiAgICBpZiAoZnVuY3Rpb24uYm9keSAhPSBudWxsKSB7CiAgICAgIHdyaXRlRnVuY3Rpb25Cb2R5KGZ1bmN0aW9uLmJvZHksIHRlcm1pbmF0ZUxpbmU6IHRlcm1pbmF0ZUxpbmUpOwogICAgfSBlbHNlIGlmICh0ZXJtaW5hdGVMaW5lKSB7CiAgICAgIGVuZExpbmUoJzsnKTsKICAgIH0KICB9CgogIFN0cmluZyBnZXRBc3luY01hcmtlcktleXdvcmQoQXN5bmNNYXJrZXIgbWFya2VyKSB7CiAgICBzd2l0Y2ggKG1hcmtlcikgewogICAgICBjYXNlIEFzeW5jTWFya2VyLlN5bmM6CiAgICAgICAgcmV0dXJuICdzeW5jJzsKICAgICAgY2FzZSBBc3luY01hcmtlci5TeW5jU3RhcjoKICAgICAgICByZXR1cm4gJ3N5bmMqJzsKICAgICAgY2FzZSBBc3luY01hcmtlci5Bc3luYzoKICAgICAgICByZXR1cm4gJ2FzeW5jJzsKICAgICAgY2FzZSBBc3luY01hcmtlci5Bc3luY1N0YXI6CiAgICAgICAgcmV0dXJuICdhc3luYyonOwogICAgICBjYXNlIEFzeW5jTWFya2VyLlN5bmNZaWVsZGluZzoKICAgICAgICByZXR1cm4gJ3lpZWxkaW5nJzsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gJzxJbnZhbGlkIGFzeW5jIG1hcmtlcjogJG1hcmtlcj4nOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZUZ1bmN0aW9uQm9keShTdGF0ZW1lbnQgYm9keSwge2Jvb2wgdGVybWluYXRlTGluZTogdHJ1ZX0pIHsKICAgIGlmIChib2R5IGlzIEJsb2NrICYmIGJvZHkuc3RhdGVtZW50cy5pc0VtcHR5KSB7CiAgICAgIGVuc3VyZVNwYWNlKCk7CiAgICAgIHdyaXRlU3ltYm9sKCd7fScpOwogICAgICBzdGF0ZSA9IFdPUkQ7CiAgICAgIGlmICh0ZXJtaW5hdGVMaW5lKSB7CiAgICAgICAgZW5kTGluZSgpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGJvZHkgaXMgQmxvY2spIHsKICAgICAgZW5zdXJlU3BhY2UoKTsKICAgICAgZW5kTGluZSgneycpOwogICAgICArK2luZGVudGF0aW9uOwogICAgICBib2R5LnN0YXRlbWVudHMuZm9yRWFjaCh3cml0ZU5vZGUpOwogICAgICAtLWluZGVudGF0aW9uOwogICAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICAgIHdyaXRlU3ltYm9sKCd9Jyk7CiAgICAgIHN0YXRlID0gV09SRDsKICAgICAgaWYgKHRlcm1pbmF0ZUxpbmUpIHsKICAgICAgICBlbmRMaW5lKCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoYm9keSBpcyBSZXR1cm5TdGF0ZW1lbnQgJiYgIXRlcm1pbmF0ZUxpbmUpIHsKICAgICAgd3JpdGVTcGFjZWQoJz0+Jyk7CiAgICAgIHdyaXRlRXhwcmVzc2lvbihib2R5LmV4cHJlc3Npb24pOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVCb2R5KGJvZHkpOwogICAgfQogIH0KCiAgd3JpdGVGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIG5vZGUsCiAgICAgIHtMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHR5cGVkZWZQb3NpdGlvbmFsLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHR5cGVkZWZOYW1lZH0pIHsKICAgIGlmIChzdGF0ZSA9PSBXT1JEKSB7CiAgICAgIGVuc3VyZVNwYWNlKCk7CiAgICB9CiAgICB3cml0ZVR5cGVQYXJhbWV0ZXJMaXN0KG5vZGUudHlwZVBhcmFtZXRlcnMpOwogICAgd3JpdGVTeW1ib2woJygnKTsKICAgIExpc3Q8RGFydFR5cGU+IHBvc2l0aW9uYWwgPSBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzOwoKICAgIGJvb2wgcGFyYW1ldGVyc0Fubm90YXRlZCA9IGZhbHNlOwogICAgaWYgKHR5cGVkZWZQb3NpdGlvbmFsICE9IG51bGwpIHsKICAgICAgZm9yIChWYXJpYWJsZURlY2xhcmF0aW9uIGZvcm1hbCBpbiB0eXBlZGVmUG9zaXRpb25hbCkgewogICAgICAgIHBhcmFtZXRlcnNBbm5vdGF0ZWQgPQogICAgICAgICAgICBwYXJhbWV0ZXJzQW5ub3RhdGVkIHx8IGZvcm1hbC5hbm5vdGF0aW9ucy5sZW5ndGggPiAwOwogICAgICB9CiAgICB9CiAgICBpZiAodHlwZWRlZk5hbWVkICE9IG51bGwpIHsKICAgICAgZm9yIChWYXJpYWJsZURlY2xhcmF0aW9uIGZvcm1hbCBpbiB0eXBlZGVmTmFtZWQpIHsKICAgICAgICBwYXJhbWV0ZXJzQW5ub3RhdGVkID0KICAgICAgICAgICAgcGFyYW1ldGVyc0Fubm90YXRlZCB8fCBmb3JtYWwuYW5ub3RhdGlvbnMubGVuZ3RoID4gMDsKICAgICAgfQogICAgfQoKICAgIGlmIChwYXJhbWV0ZXJzQW5ub3RhdGVkICYmIHR5cGVkZWZQb3NpdGlvbmFsICE9IG51bGwpIHsKICAgICAgd3JpdGVMaXN0KHR5cGVkZWZQb3NpdGlvbmFsLnRha2Uobm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50KSwKICAgICAgICAgIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbik7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUxpc3QocG9zaXRpb25hbC50YWtlKG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCksIHdyaXRlVHlwZSk7CiAgICB9CgogICAgaWYgKG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA8IHBvc2l0aW9uYWwubGVuZ3RoKSB7CiAgICAgIGlmIChub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPiAwKSB7CiAgICAgICAgd3JpdGVDb21tYSgpOwogICAgICB9CiAgICAgIHdyaXRlU3ltYm9sKCdbJyk7CiAgICAgIGlmIChwYXJhbWV0ZXJzQW5ub3RhdGVkICYmIHR5cGVkZWZQb3NpdGlvbmFsICE9IG51bGwpIHsKICAgICAgICB3cml0ZUxpc3QodHlwZWRlZlBvc2l0aW9uYWwuc2tpcChub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpLAogICAgICAgICAgICB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb24pOwogICAgICB9IGVsc2UgewogICAgICAgIHdyaXRlTGlzdChwb3NpdGlvbmFsLnNraXAobm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50KSwgd3JpdGVUeXBlKTsKICAgICAgfQogICAgICB3cml0ZVN5bWJvbCgnXScpOwogICAgfQogICAgaWYgKG5vZGUubmFtZWRQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgaWYgKG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICAgIHdyaXRlQ29tbWEoKTsKICAgICAgfQogICAgICB3cml0ZVN5bWJvbCgneycpOwogICAgICBpZiAocGFyYW1ldGVyc0Fubm90YXRlZCAmJiB0eXBlZGVmTmFtZWQgIT0gbnVsbCkgewogICAgICAgIHdyaXRlTGlzdCh0eXBlZGVmTmFtZWQsIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd3JpdGVMaXN0KG5vZGUubmFtZWRQYXJhbWV0ZXJzLCB2aXNpdE5hbWVkVHlwZSk7CiAgICAgIH0KICAgICAgd3JpdGVTeW1ib2woJ30nKTsKICAgIH0KICAgIHdyaXRlU3ltYm9sKCcpJyk7CiAgICB3cml0ZVNwYWNlZCgn4oaSJyk7CiAgICB3cml0ZVR5cGUobm9kZS5yZXR1cm5UeXBlKTsKICB9CgogIHZvaWQgd3JpdGVCb2R5KFN0YXRlbWVudCBib2R5KSB7CiAgICBpZiAoYm9keSBpcyBCbG9jaykgewogICAgICBlbmRMaW5lKCcgeycpOwogICAgICArK2luZGVudGF0aW9uOwogICAgICBib2R5LnN0YXRlbWVudHMuZm9yRWFjaCh3cml0ZU5vZGUpOwogICAgICAtLWluZGVudGF0aW9uOwogICAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICAgIGVuZExpbmUoJ30nKTsKICAgIH0gZWxzZSB7CiAgICAgIGVuZExpbmUoKTsKICAgICAgKytpbmRlbnRhdGlvbjsKICAgICAgd3JpdGVOb2RlKGJvZHkpOwogICAgICAtLWluZGVudGF0aW9uOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZVJldHVyblR5cGUoRGFydFR5cGUgdHlwZSwgU3RyaW5nIGFubm90YXRpb24pIHsKICAgIGlmICh0eXBlID09IG51bGwpIHJldHVybjsKICAgIHdyaXRlU3BhY2VkKCfihpInKTsKICAgIHdyaXRlQW5ub3RhdGVkVHlwZSh0eXBlLCBhbm5vdGF0aW9uKTsKICB9CgogIHZvaWQgd3JpdGVUeXBlUGFyYW1ldGVyTGlzdChMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKSB7CiAgICBpZiAodHlwZVBhcmFtZXRlcnMuaXNFbXB0eSkgcmV0dXJuOwogICAgd3JpdGVTeW1ib2woJzwnKTsKICAgIHdyaXRlTGlzdCh0eXBlUGFyYW1ldGVycywgd3JpdGVOb2RlKTsKICAgIHdyaXRlU3ltYm9sKCc+Jyk7CiAgICBzdGF0ZSA9IFdPUkQ7IC8vIEVuc3VyZSBzcGFjZSBpZiBub3QgZm9sbG93ZWQgYnkgYW5vdGhlciBzeW1ib2wuCiAgfQoKICB2b2lkIHdyaXRlUGFyYW1ldGVyTGlzdChMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHBvc2l0aW9uYWwsCiAgICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gbmFtZWQsIGludCByZXF1aXJlZFBhcmFtZXRlckNvdW50KSB7CiAgICB3cml0ZVN5bWJvbCgnKCcpOwogICAgd3JpdGVMaXN0KAogICAgICAgIHBvc2l0aW9uYWwudGFrZShyZXF1aXJlZFBhcmFtZXRlckNvdW50KSwgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uKTsKICAgIGlmIChyZXF1aXJlZFBhcmFtZXRlckNvdW50IDwgcG9zaXRpb25hbC5sZW5ndGgpIHsKICAgICAgaWYgKHJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPiAwKSB7CiAgICAgICAgd3JpdGVDb21tYSgpOwogICAgICB9CiAgICAgIHdyaXRlU3ltYm9sKCdbJyk7CiAgICAgIHdyaXRlTGlzdCgKICAgICAgICAgIHBvc2l0aW9uYWwuc2tpcChyZXF1aXJlZFBhcmFtZXRlckNvdW50KSwgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uKTsKICAgICAgd3JpdGVTeW1ib2woJ10nKTsKICAgIH0KICAgIGlmIChuYW1lZC5pc05vdEVtcHR5KSB7CiAgICAgIGlmIChwb3NpdGlvbmFsLmlzTm90RW1wdHkpIHsKICAgICAgICB3cml0ZUNvbW1hKCk7CiAgICAgIH0KICAgICAgd3JpdGVTeW1ib2woJ3snKTsKICAgICAgd3JpdGVMaXN0KG5hbWVkLCB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb24pOwogICAgICB3cml0ZVN5bWJvbCgnfScpOwogICAgfQogICAgd3JpdGVTeW1ib2woJyknKTsKICB9CgogIHZvaWQgd3JpdGVMaXN0PFQ+KEl0ZXJhYmxlPFQ+IG5vZGVzLCB2b2lkIGNhbGxiYWNrKFQgeCksCiAgICAgIHtTdHJpbmcgc2VwYXJhdG9yOiAnLCd9KSB7CiAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgIGZvciAodmFyIG5vZGUgaW4gbm9kZXMpIHsKICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3cml0ZUNvbW1hKHNlcGFyYXRvcik7CiAgICAgIH0KICAgICAgY2FsbGJhY2sobm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlQ2xhc3NSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKICAgIHdyaXRlV29yZChnZXRDbGFzc1JlZmVyZW5jZUZyb21SZWZlcmVuY2UocmVmZXJlbmNlKSk7CiAgfQoKICBTdHJpbmcgZ2V0Q2xhc3NSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKICAgIGlmIChyZWZlcmVuY2UgPT0gbnVsbCkgcmV0dXJuICc8Tm8gQ2xhc3M+JzsKICAgIGlmIChyZWZlcmVuY2Uubm9kZSAhPSBudWxsKSByZXR1cm4gZ2V0Q2xhc3NSZWZlcmVuY2UocmVmZXJlbmNlLmFzQ2xhc3MpOwogICAgaWYgKHJlZmVyZW5jZS5jYW5vbmljYWxOYW1lICE9IG51bGwpCiAgICAgIHJldHVybiBnZXRDYW5vbmljYWxOYW1lU3RyaW5nKHJlZmVyZW5jZS5jYW5vbmljYWxOYW1lKTsKICAgIHRocm93ICJOZWl0aGVyIG5vZGUgbm9yIGNhbm9uaWNhbCBuYW1lIGZvdW5kIjsKICB9CgogIHZvaWQgd3JpdGVNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKICAgIHdyaXRlV29yZChnZXRNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKHJlZmVyZW5jZSkpOwogIH0KCiAgU3RyaW5nIGdldE1lbWJlclJlZmVyZW5jZUZyb21SZWZlcmVuY2UoUmVmZXJlbmNlIHJlZmVyZW5jZSkgewogICAgaWYgKHJlZmVyZW5jZSA9PSBudWxsKSByZXR1cm4gJzxObyBNZW1iZXI+JzsKICAgIGlmIChyZWZlcmVuY2Uubm9kZSAhPSBudWxsKSByZXR1cm4gZ2V0TWVtYmVyUmVmZXJlbmNlKHJlZmVyZW5jZS5hc01lbWJlcik7CiAgICBpZiAocmVmZXJlbmNlLmNhbm9uaWNhbE5hbWUgIT0gbnVsbCkKICAgICAgcmV0dXJuIGdldENhbm9uaWNhbE5hbWVTdHJpbmcocmVmZXJlbmNlLmNhbm9uaWNhbE5hbWUpOwogICAgdGhyb3cgIk5laXRoZXIgbm9kZSBub3IgY2Fub25pY2FsIG5hbWUgZm91bmQiOwogIH0KCiAgU3RyaW5nIGdldENhbm9uaWNhbE5hbWVTdHJpbmcoQ2Fub25pY2FsTmFtZSBuYW1lKSB7CiAgICBpZiAobmFtZS5pc1Jvb3QpIHRocm93ICd1bmV4cGVjdGVkIHJvb3QnOwogICAgaWYgKG5hbWUubmFtZS5zdGFydHNXaXRoKCdAJykpIHRocm93ICd1bmV4cGVjdGVkIEAnOwoKICAgIGxpYnJhcnlTdHJpbmcoQ2Fub25pY2FsTmFtZSBsaWIpIHsKICAgICAgaWYgKGxpYi5yZWZlcmVuY2U/Lm5vZGUgIT0gbnVsbCkKICAgICAgICByZXR1cm4gZ2V0TGlicmFyeVJlZmVyZW5jZShsaWIucmVmZXJlbmNlLmFzTGlicmFyeSk7CiAgICAgIHJldHVybiBzeW50aGV0aWNOYW1lcy5uYW1lQ2Fub25pY2FsTmFtZUFzTGlicmFyeVByZWZpeCgKICAgICAgICAgIGxpYi5yZWZlcmVuY2UsIGxpYik7CiAgICB9CgogICAgY2xhc3NTdHJpbmcoQ2Fub25pY2FsTmFtZSBjbHMpID0+CiAgICAgICAgbGlicmFyeVN0cmluZyhjbHMucGFyZW50KSArICc6OicgKyBjbHMubmFtZTsKCiAgICBpZiAobmFtZS5wYXJlbnQuaXNSb290KSByZXR1cm4gbGlicmFyeVN0cmluZyhuYW1lKTsKICAgIGlmIChuYW1lLnBhcmVudC5wYXJlbnQuaXNSb290KSByZXR1cm4gY2xhc3NTdHJpbmcobmFtZSk7CgogICAgQ2Fub25pY2FsTmFtZSBhdE5vZGUgPSBuYW1lLnBhcmVudDsKICAgIHdoaWxlICghYXROb2RlLm5hbWUuc3RhcnRzV2l0aCgnQCcpKSBhdE5vZGUgPSBhdE5vZGUucGFyZW50OwoKICAgIFN0cmluZyBwYXJlbnQgPSAiIjsKICAgIGlmIChhdE5vZGUucGFyZW50LnBhcmVudC5pc1Jvb3QpIHsKICAgICAgcGFyZW50ID0gbGlicmFyeVN0cmluZyhhdE5vZGUucGFyZW50KTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcmVudCA9IGNsYXNzU3RyaW5nKGF0Tm9kZS5wYXJlbnQpOwogICAgfQoKICAgIGlmIChuYW1lLm5hbWUgPT0gJycpIHJldHVybiAiJHBhcmVudDo6JGVtcHR5TmFtZVN0cmluZyI7CiAgICByZXR1cm4gIiRwYXJlbnQ6OiR7bmFtZS5uYW1lfSI7CiAgfQoKICB2b2lkIHdyaXRlVHlwZWRlZlJlZmVyZW5jZShUeXBlZGVmIHR5cGVkZWZOb2RlKSB7CiAgICB3cml0ZVdvcmQoZ2V0VHlwZWRlZlJlZmVyZW5jZSh0eXBlZGVmTm9kZSkpOwogIH0KCiAgdm9pZCB3cml0ZVZhcmlhYmxlUmVmZXJlbmNlKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpIHsKICAgIGZpbmFsIGhpZ2hsaWdodCA9IHNob3VsZEhpZ2hsaWdodCh2YXJpYWJsZSk7CiAgICBpZiAoaGlnaGxpZ2h0KSB7CiAgICAgIHN0YXJ0SGlnaGxpZ2h0KHZhcmlhYmxlKTsKICAgIH0KICAgIHdyaXRlV29yZChnZXRWYXJpYWJsZVJlZmVyZW5jZSh2YXJpYWJsZSkpOwogICAgaWYgKGhpZ2hsaWdodCkgewogICAgICBlbmRIaWdobGlnaHQodmFyaWFibGUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZVR5cGVQYXJhbWV0ZXJSZWZlcmVuY2UoVHlwZVBhcmFtZXRlciBub2RlKSB7CiAgICB3cml0ZVdvcmQoZ2V0VHlwZVBhcmFtZXRlclJlZmVyZW5jZShub2RlKSk7CiAgfQoKICB2b2lkIHdyaXRlRXhwcmVzc2lvbihFeHByZXNzaW9uIG5vZGUsIFtpbnQgbWluaW11bVByZWNlZGVuY2VdKSB7CiAgICBmaW5hbCBoaWdobGlnaHQgPSBzaG91bGRIaWdobGlnaHQobm9kZSk7CiAgICBpZiAoaGlnaGxpZ2h0KSB7CiAgICAgIHN0YXJ0SGlnaGxpZ2h0KG5vZGUpOwogICAgfQogICAgaWYgKHNob3dPZmZzZXRzKSB3cml0ZVdvcmQoIlske25vZGUuZmlsZU9mZnNldH1dIik7CiAgICBib29sIG5lZWRzUGFyZW50ZXNlcyA9IGZhbHNlOwogICAgaWYgKG1pbmltdW1QcmVjZWRlbmNlICE9IG51bGwgJiYgZ2V0UHJlY2VkZW5jZShub2RlKSA8IG1pbmltdW1QcmVjZWRlbmNlKSB7CiAgICAgIG5lZWRzUGFyZW50ZXNlcyA9IHRydWU7CiAgICAgIHdyaXRlU3ltYm9sKCcoJyk7CiAgICB9CiAgICB3cml0ZU5vZGUobm9kZSk7CiAgICBpZiAobmVlZHNQYXJlbnRlc2VzKSB7CiAgICAgIHdyaXRlU3ltYm9sKCcpJyk7CiAgICB9CiAgICBpZiAoaGlnaGxpZ2h0KSB7CiAgICAgIGVuZEhpZ2hsaWdodChub2RlKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVBbm5vdGF0aW9uKEV4cHJlc3Npb24gbm9kZSkgewogICAgd3JpdGVTeW1ib2woJ0AnKTsKICAgIGlmIChub2RlIGlzIENvbnN0cnVjdG9ySW52b2NhdGlvbikgewogICAgICB3cml0ZU1lbWJlclJlZmVyZW5jZUZyb21SZWZlcmVuY2Uobm9kZS50YXJnZXRSZWZlcmVuY2UpOwogICAgICB2aXNpdEFyZ3VtZW50cyhub2RlLmFyZ3VtZW50cyk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUV4cHJlc3Npb24obm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlQW5ub3RhdGlvbkxpc3QoTGlzdDxFeHByZXNzaW9uPiBub2Rlcywge2Jvb2wgc2VwYXJhdGVMaW5lczogdHJ1ZX0pIHsKICAgIGZvciAoRXhwcmVzc2lvbiBub2RlIGluIG5vZGVzKSB7CiAgICAgIGlmIChzZXBhcmF0ZUxpbmVzKSB7CiAgICAgICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgICB9CiAgICAgIHdyaXRlQW5ub3RhdGlvbihub2RlKTsKICAgICAgaWYgKHNlcGFyYXRlTGluZXMpIHsKICAgICAgICBlbmRMaW5lKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd3JpdGVTcGFjZSgpOwogICAgICB9CiAgICB9CiAgfQoKICB2aXNpdExpYnJhcnkoTGlicmFyeSBub2RlKSB7fQoKICB2aXNpdEZpZWxkKEZpZWxkIG5vZGUpIHsKICAgIHdyaXRlQW5ub3RhdGlvbkxpc3Qobm9kZS5hbm5vdGF0aW9ucyk7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaXNTdGF0aWMsICdzdGF0aWMnKTsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc0NvdmFyaWFudCwgJ2NvdmFyaWFudCcpOwogICAgd3JpdGVNb2RpZmllcihub2RlLmlzR2VuZXJpY0NvdmFyaWFudEltcGwsICdnZW5lcmljLWNvdmFyaWFudC1pbXBsJyk7CiAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaXNGaW5hbCwgJ2ZpbmFsJyk7CiAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaXNDb25zdCwgJ2NvbnN0Jyk7CiAgICAvLyBPbmx5IHNob3cgaW1wbGljaXQgZ2V0dGVyL3NldHRlciBtb2RpZmllcnMgaW4gY2FzZXMgd2hlcmUgdGhleSBhcmUKICAgIC8vIG91dCBvZiB0aGUgb3JkaW5hcnkuCiAgICBpZiAobm9kZS5pc1N0YXRpYykgewogICAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaGFzSW1wbGljaXRHZXR0ZXIsICdbZ2V0dGVyXScpOwogICAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaGFzSW1wbGljaXRTZXR0ZXIsICdbc2V0dGVyXScpOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVNb2RpZmllcighbm9kZS5oYXNJbXBsaWNpdEdldHRlciwgJ1tuby1nZXR0ZXJdJyk7CiAgICAgIGlmIChub2RlLmlzRmluYWwpIHsKICAgICAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaGFzSW1wbGljaXRTZXR0ZXIsICdbc2V0dGVyXScpOwogICAgICB9IGVsc2UgewogICAgICAgIHdyaXRlTW9kaWZpZXIoIW5vZGUuaGFzSW1wbGljaXRTZXR0ZXIsICdbbm8tc2V0dGVyXScpOwogICAgICB9CiAgICB9CiAgICB3cml0ZVdvcmQoJ2ZpZWxkJyk7CiAgICB3cml0ZVNwYWNlKCk7CiAgICB3cml0ZUFubm90YXRlZFR5cGUobm9kZS50eXBlLCBhbm5vdGF0b3I/LmFubm90YXRlRmllbGQodGhpcywgbm9kZSkpOwogICAgd3JpdGVOYW1lKGdldE1lbWJlck5hbWUobm9kZSkpOwogICAgaWYgKG5vZGUuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICB3cml0ZVNwYWNlZCgnPScpOwogICAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5pbml0aWFsaXplcik7CiAgICB9CiAgICBpZiAoKG5vZGUuZW5jbG9zaW5nQ2xhc3MgPT0gbnVsbCAmJgogICAgICAgICAgICBub2RlLmVuY2xvc2luZ0xpYnJhcnkuZmlsZVVyaSAhPSBub2RlLmZpbGVVcmkpIHx8CiAgICAgICAgKG5vZGUuZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCAmJgogICAgICAgICAgICBub2RlLmVuY2xvc2luZ0NsYXNzLmZpbGVVcmkgIT0gbm9kZS5maWxlVXJpKSkgewogICAgICB3cml0ZVdvcmQoIi8qIGZyb20gJHtub2RlLmZpbGVVcml9ICovIik7CiAgICB9CiAgICBlbmRMaW5lKCc7Jyk7CiAgfQoKICB2aXNpdFByb2NlZHVyZShQcm9jZWR1cmUgbm9kZSkgewogICAgd3JpdGVBbm5vdGF0aW9uTGlzdChub2RlLmFubm90YXRpb25zKTsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc0V4dGVybmFsLCAnZXh0ZXJuYWwnKTsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc1N0YXRpYywgJ3N0YXRpYycpOwogICAgd3JpdGVNb2RpZmllcihub2RlLmlzQWJzdHJhY3QsICdhYnN0cmFjdCcpOwogICAgd3JpdGVNb2RpZmllcihub2RlLmlzRm9yd2FyZGluZ1N0dWIsICdmb3J3YXJkaW5nLXN0dWInKTsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc0ZvcndhcmRpbmdTZW1pU3R1YiwgJ2ZvcndhcmRpbmctc2VtaS1zdHViJyk7CiAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaXNOb1N1Y2hNZXRob2RGb3J3YXJkZXIsICduby1zdWNoLW1ldGhvZC1mb3J3YXJkZXInKTsKICAgIHdyaXRlV29yZChwcm9jZWR1cmVLaW5kVG9TdHJpbmcobm9kZS5raW5kKSk7CiAgICBpZiAoKG5vZGUuZW5jbG9zaW5nQ2xhc3MgPT0gbnVsbCAmJgogICAgICAgICAgICBub2RlLmVuY2xvc2luZ0xpYnJhcnkuZmlsZVVyaSAhPSBub2RlLmZpbGVVcmkpIHx8CiAgICAgICAgKG5vZGUuZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCAmJgogICAgICAgICAgICBub2RlLmVuY2xvc2luZ0NsYXNzLmZpbGVVcmkgIT0gbm9kZS5maWxlVXJpKSkgewogICAgICB3cml0ZVdvcmQoIi8qIGZyb20gJHtub2RlLmZpbGVVcml9ICovIik7CiAgICB9CiAgICB3cml0ZUZ1bmN0aW9uKG5vZGUuZnVuY3Rpb24sIG5hbWU6IGdldE1lbWJlck5hbWUobm9kZSkpOwogIH0KCiAgdmlzaXRDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvciBub2RlKSB7CiAgICB3cml0ZUFubm90YXRpb25MaXN0KG5vZGUuYW5ub3RhdGlvbnMpOwogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVNb2RpZmllcihub2RlLmlzRXh0ZXJuYWwsICdleHRlcm5hbCcpOwogICAgd3JpdGVNb2RpZmllcihub2RlLmlzQ29uc3QsICdjb25zdCcpOwogICAgd3JpdGVNb2RpZmllcihub2RlLmlzU3ludGhldGljLCAnc3ludGhldGljJyk7CiAgICB3cml0ZVdvcmQoJ2NvbnN0cnVjdG9yJyk7CiAgICB3cml0ZUZ1bmN0aW9uKG5vZGUuZnVuY3Rpb24sCiAgICAgICAgbmFtZTogbm9kZS5uYW1lLCBpbml0aWFsaXplcnM6IG5vZGUuaW5pdGlhbGl6ZXJzKTsKICB9CgogIHZpc2l0UmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IoUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3Igbm9kZSkgewogICAgd3JpdGVBbm5vdGF0aW9uTGlzdChub2RlLmFubm90YXRpb25zKTsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc0V4dGVybmFsLCAnZXh0ZXJuYWwnKTsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc0NvbnN0LCAnY29uc3QnKTsKICAgIHdyaXRlV29yZCgncmVkaXJlY3RpbmdfZmFjdG9yeScpOwoKICAgIGlmIChub2RlLm5hbWUgIT0gbnVsbCkgewogICAgICB3cml0ZU5hbWUobm9kZS5uYW1lKTsKICAgIH0KICAgIHdyaXRlVHlwZVBhcmFtZXRlckxpc3Qobm9kZS50eXBlUGFyYW1ldGVycyk7CiAgICB3cml0ZVBhcmFtZXRlckxpc3Qobm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycywgbm9kZS5uYW1lZFBhcmFtZXRlcnMsCiAgICAgICAgbm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50KTsKICAgIHdyaXRlU3BhY2VkKCc9Jyk7CiAgICB3cml0ZU1lbWJlclJlZmVyZW5jZUZyb21SZWZlcmVuY2Uobm9kZS50YXJnZXRSZWZlcmVuY2UpOwogICAgaWYgKG5vZGUudHlwZUFyZ3VtZW50cy5pc05vdEVtcHR5KSB7CiAgICAgIHdyaXRlU3ltYm9sKCc8Jyk7CiAgICAgIHdyaXRlTGlzdChub2RlLnR5cGVBcmd1bWVudHMsIHdyaXRlVHlwZSk7CiAgICAgIHdyaXRlU3ltYm9sKCc+Jyk7CiAgICB9CiAgICBlbmRMaW5lKCc7Jyk7CiAgfQoKICB2aXNpdENsYXNzKENsYXNzIG5vZGUpIHsKICAgIHdyaXRlQW5ub3RhdGlvbkxpc3Qobm9kZS5hbm5vdGF0aW9ucyk7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaXNBYnN0cmFjdCwgJ2Fic3RyYWN0Jyk7CiAgICB3cml0ZVdvcmQoJ2NsYXNzJyk7CiAgICB3cml0ZVdvcmQoZ2V0Q2xhc3NOYW1lKG5vZGUpKTsKICAgIHdyaXRlVHlwZVBhcmFtZXRlckxpc3Qobm9kZS50eXBlUGFyYW1ldGVycyk7CiAgICBpZiAobm9kZS5pc01peGluQXBwbGljYXRpb24pIHsKICAgICAgd3JpdGVTcGFjZWQoJz0nKTsKICAgICAgdmlzaXRTdXBlcnR5cGUobm9kZS5zdXBlcnR5cGUpOwogICAgICB3cml0ZVNwYWNlZCgnd2l0aCcpOwogICAgICB2aXNpdFN1cGVydHlwZShub2RlLm1peGVkSW5UeXBlKTsKICAgIH0gZWxzZSBpZiAobm9kZS5zdXBlcnR5cGUgIT0gbnVsbCkgewogICAgICB3cml0ZVNwYWNlZCgnZXh0ZW5kcycpOwogICAgICB2aXNpdFN1cGVydHlwZShub2RlLnN1cGVydHlwZSk7CiAgICB9CiAgICBpZiAobm9kZS5pbXBsZW1lbnRlZFR5cGVzLmlzTm90RW1wdHkpIHsKICAgICAgd3JpdGVTcGFjZWQoJ2ltcGxlbWVudHMnKTsKICAgICAgd3JpdGVMaXN0KG5vZGUuaW1wbGVtZW50ZWRUeXBlcywgdmlzaXRTdXBlcnR5cGUpOwogICAgfQogICAgdmFyIGVuZExpbmVTdHJpbmcgPSAnIHsnOwogICAgaWYgKG5vZGUuZW5jbG9zaW5nTGlicmFyeS5maWxlVXJpICE9IG5vZGUuZmlsZVVyaSkgewogICAgICBlbmRMaW5lU3RyaW5nICs9ICcgLy8gZnJvbSAke25vZGUuZmlsZVVyaX0nOwogICAgfQogICAgZW5kTGluZShlbmRMaW5lU3RyaW5nKTsKICAgICsraW5kZW50YXRpb247CiAgICBub2RlLmZpZWxkcy5mb3JFYWNoKHdyaXRlTm9kZSk7CiAgICBub2RlLmNvbnN0cnVjdG9ycy5mb3JFYWNoKHdyaXRlTm9kZSk7CiAgICBub2RlLnByb2NlZHVyZXMuZm9yRWFjaCh3cml0ZU5vZGUpOwogICAgbm9kZS5yZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnMuZm9yRWFjaCh3cml0ZU5vZGUpOwogICAgLS1pbmRlbnRhdGlvbjsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIGVuZExpbmUoJ30nKTsKICB9CgogIHZpc2l0VHlwZWRlZihUeXBlZGVmIG5vZGUpIHsKICAgIHdyaXRlQW5ub3RhdGlvbkxpc3Qobm9kZS5hbm5vdGF0aW9ucyk7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZVdvcmQoJ3R5cGVkZWYnKTsKICAgIHdyaXRlV29yZChub2RlLm5hbWUpOwogICAgd3JpdGVUeXBlUGFyYW1ldGVyTGlzdChub2RlLnR5cGVQYXJhbWV0ZXJzKTsKICAgIHdyaXRlU3BhY2VkKCc9Jyk7CiAgICBpZiAobm9kZS50eXBlIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICB3cml0ZUZ1bmN0aW9uVHlwZShub2RlLnR5cGUsCiAgICAgICAgICB0eXBlZGVmUG9zaXRpb25hbDogbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgIHR5cGVkZWZOYW1lZDogbm9kZS5uYW1lZFBhcmFtZXRlcnMpOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVOb2RlKG5vZGUudHlwZSk7CiAgICB9CiAgICBlbmRMaW5lKCc7Jyk7CiAgfQoKICB2aXNpdEludmFsaWRFeHByZXNzaW9uKEludmFsaWRFeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlV29yZCgnaW52YWxpZC1leHByZXNzaW9uJyk7CiAgICBpZiAobm9kZS5tZXNzYWdlICE9IG51bGwpIHsKICAgICAgd3JpdGVXb3JkKCciJHtlc2NhcGVTdHJpbmcobm9kZS5tZXNzYWdlKX0iJyk7CiAgICB9CiAgfQoKICB2aXNpdE1ldGhvZEludm9jYXRpb24oTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5yZWNlaXZlciwgUHJlY2VkZW5jZS5QUklNQVJZKTsKICAgIHdyaXRlU3ltYm9sKCcuJyk7CiAgICB3cml0ZUludGVyZmFjZVRhcmdldChub2RlLm5hbWUsIG5vZGUuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKICAgIHdyaXRlTm9kZShub2RlLmFyZ3VtZW50cyk7CiAgfQoKICB2aXNpdERpcmVjdE1ldGhvZEludm9jYXRpb24oRGlyZWN0TWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5yZWNlaXZlciwgUHJlY2VkZW5jZS5QUklNQVJZKTsKICAgIHdyaXRlU3ltYm9sKCcuez0nKTsKICAgIHdyaXRlTWVtYmVyUmVmZXJlbmNlRnJvbVJlZmVyZW5jZShub2RlLnRhcmdldFJlZmVyZW5jZSk7CiAgICB3cml0ZVN5bWJvbCgnfScpOwogICAgd3JpdGVOb2RlKG5vZGUuYXJndW1lbnRzKTsKICB9CgogIHZpc2l0U3VwZXJNZXRob2RJbnZvY2F0aW9uKFN1cGVyTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICB3cml0ZVdvcmQoJ3N1cGVyJyk7CiAgICB3cml0ZVN5bWJvbCgnLicpOwogICAgd3JpdGVJbnRlcmZhY2VUYXJnZXQobm9kZS5uYW1lLCBub2RlLmludGVyZmFjZVRhcmdldFJlZmVyZW5jZSk7CiAgICB3cml0ZU5vZGUobm9kZS5hcmd1bWVudHMpOwogIH0KCiAgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKFN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgd3JpdGVNb2RpZmllcihub2RlLmlzQ29uc3QsICdjb25zdCcpOwogICAgd3JpdGVNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKG5vZGUudGFyZ2V0UmVmZXJlbmNlKTsKICAgIHdyaXRlTm9kZShub2RlLmFyZ3VtZW50cyk7CiAgfQoKICB2aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewogICAgd3JpdGVXb3JkKG5vZGUuaXNDb25zdCA/ICdjb25zdCcgOiAnbmV3Jyk7CiAgICB3cml0ZU1lbWJlclJlZmVyZW5jZUZyb21SZWZlcmVuY2Uobm9kZS50YXJnZXRSZWZlcmVuY2UpOwogICAgd3JpdGVOb2RlKG5vZGUuYXJndW1lbnRzKTsKICB9CgogIHZpc2l0Tm90KE5vdCBub2RlKSB7CiAgICB3cml0ZVN5bWJvbCgnIScpOwogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUub3BlcmFuZCwgUHJlY2VkZW5jZS5QUkVGSVgpOwogIH0KCiAgdmlzaXRMb2dpY2FsRXhwcmVzc2lvbihMb2dpY2FsRXhwcmVzc2lvbiBub2RlKSB7CiAgICBpbnQgcHJlY2VkZW5jZSA9IFByZWNlZGVuY2UuYmluYXJ5UHJlY2VkZW5jZVtub2RlLm9wZXJhdG9yXTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLmxlZnQsIHByZWNlZGVuY2UpOwogICAgd3JpdGVTcGFjZWQobm9kZS5vcGVyYXRvcik7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5yaWdodCwgcHJlY2VkZW5jZSArIDEpOwogIH0KCiAgdmlzaXRDb25kaXRpb25hbEV4cHJlc3Npb24oQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLmNvbmRpdGlvbiwgUHJlY2VkZW5jZS5MT0dJQ0FMX09SKTsKICAgIGVuc3VyZVNwYWNlKCk7CiAgICB3cml0ZSgnPycpOwogICAgd3JpdGVTdGF0aWNUeXBlKG5vZGUuc3RhdGljVHlwZSk7CiAgICB3cml0ZVNwYWNlKCk7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS50aGVuKTsKICAgIHdyaXRlU3BhY2VkKCc6Jyk7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5vdGhlcndpc2UpOwogIH0KCiAgU3RyaW5nIGdldEVzY2FwZWRDaGFyYWN0ZXIoaW50IGNvZGVVbml0KSB7CiAgICBzd2l0Y2ggKGNvZGVVbml0KSB7CiAgICAgIGNhc2UgOToKICAgICAgICByZXR1cm4gcidcdCc7CiAgICAgIGNhc2UgMTA6CiAgICAgICAgcmV0dXJuIHInXG4nOwogICAgICBjYXNlIDExOgogICAgICAgIHJldHVybiByJ1x2JzsKICAgICAgY2FzZSAxMjoKICAgICAgICByZXR1cm4gcidcZic7CiAgICAgIGNhc2UgMTM6CiAgICAgICAgcmV0dXJuIHInXHInOwogICAgICBjYXNlIDM0OgogICAgICAgIHJldHVybiByJ1wiJzsKICAgICAgY2FzZSAzNjoKICAgICAgICByZXR1cm4gcidcJCc7CiAgICAgIGNhc2UgOTI6CiAgICAgICAgcmV0dXJuIHInXFwnOwogICAgICBkZWZhdWx0OgogICAgICAgIGlmIChjb2RlVW5pdCA8IDMyIHx8IGNvZGVVbml0ID4gMTI2KSB7CiAgICAgICAgICByZXR1cm4gcidcdScgKyAnJGNvZGVVbml0Jy5wYWRMZWZ0KDQsICcwJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgIH0KICB9CgogIFN0cmluZyBlc2NhcGVTdHJpbmcoU3RyaW5nIHN0cmluZykgewogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlcjsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aDsgKytpKSB7CiAgICAgIFN0cmluZyBjaGFyYWN0ZXIgPSBnZXRFc2NhcGVkQ2hhcmFjdGVyKHN0cmluZy5jb2RlVW5pdEF0KGkpKTsKICAgICAgaWYgKGNoYXJhY3RlciAhPSBudWxsKSB7CiAgICAgICAgYnVmZmVyID8/PSBuZXcgU3RyaW5nQnVmZmVyKHN0cmluZy5zdWJzdHJpbmcoMCwgaSkpOwogICAgICAgIGJ1ZmZlci53cml0ZShjaGFyYWN0ZXIpOwogICAgICB9IGVsc2UgewogICAgICAgIGJ1ZmZlcj8ud3JpdGUoc3RyaW5nW2ldKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJ1ZmZlciA9PSBudWxsID8gc3RyaW5nIDogYnVmZmVyLnRvU3RyaW5nKCk7CiAgfQoKICB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICBpZiAoc3RhdGUgPT0gV09SRCkgewogICAgICB3cml0ZVNwYWNlKCk7CiAgICB9CiAgICB3cml0ZSgnIicpOwogICAgZm9yICh2YXIgcGFydCBpbiBub2RlLmV4cHJlc3Npb25zKSB7CiAgICAgIGlmIChwYXJ0IGlzIFN0cmluZ0xpdGVyYWwpIHsKICAgICAgICB3cml0ZVN5bWJvbChlc2NhcGVTdHJpbmcocGFydC52YWx1ZSkpOwogICAgICB9IGVsc2UgewogICAgICAgIHdyaXRlU3ltYm9sKHInJHsnKTsKICAgICAgICB3cml0ZUV4cHJlc3Npb24ocGFydCk7CiAgICAgICAgd3JpdGVTeW1ib2woJ30nKTsKICAgICAgfQogICAgfQogICAgd3JpdGUoJyInKTsKICAgIHN0YXRlID0gV09SRDsKICB9CgogIHZpc2l0TGlzdENvbmNhdGVuYXRpb24oTGlzdENvbmNhdGVuYXRpb24gbm9kZSkgewogICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICBmb3IgKEV4cHJlc3Npb24gcGFydCBpbiBub2RlLmxpc3RzKSB7CiAgICAgIGlmICghZmlyc3QpIHdyaXRlU3BhY2VkKCcrJyk7CiAgICAgIHdyaXRlRXhwcmVzc2lvbihwYXJ0KTsKICAgICAgZmlyc3QgPSBmYWxzZTsKICAgIH0KICB9CgogIHZpc2l0U2V0Q29uY2F0ZW5hdGlvbihTZXRDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgZm9yIChFeHByZXNzaW9uIHBhcnQgaW4gbm9kZS5zZXRzKSB7CiAgICAgIGlmICghZmlyc3QpIHdyaXRlU3BhY2VkKCcrJyk7CiAgICAgIHdyaXRlRXhwcmVzc2lvbihwYXJ0KTsKICAgICAgZmlyc3QgPSBmYWxzZTsKICAgIH0KICB9CgogIHZpc2l0TWFwQ29uY2F0ZW5hdGlvbihNYXBDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgZm9yIChFeHByZXNzaW9uIHBhcnQgaW4gbm9kZS5tYXBzKSB7CiAgICAgIGlmICghZmlyc3QpIHdyaXRlU3BhY2VkKCcrJyk7CiAgICAgIHdyaXRlRXhwcmVzc2lvbihwYXJ0KTsKICAgICAgZmlyc3QgPSBmYWxzZTsKICAgIH0KICB9CgogIHZpc2l0SW5zdGFuY2VDcmVhdGlvbihJbnN0YW5jZUNyZWF0aW9uIG5vZGUpIHsKICAgIHdyaXRlKCcke25vZGUuY2xhc3NOb2RlfScpOwogICAgaWYgKG5vZGUudHlwZUFyZ3VtZW50cy5pc05vdEVtcHR5KSB7CiAgICAgIHdyaXRlU3ltYm9sKCc8Jyk7CiAgICAgIHdyaXRlTGlzdChub2RlLnR5cGVBcmd1bWVudHMsIHdyaXRlVHlwZSk7CiAgICAgIHdyaXRlU3ltYm9sKCc+Jyk7CiAgICB9CiAgICB3cml0ZSgnIHsnKTsKICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgbm9kZS5maWVsZFZhbHVlcy5mb3JFYWNoKChSZWZlcmVuY2UgZmllbGRSZWYsIEV4cHJlc3Npb24gdmFsdWUpIHsKICAgICAgaWYgKCFmaXJzdCkgewogICAgICAgIHdyaXRlQ29tbWEoKTsKICAgICAgfQogICAgICB3cml0ZSgnJHtmaWVsZFJlZi5hc0ZpZWxkLm5hbWV9OiAnKTsKICAgICAgd3JpdGVFeHByZXNzaW9uKHZhbHVlKTsKICAgICAgZmlyc3QgPSBmYWxzZTsKICAgIH0pOwogICAgZm9yIChBc3NlcnRTdGF0ZW1lbnQgYXNzZXJ0XyBpbiBub2RlLmFzc2VydHMpIHsKICAgICAgaWYgKCFmaXJzdCkgewogICAgICAgIHdyaXRlQ29tbWEoKTsKICAgICAgfQogICAgICB3cml0ZSgnYXNzZXJ0KCcpOwogICAgICB3cml0ZUV4cHJlc3Npb24oYXNzZXJ0Xy5jb25kaXRpb24pOwogICAgICBpZiAoYXNzZXJ0Xy5tZXNzYWdlICE9IG51bGwpIHsKICAgICAgICB3cml0ZUNvbW1hKCk7CiAgICAgICAgd3JpdGVFeHByZXNzaW9uKGFzc2VydF8ubWVzc2FnZSk7CiAgICAgIH0KICAgICAgd3JpdGUoJyknKTsKICAgIH0KCiAgICB3cml0ZSgnfScpOwogIH0KCiAgdmlzaXRJc0V4cHJlc3Npb24oSXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLm9wZXJhbmQsIFByZWNlZGVuY2UuQklUV0lTRV9PUik7CiAgICB3cml0ZVNwYWNlZCgnaXMnKTsKICAgIHdyaXRlVHlwZShub2RlLnR5cGUpOwogIH0KCiAgdmlzaXRBc0V4cHJlc3Npb24oQXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLm9wZXJhbmQsIFByZWNlZGVuY2UuQklUV0lTRV9PUik7CiAgICB3cml0ZVNwYWNlZChub2RlLmlzVHlwZUVycm9yID8gJ2Fze1R5cGVFcnJvcn0nIDogJ2FzJyk7CiAgICB3cml0ZVR5cGUobm9kZS50eXBlKTsKICB9CgogIHZpc2l0U3ltYm9sTGl0ZXJhbChTeW1ib2xMaXRlcmFsIG5vZGUpIHsKICAgIHdyaXRlU3ltYm9sKCcjJyk7CiAgICB3cml0ZVdvcmQobm9kZS52YWx1ZSk7CiAgfQoKICB2aXNpdFR5cGVMaXRlcmFsKFR5cGVMaXRlcmFsIG5vZGUpIHsKICAgIHdyaXRlVHlwZShub2RlLnR5cGUpOwogIH0KCiAgdmlzaXRUaGlzRXhwcmVzc2lvbihUaGlzRXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZVdvcmQoJ3RoaXMnKTsKICB9CgogIHZpc2l0UmV0aHJvdyhSZXRocm93IG5vZGUpIHsKICAgIHdyaXRlV29yZCgncmV0aHJvdycpOwogIH0KCiAgdmlzaXRUaHJvdyhUaHJvdyBub2RlKSB7CiAgICB3cml0ZVdvcmQoJ3Rocm93Jyk7CiAgICB3cml0ZVNwYWNlKCk7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKTsKICB9CgogIHZpc2l0TGlzdExpdGVyYWwoTGlzdExpdGVyYWwgbm9kZSkgewogICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICB3cml0ZVdvcmQoJ2NvbnN0Jyk7CiAgICAgIHdyaXRlU3BhY2UoKTsKICAgIH0KICAgIGlmIChub2RlLnR5cGVBcmd1bWVudCAhPSBudWxsKSB7CiAgICAgIHdyaXRlU3ltYm9sKCc8Jyk7CiAgICAgIHdyaXRlVHlwZShub2RlLnR5cGVBcmd1bWVudCk7CiAgICAgIHdyaXRlU3ltYm9sKCc+Jyk7CiAgICB9CiAgICB3cml0ZVN5bWJvbCgnWycpOwogICAgd3JpdGVMaXN0KG5vZGUuZXhwcmVzc2lvbnMsIHdyaXRlTm9kZSk7CiAgICB3cml0ZVN5bWJvbCgnXScpOwogIH0KCiAgdmlzaXRTZXRMaXRlcmFsKFNldExpdGVyYWwgbm9kZSkgewogICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICB3cml0ZVdvcmQoJ2NvbnN0Jyk7CiAgICAgIHdyaXRlU3BhY2UoKTsKICAgIH0KICAgIGlmIChub2RlLnR5cGVBcmd1bWVudCAhPSBudWxsKSB7CiAgICAgIHdyaXRlU3ltYm9sKCc8Jyk7CiAgICAgIHdyaXRlVHlwZShub2RlLnR5cGVBcmd1bWVudCk7CiAgICAgIHdyaXRlU3ltYm9sKCc+Jyk7CiAgICB9CiAgICB3cml0ZVN5bWJvbCgneycpOwogICAgd3JpdGVMaXN0KG5vZGUuZXhwcmVzc2lvbnMsIHdyaXRlTm9kZSk7CiAgICB3cml0ZVN5bWJvbCgnfScpOwogIH0KCiAgdmlzaXRNYXBMaXRlcmFsKE1hcExpdGVyYWwgbm9kZSkgewogICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICB3cml0ZVdvcmQoJ2NvbnN0Jyk7CiAgICAgIHdyaXRlU3BhY2UoKTsKICAgIH0KICAgIGlmIChub2RlLmtleVR5cGUgIT0gbnVsbCkgewogICAgICB3cml0ZVN5bWJvbCgnPCcpOwogICAgICB3cml0ZUxpc3QoW25vZGUua2V5VHlwZSwgbm9kZS52YWx1ZVR5cGVdLCB3cml0ZVR5cGUpOwogICAgICB3cml0ZVN5bWJvbCgnPicpOwogICAgfQogICAgd3JpdGVTeW1ib2woJ3snKTsKICAgIHdyaXRlTGlzdChub2RlLmVudHJpZXMsIHdyaXRlTm9kZSk7CiAgICB3cml0ZVN5bWJvbCgnfScpOwogIH0KCiAgdmlzaXRNYXBFbnRyeShNYXBFbnRyeSBub2RlKSB7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5rZXkpOwogICAgd3JpdGVDb21tYSgnOicpOwogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUudmFsdWUpOwogIH0KCiAgdmlzaXRBd2FpdEV4cHJlc3Npb24oQXdhaXRFeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlV29yZCgnYXdhaXQnKTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLm9wZXJhbmQpOwogIH0KCiAgdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oRnVuY3Rpb25FeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlRnVuY3Rpb24obm9kZS5mdW5jdGlvbiwgdGVybWluYXRlTGluZTogZmFsc2UpOwogIH0KCiAgdmlzaXRTdHJpbmdMaXRlcmFsKFN0cmluZ0xpdGVyYWwgbm9kZSkgewogICAgd3JpdGVXb3JkKCciJHtlc2NhcGVTdHJpbmcobm9kZS52YWx1ZSl9IicpOwogIH0KCiAgdmlzaXRJbnRMaXRlcmFsKEludExpdGVyYWwgbm9kZSkgewogICAgd3JpdGVXb3JkKCcke25vZGUudmFsdWV9Jyk7CiAgfQoKICB2aXNpdERvdWJsZUxpdGVyYWwoRG91YmxlTGl0ZXJhbCBub2RlKSB7CiAgICB3cml0ZVdvcmQoJyR7bm9kZS52YWx1ZX0nKTsKICB9CgogIHZpc2l0Qm9vbExpdGVyYWwoQm9vbExpdGVyYWwgbm9kZSkgewogICAgd3JpdGVXb3JkKCcke25vZGUudmFsdWV9Jyk7CiAgfQoKICB2aXNpdE51bGxMaXRlcmFsKE51bGxMaXRlcmFsIG5vZGUpIHsKICAgIHdyaXRlV29yZCgnbnVsbCcpOwogIH0KCiAgdmlzaXRMZXQoTGV0IG5vZGUpIHsKICAgIHdyaXRlV29yZCgnbGV0Jyk7CiAgICB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb24obm9kZS52YXJpYWJsZSk7CiAgICB3cml0ZVNwYWNlZCgnaW4nKTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLmJvZHkpOwogIH0KCiAgdmlzaXRCbG9ja0V4cHJlc3Npb24oQmxvY2tFeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlU3BhY2VkKCdibG9jaycpOwogICAgd3JpdGVCbG9ja0JvZHkobm9kZS5ib2R5LnN0YXRlbWVudHMsIGFzRXhwcmVzc2lvbjogdHJ1ZSk7CiAgICB3cml0ZVN5bWJvbCgnID0+Jyk7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS52YWx1ZSk7CiAgfQoKICB2aXNpdEluc3RhbnRpYXRpb24oSW5zdGFudGlhdGlvbiBub2RlKSB7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKTsKICAgIHdyaXRlU3ltYm9sKCc8Jyk7CiAgICB3cml0ZUxpc3Qobm9kZS50eXBlQXJndW1lbnRzLCB3cml0ZVR5cGUpOwogICAgd3JpdGVTeW1ib2woJz4nKTsKICB9CgogIHZpc2l0TG9hZExpYnJhcnkoTG9hZExpYnJhcnkgbm9kZSkgewogICAgd3JpdGVXb3JkKCdMb2FkTGlicmFyeScpOwogICAgd3JpdGVTeW1ib2woJygnKTsKICAgIHdyaXRlV29yZChub2RlLmltcG9ydC5uYW1lKTsKICAgIHdyaXRlU3ltYm9sKCcpJyk7CiAgICBzdGF0ZSA9IFdPUkQ7CiAgfQoKICB2aXNpdENoZWNrTGlicmFyeUlzTG9hZGVkKENoZWNrTGlicmFyeUlzTG9hZGVkIG5vZGUpIHsKICAgIHdyaXRlV29yZCgnQ2hlY2tMaWJyYXJ5SXNMb2FkZWQnKTsKICAgIHdyaXRlU3ltYm9sKCcoJyk7CiAgICB3cml0ZVdvcmQobm9kZS5pbXBvcnQubmFtZSk7CiAgICB3cml0ZVN5bWJvbCgnKScpOwogICAgc3RhdGUgPSBXT1JEOwogIH0KCiAgdmlzaXRMaWJyYXJ5UGFydChMaWJyYXJ5UGFydCBub2RlKSB7CiAgICB3cml0ZUFubm90YXRpb25MaXN0KG5vZGUuYW5ub3RhdGlvbnMpOwogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVXb3JkKCdwYXJ0Jyk7CiAgICB3cml0ZVdvcmQobm9kZS5wYXJ0VXJpKTsKICAgIGVuZExpbmUoIjsiKTsKICB9CgogIHZpc2l0TGlicmFyeURlcGVuZGVuY3koTGlicmFyeURlcGVuZGVuY3kgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVXb3JkKG5vZGUuaXNJbXBvcnQgPyAnaW1wb3J0JyA6ICdleHBvcnQnKTsKICAgIHZhciB1cmlTdHJpbmc7CiAgICBpZiAobm9kZS5pbXBvcnRlZExpYnJhcnlSZWZlcmVuY2U/Lm5vZGUgIT0gbnVsbCkgewogICAgICB1cmlTdHJpbmcgPSAnJHtub2RlLnRhcmdldExpYnJhcnkuaW1wb3J0VXJpfSc7CiAgICB9IGVsc2UgewogICAgICB1cmlTdHJpbmcgPSAnJHtub2RlLmltcG9ydGVkTGlicmFyeVJlZmVyZW5jZT8uY2Fub25pY2FsTmFtZT8ubmFtZX0nOwogICAgfQogICAgd3JpdGVXb3JkKCciJHVyaVN0cmluZyInKTsKICAgIGlmIChub2RlLmlzRGVmZXJyZWQpIHsKICAgICAgd3JpdGVXb3JkKCdkZWZlcnJlZCcpOwogICAgfQogICAgaWYgKG5vZGUubmFtZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlV29yZCgnYXMnKTsKICAgICAgd3JpdGVXb3JkKG5vZGUubmFtZSk7CiAgICB9CiAgICBlbmRMaW5lKCc7Jyk7CiAgfQoKICBkZWZhdWx0RXhwcmVzc2lvbihFeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlV29yZCgnJHtub2RlLnJ1bnRpbWVUeXBlfScpOwogIH0KCiAgdmlzaXRWYXJpYWJsZUdldChWYXJpYWJsZUdldCBub2RlKSB7CiAgICB3cml0ZVZhcmlhYmxlUmVmZXJlbmNlKG5vZGUudmFyaWFibGUpOwogICAgaWYgKG5vZGUucHJvbW90ZWRUeXBlICE9IG51bGwpIHsKICAgICAgd3JpdGVTeW1ib2woJ3snKTsKICAgICAgd3JpdGVOb2RlKG5vZGUucHJvbW90ZWRUeXBlKTsKICAgICAgd3JpdGVTeW1ib2woJ30nKTsKICAgICAgc3RhdGUgPSBXT1JEOwogICAgfQogIH0KCiAgdmlzaXRWYXJpYWJsZVNldChWYXJpYWJsZVNldCBub2RlKSB7CiAgICB3cml0ZVZhcmlhYmxlUmVmZXJlbmNlKG5vZGUudmFyaWFibGUpOwogICAgd3JpdGVTcGFjZWQoJz0nKTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLnZhbHVlKTsKICB9CgogIHZvaWQgd3JpdGVJbnRlcmZhY2VUYXJnZXQoTmFtZSBuYW1lLCBSZWZlcmVuY2UgdGFyZ2V0KSB7CiAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHsKICAgICAgd3JpdGVTeW1ib2woJ3snKTsKICAgICAgd3JpdGVNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKHRhcmdldCk7CiAgICAgIHdyaXRlU3ltYm9sKCd9Jyk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZU5hbWUobmFtZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlU3RhdGljVHlwZShEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlU3ltYm9sKCd7Jyk7CiAgICAgIHdyaXRlVHlwZSh0eXBlKTsKICAgICAgd3JpdGVTeW1ib2woJ30nKTsKICAgIH0KICB9CgogIHZpc2l0UHJvcGVydHlHZXQoUHJvcGVydHlHZXQgbm9kZSkgewogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUucmVjZWl2ZXIsIFByZWNlZGVuY2UuUFJJTUFSWSk7CiAgICB3cml0ZVN5bWJvbCgnLicpOwogICAgd3JpdGVJbnRlcmZhY2VUYXJnZXQobm9kZS5uYW1lLCBub2RlLmludGVyZmFjZVRhcmdldFJlZmVyZW5jZSk7CiAgfQoKICB2aXNpdFByb3BlcnR5U2V0KFByb3BlcnR5U2V0IG5vZGUpIHsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLnJlY2VpdmVyLCBQcmVjZWRlbmNlLlBSSU1BUlkpOwogICAgd3JpdGVTeW1ib2woJy4nKTsKICAgIHdyaXRlSW50ZXJmYWNlVGFyZ2V0KG5vZGUubmFtZSwgbm9kZS5pbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpOwogICAgd3JpdGVTcGFjZWQoJz0nKTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLnZhbHVlKTsKICB9CgogIHZpc2l0U3VwZXJQcm9wZXJ0eUdldChTdXBlclByb3BlcnR5R2V0IG5vZGUpIHsKICAgIHdyaXRlV29yZCgnc3VwZXInKTsKICAgIHdyaXRlU3ltYm9sKCcuJyk7CiAgICB3cml0ZUludGVyZmFjZVRhcmdldChub2RlLm5hbWUsIG5vZGUuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKICB9CgogIHZpc2l0U3VwZXJQcm9wZXJ0eVNldChTdXBlclByb3BlcnR5U2V0IG5vZGUpIHsKICAgIHdyaXRlV29yZCgnc3VwZXInKTsKICAgIHdyaXRlU3ltYm9sKCcuJyk7CiAgICB3cml0ZUludGVyZmFjZVRhcmdldChub2RlLm5hbWUsIG5vZGUuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKICAgIHdyaXRlU3BhY2VkKCc9Jyk7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS52YWx1ZSk7CiAgfQoKICB2aXNpdERpcmVjdFByb3BlcnR5R2V0KERpcmVjdFByb3BlcnR5R2V0IG5vZGUpIHsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLnJlY2VpdmVyLCBQcmVjZWRlbmNlLlBSSU1BUlkpOwogICAgd3JpdGVTeW1ib2woJy57PScpOwogICAgd3JpdGVNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKG5vZGUudGFyZ2V0UmVmZXJlbmNlKTsKICAgIHdyaXRlU3ltYm9sKCd9Jyk7CiAgfQoKICB2aXNpdERpcmVjdFByb3BlcnR5U2V0KERpcmVjdFByb3BlcnR5U2V0IG5vZGUpIHsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLnJlY2VpdmVyLCBQcmVjZWRlbmNlLlBSSU1BUlkpOwogICAgd3JpdGVTeW1ib2woJy57PScpOwogICAgd3JpdGVNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKG5vZGUudGFyZ2V0UmVmZXJlbmNlKTsKICAgIHdyaXRlU3ltYm9sKCd9Jyk7CiAgICB3cml0ZVNwYWNlZCgnPScpOwogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUudmFsdWUpOwogIH0KCiAgdmlzaXRTdGF0aWNHZXQoU3RhdGljR2V0IG5vZGUpIHsKICAgIHdyaXRlTWVtYmVyUmVmZXJlbmNlRnJvbVJlZmVyZW5jZShub2RlLnRhcmdldFJlZmVyZW5jZSk7CiAgfQoKICB2aXNpdFN0YXRpY1NldChTdGF0aWNTZXQgbm9kZSkgewogICAgd3JpdGVNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKG5vZGUudGFyZ2V0UmVmZXJlbmNlKTsKICAgIHdyaXRlU3BhY2VkKCc9Jyk7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS52YWx1ZSk7CiAgfQoKICB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoRXhwcmVzc2lvblN0YXRlbWVudCBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKTsKICAgIGVuZExpbmUoJzsnKTsKICB9CgogIHZvaWQgd3JpdGVCbG9ja0JvZHkoTGlzdDxTdGF0ZW1lbnQ+IHN0YXRlbWVudHMsIHtib29sIGFzRXhwcmVzc2lvbiA9IGZhbHNlfSkgewogICAgaWYgKHN0YXRlbWVudHMuaXNFbXB0eSkgewogICAgICBhc0V4cHJlc3Npb24gPyB3cml0ZVN5bWJvbCgne30nKSA6IGVuZExpbmUoJ3t9Jyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGVuZExpbmUoJ3snKTsKICAgICsraW5kZW50YXRpb247CiAgICBzdGF0ZW1lbnRzLmZvckVhY2god3JpdGVOb2RlKTsKICAgIC0taW5kZW50YXRpb247CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICBhc0V4cHJlc3Npb24gPyB3cml0ZVN5bWJvbCgnfScpIDogZW5kTGluZSgnfScpOwogIH0KCiAgdmlzaXRCbG9jayhCbG9jayBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZUJsb2NrQm9keShub2RlLnN0YXRlbWVudHMpOwogIH0KCiAgdmlzaXRBc3NlcnRCbG9jayhBc3NlcnRCbG9jayBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZVNwYWNlZCgnYXNzZXJ0Jyk7CiAgICB3cml0ZUJsb2NrQm9keShub2RlLnN0YXRlbWVudHMpOwogIH0KCiAgdmlzaXRFbXB0eVN0YXRlbWVudChFbXB0eVN0YXRlbWVudCBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICBlbmRMaW5lKCc7Jyk7CiAgfQoKICB2aXNpdEFzc2VydFN0YXRlbWVudChBc3NlcnRTdGF0ZW1lbnQgbm9kZSwge2Jvb2wgYXNFeHByZXNzaW9uID0gZmFsc2V9KSB7CiAgICBpZiAoIWFzRXhwcmVzc2lvbikgewogICAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB9CiAgICB3cml0ZVdvcmQoJ2Fzc2VydCcpOwogICAgd3JpdGVTeW1ib2woJygnKTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLmNvbmRpdGlvbik7CiAgICBpZiAobm9kZS5tZXNzYWdlICE9IG51bGwpIHsKICAgICAgd3JpdGVDb21tYSgpOwogICAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5tZXNzYWdlKTsKICAgIH0KICAgIGlmICghYXNFeHByZXNzaW9uKSB7CiAgICAgIGVuZExpbmUoJyk7Jyk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZVN5bWJvbCgnKScpOwogICAgfQogIH0KCiAgdmlzaXRMYWJlbGVkU3RhdGVtZW50KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVXb3JkKHN5bnRoZXRpY05hbWVzLm5hbWVMYWJlbGVkU3RhdGVtZW50KG5vZGUpKTsKICAgIGVuZExpbmUoJzonKTsKICAgIHdyaXRlTm9kZShub2RlLmJvZHkpOwogIH0KCiAgdmlzaXRCcmVha1N0YXRlbWVudChCcmVha1N0YXRlbWVudCBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZVdvcmQoJ2JyZWFrJyk7CiAgICB3cml0ZVdvcmQoc3ludGhldGljTmFtZXMubmFtZUxhYmVsZWRTdGF0ZW1lbnQobm9kZS50YXJnZXQpKTsKICAgIGVuZExpbmUoJzsnKTsKICB9CgogIHZpc2l0V2hpbGVTdGF0ZW1lbnQoV2hpbGVTdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVTcGFjZWQoJ3doaWxlJyk7CiAgICB3cml0ZVN5bWJvbCgnKCcpOwogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUuY29uZGl0aW9uKTsKICAgIHdyaXRlU3ltYm9sKCcpJyk7CiAgICB3cml0ZUJvZHkobm9kZS5ib2R5KTsKICB9CgogIHZpc2l0RG9TdGF0ZW1lbnQoRG9TdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVXb3JkKCdkbycpOwogICAgd3JpdGVCb2R5KG5vZGUuYm9keSk7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZVNwYWNlZCgnd2hpbGUnKTsKICAgIHdyaXRlU3ltYm9sKCcoJyk7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5jb25kaXRpb24pOwogICAgZW5kTGluZSgnKScpOwogIH0KCiAgdmlzaXRGb3JTdGF0ZW1lbnQoRm9yU3RhdGVtZW50IG5vZGUpIHsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIHdyaXRlU3BhY2VkKCdmb3InKTsKICAgIHdyaXRlU3ltYm9sKCcoJyk7CiAgICB3cml0ZUxpc3Qobm9kZS52YXJpYWJsZXMsIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbik7CiAgICB3cml0ZUNvbW1hKCc7Jyk7CiAgICBpZiAobm9kZS5jb25kaXRpb24gIT0gbnVsbCkgewogICAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5jb25kaXRpb24pOwogICAgfQogICAgd3JpdGVDb21tYSgnOycpOwogICAgd3JpdGVMaXN0KG5vZGUudXBkYXRlcywgd3JpdGVFeHByZXNzaW9uKTsKICAgIHdyaXRlU3ltYm9sKCcpJyk7CiAgICB3cml0ZUJvZHkobm9kZS5ib2R5KTsKICB9CgogIHZpc2l0Rm9ySW5TdGF0ZW1lbnQoRm9ySW5TdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgaWYgKG5vZGUuaXNBc3luYykgewogICAgICB3cml0ZVNwYWNlZCgnYXdhaXQnKTsKICAgIH0KICAgIHdyaXRlU3BhY2VkKCdmb3InKTsKICAgIHdyaXRlU3ltYm9sKCcoJyk7CiAgICB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb24obm9kZS52YXJpYWJsZSwgdXNlVmFyS2V5d29yZDogdHJ1ZSk7CiAgICB3cml0ZVNwYWNlZCgnaW4nKTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLml0ZXJhYmxlKTsKICAgIHdyaXRlU3ltYm9sKCcpJyk7CiAgICB3cml0ZUJvZHkobm9kZS5ib2R5KTsKICB9CgogIHZpc2l0U3dpdGNoU3RhdGVtZW50KFN3aXRjaFN0YXRlbWVudCBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZVdvcmQoJ3N3aXRjaCcpOwogICAgd3JpdGVTeW1ib2woJygnKTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb24pOwogICAgZW5kTGluZSgnKSB7Jyk7CiAgICArK2luZGVudGF0aW9uOwogICAgbm9kZS5jYXNlcy5mb3JFYWNoKHdyaXRlTm9kZSk7CiAgICAtLWluZGVudGF0aW9uOwogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgZW5kTGluZSgnfScpOwogIH0KCiAgdmlzaXRTd2l0Y2hDYXNlKFN3aXRjaENhc2Ugbm9kZSkgewogICAgU3RyaW5nIGxhYmVsID0gc3ludGhldGljTmFtZXMubmFtZVN3aXRjaENhc2Uobm9kZSk7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZVdvcmQobGFiZWwpOwogICAgZW5kTGluZSgnOicpOwogICAgZm9yICh2YXIgZXhwcmVzc2lvbiBpbiBub2RlLmV4cHJlc3Npb25zKSB7CiAgICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgICAgd3JpdGVXb3JkKCdjYXNlJyk7CiAgICAgIHdyaXRlRXhwcmVzc2lvbihleHByZXNzaW9uKTsKICAgICAgZW5kTGluZSgnOicpOwogICAgfQogICAgaWYgKG5vZGUuaXNEZWZhdWx0KSB7CiAgICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgICAgd3JpdGVXb3JkKCdkZWZhdWx0Jyk7CiAgICAgIGVuZExpbmUoJzonKTsKICAgIH0KICAgICsraW5kZW50YXRpb247CiAgICB3cml0ZU5vZGUobm9kZS5ib2R5KTsKICAgIC0taW5kZW50YXRpb247CiAgfQoKICB2aXNpdENvbnRpbnVlU3dpdGNoU3RhdGVtZW50KENvbnRpbnVlU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIHdyaXRlV29yZCgnY29udGludWUnKTsKICAgIHdyaXRlV29yZChzeW50aGV0aWNOYW1lcy5uYW1lU3dpdGNoQ2FzZShub2RlLnRhcmdldCkpOwogICAgZW5kTGluZSgnOycpOwogIH0KCiAgdmlzaXRJZlN0YXRlbWVudChJZlN0YXRlbWVudCBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZVdvcmQoJ2lmJyk7CiAgICB3cml0ZVN5bWJvbCgnKCcpOwogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUuY29uZGl0aW9uKTsKICAgIHdyaXRlU3ltYm9sKCcpJyk7CiAgICB3cml0ZUJvZHkobm9kZS50aGVuKTsKICAgIGlmIChub2RlLm90aGVyd2lzZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgICAgd3JpdGVXb3JkKCdlbHNlJyk7CiAgICAgIHdyaXRlQm9keShub2RlLm90aGVyd2lzZSk7CiAgICB9CiAgfQoKICB2aXNpdFJldHVyblN0YXRlbWVudChSZXR1cm5TdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVXb3JkKCdyZXR1cm4nKTsKICAgIGlmIChub2RlLmV4cHJlc3Npb24gIT0gbnVsbCkgewogICAgICB3cml0ZVNwYWNlKCk7CiAgICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb24pOwogICAgfQogICAgZW5kTGluZSgnOycpOwogIH0KCiAgdmlzaXRUcnlDYXRjaChUcnlDYXRjaCBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZVdvcmQoJ3RyeScpOwogICAgd3JpdGVCb2R5KG5vZGUuYm9keSk7CiAgICBub2RlLmNhdGNoZXMuZm9yRWFjaCh3cml0ZU5vZGUpOwogIH0KCiAgdmlzaXRDYXRjaChDYXRjaCBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICBpZiAobm9kZS5ndWFyZCAhPSBudWxsKSB7CiAgICAgIHdyaXRlV29yZCgnb24nKTsKICAgICAgd3JpdGVUeXBlKG5vZGUuZ3VhcmQpOwogICAgICB3cml0ZVNwYWNlKCk7CiAgICB9CiAgICB3cml0ZVdvcmQoJ2NhdGNoJyk7CiAgICB3cml0ZVN5bWJvbCgnKCcpOwogICAgaWYgKG5vZGUuZXhjZXB0aW9uICE9IG51bGwpIHsKICAgICAgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUuZXhjZXB0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlV29yZCgnbm8tZXhjZXB0aW9uLXZhcicpOwogICAgfQogICAgaWYgKG5vZGUuc3RhY2tUcmFjZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlQ29tbWEoKTsKICAgICAgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUuc3RhY2tUcmFjZSk7CiAgICB9CiAgICB3cml0ZVN5bWJvbCgnKScpOwogICAgd3JpdGVCb2R5KG5vZGUuYm9keSk7CiAgfQoKICB2aXNpdFRyeUZpbmFsbHkoVHJ5RmluYWxseSBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZVdvcmQoJ3RyeScpOwogICAgd3JpdGVCb2R5KG5vZGUuYm9keSk7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZVdvcmQoJ2ZpbmFsbHknKTsKICAgIHdyaXRlQm9keShub2RlLmZpbmFsaXplcik7CiAgfQoKICB2aXNpdFlpZWxkU3RhdGVtZW50KFlpZWxkU3RhdGVtZW50IG5vZGUpIHsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIGlmIChub2RlLmlzWWllbGRTdGFyKSB7CiAgICAgIHdyaXRlV29yZCgneWllbGQqJyk7CiAgICB9IGVsc2UgaWYgKG5vZGUuaXNOYXRpdmUpIHsKICAgICAgd3JpdGVXb3JkKCdbeWllbGRdJyk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZVdvcmQoJ3lpZWxkJyk7CiAgICB9CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKTsKICAgIGVuZExpbmUoJzsnKTsKICB9CgogIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbihub2RlLCB1c2VWYXJLZXl3b3JkOiB0cnVlKTsKICAgIGVuZExpbmUoJzsnKTsKICB9CgogIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpIHsKICAgIHdyaXRlQW5ub3RhdGlvbkxpc3Qobm9kZS52YXJpYWJsZS5hbm5vdGF0aW9ucyk7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZVdvcmQoJ2Z1bmN0aW9uJyk7CiAgICBpZiAobm9kZS5mdW5jdGlvbiAhPSBudWxsKSB7CiAgICAgIHdyaXRlRnVuY3Rpb24obm9kZS5mdW5jdGlvbiwgbmFtZTogZ2V0VmFyaWFibGVOYW1lKG5vZGUudmFyaWFibGUpKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlV29yZChnZXRWYXJpYWJsZU5hbWUobm9kZS52YXJpYWJsZSkpOwogICAgICBlbmRMaW5lKCcuLi47Jyk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbihWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUsCiAgICAgIHtib29sIHVzZVZhcktleXdvcmQ6IGZhbHNlfSkgewogICAgaWYgKHNob3dPZmZzZXRzKSB3cml0ZVdvcmQoIlske25vZGUuZmlsZU9mZnNldH1dIik7CiAgICBpZiAoc2hvd01ldGFkYXRhKSB3cml0ZU1ldGFkYXRhKG5vZGUpOwogICAgd3JpdGVBbm5vdGF0aW9uTGlzdChub2RlLmFubm90YXRpb25zLCBzZXBhcmF0ZUxpbmVzOiBmYWxzZSk7CiAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaXNDb3ZhcmlhbnQsICdjb3ZhcmlhbnQnKTsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsLCAnZ2VuZXJpYy1jb3ZhcmlhbnQtaW1wbCcpOwogICAgd3JpdGVNb2RpZmllcihub2RlLmlzRmluYWwsICdmaW5hbCcpOwogICAgd3JpdGVNb2RpZmllcihub2RlLmlzQ29uc3QsICdjb25zdCcpOwogICAgaWYgKG5vZGUudHlwZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlQW5ub3RhdGVkVHlwZShub2RlLnR5cGUsIGFubm90YXRvcj8uYW5ub3RhdGVWYXJpYWJsZSh0aGlzLCBub2RlKSk7CiAgICB9CiAgICBpZiAodXNlVmFyS2V5d29yZCAmJiAhbm9kZS5pc0ZpbmFsICYmICFub2RlLmlzQ29uc3QgJiYgbm9kZS50eXBlID09IG51bGwpIHsKICAgICAgd3JpdGVXb3JkKCd2YXInKTsKICAgIH0KICAgIHdyaXRlV29yZChnZXRWYXJpYWJsZU5hbWUobm9kZSkpOwogICAgaWYgKG5vZGUuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICB3cml0ZVNwYWNlZCgnPScpOwogICAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5pbml0aWFsaXplcik7CiAgICB9CiAgfQoKICB2aXNpdEFyZ3VtZW50cyhBcmd1bWVudHMgbm9kZSkgewogICAgaWYgKG5vZGUudHlwZXMuaXNOb3RFbXB0eSkgewogICAgICB3cml0ZVN5bWJvbCgnPCcpOwogICAgICB3cml0ZUxpc3Qobm9kZS50eXBlcywgd3JpdGVUeXBlKTsKICAgICAgd3JpdGVTeW1ib2woJz4nKTsKICAgIH0KICAgIHdyaXRlU3ltYm9sKCcoJyk7CiAgICB2YXIgYWxsQXJncyA9CiAgICAgICAgPExpc3Q8VHJlZU5vZGU+Pltub2RlLnBvc2l0aW9uYWwsIG5vZGUubmFtZWRdLmV4cGFuZCgoeCkgPT4geCk7CiAgICB3cml0ZUxpc3QoYWxsQXJncywgd3JpdGVOb2RlKTsKICAgIHdyaXRlU3ltYm9sKCcpJyk7CiAgfQoKICB2aXNpdE5hbWVkRXhwcmVzc2lvbihOYW1lZEV4cHJlc3Npb24gbm9kZSkgewogICAgd3JpdGVXb3JkKG5vZGUubmFtZSk7CiAgICB3cml0ZUNvbW1hKCc6Jyk7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS52YWx1ZSk7CiAgfQoKICBkZWZhdWx0U3RhdGVtZW50KFN0YXRlbWVudCBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICBlbmRMaW5lKCcke25vZGUucnVudGltZVR5cGV9Jyk7CiAgfQoKICB2aXNpdEludmFsaWRJbml0aWFsaXplcihJbnZhbGlkSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgd3JpdGVXb3JkKCdpbnZhbGlkLWluaXRpYWxpemVyJyk7CiAgfQoKICB2aXNpdEZpZWxkSW5pdGlhbGl6ZXIoRmllbGRJbml0aWFsaXplciBub2RlKSB7CiAgICB3cml0ZU1lbWJlclJlZmVyZW5jZUZyb21SZWZlcmVuY2Uobm9kZS5maWVsZFJlZmVyZW5jZSk7CiAgICB3cml0ZVNwYWNlZCgnPScpOwogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUudmFsdWUpOwogIH0KCiAgdmlzaXRTdXBlckluaXRpYWxpemVyKFN1cGVySW5pdGlhbGl6ZXIgbm9kZSkgewogICAgd3JpdGVXb3JkKCdzdXBlcicpOwogICAgd3JpdGVNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKG5vZGUudGFyZ2V0UmVmZXJlbmNlKTsKICAgIHdyaXRlTm9kZShub2RlLmFyZ3VtZW50cyk7CiAgfQoKICB2aXNpdFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIoUmVkaXJlY3RpbmdJbml0aWFsaXplciBub2RlKSB7CiAgICB3cml0ZVdvcmQoJ3RoaXMnKTsKICAgIHdyaXRlTWVtYmVyUmVmZXJlbmNlRnJvbVJlZmVyZW5jZShub2RlLnRhcmdldFJlZmVyZW5jZSk7CiAgICB3cml0ZU5vZGUobm9kZS5hcmd1bWVudHMpOwogIH0KCiAgdmlzaXRMb2NhbEluaXRpYWxpemVyKExvY2FsSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUudmFyaWFibGUpOwogIH0KCiAgdmlzaXRBc3NlcnRJbml0aWFsaXplcihBc3NlcnRJbml0aWFsaXplciBub2RlKSB7CiAgICB2aXNpdEFzc2VydFN0YXRlbWVudChub2RlLnN0YXRlbWVudCwgYXNFeHByZXNzaW9uOiB0cnVlKTsKICB9CgogIGRlZmF1bHRJbml0aWFsaXplcihJbml0aWFsaXplciBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICBlbmRMaW5lKCc6ICR7bm9kZS5ydW50aW1lVHlwZX0nKTsKICB9CgogIHZpc2l0SW52YWxpZFR5cGUoSW52YWxpZFR5cGUgbm9kZSkgewogICAgd3JpdGVXb3JkKCdpbnZhbGlkLXR5cGUnKTsKICB9CgogIHZpc2l0RHluYW1pY1R5cGUoRHluYW1pY1R5cGUgbm9kZSkgewogICAgd3JpdGVXb3JkKCdkeW5hbWljJyk7CiAgfQoKICB2aXNpdFZvaWRUeXBlKFZvaWRUeXBlIG5vZGUpIHsKICAgIHdyaXRlV29yZCgndm9pZCcpOwogIH0KCiAgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgbm9kZSkgewogICAgd3JpdGVDbGFzc1JlZmVyZW5jZUZyb21SZWZlcmVuY2Uobm9kZS5jbGFzc05hbWUpOwogICAgaWYgKG5vZGUudHlwZUFyZ3VtZW50cy5pc05vdEVtcHR5KSB7CiAgICAgIHdyaXRlU3ltYm9sKCc8Jyk7CiAgICAgIHdyaXRlTGlzdChub2RlLnR5cGVBcmd1bWVudHMsIHdyaXRlVHlwZSk7CiAgICAgIHdyaXRlU3ltYm9sKCc+Jyk7CiAgICAgIHN0YXRlID0gV09SRDsgLy8gRGlzYWxsb3cgYSB3b3JkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSAnPicuCiAgICB9CiAgfQoKICB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSkgewogICAgd3JpdGVGdW5jdGlvblR5cGUobm9kZSk7CiAgfQoKICB2aXNpdE5hbWVkVHlwZShOYW1lZFR5cGUgbm9kZSkgewogICAgd3JpdGVXb3JkKG5vZGUubmFtZSk7CiAgICB3cml0ZVN5bWJvbCgnOicpOwogICAgd3JpdGVTcGFjZSgpOwogICAgd3JpdGVUeXBlKG5vZGUudHlwZSk7CiAgfQoKICB2aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKFR5cGVQYXJhbWV0ZXJUeXBlIG5vZGUpIHsKICAgIHdyaXRlVHlwZVBhcmFtZXRlclJlZmVyZW5jZShub2RlLnBhcmFtZXRlcik7CiAgICBpZiAobm9kZS5wcm9tb3RlZEJvdW5kICE9IG51bGwpIHsKICAgICAgd3JpdGVTcGFjZSgpOwogICAgICB3cml0ZVdvcmQoJ2V4dGVuZHMnKTsKICAgICAgd3JpdGVTcGFjZSgpOwogICAgICB3cml0ZVR5cGUobm9kZS5wcm9tb3RlZEJvdW5kKTsKICAgIH0KICB9CgogIHZpc2l0VHlwZVBhcmFtZXRlcihUeXBlUGFyYW1ldGVyIG5vZGUpIHsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsLCAnZ2VuZXJpYy1jb3ZhcmlhbnQtaW1wbCcpOwogICAgd3JpdGVBbm5vdGF0aW9uTGlzdChub2RlLmFubm90YXRpb25zLCBzZXBhcmF0ZUxpbmVzOiBmYWxzZSk7CiAgICB3cml0ZVdvcmQoZ2V0VHlwZVBhcmFtZXRlck5hbWUobm9kZSkpOwogICAgd3JpdGVTcGFjZWQoJ2V4dGVuZHMnKTsKICAgIHdyaXRlVHlwZShub2RlLmJvdW5kKTsKICAgIGlmIChub2RlLmRlZmF1bHRUeXBlICE9IG51bGwpIHsKICAgICAgd3JpdGVTcGFjZWQoJz0nKTsKICAgICAgd3JpdGVUeXBlKG5vZGUuZGVmYXVsdFR5cGUpOwogICAgfQogIH0KCiAgdmlzaXRDb25zdGFudEV4cHJlc3Npb24oQ29uc3RhbnRFeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlV29yZChzeW50aGV0aWNOYW1lcy5uYW1lQ29uc3RhbnQobm9kZS5jb25zdGFudCkpOwogIH0KCiAgZGVmYXVsdENvbnN0YW50KENvbnN0YW50IG5vZGUpIHsKICAgIGZpbmFsIFN0cmluZyBuYW1lID0gc3ludGhldGljTmFtZXMubmFtZUNvbnN0YW50KG5vZGUpOwogICAgZW5kTGluZSgnICAkbmFtZSA9ICRub2RlJyk7CiAgfQoKICB2aXNpdExpc3RDb25zdGFudChMaXN0Q29uc3RhbnQgbm9kZSkgewogICAgZmluYWwgU3RyaW5nIG5hbWUgPSBzeW50aGV0aWNOYW1lcy5uYW1lQ29uc3RhbnQobm9kZSk7CiAgICB3cml0ZSgnICAkbmFtZSA9ICcpOwogICAgZmluYWwgU3RyaW5nIGVudHJpZXMgPSBub2RlLmVudHJpZXMubWFwKChDb25zdGFudCBjb25zdGFudCkgewogICAgICByZXR1cm4gc3ludGhldGljTmFtZXMubmFtZUNvbnN0YW50KGNvbnN0YW50KTsKICAgIH0pLmpvaW4oJywgJyk7CiAgICBlbmRMaW5lKCcke25vZGUucnVudGltZVR5cGV9PCR7bm9kZS50eXBlQXJndW1lbnR9PigkZW50cmllcyknKTsKICB9CgogIHZpc2l0U2V0Q29uc3RhbnQoU2V0Q29uc3RhbnQgbm9kZSkgewogICAgZmluYWwgU3RyaW5nIG5hbWUgPSBzeW50aGV0aWNOYW1lcy5uYW1lQ29uc3RhbnQobm9kZSk7CiAgICB3cml0ZSgnICAkbmFtZSA9ICcpOwogICAgZmluYWwgU3RyaW5nIGVudHJpZXMgPSBub2RlLmVudHJpZXMubWFwKChDb25zdGFudCBjb25zdGFudCkgewogICAgICByZXR1cm4gc3ludGhldGljTmFtZXMubmFtZUNvbnN0YW50KGNvbnN0YW50KTsKICAgIH0pLmpvaW4oJywgJyk7CiAgICBlbmRMaW5lKCcke25vZGUucnVudGltZVR5cGV9PCR7bm9kZS50eXBlQXJndW1lbnR9PigkZW50cmllcyknKTsKICB9CgogIHZpc2l0TWFwQ29uc3RhbnQoTWFwQ29uc3RhbnQgbm9kZSkgewogICAgZmluYWwgU3RyaW5nIG5hbWUgPSBzeW50aGV0aWNOYW1lcy5uYW1lQ29uc3RhbnQobm9kZSk7CiAgICB3cml0ZSgnICAkbmFtZSA9ICcpOwogICAgZmluYWwgU3RyaW5nIGVudHJpZXMgPSBub2RlLmVudHJpZXMubWFwKChDb25zdGFudE1hcEVudHJ5IGVudHJ5KSB7CiAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSBzeW50aGV0aWNOYW1lcy5uYW1lQ29uc3RhbnQoZW50cnkua2V5KTsKICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gc3ludGhldGljTmFtZXMubmFtZUNvbnN0YW50KGVudHJ5LnZhbHVlKTsKICAgICAgcmV0dXJuICcka2V5OiAkdmFsdWUnOwogICAgfSkuam9pbignLCAnKTsKICAgIGVuZExpbmUoCiAgICAgICAgJyR7bm9kZS5ydW50aW1lVHlwZX08JHtub2RlLmtleVR5cGV9LCAke25vZGUudmFsdWVUeXBlfT4oJGVudHJpZXMpJyk7CiAgfQoKICB2aXNpdEluc3RhbmNlQ29uc3RhbnQoSW5zdGFuY2VDb25zdGFudCBub2RlKSB7CiAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IHN5bnRoZXRpY05hbWVzLm5hbWVDb25zdGFudChub2RlKTsKICAgIHdyaXRlKCcgICRuYW1lID0gJyk7CiAgICBmaW5hbCBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCcke25vZGUuY2xhc3NOb2RlfScpOwogICAgaWYgKCFub2RlLmNsYXNzTm9kZS50eXBlUGFyYW1ldGVycy5pc0VtcHR5KSB7CiAgICAgIHNiLndyaXRlKCc8Jyk7CiAgICAgIHNiLndyaXRlKG5vZGUudHlwZUFyZ3VtZW50cy5tYXAoKHR5cGUpID0+IHR5cGUudG9TdHJpbmcoKSkuam9pbignLCAnKSk7CiAgICAgIHNiLndyaXRlKCc+Jyk7CiAgICB9CiAgICBzYi53cml0ZSgnIHsnKTsKICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgbm9kZS5maWVsZFZhbHVlcy5mb3JFYWNoKChSZWZlcmVuY2UgZmllbGRSZWYsIENvbnN0YW50IGNvbnN0YW50KSB7CiAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gc3ludGhldGljTmFtZXMubmFtZUNvbnN0YW50KGNvbnN0YW50KTsKICAgICAgaWYgKCFmaXJzdCkgewogICAgICAgIHNiLndyaXRlKCcsICcpOwogICAgICB9CiAgICAgIHNiLndyaXRlKCcke2ZpZWxkUmVmLmFzRmllbGQubmFtZX06ICRuYW1lJyk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICB9KTsKICAgIHNiLndyaXRlKCd9Jyk7CiAgICBlbmRMaW5lKHNiLnRvU3RyaW5nKCkpOwogIH0KCiAgdmlzaXRTdHJpbmdDb25zdGFudChTdHJpbmdDb25zdGFudCBub2RlKSB7CiAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IHN5bnRoZXRpY05hbWVzLm5hbWVDb25zdGFudChub2RlKTsKICAgIGVuZExpbmUoJyAgJG5hbWUgPSAiJHtlc2NhcGVTdHJpbmcobm9kZS52YWx1ZSl9IicpOwogIH0KCiAgdmlzaXRVbmV2YWx1YXRlZENvbnN0YW50KFVuZXZhbHVhdGVkQ29uc3RhbnQgbm9kZSkgewogICAgZmluYWwgU3RyaW5nIG5hbWUgPSBzeW50aGV0aWNOYW1lcy5uYW1lQ29uc3RhbnQobm9kZSk7CiAgICB3cml0ZSgnICAkbmFtZSA9ICgnKTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb24pOwogICAgZW5kTGluZSgnKScpOwogIH0KCiAgZGVmYXVsdE5vZGUoTm9kZSBub2RlKSB7CiAgICB3cml0ZSgnPCR7bm9kZS5ydW50aW1lVHlwZX0+Jyk7CiAgfQp9CgpjbGFzcyBQcmVjZWRlbmNlIGV4dGVuZHMgRXhwcmVzc2lvblZpc2l0b3I8aW50PiB7CiAgc3RhdGljIGZpbmFsIFByZWNlZGVuY2UgaW5zdGFuY2UgPSBuZXcgUHJlY2VkZW5jZSgpOwoKICBzdGF0aWMgaW50IG9mKEV4cHJlc3Npb24gbm9kZSkgPT4gbm9kZS5hY2NlcHQoaW5zdGFuY2UpOwoKICBzdGF0aWMgY29uc3QgaW50IEVYUFJFU1NJT04gPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgQ09ORElUSU9OQUwgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgTE9HSUNBTF9OVUxMX0FXQVJFID0gMzsKICBzdGF0aWMgY29uc3QgaW50IExPR0lDQUxfT1IgPSA0OwogIHN0YXRpYyBjb25zdCBpbnQgTE9HSUNBTF9BTkQgPSA1OwogIHN0YXRpYyBjb25zdCBpbnQgRVFVQUxJVFkgPSA2OwogIHN0YXRpYyBjb25zdCBpbnQgUkVMQVRJT05BTCA9IDc7CiAgc3RhdGljIGNvbnN0IGludCBCSVRXSVNFX09SID0gODsKICBzdGF0aWMgY29uc3QgaW50IEJJVFdJU0VfWE9SID0gOTsKICBzdGF0aWMgY29uc3QgaW50IEJJVFdJU0VfQU5EID0gMTA7CiAgc3RhdGljIGNvbnN0IGludCBTSElGVCA9IDExOwogIHN0YXRpYyBjb25zdCBpbnQgQURESVRJVkUgPSAxMjsKICBzdGF0aWMgY29uc3QgaW50IE1VTFRJUExJQ0FUSVZFID0gMTM7CiAgc3RhdGljIGNvbnN0IGludCBQUkVGSVggPSAxNDsKICBzdGF0aWMgY29uc3QgaW50IFBPU1RGSVggPSAxNTsKICBzdGF0aWMgY29uc3QgaW50IFRZUEVfTElURVJBTCA9IDE5OwogIHN0YXRpYyBjb25zdCBpbnQgUFJJTUFSWSA9IDIwOwogIHN0YXRpYyBjb25zdCBpbnQgQ0FMTEVFID0gMjE7CgogIHN0YXRpYyBjb25zdCBNYXA8U3RyaW5nLCBpbnQ+IGJpbmFyeVByZWNlZGVuY2UgPSBjb25zdCB7CiAgICAnJiYnOiBMT0dJQ0FMX0FORCwKICAgICd8fCc6IExPR0lDQUxfT1IsCiAgICAnPz8nOiBMT0dJQ0FMX05VTExfQVdBUkUsCiAgICAnPT0nOiBFUVVBTElUWSwKICAgICchPSc6IEVRVUFMSVRZLAogICAgJz4nOiBSRUxBVElPTkFMLAogICAgJz49JzogUkVMQVRJT05BTCwKICAgICc8JzogUkVMQVRJT05BTCwKICAgICc8PSc6IFJFTEFUSU9OQUwsCiAgICAnfCc6IEJJVFdJU0VfT1IsCiAgICAnXic6IEJJVFdJU0VfWE9SLAogICAgJyYnOiBCSVRXSVNFX0FORCwKICAgICc+Pic6IFNISUZULAogICAgJzw8JzogU0hJRlQsCiAgICAnKyc6IEFERElUSVZFLAogICAgJy0nOiBBRERJVElWRSwKICAgICcqJzogTVVMVElQTElDQVRJVkUsCiAgICAnJSc6IE1VTFRJUExJQ0FUSVZFLAogICAgJy8nOiBNVUxUSVBMSUNBVElWRSwKICAgICd+Lyc6IE1VTFRJUExJQ0FUSVZFLAogICAgbnVsbDogRVhQUkVTU0lPTiwKICB9OwoKICBzdGF0aWMgYm9vbCBpc0Fzc29jaWF0aXZlQmluYXJ5T3BlcmF0b3IoaW50IHByZWNlZGVuY2UpIHsKICAgIHJldHVybiBwcmVjZWRlbmNlICE9IEVRVUFMSVRZICYmIHByZWNlZGVuY2UgIT0gUkVMQVRJT05BTDsKICB9CgogIGludCBkZWZhdWx0RXhwcmVzc2lvbihFeHByZXNzaW9uIG5vZGUpID0+IEVYUFJFU1NJT047CiAgaW50IHZpc2l0SW52YWxpZEV4cHJlc3Npb24oSW52YWxpZEV4cHJlc3Npb24gbm9kZSkgPT4gQ0FMTEVFOwogIGludCB2aXNpdE1ldGhvZEludm9jYXRpb24oTWV0aG9kSW52b2NhdGlvbiBub2RlKSA9PiBDQUxMRUU7CiAgaW50IHZpc2l0U3VwZXJNZXRob2RJbnZvY2F0aW9uKFN1cGVyTWV0aG9kSW52b2NhdGlvbiBub2RlKSA9PiBDQUxMRUU7CiAgaW50IHZpc2l0RGlyZWN0TWV0aG9kSW52b2NhdGlvbihEaXJlY3RNZXRob2RJbnZvY2F0aW9uIG5vZGUpID0+IENBTExFRTsKICBpbnQgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKFN0YXRpY0ludm9jYXRpb24gbm9kZSkgPT4gQ0FMTEVFOwogIGludCB2aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgPT4gQ0FMTEVFOwogIGludCB2aXNpdE5vdChOb3Qgbm9kZSkgPT4gUFJFRklYOwogIGludCB2aXNpdExvZ2ljYWxFeHByZXNzaW9uKExvZ2ljYWxFeHByZXNzaW9uIG5vZGUpID0+CiAgICAgIGJpbmFyeVByZWNlZGVuY2Vbbm9kZS5vcGVyYXRvcl07CiAgaW50IHZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uKENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSA9PiBDT05ESVRJT05BTDsKICBpbnQgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKFN0cmluZ0NvbmNhdGVuYXRpb24gbm9kZSkgPT4gUFJJTUFSWTsKICBpbnQgdmlzaXRJc0V4cHJlc3Npb24oSXNFeHByZXNzaW9uIG5vZGUpID0+IFJFTEFUSU9OQUw7CiAgaW50IHZpc2l0QXNFeHByZXNzaW9uKEFzRXhwcmVzc2lvbiBub2RlKSA9PiBSRUxBVElPTkFMOwogIGludCB2aXNpdFN5bWJvbExpdGVyYWwoU3ltYm9sTGl0ZXJhbCBub2RlKSA9PiBQUklNQVJZOwogIGludCB2aXNpdFR5cGVMaXRlcmFsKFR5cGVMaXRlcmFsIG5vZGUpID0+IFBSSU1BUlk7CiAgaW50IHZpc2l0VGhpc0V4cHJlc3Npb24oVGhpc0V4cHJlc3Npb24gbm9kZSkgPT4gQ0FMTEVFOwogIGludCB2aXNpdFJldGhyb3coUmV0aHJvdyBub2RlKSA9PiBQUklNQVJZOwogIGludCB2aXNpdFRocm93KFRocm93IG5vZGUpID0+IEVYUFJFU1NJT047CiAgaW50IHZpc2l0TGlzdExpdGVyYWwoTGlzdExpdGVyYWwgbm9kZSkgPT4gUFJJTUFSWTsKICBpbnQgdmlzaXRTZXRMaXRlcmFsKFNldExpdGVyYWwgbm9kZSkgPT4gUFJJTUFSWTsKICBpbnQgdmlzaXRNYXBMaXRlcmFsKE1hcExpdGVyYWwgbm9kZSkgPT4gUFJJTUFSWTsKICBpbnQgdmlzaXRBd2FpdEV4cHJlc3Npb24oQXdhaXRFeHByZXNzaW9uIG5vZGUpID0+IFBSRUZJWDsKICBpbnQgdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oRnVuY3Rpb25FeHByZXNzaW9uIG5vZGUpID0+IEVYUFJFU1NJT047CiAgaW50IHZpc2l0U3RyaW5nTGl0ZXJhbChTdHJpbmdMaXRlcmFsIG5vZGUpID0+IENBTExFRTsKICBpbnQgdmlzaXRJbnRMaXRlcmFsKEludExpdGVyYWwgbm9kZSkgPT4gQ0FMTEVFOwogIGludCB2aXNpdERvdWJsZUxpdGVyYWwoRG91YmxlTGl0ZXJhbCBub2RlKSA9PiBDQUxMRUU7CiAgaW50IHZpc2l0Qm9vbExpdGVyYWwoQm9vbExpdGVyYWwgbm9kZSkgPT4gQ0FMTEVFOwogIGludCB2aXNpdE51bGxMaXRlcmFsKE51bGxMaXRlcmFsIG5vZGUpID0+IENBTExFRTsKICBpbnQgdmlzaXRWYXJpYWJsZUdldChWYXJpYWJsZUdldCBub2RlKSA9PiBQUklNQVJZOwogIGludCB2aXNpdFZhcmlhYmxlU2V0KFZhcmlhYmxlU2V0IG5vZGUpID0+IEVYUFJFU1NJT047CiAgaW50IHZpc2l0UHJvcGVydHlHZXQoUHJvcGVydHlHZXQgbm9kZSkgPT4gUFJJTUFSWTsKICBpbnQgdmlzaXRQcm9wZXJ0eVNldChQcm9wZXJ0eVNldCBub2RlKSA9PiBFWFBSRVNTSU9OOwogIGludCB2aXNpdFN1cGVyUHJvcGVydHlHZXQoU3VwZXJQcm9wZXJ0eUdldCBub2RlKSA9PiBQUklNQVJZOwogIGludCB2aXNpdFN1cGVyUHJvcGVydHlTZXQoU3VwZXJQcm9wZXJ0eVNldCBub2RlKSA9PiBFWFBSRVNTSU9OOwogIGludCB2aXNpdERpcmVjdFByb3BlcnR5R2V0KERpcmVjdFByb3BlcnR5R2V0IG5vZGUpID0+IFBSSU1BUlk7CiAgaW50IHZpc2l0RGlyZWN0UHJvcGVydHlTZXQoRGlyZWN0UHJvcGVydHlTZXQgbm9kZSkgPT4gRVhQUkVTU0lPTjsKICBpbnQgdmlzaXRTdGF0aWNHZXQoU3RhdGljR2V0IG5vZGUpID0+IFBSSU1BUlk7CiAgaW50IHZpc2l0U3RhdGljU2V0KFN0YXRpY1NldCBub2RlKSA9PiBFWFBSRVNTSU9OOwogIGludCB2aXNpdExldChMZXQgbm9kZSkgPT4gRVhQUkVTU0lPTjsKfQoKU3RyaW5nIHByb2NlZHVyZUtpbmRUb1N0cmluZyhQcm9jZWR1cmVLaW5kIGtpbmQpIHsKICBzd2l0Y2ggKGtpbmQpIHsKICAgIGNhc2UgUHJvY2VkdXJlS2luZC5NZXRob2Q6CiAgICAgIHJldHVybiAnbWV0aG9kJzsKICAgIGNhc2UgUHJvY2VkdXJlS2luZC5HZXR0ZXI6CiAgICAgIHJldHVybiAnZ2V0JzsKICAgIGNhc2UgUHJvY2VkdXJlS2luZC5TZXR0ZXI6CiAgICAgIHJldHVybiAnc2V0JzsKICAgIGNhc2UgUHJvY2VkdXJlS2luZC5PcGVyYXRvcjoKICAgICAgcmV0dXJuICdvcGVyYXRvcic7CiAgICBjYXNlIFByb2NlZHVyZUtpbmQuRmFjdG9yeToKICAgICAgcmV0dXJuICdmYWN0b3J5JzsKICB9CiAgdGhyb3cgJ2lsbGVnYWwgUHJvY2VkdXJlS2luZDogJGtpbmQnOwp9CgpjbGFzcyBFeHByZXNzaW9uUHJpbnRlciB7CiAgZmluYWwgUHJpbnRlciB3cml0ZWVyOwogIGZpbmFsIGludCBtaW5pbXVtUHJlY2VkZW5jZTsKCiAgRXhwcmVzc2lvblByaW50ZXIodGhpcy53cml0ZWVyLCB0aGlzLm1pbmltdW1QcmVjZWRlbmNlKTsKfQqIkQBOTjwcASIBIQEWHwEaESwBTAEVAgEoFxwCAUoXHgEmJjUkBiQEATAXBAIBHC8vMwE+Eyg8ETINCCAGARgkKSoGGCQpKgYhBAIBNAEoFg89AgEkFg87AgEtUAIBJkMCAS8lOg8fCzUPHwQCATREAgE9HjIPJgQfMw8mBCcCAUA/AgEmLE0UAgErLDghFAIBEy8yP0FFLixCPTs1AUU0MjhJO0c6ATQBO08NNT8kLyIwJkIKJQgSCAQBRx8yNUApJzUaLAomQgolCBIIBAExASctFSYGGyMGEQQCARtGPTUCAS4mIxkdOhsXEhUUFQEYFxkVARUiGR8gGBYWQgEvOh0iHCgeJCIlBAEkEgQBJCIBKDoEAS0tSTUGIQQBJDgEASkrJkEeBAEtLUElBAEtOwEkMS02BAErLCwgOSINQyAGBAE1OwQBOjkiBAE0QAQBOTMuRz4fJzkiDTQGBAE1TAQBSSwVFBUUFSk2SUgxFzEuHAotCAYEASsuGiAfBhIBQlAvNgQBPTU3HhVNLA9ANQgGBAE0QxsmOAEiPAYBNw8tNCYpKCcrBAFDKyQZNRUZDxUIIRs1RyoiNUcvJjVHLyQ1Ryo0Mw89CBQGAQ8EATE/OhcWRxIYJgYnLyAdFAofCBomCDAcIiEIJx0tCD4ZGRUbATIbFAYjBAExNj86HRMZITkhBhkSBAElIAQBHhgdBAErExMEARcmBAEkExQEASQTExIEASsTEgQBIiAaExIEAR4ZFAYEARwkBAEeGB0NLxceCAEtKwguHQgBGQEXHAgGBAEmGBkGBAEmHCgvJDUKCAYEAT4VHhIZFAYEASIYHg0ZBgQBKhgZBgQBIxgfDTgrGjIaCAYEASctKRgwGAYEATITFwYEAR4cIg1FBgQBIhoVBhETEAQBLEoaFx8XDRwGNVAqFUk7ERUaFyoVBjRABjg8JEQZBiFGIBQGBAE1Fh0XIRgeGCIZJRsPMgYEAUc0FRkUGxMIIBUUFSoVGhgUGxMIPBkoDRcGBAEnNDEZFQYxFjsBJiU+HkIIBiA5HkIIBgE8RSUNSgYBOy0WCBg+RycPTAgYBisyFggYOTsPOQgYBhYWIAQBIxkVFSoVGhQNERUXFQYEATseFioEAUQoFioWRQQBQEUWD0w2KBYIGBFOGAYcIxYIGDIYBhYEATshFx4TFw8fCBYGBAE/OgQBPzBNKT4zBAFAOwQBQDFPKT4zBAE2LjkBJyc9Ph8GASY1ATg9AShBARgnLQ0rBgE9JAQBNDEEAT4xFSAGLxUeBgQBOTAEAUMtFRwGOCJQHhgGFRsYBhUaBgQBKhYpPyYNHQYEAVElGxwIHRsTDxYIBgQBIAEbKxgsMkoqKkocGTk5DT0aOw8/CAYYEkkkJBgpBig+KDwvBhIEASMrGDAsMD1GTTEoPig8LwY9BAEnKxgwKjIeITsEAUsrGDAqJgEdHAYxSCYWPSkYMBgGEgQBGysYMBgjMSMYJhsoKR4mBiwhOAYeOTMGHBMkKig8ExgSBAEfKxgaGjEWJSM4Lw0cBhIEATMlIDQGBAExOBZEHwQBPTgYPRYfBAE7GBZEHwQBMSo9HwQBOy89HwQBFxY2BAEzQSwgMQQBOzwTECYSIBYlBAEtGA4WDxYPFg8WDxYPFg8WDxYPLzYRFwoGBAEnGS5EHz0hDyIIBjgEATcZFAYQKSMvDxwfGggGEBIEATMXKiQdFQYEATEXKSQdFQYEATEXKSQdFQYEATEgKRgwGAYRF0YUFggrHhUINBQWCBgqJRYqCBIGARAEASk6FxoEASk6PBoEASsWGwQBJxoEAS0XBAEfGgQBGxgSJgQBJxgaFAYlGCQYBhYsFgQBJRgaFAYlGCQYBhYsFgQBJRgaFAYgGDwYBhYoFgQBIR8VIQQBLxgjBAE1OAQBKzAEASUgBAErIAQBJyAEAScXBAEXFi0XIAQBLxo+GCEEASsmFi4WBAEnHhYhFhIEATknFiEWEgQBJysYFx0SBAEzGDQTNzUNSwYfGx0GHRccBhIEAScmBAEnKyUYJBgUBgQBJysWIQQBOxoYMRgNFwYEASgYGBcYBgQBJzgWRAQBJzgWRBYhBAExGBZEBAExGBZEFiEEATM4GD0WBAEzOBg9FhYhBAEjPQQBIz0WIQQBNxgmEgQBUR44DgYSEyMTGDQEARsYJQQBJxgbJQQBLRgSBAFMGRoGGRYlIBQlBhkVDRgGBAExGDoSGgQBLRgYQRIEAS0YGhYlFhoEAScYFRoYGhYlEgQBKRgYFjkVIicGFS4WGgQBLRgYHAYYFkIXJBYaBAEvGBkWJhQTIxMYEgQBJTgYFhIvGhkjFAYaGhwUBhMaEwQBPxgbOxIEAScYFRYlFhoiGhkhBgQBLxgZIxQoBhIEASEYFholBAEbGB4XHRQGGBYiMA0lBiMUMQYWGgQBJRgWGhgaHwQBLRgcGyAcDRoGJhIEATcYORIEATc0GBshSg0xFwYEATolOCtBMkoqKh1OBlAYBiYkGCkGBAEjIRgoGAYWEkgjFgQBLxoVIQQBJRgkBAE1JgQBMTwWIQQBMRg9HwQBPRc9HwQBMS0EATM+BAEpGCYEAScfBAEnGgQBIRcEASs2KRgwGEIGBAEpHQQBIxoWEhoEATMxJhQcFCUGBAErSkErHBskGCMGBAE1OwQBIzsgBAEpOxlCNBNEBAEnOxlCNBNEBAEnOxlHQUUdEw1OBAExOxkjIzIVThUGFBdHQRQYCDMVCBMcBAEtOzgEATc7GiYSBAEbJAQCATI3ATsBIyQrIyQhIyMkJR8iKCAhJiEgATsXFh4UFBUWFRYVFhYRERMTGRkZGhYFATw/BAE4QD5ISj5IJDgnTUU6Ojk1Oi0sNTMzPEY4Mjg0NDU4NTg/QkFEMTQoAgEzEh8XHxQfFCEZIBgEKAIBGhkfATsCASRwYWNrYWdlOmtlcm5lbC90ZXh0L2FzdF90b190ZXh0LmRhcnQsc2Rrcm9vdDovcGtnL2tlcm5lbC9saWIvY2xhc3NfaGllcmFyY2h5LmRhcnTAAM4bLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KbGlicmFyeSBrZXJuZWwuY2xhc3NfaGllcmFyY2h5OwoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOwppbXBvcnQgJ2RhcnQ6bWF0aCc7CmltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKCmltcG9ydCAnYXN0LmRhcnQnOwppbXBvcnQgJ3NyYy9oZWFwLmRhcnQnOwppbXBvcnQgJ3R5cGVfYWxnZWJyYS5kYXJ0JzsKCnR5cGVkZWYgSGFuZGxlQW1iaWd1b3VzU3VwZXJ0eXBlcyA9IHZvaWQgRnVuY3Rpb24oQ2xhc3MsIFN1cGVydHlwZSwgU3VwZXJ0eXBlKTsKCmFic3RyYWN0IGNsYXNzIE1peGluSW5mZXJyZXIgewogIHZvaWQgaW5mZXIoQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5LCBDbGFzcyBjbGFzc05vZGUpOwp9CgovLy8gSW50ZXJmYWNlIGZvciBhbnN3ZXJpbmcgdmFyaW91cyBzdWJjbGFzc2luZyBxdWVyaWVzLgphYnN0cmFjdCBjbGFzcyBDbGFzc0hpZXJhcmNoeSB7CiAgZmFjdG9yeSBDbGFzc0hpZXJhcmNoeShDb21wb25lbnQgY29tcG9uZW50LAogICAgICB7SGFuZGxlQW1iaWd1b3VzU3VwZXJ0eXBlcyBvbkFtYmlndW91c1N1cGVydHlwZXMsCiAgICAgIE1peGluSW5mZXJyZXIgbWl4aW5JbmZlcnJlcn0pIHsKICAgIG9uQW1iaWd1b3VzU3VwZXJ0eXBlcyA/Pz0gKENsYXNzIGNscywgU3VwZXJ0eXBlIGEsIFN1cGVydHlwZSBiKSB7CiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMzIwOTEKICAgICAgdGhyb3cgIiRjbHMgY2FuJ3QgaW1wbGVtZW50IGJvdGggJGEgYW5kICRiIjsKICAgIH07CiAgICByZXR1cm4gbmV3IENsb3NlZFdvcmxkQ2xhc3NIaWVyYXJjaHkuX2ludGVybmFsKAogICAgICAgIG9uQW1iaWd1b3VzU3VwZXJ0eXBlcywgbWl4aW5JbmZlcnJlcikKICAgICAgLi5faW5pdGlhbGl6ZShjb21wb25lbnQubGlicmFyaWVzKTsKICB9CgogIHZvaWQgc2V0IG9uQW1iaWd1b3VzU3VwZXJ0eXBlcygKICAgICAgSGFuZGxlQW1iaWd1b3VzU3VwZXJ0eXBlcyBvbkFtYmlndW91c1N1cGVydHlwZXMpOwoKICB2b2lkIHNldCBtaXhpbkluZmVycmVyKE1peGluSW5mZXJyZXIgbWl4aW5JbmZlcnJlcik7CgogIC8vLyBHaXZlbiB0aGUgW3Vub3JkZXJlZF0gY2xhc3NlcywgcmV0dXJuIHRoZW0gaW4gc3VjaCBvcmRlciB0aGF0IGNsYXNzZXMKICAvLy8gb2NjdXIgYWZ0ZXIgdGhlaXIgc3VwZXJjbGFzc2VzLiAgSWYgc29tZSBzdXBlcmNsYXNzZXMgYXJlIG5vdCBpbgogIC8vLyBbdW5vcmRlcmVkXSwgdGhleSBhcmUgbm90IGluY2x1ZGVkLgogIEl0ZXJhYmxlPENsYXNzPiBnZXRPcmRlcmVkQ2xhc3NlcyhJdGVyYWJsZTxDbGFzcz4gdW5vcmRlcmVkKTsKCiAgLy8gUmV0dXJucyB0aGUgaW5zdGFudGl0aW9uIG9mIGVhY2ggZ2VuZXJpYyBzdXBlcnR5cGUgaW1wbGVtZW50ZWQgYnkgdGhpcwogIC8vIGNsYXNzIChlLmcuIGdldENsYXNzQXNJbnN0YW5jZU9mIGFwcGxpZWQgdG8gYWxsIHN1cGVyY2xhc3NlcyBhbmQKICAvLyBpbnRlcmZhY2VzKS4KICBMaXN0PFN1cGVydHlwZT4gZ2VuZXJpY1N1cGVydHlwZXNPZihDbGFzcyBjbGFzc18pOwoKICAvLy8gUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgb2YgdHdvIGludGVyZmFjZSB0eXBlcywgYXMgZGVmaW5lZCBieSBEYXJ0CiAgLy8vIDEuMC4KICAvLy8KICAvLy8gR2l2ZW4gdHdvIGludGVyZmFjZXMgSSBhbmQgSiwgbGV0IFNfSSBiZSB0aGUgc2V0IG9mIHN1cGVyaW50ZXJmYWNlcyBvZiBJLAogIC8vLyBsZXQgU19KIGJlIHRoZSBzZXQgb2Ygc3VwZXJpbnRlcmZhY2VzIG9mIEosIGFuZCBsZXQKICAvLy8gUyA9IChJIHVuaW9uIFNfSSkgaW50ZXJzZWN0IChKIHVuaW9uIFNfSikuICBGdXJ0aGVybW9yZSwgd2UgZGVmaW5lCiAgLy8vIFNfbiA9IHtUIHwgVCBpbiBTIGFuZCBkZXB0aChUKSA9IG59IGZvciBhbnkgZmluaXRlIG4gd2hlcmUgZGVwdGgoVCkgaXMKICAvLy8gdGhlIG51bWJlciBvZiBzdGVwcyBpbiB0aGUgbG9uZ2VzdCBpbmhlcml0YW5jZSBwYXRoIGZyb20gVCB0byBPYmplY3QuICBMZXQKICAvLy8gcSBiZSB0aGUgbGFyZ2VzdCBudW1iZXIgc3VjaCB0aGF0IFNfcSBoYXMgY2FyZGluYWxpdHkgb25lLiAgVGhlIGxlYXN0CiAgLy8vIHVwcGVyIGJvdW5kIG9mIEkgYW5kIEogaXMgdGhlIHNvbGUgZWxlbWVudCBvZiBTX3EuCiAgLy8vCiAgLy8vIFRoaXMgaXMgY2FsbGVkIHRoZSAibGVnYWN5IiBsZWFzdCB1cHBlciBib3VuZCB0byBkaXN0aW5ndWlzaCBpdCBmcm9tIHRoZQogIC8vLyBEYXJ0IDIgbGVhc3QgdXBwZXIgYm91bmQsIHdoaWNoIGhhcyBzcGVjaWFsIGJlaGF2aW9ycyBpbiB0aGUgY2FzZSB3aGVyZQogIC8vLyBvbmUgdHlwZSBpcyBhIHN1YnR5cGUgb2YgdGhlIG90aGVyLCBvciB3aGVyZSBib3RoIHR5cGVzIGFyZSBiYXNlZCBvbiB0aGUKICAvLy8gc2FtZSBjbGFzcy4KICBJbnRlcmZhY2VUeXBlIGdldExlZ2FjeUxlYXN0VXBwZXJCb3VuZCgKICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlMSwgSW50ZXJmYWNlVHlwZSB0eXBlMik7CgogIC8vLyBSZXR1cm5zIHRoZSBpbnN0YW50aWF0aW9uIG9mIFtzdXBlcmNsYXNzXSB0aGF0IGlzIGltcGxlbWVudGVkIGJ5IFtjbGFzc19dLAogIC8vLyBvciBgbnVsbGAgaWYgW2NsYXNzX10gZG9lcyBub3QgaW1wbGVtZW50IFtzdXBlcmNsYXNzXSBhdCBhbGwuCiAgU3VwZXJ0eXBlIGdldENsYXNzQXNJbnN0YW5jZU9mKENsYXNzIGNsYXNzXywgQ2xhc3Mgc3VwZXJjbGFzcyk7CgogIC8vLyBSZXR1cm5zIHRoZSBpbnN0YW50aWF0aW9uIG9mIFtzdXBlcmNsYXNzXSB0aGF0IGlzIGltcGxlbWVudGVkIGJ5IFt0eXBlXSwKICAvLy8gb3IgYG51bGxgIGlmIFt0eXBlXSBkb2VzIG5vdCBpbXBsZW1lbnQgW3N1cGVyY2xhc3NdIGF0IGFsbC4KICBJbnRlcmZhY2VUeXBlIGdldFR5cGVBc0luc3RhbmNlT2YoSW50ZXJmYWNlVHlwZSB0eXBlLCBDbGFzcyBzdXBlcmNsYXNzKTsKCiAgLy8vIFJldHVybnMgdGhlIGluc3RhbnRpYXRpb24gb2YgW3N1cGVyY2xhc3NdIHRoYXQgaXMgaW1wbGVtZW50ZWQgYnkgW3R5cGVdLAogIC8vLyBvciBgbnVsbGAgaWYgW3R5cGVdIGRvZXMgbm90IGltcGxlbWVudCBbc3VwZXJjbGFzc10uICBbc3VwZXJjbGFzc10gbXVzdAogIC8vLyBiZSBhIGdlbmVyaWMgY2xhc3MuCiAgU3VwZXJ0eXBlIGFzSW5zdGFudGlhdGlvbk9mKFN1cGVydHlwZSB0eXBlLCBDbGFzcyBzdXBlcmNsYXNzKTsKCiAgLy8vIFJldHVybnMgdGhlIGluc3RhbmNlIG1lbWJlciB0aGF0IHdvdWxkIHJlc3BvbmQgdG8gYSBkeW5hbWljIGRpc3BhdGNoIG9mCiAgLy8vIFtuYW1lXSB0byBhbiBpbnN0YW5jZSBvZiBbY2xhc3NfXSwgb3IgYG51bGxgIGlmIG5vIHN1Y2ggbWVtYmVyIGV4aXN0cy4KICAvLy8KICAvLy8gSWYgW3NldHRlcl0gaXMgYGZhbHNlYCwgdGhlIG5hbWUgaXMgZGlzcGF0Y2hlZCBhcyBhIGdldHRlciBvciBjYWxsLAogIC8vLyBhbmQgd2lsbCByZXR1cm4gYSBmaWVsZCwgZ2V0dGVyLCBtZXRob2QsIG9yIG9wZXJhdG9yIChvciBudWxsKS4KICAvLy8KICAvLy8gSWYgW3NldHRlcl0gaXMgYHRydWVgLCB0aGUgbmFtZSBpcyBkaXNwYXRjaGVkIGFzIGEgc2V0dGVyLCByb3VnaGx5CiAgLy8vIGNvcnJlc3BvbmRpbmcgdG8gYG5hbWU9YCBpbiB0aGUgRGFydCBzcGVjaWZpY2F0aW9uLCBidXQgbm90ZSB0aGF0IHRoZQogIC8vLyByZXR1cm5lZCBtZW1iZXIgd2lsbCBub3QgaGF2ZSBhIG5hbWUgZW5kaW5nIHdpdGggYD1gLiAgSW4gdGhpcyBjYXNlLAogIC8vLyBhIG5vbi1maW5hbCBmaWVsZCBvciBzZXR0ZXIgKG9yIG51bGwpIHdpbGwgYmUgcmV0dXJuZWQuCiAgLy8vCiAgLy8vIElmIHRoZSBjbGFzcyBpcyBhYnN0cmFjdCwgYWJzdHJhY3QgbWVtYmVycyBhcmUgaWdub3JlZCBhbmQgdGhlIGRpc3BhdGNoCiAgLy8vIGlzIHJlc29sdmVkIGlmIHRoZSBjbGFzcyB3YXMgbm90IGFic3RyYWN0LgogIE1lbWJlciBnZXREaXNwYXRjaFRhcmdldChDbGFzcyBjbGFzc18sIE5hbWUgbmFtZSwge2Jvb2wgc2V0dGVyOiBmYWxzZX0pOwoKICAvLy8gUmV0dXJucyB0aGUgbGlzdCBvZiBwb3RlbnRpYWwgdGFyZ2V0cyBvZiBkeW5hbWljIGRpc3BhdGNoIHRvIGFuIGluc3RhbmNlCiAgLy8vIG9mIFtjbGFzc19dLgogIC8vLwogIC8vLyBJZiBbc2V0dGVyc10gaXMgYGZhbHNlYCwgb25seSBwb3RlbnRpYWwgdGFyZ2V0cyBvZiBhIGdldHRlciBvciBjYWxsCiAgLy8vIGRpc3BhdGNoIGFyZSByZXR1cm5lZC4gIElmIFtzZXR0ZXJzXSBpcyBgdHJ1ZWAsIG9ubHkgcG90ZW50aWFsIHRhcmdldHMKICAvLy8gb2YgYSBzZXR0ZXIgZGlzcGF0Y2ggYXJlIHJldHVybmVkLgogIC8vLwogIC8vLyBTZWUgW2dldERpc3BhdGNoVGFyZ2V0XSBmb3IgbW9yZSBkZXRhaWxzLgogIC8vLwogIC8vLyBUaGUgcmV0dXJuZWQgbGlzdCBzaG91bGQgbm90IGJlIG1vZGlmaWVkLgogIExpc3Q8TWVtYmVyPiBnZXREaXNwYXRjaFRhcmdldHMoQ2xhc3MgY2xhc3NfLCB7Ym9vbCBzZXR0ZXJzOiBmYWxzZX0pOwoKICAvLy8gUmV0dXJucyB0aGUgcG9zc2libHkgYWJzdHJhY3QgaW50ZXJmYWNlIG1lbWJlciBvZiBbY2xhc3NfXSB3aXRoIHRoZSBnaXZlbgogIC8vLyBbbmFtZV0uCiAgLy8vCiAgLy8vIElmIFtzZXR0ZXJdIGlzIGBmYWxzZWAsIG9ubHkgZmllbGRzLCBtZXRob2RzLCBhbmQgZ2V0dGVycyB3aXRoIHRoYXQgbmFtZQogIC8vLyB3aWxsIGJlIGZvdW5kLiAgSWYgW3NldHRlcl0gaXMgYHRydWVgLCBvbmx5IG5vbi1maW5hbCBmaWVsZHMgYW5kIHNldHRlcnMKICAvLy8gd2lsbCBiZSBmb3VuZC4KICAvLy8KICAvLy8gSWYgbXVsdGlwbGUgbWVtYmVycyB3aXRoIHRoYXQgbmFtZSBhcmUgaW5oZXJpdGVkIGFuZCBub3Qgb3ZlcnJpZGRlbiwgdGhlCiAgLy8vIG1lbWJlciBmcm9tIHRoZSBmaXJzdCBkZWNsYXJlZCBzdXBlcnR5cGUgaXMgcmV0dXJuZWQuCiAgTWVtYmVyIGdldEludGVyZmFjZU1lbWJlcihDbGFzcyBjbGFzc18sIE5hbWUgbmFtZSwge2Jvb2wgc2V0dGVyOiBmYWxzZX0pOwoKICAvLy8gUmV0dXJucyB0aGUgbGlzdCBvZiBtZW1iZXJzIGRlbm90aW5nIHRoZSBpbnRlcmZhY2UgZm9yIFtjbGFzc19dLCB3aGljaAogIC8vLyBtYXkgaW5jbHVkZSBhYnN0cmFjdCBtZW1iZXJzLgogIC8vLwogIC8vLyBUaGUgbGlzdCBtYXkgY29udGFpbiBtdWx0aXBsZSBtZW1iZXJzIHdpdGggYSBnaXZlbiBuYW1lLiAgVGhpcyBoYXBwZW5zCiAgLy8vIHdoZW4gbWVtYmVycyBhcmUgaW5oZXJpdGVkIHRocm91Z2ggZGlmZmVyZW50IHN1cGVydHlwZXMgYW5kIG5vdCBvdmVycmlkZGVuCiAgLy8vIGluIHRoZSBjbGFzcy4KICAvLy8KICAvLy8gQWxzbyBzZWUgW2dldEludGVyZmFjZU1lbWJlcl0uCiAgTGlzdDxNZW1iZXI+IGdldEludGVyZmFjZU1lbWJlcnMoQ2xhc3MgY2xhc3NfLCB7Ym9vbCBzZXR0ZXJzOiBmYWxzZX0pOwoKICAvLy8gUmV0dXJucyB0aGUgbGlzdCBvZiBtZW1iZXJzIGRlY2xhcmVkIGluIFtjbGFzc19dLCBpbmNsdWRpbmcgYWJzdHJhY3QKICAvLy8gbWVtYmVycy4KICAvLy8KICAvLy8gTWVtYmVycyBhcmUgc29ydGVkIGJ5IG5hbWUgc28gdGhhdCB0aGV5IG1heSBiZSBlZmZpY2llbnRseSBjb21wYXJlZCBhY3Jvc3MKICAvLy8gY2xhc3Nlcy4KICBMaXN0PE1lbWJlcj4gZ2V0RGVjbGFyZWRNZW1iZXJzKENsYXNzIGNsYXNzXywge2Jvb2wgc2V0dGVyczogZmFsc2V9KTsKCiAgLy8vIFRydWUgaWYgW3N1YmNsYXNzXSBpbmhlcml0cyBmcm9tIFtzdXBlcmNsYXNzXSB0aG91Z2ggemVybyBvciBtb3JlCiAgLy8vIGBleHRlbmRzYCByZWxhdGlvbnNoaXBzLgogIGJvb2wgaXNTdWJjbGFzc09mKENsYXNzIHN1YmNsYXNzLCBDbGFzcyBzdXBlcmNsYXNzKTsKCiAgLy8vIFRydWUgaWYgW3N1YnR5cGVdIGluaGVyaXRzIGZyb20gW3N1cGVyY2xhc3NdIHRob3VnaCB6ZXJvIG9yIG1vcmUKICAvLy8gYGV4dGVuZHNgLCBgd2l0aGAsIGFuZCBgaW1wbGVtZW50c2AgcmVsYXRpb25zaGlwcy4KICBib29sIGlzU3VidHlwZU9mKENsYXNzIHN1YnR5cGUsIENsYXNzIHN1cGVyY2xhc3MpOwoKICAvLy8gVHJ1ZSBpZiB0aGUgZ2l2ZW4gY2xhc3MgaXMgdXNlZCBhcyB0aGUgcmlnaHQtaGFuZCBvcGVyYW5kIHRvIGEKICAvLy8gbWl4aW4gYXBwbGljYXRpb24gKGkuZS4gW0NsYXNzLm1peGVkSW5UeXBlXSkuCiAgYm9vbCBpc1VzZWRBc01peGluKENsYXNzIGNsYXNzXyk7CgogIC8vLyBJbnZva2VzIFtjYWxsYmFja10gZm9yIGV2ZXJ5IG1lbWJlciBkZWNsYXJlZCBpbiBvciBpbmhlcml0ZWQgYnkgW2NsYXNzX10KICAvLy8gdGhhdCBvdmVycmlkZXMgb3IgaW1wbGVtZW50cyBhIG1lbWJlciBpbiBhIHN1cGVydHlwZSBvZiBbY2xhc3NfXQogIC8vLyAob3IgaW4gcmFyZSBjYXNlcywgb3ZlcnJpZGVzIGEgbWVtYmVyIGRlY2xhcmVkIGluIFtjbGFzc19dKS4KICAvLy8KICAvLy8gV2UgdXNlIHRoZSB0ZXJtICJpbmhlcml0YWJsZSIgZm9yIG1lbWJlcnMgdGhhdCBhcmUgY2FuZGlkYXRlcyBmb3IKICAvLy8gaW5oZXJpdGFuY2UgYnV0IG1heSBoYXZlIGJlZW4gb3ZlcnJpZGRlbi4gIFRoZSAiZGVjbGFyZWQiIG1lbWJlcnMgb2YgYQogIC8vLyBtaXhpbiBhcHBsaWNhdGlvbiBhcmUgdGhvc2UgZGVjbGFyZWQgaW4gdGhlIG1peGVkLWluIHR5cGUuIFRoZSBjYWxsYmFjayBpcwogIC8vLyBpbnZva2VkIGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6CiAgLy8vCiAgLy8vIDEuIEEgbWVtYmVyIGRlY2xhcmVkIGluIHRoZSBjbGFzcyBvdmVycmlkZXMgYSBtZW1iZXIgaW5oZXJpdGFibGUgdGhyb3VnaAogIC8vLyBvbmUgb2YgdGhlIHN1cGVydHlwZXMgb2YgdGhlIGNsYXNzLgogIC8vLwogIC8vLyAyLiBBIG5vbi1hYnN0cmFjdCBtZW1iZXIgaXMgaW5oZXJpdGVkIGZyb20gYSBzdXBlcmNsYXNzLCBhbmQgaW4gdGhlCiAgLy8vIGNvbnRleHQgb2YgdGhpcyBjbGFzcywgaXQgb3ZlcnJpZGVzIGFuIGFic3RyYWN0IG1lbWJlciBpbmhlcml0YWJsZSB0aHJvdWdoCiAgLy8vIG9uZSBvZiBpdHMgc3VwZXJpbnRlcmZhY2VzLgogIC8vLwogIC8vLyAzLiBBIG5vbi1hYnN0cmFjdCBtZW1iZXIgaXMgaW5oZXJpdGVkIGZyb20gYSBzdXBlcmNsYXNzLCBhbmQgaXQgb3ZlcnJpZGVzCiAgLy8vIGFuIGFic3RyYWN0IG1lbWJlciBkZWNsYXJlZCBpbiB0aGlzIGNsYXNzLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCB3aWxsIG5vdCByZXBvcnQgdGhhdCBhIG1lbWJlciBvdmVycmlkZXMgaXRzZWxmLiBBIGdpdmVuIHBhaXIKICAvLy8gbWF5IGJlIHJlcG9ydGVkIG11bHRpcGxlIHRpbWVzIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGluaGVyaXRhbmNlIHBhdGhzCiAgLy8vIHRvIHRoZSBvdmVycmlkZGVuIG1lbWJlci4KICAvLy8KICAvLy8gSXQgaXMgcG9zc2libGUgZm9yIHR3byBtZXRob2RzIHRvIG92ZXJyaWRlIG9uZSBhbm90aGVyIGluIGJvdGggZGlyZWN0aW9ucy4KICAvLy8KICAvLy8gQnkgZGVmYXVsdCBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGFyZSBvdmVycmlkZGVuIHNlcGFyYXRlbHkuICBUaGUgW2lzU2V0dGVyXQogIC8vLyBjYWxsYmFjayBwYXJhbWV0ZXIgZGV0ZXJtaW5lcyB3aGljaCB0eXBlIG9mIGFjY2VzcyBpcyBiZWluZyBvdmVycmlkZGVuLgogIHZvaWQgZm9yRWFjaE92ZXJyaWRlUGFpcihDbGFzcyBjbGFzc18sCiAgICAgIGNhbGxiYWNrKE1lbWJlciBkZWNsYXJlZE1lbWJlciwgTWVtYmVyIGludGVyZmFjZU1lbWJlciwgYm9vbCBpc1NldHRlcikpOwoKICAvLy8gVGhpcyBtZXRob2QgaXMgaW52b2tlZCBieSB0aGUgY2xpZW50IGFmdGVyIGEgY2hhbmdlOiByZW1vdmFsLCBhZGRpdGlvbiwKICAvLy8gb3IgbW9kaWZpY2F0aW9uIG9mIGNsYXNzZXMgKHZpYSBsaWJyYXJpZXMpLgogIC8vLwogIC8vLyBGb3IgbW9kaWZpZWQgY2xhc3NlcyBzcGVjaWZ5IGEgY2xhc3MgYXMgYm90aCByZW1vdmVkIGFuZCBhZGRlZDogU29tZSBvZgogIC8vLyB0aGUgaW5mb3JtYXRpb24gdGhhdCB0aGlzIGhpZXJhcmNoeSBtaWdodCBoYXZlIGNhY2hlZCwgaXMgbm90IHZhbGlkCiAgLy8vIGFueW1vcmUuCiAgLy8vCiAgLy8vIE5vdGUsIHRoYXQgaXQgaXMgdGhlIGNsaWVudHMgcmVzcG9uc2liaWxpdHkgdG8gbWFyayBhbGwgc3ViY2xhc3NlcyBhcwogIC8vLyBjaGFuZ2VkIHRvby4KICBDbGFzc0hpZXJhcmNoeSBhcHBseVRyZWVDaGFuZ2VzKEl0ZXJhYmxlPExpYnJhcnk+IHJlbW92ZWRMaWJyYXJpZXMsCiAgICAgIEl0ZXJhYmxlPExpYnJhcnk+IGVuc3VyZUtub3duTGlicmFyaWVzLAogICAgICB7Q29tcG9uZW50IHJlaXNzdWVBbWJpZ3VvdXNTdXBlcnR5cGVzRm9yfSk7CgogIC8vLyBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IHRoZSBjbGllbnQgYWZ0ZXIgYSBtZW1iZXIgY2hhbmdlIG9uIGNsYXNzZXM6CiAgLy8vIFNvbWUgb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgdGhpcyBoaWVyYXJjaHkgbWlnaHQgaGF2ZSBjYWNoZWQsCiAgLy8vIGlzIG5vdCB2YWxpZCBhbnltb3JlLgogIC8vLyBOb3RlLCB0aGF0IGl0IGlzIHRoZSBjbGllbnRzIHJlc3BvbnNpYmlsaXR5IHRvIG1hcmsgYWxsIHN1YmNsYXNzZXMgYXMKICAvLy8gY2hhbmdlZCB0b28sIG9yIC0gaWYgW2ZpbmREZXNjZW5kYW50c10gaXMgdHJ1ZSwgdGhlIENsYXNzSGllcmFyY2h5IHdpbGwKICAvLy8gc3BlbmQgdGhlIHRpbWUgdG8gZmluZCB0aGVtIGZvciB0aGUgY2FsbGVyLgogIENsYXNzSGllcmFyY2h5IGFwcGx5TWVtYmVyQ2hhbmdlcyhJdGVyYWJsZTxDbGFzcz4gY2xhc3NlcywKICAgICAge2Jvb2wgZmluZERlc2NlbmRhbnRzOiBmYWxzZX0pOwoKICAvLy8gTWVyZ2VzIHR3byBzb3J0ZWQgbGlzdHMuCiAgLy8vCiAgLy8vIElmIGEgZ2l2ZW4gbWVtYmVyIG9jY3VycyBpbiBib3RoIGxpc3RzLCB0aGUgbWVyZ2Ugd2lsbCBhdHRlbXB0IHRvIGV4Y2x1ZGUKICAvLy8gdGhlIGR1cGxpY2F0ZSBtZW1iZXIsIGJ1dCBpcyBub3Qgc3RyaWN0bHkgZ3VhcmFudGVlZCB0byBkbyBzby4KICAvLy8KICAvLy8gVGhlIHNvcnQgaGFzIHRoZSBmb2xsb3dpbmcgc3RhYmlsaXR5IHByb3BlcnRpZXM6CiAgLy8vCiAgLy8vIC0gSWYgYm90aCB4IGFuZCB5IGNhbWUgZnJvbSB0aGUgc2FtZSBpbnB1dCBsaXN0LCBhbmQgeCBwcmVjZWRlZCB5IGluIHRoZQogIC8vLyAgIGlucHV0IGxpc3QsIHggd2lsbCBwcmVjZWRlIHkgaW4gdGhlIG91dHB1dCBsaXN0LiAgVGhpcyBob2xkcyBldmVuIGlmIHgKICAvLy8gICBhbmQgeSBoYXZlIG1hdGNoaW5nIG5hbWVzLgogIC8vLwogIC8vLyAtIElmIG0gaXMgYSBjb250aWd1b3VzIHN1YnNlcXVlbmNlIG9mIHRoZSBvdXRwdXQgbGlzdCBjb250YWluaW5nIGF0IGxlYXN0CiAgLy8vICAgb25lIGVsZW1lbnQgZnJvbSBlYWNoIGlucHV0IGxpc3QsIGFuZCBhbGwgZWxlbWVudHMgb2YgbSBoYXZlIG1hdGNoaW5nCiAgLy8vICAgbmFtZXMsIHRoZW4gdGhlIGVsZW1lbnRzIG9mIG0gZnJvbSBbZmlyc3RdIHdpbGwgcHJlY2VkZSB0aGUgZWxlbWVudHMgb2YKICAvLy8gICBtIGZyb20gW3NlY29uZF0uCiAgc3RhdGljIExpc3Q8TWVtYmVyPiBtZXJnZVNvcnRlZExpc3RzKAogICAgICBMaXN0PE1lbWJlcj4gZmlyc3QsIExpc3Q8TWVtYmVyPiBzZWNvbmQpIHsKICAgIGlmIChmaXJzdC5pc0VtcHR5KSByZXR1cm4gc2Vjb25kOwogICAgaWYgKHNlY29uZC5pc0VtcHR5KSByZXR1cm4gZmlyc3Q7CiAgICBMaXN0PE1lbWJlcj4gcmVzdWx0ID0gPE1lbWJlcj5bXS4ubGVuZ3RoID0gZmlyc3QubGVuZ3RoICsgc2Vjb25kLmxlbmd0aDsKICAgIGludCBzdG9yZUluZGV4ID0gMDsKICAgIGludCBpID0gMCwgaiA9IDA7CiAgICB3aGlsZSAoaSA8IGZpcnN0Lmxlbmd0aCAmJiBqIDwgc2Vjb25kLmxlbmd0aCkgewogICAgICBNZW1iZXIgZmlyc3RNZW1iZXIgPSBmaXJzdFtpXTsKICAgICAgTWVtYmVyIHNlY29uZE1lbWJlciA9IHNlY29uZFtqXTsKICAgICAgaW50IGNvbXBhcmUgPSBDbGFzc0hpZXJhcmNoeS5jb21wYXJlTWVtYmVycyhmaXJzdE1lbWJlciwgc2Vjb25kTWVtYmVyKTsKICAgICAgaWYgKGNvbXBhcmUgPD0gMCkgewogICAgICAgIHJlc3VsdFtzdG9yZUluZGV4KytdID0gZmlyc3RNZW1iZXI7CiAgICAgICAgKytpOwogICAgICAgIC8vIElmIHRoZSBzYW1lIG1lbWJlciBvY2N1cnMgaW4gYm90aCBsaXN0cywgc2tpcCB0aGUgZHVwbGljYXRlLgogICAgICAgIGlmIChpZGVudGljYWwoZmlyc3RNZW1iZXIsIHNlY29uZE1lbWJlcikpIHsKICAgICAgICAgICsrajsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0W3N0b3JlSW5kZXgrK10gPSBzZWNvbmRNZW1iZXI7CiAgICAgICAgKytqOwogICAgICB9CiAgICB9CiAgICB3aGlsZSAoaSA8IGZpcnN0Lmxlbmd0aCkgewogICAgICByZXN1bHRbc3RvcmVJbmRleCsrXSA9IGZpcnN0W2krK107CiAgICB9CiAgICB3aGlsZSAoaiA8IHNlY29uZC5sZW5ndGgpIHsKICAgICAgcmVzdWx0W3N0b3JlSW5kZXgrK10gPSBzZWNvbmRbaisrXTsKICAgIH0KICAgIHJlc3VsdC5sZW5ndGggPSBzdG9yZUluZGV4OwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBDb21wYXJlcyBtZW1iZXJzIGJ5IG5hbWUsIHVzaW5nIHRoZSBzYW1lIHNvcnQgb3JkZXIgYXMKICAvLy8gW2dldERlY2xhcmVkTWVtYmVyc10gYW5kIFtnZXRJbnRlcmZhY2VNZW1iZXJzXS4KICBzdGF0aWMgaW50IGNvbXBhcmVNZW1iZXJzKE1lbWJlciBmaXJzdCwgTWVtYmVyIHNlY29uZCkgewogICAgcmV0dXJuIF9jb21wYXJlTmFtZXMoZmlyc3QubmFtZSwgc2Vjb25kLm5hbWUpOwogIH0KCiAgLy8vIENvbXBhcmVzIG5hbWVzLCB1c2luZyB0aGUgc2FtZSBzb3J0IG9yZGVyIGFzIFtnZXREZWNsYXJlZE1lbWJlcnNdIGFuZAogIC8vLyBbZ2V0SW50ZXJmYWNlTWVtYmVyc10uCiAgLy8vCiAgLy8vIFRoaXMgaXMgYW4gYXJiaXRyYXJ5IGFzLWZhc3QtYXMtcG9zc2libGUgc29ydGluZyBjcml0ZXJpb24uCiAgc3RhdGljIGludCBfY29tcGFyZU5hbWVzKE5hbWUgZmlyc3ROYW1lLCBOYW1lIHNlY29uZE5hbWUpIHsKICAgIGludCBmaXJzdEhhc2ggPSBmaXJzdE5hbWUuaGFzaENvZGU7CiAgICBpbnQgc2Vjb25kSGFzaCA9IHNlY29uZE5hbWUuaGFzaENvZGU7CiAgICBpZiAoZmlyc3RIYXNoICE9IHNlY29uZEhhc2gpIHJldHVybiBmaXJzdEhhc2ggLSBzZWNvbmRIYXNoOwogICAgU3RyaW5nIGZpcnN0U3RyaW5nID0gZmlyc3ROYW1lLm5hbWU7CiAgICBTdHJpbmcgc2Vjb25kU3RyaW5nID0gc2Vjb25kTmFtZS5uYW1lOwogICAgaW50IGZpcnN0TGVuZ3RoID0gZmlyc3RTdHJpbmcubGVuZ3RoOwogICAgaW50IHNlY29uZExlbmd0aCA9IHNlY29uZFN0cmluZy5sZW5ndGg7CiAgICBpZiAoZmlyc3RMZW5ndGggIT0gc2Vjb25kTGVuZ3RoKSB7CiAgICAgIHJldHVybiBmaXJzdExlbmd0aCAtIHNlY29uZExlbmd0aDsKICAgIH0KICAgIExpYnJhcnkgZmlyc3RMaWJyYXJ5ID0gZmlyc3ROYW1lLmxpYnJhcnk7CiAgICBMaWJyYXJ5IHNlY29uZExpYnJhcnkgPSBzZWNvbmROYW1lLmxpYnJhcnk7CiAgICBpZiAoZmlyc3RMaWJyYXJ5ICE9IHNlY29uZExpYnJhcnkpIHsKICAgICAgaWYgKGZpcnN0TGlicmFyeSA9PSBudWxsKSByZXR1cm4gLTE7CiAgICAgIGlmIChzZWNvbmRMaWJyYXJ5ID09IG51bGwpIHJldHVybiAxOwogICAgICByZXR1cm4gZmlyc3RMaWJyYXJ5LmNvbXBhcmVUbyhzZWNvbmRMaWJyYXJ5KTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlyc3RMZW5ndGg7ICsraSkgewogICAgICBpbnQgZmlyc3RVbml0ID0gZmlyc3RTdHJpbmcuY29kZVVuaXRBdChpKTsKICAgICAgaW50IHNlY29uZFVuaXQgPSBzZWNvbmRTdHJpbmcuY29kZVVuaXRBdChpKTsKICAgICAgaW50IGRlbHRhID0gZmlyc3RVbml0IC0gc2Vjb25kVW5pdDsKICAgICAgaWYgKGRlbHRhICE9IDApIHJldHVybiBkZWx0YTsKICAgIH0KICAgIHJldHVybiAwOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIG1lbWJlciB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBgbnVsbGAgaWYgbm8gbWVtYmVyIGhhcyB0aGUKICAvLy8gbmFtZS4gIEluIGNhc2UgdGhlIGxpc3QgY29udGFpbnMgbXVsdGlwbGUgbWVtYmVycyB3aXRoIHRoZSBnaXZlbiBuYW1lLAogIC8vLyB0aGUgb25lIHRoYXQgb2NjdXJzIGZpcnN0IGluIHRoZSBsaXN0IGlzIHJldHVybmVkLgogIC8vLwogIC8vLyBUaGUgbGlzdCBpcyBhc3N1bWVkIHRvIGJlIHNvcnRlZCBhY2NvcmRpbmcgdG8gW2NvbXBhcmVNZW1iZXJzXS4KICBzdGF0aWMgTWVtYmVyIGZpbmRNZW1iZXJCeU5hbWUoTGlzdDxNZW1iZXI+IG1lbWJlcnMsIE5hbWUgbmFtZSkgewogICAgaW50IGxvdyA9IDAsIGhpZ2ggPSBtZW1iZXJzLmxlbmd0aCAtIDE7CiAgICB3aGlsZSAobG93IDw9IGhpZ2gpIHsKICAgICAgaW50IG1pZCA9IGxvdyArICgoaGlnaCAtIGxvdykgPj4gMSk7CiAgICAgIE1lbWJlciBwaXZvdCA9IG1lbWJlcnNbbWlkXTsKICAgICAgaW50IGNvbXBhcmlzb24gPSBfY29tcGFyZU5hbWVzKG5hbWUsIHBpdm90Lm5hbWUpOwogICAgICBpZiAoY29tcGFyaXNvbiA8IDApIHsKICAgICAgICBoaWdoID0gbWlkIC0gMTsKICAgICAgfSBlbHNlIGlmIChjb21wYXJpc29uID4gMCkgewogICAgICAgIGxvdyA9IG1pZCArIDE7CiAgICAgIH0gZWxzZSBpZiAoaGlnaCAhPSBtaWQpIHsKICAgICAgICAvLyBFbnN1cmUgd2UgZmluZCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gbmFtZS4KICAgICAgICBoaWdoID0gbWlkOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBwaXZvdDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBDbGFzc0hpZXJhcmNoeVN1YnR5cGVzIHsKICAvLy8gUmV0dXJucyB0aGUgc3VidHlwZXMgb2YgW2NsYXNzX10gYXMgYW4gaW50ZXJ2YWwgbGlzdC4KICBDbGFzc1NldCBnZXRTdWJ0eXBlc09mKENsYXNzIGNsYXNzXyk7CgogIC8vLyBSZXR1cm5zIHRoZSBzaW5nbGUgY29uY3JldGUgdGFyZ2V0IGZvciBpbnZvY2F0aW9uIG9mIHRoZSBnaXZlbiBpbnRlcmZhY2UKICAvLy8gdGFyZ2V0LCBvciBgbnVsbGAgaWYgaXQgY291bGQgbm90IGJlIHJlc29sdmVkIG9yIHRoZXJlIGFyZSBtdWx0aXBsZQogIC8vLyBwb3NzaWJsZSB0YXJnZXRzLgogIE1lbWJlciBnZXRTaW5nbGVUYXJnZXRGb3JJbnRlcmZhY2VJbnZvY2F0aW9uKE1lbWJlciBpbnRlcmZhY2VUYXJnZXQsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2V9KTsKfQoKY2xhc3MgX0NsYXNzSW5mb1N1YnR5cGUgewogIGZpbmFsIF9DbGFzc0luZm8gY2xhc3NJbmZvOwogIGludCB0b3BEb3duSW5kZXggPSAtMTsKCiAgLy8vIFRvcC1kb3duIGluZGljZXMgb2YgYWxsIHN1YmNsYXNzZXMgb2YgdGhpcyBjbGFzcywgcmVwcmVzZW50ZWQgYXMKICAvLy8gaW50ZXJsZWF2ZWQgYmVnaW4vZW5kIGludGVydmFsIGVuZCBwb2ludHMuCiAgVWludDMyTGlzdCBzdWJ0eXBlSW50ZXJ2YWxMaXN0OwoKICBfQ2xhc3NJbmZvU3VidHlwZSh0aGlzLmNsYXNzSW5mbyk7Cn0KCmNsYXNzIF9DbG9zZWRXb3JsZENsYXNzSGllcmFyY2h5U3VidHlwZXMgaW1wbGVtZW50cyBDbGFzc0hpZXJhcmNoeVN1YnR5cGVzIHsKICBmaW5hbCBDbG9zZWRXb3JsZENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeTsKICBmaW5hbCBMaXN0PENsYXNzPiBfY2xhc3Nlc0J5VG9wRG93bkluZGV4OwogIGZpbmFsIE1hcDxDbGFzcywgX0NsYXNzSW5mb1N1YnR5cGU+IF9pbmZvRm9yID0gPENsYXNzLCBfQ2xhc3NJbmZvU3VidHlwZT57fTsKICBib29sIGludmFsaWRhdGVkID0gZmFsc2U7CgogIF9DbG9zZWRXb3JsZENsYXNzSGllcmFyY2h5U3VidHlwZXModGhpcy5oaWVyYXJjaHkpCiAgICAgIDogX2NsYXNzZXNCeVRvcERvd25JbmRleCA9IG5ldyBMaXN0PENsYXNzPihoaWVyYXJjaHkuX2luZm9Gb3IubGVuZ3RoKSB7CiAgICBpZiAoaGllcmFyY2h5Ll9pbmZvRm9yLmlzTm90RW1wdHkpIHsKICAgICAgZm9yIChDbGFzcyBjbGFzc18gaW4gaGllcmFyY2h5Ll9pbmZvRm9yLmtleXMpIHsKICAgICAgICBfaW5mb0ZvcltjbGFzc19dID0gbmV3IF9DbGFzc0luZm9TdWJ0eXBlKGhpZXJhcmNoeS5faW5mb0ZvcltjbGFzc19dKTsKICAgICAgfQoKICAgICAgX3RvcERvd25Tb3J0VmlzaXQoX2luZm9Gb3JbaGllcmFyY2h5Ll9pbmZvRm9yLmtleXMuZmlyc3RdKTsKICAgIH0KICB9CgogIC8vLyBEb3dud2FyZHMgdHJhdmVyc2FsIG9mIHRoZSBjbGFzcyBoaWVyYXJjaHkgdGhhdCBvcmRlcnMgY2xhc3NlcyBzbyBsb2NhbAogIC8vLyBoaWVyYXJjaGllcyBoYXZlIGNvbnRpZ3VvdXMgaW5kaWNlcy4KICBpbnQgX3RvcERvd25Tb3J0SW5kZXggPSAwOwogIHZvaWQgX3RvcERvd25Tb3J0VmlzaXQoX0NsYXNzSW5mb1N1YnR5cGUgc3ViSW5mbykgewogICAgaWYgKHN1YkluZm8udG9wRG93bkluZGV4ICE9IC0xKSByZXR1cm47CiAgICBpbnQgaW5kZXggPSBfdG9wRG93blNvcnRJbmRleCsrOwogICAgc3ViSW5mby50b3BEb3duSW5kZXggPSBpbmRleDsKICAgIF9jbGFzc2VzQnlUb3BEb3duSW5kZXhbaW5kZXhdID0gc3ViSW5mby5jbGFzc0luZm8uY2xhc3NOb2RlOwogICAgdmFyIHN1YnR5cGVTZXRCdWlsZGVyID0gbmV3IF9JbnRlcnZhbExpc3RCdWlsZGVyKCkuLmFkZFNpbmdsZXRvbihpbmRleCk7CiAgICBmb3IgKF9DbGFzc0luZm8gc3VidHlwZSBpbiBzdWJJbmZvLmNsYXNzSW5mby5kaXJlY3RFeHRlbmRlcnMpIHsKICAgICAgX0NsYXNzSW5mb1N1YnR5cGUgc3VidHlwZUluZm8gPSBfaW5mb0ZvcltzdWJ0eXBlLmNsYXNzTm9kZV07CiAgICAgIF90b3BEb3duU29ydFZpc2l0KHN1YnR5cGVJbmZvKTsKICAgICAgc3VidHlwZVNldEJ1aWxkZXIuYWRkSW50ZXJ2YWxMaXN0KHN1YnR5cGVJbmZvLnN1YnR5cGVJbnRlcnZhbExpc3QpOwogICAgfQogICAgZm9yIChfQ2xhc3NJbmZvIHN1YnR5cGUgaW4gc3ViSW5mby5jbGFzc0luZm8uZGlyZWN0TWl4ZXJzKSB7CiAgICAgIF9DbGFzc0luZm9TdWJ0eXBlIHN1YnR5cGVJbmZvID0gX2luZm9Gb3Jbc3VidHlwZS5jbGFzc05vZGVdOwogICAgICBfdG9wRG93blNvcnRWaXNpdChzdWJ0eXBlSW5mbyk7CiAgICAgIHN1YnR5cGVTZXRCdWlsZGVyLmFkZEludGVydmFsTGlzdChzdWJ0eXBlSW5mby5zdWJ0eXBlSW50ZXJ2YWxMaXN0KTsKICAgIH0KICAgIGZvciAoX0NsYXNzSW5mbyBzdWJ0eXBlIGluIHN1YkluZm8uY2xhc3NJbmZvLmRpcmVjdEltcGxlbWVudGVycykgewogICAgICBfQ2xhc3NJbmZvU3VidHlwZSBzdWJ0eXBlSW5mbyA9IF9pbmZvRm9yW3N1YnR5cGUuY2xhc3NOb2RlXTsKICAgICAgX3RvcERvd25Tb3J0VmlzaXQoc3VidHlwZUluZm8pOwogICAgICBzdWJ0eXBlU2V0QnVpbGRlci5hZGRJbnRlcnZhbExpc3Qoc3VidHlwZUluZm8uc3VidHlwZUludGVydmFsTGlzdCk7CiAgICB9CiAgICBzdWJJbmZvLnN1YnR5cGVJbnRlcnZhbExpc3QgPSBzdWJ0eXBlU2V0QnVpbGRlci5idWlsZEludGVydmFsTGlzdCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyIGdldFNpbmdsZVRhcmdldEZvckludGVyZmFjZUludm9jYXRpb24oTWVtYmVyIGludGVyZmFjZVRhcmdldCwKICAgICAge2Jvb2wgc2V0dGVyOiBmYWxzZX0pIHsKICAgIGlmIChpbnZhbGlkYXRlZCkgdGhyb3cgIlRoaXMgZGF0YXN0cnVjdHVyZSBoYXMgYmVlbiBpbnZhbGlkYXRlZCI7CiAgICBOYW1lIG5hbWUgPSBpbnRlcmZhY2VUYXJnZXQubmFtZTsKICAgIE1lbWJlciB0YXJnZXQgPSBudWxsOwogICAgQ2xhc3NTZXQgc3VidHlwZXMgPSBnZXRTdWJ0eXBlc09mKGludGVyZmFjZVRhcmdldC5lbmNsb3NpbmdDbGFzcyk7CiAgICBmb3IgKENsYXNzIGMgaW4gc3VidHlwZXMpIHsKICAgICAgaWYgKCFjLmlzQWJzdHJhY3QpIHsKICAgICAgICBNZW1iZXIgY2FuZGlkYXRlID0gaGllcmFyY2h5LmdldERpc3BhdGNoVGFyZ2V0KGMsIG5hbWUsIHNldHRlcjogc2V0dGVyKTsKICAgICAgICBpZiAoKGNhbmRpZGF0ZSAhPSBudWxsKSAmJiAhY2FuZGlkYXRlLmlzQWJzdHJhY3QpIHsKICAgICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgewogICAgICAgICAgICB0YXJnZXQgPSBjYW5kaWRhdGU7CiAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCAhPSBjYW5kaWRhdGUpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGFyZ2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3NTZXQgZ2V0U3VidHlwZXNPZihDbGFzcyBjbGFzc18pIHsKICAgIGlmIChpbnZhbGlkYXRlZCkgdGhyb3cgIlRoaXMgZGF0YXN0cnVjdHVyZSBoYXMgYmVlbiBpbnZhbGlkYXRlZCI7CiAgICBTZXQ8Q2xhc3M+IHJlc3VsdCA9IG5ldyBTZXQ8Q2xhc3M+KCk7CiAgICBVaW50MzJMaXN0IGxpc3QgPSBfaW5mb0ZvcltjbGFzc19dLnN1YnR5cGVJbnRlcnZhbExpc3Q7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgaW50IGZyb20gPSBsaXN0W2ldOwogICAgICBpbnQgdG8gPSBsaXN0W2kgKyAxXTsKICAgICAgZm9yIChpbnQgaiA9IGZyb207IGogPCB0bzsgaisrKSB7CiAgICAgICAgcmVzdWx0LmFkZChfY2xhc3Nlc0J5VG9wRG93bkluZGV4W2pdKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBDbGFzc1NldChyZXN1bHQpOwogIH0KfQoKLy8vIEltcGxlbWVudGF0aW9uIG9mIFtDbGFzc0hpZXJhcmNoeV0gZm9yIGNsb3NlZCB3b3JsZC4KY2xhc3MgQ2xvc2VkV29ybGRDbGFzc0hpZXJhcmNoeSBpbXBsZW1lbnRzIENsYXNzSGllcmFyY2h5IHsKICBIYW5kbGVBbWJpZ3VvdXNTdXBlcnR5cGVzIF9vbkFtYmlndW91c1N1cGVydHlwZXM7CiAgSGFuZGxlQW1iaWd1b3VzU3VwZXJ0eXBlcyBfb25BbWJpZ3VvdXNTdXBlcnR5cGVzTm90V3JhcHBlZDsKICBNaXhpbkluZmVycmVyIG1peGluSW5mZXJyZXI7CgogIHZvaWQgc2V0IG9uQW1iaWd1b3VzU3VwZXJ0eXBlcygKICAgICAgSGFuZGxlQW1iaWd1b3VzU3VwZXJ0eXBlcyBvbkFtYmlndW91c1N1cGVydHlwZXMpIHsKICAgIF9vbkFtYmlndW91c1N1cGVydHlwZXNOb3RXcmFwcGVkID0gb25BbWJpZ3VvdXNTdXBlcnR5cGVzOwogICAgX29uQW1iaWd1b3VzU3VwZXJ0eXBlcyA9IChDbGFzcyBjbGFzc18sIFN1cGVydHlwZSBhLCBTdXBlcnR5cGUgYikgewogICAgICBvbkFtYmlndW91c1N1cGVydHlwZXMoY2xhc3NfLCBhLCBiKTsKICAgICAgTGlzdDxTdXBlcnR5cGU+IHJlY29yZGVkID0gX3JlY29yZGVkQW1iaWd1b3VzU3VwZXJ0eXBlc1tjbGFzc19dOwogICAgICBpZiAocmVjb3JkZWQgPT0gbnVsbCkgewogICAgICAgIHJlY29yZGVkID0gbmV3IExpc3Q8U3VwZXJ0eXBlPigpOwogICAgICAgIF9yZWNvcmRlZEFtYmlndW91c1N1cGVydHlwZXNbY2xhc3NfXSA9IHJlY29yZGVkOwogICAgICB9CiAgICAgIHJlY29yZGVkLmFkZChhKTsKICAgICAgcmVjb3JkZWQuYWRkKGIpOwogICAgfTsKICB9CgogIC8vLyBUaGUgaW5zZXJ0IG9yZGVyIGlzIGltcG9ydGFudC4KICBmaW5hbCBNYXA8Q2xhc3MsIF9DbGFzc0luZm8+IF9pbmZvRm9yID0KICAgICAgbmV3IExpbmtlZEhhc2hNYXA8Q2xhc3MsIF9DbGFzc0luZm8+KCk7CiAgZmluYWwgU2V0PExpYnJhcnk+IGtub3duTGlicmFyaWVzID0gbmV3IFNldDxMaWJyYXJ5PigpOwoKICAvLy8gUmVjb3JkZWQgZXJyb3JzIGZvciBjbGFzc2VzIHdlIGhhdmUgYWxyZWFkeSBjYWxjdWxhdGVkIHRoZSBjbGFzcyBoaWVyYXJjaHkKICAvLy8gZm9yLCBidXQgd2lsbCBoYXZlIHRvIGJlIHJlaXNzdWVkIHdoZW4gcmUtdXNpbmcgdGhlIGNhbGN1bGF0aW9uLgogIGZpbmFsIE1hcDxDbGFzcywgTGlzdDxTdXBlcnR5cGU+PiBfcmVjb3JkZWRBbWJpZ3VvdXNTdXBlcnR5cGVzID0KICAgICAgbmV3IExpbmtlZEhhc2hNYXA8Q2xhc3MsIExpc3Q8U3VwZXJ0eXBlPj4oKTsKCiAgSXRlcmFibGU8Q2xhc3M+IGdldCBjbGFzc2VzID0+IF9pbmZvRm9yLmtleXM7CiAgaW50IGdldCBudW1iZXJPZkNsYXNzZXMgPT4gX2luZm9Gb3IubGVuZ3RoOwoKICBfQ2xvc2VkV29ybGRDbGFzc0hpZXJhcmNoeVN1YnR5cGVzIF9jYWNoZWRDbGFzc0hpZXJhcmNoeVN1YnR5cGVzOwoKICBDbG9zZWRXb3JsZENsYXNzSGllcmFyY2h5Ll9pbnRlcm5hbCgKICAgICAgSGFuZGxlQW1iaWd1b3VzU3VwZXJ0eXBlcyBvbkFtYmlndW91c1N1cGVydHlwZXMsIHRoaXMubWl4aW5JbmZlcnJlcikgewogICAgdGhpcy5vbkFtYmlndW91c1N1cGVydHlwZXMgPSBvbkFtYmlndW91c1N1cGVydHlwZXM7CiAgfQoKICBDbGFzc0hpZXJhcmNoeVN1YnR5cGVzIGNvbXB1dGVTdWJ0eXBlc0luZm9ybWF0aW9uKCkgewogICAgX2NhY2hlZENsYXNzSGllcmFyY2h5U3VidHlwZXMgPz89CiAgICAgICAgbmV3IF9DbG9zZWRXb3JsZENsYXNzSGllcmFyY2h5U3VidHlwZXModGhpcyk7CiAgICByZXR1cm4gX2NhY2hlZENsYXNzSGllcmFyY2h5U3VidHlwZXM7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxDbGFzcz4gZ2V0T3JkZXJlZENsYXNzZXMoSXRlcmFibGU8Q2xhc3M+IHVub3JkZXJlZCkgewogICAgdmFyIHVub3JkZXJlZFNldCA9IHVub3JkZXJlZC50b1NldCgpOwogICAgcmV0dXJuIF9pbmZvRm9yLmtleXMud2hlcmUodW5vcmRlcmVkU2V0LmNvbnRhaW5zKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNTdWJjbGFzc09mKENsYXNzIHN1YmNsYXNzLCBDbGFzcyBzdXBlcmNsYXNzKSB7CiAgICBpZiAoaWRlbnRpY2FsKHN1YmNsYXNzLCBzdXBlcmNsYXNzKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gX2luZm9Gb3Jbc3ViY2xhc3NdLmlzU3ViY2xhc3NPZihfaW5mb0ZvcltzdXBlcmNsYXNzXSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzU3VidHlwZU9mKENsYXNzIHN1YnR5cGUsIENsYXNzIHN1cGVyY2xhc3MpIHsKICAgIGlmIChpZGVudGljYWwoc3VidHlwZSwgc3VwZXJjbGFzcykpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIF9pbmZvRm9yW3N1YnR5cGVdLmlzU3VidHlwZU9mKF9pbmZvRm9yW3N1cGVyY2xhc3NdKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNVc2VkQXNNaXhpbihDbGFzcyBjbGFzc18pIHsKICAgIHJldHVybiBfaW5mb0ZvcltjbGFzc19dLmRpcmVjdE1peGVycy5pc05vdEVtcHR5OwogIH0KCiAgTGlzdDxfQ2xhc3NJbmZvPiBfZ2V0UmFua2VkU3VwZXJjbGFzc0luZm9zKF9DbGFzc0luZm8gaW5mbykgewogICAgaWYgKGluZm8ubGVhc3RVcHBlckJvdW5kSW5mb3MgIT0gbnVsbCkgcmV0dXJuIGluZm8ubGVhc3RVcHBlckJvdW5kSW5mb3M7CiAgICB2YXIgaGVhcCA9IG5ldyBfTHViSGVhcCgpLi5hZGQoaW5mbyk7CiAgICB2YXIgY2hhaW4gPSA8X0NsYXNzSW5mbz5bXTsKICAgIGluZm8ubGVhc3RVcHBlckJvdW5kSW5mb3MgPSBjaGFpbjsKICAgIF9DbGFzc0luZm8gbGFzdEluZm8gPSBudWxsOwogICAgd2hpbGUgKGhlYXAuaXNOb3RFbXB0eSkgewogICAgICB2YXIgbmV4dEluZm8gPSBoZWFwLnJlbW92ZSgpOwogICAgICBpZiAoaWRlbnRpY2FsKG5leHRJbmZvLCBsYXN0SW5mbykpIGNvbnRpbnVlOwogICAgICBjaGFpbi5hZGQobmV4dEluZm8pOwogICAgICBsYXN0SW5mbyA9IG5leHRJbmZvOwogICAgICB2YXIgY2xhc3NOb2RlID0gbmV4dEluZm8uY2xhc3NOb2RlOwogICAgICB2b2lkIGFkZFRvSGVhcChTdXBlcnR5cGUgc3VwZXJ0eXBlKSB7CiAgICAgICAgaGVhcC5hZGQoX2luZm9Gb3Jbc3VwZXJ0eXBlLmNsYXNzTm9kZV0pOwogICAgICB9CgogICAgICBpZiAoY2xhc3NOb2RlLnN1cGVydHlwZSAhPSBudWxsKSBhZGRUb0hlYXAoY2xhc3NOb2RlLnN1cGVydHlwZSk7CiAgICAgIGlmIChjbGFzc05vZGUubWl4ZWRJblR5cGUgIT0gbnVsbCkgYWRkVG9IZWFwKGNsYXNzTm9kZS5taXhlZEluVHlwZSk7CiAgICAgIGNsYXNzTm9kZS5pbXBsZW1lbnRlZFR5cGVzLmZvckVhY2goYWRkVG9IZWFwKTsKICAgIH0KICAgIHJldHVybiBjaGFpbjsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0TGVnYWN5TGVhc3RVcHBlckJvdW5kKAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUxLCBJbnRlcmZhY2VUeXBlIHR5cGUyKSB7CiAgICAvLyBUaGUgYWxnb3JpdGhtIGlzOiBmaXJzdCB3ZSBjb21wdXRlIGEgbGlzdCBvZiBzdXBlcmNsYXNzZXMgZm9yIGJvdGggdHlwZXMsCiAgICAvLyBvcmRlcmVkIGZyb20gZ3JlYXRlc3QgdG8gbGVhc3QgZGVwdGgsIGFuZCBvcmRlcmVkIGJ5IHRvcG9sb2dpY2FsIHNvcnQKICAgIC8vIGluZGV4IHdpdGhpbiBlYWNoIGRlcHRoLiAgRHVlIHRvIHRoZSBzb3J0IG9yZGVyLCB3ZSBjYW4gZmluZCB0aGUKICAgIC8vIGludGVyc2VjdGlvbiBvZiB0aGVzZSBsaXN0cyBieSBhIHNpbXBsZSB3YWxrLgogICAgLy8KICAgIC8vIFRoZW4sIGZvciBlYWNoIGNsYXNzIGluIHRoZSBpbnRlcnNlY3Rpb24sIGRldGVybWluZSB0aGUgZXhhY3QgdHlwZSB0aGF0CiAgICAvLyBpcyBpbXBsZW1lbnRlZCBieSB0eXBlMSBhbmQgdHlwZTIuICBJZiB0aGUgdHlwZXMgbWF0Y2gsIHRoYXQgdHlwZSBpcyBhCiAgICAvLyBjYW5kaWRhdGUgKGl0J3MgYSBtZW1iZXIgb2YgU19uKS4gIEFzIHNvb24gYXMgd2UgZmluZCBhIGNhbmRpZGF0ZSB3aGljaAogICAgLy8gaXMgdW5pcXVlIGZvciBpdHMgZGVwdGgsIHdlIHJldHVybiBpdC4KICAgIC8vCiAgICAvLyBBcyBhbiBvcHRpbWl6YXRpb24sIGlmIHRoZSBjbGFzcyBmb3IgSSBpcyBhIHN1YnR5cGUgb2YgdGhlIGNsYXNzIGZvciBKLAogICAgLy8gdGhlbiB3ZSBrbm93IHRoYXQgdGhlIGxpc3Qgb2Ygc3VwZXJjbGFzc2VzIG9mIEogaXMgYSBzdWJzZXQgb2YgdGhlIGxpc3QKICAgIC8vIG9mIHN1cGVyY2xhc3NlcyBmb3IgSTsgdGhlcmVmb3JlIGl0IGlzIHN1ZmZpY2llbnQgdG8gY29tcHV0ZSBqdXN0IHRoZQogICAgLy8gbGlzdCBvZiBzdXBlcmNsYXNzZXMgZm9yIEouICBUbyBhdm9pZCBjb21wbGljYXRpbmcgdGhlIGNvZGUgYmVsb3cgKHdoaWNoCiAgICAvLyBpbnRlcnNlY3RzIHRoZSB0d28gbGlzdHMpLCB3ZSBzZXQgYm90aCBsaXN0cyBlcXVhbCB0byB0aGUgbGlzdCBvZgogICAgLy8gc3VwZXJjbGFzc2VzIGZvciBKLiAgQW5kIHZpY2UgdmVyc2Egd2l0aCB0aGUgcm9sZSBvZiBJIGFuZCBKIHN3YXBwZWQuCgogICAgLy8gQ29tcHV0ZSB0aGUgbGlzdCBvZiBzdXBlcmNsYXNzZXMgZm9yIGJvdGggdHlwZXMsIHdpdGggdGhlIGFib3ZlCiAgICAvLyBvcHRpbWl6YXRpb24uCiAgICBfQ2xhc3NJbmZvIGluZm8xID0gX2luZm9Gb3JbdHlwZTEuY2xhc3NOb2RlXTsKICAgIF9DbGFzc0luZm8gaW5mbzIgPSBfaW5mb0Zvclt0eXBlMi5jbGFzc05vZGVdOwogICAgTGlzdDxfQ2xhc3NJbmZvPiBjbGFzc2VzMTsKICAgIExpc3Q8X0NsYXNzSW5mbz4gY2xhc3NlczI7CiAgICBpZiAoaWRlbnRpY2FsKGluZm8xLCBpbmZvMikgfHwgaW5mbzEuaXNTdWJ0eXBlT2YoaW5mbzIpKSB7CiAgICAgIGNsYXNzZXMxID0gY2xhc3NlczIgPSBfZ2V0UmFua2VkU3VwZXJjbGFzc0luZm9zKGluZm8yKTsKICAgIH0gZWxzZSBpZiAoaW5mbzIuaXNTdWJ0eXBlT2YoaW5mbzEpKSB7CiAgICAgIGNsYXNzZXMxID0gY2xhc3NlczIgPSBfZ2V0UmFua2VkU3VwZXJjbGFzc0luZm9zKGluZm8xKTsKICAgIH0gZWxzZSB7CiAgICAgIGNsYXNzZXMxID0gX2dldFJhbmtlZFN1cGVyY2xhc3NJbmZvcyhpbmZvMSk7CiAgICAgIGNsYXNzZXMyID0gX2dldFJhbmtlZFN1cGVyY2xhc3NJbmZvcyhpbmZvMik7CiAgICB9CgogICAgLy8gV2FsayB0aGUgbGlzdHMgZmluZGluZyB0aGVpciBpbnRlcnNlY3Rpb24sIGxvb2tpbmcgZm9yIGEgZGVwdGggdGhhdCBoYXMgYQogICAgLy8gc2luZ2xlIGNhbmRpZGF0ZS4KICAgIGludCBpMSA9IDA7CiAgICBpbnQgaTIgPSAwOwogICAgSW50ZXJmYWNlVHlwZSBjYW5kaWRhdGUgPSBudWxsOwogICAgaW50IGN1cnJlbnREZXB0aCA9IC0xOwogICAgaW50IG51bUNhbmRpZGF0ZXNBdFRoaXNEZXB0aCA9IDA7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBfQ2xhc3NJbmZvIG5leHQgPSBjbGFzc2VzMVtpMV07CiAgICAgIF9DbGFzc0luZm8gbmV4dDIgPSBjbGFzc2VzMltpMl07CiAgICAgIGlmICghaWRlbnRpY2FsKG5leHQsIG5leHQyKSkgewogICAgICAgIGlmIChfTHViSGVhcC5zb3J0c0JlZm9yZVN0YXRpYyhuZXh0LCBuZXh0MikpIHsKICAgICAgICAgICsraTE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICsraTI7CiAgICAgICAgfQogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgICsraTI7CiAgICAgICsraTE7CiAgICAgIGlmIChuZXh0LmRlcHRoICE9IGN1cnJlbnREZXB0aCkgewogICAgICAgIGlmIChudW1DYW5kaWRhdGVzQXRUaGlzRGVwdGggPT0gMSkgcmV0dXJuIGNhbmRpZGF0ZTsKICAgICAgICBjdXJyZW50RGVwdGggPSBuZXh0LmRlcHRoOwogICAgICAgIG51bUNhbmRpZGF0ZXNBdFRoaXNEZXB0aCA9IDA7CiAgICAgICAgY2FuZGlkYXRlID0gbnVsbDsKICAgICAgfSBlbHNlIGlmIChudW1DYW5kaWRhdGVzQXRUaGlzRGVwdGggPiAxKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIC8vIEZvciBlYWNoIGNsYXNzIGluIHRoZSBpbnRlcnNlY3Rpb24sIGZpbmQgdGhlIGV4YWN0IHR5cGUgdGhhdCBpcwogICAgICAvLyBpbXBsZW1lbnRlZCBieSB0eXBlMSBhbmQgdHlwZTIuICBJZiB0aGV5IG1hdGNoLCBpdCdzIGEgY2FuZGlkYXRlLgogICAgICAvLwogICAgICAvLyBUd28gYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zOgogICAgICAvLwogICAgICAvLyAtIElmIHRoaXMgY2xhc3MgbGFja3MgdHlwZSBwYXJhbWV0ZXJzLCB3ZSBrbm93IHRoZXJlIGlzIGEgbWF0Y2ggd2l0aG91dAogICAgICAvLyAgIG5lZWRpbmcgdG8gc3Vic3RpdHV0ZS4KICAgICAgLy8KICAgICAgLy8gLSBJZiB0aGUgZGVwdGggaXMgMCwgd2UgaGF2ZSByZWFjaGVkIE9iamVjdCwgc28gd2UgY2FuIHJldHVybiBpdAogICAgICAvLyAgIGltbWVkaWF0ZWx5LiAgU2luY2UgYWxsIGludGVyZmFjZSB0eXBlcyBhcmUgc3VidHlwZXMgb2YgT2JqZWN0LCB0aGlzCiAgICAgIC8vICAgZW5zdXJlcyB0aGUgbG9vcCB0ZXJtaW5hdGVzLgogICAgICBpZiAobmV4dC5jbGFzc05vZGUudHlwZVBhcmFtZXRlcnMuaXNFbXB0eSkgewogICAgICAgIGNhbmRpZGF0ZSA9IG5leHQuY2xhc3NOb2RlLnJhd1R5cGU7CiAgICAgICAgaWYgKGN1cnJlbnREZXB0aCA9PSAwKSByZXR1cm4gY2FuZGlkYXRlOwogICAgICAgICsrbnVtQ2FuZGlkYXRlc0F0VGhpc0RlcHRoOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBzdXBlclR5cGUxID0gaWRlbnRpY2FsKGluZm8xLCBuZXh0KQogICAgICAgICAgICA/IHR5cGUxCiAgICAgICAgICAgIDogU3Vic3RpdHV0aW9uLmZyb21JbnRlcmZhY2VUeXBlKHR5cGUxKS5zdWJzdGl0dXRlVHlwZSgKICAgICAgICAgICAgICAgIGluZm8xLmdlbmVyaWNTdXBlclR5cGVzW25leHQuY2xhc3NOb2RlXS5maXJzdC5hc0ludGVyZmFjZVR5cGUpOwogICAgICAgIHZhciBzdXBlclR5cGUyID0gaWRlbnRpY2FsKGluZm8yLCBuZXh0KQogICAgICAgICAgICA/IHR5cGUyCiAgICAgICAgICAgIDogU3Vic3RpdHV0aW9uLmZyb21JbnRlcmZhY2VUeXBlKHR5cGUyKS5zdWJzdGl0dXRlVHlwZSgKICAgICAgICAgICAgICAgIGluZm8yLmdlbmVyaWNTdXBlclR5cGVzW25leHQuY2xhc3NOb2RlXS5maXJzdC5hc0ludGVyZmFjZVR5cGUpOwogICAgICAgIGlmIChzdXBlclR5cGUxID09IHN1cGVyVHlwZTIpIHsKICAgICAgICAgIGNhbmRpZGF0ZSA9IHN1cGVyVHlwZTE7CiAgICAgICAgICArK251bUNhbmRpZGF0ZXNBdFRoaXNEZXB0aDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIFN1cGVydHlwZSBnZXRDbGFzc0FzSW5zdGFuY2VPZihDbGFzcyBjbGFzc18sIENsYXNzIHN1cGVyY2xhc3MpIHsKICAgIGlmIChpZGVudGljYWwoY2xhc3NfLCBzdXBlcmNsYXNzKSkgcmV0dXJuIGNsYXNzXy5hc1RoaXNTdXBlcnR5cGU7CiAgICBfQ2xhc3NJbmZvIGluZm8gPSBfaW5mb0ZvcltjbGFzc19dOwogICAgaWYgKGluZm8gPT0gbnVsbCkgewogICAgICB0aHJvdyAiJHtjbGFzc18uZmlsZVVyaX06IE5vIGNsYXNzIGluZm8gZm9yICR7Y2xhc3NfLm5hbWV9IjsKICAgIH0KICAgIF9DbGFzc0luZm8gc3VwZXJJbmZvID0gX2luZm9Gb3Jbc3VwZXJjbGFzc107CiAgICBpZiAoc3VwZXJJbmZvID09IG51bGwpIHsKICAgICAgdGhyb3cgIiR7c3VwZXJjbGFzcy5maWxlVXJpfTogTm8gY2xhc3MgaW5mbyBmb3IgJHtzdXBlcmNsYXNzLm5hbWV9IjsKICAgIH0KICAgIGlmICghaW5mby5pc1N1YnR5cGVPZihzdXBlckluZm8pKSByZXR1cm4gbnVsbDsKICAgIGlmIChzdXBlcmNsYXNzLnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHJldHVybiBzdXBlcmNsYXNzLmFzUmF3U3VwZXJ0eXBlOwogICAgcmV0dXJuIGluZm8uZ2VuZXJpY1N1cGVyVHlwZXNbc3VwZXJjbGFzc10/LmZpcnN0OwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXRUeXBlQXNJbnN0YW5jZU9mKEludGVyZmFjZVR5cGUgdHlwZSwgQ2xhc3Mgc3VwZXJjbGFzcykgewogICAgU3VwZXJ0eXBlIGNhc3RlZFR5cGUgPSBnZXRDbGFzc0FzSW5zdGFuY2VPZih0eXBlLmNsYXNzTm9kZSwgc3VwZXJjbGFzcyk7CiAgICBpZiAoY2FzdGVkVHlwZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBTdWJzdGl0dXRpb24uZnJvbUludGVyZmFjZVR5cGUodHlwZSkKICAgICAgICAuc3Vic3RpdHV0ZVR5cGUoY2FzdGVkVHlwZS5hc0ludGVyZmFjZVR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyIGdldERpc3BhdGNoVGFyZ2V0KENsYXNzIGNsYXNzXywgTmFtZSBuYW1lLCB7Ym9vbCBzZXR0ZXI6IGZhbHNlfSkgewogICAgX0NsYXNzSW5mbyBpbmZvID0gX2luZm9Gb3JbY2xhc3NfXTsKICAgIExpc3Q8TWVtYmVyPiBsaXN0ID0KICAgICAgICBzZXR0ZXIgPyBpbmZvLmltcGxlbWVudGVkU2V0dGVycyA6IGluZm8uaW1wbGVtZW50ZWRHZXR0ZXJzQW5kQ2FsbHM7CiAgICByZXR1cm4gQ2xhc3NIaWVyYXJjaHkuZmluZE1lbWJlckJ5TmFtZShsaXN0LCBuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8TWVtYmVyPiBnZXREaXNwYXRjaFRhcmdldHMoQ2xhc3MgY2xhc3NfLCB7Ym9vbCBzZXR0ZXJzOiBmYWxzZX0pIHsKICAgIF9DbGFzc0luZm8gaW5mbyA9IF9pbmZvRm9yW2NsYXNzX107CiAgICByZXR1cm4gc2V0dGVycyA/IGluZm8uaW1wbGVtZW50ZWRTZXR0ZXJzIDogaW5mby5pbXBsZW1lbnRlZEdldHRlcnNBbmRDYWxsczsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlciBnZXRJbnRlcmZhY2VNZW1iZXIoQ2xhc3MgY2xhc3NfLCBOYW1lIG5hbWUsIHtib29sIHNldHRlcjogZmFsc2V9KSB7CiAgICBMaXN0PE1lbWJlcj4gbGlzdCA9IGdldEludGVyZmFjZU1lbWJlcnMoY2xhc3NfLCBzZXR0ZXJzOiBzZXR0ZXIpOwogICAgcmV0dXJuIENsYXNzSGllcmFyY2h5LmZpbmRNZW1iZXJCeU5hbWUobGlzdCwgbmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PE1lbWJlcj4gZ2V0SW50ZXJmYWNlTWVtYmVycyhDbGFzcyBjbGFzc18sIHtib29sIHNldHRlcnM6IGZhbHNlfSkgewogICAgcmV0dXJuIF9idWlsZEludGVyZmFjZU1lbWJlcnMoY2xhc3NfLCBfaW5mb0ZvcltjbGFzc19dLCBzZXR0ZXJzOiBzZXR0ZXJzKTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8TWVtYmVyPiBnZXREZWNsYXJlZE1lbWJlcnMoQ2xhc3MgY2xhc3NfLCB7Ym9vbCBzZXR0ZXJzOiBmYWxzZX0pIHsKICAgIHZhciBpbmZvID0gX2luZm9Gb3JbY2xhc3NfXTsKICAgIHJldHVybiBzZXR0ZXJzID8gaW5mby5kZWNsYXJlZFNldHRlcnMgOiBpbmZvLmRlY2xhcmVkR2V0dGVyc0FuZENhbGxzOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoT3ZlcnJpZGVQYWlyKENsYXNzIGNsYXNzXywKICAgICAgY2FsbGJhY2soTWVtYmVyIGRlY2xhcmVkTWVtYmVyLCBNZW1iZXIgaW50ZXJmYWNlTWVtYmVyLCBib29sIGlzU2V0dGVyKSwKICAgICAge2Jvb2wgY3Jvc3NHZXR0ZXJzU2V0dGVyczogZmFsc2V9KSB7CiAgICBfQ2xhc3NJbmZvIGluZm8gPSBfaW5mb0ZvcltjbGFzc19dOwogICAgZm9yICh2YXIgc3VwZXJ0eXBlIGluIGNsYXNzXy5zdXBlcnMpIHsKICAgICAgdmFyIHN1cGVyY2xhc3MgPSBzdXBlcnR5cGUuY2xhc3NOb2RlOwogICAgICB2YXIgc3VwZXJHZXR0ZXJzID0gZ2V0SW50ZXJmYWNlTWVtYmVycyhzdXBlcmNsYXNzKTsKICAgICAgdmFyIHN1cGVyU2V0dGVycyA9IGdldEludGVyZmFjZU1lbWJlcnMoc3VwZXJjbGFzcywgc2V0dGVyczogdHJ1ZSk7CiAgICAgIF9yZXBvcnRPdmVycmlkZXMoaW5mby5kZWNsYXJlZEdldHRlcnNBbmRDYWxscywgc3VwZXJHZXR0ZXJzLCBjYWxsYmFjayk7CiAgICAgIF9yZXBvcnRPdmVycmlkZXMoaW5mby5kZWNsYXJlZFNldHRlcnMsIHN1cGVyU2V0dGVycywgY2FsbGJhY2ssCiAgICAgICAgICBpc1NldHRlcjogdHJ1ZSk7CiAgICB9CiAgfQoKICBzdGF0aWMgdm9pZCBfcmVwb3J0T3ZlcnJpZGVzKAogICAgICBMaXN0PE1lbWJlcj4gZGVjbGFyZWRMaXN0LAogICAgICBMaXN0PE1lbWJlcj4gaW5oZXJpdGVkTGlzdCwKICAgICAgY2FsbGJhY2soTWVtYmVyIGRlY2xhcmVkTWVtYmVyLCBNZW1iZXIgaW50ZXJmYWNlTWVtYmVyLCBib29sIGlzU2V0dGVyKSwKICAgICAge2Jvb2wgaXNTZXR0ZXI6IGZhbHNlfSkgewogICAgaW50IGkgPSAwLCBqID0gMDsKICAgIHdoaWxlIChpIDwgZGVjbGFyZWRMaXN0Lmxlbmd0aCAmJiBqIDwgaW5oZXJpdGVkTGlzdC5sZW5ndGgpIHsKICAgICAgTWVtYmVyIGRlY2xhcmVkID0gZGVjbGFyZWRMaXN0W2ldOwogICAgICBNZW1iZXIgaW5oZXJpdGVkID0gaW5oZXJpdGVkTGlzdFtqXTsKICAgICAgaW50IGNvbXBhcmlzb24gPSBDbGFzc0hpZXJhcmNoeS5jb21wYXJlTWVtYmVycyhkZWNsYXJlZCwgaW5oZXJpdGVkKTsKICAgICAgaWYgKGNvbXBhcmlzb24gPCAwKSB7CiAgICAgICAgKytpOwogICAgICB9IGVsc2UgaWYgKGNvbXBhcmlzb24gPiAwKSB7CiAgICAgICAgKytqOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICghaWRlbnRpY2FsKGRlY2xhcmVkLCBpbmhlcml0ZWQpKSB7CiAgICAgICAgICBjYWxsYmFjayhkZWNsYXJlZCwgaW5oZXJpdGVkLCBpc1NldHRlcik7CiAgICAgICAgfQogICAgICAgIC8vIEEgZ2l2ZW4gZGVjbGFyZWQgbWVtYmVyIG1heSBvdmVycmlkZSBtdWx0aXBsZSBpbnRlcmZhY2UgbWVtYmVycywKICAgICAgICAvLyBzbyBvbmx5IG1vdmUgcGFzdCB0aGUgaW50ZXJmYWNlIG1lbWJlci4KICAgICAgICArK2o7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIExpc3Q8U3VwZXJ0eXBlPiBnZW5lcmljU3VwZXJ0eXBlc09mKENsYXNzIGNsYXNzXykgewogICAgZmluYWwgc3VwZXJ0eXBlcyA9IF9pbmZvRm9yW2NsYXNzX10uZ2VuZXJpY1N1cGVyVHlwZXM7CiAgICBpZiAoc3VwZXJ0eXBlcyA9PSBudWxsKSByZXR1cm4gY29uc3QgPFN1cGVydHlwZT5bXTsKICAgIC8vIE11bHRpcGxlIHN1cGVydHlwZXMgY2FuIGFyaXNlIGZyb20gYW1iaWd1b3VzIHN1cGVydHlwZXMuIFRoZSBmaXJzdAogICAgLy8gc3VwZXJ0eXBlIGlzIHRoZSByZWFsIG9uZTsgdGhlIG90aGVycyBhcmUgcHVyZWx5IGluZm9ybWF0aW9uYWwuCiAgICByZXR1cm4gc3VwZXJ0eXBlcy52YWx1ZXMubWFwKCh2KSA9PiB2LmZpcnN0KS50b0xpc3QoKTsKICB9CgogIEBvdmVycmlkZQogIENsYXNzSGllcmFyY2h5IGFwcGx5VHJlZUNoYW5nZXMoSXRlcmFibGU8TGlicmFyeT4gcmVtb3ZlZExpYnJhcmllcywKICAgICAgSXRlcmFibGU8TGlicmFyeT4gZW5zdXJlS25vd25MaWJyYXJpZXMsCiAgICAgIHtDb21wb25lbnQgcmVpc3N1ZUFtYmlndW91c1N1cGVydHlwZXNGb3J9KSB7CiAgICAvLyBSZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJlbW92ZWQgY2xhc3Nlcy4KICAgIGZvciAoTGlicmFyeSBsaWIgaW4gcmVtb3ZlZExpYnJhcmllcykgewogICAgICBpZiAoIWtub3duTGlicmFyaWVzLmNvbnRhaW5zKGxpYikpIGNvbnRpbnVlOwogICAgICBmb3IgKENsYXNzIGNsYXNzXyBpbiBsaWIuY2xhc3NlcykgewogICAgICAgIF9DbGFzc0luZm8gaW5mbyA9IF9pbmZvRm9yW2NsYXNzX107CiAgICAgICAgaWYgKGNsYXNzXy5zdXBlcnR5cGUgIT0gbnVsbCkgewogICAgICAgICAgX2luZm9Gb3JbY2xhc3NfLnN1cGVydHlwZS5jbGFzc05vZGVdPy5kaXJlY3RFeHRlbmRlcnM/LnJlbW92ZShpbmZvKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNsYXNzXy5taXhlZEluVHlwZSAhPSBudWxsKSB7CiAgICAgICAgICBfaW5mb0ZvcltjbGFzc18ubWl4ZWRJblR5cGUuY2xhc3NOb2RlXT8uZGlyZWN0TWl4ZXJzPy5yZW1vdmUoaW5mbyk7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIHN1cGVydHlwZSBpbiBjbGFzc18uaW1wbGVtZW50ZWRUeXBlcykgewogICAgICAgICAgX2luZm9Gb3Jbc3VwZXJ0eXBlLmNsYXNzTm9kZV0/LmRpcmVjdEltcGxlbWVudGVycz8ucmVtb3ZlKGluZm8pOwogICAgICAgIH0KCiAgICAgICAgX2luZm9Gb3IucmVtb3ZlKGNsYXNzXyk7CiAgICAgICAgX3JlY29yZGVkQW1iaWd1b3VzU3VwZXJ0eXBlcy5yZW1vdmUoY2xhc3NfKTsKICAgICAgfQogICAgICBrbm93bkxpYnJhcmllcy5yZW1vdmUobGliKTsKICAgIH0KCiAgICAvLyBJZiB3ZSBoYXZlIGEgY2FjaGVkIGNvbXB1dGF0aW9uIG9mIHN1YnR5cGVzLCBpbnZhbGlkYXRlIGl0IGFuZCBzdG9wCiAgICAvLyBjYWNoaW5nIGl0LgogICAgaWYgKF9jYWNoZWRDbGFzc0hpZXJhcmNoeVN1YnR5cGVzICE9IG51bGwpIHsKICAgICAgX2NhY2hlZENsYXNzSGllcmFyY2h5U3VidHlwZXMuaW52YWxpZGF0ZWQgPSB0cnVlOwogICAgfQoKICAgIGlmIChfcmVjb3JkZWRBbWJpZ3VvdXNTdXBlcnR5cGVzLmlzTm90RW1wdHkgJiYKICAgICAgICByZWlzc3VlQW1iaWd1b3VzU3VwZXJ0eXBlc0ZvciAhPSBudWxsKSB7CiAgICAgIFNldDxMaWJyYXJ5PiBsaWJzID0KICAgICAgICAgIG5ldyBTZXQ8TGlicmFyeT4uZnJvbShyZWlzc3VlQW1iaWd1b3VzU3VwZXJ0eXBlc0Zvci5saWJyYXJpZXMpOwogICAgICBmb3IgKENsYXNzIGNsYXNzXyBpbiBfcmVjb3JkZWRBbWJpZ3VvdXNTdXBlcnR5cGVzLmtleXMpIHsKICAgICAgICBpZiAoIWxpYnMuY29udGFpbnMoY2xhc3NfLmVuY2xvc2luZ0xpYnJhcnkpKSBjb250aW51ZTsKICAgICAgICBMaXN0PFN1cGVydHlwZT4gcmVjb3JkZWQgPSBfcmVjb3JkZWRBbWJpZ3VvdXNTdXBlcnR5cGVzW2NsYXNzX107CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWNvcmRlZC5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgX29uQW1iaWd1b3VzU3VwZXJ0eXBlc05vdFdyYXBwZWQoCiAgICAgICAgICAgICAgY2xhc3NfLCByZWNvcmRlZFtpXSwgcmVjb3JkZWRbaSArIDFdKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBBZGQgdGhlIG5ldyBjbGFzc2VzLgogICAgTGlzdDxDbGFzcz4gYWRkZWRDbGFzc2VzU29ydGVkID0gbmV3IExpc3Q8Q2xhc3M+KCk7CiAgICBpbnQgZXhwZWN0ZWRTdGFydEluZGV4ID0gX3RvcFNvcnRJbmRleDsKICAgIGZvciAoTGlicmFyeSBsaWIgaW4gZW5zdXJlS25vd25MaWJyYXJpZXMpIHsKICAgICAgaWYgKGtub3duTGlicmFyaWVzLmNvbnRhaW5zKGxpYikpIGNvbnRpbnVlOwogICAgICBmb3IgKENsYXNzIGNsYXNzXyBpbiBsaWIuY2xhc3NlcykgewogICAgICAgIF90b3BvbG9naWNhbFNvcnRWaXNpdChjbGFzc18sIG5ldyBTZXQ8Q2xhc3M+KCksCiAgICAgICAgICAgIG9yZGVyZWRMaXN0OiBhZGRlZENsYXNzZXNTb3J0ZWQpOwogICAgICB9CiAgICAgIGtub3duTGlicmFyaWVzLmFkZChsaWIpOwogICAgfQogICAgX2luaXRpYWxpemVUb3BvbG9naWNhbGx5U29ydGVkQ2xhc3NlcygKICAgICAgICBhZGRlZENsYXNzZXNTb3J0ZWQsIGV4cGVjdGVkU3RhcnRJbmRleCk7CgogICAgcmV0dXJuIHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc0hpZXJhcmNoeSBhcHBseU1lbWJlckNoYW5nZXMoSXRlcmFibGU8Q2xhc3M+IGNsYXNzZXMsCiAgICAgIHtib29sIGZpbmREZXNjZW5kYW50czogZmFsc2V9KSB7CiAgICBpZiAoY2xhc3Nlcy5pc0VtcHR5KSByZXR1cm4gdGhpczsKCiAgICBMaXN0PF9DbGFzc0luZm8+IGluZm9zID0gbmV3IExpc3Q8X0NsYXNzSW5mbz4oKTsKICAgIGlmIChmaW5kRGVzY2VuZGFudHMpIHsKICAgICAgU2V0PF9DbGFzc0luZm8+IHByb2Nlc3NlZENsYXNzZXMgPSBuZXcgU2V0PF9DbGFzc0luZm8+KCk7CiAgICAgIExpc3Q8X0NsYXNzSW5mbz4gd29ya2xpc3QgPSA8X0NsYXNzSW5mbz5bXTsKICAgICAgZm9yIChDbGFzcyBjbGFzc18gaW4gY2xhc3NlcykgewogICAgICAgIF9DbGFzc0luZm8gaW5mbyA9IF9pbmZvRm9yW2NsYXNzX107CiAgICAgICAgd29ya2xpc3QuYWRkKGluZm8pOwogICAgICB9CgogICAgICB3aGlsZSAod29ya2xpc3QuaXNOb3RFbXB0eSkgewogICAgICAgIF9DbGFzc0luZm8gaW5mbyA9IHdvcmtsaXN0LnJlbW92ZUxhc3QoKTsKICAgICAgICBpZiAocHJvY2Vzc2VkQ2xhc3Nlcy5hZGQoaW5mbykpIHsKICAgICAgICAgIHdvcmtsaXN0LmFkZEFsbChpbmZvLmRpcmVjdEV4dGVuZGVycyk7CiAgICAgICAgICB3b3JrbGlzdC5hZGRBbGwoaW5mby5kaXJlY3RJbXBsZW1lbnRlcnMpOwogICAgICAgICAgd29ya2xpc3QuYWRkQWxsKGluZm8uZGlyZWN0TWl4ZXJzKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaW5mb3MuYWRkQWxsKHByb2Nlc3NlZENsYXNzZXMpOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChDbGFzcyBjbGFzc18gaW4gY2xhc3NlcykgewogICAgICAgIF9DbGFzc0luZm8gaW5mbyA9IF9pbmZvRm9yW2NsYXNzX107CiAgICAgICAgaW5mb3MuYWRkKGluZm8pOwogICAgICB9CiAgICB9CgogICAgaW5mb3Muc29ydCgoX0NsYXNzSW5mbyBhLCBfQ2xhc3NJbmZvIGIpIHsKICAgICAgcmV0dXJuIGEudG9wb2xvZ2ljYWxJbmRleCAtIGIudG9wb2xvZ2ljYWxJbmRleDsKICAgIH0pOwoKICAgIGZvciAoX0NsYXNzSW5mbyBpbmZvIGluIGluZm9zKSB7CiAgICAgIENsYXNzIGNsYXNzXyA9IGluZm8uY2xhc3NOb2RlOwogICAgICBfYnVpbGREZWNsYXJlZE1lbWJlcnMoY2xhc3NfLCBpbmZvKTsKICAgICAgX2J1aWxkSW1wbGVtZW50ZWRNZW1iZXJzKGNsYXNzXywgaW5mbyk7CiAgICAgIGluZm8uaW50ZXJmYWNlU2V0dGVycyA9IG51bGw7CiAgICAgIGluZm8uaW50ZXJmYWNlR2V0dGVyc0FuZENhbGxzID0gbnVsbDsKICAgICAgX2J1aWxkSW50ZXJmYWNlTWVtYmVycyhjbGFzc18sIGluZm8sIHNldHRlcnM6IHRydWUpOwogICAgICBfYnVpbGRJbnRlcmZhY2VNZW1iZXJzKGNsYXNzXywgaW5mbywgc2V0dGVyczogZmFsc2UpOwogICAgfQoKICAgIHJldHVybiB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgU3VwZXJ0eXBlIGFzSW5zdGFudGlhdGlvbk9mKFN1cGVydHlwZSB0eXBlLCBDbGFzcyBzdXBlcmNsYXNzKSB7CiAgICAvLyBUaGlzIGlzIHNpbWlsYXIgdG8gZ2V0VHlwZUFzSW5zdGFuY2VPZiwgZXhjZXB0IHRoYXQgaXQgYXNzdW1lcyB0aGF0CiAgICAvLyBzdXBlcmNsYXNzIGlzIGEgZ2VuZXJpYyBjbGFzcy4gIEl0IHRodXMgZG9lcyBub3QgcmVseSBvbiBiZWluZyBhYmxlCiAgICAvLyB0byBhbnN3ZXIgaXNTdWJ0eXBlT2YgcXVlcmllcyBhbmQgc28gY2FuIGJlIHVzZWQgYmVmb3JlIHdlIGhhdmUgYnVpbHQKICAgIC8vIHRoZSBpbnRlcnZhbHMgbmVlZGVkIGZvciB0aG9zZSBxdWVyaWVzLgogICAgYXNzZXJ0KHN1cGVyY2xhc3MudHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSk7CiAgICBpZiAodHlwZS5jbGFzc05vZGUgPT0gc3VwZXJjbGFzcykgewogICAgICByZXR1cm4gc3VwZXJjbGFzcy5hc1RoaXNTdXBlcnR5cGU7CiAgICB9CiAgICB2YXIgbWFwID0gX2luZm9Gb3JbdHlwZS5jbGFzc05vZGVdPy5nZW5lcmljU3VwZXJUeXBlczsKICAgIHJldHVybiBtYXAgPT0gbnVsbCA/IG51bGwgOiBtYXBbc3VwZXJjbGFzc10/LmZpcnN0OwogIH0KCiAgdm9pZCBfaW5pdGlhbGl6ZShMaXN0PExpYnJhcnk+IGxpYnJhcmllcykgewogICAgLy8gQnVpbGQgdGhlIGNsYXNzIG9yZGVyaW5nIGJhc2VkIG9uIGEgdG9wb2xvZ2ljYWwgc29ydC4KICAgIGZvciAodmFyIGxpYnJhcnkgaW4gbGlicmFyaWVzKSB7CiAgICAgIGZvciAodmFyIGNsYXNzTm9kZSBpbiBsaWJyYXJ5LmNsYXNzZXMpIHsKICAgICAgICBfdG9wb2xvZ2ljYWxTb3J0VmlzaXQoY2xhc3NOb2RlLCBuZXcgU2V0PENsYXNzPigpKTsKICAgICAgfQogICAgICBrbm93bkxpYnJhcmllcy5hZGQobGlicmFyeSk7CiAgICB9CgogICAgX2luaXRpYWxpemVUb3BvbG9naWNhbGx5U29ydGVkQ2xhc3NlcyhfaW5mb0Zvci5rZXlzLCAwKTsKICB9CgogIC8vLyAtIEJ1aWxkIGluZGV4IG9mIGRpcmVjdCBjaGlsZHJlbi4KICAvLy8gLSBCdWlsZCBsaXN0IG9mIHN1cGVyIGNsYXNzZXMgYW5kIHN1cGVyIHR5cGVzLgogIC8vLyAtIEluZmVyIGFuZCByZWNvcmQgc3VwZXJ0eXBlcyBmb3IgdGhlIGNsYXNzZXMuCiAgLy8vIC0gUmVjb3JkIGludGVyZmFjZSBtZW1iZXJzLgogIC8vLyAtIFBlcmZvcm0gc29tZSBzYW5pdHkgY2hlY2tpbmcuCiAgLy8vIERvIHRoaXMgYWZ0ZXIgdGhlIHRvcG9sb2dpY2FsIHNvcnQgc28gdGhhdCBzdXBlciB0eXBlcyBhbHdheXMgb2NjdXIKICAvLy8gYmVmb3JlIHN1YnR5cGVzLgogIHZvaWQgX2luaXRpYWxpemVUb3BvbG9naWNhbGx5U29ydGVkQ2xhc3NlcygKICAgICAgSXRlcmFibGU8Q2xhc3M+IGNsYXNzZXMsIGludCBleHBlY3RlZFN0YXJ0aW5nVG9wb2xvZ2ljYWxJbmRleCkgewogICAgaW50IGkgPSBleHBlY3RlZFN0YXJ0aW5nVG9wb2xvZ2ljYWxJbmRleDsKICAgIGZvciAoQ2xhc3MgY2xhc3NfIGluIGNsYXNzZXMpIHsKICAgICAgX0NsYXNzSW5mbyBpbmZvID0gX2luZm9Gb3JbY2xhc3NfXTsKICAgICAgaWYgKGNsYXNzXy5zdXBlcnR5cGUgIT0gbnVsbCkgewogICAgICAgIF9pbmZvRm9yW2NsYXNzXy5zdXBlcnR5cGUuY2xhc3NOb2RlXS5kaXJlY3RFeHRlbmRlcnMuYWRkKGluZm8pOwogICAgICB9CiAgICAgIGlmIChjbGFzc18ubWl4ZWRJblR5cGUgIT0gbnVsbCkgewogICAgICAgIF9pbmZvRm9yW2NsYXNzXy5taXhlZEluVHlwZS5jbGFzc05vZGVdLmRpcmVjdE1peGVycy5hZGQoaW5mbyk7CiAgICAgIH0KICAgICAgZm9yICh2YXIgc3VwZXJ0eXBlIGluIGNsYXNzXy5pbXBsZW1lbnRlZFR5cGVzKSB7CiAgICAgICAgX2luZm9Gb3Jbc3VwZXJ0eXBlLmNsYXNzTm9kZV0uZGlyZWN0SW1wbGVtZW50ZXJzLmFkZChpbmZvKTsKICAgICAgfQogICAgICBfY29sbGVjdFN1cGVyc0ZvckNsYXNzKGNsYXNzXyk7CgogICAgICBpZiAoY2xhc3NfLnN1cGVydHlwZSAhPSBudWxsKSB7CiAgICAgICAgX3JlY29yZFN1cGVyVHlwZXMoaW5mbywgY2xhc3NfLnN1cGVydHlwZSk7CiAgICAgIH0KICAgICAgaWYgKGNsYXNzXy5taXhlZEluVHlwZSAhPSBudWxsKSB7CiAgICAgICAgbWl4aW5JbmZlcnJlcj8uaW5mZXIodGhpcywgY2xhc3NfKTsKICAgICAgICBfcmVjb3JkU3VwZXJUeXBlcyhpbmZvLCBjbGFzc18ubWl4ZWRJblR5cGUpOwogICAgICB9CiAgICAgIGZvciAoU3VwZXJ0eXBlIHN1cGVydHlwZSBpbiBjbGFzc18uaW1wbGVtZW50ZWRUeXBlcykgewogICAgICAgIF9yZWNvcmRTdXBlclR5cGVzKGluZm8sIHN1cGVydHlwZSk7CiAgICAgIH0KCiAgICAgIF9idWlsZEludGVyZmFjZU1lbWJlcnMoY2xhc3NfLCBpbmZvLCBzZXR0ZXJzOiB0cnVlKTsKICAgICAgX2J1aWxkSW50ZXJmYWNlTWVtYmVycyhjbGFzc18sIGluZm8sIHNldHRlcnM6IGZhbHNlKTsKCiAgICAgIGlmIChpbmZvID09IG51bGwpIHsKICAgICAgICB0aHJvdyAiTm8gaW5mbyBmb3IgJHtjbGFzc18ubmFtZX0gZnJvbSAke2NsYXNzXy5maWxlVXJpfS4iOwogICAgICB9CiAgICAgIGlmIChpbmZvLnRvcG9sb2dpY2FsSW5kZXggIT0gaSkgewogICAgICAgIHRocm93ICJVbmV4cGVjdGVkIHRvcG9sb2dpY2FsSW5kZXggKCR7aW5mby50b3BvbG9naWNhbEluZGV4fSAhPSAkaSkgIgogICAgICAgICAgICAiZm9yICR7Y2xhc3NfLm5hbWV9IGZyb20gJHtjbGFzc18uZmlsZVVyaX0uIjsKICAgICAgfQogICAgICBpKys7CiAgICB9CiAgfQoKICAvLy8gVXB3YXJkcyB0cmF2ZXJzYWwgb2YgdGhlIGNsYXNzIGhpZXJhcmNoeSB0aGF0IG9yZGVycyBjbGFzc2VzIHNvIHN1cGVyCiAgLy8vIHR5cGVzIGJlZm9yZSB0aGVpciBzdWJ0eXBlcy4KICAvLy8KICAvLy8gUmV0dXJucyB0aGUgZGVwdGggb2YgdGhlIHZpc2l0ZWQgY2xhc3MgKHRoZSBudW1iZXIgb2Ygc3RlcHMgaW4gdGhlIGxvbmdlc3QKICAvLy8gaW5oZXJpdGFuY2UgcGF0aCB0byB0aGUgcm9vdCBjbGFzcykuCiAgaW50IF90b3BTb3J0SW5kZXggPSAwOwogIGludCBfdG9wb2xvZ2ljYWxTb3J0VmlzaXQoQ2xhc3MgY2xhc3NOb2RlLCBTZXQ8Q2xhc3M+IGJlaW5nVmlzaXRlZCwKICAgICAge0xpc3Q8Q2xhc3M+IG9yZGVyZWRMaXN0fSkgewogICAgdmFyIGluZm8gPSBfaW5mb0ZvcltjbGFzc05vZGVdOwogICAgaWYgKGluZm8gIT0gbnVsbCkgewogICAgICByZXR1cm4gaW5mby5kZXB0aDsKICAgIH0KCiAgICBpZiAoIWJlaW5nVmlzaXRlZC5hZGQoY2xhc3NOb2RlKSkgewogICAgICB0aHJvdyAnQ3ljbGljIGluaGVyaXRhbmNlIGludm9sdmluZyAke2NsYXNzTm9kZS5uYW1lfSc7CiAgICB9CgogICAgaW5mbyA9IG5ldyBfQ2xhc3NJbmZvKGNsYXNzTm9kZSk7CgogICAgaW50IHN1cGVyRGVwdGggPSAtMTsKICAgIGlmIChjbGFzc05vZGUuc3VwZXJ0eXBlICE9IG51bGwpIHsKICAgICAgc3VwZXJEZXB0aCA9IG1heCgKICAgICAgICAgIHN1cGVyRGVwdGgsCiAgICAgICAgICBfdG9wb2xvZ2ljYWxTb3J0VmlzaXQoY2xhc3NOb2RlLnN1cGVydHlwZS5jbGFzc05vZGUsIGJlaW5nVmlzaXRlZCwKICAgICAgICAgICAgICBvcmRlcmVkTGlzdDogb3JkZXJlZExpc3QpKTsKICAgIH0KICAgIGlmIChjbGFzc05vZGUubWl4ZWRJblR5cGUgIT0gbnVsbCkgewogICAgICBzdXBlckRlcHRoID0gbWF4KAogICAgICAgICAgc3VwZXJEZXB0aCwKICAgICAgICAgIF90b3BvbG9naWNhbFNvcnRWaXNpdChjbGFzc05vZGUubWl4ZWRJblR5cGUuY2xhc3NOb2RlLCBiZWluZ1Zpc2l0ZWQsCiAgICAgICAgICAgICAgb3JkZXJlZExpc3Q6IG9yZGVyZWRMaXN0KSk7CiAgICB9CiAgICBmb3IgKHZhciBzdXBlcnR5cGUgaW4gY2xhc3NOb2RlLmltcGxlbWVudGVkVHlwZXMpIHsKICAgICAgc3VwZXJEZXB0aCA9IG1heCgKICAgICAgICAgIHN1cGVyRGVwdGgsCiAgICAgICAgICBfdG9wb2xvZ2ljYWxTb3J0VmlzaXQoc3VwZXJ0eXBlLmNsYXNzTm9kZSwgYmVpbmdWaXNpdGVkLAogICAgICAgICAgICAgIG9yZGVyZWRMaXN0OiBvcmRlcmVkTGlzdCkpOwogICAgfQogICAgX2J1aWxkRGVjbGFyZWRNZW1iZXJzKGNsYXNzTm9kZSwgaW5mbyk7CiAgICBfYnVpbGRJbXBsZW1lbnRlZE1lbWJlcnMoY2xhc3NOb2RlLCBpbmZvKTsKICAgIGluZm8udG9wb2xvZ2ljYWxJbmRleCA9IF90b3BTb3J0SW5kZXgrKzsKCiAgICBfaW5mb0ZvcltjbGFzc05vZGVdID0gaW5mbzsKICAgIG9yZGVyZWRMaXN0Py5hZGQoY2xhc3NOb2RlKTsKICAgIGJlaW5nVmlzaXRlZC5yZW1vdmUoY2xhc3NOb2RlKTsKICAgIHJldHVybiBpbmZvLmRlcHRoID0gc3VwZXJEZXB0aCArIDE7CiAgfQoKICB2b2lkIF9idWlsZERlY2xhcmVkTWVtYmVycyhDbGFzcyBjbGFzc05vZGUsIF9DbGFzc0luZm8gaW5mbykgewogICAgaWYgKGNsYXNzTm9kZS5taXhlZEluVHlwZSAhPSBudWxsKSB7CiAgICAgIF9DbGFzc0luZm8gbWl4ZWRJbmZvID0gX2luZm9Gb3JbY2xhc3NOb2RlLm1peGVkSW5UeXBlLmNsYXNzTm9kZV07CgogICAgICBMaXN0PE1lbWJlcj4gZGVjbGFyZWRHZXR0ZXJzQW5kQ2FsbHMgPSA8TWVtYmVyPltdOwogICAgICBmb3IgKE1lbWJlciBtaXhpbk1lbWJlciBpbiBtaXhlZEluZm8uZGVjbGFyZWRHZXR0ZXJzQW5kQ2FsbHMpIHsKICAgICAgICBpZiAobWl4aW5NZW1iZXIgaXMhIFByb2NlZHVyZSB8fAogICAgICAgICAgICAobWl4aW5NZW1iZXIgaXMgUHJvY2VkdXJlICYmCiAgICAgICAgICAgICAgICAhbWl4aW5NZW1iZXIuaXNOb1N1Y2hNZXRob2RGb3J3YXJkZXIpKSB7CiAgICAgICAgICBkZWNsYXJlZEdldHRlcnNBbmRDYWxscy5hZGQobWl4aW5NZW1iZXIpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgTGlzdDxNZW1iZXI+IGRlY2xhcmVkU2V0dGVycyA9IDxNZW1iZXI+W107CiAgICAgIGZvciAoTWVtYmVyIG1peGluTWVtYmVyIGluIG1peGVkSW5mby5kZWNsYXJlZFNldHRlcnMpIHsKICAgICAgICBpZiAobWl4aW5NZW1iZXIgaXMhIFByb2NlZHVyZSB8fAogICAgICAgICAgICAobWl4aW5NZW1iZXIgaXMgUHJvY2VkdXJlICYmCiAgICAgICAgICAgICAgICAhbWl4aW5NZW1iZXIuaXNOb1N1Y2hNZXRob2RGb3J3YXJkZXIpKSB7CiAgICAgICAgICBkZWNsYXJlZFNldHRlcnMuYWRkKG1peGluTWVtYmVyKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGluZm8uZGVjbGFyZWRHZXR0ZXJzQW5kQ2FsbHMgPSBkZWNsYXJlZEdldHRlcnNBbmRDYWxsczsKICAgICAgaW5mby5kZWNsYXJlZFNldHRlcnMgPSBkZWNsYXJlZFNldHRlcnM7CiAgICB9IGVsc2UgewogICAgICB2YXIgbWVtYmVycyA9IGluZm8uZGVjbGFyZWRHZXR0ZXJzQW5kQ2FsbHMgPSA8TWVtYmVyPltdOwogICAgICB2YXIgc2V0dGVycyA9IGluZm8uZGVjbGFyZWRTZXR0ZXJzID0gPE1lbWJlcj5bXTsKICAgICAgZm9yIChQcm9jZWR1cmUgcHJvY2VkdXJlIGluIGNsYXNzTm9kZS5wcm9jZWR1cmVzKSB7CiAgICAgICAgaWYgKHByb2NlZHVyZS5pc1N0YXRpYykgY29udGludWU7CiAgICAgICAgaWYgKHByb2NlZHVyZS5raW5kID09IFByb2NlZHVyZUtpbmQuU2V0dGVyKSB7CiAgICAgICAgICBzZXR0ZXJzLmFkZChwcm9jZWR1cmUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtZW1iZXJzLmFkZChwcm9jZWR1cmUpOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKEZpZWxkIGZpZWxkIGluIGNsYXNzTm9kZS5maWVsZHMpIHsKICAgICAgICBpZiAoZmllbGQuaXNTdGF0aWMpIGNvbnRpbnVlOwogICAgICAgIGlmIChmaWVsZC5oYXNJbXBsaWNpdEdldHRlcikgewogICAgICAgICAgbWVtYmVycy5hZGQoZmllbGQpOwogICAgICAgIH0KICAgICAgICBpZiAoZmllbGQuaGFzSW1wbGljaXRTZXR0ZXIpIHsKICAgICAgICAgIHNldHRlcnMuYWRkKGZpZWxkKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgbWVtYmVycy5zb3J0KENsYXNzSGllcmFyY2h5LmNvbXBhcmVNZW1iZXJzKTsKICAgICAgc2V0dGVycy5zb3J0KENsYXNzSGllcmFyY2h5LmNvbXBhcmVNZW1iZXJzKTsKICAgIH0KICB9CgogIHZvaWQgX2J1aWxkSW1wbGVtZW50ZWRNZW1iZXJzKENsYXNzIGNsYXNzTm9kZSwgX0NsYXNzSW5mbyBpbmZvKSB7CiAgICBMaXN0PE1lbWJlcj4gaW5oZXJpdGVkTWVtYmVyczsKICAgIExpc3Q8TWVtYmVyPiBpbmhlcml0ZWRTZXR0ZXJzOwogICAgaWYgKGNsYXNzTm9kZS5zdXBlcnR5cGUgPT0gbnVsbCkgewogICAgICBpbmhlcml0ZWRNZW1iZXJzID0gaW5oZXJpdGVkU2V0dGVycyA9IGNvbnN0IDxNZW1iZXI+W107CiAgICB9IGVsc2UgewogICAgICBfQ2xhc3NJbmZvIHN1cGVySW5mbyA9IF9pbmZvRm9yW2NsYXNzTm9kZS5zdXBlcnR5cGUuY2xhc3NOb2RlXTsKICAgICAgaW5oZXJpdGVkTWVtYmVycyA9IHN1cGVySW5mby5pbXBsZW1lbnRlZEdldHRlcnNBbmRDYWxsczsKICAgICAgaW5oZXJpdGVkU2V0dGVycyA9IHN1cGVySW5mby5pbXBsZW1lbnRlZFNldHRlcnM7CiAgICB9CiAgICBpbmZvLmltcGxlbWVudGVkR2V0dGVyc0FuZENhbGxzID0gX2luaGVyaXRNZW1iZXJzKAogICAgICAgIGluZm8uZGVjbGFyZWRHZXR0ZXJzQW5kQ2FsbHMsIGluaGVyaXRlZE1lbWJlcnMsCiAgICAgICAgc2tpcEFic3RyYWN0TWVtYmVyczogdHJ1ZSk7CiAgICBpbmZvLmltcGxlbWVudGVkU2V0dGVycyA9IF9pbmhlcml0TWVtYmVycygKICAgICAgICBpbmZvLmRlY2xhcmVkU2V0dGVycywgaW5oZXJpdGVkU2V0dGVycywKICAgICAgICBza2lwQWJzdHJhY3RNZW1iZXJzOiB0cnVlKTsKICB9CgogIExpc3Q8TWVtYmVyPiBfYnVpbGRJbnRlcmZhY2VNZW1iZXJzKENsYXNzIGNsYXNzTm9kZSwgX0NsYXNzSW5mbyBpbmZvLAogICAgICB7Ym9vbCBzZXR0ZXJzfSkgewogICAgaWYgKGluZm8gPT0gbnVsbCkgewogICAgICB0aHJvdyAiJHtjbGFzc05vZGUuZmlsZVVyaX06IE5vIGNsYXNzIGluZm8gZm9yICR7Y2xhc3NOb2RlLm5hbWV9IjsKICAgIH0KICAgIExpc3Q8TWVtYmVyPiBtZW1iZXJzID0KICAgICAgICBzZXR0ZXJzID8gaW5mby5pbnRlcmZhY2VTZXR0ZXJzIDogaW5mby5pbnRlcmZhY2VHZXR0ZXJzQW5kQ2FsbHM7CiAgICBpZiAobWVtYmVycyAhPSBudWxsKSByZXR1cm4gbWVtYmVyczsKICAgIExpc3Q8TWVtYmVyPiBhbGxJbmhlcml0ZWRNZW1iZXJzID0gPE1lbWJlcj5bXTsKICAgIExpc3Q8TWVtYmVyPiBkZWNsYXJlZCA9CiAgICAgICAgc2V0dGVycyA/IGluZm8uZGVjbGFyZWRTZXR0ZXJzIDogaW5mby5kZWNsYXJlZEdldHRlcnNBbmRDYWxsczsKICAgIHZvaWQgaW5oZXJpdEZyb20oU3VwZXJ0eXBlIHR5cGUpIHsKICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuOwogICAgICBMaXN0PE1lbWJlcj4gaW5oZXJpdGVkID0gX2J1aWxkSW50ZXJmYWNlTWVtYmVycygKICAgICAgICAgIHR5cGUuY2xhc3NOb2RlLCBfaW5mb0Zvclt0eXBlLmNsYXNzTm9kZV0sCiAgICAgICAgICBzZXR0ZXJzOiBzZXR0ZXJzKTsKICAgICAgaW5oZXJpdGVkID0gX2dldFVuc2hhZG93ZWRJbmhlcml0ZWRNZW1iZXJzKGRlY2xhcmVkLCBpbmhlcml0ZWQpOwogICAgICBhbGxJbmhlcml0ZWRNZW1iZXJzID0KICAgICAgICAgIENsYXNzSGllcmFyY2h5Lm1lcmdlU29ydGVkTGlzdHMoYWxsSW5oZXJpdGVkTWVtYmVycywgaW5oZXJpdGVkKTsKICAgIH0KCiAgICBpbmhlcml0RnJvbShjbGFzc05vZGUuc3VwZXJ0eXBlKTsKICAgIGluaGVyaXRGcm9tKGNsYXNzTm9kZS5taXhlZEluVHlwZSk7CiAgICBjbGFzc05vZGUuaW1wbGVtZW50ZWRUeXBlcy5mb3JFYWNoKGluaGVyaXRGcm9tKTsKICAgIG1lbWJlcnMgPSBfaW5oZXJpdE1lbWJlcnMoZGVjbGFyZWQsIGFsbEluaGVyaXRlZE1lbWJlcnMpOwogICAgaWYgKHNldHRlcnMpIHsKICAgICAgaW5mby5pbnRlcmZhY2VTZXR0ZXJzID0gbWVtYmVyczsKICAgIH0gZWxzZSB7CiAgICAgIGluZm8uaW50ZXJmYWNlR2V0dGVyc0FuZENhbGxzID0gbWVtYmVyczsKICAgIH0KICAgIHJldHVybiBtZW1iZXJzOwogIH0KCiAgLy8vIENvbXB1dGVzIHRoZSBsaXN0IG9mIGltcGxlbWVudGVkIG1lbWJlcnMsIGJhc2VkIG9uIHRoZSBkZWNsYXJlZCBpbnN0YW5jZQogIC8vLyBtZW1iZXJzIGFuZCBpbmhlcml0ZWQgaW5zdGFuY2UgbWVtYmVycy4KICAvLy8KICAvLy8gQm90aCBsaXN0cyBtdXN0IGJlIHNvcnRlZCBieSBuYW1lIGJlZm9yZWhhbmQuCiAgc3RhdGljIExpc3Q8TWVtYmVyPiBfaW5oZXJpdE1lbWJlcnMoCiAgICAgIExpc3Q8TWVtYmVyPiBkZWNsYXJlZCwgTGlzdDxNZW1iZXI+IGluaGVyaXRlZCwKICAgICAge2Jvb2wgc2tpcEFic3RyYWN0TWVtYmVyczogZmFsc2V9KSB7CiAgICBMaXN0PE1lbWJlcj4gcmVzdWx0ID0gPE1lbWJlcj5bXS4ubGVuZ3RoID0KICAgICAgICBkZWNsYXJlZC5sZW5ndGggKyBpbmhlcml0ZWQubGVuZ3RoOwogICAgLy8gU2luY2UgYm90aCBsaXN0cyBhcmUgc29ydGVkLCB3ZSBjYW4gZnVzZSB0aGVtIGxpa2UgaW4gbWVyZ2Ugc29ydC4KICAgIGludCBzdG9yZUluZGV4ID0gMDsKICAgIGludCBpID0gMCwgaiA9IDA7CiAgICB3aGlsZSAoaSA8IGRlY2xhcmVkLmxlbmd0aCAmJiBqIDwgaW5oZXJpdGVkLmxlbmd0aCkgewogICAgICBNZW1iZXIgZGVjbGFyZWRNZW1iZXIgPSBkZWNsYXJlZFtpXTsKICAgICAgTWVtYmVyIGluaGVyaXRlZE1lbWJlciA9IGluaGVyaXRlZFtqXTsKICAgICAgaWYgKHNraXBBYnN0cmFjdE1lbWJlcnMgJiYgZGVjbGFyZWRNZW1iZXIuaXNBYnN0cmFjdCkgewogICAgICAgICsraTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoc2tpcEFic3RyYWN0TWVtYmVycyAmJiBpbmhlcml0ZWRNZW1iZXIuaXNBYnN0cmFjdCkgewogICAgICAgICsrajsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpbnQgY29tcGFyaXNvbiA9CiAgICAgICAgICBDbGFzc0hpZXJhcmNoeS5jb21wYXJlTWVtYmVycyhkZWNsYXJlZE1lbWJlciwgaW5oZXJpdGVkTWVtYmVyKTsKICAgICAgaWYgKGNvbXBhcmlzb24gPCAwKSB7CiAgICAgICAgcmVzdWx0W3N0b3JlSW5kZXgrK10gPSBkZWNsYXJlZE1lbWJlcjsKICAgICAgICArK2k7CiAgICAgIH0gZWxzZSBpZiAoY29tcGFyaXNvbiA+IDApIHsKICAgICAgICByZXN1bHRbc3RvcmVJbmRleCsrXSA9IGluaGVyaXRlZE1lbWJlcjsKICAgICAgICArK2o7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0W3N0b3JlSW5kZXgrK10gPSBkZWNsYXJlZE1lbWJlcjsKICAgICAgICArK2k7CiAgICAgICAgKytqOyAvLyBNb3ZlIHBhc3Qgb3ZlcnJpZGRlbiBtZW1iZXIuCiAgICAgIH0KICAgIH0KICAgIC8vIE9uZSBvZiB0aGUgdHdvIGxpc3RzIGlzIG5vdyBleGhhdXN0ZWQsIGNvcHkgb3ZlciB0aGUgcmVtYWlucy4KICAgIHdoaWxlIChpIDwgZGVjbGFyZWQubGVuZ3RoKSB7CiAgICAgIE1lbWJlciBkZWNsYXJlZE1lbWJlciA9IGRlY2xhcmVkW2krK107CiAgICAgIGlmIChza2lwQWJzdHJhY3RNZW1iZXJzICYmIGRlY2xhcmVkTWVtYmVyLmlzQWJzdHJhY3QpIGNvbnRpbnVlOwogICAgICByZXN1bHRbc3RvcmVJbmRleCsrXSA9IGRlY2xhcmVkTWVtYmVyOwogICAgfQogICAgd2hpbGUgKGogPCBpbmhlcml0ZWQubGVuZ3RoKSB7CiAgICAgIE1lbWJlciBpbmhlcml0ZWRNZW1iZXIgPSBpbmhlcml0ZWRbaisrXTsKICAgICAgaWYgKHNraXBBYnN0cmFjdE1lbWJlcnMgJiYgaW5oZXJpdGVkTWVtYmVyLmlzQWJzdHJhY3QpIGNvbnRpbnVlOwogICAgICByZXN1bHRbc3RvcmVJbmRleCsrXSA9IGluaGVyaXRlZE1lbWJlcjsKICAgIH0KICAgIHJlc3VsdC5sZW5ndGggPSBzdG9yZUluZGV4OwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBzdWJzZXQgb2YgbWVtYmVycyBpbiBbaW5oZXJpdGVkXSBmb3Igd2hpY2ggYSBtZW1iZXIgd2l0aCB0aGUKICAvLy8gc2FtZSBuYW1lIGRvZXMgbm90IG9jY3VyIGluIFtkZWNsYXJlZF0uCiAgLy8vCiAgLy8vIFRoZSBpbnB1dCBsaXN0cyBtdXN0IGJlIHNvcnRlZCwgYW5kIHRoZSByZXR1cm5lZCBsaXN0IGlzIHNvcnRlZC4KICBzdGF0aWMgTGlzdDxNZW1iZXI+IF9nZXRVbnNoYWRvd2VkSW5oZXJpdGVkTWVtYmVycygKICAgICAgTGlzdDxNZW1iZXI+IGRlY2xhcmVkLCBMaXN0PE1lbWJlcj4gaW5oZXJpdGVkKSB7CiAgICBMaXN0PE1lbWJlcj4gcmVzdWx0ID0gPE1lbWJlcj5bXS4ubGVuZ3RoID0gaW5oZXJpdGVkLmxlbmd0aDsKICAgIGludCBzdG9yZUluZGV4ID0gMDsKICAgIGludCBpID0gMCwgaiA9IDA7CiAgICB3aGlsZSAoaSA8IGRlY2xhcmVkLmxlbmd0aCAmJiBqIDwgaW5oZXJpdGVkLmxlbmd0aCkgewogICAgICBNZW1iZXIgZGVjbGFyZWRNZW1iZXIgPSBkZWNsYXJlZFtpXTsKICAgICAgTWVtYmVyIGluaGVyaXRlZE1lbWJlciA9IGluaGVyaXRlZFtqXTsKICAgICAgaW50IGNvbXBhcmlzb24gPQogICAgICAgICAgQ2xhc3NIaWVyYXJjaHkuY29tcGFyZU1lbWJlcnMoZGVjbGFyZWRNZW1iZXIsIGluaGVyaXRlZE1lbWJlcik7CiAgICAgIGlmIChjb21wYXJpc29uIDwgMCkgewogICAgICAgICsraTsKICAgICAgfSBlbHNlIGlmIChjb21wYXJpc29uID4gMCkgewogICAgICAgIHJlc3VsdFtzdG9yZUluZGV4KytdID0gaW5oZXJpdGVkTWVtYmVyOwogICAgICAgICsrajsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBNb3ZlIHBhc3QgdGhlIHNoYWRvd2VkIG1lbWJlciwgYnV0IHJldGFpbiB0aGUgZGVjbGFyZWQgbWVtYmVyLCBhcwogICAgICAgIC8vIGl0IG1heSBzaGFkb3cgbXVsdGlwbGUgbWVtYmVycy4KICAgICAgICArK2o7CiAgICAgIH0KICAgIH0KICAgIC8vIElmIHRoZSBsaXN0IG9mIGRlY2xhcmVkIG1lbWJlcnMgaXMgZXhoYXVzdGVkLCBjb3B5IG92ZXIgdGhlIHJlbWFpbnMgb2YKICAgIC8vIHRoZSBpbmhlcml0ZWQgbWVtYmVycy4KICAgIHdoaWxlIChqIDwgaW5oZXJpdGVkLmxlbmd0aCkgewogICAgICByZXN1bHRbc3RvcmVJbmRleCsrXSA9IGluaGVyaXRlZFtqKytdOwogICAgfQogICAgcmVzdWx0Lmxlbmd0aCA9IHN0b3JlSW5kZXg7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBfcmVjb3JkU3VwZXJUeXBlcyhfQ2xhc3NJbmZvIHN1YkluZm8sIFN1cGVydHlwZSBzdXBlcnR5cGUpIHsKICAgIF9DbGFzc0luZm8gc3VwZXJJbmZvID0gX2luZm9Gb3Jbc3VwZXJ0eXBlLmNsYXNzTm9kZV07CiAgICBpZiAoc3VwZXJ0eXBlLnR5cGVBcmd1bWVudHMuaXNFbXB0eSkgewogICAgICBpZiAoc3VwZXJJbmZvLmdlbmVyaWNTdXBlclR5cGVzID09IG51bGwpIHJldHVybjsKICAgICAgLy8gQ29weSBvdmVyIHRoZSBzdXBlciB0eXBlIGVudHJpZXMuCiAgICAgIHN1YkluZm8uZ2VuZXJpY1N1cGVyVHlwZXMgPz89IDxDbGFzcywgTGlzdDxTdXBlcnR5cGU+Pnt9OwogICAgICBzdXBlckluZm8uZ2VuZXJpY1N1cGVyVHlwZXM/LmZvckVhY2goKENsYXNzIGtleSwgTGlzdDxTdXBlcnR5cGU+IHR5cGVzKSB7CiAgICAgICAgZm9yIChTdXBlcnR5cGUgdHlwZSBpbiB0eXBlcykgewogICAgICAgICAgc3ViSW5mby5yZWNvcmRHZW5lcmljU3VwZXJUeXBlKGtleSwgdHlwZSwgX29uQW1iaWd1b3VzU3VwZXJ0eXBlcyk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIENvcHkgb3ZlciBhbGwgdHJhbnNpdGl2ZSBnZW5lcmljIHN1cGVyIHR5cGVzLCBhbmQgc3Vic3RpdHV0ZSB0aGUKICAgICAgLy8gZnJlZSB2YXJpYWJsZXMgd2l0aCB0aG9zZSBwcm92aWRlZCBpbiBbc3VwZXJ0eXBlXS4KICAgICAgQ2xhc3Mgc3VwZXJjbGFzcyA9IHN1cGVydHlwZS5jbGFzc05vZGU7CiAgICAgIHZhciBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKAogICAgICAgICAgc3VwZXJjbGFzcy50eXBlUGFyYW1ldGVycywgc3VwZXJ0eXBlLnR5cGVBcmd1bWVudHMpOwogICAgICBzdWJJbmZvLmdlbmVyaWNTdXBlclR5cGVzID8/PSA8Q2xhc3MsIExpc3Q8U3VwZXJ0eXBlPj57fTsKICAgICAgc3VwZXJJbmZvLmdlbmVyaWNTdXBlclR5cGVzPy5mb3JFYWNoKChDbGFzcyBrZXksIExpc3Q8U3VwZXJ0eXBlPiB0eXBlcykgewogICAgICAgIGZvciAoU3VwZXJ0eXBlIHR5cGUgaW4gdHlwZXMpIHsKICAgICAgICAgIHN1YkluZm8ucmVjb3JkR2VuZXJpY1N1cGVyVHlwZShrZXksCiAgICAgICAgICAgICAgc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVTdXBlcnR5cGUodHlwZSksIF9vbkFtYmlndW91c1N1cGVydHlwZXMpOwogICAgICAgIH0KICAgICAgfSk7CgogICAgICBzdWJJbmZvLnJlY29yZEdlbmVyaWNTdXBlclR5cGUoCiAgICAgICAgICBzdXBlcmNsYXNzLCBzdXBlcnR5cGUsIF9vbkFtYmlndW91c1N1cGVydHlwZXMpOwogICAgfQogIH0KCiAgLy8vIEJ1aWxkIGxpc3RzIG9mIHN1cGVyIHR5cGVzIGFuZCBzdXBlciBjbGFzc2VzLgogIC8vLyBOb3RlIHRoYXQgdGhlIHN1cGVyIGNsYXNzIGFuZCBzdXBlciB0eXBlcyBvZiB0aGUgY2xhc3MgbXVzdCBhbHJlYWR5IGhhdmUKICAvLy8gaGFkIHRoZWlyIHN1cGVycyBjb2xsZWN0ZWQuCiAgdm9pZCBfY29sbGVjdFN1cGVyc0ZvckNsYXNzKENsYXNzIGNsYXNzXykgewogICAgX0NsYXNzSW5mbyBpbmZvID0gX2luZm9Gb3JbY2xhc3NfXTsKCiAgICB2YXIgc3VwZXJjbGFzc1NldEJ1aWxkZXIgPSBuZXcgX0ludGVydmFsTGlzdEJ1aWxkZXIoKQogICAgICAuLmFkZFNpbmdsZXRvbihpbmZvLnRvcG9sb2dpY2FsSW5kZXgpOwogICAgdmFyIHN1cGVydHlwZVNldEJ1aWxkZXIgPSBuZXcgX0ludGVydmFsTGlzdEJ1aWxkZXIoKQogICAgICAuLmFkZFNpbmdsZXRvbihpbmZvLnRvcG9sb2dpY2FsSW5kZXgpOwoKICAgIGlmIChjbGFzc18uc3VwZXJ0eXBlICE9IG51bGwpIHsKICAgICAgX0NsYXNzSW5mbyBzdXBlcnR5cGVJbmZvID0gX2luZm9Gb3JbY2xhc3NfLnN1cGVydHlwZS5jbGFzc05vZGVdOwogICAgICBzdXBlcmNsYXNzU2V0QnVpbGRlcgogICAgICAgICAgLmFkZEludGVydmFsTGlzdChzdXBlcnR5cGVJbmZvLnN1cGVyY2xhc3NJbnRlcnZhbExpc3QpOwogICAgICBzdXBlcnR5cGVTZXRCdWlsZGVyLmFkZEludGVydmFsTGlzdChzdXBlcnR5cGVJbmZvLnN1cGVydHlwZUludGVydmFsTGlzdCk7CiAgICB9CgogICAgaWYgKGNsYXNzXy5taXhlZEluVHlwZSAhPSBudWxsKSB7CiAgICAgIF9DbGFzc0luZm8gbWl4ZWRJblR5cGVJbmZvID0gX2luZm9Gb3JbY2xhc3NfLm1peGVkSW5UeXBlLmNsYXNzTm9kZV07CiAgICAgIHN1cGVydHlwZVNldEJ1aWxkZXIKICAgICAgICAgIC5hZGRJbnRlcnZhbExpc3QobWl4ZWRJblR5cGVJbmZvLnN1cGVydHlwZUludGVydmFsTGlzdCk7CiAgICB9CgogICAgZm9yIChTdXBlcnR5cGUgc3VwZXJ0eXBlIGluIGNsYXNzXy5pbXBsZW1lbnRlZFR5cGVzKSB7CiAgICAgIF9DbGFzc0luZm8gc3VwZXJ0eXBlSW5mbyA9IF9pbmZvRm9yW3N1cGVydHlwZS5jbGFzc05vZGVdOwogICAgICBzdXBlcnR5cGVTZXRCdWlsZGVyLmFkZEludGVydmFsTGlzdChzdXBlcnR5cGVJbmZvLnN1cGVydHlwZUludGVydmFsTGlzdCk7CiAgICB9CgogICAgaW5mby5zdXBlcmNsYXNzSW50ZXJ2YWxMaXN0ID0gc3VwZXJjbGFzc1NldEJ1aWxkZXIuYnVpbGRJbnRlcnZhbExpc3QoKTsKICAgIGluZm8uc3VwZXJ0eXBlSW50ZXJ2YWxMaXN0ID0gc3VwZXJ0eXBlU2V0QnVpbGRlci5idWlsZEludGVydmFsTGlzdCgpOwogIH0KCiAgLy8vIENyZWF0ZXMgYSBoaXN0b2dyYW0gc3VjaCB0aGF0IGluZGV4IGBOYCBjb250YWlucyB0aGUgbnVtYmVyIG9mIGNsYXNzZXMKICAvLy8gdGhhdCBoYXZlIGBOYCBpbnRlcnZhbHMgaW4gaXRzIHN1cGVydHlwZSBzZXQuCiAgLy8vCiAgLy8vIFRoZSBtb3JlIG51bWJlcnMgYXJlIGNvbmRlbnNlZCBuZWFyIHRoZSBiZWdpbm5pbmcsIHRoZSBtb3JlIGVmZmljaWVudCB0aGUKICAvLy8gaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgaXMuCiAgTGlzdDxpbnQ+IGdldEV4cGVuc2VIaXN0b2dyYW0oKSB7CiAgICB2YXIgcmVzdWx0ID0gPGludD5bXTsKICAgIGZvciAoQ2xhc3MgY2xhc3NfIGluIF9pbmZvRm9yLmtleXMpIHsKICAgICAgdmFyIGluZm8gPSBfaW5mb0ZvcltjbGFzc19dOwogICAgICBpbnQgaW50ZXJ2YWxzID0gaW5mby5zdXBlcnR5cGVJbnRlcnZhbExpc3QubGVuZ3RoIH4vIDI7CiAgICAgIGlmIChpbnRlcnZhbHMgPj0gcmVzdWx0Lmxlbmd0aCkgewogICAgICAgIGludCBvbGRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwogICAgICAgIHJlc3VsdC5sZW5ndGggPSBpbnRlcnZhbHMgKyAxOwogICAgICAgIHJlc3VsdC5maWxsUmFuZ2Uob2xkTGVuZ3RoLCByZXN1bHQubGVuZ3RoLCAwKTsKICAgICAgfQogICAgICByZXN1bHRbaW50ZXJ2YWxzXSArPSAxOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBhdmVyYWdlIG51bWJlciBvZiBpbnRlcnZhbHMgcGVyIHN1cGVydHlwZSByZWxhdGlvbiAobGVzcwogIC8vLyBpcyBiZXR0ZXIsIDEuMCBpcyBiYWQpLgogIC8vLwogIC8vLyBUaGlzIGlzIGFuIGVzdGltYXRlIG9mIHRoZSBtZW1vcnkgdXNlIGNvbXBhcmVkIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdAogIC8vLyBlbnVtZXJhdGVzIGFsbCBzdXBlcmNsYXNzL3N1cGVydHlwZSBwYWlycy4KICBkb3VibGUgZ2V0Q29tcHJlc3Npb25SYXRpbygpIHsKICAgIGludCBpbnRlcnZhbHMgPSAwOwogICAgaW50IHNpemVzID0gMDsKICAgIGZvciAoQ2xhc3MgY2xhc3NfIGluIF9pbmZvRm9yLmtleXMpIHsKICAgICAgdmFyIGluZm8gPSBfaW5mb0ZvcltjbGFzc19dOwogICAgICBpbnRlcnZhbHMgKz0gKGluZm8uc3VwZXJjbGFzc0ludGVydmFsTGlzdC5sZW5ndGggKwogICAgICAgICAgICAgIGluZm8uc3VwZXJ0eXBlSW50ZXJ2YWxMaXN0Lmxlbmd0aCkgfi8KICAgICAgICAgIDI7CiAgICAgIHNpemVzICs9IF9pbnRlcnZhbExpc3RTaXplKGluZm8uc3VwZXJjbGFzc0ludGVydmFsTGlzdCkgKwogICAgICAgICAgX2ludGVydmFsTGlzdFNpemUoaW5mby5zdXBlcnR5cGVJbnRlcnZhbExpc3QpOwogICAgfQoKICAgIHJldHVybiBzaXplcyA9PSAwID8gMS4wIDogaW50ZXJ2YWxzIC8gc2l6ZXM7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gaGFzaCB0YWJsZXMgc3RvcmluZyBoaWVyYXJjaHkgZGF0YS4KICBpbnQgZ2V0U3VwZXJUeXBlSGFzaFRhYmxlU2l6ZSgpIHsKICAgIGludCBzdW0gPSAwOwogICAgZm9yIChDbGFzcyBjbGFzc18gaW4gX2luZm9Gb3Iua2V5cykgewogICAgICBzdW0gKz0gX2luZm9Gb3JbY2xhc3NfXS5nZW5lcmljU3VwZXJUeXBlcz8ubGVuZ3RoID8/IDA7CiAgICB9CiAgICByZXR1cm4gc3VtOwogIH0KfQoKY2xhc3MgX0ludGVydmFsTGlzdEJ1aWxkZXIgewogIGZpbmFsIExpc3Q8aW50PiBldmVudHMgPSA8aW50PltdOwoKICB2b2lkIGFkZEludGVydmFsKGludCBzdGFydCwgaW50IGVuZCkgewogICAgLy8gQWRkIGFuIGV2ZW50IHBvaW50IGZvciBlYWNoIGludGVydmFsIGVuZCBwb2ludCwgdXNpbmcgdGhlIGxvdyBiaXQgdG8KICAgIC8vIGRpc3Rpbmd1aXNoIG9wZW5pbmcgZnJvbSBjbG9zaW5nIGVuZCBwb2ludHMuIENsb3NpbmcgZW5kIHBvaW50cyBzaG91bGQKICAgIC8vIGhhdmUgdGhlIGhpZ2ggYml0IHRvIGVuc3VyZSB0aGV5IG9jY3VyIGFmdGVyIGFuIG9wZW5pbmcgZW5kIHBvaW50LgogICAgZXZlbnRzLmFkZChzdGFydCA8PCAxKTsKICAgIGV2ZW50cy5hZGQoKGVuZCA8PCAxKSArIDEpOwogIH0KCiAgdm9pZCBhZGRTaW5nbGV0b24oaW50IHgpIHsKICAgIGFkZEludGVydmFsKHgsIHggKyAxKTsKICB9CgogIHZvaWQgYWRkSW50ZXJ2YWxMaXN0KFVpbnQzMkxpc3QgaW50ZXJ2YWxzKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVydmFscy5sZW5ndGg7IGkgKz0gMikgewogICAgICBhZGRJbnRlcnZhbChpbnRlcnZhbHNbaV0sIGludGVydmFsc1tpICsgMV0pOwogICAgfQogIH0KCiAgVWludDMyTGlzdCBidWlsZEludGVydmFsTGlzdCgpIHsKICAgIC8vIFNvcnQgdGhlIGV2ZW50IHBvaW50cyBhbmQgc3dlZXAgbGVmdCB0byByaWdodCB3aGlsZSB0cmFja2luZyBob3cgbWFueQogICAgLy8gaW50ZXJ2YWxzIHdlIGFyZSBjdXJyZW50bHkgaW5zaWRlLiAgUmVjb3JkIGFuIGludGVydmFsIGVuZCBwb2ludCB3aGVuIHRoZQogICAgLy8gbnVtYmVyIG9mIGludGVydmFscyBkcm9wIHRvIHplcm8gb3IgaW5jcmVhc2UgZnJvbSB6ZXJvIHRvIG9uZS4KICAgIC8vIEV2ZW50IHBvaW50cyBhcmUgZW5jb2RlZCBzbyB0aGF0IGFuIG9wZW5pbmcgZW5kIHBvaW50IG9jY3VyIGJlZm9yZSBhCiAgICAvLyBjbG9zaW5nIGVuZCBwb2ludCBhdCB0aGUgc2FtZSB2YWx1ZS4KICAgIGV2ZW50cy5zb3J0KCk7CiAgICBpbnQgaW5zaWRlQ291bnQgPSAwOyAvLyBUaGUgbnVtYmVyIG9mIGludGVydmFscyB3ZSBhcmUgY3VycmVudGx5IGluc2lkZS4KICAgIGludCBzdG9yZUluZGV4ID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgIGludCBldmVudCA9IGV2ZW50c1tpXTsKICAgICAgaWYgKGV2ZW50ICYgMSA9PSAwKSB7CiAgICAgICAgLy8gU3RhcnQgcG9pbnQKICAgICAgICArK2luc2lkZUNvdW50OwogICAgICAgIGlmIChpbnNpZGVDb3VudCA9PSAxKSB7CiAgICAgICAgICAvLyBTdG9yZSB0aGUgcmVzdWx0cyB0ZW1wb3JhcmlseSBiYWNrIGluIHRoZSBldmVudCBhcnJheS4KICAgICAgICAgIGV2ZW50c1tzdG9yZUluZGV4KytdID0gZXZlbnQgPj4gMTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gRW5kIHBvaW50CiAgICAgICAgLS1pbnNpZGVDb3VudDsKICAgICAgICBpZiAoaW5zaWRlQ291bnQgPT0gMCkgewogICAgICAgICAgZXZlbnRzW3N0b3JlSW5kZXgrK10gPSBldmVudCA+PiAxOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy8gQ29weSB0aGUgcmVzdWx0cyBvdmVyIHRvIGEgdHlwZWQgYXJyYXkgb2YgdGhlIGNvcnJlY3QgbGVuZ3RoLgogICAgdmFyIHJlc3VsdCA9IG5ldyBVaW50MzJMaXN0KHN0b3JlSW5kZXgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdG9yZUluZGV4OyArK2kpIHsKICAgICAgcmVzdWx0W2ldID0gZXZlbnRzW2ldOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KCmJvb2wgX2ludGVydmFsTGlzdENvbnRhaW5zKFVpbnQzMkxpc3QgaW50ZXJ2YWxMaXN0LCBpbnQgeCkgewogIGludCBsb3cgPSAwLCBoaWdoID0gaW50ZXJ2YWxMaXN0Lmxlbmd0aCAtIDE7CiAgaWYgKGhpZ2ggPT0gLTEgfHwgeCA8IGludGVydmFsTGlzdFswXSB8fCBpbnRlcnZhbExpc3RbaGlnaF0gPD0geCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICAvLyBGaW5kIHRoZSBsb3dlciBib3VuZCBvZiB4IGluIHRoZSBsaXN0LgogIC8vIElmIHRoZSBsb3dlciBib3VuZCBpcyBhdCBhbiBldmVuIGluZGV4LCB0aGUgbG93ZXIgYm91bmQgaXMgYW4gb3BlbmluZyBwb2ludAogIC8vIG9mIGFuIGludGVydmFsIHRoYXQgY29udGFpbnMgeCwgb3RoZXJ3aXNlIGl0IGlzIGEgY2xvc2luZyBwb2ludCBvZiBhbgogIC8vIGludGVydmFsIGJlbG93IHggYW5kIHRoZXJlIGlzIG5vIGludGVydmFsIGNvbnRhaW5pbmcgeC4KICB3aGlsZSAobG93IDwgaGlnaCkgewogICAgaW50IG1pZCA9IGhpZ2ggLSAoKGhpZ2ggLSBsb3cpID4+IDEpOyAvLyBHZXQgbWlkZGxlLCByb3VuZGluZyB1cC4KICAgIGludCBwaXZvdCA9IGludGVydmFsTGlzdFttaWRdOwogICAgaWYgKHBpdm90IDw9IHgpIHsKICAgICAgbG93ID0gbWlkOwogICAgfSBlbHNlIHsKICAgICAgaGlnaCA9IG1pZCAtIDE7CiAgICB9CiAgfQogIHJldHVybiBsb3cgPT0gaGlnaCAmJiAobG93ICYgMSkgPT0gMDsKfQoKaW50IF9pbnRlcnZhbExpc3RTaXplKFVpbnQzMkxpc3QgaW50ZXJ2YWxMaXN0KSB7CiAgaW50IHNpemUgPSAwOwogIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJ2YWxMaXN0Lmxlbmd0aDsgaSArPSAyKSB7CiAgICBzaXplICs9IGludGVydmFsTGlzdFtpICsgMV0gLSBpbnRlcnZhbExpc3RbaV07CiAgfQogIHJldHVybiBzaXplOwp9CgpjbGFzcyBfQ2xhc3NJbmZvIHsKICBmaW5hbCBDbGFzcyBjbGFzc05vZGU7CiAgaW50IHRvcG9sb2dpY2FsSW5kZXggPSAwOwogIGludCBkZXB0aCA9IDA7CgogIC8vIFN1cGVyIHR5cGVzIG11c3QgYWx3YXlzIG9jY3VyIGJlZm9yZSBzdWJ0eXBlcyBpbiB0aGVzZSBsaXN0cy4KICAvLyBGb3IgZXhhbXBsZToKICAvLwogIC8vICAgY2xhc3MgQSBleHRlbmRzIE9iamVjdAogIC8vICAgY2xhc3MgQiBleHRlbmRzIE9iamVjdCBpbXBsZW1lbnRzIEEKICAvLwogIC8vIEhlcmUgYEFgIG11c3Qgb2NjdXIgYmVmb3JlIGBCYCBpbiB0aGUgbGlzdCBvZiBkaXJlY3QgZXh0ZW5kZXJzIG9mIE9iamVjdCwKICAvLyBiZWNhdXNlIGBCYCBpcyBhIHN1YnR5cGUgb2YgYEFgLgogIGZpbmFsIFNldDxfQ2xhc3NJbmZvPiBkaXJlY3RFeHRlbmRlcnMgPSBuZXcgTGlua2VkSGFzaFNldDxfQ2xhc3NJbmZvPigpOwogIGZpbmFsIFNldDxfQ2xhc3NJbmZvPiBkaXJlY3RNaXhlcnMgPSBuZXcgTGlua2VkSGFzaFNldDxfQ2xhc3NJbmZvPigpOwogIGZpbmFsIFNldDxfQ2xhc3NJbmZvPiBkaXJlY3RJbXBsZW1lbnRlcnMgPSBuZXcgTGlua2VkSGFzaFNldDxfQ2xhc3NJbmZvPigpOwoKICBVaW50MzJMaXN0IHN1cGVyY2xhc3NJbnRlcnZhbExpc3Q7CiAgVWludDMyTGlzdCBzdXBlcnR5cGVJbnRlcnZhbExpc3Q7CgogIExpc3Q8X0NsYXNzSW5mbz4gbGVhc3RVcHBlckJvdW5kSW5mb3M7CgogIC8vLyBNYXBzIGdlbmVyaWMgc3VwZXJ0eXBlIGNsYXNzZXMgdG8gdGhlIGluc3RhbnRpYXRpb24gaW1wbGVtZW50ZWQgYnkgdGhpcwogIC8vLyBjbGFzcy4KICAvLy8KICAvLy8gRS5nLiBgTGlzdGAgbWFwcyB0byBgTGlzdDxTdHJpbmc+YCBmb3IgYSBjbGFzcyB0aGF0IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkKICAvLy8gaW1wbGVtZW50cyBgTGlzdDxTdHJpbmc+YC4KICBNYXA8Q2xhc3MsIExpc3Q8U3VwZXJ0eXBlPj4gZ2VuZXJpY1N1cGVyVHlwZXM7CgogIC8vLyBJbnN0YW5jZSBmaWVsZHMsIGdldHRlcnMsIG1ldGhvZHMsIGFuZCBvcGVyYXRvcnMgZGVjbGFyZWQgaW4gdGhpcyBjbGFzcwogIC8vLyBvciBpdHMgbWl4ZWQtaW4gY2xhc3MsIHNvcnRlZCBhY2NvcmRpbmcgdG8gW19jb21wYXJlTWVtYmVyc10uCiAgTGlzdDxNZW1iZXI+IGRlY2xhcmVkR2V0dGVyc0FuZENhbGxzOwoKICAvLy8gTm9uLWZpbmFsIGluc3RhbmNlIGZpZWxkcyBhbmQgc2V0dGVycyBkZWNsYXJlZCBpbiB0aGlzIGNsYXNzIG9yIGl0cwogIC8vLyBtaXhlZC1pbiBjbGFzcywgc29ydGVkIGFjY29yZGluZyB0byBbX2NvbXBhcmVNZW1iZXJzXS4KICBMaXN0PE1lbWJlcj4gZGVjbGFyZWRTZXR0ZXJzOwoKICAvLy8gSW5zdGFuY2UgZmllbGRzLCBnZXR0ZXJzLCBtZXRob2RzLCBhbmQgb3BlcmF0b3JzIGltcGxlbWVudGVkIGJ5IHRoaXMgY2xhc3MKICAvLy8gKGRlY2xhcmVkIG9yIGluaGVyaXRlZCkuCiAgTGlzdDxNZW1iZXI+IGltcGxlbWVudGVkR2V0dGVyc0FuZENhbGxzOwoKICAvLy8gTm9uLWZpbmFsIGluc3RhbmNlIGZpZWxkcyBhbmQgc2V0dGVycyBpbXBsZW1lbnRlZCBieSB0aGlzIGNsYXNzCiAgLy8vIChkZWNsYXJlZCBvciBpbmhlcml0ZWQpLgogIExpc3Q8TWVtYmVyPiBpbXBsZW1lbnRlZFNldHRlcnM7CgogIExpc3Q8TWVtYmVyPiBpbnRlcmZhY2VHZXR0ZXJzQW5kQ2FsbHM7CiAgTGlzdDxNZW1iZXI+IGludGVyZmFjZVNldHRlcnM7CgogIF9DbGFzc0luZm8odGhpcy5jbGFzc05vZGUpOwoKICBib29sIGlzU3ViY2xhc3NPZihfQ2xhc3NJbmZvIG90aGVyKSB7CiAgICByZXR1cm4gX2ludGVydmFsTGlzdENvbnRhaW5zKAogICAgICAgIHN1cGVyY2xhc3NJbnRlcnZhbExpc3QsIG90aGVyLnRvcG9sb2dpY2FsSW5kZXgpOwogIH0KCiAgYm9vbCBpc1N1YnR5cGVPZihfQ2xhc3NJbmZvIG90aGVyKSB7CiAgICByZXR1cm4gX2ludGVydmFsTGlzdENvbnRhaW5zKHN1cGVydHlwZUludGVydmFsTGlzdCwgb3RoZXIudG9wb2xvZ2ljYWxJbmRleCk7CiAgfQoKICB2b2lkIHJlY29yZEdlbmVyaWNTdXBlclR5cGUoQ2xhc3MgY2xzLCBTdXBlcnR5cGUgdHlwZSwKICAgICAgSGFuZGxlQW1iaWd1b3VzU3VwZXJ0eXBlcyBvbkFtYmlndW91c1N1cGVydHlwZXMpIHsKICAgIExpc3Q8U3VwZXJ0eXBlPiBleGlzdGluZyA9IGdlbmVyaWNTdXBlclR5cGVzW2Nsc107CiAgICBpZiAoZXhpc3RpbmcgPT0gbnVsbCkgewogICAgICBnZW5lcmljU3VwZXJUeXBlc1tjbHNdID0gPFN1cGVydHlwZT5bdHlwZV07CiAgICB9IGVsc2UgaWYgKHR5cGUgIT0gZXhpc3RpbmcuZmlyc3QpIHsKICAgICAgZXhpc3RpbmcuYWRkKHR5cGUpOwogICAgICBvbkFtYmlndW91c1N1cGVydHlwZXMoY2xhc3NOb2RlLCBleGlzdGluZy5maXJzdCwgdHlwZSk7CiAgICB9CiAgfQp9CgovLy8gQW4gaW1tdXRhYmxlIHNldCBvZiBjbGFzc2VzLgpjbGFzcyBDbGFzc1NldCBleHRlbmRzIEl0ZXJhYmxlQmFzZTxDbGFzcz4gewogIGZpbmFsIFNldDxDbGFzcz4gX2NsYXNzZXM7CiAgQ2xhc3NTZXQodGhpcy5fY2xhc3Nlcyk7CgogIGJvb2wgY29udGFpbnMoT2JqZWN0IGNsYXNzXykgewogICAgcmV0dXJuIF9jbGFzc2VzLmNvbnRhaW5zKGNsYXNzXyk7CiAgfQoKICBDbGFzc1NldCB1bmlvbihDbGFzc1NldCBvdGhlcikgewogICAgU2V0PENsYXNzPiByZXN1bHQgPSBuZXcgU2V0PENsYXNzPi5mcm9tKF9jbGFzc2VzKTsKICAgIHJlc3VsdC5hZGRBbGwob3RoZXIuX2NsYXNzZXMpOwogICAgcmV0dXJuIG5ldyBDbGFzc1NldChyZXN1bHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmF0b3I8Q2xhc3M+IGdldCBpdGVyYXRvciA9PiBfY2xhc3Nlcy5pdGVyYXRvcjsKfQoKLy8vIEhlYXAgZm9yIHVzZSBpbiBjb21wdXRpbmcgbGVhc3QgdXBwZXIgYm91bmRzLgovLy8KLy8vIFRoZSBoZWFwIGlzIHNvcnRlZCBzdWNoIHRoYXQgY2xhc3NlcyB0aGF0IGFyZSBkZWVwZXN0IGluIHRoZSBoaWVyYXJjaHkKLy8vIGFyZSByZW1vdmVkIGZpcnN0OyBpbiB0aGUgY2FzZSBvZiB0aWVzLCBjbGFzc2VzIHdpdGggbG93ZXIgdG9wb2xvZ2ljYWwgc29ydAovLy8gaW5kZXggYXJlIHJlbW92ZWQgZmlyc3QuCmNsYXNzIF9MdWJIZWFwIGV4dGVuZHMgSGVhcDxfQ2xhc3NJbmZvPiB7CiAgQG92ZXJyaWRlCiAgYm9vbCBzb3J0c0JlZm9yZShfQ2xhc3NJbmZvIGEsIF9DbGFzc0luZm8gYikgPT4gc29ydHNCZWZvcmVTdGF0aWMoYSwgYik7CgogIHN0YXRpYyBib29sIHNvcnRzQmVmb3JlU3RhdGljKF9DbGFzc0luZm8gYSwgX0NsYXNzSW5mbyBiKSB7CiAgICBpZiAoYS5kZXB0aCA+IGIuZGVwdGgpIHJldHVybiB0cnVlOwogICAgaWYgKGEuZGVwdGggPCBiLmRlcHRo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YnJhcnkga2VybmVsLmNvcmVfdHlwZXM7CgppbXBvcnQgJ2FzdC5kYXJ0JzsKaW1wb3J0ICdsaWJyYXJ5X2luZGV4LmRhcnQnOwoKLy8vIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgY2xhc3NlcyBhbmQgbGlicmFyaWVzIGluIHRoZSBjb3JlIGxpYnJhcmllcy4KY2xhc3MgQ29yZVR5cGVzIHsKICBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiByZXF1aXJlZENsYXNzZXMgPSB7CiAgICAnZGFydDpjb3JlJzogWwogICAgICAnT2JqZWN0JywKICAgICAgJ051bGwnLAogICAgICAnYm9vbCcsCiAgICAgICdpbnQnLAogICAgICAnbnVtJywKICAgICAgJ2RvdWJsZScsCiAgICAgICdTdHJpbmcnLAogICAgICAnTGlzdCcsCiAgICAgICdNYXAnLAogICAgICAnSXRlcmFibGUnLAogICAgICAnSXRlcmF0b3InLAogICAgICAnU3ltYm9sJywKICAgICAgJ1R5cGUnLAogICAgICAnRnVuY3Rpb24nLAogICAgICAnSW52b2NhdGlvbicsCiAgICAgICdGYWxsVGhyb3VnaEVycm9yJywKICAgIF0sCiAgICAnZGFydDpfaW50ZXJuYWwnOiBbCiAgICAgICdTeW1ib2wnLAogICAgXSwKICAgICdkYXJ0OmFzeW5jJzogWwogICAgICAnRnV0dXJlJywKICAgICAgJ1N0cmVhbScsCiAgICBdCiAgfTsKCiAgZmluYWwgTGlicmFyeUluZGV4IGluZGV4OwoKICBMaWJyYXJ5IF9jb3JlTGlicmFyeTsKICBDbGFzcyBfb2JqZWN0Q2xhc3M7CiAgQ2xhc3MgX251bGxDbGFzczsKICBDbGFzcyBfYm9vbENsYXNzOwogIENsYXNzIF9pbnRDbGFzczsKICBDbGFzcyBfbnVtQ2xhc3M7CiAgQ2xhc3MgX2RvdWJsZUNsYXNzOwogIENsYXNzIF9zdHJpbmdDbGFzczsKICBDbGFzcyBfbGlzdENsYXNzOwogIENsYXNzIF9zZXRDbGFzczsKICBDbGFzcyBfbWFwQ2xhc3M7CiAgQ2xhc3MgX2l0ZXJhYmxlQ2xhc3M7CiAgQ2xhc3MgX2l0ZXJhdG9yQ2xhc3M7CiAgQ2xhc3MgX3N5bWJvbENsYXNzOwogIENsYXNzIF90eXBlQ2xhc3M7CiAgQ2xhc3MgX2Z1bmN0aW9uQ2xhc3M7CiAgQ2xhc3MgX2ludm9jYXRpb25DbGFzczsKICBDbGFzcyBfaW52b2NhdGlvbk1pcnJvckNsYXNzOwogIENvbnN0cnVjdG9yIF9pbnZvY2F0aW9uTWlycm9yV2l0aFR5cGVDb25zdHJ1Y3RvcjsKICBDb25zdHJ1Y3RvciBfbm9TdWNoTWV0aG9kRXJyb3JEZWZhdWx0Q29uc3RydWN0b3I7CiAgUHJvY2VkdXJlIF9saXN0RnJvbUNvbnN0cnVjdG9yOwogIFByb2NlZHVyZSBfbGlzdFVubW9kaWZpYWJsZUNvbnN0cnVjdG9yOwogIFByb2NlZHVyZSBfaWRlbnRpY2FsUHJvY2VkdXJlOwogIENvbnN0cnVjdG9yIF9mYWxsVGhyb3VnaEVycm9yVXJsQW5kTGluZUNvbnN0cnVjdG9yOwogIFByb2NlZHVyZSBfb2JqZWN0RXF1YWxzOwogIFByb2NlZHVyZSBfbWFwVW5tb2RpZmlhYmxlOwoKICBDbGFzcyBfaW50ZXJuYWxTeW1ib2xDbGFzczsKCiAgTGlicmFyeSBfYXN5bmNMaWJyYXJ5OwogIENsYXNzIF9mdXR1cmVDbGFzczsKICBDbGFzcyBfc3RhY2tUcmFjZUNsYXNzOwogIENsYXNzIF9zdHJlYW1DbGFzczsKICBDbGFzcyBfYXN5bmNBd2FpdENvbXBsZXRlckNsYXNzOwogIENsYXNzIF9mdXR1cmVPckNsYXNzOwogIENvbnN0cnVjdG9yIF9hc3luY0F3YWl0Q29tcGxldGVyQ29uc3RydWN0b3I7CiAgUHJvY2VkdXJlIF9jb21wbGV0ZU9uQXN5bmNSZXR1cm5Qcm9jZWR1cmU7CiAgUHJvY2VkdXJlIF9jb21wbGV0ZXJDb21wbGV0ZUVycm9yOwogIENvbnN0cnVjdG9yIF9zeW5jSXRlcmFibGVEZWZhdWx0Q29uc3RydWN0b3I7CiAgQ29uc3RydWN0b3IgX3N0cmVhbUl0ZXJhdG9yRGVmYXVsdENvbnN0cnVjdG9yOwogIENvbnN0cnVjdG9yIF9hc3luY1N0YXJTdHJlYW1Db250cm9sbGVyRGVmYXVsdENvbnN0cnVjdG9yOwogIFByb2NlZHVyZSBfYXN5bmNTdGFyTGlzdGVuSGVscGVyUHJvY2VkdXJlOwogIFByb2NlZHVyZSBfYXN5bmNTdGFyTW92ZU5leHRIZWxwZXJQcm9jZWR1cmU7CiAgUHJvY2VkdXJlIF9hc3luY1N0YWNrVHJhY2VIZWxwZXJQcm9jZWR1cmU7CiAgUHJvY2VkdXJlIF9hc3luY1RoZW5XcmFwcGVySGVscGVyUHJvY2VkdXJlOwogIFByb2NlZHVyZSBfYXN5bmNFcnJvcldyYXBwZXJIZWxwZXJQcm9jZWR1cmU7CiAgUHJvY2VkdXJlIF9hd2FpdEhlbHBlclByb2NlZHVyZTsKICBQcm9jZWR1cmUgX2Jvb2xGcm9tRW52aXJvbm1lbnQ7CgogIC8vLyBUaGUgYGRhcnQ6bWlycm9yc2AgbGlicmFyeSwgb3IgYG51bGxgIGlmIHRoZSBjb21wb25lbnQgZG9lcyBub3QgdXNlIGl0LgogIExpYnJhcnkgX21pcnJvcnNMaWJyYXJ5OwoKICBDbGFzcyBfcHJhZ21hQ2xhc3M7CiAgRmllbGQgX3ByYWdtYU5hbWU7CiAgRmllbGQgX3ByYWdtYU9wdGlvbnM7CiAgQ29uc3RydWN0b3IgX3ByYWdtYUNvbnN0cnVjdG9yOwoKICBDb3JlVHlwZXMoQ29tcG9uZW50IGNvbXBvbmVudCkKICAgICAgOiBpbmRleCA9IG5ldyBMaWJyYXJ5SW5kZXguY29yZUxpYnJhcmllcyhjb21wb25lbnQpOwoKICBQcm9jZWR1cmUgZ2V0IGFzeW5jRXJyb3JXcmFwcGVySGVscGVyUHJvY2VkdXJlIHsKICAgIHJldHVybiBfYXN5bmNFcnJvcldyYXBwZXJIZWxwZXJQcm9jZWR1cmUgPz89CiAgICAgICAgaW5kZXguZ2V0VG9wTGV2ZWxNZW1iZXIoJ2RhcnQ6YXN5bmMnLCAnX2FzeW5jRXJyb3JXcmFwcGVySGVscGVyJyk7CiAgfQoKICBMaWJyYXJ5IGdldCBhc3luY0xpYnJhcnkgewogICAgcmV0dXJuIF9hc3luY0xpYnJhcnkgPz89IGluZGV4LmdldExpYnJhcnkoJ2RhcnQ6YXN5bmMnKTsKICB9CgogIE1lbWJlciBnZXQgYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckFkZCB7CiAgICByZXR1cm4gaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmFzeW5jJywgJ19Bc3luY1N0YXJTdHJlYW1Db250cm9sbGVyJywgJ2FkZCcpOwogIH0KCiAgTWVtYmVyIGdldCBhc3luY1N0YXJTdHJlYW1Db250cm9sbGVyQWRkRXJyb3IgewogICAgcmV0dXJuIGluZGV4LmdldE1lbWJlcigKICAgICAgICAnZGFydDphc3luYycsICdfQXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlcicsICdhZGRFcnJvcicpOwogIH0KCiAgTWVtYmVyIGdldCBhc3luY1N0YXJTdHJlYW1Db250cm9sbGVyQWRkU3RyZWFtIHsKICAgIHJldHVybiBpbmRleC5nZXRNZW1iZXIoCiAgICAgICAgJ2RhcnQ6YXN5bmMnLCAnX0FzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXInLCAnYWRkU3RyZWFtJyk7CiAgfQoKICBDbGFzcyBnZXQgYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckNsYXNzIHsKICAgIHJldHVybiBpbmRleC5nZXRDbGFzcygnZGFydDphc3luYycsICdfQXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlcicpOwogIH0KCiAgTWVtYmVyIGdldCBhc3luY1N0YXJTdHJlYW1Db250cm9sbGVyQ2xvc2UgewogICAgcmV0dXJuIGluZGV4LmdldE1lbWJlcignZGFydDphc3luYycsICdfQXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlcicsICdjbG9zZScpOwogIH0KCiAgQ29uc3RydWN0b3IgZ2V0IGFzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJEZWZhdWx0Q29uc3RydWN0b3IgewogICAgcmV0dXJuIF9hc3luY1N0YXJTdHJlYW1Db250cm9sbGVyRGVmYXVsdENvbnN0cnVjdG9yID8/PQogICAgICAgIGluZGV4LmdldE1lbWJlcignZGFydDphc3luYycsICdfQXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlcicsICcnKTsKICB9CgogIE1lbWJlciBnZXQgYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlclN0cmVhbSB7CiAgICByZXR1cm4gaW5kZXguZ2V0TWVtYmVyKAogICAgICAgICdkYXJ0OmFzeW5jJywgJ19Bc3luY1N0YXJTdHJlYW1Db250cm9sbGVyJywgJ2dldDpzdHJlYW0nKTsKICB9CgogIFByb2NlZHVyZSBnZXQgYXN5bmNTdGFyTGlzdGVuSGVscGVyIHsKICAgIHJldHVybiBfYXN5bmNTdGFyTGlzdGVuSGVscGVyUHJvY2VkdXJlID8/PQogICAgICAgIGluZGV4LmdldFRvcExldmVsTWVtYmVyKCdkYXJ0OmFzeW5jJywgJ19hc3luY1N0YXJMaXN0ZW5IZWxwZXInKTsKICB9CgogIFByb2NlZHVyZSBnZXQgYXN5bmNTdGFyTW92ZU5leHRIZWxwZXIgewogICAgcmV0dXJuIF9hc3luY1N0YXJNb3ZlTmV4dEhlbHBlclByb2NlZHVyZSA/Pz0KICAgICAgICBpbmRleC5nZXRUb3BMZXZlbE1lbWJlcignZGFydDphc3luYycsICdfYXN5bmNTdGFyTW92ZU5leHRIZWxwZXInKTsKICB9CgogIFByb2NlZHVyZSBnZXQgYXN5bmNTdGFja1RyYWNlSGVscGVyUHJvY2VkdXJlIHsKICAgIHJldHVybiBfYXN5bmNTdGFja1RyYWNlSGVscGVyUHJvY2VkdXJlID8/PQogICAgICAgIGluZGV4LmdldFRvcExldmVsTWVtYmVyKCdkYXJ0OmFzeW5jJywgJ19hc3luY1N0YWNrVHJhY2VIZWxwZXInKTsKICB9CgogIFByb2NlZHVyZSBnZXQgYXN5bmNUaGVuV3JhcHBlckhlbHBlclByb2NlZHVyZSB7CiAgICByZXR1cm4gX2FzeW5jVGhlbldyYXBwZXJIZWxwZXJQcm9jZWR1cmUgPz89CiAgICAgICAgaW5kZXguZ2V0VG9wTGV2ZWxNZW1iZXIoJ2RhcnQ6YXN5bmMnLCAnX2FzeW5jVGhlbldyYXBwZXJIZWxwZXInKTsKICB9CgogIFByb2NlZHVyZSBnZXQgYXdhaXRIZWxwZXJQcm9jZWR1cmUgewogICAgcmV0dXJuIF9hd2FpdEhlbHBlclByb2NlZHVyZSA/Pz0KICAgICAgICBpbmRleC5nZXRUb3BMZXZlbE1lbWJlcignZGFydDphc3luYycsICdfYXdhaXRIZWxwZXInKTsKICB9CgogIENsYXNzIGdldCBib29sQ2xhc3MgewogICAgcmV0dXJuIF9ib29sQ2xhc3MgPz89IGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnYm9vbCcpOwogIH0KCiAgQ2xhc3MgZ2V0IGFzeW5jQXdhaXRDb21wbGV0ZXJDbGFzcyB7CiAgICByZXR1cm4gX2FzeW5jQXdhaXRDb21wbGV0ZXJDbGFzcyA/Pz0KICAgICAgICBpbmRleC5nZXRDbGFzcygnZGFydDphc3luYycsICdfQXN5bmNBd2FpdENvbXBsZXRlcicpOwogIH0KCiAgQ29uc3RydWN0b3IgZ2V0IGFzeW5jQXdhaXRDb21wbGV0ZXJDb25zdHJ1Y3RvciB7CiAgICByZXR1cm4gX2FzeW5jQXdhaXRDb21wbGV0ZXJDb25zdHJ1Y3RvciA/Pz0KICAgICAgICBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6YXN5bmMnLCAnX0FzeW5jQXdhaXRDb21wbGV0ZXInLCAnJyk7CiAgfQoKICBNZW1iZXIgZ2V0IGNvbXBsZXRlT25Bc3luY1JldHVybiB7CiAgICByZXR1cm4gX2NvbXBsZXRlT25Bc3luY1JldHVyblByb2NlZHVyZSA/Pz0KICAgICAgICBpbmRleC5nZXRUb3BMZXZlbE1lbWJlcignZGFydDphc3luYycsICdfY29tcGxldGVPbkFzeW5jUmV0dXJuJyk7CiAgfQoKICBQcm9jZWR1cmUgZ2V0IGNvbXBsZXRlckNvbXBsZXRlRXJyb3IgewogICAgcmV0dXJuIF9jb21wbGV0ZXJDb21wbGV0ZUVycm9yID8/PQogICAgICAgIGluZGV4LmdldE1lbWJlcignZGFydDphc3luYycsICdDb21wbGV0ZXInLCAnY29tcGxldGVFcnJvcicpOwogIH0KCiAgTWVtYmVyIGdldCBjb21wbGV0ZXJGdXR1cmUgewogICAgcmV0dXJuIGluZGV4LmdldE1lbWJlcignZGFydDphc3luYycsICdDb21wbGV0ZXInLCAnZ2V0OmZ1dHVyZScpOwogIH0KCiAgTGlicmFyeSBnZXQgY29yZUxpYnJhcnkgewogICAgcmV0dXJuIF9jb3JlTGlicmFyeSA/Pz0gaW5kZXguZ2V0TGlicmFyeSgnZGFydDpjb3JlJyk7CiAgfQoKICBDbGFzcyBnZXQgZG91YmxlQ2xhc3MgewogICAgcmV0dXJuIF9kb3VibGVDbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdkb3VibGUnKTsKICB9CgogIENsYXNzIGdldCBmdW5jdGlvbkNsYXNzIHsKICAgIHJldHVybiBfZnVuY3Rpb25DbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdGdW5jdGlvbicpOwogIH0KCiAgQ2xhc3MgZ2V0IGZ1dHVyZUNsYXNzIHsKICAgIHJldHVybiBfZnV0dXJlQ2xhc3MgPz89IGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnRnV0dXJlJyk7CiAgfQoKICBDbGFzcyBnZXQgZnV0dXJlT3JDbGFzcyB7CiAgICByZXR1cm4gX2Z1dHVyZU9yQ2xhc3MgPz89IChpbmRleC50cnlHZXRDbGFzcygnZGFydDpjb3JlJywgJ0Z1dHVyZU9yJykgPz8KICAgICAgICBpbmRleC5nZXRDbGFzcygnZGFydDphc3luYycsICdGdXR1cmVPcicpKTsKICB9CgogIFByb2NlZHVyZSBnZXQgaWRlbnRpY2FsUHJvY2VkdXJlIHsKICAgIHJldHVybiBfaWRlbnRpY2FsUHJvY2VkdXJlID8/PQogICAgICAgIGluZGV4LmdldFRvcExldmVsTWVtYmVyKCdkYXJ0OmNvcmUnLCAnaWRlbnRpY2FsJyk7CiAgfQoKICBDbGFzcyBnZXQgaW50Q2xhc3MgewogICAgcmV0dXJuIF9pbnRDbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdpbnQnKTsKICB9CgogIENsYXNzIGdldCBpbnRlcm5hbFN5bWJvbENsYXNzIHsKICAgIHJldHVybiBfaW50ZXJuYWxTeW1ib2xDbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6X2ludGVybmFsJywgJ1N5bWJvbCcpOwogIH0KCiAgQ2xhc3MgZ2V0IGludm9jYXRpb25DbGFzcyB7CiAgICByZXR1cm4gX2ludm9jYXRpb25DbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdJbnZvY2F0aW9uJyk7CiAgfQoKICBDbGFzcyBnZXQgaW52b2NhdGlvbk1pcnJvckNsYXNzIHsKICAgIHJldHVybiBfaW52b2NhdGlvbk1pcnJvckNsYXNzID8/PQogICAgICAgIGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnX0ludm9jYXRpb25NaXJyb3InKTsKICB9CgogIENvbnN0cnVjdG9yIGdldCBpbnZvY2F0aW9uTWlycm9yV2l0aFR5cGVDb25zdHJ1Y3RvciB7CiAgICByZXR1cm4gX2ludm9jYXRpb25NaXJyb3JXaXRoVHlwZUNvbnN0cnVjdG9yID8/PQogICAgICAgIGluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ19JbnZvY2F0aW9uTWlycm9yJywgJ193aXRoVHlwZScpOwogIH0KCiAgQ2xhc3MgZ2V0IGl0ZXJhYmxlQ2xhc3MgewogICAgcmV0dXJuIF9pdGVyYWJsZUNsYXNzID8/PSBpbmRleC5nZXRDbGFzcygnZGFydDpjb3JlJywgJ0l0ZXJhYmxlJyk7CiAgfQoKICBDbGFzcyBnZXQgaXRlcmF0b3JDbGFzcyB7CiAgICByZXR1cm4gX2l0ZXJhdG9yQ2xhc3MgPz89IGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnSXRlcmF0b3InKTsKICB9CgogIENsYXNzIGdldCBsaXN0Q2xhc3MgewogICAgcmV0dXJuIF9saXN0Q2xhc3MgPz89IGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnTGlzdCcpOwogIH0KCiAgUHJvY2VkdXJlIGdldCBsaXN0RnJvbUNvbnN0cnVjdG9yIHsKICAgIHJldHVybiBfbGlzdEZyb21Db25zdHJ1Y3RvciA/Pz0KICAgICAgICBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdMaXN0JywgJ2Zyb20nKTsKICB9CgogIFByb2NlZHVyZSBnZXQgbGlzdFVubW9kaWZpYWJsZUNvbnN0cnVjdG9yIHsKICAgIHJldHVybiBfbGlzdFVubW9kaWZpYWJsZUNvbnN0cnVjdG9yID8/PQogICAgICAgIGluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ0xpc3QnLCAndW5tb2RpZmlhYmxlJyk7CiAgfQoKICBDbGFzcyBnZXQgc2V0Q2xhc3MgewogICAgcmV0dXJuIF9zZXRDbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdTZXQnKTsKICB9CgogIENsYXNzIGdldCBtYXBDbGFzcyB7CiAgICByZXR1cm4gX21hcENsYXNzID8/PSBpbmRleC5nZXRDbGFzcygnZGFydDpjb3JlJywgJ01hcCcpOwogIH0KCiAgUHJvY2VkdXJlIGdldCBtYXBVbm1vZGlmaWFibGUgewogICAgcmV0dXJuIF9tYXBVbm1vZGlmaWFibGUgPz89CiAgICAgICAgaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmNvcmUnLCAnTWFwJywgJ3VubW9kaWZpYWJsZScpOwogIH0KCiAgTGlicmFyeSBnZXQgbWlycm9yc0xpYnJhcnkgewogICAgcmV0dXJuIF9taXJyb3JzTGlicmFyeSA/Pz0gaW5kZXgudHJ5R2V0TGlicmFyeSgnZGFydDptaXJyb3JzJyk7CiAgfQoKICBDb25zdHJ1Y3RvciBnZXQgbm9TdWNoTWV0aG9kRXJyb3JEZWZhdWx0Q29uc3RydWN0b3IgewogICAgcmV0dXJuIF9ub1N1Y2hNZXRob2RFcnJvckRlZmF1bHRDb25zdHJ1Y3RvciA/Pz0KICAgICAgICAvLyBUT0RPKHJlZ2lzKTogUmVwbGFjZSAnd2l0aEludm9jYXRpb24nIHdpdGggJycgYWZ0ZXIgZGFydDJqcyBpcyBmaXhlZC4KICAgICAgICBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdOb1N1Y2hNZXRob2RFcnJvcicsICd3aXRoSW52b2NhdGlvbicpOwogIH0KCiAgQ2xhc3MgZ2V0IG51bGxDbGFzcyB7CiAgICByZXR1cm4gX251bGxDbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdOdWxsJyk7CiAgfQoKICBDbGFzcyBnZXQgbnVtQ2xhc3MgewogICAgcmV0dXJuIF9udW1DbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdudW0nKTsKICB9CgogIENsYXNzIGdldCBvYmplY3RDbGFzcyB7CiAgICByZXR1cm4gX29iamVjdENsYXNzID8/PSBpbmRleC5nZXRDbGFzcygnZGFydDpjb3JlJywgJ09iamVjdCcpOwogIH0KCiAgUHJvY2VkdXJlIGdldCBvYmplY3RFcXVhbHMgewogICAgcmV0dXJuIF9vYmplY3RFcXVhbHMgPz89IGluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ09iamVjdCcsICc9PScpOwogIH0KCiAgQ2xhc3MgZ2V0IHByYWdtYUNsYXNzIHsKICAgIHJldHVybiBfcHJhZ21hQ2xhc3MgPz89IGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAncHJhZ21hJyk7CiAgfQoKICBGaWVsZCBnZXQgcHJhZ21hTmFtZSB7CiAgICByZXR1cm4gX3ByYWdtYU5hbWUgPz89IGluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ3ByYWdtYScsICduYW1lJyk7CiAgfQoKICBGaWVsZCBnZXQgcHJhZ21hT3B0aW9ucyB7CiAgICByZXR1cm4gX3ByYWdtYU9wdGlvbnMgPz89IGluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ3ByYWdtYScsICdvcHRpb25zJyk7CiAgfQoKICBDb25zdHJ1Y3RvciBnZXQgcHJhZ21hQ29uc3RydWN0b3IgewogICAgcmV0dXJuIF9wcmFnbWFDb25zdHJ1Y3RvciA/Pz0gaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmNvcmUnLCAncHJhZ21hJywgJ18nKTsKICB9CgogIENsYXNzIGdldCBzdGFja1RyYWNlQ2xhc3MgewogICAgcmV0dXJuIF9zdGFja1RyYWNlQ2xhc3MgPz89IGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnU3RhY2tUcmFjZScpOwogIH0KCiAgQ2xhc3MgZ2V0IHN0cmVhbUNsYXNzIHsKICAgIHJldHVybiBfc3RyZWFtQ2xhc3MgPz89IGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnU3RyZWFtJyk7CiAgfQoKICBNZW1iZXIgZ2V0IHN0cmVhbUl0ZXJhdG9yU3Vic2NyaXB0aW9uIHsKICAgIHJldHVybiBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6YXN5bmMnLCAnX1N0cmVhbUl0ZXJhdG9yJywgJ19zdWJzY3JpcHRpb24nKTsKICB9CgogIE1lbWJlciBnZXQgc3RyZWFtSXRlcmF0b3JDYW5jZWwgewogICAgcmV0dXJuIGluZGV4LmdldE1lbWJlcignZGFydDphc3luYycsICdfU3RyZWFtSXRlcmF0b3InLCAnY2FuY2VsJyk7CiAgfQoKICBDbGFzcyBnZXQgc3RyZWFtSXRlcmF0b3JDbGFzcyB7CiAgICByZXR1cm4gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6YXN5bmMnLCAnX1N0cmVhbUl0ZXJhdG9yJyk7CiAgfQoKICBDb25zdHJ1Y3RvciBnZXQgc3RyZWFtSXRlcmF0b3JEZWZhdWx0Q29uc3RydWN0b3IgewogICAgcmV0dXJuIF9zdHJlYW1JdGVyYXRvckRlZmF1bHRDb25zdHJ1Y3RvciA/Pz0KICAgICAgICBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6YXN5bmMnLCAnX1N0cmVhbUl0ZXJhdG9yJywgJycpOwogIH0KCiAgTWVtYmVyIGdldCBzdHJlYW1JdGVyYXRvck1vdmVOZXh0IHsKICAgIHJldHVybiBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6YXN5bmMnLCAnX1N0cmVhbUl0ZXJhdG9yJywgJ21vdmVOZXh0Jyk7CiAgfQoKICBNZW1iZXIgZ2V0IHN0cmVhbUl0ZXJhdG9yQ3VycmVudCB7CiAgICByZXR1cm4gaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmFzeW5jJywgJ19TdHJlYW1JdGVyYXRvcicsICdnZXQ6Y3VycmVudCcpOwogIH0KCiAgQ2xhc3MgZ2V0IHN0cmluZ0NsYXNzIHsKICAgIHJldHVybiBfc3RyaW5nQ2xhc3MgPz89IGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnU3RyaW5nJyk7CiAgfQoKICBDbGFzcyBnZXQgc3ltYm9sQ2xhc3MgewogICAgcmV0dXJuIF9zeW1ib2xDbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdTeW1ib2wnKTsKICB9CgogIENvbnN0cnVjdG9yIGdldCBzeW5jSXRlcmFibGVEZWZhdWx0Q29uc3RydWN0b3IgewogICAgcmV0dXJuIF9zeW5jSXRlcmFibGVEZWZhdWx0Q29uc3RydWN0b3IgPz89CiAgICAgICAgaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmNvcmUnLCAnX1N5bmNJdGVyYWJsZScsICcnKTsKICB9CgogIENsYXNzIGdldCBzeW5jSXRlcmF0b3JDbGFzcyB7CiAgICByZXR1cm4gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdfU3luY0l0ZXJhdG9yJyk7CiAgfQoKICBNZW1iZXIgZ2V0IHN5bmNJdGVyYXRvckN1cnJlbnQgewogICAgcmV0dXJuIGluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ19TeW5jSXRlcmF0b3InLCAnX2N1cnJlbnQnKTsKICB9CgogIE1lbWJlciBnZXQgc3luY0l0ZXJhdG9yWWllbGRFYWNoSXRlcmFibGUgewogICAgcmV0dXJuIGluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ19TeW5jSXRlcmF0b3InLCAnX3lpZWxkRWFjaEl0ZXJhYmxlJyk7CiAgfQoKICBDbGFzcyBnZXQgdHlwZUNsYXNzIHsKICAgIHJldHVybiBfdHlwZUNsYXNzID8/PSBpbmRleC5nZXRDbGFzcygnZGFydDpjb3JlJywgJ1R5cGUnKTsKICB9CgogIENvbnN0cnVjdG9yIGdldCBmYWxsVGhyb3VnaEVycm9yVXJsQW5kTGluZUNvbnN0cnVjdG9yIHsKICAgIHJldHVybiBfZmFsbFRocm91Z2hFcnJvclVybEFuZExpbmVDb25zdHJ1Y3RvciA/Pz0KICAgICAgICBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdGYWxsVGhyb3VnaEVycm9yJywgJ19jcmVhdGUnKTsKICB9CgogIFByb2NlZHVyZSBnZXQgYm9vbEZyb21FbnZpcm9ubWVudCB7CiAgICByZXR1cm4gX2Jvb2xGcm9tRW52aXJvbm1lbnQgPz89CiAgICAgICAgaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmNvcmUnLCAnYm9vbCcsICdmcm9tRW52aXJvbm1lbnQnKTsKICB9Cn0KgYkATk48GwETHQFIEj0TEA4ODQ0QEA4NEhIQDhIUGgcYEAcUEBAGBQEcARgWFBQTExYWFBMTGBgWFBgaIDQ0IiohNhseAR4BGRYaFiMYLy0lLzE8LS8tLi8jIgFOGwEWFRgiASE7ATMxSwQBHT0EASxPBAExHEEEATIcQgQBLUcEAS5RBAFAPEkEAS8cQwQBKC9JBAEqMUsEATEvSQQBMjBKBAEnJT8EARg/BAEnKT4EATMvQwQBJS9JBAEpJ0UEAR9FBAEcOwQBGkMEARxHBAEaQwQBHE0zBAElIzsEARc9BAEiUAQBHksEASQmOgQBODRIBAEcRwQBHEcEARg/BAEmJDYEAS4sPgQBFz0EARc9BAEiID0EAR9EBAE4NFFNBAEYPwQBFz0EARpDBAEfSwQBGkMEARlLBAEcUQQBJk8EAR5LBAEaQwQBKk4EASRHBAEiPAQBNTE+BAEmSQQBJUwEARpDBAEaQwQBMy87BAEgOQQBI0YEAS1QBAEYPwQBOjZFBAEmJEEEAgEecGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0QHNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZ190ZXN0ZWQvcGFja2FnZV9jb25maWcvbGliL3BhY2thZ2VzLmRhcnSJmS8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IHBhY2thZ2VfY29uZmlnLnBhY2thZ2VzOwoKaW1wb3J0ICJzcmMvcGFja2FnZXNfaW1wbC5kYXJ0IjsKCi8vLyBBIHBhY2thZ2UgcmVzb2x1dGlvbiBzdHJhdGVneS4KLy8vCi8vLyBBbGxvd3MgY29udmVydGluZyBhIGBwYWNrYWdlOmAgVVJJIHRvIGEgZGlmZmVyZW50IGtpbmQgb2YgVVJJLgovLy8KLy8vIE1heSBhbHNvIGFsbG93IGxpc3RpbmcgdGhlIGF2YWlsYWJsZSBwYWNrYWdlcyBhbmQgY29udmVydGluZwovLy8gdG8gYSBgTWFwPFN0cmluZywgVXJpPmAgdGhhdCBnaXZlcyB0aGUgYmFzZSBsb2NhdGlvbiBvZiBlYWNoIGF2YWlsYWJsZQovLy8gcGFja2FnZS4gSW4gc29tZSBjYXNlcyB0aGVyZSBpcyBubyB3YXkgdG8gZmluZCB0aGUgYXZhaWxhYmxlIHBhY2thZ2VzLAovLy8gaW4gd2hpY2ggY2FzZSBbcGFja2FnZXNdIGFuZCBbYXNNYXBdIHdpbGwgdGhyb3cgaWYgdXNlZC4KLy8vIE9uZSBzdWNoIGNhc2UgaXMgaWYgdGhlIHBhY2thZ2VzIGFyZSByZXNvbHZlZCByZWxhdGl2ZSB0byBhCi8vLyBgcGFja2FnZXMvYCBkaXJlY3RvcnkgYXZhaWxhYmxlIG92ZXIgSFRUUC4KYWJzdHJhY3QgY2xhc3MgUGFja2FnZXMgewogIC8vLyBBIFtQYWNrYWdlc10gcmVzb2x2ZXIgY29udGFpbmluZyBubyBwYWNrYWdlcy4KICAvLy8KICAvLy8gVGhpcyBjb25zdGFudCBvYmplY3QgaXMgcmV0dXJuZWQgYnkgW2ZpbmRdIGFib3ZlIGlmIG5vCiAgLy8vIHBhY2thZ2UgcmVzb2x1dGlvbiBzdHJhdGVneSBpcyBmb3VuZC4KICBzdGF0aWMgY29uc3QgUGFja2FnZXMgbm9QYWNrYWdlcyA9IGNvbnN0IE5vUGFja2FnZXMoKTsKCiAgLy8vIFJlc29sdmUgYSBwYWNrYWdlIFVSSSBpbnRvIGEgbm9uLXBhY2thZ2UgVVJJLgogIC8vLwogIC8vLyBUcmFuc2xhdGVzIGEgYHBhY2thZ2U6YCBVUkksIGFjY29yZGluZyB0byB0aGUgcGFja2FnZSByZXNvbHV0aW9uCiAgLy8vIHN0cmF0ZWd5LCBpbnRvIGEgVVJJIHRoYXQgY2FuIGJlIGxvYWRlZC4KICAvLy8gQnkgZGVmYXVsdCwgb25seSBgZmlsZWAsIGBodHRwYCBhbmQgYGh0dHBzYCBVUklzIGFyZSByZXR1cm5lZC4KICAvLy8gQ3VzdG9tIGBQYWNrYWdlc2Agb2JqZWN0cyBtYXkgcmV0dXJuIG90aGVyIFVSSXMuCiAgLy8vCiAgLy8vIElmIHJlc29sdXRpb24gZmFpbHMgYmVjYXVzZSBhIHBhY2thZ2Ugd2l0aCB0aGUgcmVxdWVzdGVkIHBhY2thZ2UgbmFtZQogIC8vLyBpcyBub3QgYXZhaWxhYmxlLCB0aGUgW25vdEZvdW5kXSBmdW5jdGlvbiBpcyBjYWxsZWQuCiAgLy8vIElmIG5vIGBub3RGb3VuZGAgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIGl0IGRlZmF1bHRzIHRvIHRocm93aW5nIGFuIGVycm9yLgogIC8vLwogIC8vLyBUaGUgW3BhY2thZ2VVcmldIG11c3QgYmUgYSB2YWxpZCBwYWNrYWdlIFVSSS4KICBVcmkgcmVzb2x2ZShVcmkgcGFja2FnZVVyaSwge1VyaSBub3RGb3VuZChVcmkgcGFja2FnZVVyaSl9KTsKCiAgLy8vIFJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGF2YWlsYWJsZSBwYWNrYWdlcy4KICAvLy8KICAvLy8gUmV0dXJucyBhbiBpdGVyYWJsZSB0aGF0IGFsbG93cyBpdGVyYXRpbmcgdGhlIG5hbWVzIG9mIGF2YWlsYWJsZSBwYWNrYWdlcy4KICAvLy8KICAvLy8gU29tZSBgUGFja2FnZXNgIG9iamVjdHMgYXJlIHVuYWJsZSB0byBmaW5kIHRoZSBwYWNrYWdlIG5hbWVzLAogIC8vLyBhbmQgZ2V0dGluZyBgcGFja2FnZXNgIGZyb20gc3VjaCBhIGBQYWNrYWdlc2Agb2JqZWN0IHdpbGwgdGhyb3cuCiAgSXRlcmFibGU8U3RyaW5nPiBnZXQgcGFja2FnZXM7CgogIC8vLyBSZXR1cm4gdGhlIG5hbWVzLXRvLWJhc2UtVVJJIG1hcHBpbmcgb2YgdGhlIGF2YWlsYWJsZSBwYWNrYWdlcy4KICAvLy8KICAvLy8gUmV0dXJucyBhIG1hcCBmcm9tIHBhY2thZ2UgbmFtZSB0byBhIGJhc2UgVVJJLgogIC8vLyBUaGUgW3Jlc29sdmVdIG1ldGhvZCB3aWxsIHJlc29sdmUgYSBwYWNrYWdlIFVSSSB3aXRoIGEgc3BlY2lmaWMgcGFja2FnZQogIC8vLyBuYW1lIHRvIGEgcGF0aCBleHRlbmRpbmcgdGhlIGJhc2UgVVJJIHRoYXQgdGhpcyBtYXAgZ2l2ZXMgZm9yIHRoYXQKICAvLy8gcGFja2FnZSBuYW1lLgogIC8vLwogIC8vLyBTb21lIGBQYWNrYWdlc2Agb2JqZWN0cyBhcmUgdW5hYmxlIHRvIGZpbmQgdGhlIHBhY2thZ2UgbmFtZXMsCiAgLy8vIGFuZCBjYWxsaW5nIGBhc01hcGAgb24gc3VjaCBhIGBQYWNrYWdlc2Agb2JqZWN0IHdpbGwgdGhyb3cuCiAgTWFwPFN0cmluZywgVXJpPiBhc01hcCgpOwp9CjwATk48ASEBIQEjBEMEQUtLPUAvGjQGPSw5ATQGRy9FNwZMO08GND8BMgZRBkRHIQFGBjVOSRQGREIcAgEkcGFja2FnZTpwYWNrYWdlX2NvbmZpZy9wYWNrYWdlcy5kYXJ0RXNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZ190ZXN0ZWQvcGFja2FnZV9jb25maWcvbGliL3BhY2thZ2VzX2ZpbGUuZGFydJiWLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgcGFja2FnZV9jb25maWcucGFja2FnZXNfZmlsZTsKCmltcG9ydCAicGFja2FnZTpjaGFyY29kZS9hc2NpaS5kYXJ0IjsKCmltcG9ydCAic3JjL3V0aWwuZGFydCIgc2hvdyBpc1ZhbGlkUGFja2FnZU5hbWU7CgovLy8gUGFyc2VzIGEgYC5wYWNrYWdlc2AgZmlsZSBpbnRvIGEgbWFwIGZyb20gcGFja2FnZSBuYW1lIHRvIGJhc2UgVVJJLgovLy8KLy8vIFRoZSBbc291cmNlXSBpcyB0aGUgYnl0ZSBjb250ZW50IG9mIGEgYC5wYWNrYWdlc2AgZmlsZSwgYXNzdW1lZCB0byBiZQovLy8gVVRGLTggZW5jb2RlZC4gSW4gcHJhY3RpY2UsIGFsbCBzaWduaWZpY2FudCBwYXJ0cyBvZiB0aGUgZmlsZSBtdXN0IGJlIEFTQ0lJLAovLy8gc28gTGF0aW4tMSBvciBXaW5kb3dzLTEyNTIgZW5jb2Rpbmcgd2lsbCBhbHNvIHdvcmsgZmluZS4KLy8vCi8vLyBJZiB0aGUgZmlsZSBjb250ZW50IGlzIGF2YWlsYWJsZSBhcyBhIHN0cmluZywgaXRzIFtTdHJpbmcuY29kZVVuaXRzXSBjYW4KLy8vIGJlIHVzZWQgYXMgdGhlIGBzb3VyY2VgIGFyZ3VtZW50IG9mIHRoaXMgZnVuY3Rpb24uCi8vLwovLy8gVGhlIFtiYXNlTG9jYXRpb25dIGlzIHVzZWQgYXMgYSBiYXNlIFVSSSB0byByZXNvbHZlIGFsbCByZWxhdGl2ZQovLy8gVVJJIHJlZmVyZW5jZXMgYWdhaW5zdC4KLy8vIElmIHRoZSBjb250ZW50IHdhcyByZWFkIGZyb20gYSBmaWxlLCBgYmFzZUxvY2F0aW9uYCBzaG91bGQgYmUgdGhlCi8vLyBsb2NhdGlvbiBvZiB0aGF0IGZpbGUuCi8vLwovLy8gUmV0dXJucyBhIHNpbXBsZSBtYXBwaW5nIGZyb20gcGFja2FnZSBuYW1lIHRvIHBhY2thZ2UgbG9jYXRpb24uCk1hcDxTdHJpbmcsIFVyaT4gcGFyc2UoTGlzdDxpbnQ+IHNvdXJjZSwgVXJpIGJhc2VMb2NhdGlvbikgewogIGludCBpbmRleCA9IDA7CiAgTWFwPFN0cmluZywgVXJpPiByZXN1bHQgPSA8U3RyaW5nLCBVcmk+e307CiAgd2hpbGUgKGluZGV4IDwgc291cmNlLmxlbmd0aCkgewogICAgYm9vbCBpc0NvbW1lbnQgPSBmYWxzZTsKICAgIGludCBzdGFydCA9IGluZGV4OwogICAgaW50IHNlcGFyYXRvckluZGV4ID0gLTE7CiAgICBpbnQgZW5kID0gc291cmNlLmxlbmd0aDsKICAgIGludCBjaGFyID0gc291cmNlW2luZGV4KytdOwogICAgaWYgKGNoYXIgPT0gJGNyIHx8IGNoYXIgPT0gJGxmKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKGNoYXIgPT0gJGNvbG9uKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oIk1pc3NpbmcgcGFja2FnZSBuYW1lIiwgc291cmNlLCBpbmRleCAtIDEpOwogICAgfQogICAgaXNDb21tZW50ID0gY2hhciA9PSAkaGFzaDsKICAgIHdoaWxlIChpbmRleCA8IHNvdXJjZS5sZW5ndGgpIHsKICAgICAgY2hhciA9IHNvdXJjZVtpbmRleCsrXTsKICAgICAgaWYgKGNoYXIgPT0gJGNvbG9uICYmIHNlcGFyYXRvckluZGV4IDwgMCkgewogICAgICAgIHNlcGFyYXRvckluZGV4ID0gaW5kZXggLSAxOwogICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJGNyIHx8IGNoYXIgPT0gJGxmKSB7CiAgICAgICAgZW5kID0gaW5kZXggLSAxOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZiAoaXNDb21tZW50KSBjb250aW51ZTsKICAgIGlmIChzZXBhcmF0b3JJbmRleCA8IDApIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiTm8gJzonIG9uIGxpbmUiLCBzb3VyY2UsIGluZGV4IC0gMSk7CiAgICB9CiAgICB2YXIgcGFja2FnZU5hbWUgPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoc291cmNlLCBzdGFydCwgc2VwYXJhdG9ySW5kZXgpOwogICAgaWYgKCFpc1ZhbGlkUGFja2FnZU5hbWUocGFja2FnZU5hbWUpKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oIk5vdCBhIHZhbGlkIHBhY2thZ2UgbmFtZSIsIHBhY2thZ2VOYW1lLCAwKTsKICAgIH0KICAgIHZhciBwYWNrYWdlVXJpID0gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKHNvdXJjZSwgc2VwYXJhdG9ySW5kZXggKyAxLCBlbmQpOwogICAgdmFyIHBhY2thZ2VMb2NhdGlvbiA9IFVyaS5wYXJzZShwYWNrYWdlVXJpKTsKICAgIHBhY2thZ2VMb2NhdGlvbiA9IGJhc2VMb2NhdGlvbi5yZXNvbHZlVXJpKHBhY2thZ2VMb2NhdGlvbik7CiAgICBpZiAoIXBhY2thZ2VMb2NhdGlvbi5wYXRoLmVuZHNXaXRoKCcvJykpIHsKICAgICAgcGFja2FnZUxvY2F0aW9uID0KICAgICAgICAgIHBhY2thZ2VMb2NhdGlvbi5yZXBsYWNlKHBhdGg6IHBhY2thZ2VMb2NhdGlvbi5wYXRoICsgIi8iKTsKICAgIH0KICAgIGlmIChyZXN1bHQuY29udGFpbnNLZXkocGFja2FnZU5hbWUpKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAiU2FtZSBwYWNrYWdlIG5hbWUgb2NjdXJlZCB0d2ljZS4iLCBzb3VyY2UsIHN0YXJ0KTsKICAgIH0KICAgIHJlc3VsdFtwYWNrYWdlTmFtZV0gPSBwYWNrYWdlTG9jYXRpb247CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KCi8vLyBXcml0ZXMgdGhlIG1hcHBpbmcgdG8gYSBbU3RyaW5nU2lua10uCi8vLwovLy8gSWYgW2NvbW1lbnRdIGlzIHByb3ZpZGVkLCB0aGUgb3V0cHV0IHdpbGwgY29udGFpbiB0aGlzIGNvbW1lbnQKLy8vIHdpdGggYCMgYCBpbiBmcm9udCBvZiBlYWNoIGxpbmUuCi8vLyBMaW5lcyBhcmUgZGVmaW5lZCBhcyBlbmRpbmcgaW4gbGluZSBmZWVkIChgJ1xuJ2ApLiBJZiB0aGUgZmluYWwKLy8vIGxpbmUgb2YgdGhlIGNvbW1lbnQgZG9lc24ndCBlbmQgaW4gYSBsaW5lIGZlZWQsIG9uZSB3aWxsIGJlIGFkZGVkLgovLy8KLy8vIElmIFtiYXNlVXJpXSBpcyBwcm92aWRlZCwgcGFja2FnZSBsb2NhdGlvbnMgd2lsbCBiZSBtYWRlIHJlbGF0aXZlCi8vLyB0byB0aGUgYmFzZSBVUkksIGlmIHBvc3NpYmxlLCBiZWZvcmUgd3JpdGluZy4KLy8vCi8vLyBBbGwgdGhlIGtleXMgb2YgW3BhY2thZ2VNYXBwaW5nXSBtdXN0IGJlIHZhbGlkIHBhY2thZ2UgbmFtZXMsCi8vLyBhbmQgdGhlIHZhbHVlcyBtdXN0IGJlIFVSSXMgdGhhdCBkbyBub3QgaGF2ZSB0aGUgYHBhY2thZ2U6YCBzY2hlbWUuCnZvaWQgd3JpdGUoU3RyaW5nU2luayBvdXRwdXQsIE1hcDxTdHJpbmcsIFVyaT4gcGFja2FnZU1hcHBpbmcsCiAgICB7VXJpIGJhc2VVcmksIFN0cmluZyBjb21tZW50fSkgewogIGlmIChiYXNlVXJpICE9IG51bGwgJiYgIWJhc2VVcmkuaXNBYnNvbHV0ZSkgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUoYmFzZVVyaSwgImJhc2VVcmkiLCAiTXVzdCBiZSBhYnNvbHV0ZSIpOwogIH0KCiAgaWYgKGNvbW1lbnQgIT0gbnVsbCkgewogICAgdmFyIGxpbmVzID0gY29tbWVudC5zcGxpdCgnXG4nKTsKICAgIGlmIChsaW5lcy5sYXN0LmlzRW1wdHkpIGxpbmVzLnJlbW92ZUxhc3QoKTsKICAgIGZvciAodmFyIGNvbW1lbnRMaW5lIGluIGxpbmVzKSB7CiAgICAgIG91dHB1dC53cml0ZSgnIyAnKTsKICAgICAgb3V0cHV0LndyaXRlbG4oY29tbWVudExpbmUpOwogICAgfQogIH0gZWxzZSB7CiAgICBvdXRwdXQud3JpdGUoIiMgZ2VuZXJhdGVkIGJ5IHBhY2thZ2U6cGFja2FnZV9jb25maWcgYXQgIik7CiAgICBvdXRwdXQud3JpdGUobmV3IERhdGVUaW1lLm5vdygpKTsKICAgIG91dHB1dC53cml0ZWxuKCk7CiAgfQoKICBwYWNrYWdlTWFwcGluZy5mb3JFYWNoKChTdHJpbmcgcGFja2FnZU5hbWUsIFVyaSB1cmkpIHsKICAgIC8vIFZhbGlkYXRlIHBhY2thZ2VOYW1lLgogICAgaWYgKCFpc1ZhbGlkUGFja2FnZU5hbWUocGFja2FnZU5hbWUpKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCciJHBhY2thZ2VOYW1lIiBpcyBub3QgYSB2YWxpZCBwYWNrYWdlIG5hbWUnKTsKICAgIH0KICAgIGlmICh1cmkuc2NoZW1lID09ICJwYWNrYWdlIikgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZSgKICAgICAgICAgICJQYWNrYWdlIGxvY2F0aW9uIG11c3Qgbm90IGJlIGEgcGFja2FnZTogVVJJIiwgdXJpLnRvU3RyaW5nKCkpOwogICAgfQogICAgb3V0cHV0LndyaXRlKHBhY2thZ2VOYW1lKTsKICAgIG91dHB1dC53cml0ZSgnOicpOwogICAgLy8gSWYgYmFzZVVyaSBwcm92aWRlZCwgbWFrZSB1cmkgcmVsYXRpdmUuCiAgICBpZiAoYmFzZVVyaSAhPSBudWxsKSB7CiAgICAgIHVyaSA9IF9yZWxhdGl2aXplKHVyaSwgYmFzZVVyaSk7CiAgICB9CiAgICBvdXRwdXQud3JpdGUodXJpKTsKICAgIGlmICghdXJpLnBhdGguZW5kc1dpdGgoJy8nKSkgewogICAgICBvdXRwdXQud3JpdGUoJy8nKTsKICAgIH0KICAgIG91dHB1dC53cml0ZWxuKCk7CiAgfSk7Cn0KCi8vLyBBdHRlbXB0cyB0byByZXR1cm4gYSByZWxhdGl2ZSBVUkkgZm9yIFt1cmldLgovLy8KLy8vIFRoZSByZXN1bHQgVVJJIHNhdGlzZmllcyBgYmFzZVVyaS5yZXNvbHZlVXJpKHJlc3VsdCkgPT0gdXJpYCwKLy8vIGJ1dCBtYXkgYmUgcmVsYXRpdmUuCi8vLyBUaGUgYGJhc2VVcmlgIG11c3QgYmUgYWJzb2x1dGUuClVyaSBfcmVsYXRpdml6ZShVcmkgdXJpLCBVcmkgYmFzZVVyaSkgewogIGFzc2VydChiYXNlVXJpLmlzQWJzb2x1dGUpOwogIGlmICh1cmkuaGFzUXVlcnkgfHwgdXJpLmhhc0ZyYWdtZW50KSB7CiAgICB1cmkgPSBuZXcgVXJpKAogICAgICAgIHNjaGVtZTogdXJpLnNjaGVtZSwKICAgICAgICB1c2VySW5mbzogdXJpLmhhc0F1dGhvcml0eSA/IHVyaS51c2VySW5mbyA6IG51bGwsCiAgICAgICAgaG9zdDogdXJpLmhhc0F1dGhvcml0eSA/IHVyaS5ob3N0IDogbnVsbCwKICAgICAgICBwb3J0OiB1cmkuaGFzQXV0aG9yaXR5ID8gdXJpLnBvcnQgOiBudWxsLAogICAgICAgIHBhdGg6IHVyaS5wYXRoKTsKICB9CgogIC8vIEFscmVhZHkgcmVsYXRpdmUuIFdlIGFzc3VtZSB0aGUgY2FsbGVyIGtub3dzIHdoYXQgdGhleSBhcmUgZG9pbmcuCiAgaWYgKCF1cmkuaXNBYnNvbHV0ZSkgcmV0dXJuIHVyaTsKCiAgaWYgKGJhc2VVcmkuc2NoZW1lICE9IHVyaS5zY2hlbWUpIHsKICAgIHJldHVybiB1cmk7CiAgfQoKICAvLyBJZiBhdXRob3JpdHkgZGlmZmVycywgd2UgY291bGQgcmVtb3ZlIHRoZSBzY2hlbWUsIGJ1dCBpdCdzIG5vdCB3b3J0aCBpdC4KICBpZiAodXJpLmhhc0F1dGhvcml0eSAhPSBiYXNlVXJpLmhhc0F1dGhvcml0eSkgcmV0dXJuIHVyaTsKICBpZiAodXJpLmhhc0F1dGhvcml0eSkgewogICAgaWYgKHVyaS51c2VySW5mbyAhPSBiYXNlVXJpLnVzZXJJbmZvIHx8CiAgICAgICAgdXJpLmhvc3QudG9Mb3dlckNhc2UoKSAhPSBiYXNlVXJpLmhvc3QudG9Mb3dlckNhc2UoKSB8fAogICAgICAgIHVyaS5wb3J0ICE9IGJhc2VVcmkucG9ydCkgewogICAgICByZXR1cm4gdXJpOwogICAgfQogIH0KCiAgYmFzZVVyaSA9IGJhc2VVcmkubm9ybWFsaXplUGF0aCgpOwogIExpc3Q8U3RyaW5nPiBiYXNlID0gYmFzZVVyaS5wYXRoU2VnbWVudHMudG9MaXN0KCk7CiAgaWYgKGJhc2UuaXNOb3RFbXB0eSkgewogICAgYmFzZSA9IG5ldyBMaXN0PFN0cmluZz4uZnJvbShiYXNlKS4ucmVtb3ZlTGFzdCgpOwogIH0KICB1cmkgPSB1cmkubm9ybWFsaXplUGF0aCgpOwogIExpc3Q8U3RyaW5nPiB0YXJnZXQgPSB1cmkucGF0aFNlZ21lbnRzLnRvTGlzdCgpOwogIGlmICh0YXJnZXQuaXNOb3RFbXB0eSAmJiB0YXJnZXQubGFzdC5pc0VtcHR5KSB0YXJnZXQucmVtb3ZlTGFzdCgpOwogIGludCBpbmRleCA9IDA7CiAgd2hpbGUgKGluZGV4IDwgYmFzZS5sZW5ndGggJiYgaW5kZXggPCB0YXJnZXQubGVuZ3RoKSB7CiAgICBpZiAoYmFzZVtpbmRleF0gIT0gdGFyZ2V0W2luZGV4XSkgewogICAgICBicmVhazsKICAgIH0KICAgIGluZGV4Kys7CiAgfQogIGlmIChpbmRleCA9PSBiYXNlLmxlbmd0aCkgewogICAgaWYgKGluZGV4ID09IHRhcmdldC5sZW5ndGgpIHsKICAgICAgcmV0dXJuIG5ldyBVcmkocGF0aDogIi4vIik7CiAgICB9CiAgICByZXR1cm4gbmV3IFVyaShwYXRoOiB0YXJnZXQuc2tpcChpbmRleCkuam9pbignLycpKTsKICB9IGVsc2UgaWYgKGluZGV4ID4gMCkgewogICAgcmV0dXJuIG5ldyBVcmkoCiAgICAgICAgcGF0aDogJy4uLycgKiAoYmFzZS5sZW5ndGggLSBpbmRleCkgKyB0YXJnZXQuc2tpcChpbmRleCkuam9pbignLycpKTsKICB9IGVsc2UgewogICAgcmV0dXJuIHVyaTsKICB9Cn0KgL4ATk48ASYBJgEwAUgESlE9BE03BEUcRhsERD0RLSIcFx0dICYQBhpMBh8kHjIkLxkPCAYdHkYGTyxNBlAxQC8YRQYrIT4GKwQRAgEqBEMlREcERjIEQkg/JTBLBAEZJTAlGiMGCz8mFgQBOR0sTQYjJUoGHxcvGycGFyMZBhYGAgExBEIZJCgeKRMcOjIyGQQBRyMBJhAEAU48GixAJBIGBAElNRk2BB0zRRE5KA0GDQQeIiIGOBoUTQsQBAIBKXBhY2thZ2U6cGFja2FnZV9jb25maWcvcGFja2FnZXNfZmlsZS5kYXJ0SXNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZ190ZXN0ZWQvcGFja2FnZV9jb25maWcvbGliL3NyYy9wYWNrYWdlc19pbXBsLmRhcnSMTS8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gSW1wbGVtZW50YXRpb25zIG9mIFtQYWNrYWdlc10gdGhhdCBtYXkgYmUgdXNlZCBpbiBlaXRoZXIgc2VydmVyIG9yIGJyb3dzZXIKLy8vIGJhc2VkIGFwcGxpY2F0aW9ucy4gRm9yIGltcGxlbWVudGF0aW9ucyB0aGF0IGNhbiBvbmx5IHJ1biBpbiB0aGUgYnJvd3NlciwKLy8vIHNlZSBbcGFja2FnZV9jb25maWcucGFja2FnZXNfaW9faW1wbF0uCmxpYnJhcnkgcGFja2FnZV9jb25maWcucGFja2FnZXNfaW1wbDsKCmltcG9ydCAiZGFydDpjb2xsZWN0aW9uIiBzaG93IFVubW9kaWZpYWJsZU1hcFZpZXc7CgppbXBvcnQgIi4uL3BhY2thZ2VzLmRhcnQiOwppbXBvcnQgInV0aWwuZGFydCIgc2hvdyBjaGVja1ZhbGlkUGFja2FnZVVyaTsKCi8vLyBBIFtQYWNrYWdlc10gbnVsbC1vYmplY3QuCmNsYXNzIE5vUGFja2FnZXMgaW1wbGVtZW50cyBQYWNrYWdlcyB7CiAgY29uc3QgTm9QYWNrYWdlcygpOwoKICBVcmkgcmVzb2x2ZShVcmkgcGFja2FnZVVyaSwge1VyaSBub3RGb3VuZChVcmkgcGFja2FnZVVyaSl9KSB7CiAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBjaGVja1ZhbGlkUGFja2FnZVVyaShwYWNrYWdlVXJpKTsKICAgIGlmIChub3RGb3VuZCAhPSBudWxsKSByZXR1cm4gbm90Rm91bmQocGFja2FnZVVyaSk7CiAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZSgKICAgICAgICBwYWNrYWdlVXJpLCAicGFja2FnZVVyaSIsICdObyBwYWNrYWdlIG5hbWVkICIkcGFja2FnZU5hbWUiJyk7CiAgfQoKICBJdGVyYWJsZTxTdHJpbmc+IGdldCBwYWNrYWdlcyA9PiBuZXcgSXRlcmFibGU8U3RyaW5nPi5lbXB0eSgpOwoKICBNYXA8U3RyaW5nLCBVcmk+IGFzTWFwKCkgPT4gY29uc3QgPFN0cmluZywgVXJpPnt9Owp9CgovLy8gQmFzZSBjbGFzcyBmb3IgW1BhY2thZ2VzXSBpbXBsZW1lbnRhdGlvbnMuCi8vLwovLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBbcmVzb2x2ZV0gbWV0aG9kIGluIHRlcm1zIG9mIGEgcHJpdmF0ZQovLy8gbWVtYmVyCmFic3RyYWN0IGNsYXNzIFBhY2thZ2VzQmFzZSBpbXBsZW1lbnRzIFBhY2thZ2VzIHsKICBVcmkgcmVzb2x2ZShVcmkgcGFja2FnZVVyaSwge1VyaSBub3RGb3VuZChVcmkgcGFja2FnZVVyaSl9KSB7CiAgICBwYWNrYWdlVXJpID0gcGFja2FnZVVyaS5ub3JtYWxpemVQYXRoKCk7CiAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBjaGVja1ZhbGlkUGFja2FnZVVyaShwYWNrYWdlVXJpKTsKICAgIFVyaSBwYWNrYWdlQmFzZSA9IGdldEJhc2UocGFja2FnZU5hbWUpOwogICAgaWYgKHBhY2thZ2VCYXNlID09IG51bGwpIHsKICAgICAgaWYgKG5vdEZvdW5kICE9IG51bGwpIHJldHVybiBub3RGb3VuZChwYWNrYWdlVXJpKTsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUoCiAgICAgICAgICBwYWNrYWdlVXJpLCAicGFja2FnZVVyaSIsICdObyBwYWNrYWdlIG5hbWVkICIkcGFja2FnZU5hbWUiJyk7CiAgICB9CiAgICBTdHJpbmcgcGFja2FnZVBhdGggPSBwYWNrYWdlVXJpLnBhdGguc3Vic3RyaW5nKHBhY2thZ2VOYW1lLmxlbmd0aCArIDEpOwogICAgcmV0dXJuIHBhY2thZ2VCYXNlLnJlc29sdmUocGFja2FnZVBhdGgpOwogIH0KCiAgLy8vIEZpbmQgYSBiYXNlIGxvY2F0aW9uIGZvciBhIHBhY2thZ2UgbmFtZS4KICAvLy8KICAvLy8gUmV0dXJucyBgbnVsbGAgaWYgbm8gcGFja2FnZSBleGlzdHMgd2l0aCB0aGF0IG5hbWUsIGFuZCB0aGF0IGNhbiBiZQogIC8vLyBkZXRlcm1pbmVkLgogIFVyaSBnZXRCYXNlKFN0cmluZyBwYWNrYWdlTmFtZSk7Cn0KCi8vLyBBIFtQYWNrYWdlc10gaW1wbGVtZW50YXRpb24gYmFzZWQgb24gYW4gZXhpc3RpbmcgbWFwLgpjbGFzcyBNYXBQYWNrYWdlcyBleHRlbmRzIFBhY2thZ2VzQmFzZSB7CiAgZmluYWwgTWFwPFN0cmluZywgVXJpPiBfbWFwcGluZzsKICBNYXBQYWNrYWdlcyh0aGlzLl9tYXBwaW5nKTsKCiAgVXJpIGdldEJhc2UoU3RyaW5nIHBhY2thZ2VOYW1lKSA9PiBfbWFwcGluZ1twYWNrYWdlTmFtZV07CgogIEl0ZXJhYmxlPFN0cmluZz4gZ2V0IHBhY2thZ2VzID0+IF9tYXBwaW5nLmtleXM7CgogIE1hcDxTdHJpbmcsIFVyaT4gYXNNYXAoKSA9PiBuZXcgVW5tb2RpZmlhYmxlTWFwVmlldzxTdHJpbmcsIFVyaT4oX21hcHBpbmcpOwp9CgovLy8gQSBbUGFja2FnZXNdIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIGEgcmVtb3RlIChlLmcuLCBIVFRQKSBkaXJlY3RvcnkuCi8vLwovLy8gVGhlcmUgaXMgbm8gd2F5IHRvIGRldGVjdCB3aGljaCBwYWNrYWdlcyBleGlzdCBzaG9ydCBvZiB0cnlpbmcgdG8gdXNlCi8vLyB0aGVtLiBZb3UgY2FuJ3QgbmVjZXNzYXJpbHkgY2hlY2sgd2hldGhlciBhIGRpcmVjdG9yeSBleGlzdHMsCi8vLyBleGNlcHQgYnkgY2hlY2tpbmcgZm9yIGEga25vdyBmaWxlIGluIHRoZSBkaXJlY3RvcnkuCmNsYXNzIE5vbkZpbGVQYWNrYWdlc0RpcmVjdG9yeVBhY2thZ2VzIGV4dGVuZHMgUGFja2FnZXNCYXNlIHsKICBmaW5hbCBVcmkgX3BhY2thZ2VCYXNlOwogIE5vbkZpbGVQYWNrYWdlc0RpcmVjdG9yeVBhY2thZ2VzKHRoaXMuX3BhY2thZ2VCYXNlKTsKCiAgVXJpIGdldEJhc2UoU3RyaW5nIHBhY2thZ2VOYW1lKSA9PiBfcGFja2FnZUJhc2UucmVzb2x2ZSgiJHBhY2thZ2VOYW1lLyIpOwoKICBFcnJvciBfZmFpbExpc3RpbmdQYWNrYWdlcygpIHsKICAgIHJldHVybiBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiQ2Fubm90IGxpc3QgcGFja2FnZXMgZm9yIGEgJHtfcGFja2FnZUJhc2Uuc2NoZW1lfTogIgogICAgICAgICJiYXNlZCBwYWNrYWdlIHJvb3QiKTsKICB9CgogIEl0ZXJhYmxlPFN0cmluZz4gZ2V0IHBhY2thZ2VzIHsKICAgIHRocm93IF9mYWlsTGlzdGluZ1BhY2thZ2VzKCk7CiAgfQoKICBNYXA8U3RyaW5nLCBVcmk+IGFzTWFwKCkgewogICAgdGhyb3cgX2ZhaWxMaXN0aW5nUGFja2FnZXMoKTsKICB9Cn0KXgBOTjwBT04rJgEzARsuAR4nFgFAOzcjRgQBQQE1AgEvBEULMkAtOywfOSVIBkwtBAEvBkoSIwIBOikjHgE8ATIBTgIBSgRKQjk+GjcBTAEhIT4fBAEiIgQBHSIEAgEtcGFja2FnZTpwYWNrYWdlX2NvbmZpZy9zcmMvcGFja2FnZXNfaW1wbC5kYXJ0SHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9hcGlfcHJvdG90eXBlL3Rlcm1pbmFsX2NvbG9yX3N1cHBvcnQuZGFydI0rLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZnJvbnRfZW5kLnRlcm1pbmFsX2NvbG9yX3N1cHBvcnQ7CgppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBqc29uRW5jb2RlOwoKaW1wb3J0ICdkYXJ0OmlvJyBzaG93IFBsYXRmb3JtLCBQcm9jZXNzLCBQcm9jZXNzUmVzdWx0LCBzdGRlcnIsIHN0ZG91dDsKCmltcG9ydCAnLi4vZmFzdGEvY29sb3JzLmRhcnQnIHNob3cgQUxMX0NPREVTLCBURVJNSU5BTF9DQVBBQklMSVRJRVM7CgppbXBvcnQgJ2RpYWdub3N0aWNfbWVzc2FnZS5kYXJ0JyBzaG93IERpYWdub3N0aWNNZXNzYWdlOwoKLy8vIFRydWUgaWYgd2Ugc2hvdWxkIGVuYWJsZSBjb2xvcnMgaW4gb3V0cHV0LgovLy8KLy8vIFdlIGVuYWJsZSBjb2xvcnMgb25seSB3aGVuIGJvdGggW3N0ZG91dF0gYW5kIFtzdGRlcnJdIHN1cHBvcnQgQU5TSSBlc2NhcGVzLgpmaW5hbCBib29sIGVuYWJsZVRlcm1pbmFsQ29sb3JzID0gX2NvbXB1dGVFbmFibGVDb2xvcnMoKTsKCnZvaWQgcHJpbnREaWFnbm9zdGljTWVzc2FnZSgKICAgIERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UsIHZvaWQgRnVuY3Rpb24oU3RyaW5nKSBwcmludGxuKSB7CiAgaWYgKGVuYWJsZVRlcm1pbmFsQ29sb3JzKSB7CiAgICBtZXNzYWdlLmFuc2lGb3JtYXR0ZWQuZm9yRWFjaChwcmludGxuKTsKICB9IGVsc2UgewogICAgbWVzc2FnZS5wbGFpblRleHRGb3JtYXR0ZWQuZm9yRWFjaChwcmludGxuKTsKICB9Cn0KCi8vLyBPbiBXaW5kb3dzLCBjb2xvcnMgYXJlIGVuYWJsZWQgaWYgYm90aCBzdGRvdXQgYW5kIHN0ZGVyciBzdXBwb3J0cyBBTlNJCi8vLyBlc2NhcGVzLiAgT24gb3RoZXIgcGxhdGZvcm1zLCB3ZSByZWx5IG9uIHRoZSBleHRlcm5hbCBwcm9ncmFtcyBgdHR5YCBhbmQKLy8vIGB0cHV0YCB0byBjb21wdXRlIGlmIEFOU0kgY29sb3JzIGFyZSBzdXBwb3J0ZWQuCmJvb2wgX2NvbXB1dGVFbmFibGVDb2xvcnMoKSB7CiAgY29uc3QgYm9vbCBkZWJ1ZyA9CiAgICAgIGNvbnN0IGJvb2wuZnJvbUVudmlyb25tZW50KCJmcm9udF9lbmQuZGVidWdfY29tcHV0ZV9lbmFibGVfY29sb3JzIik7CgogIGlmIChQbGF0Zm9ybS5pc1dpbmRvd3MpIHsKICAgIGlmICghc3Rkb3V0LnN1cHBvcnRzQW5zaUVzY2FwZXMgfHwgIXN0ZGVyci5zdXBwb3J0c0Fuc2lFc2NhcGVzKSB7CiAgICAgIC8vIEluIHRoaXMgY2FzZSwgZWl0aGVyIFtzdGRvdXRdIG9yIFtzdGRlcnJdIGRpZCBub3Qgc3VwcG9ydCB0aGUgcHJvcGVydHkKICAgICAgLy8gYHN1cHBvcnRzQW5zaUVzY2FwZXNgLiBTaW5jZSB3ZSBkbyBub3QgaGF2ZSBhbm90aGVyIHdheSB0byBkZXRlcm1pbmUKICAgICAgLy8gc3VwcG9ydCBmb3IgY29sb3JzLCB3ZSBkaXNhYmxlIHRoZW0uCiAgICAgIGlmIChkZWJ1ZykgewogICAgICAgIHByaW50KCJOb3QgZW5hYmxpbmcgY29sb3JzIGFzIEFOU0kgaXMgbm90IHN1cHBvcnRlZC4iKTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoZGVidWcpIHsKICAgICAgcHJpbnQoIkVuYWJsaW5nIGNvbG9ycyBhcyBPUyBpcyBXaW5kb3dzLiIpOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvLyBXZSBoYXZlIHRvIGNoZWNrIGlmIHRoZSB0ZXJtaW5hbCBhY3R1YWxseSBzdXBwb3J0cyBjb2xvcnMuIEN1cnJlbnRseSwgdG8KICAvLyBhdm9pZCBsaW5raW5nIHRoZSBEYXJ0IFZNIHdpdGggbmN1cnNlcywgQU5TSSBlc2NhcGUgc3VwcG9ydCBpcyByZWR1Y2VkIHRvCiAgLy8gYFBsYXRmb3JtLmVudmlyb25tZW50WydURVJNJ10uY29udGFpbnMoInh0ZXJtIilgLgoKICAvLyBDaGVjayBpZiBzdGRpbiBpcyBhIHRlcm1pbmFsIChUVFkpLgogIFByb2Nlc3NSZXN1bHQgcmVzdWx0ID0KICAgICAgUHJvY2Vzcy5ydW5TeW5jKCIvYmluL3NoIiwgWyItYyIsICJ0dHkgPiAvZGV2L251bGwgMj4gL2Rldi9udWxsIl0pOwoKICBpZiAocmVzdWx0LmV4aXRDb2RlICE9IDApIHsKICAgIGlmIChkZWJ1ZykgewogICAgICBwcmludCgiTm90IGVuYWJsaW5nIGNvbG9ycywgc3RkaW4gaXNuJ3QgYSB0ZXJtaW5hbC4iKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vIFRoZSBgLVNgIG9wdGlvbiBvZiBgdHB1dGAgYWxsb3dzIHVzIHRvIHF1ZXJ5IG11bHRpcGxlIGNhcGFiaWxpdGllcyBhdAogIC8vIG9uY2UuCiAgcmVzdWx0ID0gUHJvY2Vzcy5ydW5TeW5jKAogICAgICAiL2Jpbi9zaCIsIFsiLWMiLCAicHJpbnRmICclcycgJyRURVJNSU5BTF9DQVBBQklMSVRJRVMnIHwgdHB1dCAtUyJdKTsKCiAgaWYgKHJlc3VsdC5leGl0Q29kZSAhPSAwKSB7CiAgICBpZiAoZGVidWcpIHsKICAgICAgcHJpbnQoIk5vdCBlbmFibGluZyBjb2xvcnMsIHJ1bm5pbmcgdHB1dCBmYWlsZWQuIik7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBMaXN0PFN0cmluZz4gbGluZXMgPSByZXN1bHQuc3Rkb3V0LnNwbGl0KCJcbiIpOwoKICBpZiAobGluZXMubGVuZ3RoICE9IDIpIHsKICAgIGlmIChkZWJ1ZykgewogICAgICBwcmludCgiTm90IGVuYWJsaW5nIGNvbG9ycywgdW5leHBlY3RlZCBvdXRwdXQgZnJvbSB0cHV0OiAiCiAgICAgICAgICAiJHtqc29uRW5jb2RlKHJlc3VsdC5zdGRvdXQpfS4iKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIFN0cmluZyBudW1iZXJPZkNvbG9ycyA9IGxpbmVzWzBdOwogIGlmICgoaW50LnRyeVBhcnNlKG51bWJlck9mQ29sb3JzKSA/PyAtMSkgPCA4KSB7CiAgICBpZiAoZGVidWcpIHsKICAgICAgcHJpbnQoIk5vdCBlbmFibGluZyBjb2xvcnMsIGxlc3MgdGhhbiA4IGNvbG9ycyBzdXBwb3J0ZWQ6ICIKICAgICAgICAgICIke2pzb25FbmNvZGUobnVtYmVyT2ZDb2xvcnMpfS4iKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIFN0cmluZyBhbGxDb2RlcyA9IGxpbmVzWzFdLnRyaW0oKTsKICBpZiAoQUxMX0NPREVTICE9IGFsbENvZGVzKSB7CiAgICBpZiAoZGVidWcpIHsKICAgICAgcHJpbnQoIk5vdCBlbmFibGluZyBjb2xvcnMsIGNvbG9yIGNvZGVzIGRvbid0IG1hdGNoOiAiCiAgICAgICAgICAiJHtqc29uRW5jb2RlKEFMTF9DT0RFUyl9ICE9ICR7anNvbkVuY29kZShhbGxDb2Rlcyl9LiIpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgaWYgKGRlYnVnKSB7CiAgICBwcmludCgiRW5hYmxpbmcgY29sb3JzLiIpOwogIH0KICByZXR1cm4gdHJ1ZTsKfQpxAE5OPAEqAScBSAFFATkBLwRQOgEdQB4sCzEEAgFLTTQeFUsBHEZQTi4TQAgUBhEyBhEEAU5PNwEpGUoBHhE9BhIEAUsLHEwBHhE6BhIEATIBGxFBLAYSBAEkMhFCLQYSBAElHxE9QwYSBAEPHwQPAgE/cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUvdGVybWluYWxfY29sb3Jfc3VwcG9ydC5kYXJ0QHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9jb21tYW5kX2xpbmVfcmVwb3J0aW5nLmRhcnSW9y8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gUHJvdmlkZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSByZXBvcnQgYW5kIGZvcm1hdCBtZXRob2RzIG9mCi8vLyBbQ29tcGlsZXJDb250ZXh0XSB0aGF0IGFyZSBzdWl0YWJsZSBmb3IgY29tbWFuZC1saW5lIHRvb2xzLiBUaGUgbWV0aG9kcyBpbgovLy8gdGhpcyBsaWJyYXJ5IGFyZW4ndCBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZGlyZWN0bHksIGluc3RlYWQsIG9uZSBzaG91bGQgdXNlCi8vLyBbQ29tcGlsZXJDb250ZXh0XS4KbGlicmFyeSBmYXN0YS5jb21tYW5kX2xpbmVfcmVwb3J0aW5nOwoKaW1wb3J0ICdkYXJ0Om1hdGgnIHNob3cgbWluOwoKaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBMb2NhdGlvbjsKCmltcG9ydCAnLi4vY29tcHV0ZV9wbGF0Zm9ybV9iaW5hcmllc19sb2NhdGlvbi5kYXJ0JyBzaG93IHRyYW5zbGF0ZVNkazsKCmltcG9ydCAnY29sb3JzLmRhcnQnIHNob3cgZ3JlZW4sIG1hZ2VudGEsIHJlZDsKCmltcG9ydCAnY29tcGlsZXJfY29udGV4dC5kYXJ0JyBzaG93IENvbXBpbGVyQ29udGV4dDsKCmltcG9ydCAnY3Jhc2guZGFydCcgc2hvdyBDcmFzaCwgc2FmZVRvU3RyaW5nOwoKaW1wb3J0ICdmYXN0YV9jb2Rlcy5kYXJ0JyBzaG93IExvY2F0ZWRNZXNzYWdlOwoKaW1wb3J0ICdtZXNzYWdlcy5kYXJ0JyBzaG93IGdldExvY2F0aW9uLCBnZXRTb3VyY2VMaW5lOwoKaW1wb3J0ICdwcm9ibGVtcy5kYXJ0JyBzaG93IHVuaGFuZGxlZDsKCmltcG9ydCAnc2V2ZXJpdHkuZGFydCcgc2hvdyBTZXZlcml0eSwgc2V2ZXJpdHlQcmVmaXhlczsKCmltcG9ydCAnc2Nhbm5lci9jaGFyYWN0ZXJzLmRhcnQnIHNob3cgJENBUkVULCAkU1BBQ0UsICRUQUI7CgppbXBvcnQgJ3V0aWwvcmVsYXRpdml6ZS5kYXJ0JyBzaG93IHJlbGF0aXZpemVVcmk7Cgpjb25zdCBib29sIGhpZGVXYXJuaW5ncyA9IGZhbHNlOwoKLy8vIEZvcm1hdHMgW21lc3NhZ2VdIGFzIGEgc3RyaW5nIHRoYXQgaXMgc3VpdGFibGUgZm9yIG91dHB1dCBmcm9tIGEKLy8vIGNvbW1hbmQtbGluZSB0b29sLiBUaGlzIGluY2x1ZGVzIHNvdXJjZSBzbmlwcGV0cyBhbmQgZGlmZmVyZW50IGNvbG9ycyBiYXNlZAovLy8gb24gW3NldmVyaXR5XS4KU3RyaW5nIGZvcm1hdChMb2NhdGVkTWVzc2FnZSBtZXNzYWdlLCBTZXZlcml0eSBzZXZlcml0eSwge0xvY2F0aW9uIGxvY2F0aW9ufSkgewogIHRyeSB7CiAgICBpbnQgbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7CiAgICBpZiAobGVuZ3RoIDwgMSkgewogICAgICAvLyBUT0RPKGFoZSk6IFRocm93IGluIHRoaXMgc2l0dWF0aW9uLiBJdCBpcyBub3JtYWxseSBhbiBlcnJvciBjYXVzZWQgYnkKICAgICAgLy8gZW1wdHkgbmFtZXMuCiAgICAgIGxlbmd0aCA9IDE7CiAgICB9CiAgICBTdHJpbmcgcHJlZml4ID0gc2V2ZXJpdHlQcmVmaXhlc1tzZXZlcml0eV07CiAgICBTdHJpbmcgdGV4dCA9CiAgICAgICAgcHJlZml4ID09IG51bGwgPyBtZXNzYWdlLm1lc3NhZ2UgOiAiJHByZWZpeDogJHttZXNzYWdlLm1lc3NhZ2V9IjsKICAgIGlmIChtZXNzYWdlLnRpcCAhPSBudWxsKSB7CiAgICAgIHRleHQgKz0gIlxuJHttZXNzYWdlLnRpcH0iOwogICAgfQogICAgaWYgKENvbXBpbGVyQ29udGV4dC5lbmFibGVDb2xvcnMpIHsKICAgICAgc3dpdGNoIChzZXZlcml0eSkgewogICAgICAgIGNhc2UgU2V2ZXJpdHkuZXJyb3I6CiAgICAgICAgY2FzZSBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW06CiAgICAgICAgICB0ZXh0ID0gcmVkKHRleHQpOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgU2V2ZXJpdHkud2FybmluZzoKICAgICAgICAgIHRleHQgPSBtYWdlbnRhKHRleHQpOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgU2V2ZXJpdHkuY29udGV4dDoKICAgICAgICAgIHRleHQgPSBncmVlbih0ZXh0KTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIHVuaGFuZGxlZCgiJHNldmVyaXR5IiwgImZvcm1hdCIsIC0xLCBudWxsKTsKICAgICAgfQogICAgfQoKICAgIGlmIChtZXNzYWdlLnVyaSAhPSBudWxsKSB7CiAgICAgIFN0cmluZyBwYXRoID0gcmVsYXRpdml6ZVVyaSh0cmFuc2xhdGVTZGsobWVzc2FnZS51cmkpKTsKICAgICAgaW50IG9mZnNldCA9IG1lc3NhZ2UuY2hhck9mZnNldDsKICAgICAgbG9jYXRpb24gPz89IChvZmZzZXQgPT0gLTEgPyBudWxsIDogZ2V0TG9jYXRpb24obWVzc2FnZS51cmksIG9mZnNldCkpOwogICAgICBTdHJpbmcgc291cmNlTGluZSA9IGdldFNvdXJjZUxpbmUobG9jYXRpb24pOwogICAgICBpZiAoc291cmNlTGluZSA9PSBudWxsKSB7CiAgICAgICAgc291cmNlTGluZSA9ICIiOwogICAgICB9IGVsc2UgaWYgKHNvdXJjZUxpbmUuaXNOb3RFbXB0eSkgewogICAgICAgIC8vIFRPRE8oYXNrZXNjKTogTXVjaCBtb3JlIGNvdWxkIGJlIGRvbmUgdG8gaW5kZW50IHByb3Blcmx5IGluIHRoZQogICAgICAgIC8vIHByZXNlbmNlIG9mIGFsbCBzb3J0cyBvZiB1bmljb2RlIHdlaXJkbmVzcy4KICAgICAgICAvLyBUaGlzIGhhbmRsaW5nIGNvdmVycyB0aGUgY29tbW9uIGNhc2Ugb2Ygc2luZ2xlLXdpZHRoIGNoYXJhY3RlcnMKICAgICAgICAvLyBpbmRlbnRlZCB3aXRoIHNwYWNlcyBhbmQvb3IgdGFicywgdXNpbmcgbm8gc3Vycm9nYXRlcy4KICAgICAgICBpbnQgaW5kZW50TGVuZ3RoID0gbG9jYXRpb24uY29sdW1uIC0gMTsKICAgICAgICBVaW50OExpc3QgaW5kZW50YXRpb24gPSBuZXcgVWludDhMaXN0KGluZGVudExlbmd0aCArIGxlbmd0aCkKICAgICAgICAgIC4uZmlsbFJhbmdlKDAsIGluZGVudExlbmd0aCwgJFNQQUNFKQogICAgICAgICAgLi5maWxsUmFuZ2UoaW5kZW50TGVuZ3RoLCBpbmRlbnRMZW5ndGggKyBsZW5ndGgsICRDQVJFVCk7CiAgICAgICAgaW50IGxlbmd0aEluU291cmNlTGluZSA9IG1pbihpbmRlbnRhdGlvbi5sZW5ndGgsIHNvdXJjZUxpbmUubGVuZ3RoKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aEluU291cmNlTGluZTsgaSsrKSB7CiAgICAgICAgICBpZiAoc291cmNlTGluZS5jb2RlVW5pdEF0KGkpID09ICRUQUIpIHsKICAgICAgICAgICAgaW5kZW50YXRpb25baV0gPSAkVEFCOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBTdHJpbmcgcG9pbnRlciA9IG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhpbmRlbnRhdGlvbik7CiAgICAgICAgaWYgKHBvaW50ZXIubGVuZ3RoID4gc291cmNlTGluZS5sZW5ndGgpIHsKICAgICAgICAgIC8vIFRydW5jYXRlIHRoZSBjYXJldHMgdG8gaGFuZGxlIG1lc3NhZ2VzIHRoYXQgc3BhbiBtdWx0aXBsZSBsaW5lcy4KICAgICAgICAgIGludCBwb2ludGVyTGVuZ3RoID0gc291cmNlTGluZS5sZW5ndGg7CiAgICAgICAgICAvLyBBZGQgb25lIHRvIGNvdmVyIHRoZSBjYXNlIG9mIGEgcGFyc2VyIGVycm9yIHBvaW50aW5nIHRvIEVPRiB3aGVuCiAgICAgICAgICAvLyB0aGUgbGFzdCBsaW5lIGRvZXNuJ3QgZW5kIHdpdGggYSBuZXdsaW5lLiBGb3IgbWVzc2FnZXMgc3Bhbm5pbmcKICAgICAgICAgIC8vIG11bHRpcGxlIGxpbmVzLCB0aGlzIGFsc28gcHJvdmlkZXMgYSBtaW5vciB2aXN1YWwgY2x1ZSB0aGF0IGNhbiBiZQogICAgICAgICAgLy8gdXNlZnVsIGZvciBkZWJ1Z2dpbmcgRmFzdGEuCiAgICAgICAgICBwb2ludGVyTGVuZ3RoICs9IDE7CiAgICAgICAgICBwb2ludGVyID0gcG9pbnRlci5zdWJzdHJpbmcoMCwgcG9pbnRlckxlbmd0aCk7CiAgICAgICAgICBwb2ludGVyICs9ICIuLi4iOwogICAgICAgIH0KICAgICAgICBzb3VyY2VMaW5lID0gIlxuJHNvdXJjZUxpbmVcbiRwb2ludGVyIjsKICAgICAgfQogICAgICBTdHJpbmcgcG9zaXRpb24gPQogICAgICAgICAgbG9jYXRpb24gPT0gbnVsbCA/ICI6MSIgOiAiOiR7bG9jYXRpb24ubGluZX06JHtsb2NhdGlvbi5jb2x1bW59IjsKICAgICAgcmV0dXJuICIkcGF0aCRwb3NpdGlvbjogJHRleHQkc291cmNlTGluZSI7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdGV4dDsKICAgIH0KICB9IGNhdGNoIChlcnJvciwgdHJhY2UpIHsKICAgIHByaW50KCJDcmFzaCB3aGVuIGZvcm1hdHRpbmc6ICIKICAgICAgICAiWyR7bWVzc2FnZS5jb2RlLm5hbWV9XSAke3NhZmVUb1N0cmluZyhtZXNzYWdlLm1lc3NhZ2UpfVxuIgogICAgICAgICIke3NhZmVUb1N0cmluZyhlcnJvcil9XG4iCiAgICAgICAgIiR0cmFjZSIpOwogICAgdGhyb3cgbmV3IENyYXNoKG1lc3NhZ2UudXJpLCBtZXNzYWdlLmNoYXJPZmZzZXQsIGVycm9yLCB0cmFjZSk7CiAgfQp9CgovLy8gQXJlIHByb2JsZW1zIG9mIFtzZXZlcml0eV0gc3VwcHJlc3NlZD8KYm9vbCBpc0hpZGRlbihTZXZlcml0eSBzZXZlcml0eSkgewogIHN3aXRjaCAoc2V2ZXJpdHkpIHsKICAgIGNhc2UgU2V2ZXJpdHkuZXJyb3I6CiAgICBjYXNlIFNldmVyaXR5LmludGVybmFsUHJvYmxlbToKICAgIGNhc2UgU2V2ZXJpdHkuY29udGV4dDoKICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIGNhc2UgU2V2ZXJpdHkud2FybmluZzoKICAgICAgcmV0dXJuIGhpZGVXYXJuaW5nczsKCiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gdW5oYW5kbGVkKCIkc2V2ZXJpdHkiLCAiaXNIaWRkZW4iLCAtMSwgbnVsbCk7CiAgfQp9CgovLy8gQXJlIHByb2JsZW1zIG9mIFtzZXZlcml0eV0gZmF0YWw/IFRoYXQgaXMsIHNob3VsZCB0aGUgY29tcGlsZXIgdGVybWluYXRlCi8vLyBpbW1lZGlhdGVseT8KYm9vbCBzaG91bGRUaHJvd09uKFNldmVyaXR5IHNldmVyaXR5KSB7CiAgc3dpdGNoIChzZXZlcml0eSkgewogICAgY2FzZSBTZXZlcml0eS5lcnJvcjoKICAgICAgcmV0dXJuIENvbXBpbGVyQ29udGV4dC5jdXJyZW50Lm9wdGlvbnMudGhyb3dPbkVycm9yc0ZvckRlYnVnZ2luZzsKCiAgICBjYXNlIFNldmVyaXR5LmludGVybmFsUHJvYmxlbToKICAgICAgcmV0dXJuIHRydWU7CgogICAgY2FzZSBTZXZlcml0eS53YXJuaW5nOgogICAgICByZXR1cm4gQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQub3B0aW9ucy50aHJvd09uV2FybmluZ3NGb3JEZWJ1Z2dpbmc7CgogICAgY2FzZSBTZXZlcml0eS5jb250ZXh0OgogICAgICByZXR1cm4gZmFsc2U7CgogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIHVuaGFuZGxlZCgiJHNldmVyaXR5IiwgInNob3VsZFRocm93T24iLCAtMSwgbnVsbCk7CiAgfQp9Cgpib29sIGlzQ29tcGlsZVRpbWVFcnJvcihTZXZlcml0eSBzZXZlcml0eSkgewogIHN3aXRjaCAoc2V2ZXJpdHkpIHsKICAgIGNhc2UgU2V2ZXJpdHkuZXJyb3I6CiAgICBjYXNlIFNldmVyaXR5LmludGVybmFsUHJvYmxlbToKICAgICAgcmV0dXJuIHRydWU7CgogICAgY2FzZSBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmc6CiAgICAgIHJldHVybiAhQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQub3B0aW9ucy5sZWdhY3lNb2RlOwoKICAgIGNhc2UgU2V2ZXJpdHkud2FybmluZzoKICAgIGNhc2UgU2V2ZXJpdHkuY29udGV4dDoKICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIGNhc2UgU2V2ZXJpdHkuaWdub3JlZDoKICAgICAgYnJlYWs7IC8vIEZhbGwtdGhyb3VnaCB0byB1bmhhbmRsZWQgYmVsb3cuCiAgfQogIHJldHVybiB1bmhhbmRsZWQoIiRzZXZlcml0eSIsICJpc0NvbXBpbGVUaW1lRXJyb3IiLCAtMSwgbnVsbCk7Cn0KgLcATk48AUpPUBcmAR0BKQEwAUcBLwE1AS4BLwE4AScBOAE8ATIBIQFFUBNQCCEWTxYSBjASSh8iBigaHSccEQEfIBEBHx4RARE9CAYBHz4nTTMgGSpLN0tCMEUvRE03MiMMCkAyTjFOTVApHjkcCjAIGEwxDRMGGyREIxNEBAIBKyMWGSMbFAEbGwENOwQCAU0RKBYZSAEjEwEbSgEbFAENQAQCAS0WGSMTASY6ARsbFAEbMQRBAgE3cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2NvbW1hbmRfbGluZV9yZXBvcnRpbmcuZGFydDJzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvbWVzc2FnZXMuZGFydIY8Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEubWVzc2FnZXM7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IExpYnJhcnksIExvY2F0aW9uLCBDb21wb25lbnQsIFRyZWVOb2RlOwoKaW1wb3J0ICdjb21waWxlcl9jb250ZXh0LmRhcnQnIHNob3cgQ29tcGlsZXJDb250ZXh0OwoKZXhwb3J0ICdmYXN0YV9jb2Rlcy5kYXJ0JzsKCmJvb2wgZ2V0IGlzVmVyYm9zZSA9PiBDb21waWxlckNvbnRleHQuY3VycmVudC5vcHRpb25zLnZlcmJvc2U7CgpMb2NhdGlvbiBnZXRMb2NhdGlvbihVcmkgdXJpLCBpbnQgY2hhck9mZnNldCkgewogIHJldHVybiBDb21waWxlckNvbnRleHQuY3VycmVudC51cmlUb1NvdXJjZVt1cmldPy5nZXRMb2NhdGlvbih1cmksIGNoYXJPZmZzZXQpOwp9CgpMb2NhdGlvbiBnZXRMb2NhdGlvbkZyb21VcmkoVXJpIHVyaSwgaW50IGNoYXJPZmZzZXQpIHsKICBpZiAoY2hhck9mZnNldCA9PSAtMSkgcmV0dXJuIG51bGw7CiAgcmV0dXJuIGdldExvY2F0aW9uKHVyaSwgY2hhck9mZnNldCk7Cn0KClN0cmluZyBnZXRTb3VyY2VMaW5lKExvY2F0aW9uIGxvY2F0aW9uKSB7CiAgaWYgKGxvY2F0aW9uID09IG51bGwpIHJldHVybiBudWxsOwogIHJldHVybiBDb21waWxlckNvbnRleHQuY3VycmVudC51cmlUb1NvdXJjZVtsb2NhdGlvbi5maWxlXQogICAgICA/LmdldFRleHRMaW5lKGxvY2F0aW9uLmxpbmUpOwp9CgpMb2NhdGlvbiBnZXRMb2NhdGlvbkZyb21Ob2RlKFRyZWVOb2RlIG5vZGUpIHsKICBpZiAobm9kZS5lbmNsb3NpbmdDb21wb25lbnQgPT0gbnVsbCkgewogICAgVHJlZU5vZGUgcGFyZW50ID0gbm9kZTsKICAgIHdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQgaXMhIExpYnJhcnkpIHsKICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDsKICAgIH0KICAgIGlmIChwYXJlbnQgaXMgTGlicmFyeSkgewogICAgICBDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQub3B0aW9ucy50YXJnZXQKICAgICAgICAgIC5jb25maWd1cmVDb21wb25lbnQoCiAgICAgICAgICAgICAgbmV3IENvbXBvbmVudCh1cmlUb1NvdXJjZTogQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQudXJpVG9Tb3VyY2UpKTsKICAgICAgY29tcG9uZW50LmxpYnJhcmllcy5hZGQocGFyZW50KTsKICAgICAgcGFyZW50LnBhcmVudCA9IGNvbXBvbmVudDsKICAgICAgTG9jYXRpb24gcmVzdWx0ID0gbm9kZS5sb2NhdGlvbjsKICAgICAgY29tcG9uZW50LmxpYnJhcmllcy5jbGVhcigpOwogICAgICBwYXJlbnQucGFyZW50ID0gbnVsbDsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0gZWxzZSB7CiAgICByZXR1cm4gbm9kZS5sb2NhdGlvbjsKICB9Cn0KNgBOTjwBGAFOATUBGwE/ATBRAgE3JScCASolPCQCAS4pHDMeBh1DH1AnIScjHBUNEwYLGgQCASlwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvbWVzc2FnZXMuZGFydDJzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvcHJvYmxlbXMuZGFydIqiLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEucHJvYmxlbXM7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IEZpbGVVcmlOb2RlLCBUcmVlTm9kZTsKCmltcG9ydCAnY29tcGlsZXJfY29udGV4dC5kYXJ0JyBzaG93IENvbXBpbGVyQ29udGV4dDsKCmltcG9ydCAnbWVzc2FnZXMuZGFydCcKICAgIHNob3cKICAgICAgICBMb2NhdGVkTWVzc2FnZSwKICAgICAgICBNZXNzYWdlLAogICAgICAgIG5vTGVuZ3RoLAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtRGVidWdBYm9ydCwKICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuZXhwZWN0ZWQsCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmhhbmRsZWQsCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmltcGxlbWVudGVkLAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVW5zdXBwb3J0ZWQ7CgppbXBvcnQgJ3NldmVyaXR5LmRhcnQnIHNob3cgU2V2ZXJpdHksIHNldmVyaXR5VGV4dHM7CgpjbGFzcyBEZWJ1Z0Fib3J0IHsKICBmaW5hbCBMb2NhdGVkTWVzc2FnZSBtZXNzYWdlOwoKICBEZWJ1Z0Fib3J0KFVyaSB1cmksIGludCBjaGFyT2Zmc2V0LCBTZXZlcml0eSBzZXZlcml0eSwgU3RhY2tUcmFjZSB0cmFjZSkKICAgICAgOiBtZXNzYWdlID0gdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1EZWJ1Z0Fib3J0CiAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHNldmVyaXR5VGV4dHNbc2V2ZXJpdHldLCAiJHRyYWNlIikKICAgICAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIGNoYXJPZmZzZXQsIG5vTGVuZ3RoKTsKCiAgdG9TdHJpbmcoKSA9PiAiRGVidWdBYm9ydDogJHttZXNzYWdlLm1lc3NhZ2V9IjsKfQoKLy8vIFVzZWQgdG8gcmVwb3J0IGFuIGludGVybmFsIGVycm9yLgovLy8KLy8vIEludGVybmFsIGVycm9ycyBzaG91bGQgYmUgYXZvaWRlZCBhcyBiZXN0IGFzIHBvc3NpYmxlLCBidXQgYXJlIHByZWZlcnJlZAovLy8gb3ZlciBhc3NlcnRpb24gZmFpbHVyZXMuIFRoZSBtZXNzYWdlIHNob3VsZCBzdGFydCB3aXRoIGFuIHVwcGVyLWNhc2UgbGV0dGVyCi8vLyBhbmQgY29udGFpbiBhIHNob3J0IGRlc2NyaXB0aW9uIHRoYXQgbWF5IGhlbHAgYSBkZXZlbG9wZXIgZGVidWcgdGhlIGlzc3VlLgovLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbnN0ZWFkIG9mIHVzaW5nIGB0aHJvd2AsIGFzIHRoaXMgYWxsb3dzIHVzIHRvCi8vLyBlbnN1cmUgdGhhdCB0aGVyZSBhcmUgbm8gdGhyb3dzIGFueXdoZXJlIGVsc2UgaW4gdGhlIGNvZGViYXNlLgovLy8KLy8vIEJlZm9yZSBwcmludGluZyB0aGUgbWVzc2FnZSwgdGhlIHN0cmluZyBgIkludGVybmFsIGVycm9yOiAiYCBpcyBwcmVwZW5kZWQuCmR5bmFtaWMgaW50ZXJuYWxQcm9ibGVtKE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIFVyaSB1cmkpIHsKICB0aHJvdyBDb21waWxlckNvbnRleHQuY3VycmVudC5mb3JtYXQoCiAgICAgIG1lc3NhZ2Uud2l0aExvY2F0aW9uKHVyaSwgY2hhck9mZnNldCwgbm9MZW5ndGgpLAogICAgICBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW0pOwp9CgpkeW5hbWljIHVuaW1wbGVtZW50ZWQoU3RyaW5nIHdoYXQsIGludCBjaGFyT2Zmc2V0LCBVcmkgdXJpKSB7CiAgcmV0dXJuIGludGVybmFsUHJvYmxlbSgKICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmltcGxlbWVudGVkLndpdGhBcmd1bWVudHMod2hhdCksCiAgICAgIGNoYXJPZmZzZXQsCiAgICAgIHVyaSk7Cn0KCmR5bmFtaWMgdW5oYW5kbGVkKFN0cmluZyB3aGF0LCBTdHJpbmcgd2hlcmUsIGludCBjaGFyT2Zmc2V0LCBVcmkgdXJpKSB7CiAgcmV0dXJuIGludGVybmFsUHJvYmxlbSgKICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmhhbmRsZWQud2l0aEFyZ3VtZW50cyh3aGF0LCB3aGVyZSksCiAgICAgIGNoYXJPZmZzZXQsCiAgICAgIHVyaSk7Cn0KCmR5bmFtaWMgdW5leHBlY3RlZChTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBhY3R1YWwsIGludCBjaGFyT2Zmc2V0LCBVcmkgdXJpKSB7CiAgcmV0dXJuIGludGVybmFsUHJvYmxlbSgKICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmV4cGVjdGVkLndpdGhBcmd1bWVudHMoZXhwZWN0ZWQsIGFjdHVhbCksCiAgICAgIGNoYXJPZmZzZXQsCiAgICAgIHVyaSk7Cn0KCmR5bmFtaWMgdW5zdXBwb3J0ZWQoU3RyaW5nIG9wZXJhdGlvbiwgaW50IGNoYXJPZmZzZXQsIFVyaSB1cmkpIHsKICByZXR1cm4gaW50ZXJuYWxQcm9ibGVtKAogICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuc3VwcG9ydGVkLndpdGhBcmd1bWVudHMob3BlcmF0aW9uKSwKICAgICAgY2hhck9mZnNldCwKICAgICAgdXJpKTsKfQoKVXJpIGdldEZpbGVVcmkoVHJlZU5vZGUgbm9kZSkgewogIGRvIHsKICAgIGlmIChub2RlIGlzIEZpbGVVcmlOb2RlKSByZXR1cm4gbm9kZS5maWxlVXJpOwogICAgbm9kZSA9IG5vZGUucGFyZW50OwogIH0gd2hpbGUgKG5vZGUgaXMgVHJlZU5vZGUpOwogIHJldHVybiBudWxsOwp9ClYATk48ARgBPQE1ARcJGBESKysqLiwBNQETIAFLND42ATICASYETVBPUEMET0QoNyECAT4aQBIMAgFIGkMSDAIBThpJEgwCAUEaQxIMAgEgBzIYHg8CASlwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcHJvYmxlbXMuZGFydDBzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvdGlja2VyLmRhcnSDbS8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnRpY2tlcjsKCmNsYXNzIFRpY2tlciB7CiAgZmluYWwgU3RvcHdhdGNoIHN3ID0gbmV3IFN0b3B3YXRjaCgpLi5zdGFydCgpOwoKICBib29sIGlzVmVyYm9zZTsKCiAgRHVyYXRpb24gcHJldmlvdXNUaWNrOwoKICBUaWNrZXIoe3RoaXMuaXNWZXJib3NlOiB0cnVlfSkgewogICAgcHJldmlvdXNUaWNrID0gc3cuZWxhcHNlZDsKICB9CgogIHZvaWQgbG9nTXMoT2JqZWN0IG1lc3NhZ2UpIHsKICAgIGxvZygoRHVyYXRpb24gZWxhcHNlZCwgRHVyYXRpb24gc2luY2VTdGFydCkgewogICAgICBwcmludCgiJHNpbmNlU3RhcnQ6ICRtZXNzYWdlIGluICR7ZWxhcHNlZC5pbk1pbGxpc2Vjb25kc31tcy4iKTsKICAgIH0pOwogIH0KCiAgdm9pZCBsb2codm9pZCBmKER1cmF0aW9uIGVsYXBzZWQsIER1cmF0aW9uIHNpbmNlU3RhcnQpKSB7CiAgICBEdXJhdGlvbiBlbGFwc2VkID0gc3cuZWxhcHNlZDsKICAgIHRyeSB7CiAgICAgIGlmIChpc1ZlcmJvc2UpIGYoZWxhcHNlZCAtIHByZXZpb3VzVGljaywgZWxhcHNlZCk7CiAgICB9IGZpbmFsbHkgewogICAgICBwcmV2aW91c1RpY2sgPSBzdy5lbGFwc2VkOwogICAgfQogIH0KCiAgdm9pZCByZXNldCgpIHsKICAgIHN3LnJlc2V0KCk7CiAgICBwcmV2aW91c1RpY2sgPSBzdy5lbGFwc2VkOwogIH0KfQonAE5OPAEWAQ8xARIBGQEjHwQBHzJGCAQBPCMKORAhBgQBERAfBAIBJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90aWNrZXIuZGFydDhzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvdXJpX3RyYW5zbGF0b3IuZGFydIu5Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEudXJpX3RyYW5zbGF0b3I7CgppbXBvcnQgJ3BhY2thZ2U6cGFja2FnZV9jb25maWcvcGFja2FnZXMuZGFydCcgc2hvdyBQYWNrYWdlczsKCmltcG9ydCAnLi4vYmFzZS9saWJyYXJpZXNfc3BlY2lmaWNhdGlvbi5kYXJ0JyBzaG93IFRhcmdldExpYnJhcmllc1NwZWNpZmljYXRpb247CmltcG9ydCAnY29tcGlsZXJfY29udGV4dC5kYXJ0JyBzaG93IENvbXBpbGVyQ29udGV4dDsKaW1wb3J0ICdmYXN0YV9jb2Rlcy5kYXJ0JzsKaW1wb3J0ICdzZXZlcml0eS5kYXJ0JyBzaG93IFNldmVyaXR5OwoKY2xhc3MgVXJpVHJhbnNsYXRvciB7CiAgZmluYWwgVGFyZ2V0TGlicmFyaWVzU3BlY2lmaWNhdGlvbiBkYXJ0TGlicmFyaWVzOwoKICBmaW5hbCBQYWNrYWdlcyBwYWNrYWdlczsKCiAgVXJpVHJhbnNsYXRvcih0aGlzLmRhcnRMaWJyYXJpZXMsIHRoaXMucGFja2FnZXMpOwoKICBMaXN0PFVyaT4gZ2V0RGFydFBhdGNoZXMoU3RyaW5nIGxpYnJhcnlOYW1lKSA9PgogICAgICBkYXJ0TGlicmFyaWVzLmxpYnJhcnlJbmZvRm9yKGxpYnJhcnlOYW1lKT8ucGF0Y2hlczsKCiAgYm9vbCBpc1BsYXRmb3JtSW1wbGVtZW50YXRpb24oVXJpIHVyaSkgewogICAgaWYgKHVyaS5zY2hlbWUgIT0gImRhcnQiKSByZXR1cm4gZmFsc2U7CiAgICBTdHJpbmcgcGF0aCA9IHVyaS5wYXRoOwogICAgcmV0dXJuIGRhcnRMaWJyYXJpZXMubGlicmFyeUluZm9Gb3IocGF0aCkgPT0gbnVsbCB8fCBwYXRoLnN0YXJ0c1dpdGgoIl8iKTsKICB9CgogIC8vIFRPRE8oc2lnbXVuZCwgYWhlKTogY29uc2lkZXIgZXhwYW5kaW5nIHRoaXMgQVBJIHRvIGluY2x1ZGUgYW4gZXJyb3IKICAvLyBjYWxsYmFjaywgc28gd2UgY2FuIHByb3ZpZGUgYW4gZXJyb3IgbG9jYXRpb24gd2hlbiBvbmUgaXMgYXZhaWxhYmxlLiBGb3IKICAvLyBleGFtcGxlLCBpZiB0aGUgZXJyb3Igb2NjdXJzIGluIGFuIGBpbXBvcnRgLgogIFVyaSB0cmFuc2xhdGUoVXJpIHVyaSwgW2Jvb2wgcmVwb3J0TWVzc2FnZSA9IHRydWVdKSB7CiAgICBpZiAodXJpLnNjaGVtZSA9PSAiZGFydCIpIHJldHVybiBfdHJhbnNsYXRlRGFydFVyaSh1cmkpOwogICAgaWYgKHVyaS5zY2hlbWUgPT0gInBhY2thZ2UiKSB7CiAgICAgIHJldHVybiBfdHJhbnNsYXRlUGFja2FnZVVyaSh1cmksIHJlcG9ydE1lc3NhZ2UpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBib29sIGlzTGlicmFyeVN1cHBvcnRlZChTdHJpbmcgbGlicmFyeU5hbWUpIHsKICAgIC8vIFRPRE8oc2lnbXVuZCk6IGNoYW5nZSB0aGlzIHRvIGA/PyBmYWxzZWAgd2hlbiBhbGwgYmFja2VuZHMgcHJvdmlkZSB0aGUKICAgIC8vIGBsaWJyYXJpZXMuanNvbmAgZmlsZSBieSBkZWZhdWx0IChJc3N1ZSAjMzI2NTcpLgogICAgcmV0dXJuIGRhcnRMaWJyYXJpZXMubGlicmFyeUluZm9Gb3IobGlicmFyeU5hbWUpPy5pc1N1cHBvcnRlZCA/PyB0cnVlOwogIH0KCiAgVXJpIF90cmFuc2xhdGVEYXJ0VXJpKFVyaSB1cmkpIHsKICAgIGlmICghdXJpLmlzU2NoZW1lKCdkYXJ0JykpIHJldHVybiBudWxsOwogICAgcmV0dXJuIGRhcnRMaWJyYXJpZXMubGlicmFyeUluZm9Gb3IodXJpLnBhdGgpPy51cmk7CiAgfQoKICBVcmkgX3RyYW5zbGF0ZVBhY2thZ2VVcmkoVXJpIHVyaSwgYm9vbCByZXBvcnRNZXNzYWdlKSB7CiAgICB0cnkgewogICAgICAvLyBUT0RPKHNpZ211bmQpOiBvbmNlIHdlIHJlbW92ZSB0aGUgYHBhcnNlYCBBUEksIHdlIGNhbiBlbnN1cmUgdGhhdAogICAgICAvLyBwYWNrYWdlcyB3aWxsIG5ldmVyIGJlIG51bGwgYW5kIGdldCByaWQgb2YgYD9gIGJlbG93LgogICAgICByZXR1cm4gcGFja2FnZXM/LnJlc29sdmUodXJpLAogICAgICAgICAgbm90Rm91bmQ6IHJlcG9ydE1lc3NhZ2UKICAgICAgICAgICAgICA/IF9wYWNrYWdlVXJpTm90Rm91bmQKICAgICAgICAgICAgICA6IF9wYWNrYWdlVXJpTm90Rm91bmROb1JlcG9ydCk7CiAgICB9IG9uIEFyZ3VtZW50RXJyb3IgY2F0Y2ggKGUpIHsKICAgICAgLy8gVE9ETyhzaWdtdW5kKTogY2F0Y2ggYSBtb3JlIHByZWNpc2UgZXJyb3Igd2hlbgogICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3BhY2thZ2VfY29uZmlnL2lzc3Vlcy80MCBpcyBmaXhlZC4KICAgICAgaWYgKHJlcG9ydE1lc3NhZ2UpIHsKICAgICAgICBDb21waWxlckNvbnRleHQuY3VycmVudC5yZXBvcnRXaXRob3V0TG9jYXRpb24oCiAgICAgICAgICAgIHRlbXBsYXRlSW52YWxpZFBhY2thZ2VVcmkud2l0aEFyZ3VtZW50cyh1cmksICckZScpLCBTZXZlcml0eS5lcnJvcik7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICBzdGF0aWMgVXJpIF9wYWNrYWdlVXJpTm90Rm91bmQoVXJpIHVyaSkgewogICAgU3RyaW5nIG5hbWUgPSB1cmkucGF0aFNlZ21lbnRzLmZpcnN0OwogICAgQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQucmVwb3J0V2l0aG91dExvY2F0aW9uKAogICAgICAgIHRlbXBsYXRlUGFja2FnZU5vdEZvdW5kLndpdGhBcmd1bWVudHMobmFtZSwgdXJpKSwgU2V2ZXJpdHkuZXJyb3IpOwogICAgLy8gVE9ETyhzaWdtdW5kLCBhaGUpOiBlbnN1cmUgd2Ugb25seSByZXBvcnQgYW4gZXJyb3Igb25jZSwKICAgIC8vIHRoaXMgbnVsbCByZXN1bHQgd2lsbCBsaWtlbHkgY2F1c2UgYW5vdGhlciBlcnJvciBmdXJ0aGVyIGRvd24gaW4gdGhlCiAgICAvLyBjb21waWxlci4KICAgIHJldHVybiBudWxsOwogIH0KCiAgc3RhdGljIFVyaSBfcGFja2FnZVVyaU5vdEZvdW5kTm9SZXBvcnQoVXJpIHVyaSkgewogICAgcmV0dXJuIG51bGw7CiAgfQp9ClYATk48AR4BPQFRNRsmARY0ARsBNAEyOgErLBxPBAFJTjI4PSM3BhEEATBOOEsEASMsOAQBOgpLPyQiJC4jOEkbN1EIEwYEASwqM0tATBERBAE0EQQCAS9wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdXJpX3RyYW5zbGF0b3IuZGFydDdzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvc2Nhbm5lci90b2tlbi5kYXJ0p/wvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5zY2FubmVyLnRva2VuOwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIGFzIGFuYWx5emVyOwppbXBvcnQgJy4uLy4uL3NjYW5uZXIvdG9rZW4uZGFydCcgc2hvdyBUb2tlbiwgVG9rZW5UeXBlOwoKaW1wb3J0ICd0b2tlbl9jb25zdGFudHMuZGFydCcgc2hvdyBJREVOVElGSUVSX1RPS0VOOwoKaW1wb3J0ICdzdHJpbmdfY2Fub25pY2FsaXplci5kYXJ0JzsKCi8qKgogKiBBIFN0cmluZy12YWx1ZWQgdG9rZW4uIFJlcHJlc2VudHMgaWRlbnRpZmllcnMsIHN0cmluZyBsaXRlcmFscywKICogbnVtYmVyIGxpdGVyYWxzLCBjb21tZW50cywgYW5kIGVycm9yIHRva2VucywgdXNpbmcgdGhlIGNvcnJlc3BvbmRpbmcKICogcHJlY2VkZW5jZSBpbmZvLgogKi8KY2xhc3MgU3RyaW5nVG9rZW4gZXh0ZW5kcyBhbmFseXplci5TaW1wbGVUb2tlbiBpbXBsZW1lbnRzIGFuYWx5emVyLlN0cmluZ1Rva2VuIHsKICAvKioKICAgKiBUaGUgbGVuZ3RoIHRocmVzaG9sZCBhYm92ZSB3aGljaCBzdWJzdHJpbmcgdG9rZW5zIGFyZSBjb21wdXRlZCBsYXppbHkuCiAgICoKICAgKiBGb3Igc3RyaW5nIHRva2VucyB0aGF0IGFyZSBzdWJzdHJpbmdzIG9mIHRoZSBwcm9ncmFtIHNvdXJjZSwgdGhlIGFjdHVhbAogICAqIHN1YnN0cmluZyBleHRyYWN0aW9uIGlzIHBlcmZvcm1lZCBsYXppbHkuIFRoaXMgaXMgYmVuZWZpY2lhbCBiZWNhdXNlCiAgICogbm90IGFsbCBzY2FubmVkIGNvZGUgYXJlIGFjdHVhbGx5IHVzZWQuIEZvciB1bnVzZWQgcGFydHMsIHRoZSBzdWJzdHJpbmdzCiAgICogYXJlIG5ldmVyIGNvbXB1dGVkIGFuZCBhbGxvY2F0ZWQuCiAgICovCiAgc3RhdGljIGNvbnN0IGludCBMQVpZX1RIUkVTSE9MRCA9IDQ7CgogIHZhciAvKiBTdHJpbmcgfCBMYXp5U3VidHJpbmcgKi8gdmFsdWVPckxhenlTdWJzdHJpbmc7CgogIC8qKgogICAqIENyZWF0ZXMgYSBub24tbGF6eSBzdHJpbmcgdG9rZW4uIElmIFtjYW5vbmljYWxpemVdIGlzIHRydWUsIHRoZSBzdHJpbmcKICAgKiBpcyBjYW5vbmljYWxpemVkIGJlZm9yZSB0aGUgdG9rZW4gaXMgY3JlYXRlZC4KICAgKi8KICBTdHJpbmdUb2tlbi5mcm9tU3RyaW5nKFRva2VuVHlwZSB0eXBlLCBTdHJpbmcgdmFsdWUsIGludCBjaGFyT2Zmc2V0LAogICAgICB7Ym9vbCBjYW5vbmljYWxpemU6IGZhbHNlLCBhbmFseXplci5Db21tZW50VG9rZW4gcHJlY2VkaW5nQ29tbWVudHN9KQogICAgICA6IHZhbHVlT3JMYXp5U3Vic3RyaW5nID0KICAgICAgICAgICAgY2Fub25pY2FsaXplZFN0cmluZyh2YWx1ZSwgMCwgdmFsdWUubGVuZ3RoLCBjYW5vbmljYWxpemUpLAogICAgICAgIHN1cGVyKHR5cGUsIGNoYXJPZmZzZXQsIHByZWNlZGluZ0NvbW1lbnRzKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIGxhenkgc3RyaW5nIHRva2VuLiBJZiBbY2Fub25pY2FsaXplXSBpcyB0cnVlLCB0aGUgc3RyaW5nCiAgICogaXMgY2Fub25pY2FsaXplZCBiZWZvcmUgdGhlIHRva2VuIGlzIGNyZWF0ZWQuCiAgICovCiAgU3RyaW5nVG9rZW4uZnJvbVN1YnN0cmluZygKICAgICAgVG9rZW5UeXBlIHR5cGUsIFN0cmluZyBkYXRhLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBjaGFyT2Zmc2V0LAogICAgICB7Ym9vbCBjYW5vbmljYWxpemU6IGZhbHNlLCBhbmFseXplci5Db21tZW50VG9rZW4gcHJlY2VkaW5nQ29tbWVudHN9KQogICAgICA6IHN1cGVyKHR5cGUsIGNoYXJPZmZzZXQsIHByZWNlZGluZ0NvbW1lbnRzKSB7CiAgICBpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICBpZiAobGVuZ3RoIDw9IExBWllfVEhSRVNIT0xEKSB7CiAgICAgIHZhbHVlT3JMYXp5U3Vic3RyaW5nID0KICAgICAgICAgIGNhbm9uaWNhbGl6ZWRTdHJpbmcoZGF0YSwgc3RhcnQsIGVuZCwgY2Fub25pY2FsaXplKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhbHVlT3JMYXp5U3Vic3RyaW5nID0KICAgICAgICAgIG5ldyBfTGF6eVN1YnN0cmluZyhkYXRhLCBzdGFydCwgbGVuZ3RoLCBjYW5vbmljYWxpemUpOwogICAgfQogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIGxhenkgc3RyaW5nIHRva2VuLiBJZiBbYXNjaWlPbmx5XSBpcyBmYWxzZSwgdGhlIGJ5dGUgYXJyYXkKICAgKiBpcyBwYXNzZWQgdGhyb3VnaCBhIFVURi04IGRlY29kZXIuCiAgICovCiAgU3RyaW5nVG9rZW4uZnJvbVV0ZjhCeXRlcyhUb2tlblR5cGUgdHlwZSwgTGlzdDxpbnQ+IGRhdGEsIGludCBzdGFydCwgaW50IGVuZCwKICAgICAgYm9vbCBhc2NpaU9ubHksIGludCBjaGFyT2Zmc2V0LAogICAgICB7YW5hbHl6ZXIuQ29tbWVudFRva2VuIHByZWNlZGluZ0NvbW1lbnRzfSkKICAgICAgOiBzdXBlcih0eXBlLCBjaGFyT2Zmc2V0LCBwcmVjZWRpbmdDb21tZW50cykgewogICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKGxlbmd0aCA8PSBMQVpZX1RIUkVTSE9MRCkgewogICAgICB2YWx1ZU9yTGF6eVN1YnN0cmluZyA9IGRlY29kZVV0ZjgoZGF0YSwgc3RhcnQsIGVuZCwgYXNjaWlPbmx5KTsKICAgIH0gZWxzZSB7CiAgICAgIHZhbHVlT3JMYXp5U3Vic3RyaW5nID0gbmV3IF9MYXp5U3Vic3RyaW5nKGRhdGEsIHN0YXJ0LCBsZW5ndGgsIGFzY2lpT25seSk7CiAgICB9CiAgfQoKICBTdHJpbmdUb2tlbi5fKFRva2VuVHlwZSB0eXBlLCB0aGlzLnZhbHVlT3JMYXp5U3Vic3RyaW5nLCBpbnQgY2hhck9mZnNldCwKICAgICAgW2FuYWx5emVyLkNvbW1lbnRUb2tlbiBwcmVjZWRpbmdDb21tZW50c10pCiAgICAgIDogc3VwZXIodHlwZSwgY2hhck9mZnNldCwgcHJlY2VkaW5nQ29tbWVudHMpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGxleGVtZSB7CiAgICBpZiAodmFsdWVPckxhenlTdWJzdHJpbmcgaXMgU3RyaW5nKSB7CiAgICAgIHJldHVybiB2YWx1ZU9yTGF6eVN1YnN0cmluZzsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydCh2YWx1ZU9yTGF6eVN1YnN0cmluZyBpcyBfTGF6eVN1YnN0cmluZyk7CiAgICAgIHZhciBkYXRhID0gdmFsdWVPckxhenlTdWJzdHJpbmcuZGF0YTsKICAgICAgaW50IHN0YXJ0ID0gdmFsdWVPckxhenlTdWJzdHJpbmcuc3RhcnQ7CiAgICAgIGludCBlbmQgPSBzdGFydCArIHZhbHVlT3JMYXp5U3Vic3RyaW5nLmxlbmd0aDsKICAgICAgaWYgKGRhdGEgaXMgU3RyaW5nKSB7CiAgICAgICAgdmFsdWVPckxhenlTdWJzdHJpbmcgPSBjYW5vbmljYWxpemVkU3RyaW5nKAogICAgICAgICAgICBkYXRhLCBzdGFydCwgZW5kLCB2YWx1ZU9yTGF6eVN1YnN0cmluZy5ib29sVmFsdWUpOwogICAgICB9IGVsc2UgewogICAgICAgIHZhbHVlT3JMYXp5U3Vic3RyaW5nID0KICAgICAgICAgICAgZGVjb2RlVXRmOChkYXRhLCBzdGFydCwgZW5kLCB2YWx1ZU9yTGF6eVN1YnN0cmluZy5ib29sVmFsdWUpOwogICAgICB9CiAgICAgIHJldHVybiB2YWx1ZU9yTGF6eVN1YnN0cmluZzsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzSWRlbnRpZmllciA9PiBpZGVudGljYWwoa2luZCwgSURFTlRJRklFUl9UT0tFTik7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IGxleGVtZTsKCiAgc3RhdGljIGZpbmFsIFN0cmluZ0Nhbm9uaWNhbGl6ZXIgY2Fub25pY2FsaXplciA9IG5ldyBTdHJpbmdDYW5vbmljYWxpemVyKCk7CgogIHN0YXRpYyBTdHJpbmcgY2Fub25pY2FsaXplZFN0cmluZygKICAgICAgU3RyaW5nIHMsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBjYW5vbmljYWxpemUpIHsKICAgIGlmICghY2Fub25pY2FsaXplKSByZXR1cm4gczsKICAgIHJldHVybiBjYW5vbmljYWxpemVyLmNhbm9uaWNhbGl6ZShzLCBzdGFydCwgZW5kLCBmYWxzZSk7CiAgfQoKICBzdGF0aWMgU3RyaW5nIGRlY29kZVV0ZjgoTGlzdDxpbnQ+IGRhdGEsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBhc2NpaU9ubHkpIHsKICAgIHJldHVybiBjYW5vbmljYWxpemVyLmNhbm9uaWNhbGl6ZShkYXRhLCBzdGFydCwgZW5kLCBhc2NpaU9ubHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gY29weSgpID0+IG5ldyBTdHJpbmdUb2tlbi5fKAogICAgICB0eXBlLCB2YWx1ZU9yTGF6eVN1YnN0cmluZywgY2hhck9mZnNldCwgY29weUNvbW1lbnRzKHByZWNlZGluZ0NvbW1lbnRzKSk7CgogIEBvdmVycmlkZQogIFN0cmluZyB2YWx1ZSgpID0+IGxleGVtZTsKfQoKLyoqCiAqIEEgU3RyaW5nLXZhbHVlZCB0b2tlbiB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuCiAqLwpjbGFzcyBTeW50aGV0aWNTdHJpbmdUb2tlbiBleHRlbmRzIFN0cmluZ1Rva2VuCiAgICBpbXBsZW1lbnRzIGFuYWx5emVyLlN5bnRoZXRpY1N0cmluZ1Rva2VuIHsKICBTeW50aGV0aWNTdHJpbmdUb2tlbihUb2tlblR5cGUgdHlwZSwgU3RyaW5nIHZhbHVlLCBpbnQgb2Zmc2V0LAogICAgICBbYW5hbHl6ZXIuQ29tbWVudFRva2VuIHByZWNlZGluZ0NvbW1lbnRzXSkKICAgICAgOiBzdXBlci5fKHR5cGUsIHZhbHVlLCBvZmZzZXQsIHByZWNlZGluZ0NvbW1lbnRzKTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsZW5ndGggPT4gMDsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gY29weSgpID0+IG5ldyBTeW50aGV0aWNTdHJpbmdUb2tlbigKICAgICAgdHlwZSwgdmFsdWVPckxhenlTdWJzdHJpbmcsIG9mZnNldCwgY29weUNvbW1lbnRzKHByZWNlZGluZ0NvbW1lbnRzKSk7Cn0KCmNsYXNzIENvbW1lbnRUb2tlbiBleHRlbmRzIFN0cmluZ1Rva2VuIGltcGxlbWVudHMgYW5hbHl6ZXIuQ29tbWVudFRva2VuIHsKICBAb3ZlcnJpZGUKICBhbmFseXplci5TaW1wbGVUb2tlbiBwYXJlbnQ7CgogIC8qKgogICAqIENyZWF0ZXMgYSBsYXp5IGNvbW1lbnQgdG9rZW4uIElmIFtjYW5vbmljYWxpemVdIGlzIHRydWUsIHRoZSBzdHJpbmcKICAgKiBpcyBjYW5vbmljYWxpemVkIGJlZm9yZSB0aGUgdG9rZW4gaXMgY3JlYXRlZC4KICAgKi8KICBDb21tZW50VG9rZW4uZnJvbVN1YnN0cmluZygKICAgICAgVG9rZW5UeXBlIHR5cGUsIFN0cmluZyBkYXRhLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBjaGFyT2Zmc2V0LAogICAgICB7Ym9vbCBjYW5vbmljYWxpemU6IGZhbHNlfSkKICAgICAgOiBzdXBlci5mcm9tU3Vic3RyaW5nKHR5cGUsIGRhdGEsIHN0YXJ0LCBlbmQsIGNoYXJPZmZzZXQsCiAgICAgICAgICAgIGNhbm9uaWNhbGl6ZTogY2Fub25pY2FsaXplKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5vbi1sYXp5IGNvbW1lbnQgdG9rZW4uCiAgICovCiAgQ29tbWVudFRva2VuLmZyb21TdHJpbmcoVG9rZW5UeXBlIHR5cGUsIFN0cmluZyBsZXhlbWUsIGludCBjaGFyT2Zmc2V0KQogICAgICA6IHN1cGVyLmZyb21TdHJpbmcodHlwZSwgbGV4ZW1lLCBjaGFyT2Zmc2V0KTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIGxhenkgc3RyaW5nIHRva2VuLiBJZiBbYXNjaWlPbmx5XSBpcyBmYWxzZSwgdGhlIGJ5dGUgYXJyYXkKICAgKiBpcyBwYXNzZWQgdGhyb3VnaCBhIFVURi04IGRlY29kZXIuCiAgICovCiAgQ29tbWVudFRva2VuLmZyb21VdGY4Qnl0ZXMoVG9rZW5UeXBlIHR5cGUsIExpc3Q8aW50PiBkYXRhLCBpbnQgc3RhcnQsIGludCBlbmQsCiAgICAgIGJvb2wgYXNjaWlPbmx5LCBpbnQgY2hhck9mZnNldCkKICAgICAgOiBzdXBlci5mcm9tVXRmOEJ5dGVzKHR5cGUsIGRhdGEsIHN0YXJ0LCBlbmQsIGFzY2lpT25seSwgY2hhck9mZnNldCk7CgogIENvbW1lbnRUb2tlbi5fKFRva2VuVHlwZSB0eXBlLCB2YWx1ZU9yTGF6eVN1YnN0cmluZywgaW50IGNoYXJPZmZzZXQpCiAgICAgIDogc3VwZXIuXyh0eXBlLCB2YWx1ZU9yTGF6eVN1YnN0cmluZywgY2hhck9mZnNldCk7CgogIEBvdmVycmlkZQogIENvbW1lbnRUb2tlbiBjb3B5KCkgPT4KICAgICAgbmV3IENvbW1lbnRUb2tlbi5fKHR5cGUsIHZhbHVlT3JMYXp5U3Vic3RyaW5nLCBjaGFyT2Zmc2V0KTsKCiAgQG92ZXJyaWRlCiAgdm9pZCByZW1vdmUoKSB7CiAgICBpZiAocHJldmlvdXMgIT0gbnVsbCkgewogICAgICBwcmV2aW91cy5zZXROZXh0V2l0aG91dFNldHRpbmdQcmV2aW91cyhuZXh0KTsKICAgICAgbmV4dD8ucHJldmlvdXMgPSBwcmV2aW91czsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChwYXJlbnQucHJlY2VkaW5nQ29tbWVudHMgPT0gdGhpcyk7CiAgICAgIHBhcmVudC5wcmVjZWRpbmdDb21tZW50cyA9IG5leHQgYXMgQ29tbWVudFRva2VuOwogICAgfQogIH0KfQoKY2xhc3MgRGFydERvY1Rva2VuIGV4dGVuZHMgQ29tbWVudFRva2VuCiAgICBpbXBsZW1lbnRzIGFuYWx5emVyLkRvY3VtZW50YXRpb25Db21tZW50VG9rZW4gewogIC8qKgogICAqIENyZWF0ZXMgYSBsYXp5IGNvbW1lbnQgdG9rZW4uIElmIFtjYW5vbmljYWxpemVdIGlzIHRydWUsIHRoZSBzdHJpbmcKICAgKiBpcyBjYW5vbmljYWxpemVkIGJlZm9yZSB0aGUgdG9rZW4gaXMgY3JlYXRlZC4KICAgKi8KICBEYXJ0RG9jVG9rZW4uZnJvbVN1YnN0cmluZygKICAgICAgVG9rZW5UeXBlIHR5cGUsIFN0cmluZyBkYXRhLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBjaGFyT2Zmc2V0LAogICAgICB7Ym9vbCBjYW5vbmljYWxpemU6IGZhbHNlfSkKICAgICAgOiBzdXBlci5mcm9tU3Vic3RyaW5nKHR5cGUsIGRhdGEsIHN0YXJ0LCBlbmQsIGNoYXJPZmZzZXQsCiAgICAgICAgICAgIGNhbm9uaWNhbGl6ZTogY2Fub25pY2FsaXplKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIGxhenkgc3RyaW5nIHRva2VuLiBJZiBbYXNjaWlPbmx5XSBpcyBmYWxzZSwgdGhlIGJ5dGUgYXJyYXkKICAgKiBpcyBwYXNzZWQgdGhyb3VnaCBhIFVURi04IGRlY29kZXIuCiAgICovCiAgRGFydERvY1Rva2VuLmZyb21VdGY4Qnl0ZXMoVG9rZW5UeXBlIHR5cGUsIExpc3Q8aW50PiBkYXRhLCBpbnQgc3RhcnQsIGludCBlbmQsCiAgICAgIGJvb2wgYXNjaWlPbmx5LCBpbnQgY2hhck9mZnNldCkKICAgICAgOiBzdXBlci5mcm9tVXRmOEJ5dGVzKHR5cGUsIGRhdGEsIHN0YXJ0LCBlbmQsIGFzY2lpT25seSwgY2hhck9mZnNldCk7CgogIERhcnREb2NUb2tlbi5fKFRva2VuVHlwZSB0eXBlLCB2YWx1ZU9yTGF6eVN1YnN0cmluZywgaW50IGNoYXJPZmZzZXQpCiAgICAgIDogc3VwZXIuXyh0eXBlLCB2YWx1ZU9yTGF6eVN1YnN0cmluZywgY2hhck9mZnNldCk7CgogIEBvdmVycmlkZQogIERhcnREb2NUb2tlbiBjb3B5KCkgPT4KICAgICAgbmV3IERhcnREb2NUb2tlbi5fKHR5cGUsIHZhbHVlT3JMYXp5U3Vic3RyaW5nLCBjaGFyT2Zmc2V0KTsKfQoKLyoqCiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHRvIGNvbXB1dGUgYSBzdWJzdHJpbmcKICogbGF6aWx5LiBUaGUgc3Vic3RyaW5nIGNhbiBlaXRoZXIgb3JpZ2luYXRlIGZyb20gYSBzdHJpbmcgb3IgZnJvbQogKiBhIFs6TGlzdDxpbnQ+Ol0gb2YgVVRGLTggYnl0ZXMuCiAqLwphYnN0cmFjdCBjbGFzcyBfTGF6eVN1YnN0cmluZyB7CiAgLyoqIFRoZSBvcmlnaW5hbCBkYXRhLCBlaXRoZXIgYSBzdHJpbmcgb3IgYSBMaXN0PGludD4gKi8KICBnZXQgZGF0YTsKCiAgaW50IGdldCBzdGFydDsKICBpbnQgZ2V0IGxlbmd0aDsKCiAgLyoqCiAgICogSWYgdGhpcyBzdWJzdHJpbmcgaXMgYmFzZWQgb24gYSBTdHJpbmcsIHRoZSBbYm9vbFZhbHVlXSBpbmRpY2F0ZXMgd2hldGhlcgogICAqIHRoZSByZXN1bHRpbmcgc3Vic3RyaW5nIHNob3VsZCBiZSBjYW5vbmljYWxpemVkLgogICAqCiAgICogRm9yIHN1YnN0cmluZ3MgYmFzZWQgb24gYSBieXRlIGFycmF5LCB0aGUgW2Jvb2xWYWx1ZV0gaXMgdHJ1ZSBpZiB0aGUKICAgKiBhcnJheSBvbmx5IGhvbGRzIEFTQ0lJIGNoYXJhY3RlcnMuIFRoZSByZXN1bHRpbmcgc3Vic3RyaW5nIHdpbGwgYmUKICAgKiBjYW5vbmljYWxpemVkIGFmdGVyIGRlY29kaW5nLgogICAqLwogIGJvb2wgZ2V0IGJvb2xWYWx1ZTsKCiAgX0xhenlTdWJzdHJpbmcuaW50ZXJuYWwoKTsKCiAgZmFjdG9yeSBfTGF6eVN1YnN0cmluZyhkYXRhLCBpbnQgc3RhcnQsIGludCBsZW5ndGgsIGJvb2wgYikgewogICAgLy8gU2VlIGNvbW1lbnQgb24gW0NvbXBhY3RMYXp5U3Vic3RyaW5nXS4KICAgIGlmIChzdGFydCA8IDB4MTAwMDAwICYmIGxlbmd0aCA8IDB4MjAwKSB7CiAgICAgIGludCBmaWVsZHMgPSAoc3RhcnQgPDwgOSk7CiAgICAgIGZpZWxkcyA9IGZpZWxkcyB8IGxlbmd0aDsKICAgICAgZmllbGRzID0gZmllbGRzIDw8IDE7CiAgICAgIGlmIChiKSBmaWVsZHMgfD0gMTsKICAgICAgcmV0dXJuIG5ldyBfQ29tcGFjdExhenlTdWJzdHJpbmcoZGF0YSwgZmllbGRzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgX0Z1bGxMYXp5U3Vic3RyaW5nKGRhdGEsIHN0YXJ0LCBsZW5ndGgsIGIpOwogICAgfQogIH0KfQoKLyoqCiAqIFRoaXMgY2xhc3MgZW5jb2RlcyBbc3RhcnRdLCBbbGVuZ3RoXSBhbmQgW2Jvb2xWYWx1ZV0gaW4gYSBzaW5nbGUKICogMzAgYml0IGludGVnZXIuIEl0IHVzZXMgMjAgYml0cyBmb3IgW3N0YXJ0XSwgd2hpY2ggY292ZXJzIHNvdXJjZSBmaWxlcwogKiBvZiAxTUIuIFtsZW5ndGhdIGhhcyA5IGJpdHMsIHdoaWNoIGNvdmVycyA1MTIgY2hhcmFjdGVycy4KICoKICogVGhlIGZpbGUgaHRtbF9kYXJ0MmpzLmRhcnQgaXMgY3VycmVudGx5IGFyb3VuZCAxTUIuCiAqLwpjbGFzcyBfQ29tcGFjdExhenlTdWJzdHJpbmcgZXh0ZW5kcyBfTGF6eVN1YnN0cmluZyB7CiAgZmluYWwgZGF0YTsKICBmaW5hbCBpbnQgZmllbGRzOwoKICBfQ29tcGFjdExhenlTdWJzdHJpbmcodGhpcy5kYXRhLCB0aGlzLmZpZWxkcykgOiBzdXBlci5pbnRlcm5hbCgpOwoKICBpbnQgZ2V0IHN0YXJ0ID0+IGZpZWxkcyA+PiAxMDsKICBpbnQgZ2V0IGxlbmd0aCA9PiAoZmllbGRzID4+IDEpICYgMHgxZmY7CiAgYm9vbCBnZXQgYm9vbFZhbHVlID0+IChmaWVsZHMgJiAxKSA9PSAxOwp9CgpjbGFzcyBfRnVsbExhenlTdWJzdHJpbmcgZXh0ZW5kcyBfTGF6eVN1YnN0cmluZyB7CiAgZmluYWwgZGF0YTsKICBmaW5hbCBpbnQgc3RhcnQ7CiAgZmluYWwgaW50IGxlbmd0aDsKICBmaW5hbCBib29sIGJvb2xWYWx1ZTsKICBfRnVsbExhenlTdWJzdHJpbmcodGhpcy5kYXRhLCB0aGlzLnN0YXJ0LCB0aGlzLmxlbmd0aCwgdGhpcy5ib29sVmFsdWUpCiAgICAgIDogc3VwZXIuaW50ZXJuYWwoKTsKfQoKYm9vbCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcihTdHJpbmcgdmFsdWUpIHsKICByZXR1cm4gaXNCaW5hcnlPcGVyYXRvcih2YWx1ZSkgfHwKICAgICAgaXNNaW51c09wZXJhdG9yKHZhbHVlKSB8fAogICAgICBpc1Rlcm5hcnlPcGVyYXRvcih2YWx1ZSkgfHwKICAgICAgaXNVbmFyeU9wZXJhdG9yKHZhbHVlKTsKfQoKYm9vbCBpc1VuYXJ5T3BlcmF0b3IoU3RyaW5nIHZhbHVlKSA9PiBpZGVudGljYWwodmFsdWUsICJ+Iik7Cgpib29sIGlzQmluYXJ5T3BlcmF0b3IoU3RyaW5nIHZhbHVlKSB7CiAgcmV0dXJuIGlkZW50aWNhbCh2YWx1ZSwgIj09IikgfHwKICAgICAgaWRlbnRpY2FsKHZhbHVlLCAiW10iKSB8fAogICAgICBpZGVudGljYWwodmFsdWUsICIqIikgfHwKICAgICAgaWRlbnRpY2FsKHZhbHVlLCAiLyIpIHx8CiAgICAgIGlkZW50aWNhbCh2YWx1ZSwgIiUiKSB8fAogICAgICBpZGVudGljYWwodmFsdWUsICJ+LyIpIHx8CiAgICAgIGlkZW50aWNhbCh2YWx1ZSwgIisiKSB8fAogICAgICBpZGVudGljYWwodmFsdWUsICI8PCIpIHx8CiAgICAgIGlkZW50aWNhbCh2YWx1ZSwgIj4+IikgfHwKICAgICAgaWRlbnRpY2FsKHZhbHVlLCAiPj4+IikgfHwKICAgICAgaWRlbnRpY2FsKHZhbHVlLCAiPj0iKSB8fAogICAgICBpZGVudGljYWwodmFsdWUsICI+IikgfHwKICAgICAgaWRlbnRpY2FsKHZhbHVlLCAiPD0iKSB8fAogICAgICBpZGVudGljYWwodmFsdWUsICI8IikgfHwKICAgICAgaWRlbnRpY2FsKHZhbHVlLCAiJiIpIHx8CiAgICAgIGlkZW50aWNhbCh2YWx1ZSwgIl4iKSB8fAogICAgICBpZGVudGljYWwodmFsdWUsICJ8Iik7Cn0KCmJvb2wgaXNUZXJuYXJ5T3BlcmF0b3IoU3RyaW5nIHZhbHVlKSA9PiBpZGVudGljYWwodmFsdWUsICJbXT0iKTsKCmJvb2wgaXNNaW51c09wZXJhdG9yKFN0cmluZyB2YWx1ZSkgPT4gaWRlbnRpY2FsKHZhbHVlLCAiLSIpOwqBPABOTjwBHQEvOQE1ASQBBENIFARRBkwFTUpOJwYnATgBBkwzBkdLH0c0AQZIMwYdR0s1HiQdPw0dQQYEAQZKKAZQJjE1HiRGDVEGBAFLMTQBDBYqIw02LC41HDQ/Dx9KCCMGBAEMPgEMHwFOASU5IT0EAVFEBAEMJVABDBwCAQRFBC8vQTE5AQwXAQwsTAIBSgwfAQZJMwYeRyJAKQEGJwZJNAEGSigGUSZMAUc5AQwZQgEMEhw0IQ0wNwYEAgEoNAZJMwYeRyJAKQEGSigGUSZMAUc5AQwZQgIBBEpEIwQgOwwBERIBBk82BUpIIwYWAR0BQC4uISAcGjYNPQYEAgEEREo9AzcENQ4UAUQBISsrAgEyDhMUGEkaAgEtJCAiHgIBPQEmIyAfHx8gHyAgISAfIB8fHx0CAUEBPQEucGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NjYW5uZXIvdG9rZW4uZGFydDFzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvc2Nhbm5lci90b2tlbi5kYXJ0wAC+2S8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovKioKICogRGVmaW5lcyB0aGUgdG9rZW5zIHRoYXQgYXJlIHByb2R1Y2VkIGJ5IHRoZSBzY2FubmVyLCB1c2VkIGJ5IHRoZSBwYXJzZXIsIGFuZAogKiByZWZlcmVuY2VkIGZyb20gdGhlIFtBU1Qgc3RydWN0dXJlXShhc3QuZGFydCkuCiAqLwppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CgppbXBvcnQgJy4uL2Jhc2Uvc3ludGFjdGljX2VudGl0eS5kYXJ0JzsKaW1wb3J0ICcuLi9mYXN0YS9zY2FubmVyL3Rva2VuX2NvbnN0YW50cy5kYXJ0JzsKaW1wb3J0ICdzdHJpbmdfdXRpbGl0aWVzLmRhcnQnOwoKY29uc3QgaW50IE5PX1BSRUNFREVOQ0UgPSAwOwpjb25zdCBpbnQgQVNTSUdOTUVOVF9QUkVDRURFTkNFID0gMTsKY29uc3QgaW50IENBU0NBREVfUFJFQ0VERU5DRSA9IDI7CmNvbnN0IGludCBDT05ESVRJT05BTF9QUkVDRURFTkNFID0gMzsKY29uc3QgaW50IElGX05VTExfUFJFQ0VERU5DRSA9IDQ7CmNvbnN0IGludCBMT0dJQ0FMX09SX1BSRUNFREVOQ0UgPSA1Owpjb25zdCBpbnQgTE9HSUNBTF9BTkRfUFJFQ0VERU5DRSA9IDY7CmNvbnN0IGludCBFUVVBTElUWV9QUkVDRURFTkNFID0gNzsKY29uc3QgaW50IFJFTEFUSU9OQUxfUFJFQ0VERU5DRSA9IDg7CmNvbnN0IGludCBCSVRXSVNFX09SX1BSRUNFREVOQ0UgPSA5Owpjb25zdCBpbnQgQklUV0lTRV9YT1JfUFJFQ0VERU5DRSA9IDEwOwpjb25zdCBpbnQgQklUV0lTRV9BTkRfUFJFQ0VERU5DRSA9IDExOwpjb25zdCBpbnQgU0hJRlRfUFJFQ0VERU5DRSA9IDEyOwpjb25zdCBpbnQgQURESVRJVkVfUFJFQ0VERU5DRSA9IDEzOwpjb25zdCBpbnQgTVVMVElQTElDQVRJVkVfUFJFQ0VERU5DRSA9IDE0Owpjb25zdCBpbnQgUFJFRklYX1BSRUNFREVOQ0UgPSAxNTsKY29uc3QgaW50IFBPU1RGSVhfUFJFQ0VERU5DRSA9IDE2Owpjb25zdCBpbnQgU0VMRUNUT1JfUFJFQ0VERU5DRSA9IDE3OwoKLyoqCiAqIFRoZSBvcGVuaW5nIGhhbGYgb2YgYSBncm91cGluZyBwYWlyIG9mIHRva2Vucy4gVGhpcyBpcyB1c2VkIGZvciBjdXJseQogKiBicmFja2V0cyAoJ3snKSwgcGFyZW50aGVzZXMgKCcoJyksIGFuZCBzcXVhcmUgYnJhY2tldHMgKCdbJykuCiAqLwpjbGFzcyBCZWdpblRva2VuIGV4dGVuZHMgU2ltcGxlVG9rZW4gewogIC8qKgogICAqIFRoZSB0b2tlbiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMgdG9rZW4uCiAgICovCiAgVG9rZW4gZW5kVG9rZW47CgogIC8qKgogICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHRva2VuIHRvIGhhdmUgdGhlIGdpdmVuIFt0eXBlXSBhdCB0aGUgZ2l2ZW4KICAgKiBbb2Zmc2V0XS4KICAgKi8KICBCZWdpblRva2VuKFRva2VuVHlwZSB0eXBlLCBpbnQgb2Zmc2V0LCBbQ29tbWVudFRva2VuIHByZWNlZGluZ0NvbW1lbnRdKQogICAgICA6IHN1cGVyKHR5cGUsIG9mZnNldCwgcHJlY2VkaW5nQ29tbWVudCkgewogICAgYXNzZXJ0KHR5cGUgPT0gVG9rZW5UeXBlLkxUIHx8CiAgICAgICAgdHlwZSA9PSBUb2tlblR5cGUuT1BFTl9DVVJMWV9CUkFDS0VUIHx8CiAgICAgICAgdHlwZSA9PSBUb2tlblR5cGUuT1BFTl9QQVJFTiB8fAogICAgICAgIHR5cGUgPT0gVG9rZW5UeXBlLk9QRU5fU1FVQVJFX0JSQUNLRVQgfHwKICAgICAgICB0eXBlID09IFRva2VuVHlwZS5TVFJJTkdfSU5URVJQT0xBVElPTl9FWFBSRVNTSU9OKTsKICB9CgogIEBvdmVycmlkZQogIFRva2VuIGNvcHkoKSA9PiBuZXcgQmVnaW5Ub2tlbih0eXBlLCBvZmZzZXQsIGNvcHlDb21tZW50cyhwcmVjZWRpbmdDb21tZW50cykpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBnZXQgZW5kR3JvdXAgPT4gZW5kVG9rZW47CgogIC8qKgogICAqIFNldCB0aGUgdG9rZW4gdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIHRva2VuLgogICAqLwogIHNldCBlbmRHcm91cChUb2tlbiB0b2tlbikgewogICAgZW5kVG9rZW4gPSB0b2tlbjsKICB9Cn0KCi8qKgogKiBBIHRva2VuIHJlcHJlc2VudGluZyBhIGNvbW1lbnQuCiAqLwpjbGFzcyBDb21tZW50VG9rZW4gZXh0ZW5kcyBTdHJpbmdUb2tlbiB7CiAgLyoqCiAgICogVGhlIHRva2VuIHRoYXQgY29udGFpbnMgdGhpcyBjb21tZW50LgogICAqLwogIFNpbXBsZVRva2VuIHBhcmVudDsKCiAgLyoqCiAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgdG9rZW4gdG8gcmVwcmVzZW50IGEgdG9rZW4gb2YgdGhlIGdpdmVuIFt0eXBlXQogICAqIHdpdGggdGhlIGdpdmVuIFt2YWx1ZV0gYXQgdGhlIGdpdmVuIFtvZmZzZXRdLgogICAqLwogIENvbW1lbnRUb2tlbihUb2tlblR5cGUgdHlwZSwgU3RyaW5nIHZhbHVlLCBpbnQgb2Zmc2V0KQogICAgICA6IHN1cGVyKHR5cGUsIHZhbHVlLCBvZmZzZXQpOwoKICBAb3ZlcnJpZGUKICBDb21tZW50VG9rZW4gY29weSgpID0+IG5ldyBDb21tZW50VG9rZW4odHlwZSwgX3ZhbHVlLCBvZmZzZXQpOwoKICAvKioKICAgKiBSZW1vdmUgdGhpcyBjb21tZW50IHRva2VuIGZyb20gdGhlIGxpc3QuCiAgICoKICAgKiBUaGlzIGlzIHVzZWQgd2hlbiB3ZSBkZWNpZGUgdG8gaW50ZXJwcmV0IHRoZSBjb21tZW50IGFzIHN5bnRheC4KICAgKi8KICB2b2lkIHJlbW92ZSgpIHsKICAgIGlmIChwcmV2aW91cyAhPSBudWxsKSB7CiAgICAgIHByZXZpb3VzLnNldE5leHRXaXRob3V0U2V0dGluZ1ByZXZpb3VzKG5leHQpOwogICAgICBuZXh0Py5wcmV2aW91cyA9IHByZXZpb3VzOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KHBhcmVudC5wcmVjZWRpbmdDb21tZW50cyA9PSB0aGlzKTsKICAgICAgcGFyZW50LnByZWNlZGluZ0NvbW1lbnRzID0gbmV4dDsKICAgIH0KICB9Cn0KCi8qKgogKiBBIGRvY3VtZW50YXRpb24gY29tbWVudCB0b2tlbi4KICovCmNsYXNzIERvY3VtZW50YXRpb25Db21tZW50VG9rZW4gZXh0ZW5kcyBDb21tZW50VG9rZW4gewogIC8qKgogICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHRva2VuIHRvIHJlcHJlc2VudCBhIHRva2VuIG9mIHRoZSBnaXZlbiBbdHlwZV0KICAgKiB3aXRoIHRoZSBnaXZlbiBbdmFsdWVdIGF0IHRoZSBnaXZlbiBbb2Zmc2V0XS4KICAgKi8KICBEb2N1bWVudGF0aW9uQ29tbWVudFRva2VuKFRva2VuVHlwZSB0eXBlLCBTdHJpbmcgdmFsdWUsIGludCBvZmZzZXQpCiAgICAgIDogc3VwZXIodHlwZSwgdmFsdWUsIG9mZnNldCk7CgogIEBvdmVycmlkZQogIENvbW1lbnRUb2tlbiBjb3B5KCkgPT4gbmV3IERvY3VtZW50YXRpb25Db21tZW50VG9rZW4odHlwZSwgX3ZhbHVlLCBvZmZzZXQpOwp9CgovKioKICogVGhlIGtleXdvcmRzIGluIHRoZSBEYXJ0IHByb2dyYW1taW5nIGxhbmd1YWdlLgogKgogKiBDbGllbnRzIG1heSBub3QgZXh0ZW5kLCBpbXBsZW1lbnQgb3IgbWl4LWluIHRoaXMgY2xhc3MuCiAqLwpjbGFzcyBLZXl3b3JkIGV4dGVuZHMgVG9rZW5UeXBlIHsKICBzdGF0aWMgY29uc3QgS2V5d29yZCBBQlNUUkFDVCA9CiAgICAgIGNvbnN0IEtleXdvcmQoImFic3RyYWN0IiwgIkFCU1RSQUNUIiwgaXNCdWlsdEluOiB0cnVlLCBpc01vZGlmaWVyOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgQVMgPSBjb25zdCBLZXl3b3JkKCJhcyIsICJBUyIsCiAgICAgIHByZWNlZGVuY2U6IFJFTEFUSU9OQUxfUFJFQ0VERU5DRSwgaXNCdWlsdEluOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgQVNTRVJUID0gY29uc3QgS2V5d29yZCgiYXNzZXJ0IiwgIkFTU0VSVCIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBBU1lOQyA9IGNvbnN0IEtleXdvcmQoImFzeW5jIiwgIkFTWU5DIiwgaXNQc2V1ZG86IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBBV0FJVCA9IGNvbnN0IEtleXdvcmQoImF3YWl0IiwgIkFXQUlUIiwgaXNQc2V1ZG86IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBCUkVBSyA9IGNvbnN0IEtleXdvcmQoImJyZWFrIiwgIkJSRUFLIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIENBU0UgPSBjb25zdCBLZXl3b3JkKCJjYXNlIiwgIkNBU0UiKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgQ0FUQ0ggPSBjb25zdCBLZXl3b3JkKCJjYXRjaCIsICJDQVRDSCIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBDTEFTUyA9CiAgICAgIGNvbnN0IEtleXdvcmQoImNsYXNzIiwgIkNMQVNTIiwgaXNUb3BMZXZlbEtleXdvcmQ6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBDT05TVCA9CiAgICAgIGNvbnN0IEtleXdvcmQoImNvbnN0IiwgIkNPTlNUIiwgaXNNb2RpZmllcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIENPTlRJTlVFID0gY29uc3QgS2V5d29yZCgiY29udGludWUiLCAiQ09OVElOVUUiKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgQ09WQVJJQU5UID0gY29uc3QgS2V5d29yZCgiY292YXJpYW50IiwgIkNPVkFSSUFOVCIsCiAgICAgIGlzQnVpbHRJbjogdHJ1ZSwgaXNNb2RpZmllcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIERFRkFVTFQgPSBjb25zdCBLZXl3b3JkKCJkZWZhdWx0IiwgIkRFRkFVTFQiKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgREVGRVJSRUQgPQogICAgICBjb25zdCBLZXl3b3JkKCJkZWZlcnJlZCIsICJERUZFUlJFRCIsIGlzQnVpbHRJbjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIERPID0gY29uc3QgS2V5d29yZCgiZG8iLCAiRE8iKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgRFlOQU1JQyA9CiAgICAgIGNvbnN0IEtleXdvcmQoImR5bmFtaWMiLCAiRFlOQU1JQyIsIGlzQnVpbHRJbjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIEVMU0UgPSBjb25zdCBLZXl3b3JkKCJlbHNlIiwgIkVMU0UiKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgRU5VTSA9CiAgICAgIGNvbnN0IEtleXdvcmQoImVudW0iLCAiRU5VTSIsIGlzVG9wTGV2ZWxLZXl3b3JkOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgRVhQT1JUID0gY29uc3QgS2V5d29yZCgiZXhwb3J0IiwgIkVYUE9SVCIsCiAgICAgIGlzQnVpbHRJbjogdHJ1ZSwgaXNUb3BMZXZlbEtleXdvcmQ6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBFWFRFTkRTID0gY29uc3QgS2V5d29yZCgiZXh0ZW5kcyIsICJFWFRFTkRTIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIEVYVEVSTkFMID0KICAgICAgY29uc3QgS2V5d29yZCgiZXh0ZXJuYWwiLCAiRVhURVJOQUwiLCBpc0J1aWx0SW46IHRydWUsIGlzTW9kaWZpZXI6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBGQUNUT1JZID0KICAgICAgY29uc3QgS2V5d29yZCgiZmFjdG9yeSIsICJGQUNUT1JZIiwgaXNCdWlsdEluOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgRkFMU0UgPSBjb25zdCBLZXl3b3JkKCJmYWxzZSIsICJGQUxTRSIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBGSU5BTCA9CiAgICAgIGNvbnN0IEtleXdvcmQoImZpbmFsIiwgIkZJTkFMIiwgaXNNb2RpZmllcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIEZJTkFMTFkgPSBjb25zdCBLZXl3b3JkKCJmaW5hbGx5IiwgIkZJTkFMTFkiKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgRk9SID0gY29uc3QgS2V5d29yZCgiZm9yIiwgIkZPUiIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBGVU5DVElPTiA9CiAgICAgIGNvbnN0IEtleXdvcmQoIkZ1bmN0aW9uIiwgIkZVTkNUSU9OIiwgaXNQc2V1ZG86IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBHRVQgPSBjb25zdCBLZXl3b3JkKCJnZXQiLCAiR0VUIiwgaXNCdWlsdEluOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgSElERSA9IGNvbnN0IEtleXdvcmQoImhpZGUiLCAiSElERSIsIGlzUHNldWRvOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgSUYgPSBjb25zdCBLZXl3b3JkKCJpZiIsICJJRiIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBJTVBMRU1FTlRTID0KICAgICAgY29uc3QgS2V5d29yZCgiaW1wbGVtZW50cyIsICJJTVBMRU1FTlRTIiwgaXNCdWlsdEluOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgSU1QT1JUID0gY29uc3QgS2V5d29yZCgiaW1wb3J0IiwgIklNUE9SVCIsCiAgICAgIGlzQnVpbHRJbjogdHJ1ZSwgaXNUb3BMZXZlbEtleXdvcmQ6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBJTiA9IGNvbnN0IEtleXdvcmQoImluIiwgIklOIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIElOVEVSRkFDRSA9CiAgICAgIGNvbnN0IEtleXdvcmQoImludGVyZmFjZSIsICJJTlRFUkZBQ0UiLCBpc0J1aWx0SW46IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBJUyA9CiAgICAgIGNvbnN0IEtleXdvcmQoImlzIiwgIklTIiwgcHJlY2VkZW5jZTogUkVMQVRJT05BTF9QUkVDRURFTkNFKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgTElCUkFSWSA9IGNvbnN0IEtleXdvcmQoImxpYnJhcnkiLCAiTElCUkFSWSIsCiAgICAgIGlzQnVpbHRJbjogdHJ1ZSwgaXNUb3BMZXZlbEtleXdvcmQ6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBNSVhJTiA9CiAgICAgIGNvbnN0IEtleXdvcmQoIm1peGluIiwgIk1JWElOIiwgaXNCdWlsdEluOiB0cnVlLCBpc1RvcExldmVsS2V5d29yZDogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIE5BVElWRSA9CiAgICAgIGNvbnN0IEtleXdvcmQoIm5hdGl2ZSIsICJOQVRJVkUiLCBpc1BzZXVkbzogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIE5FVyA9IGNvbnN0IEtleXdvcmQoIm5ldyIsICJORVciKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgTlVMTCA9IGNvbnN0IEtleXdvcmQoIm51bGwiLCAiTlVMTCIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBPRiA9IGNvbnN0IEtleXdvcmQoIm9mIiwgIk9GIiwgaXNQc2V1ZG86IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBPTiA9IGNvbnN0IEtleXdvcmQoIm9uIiwgIk9OIiwgaXNQc2V1ZG86IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBPUEVSQVRPUiA9CiAgICAgIGNvbnN0IEtleXdvcmQoIm9wZXJhdG9yIiwgIk9QRVJBVE9SIiwgaXNCdWlsdEluOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgUEFSVCA9CiAgICAgIGNvbnN0IEtleXdvcmQoInBhcnQiLCAiUEFSVCIsIGlzQnVpbHRJbjogdHJ1ZSwgaXNUb3BMZXZlbEtleXdvcmQ6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBQQVRDSCA9IGNvbnN0IEtleXdvcmQoInBhdGNoIiwgIlBBVENIIiwgaXNQc2V1ZG86IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBSRVRIUk9XID0gY29uc3QgS2V5d29yZCgicmV0aHJvdyIsICJSRVRIUk9XIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIFJFVFVSTiA9IGNvbnN0IEtleXdvcmQoInJldHVybiIsICJSRVRVUk4iKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgU0VUID0gY29uc3QgS2V5d29yZCgic2V0IiwgIlNFVCIsIGlzQnVpbHRJbjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIFNIT1cgPSBjb25zdCBLZXl3b3JkKCJzaG93IiwgIlNIT1ciLCBpc1BzZXVkbzogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIFNPVVJDRSA9CiAgICAgIGNvbnN0IEtleXdvcmQoInNvdXJjZSIsICJTT1VSQ0UiLCBpc1BzZXVkbzogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIFNUQVRJQyA9CiAgICAgIGNvbnN0IEtleXdvcmQoInN0YXRpYyIsICJTVEFUSUMiLCBpc0J1aWx0SW46IHRydWUsIGlzTW9kaWZpZXI6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBTVVBFUiA9IGNvbnN0IEtleXdvcmQoInN1cGVyIiwgIlNVUEVSIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIFNXSVRDSCA9IGNvbnN0IEtleXdvcmQoInN3aXRjaCIsICJTV0lUQ0giKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgU1lOQyA9IGNvbnN0IEtleXdvcmQoInN5bmMiLCAiU1lOQyIsIGlzUHNldWRvOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgVEhJUyA9IGNvbnN0IEtleXdvcmQoInRoaXMiLCAiVEhJUyIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBUSFJPVyA9IGNvbnN0IEtleXdvcmQoInRocm93IiwgIlRIUk9XIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIFRSVUUgPSBjb25zdCBLZXl3b3JkKCJ0cnVlIiwgIlRSVUUiKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgVFJZID0gY29uc3QgS2V5d29yZCgidHJ5IiwgIlRSWSIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBUWVBFREVGID0gY29uc3QgS2V5d29yZCgidHlwZWRlZiIsICJUWVBFREVGIiwKICAgICAgaXNCdWlsdEluOiB0cnVlLCBpc1RvcExldmVsS2V5d29yZDogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIFZBUiA9IGNvbnN0IEtleXdvcmQoInZhciIsICJWQVIiLCBpc01vZGlmaWVyOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgVk9JRCA9IGNvbnN0IEtleXdvcmQoInZvaWQiLCAiVk9JRCIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBXSElMRSA9IGNvbnN0IEtleXdvcmQoIndoaWxlIiwgIldISUxFIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIFdJVEggPSBjb25zdCBLZXl3b3JkKCJ3aXRoIiwgIldJVEgiKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgWUlFTEQgPSBjb25zdCBLZXl3b3JkKCJ5aWVsZCIsICJZSUVMRCIsIGlzUHNldWRvOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IExpc3Q8S2V5d29yZD4gdmFsdWVzID0gY29uc3QgPEtleXdvcmQ+WwogICAgQUJTVFJBQ1QsCiAgICBBUywKICAgIEFTU0VSVCwKICAgIEFTWU5DLAogICAgQVdBSVQsCiAgICBCUkVBSywKICAgIENBU0UsCiAgICBDQVRDSCwKICAgIENMQVNTLAogICAgQ09OU1QsCiAgICBDT05USU5VRSwKICAgIENPVkFSSUFOVCwKICAgIERFRkFVTFQsCiAgICBERUZFUlJFRCwKICAgIERPLAogICAgRFlOQU1JQywKICAgIEVMU0UsCiAgICBFTlVNLAogICAgRVhQT1JULAogICAgRVhURU5EUywKICAgIEVYVEVSTkFMLAogICAgRkFDVE9SWSwKICAgIEZBTFNFLAogICAgRklOQUwsCiAgICBGSU5BTExZLAogICAgRk9SLAogICAgRlVOQ1RJT04sCiAgICBHRVQsCiAgICBISURFLAogICAgSUYsCiAgICBJTVBMRU1FTlRTLAogICAgSU1QT1JULAogICAgSU4sCiAgICBJTlRFUkZBQ0UsCiAgICBJUywKICAgIExJQlJBUlksCiAgICBNSVhJTiwKICAgIE5BVElWRSwKICAgIE5FVywKICAgIE5VTEwsCiAgICBPRiwKICAgIE9OLAogICAgT1BFUkFUT1IsCiAgICBQQVJULAogICAgUEFUQ0gsCiAgICBSRVRIUk9XLAogICAgUkVUVVJOLAogICAgU0VULAogICAgU0hPVywKICAgIFNPVVJDRSwKICAgIFNUQVRJQywKICAgIFNVUEVSLAogICAgU1dJVENILAogICAgU1lOQywKICAgIFRISVMsCiAgICBUSFJPVywKICAgIFRSVUUsCiAgICBUUlksCiAgICBUWVBFREVGLAogICAgVkFSLAogICAgVk9JRCwKICAgIFdISUxFLAogICAgV0lUSCwKICAgIFlJRUxELAogIF07CgogIC8qKgogICAqIEEgdGFibGUgbWFwcGluZyB0aGUgbGV4ZW1lcyBvZiBrZXl3b3JkcyB0byB0aGUgY29ycmVzcG9uZGluZyBrZXl3b3JkLgogICAqLwogIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBLZXl3b3JkPiBrZXl3b3JkcyA9IF9jcmVhdGVLZXl3b3JkTWFwKCk7CgogIC8qKgogICAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGtleXdvcmQgaXMgImJ1aWx0LWluIiBpZGVudGlmaWVyLgogICAqLwogIEBvdmVycmlkZQogIGZpbmFsIGJvb2wgaXNCdWlsdEluOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzUHNldWRvOwoKICAvKioKICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBrZXl3b3JkLgogICAqLwogIGNvbnN0IEtleXdvcmQoU3RyaW5nIGxleGVtZSwgU3RyaW5nIG5hbWUsCiAgICAgIHt0aGlzLmlzQnVpbHRJbjogZmFsc2UsCiAgICAgIGJvb2wgaXNNb2RpZmllcjogZmFsc2UsCiAgICAgIHRoaXMuaXNQc2V1ZG86IGZhbHNlLAogICAgICBib29sIGlzVG9wTGV2ZWxLZXl3b3JkOiBmYWxzZSwKICAgICAgaW50IHByZWNlZGVuY2U6IE5PX1BSRUNFREVOQ0V9KQogICAgICA6IHN1cGVyKGxleGVtZSwgbmFtZSwgcHJlY2VkZW5jZSwgS0VZV09SRF9UT0tFTiwKICAgICAgICAgICAgaXNNb2RpZmllcjogaXNNb2RpZmllciwgaXNUb3BMZXZlbEtleXdvcmQ6IGlzVG9wTGV2ZWxLZXl3b3JkKTsKCiAgYm9vbCBnZXQgaXNCdWlsdEluT3JQc2V1ZG8gPT4gaXNCdWlsdEluIHx8IGlzUHNldWRvOwoKICAvKioKICAgKiBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBrZXl3b3JkIGlzICJidWlsdC1pbiIgaWRlbnRpZmllci4KICAgKiBUaGlzIG1ldGhvZCBleGlzdHMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYW5kIHdpbGwgYmUgcmVtb3ZlZC4KICAgKiBVc2UgW2lzQnVpbHRJbl0gaW5zdGVhZC4KICAgKi8KICBAZGVwcmVjYXRlZAogIGJvb2wgZ2V0IGlzUHNldWRvS2V5d29yZCA9PiBpc0J1aWx0SW47IC8vIFRPRE8gKGRhbnJ1YmVsKTogcmVtb3ZlIHRoaXMKCiAgLyoqCiAgICogVGhlIG5hbWUgb2YgdGhlIGtleXdvcmQgdHlwZS4KICAgKi8KICBTdHJpbmcgZ2V0IG5hbWUgPT4gbGV4ZW1lLnRvVXBwZXJDYXNlKCk7CgogIC8qKgogICAqIFRoZSBsZXhlbWUgZm9yIHRoZSBrZXl3b3JkLgogICAqCiAgICogRGVwcmVjYXRlZCAtIHVzZSBbbGV4ZW1lXSBpbnN0ZWFkLgogICAqLwogIEBkZXByZWNhdGVkCiAgU3RyaW5nIGdldCBzeW50YXggPT4gbGV4ZW1lOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBuYW1lOwoKICAvKioKICAgKiBDcmVhdGUgYSB0YWJsZSBtYXBwaW5nIHRoZSBsZXhlbWVzIG9mIGtleXdvcmRzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGtleXdvcmQKICAgKiBhbmQgcmV0dXJuIHRoZSB0YWJsZSB0aGF0IHdhcyBjcmVhdGVkLgogICAqLwogIHN0YXRpYyBNYXA8U3RyaW5nLCBLZXl3b3JkPiBfY3JlYXRlS2V5d29yZE1hcCgpIHsKICAgIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBLZXl3b3JkPiByZXN1bHQgPQogICAgICAgIG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgS2V5d29yZD4oKTsKICAgIGZvciAoS2V5d29yZCBrZXl3b3JkIGluIHZhbHVlcykgewogICAgICByZXN1bHRba2V5d29yZC5sZXhlbWVdID0ga2V5d29yZDsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CgovKioKICogQSB0b2tlbiByZXByZXNlbnRpbmcgYSBrZXl3b3JkIGluIHRoZSBsYW5ndWFnZS4KICovCmNsYXNzIEtleXdvcmRUb2tlbiBleHRlbmRzIFNpbXBsZVRva2VuIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBLZXl3b3JkIGtleXdvcmQ7CgogIC8qKgogICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHRva2VuIHRvIHJlcHJlc2VudCB0aGUgZ2l2ZW4gW2tleXdvcmRdIGF0IHRoZQogICAqIGdpdmVuIFtvZmZzZXRdLgogICAqLwogIEtleXdvcmRUb2tlbih0aGlzLmtleXdvcmQsIGludCBvZmZzZXQsIFtDb21tZW50VG9rZW4gcHJlY2VkaW5nQ29tbWVudF0pCiAgICAgIDogc3VwZXIoa2V5d29yZCwgb2Zmc2V0LCBwcmVjZWRpbmdDb21tZW50KTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gY29weSgpID0+CiAgICAgIG5ldyBLZXl3b3JkVG9rZW4oa2V5d29yZCwgb2Zmc2V0LCBjb3B5Q29tbWVudHMocHJlY2VkaW5nQ29tbWVudHMpKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNJZGVudGlmaWVyID0+IGtleXdvcmQuaXNQc2V1ZG8gfHwga2V5d29yZC5pc0J1aWx0SW47CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzS2V5d29yZCA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0tleXdvcmRPcklkZW50aWZpZXIgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgT2JqZWN0IHZhbHVlKCkgPT4ga2V5d29yZDsKfQoKLyoqCiAqIEEgdG9rZW4gdGhhdCB3YXMgc2Nhbm5lZCBmcm9tIHRoZSBpbnB1dC4gRWFjaCB0b2tlbiBrbm93cyB3aGljaCB0b2tlbnMKICogcHJlY2VkZSBhbmQgZm9sbG93IGl0LCBhY3RpbmcgYXMgYSBsaW5rIGluIGEgZG91Ymx5IGxpbmtlZCBsaXN0IG9mIHRva2Vucy4KICovCmNsYXNzIFNpbXBsZVRva2VuIGltcGxlbWVudHMgVG9rZW4gewogIC8qKgogICAqIFRoZSB0eXBlIG9mIHRoZSB0b2tlbi4KICAgKi8KICBAb3ZlcnJpZGUKICBmaW5hbCBUb2tlblR5cGUgdHlwZTsKCiAgLyoqCiAgICogVGhlIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUKICAgKiB0b2tlbi4KICAgKi8KICBAb3ZlcnJpZGUKICBpbnQgb2Zmc2V0ID0gMDsKCiAgLyoqCiAgICogVGhlIHByZXZpb3VzIHRva2VuIGluIHRoZSB0b2tlbiBzdHJlYW0uCiAgICovCiAgQG92ZXJyaWRlCiAgVG9rZW4gcHJldmlvdXM7CgogIEBvdmVycmlkZQogIFRva2VuIG5leHQ7CgogIC8qKgogICAqIFRoZSBmaXJzdCBjb21tZW50IGluIHRoZSBsaXN0IG9mIGNvbW1lbnRzIHRoYXQgcHJlY2VkZSB0aGlzIHRva2VuLgogICAqLwogIENvbW1lbnRUb2tlbiBfcHJlY2VkaW5nQ29tbWVudDsKCiAgLyoqCiAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgdG9rZW4gdG8gaGF2ZSB0aGUgZ2l2ZW4gW3R5cGVdIGFuZCBbb2Zmc2V0XS4KICAgKi8KICBTaW1wbGVUb2tlbih0aGlzLnR5cGUsIHRoaXMub2Zmc2V0LCBbdGhpcy5fcHJlY2VkaW5nQ29tbWVudF0pIHsKICAgIF9zZXRDb21tZW50UGFyZW50KF9wcmVjZWRpbmdDb21tZW50KTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgY2hhckNvdW50ID0+IGxlbmd0aDsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBjaGFyT2Zmc2V0ID0+IG9mZnNldDsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBjaGFyRW5kID0+IGVuZDsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZ2V0IGJlZm9yZVN5bnRoZXRpYyA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBzZXQgYmVmb3JlU3ludGhldGljKFRva2VuIHByZXZpb3VzKSB7CiAgICAvLyBpZ25vcmVkCiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGVuZCA9PiBvZmZzZXQgKyBsZW5ndGg7CgogIEBvdmVycmlkZQogIFRva2VuIGdldCBlbmRHcm91cCA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0VvZiA9PiB0eXBlID09IFRva2VuVHlwZS5FT0Y7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzSWRlbnRpZmllciA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNLZXl3b3JkID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0tleXdvcmRPcklkZW50aWZpZXIgPT4gaXNJZGVudGlmaWVyOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc01vZGlmaWVyID0+IHR5cGUuaXNNb2RpZmllcjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNPcGVyYXRvciA9PiB0eXBlLmlzT3BlcmF0b3I7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU3ludGhldGljID0+IGxlbmd0aCA9PSAwOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1RvcExldmVsS2V5d29yZCA9PiB0eXBlLmlzVG9wTGV2ZWxLZXl3b3JkOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvciA9PiB0eXBlLmlzVXNlckRlZmluYWJsZU9wZXJhdG9yOwoKICBAb3ZlcnJpZGUKICBLZXl3b3JkIGdldCBrZXl3b3JkID0+IG51bGw7CgogIEBvdmVycmlkZQogIGludCBnZXQga2luZCA9PiB0eXBlLmtpbmQ7CgogIEBvdmVycmlkZQogIGludCBnZXQgbGVuZ3RoID0+IGxleGVtZS5sZW5ndGg7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgbGV4ZW1lID0+IHR5cGUubGV4ZW1lOwoKICBAb3ZlcnJpZGUKICBDb21tZW50VG9rZW4gZ2V0IHByZWNlZGluZ0NvbW1lbnRzID0+IF9wcmVjZWRpbmdDb21tZW50OwoKICB2b2lkIHNldCBwcmVjZWRpbmdDb21tZW50cyhDb21tZW50VG9rZW4gY29tbWVudCkgewogICAgX3ByZWNlZGluZ0NvbW1lbnQgPSBjb21tZW50OwogICAgX3NldENvbW1lbnRQYXJlbnQoX3ByZWNlZGluZ0NvbW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBzdHJpbmdWYWx1ZSA9PiB0eXBlLnN0cmluZ1ZhbHVlOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBjb3B5KCkgPT4KICAgICAgbmV3IFNpbXBsZVRva2VuKHR5cGUsIG9mZnNldCwgY29weUNvbW1lbnRzKHByZWNlZGluZ0NvbW1lbnRzKSk7CgogIEBvdmVycmlkZQogIFRva2VuIGNvcHlDb21tZW50cyhUb2tlbiB0b2tlbikgewogICAgaWYgKHRva2VuID09IG51bGwpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBUb2tlbiBoZWFkID0gdG9rZW4uY29weSgpOwogICAgVG9rZW4gdGFpbCA9IGhlYWQ7CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICB3aGlsZSAodG9rZW4gIT0gbnVsbCkgewogICAgICB0YWlsID0gdGFpbC5zZXROZXh0KHRva2VuLmNvcHkoKSk7CiAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIH0KICAgIHJldHVybiBoZWFkOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBtYXRjaGVzQW55KExpc3Q8VG9rZW5UeXBlPiB0eXBlcykgewogICAgZm9yIChUb2tlblR5cGUgdHlwZSBpbiB0eXBlcykgewogICAgICBpZiAodGhpcy50eXBlID09IHR5cGUpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gc2V0TmV4dChUb2tlbiB0b2tlbikgewogICAgbmV4dCA9IHRva2VuOwogICAgdG9rZW4ucHJldmlvdXMgPSB0aGlzOwogICAgdG9rZW4uYmVmb3JlU3ludGhldGljID0gdGhpczsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIEBvdmVycmlkZQogIFRva2VuIHNldE5leHRXaXRob3V0U2V0dGluZ1ByZXZpb3VzKFRva2VuIHRva2VuKSB7CiAgICBuZXh0ID0gdG9rZW47CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBsZXhlbWU7CgogIEBvdmVycmlkZQogIE9iamVjdCB2YWx1ZSgpID0+IGxleGVtZTsKCiAgLyoqCiAgICogU2V0cyB0aGUgYHBhcmVudGAgcHJvcGVydHkgdG8gYHRoaXNgIGZvciB0aGUgZ2l2ZW4gW2NvbW1lbnRdIGFuZCBhbGwgdGhlCiAgICogbmV4dCB0b2tlbnMuCiAgICovCiAgdm9pZCBfc2V0Q29tbWVudFBhcmVudChDb21tZW50VG9rZW4gY29tbWVudCkgewogICAgd2hpbGUgKGNvbW1lbnQgIT0gbnVsbCkgewogICAgICBjb21tZW50LnBhcmVudCA9IHRoaXM7CiAgICAgIGNvbW1lbnQgPSBjb21tZW50Lm5leHQ7CiAgICB9CiAgfQp9CgovKioKICogQSB0b2tlbiB3aG9zZSB2YWx1ZSBpcyBpbmRlcGVuZGVudCBvZiBpdCdzIHR5cGUuCiAqLwpjbGFzcyBTdHJpbmdUb2tlbiBleHRlbmRzIFNpbXBsZVRva2VuIHsKICAvKioKICAgKiBUaGUgbGV4ZW1lIHJlcHJlc2VudGVkIGJ5IHRoaXMgdG9rZW4uCiAgICovCiAgU3RyaW5nIF92YWx1ZTsKCiAgLyoqCiAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgdG9rZW4gdG8gcmVwcmVzZW50IGEgdG9rZW4gb2YgdGhlIGdpdmVuIFt0eXBlXQogICAqIHdpdGggdGhlIGdpdmVuIFt2YWx1ZV0gYXQgdGhlIGdpdmVuIFtvZmZzZXRdLgogICAqLwogIFN0cmluZ1Rva2VuKFRva2VuVHlwZSB0eXBlLCBTdHJpbmcgdmFsdWUsIGludCBvZmZzZXQsCiAgICAgIFtDb21tZW50VG9rZW4gcHJlY2VkaW5nQ29tbWVudF0pCiAgICAgIDogc3VwZXIodHlwZSwgb2Zmc2V0LCBwcmVjZWRpbmdDb21tZW50KSB7CiAgICB0aGlzLl92YWx1ZSA9IFN0cmluZ1V0aWxpdGllcy5pbnRlcm4odmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNJZGVudGlmaWVyID0+IGlkZW50aWNhbChraW5kLCBJREVOVElGSUVSX1RPS0VOKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBsZXhlbWUgPT4gX3ZhbHVlOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBjb3B5KCkgPT4KICAgICAgbmV3IFN0cmluZ1Rva2VuKHR5cGUsIF92YWx1ZSwgb2Zmc2V0LCBjb3B5Q29tbWVudHMocHJlY2VkaW5nQ29tbWVudHMpKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZhbHVlKCkgPT4gX3ZhbHVlOwp9CgovKioKICogQSBzeW50aGV0aWMgYmVnaW4gdG9rZW4uCiAqLwpjbGFzcyBTeW50aGV0aWNCZWdpblRva2VuIGV4dGVuZHMgQmVnaW5Ub2tlbiB7CiAgLyoqCiAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgdG9rZW4gdG8gaGF2ZSB0aGUgZ2l2ZW4gW3R5cGVdIGF0IHRoZSBnaXZlbgogICAqIFtvZmZzZXRdLgogICAqLwogIFN5bnRoZXRpY0JlZ2luVG9rZW4oVG9rZW5UeXBlIHR5cGUsIGludCBvZmZzZXQsCiAgICAgIFtDb21tZW50VG9rZW4gcHJlY2VkaW5nQ29tbWVudF0pCiAgICAgIDogc3VwZXIodHlwZSwgb2Zmc2V0LCBwcmVjZWRpbmdDb21tZW50KTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gY29weSgpID0+CiAgICAgIG5ldyBTeW50aGV0aWNCZWdpblRva2VuKHR5cGUsIG9mZnNldCwgY29weUNvbW1lbnRzKHByZWNlZGluZ0NvbW1lbnRzKSk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU3ludGhldGljID0+IHRydWU7CgogIEBvdmVycmlkZQogIGludCBnZXQgbGVuZ3RoID0+IDA7Cn0KCi8qKgogKiBBIHN5bnRoZXRpYyBrZXl3b3JkIHRva2VuLgogKi8KY2xhc3MgU3ludGhldGljS2V5d29yZFRva2VuIGV4dGVuZHMgS2V5d29yZFRva2VuIHsKICAvKioKICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCB0b2tlbiB0byByZXByZXNlbnQgdGhlIGdpdmVuIFtrZXl3b3JkXSBhdCB0aGUKICAgKiBnaXZlbiBbb2Zmc2V0XS4KICAgKi8KICBTeW50aGV0aWNLZXl3b3JkVG9rZW4oS2V5d29yZCBrZXl3b3JkLCBpbnQgb2Zmc2V0KSA6IHN1cGVyKGtleXdvcmQsIG9mZnNldCk7CgogIEBvdmVycmlkZQogIGludCBnZXQgbGVuZ3RoID0+IDA7CgogIEBvdmVycmlkZQogIFRva2VuIGNvcHkoKSA9PiBuZXcgU3ludGhldGljS2V5d29yZFRva2VuKGtleXdvcmQsIG9mZnNldCk7Cn0KCi8qKgogKiBBIHRva2VuIHdob3NlIHZhbHVlIGlzIGluZGVwZW5kZW50IG9mIGl0J3MgdHlwZS4KICovCmNsYXNzIFN5bnRoZXRpY1N0cmluZ1Rva2VuIGV4dGVuZHMgU3RyaW5nVG9rZW4gewogIGZpbmFsIGludCBfbGVuZ3RoOwoKICAvKioKICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCB0b2tlbiB0byByZXByZXNlbnQgYSB0b2tlbiBvZiB0aGUgZ2l2ZW4gW3R5cGVdCiAgICogd2l0aCB0aGUgZ2l2ZW4gW3ZhbHVlXSBhdCB0aGUgZ2l2ZW4gW29mZnNldF0uIElmIHRoZSBbbGVuZ3RoXSBpcwogICAqIG5vdCBzcGVjaWZpZWQsIHRoZW4gaXQgZGVmYXVsdHMgdG8gdGhlIGxlbmd0aCBvZiBbdmFsdWVdLgogICAqLwogIFN5bnRoZXRpY1N0cmluZ1Rva2VuKFRva2VuVHlwZSB0eXBlLCBTdHJpbmcgdmFsdWUsIGludCBvZmZzZXQsIFt0aGlzLl9sZW5ndGhdKQogICAgICA6IHN1cGVyKHR5cGUsIHZhbHVlLCBvZmZzZXQpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1N5bnRoZXRpYyA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGxlbmd0aCA9PiBfbGVuZ3RoID8/IHN1cGVyLmxlbmd0aDsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gY29weSgpID0+IG5ldyBTeW50aGV0aWNTdHJpbmdUb2tlbih0eXBlLCBfdmFsdWUsIG9mZnNldCwgX2xlbmd0aCk7Cn0KCi8qKgogKiBBIHN5bnRoZXRpYyB0b2tlbi4KICovCmNsYXNzIFN5bnRoZXRpY1Rva2VuIGV4dGVuZHMgU2ltcGxlVG9rZW4gewogIFN5bnRoZXRpY1Rva2VuKFRva2VuVHlwZSB0eXBlLCBpbnQgb2Zmc2V0KSA6IHN1cGVyKHR5cGUsIG9mZnNldCk7CgogIEBvdmVycmlkZQogIFRva2VuIGJlZm9yZVN5bnRoZXRpYzsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNTeW50aGV0aWMgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsZW5ndGggPT4gMDsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gY29weSgpID0+IG5ldyBTeW50aGV0aWNUb2tlbih0eXBlLCBvZmZzZXQpOwp9CgovKioKICogQSB0b2tlbiB0aGF0IHdhcyBzY2FubmVkIGZyb20gdGhlIGlucHV0LiBFYWNoIHRva2VuIGtub3dzIHdoaWNoIHRva2VucwogKiBwcmVjZWRlIGFuZCBmb2xsb3cgaXQsIGFjdGluZyBhcyBhIGxpbmsgaW4gYSBkb3VibHkgbGlua2VkIGxpc3Qgb2YgdG9rZW5zLgogKgogKiBDbGllbnRzIG1heSBub3QgZXh0ZW5kLCBpbXBsZW1lbnQgb3IgbWl4LWluIHRoaXMgY2xhc3MuCiAqLwphYnN0cmFjdCBjbGFzcyBUb2tlbiBpbXBsZW1lbnRzIFN5bnRhY3RpY0VudGl0eSB7CiAgLyoqCiAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgdG9rZW4gdG8gaGF2ZSB0aGUgZ2l2ZW4gW3R5cGVdIGFuZCBbb2Zmc2V0XS4KICAgKi8KICBmYWN0b3J5IFRva2VuKFRva2VuVHlwZSB0eXBlLCBpbnQgb2Zmc2V0LCBbQ29tbWVudFRva2VuIHByZWNlZWRpbmdDb21tZW50XSkgPQogICAgICBTaW1wbGVUb2tlbjsKCiAgLyoqCiAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgZW5kLW9mLWZpbGUgdG9rZW4gdG8gaGF2ZSB0aGUgZ2l2ZW4gW29mZnNldF0uCiAgICovCiAgZmFjdG9yeSBUb2tlbi5lb2YoaW50IG9mZnNldCwgW0NvbW1lbnRUb2tlbiBwcmVjZWRpbmdDb21tZW50c10pIHsKICAgIFRva2VuIGVvZiA9IG5ldyBTaW1wbGVUb2tlbihUb2tlblR5cGUuRU9GLCBvZmZzZXQsIHByZWNlZGluZ0NvbW1lbnRzKTsKICAgIC8vIEVPRiBwb2ludHMgdG8gaXRzZWxmIHNvIHRoZXJlJ3MgYWx3YXlzIGluZmluaXRlIGxvb2stYWhlYWQuCiAgICBlb2YucHJldmlvdXMgPSBlb2Y7CiAgICBlb2YubmV4dCA9IGVvZjsKICAgIHJldHVybiBlb2Y7CiAgfQoKICAvKioKICAgKiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcGFyc2VkIGJ5IHRoaXMgdG9rZW4uCiAgICovCiAgaW50IGdldCBjaGFyQ291bnQ7CgogIC8qKgogICAqIFRoZSBjaGFyYWN0ZXIgb2Zmc2V0IG9mIHRoZSBzdGFydCBvZiB0aGlzIHRva2VuIHdpdGhpbiB0aGUgc291cmNlIHRleHQuCiAgICovCiAgaW50IGdldCBjaGFyT2Zmc2V0OwoKICAvKioKICAgKiBUaGUgY2hhcmFjdGVyIG9mZnNldCBvZiB0aGUgZW5kIG9mIHRoaXMgdG9rZW4gd2l0aGluIHRoZSBzb3VyY2UgdGV4dC4KICAgKi8KICBpbnQgZ2V0IGNoYXJFbmQ7CgogIC8qKgogICAqIFRoZSB0b2tlbiBiZWZvcmUgdGhpcyBzeW50aGV0aWMgdG9rZW4sCiAgICogb3IgYG51bGxgIGlmIHRoaXMgaXMgbm90IGEgc3ludGhldGljIGApYCwgYF1gLCBgfWAsIG9yIGA+YCB0b2tlbi4KICAgKi8KICBUb2tlbiBnZXQgYmVmb3JlU3ludGhldGljOwoKICAvKioKICAgKiBTZXQgdG9rZW4gYmVmb3JlIHRoaXMgc3ludGhldGljIGApYCwgYF1gLCBgfWAsIG9yIGA+YCB0b2tlbiwKICAgKiBhbmQgaWdub3JlZCBvdGhlcndpc2UuCiAgICovCiAgc2V0IGJlZm9yZVN5bnRoZXRpYyhUb2tlbiBwcmV2aW91cyk7CgogIEBvdmVycmlkZQogIGludCBnZXQgZW5kOwoKICAvKioKICAgKiBUaGUgdG9rZW4gdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIHRva2VuLCBvciBgbnVsbGAgaWYgdGhpcyB0b2tlbiBpcyBub3QKICAgKiB0aGUgZmlyc3Qgb2YgYSBwYWlyIG9mIG1hdGNoaW5nIHRva2VucyAoc3VjaCBhcyBwYXJlbnRoZXNlcykuCiAgICovCiAgVG9rZW4gZ2V0IGVuZEdyb3VwID0+IG51bGw7CgogIC8qKgogICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyB0b2tlbiByZXByZXNlbnRzIGFuIGVuZCBvZiBmaWxlLgogICAqLwogIGJvb2wgZ2V0IGlzRW9mOwoKICAvKioKICAgKiBUcnVlIGlmIHRoaXMgdG9rZW4gaXMgYW4gaWRlbnRpZmllci4gU29tZSBrZXl3b3JkcyBhbGxvd2VkIGFzIGlkZW50aWZpZXJzLAogICAqIHNlZSBpbXBsZW1lbnRhdGlvbiBpbiBbS2V5d29yZFRva2VuXS4KICAgKi8KICBib29sIGdldCBpc0lkZW50aWZpZXI7CgogIC8qKgogICAqIFRydWUgaWYgdGhpcyB0b2tlbiBpcyBhIGtleXdvcmQuIFNvbWUga2V5d29yZHMgYWxsb3dlZCBhcyBpZGVudGlmaWVycywKICAgKiBzZWUgaW1wbGVtZW50YXRpb24gaW4gW0tleXdvcmRUb2tlbl0uCiAgICovCiAgYm9vbCBnZXQgaXNLZXl3b3JkOwoKICAvKioKICAgKiBUcnVlIGlmIHRoaXMgdG9rZW4gaXMgYSBrZXl3b3JkIG9yIGFuIGlkZW50aWZpZXIuCiAgICovCiAgYm9vbCBnZXQgaXNLZXl3b3JkT3JJZGVudGlmaWVyOwoKICAvKioKICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgdG9rZW4gaXMgYSBtb2RpZmllciBzdWNoIGFzIGBhYnN0cmFjdGAgb3IgYGNvbnN0YC4KICAgKi8KICBib29sIGdldCBpc01vZGlmaWVyOwoKICAvKioKICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgdG9rZW4gcmVwcmVzZW50cyBhbiBvcGVyYXRvci4KICAgKi8KICBib29sIGdldCBpc09wZXJhdG9yOwoKICAvKioKICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgdG9rZW4gaXMgYSBzeW50aGV0aWMgdG9rZW4uIEEgc3ludGhldGljIHRva2VuIGlzIGEKICAgKiB0b2tlbiB0aGF0IHdhcyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXJzZXIgaW4gb3JkZXIgdG8gcmVjb3ZlciBmcm9tIGFuIGVycm9yCiAgICogaW4gdGhlIGNvZGUuCiAgICovCiAgYm9vbCBnZXQgaXNTeW50aGV0aWM7CgogIC8qKgogICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyB0b2tlbiBpcyBhIGtleXdvcmQgc3RhcnRpbmcgYSB0b3AgbGV2ZWwgZGVjbGFyYXRpb24KICAgKiBzdWNoIGFzIGBjbGFzc2AsIGBlbnVtYCwgYGltcG9ydGAsIGV0Yy4KICAgKi8KICBib29sIGdldCBpc1RvcExldmVsS2V5d29yZDsKCiAgLyoqCiAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHRva2VuIHJlcHJlc2VudHMgYW4gb3BlcmF0b3IgdGhhdCBjYW4gYmUgZGVmaW5lZCBieQogICAqIHVzZXJzLgogICAqLwogIGJvb2wgZ2V0IGlzVXNlckRlZmluYWJsZU9wZXJhdG9yOwoKICAvKioKICAgKiBSZXR1cm4gdGhlIGtleXdvcmQsIGlmIGEga2V5d29yZCB0b2tlbiwgb3IgYG51bGxgIG90aGVyd2lzZS4KICAgKi8KICBLZXl3b3JkIGdldCBrZXl3b3JkOwoKICAvKioKICAgKiBUaGUga2luZCBlbnVtIG9mIHRoaXMgdG9rZW4gYXMgZGV0ZXJtaW5lZCBieSBpdHMgW3R5cGVdLgogICAqLwogIGludCBnZXQga2luZDsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsZW5ndGg7CgogIC8qKgogICAqIFJldHVybiB0aGUgbGV4ZW1lIHRoYXQgcmVwcmVzZW50cyB0aGlzIHRva2VuLgogICAqCiAgICogRm9yIFtTdHJpbmdUb2tlbl1zIHRoZSBbbGV4ZW1lXSBpbmNsdWRlcyB0aGUgcXVvdGVzLCBleHBsaWNpdCBlc2NhcGVzLCBldGMuCiAgICovCiAgU3RyaW5nIGdldCBsZXhlbWU7CgogIC8qKgogICAqIFJldHVybiB0aGUgbmV4dCB0b2tlbiBpbiB0aGUgdG9rZW4gc3RyZWFtLgogICAqLwogIFRva2VuIGdldCBuZXh0OwoKICAvKioKICAgKiBSZXR1cm4gdGhlIG5leHQgdG9rZW4gaW4gdGhlIHRva2VuIHN0cmVhbS4KICAgKi8KICB2b2lkIHNldCBuZXh0KFRva2VuIG5leHQpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IG9mZnNldDsKCiAgLyoqCiAgICogU2V0IHRoZSBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4KICAgKiB0aGUgdG9rZW4gdG8gdGhlIGdpdmVuIFtvZmZzZXRdLgogICAqLwogIHZvaWQgc2V0IG9mZnNldChpbnQgb2Zmc2V0KTsKCiAgLyoqCiAgICogUmV0dXJuIHRoZSBmaXJzdCBjb21tZW50IGluIHRoZSBsaXN0IG9mIGNvbW1lbnRzIHRoYXQgcHJlY2VkZSB0aGlzIHRva2VuLAogICAqIG9yIGBudWxsYCBpZiB0aGVyZSBhcmUgbm8gY29tbWVudHMgcHJlY2VkaW5nIHRoaXMgdG9rZW4uIEFkZGl0aW9uYWwKICAgKiBjb21tZW50cyBjYW4gYmUgcmVhY2hlZCBieSBmb2xsb3dpbmcgdGhlIHRva2VuIHN0cmVhbSB1c2luZyBbbmV4dF0gdW50aWwKICAgKiBgbnVsbGAgaXMgcmV0dXJuZWQuCiAgICoKICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIG9yaWdpbmFsIGNvbnRlbnRzIHdlcmUgYC8qIG9uZSAqLyAvKiB0d28gKi8gaWRgLCB0aGVuCiAgICogdGhlIGZpcnN0IHByZWNlZGluZyBjb21tZW50IHRva2VuIHdpbGwgaGF2ZSBhIGxleGVtZSBvZiBgLyogb25lICovYCBhbmQKICAgKiB0aGUgbmV4dCBjb21tZW50IHRva2VuIHdpbGwgaGF2ZSBhIGxleGVtZSBvZiBgLyogdHdvICovYC4KICAgKi8KICBUb2tlbiBnZXQgcHJlY2VkaW5nQ29tbWVudHM7CgogIC8qKgogICAqIFJldHVybiB0aGUgcHJldmlvdXMgdG9rZW4gaW4gdGhlIHRva2VuIHN0cmVhbS4KICAgKi8KICBUb2tlbiBnZXQgcHJldmlvdXM7CgogIC8qKgogICAqIFNldCB0aGUgcHJldmlvdXMgdG9rZW4gaW4gdGhlIHRva2VuIHN0cmVhbSB0byB0aGUgZ2l2ZW4gW3Rva2VuXS4KICAgKi8KICB2b2lkIHNldCBwcmV2aW91cyhUb2tlbiB0b2tlbik7CgogIC8qKgogICAqIEZvciBzeW1ib2wgYW5kIGtleXdvcmQgdG9rZW5zLCByZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhpcwogICAqIHRva2VuLiBGb3IgW1N0cmluZ1Rva2VuXXMgdGhpcyBtZXRob2QgcmV0dXJucyBbOm51bGw6XS4KICAgKgogICAqIEZvciBbU3ltYm9sVG9rZW5dcyBhbmQgW0tleXdvcmRUb2tlbl1zLCB0aGUgc3RyaW5nIHZhbHVlIGlzIGEgY29tcGlsZS10aW1lCiAgICogY29uc3RhbnQgb3JpZ2luYXRpbmcgaW4gdGhlIFtUb2tlblR5cGVdIG9yIGluIHRoZSBbS2V5d29yZF0gaW5zdGFuY2UuCiAgICogVGhpcyBhbGxvd3MgdGVzdGluZyBmb3Iga2V5d29yZHMgYW5kIHN5bWJvbHMgdXNpbmcgWzppZGVudGljYWw6XSwgZS5nLiwKICAgKiBbOmlkZW50aWNhbCgnY2xhc3MnLCB0b2tlbi52YWx1ZSk6XS4KICAgKgogICAqIE5vdGUgdGhhdCByZXR1cm5pbmcgWzpudWxsOl0gZm9yIHN0cmluZyB0b2tlbnMgaXMgaW1wb3J0YW50IHRvIGlkZW50aWZ5CiAgICogc3ltYm9scyBhbmQga2V5d29yZHMsIHdlIGNhbm5vdCB1c2UgW2xleGVtZV0gaW5zdGVhZC4gVGhlIHN0cmluZyBsaXRlcmFsCiAgICogICAiJGEoJGIiCiAgICogcHJvZHVjZXMgLi4uLCBTeW1ib2xUb2tlbigkKSwgU3RyaW5nVG9rZW4oYSksIFN0cmluZ1Rva2VuKCgpLCAuLi4KICAgKgogICAqIEFmdGVyIHBhcnNpbmcgdGhlIGlkZW50aWZpZXIgJ2EnLCB0aGUgcGFyc2VyIHRlc3RzIGZvciBhIGZ1bmN0aW9uCiAgICogZGVjbGFyYXRpb24gdXNpbmcgWzppZGVudGljYWwobmV4dC5zdHJpbmdWYWx1ZSwgJygnKTpdLCB3aGljaCAocmlnaHRmdWxseSkKICAgKiByZXR1cm5zIGZhbHNlIGJlY2F1c2Ugc3RyaW5nVmFsdWUgcmV0dXJucyBbOm51bGw6XS4KICAgKi8KICBTdHJpbmcgZ2V0IHN0cmluZ1ZhbHVlOwoKICAvKioKICAgKiBSZXR1cm4gdGhlIHR5cGUgb2YgdGhlIHRva2VuLgogICAqLwogIFRva2VuVHlwZSBnZXQgdHlwZTsKCiAgLyoqCiAgICogUmV0dXJuIGEgbmV3bHkgY3JlYXRlZCB0b2tlbiB0aGF0IGlzIGEgY29weSBvZiB0aGlzIHRva2VucwogICAqIGluY2x1ZGluZyBhbnkgW3ByZWNlZWRpbmdDb21tZW50XSB0b2tlbnMsCiAgICogYnV0IHRoYXQgaXMgbm90IGEgcGFydCBvZiBhbnkgdG9rZW4gc3RyZWFtLgogICAqLwogIFRva2VuIGNvcHkoKTsKCiAgLyoqCiAgICogQ29weSBhIGxpbmtlZCBsaXN0IG9mIGNvbW1lbnQgdG9rZW5zIGlkZW50aWNhbCB0byB0aGUgZ2l2ZW4gY29tbWVudCB0b2tlbnMuCiAgICovCiAgVG9rZW4gY29weUNvbW1lbnRzKFRva2VuIHRva2VuKTsKCiAgLyoqCiAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHRva2VuIGhhcyBhbnkgb25lIG9mIHRoZSBnaXZlbiBbdHlwZXNdLgogICAqLwogIGJvb2wgbWF0Y2hlc0FueShMaXN0PFRva2VuVHlwZT4gdHlwZXMpOwoKICAvKioKICAgKiBTZXQgdGhlIG5leHQgdG9rZW4gaW4gdGhlIHRva2VuIHN0cmVhbSB0byB0aGUgZ2l2ZW4gW3Rva2VuXS4gVGhpcyBoYXMgdGhlCiAgICogc2lkZS1lZmZlY3Qgb2Ygc2V0dGluZyB0aGlzIHRva2VuIHRvIGJlIHRoZSBwcmV2aW91cyB0b2tlbiBmb3IgdGhlIGdpdmVuCiAgICogdG9rZW4uIFJldHVybiB0aGUgdG9rZW4gdGhhdCB3YXMgcGFzc2VkIGluLgogICAqLwogIFRva2VuIHNldE5leHQoVG9rZW4gdG9rZW4pOwoKICAvKioKICAgKiBTZXQgdGhlIG5leHQgdG9rZW4gaW4gdGhlIHRva2VuIHN0cmVhbSB0byB0aGUgZ2l2ZW4gdG9rZW4gd2l0aG91dCBjaGFuZ2luZwogICAqIHdoaWNoIHRva2VuIGlzIHRoZSBwcmV2aW91cyB0b2tlbiBmb3IgdGhlIGdpdmVuIHRva2VuLiBSZXR1cm4gdGhlIHRva2VuCiAgICogdGhhdCB3YXMgcGFzc2VkIGluLgogICAqLwogIFRva2VuIHNldE5leHRXaXRob3V0U2V0dGluZ1ByZXZpb3VzKFRva2VuIHRva2VuKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0b2tlbiB0byBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcKICAgKiBwdXJwb3Nlcy4gVGhlIHJlc3VsdGluZyBzdHJpbmcgbWlnaHQgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUKICAgKiBzdHJ1Y3R1cmUgb2YgdGhlIHRva2VuLCBmb3IgZXhhbXBsZSAnU3RyaW5nVG9rZW4oZm9vKScgZm9yIHRoZSBpZGVudGlmaWVyCiAgICogdG9rZW4gJ2ZvbycuCiAgICoKICAgKiBVc2UgW2xleGVtZV0gZm9yIHRoZSB0ZXh0IGFjdHVhbGx5IHBhcnNlZCBieSB0aGUgdG9rZW4uCiAgICovCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCk7CgogIC8qKgogICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhpcyB0b2tlbi4gRm9yIGtleXdvcmQgdG9rZW5zLCB0aGlzIGlzIHRoZSBrZXl3b3JkCiAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSB0b2tlbiwgZm9yIG90aGVyIHRva2VucyBpdCBpcyB0aGUgbGV4ZW1lIGFzc29jaWF0ZWQKICAgKiB3aXRoIHRoZSB0b2tlbi4KICAgKi8KICBPYmplY3QgdmFsdWUoKTsKCiAgLyoqCiAgICogQ29tcGFyZSB0aGUgZ2l2ZW4gW3Rva2Vuc10gdG8gZmluZCB0aGUgdG9rZW4gdGhhdCBhcHBlYXJzIGZpcnN0IGluIHRoZQogICAqIHNvdXJjZSBiZWluZyBwYXJzZWQuIFRoYXQgaXMsIHJldHVybiB0aGUgbGVmdC1tb3N0IG9mIGFsbCBvZiB0aGUgdG9rZW5zLgogICAqIFRoZSBsaXN0IG11c3QgYmUgbm9uLWBudWxsYCwgYnV0IHRoZSBlbGVtZW50cyBvZiB0aGUgbGlzdCBhcmUgYWxsb3dlZCB0byBiZQogICAqIGBudWxsYC4gUmV0dXJuIHRoZSB0b2tlbiB3aXRoIHRoZSBzbWFsbGVzdCBvZmZzZXQsIG9yIGBudWxsYCBpZiB0aGUgbGlzdCBpcwogICAqIGVtcHR5IG9yIGlmIGFsbCBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGxpc3QgYXJlIGBudWxsYC4KICAgKi8KICBzdGF0aWMgVG9rZW4gbGV4aWNhbGx5Rmlyc3QoTGlzdDxUb2tlbj4gdG9rZW5zKSB7CiAgICBUb2tlbiBmaXJzdCA9IG51bGw7CiAgICBpbnQgb2Zmc2V0ID0gLTE7CiAgICBpbnQgbGVuZ3RoID0gdG9rZW5zLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgVG9rZW4gdG9rZW4gPSB0b2tlbnNbaV07CiAgICAgIGlmICh0b2tlbiAhPSBudWxsICYmIChvZmZzZXQgPCAwIHx8IHRva2VuLm9mZnNldCA8IG9mZnNldCkpIHsKICAgICAgICBmaXJzdCA9IHRva2VuOwogICAgICAgIG9mZnNldCA9IHRva2VuLm9mZnNldDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZpcnN0OwogIH0KfQoKLyoqCiAqIFRoZSBjbGFzc2VzIChvciBncm91cHMpIG9mIHRva2VucyB3aXRoIGEgc2ltaWxhciB1c2UuCiAqLwpjbGFzcyBUb2tlbkNsYXNzIHsKICAvKioKICAgKiBBIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdG9rZW4gdHlwZSBpcyBub3QgcGFydCBvZiBhbnkgc3BlY2lmaWMKICAgKiBjbGFzcyBvZiB0b2tlbi4KICAgKi8KICBzdGF0aWMgY29uc3QgVG9rZW5DbGFzcyBOT19DTEFTUyA9IGNvbnN0IFRva2VuQ2xhc3MoJ05PX0NMQVNTJyk7CgogIC8qKgogICAqIEEgdmFsdWUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0b2tlbiB0eXBlIGlzIGFuIGFkZGl0aXZlIG9wZXJhdG9yLgogICAqLwogIHN0YXRpYyBjb25zdCBUb2tlbkNsYXNzIEFERElUSVZFX09QRVJBVE9SID0KICAgICAgY29uc3QgVG9rZW5DbGFzcygnQURESVRJVkVfT1BFUkFUT1InLCBBRERJVElWRV9QUkVDRURFTkNFKTsKCiAgLyoqCiAgICogQSB2YWx1ZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHRva2VuIHR5cGUgaXMgYW4gYXNzaWdubWVudCBvcGVyYXRvci4KICAgKi8KICBzdGF0aWMgY29uc3QgVG9rZW5DbGFzcyBBU1NJR05NRU5UX09QRVJBVE9SID0KICAgICAgY29uc3QgVG9rZW5DbGFzcygnQVNTSUdOTUVOVF9PUEVSQVRPUicsIEFTU0lHTk1FTlRfUFJFQ0VERU5DRSk7CgogIC8qKgogICAqIEEgdmFsdWUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0b2tlbiB0eXBlIGlzIGEgYml0d2lzZS1hbmQgb3BlcmF0b3IuCiAgICovCiAgc3RhdGljIGNvbnN0IFRva2VuQ2xhc3MgQklUV0lTRV9BTkRfT1BFUkFUT1IgPQogICAgICBjb25zdCBUb2tlbkNsYXNzKCdCSVRXSVNFX0FORF9PUEVSQVRPUicsIEJJVFdJU0VfQU5EX1BSRUNFREVOQ0UpOwoKICAvKioKICAgKiBBIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdG9rZW4gdHlwZSBpcyBhIGJpdHdpc2Utb3Igb3BlcmF0b3IuCiAgICovCiAgc3RhdGljIGNvbnN0IFRva2VuQ2xhc3MgQklUV0lTRV9PUl9PUEVSQVRPUiA9CiAgICAgIGNvbnN0IFRva2VuQ2xhc3MoJ0JJVFdJU0VfT1JfT1BFUkFUT1InLCBCSVRXSVNFX09SX1BSRUNFREVOQ0UpOwoKICAvKioKICAgKiBBIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdG9rZW4gdHlwZSBpcyBhIGJpdHdpc2UteG9yIG9wZXJhdG9yLgogICAqLwogIHN0YXRpYyBjb25zdCBUb2tlbkNsYXNzIEJJVFdJU0VfWE9SX09QRVJBVE9SID0KICAgICAgY29uc3QgVG9rZW5DbGFzcygnQklUV0lTRV9YT1JfT1BFUkFUT1InLCBCSVRXSVNFX1hPUl9QUkVDRURFTkNFKTsKCiAgLyoqCiAgICogQSB2YWx1ZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHRva2VuIHR5cGUgaXMgYSBjYXNjYWRlIG9wZXJhdG9yLgogICAqLwogIHN0YXRpYyBjb25zdCBUb2tlbkNsYXNzIENBU0NBREVfT1BFUkFUT1IgPQogICAgICBjb25zdCBUb2tlbkNsYXNzKCdDQVNDQURFX09QRVJBVE9SJywgQ0FTQ0FERV9QUkVDRURFTkNFKTsKCiAgLyoqCiAgICogQSB2YWx1ZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHRva2VuIHR5cGUgaXMgYSBjb25kaXRpb25hbCBvcGVyYXRvci4KICAgKi8KICBzdGF0aWMgY29uc3QgVG9rZW5DbGFzcyBDT05ESVRJT05BTF9PUEVSQVRPUiA9CiAgICAgIGNvbnN0IFRva2VuQ2xhc3MoJ0NPTkRJVElPTkFMX09QRVJBVE9SJywgQ09ORElUSU9OQUxfUFJFQ0VERU5DRSk7CgogIC8qKgogICAqIEEgdmFsdWUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0b2tlbiB0eXBlIGlzIGFuIGVxdWFsaXR5IG9wZXJhdG9yLgogICAqLwogIHN0YXRpYyBjb25zdCBUb2tlbkNsYXNzIEVRVUFMSVRZX09QRVJBVE9SID0KICAgICAgY29uc3QgVG9rZW5DbGFzcygnRVFVQUxJVFlfT1BFUkFUT1InLCBFUVVBTElUWV9QUkVDRURFTkNFKTsKCiAgLyoqCiAgICogQSB2YWx1ZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHRva2VuIHR5cGUgaXMgYW4gaWYtbnVsbCBvcGVyYXRvci4KICAgKi8KICBzdGF0aWMgY29uc3QgVG9rZW5DbGFzcyBJRl9OVUxMX09QRVJBVE9SID0KICAgICAgY29uc3QgVG9rZW5DbGFzcygnSUZfTlVMTF9PUEVSQVRPUicsIElGX05VTExfUFJFQ0VERU5DRSk7CgogIC8qKgogICAqIEEgdmFsdWUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0b2tlbiB0eXBlIGlzIGEgbG9naWNhbC1hbmQgb3BlcmF0b3IuCiAgICovCiAgc3RhdGljIGNvbnN0IFRva2VuQ2xhc3MgTE9HSUNBTF9BTkRfT1BFUkFUT1IgPQogICAgICBjb25zdCBUb2tlbkNsYXNzKCdMT0dJQ0FMX0FORF9PUEVSQVRPUicsIExPR0lDQUxfQU5EX1BSRUNFREVOQ0UpOwoKICAvKioKICAgKiBBIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdG9rZW4gdHlwZSBpcyBhIGxvZ2ljYWwtb3Igb3BlcmF0b3IuCiAgICovCiAgc3RhdGljIGNvbnN0IFRva2VuQ2xhc3MgTE9HSUNBTF9PUl9PUEVSQVRPUiA9CiAgICAgIGNvbnN0IFRva2VuQ2xhc3MoJ0xPR0lDQUxfT1JfT1BFUkFUT1InLCBMT0dJQ0FMX09SX1BSRUNFREVOQ0UpOwoKICAvKioKICAgKiBBIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdG9rZW4gdHlwZSBpcyBhIG11bHRpcGxpY2F0aXZlIG9wZXJhdG9yLgogICAqLwogIHN0YXRpYyBjb25zdCBUb2tlbkNsYXNzIE1VTFRJUExJQ0FUSVZFX09QRVJBVE9SID0KICAgICAgY29uc3QgVG9rZW5DbGFzcygnTVVMVElQTElDQVRJVkVfT1BFUkFUT1InLCBNVUxUSVBMSUNBVElWRV9QUkVDRURFTkNFKTsKCiAgLyoqCiAgICogQSB2YWx1ZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHRva2VuIHR5cGUgaXMgYSByZWxhdGlvbmFsIG9wZXJhdG9yLgogICAqLwogIHN0YXRpYyBjb25zdCBUb2tlbkNsYXNzIFJFTEFUSU9OQUxfT1BFUkFUT1IgPQogICAgICBjb25zdCBUb2tlbkNsYXNzKCdSRUxBVElPTkFMX09QRVJBVE9SJywgUkVMQVRJT05BTF9QUkVDRURFTkNFKTsKCiAgLyoqCiAgICogQSB2YWx1ZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHRva2VuIHR5cGUgaXMgYSBzaGlmdCBvcGVyYXRvci4KICAgKi8KICBzdGF0aWMgY29uc3QgVG9rZW5DbGFzcyBTSElGVF9PUEVSQVRPUiA9CiAgICAgIGNvbnN0IFRva2VuQ2xhc3MoJ1NISUZUX09QRVJBVE9SJywgU0hJRlRfUFJFQ0VERU5DRSk7CgogIC8qKgogICAqIEEgdmFsdWUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0b2tlbiB0eXBlIGlzIGEgdW5hcnkgb3BlcmF0b3IuCiAgICovCiAgc3RhdGljIGNvbnN0IFRva2VuQ2xhc3MgVU5BUllfUE9TVEZJWF9PUEVSQVRPUiA9CiAgICAgIGNvbnN0IFRva2VuQ2xhc3MoJ1VOQVJZX1BPU1RGSVhfT1BFUkFUT1InLCBQT1NURklYX1BSRUNFREVOQ0UpOwoKICAvKioKICAgKiBBIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdG9rZW4gdHlwZSBpcyBhIHVuYXJ5IG9wZXJhdG9yLgogICAqLwogIHN0YXRpYyBjb25zdCBUb2tlbkNsYXNzIFVOQVJZX1BSRUZJWF9PUEVSQVRPUiA9CiAgICAgIGNvbnN0IFRva2VuQ2xhc3MoJ1VOQVJZX1BSRUZJWF9PUEVSQVRPUicsIFBSRUZJWF9QUkVDRURFTkNFKTsKCiAgLyoqCiAgICogVGhlIG5hbWUgb2YgdGhlIHRva2VuIGNsYXNzLgogICAqLwogIGZpbmFsIFN0cmluZyBuYW1lOwoKICAvKioKICAgKiBUaGUgcHJlY2VkZW5jZSBvZiB0b2tlbnMgb2YgdGhpcyBjbGFzcywgb3IgYDBgIGlmIHRoZSBzdWNoIHRva2VucyBkbyBub3QKICAgKiByZXByZXNlbnQgYW4gb3BlcmF0b3IuCiAgICovCiAgZmluYWwgaW50IHByZWNlZGVuY2U7CgogIC8qKgogICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGNsYXNzIG9mIHRva2VucyB0byBoYXZlIHRoZSBnaXZlbiBbbmFtZV0gYW5kCiAgICogW3ByZWNlZGVuY2VdLgogICAqLwogIGNvbnN0IFRva2VuQ2xhc3ModGhpcy5uYW1lLCBbdGhpcy5wcmVjZWRlbmNlID0gTk9fUFJFQ0VERU5DRV0pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBuYW1lOwp9CgovKioKICogVGhlIHR5cGVzIG9mIHRva2VucyB0aGF0IGNhbiBiZSByZXR1cm5lZCBieSB0aGUgc2Nhbm5lci4KICoKICogQ2xpZW50cyBtYXkgbm90IGV4dGVuZCwgaW1wbGVtZW50IG9yIG1peC1pbiB0aGlzIGNsYXNzLgogKi8KY2xhc3MgVG9rZW5UeXBlIHsKICAvKioKICAgKiBUaGUgdHlwZSBvZiB0aGUgdG9rZW4gdGhhdCBtYXJrcyB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoZSBpbnB1dC4KICAgKi8KICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEVPRiA9CiAgICAgIGNvbnN0IFRva2VuVHlwZSgnJywgJ0VPRicsIE5PX1BSRUNFREVOQ0UsIEVPRl9UT0tFTik7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgRE9VQkxFID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnZG91YmxlJywgJ0RPVUJMRScsIE5PX1BSRUNFREVOQ0UsIERPVUJMRV9UT0tFTiwKICAgICAgc3RyaW5nVmFsdWU6IG51bGwpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEhFWEFERUNJTUFMID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnaGV4YWRlY2ltYWwnLCAnSEVYQURFQ0lNQUwnLCBOT19QUkVDRURFTkNFLCBIRVhBREVDSU1BTF9UT0tFTiwKICAgICAgc3RyaW5nVmFsdWU6IG51bGwpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIElERU5USUZJRVIgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICdpZGVudGlmaWVyJywgJ1NUUklOR19JTlQnLCBOT19QUkVDRURFTkNFLCBJREVOVElGSUVSX1RPS0VOLAogICAgICBzdHJpbmdWYWx1ZTogbnVsbCk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgSU5UID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnaW50JywgJ0lOVCcsIE5PX1BSRUNFREVOQ0UsIElOVF9UT0tFTiwKICAgICAgc3RyaW5nVmFsdWU6IG51bGwpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIE1VTFRJX0xJTkVfQ09NTUVOVCA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJ2NvbW1lbnQnLCAnTVVMVElfTElORV9DT01NRU5UJywgTk9fUFJFQ0VERU5DRSwgQ09NTUVOVF9UT0tFTiwKICAgICAgc3RyaW5nVmFsdWU6IG51bGwpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFNDUklQVF9UQUcgPQogICAgICBjb25zdCBUb2tlblR5cGUoJ3NjcmlwdCcsICdTQ1JJUFRfVEFHJywgTk9fUFJFQ0VERU5DRSwgU0NSSVBUX1RPS0VOKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBTSU5HTEVfTElORV9DT01NRU5UID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnY29tbWVudCcsICdTSU5HTEVfTElORV9DT01NRU5UJywgTk9fUFJFQ0VERU5DRSwgQ09NTUVOVF9UT0tFTiwKICAgICAgc3RyaW5nVmFsdWU6IG51bGwpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFNUUklORyA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJ3N0cmluZycsICdTVFJJTkcnLCBOT19QUkVDRURFTkNFLCBTVFJJTkdfVE9LRU4sCiAgICAgIHN0cmluZ1ZhbHVlOiBudWxsKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBBTVBFUlNBTkQgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICcmJywgJ0FNUEVSU0FORCcsIEJJVFdJU0VfQU5EX1BSRUNFREVOQ0UsIEFNUEVSU0FORF9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSwgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEFNUEVSU0FORF9BTVBFUlNBTkQgPSBjb25zdCBUb2tlblR5cGUoJyYmJywKICAgICAgJ0FNUEVSU0FORF9BTVBFUlNBTkQnLCBMT0dJQ0FMX0FORF9QUkVDRURFTkNFLCBBTVBFUlNBTkRfQU1QRVJTQU5EX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgLy8gVGhpcyBpcyBub3QgeWV0IHBhcnQgb2YgdGhlIGxhbmd1YWdlIGFuZCBub3Qgc3VwcG9ydGVkIGJ5IGZhc3RhCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBBTVBFUlNBTkRfQU1QRVJTQU5EX0VRID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnJiY9JywKICAgICAgJ0FNUEVSU0FORF9BTVBFUlNBTkRfRVEnLAogICAgICBBU1NJR05NRU5UX1BSRUNFREVOQ0UsCiAgICAgIEFNUEVSU0FORF9BTVBFUlNBTkRfRVFfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEFNUEVSU0FORF9FUSA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJyY9JywgJ0FNUEVSU0FORF9FUScsIEFTU0lHTk1FTlRfUFJFQ0VERU5DRSwgQU1QRVJTQU5EX0VRX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBBVCA9CiAgICAgIGNvbnN0IFRva2VuVHlwZSgnQCcsICdBVCcsIE5PX1BSRUNFREVOQ0UsIEFUX1RPS0VOKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBCQU5HID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnIScsICdCQU5HJywgUFJFRklYX1BSRUNFREVOQ0UsIEJBTkdfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEJBTkdfRVEgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICchPScsICdCQU5HX0VRJywgRVFVQUxJVFlfUFJFQ0VERU5DRSwgQkFOR19FUV9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgQkFOR19FUV9FUSA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJyE9PScsICdCQU5HX0VRX0VRJywgRVFVQUxJVFlfUFJFQ0VERU5DRSwgQkFOR19FUV9FUV9UT0tFTik7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgQkFSID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnfCcsICdCQVInLCBCSVRXSVNFX09SX1BSRUNFREVOQ0UsIEJBUl9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSwgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEJBUl9CQVIgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICd8fCcsICdCQVJfQkFSJywgTE9HSUNBTF9PUl9QUkVDRURFTkNFLCBCQVJfQkFSX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgLy8gVGhpcyBpcyBub3QgeWV0IHBhcnQgb2YgdGhlIGxhbmd1YWdlIGFuZCBub3Qgc3VwcG9ydGVkIGJ5IGZhc3RhCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBCQVJfQkFSX0VRID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnfHw9JywgJ0JBUl9CQVJfRVEnLCBBU1NJR05NRU5UX1BSRUNFREVOQ0UsIEJBUl9CQVJfRVFfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEJBUl9FUSA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJ3w9JywgJ0JBUl9FUScsIEFTU0lHTk1FTlRfUFJFQ0VERU5DRSwgQkFSX0VRX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBDT0xPTiA9CiAgICAgIGNvbnN0IFRva2VuVHlwZSgnOicsICdDT0xPTicsIE5PX1BSRUNFREVOQ0UsIENPTE9OX1RPS0VOKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBDT01NQSA9CiAgICAgIGNvbnN0IFRva2VuVHlwZSgnLCcsICdDT01NQScsIE5PX1BSRUNFREVOQ0UsIENPTU1BX1RPS0VOKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBDQVJFVCA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJ14nLCAnQ0FSRVQnLCBCSVRXSVNFX1hPUl9QUkVDRURFTkNFLCBDQVJFVF9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSwgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIENBUkVUX0VRID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnXj0nLCAnQ0FSRVRfRVEnLCBBU1NJR05NRU5UX1BSRUNFREVOQ0UsIENBUkVUX0VRX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBDTE9TRV9DVVJMWV9CUkFDS0VUID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnfScsICdDTE9TRV9DVVJMWV9CUkFDS0VUJywgTk9fUFJFQ0VERU5DRSwgQ0xPU0VfQ1VSTFlfQlJBQ0tFVF9UT0tFTik7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgQ0xPU0VfUEFSRU4gPQogICAgICBjb25zdCBUb2tlblR5cGUoJyknLCAnQ0xPU0VfUEFSRU4nLCBOT19QUkVDRURFTkNFLCBDTE9TRV9QQVJFTl9UT0tFTik7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgQ0xPU0VfU1FVQVJFX0JSQUNLRVQgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICddJywgJ0NMT1NFX1NRVUFSRV9CUkFDS0VUJywgTk9fUFJFQ0VERU5DRSwgQ0xPU0VfU1FVQVJFX0JSQUNLRVRfVE9LRU4pOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEVRID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnPScsICdFUScsIEFTU0lHTk1FTlRfUFJFQ0VERU5DRSwgRVFfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEVRX0VRID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnPT0nLCAnRVFfRVEnLCBFUVVBTElUWV9QUkVDRURFTkNFLCBFUV9FUV9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSwgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I6IHRydWUpOwoKICAvLy8gVGhlIGA9PT1gIG9wZXJhdG9yIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIERhcnQgbGFuZ3VhZ2UKICAvLy8gYnV0IGlzIHBhcnNlZCBhcyBzdWNoIGJ5IHRoZSBzY2FubmVyIHRvIHN1cHBvcnQgYmV0dGVyIHJlY292ZXJ5CiAgLy8vIHdoZW4gYSBKYXZhU2NyaXB0IGNvZGUgc25pcHBldCBpcyBwYXN0ZWQgaW50byBhIERhcnQgZmlsZS4KICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEVRX0VRX0VRID0KICAgICAgY29uc3QgVG9rZW5UeXBlKCc9PT0nLCAnRVFfRVFfRVEnLCBFUVVBTElUWV9QUkVDRURFTkNFLCBFUV9FUV9FUV9UT0tFTik7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgRlVOQ1RJT04gPQogICAgICBjb25zdCBUb2tlblR5cGUoJz0+JywgJ0ZVTkNUSU9OJywgTk9fUFJFQ0VERU5DRSwgRlVOQ1RJT05fVE9LRU4pOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEdUID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnPicsICdHVCcsIFJFTEFUSU9OQUxfUFJFQ0VERU5DRSwgR1RfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUsIGlzVXNlckRlZmluYWJsZU9wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBHVF9FUSA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJz49JywgJ0dUX0VRJywgUkVMQVRJT05BTF9QUkVDRURFTkNFLCBHVF9FUV9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSwgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEdUX0dUID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnPj4nLCAnR1RfR1QnLCBTSElGVF9QUkVDRURFTkNFLCBHVF9HVF9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSwgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEdUX0dUX0VRID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnPj49JywgJ0dUX0dUX0VRJywgQVNTSUdOTUVOVF9QUkVDRURFTkNFLCBHVF9HVF9FUV9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgR1RfR1RfR1QgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICc+Pj4nLCAnR1RfR1RfR1QnLCBTSElGVF9QUkVDRURFTkNFLCBHVF9HVF9HVF9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSwgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEdUX0dUX0dUX0VRID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnPj4+PScsICdHVF9HVF9HVF9FUScsIEFTU0lHTk1FTlRfUFJFQ0VERU5DRSwgR1RfR1RfR1RfRVFfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEhBU0ggPQogICAgICBjb25zdCBUb2tlblR5cGUoJyMnLCAnSEFTSCcsIE5PX1BSRUNFREVOQ0UsIEhBU0hfVE9LRU4pOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIElOREVYID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnW10nLCAnSU5ERVgnLCBTRUxFQ1RPUl9QUkVDRURFTkNFLCBJTkRFWF9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSwgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIElOREVYX0VRID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnW109JywgJ0lOREVYX0VRJywgTk9fUFJFQ0VERU5DRSwgSU5ERVhfRVFfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUsIGlzVXNlckRlZmluYWJsZU9wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBMVCA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJzwnLCAnTFQnLCBSRUxBVElPTkFMX1BSRUNFREVOQ0UsIExUX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlLCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgTFRfRVEgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICc8PScsICdMVF9FUScsIFJFTEFUSU9OQUxfUFJFQ0VERU5DRSwgTFRfRVFfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUsIGlzVXNlckRlZmluYWJsZU9wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBMVF9MVCA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJzw8JywgJ0xUX0xUJywgU0hJRlRfUFJFQ0VERU5DRSwgTFRfTFRfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUsIGlzVXNlckRlZmluYWJsZU9wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBMVF9MVF9FUSA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJzw8PScsICdMVF9MVF9FUScsIEFTU0lHTk1FTlRfUFJFQ0VERU5DRSwgTFRfTFRfRVFfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIE1JTlVTID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnLScsICdNSU5VUycsIEFERElUSVZFX1BSRUNFREVOQ0UsIE1JTlVTX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlLCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgTUlOVVNfRVEgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICctPScsICdNSU5VU19FUScsIEFTU0lHTk1FTlRfUFJFQ0VERU5DRSwgTUlOVVNfRVFfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIE1JTlVTX01JTlVTID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnLS0nLCAnTUlOVVNfTUlOVVMnLCBQT1NURklYX1BSRUNFREVOQ0UsIE1JTlVTX01JTlVTX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBPUEVOX0NVUkxZX0JSQUNLRVQgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICd7JywgJ09QRU5fQ1VSTFlfQlJBQ0tFVCcsIE5PX1BSRUNFREVOQ0UsIE9QRU5fQ1VSTFlfQlJBQ0tFVF9UT0tFTik7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgT1BFTl9QQVJFTiA9CiAgICAgIGNvbnN0IFRva2VuVHlwZSgnKCcsICdPUEVOX1BBUkVOJywgU0VMRUNUT1JfUFJFQ0VERU5DRSwgT1BFTl9QQVJFTl9UT0tFTik7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgT1BFTl9TUVVBUkVfQlJBQ0tFVCA9IGNvbnN0IFRva2VuVHlwZSgnWycsCiAgICAgICdPUEVOX1NRVUFSRV9CUkFDS0VUJywgU0VMRUNUT1JfUFJFQ0VERU5DRSwgT1BFTl9TUVVBUkVfQlJBQ0tFVF9UT0tFTik7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgUEVSQ0VOVCA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJyUnLCAnUEVSQ0VOVCcsIE1VTFRJUExJQ0FUSVZFX1BSRUNFREVOQ0UsIFBFUkNFTlRfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUsIGlzVXNlckRlZmluYWJsZU9wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBQRVJDRU5UX0VRID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnJT0nLCAnUEVSQ0VOVF9FUScsIEFTU0lHTk1FTlRfUFJFQ0VERU5DRSwgUEVSQ0VOVF9FUV9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgUEVSSU9EID0KICAgICAgY29uc3QgVG9rZW5UeXBlKCcuJywgJ1BFUklPRCcsIFNFTEVDVE9SX1BSRUNFREVOQ0UsIFBFUklPRF9UT0tFTik7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgUEVSSU9EX1BFUklPRCA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJy4uJywgJ1BFUklPRF9QRVJJT0QnLCBDQVNDQURFX1BSRUNFREVOQ0UsIFBFUklPRF9QRVJJT0RfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFBMVVMgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICcrJywgJ1BMVVMnLCBBRERJVElWRV9QUkVDRURFTkNFLCBQTFVTX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlLCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgUExVU19FUSA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJys9JywgJ1BMVVNfRVEnLCBBU1NJR05NRU5UX1BSRUNFREVOQ0UsIFBMVVNfRVFfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFBMVVNfUExVUyA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJysrJywgJ1BMVVNfUExVUycsIFBPU1RGSVhfUFJFQ0VERU5DRSwgUExVU19QTFVTX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBRVUVTVElPTiA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJz8nLCAnUVVFU1RJT04nLCBDT05ESVRJT05BTF9QUkVDRURFTkNFLCBRVUVTVElPTl9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgUVVFU1RJT05fUEVSSU9EID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnPy4nLCAnUVVFU1RJT05fUEVSSU9EJywgU0VMRUNUT1JfUFJFQ0VERU5DRSwgUVVFU1RJT05fUEVSSU9EX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBRVUVTVElPTl9RVUVTVElPTiA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJz8/JywgJ1FVRVNUSU9OX1FVRVNUSU9OJywgSUZfTlVMTF9QUkVDRURFTkNFLCBRVUVTVElPTl9RVUVTVElPTl9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgUVVFU1RJT05fUVVFU1RJT05fRVEgPSBjb25zdCBUb2tlblR5cGUoJz8/PScsCiAgICAgICdRVUVTVElPTl9RVUVTVElPTl9FUScsIEFTU0lHTk1FTlRfUFJFQ0VERU5DRSwgUVVFU1RJT05fUVVFU1RJT05fRVFfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFNFTUlDT0xPTiA9CiAgICAgIGNvbnN0IFRva2VuVHlwZSgnOycsICdTRU1JQ09MT04nLCBOT19QUkVDRURFTkNFLCBTRU1JQ09MT05fVE9LRU4pOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFNMQVNIID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnLycsICdTTEFTSCcsIE1VTFRJUExJQ0FUSVZFX1BSRUNFREVOQ0UsIFNMQVNIX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlLCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgU0xBU0hfRVEgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICcvPScsICdTTEFTSF9FUScsIEFTU0lHTk1FTlRfUFJFQ0VERU5DRSwgU0xBU0hfRVFfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFNUQVIgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICcqJywgJ1NUQVInLCBNVUxUSVBMSUNBVElWRV9QUkVDRURFTkNFLCBTVEFSX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlLCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgU1RBUl9FUSA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJyo9JywgJ1NUQVJfRVEnLCBBU1NJR05NRU5UX1BSRUNFREVOQ0UsIFNUQVJfRVFfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFNUUklOR19JTlRFUlBPTEFUSU9OX0VYUFJFU1NJT04gPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICdcJHsnLAogICAgICAnU1RSSU5HX0lOVEVSUE9MQVRJT05fRVhQUkVTU0lPTicsCiAgICAgIE5PX1BSRUNFREVOQ0UsCiAgICAgIFNUUklOR19JTlRFUlBPTEFUSU9OX1RPS0VOKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBTVFJJTkdfSU5URVJQT0xBVElPTl9JREVOVElGSUVSID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnXCQnLAogICAgICAnU1RSSU5HX0lOVEVSUE9MQVRJT05fSURFTlRJRklFUicsCiAgICAgIE5PX1BSRUNFREVOQ0UsCiAgICAgIFNUUklOR19JTlRFUlBPTEFUSU9OX0lERU5USUZJRVJfVE9LRU4pOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFRJTERFID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnficsICdUSUxERScsIFBSRUZJWF9QUkVDRURFTkNFLCBUSUxERV9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSwgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFRJTERFX1NMQVNIID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnfi8nLCAnVElMREVfU0xBU0gnLCBNVUxUSVBMSUNBVElWRV9QUkVDRURFTkNFLCBUSUxERV9TTEFTSF9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSwgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFRJTERFX1NMQVNIX0VRID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnfi89JywgJ1RJTERFX1NMQVNIX0VRJywgQVNTSUdOTUVOVF9QUkVDRURFTkNFLCBUSUxERV9TTEFTSF9FUV9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgQkFDS1BJTkcgPQogICAgICBjb25zdCBUb2tlblR5cGUoJ2AnLCAnQkFDS1BJTkcnLCBOT19QUkVDRURFTkNFLCBCQUNLUElOR19UT0tFTik7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgQkFDS1NMQVNIID0KICAgICAgY29uc3QgVG9rZW5UeXBlKCdcXCcsICdCQUNLU0xBU0gnLCBOT19QUkVDRURFTkNFLCBCQUNLU0xBU0hfVE9LRU4pOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFBFUklPRF9QRVJJT0RfUEVSSU9EID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnLi4uJywgJ1BFUklPRF9QRVJJT0RfUEVSSU9EJywgTk9fUFJFQ0VERU5DRSwgUEVSSU9EX1BFUklPRF9QRVJJT0RfVE9LRU4pOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFBFUklPRF9QRVJJT0RfUEVSSU9EX1FVRVNUSU9OID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnLi4uPycsCiAgICAgICdQRVJJT0RfUEVSSU9EX1BFUklPRF9RVUVTVElPTicsCiAgICAgIE5PX1BSRUNFREVOQ0UsCiAgICAgIFBFUklPRF9QRVJJT0RfUEVSSU9EX1FVRVNUSU9OX1RPS0VOKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBBUyA9IEtleXdvcmQuQVM7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgSVMgPSBLZXl3b3JkLklTOwoKICAvKioKICAgKiBUb2tlbiB0eXBlIHVzZWQgYnkgZXJyb3IgdG9rZW5zLgogICAqLwogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgQkFEX0lOUFVUID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnbWFsZm9ybWVkIGlucHV0JywgJ0JBRF9JTlBVVCcsIE5PX1BSRUNFREVOQ0UsIEJBRF9JTlBVVF9UT0tFTiwKICAgICAgc3RyaW5nVmFsdWU6IG51bGwpOwoKICAvKioKICAgKiBUb2tlbiB0eXBlIHVzZWQgYnkgc3ludGhldGljIHRva2VucyB0aGF0IGFyZSBjcmVhdGVkIGR1cmluZyBwYXJzZXIKICAgKiByZWNvdmVyeSAobm9uLWFuYWx5emVyIHVzZSBjYXNlKS4KICAgKi8KICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFJFQ09WRVJZID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAncmVjb3ZlcnknLCAnUkVDT1ZFUlknLCBOT19QUkVDRURFTkNFLCBSRUNPVkVSWV9UT0tFTiwKICAgICAgc3RyaW5nVmFsdWU6IG51bGwpOwoKICAvLyBUT0RPKGRhbnJ1YmVsKTogImFsbCIgaXMgbWlzbGVhZGluZwogIC8vIGJlY2F1c2UgdGhpcyBsaXN0IGRvZXMgbm90IGluY2x1ZGUgYWxsIFRva2VuVHlwZSBpbnN0YW5jZXMuCiAgc3RhdGljIGNvbnN0IExpc3Q8VG9rZW5UeXBlPiBhbGwgPSBjb25zdCA8VG9rZW5UeXBlPlsKICAgIFRva2VuVHlwZS5FT0YsCiAgICBUb2tlblR5cGUuRE9VQkxFLAogICAgVG9rZW5UeXBlLkhFWEFERUNJTUFMLAogICAgVG9rZW5UeXBlLklERU5USUZJRVIsCiAgICBUb2tlblR5cGUuSU5ULAogICAgVG9rZW5UeXBlLk1VTFRJX0xJTkVfQ09NTUVOVCwKICAgIFRva2VuVHlwZS5TQ1JJUFRfVEFHLAogICAgVG9rZW5UeXBlLlNJTkdMRV9MSU5FX0NPTU1FTlQsCiAgICBUb2tlblR5cGUuU1RSSU5HLAogICAgVG9rZW5UeXBlLkFNUEVSU0FORCwKICAgIFRva2VuVHlwZS5BTVBFUlNBTkRfQU1QRVJTQU5ELAogICAgVG9rZW5UeXBlLkFNUEVSU0FORF9FUSwKICAgIFRva2VuVHlwZS5BVCwKICAgIFRva2VuVHlwZS5CQU5HLAogICAgVG9rZW5UeXBlLkJBTkdfRVEsCiAgICBUb2tlblR5cGUuQkFSLAogICAgVG9rZW5UeXBlLkJBUl9CQVIsCiAgICBUb2tlblR5cGUuQkFSX0VRLAogICAgVG9rZW5UeXBlLkNPTE9OLAogICAgVG9rZW5UeXBlLkNPTU1BLAogICAgVG9rZW5UeXBlLkNBUkVULAogICAgVG9rZW5UeXBlLkNBUkVUX0VRLAogICAgVG9rZW5UeXBlLkNMT1NFX0NVUkxZX0JSQUNLRVQsCiAgICBUb2tlblR5cGUuQ0xPU0VfUEFSRU4sCiAgICBUb2tlblR5cGUuQ0xPU0VfU1FVQVJFX0JSQUNLRVQsCiAgICBUb2tlblR5cGUuRVEsCiAgICBUb2tlblR5cGUuRVFfRVEsCiAgICBUb2tlblR5cGUuRlVOQ1RJT04sCiAgICBUb2tlblR5cGUuR1QsCiAgICBUb2tlblR5cGUuR1RfRVEsCiAgICBUb2tlblR5cGUuR1RfR1QsCiAgICBUb2tlblR5cGUuR1RfR1RfRVEsCiAgICBUb2tlblR5cGUuSEFTSCwKICAgIFRva2VuVHlwZS5JTkRFWCwKICAgIFRva2VuVHlwZS5JTkRFWF9FUSwKICAgIFRva2VuVHlwZS5MVCwKICAgIFRva2VuVHlwZS5MVF9FUSwKICAgIFRva2VuVHlwZS5MVF9MVCwKICAgIFRva2VuVHlwZS5MVF9MVF9FUSwKICAgIFRva2VuVHlwZS5NSU5VUywKICAgIFRva2VuVHlwZS5NSU5VU19FUSwKICAgIFRva2VuVHlwZS5NSU5VU19NSU5VUywKICAgIFRva2VuVHlwZS5PUEVOX0NVUkxZX0JSQUNLRVQsCiAgICBUb2tlblR5cGUuT1BFTl9QQVJFTiwKICAgIFRva2VuVHlwZS5PUEVOX1NRVUFSRV9CUkFDS0VULAogICAgVG9rZW5UeXBlLlBFUkNFTlQsCiAgICBUb2tlblR5cGUuUEVSQ0VOVF9FUSwKICAgIFRva2VuVHlwZS5QRVJJT0QsCiAgICBUb2tlblR5cGUuUEVSSU9EX1BFUklPRCwKICAgIFRva2VuVHlwZS5QTFVTLAogICAgVG9rZW5UeXBlLlBMVVNfRVEsCiAgICBUb2tlblR5cGUuUExVU19QTFVTLAogICAgVG9rZW5UeXBlLlFVRVNUSU9OLAogICAgVG9rZW5UeXBlLlFVRVNUSU9OX1BFUklPRCwKICAgIFRva2VuVHlwZS5RVUVTVElPTl9RVUVTVElPTiwKICAgIFRva2VuVHlwZS5RVUVTVElPTl9RVUVTVElPTl9FUSwKICAgIFRva2VuVHlwZS5TRU1JQ09MT04sCiAgICBUb2tlblR5cGUuU0xBU0gsCiAgICBUb2tlblR5cGUuU0xBU0hfRVEsCiAgICBUb2tlblR5cGUuU1RBUiwKICAgIFRva2VuVHlwZS5TVEFSX0VRLAogICAgVG9rZW5UeXBlLlNUUklOR19JTlRFUlBPTEFUSU9OX0VYUFJFU1NJT04sCiAgICBUb2tlblR5cGUuU1RSSU5HX0lOVEVSUE9MQVRJT05fSURFTlRJRklFUiwKICAgIFRva2VuVHlwZS5USUxERSwKICAgIFRva2VuVHlwZS5USUxERV9TTEFTSCwKICAgIFRva2VuVHlwZS5USUxERV9TTEFTSF9FUSwKICAgIFRva2VuVHlwZS5CQUNLUElORywKICAgIFRva2VuVHlwZS5CQUNLU0xBU0gsCiAgICBUb2tlblR5cGUuUEVSSU9EX1BFUklPRF9QRVJJT0QsCiAgICBUb2tlblR5cGUuUEVSSU9EX1BFUklPRF9QRVJJT0RfUVVFU1RJT04sCgogICAgLy8gVE9ETyhkYW5ydWJlbCk6IFNob3VsZCB0aGVzZSBiZSBhZGRlZCB0byB0aGUgImFsbCIgbGlzdD8KICAgIC8vVG9rZW5UeXBlLklTLAogICAgLy9Ub2tlblR5cGUuQVMsCgogICAgLy8gVGhlc2UgYXJlIG5vdCB5ZXQgcGFydCBvZiB0aGUgbGFuZ3VhZ2UgYW5kIG5vdCBzdXBwb3J0ZWQgYnkgZmFzdGEKICAgIC8vVG9rZW5UeXBlLkFNUEVSU0FORF9BTVBFUlNBTkRfRVEsCiAgICAvL1Rva2VuVHlwZS5CQVJfQkFSX0VRLAoKICAgIC8vIFN1cHBvcnRlZCBieSBmYXN0YSBidXQgbm90IHBhcnQgb2YgdGhlIGxhbmd1YWdlCiAgICAvL1Rva2VuVHlwZS5CQU5HX0VRX0VRLAogICAgLy9Ub2tlblR5cGUuRVFfRVFfRVEsCgogICAgLy8gVXNlZCBieSBzeW50aGV0aWMgdG9rZW5zIGdlbmVyYXRlZCBkdXJpbmcgcmVjb3ZlcnkKICAgIC8vVG9rZW5UeXBlLkJBRF9JTlBVVCwKICAgIC8vVG9rZW5UeXBlLlJFQ09WRVJZLAogIF07CgogIGZpbmFsIGludCBraW5kOwoKICAvKioKICAgKiBgdHJ1ZWAgaWYgdGhpcyB0b2tlbiB0eXBlIHJlcHJlc2VudHMgYSBtb2RpZmllcgogICAqIHN1Y2ggYXMgYGFic3RyYWN0YCBvciBgY29uc3RgLgogICAqLwogIGZpbmFsIGJvb2wgaXNNb2RpZmllcjsKCiAgLyoqCiAgICogYHRydWVgIGlmIHRoaXMgdG9rZW4gdHlwZSByZXByZXNlbnRzIGFuIG9wZXJhdG9yLgogICAqLwogIGZpbmFsIGJvb2wgaXNPcGVyYXRvcjsKCiAgLyoqCiAgICogYHRydWVgIGlmIHRoaXMgdG9rZW4gdHlwZSByZXByZXNlbnRzIGEga2V5d29yZCBzdGFydGluZyBhIHRvcCBsZXZlbAogICAqIGRlY2xhcmF0aW9uIHN1Y2ggYXMgYGNsYXNzYCwgYGVudW1gLCBgaW1wb3J0YCwgZXRjLgogICAqLwogIGZpbmFsIGJvb2wgaXNUb3BMZXZlbEtleXdvcmQ7CgogIC8qKgogICAqIGB0cnVlYCBpZiB0aGlzIHRva2VuIHR5cGUgcmVwcmVzZW50cyBhbiBvcGVyYXRvcgogICAqIHRoYXQgY2FuIGJlIGRlZmluZWQgYnkgdXNlcnMuCiAgICovCiAgZmluYWwgYm9vbCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcjsKCiAgLyoqCiAgICogVGhlIGxleGVtZSB0aGF0IGRlZmluZXMgdGhpcyB0eXBlIG9mIHRva2VuLAogICAqIG9yIGBudWxsYCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBvc3NpYmxlIGxleGVtZSBmb3IgdGhpcyB0eXBlIG9mIHRva2VuLgogICAqLwogIGZpbmFsIFN0cmluZyBsZXhlbWU7CgogIC8qKgogICAqIFRoZSBuYW1lIG9mIHRoZSB0b2tlbiB0eXBlLgogICAqLwogIGZpbmFsIFN0cmluZyBuYW1lOwoKICAvKioKICAgKiBUaGUgcHJlY2VkZW5jZSBvZiB0aGlzIHR5cGUgb2YgdG9rZW4sCiAgICogb3IgYDBgIGlmIHRoZSB0b2tlbiBkb2VzIG5vdCByZXByZXNlbnQgYW4gb3BlcmF0b3IuCiAgICovCiAgZmluYWwgaW50IHByZWNlZGVuY2U7CgogIC8qKgogICAqIFNlZSBbVG9rZW4uc3RyaW5nVmFsdWVdIGZvciBhbiBleHBsYW5hdGlvbi4KICAgKi8KICBmaW5hbCBTdHJpbmcgc3RyaW5nVmFsdWU7CgogIGNvbnN0IFRva2VuVHlwZSh0aGlzLmxleGVtZSwgdGhpcy5uYW1lLCB0aGlzLnByZWNlZGVuY2UsIHRoaXMua2luZCwKICAgICAge3RoaXMuaXNNb2RpZmllcjogZmFsc2UsCiAgICAgIHRoaXMuaXNPcGVyYXRvcjogZmFsc2UsCiAgICAgIHRoaXMuaXNUb3BMZXZlbEtleXdvcmQ6IGZhbHNlLAogICAgICB0aGlzLmlzVXNlckRlZmluYWJsZU9wZXJhdG9yOiBmYWxzZSwKICAgICAgU3RyaW5nIHN0cmluZ1ZhbHVlOiAndW5zcGVjaWZpZWQnfSkKICAgICAgOiB0aGlzLnN0cmluZ1ZhbHVlID0gc3RyaW5nVmFsdWUgPT0gJ3Vuc3BlY2lmaWVkJyA/IGxleGVtZSA6IHN0cmluZ1ZhbHVlOwoKICAvKioKICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgdHlwZSBvZiB0b2tlbiByZXByZXNlbnRzIGFuIGFkZGl0aXZlIG9wZXJhdG9yLgogICAqLwogIGJvb2wgZ2V0IGlzQWRkaXRpdmVPcGVyYXRvciA9PiBwcmVjZWRlbmNlID09IEFERElUSVZFX1BSRUNFREVOQ0U7CgogIC8qKgogICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyB0eXBlIG9mIHRva2VuIHJlcHJlc2VudHMgYW4gYXNzaWdubWVudCBvcGVyYXRvci4KICAgKi8KICBib29sIGdldCBpc0Fzc2lnbm1lbnRPcGVyYXRvciA9PiBwcmVjZWRlbmNlID09IEFTU0lHTk1FTlRfUFJFQ0VERU5DRTsKCiAgLyoqCiAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHR5cGUgb2YgdG9rZW4gcmVwcmVzZW50cyBhbiBhc3NvY2lhdGl2ZSBvcGVyYXRvci4gQW4KICAgKiBhc3NvY2lhdGl2ZSBvcGVyYXRvciBpcyBhbiBvcGVyYXRvciBmb3Igd2hpY2ggdGhlIGZvbGxvd2luZyBlcXVhbGl0eSBpcwogICAqIHRydWU6IGAoYSAqIGIpICogYyA9PSBhICogKGIgKiBjKWAuIEluIG90aGVyIHdvcmRzLCBpZiB0aGUgcmVzdWx0IG9mCiAgICogYXBwbHlpbmcgdGhlIG9wZXJhdG9yIHRvIG11bHRpcGxlIG9wZXJhbmRzIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgb3JkZXIgaW4KICAgKiB3aGljaCB0aG9zZSBhcHBsaWNhdGlvbnMgb2NjdXIuCiAgICoKICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBjb25zaWRlcnMgdGhlIGxvZ2ljYWwtYW5kIGFuZCBsb2dpY2FsLW9yIG9wZXJhdG9ycyB0byBiZQogICAqIGFzc29jaWF0aXZlLCBldmVuIHRob3VnaCB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGFwcGxpY2F0aW9uIG9mIHRob3NlCiAgICogb3BlcmF0b3JzIGNhbiBoYXZlIGFuIGVmZmVjdCBiZWNhdXNlIGV2YWx1YXRpb24gb2YgdGhlIHJpZ2h0LWhhbmQgb3BlcmFuZAogICAqIGlzIGNvbmRpdGlvbmFsLgogICAqLwogIGJvb2wgZ2V0IGlzQXNzb2NpYXRpdmVPcGVyYXRvciA9PgogICAgICB0aGlzID09IFRva2VuVHlwZS5BTVBFUlNBTkQgfHwKICAgICAgdGhpcyA9PSBUb2tlblR5cGUuQU1QRVJTQU5EX0FNUEVSU0FORCB8fAogICAgICB0aGlzID09IFRva2VuVHlwZS5CQVIgfHwKICAgICAgdGhpcyA9PSBUb2tlblR5cGUuQkFSX0JBUiB8fAogICAgICB0aGlzID09IFRva2VuVHlwZS5DQVJFVCB8fAogICAgICB0aGlzID09IFRva2VuVHlwZS5QTFVTIHx8CiAgICAgIHRoaXMgPT0gVG9rZW5UeXBlLlNUQVI7CgogIC8qKgogICAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGtleXdvcmQgaXMgYSAiYnVpbHQtaW4iIGlkZW50aWZpZXIuCiAgICovCiAgYm9vbCBnZXQgaXNCdWlsdEluID0+IGZhbHNlOwoKICAvKioKICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgdHlwZSBvZiB0b2tlbiByZXByZXNlbnRzIGFuIGVxdWFsaXR5IG9wZXJhdG9yLgogICAqLwogIGJvb2wgZ2V0IGlzRXF1YWxpdHlPcGVyYXRvciA9PgogICAgICB0aGlzID09IFRva2VuVHlwZS5CQU5HX0VRIHx8IHRoaXMgPT0gVG9rZW5UeXBlLkVRX0VROwoKICAvKioKICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgdHlwZSBvZiB0b2tlbiByZXByZXNlbnRzIGFuIGluY3JlbWVudCBvcGVyYXRvci4KICAgKi8KICBib29sIGdldCBpc0luY3JlbWVudE9wZXJhdG9yID0+CiAgICAgIHRoaXMgPT0gVG9rZW5UeXBlLlBMVVNfUExVUyB8fCB0aGlzID09IFRva2VuVHlwZS5NSU5VU19NSU5VUzsKCiAgLyoqCiAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHR5cGUgb2YgdG9rZW4gaXMgYSBrZXl3b3JkLgogICAqLwogIGJvb2wgZ2V0IGlzS2V5d29yZCA9PiBraW5kID09IEtFWVdPUkRfVE9LRU47CgogIC8qKgogICAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGtleXdvcmQgY2FuIGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllcgogICAqIGluIHNvbWUgc2l0dWF0aW9ucy4KICAgKi8KICBib29sIGdldCBpc1BzZXVkbyA9PiBmYWxzZTsKCiAgLyoqCiAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHR5cGUgb2YgdG9rZW4gcmVwcmVzZW50cyBhIG11bHRpcGxpY2F0aXZlIG9wZXJhdG9yLgogICAqLwogIGJvb2wgZ2V0IGlzTXVsdGlwbGljYXRpdmVPcGVyYXRvciA9PiBwcmVjZWRlbmNlID09IE1VTFRJUExJQ0FUSVZFX1BSRUNFREVOQ0U7CgogIC8qKgogICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyB0eXBlIG9mIHRva2VuIHJlcHJlc2VudHMgYSByZWxhdGlvbmFsIG9wZXJhdG9yLgogICAqLwogIGJvb2wgZ2V0IGlzUmVsYXRpb25hbE9wZXJhdG9yID0+CiAgICAgIHRoaXMgPT0gVG9rZW5UeXBlLkxUIHx8CiAgICAgIHRoaXMgPT0gVG9rZW5UeXBlLkxUX0VRIHx8CiAgICAgIHRoaXMgPT0gVG9rZW5UeXBlLkdUIHx8CiAgICAgIHRoaXMgPT0gVG9rZW5UeXBlLkdUX0VROwoKICAvKioKICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgdHlwZSBvZiB0b2tlbiByZXByZXNlbnRzIGEgc2hpZnQgb3BlcmF0b3IuCiAgICovCiAgYm9vbCBnZXQgaXNTaGlmdE9wZXJhdG9yID0+IHByZWNlZGVuY2UgPT0gU0hJRlRfUFJFQ0VERU5DRTsKCiAgLyoqCiAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHR5cGUgb2YgdG9rZW4gcmVwcmVzZW50cyBhIHVuYXJ5IHBvc3RmaXggb3BlcmF0b3IuCiAgICovCiAgYm9vbCBnZXQgaXNVbmFyeVBvc3RmaXhPcGVyYXRvciA9PiBwcmVjZWRlbmNlID09IFBPU1RGSVhfUFJFQ0VERU5DRTsKCiAgLyoqCiAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHR5cGUgb2YgdG9rZW4gcmVwcmVzZW50cyBhIHVuYXJ5IHByZWZpeCBvcGVyYXRvci4KICAgKi8KICBib29sIGdldCBpc1VuYXJ5UHJlZml4T3BlcmF0b3IgPT4KICAgICAgcHJlY2VkZW5jZSA9PSBQUkVGSVhfUFJF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OwoKaW1wb3J0ICdjb21waWxlcl9jb250ZXh0LmRhcnQnIHNob3cgQ29tcGlsZXJDb250ZXh0OwoKLy8vIEFOU0kveHRlcm0gdGVybWNhcCBmb3Igc2V0dGluZyBkZWZhdWx0IGNvbG9ycy4gT3V0cHV0IGZyb20gVW5peAovLy8gY29tbWFuZC1saW5lIHByb2dyYW0gYHRwdXQgb3BgLgpjb25zdCBTdHJpbmcgREVGQVVMVF9DT0xPUiA9ICJceDFiWzM5OzQ5bSI7CgovLy8gQU5TSS94dGVybSB0ZXJtY2FwIGZvciBzZXR0aW5nIGJsYWNrIHRleHQgY29sb3IuIE91dHB1dCBmcm9tIFVuaXgKLy8vIGNvbW1hbmQtbGluZSBwcm9ncmFtIGB0cHV0IHNldGFmIDBgLgpjb25zdCBTdHJpbmcgQkxBQ0tfQ09MT1IgPSAiXHgxYlszMG0iOwoKLy8vIEFOU0kveHRlcm0gdGVybWNhcCBmb3Igc2V0dGluZyByZWQgdGV4dCBjb2xvci4gT3V0cHV0IGZyb20gVW5peAovLy8gY29tbWFuZC1saW5lIHByb2dyYW0gYHRwdXQgc2V0YWYgMWAuCmNvbnN0IFN0cmluZyBSRURfQ09MT1IgPSAiXHgxYlszMW0iOwoKLy8vIEFOU0kveHRlcm0gdGVybWNhcCBmb3Igc2V0dGluZyBncmVlbiB0ZXh0IGNvbG9yLiBPdXRwdXQgZnJvbSBVbml4Ci8vLyBjb21tYW5kLWxpbmUgcHJvZ3JhbSBgdHB1dCBzZXRhZiAyYC4KY29uc3QgU3RyaW5nIEdSRUVOX0NPTE9SID0gIlx4MWJbMzJtIjsKCi8vLyBBTlNJL3h0ZXJtIHRlcm1jYXAgZm9yIHNldHRpbmcgeWVsbG93IHRleHQgY29sb3IuIE91dHB1dCBmcm9tIFVuaXgKLy8vIGNvbW1hbmQtbGluZSBwcm9ncmFtIGB0cHV0IHNldGFmIDNgLgpjb25zdCBTdHJpbmcgWUVMTE9XX0NPTE9SID0gIlx4MWJbMzNtIjsKCi8vLyBBTlNJL3h0ZXJtIHRlcm1jYXAgZm9yIHNldHRpbmcgYmx1ZSB0ZXh0IGNvbG9yLiBPdXRwdXQgZnJvbSBVbml4Ci8vLyBjb21tYW5kLWxpbmUgcHJvZ3JhbSBgdHB1dCBzZXRhZiA0YC4KY29uc3QgU3RyaW5nIEJMVUVfQ09MT1IgPSAiXHgxYlszNG0iOwoKLy8vIEFOU0kveHRlcm0gdGVybWNhcCBmb3Igc2V0dGluZyBtYWdlbnRhIHRleHQgY29sb3IuIE91dHB1dCBmcm9tIFVuaXgKLy8vIGNvbW1hbmQtbGluZSBwcm9ncmFtIGB0cHV0IHNldGFmIDVgLgpjb25zdCBTdHJpbmcgTUFHRU5UQV9DT0xPUiA9ICJceDFiWzM1bSI7CgovLy8gQU5TSS94dGVybSB0ZXJtY2FwIGZvciBzZXR0aW5nIGN5YW4gdGV4dCBjb2xvci4gT3V0cHV0IGZyb20gVW5peAovLy8gY29tbWFuZC1saW5lIHByb2dyYW0gYHRwdXQgc2V0YWYgNmAuCmNvbnN0IFN0cmluZyBDWUFOX0NPTE9SID0gIlx4MWJbMzZtIjsKCi8vLyBBTlNJL3h0ZXJtIHRlcm1jYXAgZm9yIHNldHRpbmcgd2hpdGUgdGV4dCBjb2xvci4gT3V0cHV0IGZyb20gVW5peAovLy8gY29tbWFuZC1saW5lIHByb2dyYW0gYHRwdXQgc2V0YWYgN2AuCmNvbnN0IFN0cmluZyBXSElURV9DT0xPUiA9ICJceDFiWzM3bSI7CgovLy8gQWxsIHRoZSBhYm92ZSBjb2Rlcy4gVGhpcyBpcyB1c2VkIHRvIGNvbXBhcmUgdGhlIGFib3ZlIGNvZGVzIHRvIHRoZQovLy8gdGVybWluYWwncy4gUHJpbnRpbmcgdGhpcyBzdHJpbmcgc2hvdWxkIGhhdmUgdGhlIHNhbWUgZWZmZWN0IGFzIGp1c3QKLy8vIHByaW50aW5nIFtERUZBVUxUX0NPTE9SXS4KY29uc3QgU3RyaW5nIEFMTF9DT0RFUyA9IEJMQUNLX0NPTE9SICsKICAgIFJFRF9DT0xPUiArCiAgICBHUkVFTl9DT0xPUiArCiAgICBZRUxMT1dfQ09MT1IgKwogICAgQkxVRV9DT0xPUiArCiAgICBNQUdFTlRBX0NPTE9SICsKICAgIENZQU5fQ09MT1IgKwogICAgV0hJVEVfQ09MT1IgKwogICAgREVGQVVMVF9DT0xPUjsKCmNvbnN0IFN0cmluZyBURVJNSU5BTF9DQVBBQklMSVRJRVMgPSAiIiIKY29sb3JzCnNldGFmIDAKc2V0YWYgMQpzZXRhZiAyCnNldGFmIDMKc2V0YWYgNApzZXRhZiA1CnNldGFmIDYKc2V0YWYgNwpvcAoiIiI7CgpTdHJpbmcgd3JhcChTdHJpbmcgc3RyaW5nLCBTdHJpbmcgY29sb3IpIHsKICByZXR1cm4gQ29tcGlsZXJDb250ZXh0LmVuYWJsZUNvbG9ycwogICAgICA/ICIke2NvbG9yfSRzdHJpbmcke0RFRkFVTFRfQ09MT1J9IgogICAgICA6IHN0cmluZzsKfQoKU3RyaW5nIGJsYWNrKFN0cmluZyBzdHJpbmcpID0+IHdyYXAoc3RyaW5nLCBCTEFDS19DT0xPUik7ClN0cmluZyByZWQoU3RyaW5nIHN0cmluZykgPT4gd3JhcChzdHJpbmcsIFJFRF9DT0xPUik7ClN0cmluZyBncmVlbihTdHJpbmcgc3RyaW5nKSA9PiB3cmFwKHN0cmluZywgR1JFRU5fQ09MT1IpOwpTdHJpbmcgeWVsbG93KFN0cmluZyBzdHJpbmcpID0+IHdyYXAoc3RyaW5nLCBZRUxMT1dfQ09MT1IpOwpTdHJpbmcgYmx1ZShTdHJpbmcgc3RyaW5nKSA9PiB3cmFwKHN0cmluZywgQkxVRV9DT0xPUik7ClN0cmluZyBtYWdlbnRhKFN0cmluZyBzdHJpbmcpID0+IHdyYXAoc3RyaW5nLCBNQUdFTlRBX0NPTE9SKTsKU3RyaW5nIGN5YW4oU3RyaW5nIHN0cmluZykgPT4gd3JhcChzdHJpbmcsIENZQU5fQ09MT1IpOwpTdHJpbmcgd2hpdGUoU3RyaW5nIHN0cmluZykgPT4gd3JhcChzdHJpbmcsIFdISVRFX0NPTE9SKTsKCi8vLyBSZXR1cm5zIHdoZXRoZXIgW3NpbmtdIHN1cHBvcnRzIEFOU0kgZXNjYXBlcyBvciBgbnVsbGAgaWYgaXQgY291bGQgbm90IGJlCi8vLyBkZXRlcm1pbmVkLgpib29sIF9zdXBwb3J0c0Fuc2lFc2NhcGVzKHNpbmspIHsKICB0cnkgewogICAgLy8gaWdub3JlOiB1bmRlZmluZWRfZ2V0dGVyCiAgICByZXR1cm4gc2luay5zdXBwb3J0c0Fuc2lFc2NhcGVzOwogIH0gb24gTm9TdWNoTWV0aG9kRXJyb3IgewogICAgLy8gSWdub3JlZDogV2UncmUgcnVubmluZyBvbiBhbiBvbGRlciB2ZXJzaW9uIG9mIHRoZSBEYXJ0IFZNIHdoaWNoIGRvZXNuJ3QKICAgIC8vIGltcGxlbWVudCBgc3VwcG9ydHNBbnNpRXNjYXBlc2AuCiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCi8vLyBUcnVlIGlmIHdlIHNob3VsZCBlbmFibGUgY29sb3JzIGluIG91dHB1dC4KLy8vCi8vLyBXZSBlbmFibGUgY29sb3JzIHdoZW4gYm90aCBgc3Rkb3V0YCBhbmQgYHN0ZGVycmAgc3VwcG9ydCBBTlNJIGVzY2FwZXMuCi8vLwovLy8gT24gbm9uLVdpbmRvd3MgcGxhdGZvcm1zLCB0aGlzIGZ1bmN0aW9ucyBjaGVja3MgdGhlIHRlcm1pbmFsIGNhcGFiaWxpdGllcywKLy8vIG9uIFdpbmRvd3Mgd2Ugb25seSBlbmFibGUgY29sb3JzIGlmIHRoZSBWTSBnZXR0ZXJzIGFyZSBwcmVzZW50IGFuZCByZXR1cm5lZAovLy8gYHRydWVgLgovLy8KLy8vIE5vdGU6IGRvIG5vdCBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LCBhcyBpdCBpcyBleHBlbnNpdmUgdG8KLy8vIGNvbXB1dGUuIEluc3RlYWQsIHVzZSBbQ29tcGlsZXJDb250ZXh0LmVuYWJsZUNvbG9yc10uCmJvb2wgY29tcHV0ZUVuYWJsZUNvbG9ycyhDb21waWxlckNvbnRleHQgY29udGV4dCkgewogIC8vIFRPRE8oYWhlKTogUmVtb3ZlIHRoaXMgbWV0aG9kLgoKICBib29sIHN0ZGVyclN1cHBvcnRzQ29sb3JzID0gX3N1cHBvcnRzQW5zaUVzY2FwZXMoc3Rkb3V0KTsKICBib29sIHN0ZG91dFN1cHBvcnRzQ29sb3JzID0gX3N1cHBvcnRzQW5zaUVzY2FwZXMoc3RkZXJyKTsKCiAgaWYgKHN0ZG91dFN1cHBvcnRzQ29sb3JzID09IGZhbHNlKSB7CiAgICBpZiAoY29udGV4dC5vcHRpb25zLnZlcmJvc2UpIHsKICAgICAgcHJpbnQoIk5vdCBlbmFibGluZyBjb2xvcnMsIHN0ZG91dCBkb2VzIG5vdCBzdXBwb3J0IEFOU0kgY29sb3JzLiIpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpZiAoc3RkZXJyU3VwcG9ydHNDb2xvcnMgPT0gZmFsc2UpIHsKICAgIGlmIChjb250ZXh0Lm9wdGlvbnMudmVyYm9zZSkgewogICAgICBwcmludCgiTm90IGVuYWJsaW5nIGNvbG9ycywgc3RkZXJyIGRvZXMgbm90IHN1cHBvcnQgQU5TSSBjb2xvcnMuIik7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBpZiAoUGxhdGZvcm0uaXNXaW5kb3dzKSB7CiAgICBpZiAoc3RkZXJyU3VwcG9ydHNDb2xvcnMgIT0gdHJ1ZSB8fCBzdGRvdXRTdXBwb3J0c0NvbG9ycyAhPSB0cnVlKSB7CiAgICAgIC8vIEluIHRoaXMgY2FzZSwgZWl0aGVyIFtzdGRvdXRdIG9yIFtzdGRlcnJdIGRpZCBub3Qgc3VwcG9ydCB0aGUKICAgICAgLy8gcHJvcGVydHkgYHN1cHBvcnRzQW5zaUVzY2FwZXNgLiBTaW5jZSB3ZSBkbyBub3QgaGF2ZSBhbm90aGVyIHdheQogICAgICAvLyB0byBkZXRlcm1pbmUgc3VwcG9ydCBmb3IgY29sb3JzLCB3ZSBkaXNhYmxlIHRoZW0uCiAgICAgIGlmIChjb250ZXh0Lm9wdGlvbnMudmVyYm9zZSkgewogICAgICAgIHByaW50KCJOb3QgZW5hYmxpbmcgY29sb3JzIGFzIEFOU0kgaXMgbm90IHN1cHBvcnRlZC4iKTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoY29udGV4dC5vcHRpb25zLnZlcmJvc2UpIHsKICAgICAgcHJpbnQoIkVuYWJsaW5nIGNvbG9ycyBhcyBPUyBpcyBXaW5kb3dzLiIpOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvLyBXZSBoYXZlIHRvIGNoZWNrIGlmIHRoZSB0ZXJtaW5hbCBhY3R1YWxseSBzdXBwb3J0cyBjb2xvcnMuIEN1cnJlbnRseSwKICAvLyB0byBhdm9pZCBsaW5raW5nIHRoZSBEYXJ0IFZNIHdpdGggbmN1cnNlcywgQU5TSSBlc2NhcGUgc3VwcG9ydCBpcyByZWR1Y2VkCiAgLy8gdG8gYFBsYXRmb3JtLmVudmlyb25tZW50WydURVJNJ10uY29udGFpbnMoInh0ZXJtIilgLgoKICAvLyBUaGUgYC1TYCBvcHRpb24gb2YgYHRwdXRgIGFsbG93cyB1cyB0byBxdWVyeSBtdWx0aXBsZSBjYXBhYmlsaXRpZXMgYXQKICAvLyBvbmNlLgogIFByb2Nlc3NSZXN1bHQgcmVzdWx0ID0gUHJvY2Vzcy5ydW5TeW5jKAogICAgICAiL2Jpbi9zaCIsIFsiLWMiLCAicHJpbnRmICclcycgJyRURVJNSU5BTF9DQVBBQklMSVRJRVMnIHwgdHB1dCAtUyJdKTsKCiAgaWYgKHJlc3VsdC5leGl0Q29kZSAhPSAwKSB7CiAgICBpZiAoY29udGV4dC5vcHRpb25zLnZlcmJvc2UpIHsKICAgICAgcHJpbnQoIk5vdCBlbmFibGluZyBjb2xvcnMsIHJ1bm5pbmcgdHB1dCBmYWlsZWQuIik7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBMaXN0PFN0cmluZz4gbGluZXMgPSByZXN1bHQuc3Rkb3V0LnNwbGl0KCJcbiIpOwoKICBpZiAobGluZXMubGVuZ3RoICE9IDIpIHsKICAgIGlmIChjb250ZXh0Lm9wdGlvbnMudmVyYm9zZSkgewogICAgICBwcmludCgiTm90IGVuYWJsaW5nIGNvbG9ycywgdW5leHBlY3RlZCBvdXRwdXQgZnJvbSB0cHV0OiAiCiAgICAgICAgICAiJHtqc29uRW5jb2RlKHJlc3VsdC5zdGRvdXQpfS4iKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIFN0cmluZyBudW1iZXJPZkNvbG9ycyA9IGxpbmVzWzBdOwogIGlmICgoaW50LnRyeVBhcnNlKG51bWJlck9mQ29sb3JzKSA/PyAtMSkgPCA4KSB7CiAgICBpZiAoY29udGV4dC5vcHRpb25zLnZlcmJvc2UpIHsKICAgICAgcHJpbnQoIk5vdCBlbmFibGluZyBjb2xvcnMsIGxlc3MgdGhhbiA4IGNvbG9ycyBzdXBwb3J0ZWQ6ICIKICAgICAgICAgICIke2pzb25FbmNvZGUobnVtYmVyT2ZDb2xvcnMpfS4iKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIFN0cmluZyBhbGxDb2RlcyA9IGxpbmVzWzFdLnRyaW0oKTsKICBpZiAoQUxMX0NPREVTICE9IGFsbENvZGVzKSB7CiAgICBpZiAoY29udGV4dC5vcHRpb25zLnZlcmJvc2UpIHsKICAgICAgcHJpbnQoIk5vdCBlbmFibGluZyBjb2xvcnMsIGNvbG9yIGNvZGVzIGRvbid0IG1hdGNoOiAiCiAgICAgICAgICAiJHtqc29uRW5jb2RlKEFMTF9DT0RFUyl9ICE9ICR7anNvbkVuY29kZShhbGxDb2Rlcyl9LiIpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgaWYgKGNvbnRleHQub3B0aW9ucy52ZXJib3NlKSB7CiAgICBwcmludCgiRW5hYmxpbmcgY29sb3JzLiIpOwogIH0KICByZXR1cm4gdHJ1ZTsKfQqAyABOTjwBSx0QAScBSAE1AUQkLAFGKScBRCklAUYpJwFHKSgBRSkmAUgpKQFFKSYBRiknAUhJHicQEhMRFBESEwEpBwgICAgICAgIAwUBKyYqEAIBOjY6PDg+ODoBThAiCCAlG08oEQQCAS8ESwRPUAwEQjo0JAE8PAEnI0oGEgQnI0oGEgQBHEhHSjslQAgUBiMyBhEEAUtPOgFLCypMAR4jOgYSBAEyARsjQSwGEgQBJDIjQi0GEgQBJR8jPUMGEgQBIR8EDwIBJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9jb2xvcnMuZGFydD1zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL3R5cGVfbGFiZWxlci5kYXJ0qyEvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cganNvbjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQm9vbENvbnN0YW50LAogICAgICAgIEJvdHRvbVR5cGUsCiAgICAgICAgQ2xhc3MsCiAgICAgICAgQ29uc3RhbnQsCiAgICAgICAgQ29uc3RhbnRNYXBFbnRyeSwKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEb3VibGVDb25zdGFudCwKICAgICAgICBEeW5hbWljVHlwZSwKICAgICAgICBGaWVsZCwKICAgICAgICBGdW5jdGlvblR5cGUsCiAgICAgICAgSW52YWxpZFR5cGUsCiAgICAgICAgSW5zdGFuY2VDb25zdGFudCwKICAgICAgICBJbnRDb25zdGFudCwKICAgICAgICBJbnRlcmZhY2VUeXBlLAogICAgICAgIExpc3RDb25zdGFudCwKICAgICAgICBNYXBDb25zdGFudCwKICAgICAgICBOdWxsQ29uc3RhbnQsCiAgICAgICAgUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCwKICAgICAgICBQcm9jZWR1cmUsCiAgICAgICAgU2V0Q29uc3RhbnQsCiAgICAgICAgU3RyaW5nQ29uc3RhbnQsCiAgICAgICAgU3ltYm9sQ29uc3RhbnQsCiAgICAgICAgVGVhck9mZkNvbnN0YW50LAogICAgICAgIFR5cGVkZWZUeXBlLAogICAgICAgIFR5cGVMaXRlcmFsQ29uc3RhbnQsCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBVbmV2YWx1YXRlZENvbnN0YW50LAogICAgICAgIFZvaWRUeXBlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC92aXNpdG9yLmRhcnQnIHNob3cgQ29uc3RhbnRWaXNpdG9yLCBEYXJ0VHlwZVZpc2l0b3I7CgppbXBvcnQgJy4uL2JsYWNrbGlzdGVkX2NsYXNzZXMuZGFydCcgc2hvdyBibGFja2xpc3RlZENvcmVDbGFzc2VzOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdyBNZXNzYWdlLCB0ZW1wbGF0ZVR5cGVPcmlnaW4sIHRlbXBsYXRlVHlwZU9yaWdpbldpdGhGaWxlVXJpOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuc3VwcG9ydGVkOwoKLy8vIEEgcHJldHR5LXByaW50ZXIgZm9yIEtlcm5lbCB0eXBlcyBhbmQgY29uc3RhbnRzIHdpdGggdGhlIGFiaWxpdHkgdG8gbGFiZWwKLy8vIHJhdyB0eXBlcyB3aXRoIG51bWVyaWMgbWFya2VycyBpbiBEYXJ0IGNvbW1lbnRzIChlLmcuIGAvKjEqL2ApIHRvCi8vLyBkaXN0aW5ndWlzaCBkaWZmZXJlbnQgdHlwZXMgd2l0aCB0aGUgc2FtZSBuYW1lLiBUaGlzIGlzIHVzZWQgaW4gZGlhZ25vc3RpYwovLy8gbWVzc2FnZXMgdG8gaW5kaWNhdGUgdGhlIG9yaWdpbnMgb2YgdHlwZXMgb2NjdXJyaW5nIGluIHRoZSBtZXNzYWdlLgpjbGFzcyBUeXBlTGFiZWxlciBpbXBsZW1lbnRzIERhcnRUeXBlVmlzaXRvcjx2b2lkPiwgQ29uc3RhbnRWaXNpdG9yPHZvaWQ+IHsKICBMaXN0PExhYmVsZWRDbGFzc05hbWU+IG5hbWVzID0gPExhYmVsZWRDbGFzc05hbWU+W107CiAgTWFwPFN0cmluZywgTGlzdDxMYWJlbGVkQ2xhc3NOYW1lPj4gbmFtZU1hcCA9CiAgICAgIDxTdHJpbmcsIExpc3Q8TGFiZWxlZENsYXNzTmFtZT4+e307CgogIExpc3Q8T2JqZWN0PiByZXN1bHQ7CgogIC8vLyBQcmV0dHktcHJpbnQgYSB0eXBlLgogIC8vLyBXaGVuIGFsbCB0eXBlcyBhbmQgY29uc3RhbnRzIGFwcGVhcmluZyBpbiB0aGUgc2FtZSBtZXNzYWdlIGhhdmUgYmVlbgogIC8vLyBwcmV0dHktcHJpbnRlZCwgdGhlIHJldHVybmVkIGxpc3QgY2FuIGJlIGNvbnZlcnRlZCB0byBpdHMgc3RyaW5nCiAgLy8vIHJlcHJlc2VudGF0aW9uICh3aXRoIGxhYmVscyBvbiBkdXBsaWNhdGVkIG5hbWVzKSBieSB0aGUgYGpvaW4oKWAgbWV0aG9kLgogIExpc3Q8T2JqZWN0PiBsYWJlbFR5cGUoRGFydFR5cGUgdHlwZSkgewogICAgLy8gVE9ETyhhc2tlc2MpOiBSZW1vdmUgbnVsbCBjaGVjayB3aGVuIHdlIGFyZSBjb21wbGV0ZWx5IG51bGwgY2xlYW4gaGVyZS4KICAgIGlmICh0eXBlID09IG51bGwpIHJldHVybiBbIm51bGwtdHlwZSJdOwogICAgcmVzdWx0ID0gW107CiAgICB0eXBlLmFjY2VwdCh0aGlzKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gUHJldHR5LXByaW50IGEgY29uc3RhbnQuCiAgLy8vIFdoZW4gYWxsIHR5cGVzIGFuZCBjb25zdGFudHMgYXBwZWFyaW5nIGluIHRoZSBzYW1lIG1lc3NhZ2UgaGF2ZSBiZWVuCiAgLy8vIHByZXR0eS1wcmludGVkLCB0aGUgcmV0dXJuZWQgbGlzdCBjYW4gYmUgY29udmVydGVkIHRvIGl0cyBzdHJpbmcKICAvLy8gcmVwcmVzZW50YXRpb24gKHdpdGggbGFiZWxzIG9uIGR1cGxpY2F0ZWQgbmFtZXMpIGJ5IHRoZSBgam9pbigpYCBtZXRob2QuCiAgTGlzdDxPYmplY3Q+IGxhYmVsQ29uc3RhbnQoQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIC8vIFRPRE8oYXNrZXNjKTogUmVtb3ZlIG51bGwgY2hlY2sgd2hlbiB3ZSBhcmUgY29tcGxldGVseSBudWxsIGNsZWFuIGhlcmUuCiAgICBpZiAoY29uc3RhbnQgPT0gbnVsbCkgcmV0dXJuIFsibnVsbC1jb25zdGFudCJdOwogICAgcmVzdWx0ID0gW107CiAgICBjb25zdGFudC5hY2NlcHQodGhpcyk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIEdldCBhIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgdGhlIG9yaWdpbnMgb2YgdGhlIHJhdyB0eXBlcyBhcHBlYXJpbmcgaW4KICAvLy8gdHlwZXMgYW5kIGNvbnN0YW50cyB0aGF0IGhhdmUgYmVlbiBwcmV0dHktcHJpbnRlZCB1c2luZyB0aGlzIGxhYmVsZXIuCiAgU3RyaW5nIGdldCBvcmlnaW5NZXNzYWdlcyB7CiAgICBTdHJpbmdCdWZmZXIgbWVzc2FnZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBmb3IgKExhYmVsZWRDbGFzc05hbWUgbmFtZSBpbiBuYW1lcykgewogICAgICBtZXNzYWdlcy53cml0ZShuYW1lLm9yaWdpbk1lc3NhZ2UpOwogICAgfQogICAgcmV0dXJuIG1lc3NhZ2VzLnRvU3RyaW5nKCk7CiAgfQoKICAvLyBXZSBkb24ndCBoYXZlIGFjY2VzcyB0byBjb3JlVHlwZXMgaGVyZSwgc28gd2UgaGF2ZSBvdXIgb3duIE9iamVjdCBjaGVjay4KICBzdGF0aWMgYm9vbCBpc09iamVjdChEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmIHR5cGUuY2xhc3NOb2RlLm5hbWUgPT0gJ09iamVjdCcpIHsKICAgICAgVXJpIGltcG9ydFVyaSA9IHR5cGUuY2xhc3NOb2RlLmVuY2xvc2luZ0xpYnJhcnkuaW1wb3J0VXJpOwogICAgICByZXR1cm4gaW1wb3J0VXJpLnNjaGVtZSA9PSAnZGFydCcgJiYgaW1wb3J0VXJpLnBhdGggPT0gJ2NvcmUnOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgTGFiZWxlZENsYXNzTmFtZSBuYW1lRm9yQ2xhc3MoQ2xhc3MgY2xhc3NOb2RlKSB7CiAgICBMaXN0PExhYmVsZWRDbGFzc05hbWU+IGNsYXNzZXNGb3JOYW1lID0gbmFtZU1hcFtjbGFzc05vZGUubmFtZV07CiAgICBpZiAoY2xhc3Nlc0Zvck5hbWUgPT0gbnVsbCkgewogICAgICAvLyBGaXJzdCBlbmNvdW50ZXJlZCBjbGFzcyB3aXRoIHRoaXMgbmFtZQogICAgICBMYWJlbGVkQ2xhc3NOYW1lIG5hbWUgPSBuZXcgTGFiZWxlZENsYXNzTmFtZShjbGFzc05vZGUsIHRoaXMpOwogICAgICBuYW1lcy5hZGQobmFtZSk7CiAgICAgIG5hbWVNYXBbY2xhc3NOb2RlLm5hbWVdID0gW25hbWVdOwogICAgICByZXR1cm4gbmFtZTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoTGFiZWxlZENsYXNzTmFtZSBjbGFzc0Zvck5hbWUgaW4gY2xhc3Nlc0Zvck5hbWUpIHsKICAgICAgICBpZiAoY2xhc3NGb3JOYW1lLmNsYXNzTm9kZSA9PSBjbGFzc05vZGUpIHsKICAgICAgICAgIC8vIFByZXZpb3VzbHkgZW5jb3VudGVyZWQgY2xhc3MKICAgICAgICAgIHJldHVybiBjbGFzc0Zvck5hbWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIE5ldyBjbGFzcyB3aXRoIG5hbWUgdGhhdCB3YXMgcHJldmlvdXNseSBlbmNvdW50ZXJlZAogICAgICBMYWJlbGVkQ2xhc3NOYW1lIG5hbWUgPSBuZXcgTGFiZWxlZENsYXNzTmFtZShjbGFzc05vZGUsIHRoaXMpOwogICAgICBuYW1lcy5hZGQobmFtZSk7CiAgICAgIGNsYXNzZXNGb3JOYW1lLmFkZChuYW1lKTsKICAgICAgcmV0dXJuIG5hbWU7CiAgICB9CiAgfQoKICB2b2lkIGRlZmF1bHREYXJ0VHlwZShEYXJ0VHlwZSB0eXBlKSB7fQogIHZvaWQgdmlzaXRUeXBlZGVmVHlwZShUeXBlZGVmVHlwZSBub2RlKSB7fQoKICB2b2lkIHZpc2l0SW52YWxpZFR5cGUoSW52YWxpZFR5cGUgbm9kZSkgewogICAgLy8gVE9ETyhhc2tlc2MpOiBUaHJvdyBpbnRlcm5hbCBlcnJvciBpZiBJbnZhbGlkVHlwZSBhcHBlYXJzIGluIGRpYWdub3N0aWNzLgogICAgcmVzdWx0LmFkZCgiaW52YWxpZC10eXBlIik7CiAgfQoKICB2b2lkIHZpc2l0Qm90dG9tVHlwZShCb3R0b21UeXBlIG5vZGUpIHsKICAgIC8vIFRPRE8oYXNrZXNjKTogVGhyb3cgaW50ZXJuYWwgZXJyb3IgaWYgQm90dG9tVHlwZSBhcHBlYXJzIGluIGRpYWdub3N0aWNzLgogICAgcmVzdWx0LmFkZCgiYm90dG9tLXR5cGUiKTsKICB9CgogIHZvaWQgdmlzaXREeW5hbWljVHlwZShEeW5hbWljVHlwZSBub2RlKSB7CiAgICByZXN1bHQuYWRkKCJkeW5hbWljIik7CiAgfQoKICB2b2lkIHZpc2l0Vm9pZFR5cGUoVm9pZFR5cGUgbm9kZSkgewogICAgcmVzdWx0LmFkZCgidm9pZCIpOwogIH0KCiAgdm9pZCB2aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKFR5cGVQYXJhbWV0ZXJUeXBlIG5vZGUpIHsKICAgIHJlc3VsdC5hZGQobm9kZS5wYXJhbWV0ZXIubmFtZSk7CiAgfQoKICB2b2lkIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBub2RlKSB7CiAgICBub2RlLnJldHVyblR5cGUuYWNjZXB0KHRoaXMpOwogICAgcmVzdWx0LmFkZCgiIEZ1bmN0aW9uIik7CiAgICBpZiAobm9kZS50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgIHJlc3VsdC5hZGQoIjwiKTsKICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICAgIGZvciAoVHlwZVBhcmFtZXRlciBwYXJhbSBpbiBub2RlLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgICAgaWYgKCFmaXJzdCkgcmVzdWx0LmFkZCgiLCAiKTsKICAgICAgICByZXN1bHQuYWRkKHBhcmFtLm5hbWUpOwogICAgICAgIGlmIChpc09iamVjdChwYXJhbS5ib3VuZCkgJiYgcGFyYW0uZGVmYXVsdFR5cGUgaXMgRHluYW1pY1R5cGUpIHsKICAgICAgICAgIC8vIEJvdW5kIHdhcyBub3Qgc3BlY2lmaWVkLCBhbmQgdGhlcmVmb3JlIHNob3VsZCBub3QgYmUgcHJpbnRlZC4KICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzdWx0LmFkZCgiIGV4dGVuZHMgIik7CiAgICAgICAgICBwYXJhbS5ib3VuZC5hY2NlcHQodGhpcyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJlc3VsdC5hZGQoIj4iKTsKICAgIH0KICAgIHJlc3VsdC5hZGQoIigiKTsKICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQ7IGkrKykgewogICAgICBpZiAoIWZpcnN0KSByZXN1bHQuYWRkKCIsICIpOwogICAgICBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldLmFjY2VwdCh0aGlzKTsKICAgICAgZmlyc3QgPSBmYWxzZTsKICAgIH0KICAgIGlmIChub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCA+IG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCkgewogICAgICBpZiAobm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50ID4gMCkgcmVzdWx0LmFkZCgiLCAiKTsKICAgICAgcmVzdWx0LmFkZCgiWyIpOwogICAgICBmaXJzdCA9IHRydWU7CiAgICAgIGZvciAoaW50IGkgPSBub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQ7CiAgICAgICAgICBpIDwgbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7CiAgICAgICAgICBpKyspIHsKICAgICAgICBpZiAoIWZpcnN0KSByZXN1bHQuYWRkKCIsICIpOwogICAgICAgIG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnNbaV0uYWNjZXB0KHRoaXMpOwogICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgIH0KICAgICAgcmVzdWx0LmFkZCgiXSIpOwogICAgfQogICAgaWYgKG5vZGUubmFtZWRQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgaWYgKG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgcmVzdWx0LmFkZCgiLCAiKTsKICAgICAgcmVzdWx0LmFkZCgieyIpOwogICAgICBmaXJzdCA9IHRydWU7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZS5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoIWZpcnN0KSByZXN1bHQuYWRkKCIsICIpOwogICAgICAgIG5vZGUubmFtZWRQYXJhbWV0ZXJzW2ldLnR5cGUuYWNjZXB0KHRoaXMpOwogICAgICAgIHJlc3VsdC5hZGQoIiAke25vZGUubmFtZWRQYXJhbWV0ZXJzW2ldLm5hbWV9Iik7CiAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgfQogICAgICByZXN1bHQuYWRkKCJ9Iik7CiAgICB9CiAgICByZXN1bHQuYWRkKCIpIik7CiAgfQoKICB2b2lkIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIG5vZGUpIHsKICAgIHJlc3VsdC5hZGQobmFtZUZvckNsYXNzKG5vZGUuY2xhc3NOb2RlKSk7CiAgICBpZiAobm9kZS50eXBlQXJndW1lbnRzLmlzTm90RW1wdHkpIHsKICAgICAgcmVzdWx0LmFkZCgiPCIpOwogICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgICAgZm9yIChEYXJ0VHlwZSB0eXBlQXJnIGluIG5vZGUudHlwZUFyZ3VtZW50cykgewogICAgICAgIGlmICghZmlyc3QpIHJlc3VsdC5hZGQoIiwgIik7CiAgICAgICAgdHlwZUFyZy5hY2NlcHQodGhpcyk7CiAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgfQogICAgICByZXN1bHQuYWRkKCI+Iik7CiAgICB9CiAgfQoKICB2b2lkIGRlZmF1bHRDb25zdGFudChDb25zdGFudCBub2RlKSB7fQoKICB2b2lkIHZpc2l0TnVsbENvbnN0YW50KE51bGxDb25zdGFudCBub2RlKSB7CiAgICByZXN1bHQuYWRkKG5vZGUpOwogIH0KCiAgdm9pZCB2aXNpdEJvb2xDb25zdGFudChCb29sQ29uc3RhbnQgbm9kZSkgewogICAgcmVzdWx0LmFkZChub2RlKTsKICB9CgogIHZvaWQgdmlzaXRJbnRDb25zdGFudChJbnRDb25zdGFudCBub2RlKSB7CiAgICByZXN1bHQuYWRkKG5vZGUpOwogIH0KCiAgdm9pZCB2aXNpdERvdWJsZUNvbnN0YW50KERvdWJsZUNvbnN0YW50IG5vZGUpIHsKICAgIHJlc3VsdC5hZGQobm9kZSk7CiAgfQoKICB2b2lkIHZpc2l0U3ltYm9sQ29uc3RhbnQoU3ltYm9sQ29uc3RhbnQgbm9kZSkgewogICAgcmVzdWx0LmFkZChub2RlKTsKICB9CgogIHZvaWQgdmlzaXRTdHJpbmdDb25zdGFudChTdHJpbmdDb25zdGFudCBub2RlKSB7CiAgICByZXN1bHQuYWRkKGpzb24uZW5jb2RlKG5vZGUudmFsdWUpKTsKICB9CgogIHZvaWQgdmlzaXRJbnN0YW5jZUNvbnN0YW50KEluc3RhbmNlQ29uc3RhbnQgbm9kZSkgewogICAgbmV3IEludGVyZmFjZVR5cGUobm9kZS5jbGFzc05vZGUsIG5vZGUudHlwZUFyZ3VtZW50cykuYWNjZXB0KHRoaXMpOwogICAgcmVzdWx0LmFkZCgiIHsiKTsKICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgZm9yIChGaWVsZCBmaWVsZCBpbiBub2RlLmNsYXNzTm9kZS5maWVsZHMpIHsKICAgICAgaWYgKGZpZWxkLmlzU3RhdGljKSBjb250aW51ZTsKICAgICAgaWYgKCFmaXJzdCkgcmVzdWx0LmFkZCgiLCAiKTsKICAgICAgcmVzdWx0LmFkZCgiJHtmaWVsZC5uYW1lfTogIik7CiAgICAgIG5vZGUuZmllbGRWYWx1ZXNbZmllbGQucmVmZXJlbmNlXS5hY2NlcHQodGhpcyk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICB9CiAgICByZXN1bHQuYWRkKCJ9Iik7CiAgfQoKICB2b2lkIHZpc2l0TGlzdENvbnN0YW50KExpc3RDb25zdGFudCBub2RlKSB7CiAgICByZXN1bHQuYWRkKCI8Iik7CiAgICBub2RlLnR5cGVBcmd1bWVudC5hY2NlcHQodGhpcyk7CiAgICByZXN1bHQuYWRkKCI+WyIpOwogICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICBmb3IgKENvbnN0YW50IGNvbnN0YW50IGluIG5vZGUuZW50cmllcykgewogICAgICBpZiAoIWZpcnN0KSByZXN1bHQuYWRkKCIsICIpOwogICAgICBjb25zdGFudC5hY2NlcHQodGhpcyk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICB9CiAgICByZXN1bHQuYWRkKCJdIik7CiAgfQoKICB2b2lkIHZpc2l0U2V0Q29uc3RhbnQoU2V0Q29uc3RhbnQgbm9kZSkgewogICAgcmVzdWx0LmFkZCgiPCIpOwogICAgbm9kZS50eXBlQXJndW1lbnQuYWNjZXB0KHRoaXMpOwogICAgcmVzdWx0LmFkZCgiPnsiKTsKICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgZm9yIChDb25zdGFudCBjb25zdGFudCBpbiBub2RlLmVudHJpZXMpIHsKICAgICAgaWYgKCFmaXJzdCkgcmVzdWx0LmFkZCgiLCAiKTsKICAgICAgY29uc3RhbnQuYWNjZXB0KHRoaXMpOwogICAgICBmaXJzdCA9IGZhbHNlOwogICAgfQogICAgcmVzdWx0LmFkZCgifSIpOwogIH0KCiAgdm9pZCB2aXNpdE1hcENvbnN0YW50KE1hcENvbnN0YW50IG5vZGUpIHsKICAgIHJlc3VsdC5hZGQoIjwiKTsKICAgIG5vZGUua2V5VHlwZS5hY2NlcHQodGhpcyk7CiAgICByZXN1bHQuYWRkKCIsICIpOwogICAgbm9kZS52YWx1ZVR5cGUuYWNjZXB0KHRoaXMpOwogICAgcmVzdWx0LmFkZCgiPnsiKTsKICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgZm9yIChDb25zdGFudE1hcEVudHJ5IGVudHJ5IGluIG5vZGUuZW50cmllcykgewogICAgICBpZiAoIWZpcnN0KSByZXN1bHQuYWRkKCIsICIpOwogICAgICBlbnRyeS5rZXkuYWNjZXB0KHRoaXMpOwogICAgICByZXN1bHQuYWRkKCI6ICIpOwogICAgICBlbnRyeS52YWx1ZS5hY2NlcHQodGhpcyk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICB9CiAgICByZXN1bHQuYWRkKCJ9Iik7CiAgfQoKICB2b2lkIHZpc2l0VGVhck9mZkNvbnN0YW50KFRlYXJPZmZDb25zdGFudCBub2RlKSB7CiAgICBQcm9jZWR1cmUgcHJvY2VkdXJlID0gbm9kZS5wcm9jZWR1cmU7CiAgICBDbGFzcyBjbGFzc05vZGUgPSBwcm9jZWR1cmUuZW5jbG9zaW5nQ2xhc3M7CiAgICBpZiAoY2xhc3NOb2RlICE9IG51bGwpIHsKICAgICAgcmVzdWx0LmFkZChuYW1lRm9yQ2xhc3MoY2xhc3NOb2RlKSk7CiAgICAgIHJlc3VsdC5hZGQoIi4iKTsKICAgIH0KICAgIHJlc3VsdC5hZGQocHJvY2VkdXJlLm5hbWUubmFtZSk7CiAgfQoKICB2b2lkIHZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudChQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50IG5vZGUpIHsKICAgIG5vZGUudGVhck9mZkNvbnN0YW50LmFjY2VwdCh0aGlzKTsKICAgIGlmIChub2RlLnR5cGVzLmlzTm90RW1wdHkpIHsKICAgICAgcmVzdWx0LmFkZCgiPCIpOwogICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgICAgZm9yIChEYXJ0VHlwZSB0eXBlQXJnIGluIG5vZGUudHlwZXMpIHsKICAgICAgICBpZiAoIWZpcnN0KSByZXN1bHQuYWRkKCIsICIpOwogICAgICAgIHR5cGVBcmcuYWNjZXB0KHRoaXMpOwogICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgIH0KICAgICAgcmVzdWx0LmFkZCgiPiIpOwogICAgfQogIH0KCiAgdm9pZCB2aXNpdFR5cGVMaXRlcmFsQ29uc3RhbnQoVHlwZUxpdGVyYWxDb25zdGFudCBub2RlKSB7CiAgICBub2RlLnR5cGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgdm9pZCB2aXNpdFVuZXZhbHVhdGVkQ29uc3RhbnQoVW5ldmFsdWF0ZWRDb25zdGFudCBub2RlKSB7CiAgICB1bnN1cHBvcnRlZCgncHJpbnRpbmcgdW5ldmFsdWF0ZWQgY29uc3RhbnRzJywgLTEsIG51bGwpOwogIH0KfQoKY2xhc3MgTGFiZWxlZENsYXNzTmFtZSB7CiAgQ2xhc3MgY2xhc3NOb2RlOwogIFR5cGVMYWJlbGVyIHR5cGVMYWJlbGVyOwoKICBMYWJlbGVkQ2xhc3NOYW1lKHRoaXMuY2xhc3NOb2RlLCB0aGlzLnR5cGVMYWJlbGVyKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nIG5hbWUgPSBjbGFzc05vZGUubmFtZTsKICAgIExpc3Q8TGFiZWxlZENsYXNzTmFtZT4gY2xhc3Nlc0Zvck5hbWUgPSB0eXBlTGFiZWxlci5uYW1lTWFwW25hbWVdOwogICAgaWYgKGNsYXNzZXNGb3JOYW1lLmxlbmd0aCA9PSAxKSB7CiAgICAgIHJldHVybiBuYW1lOwogICAgfQogICAgcmV0dXJuICIkbmFtZS8qJHtjbGFzc2VzRm9yTmFtZS5pbmRleE9mKHRoaXMpICsgMX0qLyI7CiAgfQoKICBTdHJpbmcgZ2V0IG9yaWdpbk1lc3NhZ2UgewogICAgVXJpIGltcG9ydFVyaSA9IGNsYXNzTm9kZS5lbmNsb3NpbmdMaWJyYXJ5LmltcG9ydFVyaTsKICAgIGlmIChpbXBvcnRVcmkuc2NoZW1lID09ICdkYXJ0JyAmJiBpbXBvcnRVcmkucGF0aCA9PSAnY29yZScpIHsKICAgICAgU3RyaW5nIG5hbWUgPSBjbGFzc05vZGUubmFtZTsKICAgICAgaWYgKGJsYWNrbGlzdGVkQ29yZUNsYXNzZXMuY29udGFpbnMobmFtZSkpIHsKICAgICAgICAvLyBCbGFja2xpc3RlZCBjb3JlIGNsYXNzLiBPbmx5IHByaW50IGlmIGFtYmlndW91cy4KICAgICAgICBMaXN0PExhYmVsZWRDbGFzc05hbWU+IGNsYXNzZXNGb3JOYW1lID0gdHlwZUxhYmVsZXIubmFtZU1hcFtuYW1lXTsKICAgICAgICBpZiAoY2xhc3Nlc0Zvck5hbWUubGVuZ3RoID09IDEpIHsKICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIFVyaSBmaWxlVXJpID0gY2xhc3NOb2RlLmVuY2xvc2luZ0xpYnJhcnkuZmlsZVVyaTsKICAgIE1lc3NhZ2UgbWVzc2FnZSA9IChpbXBvcnRVcmkgPT0gZmlsZVVyaSB8fCBpbXBvcnRVcmkuc2NoZW1lID09ICdkYXJ0JykKICAgICAgICA/IHRlbXBsYXRlVHlwZU9yaWdpbi53aXRoQXJndW1lbnRzKHRvU3RyaW5nKCksIGltcG9ydFVyaSkKICAgICAgICA6IHRlbXBsYXRlVHlwZU9yaWdpbldpdGhGaWxlVXJpLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgIHRvU3RyaW5nKCksIGltcG9ydFVyaSwgZmlsZVVyaSk7CiAgICByZXR1cm4gIlxuIC0gIiArIG1lc3NhZ2UubWVzc2FnZTsKICB9Cn0KgXEATk48ASEBIQkWFA8SGhIYFQ8WFRoVFxYVFiYTFRgYGRUdFxsdEgFMAUIBHUUBLAFORk9ITDcwKgEXARtLR08qTywRFxMEAR9LR08yTzQRGxMEAU1MHjArKgYgBAFOKERBRQYSBAEzRSIwRRcoEw0+MyofCgg9RRcgEwYEASktASxRIAQBKlAfBAEsGwQBJhgEATglBAEuIh0qFxk5JiBJSxEjJAoIFwYVFzwkMRUGSj0XFDAwESYzFwgXBitCFxQ+JjM4FwgXBhUEATAuKRcZNSYeFwgXBgQBKQEuFgQBLhYEASwWBAEyFgQBMhYEATIpBAE2SBYXMSQkJTYVBhUEAS4VJBYXLiQdFQYVBAEsFSQWFy4kHRUGFQQBLBUfFiEWFzMkHhggFQYVBAE0KjAdKxcGJQQBTichFxktJh4XCBcGBAE8HAQBPD0EAgEZExsBNgEWIkcmEwY7BAEdOkIkMzxLKhUKCAY2S0I3LSYEAgE0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC90eXBlX2xhYmVsZXIuZGFydC9zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvY3Jhc2guZGFydI3sLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuY3Jhc2g7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnIHNob3cgRnV0dXJlOwoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cganNvbkVuY29kZTsKCmltcG9ydCAnZGFydDppbycKICAgIHNob3cgQ29udGVudFR5cGUsIEh0dHBDbGllbnQsIEh0dHBDbGllbnRSZXF1ZXN0LCBTb2NrZXRFeGNlcHRpb24sIHN0ZGVycjsKCmltcG9ydCAncHJvYmxlbXMuZGFydCcgc2hvdyBEZWJ1Z0Fib3J0OwoKY29uc3QgU3RyaW5nIGRlZmF1bHRTZXJ2ZXJBZGRyZXNzID0gImh0dHA6Ly8xMjcuMC4wLjE6NTk0MTAvIjsKCi8vLyBUcmFja3MgaWYgdGhlcmUgaGFzIGJlZW4gYSBjcmFzaCByZXBvcnRlZCB0aHJvdWdoIFtyZXBvcnRDcmFzaF0uIFNob3VsZCBiZQovLy8gcmVzZXQgYmV0d2VlbiBlYWNoIGNvbXBpbGF0aW9uIGJ5IGNhbGxpbmcgW3Jlc2V0Q3Jhc2hSZXBvcnRpbmddLgpib29sIGhhc0NyYXNoZWQgPSBmYWxzZTsKCi8vLyBUcmFja3MgdGhlIGZpcnN0IHNvdXJjZSBVUkkgdGhhdCBoYXMgYmVlbiByZWFkIGFuZCBpcyB1c2VkIGFzIGEgZmFsbC1iYWNrCi8vLyBmb3IgW3JlcG9ydENyYXNoXS4gU2hvdWxkIGJlIHJlc2V0IGJldHdlZW4gZWFjaCBjb21waWxhdGlvbiBieSBjYWxsaW5nCi8vLyBbcmVzZXRDcmFzaFJlcG9ydGluZ10uClVyaSBmaXJzdFNvdXJjZVVyaTsKCmNsYXNzIENyYXNoIHsKICBmaW5hbCBVcmkgdXJpOwoKICBmaW5hbCBpbnQgY2hhck9mZnNldDsKCiAgZmluYWwgT2JqZWN0IGVycm9yOwoKICBmaW5hbCBTdGFja1RyYWNlIHRyYWNlOwoKICBDcmFzaCh0aGlzLnVyaSwgdGhpcy5jaGFyT2Zmc2V0LCB0aGlzLmVycm9yLCB0aGlzLnRyYWNlKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICIiIgpDcmFzaCB3aGVuIGNvbXBpbGluZyAkdXJpLAphdCBjaGFyYWN0ZXIgb2Zmc2V0ICRjaGFyT2Zmc2V0OgokZXJyb3Ike3RyYWNlID09IG51bGwgPyAnJyA6ICdcbiR0cmFjZSd9CiIiIjsKICB9Cn0KCnZvaWQgcmVzZXRDcmFzaFJlcG9ydGluZygpIHsKICBmaXJzdFNvdXJjZVVyaSA9IG51bGw7CiAgaGFzQ3Jhc2hlZCA9IGZhbHNlOwp9CgpGdXR1cmU8VD4gcmVwb3J0Q3Jhc2g8VD4oZXJyb3IsIFN0YWNrVHJhY2UgdHJhY2UsCiAgICBbVXJpIHVyaSwgaW50IGNoYXJPZmZzZXRdKSBhc3luYyB7CiAgbm90ZShTdHJpbmcgbm90ZSkgYXN5bmMgewogICAgc3RkZXJyLndyaXRlKG5vdGUpOwogICAgYXdhaXQgc3RkZXJyLmZsdXNoKCk7CiAgfQoKICBpZiAoaGFzQ3Jhc2hlZCkgcmV0dXJuIG5ldyBGdXR1cmU8VD4uZXJyb3IoZXJyb3IsIHRyYWNlKTsKICBpZiAoZXJyb3IgaXMgQ3Jhc2gpIHsKICAgIHRyYWNlID0gZXJyb3IudHJhY2UgPz8gdHJhY2U7CiAgICB1cmkgPSBlcnJvci51cmkgPz8gdXJpOwogICAgY2hhck9mZnNldCA9IGVycm9yLmNoYXJPZmZzZXQgPz8gY2hhck9mZnNldDsKICAgIGVycm9yID0gZXJyb3IuZXJyb3I7CiAgfQogIHVyaSA/Pz0gZmlyc3RTb3VyY2VVcmk7CiAgaGFzQ3Jhc2hlZCA9IHRydWU7CiAgTWFwPFN0cmluZywgZHluYW1pYz4gZGF0YSA9IDxTdHJpbmcsIGR5bmFtaWM+e307CiAgZGF0YVsidHlwZSJdID0gImNyYXNoIjsKICBkYXRhWyJjbGllbnQiXSA9ICJwYWNrYWdlOmZhc3RhIjsKICBpZiAodXJpICE9IG51bGwpIGRhdGFbInVyaSJdID0gIiR1cmkiOwogIGlmIChjaGFyT2Zmc2V0ICE9IG51bGwpIGRhdGFbIm9mZnNldCJdID0gY2hhck9mZnNldDsKICBkYXRhWyJlcnJvciJdID0gc2FmZVRvU3RyaW5nKGVycm9yKTsKICBkYXRhWyJ0cmFjZSJdID0gIiR0cmFjZSI7CiAgU3RyaW5nIGpzb24gPSBqc29uRW5jb2RlKGRhdGEpOwogIEh0dHBDbGllbnQgY2xpZW50ID0gbmV3IEh0dHBDbGllbnQoKTsKICB0cnkgewogICAgVXJpIHNlcnZlclVyaSA9IFVyaS5wYXJzZShkZWZhdWx0U2VydmVyQWRkcmVzcyk7CiAgICBIdHRwQ2xpZW50UmVxdWVzdCByZXF1ZXN0OwogICAgdHJ5IHsKICAgICAgcmVxdWVzdCA9IGF3YWl0IGNsaWVudC5wb3N0VXJsKHNlcnZlclVyaSk7CiAgICB9IG9uIFNvY2tldEV4Y2VwdGlvbiB7CiAgICAgIC8vIEFzc3VtZSB0aGUgY3Jhc2ggbG9nZ2VyIGlzbid0IHJ1bm5pbmcuCiAgICAgIGNsaWVudC5jbG9zZShmb3JjZTogdHJ1ZSk7CiAgICAgIHJldHVybiBuZXcgRnV0dXJlPFQ+LmVycm9yKAogICAgICAgICAgbmV3IENyYXNoKHVyaSwgY2hhck9mZnNldCwgZXJyb3IsIHRyYWNlKSwgdHJhY2UpOwogICAgfQogICAgaWYgKHJlcXVlc3QgIT0gbnVsbCkgewogICAgICBhd2FpdCBub3RlKCJcblNlbmRpbmcgY3Jhc2ggcmVwb3J0IGRhdGEiKTsKICAgICAgcmVxdWVzdC5wZXJzaXN0ZW50Q29ubmVjdGlvbiA9IGZhbHNlOwogICAgICByZXF1ZXN0LmJ1ZmZlck91dHB1dCA9IGZhbHNlOwogICAgICBTdHJpbmcgaG9zdCA9IHJlcXVlc3Q/LmNvbm5lY3Rpb25JbmZvPy5yZW1vdGVBZGRyZXNzPy5ob3N0OwogICAgICBpbnQgcG9ydCA9IHJlcXVlc3Q/LmNvbm5lY3Rpb25JbmZvPy5yZW1vdGVQb3J0OwogICAgICBhd2FpdCBub3RlKCIgdG8gJGhvc3Q6JHBvcnQiKTsKICAgICAgYXdhaXQgcmVxdWVzdAogICAgICAgIC4uaGVhZGVycy5jb250ZW50VHlwZSA9IENvbnRlbnRUeXBlLmpzb24KICAgICAgICAuLndyaXRlKGpzb24pOwogICAgICBhd2FpdCByZXF1ZXN0LmNsb3NlKCk7CiAgICAgIGF3YWl0IG5vdGUoIi4iKTsKICAgIH0KICB9IGNhdGNoIChlLCBzKSB7CiAgICBhd2FpdCBub3RlKCJcbiR7c2FmZVRvU3RyaW5nKGUpfVxuJHNcbiIpOwogICAgYXdhaXQgbm90ZSgiXG5cblxuRkU6OkVSUk9SOjokanNvblxuXG5cbiIpOwogIH0KICBjbGllbnQuY2xvc2UoZm9yY2U6IHRydWUpOwogIGF3YWl0IG5vdGUoIlxuIik7CiAgcmV0dXJuIG5ldyBGdXR1cmU8VD4uZXJyb3IoZXJyb3IsIHRyYWNlKTsKfQoKU3RyaW5nIHNhZmVUb1N0cmluZyhPYmplY3Qgb2JqZWN0KSB7CiAgdHJ5IHsKICAgIHJldHVybiAiJG9iamVjdCI7CiAgfSBjYXRjaCAoZSkgewogICAgcmV0dXJuICJFcnJvciB3aGVuIGNvbnZlcnRpbmcgJHtvYmplY3QucnVudGltZVR5cGV9IHRvIHN0cmluZy4iOwogIH0KfQoKRnV0dXJlPFQ+IHdpdGhDcmFzaFJlcG9ydGluZzxUPigKICAgIEZ1dHVyZTxUPiBGdW5jdGlvbigpIGFjdGlvbiwgVXJpIEZ1bmN0aW9uKCkgY3VycmVudFVyaSkgYXN5bmMgewogIHJlc2V0Q3Jhc2hSZXBvcnRpbmcoKTsKICB0cnkgewogICAgcmV0dXJuIGF3YWl0IGFjdGlvbigpOwogIH0gb24gQ3Jhc2ggewogICAgcmV0aHJvdzsKICB9IG9uIERlYnVnQWJvcnQgewogICAgcmV0aHJvdzsKICB9IGNhdGNoIChlLCBzKSB7CiAgICByZXR1cm4gcmVwb3J0Q3Jhc2goZSwgcywgY3VycmVudFVyaSgpKTsKICB9Cn0KgIQATk48ARUBIQEnARFOASgBPwFPRRkBTksbFAEOEQEYARYBGgE8ARYPGyEpBQQCAR0ZFgIBMiccGBoEATwYIhwxGQQaFTMaJCk3JxwiKAg1HwoxGzAhIjwGGzEsJEI2JRQxFx0XBhMuMAQdFCwCASUIFhBFBAIBIUQZCBsPDRQNEywEAgEmcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2NyYXNoLmRhcnQ6c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2RpbGwvZGlsbF90YXJnZXQuZGFydIejLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuZGlsbF90YXJnZXQ7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnIHNob3cgRnV0dXJlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBMaWJyYXJ5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90YXJnZXQvdGFyZ2V0cy5kYXJ0JyBzaG93IFRhcmdldDsKCmltcG9ydCAnLi4va2VybmVsL2tlcm5lbF9idWlsZGVyLmRhcnQnIHNob3cgQ2xhc3NCdWlsZGVyOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuc3VwcG9ydGVkOwoKaW1wb3J0ICcuLi90YXJnZXRfaW1wbGVtZW50YXRpb24uZGFydCcgc2hvdyBUYXJnZXRJbXBsZW1lbnRhdGlvbjsKCmltcG9ydCAnLi4vdGlja2VyLmRhcnQnIHNob3cgVGlja2VyOwoKaW1wb3J0ICcuLi91cmlfdHJhbnNsYXRvci5kYXJ0JyBzaG93IFVyaVRyYW5zbGF0b3I7CgppbXBvcnQgJ2RpbGxfbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgRGlsbExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICdkaWxsX2xvYWRlci5kYXJ0JyBzaG93IERpbGxMb2FkZXI7CgpjbGFzcyBEaWxsVGFyZ2V0IGV4dGVuZHMgVGFyZ2V0SW1wbGVtZW50YXRpb24gewogIGZpbmFsIE1hcDxVcmksIERpbGxMaWJyYXJ5QnVpbGRlcj4gbGlicmFyeUJ1aWxkZXJzID0KICAgICAgPFVyaSwgRGlsbExpYnJhcnlCdWlsZGVyPnt9OwoKICBib29sIGlzTG9hZGVkID0gZmFsc2U7CgogIERpbGxMb2FkZXIgbG9hZGVyOwoKICBEaWxsVGFyZ2V0KFRpY2tlciB0aWNrZXIsIFVyaVRyYW5zbGF0b3IgdXJpVHJhbnNsYXRvciwgVGFyZ2V0IGJhY2tlbmRUYXJnZXQpCiAgICAgIDogc3VwZXIodGlja2VyLCB1cmlUcmFuc2xhdG9yLCBiYWNrZW5kVGFyZ2V0KSB7CiAgICBsb2FkZXIgPSBuZXcgRGlsbExvYWRlcih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWRkU291cmNlSW5mb3JtYXRpb24oCiAgICAgIFVyaSBpbXBvcnRVcmksIFVyaSBmaWxlVXJpLCBMaXN0PGludD4gbGluZVN0YXJ0cywgTGlzdDxpbnQ+IHNvdXJjZUNvZGUpIHsKICAgIHVuc3VwcG9ydGVkKCJhZGRTb3VyY2VJbmZvcm1hdGlvbiIsIC0xLCBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxOdWxsPiBidWlsZENvbXBvbmVudCgpIHsKICAgIHJldHVybiBuZXcgRnV0dXJlPE51bGw+LnN5bmMoKCkgPT4gdW5zdXBwb3J0ZWQoImJ1aWxkQ29tcG9uZW50IiwgLTEsIG51bGwpKTsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxOdWxsPiBidWlsZE91dGxpbmVzKCkgYXN5bmMgewogICAgaWYgKGxvYWRlci5saWJyYXJpZXMuaXNOb3RFbXB0eSkgewogICAgICBhd2FpdCBsb2FkZXIuYnVpbGRPdXRsaW5lcygpOwogICAgICBsb2FkZXIuZmluYWxpemVFeHBvcnRzKCk7CiAgICB9CiAgICBpc0xvYWRlZCA9IHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBEaWxsTGlicmFyeUJ1aWxkZXIgY3JlYXRlTGlicmFyeUJ1aWxkZXIoVXJpIHVyaSwgVXJpIGZpbGVVcmksIG9yaWdpbikgewogICAgYXNzZXJ0KG9yaWdpbiA9PSBudWxsKTsKICAgIHJldHVybiBsaWJyYXJ5QnVpbGRlcnMucmVtb3ZlKHVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJyZWFrQ3ljbGUoQ2xhc3NCdWlsZGVyIGNscykge30KCiAgdm9pZCBhZGRMaWJyYXJ5KExpYnJhcnkgbGlicmFyeSkgewogICAgbGlicmFyeUJ1aWxkZXJzW2xpYnJhcnkuaW1wb3J0VXJpXSA9CiAgICAgICAgbmV3IERpbGxMaWJyYXJ5QnVpbGRlcihsaWJyYXJ5LCBsb2FkZXIpOwogIH0KfQpLAE5OPAEbASEBLwE5AToBLAFCASUBNAE8ASsBMDcjARkBFQFPNiMEAQwdUDMEAQwiUQQBDCcnJCAGFQQBDEocKAQBDCcBJSkxBAIBMXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9kaWxsL2RpbGxfdGFyZ2V0LmRhcnQ+c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfdGFyZ2V0LmRhcnTAAHzrLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEua2VybmVsX3RhcmdldDsKCmltcG9ydCAnZGFydDphc3luYycgc2hvdyBGdXR1cmU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIEFyZ3VtZW50cywKICAgICAgICBDYW5vbmljYWxOYW1lLAogICAgICAgIENsYXNzLAogICAgICAgIENvbXBvbmVudCwKICAgICAgICBDb25zdHJ1Y3RvciwKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBFbXB0eVN0YXRlbWVudCwKICAgICAgICBFeHByZXNzaW9uLAogICAgICAgIEZpZWxkLAogICAgICAgIEZpZWxkSW5pdGlhbGl6ZXIsCiAgICAgICAgRnVuY3Rpb25Ob2RlLAogICAgICAgIEluaXRpYWxpemVyLAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgSW52YWxpZEluaXRpYWxpemVyLAogICAgICAgIExpYnJhcnksCiAgICAgICAgTmFtZSwKICAgICAgICBOYW1lZEV4cHJlc3Npb24sCiAgICAgICAgTnVsbExpdGVyYWwsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIsCiAgICAgICAgU291cmNlLAogICAgICAgIFN1cGVySW5pdGlhbGl6ZXIsCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uLAogICAgICAgIFZhcmlhYmxlR2V0OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbG9uZS5kYXJ0JyBzaG93IENsb25lVmlzaXRvcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQnIHNob3cgc3Vic3RpdHV0ZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdGFyZ2V0L3RhcmdldHMuZGFydCcgc2hvdyBEaWFnbm9zdGljUmVwb3J0ZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydCcgc2hvdyBUeXBlRW52aXJvbm1lbnQ7CgppbXBvcnQgJy4uLy4uL2FwaV9wcm90b3R5cGUvZmlsZV9zeXN0ZW0uZGFydCcgc2hvdyBGaWxlU3lzdGVtOwoKaW1wb3J0ICcuLi9jb21waWxlcl9jb250ZXh0LmRhcnQnIHNob3cgQ29tcGlsZXJDb250ZXh0OwoKaW1wb3J0ICcuLi9jcmFzaC5kYXJ0JyBzaG93IHdpdGhDcmFzaFJlcG9ydGluZzsKCmltcG9ydCAnLi4vZGlsbC9kaWxsX3RhcmdldC5kYXJ0JyBzaG93IERpbGxUYXJnZXQ7CgppbXBvcnQgJy4uL2RpbGwvZGlsbF9tZW1iZXJfYnVpbGRlci5kYXJ0JyBzaG93IERpbGxNZW1iZXJCdWlsZGVyOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JyBzaG93IE1lc3NhZ2UsIExvY2F0ZWRNZXNzYWdlOwoKaW1wb3J0ICcuLi9sb2FkZXIuZGFydCcgc2hvdyBMb2FkZXI7CgppbXBvcnQgJy4uL21lc3NhZ2VzLmRhcnQnCiAgICBzaG93CiAgICAgICAgRm9ybWF0dGVkTWVzc2FnZSwKICAgICAgICBtZXNzYWdlQ29uc3RDb25zdHJ1Y3Rvck5vbkZpbmFsRmllbGQsCiAgICAgICAgbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JOb25GaW5hbEZpZWxkQ2F1c2UsCiAgICAgICAgbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JSZWRpcmVjdGlvblRvTm9uQ29uc3QsCiAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgdGVtcGxhdGVGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWQsCiAgICAgICAgdGVtcGxhdGVGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWRCeUNvbnN0cnVjdG9yLAogICAgICAgIHRlbXBsYXRlSW5mZXJyZWRQYWNrYWdlVXJpLAogICAgICAgIHRlbXBsYXRlTWlzc2luZ0ltcGxlbWVudGF0aW9uQ2F1c2UsCiAgICAgICAgdGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9EZWZhdWx0Q29uc3RydWN0b3I7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgdW5oYW5kbGVkOwoKaW1wb3J0ICcuLi9zY29wZS5kYXJ0JyBzaG93IEFtYmlndW91c0J1aWxkZXI7CgppbXBvcnQgJy4uL3NvdXJjZS9zb3VyY2VfY2xhc3NfYnVpbGRlci5kYXJ0JyBzaG93IFNvdXJjZUNsYXNzQnVpbGRlcjsKCmltcG9ydCAnLi4vc291cmNlL3NvdXJjZV9sb2FkZXIuZGFydCcgc2hvdyBTb3VyY2VMb2FkZXI7CgppbXBvcnQgJy4uL3RhcmdldF9pbXBsZW1lbnRhdGlvbi5kYXJ0JyBzaG93IFRhcmdldEltcGxlbWVudGF0aW9uOwoKaW1wb3J0ICcuLi91cmlfdHJhbnNsYXRvci5kYXJ0JyBzaG93IFVyaVRyYW5zbGF0b3I7CgppbXBvcnQgJ2NvbnN0YW50X2V2YWx1YXRvci5kYXJ0JyBhcyBjb25zdGFudHMgc2hvdyB0cmFuc2Zvcm1MaWJyYXJpZXM7CgppbXBvcnQgJ2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgQ2xhc3NCdWlsZGVyLAogICAgICAgIENsYXNzSGllcmFyY2h5QnVpbGRlciwKICAgICAgICBEZWNsYXJhdGlvbiwKICAgICAgICBJbnZhbGlkVHlwZUJ1aWxkZXIsCiAgICAgICAgS2VybmVsQ2xhc3NCdWlsZGVyLAogICAgICAgIEtlcm5lbEZpZWxkQnVpbGRlciwKICAgICAgICBLZXJuZWxMaWJyYXJ5QnVpbGRlciwKICAgICAgICBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyLAogICAgICAgIEtlcm5lbFByb2NlZHVyZUJ1aWxkZXIsCiAgICAgICAgTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgTmFtZWRUeXBlQnVpbGRlciwKICAgICAgICBUeXBlQnVpbGRlciwKICAgICAgICBUeXBlRGVjbGFyYXRpb25CdWlsZGVyOwoKaW1wb3J0ICdrZXJuZWxfY29uc3RhbnRzLmRhcnQnIHNob3cgS2VybmVsQ29uc3RhbnRFcnJvclJlcG9ydGVyOwoKaW1wb3J0ICdtZXRhZGF0YV9jb2xsZWN0b3IuZGFydCcgc2hvdyBNZXRhZGF0YUNvbGxlY3RvcjsKCmltcG9ydCAndmVyaWZpZXIuZGFydCcgc2hvdyB2ZXJpZnlDb21wb25lbnQ7CgpjbGFzcyBLZXJuZWxUYXJnZXQgZXh0ZW5kcyBUYXJnZXRJbXBsZW1lbnRhdGlvbiB7CiAgLy8vIFRoZSBbRmlsZVN5c3RlbV0gd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gYWNjZXNzIGZpbGVzLgogIGZpbmFsIEZpbGVTeXN0ZW0gZmlsZVN5c3RlbTsKCiAgLy8vIFdoZXRoZXIgY29tbWVudHMgc2hvdWxkIGJlIHNjYW5uZWQgYW5kIHBhcnNlZC4KICBmaW5hbCBib29sIGluY2x1ZGVDb21tZW50czsKCiAgZmluYWwgRGlsbFRhcmdldCBkaWxsVGFyZ2V0OwoKICAvLy8gVGhlIFtNZXRhZGF0YUNvbGxlY3Rvcl0gdG8gd3JpdGUgbWV0YWRhdGEgdG8uCiAgZmluYWwgTWV0YWRhdGFDb2xsZWN0b3IgbWV0YWRhdGFDb2xsZWN0b3I7CgogIFNvdXJjZUxvYWRlciBsb2FkZXI7CgogIENvbXBvbmVudCBjb21wb25lbnQ7CgogIGZpbmFsIFR5cGVCdWlsZGVyIGR5bmFtaWNUeXBlID0gbmV3IEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIoImR5bmFtaWMiLCBudWxsKTsKCiAgZmluYWwgTmFtZWRUeXBlQnVpbGRlciBvYmplY3RUeXBlID0KICAgICAgbmV3IEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIoIk9iamVjdCIsIG51bGwpOwoKICBmaW5hbCBUeXBlQnVpbGRlciBib3R0b21UeXBlID0gbmV3IEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIoIk51bGwiLCBudWxsKTsKCiAgYm9vbCBnZXQgbGVnYWN5TW9kZSA9PiBiYWNrZW5kVGFyZ2V0LmxlZ2FjeU1vZGU7CgogIGZpbmFsIGJvb2wgZXhjbHVkZVNvdXJjZSA9ICFDb21waWxlckNvbnRleHQuY3VycmVudC5vcHRpb25zLmVtYmVkU291cmNlVGV4dDsKCiAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudERlZmluZXMgPQogICAgICBDb21waWxlckNvbnRleHQuY3VycmVudC5vcHRpb25zLmVudmlyb25tZW50RGVmaW5lczsKCiAgZmluYWwgYm9vbCBlbmFibGVBc3NlcnRzID0gQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQub3B0aW9ucy5lbmFibGVBc3NlcnRzOwoKICBmaW5hbCBMaXN0PE9iamVjdD4gY2xvbmVkRm9ybWFscyA9IDxPYmplY3Q+W107CgogIEtlcm5lbFRhcmdldCh0aGlzLmZpbGVTeXN0ZW0sIHRoaXMuaW5jbHVkZUNvbW1lbnRzLCBEaWxsVGFyZ2V0IGRpbGxUYXJnZXQsCiAgICAgIFVyaVRyYW5zbGF0b3IgdXJpVHJhbnNsYXRvciwKICAgICAge01ldGFkYXRhQ29sbGVjdG9yIG1ldGFkYXRhQ29sbGVjdG9yfSkKICAgICAgOiBkaWxsVGFyZ2V0ID0gZGlsbFRhcmdldCwKICAgICAgICBtZXRhZGF0YUNvbGxlY3RvciA9IG1ldGFkYXRhQ29sbGVjdG9yLAogICAgICAgIHN1cGVyKGRpbGxUYXJnZXQudGlja2VyLCB1cmlUcmFuc2xhdG9yLCBkaWxsVGFyZ2V0LmJhY2tlbmRUYXJnZXQpIHsKICAgIGxvYWRlciA9IGNyZWF0ZUxvYWRlcigpOwogIH0KCiAgdm9pZCBzZXQgYnVpbGRlckhpZXJhcmNoeShDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgbykge30KCiAgU291cmNlTG9hZGVyIGNyZWF0ZUxvYWRlcigpID0+CiAgICAgIG5ldyBTb3VyY2VMb2FkZXIoZmlsZVN5c3RlbSwgaW5jbHVkZUNvbW1lbnRzLCB0aGlzKTsKCiAgdm9pZCBhZGRTb3VyY2VJbmZvcm1hdGlvbigKICAgICAgVXJpIGltcG9ydFVyaSwgVXJpIGZpbGVVcmksIExpc3Q8aW50PiBsaW5lU3RhcnRzLCBMaXN0PGludD4gc291cmNlQ29kZSkgewogICAgdXJpVG9Tb3VyY2VbZmlsZVVyaV0gPQogICAgICAgIG5ldyBTb3VyY2UobGluZVN0YXJ0cywgc291cmNlQ29kZSwgaW1wb3J0VXJpLCBmaWxlVXJpKTsKICB9CgogIC8vLyBSZXR1cm4gbGlzdCBvZiBzYW1lIHNpemUgYXMgaW5wdXQgd2l0aCBwb3NzaWJseSB0cmFuc2xhdGVkIHVyaXMuCiAgTGlzdDxVcmk+IHNldEVudHJ5UG9pbnRzKExpc3Q8VXJpPiBlbnRyeVBvaW50cykgewogICAgTWFwPFN0cmluZywgVXJpPiBwYWNrYWdlc01hcDsKICAgIExpc3Q8VXJpPiByZXN1bHQgPSBuZXcgTGlzdDxVcmk+KCk7CiAgICBmb3IgKFVyaSBlbnRyeVBvaW50IGluIGVudHJ5UG9pbnRzKSB7CiAgICAgIFN0cmluZyBzY2hlbWUgPSBlbnRyeVBvaW50LnNjaGVtZTsKICAgICAgVXJpIGZpbGVVcmk7CiAgICAgIHN3aXRjaCAoc2NoZW1lKSB7CiAgICAgICAgY2FzZSAicGFja2FnZSI6CiAgICAgICAgY2FzZSAiZGFydCI6CiAgICAgICAgY2FzZSAiZGF0YSI6CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgLy8gQXR0ZW1wdCB0byByZXZlcnNlLWxvb2t1cCBbZW50cnlQb2ludF0gaW4gcGFja2FnZSBjb25maWcuCiAgICAgICAgICBTdHJpbmcgYXNTdHJpbmcgPSAiJGVudHJ5UG9pbnQiOwogICAgICAgICAgcGFja2FnZXNNYXAgPz89IHVyaVRyYW5zbGF0b3IucGFja2FnZXMuYXNNYXAoKTsKICAgICAgICAgIGZvciAoU3RyaW5nIHBhY2thZ2VOYW1lIGluIHBhY2thZ2VzTWFwLmtleXMpIHsKICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9ICIke3BhY2thZ2VzTWFwW3BhY2thZ2VOYW1lXX0iOwogICAgICAgICAgICBpZiAoYXNTdHJpbmcuc3RhcnRzV2l0aChwcmVmaXgpKSB7CiAgICAgICAgICAgICAgVXJpIHJldmVyc2VkID0gVXJpLnBhcnNlKAogICAgICAgICAgICAgICAgICAicGFja2FnZTokcGFja2FnZU5hbWUvJHthc1N0cmluZy5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCl9Iik7CiAgICAgICAgICAgICAgaWYgKGVudHJ5UG9pbnQgPT0gdXJpVHJhbnNsYXRvci50cmFuc2xhdGUocmV2ZXJzZWQpKSB7CiAgICAgICAgICAgICAgICBsb2FkZXIuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUluZmVycmVkUGFja2FnZVVyaS53aXRoQXJndW1lbnRzKHJldmVyc2VkKSwKICAgICAgICAgICAgICAgICAgICAtMSwKICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgIGVudHJ5UG9pbnQpOwogICAgICAgICAgICAgICAgZmlsZVVyaSA9IGVudHJ5UG9pbnQ7CiAgICAgICAgICAgICAgICBlbnRyeVBvaW50ID0gcmV2ZXJzZWQ7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgfQogICAgICByZXN1bHQuYWRkKGVudHJ5UG9pbnQpOwogICAgICBsb2FkZXIucmVhZChlbnRyeVBvaW50LCAtMSwgYWNjZXNzb3I6IGxvYWRlci5maXJzdCwgZmlsZVVyaTogZmlsZVVyaSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgTGlicmFyeUJ1aWxkZXIgY3JlYXRlTGlicmFyeUJ1aWxkZXIoCiAgICAgIFVyaSB1cmksIFVyaSBmaWxlVXJpLCBLZXJuZWxMaWJyYXJ5QnVpbGRlciBvcmlnaW4pIHsKICAgIGlmIChkaWxsVGFyZ2V0LmlzTG9hZGVkKSB7CiAgICAgIHZhciBidWlsZGVyID0gZGlsbFRhcmdldC5sb2FkZXIuYnVpbGRlcnNbdXJpXTsKICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewogICAgICAgIHJldHVybiBidWlsZGVyOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IEtlcm5lbExpYnJhcnlCdWlsZGVyKHVyaSwgZmlsZVVyaSwgbG9hZGVyLCBvcmlnaW4pOwogIH0KCiAgLy8vIFJldHVybnMgY2xhc3NlcyBkZWZpbmVkIGluIGxpYnJhcmllcyBpbiBbbG9hZGVyXS4KICBMaXN0PFNvdXJjZUNsYXNzQnVpbGRlcj4gY29sbGVjdE15Q2xhc3NlcygpIHsKICAgIExpc3Q8U291cmNlQ2xhc3NCdWlsZGVyPiByZXN1bHQgPSA8U291cmNlQ2xhc3NCdWlsZGVyPltdOwogICAgbG9hZGVyLmJ1aWxkZXJzLmZvckVhY2goKFVyaSB1cmksIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgICAgaWYgKGxpYnJhcnkubG9hZGVyID09IGxvYWRlcikgewogICAgICAgIEl0ZXJhdG9yPERlY2xhcmF0aW9uPiBpdGVyYXRvciA9IGxpYnJhcnkuaXRlcmF0b3I7CiAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgICAgIERlY2xhcmF0aW9uIG1lbWJlciA9IGl0ZXJhdG9yLmN1cnJlbnQ7CiAgICAgICAgICBpZiAobWVtYmVyIGlzIFNvdXJjZUNsYXNzQnVpbGRlciAmJiAhbWVtYmVyLmlzUGF0Y2gpIHsKICAgICAgICAgICAgcmVzdWx0LmFkZChtZW1iZXIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBicmVha0N5Y2xlKENsYXNzQnVpbGRlciBidWlsZGVyKSB7CiAgICBDbGFzcyBjbHMgPSBidWlsZGVyLnRhcmdldDsKICAgIGNscy5pbXBsZW1lbnRlZFR5cGVzLmNsZWFyKCk7CiAgICBjbHMuc3VwZXJ0eXBlID0gbnVsbDsKICAgIGNscy5taXhlZEluVHlwZSA9IG51bGw7CiAgICBidWlsZGVyLnN1cGVydHlwZSA9IG5ldyBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyKCJPYmplY3QiLCBudWxsKQogICAgICAuLmJpbmQob2JqZWN0Q2xhc3NCdWlsZGVyKTsKICAgIGJ1aWxkZXIuaW50ZXJmYWNlcyA9IG51bGw7CiAgICBidWlsZGVyLm1peGVkSW5UeXBlID0gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxDb21wb25lbnQ+IGJ1aWxkT3V0bGluZXMoe0Nhbm9uaWNhbE5hbWUgbmFtZVJvb3R9KSBhc3luYyB7CiAgICBpZiAobG9hZGVyLmZpcnN0ID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIHdpdGhDcmFzaFJlcG9ydGluZzxDb21wb25lbnQ+KCgpIGFzeW5jIHsKICAgICAgbG9hZGVyLmNyZWF0ZVR5cGVJbmZlcmVuY2VFbmdpbmUoKTsKICAgICAgYXdhaXQgbG9hZGVyLmJ1aWxkT3V0bGluZXMoKTsKICAgICAgbG9hZGVyLmNvcmVMaWJyYXJ5LmJlY29tZUNvcmVMaWJyYXJ5KCk7CiAgICAgIGR5bmFtaWNUeXBlLmJpbmQobG9hZGVyLmNvcmVMaWJyYXJ5WyJkeW5hbWljIl0pOwogICAgICBsb2FkZXIucmVzb2x2ZVBhcnRzKCk7CiAgICAgIGxvYWRlci5jb21wdXRlTGlicmFyeVNjb3BlcygpOwogICAgICBvYmplY3RUeXBlLmJpbmQobG9hZGVyLmNvcmVMaWJyYXJ5WyJPYmplY3QiXSk7CiAgICAgIGJvdHRvbVR5cGUuYmluZChsb2FkZXIuY29yZUxpYnJhcnlbIk51bGwiXSk7CiAgICAgIGxvYWRlci5yZXNvbHZlVHlwZXMoKTsKICAgICAgbG9hZGVyLmNvbXB1dGVEZWZhdWx0VHlwZXMoZHluYW1pY1R5cGUsIGJvdHRvbVR5cGUsIG9iamVjdENsYXNzQnVpbGRlcik7CiAgICAgIExpc3Q8U291cmNlQ2xhc3NCdWlsZGVyPiBteUNsYXNzZXMgPQogICAgICAgICAgbG9hZGVyLmNoZWNrU2VtYW50aWNzKG9iamVjdENsYXNzQnVpbGRlcik7CiAgICAgIGxvYWRlci5maW5pc2hUeXBlVmFyaWFibGVzKG9iamVjdENsYXNzQnVpbGRlciwgZHluYW1pY1R5cGUpOwogICAgICBsb2FkZXIuYnVpbGRDb21wb25lbnQoKTsKICAgICAgbG9hZGVyLmZpbmFsaXplSW5pdGlhbGl6aW5nRm9ybWFscygpOwogICAgICBpbnN0YWxsRGVmYXVsdFN1cGVydHlwZXMoKTsKICAgICAgaW5zdGFsbFN5bnRoZXRpY0NvbnN0cnVjdG9ycyhteUNsYXNzZXMpOwogICAgICBsb2FkZXIucmVzb2x2ZUNvbnN0cnVjdG9ycygpOwogICAgICBjb21wb25lbnQgPQogICAgICAgICAgbGluayhuZXcgTGlzdDxMaWJyYXJ5Pi5mcm9tKGxvYWRlci5saWJyYXJpZXMpLCBuYW1lUm9vdDogbmFtZVJvb3QpOwogICAgICBjb21wdXRlQ29yZVR5cGVzKCk7CiAgICAgIGJ1aWxkZXJIaWVyYXJjaHkgPQogICAgICAgICAgbG9hZGVyLmJ1aWxkQ2xhc3NIaWVyYXJjaHkobXlDbGFzc2VzLCBvYmplY3RDbGFzc0J1aWxkZXIpOwogICAgICBsb2FkZXIuY29tcHV0ZUhpZXJhcmNoeSgpOwogICAgICBsb2FkZXIucGVyZm9ybVRvcExldmVsSW5mZXJlbmNlKG15Q2xhc3Nlcyk7CiAgICAgIGxvYWRlci5jaGVja1N1cGVydHlwZXMobXlDbGFzc2VzKTsKICAgICAgbG9hZGVyLmNoZWNrQm91bmRzKCk7CiAgICAgIGxvYWRlci5jaGVja092ZXJyaWRlcyhteUNsYXNzZXMpOwogICAgICBsb2FkZXIuY2hlY2tBYnN0cmFjdE1lbWJlcnMobXlDbGFzc2VzKTsKICAgICAgbG9hZGVyLmNoZWNrUmVkaXJlY3RpbmdGYWN0b3JpZXMobXlDbGFzc2VzKTsKICAgICAgbG9hZGVyLmFkZE5vU3VjaE1ldGhvZEZvcndhcmRlcnMobXlDbGFzc2VzKTsKICAgICAgbG9hZGVyLmNoZWNrTWl4aW5zKG15Q2xhc3Nlcyk7CiAgICAgIGluc3RhbGxBbGxDb21wb25lbnRQcm9ibGVtcyhsb2FkZXIuYWxsQ29tcG9uZW50UHJvYmxlbXMpOwogICAgICBsb2FkZXIuYWxsQ29tcG9uZW50UHJvYmxlbXMuY2xlYXIoKTsKICAgICAgcmV0dXJuIGNvbXBvbmVudDsKICAgIH0sICgpID0+IGxvYWRlcj8uY3VycmVudFVyaUZvckNyYXNoUmVwb3J0aW5nKTsKICB9CgogIC8vLyBCdWlsZCB0aGUga2VybmVsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb21wb25lbnQgbG9hZGVkIGJ5IHRoaXMKICAvLy8gdGFyZ2V0LiBUaGUgY29tcG9uZW50IHdpbGwgY29udGFpbiBmdWxsIGJvZGllcyBmb3IgdGhlIGNvZGUgbG9hZGVkIGZyb20KICAvLy8gc291cmNlcywgYW5kIG9ubHkgcmVmZXJlbmNlcyB0byB0aGUgY29kZSBsb2FkZWQgYnkgdGhlIFtEaWxsVGFyZ2V0XSwKICAvLy8gd2hpY2ggbWF5IG9yIG1heSBub3QgaW5jbHVkZSBtZXRob2QgYm9kaWVzIChkZXBlbmRpbmcgb24gd2hhdCB3YXMgbG9hZGVkCiAgLy8vIGludG8gdGhhdCB0YXJnZXQsIGFuIG91dGxpbmUgb3IgYSBmdWxsIGtlcm5lbCBjb21wb25lbnQpLgogIC8vLwogIC8vLyBJZiBbdmVyaWZ5XSwgcnVuIHRoZSBkZWZhdWx0IGtlcm5lbCB2ZXJpZmljYXRpb24gb24gdGhlIHJlc3VsdGluZwogIC8vLyBjb21wb25lbnQuCiAgQG92ZXJyaWRlCiAgRnV0dXJlPENvbXBvbmVudD4gYnVpbGRDb21wb25lbnQoe2Jvb2wgdmVyaWZ5OiBmYWxzZX0pIGFzeW5jIHsKICAgIGlmIChsb2FkZXIuZmlyc3QgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gd2l0aENyYXNoUmVwb3J0aW5nPENvbXBvbmVudD4oKCkgYXN5bmMgewogICAgICB0aWNrZXIubG9nTXMoIkJ1aWxkaW5nIGNvbXBvbmVudCIpOwogICAgICBhd2FpdCBsb2FkZXIuYnVpbGRCb2RpZXMoKTsKICAgICAgZmluaXNoQ2xvbmVkUGFyYW1ldGVycygpOwogICAgICBsb2FkZXIuZmluaXNoRGVmZXJyZWRMb2FkVGVhcm9mZnMoKTsKICAgICAgbG9hZGVyLmZpbmlzaE5vU3VjaE1ldGhvZEZvcndhcmRlcnMoKTsKICAgICAgTGlzdDxTb3VyY2VDbGFzc0J1aWxkZXI+IG15Q2xhc3NlcyA9IGNvbGxlY3RNeUNsYXNzZXMoKTsKICAgICAgbG9hZGVyLmZpbmlzaE5hdGl2ZU1ldGhvZHMoKTsKICAgICAgbG9hZGVyLmZpbmlzaFBhdGNoTWV0aG9kcygpOwogICAgICBmaW5pc2hBbGxDb25zdHJ1Y3RvcnMobXlDbGFzc2VzKTsKICAgICAgcnVuQnVpbGRUcmFuc2Zvcm1hdGlvbnMoKTsKCiAgICAgIGlmICh2ZXJpZnkpIHRoaXMudmVyaWZ5KCk7CiAgICAgIGluc3RhbGxBbGxDb21wb25lbnRQcm9ibGVtcyhsb2FkZXIuYWxsQ29tcG9uZW50UHJvYmxlbXMpOwogICAgICByZXR1cm4gY29tcG9uZW50OwogICAgfSwgKCkgPT4gbG9hZGVyPy5jdXJyZW50VXJpRm9yQ3Jhc2hSZXBvcnRpbmcpOwogIH0KCiAgdm9pZCBpbnN0YWxsQWxsQ29tcG9uZW50UHJvYmxlbXMoCiAgICAgIExpc3Q8Rm9ybWF0dGVkTWVzc2FnZT4gYWxsQ29tcG9uZW50UHJvYmxlbXMpIHsKICAgIGlmIChhbGxDb21wb25lbnRQcm9ibGVtcy5pc05vdEVtcHR5KSB7CiAgICAgIGNvbXBvbmVudC5wcm9ibGVtc0FzSnNvbiA/Pz0gPFN0cmluZz5bXTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsQ29tcG9uZW50UHJvYmxlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgRm9ybWF0dGVkTWVzc2FnZSBmb3JtYXR0ZWRNZXNzYWdlID0gYWxsQ29tcG9uZW50UHJvYmxlbXNbaV07CiAgICAgIGNvbXBvbmVudC5wcm9ibGVtc0FzSnNvbi5hZGQoZm9ybWF0dGVkTWVzc2FnZS50b0pzb25TdHJpbmcoKSk7CiAgICB9CiAgfQoKICAvLy8gQ3JlYXRlcyBhIGNvbXBvbmVudCBieSBjb21iaW5pbmcgW2xpYnJhcmllc10gd2l0aCB0aGUgbGlicmFyaWVzIG9mCiAgLy8vIGBkaWxsVGFyZ2V0LmxvYWRlci5jb21wb25lbnRgLgogIENvbXBvbmVudCBsaW5rKExpc3Q8TGlicmFyeT4gbGlicmFyaWVzLCB7Q2Fub25pY2FsTmFtZSBuYW1lUm9vdH0pIHsKICAgIGxpYnJhcmllcy5hZGRBbGwoZGlsbFRhcmdldC5sb2FkZXIubGlicmFyaWVzKTsKCiAgICBNYXA8VXJpLCBTb3VyY2U+IHVyaVRvU291cmNlID0gbmV3IE1hcDxVcmksIFNvdXJjZT4oKTsKICAgIHZvaWQgY29weVNvdXJjZShVcmkgdXJpLCBTb3VyY2Ugc291cmNlKSB7CiAgICAgIHVyaVRvU291cmNlW3VyaV0gPSBleGNsdWRlU291cmNlCiAgICAgICAgICA/IG5ldyBTb3VyY2Uoc291cmNlLmxpbmVTdGFydHMsIGNvbnN0IDxpbnQ+W10sIHNvdXJjZS5pbXBvcnRVcmksCiAgICAgICAgICAgICAgc291cmNlLmZpbGVVcmkpCiAgICAgICAgICA6IHNvdXJjZTsKICAgIH0KCiAgICB0aGlzLnVyaVRvU291cmNlLmZvckVhY2goY29weVNvdXJjZSk7CgogICAgQ29tcG9uZW50IGNvbXBvbmVudCA9IGJhY2tlbmRUYXJnZXQuY29uZmlndXJlQ29tcG9uZW50KG5ldyBDb21wb25lbnQoCiAgICAgICAgbmFtZVJvb3Q6IG5hbWVSb290LCBsaWJyYXJpZXM6IGxpYnJhcmllcywgdXJpVG9Tb3VyY2U6IHVyaVRvU291cmNlKSk7CiAgICBpZiAobG9hZGVyLmZpcnN0ICE9IG51bGwpIHsKICAgICAgLy8gVE9ETyhzaWdtdW5kKTogZG8gb25seSBmb3IgZnVsbCBwcm9ncmFtCiAgICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0KICAgICAgICAgIGxvYWRlci5maXJzdC5leHBvcnRTY29wZS5sb29rdXAoIm1haW4iLCAtMSwgbnVsbCk7CiAgICAgIGlmIChkZWNsYXJhdGlvbiBpcyBBbWJpZ3VvdXNCdWlsZGVyKSB7CiAgICAgICAgQW1iaWd1b3VzQnVpbGRlciBwcm9ibGVtID0gZGVjbGFyYXRpb247CiAgICAgICAgZGVjbGFyYXRpb24gPSBwcm9ibGVtLmdldEZpcnN0RGVjbGFyYXRpb24oKTsKICAgICAgfQogICAgICBpZiAoZGVjbGFyYXRpb24gaXMgS2VybmVsUHJvY2VkdXJlQnVpbGRlcikgewogICAgICAgIGNvbXBvbmVudC5tYWluTWV0aG9kID0gZGVjbGFyYXRpb24ucHJvY2VkdXJlOwogICAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIERpbGxNZW1iZXJCdWlsZGVyKSB7CiAgICAgICAgaWYgKGRlY2xhcmF0aW9uLm1lbWJlciBpcyBQcm9jZWR1cmUpIHsKICAgICAgICAgIGNvbXBvbmVudC5tYWluTWV0aG9kID0gZGVjbGFyYXRpb24ubWVtYmVyOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmIChtZXRhZGF0YUNvbGxlY3RvciAhPSBudWxsKSB7CiAgICAgIGNvbXBvbmVudC5hZGRNZXRhZGF0YVJlcG9zaXRvcnkobWV0YWRhdGFDb2xsZWN0b3IucmVwb3NpdG9yeSk7CiAgICB9CgogICAgdGlja2VyLmxvZ01zKCJMaW5rZWQgY29tcG9uZW50Iik7CiAgICByZXR1cm4gY29tcG9uZW50OwogIH0KCiAgdm9pZCBpbnN0YWxsRGVmYXVsdFN1cGVydHlwZXMoKSB7CiAgICBDbGFzcyBvYmplY3RDbGFzcyA9IHRoaXMub2JqZWN0Q2xhc3M7CiAgICBsb2FkZXIuYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICBpZiAobGlicmFyeS5sb2FkZXIgPT0gbG9hZGVyKSB7CiAgICAgICAgSXRlcmF0b3I8RGVjbGFyYXRpb24+IGl0ZXJhdG9yID0gbGlicmFyeS5pdGVyYXRvcjsKICAgICAgICB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICAgICAgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBpdGVyYXRvci5jdXJyZW50OwogICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGlzIFNvdXJjZUNsYXNzQnVpbGRlcikgewogICAgICAgICAgICBDbGFzcyBjbHMgPSBkZWNsYXJhdGlvbi50YXJnZXQ7CiAgICAgICAgICAgIGlmIChjbHMgIT0gb2JqZWN0Q2xhc3MpIHsKICAgICAgICAgICAgICBjbHMuc3VwZXJ0eXBlID8/PSBvYmplY3RDbGFzcy5hc1Jhd1N1cGVydHlwZTsKICAgICAgICAgICAgICBkZWNsYXJhdGlvbi5zdXBlcnR5cGUgPz89CiAgICAgICAgICAgICAgICAgIG5ldyBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyKCJPYmplY3QiLCBudWxsKQogICAgICAgICAgICAgICAgICAgIC4uYmluZChvYmplY3RDbGFzc0J1aWxkZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbi5pc01peGluQXBwbGljYXRpb24pIHsKICAgICAgICAgICAgICBjbHMubWl4ZWRJblR5cGUgPSBkZWNsYXJhdGlvbi5taXhlZEluVHlwZS5idWlsZE1peGVkSW5UeXBlKAogICAgICAgICAgICAgICAgICBsaWJyYXJ5LCBkZWNsYXJhdGlvbi5jaGFyT2Zmc2V0LCBkZWNsYXJhdGlvbi5maWxlVXJpKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICB0aWNrZXIubG9nTXMoIkluc3RhbGxlZCBPYmplY3QgYXMgaW1wbGljaXQgc3VwZXJjbGFzcyIpOwogIH0KCiAgdm9pZCBpbnN0YWxsU3ludGhldGljQ29uc3RydWN0b3JzKExpc3Q8U291cmNlQ2xhc3NCdWlsZGVyPiBidWlsZGVycykgewogICAgQ2xhc3Mgb2JqZWN0Q2xhc3MgPSB0aGlzLm9iamVjdENsYXNzOwogICAgZm9yIChTb3VyY2VDbGFzc0J1aWxkZXIgYnVpbGRlciBpbiBidWlsZGVycykgewogICAgICBpZiAoYnVpbGRlci50YXJnZXQgIT0gb2JqZWN0Q2xhc3MgJiYgIWJ1aWxkZXIuaXNQYXRjaCkgewogICAgICAgIGlmIChidWlsZGVyLmlzUGF0Y2ggfHwgYnVpbGRlci5pc01peGluRGVjbGFyYXRpb24pIGNvbnRpbnVlOwogICAgICAgIGlmIChidWlsZGVyLmlzTWl4aW5BcHBsaWNhdGlvbikgewogICAgICAgICAgaW5zdGFsbEZvcndhcmRpbmdDb25zdHJ1Y3RvcnMoYnVpbGRlcik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGluc3RhbGxEZWZhdWx0Q29uc3RydWN0b3IoYnVpbGRlcik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0aWNrZXIubG9nTXMoIkluc3RhbGxlZCBzeW50aGV0aWMgY29uc3RydWN0b3JzIik7CiAgfQoKICBLZXJuZWxDbGFzc0J1aWxkZXIgZ2V0IG9iamVjdENsYXNzQnVpbGRlciA9PiBvYmplY3RUeXBlLmRlY2xhcmF0aW9uOwoKICBDbGFzcyBnZXQgb2JqZWN0Q2xhc3MgPT4gb2JqZWN0Q2xhc3NCdWlsZGVyLmNsczsKCiAgLy8vIElmIFtidWlsZGVyXSBkb2Vzbid0IGhhdmUgYSBjb25zdHJ1Y3RvcnMsIGluc3RhbGwgdGhlIGRlZmF1bHRzLgogIHZvaWQgaW5zdGFsbERlZmF1bHRDb25zdHJ1Y3RvcihTb3VyY2VDbGFzc0J1aWxkZXIgYnVpbGRlcikgewogICAgYXNzZXJ0KCFidWlsZGVyLmlzTWl4aW5BcHBsaWNhdGlvbik7CiAgICAvLyBUT0RPKGFza2VzYyk6IE1ha2UgdGhpcyBjaGVjayBsaWdodC13ZWlnaHQgaW4gdGhlIGFic2VuY2Ugb2YgcGF0Y2hlcy4KICAgIGlmIChidWlsZGVyLnRhcmdldC5jb25zdHJ1Y3RvcnMuaXNOb3RFbXB0eSkgcmV0dXJuOwogICAgaWYgKGJ1aWxkZXIudGFyZ2V0LnJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycy5pc05vdEVtcHR5KSByZXR1cm47CiAgICBmb3IgKFByb2NlZHVyZSBwcm9jIGluIGJ1aWxkZXIudGFyZ2V0LnByb2NlZHVyZXMpIHsKICAgICAgaWYgKHByb2MuaXNGYWN0b3J5KSByZXR1cm47CiAgICB9CgogICAgLy8vIEZyb20gW0RhcnQgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgNHRoIEVkaXRpb25dKAogICAgLy8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvZmlsZXMvRUNNQS1TVC9FQ01BLTQwOC5wZGYpOgogICAgLy8vID5JZmYgbm8gY29uc3RydWN0b3IgaXMgc3BlY2lmaWVkIGZvciBhIGNsYXNzIEMsIGl0IGltcGxpY2l0bHkgaGFzIGEKICAgIC8vLyA+ZGVmYXVsdCBjb25zdHJ1Y3RvciBDKCkgOiBzdXBlcigpIHt9LCB1bmxlc3MgQyBpcyBjbGFzcyBPYmplY3QuCiAgICAvLyBUaGUgc3VwZXJpbml0aWFsaXplciBpcyBpbnN0YWxsZWQgYmVsb3cgaW4gW2ZpbmlzaENvbnN0cnVjdG9yc10uCiAgICBidWlsZGVyLmFkZFN5bnRoZXRpY0NvbnN0cnVjdG9yKG1ha2VEZWZhdWx0Q29uc3RydWN0b3IoYnVpbGRlci50YXJnZXQpKTsKICB9CgogIHZvaWQgaW5zdGFsbEZvcndhcmRpbmdDb25zdHJ1Y3RvcnMoU291cmNlQ2xhc3NCdWlsZGVyIGJ1aWxkZXIpIHsKICAgIGFzc2VydChidWlsZGVyLmlzTWl4aW5BcHBsaWNhdGlvbik7CiAgICBpZiAoYnVpbGRlci5saWJyYXJ5LmxvYWRlciAhPSBsb2FkZXIpIHJldHVybjsKICAgIGlmIChidWlsZGVyLnRhcmdldC5jb25zdHJ1Y3RvcnMuaXNOb3RFbXB0eSkgewogICAgICAvLyBUaGVzZSB3ZXJlIGluc3RhbGxlZCBieSBhIHN1YmNsYXNzIGluIHRoZSByZWN1cnNpdmUgY2FsbCBiZWxvdy4KICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vLyBGcm9tIFtEYXJ0IFByb2dyYW1taW5nIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIDR0aCBFZGl0aW9uXSgKICAgIC8vLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvcHVibGljYXRpb25zL2ZpbGVzL0VDTUEtU1QvRUNNQS00MDgucGRmKToKICAgIC8vLyA+QSBtaXhpbiBhcHBsaWNhdGlvbiBvZiB0aGUgZm9ybSBTIHdpdGggTTsgZGVmaW5lcyBhIGNsYXNzIEMgd2l0aAogICAgLy8vID5zdXBlcmNsYXNzIFMuCiAgICAvLy8gPi4uLgoKICAgIC8vLyA+TGV0IExNIGJlIHRoZSBsaWJyYXJ5IGluIHdoaWNoIE0gaXMgZGVjbGFyZWQuIEZvciBlYWNoIGdlbmVyYXRpdmUKICAgIC8vLyA+Y29uc3RydWN0b3IgbmFtZWQgcWkoVGkxIGFpMSwgLiAuIC4gLCBUaWtpIGFpa2kpLCBpIGluIDEuLm4gb2YgUwogICAgLy8vID50aGF0IGlzIGFjY2Vzc2libGUgdG8gTE0gLCBDIGhhcyBhbiBpbXBsaWNpdGx5IGRlY2xhcmVkIGNvbnN0cnVjdG9yCiAgICAvLy8gPm5hbWVkIHEnaSA9IFtDL1NdcWkgb2YgdGhlIGZvcm0gcSdpKGFpMSwuLi4sYWlraSkgOgogICAgLy8vID5zdXBlcihhaTEsLi4uLGFpa2kpOy4KICAgIFR5cGVCdWlsZGVyIHR5cGUgPSBidWlsZGVyLnN1cGVydHlwZTsKICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgc3VwZXJ0eXBlOwogICAgaWYgKHR5cGUgaXMgTmFtZWRUeXBlQnVpbGRlcikgewogICAgICBzdXBlcnR5cGUgPSB0eXBlLmRlY2xhcmF0aW9uOwogICAgfSBlbHNlIHsKICAgICAgdW5oYW5kbGVkKCIke3R5cGUucnVudGltZVR5cGV9IiwgImluc3RhbGxGb3J3YXJkaW5nQ29uc3RydWN0b3JzIiwKICAgICAgICAgIGJ1aWxkZXIuY2hhck9mZnNldCwgYnVpbGRlci5maWxlVXJpKTsKICAgIH0KICAgIGlmIChzdXBlcnR5cGUuaXNNaXhpbkFwcGxpY2F0aW9uKSB7CiAgICAgIGluc3RhbGxGb3J3YXJkaW5nQ29uc3RydWN0b3JzKHN1cGVydHlwZSk7CiAgICB9CiAgICBpZiAoc3VwZXJ0eXBlIGlzIEtlcm5lbENsYXNzQnVpbGRlcikgewogICAgICBpZiAoc3VwZXJ0eXBlLmNscy5jb25zdHJ1Y3RvcnMuaXNFbXB0eSkgewogICAgICAgIGJ1aWxkZXIuYWRkU3ludGhldGljQ29uc3RydWN0b3IobWFrZURlZmF1bHRDb25zdHJ1Y3RvcihidWlsZGVyLnRhcmdldCkpOwogICAgICB9IGVsc2UgewogICAgICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gc3Vic3RpdHV0aW9uTWFwID0KICAgICAgICAgICAgYnVpbGRlci5nZXRTdWJzdGl0dXRpb25NYXAoc3VwZXJ0eXBlLnRhcmdldCk7CiAgICAgICAgZm9yIChDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciBpbiBzdXBlcnR5cGUuY2xzLmNvbnN0cnVjdG9ycykgewogICAgICAgICAgYnVpbGRlci5hZGRTeW50aGV0aWNDb25zdHJ1Y3RvcihtYWtlTWl4aW5BcHBsaWNhdGlvbkNvbnN0cnVjdG9yKAogICAgICAgICAgICAgIGJ1aWxkZXIudGFyZ2V0LCBidWlsZGVyLmNscy5taXhpbiwgY29uc3RydWN0b3IsIHN1YnN0aXR1dGlvbk1hcCkpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmIChzdXBlcnR5cGUgaXMgSW52YWxpZFR5cGVCdWlsZGVyKSB7CiAgICAgIGJ1aWxkZXIuYWRkU3ludGhldGljQ29uc3RydWN0b3IobWFrZURlZmF1bHRDb25zdHJ1Y3RvcihidWlsZGVyLnRhcmdldCkpOwogICAgfSBlbHNlIHsKICAgICAgdW5oYW5kbGVkKCIke3N1cGVydHlwZS5ydW50aW1lVHlwZX0iLCAiaW5zdGFsbEZvcndhcmRpbmdDb25zdHJ1Y3RvcnMiLAogICAgICAgICAgYnVpbGRlci5jaGFyT2Zmc2V0LCBidWlsZGVyLmZpbGVVcmkpOwogICAgfQogIH0KCiAgQ29uc3RydWN0b3IgbWFrZU1peGluQXBwbGljYXRpb25Db25zdHJ1Y3RvcihDbGFzcyBjbHMsIENsYXNzIG1peGluLAogICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciwgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBzdWJzdGl0dXRpb25NYXApIHsKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gY29weUZvcm1hbChWYXJpYWJsZURlY2xhcmF0aW9uIGZvcm1hbCkgewogICAgICAvLyBUT0RPKGFoZSk6IEhhbmRsZSBpbml0aWFsaXplcnMuCiAgICAgIHZhciBjb3B5ID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24oZm9ybWFsLm5hbWUsCiAgICAgICAgICBpc0ZpbmFsOiBmb3JtYWwuaXNGaW5hbCwgaXNDb25zdDogZm9ybWFsLmlzQ29uc3QpOwogICAgICBpZiAoZm9ybWFsLnR5cGUgIT0gbnVsbCkgewogICAgICAgIGNvcHkudHlwZSA9IHN1YnN0aXR1dGUoZm9ybWFsLnR5cGUsIHN1YnN0aXR1dGlvbk1hcCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvcHk7CiAgICB9CgogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBwb3NpdGlvbmFsUGFyYW1ldGVycyA9IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdOwogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBuYW1lZFBhcmFtZXRlcnMgPSA8VmFyaWFibGVEZWNsYXJhdGlvbj5bXTsKICAgIExpc3Q8RXhwcmVzc2lvbj4gcG9zaXRpb25hbCA9IDxFeHByZXNzaW9uPltdOwogICAgTGlzdDxOYW1lZEV4cHJlc3Npb24+IG5hbWVkID0gPE5hbWVkRXhwcmVzc2lvbj5bXTsKICAgIGZvciAoVmFyaWFibGVEZWNsYXJhdGlvbiBmb3JtYWwKICAgICAgICBpbiBjb25zdHJ1Y3Rvci5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICBwb3NpdGlvbmFsUGFyYW1ldGVycy5hZGQoY29weUZvcm1hbChmb3JtYWwpKTsKICAgICAgcG9zaXRpb25hbC5hZGQobmV3IFZhcmlhYmxlR2V0KHBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxhc3QpKTsKICAgIH0KICAgIGZvciAoVmFyaWFibGVEZWNsYXJhdGlvbiBmb3JtYWwgaW4gY29uc3RydWN0b3IuZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gY2xvbmUgPSBjb3B5Rm9ybWFsKGZvcm1hbCk7CiAgICAgIGNsb25lZEZvcm1hbHMuLmFkZChmb3JtYWwpLi5hZGQoY2xvbmUpLi5hZGQoc3Vic3RpdHV0aW9uTWFwKTsKICAgICAgbmFtZWRQYXJhbWV0ZXJzLmFkZChjbG9uZSk7CiAgICAgIG5hbWVkLmFkZChuZXcgTmFtZWRFeHByZXNzaW9uKAogICAgICAgICAgZm9ybWFsLm5hbWUsIG5ldyBWYXJpYWJsZUdldChuYW1lZFBhcmFtZXRlcnMubGFzdCkpKTsKICAgIH0KICAgIEZ1bmN0aW9uTm9kZSBmdW5jdGlvbiA9IG5ldyBGdW5jdGlvbk5vZGUobmV3IEVtcHR5U3RhdGVtZW50KCksCiAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnM6IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgIG5hbWVkUGFyYW1ldGVyczogbmFtZWRQYXJhbWV0ZXJzLAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IGNvbnN0cnVjdG9yLmZ1bmN0aW9uLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgcmV0dXJuVHlwZTogbWFrZUNvbnN0cnVjdG9yUmV0dXJuVHlwZShjbHMpKTsKICAgIFN1cGVySW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSBuZXcgU3VwZXJJbml0aWFsaXplcigKICAgICAgICBjb25zdHJ1Y3RvciwgbmV3IEFyZ3VtZW50cyhwb3NpdGlvbmFsLCBuYW1lZDogbmFtZWQpKTsKICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3IoZnVuY3Rpb24sCiAgICAgICAgbmFtZTogY29uc3RydWN0b3IubmFtZSwKICAgICAgICBpbml0aWFsaXplcnM6IDxJbml0aWFsaXplcj5baW5pdGlhbGl6ZXJdLAogICAgICAgIGlzU3ludGhldGljOiB0cnVlLAogICAgICAgIGlzQ29uc3Q6IGNvbnN0cnVjdG9yLmlzQ29uc3QgJiYgbWl4aW4uZmllbGRzLmlzRW1wdHkpOwogIH0KCiAgdm9pZCBmaW5pc2hDbG9uZWRQYXJhbWV0ZXJzKCkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbG9uZWRGb3JtYWxzLmxlbmd0aDsgaSArPSAzKSB7CiAgICAgIC8vIE5vdGUgdGhhdCBbb3JpZ2luYWxdIG1heSBpdHNlbGYgYmUgY2xvbmUuIElmIHNvLCBpdCB3YXMgYWRkZWQgdG8KICAgICAgLy8gW2Nsb25lZEZvcm1hbHNdIGJlZm9yZSBbY2xvbmVdLCBzbyBpdCdzIGluaXRpYWxpemVycyBhcmUgYWxyZWFkeSBpbgogICAgICAvLyBwbGFjZS4KICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBvcmlnaW5hbCA9IGNsb25lZEZvcm1hbHNbaV07CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gY2xvbmUgPSBjbG9uZWRGb3JtYWxzW2kgKyAxXTsKICAgICAgaWYgKG9yaWdpbmFsLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgICAvLyBUT0RPKGFoZSk6IEl0IGlzIHVuY2xlYXIgaWYgaXQgaXMgbGVnYWwgdG8gdXNlIHR5cGUgdmFyaWFibGVzIGluCiAgICAgICAgLy8gZGVmYXVsdCB2YWx1ZXMsIGJ1dCBGYXN0YSBpcyBjdXJyZW50bHkgYWxsb3dpbmcgaXQsIGFuZCB0aGUgVk0KICAgICAgICAvLyBhY2NlcHRzIGl0LiBJZiBpdCBpc24ndCBsZWdhbCwgdGhlIHdlIGNhbiBzcGVlZCB0aGlzIHVwIGJ5IHVzaW5nIGEKICAgICAgICAvLyBzaW5nbGUgY2xvbmVyIHdpdGhvdXQgc3Vic3RpdHV0aW9uLgogICAgICAgIENsb25lVmlzaXRvciBjbG9uZXIgPQogICAgICAgICAgICBuZXcgQ2xvbmVWaXNpdG9yKHR5cGVTdWJzdGl0dXRpb246IGNsb25lZEZvcm1hbHNbaSArIDJdKTsKICAgICAgICBjbG9uZS5pbml0aWFsaXplciA9IGNsb25lci5jbG9uZShvcmlnaW5hbC5pbml0aWFsaXplcikuLnBhcmVudCA9IGNsb25lOwogICAgICB9CiAgICB9CiAgICBjbG9uZWRGb3JtYWxzLmNsZWFyKCk7CiAgICB0aWNrZXIubG9nTXMoIkNsb25lZCBkZWZhdWx0IHZhbHVlcyBvZiBmb3JtYWxzIik7CiAgfQoKICBDb25zdHJ1Y3RvciBtYWtlRGVmYXVsdENvbnN0cnVjdG9yKENsYXNzIGVuY2xvc2luZ0NsYXNzKSB7CiAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKAogICAgICAgIG5ldyBGdW5jdGlvbk5vZGUobmV3IEVtcHR5U3RhdGVtZW50KCksCiAgICAgICAgICAgIHJldHVyblR5cGU6IG1ha2VDb25zdHJ1Y3RvclJldHVyblR5cGUoZW5jbG9zaW5nQ2xhc3MpKSwKICAgICAgICBuYW1lOiBuZXcgTmFtZSgiIiksCiAgICAgICAgaXNTeW50aGV0aWM6IHRydWUpOwogIH0KCiAgRGFydFR5cGUgbWFrZUNvbnN0cnVjdG9yUmV0dXJuVHlwZShDbGFzcyBlbmNsb3NpbmdDbGFzcykgewogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZVBhcmFtZXRlclR5cGVzID0gbmV3IExpc3Q8RGFydFR5cGU+KCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuY2xvc2luZ0NsYXNzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IGVuY2xvc2luZ0NsYXNzLnR5cGVQYXJhbWV0ZXJzW2ldOwogICAgICB0eXBlUGFyYW1ldGVyVHlwZXMuYWRkKG5ldyBUeXBlUGFyYW1ldGVyVHlwZSh0eXBlUGFyYW1ldGVyKSk7CiAgICB9CiAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUoZW5jbG9zaW5nQ2xhc3MsIHR5cGVQYXJhbWV0ZXJUeXBlcyk7CiAgfQoKICB2b2lkIGNvbXB1dGVDb3JlVHlwZXMoKSB7CiAgICBMaXN0PExpYnJhcnk+IGxpYnJhcmllcyA9IDxMaWJyYXJ5PltdOwogICAgZm9yIChTdHJpbmcgcGxhdGZvcm1MaWJyYXJ5IGluIGNvbnN0IFsKICAgICAgImRhcnQ6X2ludGVybmFsIiwKICAgICAgImRhcnQ6YXN5bmMiLAogICAgICAvLyBUT0RPKGFza2VzYyk6IFdoZW4gYWxsIGJhY2tlbmRzIHN1cHBvcnQgc2V0IGxpdGVyYWxzLCB3ZSBubyBsb25nZXIKICAgICAgLy8gbmVlZCB0byBpbmRleCBkYXJ0OmNvbGxlY3Rpb24sIGFzIGl0IGlzIG9ubHkgbmVlZGVkIGZvciBkZXN1Z2FyaW5nIG9mCiAgICAgIC8vIGNvbnN0IHNldHMuIFdlIGNhbiByZW1vdmUgaXQgZnJvbSB0aGlzIGxpc3QgYXQgdGhhdCB0aW1lLgogICAgICAiZGFydDpjb2xsZWN0aW9uIiwKICAgICAgImRhcnQ6Y29yZSIsCiAgICAgICJkYXJ0Om1pcnJvcnMiCiAgICBdKSB7CiAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UocGxhdGZvcm1MaWJyYXJ5KTsKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGxvYWRlci5idWlsZGVyc1t1cmldOwogICAgICBpZiAobGlicmFyeSA9PSBudWxsKSB7CiAgICAgICAgLy8gVE9ETyhhaGUpOiBUaGlzIGlzIHdvcmtpbmcgYXJvdW5kIGEgYnVnIGluIGtlcm5lbF9kcml2ZXJfdGVzdCBvcgogICAgICAgIC8vIGtlcm5lbF9kcml2ZXIuCiAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwogICAgICAgIGZvciAoTGlicmFyeSB0YXJnZXQgaW4gZGlsbFRhcmdldC5sb2FkZXIubGlicmFyaWVzKSB7CiAgICAgICAgICBpZiAodGFyZ2V0LmltcG9ydFVyaSA9PSB1cmkpIHsKICAgICAgICAgICAgbGlicmFyaWVzLmFkZCh0YXJnZXQpOwogICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIWZvdW5kICYmIHVyaS5wYXRoICE9ICJtaXJyb3JzIikgewogICAgICAgICAgLy8gZGFydDptaXJyb3JzIGlzIG9wdGlvbmFsLgogICAgICAgICAgdGhyb3cgIkNhbid0IGZpbmQgJHVyaSI7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGxpYnJhcmllcy5hZGQobGlicmFyeS50YXJnZXQpOwogICAgICB9CiAgICB9CiAgICBDb21wb25lbnQgcGxhZm9ybUxpYnJhcmllcyA9CiAgICAgICAgYmFja2VuZFRhcmdldC5jb25maWd1cmVDb21wb25lbnQobmV3IENvbXBvbmVudCgpKTsKICAgIC8vIEFkZCBsaWJyYXJpZXMgZGlyZWN0bHkgdG8gcHJldmVudCB0aGF0IHRoZWlyIHBhcmVudHMgYXJlIGNoYW5nZWQuCiAgICBwbGFmb3JtTGlicmFyaWVzLmxpYnJhcmllcy5hZGRBbGwobGlicmFyaWVzKTsKICAgIGxvYWRlci5jb21wdXRlQ29yZVR5cGVzKHBsYWZvcm1MaWJyYXJpZXMpOwogIH0KCiAgdm9pZCBmaW5pc2hBbGxDb25zdHJ1Y3RvcnMoTGlzdDxTb3VyY2VDbGFzc0J1aWxkZXI+IGJ1aWxkZXJzKSB7CiAgICBDbGFzcyBvYmplY3RDbGFzcyA9IHRoaXMub2JqZWN0Q2xhc3M7CiAgICBmb3IgKFNvdXJjZUNsYXNzQnVpbGRlciBidWlsZGVyIGluIGJ1aWxkZXJzKSB7CiAgICAgIENsYXNzIGNscyA9IGJ1aWxkZXIudGFyZ2V0OwogICAgICBpZiAoY2xzICE9IG9iamVjdENsYXNzKSB7CiAgICAgICAgZmluaXNoQ29uc3RydWN0b3JzKGJ1aWxkZXIpOwogICAgICB9CiAgICB9CiAgICB0aWNrZXIubG9nTXMoIkZpbmlzaGVkIGNvbnN0cnVjdG9ycyIpOwogIH0KCiAgLy8vIEVuc3VyZSBjb25zdHJ1Y3RvcnMgb2YgW2Nsc10gaGF2ZSB0aGUgY29ycmVjdCBpbml0aWFsaXplcnMgYW5kIG90aGVyCiAgLy8vIHJlcXVpcmVtZW50cy4KICB2b2lkIGZpbmlzaENvbnN0cnVjdG9ycyhTb3VyY2VDbGFzc0J1aWxkZXIgYnVpbGRlcikgewogICAgaWYgKGJ1aWxkZXIuaXNQYXRjaCkgcmV0dXJuOwogICAgQ2xhc3MgY2xzID0gYnVpbGRlci50YXJnZXQ7CgogICAgLy8vIFF1b3RlcyBiZWxvdyBhcmUgZnJvbSBbRGFydCBQcm9ncmFtbWluZyBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCA0dGgKICAgIC8vLyBFZGl0aW9uXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvcHVibGljYXRpb25zL2ZpbGVzL0VDTUEtU1QvRUNNQS00MDgucGRmKToKICAgIExpc3Q8RmllbGQ+IHVuaW5pdGlhbGl6ZWRGaWVsZHMgPSA8RmllbGQ+W107CiAgICBMaXN0PEZpZWxkPiBub25GaW5hbEZpZWxkcyA9IDxGaWVsZD5bXTsKICAgIGZvciAoRmllbGQgZmllbGQgaW4gY2xzLmZpZWxkcykgewogICAgICBpZiAoZmllbGQuaXNJbnN0YW5jZU1lbWJlciAmJiAhZmllbGQuaXNGaW5hbCkgewogICAgICAgIG5vbkZpbmFsRmllbGRzLmFkZChmaWVsZCk7CiAgICAgIH0KICAgICAgaWYgKGZpZWxkLmluaXRpYWxpemVyID09IG51bGwpIHsKICAgICAgICB1bmluaXRpYWxpemVkRmllbGRzLmFkZChmaWVsZCk7CiAgICAgIH0KICAgIH0KICAgIE1hcDxDb25zdHJ1Y3RvciwgU2V0PEZpZWxkPj4gY29uc3RydWN0b3JJbml0aWFsaXplZEZpZWxkcyA9CiAgICAgICAgPENvbnN0cnVjdG9yLCBTZXQ8RmllbGQ+Pnt9OwogICAgQ29uc3RydWN0b3Igc3VwZXJUYXJnZXQ7CiAgICBmb3IgKENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yIGluIGNscy5jb25zdHJ1Y3RvcnMpIHsKICAgICAgYm9vbCBpc1JlZGlyZWN0aW5nID0gZmFsc2U7CiAgICAgIGZvciAoSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgaW4gY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzKSB7CiAgICAgICAgaWYgKGluaXRpYWxpemVyIGlzIFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIpIHsKICAgICAgICAgIGlmIChjb25zdHJ1Y3Rvci5pc0NvbnN0ICYmICFpbml0aWFsaXplci50YXJnZXQuaXNDb25zdCkgewogICAgICAgICAgICBidWlsZGVyLmFkZFByb2JsZW0obWVzc2FnZUNvbnN0Q29uc3RydWN0b3JSZWRpcmVjdGlvblRvTm9uQ29uc3QsCiAgICAgICAgICAgICAgICBpbml0aWFsaXplci5maWxlT2Zmc2V0LCBpbml0aWFsaXplci50YXJnZXQubmFtZS5uYW1lLmxlbmd0aCk7CiAgICAgICAgICB9CiAgICAgICAgICBpc1JlZGlyZWN0aW5nID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIWlzUmVkaXJlY3RpbmcpIHsKICAgICAgICAvLy8gPklmIG5vIHN1cGVyaW5pdGlhbGl6ZXIgaXMgcHJvdmlkZWQsIGFuIGltcGxpY2l0IHN1cGVyaW5pdGlhbGl6ZXIKICAgICAgICAvLy8gPm9mIHRoZSBmb3JtIHN1cGVyKCkgaXMgYWRkZWQgYXQgdGhlIGVuZCBvZiBr4oCZcyBpbml0aWFsaXplciBsaXN0LAogICAgICAgIC8vLyA+dW5sZXNzIHRoZSBlbmNsb3NpbmcgY2xhc3MgaXMgY2xhc3MgT2JqZWN0LgogICAgICAgIGlmIChjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnMuaXNFbXB0eSkgewogICAgICAgICAgc3VwZXJUYXJnZXQgPz89IGRlZmF1bHRTdXBlckNvbnN0cnVjdG9yKGNscyk7CiAgICAgICAgICBJbml0aWFsaXplciBpbml0aWFsaXplcjsKICAgICAgICAgIGlmIChzdXBlclRhcmdldCA9PSBudWxsKSB7CiAgICAgICAgICAgIGJ1aWxkZXIuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgIHRlbXBsYXRlU3VwZXJjbGFzc0hhc05vRGVmYXVsdENvbnN0cnVjdG9yCiAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoY2xzLnN1cGVyY2xhc3MubmFtZSksCiAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvci5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgbm9MZW5ndGgpOwogICAgICAgICAgICBpbml0aWFsaXplciA9IG5ldyBJbnZhbGlkSW5pdGlhbGl6ZXIoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGluaXRpYWxpemVyID0KICAgICAgICAgICAgICAgIG5ldyBTdXBlckluaXRpYWxpemVyKHN1cGVyVGFyZ2V0LCBuZXcgQXJndW1lbnRzLmVtcHR5KCkpCiAgICAgICAgICAgICAgICAgIC4uaXNTeW50aGV0aWMgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzLmFkZChpbml0aWFsaXplcik7CiAgICAgICAgICBpbml0aWFsaXplci5wYXJlbnQgPSBjb25zdHJ1Y3RvcjsKICAgICAgICB9CiAgICAgICAgaWYgKGNvbnN0cnVjdG9yLmZ1bmN0aW9uLmJvZHkgPT0gbnVsbCkgewogICAgICAgICAgLy8vID5JZiBhIGdlbmVyYXRpdmUgY29uc3RydWN0b3IgYyBpcyBub3QgYSByZWRpcmVjdGluZyBjb25zdHJ1Y3RvcgogICAgICAgICAgLy8vID5hbmQgbm8gYm9keSBpcyBwcm92aWRlZCwgdGhlbiBjIGltcGxpY2l0bHkgaGFzIGFuIGVtcHR5IGJvZHkge30uCiAgICAgICAgICAvLy8gV2UgdXNlIGFuIGVtcHR5IHN0YXRlbWVudCBpbnN0ZWFkLgogICAgICAgICAgY29uc3RydWN0b3IuZnVuY3Rpb24uYm9keSA9IG5ldyBFbXB0eVN0YXRlbWVudCgpOwogICAgICAgICAgY29uc3RydWN0b3IuZnVuY3Rpb24uYm9keS5wYXJlbnQgPSBjb25zdHJ1Y3Rvci5mdW5jdGlvbjsKICAgICAgICB9CgogICAgICAgIFNldDxGaWVsZD4gbXlJbml0aWFsaXplZEZpZWxkcyA9IG5ldyBTZXQ8RmllbGQ+KCk7CiAgICAgICAgZm9yIChJbml0aWFsaXplciBpbml0aWFsaXplciBpbiBjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnMpIHsKICAgICAgICAgIGlmIChpbml0aWFsaXplciBpcyBGaWVsZEluaXRpYWxpemVyKSB7CiAgICAgICAgICAgIG15SW5pdGlhbGl6ZWRGaWVsZHMuYWRkKGluaXRpYWxpemVyLmZpZWxkKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChWYXJpYWJsZURlY2xhcmF0aW9uIGZvcm1hbAogICAgICAgICAgICBpbiBjb25zdHJ1Y3Rvci5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICAgICAgaWYgKGZvcm1hbC5pc0ZpZWxkRm9ybWFsKSB7CiAgICAgICAgICAgIERlY2xhcmF0aW9uIGZpZWxkQnVpbGRlciA9IGJ1aWxkZXIuc2NvcGUubG9jYWxbZm9ybWFsLm5hbWVdID8/CiAgICAgICAgICAgICAgICBidWlsZGVyLm9yaWdpbi5zY29wZS5sb2NhbFtmb3JtYWwubmFtZV07CiAgICAgICAgICAgIGlmIChmaWVsZEJ1aWxkZXIgaXMgS2VybmVsRmllbGRCdWlsZGVyKSB7CiAgICAgICAgICAgICAgbXlJbml0aWFsaXplZEZpZWxkcy5hZGQoZmllbGRCdWlsZGVyLmZpZWxkKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdHJ1Y3RvckluaXRpYWxpemVkRmllbGRzW2NvbnN0cnVjdG9yXSA9IG15SW5pdGlhbGl6ZWRGaWVsZHM7CiAgICAgICAgaWYgKGNvbnN0cnVjdG9yLmlzQ29uc3QgJiYgbm9uRmluYWxGaWVsZHMuaXNOb3RFbXB0eSkgewogICAgICAgICAgYnVpbGRlci5hZGRQcm9ibGVtKG1lc3NhZ2VDb25zdENvbnN0cnVjdG9yTm9uRmluYWxGaWVsZCwKICAgICAgICAgICAgICBjb25zdHJ1Y3Rvci5maWxlT2Zmc2V0LCBub0xlbmd0aCwKICAgICAgICAgICAgICBjb250ZXh0OiBub25GaW5hbEZpZWxkcwogICAgICAgICAgICAgICAgICAubWFwKChmaWVsZCkgPT4gbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JOb25GaW5hbEZpZWxkQ2F1c2UKICAgICAgICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oZmllbGQuZmlsZVVyaSwgZmllbGQuZmlsZU9mZnNldCwgbm9MZW5ndGgpKQogICAgICAgICAgICAgICAgICAudG9MaXN0KCkpOwogICAgICAgICAgbm9uRmluYWxGaWVsZHMuY2xlYXIoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIFNldDxGaWVsZD4gaW5pdGlhbGl6ZWRGaWVsZHM7CiAgICBjb25zdHJ1Y3RvckluaXRpYWxpemVkRmllbGRzCiAgICAgICAgLmZvckVhY2goKENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yLCBTZXQ8RmllbGQ+IGZpZWxkcykgewogICAgICBpZiAoaW5pdGlhbGl6ZWRGaWVsZHMgPT0gbnVsbCkgewogICAgICAgIGluaXRpYWxpemVkRmllbGRzID0gbmV3IFNldDxGaWVsZD4uZnJvbShmaWVsZHMpOwogICAgICB9IGVsc2UgewogICAgICAgIGluaXRpYWxpemVkRmllbGRzLmFkZEFsbChmaWVsZHMpOwogICAgICB9CiAgICB9KTsKCiAgICAvLyBSdW4gdGhyb3VnaCBhbGwgZmllbGRzIHRoYXQgYXJlbid0IGluaXRpYWxpemVkIGJ5IGFueSBjb25zdHJ1Y3RvciwgYW5kCiAgICAvLyBzZXQgdGhlaXIgaW5pdGlhbGl6ZXIgdG8gYG51bGxgLgogICAgZm9yIChGaWVsZCBmaWVsZCBpbiB1bmluaXRpYWxpemVkRmllbGRzKSB7CiAgICAgIGlmIChpbml0aWFsaXplZEZpZWxkcyA9PSBudWxsIHx8ICFpbml0aWFsaXplZEZpZWxkcy5jb250YWlucyhmaWVsZCkpIHsKICAgICAgICBmaWVsZC5pbml0aWFsaXplciA9IG5ldyBOdWxsTGl0ZXJhbCgpLi5wYXJlbnQgPSBmaWVsZDsKICAgICAgICBpZiAoZmllbGQuaXNGaW5hbCAmJgogICAgICAgICAgICAoY2xzLmNvbnN0cnVjdG9ycy5pc05vdEVtcHR5IHx8IGNscy5pc01peGluRGVjbGFyYXRpb24pKSB7CiAgICAgICAgICBTdHJpbmcgdXJpID0gJyR7ZmllbGQuZW5jbG9zaW5nTGlicmFyeS5pbXBvcnRVcml9JzsKICAgICAgICAgIFN0cmluZyBmaWxlID0gZmllbGQuZmlsZVVyaS5wYXRoU2VnbWVudHMubGFzdDsKICAgICAgICAgIGlmICh1cmkgPT0gJ2RhcnQ6aHRtbCcgfHwKICAgICAgICAgICAgICB1cmkgPT0gJ2RhcnQ6c3ZnJyB8fAogICAgICAgICAgICAgIHVyaSA9PSAnZGFydDpfbmF0aXZlX3R5cGVkX2RhdGEnIHx8CiAgICAgICAgICAgICAgdXJpID09ICdkYXJ0Ol9pbnRlcmNlcHRvcnMnICYmIGZpbGUgPT0gJ2pzX3N0cmluZy5kYXJ0JykgewogICAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2UgZXh0ZXJuYWwgZ2V0dGVycyBpbnN0ZWFkIG9mIGZpbmFsCiAgICAgICAgICAgIC8vIGZpZWxkcy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8zMzc2MgogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYnVpbGRlci5saWJyYXJ5LmFkZFByb2JsZW0oCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUZpbmFsRmllbGROb3RJbml0aWFsaXplZC53aXRoQXJndW1lbnRzKGZpZWxkLm5hbWUubmFtZSksCiAgICAgICAgICAgICAgICBmaWVsZC5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgZmllbGQubmFtZS5uYW1lLmxlbmd0aCwKICAgICAgICAgICAgICAgIGZpZWxkLmZpbGVVcmkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIFJ1biB0aHJvdWdoIGFsbCBmaWVsZHMgdGhhdCBhcmUgaW5pdGlhbGl6ZWQgYnkgc29tZSBjb25zdHJ1Y3RvciwgYW5kCiAgICAvLyBtYWtlIHN1cmUgdGhhdCBhbGwgb3RoZXIgY29uc3RydWN0b3JzIGFsc28gaW5pdGlhbGl6ZSB0aGVtLgogICAgY29uc3RydWN0b3JJbml0aWFsaXplZEZpZWxkcwogICAgICAgIC5mb3JFYWNoKChDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciwgU2V0PEZpZWxkPiBmaWVsZHMpIHsKICAgICAgZm9yIChGaWVsZCBmaWVsZCBpbiBpbml0aWFsaXplZEZpZWxkcy5kaWZmZXJlbmNlKGZpZWxkcykpIHsKICAgICAgICBpZiAoZmllbGQuaW5pdGlhbGl6ZXIgPT0gbnVsbCkgewogICAgICAgICAgRmllbGRJbml0aWFsaXplciBpbml0aWFsaXplciA9CiAgICAgICAgICAgICAgbmV3IEZpZWxkSW5pdGlhbGl6ZXIoZmllbGQsIG5ldyBOdWxsTGl0ZXJhbCgpKQogICAgICAgICAgICAgICAgLi5pc1N5bnRoZXRpYyA9IHRydWU7CiAgICAgICAgICBpbml0aWFsaXplci5wYXJlbnQgPSBjb25zdHJ1Y3RvcjsKICAgICAgICAgIGNvbnN0cnVjdG9yLmluaXRpYWxpemVycy5pbnNlcnQoMCwgaW5pdGlhbGl6ZXIpOwogICAgICAgICAgaWYgKGZpZWxkLmlzRmluYWwpIHsKICAgICAgICAgICAgYnVpbGRlci5saWJyYXJ5LmFkZFByb2JsZW0oCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUZpbmFsRmllbGROb3RJbml0aWFsaXplZEJ5Q29uc3RydWN0b3IKICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhmaWVsZC5uYW1lLm5hbWUpLAogICAgICAgICAgICAgICAgY29uc3RydWN0b3IuZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yLm5hbWUubmFtZS5sZW5ndGgsCiAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvci5maWxlVXJpLAogICAgICAgICAgICAgICAgY29udGV4dDogWwogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZU1pc3NpbmdJbXBsZW1lbnRhdGlvbkNhdXNlCiAgICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhmaWVsZC5uYW1lLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKGZpZWxkLmZpbGVVcmksIGZpZWxkLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQubmFtZS5uYW1lLmxlbmd0aCkKICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgfQoKICAvLy8gUnVuIGFsbCB0cmFuc2Zvcm1hdGlvbnMgdGhhdCBhcmUgbmVlZGVkIHdoZW4gYnVpbGRpbmcgYSBidW5kbGUgb2YKICAvLy8gbGlicmFyaWVzIGZvciB0aGUgZmlyc3QgdGltZS4KICB2b2lkIHJ1bkJ1aWxkVHJhbnNmb3JtYXRpb25zKCkgewogICAgaWYgKGxvYWRlci50YXJnZXQuZW5hYmxlQ29uc3RhbnRVcGRhdGUyMDE4KSB7CiAgICAgIFR5cGVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9CiAgICAgICAgICBuZXcgVHlwZUVudmlyb25tZW50KGxvYWRlci5jb3JlVHlwZXMsIGxvYWRlci5oaWVyYXJjaHkpOwogICAgICBjb25zdGFudHMudHJhbnNmb3JtTGlicmFyaWVzKAogICAgICAgICAgbG9hZGVyLmxpYnJhcmllcywKICAgICAgICAgIGJhY2tlbmRUYXJnZXQuY29uc3RhbnRzQmFja2VuZChsb2FkZXIuY29yZVR5cGVzKSwKICAgICAgICAgIGVudmlyb25tZW50RGVmaW5lcywKICAgICAgICAgIGVudmlyb25tZW50LAogICAgICAgICAgbmV3IEtlcm5lbENvbnN0YW50RXJyb3JSZXBvcnRlcihsb2FkZXIpLAogICAgICAgICAgZW5hYmxlQXNzZXJ0czogZW5hYmxlQXNzZXJ0cywKICAgICAgICAgIGRlc3VnYXJTZXRzOiAhYmFja2VuZFRhcmdldC5zdXBwb3J0c1NldExpdGVyYWxzKTsKICAgICAgdGlja2VyLmxvZ01zKCJFdmFsdWF0ZWQgY29uc3RhbnRzIik7CiAgICB9CiAgICBiYWNrZW5kVGFyZ2V0LnBlcmZvcm1Nb2R1bGFyVHJhbnNmb3JtYXRpb25zT25MaWJyYXJpZXMoCiAgICAgICAgY29tcG9uZW50LAogICAgICAgIGxvYWRlci5jb3JlVHlwZXMsCiAgICAgICAgbG9hZGVyLmhpZXJhcmNoeSwKICAgICAgICBsb2FkZXIubGlicmFyaWVzLAogICAgICAgIG5ldyBLZXJuZWxEaWFnbm9zdGljUmVwb3J0ZXIobG9hZGVyKSwKICAgICAgICBsb2dnZXI6IChTdHJpbmcgbXNnKSA9PiB0aWNrZXIubG9nTXMobXNnKSk7CiAgfQoKICB2b2lkIHJ1blByb2NlZHVyZVRyYW5zZm9ybWF0aW9ucyhQcm9jZWR1cmUgcHJvY2VkdXJlKSB7CiAgICBiYWNrZW5kVGFyZ2V0LnBlcmZvcm1UcmFuc2Zvcm1hdGlvbnNPblByb2NlZHVyZSgKICAgICAgICBsb2FkZXIuY29yZVR5cGVzLCBsb2FkZXIuaGllcmFyY2h5LCBwcm9jZWR1cmUsCiAgICAgICAgbG9nZ2VyOiAoU3RyaW5nIG1zZykgPT4gdGlja2VyLmxvZ01zKG1zZykpOwogIH0KCiAgdm9pZCB2ZXJpZnkoKSB7CiAgICAvLyBUT0RPKGFoZSk6IEhvdyB0byBoYW5kbGUgZXJyb3JzLgogICAgdmVyaWZ5Q29tcG9uZW50KGNvbXBvbmVudCk7CiAgICB0aWNrZXIubG9nTXMoIlZlcmlmaWVkIGNvbXBvbmVudCIpOwogIH0KCiAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFtsaWJyYXJ5XSB3YXMgYnVpbHQgYnkgdGhpcyBbS2VybmVsVGFyZ2V0XQogIC8vLyBmcm9tIHNvdXJjZXMsIGFuZCBub3QgbG9hZGVkIGZyb20gYSBbRGlsbFRhcmdldF0uCiAgYm9vbCBpc1NvdXJjZUxpYnJhcnkoTGlicmFyeSBsaWJyYXJ5KSB7CiAgICByZXR1cm4gbG9hZGVyLmxpYnJhcmllcy5jb250YWlucyhsaWJyYXJ5KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVhZFBhdGNoRmlsZXMoS2VybmVsTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgYXNzZXJ0KGxpYnJhcnkudXJpLnNjaGVtZSA9PSAiZGFydCIpOwogICAgTGlzdDxVcmk+IHBhdGNoZXMgPSB1cmlUcmFuc2xhdG9yLmdldERhcnRQYXRjaGVzKGxpYnJhcnkudXJpLnBhdGgpOwogICAgaWYgKHBhdGNoZXMgIT0gbnVsbCkgewogICAgICBLZXJuZWxMaWJyYXJ5QnVpbGRlciBmaXJzdDsKICAgICAgZm9yIChVcmkgcGF0Y2ggaW4gcGF0Y2hlcykgewogICAgICAgIGlmIChmaXJzdCA9PSBudWxsKSB7CiAgICAgICAgICBmaXJzdCA9IGxpYnJhcnkubG9hZGVyLnJlYWQocGF0Y2gsIC0xLAogICAgICAgICAgICAgIGZpbGVVcmk6IHBhdGNoLCBvcmlnaW46IGxpYnJhcnksIGFjY2Vzc29yOiBsaWJyYXJ5KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gSWYgdGhlcmUncyBtb3JlIHRoYW4gb25lIHBhdGNoIGZpbGUsIGl0J3MgaW50ZXJwcmV0ZWQgYXMgYSBwYXJ0IG9mCiAgICAgICAgICAvLyB0aGUgcGF0Y2ggbGlicmFyeS4KICAgICAgICAgIEtlcm5lbExpYnJhcnlCdWlsZGVyIHBhcnQgPSBsaWJyYXJ5LmxvYWRlci5yZWFkKHBhdGNoLCAtMSwKICAgICAgICAgICAgICBvcmlnaW46IGxpYnJhcnksIGZpbGVVcmk6IHBhdGNoLCBhY2Nlc3NvcjogbGlicmFyeSk7CiAgICAgICAgICBmaXJzdC5wYXJ0cy5hZGQocGFydCk7CiAgICAgICAgICBmaXJzdC5wYXJ0T2Zmc2V0cy5hZGQoLTEpOwogICAgICAgICAgcGFydC5wYXJ0T2ZVcmkgPSBmaXJzdC51cmk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgovLy8gTG9va3MgZm9yIGEgY29uc3RydWN0b3IgY2FsbCB0aGF0IG1hdGNoZXMgYHN1cGVyKClgIGZyb20gYSBjb25zdHJ1Y3RvciBpbgovLy8gW2Nsc10uIFN1Y2ggYSBjb25zdHJ1Y3RvciBtYXkgaGF2ZSBvcHRpb25hbCBhcmd1bWVudHMsIGJ1dCBubyByZXF1aXJlZAovLy8gYXJndW1lbnRzLgpDb25zdHJ1Y3RvciBkZWZhdWx0U3VwZXJDb25zdHJ1Y3RvcihDbGFzcyBjbHMpIHsKICBDbGFzcyBzdXBlcmNsYXNzID0gY2xzLnN1cGVyY2xhc3M7CiAgaWYgKHN1cGVyY2xhc3MgIT0gbnVsbCkgewogICAgZm9yIChDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciBpbiBzdXBlcmNsYXNzLmNvbnN0cnVjdG9ycykgewogICAgICBpZiAoY29uc3RydWN0b3IubmFtZS5uYW1lLmlzRW1wdHkpIHsKICAgICAgICByZXR1cm4gY29uc3RydWN0b3IuZnVuY3Rpb24ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA9PSAwCiAgICAgICAgICAgID8gY29uc3RydWN0b3IKICAgICAgICAgICAgOiBudWxsOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBudWxsOwp9CgpjbGFzcyBLZXJuZWxEaWFnbm9zdGljUmVwb3J0ZXIKICAgIGV4dGVuZHMgRGlhZ25vc3RpY1JlcG9ydGVyPE1lc3NhZ2UsIExvY2F0ZWRNZXNzYWdlPiB7CiAgZmluYWwgTG9hZGVyPExpYnJhcnk+IGxvYWRlcjsKCiAgS2VybmVsRGlhZ25vc3RpY1JlcG9ydGVyKHRoaXMubG9hZGVyKTsKCiAgdm9pZCByZXBvcnQoTWVzc2FnZSBtZXNzYWdlLCBpbnQgY2hhck9mZnNldCwgaW50IGxlbmd0aCwgVXJpIGZpbGVVcmksCiAgICAgIHtMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0fSkgewogICAgbG9hZGVyLmFkZFByb2JsZW0obWVzc2FnZSwgY2hhck9mZnNldCwgbm9MZW5ndGgsIGZpbGVVcmksIGNvbnRleHQ6IGNvbnRleHQpOwogIH0KfQqDXwBOTjwBHQEhASEJExcPExUSGBQPGhYVFxwRDhkVEyAQGhcbHRUBNgE7AUUBRAE/ATgBMAEzAUIBOwElARoJGi4zNhIqNyQsMwEqAS4BRgE5AUIBNAFHAR0JFh8VHBwcHiAgGBoVIAFBATkBLQEyPR8BNR4BHwE0LQEXARcBTwEmMgFLATMBTwExOgFMATEBTSMtIS9MHQQBOAEhOwEdUBtABAFHNCIoKikTGBgVFRERRys6OTsvKFBFI0gYFyEmJxcQDgwIHk0GEwQBDCc7HzUdGAgGQwQBODA+QCY7JjFBIAwKCAgTBAEqICIaHEMiHyAEAQxEKzQqJC43HSU1Mx1PKzVDHywiLyQSThoZRSEyKRwoLjMzJUArGDMEAUZOS09ABkgRDEErNCoiICstPyQjKCEBIUAYMwQBJDUrLwY8Q0UGBAFJJUYzATsuJ0seFAYBKgFKTiAxID0tMDUIMzY1LzUKCAYBJUUGASYWBAEkKkAmOyY2MywmPCg9MA4ySkkODAoICD0EAUkqMz9FKjIRLgoIBjYEAUcBMwFGPylNOEo4IgYBRVFMSUhNBAFDKDIySQ4GAUVRShcNAUtKTT0fKiYkJA1IMAYoMAYrMFEPNzpGS1EKCDJPDU0wBgQBRk9BKTY9IT4IEwYBTkkyNyQ4NEIGTzZEIiVABkM0Kk01OT8lIDIbPwQBIjhKTRA3OCpMSk4vHkZQCAYbNgQBPRwvRBwcBAE9PkVGRAZCBAEcKysYFExPQxkTFQksNR1MGhw+KSMaEwwKLycjCg8nCAYhO0kyLwQBQiozIiAlCAYrBAFLFDghIAFMXTEsJjYjCCcoCAZAJR04IkI1RE1ODCARCggcTk45MDgjJSA6OSgbNBMaSSgMNSwKMU5QMTxDCgE7RDE4DAooPCZLOTY7DgwKSUBDMCZMUB4iCggGIiFAJzkPKggIAU4oL00/HUc+OSQjMklKSRMoUSIoIAwKCAYBTEMhQEIpKT0mLDsfKD41KC4lGzU2RTIUDAoICAQBSCQjMiRDJBw8HhczKDwrBjwTGhoaLjQEATo1NzQEARIoICgEAUw4Ki8EAQw2KkgbIiMdMUMRUCBFQyElJgoIBgQCAU5LDzElHD8rQBoUCAYEDwIBHzogASkBSChRBAIBNXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX3RhcmdldC5kYXJ0NnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvdXRpbHMuZGFydJENLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDphc3luYycgc2hvdyBGdXR1cmU7CgppbXBvcnQgJ2RhcnQ6aW8nIHNob3cgQnl0ZXNCdWlsZGVyLCBGaWxlLCBJT1Npbms7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2Nsb25lLmRhcnQnIHNob3cgQ2xvbmVWaXNpdG9yOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBMaWJyYXJ5LAogICAgICAgIENvbXBvbmVudCwKICAgICAgICBQcm9jZWR1cmUsCiAgICAgICAgQ2xhc3MsCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBTdXBlcnR5cGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2JpbmFyeS9hc3RfdG9fYmluYXJ5LmRhcnQnIHNob3cgQmluYXJ5UHJpbnRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYmluYXJ5L2xpbWl0ZWRfYXN0X3RvX2JpbmFyeS5kYXJ0JwogICAgc2hvdyBMaW1pdGVkQmluYXJ5UHJpbnRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdGV4dC9hc3RfdG9fdGV4dC5kYXJ0JyBzaG93IFByaW50ZXI7CgovLy8gUHJpbnQgdGhlIGdpdmVuIFtjb21wb25lbnRdLiAgRG8gbm90aGluZyBpZiBpdCBpcyBgbnVsbGAuICBJZiB0aGUKLy8vIFtsaWJyYXJ5RmlsdGVyXSBpcyBwcm92aWRlZCwgdGhlbiBvbmx5IGxpYnJhcmllcyB0aGF0IHNhdGlzZnkgaXQgYXJlCi8vLyBwcmludGVkLgp2b2lkIHByaW50Q29tcG9uZW50VGV4dChDb21wb25lbnQgY29tcG9uZW50LAogICAge2Jvb2wgbGlicmFyeUZpbHRlcihMaWJyYXJ5IGxpYnJhcnkpfSkgewogIGlmIChjb21wb25lbnQgPT0gbnVsbCkgcmV0dXJuOwogIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICBQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcihzYik7CiAgcHJpbnRlci53cml0ZUNvbXBvbmVudFByb2JsZW1zKGNvbXBvbmVudCk7CiAgZm9yIChMaWJyYXJ5IGxpYnJhcnkgaW4gY29tcG9uZW50LmxpYnJhcmllcykgewogICAgaWYgKGxpYnJhcnlGaWx0ZXIgIT0gbnVsbCAmJiAhbGlicmFyeUZpbHRlcihsaWJyYXJ5KSkgY29udGludWU7CiAgICBwcmludGVyLndyaXRlTGlicmFyeUZpbGUobGlicmFyeSk7CiAgfQogIHByaW50ZXIud3JpdGVDb25zdGFudFRhYmxlKGNvbXBvbmVudCk7CiAgcHJpbnQoc2IpOwp9CgovLy8gV3JpdGUgW2NvbXBvbmVudF0gdG8gZmlsZSBvbmx5IGluY2x1ZGluZyBsaWJyYXJpZXMgdGhhdCBtYXRjaCBbZmlsdGVyXS4KRnV0dXJlPE51bGw+IHdyaXRlQ29tcG9uZW50VG9GaWxlKENvbXBvbmVudCBjb21wb25lbnQsIFVyaSB1cmksCiAgICB7Ym9vbCBmaWx0ZXIoTGlicmFyeSBsaWJyYXJ5KX0pIGFzeW5jIHsKICBGaWxlIG91dHB1dCA9IG5ldyBGaWxlLmZyb21VcmkodXJpKTsKICBJT1Npbmsgc2luayA9IG91dHB1dC5vcGVuV3JpdGUoKTsKICB0cnkgewogICAgQmluYXJ5UHJpbnRlciBwcmludGVyID0gZmlsdGVyID09IG51bGwKICAgICAgICA/IG5ldyBCaW5hcnlQcmludGVyKHNpbmspCiAgICAgICAgOiBuZXcgTGltaXRlZEJpbmFyeVByaW50ZXIoc2luaywgZmlsdGVyID8/IChfKSA9PiB0cnVlLCBmYWxzZSk7CiAgICBwcmludGVyLndyaXRlQ29tcG9uZW50RmlsZShjb21wb25lbnQpOwogIH0gZmluYWxseSB7CiAgICBhd2FpdCBzaW5rLmNsb3NlKCk7CiAgfQp9CgovLy8gU2VyaWFsaXplIHRoZSBsaWJyYXJpZXMgaW4gW2NvbXBvbmVudF0gdGhhdCBtYXRjaCBbZmlsdGVyXS4KTGlzdDxpbnQ+IHNlcmlhbGl6ZUNvbXBvbmVudChDb21wb25lbnQgY29tcG9uZW50LAogICAge2Jvb2wgZmlsdGVyKExpYnJhcnkgbGlicmFyeSksIGJvb2wgaW5jbHVkZVNvdXJjZXM6IHRydWV9KSB7CiAgQnl0ZVNpbmsgYnl0ZVNpbmsgPSBuZXcgQnl0ZVNpbmsoKTsKICBCaW5hcnlQcmludGVyIHByaW50ZXIgPSBmaWx0ZXIgPT0gbnVsbAogICAgICA/IG5ldyBCaW5hcnlQcmludGVyKGJ5dGVTaW5rLCBpbmNsdWRlU291cmNlczogaW5jbHVkZVNvdXJjZXMpCiAgICAgIDogbmV3IExpbWl0ZWRCaW5hcnlQcmludGVyKAogICAgICAgICAgYnl0ZVNpbmssIGZpbHRlciA/PyAoXykgPT4gdHJ1ZSwgIWluY2x1ZGVTb3VyY2VzKTsKICBwcmludGVyLndyaXRlQ29tcG9uZW50RmlsZShjb21wb25lbnQpOwogIHJldHVybiBieXRlU2luay5idWlsZGVyLnRha2VCeXRlcygpOwp9Cgpjb25zdCBTdHJpbmcga0RlYnVnQ2xhc3NOYW1lID0gIiNEZWJ1Z0NsYXNzIjsKCkxpc3Q8aW50PiBzZXJpYWxpemVQcm9jZWR1cmUoUHJvY2VkdXJlIHByb2NlZHVyZSkgewogIExpYnJhcnkgZmFrZUxpYnJhcnkgPQogICAgICBuZXcgTGlicmFyeShuZXcgVXJpKHNjaGVtZTogJ2V2YWx1YXRlJywgcGF0aDogJ3NvdXJjZScpKTsKCiAgaWYgKHByb2NlZHVyZS5wYXJlbnQgaXMgQ2xhc3MpIHsKICAgIENsYXNzIHJlYWxDbGFzcyA9IHByb2NlZHVyZS5wYXJlbnQ7CgogICAgQ2xhc3MgZmFrZUNsYXNzID0gbmV3IENsYXNzKG5hbWU6IGtEZWJ1Z0NsYXNzTmFtZSk7CiAgICBNYXA8VHlwZVBhcmFtZXRlciwgVHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtcyA9CiAgICAgICAgPFR5cGVQYXJhbWV0ZXIsIFR5cGVQYXJhbWV0ZXI+e307CiAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHR5cGVTdWJzdGl0dXRpb24gPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICBmb3IgKFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtIGluIHJlYWxDbGFzcy50eXBlUGFyYW1ldGVycykgewogICAgICB2YXIgbmV3Tm9kZSA9IG5ldyBUeXBlUGFyYW1ldGVyKHR5cGVQYXJhbS5uYW1lKTsKICAgICAgdHlwZVBhcmFtc1t0eXBlUGFyYW1dID0gbmV3Tm9kZTsKICAgICAgdHlwZVN1YnN0aXR1dGlvblt0eXBlUGFyYW1dID0gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlKG5ld05vZGUpOwogICAgfQogICAgQ2xvbmVWaXNpdG9yIGNsb25lciA9IG5ldyBDbG9uZVZpc2l0b3IoCiAgICAgICAgdHlwZVN1YnN0aXR1dGlvbjogdHlwZVN1YnN0aXR1dGlvbiwgdHlwZVBhcmFtczogdHlwZVBhcmFtcyk7CgogICAgZm9yIChUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbSBpbiByZWFsQ2xhc3MudHlwZVBhcmFtZXRlcnMpIHsKICAgICAgZmFrZUNsYXNzLnR5cGVQYXJhbWV0ZXJzLmFkZCh0eXBlUGFyYW0uYWNjZXB0KGNsb25lcikpOwogICAgfQoKICAgIGZha2VDbGFzcy5wYXJlbnQgPSBmYWtlTGlicmFyeTsKICAgIGlmIChyZWFsQ2xhc3Muc3VwZXJ0eXBlICE9IG51bGwpIHsKICAgICAgLy8gc3VwZXJ0eXBlIGlzIG51bGwgZm9yIE9iamVjdC4KICAgICAgZmFrZUNsYXNzLnN1cGVydHlwZSA9IG5ldyBTdXBlcnR5cGUuYnlSZWZlcmVuY2UoCiAgICAgICAgICByZWFsQ2xhc3Muc3VwZXJ0eXBlLmNsYXNzTmFtZSwKICAgICAgICAgIHJlYWxDbGFzcy5zdXBlcnR5cGUudHlwZUFyZ3VtZW50cy5tYXAoY2xvbmVyLnZpc2l0VHlwZSkudG9MaXN0KCkpOwogICAgfQoKICAgIC8vIFJlYmluZCB0aGUgdHlwZSBwYXJhbWV0ZXJzIGluIHRoZSBwcm9jZWR1cmUuCiAgICBwcm9jZWR1cmUgPSBwcm9jZWR1cmUuYWNjZXB0KGNsb25lcik7CiAgICBwcm9jZWR1cmUucGFyZW50ID0gZmFrZUNsYXNzOwogICAgZmFrZUNsYXNzLnByb2NlZHVyZXMuYWRkKHByb2NlZHVyZSk7CiAgICBmYWtlTGlicmFyeS5jbGFzc2VzLmFkZChmYWtlQ2xhc3MpOwogIH0gZWxzZSB7CiAgICBmYWtlTGlicmFyeS5wcm9jZWR1cmVzLmFkZChwcm9jZWR1cmUpOwogICAgcHJvY2VkdXJlLnBhcmVudCA9IGZha2VMaWJyYXJ5OwogIH0KCiAgLy8gVE9ETyh2ZWdvcm92KSBmaW5kIGEgd2F5IHRvIHByZXNlcnZlIG1ldGFkYXRhLgogIENvbXBvbmVudCBwcm9ncmFtID0gbmV3IENvbXBvbmVudChsaWJyYXJpZXM6IFtmYWtlTGlicmFyeV0pOwogIHJldHVybiBzZXJpYWxpemVDb21wb25lbnQocHJvZ3JhbSk7Cn0KCi8vLyBBIFtTaW5rXSB0aGF0IGRpcmVjdGx5IHdyaXRlcyBkYXRhIGludG8gYSBieXRlIGJ1aWxkZXIuCmNsYXNzIEJ5dGVTaW5rIGltcGxlbWVudHMgU2luazxMaXN0PGludD4+IHsKICBmaW5hbCBCeXRlc0J1aWxkZXIgYnVpbGRlciA9IG5ldyBCeXRlc0J1aWxkZXIoKTsKCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGRhdGEpIHsKICAgIGJ1aWxkZXIuYWRkKGRhdGEpOwogIH0KCiAgdm9pZCBjbG9zZSgpIHt9Cn0KgIQATk48ASEBMgE2ASEJEhETEw8XGxMBRgE6HwE8AUZJDS0tISglLTFEJwQpDQIBTEAsJyQIKyJIKw4YBAIBQDJBJilEIj0pJwIBLgE0GEABIygBODMqUUA3J0QGLEUBQD4GASQnJzcpTQYBNCoiKSgLKyQEATQ/JgIBPCwzAR0XBAESAgEtcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC91dGlscy5kYXJ0OXNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvdmVyaWZpZXIuZGFydJfsLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEudmVyaWZpZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIEFzRXhwcmVzc2lvbiwKICAgICAgICBDbGFzcywKICAgICAgICBDb21wb25lbnQsCiAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudCwKICAgICAgICBGaWVsZCwKICAgICAgICBJbnZhbGlkSW5pdGlhbGl6ZXIsCiAgICAgICAgTGV0LAogICAgICAgIExpYnJhcnksCiAgICAgICAgTWVtYmVyLAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBTdGF0aWNJbnZvY2F0aW9uLAogICAgICAgIFN1cGVyTWV0aG9kSW52b2NhdGlvbiwKICAgICAgICBTdXBlclByb3BlcnR5R2V0LAogICAgICAgIFN1cGVyUHJvcGVydHlTZXQsCiAgICAgICAgVHJlZU5vZGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3RyYW5zZm9ybWF0aW9ucy9mbGFncy5kYXJ0JyBzaG93IFRyYW5zZm9ybWVyRmxhZzsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdmVyaWZpZXIuZGFydCcgc2hvdyBWZXJpZnlpbmdWaXNpdG9yOwoKaW1wb3J0ICcuLi9jb21waWxlcl9jb250ZXh0LmRhcnQnIHNob3cgQ29tcGlsZXJDb250ZXh0OwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdyBMb2NhdGVkTWVzc2FnZSwgbm9MZW5ndGgsIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVmVyaWZpY2F0aW9uRXJyb3I7CgppbXBvcnQgJy4uL3NldmVyaXR5LmRhcnQnIHNob3cgU2V2ZXJpdHk7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfc2NoZW1hLmRhcnQnIHNob3cgVHlwZVNjaGVtYVZpc2l0b3IsIFVua25vd25UeXBlOwoKaW1wb3J0ICdrZXJuZWxfc2hhZG93X2FzdC5kYXJ0JyBzaG93IFN5bnRoZXRpY0V4cHJlc3Npb25KdWRnbWVudDsKCmltcG9ydCAncmVkaXJlY3RpbmdfZmFjdG9yeV9ib2R5LmRhcnQnCiAgICBzaG93IFJlZGlyZWN0aW5nRmFjdG9yeUJvZHksIGdldFJlZGlyZWN0aW5nRmFjdG9yeUJvZHk7CgpMaXN0PExvY2F0ZWRNZXNzYWdlPiB2ZXJpZnlDb21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCwKICAgIHtib29sIGlzT3V0bGluZTogZmFsc2UsIGJvb2wgc2tpcFBsYXRmb3JtOiBmYWxzZX0pIHsKICBGYXN0YVZlcmlmeWluZ1Zpc2l0b3IgdmVyaWZpZXIgPQogICAgICBuZXcgRmFzdGFWZXJpZnlpbmdWaXNpdG9yKGlzT3V0bGluZSwgc2tpcFBsYXRmb3JtKTsKICBjb21wb25lbnQuYWNjZXB0KHZlcmlmaWVyKTsKICByZXR1cm4gdmVyaWZpZXIuZXJyb3JzOwp9CgpjbGFzcyBGYXN0YVZlcmlmeWluZ1Zpc2l0b3IgZXh0ZW5kcyBWZXJpZnlpbmdWaXNpdG9yCiAgICBpbXBsZW1lbnRzIFR5cGVTY2hlbWFWaXNpdG9yIHsKICBmaW5hbCBMaXN0PExvY2F0ZWRNZXNzYWdlPiBlcnJvcnMgPSA8TG9jYXRlZE1lc3NhZ2U+W107CgogIFVyaSBmaWxlVXJpOwogIGZpbmFsIGJvb2wgc2tpcFBsYXRmb3JtOwoKICBGYXN0YVZlcmlmeWluZ1Zpc2l0b3IoYm9vbCBpc091dGxpbmUsIHRoaXMuc2tpcFBsYXRmb3JtKSB7CiAgICB0aGlzLmlzT3V0bGluZSA9IGlzT3V0bGluZTsKICB9CgogIFVyaSBjaGVja0xvY2F0aW9uKFRyZWVOb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBVcmkgZmlsZVVyaSkgewogICAgaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmNvbnRhaW5zKCIjIikpIHsKICAgICAgLy8gVE9ETyhhaGUpOiBJbnZlc3RpZ2F0ZSBpZiB0aGVzZSBjaGVja3MgY2FuIGJlIGVuYWJsZWQ6CiAgICAgIC8vIGlmIChub2RlLmZpbGVVcmkgIT0gbnVsbCAmJiBub2RlIGlzISBMaWJyYXJ5KSB7CiAgICAgIC8vICAgcHJvYmxlbShub2RlLCAiQSBzeW50aGV0aWMgbm9kZSBzaG91bGRuJ3QgaGF2ZSBhIGZpbGVVcmkiLAogICAgICAvLyAgICAgICBjb250ZXh0OiBub2RlKTsKICAgICAgLy8gfQogICAgICAvLyBpZiAobm9kZS5maWxlT2Zmc2V0ICE9IC0xKSB7CiAgICAgIC8vICAgcHJvYmxlbShub2RlLCAiQSBzeW50aGV0aWMgbm9kZSBzaG91bGRuJ3QgaGF2ZSBhIGZpbGVPZmZzZXQiLAogICAgICAvLyAgICAgICBjb250ZXh0OiBub2RlKTsKICAgICAgLy8gfQogICAgICByZXR1cm4gZmlsZVVyaTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChmaWxlVXJpID09IG51bGwpIHsKICAgICAgICBwcm9ibGVtKG5vZGUsICInJG5hbWUnIGhhcyBubyBmaWxlVXJpIiwgY29udGV4dDogbm9kZSk7CiAgICAgICAgcmV0dXJuIGZpbGVVcmk7CiAgICAgIH0KICAgICAgaWYgKG5vZGUuZmlsZU9mZnNldCA9PSAtMSAmJiBub2RlIGlzISBMaWJyYXJ5KSB7CiAgICAgICAgcHJvYmxlbShub2RlLCAiJyRuYW1lJyBoYXMgbm8gZmlsZU9mZnNldCIsIGNvbnRleHQ6IG5vZGUpOwogICAgICB9CiAgICAgIHJldHVybiBmaWxlVXJpOwogICAgfQogIH0KCiAgdm9pZCBjaGVja1N1cGVySW52b2NhdGlvbihUcmVlTm9kZSBub2RlKSB7CiAgICB2YXIgY29udGFpbmluZ01lbWJlciA9IGdldENvbnRhaW5pbmdNZW1iZXIobm9kZSk7CiAgICBpZiAoY29udGFpbmluZ01lbWJlciA9PSBudWxsKSB7CiAgICAgIHByb2JsZW0obm9kZSwgJ1N1cGVyIGNhbGwgb3V0c2lkZSBvZiBhbnkgbWVtYmVyJyk7CiAgICB9IGVsc2UgewogICAgICBpZiAoY29udGFpbmluZ01lbWJlci50cmFuc2Zvcm1lckZsYWdzICYgVHJhbnNmb3JtZXJGbGFnLnN1cGVyQ2FsbHMgPT0gMCkgewogICAgICAgIHByb2JsZW0oCiAgICAgICAgICAgIG5vZGUsICdTdXBlciBjYWxsIGluIGEgbWVtYmVyIGxhY2tpbmcgVHJhbnNmb3JtZXJGbGFnLnN1cGVyQ2FsbHMnKTsKICAgICAgfQogICAgfQogIH0KCiAgTWVtYmVyIGdldENvbnRhaW5pbmdNZW1iZXIoVHJlZU5vZGUgbm9kZSkgewogICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkgewogICAgICBpZiAobm9kZSBpcyBNZW1iZXIpIHJldHVybiBub2RlOwogICAgICBub2RlID0gbm9kZS5wYXJlbnQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHByb2JsZW0oVHJlZU5vZGUgbm9kZSwgU3RyaW5nIGRldGFpbHMsIHtUcmVlTm9kZSBjb250ZXh0fSkgewogICAgbm9kZSA/Pz0gKGNvbnRleHQgPz8gdGhpcy5jb250ZXh0KTsKICAgIGludCBvZmZzZXQgPSBub2RlPy5maWxlT2Zmc2V0ID8/IC0xOwogICAgVXJpIGZpbGUgPSBub2RlPy5sb2NhdGlvbj8uZmlsZSA/PyBmaWxlVXJpOwogICAgVXJpIHVyaSA9IGZpbGUgPT0gbnVsbCA/IG51bGwgOiBmaWxlOwogICAgTG9jYXRlZE1lc3NhZ2UgbWVzc2FnZSA9IHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVmVyaWZpY2F0aW9uRXJyb3IKICAgICAgICAud2l0aEFyZ3VtZW50cyhkZXRhaWxzKQogICAgICAgIC53aXRoTG9jYXRpb24odXJpLCBvZmZzZXQsIG5vTGVuZ3RoKTsKICAgIENvbXBpbGVyQ29udGV4dC5jdXJyZW50LnJlcG9ydChtZXNzYWdlLCBTZXZlcml0eS5lcnJvcik7CiAgICBlcnJvcnMuYWRkKG1lc3NhZ2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRBc0V4cHJlc3Npb24oQXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIHN1cGVyLnZpc2l0QXNFeHByZXNzaW9uKG5vZGUpOwogICAgaWYgKG5vZGUuZmlsZU9mZnNldCA9PSAtMSkgewogICAgICBUcmVlTm9kZSBwYXJlbnQgPSBub2RlLnBhcmVudDsKICAgICAgd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7CiAgICAgICAgaWYgKHBhcmVudC5maWxlT2Zmc2V0ICE9IC0xKSBicmVhazsKICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50OwogICAgICB9CiAgICAgIHByb2JsZW0ocGFyZW50LCAiTm8gb2Zmc2V0IGZvciAkbm9kZSIsIGNvbnRleHQ6IG5vZGUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgewogICAgLy8gQnlwYXNzIHZlcmlmaWNhdGlvbiBvZiB0aGUgW1N0YXRpY0dldF0gaW4gW1JlZGlyZWN0aW5nRmFjdG9yeUJvZHldIGFzCiAgICAvLyB0aGlzIGlzIGEgc3RhdGljIGdldCB3aXRob3V0IGEgZ2V0dGVyLgogICAgaWYgKG5vZGUgaXMhIFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkpIHsKICAgICAgc3VwZXIudmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRMZXQoTGV0IG5vZGUpIHsKICAgIGlmIChub2RlIGlzIFN5bnRoZXRpY0V4cHJlc3Npb25KdWRnbWVudCkgewogICAgICBwcm9ibGVtKG5vZGUsICJMZWFraW5nIHNoYWRvdyBub2RlOiAke25vZGUucnVudGltZVR5cGV9Iik7CiAgICB9CiAgICBzdXBlci52aXNpdExldChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0TGlicmFyeShMaWJyYXJ5IG5vZGUpIHsKICAgIC8vIElzc3VlKGh0dHA6Ly9kYXJ0YnVnLmNvbS8zMjUzMCkKICAgIGlmIChza2lwUGxhdGZvcm0gJiYgbm9kZS5pbXBvcnRVcmkuc2NoZW1lID09ICdkYXJ0JykgewogICAgICByZXR1cm47CiAgICB9CiAgICBmaWxlVXJpID0gY2hlY2tMb2NhdGlvbihub2RlLCBub2RlLm5hbWUsIG5vZGUuZmlsZVVyaSk7CiAgICBzdXBlci52aXNpdExpYnJhcnkobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENsYXNzKENsYXNzIG5vZGUpIHsKICAgIGZpbGVVcmkgPSBjaGVja0xvY2F0aW9uKG5vZGUsIG5vZGUubmFtZSwgbm9kZS5maWxlVXJpKTsKICAgIHN1cGVyLnZpc2l0Q2xhc3Mobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEZpZWxkKEZpZWxkIG5vZGUpIHsKICAgIGZpbGVVcmkgPSBjaGVja0xvY2F0aW9uKG5vZGUsIG5vZGUubmFtZS5uYW1lLCBub2RlLmZpbGVVcmkpOwogICAgc3VwZXIudmlzaXRGaWVsZChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0UHJvY2VkdXJlKFByb2NlZHVyZSBub2RlKSB7CiAgICBmaWxlVXJpID0gY2hlY2tMb2NhdGlvbihub2RlLCBub2RlLm5hbWUubmFtZSwgbm9kZS5maWxlVXJpKTsKICAgIHN1cGVyLnZpc2l0UHJvY2VkdXJlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRJbnZhbGlkSW5pdGlhbGl6ZXIoSW52YWxpZEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHByb2JsZW0obm9kZSwgIkludmFsaWQgaW5pdGlhbGl6ZXIuIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFVua25vd25UeXBlKFVua25vd25UeXBlIG5vZGUpIHsKICAgIC8vIE5vdGU6IHdlIGNhbid0IHBhc3MgW25vZGVdIHRvIFtwcm9ibGVtXSBiZWNhdXNlIGl0J3Mgbm90IGEgW1RyZWVOb2RlXS4KICAgIHByb2JsZW0obnVsbCwgIlVuZXhwZWN0ZWQgYXBwZWFyYW5jZSBvZiB0aGUgdW5rbm93biB0eXBlLiIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRTdXBlck1ldGhvZEludm9jYXRpb24oU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGNoZWNrU3VwZXJJbnZvY2F0aW9uKG5vZGUpOwogICAgc3VwZXIudmlzaXRTdXBlck1ldGhvZEludm9jYXRpb24obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN1cGVyUHJvcGVydHlHZXQoU3VwZXJQcm9wZXJ0eUdldCBub2RlKSB7CiAgICBjaGVja1N1cGVySW52b2NhdGlvbihub2RlKTsKICAgIHN1cGVyLnZpc2l0U3VwZXJQcm9wZXJ0eUdldChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0U3VwZXJQcm9wZXJ0eVNldChTdXBlclByb3BlcnR5U2V0IG5vZGUpIHsKICAgIGNoZWNrU3VwZXJJbnZvY2F0aW9uKG5vZGUpOwogICAgc3VwZXIudmlzaXRTdXBlclByb3BlcnR5U2V0KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKFN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgc3VwZXIudmlzaXRTdGF0aWNJbnZvY2F0aW9uKG5vZGUpOwogICAgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keSBib2R5ID0gZ2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keShub2RlLnRhcmdldCk7CiAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIkF0dGVtcHQgdG8gaW52b2tlIHJlZGlyZWN0aW5nIGZhY3RvcnkuIik7CiAgICB9CiAgfQp9CoDYAE5OPAEYASEJFg8THQ8cDREQExofGhoSAUkBPQE4AR1NASkBUQFCASc8ATo5IzoeGgIBNSM6AQ8bAT0gBAE/LkA5Rh8LJkkfCxYNHUAYCDdDCBYGBAEtNiQ5DVERUAgGBAEuGycaBhEEAQw/KCkwKkYgLj0ZBAEMKSMhJR8sIAg9BgQBDDdNLissBgQBDBcvQQYaBAEMHyc7DgY8HgQBDBs8HAQBDBtBHAQBDCNBIAQBDDUrBAEMJ05BBAEMOyAsBAEMMSAnBAEMMSAnBAEMMSdKGD8GBAIBMHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvdmVyaWZpZXIuZGFydDBzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvbG9hZGVyLmRhcnSpay8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmxvYWRlcjsKCmltcG9ydCAnZGFydDphc3luYycgc2hvdyBGdXR1cmU7CgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbicgc2hvdyBRdWV1ZTsKCmltcG9ydCAnYnVpbGRlci9idWlsZGVyLmRhcnQnCiAgICBzaG93IENsYXNzQnVpbGRlciwgRGVjbGFyYXRpb24sIExpYnJhcnlCdWlsZGVyLCBUeXBlQnVpbGRlcjsKCmltcG9ydCAnY3Jhc2guZGFydCcgc2hvdyBmaXJzdFNvdXJjZVVyaTsKCmltcG9ydCAnbWVzc2FnZXMuZGFydCcKICAgIHNob3cKICAgICAgICBGb3JtYXR0ZWRNZXNzYWdlLAogICAgICAgIExvY2F0ZWRNZXNzYWdlLAogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgU3VtbWFyeVRlbXBsYXRlLAogICAgICAgIFRlbXBsYXRlLAogICAgICAgIG1lc3NhZ2VQbGF0Zm9ybVByaXZhdGVMaWJyYXJ5QWNjZXNzLAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtQ29udGV4dFNldmVyaXR5LAogICAgICAgIHRlbXBsYXRlU291cmNlQm9keVN1bW1hcnk7CgppbXBvcnQgJ3Byb2JsZW1zLmRhcnQnIHNob3cgaW50ZXJuYWxQcm9ibGVtLCB1bmhhbmRsZWQ7CgppbXBvcnQgJ3NldmVyaXR5LmRhcnQnIHNob3cgU2V2ZXJpdHk7CgppbXBvcnQgJ3RhcmdldF9pbXBsZW1lbnRhdGlvbi5kYXJ0JyBzaG93IFRhcmdldEltcGxlbWVudGF0aW9uOwoKaW1wb3J0ICd0aWNrZXIuZGFydCcgc2hvdyBUaWNrZXI7Cgpjb25zdCBTdHJpbmcgdW50cmFuc2xhdGFibGVVcmlTY2hlbWUgPSAib3JnLWRhcnRsYW5nLXVudHJhbnNsYXRhYmxlLXVyaSI7CgphYnN0cmFjdCBjbGFzcyBMb2FkZXI8TD4gewogIGZpbmFsIE1hcDxVcmksIExpYnJhcnlCdWlsZGVyPiBidWlsZGVycyA9IDxVcmksIExpYnJhcnlCdWlsZGVyPnt9OwoKICBmaW5hbCBRdWV1ZTxMaWJyYXJ5QnVpbGRlcj4gdW5wYXJzZWRMaWJyYXJpZXMgPSBuZXcgUXVldWU8TGlicmFyeUJ1aWxkZXI+KCk7CgogIGZpbmFsIExpc3Q8TD4gbGlicmFyaWVzID0gPEw+W107CgogIGZpbmFsIFRhcmdldEltcGxlbWVudGF0aW9uIHRhcmdldDsKCiAgLy8vIExpc3Qgb2YgYWxsIGhhbmRsZWQgY29tcGlsZS10aW1lIGVycm9ycyBzZWVuIHNvIGZhciBieSBsaWJyYXJpZXMgbG9hZGVkCiAgLy8vIGJ5IHRoaXMgbG9hZGVyLgogIC8vLwogIC8vLyBBIGhhbmRsZWQgZXJyb3IgaXMgYW4gZXJyb3IgdGhhdCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgZ2VuZXJhdGVkIEFTVAogIC8vLyBhbHJlYWR5LCBmb3IgZXhhbXBsZSwgYXMgYSB0aHJvdyBleHByZXNzaW9uLgogIGZpbmFsIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGhhbmRsZWRFcnJvcnMgPSA8TG9jYXRlZE1lc3NhZ2U+W107CgogIC8vLyBMaXN0IG9mIGFsbCB1bmhhbmRsZWQgY29tcGlsZS10aW1lIGVycm9ycyBzZWVuIHNvIGZhciBieSBsaWJyYXJpZXMgbG9hZGVkCiAgLy8vIGJ5IHRoaXMgbG9hZGVyLgogIC8vLwogIC8vLyBBbiB1bmhhbmRsZWQgZXJyb3IgaXMgYW4gZXJyb3IgdGhhdCBoYXNuJ3QgYmVlbiBoYW5kbGVkLCBzZWUKICAvLy8gW2hhbmRsZWRFcnJvcnNdLgogIGZpbmFsIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IHVuaGFuZGxlZEVycm9ycyA9IDxMb2NhdGVkTWVzc2FnZT5bXTsKCiAgLy8vIExpc3Qgb2YgYWxsIHByb2JsZW1zIHNlZW4gc28gZmFyIGJ5IGxpYnJhcmllcyBsb2FkZWQgYnkgdGhpcyBsb2FkZXIgdGhhdAogIC8vLyBkb2VzIG5vdCBiZWxvbmcgZGlyZWN0bHkgdG8gYSBsaWJyYXJ5LgogIGZpbmFsIExpc3Q8Rm9ybWF0dGVkTWVzc2FnZT4gYWxsQ29tcG9uZW50UHJvYmxlbXMgPSA8Rm9ybWF0dGVkTWVzc2FnZT5bXTsKCiAgZmluYWwgU2V0PFN0cmluZz4gc2Vlbk1lc3NhZ2VzID0gbmV3IFNldDxTdHJpbmc+KCk7CgogIExpYnJhcnlCdWlsZGVyIGNvcmVMaWJyYXJ5OwoKICAvLy8gVGhlIGZpcnN0IGxpYnJhcnkgdGhhdCB3ZSd2ZSBiZWVuIGFza2VkIHRvIGNvbXBpbGUuIFdoZW4gY29tcGlsaW5nIGEKICAvLy8gcHJvZ3JhbSAoYWthIHNjcmlwdCksIHRoaXMgaXMgdGhlIGxpYnJhcnkgdGhhdCBzaG91bGQgaGF2ZSBhIG1haW4gbWV0aG9kLgogIExpYnJhcnlCdWlsZGVyIGZpcnN0OwoKICBpbnQgYnl0ZUNvdW50ID0gMDsKCiAgVXJpIGN1cnJlbnRVcmlGb3JDcmFzaFJlcG9ydGluZzsKCiAgTG9hZGVyKHRoaXMudGFyZ2V0KTsKCiAgVGlja2VyIGdldCB0aWNrZXIgPT4gdGFyZ2V0LnRpY2tlcjsKCiAgVGVtcGxhdGU8U3VtbWFyeVRlbXBsYXRlPiBnZXQgb3V0bGluZVN1bW1hcnlUZW1wbGF0ZTsKCiAgYm9vbCBnZXQgaXNTb3VyY2VMb2FkZXIgPT4gZmFsc2U7CgogIC8vLyBMb29rIHVwIGEgbGlicmFyeSBidWlsZGVyIGJ5IHRoZSBuYW1lIFt1cmldLCBvciBpZiBzdWNoIGRvZXNuJ3QKICAvLy8gZXhpc3QsIGNyZWF0ZSBvbmUuIFRoZSBjYW5vbmljYWwgVVJJIG9mIHRoZSBsaWJyYXJ5IGlzIFt1cmldLCBhbmQgaXRzCiAgLy8vIGFjdHVhbCBsb2NhdGlvbiBpcyBbZmlsZVVyaV0uCiAgLy8vCiAgLy8vIENhbm9uaWNhbCBVUklzIGhhdmUgc2NoZW1lcyBsaWtlICJkYXJ0Iiwgb3IgInBhY2thZ2UiLCBhbmQgdGhlIGFjdHVhbAogIC8vLyBsb2NhdGlvbiBpcyBvZnRlbiBhIGZpbGUgVVJJLgogIC8vLwogIC8vLyBUaGUgW2FjY2Vzc29yXSBpcyB0aGUgbGlicmFyeSB0aGF0J3MgdHJ5aW5nIHRvIGltcG9ydCwgZXhwb3J0LCBvciBpbmNsdWRlCiAgLy8vIGFzIHBhcnQgW3VyaV0sIGFuZCBbY2hhck9mZnNldF0gaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBjb3JyZXNwb25kaW5nCiAgLy8vIGRpcmVjdGl2ZS4gSWYgW2FjY2Vzc29yXSBpc24ndCBhbGxvd2VkIHRvIGFjY2VzcyBbdXJpXSwgaXQncyBhCiAgLy8vIGNvbXBpbGUtdGltZSBlcnJvci4KICBMaWJyYXJ5QnVpbGRlciByZWFkKFVyaSB1cmksIGludCBjaGFyT2Zmc2V0LAogICAgICB7VXJpIGZpbGVVcmksIExpYnJhcnlCdWlsZGVyIGFjY2Vzc29yLCBMaWJyYXJ5QnVpbGRlciBvcmlnaW59KSB7CiAgICBMaWJyYXJ5QnVpbGRlciBidWlsZGVyID0gYnVpbGRlcnMucHV0SWZBYnNlbnQodXJpLCAoKSB7CiAgICAgIGlmIChmaWxlVXJpICE9IG51bGwgJiYKICAgICAgICAgIChmaWxlVXJpLnNjaGVtZSA9PSAiZGFydCIgfHwKICAgICAgICAgICAgICBmaWxlVXJpLnNjaGVtZSA9PSAicGFja2FnZSIgfHwKICAgICAgICAgICAgICBmaWxlVXJpLnNjaGVtZSA9PSAiZGFydC1leHQiKSkgewogICAgICAgIGZpbGVVcmkgPSBudWxsOwogICAgICB9CiAgICAgIGlmIChmaWxlVXJpID09IG51bGwpIHsKICAgICAgICBzd2l0Y2ggKHVyaS5zY2hlbWUpIHsKICAgICAgICAgIGNhc2UgInBhY2thZ2UiOgogICAgICAgICAgY2FzZSAiZGFydCI6CiAgICAgICAgICAgIGZpbGVVcmkgPSB0YXJnZXQudHJhbnNsYXRlVXJpKHVyaSkgPz8KICAgICAgICAgICAgICAgIG5ldyBVcmkoCiAgICAgICAgICAgICAgICAgICAgc2NoZW1lOiB1bnRyYW5zbGF0YWJsZVVyaVNjaGVtZSwKICAgICAgICAgICAgICAgICAgICBwYXRoOiBVcmkuZW5jb2RlQ29tcG9uZW50KCIkdXJpIikpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBmaWxlVXJpID0gdXJpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9CiAgICAgICAgICB0YXJnZXQuY3JlYXRlTGlicmFyeUJ1aWxkZXIodXJpLCBmaWxlVXJpLCBvcmlnaW4pOwogICAgICBpZiAodXJpLnNjaGVtZSA9PSAiZGFydCIgJiYgdXJpLnBhdGggPT0gImNvcmUiKSB7CiAgICAgICAgY29yZUxpYnJhcnkgPSBsaWJyYXJ5OwogICAgICB9CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciAhPSB0aGlzKSB7CiAgICAgICAgaWYgKGNvcmVMaWJyYXJ5ID09IGxpYnJhcnkpIHsKICAgICAgICAgIHRhcmdldC5sb2FkRXh0cmFSZXF1aXJlZExpYnJhcmllcyh0aGlzKTsKICAgICAgICB9CiAgICAgICAgLy8gVGhpcyBsaWJyYXJ5IGlzbid0IG93bmVkIGJ5IHRoaXMgbG9hZGVyLCBzbyBub3QgZnVydGhlciBwcm9jZXNzaW5nCiAgICAgICAgLy8gc2hvdWxkIGJlIGF0dGVtcHRlZC4KICAgICAgICByZXR1cm4gbGlicmFyeTsKICAgICAgfQoKICAgICAgewogICAgICAgIC8vIEFkZCBhbnkgYWRkaXRpb25hbCBsb2dpYyBhZnRlciB0aGlzIGJsb2NrLiBTZXR0aW5nIHRoZQogICAgICAgIC8vIGZpcnN0U291cmNlVXJpIGFuZCBmaXJzdCBsaWJyYXJ5IHNob3VsZCBiZSBkb25lIGFzIGVhcmx5IGFzCiAgICAgICAgLy8gcG9zc2libGUuCiAgICAgICAgZmlyc3RTb3VyY2VVcmkgPz89IHVyaTsKICAgICAgICBmaXJzdCA/Pz0gbGlicmFyeTsKICAgICAgfQogICAgICBpZiAoY29yZUxpYnJhcnkgPT0gbGlicmFyeSkgewogICAgICAgIHRhcmdldC5sb2FkRXh0cmFSZXF1aXJlZExpYnJhcmllcyh0aGlzKTsKICAgICAgfQogICAgICBpZiAodGFyZ2V0LmJhY2tlbmRUYXJnZXQubWF5RGVmaW5lUmVzdHJpY3RlZFR5cGUob3JpZ2luPy51cmkgPz8gdXJpKSkgewogICAgICAgIGxpYnJhcnkubWF5SW1wbGVtZW50UmVzdHJpY3RlZFR5cGVzID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAodXJpLnNjaGVtZSA9PSAiZGFydCIpIHsKICAgICAgICB0YXJnZXQucmVhZFBhdGNoRmlsZXMobGlicmFyeSk7CiAgICAgIH0KICAgICAgdW5wYXJzZWRMaWJyYXJpZXMuYWRkTGFzdChsaWJyYXJ5KTsKICAgICAgcmV0dXJuIGxpYnJhcnk7CiAgICB9KTsKICAgIGlmIChhY2Nlc3NvciA9PSBudWxsKSB7CiAgICAgIGlmIChidWlsZGVyLmxvYWRlciA9PSB0aGlzICYmIGZpcnN0ICE9IGJ1aWxkZXIgJiYgaXNTb3VyY2VMb2FkZXIpIHsKICAgICAgICB1bmhhbmRsZWQoIm51bGwiLCAiYWNjZXNzb3IiLCBjaGFyT2Zmc2V0LCB1cmkpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBidWlsZGVyLnJlY29yZEFjY2VzcyhjaGFyT2Zmc2V0LCBub0xlbmd0aCwgYWNjZXNzb3IuZmlsZVVyaSk7CiAgICAgIGlmICghYWNjZXNzb3IuaXNQYXRjaCAmJgogICAgICAgICAgIWFjY2Vzc29yLmlzUGFydCAmJgogICAgICAgICAgIXRhcmdldC5iYWNrZW5kVGFyZ2V0CiAgICAgICAgICAgICAgLmFsbG93UGxhdGZvcm1Qcml2YXRlTGlicmFyeUFjY2VzcyhhY2Nlc3Nvci51cmksIHVyaSkpIHsKICAgICAgICBhY2Nlc3Nvci5hZGRQcm9ibGVtKG1lc3NhZ2VQbGF0Zm9ybVByaXZhdGVMaWJyYXJ5QWNjZXNzLCBjaGFyT2Zmc2V0LAogICAgICAgICAgICBub0xlbmd0aCwgYWNjZXNzb3IuZmlsZVVyaSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBidWlsZGVyOwogIH0KCiAgdm9pZCBlbnN1cmVDb3JlTGlicmFyeSgpIHsKICAgIGlmIChjb3JlTGlicmFyeSA9PSBudWxsKSB7CiAgICAgIHJlYWQoVXJpLnBhcnNlKCJkYXJ0OmNvcmUiKSwgMCwgYWNjZXNzb3I6IGZpcnN0KTsKICAgICAgLy8gVE9ETyhhc2tlc2MpOiBXaGVuIGFsbCBiYWNrZW5kcyBzdXBwb3J0IHNldCBsaXRlcmFscywgd2Ugbm8gbG9uZ2VyCiAgICAgIC8vIG5lZWQgdG8gaW5kZXggZGFydDpjb2xsZWN0aW9uLCBhcyBpdCBpcyBvbmx5IG5lZWRlZCBmb3IgZGVzdWdhcmluZyBvZgogICAgICAvLyBjb25zdCBzZXRzLiBXZSBjYW4gcmVtb3ZlIGl0IGZyb20gdGhpcyBsaXN0IGF0IHRoYXQgdGltZS4KICAgICAgcmVhZChVcmkucGFyc2UoImRhcnQ6Y29sbGVjdGlvbiIpLCAwLCBhY2Nlc3NvcjogZmlyc3QpOwogICAgICBhc3NlcnQoY29yZUxpYnJhcnkgIT0gbnVsbCk7CiAgICB9CiAgfQoKICBGdXR1cmU8TnVsbD4gYnVpbGRCb2RpZXMoKSBhc3luYyB7CiAgICBhc3NlcnQoY29yZUxpYnJhcnkgIT0gbnVsbCk7CiAgICBmb3IgKExpYnJhcnlCdWlsZGVyIGxpYnJhcnkgaW4gYnVpbGRlcnMudmFsdWVzKSB7CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSB7CiAgICAgICAgY3VycmVudFVyaUZvckNyYXNoUmVwb3J0aW5nID0gbGlicmFyeS51cmk7CiAgICAgICAgYXdhaXQgYnVpbGRCb2R5KGxpYnJhcnkpOwogICAgICB9CiAgICB9CiAgICBjdXJyZW50VXJpRm9yQ3Jhc2hSZXBvcnRpbmcgPSBudWxsOwogICAgbG9nU3VtbWFyeSh0ZW1wbGF0ZVNvdXJjZUJvZHlTdW1tYXJ5KTsKICB9CgogIEZ1dHVyZTxOdWxsPiBidWlsZE91dGxpbmVzKCkgYXN5bmMgewogICAgZW5zdXJlQ29yZUxpYnJhcnkoKTsKICAgIHdoaWxlICh1bnBhcnNlZExpYnJhcmllcy5pc05vdEVtcHR5KSB7CiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkgPSB1bnBhcnNlZExpYnJhcmllcy5yZW1vdmVGaXJzdCgpOwogICAgICBjdXJyZW50VXJpRm9yQ3Jhc2hSZXBvcnRpbmcgPSBsaWJyYXJ5LnVyaTsKICAgICAgYXdhaXQgYnVpbGRPdXRsaW5lKGxpYnJhcnkpOwogICAgfQogICAgY3VycmVudFVyaUZvckNyYXNoUmVwb3J0aW5nID0gbnVsbDsKICAgIGxvZ1N1bW1hcnkob3V0bGluZVN1bW1hcnlUZW1wbGF0ZSk7CiAgfQoKICB2b2lkIGxvZ1N1bW1hcnkoVGVtcGxhdGU8U3VtbWFyeVRlbXBsYXRlPiB0ZW1wbGF0ZSkgewogICAgdGlja2VyLmxvZygoRHVyYXRpb24gZWxhcHNlZCwgRHVyYXRpb24gc2luY2VTdGFydCkgewogICAgICBpbnQgbGlicmFyeUNvdW50ID0gMDsKICAgICAgYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSBsaWJyYXJ5Q291bnQrKzsKICAgICAgfSk7CiAgICAgIGRvdWJsZSBtcyA9IGVsYXBzZWQuaW5NaWNyb3NlY29uZHMgLyBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJNaWxsaXNlY29uZDsKICAgICAgTWVzc2FnZSBtZXNzYWdlID0gdGVtcGxhdGUud2l0aEFyZ3VtZW50cygKICAgICAgICAgIGxpYnJhcnlDb3VudCwgYnl0ZUNvdW50LCBtcywgYnl0ZUNvdW50IC8gbXMsIG1zIC8gbGlicmFyeUNvdW50KTsKICAgICAgcHJpbnQoIiRzaW5jZVN0YXJ0OiAke21lc3NhZ2UubWVzc2FnZX0iKTsKICAgIH0pOwogIH0KCiAgRnV0dXJlPE51bGw+IGJ1aWxkT3V0bGluZShjb3ZhcmlhbnQgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSk7CgogIC8vLyBCdWlsZHMgYWxsIHRoZSBtZXRob2QgYm9kaWVzIGZvdW5kIGluIHRoZSBnaXZlbiBbbGlicmFyeV0uCiAgRnV0dXJlPE51bGw+IGJ1aWxkQm9keShjb3ZhcmlhbnQgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSk7CgogIC8vLyBSZWdpc3RlciBbbWVzc2FnZV0gYXMgYSBwcm9ibGVtIHdpdGggYSBzZXZlcml0eSBkZXRlcm1pbmVkIGJ5IHRoZQogIC8vLyBpbnRyaW5zaWMgc2V2ZXJpdHkgb2YgdGhlIG1lc3NhZ2UuCiAgRm9ybWF0dGVkTWVzc2FnZSBhZGRQcm9ibGVtKAogICAgICBNZXNzYWdlIG1lc3NhZ2UsIGludCBjaGFyT2Zmc2V0LCBpbnQgbGVuZ3RoLCBVcmkgZmlsZVVyaSwKICAgICAge2Jvb2wgd2FzSGFuZGxlZDogZmFsc2UsCiAgICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQsCiAgICAgIFNldmVyaXR5IHNldmVyaXR5LAogICAgICBib29sIHByb2JsZW1PbkxpYnJhcnk6IGZhbHNlfSkgewogICAgcmV0dXJuIGFkZE1lc3NhZ2UobWVzc2FnZSwgY2hhck9mZnNldCwgbGVuZ3RoLCBmaWxlVXJpLCBzZXZlcml0eSwKICAgICAgICB3YXNIYW5kbGVkOiB3YXNIYW5kbGVkLAogICAgICAgIGNvbnRleHQ6IGNvbnRleHQsCiAgICAgICAgcHJvYmxlbU9uTGlicmFyeTogcHJvYmxlbU9uTGlicmFyeSk7CiAgfQoKICAvLy8gQWxsIG1lc3NhZ2VzIHJlcG9ydGVkIGJ5IHRoZSBjb21waWxlciAoZXJyb3JzLCB3YXJuaW5ncywgZXRjLikgYXJlIHJvdXRlZAogIC8vLyB0aHJvdWdoIHRoaXMgbWV0aG9kLgogIC8vLwogIC8vLyBSZXR1cm5zIGEgRm9ybWF0dGVkTWVzc2FnZSBpZiB0aGUgbWVzc2FnZSBpcyBuZXcsIHRoYXQgaXMsIG5vdCBwcmV2aW91c2x5CiAgLy8vIHJlcG9ydGVkLiBUaGlzIGlzIGltcG9ydGFudCBhcyBzb21lIHBhcnNlciBlcnJvcnMgbWF5IGJlIHJlcG9ydGVkIHVwIHRvCiAgLy8vIHRocmVlIHRpbWVzIGJ5IGBPdXRsaW5lQnVpbGRlcmAsIGBEaWV0TGlzdGVuZXJgLCBhbmQgYEJvZHlCdWlsZGVyYC4KICAvLy8gSWYgdGhlIG1lc3NhZ2UgaXMgbm90IG5ldywgW251bGxdIGlzIHJlcG9ydGVkLgogIC8vLwogIC8vLyBJZiBbc2V2ZXJpdHldIGlzIGBTZXZlcml0eS5lcnJvcmAsIHRoZSBtZXNzYWdlIGlzIGFkZGVkIHRvCiAgLy8vIFtoYW5kbGVkRXJyb3JzXSBpZiBbd2FzSGFuZGxlZF0gaXMgdHJ1ZSBvciB0byBbdW5oYW5kbGVkRXJyb3JzXSBpZgogIC8vLyBbd2FzSGFuZGxlZF0gaXMgZmFsc2UuCiAgRm9ybWF0dGVkTWVzc2FnZSBhZGRNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgsCiAgICAgIFVyaSBmaWxlVXJpLCBTZXZlcml0eSBzZXZlcml0eSwKICAgICAge2Jvb2wgd2FzSGFuZGxlZDogZmFsc2UsCiAgICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQsCiAgICAgIGJvb2wgcHJvYmxlbU9uTGlicmFyeTogZmFsc2V9KSB7CiAgICBzZXZlcml0eSA9IHRhcmdldC5maXhTZXZlcml0eShzZXZlcml0eSwgbWVzc2FnZSwgZmlsZVVyaSk7CiAgICBpZiAoc2V2ZXJpdHkgPT0gU2V2ZXJpdHkuaWdub3JlZCkgcmV0dXJuIG51bGw7CiAgICBTdHJpbmcgdHJhY2UgPSAiIiIKbWVzc2FnZTogJHttZXNzYWdlLm1lc3NhZ2V9CmNoYXJPZmZzZXQ6ICRjaGFyT2Zmc2V0CmZpbGVVcmk6ICRmaWxlVXJpCnNldmVyaXR5OiAkc2V2ZXJpdHkKIiIiOwogICAgLy8gVE9ETyhhc2tlc2MpOiBTd2FwIG1lc3NhZ2UgYW5kIGNvbnRleHQgYXJvdW5kIGZvciBpbnRlcmZhY2UgY2hlY2tzCiAgICAvLyBhbmQgbWl4aW4gb3ZlcnJpZGVzIHRvIG1ha2UgY29tcGFyaW5nIGNvbnRleHQgaGVyZSB1bm5lY2Vzc2FyeS4KICAgIGlmIChjb250ZXh0ICE9IG51bGwpIHsKICAgICAgZm9yIChMb2NhdGVkTWVzc2FnZSBjb250ZXh0TWVzc2FnZSBpbiBjb250ZXh0KSB7CiAgICAgICAgdHJhY2UgKz0gIiIiCm1lc3NhZ2U6ICR7Y29udGV4dE1lc3NhZ2UubWVzc2FnZX0KY2hhck9mZnNldDogJHtjb250ZXh0TWVzc2FnZS5jaGFyT2Zmc2V0fQpmaWxlVXJpOiAke2NvbnRleHRNZXNzYWdlLnVyaX0KIiIiOwogICAgICB9CiAgICB9CiAgICBpZiAoIXNlZW5NZXNzYWdlcy5hZGQodHJhY2UpKSByZXR1cm4gbnVsbDsKICAgIGlmIChtZXNzYWdlLmNvZGUuc2V2ZXJpdHkgPT0gU2V2ZXJpdHkuY29udGV4dCkgewogICAgICBpbnRlcm5hbFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbUNvbnRleHRTZXZlcml0eQogICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG1lc3NhZ2UuY29kZS5uYW1lKSwKICAgICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgICBmaWxlVXJpKTsKICAgIH0KICAgIHRhcmdldC5jb250ZXh0LnJlcG9ydCgKICAgICAgICBtZXNzYWdlLndpdGhMb2NhdGlvbihmaWxlVXJpLCBjaGFyT2Zmc2V0LCBsZW5ndGgpLCBzZXZlcml0eSwKICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICAgIGlmIChzZXZlcml0eSA9PSBTZXZlcml0eS5lcnJvcikgewogICAgICAod2FzSGFuZGxlZCA/IGhhbmRsZWRFcnJvcnMgOiB1bmhhbmRsZWRFcnJvcnMpCiAgICAgICAgICAuYWRkKG1lc3NhZ2Uud2l0aExvY2F0aW9uKGZpbGVVcmksIGNoYXJPZmZzZXQsIGxlbmd0aCkpOwogICAgfQogICAgRm9ybWF0dGVkTWVzc2FnZSBmb3JtYXR0ZWRNZXNzYWdlID0gdGFyZ2V0LmNyZWF0ZUZvcm1hdHRlZE1lc3NhZ2UoCiAgICAgICAgbWVzc2FnZSwgY2hhck9mZnNldCwgbGVuZ3RoLCBmaWxlVXJpLCBjb250ZXh0LCBzZXZlcml0eSk7CiAgICBpZiAoIXByb2JsZW1PbkxpYnJhcnkpIHsKICAgICAgYWxsQ29tcG9uZW50UHJvYmxlbXMuYWRkKGZvcm1hdHRlZE1lc3NhZ2UpOwogICAgfQogICAgcmV0dXJuIGZvcm1hdHRlZE1lc3NhZ2U7CiAgfQoKICBEZWNsYXJhdGlvbiBnZXRBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yKCkgewogICAgcmV0dXJuIHRhcmdldC5nZXRBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yKHRoaXMpOwogIH0KCiAgRGVjbGFyYXRpb24gZ2V0Q29tcGlsZVRpbWVFcnJvcigpID0+IHRhcmdldC5nZXRDb21waWxlVGltZUVycm9yKHRoaXMpOwoKICBEZWNsYXJhdGlvbiBnZXREdXBsaWNhdGVkRmllbGRJbml0aWFsaXplckVycm9yKCkgewogICAgcmV0dXJuIHRhcmdldC5nZXREdXBsaWNhdGVkRmllbGRJbml0aWFsaXplckVycm9yKHRoaXMpOwogIH0KCiAgRGVjbGFyYXRpb24gZ2V0TmF0aXZlQW5ub3RhdGlvbigpID0+IHRhcmdldC5nZXROYXRpdmVBbm5vdGF0aW9uKHRoaXMpOwoKICBDbGFzc0J1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4gY29tcHV0ZUNsYXNzQnVpbGRlckZyb21UYXJnZXRDbGFzcygKICAgICAgY292YXJpYW50IE9iamVjdCBjbHMpOwoKICBUeXBlQnVpbGRlciBjb21wdXRlVHlwZUJ1aWxkZXIoY292YXJpYW50IE9iamVjdCB0eXBlKTsKfQqBOABOTjwBFgEhASUBHkEBKQEXCRoYERIZEi0wIwE4ASYBPwEiAUoBG0UBTwEjASUBThYGSzNBAVAWBkMXQwFPLUwBNgEeAUtQGAEVASMBFwEmATgBJAFGTCQGTCQGUEtFGi9HPB0nLS8YCB0eGhcyGTU4EwETGxMKCB89OB8IJCYzCk4gGAgBCEJHFSAbCCQxCE40CCIoCCoWCBxKOAgNRB8eIEdNKQgGFAQBHR84TE9DPiMGBAElITYkMyIIBigrBAEnGStAMSMGKCgEATg5HDs0ClAwSzAIBAE/AUE8AUgpH0AfJBknRiAaLQQBUBsGUE5KNQZBSR1LJh8kJz8zFxwYEhQFSkcbNxUjKR8FCAYvNRcxMRYUBhtFGyY1QwZHQh0yBh0EATU8BAFJATU8BAFJAUgdATkCASdwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvbG9hZGVyLmRhcnRAc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3NjYW5uZXIvc3RyaW5nX3NjYW5uZXIuZGFydIs0Ly8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5zY2FubmVyLnN0cmluZ19zY2FubmVyOwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW4sIFN5bnRoZXRpY1N0cmluZ1Rva2VuLCBUb2tlblR5cGU7CgppbXBvcnQgJy4uLy4uL3NjYW5uZXIvdG9rZW4uZGFydCcgYXMgYW5hbHl6ZXIgc2hvdyBTdHJpbmdUb2tlbjsKCmltcG9ydCAnYXJyYXlfYmFzZWRfc2Nhbm5lci5kYXJ0JyBzaG93IEFycmF5QmFzZWRTY2FubmVyOwoKaW1wb3J0ICd0b2tlbi5kYXJ0JyBzaG93IENvbW1lbnRUb2tlbiwgRGFydERvY1Rva2VuLCBTdHJpbmdUb2tlbjsKCmltcG9ydCAnZXJyb3JfdG9rZW4uZGFydCcgc2hvdyBFcnJvclRva2VuOwoKLyoqCiAqIFNjYW5uZXIgdGhhdCByZWFkcyBmcm9tIGEgU3RyaW5nIGFuZCBjcmVhdGVzIHRva2VucyB0aGF0IHBvaW50cyB0bwogKiBzdWJzdHJpbmdzLgogKi8KY2xhc3MgU3RyaW5nU2Nhbm5lciBleHRlbmRzIEFycmF5QmFzZWRTY2FubmVyIHsKICAvKiogVGhlIGZpbGUgY29udGVudC4gKi8KICBTdHJpbmcgc3RyaW5nOwoKICAvKiogVGhlIGN1cnJlbnQgb2Zmc2V0IGluIFtzdHJpbmddLiAqLwogIGludCBzY2FuT2Zmc2V0ID0gLTE7CgogIFN0cmluZ1NjYW5uZXIoU3RyaW5nIHN0cmluZywge2Jvb2wgaW5jbHVkZUNvbW1lbnRzOiBmYWxzZX0pCiAgICAgIDogc3RyaW5nID0gZW5zdXJlWmVyb1Rlcm1pbmF0aW9uKHN0cmluZyksCiAgICAgICAgc3VwZXIoaW5jbHVkZUNvbW1lbnRzKTsKCiAgc3RhdGljIFN0cmluZyBlbnN1cmVaZXJvVGVybWluYXRpb24oU3RyaW5nIHN0cmluZykgewogICAgcmV0dXJuIChzdHJpbmcuaXNFbXB0eSB8fCBzdHJpbmcuY29kZVVuaXRBdChzdHJpbmcubGVuZ3RoIC0gMSkgIT0gMCkKICAgICAgICAvLyBUT0RPKGxyeSk6IGFib3J0IGluc3RlYWQgb2YgY29weWluZyB0aGUgYXJyYXksIG9yIHdhcm4/CiAgICAgICAgPyBzdHJpbmcgKyAnXHgwMCcKICAgICAgICA6IHN0cmluZzsKICB9CgogIHN0YXRpYyBib29sIGlzTGVnYWxJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKSB7CiAgICBTdHJpbmdTY2FubmVyIHNjYW5uZXIgPSBuZXcgU3RyaW5nU2Nhbm5lcihpZGVudGlmaWVyKTsKICAgIFRva2VuIHN0YXJ0VG9rZW4gPSBzY2FubmVyLnRva2VuaXplKCk7CiAgICByZXR1cm4gc3RhcnRUb2tlbiBpcyEgRXJyb3JUb2tlbiAmJiBzdGFydFRva2VuLm5leHQuaXNFb2Y7CiAgfQoKICBpbnQgYWR2YW5jZSgpID0+IHN0cmluZy5jb2RlVW5pdEF0KCsrc2Nhbk9mZnNldCk7CiAgaW50IHBlZWsoKSA9PiBzdHJpbmcuY29kZVVuaXRBdChzY2FuT2Zmc2V0ICsgMSk7CgogIGludCBnZXQgc3RyaW5nT2Zmc2V0ID0+IHNjYW5PZmZzZXQ7CgogIGludCBjdXJyZW50QXNVbmljb2RlKGludCBuZXh0KSA9PiBuZXh0OwoKICB2b2lkIGhhbmRsZVVuaWNvZGUoaW50IHN0YXJ0U2Nhbk9mZnNldCkge30KCiAgQG92ZXJyaWRlCiAgYW5hbHl6ZXIuU3RyaW5nVG9rZW4gY3JlYXRlU3Vic3RyaW5nVG9rZW4oCiAgICAgIFRva2VuVHlwZSB0eXBlLCBpbnQgc3RhcnQsIGJvb2wgYXNjaWlPbmx5LAogICAgICBbaW50IGV4dHJhT2Zmc2V0ID0gMF0pIHsKICAgIHJldHVybiBuZXcgU3RyaW5nVG9rZW4uZnJvbVN1YnN0cmluZygKICAgICAgICB0eXBlLCBzdHJpbmcsIHN0YXJ0LCBzY2FuT2Zmc2V0ICsgZXh0cmFPZmZzZXQsIHRva2VuU3RhcnQsCiAgICAgICAgY2Fub25pY2FsaXplOiB0cnVlLCBwcmVjZWRpbmdDb21tZW50czogY29tbWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYW5hbHl6ZXIuU3RyaW5nVG9rZW4gY3JlYXRlU3ludGhldGljU3Vic3RyaW5nVG9rZW4oCiAgICAgIFRva2VuVHlwZSB0eXBlLCBpbnQgc3RhcnQsIGJvb2wgYXNjaWlPbmx5LCBTdHJpbmcgc3ludGhldGljQ2hhcnMpIHsKICAgIFN0cmluZyBzb3VyY2UgPSBzdHJpbmcuc3Vic3RyaW5nKHN0YXJ0LCBzY2FuT2Zmc2V0KTsKICAgIHJldHVybiBuZXcgU3ludGhldGljU3RyaW5nVG9rZW4oCiAgICAgICAgdHlwZSwgc291cmNlICsgc3ludGhldGljQ2hhcnMsIHRva2VuU3RhcnQsIHNvdXJjZS5sZW5ndGgpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29tbWVudFRva2VuIGNyZWF0ZUNvbW1lbnRUb2tlbihUb2tlblR5cGUgdHlwZSwgaW50IHN0YXJ0LCBib29sIGFzY2lpT25seSwKICAgICAgW2ludCBleHRyYU9mZnNldCA9IDBdKSB7CiAgICByZXR1cm4gbmV3IENvbW1lbnRUb2tlbi5mcm9tU3Vic3RyaW5nKAogICAgICAgIHR5cGUsIHN0cmluZywgc3RhcnQsIHNjYW5PZmZzZXQgKyBleHRyYU9mZnNldCwgdG9rZW5TdGFydCwKICAgICAgICBjYW5vbmljYWxpemU6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydERvY1Rva2VuIGNyZWF0ZURhcnREb2NUb2tlbihUb2tlblR5cGUgdHlwZSwgaW50IHN0YXJ0LCBib29sIGFzY2lpT25seSwKICAgICAgW2ludCBleHRyYU9mZnNldCA9IDBdKSB7CiAgICByZXR1cm4gbmV3IERhcnREb2NUb2tlbi5mcm9tU3Vic3RyaW5nKAogICAgICAgIHR5cGUsIHN0cmluZywgc3RhcnQsIHNjYW5PZmZzZXQgKyBleHRyYU9mZnNldCwgdG9rZW5TdGFydCwKICAgICAgICBjYW5vbmljYWxpemU6IHRydWUpOwogIH0KCiAgYm9vbCBhdEVuZE9mRmlsZSgpID0+IHNjYW5PZmZzZXQgPj0gc3RyaW5nLmxlbmd0aCAtIDE7Cn0KWgBOTjwBKAFPAUABOgFCASsBBEYPBDAbEQEpFwE+MCABN0lDGhIEATU7Kz8EATQzASYBKgEtAQwtMR8qQzoEAQw2SjklQwQBDE0fK0MdBAEMTR8rQx0EATkCATdwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc2Nhbm5lci9zdHJpbmdfc2Nhbm5lci5kYXJ0RHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zY2FubmVyL3V0ZjhfYnl0ZXNfc2Nhbm5lci5kYXJ0n4wvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5zY2FubmVyLnV0ZjhfYnl0ZXNfc2Nhbm5lcjsKCmltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IHVuaWNvZGVCb21DaGFyYWN0ZXJSdW5lLCB1dGY4OwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgU3ludGhldGljU3RyaW5nVG9rZW4sIFRva2VuVHlwZTsKCmltcG9ydCAnLi4vLi4vc2Nhbm5lci90b2tlbi5kYXJ0JyBhcyBhbmFseXplciBzaG93IFN0cmluZ1Rva2VuOwoKaW1wb3J0ICcuLi9zY2FubmVyLmRhcnQnIHNob3cgdW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyOwoKaW1wb3J0ICd0b2tlbi5kYXJ0JyBzaG93IENvbW1lbnRUb2tlbiwgRGFydERvY1Rva2VuLCBTdHJpbmdUb2tlbjsKCmltcG9ydCAnYXJyYXlfYmFzZWRfc2Nhbm5lci5kYXJ0JyBzaG93IEFycmF5QmFzZWRTY2FubmVyOwoKLyoqCiAqIFNjYW5uZXIgdGhhdCByZWFkcyBmcm9tIGEgVVRGLTggZW5jb2RlZCBsaXN0IG9mIGJ5dGVzIGFuZCBjcmVhdGVzIHRva2VucwogKiB0aGF0IHBvaW50cyB0byBzdWJzdHJpbmdzLgogKi8KY2xhc3MgVXRmOEJ5dGVzU2Nhbm5lciBleHRlbmRzIEFycmF5QmFzZWRTY2FubmVyIHsKICAvKioKICAgKiBUaGUgZmlsZSBjb250ZW50LgogICAqCiAgICogVGhlIGNvbnRlbnQgaXMgemVyby10ZXJtaW5hdGVkLgogICAqLwogIExpc3Q8aW50PiBieXRlczsKCiAgLyoqCiAgICogUG9pbnRzIHRvIHRoZSBvZmZzZXQgb2YgdGhlIGxhc3QgYnl0ZSByZXR1cm5lZCBieSBbYWR2YW5jZV0uCiAgICoKICAgKiBBZnRlciBpbnZva2luZyBbY3VycmVudEFzVW5pY29kZV0sIHRoZSBbYnl0ZU9mZnNldF0gcG9pbnRzIHRvIHRoZSBsYXN0CiAgICogYnl0ZSB0aGF0IGlzIHBhcnQgb2YgdGhlICh1bmljb2RlIG9yIEFTQ0lJKSBjaGFyYWN0ZXIuIFRoYXQgd2F5LCBbYWR2YW5jZV0KICAgKiBjYW4gYWx3YXlzIGluY3JlYXNlIHRoZSBieXRlIG9mZnNldCBieSAxLgogICAqLwogIGludCBieXRlT2Zmc2V0ID0gLTE7CgogIC8qKgogICAqIFRoZSBnZXR0ZXIgW3NjYW5PZmZzZXRdIGlzIGV4cGVjdGVkIHRvIHJldHVybiB0aGUgaW5kZXggd2hlcmUgdGhlIGN1cnJlbnQKICAgKiBjaGFyYWN0ZXIgKnN0YXJ0cyouIEluIGNhc2Ugb2YgYSBub24tYXNjaWkgY2hhcmFjdGVyLCBhZnRlciBpbnZva2luZwogICAqIFtjdXJyZW50QXNVbmljb2RlXSwgdGhlIGJ5dGUgb2Zmc2V0IHBvaW50cyB0byB0aGUgKmxhc3QqIGJ5dGUuCiAgICoKICAgKiBUaGlzIGZpZWxkIGtlZXBzIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgZm9yIHRoZSBjdXJyZW50IHVuaWNvZGUKICAgKiBjaGFyYWN0ZXIuIEZvciBleGFtcGxlLCBpZiBieXRlcyA3LDgsOSBlbmNvZGUgb25lIHVuaWNvZGUgY2hhcmFjdGVyLCB0aGUKICAgKiBbYnl0ZU9mZnNldF0gaXMgOSAoYWZ0ZXIgaW52b2tpbmcgW2N1cnJlbnRBc1VuaWNvZGVdKS4gVGhlIFtzY2FuU2xhY2tdCiAgICogd2lsbCBiZSAyLCBzbyB0aGF0IFtzY2FuT2Zmc2V0XSByZXR1cm5zIDcuCiAgICovCiAgaW50IHNjYW5TbGFjayA9IDA7CgogIC8qKgogICAqIEhvbGRzIHRoZSBbYnl0ZU9mZnNldF0gdmFsdWUgZm9yIHdoaWNoIHRoZSBjdXJyZW50IFtzY2FuU2xhY2tdIGlzIHZhbGlkLgogICAqLwogIGludCBzY2FuU2xhY2tPZmZzZXQgPSAtMTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGJ5dGUgdGhhdCBiZWxvbmdzIHRvIHRoZSBjdXJyZW50CiAgICogY2hhcmFjdGVyLgogICAqLwogIGludCBnZXQgc2Nhbk9mZnNldCB7CiAgICBpZiAoYnl0ZU9mZnNldCA9PSBzY2FuU2xhY2tPZmZzZXQpIHsKICAgICAgcmV0dXJuIGJ5dGVPZmZzZXQgLSBzY2FuU2xhY2s7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gYnl0ZU9mZnNldDsKICAgIH0KICB9CgogIC8qKgogICAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG51bWJlciBvZiBieXRlcyBhbmQgdGhlIG51bWJlciBvZiBjb3JyZXNwb25kaW5nCiAgICogc3RyaW5nIGNoYXJhY3RlcnMsIHVwIHRvIHRoZSBjdXJyZW50IFtieXRlT2Zmc2V0XS4KICAgKi8KICBpbnQgdXRmOFNsYWNrID0gMDsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBVdGY4Qnl0ZXNTY2FubmVyLiBUaGUgc291cmNlIGZpbGUgaXMgZXhwZWN0ZWQgdG8gYmUgYQogICAqIFtVdGY4Qnl0ZXNTb3VyY2VGaWxlXSB0aGF0IGhvbGRzIGEgbGlzdCBvZiBVVEYtOCBieXRlcy4gT3RoZXJ3aXNlIHRoZQogICAqIHN0cmluZyB0ZXh0IG9mIHRoZSBzb3VyY2UgZmlsZSBpcyBkZWNvZGVkLgogICAqCiAgICogVGhlIGxpc3Qgb2YgVVRGLTggYnl0ZXMgW2ZpbGUuc2xvd1V0ZjhCeXRlcygpXSBpcyBleHBlY3RlZCB0byByZXR1cm4gYW4KICAgKiBhcnJheSB3aG9zZSBsYXN0IGVsZW1lbnQgaXMgJzAnIHRvIHNpZ25hbCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBJZiB0aGlzCiAgICogaXMgbm90IHRoZSBjYXNlLCB0aGUgZW50aXJlIGFycmF5IGlzIGNvcGllZCBiZWZvcmUgc2Nhbm5pbmcuCiAgICovCiAgVXRmOEJ5dGVzU2Nhbm5lcih0aGlzLmJ5dGVzLCB7Ym9vbCBpbmNsdWRlQ29tbWVudHM6IGZhbHNlfSkKICAgICAgOiBzdXBlcihpbmNsdWRlQ29tbWVudHMsIG51bWJlck9mQnl0ZXNIaW50OiBieXRlcy5sZW5ndGgpIHsKICAgIGFzc2VydChieXRlcy5sYXN0ID09IDApOwogICAgLy8gU2tpcCBhIGxlYWRpbmcgQk9NLgogICAgaWYgKGNvbnRhaW5zQm9tQXQoMCkpIGJ5dGVPZmZzZXQgKz0gMzsKICB9CgogIGJvb2wgY29udGFpbnNCb21BdChpbnQgb2Zmc2V0KSB7CiAgICBjb25zdCBCT01fVVRGOCA9IGNvbnN0IFsweEVGLCAweEJCLCAweEJGXTsKCiAgICByZXR1cm4gb2Zmc2V0ICsgMyA8IGJ5dGVzLmxlbmd0aCAmJgogICAgICAgIGJ5dGVzW29mZnNldF0gPT0gQk9NX1VURjhbMF0gJiYKICAgICAgICBieXRlc1tvZmZzZXQgKyAxXSA9PSBCT01fVVRGOFsxXSAmJgogICAgICAgIGJ5dGVzW29mZnNldCArIDJdID09IEJPTV9VVEY4WzJdOwogIH0KCiAgaW50IGFkdmFuY2UoKSA9PiBieXRlc1srK2J5dGVPZmZzZXRdOwoKICBpbnQgcGVlaygpID0+IGJ5dGVzW2J5dGVPZmZzZXQgKyAxXTsKCiAgLy8vIFJldHVybnMgdGhlIHVuaWNvZGUgY29kZSBwb2ludCBzdGFydGluZyBhdCB0aGUgYnl0ZSBvZmZzZXQgW3N0YXJ0T2Zmc2V0XQogIC8vLyB3aXRoIHRoZSBieXRlIFtuZXh0Qnl0ZV0uCiAgaW50IG5leHRDb2RlUG9pbnQoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbmV4dEJ5dGUpIHsKICAgIGludCBleHBlY3RlZEhpZ2hCeXRlczsKICAgIGlmIChuZXh0Qnl0ZSA8IDB4QzIpIHsKICAgICAgZXhwZWN0ZWRIaWdoQnl0ZXMgPSAxOyAvLyBCYWQgY29kZSB1bml0LgogICAgfSBlbHNlIGlmIChuZXh0Qnl0ZSA8IDB4RTApIHsKICAgICAgZXhwZWN0ZWRIaWdoQnl0ZXMgPSAyOwogICAgfSBlbHNlIGlmIChuZXh0Qnl0ZSA8IDB4RjApIHsKICAgICAgZXhwZWN0ZWRIaWdoQnl0ZXMgPSAzOwogICAgfSBlbHNlIGlmIChuZXh0Qnl0ZSA8IDB4RjUpIHsKICAgICAgZXhwZWN0ZWRIaWdoQnl0ZXMgPSA0OwogICAgfSBlbHNlIHsKICAgICAgZXhwZWN0ZWRIaWdoQnl0ZXMgPSAxOyAvLyBCYWQgY29kZSB1bml0LgogICAgfQogICAgaW50IG51bUJ5dGVzID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRIaWdoQnl0ZXM7IGkrKykgewogICAgICBpZiAoYnl0ZXNbYnl0ZU9mZnNldCArIGldIDwgMHg4MCkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG51bUJ5dGVzKys7CiAgICB9CiAgICBpbnQgZW5kID0gc3RhcnRPZmZzZXQgKyBudW1CeXRlczsKICAgIGJ5dGVPZmZzZXQgPSBlbmQgLSAxOwogICAgaWYgKGV4cGVjdGVkSGlnaEJ5dGVzID09IDEgfHwgbnVtQnl0ZXMgIT0gZXhwZWN0ZWRIaWdoQnl0ZXMpIHsKICAgICAgcmV0dXJuIHVuaWNvZGVSZXBsYWNlbWVudENoYXJhY3RlcjsKICAgIH0KICAgIC8vIFRPRE8obHJ5KTogbWVhc3VyYWJseSBzbG93LCBkZWNvZGUgY3JlYXRlcyBmaXJzdCBhIFV0ZjhEZWNvZGVyIGFuZCBhCiAgICAvLyBfVXRmOERlY29kZXIgaW5zdGFuY2UuIEFsc28gdGhlIHN1Ymxpc3QgaXMgZWFnZXJseSBhbGxvY2F0ZWQuCiAgICBTdHJpbmcgY29kZVBvaW50ID0KICAgICAgICB1dGY4LmRlY29kZShieXRlcy5zdWJsaXN0KHN0YXJ0T2Zmc2V0LCBlbmQpLCBhbGxvd01hbGZvcm1lZDogdHJ1ZSk7CiAgICBpZiAoY29kZVBvaW50Lmxlbmd0aCA9PSAwKSB7CiAgICAgIC8vIFRoZSBVVEYtOCBkZWNvZGVyIGRpc2NhcmRzIGxlYWRpbmcgQk9NIGNoYXJhY3RlcnMuCiAgICAgIC8vIFRPRE8oZmxvaXRzY2gpOiBkb24ndCBqdXN0IGFzc3VtZSB0aGF0IHJlbW92ZWQgY2hhcmFjdGVycyB3ZXJlIHRoZQogICAgICAvLyBCT00uCiAgICAgIGFzc2VydChjb250YWluc0JvbUF0KHN0YXJ0T2Zmc2V0KSk7CiAgICAgIGNvZGVQb2ludCA9IG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWNvZGVCb21DaGFyYWN0ZXJSdW5lKTsKICAgIH0KICAgIGlmIChjb2RlUG9pbnQubGVuZ3RoID09IDEpIHsKICAgICAgdXRmOFNsYWNrICs9IChudW1CeXRlcyAtIDEpOwogICAgICBzY2FuU2xhY2sgPSBudW1CeXRlcyAtIDE7CiAgICAgIHNjYW5TbGFja09mZnNldCA9IGJ5dGVPZmZzZXQ7CiAgICAgIHJldHVybiBjb2RlUG9pbnQuY29kZVVuaXRBdCgwKTsKICAgIH0gZWxzZSBpZiAoY29kZVBvaW50Lmxlbmd0aCA9PSAyKSB7CiAgICAgIHV0ZjhTbGFjayArPSAobnVtQnl0ZXMgLSAyKTsKICAgICAgc2NhblNsYWNrID0gbnVtQnl0ZXMgLSAxOwogICAgICBzY2FuU2xhY2tPZmZzZXQgPSBieXRlT2Zmc2V0OwogICAgICBzdHJpbmdPZmZzZXRTbGFja09mZnNldCA9IGJ5dGVPZmZzZXQ7CiAgICAgIC8vIEluIGNhc2Ugb2YgYSBzdXJyb2dhdGUgcGFpciwgcmV0dXJuIGEgc2luZ2xlIGNvZGUgcG9pbnQuCiAgICAgIC8vIEdyYWNlZnVsbHkgZGVncmFkZSBnaXZlbiBpbnZhbGlkIFVURi04LgogICAgICB2YXIgcnVuZXMgPSBjb2RlUG9pbnQucnVuZXMuaXRlcmF0b3I7CiAgICAgIGlmICghcnVuZXMubW92ZU5leHQoKSkgcmV0dXJuIHVuaWNvZGVSZXBsYWNlbWVudENoYXJhY3RlcjsKICAgICAgdmFyIGNvZGVVbml0ID0gcnVuZXMuY3VycmVudDsKICAgICAgcmV0dXJuICFydW5lcy5tb3ZlTmV4dCgpID8gY29kZVVuaXQgOiB1bmljb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXI7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyOwogICAgfQogIH0KCiAgaW50IGxhc3RVbmljb2RlT2Zmc2V0ID0gLTE7CiAgaW50IGN1cnJlbnRBc1VuaWNvZGUoaW50IG5leHQpIHsKICAgIGlmIChuZXh0IDwgMTI4KSByZXR1cm4gbmV4dDsKICAgIC8vIENoZWNrIGlmIGN1cnJlbnRBc1VuaWNvZGUgd2FzIGFscmVhZHkgaW52b2tlZC4KICAgIGlmIChieXRlT2Zmc2V0ID09IGxhc3RVbmljb2RlT2Zmc2V0KSByZXR1cm4gbmV4dDsKICAgIGludCByZXMgPSBuZXh0Q29kZVBvaW50KGJ5dGVPZmZzZXQsIG5leHQpOwogICAgbGFzdFVuaWNvZGVPZmZzZXQgPSBieXRlT2Zmc2V0OwogICAgcmV0dXJuIHJlczsKICB9CgogIHZvaWQgaGFuZGxlVW5pY29kZShpbnQgc3RhcnRTY2FuT2Zmc2V0KSB7CiAgICBpbnQgZW5kID0gYnl0ZU9mZnNldDsKICAgIC8vIFRPRE8obHJ5KTogdGhpcyBtZWFzdXJhYmx5IHNsb3dzIGRvd24gdGhlIHNjYW5uZXIgZm9yIGZpbGVzIHdpdGggdW5pY29kZS4KICAgIFN0cmluZyBzID0KICAgICAgICB1dGY4LmRlY29kZShieXRlcy5zdWJsaXN0KHN0YXJ0U2Nhbk9mZnNldCwgZW5kKSwgYWxsb3dNYWxmb3JtZWQ6IHRydWUpOwogICAgdXRmOFNsYWNrICs9IChlbmQgLSBzdGFydFNjYW5PZmZzZXQpIC0gcy5sZW5ndGg7CiAgfQoKICAvKioKICAgKiBUaGlzIGZpZWxkIHJlbWVtYmVycyB0aGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGxhc3QgY2hhcmFjdGVyIGRlY29kZWQgd2l0aAogICAqIFtuZXh0Q29kZVBvaW50XSB0aGF0IHVzZWQgdHdvIGNvZGUgdW5pdHMgaW4gVVRGLTE2LgogICAqCiAgICogW25leHRDb2RlUG9pbnRdIHJldHVybnMgYSBzaW5nbGUgY29kZSBwb2ludCBmb3IgZWFjaCB1bmljb2RlIGNoYXJhY3RlciwKICAgKiBldmVuIGlmIGl0IG5lZWRzIHR3byBjb2RlIHVuaXRzIGluIFVURi0xNi4KICAgKgogICAqIEZvciBleGFtcGxlLCAnXHV7MWQxMWV9JyB1c2VzIDQgYnl0ZXMgaW4gVVRGLTgsIGFuZCB0d28gY29kZSB1bml0cyBpbgogICAqIFVURi0xNi4gVGhlIFt1dGY4U2xhY2tdIGlzIHRoZXJlZm9yZSAyLiBBZnRlciBpbnZva2luZyBbbmV4dENvZGVQb2ludF0sIHRoZQogICAqIFtieXRlT2Zmc2V0XSBwb2ludHMgdG8gdGhlIGxhc3QgKG9mIDQpIGJ5dGVzLiBUaGUgW3N0cmluZ09mZnNldF0gc2hvdWxkCiAgICogcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IG9uZSwgd2hpY2ggaXMgb25lIHBvc2l0aW9uIG1vcmUgbGVmdCB0aGFuCiAgICogdGhlIFt1dGY4U2xhY2tdLgogICAqLwogIGludCBzdHJpbmdPZmZzZXRTbGFja09mZnNldCA9IC0xOwoKICBpbnQgZ2V0IHN0cmluZ09mZnNldCB7CiAgICBpZiAoc3RyaW5nT2Zmc2V0U2xhY2tPZmZzZXQgPT0gYnl0ZU9mZnNldCkgewogICAgICByZXR1cm4gYnl0ZU9mZnNldCAtIHV0ZjhTbGFjayAtIDE7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gYnl0ZU9mZnNldCAtIHV0ZjhTbGFjazsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGFuYWx5emVyLlN0cmluZ1Rva2VuIGNyZWF0ZVN1YnN0cmluZ1Rva2VuKAogICAgICBUb2tlblR5cGUgdHlwZSwgaW50IHN0YXJ0LCBib29sIGFzY2lpT25seSwKICAgICAgW2ludCBleHRyYU9mZnNldCA9IDBdKSB7CiAgICByZXR1cm4gbmV3IFN0cmluZ1Rva2VuLmZyb21VdGY4Qnl0ZXMoCiAgICAgICAgdHlwZSwgYnl0ZXMsIHN0YXJ0LCBieXRlT2Zmc2V0ICsgZXh0cmFPZmZzZXQsIGFzY2lpT25seSwgdG9rZW5TdGFydCwKICAgICAgICBwcmVjZWRpbmdDb21tZW50czogY29tbWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYW5hbHl6ZXIuU3RyaW5nVG9rZW4gY3JlYXRlU3ludGhldGljU3Vic3RyaW5nVG9rZW4oCiAgICAgIFRva2VuVHlwZSB0eXBlLCBpbnQgc3RhcnQsIGJvb2wgYXNjaWlPbmx5LCBTdHJpbmcgc3ludGhldGljQ2hhcnMpIHsKICAgIFN0cmluZyBzb3VyY2UgPSBTdHJpbmdUb2tlbi5kZWNvZGVVdGY4KGJ5dGVzLCBzdGFydCwgYnl0ZU9mZnNldCwgYXNjaWlPbmx5KTsKICAgIHJldHVybiBuZXcgU3ludGhldGljU3RyaW5nVG9rZW4oCiAgICAgICAgdHlwZSwgc291cmNlICsgc3ludGhldGljQ2hhcnMsIHRva2VuU3RhcnQsIHNvdXJjZS5sZW5ndGgpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29tbWVudFRva2VuIGNyZWF0ZUNvbW1lbnRUb2tlbihUb2tlblR5cGUgdHlwZSwgaW50IHN0YXJ0LCBib29sIGFzY2lpT25seSwKICAgICAgW2ludCBleHRyYU9mZnNldCA9IDBdKSB7CiAgICByZXR1cm4gbmV3IENvbW1lbnRUb2tlbi5mcm9tVXRmOEJ5dGVzKAogICAgICAgIHR5cGUsIGJ5dGVzLCBzdGFydCwgYnl0ZU9mZnNldCArIGV4dHJhT2Zmc2V0LCBhc2NpaU9ubHksIHRva2VuU3RhcnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydERvY1Rva2VuIGNyZWF0ZURhcnREb2NUb2tlbihUb2tlblR5cGUgdHlwZSwgaW50IHN0YXJ0LCBib29sIGFzY2lpT25seSwKICAgICAgW2ludCBleHRyYU9mZnNldCA9IDBdKSB7CiAgICByZXR1cm4gbmV3IERhcnREb2NUb2tlbi5mcm9tVXRmOEJ5dGVzKAogICAgICAgIHR5cGUsIGJ5dGVzLCBzdGFydCwgYnl0ZU9mZnNldCArIGV4dHJhT2Zmc2V0LCBhc2NpaU9ubHksIHRva2VuU3RhcnQpOwogIH0KCiAgYm9vbCBhdEVuZE9mRmlsZSgpID0+IGJ5dGVPZmZzZXQgPj0gYnl0ZXMubGVuZ3RoIC0gMTsKfQqA7gBOTjwBKgE6AUgBQAE7AUIBOgEETB4EMwYXBSUGEwEGQgVMUC8GFwEGT0pEBUtOTDAGFQEGTgYcAQZLEAYXKSUNGQYEAQZQOAYVAQZJSzAFTUxCBj5CHRsrBAEjLwEoKCwqBAEoAScBTyA1GxsvIh0iHSIdDS8GFjIqDwgSBiYaQyoGTEUXTCE8TA4qRAYhIyAkJigjICQsQjEsQSRJDSoGBAEeIyE2Ni8kEAQBLBpRD1A1BAEGTTkFTTAFS1FNThYGJAEZMSkNJQYEAQwtMR8qTSYEAQw2SlElQwQBDE0fK04EAQxNHytOBAE4AgE7cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NjYW5uZXIvdXRmOF9ieXRlc19zY2FubmVyLmRhcnQ5c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3NjYW5uZXIvcmVjb3Zlci5kYXJ0nhcvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZXQgaGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5zY2FubmVyLnJlY292ZXI7CgppbXBvcnQgJy4uLy4uL3NjYW5uZXIvdG9rZW4uZGFydCcgc2hvdyBUb2tlblR5cGU7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnCiAgICBzaG93CiAgICAgICAgQ29kZSwKICAgICAgICBjb2RlQXNjaWlDb250cm9sQ2hhcmFjdGVyLAogICAgICAgIGNvZGVFbmNvZGluZywKICAgICAgICBjb2RlRXhwZWN0ZWRIZXhEaWdpdCwKICAgICAgICBjb2RlTWlzc2luZ0V4cG9uZW50LAogICAgICAgIGNvZGVOb25Bc2NpaUlkZW50aWZpZXIsCiAgICAgICAgY29kZU5vbkFzY2lpV2hpdGVzcGFjZSwKICAgICAgICBjb2RlVW5leHBlY3RlZERvbGxhckluU3RyaW5nLAogICAgICAgIGNvZGVVbm1hdGNoZWRUb2tlbiwKICAgICAgICBjb2RlVW50ZXJtaW5hdGVkQ29tbWVudCwKICAgICAgICBjb2RlVW50ZXJtaW5hdGVkU3RyaW5nOwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJ3Rva2VuLmRhcnQnIHNob3cgU3RyaW5nVG9rZW47CgppbXBvcnQgJ2Vycm9yX3Rva2VuLmRhcnQnIHNob3cgTm9uQXNjaWlJZGVudGlmaWVyVG9rZW4sIEVycm9yVG9rZW47CgovLy8gUmVjb3ZlciBmcm9tIGVycm9ycyBpbiBbdG9rZW5zXS4gVGhlIG9yaWdpbmFsIHNvdXJjZXMgYXJlIHByb3ZpZGVkIGFzCi8vLyBbYnl0ZXNdLiBbbGluZVN0YXJ0c10gYXJlIHRoZSBiZWdpbm5pbmcgY2hhcmFjdGVyIG9mZnNldHMgb2YgbGluZXMsIGFuZAovLy8gbXVzdCBiZSB1cGRhdGVkIGlmIHJlY292ZXJ5IGlzIHBlcmZvcm1lZCByZXdyaXRpbmcgdGhlIG9yaWdpbmFsIHNvdXJjZQovLy8gY29kZS4KVG9rZW4gZGVmYXVsdFJlY292ZXJ5U3RyYXRlZ3koCiAgICBMaXN0PGludD4gYnl0ZXMsIFRva2VuIHRva2VucywgTGlzdDxpbnQ+IGxpbmVTdGFydHMpIHsKICAvLyBTZWUgW1BhcnNlci5yZXBvcnRFcnJvclRva2VuXSguLi9wYXJzZXIvc3JjL3BhcnNlci5kYXJ0KSBmb3IgaG93CiAgLy8gaXQgY3VycmVudGx5IGhhbmRsZXMgbGV4aWNhbCBlcnJvcnMuIEluIGFkZGl0aW9uLCBub3RpY2UgaG93IHRoZSBwYXJzZXIKICAvLyBjYWxscyBbaGFuZGxlSW52YWxpZEV4cHJlc3Npb25dLCBbaGFuZGxlSW52YWxpZEZ1bmN0aW9uQm9keV0sIGFuZAogIC8vIFtoYW5kbGVJbnZhbGlkVHlwZVJlZmVyZW5jZV0gdG8gYWxsb3cgdGhlIGxpc3RlbmVyIHRvIHJlY292ZXIgaXRzIGludGVybmFsCiAgLy8gc3RhdGUuIFNlZSBbcGFja2FnZTpjb21waWxlci9zcmMvcGFyc2VyL2VsZW1lbnRfbGlzdGVuZXIuZGFydF0gZm9yIGFuCiAgLy8gZXhhbXBsZSBvZiBob3cgdGhlc2UgZXZlbnRzIGFyZSB1c2VkLgogIC8vCiAgLy8gSW4gYWRkaXRpb24sIHRoZSBzY2FubmVyIHdpbGwgYXR0ZW1wdCBhIGJpdCBvZiByZWNvdmVyeSB3aGVuIGJyYWNlcyBkb24ndAogIC8vIG1hdGNoIHVwIGR1cmluZyBicmFjZSBncm91cGluZy4gU2VlCiAgLy8gW0FycmF5QmFzZWRTY2FubmVyLmRpc2NhcmRCZWdpbkdyb3VwVW50aWxdKGFycmF5X2Jhc2VkX3NjYW5uZXIuZGFydCkuIEZvcgogIC8vIG1vcmUgZGV0YWlscyBvbiBicmFjZSBncm91cGluZyBzZWUKICAvLyBbQWJzdHJhY3RTY2FubmVyLnVubWF0Y2hlZEJlZ2luR3JvdXBdKGFic3RyYWN0X3NjYW5uZXIuZGFydCkuCgogIC8vLyBUb2tlbnMgd2l0aCBlcnJvcnMuCiAgRXJyb3JUb2tlbiBlcnJvcjsKCiAgLy8vIFVzZWQgZm9yIGFwcGVuZGluZyB0byBbZXJyb3JdLgogIEVycm9yVG9rZW4gZXJyb3JUYWlsOwoKICAvLy8gVG9rZW5zIHdpdGhvdXQgZXJyb3JzLgogIFRva2VuIGdvb2Q7CgogIC8vLyBVc2VkIGZvciBhcHBlbmRpbmcgdG8gW2dvb2RdLgogIFRva2VuIGdvb2RUYWlsOwoKICAvLy8gVGhlIHByZXZpb3VzIHRva2VuIGFwcGVuZGVkIHRvIFtnb29kXS4gU2luY2UgdG9rZW5zIGFyZSBzaW5nbGUgbGlua2VkCiAgLy8vIGxpc3RzLCB0aGlzIGFsbG93cyB1cyB0byByZXdyaXRlIHRoZSBjdXJyZW50IHRva2VuIHdpdGhvdXQgc2Nhbm5pbmcgYWxsCiAgLy8vIG9mIFtnb29kXS4gVGhpcyBpcyBzdXBwb3NlZCB0byBiZSB0aGUgdG9rZW4gaW1tZWRpYXRlbHkgYmVmb3JlCiAgLy8vIFtnb29kVGFpbF0sIHRoYXQgaXMsIGBiZWZvcmVHb29kVGFpbC5uZXh0ID09IGdvb2RUYWlsYC4KICBUb2tlbiBiZWZvcmVHb29kVGFpbDsKCiAgcmVjb3ZlcklkZW50aWZpZXIoTm9uQXNjaWlJZGVudGlmaWVyVG9rZW4gZmlyc3QpIHsKICAgIExpc3Q8aW50PiBjb2RlVW5pdHMgPSA8aW50PltdOwoKICAgIC8vIFRydWUgaWYgdGhlIHByZXZpb3VzIGdvb2QgdG9rZW4gaXMgYW4gaWRlbnRpZmllciBhbmQgZW5kcyByaWdodCB3aGVyZQogICAgLy8gW2ZpcnN0XSBzdGFydHMuIFRoaXMgaXMgdGhlIGNhc2UgZm9yIGlucHV0IGxpa2UgYGJsw6Viw6ZyZ3LDuGRgLiBJbiB0aGlzCiAgICAvLyBjYXNlLCB0aGUgc2Nhbm5lciBwcm9kdWNlcyB0aGlzIHNlcXVlbmNlIG9mIHRva2VuczoKICAgIC8vCiAgICAvLyAgICAgWwogICAgLy8gICAgICAgIFN0cmluZ1Rva2VuKCJibCIpLAogICAgLy8gICAgICAgIE5vbkFzY2lpSWRlbnRpZmllclRva2VuKCLDpSIpLAogICAgLy8gICAgICAgIFN0cmluZ1Rva2VuKCJiIiksCiAgICAvLyAgICAgICAgTm9uQXNjaWlJZGVudGlmaWVyVG9rZW4oIsOmIiksCiAgICAvLyAgICAgICAgU3RyaW5nVG9rZW4oInJnciIpLAogICAgLy8gICAgICAgIE5vbkFzY2lpSWRlbnRpZmllclRva2VuKCLDuCIpLAogICAgLy8gICAgICAgIFN0cmluZ1Rva2VuKCJkIiksCiAgICAvLyAgICAgICAgRU9GLAogICAgLy8gICAgIF0KICAgIGJvb2wgcHJlcGVuZCA9IGZhbHNlOwoKICAgIC8vIFRydWUgaWYgZm9sbG93aW5nIHRva2VuIGlzIGFsc28gYW4gaWRlbnRpZmllciB0aGF0IHN0YXJ0cyByaWdodCB3aGVyZQogICAgLy8gW2Vycm9yVGFpbF0gZW5kcy4gVGhpcyBpcyB0aGUgY2FzZSBmb3IgImIiIGFib3ZlLgogICAgYm9vbCBhcHBlbmQgPSBmYWxzZTsKICAgIGlmIChnb29kVGFpbCAhPSBudWxsKSB7CiAgICAgIGlmIChnb29kVGFpbC50eXBlID09IFRva2VuVHlwZS5JREVOVElGSUVSICYmCiAgICAgICAgICBnb29kVGFpbC5jaGFyRW5kID09IGZpcnN0LmNoYXJPZmZzZXQpIHsKICAgICAgICBwcmVwZW5kID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgVG9rZW4gbmV4dCA9IGVycm9yVGFpbC5uZXh0OwogICAgaWYgKG5leHQudHlwZSA9PSBUb2tlblR5cGUuSURFTlRJRklFUiAmJgogICAgICAgIGVycm9yVGFpbC5jaGFyT2Zmc2V0ICsgMSA9PSBuZXh0LmNoYXJPZmZzZXQpIHsKICAgICAgYXBwZW5kID0gdHJ1ZTsKICAgIH0KICAgIGlmIChwcmVwZW5kKSB7CiAgICAgIGNvZGVVbml0cy5hZGRBbGwoZ29vZFRhaWwubGV4ZW1lLmNvZGVVbml0cyk7CiAgICB9CiAgICBOb25Bc2NpaUlkZW50aWZpZXJUb2tlbiBjdXJyZW50ID0gZmlyc3Q7CiAgICB3aGlsZSAoY3VycmVudCAhPSBlcnJvclRhaWwpIHsKICAgICAgY29kZVVuaXRzLmFkZChjdXJyZW50LmNoYXJhY3Rlcik7CiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7CiAgICB9CiAgICBjb2RlVW5pdHMuYWRkKGVycm9yVGFpbC5jaGFyYWN0ZXIpOwogICAgaW50IGNoYXJPZmZzZXQgPSBmaXJzdC5jaGFyT2Zmc2V0OwogICAgaWYgKHByZXBlbmQpIHsKICAgICAgY2hhck9mZnNldCA9IGdvb2RUYWlsLmNoYXJPZmZzZXQ7CiAgICAgIGlmIChiZWZvcmVHb29kVGFpbCA9PSBudWxsKSB7CiAgICAgICAgLy8gV2UncmUgcHJlcGVuZGluZyB0aGUgZmlyc3QgZ29vZCB0b2tlbiwgc28gdGhlIG5ldyB0b2tlbiB3aWxsIGJlY29tZQogICAgICAgIC8vIHRoZSBmaXJzdCBnb29kIHRva2VuLgogICAgICAgIGdvb2QgPSBudWxsOwogICAgICAgIGdvb2RUYWlsID0gbnVsbDsKICAgICAgICBiZWZvcmVHb29kVGFpbCA9IG51bGw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZ29vZFRhaWwgPSBiZWZvcmVHb29kVGFpbDsKICAgICAgfQogICAgfQogICAgaWYgKGFwcGVuZCkgewogICAgICBjb2RlVW5pdHMuYWRkQWxsKG5leHQubGV4ZW1lLmNvZGVVbml0cyk7CiAgICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICB9CiAgICBTdHJpbmcgdmFsdWUgPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoY29kZVVuaXRzKTsKICAgIHJldHVybiBzeW50aGVzaXplVG9rZW4oY2hhck9mZnNldCwgdmFsdWUsIFRva2VuVHlwZS5JREVOVElGSUVSKQogICAgICAuLnNldE5leHQobmV4dCk7CiAgfQoKICByZWNvdmVyRXhwb25lbnQoKSB7CiAgICByZXR1cm4gZXJyb3JUYWlsLm5leHQ7CiAgfQoKICByZWNvdmVyU3RyaW5nKCkgewogICAgcmV0dXJuIGVycm9yVGFpbC5uZXh0OwogIH0KCiAgcmVjb3ZlckhleERpZ2l0KCkgewogICAgcmV0dXJuIHN5bnRoZXNpemVUb2tlbihlcnJvclRhaWwuY2hhck9mZnNldCwgIjAiLCBUb2tlblR5cGUuSU5UKQogICAgICAuLnNldE5leHQoZXJyb3JUYWlsLm5leHQpOwogIH0KCiAgcmVjb3ZlclN0cmluZ0ludGVycG9sYXRpb24oKSB7CiAgICByZXR1cm4gZXJyb3JUYWlsLm5leHQ7CiAgfQoKICByZWNvdmVyQ29tbWVudCgpIHsKICAgIC8vIFRPRE8oYWhlKTogSW1wcm92ZSB0aGlzLgogICAgcmV0dXJuIHNraXBUb0VvZihlcnJvclRhaWwpOwogIH0KCiAgcmVjb3ZlclVubWF0Y2hlZCgpIHsKICAgIC8vIFRPRE8oYWhlKTogVHJ5IHRvIHVzZSB0b3AtbGV2ZWwga2V5d29yZHMgKHN1Y2ggYXMgYGNsYXNzYCwgYHR5cGVkZWZgLAogICAgLy8gYW5kIGBlbnVtYCkgYW5kIGluZGVudGF0aW9uIHRvIHJlY292ZXIuCiAgICByZXR1cm4gZXJyb3JUYWlsLm5leHQ7CiAgfQoKICBmb3IgKFRva2VuIGN1cnJlbnQgPSB0b2tlbnM7ICFjdXJyZW50LmlzRW9mOyBjdXJyZW50ID0gY3VycmVudC5uZXh0KSB7CiAgICB3aGlsZSAoY3VycmVudCBpcyBFcnJvclRva2VuKSB7CiAgICAgIEVycm9yVG9rZW4gZmlyc3QgPSBjdXJyZW50OwogICAgICBUb2tlbiBuZXh0ID0gY3VycmVudDsKICAgICAgZG8gewogICAgICAgIGN1cnJlbnQgPSBuZXh0OwogICAgICAgIGlmIChlcnJvclRhaWwgPT0gbnVsbCkgewogICAgICAgICAgZXJyb3IgPSBuZXh0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlcnJvclRhaWwuc2V0TmV4dChuZXh0KTsKICAgICAgICB9CiAgICAgICAgZXJyb3JUYWlsID0gbmV4dDsKICAgICAgICBuZXh0ID0gbmV4dC5uZXh0OwogICAgICB9IHdoaWxlIChuZXh0IGlzIEVycm9yVG9rZW4gJiYgZmlyc3QuZXJyb3JDb2RlID09IG5leHQuZXJyb3JDb2RlKTsKCiAgICAgIENvZGUgY29kZSA9IGZpcnN0LmVycm9yQ29kZTsKICAgICAgaWYgKGNvZGUgPT0gY29kZUVuY29kaW5nIHx8CiAgICAgICAgICBjb2RlID09IGNvZGVOb25Bc2NpaVdoaXRlc3BhY2UgfHwKICAgICAgICAgIGNvZGUgPT0gY29kZUFzY2lpQ29udHJvbENoYXJhY3RlcikgewogICAgICAgIGN1cnJlbnQgPSBlcnJvclRhaWwubmV4dDsKICAgICAgfSBlbHNlIGlmIChjb2RlID09IGNvZGVOb25Bc2NpaUlkZW50aWZpZXIpIHsKICAgICAgICBjdXJyZW50ID0gcmVjb3ZlcklkZW50aWZpZXIoZmlyc3QpOwogICAgICAgIGFzc2VydChjdXJyZW50Lm5leHQgIT0gbnVsbCk7CiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSBjb2RlTWlzc2luZ0V4cG9uZW50KSB7CiAgICAgICAgY3VycmVudCA9IHJlY292ZXJFeHBvbmVudCgpOwogICAgICAgIGFzc2VydChjdXJyZW50Lm5leHQgIT0gbnVsbCk7CiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSBjb2RlVW50ZXJtaW5hdGVkU3RyaW5nKSB7CiAgICAgICAgY3VycmVudCA9IHJlY292ZXJTdHJpbmcoKTsKICAgICAgICBhc3NlcnQoY3VycmVudC5uZXh0ICE9IG51bGwpOwogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gY29kZUV4cGVjdGVkSGV4RGlnaXQpIHsKICAgICAgICBjdXJyZW50ID0gcmVjb3ZlckhleERpZ2l0KCk7CiAgICAgICAgYXNzZXJ0KGN1cnJlbnQubmV4dCAhPSBudWxsKTsKICAgICAgfSBlbHNlIGlmIChjb2RlID09IGNvZGVVbmV4cGVjdGVkRG9sbGFySW5TdHJpbmcpIHsKICAgICAgICBjdXJyZW50ID0gcmVjb3ZlclN0cmluZ0ludGVycG9sYXRpb24oKTsKICAgICAgICBhc3NlcnQoY3VycmVudC5uZXh0ICE9IG51bGwpOwogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gY29kZVVudGVybWluYXRlZENvbW1lbnQpIHsKICAgICAgICBjdXJyZW50ID0gcmVjb3ZlckNvbW1lbnQoKTsKICAgICAgICBhc3NlcnQoY3VycmVudC5uZXh0ICE9IG51bGwpOwogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gY29kZVVubWF0Y2hlZFRva2VuKSB7CiAgICAgICAgY3VycmVudCA9IHJlY292ZXJVbm1hdGNoZWQoKTsKICAgICAgICBhc3NlcnQoY3VycmVudC5uZXh0ICE9IG51bGwpOwogICAgICB9IGVsc2UgewogICAgICAgIGN1cnJlbnQgPSBlcnJvclRhaWwubmV4dDsKICAgICAgfQogICAgfQogICAgaWYgKGdvb2RUYWlsID09IG51bGwpIHsKICAgICAgZ29vZCA9IGN1cnJlbnQ7CiAgICB9IGVsc2UgewogICAgICBnb29kVGFpbC5zZXROZXh0KGN1cnJlbnQpOwogICAgfQogICAgYmVmb3JlR29vZFRhaWwgPSBnb29kVGFpbDsKICAgIGdvb2RUYWlsID0gY3VycmVudDsKICB9CgogIGlmIChlcnJvciA9PSBudWxsKSB7CiAgICAvLyBBbGwgb2YgdGhlIGVycm9ycyBhcmUgaW4gdGhlIHNjYW5uZXIncyBlcnJvciBsaXN0LgogICAgcmV0dXJuIHRva2VuczsKICB9CiAgbmV3IFRva2VuLmVvZigtMSkuc2V0TmV4dChlcnJvcik7CiAgVG9rZW4gdGFpbDsKICBpZiAoZ29vZCAhPSBudWxsKSB7CiAgICBlcnJvclRhaWwuc2V0TmV4dChnb29kKTsKICAgIHRhaWwgPSBnb29kVGFpbDsKICB9IGVsc2UgewogICAgdGFpbCA9IGVycm9yVGFpbDsKICB9CiAgaWYgKCF0YWlsLmlzRW9mKSB0YWlsLnNldE5leHQobmV3IFRva2VuLmVvZih0YWlsLmVuZCkpOwogIHJldHVybiBlcnJvcjsKfQoKVG9rZW4gc3ludGhlc2l6ZVRva2VuKGludCBjaGFyT2Zmc2V0LCBTdHJpbmcgdmFsdWUsIFRva2VuVHlwZSB0eXBlKSB7CiAgcmV0dXJuIG5ldyBTdHJpbmdUb2tlbi5mcm9tU3RyaW5nKHR5cGUsIHZhbHVlLCBjaGFyT2Zmc2V0KTsKfQoKVG9rZW4gc2tpcFRvRW9mKFRva2VuIHRva2VuKSB7CiAgd2hpbGUgKCF0b2tlbi5pc0VvZikgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogIH0KICByZXR1cm4gdG9rZW47Cn0KClN0cmluZyBjbG9zZUJyYWNlRm9yKFN0cmluZyBvcGVuQnJhY2UpIHsKICByZXR1cm4gY29uc3QgewogICAgJygnOiAnKScsCiAgICAnWyc6ICddJywKICAgICd7JzogJ30nLAogICAgJzwnOiAnPicsCiAgICByJyR7JzogJ30nLAogIH1bb3BlbkJyYWNlXTsKfQoKU3RyaW5nIGNsb3NlUXVvdGVGb3IoU3RyaW5nIG9wZW5RdW90ZSkgewogIHJldHVybiBjb25zdCB7CiAgICAnIic6ICciJywKICAgICInIjogIiciLAogICAgJyIiIic6ICciIiInLAogICAgIicnJyI6ICInJyciLAogICAgJ3IiJzogJyInLAogICAgInInIjogIiciLAogICAgJ3IiIiInOiAnIiIiJywKICAgICJyJycnIjogIicnJyIsCiAgfVtvcGVuUXVvdGVdOwp9CoEGAE5OPAEfATIBHQkOIxYeHSAgJhwhIAEuASYBRAFKTEsKHztGTUdQSysFTylPKEMBGhQBJRgBHQ4BJBIBTE5FPhgBNSMBTU07Bw0hLCAsIiwgEw0aAU05GRwzMhgIBiEtNxUGEzMGLSMoHgYoJxMoJE8hFRkfDyMIBhIvGAY4RBcEARYbBAEUGwQBFkUhBAEhGwQBFSAhBAEXTS8bBAFJJCIcCxghGBEjChoaSQEjIiwvIjMsJjAlJjMjJjElJjkwJjQkJi8mJg8iCAYcFg0hBh8YBAEXOhMEJA4WHRULFgQ6EAIBRj4CAR8ZGAQQAgEpEQ4ODg4QEAIBKREODhISDw8TExACATBwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc2Nhbm5lci9yZWNvdmVyLmRhcnQ9c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3NjYW5uZXIvZXJyb3JfdG9rZW4uZGFydJeZLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2V0IGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydF9zY2FubmVyLmVycm9yX3Rva2VuOwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgQmVnaW5Ub2tlbiwgU2ltcGxlVG9rZW4sIFRva2VuVHlwZTsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cKICAgICAgICBDb2RlLAogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgbWVzc2FnZUVuY29kaW5nLAogICAgICAgIHRlbXBsYXRlQXNjaWlDb250cm9sQ2hhcmFjdGVyLAogICAgICAgIHRlbXBsYXRlTm9uQXNjaWlJZGVudGlmaWVyLAogICAgICAgIHRlbXBsYXRlTm9uQXNjaWlXaGl0ZXNwYWNlLAogICAgICAgIHRlbXBsYXRlVW5tYXRjaGVkVG9rZW4sCiAgICAgICAgdGVtcGxhdGVVbnN1cHBvcnRlZE9wZXJhdG9yLAogICAgICAgIHRlbXBsYXRlVW50ZXJtaW5hdGVkU3RyaW5nOwoKaW1wb3J0ICcuLi9zY2FubmVyLmRhcnQnIHNob3cgVG9rZW4sIHVuaWNvZGVSZXBsYWNlbWVudENoYXJhY3RlcjsKCmltcG9ydCAnLi4vc2Nhbm5lci9yZWNvdmVyLmRhcnQnIHNob3cgY2xvc2VCcmFjZUZvciwgY2xvc2VRdW90ZUZvcjsKCkVycm9yVG9rZW4gYnVpbGRVbmV4cGVjdGVkQ2hhcmFjdGVyVG9rZW4oaW50IGNoYXJhY3RlciwgaW50IGNoYXJPZmZzZXQpIHsKICBpZiAoY2hhcmFjdGVyIDwgMHgxZikgewogICAgcmV0dXJuIG5ldyBBc2NpaUNvbnRyb2xDaGFyYWN0ZXJUb2tlbihjaGFyYWN0ZXIsIGNoYXJPZmZzZXQpOwogIH0KICBzd2l0Y2ggKGNoYXJhY3RlcikgewogICAgY2FzZSB1bmljb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXI6CiAgICAgIHJldHVybiBuZXcgRW5jb2RpbmdFcnJvclRva2VuKGNoYXJPZmZzZXQpOwoKICAgIC8vLyBTZWUgW0dlbmVyYWwgUHVuY3R1YXRpb25dCiAgICAvLy8gKGh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL1BERi9VMjAwMC5wZGYpLgogICAgY2FzZSAweDAwQTA6IC8vIE5vLWJyZWFrIHNwYWNlLgogICAgY2FzZSAweDE2ODA6IC8vIE9naGFtIHNwYWNlIG1hcmsuCiAgICBjYXNlIDB4MTgwRTogLy8gTW9uZ29saWFuIHZvd2VsIHNlcGFyYXRvci4KICAgIGNhc2UgMHgyMDAwOiAvLyBFbiBxdWFkLgogICAgY2FzZSAweDIwMDE6IC8vIEVtIHF1YWQuCiAgICBjYXNlIDB4MjAwMjogLy8gRW4gc3BhY2UuCiAgICBjYXNlIDB4MjAwMzogLy8gRW0gc3BhY2UuCiAgICBjYXNlIDB4MjAwNDogLy8gVGhyZWUtcGVyLWVtIHNwYWNlLgogICAgY2FzZSAweDIwMDU6IC8vIEZvdXItcGVyLWVtIHNwYWNlLgogICAgY2FzZSAweDIwMDY6IC8vIFNpeC1wZXItZW0gc3BhY2UuCiAgICBjYXNlIDB4MjAwNzogLy8gRmlndXJlIHNwYWNlLgogICAgY2FzZSAweDIwMDg6IC8vIFB1bmN0dWF0aW9uIHNwYWNlLgogICAgY2FzZSAweDIwMDk6IC8vIFRoaW4gc3BhY2UuCiAgICBjYXNlIDB4MjAwQTogLy8gSGFpciBzcGFjZS4KICAgIGNhc2UgMHgyMDBCOiAvLyBaZXJvIHdpZHRoIHNwYWNlLgogICAgY2FzZSAweDIwMjg6IC8vIExpbmUgc2VwYXJhdG9yLgogICAgY2FzZSAweDIwMjk6IC8vIFBhcmFncmFwaCBzZXBhcmF0b3IuCiAgICBjYXNlIDB4MjAyRjogLy8gTmFycm93IG5vLWJyZWFrIHNwYWNlLgogICAgY2FzZSAweDIwNUY6IC8vIE1lZGl1bSBtYXRoZW1hdGljYWwgc3BhY2UuCiAgICBjYXNlIDB4MzAwMDogLy8gSWRlb2dyYXBoaWMgc3BhY2UuCiAgICBjYXNlIDB4RkVGRjogLy8gWmVybyB3aWR0aCBuby1icmVhayBzcGFjZS4KICAgICAgcmV0dXJuIG5ldyBOb25Bc2NpaVdoaXRlc3BhY2VUb2tlbihjaGFyYWN0ZXIsIGNoYXJPZmZzZXQpOwoKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBuZXcgTm9uQXNjaWlJZGVudGlmaWVyVG9rZW4oY2hhcmFjdGVyLCBjaGFyT2Zmc2V0KTsKICB9Cn0KCi8vLyBDb21tb24gc3VwZXJjbGFzcyBmb3IgYWxsIGVycm9yIHRva2Vucy4KLy8vCi8vLyBJdCdzIGNvbnNpZGVyZWQgYW4gaW1wbGVtZW50YXRpb24gZXJyb3IgdG8gYWNjZXNzIFtsZXhlbWVdIG9mIGFuCi8vLyBbRXJyb3JUb2tlbl0uCmFic3RyYWN0IGNsYXNzIEVycm9yVG9rZW4gZXh0ZW5kcyBTaW1wbGVUb2tlbiB7CiAgRXJyb3JUb2tlbihpbnQgb2Zmc2V0KSA6IHN1cGVyKFRva2VuVHlwZS5CQURfSU5QVVQsIG9mZnNldCwgbnVsbCk7CgogIC8vLyBUaGlzIGlzIGEgdG9rZW4gdGhhdCB3cmFwcyBhcm91bmQgYW4gZXJyb3IgbWVzc2FnZS4gUmV0dXJuIDEKICAvLy8gaW5zdGVhZCBvZiB0aGUgc2l6ZSBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBlcnJvciBtZXNzYWdlLgogIEBvdmVycmlkZQogIGludCBnZXQgbGVuZ3RoID0+IDE7CgogIFN0cmluZyBnZXQgbGV4ZW1lID0+IHRocm93IGFzc2VydGlvbk1lc3NhZ2UubWVzc2FnZTsKCiAgTWVzc2FnZSBnZXQgYXNzZXJ0aW9uTWVzc2FnZTsKCiAgQ29kZSBnZXQgZXJyb3JDb2RlID0+IGFzc2VydGlvbk1lc3NhZ2UuY29kZTsKCiAgaW50IGdldCBjaGFyYWN0ZXIgPT4gbnVsbDsKCiAgU3RyaW5nIGdldCBzdGFydCA9PiBudWxsOwoKICBpbnQgZ2V0IGVuZE9mZnNldCA9PiBudWxsOwoKICBCZWdpblRva2VuIGdldCBiZWdpbiA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBjb3B5KCkgewogICAgdGhyb3cgJ3Vuc3VwcG9ydGVkIG9wZXJhdGlvbic7CiAgfQp9CgovLy8gUmVwcmVzZW50cyBhbiBlbmNvZGluZyBlcnJvci4KY2xhc3MgRW5jb2RpbmdFcnJvclRva2VuIGV4dGVuZHMgRXJyb3JUb2tlbiB7CiAgRW5jb2RpbmdFcnJvclRva2VuKGludCBjaGFyT2Zmc2V0KSA6IHN1cGVyKGNoYXJPZmZzZXQpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiRW5jb2RpbmdFcnJvclRva2VuKCkiOwoKICBNZXNzYWdlIGdldCBhc3NlcnRpb25NZXNzYWdlID0+IG1lc3NhZ2VFbmNvZGluZzsKfQoKLy8vIFJlcHJlc2VudHMgYSBub24tQVNDSUkgY2hhcmFjdGVyIG91dHNpZGUgYSBzdHJpbmcgb3IgY29tbWVudC4KY2xhc3MgTm9uQXNjaWlJZGVudGlmaWVyVG9rZW4gZXh0ZW5kcyBFcnJvclRva2VuIHsKICBmaW5hbCBpbnQgY2hhcmFjdGVyOwoKICBOb25Bc2NpaUlkZW50aWZpZXJUb2tlbih0aGlzLmNoYXJhY3RlciwgaW50IGNoYXJPZmZzZXQpIDogc3VwZXIoY2hhck9mZnNldCk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJOb25Bc2NpaUlkZW50aWZpZXJUb2tlbigkY2hhcmFjdGVyKSI7CgogIE1lc3NhZ2UgZ2V0IGFzc2VydGlvbk1lc3NhZ2UgPT4gdGVtcGxhdGVOb25Bc2NpaUlkZW50aWZpZXIud2l0aEFyZ3VtZW50cygKICAgICAgbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKFtjaGFyYWN0ZXJdKSwgY2hhcmFjdGVyKTsKfQoKLy8vIFJlcHJlc2VudHMgYSBub24tQVNDSUkgd2hpdGVzcGFjZSBvdXRzaWRlIGEgc3RyaW5nIG9yIGNvbW1lbnQuCmNsYXNzIE5vbkFzY2lpV2hpdGVzcGFjZVRva2VuIGV4dGVuZHMgRXJyb3JUb2tlbiB7CiAgZmluYWwgaW50IGNoYXJhY3RlcjsKCiAgTm9uQXNjaWlXaGl0ZXNwYWNlVG9rZW4odGhpcy5jaGFyYWN0ZXIsIGludCBjaGFyT2Zmc2V0KSA6IHN1cGVyKGNoYXJPZmZzZXQpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiTm9uQXNjaWlXaGl0ZXNwYWNlVG9rZW4oJGNoYXJhY3RlcikiOwoKICBNZXNzYWdlIGdldCBhc3NlcnRpb25NZXNzYWdlID0+CiAgICAgIHRlbXBsYXRlTm9uQXNjaWlXaGl0ZXNwYWNlLndpdGhBcmd1bWVudHMoY2hhcmFjdGVyKTsKfQoKLy8vIFJlcHJlc2VudHMgYW4gQVNDSUkgY29udHJvbCBjaGFyYWN0ZXIgb3V0c2lkZSBhIHN0cmluZyBvciBjb21tZW50LgpjbGFzcyBBc2NpaUNvbnRyb2xDaGFyYWN0ZXJUb2tlbiBleHRlbmRzIEVycm9yVG9rZW4gewogIGZpbmFsIGludCBjaGFyYWN0ZXI7CgogIEFzY2lpQ29udHJvbENoYXJhY3RlclRva2VuKHRoaXMuY2hhcmFjdGVyLCBpbnQgY2hhck9mZnNldCkKICAgICAgOiBzdXBlcihjaGFyT2Zmc2V0KTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIkFzY2lpQ29udHJvbENoYXJhY3RlclRva2VuKCRjaGFyYWN0ZXIpIjsKCiAgTWVzc2FnZSBnZXQgYXNzZXJ0aW9uTWVzc2FnZSA9PgogICAgICB0ZW1wbGF0ZUFzY2lpQ29udHJvbENoYXJhY3Rlci53aXRoQXJndW1lbnRzKGNoYXJhY3Rlcik7Cn0KCi8vLyBEZW5vdGVzIGFuIG9wZXJhdG9yIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgRGFydCBsYW5ndWFnZS4KY2xhc3MgVW5zdXBwb3J0ZWRPcGVyYXRvciBleHRlbmRzIEVycm9yVG9rZW4gewogIFRva2VuIHRva2VuOwoKICBVbnN1cHBvcnRlZE9wZXJhdG9yKHRoaXMudG9rZW4sIGludCBjaGFyT2Zmc2V0KSA6IHN1cGVyKGNoYXJPZmZzZXQpOwoKICBAb3ZlcnJpZGUKICBNZXNzYWdlIGdldCBhc3NlcnRpb25NZXNzYWdlID0+CiAgICAgIHRlbXBsYXRlVW5zdXBwb3J0ZWRPcGVyYXRvci53aXRoQXJndW1lbnRzKHRva2VuKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIlVuc3VwcG9ydGVkT3BlcmF0b3IoJHt0b2tlbi5sZXhlbWV9KSI7Cn0KCi8vLyBSZXByZXNlbnRzIGFuIHVudGVybWluYXRlZCBzdHJpbmcuCmNsYXNzIFVudGVybWluYXRlZFN0cmluZyBleHRlbmRzIEVycm9yVG9rZW4gewogIGZpbmFsIFN0cmluZyBzdGFydDsKICBmaW5hbCBpbnQgZW5kT2Zmc2V0OwoKICBVbnRlcm1pbmF0ZWRTdHJpbmcodGhpcy5zdGFydCwgaW50IGNoYXJPZmZzZXQsIHRoaXMuZW5kT2Zmc2V0KQogICAgICA6IHN1cGVyKGNoYXJPZmZzZXQpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiVW50ZXJtaW5hdGVkU3RyaW5nKCRzdGFydCkiOwoKICBpbnQgZ2V0IGNoYXJDb3VudCA9PiBlbmRPZmZzZXQgLSBjaGFyT2Zmc2V0OwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBjaGFyQ291bnQ7CgogIE1lc3NhZ2UgZ2V0IGFzc2VydGlvbk1lc3NhZ2UgPT4KICAgICAgdGVtcGxhdGVVbnRlcm1pbmF0ZWRTdHJpbmcud2l0aEFyZ3VtZW50cyhzdGFydCwgY2xvc2VRdW90ZUZvcihzdGFydCkpOwp9CgovLy8gUmVwcmVzZW50cyBhbiB1bnRlcm1pbmF0ZWQgdG9rZW4uCmNsYXNzIFVudGVybWluYXRlZFRva2VuIGV4dGVuZHMgRXJyb3JUb2tlbiB7CiAgZmluYWwgTWVzc2FnZSBhc3NlcnRpb25NZXNzYWdlOwogIGZpbmFsIGludCBlbmRPZmZzZXQ7CgogIFVudGVybWluYXRlZFRva2VuKHRoaXMuYXNzZXJ0aW9uTWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIHRoaXMuZW5kT2Zmc2V0KQogICAgICA6IHN1cGVyKGNoYXJPZmZzZXQpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiVW50ZXJtaW5hdGVkVG9rZW4oJHthc3NlcnRpb25NZXNzYWdlLmNvZGUubmFtZX0pIjsKCiAgaW50IGdldCBjaGFyQ291bnQgPT4gZW5kT2Zmc2V0IC0gY2hhck9mZnNldDsKfQoKLy8vIFJlcHJlc2VudHMgYW4gb3BlbiBicmFjZSB3aXRob3V0IGEgbWF0Y2hpbmcgY2xvc2UgYnJhY2UuCi8vLwovLy8gSW4gdGhpcyBjYXNlLCBicmFjZSBtZWFucyBhbnkgb2YgYChgLCBge2AsIGBbYCwgYW5kIGA8YCwgcGFyZW50aGVzaXMsIGN1cmx5Ci8vLyBicmFjZSwgc3F1YXJlIGJyYWNlLCBhbmQgYW5nbGUgYnJhY2UsIHJlc3BlY3RpdmVseS4KY2xhc3MgVW5tYXRjaGVkVG9rZW4gZXh0ZW5kcyBFcnJvclRva2VuIHsKICBmaW5hbCBCZWdpblRva2VuIGJlZ2luOwoKICBVbm1hdGNoZWRUb2tlbihCZWdpblRva2VuIGJlZ2luKQogICAgICA6IHRoaXMuYmVnaW4gPSBiZWdpbiwKICAgICAgICBzdXBlcihiZWdpbi5jaGFyT2Zmc2V0KTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIlVubWF0Y2hlZFRva2VuKCR7YmVnaW4ubGV4ZW1lfSkiOwoKICBNZXNzYWdlIGdldCBhc3NlcnRpb25NZXNzYWdlID0+CiAgICAgIHRlbXBsYXRlVW5tYXRjaGVkVG9rZW4ud2l0aEFyZ3VtZW50cyhjbG9zZUJyYWNlRm9yKGJlZ2luLmxleGVtZSksIGJlZ2luKTsKfQqAywBOTjwBIgFLAR0JDhEZJyQkICUkAUIBRAFKGkIEFyYxASI3JCYvHR0eHignJiInICAmJCkrLycvQQENQQQCASwERRIwRQFDPgwXATcBIAEvAR0BHAEdASABDBEjBAIBIi46AS8BMwIBQjMXAU8BPgFMOQIBQzMXAU8BPgEiOwIBRzYXAT0bAUEBIj4CAUQvDwFHAQwiOAEMPwIBJy4WFwFBGwE1AS8BHwEiTQIBJi0iFwFLGwFLAS8CAT0EUDgqGgEjHCEBOgEiUAIBNHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zY2FubmVyL2Vycm9yX3Rva2VuLmRhcnRBc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3NjYW5uZXIvdG9rZW5fY29uc3RhbnRzLmRhcnSPPC8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnNjYW5uZXIudG9rZW5fY29uc3RhbnRzOwoKaW1wb3J0ICdjaGFyYWN0ZXJzLmRhcnQnOwoKY29uc3QgaW50IEVPRl9UT0tFTiA9IDA7Cgpjb25zdCBpbnQgS0VZV09SRF9UT0tFTiA9ICRrOwpjb25zdCBpbnQgSURFTlRJRklFUl9UT0tFTiA9ICRhOwpjb25zdCBpbnQgU0NSSVBUX1RPS0VOID0gJGI7CmNvbnN0IGludCBCQURfSU5QVVRfVE9LRU4gPSAkWDsKY29uc3QgaW50IERPVUJMRV9UT0tFTiA9ICRkOwpjb25zdCBpbnQgSU5UX1RPS0VOID0gJGk7CmNvbnN0IGludCBSRUNPVkVSWV9UT0tFTiA9ICRyOwpjb25zdCBpbnQgSEVYQURFQ0lNQUxfVE9LRU4gPSAkeDsKY29uc3QgaW50IFNUUklOR19UT0tFTiA9ICRTUTsKCmNvbnN0IGludCBBTVBFUlNBTkRfVE9LRU4gPSAkQU1QRVJTQU5EOwpjb25zdCBpbnQgQkFDS1BJTkdfVE9LRU4gPSAkQkFDS1BJTkc7CmNvbnN0IGludCBCQUNLU0xBU0hfVE9LRU4gPSAkQkFDS1NMQVNIOwpjb25zdCBpbnQgQkFOR19UT0tFTiA9ICRCQU5HOwpjb25zdCBpbnQgQkFSX1RPS0VOID0gJEJBUjsKY29uc3QgaW50IENPTE9OX1RPS0VOID0gJENPTE9OOwpjb25zdCBpbnQgQ09NTUFfVE9LRU4gPSAkQ09NTUE7CmNvbnN0IGludCBFUV9UT0tFTiA9ICRFUTsKY29uc3QgaW50IEdUX1RPS0VOID0gJEdUOwpjb25zdCBpbnQgSEFTSF9UT0tFTiA9ICRIQVNIOwpjb25zdCBpbnQgT1BFTl9DVVJMWV9CUkFDS0VUX1RPS0VOID0gJE9QRU5fQ1VSTFlfQlJBQ0tFVDsKY29uc3QgaW50IE9QRU5fU1FVQVJFX0JSQUNLRVRfVE9LRU4gPSAkT1BFTl9TUVVBUkVfQlJBQ0tFVDsKY29uc3QgaW50IE9QRU5fUEFSRU5fVE9LRU4gPSAkT1BFTl9QQVJFTjsKY29uc3QgaW50IExUX1RPS0VOID0gJExUOwpjb25zdCBpbnQgTUlOVVNfVE9LRU4gPSAkTUlOVVM7CmNvbnN0IGludCBQRVJJT0RfVE9LRU4gPSAkUEVSSU9EOwpjb25zdCBpbnQgUExVU19UT0tFTiA9ICRQTFVTOwpjb25zdCBpbnQgUVVFU1RJT05fVE9LRU4gPSAkUVVFU1RJT047CmNvbnN0IGludCBBVF9UT0tFTiA9ICRBVDsKY29uc3QgaW50IENMT1NFX0NVUkxZX0JSQUNLRVRfVE9LRU4gPSAkQ0xPU0VfQ1VSTFlfQlJBQ0tFVDsKY29uc3QgaW50IENMT1NFX1NRVUFSRV9CUkFDS0VUX1RPS0VOID0gJENMT1NFX1NRVUFSRV9CUkFDS0VUOwpjb25zdCBpbnQgQ0xPU0VfUEFSRU5fVE9LRU4gPSAkQ0xPU0VfUEFSRU47CmNvbnN0IGludCBTRU1JQ09MT05fVE9LRU4gPSAkU0VNSUNPTE9OOwpjb25zdCBpbnQgU0xBU0hfVE9LRU4gPSAkU0xBU0g7CmNvbnN0IGludCBUSUxERV9UT0tFTiA9ICRUSUxERTsKY29uc3QgaW50IFNUQVJfVE9LRU4gPSAkU1RBUjsKY29uc3QgaW50IFBFUkNFTlRfVE9LRU4gPSAkUEVSQ0VOVDsKY29uc3QgaW50IENBUkVUX1RPS0VOID0gJENBUkVUOwoKY29uc3QgaW50IFNUUklOR19JTlRFUlBPTEFUSU9OX1RPS0VOID0gMTI4Owpjb25zdCBpbnQgTFRfRVFfVE9LRU4gPSBTVFJJTkdfSU5URVJQT0xBVElPTl9UT0tFTiArIDE7CmNvbnN0IGludCBGVU5DVElPTl9UT0tFTiA9IExUX0VRX1RPS0VOICsgMTsKY29uc3QgaW50IFNMQVNIX0VRX1RPS0VOID0gRlVOQ1RJT05fVE9LRU4gKyAxOwpjb25zdCBpbnQgUEVSSU9EX1BFUklPRF9QRVJJT0RfVE9LRU4gPSBTTEFTSF9FUV9UT0tFTiArIDE7CmNvbnN0IGludCBQRVJJT0RfUEVSSU9EX1RPS0VOID0gUEVSSU9EX1BFUklPRF9QRVJJT0RfVE9LRU4gKyAxOwpjb25zdCBpbnQgRVFfRVFfRVFfVE9LRU4gPSBQRVJJT0RfUEVSSU9EX1RPS0VOICsgMTsKY29uc3QgaW50IEVRX0VRX1RPS0VOID0gRVFfRVFfRVFfVE9LRU4gKyAxOwpjb25zdCBpbnQgTFRfTFRfRVFfVE9LRU4gPSBFUV9FUV9UT0tFTiArIDE7CmNvbnN0IGludCBMVF9MVF9UT0tFTiA9IExUX0xUX0VRX1RPS0VOICsgMTsKY29uc3QgaW50IEdUX0VRX1RPS0VOID0gTFRfTFRfVE9LRU4gKyAxOwpjb25zdCBpbnQgR1RfR1RfRVFfVE9LRU4gPSBHVF9FUV9UT0tFTiArIDE7CmNvbnN0IGludCBJTkRFWF9FUV9UT0tFTiA9IEdUX0dUX0VRX1RPS0VOICsgMTsKY29uc3QgaW50IElOREVYX1RPS0VOID0gSU5ERVhfRVFfVE9LRU4gKyAxOwpjb25zdCBpbnQgQkFOR19FUV9FUV9UT0tFTiA9IElOREVYX1RPS0VOICsgMTsKY29uc3QgaW50IEJBTkdfRVFfVE9LRU4gPSBCQU5HX0VRX0VRX1RPS0VOICsgMTsKY29uc3QgaW50IEFNUEVSU0FORF9BTVBFUlNBTkRfVE9LRU4gPSBCQU5HX0VRX1RPS0VOICsgMTsKY29uc3QgaW50IEFNUEVSU0FORF9BTVBFUlNBTkRfRVFfVE9LRU4gPSBBTVBFUlNBTkRfQU1QRVJTQU5EX1RPS0VOICsgMTsKY29uc3QgaW50IEFNUEVSU0FORF9FUV9UT0tFTiA9IEFNUEVSU0FORF9BTVBFUlNBTkRfRVFfVE9LRU4gKyAxOwpjb25zdCBpbnQgQkFSX0JBUl9UT0tFTiA9IEFNUEVSU0FORF9FUV9UT0tFTiArIDE7CmNvbnN0IGludCBCQVJfQkFSX0VRX1RPS0VOID0gQkFSX0JBUl9UT0tFTiArIDE7CmNvbnN0IGludCBCQVJfRVFfVE9LRU4gPSBCQVJfQkFSX0VRX1RPS0VOICsgMTsKY29uc3QgaW50IFNUQVJfRVFfVE9LRU4gPSBCQVJfRVFfVE9LRU4gKyAxOwpjb25zdCBpbnQgUExVU19QTFVTX1RPS0VOID0gU1RBUl9FUV9UT0tFTiArIDE7CmNvbnN0IGludCBQTFVTX0VRX1RPS0VOID0gUExVU19QTFVTX1RPS0VOICsgMTsKY29uc3QgaW50IE1JTlVTX01JTlVTX1RPS0VOID0gUExVU19FUV9UT0tFTiArIDE7CmNvbnN0IGludCBNSU5VU19FUV9UT0tFTiA9IE1JTlVTX01JTlVTX1RPS0VOICsgMTsKY29uc3QgaW50IFRJTERFX1NMQVNIX0VRX1RPS0VOID0gTUlOVVNfRVFfVE9LRU4gKyAxOwpjb25zdCBpbnQgVElMREVfU0xBU0hfVE9LRU4gPSBUSUxERV9TTEFTSF9FUV9UT0tFTiArIDE7CmNvbnN0IGludCBQRVJDRU5UX0VRX1RPS0VOID0gVElMREVfU0xBU0hfVE9LRU4gKyAxOwpjb25zdCBpbnQgR1RfR1RfVE9LRU4gPSBQRVJDRU5UX0VRX1RPS0VOICsgMTsKY29uc3QgaW50IENBUkVUX0VRX1RPS0VOID0gR1RfR1RfVE9LRU4gKyAxOwpjb25zdCBpbnQgQ09NTUVOVF9UT0tFTiA9IENBUkVUX0VRX1RPS0VOICsgMTsKY29uc3QgaW50IFNUUklOR19JTlRFUlBPTEFUSU9OX0lERU5USUZJRVJfVE9LRU4gPSBDT01NRU5UX1RPS0VOICsgMTsKY29uc3QgaW50IFFVRVNUSU9OX1BFUklPRF9UT0tFTiA9IFNUUklOR19JTlRFUlBPTEFUSU9OX0lERU5USUZJRVJfVE9LRU4gKyAxOwpjb25zdCBpbnQgUVVFU1RJT05fUVVFU1RJT05fVE9LRU4gPSBRVUVTVElPTl9QRVJJT0RfVE9LRU4gKyAxOwpjb25zdCBpbnQgUVVFU1RJT05fUVVFU1RJT05fRVFfVE9LRU4gPSBRVUVTVElPTl9RVUVTVElPTl9UT0tFTiArIDE7CmNvbnN0IGludCBHRU5FUklDX01FVEhPRF9UWVBFX0FTU0lHTl9UT0tFTiA9IFFVRVNUSU9OX1FVRVNUSU9OX0VRX1RPS0VOICsgMTsKY29uc3QgaW50IEdFTkVSSUNfTUVUSE9EX1RZUEVfTElTVF9UT0tFTiA9IEdFTkVSSUNfTUVUSE9EX1RZUEVfQVNTSUdOX1RPS0VOICsgMTsKY29uc3QgaW50IEdUX0dUX0dUX1RPS0VOID0gR0VORVJJQ19NRVRIT0RfVFlQRV9MSVNUX1RPS0VOICsgMTsKY29uc3QgaW50IFBFUklPRF9QRVJJT0RfUEVSSU9EX1FVRVNUSU9OX1RPS0VOID0gR1RfR1RfR1RfVE9LRU4gKyAxOwpjb25zdCBpbnQgR1RfR1RfR1RfRVFfVE9LRU4gPSBQRVJJT0RfUEVSSU9EX1BFUklPRF9RVUVTVElPTl9UT0tFTiArIDE7Cl0ATk48AScBGgEZAR4hHSAdGh8iHgEoJigeHCAgGhoeOjwqGiAiHiYaPD4sKCAgHiQgASw4LC87QDQsLCwpLC8sLjA5SEEyMC8sLy8xMjU4NC4sLkVNP0RNUT9ERwE4cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NjYW5uZXIvdG9rZW5fY29uc3RhbnRzLmRhcnQ+c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2luY3JlbWVudGFsX2NvbXBpbGVyLmRhcnTAAIZWLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuaW5jcmVtZW50YWxfY29tcGlsZXI7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnIHNob3cgRnV0dXJlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9iaW5hcnkvYXN0X2Zyb21fYmluYXJ5LmRhcnQnIHNob3cgQmluYXJ5QnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYmluYXJ5L2FzdF9mcm9tX2JpbmFyeS5kYXJ0JwogICAgc2hvdyBCaW5hcnlCdWlsZGVyLCBDYW5vbmljYWxOYW1lRXJyb3IsIEludmFsaWRLZXJuZWxWZXJzaW9uRXJyb3I7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JyBzaG93IENsYXNzSGllcmFyY2h5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9rZXJuZWwuZGFydCcKICAgIHNob3cKICAgICAgICBDbGFzcywKICAgICAgICBDb21wb25lbnQsCiAgICAgICAgRGFydFR5cGUsCiAgICAgICAgRXhwcmVzc2lvbiwKICAgICAgICBGdW5jdGlvbk5vZGUsCiAgICAgICAgTGlicmFyeSwKICAgICAgICBMaWJyYXJ5RGVwZW5kZW5jeSwKICAgICAgICBMaWJyYXJ5UGFydCwKICAgICAgICBOYW1lLAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBQcm9jZWR1cmVLaW5kLAogICAgICAgIFJldHVyblN0YXRlbWVudCwKICAgICAgICBTb3VyY2UsCiAgICAgICAgVHJlZU5vZGUsCiAgICAgICAgVHlwZVBhcmFtZXRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwva2VybmVsLmRhcnQnIGFzIGtlcm5lbCBzaG93IENvbWJpbmF0b3I7CgppbXBvcnQgJy4uL2FwaV9wcm90b3R5cGUvZmlsZV9zeXN0ZW0uZGFydCcgc2hvdyBGaWxlU3lzdGVtRW50aXR5OwoKaW1wb3J0ICcuLi9hcGlfcHJvdG90eXBlL2luY3JlbWVudGFsX2tlcm5lbF9nZW5lcmF0b3IuZGFydCcKICAgIHNob3cgSW5jcmVtZW50YWxLZXJuZWxHZW5lcmF0b3IsIGlzTGVnYWxJZGVudGlmaWVyOwoKaW1wb3J0ICcuLi9hcGlfcHJvdG90eXBlL21lbW9yeV9maWxlX3N5c3RlbS5kYXJ0JyBzaG93IE1lbW9yeUZpbGVTeXN0ZW07CgppbXBvcnQgJ2J1aWxkZXIvYnVpbGRlci5kYXJ0JyBzaG93IExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICdidWlsZGVyX2dyYXBoLmRhcnQnIHNob3cgQnVpbGRlckdyYXBoOwoKaW1wb3J0ICdjb21iaW5hdG9yLmRhcnQnIHNob3cgQ29tYmluYXRvcjsKCmltcG9ydCAnY29tcGlsZXJfY29udGV4dC5kYXJ0JyBzaG93IENvbXBpbGVyQ29udGV4dDsKCmltcG9ydCAnZGlsbC9kaWxsX2xpYnJhcnlfYnVpbGRlci5kYXJ0JyBzaG93IERpbGxMaWJyYXJ5QnVpbGRlcjsKCmltcG9ydCAnZGlsbC9kaWxsX3RhcmdldC5kYXJ0JyBzaG93IERpbGxUYXJnZXQ7CgppbXBvcnQgJ3V0aWwvZXJyb3JfcmVwb3J0ZXJfZmlsZV9jb3BpZXIuZGFydCcgc2hvdyBzYXZlQXNHemlwOwoKaW1wb3J0ICdmYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24sCiAgICAgICAgdGVtcGxhdGVJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkLAogICAgICAgIHRlbXBsYXRlSW5pdGlhbGl6ZUZyb21EaWxsTm90U2VsZkNvbnRhaW5lZE5vRHVtcCwKICAgICAgICB0ZW1wbGF0ZUluaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtLAogICAgICAgIHRlbXBsYXRlSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW1Ob0R1bXA7CgppbXBvcnQgJ2h5YnJpZF9maWxlX3N5c3RlbS5kYXJ0JyBzaG93IEh5YnJpZEZpbGVTeXN0ZW07CgppbXBvcnQgJ2tlcm5lbC9rZXJuZWxfbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgS2VybmVsTGlicmFyeUJ1aWxkZXI7CgppbXBvcnQgJ2tlcm5lbC9rZXJuZWxfc2hhZG93X2FzdC5kYXJ0JyBzaG93IFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudDsKCmltcG9ydCAna2VybmVsL2tlcm5lbF90YXJnZXQuZGFydCcgc2hvdyBLZXJuZWxUYXJnZXQ7CgppbXBvcnQgJ2xpYnJhcnlfZ3JhcGguZGFydCcgc2hvdyBMaWJyYXJ5R3JhcGg7CgppbXBvcnQgJ21lc3NhZ2VzLmRhcnQnIHNob3cgTWVzc2FnZTsKCmltcG9ydCAnc291cmNlL3NvdXJjZV9saWJyYXJ5X2J1aWxkZXIuZGFydCcgc2hvdyBTb3VyY2VMaWJyYXJ5QnVpbGRlcjsKCmltcG9ydCAndGlja2VyLmRhcnQnIHNob3cgVGlja2VyOwoKaW1wb3J0ICd1cmlfdHJhbnNsYXRvci5kYXJ0JyBzaG93IFVyaVRyYW5zbGF0b3I7CgpjbGFzcyBJbmNyZW1lbnRhbENvbXBpbGVyIGltcGxlbWVudHMgSW5jcmVtZW50YWxLZXJuZWxHZW5lcmF0b3IgewogIGZpbmFsIENvbXBpbGVyQ29udGV4dCBjb250ZXh0OwoKICBmaW5hbCBUaWNrZXIgdGlja2VyOwoKICBmaW5hbCBib29sIG91dGxpbmVPbmx5OwoKICBTZXQ8VXJpPiBpbnZhbGlkYXRlZFVyaXMgPSBuZXcgU2V0PFVyaT4oKTsKCiAgRGlsbFRhcmdldCBkaWxsTG9hZGVkRGF0YTsKICBMaXN0PExpYnJhcnlCdWlsZGVyPiBwbGF0Zm9ybUJ1aWxkZXJzOwogIE1hcDxVcmksIExpYnJhcnlCdWlsZGVyPiB1c2VyQnVpbGRlcnM7CiAgZmluYWwgVXJpIGluaXRpYWxpemVGcm9tRGlsbFVyaTsKICBmaW5hbCBDb21wb25lbnQgY29tcG9uZW50VG9Jbml0aWFsaXplRnJvbTsKICBib29sIGluaXRpYWxpemVkRnJvbURpbGwgPSBmYWxzZTsKICBVcmkgcHJldmlvdXNQYWNrYWdlc1VyaTsKICBib29sIGhhc1RvQ2hlY2tQYWNrYWdlVXJpcyA9IGZhbHNlOwogIE1hcDxVcmksIExpc3Q8RGlhZ25vc3RpY01lc3NhZ2VGcm9tSnNvbj4+IHJlbWFpbmluZ0NvbXBvbmVudFByb2JsZW1zID0KICAgICAgbmV3IE1hcDxVcmksIExpc3Q8RGlhZ25vc3RpY01lc3NhZ2VGcm9tSnNvbj4+KCk7CiAgTGlzdDxDb21wb25lbnQ+IG1vZHVsZXNUb0xvYWQ7CgogIHN0YXRpYyBmaW5hbCBVcmkgZGVidWdFeHByVXJpID0KICAgICAgbmV3IFVyaShzY2hlbWU6ICJvcmctZGFydGxhbmctZGVidWciLCBwYXRoOiAic3ludGhldGljX2RlYnVnX2V4cHJlc3Npb24iKTsKCiAgS2VybmVsVGFyZ2V0IHVzZXJDb2RlOwoKICBJbmNyZW1lbnRhbENvbXBpbGVyLmZyb21Db21wb25lbnQoCiAgICAgIHRoaXMuY29udGV4dCwgQ29tcG9uZW50IHRoaXMuY29tcG9uZW50VG9Jbml0aWFsaXplRnJvbSwKICAgICAgW2Jvb2wgb3V0bGluZU9ubHldKQogICAgICA6IHRpY2tlciA9IGNvbnRleHQub3B0aW9ucy50aWNrZXIsCiAgICAgICAgaW5pdGlhbGl6ZUZyb21EaWxsVXJpID0gbnVsbCwKICAgICAgICB0aGlzLm91dGxpbmVPbmx5ID0gb3V0bGluZU9ubHkgPz8gZmFsc2U7CgogIEluY3JlbWVudGFsQ29tcGlsZXIodGhpcy5jb250ZXh0LAogICAgICBbdGhpcy5pbml0aWFsaXplRnJvbURpbGxVcmksIGJvb2wgb3V0bGluZU9ubHldKQogICAgICA6IHRpY2tlciA9IGNvbnRleHQub3B0aW9ucy50aWNrZXIsCiAgICAgICAgY29tcG9uZW50VG9Jbml0aWFsaXplRnJvbSA9IG51bGwsCiAgICAgICAgdGhpcy5vdXRsaW5lT25seSA9IG91dGxpbmVPbmx5ID8/IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBGdXR1cmU8Q29tcG9uZW50PiBjb21wdXRlRGVsdGEoCiAgICAgIHtMaXN0PFVyaT4gZW50cnlQb2ludHMsIGJvb2wgZnVsbENvbXBvbmVudDogZmFsc2V9KSBhc3luYyB7CiAgICB0aWNrZXIucmVzZXQoKTsKICAgIGVudHJ5UG9pbnRzID8/PSBjb250ZXh0Lm9wdGlvbnMuaW5wdXRzOwogICAgcmV0dXJuIGNvbnRleHQucnVuSW5Db250ZXh0PENvbXBvbmVudD4oKENvbXBpbGVyQ29udGV4dCBjKSBhc3luYyB7CiAgICAgIEluY3JlbWVudGFsQ29tcGlsZXJEYXRhIGRhdGEgPSBuZXcgSW5jcmVtZW50YWxDb21waWxlckRhdGEoKTsKCiAgICAgIGJvb2wgYnlwYXNzQ2FjaGUgPSBmYWxzZTsKICAgICAgaWYgKCFpZGVudGljYWwocHJldmlvdXNQYWNrYWdlc1VyaSwgYy5vcHRpb25zLnBhY2thZ2VzVXJpUmF3KSkgewogICAgICAgIHByZXZpb3VzUGFja2FnZXNVcmkgPSBjLm9wdGlvbnMucGFja2FnZXNVcmlSYXc7CiAgICAgICAgYnlwYXNzQ2FjaGUgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKHRoaXMuaW52YWxpZGF0ZWRVcmlzLmNvbnRhaW5zKGMub3B0aW9ucy5wYWNrYWdlc1VyaSkpIHsKICAgICAgICBieXBhc3NDYWNoZSA9IHRydWU7CiAgICAgIH0KICAgICAgaGFzVG9DaGVja1BhY2thZ2VVcmlzID0gaGFzVG9DaGVja1BhY2thZ2VVcmlzIHx8IGJ5cGFzc0NhY2hlOwogICAgICBVcmlUcmFuc2xhdG9yIHVyaVRyYW5zbGF0b3IgPQogICAgICAgICAgYXdhaXQgYy5vcHRpb25zLmdldFVyaVRyYW5zbGF0b3IoYnlwYXNzQ2FjaGU6IGJ5cGFzc0NhY2hlKTsKICAgICAgdGlja2VyLmxvZ01zKCJSZWFkIHBhY2thZ2VzIGZpbGUiKTsKCiAgICAgIGlmIChkaWxsTG9hZGVkRGF0YSA9PSBudWxsKSB7CiAgICAgICAgaW50IGJ5dGVzTGVuZ3RoID0gMDsKICAgICAgICBpZiAoY29tcG9uZW50VG9Jbml0aWFsaXplRnJvbSAhPSBudWxsKSB7CiAgICAgICAgICAvLyBJZiBpbml0aWFsaXppbmcgZnJvbSBhIGNvbXBvbmVudCBpdCBoYXMgdG8gaW5jbHVkZSB0aGUgc2RrLAogICAgICAgICAgLy8gc28gd2UgZXhwbGljaXRseSBkb24ndCBsb2FkIGl0IGhlcmUuCiAgICAgICAgICBpbml0aWFsaXplRnJvbUNvbXBvbmVudCh1cmlUcmFuc2xhdG9yLCBjLCBkYXRhKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgTGlzdDxpbnQ+IHN1bW1hcnlCeXRlcyA9IGF3YWl0IGMub3B0aW9ucy5sb2FkU2RrU3VtbWFyeUJ5dGVzKCk7CiAgICAgICAgICBieXRlc0xlbmd0aCA9IHByZXBhcmVTdW1tYXJ5KHN1bW1hcnlCeXRlcywgdXJpVHJhbnNsYXRvciwgYywgZGF0YSk7CiAgICAgICAgICBpZiAoaW5pdGlhbGl6ZUZyb21EaWxsVXJpICE9IG51bGwpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBieXRlc0xlbmd0aCArPSBhd2FpdCBpbml0aWFsaXplRnJvbURpbGwodXJpVHJhbnNsYXRvciwgYywgZGF0YSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUsIHN0KSB7CiAgICAgICAgICAgICAgLy8gV2UgbWlnaHQgaGF2ZSBsb2FkZWQgeCBvdXQgb2YgeSBsaWJyYXJpZXMgaW50byB0aGUgY29tcG9uZW50LgogICAgICAgICAgICAgIC8vIFRvIGF2b2lkIGFueSB1bmZvcmVzZWVuIHByb2JsZW1zIHN0YXJ0IG92ZXIuCiAgICAgICAgICAgICAgYnl0ZXNMZW5ndGggPQogICAgICAgICAgICAgICAgICBwcmVwYXJlU3VtbWFyeShzdW1tYXJ5Qnl0ZXMsIHVyaVRyYW5zbGF0b3IsIGMsIGRhdGEpOwoKICAgICAgICAgICAgICBpZiAoZSBpcyBJbnZhbGlkS2VybmVsVmVyc2lvbkVycm9yIHx8IGUgaXMgUGFja2FnZUNoYW5nZWRFcnJvcikgewogICAgICAgICAgICAgICAgLy8gRG9uJ3QgcmVwb3J0IGFueSB3YXJuaW5nLgogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBVcmkgZ3pJbml0aWFsaXplZEZyb207CiAgICAgICAgICAgICAgICBpZiAoYy5vcHRpb25zLndyaXRlRmlsZU9uQ3Jhc2hSZXBvcnQpIHsKICAgICAgICAgICAgICAgICAgZ3pJbml0aWFsaXplZEZyb20gPSBzYXZlQXNHemlwKAogICAgICAgICAgICAgICAgICAgICAgZGF0YS5pbml0aWFsaXphdGlvbkJ5dGVzLCAiaW5pdGlhbGl6ZV9mcm9tLmRpbGwiKTsKICAgICAgICAgICAgICAgICAgcmVjb3JkVGVtcG9yYXJ5RmlsZUZvclRlc3RpbmcoZ3pJbml0aWFsaXplZEZyb20pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGUgaXMgQ2Fub25pY2FsTmFtZUVycm9yKSB7CiAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGd6SW5pdGlhbGl6ZWRGcm9tICE9IG51bGwKICAgICAgICAgICAgICAgICAgICAgID8gdGVtcGxhdGVJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoaW5pdGlhbGl6ZUZyb21EaWxsVXJpLnRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd6SW5pdGlhbGl6ZWRGcm9tKQogICAgICAgICAgICAgICAgICAgICAgOiB0ZW1wbGF0ZUluaXRpYWxpemVGcm9tRGlsbE5vdFNlbGZDb250YWluZWROb0R1bXAKICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhpbml0aWFsaXplRnJvbURpbGxVcmkudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgIGRpbGxMb2FkZWREYXRhLmxvYWRlcgogICAgICAgICAgICAgICAgICAgICAgLmFkZFByb2JsZW0obWVzc2FnZSwgVHJlZU5vZGUubm9PZmZzZXQsIDEsIG51bGwpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgLy8gVW5rbm93biBlcnJvcjogUmVwb3J0IHByb2JsZW0gYXMgc3VjaC4KICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZ3pJbml0aWFsaXplZEZyb20gIT0gbnVsbAogICAgICAgICAgICAgICAgICAgICAgPyB0ZW1wbGF0ZUluaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUZyb21EaWxsVXJpLnRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIiRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiJHN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBnekluaXRpYWxpemVkRnJvbSkKICAgICAgICAgICAgICAgICAgICAgIDogdGVtcGxhdGVJbml0aWFsaXplRnJvbURpbGxVbmtub3duUHJvYmxlbU5vRHVtcAogICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplRnJvbURpbGxVcmkudG9TdHJpbmcoKSwgIiRlIiwgIiRzdCIpOwogICAgICAgICAgICAgICAgICBkaWxsTG9hZGVkRGF0YS5sb2FkZXIKICAgICAgICAgICAgICAgICAgICAgIC5hZGRQcm9ibGVtKG1lc3NhZ2UsIFRyZWVOb2RlLm5vT2Zmc2V0LCAxLCBudWxsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYXBwZW5kTGlicmFyaWVzKGRhdGEsIGJ5dGVzTGVuZ3RoKTsKCiAgICAgICAgYXdhaXQgZGlsbExvYWRlZERhdGEuYnVpbGRPdXRsaW5lcygpOwogICAgICAgIHVzZXJCdWlsZGVycyA9IDxVcmksIExpYnJhcnlCdWlsZGVyPnt9OwogICAgICAgIHBsYXRmb3JtQnVpbGRlcnMgPSA8TGlicmFyeUJ1aWxkZXI+W107CiAgICAgICAgZGlsbExvYWRlZERhdGEubG9hZGVyLmJ1aWxkZXJzLmZvckVhY2goKHVyaSwgYnVpbGRlcikgewogICAgICAgICAgaWYgKGJ1aWxkZXIudXJpLnNjaGVtZSA9PSAiZGFydCIpIHsKICAgICAgICAgICAgcGxhdGZvcm1CdWlsZGVycy5hZGQoYnVpbGRlcik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1c2VyQnVpbGRlcnNbdXJpXSA9IGJ1aWxkZXI7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKHVzZXJCdWlsZGVycy5pc0VtcHR5KSB1c2VyQnVpbGRlcnMgPSBudWxsOwogICAgICB9CiAgICAgIGRhdGEuaW5pdGlhbGl6YXRpb25CeXRlcyA9IG51bGw7CgogICAgICBTZXQ8VXJpPiBpbnZhbGlkYXRlZFVyaXMgPSB0aGlzLmludmFsaWRhdGVkVXJpcy50b1NldCgpOwoKICAgICAgaW52YWxpZGF0ZU5vdEtlcHRVc2VyQnVpbGRlcnMoaW52YWxpZGF0ZWRVcmlzKTsKCiAgICAgIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSA9IHVzZXJDb2RlPy5sb2FkZXI/LmhpZXJhcmNoeTsKICAgICAgU2V0PExpYnJhcnlCdWlsZGVyPiBub3RSZXVzZWRMaWJyYXJpZXMgPSBuZXcgU2V0PExpYnJhcnlCdWlsZGVyPigpOwogICAgICBMaXN0PExpYnJhcnlCdWlsZGVyPiByZXVzZWRMaWJyYXJpZXMgPSBjb21wdXRlUmV1c2VkTGlicmFyaWVzKAogICAgICAgICAgaW52YWxpZGF0ZWRVcmlzLCB1cmlUcmFuc2xhdG9yLAogICAgICAgICAgbm90UmV1c2VkOiBub3RSZXVzZWRMaWJyYXJpZXMpOwogICAgICBTZXQ8VXJpPiByZXVzZWRMaWJyYXJ5VXJpcyA9CiAgICAgICAgICBuZXcgU2V0PFVyaT4uZnJvbShyZXVzZWRMaWJyYXJpZXMubWFwKChiKSA9PiBiLnVyaSkpOwogICAgICBmb3IgKFVyaSB1cmkgaW4gbmV3IFNldDxVcmk+LmZyb20oZGlsbExvYWRlZERhdGEubG9hZGVyLmJ1aWxkZXJzLmtleXMpCiAgICAgICAgLi5yZW1vdmVBbGwocmV1c2VkTGlicmFyeVVyaXMpKSB7CiAgICAgICAgTGlicmFyeUJ1aWxkZXIgYnVpbGRlciA9IGRpbGxMb2FkZWREYXRhLmxvYWRlci5idWlsZGVycy5yZW1vdmUodXJpKTsKICAgICAgICB1c2VyQnVpbGRlcnM/LnJlbW92ZSh1cmkpOwogICAgICAgIENvbXBpbGVyQ29udGV4dC5jdXJyZW50LnVyaVRvU291cmNlLnJlbW92ZShidWlsZGVyLmZpbGVVcmkpOwogICAgICB9CgogICAgICBpZiAoaGFzVG9DaGVja1BhY2thZ2VVcmlzKSB7CiAgICAgICAgLy8gVGhlIHBhY2thZ2UgZmlsZSB3YXMgY2hhbmdlZC4KICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGRpbGwgbG9hZGVyIGlzIG9uIHRoZSBzYW1lIHBhZ2UuCiAgICAgICAgRGlsbFRhcmdldCBvbGREaWxsTG9hZGVkRGF0YSA9IGRpbGxMb2FkZWREYXRhOwogICAgICAgIGRpbGxMb2FkZWREYXRhID0KICAgICAgICAgICAgbmV3IERpbGxUYXJnZXQodGlja2VyLCB1cmlUcmFuc2xhdG9yLCBjLm9wdGlvbnMudGFyZ2V0KTsKICAgICAgICBmb3IgKERpbGxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5CiAgICAgICAgICAgIGluIG9sZERpbGxMb2FkZWREYXRhLmxvYWRlci5idWlsZGVycy52YWx1ZXMpIHsKICAgICAgICAgIGxpYnJhcnkubG9hZGVyID0gZGlsbExvYWRlZERhdGEubG9hZGVyOwogICAgICAgICAgZGlsbExvYWRlZERhdGEubG9hZGVyLmJ1aWxkZXJzW2xpYnJhcnkudXJpXSA9IGxpYnJhcnk7CiAgICAgICAgICBpZiAobGlicmFyeS51cmkuc2NoZW1lID09ICJkYXJ0IiAmJiBsaWJyYXJ5LnVyaS5wYXRoID09ICJjb3JlIikgewogICAgICAgICAgICBkaWxsTG9hZGVkRGF0YS5sb2FkZXIuY29yZUxpYnJhcnkgPSBsaWJyYXJ5OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBkaWxsTG9hZGVkRGF0YS5sb2FkZXIuZmlyc3QgPSBvbGREaWxsTG9hZGVkRGF0YS5sb2FkZXIuZmlyc3Q7CiAgICAgICAgZGlsbExvYWRlZERhdGEubG9hZGVyLmxpYnJhcmllcwogICAgICAgICAgICAuYWRkQWxsKG9sZERpbGxMb2FkZWREYXRhLmxvYWRlci5saWJyYXJpZXMpOwogICAgICB9CgogICAgICBmb3IgKExpYnJhcnlCdWlsZGVyIGJ1aWxkZXIgaW4gbm90UmV1c2VkTGlicmFyaWVzKSB7CiAgICAgICAgTGlicmFyeSBsaWIgPSBidWlsZGVyLnRhcmdldDsKICAgICAgICBDb21waWxlckNvbnRleHQuY3VycmVudC51cmlUb1NvdXJjZS5yZW1vdmUoYnVpbGRlci5maWxlVXJpKTsKCiAgICAgICAgLy8gUmVtb3ZlIGNvbXBvbmVudCBwcm9ibGVtcyBmb3IgbGlicmFyaWVzIHdlIGRvbid0IHJldXNlLgogICAgICAgIGlmIChyZW1haW5pbmdDb21wb25lbnRQcm9ibGVtcy5pc05vdEVtcHR5KSB7CiAgICAgICAgICByZW1vdmVMaWJyYXJ5RnJvbVJlbWFpbmluZ0NvbXBvbmVudFByb2JsZW1zKGxpYiwgdXJpVHJhbnNsYXRvcik7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoaGllcmFyY2h5ICE9IG51bGwpIHsKICAgICAgICBMaXN0PExpYnJhcnk+IHJlbW92ZWRMaWJyYXJpZXMgPSBuZXcgTGlzdDxMaWJyYXJ5PigpOwogICAgICAgIGZvciAoTGlicmFyeUJ1aWxkZXIgYnVpbGRlciBpbiBub3RSZXVzZWRMaWJyYXJpZXMpIHsKICAgICAgICAgIExpYnJhcnkgbGliID0gYnVpbGRlci50YXJnZXQ7CiAgICAgICAgICByZW1vdmVkTGlicmFyaWVzLmFkZChsaWIpOwogICAgICAgIH0KICAgICAgICBoaWVyYXJjaHkuYXBwbHlUcmVlQ2hhbmdlcyhyZW1vdmVkTGlicmFyaWVzLCBjb25zdCBbXSk7CiAgICAgIH0KICAgICAgbm90UmV1c2VkTGlicmFyaWVzID0gbnVsbDsKCiAgICAgIGlmICh1c2VyQ29kZSAhPSBudWxsKSB7CiAgICAgICAgdGlja2VyLmxvZ01zKCJEZWNpZGVkIHRvIHJldXNlICR7cmV1c2VkTGlicmFyaWVzLmxlbmd0aH0iCiAgICAgICAgICAgICIgb2YgJHt1c2VyQ29kZS5sb2FkZXIuYnVpbGRlcnMubGVuZ3RofSBsaWJyYXJpZXMiKTsKICAgICAgfQoKICAgICAgYXdhaXQgbG9hZEVuc3VyZUxvYWRlZENvbXBvbmVudHMocmV1c2VkTGlicmFyeVVyaXMsIHJldXNlZExpYnJhcmllcyk7CgogICAgICBLZXJuZWxUYXJnZXQgdXNlckNvZGVPbGQgPSB1c2VyQ29kZTsKICAgICAgdXNlckNvZGUgPSBuZXcgS2VybmVsVGFyZ2V0KAogICAgICAgICAgbmV3IEh5YnJpZEZpbGVTeXN0ZW0oCiAgICAgICAgICAgICAgbmV3IE1lbW9yeUZpbGVTeXN0ZW0oCiAgICAgICAgICAgICAgICAgIG5ldyBVcmkoc2NoZW1lOiAib3JnLWRhcnRsYW5nLWRlYnVnIiwgcGF0aDogIi8iKSksCiAgICAgICAgICAgICAgYy5maWxlU3lzdGVtKSwKICAgICAgICAgIGZhbHNlLAogICAgICAgICAgZGlsbExvYWRlZERhdGEsCiAgICAgICAgICB1cmlUcmFuc2xhdG9yKTsKICAgICAgdXNlckNvZGUubG9hZGVyLmhpZXJhcmNoeSA9IGhpZXJhcmNoeTsKCiAgICAgIGZvciAoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSBpbiByZXVzZWRMaWJyYXJpZXMpIHsKICAgICAgICB1c2VyQ29kZS5sb2FkZXIuYnVpbGRlcnNbbGlicmFyeS51cmldID0gbGlicmFyeTsKICAgICAgICBpZiAobGlicmFyeS51cmkuc2NoZW1lID09ICJkYXJ0IiAmJiBsaWJyYXJ5LnVyaS5wYXRoID09ICJjb3JlIikgewogICAgICAgICAgdXNlckNvZGUubG9hZGVyLmNvcmVMaWJyYXJ5ID0gbGlicmFyeTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGVudHJ5UG9pbnRzID0gdXNlckNvZGUuc2V0RW50cnlQb2ludHMoZW50cnlQb2ludHMpOwogICAgICBpZiAodXNlckNvZGUubG9hZGVyLmZpcnN0ID09IG51bGwgJiYKICAgICAgICAgIHVzZXJDb2RlLmxvYWRlci5idWlsZGVyc1tlbnRyeVBvaW50cy5maXJzdF0gIT0gbnVsbCkgewogICAgICAgIHVzZXJDb2RlLmxvYWRlci5maXJzdCA9IHVzZXJDb2RlLmxvYWRlci5idWlsZGVyc1tlbnRyeVBvaW50cy5maXJzdF07CiAgICAgIH0KICAgICAgQ29tcG9uZW50IGNvbXBvbmVudFdpdGhEaWxsID0gYXdhaXQgdXNlckNvZGUuYnVpbGRPdXRsaW5lcygpOwoKICAgICAgLy8gVGhpcyBpcyBub3QgdGhlIGZ1bGwgY29tcG9uZW50LiBJdCBpcyB0aGUgY29tcG9uZW50IGNvbnNpc3Rpbmcgb2YgYWxsCiAgICAgIC8vIG5ld2x5IGNvbXBpbGVkIGxpYnJhcmllcyBhbmQgYWxsIGxpYnJhcmllcyBsb2FkZWQgZnJvbSAuZGlsbCBmaWxlcyBvcgogICAgICAvLyBkaXJlY3RseSBmcm9tIGNvbXBvbmVudHMuCiAgICAgIC8vIFRlY2huaWNhbGx5LCBpdCdzIHRoZSBjb21iaW5hdGlvbiBvZiB1c2VyQ29kZS5sb2FkZXIubGlicmFyaWVzIGFuZAogICAgICAvLyBkaWxsTG9hZGVkRGF0YS5sb2FkZXIubGlicmFyaWVzLgogICAgICBpZiAoIW91dGxpbmVPbmx5KSB7CiAgICAgICAgY29tcG9uZW50V2l0aERpbGwgPQogICAgICAgICAgICBhd2FpdCB1c2VyQ29kZS5idWlsZENvbXBvbmVudCh2ZXJpZnk6IGMub3B0aW9ucy52ZXJpZnkpOwogICAgICB9CgogICAgICByZWNvcmROb25GdWxsQ29tcG9uZW50Rm9yVGVzdGluZyhjb21wb25lbnRXaXRoRGlsbCk7CgogICAgICBpZiAoY29tcG9uZW50V2l0aERpbGwgIT0gbnVsbCkgewogICAgICAgIHRoaXMuaW52YWxpZGF0ZWRVcmlzLmNsZWFyKCk7CiAgICAgICAgaGFzVG9DaGVja1BhY2thZ2VVcmlzID0gZmFsc2U7CiAgICAgICAgdXNlckNvZGVPbGQ/LmxvYWRlcj8ucmVsZWFzZUFuY2lsbGFyeVJlc291cmNlcygpOwogICAgICAgIHVzZXJDb2RlT2xkPy5sb2FkZXI/LmJ1aWxkZXJzPy5jbGVhcigpOwogICAgICAgIHVzZXJDb2RlT2xkID0gbnVsbDsKICAgICAgfQoKICAgICAgTGlzdDxMaWJyYXJ5PiBjb21waWxlZExpYnJhcmllcyA9CiAgICAgICAgICBuZXcgTGlzdDxMaWJyYXJ5Pi5mcm9tKHVzZXJDb2RlLmxvYWRlci5saWJyYXJpZXMpOwogICAgICBQcm9jZWR1cmUgbWFpbk1ldGhvZCA9IGNvbXBvbmVudFdpdGhEaWxsID09IG51bGwKICAgICAgICAgID8gZGF0YS51c2VyTG9hZGVkVXJpTWFpbgogICAgICAgICAgOiBjb21wb25lbnRXaXRoRGlsbC5tYWluTWV0aG9kOwoKICAgICAgTGlzdDxMaWJyYXJ5PiBvdXRwdXRMaWJyYXJpZXM7CiAgICAgIFNldDxMaWJyYXJ5PiBhbGxMaWJyYXJpZXM7CiAgICAgIE1hcDxVcmksIFNvdXJjZT4gdXJpVG9Tb3VyY2UgPSBjb21wb25lbnRXaXRoRGlsbD8udXJpVG9Tb3VyY2U7CiAgICAgIGlmIChkYXRhLmNvbXBvbmVudCAhPSBudWxsIHx8IGZ1bGxDb21wb25lbnQpIHsKICAgICAgICBvdXRwdXRMaWJyYXJpZXMgPSBjb21wdXRlVHJhbnNpdGl2ZUNsb3N1cmUoCiAgICAgICAgICAgIGNvbXBpbGVkTGlicmFyaWVzLAogICAgICAgICAgICBlbnRyeVBvaW50cywKICAgICAgICAgICAgcmV1c2VkTGlicmFyaWVzLAogICAgICAgICAgICBoaWVyYXJjaHksCiAgICAgICAgICAgIHVyaVRyYW5zbGF0b3IsCiAgICAgICAgICAgIHVyaVRvU291cmNlKTsKICAgICAgICBhbGxMaWJyYXJpZXMgPSBvdXRwdXRMaWJyYXJpZXMudG9TZXQoKTsKICAgICAgICBpZiAoIWMub3B0aW9ucy5vbWl0UGxhdGZvcm0pIHsKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGxhdGZvcm1CdWlsZGVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBMaWJyYXJ5IGxpYiA9IHBsYXRmb3JtQnVpbGRlcnNbaV0udGFyZ2V0OwogICAgICAgICAgICBvdXRwdXRMaWJyYXJpZXMuYWRkKGxpYik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIG91dHB1dExpYnJhcmllcyA9IG5ldyBMaXN0PExpYnJhcnk+KCk7CiAgICAgICAgYWxsTGlicmFyaWVzID0gY29tcHV0ZVRyYW5zaXRpdmVDbG9zdXJlKAogICAgICAgICAgICAgICAgY29tcGlsZWRMaWJyYXJpZXMsCiAgICAgICAgICAgICAgICBlbnRyeVBvaW50cywKICAgICAgICAgICAgICAgIHJldXNlZExpYnJhcmllcywKICAgICAgICAgICAgICAgIGhpZXJhcmNoeSwKICAgICAgICAgICAgICAgIHVyaVRyYW5zbGF0b3IsCiAgICAgICAgICAgICAgICB1cmlUb1NvdXJjZSwKICAgICAgICAgICAgICAgIG91dHB1dExpYnJhcmllcykKICAgICAgICAgICAgLnRvU2V0KCk7CiAgICAgIH0KCiAgICAgIExpc3Q8U3RyaW5nPiBwcm9ibGVtc0FzSnNvbiA9IHJlaXNzdWVDb21wb25lbnRQcm9ibGVtcyhjb21wb25lbnRXaXRoRGlsbCk7CiAgICAgIHJlaXNzdWVMaWJyYXJ5UHJvYmxlbXMoYWxsTGlicmFyaWVzLCBjb21waWxlZExpYnJhcmllcyk7CgogICAgICBpZiAoY29tcG9uZW50V2l0aERpbGwgPT0gbnVsbCkgewogICAgICAgIHVzZXJDb2RlLmxvYWRlci5idWlsZGVycy5jbGVhcigpOwogICAgICAgIHVzZXJDb2RlID0gdXNlckNvZGVPbGQ7CiAgICAgIH0KCiAgICAgIC8vIFRoaXMgaXMgdGhlIGluY3JlbWVudGFsIGNvbXBvbmVudC4KICAgICAgcmV0dXJuIGNvbnRleHQub3B0aW9ucy50YXJnZXQuY29uZmlndXJlQ29tcG9uZW50KAogICAgICAgICAgbmV3IENvbXBvbmVudChsaWJyYXJpZXM6IG91dHB1dExpYnJhcmllcywgdXJpVG9Tb3VyY2U6IHVyaVRvU291cmNlKSkKICAgICAgICAuLm1haW5NZXRob2QgPSBtYWluTWV0aG9kCiAgICAgICAgLi5wcm9ibGVtc0FzSnNvbiA9IHByb2JsZW1zQXNKc29uOwogICAgfSk7CiAgfQoKICAvLy8gSW50ZXJuYWwgbWV0aG9kLgogIHZvaWQgaW52YWxpZGF0ZU5vdEtlcHRVc2VyQnVpbGRlcnMoU2V0PFVyaT4gaW52YWxpZGF0ZWRVcmlzKSB7CiAgICBpZiAobW9kdWxlc1RvTG9hZCAhPSBudWxsICYmIHVzZXJCdWlsZGVycyAhPSBudWxsKSB7CiAgICAgIFNldDxMaWJyYXJ5PiBsb2FkZWROb3RLZXB0ID0gbmV3IFNldDxMaWJyYXJ5PigpOwogICAgICBmb3IgKExpYnJhcnlCdWlsZGVyIGJ1aWxkZXIgaW4gdXNlckJ1aWxkZXJzLnZhbHVlcykgewogICAgICAgIGxvYWRlZE5vdEtlcHQuYWRkKGJ1aWxkZXIudGFyZ2V0KTsKICAgICAgfQogICAgICBmb3IgKENvbXBvbmVudCBtb2R1bGUgaW4gbW9kdWxlc1RvTG9hZCkgewogICAgICAgIGxvYWRlZE5vdEtlcHQucmVtb3ZlQWxsKG1vZHVsZS5saWJyYXJpZXMpOwogICAgICB9CiAgICAgIGZvciAoTGlicmFyeSBsaWIgaW4gbG9hZGVkTm90S2VwdCkgewogICAgICAgIGludmFsaWRhdGVkVXJpcy5hZGQobGliLmltcG9ydFVyaSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBJbnRlcm5hbCBtZXRob2QuCiAgRnV0dXJlIGxvYWRFbnN1cmVMb2FkZWRDb21wb25lbnRzKAogICAgICBTZXQ8VXJpPiByZXVzZWRMaWJyYXJ5VXJpcywgTGlzdDxMaWJyYXJ5QnVpbGRlcj4gcmV1c2VkTGlicmFyaWVzKSBhc3luYyB7CiAgICBpZiAobW9kdWxlc1RvTG9hZCAhPSBudWxsKSB7CiAgICAgIGJvb2wgbG9hZGVkQW55dGhpbmcgPSBmYWxzZTsKICAgICAgZm9yIChDb21wb25lbnQgbW9kdWxlIGluIG1vZHVsZXNUb0xvYWQpIHsKICAgICAgICBib29sIHVzZWRDb21wb25lbnQgPSBmYWxzZTsKICAgICAgICBmb3IgKExpYnJhcnkgbGliIGluIG1vZHVsZS5saWJyYXJpZXMpIHsKICAgICAgICAgIGlmICghcmV1c2VkTGlicmFyeVVyaXMuY29udGFpbnMobGliLmltcG9ydFVyaSkpIHsKICAgICAgICAgICAgZGlsbExvYWRlZERhdGEubG9hZGVyLmxpYnJhcmllcy5hZGQobGliKTsKICAgICAgICAgICAgZGlsbExvYWRlZERhdGEuYWRkTGlicmFyeShsaWIpOwogICAgICAgICAgICByZXVzZWRMaWJyYXJpZXMuYWRkKGRpbGxMb2FkZWREYXRhLmxvYWRlci5yZWFkKGxpYi5pbXBvcnRVcmksIC0xKSk7CiAgICAgICAgICAgIHVzZWRDb21wb25lbnQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodXNlZENvbXBvbmVudCkgewogICAgICAgICAgZGlsbExvYWRlZERhdGEudXJpVG9Tb3VyY2UuYWRkQWxsKG1vZHVsZS51cmlUb1NvdXJjZSk7CiAgICAgICAgICBsb2FkZWRBbnl0aGluZyA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChsb2FkZWRBbnl0aGluZykgewogICAgICAgIGF3YWl0IGRpbGxMb2FkZWREYXRhLmJ1aWxkT3V0bGluZXMoKTsKICAgICAgICB1c2VyQnVpbGRlcnMgPSA8VXJpLCBMaWJyYXJ5QnVpbGRlcj57fTsKICAgICAgICBwbGF0Zm9ybUJ1aWxkZXJzID0gPExpYnJhcnlCdWlsZGVyPltdOwogICAgICAgIGRpbGxMb2FkZWREYXRhLmxvYWRlci5idWlsZGVycy5mb3JFYWNoKCh1cmksIGJ1aWxkZXIpIHsKICAgICAgICAgIGlmIChidWlsZGVyLnVyaS5zY2hlbWUgPT0gImRhcnQiKSB7CiAgICAgICAgICAgIHBsYXRmb3JtQnVpbGRlcnMuYWRkKGJ1aWxkZXIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdXNlckJ1aWxkZXJzW3VyaV0gPSBidWlsZGVyOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGlmICh1c2VyQnVpbGRlcnMuaXNFbXB0eSkgewogICAgICAgICAgdXNlckJ1aWxkZXJzID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgICAgbW9kdWxlc1RvTG9hZCA9IG51bGw7CiAgICB9CiAgfQoKICAvLy8gSW50ZXJuYWwgbWV0aG9kLgogIHZvaWQgcmVpc3N1ZUxpYnJhcnlQcm9ibGVtcygKICAgICAgU2V0PExpYnJhcnk+IGFsbExpYnJhcmllcywgTGlzdDxMaWJyYXJ5PiBjb21waWxlZExpYnJhcmllcykgewogICAgLy8gVGhlIG5ld2x5LWNvbXBpbGVkIGxpYnJhcmllcyBoYXZlIGlzc3VlZCBwcm9ibGVtcyBhbHJlYWR5LiBSZS1pc3N1ZQogICAgLy8gcHJvYmxlbXMgZm9yIHRoZSBsaWJyYXJpZXMgdGhhdCB3ZXJlbid0IHJlLWNvbXBpbGVkIChpZ25vcmUgY29tcGlsZQogICAgLy8gZXhwcmVzc2lvbiBwcm9ibGVtcykKICAgIGFsbExpYnJhcmllcy5yZW1vdmVBbGwoY29tcGlsZWRMaWJyYXJpZXMpOwogICAgZm9yIChMaWJyYXJ5IGxpYnJhcnkgaW4gYWxsTGlicmFyaWVzKSB7CiAgICAgIGlmIChsaWJyYXJ5LnByb2JsZW1zQXNKc29uPy5pc05vdEVtcHR5ID09IHRydWUpIHsKICAgICAgICBmb3IgKFN0cmluZyBqc29uU3RyaW5nIGluIGxpYnJhcnkucHJvYmxlbXNBc0pzb24pIHsKICAgICAgICAgIERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24gbWVzc2FnZSA9CiAgICAgICAgICAgICAgbmV3IERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24uZnJvbUpzb24oanNvblN0cmluZyk7CiAgICAgICAgICBpZiAobWVzc2FnZS51cmkgPT0gZGVidWdFeHByVXJpKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgY29udGV4dC5vcHRpb25zLnJlcG9ydERpYWdub3N0aWNNZXNzYWdlKG1lc3NhZ2UpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLy8vIEludGVybmFsIG1ldGhvZC4KICAvLy8gUmUtaXNzdWUgcHJvYmxlbXMgb24gdGhlIGNvbXBvbmVudCBhbmQgcmV0dXJuIHRoZSBmaWx0ZXJlZCBsaXN0LgogIExpc3Q8U3RyaW5nPiByZWlzc3VlQ29tcG9uZW50UHJvYmxlbXMoQ29tcG9uZW50IGNvbXBvbmVudFdpdGhEaWxsKSB7CiAgICAvLyBUaGVzZSBwcm9ibGVtcyBoYXZlIGFscmVhZHkgYmVlbiByZXBvcnRlZC4KICAgIFNldDxTdHJpbmc+IGlzc3VlZFByb2JsZW1zID0gbmV3IFNldDxTdHJpbmc+KCk7CiAgICBpZiAoY29tcG9uZW50V2l0aERpbGw/LnByb2JsZW1zQXNKc29uICE9IG51bGwpIHsKICAgICAgaXNzdWVkUHJvYmxlbXMuYWRkQWxsKGNvbXBvbmVudFdpdGhEaWxsLnByb2JsZW1zQXNKc29uKTsKICAgIH0KCiAgICAvLyBSZXBvcnQgb2xkIHByb2JsZW1zIHRoYXQgd2Fzbid0IHJlcG9ydGVkIGFnYWluLgogICAgZm9yIChMaXN0PERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24+IG1lc3NhZ2VzCiAgICAgICAgaW4gcmVtYWluaW5nQ29tcG9uZW50UHJvYmxlbXMudmFsdWVzKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBEaWFnbm9zdGljTWVzc2FnZUZyb21Kc29uIG1lc3NhZ2UgPSBtZXNzYWdlc1tpXTsKICAgICAgICBpZiAoaXNzdWVkUHJvYmxlbXMuYWRkKG1lc3NhZ2UudG9Kc29uU3RyaW5nKCkpKSB7CiAgICAgICAgICBjb250ZXh0Lm9wdGlvbnMucmVwb3J0RGlhZ25vc3RpY01lc3NhZ2UobWVzc2FnZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gU2F2ZSBhbnkgbmV3IGNvbXBvbmVudC1wcm9ibGVtcy4KICAgIGlmIChjb21wb25lbnRXaXRoRGlsbD8ucHJvYmxlbXNBc0pzb24gIT0gbnVsbCkgewogICAgICBmb3IgKFN0cmluZyBqc29uU3RyaW5nIGluIGNvbXBvbmVudFdpdGhEaWxsLnByb2JsZW1zQXNKc29uKSB7CiAgICAgICAgRGlhZ25vc3RpY01lc3NhZ2VGcm9tSnNvbiBtZXNzYWdlID0KICAgICAgICAgICAgbmV3IERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24uZnJvbUpzb24oanNvblN0cmluZyk7CiAgICAgICAgTGlzdDxEaWFnbm9zdGljTWVzc2FnZUZyb21Kc29uPiBtZXNzYWdlcyA9CiAgICAgICAgICAgIHJlbWFpbmluZ0NvbXBvbmVudFByb2JsZW1zW21lc3NhZ2UudXJpXSA/Pz0KICAgICAgICAgICAgICAgIG5ldyBMaXN0PERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24+KCk7CiAgICAgICAgbWVzc2FnZXMuYWRkKG1lc3NhZ2UpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IExpc3Q8U3RyaW5nPi5mcm9tKGlzc3VlZFByb2JsZW1zKTsKICB9CgogIC8vLyBJbnRlcm5hbCBtZXRob2QuCiAgVXJpIGdldFBhcnRGaWxlVXJpKAogICAgICBVcmkgcGFyZW50RmlsZVVyaSwgTGlicmFyeVBhcnQgcGFydCwgVXJpVHJhbnNsYXRvciB1cmlUcmFuc2xhdG9yKSB7CiAgICBVcmkgZmlsZVVyaSA9IHBhcmVudEZpbGVVcmkucmVzb2x2ZShwYXJ0LnBhcnRVcmkpOwogICAgaWYgKGZpbGVVcmkuc2NoZW1lID09ICJwYWNrYWdlIikgewogICAgICAvLyBQYXJ0IHdhcyBzcGVjaWZpZWQgdmlhIHBhY2thZ2UgVVJJIGFuZCB0aGUgcmVzb2x2ZSBhYm92ZSB0aHVzCiAgICAgIC8vIGRpZCBub3QgZ28gYXMgZXhwZWN0ZWQuIFRyYW5zbGF0ZSB0aGUgcGFja2FnZSBVUkkgdG8gZ2V0IHRoZQogICAgICAvLyBhY3R1YWwgZmlsZSBVUkkuCiAgICAgIGZpbGVVcmkgPSB1cmlUcmFuc2xhdG9yLnRyYW5zbGF0ZShmaWxlVXJpLCBmYWxzZSk7CiAgICB9CiAgICByZXR1cm4gZmlsZVVyaTsKICB9CgogIC8vLyBJbnRlcm5hbCBtZXRob2QuCiAgLy8vIENvbXB1dGUgdGhlIHRyYW5zaXRpdmUgY2xvc3VyZS4KICAvLy8KICAvLy8gQXMgYSBzaWRlLWVmZmVjdCwgdGhpcyBhbHNvIGNsZWFucy11cCBub3ctdW5yZWZlcmVuY2VkIGJ1aWxkZXJzIGFzIHdlbGwgYXMKICAvLy8gYW55IHNhdmVkIGNvbXBvbmVudCBwcm9ibGVtcyBmb3Igc3VjaCBidWlsZGVycy4KICBMaXN0PExpYnJhcnk+IGNvbXB1dGVUcmFuc2l0aXZlQ2xvc3VyZSgKICAgICAgTGlzdDxMaWJyYXJ5PiBpbnB1dExpYnJhcmllcywKICAgICAgTGlzdDxVcmk+IGVudHJpZXMsCiAgICAgIExpc3Q8TGlicmFyeUJ1aWxkZXI+IHJldXNlZExpYnJhcmllcywKICAgICAgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5LAogICAgICBVcmlUcmFuc2xhdG9yIHVyaVRyYW5zbGF0b3IsCiAgICAgIE1hcDxVcmksIFNvdXJjZT4gdXJpVG9Tb3VyY2UsCiAgICAgIFtMaXN0PExpYnJhcnk+IGlucHV0TGlicmFyaWVzRmlsdGVyZWRdKSB7CiAgICBMaXN0PExpYnJhcnk+IHJlc3VsdCA9IG5ldyBMaXN0PExpYnJhcnk+KCk7CiAgICBNYXA8VXJpLCBMaWJyYXJ5PiBsaWJyYXJ5TWFwID0gPFVyaSwgTGlicmFyeT57fTsKICAgIE1hcDxVcmksIExpYnJhcnk+IHBvdGVudGlhbGx5UmVmZXJlbmNlZExpYnJhcmllcyA9IDxVcmksIExpYnJhcnk+e307CiAgICBNYXA8VXJpLCBMaWJyYXJ5PiBwb3RlbnRpYWxseVJlZmVyZW5jZWRJbnB1dExpYnJhcmllcyA9IDxVcmksIExpYnJhcnk+e307CiAgICBmb3IgKExpYnJhcnkgbGlicmFyeSBpbiBpbnB1dExpYnJhcmllcykgewogICAgICBsaWJyYXJ5TWFwW2xpYnJhcnkuaW1wb3J0VXJpXSA9IGxpYnJhcnk7CiAgICAgIGlmIChsaWJyYXJ5LmltcG9ydFVyaS5zY2hlbWUgPT0gImRhcnQiKSB7CiAgICAgICAgcmVzdWx0LmFkZChsaWJyYXJ5KTsKICAgICAgICBpbnB1dExpYnJhcmllc0ZpbHRlcmVkPy5hZGQobGlicmFyeSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcG90ZW50aWFsbHlSZWZlcmVuY2VkTGlicmFyaWVzW2xpYnJhcnkuaW1wb3J0VXJpXSA9IGxpYnJhcnk7CiAgICAgICAgcG90ZW50aWFsbHlSZWZlcmVuY2VkSW5wdXRMaWJyYXJpZXNbbGlicmFyeS5pbXBvcnRVcmldID0gbGlicmFyeTsKICAgICAgfQogICAgfQoKICAgIExpc3Q8VXJpPiB3b3JrbGlzdCA9IG5ldyBMaXN0PFVyaT4oKTsKICAgIHdvcmtsaXN0LmFkZEFsbChlbnRyaWVzKTsKICAgIGZvciAoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSBpbiByZXVzZWRMaWJyYXJpZXMpIHsKICAgICAgaWYgKGxpYnJhcnkudXJpLnNjaGVtZSA9PSAiZGFydCIgJiYgIWxpYnJhcnkuaXNTeW50aGV0aWMpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBMaWJyYXJ5IGxpYiA9IGxpYnJhcnkudGFyZ2V0OwogICAgICBwb3RlbnRpYWxseVJlZmVyZW5jZWRMaWJyYXJpZXNbbGlicmFyeS51cmldID0gbGliOwogICAgICBsaWJyYXJ5TWFwW2xpYnJhcnkudXJpXSA9IGxpYjsKICAgIH0KCiAgICBMaWJyYXJ5R3JhcGggZ3JhcGggPSBuZXcgTGlicmFyeUdyYXBoKGxpYnJhcnlNYXApOwogICAgd2hpbGUgKHdvcmtsaXN0LmlzTm90RW1wdHkgJiYgcG90ZW50aWFsbHlSZWZlcmVuY2VkTGlicmFyaWVzLmlzTm90RW1wdHkpIHsKICAgICAgVXJpIHVyaSA9IHdvcmtsaXN0LnJlbW92ZUxhc3QoKTsKICAgICAgaWYgKGxpYnJhcnlNYXAuY29udGFpbnNLZXkodXJpKSkgewogICAgICAgIGZvciAoVXJpIG5laWdoYm9yIGluIGdyYXBoLm5laWdoYm9yc09mKHVyaSkpIHsKICAgICAgICAgIHdvcmtsaXN0LmFkZChuZWlnaGJvcik7CiAgICAgICAgfQogICAgICAgIGxpYnJhcnlNYXAucmVtb3ZlKHVyaSk7CiAgICAgICAgTGlicmFyeSBsaWJyYXJ5ID0gcG90ZW50aWFsbHlSZWZlcmVuY2VkTGlicmFyaWVzLnJlbW92ZSh1cmkpOwogICAgICAgIGlmIChsaWJyYXJ5ICE9IG51bGwpIHsKICAgICAgICAgIHJlc3VsdC5hZGQobGlicmFyeSk7CiAgICAgICAgICBpZiAocG90ZW50aWFsbHlSZWZlcmVuY2VkSW5wdXRMaWJyYXJpZXMucmVtb3ZlKHVyaSkgIT0gbnVsbCkgewogICAgICAgICAgICBpbnB1dExpYnJhcmllc0ZpbHRlcmVkPy5hZGQobGlicmFyeSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgTGlzdDxMaWJyYXJ5PiByZW1vdmVkTGlicmFyaWVzID0gbmV3IExpc3Q8TGlicmFyeT4oKTsKICAgIGZvciAoVXJpIHVyaSBpbiBwb3RlbnRpYWxseVJlZmVyZW5jZWRMaWJyYXJpZXMua2V5cykgewogICAgICBpZiAodXJpLnNjaGVtZSA9PSAicGFja2FnZSIpIGNvbnRpbnVlOwogICAgICBMaWJyYXJ5QnVpbGRlciBidWlsZGVyID0gdXNlckNvZGUubG9hZGVyLmJ1aWxkZXJzLnJlbW92ZSh1cmkpOwogICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7CiAgICAgICAgTGlicmFyeSBsaWIgPSBidWlsZGVyLnRhcmdldDsKICAgICAgICByZW1vdmVkTGlicmFyaWVzLmFkZChsaWIpOwogICAgICAgIGRpbGxMb2FkZWREYXRhLmxvYWRlci5idWlsZGVycy5yZW1vdmUodXJpKTsKICAgICAgICBDb21waWxlckNvbnRleHQuY3VycmVudC51cmlUb1NvdXJjZS5yZW1vdmUodXJpKTsKICAgICAgICB1cmlUb1NvdXJjZS5yZW1vdmUodXJpKTsKICAgICAgICB1c2VyQnVpbGRlcnM/LnJlbW92ZSh1cmkpOwogICAgICAgIHJlbW92ZUxpYnJhcnlGcm9tUmVtYWluaW5nQ29tcG9uZW50UHJvYmxlbXMobGliLCB1cmlUcmFuc2xhdG9yKTsKICAgICAgfQogICAgfQogICAgaGllcmFyY2h5Py5hcHBseVRyZWVDaGFuZ2VzKHJlbW92ZWRMaWJyYXJpZXMsIGNvbnN0IFtdKTsKCiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIEludGVybmFsIG1ldGhvZC4KICB2b2lkIHJlbW92ZUxpYnJhcnlGcm9tUmVtYWluaW5nQ29tcG9uZW50UHJvYmxlbXMoCiAgICAgIExpYnJhcnkgbGliLCBVcmlUcmFuc2xhdG9yIHVyaVRyYW5zbGF0b3IpIHsKICAgIHJlbWFpbmluZ0NvbXBvbmVudFByb2JsZW1zLnJlbW92ZShsaWIuZmlsZVVyaSk7CiAgICAvLyBSZW1vdmUgcGFydHMgdG9vLgogICAgZm9yIChMaWJyYXJ5UGFydCBwYXJ0IGluIGxpYi5wYXJ0cykgewogICAgICBVcmkgcGFydEZpbGVVcmkgPSBnZXRQYXJ0RmlsZVVyaShsaWIuZmlsZVVyaSwgcGFydCwgdXJpVHJhbnNsYXRvcik7CiAgICAgIHJlbWFpbmluZ0NvbXBvbmVudFByb2JsZW1zLnJlbW92ZShwYXJ0RmlsZVVyaSk7CiAgICB9CiAgfQoKICAvLy8gSW50ZXJuYWwgbWV0aG9kLgogIGludCBwcmVwYXJlU3VtbWFyeShMaXN0PGludD4gc3VtbWFyeUJ5dGVzLCBVcmlUcmFuc2xhdG9yIHVyaVRyYW5zbGF0b3IsCiAgICAgIENvbXBpbGVyQ29udGV4dCBjLCBJbmNyZW1lbnRhbENvbXBpbGVyRGF0YSBkYXRhKSB7CiAgICBkaWxsTG9hZGVkRGF0YSA9IG5ldyBEaWxsVGFyZ2V0KHRpY2tlciwgdXJpVHJhbnNsYXRvciwgYy5vcHRpb25zLnRhcmdldCk7CiAgICBpbnQgYnl0ZXNMZW5ndGggPSAwOwoKICAgIGlmIChzdW1tYXJ5Qnl0ZXMgIT0gbnVsbCkgewogICAgICB0aWNrZXIubG9nTXMoIlJlYWQgJHtjLm9wdGlvbnMuc2RrU3VtbWFyeX0iKTsKICAgICAgZGF0YS5jb21wb25lbnQgPSBjLm9wdGlvbnMudGFyZ2V0LmNvbmZpZ3VyZUNvbXBvbmVudChuZXcgQ29tcG9uZW50KCkpOwogICAgICBuZXcgQmluYXJ5QnVpbGRlcihzdW1tYXJ5Qnl0ZXMsIGRpc2FibGVMYXp5UmVhZGluZzogZmFsc2UpCiAgICAgICAgICAucmVhZENvbXBvbmVudChkYXRhLmNvbXBvbmVudCk7CiAgICAgIHRpY2tlci5sb2dNcygiRGVzZXJpYWxpemVkICR7Yy5vcHRpb25zLnNka1N1bW1hcnl9Iik7CiAgICAgIGJ5dGVzTGVuZ3RoICs9IHN1bW1hcnlCeXRlcy5sZW5ndGg7CiAgICB9CgogICAgcmV0dXJuIGJ5dGVzTGVuZ3RoOwogIH0KCiAgLy8vIEludGVybmFsIG1ldGhvZC4KICAvLyBUaGlzIHByb2NlZHVyZSB3aWxsIHRyeSB0byBsb2FkIHRoZSBkaWxsIGZpbGUgYW5kIHdpbGwgY3Jhc2ggaWYgaXQgY2Fubm90LgogIEZ1dHVyZTxpbnQ+IGluaXRpYWxpemVGcm9tRGlsbChVcmlUcmFuc2xhdG9yIHVyaVRyYW5zbGF0b3IsIENvbXBpbGVyQ29udGV4dCBjLAogICAgICBJbmNyZW1lbnRhbENvbXBpbGVyRGF0YSBkYXRhKSBhc3luYyB7CiAgICBpbnQgYnl0ZXNMZW5ndGggPSAwOwogICAgRmlsZVN5c3RlbUVudGl0eSBlbnRpdHkgPQogICAgICAgIGMub3B0aW9ucy5maWxlU3lzdGVtLmVudGl0eUZvclVyaShpbml0aWFsaXplRnJvbURpbGxVcmkpOwogICAgaWYgKGF3YWl0IGVudGl0eS5leGlzdHMoKSkgewogICAgICBMaXN0PGludD4gaW5pdGlhbGl6YXRpb25CeXRlcyA9IGF3YWl0IGVudGl0eS5yZWFkQXNCeXRlcygpOwogICAgICBpZiAoaW5pdGlhbGl6YXRpb25CeXRlcyAhPSBudWxsKSB7CiAgICAgICAgdGlja2VyLmxvZ01zKCJSZWFkICRpbml0aWFsaXplRnJvbURpbGxVcmkiKTsKICAgICAgICBkYXRhLmluaXRpYWxpemF0aW9uQnl0ZXMgPSBpbml0aWFsaXphdGlvbkJ5dGVzOwoKICAgICAgICAvLyBXZSdyZSBnb2luZyB0byBvdXRwdXQgYWxsIHdlIHJlYWQgaGVyZSBzbyBsYXp5IGxvYWRpbmcgaXQKICAgICAgICAvLyBkb2Vzbid0IG1ha2Ugc2Vuc2UuCiAgICAgICAgbmV3IEJpbmFyeUJ1aWxkZXIoaW5pdGlhbGl6YXRpb25CeXRlcywgZGlzYWJsZUxhenlSZWFkaW5nOiB0cnVlKQogICAgICAgICAgICAucmVhZENvbXBvbmVudChkYXRhLmNvbXBvbmVudCwgY2hlY2tDYW5vbmljYWxOYW1lczogdHJ1ZSk7CgogICAgICAgIC8vIENoZWNrIHRoZSBhbnkgcGFja2FnZS11cmxzIHN0aWxsIHBvaW50IHRvIHRoZSBzYW1lIGZpbGUKICAgICAgICAvLyAoZS5nLiB0aGUgcGFja2FnZSBzdGlsbCBleGlzdHMgYW5kIGhhc24ndCBiZWVuIHVwZGF0ZWQpLgogICAgICAgIGZvciAoTGlicmFyeSBsaWIgaW4gZGF0YS5jb21wb25lbnQubGlicmFyaWVzKSB7CiAgICAgICAgICBpZiAobGliLmltcG9ydFVyaS5zY2hlbWUgPT0gInBhY2thZ2UiICYmCiAgICAgICAgICAgICAgdXJpVHJhbnNsYXRvci50cmFuc2xhdGUobGliLmltcG9ydFVyaSwgZmFsc2UpICE9IGxpYi5maWxlVXJpKSB7CiAgICAgICAgICAgIC8vIFBhY2thZ2UgaGFzIGJlZW4gcmVtb3ZlZCBvciB1cGRhdGVkLgogICAgICAgICAgICAvLyBUaGlzIGxpYnJhcnkgc2hvdWxkIGJlIHRocm93biBhd2F5LgogICAgICAgICAgICAvLyBFdmVyeXRoaW5nIHRoYXQgZGVwZW5kcyBvbiBpdCBzaG91bGQgYmUgdGhyb3duIGF3YXkuCiAgICAgICAgICAgIC8vIFRPRE8oamVuc2opOiBBbnl0aGluZyB0aGF0IGRvZXNuJ3QgZGVwZW5kIG9uIGl0IGNhbiBiZSBrZXB0LgogICAgICAgICAgICAvLyBGb3Igbm93IGp1c3QgZG9uJ3QgaW5pdGlhbGl6ZSBmcm9tIHRoaXMgZGlsbC4KICAgICAgICAgICAgdGhyb3cgY29uc3QgUGFja2FnZUNoYW5nZWRFcnJvcigpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaW5pdGlhbGl6ZWRGcm9tRGlsbCA9IHRydWU7CiAgICAgICAgYnl0ZXNMZW5ndGggKz0gaW5pdGlhbGl6YXRpb25CeXRlcy5sZW5ndGg7CiAgICAgICAgZGF0YS51c2VyTG9hZGVkVXJpTWFpbiA9IGRhdGEuY29tcG9uZW50Lm1haW5NZXRob2Q7CiAgICAgICAgc2F2ZUNvbXBvbmVudFByb2JsZW1zKGRhdGEpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYnl0ZXNMZW5ndGg7CiAgfQoKICAvLy8gSW50ZXJuYWwgbWV0aG9kLgogIHZvaWQgc2F2ZUNvbXBvbmVudFByb2JsZW1zKEluY3JlbWVudGFsQ29tcGlsZXJEYXRhIGRhdGEpIHsKICAgIGlmIChkYXRhLmNvbXBvbmVudC5wcm9ibGVtc0FzSnNvbiAhPSBudWxsKSB7CiAgICAgIGZvciAoU3RyaW5nIGpzb25TdHJpbmcgaW4gZGF0YS5jb21wb25lbnQucHJvYmxlbXNBc0pzb24pIHsKICAgICAgICBEaWFnbm9zdGljTWVzc2FnZUZyb21Kc29uIG1lc3NhZ2UgPQogICAgICAgICAgICBuZXcgRGlhZ25vc3RpY01lc3NhZ2VGcm9tSnNvbi5mcm9tSnNvbihqc29uU3RyaW5nKTsKICAgICAgICBMaXN0PERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24+IG1lc3NhZ2VzID0KICAgICAgICAgICAgcmVtYWluaW5nQ29tcG9uZW50UHJvYmxlbXNbbWVzc2FnZS51cmldID8/PQogICAgICAgICAgICAgICAgbmV3IExpc3Q8RGlhZ25vc3RpY01lc3NhZ2VGcm9tSnNvbj4oKTsKICAgICAgICBtZXNzYWdlcy5hZGQobWVzc2FnZSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBJbnRlcm5hbCBtZXRob2QuCiAgLy8gVGhpcyBwcm9jZWR1cmUgd2lsbCBzZXQgdXAgY29tcGlsZXIgZnJvbSBbY29tcG9uZW50VG9Jbml0aWFsaXplRnJvbV0uCiAgdm9pZCBpbml0aWFsaXplRnJvbUNvbXBvbmVudChVcmlUcmFuc2xhdG9yIHVyaVRyYW5zbGF0b3IsIENvbXBpbGVyQ29udGV4dCBjLAogICAgICBJbmNyZW1lbnRhbENvbXBpbGVyRGF0YSBkYXRhKSB7CiAgICB0aWNrZXIubG9nTXMoIkFib3V0IHRvIGluaXRpYWxpemVGcm9tQ29tcG9uZW50Iik7CgogICAgZGlsbExvYWRlZERhdGEgPSBuZXcgRGlsbFRhcmdldCh0aWNrZXIsIHVyaVRyYW5zbGF0b3IsIGMub3B0aW9ucy50YXJnZXQpOwogICAgZGF0YS5jb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KAogICAgICAgIGxpYnJhcmllczogY29tcG9uZW50VG9Jbml0aWFsaXplRnJvbS5saWJyYXJpZXMsCiAgICAgICAgdXJpVG9Tb3VyY2U6IGNvbXBvbmVudFRvSW5pdGlhbGl6ZUZyb20udXJpVG9Tb3VyY2UpCiAgICAgIC4ubWFpbk1ldGhvZCA9IGNvbXBvbmVudFRvSW5pdGlhbGl6ZUZyb20ubWFpbk1ldGhvZDsKICAgIGRhdGEudXNlckxvYWRlZFVyaU1haW4gPSBjb21wb25lbnRUb0luaXRpYWxpemVGcm9tLm1haW5NZXRob2Q7CiAgICBzYXZlQ29tcG9uZW50UHJvYmxlbXMoZGF0YSk7CgogICAgYm9vbCBmb3VuZERhcnRDb3JlID0gZmFsc2U7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEuY29tcG9uZW50LmxpYnJhcmllcy5sZW5ndGg7IGkrKykgewogICAgICBMaWJyYXJ5IGxpYnJhcnkgPSBkYXRhLmNvbXBvbmVudC5saWJyYXJpZXNbaV07CiAgICAgIGlmIChsaWJyYXJ5LmltcG9ydFVyaS5zY2hlbWUgPT0gImRhcnQiICYmCiAgICAgICAgICBsaWJyYXJ5LmltcG9ydFVyaS5wYXRoID09ICJjb3JlIikgewogICAgICAgIGZvdW5kRGFydENvcmUgPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgaWYgKCFmb3VuZERhcnRDb3JlKSB7CiAgICAgIHRocm93IGNvbnN0IEluaXRpYWxpemVGcm9tQ29tcG9uZW50RXJyb3IoIkRpZCBub3QgZmluZCBkYXJ0OmNvcmUgd2hlbiAiCiAgICAgICAgICAidHJpZWQgdG8gaW5pdGlhbGl6ZSBmcm9tIGNvbXBvbmVudC4iKTsKICAgIH0KCiAgICB0aWNrZXIubG9nTXMoIlJhbiBpbml0aWFsaXplRnJvbUNvbXBvbmVudCIpOwogIH0KCiAgLy8vIEludGVybmFsIG1ldGhvZC4KICB2b2lkIGFwcGVuZExpYnJhcmllcyhJbmNyZW1lbnRhbENvbXBpbGVyRGF0YSBkYXRhLCBpbnQgYnl0ZXNMZW5ndGgpIHsKICAgIGlmIChkYXRhLmNvbXBvbmVudCAhPSBudWxsKSB7CiAgICAgIGRpbGxMb2FkZWREYXRhLmxvYWRlcgogICAgICAgICAgLmFwcGVuZExpYnJhcmllcyhkYXRhLmNvbXBvbmVudCwgYnl0ZUNvdW50OiBieXRlc0xlbmd0aCk7CiAgICB9CiAgICB0aWNrZXIubG9nTXMoIkFwcGVuZGVkIGxpYnJhcmllcyIpOwogIH0KCiAgQG92ZXJyaWRlCiAgRnV0dXJlPFByb2NlZHVyZT4gY29tcGlsZUV4cHJlc3Npb24oCiAgICAgIFN0cmluZyBleHByZXNzaW9uLAogICAgICBNYXA8U3RyaW5nLCBEYXJ0VHlwZT4gZGVmaW5pdGlvbnMsCiAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZURlZmluaXRpb25zLAogICAgICBTdHJpbmcgc3ludGhldGljUHJvY2VkdXJlTmFtZSwKICAgICAgVXJpIGxpYnJhcnlVcmksCiAgICAgIFtTdHJpbmcgY2xhc3NOYW1lLAogICAgICBib29sIGlzU3RhdGljID0gZmFsc2VdKSBhc3luYyB7CiAgICBhc3NlcnQoZGlsbExvYWRlZERhdGEgIT0gbnVsbCAmJiB1c2VyQ29kZSAhPSBudWxsKTsKCiAgICByZXR1cm4gYXdhaXQgY29udGV4dC5ydW5JbkNvbnRleHQoKF8pIGFzeW5jIHsKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9CiAgICAgICAgICB1c2VyQ29kZS5sb2FkZXIucmVhZChsaWJyYXJ5VXJpLCAtMSwgYWNjZXNzb3I6IHVzZXJDb2RlLmxvYWRlci5maXJzdCk7CgogICAgICBDbGFzcyBrZXJuZWxDbGFzczsKICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7CiAgICAgICAga2VybmVsQ2xhc3MgPSBsaWJyYXJ5LnNjb3BlQnVpbGRlcltjbGFzc05hbWVdPy50YXJnZXQ7CiAgICAgICAgaWYgKGtlcm5lbENsYXNzID09IG51bGwpIHJldHVybiBudWxsOwogICAgICB9CgogICAgICB1c2VyQ29kZS5sb2FkZXIuc2Vlbk1lc3NhZ2VzLmNsZWFyKCk7CgogICAgICBmb3IgKFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtIGluIHR5cGVEZWZpbml0aW9ucykgewogICAgICAgIGlmICghaXNMZWdhbElkZW50aWZpZXIodHlwZVBhcmFtLm5hbWUpKSByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBmb3IgKFN0cmluZyBuYW1lIGluIGRlZmluaXRpb25zLmtleXMpIHsKICAgICAgICBpZiAoIWlzTGVnYWxJZGVudGlmaWVyKG5hbWUpKSByZXR1cm4gbnVsbDsKICAgICAgfQoKICAgICAgS2VybmVsTGlicmFyeUJ1aWxkZXIgZGVidWdMaWJyYXJ5ID0gbmV3IEtlcm5lbExpYnJhcnlCdWlsZGVyKAogICAgICAgICAgbGlicmFyeVVyaSwKICAgICAgICAgIGRlYnVnRXhwclVyaSwKICAgICAgICAgIHVzZXJDb2RlLmxvYWRlciwKICAgICAgICAgIG51bGwsCiAgICAgICAgICBsaWJyYXJ5LnNjb3BlLmNyZWF0ZU5lc3RlZFNjb3BlKCJleHByZXNzaW9uIiksCiAgICAgICAgICBsaWJyYXJ5LnRhcmdldCk7CgogICAgICBpZiAobGlicmFyeSBpcyBEaWxsTGlicmFyeUJ1aWxkZXIpIHsKICAgICAgICBmb3IgKExpYnJhcnlEZXBlbmRlbmN5IGRlcGVuZGVuY3kgaW4gbGlicmFyeS50YXJnZXQuZGVwZW5kZW5jaWVzKSB7CiAgICAgICAgICBpZiAoIWRlcGVuZGVuY3kuaXNJbXBvcnQpIGNvbnRpbnVlOwoKICAgICAgICAgIExpc3Q8Q29tYmluYXRvcj4gY29tYmluYXRvcnM7CgogICAgICAgICAgZm9yIChrZXJuZWwuQ29tYmluYXRvciBjb21iaW5hdG9yIGluIGRlcGVuZGVuY3kuY29tYmluYXRvcnMpIHsKICAgICAgICAgICAgY29tYmluYXRvcnMgPz89IDxDb21iaW5hdG9yPltdOwoKICAgICAgICAgICAgY29tYmluYXRvcnMuYWRkKGNvbWJpbmF0b3IuaXNTaG93CiAgICAgICAgICAgICAgICA/IG5ldyBDb21iaW5hdG9yLnNob3coCiAgICAgICAgICAgICAgICAgICAgY29tYmluYXRvci5uYW1lcywgY29tYmluYXRvci5maWxlT2Zmc2V0LCBsaWJyYXJ5LmZpbGVVcmkpCiAgICAgICAgICAgICAgICA6IG5ldyBDb21iaW5hdG9yLmhpZGUoCiAgICAgICAgICAgICAgICAgICAgY29tYmluYXRvci5uYW1lcywgY29tYmluYXRvci5maWxlT2Zmc2V0LCBsaWJyYXJ5LmZpbGVVcmkpKTsKICAgICAgICAgIH0KCiAgICAgICAgICBkZWJ1Z0xpYnJhcnkuYWRkSW1wb3J0KAogICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgZGVwZW5kZW5jeS5pbXBvcnRlZExpYnJhcnlSZWZlcmVuY2UuY2Fub25pY2FsTmFtZS5uYW1lLAogICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgZGVwZW5kZW5jeS5uYW1lLAogICAgICAgICAgICAgIGNvbWJpbmF0b3JzLAogICAgICAgICAgICAgIGRlcGVuZGVuY3kuaXNEZWZlcnJlZCwKICAgICAgICAgICAgICAtMSwKICAgICAgICAgICAgICAtMSwKICAgICAgICAgICAgICAtMSwKICAgICAgICAgICAgICAtMSk7CiAgICAgICAgfQoKICAgICAgICBkZWJ1Z0xpYnJhcnkuYWRkSW1wb3J0c1RvU2NvcGUoKTsKICAgICAgfQoKICAgICAgSHlicmlkRmlsZVN5c3RlbSBoZnMgPSB1c2VyQ29kZS5maWxlU3lzdGVtOwogICAgICBNZW1vcnlGaWxlU3lzdGVtIGZzID0gaGZzLm1lbW9yeTsKICAgICAgZnMuZW50aXR5Rm9yVXJpKGRlYnVnRXhwclVyaSkud3JpdGVBc1N0cmluZ1N5bmMoZXhwcmVzc2lvbik7CgogICAgICBGdW5jdGlvbk5vZGUgcGFyYW1ldGVycyA9IG5ldyBGdW5jdGlvbk5vZGUobnVsbCwKICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzOiB0eXBlRGVmaW5pdGlvbnMsCiAgICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyczogZGVmaW5pdGlvbnMua2V5cwogICAgICAgICAgICAgIC5tYXAoKG5hbWUpID0+IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQobmFtZSwgMCkpCiAgICAgICAgICAgICAgLnRvTGlzdCgpKTsKCiAgICAgIGRlYnVnTGlicmFyeS5idWlsZCh1c2VyQ29kZS5sb2FkZXIuY29yZUxpYnJhcnksIG1vZGlmeVRhcmdldDogZmFsc2UpOwogICAgICBFeHByZXNzaW9uIGNvbXBpbGVkRXhwcmVzc2lvbiA9IGF3YWl0IHVzZXJDb2RlLmxvYWRlci5idWlsZEV4cHJlc3Npb24oCiAgICAgICAgICBkZWJ1Z0xpYnJhcnksIGNsYXNzTmFtZSwgY2xhc3NOYW1lICE9IG51bGwgJiYgIWlzU3RhdGljLCBwYXJhbWV0ZXJzKTsKCiAgICAgIFByb2NlZHVyZSBwcm9jZWR1cmUgPSBuZXcgUHJvY2VkdXJlKAogICAgICAgICAgbmV3IE5hbWUoc3ludGhldGljUHJvY2VkdXJlTmFtZSksIFByb2NlZHVyZUtpbmQuTWV0aG9kLCBwYXJhbWV0ZXJzLAogICAgICAgICAgaXNTdGF0aWM6IGlzU3RhdGljKTsKCiAgICAgIHBhcmFtZXRlcnMuYm9keSA9IG5ldyBSZXR1cm5TdGF0ZW1lbnQoY29tcGlsZWRFeHByZXNzaW9uKQogICAgICAgIC4ucGFyZW50ID0gcGFyYW1ldGVyczsKCiAgICAgIHByb2NlZHVyZS5maWxlVXJpID0gZGVidWdMaWJyYXJ5LmZpbGVVcmk7CiAgICAgIHByb2NlZHVyZS5wYXJlbnQgPSBjbGFzc05hbWUgIT0gbnVsbCA/IGtlcm5lbENsYXNzIDogbGlicmFyeS50YXJnZXQ7CgogICAgICB1c2VyQ29kZS51cmlUb1NvdXJjZS5yZW1vdmUoZGVidWdFeHByVXJpKTsKICAgICAgdXNlckNvZGUubG9hZGVyLnNvdXJjZUJ5dGVzLnJlbW92ZShkZWJ1Z0V4cHJVcmkpOwoKICAgICAgdXNlckNvZGUucnVuUHJvY2VkdXJlVHJhbnNmb3JtYXRpb25zKHByb2NlZHVyZSk7CgogICAgICByZXR1cm4gcHJvY2VkdXJlOwogICAgfSk7CiAgfQoKICAvLy8gSW50ZXJuYWwgbWV0aG9kLgogIExpc3Q8TGlicmFyeUJ1aWxkZXI+IGNvbXB1dGVSZXVzZWRMaWJyYXJpZXMoCiAgICAgIFNldDxVcmk+IGludmFsaWRhdGVkVXJpcywgVXJpVHJhbnNsYXRvciB1cmlUcmFuc2xhdG9yLAogICAgICB7U2V0PExpYnJhcnlCdWlsZGVyPiBub3RSZXVzZWR9KSB7CiAgICBMaXN0PExpYnJhcnlCdWlsZGVyPiByZXN1bHQgPSA8TGlicmFyeUJ1aWxkZXI+W107CiAgICByZXN1bHQuYWRkQWxsKHBsYXRmb3JtQnVpbGRlcnMpOwogICAgaWYgKHVzZXJDb2RlID09IG51bGwgJiYgdXNlckJ1aWxkZXJzID09IG51bGwpIHsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAvLyBNYXBzIGFsbCBub24tcGxhdGZvcm0gTGlicmFyeUJ1aWxkZXJzIGZyb20gdGhlaXIgaW1wb3J0IFVSSS4KICAgIE1hcDxVcmksIExpYnJhcnlCdWlsZGVyPiBidWlsZGVycyA9IDxVcmksIExpYnJhcnlCdWlsZGVyPnt9OwoKICAgIC8vIEludmFsaWRhdGVkIFVSSXMgdHJhbnNsYXRlZCBiYWNrIHRvIHRoZWlyIGltcG9ydCBVUkkgKHBhY2thZ2U6LCBkYXJ0OiwKICAgIC8vIGV0Yy4pLgogICAgTGlzdDxVcmk+IGludmFsaWRhdGVkSW1wb3J0VXJpcyA9IDxVcmk+W107CgogICAgYm9vbCBpc0ludmFsaWRhdGVkKFVyaSBpbXBvcnRVcmksIFVyaSBmaWxlVXJpKSB7CiAgICAgIGlmIChpbnZhbGlkYXRlZFVyaXMuY29udGFpbnMoaW1wb3J0VXJpKSkgcmV0dXJuIHRydWU7CiAgICAgIGlmIChpbXBvcnRVcmkgIT0gZmlsZVVyaSAmJiBpbnZhbGlkYXRlZFVyaXMuY29udGFpbnMoZmlsZVVyaSkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoaGFzVG9DaGVja1BhY2thZ2VVcmlzICYmCiAgICAgICAgICBpbXBvcnRVcmkuc2NoZW1lID09ICJwYWNrYWdlIiAmJgogICAgICAgICAgdXJpVHJhbnNsYXRvci50cmFuc2xhdGUoaW1wb3J0VXJpLCBmYWxzZSkgIT0gZmlsZVVyaSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGlmIChidWlsZGVyc1tpbXBvcnRVcmldPy5pc1N5bnRoZXRpYyA/PyBmYWxzZSkgcmV0dXJuIHRydWU7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBhZGRCdWlsZGVyQW5kSW52YWxpZGF0ZVVyaXMoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICBpZiAodXJpLnNjaGVtZSA9PSAiZGFydCIgJiYgIWxpYnJhcnkuaXNTeW50aGV0aWMpIHsKICAgICAgICByZXN1bHQuYWRkKGxpYnJhcnkpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBidWlsZGVyc1t1cmldID0gbGlicmFyeTsKICAgICAgaWYgKGlzSW52YWxpZGF0ZWQodXJpLCBsaWJyYXJ5LnRhcmdldC5maWxlVXJpKSkgewogICAgICAgIGludmFsaWRhdGVkSW1wb3J0VXJpcy5hZGQodXJpKTsKICAgICAgfQogICAgICBpZiAobGlicmFyeSBpcyBTb3VyY2VMaWJyYXJ5QnVpbGRlcikgewogICAgICAgIGZvciAoTGlicmFyeUJ1aWxkZXIgcGFydCBpbiBsaWJyYXJ5LnBhcnRzKSB7CiAgICAgICAgICBpZiAoaXNJbnZhbGlkYXRlZChwYXJ0LnVyaSwgcGFydC5maWxlVXJpKSkgewogICAgICAgICAgICBpbnZhbGlkYXRlZEltcG9ydFVyaXMuYWRkKHBhcnQudXJpKTsKICAgICAgICAgICAgYnVpbGRlcnNbcGFydC51cmldID0gcGFydDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobGlicmFyeSBpcyBEaWxsTGlicmFyeUJ1aWxkZXIpIHsKICAgICAgICBmb3IgKExpYnJhcnlQYXJ0IHBhcnQgaW4gbGlicmFyeS50YXJnZXQucGFydHMpIHsKICAgICAgICAgIFVyaSBwYXJ0VXJpID0gbGlicmFyeS51cmkucmVzb2x2ZShwYXJ0LnBhcnRVcmkpOwogICAgICAgICAgVXJpIGZpbGVVcmkgPQogICAgICAgICAgICAgIGdldFBhcnRGaWxlVXJpKGxpYnJhcnkubGlicmFyeS5maWxlVXJpLCBwYXJ0LCB1cmlUcmFuc2xhdG9yKTsKCiAgICAgICAgICBpZiAoaXNJbnZhbGlkYXRlZChwYXJ0VXJpLCBmaWxlVXJpKSkgewogICAgICAgICAgICBpbnZhbGlkYXRlZEltcG9ydFVyaXMuYWRkKHBhcnRVcmkpOwogICAgICAgICAgICBidWlsZGVyc1twYXJ0VXJpXSA9IGxpYnJhcnk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgdXNlckJ1aWxkZXJzPy5mb3JFYWNoKGFkZEJ1aWxkZXJBbmRJbnZhbGlkYXRlVXJpcyk7CiAgICBpZiAodXNlckNvZGUgIT0gbnVsbCkgewogICAgICB1c2VyQ29kZS5sb2FkZXIuYnVpbGRlcnMuZm9yRWFjaChhZGRCdWlsZGVyQW5kSW52YWxpZGF0ZVVyaXMpOwogICAgfQoKICAgIHJlY29yZEludmFsaWRhdGVkSW1wb3J0VXJpc0ZvclRlc3RpbmcoaW52YWxpZGF0ZWRJbXBvcnRVcmlzKTsKCiAgICBCdWlsZGVyR3JhcGggZ3JhcGggPSBuZXcgQnVpbGRlckdyYXBoKGJ1aWxkZXJzKTsKCiAgICAvLyBDb21wdXRlIGRpcmVjdCBkZXBlbmRlbmNpZXMgZm9yIGVhY2ggaW1wb3J0IFVSSSAodGhlIHJldmVyc2Ugb2YgdGhlCiAgICAvLyBlZGdlcyByZXR1cm5lZCBieSBgZ3JhcGgubmVpZ2hib3JzT2ZgKS4KICAgIE1hcDxVcmksIFNldDxVcmk+PiBkaXJlY3REZXBlbmRlbmNpZXMgPSA8VXJpLCBTZXQ8VXJpPj57fTsKICAgIGZvciAoVXJpIHZlcnRleCBpbiBncmFwaC52ZXJ0aWNlcykgewogICAgICBmb3IgKFVyaSBuZWlnaGJvciBpbiBncmFwaC5uZWlnaGJvcnNPZih2ZXJ0ZXgpKSB7CiAgICAgICAgKGRpcmVjdERlcGVuZGVuY2llc1tuZWlnaGJvcl0gPz89IG5ldyBTZXQ8VXJpPigpKS5hZGQodmVydGV4KTsKICAgICAgfQogICAgfQoKICAgIC8vIFJlbW92ZSBhbGwgZGVwZW5kZW5jaWVzIG9mIFtpbnZhbGlkYXRlZEltcG9ydFVyaXNdIGZyb20gYnVpbGRlcnMuCiAgICBMaXN0PFVyaT4gd29ya0xpc3QgPSBpbnZhbGlkYXRlZEltcG9ydFVyaXM7CiAgICB3aGlsZSAod29ya0xpc3QuaXNOb3RFbXB0eSkgewogICAgICBVcmkgcmVtb3ZlZCA9IHdvcmtMaXN0LnJlbW92ZUxhc3QoKTsKICAgICAgTGlicmFyeUJ1aWxkZXIgY3VycmVudCA9IGJ1aWxkZXJzLnJlbW92ZShyZW1vdmVkKTsKICAgICAgLy8gW2N1cnJlbnRdIGlzIG51bGwgaWYgdGhlIGNvcnJlc3BvbmRpbmcga2V5IChVUkkpIGhhcyBhbHJlYWR5IGJlZW4KICAgICAgLy8gcmVtb3ZlZC4KICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbCkgewogICAgICAgIFNldDxVcmk+IHMgPSBkaXJlY3REZXBlbmRlbmNpZXNbY3VycmVudC51cmldOwogICAgICAgIGlmIChjdXJyZW50LnVyaSAhPSByZW1vdmVkKSB7CiAgICAgICAgICBpZiAocyA9PSBudWxsKSB7CiAgICAgICAgICAgIHMgPSBkaXJlY3REZXBlbmRlbmNpZXNbcmVtb3ZlZF07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzLmFkZEFsbChkaXJlY3REZXBlbmRlbmNpZXNbcmVtb3ZlZF0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocyAhPSBudWxsKSB7CiAgICAgICAgICAvLyBbc10gaXMgbnVsbCBmb3IgbGVhdmVzLgogICAgICAgICAgZm9yIChVcmkgZGVwZW5kZW5jeSBpbiBzKSB7CiAgICAgICAgICAgIHdvcmtMaXN0LmFkZChkZXBlbmRlbmN5KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbm90UmV1c2VkPy5hZGQoY3VycmVudCk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBCdWlsZGVycyBjb250YWluIG1hcHBpbmdzIGZyb20gcGFydCB1cmkgdG8gYnVpbGRlciwgbWVhbmluZyB0aGUgc2FtZQogICAgLy8gYnVpbGRlciBjYW4gZXhpc3QgbXVsdGlwbGUgdGltZXMgaW4gdGhlIHZhbHVlcyBsaXN0LgogICAgU2V0PFVyaT4gc2VlblVyaXMgPSBuZXcgU2V0PFVyaT4oKTsKICAgIGZvciAoTGlicmFyeUJ1aWxkZXIgYnVpbGRlciBpbiBidWlsZGVycy52YWx1ZXMpIHsKICAgICAgaWYgKGJ1aWxkZXIuaXNQYXJ0KSBjb250aW51ZTsKICAgICAgLy8gVE9ETyhqZW5zai9haGUpOiBUaGlzIGxpbmUgY2FuIHByb2JhYmx5IGdvIGF3YXkgb25jZQogICAgICAvLyBodHRwczovL2RhcnQtcmV2aWV3Lmdvb2dsZXNvdXJjZS5jb20vNDc0NDIgbGFuZHMuCiAgICAgIGlmIChidWlsZGVyLmlzUGF0Y2gpIGNvbnRpbnVlOwogICAgICBpZiAoIXNlZW5VcmlzLmFkZChidWlsZGVyLnVyaSkpIGNvbnRpbnVlOwogICAgICByZXN1bHQuYWRkKGJ1aWxkZXIpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaW52YWxpZGF0ZShVcmkgdXJpKSB7CiAgICBpbnZhbGlkYXRlZFVyaXMuYWRkKHVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGludmFsaWRhdGVBbGxTb3VyY2VzKCkgewogICAgaWYgKHVzZXJDb2RlICE9IG51bGwpIHsKICAgICAgU2V0PFVyaT4gdXJpcyA9IG5ldyBTZXQ8VXJpPi5mcm9tKHVzZXJDb2RlLmxvYWRlci5idWlsZGVycy5rZXlzKTsKICAgICAgdXJpcy5yZW1vdmVBbGwoZGlsbExvYWRlZERhdGEubG9hZGVyLmJ1aWxkZXJzLmtleXMpOwogICAgICBpbnZhbGlkYXRlZFVyaXMuYWRkQWxsKHVyaXMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXRNb2R1bGVzVG9Mb2FkT25OZXh0Q29tcHV0ZURlbHRhKExpc3Q8Q29tcG9uZW50PiBjb21wb25lbnRzKSB7CiAgICBtb2R1bGVzVG9Mb2FkID0gY29tcG9uZW50cy50b0xpc3QoKTsKICB9CgogIC8vLyBJbnRlcm5hbCBtZXRob2QuCiAgdm9pZCByZWNvcmROb25GdWxsQ29tcG9uZW50Rm9yVGVzdGluZyhDb21wb25lbnQgY29tcG9uZW50KSB7fQoKICAvLy8gSW50ZXJuYWwgbWV0aG9kLgogIHZvaWQgcmVjb3JkSW52YWxpZGF0ZWRJbXBvcnRVcmlzRm9yVGVzdGluZyhMaXN0PFVyaT4gdXJpcykge30KCiAgLy8vIEludGVybmFsIG1ldGhvZC4KICB2b2lkIHJlY29yZFRlbXBvcmFyeUZpbGVGb3JUZXN0aW5nKFVyaSB1cmkpIHt9Cn0KCmNsYXNzIFBhY2thZ2VDaGFuZ2VkRXJyb3IgewogIGNvbnN0IFBhY2thZ2VDaGFuZ2VkRXJyb3IoKTsKfQoKY2xhc3MgSW5pdGlhbGl6ZUZyb21Db21wb25lbnRFcnJvciB7CiAgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CgogIGNvbnN0IEluaXRpYWxpemVGcm9tQ29tcG9uZW50RXJyb3IodGhpcy5tZXNzYWdlKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gbWVzc2FnZTsKfQoKY2xhc3MgSW5jcmVtZW50YWxDb21waWxlckRhdGEgewogIFByb2NlZHVyZSB1c2VyTG9hZGVkVXJpTWFpbiA9IG51bGw7CiAgQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7CiAgTGlzdDxpbnQ+IGluaXRpYWxpemF0aW9uQnl0ZXMgPSBudWxsOwp9CoPHAE5OPAEkASEBSAE0RwFCASQJDxMSFBYRGxUOExcZEBIXAT8BQgE8OAFJATMBLwEqATUBQQEwAT8BGgkjNDoyOAE4AUcBSQE2AS8BJQFHASIBMQFCIQEXARoBLQEdKSkjLSQbJkk3IQEiUQEZASU+GikmMQEkNikqMQEMIkIULEdEASBHOBxJHAhEJEYqASQdMUkyOxFKTi8STx5PPhxIAVAtFyc4MklEEi8+Q0sxSUwoSBk8PlA8ICEtRypOKEgSEA4MCiwBLjAvQC4rEykMDDcIJwE/ATYBPkpFKiojQE0qTSNFCAEjKTo3GUUoOzJBTDkMCkYoOQgBOyZFAUM1SwoIAR8+PSglCkAIIQEeQkEIAUwBKyMgJEUdERoaLQE4OUoxCggBOitBTQhEAU9PI0wqGhxFCAE7AScmJzowHAgBKD03IyoBJSFFNTQfGR0XGxowJz42JgwKDy8xIx0hGx8dIRYIAVE/AScqIAgBLDhPIisIBAEXQTk3PCsIMDMIKywIBgQBFyVQISMwJDA8NixQIgwKHUEhCggcLjAvQC4rEykMDCQfCggcBgQBFx9ES0scLyw4PC5CLRYMPAoIBgQBF0dHMjQ1PwYBNzIwMjk6PAoIBgEoNUQsQDM4Nx8IBjIEARcWSjcnR0YaOQYUBAEXJgZRNiokGSwgIyQwMDVJTi4vMB0uD0VKCAYBKh42QhIIJDklBgE3TycpNyIKIEYfH0kyDAoIBgE6Oy1FHSYjNDkhI0kIBj0BEwQBFzQyNBkqSjYGBAEXSjlOGQEgNE1BKjwqBgEYBAEXUFEsGR5CIUIpNTgBRR9JRwFDRDgzTjQzREw9LwwKASQzPCUIBhgEARc9MUEsQDM4Nx8IBgQBF0tPJjYBTiQ4PDtDIQEgQDUwLh4PCAYBGk4yBgExBAEXSCIcRAYoBAEMJxkpKyUWGSY4ATIfUQEZHz8uCAEsATk9CC4zCAFEFhgbEDkbAStMLgEoAUksAS4nTidQDAEiFEYUHxslEhISEwoBKggBMihDATcrMUcaAUxNUAErTh8BQB8BMEsBMTgBNwEYCAQBFy89KTYlNBUGAURBAU4OLwE1PEcVCCMrQhUIQhQGAUM6HRAIHzgoCC01NzEnDAoyOTsYTAExMCkMCggGATgcRQYBQgE1AUsvPyk4RwgGAUkwIis5SxIdNiYbLRMzDAoZJSYmDAohCAYBTDwoNiQ+OyUwGwYTBAEMHR4EAQwgHEg7JAYEAQxIKQQBF0ABF0ABFzECARwfAgElGAE0ASACASAmHigCATVwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvaW5jcmVtZW50YWxfY29tcGlsZXIuZGFydClzZGtyb290Oi9wa2cva2VybmVsL2xpYi90eXBlX2FsZ2VicmEuZGFydMAAbUEvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgpsaWJyYXJ5IGtlcm5lbC50eXBlX2FsZ2VicmE7CgppbXBvcnQgJ2FzdC5kYXJ0JzsKCi8vLyBSZXR1cm5zIGEgdHlwZSB3aGVyZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIGdpdmVuIHR5cGUgcGFyYW1ldGVycyBoYXZlIGJlZW4KLy8vIHJlcGxhY2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgdHlwZXMuCi8vLwovLy8gVGhpcyB3aWxsIGNvcHkgb25seSB0aGUgc3VidGVybXMgb2YgW3R5cGVdIHRoYXQgY29udGFpbiBzdWJzdGl0dXRlZAovLy8gdmFyaWFibGVzOyBhbGwgb3RoZXIgW0RhcnRUeXBlXSBvYmplY3RzIHdpbGwgYmUgcmV1c2VkLgovLy8KLy8vIEluIHBhcnRpY3VsYXIsIGlmIG5vIHZhcmlhYmxlcyB3ZXJlIHN1YnN0aXR1dGVkLCB0aGlzIGlzIGd1YXJhbnRlZWQgdG8KLy8vIHJldHVybiB0aGUgW3R5cGVdIGluc3RhbmNlIChub3QgYSBjb3B5KSwgc28gdGhlIGNhbGxlciBtYXkgdXNlIFtpZGVudGljYWxdCi8vLyB0byBlZmZpY2llbnRseSBjaGVjayBpZiBhIGRpc3RpbmN0IHR5cGUgd2FzIGNyZWF0ZWQuCkRhcnRUeXBlIHN1YnN0aXR1dGUoRGFydFR5cGUgdHlwZSwgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBzdWJzdGl0dXRpb24pIHsKICBpZiAoc3Vic3RpdHV0aW9uLmlzRW1wdHkpIHJldHVybiB0eXBlOwogIHJldHVybiBTdWJzdGl0dXRpb24uZnJvbU1hcChzdWJzdGl0dXRpb24pLnN1YnN0aXR1dGVUeXBlKHR5cGUpOwp9CgovLy8gUmV0dXJucyBhIG1hcHBpbmcgZnJvbSB0aGUgdHlwZSBwYXJhbWV0ZXJzIGRlY2xhcmVkIG9uIHRoZSBjbGFzcyBvZiBbdHlwZV0KLy8vIHRvIHRoZSBhY3R1YWwgdHlwZSBhcmd1bWVudHMgcHJvdmlkZWQgaW4gW3R5cGVdLgovLy8KLy8vIFRoaXMgY2FuIGJlIHBhc3NlZCBhcyBhcmd1bWVudCB0byBbc3Vic3RpdHV0ZV0uCk1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gZ2V0U3Vic3RpdHV0aW9uTWFwKFN1cGVydHlwZSB0eXBlKSB7CiAgcmV0dXJuIHR5cGUudHlwZUFyZ3VtZW50cy5pc0VtcHR5CiAgICAgID8gY29uc3QgPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9CiAgICAgIDogbmV3IE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4uZnJvbUl0ZXJhYmxlcygKICAgICAgICAgIHR5cGUuY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzLCB0eXBlLnR5cGVBcmd1bWVudHMpOwp9CgpNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IGdldFVwcGVyQm91bmRTdWJzdGl0dXRpb25NYXAoQ2xhc3MgaG9zdCkgewogIGlmIChob3N0LnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHJldHVybiBjb25zdCA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgdmFyIHJlc3VsdCA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICBmb3IgKHZhciBwYXJhbWV0ZXIgaW4gaG9zdC50eXBlUGFyYW1ldGVycykgewogICAgcmVzdWx0W3BhcmFtZXRlcl0gPSBjb25zdCBEeW5hbWljVHlwZSgpOwogIH0KICBmb3IgKHZhciBwYXJhbWV0ZXIgaW4gaG9zdC50eXBlUGFyYW1ldGVycykgewogICAgcmVzdWx0W3BhcmFtZXRlcl0gPSBzdWJzdGl0dXRlKHBhcmFtZXRlci5ib3VuZCwgcmVzdWx0KTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQoKLy8vIExpa2UgW3N1YnN0aXR1dGVdLCBleGNlcHQgd2hlbiBhIHR5cGUgaW4gdGhlIFtzdWJzdGl0dXRpb25dIG1hcCByZWZlcmVuY2VzCi8vLyBhbm90aGVyIHN1YnN0aXR1dGVkIHR5cGUgdmFyaWFibGUsIHRoZSBtYXBwaW5nIGZvciB0aGF0IHR5cGUgaXMgcmVjdXJzaXZlbHkKLy8vIGluc2VydGVkLgovLy8KLy8vIEZvciBleGFtcGxlIGBTZXQ8Rz5gIHN1YnN0aXR1dGVkIHdpdGggYHtUIC0+IFN0cmluZywgRyAtPiBMaXN0PFQ+fWAgcmVzdWx0cwovLy8gaW4gYFNldDxMaXN0PFN0cmluZz4+YC4KLy8vCi8vLyBSZXR1cm5zIGBudWxsYCBpZiB0aGUgc3Vic3RpdHV0aW9uIG1hcCBjb250YWlucyBhIGN5Y2xlIHJlYWNoYWJsZSBmcm9tIGEKLy8vIHR5cGUgdmFyaWFibGUgaW4gW3R5cGVdICh0aGUgcmVzdWx0aW5nIHR5cGUgd291bGQgYmUgaW5maW5pdGUpLgovLy8KLy8vIFRoZSBbc3Vic3RpdHV0aW9uXSBtYXAgd2lsbCBiZSBtdXRhdGVkIHNvIHRoYXQgdGhlIHJpZ2h0LWhhbmQgc2lkZXMgbWF5Ci8vLyBiZSByZW1hcHBlZCB0byB0aGUgZGVlcGx5IHN1YnN0aXR1dGVkIHR5cGUsIGJ1dCBvbmx5IGZvciB0aGUga2V5cyB0aGF0IGFyZQovLy8gcmVhY2hhYmxlIGZyb20gW3R5cGVdLgovLy8KLy8vIEFzIHdpdGggW3N1YnN0aXR1dGVdLCB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIHRoZSBzYW1lIGluc3RhbmNlIGlmIG5vCi8vLyBzdWJzdGl0dXRpb24gd2FzIHBlcmZvcm1lZC4KRGFydFR5cGUgc3Vic3RpdHV0ZURlZXAoCiAgICBEYXJ0VHlwZSB0eXBlLCBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbikgewogIGlmIChzdWJzdGl0dXRpb24uaXNFbXB0eSkgcmV0dXJuIHR5cGU7CiAgdmFyIHN1YnN0aXR1dG9yID0gbmV3IF9EZWVwVHlwZVN1YnN0aXR1dG9yKHN1YnN0aXR1dGlvbik7CiAgdmFyIHJlc3VsdCA9IHN1YnN0aXR1dG9yLnZpc2l0KHR5cGUpOwogIHJldHVybiBzdWJzdGl0dXRvci5pc0luZmluaXRlID8gbnVsbCA6IHJlc3VsdDsKfQoKLy8vIFJldHVybnMgdHJ1ZSBpZiBbdHlwZV0gY29udGFpbnMgYSByZWZlcmVuY2UgdG8gYW55IG9mIHRoZSBnaXZlbiBbdmFyaWFibGVzXS4KLy8vCi8vLyBJdCBpcyBhbiBlcnJvciB0byBjYWxsIHRoaXMgd2l0aCBhIFt0eXBlXSB0aGF0IGNvbnRhaW5zIGEgW0Z1bmN0aW9uVHlwZV0KLy8vIHRoYXQgZGVjbGFyZXMgb25lIG9mIHRoZSBwYXJhbWV0ZXJzIGluIFt2YXJpYWJsZXNdLgpib29sIGNvbnRhaW5zVHlwZVZhcmlhYmxlKERhcnRUeXBlIHR5cGUsIFNldDxUeXBlUGFyYW1ldGVyPiB2YXJpYWJsZXMpIHsKICBpZiAodmFyaWFibGVzLmlzRW1wdHkpIHJldHVybiBmYWxzZTsKICByZXR1cm4gbmV3IF9PY2N1cnJlbmNlVmlzaXRvcih2YXJpYWJsZXMpLnZpc2l0KHR5cGUpOwp9CgovLy8gR2l2ZW4gYSBzZXQgb2YgdHlwZSB2YXJpYWJsZXMsIGZpbmRzIGEgc3Vic3RpdHV0aW9uIG9mIHRob3NlIHZhcmlhYmxlcyBzdWNoCi8vLyB0aGF0IHRoZSB0d28gZ2l2ZW4gdHlwZXMgYmVjb21lcyBlcXVhbCwgb3IgcmV0dXJucyBgbnVsbGAgaWYgbm8gc3VjaAovLy8gc3Vic3RpdHV0aW9uIGV4aXN0cy4KLy8vCi8vLyBGb3IgZXhhbXBsZSwgdW5pZnlpbmcgYExpc3Q8VD5gIHdpdGggYExpc3Q8U3RyaW5nPmAsIHdoZXJlIGBUYCBpcyBhCi8vLyBxdWFudGlmaWVkIHZhcmlhYmxlLCB5aWVsZHMgdGhlIHN1YnN0aXR1dGlvbiBgVCA9IFN0cmluZ2AuCi8vLwovLy8gSWYgc3VjY2Vzc2Z1bCwgdGhpcyBlcXVhdGlvbiBob2xkczoKLy8vCi8vLyAgICAgc3Vic3RpdHV0ZSh0eXBlMSwgc3Vic3RpdHV0aW9uKSA9PSBzdWJzdGl0dXRlKHR5cGUyLCBzdWJzdGl0dXRpb24pCi8vLwovLy8gVGhlIHVuaWZpY2F0aW9uIGNhbiBmYWlsIGZvciB0d28gcmVhc29uczoKLy8vIC0gaW5jb21wYXRpYmxlIHR5cGVzLCBlLmcuIGBMaXN0PFQ+YCBjYW5ub3QgYmUgdW5pZmllZCB3aXRoIGBTZXQ8VD5gLgovLy8gLSBpbmZpbml0ZSB0eXBlczogZS5nLiBgVGAgY2Fubm90IGJlIHVuaWZpZWQgd2l0aCBgTGlzdDxUPmAgYmVjYXVzZSBpdAovLy8gICB3b3VsZCBjcmVhdGUgdGhlIGluZmluaXRlIHR5cGUgYExpc3Q8TGlzdDxMaXN0PC4uLj4+PmAuCk1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gdW5pZnlUeXBlcygKICAgIERhcnRUeXBlIHR5cGUxLCBEYXJ0VHlwZSB0eXBlMiwgU2V0PFR5cGVQYXJhbWV0ZXI+IHF1YW50aWZpZWRWYXJpYWJsZXMpIHsKICB2YXIgdW5pZmllciA9IG5ldyBfVHlwZVVuaWZpY2F0aW9uKHR5cGUxLCB0eXBlMiwgcXVhbnRpZmllZFZhcmlhYmxlcyk7CiAgcmV0dXJuIHVuaWZpZXIuc3VjY2VzcyA/IHVuaWZpZXIuc3Vic3RpdHV0aW9uIDogbnVsbDsKfQoKLy8vIEdlbmVyYXRlcyBhIGZyZXNoIGNvcHkgb2YgdGhlIGdpdmVuIHR5cGUgcGFyYW1ldGVycywgd2l0aCB0aGVpciBib3VuZHMKLy8vIHN1YnN0aXR1dGVkIHRvIHJlZmVyZW5jZSB0aGUgbmV3IHBhcmFtZXRlcnMuCi8vLwovLy8gVGhlIHJldHVybmVkIG9iamVjdCBjb250YWlucyB0aGUgZnJlc2ggdHlwZSBwYXJhbWV0ZXIgbGlzdCBhcyB3ZWxsIGFzIGEKLy8vIG1hcHBpbmcgdG8gYmUgdXNlZCBmb3IgcmVwbGFjaW5nIG90aGVyIHR5cGVzIHRvIHVzZSB0aGUgbmV3IHR5cGUgcGFyYW1ldGVycy4KRnJlc2hUeXBlUGFyYW1ldGVycyBnZXRGcmVzaFR5cGVQYXJhbWV0ZXJzKExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMpIHsKICB2YXIgZnJlc2hQYXJhbWV0ZXJzID0gbmV3IExpc3Q8VHlwZVBhcmFtZXRlcj4uZ2VuZXJhdGUoCiAgICAgIHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwgKGkpID0+IG5ldyBUeXBlUGFyYW1ldGVyKHR5cGVQYXJhbWV0ZXJzW2ldLm5hbWUpLAogICAgICBncm93YWJsZTogdHJ1ZSk7CiAgdmFyIG1hcCA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICBtYXBbdHlwZVBhcmFtZXRlcnNbaV1dID0gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlKGZyZXNoUGFyYW1ldGVyc1tpXSk7CiAgfQogIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKICAgIGZyZXNoUGFyYW1ldGVyc1tpXS5ib3VuZCA9IHN1YnN0aXR1dGUodHlwZVBhcmFtZXRlcnNbaV0uYm91bmQsIG1hcCk7CiAgICBmcmVzaFBhcmFtZXRlcnNbaV0uZGVmYXVsdFR5cGUgPSB0eXBlUGFyYW1ldGVyc1tpXS5kZWZhdWx0VHlwZSAhPSBudWxsCiAgICAgICAgPyBzdWJzdGl0dXRlKHR5cGVQYXJhbWV0ZXJzW2ldLmRlZmF1bHRUeXBlLCBtYXApCiAgICAgICAgOiBudWxsOwogIH0KICByZXR1cm4gbmV3IEZyZXNoVHlwZVBhcmFtZXRlcnMoZnJlc2hQYXJhbWV0ZXJzLCBTdWJzdGl0dXRpb24uZnJvbU1hcChtYXApKTsKfQoKY2xhc3MgRnJlc2hUeXBlUGFyYW1ldGVycyB7CiAgZmluYWwgTGlzdDxUeXBlUGFyYW1ldGVyPiBmcmVzaFR5cGVQYXJhbWV0ZXJzOwogIGZpbmFsIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb247CgogIEZyZXNoVHlwZVBhcmFtZXRlcnModGhpcy5mcmVzaFR5cGVQYXJhbWV0ZXJzLCB0aGlzLnN1YnN0aXR1dGlvbik7CgogIEZ1bmN0aW9uVHlwZSBhcHBseVRvRnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSB0eXBlKSA9PiBuZXcgRnVuY3Rpb25UeXBlKAogICAgICB0eXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLm1hcChzdWJzdGl0dXRlKS50b0xpc3QoKSwKICAgICAgc3Vic3RpdHV0ZSh0eXBlLnJldHVyblR5cGUpLAogICAgICBuYW1lZFBhcmFtZXRlcnM6IHR5cGUubmFtZWRQYXJhbWV0ZXJzLm1hcChzdWJzdGl0dXRlTmFtZWQpLnRvTGlzdCgpLAogICAgICB0eXBlUGFyYW1ldGVyczogZnJlc2hUeXBlUGFyYW1ldGVycywKICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogdHlwZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICB0eXBlZGVmVHlwZToKICAgICAgICAgIHR5cGUudHlwZWRlZlR5cGUgPT0gbnVsbCA/IG51bGwgOiBzdWJzdGl0dXRlKHR5cGUudHlwZWRlZlR5cGUpKTsKCiAgRGFydFR5cGUgc3Vic3RpdHV0ZShEYXJ0VHlwZSB0eXBlKSA9PiBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUodHlwZSk7CgogIE5hbWVkVHlwZSBzdWJzdGl0dXRlTmFtZWQoTmFtZWRUeXBlIHR5cGUpID0+CiAgICAgIG5ldyBOYW1lZFR5cGUodHlwZS5uYW1lLCBzdWJzdGl0dXRlKHR5cGUudHlwZSkpOwoKICBTdXBlcnR5cGUgc3Vic3RpdHV0ZVN1cGVyKFN1cGVydHlwZSB0eXBlKSB7CiAgICByZXR1cm4gc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVTdXBlcnR5cGUodHlwZSk7CiAgfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTVBMRU1FTlRBVElPTgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmFic3RyYWN0IGNsYXNzIFN1YnN0aXR1dGlvbiB7CiAgY29uc3QgU3Vic3RpdHV0aW9uKCk7CgogIHN0YXRpYyBjb25zdCBTdWJzdGl0dXRpb24gZW1wdHkgPSBfTnVsbFN1YnN0aXR1dGlvbi5pbnN0YW5jZTsKCiAgLy8vIFN1YnN0aXR1dGVzIGVhY2ggcGFyYW1ldGVyIHRvIHRoZSB0eXBlIGl0IG1hcHMgdG8gaW4gW21hcF0uCiAgc3RhdGljIFN1YnN0aXR1dGlvbiBmcm9tTWFwKE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gbWFwKSB7CiAgICBpZiAobWFwLmlzRW1wdHkpIHJldHVybiBfTnVsbFN1YnN0aXR1dGlvbi5pbnN0YW5jZTsKICAgIHJldHVybiBuZXcgX01hcFN1YnN0aXR1dGlvbihtYXAsIG1hcCk7CiAgfQoKICBzdGF0aWMgU3Vic3RpdHV0aW9uIGZpbHRlcmVkKFN1YnN0aXR1dGlvbiBzdWIsIFR5cGVQYXJhbWV0ZXJGaWx0ZXIgZmlsdGVyKSB7CiAgICByZXR1cm4gbmV3IF9GaWx0ZXJlZFN1YnN0aXR1dGlvbihzdWIsIGZpbHRlcik7CiAgfQoKICAvLy8gU3Vic3RpdHV0ZXMgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBnaXZlbiB0eXBlIHBhcmFtZXRlcnMgd2l0aCB0aGUKICAvLy8gY29ycmVzcG9uZGluZyB1cHBlciBvciBsb3dlciBib3VuZCwgZGVwZW5kaW5nIG9uIHRoZSB2YXJpYW5jZSBvZiB0aGUKICAvLy8gY29udGV4dCB3aGVyZSBpdCBvY2N1cnMuCiAgLy8vCiAgLy8vIEZvciBleGFtcGxlIHRoZSB0eXBlIGAoVCkgPT4gVGAgd2l0aCB0aGUgYm91bmRzIGBib3R0b20gPDogVCA8OiBudW1gCiAgLy8vIGJlY29tZXMgYChib3R0b20pID0+IG51bWAgKGluIHRoaXMgZXhhbXBsZSwgYG51bWAgaXMgdGhlIHVwcGVyIGJvdW5kLAogIC8vLyBhbmQgYGJvdHRvbWAgaXMgdGhlIGxvd2VyIGJvdW5kKS4KICAvLy8KICAvLy8gVGhpcyBpcyBhIHdheSB0byBvYnRhaW4gYW4gdXBwZXIgYm91bmQgZm9yIGEgdHlwZSB3aGlsZSBlbGltaW5hdGluZyBhbGwKICAvLy8gcmVmZXJlbmNlcyB0byBjZXJ0YWluIHR5cGUgdmFyaWFibGVzLgogIHN0YXRpYyBTdWJzdGl0dXRpb24gZnJvbVVwcGVyQW5kTG93ZXJCb3VuZHMoCiAgICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gdXBwZXIsIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gbG93ZXIpIHsKICAgIGlmICh1cHBlci5pc0VtcHR5ICYmIGxvd2VyLmlzRW1wdHkpIHJldHVybiBfTnVsbFN1YnN0aXR1dGlvbi5pbnN0YW5jZTsKICAgIHJldHVybiBuZXcgX01hcFN1YnN0aXR1dGlvbih1cHBlciwgbG93ZXIpOwogIH0KCiAgLy8vIFN1YnN0aXR1dGVzIHRoZSB0eXBlIHBhcmFtZXRlcnMgb24gdGhlIGNsYXNzIG9mIFtzdXBlcnR5cGVdIHdpdGggdGhlCiAgLy8vIHR5cGUgYXJndW1lbnRzIHByb3ZpZGVkIGluIFtzdXBlcnR5cGVdLgogIHN0YXRpYyBTdWJzdGl0dXRpb24gZnJvbVN1cGVydHlwZShTdXBlcnR5cGUgc3VwZXJ0eXBlKSB7CiAgICBpZiAoc3VwZXJ0eXBlLnR5cGVBcmd1bWVudHMuaXNFbXB0eSkgcmV0dXJuIF9OdWxsU3Vic3RpdHV0aW9uLmluc3RhbmNlOwogICAgcmV0dXJuIGZyb21NYXAobmV3IE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4uZnJvbUl0ZXJhYmxlcygKICAgICAgICBzdXBlcnR5cGUuY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzLCBzdXBlcnR5cGUudHlwZUFyZ3VtZW50cykpOwogIH0KCiAgLy8vIFN1YnN0aXR1dGVzIHRoZSB0eXBlIHBhcmFtZXRlcnMgb24gdGhlIGNsYXNzIG9mIFt0eXBlXSB3aXRoIHRoZQogIC8vLyB0eXBlIGFyZ3VtZW50cyBwcm92aWRlZCBpbiBbdHlwZV0uCiAgc3RhdGljIFN1YnN0aXR1dGlvbiBmcm9tSW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlLnR5cGVBcmd1bWVudHMuaXNFbXB0eSkgcmV0dXJuIF9OdWxsU3Vic3RpdHV0aW9uLmluc3RhbmNlOwogICAgcmV0dXJuIGZyb21NYXAobmV3IE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4uZnJvbUl0ZXJhYmxlcygKICAgICAgICB0eXBlLmNsYXNzTm9kZS50eXBlUGFyYW1ldGVycywgdHlwZS50eXBlQXJndW1lbnRzKSk7CiAgfQoKICAvLy8gU3Vic3RpdHV0ZXMgdGhlIHR5cGUgcGFyYW1ldGVycyBvbiB0aGUgdHlwZWRlZiBvZiBbdHlwZV0gd2l0aCB0aGUKICAvLy8gdHlwZSBhcmd1bWVudHMgcHJvdmlkZWQgaW4gW3R5cGVdLgogIHN0YXRpYyBTdWJzdGl0dXRpb24gZnJvbVR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlLnR5cGVBcmd1bWVudHMuaXNFbXB0eSkgcmV0dXJuIF9OdWxsU3Vic3RpdHV0aW9uLmluc3RhbmNlOwogICAgcmV0dXJuIGZyb21NYXAobmV3IE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4uZnJvbUl0ZXJhYmxlcygKICAgICAgICB0eXBlLnR5cGVkZWZOb2RlLnR5cGVQYXJhbWV0ZXJzLCB0eXBlLnR5cGVBcmd1bWVudHMpKTsKICB9CgogIC8vLyBTdWJzdGl0dXRlcyB0aGUgTnRoIHBhcmFtZXRlciBpbiBbcGFyYW1ldGVyc10gd2l0aCB0aGUgTnRoIHR5cGUgaW4KICAvLy8gW3R5cGVzXS4KICBzdGF0aWMgU3Vic3RpdHV0aW9uIGZyb21QYWlycygKICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiBwYXJhbWV0ZXJzLCBMaXN0PERhcnRUeXBlPiB0eXBlcykgewogICAgLy8gVE9ETyhhc2dlcmYpOiBJbnZlc3RpZ2F0ZSBpZiBpdCBpcyBtb3JlIGVmZmljaWVudCB0byBpbXBsZW1lbnQKICAgIC8vIHN1YnN0aXR1dGlvbiBiYXNlZCBvbiBwYXJhbGxlbCBwYWlyd2lzZSBsaXN0cyBpbnN0ZWFkIG9mIE1hcHMuCiAgICBhc3NlcnQocGFyYW1ldGVycy5sZW5ndGggPT0gdHlwZXMubGVuZ3RoKTsKICAgIGlmIChwYXJhbWV0ZXJzLmlzRW1wdHkpIHJldHVybiBfTnVsbFN1YnN0aXR1dGlvbi5pbnN0YW5jZTsKICAgIHJldHVybiBmcm9tTWFwKAogICAgICAgIG5ldyBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+LmZyb21JdGVyYWJsZXMocGFyYW1ldGVycywgdHlwZXMpKTsKICB9CgogIC8vLyBTdWJzdGl0dXRlcyB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9uIHRoZSBjbGFzcyB3aXRoIGJvdHRvbSBvciBkeW5hbWljLAogIC8vLyBkZXBlbmRpbmcgb24gdGhlIGNvdmFyaWFuY2Ugb2YgaXRzIHVzZS4KICBzdGF0aWMgU3Vic3RpdHV0aW9uIGJvdHRvbUZvckNsYXNzKENsYXNzIGNsYXNzXykgewogICAgaWYgKGNsYXNzXy50eXBlUGFyYW1ldGVycy5pc0VtcHR5KSByZXR1cm4gX051bGxTdWJzdGl0dXRpb24uaW5zdGFuY2U7CiAgICByZXR1cm4gbmV3IF9DbGFzc0JvdHRvbVN1YnN0aXR1dGlvbihjbGFzc18pOwogIH0KCiAgLy8vIFN1YnN0aXR1dGVzIGNvdmFyaWFudCB1c2VzIG9mIFtjbGFzc19dJ3MgdHlwZSBwYXJhbWV0ZXJzIHdpdGggdGhlIHVwcGVyCiAgLy8vIGJvdW5kIG9mIHRoYXQgdHlwZSBwYXJhbWV0ZXIuICBSZWN1cnNpdmUgcmVmZXJlbmNlcyBpbiB0aGUgYm91bmQgaGF2ZQogIC8vLyBiZWVuIHJlcGxhY2VkIGJ5IGR5bmFtaWMuCiAgc3RhdGljIFN1YnN0aXR1dGlvbiB1cHBlckJvdW5kRm9yQ2xhc3MoQ2xhc3MgY2xhc3NfKSB7CiAgICBpZiAoY2xhc3NfLnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHJldHVybiBfTnVsbFN1YnN0aXR1dGlvbi5pbnN0YW5jZTsKICAgIHZhciB1cHBlciA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgIGZvciAodmFyIHBhcmFtZXRlciBpbiBjbGFzc18udHlwZVBhcmFtZXRlcnMpIHsKICAgICAgdXBwZXJbcGFyYW1ldGVyXSA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICB9CiAgICBmb3IgKHZhciBwYXJhbWV0ZXIgaW4gY2xhc3NfLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgIHVwcGVyW3BhcmFtZXRlcl0gPSBzdWJzdGl0dXRlKHBhcmFtZXRlci5ib3VuZCwgdXBwZXIpOwogICAgfQogICAgcmV0dXJuIGZyb21VcHBlckFuZExvd2VyQm91bmRzKHVwcGVyLCB7fSk7CiAgfQoKICAvLy8gU3Vic3RpdHV0ZXMgYm90aCB2YXJpYWJsZXMgZnJvbSBbZmlyc3RdIGFuZCBbc2Vjb25kXSwgZmF2b3JpbmcgdGhvc2UgZnJvbQogIC8vLyBbZmlyc3RdIGlmIHRoZXkgb3ZlcmxhcC4KICAvLy8KICAvLy8gTmVpdGhlciBzdWJzdGl0dXRpb24gaXMgYXBwbGllZCB0byB0aGUgcmVzdWx0cyBvZiB0aGUgb3RoZXIsIHNvIHRoaXMgZG9lcwogIC8vLyAqbm90KiBjb3JyZXNwb25kIHRvIGEgc2VxdWVuY2Ugb2YgdHdvIHN1YnNpdHV0aW9ucy4gRm9yIGV4YW1wbGUsIGNvbWJpbmluZwogIC8vLyBge1QgLT4gTGlzdDxHPn1gIHdpdGggYHtHIC0+IFN0cmluZ31gIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8KICAvLy8gYHtUIC0+IExpc3Q8U3RyaW5nPn1gIGJlY2F1c2UgdGhlIHJlc3VsdCBmcm9tIHN1YnN0aXR1dGluZyBgVGAgaXMgbm90CiAgLy8vIHNlYXJjaGVkIGZvciBvY2N1cmVuY2VzIG9mIGBHYC4KICBzdGF0aWMgU3Vic3RpdHV0aW9uIGNvbWJpbmUoU3Vic3RpdHV0aW9uIGZpcnN0LCBTdWJzdGl0dXRpb24gc2Vjb25kKSB7CiAgICBpZiAoZmlyc3QgPT0gX051bGxTdWJzdGl0dXRpb24uaW5zdGFuY2UpIHJldHVybiBzZWNvbmQ7CiAgICBpZiAoc2Vjb25kID09IF9OdWxsU3Vic3RpdHV0aW9uLmluc3RhbmNlKSByZXR1cm4gZmlyc3Q7CiAgICByZXR1cm4gbmV3IF9Db21iaW5lZFN1YnN0aXR1dGlvbihmaXJzdCwgc2Vjb25kKTsKICB9CgogIERhcnRUeXBlIGdldFN1YnN0aXR1dGUoVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIsIGJvb2wgdXBwZXJCb3VuZCk7CgogIERhcnRUeXBlIHN1YnN0aXR1dGVUeXBlKERhcnRUeXBlIG5vZGUsIHtib29sIGNvbnRyYXZhcmlhbnQ6IGZhbHNlfSkgewogICAgcmV0dXJuIG5ldyBfVG9wU3Vic3RpdHV0b3IodGhpcywgY29udHJhdmFyaWFudCkudmlzaXQobm9kZSk7CiAgfQoKICBTdXBlcnR5cGUgc3Vic3RpdHV0ZVN1cGVydHlwZShTdXBlcnR5cGUgbm9kZSkgewogICAgcmV0dXJuIG5ldyBfVG9wU3Vic3RpdHV0b3IodGhpcywgZmFsc2UpLnZpc2l0U3VwZXJ0eXBlKG5vZGUpOwogIH0KfQoKY2xhc3MgX051bGxTdWJzdGl0dXRpb24gZXh0ZW5kcyBTdWJzdGl0dXRpb24gewogIHN0YXRpYyBjb25zdCBfTnVsbFN1YnN0aXR1dGlvbiBpbnN0YW5jZSA9IGNvbnN0IF9OdWxsU3Vic3RpdHV0aW9uKCk7CgogIGNvbnN0IF9OdWxsU3Vic3RpdHV0aW9uKCk7CgogIERhcnRUeXBlIGdldFN1YnN0aXR1dGUoVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIsIGJvb2wgdXBwZXJCb3VuZCkgewogICAgcmV0dXJuIG5ldyBUeXBlUGFyYW1ldGVyVHlwZShwYXJhbWV0ZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgc3Vic3RpdHV0ZVR5cGUoRGFydFR5cGUgbm9kZSwge2Jvb2wgY29udHJhdmFyaWFudDogZmFsc2V9KSA9PiBub2RlOwoKICBAb3ZlcnJpZGUKICBTdXBlcnR5cGUgc3Vic3RpdHV0ZVN1cGVydHlwZShTdXBlcnR5cGUgbm9kZSkgPT4gbm9kZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIlN1YnN0aXR1dGlvbi5lbXB0eSI7Cn0KCmNsYXNzIF9NYXBTdWJzdGl0dXRpb24gZXh0ZW5kcyBTdWJzdGl0dXRpb24gewogIGZpbmFsIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gdXBwZXI7CiAgZmluYWwgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBsb3dlcjsKCiAgX01hcFN1YnN0aXR1dGlvbih0aGlzLnVwcGVyLCB0aGlzLmxvd2VyKTsKCiAgRGFydFR5cGUgZ2V0U3Vic3RpdHV0ZShUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgYm9vbCB1cHBlckJvdW5kKSB7CiAgICByZXR1cm4gdXBwZXJCb3VuZCA/IHVwcGVyW3BhcmFtZXRlcl0gOiBsb3dlcltwYXJhbWV0ZXJdOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIl9NYXBTdWJzdGl0dXRpb24oJHVwcGVyLCAkbG93ZXIpIjsKfQoKY2xhc3MgX1RvcFN1YnN0aXR1dG9yIGV4dGVuZHMgX1R5cGVTdWJzdGl0dXRvciB7CiAgZmluYWwgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbjsKCiAgX1RvcFN1YnN0aXR1dG9yKHRoaXMuc3Vic3RpdHV0aW9uLCBib29sIGNvbnRyYXZhcmlhbnQpIDogc3VwZXIobnVsbCkgewogICAgaWYgKGNvbnRyYXZhcmlhbnQpIHsKICAgICAgaW52ZXJ0VmFyaWFuY2UoKTsKICAgIH0KICB9CgogIERhcnRUeXBlIGxvb2t1cChUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgYm9vbCB1cHBlckJvdW5kKSB7CiAgICByZXR1cm4gc3Vic3RpdHV0aW9uLmdldFN1YnN0aXR1dGUocGFyYW1ldGVyLCB1cHBlckJvdW5kKTsKICB9CgogIFR5cGVQYXJhbWV0ZXIgZnJlc2hUeXBlUGFyYW1ldGVyKFR5cGVQYXJhbWV0ZXIgbm9kZSkgewogICAgdGhyb3cgJ0NyZWF0ZSBhIGZyZXNoIGVudmlyb25tZW50IGZpcnN0JzsKICB9Cn0KCmNsYXNzIF9DbGFzc0JvdHRvbVN1YnN0aXR1dGlvbiBleHRlbmRzIFN1YnN0aXR1dGlvbiB7CiAgZmluYWwgQ2xhc3MgY2xhc3NfOwoKICBfQ2xhc3NCb3R0b21TdWJzdGl0dXRpb24odGhpcy5jbGFzc18pOwoKICBEYXJ0VHlwZSBnZXRTdWJzdGl0dXRlKFR5cGVQYXJhbWV0ZXIgcGFyYW1ldGVyLCBib29sIHVwcGVyQm91bmQpIHsKICAgIGlmIChwYXJhbWV0ZXIucGFyZW50ID09IGNsYXNzXykgewogICAgICByZXR1cm4gdXBwZXJCb3VuZCA/IGNvbnN0IEJvdHRvbVR5cGUoKSA6IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCmNsYXNzIF9Db21iaW5lZFN1YnN0aXR1dGlvbiBleHRlbmRzIFN1YnN0aXR1dGlvbiB7CiAgZmluYWwgU3Vic3RpdHV0aW9uIGZpcnN0LCBzZWNvbmQ7CgogIF9Db21iaW5lZFN1YnN0aXR1dGlvbih0aGlzLmZpcnN0LCB0aGlzLnNlY29uZCk7CgogIERhcnRUeXBlIGdldFN1YnN0aXR1dGUoVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIsIGJvb2wgdXBwZXJCb3VuZCkgewogICAgcmV0dXJuIGZpcnN0LmdldFN1YnN0aXR1dGUocGFyYW1ldGVyLCB1cHBlckJvdW5kKSA/PwogICAgICAgIHNlY29uZC5nZXRTdWJzdGl0dXRlKHBhcmFtZXRlciwgdXBwZXJCb3VuZCk7CiAgfQp9Cgp0eXBlZGVmIGJvb2wgVHlwZVBhcmFtZXRlckZpbHRlcihUeXBlUGFyYW1ldGVyIFApOwoKY2xhc3MgX0ZpbHRlcmVkU3Vic3RpdHV0aW9uIGV4dGVuZHMgU3Vic3RpdHV0aW9uIHsKICBmaW5hbCBTdWJzdGl0dXRpb24gYmFzZTsKICBmaW5hbCBUeXBlUGFyYW1ldGVyRmlsdGVyIGZpbHRlckZuOwoKICBfRmlsdGVyZWRTdWJzdGl0dXRpb24odGhpcy5iYXNlLCB0aGlzLmZpbHRlckZuKTsKCiAgRGFydFR5cGUgZ2V0U3Vic3RpdHV0ZShUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgYm9vbCB1cHBlckJvdW5kKSB7CiAgICByZXR1cm4gZmlsdGVyRm4ocGFyYW1ldGVyKQogICAgICAgID8gYmFzZS5nZXRTdWJzdGl0dXRlKHBhcmFtZXRlciwgdXBwZXJCb3VuZCkKICAgICAgICA6IF9OdWxsU3Vic3RpdHV0aW9uLmluc3RhbmNlLmdldFN1YnN0aXR1dGUocGFyYW1ldGVyLCB1cHBlckJvdW5kKTsKICB9Cn0KCmNsYXNzIF9Jbm5lclR5cGVTdWJzdGl0dXRvciBleHRlbmRzIF9UeXBlU3Vic3RpdHV0b3IgewogIGZpbmFsIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gc3Vic3RpdHV0aW9uID0gPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwoKICBfSW5uZXJUeXBlU3Vic3RpdHV0b3IoX1R5cGVTdWJzdGl0dXRvciBvdXRlcikgOiBzdXBlcihvdXRlcik7CgogIERhcnRUeXBlIGxvb2t1cChUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgYm9vbCB1cHBlckJvdW5kKSB7CiAgICByZXR1cm4gc3Vic3RpdHV0aW9uW3BhcmFtZXRlcl07CiAgfQoKICBUeXBlUGFyYW1ldGVyIGZyZXNoVHlwZVBhcmFtZXRlcihUeXBlUGFyYW1ldGVyIG5vZGUpIHsKICAgIHZhciBmcmVzaCA9IG5ldyBUeXBlUGFyYW1ldGVyKG5vZGUubmFtZSk7CiAgICBzdWJzdGl0dXRpb25bbm9kZV0gPSBuZXcgVHlwZVBhcmFtZXRlclR5cGUoZnJlc2gpOwogICAgZnJlc2guYm91bmQgPSB2aXNpdChub2RlLmJvdW5kKTsKICAgIGlmIChub2RlLmRlZmF1bHRUeXBlICE9IG51bGwpIHsKICAgICAgZnJlc2guZGVmYXVsdFR5cGUgPSB2aXNpdChub2RlLmRlZmF1bHRUeXBlKTsKICAgIH0KICAgIHJldHVybiBmcmVzaDsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIF9UeXBlU3Vic3RpdHV0b3IgZXh0ZW5kcyBEYXJ0VHlwZVZpc2l0b3I8RGFydFR5cGU+IHsKICBmaW5hbCBfVHlwZVN1YnN0aXR1dG9yIG91dGVyOwogIGJvb2wgY292YXJpYW50Q29udGV4dCA9IHRydWU7CgogIF9UeXBlU3Vic3RpdHV0b3IodGhpcy5vdXRlcikgewogICAgY292YXJpYW50Q29udGV4dCA9IG91dGVyID09IG51bGwgPyB0cnVlIDogb3V0ZXIuY292YXJpYW50Q29udGV4dDsKICB9CgogIERhcnRUeXBlIGxvb2t1cChUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgYm9vbCB1cHBlckJvdW5kKTsKCiAgLy8vIFRoZSBudW1iZXIgb2YgdGltZXMgYSB2YXJpYWJsZSBmcm9tIHRoaXMgZW52aXJvbm1lbnQgaGFzIGJlZW4gdXNlZCBpbgogIC8vLyBhIHN1YnN0aXR1dGlvbi4KICAvLy8KICAvLy8gVGhlcmUgaXMgYSBzdHJpY3QgcmVxdWlyZW1lbnQgdGhhdCB3ZSBtdXN0IHJldHVybiB0aGUgc2FtZSBpbnN0YW5jZSBmb3IKICAvLy8gdHlwZXMgdGhhdCB3ZXJlIG5vdCBhbHRlcmVkIGJ5IHRoZSBzdWJzdGl0dXRpb24uICBUaGlzIGNvdW50ZXIgbGV0cyB1cwogIC8vLyBjaGVjayBxdWlja2x5IGlmIGFueXRoaW5nIGhhcHBlbmVkIGluIGEgc3Vic3RpdHV0aW9uLgogIGludCB1c2VDb3VudGVyID0gMDsKCiAgX0lubmVyVHlwZVN1YnN0aXR1dG9yIG5ld0lubmVyRW52aXJvbm1lbnQoKSB7CiAgICByZXR1cm4gbmV3IF9Jbm5lclR5cGVTdWJzdGl0dXRvcih0aGlzKTsKICB9CgogIHZvaWQgaW52ZXJ0VmFyaWFuY2UoKSB7CiAgICBjb3ZhcmlhbnRDb250ZXh0ID0gIWNvdmFyaWFudENvbnRleHQ7CiAgfQoKICBTdXBlcnR5cGUgdmlzaXRTdXBlcnR5cGUoU3VwZXJ0eXBlIG5vZGUpIHsKICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMuaXNFbXB0eSkgcmV0dXJuIG5vZGU7CiAgICBpbnQgYmVmb3JlID0gdXNlQ291bnRlcjsKICAgIHZhciB0eXBlQXJndW1lbnRzID0gbm9kZS50eXBlQXJndW1lbnRzLm1hcCh2aXNpdCkudG9MaXN0KCk7CiAgICBpZiAodXNlQ291bnRlciA9PSBiZWZvcmUpIHJldHVybiBub2RlOwogICAgcmV0dXJuIG5ldyBTdXBlcnR5cGUobm9kZS5jbGFzc05vZGUsIHR5cGVBcmd1bWVudHMpOwogIH0KCiAgTmFtZWRUeXBlIHZpc2l0TmFtZWRUeXBlKE5hbWVkVHlwZSBub2RlKSB7CiAgICBpbnQgYmVmb3JlID0gdXNlQ291bnRlcjsKICAgIHZhciB0eXBlID0gdmlzaXQobm9kZS50eXBlKTsKICAgIGlmICh1c2VDb3VudGVyID09IGJlZm9yZSkgcmV0dXJuIG5vZGU7CiAgICByZXR1cm4gbmV3IE5hbWVkVHlwZShub2RlLm5hbWUsIHR5cGUpOwogIH0KCiAgRGFydFR5cGUgdmlzaXQoRGFydFR5cGUgbm9kZSkgPT4gbm9kZS5hY2NlcHQodGhpcyk7CgogIERhcnRUeXBlIHZpc2l0SW52YWxpZFR5cGUoSW52YWxpZFR5cGUgbm9kZSkgPT4gbm9kZTsKICBEYXJ0VHlwZSB2aXNpdER5bmFtaWNUeXBlKER5bmFtaWNUeXBlIG5vZGUpID0+IG5vZGU7CiAgRGFydFR5cGUgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSBub2RlKSA9PiBub2RlOwogIERhcnRUeXBlIHZpc2l0Qm90dG9tVHlwZShCb3R0b21UeXBlIG5vZGUpID0+IG5vZGU7CgogIERhcnRUeXBlIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIG5vZGUpIHsKICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMuaXNFbXB0eSkgcmV0dXJuIG5vZGU7CiAgICBpbnQgYmVmb3JlID0gdXNlQ291bnRlcjsKICAgIHZhciB0eXBlQXJndW1lbnRzID0gbm9kZS50eXBlQXJndW1lbnRzLm1hcCh2aXNpdCkudG9MaXN0KCk7CiAgICBpZiAodXNlQ291bnRlciA9PSBiZWZvcmUpIHJldHVybiBub2RlOwogICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlKG5vZGUuY2xhc3NOb2RlLCB0eXBlQXJndW1lbnRzKTsKICB9CgogIERhcnRUeXBlIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSkgewogICAgaWYgKG5vZGUudHlwZUFyZ3VtZW50cy5pc0VtcHR5KSByZXR1cm4gbm9kZTsKICAgIGludCBiZWZvcmUgPSB1c2VDb3VudGVyOwogICAgdmFyIHR5cGVBcmd1bWVudHMgPSBub2RlLnR5cGVBcmd1bWVudHMubWFwKHZpc2l0KS50b0xpc3QoKTsKICAgIGlmICh1c2VDb3VudGVyID09IGJlZm9yZSkgcmV0dXJuIG5vZGU7CiAgICByZXR1cm4gbmV3IFR5cGVkZWZUeXBlKG5vZGUudHlwZWRlZk5vZGUsIHR5cGVBcmd1bWVudHMpOwogIH0KCiAgTGlzdDxUeXBlUGFyYW1ldGVyPiBmcmVzaFR5cGVQYXJhbWV0ZXJzKExpc3Q8VHlwZVBhcmFtZXRlcj4gcGFyYW1ldGVycykgewogICAgaWYgKHBhcmFtZXRlcnMuaXNFbXB0eSkgcmV0dXJuIGNvbnN0IDxUeXBlUGFyYW1ldGVyPltdOwogICAgcmV0dXJuIHBhcmFtZXRlcnMubWFwKGZyZXNoVHlwZVBhcmFtZXRlcikudG9MaXN0KCk7CiAgfQoKICBUeXBlUGFyYW1ldGVyIGZyZXNoVHlwZVBhcmFtZXRlcihUeXBlUGFyYW1ldGVyIG5vZGUpOwoKICBEYXJ0VHlwZSB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSkgewogICAgLy8gVGhpcyBpcyBhIGJpdCB0cmlja3kgYmVjYXVzZSB3ZSBoYXZlIHRvIGdlbmVyYXRlIGZyZXNoIHR5cGUgcGFyYW1ldGVycwogICAgLy8gaW4gb3JkZXIgdG8gY2hhbmdlIHRoZSBib3VuZHMuICBBdCB0aGUgc2FtZSB0aW1lLCBpZiB0aGUgZnVuY3Rpb24gdHlwZQogICAgLy8gd2FzIHVuYWx0ZXJlZCwgd2UgaGF2ZSB0byByZXR1cm4gdGhlIFtub2RlXSBvYmplY3QgKG5vdCBhIGNvcHkhKS4KICAgIC8vIFN1YnN0aXR1dGluZyBhIHR5cGUgZm9yIGEgZnJlc2ggdHlwZSB2YXJpYWJsZSBzaG91bGQgbm90IGJlIGNvbmZ1c2VkIHdpdGgKICAgIC8vIGEgInJlYWwiIHN1YnN0aXR1dGlvbi4KICAgIC8vCiAgICAvLyBDcmVhdGUgYW4gaW5uZXIgZW52aXJvbm1lbnQgdG8gZ2VuZXJhdGUgZnJlc2ggdHlwZSBwYXJhbWV0ZXJzLiAgVGhlIHVzZQogICAgLy8gY291bnRlciBvbiB0aGUgaW5uZXIgZW52aXJvbm1lbnQgdGVsbHMgaWYgdGhlIGZyZXNoIHR5cGUgcGFyYW1ldGVycyBoYXZlCiAgICAvLyBhbnkgdXNlcywgYnV0IGRvZXMgbm90IHRlbGwgaWYgdGhlIHJlc3VsdGluZyBmdW5jdGlvbiB0eXBlIGlzIGRpc3RpbmN0LgogICAgLy8gT3VyIG93biB1c2UgY291bnRlciB3aWxsIGdldCBpbmNyZW1lbnRlZCBpZiBzb21ldGhpbmcgZnJvbSBvdXIKICAgIC8vIGVudmlyb25tZW50IGhhcyBiZWVuIHVzZWQgaW5zaWRlIHRoZSBmdW5jdGlvbi4KICAgIHZhciBpbm5lciA9IG5vZGUudHlwZVBhcmFtZXRlcnMuaXNFbXB0eSA/IHRoaXMgOiBuZXdJbm5lckVudmlyb25tZW50KCk7CiAgICBpbnQgYmVmb3JlID0gdGhpcy51c2VDb3VudGVyOwogICAgLy8gSW52ZXJ0IHRoZSB2YXJpYW5jZSB3aGVuIHRyYW5zbGF0aW5nIHBhcmFtZXRlcnMuCiAgICBpbm5lci5pbnZlcnRWYXJpYW5jZSgpOwogICAgdmFyIHR5cGVQYXJhbWV0ZXJzID0gaW5uZXIuZnJlc2hUeXBlUGFyYW1ldGVycyhub2RlLnR5cGVQYXJhbWV0ZXJzKTsKICAgIHZhciBwb3NpdGlvbmFsUGFyYW1ldGVycyA9IG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMuaXNFbXB0eQogICAgICAgID8gY29uc3QgPERhcnRUeXBlPltdCiAgICAgICAgOiBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLm1hcChpbm5lci52aXNpdCkudG9MaXN0KCk7CiAgICB2YXIgbmFtZWRQYXJhbWV0ZXJzID0gbm9kZS5uYW1lZFBhcmFtZXRlcnMuaXNFbXB0eQogICAgICAgID8gY29uc3QgPE5hbWVkVHlwZT5bXQogICAgICAgIDogbm9kZS5uYW1lZFBhcmFtZXRlcnMubWFwKGlubmVyLnZpc2l0TmFtZWRUeXBlKS50b0xpc3QoKTsKICAgIGlubmVyLmludmVydFZhcmlhbmNlKCk7CiAgICB2YXIgcmV0dXJuVHlwZSA9IGlubmVyLnZpc2l0KG5vZGUucmV0dXJuVHlwZSk7CiAgICBEYXJ0VHlwZSB0eXBlZGVmVHlwZSA9CiAgICAgICAgbm9kZS50eXBlZGVmVHlwZSA9PSBudWxsID8gbnVsbCA6IGlubmVyLnZpc2l0KG5vZGUudHlwZWRlZlR5cGUpOwogICAgaWYgKHRoaXMudXNlQ291bnRlciA9PSBiZWZvcmUpIHJldHVybiBub2RlOwogICAgcmV0dXJuIG5ldyBGdW5jdGlvblR5cGUocG9zaXRpb25hbFBhcmFtZXRlcnMsIHJldHVyblR5cGUsCiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzOiBuYW1lZFBhcmFtZXRlcnMsCiAgICAgICAgdHlwZVBhcmFtZXRlcnM6IHR5cGVQYXJhbWV0ZXJzLAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwKICAgICAgICB0eXBlZGVmVHlwZTogdHlwZWRlZlR5cGUpOwogIH0KCiAgdm9pZCBidW1wQ291bnRlcnNVbnRpbChfVHlwZVN1YnN0aXR1dG9yIHRhcmdldCkgewogICAgdmFyIG5vZGUgPSB0aGlzOwogICAgd2hpbGUgKG5vZGUgIT0gdGFyZ2V0KSB7CiAgICAgICsrbm9kZS51c2VDb3VudGVyOwogICAgICBub2RlID0gbm9kZS5vdXRlcjsKICAgIH0KICAgICsrdGFyZ2V0LnVzZUNvdW50ZXI7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdWJzdGl0dXRlKFR5cGVQYXJhbWV0ZXIgdmFyaWFibGUpIHsKICAgIHZhciBlbnZpcm9ubWVudCA9IHRoaXM7CiAgICB3aGlsZSAoZW52aXJvbm1lbnQgIT0gbnVsbCkgewogICAgICB2YXIgcmVwbGFjZW1lbnQgPSBlbnZpcm9ubWVudC5sb29rdXAodmFyaWFibGUsIGNvdmFyaWFudENvbnRleHQpOwogICAgICBpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgewogICAgICAgIGJ1bXBDb3VudGVyc1VudGlsKGVudmlyb25tZW50KTsKICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7CiAgICAgIH0KICAgICAgZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudC5vdXRlcjsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgRGFydFR5cGUgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZShUeXBlUGFyYW1ldGVyVHlwZSBub2RlKSB7CiAgICByZXR1cm4gZ2V0U3Vic3RpdHV0ZShub2RlLnBhcmFtZXRlcikgPz8gbm9kZTsKICB9Cn0KCmNsYXNzIF9EZWVwVHlwZVN1YnN0aXR1dG9yIGV4dGVuZHMgX0lubmVyVHlwZVN1YnN0aXR1dG9yIHsKICBpbnQgZGVwdGggPSAwOwogIGJvb2wgaXNJbmZpbml0ZSA9IGZhbHNlOwoKICBfRGVlcFR5cGVTdWJzdGl0dXRvcihNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbiwKICAgICAgW19EZWVwVHlwZVN1YnN0aXR1dG9yIG91dGVyXSkKICAgICAgOiBzdXBlcihvdXRlcikgewogICAgdGhpcy5zdWJzdGl0dXRpb24uYWRkQWxsKHN1YnN0aXR1dGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBfRGVlcFR5cGVTdWJzdGl0dXRvciBuZXdJbm5lckVudmlyb25tZW50KCkgewogICAgcmV0dXJuIG5ldyBfRGVlcFR5cGVTdWJzdGl0dXRvcig8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e30sIHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZShUeXBlUGFyYW1ldGVyVHlwZSBub2RlKSB7CiAgICBEYXJ0VHlwZSByZXBsYWNlbWVudCA9IGdldFN1YnN0aXR1dGUobm9kZS5wYXJhbWV0ZXIpOwogICAgaWYgKHJlcGxhY2VtZW50ID09IG51bGwpIHJldHVybiBub2RlOwogICAgaWYgKGlzSW5maW5pdGUpIHJldHVybiByZXBsYWNlbWVudDsKICAgICsrZGVwdGg7CiAgICBpZiAoZGVwdGggPiBzdWJzdGl0dXRpb24ubGVuZ3RoKSB7CiAgICAgIGlzSW5maW5pdGUgPSB0cnVlOwogICAgICAtLWRlcHRoOwogICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7CiAgICB9IGVsc2UgewogICAgICByZXBsYWNlbWVudCA9IHZpc2l0KHJlcGxhY2VtZW50KTsKICAgICAgLy8gVXBkYXRlIHR5cGUgdG8gdGhlIGZ1bGx5IGZsZXNoZWQtb3V0IHR5cGUuCiAgICAgIHN1YnN0aXR1dGlvbltub2RlLnBhcmFtZXRlcl0gPSByZXBsYWNlbWVudDsKICAgICAgLS1kZXB0aDsKICAgICAgcmV0dXJuIHJlcGxhY2VtZW50OwogICAgfQogIH0KfQoKY2xhc3MgX1R5cGVVbmlmaWNhdGlvbiB7CiAgLy8gQWN5Y2xpYyBpbnZhcmlhbnQ6IFRoZXJlIGFyZSBubyBjeWNsZXMgaW4gdGhlIG1hcCwgdGhhdCBpcywgYWxsIHR5cGVzIGNhbgogIC8vICAgYmUgcmVzb2x2ZWQgdG8gZmluaXRlIHR5cGVzIGJ5IHN1YnN0aXR1dGluZyBhbGwgY29udGFpbmVkIHR5cGUgdmFyaWFibGVzLgogIC8vCiAgLy8gVGhlIGFjeWNsaWMgaW52YXJpYW50IGhvbGRzIGV2ZXJ5d2hlcmUgZXhjZXB0IGR1cmluZyBjeWNsZSBkZXRlY3Rpb24uCiAgLy8KICAvLyBJdCBpcyBub3QgY2hlY2tlZCB0aGF0IHRoZSBzdWJzdGl0dXRpb24gc2F0aXNmaWVzIHRoZSBib3VuZCBvbiB0aGUgdHlwZQogIC8vIHBhcmFtZXRlci4KICBmaW5hbCBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbiA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKCiAgLy8vIFZhcmlhYmxlcyB0aGF0IG1heSBiZSBhc3NpZ25lZCBmcmVlbHkgaW4gb3JkZXIgdG8gb2J0YWluIHVuaWZpY2F0aW9uLgogIC8vLwogIC8vLyBUaGVzZSBhcmUgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIGV4aXN0ZW50aWFsbHkgcXVhbnRpZmllZCB2YXJpYWJsZXMuCiAgZmluYWwgU2V0PFR5cGVQYXJhbWV0ZXI+IHF1YW50aWZpZWRWYXJpYWJsZXM7CgogIC8vLyBWYXJpYWJsZXMgdGhhdCBhcmUgYm91bmQgYnkgYSBmdW5jdGlvbiB0eXBlIGluc2lkZSBvbmUgb2YgdGhlIHR5cGVzLgogIC8vLyBUaGVzZSBtYXkgbm90IG9jY3VyIGluIGEgc3Vic3RpdHV0aW9uLCBiZWNhdXNlIHRoZXNlIHZhcmlhYmxlcyBhcmUgbm90IGluCiAgLy8vIHNjb3BlIGF0IHRoZSBleGlzdGVudGlhbGx5IHF1YW50aWZpZWQgdmFyaWFibGVzLgogIC8vLwogIC8vLyBGb3IgZXhhbXBsZSwgc3VwcG9zZSB3ZSBhcmUgdHJ5aW5nIHRvIHNhdGlzZnkgdGhlIGVxdWF0aW9uOgogIC8vLwogIC8vLyAgICAg4oiDUy4gPEU+KEUsIFMpID0+IEUgID0gIDxFPihFLCBFKSA9PiBFCiAgLy8vCiAgLy8vIFRoYXQgaXMsIHdlIG11c3QgY2hvb3NlIGBTYCBzdWNoIHRoYXQgdGhlIGdlbmVyaWMgZnVuY3Rpb24gdHlwZQogIC8vLyBgPEU+KEUsIFMpID0+IEVgIGJlY29tZXMgYDxFPihFLCBFKSA9PiBFYC4gIENob29zaW5nIGBTID0gRWAgaXMgbm90IGEKICAvLy8gdmFsaWQgc29sdXRpb24sIGJlY2F1c2UgYEVgIGlzIG5vdCBpbiBzY29wZSB3aGVyZSBgU2AgaXMgcXVhbnRpZmllZC4KICAvLy8gVGhlIHR3byBmdW5jdGlvbiB0eXBlcyBjYW5ub3QgYmUgdW5pZmllZC4KICBmaW5hbCBTZXQ8VHlwZVBhcmFtZXRlcj4gX3VuaXZlcnNhbGx5UXVhbnRpZmllZFZhcmlhYmxlcyA9CiAgICAgIG5ldyBTZXQ8VHlwZVBhcmFtZXRlcj4oKTsKCiAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKCiAgX1R5cGVVbmlmaWNhdGlvbihEYXJ0VHlwZSB0eXBlMSwgRGFydFR5cGUgdHlwZTIsIHRoaXMucXVhbnRpZmllZFZhcmlhYmxlcykgewogICAgX3VuaWZ5KHR5cGUxLCB0eXBlMik7CiAgICBpZiAoc3VjY2VzcyAmJiBzdWJzdGl0dXRpb24ubGVuZ3RoID49IDIpIHsKICAgICAgZm9yICh2YXIga2V5IGluIHN1YnN0aXR1dGlvbi5rZXlzKSB7CiAgICAgICAgc3Vic3RpdHV0aW9uW2tleV0gPSBzdWJzdGl0dXRlRGVlcChzdWJzdGl0dXRpb25ba2V5XSwgc3Vic3RpdHV0aW9uKTsKICAgICAgfQogICAgfQogIH0KCiAgRGFydFR5cGUgX3N1YnN0aXR1dGVIZWFkKFR5cGVQYXJhbWV0ZXJUeXBlIHR5cGUpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN1YnN0aXR1dGlvbi5sZW5ndGg7ICsraSkgewogICAgICBEYXJ0VHlwZSBuZXh0VHlwZSA9IHN1YnN0aXR1dGlvblt0eXBlLnBhcmFtZXRlcl07CiAgICAgIGlmIChuZXh0VHlwZSA9PSBudWxsKSByZXR1cm4gdHlwZTsKICAgICAgaWYgKG5leHRUeXBlIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgICAgdHlwZSA9IG5leHRUeXBlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBuZXh0VHlwZTsKICAgICAgfQogICAgfQogICAgLy8gVGhlIGN5Y2xlIHNob3VsZCBoYXZlIGJlZW4gZm91bmQgYnkgX3RyeVN1YnN0aXR1dGlvbiB3aGVuIHRoZSBjeWNsZQogICAgLy8gd2FzIGNyZWF0ZWQuCiAgICB0aHJvdyAnVW5leHBlY3RlZCBjeWNsZSBmb3VuZCBkdXJpbmcgdW5pZmljYXRpb24nOwogIH0KCiAgYm9vbCBfdW5pZnkoRGFydFR5cGUgdHlwZTEsIERhcnRUeXBlIHR5cGUyKSB7CiAgICBpZiAoIXN1Y2Nlc3MpIHJldHVybiBmYWxzZTsKICAgIHR5cGUxID0gdHlwZTEgaXMgVHlwZVBhcmFtZXRlclR5cGUgPyBfc3Vic3RpdHV0ZUhlYWQodHlwZTEpIDogdHlwZTE7CiAgICB0eXBlMiA9IHR5cGUyIGlzIFR5cGVQYXJhbWV0ZXJUeXBlID8gX3N1YnN0aXR1dGVIZWFkKHR5cGUyKSA6IHR5cGUyOwogICAgaWYgKHR5cGUxIGlzIER5bmFtaWNUeXBlICYmIHR5cGUyIGlzIER5bmFtaWNUeXBlKSByZXR1cm4gdHJ1ZTsKICAgIGlmICh0eXBlMSBpcyBWb2lkVHlwZSAmJiB0eXBlMiBpcyBWb2lkVHlwZSkgcmV0dXJuIHRydWU7CiAgICBpZiAodHlwZTEgaXMgSW52YWxpZFR5cGUgJiYgdHlwZTIgaXMgSW52YWxpZFR5cGUpIHJldHVybiB0cnVlOwogICAgaWYgKHR5cGUxIGlzIEJvdHRvbVR5cGUgJiYgdHlwZTIgaXMgQm90dG9tVHlwZSkgcmV0dXJuIHRydWU7CiAgICBpZiAodHlwZTEgaXMgSW50ZXJmYWNlVHlwZSAmJiB0eXBlMiBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIGlmICh0eXBlMS5jbGFzc05vZGUgIT0gdHlwZTIuY2xhc3NOb2RlKSByZXR1cm4gX2ZhaWwoKTsKICAgICAgYXNzZXJ0KHR5cGUxLnR5cGVBcmd1bWVudHMubGVuZ3RoID09IHR5cGUyLnR5cGVBcmd1bWVudHMubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlMS50eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKCFfdW5pZnkodHlwZTEudHlwZUFyZ3VtZW50c1tpXSwgdHlwZTIudHlwZUFyZ3VtZW50c1tpXSkpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAodHlwZTEgaXMgRnVuY3Rpb25UeXBlICYmIHR5cGUyIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICBpZiAodHlwZTEudHlwZVBhcmFtZXRlcnMubGVuZ3RoICE9IHR5cGUyLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCB8fAogICAgICAgICAgdHlwZTEucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoICE9CiAgICAgICAgICAgICAgdHlwZTIucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoIHx8CiAgICAgICAgICB0eXBlMS5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoICE9IHR5cGUyLm5hbWVkUGFyYW1ldGVycy5sZW5ndGggfHwKICAgICAgICAgIHR5cGUxLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgIT0gdHlwZTIucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCkgewogICAgICAgIHJldHVybiBfZmFpbCgpOwogICAgICB9CiAgICAgIC8vIFdoZW4gdW5pZnlpbmcgdHdvIGdlbmVyaWMgZnVuY3Rpb25zLCB0cmFuc2Zvcm0gdGhlIGVxdWF0aW9uIGxpa2UgdGhpczoKICAgICAgLy8KICAgICAgLy8gICAg4oiDUy4gPEU+KGZuMSkgPSA8VD4oZm4yKQogICAgICAvLyAgICAgID09PgogICAgICAvLyAgICDiiINTLiDiiIBHLiBmbjFbRy9FXSA9IGZuMltHL1RdCiAgICAgIC8vCiAgICAgIC8vIFRoYXQgaXMsIGFzc3VtZSBzb21lIGZpeGVkIGlkZW50aWNhbCBjaG9pY2Ugb2YgdHlwZSBwYXJhbWV0ZXJzIGZvciBib3RoCiAgICAgIC8vIGZ1bmN0aW9ucyBhbmQgdHJ5IHRvIHVuaWZ5IHRoZSBpbnN0YW50aWF0ZWQgZnVuY3Rpb24gdHlwZXMuCiAgICAgIGFzc2VydCghdHlwZTEudHlwZVBhcmFtZXRlcnMuYW55KHF1YW50aWZpZWRWYXJpYWJsZXMuY29udGFpbnMpKTsKICAgICAgYXNzZXJ0KCF0eXBlMi50eXBlUGFyYW1ldGVycy5hbnkocXVhbnRpZmllZFZhcmlhYmxlcy5jb250YWlucykpOwogICAgICB2YXIgbGVmdEluc3RhbmNlID0gPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwogICAgICB2YXIgcmlnaHRJbnN0YW5jZSA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlMS50eXBlUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciBpbnN0YW50aWF0b3IgPSBuZXcgVHlwZVBhcmFtZXRlcih0eXBlMS50eXBlUGFyYW1ldGVyc1tpXS5uYW1lKTsKICAgICAgICB2YXIgaW5zdGFudGlhdG9yVHlwZSA9IG5ldyBUeXBlUGFyYW1ldGVyVHlwZShpbnN0YW50aWF0b3IpOwogICAgICAgIGxlZnRJbnN0YW5jZVt0eXBlMS50eXBlUGFyYW1ldGVyc1tpXV0gPSBpbnN0YW50aWF0b3JUeXBlOwogICAgICAgIHJpZ2h0SW5zdGFuY2VbdHlwZTIudHlwZVBhcmFtZXRlcnNbaV1dID0gaW5zdGFudGlhdG9yVHlwZTsKICAgICAgICBfdW5pdmVyc2FsbHlRdWFudGlmaWVkVmFyaWFibGVzLmFkZChpbnN0YW50aWF0b3IpOwogICAgICB9CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZTEudHlwZVBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgICB2YXIgbGVmdCA9IHN1YnN0aXR1dGUodHlwZTEudHlwZVBhcmFtZXRlcnNbaV0uYm91bmQsIGxlZnRJbnN0YW5jZSk7CiAgICAgICAgdmFyIHJpZ2h0ID0gc3Vic3RpdHV0ZSh0eXBlMi50eXBlUGFyYW1ldGVyc1tpXS5ib3VuZCwgcmlnaHRJbnN0YW5jZSk7CiAgICAgICAgaWYgKCFfdW5pZnkobGVmdCwgcmlnaHQpKSByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlMS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciBsZWZ0ID0gc3Vic3RpdHV0ZSh0eXBlMS5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXSwgbGVmdEluc3RhbmNlKTsKICAgICAgICB2YXIgcmlnaHQgPSBzdWJzdGl0dXRlKHR5cGUyLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldLCByaWdodEluc3RhbmNlKTsKICAgICAgICBpZiAoIV91bmlmeShsZWZ0LCByaWdodCkpIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGUxLm5hbWVkUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICAgIGlmICh0eXBlMS5uYW1lZFBhcmFtZXRlcnNbaV0ubmFtZSAhPSB0eXBlMi5uYW1lZFBhcmFtZXRlcnNbaV0ubmFtZSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICB2YXIgbGVmdCA9IHN1YnN0aXR1dGUodHlwZTEubmFtZWRQYXJhbWV0ZXJzW2ldLnR5cGUsIGxlZnRJbnN0YW5jZSk7CiAgICAgICAgdmFyIHJpZ2h0ID0gc3Vic3RpdHV0ZSh0eXBlMi5uYW1lZFBhcmFtZXRlcnNbaV0udHlwZSwgcmlnaHRJbnN0YW5jZSk7CiAgICAgICAgaWYgKCFfdW5pZnkobGVmdCwgcmlnaHQpKSByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdmFyIGxlZnRSZXR1cm4gPSBzdWJzdGl0dXRlKHR5cGUxLnJldHVyblR5cGUsIGxlZnRJbnN0YW5jZSk7CiAgICAgIHZhciByaWdodFJldHVybiA9IHN1YnN0aXR1dGUodHlwZTIucmV0dXJuVHlwZSwgcmlnaHRJbnN0YW5jZSk7CiAgICAgIGlmICghX3VuaWZ5KGxlZnRSZXR1cm4sIHJpZ2h0UmV0dXJuKSkgcmV0dXJuIGZhbHNlOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmICh0eXBlMSBpcyBUeXBlUGFyYW1ldGVyVHlwZSAmJgogICAgICAgIHR5cGUyIGlzIFR5cGVQYXJhbWV0ZXJUeXBlICYmCiAgICAgICAgdHlwZTEucGFyYW1ldGVyID09IHR5cGUyLnBhcmFtZXRlcikgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmICh0eXBlMSBpcyBUeXBlUGFyYW1ldGVyVHlwZSAmJgogICAgICAgIHF1YW50aWZpZWRWYXJpYWJsZXMuY29udGFpbnModHlwZTEucGFyYW1ldGVyKSkgewogICAgICByZXR1cm4gX3RyeVN1YnN0aXR1dGlvbih0eXBlMS5wYXJhbWV0ZXIsIHR5cGUyKTsKICAgIH0KICAgIGlmICh0eXBlMiBpcyBUeXBlUGFyYW1ldGVyVHlwZSAmJgogICAgICAgIHF1YW50aWZpZWRWYXJpYWJsZXMuY29udGFpbnModHlwZTIucGFyYW1ldGVyKSkgewogICAgICByZXR1cm4gX3RyeVN1YnN0aXR1dGlvbih0eXBlMi5wYXJhbWV0ZXIsIHR5cGUxKTsKICAgIH0KICAgIHJldHVybiBfZmFpbCgpOwogIH0KCiAgYm9vbCBfdHJ5U3Vic3RpdHV0aW9uKFR5cGVQYXJhbWV0ZXIgdmFyaWFibGUsIERhcnRUeXBlIHR5cGUpIHsKICAgIGlmIChjb250YWluc1R5cGVWYXJpYWJsZSh0eXBlLCBfdW5pdmVyc2FsbHlRdWFudGlmaWVkVmFyaWFibGVzKSkgewogICAgICByZXR1cm4gX2ZhaWwoKTsKICAgIH0KICAgIC8vIFNldCB0aGUgcGxhaW4gc3Vic3RpdHV0aW9uIGZpcnN0IGFuZCB0aGVuIGdlbmVyYXRlIHRoZSBkZWVwCiAgICAvLyBzdWJzdGl0dXRpb24gdG8gZGV0ZWN0IGN5Y2xlcy4KICAgIHN1YnN0aXR1dGlvblt2YXJpYWJsZV0gPSB0eXBlOwogICAgRGFydFR5cGUgZGVlcFN1YnN0aXR1dGUgPSBzdWJzdGl0dXRlRGVlcCh0eXBlLCBzdWJzdGl0dXRpb24pOwogICAgaWYgKGRlZXBTdWJzdGl0dXRlID09IG51bGwpIHJldHVybiBfZmFpbCgpOwogICAgc3Vic3RpdHV0aW9uW3ZhcmlhYmxlXSA9IGRlZXBTdWJzdGl0dXRlOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBib29sIF9mYWlsKCkgewogICAgcmV0dXJuIHN1Y2Nlc3MgPSBmYWxzZTsKICB9Cn0KCmNsYXNzIF9PY2N1cnJlbmNlVmlzaXRvciBleHRlbmRzIERhcnRUeXBlVmlzaXRvcjxib29sPiB7CiAgZmluYWwgU2V0PFR5cGVQYXJhbWV0ZXI+IHZhcmlhYmxlczsKCiAgX09jY3VycmVuY2VWaXNpdG9yKHRoaXMudmFyaWFibGVzKTsKCiAgYm9vbCB2aXNpdChEYXJ0VHlwZSBub2RlKSA9PiBub2RlLmFjY2VwdCh0aGlzKTsKCiAgYm9vbCB2aXNpdE5hbWVkVHlwZShOYW1lZFR5cGUgbm9kZSkgewogICAgcmV0dXJuIHZpc2l0KG5vZGUudHlwZSk7CiAgfQoKICBib29sIHZpc2l0SW52YWxpZFR5cGUoSW52YWxpZFR5cGUgbm9kZSkgPT4gZmFsc2U7CiAgYm9vbCB2aXNpdER5bmFtaWNUeXBlKER5bmFtaWNUeXBlIG5vZGUpID0+IGZhbHNlOwogIGJvb2wgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSBub2RlKSA9PiBmYWxzZTsKCiAgYm9vbCB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBub2RlKSB7CiAgICByZXR1cm4gbm9kZS50eXBlQXJndW1lbnRzLmFueSh2aXNpdCk7CiAgfQoKICBib29sIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSkgewogICAgcmV0dXJuIG5vZGUudHlwZUFyZ3VtZW50cy5hbnkodmlzaXQpOwogIH0KCiAgYm9vbCB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSkgewogICAgcmV0dXJuIG5vZGUudHlwZVBhcmFtZXRlcnMuYW55KGhhbmRsZVR5cGVQYXJhbWV0ZXIpIHx8CiAgICAgICAgbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5hbnkodmlzaXQpIHx8CiAgICAgICAgbm9kZS5uYW1lZFBhcmFtZXRlcnMuYW55KHZpc2l0TmFtZWRUeXBlKSB8fAogICAgICAgIHZpc2l0KG5vZGUucmV0dXJuVHlwZSk7CiAgfQoKICBib29sIHZpc2l0VHlwZVBhcmFtZXRlclR5cGUoVHlwZVBhcmFtZXRlclR5cGUgbm9kZSkgewogICAgcmV0dXJuIHZhcmlhYmxlcyA9PSBudWxsIHx8IHZhcmlhYmxlcy5jb250YWlucyhub2RlLnBhcmFtZXRlcik7CiAgfQoKICBib29sIGhhbmRsZVR5cGVQYXJhbWV0ZXIoVHlwZVBhcmFtZXRlciBub2RlKSB7CiAgICBhc3NlcnQoIXZhcmlhYmxlcy5jb250YWlucyhub2RlKSk7CiAgICBpZiAobm9kZS5ib3VuZC5hY2NlcHQodGhpcykpIHJldHVybiB0cnVlOwogICAgaWYgKG5vZGUuZGVmYXVsdFR5cGUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIG5vZGUuZGVmYXVsdFR5cGUuYWNjZXB0KHRoaXMpOwogIH0KfQqC5gBOTjwdARMBUCsESDwES085UClCAgFPNQQ0QiQqOD4CAUhNLC8tBC89BBECAU9QDgRQHARNRARMTxsETyAZQCk8KDECAVEETThJJzgCAVBJGQRIPwQoBEsELkpLPilOSTgCAUsxBExRUTpPFyk0SAQ0SUs5EAROAgEcMSMBRAFLOiNLKzsTSwFLAS83AS4zBAIBTC9MAR4YAUABQkI4KwQBTzMEAUhLHwZLTCgGTiwvUEsvBAFLLjtMQ0cEAUYpPkdDPQQBSCk6R0M/BAFJDyE+RkYvPxRMBAFLLjVKMQQBTkwgOUotMy4GMz0GLwQBUB8GUFFDTCZJPDw1BAFEAUhBBAEyQgQCAS9HAR0BRS0EAQxPAQw5AQwtAgEuLCwBLAFFPQQBDDsCATEjAUkZGAYEAT4+BAE5LgQCATYWASkBRSZEBhEEAgEzJAEyAUU5NQQCATMBMxsmATMBRR80SwQCATdRAUABPiQEATkuNyUkMwYSBAIBRCAgASFGBAE9AUwWBk5NPBYBMCwEARoqBAEtMR1AKzkEAS0dISsrBAE2ATc3MTUBNDEdQCs9BAEwMR1AKz0EAUw8OAQBOAEyTk5JUR4HT1BPRjZMIjgcSUEdPzceQxwzG0kwPiooPSMEATQVHRkZBhkEATMcIkghKBwIJwYRBAE8MgQCATsRGwFCJBcsBAEML0gEAQw8OiooDScZDxoNKDQyDxoGBAIBGU9RBUsFTRBRAUwGTTABS1A3BkIGMAZGTEswPSABFwFPGi8rTQgGBAE1NTgpKxkPGQgGSxQ3BAEwIElJQz1DQTw+SD1HGAoIEwY6SC8zSkoYCFAJJBIoCVFFR0c2Nz5MREJDOwg+TE4wCERMTjAIP04YCkxOMAhDRToTBiYmLhMGJjk3BiY5NwYUBAFBRxYGQyYjQjAtEQQBERwEAgE5JgEmATIBKB0EATQ0LgEwKgQBLCoEAS47MDQgBAE4RAQBMScuMCoEAgEgcGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQxc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvb2xkX3RvX25ld19hcGkuZGFydIyfLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgbmV3IGNvbXBpbGVyIEFQSSBpbiAnLi4vY29tcGlsZXJfbmV3LmRhcnQnIHRocm91Z2ggdGhlCi8vLyBvbGQgY29tcGlsZXIgQVBJIGluICcuLi9jb21waWxlci5kYXJ0Jy4KCmxpYnJhcnkgY29tcGlsZXIuYXBpLmxlZ2FjeTsKCmltcG9ydCAnZGFydDphc3luYycgc2hvdyBFdmVudFNpbmssIEZ1dHVyZTsKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgdXRmODsKCmltcG9ydCAnLi4vY29tcGlsZXIuZGFydCc7CmltcG9ydCAnLi4vY29tcGlsZXJfbmV3LmRhcnQnOwppbXBvcnQgJ2lvL3NvdXJjZV9maWxlLmRhcnQnOwppbXBvcnQgJ251bGxfY29tcGlsZXJfb3V0cHV0LmRhcnQnIHNob3cgTnVsbFNpbms7CgovLy8gSW1wbGVtZW50YXRpb24gb2YgW0NvbXBpbGVySW5wdXRdIHVzaW5nIGEgW0NvbXBpbGVySW5wdXRQcm92aWRlcl0uCmNsYXNzIExlZ2FjeUNvbXBpbGVySW5wdXQgaW1wbGVtZW50cyBDb21waWxlcklucHV0IHsKICBmaW5hbCBDb21waWxlcklucHV0UHJvdmlkZXIgX2lucHV0UHJvdmlkZXI7CgogIExlZ2FjeUNvbXBpbGVySW5wdXQodGhpcy5faW5wdXRQcm92aWRlcik7CgogIEBvdmVycmlkZQogIEZ1dHVyZTxJbnB1dD4gcmVhZEZyb21VcmkoVXJpIHVyaSwge0lucHV0S2luZCBpbnB1dEtpbmQ6IElucHV0S2luZC5VVEY4fSkgewogICAgcmV0dXJuIF9pbnB1dFByb3ZpZGVyKHVyaSkudGhlbigoLypTdHJpbmd8TGlzdDxpbnQ+Ki8gZGF0YSkgewogICAgICBzd2l0Y2ggKGlucHV0S2luZCkgewogICAgICAgIGNhc2UgSW5wdXRLaW5kLlVURjg6CiAgICAgICAgICBTb3VyY2VGaWxlIHNvdXJjZUZpbGU7CiAgICAgICAgICBpZiAoZGF0YSBpcyBMaXN0PGludD4pIHsKICAgICAgICAgICAgc291cmNlRmlsZSA9IG5ldyBVdGY4Qnl0ZXNTb3VyY2VGaWxlKHVyaSwgZGF0YSk7CiAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEgaXMgU3RyaW5nKSB7CiAgICAgICAgICAgIHNvdXJjZUZpbGUgPSBuZXcgU3RyaW5nU291cmNlRmlsZS5mcm9tVXJpKHVyaSwgZGF0YSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyAiRXhwZWN0ZWQgYSAnU3RyaW5nJyBvciBhICdMaXN0PGludD4nIGZyb20gdGhlIGlucHV0ICIKICAgICAgICAgICAgICAgICJwcm92aWRlciwgYnV0IGdvdDogJHtFcnJvci5zYWZlVG9TdHJpbmcoZGF0YSl9LiI7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gc291cmNlRmlsZTsKICAgICAgICBjYXNlIElucHV0S2luZC5iaW5hcnk6CiAgICAgICAgICBpZiAoZGF0YSBpcyBTdHJpbmcpIHsKICAgICAgICAgICAgZGF0YSA9IHV0ZjguZW5jb2RlKGRhdGEpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnkodXJpLCBkYXRhKTsKICAgICAgfQogICAgfSk7CiAgfQp9CgovLy8gSW1wbGVtZW50YXRpb24gb2YgW0NvbXBpbGVyRGlhZ25vc3RpY3NdIHVzaW5nIGEgW0RpYWdub3N0aWNIYW5kbGVyXS4KY2xhc3MgTGVnYWN5Q29tcGlsZXJEaWFnbm9zdGljcyBpbXBsZW1lbnRzIENvbXBpbGVyRGlhZ25vc3RpY3MgewogIGZpbmFsIERpYWdub3N0aWNIYW5kbGVyIF9oYW5kbGVyOwoKICBMZWdhY3lDb21waWxlckRpYWdub3N0aWNzKHRoaXMuX2hhbmRsZXIpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHJlcG9ydCgKICAgICAgdmFyIGNvZGUsIFVyaSB1cmksIGludCBiZWdpbiwgaW50IGVuZCwgU3RyaW5nIG1lc3NhZ2UsIERpYWdub3N0aWMga2luZCkgewogICAgX2hhbmRsZXIodXJpLCBiZWdpbiwgZW5kLCBtZXNzYWdlLCBraW5kKTsKICB9Cn0KCi8vLyBJbXBsZW1lbnRhdGlvbiBvZiBbQ29tcGlsZXJPdXRwdXRdIHVzaW5nIGFuIG9wdGlvbmFsCi8vLyBbQ29tcGlsZXJPdXRwdXRQcm92aWRlcl0uCi8vIFRPRE8oam9obm5pd2ludGhlcik6IENoYW5nZSBQdWIgdG8gdXNlIHRoZSBuZXcgaW50ZXJmYWNlIGFuZCByZW1vdmUgdGhpcy4KY2xhc3MgTGVnYWN5Q29tcGlsZXJPdXRwdXQgaW1wbGVtZW50cyBDb21waWxlck91dHB1dCB7CiAgZmluYWwgQ29tcGlsZXJPdXRwdXRQcm92aWRlciBfb3V0cHV0UHJvdmlkZXI7CgogIExlZ2FjeUNvbXBpbGVyT3V0cHV0KFt0aGlzLl9vdXRwdXRQcm92aWRlcl0pOwoKICBAb3ZlcnJpZGUKICBPdXRwdXRTaW5rIGNyZWF0ZU91dHB1dFNpbmsoU3RyaW5nIG5hbWUsIFN0cmluZyBleHRlbnNpb24sIE91dHB1dFR5cGUgdHlwZSkgewogICAgaWYgKF9vdXRwdXRQcm92aWRlciAhPSBudWxsKSB7CiAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgT3V0cHV0VHlwZS5kdW1wSW5mbzoKICAgICAgICBjYXNlIE91dHB1dFR5cGUuZGVmZXJyZWRNYXA6CiAgICAgICAgICBpZiAoZXh0ZW5zaW9uID09ICcnKSB7CiAgICAgICAgICAgIC8vIE5lZWRlZCB0byBtYWtlIFB1YiBnZW5lcmF0ZSB0aGUgc2FtZSBvdXRwdXQgbmFtZS4KICAgICAgICAgICAgZXh0ZW5zaW9uID0gJ2RlZmVycmVkX21hcCc7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICB9CiAgICAgIHJldHVybiBuZXcgTGVnYWN5T3V0cHV0U2luayhfb3V0cHV0UHJvdmlkZXIobmFtZSwgZXh0ZW5zaW9uKSk7CiAgICB9CiAgICByZXR1cm4gTnVsbFNpbmsub3V0cHV0UHJvdmlkZXIobmFtZSwgZXh0ZW5zaW9uLCB0eXBlKTsKICB9CgogIEBvdmVycmlkZQogIEJpbmFyeU91dHB1dFNpbmsgY3JlYXRlQmluYXJ5U2luayhVcmkgdXJpKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiTGVnYWN5Q29tcGlsZXJPdXRwdXQuY3JlYXRlQmluYXJ5U2luayIpOwogIH0KfQoKY2xhc3MgTGVnYWN5T3V0cHV0U2luayBpbXBsZW1lbnRzIE91dHB1dFNpbmsgewogIGZpbmFsIEV2ZW50U2luazxTdHJpbmc+IHNpbms7CgogIExlZ2FjeU91dHB1dFNpbmsodGhpcy5zaW5rKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGQoU3RyaW5nIGV2ZW50KSA9PiBzaW5rLmFkZChldmVudCk7CgogIEBvdmVycmlkZQogIHZvaWQgY2xvc2UoKSA9PiBzaW5rLmNsb3NlKCk7Cn0KagBOTjwBUSwBHQEsIQEbHx4yAUc1LgEsAQxOQhsdISM9J0ITSUMMHR8gJgwoCAgEAgFJQSQBLAEMD1AuBAIBOR5NNzABMAEMUCMWIiUhQSgMEREIRQY7BAEML0kEAgEvIAEfAQwtAQwgAgEocGFja2FnZTpjb21waWxlci9zcmMvb2xkX3RvX25ld19hcGkuZGFydC9zZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9jb21tb24vdGFza3MuZGFydKXbLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5jb21tb24udGFza3M7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnCiAgICBzaG93IEZ1dHVyZSwgWm9uZSwgWm9uZURlbGVnYXRlLCBab25lU3BlY2lmaWNhdGlvbiwgcnVuWm9uZWQ7CgovLy8gVXNlZCB0byBtZWFzdXJlIHdoZXJlIHRpbWUgaXMgc3BlbnQgaW4gdGhlIGNvbXBpbGVyLgovLy8KLy8vIFRoaXMgZXhwb3NlcyBbbWVhc3VyZV0gYW5kIFttZWFzdXJlSW9dLCB3aGljaCB3cmFwIGFuIGFjdGlvbiBhbmQgYXNzb2NpYXRlCi8vLyB0aGUgdGltZSBzcGVudCBkdXJpbmcgdGhhdCBhY3Rpb24gd2l0aCB0aGlzIHRhc2suIE5lc3RlZCBtZWFzdXJlbWVudHNjY2FuIGJlCi8vLyBpbnRyb2R1Y2VkIGJ5IHVzaW5nIFttZWFzdXJlU3VidGFza10uCi8vIFRPRE8oc2lnbXVuZCk6IHJlbmFtZSB0byBNZWFzdXJhYmxlVGFzawphYnN0cmFjdCBjbGFzcyBDb21waWxlclRhc2sgewogIGZpbmFsIE1lYXN1cmVyIF9tZWFzdXJlcjsKICBmaW5hbCBTdG9wd2F0Y2ggX3dhdGNoOwogIGZpbmFsIE1hcDxTdHJpbmcsIEdlbmVyaWNUYXNrPiBfc3VidGFza3MgPSA8U3RyaW5nLCBHZW5lcmljVGFzaz57fTsKCiAgaW50IF9hc3luY0NvdW50ID0gMDsKCiAgLy8gRWFjaCB0YXNrIGhhcyBhIGZpeGVkLCBsYXppbHkgY29tcHV0ZWQsIFpvbmVTcGVjaWZpY2F0aW9uIGFuZCB6b25lVmFsdWVzCiAgLy8gZm9yIFtfbWVhc3VyZVpvbmVkXS4KICBab25lU3BlY2lmaWNhdGlvbiBfem9uZVNwZWNpZmljYXRpb247CiAgTWFwIF96b25lVmFsdWVzOwoKICBDb21waWxlclRhc2sodGhpcy5fbWVhc3VyZXIpCiAgICAgIDogX3dhdGNoID0gX21lYXN1cmVyLmVuYWJsZVRhc2tNZWFzdXJlbWVudHMgPyBuZXcgU3RvcHdhdGNoKCkgOiBudWxsOwoKICAvLy8gV2hldGhlciBtZWFzdXJlbWVudCBpcyBkaXNhYmxlZC4gVGhlIGZ1bmN0aW9ucyBbbWVhc3VyZV0gYW5kIFttZWFzdXJlSW9dCiAgLy8vIG9ubHkgbWVhc3VyZSB0aW1lIGlmIG1lYXN1cmVtZW50cyBhcmUgZW5hYmxlZC4KICBib29sIGdldCBfaXNEaXNhYmxlZCA9PiBfd2F0Y2ggPT0gbnVsbDsKCiAgLy8vIE5hbWUgdG8gdXNlIGZvciByZXBvcnRpbmcgdGltaW5nIGluZm9ybWF0aW9uLgogIC8vLwogIC8vLyBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIHdpdGggYSBwcm9wZXIgbmFtZSwgb3RoZXJ3aXNlIHdlIHVzZSB0aGUKICAvLy8gcnVudGltZSB0eXBlIG9mIHRoZSB0YXNrLgogIFN0cmluZyBnZXQgbmFtZSA9PiAiVW5rbm93biB0YXNrICcke3RoaXMucnVudGltZVR5cGV9JyI7CgogIGJvb2wgZ2V0IGlzUnVubmluZyA9PiBfd2F0Y2g/LmlzUnVubmluZyA9PSB0cnVlOwoKICBpbnQgZ2V0IHRpbWluZyB7CiAgICBpZiAoX2lzRGlzYWJsZWQpIHJldHVybiAwOwogICAgaW50IHRvdGFsID0gX3dhdGNoLmVsYXBzZWRNaWxsaXNlY29uZHM7CiAgICBmb3IgKEdlbmVyaWNUYXNrIHN1YnRhc2sgaW4gX3N1YnRhc2tzLnZhbHVlcykgewogICAgICB0b3RhbCArPSBzdWJ0YXNrLnRpbWluZzsKICAgIH0KICAgIHJldHVybiB0b3RhbDsKICB9CgogIER1cmF0aW9uIGdldCBkdXJhdGlvbiB7CiAgICBpZiAoX2lzRGlzYWJsZWQpIHJldHVybiBEdXJhdGlvbi56ZXJvOwogICAgRHVyYXRpb24gdG90YWwgPSBfd2F0Y2guZWxhcHNlZDsKICAgIGZvciAoR2VuZXJpY1Rhc2sgc3VidGFzayBpbiBfc3VidGFza3MudmFsdWVzKSB7CiAgICAgIHRvdGFsICs9IHN1YnRhc2suZHVyYXRpb247CiAgICB9CiAgICByZXR1cm4gdG90YWw7CiAgfQoKICAvLy8gUGVyZm9ybSBbYWN0aW9uXSBhbmQgbWVhc3VyZSBpdHMgcnVudGltZSAoaW5jbHVkaW5nIGFueSBhc3luY2hyb25vdXMKICAvLy8gY2FsbGJhY2tzLCBzdWNoIGFzLCBbRnV0dXJlLnRoZW5dLCBidXQgZXhjbHVkaW5nIGNvZGUgbWVhc3VyZWQgYnkgb3RoZXIKICAvLy8gdGFza3MpLgogIFQgbWVhc3VyZTxUPihUIGFjdGlvbigpKSA9PiBfaXNEaXNhYmxlZCA/IGFjdGlvbigpIDogX21lYXN1cmVab25lZChhY3Rpb24pOwoKICAvLy8gSGVscGVyIG1ldGhvZCB0aGF0IHN0YXJ0cyBtZWFzdXJpbmcgd2l0aCB0aGlzIFtDb21waWxlclRhc2tdLCB0aGF0IGlzLAogIC8vLyBtYWtlIHRoaXMgdGFzayB0aGUgY3VycmVudGx5IG1lYXN1cmVkIHRhc2suCiAgQ29tcGlsZXJUYXNrIF9zdGFydCgpIHsKICAgIGlmIChfaXNEaXNhYmxlZCkgcmV0dXJuIG51bGw7CiAgICBDb21waWxlclRhc2sgcHJldmlvdXMgPSBfbWVhc3VyZXIuX2N1cnJlbnRUYXNrOwogICAgX21lYXN1cmVyLl9jdXJyZW50VGFzayA9IHRoaXM7CiAgICBpZiAocHJldmlvdXMgIT0gbnVsbCkgcHJldmlvdXMuX3dhdGNoLnN0b3AoKTsKICAgIC8vIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBbcHJldmlvdXNdIGlzIGBudWxsYCB3ZSd2ZSByZXR1cm5lZCBmcm9tIHRoZQogICAgLy8gZXZlbnRsb29wLgogICAgX21lYXN1cmVyLnN0b3BBc3luY1dhbGxDbG9jaygpOwogICAgX3dhdGNoLnN0YXJ0KCk7CiAgICByZXR1cm4gcHJldmlvdXM7CiAgfQoKICAvLy8gSGVscGVyIG1ldGhvZCB0aGF0IHN0b3BzIG1lYXN1cmluZyB3aXRoIHRoaXMgW0NvbXBpbGVyVGFza10sIHRoYXQgaXMsCiAgLy8vIG1ha2UgW3ByZXZpb3VzXSB0aGUgY3VycmVudGx5IG1lYXN1cmVkIHRhc2suCiAgdm9pZCBfc3RvcChDb21waWxlclRhc2sgcHJldmlvdXMpIHsKICAgIGlmIChfaXNEaXNhYmxlZCkgcmV0dXJuOwogICAgX3dhdGNoLnN0b3AoKTsKICAgIGlmIChwcmV2aW91cyAhPSBudWxsKSB7CiAgICAgIHByZXZpb3VzLl93YXRjaC5zdGFydCgpOwogICAgfSBlbHNlIHsKICAgICAgLy8gSWYgdGhlcmUncyBubyBwcmV2aW91cyB0YXNrLCB3ZSdyZSBhYm91dCB0byByZXR1cm4gY29udHJvbCB0byB0aGUKICAgICAgLy8gZXZlbnQgbG9vcC4gU3RhcnQgY291bnRpbmcgdGhhdCBhcyB3YWl0aW5nIGFzeW5jaHJvbm91cyBJL08uCiAgICAgIF9tZWFzdXJlci5zdGFydEFzeW5jV2FsbENsb2NrKCk7CiAgICB9CiAgICBfbWVhc3VyZXIuX2N1cnJlbnRUYXNrID0gcHJldmlvdXM7CiAgfQoKICBUIF9tZWFzdXJlWm9uZWQ8VD4oVCBhY3Rpb24oKSkgewogICAgLy8gVXNpbmcgem9uZXMsIHdlJ3JlIGFibGUgdG8gdHJhY2sgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgY29ycmVjdGx5LCBhcwogICAgLy8gb3VyIHpvbmUgd2lsbCBiZSBhc2tlZCB0byBpbnZva2UgYHRoZW5gIGJsb2Nrcy4gVGhlbiBibG9ja3MgKHRoZSBjbG9zdXJlCiAgICAvLyBwYXNzZWQgdG8gcnVuWm9uZWQsIGFuZCBvdGhlciBjbG9zdXJlcykgYXJlIHJ1biB2aWEgdGhlIGBydW5gIGZ1bmN0aW9ucwogICAgLy8gYmVsb3cuCgogICAgYXNzZXJ0KF93YXRjaCAhPSBudWxsKTsKCiAgICAvLyBUaGUgY3VycmVudCB6b25lIGlzIGFscmVhZHkgbWVhc3VyaW5nIGB0aGlzYCB0YXNrLgogICAgaWYgKFpvbmUuY3VycmVudFtfbWVhc3VyZXJdID09IHRoaXMpIHJldHVybiBhY3Rpb24oKTsKCiAgICByZXR1cm4gcnVuWm9uZWQoYWN0aW9uLAogICAgICAgIHpvbmVWYWx1ZXM6IF96b25lVmFsdWVzID8/PSB7X21lYXN1cmVyOiB0aGlzfSwKICAgICAgICB6b25lU3BlY2lmaWNhdGlvbjogX3pvbmVTcGVjaWZpY2F0aW9uID8/PSBuZXcgWm9uZVNwZWNpZmljYXRpb24oCiAgICAgICAgICAgIHJ1bjogX3J1biwgcnVuVW5hcnk6IF9ydW5VbmFyeSwgcnVuQmluYXJ5OiBfcnVuQmluYXJ5KSk7CiAgfQoKICAvLy8gUnVuIFtmXSBpbiBbem9uZV0uIFJ1bm5pbmcgbXVzdCBiZSBkZWxlZ2F0ZWQgdG8gW3BhcmVudF0gdG8gZW5zdXJlIHRoYXQKICAvLy8gdmFyaW91cyBzdGF0ZSBpcyBzZXQgdXAgY29ycmVjdGx5IChpbiBwYXJ0aWN1bGFyIHRoYXQgYFpvbmUuY3VycmVudGAKICAvLy8gaGFzIHRoZSByaWdodCB2YWx1ZSkuIFNpbmNlIFtfbWVhc3VyZVpvbmVkXSBjYW4gYmUgY2FsbGVkIHJlY3Vyc2l2ZWx5CiAgLy8vIChzeW5jaHJvbm91c2x5KSwgc29tZSBvZiB0aGUgbWVhc3VyaW5nIHpvbmVzIHdlIGNyZWF0ZSB3aWxsIGJlIHBhcmVudHMKICAvLy8gb2Ygb3RoZXIgbWVhc3VyaW5nIHpvbmVzLCBidXQgd2Ugc3RpbGwgbmVlZCB0byBjYWxsIHRocm91Z2ggdGhlIHBhcmVudAogIC8vLyBjaGFpbi4gQ29uc2VxdWVudGx5LCB3ZSB1c2UgYSB6b25lIHZhbHVlIGtleWVkIGJ5IFtfbWVhc3VyZXJdIHRvIHNlZSBpZgogIC8vLyB3ZSBzaG91bGQgbWVhc3VyZSBvciBub3Qgd2hlbiBkZWxlZ2F0aW5nLgogIFIgX3J1bjxSPihab25lIHNlbGYsIFpvbmVEZWxlZ2F0ZSBwYXJlbnQsIFpvbmUgem9uZSwgUiBmKCkpIHsKICAgIGlmICh6b25lW19tZWFzdXJlcl0gIT0gdGhpcykgcmV0dXJuIHBhcmVudC5ydW4oem9uZSwgZik7CiAgICBDb21waWxlclRhc2sgcHJldmlvdXMgPSBfc3RhcnQoKTsKICAgIHRyeSB7CiAgICAgIHJldHVybiBwYXJlbnQucnVuKHpvbmUsIGYpOwogICAgfSBmaW5hbGx5IHsKICAgICAgX3N0b3AocHJldmlvdXMpOwogICAgfQogIH0KCiAgLy8vIFNhbWUgYXMgW3J1bl0gZXhjZXB0IHRoYXQgW2ZdIHRha2VzIG9uZSBhcmd1bWVudCwgW2FyZ10uCiAgUiBfcnVuVW5hcnk8UiwgVD4oCiAgICAgIFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLCBSIGYoVCBhcmcpLCBUIGFyZykgewogICAgaWYgKHpvbmVbX21lYXN1cmVyXSAhPSB0aGlzKSByZXR1cm4gcGFyZW50LnJ1blVuYXJ5KHpvbmUsIGYsIGFyZyk7CiAgICBDb21waWxlclRhc2sgcHJldmlvdXMgPSBfc3RhcnQoKTsKICAgIHRyeSB7CiAgICAgIHJldHVybiBwYXJlbnQucnVuVW5hcnkoem9uZSwgZiwgYXJnKTsKICAgIH0gZmluYWxseSB7CiAgICAgIF9zdG9wKHByZXZpb3VzKTsKICAgIH0KICB9CgogIC8vLyBTYW1lIGFzIFtydW5dIGV4Y2VwdCB0aGF0IFtmXSB0YWtlcyB0d28gYXJndW1lbnRzIChbYTFdIGFuZCBbYTJdKS4KICBSIF9ydW5CaW5hcnk8UiwgVDEsIFQyPihab25lIHNlbGYsIFpvbmVEZWxlZ2F0ZSBwYXJlbnQsIFpvbmUgem9uZSwKICAgICAgUiBmKFQxIGExLCBUMiBhMiksIFQxIGExLCBUMiBhMikgewogICAgaWYgKHpvbmVbX21lYXN1cmVyXSAhPSB0aGlzKSByZXR1cm4gcGFyZW50LnJ1bkJpbmFyeSh6b25lLCBmLCBhMSwgYTIpOwogICAgQ29tcGlsZXJUYXNrIHByZXZpb3VzID0gX3N0YXJ0KCk7CiAgICB0cnkgewogICAgICByZXR1cm4gcGFyZW50LnJ1bkJpbmFyeSh6b25lLCBmLCBhMSwgYTIpOwogICAgfSBmaW5hbGx5IHsKICAgICAgX3N0b3AocHJldmlvdXMpOwogICAgfQogIH0KCiAgLy8vIEFzeW5jaHJvbm91cyB2ZXJzaW9uIG9mIFttZWFzdXJlXS4gVXNlIHRoaXMgd2hlbiBhY3Rpb24gcmV0dXJucyBhIGZ1dHVyZQogIC8vLyB0aGF0J3MgdHJ1bHkgYXN5bmNocm9ub3VzLCBzdWNoIEkvTy4gT25seSBvbmUgdGFzayBjYW4gdXNlIHRoaXMgbWV0aG9kCiAgLy8vIGNvbmN1cnJlbnRseS4KICAvLy8KICAvLy8gTm90ZTogd2UgYXNzdW1lIHRoYXQgdGhpcyBtZXRob2QgaXMgdXNlZCBvbmx5IGJ5IHRoZSBjb21waWxlciBpbnB1dAogIC8vLyBwcm92aWRlciwgYnV0IGl0IGNvdWxkIGJlIHVzZWQgYnkgb3RoZXIgdGFza3MgYXMgbG9uZyBhcyB0aGUgaW5wdXQKICAvLy8gcHJvdmlkZXIgd2lsbCBub3QgYmUgY2FsbGVkIGJ5IHRob3NlIHRhc2tzLgogIEZ1dHVyZTxUPiBtZWFzdXJlSW88VD4oRnV0dXJlPFQ+IGFjdGlvbigpKSB7CiAgICBpZiAoX2lzRGlzYWJsZWQpIHJldHVybiBhY3Rpb24oKTsKCiAgICBpZiAoX21lYXN1cmVyLl9jdXJyZW50QXN5bmNUYXNrID09IG51bGwpIHsKICAgICAgX21lYXN1cmVyLl9jdXJyZW50QXN5bmNUYXNrID0gdGhpczsKICAgIH0gZWxzZSBpZiAoX21lYXN1cmVyLl9jdXJyZW50QXN5bmNUYXNrICE9IHRoaXMpIHsKICAgICAgdGhyb3cgIkNhbid0IHRyYWNrIGFzeW5jIHRhc2sgJyRuYW1lJyBiZWNhdXNlIgogICAgICAgICAgIiAnJHtfbWVhc3VyZXIuX2N1cnJlbnRBc3luY1Rhc2submFtZX0nIGlzIGFscmVhZHkgYmVpbmcgdHJhY2tlZC4iOwogICAgfQogICAgX2FzeW5jQ291bnQrKzsKICAgIHJldHVybiBtZWFzdXJlKGFjdGlvbikud2hlbkNvbXBsZXRlKCgpIHsKICAgICAgX2FzeW5jQ291bnQtLTsKICAgICAgaWYgKF9hc3luY0NvdW50ID09IDApIF9tZWFzdXJlci5fY3VycmVudEFzeW5jVGFzayA9IG51bGw7CiAgICB9KTsKICB9CgogIC8vLyBNZWFzdXJlIHRoZSB0aW1lIHNwZW50IGluIFthY3Rpb25dIChpZiBpbiB2ZXJib3NlIG1vZGUpIGFuZCBhY2N1bXVsYXRlIGl0CiAgLy8vIHVuZGVyIGEgc3VidGFzayB3aXRoIHRoZSBnaXZlbiBuYW1lLgogIFQgbWVhc3VyZVN1YnRhc2s8VD4oU3RyaW5nIG5hbWUsIFQgYWN0aW9uKCkpIHsKICAgIGlmIChfaXNEaXNhYmxlZCkgcmV0dXJuIGFjdGlvbigpOwoKICAgIC8vIFVzZSBhIG5lc3RlZCBDb21waWxlclRhc2sgZm9yIHRoZSBtZWFzdXJlbWVudCB0byBlbnN1cmUgbmVzdGVkIFttZWFzdXJlXQogICAgLy8gY2FsbHMgd29yayBjb3JyZWN0bHkuIFRoZSBzdWJ0YXNrcyB3aWxsIG5ldmVyIHRoZW1zZWx2ZXMgaGF2ZSBuZXN0ZWQKICAgIC8vIHN1YnRhc2tzIGJlY2F1c2UgdGhleSBhcmUgbm90IGFjY2Vzc2libGUgb3V0c2lkZS4KICAgIEdlbmVyaWNUYXNrIHN1YnRhc2sgPSBfc3VidGFza3NbbmFtZV0gPz89IG5ldyBHZW5lcmljVGFzayhuYW1lLCBfbWVhc3VyZXIpOwogICAgcmV0dXJuIHN1YnRhc2subWVhc3VyZShhY3Rpb24pOwogIH0KCiAgLy8vIEFzeW5jaHJvbm91cyB2ZXJzaW9uIG9mIFttZWFzdXJlU3VidGFza10uIFVzZSB0aGlzIHdoZW4gYWN0aW9uIHJldHVybnMgYQogIC8vLyBmdXR1cmUgdGhhdCdzIHRydWx5IGFzeW5jaHJvbm91cywgc3VjaCBJL08uIE9ubHkgb25lIHRhc2sgY2FuIHVzZSB0aGlzCiAgLy8vIGNvbmN1cnJlbnRseS4KICAvLy8KICAvLy8gTm90ZTogd2UgYXNzdW1lIHRoYXQgdGhpcyBtZXRob2QgaXMgdXNlZCBvbmx5IGJ5IHRoZSBjb21waWxlciBpbnB1dAogIC8vLyBwcm92aWRlciwgYnV0IGl0IGNvdWxkIGJlIHVzZWQgYnkgb3RoZXIgdGFza3MgYXMgbG9uZyBhcyB0aGUgaW5wdXQKICAvLy8gcHJvdmlkZXIgd2lsbCBub3QgYmUgY2FsbGVkIGJ5IHRob3NlIHRhc2tzLgogIEZ1dHVyZTxUPiBtZWFzdXJlSW9TdWJ0YXNrPFQ+KFN0cmluZyBuYW1lLCBGdXR1cmU8VD4gYWN0aW9uKCkpIHsKICAgIGlmIChfaXNEaXNhYmxlZCkgcmV0dXJuIGFjdGlvbigpOwoKICAgIC8vIFVzZSBhIG5lc3RlZCBDb21waWxlclRhc2sgZm9yIHRoZSBtZWFzdXJlbWVudCB0byBlbnN1cmUgbmVzdGVkIFttZWFzdXJlXQogICAgLy8gY2FsbHMgd29yayBjb3JyZWN0bHkuIFRoZSBzdWJ0YXNrcyB3aWxsIG5ldmVyIHRoZW1zZWx2ZXMgaGF2ZSBuZXN0ZWQKICAgIC8vIHN1YnRhc2tzIGJlY2F1c2UgdGhleSBhcmUgbm90IGFjY2Vzc2libGUgb3V0c2lkZS4KICAgIEdlbmVyaWNUYXNrIHN1YnRhc2sgPSBfc3VidGFza3NbbmFtZV0gPz89IG5ldyBHZW5lcmljVGFzayhuYW1lLCBfbWVhc3VyZXIpOwogICAgcmV0dXJuIHN1YnRhc2subWVhc3VyZUlvKGFjdGlvbik7CiAgfQoKICBJdGVyYWJsZTxTdHJpbmc+IGdldCBzdWJ0YXNrcyA9PiBfc3VidGFza3Mua2V5czsKCiAgaW50IGdldFN1YnRhc2tUaW1lKFN0cmluZyBzdWJ0YXNrKSA9PiBfc3VidGFza3Nbc3VidGFza10udGltaW5nOwoKICBib29sIGdldFN1YnRhc2tJc1J1bm5pbmcoU3RyaW5nIHN1YnRhc2spID0+IF9zdWJ0YXNrc1tzdWJ0YXNrXS5pc1J1bm5pbmc7Cn0KCmNsYXNzIEdlbmVyaWNUYXNrIGV4dGVuZHMgQ29tcGlsZXJUYXNrIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBHZW5lcmljVGFzayh0aGlzLm5hbWUsIE1lYXN1cmVyIG1lYXN1cmVyKSA6IHN1cGVyKG1lYXN1cmVyKTsKfQoKY2xhc3MgTWVhc3VyZXIgewogIC8vLyBNZWFzdXJlcyB0aGUgdG90YWwgcnVudGltZSBmcm9tIHRoaXMgb2JqZWN0IHdhcyBjb25zdHJ1Y3RlZC4KICAvLy8KICAvLy8gTm90ZTogTVVTVCBiZSB0aGUgZmlyc3QgZmllbGQgb2YgdGhpcyBjbGFzcyB0byBlbnN1cmUgW3dhbGxjbG9ja10gaXMKICAvLy8gc3RhcnRlZCBiZWZvcmUgb3RoZXIgY29tcHV0YXRpb25zLgogIGZpbmFsIFN0b3B3YXRjaCBfd2FsbENsb2NrID0gbmV3IFN0b3B3YXRjaCgpLi5zdGFydCgpOwoKICBEdXJhdGlvbiBnZXQgZWxhcHNlZFdhbGxDbG9jayA9PiBfd2FsbENsb2NrLmVsYXBzZWQ7CgogIC8vLyBNZWFzdXJlcyBnYXBzIGJldHdlZW4gem9uZWQgY2xvc3VyZXMgZHVlIHRvIGFzeW5jaHJvbmljaXR5LgogIGZpbmFsIFN0b3B3YXRjaCBfYXN5bmNXYWxsQ2xvY2sgPSBuZXcgU3RvcHdhdGNoKCk7CgogIER1cmF0aW9uIGdldCBlbGFwc2VkQXN5bmNXYWxsQ2xvY2sgPT4gX2FzeW5jV2FsbENsb2NrLmVsYXBzZWQ7CgogIC8vLyBXaGV0aGVyIG1lYXN1cmVtZW50IG9mIHRhc2tzIGlzIGVuYWJsZWQuCiAgZmluYWwgYm9vbCBlbmFibGVUYXNrTWVhc3VyZW1lbnRzOwoKICBzdGF0aWMgaW50IF9oYXNoQ29kZUdlbmVyYXRvciA9IDE5NzsKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgaGFzaENvZGUgPSBfaGFzaENvZGVHZW5lcmF0b3IrKzsKCiAgTWVhc3VyZXIoe3RoaXMuZW5hYmxlVGFza01lYXN1cmVtZW50czogZmFsc2V9KTsKCiAgLy8vIFRoZSBjdXJyZW50bHkgcnVubmluZyB0YXNrLCB0aGF0IGlzLCB0aGUgdGFzayB3aG9zZSBbU3RvcHdhdGNoXSBpcwogIC8vLyBjdXJyZW50bHkgcnVubmluZy4KICBDb21waWxlclRhc2sgX2N1cnJlbnRUYXNrOwoKICAvLy8gVGhlIGN1cnJlbnQgdGFzayB3aGljaCBzaG91bGQgYmUgY2hhcmdlZCBmb3IgYXN5bmNocm9ub3VzIGdhcHMuCiAgQ29tcGlsZXJUYXNrIF9jdXJyZW50QXN5bmNUYXNrOwoKICAvLy8gU3RhcnQgY291bnRpbmcgdGhlIHRvdGFsIGVsYXBzZWQgdGltZSBzaW5jZSB0aGUgY29tcGlsZXIgc3RhcnRlZC4KICB2b2lkIHN0YXJ0V2FsbENsb2NrKCkgewogICAgX3dhbGxDbG9jay5zdGFydCgpOwogIH0KCiAgLy8vIFN0YXJ0IGNvdW50aW5nIHRoZSB0b3RhbCBlbGFwc2VkIHRpbWUgc2luY2UgdGhlIGNvbXBpbGVyIHN0YXJ0ZWQuCiAgdm9pZCBzdG9wV2FsbENsb2NrKCkgewogICAgX3dhbGxDbG9jay5zdG9wKCk7CiAgfQoKICAvLy8gQ2FsbCB0aGlzIGJlZm9yZSByZXR1cm5pbmcgdG8gdGhlIGV2ZW50bG9vcC4KICB2b2lkIHN0YXJ0QXN5bmNXYWxsQ2xvY2soKSB7CiAgICBpZiAoX2N1cnJlbnRBc3luY1Rhc2sgIT0gbnVsbCkgewogICAgICBfY3VycmVudEFzeW5jVGFzay5fd2F0Y2guc3RhcnQoKTsKICAgIH0gZWxzZSB7CiAgICAgIF9hc3luY1dhbGxDbG9jay5zdGFydCgpOwogICAgfQogIH0KCiAgLy8vIENhbGwgdGhpcyB3aGVuIHRoZSBldmVudGxvb3AgcmV0dXJucyBjb250cm9sIHRvIHVzLgogIHZvaWQgc3RvcEFzeW5jV2FsbENsb2NrKCkgewogICAgaWYgKF9jdXJyZW50QXN5bmNUYXNrICE9IG51bGwpIHsKICAgICAgX2N1cnJlbnRBc3luY1Rhc2suX3dhdGNoLnN0b3AoKTsKICAgIH0KICAgIF9hc3luY1dhbGxDbG9jay5zdG9wKCk7CiAgfQp9CoEUAE5OPAEeARRCATkET1EqKx4cGkYBFwFOGigTAR9MAU81KgE0Bk8gOwEzARMfLDQfBhIEARorJTQhBhIEAUtODk4BTTIaIjQjMkoSJBQVBAFMMyYdExwfDUtGJwYnBAEjTlBPDgEcATo6ARw3SUUEAU5LTE1NTjBAPSYKIhAXBgQBPxVGRyYKLBAXBgQBSUUpSyYKMBAXBgQBT00UBkpJMi8mAS8qNjVOBhMtFUAIBAFQKzEmAVBMOVAkBAFPTRQGSkkyQyYBUEw5UCYEATMBQwFMAgEpDBU/AgERQwZLKTkBNwFCNQFBAS8lAScMLQEyAUkZHQFGIgFIGhgEAUgZFwQBMx8lKA0fBgQBOh4lJwYcBAIBJnBhY2thZ2U6Y29tcGlsZXIvc3JjL2NvbW1vbi90YXNrcy5kYXJ0KXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2NvbW1vbi5kYXJ0g1gvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIExpYnJhcnkgdGhhdCByZS1leHBvcnRzIGxpYnJhcmllcyB1c2VkIHRocm91Z2hvdXQgdGhlIGNvbXBpbGVyIHJlZ2FyZGxlc3MKLy8vIG9mIHBoYXNlIG9yIHN1YmZ1bmN0aW9uYWxpdHkuCmxpYnJhcnkgZGFydDJqcy5jb21tb247CgpleHBvcnQgJ2RpYWdub3N0aWNzL2RpYWdub3N0aWNfbGlzdGVuZXIuZGFydCcKICAgIHNob3cgRGlhZ25vc3RpY01lc3NhZ2UsIERpYWdub3N0aWNSZXBvcnRlcjsKZXhwb3J0ICdkaWFnbm9zdGljcy9pbnZhcmlhbnQuZGFydCcgc2hvdyBhc3NlcnREZWJ1Z01vZGUsIGZhaWxlZEF0OwpleHBvcnQgJ2RpYWdub3N0aWNzL21lc3NhZ2VzLmRhcnQnIHNob3cgTWVzc2FnZUtpbmQ7CmV4cG9ydCAnZGlhZ25vc3RpY3Mvc291cmNlX3NwYW4uZGFydCcgc2hvdyBTb3VyY2VTcGFuOwpleHBvcnQgJ2RpYWdub3N0aWNzL3NwYW5uYWJsZS5kYXJ0JwogICAgc2hvdwogICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgTk9fTE9DQVRJT05fU1BBTk5BQkxFLAogICAgICAgIFNwYW5uYWJsZSwKICAgICAgICBTcGFubmFibGVBc3NlcnRpb25GYWlsdXJlOwpleHBvcnQgJ2hlbHBlcnMvaGVscGVycy5kYXJ0JzsKCmJvb2wgcmV0YWluRGF0YUZvclRlc3RpbmcgPSBmYWxzZTsKGABOTjwBTiIYAS4wRDU3JAkjHxMjHwEjASBwYWNrYWdlOmNvbXBpbGVyL3NyYy9jb21tb24uZGFydCtzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9jb21waWxlci5kYXJ0wACOxi8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuY29tcGlsZXJfYmFzZTsKCmltcG9ydCAnZGFydDphc3luYycgc2hvdyBGdXR1cmU7CgppbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfdW5zdGFibGUvZGFydDJqcy5kYXJ0JwogICAgc2hvdyBjbGVhclN0cmluZ1Rva2VuQ2Fub25pY2FsaXplcjsKCmltcG9ydCAnLi4vY29tcGlsZXJfbmV3LmRhcnQnIGFzIGFwaTsKaW1wb3J0ICdiYWNrZW5kX3N0cmF0ZWd5LmRhcnQnOwppbXBvcnQgJ2NvbW1vbi9uYW1lcy5kYXJ0JyBzaG93IFNlbGVjdG9ycywgVXJpczsKaW1wb3J0ICdjb21tb24vdGFza3MuZGFydCcgc2hvdyBDb21waWxlclRhc2ssIEdlbmVyaWNUYXNrLCBNZWFzdXJlcjsKaW1wb3J0ICdjb21tb24vd29yay5kYXJ0JyBzaG93IFdvcmtJdGVtOwppbXBvcnQgJ2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICdjb21waWxlX3RpbWVfY29uc3RhbnRzLmRhcnQnOwppbXBvcnQgJ2NvbW1vbl9lbGVtZW50cy5kYXJ0JyBzaG93IEVsZW1lbnRFbnZpcm9ubWVudDsKaW1wb3J0ICdkZWZlcnJlZF9sb2FkLmRhcnQnIHNob3cgRGVmZXJyZWRMb2FkVGFzaywgT3V0cHV0VW5pdERhdGE7CmltcG9ydCAnZGlhZ25vc3RpY3MvY29kZV9sb2NhdGlvbi5kYXJ0JzsKaW1wb3J0ICdkaWFnbm9zdGljcy9kaWFnbm9zdGljX2xpc3RlbmVyLmRhcnQnIHNob3cgRGlhZ25vc3RpY1JlcG9ydGVyOwppbXBvcnQgJ2RpYWdub3N0aWNzL21lc3NhZ2VzLmRhcnQnIHNob3cgTWVzc2FnZSwgTWVzc2FnZVRlbXBsYXRlOwppbXBvcnQgJ2R1bXBfaW5mby5kYXJ0JyBzaG93IER1bXBJbmZvVGFzazsKaW1wb3J0ICdlbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICdlbnF1ZXVlLmRhcnQnIHNob3cgRW5xdWV1ZXIsIEVucXVldWVUYXNrLCBSZXNvbHV0aW9uRW5xdWV1ZXI7CmltcG9ydCAnZW52aXJvbm1lbnQuZGFydCc7CmltcG9ydCAnZnJvbnRlbmRfc3RyYXRlZ3kuZGFydCc7CmltcG9ydCAnaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnIHNob3cgQWJzdHJhY3RWYWx1ZVN0cmF0ZWd5OwppbXBvcnQgJ2luZmVycmVyL3RyaXZpYWwuZGFydCcgc2hvdyBUcml2aWFsQWJzdHJhY3RWYWx1ZVN0cmF0ZWd5OwppbXBvcnQgJ2luZmVycmVyL3R5cGVtYXNrcy9tYXNrcy5kYXJ0JyBzaG93IFR5cGVNYXNrU3RyYXRlZ3k7CmltcG9ydCAnaW5mZXJyZXIvdHlwZXMuZGFydCcKICAgIHNob3cgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMsIEdsb2JhbFR5cGVJbmZlcmVuY2VUYXNrOwppbXBvcnQgJ2lvL3NvdXJjZV9pbmZvcm1hdGlvbi5kYXJ0JyBzaG93IFNvdXJjZUluZm9ybWF0aW9uOwppbXBvcnQgJ2pzX2JhY2tlbmQvYmFja2VuZC5kYXJ0JyBzaG93IEphdmFTY3JpcHRCYWNrZW5kOwppbXBvcnQgJ2pzX2JhY2tlbmQvaW5mZXJyZWRfZGF0YS5kYXJ0JzsKaW1wb3J0ICdqc19tb2RlbC9qc19zdHJhdGVneS5kYXJ0JzsKaW1wb3J0ICdrZXJuZWwva2VybmVsX3N0cmF0ZWd5LmRhcnQnOwppbXBvcnQgJ2tlcm5lbC9sb2FkZXIuZGFydCcgc2hvdyBLZXJuZWxMb2FkZXJUYXNrLCBLZXJuZWxSZXN1bHQ7CmltcG9ydCAnbnVsbF9jb21waWxlcl9vdXRwdXQuZGFydCcgc2hvdyBOdWxsQ29tcGlsZXJPdXRwdXQ7CmltcG9ydCAnb3B0aW9ucy5kYXJ0JyBzaG93IENvbXBpbGVyT3B0aW9ucywgRGlhZ25vc3RpY09wdGlvbnM7CmltcG9ydCAnc2VyaWFsaXphdGlvbi90YXNrLmRhcnQnOwppbXBvcnQgJ3NlcmlhbGl6YXRpb24vc3RyYXRlZ2llcy5kYXJ0JzsKaW1wb3J0ICdzc2Evbm9kZXMuZGFydCcgc2hvdyBISW5zdHJ1Y3Rpb247CmltcG9ydCAndW5pdmVyc2Uvc2VsZWN0b3IuZGFydCcgc2hvdyBTZWxlY3RvcjsKaW1wb3J0ICd1bml2ZXJzZS9jb2RlZ2VuX3dvcmxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAndW5pdmVyc2UvcmVzb2x1dGlvbl93b3JsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3VuaXZlcnNlL3dvcmxkX2ltcGFjdC5kYXJ0JwogICAgc2hvdyBJbXBhY3RTdHJhdGVneSwgV29ybGRJbXBhY3QsIFdvcmxkSW1wYWN0QnVpbGRlckltcGw7CmltcG9ydCAnd29ybGQuZGFydCcgc2hvdyBKQ2xvc2VkV29ybGQsIEtDbG9zZWRXb3JsZDsKCnR5cGVkZWYgQ29tcGlsZXJEaWFnbm9zdGljUmVwb3J0ZXIgTWFrZVJlcG9ydGVyRnVuY3Rpb24oCiAgICBDb21waWxlciBjb21waWxlciwgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMpOwoKYWJzdHJhY3QgY2xhc3MgQ29tcGlsZXIgewogIE1lYXN1cmVyIGdldCBtZWFzdXJlcjsKCiAgYXBpLkNvbXBpbGVySW5wdXQgZ2V0IHByb3ZpZGVyOwoKICBGcm9udGVuZFN0cmF0ZWd5IGZyb250ZW5kU3RyYXRlZ3k7CiAgQmFja2VuZFN0cmF0ZWd5IGJhY2tlbmRTdHJhdGVneTsKICBDb21waWxlckRpYWdub3N0aWNSZXBvcnRlciBfcmVwb3J0ZXI7CiAgTWFwPEVudGl0eSwgV29ybGRJbXBhY3Q+IF9pbXBhY3RDYWNoZTsKICBJbXBhY3RDYWNoZURlbGV0ZXIgX2ltcGFjdENhY2hlRGVsZXRlcjsKCiAgSW1wYWN0U3RyYXRlZ3kgaW1wYWN0U3RyYXRlZ3kgPSBjb25zdCBJbXBhY3RTdHJhdGVneSgpOwoKICAvLy8gT3B0aW9ucyBwcm92aWRlZCBmcm9tIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnM7CgogIC8vIFRoZXNlIGludGVybmFsIGZsYWdzIGFyZSB1c2VkIHRvIHN0b3AgY29tcGlsYXRpb24gYWZ0ZXIgYSBzcGVjaWZpYyBwaGFzZS4KICAvLyBVc2VkIG9ubHkgZm9yIGRlYnVnZ2luZyBhbmQgdGVzdGluZyBwdXJwb3NlcyBvbmx5LgogIGJvb2wgc3RvcEFmdGVyQ2xvc2VkV29ybGQgPSBmYWxzZTsKICBib29sIHN0b3BBZnRlclR5cGVJbmZlcmVuY2UgPSBmYWxzZTsKCiAgLy8vIE91dHB1dCBwcm92aWRlciBmcm9tIHVzZXIgb2YgQ29tcGlsZXIgQVBJLgogIGFwaS5Db21waWxlck91dHB1dCBfb3V0cHV0UHJvdmlkZXI7CgogIGFwaS5Db21waWxlck91dHB1dCBnZXQgb3V0cHV0UHJvdmlkZXIgPT4gX291dHB1dFByb3ZpZGVyOwoKICBMaXN0PENvZGVMb2NhdGlvbj4gX3VzZXJDb2RlTG9jYXRpb25zID0gPENvZGVMb2NhdGlvbj5bXTsKCiAgSkNsb3NlZFdvcmxkIGJhY2tlbmRDbG9zZWRXb3JsZEZvclRlc3Rpbmc7CgogIERpYWdub3N0aWNSZXBvcnRlciBnZXQgcmVwb3J0ZXIgPT4gX3JlcG9ydGVyOwogIE1hcDxFbnRpdHksIFdvcmxkSW1wYWN0PiBnZXQgaW1wYWN0Q2FjaGUgPT4gX2ltcGFjdENhY2hlOwogIEltcGFjdENhY2hlRGVsZXRlciBnZXQgaW1wYWN0Q2FjaGVEZWxldGVyID0+IF9pbXBhY3RDYWNoZURlbGV0ZXI7CgogIC8vIFRPRE8oemFyYWgpOiBSZW1vdmUgdGhpcyBtYXAgYW5kIGluY29ycG9yYXRlIGNvbXBpbGUtdGltZSBlcnJvcnMKICAvLyBpbiB0aGUgbW9kZWwuCiAgLy8vIFRyYWNrcyBlbGVtZW50cyB3aXRoIGNvbXBpbGUtdGltZSBlcnJvcnMuCiAgZmluYWwgTWFwPEVudGl0eSwgTGlzdDxEaWFnbm9zdGljTWVzc2FnZT4+IGVsZW1lbnRzV2l0aENvbXBpbGVUaW1lRXJyb3JzID0KICAgICAgbmV3IE1hcDxFbnRpdHksIExpc3Q8RGlhZ25vc3RpY01lc3NhZ2U+PigpOwoKICBmaW5hbCBFbnZpcm9ubWVudCBlbnZpcm9ubWVudDsKICAvLyBUT0RPKHNpZ211bmQpOiBkZWxldGUgb25jZSB3ZSBtaWdyYXRlIHRoZSByZXN0IG9mIHRoZSBjb21waWxlciB0byB1c2UKICAvLyBgZW52aXJvbm1lbnRgIGRpcmVjdGx5LgogIEBkZXByZWNhdGVkCiAgZnJvbUVudmlyb25tZW50KFN0cmluZyBuYW1lKSA9PiBlbnZpcm9ubWVudC52YWx1ZU9mKG5hbWUpOwoKICBFbnRpdHkgZ2V0IGN1cnJlbnRFbGVtZW50ID0+IF9yZXBvcnRlci5jdXJyZW50RWxlbWVudDsKCiAgTGlzdDxDb21waWxlclRhc2s+IHRhc2tzOwogIEtlcm5lbExvYWRlclRhc2sga2VybmVsTG9hZGVyOwogIEdsb2JhbFR5cGVJbmZlcmVuY2VUYXNrIGdsb2JhbEluZmVyZW5jZTsKICBKYXZhU2NyaXB0QmFja2VuZCBiYWNrZW5kOwogIENvZGVnZW5Xb3JsZEJ1aWxkZXIgX2NvZGVnZW5Xb3JsZEJ1aWxkZXI7CgogIEFic3RyYWN0VmFsdWVTdHJhdGVneSBhYnN0cmFjdFZhbHVlU3RyYXRlZ3k7CgogIEdlbmVyaWNUYXNrIHNlbGZUYXNrOwoKICAvLy8gVGhlIGNvbnN0YW50IGVudmlyb25tZW50IGZvciB0aGUgZnJvbnRlbmQgaW50ZXJwcmV0YXRpb24gb2YgY29tcGlsZS10aW1lCiAgLy8vIGNvbnN0YW50cy4KICBDb25zdGFudEVudmlyb25tZW50IGNvbnN0YW50czsKCiAgRW5xdWV1ZVRhc2sgZW5xdWV1ZXI7CiAgRGVmZXJyZWRMb2FkVGFzayBkZWZlcnJlZExvYWRUYXNrOwogIER1bXBJbmZvVGFzayBkdW1wSW5mb1Rhc2s7CiAgU2VyaWFsaXphdGlvblRhc2sgc2VyaWFsaXphdGlvblRhc2s7CgogIGJvb2wgZ2V0IGhhc0NyYXNoZWQgPT4gX3JlcG9ydGVyLmhhc0NyYXNoZWQ7CgogIFByb2dyZXNzIHByb2dyZXNzID0gY29uc3QgUHJvZ3Jlc3MoKTsKCiAgc3RhdGljIGNvbnN0IGludCBQSEFTRV9TQ0FOTklORyA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBQSEFTRV9SRVNPTFZJTkcgPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgUEhBU0VfRE9ORV9SRVNPTFZJTkcgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgUEhBU0VfQ09NUElMSU5HID0gMzsKICBpbnQgcGhhc2U7CgogIGJvb2wgY29tcGlsYXRpb25GYWlsZWQgPSBmYWxzZTsKCiAgLy8gQ2FsbGJhY2sgZnVuY3Rpb24gdXNlZCBmb3IgdGVzdGluZyByZXNvbHV0aW9uIGVucXVldWluZy4KICB2b2lkIEZ1bmN0aW9uKCkgb25SZXNvbHV0aW9uUXVldWVFbXB0eUZvclRlc3Rpbmc7CgogIC8vIENhbGxiYWNrIGZ1bmN0aW9uIHVzZWQgZm9yIHRlc3RpbmcgY29kZWdlbiBlbnF1ZXVpbmcuCiAgdm9pZCBGdW5jdGlvbigpIG9uQ29kZWdlblF1ZXVlRW1wdHlGb3JUZXN0aW5nOwoKICBDb21waWxlcigKICAgICAge0NvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgICBhcGkuQ29tcGlsZXJPdXRwdXQgb3V0cHV0UHJvdmlkZXIsCiAgICAgIHRoaXMuZW52aXJvbm1lbnQ6IGNvbnN0IF9FbXB0eUVudmlyb25tZW50KCksCiAgICAgIE1ha2VSZXBvcnRlckZ1bmN0aW9uIG1ha2VSZXBvcnRlcn0pCiAgICAgIDogdGhpcy5vcHRpb25zID0gb3B0aW9ucyB7CiAgICBvcHRpb25zLmRlcml2ZU9wdGlvbnMoKTsKICAgIG9wdGlvbnMudmFsaWRhdGUoKTsKCiAgICBhYnN0cmFjdFZhbHVlU3RyYXRlZ3kgPSBvcHRpb25zLnVzZVRyaXZpYWxBYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgPyBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZVN0cmF0ZWd5KCkKICAgICAgICA6IGNvbnN0IFR5cGVNYXNrU3RyYXRlZ3koKTsKICAgIENvbXBpbGVyVGFzayBrZXJuZWxGcm9udEVuZFRhc2s7CiAgICBzZWxmVGFzayA9IG5ldyBHZW5lcmljVGFzaygnc2VsZicsIG1lYXN1cmVyKTsKICAgIF9vdXRwdXRQcm92aWRlciA9IG5ldyBfQ29tcGlsZXJPdXRwdXQodGhpcywgb3V0cHV0UHJvdmlkZXIpOwogICAgaWYgKG1ha2VSZXBvcnRlciAhPSBudWxsKSB7CiAgICAgIF9yZXBvcnRlciA9IG1ha2VSZXBvcnRlcih0aGlzLCBvcHRpb25zKTsKICAgIH0gZWxzZSB7CiAgICAgIF9yZXBvcnRlciA9IG5ldyBDb21waWxlckRpYWdub3N0aWNSZXBvcnRlcih0aGlzLCBvcHRpb25zKTsKICAgIH0KICAgIGtlcm5lbEZyb250RW5kVGFzayA9IG5ldyBHZW5lcmljVGFzaygnRnJvbnQgZW5kJywgbWVhc3VyZXIpOwogICAgZnJvbnRlbmRTdHJhdGVneSA9IG5ldyBLZXJuZWxGcm9udEVuZFN0cmF0ZWd5KAogICAgICAgIGtlcm5lbEZyb250RW5kVGFzaywgb3B0aW9ucywgcmVwb3J0ZXIsIGVudmlyb25tZW50KTsKICAgIGJhY2tlbmRTdHJhdGVneSA9IG5ldyBKc0JhY2tlbmRTdHJhdGVneSh0aGlzKTsKICAgIF9pbXBhY3RDYWNoZSA9IDxFbnRpdHksIFdvcmxkSW1wYWN0Pnt9OwogICAgX2ltcGFjdENhY2hlRGVsZXRlciA9IG5ldyBfTWFwSW1wYWN0Q2FjaGVEZWxldGVyKF9pbXBhY3RDYWNoZSk7CgogICAgaWYgKG9wdGlvbnMuc2hvd0ludGVybmFsUHJvZ3Jlc3MpIHsKICAgICAgcHJvZ3Jlc3MgPSBuZXcgSW50ZXJhY3RpdmVQcm9ncmVzcygpOwogICAgfQoKICAgIGJhY2tlbmQgPSBjcmVhdGVCYWNrZW5kKCk7CiAgICBlbnF1ZXVlciA9IGJhY2tlbmQubWFrZUVucXVldWVyKCk7CgogICAgdGFza3MgPSBbCiAgICAgIGtlcm5lbExvYWRlciA9IG5ldyBLZXJuZWxMb2FkZXJUYXNrKAogICAgICAgICAgb3B0aW9ucywgcHJvdmlkZXIsIF9vdXRwdXRQcm92aWRlciwgcmVwb3J0ZXIsIG1lYXN1cmVyKSwKICAgICAga2VybmVsRnJvbnRFbmRUYXNrLAogICAgICBnbG9iYWxJbmZlcmVuY2UgPSBuZXcgR2xvYmFsVHlwZUluZmVyZW5jZVRhc2sodGhpcyksCiAgICAgIGNvbnN0YW50cyA9IGJhY2tlbmQuY29uc3RhbnRDb21waWxlclRhc2ssCiAgICAgIGRlZmVycmVkTG9hZFRhc2sgPSBmcm9udGVuZFN0cmF0ZWd5LmNyZWF0ZURlZmVycmVkTG9hZFRhc2sodGhpcyksCiAgICAgIC8vIFtlbnF1ZXVlcl0gaXMgY3JlYXRlZCBlYXJsaWVyIGJlY2F1c2UgaXQgY29udGFpbnMgdGhlIHJlc29sdXRpb24gd29ybGQKICAgICAgLy8gb2JqZWN0cyBuZWVkZWQgYnkgb3RoZXIgdGFza3MuCiAgICAgIGVucXVldWVyLAogICAgICBkdW1wSW5mb1Rhc2sgPSBuZXcgRHVtcEluZm9UYXNrKHRoaXMpLAogICAgICBzZWxmVGFzaywKICAgICAgc2VyaWFsaXphdGlvblRhc2sgPSBuZXcgU2VyaWFsaXphdGlvblRhc2sodGhpcywgbWVhc3VyZXIpLAogICAgXTsKCiAgICB0YXNrcy5hZGRBbGwoYmFja2VuZC50YXNrcyk7CiAgfQoKICAvLy8gQ3JlYXRlcyB0aGUgYmFja2VuZC4KICAvLy8KICAvLy8gT3ZlcnJpZGUgdGhpcyB0byBtb2NrIHRoZSBiYWNrZW5kIGZvciB0ZXN0aW5nLgogIEphdmFTY3JpcHRCYWNrZW5kIGNyZWF0ZUJhY2tlbmQoKSB7CiAgICByZXR1cm4gbmV3IEphdmFTY3JpcHRCYWNrZW5kKHRoaXMsCiAgICAgICAgZ2VuZXJhdGVTb3VyY2VNYXA6IG9wdGlvbnMuZ2VuZXJhdGVTb3VyY2VNYXAsCiAgICAgICAgdXNlTXVsdGlTb3VyY2VJbmZvOiBvcHRpb25zLnVzZU11bHRpU291cmNlSW5mbywKICAgICAgICB1c2VOZXdTb3VyY2VJbmZvOiBvcHRpb25zLnVzZU5ld1NvdXJjZUluZm8pOwogIH0KCiAgUmVzb2x1dGlvbldvcmxkQnVpbGRlciBnZXQgcmVzb2x1dGlvbldvcmxkQnVpbGRlciA9PgogICAgICBlbnF1ZXVlci5yZXNvbHV0aW9uLndvcmxkQnVpbGRlcjsKCiAgQ29kZWdlbldvcmxkQnVpbGRlciBnZXQgY29kZWdlbldvcmxkQnVpbGRlciB7CiAgICBhc3NlcnQoCiAgICAgICAgX2NvZGVnZW5Xb3JsZEJ1aWxkZXIgIT0gbnVsbCwKICAgICAgICBmYWlsZWRBdChOT19MT0NBVElPTl9TUEFOTkFCTEUsCiAgICAgICAgICAgICJDb2RlZ2VuV29ybGRCdWlsZGVyIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldC4iKSk7CiAgICByZXR1cm4gX2NvZGVnZW5Xb3JsZEJ1aWxkZXI7CiAgfQoKICBib29sIGdldCBkaXNhYmxlVHlwZUluZmVyZW5jZSA9PgogICAgICBvcHRpb25zLmRpc2FibGVUeXBlSW5mZXJlbmNlIHx8IGNvbXBpbGF0aW9uRmFpbGVkOwoKICAvLyBDb21waWxlcyB0aGUgZGFydCBzY3JpcHQgYXQgW3VyaV0uCiAgLy8KICAvLyBUaGUgcmVzdWx0aW5nIGZ1dHVyZSB3aWxsIGNvbXBsZXRlIHdpdGggdHJ1ZSBpZiB0aGUgY29tcGlsYXRpb24KICAvLyBzdWNjZWVkZWQuCiAgRnV0dXJlPGJvb2w+IHJ1bihVcmkgdXJpKSA9PiBzZWxmVGFzay5tZWFzdXJlU3VidGFzaygicnVuIiwgKCkgewogICAgICAgIG1lYXN1cmVyLnN0YXJ0V2FsbENsb2NrKCk7CgogICAgICAgIHJldHVybiBuZXcgRnV0dXJlLnN5bmMoKCkgPT4gcnVuSW50ZXJuYWwodXJpKSkKICAgICAgICAgICAgLmNhdGNoRXJyb3IoKGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpID0+CiAgICAgICAgICAgICAgICBfcmVwb3J0ZXIub25FcnJvcih1cmksIGVycm9yLCBzdGFja1RyYWNlKSkKICAgICAgICAgICAgLndoZW5Db21wbGV0ZSgoKSB7CiAgICAgICAgICBtZWFzdXJlci5zdG9wV2FsbENsb2NrKCk7CiAgICAgICAgfSkudGhlbigoXykgewogICAgICAgICAgcmV0dXJuICFjb21waWxhdGlvbkZhaWxlZDsKICAgICAgICB9KTsKICAgICAgfSk7CgogIEZ1dHVyZSBydW5JbnRlcm5hbChVcmkgdXJpKSBhc3luYyB7CiAgICBjbGVhclN0YXRlKCk7CiAgICBhc3NlcnQodXJpICE9IG51bGwpOwogICAgLy8gQXMgZmFyIGFzIEkgY2FuIHRlbGwsIHRoaXMgYnJhbmNoIGlzIG9ubHkgdXNlZCBieSB0ZXN0IGNvZGUuCiAgICByZXBvcnRlci5sb2coJ0NvbXBpbGluZyAkdXJpICgke29wdGlvbnMuYnVpbGRJZH0pJyk7CgogICAgaWYgKG9wdGlvbnMucmVhZERhdGFVcmkgIT0gbnVsbCkgewogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzID0KICAgICAgICAgIGF3YWl0IHNlcmlhbGl6YXRpb25UYXNrLmRlc2VyaWFsaXplKCk7CiAgICAgIGlmIChvcHRpb25zLmRlYnVnR2xvYmFsSW5mZXJlbmNlKSB7CiAgICAgICAgcGVyZm9ybUdsb2JhbFR5cGVJbmZlcmVuY2UocmVzdWx0cy5jbG9zZWRXb3JsZCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGdlbmVyYXRlSmF2YVNjcmlwdENvZGUocmVzdWx0cyk7CiAgICB9IGVsc2UgewogICAgICBLZXJuZWxSZXN1bHQgcmVzdWx0ID0gYXdhaXQga2VybmVsTG9hZGVyLmxvYWQodXJpKTsKICAgICAgcmVwb3J0ZXIubG9nKCJLZXJuZWwgbG9hZCBjb21wbGV0ZSIpOwogICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJldHVybjsKICAgICAgaWYgKGNvbXBpbGF0aW9uRmFpbGVkICYmICFvcHRpb25zLmdlbmVyYXRlQ29kZVdpdGhDb21waWxlVGltZUVycm9ycykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAob3B0aW9ucy5jZmVPbmx5KSByZXR1cm47CgogICAgICBmcm9udGVuZFN0cmF0ZWd5LnJlZ2lzdGVyTG9hZGVkTGlicmFyaWVzKHJlc3VsdCk7CiAgICAgIGZvciAoVXJpIHVyaSBpbiByZXN1bHQubGlicmFyaWVzKSB7CiAgICAgICAgTGlicmFyeUVudGl0eSBsaWJyYXJ5ID0KICAgICAgICAgICAgZnJvbnRlbmRTdHJhdGVneS5lbGVtZW50RW52aXJvbm1lbnQubG9va3VwTGlicmFyeSh1cmkpOwogICAgICAgIGJhY2tlbmQuc2V0QW5ub3RhdGlvbnMobGlicmFyeSk7CiAgICAgIH0KCiAgICAgIC8vIFRPRE8oZWZvcnR1bmEsIHNpZ211bmQpOiBUaGVzZSB2YWxpZGF0aW9uIHN0ZXBzIHNob3VsZCBiZSBkb25lIGluIHRoZQogICAgICAvLyBmcm9udCBlbmQgZm9yIHRoZSBLZXJuZWwgcGF0aCBzaW5jZSBLZXJuZWwgZG9lc24ndCBoYXZlIHRoZSBub3Rpb24gb2YKICAgICAgLy8gaW1wb3J0cyAoZXZlcnl0aGluZyBoYXMgYWxyZWFkeSBiZWVuIHJlc29sdmVkKS4gKFNlZQogICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMjkzNjgpCiAgICAgIGlmIChyZXN1bHQubGlicmFyaWVzLmNvbnRhaW5zKFVyaXMuZGFydF9taXJyb3JzKSkgewogICAgICAgIHJlcG9ydGVyLnJlcG9ydFdhcm5pbmdNZXNzYWdlKE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwKICAgICAgICAgICAgTWVzc2FnZUtpbmQuTUlSUk9SU19MSUJSQVJZX05PVF9TVVBQT1JUX1dJVEhfQ0ZFKTsKICAgICAgfQoKICAgICAgYXdhaXQgY29tcGlsZUZyb21LZXJuZWwocmVzdWx0LnJvb3RMaWJyYXJ5VXJpLCByZXN1bHQubGlicmFyaWVzKTsKICAgIH0KICB9CgogIC8vLyBDbGVhciB0aGUgaW50ZXJuYWwgY29tcGlsZXIgc3RhdGUgdG8gcHJldmVudCBtZW1vcnkgbGVha3Mgd2hlbiBpbnZva2luZwogIC8vLyB0aGUgY29tcGlsZXIgbXVsdGlwbGUgdGltZXMgKGUuZy4gaW4gYmF0Y2ggbW9kZSkuCiAgLy8gVE9ETyhhaGUpOiBpbXBsZW1lbnQgYSBiZXR0ZXIgbWVjaGFuaXNtIHdoZXJlIHdlIGNhbiBzdG9yZQogIC8vIHN1Y2ggY2FjaGVzIGluIHRoZSBjb21waWxlciBhbmQgZ2V0IGFjY2VzcyB0byB0aGVtIHRocm91Z2ggYQogIC8vIHN1aXRhYmx5IG1haW50YWluZWQgc3RhdGljIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBjb21waWxlci4KICB2b2lkIGNsZWFyU3RhdGUoKSB7CiAgICBjbGVhclN0cmluZ1Rva2VuQ2Fub25pY2FsaXplcigpOwogICAgU2VsZWN0b3IuY2Fub25pY2FsaXplZFZhbHVlcy5jbGVhcigpOwoKICAgIC8vIFRoZSBzZWxlY3RvciBvYmplY3RzIGhlbGQgaW4gc3RhdGljIGZpZWxkcyBtdXN0IHJlbWFpbiBjYW5vbmljYWwuCiAgICBmb3IgKFNlbGVjdG9yIHNlbGVjdG9yIGluIFNlbGVjdG9ycy5BTEwpIHsKICAgICAgU2VsZWN0b3IuY2Fub25pY2FsaXplZFZhbHVlcwogICAgICAgICAgLnB1dElmQWJzZW50KHNlbGVjdG9yLmhhc2hDb2RlLCAoKSA9PiA8U2VsZWN0b3I+W10pCiAgICAgICAgICAuYWRkKHNlbGVjdG9yKTsKICAgIH0KICB9CgogIC8vLyBTdGFydHMgdGhlIHJlc29sdXRpb24gcGhhc2UsIGNyZWF0aW5nIHRoZSBbUmVzb2x1dGlvbkVucXVldWVyXSBpZiBub3QKICAvLy8gYWxyZWFkeSBjcmVhdGVkLgogIC8vLwogIC8vLyBEdXJpbmcgbm9ybWFsIGNvbXBpbGF0aW9uIHJlc29sdXRpb24gb25seSBzdGFydGVkIG9uY2UsIGJ1dCB0aHJvdWdoCiAgLy8vIFthbmFseXplVXJpXSByZXNvbHV0aW9uIGlzIHN0YXJ0ZWQgcmVwZWF0ZWRseS4KICBSZXNvbHV0aW9uRW5xdWV1ZXIgc3RhcnRSZXNvbHV0aW9uKCkgewogICAgUmVzb2x1dGlvbkVucXVldWVyIHJlc29sdXRpb25FbnF1ZXVlcjsKICAgIGlmIChlbnF1ZXVlci5oYXNSZXNvbHV0aW9uKSB7CiAgICAgIHJlc29sdXRpb25FbnF1ZXVlciA9IGVucXVldWVyLnJlc29sdXRpb247CiAgICB9IGVsc2UgewogICAgICByZXNvbHV0aW9uRW5xdWV1ZXIgPSBlbnF1ZXVlci5jcmVhdGVSZXNvbHV0aW9uRW5xdWV1ZXIoKTsKICAgICAgYmFja2VuZC5vblJlc29sdXRpb25TdGFydCgpOwogICAgfQogICAgcmV0dXJuIHJlc29sdXRpb25FbnF1ZXVlcjsKICB9CgogIEpDbG9zZWRXb3JsZCBjb21wdXRlQ2xvc2VkV29ybGQoVXJpIHJvb3RMaWJyYXJ5VXJpLCBJdGVyYWJsZTxVcmk+IGxpYnJhcmllcykgewogICAgUmVzb2x1dGlvbkVucXVldWVyIHJlc29sdXRpb25FbnF1ZXVlciA9IHN0YXJ0UmVzb2x1dGlvbigpOwogICAgZm9yIChMaWJyYXJ5RW50aXR5IGxpYnJhcnkKICAgICAgICBpbiBmcm9udGVuZFN0cmF0ZWd5LmVsZW1lbnRFbnZpcm9ubWVudC5saWJyYXJpZXMpIHsKICAgICAgZnJvbnRlbmRTdHJhdGVneS5lbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaENsYXNzKGxpYnJhcnksCiAgICAgICAgICAoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYWxsIGNsYXNzZXMgZWFnZXJseSB0byBvcHRpbWl6ZSBjbG9zZWQgd29ybGQgY29tcHV0YXRpb24gaW4KICAgICAgICAvLyBgQ2xhc3NXb3JsZEJ1aWxkZXIuaXNJbmhlcml0ZWRJblN1YnR5cGVPZmAuCiAgICAgICAgcmVzb2x1dGlvbkVucXVldWVyLndvcmxkQnVpbGRlci5yZWdpc3RlckNsYXNzKGNscyk7CiAgICAgIH0pOwogICAgfQogICAgV29ybGRJbXBhY3RCdWlsZGVySW1wbCBtYWluSW1wYWN0ID0gbmV3IFdvcmxkSW1wYWN0QnVpbGRlckltcGwoKTsKICAgIEZ1bmN0aW9uRW50aXR5IG1haW5GdW5jdGlvbiA9IGZyb250ZW5kU3RyYXRlZ3kuY29tcHV0ZU1haW4obWFpbkltcGFjdCk7CgogICAgLy8gSW4gb3JkZXIgdG8gc2VlIGlmIGEgbGlicmFyeSBpcyBkZWZlcnJlZCwgd2UgbXVzdCBjb21wdXRlIHRoZQogICAgLy8gY29tcGlsZS10aW1lIGNvbnN0YW50cyB0aGF0IGFyZSBtZXRhZGF0YS4gIFRoaXMgbWVhbnMgYWRkaW5nCiAgICAvLyBzb21ldGhpbmcgdG8gdGhlIHJlc29sdXRpb24gcXVldWUuICBTbyB3ZSBjYW5ub3Qgd2FpdCB3aXRoCiAgICAvLyB0aGlzIHVudGlsIGFmdGVyIHRoZSByZXNvbHV0aW9uIHF1ZXVlIGlzIHByb2Nlc3NlZC4KICAgIGRlZmVycmVkTG9hZFRhc2suYmVmb3JlUmVzb2x1dGlvbihyb290TGlicmFyeVVyaSwgbGlicmFyaWVzKTsKICAgIGltcGFjdFN0cmF0ZWd5ID0gYmFja2VuZC5jcmVhdGVJbXBhY3RTdHJhdGVneSgKICAgICAgICBzdXBwb3J0RGVmZXJyZWRMb2FkOiBkZWZlcnJlZExvYWRUYXNrLmlzUHJvZ3JhbVNwbGl0LAogICAgICAgIHN1cHBvcnREdW1wSW5mbzogb3B0aW9ucy5kdW1wSW5mbyk7CgogICAgcGhhc2UgPSBQSEFTRV9SRVNPTFZJTkc7CiAgICByZXNvbHV0aW9uRW5xdWV1ZXIuYXBwbHlJbXBhY3QobWFpbkltcGFjdCk7CiAgICBpZiAob3B0aW9ucy5zaG93SW50ZXJuYWxQcm9ncmVzcykgcmVwb3J0ZXIubG9nKCdSZXNvbHZpbmcuLi4nKTsKCiAgICBwcm9jZXNzUXVldWUoCiAgICAgICAgZnJvbnRlbmRTdHJhdGVneS5lbGVtZW50RW52aXJvbm1lbnQsIHJlc29sdXRpb25FbnF1ZXVlciwgbWFpbkZ1bmN0aW9uLAogICAgICAgIG9uUHJvZ3Jlc3M6IHNob3dSZXNvbHV0aW9uUHJvZ3Jlc3MpOwogICAgYmFja2VuZC5vblJlc29sdXRpb25FbmQoKTsKICAgIHJlc29sdXRpb25FbnF1ZXVlci5sb2dTdW1tYXJ5KHJlcG9ydGVyLmxvZyk7CgogICAgX3JlcG9ydGVyLnJlcG9ydFN1cHByZXNzZWRNZXNzYWdlc1N1bW1hcnkoKTsKCiAgICBpZiAoY29tcGlsYXRpb25GYWlsZWQpIHsKICAgICAgaWYgKCFvcHRpb25zLmdlbmVyYXRlQ29kZVdpdGhDb21waWxlVGltZUVycm9ycykgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlmIChtYWluRnVuY3Rpb24gPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIGlmICghYmFja2VuZC5lbmFibGVDb2RlZ2VuV2l0aEVycm9yc0lmU3VwcG9ydGVkKE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSkpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQoKICAgIGFzc2VydChtYWluRnVuY3Rpb24gIT0gbnVsbCk7CiAgICBjaGVja1F1ZXVlKHJlc29sdXRpb25FbnF1ZXVlcik7CgogICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkID0gY2xvc2VSZXNvbHV0aW9uKG1haW5GdW5jdGlvbik7CiAgICBpZiAocmV0YWluRGF0YUZvclRlc3RpbmcpIHsKICAgICAgYmFja2VuZENsb3NlZFdvcmxkRm9yVGVzdGluZyA9IGNsb3NlZFdvcmxkOwogICAgfQogICAgcmV0dXJuIGNsb3NlZFdvcmxkOwogIH0KCiAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcGVyZm9ybUdsb2JhbFR5cGVJbmZlcmVuY2UoCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgRnVuY3Rpb25FbnRpdHkgbWFpbkZ1bmN0aW9uID0gY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50Lm1haW5GdW5jdGlvbjsKICAgIGlmIChvcHRpb25zLnNob3dJbnRlcm5hbFByb2dyZXNzKSByZXBvcnRlci5sb2coJ0luZmVycmluZyB0eXBlcy4uLicpOwogICAgSW5mZXJyZWREYXRhQnVpbGRlciBpbmZlcnJlZERhdGFCdWlsZGVyID0KICAgICAgICBuZXcgSW5mZXJyZWREYXRhQnVpbGRlckltcGwoY2xvc2VkV29ybGQuYW5ub3RhdGlvbnNEYXRhKTsKICAgIHJldHVybiBnbG9iYWxJbmZlcmVuY2UucnVuR2xvYmFsVHlwZUluZmVyZW5jZSgKICAgICAgICBtYWluRnVuY3Rpb24sIGNsb3NlZFdvcmxkLCBpbmZlcnJlZERhdGFCdWlsZGVyKTsKICB9CgogIHZvaWQgZ2VuZXJhdGVKYXZhU2NyaXB0Q29kZSgKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cykgewogICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkID0gZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cy5jbG9zZWRXb3JsZDsKICAgIGJhY2tlbmRTdHJhdGVneS5yZWdpc3RlckpDbG9zZWRXb3JsZChjbG9zZWRXb3JsZCk7CiAgICBGdW5jdGlvbkVudGl0eSBtYWluRnVuY3Rpb24gPSBjbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQubWFpbkZ1bmN0aW9uOwogICAgaWYgKG9wdGlvbnMuc2hvd0ludGVybmFsUHJvZ3Jlc3MpIHJlcG9ydGVyLmxvZygnQ29tcGlsaW5nLi4uJyk7CiAgICBwaGFzZSA9IFBIQVNFX0NPTVBJTElORzsKCiAgICBFbnF1ZXVlciBjb2RlZ2VuRW5xdWV1ZXIgPQogICAgICAgIHN0YXJ0Q29kZWdlbihjbG9zZWRXb3JsZCwgZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cyk7CiAgICBwcm9jZXNzUXVldWUoY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50LCBjb2RlZ2VuRW5xdWV1ZXIsIG1haW5GdW5jdGlvbiwKICAgICAgICBvblByb2dyZXNzOiBzaG93Q29kZWdlblByb2dyZXNzKTsKICAgIGNvZGVnZW5FbnF1ZXVlci5sb2dTdW1tYXJ5KHJlcG9ydGVyLmxvZyk7CgogICAgaW50IHByb2dyYW1TaXplID0gYmFja2VuZC5hc3NlbWJsZVByb2dyYW0oCiAgICAgICAgY2xvc2VkV29ybGQsIGdsb2JhbEluZmVyZW5jZVJlc3VsdHMuaW5mZXJyZWREYXRhKTsKCiAgICBpZiAob3B0aW9ucy5kdW1wSW5mbykgewogICAgICBkdW1wSW5mb1Rhc2sucmVwb3J0U2l6ZShwcm9ncmFtU2l6ZSk7CiAgICAgIGR1bXBJbmZvVGFzay5kdW1wSW5mbyhjbG9zZWRXb3JsZCwgZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cyk7CiAgICB9CgogICAgYmFja2VuZC5vbkNvZGVnZW5FbmQoKTsKCiAgICBjaGVja1F1ZXVlKGNvZGVnZW5FbnF1ZXVlcik7CiAgfQoKICB2b2lkIGNvbXBpbGVGcm9tS2VybmVsKFVyaSByb290TGlicmFyeVVyaSwgSXRlcmFibGU8VXJpPiBsaWJyYXJpZXMpIHsKICAgIF91c2VyQ29kZUxvY2F0aW9ucy5hZGQobmV3IENvZGVMb2NhdGlvbihyb290TGlicmFyeVVyaSkpOwogICAgc2VsZlRhc2subWVhc3VyZVN1YnRhc2soImNvbXBpbGVGcm9tS2VybmVsIiwgKCkgewogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQgPSBzZWxmVGFzay5tZWFzdXJlU3VidGFzaygiY29tcHV0ZUNsb3NlZFdvcmxkIiwKICAgICAgICAgICgpID0+IGNvbXB1dGVDbG9zZWRXb3JsZChyb290TGlicmFyeVVyaSwgbGlicmFyaWVzKSk7CiAgICAgIGlmIChzdG9wQWZ0ZXJDbG9zZWRXb3JsZCkgcmV0dXJuOwogICAgICBpZiAoY2xvc2VkV29ybGQgIT0gbnVsbCkgewogICAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIGdsb2JhbEluZmVyZW5jZVJlc3VsdHMgPQogICAgICAgICAgICBwZXJmb3JtR2xvYmFsVHlwZUluZmVyZW5jZShjbG9zZWRXb3JsZCk7CiAgICAgICAgaWYgKG9wdGlvbnMud3JpdGVEYXRhVXJpICE9IG51bGwpIHsKICAgICAgICAgIHNlcmlhbGl6YXRpb25UYXNrLnNlcmlhbGl6ZShnbG9iYWxJbmZlcmVuY2VSZXN1bHRzKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKG9wdGlvbnMudGVzdE1vZGUpIHsKICAgICAgICAgIFNlcmlhbGl6YXRpb25TdHJhdGVneSBzdHJhdGVneSA9CiAgICAgICAgICAgICAgY29uc3QgQnl0ZXNJbk1lbW9yeVNlcmlhbGl6YXRpb25TdHJhdGVneSgpOwogICAgICAgICAgTGlzdDxpbnQ+IGlyRGF0YSA9CiAgICAgICAgICAgICAgc3RyYXRlZ3kuc2VyaWFsaXplQ29tcG9uZW50KGdsb2JhbEluZmVyZW5jZVJlc3VsdHMpOwogICAgICAgICAgTGlzdCB3b3JsZERhdGEgPSBzdHJhdGVneS5zZXJpYWxpemVEYXRhKGdsb2JhbEluZmVyZW5jZVJlc3VsdHMpOwogICAgICAgICAgZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cyA9IHN0cmF0ZWd5LmRlc2VyaWFsaXplRGF0YSgKICAgICAgICAgICAgICBvcHRpb25zLAogICAgICAgICAgICAgIHJlcG9ydGVyLAogICAgICAgICAgICAgIGVudmlyb25tZW50LAogICAgICAgICAgICAgIGFic3RyYWN0VmFsdWVTdHJhdGVneSwKICAgICAgICAgICAgICBzdHJhdGVneS5kZXNlcmlhbGl6ZUNvbXBvbmVudChpckRhdGEpLAogICAgICAgICAgICAgIHdvcmxkRGF0YSk7CiAgICAgICAgfQogICAgICAgIGlmIChzdG9wQWZ0ZXJUeXBlSW5mZXJlbmNlKSByZXR1cm47CiAgICAgICAgZ2VuZXJhdGVKYXZhU2NyaXB0Q29kZShnbG9iYWxJbmZlcmVuY2VSZXN1bHRzKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBFbnF1ZXVlciBzdGFydENvZGVnZW4oSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBnbG9iYWxJbmZlcmVuY2VSZXN1bHRzKSB7CiAgICBFbnF1ZXVlciBjb2RlZ2VuRW5xdWV1ZXIgPQogICAgICAgIGVucXVldWVyLmNyZWF0ZUNvZGVnZW5FbnF1ZXVlcihjbG9zZWRXb3JsZCwgZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cyk7CiAgICBfY29kZWdlbldvcmxkQnVpbGRlciA9IGNvZGVnZW5FbnF1ZXVlci53b3JsZEJ1aWxkZXI7CiAgICBjb2RlZ2VuRW5xdWV1ZXIuYXBwbHlJbXBhY3QoYmFja2VuZC5vbkNvZGVnZW5TdGFydCgKICAgICAgICBjbG9zZWRXb3JsZCwgX2NvZGVnZW5Xb3JsZEJ1aWxkZXIsIGNsb3NlZFdvcmxkLnNvcnRlcikpOwogICAgcmV0dXJuIGNvZGVnZW5FbnF1ZXVlcjsKICB9CgogIC8vLyBQZXJmb3JtIHRoZSBzdGVwcyBuZWVkZWQgdG8gZnVsbHkgZW5kIHRoZSByZXNvbHV0aW9uIHBoYXNlLgogIEpDbG9zZWRXb3JsZCBjbG9zZVJlc29sdXRpb24oRnVuY3Rpb25FbnRpdHkgbWFpbkZ1bmN0aW9uKSB7CiAgICBwaGFzZSA9IFBIQVNFX0RPTkVfUkVTT0xWSU5HOwoKICAgIEtDbG9zZWRXb3JsZCBrQ2xvc2VkV29ybGQgPSByZXNvbHV0aW9uV29ybGRCdWlsZGVyLmNsb3NlV29ybGQocmVwb3J0ZXIpOwogICAgT3V0cHV0VW5pdERhdGEgcmVzdWx0ID0gZGVmZXJyZWRMb2FkVGFzay5ydW4obWFpbkZ1bmN0aW9uLCBrQ2xvc2VkV29ybGQpOwogICAgSkNsb3NlZFdvcmxkIGpDbG9zZWRXb3JsZCA9CiAgICAgICAgYmFja2VuZFN0cmF0ZWd5LmNyZWF0ZUpDbG9zZWRXb3JsZChrQ2xvc2VkV29ybGQsIHJlc3VsdCk7CiAgICByZXR1cm4gakNsb3NlZFdvcmxkOwogIH0KCiAgLy8vIEVtcHR5IHRoZSBbZW5xdWV1ZXJdIHF1ZXVlLgogIHZvaWQgZW1wdHlRdWV1ZShFbnF1ZXVlciBlbnF1ZXVlciwge3ZvaWQgb25Qcm9ncmVzcyhFbnF1ZXVlciBlbnF1ZXVlcil9KSB7CiAgICBzZWxmVGFzay5tZWFzdXJlU3VidGFzaygiZW1wdHlRdWV1ZSIsICgpIHsKICAgICAgZW5xdWV1ZXIuZm9yRWFjaCgoV29ya0l0ZW0gd29yaykgewogICAgICAgIGlmIChvblByb2dyZXNzICE9IG51bGwpIHsKICAgICAgICAgIG9uUHJvZ3Jlc3MoZW5xdWV1ZXIpOwogICAgICAgIH0KICAgICAgICByZXBvcnRlci53aXRoQ3VycmVudEVsZW1lbnQoCiAgICAgICAgICAgIHdvcmsuZWxlbWVudCwKICAgICAgICAgICAgKCkgPT4gc2VsZlRhc2subWVhc3VyZVN1YnRhc2soImFwcGx5SW1wYWN0IiwgKCkgewogICAgICAgICAgICAgICAgICBlbnF1ZXVlci5hcHBseUltcGFjdCgKICAgICAgICAgICAgICAgICAgICAgIHNlbGZUYXNrLm1lYXN1cmVTdWJ0YXNrKCJ3b3JrLnJ1biIsICgpID0+IHdvcmsucnVuKCkpLAogICAgICAgICAgICAgICAgICAgICAgaW1wYWN0U291cmNlOiB3b3JrLmVsZW1lbnQpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICB9KTsKICAgIH0pOwogIH0KCiAgdm9pZCBwcm9jZXNzUXVldWUoRWxlbWVudEVudmlyb25tZW50IGVsZW1lbnRFbnZpcm9ubWVudCwgRW5xdWV1ZXIgZW5xdWV1ZXIsCiAgICAgIEZ1bmN0aW9uRW50aXR5IG1haW5NZXRob2QsCiAgICAgIHt2b2lkIG9uUHJvZ3Jlc3MoRW5xdWV1ZXIgZW5xdWV1ZXIpfSkgewogICAgc2VsZlRhc2subWVhc3VyZVN1YnRhc2soInByb2Nlc3NRdWV1ZSIsICgpIHsKICAgICAgZW5xdWV1ZXIub3BlbigKICAgICAgICAgIGltcGFjdFN0cmF0ZWd5LAogICAgICAgICAgbWFpbk1ldGhvZCwKICAgICAgICAgIGVsZW1lbnRFbnZpcm9ubWVudC5saWJyYXJpZXMKICAgICAgICAgICAgICAubWFwKChMaWJyYXJ5RW50aXR5IGxpYnJhcnkpID0+IGxpYnJhcnkuY2Fub25pY2FsVXJpKSk7CiAgICAgIHByb2dyZXNzLnN0YXJ0UGhhc2UoKTsKICAgICAgZW1wdHlRdWV1ZShlbnF1ZXVlciwgb25Qcm9ncmVzczogb25Qcm9ncmVzcyk7CiAgICAgIGVucXVldWVyLnF1ZXVlSXNDbG9zZWQgPSB0cnVlOwogICAgICBlbnF1ZXVlci5jbG9zZSgpOwogICAgICAvLyBOb3RpZnkgdGhlIGltcGFjdCBzdHJhdGVneSBpbXBhY3RzIGFyZSBubyBsb25nZXIgbmVlZGVkIGZvciB0aGlzCiAgICAgIC8vIGVucXVldWVyLgogICAgICBpbXBhY3RTdHJhdGVneS5vbkltcGFjdFVzZWQoZW5xdWV1ZXIuaW1wYWN0VXNlKTsKICAgICAgYXNzZXJ0KGNvbXBpbGF0aW9uRmFpbGVkIHx8CiAgICAgICAgICBlbnF1ZXVlci5jaGVja05vRW5xdWV1ZWRJbnZva2VkSW5zdGFuY2VNZXRob2RzKGVsZW1lbnRFbnZpcm9ubWVudCkpOwogICAgfSk7CiAgfQoKICAvLy8gUGVyZm9ybSB2YXJpb3VzIGNoZWNrcyBvZiB0aGUgcXVldWUuIFRoaXMgaW5jbHVkZXMgY2hlY2tpbmcgdGhhdCB0aGUKICAvLy8gcXVldWVzIGFyZSBlbXB0eSAobm90aGluZyB3YXMgYWRkZWQgYWZ0ZXIgd2Ugc3RvcHBlZCBwcm9jZXNzaW5nIHRoZQogIC8vLyBxdWV1ZXMpLgogIGNoZWNrUXVldWUoRW5xdWV1ZXIgZW5xdWV1ZXIpIHsKICAgIGVucXVldWVyLmNoZWNrUXVldWVJc0VtcHR5KCk7CiAgfQoKICB2b2lkIHNob3dSZXNvbHV0aW9uUHJvZ3Jlc3MoRW5xdWV1ZXIgZW5xdWV1ZXIpIHsKICAgIGFzc2VydChwaGFzZSA9PSBQSEFTRV9SRVNPTFZJTkcsICdVbmV4cGVjdGVkIHBoYXNlOiAkcGhhc2UnKTsKICAgIHByb2dyZXNzLnNob3dQcm9ncmVzcygKICAgICAgICAnUmVzb2x2ZWQgJywgZW5xdWV1ZXIucHJvY2Vzc2VkRW50aXRpZXMubGVuZ3RoLCAnIGVsZW1lbnRzLicpOwogIH0KCiAgdm9pZCBzaG93Q29kZWdlblByb2dyZXNzKEVucXVldWVyIGVucXVldWVyKSB7CiAgICBwcm9ncmVzcy5zaG93UHJvZ3Jlc3MoCiAgICAgICAgJ0NvbXBpbGVkICcsIGVucXVldWVyLnByb2Nlc3NlZEVudGl0aWVzLmxlbmd0aCwgJyBtZXRob2RzLicpOwogIH0KCiAgdm9pZCByZXBvcnREaWFnbm9zdGljKERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UsCiAgICAgIExpc3Q8RGlhZ25vc3RpY01lc3NhZ2U+IGluZm9zLCBhcGkuRGlhZ25vc3RpYyBraW5kKTsKCiAgdm9pZCByZXBvcnRDcmFzaEluVXNlckNvZGUoU3RyaW5nIG1lc3NhZ2UsIGV4Y2VwdGlvbiwgc3RhY2tUcmFjZSkgewogICAgcmVwb3J0ZXIub25DcmFzaEluVXNlckNvZGUobWVzc2FnZSwgZXhjZXB0aW9uLCBzdGFja1RyYWNlKTsKICB9CgogIC8vLyBNZXNzYWdlcyBmb3Igd2hpY2ggY29tcGlsZS10aW1lIGVycm9ycyBhcmUgcmVwb3J0ZWQgYnV0IGNvbXBpbGF0aW9uCiAgLy8vIGNvbnRpbnVlcyByZWdhcmRsZXNzLgogIHN0YXRpYyBjb25zdCBMaXN0PE1lc3NhZ2VLaW5kPiBCRU5JR05fRVJST1JTID0gY29uc3QgPE1lc3NhZ2VLaW5kPlsKICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfTUVUQURBVEEsCiAgICBNZXNzYWdlS2luZC5JTlZBTElEX01FVEFEQVRBX0dFTkVSSUMsCiAgXTsKCiAgYm9vbCBtYXJrQ29tcGlsYXRpb25Bc0ZhaWxlZChEaWFnbm9zdGljTWVzc2FnZSBtZXNzYWdlLCBhcGkuRGlhZ25vc3RpYyBraW5kKSB7CiAgICBpZiAob3B0aW9ucy50ZXN0TW9kZSkgewogICAgICAvLyBXaGVuIGluIHRlc3QgbW9kZSwgaS5lLiBvbiB0aGUgYnVpbGQtYm90LCB3ZSBhbHdheXMgc3RvcCBjb21waWxhdGlvbi4KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAocmVwb3J0ZXIub3B0aW9ucy5mYXRhbFdhcm5pbmdzKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuICFCRU5JR05fRVJST1JTLmNvbnRhaW5zKG1lc3NhZ2UubWVzc2FnZS5raW5kKTsKICB9CgogIHZvaWQgZmF0YWxEaWFnbm9zdGljUmVwb3J0ZWQoRGlhZ25vc3RpY01lc3NhZ2UgbWVzc2FnZSwKICAgICAgTGlzdDxEaWFnbm9zdGljTWVzc2FnZT4gaW5mb3MsIGFwaS5EaWFnbm9zdGljIGtpbmQpIHsKICAgIGlmIChtYXJrQ29tcGlsYXRpb25Bc0ZhaWxlZChtZXNzYWdlLCBraW5kKSkgewogICAgICBjb21waWxhdGlvbkZhaWxlZCA9IHRydWU7CiAgICB9CiAgICByZWdpc3RlckNvbXBpbGVUaW1lRXJyb3IoY3VycmVudEVsZW1lbnQsIG1lc3NhZ2UpOwogIH0KCiAgLy8vIEhlbHBlciBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciB0aGUgY3VycmVudCBlbGVtZW50IGlzIGRlY2xhcmVkIHdpdGhpbgogIC8vLyAndXNlciBjb2RlJy4KICAvLy8KICAvLy8gU2VlIFtpblVzZXJDb2RlXSBmb3Igd2hhdCBkZWZpbmVzICd1c2VyIGNvZGUnLgogIGJvb2wgY3VycmVudGx5SW5Vc2VyQ29kZSgpIHsKICAgIHJldHVybiBpblVzZXJDb2RlKGN1cnJlbnRFbGVtZW50KTsKICB9CgogIC8vLyBIZWxwZXIgZm9yIGRldGVybWluaW5nIHdoZXRoZXIgW2VsZW1lbnRdIGlzIGRlY2xhcmVkIHdpdGhpbiAndXNlciBjb2RlJy4KICAvLy8KICAvLy8gV2hhdCBjb25zdGl0dXRlcyAndXNlciBjb2RlJyBpcyBkZWZpbmVkIGJ5IHRoZSBVUkkocykgcHJvdmlkZWQgYnkgdGhlCiAgLy8vIGVudHJ5IHBvaW50KHMpIG9mIGNvbXBpbGF0aW9uIG9yIGFuYWx5c2lzOgogIC8vLwogIC8vLyBJZiBhbiBlbnRyeXBvaW50IFVSSSB1c2VzIHRoZSAncGFja2FnZScgc2NoZW1lIHRoZW4gZXZlcnkgbGlicmFyeSBmcm9tCiAgLy8vIHRoYXQgc2FtZSBwYWNrYWdlIGlzIGNvbnNpZGVyZWQgdG8gYmUgaW4gdXNlciBjb2RlLiBGb3IgaW5zdGFuY2UsIGlmCiAgLy8vIGFuIGVudHJ5IHBvaW50IFVSSSBpcyAncGFja2FnZTpmb28vYmFyLmRhcnQnIHRoZW4gZXZlcnkgbGlicmFyeSB3aG9zZQogIC8vLyBjYW5vbmljYWwgVVJJIHN0YXJ0cyB3aXRoICdwYWNrYWdlOmZvby8nIGlzIGluIHVzZXIgY29kZS4KICAvLy8KICAvLy8gSWYgYW4gZW50cnlwb2ludCBVUkkgdXNlcyBhbm90aGVyIHNjaGVtZSB0aGFuICdwYWNrYWdlJyB0aGVuIGV2ZXJ5IGxpYnJhcnkKICAvLy8gd2l0aCB0aGF0IHNjaGVtZSBpcyBpbiB1c2VyIGNvZGUuIEZvciBpbnN0YW5jZSwgYW4gZW50cnkgcG9pbnQgVVJJIGlzCiAgLy8vICdmaWxlOi8vL2Zvby5kYXJ0JyB0aGVuIGV2ZXJ5IGxpYnJhcnkgd2hvc2UgY2Fub25pY2FsIFVSSSBzY2hlbWUgaXMKICAvLy8gJ2ZpbGUnIGlzIGluIHVzZXIgY29kZS4KICAvLy8KICAvLy8gSWYgW2Fzc3VtZUluVXNlckNvZGVdIGlzIGB0cnVlYCwgW2VsZW1lbnRdIGlzIGFzc3VtZWQgdG8gYmUgaW4gdXNlciBjb2RlCiAgLy8vIGlmIG5vIGVudHJ5cG9pbnRzIGhhdmUgYmVlbiBzZXQuCiAgYm9vbCBpblVzZXJDb2RlKEVudGl0eSBlbGVtZW50LCB7Ym9vbCBhc3N1bWVJblVzZXJDb2RlOiBmYWxzZX0pIHsKICAgIGlmIChlbGVtZW50ID09IG51bGwpIHJldHVybiBhc3N1bWVJblVzZXJDb2RlOwogICAgVXJpIGxpYnJhcnlVcmkgPSBfdXJpRnJvbUVsZW1lbnQoZWxlbWVudCk7CiAgICBpZiAobGlicmFyeVVyaSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoX3VzZXJDb2RlTG9jYXRpb25zLmlzRW1wdHkgJiYgYXNzdW1lSW5Vc2VyQ29kZSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gX3VzZXJDb2RlTG9jYXRpb25zLmFueSgKICAgICAgICAoQ29kZUxvY2F0aW9uIGNvZGVMb2NhdGlvbikgPT4gY29kZUxvY2F0aW9uLmluU2FtZUxvY2F0aW9uKGxpYnJhcnlVcmkpKTsKICB9CgogIC8vLyBSZXR1cm4gYSBjYW5vbmljYWwgVVJJIGZvciB0aGUgc291cmNlIG9mIFtlbGVtZW50XS4KICAvLy8KICAvLy8gRm9yIGEgcGFja2FnZSBsaWJyYXJ5IHdpdGggY2Fub25pY2FsIFVSSSAncGFja2FnZTpmb28vYmFyL2Jhei5kYXJ0JyB0aGUKICAvLy8gcmV0dXJuIFVSSSBpcyAncGFja2FnZTpmb28nLiBGb3Igbm9uLXBhY2thZ2UgbGlicmFyaWVzIHRoZSByZXR1cm5lZCBVUkkgaXMKICAvLy8gdGhlIGNhbm9uaWNhbCBVUkkgb2YgdGhlIGxpYnJhcnkgaXRzZWxmLgogIFVyaSBnZXRDYW5vbmljYWxVcmkoRW50aXR5IGVsZW1lbnQpIHsKICAgIFVyaSBsaWJyYXJ5VXJpID0gX3VyaUZyb21FbGVtZW50KGVsZW1lbnQpOwogICAgaWYgKGxpYnJhcnlVcmkgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBpZiAobGlicmFyeVVyaS5zY2hlbWUgPT0gJ3BhY2thZ2UnKSB7CiAgICAgIGludCBzbGFzaFBvcyA9IGxpYnJhcnlVcmkucGF0aC5pbmRleE9mKCcvJyk7CiAgICAgIGlmIChzbGFzaFBvcyAhPSAtMSkgewogICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGxpYnJhcnlVcmkucGF0aC5zdWJzdHJpbmcoMCwgc2xhc2hQb3MpOwogICAgICAgIHJldHVybiBuZXcgVXJpKHNjaGVtZTogJ3BhY2thZ2UnLCBwYXRoOiBwYWNrYWdlTmFtZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBsaWJyYXJ5VXJpOwogIH0KCiAgVXJpIF91cmlGcm9tRWxlbWVudChFbnRpdHkgZWxlbWVudCkgewogICAgaWYgKGVsZW1lbnQgaXMgTGlicmFyeUVudGl0eSkgewogICAgICByZXR1cm4gZWxlbWVudC5jYW5vbmljYWxVcmk7CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaXMgQ2xhc3NFbnRpdHkpIHsKICAgICAgcmV0dXJuIGVsZW1lbnQubGlicmFyeS5jYW5vbmljYWxVcmk7CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaXMgTWVtYmVyRW50aXR5KSB7CiAgICAgIHJldHVybiBlbGVtZW50LmxpYnJhcnkuY2Fub25pY2FsVXJpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLy8gUmV0dXJucyBbdHJ1ZV0gaWYgYSBjb21waWxlLXRpbWUgZXJyb3IgaGFzIGJlZW4gcmVwb3J0ZWQgZm9yIGVsZW1lbnQuCiAgYm9vbCBlbGVtZW50SGFzQ29tcGlsZVRpbWVFcnJvcihFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIGVsZW1lbnRzV2l0aENvbXBpbGVUaW1lRXJyb3JzLmNvbnRhaW5zS2V5KGVsZW1lbnQpOwogIH0KCiAgLy8vIEFzc29jaWF0ZSBbZWxlbWVudF0gd2l0aCBhIGNvbXBpbGUtdGltZSBlcnJvciBbbWVzc2FnZV0uCiAgdm9pZCByZWdpc3RlckNvbXBpbGVUaW1lRXJyb3IoRW50aXR5IGVsZW1lbnQsIERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UpIHsKICAgIC8vIFRoZSBpbmZvcm1hdGlvbiBpcyBvbmx5IG5lZWRlZCBpZiBbZ2VuZXJhdGVDb2RlV2l0aENvbXBpbGVUaW1lRXJyb3JzXS4KICAgIGlmIChvcHRpb25zLmdlbmVyYXRlQ29kZVdpdGhDb21waWxlVGltZUVycm9ycykgewogICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7CiAgICAgICAgLy8gUmVjb3JkIGFzIGdsb2JhbCBlcnJvci4KICAgICAgICAvLyBUT0RPKHphcmFoKTogRXh0ZW5kIGVsZW1lbnQgbW9kZWwgdG8gcmVwcmVzZW50IGNvbXBpbGUtdGltZQogICAgICAgIC8vIGVycm9ycyBpbnN0ZWFkIG9mIHVzaW5nIGEgbWFwLgogICAgICAgIGVsZW1lbnQgPSBmcm9udGVuZFN0cmF0ZWd5LmVsZW1lbnRFbnZpcm9ubWVudC5tYWluRnVuY3Rpb247CiAgICAgIH0KICAgICAgZWxlbWVudHNXaXRoQ29tcGlsZVRpbWVFcnJvcnMKICAgICAgICAgIC5wdXRJZkFic2VudChlbGVtZW50LCAoKSA9PiA8RGlhZ25vc3RpY01lc3NhZ2U+W10pCiAgICAgICAgICAuYWRkKG1lc3NhZ2UpOwogICAgfQogIH0KfQoKY2xhc3MgX0NvbXBpbGVyT3V0cHV0IGltcGxlbWVudHMgYXBpLkNvbXBpbGVyT3V0cHV0IHsKICBmaW5hbCBDb21waWxlciBfY29tcGlsZXI7CiAgZmluYWwgYXBpLkNvbXBpbGVyT3V0cHV0IF91c2VyT3V0cHV0OwoKICBfQ29tcGlsZXJPdXRwdXQodGhpcy5fY29tcGlsZXIsIGFwaS5Db21waWxlck91dHB1dCBvdXRwdXQpCiAgICAgIDogdGhpcy5fdXNlck91dHB1dCA9IG91dHB1dCA/PyBjb25zdCBOdWxsQ29tcGlsZXJPdXRwdXQoKTsKCiAgQG92ZXJyaWRlCiAgYXBpLk91dHB1dFNpbmsgY3JlYXRlT3V0cHV0U2luaygKICAgICAgU3RyaW5nIG5hbWUsIFN0cmluZyBleHRlbnNpb24sIGFwaS5PdXRwdXRUeXBlIHR5cGUpIHsKICAgIGlmIChfY29tcGlsZXIuY29tcGlsYXRpb25GYWlsZWQpIHsKICAgICAgaWYgKCFfY29tcGlsZXIub3B0aW9ucy5nZW5lcmF0ZUNvZGVXaXRoQ29tcGlsZVRpbWVFcnJvcnMgfHwKICAgICAgICAgIF9jb21waWxlci5vcHRpb25zLnRlc3RNb2RlKSB7CiAgICAgICAgLy8gRGlzYWJsZSBvdXRwdXQgaW4gdGVzdCBtb2RlOiBUaGUgYnVpbGQgYm90IGN1cnJlbnRseSB1c2VzIHRoZSB0aW1lCiAgICAgICAgLy8gc3RhbXAgb2YgdGhlIGdlbmVyYXRlZCBmaWxlIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBvdXRwdXQgaXMKICAgICAgICAvLyB1cC10by1kYXRlLgogICAgICAgIHJldHVybiBjb25zdCBOdWxsQ29tcGlsZXJPdXRwdXQoKQogICAgICAgICAgICAuY3JlYXRlT3V0cHV0U2luayhuYW1lLCBleHRlbnNpb24sIHR5cGUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gX3VzZXJPdXRwdXQuY3JlYXRlT3V0cHV0U2luayhuYW1lLCBleHRlbnNpb24sIHR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYXBpLkJpbmFyeU91dHB1dFNpbmsgY3JlYXRlQmluYXJ5U2luayhVcmkgdXJpKSB7CiAgICByZXR1cm4gX3VzZXJPdXRwdXQuY3JlYXRlQmluYXJ5U2luayh1cmkpOwogIH0KfQoKLy8vIEluZm9ybWF0aW9uIGFib3V0IHN1cHByZXNzZWQgd2FybmluZ3MgYW5kIGhpbnRzIGZvciBhIGdpdmVuIGxpYnJhcnkuCmNsYXNzIFN1cHByZXNzaW9uSW5mbyB7CiAgaW50IHdhcm5pbmdzID0gMDsKICBpbnQgaGludHMgPSAwOwp9CgpjbGFzcyBDb21waWxlckRpYWdub3N0aWNSZXBvcnRlciBleHRlbmRzIERpYWdub3N0aWNSZXBvcnRlciB7CiAgZmluYWwgQ29tcGlsZXIgY29tcGlsZXI7CiAgQG92ZXJyaWRlCiAgZmluYWwgRGlhZ25vc3RpY09wdGlvbnMgb3B0aW9uczsKCiAgRW50aXR5IF9jdXJyZW50RWxlbWVudDsKICBib29sIGhhc0NyYXNoZWQgPSBmYWxzZTsKCiAgLy8vIGB0cnVlYCBpZiB0aGUgbGFzdCBkaWFnbm9zdGljIHdhcyBmaWx0ZXJlZCwgaW4gd2hpY2ggY2FzZSB0aGUKICAvLy8gYWNjb21wYW55aW5nIGluZm8gbWVzc2FnZSBzaG91bGQgYmUgZmlsdGVyZWQgYXMgd2VsbC4KICBib29sIGxhc3REaWFnbm9zdGljV2FzRmlsdGVyZWQgPSBmYWxzZTsKCiAgLy8vIE1hcCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSB3YXJuaW5ncyBhbmQgaGludHMgdGhhdCBoYXZlIGJlZW4KICAvLy8gc3VwcHJlc3NlZCBmb3IgZWFjaCBsaWJyYXJ5LgogIE1hcDxVcmksIFN1cHByZXNzaW9uSW5mbz4gc3VwcHJlc3NlZFdhcm5pbmdzID0gPFVyaSwgU3VwcHJlc3Npb25JbmZvPnt9OwoKICBDb21waWxlckRpYWdub3N0aWNSZXBvcnRlcih0aGlzLmNvbXBpbGVyLCB0aGlzLm9wdGlvbnMpOwoKICBFbnRpdHkgZ2V0IGN1cnJlbnRFbGVtZW50ID0+IF9jdXJyZW50RWxlbWVudDsKCiAgQG92ZXJyaWRlCiAgRGlhZ25vc3RpY01lc3NhZ2UgY3JlYXRlTWVzc2FnZShTcGFubmFibGUgc3Bhbm5hYmxlLCBNZXNzYWdlS2luZCBtZXNzYWdlS2luZCwKICAgICAgW01hcCBhcmd1bWVudHMgPSBjb25zdCB7fV0pIHsKICAgIFNvdXJjZVNwYW4gc3BhbiA9IHNwYW5Gcm9tU3Bhbm5hYmxlKHNwYW5uYWJsZSk7CiAgICBNZXNzYWdlVGVtcGxhdGUgdGVtcGxhdGUgPSBNZXNzYWdlVGVtcGxhdGUuVEVNUExBVEVTW21lc3NhZ2VLaW5kXTsKICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHRlbXBsYXRlLm1lc3NhZ2UoYXJndW1lbnRzLCBvcHRpb25zLnRlcnNlRGlhZ25vc3RpY3MpOwogICAgcmV0dXJuIG5ldyBEaWFnbm9zdGljTWVzc2FnZShzcGFuLCBzcGFubmFibGUsIG1lc3NhZ2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZXBvcnRFcnJvcihEaWFnbm9zdGljTWVzc2FnZSBtZXNzYWdlLAogICAgICBbTGlzdDxEaWFnbm9zdGljTWVzc2FnZT4gaW5mb3MgPSBjb25zdCA8RGlhZ25vc3RpY01lc3NhZ2U+W11dKSB7CiAgICByZXBvcnREaWFnbm9zdGljSW50ZXJuYWwobWVzc2FnZSwgaW5mb3MsIGFwaS5EaWFnbm9zdGljLkVSUk9SKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVwb3J0V2FybmluZyhEaWFnbm9zdGljTWVzc2FnZSBtZXNzYWdlLAogICAgICBbTGlzdDxEaWFnbm9zdGljTWVzc2FnZT4gaW5mb3MgPSBjb25zdCA8RGlhZ25vc3RpY01lc3NhZ2U+W11dKSB7CiAgICByZXBvcnREaWFnbm9zdGljSW50ZXJuYWwobWVzc2FnZSwgaW5mb3MsIGFwaS5EaWFnbm9zdGljLldBUk5JTkcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZXBvcnRIaW50KERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UsCiAgICAgIFtMaXN0PERpYWdub3N0aWNNZXNzYWdlPiBpbmZvcyA9IGNvbnN0IDxEaWFnbm9zdGljTWVzc2FnZT5bXV0pIHsKICAgIHJlcG9ydERpYWdub3N0aWNJbnRlcm5hbChtZXNzYWdlLCBpbmZvcywgYXBpLkRpYWdub3N0aWMuSElOVCk7CiAgfQoKICBAZGVwcmVjYXRlZAogIEBvdmVycmlkZQogIHZvaWQgcmVwb3J0SW5mbyhTcGFubmFibGUgbm9kZSwgTWVzc2FnZUtpbmQgbWVzc2FnZUtpbmQsCiAgICAgIFtNYXAgYXJndW1lbnRzID0gY29uc3Qge31dKSB7CiAgICByZXBvcnREaWFnbm9zdGljSW50ZXJuYWwoY3JlYXRlTWVzc2FnZShub2RlLCBtZXNzYWdlS2luZCwgYXJndW1lbnRzKSwKICAgICAgICBjb25zdCA8RGlhZ25vc3RpY01lc3NhZ2U+W10sIGFwaS5EaWFnbm9zdGljLklORk8pOwogIH0KCiAgdm9pZCByZXBvcnREaWFnbm9zdGljSW50ZXJuYWwoRGlhZ25vc3RpY01lc3NhZ2UgbWVzc2FnZSwKICAgICAgTGlzdDxEaWFnbm9zdGljTWVzc2FnZT4gaW5mb3MsIGFwaS5EaWFnbm9zdGljIGtpbmQpIHsKICAgIGlmICghb3B0aW9ucy5zaG93QWxsUGFja2FnZVdhcm5pbmdzICYmCiAgICAgICAgbWVzc2FnZS5zcGFubmFibGUgIT0gTk9fTE9DQVRJT05fU1BBTk5BQkxFKSB7CiAgICAgIHN3aXRjaCAoa2luZCkgewogICAgICAgIGNhc2UgYXBpLkRpYWdub3N0aWMuV0FSTklORzoKICAgICAgICBjYXNlIGFwaS5EaWFnbm9zdGljLkhJTlQ6CiAgICAgICAgICBFbnRpdHkgZWxlbWVudCA9IGVsZW1lbnRGcm9tU3Bhbm5hYmxlKG1lc3NhZ2Uuc3Bhbm5hYmxlKTsKICAgICAgICAgIGlmICghY29tcGlsZXIuaW5Vc2VyQ29kZShlbGVtZW50LCBhc3N1bWVJblVzZXJDb2RlOiB0cnVlKSkgewogICAgICAgICAgICBVcmkgdXJpID0gY29tcGlsZXIuZ2V0Q2Fub25pY2FsVXJpKGVsZW1lbnQpOwogICAgICAgICAgICBpZiAob3B0aW9ucy5zaG93UGFja2FnZVdhcm5pbmdzRm9yKHVyaSkpIHsKICAgICAgICAgICAgICByZXBvcnREaWFnbm9zdGljKG1lc3NhZ2UsIGluZm9zLCBraW5kKTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgU3VwcHJlc3Npb25JbmZvIGluZm8gPSBzdXBwcmVzc2VkV2FybmluZ3MucHV0SWZBYnNlbnQoCiAgICAgICAgICAgICAgICB1cmksICgpID0+IG5ldyBTdXBwcmVzc2lvbkluZm8oKSk7CiAgICAgICAgICAgIGlmIChraW5kID09IGFwaS5EaWFnbm9zdGljLldBUk5JTkcpIHsKICAgICAgICAgICAgICBpbmZvLndhcm5pbmdzKys7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaW5mby5oaW50cysrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxhc3REaWFnbm9zdGljV2FzRmlsdGVyZWQgPSB0cnVlOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIGFwaS5EaWFnbm9zdGljLklORk86CiAgICAgICAgICBpZiAobGFzdERpYWdub3N0aWNXYXNGaWx0ZXJlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgbGFzdERpYWdub3N0aWNXYXNGaWx0ZXJlZCA9IGZhbHNlOwogICAgcmVwb3J0RGlhZ25vc3RpYyhtZXNzYWdlLCBpbmZvcywga2luZCk7CiAgfQoKICB2b2lkIHJlcG9ydERpYWdub3N0aWMoRGlhZ25vc3RpY01lc3NhZ2UgbWVzc2FnZSwKICAgICAgTGlzdDxEaWFnbm9zdGljTWVzc2FnZT4gaW5mb3MsIGFwaS5EaWFnbm9zdGljIGtpbmQpIHsKICAgIGNvbXBpbGVyLnJlcG9ydERpYWdub3N0aWMobWVzc2FnZSwgaW5mb3MsIGtpbmQpOwogICAgaWYgKGtpbmQgPT0gYXBpLkRpYWdub3N0aWMuRVJST1IgfHwKICAgICAgICBraW5kID09IGFwaS5EaWFnbm9zdGljLkNSQVNIIHx8CiAgICAgICAgKG9wdGlvbnMuZmF0YWxXYXJuaW5ncyAmJiBraW5kID09IGFwaS5EaWFnbm9zdGljLldBUk5JTkcpKSB7CiAgICAgIEVudGl0eSBlcnJvckVsZW1lbnQ7CiAgICAgIGlmIChtZXNzYWdlLnNwYW5uYWJsZSBpcyBFbnRpdHkpIHsKICAgICAgICBlcnJvckVsZW1lbnQgPSBtZXNzYWdlLnNwYW5uYWJsZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlcnJvckVsZW1lbnQgPSBjdXJyZW50RWxlbWVudDsKICAgICAgfQogICAgICBjb21waWxlci5yZWdpc3RlckNvbXBpbGVUaW1lRXJyb3IoZXJyb3JFbGVtZW50LCBtZXNzYWdlKTsKICAgICAgY29tcGlsZXIuZmF0YWxEaWFnbm9zdGljUmVwb3J0ZWQobWVzc2FnZSwgaW5mb3MsIGtpbmQpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaGFzUmVwb3J0ZWRFcnJvciA9PiBjb21waWxlci5jb21waWxhdGlvbkZhaWxlZDsKCiAgLy8vIFBlcmZvcm0gYW4gb3BlcmF0aW9uLCBbZl0sIHJldHVybmluZyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gW2ZdLiAgSWYgYW4KICAvLy8gZXJyb3Igb2NjdXJzIHRoZW4gcmVwb3J0IGl0IGFzIGhhdmluZyBvY2N1cnJlZCBkdXJpbmcgY29tcGlsYXRpb24gb2YKICAvLy8gW2VsZW1lbnRdLiAgQ2FuIGJlIG5lc3RlZC4KICBAb3ZlcnJpZGUKICB3aXRoQ3VycmVudEVsZW1lbnQoRW50aXR5IGVsZW1lbnQsIGYoKSkgewogICAgRW50aXR5IG9sZCA9IGN1cnJlbnRFbGVtZW50OwogICAgX2N1cnJlbnRFbGVtZW50ID0gZWxlbWVudDsKICAgIHRyeSB7CiAgICAgIHJldHVybiBmKCk7CiAgICB9IG9uIFNwYW5uYWJsZUFzc2VydGlvbkZhaWx1cmUgY2F0Y2ggKGV4KSB7CiAgICAgIGlmICghaGFzQ3Jhc2hlZCkgewogICAgICAgIHJlcG9ydEFzc2VydGlvbkZhaWx1cmUoZXgpOwogICAgICAgIHBsZWFzZVJlcG9ydENyYXNoKCk7CiAgICAgIH0KICAgICAgaGFzQ3Jhc2hlZCA9IHRydWU7CiAgICAgIHJldGhyb3c7CiAgICB9IG9uIFN0YWNrT3ZlcmZsb3dFcnJvciB7CiAgICAgIC8vIFdlIGNhbm5vdCByZXBvcnQgYW55dGhpbmcgdXNlZnVsIGluIHRoaXMgY2FzZSwgYmVjYXVzZSB3ZQogICAgICAvLyBkbyBub3QgaGF2ZSBlbm91Z2ggc3RhY2sgc3BhY2UuCiAgICAgIHJldGhyb3c7CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoaGFzQ3Jhc2hlZCkgcmV0aHJvdzsKICAgICAgdHJ5IHsKICAgICAgICB1bmhhbmRsZWRFeGNlcHRpb25PbkVsZW1lbnQoZWxlbWVudCk7CiAgICAgIH0gY2F0Y2ggKGRvdWJsZUZhdWx0KSB7CiAgICAgICAgLy8gSWdub3JpbmcgZXhjZXB0aW9ucyBpbiBleGNlcHRpb24gaGFuZGxpbmcuCiAgICAgIH0KICAgICAgcmV0aHJvdzsKICAgIH0gZmluYWxseSB7CiAgICAgIF9jdXJyZW50RWxlbWVudCA9IG9sZDsKICAgIH0KICB9CgogIHZvaWQgcmVwb3J0QXNzZXJ0aW9uRmFpbHVyZShTcGFubmFibGVBc3NlcnRpb25GYWlsdXJlIGV4KSB7CiAgICBTdHJpbmcgbWVzc2FnZSA9CiAgICAgICAgKGV4Lm1lc3NhZ2UgIT0gbnVsbCkgPyB0cnlUb1N0cmluZyhleC5tZXNzYWdlKSA6IHRyeVRvU3RyaW5nKGV4KTsKICAgIHJlcG9ydERpYWdub3N0aWNJbnRlcm5hbCgKICAgICAgICBjcmVhdGVNZXNzYWdlKGV4Lm5vZGUsIE1lc3NhZ2VLaW5kLkdFTkVSSUMsIHsndGV4dCc6IG1lc3NhZ2V9KSwKICAgICAgICBjb25zdCA8RGlhZ25vc3RpY01lc3NhZ2U+W10sCiAgICAgICAgYXBpLkRpYWdub3N0aWMuQ1JBU0gpOwogIH0KCiAgLy8vIFVzaW5nIFtmcm9udGVuZFN0cmF0ZWd5XSB0byBjb21wdXRlIGEgW1NvdXJjZVNwYW5dIGZyb20gc3Bhbm5hYmxlIHVzaW5nCiAgLy8vIHRoZSBbY3VycmVudEVsZW1lbnRdIGFzIGNvbnRleHQuCiAgU291cmNlU3BhbiBfc3BhbkZyb21TdHJhdGVneShTcGFubmFibGUgc3Bhbm5hYmxlKSB7CiAgICBTb3VyY2VTcGFuIHNwYW47CiAgICBpZiAoY29tcGlsZXIucGhhc2UgPT0gQ29tcGlsZXIuUEhBU0VfQ09NUElMSU5HKSB7CiAgICAgIHNwYW4gPQogICAgICAgICAgY29tcGlsZXIuYmFja2VuZFN0cmF0ZWd5LnNwYW5Gcm9tU3Bhbm5hYmxlKHNwYW5uYWJsZSwgY3VycmVudEVsZW1lbnQpOwogICAgfSBlbHNlIHsKICAgICAgc3BhbiA9IGNvbXBpbGVyLmZyb250ZW5kU3RyYXRlZ3kKICAgICAgICAgIC5zcGFuRnJvbVNwYW5uYWJsZShzcGFubmFibGUsIGN1cnJlbnRFbGVtZW50KTsKICAgIH0KICAgIGlmIChzcGFuICE9IG51bGwpIHJldHVybiBzcGFuOwogICAgdGhyb3cgJ05vIGVycm9yIGxvY2F0aW9uLic7CiAgfQoKICBAb3ZlcnJpZGUKICBTb3VyY2VTcGFuIHNwYW5Gcm9tU3Bhbm5hYmxlKFNwYW5uYWJsZSBzcGFubmFibGUpIHsKICAgIGlmIChzcGFubmFibGUgPT0gQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSkgewogICAgICBzcGFubmFibGUgPSBjdXJyZW50RWxlbWVudDsKICAgIH0gZWxzZSBpZiAoc3Bhbm5hYmxlID09IE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSkgewogICAgICBpZiAoY3VycmVudEVsZW1lbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIHNwYW5uYWJsZSA9IGN1cnJlbnRFbGVtZW50OwogICAgfQogICAgaWYgKHNwYW5uYWJsZSBpcyBTb3VyY2VTcGFuKSB7CiAgICAgIHJldHVybiBzcGFubmFibGU7CiAgICB9IGVsc2UgaWYgKHNwYW5uYWJsZSBpcyBISW5zdHJ1Y3Rpb24pIHsKICAgICAgRW50aXR5IGVsZW1lbnQgPSBzcGFubmFibGUuc291cmNlRWxlbWVudDsKICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgZWxlbWVudCA9IGN1cnJlbnRFbGVtZW50OwogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBwb3NpdGlvbiA9IHNwYW5uYWJsZS5zb3VyY2VJbmZvcm1hdGlvbjsKICAgICAgaWYgKHBvc2l0aW9uICE9IG51bGwpIHJldHVybiBwb3NpdGlvbi5zb3VyY2VTcGFuOwogICAgICByZXR1cm4gX3NwYW5Gcm9tU3RyYXRlZ3koZWxlbWVudCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gX3NwYW5Gcm9tU3RyYXRlZ3koc3Bhbm5hYmxlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGludGVybmFsRXJyb3IoU3Bhbm5hYmxlIHNwYW5uYWJsZSwgcmVhc29uKSB7CiAgICBTdHJpbmcgbWVzc2FnZSA9IHRyeVRvU3RyaW5nKHJlYXNvbik7CiAgICByZXBvcnREaWFnbm9zdGljSW50ZXJuYWwoCiAgICAgICAgY3JlYXRlTWVzc2FnZShzcGFubmFibGUsIE1lc3NhZ2VLaW5kLkdFTkVSSUMsIHsndGV4dCc6IG1lc3NhZ2V9KSwKICAgICAgICBjb25zdCA8RGlhZ25vc3RpY01lc3NhZ2U+W10sCiAgICAgICAgYXBpLkRpYWdub3N0aWMuQ1JBU0gpOwogICAgdGhyb3cgJ0ludGVybmFsIEVycm9yOiAkbWVzc2FnZSc7CiAgfQoKICB2b2lkIHVuaGFuZGxlZEV4Y2VwdGlvbk9uRWxlbWVudChFbnRpdHkgZWxlbWVudCkgewogICAgaWYgKGhhc0NyYXNoZWQpIHJldHVybjsKICAgIGhhc0NyYXNoZWQgPSB0cnVlOwogICAgcmVwb3J0RGlhZ25vc3RpYyhjcmVhdGVNZXNzYWdlKGVsZW1lbnQsIE1lc3NhZ2VLaW5kLkNPTVBJTEVSX0NSQVNIRUQpLAogICAgICAgIGNvbnN0IDxEaWFnbm9zdGljTWVzc2FnZT5bXSwgYXBpLkRpYWdub3N0aWMuQ1JBU0gpOwogICAgcGxlYXNlUmVwb3J0Q3Jhc2goKTsKICB9CgogIHZvaWQgcGxlYXNlUmVwb3J0Q3Jhc2goKSB7CiAgICBwcmludChNZXNzYWdlVGVtcGxhdGUuVEVNUExBVEVTW01lc3NhZ2VLaW5kLlBMRUFTRV9SRVBPUlRfVEhFX0NSQVNIXQogICAgICAgIC5tZXNzYWdlKHsnYnVpbGRJZCc6IGNvbXBpbGVyLm9wdGlvbnMuYnVpbGRJZH0pKTsKICB9CgogIC8vLyBGaW5kcyB0aGUgYXBwcm94aW1hdGUgW0VsZW1lbnRdIGZvciBbbm9kZV0uIFtjdXJyZW50RWxlbWVudF0gaXMgdXNlZCBhcwogIC8vLyB0aGUgZGVmYXVsdCB2YWx1ZS4KICBFbnRpdHkgZWxlbWVudEZyb21TcGFubmFibGUoU3Bhbm5hYmxlIG5vZGUpIHsKICAgIEVudGl0eSBlbGVtZW50OwogICAgaWYgKG5vZGUgaXMgRW50aXR5KSB7CiAgICAgIGVsZW1lbnQgPSBub2RlOwogICAgfSBlbHNlIGlmIChub2RlIGlzIEhJbnN0cnVjdGlvbikgewogICAgICBlbGVtZW50ID0gbm9kZS5zb3VyY2VFbGVtZW50OwogICAgfQogICAgcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiBjdXJyZW50RWxlbWVudDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgbG9nKG1lc3NhZ2UpIHsKICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZVRlbXBsYXRlLlRFTVBMQVRFU1tNZXNzYWdlS2luZC5HRU5FUklDXQogICAgICAgIC5tZXNzYWdlKHsndGV4dCc6ICckbWVzc2FnZSd9KTsKICAgIHJlcG9ydERpYWdub3N0aWMobmV3IERpYWdub3N0aWNNZXNzYWdlKG51bGwsIG51bGwsIG1zZyksCiAgICAgICAgY29uc3QgPERpYWdub3N0aWNNZXNzYWdlPltdLCBhcGkuRGlhZ25vc3RpYy5WRVJCT1NFX0lORk8pOwogIH0KCiAgU3RyaW5nIHRyeVRvU3RyaW5nKG9iamVjdCkgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIG9iamVjdC50b1N0cmluZygpOwogICAgfSBjYXRjaCAoXykgewogICAgICByZXR1cm4gJzxleGNlcHRpb24gaW4gdG9TdHJpbmcoKT4nOwogICAgfQogIH0KCiAgb25FcnJvcihVcmkgdXJpLCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICB0cnkgewogICAgICBpZiAoIWhhc0NyYXNoZWQpIHsKICAgICAgICBoYXNDcmFzaGVkID0gdHJ1ZTsKICAgICAgICBpZiAoZXJyb3IgaXMgU3Bhbm5hYmxlQXNzZXJ0aW9uRmFpbHVyZSkgewogICAgICAgICAgcmVwb3J0QXNzZXJ0aW9uRmFpbHVyZShlcnJvcik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlcG9ydERpYWdub3N0aWMoCiAgICAgICAgICAgICAgY3JlYXRlTWVzc2FnZSgKICAgICAgICAgICAgICAgICAgbmV3IFNvdXJjZVNwYW4odXJpLCAwLCAwKSwgTWVzc2FnZUtpbmQuQ09NUElMRVJfQ1JBU0hFRCksCiAgICAgICAgICAgICAgY29uc3QgPERpYWdub3N0aWNNZXNzYWdlPltdLAogICAgICAgICAgICAgIGFwaS5EaWFnbm9zdGljLkNSQVNIKTsKICAgICAgICB9CiAgICAgICAgcGxlYXNlUmVwb3J0Q3Jhc2goKTsKICAgICAgfQogICAgfSBjYXRjaCAoZG91YmxlRmF1bHQpIHsKICAgICAgLy8gSWdub3JpbmcgZXhjZXB0aW9ucyBpbiBleGNlcHRpb24gaGFuZGxpbmcuCiAgICB9CiAgICByZXR1cm4gbmV3IEZ1dHVyZS5lcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIG9uQ3Jhc2hJblVzZXJDb2RlKFN0cmluZyBtZXNzYWdlLCBleGNlcHRpb24sIHN0YWNrVHJhY2UpIHsKICAgIGhhc0NyYXNoZWQgPSB0cnVlOwogICAgcHJpbnQoJyRtZXNzYWdlOiAke3RyeVRvU3RyaW5nKGV4Y2VwdGlvbil9Jyk7CiAgICBwcmludCh0cnlUb1N0cmluZyhzdGFja1RyYWNlKSk7CiAgfQoKICB2b2lkIHJlcG9ydFN1cHByZXNzZWRNZXNzYWdlc1N1bW1hcnkoKSB7CiAgICBpZiAoIW9wdGlvbnMuc2hvd0FsbFBhY2thZ2VXYXJuaW5ncyAmJiAhb3B0aW9ucy5zdXBwcmVzc1dhcm5pbmdzKSB7CiAgICAgIHN1cHByZXNzZWRXYXJuaW5ncy5mb3JFYWNoKChVcmkgdXJpLCBTdXBwcmVzc2lvbkluZm8gaW5mbykgewogICAgICAgIE1lc3NhZ2VLaW5kIGtpbmQgPSBNZXNzYWdlS2luZC5ISURERU5fV0FSTklOR1NfSElOVFM7CiAgICAgICAgaWYgKGluZm8ud2FybmluZ3MgPT0gMCkgewogICAgICAgICAga2luZCA9IE1lc3NhZ2VLaW5kLkhJRERFTl9ISU5UUzsKICAgICAgICB9IGVsc2UgaWYgKGluZm8uaGludHMgPT0gMCkgewogICAgICAgICAga2luZCA9IE1lc3NhZ2VLaW5kLkhJRERFTl9XQVJOSU5HUzsKICAgICAgICB9CiAgICAgICAgTWVzc2FnZVRlbXBsYXRlIHRlbXBsYXRlID0gTWVzc2FnZVRlbXBsYXRlLlRFTVBMQVRFU1traW5kXTsKICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSB0ZW1wbGF0ZS5tZXNzYWdlKAogICAgICAgICAgICB7J3dhcm5pbmdzJzogaW5mby53YXJuaW5ncywgJ2hpbnRzJzogaW5mby5oaW50cywgJ3VyaSc6IHVyaX0sCiAgICAgICAgICAgIG9wdGlvbnMudGVyc2VEaWFnbm9zdGljcyk7CiAgICAgICAgcmVwb3J0RGlhZ25vc3RpYyhuZXcgRGlhZ25vc3RpY01lc3NhZ2UobnVsbCwgbnVsbCwgbWVzc2FnZSksCiAgICAgICAgICAgIGNvbnN0IDxEaWFnbm9zdGljTWVzc2FnZT5bXSwgYXBpLkRpYWdub3N0aWMuSElOVCk7CiAgICAgIH0pOwogICAgfQogIH0KfQoKY2xhc3MgX01hcEltcGFjdENhY2hlRGVsZXRlciBpbXBsZW1lbnRzIEltcGFjdENhY2hlRGVsZXRlciB7CiAgZmluYWwgTWFwPEVudGl0eSwgV29ybGRJbXBhY3Q+IF9pbXBhY3RDYWNoZTsKICBfTWFwSW1wYWN0Q2FjaGVEZWxldGVyKHRoaXMuX2ltcGFjdENhY2hlKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB1bmNhY2hlV29ybGRJbXBhY3QoRW50aXR5IGVsZW1lbnQpIHsKICAgIGlmIChyZXRhaW5EYXRhRm9yVGVzdGluZykgcmV0dXJuOwogICAgX2ltcGFjdENhY2hlLnJlbW92ZShlbGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW1wdHlDYWNoZSgpIHsKICAgIGlmIChyZXRhaW5EYXRhRm9yVGVzdGluZykgcmV0dXJuOwogICAgX2ltcGFjdENhY2hlLmNsZWFyKCk7CiAgfQp9CgpjbGFzcyBfRW1wdHlFbnZpcm9ubWVudCBpbXBsZW1lbnRzIEVudmlyb25tZW50IHsKICBjb25zdCBfRW1wdHlFbnZpcm9ubWVudCgpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmFsdWVPZihTdHJpbmcga2V5KSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBNYXA8U3RyaW5nLCBTdHJpbmc+IHRvTWFwKCkgPT4gY29uc3Qge307Cn0KCi8vLyBJbnRlcmZhY2UgZm9yIHNob3dpbmcgcHJvZ3Jlc3MgZHVyaW5nIGNvbXBpbGF0aW9uLgpjbGFzcyBQcm9ncmVzcyB7CiAgY29uc3QgUHJvZ3Jlc3MoKTsKCiAgLy8vIFN0YXJ0cyBhIG5ldyBwaGFzZSBmb3Igd2hpY2ggdG8gc2hvdyBwcm9ncmVzcy4KICB2b2lkIHN0YXJ0UGhhc2UoKSB7fQoKICAvLy8gU2hvd3MgcHJvZ3Jlc3Mgb2YgdGhlIGN1cnJlbnQgcGhhc2UgaWYgbmVlZGVkLiBUaGUgc2hvd24gbWVzc2FnZSBpcwogIC8vLyBjb21wdXRlZCBhcyAnJHByZWZpeCRjb3VudCRzdWZmaXgnLgogIHZvaWQgc2hvd1Byb2dyZXNzKFN0cmluZyBwcmVmaXgsIGludCBjb3VudCwgU3RyaW5nIHN1ZmZpeCkge30KfQoKLy8vIFByb2dyZXNzIGltcGxlbWVudGF0aW9ucyB0aGF0IHByaW50cyBwcm9ncmVzcyB0byB0aGUgW0RpYWdub3N0aWNSZXBvcnRlcl0KLy8vIHdpdGggNTAwbXMgaW50ZXJ2YWxzLgpjbGFzcyBQcm9ncmVzc0ltcGwgaW1wbGVtZW50cyBQcm9ncmVzcyB7CiAgZmluYWwgRGlhZ25vc3RpY1JlcG9ydGVyIF9yZXBvcnRlcjsKICBmaW5hbCBTdG9wd2F0Y2ggX3N0b3B3YXRjaCA9IG5ldyBTdG9wd2F0Y2goKS4uc3RhcnQoKTsKCiAgUHJvZ3Jlc3NJbXBsKHRoaXMuX3JlcG9ydGVyKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBzaG93UHJvZ3Jlc3MoU3RyaW5nIHByZWZpeCwgaW50IGNvdW50LCBTdHJpbmcgc3VmZml4KSB7CiAgICBpZiAoX3N0b3B3YXRjaC5lbGFwc2VkTWlsbGlzZWNvbmRzID4gNTAwKSB7CiAgICAgIF9yZXBvcnRlci5sb2coJyRwcmVmaXgkY291bnQkc3VmZml4Jyk7CiAgICAgIF9zdG9wd2F0Y2gucmVzZXQoKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgc3RhcnRQaGFzZSgpIHsKICAgIF9zdG9wd2F0Y2gucmVzZXQoKTsKICB9Cn0KCi8vLyBQcm9ncmVzcyBpbXBsZW1lbnRhdGlvbnMgdGhhdCBwcmludHMgcHJvZ3Jlc3MgdG8gdGhlIFtEaWFnbm9zdGljUmVwb3J0ZXJdCi8vLyB3aXRoIDUwMG1zIGludGVydmFscyB1c2luZyBlc2NhcGUgc2VxdWVuY2VzIHRvIGtlZXAgdGhlIHByb2dyZXNzIGRhdGEgb24gYQovLy8gc2luZ2xlIGxpbmUuCmNsYXNzIEludGVyYWN0aXZlUHJvZ3Jlc3MgaW1wbGVtZW50cyBQcm9ncmVzcyB7CiAgZmluYWwgU3RvcHdhdGNoIF9zdG9wd2F0Y2hQaGFzZSA9IG5ldyBTdG9wd2F0Y2goKS4uc3RhcnQoKTsKICBmaW5hbCBTdG9wd2F0Y2ggX3N0b3B3YXRjaEludGVydmFsID0gbmV3IFN0b3B3YXRjaCgpLi5zdGFydCgpOwogIEBvdmVycmlkZQogIHZvaWQgc3RhcnRQaGFzZSgpIHsKICAgIHByaW50KCcnKTsKICAgIF9zdG9wd2F0Y2hQaGFzZS5yZXNldCgpOwogICAgX3N0b3B3YXRjaEludGVydmFsLnJlc2V0KCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHNob3dQcm9ncmVzcyhTdHJpbmcgcHJlZml4LCBpbnQgY291bnQsIFN0cmluZyBzdWZmaXgpIHsKICAgIGlmIChfc3RvcHdhdGNoSW50ZXJ2YWwuZWxhcHNlZE1pbGxpc2Vjb25kcyA+IDUwMCkgewogICAgICB2YXIgdGltZSA9IF9zdG9wd2F0Y2hQaGFzZS5lbGFwc2VkTWlsbGlzZWNvbmRzIC8gMTAwMDsKICAgICAgdmFyIHJhdGUgPSBjb3VudCAvIF9zdG9wd2F0Y2hQaGFzZS5lbGFwc2VkTWlsbGlzZWNvbmRzOwogICAgICB2YXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoJ1x4MWJbMUFceDFiW0snKSAvLyBnbyB1cCBhbmQgY2xlYXIgdGhlIGxpbmUuCiAgICAgICAgLi53cml0ZSgnXHgxYls0ODs1OzQwbVx4MWJbMzBtPT0+XHgxYlswbSAkcHJlZml4JykKICAgICAgICAuLndyaXRlKGNvdW50KQogICAgICAgIC4ud3JpdGUoJyRzdWZmaXggRWxhcHNlZCB0aW1lOiAnKQogICAgICAgIC4ud3JpdGUodGltZS50b1N0cmluZ0FzRml4ZWQoMikpCiAgICAgICAgLi53cml0ZSgnIHMuIFJhdGU6ICcpCiAgICAgICAgLi53cml0ZShyYXRlLnRvU3RyaW5nQXNGaXhlZCgyKSkKICAgICAgICAuLndyaXRlKCcgdW5pdHMvbXMnKTsKICAgICAgcHJpbnQoJyRzJyk7CiAgICAgIF9zdG9wd2F0Y2hJbnRlcnZhbC5yZXNldCgpOwogICAgfQogIH0KfQqEFgBOTjwBHwEhATkoASYgMUUpFiY3QylHQishRhshSUI+HT48OSgkJkE8PyIoKy8uMSQ+NQE5MQEaGQEiASUjKCkqAToBNCEBTzglJwExJgE8ATwBLQEwPEQBRhMwTTIBIUsdDj0BOQEcISsdLAEvARgBTxEhARglHScBLwEoAScoLSgNASIBPjQBOzEBDCApMyohHRgBQi8kJTJBIC8NQQZBMz0zLEQBKCwGAR8nAQ4rQxo7MEhQKBAtEEEHASEEARsGNSYnNjg1BAE3KAEwDCYoPyEEASM5ASgFRRBDIwE3OjsfJBYlDAoBJhIZRDkBJysxKjkQCCcNOiwiTRAIIwE4KiBEKQgBT08+ODo9PwgBSAYEAU44QEJDFiUqAUkvIz4aBgQBTBcGSjUpKyIwDUAjBh8EAVE/HzxAHlA3PAoGRkwBRURCO0IzPiwBHTBEARJPLR8xATEBHTgVCC1QFQgGASIkAT4gMgYYBAE5Ik9KLkIzOQQBHztDN09EHQEfO1AqLgEvOwEcLEIGARwBIQQBSD42T0AoITw1LD8SCiArOh1DSz0XGBslNRoKLDgICAQBMjsfTTk4QRwEAUI+IgFNTiBCGQQBIk0vKSIgCiUaPihNMxUKCAQBTiEuMRUaFidGHTQlGEoTNyJPCAQBS0oPIiIEATNCG0cEATAbRgQBMzsBRkAEAUocRiIqBQFRHE8TBioTBjoEATo8MiAGNwQBTBMGNR8nBAFPBkwxBk1LTEAGUUxKHgZPJ0QyLypFI1EEAToGTlEvKC8pKjMcRT4IBhcEASgkIykrKisGEQQBTDQ/BAE/TU41HSNHKkQIJD0ZBgQCATYcKAE9QQEMIzwnQihOShcqNggGQAQBDDMuBAIBSRgUEQIBPhsMIwEaGwFEPCoBTSNLATsBMAEMUCQ0R008BAEMLkdEBAEMMEdGBAEMLUdDBAEODDskSjsEATs8KzYWJSJERzk3NhYOQzMyHxUcDi4UDBEiKxQMEQgGJywEATM8NSgoRRspKg8nCEA+BgQBDDsBTUshDCwhHwoSMBkkHQgZDx5DKQ8THwwuHjYIDxAdBgQBPhVKHkglHwQBTic2FTYNUQ0nOQYjIAQBDDYyIjUvIgYjGCwwNUA4KQ0rBgQBDC8qHkolHyYEATUcF0s8GQQBHUk6BAFOGTAUGhYnJAY3BAEMFkEoPUMEAR8KIBIqBgQBMwoZGzIpERwdTCslCh0IHDQGMAQBDEIXMiQEAStIQz4iKyYuCkQsSidFPwoGBAIBPS8tAQwsJiIEAQwWJhoEAgExHQEMJgEMKwIBNxEUATUXAUoqQAIBThopJjkBIAEMPzAtGgYEAQwWGAQCAU5PETA+QQwWDx0gBAEMPzg9Pk07FyopHikeEyIGBAIBInBhY2thZ2U6Y29tcGlsZXIvc3JjL2NvbXBpbGVyLmRhcnQ3c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvZGlhZ25vc3RpY3MvbWVzc2FnZXMuZGFydMAAdLkvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIFRoZSBtZXNzYWdlcyBpbiB0aGlzIGZpbGUgc2hvdWxkIGZvbGxvdyB0aGUgW0d1aWRlIGZvciBXcml0aW5nCi8vLyBEaWFnbm9zdGljc10oLi4vLi4vLi4vLi4vZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvZGlhZ25vc3RpY3MubWQpLgovLy8KLy8vIE90aGVyIHRoaW5ncyB0byBrZWVwIGluIG1pbmQ6Ci8vLwovLy8gQW4gSU5GTyBtZXNzYWdlIHNob3VsZCBhbHdheXMgYmUgcHJlY2VkZWQgYnkgYSBub24tSU5GTyBtZXNzYWdlLCBhbmQgdGhlCi8vLyBJTkZPIG1lc3NhZ2VzIGFyZSBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhlIHByZWNlZGluZyBub24tSU5GTwovLy8gbWVzc2FnZS4gRm9yIGV4YW1wbGUsIGNvbnNpZGVyIGR1cGxpY2F0ZWQgZWxlbWVudHMuIEZpcnN0IHJlcG9ydCBhIFdBUk5JTkcKLy8vIG9yIEVSUk9SIGFib3V0IHRoZSBkdXBsaWNhdGVkIGVsZW1lbnQsIGFuZCB0aGVuIHJlcG9ydCBhbiBJTkZPIGFib3V0IHRoZQovLy8gbG9jYXRpb24gb2YgdGhlIGV4aXN0aW5nIGVsZW1lbnQuCmxpYnJhcnkgZGFydDJqcy5tZXNzYWdlczsKCmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV91bnN0YWJsZS9kYXJ0MmpzLmRhcnQnIHNob3cgdG9rZW5Ub1N0cmluZzsKCmltcG9ydCAnZ2VuZXJhdGVkL3NoYXJlZF9tZXNzYWdlcy5kYXJ0JyBhcyBzaGFyZWRfbWVzc2FnZXM7CmltcG9ydCAnLi4vY29uc3RhbnRzL2V4cHJlc3Npb25zLmRhcnQnIHNob3cgQ29uc3RhbnRFeHByZXNzaW9uOwppbXBvcnQgJy4uL2NvbW1hbmRsaW5lX29wdGlvbnMuZGFydCc7CmltcG9ydCAnaW52YXJpYW50LmRhcnQnIHNob3cgZmFpbGVkQXQ7CmltcG9ydCAnc3Bhbm5hYmxlLmRhcnQnIHNob3cgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRTsKCmNvbnN0IERPTlRfS05PV19IT1dfVE9fRklYID0gIkNvbXB1dGVyIHNheXMgbm8hIjsKCi8vLyBLZXlzIGZvciB0aGUgW01lc3NhZ2VUZW1wbGF0ZV1zLgplbnVtIE1lc3NhZ2VLaW5kIHsKICBBQlNUUkFDVF9HRVRURVIsCiAgQ0FOTk9UX1JFU09MVkUsCiAgQ09NUElMRVJfQ1JBU0hFRCwKICBDT01QTEVYX1JFVFVSTklOR19OU00sCiAgQ09NUExFWF9USFJPV0lOR19OU00sCiAgQ09OU1RfQ09OU1RSVUNUT1JfV0lUSF9CT0RZLAogIENPTlNUX0ZBQ1RPUlksCiAgQ09OU1RSVUNUT1JfV0lUSF9SRVRVUk5fVFlQRSwKICBDWUNMSUNfQ09NUElMRV9USU1FX0NPTlNUQU5UUywKICBESVJFQ1RMWV9USFJPV0lOR19OU00sCiAgRVFVQUxfTUFQX0VOVFJZX0tFWSwKICBFUVVBTF9TRVRfRU5UUlksCiAgRVhUUkFORU9VU19NT0RJRklFUiwKICBFWFRSQU5FT1VTX01PRElGSUVSX1JFUExBQ0UsCiAgRk9SSU5fTk9UX0FTU0lHTkFCTEUsCiAgR0VORVJJQywKICBISURERU5fSElOVFMsCiAgSElEREVOX1dBUk5JTkdTLAogIEhJRERFTl9XQVJOSU5HU19ISU5UUywKICBJTVBMSUNJVF9KU19JTlRFUk9QX0ZJRUxEX05PVF9TVVBQT1JURUQsCiAgSU5WQUxJRF9BU1NFUlRfVkFMVUUsCiAgSU5WQUxJRF9BU1NFUlRfVkFMVUVfTUVTU0FHRSwKICBJTlZBTElEX0JPT0xfRlJPTV9FTlZJUk9OTUVOVF9ERUZBVUxUX1ZBTFVFX1RZUEUsCiAgSU5WQUxJRF9DT05TVEFOVF9DQVNULAogIElOVkFMSURfQ09OU1RBTlRfQUREX1RZUEVTLAogIElOVkFMSURfQ09OU1RBTlRfQklOQVJZX0lOVF9UWVBFLAogIElOVkFMSURfQ09OU1RBTlRfQklOQVJZX05VTV9UWVBFLAogIElOVkFMSURfQ09OU1RBTlRfQklOQVJZX1BSSU1JVElWRV9UWVBFLAogIElOVkFMSURfQ09OU1RBTlRfQ09NUExFTUVOVF9UWVBFLAogIElOVkFMSURfQ09OU1RBTlRfQ09ORElUSU9OQUxfVFlQRSwKICBJTlZBTElEX0NPTlNUQU5UX0NPTlNUUlVDVE9SLAogIElOVkFMSURfQ09OU1RBTlRfRElWLAogIElOVkFMSURfQ09OU1RBTlRfSU5ERVgsCiAgSU5WQUxJRF9DT05TVEFOVF9JTlRFUlBPTEFUSU9OX1RZUEUsCiAgSU5WQUxJRF9DT05TVEFOVF9ORUdBVEVfVFlQRSwKICBJTlZBTElEX0NPTlNUQU5UX05PVF9UWVBFLAogIElOVkFMSURfQ09OU1RBTlRfU1RSSU5HX0FERF9UWVBFLAogIElOVkFMSURfQ09OU1RBTlRfTlVNX0FERF9UWVBFLAogIElOVkFMSURfQ09OU1RBTlRfU1RSSU5HX0xFTkdUSF9UWVBFLAogIElOVkFMSURfQ09OU1RBTlRfU0hJRlQsCiAgSU5WQUxJRF9GUk9NX0VOVklST05NRU5UX05BTUVfVFlQRSwKICBJTlZBTElEX0lOVF9GUk9NX0VOVklST05NRU5UX0RFRkFVTFRfVkFMVUVfVFlQRSwKICBJTlZBTElEX0xPR0lDQUxfQU5EX09QRVJBTkRfVFlQRSwKICBJTlZBTElEX0xPR0lDQUxfT1JfT1BFUkFORF9UWVBFLAogIElOVkFMSURfTUVUQURBVEEsCiAgSU5WQUxJRF9NRVRBREFUQV9HRU5FUklDLAogIElOVkFMSURfUEFDS0FHRV9DT05GSUcsCiAgSU5WQUxJRF9QQUNLQUdFX1VSSSwKICBJTlZBTElEX1NUUklOR19GUk9NX0VOVklST05NRU5UX0RFRkFVTFRfVkFMVUVfVFlQRSwKICBKU19JTlRFUk9QX0NMQVNTX0NBTk5PVF9FWFRFTkRfREFSVF9DTEFTUywKICBKU19JTlRFUk9QX0NMQVNTX05PTl9FWFRFUk5BTF9DT05TVFJVQ1RPUiwKICBKU19JTlRFUk9QX0NMQVNTX05PTl9FWFRFUk5BTF9NRU1CRVIsCiAgSlNfSU5URVJPUF9GSUVMRF9OT1RfU1VQUE9SVEVELAogIEpTX0lOVEVST1BfSU5ERVhfTk9UX1NVUFBPUlRFRCwKICBKU19JTlRFUk9QX05PTl9FWFRFUk5BTF9NRU1CRVIsCiAgSlNfSU5URVJPUF9NRU1CRVJfSU5fTk9OX0pTX0lOVEVST1BfQ0xBU1MsCiAgSlNfSU5URVJPUF9NRVRIT0RfV0lUSF9OQU1FRF9BUkdVTUVOVFMsCiAgSlNfT0JKRUNUX0xJVEVSQUxfQ09OU1RSVUNUT1JfV0lUSF9QT1NJVElPTkFMX0FSR1VNRU5UUywKICBKU19QTEFDRUhPTERFUl9DQVBUVVJFLAogIExJQlJBUllfTk9UX0ZPVU5ELAogIE1JUlJPUlNfTElCUkFSWV9OT1RfU1VQUE9SVF9XSVRIX0NGRSwKICBNSVNTSU5HX0VYUFJFU1NJT05fSU5fVEhST1csCiAgTkFUSVZFX05PTl9JTlNUQU5DRV9JTl9OT05fTkFUSVZFX0NMQVNTLAogIE5PX1NVQ0hfU1VQRVJfTUVNQkVSLAogIE5PTl9OQVRJVkVfRVhURVJOQUwsCiAgTk9UX0FfQ09NUElMRV9USU1FX0NPTlNUQU5ULAogIE5PVF9BU1NJR05BQkxFLAogIFBMRUFTRV9SRVBPUlRfVEhFX0NSQVNILAogIFBSRUFNQkxFLAogIFJFVEhST1dfT1VUU0lERV9DQVRDSCwKICBSRVRVUk5fSU5fR0VORVJBVElWRV9DT05TVFJVQ1RPUiwKICBSRVRVUk5fSU5fR0VORVJBVE9SLAogIFJVTlRJTUVfVFlQRV9UT19TVFJJTkdfT0JKRUNULAogIFJVTlRJTUVfVFlQRV9UT19TVFJJTkdfU1VCVFlQRSwKICBTVFJJTkdfRVhQRUNURUQsCiAgVU5ERUZJTkVEX0dFVFRFUiwKICBVTkRFRklORURfSU5TVEFOQ0VfR0VUVEVSX0JVVF9TRVRURVIsCiAgVU5ERUZJTkVEX01FVEhPRCwKICBVTkRFRklORURfT1BFUkFUT1IsCiAgVU5ERUZJTkVEX1NFVFRFUiwKICBVTkRFRklORURfU1RBVElDX0dFVFRFUl9CVVRfU0VUVEVSLAogIFVOREVGSU5FRF9TVEFUSUNfU0VUVEVSX0JVVF9HRVRURVIsCiAgVU5ERUZJTkVEX1NVUEVSX1NFVFRFUiwKICBXUk9OR19BUkdVTUVOVF9GT1JfSlMsCiAgV1JPTkdfQVJHVU1FTlRfRk9SX0pTX0ZJUlNULAogIFdST05HX0FSR1VNRU5UX0ZPUl9KU19TRUNPTkQsCiAgV1JPTkdfQVJHVU1FTlRfRk9SX0pTX0lOVEVSQ0VQVE9SX0NPTlNUQU5ULAogIC8vIFRPRE8oMzI1NTcpOiBSZW1vdmUgdGhlc2Ugd2hlbiBpc3N1ZSAzMjU1NyBpcyBmaXhlZC4KICBTV0lUQ0hfQ0FTRV9GT1JCSURERU4sCiAgU1dJVENIX0NBU0VfVkFMVUVfT1ZFUlJJREVTX0VRVUFMUywKICBTV0lUQ0hfQ0FTRV9UWVBFU19OT1RfRVFVQUwsCiAgU1dJVENIX0NBU0VfVFlQRVNfTk9UX0VRVUFMX0NBU0UsCn0KCi8vLyBBIG1lc3NhZ2UgdGVtcGxhdGUgZm9yIGFuIGVycm9yLCB3YXJuaW5nLCBoaW50IG9yIGluZm8gbWVzc2FnZSBnZW5lcmF0ZWQKLy8vIGJ5IHRoZSBjb21waWxlci4gRWFjaCB0ZW1wbGF0ZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBbTWVzc2FnZUtpbmRdIHRoYXQKLy8vIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIG1lc3NhZ2UgdGVtcGxhdGUuCi8vIFRPRE8oam9obm5pd2ludGhlcik6IEZvciBJbmZvcywgY29uc2lkZXIgYWRkaW5nIGEgcmVmZXJlbmNlIHRvIHRoZQovLyBlcnJvci93YXJuaW5nL2hpbnQgdGhhdCB0aGV5IGJlbG9uZyB0by4KY2xhc3MgTWVzc2FnZVRlbXBsYXRlIHsKICBmaW5hbCBNZXNzYWdlS2luZCBraW5kOwoKICAvLy8gU2hvdWxkIGRlc2NyaWJlIHdoYXQgaXMgd3JvbmcgYW5kIHdoeS4KICBmaW5hbCBTdHJpbmcgdGVtcGxhdGU7CgogIC8vLyBTaG91bGQgZGVzY3JpYmUgaG93IHRvIGZpeCB0aGUgcHJvYmxlbS4gRWxpZGVkIHdoZW4gdXNpbmcgLS10ZXJzZSBvcHRpb24uCiAgZmluYWwgU3RyaW5nIGhvd1RvRml4OwoKICAvLy8gIEV4YW1wbGVzIHdpbGwgYmUgY2hlY2tlZCBieQogIC8vLyAgdGVzdHMvY29tcGlsZXIvZGFydDJqcy9tZXNzYWdlX2tpbmRfdGVzdC5kYXJ0LgogIC8vLwogIC8vLyAgQW4gZXhhbXBsZSBpcyBlaXRoZXIgYSBTdHJpbmcgY29udGFpbmluZyB0aGUgZXhhbXBsZSBzb3VyY2UgY29kZSBvciBhIE1hcAogIC8vLyAgZnJvbSBmaWxlbmFtZXMgdG8gc291cmNlIGNvZGUuIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIGZpbGVuYW1lIGZvciB0aGUKICAvLy8gIG1haW4gbGlicmFyeSBjb2RlIG11c3QgYmUgJ21haW4uZGFydCcuCiAgZmluYWwgTGlzdCBleGFtcGxlczsKCiAgLy8vIEFkZGl0aW9uYWwgb3B0aW9ucyBuZWVkZWQgZm9yIHRoZSBleGFtcGxlcyB0byB3b3JrLgogIGZpbmFsIExpc3Q8U3RyaW5nPiBvcHRpb25zOwoKICBjb25zdCBNZXNzYWdlVGVtcGxhdGUodGhpcy5raW5kLCB0aGlzLnRlbXBsYXRlLAogICAgICB7dGhpcy5ob3dUb0ZpeCwgdGhpcy5leGFtcGxlcywgdGhpcy5vcHRpb25zOiBjb25zdCA8U3RyaW5nPltdfSk7CgogIC8vLyBBbGwgdGVtcGxhdGVzIHVzZWQgYnkgdGhlIGNvbXBpbGVyLgogIC8vLwogIC8vLyBUaGUgbWFwIGlzIGNvbXBsZXRlIG1hcHBpbmcgZnJvbSBbTWVzc2FnZUtpbmRdIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcKICAvLy8gW01lc3NhZ2VUZW1wbGF0ZV0uCiAgLy8gVGhlIGtleSB0eXBlIGlzIGEgdW5pb24gb2YgTWVzc2FnZUtpbmQgYW5kIFNoYXJlZE1lc3NhZ2VLaW5kLgogIHN0YXRpYyBmaW5hbCBNYXA8ZHluYW1pYywgTWVzc2FnZVRlbXBsYXRlPiBURU1QTEFURVMgPSA8ZHluYW1pYywKICAgICAgTWVzc2FnZVRlbXBsYXRlPnt9CiAgICAuLmFkZEFsbChzaGFyZWRfbWVzc2FnZXMuVEVNUExBVEVTKQogICAgLi5hZGRBbGwoY29uc3QgPE1lc3NhZ2VLaW5kLCBNZXNzYWdlVGVtcGxhdGU+ewogICAgICAvLy8gRG8gbm90IHVzZSB0aGlzLiBJdCBpcyBoZXJlIGZvciBsZWdhY3kgYW5kIGRlYnVnZ2luZy4gSXQgdmlvbGF0ZXMgaXRlbQogICAgICAvLy8gNCBvZiB0aGUgZ3VpZGUgbGluZXMgZm9yIGVycm9yIG1lc3NhZ2VzIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCiAgICAgIE1lc3NhZ2VLaW5kLkdFTkVSSUM6CiAgICAgICAgICBjb25zdCBNZXNzYWdlVGVtcGxhdGUoTWVzc2FnZUtpbmQuR0VORVJJQywgJyN7dGV4dH0nKSwKCiAgICAgIE1lc3NhZ2VLaW5kLkNBTk5PVF9SRVNPTFZFOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5DQU5OT1RfUkVTT0xWRSwgIkNhbm5vdCByZXNvbHZlICcje25hbWV9Jy4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLk5PVF9BX0NPTVBJTEVfVElNRV9DT05TVEFOVDogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuTk9UX0FfQ09NUElMRV9USU1FX0NPTlNUQU5ULAogICAgICAgICAgIk5vdCBhIGNvbXBpbGUtdGltZSBjb25zdGFudC4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLkNZQ0xJQ19DT01QSUxFX1RJTUVfQ09OU1RBTlRTOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5DWUNMSUNfQ09NUElMRV9USU1FX0NPTlNUQU5UUywKICAgICAgICAgICJDeWNsZSBpbiB0aGUgY29tcGlsZS10aW1lIGNvbnN0YW50IGNvbXB1dGF0aW9uLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuVU5ERUZJTkVEX1NUQVRJQ19TRVRURVJfQlVUX0dFVFRFUjogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuVU5ERUZJTkVEX1NUQVRJQ19TRVRURVJfQlVUX0dFVFRFUiwKICAgICAgICAgICJDYW5ub3QgcmVzb2x2ZSBzZXR0ZXIuIiksCgogICAgICBNZXNzYWdlS2luZC5TVFJJTkdfRVhQRUNURUQ6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLlNUUklOR19FWFBFQ1RFRCwKICAgICAgICAgICJFeHBlY3RlZCBhICdTdHJpbmcnLCBidXQgZ290IGFuIGluc3RhbmNlIG9mICcje3R5cGV9Jy4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLkpTX0lOVEVST1BfQ0xBU1NfQ0FOTk9UX0VYVEVORF9EQVJUX0NMQVNTOgogICAgICAgICAgY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgICAgIE1lc3NhZ2VLaW5kLkpTX0lOVEVST1BfQ0xBU1NfQ0FOTk9UX0VYVEVORF9EQVJUX0NMQVNTLAogICAgICAgICAgICAgICJKcy1pbnRlcm9wIGNsYXNzICcje2Nsc30nIGNhbm5vdCBleHRlbmQgZnJvbSB0aGUgbm9uIGpzLWludGVyb3AgIgogICAgICAgICAgICAgICJjbGFzcyAnI3tzdXBlcmNsYXNzfScuIiwKICAgICAgICAgICAgICBob3dUb0ZpeDogIkFubm90YXRlIHRoZSBzdXBlcmNsYXNzIHdpdGggQEpTLiIsCiAgICAgICAgICAgICAgZXhhbXBsZXM6IGNvbnN0IFsKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgaW1wb3J0ICdwYWNrYWdlOmpzL2pzLmRhcnQnOwoKICAgICAgICAgICAgICBjbGFzcyBGb28geyB9CgogICAgICAgICAgICAgIEBKUygpCiAgICAgICAgICAgICAgY2xhc3MgQmFyIGV4dGVuZHMgRm9vIHsgfQoKICAgICAgICAgICAgICBtYWluKCkgewogICAgICAgICAgICAgICAgbmV3IEJhcigpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAiIiIKICAgICAgICAgIF0pLAoKICAgICAgTWVzc2FnZUtpbmQuSlNfSU5URVJPUF9JTkRFWF9OT1RfU1VQUE9SVEVEOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5KU19JTlRFUk9QX0lOREVYX05PVF9TVVBQT1JURUQsCiAgICAgICAgICAiSnMtaW50ZXJvcCBkb2VzIG5vdCBzdXBwb3J0IFtdIGFuZCBbXT0gb3BlcmF0b3IgbWV0aG9kcy4iLAogICAgICAgICAgaG93VG9GaXg6ICJUcnkgcmVwbGFjaW5nIFtdIGFuZCBbXT0gb3BlcmF0b3IgbWV0aG9kcyB3aXRoIG5vcm1hbCAiCiAgICAgICAgICAgICAgIm1ldGhvZHMuIiwKICAgICAgICAgIGV4YW1wbGVzOiBjb25zdCBbCiAgICAgICAgICAgICIiIgogICAgICAgIGltcG9ydCAncGFja2FnZTpqcy9qcy5kYXJ0JzsKCiAgICAgICAgQEpTKCkKICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgZXh0ZXJuYWwgb3BlcmF0b3IgW10oYXJnKTsKICAgICAgICB9CgogICAgICAgIG1haW4oKSB7CiAgICAgICAgICBuZXcgRm9vKClbMF07CiAgICAgICAgfQogICAgICAgICIiIiwKICAgICAgICAgICAgIiIiCiAgICAgICAgaW1wb3J0ICdwYWNrYWdlOmpzL2pzLmRhcnQnOwoKICAgICAgICBASlMoKQogICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICBleHRlcm5hbCBvcGVyYXRvciBbXT0oYXJnLCB2YWx1ZSk7CiAgICAgICAgfQoKICAgICAgICBtYWluKCkgewogICAgICAgICAgbmV3IEZvbygpWzBdID0gMTsKICAgICAgICB9CiAgICAgICAgIiIiCiAgICAgICAgICBdKSwKCiAgICAgIE1lc3NhZ2VLaW5kLkpTX09CSkVDVF9MSVRFUkFMX0NPTlNUUlVDVE9SX1dJVEhfUE9TSVRJT05BTF9BUkdVTUVOVFM6CiAgICAgICAgICBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICAgICAgTWVzc2FnZUtpbmQKICAgICAgICAgICAgICAgICAgLkpTX09CSkVDVF9MSVRFUkFMX0NPTlNUUlVDVE9SX1dJVEhfUE9TSVRJT05BTF9BUkdVTUVOVFMsCiAgICAgICAgICAgICAgIlNvbWUgcGFyYW1ldGVycyBpbiBhbm9ueW1vdXMganMtaW50ZXJvcCBjbGFzcyAnI3tjbHN9JyAiCiAgICAgICAgICAgICAgIm9iamVjdCBsaXRlcmFsIGNvbnN0cnVjdG9yIGFyZSBwb3NpdGlvbmFsIGluc3RlYWQgb2YgbmFtZWQuIgogICAgICAgICAgICAgICIuIiwKICAgICAgICAgICAgICBob3dUb0ZpeDogIk1ha2UgYWxsIGFyZ3VtZW50cyBpbiBleHRlcm5hbCBmYWN0b3J5IG9iamVjdCBsaXRlcmFsICIKICAgICAgICAgICAgICAgICAgImNvbnN0cnVjdG9ycyBuYW1lZC4iLAogICAgICAgICAgICAgIGV4YW1wbGVzOiBjb25zdCBbCiAgICAgICAgICAgICIiIgpjbGFzcyBTdXBlciB7CiAgZmFjdG9yeSBTdXBlci5mb28oKSA9PiBudWxsOwp9CmNsYXNzIENsYXNzIGV4dGVuZHMgU3VwZXIgewogIENsYXNzKCkgOiBzdXBlci5mb28oKTsKfQptYWluKCkgPT4gbmV3IENsYXNzKCk7CiIiIgogICAgICAgICAgXSksCgogICAgICBNZXNzYWdlS2luZC5KU19JTlRFUk9QX05PTl9FWFRFUk5BTF9NRU1CRVI6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLkpTX0lOVEVST1BfTk9OX0VYVEVSTkFMX01FTUJFUiwKICAgICAgICAgICJKcy1pbnRlcm9wIG1lbWJlcnMgbXVzdCBiZSAnZXh0ZXJuYWwnLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuSlNfSU5URVJPUF9NRU1CRVJfSU5fTk9OX0pTX0lOVEVST1BfQ0xBU1M6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLkpTX0lOVEVST1BfTUVNQkVSX0lOX05PTl9KU19JTlRFUk9QX0NMQVNTLAogICAgICAgICAgIkpzLWludGVyb3AgY2xhc3MgbWVtYmVycyBhcmUgb25seSBzdXBwb3J0ZWQgaW4ganMtaW50ZXJvcCBjbGFzc2VzLiIsCiAgICAgICAgICBob3dUb0ZpeDogIlRyeSBtYXJraW5nIHRoZSBlbmNsb3NpbmcgY2xhc3MgYXMganMtaW50ZXJvcCBvciAiCiAgICAgICAgICAgICAgInJlbW92ZSB0aGUganMtaW50ZXJvcCBhbm5vdGF0aW9uIGZyb20gdGhlIG1lbWJlci4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLkpTX0lOVEVST1BfQ0xBU1NfTk9OX0VYVEVSTkFMX0NPTlNUUlVDVE9SOgogICAgICAgICAgY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgICAgIE1lc3NhZ2VLaW5kLkpTX0lOVEVST1BfQ0xBU1NfTk9OX0VYVEVSTkFMX0NPTlNUUlVDVE9SLAogICAgICAgICAgICAgICJDb25zdHJ1Y3RvciAnI3tjb25zdHJ1Y3Rvcn0nIGluIGpzLWludGVyb3AgY2xhc3MgJyN7Y2xzfScgaXMgIgogICAgICAgICAgICAgICJub3QgZXh0ZXJuYWwuIiwKICAgICAgICAgICAgICBob3dUb0ZpeDogIlRyeSBhZGRpbmcgdGhlICdleHRlcm5hbCcgdG8gJyN7Y29uc3RydWN0b3J9Jy4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLkpTX0lOVEVST1BfQ0xBU1NfTk9OX0VYVEVSTkFMX01FTUJFUjogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuSlNfSU5URVJPUF9DTEFTU19OT05fRVhURVJOQUxfTUVNQkVSLAogICAgICAgICAgIk1lbWJlciAnI3ttZW1iZXJ9JyBpbiBqcy1pbnRlcm9wIGNsYXNzICcje2Nsc30nIGlzIG5vdCBleHRlcm5hbC4iLAogICAgICAgICAgaG93VG9GaXg6ICJUcnkgYWRkaW5nIHRoZSAnZXh0ZXJuYWwnIHRvICcje21lbWJlcn0nLiIsCiAgICAgICAgICBleGFtcGxlczogY29uc3QgWwogICAgICAgICAgICAiIiIKICAgICAgICAgICAgICBpbXBvcnQgJ3BhY2thZ2U6anMvanMuZGFydCc7CgogICAgICAgICAgICAgIEBKUygpCiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIGJhcigpIHt9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBtYWluKCkgewogICAgICAgICAgICAgICAgbmV3IEZvbygpLmJhcigpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAiIiIKICAgICAgICAgIF0pLAoKICAgICAgTWVzc2FnZUtpbmQuSlNfSU5URVJPUF9NRVRIT0RfV0lUSF9OQU1FRF9BUkdVTUVOVFM6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLkpTX0lOVEVST1BfTUVUSE9EX1dJVEhfTkFNRURfQVJHVU1FTlRTLAogICAgICAgICAgIkpzLWludGVyb3AgbWV0aG9kICcje21ldGhvZH0nIGhhcyBuYW1lZCBhcmd1bWVudHMgYnV0IGlzIG5vdCAiCiAgICAgICAgICAiYSBmYWN0b3J5IGNvbnN0cnVjdG9yIG9mIGFuIEBhbm9ueW1vdXMgQEpTIGNsYXNzLiIsCiAgICAgICAgICBob3dUb0ZpeDogIlJlbW92ZSBhbGwgbmFtZWQgYXJndW1lbnRzIGZyb20ganMtaW50ZXJvcCBtZXRob2Qgb3IgIgogICAgICAgICAgICAgICJpbiB0aGUgY2FzZSBvZiBhIGZhY3RvcnkgY29uc3RydWN0b3IgYW5ub3RhdGUgdGhlIGNsYXNzICIKICAgICAgICAgICAgICAiYXMgQGFub255bW91cy4iLAogICAgICAgICAgZXhhbXBsZXM6IGNvbnN0IFsKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgaW1wb3J0ICdwYWNrYWdlOmpzL2pzLmRhcnQnOwoKICAgICAgICAgICAgICBASlMoKQogICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBleHRlcm5hbCBiYXIoZm9vLCB7YmF6fSk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBtYWluKCkgewogICAgICAgICAgICAgICAgbmV3IEZvbygpLmJhcig0LCBiYXo6IDUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAiIiIKICAgICAgICAgIF0pLAogICAgICBNZXNzYWdlS2luZC5JTVBMSUNJVF9KU19JTlRFUk9QX0ZJRUxEX05PVF9TVVBQT1JURUQ6CiAgICAgICAgICBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICAgICAgTWVzc2FnZUtpbmQuSU1QTElDSVRfSlNfSU5URVJPUF9GSUVMRF9OT1RfU1VQUE9SVEVELAogICAgICAgICAgICAgICJGaWVsZHMgaW4ganMtaW50ZXJvcCBjbGFzc2VzIGFyZSBub3Qgc3VwcG9ydGVkLiIsCiAgICAgICAgICAgICAgaG93VG9GaXg6ICJUcnkgcmVwbGFjaW5nIHRoZSBmaWVsZCB3aXRoIGFuICIKICAgICAgICAgICAgICAgICAgImV4dGVybmFsIGdldHRlciBhbmQvb3Igc2V0dGVyLiIpLAogICAgICBNZXNzYWdlS2luZC5KU19JTlRFUk9QX0ZJRUxEX05PVF9TVVBQT1JURUQ6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLkpTX0lOVEVST1BfRklFTERfTk9UX1NVUFBPUlRFRCwKICAgICAgICAgICJGaWVsZCBjYW4ndCBiZSBtYXJrZWQgYXMganMtaW50ZXJvcC4iLAogICAgICAgICAgaG93VG9GaXg6ICJUcnkgcmVwbGFjaW5nIHRoZSBmaWVsZCB3aXRoIGFuICIKICAgICAgICAgICAgICAiZXh0ZXJuYWwgZ2V0dGVyIGFuZC9vciBzZXR0ZXIuIiksCgogICAgICBNZXNzYWdlS2luZC5MSUJSQVJZX05PVF9GT1VORDogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuTElCUkFSWV9OT1RfRk9VTkQsICJMaWJyYXJ5IG5vdCBmb3VuZCAnI3tyZXNvbHZlZFVyaX0nLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9QQUNLQUdFX0NPTkZJRzogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9QQUNLQUdFX0NPTkZJRywKICAgICAgICAgICIiIlBhY2thZ2UgY29uZmlnIGZpbGUgJyN7dXJpfScgaXMgaW52YWxpZC4KI3tleGNlcHRpb259IiIiLAogICAgICAgICAgaG93VG9GaXg6IERPTlRfS05PV19IT1dfVE9fRklYKSwKCiAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfUEFDS0FHRV9VUkk6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfUEFDS0FHRV9VUkksCiAgICAgICAgICAiJyN7dXJpfScgaXMgbm90IGEgdmFsaWQgcGFja2FnZSBVUkkgKCN7ZXhjZXB0aW9ufSkuIiwKICAgICAgICAgIGhvd1RvRml4OiBET05UX0tOT1dfSE9XX1RPX0ZJWCwKICAgICAgICAgIGV4YW1wbGVzOiBjb25zdCBbCiAgICAgICAgICAgICIiIgovLyBjYW4ndCBoYXZlIGEgJ3RvcCBsZXZlbCcgcGFja2FnZSBVUkkKaW1wb3J0ICdwYWNrYWdlOmZvby5kYXJ0JzsKCm1haW4oKSB7fQoiIiIsCiAgICAgICAgICAgICIiIgovLyBjYW4ndCBoYXZlIDIgc2xhc2hlcwppbXBvcnQgJ3BhY2thZ2U6Ly9mb28vZm9vLmRhcnQnOwoKbWFpbigpIHt9CiIiIiwKICAgICAgICAgICAgIiIiCi8vIHBhY2thZ2UgbmFtZSBtdXN0IGJlIHZhbGlkCmltcG9ydCAncGFja2FnZTpub3RcdmFsaWQvZm9vLmRhcnQnOwoKbWFpbigpIHt9CiIiIgogICAgICAgICAgXSksCgogICAgICBNZXNzYWdlS2luZC5KU19QTEFDRUhPTERFUl9DQVBUVVJFOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5KU19QTEFDRUhPTERFUl9DQVBUVVJFLAogICAgICAgICAgIkpTIGNvZGUgbXVzdCBub3QgdXNlICcjJyBwbGFjZWhvbGRlcnMgaW5zaWRlIGZ1bmN0aW9ucy4iLAogICAgICAgICAgaG93VG9GaXg6CiAgICAgICAgICAgICAgIlVzZSBhbiBpbW1lZGlhdGVseSBjYWxsZWQgSmF2YVNjcmlwdCBmdW5jdGlvbiB0byBjYXB0dXJlIHRoZSIKICAgICAgICAgICAgICAiIHRoZSBwbGFjZWhvbGRlciB2YWx1ZXMgYXMgSmF2YVNjcmlwdCBmdW5jdGlvbiBwYXJhbWV0ZXJzLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuV1JPTkdfQVJHVU1FTlRfRk9SX0pTOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5XUk9OR19BUkdVTUVOVF9GT1JfSlMsCiAgICAgICAgICAiSlMgZXhwcmVzc2lvbiBtdXN0IHRha2UgdHdvIG9yIG1vcmUgYXJndW1lbnRzLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuV1JPTkdfQVJHVU1FTlRfRk9SX0pTX0ZJUlNUOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5XUk9OR19BUkdVTUVOVF9GT1JfSlNfRklSU1QsCiAgICAgICAgICAiSlMgZXhwcmVzc2lvbiBtdXN0IHRha2UgdHdvIG9yIG1vcmUgYXJndW1lbnRzLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuV1JPTkdfQVJHVU1FTlRfRk9SX0pTX1NFQ09ORDogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuV1JPTkdfQVJHVU1FTlRfRk9SX0pTX1NFQ09ORCwKICAgICAgICAgICJKUyBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyBsaXRlcmFsLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuV1JPTkdfQVJHVU1FTlRfRk9SX0pTX0lOVEVSQ0VQVE9SX0NPTlNUQU5UOgogICAgICAgICAgY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgICAgIE1lc3NhZ2VLaW5kLldST05HX0FSR1VNRU5UX0ZPUl9KU19JTlRFUkNFUFRPUl9DT05TVEFOVCwKICAgICAgICAgICAgICAiQXJndW1lbnQgZm9yICdKU19JTlRFUkNFUFRPUl9DT05TVEFOVCcgbXVzdCBiZSBhIHR5cGUgY29uc3RhbnQuIiksCgogICAgICBNZXNzYWdlS2luZC5BQlNUUkFDVF9HRVRURVI6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLkFCU1RSQUNUX0dFVFRFUiwKICAgICAgICAgICJUaGUgZ2V0dGVyICcje25hbWV9JyBoYXMgbm8gaW1wbGVtZW50YXRpb24gaW4gIgogICAgICAgICAgImNsYXNzICcje2NsYXNzfScuIiwKICAgICAgICAgIGhvd1RvRml4OiAiVHJ5IGFkZGluZyBhIGJvZHkgdG8gJyN7bmFtZX0nIG9yIGRlY2xhcmluZyAiCiAgICAgICAgICAgICAgIicje2NsYXNzfScgdG8gYmUgJ2Fic3RyYWN0Jy4iLAogICAgICAgICAgZXhhbXBsZXM6IGNvbnN0IFsKICAgICAgICAgICAgIiIiCmNsYXNzIENsYXNzIHsKICBnZXQgZ2V0dGVyOwp9Cm1haW4oKSA9PiBuZXcgQ2xhc3MoKTsKIiIiCiAgICAgICAgICBdKSwKCiAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfTUVUQURBVEE6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfTUVUQURBVEEsCiAgICAgICAgICAiQSBtZXRhZGF0YSBhbm5vdGF0aW9uIG11c3QgYmUgZWl0aGVyIGEgcmVmZXJlbmNlIHRvIGEgY29tcGlsZS10aW1lICIKICAgICAgICAgICJjb25zdGFudCB2YXJpYWJsZSBvciBhIGNhbGwgdG8gYSBjb25zdGFudCBjb25zdHJ1Y3Rvci4iLAogICAgICAgICAgaG93VG9GaXg6CiAgICAgICAgICAgICAgIlRyeSB1c2luZyBhIGRpZmZlcmVudCBjb25zdGFudCB2YWx1ZSBvciByZWZlcmVuY2luZyBpdCB0aHJvdWdoIGEgIgogICAgICAgICAgICAgICJjb25zdGFudCB2YXJpYWJsZS4iLAogICAgICAgICAgZXhhbXBsZXM6IGNvbnN0IFsnQE9iamVjdCBtYWluKCkge30nLCAnQHByaW50IG1haW4oKSB7fSddKSwKCiAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfTUVUQURBVEFfR0VORVJJQzogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9NRVRBREFUQV9HRU5FUklDLAogICAgICAgICAgIkEgbWV0YWRhdGEgYW5ub3RhdGlvbiB1c2luZyBhIGNvbnN0YW50IGNvbnN0cnVjdG9yIGNhbm5vdCB1c2UgdHlwZSAiCiAgICAgICAgICAiYXJndW1lbnRzLiIsCiAgICAgICAgICBob3dUb0ZpeDoKICAgICAgICAgICAgICAiVHJ5IHJlbW92aW5nIHRoZSB0eXBlIGFyZ3VtZW50cyBvciByZWZlcmVuY2luZyB0aGUgY29uc3RhbnQgIgogICAgICAgICAgICAgICJ0aHJvdWdoIGEgY29uc3RhbnQgdmFyaWFibGUuIiwKICAgICAgICAgIGV4YW1wbGVzOiBjb25zdCBbCiAgICAgICAgICAgICcnJwpjbGFzcyBDPFQ+IHsKICBjb25zdCBDKCk7Cn0KQEM8aW50PigpIG1haW4oKSB7fQonJycKICAgICAgICAgIF0pLAoKICAgICAgTWVzc2FnZUtpbmQuRVFVQUxfTUFQX0VOVFJZX0tFWTogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuRVFVQUxfTUFQX0VOVFJZX0tFWSwKICAgICAgICAgICJBbiBlbnRyeSB3aXRoIHRoZSBzYW1lIGtleSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbWFwLiIsCiAgICAgICAgICBob3dUb0ZpeDoKICAgICAgICAgICAgICAiVHJ5IHJlbW92aW5nIHRoZSBwcmV2aW91cyBlbnRyeSBvciBjaGFuZ2luZyB0aGUga2V5IGluIG9uZSAiCiAgICAgICAgICAgICAgIm9mIHRoZSBlbnRyaWVzLiIsCiAgICAgICAgICBleGFtcGxlczogY29uc3QgWwogICAgICAgICAgICAiIiIKbWFpbigpIHsKICB2YXIgbSA9IGNvbnN0IHsnZm9vJzogMSwgJ2Zvbyc6IDJ9Owp9IiIiCiAgICAgICAgICBdKSwKCiAgICAgIE1lc3NhZ2VLaW5kLkVRVUFMX1NFVF9FTlRSWTogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuRVFVQUxfU0VUX0VOVFJZLCAiQW4gZW50cnkgYXBwZWFycyB0d2ljZSBpbiB0aGUgc2V0LiIsCiAgICAgICAgICBob3dUb0ZpeDogIlRyeSByZW1vdmluZyBvbmUgb2YgdGhlIGVudHJpZXMuIiwKICAgICAgICAgIGV4YW1wbGVzOiBjb25zdCBbCiAgICAgICAgICAgICIiIgptYWluKCkgewogIHZhciBtID0gY29uc3Qgeydmb28nLCAnYmFyJywgJ2Zvbyd9Owp9IiIiCiAgICAgICAgICBdKSwKCiAgICAgIE1lc3NhZ2VLaW5kLkNPTVBJTEVSX0NSQVNIRUQ6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLkNPTVBJTEVSX0NSQVNIRUQsCiAgICAgICAgICAiVGhlIGNvbXBpbGVyIGNyYXNoZWQgd2hlbiBjb21waWxpbmcgdGhpcyBlbGVtZW50LiIpLAoKICAgICAgTWVzc2FnZUtpbmQuUExFQVNFX1JFUE9SVF9USEVfQ1JBU0g6CiAgICAgICAgICBjb25zdCBNZXNzYWdlVGVtcGxhdGUoTWVzc2FnZUtpbmQuUExFQVNFX1JFUE9SVF9USEVfQ1JBU0gsICcnJwpUaGUgY29tcGlsZXIgaXMgYnJva2VuLgoKV2hlbiBjb21waWxpbmcgdGhlIGFib3ZlIGVsZW1lbnQsIHRoZSBjb21waWxlciBjcmFzaGVkLiBJdCBpcyBub3QKcG9zc2libGUgdG8gdGVsbCBpZiB0aGlzIGlzIGNhdXNlZCBieSBhIHByb2JsZW0gaW4geW91ciBwcm9ncmFtIG9yCm5vdC4gUmVnYXJkbGVzcywgdGhlIGNvbXBpbGVyIHNob3VsZCBub3QgY3Jhc2guCgpUaGUgRGFydCB0ZWFtIHdvdWxkIGdyZWF0bHkgYXBwcmVjaWF0ZSBpZiB5b3Ugd291bGQgdGFrZSBhIG1vbWVudCB0bwpyZXBvcnQgdGhpcyBwcm9ibGVtIGF0IGh0dHA6Ly9kYXJ0YnVnLmNvbS9uZXcuCgpQbGVhc2UgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOgoKKiB0aGUgbmFtZSBhbmQgdmVyc2lvbiBvZiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0sCgoqIHRoZSBEYXJ0IFNESyBidWlsZCBudW1iZXIgKCN7YnVpbGRJZH0pLCBhbmQKCiogdGhlIGVudGlyZSBtZXNzYWdlIHlvdSBzZWUgaGVyZSAoaW5jbHVkaW5nIHRoZSBmdWxsIHN0YWNrIHRyYWNlCiAgYmVsb3cgYXMgd2VsbCBhcyB0aGUgc291cmNlIGxvY2F0aW9uIGFib3ZlKS4KJycnKSwKCiAgICAgIE1lc3NhZ2VLaW5kLkhJRERFTl9XQVJOSU5HU19ISU5UUzogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuSElEREVOX1dBUk5JTkdTX0hJTlRTLAogICAgICAgICAgIiN7d2FybmluZ3N9IHdhcm5pbmcocykgYW5kICN7aGludHN9IGhpbnQocykgc3VwcHJlc3NlZCBpbiAje3VyaX0uIiksCgogICAgICBNZXNzYWdlS2luZC5ISURERU5fV0FSTklOR1M6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLkhJRERFTl9XQVJOSU5HUywKICAgICAgICAgICIje3dhcm5pbmdzfSB3YXJuaW5nKHMpIHN1cHByZXNzZWQgaW4gI3t1cml9LiIpLAoKICAgICAgTWVzc2FnZUtpbmQuSElEREVOX0hJTlRTOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5ISURERU5fSElOVFMsICIje2hpbnRzfSBoaW50KHMpIHN1cHByZXNzZWQgaW4gI3t1cml9LiIpLAoKICAgICAgTWVzc2FnZUtpbmQuUFJFQU1CTEU6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLlBSRUFNQkxFLAogICAgICAgICAgIldoZW4gcnVuIG9uIHRoZSBjb21tYW5kLWxpbmUsIHRoZSBjb21waWxlZCBvdXRwdXQgbWlnaHQiCiAgICAgICAgICAiIHJlcXVpcmUgYSBwcmVhbWJsZSBmaWxlIGxvY2F0ZWQgaW46XG4iCiAgICAgICAgICAiICA8c2RrPi9saWIvX2ludGVybmFsL2pzX3J1bnRpbWUvbGliL3ByZWFtYmxlcy4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQ09ORElUSU9OQUxfVFlQRTogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9DT05ESVRJT05BTF9UWVBFLAogICAgICAgICAgImAje2NvbnN0YW50fWAgb2YgdHlwZSAnI3t0eXBlfScgaXMgbm90IGEgdmFsaWQgY29uc3RhbnQgY29uZGl0aW9uLiAiCiAgICAgICAgICAiTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgJ2Jvb2wnLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9JTlRFUlBPTEFUSU9OX1RZUEU6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfSU5URVJQT0xBVElPTl9UWVBFLAogICAgICAgICAgImAje2NvbnN0YW50fWAgb2YgdHlwZSAnI3t0eXBlfScgaXMgbm90IHZhbGlkIGluIGNvbnN0YW50IHN0cmluZyAiCiAgICAgICAgICAiaW50ZXJwb2xhdGlvbi4gTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgJ2Jvb2wnLCAnaW50JywgJ2RvdWJsZScsICIKICAgICAgICAgICJvciAnU3RyaW5nJy4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQklOQVJZX1BSSU1JVElWRV9UWVBFOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0JJTkFSWV9QUklNSVRJVkVfVFlQRSwKICAgICAgICAgICJgI3tjb25zdGFudH1gIG9mIHR5cGUgJyN7dHlwZX0nIGlzIG5vdCBhIHZhbGlkIG9wZXJhbmQgb2YgYSAiCiAgICAgICAgICAiY29uc3RhbnQgYmluYXJ5ICN7b3BlcmF0b3J9IGV4cHJlc3Npb24uIE11c3QgYmUgYSB2YWx1ZSBvZiB0eXBlICIKICAgICAgICAgICInYm9vbCcsICdpbnQnLCAnZG91YmxlJywgJ1N0cmluZycsIG9yICdOdWxsJy4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfU1RSSU5HX0FERF9UWVBFOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX1NUUklOR19BRERfVFlQRSwKICAgICAgICAgICJgI3tjb25zdGFudH1gIG9mIHR5cGUgJyN7dHlwZX0nIGlzIG5vdCBhIHZhbGlkIG9wZXJhbmQgb2YgYSAiCiAgICAgICAgICAiY29uc3RhbnQgYmluYXJ5ICsgZXhwcmVzc2lvbiBvbiAnU3RyaW5nJy4gTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgIgogICAgICAgICAgIidTdHJpbmcnLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9TVFJJTkdfTEVOR1RIX1RZUEU6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfU1RSSU5HX0xFTkdUSF9UWVBFLAogICAgICAgICAgImAje2NvbnN0YW50fWAgb2YgdHlwZSAnI3t0eXBlfScgaXMgbm90IGEgdmFsaWQgb3BlcmFuZCBmb3IgYSAiCiAgICAgICAgICAiLmxlbmd0aCBleHByZXNzaW9uLiBNdXN0IGJlIGEgdmFsdWUgb2YgdHlwZSAnU3RyaW5nJy4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfU0hJRlQ6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfU0hJRlQsCiAgICAgICAgICAiU2hpZnQgYW1vdW50IG11c3QgYmUgbm9uLW5lZ2F0aXZlIGluICIKICAgICAgICAgICJgI3tsZWZ0fSAje29wZXJhdG9yfSAje3JpZ2h0fWAuIiksCgogICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0RJVjogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9ESVYsCiAgICAgICAgICAiRGl2aXNvciBtdXN0IGJlIG5vbi16ZXJvIGluIGAje2xlZnR9ICN7b3BlcmF0b3J9ICN7cmlnaHR9YC4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfTlVNX0FERF9UWVBFOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX05VTV9BRERfVFlQRSwKICAgICAgICAgICJgI3tjb25zdGFudH1gIG9mIHR5cGUgJyN7dHlwZX0nIGlzIG5vdCBhIHZhbGlkIG9wZXJhbmQgb2YgYSAiCiAgICAgICAgICAiY29uc3RhbnQgYmluYXJ5ICsgZXhwcmVzc2lvbiBvbiAnbnVtJy4gTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgIgogICAgICAgICAgIidpbnQnIG9yICdkb3VibGUnLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9DQVNUOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0NBU1QsCiAgICAgICAgICAiYCN7Y29uc3RhbnR9YCBvZiB0eXBlICcje3R5cGV9JyBpcyBub3QgYSBzdWJ0eXBlIG9mICN7Y2FzdFR5cGV9LiIpLAoKICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9BRERfVFlQRVM6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQUREX1RZUEVTLAogICAgICAgICAgImAje2xlZnRDb25zdGFudH1gIG9mIHR5cGUgJyN7bGVmdFR5cGV9JyBhbmQgIgogICAgICAgICAgImAje3JpZ2h0Q29uc3RhbnR9YCBvZiB0eXBlICcje3JpZ2h0VHlwZX0nIGFyZSBub3QgdmFsaWQgb3BlcmFuZHMgIgogICAgICAgICAgIm9mIGEgY29uc3RhbnQgYmluYXJ5ICsgZXhwcmVzc2lvbi4gTXVzdCBib3RoIGJlIGVpdGhlciBvZiAiCiAgICAgICAgICAidHlwZSAnU3RyaW5nJywgb3Igb2YgdHlwZXMgJ2ludCcgb3IgJ2RvdWJsZScuIiksCgogICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0JJTkFSWV9OVU1fVFlQRTogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9CSU5BUllfTlVNX1RZUEUsCiAgICAgICAgICAiYCN7Y29uc3RhbnR9YCBvZiB0eXBlICcje3R5cGV9JyBpcyBub3QgYSB2YWxpZCBvcGVyYW5kIG9mIGEgIgogICAgICAgICAgImNvbnN0YW50IGJpbmFyeSAje29wZXJhdG9yfSBleHByZXNzaW9uLiBNdXN0IGJlIGEgdmFsdWUgb2YgdHlwZSAiCiAgICAgICAgICAiJ2ludCcgb3IgJ2RvdWJsZScuIiksCgogICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0JJTkFSWV9JTlRfVFlQRTogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9CSU5BUllfSU5UX1RZUEUsCiAgICAgICAgICAiYCN7Y29uc3RhbnR9YCBvZiB0eXBlICcje3R5cGV9JyBpcyBub3QgYSB2YWxpZCBvcGVyYW5kIG9mIGEgIgogICAgICAgICAgImNvbnN0YW50IGJpbmFyeSAje29wZXJhdG9yfSBleHByZXNzaW9uLiBNdXN0IGJlIGEgdmFsdWUgb2YgdHlwZSAiCiAgICAgICAgICAiJ2ludCcuIiksCgogICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX05PVF9UWVBFOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX05PVF9UWVBFLAogICAgICAgICAgImAje2NvbnN0YW50fWAgb2YgdHlwZSAnI3t0eXBlfScgaXMgbm90IGEgdmFsaWQgb3BlcmFuZCBvZiBhICIKICAgICAgICAgICJjb25zdGFudCB1bmFyeSAje29wZXJhdG9yfSBleHByZXNzaW9uLiBNdXN0IGJlIGEgdmFsdWUgb2YgdHlwZSAiCiAgICAgICAgICAiJ2Jvb2wnLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9ORUdBVEVfVFlQRTogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9ORUdBVEVfVFlQRSwKICAgICAgICAgICJgI3tjb25zdGFudH1gIG9mIHR5cGUgJyN7dHlwZX0nIGlzIG5vdCBhIHZhbGlkIG9wZXJhbmQgb2YgYSAiCiAgICAgICAgICAiY29uc3RhbnQgdW5hcnkgI3tvcGVyYXRvcn0gZXhwcmVzc2lvbi4gTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgIgogICAgICAgICAgIidpbnQnIG9yICdkb3VibGUnLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9DT01QTEVNRU5UX1RZUEU6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQ09NUExFTUVOVF9UWVBFLAogICAgICAgICAgImAje2NvbnN0YW50fWAgb2YgdHlwZSAnI3t0eXBlfScgaXMgbm90IGEgdmFsaWQgb3BlcmFuZCBvZiBhICIKICAgICAgICAgICJjb25zdGFudCB1bmFyeSAje29wZXJhdG9yfSBleHByZXNzaW9uLiBNdXN0IGJlIGEgdmFsdWUgb2YgdHlwZSAiCiAgICAgICAgICAiJ2ludCcuIiksCgogICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0lOREVYOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0lOREVYLAogICAgICAgICAgIkluZGV4IGV4cHJlc3Npb25zIGFyZSBub3QgYWxsb3dlZCBpbiBjb25zdGFudCBleHByZXNzaW9ucy4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfRlJPTV9FTlZJUk9OTUVOVF9OQU1FX1RZUEU6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfRlJPTV9FTlZJUk9OTUVOVF9OQU1FX1RZUEUsCiAgICAgICAgICAiYCN7Y29uc3RhbnR9YCBvZiB0eXBlICcje3R5cGV9JyBpcyBub3QgYSB2YWxpZCBlbnZpcm9ubWVudCBuYW1lICIKICAgICAgICAgICJjb25zdGFudC4gTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgJ1N0cmluZycuIiksCgogICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0JPT0xfRlJPTV9FTlZJUk9OTUVOVF9ERUZBVUxUX1ZBTFVFX1RZUEU6CiAgICAgICAgICBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9CT09MX0ZST01fRU5WSVJPTk1FTlRfREVGQVVMVF9WQUxVRV9UWVBFLAogICAgICAgICAgICAgICJgI3tjb25zdGFudH1gIG9mIHR5cGUgJyN7dHlwZX0nIGlzIG5vdCBhIHZhbGlkICIKICAgICAgICAgICAgICAiYGJvb2wuZnJvbUVudmlyb25tZW50YCBkZWZhdWx0IHZhbHVlIGNvbnN0YW50LiAiCiAgICAgICAgICAgICAgIk11c3QgYmUgYSB2YWx1ZSBvZiB0eXBlICdib29sJyBvciBgbnVsbGAuIiksCgogICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0lOVF9GUk9NX0VOVklST05NRU5UX0RFRkFVTFRfVkFMVUVfVFlQRToKICAgICAgICAgIGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0lOVF9GUk9NX0VOVklST05NRU5UX0RFRkFVTFRfVkFMVUVfVFlQRSwKICAgICAgICAgICAgICAiYCN7Y29uc3RhbnR9YCBvZiB0eXBlICcje3R5cGV9JyBpcyBub3QgYSB2YWxpZCAiCiAgICAgICAgICAgICAgImBpbnQuZnJvbUVudmlyb25tZW50YCBkZWZhdWx0IHZhbHVlIGNvbnN0YW50LiAiCiAgICAgICAgICAgICAgIk11c3QgYmUgYSB2YWx1ZSBvZiB0eXBlICdpbnQnIG9yIGBudWxsYC4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfU1RSSU5HX0ZST01fRU5WSVJPTk1FTlRfREVGQVVMVF9WQUxVRV9UWVBFOgogICAgICAgICAgY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfU1RSSU5HX0ZST01fRU5WSVJPTk1FTlRfREVGQVVMVF9WQUxVRV9UWVBFLAogICAgICAgICAgICAgICJgI3tjb25zdGFudH1gIG9mIHR5cGUgJyN7dHlwZX0nIGlzIG5vdCBhIHZhbGlkICIKICAgICAgICAgICAgICAiYFN0cmluZy5mcm9tRW52aXJvbm1lbnRgIGRlZmF1bHQgdmFsdWUgY29uc3RhbnQuICIKICAgICAgICAgICAgICAiTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgJ1N0cmluZycgb3IgYG51bGxgLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9MT0dJQ0FMX0FORF9PUEVSQU5EX1RZUEU6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfTE9HSUNBTF9BTkRfT1BFUkFORF9UWVBFLAogICAgICAgICAgImAje2NvbnN0YW50fWAgb2YgdHlwZSAnI3t0eXBlfScgaXMgbm90IGEgdmFsaWQgbG9naWNhbCBhbmQgb3BlcmFuZC4gIgogICAgICAgICAgIk11c3QgYmUgYSB2YWx1ZSBvZiB0eXBlICdib29sJy4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfTE9HSUNBTF9PUl9PUEVSQU5EX1RZUEU6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfTE9HSUNBTF9PUl9PUEVSQU5EX1RZUEUsCiAgICAgICAgICAiYCN7Y29uc3RhbnR9YCBvZiB0eXBlICcje3R5cGV9JyBpcyBub3QgYSB2YWxpZCBsb2dpY2FsIG9yIG9wZXJhbmQuICIKICAgICAgICAgICJNdXN0IGJlIGEgdmFsdWUgb2YgdHlwZSAnYm9vbCcuIiksCgogICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0NPTlNUUlVDVE9SOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0NPTlNUUlVDVE9SLAogICAgICAgICAgIkNvbnN0cnVjdG9yICcje2NvbnN0cnVjdG9yTmFtZX0nIGlzIG5vdCBhIHZhbGlkIGNvbnN0YW50ICIKICAgICAgICAgICJjb25zdHJ1Y3Rvci4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQVNTRVJUX1ZBTFVFOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0FTU0VSVF9WQUxVRSwgIkFzc2VydGlvbiAnI3thc3NlcnRpb259JyBmYWlsZWQuIiksCgogICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0FTU0VSVF9WQUxVRV9NRVNTQUdFOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0FTU0VSVF9WQUxVRV9NRVNTQUdFLAogICAgICAgICAgIkFzc2VydGlvbiBmYWlsZWQ6ICN7bWVzc2FnZX0iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLk1JUlJPUlNfTElCUkFSWV9OT1RfU1VQUE9SVF9XSVRIX0NGRTogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuTUlSUk9SU19MSUJSQVJZX05PVF9TVVBQT1JUX1dJVEhfQ0ZFLCAiIiIKZGFydDJqcyBubyBsb25nZXIgc3VwcG9ydHMgdGhlIGRhcnQ6bWlycm9ycyBsaWJyYXJ5LgoKQVBJcyBmcm9tIHRoaXMgbGlicmFyeSB3aWxsIHRocm93IGEgcnVudGltZSBlcnJvciBhdCB0aGlzIHRpbWUsIGJ1dCB0aGV5IHdpbGwKYmVjb21lIGEgY29tcGlsZS10aW1lIGVycm9yIGluIHRoZSBmdXR1cmUuIiIiKSwKCiAgICAgIE1lc3NhZ2VLaW5kLkRJUkVDVExZX1RIUk9XSU5HX05TTTogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuRElSRUNUTFlfVEhST1dJTkdfTlNNLAogICAgICAgICAgIlRoaXMgJ25vU3VjaE1ldGhvZCcgaW1wbGVtZW50YXRpb24gaXMgZ3VhcmFudGVlZCB0byB0aHJvdyBhbiAiCiAgICAgICAgICAiZXhjZXB0aW9uLiBUaGUgZ2VuZXJhdGVkIGNvZGUgd2lsbCBiZSBzbWFsbGVyIGlmIGl0IGlzICIKICAgICAgICAgICJyZXdyaXR0ZW4uIiwKICAgICAgICAgIGhvd1RvRml4OiAiUmV3cml0ZSB0byAiCiAgICAgICAgICAgICAgIidub1N1Y2hNZXRob2QoSW52b2NhdGlvbiBpKSA9PiBzdXBlci5ub1N1Y2hNZXRob2QoaSk7Jy4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLkNPTVBMRVhfVEhST1dJTkdfTlNNOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5DT01QTEVYX1RIUk9XSU5HX05TTSwKICAgICAgICAgICJUaGlzICdub1N1Y2hNZXRob2QnIGltcGxlbWVudGF0aW9uIGlzIGd1YXJhbnRlZWQgdG8gdGhyb3cgYW4gIgogICAgICAgICAgImV4Y2VwdGlvbi4gVGhlIGdlbmVyYXRlZCBjb2RlIHdpbGwgYmUgc21hbGxlciBhbmQgdGhlIGNvbXBpbGVyICIKICAgICAgICAgICJ3aWxsIGJlIGFibGUgdG8gcGVyZm9ybSBtb3JlIG9wdGltaXphdGlvbnMgaWYgaXQgaXMgcmV3cml0dGVuLiIsCiAgICAgICAgICBob3dUb0ZpeDogIlJld3JpdGUgdG8gIgogICAgICAgICAgICAgICInbm9TdWNoTWV0aG9kKEludm9jYXRpb24gaSkgPT4gc3VwZXIubm9TdWNoTWV0aG9kKGkpOycuIiksCgogICAgICBNZXNzYWdlS2luZC5DT01QTEVYX1JFVFVSTklOR19OU006IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLkNPTVBMRVhfUkVUVVJOSU5HX05TTSwKICAgICAgICAgICJPdmVycmlkaW5nICdub1N1Y2hNZXRob2QnIGNhdXNlcyB0aGUgY29tcGlsZXIgdG8gZ2VuZXJhdGUgIgogICAgICAgICAgIm1vcmUgY29kZSBhbmQgcHJldmVudHMgdGhlIGNvbXBpbGVyIGZyb20gZG9pbmcgc29tZSBvcHRpbWl6YXRpb25zLiIsCiAgICAgICAgICBob3dUb0ZpeDogIkNvbnNpZGVyIHJlbW92aW5nIHRoaXMgJ25vU3VjaE1ldGhvZCcgaW1wbGVtZW50YXRpb24uIiksCgogICAgICBNZXNzYWdlS2luZC5SVU5USU1FX1RZUEVfVE9fU1RSSU5HX09CSkVDVDogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuUlVOVElNRV9UWVBFX1RPX1NUUklOR19PQkpFQ1QsCiAgICAgICAgICAiVXNpbmcgJy5ydW50aW1lVHlwZS50b1N0cmluZygpJyBjYXVzZXMgdGhlIGNvbXBpbGVyIHRvIGdlbmVyYXRlICIKICAgICAgICAgICJtb3JlIGNvZGUgYmVjYXVzZSBpdCBuZWVkcyB0byBwcmVzZXJ2ZSB0eXBlIGFyZ3VtZW50cyBvbiBhbGwgIgogICAgICAgICAgImdlbmVyaWMgY2xhc3NlcywgZXZlbiBpZiB0aGV5IGFyZSBub3QgbmVjZXNzYXJ5IGVsc2V3aGVyZS4iLAogICAgICAgICAgaG93VG9GaXg6ICJJZiB1c2VkIG9ubHkgZm9yIGRlYnVnZ2luZywgY29uc2lkZXIgdXNpbmcgb3B0aW9uICIKICAgICAgICAgICAgICAiJHtGbGFncy5sYXhSdW50aW1lVHlwZVRvU3RyaW5nfSB0byByZWR1Y2UgdGhlIGNvZGUgc2l6ZSAiCiAgICAgICAgICAgICAgImltcGFjdC4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLlJVTlRJTUVfVFlQRV9UT19TVFJJTkdfU1VCVFlQRTogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuUlVOVElNRV9UWVBFX1RPX1NUUklOR19TVUJUWVBFLAogICAgICAgICAgIlVzaW5nICcucnVudGltZVR5cGUudG9TdHJpbmcoKScgaGVyZSBjYXVzZXMgdGhlIGNvbXBpbGVyIHRvICIKICAgICAgICAgICJnZW5lcmF0ZSBtb3JlIGNvZGUgYmVjYXVzZSBpdCBuZWVkcyB0byBwcmVzZXJ2ZSB0eXBlIGFyZ3VtZW50cyBvbiAiCiAgICAgICAgICAiYWxsIGdlbmVyaWMgc3VidHlwZXMgb2YgJyN7cmVjZWl2ZXJUeXBlfScsIGV2ZW4gaWYgdGhleSBhcmUgbm90ICIKICAgICAgICAgICJuZWNlc3NhcnkgZWxzZXdoZXJlLiIsCiAgICAgICAgICBob3dUb0ZpeDogIklmIHVzZWQgb25seSBmb3IgZGVidWdnaW5nLCBjb25zaWRlciB1c2luZyBvcHRpb24gIgogICAgICAgICAgICAgICIke0ZsYWdzLmxheFJ1bnRpbWVUeXBlVG9TdHJpbmd9IHRvIHJlZHVjZSB0aGUgY29kZSBzaXplICIKICAgICAgICAgICAgICAiaW1wYWN0LiIpLAoKICAgICAgTWVzc2FnZUtpbmQuTk9OX05BVElWRV9FWFRFUk5BTDogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuTk9OX05BVElWRV9FWFRFUk5BTCwKICAgICAgICAgICJPbmx5IGV4dGVybmFsIGpzLWludGVyb3AgZnVuY3Rpb25zIGFyZSBzdXBwb3J0ZWQuIiwKICAgICAgICAgIGhvd1RvRml4OgogICAgICAgICAgICAgICJUcnkgcmVtb3ZpbmcgJ2V4dGVybmFsJyBrZXl3b3JkIG9yIGFubm90YXRpbmcgdGhlIGZ1bmN0aW9uICIKICAgICAgICAgICAgICAiYXMgYSBqcy1pbnRlcm9wIGZ1bmN0aW9uLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuTkFUSVZFX05PTl9JTlNUQU5DRV9JTl9OT05fTkFUSVZFX0NMQVNTOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5OQVRJVkVfTk9OX0lOU1RBTkNFX0lOX05PTl9OQVRJVkVfQ0xBU1MsCiAgICAgICAgICAiTmF0aXZlIG5vbi1pbnN0YW5jZSBtZW1iZXJzIGFyZSBvbmx5IGFsbG93ZWQgaW4gbmF0aXZlIGNsYXNzZXMuIiksCgogICAgICAvLyBUT0RPKDMyNTU3KTogUmVtb3ZlIHRoZXNlIHdoZW4gaXNzdWUgMzI1NTcgaXMgZml4ZWQuCiAgICAgIE1lc3NhZ2VLaW5kLlNXSVRDSF9DQVNFX1ZBTFVFX09WRVJSSURFU19FUVVBTFM6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLlNXSVRDSF9DQVNFX1ZBTFVFX09WRVJSSURFU19FUVVBTFMsCiAgICAgICAgICAiJ2Nhc2UnIGV4cHJlc3Npb24gdHlwZSAnI3t0eXBlfScgb3ZlcnJpZGVzICdvcGVyYXRvciA9PScuIiksCiAgICAgIE1lc3NhZ2VLaW5kLlNXSVRDSF9DQVNFX0ZPUkJJRERFTjogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuU1dJVENIX0NBU0VfRk9SQklEREVOLAogICAgICAgICAgIidjYXNlJyBleHByZXNzaW9uIG1heSBub3QgYmUgb2YgdHlwZSAnI3t0eXBlfScuIiksCiAgICAgIE1lc3NhZ2VLaW5kLlNXSVRDSF9DQVNFX1RZUEVTX05PVF9FUVVBTDogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuU1dJVENIX0NBU0VfVFlQRVNfTk9UX0VRVUFMLAogICAgICAgICAgIidjYXNlJyBleHByZXNzaW9ucyBkbyBub3QgYWxsIGhhdmUgdHlwZSAnI3t0eXBlfScuIiksCiAgICAgIE1lc3NhZ2VLaW5kLlNXSVRDSF9DQVNFX1RZUEVTX05PVF9FUVVBTF9DQVNFOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5TV0lUQ0hfQ0FTRV9UWVBFU19OT1RfRVFVQUxfQ0FTRSwKICAgICAgICAgICInY2FzZScgZXhwcmVzc2lvbiBvZiB0eXBlICcje3R5cGV9Jy4iKSwKICAgIH0pOyAvLyBFbmQgb2YgVEVNUExBVEVTLgoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiB0ZW1wbGF0ZTsKCiAgTWVzc2FnZSBtZXNzYWdlKFtNYXAgYXJndW1lbnRzID0gY29uc3Qge30sIGJvb2wgdGVyc2UgPSBmYWxzZV0pIHsKICAgIHJldHVybiBuZXcgTWVzc2FnZSh0aGlzLCBhcmd1bWVudHMsIHRlcnNlKTsKICB9CgogIGJvb2wgZ2V0IGhhc0hvd1RvRml4ID0+IGhvd1RvRml4ICE9IG51bGwgJiYgaG93VG9GaXggIT0gRE9OVF9LTk9XX0hPV19UT19GSVg7Cn0KCmNsYXNzIE1lc3NhZ2UgewogIGZpbmFsIE1lc3NhZ2VUZW1wbGF0ZSB0ZW1wbGF0ZTsKICBmaW5hbCBNYXAgYXJndW1lbnRzOwogIGZpbmFsIGJvb2wgdGVyc2U7CiAgU3RyaW5nIG1lc3NhZ2U7CgogIE1lc3NhZ2UodGhpcy50ZW1wbGF0ZSwgdGhpcy5hcmd1bWVudHMsIHRoaXMudGVyc2UpIHsKICAgIGFzc2VydCgoKSB7CiAgICAgIGNvbXB1dGVNZXNzYWdlKCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSgpKTsKICB9CgogIE1lc3NhZ2VLaW5kIGdldCBraW5kID0+IHRlbXBsYXRlLmtpbmQ7CgogIFN0cmluZyBjb21wdXRlTWVzc2FnZSgpIHsKICAgIGlmIChtZXNzYWdlID09IG51bGwpIHsKICAgICAgbWVzc2FnZSA9IHRlbXBsYXRlLnRlbXBsYXRlOwogICAgICBhcmd1bWVudHMuZm9yRWFjaCgoa2V5LCB2YWx1ZSkgewogICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2VBbGwoJyN7JHtrZXl9fScsIGNvbnZlcnRUb1N0cmluZyh2YWx1ZSkpOwogICAgICB9KTsKICAgICAgYXNzZXJ0KAogICAgICAgICAga2luZCA9PSBNZXNzYWdlS2luZC5HRU5FUklDIHx8CiAgICAgICAgICAgICAgIW1lc3NhZ2UuY29udGFpbnMobmV3IFJlZ0V4cChyJyNcey4rXH0nKSksCiAgICAgICAgICBmYWlsZWRBdChDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICAgICAgICdNaXNzaW5nIGFyZ3VtZW50cyBpbiBlcnJvciBtZXNzYWdlOiAiJG1lc3NhZ2UiJykpOwogICAgICBpZiAoIXRlcnNlICYmIHRlbXBsYXRlLmhhc0hvd1RvRml4KSB7CiAgICAgICAgU3RyaW5nIGhvd1RvRml4ID0gdGVtcGxhdGUuaG93VG9GaXg7CiAgICAgICAgYXJndW1lbnRzLmZvckVhY2goKGtleSwgdmFsdWUpIHsKICAgICAgICAgIGhvd1RvRml4ID0gaG93VG9GaXgucmVwbGFjZUFsbCgnI3ske2tleX19JywgY29udmVydFRvU3RyaW5nKHZhbHVlKSk7CiAgICAgICAgfSk7CiAgICAgICAgbWVzc2FnZSA9ICckbWVzc2FnZVxuJGhvd1RvRml4JzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG1lc3NhZ2U7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gY29tcHV0ZU1lc3NhZ2UoKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyEgTWVzc2FnZSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuICh0ZW1wbGF0ZSA9PSBvdGhlci50ZW1wbGF0ZSkgJiYgKHRvU3RyaW5nKCkgPT0gb3RoZXIudG9TdHJpbmcoKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdNZXNzYWdlLmhhc2hDb2RlJyk7CgogIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKHZhbHVlKSB7CiAgICBpZiAodmFsdWUgaXMgQ29uc3RhbnRFeHByZXNzaW9uKSB7CiAgICAgIHZhbHVlID0gdmFsdWUudG9EYXJ0VGV4dCgpOwogICAgfSBlbHNlIHsKICAgICAgdmFsdWUgPSB0b2tlblRvU3RyaW5nKHZhbHVlKTsKICAgIH0KICAgIHJldHVybiAnJHZhbHVlJzsKICB9Cn0KgwMATk48AUNGBCIETUZPTSYaAU0BPEAmJzgBMgElExMSFBkYHxEgIRkXExcfGAsQExkrGCA0GR4kJCokJSAYGicgHSQhJxomMyQjFBwaFzYtLSgiIiItKjsaFSgfKxgXHxIbDBkkFyEiExQoFBYUJiYaGR8gLjoZJh8kAgFNSy5GKxgaAS0ZAVAZASM2BlFPLhcBOh4BMkcBKgZMGUNDGSgzUVAbQQE5RAFGMysBSDU+AU06JQE6J0UBPSFFUSg9IBArARwBFCgBFxsQEg4BSTZGTRocECUBDhQlCgERGAoNECUBDhQtCgERHAoMDgFLIRpMSEwTUSkgEA4fAhwZAhcEDgFJNjUBVEFQSEQBPSFFTh9LAU88TkEcECsBFBoZEAEXIRASDgFRPko/TEkgHBArARQaKhABFyoQEg47IUNBOzVJNjI3MQE8UQFBLjYRKwE+K0EqHBAoGwEKBRAYIQEKBRAeJQEKBA4BQS5FFE1NAUAtPQFGMz0BRzQ7AT4hRlIBOic7H0MuHBAODgIXBA4BOyhQRBRSJEYBQzBQGBRNLhwQDQ0CFAQOAT4rQxRMIRwQCSYFDgE6TTgcEAknBQ4BOyhAAStJGAFCQzABRS8BKgExAS4BQi8GAUAtUAE6JzsBN08BMyBEMz4BTDlQLgFOO01NGwFRPklNPAFLOElPGAFOO0pEAUEuMi4BPyxKAUg1SUwhAUAtTwFFMjlORzwBSzhJTSEBSzhJTRUBRDFJTBYBRzRJTCEBSzhJTBUBQS5JAU06TToBRCFMQEA8AUMhS0A/OwFGIU5AQj4BSzhRLgFKN1AuAUc0RhsBP1EBRzQrAU9ANQFOMAFALUpEGCJKAT8sSkxMIkoBQC1HUE4BSDVNSkhJSRoBSTZJT00iSUkaAT4rPxRMLAFSP04BPk06SEAtPkYzQUs4Mx0BDCEBRDAEAVACARAiFxQSATcQGBMKBAEpARwbIydLCg4pOS5CLC0pTwwpCAYUBAEMFh0EAQwcKU0EAQxGASknIg0kBhUEAgEucGFja2FnZTpjb21waWxlci9zcmMvZGlhZ25vc3RpY3MvbWVzc2FnZXMuZGFydC5zZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9lbnZpcm9ubWVudC5kYXJ0gxAvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIENvbGxlY3RzIGRlZmluaXRpb25zIHByb3ZpZGVkIHRvIHRoZSBjb21waWxlciB2aWEgdGhlIGAtRGAgZmxhZy4KLy8vCi8vLyBFbnZpcm9ubWVudCB2YXJpYWJsZXMgY2FuIGJlIHVzZWQgaW4gdGhlIHVzZXIgY29kZSBpbiB0d28gd2F5cy4gRnJvbQovLy8gY29uZGl0aW9uYWwgaW1wb3J0cywgYW5kIGZyb20gYGNvbnN0IFN0cmluZy5mcm9tRW52aXJvbm1lbnRgIGFuZAovLy8gb3RoZXIgc2ltaWxhciBjb25zdHJ1Y3RvcnMuCmFic3RyYWN0IGNsYXNzIEVudmlyb25tZW50IHsKICAvLy8gUmV0dXJuIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGdpdmVuIGtleS4KICAvLy8KICAvLy8gTm90ZSB0aGF0IGBib29sLmZyb21FbnZpcm9ubWVudGAgYW5kIGBpbnQuZnJvbUVudmlyb25tZW50YCBhcmUgYWxzbwogIC8vLyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBgU3RyaW5nLmZyb21FbnZpcm9ubWVudGAuCiAgU3RyaW5nIHZhbHVlT2YoU3RyaW5nIGtleSk7CgogIC8vLyBSZXR1cm5zIHRoZSBmdWxsIGVudmlyb25tZW50IGFzIG1hcC4KICBNYXA8U3RyaW5nLCBTdHJpbmc+IHRvTWFwKCk7Cn0KFQBOTjwBRQRJRSAdMAZKOB4BKx8CASVwYWNrYWdlOmNvbXBpbGVyL3NyYy9lbnZpcm9ubWVudC5kYXJ0N3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2lvL2xvY2F0aW9uX3Byb3ZpZGVyLmRhcnSGMC8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuaW8ubG9jYXRpb25fcHJvdmlkZXI7CgppbXBvcnQgJ2NvZGVfb3V0cHV0LmRhcnQnIHNob3cgQ29kZU91dHB1dExpc3RlbmVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBMb2NhdGlvbiwgU291cmNlOwoKLy8vIEludGVyZmFjZSBmb3IgcHJvdmlkaW5nIGxpbmUvY29sdW1uIGluZm9ybWF0aW9uLgphYnN0cmFjdCBjbGFzcyBMb2NhdGlvblByb3ZpZGVyIHsKICAvLy8gVHJhbnNsYXRlcyB0aGUgemVyby1iYXNlZCBjaGFyYWN0ZXIgW29mZnNldF0gKGZyb20gdGhlIGJlZ2lubmluZyBvZiBhCiAgLy8vIGZpbGUpIHRvIGEgW0xvY2F0aW9uXS4KICBMb2NhdGlvbiBnZXRMb2NhdGlvbihpbnQgb2Zmc2V0KTsKfQoKLy8vIFtDb2RlT3V0cHV0TGlzdGVuZXJdIHRoYXQgY29sbGVjdHMgbGluZSBpbmZvcm1hdGlvbi4KY2xhc3MgTG9jYXRpb25Db2xsZWN0b3IgZXh0ZW5kcyBDb2RlT3V0cHV0TGlzdGVuZXIgaW1wbGVtZW50cyBMb2NhdGlvblByb3ZpZGVyIHsKICBpbnQgbGVuZ3RoID0gMDsKICBMaXN0PGludD4gbGluZVN0YXJ0cyA9IDxpbnQ+WzBdOwoKICB2b2lkIF9jb2xsZWN0KFN0cmluZyB0ZXh0KSB7CiAgICBpbnQgaW5kZXggPSAwOwogICAgd2hpbGUgKGluZGV4IDwgdGV4dC5sZW5ndGgpIHsKICAgICAgLy8gVW5peCB1c2VzICdcbicgYW5kIFdpbmRvd3MgdXNlcyAnXHJcbicsIHNvIHRoaXMgYWxnb3JpdGhtIHdvcmtzIGZvcgogICAgICAvLyBib3RoIHBsYXRmb3Jtcy4KICAgICAgaW5kZXggPSB0ZXh0LmluZGV4T2YoJ1xuJywgaW5kZXgpICsgMTsKICAgICAgaWYgKGluZGV4IDw9IDApIGJyZWFrOwogICAgICBsaW5lU3RhcnRzLmFkZChsZW5ndGggKyBpbmRleCk7CiAgICB9CiAgICBsZW5ndGggKz0gdGV4dC5sZW5ndGg7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIG9uVGV4dChTdHJpbmcgdGV4dCkgewogICAgX2NvbGxlY3QodGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBMb2NhdGlvbiBnZXRMb2NhdGlvbihpbnQgb2Zmc2V0KSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsdWVJbkludGVydmFsKG9mZnNldCwgMCwgbGVuZ3RoLCAnb2Zmc2V0Jyk7CiAgICByZXR1cm4gbmV3IFNvdXJjZShsaW5lU3RhcnRzLCBudWxsLCBudWxsLCBudWxsKS5nZXRMb2NhdGlvbihudWxsLCBvZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBvbkRvbmUoaW50IGxlbmd0aCkgewogICAgbGluZVN0YXJ0cy5hZGQobGVuZ3RoICsgMSk7CiAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnbGluZVN0YXJ0cz0kbGluZVN0YXJ0cyxsZW5ndGg9JGxlbmd0aCc7CiAgfQp9CjoATk48ASYBMwE4ATUiTB0kAgE5URIjAR8TIk0ZLR0mBhsEAQwdFAQBDCVCTwQBDBwgGgQBDBY0BAIBLnBhY2thZ2U6Y29tcGlsZXIvc3JjL2lvL2xvY2F0aW9uX3Byb3ZpZGVyLmRhcnQkc2Rrcm9vdDovcGtnL2tlcm5lbC9saWIvdmlzaXRvci5kYXJ0wAB3Ii8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCmxpYnJhcnkga2VybmVsLmFzdC52aXNpdG9yOwoKaW1wb3J0ICdkYXJ0OmNvcmUnIGhpZGUgTWFwRW50cnk7CgppbXBvcnQgJ2FzdC5kYXJ0JzsKCmFic3RyYWN0IGNsYXNzIEV4cHJlc3Npb25WaXNpdG9yPFI+IHsKICBjb25zdCBFeHByZXNzaW9uVmlzaXRvcigpOwoKICBSIGRlZmF1bHRFeHByZXNzaW9uKEV4cHJlc3Npb24gbm9kZSkgPT4gbnVsbDsKICBSIGRlZmF1bHRCYXNpY0xpdGVyYWwoQmFzaWNMaXRlcmFsIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwoKICBSIHZpc2l0SW52YWxpZEV4cHJlc3Npb24oSW52YWxpZEV4cHJlc3Npb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFZhcmlhYmxlR2V0KFZhcmlhYmxlR2V0IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRWYXJpYWJsZVNldChWYXJpYWJsZVNldCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0UHJvcGVydHlHZXQoUHJvcGVydHlHZXQgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFByb3BlcnR5U2V0KFByb3BlcnR5U2V0IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXREaXJlY3RQcm9wZXJ0eUdldChEaXJlY3RQcm9wZXJ0eUdldCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0RGlyZWN0UHJvcGVydHlTZXQoRGlyZWN0UHJvcGVydHlTZXQgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFN1cGVyUHJvcGVydHlHZXQoU3VwZXJQcm9wZXJ0eUdldCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0U3VwZXJQcm9wZXJ0eVNldChTdXBlclByb3BlcnR5U2V0IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRTdGF0aWNHZXQoU3RhdGljR2V0IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRTdGF0aWNTZXQoU3RhdGljU2V0IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRNZXRob2RJbnZvY2F0aW9uKE1ldGhvZEludm9jYXRpb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdERpcmVjdE1ldGhvZEludm9jYXRpb24oRGlyZWN0TWV0aG9kSW52b2NhdGlvbiBub2RlKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0U3VwZXJNZXRob2RJbnZvY2F0aW9uKFN1cGVyTWV0aG9kSW52b2NhdGlvbiBub2RlKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0U3RhdGljSW52b2NhdGlvbihTdGF0aWNJbnZvY2F0aW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXROb3QoTm90IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRMb2dpY2FsRXhwcmVzc2lvbihMb2dpY2FsRXhwcmVzc2lvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uKENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0U3RyaW5nQ29uY2F0ZW5hdGlvbihTdHJpbmdDb25jYXRlbmF0aW9uIG5vZGUpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRMaXN0Q29uY2F0ZW5hdGlvbihMaXN0Q29uY2F0ZW5hdGlvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0U2V0Q29uY2F0ZW5hdGlvbihTZXRDb25jYXRlbmF0aW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRNYXBDb25jYXRlbmF0aW9uKE1hcENvbmNhdGVuYXRpb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdEluc3RhbmNlQ3JlYXRpb24oSW5zdGFuY2VDcmVhdGlvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0SXNFeHByZXNzaW9uKElzRXhwcmVzc2lvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0QXNFeHByZXNzaW9uKEFzRXhwcmVzc2lvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0U3ltYm9sTGl0ZXJhbChTeW1ib2xMaXRlcmFsIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRUeXBlTGl0ZXJhbChUeXBlTGl0ZXJhbCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0VGhpc0V4cHJlc3Npb24oVGhpc0V4cHJlc3Npb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFJldGhyb3coUmV0aHJvdyBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0VGhyb3coVGhyb3cgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdExpc3RMaXRlcmFsKExpc3RMaXRlcmFsIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRTZXRMaXRlcmFsKFNldExpdGVyYWwgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdE1hcExpdGVyYWwoTWFwTGl0ZXJhbCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0QXdhaXRFeHByZXNzaW9uKEF3YWl0RXhwcmVzc2lvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKEZ1bmN0aW9uRXhwcmVzc2lvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0Q29uc3RhbnRFeHByZXNzaW9uKENvbnN0YW50RXhwcmVzc2lvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0U3RyaW5nTGl0ZXJhbChTdHJpbmdMaXRlcmFsIG5vZGUpID0+IGRlZmF1bHRCYXNpY0xpdGVyYWwobm9kZSk7CiAgUiB2aXNpdEludExpdGVyYWwoSW50TGl0ZXJhbCBub2RlKSA9PiBkZWZhdWx0QmFzaWNMaXRlcmFsKG5vZGUpOwogIFIgdmlzaXREb3VibGVMaXRlcmFsKERvdWJsZUxpdGVyYWwgbm9kZSkgPT4gZGVmYXVsdEJhc2ljTGl0ZXJhbChub2RlKTsKICBSIHZpc2l0Qm9vbExpdGVyYWwoQm9vbExpdGVyYWwgbm9kZSkgPT4gZGVmYXVsdEJhc2ljTGl0ZXJhbChub2RlKTsKICBSIHZpc2l0TnVsbExpdGVyYWwoTnVsbExpdGVyYWwgbm9kZSkgPT4gZGVmYXVsdEJhc2ljTGl0ZXJhbChub2RlKTsKICBSIHZpc2l0TGV0KExldCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0QmxvY2tFeHByZXNzaW9uKEJsb2NrRXhwcmVzc2lvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0SW5zdGFudGlhdGlvbihJbnN0YW50aWF0aW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRMb2FkTGlicmFyeShMb2FkTGlicmFyeSBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0Q2hlY2tMaWJyYXJ5SXNMb2FkZWQoQ2hlY2tMaWJyYXJ5SXNMb2FkZWQgbm9kZSkgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7Cn0KCmFic3RyYWN0IGNsYXNzIFN0YXRlbWVudFZpc2l0b3I8Uj4gewogIGNvbnN0IFN0YXRlbWVudFZpc2l0b3IoKTsKCiAgUiBkZWZhdWx0U3RhdGVtZW50KFN0YXRlbWVudCBub2RlKSA9PiBudWxsOwoKICBSIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdEJsb2NrKEJsb2NrIG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdEFzc2VydEJsb2NrKEFzc2VydEJsb2NrIG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdEVtcHR5U3RhdGVtZW50KEVtcHR5U3RhdGVtZW50IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdEFzc2VydFN0YXRlbWVudChBc3NlcnRTdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0TGFiZWxlZFN0YXRlbWVudChMYWJlbGVkU3RhdGVtZW50IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdEJyZWFrU3RhdGVtZW50KEJyZWFrU3RhdGVtZW50IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdFdoaWxlU3RhdGVtZW50KFdoaWxlU3RhdGVtZW50IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdERvU3RhdGVtZW50KERvU3RhdGVtZW50IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdEZvclN0YXRlbWVudChGb3JTdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0Rm9ySW5TdGF0ZW1lbnQoRm9ySW5TdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0U3dpdGNoU3RhdGVtZW50KFN3aXRjaFN0YXRlbWVudCBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRDb250aW51ZVN3aXRjaFN0YXRlbWVudChDb250aW51ZVN3aXRjaFN0YXRlbWVudCBub2RlKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRJZlN0YXRlbWVudChJZlN0YXRlbWVudCBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRSZXR1cm5TdGF0ZW1lbnQoUmV0dXJuU3RhdGVtZW50IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdFRyeUNhdGNoKFRyeUNhdGNoIG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdFRyeUZpbmFsbHkoVHJ5RmluYWxseSBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRZaWVsZFN0YXRlbWVudChZaWVsZFN0YXRlbWVudCBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7Cn0KCmFic3RyYWN0IGNsYXNzIE1lbWJlclZpc2l0b3I8Uj4gewogIGNvbnN0IE1lbWJlclZpc2l0b3IoKTsKCiAgUiBkZWZhdWx0TWVtYmVyKE1lbWJlciBub2RlKSA9PiBudWxsOwoKICBSIHZpc2l0Q29uc3RydWN0b3IoQ29uc3RydWN0b3Igbm9kZSkgPT4gZGVmYXVsdE1lbWJlcihub2RlKTsKICBSIHZpc2l0UHJvY2VkdXJlKFByb2NlZHVyZSBub2RlKSA9PiBkZWZhdWx0TWVtYmVyKG5vZGUpOwogIFIgdmlzaXRGaWVsZChGaWVsZCBub2RlKSA9PiBkZWZhdWx0TWVtYmVyKG5vZGUpOwogIFIgdmlzaXRSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcihSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciBub2RlKSB7CiAgICByZXR1cm4gZGVmYXVsdE1lbWJlcihub2RlKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIEluaXRpYWxpemVyVmlzaXRvcjxSPiB7CiAgY29uc3QgSW5pdGlhbGl6ZXJWaXNpdG9yKCk7CgogIFIgZGVmYXVsdEluaXRpYWxpemVyKEluaXRpYWxpemVyIG5vZGUpID0+IG51bGw7CgogIFIgdmlzaXRJbnZhbGlkSW5pdGlhbGl6ZXIoSW52YWxpZEluaXRpYWxpemVyIG5vZGUpID0+CiAgICAgIGRlZmF1bHRJbml0aWFsaXplcihub2RlKTsKICBSIHZpc2l0RmllbGRJbml0aWFsaXplcihGaWVsZEluaXRpYWxpemVyIG5vZGUpID0+IGRlZmF1bHRJbml0aWFsaXplcihub2RlKTsKICBSIHZpc2l0U3VwZXJJbml0aWFsaXplcihTdXBlckluaXRpYWxpemVyIG5vZGUpID0+IGRlZmF1bHRJbml0aWFsaXplcihub2RlKTsKICBSIHZpc2l0UmVkaXJlY3RpbmdJbml0aWFsaXplcihSZWRpcmVjdGluZ0luaXRpYWxpemVyIG5vZGUpID0+CiAgICAgIGRlZmF1bHRJbml0aWFsaXplcihub2RlKTsKICBSIHZpc2l0TG9jYWxJbml0aWFsaXplcihMb2NhbEluaXRpYWxpemVyIG5vZGUpID0+IGRlZmF1bHRJbml0aWFsaXplcihub2RlKTsKICBSIHZpc2l0QXNzZXJ0SW5pdGlhbGl6ZXIoQXNzZXJ0SW5pdGlhbGl6ZXIgbm9kZSkgPT4gZGVmYXVsdEluaXRpYWxpemVyKG5vZGUpOwp9CgpjbGFzcyBUcmVlVmlzaXRvcjxSPgogICAgaW1wbGVtZW50cwogICAgICAgIEV4cHJlc3Npb25WaXNpdG9yPFI+LAogICAgICAgIFN0YXRlbWVudFZpc2l0b3I8Uj4sCiAgICAgICAgTWVtYmVyVmlzaXRvcjxSPiwKICAgICAgICBJbml0aWFsaXplclZpc2l0b3I8Uj4gewogIGNvbnN0IFRyZWVWaXNpdG9yKCk7CgogIFIgZGVmYXVsdFRyZWVOb2RlKFRyZWVOb2RlIG5vZGUpID0+IG51bGw7CgogIC8vIEV4cHJlc3Npb25zCiAgUiBkZWZhdWx0RXhwcmVzc2lvbihFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRUcmVlTm9kZShub2RlKTsKICBSIGRlZmF1bHRCYXNpY0xpdGVyYWwoQmFzaWNMaXRlcmFsIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRJbnZhbGlkRXhwcmVzc2lvbihJbnZhbGlkRXhwcmVzc2lvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0VmFyaWFibGVHZXQoVmFyaWFibGVHZXQgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFZhcmlhYmxlU2V0KFZhcmlhYmxlU2V0IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRQcm9wZXJ0eUdldChQcm9wZXJ0eUdldCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0UHJvcGVydHlTZXQoUHJvcGVydHlTZXQgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdERpcmVjdFByb3BlcnR5R2V0KERpcmVjdFByb3BlcnR5R2V0IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXREaXJlY3RQcm9wZXJ0eVNldChEaXJlY3RQcm9wZXJ0eVNldCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0U3VwZXJQcm9wZXJ0eUdldChTdXBlclByb3BlcnR5R2V0IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRTdXBlclByb3BlcnR5U2V0KFN1cGVyUHJvcGVydHlTZXQgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFN0YXRpY0dldChTdGF0aWNHZXQgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFN0YXRpY1NldChTdGF0aWNTZXQgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdE1ldGhvZEludm9jYXRpb24oTWV0aG9kSW52b2NhdGlvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0RGlyZWN0TWV0aG9kSW52b2NhdGlvbihEaXJlY3RNZXRob2RJbnZvY2F0aW9uIG5vZGUpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRTdXBlck1ldGhvZEludm9jYXRpb24oU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKFN0YXRpY0ludm9jYXRpb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdE5vdChOb3Qgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdExvZ2ljYWxFeHByZXNzaW9uKExvZ2ljYWxFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRDb25kaXRpb25hbEV4cHJlc3Npb24oQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKFN0cmluZ0NvbmNhdGVuYXRpb24gbm9kZSkgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdExpc3RDb25jYXRlbmF0aW9uKExpc3RDb25jYXRlbmF0aW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRTZXRDb25jYXRlbmF0aW9uKFNldENvbmNhdGVuYXRpb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdE1hcENvbmNhdGVuYXRpb24oTWFwQ29uY2F0ZW5hdGlvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0SW5zdGFuY2VDcmVhdGlvbihJbnN0YW5jZUNyZWF0aW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRJc0V4cHJlc3Npb24oSXNFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRBc0V4cHJlc3Npb24oQXNFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRTeW1ib2xMaXRlcmFsKFN5bWJvbExpdGVyYWwgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFR5cGVMaXRlcmFsKFR5cGVMaXRlcmFsIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRUaGlzRXhwcmVzc2lvbihUaGlzRXhwcmVzc2lvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0UmV0aHJvdyhSZXRocm93IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRUaHJvdyhUaHJvdyBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0TGlzdExpdGVyYWwoTGlzdExpdGVyYWwgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFNldExpdGVyYWwoU2V0TGl0ZXJhbCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0TWFwTGl0ZXJhbChNYXBMaXRlcmFsIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRBd2FpdEV4cHJlc3Npb24oQXdhaXRFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oRnVuY3Rpb25FeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRDb25zdGFudEV4cHJlc3Npb24oQ29uc3RhbnRFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRTdHJpbmdMaXRlcmFsKFN0cmluZ0xpdGVyYWwgbm9kZSkgPT4gZGVmYXVsdEJhc2ljTGl0ZXJhbChub2RlKTsKICBSIHZpc2l0SW50TGl0ZXJhbChJbnRMaXRlcmFsIG5vZGUpID0+IGRlZmF1bHRCYXNpY0xpdGVyYWwobm9kZSk7CiAgUiB2aXNpdERvdWJsZUxpdGVyYWwoRG91YmxlTGl0ZXJhbCBub2RlKSA9PiBkZWZhdWx0QmFzaWNMaXRlcmFsKG5vZGUpOwogIFIgdmlzaXRCb29sTGl0ZXJhbChCb29sTGl0ZXJhbCBub2RlKSA9PiBkZWZhdWx0QmFzaWNMaXRlcmFsKG5vZGUpOwogIFIgdmlzaXROdWxsTGl0ZXJhbChOdWxsTGl0ZXJhbCBub2RlKSA9PiBkZWZhdWx0QmFzaWNMaXRlcmFsKG5vZGUpOwogIFIgdmlzaXRMZXQoTGV0IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRCbG9ja0V4cHJlc3Npb24oQmxvY2tFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRJbnN0YW50aWF0aW9uKEluc3RhbnRpYXRpb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdExvYWRMaWJyYXJ5KExvYWRMaWJyYXJ5IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRDaGVja0xpYnJhcnlJc0xvYWRlZChDaGVja0xpYnJhcnlJc0xvYWRlZCBub2RlKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKCiAgLy8gU3RhdGVtZW50cwogIFIgZGVmYXVsdFN0YXRlbWVudChTdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIFIgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0QmxvY2soQmxvY2sgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0QXNzZXJ0QmxvY2soQXNzZXJ0QmxvY2sgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0RW1wdHlTdGF0ZW1lbnQoRW1wdHlTdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0QXNzZXJ0U3RhdGVtZW50KEFzc2VydFN0YXRlbWVudCBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRMYWJlbGVkU3RhdGVtZW50KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0QnJlYWtTdGF0ZW1lbnQoQnJlYWtTdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0V2hpbGVTdGF0ZW1lbnQoV2hpbGVTdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0RG9TdGF0ZW1lbnQoRG9TdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0Rm9yU3RhdGVtZW50KEZvclN0YXRlbWVudCBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRGb3JJblN0YXRlbWVudChGb3JJblN0YXRlbWVudCBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRTd2l0Y2hTdGF0ZW1lbnQoU3dpdGNoU3RhdGVtZW50IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdENvbnRpbnVlU3dpdGNoU3RhdGVtZW50KENvbnRpbnVlU3dpdGNoU3RhdGVtZW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdElmU3RhdGVtZW50KElmU3RhdGVtZW50IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdFJldHVyblN0YXRlbWVudChSZXR1cm5TdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0VHJ5Q2F0Y2goVHJ5Q2F0Y2ggbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0VHJ5RmluYWxseShUcnlGaW5hbGx5IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdFlpZWxkU3RhdGVtZW50KFlpZWxkU3RhdGVtZW50IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKEZ1bmN0aW9uRGVjbGFyYXRpb24gbm9kZSkgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlKTsKCiAgLy8gTWVtYmVycwogIFIgZGVmYXVsdE1lbWJlcihNZW1iZXIgbm9kZSkgPT4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIFIgdmlzaXRDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvciBub2RlKSA9PiBkZWZhdWx0TWVtYmVyKG5vZGUpOwogIFIgdmlzaXRQcm9jZWR1cmUoUHJvY2VkdXJlIG5vZGUpID0+IGRlZmF1bHRNZW1iZXIobm9kZSk7CiAgUiB2aXNpdEZpZWxkKEZpZWxkIG5vZGUpID0+IGRlZmF1bHRNZW1iZXIobm9kZSk7CiAgUiB2aXNpdFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yKFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIG5vZGUpIHsKICAgIHJldHVybiBkZWZhdWx0TWVtYmVyKG5vZGUpOwogIH0KCiAgLy8gQ2xhc3NlcwogIFIgdmlzaXRDbGFzcyhDbGFzcyBub2RlKSA9PiBkZWZhdWx0VHJlZU5vZGUobm9kZSk7CgogIC8vIEluaXRpYWxpemVycwogIFIgZGVmYXVsdEluaXRpYWxpemVyKEluaXRpYWxpemVyIG5vZGUpID0+IGRlZmF1bHRUcmVlTm9kZShub2RlKTsKICBSIHZpc2l0SW52YWxpZEluaXRpYWxpemVyKEludmFsaWRJbml0aWFsaXplciBub2RlKSA9PgogICAgICBkZWZhdWx0SW5pdGlhbGl6ZXIobm9kZSk7CiAgUiB2aXNpdEZpZWxkSW5pdGlhbGl6ZXIoRmllbGRJbml0aWFsaXplciBub2RlKSA9PiBkZWZhdWx0SW5pdGlhbGl6ZXIobm9kZSk7CiAgUiB2aXNpdFN1cGVySW5pdGlhbGl6ZXIoU3VwZXJJbml0aWFsaXplciBub2RlKSA9PiBkZWZhdWx0SW5pdGlhbGl6ZXIobm9kZSk7CiAgUiB2aXNpdFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIoUmVkaXJlY3RpbmdJbml0aWFsaXplciBub2RlKSA9PgogICAgICBkZWZhdWx0SW5pdGlhbGl6ZXIobm9kZSk7CiAgUiB2aXNpdExvY2FsSW5pdGlhbGl6ZXIoTG9jYWxJbml0aWFsaXplciBub2RlKSA9PiBkZWZhdWx0SW5pdGlhbGl6ZXIobm9kZSk7CiAgUiB2aXNpdEFzc2VydEluaXRpYWxpemVyKEFzc2VydEluaXRpYWxpemVyIG5vZGUpID0+IGRlZmF1bHRJbml0aWFsaXplcihub2RlKTsKCiAgLy8gT3RoZXIgdHJlZSBub2RlcwogIFIgdmlzaXRMaWJyYXJ5KExpYnJhcnkgbm9kZSkgPT4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIFIgdmlzaXRMaWJyYXJ5RGVwZW5kZW5jeShMaWJyYXJ5RGVwZW5kZW5jeSBub2RlKSA9PiBkZWZhdWx0VHJlZU5vZGUobm9kZSk7CiAgUiB2aXNpdENvbWJpbmF0b3IoQ29tYmluYXRvciBub2RlKSA9PiBkZWZhdWx0VHJlZU5vZGUobm9kZSk7CiAgUiB2aXNpdExpYnJhcnlQYXJ0KExpYnJhcnlQYXJ0IG5vZGUpID0+IGRlZmF1bHRUcmVlTm9kZShub2RlKTsKICBSIHZpc2l0VHlwZWRlZihUeXBlZGVmIG5vZGUpID0+IGRlZmF1bHRUcmVlTm9kZShub2RlKTsKICBSIHZpc2l0VHlwZVBhcmFtZXRlcihUeXBlUGFyYW1ldGVyIG5vZGUpID0+IGRlZmF1bHRUcmVlTm9kZShub2RlKTsKICBSIHZpc2l0RnVuY3Rpb25Ob2RlKEZ1bmN0aW9uTm9kZSBub2RlKSA9PiBkZWZhdWx0VHJlZU5vZGUobm9kZSk7CiAgUiB2aXNpdEFyZ3VtZW50cyhBcmd1bWVudHMgbm9kZSkgPT4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIFIgdmlzaXROYW1lZEV4cHJlc3Npb24oTmFtZWRFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRUcmVlTm9kZShub2RlKTsKICBSIHZpc2l0U3dpdGNoQ2FzZShTd2l0Y2hDYXNlIG5vZGUpID0+IGRlZmF1bHRUcmVlTm9kZShub2RlKTsKICBSIHZpc2l0Q2F0Y2goQ2F0Y2ggbm9kZSkgPT4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIFIgdmlzaXRNYXBFbnRyeShNYXBFbnRyeSBub2RlKSA9PiBkZWZhdWx0VHJlZU5vZGUobm9kZSk7CiAgUiB2aXNpdENvbXBvbmVudChDb21wb25lbnQgbm9kZSkgPT4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwp9CgpjbGFzcyBEYXJ0VHlwZVZpc2l0b3I8Uj4gewogIGNvbnN0IERhcnRUeXBlVmlzaXRvcigpOwoKICBSIGRlZmF1bHREYXJ0VHlwZShEYXJ0VHlwZSBub2RlKSA9PiBudWxsOwoKICBSIHZpc2l0SW52YWxpZFR5cGUoSW52YWxpZFR5cGUgbm9kZSkgPT4gZGVmYXVsdERhcnRUeXBlKG5vZGUpOwogIFIgdmlzaXREeW5hbWljVHlwZShEeW5hbWljVHlwZSBub2RlKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSk7CiAgUiB2aXNpdFZvaWRUeXBlKFZvaWRUeXBlIG5vZGUpID0+IGRlZmF1bHREYXJ0VHlwZShub2RlKTsKICBSIHZpc2l0Qm90dG9tVHlwZShCb3R0b21UeXBlIG5vZGUpID0+IGRlZmF1bHREYXJ0VHlwZShub2RlKTsKICBSIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIG5vZGUpID0+IGRlZmF1bHREYXJ0VHlwZShub2RlKTsKICBSIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBub2RlKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSk7CiAgUiB2aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKFR5cGVQYXJhbWV0ZXJUeXBlIG5vZGUpID0+IGRlZmF1bHREYXJ0VHlwZShub2RlKTsKICBSIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSkgPT4gZGVmYXVsdERhcnRUeXBlKG5vZGUpOwp9CgpjbGFzcyBEYXJ0VHlwZVZpc2l0b3IxPFIsIFQ+IHsKICBSIGRlZmF1bHREYXJ0VHlwZShEYXJ0VHlwZSBub2RlLCBUIGFyZykgPT4gbnVsbDsKCiAgUiB2aXNpdEludmFsaWRUeXBlKEludmFsaWRUeXBlIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSwgYXJnKTsKICBSIHZpc2l0RHluYW1pY1R5cGUoRHluYW1pY1R5cGUgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHREYXJ0VHlwZShub2RlLCBhcmcpOwogIFIgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSBub2RlLCBUIGFyZykgPT4gZGVmYXVsdERhcnRUeXBlKG5vZGUsIGFyZyk7CiAgUiB2aXNpdEJvdHRvbVR5cGUoQm90dG9tVHlwZSBub2RlLCBUIGFyZykgPT4gZGVmYXVsdERhcnRUeXBlKG5vZGUsIGFyZyk7CiAgUiB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBub2RlLCBUIGFyZykgPT4gZGVmYXVsdERhcnRUeXBlKG5vZGUsIGFyZyk7CiAgUiB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHREYXJ0VHlwZShub2RlLCBhcmcpOwogIFIgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZShUeXBlUGFyYW1ldGVyVHlwZSBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdERhcnRUeXBlKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSwgYXJnKTsKfQoKY2xhc3MgQ29uc3RhbnRWaXNpdG9yPFI+IHsKICBjb25zdCBDb25zdGFudFZpc2l0b3IoKTsKCiAgUiBkZWZhdWx0Q29uc3RhbnQoQ29uc3RhbnQgbm9kZSkgPT4gbnVsbDsKCiAgUiB2aXNpdE51bGxDb25zdGFudChOdWxsQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRCb29sQ29uc3RhbnQoQm9vbENvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0SW50Q29uc3RhbnQoSW50Q29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXREb3VibGVDb25zdGFudChEb3VibGVDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdFN0cmluZ0NvbnN0YW50KFN0cmluZ0NvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0U3ltYm9sQ29uc3RhbnQoU3ltYm9sQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRNYXBDb25zdGFudChNYXBDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdExpc3RDb25zdGFudChMaXN0Q29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRTZXRDb25zdGFudChTZXRDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdEluc3RhbmNlQ29uc3RhbnQoSW5zdGFuY2VDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQoUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCBub2RlKSA9PgogICAgICBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdFRlYXJPZmZDb25zdGFudChUZWFyT2ZmQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRUeXBlTGl0ZXJhbENvbnN0YW50KFR5cGVMaXRlcmFsQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRVbmV2YWx1YXRlZENvbnN0YW50KFVuZXZhbHVhdGVkQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwp9CgpjbGFzcyBNZW1iZXJSZWZlcmVuY2VWaXNpdG9yPFI+IHsKICBjb25zdCBNZW1iZXJSZWZlcmVuY2VWaXNpdG9yKCk7CgogIFIgZGVmYXVsdE1lbWJlclJlZmVyZW5jZShNZW1iZXIgbm9kZSkgPT4gbnVsbDsKCiAgUiB2aXNpdEZpZWxkUmVmZXJlbmNlKEZpZWxkIG5vZGUpID0+IGRlZmF1bHRNZW1iZXJSZWZlcmVuY2Uobm9kZSk7CiAgUiB2aXNpdENvbnN0cnVjdG9yUmVmZXJlbmNlKENvbnN0cnVjdG9yIG5vZGUpID0+IGRlZmF1bHRNZW1iZXJSZWZlcmVuY2Uobm9kZSk7CiAgUiB2aXNpdFByb2NlZHVyZVJlZmVyZW5jZShQcm9jZWR1cmUgbm9kZSkgPT4gZGVmYXVsdE1lbWJlclJlZmVyZW5jZShub2RlKTsKICBSIHZpc2l0UmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JSZWZlcmVuY2UoCiAgICAgIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIG5vZGUpIHsKICAgIHJldHVybiBkZWZhdWx0TWVtYmVyUmVmZXJlbmNlKG5vZGUpOwogIH0KfQoKY2xhc3MgVmlzaXRvcjxSPiBleHRlbmRzIFRyZWVWaXNpdG9yPFI+CiAgICBpbXBsZW1lbnRzCiAgICAgICAgRGFydFR5cGVWaXNpdG9yPFI+LAogICAgICAgIENvbnN0YW50VmlzaXRvcjxSPiwKICAgICAgICBNZW1iZXJSZWZlcmVuY2VWaXNpdG9yPFI+IHsKICBjb25zdCBWaXNpdG9yKCk7CgogIC8vLyBUaGUgY2F0Y2gtYWxsIGNhc2UsIGV4Y2VwdCBmb3IgcmVmZXJlbmNlcy4KICBSIGRlZmF1bHROb2RlKE5vZGUgbm9kZSkgPT4gbnVsbDsKICBSIGRlZmF1bHRUcmVlTm9kZShUcmVlTm9kZSBub2RlKSA9PiBkZWZhdWx0Tm9kZShub2RlKTsKCiAgLy8gRGFydFR5cGVzCiAgUiBkZWZhdWx0RGFydFR5cGUoRGFydFR5cGUgbm9kZSkgPT4gZGVmYXVsdE5vZGUobm9kZSk7CiAgUiB2aXNpdEludmFsaWRUeXBlKEludmFsaWRUeXBlIG5vZGUpID0+IGRlZmF1bHREYXJ0VHlwZShub2RlKTsKICBSIHZpc2l0RHluYW1pY1R5cGUoRHluYW1pY1R5cGUgbm9kZSkgPT4gZGVmYXVsdERhcnRUeXBlKG5vZGUpOwogIFIgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSBub2RlKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSk7CiAgUiB2aXNpdEJvdHRvbVR5cGUoQm90dG9tVHlwZSBub2RlKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSk7CiAgUiB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBub2RlKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSk7CiAgUiB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSkgPT4gZGVmYXVsdERhcnRUeXBlKG5vZGUpOwogIFIgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZShUeXBlUGFyYW1ldGVyVHlwZSBub2RlKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSk7CiAgUiB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIG5vZGUpID0+IGRlZmF1bHREYXJ0VHlwZShub2RlKTsKCiAgLy8gQ29uc3RhbnRzCiAgUiBkZWZhdWx0Q29uc3RhbnQoQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdE5vZGUobm9kZSk7CiAgUiB2aXNpdE51bGxDb25zdGFudChOdWxsQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRCb29sQ29uc3RhbnQoQm9vbENvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0SW50Q29uc3RhbnQoSW50Q29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXREb3VibGVDb25zdGFudChEb3VibGVDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdFN0cmluZ0NvbnN0YW50KFN0cmluZ0NvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0U3ltYm9sQ29uc3RhbnQoU3ltYm9sQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRNYXBDb25zdGFudChNYXBDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdExpc3RDb25zdGFudChMaXN0Q29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRTZXRDb25zdGFudChTZXRDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdEluc3RhbmNlQ29uc3RhbnQoSW5zdGFuY2VDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQoUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCBub2RlKSA9PgogICAgICBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdFRlYXJPZmZDb25zdGFudChUZWFyT2ZmQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRUeXBlTGl0ZXJhbENvbnN0YW50KFR5cGVMaXRlcmFsQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRVbmV2YWx1YXRlZENvbnN0YW50KFVuZXZhbHVhdGVkQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwoKICAvLyBDbGFzcyByZWZlcmVuY2VzCiAgUiB2aXNpdENsYXNzUmVmZXJlbmNlKENsYXNzIG5vZGUpID0+IG51bGw7CiAgUiB2aXNpdFR5cGVkZWZSZWZlcmVuY2UoVHlwZWRlZiBub2RlKSA9PiBudWxsOwoKICAvLyBDb25zdGFudCByZWZlcmVuY2VzCiAgUiBkZWZhdWx0Q29uc3RhbnRSZWZlcmVuY2UoQ29uc3RhbnQgbm9kZSkgPT4gbnVsbDsKICBSIHZpc2l0TnVsbENvbnN0YW50UmVmZXJlbmNlKE51bGxDb25zdGFudCBub2RlKSA9PgogICAgICBkZWZhdWx0Q29uc3RhbnRSZWZlcmVuY2Uobm9kZSk7CiAgUiB2aXNpdEJvb2xDb25zdGFudFJlZmVyZW5jZShCb29sQ29uc3RhbnQgbm9kZSkgPT4KICAgICAgZGVmYXVsdENvbnN0YW50UmVmZXJlbmNlKG5vZGUpOwogIFIgdmlzaXRJbnRDb25zdGFudFJlZmVyZW5jZShJbnRDb25zdGFudCBub2RlKSA9PgogICAgICBkZWZhdWx0Q29uc3RhbnRSZWZlcmVuY2Uobm9kZSk7CiAgUiB2aXNpdERvdWJsZUNvbnN0YW50UmVmZXJlbmNlKERvdWJsZUNvbnN0YW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShub2RlKTsKICBSIHZpc2l0U3RyaW5nQ29uc3RhbnRSZWZlcmVuY2UoU3RyaW5nQ29uc3RhbnQgbm9kZSkgPT4KICAgICAgZGVmYXVsdENvbnN0YW50UmVmZXJlbmNlKG5vZGUpOwogIFIgdmlzaXRTeW1ib2xDb25zdGFudFJlZmVyZW5jZShTeW1ib2xDb25zdGFudCBub2RlKSA9PgogICAgICBkZWZhdWx0Q29uc3RhbnRSZWZlcmVuY2Uobm9kZSk7CiAgUiB2aXNpdE1hcENvbnN0YW50UmVmZXJlbmNlKE1hcENvbnN0YW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShub2RlKTsKICBSIHZpc2l0TGlzdENvbnN0YW50UmVmZXJlbmNlKExpc3RDb25zdGFudCBub2RlKSA9PgogICAgICBkZWZhdWx0Q29uc3RhbnRSZWZlcmVuY2Uobm9kZSk7CiAgUiB2aXNpdFNldENvbnN0YW50UmVmZXJlbmNlKFNldENvbnN0YW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShub2RlKTsKICBSIHZpc2l0SW5zdGFuY2VDb25zdGFudFJlZmVyZW5jZShJbnN0YW5jZUNvbnN0YW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShub2RlKTsKICBSIHZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudFJlZmVyZW5jZSgKICAgICAgICAgIFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQgbm9kZSkgPT4KICAgICAgZGVmYXVsdENvbnN0YW50UmVmZXJlbmNlKG5vZGUpOwogIFIgdmlzaXRUZWFyT2ZmQ29uc3RhbnRSZWZlcmVuY2UoVGVhck9mZkNvbnN0YW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShub2RlKTsKICBSIHZpc2l0VHlwZUxpdGVyYWxDb25zdGFudFJlZmVyZW5jZShUeXBlTGl0ZXJhbENvbnN0YW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShub2RlKTsKICBSIHZpc2l0VW5ldmFsdWF0ZWRDb25zdGFudFJlZmVyZW5jZShVbmV2YWx1YXRlZENvbnN0YW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShub2RlKTsKCiAgLy8gTWVtYmVyIHJlZmVyZW5jZXMKICBSIGRlZmF1bHRNZW1iZXJSZWZlcmVuY2UoTWVtYmVyIG5vZGUpID0+IG51bGw7CiAgUiB2aXNpdEZpZWxkUmVmZXJlbmNlKEZpZWxkIG5vZGUpID0+IGRlZmF1bHRNZW1iZXJSZWZlcmVuY2Uobm9kZSk7CiAgUiB2aXNpdENvbnN0cnVjdG9yUmVmZXJlbmNlKENvbnN0cnVjdG9yIG5vZGUpID0+IGRlZmF1bHRNZW1iZXJSZWZlcmVuY2Uobm9kZSk7CiAgUiB2aXNpdFByb2NlZHVyZVJlZmVyZW5jZShQcm9jZWR1cmUgbm9kZSkgPT4gZGVmYXVsdE1lbWJlclJlZmVyZW5jZShub2RlKTsKICBSIHZpc2l0UmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JSZWZlcmVuY2UoCiAgICAgIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIG5vZGUpIHsKICAgIHJldHVybiBkZWZhdWx0TWVtYmVyUmVmZXJlbmNlKG5vZGUpOwogIH0KCiAgUiB2aXNpdE5hbWUoTmFtZSBub2RlKSA9PiBkZWZhdWx0Tm9kZShub2RlKTsKICBSIHZpc2l0U3VwZXJ0eXBlKFN1cGVydHlwZSBub2RlKSA9PiBkZWZhdWx0Tm9kZShub2RlKTsKICBSIHZpc2l0TmFtZWRUeXBlKE5hbWVkVHlwZSBub2RlKSA9PiBkZWZhdWx0Tm9kZShub2RlKTsKfQoKY2xhc3MgUmVjdXJzaXZlVmlzaXRvcjxSPiBleHRlbmRzIFZpc2l0b3I8Uj4gewogIGNvbnN0IFJlY3Vyc2l2ZVZpc2l0b3IoKTsKCiAgUiBkZWZhdWx0Tm9kZShOb2RlIG5vZGUpIHsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICAgIHJldHVybiBudWxsOwogIH0KfQoKLy8vIFZpc2l0b3IgdGhhdCByZWN1cnNpdmVseSByZXdyaXRlcyBlYWNoIG5vZGUgaW4gdHJlZS4KLy8vCi8vLyBWaXNpdCBtZXRob2RzIHNob3VsZCByZXR1cm4gYSBuZXcgbm9kZSwgb3IgdGhlIHZpc2l0ZWQgbm9kZSAocG9zc2libHkKLy8vIG11dGF0ZWQpLCBvciBhbnkgbm9kZSBmcm9tIHRoZSB2aXNpdGVkIG5vZGUncyBzdWJ0cmVlLgovLy8KLy8vIEVhY2ggc3ViY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIEFTVCByZW1haW5zIGEgdHJlZS4KLy8vCi8vLyBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB0cmFuc2Zvcm1lciByZXBsYWNlcyBldmVyeSBvY2N1cnJlbmNlIG9mCi8vLyBgISh4ICYmIHkpYCB3aXRoIGAoIXggfHwgIXkpYDoKLy8vCi8vLyAgICAgY2xhc3MgTmVnYXRpb25TaW5rZXIgZXh0ZW5kcyBUcmFuc2Zvcm1lciB7Ci8vLyAgICAgICBAb3ZlcnJpZGUKLy8vICAgICAgIE5vZGUgdmlzaXROb3QoTm90IG5vZGUpIHsKLy8vICAgICAgICAgdmFyIG9wZXJhbmQgPSBub2RlLm9wZXJhbmQuYWNjZXB0KHRoaXMpOyAvLyBSZW1lbWJlciB0byB2aXNpdC4KLy8vICAgICAgICAgaWYgKG9wZXJhbmQgaXMgTG9naWNhbEV4cHJlc3Npb24gJiYgb3BlcmFuZC5vcGVyYXRvciA9PSAnJiYnKSB7Ci8vLyAgICAgICAgICAgcmV0dXJuIG5ldyBMb2dpY2FsRXhwcmVzc2lvbigKLy8vICAgICAgICAgICAgIG5ldyBOb3Qob3BlcmFuZC5sZWZ0KSwKLy8vICAgICAgICAgICAgICd8fCcsCi8vLyAgICAgICAgICAgICBuZXcgTm90KG9wZXJhbmQucmlnaHQpKTsKLy8vICAgICAgICAgfQovLy8gICAgICAgICByZXR1cm4gbm9kZTsKLy8vICAgICAgIH0KLy8vICAgICB9Ci8vLwpjbGFzcyBUcmFuc2Zvcm1lciBleHRlbmRzIFRyZWVWaXNpdG9yPFRyZWVOb2RlPiB7CiAgY29uc3QgVHJhbnNmb3JtZXIoKTsKCiAgLy8vIFJlcGxhY2VzIGEgdXNlIG9mIGEgdHlwZS4KICAvLy8KICAvLy8gQnkgZGVmYXVsdCwgcmVjdXJzaW9uIHN0b3BzIGF0IHRoaXMgcG9pbnQuCiAgRGFydFR5cGUgdmlzaXREYXJ0VHlwZShEYXJ0VHlwZSBub2RlKSA9PiBub2RlOwoKICBDb25zdGFudCB2aXNpdENvbnN0YW50KENvbnN0YW50IG5vZGUpID0+IG5vZGU7CgogIFN1cGVydHlwZSB2aXNpdFN1cGVydHlwZShTdXBlcnR5cGUgbm9kZSkgPT4gbm9kZTsKCiAgVHJlZU5vZGUgZGVmYXVsdFRyZWVOb2RlKFRyZWVOb2RlIG5vZGUpIHsKICAgIG5vZGUudHJhbnNmb3JtQ2hpbGRyZW4odGhpcyk7CiAgICByZXR1cm4gbm9kZTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIEV4cHJlc3Npb25WaXNpdG9yMTxSLCBUPiB7CiAgY29uc3QgRXhwcmVzc2lvblZpc2l0b3IxKCk7CgogIFIgZGVmYXVsdEV4cHJlc3Npb24oRXhwcmVzc2lvbiBub2RlLCBUIGFyZykgPT4gbnVsbDsKICBSIGRlZmF1bHRCYXNpY0xpdGVyYWwoQmFzaWNMaXRlcmFsIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRJbnZhbGlkRXhwcmVzc2lvbihJbnZhbGlkRXhwcmVzc2lvbiBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0VmFyaWFibGVHZXQoVmFyaWFibGVHZXQgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFZhcmlhYmxlU2V0KFZhcmlhYmxlU2V0IG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRQcm9wZXJ0eUdldChQcm9wZXJ0eUdldCBub2RlLCBUIGFyZykgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0UHJvcGVydHlTZXQoUHJvcGVydHlTZXQgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdERpcmVjdFByb3BlcnR5R2V0KERpcmVjdFByb3BlcnR5R2V0IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXREaXJlY3RQcm9wZXJ0eVNldChEaXJlY3RQcm9wZXJ0eVNldCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0U3VwZXJQcm9wZXJ0eUdldChTdXBlclByb3BlcnR5R2V0IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRTdXBlclByb3BlcnR5U2V0KFN1cGVyUHJvcGVydHlTZXQgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFN0YXRpY0dldChTdGF0aWNHZXQgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFN0YXRpY1NldChTdGF0aWNTZXQgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdE1ldGhvZEludm9jYXRpb24oTWV0aG9kSW52b2NhdGlvbiBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0RGlyZWN0TWV0aG9kSW52b2NhdGlvbihEaXJlY3RNZXRob2RJbnZvY2F0aW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRTdXBlck1ldGhvZEludm9jYXRpb24oU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKFN0YXRpY0ludm9jYXRpb24gbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdE5vdChOb3Qgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdExvZ2ljYWxFeHByZXNzaW9uKExvZ2ljYWxFeHByZXNzaW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRDb25kaXRpb25hbEV4cHJlc3Npb24oQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKFN0cmluZ0NvbmNhdGVuYXRpb24gbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdExpc3RDb25jYXRlbmF0aW9uKExpc3RDb25jYXRlbmF0aW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRTZXRDb25jYXRlbmF0aW9uKFNldENvbmNhdGVuYXRpb24gbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdE1hcENvbmNhdGVuYXRpb24oTWFwQ29uY2F0ZW5hdGlvbiBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0SW5zdGFuY2VDcmVhdGlvbihJbnN0YW5jZUNyZWF0aW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRJc0V4cHJlc3Npb24oSXNFeHByZXNzaW9uIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRBc0V4cHJlc3Npb24oQXNFeHByZXNzaW9uIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRTeW1ib2xMaXRlcmFsKFN5bWJvbExpdGVyYWwgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFR5cGVMaXRlcmFsKFR5cGVMaXRlcmFsIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRUaGlzRXhwcmVzc2lvbihUaGlzRXhwcmVzc2lvbiBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0Q29uc3RhbnRFeHByZXNzaW9uKENvbnN0YW50RXhwcmVzc2lvbiBub2RlLCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFJldGhyb3coUmV0aHJvdyBub2RlLCBUIGFyZykgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0VGhyb3coVGhyb3cgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdExpc3RMaXRlcmFsKExpc3RMaXRlcmFsIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRTZXRMaXRlcmFsKFNldExpdGVyYWwgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdE1hcExpdGVyYWwoTWFwTGl0ZXJhbCBub2RlLCBUIGFyZykgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0QXdhaXRFeHByZXNzaW9uKEF3YWl0RXhwcmVzc2lvbiBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKEZ1bmN0aW9uRXhwcmVzc2lvbiBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0SW50TGl0ZXJhbChJbnRMaXRlcmFsIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0QmFzaWNMaXRlcmFsKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFN0cmluZ0xpdGVyYWwoU3RyaW5nTGl0ZXJhbCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEJhc2ljTGl0ZXJhbChub2RlLCBhcmcpOwogIFIgdmlzaXREb3VibGVMaXRlcmFsKERvdWJsZUxpdGVyYWwgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRCYXNpY0xpdGVyYWwobm9kZSwgYXJnKTsKICBSIHZpc2l0Qm9vbExpdGVyYWwoQm9vbExpdGVyYWwgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRCYXNpY0xpdGVyYWwobm9kZSwgYXJnKTsKICBSIHZpc2l0TnVsbExpdGVyYWwoTnVsbExpdGVyYWwgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRCYXNpY0xpdGVyYWwobm9kZSwgYXJnKTsKICBSIHZpc2l0TGV0KExldCBub2RlLCBUIGFyZykgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0QmxvY2tFeHByZXNzaW9uKEJsb2NrRXhwcmVzc2lvbiBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0SW5zdGFudGlhdGlvbihJbnN0YW50aWF0aW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRMb2FkTGlicmFyeShMb2FkTGlicmFyeSBub2RlLCBUIGFyZykgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0Q2hlY2tMaWJyYXJ5SXNMb2FkZWQoQ2hlY2tMaWJyYXJ5SXNMb2FkZWQgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7Cn0KCmFic3RyYWN0IGNsYXNzIFN0YXRlbWVudFZpc2l0b3IxPFIsIFQ+IHsKICBjb25zdCBTdGF0ZW1lbnRWaXNpdG9yMSgpOwoKICBSIGRlZmF1bHRTdGF0ZW1lbnQoU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PiBudWxsOwoKICBSIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdEJsb2NrKEJsb2NrIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdEFzc2VydEJsb2NrKEFzc2VydEJsb2NrIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdEVtcHR5U3RhdGVtZW50KEVtcHR5U3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdEFzc2VydFN0YXRlbWVudChBc3NlcnRTdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0TGFiZWxlZFN0YXRlbWVudChMYWJlbGVkU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdEJyZWFrU3RhdGVtZW50KEJyZWFrU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdFdoaWxlU3RhdGVtZW50KFdoaWxlU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdERvU3RhdGVtZW50KERvU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdEZvclN0YXRlbWVudChGb3JTdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0Rm9ySW5TdGF0ZW1lbnQoRm9ySW5TdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0U3dpdGNoU3RhdGVtZW50KFN3aXRjaFN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRDb250aW51ZVN3aXRjaFN0YXRlbWVudChDb250aW51ZVN3aXRjaFN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRJZlN0YXRlbWVudChJZlN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRSZXR1cm5TdGF0ZW1lbnQoUmV0dXJuU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdFRyeUNhdGNoKFRyeUNhdGNoIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdFRyeUZpbmFsbHkoVHJ5RmluYWxseSBub2RlLCBUIGFyZykgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRZaWVsZFN0YXRlbWVudChZaWVsZFN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7Cn0KCmFic3RyYWN0IGNsYXNzIEJvZHlWaXNpdG9yMTxSLCBUPiBleHRlbmRzIEV4cHJlc3Npb25WaXNpdG9yMTxSLCBUPgogICAgaW1wbGVtZW50cyBTdGF0ZW1lbnRWaXNpdG9yMTxSLCBUPiB7CiAgY29uc3QgQm9keVZpc2l0b3IxKCk7CgogIFIgZGVmYXVsdFN0YXRlbWVudChTdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+IG51bGw7CiAgUiB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoRXhwcmVzc2lvblN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRCbG9jayhCbG9jayBub2RlLCBUIGFyZykgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRBc3NlcnRCbG9jayhBc3NlcnRCbG9jayBub2RlLCBUIGFyZykgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRFbXB0eVN0YXRlbWVudChFbXB0eVN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRBc3NlcnRTdGF0ZW1lbnQoQXNzZXJ0U3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdExhYmVsZWRTdGF0ZW1lbnQoTGFiZWxlZFN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRCcmVha1N0YXRlbWVudChCcmVha1N0YXRlbWVudCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRXaGlsZVN0YXRlbWVudChXaGlsZVN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXREb1N0YXRlbWVudChEb1N0YXRlbWVudCBub2RlLCBUIGFyZykgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRGb3JTdGF0ZW1lbnQoRm9yU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdEZvckluU3RhdGVtZW50KEZvckluU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdFN3aXRjaFN0YXRlbWVudChTd2l0Y2hTdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0Q29udGludWVTd2l0Y2hTdGF0ZW1lbnQoQ29udGludWVTd2l0Y2hTdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0SWZTdGF0ZW1lbnQoSWZTdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0UmV0dXJuU3RhdGVtZW50KFJldHVyblN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRUcnlDYXRjaChUcnlDYXRjaCBub2RlLCBUIGFyZykgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRUcnlGaW5hbGx5KFRyeUZpbmFsbHkgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0WWllbGRTdGF0ZW1lbnQoWWllbGRTdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24oRnVuY3Rpb25EZWNsYXJhdGlvbiBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwp9CoJ4AE5OPBwBIgETASYdATBHAU9DQ0NDT09NTT8/TUAfPh9NPh8zTz4fOh9PTU1NRUVHQ0k7N0NBQUtRUUlDSUVFM0tHQzwfAgElHAEuAToeNkJISkxISEJESEpCHkJKPEBIOh46HgIBIhkBKAE/OzNNIAQCASceATIBOCBOTkAgTlACARUPHh0aIBcBLAERQUdPQ0NDQ09PTU0/P01AHz4fTT4fM08+HzofT01NTUVFR0NJOzdDQUFLUVFJQ0lFRTNLR0M8HwEQPzoeNkJISkxISEJESEpCHkJKPEBIOh46HgENOT87M00gBAENNQESQzggTk5AIE5QARY5TT9BOUVDPUk/NTs9AgEbGwEsAUFBOz9FQ01BAgEfMwFNTUdLUU89Ik0CARsbASwBQ0NBR0dHQUNBS0wdSVFRAgEiIgExAUVRTTEsKQQCASgPHBwkEwExJDkBDzlBQTs/RUNNQQEPOUNDQUdHR0FDQUtMHUlRUQEWLTEBGTU1JjUmMyY5JjkmOSYzJjUmMyY9JjAwJjsmQyZDJgEXMUVRTTEsKQQBLzk5AgEvHAEdHhEEAgE5BEo7BEsESCMEMxQkS0wsJxYpDhkMCgQyFwEgBjExATEBNAEsIhEEAgEqHgE3NSQ9JE9PT089JD0kOyQ7JEtLOyRHJEUkOyRFJD89JEUkQSQ9JDskOyQ7JFFRNSRPNyQ9JEdDT01NOSQ/JE81JjUmUVE/OSQ1JE9DJAIBKR0BNQFBI0JONyM5IzsjNyM3I05QNyM5I0kjTjkjSEw3I0EjQSMCAUMpGAE1QSNCTjcjOSM7IzcjNyNOUDcjOSNJI045I0hMNyNBI0EjAgEbcGFja2FnZTprZXJuZWwvdmlzaXRvci5kYXJ0K3Nka3Jvb3Q6L3BrZy9rZXJuZWwvbGliL2Nhbm9uaWNhbF9uYW1lLmRhcnSYfi8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCmxpYnJhcnkga2VybmVsLmNhbm9uaWNhbF9uYW1lOwoKaW1wb3J0ICdhc3QuZGFydCc7CgovLy8gQSBzdHJpbmcgc2VxdWVuY2UgdGhhdCBpZGVudGlmaWVzIGEgbGlicmFyeSwgY2xhc3MsIG9yIG1lbWJlci4KLy8vCi8vLyBDYW5vbmljYWwgbmFtZXMgYXJlIG9yZ2FuaXplZCBpbiBhIHByZWZpeCB0cmVlLiAgRWFjaCBub2RlIGtub3dzIGl0cwovLy8gcGFyZW50LCBjaGlsZHJlbiwgYW5kIHRoZSBBU1Qgbm9kZSBpdCBpcyBjdXJyZW50bHkgYm91bmQgdG8uCi8vLwovLy8gVGhlIGZvbGxvd2luZyBzY2hlbWEgc3BlY2lmaWVzIGhvdyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgYSBnaXZlbiBvYmplY3QKLy8vIGlzIGRlZmluZWQ6Ci8vLwovLy8gICAgICBMaWJyYXJ5OgovLy8gICAgICAgICBVUkkgb2YgbGlicmFyeQovLy8KLy8vICAgICAgQ2xhc3M6Ci8vLyAgICAgICAgIENhbm9uaWNhbCBuYW1lIG9mIGVuY2xvc2luZyBsaWJyYXJ5Ci8vLyAgICAgICAgIE5hbWUgb2YgY2xhc3MKLy8vCi8vLyAgICAgIENvbnN0cnVjdG9yOgovLy8gICAgICAgICBDYW5vbmljYWwgbmFtZSBvZiBlbmNsb3NpbmcgY2xhc3Mgb3IgbGlicmFyeQovLy8gICAgICAgICAiQGNvbnN0cnVjdG9ycyIKLy8vICAgICAgICAgUXVhbGlmaWVkIG5hbWUKLy8vCi8vLyAgICAgIEZpZWxkOgovLy8gICAgICAgICBDYW5vbmljYWwgbmFtZSBvZiBlbmNsb3NpbmcgY2xhc3Mgb3IgbGlicmFyeQovLy8gICAgICAgICAiQGZpZWxkcyIKLy8vICAgICAgICAgUXVhbGlmaWVkIG5hbWUKLy8vCi8vLyAgICAgIFR5cGVkZWY6Ci8vLyAgICAgICAgIENhbm9uaWNhbCBuYW1lIG9mIGVuY2xvc2luZyBjbGFzcwovLy8gICAgICAgICAiQHR5cGVkZWZzIgovLy8gICAgICAgICBOYW1lIHRleHQKLy8vCi8vLyAgICAgIFByb2NlZHVyZSB0aGF0IGlzIG5vdCBhbiBhY2Nlc3NvciBvciBmYWN0b3J5OgovLy8gICAgICAgICBDYW5vbmljYWwgbmFtZSBvZiBlbmNsb3NpbmcgY2xhc3Mgb3IgbGlicmFyeQovLy8gICAgICAgICAiQG1ldGhvZHMiCi8vLyAgICAgICAgIFF1YWxpZmllZCBuYW1lCi8vLwovLy8gICAgICBQcm9jZWR1cmUgdGhhdCBpcyBhIGdldHRlcjoKLy8vICAgICAgICAgQ2Fub25pY2FsIG5hbWUgb2YgZW5jbG9zaW5nIGNsYXNzIG9yIGxpYnJhcnkKLy8vICAgICAgICAgIkBnZXR0ZXJzIgovLy8gICAgICAgICBRdWFsaWZpZWQgbmFtZQovLy8KLy8vICAgICAgUHJvY2VkdXJlIHRoYXQgaXMgYSBzZXR0ZXI6Ci8vLyAgICAgICAgIENhbm9uaWNhbCBuYW1lIG9mIGVuY2xvc2luZyBjbGFzcyBvciBsaWJyYXJ5Ci8vLyAgICAgICAgICJAc2V0dGVycyIKLy8vICAgICAgICAgUXVhbGlmaWVkIG5hbWUKLy8vCi8vLyAgICAgIFByb2NlZHVyZSB0aGF0IGlzIGEgZmFjdG9yeToKLy8vICAgICAgICAgQ2Fub25pY2FsIG5hbWUgb2YgZW5jbG9zaW5nIGNsYXNzCi8vLyAgICAgICAgICJAZmFjdG9yaWVzIgovLy8gICAgICAgICBRdWFsaWZpZWQgbmFtZQovLy8KLy8vICAgICAgUXVhbGlmaWVkIG5hbWU6Ci8vLyAgICAgICAgIGlmIHByaXZhdGU6IFVSSSBvZiBsaWJyYXJ5Ci8vLyAgICAgICAgIE5hbWUgdGV4dAovLy8KLy8vIFRoZSAicXVhbGlmaWVkIG5hbWUiIGFsbG93cyBhIG1lbWJlciB0byBoYXZlIGEgbmFtZSB0aGF0IGlzIHByaXZhdGUgdG8KLy8vIGEgbGlicmFyeSBvdGhlciB0aGFuIHRoZSBvbmUgY29udGFpbmluZyB0aGF0IG1lbWJlci4KY2xhc3MgQ2Fub25pY2FsTmFtZSB7CiAgQ2Fub25pY2FsTmFtZSBfcGFyZW50OwoKICBDYW5vbmljYWxOYW1lIGdldCBwYXJlbnQgPT4gX3BhcmVudDsKCiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgQ2Fub25pY2FsTmFtZSBfbm9uUm9vdFRvcDsKCiAgTWFwPFN0cmluZywgQ2Fub25pY2FsTmFtZT4gX2NoaWxkcmVuOwoKICAvLy8gVGhlIGxpYnJhcnksIGNsYXNzLCBvciBtZW1iZXIgYm91bmQgdG8gdGhpcyBuYW1lLgogIFJlZmVyZW5jZSByZWZlcmVuY2U7CgogIC8vLyBUZW1wb3JhcnkgaW5kZXggdXNlZCBkdXJpbmcgc2VyaWFsaXphdGlvbi4KICBpbnQgaW5kZXggPSAtMTsKCiAgQ2Fub25pY2FsTmFtZS5fKHRoaXMuX3BhcmVudCwgdGhpcy5uYW1lKSB7CiAgICBhc3NlcnQobmFtZSAhPSBudWxsKTsKICAgIGFzc2VydChwYXJlbnQgIT0gbnVsbCk7CiAgICBfbm9uUm9vdFRvcCA9IF9wYXJlbnQuaXNSb290ID8gdGhpcyA6IF9wYXJlbnQuX25vblJvb3RUb3A7CiAgfQoKICBDYW5vbmljYWxOYW1lLnJvb3QoKQogICAgICA6IF9wYXJlbnQgPSBudWxsLAogICAgICAgIF9ub25Sb290VG9wID0gbnVsbCwKICAgICAgICBuYW1lID0gJyc7CgogIGJvb2wgZ2V0IGlzUm9vdCA9PiBfcGFyZW50ID09IG51bGw7CiAgQ2Fub25pY2FsTmFtZSBnZXQgbm9uUm9vdFRvcCA9PiBfbm9uUm9vdFRvcDsKCiAgSXRlcmFibGU8Q2Fub25pY2FsTmFtZT4gZ2V0IGNoaWxkcmVuID0+CiAgICAgIF9jaGlsZHJlbj8udmFsdWVzID8/IGNvbnN0IDxDYW5vbmljYWxOYW1lPltdOwoKICBJdGVyYWJsZTxDYW5vbmljYWxOYW1lPiBnZXQgY2hpbGRyZW5Pck51bGwgPT4gX2NoaWxkcmVuPy52YWx1ZXM7CgogIGJvb2wgaGFzQ2hpbGQoU3RyaW5nIG5hbWUpIHsKICAgIHJldHVybiBfY2hpbGRyZW4gIT0gbnVsbCAmJiBfY2hpbGRyZW4uY29udGFpbnNLZXkobmFtZSk7CiAgfQoKICBDYW5vbmljYWxOYW1lIGdldENoaWxkKFN0cmluZyBuYW1lKSB7CiAgICB2YXIgbWFwID0gX2NoaWxkcmVuID8/PSA8U3RyaW5nLCBDYW5vbmljYWxOYW1lPnt9OwogICAgcmV0dXJuIG1hcFtuYW1lXSA/Pz0gbmV3IENhbm9uaWNhbE5hbWUuXyh0aGlzLCBuYW1lKTsKICB9CgogIENhbm9uaWNhbE5hbWUgZ2V0Q2hpbGRGcm9tVXJpKFVyaSB1cmkpIHsKICAgIC8vIE5vdGUgdGhhdCB0aGUgVXJpIGNsYXNzIGNhY2hlcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLCBhbmQgYWxsIGxpYnJhcnkKICAgIC8vIFVSSXMgd2lsbCBiZSBzdHJpbmdpZmllZCBmb3Igc2VyaWFsaXphdGlvbiBhbnl3YXksIHNvIHRoZXJlIGlzIG5vCiAgICAvLyBzaWduaWZpY2FudCBjb3N0IGZvciBjb252ZXJ0aW5nIHRoZSBVcmkgdG8gYSBzdHJpbmcgaGVyZS4KICAgIHJldHVybiBnZXRDaGlsZCgnJHVyaScpOwogIH0KCiAgQ2Fub25pY2FsTmFtZSBnZXRDaGlsZEZyb21RdWFsaWZpZWROYW1lKE5hbWUgbmFtZSkgewogICAgcmV0dXJuIG5hbWUuaXNQcml2YXRlCiAgICAgICAgPyBnZXRDaGlsZEZyb21VcmkobmFtZS5saWJyYXJ5LmltcG9ydFVyaSkuZ2V0Q2hpbGQobmFtZS5uYW1lKQogICAgICAgIDogZ2V0Q2hpbGQobmFtZS5uYW1lKTsKICB9CgogIENhbm9uaWNhbE5hbWUgZ2V0Q2hpbGRGcm9tTWVtYmVyKE1lbWJlciBtZW1iZXIpIHsKICAgIHJldHVybiBnZXRDaGlsZChnZXRNZW1iZXJRdWFsaWZpZXIobWVtYmVyKSkKICAgICAgICAuZ2V0Q2hpbGRGcm9tUXVhbGlmaWVkTmFtZShtZW1iZXIubmFtZSk7CiAgfQoKICBDYW5vbmljYWxOYW1lIGdldENoaWxkRnJvbVR5cGVkZWYoVHlwZWRlZiB0eXBlZGVmXykgewogICAgcmV0dXJuIGdldENoaWxkKCdAdHlwZWRlZnMnKS5nZXRDaGlsZCh0eXBlZGVmXy5uYW1lKTsKICB9CgogIC8vLyBUYWtlIG93bmVyc2hpcCBvZiBhIGNoaWxkIGNhbm9uaWNhbCBuYW1lIGFuZCBpdHMgc3VidHJlZS4KICAvLy8KICAvLy8gVGhlIGNoaWxkIG5hbWUgaXMgcmVtb3ZlZCBhcyBhIGNoaWxkIG9mIGl0cyBjdXJyZW50IHBhcmVudCBhbmQgdGhpcyBuYW1lCiAgLy8vIGJlY29tZXMgdGhlIG5ldyBwYXJlbnQuICBOb3RlIHRoYXQgdGhpcyBtb3ZlcyB0aGUgZW50aXJlIHN1YnRyZWUgcm9vdGVkIGF0CiAgLy8vIHRoZSBjaGlsZC4KICAvLy8KICAvLy8gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gbW92ZSBzdWJ0cmVlcyB3aXRoaW4gYSBjYW5vbmljYWwgbmFtZSB0cmVlIG9yCiAgLy8vIGVsc2UgbW92ZSB0aGVtIGJldHdlZW4gdHJlZXMuICBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBtZXRob2QgaWYgdGhlIGNoaWxkCiAgLy8vIG5hbWUgaXMgYWxyZWFkeSBhIGNoaWxkIG9mIHRoaXMgbmFtZS4KICAvLy8KICAvLy8gVGhlIHByZWNvbmRpdGlvbiBpcyB0aGF0IHRoaXMgbmFtZSBjYW5ub3QgaGF2ZSBhIChkaWZmZXJlbnQpIGNoaWxkIHdpdGgKICAvLy8gdGhlIHNhbWUgbmFtZS4KICB2b2lkIGFkb3B0Q2hpbGQoQ2Fub25pY2FsTmFtZSBjaGlsZCkgewogICAgaWYgKGNoaWxkLl9wYXJlbnQgPT0gdGhpcykgcmV0dXJuOwogICAgaWYgKF9jaGlsZHJlbiAhPSBudWxsICYmIF9jaGlsZHJlbi5jb250YWluc0tleShjaGlsZC5uYW1lKSkgewogICAgICB0aHJvdyAnQ2Fubm90IGFkZCBhIGNoaWxkIHRvICR0aGlzIGJlY2F1c2UgdGhpcyBuYW1lIGFscmVhZHkgaGFzIGEgJwogICAgICAgICAgJ2NoaWxkIG5hbWVkICR7Y2hpbGQubmFtZX0nOwogICAgfQogICAgY2hpbGQuX3BhcmVudC5yZW1vdmVDaGlsZChjaGlsZC5uYW1lKTsKICAgIGNoaWxkLl9wYXJlbnQgPSB0aGlzOwogICAgaWYgKF9jaGlsZHJlbiA9PSBudWxsKSBfY2hpbGRyZW4gPSA8U3RyaW5nLCBDYW5vbmljYWxOYW1lPnt9OwogICAgX2NoaWxkcmVuW2NoaWxkLm5hbWVdID0gY2hpbGQ7CiAgfQoKICB2b2lkIHJlbW92ZUNoaWxkKFN0cmluZyBuYW1lKSB7CiAgICBfY2hpbGRyZW4/LnJlbW92ZShuYW1lKTsKICB9CgogIHZvaWQgYmluZFRvKFJlZmVyZW5jZSB0YXJnZXQpIHsKICAgIGlmIChyZWZlcmVuY2UgPT0gdGFyZ2V0KSByZXR1cm47CiAgICBpZiAocmVmZXJlbmNlICE9IG51bGwpIHsKICAgICAgdGhyb3cgJyR0aGlzIGlzIGFscmVhZHkgYm91bmQnOwogICAgfQogICAgaWYgKHRhcmdldC5jYW5vbmljYWxOYW1lICE9IG51bGwpIHsKICAgICAgdGhyb3cgJ0Nhbm5vdCBiaW5kICR0aGlzIHRvICR7dGFyZ2V0Lm5vZGV9LCB0YXJnZXQgaXMgYWxyZWFkeSBib3VuZCB0byAnCiAgICAgICAgICAnJHt0YXJnZXQuY2Fub25pY2FsTmFtZX0nOwogICAgfQogICAgdGFyZ2V0LmNhbm9uaWNhbE5hbWUgPSB0aGlzOwogICAgdGhpcy5yZWZlcmVuY2UgPSB0YXJnZXQ7CiAgfQoKICB2b2lkIHVuYmluZCgpIHsKICAgIGlmIChyZWZlcmVuY2UgPT0gbnVsbCkgcmV0dXJuOwogICAgYXNzZXJ0KHJlZmVyZW5jZS5jYW5vbmljYWxOYW1lID09IHRoaXMpOwogICAgcmVmZXJlbmNlLmNhbm9uaWNhbE5hbWUgPSBudWxsOwogICAgcmVmZXJlbmNlID0gbnVsbDsKICB9CgogIHZvaWQgdW5iaW5kQWxsKCkgewogICAgdW5iaW5kKCk7CiAgICBJdGVyYWJsZTxDYW5vbmljYWxOYW1lPiBjaGlsZHJlbl8gPSBjaGlsZHJlbk9yTnVsbDsKICAgIGlmIChjaGlsZHJlbl8gIT0gbnVsbCkgewogICAgICBmb3IgKENhbm9uaWNhbE5hbWUgY2hpbGQgaW4gY2hpbGRyZW5fKSB7CiAgICAgICAgY2hpbGQudW5iaW5kQWxsKCk7CiAgICAgIH0KICAgIH0KICB9CgogIFN0cmluZyB0b1N0cmluZygpID0+IF9wYXJlbnQgPT0gbnVsbCA/ICdyb290JyA6ICckcGFyZW50OjokbmFtZSc7CgogIFJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoKSB7CiAgICByZXR1cm4gcmVmZXJlbmNlID8/PSAobmV3IFJlZmVyZW5jZSgpLi5jYW5vbmljYWxOYW1lID0gdGhpcyk7CiAgfQoKICBzdGF0aWMgU3RyaW5nIGdldE1lbWJlclF1YWxpZmllcihNZW1iZXIgbWVtYmVyKSB7CiAgICBpZiAobWVtYmVyIGlzIFByb2NlZHVyZSkgewogICAgICBpZiAobWVtYmVyLmlzR2V0dGVyKSByZXR1cm4gJ0BnZXR0ZXJzJzsKICAgICAgaWYgKG1lbWJlci5pc1NldHRlcikgcmV0dXJuICdAc2V0dGVycyc7CiAgICAgIGlmIChtZW1iZXIuaXNGYWN0b3J5KSByZXR1cm4gJ0BmYWN0b3JpZXMnOwogICAgICByZXR1cm4gJ0BtZXRob2RzJzsKICAgIH0KICAgIGlmIChtZW1iZXIgaXMgRmllbGQpIHsKICAgICAgcmV0dXJuICdAZmllbGRzJzsKICAgIH0KICAgIGlmIChtZW1iZXIgaXMgQ29uc3RydWN0b3IpIHsKICAgICAgcmV0dXJuICdAY29uc3RydWN0b3JzJzsKICAgIH0KICAgIGlmIChtZW1iZXIgaXMgUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IpIHsKICAgICAgcmV0dXJuICdAZmFjdG9yaWVzJzsKICAgIH0KICAgIHRocm93ICdVbmV4cGVjdGVkIG1lbWJlcjogJG1lbWJlcic7CiAgfQp9CoDWAE5OPB8BEwFDBElBBEwQBBIbBBAwGgQWORwbBBA5FhsEEi4YFgQ3ORcbBCU5FxsEJTkXGwQmLhkbBBknFgRLORYZAScBFR0BKAE4FwExEgEtGhw/BAEXGBwTASYvASo0AUMBHz0EASg3OgQBK1FJQR0EATcaRh8EATQwMQQBODoEAUAGT1ERBk9RLAZOFSknQksnBisaQiMEASIdBAEiJR0mBihPJQYhHQQBEiMtJBYEARUOOB0vGwgGBAFEAR1CBAE0Hy4uMRkGGxgGIR4GMxsGKAQCASJwYWNrYWdlOmtlcm5lbC9jYW5vbmljYWxfbmFtZS5kYXJ0MnNka3Jvb3Q6L3BrZy9rZXJuZWwvbGliL3RyYW5zZm9ybWF0aW9ucy9mbGFncy5kYXJ0gvVsaWJyYXJ5IGtlcm5lbC50cmFuc2Zvcm1hdGlvbnMuZmxhZ3M7CgppbXBvcnQgJy4uL2FzdC5kYXJ0JzsKCi8vLyBGbGFncyBzdW1tYXJpemluZyB0aGUga2luZHMgb2YgQVNUIG5vZGVzIGNvbnRhaW5lZCBpbiBhIGdpdmVuIG1lbWJlciBvcgovLy8gY2xhc3MsIGZvciBzcGVlZGluZyB1cCB0cmFuc2Zvcm1hdGlvbnMgdGhhdCBvbmx5IGFmZmVjdCBjZXJ0YWluIHR5cGVzIG9mCi8vLyBub2Rlcy4KLy8vCi8vLyBUaGVzZSBhcmUgc2V0IGJ5IHRoZSBmcm9udGVuZCBhbmQgdGhlIGRlc2VyaWFsaXplci4KY2xhc3MgVHJhbnNmb3JtZXJGbGFnIHsKICAvLy8gVGhlIGNsYXNzIG9yIG1lbWJlciBjb250YWlucyAnc3VwZXInIGNhbGxzLCB0aGF0IGlzLCBvbmUgb2YgdGhlIEFTVCBub2RlcwogIC8vLyBbU3VwZXJQcm9wZXJ0eUdldF0sIFtTdXBlclByb3BlcnR5U2V0XSwgW1N1cGVyTWV0aG9kSW52b2NhdGlvbl0uCiAgc3RhdGljIGNvbnN0IGludCBzdXBlckNhbGxzID0gMSA8PCAwOwoKICAvLy8gVGVtcG9yYXJ5IGZsYWcgdXNlZCBieSB0aGUgdmVyaWZpZXIgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZ2l2ZW4gbWVtYmVyCiAgLy8vIGhhcyBiZWVuIHNlZW4uCiAgc3RhdGljIGNvbnN0IGludCBzZWVuQnlWZXJpZmllciA9IDEgPDwgMTsKCiAgLy8gVE9ETyhhc2dlcmYpOiAgV2UgY291bGQgYWxzbyBhZGQgYSBmbGFnIGZvciAnYXN5bmMnIGFuZCB3aWxsIHByb2JhYmx5IGhhdmUKICAvLyBvbmUgZm9yIGNsb3N1cmVzIGFzIHdlbGwuCn0KFwAmARYBTE0LBDgYUEcoAUwVLAFQHwIBKXBhY2thZ2U6a2VybmVsL3RyYW5zZm9ybWF0aW9ucy9mbGFncy5kYXJ0LXNka3Jvb3Q6L3BrZy9rZXJuZWwvbGliL3R5cGVfZW52aXJvbm1lbnQuZGFydLDRLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KbGlicmFyeSBrZXJuZWwudHlwZV9lbnZpcm9ubWVudDsKCmltcG9ydCAnYXN0LmRhcnQnOwppbXBvcnQgJ2NsYXNzX2hpZXJhcmNoeS5kYXJ0JzsKaW1wb3J0ICdjb3JlX3R5cGVzLmRhcnQnOwppbXBvcnQgJ3R5cGVfYWxnZWJyYS5kYXJ0JzsKCmltcG9ydCAnc3JjL2hpZXJhcmNoeV9iYXNlZF90eXBlX2Vudmlyb25tZW50LmRhcnQnCiAgICBzaG93IEhpZXJhcmNoeUJhc2VkVHlwZUVudmlyb25tZW50OwoKdHlwZWRlZiB2b2lkIEVycm9ySGFuZGxlcihUcmVlTm9kZSBub2RlLCBTdHJpbmcgbWVzc2FnZSk7CgphYnN0cmFjdCBjbGFzcyBUeXBlRW52aXJvbm1lbnQgZXh0ZW5kcyBTdWJ0eXBlVGVzdGVyIHsKICBmaW5hbCBDb3JlVHlwZXMgY29yZVR5cGVzOwoKICBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlOwoKICBEYXJ0VHlwZSByZXR1cm5UeXBlOwogIERhcnRUeXBlIHlpZWxkVHlwZTsKICBBc3luY01hcmtlciBjdXJyZW50QXN5bmNNYXJrZXIgPSBBc3luY01hcmtlci5TeW5jOwoKICAvLy8gQW4gZXJyb3IgaGFuZGxlciBmb3IgdXNlIGluIGRlYnVnZ2luZywgb3IgYG51bGxgIGlmIHR5cGUgZXJyb3JzIHNob3VsZCBub3QKICAvLy8gYmUgdG9sZXJhdGVkLiAgU2VlIFt0eXBlRXJyb3JdLgogIEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXI7CgogIFR5cGVFbnZpcm9ubWVudC5mcm9tU3ViY2xhc3ModGhpcy5jb3JlVHlwZXMpOwoKICBmYWN0b3J5IFR5cGVFbnZpcm9ubWVudChDb3JlVHlwZXMgY29yZVR5cGVzLCBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHkpIHsKICAgIHJldHVybiBuZXcgSGllcmFyY2h5QmFzZWRUeXBlRW52aXJvbm1lbnQoY29yZVR5cGVzLCBoaWVyYXJjaHkpOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXQgb2JqZWN0VHlwZSA9PiBjb3JlVHlwZXMub2JqZWN0Q2xhc3MucmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIGdldCBudWxsVHlwZSA9PiBjb3JlVHlwZXMubnVsbENsYXNzLnJhd1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBnZXQgYm9vbFR5cGUgPT4gY29yZVR5cGVzLmJvb2xDbGFzcy5yYXdUeXBlOwogIEludGVyZmFjZVR5cGUgZ2V0IGludFR5cGUgPT4gY29yZVR5cGVzLmludENsYXNzLnJhd1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBnZXQgbnVtVHlwZSA9PiBjb3JlVHlwZXMubnVtQ2xhc3MucmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIGdldCBkb3VibGVUeXBlID0+IGNvcmVUeXBlcy5kb3VibGVDbGFzcy5yYXdUeXBlOwogIEludGVyZmFjZVR5cGUgZ2V0IHN0cmluZ1R5cGUgPT4gY29yZVR5cGVzLnN0cmluZ0NsYXNzLnJhd1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBnZXQgc3ltYm9sVHlwZSA9PiBjb3JlVHlwZXMuc3ltYm9sQ2xhc3MucmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIGdldCB0eXBlVHlwZSA9PiBjb3JlVHlwZXMudHlwZUNsYXNzLnJhd1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBnZXQgcmF3RnVuY3Rpb25UeXBlID0+IGNvcmVUeXBlcy5mdW5jdGlvbkNsYXNzLnJhd1R5cGU7CgogIENsYXNzIGdldCBpbnRDbGFzcyA9PiBjb3JlVHlwZXMuaW50Q2xhc3M7CiAgQ2xhc3MgZ2V0IG51bUNsYXNzID0+IGNvcmVUeXBlcy5udW1DbGFzczsKICBDbGFzcyBnZXQgZnV0dXJlT3JDbGFzcyA9PiBjb3JlVHlwZXMuZnV0dXJlT3JDbGFzczsKCiAgSW50ZXJmYWNlVHlwZSBsaXRlcmFsTGlzdFR5cGUoRGFydFR5cGUgZWxlbWVudFR5cGUpIHsKICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZShjb3JlVHlwZXMubGlzdENsYXNzLCA8RGFydFR5cGU+W2VsZW1lbnRUeXBlXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGxpdGVyYWxTZXRUeXBlKERhcnRUeXBlIGVsZW1lbnRUeXBlKSB7CiAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUoY29yZVR5cGVzLnNldENsYXNzLCA8RGFydFR5cGU+W2VsZW1lbnRUeXBlXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGxpdGVyYWxNYXBUeXBlKERhcnRUeXBlIGtleSwgRGFydFR5cGUgdmFsdWUpIHsKICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZShjb3JlVHlwZXMubWFwQ2xhc3MsIDxEYXJ0VHlwZT5ba2V5LCB2YWx1ZV0pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBpdGVyYWJsZVR5cGUoRGFydFR5cGUgdHlwZSkgewogICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlKGNvcmVUeXBlcy5pdGVyYWJsZUNsYXNzLCA8RGFydFR5cGU+W3R5cGVdKTsKICB9CgogIEludGVyZmFjZVR5cGUgc3RyZWFtVHlwZShEYXJ0VHlwZSB0eXBlKSB7CiAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUoY29yZVR5cGVzLnN0cmVhbUNsYXNzLCA8RGFydFR5cGU+W3R5cGVdKTsKICB9CgogIEludGVyZmFjZVR5cGUgZnV0dXJlVHlwZShEYXJ0VHlwZSB0eXBlKSB7CiAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUoY29yZVR5cGVzLmZ1dHVyZUNsYXNzLCA8RGFydFR5cGU+W3R5cGVdKTsKICB9CgogIC8vLyBSZW1vdmVzIGEgbGV2ZWwgb2YgYEZ1dHVyZTw+YCB0eXBlcyB3cmFwcGluZyBhIHR5cGUuCiAgLy8vCiAgLy8vIFRoaXMgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb24gYGZsYXR0ZW5gIGZyb20gdGhlIHNwZWMsIHdoaWNoIHVud3JhcHMgYQogIC8vLyBsYXllciBvZiBGdXR1cmUgb3IgRnV0dXJlT3IgZnJvbSBhIHR5cGUuCiAgRGFydFR5cGUgdW5mdXR1cmVUeXBlKERhcnRUeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgaWYgKHR5cGUuY2xhc3NOb2RlID09IGNvcmVUeXBlcy5mdXR1cmVPckNsYXNzIHx8CiAgICAgICAgICB0eXBlLmNsYXNzTm9kZSA9PSBjb3JlVHlwZXMuZnV0dXJlQ2xhc3MpIHsKICAgICAgICByZXR1cm4gdHlwZS50eXBlQXJndW1lbnRzWzBdOwogICAgICB9CiAgICAgIC8vIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIHRvIGltcGxlbWVudCwgZXh0ZW5kLCBvciBtaXhpbiBGdXR1cmVPciBzbwogICAgICAvLyB3ZSBhcmVuJ3QgY29uY2VybmVkIHdpdGggaXQuICBJZiBhIGNsYXNzIGltcGxlbWVudHMgbXVsdGlwbGUKICAgICAgLy8gaW5zdGFudGlhdGlvbnMgb2YgRnV0dXJlLCBnZXRUeXBlQXNJbnN0YW5jZU9mIGlzIHJlc3BvbnNpYmxlIGZvcgogICAgICAvLyBwaWNraW5nIHRoZSBsZWFzdCBvbmUgaW4gdGhlIHNlbnNlIHJlcXVpcmVkIGJ5IHRoZSBzcGVjLgogICAgICBJbnRlcmZhY2VUeXBlIGZ1dHVyZSA9IGdldFR5cGVBc0luc3RhbmNlT2YodHlwZSwgY29yZVR5cGVzLmZ1dHVyZUNsYXNzKTsKICAgICAgaWYgKGZ1dHVyZSAhPSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGZ1dHVyZS50eXBlQXJndW1lbnRzWzBdOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHlwZTsKICB9CgogIC8vLyBDYWxsZWQgaWYgdGhlIGNvbXB1dGF0aW9uIG9mIGEgc3RhdGljIHR5cGUgZmFpbGVkIGR1ZSB0byBhIHR5cGUgZXJyb3IuCiAgLy8vCiAgLy8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBpbiBwcm9kdWN0aW9uLiAgVGhlIGZyb250ZW5kIHNob3VsZCByZXBvcnQgdHlwZQogIC8vLyBlcnJvcnMsIGFuZCBlaXRoZXIgcmVjb3ZlciBmcm9tIHRoZSBlcnJvciBkdXJpbmcgdHJhbnNsYXRpb24gb3IgYWJvcnQKICAvLy8gY29tcGlsYXRpb24gaWYgdW5hYmxlIHRvIHJlY292ZXIuCiAgLy8vCiAgLy8vIEJ5IGRlZmF1bHQsIHRoaXMgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgc2luY2UgcHJvZ3JhbXMgaW4ga2VybmVsIGFyZSBhc3N1bWVkCiAgLy8vIHRvIGJlIGNvcnJlY3RseSB0eXBlZC4KICAvLy8KICAvLy8gQW4gW2Vycm9ySGFuZGxlcl0gbWF5IGJlIHByb3ZpZGVkIGluIG9yZGVyIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0CiAgLy8vIGJlaGF2aW9yIGFuZCB0b2xlcmF0ZSB0aGUgcHJlc2VuY2Ugb2YgdHlwZSBlcnJvcnMuICBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yCiAgLy8vIGRlYnVnZ2luZyBJUiBwcm9kdWNlcnMgd2hpY2ggYXJlIHJlcXVpcmVkIHRvIHByb2R1Y2UgYSBzdHJvbmdseSB0eXBlZCBJUi4KICB2b2lkIHR5cGVFcnJvcihUcmVlTm9kZSBub2RlLCBTdHJpbmcgbWVzc2FnZSkgewogICAgaWYgKGVycm9ySGFuZGxlciAhPSBudWxsKSB7CiAgICAgIGVycm9ySGFuZGxlcihub2RlLCBtZXNzYWdlKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICckbWVzc2FnZSBpbiAkbm9kZSc7CiAgICB9CiAgfQoKICAvLy8gVHJ1ZSBpZiBbbWVtYmVyXSBpcyBhIGJpbmFyeSBvcGVyYXRvciB0aGF0IHJldHVybnMgYW4gYGludGAgaWYgYm90aAogIC8vLyBvcGVyYW5kcyBhcmUgYGludGAsIGFuZCBvdGhlcndpc2UgcmV0dXJucyBgZG91YmxlYC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNhc2Ugb2YgdHlwZS1iYXNlZCBvdmVybG9hZGluZywgd2hpY2ggaW4gRGFydCBpcyBvbmx5IHN1cHBvcnRlZAogIC8vLyBieSBnaXZpbmcgc3BlY2lhbCB0cmVhdG1lbnQgdG8gY2VydGFpbiBhcml0aG1ldGljIG9wZXJhdG9ycy4KICBib29sIGlzT3ZlcmxvYWRlZEFyaXRobWV0aWNPcGVyYXRvcihQcm9jZWR1cmUgbWVtYmVyKSB7CiAgICBDbGFzcyBjbGFzc18gPSBtZW1iZXIuZW5jbG9zaW5nQ2xhc3M7CiAgICBpZiAoY2xhc3NfID09IGNvcmVUeXBlcy5pbnRDbGFzcyB8fCBjbGFzc18gPT0gY29yZVR5cGVzLm51bUNsYXNzKSB7CiAgICAgIFN0cmluZyBuYW1lID0gbWVtYmVyLm5hbWUubmFtZTsKICAgICAgcmV0dXJuIG5hbWUgPT0gJysnIHx8CiAgICAgICAgICBuYW1lID09ICctJyB8fAogICAgICAgICAgbmFtZSA9PSAnKicgfHwKICAgICAgICAgIG5hbWUgPT0gJ3JlbWFpbmRlcicgfHwKICAgICAgICAgIG5hbWUgPT0gJyUnOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHN0YXRpYyByZXR1cm4gdHlwZSBvZiBhbiBvdmVybG9hZGVkIGFyaXRobWV0aWMgb3BlcmF0b3IKICAvLy8gKHNlZSBbaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yXSkgZ2l2ZW4gdGhlIHN0YXRpYyB0eXBlIG9mIHRoZQogIC8vLyBvcGVyYW5kcy4KICAvLy8KICAvLy8gSWYgYm90aCB0eXBlcyBhcmUgYGludGAsIHRoZSByZXR1cm5lZCB0eXBlIGlzIGBpbnRgLgogIC8vLyBJZiBlaXRoZXIgdHlwZSBpcyBgZG91YmxlYCwgdGhlIHJldHVybmVkIHR5cGUgaXMgYGRvdWJsZWAuCiAgLy8vIElmIGJvdGggdHlwZXMgcmVmZXIgdG8gdGhlIHNhbWUgdHlwZSB2YXJpYWJsZSAodHlwaWNhbGx5IHdpdGggYG51bWAgYXMKICAvLy8gdGhlIHVwcGVyIGJvdW5kKSwgdGhlbiB0aGF0IHR5cGUgdmFyaWFibGUgaXMgcmV0dXJuZWQuCiAgLy8vIE90aGVyd2lzZSBgbnVtYCBpcyByZXR1cm5lZC4KICBEYXJ0VHlwZSBnZXRUeXBlT2ZPdmVybG9hZGVkQXJpdGhtZXRpYyhEYXJ0VHlwZSB0eXBlMSwgRGFydFR5cGUgdHlwZTIpIHsKICAgIGlmICh0eXBlMSA9PSB0eXBlMikgcmV0dXJuIHR5cGUxOwogICAgaWYgKHR5cGUxID09IGRvdWJsZVR5cGUgfHwgdHlwZTIgPT0gZG91YmxlVHlwZSkgcmV0dXJuIGRvdWJsZVR5cGU7CiAgICByZXR1cm4gbnVtVHlwZTsKICB9Cn0KCi8vLyBUaGUgcGFydCBvZiBbVHlwZUVudmlyb25tZW50XSB0aGF0IGRlYWxzIHdpdGggc3VidHlwZSB0ZXN0cy4KLy8vCi8vLyBUaGlzIGxpdmVzIGluIGEgc2VwYXJhdGUgY2xhc3Mgc28gaXQgY2FuIGJlIHRlc3RlZCBpbmRlcGVuZGVudGx5IG9mIHRoZSBTREsuCmFic3RyYWN0IGNsYXNzIFN1YnR5cGVUZXN0ZXIgewogIEludGVyZmFjZVR5cGUgZ2V0IG9iamVjdFR5cGU7CiAgSW50ZXJmYWNlVHlwZSBnZXQgbnVsbFR5cGU7CiAgSW50ZXJmYWNlVHlwZSBnZXQgcmF3RnVuY3Rpb25UeXBlOwogIENsYXNzIGdldCBmdXR1cmVPckNsYXNzOwogIEludGVyZmFjZVR5cGUgZnV0dXJlVHlwZShEYXJ0VHlwZSB0eXBlKTsKCiAgc3RhdGljIExpc3Q8T2JqZWN0PiB0eXBlQ2hlY2tzOwoKICBJbnRlcmZhY2VUeXBlIGdldFR5cGVBc0luc3RhbmNlT2YoSW50ZXJmYWNlVHlwZSB0eXBlLCBDbGFzcyBzdXBlcmNsYXNzKTsKCiAgLy8vIERldGVybWluZXMgaWYgdGhlIGdpdmVuIHR5cGUgaXMgYXQgdGhlIHRvcCBvZiB0aGUgdHlwZSBoaWVyYXJjaHkuICBNYXkgYmUKICAvLy8gb3ZlcnJpZGRlbiBpbiBzdWJjbGFzc2VzLgogIGJvb2wgaXNUb3AoRGFydFR5cGUgdHlwZSkgPT4KICAgICAgdHlwZSBpcyBEeW5hbWljVHlwZSB8fCB0eXBlIGlzIFZvaWRUeXBlIHx8IHR5cGUgPT0gb2JqZWN0VHlwZTsKCiAgLy8vIENhbiBiZSB1c2UgdG8gY29sbGVjdCB0eXBlIGNoZWNrcy4gVG8gdXNlOgogIC8vLyAxLiBSZW5hbWUgYGlzU3VidHlwZU9mYCB0byBgX2lzU3VidHlwZU9mYC4KICAvLy8gMi4gUmVuYW1lIGBfY29sbGVjdF9pc1N1YnR5cGVPZmAgdG8gYGlzU3VidHlwZU9mYC4KICAvLy8gMy4gQ29tbWVudCBvdXQgdGhlIGNhbGwgdG8gYF9pc1N1YnR5cGVPZmAgYmVsb3cuCiAgLy8gaWdub3JlOnVudXNlZF9lbGVtZW50CiAgYm9vbCBfY29sbGVjdF9pc1N1YnR5cGVPZihEYXJ0VHlwZSBzdWJ0eXBlLCBEYXJ0VHlwZSBzdXBlcnR5cGUpIHsKICAgIGJvb2wgcmVzdWx0ID0gdHJ1ZTsKICAgIC8vIHJlc3VsdCA9IF9pc1N1YnR5cGVPZihzdWJ0eXBlLCBzdXBlcnR5cGUpOwogICAgdHlwZUNoZWNrcyA/Pz0gPE9iamVjdD5bXTsKICAgIHR5cGVDaGVja3MuYWRkKFtzdWJ0eXBlLCBzdXBlcnR5cGUsIHJlc3VsdF0pOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgW3N1YnR5cGVdIGlzIGEgc3VidHlwZSBvZiBbc3VwZXJ0eXBlXS4KICBib29sIGlzU3VidHlwZU9mKERhcnRUeXBlIHN1YnR5cGUsIERhcnRUeXBlIHN1cGVydHlwZSkgewogICAgc3VidHlwZSA9IHN1YnR5cGUudW5hbGlhczsKICAgIHN1cGVydHlwZSA9IHN1cGVydHlwZS51bmFsaWFzOwogICAgaWYgKGlkZW50aWNhbChzdWJ0eXBlLCBzdXBlcnR5cGUpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChzdWJ0eXBlIGlzIEJvdHRvbVR5cGUpIHJldHVybiB0cnVlOwogICAgaWYgKHN1YnR5cGUgPT0gbnVsbFR5cGUpIHsKICAgICAgLy8gU2VlIHJ1bGUgNCBvZiB0aGUgc3VidHlwZSBydWxlcyBmcm9tIHRoZSBEYXJ0IExhbmd1YWdlIFNwZWNpZmljYXRpb24uCiAgICAgIHJldHVybiBzdXBlcnR5cGUgaXMhIEJvdHRvbVR5cGU7CiAgICB9CiAgICBpZiAoaXNUb3Aoc3VwZXJ0eXBlKSkgcmV0dXJuIHRydWU7CgogICAgLy8gSGFuZGxlIEZ1dHVyZU9yPFQ+IHVuaW9uIHR5cGUuCiAgICBpZiAoc3VidHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgaWRlbnRpY2FsKHN1YnR5cGUuY2xhc3NOb2RlLCBmdXR1cmVPckNsYXNzKSkgewogICAgICB2YXIgc3VidHlwZUFyZyA9IHN1YnR5cGUudHlwZUFyZ3VtZW50c1swXTsKICAgICAgaWYgKHN1cGVydHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgICBpZGVudGljYWwoc3VwZXJ0eXBlLmNsYXNzTm9kZSwgZnV0dXJlT3JDbGFzcykpIHsKICAgICAgICB2YXIgc3VwZXJ0eXBlQXJnID0gc3VwZXJ0eXBlLnR5cGVBcmd1bWVudHNbMF07CiAgICAgICAgLy8gRnV0dXJlT3I8QT4gPDogRnV0dXJlT3I8Qj4gaWZmIEEgPDogQgogICAgICAgIHJldHVybiBpc1N1YnR5cGVPZihzdWJ0eXBlQXJnLCBzdXBlcnR5cGVBcmcpOwogICAgICB9CgogICAgICAvLyBnaXZlbiB0MSBpcyBGdXR1cmU8QT4gfCBBLCB0aGVuOgogICAgICAvLyAoRnV0dXJlPEE+IHwgQSkgPDogdDIgaWZmIEZ1dHVyZTxBPiA8OiB0MiBhbmQgQSA8OiB0Mi4KICAgICAgdmFyIHN1YnR5cGVGdXR1cmUgPSBmdXR1cmVUeXBlKHN1YnR5cGVBcmcpOwogICAgICByZXR1cm4gaXNTdWJ0eXBlT2Yoc3VidHlwZUZ1dHVyZSwgc3VwZXJ0eXBlKSAmJgogICAgICAgICAgaXNTdWJ0eXBlT2Yoc3VidHlwZUFyZywgc3VwZXJ0eXBlKTsKICAgIH0KCiAgICBpZiAoc3VwZXJ0eXBlIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICBpZGVudGljYWwoc3VwZXJ0eXBlLmNsYXNzTm9kZSwgZnV0dXJlT3JDbGFzcykpIHsKICAgICAgLy8gZ2l2ZW4gdDIgaXMgRnV0dXJlPEE+IHwgQSwgdGhlbjoKICAgICAgLy8gdDEgPDogKEZ1dHVyZTxBPiB8IEEpIGlmZiB0MSA8OiBGdXR1cmU8QT4gb3IgdDEgPDogQQogICAgICB2YXIgc3VwZXJ0eXBlQXJnID0gc3VwZXJ0eXBlLnR5cGVBcmd1bWVudHNbMF07CiAgICAgIHZhciBzdXBlcnR5cGVGdXR1cmUgPSBmdXR1cmVUeXBlKHN1cGVydHlwZUFyZyk7CiAgICAgIHJldHVybiBpc1N1YnR5cGVPZihzdWJ0eXBlLCBzdXBlcnR5cGVGdXR1cmUpIHx8CiAgICAgICAgICBpc1N1YnR5cGVPZihzdWJ0eXBlLCBzdXBlcnR5cGVBcmcpOwogICAgfQoKICAgIGlmIChzdWJ0eXBlIGlzIEludGVyZmFjZVR5cGUgJiYgc3VwZXJ0eXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgdmFyIHVwY2FzdFR5cGUgPSBnZXRUeXBlQXNJbnN0YW5jZU9mKHN1YnR5cGUsIHN1cGVydHlwZS5jbGFzc05vZGUpOwogICAgICBpZiAodXBjYXN0VHlwZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXBjYXN0VHlwZS50eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgLy8gVGVybWluYXRpb246IHRoZSAnc3VwZXJ0eXBlJyBwYXJhbWV0ZXIgZGVjcmVhc2VzIGluIHNpemUuCiAgICAgICAgaWYgKCFpc1N1YnR5cGVPZigKICAgICAgICAgICAgdXBjYXN0VHlwZS50eXBlQXJndW1lbnRzW2ldLCBzdXBlcnR5cGUudHlwZUFyZ3VtZW50c1tpXSkpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoc3VidHlwZSBpcyBUeXBlUGFyYW1ldGVyVHlwZSkgewogICAgICBpZiAoc3VwZXJ0eXBlIGlzIFR5cGVQYXJhbWV0ZXJUeXBlICYmCiAgICAgICAgICBzdWJ0eXBlLnBhcmFtZXRlciA9PSBzdXBlcnR5cGUucGFyYW1ldGVyKSB7CiAgICAgICAgaWYgKHN1cGVydHlwZS5wcm9tb3RlZEJvdW5kICE9IG51bGwpIHsKICAgICAgICAgIHJldHVybiBpc1N1YnR5cGVPZihzdWJ0eXBlLmJvdW5kLCBzdXBlcnR5cGUuYm91bmQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBQcm9tb3RlZCBib3VuZCBzaG91bGQgYWx3YXlzIGJlIGEgc3VidHlwZSBvZiB0aGUgZGVjbGFyZWQgYm91bmQuCiAgICAgICAgICBhc3NlcnQoc3VidHlwZS5wcm9tb3RlZEJvdW5kID09IG51bGwgfHwKICAgICAgICAgICAgICBpc1N1YnR5cGVPZihzdWJ0eXBlLmJvdW5kLCBzdXBlcnR5cGUuYm91bmQpKTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBUZXJtaW5hdGlvbjogaWYgdGhlcmUgYXJlIG5vIGN5Y2xpY2FsbHkgYm91bmQgdHlwZSBwYXJhbWV0ZXJzLCB0aGlzCiAgICAgIC8vIHJlY3Vyc2l2ZSBjYWxsIGNhbiBvbmx5IG9jY3VyIGEgZmluaXRlIG51bWJlciBvZiB0aW1lcywgYmVmb3JlIHJlYWNoaW5nCiAgICAgIC8vIGEgc2hyaW5raW5nIHJlY3Vyc2l2ZSBjYWxsIChvciB0ZXJtaW5hdGluZykuCiAgICAgIHJldHVybiBpc1N1YnR5cGVPZihzdWJ0eXBlLmJvdW5kLCBzdXBlcnR5cGUpOwogICAgfQogICAgaWYgKHN1YnR5cGUgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgIGlmIChzdXBlcnR5cGUgPT0gcmF3RnVuY3Rpb25UeXBlKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKHN1cGVydHlwZSBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgICByZXR1cm4gX2lzRnVuY3Rpb25TdWJ0eXBlT2Yoc3VidHlwZSwgc3VwZXJ0eXBlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgYm9vbCBfaXNGdW5jdGlvblN1YnR5cGVPZihGdW5jdGlvblR5cGUgc3VidHlwZSwgRnVuY3Rpb25UeXBlIHN1cGVydHlwZSkgewogICAgaWYgKHN1YnR5cGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA+IHN1cGVydHlwZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50KSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChzdWJ0eXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCA8CiAgICAgICAgc3VwZXJ0eXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoc3VidHlwZS50eXBlUGFyYW1ldGVycy5sZW5ndGggIT0gc3VwZXJ0eXBlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoc3VidHlwZS50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgIHZhciBzdWJzdGl0dXRpb24gPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VidHlwZS50eXBlUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciBzdWJQYXJhbWV0ZXIgPSBzdWJ0eXBlLnR5cGVQYXJhbWV0ZXJzW2ldOwogICAgICAgIHZhciBzdXBlclBhcmFtZXRlciA9IHN1cGVydHlwZS50eXBlUGFyYW1ldGVyc1tpXTsKICAgICAgICBzdWJzdGl0dXRpb25bc3ViUGFyYW1ldGVyXSA9IG5ldyBUeXBlUGFyYW1ldGVyVHlwZShzdXBlclBhcmFtZXRlcik7CiAgICAgIH0KICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJ0eXBlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIHN1YlBhcmFtZXRlciA9IHN1YnR5cGUudHlwZVBhcmFtZXRlcnNbaV07CiAgICAgICAgdmFyIHN1cGVyUGFyYW1ldGVyID0gc3VwZXJ0eXBlLnR5cGVQYXJhbWV0ZXJzW2ldOwogICAgICAgIHZhciBzdWJCb3VuZCA9IHN1YnN0aXR1dGUoc3ViUGFyYW1ldGVyLmJvdW5kLCBzdWJzdGl0dXRpb24pOwogICAgICAgIC8vIFRlcm1pbmF0aW9uOiBpZiB0aGVyZSBhcmUgbm8gY3ljbGljYWxseSBib3VuZCB0eXBlIHBhcmFtZXRlcnMsIHRoaXMKICAgICAgICAvLyByZWN1cnNpdmUgY2FsbCBjYW4gb25seSBvY2N1ciBhIGZpbml0ZSBudW1iZXIgb2YgdGltZXMgYmVmb3JlCiAgICAgICAgLy8gcmVhY2hpbmcgYSBzaHJpbmtpbmcgcmVjdXJzaXZlIGNhbGwgKG9yIHRlcm1pbmF0aW5nKS4KICAgICAgICAvLyBUT0RPKGRtaXRyeWFzKTogUmVwbGFjZSBpdCB3aXRoIG9uZSByZWN1cnNpdmUgZGVzY2VudCBpbnN0ZWFkIG9mIHR3by4KICAgICAgICBpZiAoIWlzU3VidHlwZU9mKHN1cGVyUGFyYW1ldGVyLmJvdW5kLCBzdWJCb3VuZCkgfHwKICAgICAgICAgICAgIWlzU3VidHlwZU9mKHN1YkJvdW5kLCBzdXBlclBhcmFtZXRlci5ib3VuZCkpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3VidHlwZSA9IHN1YnN0aXR1dGUoc3VidHlwZS53aXRob3V0VHlwZVBhcmFtZXRlcnMsIHN1YnN0aXR1dGlvbik7CiAgICB9CiAgICBpZiAoIWlzU3VidHlwZU9mKHN1YnR5cGUucmV0dXJuVHlwZSwgc3VwZXJ0eXBlLnJldHVyblR5cGUpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJ0eXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBzdXBlcnR5cGVQYXJhbWV0ZXIgPSBzdXBlcnR5cGUucG9zaXRpb25hbFBhcmFtZXRlcnNbaV07CiAgICAgIHZhciBzdWJ0eXBlUGFyYW1ldGVyID0gc3VidHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICAgICAgLy8gVGVybWluYXRpb246IEJvdGggdHlwZXMgc2hyaW5rIGluIHNpemUuCiAgICAgIGlmICghaXNTdWJ0eXBlT2Yoc3VwZXJ0eXBlUGFyYW1ldGVyLCBzdWJ0eXBlUGFyYW1ldGVyKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgaW50IHN1YnR5cGVOYW1lSW5kZXggPSAwOwogICAgZm9yIChOYW1lZFR5cGUgc3VwZXJ0eXBlUGFyYW1ldGVyIGluIHN1cGVydHlwZS5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgd2hpbGUgKHN1YnR5cGVOYW1lSW5kZXggPCBzdWJ0eXBlLm5hbWVkUGFyYW1ldGVycy5sZW5ndGggJiYKICAgICAgICAgIHN1YnR5cGUubmFtZWRQYXJhbWV0ZXJzW3N1YnR5cGVOYW1lSW5kZXhdLm5hbWUgIT0KICAgICAgICAgICAgICBzdXBlcnR5cGVQYXJhbWV0ZXIubmFtZSkgewogICAgICAgICsrc3VidHlwZU5hbWVJbmRleDsKICAgICAgfQogICAgICBpZiAoc3VidHlwZU5hbWVJbmRleCA9PSBzdWJ0eXBlLm5hbWVkUGFyYW1ldGVycy5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgICAgTmFtZWRUeXBlIHN1YnR5cGVQYXJhbWV0ZXIgPSBzdWJ0eXBlLm5hbWVkUGFyYW1ldGVyc1tzdWJ0eXBlTmFtZUluZGV4XTsKICAgICAgLy8gVGVybWluYXRpb246IEJvdGggdHlwZXMgc2hyaW5rIGluIHNpemUuCiAgICAgIGlmICghaXNTdWJ0eXBlT2Yoc3VwZXJ0eXBlUGFyYW1ldGVyLnR5cGUsIHN1YnR5cGVQYXJhbWV0ZXIudHlwZSkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KfQqBQgBOTjwhARMfGhwBMygBOgE3HQEaARcWNQFRJh0BMAFLRAQBQT09OztBQUE9SAEsLDYBOEwEATdLBAE/SgQBLkkEASxHBAEsRwQBOwZMLykhNzUmCE9GSkJPHCgIBhEEAU0GT0woBlEdBklRUDIgIw0hBgQBSjoGUEM6KkgmHBkZIRcGEgQBSkoQBjtBTT0jSyZHFAQCAUEEUR8gHiUbKwEiAUsBUCAfRQExMTk3G0QYMh8yEwQBPTsfIzQsH08nBicBJiQ3MSg7NzE2CAEqQDI2LgYBJjkqPjU2Ni4GAUJKLEJFGkgYCggTBigsNi8+EU4yPBcKCE1RNjQGIzUnOQgGEgQBTE0UBi4xFAZMFAYtNkA2OkwIQDY6RU9JQVE8PBgKCEkGQhQGRkI+MUAWCAYeRkI8KRwITE4xShYIBhEEAgEkcGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JnNka3Jvb3Q6L3BrZy9rZXJuZWwvbGliL2NvcV9hbm5vdC5kYXJ0g7cvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgovLwovLyBQbGVhc2Ugc2VlIHRoZSBjb21tZW50cyBpbiBgcGtnL2tlcm5lbC9saWIvdHJhbnNmb3JtYXRpb25zL2NvcS5kYXJ0YCBmb3IgbW9yZQovLyBpbmZvLgoKbGlicmFyeSBrZXJuZWwuY29xX2Fubm90OwoKY29uc3QgY29xID0gMTsgLy8gZmllbGQgb3IgY2xhc3MKY29uc3QgY29xcmVmID0gMjsgLy8gY2xhc3Mgb25seQpjb25zdCBub2NvcSA9IDM7IC8vIGZpZWxkIG9ubHkKY29uc3QgY29xb3B0ID0gNDsgLy8gZmllbGQgb25seQpjb25zdCBjb3FzaW5nbGUgPSA1OyAvLyB0cmVhdCBMaXN0PEE+IGFzIGp1c3QgQQpjb25zdCBjb3FkZWYgPSA2Owpjb25zdCBjb3FzaW5nbGVkZWYgPSA3OwoKLy8gbGlicmFyeSBvbmx5CmNsYXNzIENvcUxpYiB7CiAgZmluYWwgU3RyaW5nIGRlc3RQYXRoUmVsYXRpdmU7CiAgY29uc3QgQ29xTGliKHRoaXMuZGVzdFBhdGhSZWxhdGl2ZSk7Cn0KCi8vIFRPRE8oMzA2MDkpOiBTaW5jZSBmYXN0YSBjdXJyZW50bHkgdGhyb3dzIGF3YXkgYW5ub3RhdGlvbnMgb24gRW51bXMsIHdlIHVzZSBhCi8vIGxpc3QgdG8gaWRlbnRpZnkgd2hpY2ggZW51bXMgdG8gY29udmVydC4KLy8KLy8gV2UnbGwgdW5jb21tZW50IHRoZXNlIGVudW1zIG9uY2UgdGhlIENvcSBmb3JtYWxpemF0aW9uIGlzIHN1ZmZpY2llbnRseSBjb21wbGV0ZS4KdmFyIGNvcUVudW1zID0gWy8qImtlcm5lbC5hc3Q6OlByb2NlZHVyZUtpbmQiLCAia2VybmVsLmFzdDo6QXN5bmNNYXJrZXIiKi9dOwoeAE5OPANRCQEaASEgHyAwEhgBEA8hJwIBUSwDVE0BHXBhY2thZ2U6a2VybmVsL2NvcV9hbm5vdC5kYXJ0J3Nka3Jvb3Q6L3BrZy9rZXJuZWwvbGliL2JpbmFyeS90YWcuZGFydJjELy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KbGlicmFyeSBrZXJuZWwuYmluYXJ5LnRhZzsKCmNsYXNzIFRhZyB7CiAgc3RhdGljIGNvbnN0IGludCBOb3RoaW5nID0gMDsKICBzdGF0aWMgY29uc3QgaW50IFNvbWV0aGluZyA9IDE7CgogIHN0YXRpYyBjb25zdCBpbnQgQ2xhc3MgPSAyOwoKICBzdGF0aWMgY29uc3QgaW50IEZ1bmN0aW9uTm9kZSA9IDM7CgogIC8vIE1lbWJlcnMKICBzdGF0aWMgY29uc3QgaW50IEZpZWxkID0gNDsKICBzdGF0aWMgY29uc3QgaW50IENvbnN0cnVjdG9yID0gNTsKICBzdGF0aWMgY29uc3QgaW50IFByb2NlZHVyZSA9IDY7CiAgc3RhdGljIGNvbnN0IGludCBSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciA9IDEwODsKCiAgLy8gSW5pdGlhbGl6ZXJzCiAgc3RhdGljIGNvbnN0IGludCBJbnZhbGlkSW5pdGlhbGl6ZXIgPSA3OwogIHN0YXRpYyBjb25zdCBpbnQgRmllbGRJbml0aWFsaXplciA9IDg7CiAgc3RhdGljIGNvbnN0IGludCBTdXBlckluaXRpYWxpemVyID0gOTsKICBzdGF0aWMgY29uc3QgaW50IFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIgPSAxMDsKICBzdGF0aWMgY29uc3QgaW50IExvY2FsSW5pdGlhbGl6ZXIgPSAxMTsKICBzdGF0aWMgY29uc3QgaW50IEFzc2VydEluaXRpYWxpemVyID0gMTI7CgogIC8vIEV4cHJlc3Npb25zCiAgc3RhdGljIGNvbnN0IGludCBDaGVja0xpYnJhcnlJc0xvYWRlZCA9IDEzOwogIHN0YXRpYyBjb25zdCBpbnQgTG9hZExpYnJhcnkgPSAxNDsKICBzdGF0aWMgY29uc3QgaW50IERpcmVjdFByb3BlcnR5R2V0ID0gMTU7CiAgc3RhdGljIGNvbnN0IGludCBEaXJlY3RQcm9wZXJ0eVNldCA9IDE2OwogIHN0YXRpYyBjb25zdCBpbnQgRGlyZWN0TWV0aG9kSW52b2NhdGlvbiA9IDE3OwogIHN0YXRpYyBjb25zdCBpbnQgQ29uc3RTdGF0aWNJbnZvY2F0aW9uID0gMTg7CiAgc3RhdGljIGNvbnN0IGludCBJbnZhbGlkRXhwcmVzc2lvbiA9IDE5OwogIHN0YXRpYyBjb25zdCBpbnQgVmFyaWFibGVHZXQgPSAyMDsKICBzdGF0aWMgY29uc3QgaW50IFZhcmlhYmxlU2V0ID0gMjE7CiAgc3RhdGljIGNvbnN0IGludCBQcm9wZXJ0eUdldCA9IDIyOwogIHN0YXRpYyBjb25zdCBpbnQgUHJvcGVydHlTZXQgPSAyMzsKICBzdGF0aWMgY29uc3QgaW50IFN1cGVyUHJvcGVydHlHZXQgPSAyNDsKICBzdGF0aWMgY29uc3QgaW50IFN1cGVyUHJvcGVydHlTZXQgPSAyNTsKICBzdGF0aWMgY29uc3QgaW50IFN0YXRpY0dldCA9IDI2OwogIHN0YXRpYyBjb25zdCBpbnQgU3RhdGljU2V0ID0gMjc7CiAgc3RhdGljIGNvbnN0IGludCBNZXRob2RJbnZvY2F0aW9uID0gMjg7CiAgc3RhdGljIGNvbnN0IGludCBTdXBlck1ldGhvZEludm9jYXRpb24gPSAyOTsKICBzdGF0aWMgY29uc3QgaW50IFN0YXRpY0ludm9jYXRpb24gPSAzMDsKICBzdGF0aWMgY29uc3QgaW50IENvbnN0cnVjdG9ySW52b2NhdGlvbiA9IDMxOwogIHN0YXRpYyBjb25zdCBpbnQgQ29uc3RDb25zdHJ1Y3Rvckludm9jYXRpb24gPSAzMjsKICBzdGF0aWMgY29uc3QgaW50IE5vdCA9IDMzOwogIHN0YXRpYyBjb25zdCBpbnQgTG9naWNhbEV4cHJlc3Npb24gPSAzNDsKICBzdGF0aWMgY29uc3QgaW50IENvbmRpdGlvbmFsRXhwcmVzc2lvbiA9IDM1OwogIHN0YXRpYyBjb25zdCBpbnQgU3RyaW5nQ29uY2F0ZW5hdGlvbiA9IDM2OwogIHN0YXRpYyBjb25zdCBpbnQgTGlzdENvbmNhdGVuYXRpb24gPSAxMTE7CiAgc3RhdGljIGNvbnN0IGludCBTZXRDb25jYXRlbmF0aW9uID0gMTEyOwogIHN0YXRpYyBjb25zdCBpbnQgTWFwQ29uY2F0ZW5hdGlvbiA9IDExMzsKICBzdGF0aWMgY29uc3QgaW50IEluc3RhbmNlQ3JlYXRpb24gPSAxMTQ7CiAgc3RhdGljIGNvbnN0IGludCBJc0V4cHJlc3Npb24gPSAzNzsKICBzdGF0aWMgY29uc3QgaW50IEFzRXhwcmVzc2lvbiA9IDM4OwogIHN0YXRpYyBjb25zdCBpbnQgU3RyaW5nTGl0ZXJhbCA9IDM5OwogIHN0YXRpYyBjb25zdCBpbnQgRG91YmxlTGl0ZXJhbCA9IDQwOwogIHN0YXRpYyBjb25zdCBpbnQgVHJ1ZUxpdGVyYWwgPSA0MTsKICBzdGF0aWMgY29uc3QgaW50IEZhbHNlTGl0ZXJhbCA9IDQyOwogIHN0YXRpYyBjb25zdCBpbnQgTnVsbExpdGVyYWwgPSA0MzsKICBzdGF0aWMgY29uc3QgaW50IFN5bWJvbExpdGVyYWwgPSA0NDsKICBzdGF0aWMgY29uc3QgaW50IFR5cGVMaXRlcmFsID0gNDU7CiAgc3RhdGljIGNvbnN0IGludCBUaGlzRXhwcmVzc2lvbiA9IDQ2OwogIHN0YXRpYyBjb25zdCBpbnQgUmV0aHJvdyA9IDQ3OwogIHN0YXRpYyBjb25zdCBpbnQgVGhyb3cgPSA0ODsKICBzdGF0aWMgY29uc3QgaW50IExpc3RMaXRlcmFsID0gNDk7CiAgc3RhdGljIGNvbnN0IGludCBNYXBMaXRlcmFsID0gNTA7CiAgc3RhdGljIGNvbnN0IGludCBBd2FpdEV4cHJlc3Npb24gPSA1MTsKICBzdGF0aWMgY29uc3QgaW50IEZ1bmN0aW9uRXhwcmVzc2lvbiA9IDUyOwogIHN0YXRpYyBjb25zdCBpbnQgTGV0ID0gNTM7CiAgc3RhdGljIGNvbnN0IGludCBCbG9ja0V4cHJlc3Npb24gPSA4MjsKICBzdGF0aWMgY29uc3QgaW50IEluc3RhbnRpYXRpb24gPSA1NDsKICBzdGF0aWMgY29uc3QgaW50IFBvc2l0aXZlSW50TGl0ZXJhbCA9IDU1OwogIHN0YXRpYyBjb25zdCBpbnQgTmVnYXRpdmVJbnRMaXRlcmFsID0gNTY7CiAgc3RhdGljIGNvbnN0IGludCBCaWdJbnRMaXRlcmFsID0gNTc7CiAgc3RhdGljIGNvbnN0IGludCBDb25zdExpc3RMaXRlcmFsID0gNTg7CiAgc3RhdGljIGNvbnN0IGludCBDb25zdE1hcExpdGVyYWwgPSA1OTsKICBzdGF0aWMgY29uc3QgaW50IFNldExpdGVyYWwgPSAxMDk7CiAgc3RhdGljIGNvbnN0IGludCBDb25zdFNldExpdGVyYWwgPSAxMTA7CgogIC8vIFN0YXRlbWVudHMKICBzdGF0aWMgY29uc3QgaW50IEV4cHJlc3Npb25TdGF0ZW1lbnQgPSA2MTsKICBzdGF0aWMgY29uc3QgaW50IEJsb2NrID0gNjI7CiAgc3RhdGljIGNvbnN0IGludCBFbXB0eVN0YXRlbWVudCA9IDYzOwogIHN0YXRpYyBjb25zdCBpbnQgQXNzZXJ0U3RhdGVtZW50ID0gNjQ7CiAgc3RhdGljIGNvbnN0IGludCBMYWJlbGVkU3RhdGVtZW50ID0gNjU7CiAgc3RhdGljIGNvbnN0IGludCBCcmVha1N0YXRlbWVudCA9IDY2OwogIHN0YXRpYyBjb25zdCBpbnQgV2hpbGVTdGF0ZW1lbnQgPSA2NzsKICBzdGF0aWMgY29uc3QgaW50IERvU3RhdGVtZW50ID0gNjg7CiAgc3RhdGljIGNvbnN0IGludCBGb3JTdGF0ZW1lbnQgPSA2OTsKICBzdGF0aWMgY29uc3QgaW50IEZvckluU3RhdGVtZW50ID0gNzA7CiAgc3RhdGljIGNvbnN0IGludCBTd2l0Y2hTdGF0ZW1lbnQgPSA3MTsKICBzdGF0aWMgY29uc3QgaW50IENvbnRpbnVlU3dpdGNoU3RhdGVtZW50ID0gNzI7CiAgc3RhdGljIGNvbnN0IGludCBJZlN0YXRlbWVudCA9IDczOwogIHN0YXRpYyBjb25zdCBpbnQgUmV0dXJuU3RhdGVtZW50ID0gNzQ7CiAgc3RhdGljIGNvbnN0IGludCBUcnlDYXRjaCA9IDc1OwogIHN0YXRpYyBjb25zdCBpbnQgVHJ5RmluYWxseSA9IDc2OwogIHN0YXRpYyBjb25zdCBpbnQgWWllbGRTdGF0ZW1lbnQgPSA3NzsKICBzdGF0aWMgY29uc3QgaW50IFZhcmlhYmxlRGVjbGFyYXRpb24gPSA3ODsKICBzdGF0aWMgY29uc3QgaW50IEZ1bmN0aW9uRGVjbGFyYXRpb24gPSA3OTsKICBzdGF0aWMgY29uc3QgaW50IEFzeW5jRm9ySW5TdGF0ZW1lbnQgPSA4MDsKICBzdGF0aWMgY29uc3QgaW50IEFzc2VydEJsb2NrID0gODE7CiAgLy8gODIgaXMgb2NjdXBpZWQgYnkgW0Jsb2NrRXhwcmVzc2lvbl0gKGV4cHJlc3Npb24pLgoKICAvLyBUeXBlcwogIHN0YXRpYyBjb25zdCBpbnQgVHlwZWRlZlR5cGUgPSA4NzsKICBzdGF0aWMgY29uc3QgaW50IEJvdHRvbVR5cGUgPSA4OTsKICBzdGF0aWMgY29uc3QgaW50IEludmFsaWRUeXBlID0gOTA7CiAgc3RhdGljIGNvbnN0IGludCBEeW5hbWljVHlwZSA9IDkxOwogIHN0YXRpYyBjb25zdCBpbnQgVm9pZFR5cGUgPSA5MjsKICBzdGF0aWMgY29uc3QgaW50IEludGVyZmFjZVR5cGUgPSA5MzsKICBzdGF0aWMgY29uc3QgaW50IEZ1bmN0aW9uVHlwZSA9IDk0OwogIHN0YXRpYyBjb25zdCBpbnQgVHlwZVBhcmFtZXRlclR5cGUgPSA5NTsKICBzdGF0aWMgY29uc3QgaW50IFNpbXBsZUludGVyZmFjZVR5cGUgPSA5NjsKICBzdGF0aWMgY29uc3QgaW50IFNpbXBsZUZ1bmN0aW9uVHlwZSA9IDk3OwoKICAvLyBSZWZlcmVuY2VzCiAgc3RhdGljIGNvbnN0IGludCBOdWxsUmVmZXJlbmNlID0gOTk7CiAgc3RhdGljIGNvbnN0IGludCBDbGFzc1JlZmVyZW5jZSA9IDEwMDsKICBzdGF0aWMgY29uc3QgaW50IE1lbWJlclJlZmVyZW5jZSA9IDEwMTsKCiAgc3RhdGljIGNvbnN0IGludCBDb25zdGFudEV4cHJlc3Npb24gPSAxMDY7CgogIC8vIFRhZyBpcyBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMjQuCiAgc3RhdGljIGNvbnN0IGludCBEZXByZWNhdGVkX0NvbnN0YW50RXhwcmVzc2lvbiA9IDEwNzsKCiAgLy8vIDEwOCBpcyBvY2N1cGllZCBieSBbUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JdIChtZW1iZXIpLgogIC8vLyAxMDkgaXMgb2NjdXBpZWQgYnkgW1NldExpdGVyYWxdIChleHByZXNzaW9uKS4KICAvLy8gMTEwIGlzIG9jY3VwaWVkIGJ5IFtDb25zdFNldExpdGVyYWxdIChleHByZXNzaW9uKS4KICAvLy8gMTExIGlzIG9jY3VwaWVkIGJ5IFtMaXN0Q29uY2F0ZW5hdGlvbl0gKGV4cHJlc3Npb24pLgogIC8vLyAxMTIgaXMgb2NjdXBpZWQgYnkgW1NldENvbmNhdGVuYXRpb25dIChleHByZXNzaW9uKS4KICAvLy8gMTEzIGlzIG9jY3VwaWVkIGJ5IFtNYXBDb25jYXRlbmF0aW9uXSAoZXhwcmVzc2lvbikuCiAgLy8vIDExNCBpcyBvY2N1cGllZCBieSBbSW5zdGFuY2VDcmVhdGlvbl0gKGV4cHJlc3Npb24pLgoKICBzdGF0aWMgY29uc3QgaW50IFNwZWNpYWxpemVkVGFnSGlnaEJpdCA9IDB4ODA7IC8vIDEwMDAwMDAwCiAgc3RhdGljIGNvbnN0IGludCBTcGVjaWFsaXplZFRhZ01hc2sgPSAweEY4OyAvLyAxMTExMTAwMAogIHN0YXRpYyBjb25zdCBpbnQgU3BlY2lhbGl6ZWRQYXlsb2FkTWFzayA9IDB4NzsgLy8gMDAwMDAxMTEKCiAgc3RhdGljIGNvbnN0IGludCBTcGVjaWFsaXplZFZhcmlhYmxlR2V0ID0gMTI4OwogIHN0YXRpYyBjb25zdCBpbnQgU3BlY2lhbGl6ZWRWYXJpYWJsZVNldCA9IDEzNjsKICBzdGF0aWMgY29uc3QgaW50IFNwZWNpYWxpemVkSW50TGl0ZXJhbCA9IDE0NDsKCiAgc3RhdGljIGNvbnN0IGludCBTcGVjaWFsaXplZEludExpdGVyYWxCaWFzID0gMzsKCiAgc3RhdGljIGNvbnN0IGludCBDb21wb25lbnRGaWxlID0gMHg5MEFCQ0RFRjsKCiAgLy8vIEludGVybmFsIHZlcnNpb24gb2Yga2VybmVsIGJpbmFyeSBmb3JtYXQuCiAgLy8vIEJ1bXAgaXQgd2hlbiBtYWtpbmcgaW5jb21wYXRpYmxlIGNoYW5nZXMgaW4ga2VybmVsIGJpbmFyaWVzLgogIC8vLyBLZWVwIGluIHN5bmMgd2l0aCBydW50aW1lL3ZtL2tlcm5lbF9iaW5hcnkuaCwgcGtnL2tlcm5lbC9iaW5hcnkubWQuCiAgc3RhdGljIGNvbnN0IGludCBCaW5hcnlGb3JtYXRWZXJzaW9uID0gMjU7Cn0KCmFic3RyYWN0IGNsYXNzIENvbnN0YW50VGFnIHsKICBzdGF0aWMgY29uc3QgaW50IE51bGxDb25zdGFudCA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBCb29sQ29uc3RhbnQgPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgSW50Q29uc3RhbnQgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgRG91YmxlQ29uc3RhbnQgPSAzOwogIHN0YXRpYyBjb25zdCBpbnQgU3RyaW5nQ29uc3RhbnQgPSA0OwogIHN0YXRpYyBjb25zdCBpbnQgU3ltYm9sQ29uc3RhbnQgPSA1OwogIHN0YXRpYyBjb25zdCBpbnQgTWFwQ29uc3RhbnQgPSA2OwogIHN0YXRpYyBjb25zdCBpbnQgTGlzdENvbnN0YW50ID0gNzsKICBzdGF0aWMgY29uc3QgaW50IFNldENvbnN0YW50ID0gMTM7CiAgc3RhdGljIGNvbnN0IGludCBJbnN0YW5jZUNvbnN0YW50ID0gODsKICBzdGF0aWMgY29uc3QgaW50IFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQgPSA5OwogIHN0YXRpYyBjb25zdCBpbnQgVGVhck9mZkNvbnN0YW50ID0gMTA7CiAgc3RhdGljIGNvbnN0IGludCBUeXBlTGl0ZXJhbENvbnN0YW50ID0gMTE7CiAgc3RhdGljIGNvbnN0IGludCBVbmV2YWx1YXRlZENvbnN0YW50ID0gMTI7CiAgLy8gMTMgaXMgb2NjdXBpZWQgYnkgW1NldENvbnN0YW50XQp9CoCuAE5OPBsBDCAiAR4BJQENHiQiOAESKykpMCorAREuJSsrMC8rJSUlJSoqIyMqLyovNB0rLy0sKysrJiYnJyUmJSclKCEfJSQpLB0pJywsJyopJSoBEC0fKCkqKCglJigpMSUpIiQoLS0tJTcBCyUkJSUiJyYrLSwBECcpKgEtASk4AUM0OTs6OjoBPTo9ATExMAEyAS8BMENKLQIBHSUlJCcnJyQlJSk1KS0tJQIBHnBhY2thZ2U6a2VybmVsL2JpbmFyeS90YWcuZGFydClzZGtyb290Oi9wa2cva2VybmVsL2xpYi9pbXBvcnRfdGFibGUuZGFydJNbLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KbGlicmFyeSBrZXJuZWwuaW1wb3J0X3RhYmxlOwoKaW1wb3J0ICdhc3QuZGFydCc7CgphYnN0cmFjdCBjbGFzcyBJbXBvcnRUYWJsZSB7CiAgaW50IGdldEltcG9ydEluZGV4KExpYnJhcnkgbGlicmFyeSk7Cn0KCmNsYXNzIENvbXBvbmVudEltcG9ydFRhYmxlIGltcGxlbWVudHMgSW1wb3J0VGFibGUgewogIGZpbmFsIE1hcDxMaWJyYXJ5LCBpbnQ+IF9saWJyYXJ5SW5kZXggPSA8TGlicmFyeSwgaW50Pnt9OwoKICBDb21wb25lbnRJbXBvcnRUYWJsZShDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudC5saWJyYXJpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgX2xpYnJhcnlJbmRleFtjb21wb25lbnQubGlicmFyaWVzW2ldXSA9IGk7CiAgICB9CiAgfQoKICBpbnQgZ2V0SW1wb3J0SW5kZXgoTGlicmFyeSBsaWJyYXJ5KSA9PiBfbGlicmFyeUluZGV4W2xpYnJhcnldID8/IC0xOwp9CgpjbGFzcyBMaWJyYXJ5SW1wb3J0VGFibGUgaW1wbGVtZW50cyBJbXBvcnRUYWJsZSB7CiAgZmluYWwgTGlzdDxTdHJpbmc+IF9pbXBvcnRQYXRocyA9IDxTdHJpbmc+W107CiAgZmluYWwgTGlzdDxMaWJyYXJ5PiBfaW1wb3J0ZWRMaWJyYXJpZXMgPSA8TGlicmFyeT5bXTsKICBmaW5hbCBNYXA8TGlicmFyeSwgaW50PiBfbGlicmFyeUluZGV4ID0gPExpYnJhcnksIGludD57fTsKCiAgZmFjdG9yeSBMaWJyYXJ5SW1wb3J0VGFibGUoTGlicmFyeSBsaWIpIHsKICAgIHJldHVybiBuZXcgX0ltcG9ydFRhYmxlQnVpbGRlcihsaWIpLmJ1aWxkKCk7CiAgfQoKICBMaWJyYXJ5SW1wb3J0VGFibGUuZW1wdHkoKTsKCiAgLy8vIFRoZSBsaXN0IG9mIGltcG9ydHMuCiAgLy8vCiAgLy8vIFNob3VsZCBub3QgYmUgbW9kaWZpZWQgZGlyZWN0bHksIGFzIHRoZSBpbmRleCBtYXAgd291bGQgZ28gb3V0IG9mIHN5bmMuCiAgTGlzdDxTdHJpbmc+IGdldCBpbXBvcnRQYXRocyA9PiBfaW1wb3J0UGF0aHM7CgogIExpc3Q8TGlicmFyeT4gZ2V0IGltcG9ydGVkTGlicmFyaWVzID0+IF9pbXBvcnRlZExpYnJhcmllczsKCiAgaW50IGFkZEltcG9ydChMaWJyYXJ5IHRhcmdldCwgU3RyaW5nIGltcG9ydFBhdGgpIHsKICAgIGludCBpbmRleCA9IF9saWJyYXJ5SW5kZXhbdGFyZ2V0XTsKICAgIGlmIChpbmRleCAhPSBudWxsKSByZXR1cm4gaW5kZXg7CiAgICBpbmRleCA9IF9pbXBvcnRQYXRocy5sZW5ndGg7CiAgICBfaW1wb3J0UGF0aHMuYWRkKGltcG9ydFBhdGgpOwogICAgX2ltcG9ydGVkTGlicmFyaWVzLmFkZCh0YXJnZXQpOwogICAgX2xpYnJhcnlJbmRleFt0YXJnZXRdID0gaW5kZXg7CiAgICByZXR1cm4gaW5kZXg7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIGltcG9ydCwgb3IgLTEgaWYgbm90IGZvdW5kLgogIGludCBnZXRJbXBvcnRJbmRleChMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIHJldHVybiBfbGlicmFyeUluZGV4W2xpYnJhcnldID8/IC0xOwogIH0KCiAgU3RyaW5nIGdldEltcG9ydFBhdGgoTGlicmFyeSBsaWJyYXJ5KSB7CiAgICByZXR1cm4gX2ltcG9ydFBhdGhzW2dldEltcG9ydEluZGV4KGxpYnJhcnkpXTsKICB9Cn0KCi8vLyBCdWlsZHMgdGhlIGltcG9ydCB0YWJsZSBmb3IgYSBnaXZlbiBsaWJyYXJ5LgpjbGFzcyBfSW1wb3J0VGFibGVCdWlsZGVyIGV4dGVuZHMgUmVjdXJzaXZlVmlzaXRvciB7CiAgZmluYWwgTGlicmFyeUltcG9ydFRhYmxlIHRhYmxlID0gbmV3IExpYnJhcnlJbXBvcnRUYWJsZS5lbXB0eSgpOwogIGZpbmFsIExpYnJhcnkgcmVmZXJlbmNlTGlicmFyeTsKCiAgTGlicmFyeUltcG9ydFRhYmxlIGJ1aWxkKCkgewogICAgcmVmZXJlbmNlTGlicmFyeS5hY2NlcHQodGhpcyk7CiAgICByZXR1cm4gdGFibGU7CiAgfQoKICBfSW1wb3J0VGFibGVCdWlsZGVyKHRoaXMucmVmZXJlbmNlTGlicmFyeSkgewogICAgdGFibGUuYWRkSW1wb3J0KHJlZmVyZW5jZUxpYnJhcnksICcnKTsKICB9CgogIHZvaWQgYWRkTGlicmFyeUltcG9ydChMaWJyYXJ5IHRhcmdldCkgewogICAgaWYgKHRhcmdldCA9PSByZWZlcmVuY2VMaWJyYXJ5KSByZXR1cm47IC8vIFNlbGYtcmVmZXJlbmNlIGlzIHNwZWNpYWwuCiAgICB2YXIgcmVmZXJlbmNlVXJpID0gcmVmZXJlbmNlTGlicmFyeS5pbXBvcnRVcmk7CiAgICB2YXIgdGFyZ2V0VXJpID0gdGFyZ2V0LmltcG9ydFVyaTsKICAgIGlmICh0YXJnZXRVcmkgPT0gbnVsbCkgewogICAgICB0aHJvdyAnJHJlZmVyZW5jZVVyaSBjYW5ub3QgcmVmZXIgdG8gbGlicmFyeSB3aXRob3V0IGFuIGltcG9ydCBVUkknOwogICAgfQogICAgLy8gVG8gc3VwcG9ydCB1c2luZyBjdXN0b20tdXJpcyBpbiB1bml0IHRlc3RzLCB3ZSBkb24ndCBjaGVjayBkaXJlY3RseQogICAgLy8gd2hldGhlciB0aGUgc2NoZW1lIGlzICdmaWxlOicsIGJ1dCBpbnN0ZWFkIHdlIGNoZWNrIHRoYXQgaXMgbm90ICdkYXJ0OicKICAgIC8vIG9yICdwYWNrYWdlOicuCiAgICBib29sIGlzRmlsZU9yQ3VzdG9tU2NoZW1lKHVyaSkgPT4KICAgICAgICB1cmkuc2NoZW1lICE9ICcnICYmIHVyaS5zY2hlbWUgIT0gJ3BhY2thZ2UnICYmIHVyaS5zY2hlbWUgIT0gJ2RhcnQnOwogICAgYm9vbCBpc1RhcmdldFNjaGVtZUZpbGVPckN1c3RvbSA9IGlzRmlsZU9yQ3VzdG9tU2NoZW1lKHRhcmdldFVyaSk7CiAgICBib29sIGlzUmVmZXJlbmNlU2NoZW1lRmlsZU9yQ3VzdG9tID0gaXNGaWxlT3JDdXN0b21TY2hlbWUocmVmZXJlbmNlVXJpKTsKICAgIGlmIChpc1RhcmdldFNjaGVtZUZpbGVPckN1c3RvbSAmJiBpc1JlZmVyZW5jZVNjaGVtZUZpbGVPckN1c3RvbSkgewogICAgICBTdHJpbmcgcmVsYXRpdmVVcmkgPSByZWxhdGl2ZVVyaVBhdGgodGFyZ2V0VXJpLCByZWZlcmVuY2VVcmkpOwogICAgICB0YWJsZS5hZGRJbXBvcnQodGFyZ2V0LCByZWxhdGl2ZVVyaSk7CiAgICB9IGVsc2UgaWYgKGlzVGFyZ2V0U2NoZW1lRmlsZU9yQ3VzdG9tKSB7CiAgICAgIC8vIENhbm5vdCBpbXBvcnQgYSBmaWxlOlVSSSBmcm9tIGEgZGFydDpVUkkgb3IgcGFja2FnZTpVUkkuCiAgICAgIC8vIFdlIG1heSB3YW50IHRvIHJlbW92ZSB0aGlzIHJlc3RyaWN0aW9uLCBidXQgZm9yIG5vdyBpdCdzIGp1c3QgYSBzYW5pdHkKICAgICAgLy8gY2hlY2suCiAgICAgIHRocm93ICckcmVmZXJlbmNlVXJpIGNhbm5vdCByZWZlciB0byBhcHBsaWNhdGlvbiBsaWJyYXJ5ICR0YXJnZXRVcmknOwogICAgfSBlbHNlIHsKICAgICAgdGFibGUuYWRkSW1wb3J0KHRhcmdldCwgdGFyZ2V0LmltcG9ydFVyaS50b1N0cmluZygpKTsKICAgIH0KICB9CgogIHZpc2l0Q2xhc3NSZWZlcmVuY2UoQ2xhc3Mgbm9kZSkgewogICAgYWRkTGlicmFyeUltcG9ydChub2RlLmVuY2xvc2luZ0xpYnJhcnkpOwogIH0KCiAgdmlzaXRMaWJyYXJ5KExpYnJhcnkgbm9kZSkgewogICAgc3VwZXIudmlzaXRMaWJyYXJ5KG5vZGUpOwogICAgZm9yIChSZWZlcmVuY2UgZXhwb3J0ZWRSZWZlcmVuY2UgaW4gbm9kZS5hZGRpdGlvbmFsRXhwb3J0cykgewogICAgICBhZGRMaWJyYXJ5SW1wb3J0KGV4cG9ydGVkUmVmZXJlbmNlLm5vZGUucGFyZW50KTsKICAgIH0KICB9CgogIGRlZmF1bHRNZW1iZXJSZWZlcmVuY2UoTWVtYmVyIG5vZGUpIHsKICAgIGFkZExpYnJhcnlJbXBvcnQobm9kZS5lbmNsb3NpbmdMaWJyYXJ5KTsKICB9CgogIHZpc2l0TmFtZShOYW1lIG5hbWUpIHsKICAgIGlmIChuYW1lLmxpYnJhcnkgIT0gbnVsbCkgewogICAgICBhZGRMaWJyYXJ5SW1wb3J0KG5hbWUubGlicmFyeSk7CiAgICB9CiAgfQp9CgpTdHJpbmcgcmVsYXRpdmVVcmlQYXRoKFVyaSB0YXJnZXQsIFVyaSByZWYpIHsKICBMaXN0PFN0cmluZz4gdGFyZ2V0U2VnbWVudHMgPSB0YXJnZXQucGF0aFNlZ21lbnRzOwogIExpc3Q8U3RyaW5nPiByZWZTZWdtZW50cyA9IHJlZi5wYXRoU2VnbWVudHM7CiAgaW50IHRvID0gcmVmU2VnbWVudHMubGVuZ3RoOwogIGlmICh0YXJnZXRTZWdtZW50cy5sZW5ndGggPCB0bykgdG8gPSB0YXJnZXRTZWdtZW50cy5sZW5ndGg7CiAgdG8tLTsgLy8gVGhlIGxhc3QgZW50cnkgaXMgdGhlIGZpbGVuYW1lLCBoZXJlIHdlIGNvbXBhcmUgb25seSBkaXJlY3Rvcmllcy4KICBpbnQgc2FtZSA9IC0xOwogIGZvciAoaW50IGkgPSAwOyBpIDwgdG87IGkrKykgewogICAgaWYgKHRhcmdldFNlZ21lbnRzW2ldID09IHJlZlNlZ21lbnRzW2ldKSB7CiAgICAgIHNhbWUgPSBpOwogICAgfSBlbHNlIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGlmIChzYW1lID09IHRhcmdldFNlZ21lbnRzLmxlbmd0aCAtIDIgJiYKICAgICAgdGFyZ2V0U2VnbWVudHMubGVuZ3RoID09IHJlZlNlZ21lbnRzLmxlbmd0aCkgewogICAgLy8gQm90aCBwYXJ0cyBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBzZWdtZW50cywKICAgIC8vIGFuZCB0aGV5IGFncmVlIG9uIGFsbCBkaXJlY3Rvcmllcy4KICAgIGlmICh0YXJnZXRTZWdtZW50cy5sYXN0ID09ICIiKSByZXR1cm4gIi4iOwogICAgcmV0dXJuIHRhcmdldFNlZ21lbnRzLmxhc3Q7CiAgfQogIExpc3Q8U3RyaW5nPiBwYXRoID0gbmV3IExpc3Q8U3RyaW5nPigpOwogIGludCBva2VkID0gc2FtZSArIDE7CiAgd2hpbGUgKG9rZWQgPCByZWZTZWdtZW50cy5sZW5ndGggLSAxKSB7CiAgICBwYXRoLmFkZCgiLi4iKTsKICAgIG9rZWQrKzsKICB9CiAgcGF0aC5hZGRBbGwodGFyZ2V0U2VnbWVudHMuc2tpcChzYW1lICsgMSkpOwoKICBpZiAocGF0aC5pc0VtcHR5KSBwYXRoLmFkZCgiLiIpOwogIHJldHVybiBwYXRoLmpvaW4oIi8iKTsKfQqAngBOTjwdARMBHScCATQ8AS47MQYEAUcCATIwODwBLDEEAR4BGwZOMAE9ATUnJSEiJCMSBAFBKCkEASoyBAIBMTVDIgEfIxIEAS8rBAEqSjMmHUsGS08WJk1HTUdFLC1CUBBMDTwGBAEkLQQBHx5CNwYEASgtBAEZICYGBAIBLjUvHz5NESEvEA0NBgQrNTQqLyAEKhcqFAwELgEjGQIBIHBhY2thZ2U6a2VybmVsL2ltcG9ydF90YWJsZS5kYXJ0JXNka3Jvb3Q6L3BrZy9rZXJuZWwvbGliL3NyYy9oZWFwLmRhcnSGcS8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gQmFzaWMgaW1wbGVtZW50YXRpb24gb2YgYSBoZWFwLCB3aXRoIE8obG9nIG4pIGluc2VydGlvbiBhbmQgcmVtb3ZhbC4KYWJzdHJhY3QgY2xhc3MgSGVhcDxUPiB7CiAgZmluYWwgX2l0ZW1zID0gPFQ+W107CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2l0ZW1zLmlzRW1wdHk7CgogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gX2l0ZW1zLmlzTm90RW1wdHk7CgogIHZvaWQgYWRkKFQgaXRlbSkgewogICAgaW50IGluZGV4ID0gX2l0ZW1zLmxlbmd0aDsKICAgIF9pdGVtcy5sZW5ndGggKz0gMTsKICAgIHdoaWxlIChpbmRleCA+IDApIHsKICAgICAgVCBwYXJlbnQgPSBfaXRlbXNbX3BhcmVudEluZGV4KGluZGV4KV07CiAgICAgIGlmIChzb3J0c0JlZm9yZShwYXJlbnQsIGl0ZW0pKSBicmVhazsKICAgICAgX2l0ZW1zW2luZGV4XSA9IHBhcmVudDsKICAgICAgaW5kZXggPSBfcGFyZW50SW5kZXgoaW5kZXgpOwogICAgfQogICAgX2l0ZW1zW2luZGV4XSA9IGl0ZW07CiAgfQoKICBUIHJlbW92ZSgpIHsKICAgIFQgcmVtb3ZlZCA9IF9pdGVtc1swXTsKICAgIFQgb3JwaGFuID0gX2l0ZW1zLnJlbW92ZUxhc3QoKTsKICAgIGlmIChfaXRlbXMuaXNOb3RFbXB0eSkgX3JlSW5zZXJ0KG9ycGhhbik7CiAgICByZXR1cm4gcmVtb3ZlZDsKICB9CgogIC8vLyBDbGllbnQgc2hvdWxkIHVzZSBhIGRlcml2ZWQgY2xhc3MgdG8gc3BlY2lmeSB0aGUgc29ydCBvcmRlci4KICBib29sIHNvcnRzQmVmb3JlKFQgYSwgVCBiKTsKCiAgaW50IF9maXJzdENoaWxkSW5kZXgoaW50IGluZGV4KSB7CiAgICByZXR1cm4gKGluZGV4IDw8IDEpICsgMTsKICB9CgogIGludCBfcGFyZW50SW5kZXgoaW50IGluZGV4KSB7CiAgICByZXR1cm4gKGluZGV4IC0gMSkgPj4gMTsKICB9CgogIHZvaWQgX3JlSW5zZXJ0KFQgaXRlbSkgewogICAgaW50IGluZGV4ID0gMDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGludCBjaGlsZEluZGV4ID0gX2ZpcnN0Q2hpbGRJbmRleChpbmRleCk7CiAgICAgIGlmIChjaGlsZEluZGV4ID49IF9pdGVtcy5sZW5ndGgpIGJyZWFrOwogICAgICBUIGNoaWxkID0gX2l0ZW1zW2NoaWxkSW5kZXhdOwogICAgICBpZiAoY2hpbGRJbmRleCArIDEgPCBfaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgVCBuZXh0Q2hpbGQgPSBfaXRlbXNbY2hpbGRJbmRleCArIDFdOwogICAgICAgIGlmIChzb3J0c0JlZm9yZShuZXh0Q2hpbGQsIGNoaWxkKSkgewogICAgICAgICAgY2hpbGQgPSBuZXh0Q2hpbGQ7CiAgICAgICAgICBjaGlsZEluZGV4Kys7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzb3J0c0JlZm9yZShpdGVtLCBjaGlsZCkpIGJyZWFrOwogICAgICBfaXRlbXNbaW5kZXhdID0gX2l0ZW1zW2NoaWxkSW5kZXhdOwogICAgICBpbmRleCA9IGNoaWxkSW5kZXg7CiAgICB9CiAgICBfaXRlbXNbaW5kZXhdID0gaXRlbTsKICB9Cn0KQABOTjwBSRkYASYBLAEVHxgYLiweIwYaBAEPGyQuFAQBQx4BJB0EASAdBAEbExMwLiQsLi0dGAoIKyoaBhoEAgEccGFja2FnZTprZXJuZWwvc3JjL2hlYXAuZGFydCpzZGtyb290Oi9wa2cva2VybmVsL2xpYi9saWJyYXJ5X2luZGV4LmRhcnSg/S8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCmxpYnJhcnkga2VybmVsLmxpYnJhcnlfaW5kZXg7CgppbXBvcnQgJ2FzdC5kYXJ0JzsKCi8vLyBQcm92aWRlcyBuYW1lLWJhc2VkIGFjY2VzcyB0byBsaWJyYXJ5LCBjbGFzcywgYW5kIG1lbWJlciBBU1Qgbm9kZXMuCi8vLwovLy8gV2hlbiBjb25zdHJ1Y3RlZCwgYSBnaXZlbiBzZXQgb2YgbGlicmFyaWVzIGFyZSBpbmRleGVkIGltbWVkaWF0ZWx5LCBhbmQKLy8vIHdpbGwgbm90IGJlIHVwLXRvLWRhdGUgd2l0aCBjaGFuZ2VzIG1hZGUgYWZ0ZXIgaXQgd2FzIGNyZWF0ZWQuCmNsYXNzIExpYnJhcnlJbmRleCB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBnZXR0ZXJQcmVmaXggPSAnZ2V0Oic7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBzZXR0ZXJQcmVmaXggPSAnc2V0Oic7CgogIC8vLyBBIHNwZWNpYWwgY2xhc3MgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgdG9wLWxldmVsIG1lbWJlcnMKICAvLy8gb2YgYSBsaWJyYXJ5LgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdG9wTGV2ZWwgPSAnOjonOwoKICBmaW5hbCBNYXA8U3RyaW5nLCBfQ2xhc3NUYWJsZT4gX2xpYnJhcmllcyA9IDxTdHJpbmcsIF9DbGFzc1RhYmxlPnt9OwoKICAvLy8gSW5kZXhlcyB0aGUgbGlicmFyaWVzIHdpdGggdGhlIFVSSXMgZ2l2ZW4gaW4gW2xpYnJhcnlVcmlzXS4KICBMaWJyYXJ5SW5kZXgoQ29tcG9uZW50IGNvbXBvbmVudCwgSXRlcmFibGU8U3RyaW5nPiBsaWJyYXJ5VXJpcykgewogICAgdmFyIGxpYnJhcnlVcmlTZXQgPSBsaWJyYXJ5VXJpcy50b1NldCgpOwogICAgZm9yICh2YXIgbGlicmFyeSBpbiBjb21wb25lbnQubGlicmFyaWVzKSB7CiAgICAgIHZhciB1cmkgPSAnJHtsaWJyYXJ5LmltcG9ydFVyaX0nOwogICAgICBpZiAobGlicmFyeVVyaVNldC5jb250YWlucyh1cmkpKSB7CiAgICAgICAgX2xpYnJhcmllc1t1cmldID0gbmV3IF9DbGFzc1RhYmxlKGxpYnJhcnkpOwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gSW5kZXhlcyB0aGUgbGlicmFyaWVzIHdpdGggdGhlIFVSSXMgZ2l2ZW4gaW4gW2xpYnJhcnlVcmlzXS4KICBMaWJyYXJ5SW5kZXguYnlVcmkoQ29tcG9uZW50IGNvbXBvbmVudCwgSXRlcmFibGU8VXJpPiBsaWJyYXJ5VXJpcykKICAgICAgOiB0aGlzKGNvbXBvbmVudCwgbGlicmFyeVVyaXMubWFwKCh1cmkpID0+ICckdXJpJykpOwoKICAvLy8gSW5kZXhlcyBgZGFydDpgIGxpYnJhcmllcy4KICBMaWJyYXJ5SW5kZXguY29yZUxpYnJhcmllcyhDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBmb3IgKHZhciBsaWJyYXJ5IGluIGNvbXBvbmVudC5saWJyYXJpZXMpIHsKICAgICAgaWYgKGxpYnJhcnkuaW1wb3J0VXJpLnNjaGVtZSA9PSAnZGFydCcpIHsKICAgICAgICBfbGlicmFyaWVzWycke2xpYnJhcnkuaW1wb3J0VXJpfSddID0gbmV3IF9DbGFzc1RhYmxlKGxpYnJhcnkpOwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gSW5kZXhlcyB0aGUgZW50aXJlIGNvbXBvbmVudC4KICAvLy8KICAvLy8gQ29uc2lkZXIgdXNpbmcgYW5vdGhlciBjb25zdHJ1Y3RvciB0byBvbmx5IGluZGV4IHRoZSBsaWJyYXJpZXMgdGhhdAogIC8vLyBhcmUgbmVlZGVkLgogIExpYnJhcnlJbmRleC5hbGwoQ29tcG9uZW50IGNvbXBvbmVudCkgewogICAgZm9yICh2YXIgbGlicmFyeSBpbiBjb21wb25lbnQubGlicmFyaWVzKSB7CiAgICAgIF9saWJyYXJpZXNbJyR7bGlicmFyeS5pbXBvcnRVcml9J10gPSBuZXcgX0NsYXNzVGFibGUobGlicmFyeSk7CiAgICB9CiAgfQoKICBfQ2xhc3NUYWJsZSBfZ2V0TGlicmFyeUluZGV4KFN0cmluZyB1cmkpIHsKICAgIF9DbGFzc1RhYmxlIGxpYnJhcnlJbmRleCA9IF9saWJyYXJpZXNbdXJpXTsKICAgIGlmIChsaWJyYXJ5SW5kZXggPT0gbnVsbCkgewogICAgICB0aHJvdyAiVGhlIGxpYnJhcnkgJyR1cmknIGhhcyBub3QgYmVlbiBpbmRleGVkIjsKICAgIH0KICAgIHJldHVybiBsaWJyYXJ5SW5kZXg7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgbGlicmFyeSB3aXRoIHRoZSBnaXZlbiBVUkkuCiAgLy8vCiAgLy8vIFRocm93cyBhbiBlcnJvciBpZiBpdCBkb2VzIG5vdCBleGlzdC4KICBMaWJyYXJ5IGdldExpYnJhcnkoU3RyaW5nIHVyaSkgPT4gX2dldExpYnJhcnlJbmRleCh1cmkpLmxpYnJhcnk7CgogIC8vLyBMaWtlIFtnZXRMaWJyYXJ5XSBidXQgcmV0dXJucyBgbnVsbGAgaWYgbm90IGZvdW5kLgogIExpYnJhcnkgdHJ5R2V0TGlicmFyeShTdHJpbmcgdXJpKSA9PiBfbGlicmFyaWVzW3VyaV0/LmxpYnJhcnk7CgogIC8vLyBUcnVlIGlmIHRoZSBsaWJyYXJ5IHdpdGggdGhlIGdpdmVuIFVSSSBleGlzdHMgYW5kIHdhcyBpbmRleGVkLgogIGJvb2wgY29udGFpbnNMaWJyYXJ5KFN0cmluZyB1cmkpID0+IF9saWJyYXJpZXMuY29udGFpbnNLZXkodXJpKTsKCiAgLy8vIFJldHVybnMgdGhlIGNsYXNzIHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gdGhlIGdpdmVuIGxpYnJhcnkuCiAgLy8vCiAgLy8vIEFuIGVycm9yIGlzIHRocm93biBpZiB0aGUgY2xhc3MgaXMgbm90IGZvdW5kLgogIENsYXNzIGdldENsYXNzKFN0cmluZyBsaWJyYXJ5LCBTdHJpbmcgY2xhc3NOYW1lKSB7CiAgICByZXR1cm4gX2dldExpYnJhcnlJbmRleChsaWJyYXJ5KS5nZXRDbGFzcyhjbGFzc05hbWUpOwogIH0KCiAgLy8vIExpa2UgW2dldENsYXNzXSBidXQgcmV0dXJucyBgbnVsbGAgaWYgbm90IGZvdW5kLgogIENsYXNzIHRyeUdldENsYXNzKFN0cmluZyBsaWJyYXJ5LCBTdHJpbmcgY2xhc3NOYW1lKSB7CiAgICByZXR1cm4gX2xpYnJhcmllc1tsaWJyYXJ5XT8udHJ5R2V0Q2xhc3MoY2xhc3NOYW1lKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBtZW1iZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgaW4gdGhlIGdpdmVuIGNsYXNzLCBpbiB0aGUKICAvLy8gZ2l2ZW4gbGlicmFyeS4KICAvLy8KICAvLy8gSWYgYSBnZXR0ZXIgb3Igc2V0dGVyIGlzIHdhbnRlZCwgdGhlIGBnZXQ6YCBvciBgc2V0OmAgcHJlZml4IG11c3QgYmUKICAvLy8gYWRkZWQgaW4gZnJvbnQgb2YgdGhlIG1lbWJlciBuYW1lLgogIC8vLwogIC8vLyBUaGUgc3BlY2lhbCBjbGFzcyBuYW1lIGA6OmAgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRvcC1sZXZlbCBtZW1iZXJzLgogIC8vLwogIC8vLyBJZiB0aGUgbWVtYmVyIG5hbWUgaXMgcHJpdmF0ZSBpdCBpcyBjb25zaWRlcmVkIHByaXZhdGUgdG8gW2xpYnJhcnldLgogIC8vLyBJdCBpcyBub3QgcG9zc2libGUgd2l0aCB0aGlzIGNsYXNzIHRvIGxvb2t1cCBtZW1iZXJzIHdob3NlIG5hbWUgaXMgcHJpdmF0ZQogIC8vLyB0byBhIGxpYnJhcnkgb3RoZXIgdGhhbiB0aGUgb25lIGNvbnRhaW5pbmcgaXQuCiAgLy8vCiAgLy8vIEFuIGVycm9yIGlzIHRocm93biBpZiB0aGUgbWVtYmVyIGlzIG5vdCBmb3VuZC4KICBNZW1iZXIgZ2V0TWVtYmVyKFN0cmluZyBsaWJyYXJ5LCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbWVtYmVyTmFtZSkgewogICAgcmV0dXJuIF9nZXRMaWJyYXJ5SW5kZXgobGlicmFyeSkuZ2V0TWVtYmVyKGNsYXNzTmFtZSwgbWVtYmVyTmFtZSk7CiAgfQoKICAvLy8gTGlrZSBbZ2V0TWVtYmVyXSBidXQgcmV0dXJucyBgbnVsbGAgaWYgbm90IGZvdW5kLgogIE1lbWJlciB0cnlHZXRNZW1iZXIoU3RyaW5nIGxpYnJhcnksIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZW1iZXJOYW1lKSB7CiAgICByZXR1cm4gX2xpYnJhcmllc1tsaWJyYXJ5XT8udHJ5R2V0TWVtYmVyKGNsYXNzTmFtZSwgbWVtYmVyTmFtZSk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgdG9wLWxldmVsIG1lbWJlciB3aXRoIHRoZSBnaXZlbiBuYW1lLCBpbiB0aGUgZ2l2ZW4gbGlicmFyeS4KICAvLy8KICAvLy8gSWYgYSBnZXR0ZXIgb3Igc2V0dGVyIGlzIHdhbnRlZCwgdGhlIGBnZXQ6YCBvciBgc2V0OmAgcHJlZml4IG11c3QgYmUKICAvLy8gYWRkZWQgaW4gZnJvbnQgb2YgdGhlIG1lbWJlciBuYW1lLgogIC8vLwogIC8vLyBJZiB0aGUgbWVtYmVyIG5hbWUgaXMgcHJpdmF0ZSBpdCBpcyBjb25zaWRlcmVkIHByaXZhdGUgdG8gW2xpYnJhcnldLgogIC8vLyBJdCBpcyBub3QgcG9zc2libGUgd2l0aCB0aGlzIGNsYXNzIHRvIGxvb2t1cCBtZW1iZXJzIHdob3NlIG5hbWUgaXMgcHJpdmF0ZQogIC8vLyB0byBhIGxpYnJhcnkgb3RoZXIgdGhhbiB0aGUgb25lIGNvbnRhaW5pbmcgaXQuCiAgLy8vCiAgLy8vIEFuIGVycm9yIGlzIHRocm93biBpZiB0aGUgbWVtYmVyIGlzIG5vdCBmb3VuZC4KICBNZW1iZXIgZ2V0VG9wTGV2ZWxNZW1iZXIoU3RyaW5nIGxpYnJhcnksIFN0cmluZyBtZW1iZXJOYW1lKSB7CiAgICByZXR1cm4gZ2V0TWVtYmVyKGxpYnJhcnksIHRvcExldmVsLCBtZW1iZXJOYW1lKTsKICB9CgogIC8vLyBMaWtlIFtnZXRUb3BMZXZlbE1lbWJlcl0gYnV0IHJldHVybnMgYG51bGxgIGlmIG5vdCBmb3VuZC4KICBNZW1iZXIgdHJ5R2V0VG9wTGV2ZWxNZW1iZXIoCiAgICAgIFN0cmluZyBsaWJyYXJ5LCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbWVtYmVyTmFtZSkgewogICAgcmV0dXJuIHRyeUdldE1lbWJlcihsaWJyYXJ5LCB0b3BMZXZlbCwgbWVtYmVyTmFtZSk7CiAgfQp9CgpjbGFzcyBfQ2xhc3NUYWJsZSB7CiAgZmluYWwgTGlicmFyeSBsaWJyYXJ5OwoKICBNYXA8U3RyaW5nLCBfTWVtYmVyVGFibGU+IF9jbGFzc2VzOwoKICBfQ2xhc3NUYWJsZSh0aGlzLmxpYnJhcnkpOwoKICBNYXA8U3RyaW5nLCBfTWVtYmVyVGFibGU+IGdldCBjbGFzc2VzIHsKICAgIGlmIChfY2xhc3NlcyA9PSBudWxsKSB7CiAgICAgIF9jbGFzc2VzID0gPFN0cmluZywgX01lbWJlclRhYmxlPnt9OwogICAgICBfY2xhc3Nlc1tMaWJyYXJ5SW5kZXgudG9wTGV2ZWxdID0gbmV3IF9NZW1iZXJUYWJsZS50b3BMZXZlbCh0aGlzKTsKICAgICAgZm9yICh2YXIgY2xhc3NfIGluIGxpYnJhcnkuY2xhc3NlcykgewogICAgICAgIF9jbGFzc2VzW2NsYXNzXy5uYW1lXSA9IG5ldyBfTWVtYmVyVGFibGUodGhpcywgY2xhc3NfKTsKICAgICAgfQogICAgICBmb3IgKFJlZmVyZW5jZSByZWZlcmVuY2UgaW4gbGlicmFyeS5hZGRpdGlvbmFsRXhwb3J0cykgewogICAgICAgIE5hbWVkTm9kZSBub2RlID0gcmVmZXJlbmNlLm5vZGU7CiAgICAgICAgaWYgKG5vZGUgaXMgQ2xhc3MpIHsKICAgICAgICAgIF9jbGFzc2VzW25vZGUubmFtZV0gPSBuZXcgX01lbWJlclRhYmxlKHRoaXMsIG5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIF9jbGFzc2VzOwogIH0KCiAgU3RyaW5nIGdldCBjb250YWluZXJOYW1lIHsKICAgIC8vIEZvciB1c2VmdWwgZXJyb3IgbWVzc2FnZXMsIGl0IGNhbiBiZSBoZWxwZnVsIHRvIGluZGljYXRlIGlmIHRoZSBsaWJyYXJ5CiAgICAvLyBpcyBleHRlcm5hbC4gIElmIGEgY2xhc3Mgb3IgbWVtYmVyIHdhcyBub3QgZm91bmQgaW4gYW4gZXh0ZXJuYWwgbGlicmFyeSwKICAgIC8vIGl0IG1pZ2h0IGJlIHRoYXQgaXQgZXhpc3RzIGluIHRoZSBhY3R1YWwgbGlicmFyeSwgYnV0IGl0cyBpbnRlcmZhY2Ugd2FzCiAgICAvLyBub3QgaW5jbHVkZWQgaW4gdGhpcyBidWlsZCB1bml0LgogICAgcmV0dXJuIGxpYnJhcnkuaXNFeHRlcm5hbAogICAgICAgID8gImV4dGVybmFsIGxpYnJhcnkgJyR7bGlicmFyeS5pbXBvcnRVcml9JyIKICAgICAgICA6ICJsaWJyYXJ5ICcke2xpYnJhcnkuaW1wb3J0VXJpfSciOwogIH0KCiAgX01lbWJlclRhYmxlIF9nZXRDbGFzc0luZGV4KFN0cmluZyBuYW1lKSB7CiAgICB2YXIgaW5kZXhlciA9IGNsYXNzZXNbbmFtZV07CiAgICBpZiAoaW5kZXhlciA9PSBudWxsKSB7CiAgICAgIHRocm93ICJDbGFzcyAnJG5hbWUnIG5vdCBmb3VuZCBpbiAkY29udGFpbmVyTmFtZSI7CiAgICB9CiAgICByZXR1cm4gaW5kZXhlcjsKICB9CgogIENsYXNzIGdldENsYXNzKFN0cmluZyBuYW1lKSB7CiAgICByZXR1cm4gX2dldENsYXNzSW5kZXgobmFtZSkuY2xhc3NfOwogIH0KCiAgQ2xhc3MgdHJ5R2V0Q2xhc3MoU3RyaW5nIG5hbWUpIHsKICAgIHJldHVybiBjbGFzc2VzW25hbWVdPy5jbGFzc187CiAgfQoKICBNZW1iZXIgZ2V0TWVtYmVyKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZW1iZXJOYW1lKSB7CiAgICByZXR1cm4gX2dldENsYXNzSW5kZXgoY2xhc3NOYW1lKS5nZXRNZW1iZXIobWVtYmVyTmFtZSk7CiAgfQoKICBNZW1iZXIgdHJ5R2V0TWVtYmVyKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZW1iZXJOYW1lKSB7CiAgICByZXR1cm4gY2xhc3Nlc1tjbGFzc05hbWVdPy50cnlHZXRNZW1iZXIobWVtYmVyTmFtZSk7CiAgfQp9CgpjbGFzcyBfTWVtYmVyVGFibGUgewogIGZpbmFsIF9DbGFzc1RhYmxlIHBhcmVudDsKICBmaW5hbCBDbGFzcyBjbGFzc187IC8vIE51bGwgZm9yIHRvcC1sZXZlbC4KICBNYXA8U3RyaW5nLCBNZW1iZXI+IF9tZW1iZXJzOwoKICBMaWJyYXJ5IGdldCBsaWJyYXJ5ID0+IHBhcmVudC5saWJyYXJ5OwoKICBfTWVtYmVyVGFibGUodGhpcy5wYXJlbnQsIHRoaXMuY2xhc3NfKTsKCiAgX01lbWJlclRhYmxlLnRvcExldmVsKHRoaXMucGFyZW50KSA6IGNsYXNzXyA9IG51bGw7CgogIE1hcDxTdHJpbmcsIE1lbWJlcj4gZ2V0IG1lbWJlcnMgewogICAgaWYgKF9tZW1iZXJzID09IG51bGwpIHsKICAgICAgX21lbWJlcnMgPSA8U3RyaW5nLCBNZW1iZXI+e307CiAgICAgIGlmIChjbGFzc18gIT0gbnVsbCkgewogICAgICAgIGNsYXNzXy5wcm9jZWR1cmVzLmZvckVhY2goYWRkTWVtYmVyKTsKICAgICAgICBjbGFzc18uZmllbGRzLmZvckVhY2goYWRkTWVtYmVyKTsKICAgICAgICBjbGFzc18uY29uc3RydWN0b3JzLmZvckVhY2goYWRkTWVtYmVyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsaWJyYXJ5LnByb2NlZHVyZXMuZm9yRWFjaChhZGRNZW1iZXIpOwogICAgICAgIGxpYnJhcnkuZmllbGRzLmZvckVhY2goYWRkTWVtYmVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIF9tZW1iZXJzOwogIH0KCiAgU3RyaW5nIGdldERpc2FtYmlndWF0ZWROYW1lKE1lbWJlciBtZW1iZXIpIHsKICAgIGlmIChtZW1iZXIgaXMgUHJvY2VkdXJlKSB7CiAgICAgIGlmIChtZW1iZXIuaXNHZXR0ZXIpIHJldHVybiBMaWJyYXJ5SW5kZXguZ2V0dGVyUHJlZml4ICsgbWVtYmVyLm5hbWUubmFtZTsKICAgICAgaWYgKG1lbWJlci5pc1NldHRlcikgcmV0dXJuIExpYnJhcnlJbmRleC5zZXR0ZXJQcmVmaXggKyBtZW1iZXIubmFtZS5uYW1lOwogICAgfQogICAgcmV0dXJuIG1lbWJlci5uYW1lLm5hbWU7CiAgfQoKICB2b2lkIGFkZE1lbWJlcihNZW1iZXIgbWVtYmVyKSB7CiAgICBpZiAobWVtYmVyLm5hbWUuaXNQcml2YXRlICYmIG1lbWJlci5uYW1lLmxpYnJhcnkgIT0gbGlicmFyeSkgewogICAgICAvLyBNZW1iZXJzIHdob3NlIG5hbWUgaXMgcHJpdmF0ZSB0byBvdGhlciBsaWJyYXJpZXMgY2Fubm90IGN1cnJlbnRseQogICAgICAvLyBiZSBmb3VuZCB3aXRoIHRoZSBMaWJyYXJ5SW5kZXggY2xhc3MuCiAgICAgIHJldHVybjsKICAgIH0KICAgIF9tZW1iZXJzW2dldERpc2FtYmlndWF0ZWROYW1lKG1lbWJlcildID0gbWVtYmVyOwogIH0KCiAgU3RyaW5nIGdldCBjb250YWluZXJOYW1lIHsKICAgIGlmIChjbGFzc18gPT0gbnVsbCkgewogICAgICByZXR1cm4gInRvcC1sZXZlbCBvZiAke3BhcmVudC5jb250YWluZXJOYW1lfSI7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gImNsYXNzICcke2NsYXNzXy5uYW1lfScgaW4gJHtwYXJlbnQuY29udGFpbmVyTmFtZX0iOwogICAgfQogIH0KCiAgTWVtYmVyIGdldE1lbWJlcihTdHJpbmcgbmFtZSkgewogICAgdmFyIG1lbWJlciA9IG1lbWJlcnNbbmFtZV07CiAgICBpZiAobWVtYmVyID09IG51bGwpIHsKICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiQSBtZW1iZXIgd2l0aCBkaXNhbWJpZ3VhdGVkIG5hbWUgJyRuYW1lJyB3YXMgbm90IGZvdW5kICIKICAgICAgICAgICJpbiAkY29udGFpbmVyTmFtZSI7CiAgICAgIHZhciBnZXR0ZXIgPSBMaWJyYXJ5SW5kZXguZ2V0dGVyUHJlZml4ICsgbmFtZTsKICAgICAgdmFyIHNldHRlciA9IExpYnJhcnlJbmRleC5zZXR0ZXJQcmVmaXggKyBuYW1lOwogICAgICBpZiAobWVtYmVyc1tnZXR0ZXJdICE9IG51bGwgfHwgbWVtYmVyc1tzZXR0ZXJdICE9IG51bGwpIHsKICAgICAgICB0aHJvdyAiJG1lc3NhZ2UuIERpZCB5b3UgbWVhbiAnJGdldHRlcicgb3IgJyRzZXR0ZXInPyI7CiAgICAgIH0KICAgICAgdGhyb3cgbWVzc2FnZTsKICAgIH0KICAgIHJldHVybiBtZW1iZXI7CiAgfQoKICBNZW1iZXIgdHJ5R2V0TWVtYmVyKFN0cmluZyBuYW1lKSA9PiBtZW1iZXJzW25hbWVdOwp9CoECAE5OPB4BEwFIBExDFS0tAUwUJwFHAUJELS8oKTQIBgQBQkU7ASE0LzBHCAYEASQGShIqL0UGBAEtMCA3BhkEAS4GLEMBOUEBRUMBQgY0NToEATc4OAQBSRUGSykGSwZLUTUGNUpHBAE4TUUEAU4GSykGS1E1BjVANQQBQB89OAQCARQZASYBHQEqHCtJLEAIPykdPgoIBhUEAR1PUE8oHjQsBAEtIRs5BhQEASAoBAEjIgQBOjwEAT05BAIBFRwtIAEpASoBNgEkHCUcLiowDy8rCAYVBAEvH1BQBh0EASJDSy8OBjUEAR0aNQ1CBgQBIiAaUR81NUBACBUGEwQBNQIBIXBhY2thZ2U6a2VybmVsL2xpYnJhcnlfaW5kZXguZGFydDBzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY2hhcmNvZGUvbGliL2FzY2lpLmRhcnSjKS8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIERlY2xhcmUgaW50ZWdlciBjb25zdGFudHMgZm9yIGVhY2ggQVNDSUkgY2hhcmFjdGVyLgovLy8KLy8vIFRoZSBjb25zdGFudHMgYWxsIHN0YXJ0IHdpdGggIiQiIHRvIGF2b2lkIGNvbmZsaWN0aW5nIHdpdGggb3RoZXIgY29uc3RhbnRzLgovLy8KLy8vIEZvciBjaGFyYWN0ZXJzIHRoYXQgYXJlIHZhbGlkIGluIGFuIGlkZW50aWZpZXIsIHRoZSBjaGFyYWN0ZXIgaXRzZWxmCi8vLyBmb2xsb3dzIHRoZSAiJCIuIEZvciBvdGhlciBjaGFyYWN0ZXJzLCBhIHN5bWJvbGljIG5hbWUgaXMgdXNlZC4KLy8vIEluIHNvbWUgY2FzZXMsIG11bHRpcGxlIGFsdGVybmF0aXZlIHN5bWJvbGljIG5hbWVzIGFyZSBwcm92aWRlZC4KLy8vIFBsZWFzZSBzdGljayB0byB1c2luZyBvbmUgbmFtZSBwZXIgY2hhcmFjdGVyIGluIHlvdXIgY29kZS4KLy8vCi8vLyBUaGUgc3ltYm9saWMgbmFtZXMgYXJlLCB3aGVyZSBhcHBsaWNhYmxlLCB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sIHdpdGhvdXQKLy8vIGFueSAibWFyayIsICJzeW1ib2wiICJzaWduIiBvciAiYWNjZW50IiBzdWZmaXguCi8vLyBFeGFtcGxlczogWyRleGNsYW1hdGlvbl0sIFskcGlwZV0sIFskZG9sbGFyXSBhbmQgWyRncmF2ZV0uCi8vLyBGb3IgbGVzcyBjb21tb24gc3ltYm9scywgYSBzZWxlY3Rpb24gb2YgY29tbW9uIG5hbWVzIGFyZSB1c2VkLgovLy8KLy8vIEZvciBwYXJlbnRoZXRpY2FsIG1hcmtlcnMsIHRoZXJlIGlzIGJvdGggYSBzaG9ydCBuYW1lLCBbJGxwYXJlbl0vWyRycGFyZW5dLAovLy8gYW5kIGEgbG9uZyBuYW1lLCBbJG9wZW5fcGFyZW5dLyBbJGNsb3NlX3BhcmVuXS4KLy8vCi8vLyBGb3IgY29tbW9uIEhUTUwgZW50aXRpZXMsIHRoZSBlbnRpdHkgbmFtZXMgYXJlIGFsc28gdXNhYmxlIGFzIHN5bWJvbGljCi8vLyBuYW1lczogWyRhcG9zXSwgWyRxdW90XSwgWyRsdF0sIFskZ3RdLCBhbmQgWyRhbXBdLgpsaWJyYXJ5IGNoYXJjb2RlLmFzY2lpLmRvbGxhcl9sb3dlcmNhc2U7CgovLyBDb250cm9sIGNoYXJhY3RlcnMuCgovLy8gIk51bGwgY2hhcmFjdGVyIiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRudWwgPSAweDAwOwoKLy8vICJTdGFydCBvZiBIZWFkZXIiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJHNvaCA9IDB4MDE7CgovLy8gIlN0YXJ0IG9mIFRleHQiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJHN0eCA9IDB4MDI7CgovLy8gIkVuZCBvZiBUZXh0IiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRldHggPSAweDAzOwoKLy8vICJFbmQgb2YgVHJhbnNtaXNzaW9uIiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRlb3QgPSAweDA0OwoKLy8vICJFbnF1aXJ5IiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRlbnEgPSAweDA1OwoKLy8vICJBY2tub3dsZWRnbWVudCIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkYWNrID0gMHgwNjsKCi8vLyAiQmVsbCIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkYmVsID0gMHgwNzsKCi8vLyAiQmFja3NwYWNlIiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRicyA9IDB4MDg7CgovLy8gIkhvcml6b250YWwgVGFiIiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRodCA9IDB4MDk7CgovLy8gIkhvcml6b250YWwgVGFiIiBjb250cm9sIGNoYXJhY3RlciwgY29tbW9uIG5hbWUuCmNvbnN0IGludCAkdGFiID0gMHgwOTsKCi8vLyAiTGluZSBmZWVkIiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRsZiA9IDB4MEE7CgovLy8gIlZlcnRpY2FsIFRhYiIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkdnQgPSAweDBCOwoKLy8vICJGb3JtIGZlZWQiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJGZmID0gMHgwQzsKCi8vLyAiQ2FycmlhZ2UgcmV0dXJuIiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRjciA9IDB4MEQ7CgovLy8gIlNoaWZ0IE91dCIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkc28gPSAweDBFOwoKLy8vICJTaGlmdCBJbiIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkc2kgPSAweDBGOwoKLy8vICJEYXRhIExpbmsgRXNjYXBlIiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRkbGUgPSAweDEwOwoKLy8vICJEZXZpY2UgQ29udHJvbCAxIiBjb250cm9sIGNoYXJhY3RlciAob2Z0LiBYT04pLgpjb25zdCBpbnQgJGRjMSA9IDB4MTE7CgovLy8gIkRldmljZSBDb250cm9sIDIiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJGRjMiA9IDB4MTI7CgovLy8gIkRldmljZSBDb250cm9sIDMiIGNvbnRyb2wgY2hhcmFjdGVyIChvZnQuIFhPRkYpLgpjb25zdCBpbnQgJGRjMyA9IDB4MTM7CgovLy8gIkRldmljZSBDb250cm9sIDQiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJGRjNCA9IDB4MTQ7CgovLy8gIk5lZ2F0aXZlIEFja25vd2xlZGdtZW50IiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRuYWsgPSAweDE1OwoKLy8vICJTeW5jaHJvbm91cyBpZGxlIiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRzeW4gPSAweDE2OwoKLy8vICJFbmQgb2YgVHJhbnNtaXNzaW9uIEJsb2NrIiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRldGIgPSAweDE3OwoKLy8vICJDYW5jZWwiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJGNhbiA9IDB4MTg7CgovLy8gIkVuZCBvZiBNZWRpdW0iIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJGVtID0gMHgxOTsKCi8vLyAiU3Vic3RpdHV0ZSIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkc3ViID0gMHgxQTsKCi8vLyAiRXNjYXBlIiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRlc2MgPSAweDFCOwoKLy8vICJGaWxlIFNlcGFyYXRvciIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkZnMgPSAweDFDOwoKLy8vICJHcm91cCBTZXBhcmF0b3IiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJGdzID0gMHgxRDsKCi8vLyAiUmVjb3JkIFNlcGFyYXRvciIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkcnMgPSAweDFFOwoKLy8vICJVbml0IFNlcGFyYXRvciIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkdXMgPSAweDFGOwoKLy8vICJEZWxldGUiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJGRlbCA9IDB4N0Y7CgovLyBWaXNpYmxlIGNoYXJhY3RlcnMuCgovLy8gU3BhY2UgY2hhcmFjdGVyLgpjb25zdCBpbnQgJHNwYWNlID0gMHgyMDsKCi8vLyBDaGFyYWN0ZXIgJyEnLgpjb25zdCBpbnQgJGV4Y2xhbWF0aW9uID0gMHgyMTsKCi8vLyBDaGFyYWN0ZXIgJyInLCBzaG9ydCBuYW1lLgpjb25zdCBpbnQgJHF1b3QgPSAweDIyOwoKLy8vIENoYXJhY3RlciAnIicuCmNvbnN0IGludCAkcXVvdGUgPSAweDIyOwoKLy8vIENoYXJhY3RlciAnIicuCmNvbnN0IGludCAkZG91YmxlX3F1b3RlID0gMHgyMjsKCi8vLyBDaGFyYWN0ZXIgJyInLgpjb25zdCBpbnQgJHF1b3RhdGlvbiA9IDB4MjI7CgovLy8gQ2hhcmFjdGVyICcjJy4KY29uc3QgaW50ICRoYXNoID0gMHgyMzsKCi8vLyBDaGFyYWN0ZXIgJyQnLgpjb25zdCBpbnQgJCQgPSAweDI0OwoKLy8vIENoYXJhY3RlciAnJCcuCmNvbnN0IGludCAkZG9sbGFyID0gMHgyNDsKCi8vLyBDaGFyYWN0ZXIgJyUnLgpjb25zdCBpbnQgJHBlcmNlbnQgPSAweDI1OwoKLy8vIENoYXJhY3RlciAnJicsIHNob3J0IG5hbWUuCmNvbnN0IGludCAkYW1wID0gMHgyNjsKCi8vLyBDaGFyYWN0ZXIgJyYnLgpjb25zdCBpbnQgJGFtcGVyc2FuZCA9IDB4MjY7CgovLy8gQ2hhcmFjdGVyICInIi4KY29uc3QgaW50ICRhcG9zID0gMHgyNzsKCi8vLyBDaGFyYWN0ZXIgJycnLgpjb25zdCBpbnQgJGFwb3N0cm9waGUgPSAweDI3OwoKLy8vIENoYXJhY3RlciAnJycuCmNvbnN0IGludCAkc2luZ2xlX3F1b3RlID0gMHgyNzsKCi8vLyBDaGFyYWN0ZXIgJygnLgpjb25zdCBpbnQgJGxwYXJlbiA9IDB4Mjg7CgovLy8gQ2hhcmFjdGVyICcoJy4KY29uc3QgaW50ICRvcGVuX3BhcmVuID0gMHgyODsKCi8vLyBDaGFyYWN0ZXIgJygnLgpjb25zdCBpbnQgJG9wZW5fcGFyZW50aGVzaXMgPSAweDI4OwoKLy8vIENoYXJhY3RlciAnKScuCmNvbnN0IGludCAkcnBhcmVuID0gMHgyOTsKCi8vLyBDaGFyYWN0ZXIgJyknLgpjb25zdCBpbnQgJGNsb3NlX3BhcmVuID0gMHgyOTsKCi8vLyBDaGFyYWN0ZXIgJyknLgpjb25zdCBpbnQgJGNsb3NlX3BhcmVudGhlc2lzID0gMHgyOTsKCi8vLyBDaGFyYWN0ZXIgJyonLgpjb25zdCBpbnQgJGFzdGVyaXNrID0gMHgyQTsKCi8vLyBDaGFyYWN0ZXIgJysnLgpjb25zdCBpbnQgJHBsdXMgPSAweDJCOwoKLy8vIENoYXJhY3RlciAnLCcuCmNvbnN0IGludCAkY29tbWEgPSAweDJDOwoKLy8vIENoYXJhY3RlciAnLScuCmNvbnN0IGludCAkbWludXMgPSAweDJEOwoKLy8vIENoYXJhY3RlciAnLScuCmNvbnN0IGludCAkZGFzaCA9IDB4MkQ7CgovLy8gQ2hhcmFjdGVyICcuJy4KY29uc3QgaW50ICRkb3QgPSAweDJFOwoKLy8vIENoYXJhY3RlciAnLicuCmNvbnN0IGludCAkZnVsbHN0b3AgPSAweDJFOwoKLy8vIENoYXJhY3RlciAnLycuCmNvbnN0IGludCAkc2xhc2ggPSAweDJGOwoKLy8vIENoYXJhY3RlciAnLycuCmNvbnN0IGludCAkc29saWR1cyA9IDB4MkY7CgovLy8gQ2hhcmFjdGVyICcvJy4KY29uc3QgaW50ICRkaXZpc2lvbiA9IDB4MkY7CgovLy8gQ2hhcmFjdGVyICcwJy4KY29uc3QgaW50ICQwID0gMHgzMDsKCi8vLyBDaGFyYWN0ZXIgJzEnLgpjb25zdCBpbnQgJDEgPSAweDMxOwoKLy8vIENoYXJhY3RlciAnMicuCmNvbnN0IGludCAkMiA9IDB4MzI7CgovLy8gQ2hhcmFjdGVyICczJy4KY29uc3QgaW50ICQzID0gMHgzMzsKCi8vLyBDaGFyYWN0ZXIgJzQnLgpjb25zdCBpbnQgJDQgPSAweDM0OwoKLy8vIENoYXJhY3RlciAnNScuCmNvbnN0IGludCAkNSA9IDB4MzU7CgovLy8gQ2hhcmFjdGVyICc2Jy4KY29uc3QgaW50ICQ2ID0gMHgzNjsKCi8vLyBDaGFyYWN0ZXIgJzcnLgpjb25zdCBpbnQgJDcgPSAweDM3OwoKLy8vIENoYXJhY3RlciAnOCcuCmNvbnN0IGludCAkOCA9IDB4Mzg7CgovLy8gQ2hhcmFjdGVyICc5Jy4KY29uc3QgaW50ICQ5ID0gMHgzOTsKCi8vLyBDaGFyYWN0ZXIgJzonLgpjb25zdCBpbnQgJGNvbG9uID0gMHgzQTsKCi8vLyBDaGFyYWN0ZXIgJzsnLgpjb25zdCBpbnQgJHNlbWljb2xvbiA9IDB4M0I7CgovLy8gQ2hhcmFjdGVyICc8Jy4KY29uc3QgaW50ICRsdCA9IDB4M0M7CgovLy8gQ2hhcmFjdGVyICc8Jy4KY29uc3QgaW50ICRsZXNzX3RoYW4gPSAweDNDOwoKLy8vIENoYXJhY3RlciAnPCcuCmNvbnN0IGludCAkbGFuZ2xlID0gMHgzQzsKCi8vLyBDaGFyYWN0ZXIgJzwnLgpjb25zdCBpbnQgJG9wZW5fYW5nbGUgPSAweDNDOwoKLy8vIENoYXJhY3RlciAnPScuCmNvbnN0IGludCAkZXF1YWwgPSAweDNEOwoKLy8vIENoYXJhY3RlciAnPicuCmNvbnN0IGludCAkZ3QgPSAweDNFOwoKLy8vIENoYXJhY3RlciAnPicuCmNvbnN0IGludCAkZ3JlYXRlcl90aGFuID0gMHgzRTsKCi8vLyBDaGFyYWN0ZXIgJz4nLgpjb25zdCBpbnQgJHJhbmdsZSA9IDB4M0U7CgovLy8gQ2hhcmFjdGVyICc+Jy4KY29uc3QgaW50ICRjbG9zZV9hbmdsZSA9IDB4M0U7CgovLy8gQ2hhcmFjdGVyICc/Jy4KY29uc3QgaW50ICRxdWVzdGlvbiA9IDB4M0Y7CgovLy8gQ2hhcmFjdGVyICdAJy4KY29uc3QgaW50ICRhdCA9IDB4NDA7CgovLy8gQ2hhcmFjdGVyICdBJy4KY29uc3QgaW50ICRBID0gMHg0MTsKCi8vLyBDaGFyYWN0ZXIgJ0InLgpjb25zdCBpbnQgJEIgPSAweDQyOwoKLy8vIENoYXJhY3RlciAnQycuCmNvbnN0IGludCAkQyA9IDB4NDM7CgovLy8gQ2hhcmFjdGVyICdEJy4KY29uc3QgaW50ICREID0gMHg0NDsKCi8vLyBDaGFyYWN0ZXIgJ0UnLgpjb25zdCBpbnQgJEUgPSAweDQ1OwoKLy8vIENoYXJhY3RlciAnRicuCmNvbnN0IGludCAkRiA9IDB4NDY7CgovLy8gQ2hhcmFjdGVyICdHJy4KY29uc3QgaW50ICRHID0gMHg0NzsKCi8vLyBDaGFyYWN0ZXIgJ0gnLgpjb25zdCBpbnQgJEggPSAweDQ4OwoKLy8vIENoYXJhY3RlciAnSScuCmNvbnN0IGludCAkSSA9IDB4NDk7CgovLy8gQ2hhcmFjdGVyICdKJy4KY29uc3QgaW50ICRKID0gMHg0QTsKCi8vLyBDaGFyYWN0ZXIgJ0snLgpjb25zdCBpbnQgJEsgPSAweDRCOwoKLy8vIENoYXJhY3RlciAnTCcuCmNvbnN0IGludCAkTCA9IDB4NEM7CgovLy8gQ2hhcmFjdGVyICdNJy4KY29uc3QgaW50ICRNID0gMHg0RDsKCi8vLyBDaGFyYWN0ZXIgJ04nLgpjb25zdCBpbnQgJE4gPSAweDRFOwoKLy8vIENoYXJhY3RlciAnTycuCmNvbnN0IGludCAkTyA9IDB4NEY7CgovLy8gQ2hhcmFjdGVyICdQJy4KY29uc3QgaW50ICRQID0gMHg1MDsKCi8vLyBDaGFyYWN0ZXIgJ1EnLgpjb25zdCBpbnQgJFEgPSAweDUxOwoKLy8vIENoYXJhY3RlciAnUicuCmNvbnN0IGludCAkUiA9IDB4NTI7CgovLy8gQ2hhcmFjdGVyICdTJy4KY29uc3QgaW50ICRTID0gMHg1MzsKCi8vLyBDaGFyYWN0ZXIgJ1QnLgpjb25zdCBpbnQgJFQgPSAweDU0OwoKLy8vIENoYXJhY3RlciAnVScuCmNvbnN0IGludCAkVSA9IDB4NTU7CgovLy8gQ2hhcmFjdGVyICdWJy4KY29uc3QgaW50ICRWID0gMHg1NjsKCi8vLyBDaGFyYWN0ZXIgJ1cnLgpjb25zdCBpbnQgJFcgPSAweDU3OwoKLy8vIENoYXJhY3RlciAnWCcuCmNvbnN0IGludCAkWCA9IDB4NTg7CgovLy8gQ2hhcmFjdGVyICdZJy4KY29uc3QgaW50ICRZID0gMHg1OTsKCi8vLyBDaGFyYWN0ZXIgJ1onLgpjb25zdCBpbnQgJFogPSAweDVBOwoKLy8vIENoYXJhY3RlciAnWycuCmNvbnN0IGludCAkbGJyYWNrZXQgPSAweDVCOwoKLy8vIENoYXJhY3RlciAnWycuCmNvbnN0IGludCAkb3Blbl9icmFja2V0ID0gMHg1QjsKCi8vLyBDaGFyYWN0ZXIgJ1wnLgpjb25zdCBpbnQgJGJhY2tzbGFzaCA9IDB4NUM7CgovLy8gQ2hhcmFjdGVyICddJy4KY29uc3QgaW50ICRyYnJhY2tldCA9IDB4NUQ7CgovLy8gQ2hhcmFjdGVyICddJy4KY29uc3QgaW50ICRjbG9zZV9icmFja2V0ID0gMHg1RDsKCi8vLyBDaGFyYWN0ZXIgJ14nLgpjb25zdCBpbnQgJGNpcmN1bWZsZXggPSAweDVFOwoKLy8vIENoYXJhY3RlciAnXicuCmNvbnN0IGludCAkY2FyZXQgPSAweDVFOwoKLy8vIENoYXJhY3RlciAnXicuCmNvbnN0IGludCAkaGF0ID0gMHg1RTsKCi8vLyBDaGFyYWN0ZXIgJ18nLgpjb25zdCBpbnQgJF8gPSAweDVGOwoKLy8vIENoYXJhY3RlciAnXycuCmNvbnN0IGludCAkdW5kZXJzY29yZSA9IDB4NUY7CgovLy8gQ2hhcmFjdGVyICdfJy4KY29uc3QgaW50ICR1bmRlcmxpbmUgPSAweDVGOwoKLy8vIENoYXJhY3RlciAnYCcuCmNvbnN0IGludCAkYmFja3F1b3RlID0gMHg2MDsKCi8vLyBDaGFyYWN0ZXIgJ2AnLgpjb25zdCBpbnQgJGdyYXZlID0gMHg2MDsKCi8vLyBDaGFyYWN0ZXIgJ2EnLgpjb25zdCBpbnQgJGEgPSAweDYxOwoKLy8vIENoYXJhY3RlciAnYicuCmNvbnN0IGludCAkYiA9IDB4NjI7CgovLy8gQ2hhcmFjdGVyICdjJy4KY29uc3QgaW50ICRjID0gMHg2MzsKCi8vLyBDaGFyYWN0ZXIgJ2QnLgpjb25zdCBpbnQgJGQgPSAweDY0OwoKLy8vIENoYXJhY3RlciAnZScuCmNvbnN0IGludCAkZSA9IDB4NjU7CgovLy8gQ2hhcmFjdGVyICdmJy4KY29uc3QgaW50ICRmID0gMHg2NjsKCi8vLyBDaGFyYWN0ZXIgJ2cnLgpjb25zdCBpbnQgJGcgPSAweDY3OwoKLy8vIENoYXJhY3RlciAnaCcuCmNvbnN0IGludCAkaCA9IDB4Njg7CgovLy8gQ2hhcmFjdGVyICdpJy4KY29uc3QgaW50ICRpID0gMHg2OTsKCi8vLyBDaGFyYWN0ZXIgJ2onLgpjb25zdCBpbnQgJGogPSAweDZBOwoKLy8vIENoYXJhY3RlciAnaycuCmNvbnN0IGludCAkayA9IDB4NkI7CgovLy8gQ2hhcmFjdGVyICdsJy4KY29uc3QgaW50ICRsID0gMHg2QzsKCi8vLyBDaGFyYWN0ZXIgJ20nLgpjb25zdCBpbnQgJG0gPSAweDZEOwoKLy8vIENoYXJhY3RlciAnbicuCmNvbnN0IGludCAkbiA9IDB4NkU7CgovLy8gQ2hhcmFjdGVyICdvJy4KY29uc3QgaW50ICRvID0gMHg2RjsKCi8vLyBDaGFyYWN0ZXIgJ3AnLgpjb25zdCBpbnQgJHAgPSAweDcwOwoKLy8vIENoYXJhY3RlciAncScuCmNvbnN0IGludCAkcSA9IDB4NzE7CgovLy8gQ2hhcmFjdGVyICdyJy4KY29uc3QgaW50ICRyID0gMHg3MjsKCi8vLyBDaGFyYWN0ZXIgJ3MnLgpjb25zdCBpbnQgJHMgPSAweDczOwoKLy8vIENoYXJhY3RlciAndCcuCmNvbnN0IGludCAkdCA9IDB4NzQ7CgovLy8gQ2hhcmFjdGVyICd1Jy4KY29uc3QgaW50ICR1ID0gMHg3NTsKCi8vLyBDaGFyYWN0ZXIgJ3YnLgpjb25zdCBpbnQgJHYgPSAweDc2OwoKLy8vIENoYXJhY3RlciAndycuCmNvbnN0IGludCAkdyA9IDB4Nzc7CgovLy8gQ2hhcmFjdGVyICd4Jy4KY29uc3QgaW50ICR4ID0gMHg3ODsKCi8vLyBDaGFyYWN0ZXIgJ3knLgpjb25zdCBpbnQgJHkgPSAweDc5OwoKLy8vIENoYXJhY3RlciAneicuCmNvbnN0IGludCAkeiA9IDB4N0E7CgovLy8gQ2hhcmFjdGVyICd7Jy4KY29uc3QgaW50ICRsYnJhY2UgPSAweDdCOwoKLy8vIENoYXJhY3RlciAneycuCmNvbnN0IGludCAkb3Blbl9icmFjZSA9IDB4N0I7CgovLy8gQ2hhcmFjdGVyICd8Jy4KY29uc3QgaW50ICRwaXBlID0gMHg3QzsKCi8vLyBDaGFyYWN0ZXIgJ3wnLgpjb25zdCBpbnQgJGJhciA9IDB4N0M7CgovLy8gQ2hhcmFjdGVyICd9Jy4KY29uc3QgaW50ICRyYnJhY2UgPSAweDdEOwoKLy8vIENoYXJhY3RlciAnfScuCmNvbnN0IGludCAkY2xvc2VfYnJhY2UgPSAweDdEOwoKLy8vIENoYXJhY3RlciAnficuCmNvbnN0IGludCAkdGlsZGUgPSAweDdFOwqB/gBOSTwBOARQBElERT8ETTQ/QwRQNARLNykBFwEoFwEpFwEnFwElFwEtFwEhFwEoFwEeFwEjFgEoFgE1FwEjFgEmFgEjFgEpFgEjFgEiFgEqFwE1FwEqFwE2FwEqFwExFwEqFwEzFwEgFwEnFgEkFwEgFwEoFgEpFgEqFgEoFgEgFwEXARUZARMfAR8YARMZARMgARMdARMYARMVARMaARMbAR8XARMdARMYARMeARMgARMaARMeARMkARMaARMfARMlARMcARMYARMZARMZARMYARMXARMcARMZARMbARMcARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMZARMdARMWARMdARMaARMeARMZARMWARMgARMaARMfARMcARMWARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMcARMgARMdARMcARMhARMeARMZARMXARMVARMeARMdARMdARMZARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMVARMaARMeARMYARMXARMaARMfARMZARtwYWNrYWdlOmNoYXJjb2RlL2FzY2lpLmRhcnRAc2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnX3Rlc3RlZC9wYWNrYWdlX2NvbmZpZy9saWIvc3JjL3V0aWwuZGFydI8QLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBVdGlsaXR5IG1ldGhvZHMgdXNlZCBieSBtb3JlIHRoYW4gb25lIGxpYnJhcnkgaW4gdGhlIHBhY2thZ2UuCmxpYnJhcnkgcGFja2FnZV9jb25maWcudXRpbDsKCmltcG9ydCAicGFja2FnZTpjaGFyY29kZS9hc2NpaS5kYXJ0IjsKCi8vIEFsbCBBU0NJSSBjaGFyYWN0ZXJzIHRoYXQgYXJlIHZhbGlkIGluIGEgcGFja2FnZSBuYW1lLCB3aXRoIHNwYWNlCi8vIGZvciBhbGwgdGhlIGludmFsaWQgb25lcyAoaW5jbHVkaW5nIHNwYWNlKS4KY29uc3QgU3RyaW5nIF92YWxpZFBhY2thZ2VOYW1lQ2hhcmFjdGVycyA9CiAgICByIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgICQgJicoKSorLC0uIDAxMjM0NTY3ODkgOyA9ICAiCiAgICByIkBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiAgICBfIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6ICAgfiAiOwoKLy8vIFRlc3RzIHdoZXRoZXIgc29tZXRoaW5nIGlzIGEgdmFsaWQgRGFydCBwYWNrYWdlIG5hbWUuCmJvb2wgaXNWYWxpZFBhY2thZ2VOYW1lKFN0cmluZyBzdHJpbmcpIHsKICByZXR1cm4gX2ZpbmRJbnZhbGlkQ2hhcmFjdGVyKHN0cmluZykgPCAwOwp9CgovLy8gQ2hlY2sgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBwYWNrYWdlIG5hbWUuCi8vLwovLy8gVmFsaWQgcGFja2FnZSBuYW1lcyBjb250YWluIG9ubHkgY2hhcmFjdGVycyBpbiBbX3ZhbGlkUGFja2FnZU5hbWVDaGFyYWN0ZXJzXQovLy8gYW5kIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgbm9uLScuJyBjaGFyYWN0ZXIuCi8vLwovLy8gUmV0dXJucyBgLTFgIGlmIHRoZSBzdHJpbmcgaXMgdmFsaWQuCi8vLyBPdGhlcndpc2UgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyLAovLy8gb3IgYHN0cmluZy5sZW5ndGhgIGlmIHRoZSBzdHJpbmcgY29udGFpbnMgbm8gbm9uLScuJyBjaGFyYWN0ZXIuCmludCBfZmluZEludmFsaWRDaGFyYWN0ZXIoU3RyaW5nIHN0cmluZykgewogIC8vIEJlY29tZXMgbm9uLXplcm8gaWYgYW55IG5vbi0nLicgY2hhcmFjdGVyIGlzIGVuY291bnRlcmVkLgogIGludCBub25Eb3QgPSAwOwogIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgYyA9IHN0cmluZy5jb2RlVW5pdEF0KGkpOwogICAgaWYgKGMgPiAweDdmIHx8IF92YWxpZFBhY2thZ2VOYW1lQ2hhcmFjdGVycy5jb2RlVW5pdEF0KGMpIDw9ICRzcGFjZSkgewogICAgICByZXR1cm4gaTsKICAgIH0KICAgIG5vbkRvdCArPSBjIF4gJGRvdDsKICB9CiAgaWYgKG5vbkRvdCA9PSAwKSByZXR1cm4gc3RyaW5nLmxlbmd0aDsKICByZXR1cm4gLTE7Cn0KCi8vLyBWYWxpZGF0ZSB0aGF0IGEgVXJpIGlzIGEgdmFsaWQgcGFja2FnZTpVUkkuClN0cmluZyBjaGVja1ZhbGlkUGFja2FnZVVyaShVcmkgcGFja2FnZVVyaSkgewogIGlmIChwYWNrYWdlVXJpLnNjaGVtZSAhPSAicGFja2FnZSIpIHsKICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKAogICAgICAgIHBhY2thZ2VVcmksICJwYWNrYWdlVXJpIiwgIk5vdCBhIHBhY2thZ2U6IFVSSSIpOwogIH0KICBpZiAocGFja2FnZVVyaS5oYXNBdXRob3JpdHkpIHsKICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKAogICAgICAgIHBhY2thZ2VVcmksICJwYWNrYWdlVXJpIiwgIlBhY2thZ2UgVVJJcyBtdXN0IG5vdCBoYXZlIGEgaG9zdCBwYXJ0Iik7CiAgfQogIGlmIChwYWNrYWdlVXJpLmhhc1F1ZXJ5KSB7CiAgICAvLyBBIHF1ZXJ5IG1ha2VzIG5vIHNlbnNlIGlmIHJlc29sdmVkIHRvIGEgZmlsZTogVVJJLgogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUoCiAgICAgICAgcGFja2FnZVVyaSwgInBhY2thZ2VVcmkiLCAiUGFja2FnZSBVUklzIG11c3Qgbm90IGhhdmUgYSBxdWVyeSBwYXJ0Iik7CiAgfQogIGlmIChwYWNrYWdlVXJpLmhhc0ZyYWdtZW50KSB7CiAgICAvLyBXZSBjb3VsZCBsZWF2ZSB0aGUgZnJhZ21lbnQgYWZ0ZXIgdGhlIFVSTCB3aGVuIHJlc29sdmluZywKICAgIC8vIGJ1dCBpdCB3b3VsZCBiZSBvZGQgaWYgInBhY2thZ2U6Zm9vL2Zvby5kYXJ0IzEiIGFuZAogICAgLy8gInBhY2thZ2U6Zm9vL2Zvby5kYXJ0IzIiIHdlcmUgY29uc2lkZXJlZCBkaWZmZXJlbnQgbGlicmFyaWVzLgogICAgLy8gS2VlcCB0aGUgc3ludGF4IG9wZW4gaW4gY2FzZSB3ZSBldmVyIGdldCBtdWx0aXBsZSBsaWJyYXJpZXMgaW4gb25lIGZpbGUuCiAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZSgKICAgICAgICBwYWNrYWdlVXJpLCAicGFja2FnZVVyaSIsICJQYWNrYWdlIFVSSXMgbXVzdCBub3QgaGF2ZSBhIGZyYWdtZW50IHBhcnQiKTsKICB9CiAgaWYgKHBhY2thZ2VVcmkucGF0aC5zdGFydHNXaXRoKCcvJykpIHsKICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKAogICAgICAgIHBhY2thZ2VVcmksICJwYWNrYWdlVXJpIiwgIlBhY2thZ2UgVVJJcyBtdXN0IG5vdCBzdGFydCB3aXRoIGEgJy8nIik7CiAgfQogIGludCBmaXJzdFNsYXNoID0gcGFja2FnZVVyaS5wYXRoLmluZGV4T2YoJy8nKTsKICBpZiAoZmlyc3RTbGFzaCA9PSAtMSkgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUocGFja2FnZVVyaSwgInBhY2thZ2VVcmkiLAogICAgICAgICJQYWNrYWdlIFVSSXMgbXVzdCBzdGFydCB3aXRoIHRoZSBwYWNrYWdlIG5hbWUgZm9sbG93ZWQgYnkgYSAnLyciKTsKICB9CiAgU3RyaW5nIHBhY2thZ2VOYW1lID0gcGFja2FnZVVyaS5wYXRoLnN1YnN0cmluZygwLCBmaXJzdFNsYXNoKTsKICBpbnQgYmFkSW5kZXggPSBfZmluZEludmFsaWRDaGFyYWN0ZXIocGFja2FnZU5hbWUpOwogIGlmIChiYWRJbmRleCA+PSAwKSB7CiAgICBpZiAocGFja2FnZU5hbWUuaXNFbXB0eSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZSgKICAgICAgICAgIHBhY2thZ2VVcmksICJwYWNrYWdlVXJpIiwgIlBhY2thZ2UgbmFtZXMgbXVzIGJlIG5vbi1lbXB0eSIpOwogICAgfQogICAgaWYgKGJhZEluZGV4ID09IHBhY2thZ2VOYW1lLmxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZShwYWNrYWdlVXJpLCAicGFja2FnZVVyaSIsCiAgICAgICAgICAiUGFja2FnZSBuYW1lcyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIG5vbi0nLicgY2hhcmFjdGVyIik7CiAgICB9CiAgICBhc3NlcnQoYmFkSW5kZXggPCBwYWNrYWdlTmFtZS5sZW5ndGgpOwogICAgaW50IGJhZENoYXJDb2RlID0gcGFja2FnZU5hbWUuY29kZVVuaXRBdChiYWRJbmRleCk7CiAgICB2YXIgYmFkQ2hhciA9ICJVKyIgKyBiYWRDaGFyQ29kZS50b1JhZGl4U3RyaW5nKDE2KS5wYWRMZWZ0KDQsICcwJyk7CiAgICBpZiAoYmFkQ2hhckNvZGUgPj0gMHgyMCAmJiBiYWRDaGFyQ29kZSA8PSAweDdlKSB7CiAgICAgIC8vIFByaW50YWJsZSBjaGFyYWN0ZXIuCiAgICAgIGJhZENoYXIgPSAiJyR7cGFja2FnZU5hbWVbYmFkSW5kZXhdfScgKCRiYWRDaGFyKSI7CiAgICB9CiAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZSgKICAgICAgICBwYWNrYWdlVXJpLCAicGFja2FnZVVyaSIsICJQYWNrYWdlIG5hbWVzIG11c3Qgbm90IGNvbnRhaW4gJGJhZENoYXIiKTsKICB9CiAgcmV0dXJuIHBhY2thZ2VOYW1lOwp9CmMATk48AUIdASYBRS8rSEkBOiksAgEvBFE1BClARCs/EiwiSxAGGAQpDQIBMC4oIzkEISNNBB06I04EIEE7RVAjUQQpI00EMRo8TARBNRcfJUcGKj5IBis4SDYeOQYjTgQWAgEkcGFja2FnZTpwYWNrYWdlX2NvbmZpZy9zcmMvdXRpbC5kYXJ0RnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zY2FubmVyL3N0cmluZ19jYW5vbmljYWxpemVyLmRhcnSMhC8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnNjYW5uZXIuc3RyaW5nX2Nhbm9uaWNhbGl6ZXI7CgppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CgpjbGFzcyBOb2RlIHsKICB2YXIgLyogU3RyaW5nIHwgTGlzdDxpbnQ+ICovIGRhdGE7CiAgaW50IHN0YXJ0OwogIGludCBlbmQ7CiAgU3RyaW5nIHBheWxvYWQ7CiAgTm9kZSBuZXh0OwogIE5vZGUodGhpcy5kYXRhLCB0aGlzLnN0YXJ0LCB0aGlzLmVuZCwgdGhpcy5wYXlsb2FkLCB0aGlzLm5leHQpOwp9CgovLy8gQSBoYXNoIHRhYmxlIGZvciB0cmlwbGVzOgovLy8gKGxpc3Qgb2YgYnl0ZXMsIHN0YXJ0LCBlbmQpIC0tPiBjYW5vbmljYWxpemVkIHN0cmluZwovLy8gVXNpbmcgdHJpcGxlcyBhdm9pZHMgYWxsb2NhdGluZyBzdHJpbmcgc2xpY2VzIGJlZm9yZSBjaGVja2luZyBpZiB0aGV5Ci8vLyBhcmUgY2Fub25pY2FsLgovLy8KLy8vIEdpdmVzIGFib3V0IDMlIHNwZWVkdXAgb24gZGFydDJqcy4KY2xhc3MgU3RyaW5nQ2Fub25pY2FsaXplciB7CiAgLy8vIE1hc2sgYXdheSB0b3AgYml0cyB0byBrZWVwIGhhc2ggY2FsY3VsYXRpb24gd2l0aGluIDMyLWJpdCBTTUkgcmFuZ2UuCiAgc3RhdGljIGNvbnN0IGludCBNQVNLID0gMTYgKiAxMDI0ICogMTAyNCAtIDE7CgogIHN0YXRpYyBjb25zdCBpbnQgSU5JVElBTF9TSVpFID0gOCAqIDEwMjQ7CgogIC8vLyBMaW5lYXIgc2l6ZSBvZiBhIGhhc2ggdGFibGUuCiAgaW50IF9zaXplID0gSU5JVElBTF9TSVpFOwoKICAvLy8gSXRlbXMgaW4gYSBoYXNoIHRhYmxlLgogIGludCBfY291bnQgPSAwOwoKICAvLy8gVGhlIHRhYmxlIGl0c2VsZi4KICBMaXN0PE5vZGU+IF9ub2RlcyA9IG5ldyBMaXN0PE5vZGU+KElOSVRJQUxfU0laRSk7CgogIHN0YXRpYyBTdHJpbmcgZGVjb2RlKExpc3Q8aW50PiBkYXRhLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgYXNjaWlPbmx5KSB7CiAgICB2YXIgczsKICAgIGlmIChhc2NpaU9ubHkpIHsKICAgICAgcyA9IG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhkYXRhLCBzdGFydCwgZW5kKTsKICAgIH0gZWxzZSB7CiAgICAgIHMgPSBuZXcgVXRmOERlY29kZXIoYWxsb3dNYWxmb3JtZWQ6IHRydWUpLmNvbnZlcnQoZGF0YSwgc3RhcnQsIGVuZCk7CiAgICB9CiAgICByZXR1cm4gczsKICB9CgogIHN0YXRpYyBpbnQgaGFzaEJ5dGVzKExpc3Q8aW50PiBkYXRhLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIGludCBoID0gNTM4MTsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIGggPSAoKGggPDwgNSkgKyBoICsgZGF0YVtpXSkgJiBNQVNLOwogICAgfQogICAgcmV0dXJuIGg7CiAgfQoKICBzdGF0aWMgaW50IGhhc2hTdHJpbmcoU3RyaW5nIGRhdGEsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgaW50IGggPSA1MzgxOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgaCA9ICgoaCA8PCA1KSArIGggKyBkYXRhLmNvZGVVbml0QXQoaSkpICYgTUFTSzsKICAgIH0KICAgIHJldHVybiBoOwogIH0KCiAgcmVoYXNoKCkgewogICAgdmFyIG5ld1NpemUgPSBfc2l6ZSAqIDI7CiAgICB2YXIgbmV3Tm9kZXMgPSBuZXcgTGlzdDxOb2RlPihuZXdTaXplKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3NpemU7IGkrKykgewogICAgICBOb2RlIHQgPSBfbm9kZXNbaV07CiAgICAgIHdoaWxlICh0ICE9IG51bGwpIHsKICAgICAgICBOb2RlIG4gPSB0Lm5leHQ7CiAgICAgICAgaW50IG5ld0luZGV4ID0gdC5kYXRhIGlzIFN0cmluZwogICAgICAgICAgICA/IGhhc2hTdHJpbmcodC5kYXRhLCB0LnN0YXJ0LCB0LmVuZCkgJiAobmV3U2l6ZSAtIDEpCiAgICAgICAgICAgIDogaGFzaEJ5dGVzKHQuZGF0YSwgdC5zdGFydCwgdC5lbmQpICYgKG5ld1NpemUgLSAxKTsKICAgICAgICBOb2RlIHMgPSBuZXdOb2Rlc1tuZXdJbmRleF07CiAgICAgICAgdC5uZXh0ID0gczsKICAgICAgICBuZXdOb2Rlc1tuZXdJbmRleF0gPSB0OwogICAgICAgIHQgPSBuOwogICAgICB9CiAgICB9CiAgICBfc2l6ZSA9IG5ld1NpemU7CiAgICBfbm9kZXMgPSBuZXdOb2RlczsKICB9CgogIFN0cmluZyBjYW5vbmljYWxpemUoZGF0YSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGFzY2lpT25seSkgewogICAgaWYgKF9jb3VudCA+IF9zaXplKSByZWhhc2goKTsKICAgIGludCBpbmRleCA9IGRhdGEgaXMgU3RyaW5nCiAgICAgICAgPyBoYXNoU3RyaW5nKGRhdGEsIHN0YXJ0LCBlbmQpCiAgICAgICAgOiBoYXNoQnl0ZXMoZGF0YSwgc3RhcnQsIGVuZCk7CiAgICBpbmRleCA9IGluZGV4ICYgKF9zaXplIC0gMSk7CiAgICBOb2RlIHMgPSBfbm9kZXNbaW5kZXhdOwogICAgTm9kZSB0ID0gczsKICAgIGludCBsZW4gPSBlbmQgLSBzdGFydDsKICAgIHdoaWxlICh0ICE9IG51bGwpIHsKICAgICAgaWYgKHQuZW5kIC0gdC5zdGFydCA9PSBsZW4pIHsKICAgICAgICBpbnQgaSA9IHN0YXJ0LCBqID0gdC5zdGFydDsKICAgICAgICB3aGlsZSAoaSA8IGVuZCAmJiBkYXRhW2ldID09IHQuZGF0YVtqXSkgewogICAgICAgICAgaSsrOwogICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBpZiAoaSA9PSBlbmQpIHsKICAgICAgICAgIHJldHVybiB0LnBheWxvYWQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIHQgPSB0Lm5leHQ7CiAgICB9CiAgICBTdHJpbmcgcGF5bG9hZDsKICAgIGlmIChkYXRhIGlzIFN0cmluZykKICAgICAgcGF5bG9hZCA9IGRhdGEuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwogICAgZWxzZQogICAgICBwYXlsb2FkID0gZGVjb2RlKGRhdGEsIHN0YXJ0LCBlbmQsIGFzY2lpT25seSk7CiAgICBfbm9kZXNbaW5kZXhdID0gbmV3IE5vZGUoZGF0YSwgc3RhcnQsIGVuZCwgcGF5bG9hZCwgcyk7CiAgICBfY291bnQrKzsKICAgIHJldHVybiBwYXlsb2FkOwogIH0KCiAgY2xlYXIoKSB7CiAgICBfc2l6ZSA9IElOSVRJQUxfU0laRTsKICAgIF9ub2RlcyA9IG5ldyBMaXN0PE5vZGU+KF9zaXplKTsKICAgIF9jb3VudCA9IDA7CiAgfQp9CnwATk48ASwBFwENJQ0LEg1CAgEeOUoTBCccSzABLAEjHAEdEgEYNAFNCxU2DUsGDgQBPRIoKwYOBAE7Eig2Bg4EAQ0dLCYaGhkoQUElFCAPCAYVFwQBQiIfJychHBAbGCQkMg8PChgcCggSBhQYLAk1PA4UBAEMGiQQBAIBPXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zY2FubmVyL3N0cmluZ19jYW5vbmljYWxpemVyLmRhcnQ5c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Jhc2Uvc3ludGFjdGljX2VudGl0eS5kYXJ0gxcvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLyoqCiAqIEludGVyZmFjZSByZXByZXNlbnRpbmcgYSBzeW50YWN0aWMgZW50aXR5IChlaXRoZXIgYSB0b2tlbiBvciBhbiBBU1Qgbm9kZSkKICogd2hpY2ggaGFzIGEgbG9jYXRpb24gYW5kIGV4dGVudCBpbiB0aGUgc291cmNlIGZpbGUuCiAqLwphYnN0cmFjdCBjbGFzcyBTeW50YWN0aWNFbnRpdHkgewogIC8qKgogICAqIFJldHVybiB0aGUgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSB0byB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZQogICAqIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBzeW50YWN0aWMgZW50aXR5LgogICAqLwogIGludCBnZXQgZW5kOwoKICAvKioKICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBzeW50YWN0aWMgZW50aXR5J3Mgc291cmNlIHJhbmdlLgogICAqLwogIGludCBnZXQgbGVuZ3RoOwoKICAvKioKICAgKiBSZXR1cm4gdGhlIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBpbgogICAqIHRoZSBzeW50YWN0aWMgZW50aXR5LgogICAqLwogIGludCBnZXQgb2Zmc2V0Owp9ChwATk48AQRNNwQhBlEtBg8BBk0GEgEGUBsGEgIBMHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9iYXNlL3N5bnRhY3RpY19lbnRpdHkuZGFydDxzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvc2Nhbm5lci9zdHJpbmdfdXRpbGl0aWVzLmRhcnSBgC8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2ludGVybmVyLmRhcnQnOwoKY2xhc3MgU3RyaW5nVXRpbGl0aWVzIHsKICBzdGF0aWMgSW50ZXJuZXIgSU5URVJORVIgPSBuZXcgTnVsbEludGVybmVyKCk7CgogIHN0YXRpYyBTdHJpbmcgaW50ZXJuKFN0cmluZyBzdHJpbmcpID0+IElOVEVSTkVSLmludGVybihzdHJpbmcpOwp9Cg0ATk48ARgBGDEBQgIBM3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9zY2FubmVyL3N0cmluZ191dGlsaXRpZXMuZGFydD1zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYmxhY2tsaXN0ZWRfY2xhc3Nlcy5kYXJ0gYkvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gTGlzdCBvZiBzcGVjaWFsIGNsYXNzZXMgaW4gZGFydDpjb3JlIHRoYXQgY2FuJ3QgYmUgc3ViY2xhc3NlZC4KY29uc3QgTGlzdDxTdHJpbmc+IGJsYWNrbGlzdGVkQ29yZUNsYXNzZXMgPSBbCiAgImJvb2wiLAogICJpbnQiLAogICJudW0iLAogICJkb3VibGUiLAogICJTdHJpbmciLAogICJOdWxsIgpdOwoPAE5OPAFCLgoJCQwMCQMBNHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9ibGFja2xpc3RlZF9jbGFzc2VzLmRhcnQ/c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfYnVpbGRlci5kYXJ0i5EvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5rZXJuZWxfYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQ29tYmluYXRvciwKICAgICAgICBDb25zdHJ1Y3RvciwKICAgICAgICBJbml0aWFsaXplciwKICAgICAgICBQcm9jZWR1cmUsCiAgICAgICAgUmVkaXJlY3RpbmdJbml0aWFsaXplcjsKCmltcG9ydCAnLi4vY29tYmluYXRvci5kYXJ0JyBhcyBmYXN0YTsKCmV4cG9ydCAnLi4vYnVpbGRlci9idWlsZGVyLmRhcnQnOwoKZXhwb3J0ICdjbGFzc19oaWVyYXJjaHlfYnVpbGRlci5kYXJ0JyBzaG93IENsYXNzSGllcmFyY2h5QnVpbGRlcjsKCmV4cG9ydCAnaW1wbGljaXRfZmllbGRfdHlwZS5kYXJ0JyBzaG93IEltcGxpY2l0RmllbGRUeXBlOwoKZXhwb3J0ICdrZXJuZWxfY2xhc3NfYnVpbGRlci5kYXJ0JyBzaG93IEtlcm5lbENsYXNzQnVpbGRlcjsKCmV4cG9ydCAna2VybmVsX2VudW1fYnVpbGRlci5kYXJ0JyBzaG93IEtlcm5lbEVudW1CdWlsZGVyOwoKZXhwb3J0ICdrZXJuZWxfZmllbGRfYnVpbGRlci5kYXJ0JyBzaG93IEtlcm5lbEZpZWxkQnVpbGRlcjsKCmV4cG9ydCAna2VybmVsX2Zvcm1hbF9wYXJhbWV0ZXJfYnVpbGRlci5kYXJ0JyBzaG93IEtlcm5lbEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI7CgpleHBvcnQgJ2tlcm5lbF9mdW5jdGlvbl90eXBlX2J1aWxkZXIuZGFydCcgc2hvdyBLZXJuZWxGdW5jdGlvblR5cGVCdWlsZGVyOwoKZXhwb3J0ICdrZXJuZWxfaW52YWxpZF90eXBlX2J1aWxkZXIuZGFydCcgc2hvdyBLZXJuZWxJbnZhbGlkVHlwZUJ1aWxkZXI7CgpleHBvcnQgJ2tlcm5lbF9saWJyYXJ5X2J1aWxkZXIuZGFydCcgc2hvdyBLZXJuZWxMaWJyYXJ5QnVpbGRlcjsKCmV4cG9ydCAna2VybmVsX21peGluX2FwcGxpY2F0aW9uX2J1aWxkZXIuZGFydCcKICAgIHNob3cgS2VybmVsTWl4aW5BcHBsaWNhdGlvbkJ1aWxkZXI7CgpleHBvcnQgJ2tlcm5lbF9uYW1lZF90eXBlX2J1aWxkZXIuZGFydCcgc2hvdyBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyOwoKZXhwb3J0ICdrZXJuZWxfcHJlZml4X2J1aWxkZXIuZGFydCcgc2hvdyBLZXJuZWxQcmVmaXhCdWlsZGVyOwoKZXhwb3J0ICdrZXJuZWxfcHJvY2VkdXJlX2J1aWxkZXIuZGFydCcKICAgIHNob3cKICAgICAgICBLZXJuZWxDb25zdHJ1Y3RvckJ1aWxkZXIsCiAgICAgICAgS2VybmVsRnVuY3Rpb25CdWlsZGVyLAogICAgICAgIEtlcm5lbFJlZGlyZWN0aW5nRmFjdG9yeUJ1aWxkZXIsCiAgICAgICAgS2VybmVsUHJvY2VkdXJlQnVpbGRlcjsKCmV4cG9ydCAna2VybmVsX3R5cGVfYWxpYXNfYnVpbGRlci5kYXJ0JyBzaG93IEtlcm5lbFR5cGVBbGlhc0J1aWxkZXI7CgpleHBvcnQgJ2tlcm5lbF90eXBlX2J1aWxkZXIuZGFydCcgc2hvdyBLZXJuZWxUeXBlQnVpbGRlcjsKCmV4cG9ydCAna2VybmVsX3R5cGVfdmFyaWFibGVfYnVpbGRlci5kYXJ0JyBzaG93IEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXI7CgpleHBvcnQgJ2tlcm5lbF92YXJpYWJsZV9idWlsZGVyLmRhcnQnIHNob3cgS2VybmVsVmFyaWFibGVCdWlsZGVyOwoKZXhwb3J0ICdsb2FkX2xpYnJhcnlfYnVpbGRlci5kYXJ0JyBzaG93IExvYWRMaWJyYXJ5QnVpbGRlcjsKCmV4cG9ydCAndW5saW5rZWRfc2NvcGUuZGFydCcgc2hvdyBVbmxpbmtlZERlY2xhcmF0aW9uOwoKaW50IGNvbXBhcmVQcm9jZWR1cmVzKFByb2NlZHVyZSBhLCBQcm9jZWR1cmUgYikgewogIGludCBpID0gIiR7YS5maWxlVXJpfSIuY29tcGFyZVRvKCIke2IuZmlsZVVyaX0iKTsKICBpZiAoaSAhPSAwKSByZXR1cm4gaTsKICByZXR1cm4gYS5maWxlT2Zmc2V0LmNvbXBhcmVUbyhiLmZpbGVPZmZzZXQpOwp9Cgpib29sIGlzUmVkaXJlY3RpbmdHZW5lcmF0aXZlQ29uc3RydWN0b3JJbXBsZW1lbnRhdGlvbihDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcikgewogIExpc3Q8SW5pdGlhbGl6ZXI+IGluaXRpYWxpemVycyA9IGNvbnN0cnVjdG9yLmluaXRpYWxpemVyczsKICByZXR1cm4gaW5pdGlhbGl6ZXJzLmxlbmd0aCA9PSAxICYmCiAgICAgIGluaXRpYWxpemVycy5zaW5nbGUgaXMgUmVkaXJlY3RpbmdJbml0aWFsaXplcjsKfQoKTGlzdDxDb21iaW5hdG9yPiB0b0tlcm5lbENvbWJpbmF0b3JzKExpc3Q8ZmFzdGEuQ29tYmluYXRvcj4gZmFzdGFDb21iaW5hdG9ycykgewogIGlmIChmYXN0YUNvbWJpbmF0b3JzID09IG51bGwpIHsKICAgIC8vIE5vdGU6IGl0J3Mgc2FmZSB0byByZXR1cm4gbnVsbCBoZXJlIGFzIEtlcm5lbCdzIExpYnJhcnlEZXBlbmRlbmN5IHdpbGwKICAgIC8vIGNvbnZlcnQgbnVsbCB0byBhbiBlbXB0eSBsaXN0LgogICAgcmV0dXJuIG51bGw7CiAgfQoKICBMaXN0PENvbWJpbmF0b3I+IHJlc3VsdCA9IG5ldyBMaXN0PENvbWJpbmF0b3I+LmZpbGxlZCgKICAgICAgZmFzdGFDb21iaW5hdG9ycy5sZW5ndGgsIG51bGwsCiAgICAgIGdyb3dhYmxlOiB0cnVlKTsKICBmb3IgKGludCBpID0gMDsgaSA8IGZhc3RhQ29tYmluYXRvcnMubGVuZ3RoOyBpKyspIHsKICAgIGZhc3RhLkNvbWJpbmF0b3IgY29tYmluYXRvciA9IGZhc3RhQ29tYmluYXRvcnNbaV07CiAgICBMaXN0PFN0cmluZz4gbmFtZUxpc3QgPSBjb21iaW5hdG9yLm5hbWVzLnRvTGlzdCgpOwogICAgcmVzdWx0W2ldID0gY29tYmluYXRvci5pc1Nob3cKICAgICAgICA/IG5ldyBDb21iaW5hdG9yLnNob3cobmFtZUxpc3QpCiAgICAgICAgOiBuZXcgQ29tYmluYXRvci5oaWRlKG5hbWVMaXN0KTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQpfAE5OPAEeASEJFBUVEyABJgEiAUIBOgE8AToBPAFRAUsBSQFAAS8oAUUBPgEnCSIfKSABRQE6AUsBQgE8ATcBMjQYLwIBUT0lNQIBUCJOJhEEATklFzY3NyIoKQQRAgE2cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfYnVpbGRlci5kYXJ0P3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS90YXJnZXRfaW1wbGVtZW50YXRpb24uZGFydJhmLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEudGFyZ2V0X2ltcGxlbWVudGF0aW9uOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBTb3VyY2U7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3RhcmdldC90YXJnZXRzLmRhcnQnIGFzIGJhY2tlbmQgc2hvdyBUYXJnZXQ7CgppbXBvcnQgJy4uL2Jhc2UvcHJvY2Vzc2VkX29wdGlvbnMuZGFydCcgc2hvdyBQcm9jZXNzZWRPcHRpb25zOwoKaW1wb3J0ICdidWlsZGVyL2J1aWxkZXIuZGFydCcgc2hvdyBEZWNsYXJhdGlvbiwgQ2xhc3NCdWlsZGVyLCBMaWJyYXJ5QnVpbGRlcjsKCmltcG9ydCAnY29tcGlsZXJfY29udGV4dC5kYXJ0JyBzaG93IENvbXBpbGVyQ29udGV4dDsKCmltcG9ydCAnbG9hZGVyLmRhcnQnIHNob3cgTG9hZGVyOwoKaW1wb3J0ICdtZXNzYWdlcy5kYXJ0JyBzaG93IEZvcm1hdHRlZE1lc3NhZ2UsIExvY2F0ZWRNZXNzYWdlLCBNZXNzYWdlOwoKaW1wb3J0ICdyZXdyaXRlX3NldmVyaXR5LmRhcnQnIHNob3cgcmV3cml0ZVNldmVyaXR5OwoKaW1wb3J0ICdzZXZlcml0eS5kYXJ0JyBzaG93IFNldmVyaXR5OwoKaW1wb3J0ICd0YXJnZXQuZGFydCcgc2hvdyBUYXJnZXQ7CgppbXBvcnQgJ3RpY2tlci5kYXJ0JyBzaG93IFRpY2tlcjsKCmltcG9ydCAndXJpX3RyYW5zbGF0b3IuZGFydCcgc2hvdyBVcmlUcmFuc2xhdG9yOwoKaW1wb3J0ICcuLi9hcGlfcHJvdG90eXBlL2V4cGVyaW1lbnRhbF9mbGFncy5kYXJ0JyBzaG93IEV4cGVyaW1lbnRhbEZsYWc7CgovLy8gUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgdXNlZCBieSBhIGxvYWRlciBmb3IgYSB0YXJnZXQuCmFic3RyYWN0IGNsYXNzIFRhcmdldEltcGxlbWVudGF0aW9uIGV4dGVuZHMgVGFyZ2V0IHsKICBmaW5hbCBVcmlUcmFuc2xhdG9yIHVyaVRyYW5zbGF0b3I7CgogIGZpbmFsIGJhY2tlbmQuVGFyZ2V0IGJhY2tlbmRUYXJnZXQ7CgogIGZpbmFsIENvbXBpbGVyQ29udGV4dCBjb250ZXh0ID0gQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQ7CgogIC8vLyBTaGFyZWQgd2l0aCBbQ29tcGlsZXJDb250ZXh0XS4KICBmaW5hbCBNYXA8VXJpLCBTb3VyY2U+IHVyaVRvU291cmNlID0gQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQudXJpVG9Tb3VyY2U7CgogIERlY2xhcmF0aW9uIGNhY2hlZEFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3I7CiAgRGVjbGFyYXRpb24gY2FjaGVkQ29tcGlsZVRpbWVFcnJvcjsKICBEZWNsYXJhdGlvbiBjYWNoZWREdXBsaWNhdGVkRmllbGRJbml0aWFsaXplckVycm9yOwogIERlY2xhcmF0aW9uIGNhY2hlZEZhbGxUaHJvdWdoRXJyb3I7CiAgRGVjbGFyYXRpb24gY2FjaGVkTmF0aXZlQW5ub3RhdGlvbjsKICBEZWNsYXJhdGlvbiBjYWNoZWROYXRpdmVFeHRlbnNpb25Bbm5vdGF0aW9uOwoKICBib29sIGVuYWJsZUNvbnN0YW50VXBkYXRlMjAxODsKICBib29sIGVuYWJsZUNvbnRyb2xGbG93Q29sbGVjdGlvbnM7CiAgYm9vbCBlbmFibGVTZXRMaXRlcmFsczsKICBib29sIGVuYWJsZVNwcmVhZENvbGxlY3Rpb25zOwoKICBUYXJnZXRJbXBsZW1lbnRhdGlvbihUaWNrZXIgdGlja2VyLCB0aGlzLnVyaVRyYW5zbGF0b3IsIHRoaXMuYmFja2VuZFRhcmdldCkKICAgICAgOiBlbmFibGVDb25zdGFudFVwZGF0ZTIwMTggPSBDb21waWxlckNvbnRleHQuY3VycmVudC5vcHRpb25zCiAgICAgICAgICAgIC5pc0V4cGVyaW1lbnRFbmFibGVkKEV4cGVyaW1lbnRhbEZsYWcuY29uc3RhbnRVcGRhdGUyMDE4KSwKICAgICAgICBlbmFibGVDb250cm9sRmxvd0NvbGxlY3Rpb25zID0gQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQub3B0aW9ucwogICAgICAgICAgICAuaXNFeHBlcmltZW50RW5hYmxlZChFeHBlcmltZW50YWxGbGFnLmNvbnRyb2xGbG93Q29sbGVjdGlvbnMpLAogICAgICAgIGVuYWJsZVNldExpdGVyYWxzID0gQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQub3B0aW9ucwogICAgICAgICAgICAuaXNFeHBlcmltZW50RW5hYmxlZChFeHBlcmltZW50YWxGbGFnLnNldExpdGVyYWxzKSwKICAgICAgICBlbmFibGVTcHJlYWRDb2xsZWN0aW9ucyA9IENvbXBpbGVyQ29udGV4dC5jdXJyZW50Lm9wdGlvbnMKICAgICAgICAgICAgLmlzRXhwZXJpbWVudEVuYWJsZWQoRXhwZXJpbWVudGFsRmxhZy5zcHJlYWRDb2xsZWN0aW9ucyksCiAgICAgICAgc3VwZXIodGlja2VyKTsKCiAgLy8vIENyZWF0ZXMgYSBbTGlicmFyeUJ1aWxkZXJdIGNvcnJlc3BvbmRpbmcgdG8gW3VyaV0sIGlmIG9uZSBkb2Vzbid0IGV4aXN0CiAgLy8vIGFscmVhZHkuCiAgLy8vCiAgLy8vIFtmaWxlVXJpXSBtdXN0IG5vdCBiZSBudWxsIGFuZCBpcyBhIFVSSSB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gRmlsZVN5c3RlbQogIC8vLyB0byBsb2NhdGUgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZS4KICAvLy8KICAvLy8gW29yaWdpbl0gaXMgbm9uLW51bGwgaWYgdGhlIGNyZWF0ZWQgbGlicmFyeSBpcyBhIHBhdGNoIHRvIFtvcmlnaW5dLgogIExpYnJhcnlCdWlsZGVyIGNyZWF0ZUxpYnJhcnlCdWlsZGVyKAogICAgICBVcmkgdXJpLCBVcmkgZmlsZVVyaSwgY292YXJpYW50IExpYnJhcnlCdWlsZGVyIG9yaWdpbik7CgogIC8vLyBUaGUgY2xhc3MgW2Nsc10gaXMgaW52b2x2ZWQgaW4gYSBjeWNsaWMgZGVmaW5pdGlvbi4gVGhpcyBtZXRob2Qgc2hvdWxkCiAgLy8vIGVuc3VyZSB0aGF0IHRoZSBjeWNsZSBpcyBicm9rZW4sIGZvciBleGFtcGxlLCBieSByZW1vdmluZyBzdXBlcmNsYXNzIGFuZAogIC8vLyBpbXBsZW1lbnRlZCBpbnRlcmZhY2VzLgogIHZvaWQgYnJlYWtDeWNsZShDbGFzc0J1aWxkZXIgY2xzKTsKCiAgVXJpIHRyYW5zbGF0ZVVyaShVcmkgdXJpKSA9PiB1cmlUcmFuc2xhdG9yLnRyYW5zbGF0ZSh1cmkpOwoKICAvLy8gUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgY29uc3RydWN0b3Igb2YKICAvLy8gW0Fic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3JdIGVycm9yLiAgVGhlIGNvbnN0cnVjdG9yIGlzIGV4cGVjdGVkIHRvCiAgLy8vIGFjY2VwdCBhIHNpbmdsZSBhcmd1bWVudCBvZiB0eXBlIFN0cmluZywgd2hpY2ggaXMgdGhlIG5hbWUgb2YgdGhlCiAgLy8vIGFic3RyYWN0IGNsYXNzLgogIERlY2xhcmF0aW9uIGdldEFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3IoTG9hZGVyIGxvYWRlcikgewogICAgaWYgKGNhY2hlZEFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3IgIT0gbnVsbCkgewogICAgICByZXR1cm4gY2FjaGVkQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25FcnJvcjsKICAgIH0KICAgIHJldHVybiBjYWNoZWRBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yID0KICAgICAgICBsb2FkZXIuY29yZUxpYnJhcnkuZ2V0Q29uc3RydWN0b3IoIkFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3IiKTsKICB9CgogIC8vLyBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBjb25zdHJ1Y3RvciB1c2VkIGZvciBjcmVhdGluZyBhIGNvbXBpbGUtdGltZQogIC8vLyBlcnJvci4gVGhlIGNvbnN0cnVjdG9yIGlzIGV4cGVjdGVkIHRvIGFjY2VwdCBhIHNpbmdsZSBhcmd1bWVudCBvZiB0eXBlCiAgLy8vIFN0cmluZywgd2hpY2ggaXMgdGhlIGNvbXBpbGUtdGltZSBlcnJvciBtZXNzYWdlLgogIERlY2xhcmF0aW9uIGdldENvbXBpbGVUaW1lRXJyb3IoTG9hZGVyIGxvYWRlcikgewogICAgaWYgKGNhY2hlZENvbXBpbGVUaW1lRXJyb3IgIT0gbnVsbCkgcmV0dXJuIGNhY2hlZENvbXBpbGVUaW1lRXJyb3I7CiAgICByZXR1cm4gY2FjaGVkQ29tcGlsZVRpbWVFcnJvciA9IGxvYWRlci5jb3JlTGlicmFyeQogICAgICAgIC5nZXRDb25zdHJ1Y3RvcigiX0NvbXBpbGVUaW1lRXJyb3IiLCBieXBhc3NMaWJyYXJ5UHJpdmFjeTogdHJ1ZSk7CiAgfQoKICAvLy8gUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgY29uc3RydWN0b3IgdXNlZCBmb3IgY3JlYXRpbmcgYSBydW50aW1lIGVycm9yCiAgLy8vIHdoZW4gYSBmaW5hbCBmaWVsZCBpcyBpbml0aWFsaXplZCB0d2ljZS4gVGhlIGNvbnN0cnVjdG9yIGlzIGV4cGVjdGVkIHRvCiAgLy8vIGFjY2VwdCBhIHNpbmdsZSBhcmd1bWVudCB3aGljaCBpcyB0aGUgbmFtZSBvZiB0aGUgZmllbGQuCiAgRGVjbGFyYXRpb24gZ2V0RHVwbGljYXRlZEZpZWxkSW5pdGlhbGl6ZXJFcnJvcihMb2FkZXIgbG9hZGVyKSB7CiAgICBpZiAoY2FjaGVkRHVwbGljYXRlZEZpZWxkSW5pdGlhbGl6ZXJFcnJvciAhPSBudWxsKSB7CiAgICAgIHJldHVybiBjYWNoZWREdXBsaWNhdGVkRmllbGRJbml0aWFsaXplckVycm9yOwogICAgfQogICAgcmV0dXJuIGNhY2hlZER1cGxpY2F0ZWRGaWVsZEluaXRpYWxpemVyRXJyb3IgPSBsb2FkZXIuY29yZUxpYnJhcnkKICAgICAgICAuZ2V0Q29uc3RydWN0b3IoIl9EdXBsaWNhdGVkRmllbGRJbml0aWFsaXplckVycm9yIiwKICAgICAgICAgICAgYnlwYXNzTGlicmFyeVByaXZhY3k6IHRydWUpOwogIH0KCiAgLy8vIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGNvbnN0cnVjdG9yIHVzZWQgZm9yIGNyZWF0aW5nIGBuYXRpdmVgCiAgLy8vIGFubm90YXRpb25zLiBUaGUgY29uc3RydWN0b3IgaXMgZXhwZWN0ZWQgdG8gYWNjZXB0IGEgc2luZ2xlIGFyZ3VtZW50IG9mCiAgLy8vIHR5cGUgU3RyaW5nLCB3aGljaCBpcyB0aGUgbmFtZSBvZiB0aGUgbmF0aXZlIG1ldGhvZC4KICBEZWNsYXJhdGlvbiBnZXROYXRpdmVBbm5vdGF0aW9uKExvYWRlciBsb2FkZXIpIHsKICAgIGlmIChjYWNoZWROYXRpdmVBbm5vdGF0aW9uICE9IG51bGwpIHJldHVybiBjYWNoZWROYXRpdmVBbm5vdGF0aW9uOwogICAgTGlicmFyeUJ1aWxkZXIgaW50ZXJuYWwgPSBsb2FkZXIucmVhZChVcmkucGFyc2UoImRhcnQ6X2ludGVybmFsIiksIC0xLAogICAgICAgIGFjY2Vzc29yOiBsb2FkZXIuY29yZUxpYnJhcnkpOwogICAgcmV0dXJuIGNhY2hlZE5hdGl2ZUFubm90YXRpb24gPSBpbnRlcm5hbC5nZXRDb25zdHJ1Y3RvcigiRXh0ZXJuYWxOYW1lIik7CiAgfQoKICB2b2lkIGxvYWRFeHRyYVJlcXVpcmVkTGlicmFyaWVzKExvYWRlciBsb2FkZXIpIHsKICAgIGZvciAoU3RyaW5nIHVyaSBpbiBiYWNrZW5kVGFyZ2V0LmV4dHJhUmVxdWlyZWRMaWJyYXJpZXMpIHsKICAgICAgbG9hZGVyLnJlYWQoVXJpLnBhcnNlKHVyaSksIDAsIGFjY2Vzc29yOiBsb2FkZXIuY29yZUxpYnJhcnkpOwogICAgfQogIH0KCiAgdm9pZCBhZGRTb3VyY2VJbmZvcm1hdGlvbigKICAgICAgVXJpIGltcG9ydFVyaSwgVXJpIGZpbGVVcmksIExpc3Q8aW50PiBsaW5lU3RhcnRzLCBMaXN0PGludD4gc291cmNlQ29kZSk7CgogIHZvaWQgcmVhZFBhdGNoRmlsZXMoY292YXJpYW50IExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHt9CgogIEZvcm1hdHRlZE1lc3NhZ2UgY3JlYXRlRm9ybWF0dGVkTWVzc2FnZSgKICAgICAgTWVzc2FnZSBtZXNzYWdlLAogICAgICBpbnQgY2hhck9mZnNldCwKICAgICAgaW50IGxlbmd0aCwKICAgICAgVXJpIGZpbGVVcmksCiAgICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IG1lc3NhZ2VDb250ZXh0LAogICAgICBTZXZlcml0eSBzZXZlcml0eSkgewogICAgUHJvY2Vzc2VkT3B0aW9ucyBwcm9jZXNzZWRPcHRpb25zID0gY29udGV4dC5vcHRpb25zOwogICAgcmV0dXJuIHByb2Nlc3NlZE9wdGlvbnMuZm9ybWF0KAogICAgICAgIG1lc3NhZ2Uud2l0aExvY2F0aW9uKGZpbGVVcmksIGNoYXJPZmZzZXQsIGxlbmd0aCksCiAgICAgICAgc2V2ZXJpdHksCiAgICAgICAgbWVzc2FnZUNvbnRleHQpOwogIH0KCiAgU2V2ZXJpdHkgZml4U2V2ZXJpdHkoU2V2ZXJpdHkgc2V2ZXJpdHksIE1lc3NhZ2UgbWVzc2FnZSwgVXJpIGZpbGVVcmkpIHsKICAgIHNldmVyaXR5ID8/PSBtZXNzYWdlLmNvZGUuc2V2ZXJpdHk7CiAgICBpZiAoc2V2ZXJpdHkgPT0gU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nKSB7CiAgICAgIHNldmVyaXR5ID0gYmFja2VuZFRhcmdldC5sZWdhY3lNb2RlID8gU2V2ZXJpdHkud2FybmluZyA6IFNldmVyaXR5LmVycm9yOwogICAgfQogICAgcmV0dXJuIHJld3JpdGVTZXZlcml0eShzZXZlcml0eSwgbWVzc2FnZS5jb2RlLCBmaWxlVXJpKTsKICB9Cn0KgKEATk48ASUBLgFEAT8BTgE1ASIBRwE1ASYBIgEiATEBSQFHNSUBJgE7ASVMATUmNSYmLwEhJRogAU5DR0dLPEBCRhcBTg8GTygGSic+AU1PHiUBPQEwT0gWQjk0BjNOBAFOTTczRzdKBAFPTj9COTQGRjwpBAFITjszR0snTQQBMz9EBgQBHU8BOwErFxYSEysbOSQ7EhkEAUooM08GPQQCATZwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdGFyZ2V0X2ltcGxlbWVudGF0aW9uLmRhcnRDc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2RpbGwvZGlsbF9saWJyYXJ5X2J1aWxkZXIuZGFydJ08Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuZGlsbF9saWJyYXJ5X2J1aWxkZXI7CgppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBqc29uRGVjb2RlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBDbGFzcywKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEeW5hbWljVHlwZSwKICAgICAgICBGaWVsZCwKICAgICAgICBGdW5jdGlvblR5cGUsCiAgICAgICAgTGlicmFyeSwKICAgICAgICBMaXN0TGl0ZXJhbCwKICAgICAgICBNZW1iZXIsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFN0YXRpY0dldCwKICAgICAgICBTdHJpbmdMaXRlcmFsLAogICAgICAgIFR5cGVkZWY7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnCiAgICBzaG93CiAgICAgICAgTWVzc2FnZSwKICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbiwKICAgICAgICB0ZW1wbGF0ZVR5cGVOb3RGb3VuZCwKICAgICAgICB0ZW1wbGF0ZVVuc3BlY2lmaWVkOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IGludGVybmFsUHJvYmxlbSwgdW5oYW5kbGVkLCB1bmltcGxlbWVudGVkOwoKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX2J1aWxkZXIuZGFydCcKICAgIHNob3cKICAgICAgICBEZWNsYXJhdGlvbiwKICAgICAgICBEeW5hbWljVHlwZUJ1aWxkZXIsCiAgICAgICAgSW52YWxpZFR5cGVCdWlsZGVyLAogICAgICAgIEtlcm5lbEludmFsaWRUeXBlQnVpbGRlciwKICAgICAgICBLZXJuZWxUeXBlQnVpbGRlciwKICAgICAgICBMaWJyYXJ5QnVpbGRlciwKICAgICAgICBTY29wZTsKCmltcG9ydCAnLi4va2VybmVsL3JlZGlyZWN0aW5nX2ZhY3RvcnlfYm9keS5kYXJ0JyBzaG93IFJlZGlyZWN0aW5nRmFjdG9yeUJvZHk7CgppbXBvcnQgJ2RpbGxfY2xhc3NfYnVpbGRlci5kYXJ0JyBzaG93IERpbGxDbGFzc0J1aWxkZXI7CgppbXBvcnQgJ2RpbGxfbWVtYmVyX2J1aWxkZXIuZGFydCcgc2hvdyBEaWxsTWVtYmVyQnVpbGRlcjsKCmltcG9ydCAnZGlsbF9sb2FkZXIuZGFydCcgc2hvdyBEaWxsTG9hZGVyOwoKaW1wb3J0ICdkaWxsX3R5cGVfYWxpYXNfYnVpbGRlci5kYXJ0JyBzaG93IERpbGxUeXBlQWxpYXNCdWlsZGVyOwoKY2xhc3MgRGlsbExpYnJhcnlCdWlsZGVyIGV4dGVuZHMgTGlicmFyeUJ1aWxkZXI8S2VybmVsVHlwZUJ1aWxkZXIsIExpYnJhcnk+IHsKICBmaW5hbCBMaWJyYXJ5IGxpYnJhcnk7CgogIERpbGxMb2FkZXIgbG9hZGVyOwoKICAvLy8gRXhwb3J0cyB0aGF0IGNhbid0IGJlIHNlcmlhbGl6ZWQuCiAgLy8vCiAgLy8vIFRoZSBlbGVtZW50cyBvZiB0aGlzIG1hcCBhcmUgZG9jdW1lbnRlZCBpbgogIC8vLyBbLi4va2VybmVsL2tlcm5lbF9saWJyYXJ5X2J1aWxkZXIuZGFydF0uCiAgTWFwPFN0cmluZywgU3RyaW5nPiB1bnNlcmlhbGl6YWJsZUV4cG9ydHM7CgogIERpbGxMaWJyYXJ5QnVpbGRlcih0aGlzLmxpYnJhcnksIHRoaXMubG9hZGVyKQogICAgICA6IHN1cGVyKGxpYnJhcnkuZmlsZVVyaSwgbmV3IFNjb3BlLnRvcCgpLCBuZXcgU2NvcGUudG9wKCkpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1N5bnRoZXRpYyA9PiBsaWJyYXJ5LmlzU3ludGhldGljOwoKICBVcmkgZ2V0IHVyaSA9PiBsaWJyYXJ5LmltcG9ydFVyaTsKCiAgVXJpIGdldCBmaWxlVXJpID0+IGxpYnJhcnkuZmlsZVVyaTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+IGxpYnJhcnkubmFtZTsKCiAgQG92ZXJyaWRlCiAgTGlicmFyeSBnZXQgdGFyZ2V0ID0+IGxpYnJhcnk7CgogIHZvaWQgYWRkU3ludGhldGljRGVjbGFyYXRpb25PZkR5bmFtaWMoKSB7CiAgICBhZGRCdWlsZGVyKAogICAgICAgICJkeW5hbWljIiwKICAgICAgICBuZXcgRHluYW1pY1R5cGVCdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyLCBEYXJ0VHlwZT4oCiAgICAgICAgICAgIGNvbnN0IER5bmFtaWNUeXBlKCksIHRoaXMsIC0xKSwKICAgICAgICAtMSk7CiAgfQoKICB2b2lkIGFkZENsYXNzKENsYXNzIGNscykgewogICAgRGlsbENsYXNzQnVpbGRlciBjbGFzc0J1bGRlciA9IG5ldyBEaWxsQ2xhc3NCdWlsZGVyKGNscywgdGhpcyk7CiAgICBhZGRCdWlsZGVyKGNscy5uYW1lLCBjbGFzc0J1bGRlciwgY2xzLmZpbGVPZmZzZXQpOwogICAgY2xzLnByb2NlZHVyZXMuZm9yRWFjaChjbGFzc0J1bGRlci5hZGRNZW1iZXIpOwogICAgY2xzLmNvbnN0cnVjdG9ycy5mb3JFYWNoKGNsYXNzQnVsZGVyLmFkZE1lbWJlcik7CiAgICBmb3IgKEZpZWxkIGZpZWxkIGluIGNscy5maWVsZHMpIHsKICAgICAgaWYgKGZpZWxkLm5hbWUubmFtZSA9PSAiX3JlZGlyZWN0aW5nIyIpIHsKICAgICAgICBMaXN0TGl0ZXJhbCBpbml0aWFsaXplciA9IGZpZWxkLmluaXRpYWxpemVyOwogICAgICAgIGZvciAoU3RhdGljR2V0IGdldCBpbiBpbml0aWFsaXplci5leHByZXNzaW9ucykgewogICAgICAgICAgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keS5yZXN0b3JlRnJvbURpbGwoZ2V0LnRhcmdldCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGNsYXNzQnVsZGVyLmFkZE1lbWJlcihmaWVsZCk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgYWRkTWVtYmVyKE1lbWJlciBtZW1iZXIpIHsKICAgIFN0cmluZyBuYW1lID0gbWVtYmVyLm5hbWUubmFtZTsKICAgIGlmIChuYW1lID09ICJfZXhwb3J0cyMiKSB7CiAgICAgIEZpZWxkIGZpZWxkID0gbWVtYmVyOwogICAgICBTdHJpbmdMaXRlcmFsIHN0cmluZyA9IGZpZWxkLmluaXRpYWxpemVyOwogICAgICB2YXIganNvbiA9IGpzb25EZWNvZGUoc3RyaW5nLnZhbHVlKTsKICAgICAgdW5zZXJpYWxpemFibGVFeHBvcnRzID0KICAgICAgICAgIGpzb24gIT0gbnVsbCA/IG5ldyBNYXA8U3RyaW5nLCBTdHJpbmc+LmZyb20oanNvbikgOiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgYWRkQnVpbGRlcihuYW1lLCBuZXcgRGlsbE1lbWJlckJ1aWxkZXIobWVtYmVyLCB0aGlzKSwgbWVtYmVyLmZpbGVPZmZzZXQpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgRGVjbGFyYXRpb24gYWRkQnVpbGRlcihTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIGludCBjaGFyT2Zmc2V0KSB7CiAgICBpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUuaXNFbXB0eSkgcmV0dXJuIG51bGw7CiAgICBib29sIGlzU2V0dGVyID0gZGVjbGFyYXRpb24uaXNTZXR0ZXI7CiAgICBpZiAoaXNTZXR0ZXIpIHsKICAgICAgc2NvcGVCdWlsZGVyLmFkZFNldHRlcihuYW1lLCBkZWNsYXJhdGlvbik7CiAgICB9IGVsc2UgewogICAgICBzY29wZUJ1aWxkZXIuYWRkTWVtYmVyKG5hbWUsIGRlY2xhcmF0aW9uKTsKICAgIH0KICAgIGlmICghbmFtZS5zdGFydHNXaXRoKCJfIikpIHsKICAgICAgaWYgKGlzU2V0dGVyKSB7CiAgICAgICAgZXhwb3J0U2NvcGVCdWlsZGVyLmFkZFNldHRlcihuYW1lLCBkZWNsYXJhdGlvbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZXhwb3J0U2NvcGVCdWlsZGVyLmFkZE1lbWJlcihuYW1lLCBkZWNsYXJhdGlvbik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkZWNsYXJhdGlvbjsKICB9CgogIHZvaWQgYWRkVHlwZWRlZihUeXBlZGVmIHR5cGVkZWYpIHsKICAgIERhcnRUeXBlIHR5cGUgPSB0eXBlZGVmLnR5cGU7CiAgICBpZiAodHlwZSBpcyBGdW5jdGlvblR5cGUgJiYgdHlwZS50eXBlZGVmVHlwZSA9PSBudWxsKSB7CiAgICAgIHVuaGFuZGxlZCgibnVsbCIsICJhZGRUeXBlZGVmIiwgdHlwZWRlZi5maWxlT2Zmc2V0LCB0eXBlZGVmLmZpbGVVcmkpOwogICAgfQogICAgYWRkQnVpbGRlcih0eXBlZGVmLm5hbWUsIG5ldyBEaWxsVHlwZUFsaWFzQnVpbGRlcih0eXBlZGVmLCB0aGlzKSwKICAgICAgICB0eXBlZGVmLmZpbGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRUb1Njb3BlKAogICAgICBTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gbWVtYmVyLCBpbnQgY2hhck9mZnNldCwgYm9vbCBpc0ltcG9ydCkgewogICAgdW5pbXBsZW1lbnRlZCgiYWRkVG9TY29wZSIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGVjbGFyYXRpb24gY29tcHV0ZUFtYmlndW91c0RlY2xhcmF0aW9uKAogICAgICBTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gYnVpbGRlciwgRGVjbGFyYXRpb24gb3RoZXIsIGludCBjaGFyT2Zmc2V0LAogICAgICB7Ym9vbCBpc0V4cG9ydDogZmFsc2UsIGJvb2wgaXNJbXBvcnQ6IGZhbHNlfSkgewogICAgaWYgKGJ1aWxkZXIgPT0gb3RoZXIpIHJldHVybiBidWlsZGVyOwogICAgaWYgKGJ1aWxkZXIgaXMgSW52YWxpZFR5cGVCdWlsZGVyKSByZXR1cm4gYnVpbGRlcjsKICAgIGlmIChvdGhlciBpcyBJbnZhbGlkVHlwZUJ1aWxkZXIpIHJldHVybiBvdGhlcjsKICAgIC8vIEZvciBlYWNoIGVudHJ5IG1hcHBpbmcga2V5IGBrYCB0byBkZWNsYXJhdGlvbiBgZGAgaW4gYE5TYCBhbiBlbnRyeQogICAgLy8gbWFwcGluZyBga2AgdG8gYGRgIGlzIGFkZGVkIHRvIHRoZSBleHBvcnRlZCBuYW1lc3BhY2Ugb2YgYExgIHVubGVzcyBhCiAgICAvLyB0b3AtbGV2ZWwgZGVjbGFyYXRpb24gd2l0aCB0aGUgbmFtZSBga2AgZXhpc3RzIGluIGBMYC4KICAgIGlmIChidWlsZGVyLnBhcmVudCA9PSB0aGlzKSByZXR1cm4gYnVpbGRlcjsKICAgIHJldHVybiBuZXcgS2VybmVsSW52YWxpZFR5cGVCdWlsZGVyKAogICAgICAgIG5hbWUsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb24KICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobmFtZSkKICAgICAgICAgICAgLndpdGhMb2NhdGlvbihmaWxlVXJpLCBjaGFyT2Zmc2V0LCBuYW1lLmxlbmd0aCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBmdWxsTmFtZUZvckVycm9ycyB7CiAgICByZXR1cm4gbGlicmFyeS5uYW1lID8/ICI8bGlicmFyeSAnJHtsaWJyYXJ5LmZpbGVVcml9Jz4iOwogIH0KCiAgdm9pZCBmaW5hbGl6ZUV4cG9ydHMoKSB7CiAgICB1bnNlcmlhbGl6YWJsZUV4cG9ydHM/LmZvckVhY2goKFN0cmluZyBuYW1lLCBTdHJpbmcgbWVzc2FnZVRleHQpIHsKICAgICAgRGVjbGFyYXRpb24gZGVjbGFyYXRpb247CiAgICAgIHN3aXRjaCAobmFtZSkgewogICAgICAgIGNhc2UgImR5bmFtaWMiOgogICAgICAgIGNhc2UgInZvaWQiOgogICAgICAgICAgLy8gVE9ETyhhaGUpOiBJdCdzIGxpa2VseSB0aGF0IHdlIHNob3VsZG4ndCBiZSBleHBvcnRpbmcgdGhlc2UgdHlwZXMKICAgICAgICAgIC8vIGZyb20gZGFydDpjb3JlLCBhbmQgdGhpcyBjYXNlIGNhbiBiZSByZW1vdmVkLgogICAgICAgICAgZGVjbGFyYXRpb24gPSBsb2FkZXIuY29yZUxpYnJhcnkuZXhwb3J0U2NvcGVCdWlsZGVyW25hbWVdOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBtZXNzYWdlVGV4dCA9PSBudWxsCiAgICAgICAgICAgICAgPyB0ZW1wbGF0ZVR5cGVOb3RGb3VuZC53aXRoQXJndW1lbnRzKG5hbWUpCiAgICAgICAgICAgICAgOiB0ZW1wbGF0ZVVuc3BlY2lmaWVkLndpdGhBcmd1bWVudHMobWVzc2FnZVRleHQpOwogICAgICAgICAgZGVjbGFyYXRpb24gPQogICAgICAgICAgICAgIG5ldyBLZXJuZWxJbnZhbGlkVHlwZUJ1aWxkZXIobmFtZSwgbWVzc2FnZS53aXRob3V0TG9jYXRpb24oKSk7CiAgICAgIH0KICAgICAgZXhwb3J0U2NvcGVCdWlsZGVyLmFkZE1lbWJlcihuYW1lLCBkZWNsYXJhdGlvbik7CiAgICB9KTsKCiAgICBmb3IgKHZhciByZWZlcmVuY2UgaW4gbGlicmFyeS5hZGRpdGlvbmFsRXhwb3J0cykgewogICAgICB2YXIgbm9kZSA9IHJlZmVyZW5jZS5ub2RlOwogICAgICBVcmkgbGlicmFyeVVyaTsKICAgICAgU3RyaW5nIG5hbWU7CiAgICAgIGJvb2wgaXNTZXR0ZXIgPSBmYWxzZTsKICAgICAgaWYgKG5vZGUgaXMgQ2xhc3MpIHsKICAgICAgICBsaWJyYXJ5VXJpID0gbm9kZS5lbmNsb3NpbmdMaWJyYXJ5LmltcG9ydFVyaTsKICAgICAgICBuYW1lID0gbm9kZS5uYW1lOwogICAgICB9IGVsc2UgaWYgKG5vZGUgaXMgUHJvY2VkdXJlKSB7CiAgICAgICAgbGlicmFyeVVyaSA9IG5vZGUuZW5jbG9zaW5nTGlicmFyeS5pbXBvcnRVcmk7CiAgICAgICAgbmFtZSA9IG5vZGUubmFtZS5uYW1lOwogICAgICAgIGlzU2V0dGVyID0gbm9kZS5pc1NldHRlcjsKICAgICAgfSBlbHNlIGlmIChub2RlIGlzIE1lbWJlcikgewogICAgICAgIGxpYnJhcnlVcmkgPSBub2RlLmVuY2xvc2luZ0xpYnJhcnkuaW1wb3J0VXJpOwogICAgICAgIG5hbWUgPSBub2RlLm5hbWUubmFtZTsKICAgICAgfSBlbHNlIGlmIChub2RlIGlzIFR5cGVkZWYpIHsKICAgICAgICBsaWJyYXJ5VXJpID0gbm9kZS5lbmNsb3NpbmdMaWJyYXJ5LmltcG9ydFVyaTsKICAgICAgICBuYW1lID0gbm9kZS5uYW1lOwogICAgICB9IGVsc2UgewogICAgICAgIHVuaGFuZGxlZCgiJHtub2RlLnJ1bnRpbWVUeXBlfSIsICJmaW5hbGl6ZUV4cG9ydHMiLCAtMSwgZmlsZVVyaSk7CiAgICAgIH0KICAgICAgRGlsbExpYnJhcnlCdWlsZGVyIGxpYnJhcnkgPSBsb2FkZXIuYnVpbGRlcnNbbGlicmFyeVVyaV07CiAgICAgIGlmIChsaWJyYXJ5ID09IG51bGwpIHsKICAgICAgICBpbnRlcm5hbFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlVW5zcGVjaWZpZWQud2l0aEFyZ3VtZW50cygiTm8gYnVpbGRlciBmb3IgJyRsaWJyYXJ5VXJpJy4iKSwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIGZpbGVVcmkpOwogICAgICB9CiAgICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uOwogICAgICBpZiAoaXNTZXR0ZXIpIHsKICAgICAgICBkZWNsYXJhdGlvbiA9IGxpYnJhcnkuZXhwb3J0U2NvcGUuc2V0dGVyc1tuYW1lXTsKICAgICAgICBleHBvcnRTY29wZUJ1aWxkZXIuYWRkU2V0dGVyKG5hbWUsIGRlY2xhcmF0aW9uKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkZWNsYXJhdGlvbiA9IGxpYnJhcnkuZXhwb3J0U2NvcGUubG9jYWxbbmFtZV07CiAgICAgICAgZXhwb3J0U2NvcGVCdWlsZGVyLmFkZE1lbWJlcihuYW1lLCBkZWNsYXJhdGlvbik7CiAgICAgIH0KICAgICAgaWYgKGRlY2xhcmF0aW9uID09IG51bGwpIHsKICAgICAgICBpbnRlcm5hbFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlVW5zcGVjaWZpZWQud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICJFeHBvcnRlZCBlbGVtZW50ICckbmFtZScgbm90IGZvdW5kIGluICckbGlicmFyeVVyaScuIiksCiAgICAgICAgICAgIC0xLAogICAgICAgICAgICBmaWxlVXJpKTsKICAgICAgfQogICAgICBhc3NlcnQobm9kZSA9PSBkZWNsYXJhdGlvbi50YXJnZXQpOwogICAgfQogIH0KfQqA9ABOTjwBJAEnASEJDxIVDxYRFRATExcRAR0JESceHQFKAScJFRwcIhsYDwFOATgBOgErAUEBThkBFQEoBjEvLQEwQgEMLwEkASYBDCMBDCEBLBATPSwNBAEdRDczNSYwNTk+Cg8mCAYEASIkHxwwKx5EDVAGBAEMUTMqFDENMQYhFjkPOQgGGAQBJSI8TAZGHQQBDBNINgQBDCtLNio3M0pNPjApDiYhPgQBDCE9BAEbRx8WGBVPO0URAREwOUAYTQg3CAE3IRYTHRs2GiY2HyIjNh8kNhoPSghAHRlQEBYIHxY5OQ83OQghGS9JEBYIKgYEAgE6cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2RpbGwvZGlsbF9saWJyYXJ5X2J1aWxkZXIuZGFydDpzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvZGlsbC9kaWxsX2xvYWRlci5kYXJ0jDAvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5kaWxsX2xvYWRlcjsKCmltcG9ydCAnZGFydDphc3luYycgc2hvdyBGdXR1cmU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IENsYXNzLCBDb21wb25lbnQsIERhcnRUeXBlLCBMaWJyYXJ5OwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdyBTdW1tYXJ5VGVtcGxhdGUsIFRlbXBsYXRlLCB0ZW1wbGF0ZURpbGxPdXRsaW5lU3VtbWFyeTsKCmltcG9ydCAnLi4va2VybmVsL2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93IEtlcm5lbENsYXNzQnVpbGRlciwgS2VybmVsVHlwZUJ1aWxkZXIsIExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICcuLi9rZXJuZWwvdHlwZV9idWlsZGVyX2NvbXB1dGVyLmRhcnQnIHNob3cgVHlwZUJ1aWxkZXJDb21wdXRlcjsKCmltcG9ydCAnLi4vbG9hZGVyLmRhcnQnIHNob3cgTG9hZGVyOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuaGFuZGxlZDsKCmltcG9ydCAnLi4vdGFyZ2V0X2ltcGxlbWVudGF0aW9uLmRhcnQnIHNob3cgVGFyZ2V0SW1wbGVtZW50YXRpb247CgppbXBvcnQgJ2RpbGxfbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgRGlsbExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICdkaWxsX3RhcmdldC5kYXJ0JyBzaG93IERpbGxUYXJnZXQ7CgpjbGFzcyBEaWxsTG9hZGVyIGV4dGVuZHMgTG9hZGVyPExpYnJhcnk+IHsKICBEaWxsTG9hZGVyKFRhcmdldEltcGxlbWVudGF0aW9uIHRhcmdldCkgOiBzdXBlcih0YXJnZXQpOwoKICBUZW1wbGF0ZTxTdW1tYXJ5VGVtcGxhdGU+IGdldCBvdXRsaW5lU3VtbWFyeVRlbXBsYXRlID0+CiAgICAgIHRlbXBsYXRlRGlsbE91dGxpbmVTdW1tYXJ5OwoKICAvLy8gQXBwZW5kIGNvbXBpbGVkIGxpYnJhcmllcyBmcm9tIHRoZSBnaXZlbiBbY29tcG9uZW50XS4gSWYgdGhlIFtmaWx0ZXJdIGlzCiAgLy8vIHByb3ZpZGVkLCBhcHBlbmQgb25seSBsaWJyYXJpZXMgd2hvc2UgW1VyaV0gaXMgYWNjZXB0ZWQgYnkgdGhlIFtmaWx0ZXJdLgogIExpc3Q8RGlsbExpYnJhcnlCdWlsZGVyPiBhcHBlbmRMaWJyYXJpZXMoQ29tcG9uZW50IGNvbXBvbmVudCwKICAgICAge2Jvb2wgZmlsdGVyKFVyaSB1cmkpLCBpbnQgYnl0ZUNvdW50OiAwfSkgewogICAgTGlzdDxMaWJyYXJ5PiBjb21wb25lbnRMaWJyYXJpZXMgPSBjb21wb25lbnQubGlicmFyaWVzOwogICAgTGlzdDxVcmk+IHJlcXVlc3RlZExpYnJhcmllcyA9IDxVcmk+W107CiAgICBEaWxsVGFyZ2V0IHRhcmdldCA9IHRoaXMudGFyZ2V0OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRMaWJyYXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgTGlicmFyeSBsaWJyYXJ5ID0gY29tcG9uZW50TGlicmFyaWVzW2ldOwogICAgICBVcmkgdXJpID0gbGlicmFyeS5pbXBvcnRVcmk7CiAgICAgIGlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIobGlicmFyeS5pbXBvcnRVcmkpKSB7CiAgICAgICAgbGlicmFyaWVzLmFkZChsaWJyYXJ5KTsKICAgICAgICB0YXJnZXQuYWRkTGlicmFyeShsaWJyYXJ5KTsKICAgICAgICByZXF1ZXN0ZWRMaWJyYXJpZXMuYWRkKHVyaSk7CiAgICAgIH0KICAgIH0KICAgIExpc3Q8RGlsbExpYnJhcnlCdWlsZGVyPiByZXN1bHQgPSA8RGlsbExpYnJhcnlCdWlsZGVyPltdOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1ZXN0ZWRMaWJyYXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0LmFkZChyZWFkKHJlcXVlc3RlZExpYnJhcmllc1tpXSwgLTEpKTsKICAgIH0KICAgIHRhcmdldC51cmlUb1NvdXJjZS5hZGRBbGwoY29tcG9uZW50LnVyaVRvU291cmNlKTsKICAgIHRoaXMuYnl0ZUNvdW50ICs9IGJ5dGVDb3VudDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBGdXR1cmU8TnVsbD4gYnVpbGRPdXRsaW5lKERpbGxMaWJyYXJ5QnVpbGRlciBidWlsZGVyKSBhc3luYyB7CiAgICBpZiAoYnVpbGRlci5saWJyYXJ5ID09IG51bGwpIHsKICAgICAgdW5oYW5kbGVkKCJudWxsIiwgImJ1aWxkZXIubGlicmFyeSIsIDAsIGJ1aWxkZXIuZmlsZVVyaSk7CiAgICB9CiAgICBidWlsZGVyLmxpYnJhcnkuY2xhc3Nlcy5mb3JFYWNoKGJ1aWxkZXIuYWRkQ2xhc3MpOwogICAgYnVpbGRlci5saWJyYXJ5LnByb2NlZHVyZXMuZm9yRWFjaChidWlsZGVyLmFkZE1lbWJlcik7CiAgICBidWlsZGVyLmxpYnJhcnkudHlwZWRlZnMuZm9yRWFjaChidWlsZGVyLmFkZFR5cGVkZWYpOwogICAgYnVpbGRlci5saWJyYXJ5LmZpZWxkcy5mb3JFYWNoKGJ1aWxkZXIuYWRkTWVtYmVyKTsKICB9CgogIEZ1dHVyZTxOdWxsPiBidWlsZEJvZHkoRGlsbExpYnJhcnlCdWlsZGVyIGJ1aWxkZXIpIHsKICAgIHJldHVybiBidWlsZE91dGxpbmUoYnVpbGRlcik7CiAgfQoKICB2b2lkIGZpbmFsaXplRXhwb3J0cygpIHsKICAgIGJ1aWxkZXJzLmZvckVhY2goKFVyaSB1cmksIExpYnJhcnlCdWlsZGVyIGJ1aWxkZXIpIHsKICAgICAgRGlsbExpYnJhcnlCdWlsZGVyIGxpYnJhcnkgPSBidWlsZGVyOwogICAgICBsaWJyYXJ5LmZpbmFsaXplRXhwb3J0cygpOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICBLZXJuZWxDbGFzc0J1aWxkZXIgY29tcHV0ZUNsYXNzQnVpbGRlckZyb21UYXJnZXRDbGFzcyhDbGFzcyBjbHMpIHsKICAgIExpYnJhcnkga2VybmVsTGlicmFyeSA9IGNscy5lbmNsb3NpbmdMaWJyYXJ5OwogICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGJ1aWxkZXJzW2tlcm5lbExpYnJhcnkuaW1wb3J0VXJpXTsKICAgIHJldHVybiBsaWJyYXJ5W2Nscy5uYW1lXTsKICB9CgogIEBvdmVycmlkZQogIEtlcm5lbFR5cGVCdWlsZGVyIGNvbXB1dGVUeXBlQnVpbGRlcihEYXJ0VHlwZSB0eXBlKSB7CiAgICByZXR1cm4gdHlwZS5hY2NlcHQobmV3IFR5cGVCdWlsZGVyQ29tcHV0ZXIodGhpcykpOwogIH0KfQpeAE5OPAEbASEBSwEdQAEnQAFIASUBKgFCATwBKwErOwE6IgFPT0AyPCwlOi8jOSAkJQgGPjozBjYhEwQBQCNABjc7OjcEATciBAEbOSwhCAQBDEUyQB4EAQw4NwQCATFwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvZGlsbC9kaWxsX2xvYWRlci5kYXJ0InNka3Jvb3Q6L3BrZy9rZXJuZWwvbGliL2Nsb25lLmRhcnTAAFL5Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KbGlicmFyeSBrZXJuZWwuY2xvbmU7CgppbXBvcnQgJ2RhcnQ6Y29yZScgaGlkZSBNYXBFbnRyeTsKCmltcG9ydCAnYXN0LmRhcnQnOwppbXBvcnQgJ3R5cGVfYWxnZWJyYS5kYXJ0JzsKCi8vLyBWaXNpdG9yIHRoYXQgcmV0dXJuIGEgY2xvbmUgb2YgYSB0cmVlLCBtYWludGFpbmluZyByZWZlcmVuY2VzIHRvIGNsb25lZAovLy8gb2JqZWN0cy4KLy8vCi8vLyBJdCBpcyBzYWZlIHRvIGNsb25lIG1lbWJlcnMsIGJ1dCBjbG9uaW5nIGEgY2xhc3Mgb3IgbGlicmFyeSBpcyBub3QKLy8vIHN1cHBvcnRlZC4KY2xhc3MgQ2xvbmVWaXNpdG9yIGltcGxlbWVudHMgVHJlZVZpc2l0b3IgewogIGZpbmFsIE1hcDxWYXJpYWJsZURlY2xhcmF0aW9uLCBWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXMgPQogICAgICA8VmFyaWFibGVEZWNsYXJhdGlvbiwgVmFyaWFibGVEZWNsYXJhdGlvbj57fTsKICBmaW5hbCBNYXA8TGFiZWxlZFN0YXRlbWVudCwgTGFiZWxlZFN0YXRlbWVudD4gbGFiZWxzID0KICAgICAgPExhYmVsZWRTdGF0ZW1lbnQsIExhYmVsZWRTdGF0ZW1lbnQ+e307CiAgZmluYWwgTWFwPFN3aXRjaENhc2UsIFN3aXRjaENhc2U+IHN3aXRjaENhc2VzID0gPFN3aXRjaENhc2UsIFN3aXRjaENhc2U+e307CiAgZmluYWwgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiB0eXBlU3Vic3RpdHV0aW9uOwogIGZpbmFsIE1hcDxUeXBlUGFyYW1ldGVyLCBUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1zOwogIGJvb2wgY2xvbmVBbm5vdGF0aW9uczsKCiAgLy8vIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsb25pbmcgdmlzaXRvciBmb3IgS2VybmVsIEFTVHMuCiAgLy8vCiAgLy8vIFRoZSBib29sZWFuIHZhbHVlIG9mIFtjbG9uZUFubm90YXRpb25zXSB0ZWxscyBpZiB0aGUgYW5ub3RhdGlvbnMgb24gdGhlCiAgLy8vIG91dGxpbmUgZWxlbWVudHMgaW4gdGhlIHNvdXJjZSBBU1Qgc2hvdWxkIGJlIGNsb25lZCB0byB0aGUgdGFyZ2V0IEFTVC4gVGhlCiAgLy8vIGFubm90YXRpb25zIGluIHByb2NlZHVyZSBib2RpZXMgYXJlIGNsb25lZCB1bmNvbmRpdGlvbmFsbHkuCiAgQ2xvbmVWaXNpdG9yKAogICAgICB7TWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiB0eXBlU3Vic3RpdHV0aW9uLAogICAgICBNYXA8VHlwZVBhcmFtZXRlciwgVHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtcywKICAgICAgdGhpcy5jbG9uZUFubm90YXRpb25zID0gdHJ1ZX0pCiAgICAgIDogdGhpcy50eXBlU3Vic3RpdHV0aW9uID0gZW5zdXJlTXV0YWJsZSh0eXBlU3Vic3RpdHV0aW9uKSwKICAgICAgICB0aGlzLnR5cGVQYXJhbXMgPSB0eXBlUGFyYW1zID8/IDxUeXBlUGFyYW1ldGVyLCBUeXBlUGFyYW1ldGVyPnt9OwoKICBzdGF0aWMgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBlbnN1cmVNdXRhYmxlKAogICAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IG1hcCkgewogICAgLy8gV2UgbmVlZCB0byBtdXRhdGUgdGhpcyBtYXAsIHNvIG1ha2Ugc3VyZSB3ZSBkb24ndCB1c2UgYSBjb25zdGFudCBtYXAuCiAgICBpZiAobWFwID09IG51bGwgfHwgbWFwLmlzRW1wdHkpIHsKICAgICAgcmV0dXJuIDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgIH0KICAgIHJldHVybiBtYXA7CiAgfQoKICBUcmVlTm9kZSB2aXNpdExpYnJhcnkoTGlicmFyeSBub2RlKSB7CiAgICB0aHJvdyAnQ2xvbmluZyBvZiBsaWJyYXJpZXMgaXMgbm90IGltcGxlbWVudGVkJzsKICB9CgogIFRyZWVOb2RlIHZpc2l0Q2xhc3MoQ2xhc3Mgbm9kZSkgewogICAgdGhyb3cgJ0Nsb25pbmcgb2YgY2xhc3NlcyBpcyBub3QgaW1wbGVtZW50ZWQnOwogIH0KCiAgLy8gVGhlIGN1cnJlbnRseSBhY3RpdmUgZmlsZSB1cmkgd2hlcmUgd2UgYXJlIGNsb25pbmcgW1RyZWVOb2RlXXMgZnJvbS4gIElmCiAgLy8gdGhpcyBpcyBzZXQgdG8gYG51bGxgIHdlIGNhbm5vdCBjbG9uZSBmaWxlIG9mZnNldHMgdG8gbmV3bHkgY3JlYXRlZCBub2Rlcy4KICAvLyBUaGUgW19jbG9uZUZpbGVPZmZzZXRdIGhlbHBlciBmdW5jdGlvbiB3aWxsIGVuc3VyZSB0aGlzLgogIFVyaSBfYWN0aXZlRmlsZVVyaTsKCiAgLy8gSWYgd2UgZG9uJ3Qga25vdyB0aGUgZmlsZSB1cmkgd2UgYXJlIGNsb25pbmcgZWxlbWVudHMgZnJvbSwgaXQncyBub3Qgc2FmZQogIC8vIHRvIGNsb25lIGZpbGUgb2Zmc2V0cyBlaXRoZXIuCiAgaW50IF9jbG9uZUZpbGVPZmZzZXQoaW50IGZpbGVPZmZzZXQpIHsKICAgIHJldHVybiBfYWN0aXZlRmlsZVVyaSA9PSBudWxsID8gVHJlZU5vZGUubm9PZmZzZXQgOiBmaWxlT2Zmc2V0OwogIH0KCiAgVCBjbG9uZTxUIGV4dGVuZHMgVHJlZU5vZGU+KFQgbm9kZSkgewogICAgZmluYWwgVXJpIGFjdGl2ZUZpbGVVcmlTYXZlZCA9IF9hY3RpdmVGaWxlVXJpOwogICAgaWYgKG5vZGUgaXMgRmlsZVVyaU5vZGUpIF9hY3RpdmVGaWxlVXJpID0gbm9kZS5maWxlVXJpID8/IF9hY3RpdmVGaWxlVXJpOwogICAgZmluYWwgVHJlZU5vZGUgcmVzdWx0ID0gbm9kZS5hY2NlcHQodGhpcykKICAgICAgLi5maWxlT2Zmc2V0ID0gX2Nsb25lRmlsZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgX2FjdGl2ZUZpbGVVcmkgPSBhY3RpdmVGaWxlVXJpU2F2ZWQ7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgVHJlZU5vZGUgY2xvbmVPcHRpb25hbChUcmVlTm9kZSBub2RlKSB7CiAgICBpZiAobm9kZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGZpbmFsIFVyaSBhY3RpdmVGaWxlVXJpU2F2ZWQgPSBfYWN0aXZlRmlsZVVyaTsKICAgIGlmIChub2RlIGlzIEZpbGVVcmlOb2RlKSBfYWN0aXZlRmlsZVVyaSA9IG5vZGUuZmlsZVVyaSA/PyBfYWN0aXZlRmlsZVVyaTsKICAgIFRyZWVOb2RlIHJlc3VsdCA9IG5vZGU/LmFjY2VwdCh0aGlzKTsKICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgcmVzdWx0LmZpbGVPZmZzZXQgPSBfY2xvbmVGaWxlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICBfYWN0aXZlRmlsZVVyaSA9IGFjdGl2ZUZpbGVVcmlTYXZlZDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBEYXJ0VHlwZSB2aXNpdFR5cGUoRGFydFR5cGUgdHlwZSkgewogICAgcmV0dXJuIHN1YnN0aXR1dGUodHlwZSwgdHlwZVN1YnN0aXR1dGlvbik7CiAgfQoKICBDb25zdGFudCB2aXNpdENvbnN0YW50KENvbnN0YW50IGNvbnN0YW50KSB7CiAgICByZXR1cm4gY29uc3RhbnQ7CiAgfQoKICBEYXJ0VHlwZSB2aXNpdE9wdGlvbmFsVHlwZShEYXJ0VHlwZSB0eXBlKSB7CiAgICByZXR1cm4gdHlwZSA9PSBudWxsID8gbnVsbCA6IHN1YnN0aXR1dGUodHlwZSwgdHlwZVN1YnN0aXR1dGlvbik7CiAgfQoKICB2aXNpdEludmFsaWRFeHByZXNzaW9uKEludmFsaWRFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgSW52YWxpZEV4cHJlc3Npb24obm9kZS5tZXNzYWdlKTsKICB9CgogIHZpc2l0VmFyaWFibGVHZXQoVmFyaWFibGVHZXQgbm9kZSkgewogICAgcmV0dXJuIG5ldyBWYXJpYWJsZUdldCgKICAgICAgICB2YXJpYWJsZXNbbm9kZS52YXJpYWJsZV0sIHZpc2l0T3B0aW9uYWxUeXBlKG5vZGUucHJvbW90ZWRUeXBlKSk7CiAgfQoKICB2aXNpdFZhcmlhYmxlU2V0KFZhcmlhYmxlU2V0IG5vZGUpIHsKICAgIHJldHVybiBuZXcgVmFyaWFibGVTZXQodmFyaWFibGVzW25vZGUudmFyaWFibGVdLCBjbG9uZShub2RlLnZhbHVlKSk7CiAgfQoKICB2aXNpdFByb3BlcnR5R2V0KFByb3BlcnR5R2V0IG5vZGUpIHsKICAgIHJldHVybiBuZXcgUHJvcGVydHlHZXQuYnlSZWZlcmVuY2UoCiAgICAgICAgY2xvbmUobm9kZS5yZWNlaXZlciksIG5vZGUubmFtZSwgbm9kZS5pbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpOwogIH0KCiAgdmlzaXRQcm9wZXJ0eVNldChQcm9wZXJ0eVNldCBub2RlKSB7CiAgICByZXR1cm4gbmV3IFByb3BlcnR5U2V0LmJ5UmVmZXJlbmNlKGNsb25lKG5vZGUucmVjZWl2ZXIpLCBub2RlLm5hbWUsCiAgICAgICAgY2xvbmUobm9kZS52YWx1ZSksIG5vZGUuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKICB9CgogIHZpc2l0RGlyZWN0UHJvcGVydHlHZXQoRGlyZWN0UHJvcGVydHlHZXQgbm9kZSkgewogICAgcmV0dXJuIG5ldyBEaXJlY3RQcm9wZXJ0eUdldC5ieVJlZmVyZW5jZSgKICAgICAgICBjbG9uZShub2RlLnJlY2VpdmVyKSwgbm9kZS50YXJnZXRSZWZlcmVuY2UpOwogIH0KCiAgdmlzaXREaXJlY3RQcm9wZXJ0eVNldChEaXJlY3RQcm9wZXJ0eVNldCBub2RlKSB7CiAgICByZXR1cm4gbmV3IERpcmVjdFByb3BlcnR5U2V0LmJ5UmVmZXJlbmNlKAogICAgICAgIGNsb25lKG5vZGUucmVjZWl2ZXIpLCBub2RlLnRhcmdldFJlZmVyZW5jZSwgY2xvbmUobm9kZS52YWx1ZSkpOwogIH0KCiAgdmlzaXRTdXBlclByb3BlcnR5R2V0KFN1cGVyUHJvcGVydHlHZXQgbm9kZSkgewogICAgcmV0dXJuIG5ldyBTdXBlclByb3BlcnR5R2V0LmJ5UmVmZXJlbmNlKAogICAgICAgIG5vZGUubmFtZSwgbm9kZS5pbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpOwogIH0KCiAgdmlzaXRTdXBlclByb3BlcnR5U2V0KFN1cGVyUHJvcGVydHlTZXQgbm9kZSkgewogICAgcmV0dXJuIG5ldyBTdXBlclByb3BlcnR5U2V0LmJ5UmVmZXJlbmNlKAogICAgICAgIG5vZGUubmFtZSwgY2xvbmUobm9kZS52YWx1ZSksIG5vZGUuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKICB9CgogIHZpc2l0U3RhdGljR2V0KFN0YXRpY0dldCBub2RlKSB7CiAgICByZXR1cm4gbmV3IFN0YXRpY0dldC5ieVJlZmVyZW5jZShub2RlLnRhcmdldFJlZmVyZW5jZSk7CiAgfQoKICB2aXNpdFN0YXRpY1NldChTdGF0aWNTZXQgbm9kZSkgewogICAgcmV0dXJuIG5ldyBTdGF0aWNTZXQuYnlSZWZlcmVuY2Uobm9kZS50YXJnZXRSZWZlcmVuY2UsIGNsb25lKG5vZGUudmFsdWUpKTsKICB9CgogIHZpc2l0TWV0aG9kSW52b2NhdGlvbihNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgTWV0aG9kSW52b2NhdGlvbi5ieVJlZmVyZW5jZShjbG9uZShub2RlLnJlY2VpdmVyKSwgbm9kZS5uYW1lLAogICAgICAgIGNsb25lKG5vZGUuYXJndW1lbnRzKSwgbm9kZS5pbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpOwogIH0KCiAgdmlzaXREaXJlY3RNZXRob2RJbnZvY2F0aW9uKERpcmVjdE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgcmV0dXJuIG5ldyBEaXJlY3RNZXRob2RJbnZvY2F0aW9uLmJ5UmVmZXJlbmNlKAogICAgICAgIGNsb25lKG5vZGUucmVjZWl2ZXIpLCBub2RlLnRhcmdldFJlZmVyZW5jZSwgY2xvbmUobm9kZS5hcmd1bWVudHMpKTsKICB9CgogIHZpc2l0U3VwZXJNZXRob2RJbnZvY2F0aW9uKFN1cGVyTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICByZXR1cm4gbmV3IFN1cGVyTWV0aG9kSW52b2NhdGlvbi5ieVJlZmVyZW5jZSgKICAgICAgICBub2RlLm5hbWUsIGNsb25lKG5vZGUuYXJndW1lbnRzKSwgbm9kZS5pbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpOwogIH0KCiAgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKFN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgcmV0dXJuIG5ldyBTdGF0aWNJbnZvY2F0aW9uLmJ5UmVmZXJlbmNlKAogICAgICAgIG5vZGUudGFyZ2V0UmVmZXJlbmNlLCBjbG9uZShub2RlLmFyZ3VtZW50cyksCiAgICAgICAgaXNDb25zdDogbm9kZS5pc0NvbnN0KTsKICB9CgogIHZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7CiAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9ySW52b2NhdGlvbi5ieVJlZmVyZW5jZSgKICAgICAgICBub2RlLnRhcmdldFJlZmVyZW5jZSwgY2xvbmUobm9kZS5hcmd1bWVudHMpLAogICAgICAgIGlzQ29uc3Q6IG5vZGUuaXNDb25zdCk7CiAgfQoKICB2aXNpdE5vdChOb3Qgbm9kZSkgewogICAgcmV0dXJuIG5ldyBOb3QoY2xvbmUobm9kZS5vcGVyYW5kKSk7CiAgfQoKICB2aXNpdExvZ2ljYWxFeHByZXNzaW9uKExvZ2ljYWxFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgTG9naWNhbEV4cHJlc3Npb24oCiAgICAgICAgY2xvbmUobm9kZS5sZWZ0KSwgbm9kZS5vcGVyYXRvciwgY2xvbmUobm9kZS5yaWdodCkpOwogIH0KCiAgdmlzaXRDb25kaXRpb25hbEV4cHJlc3Npb24oQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgQ29uZGl0aW9uYWxFeHByZXNzaW9uKGNsb25lKG5vZGUuY29uZGl0aW9uKSwgY2xvbmUobm9kZS50aGVuKSwKICAgICAgICBjbG9uZShub2RlLm90aGVyd2lzZSksIHZpc2l0T3B0aW9uYWxUeXBlKG5vZGUuc3RhdGljVHlwZSkpOwogIH0KCiAgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKFN0cmluZ0NvbmNhdGVuYXRpb24gbm9kZSkgewogICAgcmV0dXJuIG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKG5vZGUuZXhwcmVzc2lvbnMubWFwKGNsb25lKS50b0xpc3QoKSk7CiAgfQoKICB2aXNpdExpc3RDb25jYXRlbmF0aW9uKExpc3RDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgTGlzdENvbmNhdGVuYXRpb24obm9kZS5saXN0cy5tYXAoY2xvbmUpLnRvTGlzdCgpLAogICAgICAgIHR5cGVBcmd1bWVudDogdmlzaXRUeXBlKG5vZGUudHlwZUFyZ3VtZW50KSk7CiAgfQoKICB2aXNpdFNldENvbmNhdGVuYXRpb24oU2V0Q29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICByZXR1cm4gbmV3IFNldENvbmNhdGVuYXRpb24obm9kZS5zZXRzLm1hcChjbG9uZSkudG9MaXN0KCksCiAgICAgICAgdHlwZUFyZ3VtZW50OiB2aXNpdFR5cGUobm9kZS50eXBlQXJndW1lbnQpKTsKICB9CgogIHZpc2l0TWFwQ29uY2F0ZW5hdGlvbihNYXBDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgTWFwQ29uY2F0ZW5hdGlvbihub2RlLm1hcHMubWFwKGNsb25lKS50b0xpc3QoKSwKICAgICAgICBrZXlUeXBlOiB2aXNpdFR5cGUobm9kZS5rZXlUeXBlKSwgdmFsdWVUeXBlOiB2aXNpdFR5cGUobm9kZS52YWx1ZVR5cGUpKTsKICB9CgogIHZpc2l0SW5zdGFuY2VDcmVhdGlvbihJbnN0YW5jZUNyZWF0aW9uIG5vZGUpIHsKICAgIGZpbmFsIE1hcDxSZWZlcmVuY2UsIEV4cHJlc3Npb24+IGZpZWxkVmFsdWVzID0gPFJlZmVyZW5jZSwgRXhwcmVzc2lvbj57fTsKICAgIG5vZGUuZmllbGRWYWx1ZXMuZm9yRWFjaCgoUmVmZXJlbmNlIGZpZWxkUmVmLCBFeHByZXNzaW9uIHZhbHVlKSB7CiAgICAgIGZpZWxkVmFsdWVzW2ZpZWxkUmVmXSA9IGNsb25lKHZhbHVlKTsKICAgIH0pOwogICAgcmV0dXJuIG5ldyBJbnN0YW5jZUNyZWF0aW9uKAogICAgICAgIG5vZGUuY2xhc3NSZWZlcmVuY2UsCiAgICAgICAgbm9kZS50eXBlQXJndW1lbnRzLm1hcCh2aXNpdFR5cGUpLnRvTGlzdCgpLAogICAgICAgIGZpZWxkVmFsdWVzLAogICAgICAgIG5vZGUuYXNzZXJ0cy5tYXAoY2xvbmUpLnRvTGlzdCgpKTsKICB9CgogIHZpc2l0SXNFeHByZXNzaW9uKElzRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gbmV3IElzRXhwcmVzc2lvbihjbG9uZShub2RlLm9wZXJhbmQpLCB2aXNpdFR5cGUobm9kZS50eXBlKSk7CiAgfQoKICB2aXNpdEFzRXhwcmVzc2lvbihBc0V4cHJlc3Npb24gbm9kZSkgewogICAgcmV0dXJuIG5ldyBBc0V4cHJlc3Npb24oY2xvbmUobm9kZS5vcGVyYW5kKSwgdmlzaXRUeXBlKG5vZGUudHlwZSkpCiAgICAgIC4uZmxhZ3MgPSBub2RlLmZsYWdzOwogIH0KCiAgdmlzaXRTeW1ib2xMaXRlcmFsKFN5bWJvbExpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIG5ldyBTeW1ib2xMaXRlcmFsKG5vZGUudmFsdWUpOwogIH0KCiAgdmlzaXRUeXBlTGl0ZXJhbChUeXBlTGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gbmV3IFR5cGVMaXRlcmFsKHZpc2l0VHlwZShub2RlLnR5cGUpKTsKICB9CgogIHZpc2l0VGhpc0V4cHJlc3Npb24oVGhpc0V4cHJlc3Npb24gbm9kZSkgewogICAgcmV0dXJuIG5ldyBUaGlzRXhwcmVzc2lvbigpOwogIH0KCiAgdmlzaXRSZXRocm93KFJldGhyb3cgbm9kZSkgewogICAgcmV0dXJuIG5ldyBSZXRocm93KCk7CiAgfQoKICB2aXNpdFRocm93KFRocm93IG5vZGUpIHsKICAgIHJldHVybiBuZXcgVGhyb3coY2xvbmVPcHRpb25hbChub2RlLmV4cHJlc3Npb24pKTsKICB9CgogIHZpc2l0TGlzdExpdGVyYWwoTGlzdExpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIG5ldyBMaXN0TGl0ZXJhbChub2RlLmV4cHJlc3Npb25zLm1hcChjbG9uZSkudG9MaXN0KCksCiAgICAgICAgdHlwZUFyZ3VtZW50OiB2aXNpdFR5cGUobm9kZS50eXBlQXJndW1lbnQpLCBpc0NvbnN0OiBub2RlLmlzQ29uc3QpOwogIH0KCiAgdmlzaXRTZXRMaXRlcmFsKFNldExpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIG5ldyBTZXRMaXRlcmFsKG5vZGUuZXhwcmVzc2lvbnMubWFwKGNsb25lKS50b0xpc3QoKSwKICAgICAgICB0eXBlQXJndW1lbnQ6IHZpc2l0VHlwZShub2RlLnR5cGVBcmd1bWVudCksIGlzQ29uc3Q6IG5vZGUuaXNDb25zdCk7CiAgfQoKICB2aXNpdE1hcExpdGVyYWwoTWFwTGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gbmV3IE1hcExpdGVyYWwobm9kZS5lbnRyaWVzLm1hcChjbG9uZSkudG9MaXN0KCksCiAgICAgICAga2V5VHlwZTogdmlzaXRUeXBlKG5vZGUua2V5VHlwZSksCiAgICAgICAgdmFsdWVUeXBlOiB2aXNpdFR5cGUobm9kZS52YWx1ZVR5cGUpLAogICAgICAgIGlzQ29uc3Q6IG5vZGUuaXNDb25zdCk7CiAgfQoKICB2aXNpdE1hcEVudHJ5KE1hcEVudHJ5IG5vZGUpIHsKICAgIHJldHVybiBuZXcgTWFwRW50cnkoY2xvbmUobm9kZS5rZXkpLCBjbG9uZShub2RlLnZhbHVlKSk7CiAgfQoKICB2aXNpdEF3YWl0RXhwcmVzc2lvbihBd2FpdEV4cHJlc3Npb24gbm9kZSkgewogICAgcmV0dXJuIG5ldyBBd2FpdEV4cHJlc3Npb24oY2xvbmUobm9kZS5vcGVyYW5kKSk7CiAgfQoKICB2aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbihGdW5jdGlvbkV4cHJlc3Npb24gbm9kZSkgewogICAgcmV0dXJuIG5ldyBGdW5jdGlvbkV4cHJlc3Npb24oY2xvbmUobm9kZS5mdW5jdGlvbikpOwogIH0KCiAgdmlzaXRDb25zdGFudEV4cHJlc3Npb24oQ29uc3RhbnRFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKAogICAgICAgIHZpc2l0Q29uc3RhbnQobm9kZS5jb25zdGFudCksIHZpc2l0VHlwZShub2RlLnR5cGUpKTsKICB9CgogIHZpc2l0U3RyaW5nTGl0ZXJhbChTdHJpbmdMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBuZXcgU3RyaW5nTGl0ZXJhbChub2RlLnZhbHVlKTsKICB9CgogIHZpc2l0SW50TGl0ZXJhbChJbnRMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBuZXcgSW50TGl0ZXJhbChub2RlLnZhbHVlKTsKICB9CgogIHZpc2l0RG91YmxlTGl0ZXJhbChEb3VibGVMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBuZXcgRG91YmxlTGl0ZXJhbChub2RlLnZhbHVlKTsKICB9CgogIHZpc2l0Qm9vbExpdGVyYWwoQm9vbExpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIG5ldyBCb29sTGl0ZXJhbChub2RlLnZhbHVlKTsKICB9CgogIHZpc2l0TnVsbExpdGVyYWwoTnVsbExpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIG5ldyBOdWxsTGl0ZXJhbCgpOwogIH0KCiAgdmlzaXRMZXQoTGV0IG5vZGUpIHsKICAgIHZhciBuZXdWYXJpYWJsZSA9IGNsb25lKG5vZGUudmFyaWFibGUpOwogICAgcmV0dXJuIG5ldyBMZXQobmV3VmFyaWFibGUsIGNsb25lKG5vZGUuYm9keSkpOwogIH0KCiAgdmlzaXRCbG9ja0V4cHJlc3Npb24oQmxvY2tFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgQmxvY2tFeHByZXNzaW9uKGNsb25lKG5vZGUuYm9keSksIGNsb25lKG5vZGUudmFsdWUpKTsKICB9CgogIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpIHsKICAgIHJldHVybiBuZXcgRXhwcmVzc2lvblN0YXRlbWVudChjbG9uZShub2RlLmV4cHJlc3Npb24pKTsKICB9CgogIHZpc2l0QmxvY2soQmxvY2sgbm9kZSkgewogICAgcmV0dXJuIG5ldyBCbG9jayhub2RlLnN0YXRlbWVudHMubWFwKGNsb25lKS50b0xpc3QoKSk7CiAgfQoKICB2aXNpdEFzc2VydEJsb2NrKEFzc2VydEJsb2NrIG5vZGUpIHsKICAgIHJldHVybiBuZXcgQXNzZXJ0QmxvY2sobm9kZS5zdGF0ZW1lbnRzLm1hcChjbG9uZSkudG9MaXN0KCkpOwogIH0KCiAgdmlzaXRFbXB0eVN0YXRlbWVudChFbXB0eVN0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gbmV3IEVtcHR5U3RhdGVtZW50KCk7CiAgfQoKICB2aXNpdEFzc2VydFN0YXRlbWVudChBc3NlcnRTdGF0ZW1lbnQgbm9kZSkgewogICAgcmV0dXJuIG5ldyBBc3NlcnRTdGF0ZW1lbnQoY2xvbmUobm9kZS5jb25kaXRpb24pLAogICAgICAgIGNvbmRpdGlvblN0YXJ0T2Zmc2V0OiBub2RlLmNvbmRpdGlvblN0YXJ0T2Zmc2V0LAogICAgICAgIGNvbmRpdGlvbkVuZE9mZnNldDogbm9kZS5jb25kaXRpb25FbmRPZmZzZXQsCiAgICAgICAgbWVzc2FnZTogY2xvbmVPcHRpb25hbChub2RlLm1lc3NhZ2UpKTsKICB9CgogIHZpc2l0TGFiZWxlZFN0YXRlbWVudChMYWJlbGVkU3RhdGVtZW50IG5vZGUpIHsKICAgIExhYmVsZWRTdGF0ZW1lbnQgbmV3Tm9kZSA9IG5ldyBMYWJlbGVkU3RhdGVtZW50KG51bGwpOwogICAgbGFiZWxzW25vZGVdID0gbmV3Tm9kZTsKICAgIG5ld05vZGUuYm9keSA9IGNsb25lKG5vZGUuYm9keSkuLnBhcmVudCA9IG5ld05vZGU7CiAgICByZXR1cm4gbmV3Tm9kZTsKICB9CgogIHZpc2l0QnJlYWtTdGF0ZW1lbnQoQnJlYWtTdGF0ZW1lbnQgbm9kZSkgewogICAgcmV0dXJuIG5ldyBCcmVha1N0YXRlbWVudChsYWJlbHNbbm9kZS50YXJnZXRdKTsKICB9CgogIHZpc2l0V2hpbGVTdGF0ZW1lbnQoV2hpbGVTdGF0ZW1lbnQgbm9kZSkgewogICAgcmV0dXJuIG5ldyBXaGlsZVN0YXRlbWVudChjbG9uZShub2RlLmNvbmRpdGlvbiksIGNsb25lKG5vZGUuYm9keSkpOwogIH0KCiAgdmlzaXREb1N0YXRlbWVudChEb1N0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gbmV3IERvU3RhdGVtZW50KGNsb25lKG5vZGUuYm9keSksIGNsb25lKG5vZGUuY29uZGl0aW9uKSk7CiAgfQoKICB2aXNpdEZvclN0YXRlbWVudChGb3JTdGF0ZW1lbnQgbm9kZSkgewogICAgdmFyIHZhcmlhYmxlcyA9IG5vZGUudmFyaWFibGVzLm1hcChjbG9uZSkudG9MaXN0KCk7CiAgICByZXR1cm4gbmV3IEZvclN0YXRlbWVudCh2YXJpYWJsZXMsIGNsb25lT3B0aW9uYWwobm9kZS5jb25kaXRpb24pLAogICAgICAgIG5vZGUudXBkYXRlcy5tYXAoY2xvbmUpLnRvTGlzdCgpLCBjbG9uZShub2RlLmJvZHkpKTsKICB9CgogIHZpc2l0Rm9ySW5TdGF0ZW1lbnQoRm9ySW5TdGF0ZW1lbnQgbm9kZSkgewogICAgdmFyIG5ld1ZhcmlhYmxlID0gY2xvbmUobm9kZS52YXJpYWJsZSk7CiAgICByZXR1cm4gbmV3IEZvckluU3RhdGVtZW50KAogICAgICAgIG5ld1ZhcmlhYmxlLCBjbG9uZShub2RlLml0ZXJhYmxlKSwgY2xvbmUobm9kZS5ib2R5KSwKICAgICAgICBpc0FzeW5jOiBub2RlLmlzQXN5bmMpOwogIH0KCiAgdmlzaXRTd2l0Y2hTdGF0ZW1lbnQoU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIGZvciAoU3dpdGNoQ2FzZSBzd2l0Y2hDYXNlIGluIG5vZGUuY2FzZXMpIHsKICAgICAgc3dpdGNoQ2FzZXNbc3dpdGNoQ2FzZV0gPSBuZXcgU3dpdGNoQ2FzZSgKICAgICAgICAgIHN3aXRjaENhc2UuZXhwcmVzc2lvbnMubWFwKGNsb25lKS50b0xpc3QoKSwKICAgICAgICAgIG5ldyBMaXN0PGludD4uZnJvbShzd2l0Y2hDYXNlLmV4cHJlc3Npb25PZmZzZXRzKSwKICAgICAgICAgIG51bGwsCiAgICAgICAgICBpc0RlZmF1bHQ6IHN3aXRjaENhc2UuaXNEZWZhdWx0KTsKICAgIH0KICAgIHJldHVybiBuZXcgU3dpdGNoU3RhdGVtZW50KAogICAgICAgIGNsb25lKG5vZGUuZXhwcmVzc2lvbiksIG5vZGUuY2FzZXMubWFwKGNsb25lKS50b0xpc3QoKSk7CiAgfQoKICB2aXNpdFN3aXRjaENhc2UoU3dpdGNoQ2FzZSBub2RlKSB7CiAgICB2YXIgc3dpdGNoQ2FzZSA9IHN3aXRjaENhc2VzW25vZGVdOwogICAgc3dpdGNoQ2FzZS5ib2R5ID0gY2xvbmUobm9kZS5ib2R5KS4ucGFyZW50ID0gc3dpdGNoQ2FzZTsKICAgIHJldHVybiBzd2l0Y2hDYXNlOwogIH0KCiAgdmlzaXRDb250aW51ZVN3aXRjaFN0YXRlbWVudChDb250aW51ZVN3aXRjaFN0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gbmV3IENvbnRpbnVlU3dpdGNoU3RhdGVtZW50KHN3aXRjaENhc2VzW25vZGUudGFyZ2V0XSk7CiAgfQoKICB2aXNpdElmU3RhdGVtZW50KElmU3RhdGVtZW50IG5vZGUpIHsKICAgIHJldHVybiBuZXcgSWZTdGF0ZW1lbnQoCiAgICAgICAgY2xvbmUobm9kZS5jb25kaXRpb24pLCBjbG9uZShub2RlLnRoZW4pLCBjbG9uZU9wdGlvbmFsKG5vZGUub3RoZXJ3aXNlKSk7CiAgfQoKICB2aXNpdFJldHVyblN0YXRlbWVudChSZXR1cm5TdGF0ZW1lbnQgbm9kZSkgewogICAgcmV0dXJuIG5ldyBSZXR1cm5TdGF0ZW1lbnQoY2xvbmVPcHRpb25hbChub2RlLmV4cHJlc3Npb24pKTsKICB9CgogIHZpc2l0VHJ5Q2F0Y2goVHJ5Q2F0Y2ggbm9kZSkgewogICAgcmV0dXJuIG5ldyBUcnlDYXRjaChjbG9uZShub2RlLmJvZHkpLCBub2RlLmNhdGNoZXMubWFwKGNsb25lKS50b0xpc3QoKSwKICAgICAgICBpc1N5bnRoZXRpYzogbm9kZS5pc1N5bnRoZXRpYyk7CiAgfQoKICB2aXNpdENhdGNoKENhdGNoIG5vZGUpIHsKICAgIHZhciBuZXdFeGNlcHRpb24gPSBjbG9uZU9wdGlvbmFsKG5vZGUuZXhjZXB0aW9uKTsKICAgIHZhciBuZXdTdGFja1RyYWNlID0gY2xvbmVPcHRpb25hbChub2RlLnN0YWNrVHJhY2UpOwogICAgcmV0dXJuIG5ldyBDYXRjaChuZXdFeGNlcHRpb24sIGNsb25lKG5vZGUuYm9keSksCiAgICAgICAgc3RhY2tUcmFjZTogbmV3U3RhY2tUcmFjZSwgZ3VhcmQ6IHZpc2l0VHlwZShub2RlLmd1YXJkKSk7CiAgfQoKICB2aXNpdFRyeUZpbmFsbHkoVHJ5RmluYWxseSBub2RlKSB7CiAgICByZXR1cm4gbmV3IFRyeUZpbmFsbHkoY2xvbmUobm9kZS5ib2R5KSwgY2xvbmUobm9kZS5maW5hbGl6ZXIpKTsKICB9CgogIHZpc2l0WWllbGRTdGF0ZW1lbnQoWWllbGRTdGF0ZW1lbnQgbm9kZSkgewogICAgcmV0dXJuIG5ldyBZaWVsZFN0YXRlbWVudChjbG9uZShub2RlLmV4cHJlc3Npb24pKS4uZmxhZ3MgPSBub2RlLmZsYWdzOwogIH0KCiAgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgcmV0dXJuIHZhcmlhYmxlc1tub2RlXSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUubmFtZSwKICAgICAgICBpbml0aWFsaXplcjogY2xvbmVPcHRpb25hbChub2RlLmluaXRpYWxpemVyKSwKICAgICAgICB0eXBlOiB2aXNpdFR5cGUobm9kZS50eXBlKSkKICAgICAgLi5hbm5vdGF0aW9ucyA9IGNsb25lQW5ub3RhdGlvbnMgJiYgIW5vZGUuYW5ub3RhdGlvbnMuaXNFbXB0eQogICAgICAgICAgPyBub2RlLmFubm90YXRpb25zLm1hcChjbG9uZSkudG9MaXN0KCkKICAgICAgICAgIDogY29uc3QgPEV4cHJlc3Npb24+W10KICAgICAgLi5mbGFncyA9IG5vZGUuZmxhZ3MKICAgICAgLi5maWxlRXF1YWxzT2Zmc2V0ID0gX2Nsb25lRmlsZU9mZnNldChub2RlLmZpbGVFcXVhbHNPZmZzZXQpOwogIH0KCiAgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKEZ1bmN0aW9uRGVjbGFyYXRpb24gbm9kZSkgewogICAgdmFyIG5ld1ZhcmlhYmxlID0gY2xvbmUobm9kZS52YXJpYWJsZSk7CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uRGVjbGFyYXRpb24obmV3VmFyaWFibGUsIGNsb25lKG5vZGUuZnVuY3Rpb24pKTsKICB9CgogIC8vIE1lbWJlcnMKICB2aXNpdENvbnN0cnVjdG9yKENvbnN0cnVjdG9yIG5vZGUpIHsKICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3IoY2xvbmUobm9kZS5mdW5jdGlvbiksCiAgICAgICAgbmFtZTogbm9kZS5uYW1lLAogICAgICAgIGlzQ29uc3Q6IG5vZGUuaXNDb25zdCwKICAgICAgICBpc0V4dGVybmFsOiBub2RlLmlzRXh0ZXJuYWwsCiAgICAgICAgaXNTeW50aGV0aWM6IG5vZGUuaXNTeW50aGV0aWMsCiAgICAgICAgaW5pdGlhbGl6ZXJzOiBub2RlLmluaXRpYWxpemVycy5tYXAoY2xvbmUpLnRvTGlzdCgpLAogICAgICAgIHRyYW5zZm9ybWVyRmxhZ3M6IG5vZGUudHJhbnNmb3JtZXJGbGFncywKICAgICAgICBmaWxlVXJpOiBfYWN0aXZlRmlsZVVyaSkKICAgICAgLi5hbm5vdGF0aW9ucyA9IGNsb25lQW5ub3RhdGlvbnMgJiYgIW5vZGUuYW5ub3RhdGlvbnMuaXNFbXB0eQogICAgICAgICAgPyBub2RlLmFubm90YXRpb25zLm1hcChjbG9uZSkudG9MaXN0KCkKICAgICAgICAgIDogY29uc3QgPEV4cHJlc3Npb24+W10KICAgICAgLi5maWxlT2Zmc2V0ID0gX2Nsb25lRmlsZU9mZnNldChub2RlLmZpbGVPZmZzZXQpCiAgICAgIC4uZmlsZUVuZE9mZnNldCA9IF9jbG9uZUZpbGVPZmZzZXQobm9kZS5maWxlRW5kT2Zmc2V0KTsKICB9CgogIHZpc2l0UHJvY2VkdXJlKFByb2NlZHVyZSBub2RlKSB7CiAgICByZXR1cm4gbmV3IFByb2NlZHVyZShub2RlLm5hbWUsIG5vZGUua2luZCwgY2xvbmUobm9kZS5mdW5jdGlvbiksCiAgICAgICAgdHJhbnNmb3JtZXJGbGFnczogbm9kZS50cmFuc2Zvcm1lckZsYWdzLAogICAgICAgIGZpbGVVcmk6IF9hY3RpdmVGaWxlVXJpLAogICAgICAgIGZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXQ6IG5vZGUuZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldCwKICAgICAgICBmb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldDogbm9kZS5mb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldCkKICAgICAgLi5hbm5vdGF0aW9ucyA9IGNsb25lQW5ub3RhdGlvbnMgJiYgIW5vZGUuYW5ub3RhdGlvbnMuaXNFbXB0eQogICAgICAgICAgPyBub2RlLmFubm90YXRpb25zLm1hcChjbG9uZSkudG9MaXN0KCkKICAgICAgICAgIDogY29uc3QgPEV4cHJlc3Npb24+W10KICAgICAgLi5zdGFydEZpbGVPZmZzZXQgPSBfY2xvbmVGaWxlT2Zmc2V0KG5vZGUuc3RhcnRGaWxlT2Zmc2V0KQogICAgICAuLmZpbGVPZmZzZXQgPSBfY2xvbmVGaWxlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCkKICAgICAgLi5maWxlRW5kT2Zmc2V0ID0gX2Nsb25lRmlsZU9mZnNldChub2RlLmZpbGVFbmRPZmZzZXQpCiAgICAgIC4uZmxhZ3MgPSBub2RlLmZsYWdzOwogIH0KCiAgdmlzaXRGaWVsZChGaWVsZCBub2RlKSB7CiAgICByZXR1cm4gbmV3IEZpZWxkKG5vZGUubmFtZSwKICAgICAgICB0eXBlOiB2aXNpdFR5cGUobm9kZS50eXBlKSwKICAgICAgICBpbml0aWFsaXplcjogY2xvbmVPcHRpb25hbChub2RlLmluaXRpYWxpemVyKSwKICAgICAgICBpc0NvdmFyaWFudDogbm9kZS5pc0NvdmFyaWFudCwKICAgICAgICBpc0ZpbmFsOiBub2RlLmlzRmluYWwsCiAgICAgICAgaXNDb25zdDogbm9kZS5pc0NvbnN0LAogICAgICAgIGlzU3RhdGljOiBub2RlLmlzU3RhdGljLAogICAgICAgIGhhc0ltcGxpY2l0R2V0dGVyOiBub2RlLmhhc0ltcGxpY2l0R2V0dGVyLAogICAgICAgIGhhc0ltcGxpY2l0U2V0dGVyOiBub2RlLmhhc0ltcGxpY2l0U2V0dGVyLAogICAgICAgIHRyYW5zZm9ybWVyRmxhZ3M6IG5vZGUudHJhbnNmb3JtZXJGbGFncywKICAgICAgICBmaWxlVXJpOiBfYWN0aXZlRmlsZVVyaSkKICAgICAgLi5hbm5vdGF0aW9ucyA9IGNsb25lQW5ub3RhdGlvbnMgJiYgIW5vZGUuYW5ub3RhdGlvbnMuaXNFbXB0eQogICAgICAgICAgPyBub2RlLmFubm90YXRpb25zLm1hcChjbG9uZSkudG9MaXN0KCkKICAgICAgICAgIDogY29uc3QgPEV4cHJlc3Npb24+W10KICAgICAgLi5maWxlT2Zmc2V0ID0gX2Nsb25lRmlsZU9mZnNldChub2RlLmZpbGVPZmZzZXQpCiAgICAgIC4uZmlsZUVuZE9mZnNldCA9IF9jbG9uZUZpbGVPZmZzZXQobm9kZS5maWxlRW5kT2Zmc2V0KQogICAgICAuLmZsYWdzID0gbm9kZS5mbGFnczsKICB9CgogIHZpc2l0UmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IoUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3Igbm9kZSkgewogICAgcmV0dXJuIG5ldyBSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvcihub2RlLnRhcmdldFJlZmVyZW5jZSwKICAgICAgICBuYW1lOiBub2RlLm5hbWUsCiAgICAgICAgaXNDb25zdDogbm9kZS5pc0NvbnN0LAogICAgICAgIGlzRXh0ZXJuYWw6IG5vZGUuaXNFeHRlcm5hbCwKICAgICAgICB0cmFuc2Zvcm1lckZsYWdzOiBub2RlLnRyYW5zZm9ybWVyRmxhZ3MsCiAgICAgICAgdHlwZUFyZ3VtZW50czogbm9kZS50eXBlQXJndW1lbnRzLm1hcCh2aXNpdFR5cGUpLnRvTGlzdCgpLAogICAgICAgIHR5cGVQYXJhbWV0ZXJzOiBub2RlLnR5cGVQYXJhbWV0ZXJzLm1hcChjbG9uZSkudG9MaXN0KCksCiAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnM6IG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMubWFwKGNsb25lKS50b0xpc3QoKSwKICAgICAgICBuYW1lZFBhcmFtZXRlcnM6IG5vZGUubmFtZWRQYXJhbWV0ZXJzLm1hcChjbG9uZSkudG9MaXN0KCksCiAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogbm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgIGZpbGVVcmk6IF9hY3RpdmVGaWxlVXJpKQogICAgICAuLmFubm90YXRpb25zID0gY2xvbmVBbm5vdGF0aW9ucyAmJiAhbm9kZS5hbm5vdGF0aW9ucy5pc0VtcHR5CiAgICAgICAgICA/IG5vZGUuYW5ub3RhdGlvbnMubWFwKGNsb25lKS50b0xpc3QoKQogICAgICAgICAgOiBjb25zdCA8RXhwcmVzc2lvbj5bXTsKICB9CgogIHZpc2l0VHlwZVBhcmFtZXRlcihUeXBlUGFyYW1ldGVyIG5vZGUpIHsKICAgIFR5cGVQYXJhbWV0ZXIgbmV3Tm9kZSA9IHR5cGVQYXJhbXNbbm9kZV07CiAgICBpZiAobmV3Tm9kZSA9PSBudWxsKSB7CiAgICAgIG5ld05vZGUgPSBuZXcgVHlwZVBhcmFtZXRlcihub2RlLm5hbWUpOwogICAgICB0eXBlU3Vic3RpdHV0aW9uW25vZGVdID0gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlKG5ld05vZGUpOwogICAgfQogICAgbmV3Tm9kZS5ib3VuZCA9IHZpc2l0VHlwZShub2RlLmJvdW5kKTsKICAgIGlmIChub2RlLmRlZmF1bHRUeXBlICE9IG51bGwpIHsKICAgICAgbmV3Tm9kZS5kZWZhdWx0VHlwZSA9IHZpc2l0VHlwZShub2RlLmRlZmF1bHRUeXBlKTsKICAgIH0KICAgIHJldHVybiBuZXdOb2RlCiAgICAgIC4uYW5ub3RhdGlvbnMgPSBjbG9uZUFubm90YXRpb25zICYmICFub2RlLmFubm90YXRpb25zLmlzRW1wdHkKICAgICAgICAgID8gbm9kZS5hbm5vdGF0aW9ucy5tYXAoY2xvbmUpLnRvTGlzdCgpCiAgICAgICAgICA6IGNvbnN0IDxFeHByZXNzaW9uPltdCiAgICAgIC4uZmxhZ3MgPSBub2RlLmZsYWdzOwogIH0KCiAgVHJlZU5vZGUgY2xvbmVGdW5jdGlvbk5vZGVCb2R5KEZ1bmN0aW9uTm9kZSBub2RlKSB7CiAgICBib29sIHNhdmVkQ2xvbmVBbm5vdGF0aW9ucyA9IHRoaXMuY2xvbmVBbm5vdGF0aW9uczsKICAgIHRyeSB7CiAgICAgIHRoaXMuY2xvbmVBbm5vdGF0aW9ucyA9IHRydWU7CiAgICAgIHJldHVybiBjbG9uZU9wdGlvbmFsKG5vZGUuYm9keSk7CiAgICB9IGZpbmFsbHkgewogICAgICB0aGlzLmNsb25lQW5ub3RhdGlvbnMgPSBzYXZlZENsb25lQW5ub3RhdGlvbnM7CiAgICB9CiAgfQoKICB2aXNpdEZ1bmN0aW9uTm9kZShGdW5jdGlvbk5vZGUgbm9kZSkgewogICAgdmFyIHR5cGVQYXJhbWV0ZXJzID0gbm9kZS50eXBlUGFyYW1ldGVycy5tYXAoY2xvbmUpLnRvTGlzdCgpOwogICAgdmFyIHBvc2l0aW9uYWwgPSBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLm1hcChjbG9uZSkudG9MaXN0KCk7CiAgICB2YXIgbmFtZWQgPSBub2RlLm5hbWVkUGFyYW1ldGVycy5tYXAoY2xvbmUpLnRvTGlzdCgpOwogICAgcmV0dXJuIG5ldyBGdW5jdGlvbk5vZGUoY2xvbmVGdW5jdGlvbk5vZGVCb2R5KG5vZGUpLAogICAgICAgIHR5cGVQYXJhbWV0ZXJzOiB0eXBlUGFyYW1ldGVycywKICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyczogcG9zaXRpb25hbCwKICAgICAgICBuYW1lZFBhcmFtZXRlcnM6IG5hbWVkLAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwKICAgICAgICByZXR1cm5UeXBlOiB2aXNpdFR5cGUobm9kZS5yZXR1cm5UeXBlKSwKICAgICAgICBhc3luY01hcmtlcjogbm9kZS5hc3luY01hcmtlciwKICAgICAgICBkYXJ0QXN5bmNNYXJrZXI6IG5vZGUuZGFydEFzeW5jTWFya2VyKQogICAgICAuLmZpbGVPZmZzZXQgPSBfY2xvbmVGaWxlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCkKICAgICAgLi5maWxlRW5kT2Zmc2V0ID0gX2Nsb25lRmlsZU9mZnNldChub2RlLmZpbGVFbmRPZmZzZXQpOwogIH0KCiAgdmlzaXRBcmd1bWVudHMoQXJndW1lbnRzIG5vZGUpIHsKICAgIHJldHVybiBuZXcgQXJndW1lbnRzKG5vZGUucG9zaXRpb25hbC5tYXAoY2xvbmUpLnRvTGlzdCgpLAogICAgICAgIHR5cGVzOiBub2RlLnR5cGVzLm1hcCh2aXNpdFR5cGUpLnRvTGlzdCgpLAogICAgICAgIG5hbWVkOiBub2RlLm5hbWVkLm1hcChjbG9uZSkudG9MaXN0KCkpOwogIH0KCiAgdmlzaXROYW1lZEV4cHJlc3Npb24oTmFtZWRFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgTmFtZWRFeHByZXNzaW9uKG5vZGUubmFtZSwgY2xvbmUobm9kZS52YWx1ZSkpOwogIH0KCiAgZGVmYXVsdEJhc2ljTGl0ZXJhbChCYXNpY0xpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIH0KCiAgZGVmYXVsdEV4cHJlc3Npb24oRXhwcmVzc2lvbiBub2RlKSB7CiAgICB0aHJvdyAnVW5pbXBsZW1lbnRlZCBjbG9uZSBmb3IgS2VybmVsIGV4cHJlc3Npb246ICRub2RlJzsKICB9CgogIGRlZmF1bHRJbml0aWFsaXplcihJbml0aWFsaXplciBub2RlKSB7CiAgICB0aHJvdyAnVW5pbXBsZW1lbnRlZCBjbG9uZSBmb3IgS2VybmVsIGluaXRpYWxpemVyOiAkbm9kZSc7CiAgfQoKICBkZWZhdWx0TWVtYmVyKE1lbWJlciBub2RlKSB7CiAgICB0aHJvdyAnVW5pbXBsZW1lbnRlZCBjbG9uZSBmb3IgS2VybmVsIG1lbWJlcjogJG5vZGUnOwogIH0KCiAgZGVmYXVsdFN0YXRlbWVudChTdGF0ZW1lbnQgbm9kZSkgewogICAgdGhyb3cgJ1VuaW1wbGVtZW50ZWQgY2xvbmUgZm9yIEtlcm5lbCBzdGF0ZW1lbnQ6ICRub2RlJzsKICB9CgogIGRlZmF1bHRUcmVlTm9kZShUcmVlTm9kZSBub2RlKSB7CiAgICB0aHJvdyAnQ2xvbmluZyBLZXJuZWwgbm9uLW1lbWJlcnMgaXMgbm90IHN1cHBvcnRlZC4gICcKICAgICAgICAnVHJpZWQgY2xvbmluZyAkbm9kZSc7CiAgfQoKICB2aXNpdEFzc2VydEluaXRpYWxpemVyKEFzc2VydEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHJldHVybiBuZXcgQXNzZXJ0SW5pdGlhbGl6ZXIoY2xvbmUobm9kZS5zdGF0ZW1lbnQpKTsKICB9CgogIHZpc2l0Q2hlY2tMaWJyYXJ5SXNMb2FkZWQoQ2hlY2tMaWJyYXJ5SXNMb2FkZWQgbm9kZSkgewogICAgcmV0dXJuIG5ldyBDaGVja0xpYnJhcnlJc0xvYWRlZChub2RlLmltcG9ydCk7CiAgfQoKICB2aXNpdENvbWJpbmF0b3IoQ29tYmluYXRvciBub2RlKSB7CiAgICByZXR1cm4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgdmlzaXRGaWVsZEluaXRpYWxpemVyKEZpZWxkSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgcmV0dXJuIG5ldyBGaWVsZEluaXRpYWxpemVyLmJ5UmVmZXJlbmNlKAogICAgICAgIG5vZGUuZmllbGRSZWZlcmVuY2UsIGNsb25lKG5vZGUudmFsdWUpKTsKICB9CgogIHZpc2l0SW5zdGFudGlhdGlvbihJbnN0YW50aWF0aW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgSW5zdGFudGlhdGlvbigKICAgICAgICBjbG9uZShub2RlLmV4cHJlc3Npb24pLCBub2RlLnR5cGVBcmd1bWVudHMubWFwKHZpc2l0VHlwZSkudG9MaXN0KCkpOwogIH0KCiAgdmlzaXRJbnZhbGlkSW5pdGlhbGl6ZXIoSW52YWxpZEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHJldHVybiBuZXcgSW52YWxpZEluaXRpYWxpemVyKCk7CiAgfQoKICB2aXNpdExpYnJhcnlEZXBlbmRlbmN5KExpYnJhcnlEZXBlbmRlbmN5IG5vZGUpIHsKICAgIHJldHVybiBkZWZhdWx0VHJlZU5vZGUobm9kZSk7CiAgfQoKICB2aXNpdExpYnJhcnlQYXJ0KExpYnJhcnlQYXJ0IG5vZGUpIHsKICAgIHJldHVybiBkZWZhdWx0VHJlZU5vZGUobm9kZSk7CiAgfQoKICB2aXNpdExvYWRMaWJyYXJ5KExvYWRMaWJyYXJ5IG5vZGUpIHsKICAgIHJldHVybiBuZXcgTG9hZExpYnJhcnkobm9kZS5pbXBvcnQpOwogIH0KCiAgdmlzaXRMb2NhbEluaXRpYWxpemVyKExvY2FsSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgcmV0dXJuIG5ldyBMb2NhbEluaXRpYWxpemVyKGNsb25lKG5vZGUudmFyaWFibGUpKTsKICB9CgogIHZpc2l0Q29tcG9uZW50KENvbXBvbmVudCBub2RlKSB7CiAgICByZXR1cm4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgdmlzaXRSZWRpcmVjdGluZ0luaXRpYWxpemVyKFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgcmV0dXJuIG5ldyBSZWRpcmVjdGluZ0luaXRpYWxpemVyLmJ5UmVmZXJlbmNlKAogICAgICAgIG5vZGUudGFyZ2V0UmVmZXJlbmNlLCBjbG9uZShub2RlLmFyZ3VtZW50cykpOwogIH0KCiAgdmlzaXRTdXBlckluaXRpYWxpemVyKFN1cGVySW5pdGlhbGl6ZXIgbm9kZSkgewogICAgcmV0dXJuIG5ldyBTdXBlckluaXRpYWxpemVyLmJ5UmVmZXJlbmNlKAogICAgICAgIG5vZGUudGFyZ2V0UmVmZXJlbmNlLCBjbG9uZShub2RlLmFyZ3VtZW50cykpOwogIH0KCiAgdmlzaXRUeXBlZGVmKFR5cGVkZWYgbm9kZSkgewogICAgcmV0dXJuIGRlZmF1bHRUcmVlTm9kZShub2RlKTsKICB9Cn0KCmNsYXNzIENsb25lV2l0aG91dEJvZHkgZXh0ZW5kcyBDbG9uZVZpc2l0b3IgewogIENsb25lV2l0aG91dEJvZHkoCiAgICAgIHtNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHR5cGVTdWJzdGl0dXRpb24sCiAgICAgIGJvb2wgY2xvbmVBbm5vdGF0aW9ucyA9IHRydWV9KQogICAgICA6IHN1cGVyKAogICAgICAgICAgICB0eXBlU3Vic3RpdHV0aW9uOiB0eXBlU3Vic3RpdHV0aW9uLAogICAgICAgICAgICBjbG9uZUFubm90YXRpb25zOiBjbG9uZUFubm90YXRpb25zKTsKCiAgQG92ZXJyaWRlCiAgVHJlZU5vZGUgY2xvbmVGdW5jdGlvbk5vZGVCb2R5KEZ1bmN0aW9uTm9kZSBub2RlKSA9PiBudWxsOwp9CoKOAE5OPBYBIgETHAFMDQRHDyxCNDkuTjc2GQFCBk5RQhA2NCVBSgE1Kk0mKgYQBAEoNQQBJDMEAU5QPhYBTyMpRAQBKDNOLjgpEwQBKiMzTipPKRMEASYvBAEuFQQBLkUEATMwBAEnHEkEASdJBAEnKEkEASdIOwQBMy41BAEzLkgEATEtMwQBMS1GBAEjPAQBI08EATFNPwQBPTNMBAE7MkoEATEtNSAEATsyNSAEARcpBAEzIj0EATtORAQBN0oEATNBNQQBMT81BAExP1EEATFORiwIIR00FSsEASlIBAEpRxwEASsqBAEnMgQBLSEEAR8aBAEbNgQBJ0FMBAElQEwEASU8Ki4gBAEhPQQBLzUEATU5BAE1Iz0EASsqBAElJwQBKyoEAScoBAEnHgQBFywzBAEvRQQBNzwEARs7BAEnQQQBLSEEAS82OTUvBAExOxw3FAQBLTQEAS1IBAEnRQQBKThGPQQBLSwfPSAEAS8wMDY8ECwGIEEEASUoPRcEAT9CBAEnHFEEAS9ABAEhTCgEARs2ODVCBAElRAQBLUsEATdANiREMSEbRAQBNyxHBAENJzEZHyUnPTEhRDEhNz4EASNFMSFDS0QxIUE3PRwEARsgJDYnHx8hMzMxIUQxITc9HAQBS0MZHyUxQ0FNQz0hRDEiBAErLhsuPwYrJDkGE0QxIRwEATY4CiQnEDUGBAEpQkQ6OSgqID0wJy83PgQBIz4zMAQBLz4EASskBAEnPgQBKT8EAR86BAElPQQBIzsfBAEzOQQBOTIEASUiBAExLTEEASseTQQBNSUEATMiBAEnIgQBJykEATE3BAEjIgQBPTM2BAExLTYEAR8iBAIBLhQ2JQ8wMQEMPQIBGXBhY2thZ2U6a2VybmVsL2Nsb25lLmRhcnRCc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2RpbGwvZGlsbF9tZW1iZXJfYnVpbGRlci5kYXJ0il0vLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5kaWxsX21lbWJlcl9idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cgQ29uc3RydWN0b3IsIEZpZWxkLCBNZW1iZXIsIFByb2NlZHVyZSwgUHJvY2VkdXJlS2luZDsKCmltcG9ydCAnLi4va2VybmVsL2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgRGVjbGFyYXRpb24sCiAgICAgICAgTWVtYmVyQnVpbGRlciwKICAgICAgICBpc1JlZGlyZWN0aW5nR2VuZXJhdGl2ZUNvbnN0cnVjdG9ySW1wbGVtZW50YXRpb247CgppbXBvcnQgJy4uL21vZGlmaWVyLmRhcnQnCiAgICBzaG93IGFic3RyYWN0TWFzaywgY29uc3RNYXNrLCBleHRlcm5hbE1hc2ssIGZpbmFsTWFzaywgc3RhdGljTWFzazsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyB1bmhhbmRsZWQ7CgpjbGFzcyBEaWxsTWVtYmVyQnVpbGRlciBleHRlbmRzIE1lbWJlckJ1aWxkZXIgewogIGZpbmFsIGludCBtb2RpZmllcnM7CgogIGZpbmFsIE1lbWJlciBtZW1iZXI7CgogIERpbGxNZW1iZXJCdWlsZGVyKE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uIHBhcmVudCkKICAgICAgOiBtb2RpZmllcnMgPSBjb21wdXRlTW9kaWZpZXJzKG1lbWJlciksCiAgICAgICAgbWVtYmVyID0gbWVtYmVyLAogICAgICAgIHN1cGVyKHBhcmVudCwgbWVtYmVyLmZpbGVPZmZzZXQpOwoKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiRGlsbE1lbWJlckJ1aWxkZXIiOwoKICBNZW1iZXIgZ2V0IHRhcmdldCA9PiBtZW1iZXI7CgogIFN0cmluZyBnZXQgbmFtZSA9PiBtZW1iZXIubmFtZS5uYW1lOwoKICBib29sIGdldCBpc0NvbnN0cnVjdG9yID0+IG1lbWJlciBpcyBDb25zdHJ1Y3RvcjsKCiAgUHJvY2VkdXJlS2luZCBnZXQga2luZCB7CiAgICBmaW5hbCBtZW1iZXIgPSB0aGlzLm1lbWJlcjsKICAgIHJldHVybiBtZW1iZXIgaXMgUHJvY2VkdXJlID8gbWVtYmVyLmtpbmQgOiBudWxsOwogIH0KCiAgYm9vbCBnZXQgaXNSZWd1bGFyTWV0aG9kID0+IGlkZW50aWNhbChQcm9jZWR1cmVLaW5kLk1ldGhvZCwga2luZCk7CgogIGJvb2wgZ2V0IGlzR2V0dGVyID0+IGlkZW50aWNhbChQcm9jZWR1cmVLaW5kLkdldHRlciwga2luZCk7CgogIGJvb2wgZ2V0IGlzU2V0dGVyID0+IGlkZW50aWNhbChQcm9jZWR1cmVLaW5kLlNldHRlciwga2luZCk7CgogIGJvb2wgZ2V0IGlzT3BlcmF0b3IgPT4gaWRlbnRpY2FsKFByb2NlZHVyZUtpbmQuT3BlcmF0b3IsIGtpbmQpOwoKICBib29sIGdldCBpc0ZhY3RvcnkgPT4gaWRlbnRpY2FsKFByb2NlZHVyZUtpbmQuRmFjdG9yeSwga2luZCk7CgogIGJvb2wgZ2V0IGlzUmVkaXJlY3RpbmdHZW5lcmF0aXZlQ29uc3RydWN0b3IgewogICAgcmV0dXJuIGlzQ29uc3RydWN0b3IgJiYKICAgICAgICBpc1JlZGlyZWN0aW5nR2VuZXJhdGl2ZUNvbnN0cnVjdG9ySW1wbGVtZW50YXRpb24obWVtYmVyKTsKICB9CgogIGJvb2wgZ2V0IGlzU3ludGhldGljIHsKICAgIC8vIFRPRE8oYWhlKTogS2VybmVsIHNob3VsZCBldmVudHVhbGx5IHN1cHBvcnQgYSBzeW50aGV0aWMgYml0LgogICAgcmV0dXJuIGlzQ29uc3RydWN0b3IgJiYKICAgICAgICBuYW1lID09ICIiICYmCiAgICAgICAgKGNoYXJPZmZzZXQgPT0gcGFyZW50LmNoYXJPZmZzZXQgfHwgY2hhck9mZnNldCA9PSAtMSk7CiAgfQoKICBib29sIGdldCBpc0ZpZWxkID0+IG1lbWJlciBpcyBGaWVsZDsKfQoKaW50IGNvbXB1dGVNb2RpZmllcnMoTWVtYmVyIG1lbWJlcikgewogIGludCBtb2RpZmllciA9IG1lbWJlci5pc0Fic3RyYWN0ID8gYWJzdHJhY3RNYXNrIDogMDsKICBtb2RpZmllciB8PSBtZW1iZXIuaXNFeHRlcm5hbCA/IGV4dGVybmFsTWFzayA6IDA7CiAgaWYgKG1lbWJlciBpcyBGaWVsZCkgewogICAgbW9kaWZpZXIgfD0gbWVtYmVyLmlzQ29uc3QgPyBjb25zdE1hc2sgOiAwOwogICAgbW9kaWZpZXIgfD0gbWVtYmVyLmlzRmluYWwgPyBmaW5hbE1hc2sgOiAwOwogICAgbW9kaWZpZXIgfD0gbWVtYmVyLmlzU3RhdGljID8gc3RhdGljTWFzayA6IDA7CiAgfSBlbHNlIGlmIChtZW1iZXIgaXMgUHJvY2VkdXJlKSB7CiAgICBtb2RpZmllciB8PSBtZW1iZXIuaXNDb25zdCA/IGNvbnN0TWFzayA6IDA7CiAgICBtb2RpZmllciB8PSBtZW1iZXIuaXNTdGF0aWMgPyBzdGF0aWNNYXNrIDogMDsKICB9IGVsc2UgaWYgKG1lbWJlciBpcyBDb25zdHJ1Y3RvcikgewogICAgbW9kaWZpZXIgfD0gbWVtYmVyLmlzQ29uc3QgPyBjb25zdE1hc2sgOiAwOwogIH0gZWxzZSB7CiAgICBkeW5hbWljIHBhcmVudCA9IG1lbWJlci5wYXJlbnQ7CiAgICB1bmhhbmRsZWQoIiR7bWVtYmVyLnJ1bnRpbWVUeXBlfSIsICJjb21wdXRlTW9kaWZpZXJzIiwgbWVtYmVyLmZpbGVPZmZzZXQsCiAgICAgICAgVXJpLmJhc2UucmVzb2x2ZShwYXJlbnQuZmlsZVVyaSkpOwogIH0KICByZXR1cm4gbW9kaWZpZXI7Cn0KWQBOTjwBIwEhPwEnCRUXOgEaRwEqATAXARcBNy4ZKgEvAR8BJwEzARsgNQQBRQE+AT4BQgFAATAcQgQBGUQcFj8EAScCASY3NBkwMDIkMDImMAskTisEEwIBOXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9kaWxsL2RpbGxfbWVtYmVyX2J1aWxkZXIuZGFydC9zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvc2NvcGUuZGFydLaFLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuc2NvcGU7CgppbXBvcnQgJ2J1aWxkZXIvYnVpbGRlci5kYXJ0JwogICAgc2hvdyBEZWNsYXJhdGlvbiwgTmFtZUl0ZXJhdG9yLCBUeXBlVmFyaWFibGVCdWlsZGVyOwoKaW1wb3J0ICdmYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIExvY2F0ZWRNZXNzYWdlLAogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgbWVzc2FnZUludGVybmFsUHJvYmxlbUV4dGVuZGluZ1VubW9kaWZpYWJsZVNjb3BlLAogICAgICAgIHRlbXBsYXRlQWNjZXNzRXJyb3IsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2UsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkTmFtZVByZXZpb3VzbHlVc2VkQ2F1c2U7CgppbXBvcnQgJ3Byb2JsZW1zLmRhcnQnIHNob3cgaW50ZXJuYWxQcm9ibGVtLCB1bnN1cHBvcnRlZDsKCmNsYXNzIE11dGFibGVTY29wZSB7CiAgLy8vIE5hbWVzIGRlY2xhcmVkIGluIHRoaXMgc2NvcGUuCiAgTWFwPFN0cmluZywgRGVjbGFyYXRpb24+IGxvY2FsOwoKICAvLy8gU2V0dGVycyBkZWNsYXJlZCBpbiB0aGlzIHNjb3BlLgogIE1hcDxTdHJpbmcsIERlY2xhcmF0aW9uPiBzZXR0ZXJzOwoKICAvLy8gVGhlIHNjb3BlIHRoYXQgdGhpcyBzY29wZSBpcyBuZXN0ZWQgd2l0aGluLCBvciBgbnVsbGAgaWYgdGhpcyBpcyB0aGUgdG9wCiAgLy8vIGxldmVsIHNjb3BlLgogIFNjb3BlIHBhcmVudDsKCiAgZmluYWwgU3RyaW5nIGNsYXNzTmFtZU9yRGVidWdOYW1lOwoKICBNdXRhYmxlU2NvcGUoCiAgICAgIHRoaXMubG9jYWwsIHRoaXMuc2V0dGVycywgdGhpcy5wYXJlbnQsIHRoaXMuY2xhc3NOYW1lT3JEZWJ1Z05hbWUpIHsKICAgIGFzc2VydChjbGFzc05hbWVPckRlYnVnTmFtZSAhPSBudWxsKTsKICB9CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJTY29wZSgkY2xhc3NOYW1lT3JEZWJ1Z05hbWUsICR7bG9jYWwua2V5c30pIjsKfQoKY2xhc3MgU2NvcGUgZXh0ZW5kcyBNdXRhYmxlU2NvcGUgewogIC8vLyBJbmRpY2F0ZXMgd2hldGhlciBhbiBhdHRlbXB0IHRvIGRlY2xhcmUgbmV3IG5hbWVzIGluIHRoaXMgc2NvcGUgc2hvdWxkCiAgLy8vIHN1Y2NlZWQuCiAgZmluYWwgYm9vbCBpc01vZGlmaWFibGU7CgogIE1hcDxTdHJpbmcsIERlY2xhcmF0aW9uPiBsYWJlbHM7CgogIE1hcDxTdHJpbmcsIERlY2xhcmF0aW9uPiBmb3J3YXJkRGVjbGFyZWRMYWJlbHM7CgogIE1hcDxTdHJpbmcsIGludD4gdXNlZE5hbWVzOwoKICBTY29wZShNYXA8U3RyaW5nLCBEZWNsYXJhdGlvbj4gbG9jYWwsIE1hcDxTdHJpbmcsIERlY2xhcmF0aW9uPiBzZXR0ZXJzLAogICAgICBTY29wZSBwYXJlbnQsIFN0cmluZyBkZWJ1Z05hbWUsIHt0aGlzLmlzTW9kaWZpYWJsZTogdHJ1ZX0pCiAgICAgIDogc3VwZXIobG9jYWwsIHNldHRlcnMgPSBzZXR0ZXJzID8/IGNvbnN0IDxTdHJpbmcsIERlY2xhcmF0aW9uPnt9LCBwYXJlbnQsCiAgICAgICAgICAgIGRlYnVnTmFtZSk7CgogIFNjb3BlLnRvcCh7Ym9vbCBpc01vZGlmaWFibGU6IGZhbHNlfSkKICAgICAgOiB0aGlzKDxTdHJpbmcsIERlY2xhcmF0aW9uPnt9LCA8U3RyaW5nLCBEZWNsYXJhdGlvbj57fSwgbnVsbCwgInRvcCIsCiAgICAgICAgICAgIGlzTW9kaWZpYWJsZTogaXNNb2RpZmlhYmxlKTsKCiAgU2NvcGUuaW1tdXRhYmxlKCkKICAgICAgOiB0aGlzKGNvbnN0IDxTdHJpbmcsIERlY2xhcmF0aW9uPnt9LCBjb25zdCA8U3RyaW5nLCBEZWNsYXJhdGlvbj57fSwgbnVsbCwKICAgICAgICAgICAgImltbXV0YWJsZSIsCiAgICAgICAgICAgIGlzTW9kaWZpYWJsZTogZmFsc2UpOwoKICBTY29wZS5uZXN0ZWQoU2NvcGUgcGFyZW50LCBTdHJpbmcgZGVidWdOYW1lLCB7Ym9vbCBpc01vZGlmaWFibGU6IHRydWV9KQogICAgICA6IHRoaXMoCiAgICAgICAgICAgIDxTdHJpbmcsIERlY2xhcmF0aW9uPnt9LCA8U3RyaW5nLCBEZWNsYXJhdGlvbj57fSwgcGFyZW50LCBkZWJ1Z05hbWUsCiAgICAgICAgICAgIGlzTW9kaWZpYWJsZTogaXNNb2RpZmlhYmxlKTsKCiAgSXRlcmF0b3I8RGVjbGFyYXRpb24+IGdldCBpdGVyYXRvciB7CiAgICByZXR1cm4gbmV3IFNjb3BlTG9jYWxEZWNsYXJhdGlvbkl0ZXJhdG9yKHRoaXMpOwogIH0KCiAgTmFtZUl0ZXJhdG9yIGdldCBuYW1lSXRlcmF0b3IgewogICAgcmV0dXJuIG5ldyBTY29wZUxvY2FsRGVjbGFyYXRpb25OYW1lSXRlcmF0b3IodGhpcyk7CiAgfQoKICBTY29wZSBjb3B5V2l0aFBhcmVudChTY29wZSBwYXJlbnQsIFN0cmluZyBkZWJ1Z05hbWUpIHsKICAgIHJldHVybiBuZXcgU2NvcGUoc3VwZXIubG9jYWwsIHN1cGVyLnNldHRlcnMsIHBhcmVudCwgZGVidWdOYW1lLAogICAgICAgIGlzTW9kaWZpYWJsZTogaXNNb2RpZmlhYmxlKTsKICB9CgogIC8vLyBEb24ndCB1c2UgdGhpcy4gVXNlIFtiZWNvbWVQYXJ0T2ZdIGluc3RlYWQuCiAgdm9pZCBzZXQgbG9jYWwoXykgPT4gdW5zdXBwb3J0ZWQoImxvY2FsPSIsIC0xLCBudWxsKTsKCiAgLy8vIERvbid0IHVzZSB0aGlzLiBVc2UgW2JlY29tZVBhcnRPZl0gaW5zdGVhZC4KICB2b2lkIHNldCBzZXR0ZXJzKF8pID0+IHVuc3VwcG9ydGVkKCJzZXR0ZXJzPSIsIC0xLCBudWxsKTsKCiAgLy8vIERvbid0IHVzZSB0aGlzLiBVc2UgW2JlY29tZVBhcnRPZl0gaW5zdGVhZC4KICB2b2lkIHNldCBwYXJlbnQoXykgPT4gdW5zdXBwb3J0ZWQoInBhcmVudD0iLCAtMSwgbnVsbCk7CgogIC8vLyBUaGlzIHNjb3BlIGJlY29tZXMgZXF1aXZhbGVudCB0byBbc2NvcGVdLiBUaGlzIGlzIHVzZWQgZm9yIHBhcnRzIHRvCiAgLy8vIGJlY29tZSBwYXJ0IG9mIHRoZWlyIGxpYnJhcnkncyBzY29wZS4KICB2b2lkIGJlY29tZVBhcnRPZihTY29wZSBzY29wZSkgewogICAgYXNzZXJ0KHBhcmVudC5wYXJlbnQgPT0gbnVsbCk7CiAgICBhc3NlcnQoc2NvcGUucGFyZW50LnBhcmVudCA9PSBudWxsKTsKICAgIHN1cGVyLmxvY2FsID0gc2NvcGUubG9jYWw7CiAgICBzdXBlci5zZXR0ZXJzID0gc2NvcGUuc2V0dGVyczsKICAgIHN1cGVyLnBhcmVudCA9IHNjb3BlLnBhcmVudDsKICB9CgogIFNjb3BlIGNyZWF0ZU5lc3RlZFNjb3BlKFN0cmluZyBkZWJ1Z05hbWUsIHtib29sIGlzTW9kaWZpYWJsZTogdHJ1ZX0pIHsKICAgIHJldHVybiBuZXcgU2NvcGUubmVzdGVkKHRoaXMsIGRlYnVnTmFtZSwgaXNNb2RpZmlhYmxlOiBpc01vZGlmaWFibGUpOwogIH0KCiAgU2NvcGUgd2l0aFR5cGVWYXJpYWJsZXMoTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzKSB7CiAgICBpZiAodHlwZVZhcmlhYmxlcyA9PSBudWxsKSByZXR1cm4gdGhpczsKICAgIFNjb3BlIG5ld1Njb3BlID0KICAgICAgICBuZXcgU2NvcGUubmVzdGVkKHRoaXMsICJ0eXBlIHZhcmlhYmxlcyIsIGlzTW9kaWZpYWJsZTogZmFsc2UpOwogICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIHQgaW4gdHlwZVZhcmlhYmxlcykgewogICAgICBuZXdTY29wZS5sb2NhbFt0Lm5hbWVdID0gdDsKICAgIH0KICAgIHJldHVybiBuZXdTY29wZTsKICB9CgogIC8vLyBDcmVhdGUgYSBzcGVjaWFsIHNjb3BlIGZvciB1c2UgYnkgbGFiZWxlZCBzdGFtZW50cy4gVGhpcyBzY29wZSBkb2Vzbid0CiAgLy8vIGludHJvZHVjZSBhIG5ldyBzY29wZSBmb3IgbG9jYWwgdmFyaWFibGVzLCBvbmx5IGZvciBsYWJlbHMuIFRoaXMgZGVhbHMKICAvLy8gd2l0aCBjb3JuZXIgY2FzZXMgbGlrZSB0aGlzOgogIC8vLwogIC8vLyAgICAgTDogdmFyIHg7CiAgLy8vICAgICB4ID0gNDI7CiAgLy8vICAgICBwcmludCgiVGhlIGFuc3dlciBpcyAkeC4iKTsKICBTY29wZSBjcmVhdGVOZXN0ZWRMYWJlbFNjb3BlKCkgewogICAgcmV0dXJuIG5ldyBTY29wZShsb2NhbCwgc2V0dGVycywgcGFyZW50LCAibGFiZWwiLCBpc01vZGlmaWFibGU6IHRydWUpOwogIH0KCiAgdm9pZCByZWNvcmRVc2UoU3RyaW5nIG5hbWUsIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSkgewogICAgaWYgKGlzTW9kaWZpYWJsZSkgewogICAgICB1c2VkTmFtZXMgPz89IDxTdHJpbmcsIGludD57fTsKICAgICAgdXNlZE5hbWVzLnB1dElmQWJzZW50KG5hbWUsICgpID0+IGNoYXJPZmZzZXQpOwogICAgfQogIH0KCiAgRGVjbGFyYXRpb24gbG9va3VwSW4oU3RyaW5nIG5hbWUsIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSwKICAgICAgTWFwPFN0cmluZywgRGVjbGFyYXRpb24+IG1hcCwgYm9vbCBpc0luc3RhbmNlU2NvcGUpIHsKICAgIERlY2xhcmF0aW9uIGJ1aWxkZXIgPSBtYXBbbmFtZV07CiAgICBpZiAoYnVpbGRlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGlmIChidWlsZGVyLm5leHQgIT0gbnVsbCkgewogICAgICByZXR1cm4gbmV3IEFtYmlndW91c0J1aWxkZXIobmFtZS5pc0VtcHR5ID8gY2xhc3NOYW1lT3JEZWJ1Z05hbWUgOiBuYW1lLAogICAgICAgICAgYnVpbGRlciwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICB9IGVsc2UgaWYgKCFpc0luc3RhbmNlU2NvcGUgJiYgYnVpbGRlci5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGJ1aWxkZXI7CiAgICB9CiAgfQoKICBEZWNsYXJhdGlvbiBsb29rdXAoU3RyaW5nIG5hbWUsIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSwKICAgICAge2Jvb2wgaXNJbnN0YW5jZVNjb3BlOiB0cnVlfSkgewogICAgcmVjb3JkVXNlKG5hbWUsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgRGVjbGFyYXRpb24gYnVpbGRlciA9CiAgICAgICAgbG9va3VwSW4obmFtZSwgY2hhck9mZnNldCwgZmlsZVVyaSwgbG9jYWwsIGlzSW5zdGFuY2VTY29wZSk7CiAgICBpZiAoYnVpbGRlciAhPSBudWxsKSByZXR1cm4gYnVpbGRlcjsKICAgIGJ1aWxkZXIgPSBsb29rdXBJbihuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpLCBzZXR0ZXJzLCBpc0luc3RhbmNlU2NvcGUpOwogICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCAmJiAhYnVpbGRlci5oYXNQcm9ibGVtKSB7CiAgICAgIHJldHVybiBuZXcgQWNjZXNzRXJyb3JCdWlsZGVyKG5hbWUsIGJ1aWxkZXIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgfQogICAgaWYgKCFpc0luc3RhbmNlU2NvcGUpIHsKICAgICAgLy8gRm9yIHN0YXRpYyBsb29rdXAsIGRvIG5vdCBzZWFjaCB0aGUgcGFyZW50IHNjb3BlLgogICAgICByZXR1cm4gYnVpbGRlcjsKICAgIH0KICAgIHJldHVybiBidWlsZGVyID8/IHBhcmVudD8ubG9va3VwKG5hbWUsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogIH0KCiAgRGVjbGFyYXRpb24gbG9va3VwU2V0dGVyKFN0cmluZyBuYW1lLCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmksCiAgICAgIHtib29sIGlzSW5zdGFuY2VTY29wZTogdHJ1ZX0pIHsKICAgIHJlY29yZFVzZShuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgIERlY2xhcmF0aW9uIGJ1aWxkZXIgPQogICAgICAgIGxvb2t1cEluKG5hbWUsIGNoYXJPZmZzZXQsIGZpbGVVcmksIHNldHRlcnMsIGlzSW5zdGFuY2VTY29wZSk7CiAgICBpZiAoYnVpbGRlciAhPSBudWxsKSByZXR1cm4gYnVpbGRlcjsKICAgIGJ1aWxkZXIgPSBsb29rdXBJbihuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpLCBsb2NhbCwgaXNJbnN0YW5jZVNjb3BlKTsKICAgIGlmIChidWlsZGVyICE9IG51bGwgJiYgIWJ1aWxkZXIuaGFzUHJvYmxlbSkgewogICAgICByZXR1cm4gbmV3IEFjY2Vzc0Vycm9yQnVpbGRlcihuYW1lLCBidWlsZGVyLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgIH0KICAgIGlmICghaXNJbnN0YW5jZVNjb3BlKSB7CiAgICAgIC8vIEZvciBzdGF0aWMgbG9va3VwLCBkbyBub3Qgc2VhY2ggdGhlIHBhcmVudCBzY29wZS4KICAgICAgcmV0dXJuIGJ1aWxkZXI7CiAgICB9CiAgICByZXR1cm4gYnVpbGRlciA/PyBwYXJlbnQ/Lmxvb2t1cFNldHRlcihuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICB9CgogIGJvb2wgaGFzTG9jYWxMYWJlbChTdHJpbmcgbmFtZSkgPT4gbGFiZWxzICE9IG51bGwgJiYgbGFiZWxzLmNvbnRhaW5zS2V5KG5hbWUpOwoKICB2b2lkIGRlY2xhcmVMYWJlbChTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gdGFyZ2V0KSB7CiAgICBpZiAoaXNNb2RpZmlhYmxlKSB7CiAgICAgIGxhYmVscyA/Pz0gPFN0cmluZywgRGVjbGFyYXRpb24+e307CiAgICAgIGxhYmVsc1tuYW1lXSA9IHRhcmdldDsKICAgIH0gZWxzZSB7CiAgICAgIGludGVybmFsUHJvYmxlbSgKICAgICAgICAgIG1lc3NhZ2VJbnRlcm5hbFByb2JsZW1FeHRlbmRpbmdVbm1vZGlmaWFibGVTY29wZSwgLTEsIG51bGwpOwogICAgfQogIH0KCiAgdm9pZCBmb3J3YXJkRGVjbGFyZUxhYmVsKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiB0YXJnZXQpIHsKICAgIGRlY2xhcmVMYWJlbChuYW1lLCB0YXJnZXQpOwogICAgZm9yd2FyZERlY2xhcmVkTGFiZWxzID8/PSA8U3RyaW5nLCBEZWNsYXJhdGlvbj57fTsKICAgIGZvcndhcmREZWNsYXJlZExhYmVsc1tuYW1lXSA9IHRhcmdldDsKICB9CgogIGJvb2wgY2xhaW1MYWJlbChTdHJpbmcgbmFtZSkgewogICAgaWYgKGZvcndhcmREZWNsYXJlZExhYmVscyA9PSBudWxsIHx8CiAgICAgICAgZm9yd2FyZERlY2xhcmVkTGFiZWxzLnJlbW92ZShuYW1lKSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoZm9yd2FyZERlY2xhcmVkTGFiZWxzLmxlbmd0aCA9PSAwKSB7CiAgICAgIGZvcndhcmREZWNsYXJlZExhYmVscyA9IG51bGw7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIE1hcDxTdHJpbmcsIERlY2xhcmF0aW9uPiBnZXQgdW5jbGFpbWVkRm9yd2FyZERlY2xhcmF0aW9ucyB7CiAgICByZXR1cm4gZm9yd2FyZERlY2xhcmVkTGFiZWxzOwogIH0KCiAgRGVjbGFyYXRpb24gbG9va3VwTGFiZWwoU3RyaW5nIG5hbWUpIHsKICAgIHJldHVybiAobGFiZWxzID09IG51bGwgPyBudWxsIDogbGFiZWxzW25hbWVdKSA/PyBwYXJlbnQ/Lmxvb2t1cExhYmVsKG5hbWUpOwogIH0KCiAgLy8vIERlY2xhcmVzIHRoYXQgdGhlIG1lYW5pbmcgb2YgW25hbWVdIGluIHRoaXMgc2NvcGUgaXMgW2J1aWxkZXJdLgogIC8vLwogIC8vLyBJZiBuYW1lIHdhcyB1c2VkIHByZXZpb3VzbHkgaW4gdGhpcyBzY29wZSwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG1lc3NhZ2UKICAvLy8gdGhhdCBjYW4gYmUgdXNlZCBhcyBjb250ZXh0IGZvciByZXBvcnRpbmcgYSBjb21waWxlLXRpbWUgZXJyb3IgYWJvdXQKICAvLy8gW25hbWVdIGJlaW5nIHVzZWQgYmVmb3JlIGl0cyBkZWNsYXJlZC4gW2ZpbGVVcmldIGlzIHVzZWQgdG8gYmluZCB0aGUKICAvLy8gbG9jYXRpb24gb2YgdGhpcyBtZXNzYWdlLgogIExvY2F0ZWRNZXNzYWdlIGRlY2xhcmUoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIGJ1aWxkZXIsIFVyaSBmaWxlVXJpKSB7CiAgICBpZiAoaXNNb2RpZmlhYmxlKSB7CiAgICAgIGlmICh1c2VkTmFtZXM/LmNvbnRhaW5zS2V5KG5hbWUpID8/IGZhbHNlKSB7CiAgICAgICAgcmV0dXJuIHRlbXBsYXRlRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZENhdXNlCiAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUpCiAgICAgICAgICAgIC53aXRoTG9jYXRpb24oZmlsZVVyaSwgdXNlZE5hbWVzW25hbWVdLCBuYW1lLmxlbmd0aCk7CiAgICAgIH0KICAgICAgbG9jYWxbbmFtZV0gPSBidWlsZGVyOwogICAgfSBlbHNlIHsKICAgICAgaW50ZXJuYWxQcm9ibGVtKAogICAgICAgICAgbWVzc2FnZUludGVybmFsUHJvYmxlbUV4dGVuZGluZ1VubW9kaWZpYWJsZVNjb3BlLCAtMSwgbnVsbCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgbWVyZ2UoCiAgICAgIFNjb3BlIHNjb3BlLAogICAgICBEZWNsYXJhdGlvbiBjb21wdXRlQW1iaWd1b3VzRGVjbGFyYXRpb24oCiAgICAgICAgICBTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gZXhpc3RpbmcsIERlY2xhcmF0aW9uIG1lbWJlcikpIHsKICAgIE1hcDxTdHJpbmcsIERlY2xhcmF0aW9uPiBtYXAgPSBsb2NhbDsKCiAgICB2b2lkIG1lcmdlTWVtYmVyKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBtZW1iZXIpIHsKICAgICAgRGVjbGFyYXRpb24gZXhpc3RpbmcgPSBtYXBbbmFtZV07CiAgICAgIGlmIChleGlzdGluZyAhPSBudWxsKSB7CiAgICAgICAgaWYgKGV4aXN0aW5nICE9IG1lbWJlcikgewogICAgICAgICAgbWVtYmVyID0gY29tcHV0ZUFtYmlndW91c0RlY2xhcmF0aW9uKG5hbWUsIGV4aXN0aW5nLCBtZW1iZXIpOwogICAgICAgIH0KICAgICAgfQogICAgICBtYXBbbmFtZV0gPSBtZW1iZXI7CiAgICB9CgogICAgc2NvcGUubG9jYWwuZm9yRWFjaChtZXJnZU1lbWJlcik7CiAgICBtYXAgPSBzZXR0ZXJzOwogICAgc2NvcGUuc2V0dGVycy5mb3JFYWNoKG1lcmdlTWVtYmVyKTsKICB9CgogIHZvaWQgZm9yRWFjaChmKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBtZW1iZXIpKSB7CiAgICBsb2NhbC5mb3JFYWNoKGYpOwogICAgc2V0dGVycy5mb3JFYWNoKGYpOwogIH0KCiAgU3RyaW5nIGdldCBkZWJ1Z1N0cmluZyB7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgaW50IG5lc3RpbmdMZXZlbCA9IHdyaXRlT24oYnVmZmVyKTsKICAgIGZvciAoaW50IGkgPSBuZXN0aW5nTGV2ZWw7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGJ1ZmZlci53cml0ZWxuKCIkeycgICcgKiBpfX0iKTsKICAgIH0KICAgIHJldHVybiAiJGJ1ZmZlciI7CiAgfQoKICBpbnQgd3JpdGVPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIGludCBuZXN0aW5nTGV2ZWwgPSAocGFyZW50Py53cml0ZU9uKHNpbmspID8/IC0xKSArIDE7CiAgICBTdHJpbmcgaW5kZW50ID0gIiAgIiAqIG5lc3RpbmdMZXZlbDsKICAgIHNpbmsud3JpdGVsbigiJGluZGVudHsiKTsKICAgIGxvY2FsLmZvckVhY2goKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBtZW1iZXIpIHsKICAgICAgc2luay53cml0ZWxuKCIkaW5kZW50ICAkbmFtZSIpOwogICAgfSk7CiAgICBzZXR0ZXJzLmZvckVhY2goKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBtZW1iZXIpIHsKICAgICAgc2luay53cml0ZWxuKCIkaW5kZW50ICAkbmFtZT0iKTsKICAgIH0pOwogICAgcmV0dXJuIG5lc3RpbmdMZXZlbDsKICB9CgogIFNjb3BlIGNvbXB1dGVNaXhpblNjb3BlKCkgewogICAgTGlzdDxTdHJpbmc+IG5hbWVzID0gdGhpcy5sb2NhbC5rZXlzLnRvTGlzdCgpOwogICAgTWFwPFN0cmluZywgRGVjbGFyYXRpb24+IGxvY2FsID0gPFN0cmluZywgRGVjbGFyYXRpb24+e307CiAgICBib29sIG5lZWRzQ29weSA9IGZhbHNlOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewogICAgICBTdHJpbmcgbmFtZSA9IG5hbWVzW2ldOwogICAgICBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IHRoaXMubG9jYWxbbmFtZV07CiAgICAgIGlmIChkZWNsYXJhdGlvbi5pc1N0YXRpYykgewogICAgICAgIG5lZWRzQ29weSA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbG9jYWxbbmFtZV0gPSBkZWNsYXJhdGlvbjsKICAgICAgfQogICAgfQogICAgbmFtZXMgPSB0aGlzLnNldHRlcnMua2V5cy50b0xpc3QoKTsKICAgIE1hcDxTdHJpbmcsIERlY2xhcmF0aW9uPiBzZXR0ZXJzID0gPFN0cmluZywgRGVjbGFyYXRpb24+e307CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIFN0cmluZyBuYW1lID0gbmFtZXNbaV07CiAgICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gdGhpcy5zZXR0ZXJzW25hbWVdOwogICAgICBpZiAoZGVjbGFyYXRpb24uaXNTdGF0aWMpIHsKICAgICAgICBuZWVkc0NvcHkgPSB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHNldHRlcnNbbmFtZV0gPSBkZWNsYXJhdGlvbjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5lZWRzQ29weQogICAgICAgID8gbmV3IFNjb3BlKGxvY2FsLCBzZXR0ZXJzLCBwYXJlbnQsIGNsYXNzTmFtZU9yRGVidWdOYW1lLAogICAgICAgICAgICBpc01vZGlmaWFibGU6IGlzTW9kaWZpYWJsZSkKICAgICAgICA6IHRoaXM7CiAgfQp9CgpjbGFzcyBTY29wZUJ1aWxkZXIgewogIGZpbmFsIFNjb3BlIHNjb3BlOwoKICBTY29wZUJ1aWxkZXIodGhpcy5zY29wZSk7CgogIHZvaWQgYWRkTWVtYmVyKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBidWlsZGVyKSB7CiAgICBzY29wZS5sb2NhbFtuYW1lXSA9IGJ1aWxkZXI7CiAgfQoKICB2b2lkIGFkZFNldHRlcihTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gYnVpbGRlcikgewogICAgc2NvcGUuc2V0dGVyc1tuYW1lXSA9IGJ1aWxkZXI7CiAgfQoKICBEZWNsYXJhdGlvbiBvcGVyYXRvciBbXShTdHJpbmcgbmFtZSkgPT4gc2NvcGUubG9jYWxbbmFtZV07Cn0KCmFic3RyYWN0IGNsYXNzIFByb2JsZW1CdWlsZGVyIGV4dGVuZHMgRGVjbGFyYXRpb24gewogIGZpbmFsIFN0cmluZyBuYW1lOwoKICBmaW5hbCBEZWNsYXJhdGlvbiBidWlsZGVyOwoKICBmaW5hbCBpbnQgY2hhck9mZnNldDsKCiAgZmluYWwgVXJpIGZpbGVVcmk7CgogIFByb2JsZW1CdWlsZGVyKHRoaXMubmFtZSwgdGhpcy5idWlsZGVyLCB0aGlzLmNoYXJPZmZzZXQsIHRoaXMuZmlsZVVyaSk7CgogIGdldCB0YXJnZXQgPT4gbnVsbDsKCiAgYm9vbCBnZXQgaGFzUHJvYmxlbSA9PiB0cnVlOwoKICBNZXNzYWdlIGdldCBtZXNzYWdlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGZ1bGxOYW1lRm9yRXJyb3JzID0+IG5hbWU7Cn0KCi8vLyBSZXByZXNlbnRzIGEgW2J1aWxkZXJdIHRoYXQncyBiZWluZyBhY2Nlc3NlZCBpbmNvcnJlY3RseS4gRm9yIGV4YW1wbGUsIGFuCi8vLyBhdHRlbXB0IHRvIHdyaXRlIHRvIGEgZmluYWwgZmllbGQsIG9yIHRvIHJlYWQgZnJvbSBhIHNldHRlci4KY2xhc3MgQWNjZXNzRXJyb3JCdWlsZGVyIGV4dGVuZHMgUHJvYmxlbUJ1aWxkZXIgewogIEFjY2Vzc0Vycm9yQnVpbGRlcigKICAgICAgU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIGJ1aWxkZXIsIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSkKICAgICAgOiBzdXBlcihuYW1lLCBidWlsZGVyLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKCiAgRGVjbGFyYXRpb24gZ2V0IHBhcmVudCA9PiBidWlsZGVyOwoKICBib29sIGdldCBpc0ZpbmFsID0+IGJ1aWxkZXIuaXNGaW5hbDsKCiAgYm9vbCBnZXQgaXNGaWVsZCA9PiBidWlsZGVyLmlzRmllbGQ7CgogIGJvb2wgZ2V0IGlzUmVndWxhck1ldGhvZCA9PiBidWlsZGVyLmlzUmVndWxhck1ldGhvZDsKCiAgYm9vbCBnZXQgaXNHZXR0ZXIgPT4gIWJ1aWxkZXIuaXNHZXR0ZXI7CgogIGJvb2wgZ2V0IGlzU2V0dGVyID0+ICFidWlsZGVyLmlzU2V0dGVyOwoKICBib29sIGdldCBpc0luc3RhbmNlTWVtYmVyID0+IGJ1aWxkZXIuaXNJbnN0YW5jZU1lbWJlcjsKCiAgYm9vbCBnZXQgaXNTdGF0aWMgPT4gYnVpbGRlci5pc1N0YXRpYzsKCiAgYm9vbCBnZXQgaXNUb3BMZXZlbCA9PiBidWlsZGVyLmlzVG9wTGV2ZWw7CgogIGJvb2wgZ2V0IGlzVHlwZURlY2xhcmF0aW9uID0+IGJ1aWxkZXIuaXNUeXBlRGVjbGFyYXRpb247CgogIGJvb2wgZ2V0IGlzTG9jYWwgPT4gYnVpbGRlci5pc0xvY2FsOwoKICBNZXNzYWdlIGdldCBtZXNzYWdlID0+IHRlbXBsYXRlQWNjZXNzRXJyb3Iud2l0aEFyZ3VtZW50cyhuYW1lKTsKfQoKY2xhc3MgQW1iaWd1b3VzQnVpbGRlciBleHRlbmRzIFByb2JsZW1CdWlsZGVyIHsKICBBbWJpZ3VvdXNCdWlsZGVyKAogICAgICBTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gYnVpbGRlciwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpKQogICAgICA6IHN1cGVyKG5hbWUsIGJ1aWxkZXIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwoKICBEZWNsYXJhdGlvbiBnZXQgcGFyZW50ID0+IG51bGw7CgogIE1lc3NhZ2UgZ2V0IG1lc3NhZ2UgPT4gdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2Uud2l0aEFyZ3VtZW50cyhuYW1lKTsKCiAgLy8gVE9ETyhhaGUpOiBBbHNvIHByb3ZpZGUgY29udGV4dC4KCiAgRGVjbGFyYXRpb24gZ2V0Rmlyc3REZWNsYXJhdGlvbigpIHsKICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gYnVpbGRlcjsKICAgIHdoaWxlIChkZWNsYXJhdGlvbi5uZXh0ICE9IG51bGwpIHsKICAgICAgZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbi5uZXh0OwogICAgfQogICAgcmV0dXJuIGRlY2xhcmF0aW9uOwogIH0KfQoKY2xhc3MgU2NvcGVMb2NhbERlY2xhcmF0aW9uSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxEZWNsYXJhdGlvbj4gewogIEl0ZXJhdG9yPERlY2xhcmF0aW9uPiBsb2NhbDsKICBmaW5hbCBJdGVyYXRvcjxEZWNsYXJhdGlvbj4gc2V0dGVyczsKICBEZWNsYXJhdGlvbiBjdXJyZW50OwoKICBTY29wZUxvY2FsRGVjbGFyYXRpb25JdGVyYXRvcihTY29wZSBzY29wZSkKICAgICAgOiBsb2NhbCA9IHNjb3BlLmxvY2FsLnZhbHVlcy5pdGVyYXRvciwKICAgICAgICBzZXR0ZXJzID0gc2NvcGUuc2V0dGVycy52YWx1ZXMuaXRlcmF0b3I7CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBEZWNsYXJhdGlvbiBuZXh0ID0gY3VycmVudD8ubmV4dDsKICAgIGlmIChuZXh0ICE9IG51bGwpIHsKICAgICAgY3VycmVudCA9IG5leHQ7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKGxvY2FsICE9IG51bGwpIHsKICAgICAgaWYgKGxvY2FsLm1vdmVOZXh0KCkpIHsKICAgICAgICBjdXJyZW50ID0gbG9jYWwuY3VycmVudDsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsb2NhbCA9IG51bGw7CiAgICB9CiAgICBpZiAoc2V0dGVycy5tb3ZlTmV4dCgpKSB7CiAgICAgIGN1cnJlbnQgPSBzZXR0ZXJzLmN1cnJlbnQ7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgY3VycmVudCA9IG51bGw7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9Cn0KCmNsYXNzIFNjb3BlTG9jYWxEZWNsYXJhdGlvbk5hbWVJdGVyYXRvciBleHRlbmRzIFNjb3BlTG9jYWxEZWNsYXJhdGlvbkl0ZXJhdG9yCiAgICBpbXBsZW1lbnRzIE5hbWVJdGVyYXRvciB7CiAgSXRlcmF0b3I8U3RyaW5nPiBsb2NhbE5hbWVzOwogIGZpbmFsIEl0ZXJhdG9yPFN0cmluZz4gc2V0dGVyTmFtZXM7CgogIFN0cmluZyBuYW1lOwoKICBTY29wZUxvY2FsRGVjbGFyYXRpb25OYW1lSXRlcmF0b3IoU2NvcGUgc2NvcGUpCiAgICAgIDogbG9jYWxOYW1lcyA9IHNjb3BlLmxvY2FsLmtleXMuaXRlcmF0b3IsCiAgICAgICAgc2V0dGVyTmFtZXMgPSBzY29wZS5zZXR0ZXJzLmtleXMuaXRlcmF0b3IsCiAgICAgICAgc3VwZXIoc2NvcGUpOwoKICBib29sIG1vdmVOZXh0KCkgewogICAgRGVjbGFyYXRpb24gbmV4dCA9IGN1cnJlbnQ/Lm5leHQ7CiAgICBpZiAobmV4dCAhPSBudWxsKSB7CiAgICAgIGN1cnJlbnQgPSBuZXh0OwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChsb2NhbCAhPSBudWxsKSB7CiAgICAgIGlmIChsb2NhbC5tb3ZlTmV4dCgpKSB7CiAgICAgICAgbG9jYWxOYW1lcy5tb3ZlTmV4dCgpOwogICAgICAgIGN1cnJlbnQgPSBsb2NhbC5jdXJyZW50OwogICAgICAgIG5hbWUgPSBsb2NhbE5hbWVzLmN1cnJlbnQ7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgbG9jYWxOYW1lcyA9IG51bGw7CiAgICB9CiAgICBpZiAoc2V0dGVycy5tb3ZlTmV4dCgpKSB7CiAgICAgIHNldHRlck5hbWVzLm1vdmVOZXh0KCk7CiAgICAgIGN1cnJlbnQgPSBzZXR0ZXJzLmN1cnJlbnQ7CiAgICAgIG5hbWUgPSBzZXR0ZXJOYW1lcy5jdXJyZW50OwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGN1cnJlbnQgPSBudWxsOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQp9CoHfAE5OPAEVAR45ARoJGBE6HSozAToBFSQiASYkAU8TEAElARBKKgQBRgIBI00PGwEjATIBHgFKQVEYAShMKQEUURkiAUoOUSkBJzQEASI4BAE5RCUEATI4ATI8ATI6AUosIyMpHyMhBAFJSgQBRSwVRzMiBhUEAU1NIwYUEiYjSwQBPRglNQYEAUE8JSYgTik/Ew0WBgQBPyYqGkUpTTJJBhw7FgZBBAFFJioaRylLMkkGHDsWBkcEAVEBNxgqHQ0XRwYEAT4gNyoEASEpQi0kBhEEAT4iBAEpUAQBRgZPS0sgShgzOSFCCB0NF0cGEQQBDhMvRCoBOCgeIkgKCBoGASYTKAQBNRYYBAEbLiguJgYWBAEhOikeNiYIOCcIGQQBHjM+HC0eMiIaDyMIBihALR40IhoPJQgGFUIoEAQCARUVARwBNSEEATUjBAE9AgE0FQEdARgBFQFKARYBHwEXAQwoAgFOQTIWRTMBJQEnAScBNwEqASoBOQEpAS0BOwEnAUICATAURTMBIgFPASYBJicnJgYYBAIBRx8nFwEtLTEBFCYYFhMGGR4hFQgUBh4hEw0WFAYEAgFOHh8mAQ8BMTAzFgEUJhgWEwYZHh8hIxUIGQYeHiEiEw0WFAYEAgEmcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3Njb3BlLmRhcnRFc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3NvdXJjZS9zb3VyY2VfY2xhc3NfYnVpbGRlci5kYXJ0qR8vLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5zb3VyY2VfY2xhc3NfYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93IENsYXNzLCBDb25zdHJ1Y3RvciwgTWVtYmVyLCBTdXBlcnR5cGUsIFRyZWVOb2RlOwoKaW1wb3J0ICcuLi9kaWxsL2RpbGxfbWVtYmVyX2J1aWxkZXIuZGFydCcgc2hvdyBEaWxsTWVtYmVyQnVpbGRlcjsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cKICAgICAgICBub0xlbmd0aCwKICAgICAgICB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhDb25zdHJ1Y3RvciwKICAgICAgICB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhGYWN0b3J5LAogICAgICAgIHRlbXBsYXRlQ29uZmxpY3RzV2l0aE1lbWJlciwKICAgICAgICB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhNZW1iZXJXYXJuaW5nLAogICAgICAgIHRlbXBsYXRlQ29uZmxpY3RzV2l0aFNldHRlciwKICAgICAgICB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhTZXR0ZXJXYXJuaW5nLAogICAgICAgIHRlbXBsYXRlU3VwZXJ0eXBlSXNJbGxlZ2FsOwoKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX2J1aWxkZXIuZGFydCcKICAgIHNob3cKICAgICAgICBDbGFzc0J1aWxkZXIsCiAgICAgICAgQ29uc3RydWN0b3JSZWZlcmVuY2VCdWlsZGVyLAogICAgICAgIERlY2xhcmF0aW9uLAogICAgICAgIEtlcm5lbENsYXNzQnVpbGRlciwKICAgICAgICBLZXJuZWxGaWVsZEJ1aWxkZXIsCiAgICAgICAgS2VybmVsRnVuY3Rpb25CdWlsZGVyLAogICAgICAgIEtlcm5lbExpYnJhcnlCdWlsZGVyLAogICAgICAgIEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIsCiAgICAgICAgS2VybmVsVHlwZUJ1aWxkZXIsCiAgICAgICAgS2VybmVsVHlwZVZhcmlhYmxlQnVpbGRlciwKICAgICAgICBMaWJyYXJ5QnVpbGRlciwKICAgICAgICBNZXRhZGF0YUJ1aWxkZXIsCiAgICAgICAgU2NvcGUsCiAgICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlciwKICAgICAgICBjb21wYXJlUHJvY2VkdXJlczsKCmltcG9ydCAnLi4va2VybmVsL2tlcm5lbF9zaGFkb3dfYXN0LmRhcnQnIHNob3cgU2hhZG93Q2xhc3M7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgdW5leHBlY3RlZCwgdW5oYW5kbGVkOwoKU2hhZG93Q2xhc3MgaW5pdGlhbGl6ZUNsYXNzKAogICAgU2hhZG93Q2xhc3MgY2xzLAogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzLAogICAgU3RyaW5nIG5hbWUsCiAgICBLZXJuZWxMaWJyYXJ5QnVpbGRlciBwYXJlbnQsCiAgICBpbnQgc3RhcnRDaGFyT2Zmc2V0LAogICAgaW50IGNoYXJPZmZzZXQsCiAgICBpbnQgY2hhckVuZE9mZnNldCkgewogIGNscyA/Pz0gbmV3IFNoYWRvd0NsYXNzKAogICAgICBuYW1lOiBuYW1lLAogICAgICB0eXBlUGFyYW1ldGVyczoKICAgICAgICAgIEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXIua2VybmVsVHlwZVBhcmFtZXRlcnNGcm9tQnVpbGRlcnMoCiAgICAgICAgICAgICAgdHlwZVZhcmlhYmxlcykpOwogIGNscy5maWxlVXJpID8/PSBwYXJlbnQuZmlsZVVyaTsKICBpZiAoY2xzLnN0YXJ0RmlsZU9mZnNldCA9PSBUcmVlTm9kZS5ub09mZnNldCkgewogICAgY2xzLnN0YXJ0RmlsZU9mZnNldCA9IHN0YXJ0Q2hhck9mZnNldDsKICB9CiAgaWYgKGNscy5maWxlT2Zmc2V0ID09IFRyZWVOb2RlLm5vT2Zmc2V0KSB7CiAgICBjbHMuZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgfQogIGlmIChjbHMuZmlsZUVuZE9mZnNldCA9PSBUcmVlTm9kZS5ub09mZnNldCkgewogICAgY2xzLmZpbGVFbmRPZmZzZXQgPSBjaGFyRW5kT2Zmc2V0OwogIH0KCiAgcmV0dXJuIGNsczsKfQoKY2xhc3MgU291cmNlQ2xhc3NCdWlsZGVyIGV4dGVuZHMgS2VybmVsQ2xhc3NCdWlsZGVyCiAgICBpbXBsZW1lbnRzIENvbXBhcmFibGU8U291cmNlQ2xhc3NCdWlsZGVyPiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgQ2xhc3MgYWN0dWFsQ2xzOwoKICBmaW5hbCBMaXN0PENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlcj4gY29uc3RydWN0b3JSZWZlcmVuY2VzOwoKICBLZXJuZWxUeXBlQnVpbGRlciBtaXhlZEluVHlwZTsKCiAgYm9vbCBpc01peGluRGVjbGFyYXRpb247CgogIFNvdXJjZUNsYXNzQnVpbGRlcigKICAgICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhLAogICAgICBpbnQgbW9kaWZpZXJzLAogICAgICBTdHJpbmcgbmFtZSwKICAgICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzLAogICAgICBLZXJuZWxUeXBlQnVpbGRlciBzdXBlcnR5cGUsCiAgICAgIExpc3Q8S2VybmVsVHlwZUJ1aWxkZXI+IGludGVyZmFjZXMsCiAgICAgIFNjb3BlIHNjb3BlLAogICAgICBTY29wZSBjb25zdHJ1Y3RvcnMsCiAgICAgIExpYnJhcnlCdWlsZGVyIHBhcmVudCwKICAgICAgdGhpcy5jb25zdHJ1Y3RvclJlZmVyZW5jZXMsCiAgICAgIGludCBzdGFydENoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhckVuZE9mZnNldCwKICAgICAge0NsYXNzIGNscywKICAgICAgdGhpcy5taXhlZEluVHlwZSwKICAgICAgdGhpcy5pc01peGluRGVjbGFyYXRpb24gPSBmYWxzZX0pCiAgICAgIDogYWN0dWFsQ2xzID0gaW5pdGlhbGl6ZUNsYXNzKGNscywgdHlwZVZhcmlhYmxlcywgbmFtZSwgcGFyZW50LAogICAgICAgICAgICBzdGFydENoYXJPZmZzZXQsIGNoYXJPZmZzZXQsIGNoYXJFbmRPZmZzZXQpLAogICAgICAgIHN1cGVyKG1ldGFkYXRhLCBtb2RpZmllcnMsIG5hbWUsIHR5cGVWYXJpYWJsZXMsIHN1cGVydHlwZSwgaW50ZXJmYWNlcywKICAgICAgICAgICAgc2NvcGUsIGNvbnN0cnVjdG9ycywgcGFyZW50LCBjaGFyT2Zmc2V0KSB7CiAgICBTaGFkb3dDbGFzcy5zZXRCdWlsZGVyKHRoaXMuY2xzLCB0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIFNoYWRvd0NsYXNzIGdldCBjbHMgPT4gb3JpZ2luLmFjdHVhbENsczsKCiAgQG92ZXJyaWRlCiAgS2VybmVsTGlicmFyeUJ1aWxkZXIgZ2V0IGxpYnJhcnkgPT4gc3VwZXIubGlicmFyeTsKCiAgQ2xhc3MgYnVpbGQoS2VybmVsTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgTGlicmFyeUJ1aWxkZXIgY29yZUxpYnJhcnkpIHsKICAgIHZvaWQgYnVpbGRCdWlsZGVycyhTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKICAgICAgZG8gewogICAgICAgIGlmIChkZWNsYXJhdGlvbi5wYXJlbnQgIT0gdGhpcykgewogICAgICAgICAgaWYgKGZpbGVVcmkgIT0gZGVjbGFyYXRpb24ucGFyZW50LmZpbGVVcmkpIHsKICAgICAgICAgICAgdW5leHBlY3RlZCgiJGZpbGVVcmkiLCAiJHtkZWNsYXJhdGlvbi5wYXJlbnQuZmlsZVVyaX0iLCBjaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgZmlsZVVyaSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1bmV4cGVjdGVkKGZ1bGxOYW1lRm9yRXJyb3JzLCBkZWNsYXJhdGlvbi5wYXJlbnQ/LmZ1bGxOYW1lRm9yRXJyb3JzLAogICAgICAgICAgICAgICAgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBLZXJuZWxGaWVsZEJ1aWxkZXIpIHsKICAgICAgICAgIC8vIFRPRE8oYWhlKTogSXQgd291bGQgYmUgbmljZSB0byBoYXZlIGEgY29tbW9uIGludGVyZmFjZSBmb3IgdGhlCiAgICAgICAgICAvLyBidWlsZCBtZXRob2QgdG8gYXZvaWQgZHVwbGljYXRpbmcgdGhlc2UgdHdvIGNhc2VzLgogICAgICAgICAgTWVtYmVyIGZpZWxkID0gZGVjbGFyYXRpb24uYnVpbGQobGlicmFyeSk7CiAgICAgICAgICBpZiAoIWRlY2xhcmF0aW9uLmlzUGF0Y2ggJiYgZGVjbGFyYXRpb24ubmV4dCA9PSBudWxsKSB7CiAgICAgICAgICAgIGNscy5hZGRNZW1iZXIoZmllbGQpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24gaXMgS2VybmVsRnVuY3Rpb25CdWlsZGVyKSB7CiAgICAgICAgICBNZW1iZXIgZnVuY3Rpb24gPSBkZWNsYXJhdGlvbi5idWlsZChsaWJyYXJ5KTsKICAgICAgICAgIGZ1bmN0aW9uLnBhcmVudCA9IGNsczsKICAgICAgICAgIGlmICghZGVjbGFyYXRpb24uaXNQYXRjaCAmJiBkZWNsYXJhdGlvbi5uZXh0ID09IG51bGwpIHsKICAgICAgICAgICAgY2xzLmFkZE1lbWJlcihmdW5jdGlvbik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHVuaGFuZGxlZCgiJHtkZWNsYXJhdGlvbi5ydW50aW1lVHlwZX0iLCAiYnVpbGRCdWlsZGVycyIsCiAgICAgICAgICAgICAgZGVjbGFyYXRpb24uY2hhck9mZnNldCwgZGVjbGFyYXRpb24uZmlsZVVyaSk7CiAgICAgICAgfQogICAgICAgIGRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb24ubmV4dDsKICAgICAgfSB3aGlsZSAoZGVjbGFyYXRpb24gIT0gbnVsbCk7CiAgICB9CgogICAgc2NvcGUuZm9yRWFjaChidWlsZEJ1aWxkZXJzKTsKICAgIGNvbnN0cnVjdG9ycy5mb3JFYWNoKGJ1aWxkQnVpbGRlcnMpOwogICAgYWN0dWFsQ2xzLnN1cGVydHlwZSA9CiAgICAgICAgc3VwZXJ0eXBlPy5idWlsZFN1cGVydHlwZShsaWJyYXJ5LCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgIGlmICghaXNNaXhpbkRlY2xhcmF0aW9uICYmCiAgICAgICAgYWN0dWFsQ2xzLnN1cGVydHlwZSAhPSBudWxsICYmCiAgICAgICAgYWN0dWFsQ2xzLnN1cGVyY2xhc3MuaXNNaXhpbkRlY2xhcmF0aW9uKSB7CiAgICAgIC8vIERlY2xhcmVkIG1peGlucyBoYXZlIGludGVyZmFjZXMgdGhhdCBjYW4gYmUgaW1wbGVtZW50ZWQsIGJ1dCB0aGV5CiAgICAgIC8vIGNhbm5vdCBiZSBleHRlbmRlZC4gIEhvd2V2ZXIsIGEgbWl4aW4gZGVjbGFyYXRpb24gd2l0aCBhIHNpbmdsZQogICAgICAvLyBzdXBlcmNsYXNzIGNvbnN0cmFpbnQgaXMgZW5jb2RlZCB3aXRoIHRoZSBjb25zdHJhaW50IGFzIHRoZSBzdXBlcnR5cGUsCiAgICAgIC8vIGFuZCB0aGF0IGlzIGFsbG93ZWQgdG8gYmUgYSBtaXhpbidzIGludGVyZmFjZS4KICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVTdXBlcnR5cGVJc0lsbGVnYWwud2l0aEFyZ3VtZW50cyhhY3R1YWxDbHMuc3VwZXJjbGFzcy5uYW1lKSwKICAgICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgIGZpbGVVcmkpOwogICAgICBhY3R1YWxDbHMuc3VwZXJ0eXBlID0gbnVsbDsKICAgIH0KICAgIGFjdHVhbENscy5taXhlZEluVHlwZSA9CiAgICAgICAgbWl4ZWRJblR5cGU/LmJ1aWxkTWl4ZWRJblR5cGUobGlicmFyeSwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICBhY3R1YWxDbHMuaXNNaXhpbkRlY2xhcmF0aW9uID0gaXNNaXhpbkRlY2xhcmF0aW9uOwogICAgLy8gVE9ETyhhaGUpOiBJZiBgY2xzLnN1cGVydHlwZWAgaXMgbnVsbCwgYW5kIHRoaXMgaXNuJ3QgT2JqZWN0LCByZXBvcnQgYQogICAgLy8gY29tcGlsZS10aW1lIGVycm9yLgogICAgY2xzLmlzQWJzdHJhY3QgPSBpc0Fic3RyYWN0OwogICAgaWYgKGludGVyZmFjZXMgIT0gbnVsbCkgewogICAgICBmb3IgKEtlcm5lbFR5cGVCdWlsZGVyIGludGVyZmFjZSBpbiBpbnRlcmZhY2VzKSB7CiAgICAgICAgU3VwZXJ0eXBlIHN1cGVydHlwZSA9CiAgICAgICAgICAgIGludGVyZmFjZS5idWlsZFN1cGVydHlwZShsaWJyYXJ5LCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgICAgICBpZiAoc3VwZXJ0eXBlICE9IG51bGwpIHsKICAgICAgICAgIC8vIFRPRE8oYWhlKTogUmVwb3J0IGFuIGVycm9yIGlmIHN1cGVydHlwZSBpcyBudWxsLgogICAgICAgICAgYWN0dWFsQ2xzLmltcGxlbWVudGVkVHlwZXMuYWRkKHN1cGVydHlwZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgY29uc3RydWN0b3JzLmZvckVhY2goKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvcikgewogICAgICBEZWNsYXJhdGlvbiBtZW1iZXIgPSBzY29wZUJ1aWxkZXJbbmFtZV07CiAgICAgIGlmIChtZW1iZXIgPT0gbnVsbCkgcmV0dXJuOwogICAgICBpZiAoIW1lbWJlci5pc1N0YXRpYykgcmV0dXJuOwogICAgICAvLyBUT0RPKGFoZSk6IFJldmlzaXQgdGhlc2UgbWVzc2FnZXMuIEl0IHNlZW1zIGxpa2UgdGhlIGxhc3QgdHdvIHNob3VsZAogICAgICAvLyBiZSBgY29udGV4dGAgcGFyYW1ldGVyIHRvIHRoaXMgbWVzc2FnZS4KICAgICAgYWRkUHJvYmxlbSh0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhNZW1iZXIud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgIGNvbnN0cnVjdG9yLmNoYXJPZmZzZXQsIG5vTGVuZ3RoKTsKICAgICAgaWYgKGNvbnN0cnVjdG9yLmlzRmFjdG9yeSkgewogICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlQ29uZmxpY3RzV2l0aEZhY3Rvcnkud2l0aEFyZ3VtZW50cygiJHt0aGlzLm5hbWV9LiR7bmFtZX0iKSwKICAgICAgICAgICAgbWVtYmVyLmNoYXJPZmZzZXQsCiAgICAgICAgICAgIG5vTGVuZ3RoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhZGRQcm9ibGVtKAogICAgICAgICAgICB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhDb25zdHJ1Y3RvcgogICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoIiR7dGhpcy5uYW1lfS4ke25hbWV9IiksCiAgICAgICAgICAgIG1lbWJlci5jaGFyT2Zmc2V0LAogICAgICAgICAgICBub0xlbmd0aCk7CiAgICAgIH0KICAgIH0pOwoKICAgIHNjb3BlLnNldHRlcnMuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIHNldHRlcikgewogICAgICBEZWNsYXJhdGlvbiBtZW1iZXIgPSBzY29wZUJ1aWxkZXJbbmFtZV07CiAgICAgIGlmIChtZW1iZXIgPT0gbnVsbCB8fAogICAgICAgICAgIShtZW1iZXIuaXNGaWVsZCAmJiAhbWVtYmVyLmlzRmluYWwgfHwKICAgICAgICAgICAgICBtZW1iZXIuaXNSZWd1bGFyTWV0aG9kICYmIG1lbWJlci5pc1N0YXRpYyAmJiBzZXR0ZXIuaXNTdGF0aWMpKQogICAgICAgIHJldHVybjsKICAgICAgaWYgKG1lbWJlci5pc0luc3RhbmNlTWVtYmVyID09IHNldHRlci5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgICAgYWRkUHJvYmxlbSh0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhNZW1iZXIud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgICAgc2V0dGVyLmNoYXJPZmZzZXQsIG5vTGVuZ3RoKTsKICAgICAgICAvLyBUT0RPKGFoZSk6IENvbnRleHQgYXJndW1lbnQgdG8gcHJldmlvdXMgbWVzc2FnZT8KICAgICAgICBhZGRQcm9ibGVtKHRlbXBsYXRlQ29uZmxpY3RzV2l0aFNldHRlci53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICBtZW1iZXIuY2hhck9mZnNldCwgbm9MZW5ndGgpOwogICAgICB9IGVsc2UgewogICAgICAgIGFkZFByb2JsZW0odGVtcGxhdGVDb25mbGljdHNXaXRoTWVtYmVyV2FybmluZy53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICBzZXR0ZXIuY2hhck9mZnNldCwgbm9MZW5ndGgpOwogICAgICAgIC8vIFRPRE8oYWhlKTogQ29udGV4dCBhcmd1bWVudCB0byBwcmV2aW91cyBtZXNzYWdlPwogICAgICAgIGFkZFByb2JsZW0odGVtcGxhdGVDb25mbGljdHNXaXRoU2V0dGVyV2FybmluZy53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICBtZW1iZXIuY2hhck9mZnNldCwgbm9MZW5ndGgpOwogICAgICB9CiAgICB9KTsKCiAgICBzY29wZS5zZXR0ZXJzLmZvckVhY2goKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBzZXR0ZXIpIHsKICAgICAgRGVjbGFyYXRpb24gY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvclNjb3BlQnVpbGRlcltuYW1lXTsKICAgICAgaWYgKGNvbnN0cnVjdG9yID09IG51bGwgfHwgIXNldHRlci5pc1N0YXRpYykgcmV0dXJuOwogICAgICBhZGRQcm9ibGVtKHRlbXBsYXRlQ29uZmxpY3RzV2l0aENvbnN0cnVjdG9yLndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICBzZXR0ZXIuY2hhck9mZnNldCwgbm9MZW5ndGgpOwogICAgICBhZGRQcm9ibGVtKHRlbXBsYXRlQ29uZmxpY3RzV2l0aFNldHRlci53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgY29uc3RydWN0b3IuY2hhck9mZnNldCwgbm9MZW5ndGgpOwogICAgfSk7CgogICAgY2xzLnByb2NlZHVyZXMuc29ydChjb21wYXJlUHJvY2VkdXJlcyk7CiAgICByZXR1cm4gY2xzOwogIH0KCiAgdm9pZCBhZGRTeW50aGV0aWNDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcikgewogICAgU3RyaW5nIG5hbWUgPSBjb25zdHJ1Y3Rvci5uYW1lLm5hbWU7CiAgICBjbHMuY29uc3RydWN0b3JzLmFkZChjb25zdHJ1Y3Rvcik7CiAgICBjb25zdHJ1Y3Rvci5wYXJlbnQgPSBjbHM7CiAgICBEaWxsTWVtYmVyQnVpbGRlciBtZW1iZXJCdWlsZGVyID0gbmV3IERpbGxNZW1iZXJCdWlsZGVyKGNvbnN0cnVjdG9yLCB0aGlzKTsKICAgIG1lbWJlckJ1aWxkZXIubmV4dCA9IGNvbnN0cnVjdG9yU2NvcGVCdWlsZGVyW25hbWVdOwogICAgY29uc3RydWN0b3JTY29wZUJ1aWxkZXIuYWRkTWVtYmVyKG5hbWUsIG1lbWJlckJ1aWxkZXIpOwogIH0KCiAgdm9pZCBwcmVwYXJlVG9wTGV2ZWxJbmZlcmVuY2UoKSB7CiAgICBzY29wZS5mb3JFYWNoKChTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKICAgICAgZG8gewogICAgICAgIGlmIChkZWNsYXJhdGlvbiBpcyBLZXJuZWxGaWVsZEJ1aWxkZXIpIHsKICAgICAgICAgIGRlY2xhcmF0aW9uLnByZXBhcmVUb3BMZXZlbEluZmVyZW5jZSgpOwogICAgICAgIH0KICAgICAgICBkZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uLm5leHQ7CiAgICAgIH0gd2hpbGUgKGRlY2xhcmF0aW9uICE9IG51bGwpOwogICAgfSk7CiAgICBpZiAoIWlzUGF0Y2gpIHsKICAgICAgY2xzLnNldHVwQXBpTWVtYmVycyhsaWJyYXJ5LmxvYWRlci5pbnRlcmZhY2VSZXNvbHZlcik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZmluaXNoUGF0Y2goKSB7CiAgICBpZiAoIWlzUGF0Y2gpIHJldHVybiAwOwoKICAgIC8vIFRPRE8oYWhlKTogcmVzdG9yZSBmaWxlLW9mZnNldCBvbmNlIHdlIHRyYWNrIGJvdGggb3JpZ2luIGFuZCBwYXRjaCBmaWxlCiAgICAvLyBVUklzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzMxNTc5CiAgICBjbHMuYW5ub3RhdGlvbnMuZm9yRWFjaCgobSkgPT4gbS5maWxlT2Zmc2V0ID0gb3JpZ2luLmNscy5maWxlT2Zmc2V0KTsKCiAgICBpbnQgY291bnQgPSAwOwogICAgc2NvcGUuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CiAgICAgIGNvdW50ICs9IGRlY2xhcmF0aW9uLmZpbmlzaFBhdGNoKCk7CiAgICB9KTsKICAgIGNvbnN0cnVjdG9ycy5mb3JFYWNoKChTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKICAgICAgY291bnQgKz0gZGVjbGFyYXRpb24uZmluaXNoUGF0Y2goKTsKICAgIH0pOwogICAgcmV0dXJuIGNvdW50OwogIH0KCiAgTGlzdDxEZWNsYXJhdGlvbj4gY29tcHV0ZURpcmVjdFN1cGVydHlwZXMoQ2xhc3NCdWlsZGVyIG9iamVjdENsYXNzKSB7CiAgICBmaW5hbCBMaXN0PERlY2xhcmF0aW9uPiByZXN1bHQgPSA8RGVjbGFyYXRpb24+W107CiAgICBmaW5hbCBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyIHN1cGVydHlwZSA9IHRoaXMuc3VwZXJ0eXBlOwogICAgaWYgKHN1cGVydHlwZSAhPSBudWxsKSB7CiAgICAgIHJlc3VsdC5hZGQoc3VwZXJ0eXBlLmRlY2xhcmF0aW9uKTsKICAgIH0gZWxzZSBpZiAob2JqZWN0Q2xhc3MgIT0gdGhpcykgewogICAgICByZXN1bHQuYWRkKG9iamVjdENsYXNzKTsKICAgIH0KICAgIGZpbmFsIExpc3Q8S2VybmVsVHlwZUJ1aWxkZXI+IGludGVyZmFjZXMgPSB0aGlzLmludGVyZmFjZXM7CiAgICBpZiAoaW50ZXJmYWNlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgewogICAgICAgIEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIgaW50ZXJmYWNlID0gaW50ZXJmYWNlc1tpXTsKICAgICAgICByZXN1bHQuYWRkKGludGVyZmFjZS5kZWNsYXJhdGlvbik7CiAgICAgIH0KICAgIH0KICAgIGZpbmFsIEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIgbWl4ZWRJblR5cGUgPSB0aGlzLm1peGVkSW5UeXBlOwogICAgaWYgKG1peGVkSW5UeXBlICE9IG51bGwpIHsKICAgICAgcmVzdWx0LmFkZChtaXhlZEluVHlwZS5kZWNsYXJhdGlvbik7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGNvbXBhcmVUbyhTb3VyY2VDbGFzc0J1aWxkZXIgb3RoZXIpIHsKICAgIGludCByZXN1bHQgPSAiJGZpbGVVcmkiLmNvbXBhcmVUbygiJHtvdGhlci5maWxlVXJpfSIpOwogICAgaWYgKHJlc3VsdCAhPSAwKSByZXR1cm4gcmVzdWx0OwogICAgcmV0dXJuIGNoYXJPZmZzZXQuY29tcGFyZVRvKG90aGVyLmNoYXJPZmZzZXQpOwogIH0KfQqBMwBOTjwBJAEhOgFCAR0JEiomJSwlLCQBJwkWJRUcHB8eIBsjGBkPHRsBPAE2AR0VLREhGRQZGxIWRh8iMisELSEEMCcEAQ4CATQwDBkBQQEhARsBFiYVEy8jKhMaHSIbFhkSGChGOU83LAQBDCsBDDUBSj8LKjdQGhNRJgw4TEA1QiIMOzghQiUMEUM8CiglBgEiKRpBHyczS0lQOBpPFhQUIgYcRTdOGyEeOB5EIT41CggGAUIvIiROMUItIxRQHxcPFC04HxcICAE+LxwxTRBARCo8RCoPSyo8SyoICAE+PztHKEItCAEsEAQBOiknHlA4PAQBJDsLMTIKKCUIFD0GBAEMFhwBTz9KARM7KghCKggSBAFINj0dKSYfBkAeNDorCAZBHysGEwQBDCw7JDMEAgE8cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NvdXJjZS9zb3VyY2VfY2xhc3NfYnVpbGRlci5kYXJ0PnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zb3VyY2Uvc291cmNlX2xvYWRlci5kYXJ0wACeVi8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnNvdXJjZV9sb2FkZXI7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnIHNob3cgRnV0dXJlOwoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgdXRmODsKCmltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQXJndW1lbnRzLAogICAgICAgIEJvdHRvbVR5cGUsCiAgICAgICAgQ2xhc3MsCiAgICAgICAgQ29tcG9uZW50LAogICAgICAgIERhcnRUeXBlLAogICAgICAgIEV4cHJlc3Npb24sCiAgICAgICAgRnVuY3Rpb25Ob2RlLAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgTGlicmFyeSwKICAgICAgICBMaWJyYXJ5RGVwZW5kZW5jeSwKICAgICAgICBQcm9jZWR1cmVLaW5kLAogICAgICAgIFN1cGVydHlwZSwKICAgICAgICBUcmVlTm9kZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnCiAgICBzaG93IENsYXNzSGllcmFyY2h5LCBIYW5kbGVBbWJpZ3VvdXNTdXBlcnR5cGVzOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIHNob3cgQ29yZVR5cGVzOwoKaW1wb3J0ICcuLi8uLi9hcGlfcHJvdG90eXBlL2ZpbGVfc3lzdGVtLmRhcnQnOwoKaW1wb3J0ICcuLi8uLi9iYXNlL2luc3RydW1lbnRhdGlvbi5kYXJ0JyBzaG93IEluc3RydW1lbnRhdGlvbjsKCmltcG9ydCAnLi4vYmxhY2tsaXN0ZWRfY2xhc3Nlcy5kYXJ0JyBzaG93IGJsYWNrbGlzdGVkQ29yZUNsYXNzZXM7CgppbXBvcnQgJy4uL2V4cG9ydC5kYXJ0JyBzaG93IEV4cG9ydDsKCmltcG9ydCAnLi4vaW1wb3J0LmRhcnQnIHNob3cgSW1wb3J0OwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIExvY2F0ZWRNZXNzYWdlLAogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgU3VtbWFyeVRlbXBsYXRlLAogICAgICAgIFRlbXBsYXRlLAogICAgICAgIG1lc3NhZ2VPYmplY3RFeHRlbmRzLAogICAgICAgIG1lc3NhZ2VPYmplY3RJbXBsZW1lbnRzLAogICAgICAgIG1lc3NhZ2VPYmplY3RNaXhlc0luLAogICAgICAgIG1lc3NhZ2VQYXJ0T3JwaGFuLAogICAgICAgIG5vTGVuZ3RoLAogICAgICAgIHRlbXBsYXRlQW1iaWd1b3VzU3VwZXJ0eXBlcywKICAgICAgICB0ZW1wbGF0ZUNhbnRSZWFkRmlsZSwKICAgICAgICB0ZW1wbGF0ZUN5Y2xpY0NsYXNzSGllcmFyY2h5LAogICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZExpYnJhcnlFeHBvcnQsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkTGlicmFyeUV4cG9ydENvbnRleHQsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkTGlicmFyeUltcG9ydCwKICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0Q29udGV4dCwKICAgICAgICB0ZW1wbGF0ZUV4dGVuZGluZ0VudW0sCiAgICAgICAgdGVtcGxhdGVFeHRlbmRpbmdSZXN0cmljdGVkLAogICAgICAgIHRlbXBsYXRlSWxsZWdhbE1peGluLAogICAgICAgIHRlbXBsYXRlSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnMsCiAgICAgICAgdGVtcGxhdGVJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9yc0NhdXNlLAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVXJpTWlzc2luZ1NjaGVtZSwKICAgICAgICB0ZW1wbGF0ZVNvdXJjZU91dGxpbmVTdW1tYXJ5LAogICAgICAgIHRlbXBsYXRlVW50cmFuc2xhdGFibGVVcmk7CgppbXBvcnQgJy4uL2tlcm5lbC9rZXJuZWxfc2hhZG93X2FzdC5kYXJ0JwogICAgc2hvdyBTaGFkb3dDbGFzcywgU2hhZG93VHlwZUluZmVyZW5jZUVuZ2luZTsKCmltcG9ydCAnLi4va2VybmVsL2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgQ2xhc3NCdWlsZGVyLAogICAgICAgIENsYXNzSGllcmFyY2h5QnVpbGRlciwKICAgICAgICBEZWNsYXJhdGlvbiwKICAgICAgICBFbnVtQnVpbGRlciwKICAgICAgICBLZXJuZWxDbGFzc0J1aWxkZXIsCiAgICAgICAgS2VybmVsRmllbGRCdWlsZGVyLAogICAgICAgIEtlcm5lbFByb2NlZHVyZUJ1aWxkZXIsCiAgICAgICAgS2VybmVsVHlwZUJ1aWxkZXIsCiAgICAgICAgTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgTmFtZWRUeXBlQnVpbGRlciwKICAgICAgICBUeXBlQnVpbGRlcjsKCmltcG9ydCAnLi4va2VybmVsL2tlcm5lbF90YXJnZXQuZGFydCcgc2hvdyBLZXJuZWxUYXJnZXQ7CgppbXBvcnQgJy4uL2tlcm5lbC9ib2R5X2J1aWxkZXIuZGFydCcgc2hvdyBCb2R5QnVpbGRlcjsKCmltcG9ydCAnLi4va2VybmVsL3RyYW5zZm9ybV9jb2xsZWN0aW9ucy5kYXJ0JyBzaG93IENvbGxlY3Rpb25UcmFuc2Zvcm1lcjsKCmltcG9ydCAnLi4va2VybmVsL3RyYW5zZm9ybV9zZXRfbGl0ZXJhbHMuZGFydCcgc2hvdyBTZXRMaXRlcmFsVHJhbnNmb3JtZXI7CgppbXBvcnQgJy4uL2tlcm5lbC90eXBlX2J1aWxkZXJfY29tcHV0ZXIuZGFydCcgc2hvdyBUeXBlQnVpbGRlckNvbXB1dGVyOwoKaW1wb3J0ICcuLi9sb2FkZXIuZGFydCcgc2hvdyBMb2FkZXIsIHVudHJhbnNsYXRhYmxlVXJpU2NoZW1lOwoKaW1wb3J0ICcuLi9wYXJzZXIvY2xhc3NfbWVtYmVyX3BhcnNlci5kYXJ0JyBzaG93IENsYXNzTWVtYmVyUGFyc2VyOwoKaW1wb3J0ICcuLi9wYXJzZXIuZGFydCcgc2hvdyBQYXJzZXIsIGxlbmd0aEZvclRva2VuLCBvZmZzZXRGb3JUb2tlbjsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyBpbnRlcm5hbFByb2JsZW07CgppbXBvcnQgJy4uL3NjYW5uZXIuZGFydCcgc2hvdyBFcnJvclRva2VuLCBTY2FubmVyUmVzdWx0LCBUb2tlbiwgc2NhbjsKCmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2UvaW50ZXJmYWNlX3Jlc29sdmVyLmRhcnQnIHNob3cgSW50ZXJmYWNlUmVzb2x2ZXI7CgppbXBvcnQgJ2RpZXRfbGlzdGVuZXIuZGFydCcgc2hvdyBEaWV0TGlzdGVuZXI7CgppbXBvcnQgJ2RpZXRfcGFyc2VyLmRhcnQnIHNob3cgRGlldFBhcnNlcjsKCmltcG9ydCAnb3V0bGluZV9idWlsZGVyLmRhcnQnIHNob3cgT3V0bGluZUJ1aWxkZXI7CgppbXBvcnQgJ3NvdXJjZV9jbGFzc19idWlsZGVyLmRhcnQnIHNob3cgU291cmNlQ2xhc3NCdWlsZGVyOwoKaW1wb3J0ICdzb3VyY2VfbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgU291cmNlTGlicmFyeUJ1aWxkZXI7CgpjbGFzcyBTb3VyY2VMb2FkZXIgZXh0ZW5kcyBMb2FkZXI8TGlicmFyeT4gewogIC8vLyBUaGUgW0ZpbGVTeXN0ZW1dIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIGFjY2VzcyBmaWxlcy4KICBmaW5hbCBGaWxlU3lzdGVtIGZpbGVTeXN0ZW07CgogIC8vLyBXaGV0aGVyIGNvbW1lbnRzIHNob3VsZCBiZSBzY2FubmVkIGFuZCBwYXJzZWQuCiAgZmluYWwgYm9vbCBpbmNsdWRlQ29tbWVudHM7CgogIGZpbmFsIE1hcDxVcmksIExpc3Q8aW50Pj4gc291cmNlQnl0ZXMgPSA8VXJpLCBMaXN0PGludD4+e307CgogIC8vIFVzZWQgd2hlbiBidWlsZGluZyBkaXJlY3RseSB0byBrZXJuZWwuCiAgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5OwogIENvcmVUeXBlcyBjb3JlVHlwZXM7CiAgLy8gVXNlZCB3aGVuIGNoZWNraW5nIHdoZXRoZXIgYSByZXR1cm4gdHlwZSBvZiBhbiBhc3luYyBmdW5jdGlvbiBpcyB2YWxpZC4KICBEYXJ0VHlwZSBmdXR1cmVPZkJvdHRvbTsKICBEYXJ0VHlwZSBpdGVyYWJsZU9mQm90dG9tOwogIERhcnRUeXBlIHN0cmVhbU9mQm90dG9tOwoKICBTaGFkb3dUeXBlSW5mZXJlbmNlRW5naW5lIHR5cGVJbmZlcmVuY2VFbmdpbmU7CgogIEludGVyZmFjZVJlc29sdmVyIGludGVyZmFjZVJlc29sdmVyOwoKICBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uOwoKICBDb2xsZWN0aW9uVHJhbnNmb3JtZXIgY29sbGVjdGlvblRyYW5zZm9ybWVyOwoKICBTZXRMaXRlcmFsVHJhbnNmb3JtZXIgc2V0TGl0ZXJhbFRyYW5zZm9ybWVyOwoKICBTb3VyY2VMb2FkZXIodGhpcy5maWxlU3lzdGVtLCB0aGlzLmluY2x1ZGVDb21tZW50cywgS2VybmVsVGFyZ2V0IHRhcmdldCkKICAgICAgOiBzdXBlcih0YXJnZXQpOwoKICBUZW1wbGF0ZTxTdW1tYXJ5VGVtcGxhdGU+IGdldCBvdXRsaW5lU3VtbWFyeVRlbXBsYXRlID0+CiAgICAgIHRlbXBsYXRlU291cmNlT3V0bGluZVN1bW1hcnk7CgogIGJvb2wgZ2V0IGlzU291cmNlTG9hZGVyID0+IHRydWU7CgogIEZ1dHVyZTxUb2tlbj4gdG9rZW5pemUoU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwKICAgICAge2Jvb2wgc3VwcHJlc3NMZXhpY2FsRXJyb3JzOiBmYWxzZX0pIGFzeW5jIHsKICAgIFVyaSB1cmkgPSBsaWJyYXJ5LmZpbGVVcmk7CgogICAgLy8gTG9va3VwIHRoZSBmaWxlIFVSSSBpbiB0aGUgY2FjaGUuCiAgICBMaXN0PGludD4gYnl0ZXMgPSBzb3VyY2VCeXRlc1t1cmldOwoKICAgIGlmIChieXRlcyA9PSBudWxsKSB7CiAgICAgIC8vIEVycm9yIHJlY292ZXJ5LgogICAgICBpZiAodXJpLnNjaGVtZSA9PSB1bnRyYW5zbGF0YWJsZVVyaVNjaGVtZSkgewogICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHRlbXBsYXRlVW50cmFuc2xhdGFibGVVcmkud2l0aEFyZ3VtZW50cyhsaWJyYXJ5LnVyaSk7CiAgICAgICAgbGlicmFyeS5hZGRQcm9ibGVtQXRBY2Nlc3NvcnMobWVzc2FnZSk7CiAgICAgICAgYnl0ZXMgPSBzeW50aGVzaXplU291cmNlRm9yTWlzc2luZ0ZpbGUobGlicmFyeS51cmksIG51bGwpOwogICAgICB9IGVsc2UgaWYgKCF1cmkuaGFzU2NoZW1lKSB7CiAgICAgICAgcmV0dXJuIGludGVybmFsUHJvYmxlbSgKICAgICAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VcmlNaXNzaW5nU2NoZW1lLndpdGhBcmd1bWVudHModXJpKSwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIGxpYnJhcnkudXJpKTsKICAgICAgfSBlbHNlIGlmICh1cmkuc2NoZW1lID09IFNvdXJjZUxpYnJhcnlCdWlsZGVyLk1BTEZPUk1FRF9VUklfU0NIRU1FKSB7CiAgICAgICAgYnl0ZXMgPSBzeW50aGVzaXplU291cmNlRm9yTWlzc2luZ0ZpbGUobGlicmFyeS51cmksIG51bGwpOwogICAgICB9CiAgICAgIGlmIChieXRlcyAhPSBudWxsKSB7CiAgICAgICAgVWludDhMaXN0IHplcm9UZXJtaW5hdGVkQnl0ZXMgPSBuZXcgVWludDhMaXN0KGJ5dGVzLmxlbmd0aCArIDEpOwogICAgICAgIHplcm9UZXJtaW5hdGVkQnl0ZXMuc2V0UmFuZ2UoMCwgYnl0ZXMubGVuZ3RoLCBieXRlcyk7CiAgICAgICAgYnl0ZXMgPSB6ZXJvVGVybWluYXRlZEJ5dGVzOwogICAgICAgIHNvdXJjZUJ5dGVzW3VyaV0gPSBieXRlczsKICAgICAgfQogICAgfQoKICAgIGlmIChieXRlcyA9PSBudWxsKSB7CiAgICAgIC8vIElmIGl0IGlzbid0IGZvdW5kIGluIHRoZSBjYWNoZSwgcmVhZCB0aGUgZmlsZSByZWFkIGZyb20gdGhlIGZpbGUKICAgICAgLy8gc3lzdGVtLgogICAgICBMaXN0PGludD4gcmF3Qnl0ZXM7CiAgICAgIHRyeSB7CiAgICAgICAgcmF3Qnl0ZXMgPSBhd2FpdCBmaWxlU3lzdGVtLmVudGl0eUZvclVyaSh1cmkpLnJlYWRBc0J5dGVzKCk7CiAgICAgIH0gb24gRmlsZVN5c3RlbUV4Y2VwdGlvbiBjYXRjaCAoZSkgewogICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHRlbXBsYXRlQ2FudFJlYWRGaWxlLndpdGhBcmd1bWVudHModXJpLCBlLm1lc3NhZ2UpOwogICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbUF0QWNjZXNzb3JzKG1lc3NhZ2UpOwogICAgICAgIHJhd0J5dGVzID0gc3ludGhlc2l6ZVNvdXJjZUZvck1pc3NpbmdGaWxlKGxpYnJhcnkudXJpLCBtZXNzYWdlKTsKICAgICAgfQogICAgICBVaW50OExpc3QgemVyb1Rlcm1pbmF0ZWRCeXRlcyA9IG5ldyBVaW50OExpc3QocmF3Qnl0ZXMubGVuZ3RoICsgMSk7CiAgICAgIHplcm9UZXJtaW5hdGVkQnl0ZXMuc2V0UmFuZ2UoMCwgcmF3Qnl0ZXMubGVuZ3RoLCByYXdCeXRlcyk7CiAgICAgIGJ5dGVzID0gemVyb1Rlcm1pbmF0ZWRCeXRlczsKICAgICAgc291cmNlQnl0ZXNbdXJpXSA9IGJ5dGVzOwogICAgICBieXRlQ291bnQgKz0gcmF3Qnl0ZXMubGVuZ3RoOwogICAgfQoKICAgIFNjYW5uZXJSZXN1bHQgcmVzdWx0ID0gc2NhbihieXRlcywgaW5jbHVkZUNvbW1lbnRzOiBpbmNsdWRlQ29tbWVudHMpOwogICAgVG9rZW4gdG9rZW4gPSByZXN1bHQudG9rZW5zOwogICAgaWYgKCFzdXBwcmVzc0xleGljYWxFcnJvcnMpIHsKICAgICAgTGlzdDxpbnQ+IHNvdXJjZSA9IGdldFNvdXJjZShieXRlcyk7CiAgICAgIFVyaSBpbXBvcnRVcmkgPSBsaWJyYXJ5LnVyaTsKICAgICAgaWYgKGxpYnJhcnkuaXNQYXRjaCkgewogICAgICAgIC8vIEZvciBwYXRjaCBmaWxlcyB3ZSBjcmVhdGUgYSAiZmFrZSIgaW1wb3J0IHVyaS4KICAgICAgICAvLyBXZSBjYW5ub3QgdXNlIHRoZSBpbXBvcnQgdXJpIGZyb20gdGhlIHBhdGNoZWQgbGliYXJhcnkgYmVjYXVzZQogICAgICAgIC8vIHNldmVyYWwgZGlmZmVyZW50IGZpbGVzIHdvdWxkIHRoZW4gaGF2ZSB0aGUgc2FtZSBpbXBvcnQgdXJpLAogICAgICAgIC8vIGFuZCB0aGUgVk0gZG9lcyBub3Qgc3VwcG9ydCB0aGF0LiBBbHNvLCB3aGF0IHdvdWxkLCBmb3IgaW5zdGFuY2UsCiAgICAgICAgLy8gc2V0dGluZyBhIGJyZWFrcG9pbnQgb24gbGluZSA0MiBvZiBzb21lIGltcG9ydCB1cmkgbWVhbiwgaWYgdGhlIHVyaQogICAgICAgIC8vIHJlcHJlc2VudGVkIHNldmVyYWwgZmlsZXM/CiAgICAgICAgTGlzdDxTdHJpbmc+IG5ld1BhdGhTZWdtZW50cyA9CiAgICAgICAgICAgIG5ldyBMaXN0PFN0cmluZz4uZnJvbShpbXBvcnRVcmkucGF0aFNlZ21lbnRzKTsKICAgICAgICBuZXdQYXRoU2VnbWVudHMuYWRkKGxpYnJhcnkuZmlsZVVyaS5wYXRoU2VnbWVudHMubGFzdCk7CiAgICAgICAgbmV3UGF0aFNlZ21lbnRzWzBdID0gIiR7bmV3UGF0aFNlZ21lbnRzWzBdfS1wYXRjaCI7CiAgICAgICAgaW1wb3J0VXJpID0gaW1wb3J0VXJpLnJlcGxhY2UocGF0aFNlZ21lbnRzOiBuZXdQYXRoU2VnbWVudHMpOwogICAgICB9CiAgICAgIHRhcmdldC5hZGRTb3VyY2VJbmZvcm1hdGlvbigKICAgICAgICAgIGltcG9ydFVyaSwgbGlicmFyeS5maWxlVXJpLCByZXN1bHQubGluZVN0YXJ0cywgc291cmNlKTsKICAgIH0KICAgIHdoaWxlICh0b2tlbiBpcyBFcnJvclRva2VuKSB7CiAgICAgIGlmICghc3VwcHJlc3NMZXhpY2FsRXJyb3JzKSB7CiAgICAgICAgRXJyb3JUb2tlbiBlcnJvciA9IHRva2VuOwogICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbShlcnJvci5hc3NlcnRpb25NZXNzYWdlLCBvZmZzZXRGb3JUb2tlbih0b2tlbiksCiAgICAgICAgICAgIGxlbmd0aEZvclRva2VuKHRva2VuKSwgdXJpKTsKICAgICAgfQogICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBMaXN0PGludD4gc3ludGhlc2l6ZVNvdXJjZUZvck1pc3NpbmdGaWxlKFVyaSB1cmksIE1lc3NhZ2UgbWVzc2FnZSkgewogICAgc3dpdGNoICgiJHVyaSIpIHsKICAgICAgY2FzZSAiZGFydDpjb3JlIjoKICAgICAgICByZXR1cm4gdXRmOC5lbmNvZGUoZGVmYXVsdERhcnRDb3JlU291cmNlKTsKCiAgICAgIGNhc2UgImRhcnQ6YXN5bmMiOgogICAgICAgIHJldHVybiB1dGY4LmVuY29kZShkZWZhdWx0RGFydEFzeW5jU291cmNlKTsKCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIHV0ZjguZW5jb2RlKG1lc3NhZ2UgPT0gbnVsbCA/ICIiIDogIi8qICR7bWVzc2FnZS5tZXNzYWdlfSAqLyIpOwogICAgfQogIH0KCiAgTGlzdDxpbnQ+IGdldFNvdXJjZShMaXN0PGludD4gYnl0ZXMpIHsKICAgIC8vIGJ5dGVzIGlzIDAtdGVybWluYXRlZC4gV2UgZG9uJ3Qgd2FudCB0aGF0IGluY2x1ZGVkLgogICAgaWYgKGJ5dGVzIGlzIFVpbnQ4TGlzdCkgewogICAgICByZXR1cm4gbmV3IFVpbnQ4TGlzdC52aWV3KAogICAgICAgICAgYnl0ZXMuYnVmZmVyLCBieXRlcy5vZmZzZXRJbkJ5dGVzLCBieXRlcy5sZW5ndGggLSAxKTsKICAgIH0KICAgIHJldHVybiBieXRlcy5zdWJsaXN0KDAsIGJ5dGVzLmxlbmd0aCAtIDEpOwogIH0KCiAgRnV0dXJlPE51bGw+IGJ1aWxkT3V0bGluZShTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSBhc3luYyB7CiAgICBUb2tlbiB0b2tlbnMgPSBhd2FpdCB0b2tlbml6ZShsaWJyYXJ5KTsKICAgIGlmICh0b2tlbnMgPT0gbnVsbCkgcmV0dXJuOwogICAgT3V0bGluZUJ1aWxkZXIgbGlzdGVuZXIgPSBuZXcgT3V0bGluZUJ1aWxkZXIobGlicmFyeSk7CiAgICBuZXcgQ2xhc3NNZW1iZXJQYXJzZXIobGlzdGVuZXIpLnBhcnNlVW5pdCh0b2tlbnMpOwogIH0KCiAgRnV0dXJlPE51bGw+IGJ1aWxkQm9keShMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSBhc3luYyB7CiAgICBpZiAobGlicmFyeSBpcyBTb3VyY2VMaWJyYXJ5QnVpbGRlcikgewogICAgICAvLyBXZSB0b2tlbml6ZSBzb3VyY2UgZmlsZXMgdHdpY2UgdG8ga2VlcCBtZW1vcnkgdXNhZ2UgbG93LiBUaGlzIGlzIHRoZQogICAgICAvLyBzZWNvbmQgdGltZSwgYW5kIHRoZSBmaXJzdCB0aW1lIHdhcyBpbiBbYnVpbGRPdXRsaW5lXSBhYm92ZS4gU28gdGhpcwogICAgICAvLyB0aW1lIHdlIHN1cHByZXNzIGxleGljYWwgZXJyb3JzLgogICAgICBUb2tlbiB0b2tlbnMgPSBhd2FpdCB0b2tlbml6ZShsaWJyYXJ5LCBzdXBwcmVzc0xleGljYWxFcnJvcnM6IHRydWUpOwogICAgICBpZiAodG9rZW5zID09IG51bGwpIHJldHVybjsKICAgICAgRGlldExpc3RlbmVyIGxpc3RlbmVyID0gY3JlYXRlRGlldExpc3RlbmVyKGxpYnJhcnkpOwogICAgICBEaWV0UGFyc2VyIHBhcnNlciA9IG5ldyBEaWV0UGFyc2VyKGxpc3RlbmVyKTsKICAgICAgcGFyc2VyLnBhcnNlVW5pdCh0b2tlbnMpOwogICAgICBmb3IgKFNvdXJjZUxpYnJhcnlCdWlsZGVyIHBhcnQgaW4gbGlicmFyeS5wYXJ0cykgewogICAgICAgIGlmIChwYXJ0LnBhcnRPZkxpYnJhcnkgIT0gbGlicmFyeSkgewogICAgICAgICAgLy8gUGFydCB3YXMgaW5jbHVkZWQgaW4gbXVsdGlwbGUgbGlicmFyaWVzLiBTa2lwIGl0IGhlcmUuCiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgVG9rZW4gdG9rZW5zID0gYXdhaXQgdG9rZW5pemUocGFydCk7CiAgICAgICAgaWYgKHRva2VucyAhPSBudWxsKSB7CiAgICAgICAgICBsaXN0ZW5lci51cmkgPSBwYXJ0LmZpbGVVcmk7CiAgICAgICAgICBsaXN0ZW5lci5wYXJ0RGlyZWN0aXZlSW5kZXggPSAwOwogICAgICAgICAgcGFyc2VyLnBhcnNlVW5pdCh0b2tlbnMpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgRnV0dXJlPEV4cHJlc3Npb24+IGJ1aWxkRXhwcmVzc2lvbigKICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwKICAgICAgU3RyaW5nIGVuY2xvc2luZ0NsYXNzLAogICAgICBib29sIGlzSW5zdGFuY2VNZW1iZXIsCiAgICAgIEZ1bmN0aW9uTm9kZSBwYXJhbWV0ZXJzKSBhc3luYyB7CiAgICBUb2tlbiB0b2tlbiA9IGF3YWl0IHRva2VuaXplKGxpYnJhcnksIHN1cHByZXNzTGV4aWNhbEVycm9yczogZmFsc2UpOwogICAgaWYgKHRva2VuID09IG51bGwpIHJldHVybiBudWxsOwogICAgRGlldExpc3RlbmVyIGRpZXRMaXN0ZW5lciA9IGNyZWF0ZURpZXRMaXN0ZW5lcihsaWJyYXJ5KTsKCiAgICBEZWNsYXJhdGlvbiBwYXJlbnQgPSBsaWJyYXJ5OwogICAgaWYgKGVuY2xvc2luZ0NsYXNzICE9IG51bGwpIHsKICAgICAgRGVjbGFyYXRpb24gY2xzID0KICAgICAgICAgIGRpZXRMaXN0ZW5lci5tZW1iZXJTY29wZS5sb29rdXAoZW5jbG9zaW5nQ2xhc3MsIC0xLCBudWxsKTsKICAgICAgaWYgKGNscyBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgICBwYXJlbnQgPSBjbHM7CiAgICAgICAgZGlldExpc3RlbmVyCiAgICAgICAgICAuLmN1cnJlbnRDbGFzcyA9IGNscwogICAgICAgICAgLi5tZW1iZXJTY29wZSA9IGNscy5zY29wZS5jb3B5V2l0aFBhcmVudCgKICAgICAgICAgICAgICBkaWV0TGlzdGVuZXIubWVtYmVyU2NvcGUud2l0aFR5cGVWYXJpYWJsZXMoY2xzLnR5cGVWYXJpYWJsZXMpLAogICAgICAgICAgICAgICJkZWJ1Z0V4cHJlc3Npb24gaW4gJGVuY2xvc2luZ0NsYXNzIik7CiAgICAgIH0KICAgIH0KICAgIEtlcm5lbFByb2NlZHVyZUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBLZXJuZWxQcm9jZWR1cmVCdWlsZGVyKG51bGwsIDAsIG51bGwsCiAgICAgICAgImRlYnVnRXhwciIsIG51bGwsIG51bGwsIFByb2NlZHVyZUtpbmQuTWV0aG9kLCBsaWJyYXJ5LCAwLCAwLCAtMSwgLTEpCiAgICAgIC4ucGFyZW50ID0gcGFyZW50OwogICAgQm9keUJ1aWxkZXIgbGlzdGVuZXIgPSBkaWV0TGlzdGVuZXIuY3JlYXRlTGlzdGVuZXIoCiAgICAgICAgYnVpbGRlciwgZGlldExpc3RlbmVyLm1lbWJlclNjb3BlLCBpc0luc3RhbmNlTWVtYmVyKTsKCiAgICByZXR1cm4gbGlzdGVuZXIucGFyc2VTaW5nbGVFeHByZXNzaW9uKAogICAgICAgIG5ldyBQYXJzZXIobGlzdGVuZXIpLCB0b2tlbiwgcGFyYW1ldGVycyk7CiAgfQoKICBLZXJuZWxUYXJnZXQgZ2V0IHRhcmdldCA9PiBzdXBlci50YXJnZXQ7CgogIERpZXRMaXN0ZW5lciBjcmVhdGVEaWV0TGlzdGVuZXIoU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgcmV0dXJuIG5ldyBEaWV0TGlzdGVuZXIobGlicmFyeSwgaGllcmFyY2h5LCBjb3JlVHlwZXMsIHR5cGVJbmZlcmVuY2VFbmdpbmUpOwogIH0KCiAgdm9pZCByZXNvbHZlUGFydHMoKSB7CiAgICBMaXN0PFVyaT4gcGFydHMgPSA8VXJpPltdOwogICAgTGlzdDxTb3VyY2VMaWJyYXJ5QnVpbGRlcj4gbGlicmFyaWVzID0gPFNvdXJjZUxpYnJhcnlCdWlsZGVyPltdOwogICAgYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICBpZiAobGlicmFyeS5sb2FkZXIgPT0gdGhpcykgewogICAgICAgIGlmIChsaWJyYXJ5LmlzUGFydCkgewogICAgICAgICAgcGFydHMuYWRkKHVyaSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxpYnJhcmllcy5hZGQobGlicmFyeSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIFNldDxVcmk+IHVzZWRQYXJ0cyA9IG5ldyBTZXQ8VXJpPigpOwogICAgZm9yIChTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5IGluIGxpYnJhcmllcykgewogICAgICBsaWJyYXJ5LmluY2x1ZGVQYXJ0cyh1c2VkUGFydHMpOwogICAgfQogICAgZm9yIChVcmkgdXJpIGluIHBhcnRzKSB7CiAgICAgIGlmICh1c2VkUGFydHMuY29udGFpbnModXJpKSkgewogICAgICAgIGJ1aWxkZXJzLnJlbW92ZSh1cmkpOwogICAgICB9IGVsc2UgewogICAgICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIHBhcnQgPSBidWlsZGVyc1t1cmldOwogICAgICAgIHBhcnQuYWRkUHJvYmxlbShtZXNzYWdlUGFydE9ycGhhbiwgMCwgMSwgcGFydC5maWxlVXJpKTsKICAgICAgICBwYXJ0LnZhbGlkYXRlUGFydChudWxsLCBudWxsKTsKICAgICAgfQogICAgfQogICAgdGlja2VyLmxvZ01zKCJSZXNvbHZlZCBwYXJ0cyIpOwoKICAgIGJ1aWxkZXJzLmZvckVhY2goKFVyaSB1cmksIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgICAgaWYgKGxpYnJhcnkubG9hZGVyID09IHRoaXMpIHsKICAgICAgICBsaWJyYXJ5LmFwcGx5UGF0Y2hlcygpOwogICAgICB9CiAgICB9KTsKICAgIHRpY2tlci5sb2dNcygiQXBwbGllZCBwYXRjaGVzIik7CiAgfQoKICB2b2lkIGNvbXB1dGVMaWJyYXJ5U2NvcGVzKCkgewogICAgU2V0PExpYnJhcnlCdWlsZGVyPiBleHBvcnRlcnMgPSBuZXcgU2V0PExpYnJhcnlCdWlsZGVyPigpOwogICAgU2V0PExpYnJhcnlCdWlsZGVyPiBleHBvcnRlZXMgPSBuZXcgU2V0PExpYnJhcnlCdWlsZGVyPigpOwogICAgYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICBpZiAobGlicmFyeS5sb2FkZXIgPT0gdGhpcykgewogICAgICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIHNvdXJjZUxpYnJhcnkgPSBsaWJyYXJ5OwogICAgICAgIHNvdXJjZUxpYnJhcnkuYnVpbGRJbml0aWFsU2NvcGVzKCk7CiAgICAgIH0KICAgICAgaWYgKGxpYnJhcnkuZXhwb3J0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgICBleHBvcnRlZXMuYWRkKGxpYnJhcnkpOwogICAgICAgIGZvciAoRXhwb3J0IGV4cG9ydGVyIGluIGxpYnJhcnkuZXhwb3J0ZXJzKSB7CiAgICAgICAgICBleHBvcnRlcnMuYWRkKGV4cG9ydGVyLmV4cG9ydGVyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgU2V0PFNvdXJjZUxpYnJhcnlCdWlsZGVyPiBib3RoID0gbmV3IFNldDxTb3VyY2VMaWJyYXJ5QnVpbGRlcj4oKTsKICAgIGZvciAoTGlicmFyeUJ1aWxkZXIgZXhwb3J0ZWQgaW4gZXhwb3J0ZWVzKSB7CiAgICAgIGlmIChleHBvcnRlcnMuY29udGFpbnMoZXhwb3J0ZWQpKSB7CiAgICAgICAgYm90aC5hZGQoZXhwb3J0ZWQpOwogICAgICB9CiAgICAgIGZvciAoRXhwb3J0IGV4cG9ydCBpbiBleHBvcnRlZC5leHBvcnRlcnMpIHsKICAgICAgICBleHBvcnRlZC5leHBvcnRTY29wZS5mb3JFYWNoKGV4cG9ydC5hZGRUb0V4cG9ydFNjb3BlKTsKICAgICAgfQogICAgfQogICAgYm9vbCB3YXNDaGFuZ2VkID0gZmFsc2U7CiAgICBkbyB7CiAgICAgIHdhc0NoYW5nZWQgPSBmYWxzZTsKICAgICAgZm9yIChTb3VyY2VMaWJyYXJ5QnVpbGRlciBleHBvcnRlZCBpbiBib3RoKSB7CiAgICAgICAgZm9yIChFeHBvcnQgZXhwb3J0IGluIGV4cG9ydGVkLmV4cG9ydGVycykgewogICAgICAgICAgZXhwb3J0ZWQuZXhwb3J0U2NvcGUuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIG1lbWJlcikgewogICAgICAgICAgICBpZiAoZXhwb3J0LmFkZFRvRXhwb3J0U2NvcGUobmFtZSwgbWVtYmVyKSkgewogICAgICAgICAgICAgIHdhc0NoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gd2hpbGUgKHdhc0NoYW5nZWQpOwogICAgYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICBpZiAobGlicmFyeS5sb2FkZXIgPT0gdGhpcykgewogICAgICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIHNvdXJjZUxpYnJhcnkgPSBsaWJyYXJ5OwogICAgICAgIHNvdXJjZUxpYnJhcnkuYWRkSW1wb3J0c1RvU2NvcGUoKTsKICAgICAgfQogICAgfSk7CiAgICBmb3IgKExpYnJhcnlCdWlsZGVyIGV4cG9ydGVlIGluIGV4cG9ydGVlcykgewogICAgICAvLyBUT0RPKGFoZSk6IENoYW5nZSBob3cgd2UgdHJhY2sgZXhwb3J0ZXJzLiBDdXJyZW50bHksIHdoZW4gYSBsaWJyYXJ5CiAgICAgIC8vIChleHBvcnRlcikgZXhwb3J0cyBhbm90aGVyIGxpYnJhcnkgKGV4cG9ydGVlKSB3ZSBhZGQgYSByZWZlcmVuY2UgdG8KICAgICAgLy8gZXhwb3J0ZXIgdG8gZXhwb3J0ZWUuIFRoaXMgY3JlYXRlcyBhIHJlZmVyZW5jZSBpbiB0aGUgd3JvbmcgZGlyZWN0aW9uCiAgICAgIC8vIGFuZCBjYW4gbGVhZCB0byBtZW1vcnkgbGVha3MuCiAgICAgIGV4cG9ydGVlLmV4cG9ydGVycy5jbGVhcigpOwogICAgfQogICAgdGlja2VyLmxvZ01zKCJDb21wdXRlZCBsaWJyYXJ5IHNjb3BlcyIpOwogICAgLy8gZGVidWdQcmludEV4cG9ydHMoKTsKICB9CgogIHZvaWQgZGVidWdQcmludEV4cG9ydHMoKSB7CiAgICAvLyBUT0RPKHNpZ211bmQpOiBzaG91bGQgYmUgYGNvdmFyaW50IFNvdXJjZUxpYnJhcnlCdWlsZGVyYC4KICAgIGJ1aWxkZXJzLmZvckVhY2goKFVyaSB1cmksIGR5bmFtaWMgbCkgewogICAgICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5ID0gbDsKICAgICAgU2V0PERlY2xhcmF0aW9uPiBtZW1iZXJzID0gbmV3IFNldDxEZWNsYXJhdGlvbj4oKTsKICAgICAgSXRlcmF0b3I8RGVjbGFyYXRpb24+IGl0ZXJhdG9yID0gbGlicmFyeS5pdGVyYXRvcjsKICAgICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgICBtZW1iZXJzLmFkZChpdGVyYXRvci5jdXJyZW50KTsKICAgICAgfQogICAgICBMaXN0PFN0cmluZz4gZXhwb3J0cyA9IDxTdHJpbmc+W107CiAgICAgIGxpYnJhcnkuZXhwb3J0U2NvcGUuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIG1lbWJlcikgewogICAgICAgIHdoaWxlIChtZW1iZXIgIT0gbnVsbCkgewogICAgICAgICAgaWYgKCFtZW1iZXJzLmNvbnRhaW5zKG1lbWJlcikpIHsKICAgICAgICAgICAgZXhwb3J0cy5hZGQobmFtZSk7CiAgICAgICAgICB9CiAgICAgICAgICBtZW1iZXIgPSBtZW1iZXIubmV4dDsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBpZiAoZXhwb3J0cy5pc05vdEVtcHR5KSB7CiAgICAgICAgcHJpbnQoIiR1cmkgZXhwb3J0cyAkZXhwb3J0cyIpOwogICAgICB9CiAgICB9KTsKICB9CgogIHZvaWQgcmVzb2x2ZVR5cGVzKCkgewogICAgaW50IHR5cGVDb3VudCA9IDA7CiAgICBidWlsZGVycy5mb3JFYWNoKChVcmkgdXJpLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSB7CiAgICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgc291cmNlTGlicmFyeSA9IGxpYnJhcnk7CiAgICAgICAgdHlwZUNvdW50ICs9IHNvdXJjZUxpYnJhcnkucmVzb2x2ZVR5cGVzKCk7CiAgICAgIH0KICAgIH0pOwogICAgdGlja2VyLmxvZ01zKCJSZXNvbHZlZCAkdHlwZUNvdW50IHR5cGVzIik7CiAgfQoKICB2b2lkIGZpbmFsaXplSW5pdGlhbGl6aW5nRm9ybWFscygpIHsKICAgIGludCBmb3JtYWxDb3VudCA9IDA7CiAgICBidWlsZGVycy5mb3JFYWNoKChVcmkgdXJpLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSB7CiAgICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgc291cmNlTGlicmFyeSA9IGxpYnJhcnk7CiAgICAgICAgZm9ybWFsQ291bnQgKz0gc291cmNlTGlicmFyeS5maW5hbGl6ZUluaXRpYWxpemluZ0Zvcm1hbHMoKTsKICAgICAgfQogICAgfSk7CiAgICB0aWNrZXIubG9nTXMoIkZpbmFsaXplZCAkZm9ybWFsQ291bnQgaW5pdGlhbGl6aW5nIGZvcm1hbHMiKTsKICB9CgogIHZvaWQgZmluaXNoRGVmZXJyZWRMb2FkVGVhcm9mZnMoKSB7CiAgICBpbnQgY291bnQgPSAwOwogICAgYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICBpZiAobGlicmFyeS5sb2FkZXIgPT0gdGhpcykgewogICAgICAgIGNvdW50ICs9IGxpYnJhcnkuZmluaXNoRGVmZXJyZWRMb2FkVGVhcm9mZnMoKTsKICAgICAgfQogICAgfSk7CiAgICB0aWNrZXIubG9nTXMoIkZpbmlzaGVkIGRlZmVycmVkIGxvYWQgdGVhcm9mZnMgJGNvdW50Iik7CiAgfQoKICB2b2lkIGZpbmlzaE5vU3VjaE1ldGhvZEZvcndhcmRlcnMoKSB7CiAgICBpbnQgY291bnQgPSAwOwogICAgYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICBpZiAobGlicmFyeS5sb2FkZXIgPT0gdGhpcykgewogICAgICAgIGNvdW50ICs9IGxpYnJhcnkuZmluaXNoRm9yd2FyZGVycygpOwogICAgICB9CiAgICB9KTsKICAgIHRpY2tlci5sb2dNcygiRmluaXNoZWQgZm9yd2FyZGVycyBmb3IgJGNvdW50IHByb2NlZHVyZXMiKTsKICB9CgogIHZvaWQgcmVzb2x2ZUNvbnN0cnVjdG9ycygpIHsKICAgIGludCBjb3VudCA9IDA7CiAgICBidWlsZGVycy5mb3JFYWNoKChVcmkgdXJpLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSB7CiAgICAgICAgY291bnQgKz0gbGlicmFyeS5yZXNvbHZlQ29uc3RydWN0b3JzKG51bGwpOwogICAgICB9CiAgICB9KTsKICAgIHRpY2tlci5sb2dNcygiUmVzb2x2ZWQgJGNvdW50IGNvbnN0cnVjdG9ycyIpOwogIH0KCiAgdm9pZCBmaW5pc2hUeXBlVmFyaWFibGVzKENsYXNzQnVpbGRlciBvYmplY3QsIFR5cGVCdWlsZGVyIGR5bmFtaWNUeXBlKSB7CiAgICBpbnQgY291bnQgPSAwOwogICAgYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICBpZiAobGlicmFyeS5sb2FkZXIgPT0gdGhpcykgewogICAgICAgIGNvdW50ICs9IGxpYnJhcnkuZmluaXNoVHlwZVZhcmlhYmxlcyhvYmplY3QsIGR5bmFtaWNUeXBlKTsKICAgICAgfQogICAgfSk7CiAgICB0aWNrZXIubG9nTXMoIlJlc29sdmVkICRjb3VudCB0eXBlLXZhcmlhYmxlIGJvdW5kcyIpOwogIH0KCiAgdm9pZCBjb21wdXRlRGVmYXVsdFR5cGVzKFR5cGVCdWlsZGVyIGR5bmFtaWNUeXBlLCBUeXBlQnVpbGRlciBib3R0b21UeXBlLAogICAgICBDbGFzc0J1aWxkZXIgb2JqZWN0Q2xhc3MpIHsKICAgIGludCBjb3VudCA9IDA7CiAgICBidWlsZGVycy5mb3JFYWNoKChVcmkgdXJpLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSB7CiAgICAgICAgY291bnQgKz0KICAgICAgICAgICAgbGlicmFyeS5jb21wdXRlRGVmYXVsdFR5cGVzKGR5bmFtaWNUeXBlLCBib3R0b21UeXBlLCBvYmplY3RDbGFzcyk7CiAgICAgIH0KICAgIH0pOwogICAgdGlja2VyLmxvZ01zKCJDb21wdXRlZCBkZWZhdWx0IHR5cGVzIGZvciAkY291bnQgdHlwZSB2YXJpYWJsZXMiKTsKICB9CgogIHZvaWQgZmluaXNoTmF0aXZlTWV0aG9kcygpIHsKICAgIGludCBjb3VudCA9IDA7CiAgICBidWlsZGVycy5mb3JFYWNoKChVcmkgdXJpLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSB7CiAgICAgICAgY291bnQgKz0gbGlicmFyeS5maW5pc2hOYXRpdmVNZXRob2RzKCk7CiAgICAgIH0KICAgIH0pOwogICAgdGlja2VyLmxvZ01zKCJGaW5pc2hlZCAkY291bnQgbmF0aXZlIG1ldGhvZHMiKTsKICB9CgogIHZvaWQgZmluaXNoUGF0Y2hNZXRob2RzKCkgewogICAgaW50IGNvdW50ID0gMDsKICAgIGJ1aWxkZXJzLmZvckVhY2goKFVyaSB1cmksIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgICAgaWYgKGxpYnJhcnkubG9hZGVyID09IHRoaXMpIHsKICAgICAgICBjb3VudCArPSBsaWJyYXJ5LmZpbmlzaFBhdGNoTWV0aG9kcygpOwogICAgICB9CiAgICB9KTsKICAgIHRpY2tlci5sb2dNcygiRmluaXNoZWQgJGNvdW50IHBhdGNoIG1ldGhvZHMiKTsKICB9CgogIC8vLyBDaGVjayB0aGF0IFtvYmplY3RDbGFzc10gaGFzIG5vIHN1cGVydHlwZXMuIFJlY292ZXIgYnkgcmVtb3ZpbmcgYW55CiAgLy8vIGZvdW5kLgogIHZvaWQgY2hlY2tPYmplY3RDbGFzc0hpZXJhcmNoeShDbGFzc0J1aWxkZXIgb2JqZWN0Q2xhc3MpIHsKICAgIGlmIChvYmplY3RDbGFzcyBpcyBTb3VyY2VDbGFzc0J1aWxkZXIgJiYKICAgICAgICBvYmplY3RDbGFzcy5saWJyYXJ5LmxvYWRlciA9PSB0aGlzKSB7CiAgICAgIGlmIChvYmplY3RDbGFzcy5zdXBlcnR5cGUgIT0gbnVsbCkgewogICAgICAgIG9iamVjdENsYXNzLnN1cGVydHlwZSA9IG51bGw7CiAgICAgICAgb2JqZWN0Q2xhc3MuYWRkUHJvYmxlbSgKICAgICAgICAgICAgbWVzc2FnZU9iamVjdEV4dGVuZHMsIG9iamVjdENsYXNzLmNoYXJPZmZzZXQsIG5vTGVuZ3RoKTsKICAgICAgfQogICAgICBpZiAob2JqZWN0Q2xhc3MuaW50ZXJmYWNlcyAhPSBudWxsKSB7CiAgICAgICAgb2JqZWN0Q2xhc3MuYWRkUHJvYmxlbSgKICAgICAgICAgICAgbWVzc2FnZU9iamVjdEltcGxlbWVudHMsIG9iamVjdENsYXNzLmNoYXJPZmZzZXQsIG5vTGVuZ3RoKTsKICAgICAgICBvYmplY3RDbGFzcy5pbnRlcmZhY2VzID0gbnVsbDsKICAgICAgfQogICAgICBpZiAob2JqZWN0Q2xhc3MubWl4ZWRJblR5cGUgIT0gbnVsbCkgewogICAgICAgIG9iamVjdENsYXNzLmFkZFByb2JsZW0oCiAgICAgICAgICAgIG1lc3NhZ2VPYmplY3RNaXhlc0luLCBvYmplY3RDbGFzcy5jaGFyT2Zmc2V0LCBub0xlbmd0aCk7CiAgICAgICAgb2JqZWN0Q2xhc3MubWl4ZWRJblR5cGUgPSBudWxsOwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGNsYXNzIGJ1aWxkZXJzIGRlY2xhcmVkIGluIHRoaXMgbG9hZGVyLiAgQXMgdGhlCiAgLy8vIGNsYXNzZXMgYXJlIHNvcnRlZCwgYW55IGN5Y2xlcyBpbiB0aGUgaGllYXJjaHkgYXJlIHJlcG9ydGVkIGFzCiAgLy8vIGVycm9ycy4gUmVjb3ZlciBieSBicmVha2luZyB0aGUgY3ljbGVzLiBUaGlzIG1lYW5zIHRoYXQgdGhlIHJlc3Qgb2YgdGhlCiAgLy8vIHBpcGVsaW5lIChpbmNsdWRpbmcgYmFja2VuZHMpIGNhbiBhc3N1bWUgdGhhdCB0aGVyZSBhcmUgbm8gaGllcmFyY2h5CiAgLy8vIGN5Y2xlcy4KICBMaXN0PFNvdXJjZUNsYXNzQnVpbGRlcj4gaGFuZGxlSGllcmFyY2h5Q3ljbGVzKENsYXNzQnVpbGRlciBvYmplY3RDbGFzcykgewogICAgLy8gQ29tcHV0ZSB0aGUgaW5pdGlhbCB3b3JrIGxpc3Qgb2YgYWxsIGNsYXNzZXMgZGVjbGFyZWQgaW4gdGhpcyBsb2FkZXIuCiAgICBMaXN0PFNvdXJjZUNsYXNzQnVpbGRlcj4gd29ya0xpc3QgPSA8U291cmNlQ2xhc3NCdWlsZGVyPltdOwogICAgZm9yIChMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5IGluIGJ1aWxkZXJzLnZhbHVlcykgewogICAgICBpZiAobGlicmFyeS5sb2FkZXIgPT0gdGhpcykgewogICAgICAgIEl0ZXJhdG9yPERlY2xhcmF0aW9uPiBtZW1iZXJzID0gbGlicmFyeS5pdGVyYXRvcjsKICAgICAgICB3aGlsZSAobWVtYmVycy5tb3ZlTmV4dCgpKSB7CiAgICAgICAgICBEZWNsYXJhdGlvbiBtZW1iZXIgPSBtZW1iZXJzLmN1cnJlbnQ7CiAgICAgICAgICBpZiAobWVtYmVyIGlzIFNvdXJjZUNsYXNzQnVpbGRlcikgewogICAgICAgICAgICB3b3JrTGlzdC5hZGQobWVtYmVyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBTZXQ8Q2xhc3NCdWlsZGVyPiBibGFja0xpc3RlZENsYXNzZXMgPSBuZXcgU2V0PENsYXNzQnVpbGRlcj4oKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmxhY2tsaXN0ZWRDb3JlQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewogICAgICBibGFja0xpc3RlZENsYXNzZXMuYWRkKGNvcmVMaWJyYXJ5W2JsYWNrbGlzdGVkQ29yZUNsYXNzZXNbaV1dKTsKICAgIH0KCiAgICAvLyBTb3J0IHRoZSBjbGFzc2VzIHRvcG9sb2dpY2FsbHkuCiAgICBTZXQ8U291cmNlQ2xhc3NCdWlsZGVyPiB0b3BvbG9naWNhbGx5U29ydGVkQ2xhc3NlcyA9CiAgICAgICAgbmV3IFNldDxTb3VyY2VDbGFzc0J1aWxkZXI+KCk7CiAgICBMaXN0PFNvdXJjZUNsYXNzQnVpbGRlcj4gcHJldmlvdXNXb3JrTGlzdDsKICAgIGRvIHsKICAgICAgcHJldmlvdXNXb3JrTGlzdCA9IHdvcmtMaXN0OwogICAgICB3b3JrTGlzdCA9IDxTb3VyY2VDbGFzc0J1aWxkZXI+W107CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJldmlvdXNXb3JrTGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgIFNvdXJjZUNsYXNzQnVpbGRlciBjbHMgPSBwcmV2aW91c1dvcmtMaXN0W2ldOwogICAgICAgIExpc3Q8RGVjbGFyYXRpb24+IGRpcmVjdFN1cGVydHlwZXMgPQogICAgICAgICAgICBjbHMuY29tcHV0ZURpcmVjdFN1cGVydHlwZXMob2JqZWN0Q2xhc3MpOwogICAgICAgIGJvb2wgYWxsU3VwZXJ0eXBlc1Byb2Nlc3NlZCA9IHRydWU7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3RTdXBlcnR5cGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBEZWNsYXJhdGlvbiBzdXBlcnR5cGUgPSBkaXJlY3RTdXBlcnR5cGVzW2ldOwogICAgICAgICAgaWYgKHN1cGVydHlwZSBpcyBTb3VyY2VDbGFzc0J1aWxkZXIgJiYKICAgICAgICAgICAgICBzdXBlcnR5cGUubGlicmFyeS5sb2FkZXIgPT0gdGhpcyAmJgogICAgICAgICAgICAgICF0b3BvbG9naWNhbGx5U29ydGVkQ2xhc3Nlcy5jb250YWlucyhzdXBlcnR5cGUpKSB7CiAgICAgICAgICAgIGFsbFN1cGVydHlwZXNQcm9jZXNzZWQgPSBmYWxzZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChhbGxTdXBlcnR5cGVzUHJvY2Vzc2VkKSB7CiAgICAgICAgICB0b3BvbG9naWNhbGx5U29ydGVkQ2xhc3Nlcy5hZGQoY2xzKTsKICAgICAgICAgIGNoZWNrQ2xhc3NTdXBlcnR5cGVzKGNscywgZGlyZWN0U3VwZXJ0eXBlcywgYmxhY2tMaXN0ZWRDbGFzc2VzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgd29ya0xpc3QuYWRkKGNscyk7CiAgICAgICAgfQogICAgICB9CiAgICB9IHdoaWxlIChwcmV2aW91c1dvcmtMaXN0Lmxlbmd0aCAhPSB3b3JrTGlzdC5sZW5ndGgpOwogICAgTGlzdDxTb3VyY2VDbGFzc0J1aWxkZXI+IGNsYXNzZXMgPSB0b3BvbG9naWNhbGx5U29ydGVkQ2xhc3Nlcy50b0xpc3QoKTsKICAgIExpc3Q8U291cmNlQ2xhc3NCdWlsZGVyPiBjbGFzc2VzV2l0aEN5Y2xlcyA9IHByZXZpb3VzV29ya0xpc3Q7CgogICAgLy8gT25jZSB0aGUgd29yayBsaXN0IGRvZXNuJ3QgY2hhbmdlIGluIHNpemUsIGl0J3MgZWl0aGVyIGVtcHR5LCBvcgogICAgLy8gY29udGFpbnMgYWxsIGNsYXNzZXMgd2l0aCBjeWNsZXMuCgogICAgLy8gU29ydCB0aGUgY2xhc3NlcyB0byBlbnN1cmUgY29uc2lzdGVudCBvdXRwdXQuCiAgICBjbGFzc2VzV2l0aEN5Y2xlcy5zb3J0KCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXNXaXRoQ3ljbGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIFNvdXJjZUNsYXNzQnVpbGRlciBjbHMgPSBjbGFzc2VzV2l0aEN5Y2xlc1tpXTsKICAgICAgdGFyZ2V0LmJyZWFrQ3ljbGUoY2xzKTsKICAgICAgY2xhc3Nlcy5hZGQoY2xzKTsKICAgICAgY2xzLmFkZFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZUN5Y2xpY0NsYXNzSGllcmFyY2h5LndpdGhBcmd1bWVudHMoY2xzLmZ1bGxOYW1lRm9yRXJyb3JzKSwKICAgICAgICAgIGNscy5jaGFyT2Zmc2V0LAogICAgICAgICAgbm9MZW5ndGgpOwogICAgfQoKICAgIHRpY2tlci5sb2dNcygiQ2hlY2tlZCBjbGFzcyBoaWVyYXJjaHkiKTsKICAgIHJldHVybiBjbGFzc2VzOwogIH0KCiAgdm9pZCBjaGVja0NsYXNzU3VwZXJ0eXBlcygKICAgICAgU291cmNlQ2xhc3NCdWlsZGVyIGNscywKICAgICAgTGlzdDxEZWNsYXJhdGlvbj4gZGlyZWN0U3VwZXJ0eXBlcywKICAgICAgU2V0PENsYXNzQnVpbGRlcj4gYmxhY2tMaXN0ZWRDbGFzc2VzKSB7CiAgICAvLyBDaGVjayB0aGF0IHRoZSBkaXJlY3Qgc3VwZXJ0eXBlcyBhcmVuJ3QgYmxhY2stbGlzdGVkIG9yIGVudW1zLgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3RTdXBlcnR5cGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIERlY2xhcmF0aW9uIHN1cGVydHlwZSA9IGRpcmVjdFN1cGVydHlwZXNbaV07CiAgICAgIGlmIChzdXBlcnR5cGUgaXMgRW51bUJ1aWxkZXIpIHsKICAgICAgICBjbHMuYWRkUHJvYmxlbSh0ZW1wbGF0ZUV4dGVuZGluZ0VudW0ud2l0aEFyZ3VtZW50cyhzdXBlcnR5cGUubmFtZSksCiAgICAgICAgICAgIGNscy5jaGFyT2Zmc2V0LCBub0xlbmd0aCk7CiAgICAgIH0gZWxzZSBpZiAoIWNscy5saWJyYXJ5Lm1heUltcGxlbWVudFJlc3RyaWN0ZWRUeXBlcyAmJgogICAgICAgICAgYmxhY2tMaXN0ZWRDbGFzc2VzLmNvbnRhaW5zKHN1cGVydHlwZSkpIHsKICAgICAgICBjbHMuYWRkUHJvYmxlbSgKICAgICAgICAgICAgdGVtcGxhdGVFeHRlbmRpbmdSZXN0cmljdGVkCiAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhzdXBlcnR5cGUuZnVsbE5hbWVGb3JFcnJvcnMpLAogICAgICAgICAgICBjbHMuY2hhck9mZnNldCwKICAgICAgICAgICAgbm9MZW5ndGgpOwogICAgICB9CiAgICB9CgogICAgLy8gQ2hlY2sgdGhhdCB0aGUgbWl4ZWQtaW4gdHlwZSBjYW4gYmUgdXNlZCBhcyBhIG1peGluLgogICAgZmluYWwgVHlwZUJ1aWxkZXIgbWl4ZWRJblR5cGUgPSBjbHMubWl4ZWRJblR5cGU7CiAgICBpZiAobWl4ZWRJblR5cGUgIT0gbnVsbCkgewogICAgICBib29sIGlzQ2xhc3NCdWlsZGVyID0gZmFsc2U7CiAgICAgIGlmIChtaXhlZEluVHlwZSBpcyBOYW1lZFR5cGVCdWlsZGVyKSB7CiAgICAgICAgdmFyIGJ1aWxkZXIgPSBtaXhlZEluVHlwZS5kZWNsYXJhdGlvbjsKICAgICAgICBpZiAoYnVpbGRlciBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgICAgIGlzQ2xhc3NCdWlsZGVyID0gdHJ1ZTsKICAgICAgICAgIGZvciAoRGVjbGFyYXRpb24gY29uc3RydWN0b3J5IGluIGJ1aWxkZXIuY29uc3RydWN0b3JzLmxvY2FsLnZhbHVlcykgewogICAgICAgICAgICBpZiAoY29uc3RydWN0b3J5LmlzQ29uc3RydWN0b3IgJiYgIWNvbnN0cnVjdG9yeS5pc1N5bnRoZXRpYykgewogICAgICAgICAgICAgIGNscy5hZGRQcm9ibGVtKAogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUlsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzCiAgICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhidWlsZGVyLmZ1bGxOYW1lRm9yRXJyb3JzKSwKICAgICAgICAgICAgICAgICAgY2xzLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgIG5vTGVuZ3RoLAogICAgICAgICAgICAgICAgICBjb250ZXh0OiBbCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9yc0NhdXNlCiAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGJ1aWxkZXIuZnVsbE5hbWVGb3JFcnJvcnMpCiAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oY29uc3RydWN0b3J5LmZpbGVVcmksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcnkuY2hhck9mZnNldCwgbm9MZW5ndGgpCiAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghaXNDbGFzc0J1aWxkZXIpIHsKICAgICAgICAvLyBUT0RPKGFoZSk6IEVpdGhlciB3ZSBuZWVkIHRvIGNoZWNrIHRoaXMgZm9yIHN1cGVyY2xhc3MgYW5kCiAgICAgICAgLy8gaW50ZXJmYWNlcywgb3IgdGhpcyBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IChvciBoYW5kbGVkIGVsc2V3aGVyZSkuCiAgICAgICAgY2xzLmFkZFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlSWxsZWdhbE1peGluLndpdGhBcmd1bWVudHMobWl4ZWRJblR5cGUuZnVsbE5hbWVGb3JFcnJvcnMpLAogICAgICAgICAgICBjbHMuY2hhck9mZnNldCwKICAgICAgICAgICAgbm9MZW5ndGgpOwogICAgICB9CiAgICB9CiAgfQoKICBMaXN0PFNvdXJjZUNsYXNzQnVpbGRlcj4gY2hlY2tTZW1hbnRpY3MoQ2xhc3NCdWlsZGVyIG9iamVjdENsYXNzKSB7CiAgICBjaGVja09iamVjdENsYXNzSGllcmFyY2h5KG9iamVjdENsYXNzKTsKICAgIExpc3Q8U291cmNlQ2xhc3NCdWlsZGVyPiBjbGFzc2VzID0gaGFuZGxlSGllcmFyY2h5Q3ljbGVzKG9iamVjdENsYXNzKTsKCiAgICAvLyBDaGVjayBpbXBvcnRzIGFuZCBleHBvcnRzIGZvciBkdXBsaWNhdGUgbmFtZXMuCiAgICAvLyBUaGlzIGlzIHJhdGhlciBzaWxseSwgZS5nLiBpdCBtYWtlcyBpbXBvcnRpbmcgJ2ZvbycgYW5kIGV4cG9ydGluZyBhbm90aGVyCiAgICAvLyAnZm9vJyBvay4KICAgIGJ1aWxkZXJzLmZvckVhY2goKFVyaSB1cmksIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgICAgaWYgKGxpYnJhcnkgaXMgU291cmNlTGlicmFyeUJ1aWxkZXIgJiYgbGlicmFyeS5sb2FkZXIgPT0gdGhpcykgewogICAgICAgIC8vIENoZWNrIGV4cG9ydHMuCiAgICAgICAgaWYgKGxpYnJhcnkuZXhwb3J0cy5pc05vdEVtcHR5KSB7CiAgICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PEV4cG9ydD4+IG5hbWVUb0V4cG9ydHM7CiAgICAgICAgICBib29sIGVycm9yRXhwb3J0cyA9IGZhbHNlOwogICAgICAgICAgZm9yIChFeHBvcnQgZXhwb3J0IGluIGxpYnJhcnkuZXhwb3J0cykgewogICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGV4cG9ydC5leHBvcnRlZD8ubmFtZSA/PyAnJzsKICAgICAgICAgICAgaWYgKG5hbWUgIT0gJycpIHsKICAgICAgICAgICAgICBuYW1lVG9FeHBvcnRzID8/PSBuZXcgTWFwPFN0cmluZywgTGlzdDxFeHBvcnQ+PigpOwogICAgICAgICAgICAgIExpc3Q8RXhwb3J0PiBleHBvcnRzID0gbmFtZVRvRXhwb3J0c1tuYW1lXSA/Pz0gPEV4cG9ydD5bXTsKICAgICAgICAgICAgICBleHBvcnRzLmFkZChleHBvcnQpOwogICAgICAgICAgICAgIGlmIChleHBvcnRzWzBdLmV4cG9ydGVkICE9IGV4cG9ydC5leHBvcnRlZCkgZXJyb3JFeHBvcnRzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGVycm9yRXhwb3J0cykgewogICAgICAgICAgICBmb3IgKFN0cmluZyBuYW1lIGluIG5hbWVUb0V4cG9ydHMua2V5cykgewogICAgICAgICAgICAgIExpc3Q8RXhwb3J0PiBleHBvcnRzID0gbmFtZVRvRXhwb3J0c1tuYW1lXTsKICAgICAgICAgICAgICBpZiAoZXhwb3J0cy5sZW5ndGggPCAyKSBjb250aW51ZTsKICAgICAgICAgICAgICBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0ID0gPExvY2F0ZWRNZXNzYWdlPltdOwogICAgICAgICAgICAgIGZvciAoRXhwb3J0IGV4cG9ydCBpbiBleHBvcnRzLnNraXAoMSkpIHsKICAgICAgICAgICAgICAgIGNvbnRleHQuYWRkKHRlbXBsYXRlRHVwbGljYXRlZExpYnJhcnlFeHBvcnRDb250ZXh0CiAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobmFtZSkKICAgICAgICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKHVyaSwgZXhwb3J0LmNoYXJPZmZzZXQsIG5vTGVuZ3RoKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkTGlicmFyeUV4cG9ydC53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICAgICAgICBleHBvcnRzWzBdLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgIG5vTGVuZ3RoLAogICAgICAgICAgICAgICAgICB1cmksCiAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBDaGVjayBpbXBvcnRzLgogICAgICAgIGlmIChsaWJyYXJ5LmltcG9ydHMuaXNOb3RFbXB0eSkgewogICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxJbXBvcnQ+PiBuYW1lVG9JbXBvcnRzOwogICAgICAgICAgYm9vbCBlcnJvckltcG9ydHM7CiAgICAgICAgICBmb3IgKEltcG9ydCBpbXBvcnQgaW4gbGlicmFyeS5pbXBvcnRzKSB7CiAgICAgICAgICAgIFN0cmluZyBuYW1lID0gaW1wb3J0LmltcG9ydGVkPy5uYW1lID8/ICcnOwogICAgICAgICAgICBpZiAobmFtZSAhPSAnJykgewogICAgICAgICAgICAgIG5hbWVUb0ltcG9ydHMgPz89IG5ldyBNYXA8U3RyaW5nLCBMaXN0PEltcG9ydD4+KCk7CiAgICAgICAgICAgICAgTGlzdDxJbXBvcnQ+IGltcG9ydHMgPSBuYW1lVG9JbXBvcnRzW25hbWVdID8/PSA8SW1wb3J0PltdOwogICAgICAgICAgICAgIGltcG9ydHMuYWRkKGltcG9ydCk7CiAgICAgICAgICAgICAgaWYgKGltcG9ydHNbMF0uaW1wb3J0ZWQgIT0gaW1wb3J0LmltcG9ydGVkKSBlcnJvckltcG9ydHMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZXJyb3JJbXBvcnRzICE9IG51bGwpIHsKICAgICAgICAgICAgZm9yIChTdHJpbmcgbmFtZSBpbiBuYW1lVG9JbXBvcnRzLmtleXMpIHsKICAgICAgICAgICAgICBMaXN0PEltcG9ydD4gaW1wb3J0cyA9IG5hbWVUb0ltcG9ydHNbbmFtZV07CiAgICAgICAgICAgICAgaWYgKGltcG9ydHMubGVuZ3RoIDwgMikgY29udGludWU7CiAgICAgICAgICAgICAgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dCA9IDxMb2NhdGVkTWVzc2FnZT5bXTsKICAgICAgICAgICAgICBmb3IgKEltcG9ydCBpbXBvcnQgaW4gaW1wb3J0cy5za2lwKDEpKSB7CiAgICAgICAgICAgICAgICBjb250ZXh0LmFkZCh0ZW1wbGF0ZUR1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0Q29udGV4dAogICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIGltcG9ydC5jaGFyT2Zmc2V0LCBub0xlbmd0aCkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBsaWJyYXJ5LmFkZFByb2JsZW0oCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZExpYnJhcnlJbXBvcnQud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgICAgICAgICAgaW1wb3J0c1swXS5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgICAgICAgICAgdXJpLAogICAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICB0aWNrZXIubG9nTXMoIkNoZWNrZWQgaW1wb3J0cyBhbmQgZXhwb3J0cyBmb3IgZHVwbGljYXRlIG5hbWVzIik7CiAgICByZXR1cm4gY2xhc3NlczsKICB9CgogIHZvaWQgYnVpbGRDb21wb25lbnQoKSB7CiAgICBidWlsZGVycy5mb3JFYWNoKChVcmkgdXJpLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSB7CiAgICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgc291cmNlTGlicmFyeSA9IGxpYnJhcnk7CiAgICAgICAgTGlicmFyeSB0YXJnZXQgPSBzb3VyY2VMaWJyYXJ5LmJ1aWxkKGNvcmVMaWJyYXJ5KTsKICAgICAgICBpZiAoIWxpYnJhcnkuaXNQYXRjaCkgewogICAgICAgICAgbGlicmFyaWVzLmFkZCh0YXJnZXQpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICB0aWNrZXIubG9nTXMoIkJ1aWx0IGNvbXBvbmVudCIpOwogIH0KCiAgQ29tcG9uZW50IGNvbXB1dGVGdWxsQ29tcG9uZW50KCkgewogICAgU2V0PExpYnJhcnk+IGxpYnJhcmllcyA9IG5ldyBTZXQ8TGlicmFyeT4oKTsKICAgIExpc3Q8TGlicmFyeT4gd29ya0xpc3QgPSA8TGlicmFyeT5bXTsKICAgIGJ1aWxkZXJzLmZvckVhY2goKFVyaSB1cmksIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgICAgaWYgKCFsaWJyYXJ5LmlzUGF0Y2ggJiYKICAgICAgICAgIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzIHx8CiAgICAgICAgICAgICAgbGlicmFyeS51cmkuc2NoZW1lID09ICJkYXJ0IiB8fAogICAgICAgICAgICAgIGxpYnJhcnkgPT0gdGhpcy5maXJzdCkpIHsKICAgICAgICBpZiAobGlicmFyaWVzLmFkZChsaWJyYXJ5LnRhcmdldCkpIHsKICAgICAgICAgIHdvcmtMaXN0LmFkZChsaWJyYXJ5LnRhcmdldCk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIHdoaWxlICh3b3JrTGlzdC5pc05vdEVtcHR5KSB7CiAgICAgIExpYnJhcnkgbGlicmFyeSA9IHdvcmtMaXN0LnJlbW92ZUxhc3QoKTsKICAgICAgZm9yIChMaWJyYXJ5RGVwZW5kZW5jeSBkZXBlbmRlbmN5IGluIGxpYnJhcnkuZGVwZW5kZW5jaWVzKSB7CiAgICAgICAgaWYgKGxpYnJhcmllcy5hZGQoZGVwZW5kZW5jeS50YXJnZXRMaWJyYXJ5KSkgewogICAgICAgICAgd29ya0xpc3QuYWRkKGRlcGVuZGVuY3kudGFyZ2V0TGlicmFyeSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IENvbXBvbmVudCgpLi5saWJyYXJpZXMuYWRkQWxsKGxpYnJhcmllcyk7CiAgfQoKICB2b2lkIGNvbXB1dGVIaWVyYXJjaHkoKSB7CiAgICBMaXN0PExpc3Q+IGFtYmlndW91c1R5cGVzUmVjb3JkcyA9IFtdOwogICAgSGFuZGxlQW1iaWd1b3VzU3VwZXJ0eXBlcyBvbkFtYmlndW91c1N1cGVydHlwZXMgPQogICAgICAgIChDbGFzcyBjbHMsIFN1cGVydHlwZSBhLCBTdXBlcnR5cGUgYikgewogICAgICBpZiAoYW1iaWd1b3VzVHlwZXNSZWNvcmRzICE9IG51bGwpIHsKICAgICAgICBhbWJpZ3VvdXNUeXBlc1JlY29yZHMuYWRkKFtjbHMsIGEsIGJdKTsKICAgICAgfQogICAgfTsKICAgIGlmIChoaWVyYXJjaHkgPT0gbnVsbCkgewogICAgICBoaWVyYXJjaHkgPSBuZXcgQ2xhc3NIaWVyYXJjaHkoY29tcHV0ZUZ1bGxDb21wb25lbnQoKSwKICAgICAgICAgIG9uQW1iaWd1b3VzU3VwZXJ0eXBlczogb25BbWJpZ3VvdXNTdXBlcnR5cGVzKTsKICAgIH0gZWxzZSB7CiAgICAgIGhpZXJhcmNoeS5vbkFtYmlndW91c1N1cGVydHlwZXMgPSBvbkFtYmlndW91c1N1cGVydHlwZXM7CiAgICAgIENvbXBvbmVudCBjb21wb25lbnQgPSBjb21wdXRlRnVsbENvbXBvbmVudCgpOwogICAgICBoaWVyYXJjaHkuYXBwbHlUcmVlQ2hhbmdlcyhjb25zdCBbXSwgY29tcG9uZW50LmxpYnJhcmllcywKICAgICAgICAgIHJlaXNzdWVBbWJpZ3VvdXNTdXBlcnR5cGVzRm9yOiBjb21wb25lbnQpOwogICAgfQogICAgZm9yIChMaXN0IHJlY29yZCBpbiBhbWJpZ3VvdXNUeXBlc1JlY29yZHMpIHsKICAgICAgaGFuZGxlQW1iaWd1b3VzU3VwZXJ0eXBlcyhyZWNvcmRbMF0sIHJlY29yZFsxXSwgcmVjb3JkWzJdKTsKICAgIH0KICAgIGFtYmlndW91c1R5cGVzUmVjb3JkcyA9IG51bGw7CiAgICB0aWNrZXIubG9nTXMoIkNvbXB1dGVkIGNsYXNzIGhpZXJhcmNoeSIpOwogIH0KCiAgdm9pZCBoYW5kbGVBbWJpZ3VvdXNTdXBlcnR5cGVzKENsYXNzIGNscywgU3VwZXJ0eXBlIGEsIFN1cGVydHlwZSBiKSB7CiAgICBhZGRQcm9ibGVtKAogICAgICAgIHRlbXBsYXRlQW1iaWd1b3VzU3VwZXJ0eXBlcy53aXRoQXJndW1lbnRzKAogICAgICAgICAgICBjbHMubmFtZSwgYS5hc0ludGVyZmFjZVR5cGUsIGIuYXNJbnRlcmZhY2VUeXBlKSwKICAgICAgICBjbHMuZmlsZU9mZnNldCwKICAgICAgICBub0xlbmd0aCwKICAgICAgICBjbHMuZmlsZVVyaSk7CiAgfQoKICB2b2lkIGlnbm9yZUFtYmlndW91c1N1cGVydHlwZXMoQ2xhc3MgY2xzLCBTdXBlcnR5cGUgYSwgU3VwZXJ0eXBlIGIpIHt9CgogIHZvaWQgY29tcHV0ZUNvcmVUeXBlcyhDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBjb3JlVHlwZXMgPSBuZXcgQ29yZVR5cGVzKGNvbXBvbmVudCk7CgogICAgZnV0dXJlT2ZCb3R0b20gPSBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICBjb3JlVHlwZXMuZnV0dXJlQ2xhc3MsIDxEYXJ0VHlwZT5bY29uc3QgQm90dG9tVHlwZSgpXSk7CiAgICBpdGVyYWJsZU9mQm90dG9tID0gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgY29yZVR5cGVzLml0ZXJhYmxlQ2xhc3MsIDxEYXJ0VHlwZT5bY29uc3QgQm90dG9tVHlwZSgpXSk7CiAgICBzdHJlYW1PZkJvdHRvbSA9IG5ldyBJbnRlcmZhY2VUeXBlKAogICAgICAgIGNvcmVUeXBlcy5zdHJlYW1DbGFzcywgPERhcnRUeXBlPltjb25zdCBCb3R0b21UeXBlKCldKTsKCiAgICB0aWNrZXIubG9nTXMoIkNvbXB1dGVkIGNvcmUgdHlwZXMiKTsKICB9CgogIHZvaWQgY2hlY2tTdXBlcnR5cGVzKExpc3Q8U291cmNlQ2xhc3NCdWlsZGVyPiBzb3VyY2VDbGFzc2VzKSB7CiAgICBmb3IgKFNvdXJjZUNsYXNzQnVpbGRlciBidWlsZGVyIGluIHNvdXJjZUNsYXNzZXMpIHsKICAgICAgaWYgKGJ1aWxkZXIubGlicmFyeS5sb2FkZXIgPT0gdGhpcyAmJiAhYnVpbGRlci5pc1BhdGNoKSB7CiAgICAgICAgYnVpbGRlci5jaGVja1N1cGVydHlwZXMoY29yZVR5cGVzKTsKICAgICAgfQogICAgfQogICAgdGlja2VyLmxvZ01zKCJDaGVja2VkIHN1cGVydHlwZXMiKTsKICB9CgogIHZvaWQgY2hlY2tCb3VuZHMoKSB7CiAgICBpZiAodGFyZ2V0LmxlZ2FjeU1vZGUpIHJldHVybjsKCiAgICBidWlsZGVycy5mb3JFYWNoKChVcmkgdXJpLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICAgIGlmIChsaWJyYXJ5IGlzIFNvdXJjZUxpYnJhcnlCdWlsZGVyKSB7CiAgICAgICAgaWYgKGxpYnJhcnkubG9hZGVyID09IHRoaXMpIHsKICAgICAgICAgIGxpYnJhcnkKICAgICAgICAgICAgICAuY2hlY2tCb3VuZHNJbk91dGxpbmUodHlwZUluZmVyZW5jZUVuZ2luZS50eXBlU2NoZW1hRW52aXJvbm1lbnQpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICB0aWNrZXIubG9nTXMoIkNoZWNrZWQgdHlwZSBhcmd1bWVudHMgb2Ygc3VwZXJzIGFnYWluc3QgdGhlIGJvdW5kcyIpOwogIH0KCiAgdm9pZCBjaGVja092ZXJyaWRlcyhMaXN0PFNvdXJjZUNsYXNzQnVpbGRlcj4gc291cmNlQ2xhc3NlcykgewogICAgYXNzZXJ0KGhpZXJhcmNoeSAhPSBudWxsKTsKICAgIGZvciAoU291cmNlQ2xhc3NCdWlsZGVyIGJ1aWxkZXIgaW4gc291cmNlQ2xhc3NlcykgewogICAgICBpZiAoYnVpbGRlci5saWJyYXJ5LmxvYWRlciA9PSB0aGlzICYmICFidWlsZGVyLmlzUGF0Y2gpIHsKICAgICAgICBidWlsZGVyLmNoZWNrT3ZlcnJpZGVzKAogICAgICAgICAgICBoaWVyYXJjaHksIHR5cGVJbmZlcmVuY2VFbmdpbmU/LnR5cGVTY2hlbWFFbnZpcm9ubWVudCk7CiAgICAgIH0KICAgIH0KICAgIHRpY2tlci5sb2dNcygiQ2hlY2tlZCBvdmVycmlkZXMiKTsKICB9CgogIHZvaWQgY2hlY2tBYnN0cmFjdE1lbWJlcnMoTGlzdDxTb3VyY2VDbGFzc0J1aWxkZXI+IHNvdXJjZUNsYXNzZXMpIHsKICAgIC8vIFRPRE8oYWhlKTogTW92ZSB0aGlzIHRvIFtDbGFzc0hpZXJhcmNoeUJ1aWxkZXJdLgogICAgaWYgKHRhcmdldC5sZWdhY3lNb2RlKSByZXR1cm47CiAgICBhc3NlcnQoaGllcmFyY2h5ICE9IG51bGwpOwogICAgZm9yIChTb3VyY2VDbGFzc0J1aWxkZXIgYnVpbGRlciBpbiBzb3VyY2VDbGFzc2VzKSB7CiAgICAgIGlmIChidWlsZGVyLmxpYnJhcnkubG9hZGVyID09IHRoaXMgJiYgIWJ1aWxkZXIuaXNQYXRjaCkgewogICAgICAgIGJ1aWxkZXIuY2hlY2tBYnN0cmFjdE1lbWJlcnMoCiAgICAgICAgICAgIGNvcmVUeXBlcywgaGllcmFyY2h5LCB0eXBlSW5mZXJlbmNlRW5naW5lLnR5cGVTY2hlbWFFbnZpcm9ubWVudCk7CiAgICAgIH0KICAgIH0KICAgIHRpY2tlci5sb2dNcygiQ2hlY2tlZCBhYnN0cmFjdCBtZW1iZXJzIik7CiAgfQoKICB2b2lkIGNoZWNrUmVkaXJlY3RpbmdGYWN0b3JpZXMoTGlzdDxTb3VyY2VDbGFzc0J1aWxkZXI+IHNvdXJjZUNsYXNzZXMpIHsKICAgIC8vIFRPRE8oYWhlKTogTW92ZSB0aGlzIHRvIFtDbGFzc0hpZXJhcmNoeUJ1aWxkZXJdLgogICAgaWYgKHRhcmdldC5sZWdhY3lNb2RlKSByZXR1cm47CiAgICBmb3IgKFNvdXJjZUNsYXNzQnVpbGRlciBidWlsZGVyIGluIHNvdXJjZUNsYXNzZXMpIHsKICAgICAgaWYgKGJ1aWxkZXIubGlicmFyeS5sb2FkZXIgPT0gdGhpcyAmJiAhYnVpbGRlci5pc1BhdGNoKSB7CiAgICAgICAgYnVpbGRlci5jaGVja1JlZGlyZWN0aW5nRmFjdG9yaWVzKAogICAgICAgICAgICB0eXBlSW5mZXJlbmNlRW5naW5lLnR5cGVTY2hlbWFFbnZpcm9ubWVudCk7CiAgICAgIH0KICAgIH0KICAgIHRpY2tlci5sb2dNcygiQ2hlY2tlZCByZWRpcmVjdGluZyBmYWN0b3JpZXMiKTsKICB9CgogIHZvaWQgYWRkTm9TdWNoTWV0aG9kRm9yd2FyZGVycyhMaXN0PFNvdXJjZUNsYXNzQnVpbGRlcj4gc291cmNlQ2xhc3NlcykgewogICAgLy8gVE9ETyhhaGUpOiBNb3ZlIHRoaXMgdG8gW0NsYXNzSGllcmFyY2h5QnVpbGRlcl0uCiAgICBpZiAoIXRhcmdldC5iYWNrZW5kVGFyZ2V0LmVuYWJsZU5vU3VjaE1ldGhvZEZvcndhcmRlcnMpIHJldHVybjsKCiAgICBMaXN0PENsYXNzPiBjaGFuZ2VkQ2xhc3NlcyA9IG5ldyBMaXN0PENsYXNzPigpOwogICAgZm9yIChTb3VyY2VDbGFzc0J1aWxkZXIgYnVpbGRlciBpbiBzb3VyY2VDbGFzc2VzKSB7CiAgICAgIGlmIChidWlsZGVyLmxpYnJhcnkubG9hZGVyID09IHRoaXMgJiYgIWJ1aWxkZXIuaXNQYXRjaCkgewogICAgICAgIGlmIChidWlsZGVyLmFkZE5vU3VjaE1ldGhvZEZvcndhcmRlcnModGFyZ2V0LCBoaWVyYXJjaHkpKSB7CiAgICAgICAgICBjaGFuZ2VkQ2xhc3Nlcy5hZGQoYnVpbGRlci50YXJnZXQpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaGllcmFyY2h5LmFwcGx5TWVtYmVyQ2hhbmdlcyhjaGFuZ2VkQ2xhc3NlcywgZmluZERlc2NlbmRhbnRzOiB0cnVlKTsKICAgIHRpY2tlci5sb2dNcygiQWRkZWQgbm9TdWNoTWV0aG9kIGZvcndhcmRlcnMiKTsKICB9CgogIHZvaWQgY2hlY2tNaXhpbnMoTGlzdDxTb3VyY2VDbGFzc0J1aWxkZXI+IHNvdXJjZUNsYXNzZXMpIHsKICAgIGZvciAoU291cmNlQ2xhc3NCdWlsZGVyIGJ1aWxkZXIgaW4gc291cmNlQ2xhc3NlcykgewogICAgICBpZiAoYnVpbGRlci5saWJyYXJ5LmxvYWRlciA9PSB0aGlzICYmICFidWlsZGVyLmlzUGF0Y2gpIHsKICAgICAgICBpZiAoYnVpbGRlci5pc01peGluRGVjbGFyYXRpb24pIHsKICAgICAgICAgIGJ1aWxkZXIuY2hlY2tNaXhpbkRlY2xhcmF0aW9uKCk7CiAgICAgICAgfQoKICAgICAgICBDbGFzcyBtaXhlZEluQ2xhc3MgPSBidWlsZGVyLmNscy5taXhlZEluQ2xhc3M7CiAgICAgICAgaWYgKG1peGVkSW5DbGFzcyAhPSBudWxsICYmIG1peGVkSW5DbGFzcy5pc01peGluRGVjbGFyYXRpb24pIHsKICAgICAgICAgIGJ1aWxkZXIuY2hlY2tNaXhpbkFwcGxpY2F0aW9uKGhpZXJhcmNoeSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0aWNrZXIubG9nTXMoIkNoZWNrZWQgbWl4aW4gZGVjbGFyYXRpb24gYXBwbGljYXRpb25zIik7CiAgfQoKICBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgYnVpbGRDbGFzc0hpZXJhcmNoeSgKICAgICAgTGlzdDxTb3VyY2VDbGFzc0J1aWxkZXI+IHNvdXJjZUNsYXNzZXMsIENsYXNzQnVpbGRlciBvYmplY3RDbGFzcykgewogICAgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGhpZXJhcmNoeSA9IENsYXNzSGllcmFyY2h5QnVpbGRlci5idWlsZCgKICAgICAgICBvYmplY3RDbGFzcywgc291cmNlQ2xhc3NlcywgdGhpcywgY29yZVR5cGVzKTsKICAgIHRpY2tlci5sb2dNcygiQnVpbHQgY2xhc3MgaGllcmFyY2h5Iik7CiAgICByZXR1cm4gaGllcmFyY2h5OwogIH0KCiAgdm9pZCBjcmVhdGVUeXBlSW5mZXJlbmNlRW5naW5lKCkgewogICAgaWYgKHRhcmdldC5sZWdhY3lNb2RlKSByZXR1cm47CiAgICB0eXBlSW5mZXJlbmNlRW5naW5lID0gbmV3IFNoYWRvd1R5cGVJbmZlcmVuY2VFbmdpbmUoaW5zdHJ1bWVudGF0aW9uKTsKICB9CgogIHZvaWQgcGVyZm9ybVRvcExldmVsSW5mZXJlbmNlKExpc3Q8U291cmNlQ2xhc3NCdWlsZGVyPiBzb3VyY2VDbGFzc2VzKSB7CiAgICBpZiAodGFyZ2V0LmxlZ2FjeU1vZGUpIHJldHVybjsKCiAgICAvLy8gVGhlIGZpcnN0IHBoYXNlIG9mIHRvcCBsZXZlbCBpbml0aWFsaXplciBpbmZlcmVuY2UsIHdoaWNoIGNvbnNpc3RzIG9mCiAgICAvLy8gY3JlYXRpbmcga2VybmVsIG9iamVjdHMgZm9yIGFsbCBmaWVsZHMgYW5kIHRvcCBsZXZlbCB2YXJpYWJsZXMgdGhhdAogICAgLy8vIG1pZ2h0IGJlIHN1YmplY3QgdG8gdHlwZSBpbmZlcmVuY2UsIGFuZCByZWNvcmRzIGRlcGVuZGVuY2llcyBiZXR3ZWVuCiAgICAvLy8gdGhlbS4KICAgIHR5cGVJbmZlcmVuY2VFbmdpbmUucHJlcGFyZVRvcExldmVsKGNvcmVUeXBlcywgaGllcmFyY2h5KTsKICAgIGludGVyZmFjZVJlc29sdmVyID0gbmV3IEludGVyZmFjZVJlc29sdmVyKHR5cGVJbmZlcmVuY2VFbmdpbmUsCiAgICAgICAgdHlwZUluZmVyZW5jZUVuZ2luZS50eXBlU2NoZW1hRW52aXJvbm1lbnQsIGluc3RydW1lbnRhdGlvbik7CiAgICBmb3IgKExpYnJhcnlCdWlsZGVyIGxpYnJhcnkgaW4gYnVpbGRlcnMudmFsdWVzKSB7CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSB7CiAgICAgICAgSXRlcmF0b3I8RGVjbGFyYXRpb24+IGl0ZXJhdG9yID0gbGlicmFyeS5pdGVyYXRvcjsKICAgICAgICB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICAgICAgRGVjbGFyYXRpb24gbWVtYmVyID0gaXRlcmF0b3IuY3VycmVudDsKICAgICAgICAgIGlmIChtZW1iZXIgaXMgS2VybmVsRmllbGRCdWlsZGVyKSB7CiAgICAgICAgICAgIG1lbWJlci5wcmVwYXJlVG9wTGV2ZWxJbmZlcmVuY2UoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewogICAgICBzb3VyY2VDbGFzc2VzW2ldLnByZXBhcmVUb3BMZXZlbEluZmVyZW5jZSgpOwogICAgfQogICAgdHlwZUluZmVyZW5jZUVuZ2luZS5pc1R5cGVJbmZlcmVuY2VQcmVwYXJlZCA9IHRydWU7CiAgICB0aWNrZXIubG9nTXMoIlByZXBhcmVkIHRvcCBsZXZlbCBpbmZlcmVuY2UiKTsKCiAgICAvLy8gVGhlIHNlY29uZCBwaGFzZSBvZiB0b3AgbGV2ZWwgaW5pdGlhbGl6ZXIgaW5mZXJlbmNlLCB3aGljaCBpcyB0byB2aXNpdAogICAgLy8vIGZpZWxkcyBhbmQgdG9wIGxldmVsIHZhcmlhYmxlcyBpbiB0b3BvbG9naWNhbGx5LXNvcnRlZCBvcmRlciBhbmQgYXNzaWduCiAgICAvLy8gdGhlaXIgdHlwZXMuCiAgICB0eXBlSW5mZXJlbmNlRW5naW5lLmZpbmlzaFRvcExldmVsRmllbGRzKCk7CiAgICBMaXN0PENsYXNzPiBjaGFuZ2VkQ2xhc3NlcyA9IG5ldyBMaXN0PENsYXNzPigpOwogICAgZm9yICh2YXIgYnVpbGRlciBpbiBzb3VyY2VDbGFzc2VzKSB7CiAgICAgIGlmIChidWlsZGVyLmlzUGF0Y2gpIGNvbnRpbnVlOwogICAgICBTaGFkb3dDbGFzcyBjbGFzc18gPSBidWlsZGVyLnRhcmdldDsKICAgICAgaW50IG1lbWJlckNvdW50ID0gY2xhc3NfLmZpZWxkcy5sZW5ndGggKwogICAgICAgICAgY2xhc3NfLmNvbnN0cnVjdG9ycy5sZW5ndGggKwogICAgICAgICAgY2xhc3NfLnByb2NlZHVyZXMubGVuZ3RoICsKICAgICAgICAgIGNsYXNzXy5yZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnMubGVuZ3RoOwogICAgICBjbGFzc18uZmluYWxpemVDb3ZhcmlhbmNlKGludGVyZmFjZVJlc29sdmVyKTsKICAgICAgU2hhZG93Q2xhc3MuY2xlYXJDbGFzc0luZmVyZW5jZUluZm8oY2xhc3NfKTsKICAgICAgaW50IG5ld01lbWJlckNvdW50ID0gY2xhc3NfLmZpZWxkcy5sZW5ndGggKwogICAgICAgICAgY2xhc3NfLmNvbnN0cnVjdG9ycy5sZW5ndGggKwogICAgICAgICAgY2xhc3NfLnByb2NlZHVyZXMubGVuZ3RoICsKICAgICAgICAgIGNsYXNzXy5yZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnMubGVuZ3RoOwogICAgICBpZiAobmV3TWVtYmVyQ291bnQgIT0gbWVtYmVyQ291bnQpIHsKICAgICAgICAvLyBUaGUgaW5mZXJlbmNlIHBvdGVudGlhbGx5IGFkZHMgbmV3IG1lbWJlcnMgKGJ1dCBkb2Vzbid0IG90aGVyd2lzZQogICAgICAgIC8vIGNoYW5nZSB0aGUgY2xhc3NlcyksIHNvIGlmIHRoZSBtZW1iZXIgY291bnQgaGFzIGNoYW5nZWQgd2UgbmVlZCB0bwogICAgICAgIC8vIHVwZGF0ZSB0aGUgY2xhc3MgaW4gdGhlIGNsYXNzIGhpZXJhcmNoeS4KICAgICAgICBjaGFuZ2VkQ2xhc3Nlcy5hZGQoY2xhc3NfKTsKICAgICAgfQogICAgfQoKICAgIHR5cGVJbmZlcmVuY2VFbmdpbmUuZmluaXNoVG9wTGV2ZWxJbml0aWFsaXppbmdGb3JtYWxzKCk7CiAgICBpbnRlcmZhY2VSZXNvbHZlciA9IG51bGw7CiAgICAvLyBTaW5jZSBmaW5hbGl6YXRpb24gb2YgY292YXJpYW5jZSBtYXkgaGF2ZSBhZGRlZCBmb3J3YXJkaW5nIHN0dWJzLCB3ZSBuZWVkCiAgICAvLyB0byByZWNvbXB1dGUgdGhlIGNsYXNzIGhpZXJhcmNoeSBzbyB0aGF0IG1ldGhvZCBjb21waWxhdGlvbiB3aWxsIHByb3Blcmx5CiAgICAvLyB0YXJnZXQgdGhvc2UgZm9yd2FyZGluZyBzdHVicy4KICAgIGhpZXJhcmNoeS5vbkFtYmlndW91c1N1cGVydHlwZXMgPSBpZ25vcmVBbWJpZ3VvdXNTdXBlcnR5cGVzOwogICAgaGllcmFyY2h5LmFwcGx5TWVtYmVyQ2hhbmdlcyhjaGFuZ2VkQ2xhc3NlcywgZmluZERlc2NlbmRhbnRzOiB0cnVlKTsKICAgIHRpY2tlci5sb2dNcygiUGVyZm9ybWVkIHRvcCBsZXZlbCBpbmZlcmVuY2UiKTsKICB9CgogIHZvaWQgdHJhbnNmb3JtUG9zdEluZmVyZW5jZSgKICAgICAgVHJlZU5vZGUgbm9kZSwgYm9vbCB0cmFuc2Zvcm1TZXRMaXRlcmFscywgYm9vbCB0cmFuc2Zvcm1Db2xsZWN0aW9ucykgewogICAgaWYgKHRyYW5zZm9ybUNvbGxlY3Rpb25zKSB7CiAgICAgIG5vZGUuYWNjZXB0KGNvbGxlY3Rpb25UcmFuc2Zvcm1lciA/Pz0gbmV3IENvbGxlY3Rpb25UcmFuc2Zvcm1lcih0aGlzKSk7CiAgICB9CiAgICBpZiAodHJhbnNmb3JtU2V0TGl0ZXJhbHMpIHsKICAgICAgbm9kZS5hY2NlcHQoc2V0TGl0ZXJhbFRyYW5zZm9ybWVyID8/PSBuZXcgU2V0TGl0ZXJhbFRyYW5zZm9ybWVyKHRoaXMsCiAgICAgICAgICB0cmFuc2Zvcm1Db25zdDogIXRhcmdldC5lbmFibGVDb25zdGFudFVwZGF0ZTIwMTgpKTsKICAgIH0KICB9CgogIHZvaWQgdHJhbnNmb3JtTGlzdFBvc3RJbmZlcmVuY2UoTGlzdDxUcmVlTm9kZT4gbGlzdCwKICAgICAgYm9vbCB0cmFuc2Zvcm1TZXRMaXRlcmFscywgYm9vbCB0cmFuc2Zvcm1Db2xsZWN0aW9ucykgewogICAgaWYgKHRyYW5zZm9ybVNldExpdGVyYWxzKSB7CiAgICAgIFNldExpdGVyYWxUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHNldExpdGVyYWxUcmFuc2Zvcm1lciA/Pz0KICAgICAgICAgIG5ldyBTZXRMaXRlcmFsVHJhbnNmb3JtZXIodGhpcywKICAgICAgICAgICAgICB0cmFuc2Zvcm1Db25zdDogIXRhcmdldC5lbmFibGVDb25zdGFudFVwZGF0ZTIwMTgpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHsKICAgICAgICBsaXN0W2ldID0gbGlzdFtpXS5hY2NlcHQodHJhbnNmb3JtZXIpOwogICAgICB9CiAgICB9CiAgICBpZiAodHJhbnNmb3JtQ29sbGVjdGlvbnMpIHsKICAgICAgQ29sbGVjdGlvblRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0KICAgICAgICAgIGNvbGxlY3Rpb25UcmFuc2Zvcm1lciA/Pz0gbmV3IENvbGxlY3Rpb25UcmFuc2Zvcm1lcih0aGlzKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgbGlzdFtpXSA9IGxpc3RbaV0uYWNjZXB0KHRyYW5zZm9ybWVyKTsKICAgICAgfQogICAgfQogIH0KCiAgRXhwcmVzc2lvbiBpbnN0YW50aWF0ZUludm9jYXRpb24oRXhwcmVzc2lvbiByZWNlaXZlciwgU3RyaW5nIG5hbWUsCiAgICAgIEFyZ3VtZW50cyBhcmd1bWVudHMsIGludCBvZmZzZXQsIGJvb2wgaXNTdXBlcikgewogICAgcmV0dXJuIHRhcmdldC5iYWNrZW5kVGFyZ2V0Lmluc3RhbnRpYXRlSW52b2NhdGlvbigKICAgICAgICBjb3JlVHlwZXMsIHJlY2VpdmVyLCBuYW1lLCBhcmd1bWVudHMsIG9mZnNldCwgaXNTdXBlcik7CiAgfQoKICBFeHByZXNzaW9uIGluc3RhbnRpYXRlTm9TdWNoTWV0aG9kRXJyb3IoCiAgICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIsIFN0cmluZyBuYW1lLCBBcmd1bWVudHMgYXJndW1lbnRzLCBpbnQgb2Zmc2V0LAogICAgICB7Ym9vbCBpc01ldGhvZDogZmFsc2UsCiAgICAgIGJvb2wgaXNHZXR0ZXI6IGZhbHNlLAogICAgICBib29sIGlzU2V0dGVyOiBmYWxzZSwKICAgICAgYm9vbCBpc0ZpZWxkOiBmYWxzZSwKICAgICAgYm9vbCBpc0xvY2FsVmFyaWFibGU6IGZhbHNlLAogICAgICBib29sIGlzRHluYW1pYzogZmFsc2UsCiAgICAgIGJvb2wgaXNTdXBlcjogZmFsc2UsCiAgICAgIGJvb2wgaXNTdGF0aWM6IGZhbHNlLAogICAgICBib29sIGlzQ29uc3RydWN0b3I6IGZhbHNlLAogICAgICBib29sIGlzVG9wTGV2ZWw6IGZhbHNlfSkgewogICAgcmV0dXJuIHRhcmdldC5iYWNrZW5kVGFyZ2V0Lmluc3RhbnRpYXRlTm9TdWNoTWV0aG9kRXJyb3IoCiAgICAgICAgY29yZVR5cGVzLCByZWNlaXZlciwgbmFtZSwgYXJndW1lbnRzLCBvZmZzZXQsCiAgICAgICAgaXNNZXRob2Q6IGlzTWV0aG9kLAogICAgICAgIGlzR2V0dGVyOiBpc0dldHRlciwKICAgICAgICBpc1NldHRlcjogaXNTZXR0ZXIsCiAgICAgICAgaXNGaWVsZDogaXNGaWVsZCwKICAgICAgICBpc0xvY2FsVmFyaWFibGU6IGlzTG9jYWxWYXJpYWJsZSwKICAgICAgICBpc0R5bmFtaWM6IGlzRHluYW1pYywKICAgICAgICBpc1N1cGVyOiBpc1N1cGVyLAogICAgICAgIGlzU3RhdGljOiBpc1N0YXRpYywKICAgICAgICBpc0NvbnN0cnVjdG9yOiBpc0NvbnN0cnVjdG9yLAogICAgICAgIGlzVG9wTGV2ZWw6IGlzVG9wTGV2ZWwpOwogIH0KCiAgdm9pZCByZWxlYXNlQW5jaWxsYXJ5UmVzb3VyY2VzKCkgewogICAgaGllcmFyY2h5ID0gbnVsbDsKICAgIHR5cGVJbmZlcmVuY2VFbmdpbmUgPSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgS2VybmVsQ2xhc3NCdWlsZGVyIGNvbXB1dGVDbGFzc0J1aWxkZXJGcm9tVGFyZ2V0Q2xhc3MoQ2xhc3MgY2xzKSB7CiAgICBMaWJyYXJ5IGtlcm5lbExpYnJhcnkgPSBjbHMuZW5jbG9zaW5nTGlicmFyeTsKICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkgPSBidWlsZGVyc1trZXJuZWxMaWJyYXJ5LmltcG9ydFVyaV07CiAgICBpZiAobGlicmFyeSA9PSBudWxsKSB7CiAgICAgIHJldHVybiB0YXJnZXQuZGlsbFRhcmdldC5sb2FkZXIuY29tcHV0ZUNsYXNzQnVpbGRlckZyb21UYXJnZXRDbGFzcyhjbHMpOwogICAgfQogICAgcmV0dXJuIGxpYnJhcnlbY2xzLm5hbWVdOwogIH0KCiAgQG92ZXJyaWRlCiAgS2VybmVsVHlwZUJ1aWxkZXIgY29tcHV0ZVR5cGVCdWlsZGVyKERhcnRUeXBlIHR5cGUpIHsKICAgIHJldHVybiB0eXBlLmFjY2VwdChuZXcgVHlwZUJ1aWxkZXJDb21wdXRlcih0aGlzKSk7CiAgfQp9CgovLy8gQSBtaW5pbWFsIGltcGxlbWVudGF0aW9uIG9mIGRhcnQ6Y29yZSB0aGF0IGlzIHN1ZmZpY2llbnQgdG8gY3JlYXRlIGFuCi8vLyBpbnN0YW5jZSBvZiBbQ29yZVR5cGVzXSBhbmQgY29tcGlsZSBhIHByb2dyYW0uCmNvbnN0IFN0cmluZyBkZWZhdWx0RGFydENvcmVTb3VyY2UgPSAiIiIKaW1wb3J0ICdkYXJ0Ol9pbnRlcm5hbCc7CmltcG9ydCAnZGFydDphc3luYyc7CgpleHBvcnQgJ2RhcnQ6YXN5bmMnIHNob3cgRnV0dXJlLCBTdHJlYW07CgpwcmludChvYmplY3QpIHt9CgpjbGFzcyBJdGVyYXRvciB7fQoKY2xhc3MgSXRlcmFibGUge30KCmNsYXNzIExpc3QgZXh0ZW5kcyBJdGVyYWJsZSB7CiAgZmFjdG9yeSBMaXN0LnVubW9kaWZpYWJsZShlbGVtZW50cykgPT4gbnVsbDsKfQoKY2xhc3MgTWFwIGV4dGVuZHMgSXRlcmFibGUgewogIGZhY3RvcnkgTWFwLnVubW9kaWZpYWJsZShvdGhlcikgPT4gbnVsbDsKfQoKY2xhc3MgTm9TdWNoTWV0aG9kRXJyb3IgewogIE5vU3VjaE1ldGhvZEVycm9yLndpdGhJbnZvY2F0aW9uKHJlY2VpdmVyLCBpbnZvY2F0aW9uKTsKfQoKY2xhc3MgTnVsbCB7fQoKY2xhc3MgT2JqZWN0IHsKICBub1N1Y2hNZXRob2QoaW52b2NhdGlvbikgPT4gbnVsbDsKfQoKY2xhc3MgU3RyaW5nIHt9CgpjbGFzcyBTeW1ib2wge30KCmNsYXNzIFR5cGUge30KCmNsYXNzIF9JbnZvY2F0aW9uTWlycm9yIHsKICBfSW52b2NhdGlvbk1pcnJvci5fd2l0aFR5cGUoX21lbWJlck5hbWUsIF90eXBlLCBfdHlwZUFyZ3VtZW50cywKICAgICAgX3Bvc2l0aW9uYWxBcmd1bWVudHMsIF9uYW1lZEFyZ3VtZW50cyk7Cn0KCmNsYXNzIGJvb2wge30KCmNsYXNzIGRvdWJsZSBleHRlbmRzIG51bSB7fQoKY2xhc3MgaW50IGV4dGVuZHMgbnVtIHt9CgpjbGFzcyBudW0ge30KCmNsYXNzIF9TeW5jSXRlcmFibGUge30KCmNsYXNzIF9TeW5jSXRlcmF0b3IgewogIHZhciBfY3VycmVudDsKICB2YXIgX3lpZWxkRWFjaEl0ZXJhYmxlOwp9CgpjbGFzcyBGdW5jdGlvbiB7fQoiIiI7CgovLy8gQSBtaW5pbWFsIGltcGxlbWVudGF0aW9uIG9mIGRhcnQ6YXN5bmMgdGhhdCBpcyBzdWZmaWNpZW50IHRvIGNyZWF0ZSBhbgovLy8gaW5zdGFuY2Ugb2YgW0NvcmVUeXBlc10gYW5kIGNvbXBpbGUgcHJvZ3JhbS4KY29uc3QgU3RyaW5nIGRlZmF1bHREYXJ0QXN5bmNTb3VyY2UgPSAiIiIKX2FzeW5jRXJyb3JXcmFwcGVySGVscGVyKGNvbnRpbnVhdGlvbikge30KCl9hc3luY1N0YWNrVHJhY2VIZWxwZXIoYXN5bmNfb3ApIHt9CgpfYXN5bmNUaGVuV3JhcHBlckhlbHBlcihjb250aW51YXRpb24pIHt9CgpfYXdhaXRIZWxwZXIob2JqZWN0LCB0aGVuQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2ssIGF3YWl0ZXIpIHt9CgpfY29tcGxldGVPbkFzeW5jUmV0dXJuKGNvbXBsZXRlciwgdmFsdWUpIHt9CgpjbGFzcyBfQXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlciB7CiAgYWRkKGV2ZW50KSB7fQoKICBhZGRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSkge30KCiAgYWRkU3RyZWFtKHN0cmVhbSkge30KCiAgY2xvc2UoKSB7fQoKICBnZXQgc3RyZWFtID0+IG51bGw7Cn0KCmNsYXNzIENvbXBsZXRlciB7CiAgZmFjdG9yeSBDb21wbGV0ZXIuc3luYygpID0+IG51bGw7CgogIGdldCBmdXR1cmU7CgogIGNvbXBsZXRlKFt2YWx1ZV0pOwoKICBjb21wbGV0ZUVycm9yKGVycm9yLCBbc3RhY2tUcmFjZV0pOwp9CgpjbGFzcyBGdXR1cmUgewogIGZhY3RvcnkgRnV0dXJlLm1pY3JvdGFzayhjb21wdXRhdGlvbikgPT4gbnVsbDsKfQoKY2xhc3MgRnV0dXJlT3Igewp9CgpjbGFzcyBfQXN5bmNBd2FpdENvbXBsZXRlciBpbXBsZW1lbnRzIENvbXBsZXRlciB7CiAgZ2V0IGZ1dHVyZSA9PiBudWxsOwoKICBjb21wbGV0ZShbdmFsdWVdKSB7fQoKICBjb21wbGV0ZUVycm9yKGVycm9yLCBbc3RhY2tUcmFjZV0pIHt9Cn0KCmNsYXNzIFN0cmVhbSB7fQoKY2xhc3MgX1N0cmVhbUl0ZXJhdG9yIHsKICBnZXQgY3VycmVudCA9PiBudWxsOwoKICBtb3ZlTmV4dCgpIHt9CgogIGNhbmNlbCgpIHt9Cn0KIiIiOwqEyQBOTjwBHQEhASEBKQEhCRMUDxMSFBYXERsXExIBLTQBOAEvAT8BQgElASUBHQkYERkSHiEeGxIlHiYpMCkwHyUeLzQxJiMBKjEBJwkWHxUVHBwgGxgaFQE5ATcBSgFLAUgBPgFEAUUBMAFGAUsBLwErATMBPAFAAS09HwE1HgE+ASwcF00bHRsBMQEnASMBLwEvAUsXATokASMBNzMfASkoARkZM1AwQyMgSBAaTEMIG0k+JSIIBgEZShEaDEUrTjBJCEpCIyAkBgFKISIrIx06SkhNTyYnO0A8RggjQgYiJCJKKQgaBhIEAUcWGDMBGTQBD08GBAEpOx4hQAYvBAFCLCA7NwQBOStOTipLIjs0IDktRBQKLR4nKyQKCAYEASYkHR0nSSQ9ASIiGEUhFhUfNE01CAZPThk4PgErMgQBKwFCUQQBGB9FOSQeGhEiCggIKTYnBh0lHg8zQCcIBiQBOSQgCAglBAEgPz85JDYsCCogNSwKCAhGMSocCDI/CAYdCRo0NEs5IQ4OCggaOSQ2KwgIMU1NTyciBi0cBAEdQSwoOTkkJwgpRiErHwwgCgogKAgIBAEYFzkkNjMICC8EAScZOSQ2RAgIQQQBJhM5JDcICDwEASgTOSQtCAg/BAEfEzkkNAgIMgQBSxM5JEMICDoEAUwiEzkkEU8ICEYEAR8TOSQwCAg0BAEeEzkkLwgIMwQBSg09LS4rJiBFCCwgSCcILSBFKAgGBAFMRU5LDk1NQDYkOiUwLiIMCggGAUQ+RgYBJzknLwkjKTo2LTYsPDcxMkEsEwwKJi9LER0KCDpMQwFIKQE1Hjk1HhgWTRoVBgEtFAQBHR4qLkY4MyZMJz00GCg9HBcIBgE8NR8jLS8nIVBLHjhBIhwdP0I8PxYODAoIHUZOGE8cFwgGBAFGLEsBNlEROUcaKjMlMzceQUkjTw4MHjY6MEE3QylGECJHKRwXJQ4MCgEaKjMdMzceQUkjTw4MJjY6MEE3QylGECJHKRwXJQ4MCggIRRQEARo5JDY7ICEKCAglBAElMSo5HiUuKC0oCggIIi9DNzIKCAY5BAEcKzYwKzAIBx09OQ0/NEA1BjFCBiIuBAFIEDM9GBIWBAFJAS8qAShAKkIoQAEpBAFBOEAsCAYoBAEXIwE5LSYSUAoICEkEAUAfOEAgRAgGJwQBRjgjHzhAJk4IBi4EAUs4IzhAKzgIBjMEAUs4RAE0OEBELgoIBkkzBAE9OEAqKwoBN0c0CggGPAQBLUpDNisWBAElI0oEAUojAU5MTQ4/Q0U2JDsmMS4vDAoIBjUzBjgyAU9QFTA0KSUrLyclODQzMiclOCtNTjQkCAYBPR5RUSZBSTMEAR9NIE4GIEw+BgQBNz4gRCpBLi8IBiAqRS4vCAYEAUU3N0AEAStJHRwcGyMdGxwhIT42HBwcGioeGhwmIQQBJRYgBAEMRTJAG08GHgQBDDg3BAIBSjMpGRUBKQERARIBEgEeLwIBHSsCARo6AgEOAQ8kAgEQARABDgEaQi4CAQ4BHAEZAQ0BFwEWEBoCARIFAUsxKioBJAEpAT4BLAEjEAEhARcBDQEWAgESJAEOARUBJgIBDzECARECATIWARcBKAIBEAEYFwEQAQ4CBQE1cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NvdXJjZS9zb3VyY2VfbG9hZGVyLmRhcnRDc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9jb25zdGFudF9ldmFsdWF0b3IuZGFydMABYesvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIFRoaXMgbGlicmFyeSBpbXBsZW1lbnRzIGEga2VybmVsMmtlcm5lbCBjb25zdGFudCBldmFsdWF0aW9uIHRyYW5zZm9ybWF0aW9uLgovLy8KLy8vIEV2ZW4gdGhvdWdoIGl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIGZyb250ZW5kIGRvZXMgbm90IGVtaXQga2VybmVsIEFTVCB3aGljaAovLy8gY29udGFpbnMgY29tcGlsZS10aW1lIGVycm9ycywgdGhpcyB0cmFuc2Zvcm1hdGlvbiBzdGlsbCBwZXJmb3JtcyBzb21lCi8vLyB2YWxpYXRpb24gYW5kIHRocm93cyBhIFtDb25zdGFudEV2YWx1YXRpb25FcnJvcl0gaWYgdGhlcmUgd2FzIGEgY29tcGlsZS10aW1lCi8vLyBlcnJvcnMuCi8vLwovLy8gRHVlIHRvIHRoZSBsYWNrIGluZm9ybWF0aW9uIHdoaWNoIGlzIGlzIG9ubHkgYXZhaWxhYmxlIGluIHRoZSBmcm9udC1lbmQsCi8vLyB0aGlzIHZhbGlkYXRpb24gaXMgaW5jb21wbGV0ZSAoZS5nLiB3aGV0aGVyIGFuIGludGVnZXIgbGl0ZXJhbCB1c2VkIHRoZQovLy8gaGV4YWRlY2ltYWwgc3ludGF4IG9yIG5vdCkuCi8vLwovLy8gRnVydGhlcm1vcmUgZHVlIHRvIHRoZSBsb3dlcmluZyBvZiBjZXJ0YWluIGNvbnN0cnVjdHMgaW4gdGhlIGZyb250LWVuZAovLy8gKGUuZy4gJz8/Jykgd2UgbmVlZCB0byBzdXBwb3J0IGEgc3VwZXItc2V0IG9mIHRoZSBub3JtYWwgY29uc3RhbnQgZXhwcmVzc2lvbgovLy8gbGFuZ3VhZ2UuICBJc3N1ZShodHRwOi8vZGFydGJ1Zy5jb20vMzE3OTkpCmxpYnJhcnkgZmFzdGEuY29uc3RhbnRfZXZhbHVhdG9yOwoKaW1wb3J0ICdkYXJ0OmNvcmUnIGhpZGUgTWFwRW50cnk7CgppbXBvcnQgJ2RhcnQ6aW8nIGFzIGlvOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2Nsb25lLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCc7CmltcG9ydCAncGFja2FnZTprZXJuZWwva2VybmVsLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQnOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90YXJnZXQvdGFyZ2V0cy5kYXJ0JzsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cKICAgICAgICBMb2NhdGVkTWVzc2FnZSwKICAgICAgICBNZXNzYWdlLAogICAgICAgIG1lc3NhZ2VDb25zdEV2YWxDaXJjdWxhcml0eSwKICAgICAgICBtZXNzYWdlQ29uc3RFdmFsQ29udGV4dCwKICAgICAgICBtZXNzYWdlQ29uc3RFdmFsRmFpbGVkQXNzZXJ0aW9uLAogICAgICAgIG1lc3NhZ2VDb25zdEV2YWxJdGVyYXRpb25JbkNvbnN0TGlzdCwKICAgICAgICBtZXNzYWdlQ29uc3RFdmFsSXRlcmF0aW9uSW5Db25zdFNldCwKICAgICAgICBtZXNzYWdlQ29uc3RFdmFsSXRlcmF0aW9uSW5Db25zdE1hcCwKICAgICAgICBtZXNzYWdlQ29uc3RFdmFsTm90TGlzdE9yU2V0SW5TcHJlYWQsCiAgICAgICAgbWVzc2FnZUNvbnN0RXZhbE5vdE1hcEluU3ByZWFkLAogICAgICAgIG1lc3NhZ2VDb25zdEV2YWxOdWxsVmFsdWUsCiAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxEZWZlcnJlZExpYnJhcnksCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxEdXBsaWNhdGVFbGVtZW50LAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsRHVwbGljYXRlS2V5LAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsRWxlbWVudEltcGxlbWVudHNFcXVhbCwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEZhaWxlZEFzc2VydGlvbldpdGhNZXNzYWdlLAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsRnJlZVR5cGVQYXJhbWV0ZXIsCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkVHlwZSwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRCaW5hcnlPcGVyYW5kVHlwZSwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRFcXVhbHNPcGVyYW5kVHlwZSwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRNZXRob2RJbnZvY2F0aW9uLAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFByb3BlcnR5R2V0LAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFN0YXRpY0ludm9jYXRpb24sCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkU3RyaW5nSW50ZXJwb2xhdGlvbk9wZXJhbmQsCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkU3ltYm9sTmFtZSwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEtleUltcGxlbWVudHNFcXVhbCwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbE5lZ2F0aXZlU2hpZnQsCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxOb25Db25zdGFudExpdGVyYWwsCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxOb25Db25zdGFudFZhcmlhYmxlR2V0LAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsWmVyb0Rpdmlzb3I7CgppbXBvcnQgJ2NvbGxlY3Rpb25zLmRhcnQnCiAgICBzaG93CiAgICAgICAgRm9yRWxlbWVudCwKICAgICAgICBGb3JJbkVsZW1lbnQsCiAgICAgICAgSWZFbGVtZW50LAogICAgICAgIFNwcmVhZEVsZW1lbnQsCiAgICAgICAgRm9yTWFwRW50cnksCiAgICAgICAgRm9ySW5NYXBFbnRyeSwKICAgICAgICBJZk1hcEVudHJ5LAogICAgICAgIFNwcmVhZE1hcEVudHJ5OwoKQ29tcG9uZW50IHRyYW5zZm9ybUNvbXBvbmVudChDb21wb25lbnQgY29tcG9uZW50LCBDb25zdGFudHNCYWNrZW5kIGJhY2tlbmQsCiAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50RGVmaW5lcywgRXJyb3JSZXBvcnRlciBlcnJvclJlcG9ydGVyLAogICAge2Jvb2wga2VlcEZpZWxkczogdHJ1ZSwKICAgIGJvb2wgZW5hYmxlQXNzZXJ0czogZmFsc2UsCiAgICBib29sIGV2YWx1YXRlQW5ub3RhdGlvbnM6IHRydWUsCiAgICBib29sIGRlc3VnYXJTZXRzOiBmYWxzZSwKICAgIENvcmVUeXBlcyBjb3JlVHlwZXMsCiAgICBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHl9KSB7CiAgY29yZVR5cGVzID8/PSBuZXcgQ29yZVR5cGVzKGNvbXBvbmVudCk7CiAgaGllcmFyY2h5ID8/PSBuZXcgQ2xhc3NIaWVyYXJjaHkoY29tcG9uZW50KTsKCiAgZmluYWwgdHlwZUVudmlyb25tZW50ID0gbmV3IFR5cGVFbnZpcm9ubWVudChjb3JlVHlwZXMsIGhpZXJhcmNoeSk7CgogIHRyYW5zZm9ybUxpYnJhcmllcyhjb21wb25lbnQubGlicmFyaWVzLCBiYWNrZW5kLCBlbnZpcm9ubWVudERlZmluZXMsCiAgICAgIHR5cGVFbnZpcm9ubWVudCwgZXJyb3JSZXBvcnRlciwKICAgICAga2VlcEZpZWxkczoga2VlcEZpZWxkcywKICAgICAgZW5hYmxlQXNzZXJ0czogZW5hYmxlQXNzZXJ0cywKICAgICAgZGVzdWdhclNldHM6IGRlc3VnYXJTZXRzLAogICAgICBldmFsdWF0ZUFubm90YXRpb25zOiBldmFsdWF0ZUFubm90YXRpb25zKTsKICByZXR1cm4gY29tcG9uZW50Owp9Cgp2b2lkIHRyYW5zZm9ybUxpYnJhcmllcygKICAgIExpc3Q8TGlicmFyeT4gbGlicmFyaWVzLAogICAgQ29uc3RhbnRzQmFja2VuZCBiYWNrZW5kLAogICAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudERlZmluZXMsCiAgICBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LAogICAgRXJyb3JSZXBvcnRlciBlcnJvclJlcG9ydGVyLAogICAge2Jvb2wga2VlcEZpZWxkczogdHJ1ZSwKICAgIGJvb2wga2VlcFZhcmlhYmxlczogZmFsc2UsCiAgICBib29sIGV2YWx1YXRlQW5ub3RhdGlvbnM6IHRydWUsCiAgICBib29sIGRlc3VnYXJTZXRzOiBmYWxzZSwKICAgIGJvb2wgZW5hYmxlQXNzZXJ0czogZmFsc2V9KSB7CiAgZmluYWwgQ29uc3RhbnRzVHJhbnNmb3JtZXIgY29uc3RhbnRzVHJhbnNmb3JtZXIgPSBuZXcgQ29uc3RhbnRzVHJhbnNmb3JtZXIoCiAgICAgIGJhY2tlbmQsCiAgICAgIGVudmlyb25tZW50RGVmaW5lcywKICAgICAga2VlcEZpZWxkcywKICAgICAga2VlcFZhcmlhYmxlcywKICAgICAgZXZhbHVhdGVBbm5vdGF0aW9ucywKICAgICAgZGVzdWdhclNldHMsCiAgICAgIHR5cGVFbnZpcm9ubWVudCwKICAgICAgZW5hYmxlQXNzZXJ0cywKICAgICAgZXJyb3JSZXBvcnRlcik7CiAgZm9yIChmaW5hbCBMaWJyYXJ5IGxpYnJhcnkgaW4gbGlicmFyaWVzKSB7CiAgICBjb25zdGFudHNUcmFuc2Zvcm1lci5jb252ZXJ0TGlicmFyeShsaWJyYXJ5KTsKICB9Cn0KCmNsYXNzIEphdmFTY3JpcHRJbnRDb25zdGFudCBleHRlbmRzIERvdWJsZUNvbnN0YW50IHsKICBmaW5hbCBCaWdJbnQgYmlnSW50VmFsdWU7CiAgSmF2YVNjcmlwdEludENvbnN0YW50KGludCB2YWx1ZSkgOiB0aGlzLmZyb21CaWdJbnQoQmlnSW50LmZyb20odmFsdWUpKTsKICBKYXZhU2NyaXB0SW50Q29uc3RhbnQuZnJvbURvdWJsZShkb3VibGUgdmFsdWUpCiAgICAgIDogYmlnSW50VmFsdWUgPSBCaWdJbnQuZnJvbSh2YWx1ZSksCiAgICAgICAgc3VwZXIodmFsdWUpOwogIEphdmFTY3JpcHRJbnRDb25zdGFudC5mcm9tQmlnSW50KHRoaXMuYmlnSW50VmFsdWUpCiAgICAgIDogc3VwZXIoYmlnSW50VmFsdWUudG9Eb3VibGUoKSk7CiAgSmF2YVNjcmlwdEludENvbnN0YW50LmZyb21VSW50NjQoaW50IHZhbHVlKQogICAgICA6IHRoaXMuZnJvbUJpZ0ludChCaWdJbnQuZnJvbSh2YWx1ZSkudG9VbnNpZ25lZCg2NCkpOwoKICBEYXJ0VHlwZSBnZXRUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gdHlwZXMuaW50VHlwZTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyRiaWdJbnRWYWx1ZSc7Cn0KCmNsYXNzIENvbnN0YW50c1RyYW5zZm9ybWVyIGV4dGVuZHMgVHJhbnNmb3JtZXIgewogIGZpbmFsIENvbnN0YW50RXZhbHVhdG9yIGNvbnN0YW50RXZhbHVhdG9yOwogIGZpbmFsIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQ7CgogIC8vLyBXaGV0aGVyIHRvIHByZXNlcnZlIGNvbnN0YW50IFtGaWVsZF1zLiAgQWxsIHVzZS1zaXRlcyB3aWxsIGJlIHJld3JpdHRlbi4KICBmaW5hbCBib29sIGtlZXBGaWVsZHM7CiAgZmluYWwgYm9vbCBrZWVwVmFyaWFibGVzOwogIGZpbmFsIGJvb2wgZXZhbHVhdGVBbm5vdGF0aW9uczsKICBmaW5hbCBib29sIGRlc3VnYXJTZXRzOwoKICBDb25zdGFudHNUcmFuc2Zvcm1lcigKICAgICAgQ29uc3RhbnRzQmFja2VuZCBiYWNrZW5kLAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50RGVmaW5lcywKICAgICAgdGhpcy5rZWVwRmllbGRzLAogICAgICB0aGlzLmtlZXBWYXJpYWJsZXMsCiAgICAgIHRoaXMuZXZhbHVhdGVBbm5vdGF0aW9ucywKICAgICAgdGhpcy5kZXN1Z2FyU2V0cywKICAgICAgdGhpcy50eXBlRW52aXJvbm1lbnQsCiAgICAgIGJvb2wgZW5hYmxlQXNzZXJ0cywKICAgICAgRXJyb3JSZXBvcnRlciBlcnJvclJlcG9ydGVyKQogICAgICA6IGNvbnN0YW50RXZhbHVhdG9yID0gbmV3IENvbnN0YW50RXZhbHVhdG9yKGJhY2tlbmQsIGVudmlyb25tZW50RGVmaW5lcywKICAgICAgICAgICAgdHlwZUVudmlyb25tZW50LCBlbmFibGVBc3NlcnRzLCBlcnJvclJlcG9ydGVyLAogICAgICAgICAgICBkZXN1Z2FyU2V0czogZGVzdWdhclNldHMpOwoKICAvLyBUcmFuc2Zvcm0gdGhlIGxpYnJhcnkvY2xhc3MgbWVtYmVyczoKCiAgdm9pZCBjb252ZXJ0TGlicmFyeShMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIHRyYW5zZm9ybUFubm90YXRpb25zKGxpYnJhcnkuYW5ub3RhdGlvbnMsIGxpYnJhcnkpOwoKICAgIHRyYW5zZm9ybUxpc3QobGlicmFyeS5kZXBlbmRlbmNpZXMsIHRoaXMsIGxpYnJhcnkpOwogICAgdHJhbnNmb3JtTGlzdChsaWJyYXJ5LnBhcnRzLCB0aGlzLCBsaWJyYXJ5KTsKICAgIHRyYW5zZm9ybUxpc3QobGlicmFyeS50eXBlZGVmcywgdGhpcywgbGlicmFyeSk7CiAgICB0cmFuc2Zvcm1MaXN0KGxpYnJhcnkuY2xhc3NlcywgdGhpcywgbGlicmFyeSk7CiAgICB0cmFuc2Zvcm1MaXN0KGxpYnJhcnkucHJvY2VkdXJlcywgdGhpcywgbGlicmFyeSk7CiAgICB0cmFuc2Zvcm1MaXN0KGxpYnJhcnkuZmllbGRzLCB0aGlzLCBsaWJyYXJ5KTsKCiAgICBpZiAoIWtlZXBGaWVsZHMpIHsKICAgICAgLy8gVGhlIHRyYW5zZm9ybWVyIEFQSSBkb2VzIG5vdCBpdGVyYXRlIG92ZXIgYExpYnJhcnkuYWRkaXRpb25hbEV4cG9ydHNgLAogICAgICAvLyBzbyB3ZSBtYW51YWxseSBkZWxldGUgdGhlIHJlZmVyZW5jZXMgdG8gc2hha2VuIG5vZGVzLgogICAgICBsaWJyYXJ5LmFkZGl0aW9uYWxFeHBvcnRzLnJlbW92ZVdoZXJlKChSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CiAgICAgICAgcmV0dXJuIHJlZmVyZW5jZS5ub2RlIGlzIEZpZWxkICYmIHJlZmVyZW5jZS5jYW5vbmljYWxOYW1lID09IG51bGw7CiAgICAgIH0pOwogICAgfQogIH0KCiAgdmlzaXRMaWJyYXJ5UGFydChMaWJyYXJ5UGFydCBub2RlKSB7CiAgICBjb25zdGFudEV2YWx1YXRvci53aXRoTmV3RW52aXJvbm1lbnQoKCkgewogICAgICB0cmFuc2Zvcm1Bbm5vdGF0aW9ucyhub2RlLmFubm90YXRpb25zLCBub2RlKTsKICAgIH0pOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICB2aXNpdExpYnJhcnlEZXBlbmRlbmN5KExpYnJhcnlEZXBlbmRlbmN5IG5vZGUpIHsKICAgIGNvbnN0YW50RXZhbHVhdG9yLndpdGhOZXdFbnZpcm9ubWVudCgoKSB7CiAgICAgIHRyYW5zZm9ybUFubm90YXRpb25zKG5vZGUuYW5ub3RhdGlvbnMsIG5vZGUpOwogICAgfSk7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIHZpc2l0Q2xhc3MoQ2xhc3Mgbm9kZSkgewogICAgY29uc3RhbnRFdmFsdWF0b3Iud2l0aE5ld0Vudmlyb25tZW50KCgpIHsKICAgICAgdHJhbnNmb3JtQW5ub3RhdGlvbnMobm9kZS5hbm5vdGF0aW9ucywgbm9kZSk7CiAgICAgIHRyYW5zZm9ybUxpc3Qobm9kZS5maWVsZHMsIHRoaXMsIG5vZGUpOwogICAgICB0cmFuc2Zvcm1MaXN0KG5vZGUudHlwZVBhcmFtZXRlcnMsIHRoaXMsIG5vZGUpOwogICAgICB0cmFuc2Zvcm1MaXN0KG5vZGUuY29uc3RydWN0b3JzLCB0aGlzLCBub2RlKTsKICAgICAgdHJhbnNmb3JtTGlzdChub2RlLnByb2NlZHVyZXMsIHRoaXMsIG5vZGUpOwogICAgICB0cmFuc2Zvcm1MaXN0KG5vZGUucmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JzLCB0aGlzLCBub2RlKTsKICAgIH0pOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICB2aXNpdFByb2NlZHVyZShQcm9jZWR1cmUgbm9kZSkgewogICAgY29uc3RhbnRFdmFsdWF0b3Iud2l0aE5ld0Vudmlyb25tZW50KCgpIHsKICAgICAgdHJhbnNmb3JtQW5ub3RhdGlvbnMobm9kZS5hbm5vdGF0aW9ucywgbm9kZSk7CiAgICAgIG5vZGUuZnVuY3Rpb24gPSBub2RlLmZ1bmN0aW9uLmFjY2VwdCh0aGlzKS4ucGFyZW50ID0gbm9kZTsKICAgIH0pOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICB2aXNpdENvbnN0cnVjdG9yKENvbnN0cnVjdG9yIG5vZGUpIHsKICAgIGNvbnN0YW50RXZhbHVhdG9yLndpdGhOZXdFbnZpcm9ubWVudCgoKSB7CiAgICAgIHRyYW5zZm9ybUFubm90YXRpb25zKG5vZGUuYW5ub3RhdGlvbnMsIG5vZGUpOwogICAgICB0cmFuc2Zvcm1MaXN0KG5vZGUuaW5pdGlhbGl6ZXJzLCB0aGlzLCBub2RlKTsKICAgICAgbm9kZS5mdW5jdGlvbiA9IG5vZGUuZnVuY3Rpb24uYWNjZXB0KHRoaXMpLi5wYXJlbnQgPSBub2RlOwogICAgfSk7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIHZpc2l0VHlwZWRlZihUeXBlZGVmIG5vZGUpIHsKICAgIGNvbnN0YW50RXZhbHVhdG9yLndpdGhOZXdFbnZpcm9ubWVudCgoKSB7CiAgICAgIHRyYW5zZm9ybUFubm90YXRpb25zKG5vZGUuYW5ub3RhdGlvbnMsIG5vZGUpOwogICAgICB0cmFuc2Zvcm1MaXN0KG5vZGUudHlwZVBhcmFtZXRlcnMsIHRoaXMsIG5vZGUpOwogICAgICB0cmFuc2Zvcm1MaXN0KG5vZGUudHlwZVBhcmFtZXRlcnNPZkZ1bmN0aW9uVHlwZSwgdGhpcywgbm9kZSk7CiAgICAgIHRyYW5zZm9ybUxpc3Qobm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycywgdGhpcywgbm9kZSk7CiAgICAgIHRyYW5zZm9ybUxpc3Qobm9kZS5uYW1lZFBhcmFtZXRlcnMsIHRoaXMsIG5vZGUpOwogICAgfSk7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIHZpc2l0UmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IoUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3Igbm9kZSkgewogICAgY29uc3RhbnRFdmFsdWF0b3Iud2l0aE5ld0Vudmlyb25tZW50KCgpIHsKICAgICAgdHJhbnNmb3JtQW5ub3RhdGlvbnMobm9kZS5hbm5vdGF0aW9ucywgbm9kZSk7CiAgICAgIHRyYW5zZm9ybUxpc3Qobm9kZS50eXBlUGFyYW1ldGVycywgdGhpcywgbm9kZSk7CiAgICAgIHRyYW5zZm9ybUxpc3Qobm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycywgdGhpcywgbm9kZSk7CiAgICAgIHRyYW5zZm9ybUxpc3Qobm9kZS5uYW1lZFBhcmFtZXRlcnMsIHRoaXMsIG5vZGUpOwogICAgfSk7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIHZpc2l0VHlwZVBhcmFtZXRlcihUeXBlUGFyYW1ldGVyIG5vZGUpIHsKICAgIHRyYW5zZm9ybUFubm90YXRpb25zKG5vZGUuYW5ub3RhdGlvbnMsIG5vZGUpOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICB2b2lkIHRyYW5zZm9ybUFubm90YXRpb25zKExpc3Q8RXhwcmVzc2lvbj4gbm9kZXMsIFRyZWVOb2RlIHBhcmVudCkgewogICAgaWYgKGV2YWx1YXRlQW5ub3RhdGlvbnMgJiYgbm9kZXMubGVuZ3RoID4gMCkgewogICAgICB0cmFuc2Zvcm1FeHByZXNzaW9ucyhub2RlcywgcGFyZW50KTsKICAgIH0KICB9CgogIHZvaWQgdHJhbnNmb3JtRXhwcmVzc2lvbnMoTGlzdDxFeHByZXNzaW9uPiBub2RlcywgVHJlZU5vZGUgcGFyZW50KSB7CiAgICBjb25zdGFudEV2YWx1YXRvci53aXRoTmV3RW52aXJvbm1lbnQoKCkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgbm9kZXNbaV0gPSBldmFsdWF0ZUFuZFRyYW5zZm9ybVdpdGhDb250ZXh0KHBhcmVudCwgbm9kZXNbaV0pCiAgICAgICAgICAuLnBhcmVudCA9IHBhcmVudDsKICAgICAgfQogICAgfSk7CiAgfQoKICAvLyBIYW5kbGUgZGVmaW5pdGlvbiBvZiBjb25zdGFudHM6CgogIHZpc2l0RnVuY3Rpb25Ob2RlKEZ1bmN0aW9uTm9kZSBub2RlKSB7CiAgICBmaW5hbCBwb3NpdGlvbmFsUGFyYW1ldGVyQ291bnQgPSBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9zaXRpb25hbFBhcmFtZXRlckNvdW50OyArK2kpIHsKICAgICAgZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnNbaV07CiAgICAgIHRyYW5zZm9ybUFubm90YXRpb25zKHZhcmlhYmxlLmFubm90YXRpb25zLCB2YXJpYWJsZSk7CiAgICAgIGlmICh2YXJpYWJsZS5pbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgICAgdmFyaWFibGUuaW5pdGlhbGl6ZXIgPQogICAgICAgICAgICBldmFsdWF0ZUFuZFRyYW5zZm9ybVdpdGhDb250ZXh0KHZhcmlhYmxlLCB2YXJpYWJsZS5pbml0aWFsaXplcikKICAgICAgICAgICAgICAuLnBhcmVudCA9IHZhcmlhYmxlOwogICAgICB9CiAgICB9CiAgICBmb3IgKGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgaW4gbm9kZS5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgdHJhbnNmb3JtQW5ub3RhdGlvbnModmFyaWFibGUuYW5ub3RhdGlvbnMsIHZhcmlhYmxlKTsKICAgICAgaWYgKHZhcmlhYmxlLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgICB2YXJpYWJsZS5pbml0aWFsaXplciA9CiAgICAgICAgICAgIGV2YWx1YXRlQW5kVHJhbnNmb3JtV2l0aENvbnRleHQodmFyaWFibGUsIHZhcmlhYmxlLmluaXRpYWxpemVyKQogICAgICAgICAgICAgIC4ucGFyZW50ID0gdmFyaWFibGU7CiAgICAgIH0KICAgIH0KICAgIGlmIChub2RlLmJvZHkgIT0gbnVsbCkgewogICAgICBub2RlLmJvZHkgPSBub2RlLmJvZHkuYWNjZXB0KHRoaXMpLi5wYXJlbnQgPSBub2RlOwogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICB0cmFuc2Zvcm1Bbm5vdGF0aW9ucyhub2RlLmFubm90YXRpb25zLCBub2RlKTsKCiAgICBpZiAobm9kZS5pbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgICBmaW5hbCBDb25zdGFudCBjb25zdGFudCA9IGV2YWx1YXRlV2l0aENvbnRleHQobm9kZSwgbm9kZS5pbml0aWFsaXplcik7CiAgICAgICAgY29uc3RhbnRFdmFsdWF0b3IuZW52LmFkZFZhcmlhYmxlVmFsdWUobm9kZSwgY29uc3RhbnQpOwoKICAgICAgICBpZiAoa2VlcFZhcmlhYmxlcykgewogICAgICAgICAgLy8gU28gdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBpcyBzdGlsbCBhdmFpbGFibGUgZm9yIGRlYnVnZ2luZwogICAgICAgICAgLy8gcHVycG9zZXMgd2UgY29udmVydCB0aGUgY29uc3RhbnQgdmFyaWFibGUgdG8gYmUgYSBmaW5hbCB2YXJpYWJsZQogICAgICAgICAgLy8gaW5pdGlhbGl6ZWQgdG8gdGhlIGV2YWx1YXRlZCBjb25zdGFudCBleHByZXNzaW9uLgogICAgICAgICAgbm9kZS5pbml0aWFsaXplciA9IG1ha2VDb25zdGFudEV4cHJlc3Npb24oY29uc3RhbnQsIG5vZGUuaW5pdGlhbGl6ZXIpCiAgICAgICAgICAgIC4ucGFyZW50ID0gbm9kZTsKICAgICAgICAgIG5vZGUuaXNGaW5hbCA9IHRydWU7CiAgICAgICAgICBub2RlLmlzQ29uc3QgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gU2luY2Ugd2UgY29udmVydCBhbGwgdXNlLXNpdGVzIG9mIGNvbnN0YW50cywgdGhlIGNvbnN0YW50CiAgICAgICAgICAvLyBbVmFyaWFibGVEZWNsYXJhdGlvbl0gaXMgdW51c2VkIGFuZCB3ZSdsbCB0aGVyZWZvcmUgcmVtb3ZlIGl0LgogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIG5vZGUuaW5pdGlhbGl6ZXIgPSBub2RlLmluaXRpYWxpemVyLmFjY2VwdCh0aGlzKS4ucGFyZW50ID0gbm9kZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICB2aXNpdEZpZWxkKEZpZWxkIG5vZGUpIHsKICAgIHJldHVybiBjb25zdGFudEV2YWx1YXRvci53aXRoTmV3RW52aXJvbm1lbnQoKCkgewogICAgICBpZiAobm9kZS5pc0NvbnN0KSB7CiAgICAgICAgLy8gU2luY2Ugd2UgY29udmVydCBhbGwgdXNlLXNpdGVzIG9mIGNvbnN0YW50cywgdGhlIGNvbnN0YW50IFtGaWVsZF0KICAgICAgICAvLyBjYW5ub3QgYmUgcmVmZXJlbmNlZCBhbnltb3JlLiAgV2UgdGhlcmVmb3JlIGdldCByaWQgb2YgaXQgaWYKICAgICAgICAvLyBba2VlcEZpZWxkc10gd2FzIG5vdCBzcGVjaWZpZWQuCiAgICAgICAgaWYgKCFrZWVwRmllbGRzKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vIE90aGVyd2lzZSB3ZSBrZWVwIHRoZSBjb25zdGFudCBbRmllbGRdIGFuZCBjb252ZXJ0IGl0J3MgaW5pdGlhbGl6ZXIuCiAgICAgICAgdHJhbnNmb3JtQW5ub3RhdGlvbnMobm9kZS5hbm5vdGF0aW9ucywgbm9kZSk7CiAgICAgICAgaWYgKG5vZGUuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgbm9kZS5pbml0aWFsaXplciA9CiAgICAgICAgICAgICAgZXZhbHVhdGVBbmRUcmFuc2Zvcm1XaXRoQ29udGV4dChub2RlLCBub2RlLmluaXRpYWxpemVyKQogICAgICAgICAgICAgICAgLi5wYXJlbnQgPSBub2RlOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0cmFuc2Zvcm1Bbm5vdGF0aW9ucyhub2RlLmFubm90YXRpb25zLCBub2RlKTsKICAgICAgICBpZiAobm9kZS5pbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgICAgICBub2RlLmluaXRpYWxpemVyID0gbm9kZS5pbml0aWFsaXplci5hY2NlcHQodGhpcykuLnBhcmVudCA9IG5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBub2RlOwogICAgfSk7CiAgfQoKICAvLyBIYW5kbGUgdXNlLXNpdGVzIG9mIGNvbnN0YW50cyAoYW5kICJpbmxpbmUiIGNvbnN0YW50IGV4cHJlc3Npb25zKToKCiAgdmlzaXRTeW1ib2xMaXRlcmFsKFN5bWJvbExpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIG1ha2VDb25zdGFudEV4cHJlc3Npb24oY29uc3RhbnRFdmFsdWF0b3IuZXZhbHVhdGUobm9kZSksIG5vZGUpOwogIH0KCiAgdmlzaXRTdGF0aWNHZXQoU3RhdGljR2V0IG5vZGUpIHsKICAgIGZpbmFsIE1lbWJlciB0YXJnZXQgPSBub2RlLnRhcmdldDsKICAgIGlmICh0YXJnZXQgaXMgRmllbGQgJiYgdGFyZ2V0LmlzQ29uc3QpIHsKICAgICAgcmV0dXJuIGV2YWx1YXRlQW5kVHJhbnNmb3JtV2l0aENvbnRleHQobm9kZSwgbm9kZSk7CiAgICB9IGVsc2UgaWYgKHRhcmdldCBpcyBQcm9jZWR1cmUgJiYgdGFyZ2V0LmtpbmQgPT0gUHJvY2VkdXJlS2luZC5NZXRob2QpIHsKICAgICAgcmV0dXJuIGV2YWx1YXRlQW5kVHJhbnNmb3JtV2l0aENvbnRleHQobm9kZSwgbm9kZSk7CiAgICB9CiAgICByZXR1cm4gc3VwZXIudmlzaXRTdGF0aWNHZXQobm9kZSk7CiAgfQoKICB2aXNpdFN3aXRjaENhc2UoU3dpdGNoQ2FzZSBub2RlKSB7CiAgICB0cmFuc2Zvcm1FeHByZXNzaW9ucyhub2RlLmV4cHJlc3Npb25zLCBub2RlKTsKICAgIHJldHVybiBzdXBlci52aXNpdFN3aXRjaENhc2Uobm9kZSk7CiAgfQoKICB2aXNpdFZhcmlhYmxlR2V0KFZhcmlhYmxlR2V0IG5vZGUpIHsKICAgIGlmIChub2RlLnZhcmlhYmxlLmlzQ29uc3QpIHsKICAgICAgcmV0dXJuIGV2YWx1YXRlQW5kVHJhbnNmb3JtV2l0aENvbnRleHQobm9kZSwgbm9kZSk7CiAgICB9CiAgICByZXR1cm4gc3VwZXIudmlzaXRWYXJpYWJsZUdldChub2RlKTsKICB9CgogIHZpc2l0TGlzdExpdGVyYWwoTGlzdExpdGVyYWwgbm9kZSkgewogICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICByZXR1cm4gZXZhbHVhdGVBbmRUcmFuc2Zvcm1XaXRoQ29udGV4dChub2RlLCBub2RlKTsKICAgIH0KICAgIHJldHVybiBzdXBlci52aXNpdExpc3RMaXRlcmFsKG5vZGUpOwogIH0KCiAgdmlzaXRTZXRMaXRlcmFsKFNldExpdGVyYWwgbm9kZSkgewogICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICByZXR1cm4gZXZhbHVhdGVBbmRUcmFuc2Zvcm1XaXRoQ29udGV4dChub2RlLCBub2RlKTsKICAgIH0KICAgIHJldHVybiBzdXBlci52aXNpdFNldExpdGVyYWwobm9kZSk7CiAgfQoKICB2aXNpdE1hcExpdGVyYWwoTWFwTGl0ZXJhbCBub2RlKSB7CiAgICBpZiAobm9kZS5pc0NvbnN0KSB7CiAgICAgIHJldHVybiBldmFsdWF0ZUFuZFRyYW5zZm9ybVdpdGhDb250ZXh0KG5vZGUsIG5vZGUpOwogICAgfQogICAgcmV0dXJuIHN1cGVyLnZpc2l0TWFwTGl0ZXJhbChub2RlKTsKICB9CgogIHZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7CiAgICBpZiAobm9kZS5pc0NvbnN0KSB7CiAgICAgIHJldHVybiBldmFsdWF0ZUFuZFRyYW5zZm9ybVdpdGhDb250ZXh0KG5vZGUsIG5vZGUpOwogICAgfQogICAgcmV0dXJuIHN1cGVyLnZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKG5vZGUpOwogIH0KCiAgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKFN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICByZXR1cm4gZXZhbHVhdGVBbmRUcmFuc2Zvcm1XaXRoQ29udGV4dChub2RlLCBub2RlKTsKICAgIH0KICAgIHJldHVybiBzdXBlci52aXNpdFN0YXRpY0ludm9jYXRpb24obm9kZSk7CiAgfQoKICB2aXNpdENvbnN0YW50RXhwcmVzc2lvbihDb25zdGFudEV4cHJlc3Npb24gbm9kZSkgewogICAgQ29uc3RhbnQgY29uc3RhbnQgPSBub2RlLmNvbnN0YW50OwogICAgaWYgKGNvbnN0YW50IGlzIFVuZXZhbHVhdGVkQ29uc3RhbnQpIHsKICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gY29uc3RhbnQuZXhwcmVzc2lvbjsKICAgICAgcmV0dXJuIGV2YWx1YXRlQW5kVHJhbnNmb3JtV2l0aENvbnRleHQoZXhwcmVzc2lvbiwgZXhwcmVzc2lvbik7CiAgICB9IGVsc2UgewogICAgICBub2RlLmNvbnN0YW50ID0gY29uc3RhbnRFdmFsdWF0b3IuY2Fub25pY2FsaXplKGNvbnN0YW50KTsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CiAgfQoKICBldmFsdWF0ZUFuZFRyYW5zZm9ybVdpdGhDb250ZXh0KFRyZWVOb2RlIHRyZWVDb250ZXh0LCBFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBtYWtlQ29uc3RhbnRFeHByZXNzaW9uKGV2YWx1YXRlV2l0aENvbnRleHQodHJlZUNvbnRleHQsIG5vZGUpLCBub2RlKTsKICB9CgogIGV2YWx1YXRlV2l0aENvbnRleHQoVHJlZU5vZGUgdHJlZUNvbnRleHQsIEV4cHJlc3Npb24gbm9kZSkgewogICAgaWYgKHRyZWVDb250ZXh0ID09IG5vZGUpIHsKICAgICAgcmV0dXJuIGNvbnN0YW50RXZhbHVhdG9yLmV2YWx1YXRlKG5vZGUpOwogICAgfQoKICAgIHJldHVybiBjb25zdGFudEV2YWx1YXRvci5ydW5JbnNpZGVDb250ZXh0KHRyZWVDb250ZXh0LCAoKSB7CiAgICAgIHJldHVybiBjb25zdGFudEV2YWx1YXRvci5ldmFsdWF0ZShub2RlKTsKICAgIH0pOwogIH0KCiAgRXhwcmVzc2lvbiBtYWtlQ29uc3RhbnRFeHByZXNzaW9uKENvbnN0YW50IGNvbnN0YW50LCBFeHByZXNzaW9uIG5vZGUpIHsKICAgIGlmIChjb25zdGFudCBpcyBVbmV2YWx1YXRlZENvbnN0YW50ICYmCiAgICAgICAgY29uc3RhbnQuZXhwcmVzc2lvbiBpcyBJbnZhbGlkRXhwcmVzc2lvbikgewogICAgICByZXR1cm4gY29uc3RhbnQuZXhwcmVzc2lvbjsKICAgIH0KICAgIHJldHVybiBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKGNvbnN0YW50LCBub2RlLmdldFN0YXRpY1R5cGUodHlwZUVudmlyb25tZW50KSkKICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OwogIH0KfQoKY2xhc3MgQ29uc3RhbnRFdmFsdWF0b3IgZXh0ZW5kcyBSZWN1cnNpdmVWaXNpdG9yPENvbnN0YW50PiB7CiAgZmluYWwgQ29uc3RhbnRzQmFja2VuZCBiYWNrZW5kOwogIGZpbmFsIE51bWJlclNlbWFudGljcyBudW1iZXJTZW1hbnRpY3M7CiAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudERlZmluZXM7CiAgZmluYWwgQ29yZVR5cGVzIGNvcmVUeXBlczsKICBmaW5hbCBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50OwogIGZpbmFsIGJvb2wgZW5hYmxlQXNzZXJ0czsKICBmaW5hbCBFcnJvclJlcG9ydGVyIGVycm9yUmVwb3J0ZXI7CgogIGZpbmFsIGJvb2wgZGVzdWdhclNldHM7CiAgZmluYWwgRmllbGQgdW5tb2RpZmlhYmxlU2V0TWFwOwoKICBmaW5hbCBpc0luc3RhbnRpYXRlZCA9IG5ldyBJc0luc3RhbnRpYXRlZFZpc2l0b3IoKS5pc0luc3RhbnRpYXRlZDsKCiAgZmluYWwgTWFwPENvbnN0YW50LCBDb25zdGFudD4gY2Fub25pY2FsaXphdGlvbkNhY2hlOwogIGZpbmFsIE1hcDxOb2RlLCBPYmplY3Q+IG5vZGVDYWNoZTsKICBmaW5hbCBDbG9uZVZpc2l0b3IgY2xvbmVyID0gbmV3IENsb25lVmlzaXRvcigpOwoKICBNYXA8Q2xhc3MsIGJvb2w+IHByaW1pdGl2ZUVxdWFsQ2FjaGU7CgogIGZpbmFsIE51bGxDb25zdGFudCBudWxsQ29uc3RhbnQgPSBuZXcgTnVsbENvbnN0YW50KCk7CiAgZmluYWwgQm9vbENvbnN0YW50IHRydWVDb25zdGFudCA9IG5ldyBCb29sQ29uc3RhbnQodHJ1ZSk7CiAgZmluYWwgQm9vbENvbnN0YW50IGZhbHNlQ29uc3RhbnQgPSBuZXcgQm9vbENvbnN0YW50KGZhbHNlKTsKCiAgZmluYWwgTGlzdDxUcmVlTm9kZT4gY29udGV4dENoYWluID0gW107CgogIEluc3RhbmNlQnVpbGRlciBpbnN0YW5jZUJ1aWxkZXI7CiAgRXZhbHVhdGlvbkVudmlyb25tZW50IGVudjsKICBTZXQ8RXhwcmVzc2lvbj4gcmVwbGFjZW1lbnROb2RlcyA9IG5ldyBTZXQ8RXhwcmVzc2lvbj4uaWRlbnRpdHkoKTsKICBNYXA8Q29uc3RhbnQsIENvbnN0YW50PiBsb3dlcmVkID0gbmV3IE1hcDxDb25zdGFudCwgQ29uc3RhbnQ+LmlkZW50aXR5KCk7CgogIGJvb2wgc2VlblVuZXZhbHVhdGVkQ2hpbGQ7IC8vIEFueSBjaGlsZHJlbiB0aGF0IHdlcmUgbGVmdCB1bmV2YWx1YXRlZD8KICBpbnQgbGF6eURlcHRoOyAvLyBDdXJyZW50IG5lc3RpbmcgZGVwdGggb2YgbGF6eSByZWdpb25zLgoKICBib29sIGdldCBzaG91bGRCZVVuZXZhbHVhdGVkID0+IHNlZW5VbmV2YWx1YXRlZENoaWxkIHx8IGxhenlEZXB0aCAhPSAwOwoKICBib29sIGdldCB0YXJnZXRpbmdKYXZhU2NyaXB0ID0+IG51bWJlclNlbWFudGljcyA9PSBOdW1iZXJTZW1hbnRpY3MuanM7CgogIENvbnN0YW50RXZhbHVhdG9yKHRoaXMuYmFja2VuZCwgdGhpcy5lbnZpcm9ubWVudERlZmluZXMsIHRoaXMudHlwZUVudmlyb25tZW50LAogICAgICB0aGlzLmVuYWJsZUFzc2VydHMsIHRoaXMuZXJyb3JSZXBvcnRlciwKICAgICAge3RoaXMuZGVzdWdhclNldHMgPSBmYWxzZX0pCiAgICAgIDogbnVtYmVyU2VtYW50aWNzID0gYmFja2VuZC5udW1iZXJTZW1hbnRpY3MsCiAgICAgICAgY29yZVR5cGVzID0gdHlwZUVudmlyb25tZW50LmNvcmVUeXBlcywKICAgICAgICBjYW5vbmljYWxpemF0aW9uQ2FjaGUgPSA8Q29uc3RhbnQsIENvbnN0YW50Pnt9LAogICAgICAgIG5vZGVDYWNoZSA9IDxOb2RlLCBDb25zdGFudD57fSwKICAgICAgICBlbnYgPSBuZXcgRXZhbHVhdGlvbkVudmlyb25tZW50KCksCiAgICAgICAgdW5tb2RpZmlhYmxlU2V0TWFwID0gZGVzdWdhclNldHMKICAgICAgICAgICAgPyB0eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzLmluZGV4CiAgICAgICAgICAgICAgICAuZ2V0TWVtYmVyKCdkYXJ0OmNvbGxlY3Rpb24nLCAnX1VubW9kaWZpYWJsZVNldCcsICdfbWFwJykKICAgICAgICAgICAgOiBudWxsIHsKICAgIHByaW1pdGl2ZUVxdWFsQ2FjaGUgPSA8Q2xhc3MsIGJvb2w+ewogICAgICBjb3JlVHlwZXMuYm9vbENsYXNzOiB0cnVlLAogICAgICBjb3JlVHlwZXMuZG91YmxlQ2xhc3M6IGZhbHNlLAogICAgICBjb3JlVHlwZXMuaW50Q2xhc3M6IHRydWUsCiAgICAgIGNvcmVUeXBlcy5pbnRlcm5hbFN5bWJvbENsYXNzOiB0cnVlLAogICAgICBjb3JlVHlwZXMubGlzdENsYXNzOiB0cnVlLAogICAgICBjb3JlVHlwZXMubWFwQ2xhc3M6IHRydWUsCiAgICAgIGNvcmVUeXBlcy5udWxsQ2xhc3M6IHRydWUsCiAgICAgIGNvcmVUeXBlcy5vYmplY3RDbGFzczogdHJ1ZSwKICAgICAgY29yZVR5cGVzLnNldENsYXNzOiB0cnVlLAogICAgICBjb3JlVHlwZXMuc3RyaW5nQ2xhc3M6IHRydWUsCiAgICAgIGNvcmVUeXBlcy5zeW1ib2xDbGFzczogdHJ1ZSwKICAgICAgY29yZVR5cGVzLnR5cGVDbGFzczogdHJ1ZSwKICAgIH07CiAgfQoKICBVcmkgZ2V0RmlsZVVyaShUcmVlTm9kZSBub2RlKSB7CiAgICB3aGlsZSAobm9kZSAhPSBudWxsICYmIG5vZGUgaXMhIEZpbGVVcmlOb2RlKSB7CiAgICAgIG5vZGUgPSBub2RlLnBhcmVudDsKICAgIH0KICAgIHJldHVybiAobm9kZSBhcyBGaWxlVXJpTm9kZSk/LmZpbGVVcmk7CiAgfQoKICBpbnQgZ2V0RmlsZU9mZnNldChVcmkgdXJpLCBUcmVlTm9kZSBub2RlKSB7CiAgICBpZiAodXJpID09IG51bGwpIHJldHVybiBUcmVlTm9kZS5ub09mZnNldDsKICAgIHdoaWxlIChub2RlICE9IG51bGwgJiYgbm9kZS5maWxlT2Zmc2V0ID09IFRyZWVOb2RlLm5vT2Zmc2V0KSB7CiAgICAgIG5vZGUgPSBub2RlLnBhcmVudDsKICAgIH0KICAgIHJldHVybiBub2RlID09IG51bGwgPyBUcmVlTm9kZS5ub09mZnNldCA6IG5vZGUuZmlsZU9mZnNldDsKICB9CgogIC8vLyBFdmFsdWF0ZSBbbm9kZV0gYW5kIHBvc3NpYmx5IGNhY2hlIHRoZSBldmFsdWF0aW9uIHJlc3VsdC4KICAvLy8gUmV0dXJucyBVbmV2YWx1YXRlZENvbnN0YW50IGlmIHRoZSBjb25zdGFudCBjb3VsZCBub3QgYmUgZXZhbHVhdGVkLgogIC8vLyBJZiB0aGUgZXhwcmVzc2lvbiBpbiB0aGUgVW5ldmFsdWF0ZWRDb25zdGFudCBpcyBhbiBJbnZhbGlkRXhwcmVzc2lvbiwKICAvLy8gYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGNvbnN0YW50IGV2YWx1YXRpb24uCiAgQ29uc3RhbnQgZXZhbHVhdGUoRXhwcmVzc2lvbiBub2RlKSB7CiAgICBzZWVuVW5ldmFsdWF0ZWRDaGlsZCA9IGZhbHNlOwogICAgbGF6eURlcHRoID0gMDsKICAgIHRyeSB7CiAgICAgIHJldHVybiBfZXZhbHVhdGVTdWJleHByZXNzaW9uKG5vZGUpOwogICAgfSBvbiBfQWJvcnREdWVUb0Vycm9yIGNhdGNoIChlKSB7CiAgICAgIGZpbmFsIFVyaSB1cmkgPSBnZXRGaWxlVXJpKGUubm9kZSk7CiAgICAgIGZpbmFsIGludCBmaWxlT2Zmc2V0ID0gZ2V0RmlsZU9mZnNldCh1cmksIGUubm9kZSk7CiAgICAgIGZpbmFsIGxvY2F0ZWRNZXNzYWdlID0gZS5tZXNzYWdlLndpdGhMb2NhdGlvbih1cmksIGZpbGVPZmZzZXQsIG5vTGVuZ3RoKTsKCiAgICAgIGZpbmFsIGNvbnRleHRNZXNzYWdlcyA9IDxMb2NhdGVkTWVzc2FnZT5bXTsKICAgICAgaWYgKGUuY29udGV4dCAhPSBudWxsKSBjb250ZXh0TWVzc2FnZXMuYWRkQWxsKGUuY29udGV4dCk7CiAgICAgIGZvciAoZmluYWwgVHJlZU5vZGUgbm9kZSBpbiBjb250ZXh0Q2hhaW4pIHsKICAgICAgICBmaW5hbCBVcmkgdXJpID0gZ2V0RmlsZVVyaShub2RlKTsKICAgICAgICBmaW5hbCBpbnQgZmlsZU9mZnNldCA9IGdldEZpbGVPZmZzZXQodXJpLCBub2RlKTsKICAgICAgICBjb250ZXh0TWVzc2FnZXMuYWRkKAogICAgICAgICAgICBtZXNzYWdlQ29uc3RFdmFsQ29udGV4dC53aXRoTG9jYXRpb24odXJpLCBmaWxlT2Zmc2V0LCBub0xlbmd0aCkpOwogICAgICB9CiAgICAgIGVycm9yUmVwb3J0ZXIucmVwb3J0KGxvY2F0ZWRNZXNzYWdlLCBjb250ZXh0TWVzc2FnZXMpOwogICAgICByZXR1cm4gbmV3IFVuZXZhbHVhdGVkQ29uc3RhbnQobmV3IEludmFsaWRFeHByZXNzaW9uKGUubWVzc2FnZS5tZXNzYWdlKSk7CiAgICB9IG9uIF9BYm9ydER1ZVRvSW52YWxpZEV4cHJlc3Npb24gY2F0Y2ggKGUpIHsKICAgICAgLy8gVE9ETyhhc2tlc2MpOiBDb3B5IHBvc2l0aW9uIGZyb20gZXJyb25lb3VzIG5vZGUuCiAgICAgIC8vIEN1cnJlbnRseSBub3QgcG9zc2libGUsIGFzIGl0IG1pZ2h0IGJlIGluIGEgZGlmZmVyZW50IGZpbGUuCiAgICAgIC8vIENhbiBiZSBkb25lIGlmIHdlIGFkZCBhbiBleHBsaWNpdCBVUkkgdG8gSW52YWxpZEV4cHJlc3Npb24uCiAgICAgIEludmFsaWRFeHByZXNzaW9uIGludmFsaWQgPSBuZXcgSW52YWxpZEV4cHJlc3Npb24oZS5tZXNzYWdlKTsKICAgICAgaWYgKGludmFsaWQuZmlsZU9mZnNldCA9PSBUcmVlTm9kZS5ub09mZnNldCkgewogICAgICAgIGludmFsaWQuZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKICAgICAgfQogICAgICBlcnJvclJlcG9ydGVyLnJlcG9ydEludmFsaWRFeHByZXNzaW9uKGludmFsaWQpOwogICAgICByZXR1cm4gbmV3IFVuZXZhbHVhdGVkQ29uc3RhbnQoaW52YWxpZCk7CiAgICB9CiAgfQoKICAvLy8gUmVwb3J0IGFuIGVycm9yIHRoYXQgaGFzIGJlZW4gZGV0ZWN0ZWQgZHVyaW5nIGNvbnN0YW50IGV2YWx1YXRpb24uCiAgTnVsbCByZXBvcnQoVHJlZU5vZGUgbm9kZSwgTWVzc2FnZSBtZXNzYWdlLCB7TGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dH0pIHsKICAgIHRocm93IG5ldyBfQWJvcnREdWVUb0Vycm9yKG5vZGUsIG1lc3NhZ2UsIGNvbnRleHQ6IGNvbnRleHQpOwogIH0KCiAgLy8vIFJlcG9ydCBhIGNvbnN0cnVjdCB0aGF0IHNob3VsZCBub3Qgb2NjdXIgaW5zaWRlIGEgcG90ZW50aWFsbHkgY29uc3RhbnQKICAvLy8gZXhwcmVzc2lvbi4gSXQgaXMgYXNzdW1lZCB0aGF0IGFuIGVycm9yIGhhcyBhbHJlYWR5IGJlZW4gcmVwb3J0ZWQuCiAgTnVsbCByZXBvcnRJbnZhbGlkKFRyZWVOb2RlIG5vZGUsIFN0cmluZyBtZXNzYWdlKSB7CiAgICB0aHJvdyBuZXcgX0Fib3J0RHVlVG9JbnZhbGlkRXhwcmVzc2lvbihub2RlLCBtZXNzYWdlKTsKICB9CgogIC8vLyBQcm9kdWNlIGFuIHVuZXZhbHVhdGVkIGNvbnN0YW50IG5vZGUgZm9yIGFuIGV4cHJlc3Npb24uCiAgQ29uc3RhbnQgdW5ldmFsdWF0ZWQoRXhwcmVzc2lvbiBvcmlnaW5hbCwgRXhwcmVzc2lvbiByZXBsYWNlbWVudCkgewogICAgcmVwbGFjZW1lbnQuZmlsZU9mZnNldCA9IG9yaWdpbmFsLmZpbGVPZmZzZXQ7CiAgICAvLyBUT0RPKGFza2VzYyxqb2hubml3aW50aGVyKTogUHJlc2VydmUgZmlsZVVyaSBvbiBbcmVwbGFjZW1lbnRdLgogICAgcmV0dXJuIG5ldyBVbmV2YWx1YXRlZENvbnN0YW50KHJlcGxhY2VtZW50KTsKICB9CgogIC8vLyBFeHRyYWN0IGFuIGV4cHJlc3Npb24gZnJvbSBhIChwb3NzaWJseSB1bmV2YWx1YXRlZCkgY29uc3RhbnQgdG8gYmVjb21lCiAgLy8vIHBhcnQgb2YgdGhlIGV4cHJlc3Npb24gdHJlZSBvZiBhbm90aGVyIHVuZXZhbHVhdGVkIGNvbnN0YW50LgogIC8vLyBNYWtlcyBzdXJlIGEgcGFydGljdWxhciBleHByZXNzaW9uIG9jY3VycyBvbmx5IG9uY2UgaW4gdGhlIHRyZWUgYnkKICAvLy8gY2xvbmluZyBmdXJ0aGVyIGluc3RhbmNlcy4KICBFeHByZXNzaW9uIGV4dHJhY3QoQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGNvbnN0YW50LmFzRXhwcmVzc2lvbigpOwogICAgaWYgKCFyZXBsYWNlbWVudE5vZGVzLmFkZChleHByZXNzaW9uKSkgewogICAgICBleHByZXNzaW9uID0gY2xvbmVyLmNsb25lKGV4cHJlc3Npb24pOwogICAgICByZXBsYWNlbWVudE5vZGVzLmFkZChleHByZXNzaW9uKTsKICAgIH0KICAgIHJldHVybiBleHByZXNzaW9uOwogIH0KCiAgLy8vIEVudGVyIGEgcmVnaW9uIG9mIGxhenkgZXZhbHVhdGlvbi4gQWxsIGxlYWYgbm9kZXMgYXJlIGV2YWx1YXRlZCBub3JtYWxseQogIC8vLyAodG8gZW5zdXJlIGlubGluaW5nIG9mIHJlZmVyZW5jZWQgbG9jYWwgdmFyaWFibGVzKSwgYnV0IGNvbXBvc2l0ZSBub2RlcwogIC8vLyBhbHdheXMgdHJlYXQgdGhlaXIgY2hpbGRyZW4gYXMgdW5ldmFsdWF0ZWQsIHJlc3VsdGluZyBpbiBhIHBhcnRpYWxseQogIC8vLyBldmFsdWF0ZWQgY2xvbmUgb2YgdGhlIG9yaWdpbmFsIGV4cHJlc3Npb24gdHJlZS4KICAvLy8gTGF6eSBldmFsdWF0aW9uIGlzIHVzZWQgZm9yIHRoZSBzdWJ0cmVlcyBvZiBsYXp5IG9wZXJhdGlvbnMgd2l0aAogIC8vLyB1bmV2YWx1YXRlZCBjb25kaXRpb25zIHRvIGVuc3VyZSBubyBlcnJvcnMgYXJlIHJlcG9ydGVkIGZvciBwcm9ibGVtcwogIC8vLyBpbiB0aGUgc3VidHJlZSBhcyBsb25nIGFzIHRoZSBzdWJ0cmVlIGlzIHBvdGVudGlhbGx5IGNvbnN0YW50LgogIHZvaWQgZW50ZXJMYXp5KCkgPT4gbGF6eURlcHRoKys7CgogIC8vLyBMZWF2ZSBhIChwb3NzaWJseSBuZXN0ZWQpIHJlZ2lvbiBvZiBsYXp5IGV2YWx1YXRpb24uCiAgdm9pZCBsZWF2ZUxhenkoKSA9PiBsYXp5RGVwdGgtLTsKCiAgQ29uc3RhbnQgbG93ZXIoQ29uc3RhbnQgb3JpZ2luYWwsIENvbnN0YW50IHJlcGxhY2VtZW50KSB7CiAgICBpZiAoIWlkZW50aWNhbChvcmlnaW5hbCwgcmVwbGFjZW1lbnQpKSB7CiAgICAgIG9yaWdpbmFsID0gY2Fub25pY2FsaXplKG9yaWdpbmFsKTsKICAgICAgcmVwbGFjZW1lbnQgPSBjYW5vbmljYWxpemUocmVwbGFjZW1lbnQpOwogICAgICBsb3dlcmVkW3JlcGxhY2VtZW50XSA9IG9yaWdpbmFsOwogICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7CiAgICB9CiAgICByZXR1cm4gY2Fub25pY2FsaXplKHJlcGxhY2VtZW50KTsKICB9CgogIENvbnN0YW50IHVubG93ZXIoQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIHJldHVybiBsb3dlcmVkW2NvbnN0YW50XSA/PyBjb25zdGFudDsKICB9CgogIENvbnN0YW50IGxvd2VyTGlzdENvbnN0YW50KExpc3RDb25zdGFudCBjb25zdGFudCkgewogICAgaWYgKHNob3VsZEJlVW5ldmFsdWF0ZWQpIHJldHVybiBjb25zdGFudDsKICAgIHJldHVybiBsb3dlcihjb25zdGFudCwgYmFja2VuZC5sb3dlckxpc3RDb25zdGFudChjb25zdGFudCkpOwogIH0KCiAgQ29uc3RhbnQgbG93ZXJTZXRDb25zdGFudChTZXRDb25zdGFudCBjb25zdGFudCkgewogICAgaWYgKHNob3VsZEJlVW5ldmFsdWF0ZWQpIHJldHVybiBjb25zdGFudDsKICAgIHJldHVybiBsb3dlcihjb25zdGFudCwgYmFja2VuZC5sb3dlclNldENvbnN0YW50KGNvbnN0YW50KSk7CiAgfQoKICBDb25zdGFudCBsb3dlck1hcENvbnN0YW50KE1hcENvbnN0YW50IGNvbnN0YW50KSB7CiAgICBpZiAoc2hvdWxkQmVVbmV2YWx1YXRlZCkgcmV0dXJuIGNvbnN0YW50OwogICAgcmV0dXJuIGxvd2VyKGNvbnN0YW50LCBiYWNrZW5kLmxvd2VyTWFwQ29uc3RhbnQoY29uc3RhbnQpKTsKICB9CgogIC8vLyBFdmFsdWF0ZSBbbm9kZV0gYW5kIHBvc3NpYmx5IGNhY2hlIHRoZSBldmFsdWF0aW9uIHJlc3VsdC4KICAvLy8gQHRocm93cyBfQWJvcnREdWVUb0Vycm9yIG9yIF9BYm9ydER1ZVRvSW52YWxpZEV4cHJlc3Npb24gaWYgZXhwcmVzc2lvbgogIC8vLyBjYW4ndCBiZSBldmFsdWF0ZWQuCiAgQ29uc3RhbnQgX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihFeHByZXNzaW9uIG5vZGUpIHsKICAgIGlmIChub2RlID09IG51bGwpIHJldHVybiBudWxsQ29uc3RhbnQ7CiAgICBib29sIHdhc1VuZXZhbHVhdGVkID0gc2VlblVuZXZhbHVhdGVkQ2hpbGQ7CiAgICBzZWVuVW5ldmFsdWF0ZWRDaGlsZCA9IGZhbHNlOwogICAgQ29uc3RhbnQgcmVzdWx0OwogICAgaWYgKGVudi5pc0VtcHR5KSB7CiAgICAgIC8vIFdlIG9ubHkgdHJ5IHRvIGV2YWx1YXRlIHRoZSBzYW1lIFtub2RlXSAqb25jZSogd2l0aGluIGFuIGVtcHR5CiAgICAgIC8vIGVudmlyb25tZW50LgogICAgICBpZiAobm9kZUNhY2hlLmNvbnRhaW5zS2V5KG5vZGUpKSB7CiAgICAgICAgcmVzdWx0ID0gbm9kZUNhY2hlW25vZGVdID8/IHJlcG9ydChub2RlLCBtZXNzYWdlQ29uc3RFdmFsQ2lyY3VsYXJpdHkpOwogICAgICB9IGVsc2UgewogICAgICAgIG5vZGVDYWNoZVtub2RlXSA9IG51bGw7CiAgICAgICAgcmVzdWx0ID0gbm9kZUNhY2hlW25vZGVdID0gbm9kZS5hY2NlcHQodGhpcyk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IG5vZGUuYWNjZXB0KHRoaXMpOwogICAgfQogICAgc2VlblVuZXZhbHVhdGVkQ2hpbGQgPSB3YXNVbmV2YWx1YXRlZCB8fCByZXN1bHQgaXMgVW5ldmFsdWF0ZWRDb25zdGFudDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBDb25zdGFudCBydW5JbnNpZGVDb250ZXh0KFRyZWVOb2RlIG5vZGUsIENvbnN0YW50IGZ1bigpKSB7CiAgICB0cnkgewogICAgICBwdXNoQ29udGV4dChub2RlKTsKICAgICAgcmV0dXJuIGZ1bigpOwogICAgfSBmaW5hbGx5IHsKICAgICAgcG9wQ29udGV4dChub2RlKTsKICAgIH0KICB9CgogIENvbnN0YW50IHJ1bkluc2lkZUNvbnRleHRJZk5vQ29udGV4dChUcmVlTm9kZSBub2RlLCBDb25zdGFudCBmdW4oKSkgewogICAgaWYgKGNvbnRleHRDaGFpbi5pc0VtcHR5KSB7CiAgICAgIHJldHVybiBydW5JbnNpZGVDb250ZXh0KG5vZGUsIGZ1bik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZnVuKCk7CiAgICB9CiAgfQoKICBwdXNoQ29udGV4dChUcmVlTm9kZSBjb250ZXh0Tm9kZSkgewogICAgY29udGV4dENoYWluLmFkZChjb250ZXh0Tm9kZSk7CiAgfQoKICBwb3BDb250ZXh0KFRyZWVOb2RlIGNvbnRleHROb2RlKSB7CiAgICBhc3NlcnQoY29udGV4dENoYWluLmxhc3QgPT0gY29udGV4dE5vZGUpOwogICAgY29udGV4dENoYWluLmxlbmd0aCA9IGNvbnRleHRDaGFpbi5sZW5ndGggLSAxOwogIH0KCiAgZGVmYXVsdFRyZWVOb2RlKE5vZGUgbm9kZSkgewogICAgLy8gT25seSBhIHN1YnNldCBvZiB0aGUgZXhwcmVzc2lvbiBsYW5ndWFnZSBpcyB2YWxpZCBmb3IgY29uc3RhbnQKICAgIC8vIGV2YWx1YXRpb24uCiAgICByZXR1cm4gcmVwb3J0SW52YWxpZCgKICAgICAgICBub2RlLCAnQ29uc3RhbnQgZXZhbHVhdGlvbiBoYXMgbm8gc3VwcG9ydCBmb3IgJHtub2RlLnJ1bnRpbWVUeXBlfSEnKTsKICB9CgogIHZpc2l0TnVsbExpdGVyYWwoTnVsbExpdGVyYWwgbm9kZSkgPT4gbnVsbENvbnN0YW50OwoKICB2aXNpdEJvb2xMaXRlcmFsKEJvb2xMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBtYWtlQm9vbENvbnN0YW50KG5vZGUudmFsdWUpOwogIH0KCiAgdmlzaXRJbnRMaXRlcmFsKEludExpdGVyYWwgbm9kZSkgewogICAgLy8gVGhlIGZyb250ZW5kIGVuc3VyZXMgdGhhdCBpbnRlZ2VyIGxpdGVyYWxzIGFyZSB2YWxpZCBhY2NvcmRpbmcgdG8gdGhlCiAgICAvLyB0YXJnZXQgcmVwcmVzZW50YXRpb24uCiAgICByZXR1cm4gdGFyZ2V0aW5nSmF2YVNjcmlwdAogICAgICAgID8gY2Fub25pY2FsaXplKG5ldyBKYXZhU2NyaXB0SW50Q29uc3RhbnQuZnJvbVVJbnQ2NChub2RlLnZhbHVlKSkKICAgICAgICA6IGNhbm9uaWNhbGl6ZShuZXcgSW50Q29uc3RhbnQobm9kZS52YWx1ZSkpOwogIH0KCiAgdmlzaXREb3VibGVMaXRlcmFsKERvdWJsZUxpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShtYWtlRG91YmxlQ29uc3RhbnQobm9kZS52YWx1ZSkpOwogIH0KCiAgdmlzaXRTdHJpbmdMaXRlcmFsKFN0cmluZ0xpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShuZXcgU3RyaW5nQ29uc3RhbnQobm9kZS52YWx1ZSkpOwogIH0KCiAgdmlzaXRUeXBlTGl0ZXJhbChUeXBlTGl0ZXJhbCBub2RlKSB7CiAgICBmaW5hbCBEYXJ0VHlwZSB0eXBlID0gZXZhbHVhdGVEYXJ0VHlwZShub2RlLCBub2RlLnR5cGUpOwogICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShuZXcgVHlwZUxpdGVyYWxDb25zdGFudCh0eXBlKSk7CiAgfQoKICB2aXNpdENvbnN0YW50RXhwcmVzc2lvbihDb25zdGFudEV4cHJlc3Npb24gbm9kZSkgewogICAgQ29uc3RhbnQgY29uc3RhbnQgPSBub2RlLmNvbnN0YW50OwogICAgQ29uc3RhbnQgcmVzdWx0ID0gY29uc3RhbnQ7CiAgICBpZiAoY29uc3RhbnQgaXMgVW5ldmFsdWF0ZWRDb25zdGFudCkgewogICAgICByZXN1bHQgPSBydW5JbnNpZGVDb250ZXh0KGNvbnN0YW50LmV4cHJlc3Npb24sICgpIHsKICAgICAgICByZXR1cm4gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihjb25zdGFudC5leHByZXNzaW9uKTsKICAgICAgfSk7CiAgICB9IGVsc2UgaWYgKHRhcmdldGluZ0phdmFTY3JpcHQpIHsKICAgICAgaWYgKGNvbnN0YW50IGlzIERvdWJsZUNvbnN0YW50KSB7CiAgICAgICAgZG91YmxlIHZhbHVlID0gY29uc3RhbnQudmFsdWU7CiAgICAgICAgLy8gVE9ETyhhc2tlc2MsIGZpc2h5dGhlZmlzaCk6IEhhbmRsZSBpbmZpbml0ZSBpbnRlZ2Vycy4KICAgICAgICBpZiAodmFsdWUuaXNGaW5pdGUgJiYgdmFsdWUudHJ1bmNhdGVUb0RvdWJsZSgpID09IHZhbHVlKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgSmF2YVNjcmlwdEludENvbnN0YW50LmZyb21Eb3VibGUodmFsdWUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy8gSWYgdGhlcmUgd2VyZSBhbHJlYWR5IGNvbnN0YW50cyBpbiB0aGUgQVNUIHRoZW4gd2UgbWFrZSBzdXJlIHdlCiAgICAvLyByZS1jYW5vbmljYWxpemUgdGhlbS4gIEFmdGVyIHJ1bm5pbmcgdGhlIHRyYW5zZm9ybWVyIHdlIHdpbGwgdGhlcmVmb3JlCiAgICAvLyBoYXZlIGEgZnVsbHktY2Fub25pY2FsaXplZCBjb25zdGFudCBEQUcgd2l0aCByb290cyBjb21pbmcgZnJvbSB0aGUKICAgIC8vIFtDb25zdGFudEV4cHJlc3Npb25dIG5vZGVzIGluIHRoZSBBU1QuCiAgICByZXR1cm4gY2Fub25pY2FsaXplKHJlc3VsdCk7CiAgfQoKICAvLy8gQWRkIGFuIGVsZW1lbnQgKHdoaWNoIGlzIHBvc3NpYmx5IGEgc3ByZWFkIG9yIGFuIGlmIGVsZW1lbnQpIHRvIGEKICAvLy8gY29uc3RhbnQgbGlzdCBvciBzZXQgcmVwcmVzZW50ZWQgYXMgYSBsaXN0IG9mIChwb3NzaWJseSB1bmV2YWx1YXRlZCkKICAvLy8gbGlzdHMgb3Igc2V0cyB0byBiZSBjb25jYXRlbmF0ZWQuCiAgLy8vIEVhY2ggZWxlbWVudCBvZiBbcGFydHNdIGlzIGVpdGhlciBhIGBMaXN0PENvbnN0YW50PmAgKGNvbnRhaW5pbmcgZnVsbHkKICAvLy8gZXZhbHVhdGVkIGNvbnN0YW50cykgb3IgYSBgQ29uc3RhbnRgIChwb3RlbnRpYWxseSB1bmV2YWx1YXRlZCkuCiAgLy8vIFBhc3MgYW4gaWRlbnRpdHkgc2V0IGFzIFtzZWVuXSBmb3Igc2V0cyBhbmQgb21pdCBpdCBmb3IgbGlzdHMuCiAgdm9pZCBhZGRUb0xpc3RPclNldENvbnN0YW50KAogICAgICBMaXN0PE9iamVjdD4gcGFydHMsIEV4cHJlc3Npb24gZWxlbWVudCwgRGFydFR5cGUgZWxlbWVudFR5cGUsCiAgICAgIFtTZXQ8Q29uc3RhbnQ+IHNlZW5dKSB7CiAgICBib29sIGlzU2V0ID0gc2VlbiAhPSBudWxsOwogICAgaWYgKGVsZW1lbnQgaXMgU3ByZWFkRWxlbWVudCkgewogICAgICBDb25zdGFudCBzcHJlYWQgPSB1bmxvd2VyKF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24oZWxlbWVudC5leHByZXNzaW9uKSk7CiAgICAgIGlmIChzaG91bGRCZVVuZXZhbHVhdGVkKSB7CiAgICAgICAgLy8gVW5ldmFsdWF0ZWQgc3ByZWFkCiAgICAgICAgaWYgKGVsZW1lbnQuaXNOdWxsQXdhcmUpIHsKICAgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdGVtcCA9CiAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24obnVsbCwgaW5pdGlhbGl6ZXI6IGV4dHJhY3Qoc3ByZWFkKSk7CiAgICAgICAgICBwYXJ0cy5hZGQodW5ldmFsdWF0ZWQoCiAgICAgICAgICAgICAgZWxlbWVudC5leHByZXNzaW9uLAogICAgICAgICAgICAgIG5ldyBMZXQoCiAgICAgICAgICAgICAgICAgIHRlbXAsCiAgICAgICAgICAgICAgICAgIG5ldyBDb25kaXRpb25hbEV4cHJlc3Npb24oCiAgICAgICAgICAgICAgICAgICAgICBuZXcgTWV0aG9kSW52b2NhdGlvbihuZXcgVmFyaWFibGVHZXQodGVtcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5hbWUoJz09JyksIG5ldyBBcmd1bWVudHMoW25ldyBOdWxsTGl0ZXJhbCgpXSkpLAogICAgICAgICAgICAgICAgICAgICAgbmV3IExpc3RMaXRlcmFsKFtdLCBpc0NvbnN0OiB0cnVlKSwKICAgICAgICAgICAgICAgICAgICAgIG5ldyBWYXJpYWJsZUdldCh0ZW1wKSwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IER5bmFtaWNUeXBlKCkpKSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwYXJ0cy5hZGQoc3ByZWFkKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoc3ByZWFkID09IG51bGxDb25zdGFudCkgewogICAgICAgIC8vIE51bGwgc3ByZWFkCiAgICAgICAgaWYgKCFlbGVtZW50LmlzTnVsbEF3YXJlKSB7CiAgICAgICAgICByZXBvcnQoZWxlbWVudC5leHByZXNzaW9uLCBtZXNzYWdlQ29uc3RFdmFsTnVsbFZhbHVlKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gRnVsbHkgZXZhbHVhdGVkIHNwcmVhZAogICAgICAgIExpc3Q8Q29uc3RhbnQ+IGVudHJpZXM7CiAgICAgICAgaWYgKHNwcmVhZCBpcyBMaXN0Q29uc3RhbnQpIHsKICAgICAgICAgIGVudHJpZXMgPSBzcHJlYWQuZW50cmllczsKICAgICAgICB9IGVsc2UgaWYgKHNwcmVhZCBpcyBTZXRDb25zdGFudCkgewogICAgICAgICAgZW50cmllcyA9IHNwcmVhZC5lbnRyaWVzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBOb3QgbGlzdCBvciBzZXQgaW4gc3ByZWFkCiAgICAgICAgICByZXR1cm4gcmVwb3J0KAogICAgICAgICAgICAgIGVsZW1lbnQuZXhwcmVzc2lvbiwgbWVzc2FnZUNvbnN0RXZhbE5vdExpc3RPclNldEluU3ByZWFkKTsKICAgICAgICB9CiAgICAgICAgZm9yIChDb25zdGFudCBlbnRyeSBpbiBlbnRyaWVzKSB7CiAgICAgICAgICBhZGRUb0xpc3RPclNldENvbnN0YW50KAogICAgICAgICAgICAgIHBhcnRzLCBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKGVudHJ5KSwgZWxlbWVudFR5cGUsIHNlZW4pOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmIChlbGVtZW50IGlzIElmRWxlbWVudCkgewogICAgICBDb25zdGFudCBjb25kaXRpb24gPSBfZXZhbHVhdGVTdWJleHByZXNzaW9uKGVsZW1lbnQuY29uZGl0aW9uKTsKICAgICAgaWYgKHNob3VsZEJlVW5ldmFsdWF0ZWQpIHsKICAgICAgICAvLyBVbmV2YWx1YXRlZCBpZgogICAgICAgIGVudGVyTGF6eSgpOwogICAgICAgIENvbnN0YW50IHRoZW4gPSBfZXZhbHVhdGVTdWJleHByZXNzaW9uKGlzU2V0CiAgICAgICAgICAgID8gbmV3IFNldExpdGVyYWwoW2Nsb25lci5jbG9uZShlbGVtZW50LnRoZW4pXSwgaXNDb25zdDogdHJ1ZSkKICAgICAgICAgICAgOiBuZXcgTGlzdExpdGVyYWwoW2Nsb25lci5jbG9uZShlbGVtZW50LnRoZW4pXSwgaXNDb25zdDogdHJ1ZSkpOwogICAgICAgIENvbnN0YW50IG90aGVyd2lzZTsKICAgICAgICBpZiAoZWxlbWVudC5vdGhlcndpc2UgIT0gbnVsbCkgewogICAgICAgICAgb3RoZXJ3aXNlID0gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihpc1NldAogICAgICAgICAgICAgID8gbmV3IFNldExpdGVyYWwoW2Nsb25lci5jbG9uZShlbGVtZW50Lm90aGVyd2lzZSldLCBpc0NvbnN0OiB0cnVlKQogICAgICAgICAgICAgIDogbmV3IExpc3RMaXRlcmFsKFtjbG9uZXIuY2xvbmUoZWxlbWVudC5vdGhlcndpc2UpXSwKICAgICAgICAgICAgICAgICAgaXNDb25zdDogdHJ1ZSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBvdGhlcndpc2UgPSBpc1NldAogICAgICAgICAgICAgID8gbmV3IFNldENvbnN0YW50KGNvbnN0IER5bmFtaWNUeXBlKCksIFtdKQogICAgICAgICAgICAgIDogbmV3IExpc3RDb25zdGFudChjb25zdCBEeW5hbWljVHlwZSgpLCBbXSk7CiAgICAgICAgfQogICAgICAgIGxlYXZlTGF6eSgpOwogICAgICAgIHBhcnRzLmFkZCh1bmV2YWx1YXRlZCgKICAgICAgICAgICAgZWxlbWVudC5jb25kaXRpb24sCiAgICAgICAgICAgIG5ldyBDb25kaXRpb25hbEV4cHJlc3Npb24oZXh0cmFjdChjb25kaXRpb24pLCBleHRyYWN0KHRoZW4pLAogICAgICAgICAgICAgICAgZXh0cmFjdChvdGhlcndpc2UpLCBjb25zdCBEeW5hbWljVHlwZSgpKSkpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEZ1bGx5IGV2YWx1YXRlZCBpZgogICAgICAgIGlmIChjb25kaXRpb24gPT0gdHJ1ZUNvbnN0YW50KSB7CiAgICAgICAgICBhZGRUb0xpc3RPclNldENvbnN0YW50KHBhcnRzLCBlbGVtZW50LnRoZW4sIGVsZW1lbnRUeXBlLCBzZWVuKTsKICAgICAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbiA9PSBmYWxzZUNvbnN0YW50KSB7CiAgICAgICAgICBpZiAoZWxlbWVudC5vdGhlcndpc2UgIT0gbnVsbCkgewogICAgICAgICAgICBhZGRUb0xpc3RPclNldENvbnN0YW50KHBhcnRzLCBlbGVtZW50Lm90aGVyd2lzZSwgZWxlbWVudFR5cGUsIHNlZW4pOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY29uZGl0aW9uID09IG51bGxDb25zdGFudCkgewogICAgICAgICAgcmVwb3J0KGVsZW1lbnQuY29uZGl0aW9uLCBtZXNzYWdlQ29uc3RFdmFsTnVsbFZhbHVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVwb3J0KAogICAgICAgICAgICAgIGVsZW1lbnQuY29uZGl0aW9uLAogICAgICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFR5cGUud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgY29uZGl0aW9uLAogICAgICAgICAgICAgICAgICB0eXBlRW52aXJvbm1lbnQuYm9vbFR5cGUsCiAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbi5nZXRUeXBlKHR5cGVFbnZpcm9ubWVudCkpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpcyBGb3JFbGVtZW50IHx8IGVsZW1lbnQgaXMgRm9ySW5FbGVtZW50KSB7CiAgICAgIC8vIEZvciBvciBmb3ItaW4KICAgICAgcmVwb3J0KAogICAgICAgICAgZWxlbWVudCwKICAgICAgICAgIGlzU2V0CiAgICAgICAgICAgICAgPyBtZXNzYWdlQ29uc3RFdmFsSXRlcmF0aW9uSW5Db25zdFNldAogICAgICAgICAgICAgIDogbWVzc2FnZUNvbnN0RXZhbEl0ZXJhdGlvbkluQ29uc3RMaXN0KTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE9yZGluYXJ5IGV4cHJlc2lvbiBlbGVtZW50CiAgICAgIENvbnN0YW50IGNvbnN0YW50ID0gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihlbGVtZW50KTsKICAgICAgaWYgKHNob3VsZEJlVW5ldmFsdWF0ZWQpIHsKICAgICAgICBwYXJ0cy5hZGQodW5ldmFsdWF0ZWQoCiAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgIGlzU2V0CiAgICAgICAgICAgICAgICA/IG5ldyBTZXRMaXRlcmFsKFtleHRyYWN0KGNvbnN0YW50KV0sCiAgICAgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50OiBlbGVtZW50VHlwZSwgaXNDb25zdDogdHJ1ZSkKICAgICAgICAgICAgICAgIDogbmV3IExpc3RMaXRlcmFsKFtleHRyYWN0KGNvbnN0YW50KV0sCiAgICAgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50OiBlbGVtZW50VHlwZSwgaXNDb25zdDogdHJ1ZSkpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBMaXN0PENvbnN0YW50PiBsaXN0T3JTZXQ7CiAgICAgICAgaWYgKHBhcnRzLmxhc3QgaXMgTGlzdDxDb25zdGFudD4pIHsKICAgICAgICAgIGxpc3RPclNldCA9IHBhcnRzLmxhc3Q7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHBhcnRzLmFkZChsaXN0T3JTZXQgPSA8Q29uc3RhbnQ+W10pOwogICAgICAgIH0KICAgICAgICBpZiAoaXNTZXQpIHsKICAgICAgICAgIGlmICghaGFzUHJpbWl0aXZlRXF1YWwoY29uc3RhbnQpKSB7CiAgICAgICAgICAgIHJlcG9ydCgKICAgICAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEVsZW1lbnRJbXBsZW1lbnRzRXF1YWwKICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhjb25zdGFudCkpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFzZWVuLmFkZChjb25zdGFudCkpIHsKICAgICAgICAgICAgcmVwb3J0KGVsZW1lbnQsCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbER1cGxpY2F0ZUVsZW1lbnQud2l0aEFyZ3VtZW50cyhjb25zdGFudCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsaXN0T3JTZXQuYWRkKGVuc3VyZUlzU3VidHlwZShjb25zdGFudCwgZWxlbWVudFR5cGUsIGVsZW1lbnQpKTsKICAgICAgfQogICAgfQogIH0KCiAgQ29uc3RhbnQgbWFrZUxpc3RDb25zdGFudEZyb21QYXJ0cygKICAgICAgTGlzdDxPYmplY3Q+IHBhcnRzLCBFeHByZXNzaW9uIG5vZGUsIERhcnRUeXBlIGVsZW1lbnRUeXBlKSB7CiAgICBpZiAocGFydHMubGVuZ3RoID09IDEpIHsKICAgICAgLy8gRnVsbHkgZXZhbHVhdGVkCiAgICAgIHJldHVybiBsb3dlckxpc3RDb25zdGFudChuZXcgTGlzdENvbnN0YW50KGVsZW1lbnRUeXBlLCBwYXJ0cy5zaW5nbGUpKTsKICAgIH0KICAgIExpc3Q8RXhwcmVzc2lvbj4gbGlzdHMgPSA8RXhwcmVzc2lvbj5bXTsKICAgIGZvciAoT2JqZWN0IHBhcnQgaW4gcGFydHMpIHsKICAgICAgaWYgKHBhcnQgaXMgTGlzdDxDb25zdGFudD4pIHsKICAgICAgICBsaXN0cy5hZGQobmV3IENvbnN0YW50RXhwcmVzc2lvbihuZXcgTGlzdENvbnN0YW50KGVsZW1lbnRUeXBlLCBwYXJ0KSkpOwogICAgICB9IGVsc2UgaWYgKHBhcnQgaXMgQ29uc3RhbnQpIHsKICAgICAgICBsaXN0cy5hZGQoZXh0cmFjdChwYXJ0KSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgJ05vbi1jb25zdGFudCBpbiBjb25zdGFudCBsaXN0JzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHVuZXZhbHVhdGVkKAogICAgICAgIG5vZGUsIG5ldyBMaXN0Q29uY2F0ZW5hdGlvbihsaXN0cywgdHlwZUFyZ3VtZW50OiBlbGVtZW50VHlwZSkpOwogIH0KCiAgdmlzaXRMaXN0TGl0ZXJhbChMaXN0TGl0ZXJhbCBub2RlKSB7CiAgICBpZiAoIW5vZGUuaXNDb25zdCkgewogICAgICByZXR1cm4gcmVwb3J0KAogICAgICAgICAgbm9kZSwgdGVtcGxhdGVDb25zdEV2YWxOb25Db25zdGFudExpdGVyYWwud2l0aEFyZ3VtZW50cygnTGlzdCcpKTsKICAgIH0KICAgIGZpbmFsIExpc3Q8T2JqZWN0PiBwYXJ0cyA9IDxPYmplY3Q+WzxDb25zdGFudD5bXV07CiAgICBmb3IgKEV4cHJlc3Npb24gZWxlbWVudCBpbiBub2RlLmV4cHJlc3Npb25zKSB7CiAgICAgIGFkZFRvTGlzdE9yU2V0Q29uc3RhbnQocGFydHMsIGVsZW1lbnQsIG5vZGUudHlwZUFyZ3VtZW50KTsKICAgIH0KICAgIHJldHVybiBtYWtlTGlzdENvbnN0YW50RnJvbVBhcnRzKHBhcnRzLCBub2RlLCBub2RlLnR5cGVBcmd1bWVudCk7CiAgfQoKICB2aXNpdExpc3RDb25jYXRlbmF0aW9uKExpc3RDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIGZpbmFsIExpc3Q8T2JqZWN0PiBwYXJ0cyA9IDxPYmplY3Q+WzxDb25zdGFudD5bXV07CiAgICBmb3IgKEV4cHJlc3Npb24gbGlzdCBpbiBub2RlLmxpc3RzKSB7CiAgICAgIGFkZFRvTGlzdE9yU2V0Q29uc3RhbnQocGFydHMsCiAgICAgICAgICBuZXcgU3ByZWFkRWxlbWVudChjbG9uZXIuY2xvbmUobGlzdCksIGZhbHNlKSwgbm9kZS50eXBlQXJndW1lbnQpOwogICAgfQogICAgcmV0dXJuIG1ha2VMaXN0Q29uc3RhbnRGcm9tUGFydHMocGFydHMsIG5vZGUsIG5vZGUudHlwZUFyZ3VtZW50KTsKICB9CgogIENvbnN0YW50IG1ha2VTZXRDb25zdGFudEZyb21QYXJ0cygKICAgICAgTGlzdDxPYmplY3Q+IHBhcnRzLCBFeHByZXNzaW9uIG5vZGUsIERhcnRUeXBlIGVsZW1lbnRUeXBlKSB7CiAgICBpZiAocGFydHMubGVuZ3RoID09IDEpIHsKICAgICAgLy8gRnVsbHkgZXZhbHVhdGVkCiAgICAgIExpc3Q8Q29uc3RhbnQ+IGVudHJpZXMgPSBwYXJ0cy5zaW5nbGU7CiAgICAgIFNldENvbnN0YW50IHJlc3VsdCA9IG5ldyBTZXRDb25zdGFudChlbGVtZW50VHlwZSwgZW50cmllcyk7CiAgICAgIGlmIChkZXN1Z2FyU2V0cykgewogICAgICAgIGZpbmFsIExpc3Q8Q29uc3RhbnRNYXBFbnRyeT4gbWFwRW50cmllcyA9CiAgICAgICAgICAgIG5ldyBMaXN0PENvbnN0YW50TWFwRW50cnk+KGVudHJpZXMubGVuZ3RoKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgIG1hcEVudHJpZXNbaV0gPSBuZXcgQ29uc3RhbnRNYXBFbnRyeShlbnRyaWVzW2ldLCBudWxsQ29uc3RhbnQpOwogICAgICAgIH0KICAgICAgICBDb25zdGFudCBtYXAgPSBsb3dlck1hcENvbnN0YW50KAogICAgICAgICAgICBuZXcgTWFwQ29uc3RhbnQoZWxlbWVudFR5cGUsIHR5cGVFbnZpcm9ubWVudC5udWxsVHlwZSwgbWFwRW50cmllcykpOwogICAgICAgIHJldHVybiBsb3dlcigKICAgICAgICAgICAgcmVzdWx0LAogICAgICAgICAgICBuZXcgSW5zdGFuY2VDb25zdGFudCgKICAgICAgICAgICAgICAgIHVubW9kaWZpYWJsZVNldE1hcC5lbmNsb3NpbmdDbGFzcy5yZWZlcmVuY2UsCiAgICAgICAgICAgICAgICBbZWxlbWVudFR5cGVdLAogICAgICAgICAgICAgICAgPFJlZmVyZW5jZSwgQ29uc3RhbnQ+e3VubW9kaWZpYWJsZVNldE1hcC5yZWZlcmVuY2U6IG1hcH0pKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbG93ZXJTZXRDb25zdGFudChyZXN1bHQpOwogICAgICB9CiAgICB9CiAgICBMaXN0PEV4cHJlc3Npb24+IHNldHMgPSA8RXhwcmVzc2lvbj5bXTsKICAgIGZvciAoT2JqZWN0IHBhcnQgaW4gcGFydHMpIHsKICAgICAgaWYgKHBhcnQgaXMgTGlzdDxDb25zdGFudD4pIHsKICAgICAgICBzZXRzLmFkZChuZXcgQ29uc3RhbnRFeHByZXNzaW9uKG5ldyBTZXRDb25zdGFudChlbGVtZW50VHlwZSwgcGFydCkpKTsKICAgICAgfSBlbHNlIGlmIChwYXJ0IGlzIENvbnN0YW50KSB7CiAgICAgICAgc2V0cy5hZGQoZXh0cmFjdChwYXJ0KSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgJ05vbi1jb25zdGFudCBpbiBjb25zdGFudCBzZXQnOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdW5ldmFsdWF0ZWQoCiAgICAgICAgbm9kZSwgbmV3IFNldENvbmNhdGVuYXRpb24oc2V0cywgdHlwZUFyZ3VtZW50OiBlbGVtZW50VHlwZSkpOwogIH0KCiAgdmlzaXRTZXRMaXRlcmFsKFNldExpdGVyYWwgbm9kZSkgewogICAgaWYgKCFub2RlLmlzQ29uc3QpIHsKICAgICAgcmV0dXJuIHJlcG9ydCgKICAgICAgICAgIG5vZGUsIHRlbXBsYXRlQ29uc3RFdmFsTm9uQ29uc3RhbnRMaXRlcmFsLndpdGhBcmd1bWVudHMoJ1NldCcpKTsKICAgIH0KICAgIGZpbmFsIFNldDxDb25zdGFudD4gc2VlbiA9IG5ldyBTZXQ8Q29uc3RhbnQ+LmlkZW50aXR5KCk7CiAgICBmaW5hbCBMaXN0PE9iamVjdD4gcGFydHMgPSA8T2JqZWN0Pls8Q29uc3RhbnQ+W11dOwogICAgZm9yIChFeHByZXNzaW9uIGVsZW1lbnQgaW4gbm9kZS5leHByZXNzaW9ucykgewogICAgICBhZGRUb0xpc3RPclNldENvbnN0YW50KHBhcnRzLCBlbGVtZW50LCBub2RlLnR5cGVBcmd1bWVudCwgc2Vlbik7CiAgICB9CiAgICByZXR1cm4gbWFrZVNldENvbnN0YW50RnJvbVBhcnRzKHBhcnRzLCBub2RlLCBub2RlLnR5cGVBcmd1bWVudCk7CiAgfQoKICB2aXNpdFNldENvbmNhdGVuYXRpb24oU2V0Q29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICBmaW5hbCBTZXQ8Q29uc3RhbnQ+IHNlZW4gPSBuZXcgU2V0PENvbnN0YW50Pi5pZGVudGl0eSgpOwogICAgZmluYWwgTGlzdDxPYmplY3Q+IHBhcnRzID0gPE9iamVjdD5bPENvbnN0YW50PltdXTsKICAgIGZvciAoRXhwcmVzc2lvbiBzZXRfIGluIG5vZGUuc2V0cykgewogICAgICBhZGRUb0xpc3RPclNldENvbnN0YW50KAogICAgICAgICAgcGFydHMsCiAgICAgICAgICBuZXcgU3ByZWFkRWxlbWVudChjbG9uZXIuY2xvbmUoc2V0XyksIGZhbHNlKSwKICAgICAgICAgIG5vZGUudHlwZUFyZ3VtZW50LAogICAgICAgICAgc2Vlbik7CiAgICB9CiAgICByZXR1cm4gbWFrZVNldENvbnN0YW50RnJvbVBhcnRzKHBhcnRzLCBub2RlLCBub2RlLnR5cGVBcmd1bWVudCk7CiAgfQoKICAvLy8gQWRkIGEgbWFwIGVudHJ5ICh3aGljaCBpcyBwb3NzaWJseSBhIHNwcmVhZCBvciBhbiBpZiBtYXAgZW50cnkpIHRvIGEKICAvLy8gY29uc3RhbnQgbWFwIHJlcHJlc2VudGVkIGFzIGEgbGlzdCBvZiAocG9zc2libHkgdW5ldmFsdWF0ZWQpCiAgLy8vIG1hcHMgdG8gYmUgY29uY2F0ZW5hdGVkLgogIC8vLyBFYWNoIGVsZW1lbnQgb2YgW3BhcnRzXSBpcyBlaXRoZXIgYSBgTGlzdDxDb25zdGFudE1hcEVudHJ5PmAgKGNvbnRhaW5pbmcKICAvLy8gZnVsbHkgZXZhbHVhdGVkIG1hcCBlbnRyaWVzKSBvciBhIGBDb25zdGFudGAgKHBvdGVudGlhbGx5IHVuZXZhbHVhdGVkKS4KICB2b2lkIGFkZFRvTWFwQ29uc3RhbnQoTGlzdDxPYmplY3Q+IHBhcnRzLCBNYXBFbnRyeSBlbGVtZW50LCBEYXJ0VHlwZSBrZXlUeXBlLAogICAgICBEYXJ0VHlwZSB2YWx1ZVR5cGUsIFNldDxDb25zdGFudD4gc2VlbktleXMpIHsKICAgIGlmIChlbGVtZW50IGlzIFNwcmVhZE1hcEVudHJ5KSB7CiAgICAgIENvbnN0YW50IHNwcmVhZCA9IHVubG93ZXIoX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihlbGVtZW50LmV4cHJlc3Npb24pKTsKICAgICAgaWYgKHNob3VsZEJlVW5ldmFsdWF0ZWQpIHsKICAgICAgICAvLyBVbmV2YWx1YXRlZCBzcHJlYWQKICAgICAgICBpZiAoZWxlbWVudC5pc051bGxBd2FyZSkgewogICAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB0ZW1wID0KICAgICAgICAgICAgICBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbihudWxsLCBpbml0aWFsaXplcjogZXh0cmFjdChzcHJlYWQpKTsKICAgICAgICAgIHBhcnRzLmFkZCh1bmV2YWx1YXRlZCgKICAgICAgICAgICAgICBlbGVtZW50LmV4cHJlc3Npb24sCiAgICAgICAgICAgICAgbmV3IExldCgKICAgICAgICAgICAgICAgICAgdGVtcCwKICAgICAgICAgICAgICAgICAgbmV3IENvbmRpdGlvbmFsRXhwcmVzc2lvbigKICAgICAgICAgICAgICAgICAgICAgIG5ldyBNZXRob2RJbnZvY2F0aW9uKG5ldyBWYXJpYWJsZUdldCh0ZW1wKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTmFtZSgnPT0nKSwgbmV3IEFyZ3VtZW50cyhbbmV3IE51bGxMaXRlcmFsKCldKSksCiAgICAgICAgICAgICAgICAgICAgICBuZXcgTWFwTGl0ZXJhbChbXSwgaXNDb25zdDogdHJ1ZSksCiAgICAgICAgICAgICAgICAgICAgICBuZXcgVmFyaWFibGVHZXQodGVtcCksCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEeW5hbWljVHlwZSgpKSkpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcGFydHMuYWRkKHNwcmVhZCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHNwcmVhZCA9PSBudWxsQ29uc3RhbnQpIHsKICAgICAgICAvLyBOdWxsIHNwcmVhZAogICAgICAgIGlmICghZWxlbWVudC5pc051bGxBd2FyZSkgewogICAgICAgICAgcmVwb3J0KGVsZW1lbnQuZXhwcmVzc2lvbiwgbWVzc2FnZUNvbnN0RXZhbE51bGxWYWx1ZSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIC8vIEZ1bGx5IGV2YWx1YXRlZCBzcHJlYWQKICAgICAgICBpZiAoc3ByZWFkIGlzIE1hcENvbnN0YW50KSB7CiAgICAgICAgICBmb3IgKENvbnN0YW50TWFwRW50cnkgZW50cnkgaW4gc3ByZWFkLmVudHJpZXMpIHsKICAgICAgICAgICAgYWRkVG9NYXBDb25zdGFudCgKICAgICAgICAgICAgICAgIHBhcnRzLAogICAgICAgICAgICAgICAgbmV3IE1hcEVudHJ5KG5ldyBDb25zdGFudEV4cHJlc3Npb24oZW50cnkua2V5KSwKICAgICAgICAgICAgICAgICAgICBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKGVudHJ5LnZhbHVlKSksCiAgICAgICAgICAgICAgICBrZXlUeXBlLAogICAgICAgICAgICAgICAgdmFsdWVUeXBlLAogICAgICAgICAgICAgICAgc2VlbktleXMpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBOb3QgbWFwIGluIHNwcmVhZAogICAgICAgICAgcmV0dXJuIHJlcG9ydChlbGVtZW50LmV4cHJlc3Npb24sIG1lc3NhZ2VDb25zdEV2YWxOb3RNYXBJblNwcmVhZCk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaXMgSWZNYXBFbnRyeSkgewogICAgICBDb25zdGFudCBjb25kaXRpb24gPSBfZXZhbHVhdGVTdWJleHByZXNzaW9uKGVsZW1lbnQuY29uZGl0aW9uKTsKICAgICAgaWYgKHNob3VsZEJlVW5ldmFsdWF0ZWQpIHsKICAgICAgICAvLyBVbmV2YWx1YXRlZCBpZgogICAgICAgIGVudGVyTGF6eSgpOwogICAgICAgIENvbnN0YW50IHRoZW4gPSBfZXZhbHVhdGVTdWJleHByZXNzaW9uKAogICAgICAgICAgICBuZXcgTWFwTGl0ZXJhbChbY2xvbmVyLmNsb25lKGVsZW1lbnQudGhlbildLCBpc0NvbnN0OiB0cnVlKSk7CiAgICAgICAgQ29uc3RhbnQgb3RoZXJ3aXNlOwogICAgICAgIGlmIChlbGVtZW50Lm90aGVyd2lzZSAhPSBudWxsKSB7CiAgICAgICAgICBvdGhlcndpc2UgPSBfZXZhbHVhdGVTdWJleHByZXNzaW9uKAogICAgICAgICAgICAgIG5ldyBNYXBMaXRlcmFsKFtjbG9uZXIuY2xvbmUoZWxlbWVudC5vdGhlcndpc2UpXSwgaXNDb25zdDogdHJ1ZSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBvdGhlcndpc2UgPQogICAgICAgICAgICAgIG5ldyBNYXBDb25zdGFudChjb25zdCBEeW5hbWljVHlwZSgpLCBjb25zdCBEeW5hbWljVHlwZSgpLCBbXSk7CiAgICAgICAgfQogICAgICAgIGxlYXZlTGF6eSgpOwogICAgICAgIHBhcnRzLmFkZCh1bmV2YWx1YXRlZCgKICAgICAgICAgICAgZWxlbWVudC5jb25kaXRpb24sCiAgICAgICAgICAgIG5ldyBDb25kaXRpb25hbEV4cHJlc3Npb24oZXh0cmFjdChjb25kaXRpb24pLCBleHRyYWN0KHRoZW4pLAogICAgICAgICAgICAgICAgZXh0cmFjdChvdGhlcndpc2UpLCBjb25zdCBEeW5hbWljVHlwZSgpKSkpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEZ1bGx5IGV2YWx1YXRlZCBpZgogICAgICAgIGlmIChjb25kaXRpb24gPT0gdHJ1ZUNvbnN0YW50KSB7CiAgICAgICAgICBhZGRUb01hcENvbnN0YW50KHBhcnRzLCBlbGVtZW50LnRoZW4sIGtleVR5cGUsIHZhbHVlVHlwZSwgc2VlbktleXMpOwogICAgICAgIH0gZWxzZSBpZiAoY29uZGl0aW9uID09IGZhbHNlQ29uc3RhbnQpIHsKICAgICAgICAgIGlmIChlbGVtZW50Lm90aGVyd2lzZSAhPSBudWxsKSB7CiAgICAgICAgICAgIGFkZFRvTWFwQ29uc3RhbnQoCiAgICAgICAgICAgICAgICBwYXJ0cywgZWxlbWVudC5vdGhlcndpc2UsIGtleVR5cGUsIHZhbHVlVHlwZSwgc2VlbktleXMpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY29uZGl0aW9uID09IG51bGxDb25zdGFudCkgewogICAgICAgICAgcmVwb3J0KGVsZW1lbnQuY29uZGl0aW9uLCBtZXNzYWdlQ29uc3RFdmFsTnVsbFZhbHVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVwb3J0KAogICAgICAgICAgICAgIGVsZW1lbnQuY29uZGl0aW9uLAogICAgICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFR5cGUud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgY29uZGl0aW9uLAogICAgICAgICAgICAgICAgICB0eXBlRW52aXJvbm1lbnQuYm9vbFR5cGUsCiAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbi5nZXRUeXBlKHR5cGVFbnZpcm9ubWVudCkpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpcyBGb3JNYXBFbnRyeSB8fCBlbGVtZW50IGlzIEZvckluTWFwRW50cnkpIHsKICAgICAgLy8gRm9yIG9yIGZvci1pbgogICAgICByZXBvcnQoZWxlbWVudCwgbWVzc2FnZUNvbnN0RXZhbEl0ZXJhdGlvbkluQ29uc3RNYXApOwogICAgfSBlbHNlIHsKICAgICAgLy8gT3JkaW5hcnkgbWFwIGVudHJ5CiAgICAgIENvbnN0YW50IGtleSA9IF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24oZWxlbWVudC5rZXkpOwogICAgICBDb25zdGFudCB2YWx1ZSA9IF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24oZWxlbWVudC52YWx1ZSk7CiAgICAgIGlmIChzaG91bGRCZVVuZXZhbHVhdGVkKSB7CiAgICAgICAgcGFydHMuYWRkKHVuZXZhbHVhdGVkKAogICAgICAgICAgICBlbGVtZW50LmtleSwKICAgICAgICAgICAgbmV3IE1hcExpdGVyYWwoW25ldyBNYXBFbnRyeShleHRyYWN0KGtleSksIGV4dHJhY3QodmFsdWUpKV0sCiAgICAgICAgICAgICAgICBpc0NvbnN0OiB0cnVlKSkpOwogICAgICB9IGVsc2UgewogICAgICAgIExpc3Q8Q29uc3RhbnRNYXBFbnRyeT4gZW50cmllczsKICAgICAgICBpZiAocGFydHMubGFzdCBpcyBMaXN0PENvbnN0YW50TWFwRW50cnk+KSB7CiAgICAgICAgICBlbnRyaWVzID0gcGFydHMubGFzdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcGFydHMuYWRkKGVudHJpZXMgPSA8Q29uc3RhbnRNYXBFbnRyeT5bXSk7CiAgICAgICAgfQogICAgICAgIGlmICghaGFzUHJpbWl0aXZlRXF1YWwoa2V5KSkgewogICAgICAgICAgcmVwb3J0KAogICAgICAgICAgICAgIGVsZW1lbnQsIHRlbXBsYXRlQ29uc3RFdmFsS2V5SW1wbGVtZW50c0VxdWFsLndpdGhBcmd1bWVudHMoa2V5KSk7CiAgICAgICAgfQogICAgICAgIGlmICghc2VlbktleXMuYWRkKGtleSkpIHsKICAgICAgICAgIHJlcG9ydChlbGVtZW50LmtleSwgdGVtcGxhdGVDb25zdEV2YWxEdXBsaWNhdGVLZXkud2l0aEFyZ3VtZW50cyhrZXkpKTsKICAgICAgICB9CiAgICAgICAgZW50cmllcy5hZGQobmV3IENvbnN0YW50TWFwRW50cnkoCiAgICAgICAgICAgIGVuc3VyZUlzU3VidHlwZShrZXksIGtleVR5cGUsIGVsZW1lbnQua2V5KSwKICAgICAgICAgICAgZW5zdXJlSXNTdWJ0eXBlKHZhbHVlLCB2YWx1ZVR5cGUsIGVsZW1lbnQudmFsdWUpKSk7CiAgICAgIH0KICAgIH0KICB9CgogIENvbnN0YW50IG1ha2VNYXBDb25zdGFudEZyb21QYXJ0cyhMaXN0PE9iamVjdD4gcGFydHMsIEV4cHJlc3Npb24gbm9kZSwKICAgICAgRGFydFR5cGUga2V5VHlwZSwgRGFydFR5cGUgdmFsdWVUeXBlKSB7CiAgICBpZiAocGFydHMubGVuZ3RoID09IDEpIHsKICAgICAgLy8gRnVsbHkgZXZhbHVhdGVkCiAgICAgIHJldHVybiBsb3dlck1hcENvbnN0YW50KAogICAgICAgICAgbmV3IE1hcENvbnN0YW50KGtleVR5cGUsIHZhbHVlVHlwZSwgcGFydHMuc2luZ2xlKSk7CiAgICB9CiAgICBMaXN0PEV4cHJlc3Npb24+IG1hcHMgPSA8RXhwcmVzc2lvbj5bXTsKICAgIGZvciAoT2JqZWN0IHBhcnQgaW4gcGFydHMpIHsKICAgICAgaWYgKHBhcnQgaXMgTGlzdDxDb25zdGFudE1hcEVudHJ5PikgewogICAgICAgIG1hcHMuYWRkKAogICAgICAgICAgICBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKG5ldyBNYXBDb25zdGFudChrZXlUeXBlLCB2YWx1ZVR5cGUsIHBhcnQpKSk7CiAgICAgIH0gZWxzZSBpZiAocGFydCBpcyBDb25zdGFudCkgewogICAgICAgIG1hcHMuYWRkKGV4dHJhY3QocGFydCkpOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93ICdOb24tY29uc3RhbnQgaW4gY29uc3RhbnQgbWFwJzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHVuZXZhbHVhdGVkKG5vZGUsCiAgICAgICAgbmV3IE1hcENvbmNhdGVuYXRpb24obWFwcywga2V5VHlwZToga2V5VHlwZSwgdmFsdWVUeXBlOiB2YWx1ZVR5cGUpKTsKICB9CgogIHZpc2l0TWFwTGl0ZXJhbChNYXBMaXRlcmFsIG5vZGUpIHsKICAgIGlmICghbm9kZS5pc0NvbnN0KSB7CiAgICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgICBub2RlLCB0ZW1wbGF0ZUNvbnN0RXZhbE5vbkNvbnN0YW50TGl0ZXJhbC53aXRoQXJndW1lbnRzKCdNYXAnKSk7CiAgICB9CiAgICBmaW5hbCBTZXQ8Q29uc3RhbnQ+IHNlZW4gPSBuZXcgU2V0PENvbnN0YW50Pi5pZGVudGl0eSgpOwogICAgZmluYWwgTGlzdDxPYmplY3Q+IHBhcnRzID0gPE9iamVjdD5bPENvbnN0YW50TWFwRW50cnk+W11dOwogICAgZm9yIChNYXBFbnRyeSBlbGVtZW50IGluIG5vZGUuZW50cmllcykgewogICAgICBhZGRUb01hcENvbnN0YW50KHBhcnRzLCBlbGVtZW50LCBub2RlLmtleVR5cGUsIG5vZGUudmFsdWVUeXBlLCBzZWVuKTsKICAgIH0KICAgIHJldHVybiBtYWtlTWFwQ29uc3RhbnRGcm9tUGFydHMocGFydHMsIG5vZGUsIG5vZGUua2V5VHlwZSwgbm9kZS52YWx1ZVR5cGUpOwogIH0KCiAgdmlzaXRNYXBDb25jYXRlbmF0aW9uKE1hcENvbmNhdGVuYXRpb24gbm9kZSkgewogICAgZmluYWwgU2V0PENvbnN0YW50PiBzZWVuID0gbmV3IFNldDxDb25zdGFudD4uaWRlbnRpdHkoKTsKICAgIGZpbmFsIExpc3Q8T2JqZWN0PiBwYXJ0cyA9IDxPYmplY3Q+WzxDb25zdGFudE1hcEVudHJ5PltdXTsKICAgIGZvciAoRXhwcmVzc2lvbiBtYXAgaW4gbm9kZS5tYXBzKSB7CiAgICAgIGFkZFRvTWFwQ29uc3RhbnQocGFydHMsIG5ldyBTcHJlYWRNYXBFbnRyeShjbG9uZXIuY2xvbmUobWFwKSwgZmFsc2UpLAogICAgICAgICAgbm9kZS5rZXlUeXBlLCBub2RlLnZhbHVlVHlwZSwgc2Vlbik7CiAgICB9CiAgICByZXR1cm4gbWFrZU1hcENvbnN0YW50RnJvbVBhcnRzKHBhcnRzLCBub2RlLCBub2RlLmtleVR5cGUsIG5vZGUudmFsdWVUeXBlKTsKICB9CgogIHZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKEZ1bmN0aW9uRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gcmVwb3J0KAogICAgICAgIG5vZGUsIHRlbXBsYXRlQ29uc3RFdmFsTm9uQ29uc3RhbnRMaXRlcmFsLndpdGhBcmd1bWVudHMoJ0Z1bmN0aW9uJykpOwogIH0KCiAgdmlzaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGZpbmFsIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gbm9kZS50YXJnZXQ7CiAgICBmaW5hbCBDbGFzcyBrbGFzcyA9IGNvbnN0cnVjdG9yLmVuY2xvc2luZ0NsYXNzOwogICAgYm9vbCBpc1N5bWJvbCA9IGtsYXNzID09IGNvcmVUeXBlcy5pbnRlcm5hbFN5bWJvbENsYXNzOwogICAgaWYgKCFjb25zdHJ1Y3Rvci5pc0NvbnN0KSB7CiAgICAgIHJldHVybiByZXBvcnRJbnZhbGlkKG5vZGUsICdOb24tY29uc3QgY29uc3RydWN0b3IgaW52b2NhdGlvbi4nKTsKICAgIH0KICAgIGlmIChjb25zdHJ1Y3Rvci5mdW5jdGlvbi5ib2R5ICE9IG51bGwgJiYKICAgICAgICBjb25zdHJ1Y3Rvci5mdW5jdGlvbi5ib2R5IGlzISBFbXB0eVN0YXRlbWVudCkgewogICAgICByZXR1cm4gcmVwb3J0SW52YWxpZCgKICAgICAgICAgIG5vZGUsCiAgICAgICAgICAnQ29uc3RydWN0b3IgIiRub2RlIiBoYXMgbm9uLXRyaXZpYWwgYm9keSAnCiAgICAgICAgICAnIiR7Y29uc3RydWN0b3IuZnVuY3Rpb24uYm9keS5ydW50aW1lVHlwZX0iLicpOwogICAgfQogICAgaWYgKGtsYXNzLmlzQWJzdHJhY3QpIHsKICAgICAgcmV0dXJuIHJlcG9ydEludmFsaWQoCiAgICAgICAgICBub2RlLCAnQ29uc3RydWN0b3IgIiRub2RlIiBiZWxvbmdzIHRvIGFic3RyYWN0IGNsYXNzICIke2tsYXNzfSIuJyk7CiAgICB9CgogICAgZmluYWwgcG9zaXRpb25hbHMgPSBldmFsdWF0ZVBvc2l0aW9uYWxBcmd1bWVudHMobm9kZS5hcmd1bWVudHMpOwogICAgZmluYWwgbmFtZWQgPSBldmFsdWF0ZU5hbWVkQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKTsKCiAgICAvLyBJcyB0aGUgY29uc3RydWN0b3IgdW5hdmFpbGFibGUgZHVlIHRvIHNlcGFyYXRlIGNvbXBpbGF0aW9uPwogICAgYm9vbCBpc1VuYXZhaWxhYmxlID0gY29uc3RydWN0b3IuaXNJbkV4dGVybmFsTGlicmFyeSAmJgogICAgICAgIGNvbnN0cnVjdG9yLmluaXRpYWxpemVycy5pc0VtcHR5ICYmCiAgICAgICAgY29uc3RydWN0b3IuZW5jbG9zaW5nQ2xhc3Muc3VwZXJ0eXBlICE9IG51bGw7CgogICAgaWYgKGlzVW5hdmFpbGFibGUgfHwgKGlzU3ltYm9sICYmIHNob3VsZEJlVW5ldmFsdWF0ZWQpKSB7CiAgICAgIHJldHVybiB1bmV2YWx1YXRlZCgKICAgICAgICAgIG5vZGUsCiAgICAgICAgICBuZXcgQ29uc3RydWN0b3JJbnZvY2F0aW9uKGNvbnN0cnVjdG9yLAogICAgICAgICAgICAgIHVuZXZhbHVhdGVkQXJndW1lbnRzKHBvc2l0aW9uYWxzLCBuYW1lZCwgbm9kZS5hcmd1bWVudHMudHlwZXMpLAogICAgICAgICAgICAgIGlzQ29uc3Q6IHRydWUpKTsKICAgIH0KCiAgICAvLyBTcGVjaWFsIGNhc2UgdGhlIGRhcnQ6Y29yZSdzIFN5bWJvbCBjbGFzcyBoZXJlIGFuZCBjb252ZXJ0IGl0IHRvIGEKICAgIC8vIFtTeW1ib2xDb25zdGFudF0uICBGb3IgaW52YWxpZCB2YWx1ZXMgd2UgcmVwb3J0IGEgY29tcGlsZS10aW1lIGVycm9yLgogICAgaWYgKGlzU3ltYm9sKSB7CiAgICAgIGZpbmFsIENvbnN0YW50IG5hbWVWYWx1ZSA9IHBvc2l0aW9uYWxzLnNpbmdsZTsKCiAgICAgIGlmIChuYW1lVmFsdWUgaXMgU3RyaW5nQ29uc3RhbnQgJiYgaXNWYWxpZFN5bWJvbE5hbWUobmFtZVZhbHVlLnZhbHVlKSkgewogICAgICAgIHJldHVybiBjYW5vbmljYWxpemUobmV3IFN5bWJvbENvbnN0YW50KG5hbWVWYWx1ZS52YWx1ZSwgbnVsbCkpOwogICAgICB9CiAgICAgIHJldHVybiByZXBvcnQobm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5maXJzdCwKICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFN5bWJvbE5hbWUud2l0aEFyZ3VtZW50cyhuYW1lVmFsdWUpKTsKICAgIH0KCiAgICBmaW5hbCB0eXBlQXJndW1lbnRzID0gZXZhbHVhdGVUeXBlQXJndW1lbnRzKG5vZGUsIG5vZGUuYXJndW1lbnRzKTsKCiAgICAvLyBGaWxsIGluIGFueSBtaXNzaW5nIHR5cGUgYXJndW1lbnRzIHdpdGggImR5bmFtaWMiLgogICAgZm9yIChpbnQgaSA9IHR5cGVBcmd1bWVudHMubGVuZ3RoOyBpIDwga2xhc3MudHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgdHlwZUFyZ3VtZW50cy5hZGQoY29uc3QgRHluYW1pY1R5cGUoKSk7CiAgICB9CgogICAgLy8gU3RhcnQgYnVpbGRpbmcgYSBuZXcgaW5zdGFuY2UuCiAgICByZXR1cm4gd2l0aE5ld0luc3RhbmNlQnVpbGRlcihrbGFzcywgdHlwZUFyZ3VtZW50cywgKCkgewogICAgICByZXR1cm4gcnVuSW5zaWRlQ29udGV4dElmTm9Db250ZXh0KG5vZGUsICgpIHsKICAgICAgICAvLyAiUnVuIiB0aGUgY29uc3RydWN0b3IgKGFuZCBhbnkgc3VwZXIgY29uc3RydWN0b3IgY2FsbHMpLCB3aGljaCB3aWxsCiAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgZmllbGRzIG9mIHRoZSBuZXcgaW5zdGFuY2UuCiAgICAgICAgaWYgKHNob3VsZEJlVW5ldmFsdWF0ZWQpIHsKICAgICAgICAgIGVudGVyTGF6eSgpOwogICAgICAgICAgaGFuZGxlQ29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgICAgICAgICAgIGNvbnN0cnVjdG9yLCB0eXBlQXJndW1lbnRzLCBwb3NpdGlvbmFscywgbmFtZWQpOwogICAgICAgICAgbGVhdmVMYXp5KCk7CiAgICAgICAgICByZXR1cm4gdW5ldmFsdWF0ZWQobm9kZSwgaW5zdGFuY2VCdWlsZGVyLmJ1aWxkVW5ldmFsdWF0ZWRJbnN0YW5jZSgpKTsKICAgICAgICB9CiAgICAgICAgaGFuZGxlQ29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgICAgICAgICBjb25zdHJ1Y3RvciwgdHlwZUFyZ3VtZW50cywgcG9zaXRpb25hbHMsIG5hbWVkKTsKICAgICAgICBpZiAoc2hvdWxkQmVVbmV2YWx1YXRlZCkgewogICAgICAgICAgcmV0dXJuIHVuZXZhbHVhdGVkKG5vZGUsIGluc3RhbmNlQnVpbGRlci5idWlsZFVuZXZhbHVhdGVkSW5zdGFuY2UoKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjYW5vbmljYWxpemUoaW5zdGFuY2VCdWlsZGVyLmJ1aWxkSW5zdGFuY2UoKSk7CiAgICAgIH0pOwogICAgfSk7CiAgfQoKICB2aXNpdEluc3RhbmNlQ3JlYXRpb24oSW5zdGFuY2VDcmVhdGlvbiBub2RlKSB7CiAgICByZXR1cm4gd2l0aE5ld0luc3RhbmNlQnVpbGRlcihub2RlLmNsYXNzTm9kZSwgbm9kZS50eXBlQXJndW1lbnRzLCAoKSB7CiAgICAgIGZvciAoQXNzZXJ0U3RhdGVtZW50IHN0YXRlbWVudCBpbiBub2RlLmFzc2VydHMpIHsKICAgICAgICBjaGVja0Fzc2VydChzdGF0ZW1lbnQpOwogICAgICB9CiAgICAgIG5vZGUuZmllbGRWYWx1ZXMuZm9yRWFjaCgoUmVmZXJlbmNlIGZpZWxkUmVmLCBFeHByZXNzaW9uIHZhbHVlKSB7CiAgICAgICAgaW5zdGFuY2VCdWlsZGVyLnNldEZpZWxkVmFsdWUoCiAgICAgICAgICAgIGZpZWxkUmVmLmFzRmllbGQsIF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24odmFsdWUpKTsKICAgICAgfSk7CiAgICAgIGlmIChzaG91bGRCZVVuZXZhbHVhdGVkKSB7CiAgICAgICAgcmV0dXJuIHVuZXZhbHVhdGVkKG5vZGUsIGluc3RhbmNlQnVpbGRlci5idWlsZFVuZXZhbHVhdGVkSW5zdGFuY2UoKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShpbnN0YW5jZUJ1aWxkZXIuYnVpbGRJbnN0YW5jZSgpKTsKICAgIH0pOwogIH0KCiAgYm9vbCBpc1ZhbGlkU3ltYm9sTmFtZShTdHJpbmcgbmFtZSkgewogICAgLy8gU2VlIGh0dHBzOi8vYXBpLmRhcnRsYW5nLm9yZy9zdGFibGUvMi4wLjAvZGFydC1jb3JlL1N5bWJvbC9TeW1ib2wuaHRtbDoKICAgIC8vCiAgICAvLyAgQSBxdWFsaWZpZWQgbmFtZSBpcyBhIHZhbGlkIG5hbWUgcHJlY2VkZWQgYnkgYSBwdWJsaWMgaWRlbnRpZmllciBuYW1lIGFuZAogICAgLy8gIGEgJy4nLCBlLmcuLCBmb28uYmFyLmJhej0gaXMgYSBxdWFsaWZpZWQgdmVyc2lvbiBvZiBiYXo9LgogICAgLy8KICAgIC8vICBUaGF0IG1lYW5zIHRoYXQgdGhlIGNvbnRlbnQgb2YgdGhlIG5hbWUgU3RyaW5nIG11c3QgYmUgZWl0aGVyCiAgICAvLyAgICAgLSBhIHZhbGlkIHB1YmxpYyBEYXJ0IGlkZW50aWZpZXIgKHRoYXQgaXMsIGFuIGlkZW50aWZpZXIgbm90CiAgICAvLyAgICAgICBzdGFydGluZyB3aXRoICJfIiksCiAgICAvLyAgICAgLSBzdWNoIGFuIGlkZW50aWZpZXIgZm9sbG93ZWQgYnkgIj0iIChhIHNldHRlciBuYW1lKSwKICAgIC8vICAgICAtIHRoZSBuYW1lIG9mIGEgZGVjbGFyYWJsZSBvcGVyYXRvciwKICAgIC8vICAgICAtIGFueSBvZiB0aGUgYWJvdmUgcHJlY2VkZWQgYnkgYW55IG51bWJlciBvZiBxdWFsaWZpZXJzLCB3aGVyZSBhCiAgICAvLyAgICAgICBxdWFsaWZpZXIgaXMgYSBub24tcHJpdmF0ZSBpZGVudGlmaWVyIGZvbGxvd2VkIGJ5ICcuJywKICAgIC8vICAgICAtIG9yIHRoZSBlbXB0eSBzdHJpbmcgKHRoZSBkZWZhdWx0IG5hbWUgb2YgYSBsaWJyYXJ5IHdpdGggbm8gbGlicmFyeQogICAgLy8gICAgICAgbmFtZSBkZWNsYXJhdGlvbikuCgogICAgY29uc3Qgb3BlcmF0b3JOYW1lcyA9IGNvbnN0IDxTdHJpbmc+WwogICAgICAnKycsCiAgICAgICctJywKICAgICAgJyonLAogICAgICAnLycsCiAgICAgICclJywKICAgICAgJ34vJywKICAgICAgJyYnLAogICAgICAnfCcsCiAgICAgICdeJywKICAgICAgJ34nLAogICAgICAnPDwnLAogICAgICAnPj4nLAogICAgICAnPCcsCiAgICAgICc8PScsCiAgICAgICc+JywKICAgICAgJz49JywKICAgICAgJz09JywKICAgICAgJ1tdJywKICAgICAgJ1tdPScsCiAgICAgICd1bmFyeS0nCiAgICBdOwoKICAgIGlmIChuYW1lID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIGlmIChuYW1lID09ICcnKSByZXR1cm4gdHJ1ZTsKCiAgICBmaW5hbCBwYXJ0cyA9IG5hbWUuc3BsaXQoJy4nKTsKCiAgICAvLyBFYWNoIHF1YWxpZmllciBtdXN0IGJlIGEgcHVibGljIGlkZW50aWZpZXIuCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7ICsraSkgewogICAgICBpZiAoIWlzVmFsaWRQdWJsaWNJZGVudGlmaWVyKHBhcnRzW2ldKSkgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIFN0cmluZyBsYXN0ID0gcGFydHMubGFzdDsKICAgIGlmIChvcGVyYXRvck5hbWVzLmNvbnRhaW5zKGxhc3QpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKGxhc3QuZW5kc1dpdGgoJz0nKSkgewogICAgICBsYXN0ID0gbGFzdC5zdWJzdHJpbmcoMCwgbGFzdC5sZW5ndGggLSAxKTsKICAgIH0KICAgIGlmICghaXNWYWxpZFB1YmxpY0lkZW50aWZpZXIobGFzdCkpIHJldHVybiBmYWxzZTsKCiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8vLyBGcm9tIHRoZSBEYXJ0IExhbmd1YWdlIHNwZWNpZmljYXRpb246CiAgLy8vCiAgLy8vICAgSURFTlRJRklFUjoKICAvLy8gICAgIElERU5USUZJRVJfU1RBUlQgSURFTlRJRklFUl9QQVJUKgogIC8vLwogIC8vLyAgIElERU5USUZJRVJfU1RBUlQ6CiAgLy8vICAgICAgIElERU5USUZJRVJfU1RBUlRfTk9fRE9MTEFSIHwg4oCYJOKAmQogIC8vLwogIC8vLyAgIElERU5USUZJRVJfUEFSVDoKICAvLy8gICAgICAgSURFTlRJRklFUl9TVEFSVCB8IERJR0lUCiAgLy8vCiAgLy8vICAgSURFTlRJRklFUl9OT19ET0xMQVI6CiAgLy8vICAgICBJREVOVElGSUVSX1NUQVJUX05PX0RPTExBUiBJREVOVElGSUVSX1BBUlRfTk9fRE9MTEFSKgogIC8vLwogIC8vLyAgIElERU5USUZJRVJfU1RBUlRfTk9fRE9MTEFSOgogIC8vLyAgICAgICBMRVRURVIgfCAnXycKICAvLy8KICAvLy8gICBJREVOVElGSUVSX1BBUlRfTk9fRE9MTEFSOgogIC8vLyAgICAgICBJREVOVElGSUVSX1NUQVJUX05PX0RPTExBUiB8IERJR0lUCiAgLy8vCiAgc3RhdGljIGZpbmFsIHB1YmxpY0lkZW50aWZpZXJSZWdFeHAgPQogICAgICBuZXcgUmVnRXhwKHInXlthLXpBLVokXVthLXpBLVowLTlfJF0qJCcpOwoKICBzdGF0aWMgY29uc3Qgbm9uVXNhYmxlS2V5d29yZHMgPSBjb25zdCA8U3RyaW5nPlsKICAgICdhc3NlcnQnLAogICAgJ2JyZWFrJywKICAgICdjYXNlJywKICAgICdjYXRjaCcsCiAgICAnY2xhc3MnLAogICAgJ2NvbnN0JywKICAgICdjb250aW51ZScsCiAgICAnZGVmYXVsdCcsCiAgICAnZG8nLAogICAgJ2Vsc2UnLAogICAgJ2VudW0nLAogICAgJ2V4dGVuZHMnLAogICAgJ2ZhbHNlJywKICAgICdmaW5hbCcsCiAgICAnZmluYWxseScsCiAgICAnZm9yJywKICAgICdpZicsCiAgICAnaW4nLAogICAgJ2lzJywKICAgICduZXcnLAogICAgJ251bGwnLAogICAgJ3JldGhyb3cnLAogICAgJ3JldHVybicsCiAgICAnc3VwZXInLAogICAgJ3N3aXRjaCcsCiAgICAndGhpcycsCiAgICAndGhyb3cnLAogICAgJ3RydWUnLAogICAgJ3RyeScsCiAgICAndmFyJywKICAgICd3aGlsZScsCiAgICAnd2l0aCcsCiAgXTsKCiAgYm9vbCBpc1ZhbGlkUHVibGljSWRlbnRpZmllcihTdHJpbmcgbmFtZSkgewogICAgcmV0dXJuIHB1YmxpY0lkZW50aWZpZXJSZWdFeHAuaGFzTWF0Y2gobmFtZSkgJiYKICAgICAgICAhbm9uVXNhYmxlS2V5d29yZHMuY29udGFpbnMobmFtZSk7CiAgfQoKICBoYW5kbGVDb25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yLAogICAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzLAogICAgICBMaXN0PENvbnN0YW50PiBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBNYXA8U3RyaW5nLCBDb25zdGFudD4gbmFtZWRBcmd1bWVudHMpIHsKICAgIHJldHVybiBydW5JbnNpZGVDb250ZXh0KGNvbnN0cnVjdG9yLCAoKSB7CiAgICAgIHJldHVybiB3aXRoTmV3RW52aXJvbm1lbnQoKCkgewogICAgICAgIGZpbmFsIENsYXNzIGtsYXNzID0gY29uc3RydWN0b3IuZW5jbG9zaW5nQ2xhc3M7CiAgICAgICAgZmluYWwgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uID0gY29uc3RydWN0b3IuZnVuY3Rpb247CgogICAgICAgIC8vIFdlIHNpbXVsYXRlIG5vdyB0aGUgY29uc3RydWN0b3IgaW52b2NhdGlvbi4KCiAgICAgICAgLy8gU3RlcCAxKSBNYXAgdHlwZSBhcmd1bWVudHMgYW5kIG5vcm1hbCBhcmd1bWVudHMgZnJvbSBjYWxsZXIgdG8gY2FsbGVlLgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2xhc3MudHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGVudi5hZGRUeXBlUGFyYW1ldGVyVmFsdWUoa2xhc3MudHlwZVBhcmFtZXRlcnNbaV0sIHR5cGVBcmd1bWVudHNbaV0pOwogICAgICAgIH0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA9CiAgICAgICAgICAgICAgZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnNbaV07CiAgICAgICAgICBmaW5hbCBDb25zdGFudCB2YWx1ZSA9IChpIDwgcG9zaXRpb25hbEFyZ3VtZW50cy5sZW5ndGgpCiAgICAgICAgICAgICAgPyBwb3NpdGlvbmFsQXJndW1lbnRzW2ldCiAgICAgICAgICAgICAgOiBfZXZhbHVhdGVTdWJleHByZXNzaW9uKHBhcmFtZXRlci5pbml0aWFsaXplcik7CiAgICAgICAgICBlbnYuYWRkVmFyaWFibGVWYWx1ZShwYXJhbWV0ZXIsIHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZm9yIChmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciBpbiBmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgICAgIGZpbmFsIENvbnN0YW50IHZhbHVlID0gbmFtZWRBcmd1bWVudHNbcGFyYW1ldGVyLm5hbWVdID8/CiAgICAgICAgICAgICAgX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihwYXJhbWV0ZXIuaW5pdGlhbGl6ZXIpOwogICAgICAgICAgZW52LmFkZFZhcmlhYmxlVmFsdWUocGFyYW1ldGVyLCB2YWx1ZSk7CiAgICAgICAgfQoKICAgICAgICAvLyBTdGVwIDIpIFJ1biBhbGwgaW5pdGlhbGl6ZXJzIChpbmNsdWRpbmcgc3VwZXIgY2FsbHMpIHdpdGggZW52aXJvbm1lbnQgc2V0dXAuCiAgICAgICAgZm9yIChmaW5hbCBGaWVsZCBmaWVsZCBpbiBrbGFzcy5maWVsZHMpIHsKICAgICAgICAgIGlmICghZmllbGQuaXNTdGF0aWMpIHsKICAgICAgICAgICAgaW5zdGFuY2VCdWlsZGVyLnNldEZpZWxkVmFsdWUoCiAgICAgICAgICAgICAgICBmaWVsZCwgX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihmaWVsZC5pbml0aWFsaXplcikpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKGZpbmFsIEluaXRpYWxpemVyIGluaXQgaW4gY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzKSB7CiAgICAgICAgICBpZiAoaW5pdCBpcyBGaWVsZEluaXRpYWxpemVyKSB7CiAgICAgICAgICAgIGluc3RhbmNlQnVpbGRlci5zZXRGaWVsZFZhbHVlKAogICAgICAgICAgICAgICAgaW5pdC5maWVsZCwgX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihpbml0LnZhbHVlKSk7CiAgICAgICAgICB9IGVsc2UgaWYgKGluaXQgaXMgTG9jYWxJbml0aWFsaXplcikgewogICAgICAgICAgICBmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gaW5pdC52YXJpYWJsZTsKICAgICAgICAgICAgZW52LmFkZFZhcmlhYmxlVmFsdWUoCiAgICAgICAgICAgICAgICB2YXJpYWJsZSwgX2V2YWx1YXRlU3ViZXhwcmVzc2lvbih2YXJpYWJsZS5pbml0aWFsaXplcikpOwogICAgICAgICAgfSBlbHNlIGlmIChpbml0IGlzIFN1cGVySW5pdGlhbGl6ZXIpIHsKICAgICAgICAgICAgaGFuZGxlQ29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgICAgICAgICAgICAgaW5pdC50YXJnZXQsCiAgICAgICAgICAgICAgICBldmFsdWF0ZVN1cGVyVHlwZUFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgICBpbml0LCBjb25zdHJ1Y3Rvci5lbmNsb3NpbmdDbGFzcy5zdXBlcnR5cGUpLAogICAgICAgICAgICAgICAgZXZhbHVhdGVQb3NpdGlvbmFsQXJndW1lbnRzKGluaXQuYXJndW1lbnRzKSwKICAgICAgICAgICAgICAgIGV2YWx1YXRlTmFtZWRBcmd1bWVudHMoaW5pdC5hcmd1bWVudHMpKTsKICAgICAgICAgIH0gZWxzZSBpZiAoaW5pdCBpcyBSZWRpcmVjdGluZ0luaXRpYWxpemVyKSB7CiAgICAgICAgICAgIC8vIFNpbmNlIGEgcmVkaXJlY3RpbmcgY29uc3RydWN0b3IgdGFyZ2V0cyBhIGNvbnN0cnVjdG9yIG9mIHRoZSBzYW1lCiAgICAgICAgICAgIC8vIGNsYXNzLCB3ZSBwYXNzIHRoZSBzYW1lIFt0eXBlQXJndW1lbnRzXS4KICAgICAgICAgICAgaGFuZGxlQ29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgICAgICAgICAgICAgaW5pdC50YXJnZXQsCiAgICAgICAgICAgICAgICB0eXBlQXJndW1lbnRzLAogICAgICAgICAgICAgICAgZXZhbHVhdGVQb3NpdGlvbmFsQXJndW1lbnRzKGluaXQuYXJndW1lbnRzKSwKICAgICAgICAgICAgICAgIGV2YWx1YXRlTmFtZWRBcmd1bWVudHMoaW5pdC5hcmd1bWVudHMpKTsKICAgICAgICAgIH0gZWxzZSBpZiAoaW5pdCBpcyBBc3NlcnRJbml0aWFsaXplcikgewogICAgICAgICAgICBjaGVja0Fzc2VydChpbml0LnN0YXRlbWVudCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gcmVwb3J0SW52YWxpZCgKICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yLAogICAgICAgICAgICAgICAgJ05vIHN1cHBvcnQgZm9yIGhhbmRsaW5nIGluaXRpYWxpemVyIG9mIHR5cGUgJwogICAgICAgICAgICAgICAgJyIke2luaXQucnVudGltZVR5cGV9Ii4nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfQoKICB2b2lkIGNoZWNrQXNzZXJ0KEFzc2VydFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKICAgIGlmIChlbmFibGVBc3NlcnRzKSB7CiAgICAgIGZpbmFsIENvbnN0YW50IGNvbmRpdGlvbiA9IF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24oc3RhdGVtZW50LmNvbmRpdGlvbik7CgogICAgICBpZiAoc2hvdWxkQmVVbmV2YWx1YXRlZCkgewogICAgICAgIEV4cHJlc3Npb24gbWVzc2FnZSA9IG51bGw7CiAgICAgICAgaWYgKHN0YXRlbWVudC5tZXNzYWdlICE9IG51bGwpIHsKICAgICAgICAgIGVudGVyTGF6eSgpOwogICAgICAgICAgbWVzc2FnZSA9IGV4dHJhY3QoX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihzdGF0ZW1lbnQubWVzc2FnZSkpOwogICAgICAgICAgbGVhdmVMYXp5KCk7CiAgICAgICAgfQogICAgICAgIGluc3RhbmNlQnVpbGRlci5hc3NlcnRzLmFkZChuZXcgQXNzZXJ0U3RhdGVtZW50KGV4dHJhY3QoY29uZGl0aW9uKSwKICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSwKICAgICAgICAgICAgY29uZGl0aW9uU3RhcnRPZmZzZXQ6IHN0YXRlbWVudC5jb25kaXRpb25TdGFydE9mZnNldCwKICAgICAgICAgICAgY29uZGl0aW9uRW5kT2Zmc2V0OiBzdGF0ZW1lbnQuY29uZGl0aW9uRW5kT2Zmc2V0KSk7CiAgICAgIH0gZWxzZSBpZiAoY29uZGl0aW9uIGlzIEJvb2xDb25zdGFudCkgewogICAgICAgIGlmICghY29uZGl0aW9uLnZhbHVlKSB7CiAgICAgICAgICBpZiAoc3RhdGVtZW50Lm1lc3NhZ2UgPT0gbnVsbCkgewogICAgICAgICAgICByZXBvcnQoc3RhdGVtZW50LmNvbmRpdGlvbiwgbWVzc2FnZUNvbnN0RXZhbEZhaWxlZEFzc2VydGlvbik7CiAgICAgICAgICB9CiAgICAgICAgICBmaW5hbCBDb25zdGFudCBtZXNzYWdlID0gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihzdGF0ZW1lbnQubWVzc2FnZSk7CiAgICAgICAgICBpZiAoc2hvdWxkQmVVbmV2YWx1YXRlZCkgewogICAgICAgICAgICBpbnN0YW5jZUJ1aWxkZXIuYXNzZXJ0cy5hZGQobmV3IEFzc2VydFN0YXRlbWVudChleHRyYWN0KGNvbmRpdGlvbiksCiAgICAgICAgICAgICAgICBtZXNzYWdlOiBleHRyYWN0KG1lc3NhZ2UpLAogICAgICAgICAgICAgICAgY29uZGl0aW9uU3RhcnRPZmZzZXQ6IHN0YXRlbWVudC5jb25kaXRpb25TdGFydE9mZnNldCwKICAgICAgICAgICAgICAgIGNvbmRpdGlvbkVuZE9mZnNldDogc3RhdGVtZW50LmNvbmRpdGlvbkVuZE9mZnNldCkpOwogICAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlIGlzIFN0cmluZ0NvbnN0YW50KSB7CiAgICAgICAgICAgIHJlcG9ydCgKICAgICAgICAgICAgICAgIHN0YXRlbWVudC5jb25kaXRpb24sCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEZhaWxlZEFzc2VydGlvbldpdGhNZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobWVzc2FnZS52YWx1ZSkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVwb3J0KAogICAgICAgICAgICAgICAgc3RhdGVtZW50Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRUeXBlLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICB0eXBlRW52aXJvbm1lbnQuc3RyaW5nVHlwZSwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldFR5cGUodHlwZUVudmlyb25tZW50KSkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZXBvcnQoCiAgICAgICAgICAgIHN0YXRlbWVudC5jb25kaXRpb24sCiAgICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFR5cGUud2l0aEFyZ3VtZW50cyhjb25kaXRpb24sCiAgICAgICAgICAgICAgICB0eXBlRW52aXJvbm1lbnQuYm9vbFR5cGUsIGNvbmRpdGlvbi5nZXRUeXBlKHR5cGVFbnZpcm9ubWVudCkpKTsKICAgICAgfQogICAgfQogIH0KCiAgdmlzaXRJbnZhbGlkRXhwcmVzc2lvbihJbnZhbGlkRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gcmVwb3J0SW52YWxpZChub2RlLCBub2RlLm1lc3NhZ2UpOwogIH0KCiAgdmlzaXRNZXRob2RJbnZvY2F0aW9uKE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgLy8gV2UgaGF2ZSBubyBzdXBwb3J0IGZvciBnZW5lcmljIG1ldGhvZCBpbnZvY2F0aW9uIGF0bS4KICAgIGFzc2VydChub2RlLmFyZ3VtZW50cy5uYW1lZC5pc0VtcHR5KTsKCiAgICBmaW5hbCBDb25zdGFudCByZWNlaXZlciA9IF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24obm9kZS5yZWNlaXZlcik7CiAgICBmaW5hbCBMaXN0PENvbnN0YW50PiBhcmd1bWVudHMgPQogICAgICAgIGV2YWx1YXRlUG9zaXRpb25hbEFyZ3VtZW50cyhub2RlLmFyZ3VtZW50cyk7CgogICAgaWYgKHNob3VsZEJlVW5ldmFsdWF0ZWQpIHsKICAgICAgcmV0dXJuIHVuZXZhbHVhdGVkKAogICAgICAgICAgbm9kZSwKICAgICAgICAgIG5ldyBNZXRob2RJbnZvY2F0aW9uKGV4dHJhY3QocmVjZWl2ZXIpLCBub2RlLm5hbWUsCiAgICAgICAgICAgICAgdW5ldmFsdWF0ZWRBcmd1bWVudHMoYXJndW1lbnRzLCB7fSwgbm9kZS5hcmd1bWVudHMudHlwZXMpKSk7CiAgICB9CgogICAgLy8gSGFuZGxlID09IGFuZCAhPSBmaXJzdCAoaXQncyBjb21tb24gYmV0d2VlbiBhbGwgdHlwZXMpLiBTaW5jZSBgYSAhPSBiYCBpcwogICAgLy8gcGFyc2VkIGFzIGAhKGEgPT0gYilgIGl0IGlzIGhhbmRsZWQgaW1wbGljaXRseSB0aHJvdWdoID09LgogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSAmJiBub2RlLm5hbWUubmFtZSA9PSAnPT0nKSB7CiAgICAgIGZpbmFsIHJpZ2h0ID0gYXJndW1lbnRzWzBdOwoKICAgICAgLy8gW0RvdWJsZUNvbnN0YW50XSB1c2VzIFtpZGVudGljYWxdIHRvIGRldGVybWluZSBlcXVhbGl0eSwgc28gd2UgbmVlZCB0d28KICAgICAgLy8gc3BlY2lhbCBjYXNlczoKICAgICAgLy8gVHdvIE5hTnMgYXJlIGFsd2F5cyB1bmVxdWFsIGV2ZW4gaWYgW2lkZW50aWNhbF0gcmV0dXJucyBgdHJ1ZWAuCiAgICAgIGlmIChpc05hTihyZWNlaXZlcikgfHwgaXNOYU4ocmlnaHQpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlQ29uc3RhbnQ7CiAgICAgIH0KCiAgICAgIC8vIFR3byB6ZXJvIHZhbHVlcyBhcmUgYWx3YXlzIGVxdWFsIHJlZ2FyZGxlc3Mgb2Ygc2lnbi4KICAgICAgaWYgKGlzWmVybyhyZWNlaXZlcikpIHsKICAgICAgICByZXR1cm4gbWFrZUJvb2xDb25zdGFudChpc1plcm8ocmlnaHQpKTsKICAgICAgfQoKICAgICAgaWYgKHJlY2VpdmVyIGlzIE51bGxDb25zdGFudCB8fAogICAgICAgICAgcmVjZWl2ZXIgaXMgQm9vbENvbnN0YW50IHx8CiAgICAgICAgICByZWNlaXZlciBpcyBJbnRDb25zdGFudCB8fAogICAgICAgICAgcmVjZWl2ZXIgaXMgRG91YmxlQ29uc3RhbnQgfHwKICAgICAgICAgIHJlY2VpdmVyIGlzIFN0cmluZ0NvbnN0YW50IHx8CiAgICAgICAgICByaWdodCBpcyBOdWxsQ29uc3RhbnQpIHsKICAgICAgICByZXR1cm4gbWFrZUJvb2xDb25zdGFudChyZWNlaXZlciA9PSByaWdodCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHJlcG9ydCgKICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkRXF1YWxzT3BlcmFuZFR5cGUud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgIHJlY2VpdmVyLCByZWNlaXZlci5nZXRUeXBlKHR5cGVFbnZpcm9ubWVudCkpKTsKICAgICAgfQogICAgfQoKICAgIC8vIFRoaXMgaXMgYSB3aGl0ZS1saXN0ZWQgc2V0IG9mIG1ldGhvZHMgd2UgbmVlZCB0byBzdXBwb3J0IG9uIGNvbnN0YW50cy4KICAgIGlmIChyZWNlaXZlciBpcyBTdHJpbmdDb25zdGFudCkgewogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgc3dpdGNoIChub2RlLm5hbWUubmFtZSkgewogICAgICAgICAgY2FzZSAnKyc6CiAgICAgICAgICAgIGZpbmFsIENvbnN0YW50IG90aGVyID0gYXJndW1lbnRzWzBdOwogICAgICAgICAgICBpZiAob3RoZXIgaXMgU3RyaW5nQ29uc3RhbnQpIHsKICAgICAgICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKAogICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nQ29uc3RhbnQocmVjZWl2ZXIudmFsdWUgKyBvdGhlci52YWx1ZSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgICAgICAgICBub2RlLAogICAgICAgICAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkQmluYXJ5T3BlcmFuZFR5cGUud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgICAnKycsCiAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXIsCiAgICAgICAgICAgICAgICAgICAgdHlwZUVudmlyb25tZW50LnN0cmluZ1R5cGUsCiAgICAgICAgICAgICAgICAgICAgb3RoZXIuZ2V0VHlwZSh0eXBlRW52aXJvbm1lbnQpKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKHJlY2VpdmVyIGlzIEludENvbnN0YW50IHx8IHJlY2VpdmVyIGlzIEphdmFTY3JpcHRJbnRDb25zdGFudCkgewogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgc3dpdGNoIChub2RlLm5hbWUubmFtZSkgewogICAgICAgICAgY2FzZSAndW5hcnktJzoKICAgICAgICAgICAgaWYgKHRhcmdldGluZ0phdmFTY3JpcHQpIHsKICAgICAgICAgICAgICBCaWdJbnQgdmFsdWUgPSAocmVjZWl2ZXIgYXMgSmF2YVNjcmlwdEludENvbnN0YW50KS5iaWdJbnRWYWx1ZTsKICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gQmlnSW50Lnplcm8pIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYW5vbmljYWxpemUobmV3IERvdWJsZUNvbnN0YW50KC0wLjApKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShuZXcgSmF2YVNjcmlwdEludENvbnN0YW50LmZyb21CaWdJbnQoLXZhbHVlKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW50IHZhbHVlID0gKHJlY2VpdmVyIGFzIEludENvbnN0YW50KS52YWx1ZTsKICAgICAgICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShuZXcgSW50Q29uc3RhbnQoLXZhbHVlKSk7CiAgICAgICAgICBjYXNlICd+JzoKICAgICAgICAgICAgaWYgKHRhcmdldGluZ0phdmFTY3JpcHQpIHsKICAgICAgICAgICAgICBCaWdJbnQgdmFsdWUgPSAocmVjZWl2ZXIgYXMgSmF2YVNjcmlwdEludENvbnN0YW50KS5iaWdJbnRWYWx1ZTsKICAgICAgICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKG5ldyBKYXZhU2NyaXB0SW50Q29uc3RhbnQuZnJvbUJpZ0ludCgKICAgICAgICAgICAgICAgICAgKH52YWx1ZSkudG9VbnNpZ25lZCgzMikpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbnQgdmFsdWUgPSAocmVjZWl2ZXIgYXMgSW50Q29uc3RhbnQpLnZhbHVlOwogICAgICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKG5ldyBJbnRDb25zdGFudCh+dmFsdWUpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgZmluYWwgQ29uc3RhbnQgb3RoZXIgPSBhcmd1bWVudHNbMF07CiAgICAgICAgZmluYWwgb3AgPSBub2RlLm5hbWUubmFtZTsKICAgICAgICBpZiAob3RoZXIgaXMgSW50Q29uc3RhbnQgfHwgb3RoZXIgaXMgSmF2YVNjcmlwdEludENvbnN0YW50KSB7CiAgICAgICAgICBpZiAoKG9wID09ICc8PCcgfHwgb3AgPT0gJz4+JyB8fCBvcCA9PSAnPj4+JykpIHsKICAgICAgICAgICAgdmFyIHJlY2VpdmVyVmFsdWUgPSByZWNlaXZlciBpcyBJbnRDb25zdGFudAogICAgICAgICAgICAgICAgPyByZWNlaXZlci52YWx1ZQogICAgICAgICAgICAgICAgOiAocmVjZWl2ZXIgYXMgSmF2YVNjcmlwdEludENvbnN0YW50KS5iaWdJbnRWYWx1ZTsKICAgICAgICAgICAgaW50IG90aGVyVmFsdWUgPSBvdGhlciBpcyBJbnRDb25zdGFudAogICAgICAgICAgICAgICAgPyBvdGhlci52YWx1ZQogICAgICAgICAgICAgICAgOiAob3RoZXIgYXMgSmF2YVNjcmlwdEludENvbnN0YW50KS5iaWdJbnRWYWx1ZS50b0ludCgpOwogICAgICAgICAgICBpZiAob3RoZXJWYWx1ZSA8IDApIHsKICAgICAgICAgICAgICByZXR1cm4gcmVwb3J0KAogICAgICAgICAgICAgICAgICBub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmZpcnN0LAogICAgICAgICAgICAgICAgICAvLyBUT0RPKGFza2VzYyk6IENoYW5nZSBhcmd1bWVudCB0eXBlcyBpbiB0ZW1wbGF0ZSB0byBjb25zdGFudHMuCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsTmVnYXRpdmVTaGlmdC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICAgICAgb3AsICcke3JlY2VpdmVyVmFsdWV9JywgJyR7b3RoZXJWYWx1ZX0nKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoKG9wID09ICclJyB8fCBvcCA9PSAnfi8nKSkgewogICAgICAgICAgICB2YXIgcmVjZWl2ZXJWYWx1ZSA9IHJlY2VpdmVyIGlzIEludENvbnN0YW50CiAgICAgICAgICAgICAgICA/IHJlY2VpdmVyLnZhbHVlCiAgICAgICAgICAgICAgICA6IChyZWNlaXZlciBhcyBKYXZhU2NyaXB0SW50Q29uc3RhbnQpLmJpZ0ludFZhbHVlOwogICAgICAgICAgICBpbnQgb3RoZXJWYWx1ZSA9IG90aGVyIGlzIEludENvbnN0YW50CiAgICAgICAgICAgICAgICA/IG90aGVyLnZhbHVlCiAgICAgICAgICAgICAgICA6IChvdGhlciBhcyBKYXZhU2NyaXB0SW50Q29uc3RhbnQpLmJpZ0ludFZhbHVlLnRvSW50KCk7CiAgICAgICAgICAgIGlmIChvdGhlclZhbHVlID09IDApIHsKICAgICAgICAgICAgICByZXR1cm4gcmVwb3J0KAogICAgICAgICAgICAgICAgICBub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmZpcnN0LAogICAgICAgICAgICAgICAgICAvLyBUT0RPKGFza2VzYyk6IENoYW5nZSBhcmd1bWVudCB0eXBlIGluIHRlbXBsYXRlIHRvIGNvbnN0YW50LgogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbFplcm9EaXZpc29yLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgICAgICBvcCwgJyR7cmVjZWl2ZXJWYWx1ZX0nKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBzd2l0Y2ggKG9wKSB7CiAgICAgICAgICAgIGNhc2UgJ3wnOgogICAgICAgICAgICBjYXNlICcmJzoKICAgICAgICAgICAgY2FzZSAnXic6CiAgICAgICAgICAgICAgaW50IHJlY2VpdmVyVmFsdWUgPSByZWNlaXZlciBpcyBJbnRDb25zdGFudAogICAgICAgICAgICAgICAgICA/IHJlY2VpdmVyLnZhbHVlCiAgICAgICAgICAgICAgICAgIDogKHJlY2VpdmVyIGFzIEphdmFTY3JpcHRJbnRDb25zdGFudCkKICAgICAgICAgICAgICAgICAgICAgIC5iaWdJbnRWYWx1ZQogICAgICAgICAgICAgICAgICAgICAgLnRvVW5zaWduZWQoMzIpCiAgICAgICAgICAgICAgICAgICAgICAudG9JbnQoKTsKICAgICAgICAgICAgICBpbnQgb3RoZXJWYWx1ZSA9IG90aGVyIGlzIEludENvbnN0YW50CiAgICAgICAgICAgICAgICAgID8gb3RoZXIudmFsdWUKICAgICAgICAgICAgICAgICAgOiAob3RoZXIgYXMgSmF2YVNjcmlwdEludENvbnN0YW50KQogICAgICAgICAgICAgICAgICAgICAgLmJpZ0ludFZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAudG9VbnNpZ25lZCgzMikKICAgICAgICAgICAgICAgICAgICAgIC50b0ludCgpOwogICAgICAgICAgICAgIHJldHVybiBldmFsdWF0ZUJpbmFyeUJpdE9wZXJhdGlvbigKICAgICAgICAgICAgICAgICAgbm9kZS5uYW1lLm5hbWUsIHJlY2VpdmVyVmFsdWUsIG90aGVyVmFsdWUsIG5vZGUpOwogICAgICAgICAgICBjYXNlICc8PCc6CiAgICAgICAgICAgIGNhc2UgJz4+JzoKICAgICAgICAgICAgY2FzZSAnPj4+JzoKICAgICAgICAgICAgICBib29sIG5lZ2F0aXZlID0gZmFsc2U7CiAgICAgICAgICAgICAgaW50IHJlY2VpdmVyVmFsdWU7CiAgICAgICAgICAgICAgaWYgKHJlY2VpdmVyIGlzIEludENvbnN0YW50KSB7CiAgICAgICAgICAgICAgICByZWNlaXZlclZhbHVlID0gcmVjZWl2ZXIudmFsdWU7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIEJpZ0ludCBiaWdJbnRWYWx1ZSA9CiAgICAgICAgICAgICAgICAgICAgKHJlY2VpdmVyIGFzIEphdmFTY3JpcHRJbnRDb25zdGFudCkuYmlnSW50VmFsdWU7CiAgICAgICAgICAgICAgICByZWNlaXZlclZhbHVlID0gYmlnSW50VmFsdWUudG9VbnNpZ25lZCgzMikudG9JbnQoKTsKICAgICAgICAgICAgICAgIG5lZ2F0aXZlID0gYmlnSW50VmFsdWUuaXNOZWdhdGl2ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaW50IG90aGVyVmFsdWUgPSBvdGhlciBpcyBJbnRDb25zdGFudAogICAgICAgICAgICAgICAgICA/IG90aGVyLnZhbHVlCiAgICAgICAgICAgICAgICAgIDogKG90aGVyIGFzIEphdmFTY3JpcHRJbnRDb25zdGFudCkuYmlnSW50VmFsdWUudG9JbnQoKTsKCiAgICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRlQmluYXJ5U2hpZnRPcGVyYXRpb24oCiAgICAgICAgICAgICAgICAgIG5vZGUubmFtZS5uYW1lLCByZWNlaXZlclZhbHVlLCBvdGhlclZhbHVlLCBub2RlLAogICAgICAgICAgICAgICAgICBuZWdhdGl2ZVJlY2VpdmVyOiBuZWdhdGl2ZSk7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgbnVtIHJlY2VpdmVyVmFsdWUgPSByZWNlaXZlciBpcyBJbnRDb25zdGFudAogICAgICAgICAgICAgICAgICA/IHJlY2VpdmVyLnZhbHVlCiAgICAgICAgICAgICAgICAgIDogKHJlY2VpdmVyIGFzIERvdWJsZUNvbnN0YW50KS52YWx1ZTsKICAgICAgICAgICAgICBudW0gb3RoZXJWYWx1ZSA9IG90aGVyIGlzIEludENvbnN0YW50CiAgICAgICAgICAgICAgICAgID8gb3RoZXIudmFsdWUKICAgICAgICAgICAgICAgICAgOiAob3RoZXIgYXMgRG91YmxlQ29uc3RhbnQpLnZhbHVlOwogICAgICAgICAgICAgIHJldHVybiBldmFsdWF0ZUJpbmFyeU51bWVyaWNPcGVyYXRpb24oCiAgICAgICAgICAgICAgICAgIG5vZGUubmFtZS5uYW1lLCByZWNlaXZlclZhbHVlLCBvdGhlclZhbHVlLCBub2RlKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG90aGVyIGlzIERvdWJsZUNvbnN0YW50KSB7CiAgICAgICAgICBudW0gcmVjZWl2ZXJWYWx1ZSA9IHJlY2VpdmVyIGlzIEludENvbnN0YW50CiAgICAgICAgICAgICAgPyByZWNlaXZlci52YWx1ZQogICAgICAgICAgICAgIDogKHJlY2VpdmVyIGFzIERvdWJsZUNvbnN0YW50KS52YWx1ZTsKICAgICAgICAgIHJldHVybiBldmFsdWF0ZUJpbmFyeU51bWVyaWNPcGVyYXRpb24oCiAgICAgICAgICAgICAgbm9kZS5uYW1lLm5hbWUsIHJlY2VpdmVyVmFsdWUsIG90aGVyLnZhbHVlLCBub2RlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlcG9ydCgKICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkQmluYXJ5T3BlcmFuZFR5cGUud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgIG5vZGUubmFtZS5uYW1lLAogICAgICAgICAgICAgICAgcmVjZWl2ZXIsCiAgICAgICAgICAgICAgICB0eXBlRW52aXJvbm1lbnQubnVtVHlwZSwKICAgICAgICAgICAgICAgIG90aGVyLmdldFR5cGUodHlwZUVudmlyb25tZW50KSkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHJlY2VpdmVyIGlzIERvdWJsZUNvbnN0YW50KSB7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDApIHsKICAgICAgICBzd2l0Y2ggKG5vZGUubmFtZS5uYW1lKSB7CiAgICAgICAgICBjYXNlICd1bmFyeS0nOgogICAgICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKG1ha2VEb3VibGVDb25zdGFudCgtcmVjZWl2ZXIudmFsdWUpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgZmluYWwgQ29uc3RhbnQgb3RoZXIgPSBhcmd1bWVudHNbMF07CgogICAgICAgIGlmIChvdGhlciBpcyBJbnRDb25zdGFudCB8fCBvdGhlciBpcyBEb3VibGVDb25zdGFudCkgewogICAgICAgICAgZmluYWwgbnVtIHZhbHVlID0gKG90aGVyIGlzIEludENvbnN0YW50KQogICAgICAgICAgICAgID8gb3RoZXIudmFsdWUKICAgICAgICAgICAgICA6IChvdGhlciBhcyBEb3VibGVDb25zdGFudCkudmFsdWU7CiAgICAgICAgICByZXR1cm4gZXZhbHVhdGVCaW5hcnlOdW1lcmljT3BlcmF0aW9uKAogICAgICAgICAgICAgIG5vZGUubmFtZS5uYW1lLCByZWNlaXZlci52YWx1ZSwgdmFsdWUsIG5vZGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVwb3J0KAogICAgICAgICAgICBub2RlLAogICAgICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRCaW5hcnlPcGVyYW5kVHlwZS53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgbm9kZS5uYW1lLm5hbWUsCiAgICAgICAgICAgICAgICByZWNlaXZlciwKICAgICAgICAgICAgICAgIHR5cGVFbnZpcm9ubWVudC5udW1UeXBlLAogICAgICAgICAgICAgICAgb3RoZXIuZ2V0VHlwZSh0eXBlRW52aXJvbm1lbnQpKSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocmVjZWl2ZXIgaXMgQm9vbENvbnN0YW50KSB7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgICBmaW5hbCBDb25zdGFudCBvdGhlciA9IGFyZ3VtZW50c1swXTsKICAgICAgICBpZiAob3RoZXIgaXMgQm9vbENvbnN0YW50KSB7CiAgICAgICAgICBzd2l0Y2ggKG5vZGUubmFtZS5uYW1lKSB7CiAgICAgICAgICAgIGNhc2UgJ3wnOgogICAgICAgICAgICAgIHJldHVybiBjYW5vbmljYWxpemUoCiAgICAgICAgICAgICAgICAgIG5ldyBCb29sQ29uc3RhbnQocmVjZWl2ZXIudmFsdWUgfHwgb3RoZXIudmFsdWUpKTsKICAgICAgICAgICAgY2FzZSAnJic6CiAgICAgICAgICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZSgKICAgICAgICAgICAgICAgICAgbmV3IEJvb2xDb25zdGFudChyZWNlaXZlci52YWx1ZSAmJiBvdGhlci52YWx1ZSkpOwogICAgICAgICAgICBjYXNlICdeJzoKICAgICAgICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKAogICAgICAgICAgICAgICAgICBuZXcgQm9vbENvbnN0YW50KHJlY2VpdmVyLnZhbHVlICE9IG90aGVyLnZhbHVlKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKHJlY2VpdmVyIGlzIE51bGxDb25zdGFudCkgewogICAgICByZXR1cm4gcmVwb3J0KG5vZGUsIG1lc3NhZ2VDb25zdEV2YWxOdWxsVmFsdWUpOwogICAgfQoKICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgbm9kZSwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRNZXRob2RJbnZvY2F0aW9uLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgIG5vZGUubmFtZS5uYW1lLCByZWNlaXZlcikpOwogIH0KCiAgdmlzaXRMb2dpY2FsRXhwcmVzc2lvbihMb2dpY2FsRXhwcmVzc2lvbiBub2RlKSB7CiAgICBmaW5hbCBDb25zdGFudCBsZWZ0ID0gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlLmxlZnQpOwogICAgaWYgKHNob3VsZEJlVW5ldmFsdWF0ZWQpIHsKICAgICAgZW50ZXJMYXp5KCk7CiAgICAgIENvbnN0YW50IHJpZ2h0ID0gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlLnJpZ2h0KTsKICAgICAgbGVhdmVMYXp5KCk7CiAgICAgIHJldHVybiB1bmV2YWx1YXRlZChub2RlLAogICAgICAgICAgbmV3IExvZ2ljYWxFeHByZXNzaW9uKGV4dHJhY3QobGVmdCksIG5vZGUub3BlcmF0b3IsIGV4dHJhY3QocmlnaHQpKSk7CiAgICB9CiAgICBzd2l0Y2ggKG5vZGUub3BlcmF0b3IpIHsKICAgICAgY2FzZSAnfHwnOgogICAgICAgIGlmIChsZWZ0IGlzIEJvb2xDb25zdGFudCkgewogICAgICAgICAgaWYgKGxlZnQudmFsdWUpIHJldHVybiB0cnVlQ29uc3RhbnQ7CgogICAgICAgICAgZmluYWwgQ29uc3RhbnQgcmlnaHQgPSBfZXZhbHVhdGVTdWJleHByZXNzaW9uKG5vZGUucmlnaHQpOwogICAgICAgICAgaWYgKHJpZ2h0IGlzIEJvb2xDb25zdGFudCB8fCByaWdodCBpcyBVbmV2YWx1YXRlZENvbnN0YW50KSB7CiAgICAgICAgICAgIHJldHVybiByaWdodDsKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gcmVwb3J0KAogICAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkQmluYXJ5T3BlcmFuZFR5cGUud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgbm9kZS5vcGVyYXRvciwKICAgICAgICAgICAgICAgICAgbGVmdCwKICAgICAgICAgICAgICAgICAgdHlwZUVudmlyb25tZW50LmJvb2xUeXBlLAogICAgICAgICAgICAgICAgICByaWdodC5nZXRUeXBlKHR5cGVFbnZpcm9ubWVudCkpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlcG9ydCgKICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkTWV0aG9kSW52b2NhdGlvbi53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgbm9kZS5vcGVyYXRvciwgbGVmdCkpOwogICAgICBjYXNlICcmJic6CiAgICAgICAgaWYgKGxlZnQgaXMgQm9vbENvbnN0YW50KSB7CiAgICAgICAgICBpZiAoIWxlZnQudmFsdWUpIHJldHVybiBmYWxzZUNvbnN0YW50OwoKICAgICAgICAgIGZpbmFsIENvbnN0YW50IHJpZ2h0ID0gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlLnJpZ2h0KTsKICAgICAgICAgIGlmIChyaWdodCBpcyBCb29sQ29uc3RhbnQgfHwgcmlnaHQgaXMgVW5ldmFsdWF0ZWRDb25zdGFudCkgewogICAgICAgICAgICByZXR1cm4gcmlnaHQ7CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIHJlcG9ydCgKICAgICAgICAgICAgICBub2RlLAogICAgICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZEJpbmFyeU9wZXJhbmRUeXBlLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgIG5vZGUub3BlcmF0b3IsCiAgICAgICAgICAgICAgICAgIGxlZnQsCiAgICAgICAgICAgICAgICAgIHR5cGVFbnZpcm9ubWVudC5ib29sVHlwZSwKICAgICAgICAgICAgICAgICAgcmlnaHQuZ2V0VHlwZSh0eXBlRW52aXJvbm1lbnQpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZE1ldGhvZEludm9jYXRpb24ud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgIG5vZGUub3BlcmF0b3IsIGxlZnQpKTsKICAgICAgY2FzZSAnPz8nOgogICAgICAgIHJldHVybiAobGVmdCBpcyEgTnVsbENvbnN0YW50KQogICAgICAgICAgICA/IGxlZnQKICAgICAgICAgICAgOiBfZXZhbHVhdGVTdWJleHByZXNzaW9uKG5vZGUucmlnaHQpOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZE1ldGhvZEludm9jYXRpb24ud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgIG5vZGUub3BlcmF0b3IsIGxlZnQpKTsKICAgIH0KICB9CgogIHZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uKENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7CiAgICBmaW5hbCBDb25zdGFudCBjb25kaXRpb24gPSBfZXZhbHVhdGVTdWJleHByZXNzaW9uKG5vZGUuY29uZGl0aW9uKTsKICAgIGlmIChjb25kaXRpb24gPT0gdHJ1ZUNvbnN0YW50KSB7CiAgICAgIHJldHVybiBfZXZhbHVhdGVTdWJleHByZXNzaW9uKG5vZGUudGhlbik7CiAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbiA9PSBmYWxzZUNvbnN0YW50KSB7CiAgICAgIHJldHVybiBfZXZhbHVhdGVTdWJleHByZXNzaW9uKG5vZGUub3RoZXJ3aXNlKTsKICAgIH0gZWxzZSBpZiAoc2hvdWxkQmVVbmV2YWx1YXRlZCkgewogICAgICBlbnRlckxhenkoKTsKICAgICAgQ29uc3RhbnQgdGhlbiA9IF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24obm9kZS50aGVuKTsKICAgICAgQ29uc3RhbnQgb3RoZXJ3aXNlID0gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlLm90aGVyd2lzZSk7CiAgICAgIGxlYXZlTGF6eSgpOwogICAgICByZXR1cm4gdW5ldmFsdWF0ZWQoCiAgICAgICAgICBub2RlLAogICAgICAgICAgbmV3IENvbmRpdGlvbmFsRXhwcmVzc2lvbihleHRyYWN0KGNvbmRpdGlvbiksIGV4dHJhY3QodGhlbiksCiAgICAgICAgICAgICAgZXh0cmFjdChvdGhlcndpc2UpLCBub2RlLnN0YXRpY1R5cGUpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgICBub2RlLAogICAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkVHlwZS53aXRoQXJndW1lbnRzKGNvbmRpdGlvbiwKICAgICAgICAgICAgICB0eXBlRW52aXJvbm1lbnQuYm9vbFR5cGUsIGNvbmRpdGlvbi5nZXRUeXBlKHR5cGVFbnZpcm9ubWVudCkpKTsKICAgIH0KICB9CgogIHZpc2l0UHJvcGVydHlHZXQoUHJvcGVydHlHZXQgbm9kZSkgewogICAgaWYgKG5vZGUucmVjZWl2ZXIgaXMgVGhpc0V4cHJlc3Npb24pIHsKICAgICAgLy8gQWNjZXNzICJ0aGlzIiBkdXJpbmcgaW5zdGFuY2UgY3JlYXRpb24uCiAgICAgIGlmIChpbnN0YW5jZUJ1aWxkZXIgPT0gbnVsbCkgewogICAgICAgIHJldHVybiByZXBvcnRJbnZhbGlkKG5vZGUsICdJbnN0YW5jZSBmaWVsZCBhY2Nlc3Mgb3V0c2lkZSBjb25zdHJ1Y3RvcicpOwogICAgICB9CiAgICAgIGZvciAoZmluYWwgRmllbGQgZmllbGQgaW4gaW5zdGFuY2VCdWlsZGVyLmZpZWxkcy5rZXlzKSB7CiAgICAgICAgaWYgKGZpZWxkLm5hbWUgPT0gbm9kZS5uYW1lKSB7CiAgICAgICAgICByZXR1cm4gaW5zdGFuY2VCdWlsZGVyLmZpZWxkc1tmaWVsZF07CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXBvcnRJbnZhbGlkKG5vZGUsCiAgICAgICAgICAnQ291bGQgbm90IGV2YWx1YXRlIGZpZWxkIGdldCAke25vZGUubmFtZX0gb24gaW5jb21wbGV0ZSBpbnN0YW5jZScpOwogICAgfQoKICAgIGZpbmFsIENvbnN0YW50IHJlY2VpdmVyID0gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlLnJlY2VpdmVyKTsKICAgIGlmIChyZWNlaXZlciBpcyBTdHJpbmdDb25zdGFudCAmJiBub2RlLm5hbWUubmFtZSA9PSAnbGVuZ3RoJykgewogICAgICBpZiAodGFyZ2V0aW5nSmF2YVNjcmlwdCkgewogICAgICAgIHJldHVybiBjYW5vbmljYWxpemUobmV3IEphdmFTY3JpcHRJbnRDb25zdGFudChyZWNlaXZlci52YWx1ZS5sZW5ndGgpKTsKICAgICAgfQogICAgICByZXR1cm4gY2Fub25pY2FsaXplKG5ldyBJbnRDb25zdGFudChyZWNlaXZlci52YWx1ZS5sZW5ndGgpKTsKICAgIH0gZWxzZSBpZiAoc2hvdWxkQmVVbmV2YWx1YXRlZCkgewogICAgICByZXR1cm4gdW5ldmFsdWF0ZWQobm9kZSwKICAgICAgICAgIG5ldyBQcm9wZXJ0eUdldChleHRyYWN0KHJlY2VpdmVyKSwgbm9kZS5uYW1lLCBub2RlLmludGVyZmFjZVRhcmdldCkpOwogICAgfSBlbHNlIGlmIChyZWNlaXZlciBpcyBOdWxsQ29uc3RhbnQpIHsKICAgICAgcmV0dXJuIHJlcG9ydChub2RlLCBtZXNzYWdlQ29uc3RFdmFsTnVsbFZhbHVlKTsKICAgIH0KICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgbm9kZSwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRQcm9wZXJ0eUdldC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICBub2RlLm5hbWUubmFtZSwgcmVjZWl2ZXIpKTsKICB9CgogIHZpc2l0TGV0KExldCBub2RlKSB7CiAgICBlbnYuYWRkVmFyaWFibGVWYWx1ZSgKICAgICAgICBub2RlLnZhcmlhYmxlLCBfZXZhbHVhdGVTdWJleHByZXNzaW9uKG5vZGUudmFyaWFibGUuaW5pdGlhbGl6ZXIpKTsKICAgIHJldHVybiBfZXZhbHVhdGVTdWJleHByZXNzaW9uKG5vZGUuYm9keSk7CiAgfQoKICB2aXNpdFZhcmlhYmxlR2V0KFZhcmlhYmxlR2V0IG5vZGUpIHsKICAgIC8vIE5vdCBldmVyeSB2YXJpYWJsZSB3aGljaCBhIFtWYXJpYWJsZUdldF0gcmVmZXJzIHRvIG11c3QgYmUgbWFya2VkIGFzCiAgICAvLyBjb25zdGFudC4gIEZvciBleGFtcGxlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgYXMgd2VsbCBhcyBjb25zdHJ1Y3RzCiAgICAvLyBkZXN1Z2FyZWQgdG8gW0xldF0gZXhwcmVzc2lvbnMgYXJlIG9rLgogICAgLy8KICAgIC8vIFRPRE8oa3VzdGVybWFubik6IFRoZSBoZXVyaXN0aWMgb2YgYWxsb3dpbmcgYWxsIFtWYXJpYWJsZUdldF1zIG9uIFtMZXRdCiAgICAvLyB2YXJpYWJsZXMgbWlnaHQgYWxsb3cgbW9yZSB0aGFuIGl0IHNob3VsZC4KICAgIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSBub2RlLnZhcmlhYmxlOwogICAgaWYgKHZhcmlhYmxlLnBhcmVudCBpcyBMZXQgfHwgX2lzRm9ybWFsUGFyYW1ldGVyKHZhcmlhYmxlKSkgewogICAgICByZXR1cm4gZW52Lmxvb2t1cFZhcmlhYmxlKG5vZGUudmFyaWFibGUpID8/CiAgICAgICAgICByZXBvcnQoCiAgICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbE5vbkNvbnN0YW50VmFyaWFibGVHZXQKICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHModmFyaWFibGUubmFtZSkpOwogICAgfQogICAgaWYgKHZhcmlhYmxlLmlzQ29uc3QpIHsKICAgICAgcmV0dXJuIF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24odmFyaWFibGUuaW5pdGlhbGl6ZXIpOwogICAgfQogICAgcmV0dXJuIHJlcG9ydEludmFsaWQobm9kZSwgJ1ZhcmlhYmxlIGdldCBvZiBhIG5vbi1jb25zdCB2YXJpYWJsZS4nKTsKICB9CgogIHZpc2l0U3RhdGljR2V0KFN0YXRpY0dldCBub2RlKSB7CiAgICByZXR1cm4gd2l0aE5ld0Vudmlyb25tZW50KCgpIHsKICAgICAgZmluYWwgTWVtYmVyIHRhcmdldCA9IG5vZGUudGFyZ2V0OwogICAgICBpZiAodGFyZ2V0IGlzIEZpZWxkKSB7CiAgICAgICAgaWYgKHRhcmdldC5pc0NvbnN0KSB7CiAgICAgICAgICBpZiAodGFyZ2V0LmlzSW5FeHRlcm5hbExpYnJhcnkgJiYgdGFyZ2V0LmluaXRpYWxpemVyID09IG51bGwpIHsKICAgICAgICAgICAgLy8gVGhlIHZhcmlhYmxlIGlzIHVuYXZhaWxhYmxlIGR1ZSB0byBzZXBhcmF0ZSBjb21waWxhdGlvbi4KICAgICAgICAgICAgcmV0dXJuIHVuZXZhbHVhdGVkKG5vZGUsIG5ldyBTdGF0aWNHZXQodGFyZ2V0KSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcnVuSW5zaWRlQ29udGV4dCh0YXJnZXQsICgpIHsKICAgICAgICAgICAgcmV0dXJuIF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24odGFyZ2V0LmluaXRpYWxpemVyKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVwb3J0KAogICAgICAgICAgICBub2RlLAogICAgICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRTdGF0aWNJbnZvY2F0aW9uCiAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyh0YXJnZXQubmFtZS5uYW1lKSk7CiAgICAgIH0gZWxzZSBpZiAodGFyZ2V0IGlzIFByb2NlZHVyZSkgewogICAgICAgIGlmICh0YXJnZXQua2luZCA9PSBQcm9jZWR1cmVLaW5kLk1ldGhvZCkgewogICAgICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShuZXcgVGVhck9mZkNvbnN0YW50KHRhcmdldCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVwb3J0KAogICAgICAgICAgICBub2RlLAogICAgICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRTdGF0aWNJbnZvY2F0aW9uCiAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyh0YXJnZXQubmFtZS5uYW1lKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVwb3J0SW52YWxpZCgKICAgICAgICAgICAgbm9kZSwgJ05vIHN1cHBvcnQgZm9yICR7dGFyZ2V0LnJ1bnRpbWVUeXBlfSBpbiBhIHN0YXRpYy1nZXQuJyk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKFN0cmluZ0NvbmNhdGVuYXRpb24gbm9kZSkgewogICAgZmluYWwgTGlzdDxPYmplY3Q+IGNvbmNhdGVuYXRlZCA9IDxPYmplY3Q+W25ldyBTdHJpbmdCdWZmZXIoKV07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGUuZXhwcmVzc2lvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgQ29uc3RhbnQgY29uc3RhbnQgPSBfZXZhbHVhdGVTdWJleHByZXNzaW9uKG5vZGUuZXhwcmVzc2lvbnNbaV0pOwogICAgICBpZiAoY29uc3RhbnQgaXMgUHJpbWl0aXZlQ29uc3RhbnQ8T2JqZWN0PikgewogICAgICAgIFN0cmluZyB2YWx1ZSA9IGNvbnN0YW50LnRvU3RyaW5nKCk7CiAgICAgICAgT2JqZWN0IGxhc3QgPSBjb25jYXRlbmF0ZWQubGFzdDsKICAgICAgICBpZiAobGFzdCBpcyBTdHJpbmdCdWZmZXIpIHsKICAgICAgICAgIGxhc3Qud3JpdGUodmFsdWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25jYXRlbmF0ZWQuYWRkKG5ldyBTdHJpbmdCdWZmZXIodmFsdWUpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoc2hvdWxkQmVVbmV2YWx1YXRlZCkgewogICAgICAgIGNvbmNhdGVuYXRlZC5hZGQoY29uc3RhbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFN0cmluZ0ludGVycG9sYXRpb25PcGVyYW5kCiAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhjb25zdGFudCkpOwogICAgICB9CiAgICB9CiAgICBpZiAoY29uY2F0ZW5hdGVkLmxlbmd0aCA+IDEpIHsKICAgICAgZmluYWwgZXhwcmVzc2lvbnMgPSBuZXcgTGlzdDxFeHByZXNzaW9uPihjb25jYXRlbmF0ZWQubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25jYXRlbmF0ZWQubGVuZ3RoOyBpKyspIHsKICAgICAgICBPYmplY3QgdmFsdWUgPSBjb25jYXRlbmF0ZWRbaV07CiAgICAgICAgaWYgKHZhbHVlIGlzIFVuZXZhbHVhdGVkQ29uc3RhbnQpIHsKICAgICAgICAgIGV4cHJlc3Npb25zW2ldID0gZXh0cmFjdCh2YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGV4cHJlc3Npb25zW2ldID0gbmV3IENvbnN0YW50RXhwcmVzc2lvbigKICAgICAgICAgICAgICBjYW5vbmljYWxpemUobmV3IFN0cmluZ0NvbnN0YW50KHZhbHVlLnRvU3RyaW5nKCkpKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB1bmV2YWx1YXRlZChub2RlLCBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbihleHByZXNzaW9ucykpOwogICAgfQogICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShuZXcgU3RyaW5nQ29uc3RhbnQoY29uY2F0ZW5hdGVkLnNpbmdsZS50b1N0cmluZygpKSk7CiAgfQoKICB2aXNpdFN0YXRpY0ludm9jYXRpb24oU3RhdGljSW52b2NhdGlvbiBub2RlKSB7CiAgICBmaW5hbCBQcm9jZWR1cmUgdGFyZ2V0ID0gbm9kZS50YXJnZXQ7CiAgICBmaW5hbCBBcmd1bWVudHMgYXJndW1lbnRzID0gbm9kZS5hcmd1bWVudHM7CiAgICBmaW5hbCBwb3NpdGlvbmFscyA9IGV2YWx1YXRlUG9zaXRpb25hbEFyZ3VtZW50cyhhcmd1bWVudHMpOwogICAgZmluYWwgbmFtZWQgPSBldmFsdWF0ZU5hbWVkQXJndW1lbnRzKGFyZ3VtZW50cyk7CiAgICBpZiAoc2hvdWxkQmVVbmV2YWx1YXRlZCkgewogICAgICByZXR1cm4gdW5ldmFsdWF0ZWQoCiAgICAgICAgICBub2RlLAogICAgICAgICAgbmV3IFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgICAgICAgdGFyZ2V0LCB1bmV2YWx1YXRlZEFyZ3VtZW50cyhwb3NpdGlvbmFscywgbmFtZWQsIGFyZ3VtZW50cy50eXBlcyksCiAgICAgICAgICAgICAgaXNDb25zdDogdHJ1ZSkpOwogICAgfQogICAgaWYgKHRhcmdldC5raW5kID09IFByb2NlZHVyZUtpbmQuRmFjdG9yeSkgewogICAgICBpZiAodGFyZ2V0LmlzQ29uc3QgJiYKICAgICAgICAgIHRhcmdldC5uYW1lLm5hbWUgPT0gImZyb21FbnZpcm9ubWVudCIgJiYKICAgICAgICAgIHRhcmdldC5lbmNsb3NpbmdMaWJyYXJ5ID09IGNvcmVUeXBlcy5jb3JlTGlicmFyeSAmJgogICAgICAgICAgcG9zaXRpb25hbHMubGVuZ3RoID09IDEpIHsKICAgICAgICBpZiAoZW52aXJvbm1lbnREZWZpbmVzICE9IG51bGwpIHsKICAgICAgICAgIC8vIEV2YWx1YXRlIGVudmlyb25tZW50IGNvbnN0YW50LgogICAgICAgICAgQ29uc3RhbnQgbmFtZSA9IHBvc2l0aW9uYWxzLnNpbmdsZTsKICAgICAgICAgIGlmIChuYW1lIGlzIFN0cmluZ0NvbnN0YW50KSB7CiAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGVudmlyb25tZW50RGVmaW5lc1tuYW1lLnZhbHVlXTsKICAgICAgICAgICAgQ29uc3RhbnQgZGVmYXVsdFZhbHVlID0gbmFtZWRbImRlZmF1bHRWYWx1ZSJdOwoKICAgICAgICAgICAgaWYgKHRhcmdldC5lbmNsb3NpbmdDbGFzcyA9PSBjb3JlVHlwZXMuYm9vbENsYXNzKSB7CiAgICAgICAgICAgICAgQ29uc3RhbnQgYm9vbENvbnN0YW50ID0gdmFsdWUgPT0gInRydWUiCiAgICAgICAgICAgICAgICAgID8gdHJ1ZUNvbnN0YW50CiAgICAgICAgICAgICAgICAgIDogdmFsdWUgPT0gImZhbHNlIgogICAgICAgICAgICAgICAgICAgICAgPyBmYWxzZUNvbnN0YW50CiAgICAgICAgICAgICAgICAgICAgICA6IGRlZmF1bHRWYWx1ZSBpcyBCb29sQ29uc3RhbnQKICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1ha2VCb29sQ29uc3RhbnQoZGVmYXVsdFZhbHVlLnZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgIDogZGVmYXVsdFZhbHVlIGlzIE51bGxDb25zdGFudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGxDb25zdGFudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZhbHNlQ29uc3RhbnQ7CiAgICAgICAgICAgICAgcmV0dXJuIGJvb2xDb25zdGFudDsKICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQuZW5jbG9zaW5nQ2xhc3MgPT0gY29yZVR5cGVzLmludENsYXNzKSB7CiAgICAgICAgICAgICAgaW50IGludFZhbHVlID0gdmFsdWUgIT0gbnVsbCA/IGludC50cnlQYXJzZSh2YWx1ZSkgOiBudWxsOwogICAgICAgICAgICAgIGludFZhbHVlID8/PSBkZWZhdWx0VmFsdWUgaXMgSW50Q29uc3RhbnQKICAgICAgICAgICAgICAgICAgPyBkZWZhdWx0VmFsdWUudmFsdWUKICAgICAgICAgICAgICAgICAgOiBkZWZhdWx0VmFsdWUgaXMgSmF2YVNjcmlwdEludENvbnN0YW50CiAgICAgICAgICAgICAgICAgICAgICA/IGRlZmF1bHRWYWx1ZS5iaWdJbnRWYWx1ZS50b0ludCgpCiAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7CiAgICAgICAgICAgICAgaWYgKGludFZhbHVlID09IG51bGwpIHJldHVybiBudWxsQ29uc3RhbnQ7CiAgICAgICAgICAgICAgaWYgKHRhcmdldGluZ0phdmFTY3JpcHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYW5vbmljYWxpemUobmV3IEphdmFTY3JpcHRJbnRDb25zdGFudChpbnRWYWx1ZSkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKG5ldyBJbnRDb25zdGFudChpbnRWYWx1ZSkpOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldC5lbmNsb3NpbmdDbGFzcyA9PSBjb3JlVHlwZXMuc3RyaW5nQ2xhc3MpIHsKICAgICAgICAgICAgICB2YWx1ZSA/Pz0KICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlIGlzIFN0cmluZ0NvbnN0YW50ID8gZGVmYXVsdFZhbHVlLnZhbHVlIDogbnVsbDsKICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGxDb25zdGFudDsKICAgICAgICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKG5ldyBTdHJpbmdDb25zdGFudCh2YWx1ZSkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUgaXMgTnVsbENvbnN0YW50KSB7CiAgICAgICAgICAgIHJldHVybiByZXBvcnQobm9kZSwgbWVzc2FnZUNvbnN0RXZhbE51bGxWYWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIExlYXZlIGVudmlyb25tZW50IGNvbnN0YW50IHVuZXZhbHVhdGVkLgogICAgICAgICAgcmV0dXJuIHVuZXZhbHVhdGVkKAogICAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgICAgbmV3IFN0YXRpY0ludm9jYXRpb24odGFyZ2V0LAogICAgICAgICAgICAgICAgICB1bmV2YWx1YXRlZEFyZ3VtZW50cyhwb3NpdGlvbmFscywgbmFtZWQsIGFyZ3VtZW50cy50eXBlcyksCiAgICAgICAgICAgICAgICAgIGlzQ29uc3Q6IHRydWUpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodGFyZ2V0Lm5hbWUubmFtZSA9PSAnaWRlbnRpY2FsJykgewogICAgICAvLyBFbnN1cmUgdGhlICJpZGVudGljYWwoKSIgZnVuY3Rpb24gY29tZXMgZnJvbSBkYXJ0OmNvcmUuCiAgICAgIGZpbmFsIHBhcmVudCA9IHRhcmdldC5wYXJlbnQ7CiAgICAgIGlmIChwYXJlbnQgaXMgTGlicmFyeSAmJiBwYXJlbnQgPT0gY29yZVR5cGVzLmNvcmVMaWJyYXJ5KSB7CiAgICAgICAgZmluYWwgQ29uc3RhbnQgbGVmdCA9IHBvc2l0aW9uYWxzWzBdOwogICAgICAgIGZpbmFsIENvbnN0YW50IHJpZ2h0ID0gcG9zaXRpb25hbHNbMV07CgogICAgICAgIGlmICh0YXJnZXRpbmdKYXZhU2NyaXB0KSB7CiAgICAgICAgICAvLyBJbiBKYXZhU2NyaXB0LCB3ZSBsb3dlciBbaWRlbnRpY2FsXSB0byBgPT09YCwgc28gYW55IGNvbXBhcmlzb24KICAgICAgICAgIC8vIGFnYWluc3QgTmFOIHlpZWxkcyBgZmFsc2VgLgogICAgICAgICAgaWYgKGlzTmFOKGxlZnQpIHx8IGlzTmFOKHJpZ2h0KSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2VDb25zdGFudDsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBJbiBKYXZhU2NyaXB0LCBgLTAuMCA9PT0gMC4wYC4KICAgICAgICAgIGlmIChpc1plcm8obGVmdCkpIHsKICAgICAgICAgICAgcmV0dXJuIG1ha2VCb29sQ29uc3RhbnQoaXNaZXJvKHJpZ2h0KSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBTaW5jZSB3ZSBjYW5vbmljYWxpemUgY29uc3RhbnRzIGR1cmluZyB0aGUgZXZhbHVhdGlvbiwgd2UgY2FuIHVzZQogICAgICAgIC8vIGlkZW50aWNhbCBoZXJlLgogICAgICAgIHJldHVybiBtYWtlQm9vbENvbnN0YW50KGlkZW50aWNhbChsZWZ0LCByaWdodCkpOwogICAgICB9CiAgICB9CgogICAgLy8gVE9ETyhrbWlsbGlraW4pIEZvciBhbiBpbnZhbGlkIGZhY3RvcnkgaW52b2NhdGlvbiB3ZSBzaG91bGQgYWRvcHQgYQogICAgLy8gYmV0dGVyIG1lc3NhZ2UuICBUaGlzIHdpbGwgc2hvdyBzb21ldGhpbmcgbGlrZToKICAgIC8vCiAgICAvLyAiVGhlIGludm9jYXRpb24gb2YgJ0xpc3QnIGlzIG5vdCBhbGxvd2VkIHdpdGhpbiBhIGNvbnN0IGNvbnRleHQuIgogICAgLy8KICAgIC8vIFdoaWNoIGlzIG5vdCBxdWl0ZSByaWdodCB3aGVuIHRoZSBjb2RlIHdhcyAibmV3IExpc3QoKSIuCiAgICBTdHJpbmcgbmFtZSA9IHRhcmdldC5uYW1lLm5hbWU7CiAgICBpZiAodGFyZ2V0IGlzIFByb2NlZHVyZSAmJiB0YXJnZXQuaXNGYWN0b3J5KSB7CiAgICAgIGlmIChuYW1lLmlzRW1wdHkpIHsKICAgICAgICBuYW1lID0gdGFyZ2V0LmVuY2xvc2luZ0NsYXNzLm5hbWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbmFtZSA9ICcke3RhcmdldC5lbmNsb3NpbmdDbGFzcy5uYW1lfS4ke25hbWV9JzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlcG9ydCgKICAgICAgICBub2RlLCB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRTdGF0aWNJbnZvY2F0aW9uLndpdGhBcmd1bWVudHMobmFtZSkpOwogIH0KCiAgdmlzaXRBc0V4cHJlc3Npb24oQXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIGZpbmFsIENvbnN0YW50IGNvbnN0YW50ID0gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlLm9wZXJhbmQpOwogICAgaWYgKHNob3VsZEJlVW5ldmFsdWF0ZWQpIHsKICAgICAgcmV0dXJuIHVuZXZhbHVhdGVkKG5vZGUsIG5ldyBBc0V4cHJlc3Npb24oZXh0cmFjdChjb25zdGFudCksIG5vZGUudHlwZSkpOwogICAgfQogICAgcmV0dXJuIGVuc3VyZUlzU3VidHlwZShjb25zdGFudCwgZXZhbHVhdGVEYXJ0VHlwZShub2RlLCBub2RlLnR5cGUpLCBub2RlKTsKICB9CgogIHZpc2l0SXNFeHByZXNzaW9uKElzRXhwcmVzc2lvbiBub2RlKSB7CiAgICBmaW5hbCBDb25zdGFudCBjb25zdGFudCA9IG5vZGUub3BlcmFuZC5hY2NlcHQodGhpcyk7CiAgICBpZiAoc2hvdWxkQmVVbmV2YWx1YXRlZCkgewogICAgICByZXR1cm4gdW5ldmFsdWF0ZWQobm9kZSwgbmV3IElzRXhwcmVzc2lvbihleHRyYWN0KGNvbnN0YW50KSwgbm9kZS50eXBlKSk7CiAgICB9CiAgICBpZiAoY29uc3RhbnQgaXMgTnVsbENvbnN0YW50KSB7CiAgICAgIHJldHVybiBtYWtlQm9vbENvbnN0YW50KG5vZGUudHlwZSA9PSB0eXBlRW52aXJvbm1lbnQubnVsbFR5cGUgfHwKICAgICAgICAgIG5vZGUudHlwZSA9PSB0eXBlRW52aXJvbm1lbnQub2JqZWN0VHlwZSB8fAogICAgICAgICAgbm9kZS50eXBlIGlzIER5bmFtaWNUeXBlKTsKICAgIH0KICAgIHJldHVybiBtYWtlQm9vbENvbnN0YW50KAogICAgICAgIGlzU3VidHlwZShjb25zdGFudCwgZXZhbHVhdGVEYXJ0VHlwZShub2RlLCBub2RlLnR5cGUpKSk7CiAgfQoKICB2aXNpdE5vdChOb3Qgbm9kZSkgewogICAgZmluYWwgQ29uc3RhbnQgY29uc3RhbnQgPSBfZXZhbHVhdGVTdWJleHByZXNzaW9uKG5vZGUub3BlcmFuZCk7CiAgICBpZiAoY29uc3RhbnQgaXMgQm9vbENvbnN0YW50KSB7CiAgICAgIHJldHVybiBtYWtlQm9vbENvbnN0YW50KGNvbnN0YW50ICE9IHRydWVDb25zdGFudCk7CiAgICB9CiAgICBpZiAoc2hvdWxkQmVVbmV2YWx1YXRlZCkgewogICAgICByZXR1cm4gdW5ldmFsdWF0ZWQobm9kZSwgbmV3IE5vdChleHRyYWN0KGNvbnN0YW50KSkpOwogICAgfQogICAgcmV0dXJuIHJlcG9ydCgKICAgICAgICBub2RlLAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFR5cGUud2l0aEFyZ3VtZW50cyhjb25zdGFudCwKICAgICAgICAgICAgdHlwZUVudmlyb25tZW50LmJvb2xUeXBlLCBjb25zdGFudC5nZXRUeXBlKHR5cGVFbnZpcm9ubWVudCkpKTsKICB9CgogIHZpc2l0U3ltYm9sTGl0ZXJhbChTeW1ib2xMaXRlcmFsIG5vZGUpIHsKICAgIGZpbmFsIGxpYnJhcnlSZWZlcmVuY2UgPQogICAgICAgIG5vZGUudmFsdWUuc3RhcnRzV2l0aCgnXycpID8gbGlicmFyeU9mKG5vZGUpLnJlZmVyZW5jZSA6IG51bGw7CiAgICByZXR1cm4gY2Fub25pY2FsaXplKG5ldyBTeW1ib2xDb25zdGFudChub2RlLnZhbHVlLCBsaWJyYXJ5UmVmZXJlbmNlKSk7CiAgfQoKICB2aXNpdEluc3RhbnRpYXRpb24oSW5zdGFudGlhdGlvbiBub2RlKSB7CiAgICBmaW5hbCBDb25zdGFudCBjb25zdGFudCA9IF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKTsKICAgIGlmIChzaG91bGRCZVVuZXZhbHVhdGVkKSB7CiAgICAgIHJldHVybiB1bmV2YWx1YXRlZCgKICAgICAgICAgIG5vZGUsIG5ldyBJbnN0YW50aWF0aW9uKGV4dHJhY3QoY29uc3RhbnQpLCBub2RlLnR5cGVBcmd1bWVudHMpKTsKICAgIH0KICAgIGlmIChjb25zdGFudCBpcyBUZWFyT2ZmQ29uc3RhbnQpIHsKICAgICAgaWYgKG5vZGUudHlwZUFyZ3VtZW50cy5sZW5ndGggPT0KICAgICAgICAgIGNvbnN0YW50LnByb2NlZHVyZS5mdW5jdGlvbi50eXBlUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgICBmaW5hbCB0eXBlQXJndW1lbnRzID0gZXZhbHVhdGVEYXJ0VHlwZXMobm9kZSwgbm9kZS50eXBlQXJndW1lbnRzKTsKICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKAogICAgICAgICAgICBuZXcgUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudChjb25zdGFudCwgdHlwZUFyZ3VtZW50cykpOwogICAgICB9CiAgICAgIHJldHVybiByZXBvcnRJbnZhbGlkKAogICAgICAgICAgbm9kZSwKICAgICAgICAgICdUaGUgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzIHN1cHBsaWVkIGluIHRoZSBwYXJ0aWFsIGluc3RhbnRpYXRpb24gJwogICAgICAgICAgJ2RvZXMgbm90IG1hdGNoIHRoZSBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMgb2YgdGhlICRjb25zdGFudC4nKTsKICAgIH0KICAgIC8vIFRoZSBpbm5lciBleHByZXNzaW9uIGluIGFuIGluc3RhbnRpYXRpb24gY2FuIG5ldmVyIGJlIG51bGwsIHNpbmNlCiAgICAvLyBpbnN0YW50aWF0aW9ucyBhcmUgb25seSBpbmZlcnJlZCBvbiBkaXJlY3QgcmVmZXJlbmNlcyB0byBkZWNsYXJhdGlvbnMuCiAgICByZXR1cm4gcmVwb3J0SW52YWxpZCgKICAgICAgICBub2RlLCAnT25seSB0ZWFyLW9mZiBjb25zdGFudHMgY2FuIGJlIHBhcnRpYWxseSBpbnN0YW50aWF0ZWQuJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENoZWNrTGlicmFyeUlzTG9hZGVkKENoZWNrTGlicmFyeUlzTG9hZGVkIG5vZGUpIHsKICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgbm9kZSwgdGVtcGxhdGVDb25zdEV2YWxEZWZlcnJlZExpYnJhcnkud2l0aEFyZ3VtZW50cyhub2RlLmltcG9ydC5uYW1lKSk7CiAgfQoKICAvLyBIZWxwZXIgbWV0aG9kczoKCiAgYm9vbCBpc1plcm8oQ29uc3RhbnQgdmFsdWUpID0+CiAgICAgICh2YWx1ZSBpcyBJbnRDb25zdGFudCAmJiB2YWx1ZS52YWx1ZSA9PSAwKSB8fAogICAgICAodmFsdWUgaXMgSmF2YVNjcmlwdEludENvbnN0YW50ICYmIHZhbHVlLmJpZ0ludFZhbHVlID09IEJpZ0ludC56ZXJvKSB8fAogICAgICAodmFsdWUgaXMgRG91YmxlQ29uc3RhbnQgJiYgdmFsdWUudmFsdWUgPT0gMCk7CgogIGJvb2wgaXNOYU4oQ29uc3RhbnQgdmFsdWUpID0+IHZhbHVlIGlzIERvdWJsZUNvbnN0YW50ICYmIHZhbHVlLnZhbHVlLmlzTmFOOwoKICBib29sIGhhc1ByaW1pdGl2ZUVxdWFsKENvbnN0YW50IGNvbnN0YW50KSB7CiAgICAvLyBUT0RPKGFza2VzYywgZmlzaHl0aGVmaXNoKTogTWFrZSBzdXJlIHRoZSBjb3JyZWN0IGNsYXNzIGlzIGluZmVycmVkCiAgICAvLyB3aGVuIHdlIGNsZWFuIHVwIEphdmFTY3JpcHQgaW50IGNvbnN0YW50IGhhbmRsaW5nLgogICAgRGFydFR5cGUgdHlwZSA9IGNvbnN0YW50LmdldFR5cGUodHlwZUVudmlyb25tZW50KTsKICAgIHJldHVybiAhKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJiAhY2xhc3NIYXNQcmltaXRpdmVFcXVhbCh0eXBlLmNsYXNzTm9kZSkpOwogIH0KCiAgYm9vbCBjbGFzc0hhc1ByaW1pdGl2ZUVxdWFsKENsYXNzIGtsYXNzKSB7CiAgICBib29sIGNhY2hlZCA9IHByaW1pdGl2ZUVxdWFsQ2FjaGVba2xhc3NdOwogICAgaWYgKGNhY2hlZCAhPSBudWxsKSByZXR1cm4gY2FjaGVkOwogICAgZm9yIChQcm9jZWR1cmUgcHJvY2VkdXJlIGluIGtsYXNzLnByb2NlZHVyZXMpIHsKICAgICAgaWYgKHByb2NlZHVyZS5raW5kID09IFByb2NlZHVyZUtpbmQuT3BlcmF0b3IgJiYKICAgICAgICAgIHByb2NlZHVyZS5uYW1lLm5hbWUgPT0gJz09JyAmJgogICAgICAgICAgIXByb2NlZHVyZS5pc0Fic3RyYWN0ICYmCiAgICAgICAgICAhcHJvY2VkdXJlLmlzRm9yd2FyZGluZ1N0dWIpIHsKICAgICAgICByZXR1cm4gcHJpbWl0aXZlRXF1YWxDYWNoZVtrbGFzc10gPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKGtsYXNzLnN1cGVydHlwZSA9PSBudWxsKSByZXR1cm4gdHJ1ZTsgLy8gVG8gYmUgb24gdGhlIHNhZmUgc2lkZQogICAgcmV0dXJuIHByaW1pdGl2ZUVxdWFsQ2FjaGVba2xhc3NdID0KICAgICAgICBjbGFzc0hhc1ByaW1pdGl2ZUVxdWFsKGtsYXNzLnN1cGVydHlwZS5jbGFzc05vZGUpOwogIH0KCiAgQm9vbENvbnN0YW50IG1ha2VCb29sQ29uc3RhbnQoYm9vbCB2YWx1ZSkgPT4KICAgICAgdmFsdWUgPyB0cnVlQ29uc3RhbnQgOiBmYWxzZUNvbnN0YW50OwoKICBEb3VibGVDb25zdGFudCBtYWtlRG91YmxlQ29uc3RhbnQoZG91YmxlIHZhbHVlKSB7CiAgICBpZiAodGFyZ2V0aW5nSmF2YVNjcmlwdCkgewogICAgICAvLyBDb252ZXJ0IHRvIGFuIGludGVnZXIgd2hlbiBwb3NzaWJsZSAobWF0Y2hpbmcgdGhlIHJ1bnRpbWUgYmVoYXZpb3IKICAgICAgLy8gb2YgYGlzIGludGApLgogICAgICBpZiAodmFsdWUuaXNGaW5pdGUgJiYgIWlkZW50aWNhbCh2YWx1ZSwgLTAuMCkpIHsKICAgICAgICB2YXIgaSA9IHZhbHVlLnRvSW50KCk7CiAgICAgICAgaWYgKHZhbHVlID09IGkudG9Eb3VibGUoKSkgcmV0dXJuIG5ldyBKYXZhU2NyaXB0SW50Q29uc3RhbnQoaSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgRG91YmxlQ29uc3RhbnQodmFsdWUpOwogIH0KCiAgYm9vbCBpc1N1YnR5cGUoQ29uc3RhbnQgY29uc3RhbnQsIERhcnRUeXBlIHR5cGUpIHsKICAgIERhcnRUeXBlIGNvbnN0YW50VHlwZSA9IGNvbnN0YW50LmdldFR5cGUodHlwZUVudmlyb25tZW50KTsKICAgIGlmICh0YXJnZXRpbmdKYXZhU2NyaXB0KSB7CiAgICAgIGlmIChjb25zdGFudFR5cGUgPT0gdHlwZUVudmlyb25tZW50LmludFR5cGUgJiYKICAgICAgICAgIHR5cGUgPT0gdHlwZUVudmlyb25tZW50LmRvdWJsZVR5cGUpIHsKICAgICAgICAvLyBXaXRoIEpTIHNlbWFudGljcywgYW4gaW50ZWdlciBpcyBhbHNvIGEgZG91YmxlLgogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICBpZiAoY29uc3RhbnRUeXBlID09IHR5cGVFbnZpcm9ubWVudC5kb3VibGVUeXBlICYmCiAgICAgICAgICB0eXBlID09IHR5cGVFbnZpcm9ubWVudC5pbnRUeXBlKSB7CiAgICAgICAgZG91YmxlIHZhbHVlID0gKGNvbnN0YW50IGFzIERvdWJsZUNvbnN0YW50KS52YWx1ZTsKICAgICAgICBpZiAodmFsdWUuaXNGaW5pdGUgJiYgdmFsdWUgPT0gdmFsdWUudHJ1bmNhdGVUb0RvdWJsZSgpKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0eXBlRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoY29uc3RhbnRUeXBlLCB0eXBlKTsKICB9CgogIENvbnN0YW50IGVuc3VyZUlzU3VidHlwZShDb25zdGFudCBjb25zdGFudCwgRGFydFR5cGUgdHlwZSwgVHJlZU5vZGUgbm9kZSkgewogICAgaWYgKCFpc1N1YnR5cGUoY29uc3RhbnQsIHR5cGUpKSB7CiAgICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgICBub2RlLAogICAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkVHlwZS53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgIGNvbnN0YW50LCB0eXBlLCBjb25zdGFudC5nZXRUeXBlKHR5cGVFbnZpcm9ubWVudCkpKTsKICAgIH0KICAgIHJldHVybiBjb25zdGFudDsKICB9CgogIExpc3Q8RGFydFR5cGU+IGV2YWx1YXRlVHlwZUFyZ3VtZW50cyhUcmVlTm9kZSBub2RlLCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gZXZhbHVhdGVEYXJ0VHlwZXMobm9kZSwgYXJndW1lbnRzLnR5cGVzKTsKICB9CgogIExpc3Q8RGFydFR5cGU+IGV2YWx1YXRlU3VwZXJUeXBlQXJndW1lbnRzKFRyZWVOb2RlIG5vZGUsIFN1cGVydHlwZSB0eXBlKSB7CiAgICByZXR1cm4gZXZhbHVhdGVEYXJ0VHlwZXMobm9kZSwgdHlwZS50eXBlQXJndW1lbnRzKTsKICB9CgogIExpc3Q8RGFydFR5cGU+IGV2YWx1YXRlRGFydFR5cGVzKFRyZWVOb2RlIG5vZGUsIExpc3Q8RGFydFR5cGU+IHR5cGVzKSB7CiAgICAvLyBUT0RPOiBPbmNlIHRoZSBmcm9udGVuZCBndXJhbnRlZXMgdGhhdCB0aGVyZSBhcmUgbm8gZnJlZSB0eXBlIHZhcmlhYmxlcwogICAgLy8gbGVmdCBvdmVyIGFmdGVyIHN0dWJzdGl0dXRpb24sIHdlIGNhbiBlbmFibGUgdGhpcyBzaG9ydGN1dCBhZ2FpbjoKICAgIC8vIGlmIChlbnYuaXNFbXB0eSkgcmV0dXJuIHR5cGVzOwogICAgcmV0dXJuIHR5cGVzLm1hcCgodCkgPT4gZXZhbHVhdGVEYXJ0VHlwZShub2RlLCB0KSkudG9MaXN0KCk7CiAgfQoKICBEYXJ0VHlwZSBldmFsdWF0ZURhcnRUeXBlKFRyZWVOb2RlIG5vZGUsIERhcnRUeXBlIHR5cGUpIHsKICAgIGZpbmFsIHJlc3VsdCA9IGVudi5zdWJzaXR1dGVUeXBlKHR5cGUpOwoKICAgIGlmICghaXNJbnN0YW50aWF0ZWQocmVzdWx0KSkgewogICAgICByZXR1cm4gcmVwb3J0KAogICAgICAgICAgbm9kZSwgdGVtcGxhdGVDb25zdEV2YWxGcmVlVHlwZVBhcmFtZXRlci53aXRoQXJndW1lbnRzKHR5cGUpKTsKICAgIH0KCiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgTGlzdDxDb25zdGFudD4gZXZhbHVhdGVQb3NpdGlvbmFsQXJndW1lbnRzKEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBhcmd1bWVudHMucG9zaXRpb25hbC5tYXAoKEV4cHJlc3Npb24gbm9kZSkgewogICAgICByZXR1cm4gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlKTsKICAgIH0pLnRvTGlzdCgpOwogIH0KCiAgTWFwPFN0cmluZywgQ29uc3RhbnQ+IGV2YWx1YXRlTmFtZWRBcmd1bWVudHMoQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgaWYgKGFyZ3VtZW50cy5uYW1lZC5pc0VtcHR5KSByZXR1cm4gY29uc3QgPFN0cmluZywgQ29uc3RhbnQ+e307CgogICAgZmluYWwgTWFwPFN0cmluZywgQ29uc3RhbnQ+IG5hbWVkID0ge307CiAgICBhcmd1bWVudHMubmFtZWQuZm9yRWFjaCgoTmFtZWRFeHByZXNzaW9uIHBhaXIpIHsKICAgICAgbmFtZWRbcGFpci5uYW1lXSA9IF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24ocGFpci52YWx1ZSk7CiAgICB9KTsKICAgIHJldHVybiBuYW1lZDsKICB9CgogIEFyZ3VtZW50cyB1bmV2YWx1YXRlZEFyZ3VtZW50cyhMaXN0PENvbnN0YW50PiBwb3NpdGlvbmFsQXJncywKICAgICAgTWFwPFN0cmluZywgQ29uc3RhbnQ+IG5hbWVkQXJncywgTGlzdDxEYXJ0VHlwZT4gdHlwZXMpIHsKICAgIGZpbmFsIHBvc2l0aW9uYWwgPSBuZXcgTGlzdDxFeHByZXNzaW9uPihwb3NpdGlvbmFsQXJncy5sZW5ndGgpOwogICAgZmluYWwgbmFtZWQgPSBuZXcgTGlzdDxOYW1lZEV4cHJlc3Npb24+KG5hbWVkQXJncy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3NpdGlvbmFsQXJncy5sZW5ndGg7ICsraSkgewogICAgICBwb3NpdGlvbmFsW2ldID0gZXh0cmFjdChwb3NpdGlvbmFsQXJnc1tpXSk7CiAgICB9CiAgICBpbnQgaSA9IDA7CiAgICBuYW1lZEFyZ3MuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIENvbnN0YW50IHZhbHVlKSB7CiAgICAgIG5hbWVkW2krK10gPSBuZXcgTmFtZWRFeHByZXNzaW9uKG5hbWUsIGV4dHJhY3QodmFsdWUpKTsKICAgIH0pOwogICAgcmV0dXJuIG5ldyBBcmd1bWVudHMocG9zaXRpb25hbCwgbmFtZWQ6IG5hbWVkLCB0eXBlczogdHlwZXMpOwogIH0KCiAgQ29uc3RhbnQgY2Fub25pY2FsaXplKENvbnN0YW50IGNvbnN0YW50KSB7CiAgICByZXR1cm4gY2Fub25pY2FsaXphdGlvbkNhY2hlLnB1dElmQWJzZW50KGNvbnN0YW50LCAoKSA9PiBjb25zdGFudCk7CiAgfQoKICB3aXRoTmV3SW5zdGFuY2VCdWlsZGVyKENsYXNzIGtsYXNzLCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzLCBmbigpKSB7CiAgICBJbnN0YW5jZUJ1aWxkZXIgb2xkID0gaW5zdGFuY2VCdWlsZGVyOwogICAgdHJ5IHsKICAgICAgaW5zdGFuY2VCdWlsZGVyID0gbmV3IEluc3RhbmNlQnVpbGRlcih0aGlzLCBrbGFzcywgdHlwZUFyZ3VtZW50cyk7CiAgICAgIHJldHVybiBmbigpOwogICAgfSBmaW5hbGx5IHsKICAgICAgaW5zdGFuY2VCdWlsZGVyID0gb2xkOwogICAgfQogIH0KCiAgd2l0aE5ld0Vudmlyb25tZW50KGZuKCkpIHsKICAgIGZpbmFsIEV2YWx1YXRpb25FbnZpcm9ubWVudCBvbGRFbnYgPSBlbnY7CiAgICB0cnkgewogICAgICBlbnYgPSBuZXcgRXZhbHVhdGlvbkVudmlyb25tZW50KCk7CiAgICAgIHJldHVybiBmbigpOwogICAgfSBmaW5hbGx5IHsKICAgICAgZW52ID0gb2xkRW52OwogICAgfQogIH0KCiAgQ29uc3RhbnQgZXZhbHVhdGVCaW5hcnlCaXRPcGVyYXRpb24oU3RyaW5nIG9wLCBpbnQgYSwgaW50IGIsIFRyZWVOb2RlIG5vZGUpIHsKICAgIGludCByZXN1bHQ7CiAgICBzd2l0Y2ggKG9wKSB7CiAgICAgIGNhc2UgJ3wnOgogICAgICAgIHJlc3VsdCA9IGEgfCBiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICcmJzoKICAgICAgICByZXN1bHQgPSBhICYgYjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnXic6CiAgICAgICAgcmVzdWx0ID0gYSBeIGI7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgaWYgKHRhcmdldGluZ0phdmFTY3JpcHQpIHsKICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShuZXcgSmF2YVNjcmlwdEludENvbnN0YW50KHJlc3VsdCkpOwogICAgfQogICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShuZXcgSW50Q29uc3RhbnQocmVzdWx0KSk7CiAgfQoKICBDb25zdGFudCBldmFsdWF0ZUJpbmFyeVNoaWZ0T3BlcmF0aW9uKFN0cmluZyBvcCwgaW50IGEsIGludCBiLCBUcmVlTm9kZSBub2RlLAogICAgICB7bmVnYXRpdmVSZWNlaXZlcjogZmFsc2V9KSB7CiAgICBpbnQgcmVzdWx0OwogICAgc3dpdGNoIChvcCkgewogICAgICBjYXNlICc8PCc6CiAgICAgICAgcmVzdWx0ID0gYSA8PCBiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICc+Pic6CiAgICAgICAgaWYgKHRhcmdldGluZ0phdmFTY3JpcHQpIHsKICAgICAgICAgIGlmIChuZWdhdGl2ZVJlY2VpdmVyKSB7CiAgICAgICAgICAgIGNvbnN0IHNpZ25CaXQgPSAweDgwMDAwMDAwOwogICAgICAgICAgICBhIC09IChhICYgc2lnbkJpdCkgPDwgMTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc3VsdCA9IGEgPj4gYjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzdWx0ID0gYSA+PiBiOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAnPj4+JzoKICAgICAgICAvLyBUT0RPKGZpc2h5dGhlZmlzaCk6IEltcGxlbWVudCBKUyBzZW1hbnRpY3MgZm9yIGA+Pj5gLgogICAgICAgIHJlc3VsdCA9IGIgPj0gNjQgPyAwIDogKGEgPj4gYikgJiAoKDEgPDwgKDY0IC0gYikpIC0gMSk7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgaWYgKHRhcmdldGluZ0phdmFTY3JpcHQpIHsKICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShuZXcgSmF2YVNjcmlwdEludENvbnN0YW50KHJlc3VsdC50b1Vuc2lnbmVkKDMyKSkpOwogICAgfQogICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShuZXcgSW50Q29uc3RhbnQocmVzdWx0KSk7CiAgfQoKICBDb25zdGFudCBldmFsdWF0ZUJpbmFyeU51bWVyaWNPcGVyYXRpb24oCiAgICAgIFN0cmluZyBvcCwgbnVtIGEsIG51bSBiLCBUcmVlTm9kZSBub2RlKSB7CiAgICBudW0gcmVzdWx0OwogICAgc3dpdGNoIChvcCkgewogICAgICBjYXNlICcrJzoKICAgICAgICByZXN1bHQgPSBhICsgYjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnLSc6CiAgICAgICAgcmVzdWx0ID0gYSAtIGI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJyonOgogICAgICAgIHJlc3VsdCA9IGEgKiBiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICcvJzoKICAgICAgICByZXN1bHQgPSBhIC8gYjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnfi8nOgogICAgICAgIHJlc3VsdCA9IGEgfi8gYjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnJSc6CiAgICAgICAgcmVzdWx0ID0gYSAlIGI7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgaWYgKHJlc3VsdCBpcyBpbnQpIHsKICAgICAgaWYgKHRhcmdldGluZ0phdmFTY3JpcHQpIHsKICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKG5ldyBKYXZhU2NyaXB0SW50Q29uc3RhbnQocmVzdWx0KSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShuZXcgSW50Q29uc3RhbnQocmVzdWx0LnRvU2lnbmVkKDY0KSkpOwogICAgfQogICAgaWYgKHJlc3VsdCBpcyBkb3VibGUpIHsKICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShtYWtlRG91YmxlQ29uc3RhbnQocmVzdWx0KSk7CiAgICB9CgogICAgc3dpdGNoIChvcCkgewogICAgICBjYXNlICc8JzoKICAgICAgICByZXR1cm4gbWFrZUJvb2xDb25zdGFudChhIDwgYik7CiAgICAgIGNhc2UgJzw9JzoKICAgICAgICByZXR1cm4gbWFrZUJvb2xDb25zdGFudChhIDw9IGIpOwogICAgICBjYXNlICc+PSc6CiAgICAgICAgcmV0dXJuIG1ha2VCb29sQ29uc3RhbnQoYSA+PSBiKTsKICAgICAgY2FzZSAnPic6CiAgICAgICAgcmV0dXJuIG1ha2VCb29sQ29uc3RhbnQoYSA+IGIpOwogICAgfQoKICAgIHJldHVybiByZXBvcnRJbnZhbGlkKG5vZGUsICJVbmV4cGVjdGVkIGJpbmFyeSBudW1lcmljIG9wZXJhdGlvbiAnJG9wJy4iKTsKICB9CgogIExpYnJhcnkgbGlicmFyeU9mKFRyZWVOb2RlIG5vZGUpIHsKICAgIC8vIFRoZSB0cmVlIHN0cnVjdHVyZSBvZiB0aGUga2VybmVsIEFTVCBlbnN1cmVzIHdlIGFsd2F5cyBoYXZlIGFuIGVuY2xvc2luZwogICAgLy8gbGlicmFyeS4KICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmIChub2RlIGlzIExpYnJhcnkpIHJldHVybiBub2RlOwogICAgICBub2RlID0gbm9kZS5wYXJlbnQ7CiAgICB9CiAgfQp9CgovLy8gSG9sZHMgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3IgYSBjb25zdGFudCBvYmplY3QsIG5hbWVseQovLy8gICAqIHRoZSBba2xhc3NdIGJlaW5nIGluc3RhbnRpYXRlZAovLy8gICAqIHRoZSBbdHlwZUFyZ3VtZW50c10gdXNlZCBmb3IgdGhlIGluc3RhbnRpYXRpb24KLy8vICAgKiB0aGUgW2ZpZWxkc10gdGhlIGluc3RhbmNlIHdpbGwgb2J0YWluIChhbGwgZmllbGRzIGZyb20gdGhlCi8vLyAgICAgaW5zdGFudGlhdGVkIFtrbGFzc10gdXAgdG8gdGhlIFtPYmplY3RdIGtsYXNzKS4KY2xhc3MgSW5zdGFuY2VCdWlsZGVyIHsKICBDb25zdGFudEV2YWx1YXRvciBldmFsdWF0b3I7CgogIC8vLyBUaGUgY2xhc3Mgb2YgdGhlIG5ldyBpbnN0YW5jZS4KICBmaW5hbCBDbGFzcyBrbGFzczsKCiAgLy8vIFRoZSB2YWx1ZXMgb2YgdGhlIHR5cGUgcGFyYW1ldGVycyBvZiB0aGUgbmV3IGluc3RhbmNlLgogIGZpbmFsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHM7CgogIC8vLyBUaGUgZmllbGQgdmFsdWVzIG9mIHRoZSBuZXcgaW5zdGFuY2UuCiAgZmluYWwgTWFwPEZpZWxkLCBDb25zdGFudD4gZmllbGRzID0gPEZpZWxkLCBDb25zdGFudD57fTsKCiAgZmluYWwgTGlzdDxBc3NlcnRTdGF0ZW1lbnQ+IGFzc2VydHMgPSA8QXNzZXJ0U3RhdGVtZW50PltdOwoKICBJbnN0YW5jZUJ1aWxkZXIodGhpcy5ldmFsdWF0b3IsIHRoaXMua2xhc3MsIHRoaXMudHlwZUFyZ3VtZW50cyk7CgogIHZvaWQgc2V0RmllbGRWYWx1ZShGaWVsZCBmaWVsZCwgQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIGZpZWxkc1tmaWVsZF0gPSBjb25zdGFudDsKICB9CgogIEluc3RhbmNlQ29uc3RhbnQgYnVpbGRJbnN0YW5jZSgpIHsKICAgIGFzc2VydChhc3NlcnRzLmlzRW1wdHkpOwogICAgZmluYWwgTWFwPFJlZmVyZW5jZSwgQ29uc3RhbnQ+IGZpZWxkVmFsdWVzID0gPFJlZmVyZW5jZSwgQ29uc3RhbnQ+e307CiAgICBmaWVsZHMuZm9yRWFjaCgoRmllbGQgZmllbGQsIENvbnN0YW50IHZhbHVlKSB7CiAgICAgIGFzc2VydCh2YWx1ZSBpcyEgVW5ldmFsdWF0ZWRDb25zdGFudCk7CiAgICAgIGZpZWxkVmFsdWVzW2ZpZWxkLnJlZmVyZW5jZV0gPSB2YWx1ZTsKICAgIH0pOwogICAgcmV0dXJuIG5ldyBJbnN0YW5jZUNvbnN0YW50KGtsYXNzLnJlZmVyZW5jZSwgdHlwZUFyZ3VtZW50cywgZmllbGRWYWx1ZXMpOwogIH0KCiAgSW5zdGFuY2VDcmVhdGlvbiBidWlsZFVuZXZhbHVhdGVkSW5zdGFuY2UoKSB7CiAgICBmaW5hbCBNYXA8UmVmZXJlbmNlLCBFeHByZXNzaW9uPiBmaWVsZFZhbHVlcyA9IDxSZWZlcmVuY2UsIEV4cHJlc3Npb24+e307CiAgICBmaWVsZHMuZm9yRWFjaCgoRmllbGQgZmllbGQsIENvbnN0YW50IHZhbHVlKSB7CiAgICAgIGZpZWxkVmFsdWVzW2ZpZWxkLnJlZmVyZW5jZV0gPSBldmFsdWF0b3IuZXh0cmFjdCh2YWx1ZSk7CiAgICB9KTsKICAgIHJldHVybiBuZXcgSW5zdGFuY2VDcmVhdGlvbigKICAgICAgICBrbGFzcy5yZWZlcmVuY2UsIHR5cGVBcmd1bWVudHMsIGZpZWxkVmFsdWVzLCBhc3NlcnRzKTsKICB9Cn0KCi8vLyBIb2xkcyBhbiBlbnZpcm9ubWVudCBvZiB0eXBlIHBhcmFtZXRlcnMsIHBhcmFtZXRlcnMgYW5kIHZhcmlhYmxlcy4KY2xhc3MgRXZhbHVhdGlvbkVudmlyb25tZW50IHsKICAvLy8gVGhlIHZhbHVlcyBvZiB0aGUgdHlwZSBwYXJhbWV0ZXJzIGluIHNjb3BlLgogIGZpbmFsIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gX3R5cGVWYXJpYWJsZXMgPQogICAgICA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CgogIC8vLyBUaGUgdmFsdWVzIG9mIHRoZSBwYXJhbWV0ZXJzL3ZhcmlhYmxlcyBpbiBzY29wZS4KICBmaW5hbCBNYXA8VmFyaWFibGVEZWNsYXJhdGlvbiwgQ29uc3RhbnQ+IF92YXJpYWJsZXMgPQogICAgICA8VmFyaWFibGVEZWNsYXJhdGlvbiwgQ29uc3RhbnQ+e307CgogIC8vLyBXaGV0aGVyIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGlzIGVtcHR5LgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX3R5cGVWYXJpYWJsZXMuaXNFbXB0eSAmJiBfdmFyaWFibGVzLmlzRW1wdHk7CgogIHZvaWQgYWRkVHlwZVBhcmFtZXRlclZhbHVlKFR5cGVQYXJhbWV0ZXIgcGFyYW1ldGVyLCBEYXJ0VHlwZSB2YWx1ZSkgewogICAgYXNzZXJ0KCFfdHlwZVZhcmlhYmxlcy5jb250YWluc0tleShwYXJhbWV0ZXIpKTsKICAgIF90eXBlVmFyaWFibGVzW3BhcmFtZXRlcl0gPSB2YWx1ZTsKICB9CgogIHZvaWQgYWRkVmFyaWFibGVWYWx1ZShWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBDb25zdGFudCB2YWx1ZSkgewogICAgX3ZhcmlhYmxlc1t2YXJpYWJsZV0gPSB2YWx1ZTsKICB9CgogIERhcnRUeXBlIGxvb2t1cFBhcmFtZXRlclZhbHVlKFR5cGVQYXJhbWV0ZXIgcGFyYW1ldGVyKSB7CiAgICBmaW5hbCBEYXJ0VHlwZSB2YWx1ZSA9IF90eXBlVmFyaWFibGVzW3BhcmFtZXRlcl07CiAgICBhc3NlcnQodmFsdWUgIT0gbnVsbCk7CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBDb25zdGFudCBsb29rdXBWYXJpYWJsZShWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSB7CiAgICByZXR1cm4gX3ZhcmlhYmxlc1t2YXJpYWJsZV07CiAgfQoKICBEYXJ0VHlwZSBzdWJzaXR1dGVUeXBlKERhcnRUeXBlIHR5cGUpIHsKICAgIGlmIChfdHlwZVZhcmlhYmxlcy5pc0VtcHR5KSByZXR1cm4gdHlwZTsKICAgIHJldHVybiBzdWJzdGl0dXRlKHR5cGUsIF90eXBlVmFyaWFibGVzKTsKICB9Cn0KCi8vIFVzZWQgYXMgY29udHJvbC1mbG93IHRvIGFib3J0IHRoZSBjdXJyZW50IGV2YWx1YXRpb24uCmNsYXNzIF9BYm9ydER1ZVRvRXJyb3IgewogIGZpbmFsIFRyZWVOb2RlIG5vZGU7CiAgZmluYWwgTWVzc2FnZSBtZXNzYWdlOwogIGZpbmFsIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQ7CgogIF9BYm9ydER1ZVRvRXJyb3IodGhpcy5ub2RlLCB0aGlzLm1lc3NhZ2UsIHt0aGlzLmNvbnRleHR9KTsKfQoKY2xhc3MgX0Fib3J0RHVlVG9JbnZhbGlkRXhwcmVzc2lvbiB7CiAgZmluYWwgVHJlZU5vZGUgbm9kZTsKICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKCiAgX0Fib3J0RHVlVG9JbnZhbGlkRXhwcmVzc2lvbih0aGlzLm5vZGUsIHRoaXMubWVzc2FnZSk7Cn0KCmFic3RyYWN0IGNsYXNzIEVycm9yUmVwb3J0ZXIgewogIGNvbnN0IEVycm9yUmVwb3J0ZXIoKTsKCiAgdm9pZCByZXBvcnQoTG9jYXRlZE1lc3NhZ2UgbWVzc2FnZSwgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dCk7CgogIHZvaWQgcmVwb3J0SW52YWxpZEV4cHJlc3Npb24oSW52YWxpZEV4cHJlc3Npb24gbm9kZSk7Cn0KCmNsYXNzIFNpbXBsZUVycm9yUmVwb3J0ZXIgaW1wbGVtZW50cyBFcnJvclJlcG9ydGVyIHsKICBjb25zdCBTaW1wbGVFcnJvclJlcG9ydGVyKCk7CgogIEBvdmVycmlkZQogIHZvaWQgcmVwb3J0KExvY2F0ZWRNZXNzYWdlIG1lc3NhZ2UsIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQpIHsKICAgIF9yZXBvcnQobWVzc2FnZSk7CiAgICBmb3IgKExvY2F0ZWRNZXNzYWdlIGNvbnRleHRNZXNzYWdlIGluIGNvbnRleHQpIHsKICAgICAgX3JlcG9ydChjb250ZXh0TWVzc2FnZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlcG9ydEludmFsaWRFeHByZXNzaW9uKEludmFsaWRFeHByZXNzaW9uIG5vZGUpIHsKICAgIC8vIElnbm9yZWQKICB9CgogIHZvaWQgX3JlcG9ydChMb2NhdGVkTWVzc2FnZSBtZXNzYWdlKSB7CiAgICByZXBvcnRNZXNzYWdlKG1lc3NhZ2UudXJpLCBtZXNzYWdlLmNoYXJPZmZzZXQsIG1lc3NhZ2UubWVzc2FnZSk7CiAgfQoKICB2b2lkIHJlcG9ydE1lc3NhZ2UoVXJpIHVyaSwgaW50IG9mZnNldCwgU3RyaW5nIG1lc3NhZ2UpIHsKICAgIGlvLmV4aXRDb2RlID0gNDI7CiAgICBpby5zdGRlcnIud3JpdGVsbignJHVyaTokb2Zmc2V0IENvbnN0YW50IGV2YWx1YXRpb24gZXJyb3I6ICRtZXNzYWdlJyk7CiAgfQp9CgpjbGFzcyBJc0luc3RhbnRpYXRlZFZpc2l0b3IgZXh0ZW5kcyBEYXJ0VHlwZVZpc2l0b3I8Ym9vbD4gewogIGZpbmFsIF9hdmFpbGFibGVWYXJpYWJsZXMgPSBuZXcgU2V0PFR5cGVQYXJhbWV0ZXI+KCk7CgogIGJvb2wgaXNJbnN0YW50aWF0ZWQoRGFydFR5cGUgdHlwZSkgewogICAgcmV0dXJuIHR5cGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgYm9vbCBkZWZhdWx0RGFydFR5cGUoRGFydFR5cGUgbm9kZSkgewogICAgdGhyb3cgJ0EgdmlzaXRvciBtZXRob2Qgc2VlbXMgdG8gYmUgdW5pbXBsZW1lbnRlZCEnOwogIH0KCiAgYm9vbCB2aXNpdEludmFsaWRUeXBlKEludmFsaWRUeXBlIG5vZGUpID0+IHRydWU7CiAgYm9vbCB2aXNpdER5bmFtaWNUeXBlKER5bmFtaWNUeXBlIG5vZGUpID0+IHRydWU7CiAgYm9vbCB2aXNpdFZvaWRUeXBlKFZvaWRUeXBlIG5vZGUpID0+IHRydWU7CiAgYm9vbCB2aXNpdEJvdHRvbVR5cGUoQm90dG9tVHlwZSBub2RlKSA9PiB0cnVlOwoKICBib29sIHZpc2l0VHlwZVBhcmFtZXRlclR5cGUoVHlwZVBhcmFtZXRlclR5cGUgbm9kZSkgewogICAgcmV0dXJuIF9hdmFpbGFibGVWYXJpYWJsZXMuY29udGFpbnMobm9kZS5wYXJhbWV0ZXIpOwogIH0KCiAgYm9vbCB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBub2RlKSB7CiAgICByZXR1cm4gbm9kZS50eXBlQXJndW1lbnRzCiAgICAgICAgLmV2ZXJ5KChEYXJ0VHlwZSB0eXBlQXJndW1lbnQpID0+IHR5cGVBcmd1bWVudC5hY2NlcHQodGhpcykpOwogIH0KCiAgYm9vbCB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSkgewogICAgZmluYWwgcGFyYW1ldGVycyA9IG5vZGUudHlwZVBhcmFtZXRlcnM7CiAgICBfYXZhaWxhYmxlVmFyaWFibGVzLmFkZEFsbChwYXJhbWV0ZXJzKTsKICAgIGZpbmFsIGJvb2wgcmVzdWx0ID0gbm9kZS5yZXR1cm5UeXBlLmFjY2VwdCh0aGlzKSAmJgogICAgICAgIG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMuZXZlcnkoKHApID0+IHAuYWNjZXB0KHRoaXMpKSAmJgogICAgICAgIG5vZGUubmFtZWRQYXJhbWV0ZXJzLmV2ZXJ5KChwKSA9PiBwLnR5cGUuYWNjZXB0KHRoaXMpKTsKICAgIF9hdmFpbGFibGVWYXJpYWJsZXMucmVtb3ZlQWxsKHBhcmFtZXRlcnMpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGJvb2wgdmlzaXRUeXBlZGVmVHlwZShUeXBlZGVmVHlwZSBub2RlKSB7CiAgICByZXR1cm4gbm9kZS51bmFsaWFzLmFjY2VwdCh0aGlzKTsKICB9Cn0KCmJvb2wgX2lzRm9ybWFsUGFyYW1ldGVyKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpIHsKICBmaW5hbCBwYXJlbnQgPSB2YXJpYWJsZS5wYXJlbnQ7CiAgaWYgKHBhcmVudCBpcyBGdW5jdGlvbk5vZGUpIHsKICAgIHJldHVybiBwYXJlbnQucG9zaXRpb25hbFBhcmFtZXRlcnMuY29udGFpbnModmFyaWFibGUpIHx8CiAg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c3RhbnRfZXZhbHVhdG9yLmRhcnRBc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfY29uc3RhbnRzLmRhcnSDny8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmtlcm5lbF9jb25zdGFudHM7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IEludmFsaWRFeHByZXNzaW9uLCBMaWJyYXJ5OwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JyBzaG93IExvY2F0ZWRNZXNzYWdlOwoKaW1wb3J0ICcuLi9sb2FkZXIuZGFydCcgc2hvdyBMb2FkZXI7CgppbXBvcnQgJ2NvbnN0YW50X2V2YWx1YXRvci5kYXJ0JyBzaG93IEVycm9yUmVwb3J0ZXI7CgpjbGFzcyBLZXJuZWxDb25zdGFudEVycm9yUmVwb3J0ZXIgZXh0ZW5kcyBFcnJvclJlcG9ydGVyIHsKICBmaW5hbCBMb2FkZXI8TGlicmFyeT4gbG9hZGVyOwoKICBLZXJuZWxDb25zdGFudEVycm9yUmVwb3J0ZXIodGhpcy5sb2FkZXIpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHJlcG9ydChMb2NhdGVkTWVzc2FnZSBtZXNzYWdlLCBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0KSB7CiAgICBsb2FkZXIuYWRkUHJvYmxlbSgKICAgICAgICBtZXNzYWdlLm1lc3NhZ2VPYmplY3QsIG1lc3NhZ2UuY2hhck9mZnNldCwgbWVzc2FnZS5sZW5ndGgsIG1lc3NhZ2UudXJpLAogICAgICAgIGNvbnRleHQ6IGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZXBvcnRJbnZhbGlkRXhwcmVzc2lvbihJbnZhbGlkRXhwcmVzc2lvbiBub2RlKSB7CiAgICAvLyBBc3N1bWVkIHRvIGJlIGFscmVhZHkgcmVwb3J0ZWQuCiAgfQp9CiEATk48ASABQgEyASUBNQE6IAEsAQxGF1AbBAEMOScEAgE4cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfY29uc3RhbnRzLmRhcnRDc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9tZXRhZGF0YV9jb2xsZWN0b3IuZGFydIKyLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwva2VybmVsLmRhcnQnIHNob3cgTWVtYmVyLCBNZXRhZGF0YVJlcG9zaXRvcnksIE5hbWVkTm9kZTsKCi8vLyBUaGUgY29sbGVjdG9yIHRvIGFkZCB0YXJnZXQgc3BlY2lmaWMgbWV0YWRhdGEgdG8uCmFic3RyYWN0IGNsYXNzIE1ldGFkYXRhQ29sbGVjdG9yIHsKICAvLy8gTWV0YWRhdGEgaXMgcmVtZW1iZXJlZCBpbiB0aGlzIHJlcG9zaXRvcnksIHNvIHRoYXQgd2hlbiBpdCBpcyBhZGRlZAogIC8vLyB0byBhIGNvbXBvbmVudCwgbWV0YWRhdGEgaXMgc2VyaWFsaXplZCB3aXRoIHRoZSBjb21wb25lbnQuCiAgTWV0YWRhdGFSZXBvc2l0b3J5IGdldCByZXBvc2l0b3J5OwoKICB2b2lkIHNldENvbnN0cnVjdG9yTmFtZU9mZnNldChNZW1iZXIgbm9kZSwgT2JqZWN0IG5hbWUpOwoKICB2b2lkIHNldERvY3VtZW50YXRpb25Db21tZW50KE5hbWVkTm9kZSBub2RlLCBTdHJpbmcgY29tbWVudCk7Cn0KEgBOTjwBUAE2I0pBJQE7AUACATpwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL21ldGFkYXRhX2NvbGxlY3Rvci5kYXJ0OXNka3Jvb3Q6L3BrZy9rZXJuZWwvbGliL2JpbmFyeS9saW1pdGVkX2FzdF90b19iaW5hcnkuZGFydIiVLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2JpbmFyeS9hc3RfdG9fYmluYXJ5LmRhcnQnOwoKLy8vIFdyaXRlcyBsaWJyYXJpZXMgdGhhdCBzYXRpc2Z5IHRoZSBbcHJlZGljYXRlXS4KLy8vCi8vLyBPbmx5IHRoZSByZWZlcmVuY2VkIHN1YnNldCBvZiBjYW5vbmljYWwgbmFtZXMgaXMgaW5kZXhlZCBhbmQgd3JpdHRlbiwKLy8vIHNvIHdlIGRvbid0IHdhc3RlIHRpbWUgaW5kZXhpbmcgYWxsIGxpYnJhcmllcyBvZiBhIGNvbXBvbmVudCwgd2hlbiBvbmx5Ci8vLyBhIHRpbnkgc3Vic2V0IGlzIHVzZWQuCmNsYXNzIExpbWl0ZWRCaW5hcnlQcmludGVyIGV4dGVuZHMgQmluYXJ5UHJpbnRlciB7CiAgZmluYWwgTGlicmFyeUZpbHRlciBwcmVkaWNhdGU7CgogIC8vLyBFeGNsdWRlcyBhbGwgdXJpVG9Tb3VyY2UgaW5mb3JtYXRpb24uCiAgLy8vCiAgLy8vIEJ5IGRlZmF1bHQgdGhlIFtwcmVkaWNhdGVdIGFib3ZlIHdpbGwgb25seSBleGNsdWRlIGNhbm9uaWNhbCBuYW1lcyBhbmQKICAvLy8ga2VybmVsIGxpYnJhcmllcywgYnV0IGl0IHdpbGwgc3RpbGwgZW1pdCB0aGUgc291cmNlcyBmb3IgYWxsIGxpYnJhcmllcy4KICAvLy8gZmlsdGVyZWQgYnkgbGlicmFyaWVzIG1hdGNoaW5nIFtwcmVkaWNhdGVdLgogIC8vIFRPRE8oc2lnbXVuZCk6IHByb3ZpZGUgYSB3YXkgdG8gZmlsdGVyIHNvdXJjZXMgZGlyZWN0bHkgYmFzZWQgb24KICAvLyBbcHJlZGljYXRlXS4gVGhhdCByZXF1aXJlcyBzcGVjaWFsIGxvZ2ljIHRvIGhhbmRsZSBzb3VyY2VzIGZyb20gcGFydCBmaWxlcy4KICBmaW5hbCBib29sIGV4Y2x1ZGVVcmlUb1NvdXJjZTsKCiAgTGltaXRlZEJpbmFyeVByaW50ZXIoCiAgICAgIFNpbms8TGlzdDxpbnQ+PiBzaW5rLCB0aGlzLnByZWRpY2F0ZSwgdGhpcy5leGNsdWRlVXJpVG9Tb3VyY2UpCiAgICAgIDogc3VwZXIoc2luaywgaW5jbHVkZVNvdXJjZXM6ICFleGNsdWRlVXJpVG9Tb3VyY2UpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGNvbXB1dGVDYW5vbmljYWxOYW1lcyhDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBmb3IgKHZhciBsaWJyYXJ5IGluIGNvbXBvbmVudC5saWJyYXJpZXMpIHsKICAgICAgaWYgKHByZWRpY2F0ZShsaWJyYXJ5KSkgewogICAgICAgIGNvbXBvbmVudC5yb290CiAgICAgICAgICAgIC5nZXRDaGlsZEZyb21VcmkobGlicmFyeS5pbXBvcnRVcmkpCiAgICAgICAgICAgIC5iaW5kVG8obGlicmFyeS5yZWZlcmVuY2UpOwogICAgICAgIGxpYnJhcnkuY29tcHV0ZUNhbm9uaWNhbE5hbWVzKCk7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgc2hvdWxkV3JpdGVMaWJyYXJ5Q2Fub25pY2FsTmFtZXMoTGlicmFyeSBsaWJyYXJ5KSB7CiAgICByZXR1cm4gcHJlZGljYXRlKGxpYnJhcnkpOwogIH0KCiAgdm9pZCB3cml0ZUxpYnJhcmllcyhDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudC5saWJyYXJpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgTGlicmFyeSBsaWJyYXJ5ID0gY29tcG9uZW50LmxpYnJhcmllc1tpXTsKICAgICAgaWYgKHByZWRpY2F0ZShsaWJyYXJ5KSkgd3JpdGVMaWJyYXJ5Tm9kZShsaWJyYXJ5KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVOb2RlKE5vZGUgbm9kZSkgewogICAgaWYgKG5vZGUgaXMgTGlicmFyeSAmJiAhcHJlZGljYXRlKG5vZGUpKSByZXR1cm47CiAgICBzdXBlci53cml0ZU5vZGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlQ29tcG9uZW50SW5kZXgoQ29tcG9uZW50IGNvbXBvbmVudCwgTGlzdDxMaWJyYXJ5PiBsaWJyYXJpZXMpIHsKICAgIHZhciBsaWJyYXJpZXNUb1dyaXRlID0gbGlicmFyaWVzLndoZXJlKHByZWRpY2F0ZSkudG9MaXN0KCk7CiAgICBzdXBlci53cml0ZUNvbXBvbmVudEluZGV4KGNvbXBvbmVudCwgbGlicmFyaWVzVG9Xcml0ZSk7CiAgfQp9CkIATk48ASIzATMESkwbMyEBLAZNTjJGUSEBGEU6AQw0LyAXMCgpCAYEAQw7HwQBLTswOQYEAQweNRsEAQxLQDwEAgEwcGFja2FnZTprZXJuZWwvYmluYXJ5L2xpbWl0ZWRfYXN0X3RvX2JpbmFyeS5kYXJ0JXNka3Jvb3Q6L3BrZy9rZXJuZWwvbGliL3ZlcmlmaWVyLmRhcnTAAE5wLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KbGlicmFyeSBrZXJuZWwuY2hlY2tzOwoKaW1wb3J0ICdhc3QuZGFydCc7CmltcG9ydCAndHJhbnNmb3JtYXRpb25zL2ZsYWdzLmRhcnQnOwoKdm9pZCB2ZXJpZnlDb21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCkgewogIFZlcmlmeWluZ1Zpc2l0b3IuY2hlY2soY29tcG9uZW50KTsKfQoKY2xhc3MgVmVyaWZpY2F0aW9uRXJyb3IgewogIGZpbmFsIFRyZWVOb2RlIGNvbnRleHQ7CgogIGZpbmFsIFRyZWVOb2RlIG5vZGU7CgogIGZpbmFsIFN0cmluZyBkZXRhaWxzOwoKICBWZXJpZmljYXRpb25FcnJvcih0aGlzLmNvbnRleHQsIHRoaXMubm9kZSwgdGhpcy5kZXRhaWxzKTsKCiAgdG9TdHJpbmcoKSB7CiAgICBMb2NhdGlvbiBsb2NhdGlvbjsKICAgIHRyeSB7CiAgICAgIGxvY2F0aW9uID0gbm9kZT8ubG9jYXRpb24gPz8gY29udGV4dD8ubG9jYXRpb247CiAgICB9IGNhdGNoIChfKSB7CiAgICAgIC8vIFRPRE8oYWhlKTogRml4IHRoZSBjb21waWxlciBpbnN0ZWFkLgogICAgfQogICAgaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKICAgICAgU3RyaW5nIGZpbGUgPSBsb2NhdGlvbi5maWxlPy50b1N0cmluZygpID8/ICIiOwogICAgICByZXR1cm4gIiRmaWxlOiR7bG9jYXRpb24ubGluZX06JHtsb2NhdGlvbi5jb2x1bW59OiBWZXJpZmljYXRpb24gZXJyb3I6IgogICAgICAgICAgIiAkZGV0YWlscyI7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gIlZlcmlmaWNhdGlvbiBlcnJvcjogJGRldGFpbHNcbiIKICAgICAgICAgICJDb250ZXh0OiAnJGNvbnRleHQnLlxuIgogICAgICAgICAgIk5vZGU6ICckbm9kZScuIjsKICAgIH0KICB9Cn0KCmVudW0gVHlwZWRlZlN0YXRlIHsgRG9uZSwgQmVpbmdDaGVja2VkIH0KCi8vLyBDaGVja3MgdGhhdCBhIGtlcm5lbCBjb21wb25lbnQgaXMgd2VsbC1mb3JtZWQuCi8vLwovLy8gVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGFueSBraW5kIG9mIHR5cGUgY2hlY2tpbmcuCmNsYXNzIFZlcmlmeWluZ1Zpc2l0b3IgZXh0ZW5kcyBSZWN1cnNpdmVWaXNpdG9yIHsKICBmaW5hbCBTZXQ8Q2xhc3M+IGNsYXNzZXMgPSBuZXcgU2V0PENsYXNzPigpOwogIGZpbmFsIFNldDxUeXBlZGVmPiB0eXBlZGVmcyA9IG5ldyBTZXQ8VHlwZWRlZj4oKTsKICBTZXQ8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnNJblNjb3BlID0gbmV3IFNldDxUeXBlUGFyYW1ldGVyPigpOwogIGZpbmFsIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gdmFyaWFibGVTdGFjayA9IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdOwogIGZpbmFsIE1hcDxUeXBlZGVmLCBUeXBlZGVmU3RhdGU+IHR5cGVkZWZTdGF0ZSA9IDxUeXBlZGVmLCBUeXBlZGVmU3RhdGU+e307CiAgYm9vbCBjbGFzc1R5cGVQYXJhbWV0ZXJzQXJlSW5TY29wZSA9IGZhbHNlOwoKICAvLy8gSWYgdHJ1ZSwgcmVsYXggY2VydGFpbiBjaGVja3MgZm9yICpvdXRsaW5lKiBtb2RlLiBGb3IgZXhhbXBsZSwgZG9uJ3QKICAvLy8gYXR0ZW1wdCB0byB2YWxpZGF0ZSBjb25zdHJ1Y3RvciBpbml0aWFsaXplcnMuCiAgYm9vbCBpc091dGxpbmUgPSBmYWxzZTsKCiAgYm9vbCBpbkNhdGNoQmxvY2sgPSBmYWxzZTsKCiAgTGlicmFyeSBjdXJyZW50TGlicmFyeTsKCiAgTWVtYmVyIGN1cnJlbnRNZW1iZXI7CgogIENsYXNzIGN1cnJlbnRDbGFzczsKCiAgVHJlZU5vZGUgY3VycmVudFBhcmVudDsKCiAgVHJlZU5vZGUgZ2V0IGNvbnRleHQgPT4gY3VycmVudE1lbWJlciA/PyBjdXJyZW50Q2xhc3M7CgogIHN0YXRpYyB2b2lkIGNoZWNrKENvbXBvbmVudCBjb21wb25lbnQpIHsKICAgIGNvbXBvbmVudC5hY2NlcHQobmV3IFZlcmlmeWluZ1Zpc2l0b3IoKSk7CiAgfQoKICBkZWZhdWx0VHJlZU5vZGUoVHJlZU5vZGUgbm9kZSkgewogICAgdmlzaXRDaGlsZHJlbihub2RlKTsKICB9CgogIHByb2JsZW0oVHJlZU5vZGUgbm9kZSwgU3RyaW5nIGRldGFpbHMsIHtUcmVlTm9kZSBjb250ZXh0fSkgewogICAgY29udGV4dCA/Pz0gdGhpcy5jb250ZXh0OwogICAgdGhyb3cgbmV3IFZlcmlmaWNhdGlvbkVycm9yKGNvbnRleHQsIG5vZGUsIGRldGFpbHMpOwogIH0KCiAgVHJlZU5vZGUgZW50ZXJQYXJlbnQoVHJlZU5vZGUgbm9kZSkgewogICAgaWYgKCFpZGVudGljYWwobm9kZS5wYXJlbnQsIGN1cnJlbnRQYXJlbnQpKSB7CiAgICAgIHByb2JsZW0oCiAgICAgICAgICBub2RlLAogICAgICAgICAgIkluY29ycmVjdCBwYXJlbnQgcG9pbnRlciBvbiAke25vZGUucnVudGltZVR5cGV9OiIKICAgICAgICAgICIgZXhwZWN0ZWQgJyR7Y3VycmVudFBhcmVudC5ydW50aW1lVHlwZX0nLCIKICAgICAgICAgICIgYnV0IGZvdW5kOiAnJHtub2RlLnBhcmVudC5ydW50aW1lVHlwZX0nLiIsCiAgICAgICAgICBjb250ZXh0OiBjdXJyZW50UGFyZW50KTsKICAgIH0KICAgIHZhciBvbGRQYXJlbnQgPSBjdXJyZW50UGFyZW50OwogICAgY3VycmVudFBhcmVudCA9IG5vZGU7CiAgICByZXR1cm4gb2xkUGFyZW50OwogIH0KCiAgdm9pZCBleGl0UGFyZW50KFRyZWVOb2RlIG9sZFBhcmVudCkgewogICAgY3VycmVudFBhcmVudCA9IG9sZFBhcmVudDsKICB9CgogIGludCBlbnRlckxvY2FsU2NvcGUoKSA9PiB2YXJpYWJsZVN0YWNrLmxlbmd0aDsKCiAgdm9pZCBleGl0TG9jYWxTY29wZShpbnQgc3RhY2tIZWlnaHQpIHsKICAgIGZvciAoaW50IGkgPSBzdGFja0hlaWdodDsgaSA8IHZhcmlhYmxlU3RhY2subGVuZ3RoOyArK2kpIHsKICAgICAgdW5kZWNsYXJlVmFyaWFibGUodmFyaWFibGVTdGFja1tpXSk7CiAgICB9CiAgICB2YXJpYWJsZVN0YWNrLmxlbmd0aCA9IHN0YWNrSGVpZ2h0OwogIH0KCiAgdm9pZCB2aXNpdENoaWxkcmVuKFRyZWVOb2RlIG5vZGUpIHsKICAgIHZhciBvbGRQYXJlbnQgPSBlbnRlclBhcmVudChub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICAgIGV4aXRQYXJlbnQob2xkUGFyZW50KTsKICB9CgogIHZvaWQgdmlzaXRXaXRoTG9jYWxTY29wZShUcmVlTm9kZSBub2RlKSB7CiAgICBpbnQgc3RhY2tIZWlnaHQgPSBlbnRlckxvY2FsU2NvcGUoKTsKICAgIHZpc2l0Q2hpbGRyZW4obm9kZSk7CiAgICBleGl0TG9jYWxTY29wZShzdGFja0hlaWdodCk7CiAgfQoKICB2b2lkIGRlY2xhcmVNZW1iZXIoTWVtYmVyIG1lbWJlcikgewogICAgaWYgKG1lbWJlci50cmFuc2Zvcm1lckZsYWdzICYgVHJhbnNmb3JtZXJGbGFnLnNlZW5CeVZlcmlmaWVyICE9IDApIHsKICAgICAgcHJvYmxlbShtZW1iZXIuZnVuY3Rpb24sCiAgICAgICAgICAiTWVtYmVyICckbWVtYmVyJyBoYXMgYmVlbiBkZWNsYXJlZCBtb3JlIHRoYW4gb25jZS4iKTsKICAgIH0KICAgIG1lbWJlci50cmFuc2Zvcm1lckZsYWdzIHw9IFRyYW5zZm9ybWVyRmxhZy5zZWVuQnlWZXJpZmllcjsKICB9CgogIHZvaWQgdW5kZWNsYXJlTWVtYmVyKE1lbWJlciBtZW1iZXIpIHsKICAgIG1lbWJlci50cmFuc2Zvcm1lckZsYWdzICY9IH5UcmFuc2Zvcm1lckZsYWcuc2VlbkJ5VmVyaWZpZXI7CiAgfQoKICB2b2lkIGRlY2xhcmVWYXJpYWJsZShWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSB7CiAgICBpZiAodmFyaWFibGUuZmxhZ3MgJiBWYXJpYWJsZURlY2xhcmF0aW9uLkZsYWdJblNjb3BlICE9IDApIHsKICAgICAgcHJvYmxlbSh2YXJpYWJsZSwgIlZhcmlhYmxlICckdmFyaWFibGUnIGRlY2xhcmVkIG1vcmUgdGhhbiBvbmNlLiIpOwogICAgfQogICAgdmFyaWFibGUuZmxhZ3MgfD0gVmFyaWFibGVEZWNsYXJhdGlvbi5GbGFnSW5TY29wZTsKICAgIHZhcmlhYmxlU3RhY2suYWRkKHZhcmlhYmxlKTsKICB9CgogIHZvaWQgdW5kZWNsYXJlVmFyaWFibGUoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgewogICAgdmFyaWFibGUuZmxhZ3MgJj0gflZhcmlhYmxlRGVjbGFyYXRpb24uRmxhZ0luU2NvcGU7CiAgfQoKICB2b2lkIGRlY2xhcmVUeXBlUGFyYW1ldGVycyhMaXN0PFR5cGVQYXJhbWV0ZXI+IHBhcmFtZXRlcnMpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICB2YXIgcGFyYW1ldGVyID0gcGFyYW1ldGVyc1tpXTsKICAgICAgaWYgKHBhcmFtZXRlci5ib3VuZCA9PSBudWxsKSB7CiAgICAgICAgcHJvYmxlbSgKICAgICAgICAgICAgY3VycmVudFBhcmVudCwgIk1pc3NpbmcgYm91bmQgZm9yIHR5cGUgcGFyYW1ldGVyICckcGFyYW1ldGVyJy4iKTsKICAgICAgfQogICAgICBpZiAoIXR5cGVQYXJhbWV0ZXJzSW5TY29wZS5hZGQocGFyYW1ldGVyKSkgewogICAgICAgIHByb2JsZW0ocGFyYW1ldGVyLCAiVHlwZSBwYXJhbWV0ZXIgJyRwYXJhbWV0ZXInIHJlZGVjbGFyZWQuIik7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgdW5kZWNsYXJlVHlwZVBhcmFtZXRlcnMoTGlzdDxUeXBlUGFyYW1ldGVyPiBwYXJhbWV0ZXJzKSB7CiAgICB0eXBlUGFyYW1ldGVyc0luU2NvcGUucmVtb3ZlQWxsKHBhcmFtZXRlcnMpOwogIH0KCiAgdm9pZCBjaGVja1ZhcmlhYmxlSW5TY29wZShWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBUcmVlTm9kZSB3aGVyZSkgewogICAgaWYgKHZhcmlhYmxlLmZsYWdzICYgVmFyaWFibGVEZWNsYXJhdGlvbi5GbGFnSW5TY29wZSA9PSAwKSB7CiAgICAgIHByb2JsZW0od2hlcmUsICJWYXJpYWJsZSAnJHZhcmlhYmxlJyB1c2VkIG91dCBvZiBzY29wZS4iKTsKICAgIH0KICB9CgogIHZpc2l0Q29tcG9uZW50KENvbXBvbmVudCBjb21wb25lbnQpIHsKICAgIHRyeSB7CiAgICAgIGZvciAodmFyIGxpYnJhcnkgaW4gY29tcG9uZW50LmxpYnJhcmllcykgewogICAgICAgIGZvciAodmFyIGNsYXNzXyBpbiBsaWJyYXJ5LmNsYXNzZXMpIHsKICAgICAgICAgIGlmICghY2xhc3Nlcy5hZGQoY2xhc3NfKSkgewogICAgICAgICAgICBwcm9ibGVtKGNsYXNzXywgIkNsYXNzICckY2xhc3NfJyBkZWNsYXJlZCBtb3JlIHRoYW4gb25jZS4iKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgdHlwZWRlZl8gaW4gbGlicmFyeS50eXBlZGVmcykgewogICAgICAgICAgaWYgKCF0eXBlZGVmcy5hZGQodHlwZWRlZl8pKSB7CiAgICAgICAgICAgIHByb2JsZW0odHlwZWRlZl8sICJUeXBlZGVmICckdHlwZWRlZl8nIGRlY2xhcmVkIG1vcmUgdGhhbiBvbmNlLiIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsaWJyYXJ5Lm1lbWJlcnMuZm9yRWFjaChkZWNsYXJlTWVtYmVyKTsKICAgICAgICBmb3IgKHZhciBjbGFzc18gaW4gbGlicmFyeS5jbGFzc2VzKSB7CiAgICAgICAgICBjbGFzc18ubWVtYmVycy5mb3JFYWNoKGRlY2xhcmVNZW1iZXIpOwogICAgICAgIH0KICAgICAgfQogICAgICB2aXNpdENoaWxkcmVuKGNvbXBvbmVudCk7CiAgICB9IGZpbmFsbHkgewogICAgICBmb3IgKHZhciBsaWJyYXJ5IGluIGNvbXBvbmVudC5saWJyYXJpZXMpIHsKICAgICAgICBsaWJyYXJ5Lm1lbWJlcnMuZm9yRWFjaCh1bmRlY2xhcmVNZW1iZXIpOwogICAgICAgIGZvciAodmFyIGNsYXNzXyBpbiBsaWJyYXJ5LmNsYXNzZXMpIHsKICAgICAgICAgIGNsYXNzXy5tZW1iZXJzLmZvckVhY2godW5kZWNsYXJlTWVtYmVyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyaWFibGVTdGFjay5mb3JFYWNoKHVuZGVjbGFyZVZhcmlhYmxlKTsKICAgIH0KICB9CgogIHZvaWQgdmlzaXRMaWJyYXJ5KExpYnJhcnkgbm9kZSkgewogICAgY3VycmVudExpYnJhcnkgPSBub2RlOwogICAgc3VwZXIudmlzaXRMaWJyYXJ5KG5vZGUpOwogICAgY3VycmVudExpYnJhcnkgPSBudWxsOwogIH0KCiAgdm9pZCBjaGVja1R5cGVkZWYoVHlwZWRlZiBub2RlKSB7CiAgICB2YXIgc3RhdGUgPSB0eXBlZGVmU3RhdGVbbm9kZV07CiAgICBpZiAoc3RhdGUgPT0gVHlwZWRlZlN0YXRlLkRvbmUpIHJldHVybjsKICAgIGlmIChzdGF0ZSA9PSBUeXBlZGVmU3RhdGUuQmVpbmdDaGVja2VkKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIlRoZSB0eXBlZGVmICckbm9kZScgcmVmZXJzIHRvIGl0c2VsZiIsIGNvbnRleHQ6IG5vZGUpOwogICAgfQogICAgYXNzZXJ0KHN0YXRlID09IG51bGwpOwogICAgdHlwZWRlZlN0YXRlW25vZGVdID0gVHlwZWRlZlN0YXRlLkJlaW5nQ2hlY2tlZDsKICAgIHZhciBzYXZlZFR5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnNJblNjb3BlOwogICAgdHlwZVBhcmFtZXRlcnNJblNjb3BlID0gbm9kZS50eXBlUGFyYW1ldGVycy50b1NldCgpOwogICAgdmFyIHNhdmVkUGFyZW50ID0gY3VycmVudFBhcmVudDsKICAgIGN1cnJlbnRQYXJlbnQgPSBub2RlOwogICAgLy8gVmlzaXQgY2hpbGRyZW4gd2l0aG91dCBjaGVja2luZyB0aGUgcGFyZW50IHBvaW50ZXIgb24gdGhlIHR5cGVkZWYgaXRzZWxmCiAgICAvLyBzaW5jZSB0aGlzIGNhbiBiZSBjYWxsZWQgZnJvbSBhIGNvbnRleHQgb3RoZXIgdGhhbiBpdHMgdHJ1ZSBwYXJlbnQuCiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgICBjdXJyZW50UGFyZW50ID0gc2F2ZWRQYXJlbnQ7CiAgICB0eXBlUGFyYW1ldGVyc0luU2NvcGUgPSBzYXZlZFR5cGVQYXJhbWV0ZXJzOwogICAgdHlwZWRlZlN0YXRlW25vZGVdID0gVHlwZWRlZlN0YXRlLkRvbmU7CiAgfQoKICB2aXNpdFR5cGVkZWYoVHlwZWRlZiBub2RlKSB7CiAgICBjaGVja1R5cGVkZWYobm9kZSk7CiAgICAvLyBFbnRlciBhbmQgZXhpdCB0aGUgbm9kZSB0byBjaGVjayB0aGUgcGFyZW50IHBvaW50ZXIgb24gdGhlIHR5cGVkZWYgbm9kZS4KICAgIGV4aXRQYXJlbnQoZW50ZXJQYXJlbnQobm9kZSkpOwogIH0KCiAgdmlzaXRGaWVsZChGaWVsZCBub2RlKSB7CiAgICBjdXJyZW50TWVtYmVyID0gbm9kZTsKICAgIHZhciBvbGRQYXJlbnQgPSBlbnRlclBhcmVudChub2RlKTsKICAgIGJvb2wgaXNUb3BMZXZlbCA9IG5vZGUucGFyZW50ID09IGN1cnJlbnRMaWJyYXJ5OwogICAgaWYgKGlzVG9wTGV2ZWwgJiYgIW5vZGUuaXNTdGF0aWMpIHsKICAgICAgcHJvYmxlbShub2RlLCAiVGhlIHRvcC1sZXZlbCBmaWVsZCAnJHtub2RlLm5hbWUubmFtZX0nIHNob3VsZCBiZSBzdGF0aWMiLAogICAgICAgICAgY29udGV4dDogbm9kZSk7CiAgICB9CiAgICBpZiAobm9kZS5pc0NvbnN0ICYmICFub2RlLmlzU3RhdGljKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIlRoZSBjb25zdCBmaWVsZCAnJHtub2RlLm5hbWUubmFtZX0nIHNob3VsZCBiZSBzdGF0aWMiLAogICAgICAgICAgY29udGV4dDogbm9kZSk7CiAgICB9CiAgICBjbGFzc1R5cGVQYXJhbWV0ZXJzQXJlSW5TY29wZSA9ICFub2RlLmlzU3RhdGljOwogICAgbm9kZS5pbml0aWFsaXplcj8uYWNjZXB0KHRoaXMpOwogICAgbm9kZS50eXBlLmFjY2VwdCh0aGlzKTsKICAgIGNsYXNzVHlwZVBhcmFtZXRlcnNBcmVJblNjb3BlID0gZmFsc2U7CiAgICB2aXNpdExpc3Qobm9kZS5hbm5vdGF0aW9ucywgdGhpcyk7CiAgICBleGl0UGFyZW50KG9sZFBhcmVudCk7CiAgICBjdXJyZW50TWVtYmVyID0gbnVsbDsKICB9CgogIHZpc2l0UHJvY2VkdXJlKFByb2NlZHVyZSBub2RlKSB7CiAgICBjdXJyZW50TWVtYmVyID0gbm9kZTsKICAgIHZhciBvbGRQYXJlbnQgPSBlbnRlclBhcmVudChub2RlKTsKICAgIGNsYXNzVHlwZVBhcmFtZXRlcnNBcmVJblNjb3BlID0gIW5vZGUuaXNTdGF0aWM7CiAgICBub2RlLmZ1bmN0aW9uLmFjY2VwdCh0aGlzKTsKICAgIGNsYXNzVHlwZVBhcmFtZXRlcnNBcmVJblNjb3BlID0gZmFsc2U7CiAgICB2aXNpdExpc3Qobm9kZS5hbm5vdGF0aW9ucywgdGhpcyk7CiAgICBleGl0UGFyZW50KG9sZFBhcmVudCk7CiAgICBjdXJyZW50TWVtYmVyID0gbnVsbDsKICB9CgogIHZpc2l0Q29uc3RydWN0b3IoQ29uc3RydWN0b3Igbm9kZSkgewogICAgY3VycmVudE1lbWJlciA9IG5vZGU7CiAgICBjbGFzc1R5cGVQYXJhbWV0ZXJzQXJlSW5TY29wZSA9IHRydWU7CiAgICAvLyBUaGUgY29uc3RydWN0b3IgbWVtYmVyIG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50IGR1ZSB0byBwYXJhbWV0ZXJzIGJlaW5nCiAgICAvLyBpbiBzY29wZSBpbiB0aGUgaW5pdGlhbGl6ZXIgbGlzdC4KICAgIHZhciBvbGRQYXJlbnQgPSBlbnRlclBhcmVudChub2RlKTsKICAgIGludCBzdGFja0hlaWdodCA9IGVudGVyTG9jYWxTY29wZSgpOwogICAgdmlzaXRDaGlsZHJlbihub2RlLmZ1bmN0aW9uKTsKICAgIHZpc2l0TGlzdChub2RlLmluaXRpYWxpemVycywgdGhpcyk7CiAgICBpZiAoIWlzT3V0bGluZSkgewogICAgICBjaGVja0luaXRpYWxpemVycyhub2RlKTsKICAgIH0KICAgIGV4aXRMb2NhbFNjb3BlKHN0YWNrSGVpZ2h0KTsKICAgIGNsYXNzVHlwZVBhcmFtZXRlcnNBcmVJblNjb3BlID0gZmFsc2U7CiAgICB2aXNpdExpc3Qobm9kZS5hbm5vdGF0aW9ucywgdGhpcyk7CiAgICBleGl0UGFyZW50KG9sZFBhcmVudCk7CiAgICBjbGFzc1R5cGVQYXJhbWV0ZXJzQXJlSW5TY29wZSA9IGZhbHNlOwogICAgY3VycmVudE1lbWJlciA9IG51bGw7CiAgfQoKICB2aXNpdENsYXNzKENsYXNzIG5vZGUpIHsKICAgIGN1cnJlbnRDbGFzcyA9IG5vZGU7CiAgICBkZWNsYXJlVHlwZVBhcmFtZXRlcnMobm9kZS50eXBlUGFyYW1ldGVycyk7CiAgICB2YXIgb2xkUGFyZW50ID0gZW50ZXJQYXJlbnQobm9kZSk7CiAgICBjbGFzc1R5cGVQYXJhbWV0ZXJzQXJlSW5TY29wZSA9IGZhbHNlOwogICAgdmlzaXRMaXN0KG5vZGUuYW5ub3RhdGlvbnMsIHRoaXMpOwogICAgY2xhc3NUeXBlUGFyYW1ldGVyc0FyZUluU2NvcGUgPSB0cnVlOwogICAgdmlzaXRMaXN0KG5vZGUudHlwZVBhcmFtZXRlcnMsIHRoaXMpOwogICAgdmlzaXRMaXN0KG5vZGUuZmllbGRzLCB0aGlzKTsKICAgIHZpc2l0TGlzdChub2RlLmNvbnN0cnVjdG9ycywgdGhpcyk7CiAgICB2aXNpdExpc3Qobm9kZS5wcm9jZWR1cmVzLCB0aGlzKTsKICAgIGV4aXRQYXJlbnQob2xkUGFyZW50KTsKICAgIHVuZGVjbGFyZVR5cGVQYXJhbWV0ZXJzKG5vZGUudHlwZVBhcmFtZXRlcnMpOwogICAgY3VycmVudENsYXNzID0gbnVsbDsKICB9CgogIHZpc2l0RnVuY3Rpb25Ob2RlKEZ1bmN0aW9uTm9kZSBub2RlKSB7CiAgICBkZWNsYXJlVHlwZVBhcmFtZXRlcnMobm9kZS50eXBlUGFyYW1ldGVycyk7CiAgICBib29sIHNhdmVkSW5DYXRjaEJsb2NrID0gaW5DYXRjaEJsb2NrOwogICAgaW5DYXRjaEJsb2NrID0gZmFsc2U7CiAgICB2aXNpdFdpdGhMb2NhbFNjb3BlKG5vZGUpOwogICAgaW5DYXRjaEJsb2NrID0gc2F2ZWRJbkNhdGNoQmxvY2s7CiAgICB1bmRlY2xhcmVUeXBlUGFyYW1ldGVycyhub2RlLnR5cGVQYXJhbWV0ZXJzKTsKICB9CgogIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBub2RlKSB7CiAgICBmb3IgKGludCBpID0gMTsgaSA8IG5vZGUubmFtZWRQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgIGlmIChub2RlLm5hbWVkUGFyYW1ldGVyc1tpIC0gMV0uY29tcGFyZVRvKG5vZGUubmFtZWRQYXJhbWV0ZXJzW2ldKSA+PSAwKSB7CiAgICAgICAgcHJvYmxlbShjdXJyZW50UGFyZW50LAogICAgICAgICAgICAiTmFtZWQgcGFyYW1ldGVycyBhcmUgbm90IHNvcnRlZCBvbiBmdW5jdGlvbiB0eXBlICgkbm9kZSkuIik7CiAgICAgIH0KICAgIH0KICAgIGRlY2xhcmVUeXBlUGFyYW1ldGVycyhub2RlLnR5cGVQYXJhbWV0ZXJzKTsKICAgIGZvciAodmFyIHR5cGVQYXJhbWV0ZXIgaW4gbm9kZS50eXBlUGFyYW1ldGVycykgewogICAgICB0eXBlUGFyYW1ldGVyLmJvdW5kPy5hY2NlcHQodGhpcyk7CiAgICB9CiAgICB2aXNpdExpc3Qobm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycywgdGhpcyk7CiAgICB2aXNpdExpc3Qobm9kZS5uYW1lZFBhcmFtZXRlcnMsIHRoaXMpOwogICAgbm9kZS5yZXR1cm5UeXBlLmFjY2VwdCh0aGlzKTsKICAgIHVuZGVjbGFyZVR5cGVQYXJhbWV0ZXJzKG5vZGUudHlwZVBhcmFtZXRlcnMpOwogIH0KCiAgdmlzaXRCbG9jayhCbG9jayBub2RlKSB7CiAgICB2aXNpdFdpdGhMb2NhbFNjb3BlKG5vZGUpOwogIH0KCiAgdmlzaXRGb3JTdGF0ZW1lbnQoRm9yU3RhdGVtZW50IG5vZGUpIHsKICAgIHZpc2l0V2l0aExvY2FsU2NvcGUobm9kZSk7CiAgfQoKICB2aXNpdEZvckluU3RhdGVtZW50KEZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIHZpc2l0V2l0aExvY2FsU2NvcGUobm9kZSk7CiAgfQoKICB2aXNpdExldChMZXQgbm9kZSkgewogICAgdmlzaXRXaXRoTG9jYWxTY29wZShub2RlKTsKICB9CgogIHZpc2l0QmxvY2tFeHByZXNzaW9uKEJsb2NrRXhwcmVzc2lvbiBub2RlKSB7CiAgICBpbnQgc3RhY2tIZWlnaHQgPSBlbnRlckxvY2FsU2NvcGUoKTsKICAgIC8vIERvIG5vdCB2aXNpdCB0aGUgYmxvY2sgZGlyZWN0bHkgYmVjYXVzZSB0aGUgdmFsdWUgZXhwcmVzc2lvbiBuZWVkcyB0bwogICAgLy8gYmUgaW4gaXRzIHNjb3BlLgogICAgVHJlZU5vZGUgb2xkUGFyZW50ID0gZW50ZXJQYXJlbnQobm9kZSk7CiAgICBlbnRlclBhcmVudChub2RlLmJvZHkpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLmJvZHkuc3RhdGVtZW50cy5sZW5ndGg7ICsraSkgewogICAgICBub2RlLmJvZHkuc3RhdGVtZW50c1tpXS5hY2NlcHQodGhpcyk7CiAgICB9CiAgICBleGl0UGFyZW50KG5vZGUpOwogICAgbm9kZS52YWx1ZS5hY2NlcHQodGhpcyk7CiAgICBleGl0UGFyZW50KG9sZFBhcmVudCk7CiAgICBleGl0TG9jYWxTY29wZShzdGFja0hlaWdodCk7CiAgfQoKICB2aXNpdENhdGNoKENhdGNoIG5vZGUpIHsKICAgIGJvb2wgc2F2ZWRJbkNhdGNoQmxvY2sgPSBpbkNhdGNoQmxvY2s7CiAgICBpbkNhdGNoQmxvY2sgPSB0cnVlOwogICAgdmlzaXRXaXRoTG9jYWxTY29wZShub2RlKTsKICAgIGluQ2F0Y2hCbG9jayA9IHNhdmVkSW5DYXRjaEJsb2NrOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRSZXRocm93KFJldGhyb3cgbm9kZSkgewogICAgaWYgKCFpbkNhdGNoQmxvY2spIHsKICAgICAgcHJvYmxlbShub2RlLCAiUmV0aHJvdyBtdXN0IGJlIGluc2lkZSBhIENhdGNoIGJsb2NrLiIpOwogICAgfQogIH0KCiAgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgdmFyIHBhcmVudCA9IG5vZGUucGFyZW50OwogICAgaWYgKHBhcmVudCBpcyEgQmxvY2sgJiYKICAgICAgICAhKHBhcmVudCBpcyBDYXRjaCAmJiBwYXJlbnQuYm9keSAhPSBub2RlKSAmJgogICAgICAgICEocGFyZW50IGlzIEZ1bmN0aW9uTm9kZSAmJiBwYXJlbnQuYm9keSAhPSBub2RlKSAmJgogICAgICAgIHBhcmVudCBpcyEgRnVuY3Rpb25EZWNsYXJhdGlvbiAmJgogICAgICAgICEocGFyZW50IGlzIEZvclN0YXRlbWVudCAmJiBwYXJlbnQuYm9keSAhPSBub2RlKSAmJgogICAgICAgICEocGFyZW50IGlzIEZvckluU3RhdGVtZW50ICYmIHBhcmVudC5ib2R5ICE9IG5vZGUpICYmCiAgICAgICAgcGFyZW50IGlzISBMZXQgJiYKICAgICAgICBwYXJlbnQgaXMhIExvY2FsSW5pdGlhbGl6ZXIpIHsKICAgICAgcHJvYmxlbSgKICAgICAgICAgIG5vZGUsCiAgICAgICAgICAiVmFyaWFibGVEZWNsYXJhdGlvbiBtdXN0IGJlIGEgZGlyZWN0IGNoaWxkIG9mIGEgQmxvY2ssICIKICAgICAgICAgICJub3QgJHtwYXJlbnQucnVudGltZVR5cGV9LiIpOwogICAgfQogICAgdmlzaXRDaGlsZHJlbihub2RlKTsKICAgIGRlY2xhcmVWYXJpYWJsZShub2RlKTsKICB9CgogIHZpc2l0VmFyaWFibGVHZXQoVmFyaWFibGVHZXQgbm9kZSkgewogICAgY2hlY2tWYXJpYWJsZUluU2NvcGUobm9kZS52YXJpYWJsZSwgbm9kZSk7CiAgICB2aXNpdENoaWxkcmVuKG5vZGUpOwogIH0KCiAgdmlzaXRWYXJpYWJsZVNldChWYXJpYWJsZVNldCBub2RlKSB7CiAgICBjaGVja1ZhcmlhYmxlSW5TY29wZShub2RlLnZhcmlhYmxlLCBub2RlKTsKICAgIHZpc2l0Q2hpbGRyZW4obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN0YXRpY0dldChTdGF0aWNHZXQgbm9kZSkgewogICAgdmlzaXRDaGlsZHJlbihub2RlKTsKICAgIGlmIChub2RlLnRhcmdldCA9PSBudWxsKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIlN0YXRpY0dldCB3aXRob3V0IHRhcmdldC4iKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSBDb25zdHJ1Y3Rvci5oYXNHZXR0ZXIgcmV0dXJucyBgZmFsc2VgIGV2ZW4gdGhvdWdoIGZhc3RhIHVzZXMgaXQKICAgIC8vIGFzIGEgZ2V0dGVyIGZvciBpbnRlcm5hbCBwdXJwb3NlczoKICAgIC8vCiAgICAvLyBGYXN0YSBpcyBsZXR0aW5nIGFsbCBjYWxsIHNpdGUgb2YgYSByZWRpcmVjdGluZyBjb25zdHJ1Y3RvciBiZSByZXNvbHZlZAogICAgLy8gdG8gdGhlIHJlYWwgdGFyZ2V0LiAgSW4gb3JkZXIgdG8gcmVzb2x2ZSBpdCwgaXQgc2VlbXMgdG8gYWRkIGEgYm9keSBpbnRvCiAgICAvLyB0aGUgcmVkaXJlY3RpbmctZmFjdG9yeSBjb25zdHJ1Y3RvciB3aGljaCBjYWNoZXMgdGhlIHRhcmdldCBjb25zdHJ1Y3Rvci4KICAgIC8vIFRoYXQgY2FjaGUgaXMgdmlhIGEgYFN0YXRpY0dldChyZWFsLWNvbnN0cnVjdG9yKWAgbm9kZSwgd2hpY2ggd2UgbWFrZQogICAgLy8gaGVyZSBwYXNzIHRoZSB2ZXJpZmllci4KICAgIGlmICghbm9kZS50YXJnZXQuaGFzR2V0dGVyICYmIG5vZGUudGFyZ2V0IGlzISBDb25zdHJ1Y3RvcikgewogICAgICBwcm9ibGVtKG5vZGUsICJTdGF0aWNHZXQgb2YgJyR7bm9kZS50YXJnZXR9JyB3aXRob3V0IGdldHRlci4iKTsKICAgIH0KICAgIGlmIChub2RlLnRhcmdldC5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIlN0YXRpY0dldCBvZiAnJHtub2RlLnRhcmdldH0nIHRoYXQncyBhbiBpbnN0YW5jZSBtZW1iZXIuIik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN0YXRpY1NldChTdGF0aWNTZXQgbm9kZSkgewogICAgdmlzaXRDaGlsZHJlbihub2RlKTsKICAgIGlmIChub2RlLnRhcmdldCA9PSBudWxsKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIlN0YXRpY1NldCB3aXRob3V0IHRhcmdldC4iKTsKICAgIH0KICAgIGlmICghbm9kZS50YXJnZXQuaGFzU2V0dGVyKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIlN0YXRpY1NldCB0byAnJHtub2RlLnRhcmdldH0nIHdpdGhvdXQgc2V0dGVyLiIpOwogICAgfQogICAgaWYgKG5vZGUudGFyZ2V0LmlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgcHJvYmxlbShub2RlLCAiU3RhdGljU2V0IHRvICcke25vZGUudGFyZ2V0fScgdGhhdCdzIGFuIGluc3RhbmNlIG1lbWJlci4iKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0U3RhdGljSW52b2NhdGlvbihTdGF0aWNJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGNoZWNrVGFyZ2V0ZWRJbnZvY2F0aW9uKG5vZGUudGFyZ2V0LCBub2RlKTsKICAgIGlmIChub2RlLnRhcmdldC5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgIHByb2JsZW0obm9kZSwKICAgICAgICAgICJTdGF0aWNJbnZvY2F0aW9uIG9mICcke25vZGUudGFyZ2V0fScgdGhhdCdzIGFuIGluc3RhbmNlIG1lbWJlci4iKTsKICAgIH0KICAgIGlmIChub2RlLmlzQ29uc3QgJiYKICAgICAgICAoIW5vZGUudGFyZ2V0LmlzQ29uc3QgfHwKICAgICAgICAgICAgIW5vZGUudGFyZ2V0LmlzRXh0ZXJuYWwgfHwKICAgICAgICAgICAgbm9kZS50YXJnZXQua2luZCAhPSBQcm9jZWR1cmVLaW5kLkZhY3RvcnkpKSB7CiAgICAgIHByb2JsZW0oCiAgICAgICAgICBub2RlLAogICAgICAgICAgIkNvbnN0YW50IFN0YXRpY0ludm9jYXRpb24gb2YgJyR7bm9kZS50YXJnZXR9JyB0aGF0IGlzbid0IgogICAgICAgICAgIiBhIGNvbnN0IGV4dGVybmFsIGZhY3RvcnkuIik7CiAgICB9CiAgfQoKICB2b2lkIGNoZWNrVGFyZ2V0ZWRJbnZvY2F0aW9uKE1lbWJlciB0YXJnZXQsIEludm9jYXRpb25FeHByZXNzaW9uIG5vZGUpIHsKICAgIHZpc2l0Q2hpbGRyZW4obm9kZSk7CiAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKICAgICAgcHJvYmxlbShub2RlLCAiJHtub2RlLnJ1bnRpbWVUeXBlfSB3aXRob3V0IHRhcmdldC4iKTsKICAgIH0KICAgIGlmICh0YXJnZXQuZnVuY3Rpb24gPT0gbnVsbCkgewogICAgICBwcm9ibGVtKG5vZGUsICIke25vZGUucnVudGltZVR5cGV9IHdpdGhvdXQgZnVuY3Rpb24uIik7CiAgICB9CiAgICBpZiAoIWFyZUFyZ3VtZW50c0NvbXBhdGlibGUobm9kZS5hcmd1bWVudHMsIHRhcmdldC5mdW5jdGlvbikpIHsKICAgICAgcHJvYmxlbShub2RlLAogICAgICAgICAgIiR7bm9kZS5ydW50aW1lVHlwZX0gd2l0aCBpbmNvbXBhdGlibGUgYXJndW1lbnRzIGZvciAnJHt0YXJnZXR9Jy4iKTsKICAgIH0KICAgIGludCBleHBlY3RlZFR5cGVQYXJhbWV0ZXJzID0gdGFyZ2V0IGlzIENvbnN0cnVjdG9yCiAgICAgICAgPyB0YXJnZXQuZW5jbG9zaW5nQ2xhc3MudHlwZVBhcmFtZXRlcnMubGVuZ3RoCiAgICAgICAgOiB0YXJnZXQuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMubGVuZ3RoOwogICAgaWYgKG5vZGUuYXJndW1lbnRzLnR5cGVzLmxlbmd0aCAhPSBleHBlY3RlZFR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgIHByb2JsZW0oCiAgICAgICAgICBub2RlLAogICAgICAgICAgIiR7bm9kZS5ydW50aW1lVHlwZX0gd2l0aCB3cm9uZyBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMiCiAgICAgICAgICAiIGZvciAnJHt0YXJnZXR9Jy4iKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0RGlyZWN0UHJvcGVydHlHZXQoRGlyZWN0UHJvcGVydHlHZXQgbm9kZSkgewogICAgdmlzaXRDaGlsZHJlbihub2RlKTsKICAgIGlmIChub2RlLnRhcmdldCA9PSBudWxsKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIkRpcmVjdFByb3BlcnR5R2V0IHdpdGhvdXQgdGFyZ2V0LiIpOwogICAgfQogICAgaWYgKCFub2RlLnRhcmdldC5oYXNHZXR0ZXIpIHsKICAgICAgcHJvYmxlbShub2RlLCAiRGlyZWN0UHJvcGVydHlHZXQgb2YgJyR7bm9kZS50YXJnZXR9JyB3aXRob3V0IGdldHRlci4iKTsKICAgIH0KICAgIGlmICghbm9kZS50YXJnZXQuaXNJbnN0YW5jZU1lbWJlcikgewogICAgICBwcm9ibGVtKAogICAgICAgICAgbm9kZSwKICAgICAgICAgICJEaXJlY3RQcm9wZXJ0eUdldCBvZiAnJHtub2RlLnRhcmdldH0nIHRoYXQgaXNuJ3QgYW4iCiAgICAgICAgICAiIGluc3RhbmNlIG1lbWJlci4iKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0RGlyZWN0UHJvcGVydHlTZXQoRGlyZWN0UHJvcGVydHlTZXQgbm9kZSkgewogICAgdmlzaXRDaGlsZHJlbihub2RlKTsKICAgIGlmIChub2RlLnRhcmdldCA9PSBudWxsKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIkRpcmVjdFByb3BlcnR5U2V0IHdpdGhvdXQgdGFyZ2V0LiIpOwogICAgfQogICAgaWYgKCFub2RlLnRhcmdldC5oYXNTZXR0ZXIpIHsKICAgICAgcHJvYmxlbShub2RlLCAiRGlyZWN0UHJvcGVydHlTZXQgb2YgJyR7bm9kZS50YXJnZXR9JyB3aXRob3V0IHNldHRlci4iKTsKICAgIH0KICAgIGlmICghbm9kZS50YXJnZXQuaXNJbnN0YW5jZU1lbWJlcikgewogICAgICBwcm9ibGVtKG5vZGUsICJEaXJlY3RQcm9wZXJ0eVNldCBvZiAnJHtub2RlLnRhcmdldH0nIHRoYXQgaXMgc3RhdGljLiIpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXREaXJlY3RNZXRob2RJbnZvY2F0aW9uKERpcmVjdE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgY2hlY2tUYXJnZXRlZEludm9jYXRpb24obm9kZS50YXJnZXQsIG5vZGUpOwogICAgaWYgKG5vZGUucmVjZWl2ZXIgPT0gbnVsbCkgewogICAgICBwcm9ibGVtKG5vZGUsICJEaXJlY3RNZXRob2RJbnZvY2F0aW9uIHdpdGhvdXQgcmVjZWl2ZXIuIik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewogICAgY2hlY2tUYXJnZXRlZEludm9jYXRpb24obm9kZS50YXJnZXQsIG5vZGUpOwogICAgaWYgKG5vZGUudGFyZ2V0LmVuY2xvc2luZ0NsYXNzLmlzQWJzdHJhY3QpIHsKICAgICAgcHJvYmxlbShub2RlLCAiQ29uc3RydWN0b3JJbnZvY2F0aW9uIG9mIGFic3RyYWN0IGNsYXNzLiIpOwogICAgfQogICAgaWYgKG5vZGUuaXNDb25zdCAmJiAhbm9kZS50YXJnZXQuaXNDb25zdCkgewogICAgICBwcm9ibGVtKAogICAgICAgICAgbm9kZSwKICAgICAgICAgICJDb25zdGFudCBDb25zdHJ1Y3Rvckludm9jYXRpb24gZm8gJyR7bm9kZS50YXJnZXR9JyB0aGF0IgogICAgICAgICAgIiBpc24ndCBjb25zdC4iKTsKICAgIH0KICB9CgogIGJvb2wgYXJlQXJndW1lbnRzQ29tcGF0aWJsZShBcmd1bWVudHMgYXJndW1lbnRzLCBGdW5jdGlvbk5vZGUgZnVuY3Rpb24pIHsKICAgIGlmIChhcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGggPCBmdW5jdGlvbi5yZXF1aXJlZFBhcmFtZXRlckNvdW50KSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChhcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGggPiBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgbmFtZWRMb29wOgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubmFtZWQubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIGFyZ3VtZW50ID0gYXJndW1lbnRzLm5hbWVkW2ldOwogICAgICBTdHJpbmcgbmFtZSA9IGFyZ3VtZW50Lm5hbWU7CiAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLmxlbmd0aDsgKytqKSB7CiAgICAgICAgaWYgKGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVyc1tqXS5uYW1lID09IG5hbWUpIGNvbnRpbnVlIG5hbWVkTG9vcDsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q29udGludWVTd2l0Y2hTdGF0ZW1lbnQoQ29udGludWVTd2l0Y2hTdGF0ZW1lbnQgbm9kZSkgewogICAgaWYgKG5vZGUudGFyZ2V0ID09IG51bGwpIHsKICAgICAgcHJvYmxlbShub2RlLCAiTm8gdGFyZ2V0LiIpOwogICAgfSBlbHNlIGlmIChub2RlLnRhcmdldC5wYXJlbnQgPT0gbnVsbCkgewogICAgICBwcm9ibGVtKG5vZGUsICJUYXJnZXQgaGFzIG5vIHBhcmVudC4iKTsKICAgIH0gZWxzZSB7CiAgICAgIFN3aXRjaFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBub2RlLnRhcmdldC5wYXJlbnQ7CiAgICAgIGZvciAoU3dpdGNoQ2FzZSBzd2l0Y2hDYXNlIGluIHN0YXRlbWVudC5jYXNlcykgewogICAgICAgIGlmIChzd2l0Y2hDYXNlID09IG5vZGUudGFyZ2V0KSByZXR1cm47CiAgICAgIH0KICAgICAgcHJvYmxlbShub2RlLCAiU3dpdGNoIGNhc2UgaXNuJ3QgY2hpbGQgb2YgcGFyZW50LiIpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgZGVmYXVsdE1lbWJlclJlZmVyZW5jZShNZW1iZXIgbm9kZSkgewogICAgaWYgKG5vZGUudHJhbnNmb3JtZXJGbGFncyAmIFRyYW5zZm9ybWVyRmxhZy5zZWVuQnlWZXJpZmllciA9PSAwKSB7CiAgICAgIHByb2JsZW0oCiAgICAgICAgICBub2RlLCAiRGFuZ2xpbmcgcmVmZXJlbmNlIHRvICckbm9kZScsIHBhcmVudCBpczogJyR7bm9kZS5wYXJlbnR9Jy4iKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q2xhc3NSZWZlcmVuY2UoQ2xhc3Mgbm9kZSkgewogICAgaWYgKCFjbGFzc2VzLmNvbnRhaW5zKG5vZGUpKSB7CiAgICAgIHByb2JsZW0oCiAgICAgICAgICBub2RlLCAiRGFuZ2xpbmcgcmVmZXJlbmNlIHRvICckbm9kZScsIHBhcmVudCBpczogJyR7bm9kZS5wYXJlbnR9Jy4iKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0VHlwZWRlZlJlZmVyZW5jZShUeXBlZGVmIG5vZGUpIHsKICAgIGlmICghdHlwZWRlZnMuY29udGFpbnMobm9kZSkpIHsKICAgICAgcHJvYmxlbSgKICAgICAgICAgIG5vZGUsICJEYW5nbGluZyByZWZlcmVuY2UgdG8gJyRub2RlJywgcGFyZW50IGlzOiAnJHtub2RlLnBhcmVudH0nIik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKFR5cGVQYXJhbWV0ZXJUeXBlIG5vZGUpIHsKICAgIHZhciBwYXJhbWV0ZXIgPSBub2RlLnBhcmFtZXRlcjsKICAgIGlmICghdHlwZVBhcmFtZXRlcnNJblNjb3BlLmNvbnRhaW5zKHBhcmFtZXRlcikpIHsKICAgICAgcHJvYmxlbSgKICAgICAgICAgIGN1cnJlbnRQYXJlbnQsCiAgICAgICAgICAiVHlwZSBwYXJhbWV0ZXIgJyRwYXJhbWV0ZXInIHJlZmVyZW5jZWQgb3V0IG9mIgogICAgICAgICAgIiBzY29wZSwgcGFyZW50IGlzOiAnJHtwYXJhbWV0ZXIucGFyZW50fScuIik7CiAgICB9CiAgICBpZiAocGFyYW1ldGVyLnBhcmVudCBpcyBDbGFzcyAmJiAhY2xhc3NUeXBlUGFyYW1ldGVyc0FyZUluU2NvcGUpIHsKICAgICAgcHJvYmxlbSgKICAgICAgICAgIGN1cnJlbnRQYXJlbnQsCiAgICAgICAgICAiVHlwZSBwYXJhbWV0ZXIgJyRwYXJhbWV0ZXInIHJlZmVyZW5jZWQgZnJvbSIKICAgICAgICAgICIgc3RhdGljIGNvbnRleHQsIHBhcmVudCBpczogJyR7cGFyYW1ldGVyLnBhcmVudH0nLiIpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgbm9kZSkgewogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogICAgaWYgKG5vZGUudHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gbm9kZS5jbGFzc05vZGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgIHByb2JsZW0oCiAgICAgICAgICBjdXJyZW50UGFyZW50LAogICAgICAgICAgIlR5cGUgJG5vZGUgcHJvdmlkZXMgJHtub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RofSIKICAgICAgICAgICIgdHlwZSBhcmd1bWVudHMgYnV0IHRoZSBjbGFzcyBkZWNsYXJlcyIKICAgICAgICAgICIgJHtub2RlLmNsYXNzTm9kZS50eXBlUGFyYW1ldGVycy5sZW5ndGh9IHBhcmFtZXRlcnMuIik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIG5vZGUpIHsKICAgIGNoZWNrVHlwZWRlZihub2RlLnR5cGVkZWZOb2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoICE9IG5vZGUudHlwZWRlZk5vZGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgIHByb2JsZW0oCiAgICAgICAgICBjdXJyZW50UGFyZW50LAogICAgICAgICAgIlRoZSB0eXBlZGVmIHR5cGUgJG5vZGUgcHJvdmlkZXMgJHtub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RofSIKICAgICAgICAgICIgdHlwZSBhcmd1bWVudHMgYnV0IHRoZSB0eXBlZGVmIGRlY2xhcmVzIgogICAgICAgICAgIiAke25vZGUudHlwZWRlZk5vZGUudHlwZVBhcmFtZXRlcnMubGVuZ3RofSBwYXJhbWV0ZXJzLiIpOwogICAgfQogIH0KfQoKY2xhc3MgQ2hlY2tQYXJlbnRQb2ludGVycyBleHRlbmRzIFZpc2l0b3IgewogIHN0YXRpYyB2b2lkIGNoZWNrKFRyZWVOb2RlIG5vZGUpIHsKICAgIG5vZGUuYWNjZXB0KG5ldyBDaGVja1BhcmVudFBvaW50ZXJzKG5vZGUucGFyZW50KSk7CiAgfQoKICBUcmVlTm9kZSBwYXJlbnQ7CgogIENoZWNrUGFyZW50UG9pbnRlcnMoW3RoaXMucGFyZW50XSk7CgogIGRlZmF1bHRUcmVlTm9kZShUcmVlTm9kZSBub2RlKSB7CiAgICBpZiAobm9kZS5wYXJlbnQgIT0gcGFyZW50KSB7CiAgICAgIHRocm93IG5ldyBWZXJpZmljYXRpb25FcnJvcigKICAgICAgICAgIHBhcmVudCwKICAgICAgICAgIG5vZGUsCiAgICAgICAgICAiUGFyZW50IHBvaW50ZXIgb24gJyR7bm9kZS5ydW50aW1lVHlwZX0nICIKICAgICAgICAgICJpcyAnJHtub2RlLnBhcmVudC5ydW50aW1lVHlwZX0nICIKICAgICAgICAgICJidXQgc2hvdWxkIGJlICcke3BhcmVudC5ydW50aW1lVHlwZX0nLiIpOwogICAgfQogICAgdmFyIG9sZFBhcmVudCA9IHBhcmVudDsKICAgIHBhcmVudCA9IG5vZGU7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgICBwYXJlbnQgPSBvbGRQYXJlbnQ7CiAgfQp9Cgp2b2lkIGNoZWNrSW5pdGlhbGl6ZXJzKENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yKSB7CiAgLy8gVE9ETyhhaGUpOiBJJ2xsIGFkZCBtb3JlIGhlcmUgaW4gb3RoZXIgQ0xzLgp9CoKTAE5OPBcBEyUBLCUCARoaARcBGAE8AQ8XCjYSLgYcNU4XDS4jHAYEAgEpATMENTIvNEdLTS4BSzQaAR0BGgEYARYBGgE5ASsuBAEjGQQBPx45BAEoMg8QPTY3IwYjGhYEASgfBAExASk/KwYoBAEmJx4bBAEsKRkhBAEmSR9BBj8EAShABAE3QUoGNyEEATk4BAE/MiUlEU4IM0cIBgQBQTEEAUxBQQYEASgKMS4mSQwKMSlPDAowLjEKCCAQMTIuMwoIMAYEASQbHhsEASQkLC5MBhs0NTklGlBLHiExLAQBHxhQIwQBGxonNShQGgYqTBoGNCQcKycbGgQBIxonNCArJxsaBAEnGipOKScpIigWHwYhKycbKxoEARsZMCcrJyoqIigmGzIZBAEpMCsaHyYyBAEpPFEfSggGMDUpBjArIjIEARsfBAEpHwQBLR8EARcfBAEvKU0YLBw8LAYWHRshBAEbKxkfJgQBDB8ZPgYEATceHDU8Kjw+GicPEEQpBhkbBAEnLxkEAScvGQQBDCMZHzIGUSoHT1BQTR9BRgYoUQYEAQwjGR8yBiJGBihRBgQBDDEwKBROBhghJzoPEEUpBgQBSxkaPAYjPgZEFE8GNzYxQQ8QRCAGBAEMMxkfOgYiTgYpDxBAIAYEAQwzGR86BiJOBilOBgQBDD0wIUEGBAEMOzAxQQYwDxBEHAYEAUxJFAZOFAYPNykjQkoIFAYRBAEMPx8jLS4NNjcvCDsGBAEMKEcPUAYEAQwkIw9QBgQBDCgkD08GBAEMMyQ2Dxk6OAZHDxk4QQYEAQwrHk0PGT0zQwYEAQwnJB5PDxlJNUUGBAIBLCU3BAETASYBIyEjEhA1LTUGHBMeGAQCATIxAgEccGFja2FnZTprZXJuZWwvdmVyaWZpZXIuZGFydERzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2UvdHlwZV9zY2hlbWEuZGFydI/9Ly8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRS5tZCBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEYXJ0VHlwZVZpc2l0b3IsCiAgICAgICAgRGFydFR5cGVWaXNpdG9yMSwKICAgICAgICBGdW5jdGlvblR5cGUsCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBUeXBlZGVmVHlwZSwKICAgICAgICBWaXNpdG9yOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9pbXBvcnRfdGFibGUuZGFydCcgc2hvdyBJbXBvcnRUYWJsZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdGV4dC9hc3RfdG9fdGV4dC5kYXJ0JwogICAgc2hvdyBBbm5vdGF0b3IsIE5hbWVTeXN0ZW0sIFByaW50ZXIsIGdsb2JhbERlYnVnZ2luZ05hbWVzOwoKLy8vIERldGVybWluZXMgd2hldGhlciBhIHR5cGUgc2NoZW1hIGNvbnRhaW5zIGA/YCBzb21ld2hlcmUgaW5zaWRlIGl0Lgpib29sIGlzS25vd24oRGFydFR5cGUgc2NoZW1hKSA9PiBzY2hlbWEuYWNjZXB0KG5ldyBfSXNLbm93blZpc2l0b3IoKSk7CgovLy8gQ29udmVydHMgYSBbRGFydFR5cGVdIHRvIGEgc3RyaW5nLCByZXByZXNlbnRpbmcgdGhlIHVua25vd24gdHlwZSBhcyBgP2AuClN0cmluZyB0eXBlU2NoZW1hVG9TdHJpbmcoRGFydFR5cGUgc2NoZW1hKSB7CiAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICBuZXcgVHlwZVNjaGVtYVByaW50ZXIoYnVmZmVyLCBzeW50aGV0aWNOYW1lczogZ2xvYmFsRGVidWdnaW5nTmFtZXMpCiAgICAgIC53cml0ZU5vZGUoc2NoZW1hKTsKICByZXR1cm4gJyRidWZmZXInOwp9CgovLy8gRXh0ZW5zaW9uIG9mIFtQcmludGVyXSB0aGF0IHJlcHJlc2VudHMgdGhlIHVua25vd24gdHlwZSBhcyBgP2AuCmNsYXNzIFR5cGVTY2hlbWFQcmludGVyIGV4dGVuZHMgUHJpbnRlciBpbXBsZW1lbnRzIFR5cGVTY2hlbWFWaXNpdG9yPE51bGw+IHsKICBUeXBlU2NoZW1hUHJpbnRlcihTdHJpbmdTaW5rIHNpbmssCiAgICAgIHtOYW1lU3lzdGVtIHN5bnRoZXRpY05hbWVzLAogICAgICBib29sIHNob3dFeHRlcm5hbCwKICAgICAgYm9vbCBzaG93T2Zmc2V0czogZmFsc2UsCiAgICAgIEltcG9ydFRhYmxlIGltcG9ydFRhYmxlLAogICAgICBBbm5vdGF0b3IgYW5ub3RhdG9yfSkKICAgICAgOiBzdXBlcihzaW5rLAogICAgICAgICAgICBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMsCiAgICAgICAgICAgIHNob3dFeHRlcm5hbDogc2hvd0V4dGVybmFsLAogICAgICAgICAgICBzaG93T2Zmc2V0czogc2hvd09mZnNldHMsCiAgICAgICAgICAgIGltcG9ydFRhYmxlOiBpbXBvcnRUYWJsZSwKICAgICAgICAgICAgYW5ub3RhdG9yOiBhbm5vdGF0b3IpOwoKICBAb3ZlcnJpZGUKICB2aXNpdFVua25vd25UeXBlKFVua25vd25UeXBlIG5vZGUpIHsKICAgIHdyaXRlV29yZCgnPycpOwogIH0KfQoKLy8vIEV4dGVuc2lvbiBvZiBbRGFydFR5cGVWaXNpdG9yXSB3aGljaCBjYW4gdmlzaXQgW1Vua25vd25UeXBlXS4KY2xhc3MgVHlwZVNjaGVtYVZpc2l0b3I8Uj4gZXh0ZW5kcyBEYXJ0VHlwZVZpc2l0b3I8Uj4gewogIC8vLyBDYWxsZWQgd2hlbiBbVW5rbm93blR5cGVdIGlzIHZpc2l0ZWQuCiAgUiB2aXNpdFVua25vd25UeXBlKFVua25vd25UeXBlIG5vZGUpID0+IGRlZmF1bHREYXJ0VHlwZShub2RlKTsKfQoKLy8vIFRoZSB1bmtub3duIHR5cGUgKGRlbm90ZWQgYD9gKSBpcyBhbiBvYmplY3Qgd2hpY2ggY2FuIGFwcGVhciBhbnl3aGVyZSB0aGF0Ci8vLyBhIHR5cGUgaXMgZXhwZWN0ZWQuICBJdCByZXByZXNlbnRzIGEgY29tcG9uZW50IG9mIGEgdHlwZSB3aGljaCBoYXMgbm90IHlldAovLy8gYmVlbiBmaXhlZCBieSBpbmZlcmVuY2UuCi8vLwovLy8gVGhlIHVua25vd24gdHlwZSBjYW5ub3QgYXBwZWFyIGluIHByb2dyYW1zIG9yIGluIGZpbmFsIGluZmVycmVkIHR5cGVzOiBpdCBpcwovLy8gcHVyZWx5IHBhcnQgb2YgdGhlIGxvY2FsIGluZmVyZW5jZSBwcm9jZXNzLgpjbGFzcyBVbmtub3duVHlwZSBleHRlbmRzIERhcnRUeXBlIHsKICBjb25zdCBVbmtub3duVHlwZSgpOwoKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgLy8gVGhpcyBjbGFzcyBkb2Vzbid0IGhhdmUgYW55IGZpZWxkcyBzbyBhbGwgaW5zdGFuY2VzIG9mIGBVbmtub3duVHlwZWAgYXJlCiAgICAvLyBlcXVhbC4KICAgIHJldHVybiBvdGhlciBpcyBVbmtub3duVHlwZTsKICB9CgogIEBvdmVycmlkZQogIGFjY2VwdChEYXJ0VHlwZVZpc2l0b3IgdikgewogICAgaWYgKHYgaXMgVHlwZVNjaGVtYVZpc2l0b3IpIHsKICAgICAgcmV0dXJuIHYudmlzaXRVbmtub3duVHlwZSh0aGlzKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE5vdGU6IGluIHByaW5jaXBsZSBpdCBzZWVtcyBsaWtlIHRoaXMgc2hvdWxkIHRocm93LCBzaW5jZSBhbnkgdmlzaXRvcgogICAgICAvLyB0aGF0IG9wZXJhdGVzIG9uIGEgdHlwZSBzY2hlbWEgb3VnaHQgdG8gaW5oZXJpdCBmcm9tIFR5cGVTY2hlbWFWaXNpdG9yLgogICAgICAvLyBIb3dldmVyLCB0aGF0IHdvdWxkIG1ha2UgaXQgaW1wb3NzaWJsZSB0byB1c2UgdG9TdHJpbmcoKSBvbiBhbnkgdHlwZQogICAgICAvLyBzY2hlbWEsIHNpbmNlIHRvU3RyaW5nKCkgdXNlcyB0aGUga2VybmVsJ3MgUHJpbnRlciB2aXNpdG9yLCB3aGljaCBjYW4ndAogICAgICAvLyBwb3NzaWJseSBpbmhlcml0IGZyb20gVHlwZVNjaGVtYVZpc2l0b3Igc2luY2UgaXQncyBpbnNpZGUga2VybmVsLgogICAgICByZXR1cm4gdi5kZWZhdWx0RGFydFR5cGUodGhpcyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBhY2NlcHQxKERhcnRUeXBlVmlzaXRvcjEgdiwgYXJnKSA9PiB2LmRlZmF1bHREYXJ0VHlwZSh0aGlzLCBhcmcpOwoKICBAb3ZlcnJpZGUKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdikge30KfQoKLy8vIFZpc2l0b3IgdGhhdCBjb21wdXRlcyBbaXNLbm93bl0uCmNsYXNzIF9Jc0tub3duVmlzaXRvciBleHRlbmRzIFR5cGVTY2hlbWFWaXNpdG9yPGJvb2w+IHsKICBAb3ZlcnJpZGUKICBib29sIGRlZmF1bHREYXJ0VHlwZShEYXJ0VHlwZSBub2RlKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBub2RlKSB7CiAgICBpZiAoIW5vZGUucmV0dXJuVHlwZS5hY2NlcHQodGhpcykpIHJldHVybiBmYWxzZTsKICAgIGZvciAodmFyIHBhcmFtZXRlclR5cGUgaW4gbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICBpZiAoIXBhcmFtZXRlclR5cGUuYWNjZXB0KHRoaXMpKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBmb3IgKHZhciBuYW1lZFBhcmFtZXRlclR5cGUgaW4gbm9kZS5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgaWYgKCFuYW1lZFBhcmFtZXRlclR5cGUudHlwZS5hY2NlcHQodGhpcykpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBub2RlKSB7CiAgICBmb3IgKHZhciB0eXBlQXJndW1lbnQgaW4gbm9kZS50eXBlQXJndW1lbnRzKSB7CiAgICAgIGlmICghdHlwZUFyZ3VtZW50LmFjY2VwdCh0aGlzKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSkgewogICAgZm9yICh2YXIgdHlwZUFyZ3VtZW50IGluIG5vZGUudHlwZUFyZ3VtZW50cykgewogICAgICBpZiAoIXR5cGVBcmd1bWVudC5hY2NlcHQodGhpcykpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFVua25vd25UeXBlKFVua25vd25UeXBlIG5vZGUpID0+IGZhbHNlOwp9CoCDAE1OPwEhCRIZGhYXFREBPAEuPwFHRwFNLSxGGhQCAURNJSIZHx8cFCwoJiYjAQwnFAQCAUI4LEECAU9PHQRRMCUXASNQDiEEAQweIicNT1FOUUsmBgQBDEQBDB4CASU4DC8BDC41OzUGOz8GEQQBDDAzNAYRBAEMLDM0BhEEAQw0AgE7cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL3R5cGVfc2NoZW1hLmRhcnRCc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfc2hhZG93X2FzdC5kYXJ0wAEF2S8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gVGhpcyBmaWxlIGRlY2xhcmVzIGEgInNoYWRvdyBoaWVyYXJjaHkiIG9mIGNvbmNyZXRlIGNsYXNzZXMgd2hpY2ggZXh0ZW5kCi8vLyB0aGUga2VybmVsIGNsYXNzIGhpZXJhcmNoeSwgYWRkaW5nIG1ldGhvZHMgYW5kIGZpZWxkcyBuZWVkZWQgYnkgdGhlCi8vLyBCb2R5QnVpbGRlci4KLy8vCi8vLyBJbnN0YW5jZXMgb2YgdGhlc2UgY2xhc3NlcyBtYXkgYmUgY3JlYXRlZCB1c2luZyB0aGUgZmFjdG9yeSBtZXRob2RzIGluCi8vLyBgYXN0X2ZhY3RvcnkuZGFydGAuCi8vLwovLy8gTm90ZSB0aGF0IHRoZXNlIGNsYXNzZXMgcmVwcmVzZW50IHRoZSBEYXJ0IGxhbmd1YWdlIHByaW9yIHRvIGRlc3VnYXJpbmcuCi8vLyBXaGVuIGEgc2luZ2xlIERhcnQgY29uc3RydWN0IGRlc3VnYXJzIHRvIGEgdHJlZSBjb250YWluaW5nIG11bHRpcGxlIGtlcm5lbAovLy8gQVNUIG5vZGVzLCB0aGUgc2hhZG93IGNsYXNzIGV4dGVuZHMgdGhlIGtlcm5lbCBvYmplY3QgYXQgdGhlIHRvcCBvZiB0aGUKLy8vIGRlc3VnYXJlZCB0cmVlLgovLy8KLy8vIFRoaXMgbWVhbnMgdGhhdCBpbiBzb21lIGNhc2VzIG11bHRpcGxlIHNoYWRvdyBjbGFzc2VzIG1heSBleHRlbmQgdGhlIHNhbWUKLy8vIGtlcm5lbCBjbGFzcywgYmVjYXVzZSBtdWx0aXBsZSBjb25zdHJ1Y3RzIGluIERhcnQgbWF5IGRlc3VnYXIgdG8gYSB0cmVlCi8vLyB3aXRoIHRoZSBzYW1lIGtpbmQgb2Ygcm9vdCBub2RlLgoKaW1wb3J0ICdkYXJ0OmNvcmUnIGhpZGUgTWFwRW50cnk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBrZXJuZWwgc2hvdyBFeHByZXNzaW9uLCBJbml0aWFsaXplcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgc2hvdyBTdWJzdGl0dXRpb247CgppbXBvcnQgJy4uLy4uL2Jhc2UvaW5zdHJ1bWVudGF0aW9uLmRhcnQnCiAgICBzaG93CiAgICAgICAgSW5zdHJ1bWVudGF0aW9uLAogICAgICAgIEluc3RydW1lbnRhdGlvblZhbHVlRm9yTWVtYmVyLAogICAgICAgIEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZSwKICAgICAgICBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGVBcmdzOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIG1lc3NhZ2VDYW50RGlzYW1iaWd1YXRlQW1iaWd1b3VzSW5mb3JtYXRpb24sCiAgICAgICAgbWVzc2FnZUNhbnREaXNhbWJpZ3VhdGVOb3RFbm91Z2hJbmZvcm1hdGlvbiwKICAgICAgICBtZXNzYWdlTm9uTnVsbEF3YXJlU3ByZWFkSXNOdWxsLAogICAgICAgIG1lc3NhZ2VTd2l0Y2hFeHByZXNzaW9uTm90QXNzaWduYWJsZUNhdXNlLAogICAgICAgIG1lc3NhZ2VWb2lkRXhwcmVzc2lvbiwKICAgICAgICBub0xlbmd0aCwKICAgICAgICB0ZW1wbGF0ZUNhbnRJbmZlclR5cGVEdWVUb0NpcmN1bGFyaXR5LAogICAgICAgIHRlbXBsYXRlRm9ySW5Mb29wRWxlbWVudFR5cGVOb3RBc3NpZ25hYmxlLAogICAgICAgIHRlbXBsYXRlRm9ySW5Mb29wVHlwZU5vdEl0ZXJhYmxlLAogICAgICAgIHRlbXBsYXRlSW50ZWdlckxpdGVyYWxJc091dE9mUmFuZ2UsCiAgICAgICAgdGVtcGxhdGVTcHJlYWRFbGVtZW50VHlwZU1pc21hdGNoLAogICAgICAgIHRlbXBsYXRlU3ByZWFkTWFwRW50cnlFbGVtZW50S2V5VHlwZU1pc21hdGNoLAogICAgICAgIHRlbXBsYXRlU3ByZWFkTWFwRW50cnlFbGVtZW50VmFsdWVUeXBlTWlzbWF0Y2gsCiAgICAgICAgdGVtcGxhdGVTcHJlYWRNYXBFbnRyeVR5cGVNaXNtYXRjaCwKICAgICAgICB0ZW1wbGF0ZVNwcmVhZFR5cGVNaXNtYXRjaCwKICAgICAgICB0ZW1wbGF0ZVN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlLAogICAgICAgIHRlbXBsYXRlV2ViTGl0ZXJhbENhbm5vdEJlUmVwcmVzZW50ZWRFeGFjdGx5OwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IGdldEZpbGVVcmksIHVuaGFuZGxlZCwgdW5zdXBwb3J0ZWQ7CgppbXBvcnQgJy4uL3NvdXJjZS9zb3VyY2VfY2xhc3NfYnVpbGRlci5kYXJ0JyBzaG93IFNvdXJjZUNsYXNzQnVpbGRlcjsKCmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2UvaW5mZXJlbmNlX2hlbHBlci5kYXJ0JyBzaG93IEluZmVyZW5jZUhlbHBlcjsKCmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2UvaW50ZXJmYWNlX3Jlc29sdmVyLmRhcnQnIHNob3cgSW50ZXJmYWNlUmVzb2x2ZXI7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfaW5mZXJlbmNlX2VuZ2luZS5kYXJ0JwogICAgc2hvdyBJbmNsdWRlc1R5cGVQYXJhbWV0ZXJzQ292YXJpYW50bHksIEluZmVyZW5jZU5vZGUsIFR5cGVJbmZlcmVuY2VFbmdpbmU7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfaW5mZXJyZXIuZGFydCcKICAgIHNob3cgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCwgVHlwZUluZmVycmVyLCBUeXBlSW5mZXJyZXJJbXBsOwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX3Byb21vdGlvbi5kYXJ0JwogICAgc2hvdyBUeXBlUHJvbW90ZXIsIFR5cGVQcm9tb3RlckltcGwsIFR5cGVQcm9tb3Rpb25GYWN0LCBUeXBlUHJvbW90aW9uU2NvcGU7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfc2NoZW1hLmRhcnQnIHNob3cgVW5rbm93blR5cGU7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfc2NoZW1hX2VsaW1pbmF0aW9uLmRhcnQnIHNob3cgZ3JlYXRlc3RDbG9zdXJlOwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX3NjaGVtYV9lbnZpcm9ubWVudC5kYXJ0JwogICAgc2hvdyBUeXBlU2NoZW1hRW52aXJvbm1lbnQsIGdldFBvc2l0aW9uYWxQYXJhbWV0ZXJUeXBlOwoKaW1wb3J0ICdib2R5X2J1aWxkZXIuZGFydCcgc2hvdyBjb21iaW5lU3RhdGVtZW50czsKCmltcG9ydCAnY29sbGVjdGlvbnMuZGFydCcKICAgIHNob3cKICAgICAgICBDb250cm9sRmxvd01hcEVudHJ5LAogICAgICAgIEZvckVsZW1lbnQsCiAgICAgICAgRm9ySW5FbGVtZW50LAogICAgICAgIEZvckluTWFwRW50cnksCiAgICAgICAgRm9yTWFwRW50cnksCiAgICAgICAgSWZFbGVtZW50LAogICAgICAgIElmTWFwRW50cnksCiAgICAgICAgU3ByZWFkRWxlbWVudCwKICAgICAgICBTcHJlYWRNYXBFbnRyeSwKICAgICAgICBjb252ZXJ0VG9FbGVtZW50OwoKaW1wb3J0ICdpbXBsaWNpdF90eXBlX2FyZ3VtZW50LmRhcnQnIHNob3cgSW1wbGljaXRUeXBlQXJndW1lbnQ7CgppbXBvcnQgJ2tlcm5lbF9idWlsZGVyLmRhcnQnIHNob3cgS2VybmVsTGlicmFyeUJ1aWxkZXI7CgppbXBvcnQgJ2tlcm5lbF9leHByZXNzaW9uX2dlbmVyYXRvci5kYXJ0JyBzaG93IG1ha2VMZXQ7CgpwYXJ0ICJpbmZlcmVuY2VfdmlzaXRvci5kYXJ0IjsKcGFydCAiaW5mZXJyZWRfdHlwZV92aXNpdG9yLmRhcnQiOwoKLy8vIENvbXB1dGVzIHRoZSByZXR1cm4gdHlwZSBvZiBhIChwb3NzaWJseSBmYWN0b3J5KSBjb25zdHJ1Y3Rvci4KSW50ZXJmYWNlVHlwZSBjb21wdXRlQ29uc3RydWN0b3JSZXR1cm5UeXBlKE1lbWJlciBjb25zdHJ1Y3RvcikgewogIGlmIChjb25zdHJ1Y3RvciBpcyBDb25zdHJ1Y3RvcikgewogICAgcmV0dXJuIGNvbnN0cnVjdG9yLmVuY2xvc2luZ0NsYXNzLnRoaXNUeXBlOwogIH0gZWxzZSB7CiAgICByZXR1cm4gY29uc3RydWN0b3IuZnVuY3Rpb24ucmV0dXJuVHlwZTsKICB9Cn0KCkxpc3Q8RGFydFR5cGU+IGdldEV4cGxpY2l0VHlwZUFyZ3VtZW50cyhBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgaWYgKGFyZ3VtZW50cyBpcyBBcmd1bWVudHNKdWRnbWVudCkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5faGFzRXhwbGljaXRUeXBlQXJndW1lbnRzID8gYXJndW1lbnRzLnR5cGVzIDogbnVsbDsKICB9IGVsc2UgewogICAgLy8gVGhpcyBjb2RlIHBhdGggc2hvdWxkIG9ubHkgYmUgdGFrZW4gaW4gc2l0dWF0aW9ucyB3aGVyZSB0aGVyZSBhcmUgbm8KICAgIC8vIHR5cGUgYXJndW1lbnRzIGF0IGFsbCwgZS5nLiBjYWxsaW5nIGEgdXNlci1kZWZpbmFibGUgb3BlcmF0b3IuCiAgICBhc3NlcnQoYXJndW1lbnRzLnR5cGVzLmlzRW1wdHkpOwogICAgcmV0dXJuIG51bGw7CiAgfQp9CgovLy8gSW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgY2xhc3MgZHVyaW5nIHR5cGUgaW5mZXJlbmNlLgpjbGFzcyBDbGFzc0luZmVyZW5jZUluZm8gewogIC8vLyBUaGUgYnVpbGRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGFzcy4KICBmaW5hbCBTb3VyY2VDbGFzc0J1aWxkZXIgYnVpbGRlcjsKCiAgLy8vIFRoZSB2aXNpdG9yIGZvciBkZXRlcm1pbmluZyBpZiBhIGdpdmVuIHR5cGUgbWFrZXMgY292YXJpYW50IHVzZSBvZiBvbmUgb2YKICAvLy8gdGhlIGNsYXNzJ3MgZ2VuZXJpYyBwYXJhbWV0ZXJzLCBhbmQgdGhlcmVmb3JlIHJlcXVpcmVzIGNvdmFyaWFudCBjaGVja3MuCiAgSW5jbHVkZXNUeXBlUGFyYW1ldGVyc0NvdmFyaWFudGx5IG5lZWRzQ2hlY2tWaXNpdG9yOwoKICAvLy8gR2V0dGVycyBhbmQgbWV0aG9kcyBpbiB0aGUgY2xhc3MncyBBUEkuICBNYXkgaW5jbHVkZSBmb3J3YXJkaW5nIG5vZGVzLgogIGZpbmFsIGdldHRlcnNBbmRNZXRob2RzID0gPE1lbWJlcj5bXTsKCiAgLy8vIFNldHRlcnMgaW4gdGhlIGNsYXNzJ3MgQVBJLiAgTWF5IGluY2x1ZGUgZm9yd2FyZGluZyBub2Rlcy4KICBmaW5hbCBzZXR0ZXJzID0gPE1lbWJlcj5bXTsKCiAgQ2xhc3NJbmZlcmVuY2VJbmZvKHRoaXMuYnVpbGRlcik7Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIHNldCBvZiBpbnZvY2F0aW9uIGFyZ3VtZW50cy4KY2xhc3MgQXJndW1lbnRzSnVkZ21lbnQgZXh0ZW5kcyBBcmd1bWVudHMgewogIGJvb2wgX2hhc0V4cGxpY2l0VHlwZUFyZ3VtZW50czsKCiAgTGlzdDxFeHByZXNzaW9uPiBnZXQgcG9zaXRpb25hbEp1ZGdtZW50cyA9PiBwb3NpdGlvbmFsLmNhc3QoKTsKCiAgQXJndW1lbnRzSnVkZ21lbnQoTGlzdDxFeHByZXNzaW9uPiBwb3NpdGlvbmFsLAogICAgICB7TGlzdDxEYXJ0VHlwZT4gdHlwZXMsIExpc3Q8TmFtZWRFeHByZXNzaW9uPiBuYW1lZH0pCiAgICAgIDogX2hhc0V4cGxpY2l0VHlwZUFyZ3VtZW50cyA9IHR5cGVzICE9IG51bGwgJiYgdHlwZXMuaXNOb3RFbXB0eSwKICAgICAgICBzdXBlcihwb3NpdGlvbmFsLCB0eXBlczogdHlwZXMsIG5hbWVkOiBuYW1lZCk7CgogIHN0YXRpYyB2b2lkIHNldE5vbkluZmVycmFibGVBcmd1bWVudFR5cGVzKAogICAgICBBcmd1bWVudHNKdWRnbWVudCBhcmd1bWVudHMsIExpc3Q8RGFydFR5cGU+IHR5cGVzKSB7CiAgICBhcmd1bWVudHMudHlwZXMuY2xlYXIoKTsKICAgIGFyZ3VtZW50cy50eXBlcy5hZGRBbGwodHlwZXMpOwogICAgYXJndW1lbnRzLl9oYXNFeHBsaWNpdFR5cGVBcmd1bWVudHMgPSB0cnVlOwogIH0KCiAgc3RhdGljIHZvaWQgcmVtb3ZlTm9uSW5mZXJyYWJsZUFyZ3VtZW50VHlwZXMoQXJndW1lbnRzSnVkZ21lbnQgYXJndW1lbnRzKSB7CiAgICBhcmd1bWVudHMudHlwZXMuY2xlYXIoKTsKICAgIGFyZ3VtZW50cy5faGFzRXhwbGljaXRUeXBlQXJndW1lbnRzID0gZmFsc2U7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYW4gYXNzZXJ0IGluaXRpYWxpemVyIGluIGtlcm5lbCBmb3JtLgpjbGFzcyBBc3NlcnRJbml0aWFsaXplckp1ZGdtZW50IGV4dGVuZHMgQXNzZXJ0SW5pdGlhbGl6ZXIKICAgIGltcGxlbWVudHMgSW5pdGlhbGl6ZXJKdWRnbWVudCB7CiAgQXNzZXJ0SW5pdGlhbGl6ZXJKdWRnbWVudChBc3NlcnRTdGF0ZW1lbnQgc3RhdGVtZW50KSA6IHN1cGVyKHN0YXRlbWVudCk7CgogIEFzc2VydFN0YXRlbWVudEp1ZGdtZW50IGdldCBqdWRnbWVudCA9PiBzdGF0ZW1lbnQ7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRBc3NlcnRJbml0aWFsaXplckp1ZGdtZW50KHRoaXMpOwogIH0KfQoKLy8vIENvbmNyZXRlIHNoYWRvdyBvYmplY3QgcmVwcmVzZW50aW5nIGFuIGFzc2VydGlvbiBzdGF0ZW1lbnQgaW4ga2VybmVsIGZvcm0uCmNsYXNzIEFzc2VydFN0YXRlbWVudEp1ZGdtZW50IGV4dGVuZHMgQXNzZXJ0U3RhdGVtZW50CiAgICBpbXBsZW1lbnRzIFN0YXRlbWVudEp1ZGdtZW50IHsKICBBc3NlcnRTdGF0ZW1lbnRKdWRnbWVudChFeHByZXNzaW9uIGNvbmRpdGlvbiwKICAgICAge0V4cHJlc3Npb24gbWVzc2FnZSwgaW50IGNvbmRpdGlvblN0YXJ0T2Zmc2V0LCBpbnQgY29uZGl0aW9uRW5kT2Zmc2V0fSkKICAgICAgOiBzdXBlcihjb25kaXRpb24sCiAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsCiAgICAgICAgICAgIGNvbmRpdGlvblN0YXJ0T2Zmc2V0OiBjb25kaXRpb25TdGFydE9mZnNldCwKICAgICAgICAgICAgY29uZGl0aW9uRW5kT2Zmc2V0OiBjb25kaXRpb25FbmRPZmZzZXQpOwoKICBFeHByZXNzaW9uIGdldCBjb25kaXRpb25KdWRnbWVudCA9PiBjb25kaXRpb247CgogIEV4cHJlc3Npb24gZ2V0IG1lc3NhZ2VKdWRnbWVudCA9PiBtZXNzYWdlOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0QXNzZXJ0U3RhdGVtZW50SnVkZ21lbnQodGhpcyk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYSBzdGF0ZW1lbnQgYmxvY2sgaW4ga2VybmVsIGZvcm0uCmNsYXNzIEJsb2NrSnVkZ21lbnQgZXh0ZW5kcyBCbG9jayBpbXBsZW1lbnRzIFN0YXRlbWVudEp1ZGdtZW50IHsKICBCbG9ja0p1ZGdtZW50KExpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzKSA6IHN1cGVyKHN0YXRlbWVudHMpOwoKICBMaXN0PFN0YXRlbWVudD4gZ2V0IGp1ZGdtZW50cyA9PiBzdGF0ZW1lbnRzOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0QmxvY2tKdWRnbWVudCh0aGlzKTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIGNhc2NhZGUgZXhwcmVzc2lvbi4KLy8vCi8vLyBBIGNhc2NhZGUgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSBgYS4uYigpLi5jKClgIGlzIHJlcHJlc2VudGVkIGFzIHRoZSBrZXJuZWwKLy8vIGV4cHJlc3Npb246Ci8vLwovLy8gICAgIGxldCB2ID0gYSBpbgovLy8gICAgICAgICBsZXQgXyA9IHYuYigpIGluCi8vLyAgICAgICAgICAgICBsZXQgXyA9IHYuYygpIGluCi8vLyAgICAgICAgICAgICAgICAgdgovLy8KLy8vIEluIHRoZSBkb2N1bWVudGF0aW9uIHRoYXQgZm9sbG93cywgYHZgIGlzIHJlZmVycmVkIHRvIGFzIHRoZSAiY2FzY2FkZQovLy8gdmFyaWFibGUiLS10aGlzIGlzIHRoZSB2YXJpYWJsZSB0aGF0IHJlbWVtYmVycyB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24KLy8vIHByZWNlZGluZyB0aGUgZmlyc3QgYC4uYCB3aGlsZSB0aGUgY2FzY2FkZXMgYXJlIGJlaW5nIGV2YWx1YXRlZC4KLy8vCi8vLyBBZnRlciBjb25zdHJ1Y3RpbmcgYSBbQ2FzY2FkZUp1ZGdtZW50XSwgdGhlIGNhbGxlciBzaG91bGQKLy8vIGNhbGwgW2ZpbmFsaXplXSB3aXRoIGFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBleHByZXNzaW9uIGFmdGVyIHRoZQovLy8gYC4uYC4gIElmIGEgZnVydGhlciBgLi5gIGZvbGxvd3MgdGhhdCBleHByZXNzaW9uLCB0aGUgY2FsbGVyIHNob3VsZCBjYWxsCi8vLyBbZXh0ZW5kXSBmb2xsb3dlZCBieSBbZmluYWxpemVdIGZvciBlYWNoIHN1YnNlcXVlbnQgY2FzY2FkZS4KY2xhc3MgQ2FzY2FkZUp1ZGdtZW50IGV4dGVuZHMgTGV0IGltcGxlbWVudHMgRXhwcmVzc2lvbkp1ZGdtZW50IHsKICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CgogIC8vLyBQb2ludGVyIHRvIHRoZSBsYXN0ICJsZXQiIGV4cHJlc3Npb24gaW4gdGhlIGNhc2NhZGUuCiAgTGV0IG5leHRDYXNjYWRlOwoKICAvLy8gQ3JlYXRlcyBhIFtDYXNjYWRlSnVkZ21lbnRdIHVzaW5nIFt2YXJpYWJsZV0gYXMgdGhlIGNhc2NhZGUKICAvLy8gdmFyaWFibGUuICBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgW3ZhcmlhYmxlXSdzCiAgLy8vIGluaXRpYWxpemVyIGlzIHRoZSBleHByZXNzaW9uIHByZWNlZGluZyB0aGUgZmlyc3QgYC4uYCBvZiB0aGUgY2FzY2FkZQogIC8vLyBleHByZXNzaW9uLgogIENhc2NhZGVKdWRnbWVudChWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQgdmFyaWFibGUpCiAgICAgIDogc3VwZXIoCiAgICAgICAgICAgIHZhcmlhYmxlLAogICAgICAgICAgICBtYWtlTGV0KG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKG5ldyBfVW5maW5pc2hlZENhc2NhZGUoKSksCiAgICAgICAgICAgICAgICBuZXcgVmFyaWFibGVHZXQodmFyaWFibGUpKSkgewogICAgbmV4dENhc2NhZGUgPSBib2R5OwogIH0KCiAgRXhwcmVzc2lvbiBnZXQgdGFyZ2V0SnVkZ21lbnQgPT4gdmFyaWFibGUuaW5pdGlhbGl6ZXI7CgogIEl0ZXJhYmxlPEV4cHJlc3Npb24+IGdldCBjYXNjYWRlSnVkZ21lbnRzIHN5bmMqIHsKICAgIExldCBzZWN0aW9uID0gYm9keTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIHlpZWxkIHNlY3Rpb24udmFyaWFibGUuaW5pdGlhbGl6ZXI7CiAgICAgIGlmIChzZWN0aW9uLmJvZHkgaXMhIExldCkgYnJlYWs7CiAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLmJvZHk7CiAgICB9CiAgfQoKICAvLy8gQWRkcyBhIG5ldyB1bmZpbmFsaXplZCBzZWN0aW9uIHRvIHRoZSBlbmQgb2YgdGhlIGNhc2NhZGUuICBTaG91bGQgYmUKICAvLy8gY2FsbGVkIGFmdGVyIHRoZSBwcmV2aW91cyBjYXNjYWRlIHNlY3Rpb24gaGFzIGJlZW4gZmluYWxpemVkLgogIHZvaWQgZXh0ZW5kKCkgewogICAgYXNzZXJ0KG5leHRDYXNjYWRlLnZhcmlhYmxlLmluaXRpYWxpemVyIGlzISBfVW5maW5pc2hlZENhc2NhZGUpOwogICAgTGV0IG5ld0Nhc2NhZGUgPSBtYWtlTGV0KAogICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKG5ldyBfVW5maW5pc2hlZENhc2NhZGUoKSksCiAgICAgICAgbmV4dENhc2NhZGUuYm9keSk7CiAgICBuZXh0Q2FzY2FkZS5ib2R5ID0gbmV3Q2FzY2FkZTsKICAgIG5ld0Nhc2NhZGUucGFyZW50ID0gbmV4dENhc2NhZGU7CiAgICBuZXh0Q2FzY2FkZSA9IG5ld0Nhc2NhZGU7CiAgfQoKICAvLy8gRmluYWxpemVzIHRoZSBsYXN0IGNhc2NhZGUgc2VjdGlvbiB3aXRoIHRoZSBnaXZlbiBbZXhwcmVzc2lvbl0uCiAgdm9pZCBmaW5hbGl6ZShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKICAgIGFzc2VydChuZXh0Q2FzY2FkZS52YXJpYWJsZS5pbml0aWFsaXplciBpcyBfVW5maW5pc2hlZENhc2NhZGUpOwogICAgbmV4dENhc2NhZGUudmFyaWFibGUuaW5pdGlhbGl6ZXIgPSBleHByZXNzaW9uOwogICAgZXhwcmVzc2lvbi5wYXJlbnQgPSBuZXh0Q2FzY2FkZS52YXJpYWJsZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0Q2FzY2FkZUp1ZGdtZW50KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9Cn0KCi8vLyBTaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIGNsYXNzIGluIGtlcm5lbCBmb3JtLgpjbGFzcyBTaGFkb3dDbGFzcyBleHRlbmRzIENsYXNzIHsKICBDbGFzc0luZmVyZW5jZUluZm8gX2luZmVyZW5jZUluZm87CgogIFNoYWRvd0NsYXNzKAogICAgICB7U3RyaW5nIG5hbWUsCiAgICAgIFN1cGVydHlwZSBzdXBlcnR5cGUsCiAgICAgIFN1cGVydHlwZSBtaXhlZEluVHlwZSwKICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycywKICAgICAgTGlzdDxTdXBlcnR5cGU+IGltcGxlbWVudGVkVHlwZXMsCiAgICAgIExpc3Q8UHJvY2VkdXJlPiBwcm9jZWR1cmVzLAogICAgICBMaXN0PEZpZWxkPiBmaWVsZHN9KQogICAgICA6IHN1cGVyKAogICAgICAgICAgICBuYW1lOiBuYW1lLAogICAgICAgICAgICBzdXBlcnR5cGU6IHN1cGVydHlwZSwKICAgICAgICAgICAgbWl4ZWRJblR5cGU6IG1peGVkSW5UeXBlLAogICAgICAgICAgICB0eXBlUGFyYW1ldGVyczogdHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICAgIGltcGxlbWVudGVkVHlwZXM6IGltcGxlbWVudGVkVHlwZXMsCiAgICAgICAgICAgIHByb2NlZHVyZXM6IHByb2NlZHVyZXMsCiAgICAgICAgICAgIGZpZWxkczogZmllbGRzKTsKCiAgLy8vIFJlc29sdmVzIGFsbCBmb3J3YXJkaW5nIG5vZGVzIGZvciB0aGlzIGNsYXNzLCBwcm9wYWdhdGVzIGNvdmFyaWFuY2UKICAvLy8gYW5ub3RhdGlvbnMsIGFuZCBjcmVhdGVzIGZvcndhcmRpbmcgc3R1YnMgYXMgbmVlZGVkLgogIHZvaWQgZmluYWxpemVDb3ZhcmlhbmNlKEludGVyZmFjZVJlc29sdmVyIGludGVyZmFjZVJlc29sdmVyKSB7CiAgICBpbnRlcmZhY2VSZXNvbHZlci5maW5hbGl6ZUNvdmFyaWFuY2UoCiAgICAgICAgdGhpcywgX2luZmVyZW5jZUluZm8uZ2V0dGVyc0FuZE1ldGhvZHMsIF9pbmZlcmVuY2VJbmZvLmJ1aWxkZXIubGlicmFyeSk7CiAgICBpbnRlcmZhY2VSZXNvbHZlci5maW5hbGl6ZUNvdmFyaWFuY2UoCiAgICAgICAgdGhpcywgX2luZmVyZW5jZUluZm8uc2V0dGVycywgX2luZmVyZW5jZUluZm8uYnVpbGRlci5saWJyYXJ5KTsKICB9CgogIC8vLyBDcmVhdGVzIEFQSSBtZW1iZXJzIGZvciB0aGlzIGNsYXNzLgogIHZvaWQgc2V0dXBBcGlNZW1iZXJzKEludGVyZmFjZVJlc29sdmVyIGludGVyZmFjZVJlc29sdmVyKSB7CiAgICBpbnRlcmZhY2VSZXNvbHZlci5jcmVhdGVBcGlNZW1iZXJzKHRoaXMsIF9pbmZlcmVuY2VJbmZvLmdldHRlcnNBbmRNZXRob2RzLAogICAgICAgIF9pbmZlcmVuY2VJbmZvLnNldHRlcnMsIF9pbmZlcmVuY2VJbmZvLmJ1aWxkZXIubGlicmFyeSk7CiAgfQoKICBzdGF0aWMgdm9pZCBjbGVhckNsYXNzSW5mZXJlbmNlSW5mbyhTaGFkb3dDbGFzcyBjbGFzc18pIHsKICAgIGNsYXNzXy5faW5mZXJlbmNlSW5mbyA9IG51bGw7CiAgfQoKICBzdGF0aWMgQ2xhc3NJbmZlcmVuY2VJbmZvIGdldENsYXNzSW5mZXJlbmNlSW5mbyhDbGFzcyBjbGFzc18pIHsKICAgIGlmIChjbGFzc18gaXMgU2hhZG93Q2xhc3MpIHJldHVybiBjbGFzc18uX2luZmVyZW5jZUluZm87CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vLyBJbml0aWFsaXplcyB0aGUgY2xhc3MgaW5mZXJlbmNlIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4KICAvLy8gW2NsYXNzX10sIHN0YXJ0aW5nIHdpdGggdGhlIGZhY3QgdGhhdCBpdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuCiAgLy8vIFtidWlsZGVyXS4KICBzdGF0aWMgdm9pZCBzZXRCdWlsZGVyKFNoYWRvd0NsYXNzIGNsYXNzXywgU291cmNlQ2xhc3NCdWlsZGVyIGJ1aWxkZXIpIHsKICAgIGNsYXNzXy5faW5mZXJlbmNlSW5mbyA9IG5ldyBDbGFzc0luZmVyZW5jZUluZm8oYnVpbGRlcik7CiAgfQp9CgovLy8gQWJzdHJhY3Qgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYSBjb21wbGV4IGFzc2lnbm1lbnQgaW4ga2VybmVsIGZvcm0uCi8vLwovLy8gU2luY2UgdGhlcmUgYXJlIG1hbnkgZm9ybXMgYSBjb21wbGV4IGFzc2lnbm1lbnQgbWlnaHQgaGF2ZSBiZWVuIGRlc3VnYXJlZAovLy8gdG8sIHRoaXMgY2xhc3Mgd3JhcHMgdGhlIGRlc3VnYXJlZCBhc3NpZ25tZW50IHJhdGhlciB0aGFuIGV4dGVuZGluZyBpdC4KLy8vCi8vLyBUT0RPKHBhdWxiZXJyeSk6IG9uY2Ugd2Uga25vdyBleGFjdGx5IHdoYXQgY29uc3RpdHV0ZXMgYSAiY29tcGxleAovLy8gYXNzaWdubWVudCIsIGRvY3VtZW50IGl0IGhlcmUuCmFic3RyYWN0IGNsYXNzIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgZXh0ZW5kcyBTeW50aGV0aWNFeHByZXNzaW9uSnVkZ21lbnQgewogIC8vLyBJbiBhIGNvbXBvdW5kIGFzc2lnbm1lbnQsIHRoZSBleHByZXNzaW9uIHRoYXQgcmVhZHMgdGhlIG9sZCB2YWx1ZSwgb3IKICAvLy8gYG51bGxgIGlmIHRoaXMgaXMgbm90IGEgY29tcG91bmQgYXNzaWdubWVudC4KICBFeHByZXNzaW9uIHJlYWQ7CgogIC8vLyBUaGUgZXhwcmVzc2lvbiBhcHBlYXJpbmcgb24gdGhlIFJIUyBvZiB0aGUgYXNzaWdubWVudC4KICBmaW5hbCBFeHByZXNzaW9uIHJoczsKCiAgLy8vIFRoZSBleHByZXNzaW9uIHRoYXQgcGVyZm9ybXMgdGhlIHdyaXRlIChlLmcuIGBhLltdPShiLCBhLltdKGIpICsgMSlgIGluCiAgLy8vIGArK2FbYl1gKS4KICBFeHByZXNzaW9uIHdyaXRlOwoKICAvLy8gSW4gYSBjb21wb3VuZCBhc3NpZ25tZW50IHdpdGhvdXQgc2hvcnRjdXQgc2VtYW50aWNzLCB0aGUgZXhwcmVzc2lvbiB0aGF0CiAgLy8vIGNvbWJpbmVzIHRoZSBvbGQgYW5kIG5ldyB2YWx1ZXMsIG9yIGBudWxsYCBpZiB0aGlzIGlzIG5vdCBhIGNvbXBvdW5kCiAgLy8vIGFzc2lnbm1lbnQuCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCBpbiBhIGNvbXBvdW5kIGFzc2lnbm1lbnQgd2l0aCBzaG9ydGN1dCBzZW1hbnRpY3MsIHRoaXMgaXMgbm90CiAgLy8vIHVzZWQ7IFtudWxsQXdhcmVDb21iaW5lcl0gaXMgdXNlZCBpbnN0ZWFkLgogIE1ldGhvZEludm9jYXRpb24gY29tYmluZXI7CgogIC8vLyBJbiBhIGNvbXBvdW5kIGFzc2lnbm1lbnQgd2l0aCBzaG9ydGN1dCBzZW1hbnRpY3MsIHRoZSBjb25kaXRpb25hbAogIC8vLyBleHByZXNzaW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBhc3NpZ25tZW50IG9jY3Vycy4KICAvLy8KICAvLy8gTm90ZSB0aGF0IGluIGEgY29tcG91bmQgYXNzaWdubWVudCB3aXRob3V0IHNob3J0Y3V0IHNlbWFudGljcywgdGhpcyBpcyBub3QKICAvLy8gdXNlZDsgW2NvbWJpbmVyXSBpcyB1c2VkIGluc3RlYWQuCiAgQ29uZGl0aW9uYWxFeHByZXNzaW9uIG51bGxBd2FyZUNvbWJpbmVyOwoKICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGV4cHJlc3Npb24gYXJvc2UgZnJvbSBhIHBvc3QtaW5jcmVtZW50IG9yCiAgLy8vIHBvc3QtZGVjcmVtZW50LgogIGJvb2wgaXNQb3N0SW5jRGVjID0gZmFsc2U7CgogIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZXhwcmVzc2lvbiBhcm9zZSBmcm9tIGEgcHJlLWluY3JlbWVudCBvcgogIC8vLyBwcmUtZGVjcmVtZW50LgogIGJvb2wgaXNQcmVJbmNEZWMgPSBmYWxzZTsKCiAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudC5fKHRoaXMucmhzKSA6IHN1cGVyLl8obnVsbCk7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHZhciBwYXJ0cyA9IF9nZXRUb1N0cmluZ1BhcnRzKCk7CiAgICByZXR1cm4gJyR7cnVudGltZVR5cGV9KCR7cGFydHMuam9pbignLCAnKX0pJzsKICB9CgogIExpc3Q8U3RyaW5nPiBfZ2V0VG9TdHJpbmdQYXJ0cygpIHsKICAgIExpc3Q8U3RyaW5nPiBwYXJ0cyA9IFtdOwogICAgaWYgKGRlc3VnYXJlZCAhPSBudWxsKSBwYXJ0cy5hZGQoJ2Rlc3VnYXJlZD0kZGVzdWdhcmVkJyk7CiAgICBpZiAocmVhZCAhPSBudWxsKSBwYXJ0cy5hZGQoJ3JlYWQ9JHJlYWQnKTsKICAgIGlmIChyaHMgIT0gbnVsbCkgcGFydHMuYWRkKCdyaHM9JHJocycpOwogICAgaWYgKHdyaXRlICE9IG51bGwpIHBhcnRzLmFkZCgnd3JpdGU9JHdyaXRlJyk7CiAgICBpZiAoY29tYmluZXIgIT0gbnVsbCkgcGFydHMuYWRkKCdjb21iaW5lcj0kY29tYmluZXInKTsKICAgIGlmIChudWxsQXdhcmVDb21iaW5lciAhPSBudWxsKSB7CiAgICAgIHBhcnRzLmFkZCgnbnVsbEF3YXJlQ29tYmluZXI9JG51bGxBd2FyZUNvbWJpbmVyJyk7CiAgICB9CiAgICBpZiAoaXNQb3N0SW5jRGVjKSBwYXJ0cy5hZGQoJ2lzUG9zdEluY0RlYz10cnVlJyk7CiAgICBpZiAoaXNQcmVJbmNEZWMpIHBhcnRzLmFkZCgnaXNQcmVJbmNEZWM9dHJ1ZScpOwogICAgcmV0dXJuIHBhcnRzOwogIH0KCiAgX0NvbXBsZXhBc3NpZ25tZW50SW5mZXJlbmNlUmVzdWx0IF9pbmZlclJocygKICAgICAgU2hhZG93VHlwZUluZmVycmVyIGluZmVycmVyLCBEYXJ0VHlwZSByZWFkVHlwZSwgRGFydFR5cGUgd3JpdGVDb250ZXh0KSB7CiAgICBhc3NlcnQod3JpdGVDb250ZXh0ICE9IG51bGwpOwogICAgaWYgKHJlYWRUeXBlIGlzIFZvaWRUeXBlICYmCiAgICAgICAgKGNvbWJpbmVyICE9IG51bGwgfHwgbnVsbEF3YXJlQ29tYmluZXIgIT0gbnVsbCkpIHsKICAgICAgaW5mZXJyZXIuaGVscGVyCiAgICAgICAgICA/LmFkZFByb2JsZW0obWVzc2FnZVZvaWRFeHByZXNzaW9uLCByZWFkLmZpbGVPZmZzZXQsIG5vTGVuZ3RoKTsKICAgIH0KICAgIHZhciB3cml0ZU9mZnNldCA9IHdyaXRlID09IG51bGwgPyAtMSA6IHdyaXRlLmZpbGVPZmZzZXQ7CiAgICBQcm9jZWR1cmUgY29tYmluZXJNZW1iZXI7CiAgICBEYXJ0VHlwZSBjb21iaW5lZFR5cGU7CiAgICBpZiAoY29tYmluZXIgIT0gbnVsbCkgewogICAgICBib29sIGlzT3ZlcmxvYWRlZEFyaXRobWV0aWNPcGVyYXRvciA9IGZhbHNlOwogICAgICBjb21iaW5lck1lbWJlciA9IGluZmVycmVyLmZpbmRNZXRob2RJbnZvY2F0aW9uTWVtYmVyKHJlYWRUeXBlLCBjb21iaW5lciwKICAgICAgICAgIGluc3RydW1lbnRlZDogZmFsc2UpOwogICAgICBpZiAoY29tYmluZXJNZW1iZXIgaXMgUHJvY2VkdXJlKSB7CiAgICAgICAgaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yID0gaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50CiAgICAgICAgICAgIC5pc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3JBbmRUeXBlKGNvbWJpbmVyTWVtYmVyLCByZWFkVHlwZSk7CiAgICAgIH0KICAgICAgRGFydFR5cGUgcmhzVHlwZTsKICAgICAgdmFyIGNvbWJpbmVyVHlwZSA9IGluZmVycmVyLmdldENhbGxlZUZ1bmN0aW9uVHlwZSgKICAgICAgICAgIGluZmVycmVyLmdldENhbGxlZVR5cGUoY29tYmluZXJNZW1iZXIsIHJlYWRUeXBlKSwgZmFsc2UpOwogICAgICBpZiAoaXNQcmVJbmNEZWMgfHwgaXNQb3N0SW5jRGVjKSB7CiAgICAgICAgcmhzVHlwZSA9IGluZmVycmVyLmNvcmVUeXBlcy5pbnRDbGFzcy5yYXdUeXBlOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEl0J3Mgbm90IG5lY2Vzc2FyeSB0byBjYWxsIF9zdG9yZUxldFR5cGUgZm9yIFtyaHNdIGJlY2F1c2UgdGhlIFJIUwogICAgICAgIC8vIGlzIGFsd2F5cyBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIGNvbWJpbmVyOyBpdCdzIG5ldmVyIHN0b3JlZCBpbiBhCiAgICAgICAgLy8gdGVtcG9yYXJ5IHZhcmlhYmxlIGZpcnN0LgogICAgICAgIGFzc2VydChpZGVudGljYWwoY29tYmluZXIuYXJndW1lbnRzLnBvc2l0aW9uYWwuZmlyc3QsIHJocykpOwogICAgICAgIC8vIEFuYWx5emVyIHVzZXMgYSBudWxsIGNvbnRleHQgZm9yIHRoZSBSSFMgaGVyZS4KICAgICAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IGltcHJvdmUgb24gdGhpcy4KICAgICAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24ocmhzLCBjb25zdCBVbmtub3duVHlwZSgpLCB0cnVlKTsKICAgICAgICByaHNUeXBlID0gZ2V0SW5mZXJyZWRUeXBlKHJocywgaW5mZXJyZXIpOwogICAgICAgIC8vIERvIG5vdCB1c2UgcmhzIGFmdGVyIHRoaXMgcG9pbnQgYmVjYXVzZSBpdCBtYXkgYmUgYSBTaGFkb3cgbm9kZQogICAgICAgIC8vIHRoYXQgaGFzIGJlZW4gcmVwbGFjZWQgaW4gdGhlIHRyZWUgd2l0aCBpdHMgZGVzdWdhcmluZy4KICAgICAgICB2YXIgZXhwZWN0ZWRUeXBlID0gZ2V0UG9zaXRpb25hbFBhcmFtZXRlclR5cGUoY29tYmluZXJUeXBlLCAwKTsKICAgICAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKGV4cGVjdGVkVHlwZSwgcmhzVHlwZSwKICAgICAgICAgICAgY29tYmluZXIuYXJndW1lbnRzLnBvc2l0aW9uYWwuZmlyc3QsIGNvbWJpbmVyLmZpbGVPZmZzZXQpOwogICAgICB9CiAgICAgIGlmIChpc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3IpIHsKICAgICAgICBjb21iaW5lZFR5cGUgPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAgICAgLmdldFR5cGVPZk92ZXJsb2FkZWRBcml0aG1ldGljKHJlYWRUeXBlLCByaHNUeXBlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb21iaW5lZFR5cGUgPSBjb21iaW5lclR5cGUucmV0dXJuVHlwZTsKICAgICAgfQogICAgICB2YXIgY2hlY2tLaW5kID0gaW5mZXJyZXIucHJlQ2hlY2tJbnZvY2F0aW9uQ29udHJhdmFyaWFuY2UocmVhZCwgcmVhZFR5cGUsCiAgICAgICAgICBjb21iaW5lck1lbWJlciwgY29tYmluZXIsIGNvbWJpbmVyLmFyZ3VtZW50cywgY29tYmluZXIpOwogICAgICB2YXIgcmVwbGFjZWRDb21iaW5lciA9IGluZmVycmVyLmhhbmRsZUludm9jYXRpb25Db250cmF2YXJpYW5jZSgKICAgICAgICAgIGNoZWNrS2luZCwKICAgICAgICAgIGNvbWJpbmVyLAogICAgICAgICAgY29tYmluZXIuYXJndW1lbnRzLAogICAgICAgICAgY29tYmluZXIsCiAgICAgICAgICBjb21iaW5lZFR5cGUsCiAgICAgICAgICBjb21iaW5lclR5cGUsCiAgICAgICAgICBjb21iaW5lci5maWxlT2Zmc2V0KTsKICAgICAgdmFyIHJlcGxhY2VkQ29tYmluZXIyID0gaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZSgKICAgICAgICAgIHdyaXRlQ29udGV4dCwgY29tYmluZWRUeXBlLCByZXBsYWNlZENvbWJpbmVyLCB3cml0ZU9mZnNldCk7CiAgICAgIGlmIChyZXBsYWNlZENvbWJpbmVyMiAhPSBudWxsKSB7CiAgICAgICAgcmVwbGFjZWRDb21iaW5lciA9IHJlcGxhY2VkQ29tYmluZXIyOwogICAgICB9CiAgICAgIF9zdG9yZUxldFR5cGUoaW5mZXJyZXIsIHJlcGxhY2VkQ29tYmluZXIsIGNvbWJpbmVkVHlwZSk7CiAgICB9IGVsc2UgewogICAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24ocmhzLCB3cml0ZUNvbnRleHQgPz8gY29uc3QgVW5rbm93blR5cGUoKSwgdHJ1ZSwKICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgICB2YXIgcmhzVHlwZSA9IGdldEluZmVycmVkVHlwZShyaHMsIGluZmVycmVyKTsKICAgICAgdmFyIHJlcGxhY2VkUmhzID0gaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZSgKICAgICAgICAgIHdyaXRlQ29udGV4dCwgcmhzVHlwZSwgcmhzLCB3cml0ZU9mZnNldCwKICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHdyaXRlQ29udGV4dCBpcyBWb2lkVHlwZSk7CiAgICAgIF9zdG9yZUxldFR5cGUoaW5mZXJyZXIsIHJlcGxhY2VkUmhzID8/IHJocywgcmhzVHlwZSk7CiAgICAgIGlmIChudWxsQXdhcmVDb21iaW5lciAhPSBudWxsKSB7CiAgICAgICAgTWV0aG9kSW52b2NhdGlvbiBlcXVhbHNJbnZvY2F0aW9uID0gbnVsbEF3YXJlQ29tYmluZXIuY29uZGl0aW9uOwogICAgICAgIGluZmVycmVyLmZpbmRNZXRob2RJbnZvY2F0aW9uTWVtYmVyKAogICAgICAgICAgICBncmVhdGVzdENsb3N1cmUoaW5mZXJyZXIuY29yZVR5cGVzLCB3cml0ZUNvbnRleHQpLCBlcXVhbHNJbnZvY2F0aW9uLAogICAgICAgICAgICBpbnN0cnVtZW50ZWQ6IGZhbHNlKTsKICAgICAgICAvLyBOb3RlOiB0aGUgY2FzZSBvZiByZWFkVHlwZT1udWxsIG9ubHkgaGFwcGVucyBmb3IgZXJyb25lb3VzIGNvZGUuCiAgICAgICAgY29tYmluZWRUeXBlID0gcmVhZFR5cGUgPT0gbnVsbAogICAgICAgICAgICA/IHJoc1R5cGUKICAgICAgICAgICAgOiBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAgICAgICAgIC5nZXRTdGFuZGFyZFVwcGVyQm91bmQocmVhZFR5cGUsIHJoc1R5cGUpOwogICAgICAgIG51bGxBd2FyZUNvbWJpbmVyLnN0YXRpY1R5cGUgPSBjb21iaW5lZFR5cGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29tYmluZWRUeXBlID0gcmhzVHlwZTsKICAgICAgfQogICAgfQogICAgaWYgKHRoaXMgaXMgSW5kZXhBc3NpZ25tZW50SnVkZ21lbnQpIHsKICAgICAgX3N0b3JlTGV0VHlwZShpbmZlcnJlciwgd3JpdGUsIGNvbnN0IFZvaWRUeXBlKCkpOwogICAgfSBlbHNlIHsKICAgICAgX3N0b3JlTGV0VHlwZShpbmZlcnJlciwgd3JpdGUsIGNvbWJpbmVkVHlwZSk7CiAgICB9CiAgICBpbmZlcnJlZFR5cGUgPQogICAgICAgIGlzUG9zdEluY0RlYyA/IChyZWFkVHlwZSA/PyBjb25zdCBEeW5hbWljVHlwZSgpKSA6IGNvbWJpbmVkVHlwZTsKICAgIHJldHVybiBuZXcgX0NvbXBsZXhBc3NpZ25tZW50SW5mZXJlbmNlUmVzdWx0KGNvbWJpbmVyTWVtYmVyKTsKICB9Cn0KCi8vLyBBYnN0cmFjdCBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIGNvbXBsZXggYXNzaWdubWVudCBpbnZvbHZpbmcgYQovLy8gcmVjZWl2ZXIuCmFic3RyYWN0IGNsYXNzIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnRXaXRoUmVjZWl2ZXIKICAgIGV4dGVuZHMgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCB7CiAgLy8vIFRoZSByZWNlaXZlciBvZiB0aGUgYXNzaWdubWVudCB0YXJnZXQgKGUuZy4gYGFgIGluIGBhW2JdID0gY2ApLgogIGZpbmFsIEV4cHJlc3Npb24gcmVjZWl2ZXI7CgogIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGFzc2lnbm1lbnQgdXNlcyBgc3VwZXJgLgogIGZpbmFsIGJvb2wgaXNTdXBlcjsKCiAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudFdpdGhSZWNlaXZlci5fKAogICAgICB0aGlzLnJlY2VpdmVyLCBFeHByZXNzaW9uIHJocywgdGhpcy5pc1N1cGVyKQogICAgICA6IHN1cGVyLl8ocmhzKTsKCiAgQG92ZXJyaWRlCiAgTGlzdDxTdHJpbmc+IF9nZXRUb1N0cmluZ1BhcnRzKCkgewogICAgdmFyIHBhcnRzID0gc3VwZXIuX2dldFRvU3RyaW5nUGFydHMoKTsKICAgIGlmIChyZWNlaXZlciAhPSBudWxsKSBwYXJ0cy5hZGQoJ3JlY2VpdmVyPSRyZWNlaXZlcicpOwogICAgaWYgKGlzU3VwZXIpIHBhcnRzLmFkZCgnaXNTdXBlcj10cnVlJyk7CiAgICByZXR1cm4gcGFydHM7CiAgfQoKICBEYXJ0VHlwZSBfaW5mZXJSZWNlaXZlcihTaGFkb3dUeXBlSW5mZXJyZXIgaW5mZXJyZXIpIHsKICAgIGlmIChyZWNlaXZlciAhPSBudWxsKSB7CiAgICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihyZWNlaXZlciwgY29uc3QgVW5rbm93blR5cGUoKSwgdHJ1ZSk7CiAgICAgIHZhciByZWNlaXZlclR5cGUgPSBnZXRJbmZlcnJlZFR5cGUocmVjZWl2ZXIsIGluZmVycmVyKTsKICAgICAgX3N0b3JlTGV0VHlwZShpbmZlcnJlciwgcmVjZWl2ZXIsIHJlY2VpdmVyVHlwZSk7CiAgICAgIHJldHVybiByZWNlaXZlclR5cGU7CiAgICB9IGVsc2UgaWYgKGlzU3VwZXIpIHsKICAgICAgcmV0dXJuIGluZmVycmVyLmNsYXNzSGllcmFyY2h5LmdldFR5cGVBc0luc3RhbmNlT2YoCiAgICAgICAgICBpbmZlcnJlci50aGlzVHlwZSwgaW5mZXJyZXIudGhpc1R5cGUuY2xhc3NOb2RlLnN1cGVydHlwZS5jbGFzc05vZGUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGluZmVycmVyLnRoaXNUeXBlOwogICAgfQogIH0KfQoKLy8vIENvbmNyZXRlIHNoYWRvdyBvYmplY3QgcmVwcmVzZW50aW5nIGEgY29udGludWUgc3RhdGVtZW50IGZyb20gYSBzd2l0Y2gKLy8vIHN0YXRlbWVudCwgaW4ga2VybmVsIGZvcm0uCmNsYXNzIENvbnRpbnVlU3dpdGNoSnVkZ21lbnQgZXh0ZW5kcyBDb250aW51ZVN3aXRjaFN0YXRlbWVudAogICAgaW1wbGVtZW50cyBTdGF0ZW1lbnRKdWRnbWVudCB7CiAgQ29udGludWVTd2l0Y2hKdWRnbWVudChTd2l0Y2hDYXNlIHRhcmdldCkgOiBzdXBlcih0YXJnZXQpOwoKICBTd2l0Y2hDYXNlSnVkZ21lbnQgZ2V0IHRhcmdldEp1ZGdtZW50ID0+IHRhcmdldDsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdENvbnRpbnVlU3dpdGNoSnVkZ21lbnQodGhpcyk7CiAgfQp9CgovLy8gU2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYSBkZWZlcnJlZCBjaGVjayBpbiBrZXJuZWwgZm9ybS4KY2xhc3MgRGVmZXJyZWRDaGVja0p1ZGdtZW50IGV4dGVuZHMgTGV0IGltcGxlbWVudHMgRXhwcmVzc2lvbkp1ZGdtZW50IHsKICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CgogIERlZmVycmVkQ2hlY2tKdWRnbWVudChWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBFeHByZXNzaW9uIGJvZHkpCiAgICAgIDogc3VwZXIodmFyaWFibGUsIGJvZHkpOwoKICBFeHByZXNzaW9uIGdldCBqdWRnbWVudCA9PiBib2R5OwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdERlZmVycmVkQ2hlY2tKdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYSBkbyBsb29wIGluIGtlcm5lbCBmb3JtLgpjbGFzcyBEb0p1ZGdtZW50IGV4dGVuZHMgRG9TdGF0ZW1lbnQgaW1wbGVtZW50cyBTdGF0ZW1lbnRKdWRnbWVudCB7CiAgRG9KdWRnbWVudChTdGF0ZW1lbnQgYm9keSwgRXhwcmVzc2lvbiBjb25kaXRpb24pIDogc3VwZXIoYm9keSwgY29uZGl0aW9uKTsKCiAgRXhwcmVzc2lvbiBnZXQgY29uZGl0aW9uSnVkZ21lbnQgPT4gY29uZGl0aW9uOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RG9KdWRnbWVudCh0aGlzKTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIGRvdWJsZSBsaXRlcmFsIGluIGtlcm5lbCBmb3JtLgpjbGFzcyBEb3VibGVKdWRnbWVudCBleHRlbmRzIERvdWJsZUxpdGVyYWwgaW1wbGVtZW50cyBFeHByZXNzaW9uSnVkZ21lbnQgewogIERhcnRUeXBlIGluZmVycmVkVHlwZTsKCiAgRG91YmxlSnVkZ21lbnQoZG91YmxlIHZhbHVlKSA6IHN1cGVyKHZhbHVlKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXREb3VibGVKdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gQ29tbW9uIGJhc2UgY2xhc3MgZm9yIHNoYWRvdyBvYmplY3RzIHJlcHJlc2VudGluZyBleHByZXNzaW9ucyBpbiBrZXJuZWwKLy8vIGZvcm0uCmFic3RyYWN0IGNsYXNzIEV4cHJlc3Npb25KdWRnbWVudCBleHRlbmRzIEV4cHJlc3Npb24gewogIERhcnRUeXBlIGluZmVycmVkVHlwZTsKCiAgLy8vIENhbGxzIGJhY2sgdG8gW2luZmVycmVyXSB0byBwZXJmb3JtIHR5cGUgaW5mZXJlbmNlIGZvciB3aGF0ZXZlciBjb25jcmV0ZQogIC8vLyB0eXBlIG9mIFtFeHByZXNzaW9uXSB0aGlzIGlzLgogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpOwp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYW4gZW1wdHkgc3RhdGVtZW50IGluIGtlcm5lbCBmb3JtLgpjbGFzcyBFbXB0eVN0YXRlbWVudEp1ZGdtZW50IGV4dGVuZHMgRW1wdHlTdGF0ZW1lbnQKICAgIGltcGxlbWVudHMgU3RhdGVtZW50SnVkZ21lbnQgewogIEVtcHR5U3RhdGVtZW50SnVkZ21lbnQoKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEVtcHR5U3RhdGVtZW50SnVkZ21lbnQodGhpcyk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnQgaW4ga2VybmVsIGZvcm0uCmNsYXNzIEV4cHJlc3Npb25TdGF0ZW1lbnRKdWRnbWVudCBleHRlbmRzIEV4cHJlc3Npb25TdGF0ZW1lbnQKICAgIGltcGxlbWVudHMgU3RhdGVtZW50SnVkZ21lbnQgewogIEV4cHJlc3Npb25TdGF0ZW1lbnRKdWRnbWVudChFeHByZXNzaW9uIGV4cHJlc3Npb24pIDogc3VwZXIoZXhwcmVzc2lvbik7CgogIEV4cHJlc3Npb24gZ2V0IGp1ZGdtZW50ID0+IGV4cHJlc3Npb247CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRFeHByZXNzaW9uU3RhdGVtZW50SnVkZ21lbnQodGhpcyk7CiAgfQp9CgovLy8gU2hhZG93IG9iamVjdCBmb3IgW1N0YXRpY0ludm9jYXRpb25dIHdoZW4gdGhlIHByb2NlZHVyZSBiZWluZyBpbnZva2VkIGlzIGEKLy8vIGZhY3RvcnkgY29uc3RydWN0b3IuCmNsYXNzIEZhY3RvcnlDb25zdHJ1Y3Rvckludm9jYXRpb25KdWRnbWVudCBleHRlbmRzIFN0YXRpY0ludm9jYXRpb24KICAgIGltcGxlbWVudHMgRXhwcmVzc2lvbkp1ZGdtZW50IHsKICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CgogIEZhY3RvcnlDb25zdHJ1Y3Rvckludm9jYXRpb25KdWRnbWVudCgKICAgICAgUHJvY2VkdXJlIHRhcmdldCwgQXJndW1lbnRzSnVkZ21lbnQgYXJndW1lbnRzLAogICAgICB7Ym9vbCBpc0NvbnN0OiBmYWxzZX0pCiAgICAgIDogc3VwZXIodGFyZ2V0LCBhcmd1bWVudHMsIGlzQ29uc3Q6IGlzQ29uc3QpOwoKICBBcmd1bWVudHNKdWRnbWVudCBnZXQgYXJndW1lbnRKdWRnbWVudHMgPT4gYXJndW1lbnRzOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEZhY3RvcnlDb25zdHJ1Y3Rvckludm9jYXRpb25KdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYSBmaWVsZCBpbiBrZXJuZWwgZm9ybS4KY2xhc3MgU2hhZG93RmllbGQgZXh0ZW5kcyBGaWVsZCBpbXBsZW1lbnRzIFNoYWRvd01lbWJlciB7CiAgQG92ZXJyaWRlCiAgSW5mZXJlbmNlTm9kZSBpbmZlcmVuY2VOb2RlOwoKICBTaGFkb3dUeXBlSW5mZXJyZXIgX3R5cGVJbmZlcnJlcjsKCiAgZmluYWwgYm9vbCBfaXNJbXBsaWNpdGx5VHlwZWQ7CgogIFNoYWRvd0ZpZWxkKE5hbWUgbmFtZSwgdGhpcy5faXNJbXBsaWNpdGx5VHlwZWQsIHtVcmkgZmlsZVVyaX0pCiAgICAgIDogc3VwZXIobmFtZSwgZmlsZVVyaTogZmlsZVVyaSkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXRJbmZlcnJlZFR5cGUoCiAgICAgIFR5cGVJbmZlcmVuY2VFbmdpbmUgZW5naW5lLCBVcmkgdXJpLCBEYXJ0VHlwZSBpbmZlcnJlZFR5cGUpIHsKICAgIHR5cGUgPSBpbmZlcnJlZFR5cGU7CiAgfQoKICBzdGF0aWMgYm9vbCBpc0ltcGxpY2l0bHlUeXBlZChTaGFkb3dGaWVsZCBmaWVsZCkgPT4gZmllbGQuX2lzSW1wbGljaXRseVR5cGVkOwoKICBzdGF0aWMgdm9pZCBzZXRJbmZlcmVuY2VOb2RlKFNoYWRvd0ZpZWxkIGZpZWxkLCBJbmZlcmVuY2VOb2RlIG5vZGUpIHsKICAgIGFzc2VydChmaWVsZC5pbmZlcmVuY2VOb2RlID09IG51bGwpOwogICAgZmllbGQuaW5mZXJlbmNlTm9kZSA9IG5vZGU7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYSBmaWVsZCBpbml0aWFsaXplciBpbiBrZXJuZWwgZm9ybS4KY2xhc3MgU2hhZG93RmllbGRJbml0aWFsaXplciBleHRlbmRzIEZpZWxkSW5pdGlhbGl6ZXIKICAgIGltcGxlbWVudHMgSW5pdGlhbGl6ZXJKdWRnbWVudCB7CiAgU2hhZG93RmllbGRJbml0aWFsaXplcihGaWVsZCBmaWVsZCwgRXhwcmVzc2lvbiB2YWx1ZSkgOiBzdXBlcihmaWVsZCwgdmFsdWUpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0U2hhZG93RmllbGRJbml0aWFsaXplcih0aGlzKTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIGNsYXNzaWMgZm9yIGxvb3AgaW4ga2VybmVsIGZvcm0uCmNsYXNzIEZvckp1ZGdtZW50IGV4dGVuZHMgRm9yU3RhdGVtZW50IGltcGxlbWVudHMgU3RhdGVtZW50SnVkZ21lbnQgewogIEZvckp1ZGdtZW50KExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gdmFyaWFibGVzLCBFeHByZXNzaW9uIGNvbmRpdGlvbiwKICAgICAgTGlzdDxFeHByZXNzaW9uPiB1cGRhdGVzLCBTdGF0ZW1lbnQgYm9keSkKICAgICAgOiBzdXBlcih2YXJpYWJsZXMgPz8gW10sIGNvbmRpdGlvbiwgdXBkYXRlcywgYm9keSk7CgogIEV4cHJlc3Npb24gZ2V0IGNvbmRpdGlvbkp1ZGdtZW50ID0+IGNvbmRpdGlvbjsKCiAgTGlzdDxFeHByZXNzaW9uPiBnZXQgdXBkYXRlSnVkZ21lbnRzID0+IHVwZGF0ZXMuY2FzdCgpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0Rm9ySnVkZ21lbnQodGhpcyk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYSBmdW5jdGlvbiBleHByZXNzaW9uIGluIGtlcm5lbCBmb3JtLgpjbGFzcyBGdW5jdGlvbk5vZGVKdWRnbWVudCBleHRlbmRzIEZ1bmN0aW9uTm9kZSB7CiAgRnVuY3Rpb25Ob2RlSnVkZ21lbnQoU3RhdGVtZW50IGJvZHksCiAgICAgIHtMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVycywKICAgICAgaW50IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgIERhcnRUeXBlIHJldHVyblR5cGU6IGNvbnN0IER5bmFtaWNUeXBlKCksCiAgICAgIEFzeW5jTWFya2VyIGFzeW5jTWFya2VyOiBBc3luY01hcmtlci5TeW5jLAogICAgICBBc3luY01hcmtlciBkYXJ0QXN5bmNNYXJrZXJ9KQogICAgICA6IHN1cGVyKGJvZHksCiAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzOiB0eXBlUGFyYW1ldGVycywKICAgICAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnM6IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgICAgICBuYW1lZFBhcmFtZXRlcnM6IG5hbWVkUGFyYW1ldGVycywKICAgICAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwKICAgICAgICAgICAgcmV0dXJuVHlwZTogcmV0dXJuVHlwZSwKICAgICAgICAgICAgYXN5bmNNYXJrZXI6IGFzeW5jTWFya2VyLAogICAgICAgICAgICBkYXJ0QXN5bmNNYXJrZXI6IGRhcnRBc3luY01hcmtlcik7Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIGxvY2FsIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGluIGtlcm5lbAovLy8gZm9ybS4KY2xhc3MgRnVuY3Rpb25EZWNsYXJhdGlvbkp1ZGdtZW50IGV4dGVuZHMgRnVuY3Rpb25EZWNsYXJhdGlvbgogICAgaW1wbGVtZW50cyBTdGF0ZW1lbnRKdWRnbWVudCB7CiAgYm9vbCBfaGFzSW1wbGljaXRSZXR1cm5UeXBlID0gZmFsc2U7CgogIEZ1bmN0aW9uRGVjbGFyYXRpb25KdWRnbWVudCgKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50IHZhcmlhYmxlLCBGdW5jdGlvbk5vZGVKdWRnbWVudCBmdW5jdGlvbikKICAgICAgOiBzdXBlcih2YXJpYWJsZSwgZnVuY3Rpb24pOwoKICBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQgZ2V0IHZhcmlhYmxlSnVkZ21lbnQgPT4gdmFyaWFibGU7CgogIEZ1bmN0aW9uTm9kZUp1ZGdtZW50IGdldCBmdW5jdGlvbkp1ZGdtZW50ID0+IGZ1bmN0aW9uOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbkp1ZGdtZW50KHRoaXMpOwogIH0KCiAgc3RhdGljIHZvaWQgc2V0SGFzSW1wbGljaXRSZXR1cm5UeXBlKAogICAgICBGdW5jdGlvbkRlY2xhcmF0aW9uSnVkZ21lbnQgZGVjbGFyYXRpb24sIGJvb2wgaGFzSW1wbGljaXRSZXR1cm5UeXBlKSB7CiAgICBkZWNsYXJhdGlvbi5faGFzSW1wbGljaXRSZXR1cm5UeXBlID0gaGFzSW1wbGljaXRSZXR1cm5UeXBlOwogIH0KfQoKLy8vIENvbmNyZXRlIHNoYWRvdyBvYmplY3QgcmVwcmVzZW50aW5nIGEgc3VwZXIgaW5pdGlhbGl6ZXIgaW4ga2VybmVsIGZvcm0uCmNsYXNzIEludmFsaWRTdXBlckluaXRpYWxpemVySnVkZ21lbnQgZXh0ZW5kcyBMb2NhbEluaXRpYWxpemVyCiAgICBpbXBsZW1lbnRzIEluaXRpYWxpemVySnVkZ21lbnQgewogIGZpbmFsIENvbnN0cnVjdG9yIHRhcmdldDsKICBmaW5hbCBBcmd1bWVudHNKdWRnbWVudCBhcmd1bWVudHNKdWRnbWVudDsKCiAgSW52YWxpZFN1cGVySW5pdGlhbGl6ZXJKdWRnbWVudCgKICAgICAgdGhpcy50YXJnZXQsIHRoaXMuYXJndW1lbnRzSnVkZ21lbnQsIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpCiAgICAgIDogc3VwZXIodmFyaWFibGUpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0SW52YWxpZFN1cGVySW5pdGlhbGl6ZXJKdWRnbWVudCh0aGlzKTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhbiBpZi1udWxsIGV4cHJlc3Npb24uCi8vLwovLy8gQW4gaWYtbnVsbCBleHByZXNzaW9uIG9mIHRoZSBmb3JtIGBhID8/IGJgIGlzIHJlcHJlc2VudGVkIGFzIHRoZSBrZXJuZWwKLy8vIGV4cHJlc3Npb246Ci8vLwovLy8gICAgIGxldCB2ID0gYSBpbiB2ID09IG51bGwgPyBiIDogdgpjbGFzcyBJZk51bGxKdWRnbWVudCBleHRlbmRzIExldCBpbXBsZW1lbnRzIEV4cHJlc3Npb25KdWRnbWVudCB7CiAgRGFydFR5cGUgaW5mZXJyZWRUeXBlOwoKICBJZk51bGxKdWRnbWVudChWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBFeHByZXNzaW9uIGJvZHkpCiAgICAgIDogc3VwZXIodmFyaWFibGUsIGJvZHkpOwoKICBAb3ZlcnJpZGUKICBDb25kaXRpb25hbEV4cHJlc3Npb24gZ2V0IGJvZHkgPT4gc3VwZXIuYm9keTsKCiAgLy8vIFJldHVybnMgdGhlIGV4cHJlc3Npb24gdG8gdGhlIGxlZnQgb2YgYD8/YC4KICBFeHByZXNzaW9uIGdldCBsZWZ0SnVkZ21lbnQgPT4gdmFyaWFibGUuaW5pdGlhbGl6ZXI7CgogIC8vLyBSZXR1cm5zIHRoZSBleHByZXNzaW9uIHRvIHRoZSByaWdodCBvZiBgPz9gLgogIEV4cHJlc3Npb24gZ2V0IHJpZ2h0SnVkZ21lbnQgPT4gYm9keS50aGVuOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdElmTnVsbEp1ZGdtZW50KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhbiBpZiBzdGF0ZW1lbnQgaW4ga2VybmVsIGZvcm0uCmNsYXNzIElmSnVkZ21lbnQgZXh0ZW5kcyBJZlN0YXRlbWVudCBpbXBsZW1lbnRzIFN0YXRlbWVudEp1ZGdtZW50IHsKICBJZkp1ZGdtZW50KEV4cHJlc3Npb24gY29uZGl0aW9uLCBTdGF0ZW1lbnQgdGhlbiwgU3RhdGVtZW50IG90aGVyd2lzZSkKICAgICAgOiBzdXBlcihjb25kaXRpb24sIHRoZW4sIG90aGVyd2lzZSk7CgogIEV4cHJlc3Npb24gZ2V0IGNvbmRpdGlvbkp1ZGdtZW50ID0+IGNvbmRpdGlvbjsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdElmSnVkZ21lbnQodGhpcyk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYW4gYXNzaWdubWVudCB0byBhIHRhcmdldCBmb3Igd2hpY2gKLy8vIGFzc2lnbm1lbnQgaXMgbm90IGFsbG93ZWQuCmNsYXNzIElsbGVnYWxBc3NpZ25tZW50SnVkZ21lbnQgZXh0ZW5kcyBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IHsKICAvLy8gVGhlIG9mZnNldCBhdCB3aGljaCB0aGUgaW52YWxpZCBhc3NpZ25tZW50IHNob3VsZCBiZSBzdG9yZWQuCiAgLy8vIElmIGAtMWAsIHRoZW4gdGhlcmUgaXMgbm8gc2VwYXJhdGUgbG9jYXRpb24gZm9yIGludmFsaWQgYXNzaWdubWVudC4KICBmaW5hbCBpbnQgYXNzaWdubWVudE9mZnNldDsKCiAgSWxsZWdhbEFzc2lnbm1lbnRKdWRnbWVudC5fKEV4cHJlc3Npb24gcmhzLCB7dGhpcy5hc3NpZ25tZW50T2Zmc2V0OiAtMX0pCiAgICAgIDogc3VwZXIuXyhyaHMpIHsKICAgIHJocy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRJbGxlZ2FsQXNzaWdubWVudEp1ZGdtZW50KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhbiBhc3NpZ25tZW50IHRvIGEgdGFyZ2V0IG9mIHRoZSBmb3JtCi8vLyBgYVtiXWAuCmNsYXNzIEluZGV4QXNzaWdubWVudEp1ZGdtZW50IGV4dGVuZHMgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudFdpdGhSZWNlaXZlciB7CiAgLy8vIEluIGFuIGFzc2lnbm1lbnQgdG8gYW4gaW5kZXggZXhwcmVzc2lvbiwgdGhlIGluZGV4IGV4cHJlc3Npb24uCiAgZmluYWwgRXhwcmVzc2lvbiBpbmRleDsKCiAgSW5kZXhBc3NpZ25tZW50SnVkZ21lbnQuXyhFeHByZXNzaW9uIHJlY2VpdmVyLCB0aGlzLmluZGV4LCBFeHByZXNzaW9uIHJocywKICAgICAge2Jvb2wgaXNTdXBlcjogZmFsc2V9KQogICAgICA6IHN1cGVyLl8ocmVjZWl2ZXIsIHJocywgaXNTdXBlcik7CgogIEFyZ3VtZW50cyBfZ2V0SW52b2NhdGlvbkFyZ3VtZW50cygKICAgICAgU2hhZG93VHlwZUluZmVycmVyIGluZmVycmVyLCBFeHByZXNzaW9uIGludm9jYXRpb24pIHsKICAgIGlmIChpbnZvY2F0aW9uIGlzIE1ldGhvZEludm9jYXRpb24pIHsKICAgICAgcmV0dXJuIGludm9jYXRpb24uYXJndW1lbnRzOwogICAgfSBlbHNlIGlmIChpbnZvY2F0aW9uIGlzIFN1cGVyTWV0aG9kSW52b2NhdGlvbikgewogICAgICByZXR1cm4gaW52b2NhdGlvbi5hcmd1bWVudHM7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyB1bmhhbmRsZWQoIiR7aW52b2NhdGlvbi5ydW50aW1lVHlwZX0iLCAiX2dldEludm9jYXRpb25Bcmd1bWVudHMiLAogICAgICAgICAgZmlsZU9mZnNldCwgaW5mZXJyZXIudXJpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIExpc3Q8U3RyaW5nPiBfZ2V0VG9TdHJpbmdQYXJ0cygpIHsKICAgIHZhciBwYXJ0cyA9IHN1cGVyLl9nZXRUb1N0cmluZ1BhcnRzKCk7CiAgICBpZiAoaW5kZXggIT0gbnVsbCkgcGFydHMuYWRkKCdpbmRleD0kaW5kZXgnKTsKICAgIHJldHVybiBwYXJ0czsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0SW5kZXhBc3NpZ25tZW50SnVkZ21lbnQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KfQoKLy8vIENvbW1vbiBiYXNlIGNsYXNzIGZvciBzaGFkb3cgb2JqZWN0cyByZXByZXNlbnRpbmcgaW5pdGlhbGl6ZXJzIGluIGtlcm5lbAovLy8gZm9ybS4KYWJzdHJhY3QgY2xhc3MgSW5pdGlhbGl6ZXJKdWRnbWVudCBpbXBsZW1lbnRzIEluaXRpYWxpemVyIHsKICAvLy8gUGVyZm9ybXMgdHlwZSBpbmZlcmVuY2UgZm9yIHdoYXRldmVyIGNvbmNyZXRlIHR5cGUgb2YgW0luaXRpYWxpemVySnVkZ21lbnRdCiAgLy8vIHRoaXMgaXMuCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yKTsKfQoKRXhwcmVzc2lvbiBjaGVja1dlYkludExpdGVyYWxzRXJyb3JJZlVuZXhhY3QoCiAgICBTaGFkb3dUeXBlSW5mZXJyZXIgaW5mZXJyZXIsIGludCB2YWx1ZSwgU3RyaW5nIGxpdGVyYWwsIGludCBjaGFyT2Zmc2V0KSB7CiAgaWYgKHZhbHVlID49IDAgJiYgdmFsdWUgPD0gKDEgPDwgNTMpKSByZXR1cm4gbnVsbDsKICBpZiAoaW5mZXJyZXIubGlicmFyeSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICBpZiAoIWluZmVycmVyLmxpYnJhcnkubG9hZGVyLnRhcmdldC5iYWNrZW5kVGFyZ2V0CiAgICAgIC5lcnJvck9uVW5leGFjdFdlYkludExpdGVyYWxzKSByZXR1cm4gbnVsbDsKICBCaWdJbnQgYXNJbnQgPSBCaWdJbnQuZnJvbSh2YWx1ZSkudG9VbnNpZ25lZCg2NCk7CiAgQmlnSW50IGFzRG91YmxlID0gQmlnSW50LmZyb20oYXNJbnQudG9Eb3VibGUoKSk7CiAgaWYgKGFzSW50ID09IGFzRG91YmxlKSByZXR1cm4gbnVsbDsKICBTdHJpbmcgdGV4dCA9IGxpdGVyYWwgPz8gdmFsdWUudG9TdHJpbmcoKTsKICBTdHJpbmcgbmVhcmVzdCA9IHRleHQuc3RhcnRzV2l0aCgnMHgnKSB8fCB0ZXh0LnN0YXJ0c1dpdGgoJzBYJykKICAgICAgPyAnMHgke2FzRG91YmxlLnRvUmFkaXhTdHJpbmcoMTYpfScKICAgICAgOiBhc0RvdWJsZS50b1N0cmluZygpOwogIGludCBsZW5ndGggPSBsaXRlcmFsPy5sZW5ndGggPz8gbm9MZW5ndGg7CiAgcmV0dXJuIGluZmVycmVyLmhlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihpbmZlcnJlci5oZWxwZXIKICAgICAgLmJ1aWxkUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlV2ViTGl0ZXJhbENhbm5vdEJlUmVwcmVzZW50ZWRFeGFjdGx5LndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgdGV4dCwgbmVhcmVzdCksCiAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgbGVuZ3RoKSk7Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyIGxpdGVyYWwgaW4ga2VybmVsIGZvcm0uCmNsYXNzIEludEp1ZGdtZW50IGV4dGVuZHMgSW50TGl0ZXJhbCBpbXBsZW1lbnRzIEV4cHJlc3Npb25KdWRnbWVudCB7CiAgRGFydFR5cGUgaW5mZXJyZWRUeXBlOwogIGZpbmFsIFN0cmluZyBsaXRlcmFsOwoKICBJbnRKdWRnbWVudChpbnQgdmFsdWUsIHRoaXMubGl0ZXJhbCkgOiBzdXBlcih2YWx1ZSk7CgogIGRvdWJsZSBhc0RvdWJsZSh7Ym9vbCBuZWdhdGVkOiBmYWxzZX0pIHsKICAgIGlmICh2YWx1ZSA9PSAwICYmIG5lZ2F0ZWQpIHJldHVybiAtMC4wOwogICAgQmlnSW50IGludFZhbHVlID0gQmlnSW50LmZyb20obmVnYXRlZCA/IC12YWx1ZSA6IHZhbHVlKTsKICAgIGRvdWJsZSBkb3VibGVWYWx1ZSA9IGludFZhbHVlLnRvRG91YmxlKCk7CiAgICByZXR1cm4gaW50VmFsdWUgPT0gQmlnSW50LmZyb20oZG91YmxlVmFsdWUpID8gZG91YmxlVmFsdWUgOiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRJbnRKdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgpjbGFzcyBTaGFkb3dMYXJnZUludExpdGVyYWwgZXh0ZW5kcyBJbnRMaXRlcmFsIGltcGxlbWVudHMgRXhwcmVzc2lvbkp1ZGdtZW50IHsKICBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKICBmaW5hbCBpbnQgZmlsZU9mZnNldDsKICBib29sIGlzUGFyZW50aGVzaXplZCA9IGZhbHNlOwoKICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CgogIFNoYWRvd0xhcmdlSW50TGl0ZXJhbCh0aGlzLmxpdGVyYWwsIHRoaXMuZmlsZU9mZnNldCkgOiBzdXBlcigwKTsKCiAgZG91YmxlIGFzRG91YmxlKHtib29sIG5lZ2F0ZWQ6IGZhbHNlfSkgewogICAgQmlnSW50IGludFZhbHVlID0gQmlnSW50LnRyeVBhcnNlKG5lZ2F0ZWQgPyAnLSR7bGl0ZXJhbH0nIDogbGl0ZXJhbCk7CiAgICBpZiAoaW50VmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBkb3VibGUgZG91YmxlVmFsdWUgPSBpbnRWYWx1ZS50b0RvdWJsZSgpOwogICAgcmV0dXJuICFkb3VibGVWYWx1ZS5pc05hTiAmJgogICAgICAgICAgICAhZG91YmxlVmFsdWUuaXNJbmZpbml0ZSAmJgogICAgICAgICAgICBpbnRWYWx1ZSA9PSBCaWdJbnQuZnJvbShkb3VibGVWYWx1ZSkKICAgICAgICA/IGRvdWJsZVZhbHVlCiAgICAgICAgOiBudWxsOwogIH0KCiAgaW50IGFzSW50NjQoe2Jvb2wgbmVnYXRlZDogZmFsc2V9KSB7CiAgICByZXR1cm4gaW50LnRyeVBhcnNlKG5lZ2F0ZWQgPyAnLSR7bGl0ZXJhbH0nIDogbGl0ZXJhbCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFNoYWRvd0xhcmdlSW50TGl0ZXJhbCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYW4gaW52YWxpZCBpbml0aWFsaXplciBpbiBrZXJuZWwgZm9ybS4KY2xhc3MgU2hhZG93SW52YWxpZEluaXRpYWxpemVyIGV4dGVuZHMgTG9jYWxJbml0aWFsaXplcgogICAgaW1wbGVtZW50cyBJbml0aWFsaXplckp1ZGdtZW50IHsKICBTaGFkb3dJbnZhbGlkSW5pdGlhbGl6ZXIoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgOiBzdXBlcih2YXJpYWJsZSk7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRTaGFkb3dJbnZhbGlkSW5pdGlhbGl6ZXIodGhpcyk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYW4gaW52YWxpZCBpbml0aWFsaXplciBpbiBrZXJuZWwgZm9ybS4KY2xhc3MgU2hhZG93SW52YWxpZEZpZWxkSW5pdGlhbGl6ZXIgZXh0ZW5kcyBMb2NhbEluaXRpYWxpemVyCiAgICBpbXBsZW1lbnRzIEluaXRpYWxpemVySnVkZ21lbnQgewogIGZpbmFsIEZpZWxkIGZpZWxkOwogIGZpbmFsIEV4cHJlc3Npb24gdmFsdWU7CgogIFNoYWRvd0ludmFsaWRGaWVsZEluaXRpYWxpemVyKAogICAgICB0aGlzLmZpZWxkLCB0aGlzLnZhbHVlLCBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKQogICAgICA6IHN1cGVyKHZhcmlhYmxlKSB7CiAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICB9CgogIEV4cHJlc3Npb24gZ2V0IGp1ZGdtZW50ID0+IHZhbHVlOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0U2hhZG93SW52YWxpZEZpZWxkSW5pdGlhbGl6ZXIodGhpcyk7CiAgfQp9CgovLy8gVHlwZSBpbmZlcmVuY2UgZGVyaXZhdGlvbiBmb3IgW0xpc3RMaXRlcmFsXS4KY2xhc3MgTGlzdExpdGVyYWxKdWRnbWVudCBleHRlbmRzIExpc3RMaXRlcmFsIGltcGxlbWVudHMgRXhwcmVzc2lvbkp1ZGdtZW50IHsKICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CgogIExpc3RMaXRlcmFsSnVkZ21lbnQoTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucywKICAgICAge0RhcnRUeXBlIHR5cGVBcmd1bWVudCwgYm9vbCBpc0NvbnN0OiBmYWxzZX0pCiAgICAgIDogYXNzZXJ0KHR5cGVBcmd1bWVudCAhPSBudWxsKSwKICAgICAgICBzdXBlcihleHByZXNzaW9ucywgdHlwZUFyZ3VtZW50OiB0eXBlQXJndW1lbnQsIGlzQ29uc3Q6IGlzQ29uc3QpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdExpc3RMaXRlcmFsSnVkZ21lbnQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KfQoKLy8vIFR5cGUgaW5mZXJlbmNlIGRlcml2YXRpb24gZm9yIFtTZXRMaXRlcmFsXS4KY2xhc3MgU2V0TGl0ZXJhbEp1ZGdtZW50IGV4dGVuZHMgU2V0TGl0ZXJhbCBpbXBsZW1lbnRzIEV4cHJlc3Npb25KdWRnbWVudCB7CiAgRGFydFR5cGUgaW5mZXJyZWRUeXBlOwoKICBTZXRMaXRlcmFsSnVkZ21lbnQoTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucywKICAgICAge0RhcnRUeXBlIHR5cGVBcmd1bWVudCwgYm9vbCBpc0NvbnN0OiBmYWxzZX0pCiAgICAgIDogYXNzZXJ0KHR5cGVBcmd1bWVudCAhPSBudWxsKSwKICAgICAgICBzdXBlcihleHByZXNzaW9ucywgdHlwZUFyZ3VtZW50OiB0eXBlQXJndW1lbnQsIGlzQ29uc3Q6IGlzQ29uc3QpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFNldExpdGVyYWxKdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gVHlwZSBpbmZlcmVuY2UgZGVyaXZhdGlvbiBmb3IgW01hcExpdGVyYWxdLgpjbGFzcyBNYXBMaXRlcmFsSnVkZ21lbnQgZXh0ZW5kcyBNYXBMaXRlcmFsIGltcGxlbWVudHMgRXhwcmVzc2lvbkp1ZGdtZW50IHsKICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CgogIE1hcExpdGVyYWxKdWRnbWVudChMaXN0PE1hcEVudHJ5PiBqdWRnbWVudHMsCiAgICAgIHtEYXJ0VHlwZSBrZXlUeXBlLCBEYXJ0VHlwZSB2YWx1ZVR5cGUsIGJvb2wgaXNDb25zdDogZmFsc2V9KQogICAgICA6IGFzc2VydChrZXlUeXBlICE9IG51bGwpLAogICAgICAgIGFzc2VydCh2YWx1ZVR5cGUgIT0gbnVsbCksCiAgICAgICAgc3VwZXIoanVkZ21lbnRzLAogICAgICAgICAgICBrZXlUeXBlOiBrZXlUeXBlLCB2YWx1ZVR5cGU6IHZhbHVlVHlwZSwgaXNDb25zdDogaXNDb25zdCk7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TWFwTGl0ZXJhbEp1ZGdtZW50KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9Cn0KCi8vLyBBYnN0cmFjdCBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIGZpZWxkIG9yIHByb2NlZHVyZSBpbiBrZXJuZWwgZm9ybS4KYWJzdHJhY3QgY2xhc3MgU2hhZG93TWVtYmVyIGltcGxlbWVudHMgTWVtYmVyIHsKICBVcmkgZ2V0IGZpbGVVcmk7CgogIEluZmVyZW5jZU5vZGUgZ2V0IGluZmVyZW5jZU5vZGU7CgogIHZvaWQgc2V0IGluZmVyZW5jZU5vZGUoSW5mZXJlbmNlTm9kZSB2YWx1ZSk7CgogIHZvaWQgc2V0SW5mZXJyZWRUeXBlKAogICAgICBUeXBlSW5mZXJlbmNlRW5naW5lIGVuZ2luZSwgVXJpIHVyaSwgRGFydFR5cGUgaW5mZXJyZWRUeXBlKTsKfQoKLy8vIFNoYWRvdyBvYmplY3QgZm9yIFtNZXRob2RJbnZvY2F0aW9uXS4KY2xhc3MgTWV0aG9kSW52b2NhdGlvbkp1ZGdtZW50IGV4dGVuZHMgTWV0aG9kSW52b2NhdGlvbgogICAgaW1wbGVtZW50cyBFeHByZXNzaW9uSnVkZ21lbnQgewogIERhcnRUeXBlIGluZmVycmVkVHlwZTsKCiAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgbWV0aG9kIGludm9jYXRpb24gaXMgYSBjYWxsIHRvIGEgYGNhbGxgIG1ldGhvZAogIC8vLyByZXN1bHRpbmcgZnJvbSB0aGUgaW52b2NhdGlvbiBvZiBhIGZ1bmN0aW9uIGV4cHJlc3Npb24uCiAgZmluYWwgYm9vbCBfaXNJbXBsaWNpdENhbGw7CgogIE1ldGhvZEludm9jYXRpb25KdWRnbWVudCgKICAgICAgRXhwcmVzc2lvbiByZWNlaXZlciwgTmFtZSBuYW1lLCBBcmd1bWVudHNKdWRnbWVudCBhcmd1bWVudHMsCiAgICAgIHtib29sIGlzSW1wbGljaXRDYWxsOiBmYWxzZSwgTWVtYmVyIGludGVyZmFjZVRhcmdldH0pCiAgICAgIDogX2lzSW1wbGljaXRDYWxsID0gaXNJbXBsaWNpdENhbGwsCiAgICAgICAgc3VwZXIocmVjZWl2ZXIsIG5hbWUsIGFyZ3VtZW50cywgaW50ZXJmYWNlVGFyZ2V0KTsKCiAgQXJndW1lbnRzSnVkZ21lbnQgZ2V0IGFyZ3VtZW50SnVkZ21lbnRzID0+IGFyZ3VtZW50czsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRNZXRob2RJbnZvY2F0aW9uSnVkZ21lbnQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KfQoKLy8vIENvbmNyZXRlIHNoYWRvdyBvYmplY3QgcmVwcmVzZW50aW5nIGEgbmFtZWQgZnVuY3Rpb24gZXhwcmVzc2lvbi4KLy8vCi8vLyBOYW1lZCBmdW5jdGlvbiBleHByZXNzaW9ucyBhcmUgbm90IGxlZ2FsIGluIERhcnQsIGJ1dCB0aGV5IGFyZSBhY2NlcHRlZCBieQovLy8gdGhlIHBhcnNlciBhbmQgQm9keUJ1aWxkZXIgZm9yIGVycm9yIHJlY292ZXJ5IHB1cnBvc2VzLgovLy8KLy8vIEEgbmFtZWQgZnVuY3Rpb24gZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSBgZigpIHsgLi4uIH1gIGlzIHJlcHJlc2VudGVkIGFzIHRoZQovLy8ga2VybmVsIGV4cHJlc3Npb246Ci8vLwovLy8gICAgIGxldCBmID0gKCkgeyAuLi4gfSBpbiBmCmNsYXNzIE5hbWVkRnVuY3Rpb25FeHByZXNzaW9uSnVkZ21lbnQgZXh0ZW5kcyBMZXQKICAgIGltcGxlbWVudHMgRXhwcmVzc2lvbkp1ZGdtZW50IHsKICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CgogIE5hbWVkRnVuY3Rpb25FeHByZXNzaW9uSnVkZ21lbnQoVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50IHZhcmlhYmxlKQogICAgICA6IHN1cGVyKHZhcmlhYmxlLCBuZXcgVmFyaWFibGVHZXQodmFyaWFibGUpKTsKCiAgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50IGdldCB2YXJpYWJsZUp1ZGdtZW50ID0+IHZhcmlhYmxlOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdE5hbWVkRnVuY3Rpb25FeHByZXNzaW9uSnVkZ21lbnQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KfQoKLy8vIENvbmNyZXRlIHNoYWRvdyBvYmplY3QgcmVwcmVzZW50aW5nIGEgbnVsbC1hd2FyZSBtZXRob2QgaW52b2NhdGlvbi4KLy8vCi8vLyBBIG51bGwtYXdhcmUgbWV0aG9kIGludm9jYXRpb24gb2YgdGhlIGZvcm0gYGE/LmIoLi4uKWAgaXMgcmVwcmVzZW50ZWQgYXMgdGhlCi8vLyBleHByZXNzaW9uOgovLy8KLy8vICAgICBsZXQgdiA9IGEgaW4gdiA9PSBudWxsID8gbnVsbCA6IHYuYiguLi4pCmNsYXNzIE51bGxBd2FyZU1ldGhvZEludm9jYXRpb25KdWRnbWVudCBleHRlbmRzIExldAogICAgaW1wbGVtZW50cyBFeHByZXNzaW9uSnVkZ21lbnQgewogIERhcnRUeXBlIGluZmVycmVkVHlwZTsKCiAgTnVsbEF3YXJlTWV0aG9kSW52b2NhdGlvbkp1ZGdtZW50KAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBFeHByZXNzaW9uIGJvZHkpCiAgICAgIDogc3VwZXIodmFyaWFibGUsIGJvZHkpOwoKICBAb3ZlcnJpZGUKICBDb25kaXRpb25hbEV4cHJlc3Npb24gZ2V0IGJvZHkgPT4gc3VwZXIuYm9keTsKCiAgTWV0aG9kSW52b2NhdGlvbiBnZXQgX2Rlc3VnYXJlZEludm9jYXRpb24gPT4gYm9keS5vdGhlcndpc2U7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TnVsbEF3YXJlTWV0aG9kSW52b2NhdGlvbkp1ZGdtZW50KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIG51bGwtYXdhcmUgcmVhZCBmcm9tIGEgcHJvcGVydHkuCi8vLwovLy8gQSBudWxsLWF3YXJlIHByb3BlcnR5IGdldCBvZiB0aGUgZm9ybSBgYT8uYmAgaXMgcmVwcmVzZW50ZWQgYXMgdGhlIGtlcm5lbAovLy8gZXhwcmVzc2lvbjoKLy8vCi8vLyAgICAgbGV0IHYgPSBhIGluIHYgPT0gbnVsbCA/IG51bGwgOiB2LmIKY2xhc3MgTnVsbEF3YXJlUHJvcGVydHlHZXRKdWRnbWVudCBleHRlbmRzIExldCBpbXBsZW1lbnRzIEV4cHJlc3Npb25KdWRnbWVudCB7CiAgRGFydFR5cGUgaW5mZXJyZWRUeXBlOwoKICBOdWxsQXdhcmVQcm9wZXJ0eUdldEp1ZGdtZW50KAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBDb25kaXRpb25hbEV4cHJlc3Npb24gYm9keSkKICAgICAgOiBzdXBlcih2YXJpYWJsZSwgYm9keSk7CgogIEBvdmVycmlkZQogIENvbmRpdGlvbmFsRXhwcmVzc2lvbiBnZXQgYm9keSA9PiBzdXBlci5ib2R5OwoKICBQcm9wZXJ0eUdldCBnZXQgX2Rlc3VnYXJlZEdldCA9PiBib2R5Lm90aGVyd2lzZTsKCiAgRXhwcmVzc2lvbiBnZXQgcmVjZWl2ZXJKdWRnbWVudCA9PiB2YXJpYWJsZS5pbml0aWFsaXplcjsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXROdWxsQXdhcmVQcm9wZXJ0eUdldEp1ZGdtZW50KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIHByb2NlZHVyZSBpbiBrZXJuZWwgZm9ybS4KY2xhc3MgU2hhZG93UHJvY2VkdXJlIGV4dGVuZHMgUHJvY2VkdXJlIGltcGxlbWVudHMgU2hhZG93TWVtYmVyIHsKICBAb3ZlcnJpZGUKICBJbmZlcmVuY2VOb2RlIGluZmVyZW5jZU5vZGU7CgogIGZpbmFsIGJvb2wgX2hhc0ltcGxpY2l0UmV0dXJuVHlwZTsKCiAgU2hhZG93UHJvY2VkdXJlKE5hbWUgbmFtZSwgUHJvY2VkdXJlS2luZCBraW5kLCBGdW5jdGlvbk5vZGUgZnVuY3Rpb24sCiAgICAgIHRoaXMuX2hhc0ltcGxpY2l0UmV0dXJuVHlwZSwKICAgICAge1VyaSBmaWxlVXJpLCBib29sIGlzQWJzdHJhY3Q6IGZhbHNlfSkKICAgICAgOiBzdXBlcihuYW1lLCBraW5kLCBmdW5jdGlvbiwgZmlsZVVyaTogZmlsZVVyaSwgaXNBYnN0cmFjdDogaXNBYnN0cmFjdCk7CgogIEBvdmVycmlkZQogIHZvaWQgc2V0SW5mZXJyZWRUeXBlKAogICAgICBUeXBlSW5mZXJlbmNlRW5naW5lIGVuZ2luZSwgVXJpIHVyaSwgRGFydFR5cGUgaW5mZXJyZWRUeXBlKSB7CiAgICBpZiAoaXNTZXR0ZXIpIHsKICAgICAgaWYgKGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKICAgICAgICBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyc1swXS50eXBlID0gaW5mZXJyZWRUeXBlOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzR2V0dGVyKSB7CiAgICAgIGZ1bmN0aW9uLnJldHVyblR5cGUgPSBpbmZlcnJlZFR5cGU7CiAgICB9IGVsc2UgewogICAgICB1bmhhbmRsZWQoInNldEluZmVycmVkVHlwZSIsICJub3QgYWNjZXNzb3IiLCBmaWxlT2Zmc2V0LCB1cmkpOwogICAgfQogIH0KCiAgc3RhdGljIGJvb2wgaGFzSW1wbGljaXRSZXR1cm5UeXBlKFNoYWRvd1Byb2NlZHVyZSBwcm9jZWR1cmUpIHsKICAgIHJldHVybiBwcm9jZWR1cmUuX2hhc0ltcGxpY2l0UmV0dXJuVHlwZTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhbiBhc3NpZ25tZW50IHRvIGEgcHJvcGVydHkuCmNsYXNzIFByb3BlcnR5QXNzaWdubWVudEp1ZGdtZW50IGV4dGVuZHMgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudFdpdGhSZWNlaXZlciB7CiAgLy8vIElmIHRoaXMgYXNzaWdubWVudCB1c2VzIG51bGwtYXdhcmUgYWNjZXNzIChgPy5gKSwgdGhlIGNvbmRpdGlvbmFsCiAgLy8vIGV4cHJlc3Npb24gdGhhdCBndWFyZHMgdGhlIGFjY2Vzczsgb3RoZXJ3aXNlIGBudWxsYC4KICBDb25kaXRpb25hbEV4cHJlc3Npb24gbnVsbEF3YXJlR3VhcmQ7CgogIFByb3BlcnR5QXNzaWdubWVudEp1ZGdtZW50Ll8oRXhwcmVzc2lvbiByZWNlaXZlciwgRXhwcmVzc2lvbiByaHMsCiAgICAgIHtib29sIGlzU3VwZXI6IGZhbHNlfSkKICAgICAgOiBzdXBlci5fKHJlY2VpdmVyLCByaHMsIGlzU3VwZXIpOwoKICBAb3ZlcnJpZGUKICBMaXN0PFN0cmluZz4gX2dldFRvU3RyaW5nUGFydHMoKSB7CiAgICB2YXIgcGFydHMgPSBzdXBlci5fZ2V0VG9TdHJpbmdQYXJ0cygpOwogICAgaWYgKG51bGxBd2FyZUd1YXJkICE9IG51bGwpIHBhcnRzLmFkZCgnbnVsbEF3YXJlR3VhcmQ9JG51bGxBd2FyZUd1YXJkJyk7CiAgICByZXR1cm4gcGFydHM7CiAgfQoKICBPYmplY3QgX2hhbmRsZVdyaXRlQ29udHJhdmFyaWFuY2UoCiAgICAgIFNoYWRvd1R5cGVJbmZlcnJlciBpbmZlcnJlciwgRGFydFR5cGUgcmVjZWl2ZXJUeXBlKSB7CiAgICByZXR1cm4gaW5mZXJyZXIuZmluZFByb3BlcnR5U2V0TWVtYmVyKHJlY2VpdmVyVHlwZSwgd3JpdGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRQcm9wZXJ0eUFzc2lnbm1lbnRKdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYSByZWRpcmVjdGluZyBpbml0aWFsaXplciBpbiBrZXJuZWwKLy8vIGZvcm0uCmNsYXNzIFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXJKdWRnbWVudCBleHRlbmRzIFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIKICAgIGltcGxlbWVudHMgSW5pdGlhbGl6ZXJKdWRnbWVudCB7CiAgUmVkaXJlY3RpbmdJbml0aWFsaXplckp1ZGdtZW50KAogICAgICBDb25zdHJ1Y3RvciB0YXJnZXQsIEFyZ3VtZW50c0p1ZGdtZW50IGFyZ3VtZW50cykKICAgICAgOiBzdXBlcih0YXJnZXQsIGFyZ3VtZW50cyk7CgogIEFyZ3VtZW50c0p1ZGdtZW50IGdldCBhcmd1bWVudEp1ZGdtZW50cyA9PiBhcmd1bWVudHM7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRSZWRpcmVjdGluZ0luaXRpYWxpemVySnVkZ21lbnQodGhpcyk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYSByZXR1cm4gc3RhdGVtZW50IGluIGtlcm5lbCBmb3JtLgpjbGFzcyBSZXR1cm5KdWRnbWVudCBleHRlbmRzIFJldHVyblN0YXRlbWVudCBpbXBsZW1lbnRzIFN0YXRlbWVudEp1ZGdtZW50IHsKICBmaW5hbCBTdHJpbmcgcmV0dXJuS2V5d29yZExleGVtZTsKCiAgUmV0dXJuSnVkZ21lbnQodGhpcy5yZXR1cm5LZXl3b3JkTGV4ZW1lLCBbRXhwcmVzc2lvbiBleHByZXNzaW9uXSkKICAgICAgOiBzdXBlcihleHByZXNzaW9uKTsKCiAgRXhwcmVzc2lvbiBnZXQganVkZ21lbnQgPT4gZXhwcmVzc2lvbjsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFJldHVybkp1ZGdtZW50KHRoaXMpOwogIH0KfQoKLy8vIENvbW1vbiBiYXNlIGNsYXNzIGZvciBzaGFkb3cgb2JqZWN0cyByZXByZXNlbnRpbmcgc3RhdGVtZW50cyBpbiBrZXJuZWwKLy8vIGZvcm0uCmFic3RyYWN0IGNsYXNzIFN0YXRlbWVudEp1ZGdtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKICAvLy8gQ2FsbHMgYmFjayB0byBbaW5mZXJyZXJdIHRvIHBlcmZvcm0gdHlwZSBpbmZlcmVuY2UgZm9yIHdoYXRldmVyIGNvbmNyZXRlCiAgLy8vIHR5cGUgb2YgW1N0YXRlbWVudEp1ZGdtZW50XSB0aGlzIGlzLgogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvcik7Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhbiBhc3NpZ25tZW50IHRvIGEgc3RhdGljIHZhcmlhYmxlLgpjbGFzcyBTdGF0aWNBc3NpZ25tZW50SnVkZ21lbnQgZXh0ZW5kcyBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IHsKICBTdGF0aWNBc3NpZ25tZW50SnVkZ21lbnQuXyhFeHByZXNzaW9uIHJocykgOiBzdXBlci5fKHJocyk7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0U3RhdGljQXNzaWdubWVudEp1ZGdtZW50KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIHN1cGVyIGluaXRpYWxpemVyIGluIGtlcm5lbCBmb3JtLgpjbGFzcyBTdXBlckluaXRpYWxpemVySnVkZ21lbnQgZXh0ZW5kcyBTdXBlckluaXRpYWxpemVyCiAgICBpbXBsZW1lbnRzIEluaXRpYWxpemVySnVkZ21lbnQgewogIFN1cGVySW5pdGlhbGl6ZXJKdWRnbWVudChDb25zdHJ1Y3RvciB0YXJnZXQsIEFyZ3VtZW50c0p1ZGdtZW50IGFyZ3VtZW50cykKICAgICAgOiBzdXBlcih0YXJnZXQsIGFyZ3VtZW50cyk7CgogIEFyZ3VtZW50c0p1ZGdtZW50IGdldCBhcmd1bWVudEp1ZGdtZW50cyA9PiBhcmd1bWVudHM7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRTdXBlckluaXRpYWxpemVySnVkZ21lbnQodGhpcyk7CiAgfQp9CgovLy8gU2hhZG93IG9iamVjdCBmb3IgW1N1cGVyTWV0aG9kSW52b2NhdGlvbl0uCmNsYXNzIFN1cGVyTWV0aG9kSW52b2NhdGlvbkp1ZGdtZW50IGV4dGVuZHMgU3VwZXJNZXRob2RJbnZvY2F0aW9uCiAgICBpbXBsZW1lbnRzIEV4cHJlc3Npb25KdWRnbWVudCB7CiAgRGFydFR5cGUgaW5mZXJyZWRUeXBlOwoKICBTdXBlck1ldGhvZEludm9jYXRpb25KdWRnbWVudChOYW1lIG5hbWUsIEFyZ3VtZW50c0p1ZGdtZW50IGFyZ3VtZW50cywKICAgICAge1Byb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXR9KQogICAgICA6IHN1cGVyKG5hbWUsIGFyZ3VtZW50cywgaW50ZXJmYWNlVGFyZ2V0KTsKCiAgQXJndW1lbnRzSnVkZ21lbnQgZ2V0IGFyZ3VtZW50SnVkZ21lbnRzID0+IGFyZ3VtZW50czsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRTdXBlck1ldGhvZEludm9jYXRpb25KdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gU2hhZG93IG9iamVjdCBmb3IgW1N1cGVyUHJvcGVydHlHZXRdLgpjbGFzcyBTdXBlclByb3BlcnR5R2V0SnVkZ21lbnQgZXh0ZW5kcyBTdXBlclByb3BlcnR5R2V0CiAgICBpbXBsZW1lbnRzIEV4cHJlc3Npb25KdWRnbWVudCB7CiAgRGFydFR5cGUgaW5mZXJyZWRUeXBlOwoKICBTdXBlclByb3BlcnR5R2V0SnVkZ21lbnQoTmFtZSBuYW1lLCB7TWVtYmVyIGludGVyZmFjZVRhcmdldH0pCiAgICAgIDogc3VwZXIobmFtZSwgaW50ZXJmYWNlVGFyZ2V0KTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRTdXBlclByb3BlcnR5R2V0SnVkZ21lbnQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KfQoKLy8vIENvbmNyZXRlIHNoYWRvdyBvYmplY3QgcmVwcmVzZW50aW5nIGEgc3dpdGNoIGNhc2UuCmNsYXNzIFN3aXRjaENhc2VKdWRnbWVudCBleHRlbmRzIFN3aXRjaENhc2UgewogIFN3aXRjaENhc2VKdWRnbWVudCgKICAgICAgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucywgTGlzdDxpbnQ+IGV4cHJlc3Npb25PZmZzZXRzLCBTdGF0ZW1lbnQgYm9keSwKICAgICAge2Jvb2wgaXNEZWZhdWx0OiBmYWxzZX0pCiAgICAgIDogc3VwZXIoZXhwcmVzc2lvbnMsIGV4cHJlc3Npb25PZmZzZXRzLCBib2R5LCBpc0RlZmF1bHQ6IGlzRGVmYXVsdCk7CgogIFN3aXRjaENhc2VKdWRnbWVudC5kZWZhdWx0Q2FzZShTdGF0ZW1lbnQgYm9keSkgOiBzdXBlci5kZWZhdWx0Q2FzZShib2R5KTsKCiAgU3dpdGNoQ2FzZUp1ZGdtZW50LmVtcHR5KCkgOiBzdXBlci5lbXB0eSgpOwoKICBMaXN0PEV4cHJlc3Npb24+IGdldCBleHByZXNzaW9uSnVkZ21lbnRzID0+IGV4cHJlc3Npb25zLmNhc3QoKTsKfQoKLy8vIENvbmNyZXRlIHNoYWRvdyBvYmplY3QgcmVwcmVzZW50aW5nIGEgc3dpdGNoIHN0YXRlbWVudCBpbiBrZXJuZWwgZm9ybS4KY2xhc3MgU3dpdGNoU3RhdGVtZW50SnVkZ21lbnQgZXh0ZW5kcyBTd2l0Y2hTdGF0ZW1lbnQKICAgIGltcGxlbWVudHMgU3RhdGVtZW50SnVkZ21lbnQgewogIFN3aXRjaFN0YXRlbWVudEp1ZGdtZW50KEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgTGlzdDxTd2l0Y2hDYXNlPiBjYXNlcykKICAgICAgOiBzdXBlcihleHByZXNzaW9uLCBjYXNlcyk7CgogIEV4cHJlc3Npb24gZ2V0IGV4cHJlc3Npb25KdWRnbWVudCA9PiBleHByZXNzaW9uOwoKICBMaXN0PFN3aXRjaENhc2VKdWRnbWVudD4gZ2V0IGNhc2VKdWRnbWVudHMgPT4gY2FzZXMuY2FzdCgpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0U3dpdGNoU3RhdGVtZW50SnVkZ21lbnQodGhpcyk7CiAgfQp9CgovLy8gU2hhZG93IG9iamVjdCBmb3IgW1N5bWJvbExpdGVyYWxdLgpjbGFzcyBTeW1ib2xMaXRlcmFsSnVkZ21lbnQgZXh0ZW5kcyBTeW1ib2xMaXRlcmFsCiAgICBpbXBsZW1lbnRzIEV4cHJlc3Npb25KdWRnbWVudCB7CiAgRGFydFR5cGUgaW5mZXJyZWRUeXBlOwoKICBTeW1ib2xMaXRlcmFsSnVkZ21lbnQoU3RyaW5nIHZhbHVlKSA6IHN1cGVyKHZhbHVlKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRTeW1ib2xMaXRlcmFsSnVkZ21lbnQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KfQoKLy8vIFN5bnRoZXRpYyBqdWRnbWVudCBjbGFzcyByZXByZXNlbnRpbmcgYW4gYXR0ZW1wdCB0byBpbnZva2UgYW4gdW5yZXNvbHZlZAovLy8gY29uc3RydWN0b3IsIG9yIGEgY29uc3RydWN0b3IgdGhhdCBjYW5ub3QgYmUgaW52b2tlZCwgb3IgYSByZXNvbHZlZAovLy8gY29uc3RydWN0b3Igd2l0aCB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzLgovLyBUT0RPKGFoZSk6IFJlbW92ZSB0aGlzPwpjbGFzcyBJbnZhbGlkQ29uc3RydWN0b3JJbnZvY2F0aW9uSnVkZ21lbnQgZXh0ZW5kcyBTeW50aGV0aWNFeHByZXNzaW9uSnVkZ21lbnQgewogIGZpbmFsIE1lbWJlciBjb25zdHJ1Y3RvcjsKICBmaW5hbCBBcmd1bWVudHMgYXJndW1lbnRzOwoKICBJbnZhbGlkQ29uc3RydWN0b3JJbnZvY2F0aW9uSnVkZ21lbnQuXygKICAgICAga2VybmVsLkV4cHJlc3Npb24gZGVzdWdhcmVkLCB0aGlzLmNvbnN0cnVjdG9yLCB0aGlzLmFyZ3VtZW50cykKICAgICAgOiBzdXBlci5fKGRlc3VnYXJlZCk7CgogIEFyZ3VtZW50c0p1ZGdtZW50IGdldCBhcmd1bWVudEp1ZGdtZW50cyA9PiBhcmd1bWVudHM7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0SW52YWxpZENvbnN0cnVjdG9ySW52b2NhdGlvbkp1ZGdtZW50KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9Cn0KCi8vLyBTeW50aGV0aWMganVkZ21lbnQgY2xhc3MgcmVwcmVzZW50aW5nIGFuIGF0dGVtcHQgdG8gYXNzaWduIHRvIHRoZQovLy8gW2V4cHJlc3Npb25dIHdoaWNoIGlzIG5vdCBhc3NpZ25hYmxlLgpjbGFzcyBJbnZhbGlkV3JpdGVKdWRnbWVudCBleHRlbmRzIFN5bnRoZXRpY0V4cHJlc3Npb25KdWRnbWVudCB7CiAgZmluYWwgRXhwcmVzc2lvbiBleHByZXNzaW9uOwoKICBJbnZhbGlkV3JpdGVKdWRnbWVudC5fKGtlcm5lbC5FeHByZXNzaW9uIGRlc3VnYXJlZCwgdGhpcy5leHByZXNzaW9uKQogICAgICA6IHN1cGVyLl8oZGVzdWdhcmVkKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRJbnZhbGlkV3JpdGVKdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gU2hhZG93IG9iamVjdCBmb3IgZXhwcmVzc2lvbnMgdGhhdCBhcmUgaW50cm9kdWNlZCBieSB0aGUgZnJvbnQgZW5kIGFzIHBhcnQKLy8vIG9mIGRlc3VnYXJpbmcgb3IgdGhlIGhhbmRsaW5nIG9mIGVycm9yIGNvbmRpdGlvbnMuCi8vLwovLy8gVGhlc2UgZXhwcmVzc2lvbnMgYXJlIHJlbW92ZWQgYnkgdHlwZSBpbmZlcmVuY2UgYW5kIHJlcGxhY2VkIHdpdGggdGhlaXIKLy8vIGRlc3VnYXJlZCBlcXVpdmFsZW50cy4KY2xhc3MgU3ludGhldGljRXhwcmVzc2lvbkp1ZGdtZW50IGV4dGVuZHMgTGV0IGltcGxlbWVudHMgRXhwcmVzc2lvbkp1ZGdtZW50IHsKICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CgogIFN5bnRoZXRpY0V4cHJlc3Npb25KdWRnbWVudC5fKEV4cHJlc3Npb24gZGVzdWdhcmVkKQogICAgICA6IHN1cGVyKG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKCdfJywgaW5pdGlhbGl6ZXI6IG5ldyBOdWxsTGl0ZXJhbCgpKSwKICAgICAgICAgICAgZGVzdWdhcmVkKTsKCiAgLy8vIFRoZSBkZXN1Z2FyZWQga2VybmVsIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc3ludGhldGljIGV4cHJlc3Npb24uCiAgRXhwcmVzc2lvbiBnZXQgZGVzdWdhcmVkID0+IGJvZHk7CgogIHZvaWQgc2V0IGRlc3VnYXJlZChFeHByZXNzaW9uIHZhbHVlKSB7CiAgICB0aGlzLmJvZHkgPSB2YWx1ZTsKICAgIHZhbHVlLnBhcmVudCA9IHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFN5bnRoZXRpY0V4cHJlc3Npb25KdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQoKICAvLy8gUmVtb3ZlcyB0aGlzIGV4cHJlc3Npb24gZnJvbSB0aGUgZXhwcmVzc2lvbiB0cmVlLCByZXBsYWNpbmcgaXQgd2l0aAogIC8vLyBbZGVzdWdhcmVkXS4KICB2b2lkIF9yZXBsYWNlV2l0aERlc3VnYXJlZCgpIHsKICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQodGhpcywgZGVzdWdhcmVkKTsKICAgIHBhcmVudCA9IG51bGw7CiAgfQoKICAvLy8gVXBkYXRlcyBhbnkgW0xldF0gbm9kZXMgaW4gdGhlIGRlc3VnYXJlZCBleHByZXNzaW9uIHRvIGFjY291bnQgZm9yIHRoZQogIC8vLyBmYWN0IHRoYXQgW2V4cHJlc3Npb25dIGhhcyB0aGUgZ2l2ZW4gW3R5cGVdLgogIHZvaWQgX3N0b3JlTGV0VHlwZSgKICAgICAgVHlwZUluZmVycmVySW1wbCBpbmZlcnJlciwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBEYXJ0VHlwZSB0eXBlKSB7CiAgICBFeHByZXNzaW9uIGRlc3VnYXJlZCA9IHRoaXMuZGVzdWdhcmVkOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaWYgKGRlc3VnYXJlZCBpcyBMZXQpIHsKICAgICAgICBMZXQgZGVzdWdhcmVkTGV0ID0gZGVzdWdhcmVkOwogICAgICAgIHZhciB2YXJpYWJsZSA9IGRlc3VnYXJlZExldC52YXJpYWJsZTsKICAgICAgICBpZiAoaWRlbnRpY2FsKHZhcmlhYmxlLmluaXRpYWxpemVyLCBleHByZXNzaW9uKSkgewogICAgICAgICAgdmFyaWFibGUudHlwZSA9IHR5cGU7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGRlc3VnYXJlZCA9IGRlc3VnYXJlZExldC5ib2R5OwogICAgICB9IGVsc2UgaWYgKGRlc3VnYXJlZCBpcyBDb25kaXRpb25hbEV4cHJlc3Npb24pIHsKICAgICAgICAvLyBXaGVuIGEgbnVsbC1hd2FyZSBhc3NpZ25tZW50IGlzIGRlc3VnYXJlZCwgb2Z0ZW4gdGhlICJ0aGVuIiBvciAiZWxzZSIKICAgICAgICAvLyBicmFuY2ggb2YgdGhlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gb2Z0ZW4gY29udGFpbnMgImxldCIgbm9kZXMgdGhhdAogICAgICAgIC8vIG5lZWQgdG8gYmUgdXBkYXRlZC4KICAgICAgICBDb25kaXRpb25hbEV4cHJlc3Npb24gZGVzdWdhcmVkQ29uZGl0aW9uYWxFeHByZXNzaW9uID0gZGVzdWdhcmVkOwogICAgICAgIGlmIChkZXN1Z2FyZWRDb25kaXRpb25hbEV4cHJlc3Npb24udGhlbiBpcyBMZXQpIHsKICAgICAgICAgIGRlc3VnYXJlZCA9IGRlc3VnYXJlZENvbmRpdGlvbmFsRXhwcmVzc2lvbi50aGVuOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkZXN1Z2FyZWQgPSBkZXN1Z2FyZWRDb25kaXRpb25hbEV4cHJlc3Npb24ub3RoZXJ3aXNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpIHsKICAgIC8vIFRoaXMgaXMgZGVzaWduZWQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGR1cmluZyBzZXJpYWxpemF0aW9uLiBJdCBjYW4gYWxzbwogICAgLy8gbGVhZCB0byBleGNlcHRpb25zIGR1cmluZyB0cmFuc2Zvcm1hdGlvbnMsIGJ1dCB3ZSBoYXZlIHRvIGFjY2VwdCBhCiAgICAvLyBbVHJhbnNmb3JtZXJdIGFzIHRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQgYHJlcGxhY2VDaGlsZGAuCiAgICBpZiAodiBpcyBUcmFuc2Zvcm1lcikgcmV0dXJuIHN1cGVyLmFjY2VwdCh2KTsKICAgIHVuc3VwcG9ydGVkKCJhY2NlcHQiLCBmaWxlT2Zmc2V0LCBnZXRGaWxlVXJpKHRoaXMpKTsKICB9CgogIEBvdmVycmlkZQogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgewogICAgdW5zdXBwb3J0ZWQoImFjY2VwdDEiLCBmaWxlT2Zmc2V0LCBnZXRGaWxlVXJpKHRoaXMpKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB1bnN1cHBvcnRlZCgidmlzaXRDaGlsZHJlbiIsIGZpbGVPZmZzZXQsIGdldEZpbGVVcmkodGhpcykpOwogIH0KfQoKLy8vIENvbmNyZXRlIHNoYWRvdyBvYmplY3QgcmVwcmVzZW50aW5nIGEgY2F0Y2ggY2xhdXNlLgpjbGFzcyBDYXRjaEp1ZGdtZW50IGV4dGVuZHMgQ2F0Y2ggewogIENhdGNoSnVkZ21lbnQoVmFyaWFibGVEZWNsYXJhdGlvbiBleGNlcHRpb24sIFN0YXRlbWVudCBib2R5LAogICAgICB7RGFydFR5cGUgZ3VhcmQ6IGNvbnN0IER5bmFtaWNUeXBlKCksIFZhcmlhYmxlRGVjbGFyYXRpb24gc3RhY2tUcmFjZX0pCiAgICAgIDogc3VwZXIoZXhjZXB0aW9uLCBib2R5LCBndWFyZDogZ3VhcmQsIHN0YWNrVHJhY2U6IHN0YWNrVHJhY2UpOwoKICBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQgZ2V0IGV4Y2VwdGlvbkp1ZGdtZW50ID0+IGV4Y2VwdGlvbjsKCiAgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50IGdldCBzdGFja1RyYWNlSnVkZ21lbnQgPT4gc3RhY2tUcmFjZTsKfQoKLy8vIENvbmNyZXRlIHNoYWRvdyBvYmplY3QgcmVwcmVzZW50aW5nIGEgdHJ5LWNhdGNoIGJsb2NrIGluIGtlcm5lbCBmb3JtLgpjbGFzcyBUcnlDYXRjaEp1ZGdtZW50IGV4dGVuZHMgVHJ5Q2F0Y2ggaW1wbGVtZW50cyBTdGF0ZW1lbnRKdWRnbWVudCB7CiAgVHJ5Q2F0Y2hKdWRnbWVudChTdGF0ZW1lbnQgYm9keSwgTGlzdDxDYXRjaD4gY2F0Y2hlcykgOiBzdXBlcihib2R5LCBjYXRjaGVzKTsKCiAgTGlzdDxDYXRjaEp1ZGdtZW50PiBnZXQgY2F0Y2hKdWRnbWVudHMgPT4gY2F0Y2hlcy5jYXN0KCk7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRUcnlDYXRjaEp1ZGdtZW50KHRoaXMpOwogIH0KfQoKLy8vIENvbmNyZXRlIHNoYWRvdyBvYmplY3QgcmVwcmVzZW50aW5nIGEgdHJ5LWZpbmFsbHkgYmxvY2sgaW4ga2VybmVsIGZvcm0uCmNsYXNzIFRyeUZpbmFsbHlKdWRnbWVudCBleHRlbmRzIFRyeUZpbmFsbHkgaW1wbGVtZW50cyBTdGF0ZW1lbnRKdWRnbWVudCB7CiAgVHJ5RmluYWxseUp1ZGdtZW50KFN0YXRlbWVudCBib2R5LCBTdGF0ZW1lbnQgZmluYWxpemVyKQogICAgICA6IHN1cGVyKGJvZHksIGZpbmFsaXplcik7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRUcnlGaW5hbGx5SnVkZ21lbnQodGhpcyk7CiAgfQp9CgovLy8gQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgW1R5cGVJbmZlcmVuY2VFbmdpbmVdIHNwZWNpYWxpemVkIHRvIHdvcmsgd2l0aAovLy8ga2VybmVsIG9iamVjdHMuCmNsYXNzIFNoYWRvd1R5cGVJbmZlcmVuY2VFbmdpbmUgZXh0ZW5kcyBUeXBlSW5mZXJlbmNlRW5naW5lIHsKICBTaGFkb3dUeXBlSW5mZXJlbmNlRW5naW5lKEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24pCiAgICAgIDogc3VwZXIoaW5zdHJ1bWVudGF0aW9uKTsKCiAgQG92ZXJyaWRlCiAgU2hhZG93VHlwZUluZmVycmVyIGNyZWF0ZUxvY2FsVHlwZUluZmVycmVyKAogICAgICBVcmkgdXJpLCBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlLCBLZXJuZWxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICByZXR1cm4gbmV3IFR5cGVJbmZlcnJlcih0aGlzLCB1cmksIGZhbHNlLCB0aGlzVHlwZSwgbGlicmFyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTaGFkb3dUeXBlSW5mZXJyZXIgY3JlYXRlVG9wTGV2ZWxUeXBlSW5mZXJyZXIoCiAgICAgIEludGVyZmFjZVR5cGUgdGhpc1R5cGUsIFNoYWRvd0ZpZWxkIGZpZWxkLCBLZXJuZWxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICByZXR1cm4gZmllbGQuX3R5cGVJbmZlcnJlciA9CiAgICAgICAgbmV3IFR5cGVJbmZlcnJlcih0aGlzLCBmaWVsZC5maWxlVXJpLCB0cnVlLCB0aGlzVHlwZSwgbGlicmFyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTaGFkb3dUeXBlSW5mZXJyZXIgZ2V0RmllbGRUeXBlSW5mZXJyZXIoU2hhZG93RmllbGQgZmllbGQpIHsKICAgIHJldHVybiBmaWVsZC5fdHlwZUluZmVycmVyOwogIH0KfQoKLy8vIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIFtUeXBlSW5mZXJyZXJdIHNwZWNpYWxpemVkIHRvIHdvcmsgd2l0aCBrZXJuZWwKLy8vIG9iamVjdHMuCmNsYXNzIFNoYWRvd1R5cGVJbmZlcnJlciBleHRlbmRzIFR5cGVJbmZlcnJlckltcGwgewogIEBvdmVycmlkZQogIGZpbmFsIHR5cGVQcm9tb3RlcjsKCiAgU2hhZG93VHlwZUluZmVycmVyLnByaXZhdGUoU2hhZG93VHlwZUluZmVyZW5jZUVuZ2luZSBlbmdpbmUsIFVyaSB1cmksCiAgICAgIGJvb2wgdG9wTGV2ZWwsIEludGVyZmFjZVR5cGUgdGhpc1R5cGUsIEtlcm5lbExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpCiAgICAgIDogdHlwZVByb21vdGVyID0gbmV3IFR5cGVQcm9tb3RlcihlbmdpbmUudHlwZVNjaGVtYUVudmlyb25tZW50KSwKICAgICAgICBzdXBlci5wcml2YXRlKGVuZ2luZSwgdXJpLCB0b3BMZXZlbCwgdGhpc1R5cGUsIGxpYnJhcnkpOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGdldEZpZWxkSW5pdGlhbGl6ZXIoU2hhZG93RmllbGQgZmllbGQpIHsKICAgIHJldHVybiBmaWVsZC5pbml0aWFsaXplcjsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGluZmVyRXhwcmVzc2lvbigKICAgICAga2VybmVsLkV4cHJlc3Npb24gZXhwcmVzc2lvbiwgRGFydFR5cGUgdHlwZUNvbnRleHQsIGJvb2wgdHlwZU5lZWRlZCwKICAgICAge2Jvb2wgaXNWb2lkQWxsb3dlZDogZmFsc2V9KSB7CiAgICAvLyBgbnVsbGAgc2hvdWxkIG5ldmVyIGJlIHVzZWQgYXMgdGhlIHR5cGUgY29udGV4dC4gIEFuIGluc3RhbmNlIG9mCiAgICAvLyBgVW5rbm93blR5cGVgIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCiAgICBhc3NlcnQodHlwZUNvbnRleHQgIT0gbnVsbCk7CgogICAgLy8gSXQgaXNuJ3Qgc2FmZSB0byBkbyB0eXBlIGluZmVyZW5jZSBvbiBhbiBleHByZXNzaW9uIHdpdGhvdXQgYSBwYXJlbnQsCiAgICAvLyBiZWNhdXNlIHR5cGUgaW5mZXJlbmNlIG1pZ2h0IGNhdXNlIHVzIHRvIGhhdmUgdG8gcmVwbGFjZSBvbmUgZXhwcmVzc2lvbgogICAgLy8gd2l0aCBhbm90aGVyLCBhbmQgd2UgY2FuIG9ubHkgcmVwbGFjZSBhIG5vZGUgaWYgaXQgaGFzIGEgcGFyZW50IHBvaW50ZXIuCiAgICBhc3NlcnQoZXhwcmVzc2lvbi5wYXJlbnQgIT0gbnVsbCk7CgogICAgLy8gRm9yIGZ1bGwgKG5vbi10b3AgbGV2ZWwpIGluZmVyZW5jZSwgd2UgbmVlZCBhY2Nlc3MgdG8gdGhlCiAgICAvLyBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIHNvIHRoYXQgd2UgY2FuIHBlcmZvcm0gZXJyb3IgcmVjb3ZlcnkuCiAgICBhc3NlcnQoaXNUb3BMZXZlbCB8fCBoZWxwZXIgIT0gbnVsbCk7CgogICAgLy8gV2hlbiBkb2luZyB0b3AgbGV2ZWwgaW5mZXJlbmNlLCB3ZSBza2lwIHN1YmV4cHJlc3Npb25zIHdob3NlIHR5cGUgaXNuJ3QKICAgIC8vIG5lZWRlZCBzbyB0aGF0IHdlIGRvbid0IGluZHVjZSBib2d1cyBkZXBlbmRlbmNpZXMgb24gZmllbGRzIG1lbnRpb25lZCBpbgogICAgLy8gdGhvc2Ugc3ViZXhwcmVzc2lvbnMuCiAgICBpZiAoIXR5cGVOZWVkZWQpIHJldHVybiBudWxsOwoKICAgIEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciA9IG5ldyBJbmZlcmVuY2VWaXNpdG9yKHRoaXMpOwogICAgaWYgKGV4cHJlc3Npb24gaXMgRXhwcmVzc2lvbkp1ZGdtZW50KSB7CiAgICAgIGV4cHJlc3Npb24uYWNjZXB0SW5mZXJlbmNlKHZpc2l0b3IsIHR5cGVDb250ZXh0KTsKICAgIH0gZWxzZSB7CiAgICAgIGV4cHJlc3Npb24uYWNjZXB0MSh2aXNpdG9yLCB0eXBlQ29udGV4dCk7CiAgICB9CiAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGUgPSBnZXRJbmZlcnJlZFR5cGUoZXhwcmVzc2lvbiwgdGhpcyk7CiAgICBpZiAoaW5mZXJyZWRUeXBlIGlzIFZvaWRUeXBlICYmICFpc1ZvaWRBbGxvd2VkKSB7CiAgICAgIGlmIChleHByZXNzaW9uLnBhcmVudCBpcyEgQXJndW1lbnRzSnVkZ21lbnQpIHsKICAgICAgICBoZWxwZXI/LmFkZFByb2JsZW0oCiAgICAgICAgICAgIG1lc3NhZ2VWb2lkRXhwcmVzc2lvbiwgZXhwcmVzc2lvbi5maWxlT2Zmc2V0LCBub0xlbmd0aCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpbmZlcnJlZFR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBpbmZlckZpZWxkVG9wTGV2ZWwoU2hhZG93RmllbGQgZmllbGQpIHsKICAgIGlmIChmaWVsZC5pbml0aWFsaXplciA9PSBudWxsKSByZXR1cm4gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIHJldHVybiBpbmZlckV4cHJlc3Npb24oZmllbGQuaW5pdGlhbGl6ZXIsIGNvbnN0IFVua25vd25UeXBlKCksIHRydWUsCiAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGluZmVySW5pdGlhbGl6ZXIoCiAgICAgIEluZmVyZW5jZUhlbHBlciBoZWxwZXIsIGtlcm5lbC5Jbml0aWFsaXplciBpbml0aWFsaXplcikgewogICAgYXNzZXJ0KGluaXRpYWxpemVyIGlzIEluaXRpYWxpemVySnVkZ21lbnQpOwogICAgdGhpcy5oZWxwZXIgPSBoZWxwZXI7CiAgICAvLyBVc2UgcG9seW1vcnBoaWMgZGlzcGF0Y2ggb24gW0tlcm5lbEluaXRpYWxpemVyXSB0byBwZXJmb3JtIHdoYXRldmVyCiAgICAvLyBraW5kIG9mIHR5cGUgaW5mZXJlbmNlIGlzIGNvcnJlY3QgZm9yIHRoaXMga2luZCBvZiBpbml0aWFsaXplci4KICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogZXhwZXJpbWVudCB0byBzZWUgaWYgZHluYW1pYyBkaXNwYXRjaCB3b3VsZCBiZSBiZXR0ZXIsCiAgICAvLyBzbyB0aGF0IHRoZSB0eXBlIGhpZXJhcmNoeSB3aWxsIGJlIHNpbXBsZXIgKHdoaWNoIG1heSBzcGVlZCB1cCAiaXMiCiAgICAvLyBjaGVja3MpLgogICAgSW5pdGlhbGl6ZXJKdWRnbWVudCBrZXJuZWxJbml0aWFsaXplciA9IGluaXRpYWxpemVyOwogICAga2VybmVsSW5pdGlhbGl6ZXIuYWNjZXB0SW5mZXJlbmNlKG5ldyBJbmZlcmVuY2VWaXNpdG9yKHRoaXMpKTsKICAgIHRoaXMuaGVscGVyID0gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaW5mZXJTdGF0ZW1lbnQoU3RhdGVtZW50IHN0YXRlbWVudCkgewogICAgLy8gRm9yIGZ1bGwgKG5vbi10b3AgbGV2ZWwpIGluZmVyZW5jZSwgd2UgbmVlZCBhY2Nlc3MgdG8gdGhlCiAgICAvLyBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIHNvIHRoYXQgd2UgY2FuIHBlcmZvcm0gZXJyb3IgcmVjb3ZlcnkuCiAgICBpZiAoIWlzVG9wTGV2ZWwpIGFzc2VydChoZWxwZXIgIT0gbnVsbCk7CgogICAgaWYgKHN0YXRlbWVudCBpcyBTdGF0ZW1lbnRKdWRnbWVudCkgewogICAgICAvLyBVc2UgcG9seW1vcnBoaWMgZGlzcGF0Y2ggb24gW0tlcm5lbFN0YXRlbWVudF0gdG8gcGVyZm9ybSB3aGF0ZXZlciBraW5kCiAgICAgIC8vIG9mIHR5cGUgaW5mZXJlbmNlIGlzIGNvcnJlY3QgZm9yIHRoaXMga2luZCBvZiBzdGF0ZW1lbnQuCiAgICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogZXhwZXJpbWVudCB0byBzZWUgaWYgZHluYW1pYyBkaXNwYXRjaCB3b3VsZCBiZSBiZXR0ZXIsCiAgICAgIC8vIHNvIHRoYXQgdGhlIHR5cGUgaGllcmFyY2h5IHdpbGwgYmUgc2ltcGxlciAod2hpY2ggbWF5IHNwZWVkIHVwICJpcyIKICAgICAgLy8gY2hlY2tzKS4KICAgICAgcmV0dXJuIHN0YXRlbWVudC5hY2NlcHRJbmZlcmVuY2UobmV3IEluZmVyZW5jZVZpc2l0b3IodGhpcykpOwogICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQgaXMgRm9ySW5TdGF0ZW1lbnQpIHsKICAgICAgcmV0dXJuIHN0YXRlbWVudC5hY2NlcHQxKG5ldyBJbmZlcmVuY2VWaXNpdG9yKHRoaXMpLCBudWxsKTsKICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50IGlzIExhYmVsZWRTdGF0ZW1lbnQpIHsKICAgICAgcmV0dXJuIHN0YXRlbWVudC5hY2NlcHQxKG5ldyBJbmZlcmVuY2VWaXNpdG9yKHRoaXMpLCBudWxsKTsKICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50IGlzIEJyZWFrU3RhdGVtZW50KSB7CiAgICAgIHJldHVybiBzdGF0ZW1lbnQuYWNjZXB0MShuZXcgSW5mZXJlbmNlVmlzaXRvcih0aGlzKSwgbnVsbCk7CiAgICB9IGVsc2UgewogICAgICAvLyBFbmNvdW50ZXJlZCBhIHN0YXRlbWVudCB0eXBlIGZvciB3aGljaCB0eXBlIGluZmVyZW5jZSBpcyBub3QgeWV0CiAgICAgIC8vIGltcGxlbWVudGVkLCBzbyBqdXN0IHNraXAgaXQgZm9yIG5vdy4KICAgICAgLy8gVE9ETyhwYXVsYmVycnkpOiBvbmNlIHRoZSBCb2R5QnVpbGRlciB1c2VzIHNoYWRvdyBjbGFzc2VzIGZvcgogICAgICAvLyBldmVyeXRoaW5nLCB0aGlzIGNhc2Ugc2hvdWxkIG5vIGxvbmdlciBiZSBuZWVkZWQuCiAgICB9CiAgfQp9CgpjbGFzcyBUeXBlTGl0ZXJhbEp1ZGdtZW50IGV4dGVuZHMgVHlwZUxpdGVyYWwgaW1wbGVtZW50cyBFeHByZXNzaW9uSnVkZ21lbnQgewogIERhcnRUeXBlIGluZmVycmVkVHlwZTsKCiAgVHlwZUxpdGVyYWxKdWRnbWVudChEYXJ0VHlwZSB0eXBlKSA6IHN1cGVyKHR5cGUpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFR5cGVMaXRlcmFsSnVkZ21lbnQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KfQoKLy8vIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIFtUeXBlUHJvbW90ZXJdIHNwZWNpYWxpemVkIHRvIHdvcmsgd2l0aCBrZXJuZWwKLy8vIG9iamVjdHMuCmNsYXNzIFNoYWRvd1R5cGVQcm9tb3RlciBleHRlbmRzIFR5cGVQcm9tb3RlckltcGwgewogIFNoYWRvd1R5cGVQcm9tb3Rlci5wcml2YXRlKFR5cGVTY2hlbWFFbnZpcm9ubWVudCB0eXBlU2NoZW1hRW52aXJvbm1lbnQpCiAgICAgIDogc3VwZXIucHJpdmF0ZSh0eXBlU2NoZW1hRW52aXJvbm1lbnQpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0VmFyaWFibGVGdW5jdGlvbk5lc3RpbmdMZXZlbChWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSB7CiAgICBpZiAodmFyaWFibGUgaXMgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50KSB7CiAgICAgIHJldHVybiB2YXJpYWJsZS5fZnVuY3Rpb25OZXN0aW5nTGV2ZWw7CiAgICB9IGVsc2UgewogICAgICAvLyBIYWNrIHRvIGRlYWwgd2l0aCB0aGUgZmFjdCB0aGF0IEJvZHlCdWlsZGVyIHN0aWxsIGNyZWF0ZXMgcmF3CiAgICAgIC8vIFZhcmlhYmxlRGVjbGFyYXRpb24gb2JqZWN0cyBzb21ldGltZXMuCiAgICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogZ2V0IHJpZCBvZiB0aGlzIG9uY2UgdGhlIHR5cGUgcGFyYW1ldGVyIGlzCiAgICAgIC8vIEtlcm5lbFZhcmlhYmxlRGVjbGFyYXRpb24uCiAgICAgIHJldHVybiAwOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1Byb21vdGlvbkNhbmRpZGF0ZShWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSB7CiAgICBhc3NlcnQodmFyaWFibGUgaXMgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50KTsKICAgIFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudCBrZXJuZWxWYXJpYWJsZURlY2xhcmF0aW9uID0gdmFyaWFibGU7CiAgICByZXR1cm4gIWtlcm5lbFZhcmlhYmxlRGVjbGFyYXRpb24uX2lzTG9jYWxGdW5jdGlvbjsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgc2FtZUV4cHJlc3Npb25zKEV4cHJlc3Npb24gYSwgRXhwcmVzc2lvbiBiKSB7CiAgICByZXR1cm4gaWRlbnRpY2FsKGEsIGIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXRWYXJpYWJsZU11dGF0ZWRBbnl3aGVyZShWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSB7CiAgICBpZiAodmFyaWFibGUgaXMgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50KSB7CiAgICAgIHZhcmlhYmxlLl9tdXRhdGVkQW55d2hlcmUgPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgLy8gSGFjayB0byBkZWFsIHdpdGggdGhlIGZhY3QgdGhhdCBCb2R5QnVpbGRlciBzdGlsbCBjcmVhdGVzIHJhdwogICAgICAvLyBWYXJpYWJsZURlY2xhcmF0aW9uIG9iamVjdHMgc29tZXRpbWVzLgogICAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IGdldCByaWQgb2YgdGhpcyBvbmNlIHRoZSB0eXBlIHBhcmFtZXRlciBpcwogICAgICAvLyBLZXJuZWxWYXJpYWJsZURlY2xhcmF0aW9uLgogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXRWYXJpYWJsZU11dGF0ZWRJbkNsb3N1cmUoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgewogICAgaWYgKHZhcmlhYmxlIGlzIFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudCkgewogICAgICB2YXJpYWJsZS5fbXV0YXRlZEluQ2xvc3VyZSA9IHRydWU7CiAgICB9IGVsc2UgewogICAgICAvLyBIYWNrIHRvIGRlYWwgd2l0aCB0aGUgZmFjdCB0aGF0IEJvZHlCdWlsZGVyIHN0aWxsIGNyZWF0ZXMgcmF3CiAgICAgIC8vIFZhcmlhYmxlRGVjbGFyYXRpb24gb2JqZWN0cyBzb21ldGltZXMuCiAgICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogZ2V0IHJpZCBvZiB0aGlzIG9uY2UgdGhlIHR5cGUgcGFyYW1ldGVyIGlzCiAgICAgIC8vIEtlcm5lbFZhcmlhYmxlRGVjbGFyYXRpb24uCiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHdhc1ZhcmlhYmxlTXV0YXRlZEFueXdoZXJlKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpIHsKICAgIGlmICh2YXJpYWJsZSBpcyBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQpIHsKICAgICAgcmV0dXJuIHZhcmlhYmxlLl9tdXRhdGVkQW55d2hlcmU7CiAgICB9IGVsc2UgewogICAgICAvLyBIYWNrIHRvIGRlYWwgd2l0aCB0aGUgZmFjdCB0aGF0IEJvZHlCdWlsZGVyIHN0aWxsIGNyZWF0ZXMgcmF3CiAgICAgIC8vIFZhcmlhYmxlRGVjbGFyYXRpb24gb2JqZWN0cyBzb21ldGltZXMuCiAgICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogZ2V0IHJpZCBvZiB0aGlzIG9uY2UgdGhlIHR5cGUgcGFyYW1ldGVyIGlzCiAgICAgIC8vIEtlcm5lbFZhcmlhYmxlRGVjbGFyYXRpb24uCiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KfQoKY2xhc3MgVmFyaWFibGVBc3NpZ25tZW50SnVkZ21lbnQgZXh0ZW5kcyBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IHsKICBWYXJpYWJsZUFzc2lnbm1lbnRKdWRnbWVudC5fKEV4cHJlc3Npb24gcmhzKSA6IHN1cGVyLl8ocmhzKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRWYXJpYWJsZUFzc2lnbm1lbnRKdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBpbiBrZXJuZWwgZm9ybS4KY2xhc3MgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50IGV4dGVuZHMgVmFyaWFibGVEZWNsYXJhdGlvbgogICAgaW1wbGVtZW50cyBTdGF0ZW1lbnRKdWRnbWVudCB7CiAgZmluYWwgYm9vbCBmb3JTeW50aGV0aWNUb2tlbjsKCiAgZmluYWwgYm9vbCBfaW1wbGljaXRseVR5cGVkOwoKICAvLyBUT0RPKGFoZSk6IFJlbW92ZSB0aGlzIGZpZWxkLiBXZSBjYW4gZ2V0IHJpZCBvZiBpdCBieSByZWNvcmRpbmcgY2xvc3VyZQogIC8vIG11dGF0aW9uIGluIFtCb2R5QnVpbGRlcl0uCiAgZmluYWwgaW50IF9mdW5jdGlvbk5lc3RpbmdMZXZlbDsKCiAgLy8gVE9ETyhhaGUpOiBSZW1vdmUgdGhpcyBmaWVsZC4gSXQncyBvbmx5IHVzZWQgbG9jYWxseSB3aGVuIGNvbXBpbGluZyBhCiAgLy8gbWV0aG9kLCBhbmQgdGhpcyBjYW4gdGh1cyBiZSB0cmFja2VkIGluIGEgW1NldF0gKGFjdHVhbGx5LCB0cmFja2luZyB0aGlzCiAgLy8gaW5mb3JtYXRpb24gaW4gYSBbTGlzdF0gaXMgcHJvYmFibHkgZXZlbiBmYXN0ZXIgYXMgdGhlIGF2ZXJhZ2Ugc2l6ZSB3aWxsCiAgLy8gYmUgY2xvc2UgdG8gemVybykuCiAgYm9vbCBfbXV0YXRlZEluQ2xvc3VyZSA9IGZhbHNlOwoKICAvLyBUT0RPKGFoZSk6IEludmVzdGlnYXRlIGlmIHRoaXMgY2FuIGJlIHJlbW92ZWQuCiAgYm9vbCBfbXV0YXRlZEFueXdoZXJlID0gZmFsc2U7CgogIC8vIFRPRE8oYWhlKTogSW52ZXN0aWdhdGUgaWYgdGhpcyBjYW4gYmUgcmVtb3ZlZC4KICBmaW5hbCBib29sIF9pc0xvY2FsRnVuY3Rpb247CgogIFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudChTdHJpbmcgbmFtZSwgdGhpcy5fZnVuY3Rpb25OZXN0aW5nTGV2ZWwsCiAgICAgIHt0aGlzLmZvclN5bnRoZXRpY1Rva2VuOiBmYWxzZSwKICAgICAgRXhwcmVzc2lvbiBpbml0aWFsaXplciwKICAgICAgRGFydFR5cGUgdHlwZSwKICAgICAgYm9vbCBpc0ZpbmFsOiBmYWxzZSwKICAgICAgYm9vbCBpc0NvbnN0OiBmYWxzZSwKICAgICAgYm9vbCBpc0ZpZWxkRm9ybWFsOiBmYWxzZSwKICAgICAgYm9vbCBpc0NvdmFyaWFudDogZmFsc2UsCiAgICAgIGJvb2wgaXNMb2NhbEZ1bmN0aW9uOiBmYWxzZX0pCiAgICAgIDogX2ltcGxpY2l0bHlUeXBlZCA9IHR5cGUgPT0gbnVsbCwKICAgICAgICBfaXNMb2NhbEZ1bmN0aW9uID0gaXNMb2NhbEZ1bmN0aW9uLAogICAgICAgIHN1cGVyKG5hbWUsCiAgICAgICAgICAgIGluaXRpYWxpemVyOiBpbml0aWFsaXplciwKICAgICAgICAgICAgdHlwZTogdHlwZSA/PyBjb25zdCBEeW5hbWljVHlwZSgpLAogICAgICAgICAgICBpc0ZpbmFsOiBpc0ZpbmFsLAogICAgICAgICAgICBpc0NvbnN0OiBpc0NvbnN0LAogICAgICAgICAgICBpc0ZpZWxkRm9ybWFsOiBpc0ZpZWxkRm9ybWFsLAogICAgICAgICAgICBpc0NvdmFyaWFudDogaXNDb3ZhcmlhbnQpOwoKICBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQuZm9yRWZmZWN0KAogICAgICBFeHByZXNzaW9uIGluaXRpYWxpemVyLCB0aGlzLl9mdW5jdGlvbk5lc3RpbmdMZXZlbCkKICAgICAgOiBmb3JTeW50aGV0aWNUb2tlbiA9IGZhbHNlLAogICAgICAgIF9pbXBsaWNpdGx5VHlwZWQgPSBmYWxzZSwKICAgICAgICBfaXNMb2NhbEZ1bmN0aW9uID0gZmFsc2UsCiAgICAgICAgc3VwZXIuZm9yVmFsdWUoaW5pdGlhbGl6ZXIpOwoKICBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQuZm9yVmFsdWUoCiAgICAgIEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIsIHRoaXMuX2Z1bmN0aW9uTmVzdGluZ0xldmVsKQogICAgICA6IGZvclN5bnRoZXRpY1Rva2VuID0gZmFsc2UsCiAgICAgICAgX2ltcGxpY2l0bHlUeXBlZCA9IHRydWUsCiAgICAgICAgX2lzTG9jYWxGdW5jdGlvbiA9IGZhbHNlLAogICAgICAgIHN1cGVyLmZvclZhbHVlKGluaXRpYWxpemVyKTsKCiAgRXhwcmVzc2lvbiBnZXQgaW5pdGlhbGl6ZXJKdWRnbWVudCA9PiBpbml0aWFsaXplcjsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudCh0aGlzKTsKICB9CgogIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gW1ZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudF0gaGFkIGFuIGltcGxpY2l0CiAgLy8vIHR5cGUuCiAgLy8vCiAgLy8vIFRoaXMgaXMgc3RhdGljIHRvIGF2b2lkIGludHJvZHVjaW5nIGEgbWV0aG9kIHRoYXQgd291bGQgYmUgdmlzaWJsZSB0bwogIC8vLyB0aGUga2VybmVsLgogIHN0YXRpYyBib29sIGlzSW1wbGljaXRseVR5cGVkKFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudCB2YXJpYWJsZSkgPT4KICAgICAgdmFyaWFibGUuX2ltcGxpY2l0bHlUeXBlZDsKCiAgLy8vIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gW1ZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudF0gcmVwcmVzZW50cyBhCiAgLy8vIGxvY2FsIGZ1bmN0aW9uLgogIC8vLwogIC8vLyBUaGlzIGlzIHN0YXRpYyB0byBhdm9pZCBpbnRyb2R1Y2luZyBhIG1ldGhvZCB0aGF0IHdvdWxkIGJlIHZpc2libGUgdG8gdGhlCiAgLy8vIGtlcm5lbC4KICBzdGF0aWMgYm9vbCBpc0xvY2FsRnVuY3Rpb24oVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50IHZhcmlhYmxlKSA9PgogICAgICB2YXJpYWJsZS5faXNMb2NhbEZ1bmN0aW9uOwp9CgovLy8gU3ludGhldGljIGp1ZGdtZW50IGNsYXNzIHJlcHJlc2VudGluZyBhbiBhdHRlbXB0IHRvIGludm9rZSBhbiB1bnJlc29sdmVkCi8vLyB0YXJnZXQuCmNsYXNzIFVucmVzb2x2ZWRUYXJnZXRJbnZvY2F0aW9uSnVkZ21lbnQgZXh0ZW5kcyBTeW50aGV0aWNFeHByZXNzaW9uSnVkZ21lbnQgewogIGZpbmFsIEFyZ3VtZW50c0p1ZGdtZW50IGFyZ3VtZW50c0p1ZGdtZW50OwoKICBVbnJlc29sdmVkVGFyZ2V0SW52b2NhdGlvbkp1ZGdtZW50Ll8oCiAgICAgIGtlcm5lbC5FeHByZXNzaW9uIGRlc3VnYXJlZCwgdGhpcy5hcmd1bWVudHNKdWRnbWVudCkKICAgICAgOiBzdXBlci5fKGRlc3VnYXJlZCk7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0VW5yZXNvbHZlZFRhcmdldEludm9jYXRpb25KdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gU3ludGhldGljIGp1ZGdtZW50IGNsYXNzIHJlcHJlc2VudGluZyBhbiBhdHRlbXB0IHRvIGFzc2lnbiB0byBhbiB1bnJlc29sdmVkCi8vLyB2YXJpYWJsZS4KY2xhc3MgVW5yZXNvbHZlZFZhcmlhYmxlQXNzaWdubWVudEp1ZGdtZW50IGV4dGVuZHMgU3ludGhldGljRXhwcmVzc2lvbkp1ZGdtZW50IHsKICBmaW5hbCBib29sIGlzQ29tcG91bmQ7CiAgZmluYWwgRXhwcmVzc2lvbiByaHM7CgogIFVucmVzb2x2ZWRWYXJpYWJsZUFzc2lnbm1lbnRKdWRnbWVudC5fKAogICAgICBrZXJuZWwuRXhwcmVzc2lvbiBkZXN1Z2FyZWQsIHRoaXMuaXNDb21wb3VuZCwgdGhpcy5yaHMpCiAgICAgIDogc3VwZXIuXyhkZXN1Z2FyZWQpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFVucmVzb2x2ZWRWYXJpYWJsZUFzc2lnbm1lbnRKdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYSByZWFkIGZyb20gYSB2YXJpYWJsZSBpbiBrZXJuZWwgZm9ybS4KY2xhc3MgVmFyaWFibGVHZXRKdWRnbWVudCBleHRlbmRzIFZhcmlhYmxlR2V0IGltcGxlbWVudHMgRXhwcmVzc2lvbkp1ZGdtZW50IHsKICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CgogIGZpbmFsIFR5cGVQcm9tb3Rpb25GYWN0IF9mYWN0OwoKICBmaW5hbCBUeXBlUHJvbW90aW9uU2NvcGUgX3Njb3BlOwoKICBWYXJpYWJsZUdldEp1ZGdtZW50KFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIHRoaXMuX2ZhY3QsIHRoaXMuX3Njb3BlKQogICAgICA6IHN1cGVyKHZhcmlhYmxlKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRWYXJpYWJsZUdldEp1ZGdtZW50KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIHdoaWxlIGxvb3AgaW4ga2VybmVsIGZvcm0uCmNsYXNzIFdoaWxlSnVkZ21lbnQgZXh0ZW5kcyBXaGlsZVN0YXRlbWVudCBpbXBsZW1lbnRzIFN0YXRlbWVudEp1ZGdtZW50IHsKICBXaGlsZUp1ZGdtZW50KEV4cHJlc3Npb24gY29uZGl0aW9uLCBTdGF0ZW1lbnQgYm9keSkgOiBzdXBlcihjb25kaXRpb24sIGJvZHkpOwoKICBFeHByZXNzaW9uIGdldCBjb25kaXRpb25KdWRnbWVudCA9PiBjb25kaXRpb247CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRXaGlsZUp1ZGdtZW50KHRoaXMpOwogIH0KfQoKLy8vIENvbmNyZXRlIHNoYWRvdyBvYmplY3QgcmVwcmVzZW50aW5nIGEgeWllbGQgc3RhdGVtZW50IGluIGtlcm5lbCBmb3JtLgpjbGFzcyBZaWVsZEp1ZGdtZW50IGV4dGVuZHMgWWllbGRTdGF0ZW1lbnQgaW1wbGVtZW50cyBTdGF0ZW1lbnRKdWRnbWVudCB7CiAgWWllbGRKdWRnbWVudChib29sIGlzWWllbGRTdGFyLCBFeHByZXNzaW9uIGV4cHJlc3Npb24pCiAgICAgIDogc3VwZXIoZXhwcmVzc2lvbiwgaXNZaWVsZFN0YXI6IGlzWWllbGRTdGFyKTsKCiAgRXhwcmVzc2lvbiBnZXQganVkZ21lbnQgPT4gZXhwcmVzc2lvbjsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFlpZWxkSnVkZ21lbnQodGhpcyk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYSBkZWZlcnJlZCBsb2FkIGxpYnJhcnkgY2FsbC4KY2xhc3MgTG9hZExpYnJhcnlKdWRnbWVudCBleHRlbmRzIExvYWRMaWJyYXJ5IGltcGxlbWVudHMgRXhwcmVzc2lvbkp1ZGdtZW50IHsKICBmaW5hbCBBcmd1bWVudHMgYXJndW1lbnRzOwoKICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CgogIExvYWRMaWJyYXJ5SnVkZ21lbnQoTGlicmFyeURlcGVuZGVuY3kgaW1wb3J0LCB0aGlzLmFyZ3VtZW50cykgOiBzdXBlcihpbXBvcnQpOwoKICBBcmd1bWVudHNKdWRnbWVudCBnZXQgYXJndW1lbnRKdWRnbWVudHMgPT4gYXJndW1lbnRzOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdExvYWRMaWJyYXJ5SnVkZ21lbnQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KfQoKLy8vIENvbmNyZXRlIHNoYWRvdyBvYmplY3QgcmVwcmVzZW50aW5nIGEgdGVhci1vZmYgb2YgYSBgbG9hZExpYnJhcnlgIGZ1bmN0aW9uLgpjbGFzcyBMb2FkTGlicmFyeVRlYXJPZmZKdWRnbWVudCBleHRlbmRzIFN0YXRpY0dldAogICAgaW1wbGVtZW50cyBFeHByZXNzaW9uSnVkZ21lbnQgewogIGZpbmFsIExpYnJhcnlEZXBlbmRlbmN5IGltcG9ydDsKCiAgRGFydFR5cGUgaW5mZXJyZWRUeXBlOwoKICBMb2FkTGlicmFyeVRlYXJPZmZKdWRnbWVudCh0aGlzLmltcG9ydCwgUHJvY2VkdXJlIHRhcmdldCkgOiBzdXBlcih0YXJnZXQpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdExvYWRMaWJyYXJ5VGVhck9mZkp1ZGdtZW50KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9Cn0KCi8vLyBUaGUgcmVzdWx0IG9mIGluZmVyZW5jZSBmb3IgYSBSSFMgb2YgYW4gYXNzaWdubWVudC4KY2xhc3MgX0NvbXBsZXhBc3NpZ25tZW50SW5mZXJlbmNlUmVzdWx0IHsKICAvLy8gVGhlIHJlc29sdmVkIGNvbWJpbmVyIFtQcm9jZWR1cmVdLCBlLmcuIGBvcGVyYXRvcitgIGZvciBgYSArPSAyYCwgb3IKICAvLy8gYG51bGxgIGlmIHRoZSBhc3NpZ25tZW50IGlzIG5vdCBjb21wb3VuZC4KICBmaW5hbCBQcm9jZWR1cmUgY29tYmluZXI7CgogIF9Db21wbGV4QXNzaWdubWVudEluZmVyZW5jZVJlc3VsdCh0aGlzLmNvbWJpbmVyKTsKfQoKY2xhc3MgX1VuZmluaXNoZWRDYXNjYWRlIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgYWNjZXB0KHYpID0+IHVuc3VwcG9ydGVkKCJhY2NlcHQiLCAtMSwgbnVsbCk7CgogIGFjY2VwdDEodiwgYXJnKSA9PiB1bnN1cHBvcnRlZCgiYWNjZXB0MSIsIC0xLCBudWxsKTsKCiAgZ2V0U3RhdGljVHlwZSh0eXBlcykgPT4gdW5zdXBwb3J0ZWQoImdldFN0YXRpY1R5cGUiLCAtMSwgbnVsbCk7CgogIHRyYW5zZm9ybUNoaWxkcmVuKHYpID0+IHVuc3VwcG9ydGVkKCJ0cmFuc2Zvcm1DaGlsZHJlbiIsIC0xLCBudWxsKTsKCiAgdmlzaXRDaGlsZHJlbih2KSA9PiB1bnN1cHBvcnRlZCgidmlzaXRDaGlsZHJlbiIsIC0xLCBudWxsKTsKfQoKY2xhc3MgU3ludGhldGljV3JhcHBlciB7CiAgc3RhdGljIEV4cHJlc3Npb24gd3JhcElsbGVnYWxBc3NpZ25tZW50KEV4cHJlc3Npb24gcmhzLAogICAgICB7aW50IGFzc2lnbm1lbnRPZmZzZXQ6IC0xfSkgewogICAgcmV0dXJuIG5ldyBJbGxlZ2FsQXNzaWdubWVudEp1ZGdtZW50Ll8ocmhzLAogICAgICAgIGFzc2lnbm1lbnRPZmZzZXQ6IGFzc2lnbm1lbnRPZmZzZXQpCiAgICAgIC4uZmlsZU9mZnNldCA9IHJocy5maWxlT2Zmc2V0OwogIH0KCiAgc3RhdGljIEV4cHJlc3Npb24gd3JhcEluZGV4QXNzaWdubWVudCgKICAgICAgRXhwcmVzc2lvbiByZWNlaXZlciwgRXhwcmVzc2lvbiBpbmRleCwgRXhwcmVzc2lvbiByaHMsCiAgICAgIHtib29sIGlzU3VwZXI6IGZhbHNlfSkgewogICAgcmV0dXJuIG5ldyBJbmRleEFzc2lnbm1lbnRKdWRnbWVudC5fKHJlY2VpdmVyLCBpbmRleCwgcmhzLCBpc1N1cGVyOiBpc1N1cGVyKQogICAgICAuLmZpbGVPZmZzZXQgPSBpbmRleC5maWxlT2Zmc2V0OwogIH0KCiAgc3RhdGljIEV4cHJlc3Npb24gd3JhcEludmFsaWRDb25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICAgIGtlcm5lbC5FeHByZXNzaW9uIGRlc3VnYXJlZCwgTWVtYmVyIGNvbnN0cnVjdG9yLCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IEludmFsaWRDb25zdHJ1Y3Rvckludm9jYXRpb25KdWRnbWVudC5fKAogICAgICAgIGRlc3VnYXJlZCwgY29uc3RydWN0b3IsIGFyZ3VtZW50cykKICAgICAgLi5maWxlT2Zmc2V0ID0gZGVzdWdhcmVkLmZpbGVPZmZzZXQ7CiAgfQoKICBzdGF0aWMgRXhwcmVzc2lvbiB3cmFwSW52YWxpZFdyaXRlKAogICAgICBFeHByZXNzaW9uIGRlc3VnYXJlZCwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgICByZXR1cm4gbmV3IEludmFsaWRXcml0ZUp1ZGdtZW50Ll8oZGVzdWdhcmVkLCBleHByZXNzaW9uKQogICAgICAuLmZpbGVPZmZzZXQgPSBkZXN1Z2FyZWQuZmlsZU9mZnNldDsKICB9CgogIHN0YXRpYyBFeHByZXNzaW9uIHdyYXBQcm9wZXJ0eUFzc2lnbm1lbnQoRXhwcmVzc2lvbiByZWNlaXZlciwgRXhwcmVzc2lvbiByaHMsCiAgICAgIHtib29sIGlzU3VwZXI6IGZhbHNlfSkgewogICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUFzc2lnbm1lbnRKdWRnbWVudC5fKHJlY2VpdmVyLCByaHMsIGlzU3VwZXI6IGlzU3VwZXIpCiAgICAgIC4uZmlsZU9mZnNldCA9IHJocy5maWxlT2Zmc2V0OwogIH0KCiAgc3RhdGljIEV4cHJlc3Npb24gd3JhcFN0YXRpY0Fzc2lnbm1lbnQoRXhwcmVzc2lvbiByaHMpIHsKICAgIHJldHVybiBuZXcgU3RhdGljQXNzaWdubWVudEp1ZGdtZW50Ll8ocmhzKS4uZmlsZU9mZnNldCA9IHJocy5maWxlT2Zmc2V0OwogIH0KCiAgc3RhdGljIEV4cHJlc3Npb24gd3JhcFN5bnRoZXRpY0V4cHJlc3Npb24oRXhwcmVzc2lvbiBkZXN1Z2FyZWQpIHsKICAgIHJldHVybiBuZXcgU3ludGhldGljRXhwcmVzc2lvbkp1ZGdtZW50Ll8oZGVzdWdhcmVkKQogICAgICAuLmZpbGVPZmZzZXQgPSBkZXN1Z2FyZWQuZmlsZU9mZnNldDsKICB9CgogIHN0YXRpYyBFeHByZXNzaW9uIHdyYXBVbnJlc29sdmVkVGFyZ2V0SW52b2NhdGlvbigKICAgICAgRXhwcmVzc2lvbiBkZXN1Z2FyZWQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBuZXcgVW5yZXNvbHZlZFRhcmdldEludm9jYXRpb25KdWRnbWVudC5fKGRlc3VnYXJlZCwgYXJndW1lbnRzKQogICAgICAuLmZpbGVPZmZzZXQgPSBkZXN1Z2FyZWQuZmlsZU9mZnNldDsKICB9CgogIHN0YXRpYyBFeHByZXNzaW9uIHdyYXBVbnJlc29sdmVkVmFyaWFibGVBc3NpZ25tZW50KAogICAgICBFeHByZXNzaW9uIGRlc3VnYXJlZCwgYm9vbCBpc0NvbXBvdW5kLCBFeHByZXNzaW9uIHJo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cnJlciBpbmZlcnJlcjsKCiAgQ2xhc3MgbWFwRW50cnlDbGFzczsKCiAgLy8gU3RvcmVzIHRoZSBvZmZzZXQgb2YgdGhlIG1hcCBlbnRyeSBmb3VuZCBieSBpbmZlck1hcEVudHJ5LgogIGludCBtYXBFbnRyeU9mZnNldCA9IG51bGw7CgogIC8vIFN0b3JlcyB0aGUgb2Zmc2V0IG9mIHRoZSBtYXAgc3ByZWFkIGZvdW5kIGJ5IGluZmVyTWFwRW50cnkuCiAgaW50IG1hcFNwcmVhZE9mZnNldCA9IG51bGw7CgogIC8vIFN0b3JlcyB0aGUgb2Zmc2V0IG9mIHRoZSBpdGVyYWJsZSBzcHJlYWQgZm91bmQgYnkgaW5mZXJNYXBFbnRyeS4KICBpbnQgaXRlcmFibGVTcHJlYWRPZmZzZXQgPSBudWxsOwoKICAvLyBTdG9yZXMgdGhlIHR5cGUgb2YgdGhlIGl0ZXJhYmxlIHNwcmVhZCBmb3VuZCBieSBpbmZlck1hcEVudHJ5LgogIERhcnRUeXBlIGl0ZXJhYmxlU3ByZWFkVHlwZSA9IG51bGw7CgogIEluZmVyZW5jZVZpc2l0b3IodGhpcy5pbmZlcnJlcik7CgogIEBvdmVycmlkZQogIHZvaWQgZGVmYXVsdEV4cHJlc3Npb24oRXhwcmVzc2lvbiBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgdW5oYW5kbGVkKCIke25vZGUucnVudGltZVR5cGV9IiwgIkluZmVyZW5jZVZpc2l0b3IiLCBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgaW5mZXJyZXIuaGVscGVyLnVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRTdGF0ZW1lbnQoU3RhdGVtZW50IG5vZGUsIF8pIHsKICAgIHVuaGFuZGxlZCgiJHtub2RlLnJ1bnRpbWVUeXBlfSIsICJJbmZlcmVuY2VWaXNpdG9yIiwgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgIGluZmVycmVyLmhlbHBlci51cmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludmFsaWRFeHByZXNzaW9uKEludmFsaWRFeHByZXNzaW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW50TGl0ZXJhbChJbnRMaXRlcmFsIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RG91YmxlTGl0ZXJhbChEb3VibGVMaXRlcmFsIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXNFeHByZXNzaW9uKEFzRXhwcmVzc2lvbiBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgIG5vZGUub3BlcmFuZCwgY29uc3QgVW5rbm93blR5cGUoKSwgIWluZmVycmVyLmlzVG9wTGV2ZWwsCiAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgfQoKICB2b2lkIHZpc2l0QXNzZXJ0SW5pdGlhbGl6ZXJKdWRnbWVudChBc3NlcnRJbml0aWFsaXplckp1ZGdtZW50IG5vZGUpIHsKICAgIGluZmVycmVyLmluZmVyU3RhdGVtZW50KG5vZGUuanVkZ21lbnQpOwogIH0KCiAgdm9pZCB2aXNpdEFzc2VydFN0YXRlbWVudEp1ZGdtZW50KEFzc2VydFN0YXRlbWVudEp1ZGdtZW50IG5vZGUpIHsKICAgIHZhciBjb25kaXRpb25KdWRnbWVudCA9IG5vZGUuY29uZGl0aW9uSnVkZ21lbnQ7CiAgICB2YXIgbWVzc2FnZUp1ZGdtZW50ID0gbm9kZS5tZXNzYWdlSnVkZ21lbnQ7CiAgICB2YXIgZXhwZWN0ZWRUeXBlID0gaW5mZXJyZXIuY29yZVR5cGVzLmJvb2xDbGFzcy5yYXdUeXBlOwogICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgIGNvbmRpdGlvbkp1ZGdtZW50LCBleHBlY3RlZFR5cGUsICFpbmZlcnJlci5pc1RvcExldmVsKTsKICAgIGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgZXhwZWN0ZWRUeXBlLAogICAgICAgIGdldEluZmVycmVkVHlwZShjb25kaXRpb25KdWRnbWVudCwgaW5mZXJyZXIpLAogICAgICAgIGNvbmRpdGlvbkp1ZGdtZW50LAogICAgICAgIGNvbmRpdGlvbkp1ZGdtZW50LmZpbGVPZmZzZXQpOwogICAgaWYgKG1lc3NhZ2VKdWRnbWVudCAhPSBudWxsKSB7CiAgICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICAgIG1lc3NhZ2VKdWRnbWVudCwgY29uc3QgVW5rbm93blR5cGUoKSwgIWluZmVycmVyLmlzVG9wTGV2ZWwpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEF3YWl0RXhwcmVzc2lvbihBd2FpdEV4cHJlc3Npb24gbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIGlmICghaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LmlzRW1wdHlDb250ZXh0KHR5cGVDb250ZXh0KSkgewogICAgICB0eXBlQ29udGV4dCA9IGluZmVycmVyLndyYXBGdXR1cmVPclR5cGUodHlwZUNvbnRleHQpOwogICAgfQogICAgdmFyIG9wZXJhbmQgPSBub2RlLm9wZXJhbmQ7CiAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24ob3BlcmFuZCwgdHlwZUNvbnRleHQsIHRydWUsIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgaW5mZXJyZXIuc3RvcmVJbmZlcnJlZFR5cGUoCiAgICAgICAgbm9kZSwKICAgICAgICBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAgICAgLnVuZnV0dXJlVHlwZShnZXRJbmZlcnJlZFR5cGUob3BlcmFuZCwgaW5mZXJyZXIpKSk7CiAgfQoKICB2b2lkIHZpc2l0QmxvY2tKdWRnbWVudChCbG9ja0p1ZGdtZW50IG5vZGUpIHsKICAgIGZvciAodmFyIGp1ZGdtZW50IGluIG5vZGUuanVkZ21lbnRzKSB7CiAgICAgIGluZmVycmVyLmluZmVyU3RhdGVtZW50KGp1ZGdtZW50KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCb29sTGl0ZXJhbChCb29sTGl0ZXJhbCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJyZWFrU3RhdGVtZW50KEJyZWFrU3RhdGVtZW50IG5vZGUsIF8pIHsKICAgIC8vIE5vIGluZmVyZW5jZSBuZWVkcyB0byBiZSBkb25lLgogIH0KCiAgdm9pZCB2aXNpdENhc2NhZGVKdWRnbWVudChDYXNjYWRlSnVkZ21lbnQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIG5vZGUuaW5mZXJyZWRUeXBlID0KICAgICAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24obm9kZS50YXJnZXRKdWRnbWVudCwgdHlwZUNvbnRleHQsIHRydWUpOwogICAgbm9kZS52YXJpYWJsZS50eXBlID0gZ2V0SW5mZXJyZWRUeXBlKG5vZGUsIGluZmVycmVyKTsKICAgIGZvciAodmFyIGp1ZGdtZW50IGluIG5vZGUuY2FzY2FkZUp1ZGdtZW50cykgewogICAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgICBqdWRnbWVudCwgY29uc3QgVW5rbm93blR5cGUoKSwgIWluZmVycmVyLmlzVG9wTGV2ZWwsCiAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbmRpdGlvbmFsRXhwcmVzc2lvbigKICAgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICB2YXIgY29uZGl0aW9uID0gbm9kZS5jb25kaXRpb247CiAgICB2YXIgdGhlbiA9IG5vZGUudGhlbjsKICAgIHZhciBvdGhlcndpc2UgPSBub2RlLm90aGVyd2lzZTsKICAgIHZhciBleHBlY3RlZFR5cGUgPSBpbmZlcnJlci5jb3JlVHlwZXMuYm9vbENsYXNzLnJhd1R5cGU7CiAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oY29uZGl0aW9uLCBleHBlY3RlZFR5cGUsICFpbmZlcnJlci5pc1RvcExldmVsKTsKICAgIGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgZXhwZWN0ZWRUeXBlLAogICAgICAgIGdldEluZmVycmVkVHlwZShjb25kaXRpb24sIGluZmVycmVyKSwKICAgICAgICBub2RlLmNvbmRpdGlvbiwKICAgICAgICBub2RlLmNvbmRpdGlvbi5maWxlT2Zmc2V0KTsKICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbih0aGVuLCB0eXBlQ29udGV4dCwgdHJ1ZSwgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24ob3RoZXJ3aXNlLCB0eXBlQ29udGV4dCwgdHJ1ZSwgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGUgPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAuZ2V0U3RhbmRhcmRVcHBlckJvdW5kKGdldEluZmVycmVkVHlwZSh0aGVuLCBpbmZlcnJlciksCiAgICAgICAgICAgIGdldEluZmVycmVkVHlwZShvdGhlcndpc2UsIGluZmVycmVyKSk7CiAgICBub2RlLnN0YXRpY1R5cGUgPSBpbmZlcnJlZFR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgICBDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHZhciBsaWJyYXJ5ID0gaW5mZXJyZXIuZW5naW5lLmJlaW5nSW5mZXJyZWRbbm9kZS50YXJnZXRdOwogICAgaWYgKGxpYnJhcnkgIT0gbnVsbCkgewogICAgICAvLyBUaGVyZSBpcyBhIGN5Y2xpYyBkZXBlbmRlbmN5IHdoZXJlIGluZmVycmluZyB0aGUgdHlwZXMgb2YgdGhlCiAgICAgIC8vIGluaXRpYWxpemluZyBmb3JtYWxzIG9mIGEgY29uc3RydWN0b3IgcmVxdWlyZWQgdXMgdG8gaW5mZXIgdGhlCiAgICAgIC8vIGNvcnJlc3BvbmRpbmcgZmllbGQgdHlwZSB3aGljaCByZXF1aXJlZCB1cyB0byBrbm93IHRoZSB0eXBlIG9mIHRoZQogICAgICAvLyBjb25zdHJ1Y3Rvci4KICAgICAgU3RyaW5nIG5hbWUgPSBub2RlLnRhcmdldC5lbmNsb3NpbmdDbGFzcy5uYW1lOwogICAgICBpZiAobm9kZS50YXJnZXQubmFtZS5uYW1lLmlzTm90RW1wdHkpIHsKICAgICAgICAvLyBUT0RPKGFoZSk6IFVzZSBgaW5mZXJyZXIuaGVscGVyLmNvbnN0cnVjdG9yTmFtZUZvckRpYWdub3N0aWNzYAogICAgICAgIC8vIGluc3RlYWQuIEhvd2V2ZXIsIGBpbmZlcnJlci5oZWxwZXJgIG1heSBiZSBudWxsLgogICAgICAgIG5hbWUgKz0gIi4ke25vZGUudGFyZ2V0Lm5hbWUubmFtZX0iOwogICAgICB9CiAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlQ2FudEluZmVyVHlwZUR1ZVRvQ2lyY3VsYXJpdHkud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgIG5vZGUudGFyZ2V0LmZpbGVPZmZzZXQsCiAgICAgICAgICBuYW1lLmxlbmd0aCwKICAgICAgICAgIG5vZGUudGFyZ2V0LmZpbGVVcmkpOwogICAgICBmb3IgKHZhciBkZWNsYXJhdGlvbiBpbiBub2RlLnRhcmdldC5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICAgIGRlY2xhcmF0aW9uLnR5cGUgPz89IGNvbnN0IEludmFsaWRUeXBlKCk7CiAgICAgIH0KICAgICAgZm9yICh2YXIgZGVjbGFyYXRpb24gaW4gbm9kZS50YXJnZXQuZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgICAgZGVjbGFyYXRpb24udHlwZSA/Pz0gY29uc3QgSW52YWxpZFR5cGUoKTsKICAgICAgfQogICAgfSBlbHNlIGlmICgobGlicmFyeSA9IGluZmVycmVyLmVuZ2luZS50b0JlSW5mZXJyZWRbbm9kZS50YXJnZXRdKSAhPSBudWxsKSB7CiAgICAgIGluZmVycmVyLmVuZ2luZS50b0JlSW5mZXJyZWQucmVtb3ZlKG5vZGUudGFyZ2V0KTsKICAgICAgaW5mZXJyZXIuZW5naW5lLmJlaW5nSW5mZXJyZWRbbm9kZS50YXJnZXRdID0gbGlicmFyeTsKICAgICAgZm9yICh2YXIgZGVjbGFyYXRpb24gaW4gbm9kZS50YXJnZXQuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMpIHsKICAgICAgICBpbmZlcnJlci5lbmdpbmUuaW5mZXJJbml0aWFsaXppbmdGb3JtYWwoZGVjbGFyYXRpb24sIG5vZGUudGFyZ2V0KTsKICAgICAgfQogICAgICBmb3IgKHZhciBkZWNsYXJhdGlvbiBpbiBub2RlLnRhcmdldC5mdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgICBpbmZlcnJlci5lbmdpbmUuaW5mZXJJbml0aWFsaXppbmdGb3JtYWwoZGVjbGFyYXRpb24sIG5vZGUudGFyZ2V0KTsKICAgICAgfQogICAgICBpbmZlcnJlci5lbmdpbmUuYmVpbmdJbmZlcnJlZC5yZW1vdmUobm9kZS50YXJnZXQpOwogICAgfQogICAgYm9vbCBoYXNFeHBsaWNpdFR5cGVBcmd1bWVudHMgPQogICAgICAgIGdldEV4cGxpY2l0VHlwZUFyZ3VtZW50cyhub2RlLmFyZ3VtZW50cykgIT0gbnVsbDsKICAgIHZhciBpbmZlcmVuY2VSZXN1bHQgPSBpbmZlcnJlci5pbmZlckludm9jYXRpb24oCiAgICAgICAgdHlwZUNvbnRleHQsCiAgICAgICAgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgIG5vZGUudGFyZ2V0LmZ1bmN0aW9uLmZ1bmN0aW9uVHlwZSwKICAgICAgICBjb21wdXRlQ29uc3RydWN0b3JSZXR1cm5UeXBlKG5vZGUudGFyZ2V0KSwKICAgICAgICBub2RlLmFyZ3VtZW50cywKICAgICAgICBpc0NvbnN0OiBub2RlLmlzQ29uc3QpOwogICAgaW5mZXJyZXIuc3RvcmVJbmZlcnJlZFR5cGUobm9kZSwgaW5mZXJlbmNlUmVzdWx0LnR5cGUpOwogICAgaWYgKCFpbmZlcnJlci5pc1RvcExldmVsKSB7CiAgICAgIEtlcm5lbExpYnJhcnlCdWlsZGVyIGxpYnJhcnkgPSBpbmZlcnJlci5saWJyYXJ5OwogICAgICBpZiAoIWhhc0V4cGxpY2l0VHlwZUFyZ3VtZW50cykgewogICAgICAgIGxpYnJhcnkuY2hlY2tCb3VuZHNJbkNvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgICAgICAgbm9kZSwgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LAogICAgICAgICAgICBpbmZlcnJlZDogdHJ1ZSk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgdmlzaXRDb250aW51ZVN3aXRjaEp1ZGdtZW50KENvbnRpbnVlU3dpdGNoSnVkZ21lbnQgbm9kZSkgewogICAgLy8gTm8gaW5mZXJlbmNlIG5lZWRzIHRvIGJlIGRvbmUuCiAgfQogIHZvaWQgdmlzaXREZWZlcnJlZENoZWNrSnVkZ21lbnQoCiAgICAgIERlZmVycmVkQ2hlY2tKdWRnbWVudCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgLy8gU2luY2UgdGhlIHZhcmlhYmxlIGlzIG5vdCB1c2VkIGluIHRoZSBib2R5IHdlIGRvbid0IG5lZWQgdG8gdHlwZSBpbmZlcgogICAgLy8gaXQuICBXZSBjYW4ganVzdCB0eXBlIGluZmVyIHRoZSBib2R5LgogICAgdmFyIGp1ZGdtZW50ID0gbm9kZS5qdWRnbWVudDsKICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihqdWRnbWVudCwgdHlwZUNvbnRleHQsIHRydWUsIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgbm9kZS5pbmZlcnJlZFR5cGUgPSBnZXRJbmZlcnJlZFR5cGUoanVkZ21lbnQsIGluZmVycmVyKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCB2aXNpdERvSnVkZ21lbnQoRG9KdWRnbWVudCBub2RlKSB7CiAgICB2YXIgY29uZGl0aW9uSnVkZ21lbnQgPSBub2RlLmNvbmRpdGlvbkp1ZGdtZW50OwogICAgaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQobm9kZS5ib2R5KTsKICAgIHZhciBib29sVHlwZSA9IGluZmVycmVyLmNvcmVUeXBlcy5ib29sQ2xhc3MucmF3VHlwZTsKICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihjb25kaXRpb25KdWRnbWVudCwgYm9vbFR5cGUsICFpbmZlcnJlci5pc1RvcExldmVsKTsKICAgIGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgYm9vbFR5cGUsCiAgICAgICAgZ2V0SW5mZXJyZWRUeXBlKGNvbmRpdGlvbkp1ZGdtZW50LCBpbmZlcnJlciksCiAgICAgICAgbm9kZS5jb25kaXRpb24sCiAgICAgICAgbm9kZS5jb25kaXRpb24uZmlsZU9mZnNldCk7CiAgfQoKICB2b2lkIHZpc2l0RG91YmxlSnVkZ21lbnQoRG91YmxlSnVkZ21lbnQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIG5vZGUuaW5mZXJyZWRUeXBlID0gaW5mZXJyZXIuY29yZVR5cGVzLmRvdWJsZUNsYXNzLnJhd1R5cGU7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgdmlzaXRFbXB0eVN0YXRlbWVudEp1ZGdtZW50KEVtcHR5U3RhdGVtZW50SnVkZ21lbnQgbm9kZSkgewogICAgLy8gTm8gaW5mZXJlbmNlIG5lZWRzIHRvIGJlIGRvbmUuCiAgfQogIHZvaWQgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50SnVkZ21lbnQoRXhwcmVzc2lvblN0YXRlbWVudEp1ZGdtZW50IG5vZGUpIHsKICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICBub2RlLmp1ZGdtZW50LCBjb25zdCBVbmtub3duVHlwZSgpLCAhaW5mZXJyZXIuaXNUb3BMZXZlbCwKICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICB9CgogIHZvaWQgdmlzaXRGYWN0b3J5Q29uc3RydWN0b3JJbnZvY2F0aW9uSnVkZ21lbnQoCiAgICAgIEZhY3RvcnlDb25zdHJ1Y3Rvckludm9jYXRpb25KdWRnbWVudCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgYm9vbCBoYWRFeHBsaWNpdFR5cGVBcmd1bWVudHMgPQogICAgICAgIGdldEV4cGxpY2l0VHlwZUFyZ3VtZW50cyhub2RlLmFyZ3VtZW50cykgIT0gbnVsbDsKICAgIHZhciBpbmZlcmVuY2VSZXN1bHQgPSBpbmZlcnJlci5pbmZlckludm9jYXRpb24oCiAgICAgICAgdHlwZUNvbnRleHQsCiAgICAgICAgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgIG5vZGUudGFyZ2V0LmZ1bmN0aW9uLmZ1bmN0aW9uVHlwZSwKICAgICAgICBjb21wdXRlQ29uc3RydWN0b3JSZXR1cm5UeXBlKG5vZGUudGFyZ2V0KSwKICAgICAgICBub2RlLmFyZ3VtZW50SnVkZ21lbnRzLAogICAgICAgIGlzQ29uc3Q6IG5vZGUuaXNDb25zdCk7CiAgICBub2RlLmluZmVycmVkVHlwZSA9IGluZmVyZW5jZVJlc3VsdC50eXBlOwogICAgaWYgKCFpbmZlcnJlci5pc1RvcExldmVsKSB7CiAgICAgIEtlcm5lbExpYnJhcnlCdWlsZGVyIGxpYnJhcnkgPSBpbmZlcnJlci5saWJyYXJ5OwogICAgICBpZiAoIWhhZEV4cGxpY2l0VHlwZUFyZ3VtZW50cykgewogICAgICAgIGxpYnJhcnkuY2hlY2tCb3VuZHNJbkZhY3RvcnlJbnZvY2F0aW9uKAogICAgICAgICAgICBub2RlLCBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQsCiAgICAgICAgICAgIGluZmVycmVkOiB0cnVlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIHZpc2l0U2hhZG93RmllbGRJbml0aWFsaXplcihTaGFkb3dGaWVsZEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHZhciBpbml0aWFsaXplclR5cGUgPQogICAgICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihub2RlLnZhbHVlLCBub2RlLmZpZWxkLnR5cGUsIHRydWUpOwogICAgaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZSgKICAgICAgICBub2RlLmZpZWxkLnR5cGUsIGluaXRpYWxpemVyVHlwZSwgbm9kZS52YWx1ZSwgbm9kZS5maWxlT2Zmc2V0KTsKICB9CgogIHZvaWQgaGFuZGxlRm9ySW5EZWNsYXJpbmdWYXJpYWJsZSgKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgRXhwcmVzc2lvbiBpdGVyYWJsZSwgU3RhdGVtZW50IGJvZHksCiAgICAgIHtib29sIGlzQXN5bmM6IGZhbHNlfSkgewogICAgRGFydFR5cGUgZWxlbWVudFR5cGU7CiAgICBib29sIHR5cGVOZWVkZWQgPSBmYWxzZTsKICAgIGJvb2wgdHlwZUNoZWNrc05lZWRlZCA9ICFpbmZlcnJlci5pc1RvcExldmVsOwogICAgaWYgKFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudC5pc0ltcGxpY2l0bHlUeXBlZCh2YXJpYWJsZSkpIHsKICAgICAgdHlwZU5lZWRlZCA9IHRydWU7CiAgICAgIGVsZW1lbnRUeXBlID0gY29uc3QgVW5rbm93blR5cGUoKTsKICAgIH0gZWxzZSB7CiAgICAgIGVsZW1lbnRUeXBlID0gdmFyaWFibGUudHlwZTsKICAgIH0KCiAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGUgPSBpbmZlckZvckluSXRlcmFibGUoCiAgICAgICAgaXRlcmFibGUsIGVsZW1lbnRUeXBlLCB0eXBlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQsCiAgICAgICAgaXNBc3luYzogaXNBc3luYyk7CiAgICBpZiAodHlwZU5lZWRlZCkgewogICAgICBpbmZlcnJlci5pbnN0cnVtZW50YXRpb24/LnJlY29yZChpbmZlcnJlci51cmksIHZhcmlhYmxlLmZpbGVPZmZzZXQsCiAgICAgICAgICAndHlwZScsIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGUoaW5mZXJyZWRUeXBlKSk7CiAgICAgIHZhcmlhYmxlLnR5cGUgPSBpbmZlcnJlZFR5cGU7CiAgICB9CgogICAgaWYgKGJvZHkgIT0gbnVsbCkgaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQoYm9keSk7CgogICAgVmFyaWFibGVEZWNsYXJhdGlvbiB0ZW1wVmFyID0KICAgICAgICBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbihudWxsLCB0eXBlOiBpbmZlcnJlZFR5cGUsIGlzRmluYWw6IHRydWUpOwogICAgVmFyaWFibGVHZXQgdmFyaWFibGVHZXQgPSBuZXcgVmFyaWFibGVHZXQodGVtcFZhcikKICAgICAgLi5maWxlT2Zmc2V0ID0gdmFyaWFibGUuZmlsZU9mZnNldDsKICAgIFRyZWVOb2RlIHBhcmVudCA9IHZhcmlhYmxlLnBhcmVudDsKICAgIEV4cHJlc3Npb24gaW1wbGljaXREb3duY2FzdCA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgdmFyaWFibGUudHlwZSwgaW5mZXJyZWRUeXBlLCB2YXJpYWJsZUdldCwgcGFyZW50LmZpbGVPZmZzZXQsCiAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlRm9ySW5Mb29wRWxlbWVudFR5cGVOb3RBc3NpZ25hYmxlKTsKICAgIGlmIChpbXBsaWNpdERvd25jYXN0ICE9IG51bGwpIHsKICAgICAgcGFyZW50LnJlcGxhY2VDaGlsZCh2YXJpYWJsZSwgdGVtcFZhcik7CiAgICAgIHZhcmlhYmxlLmluaXRpYWxpemVyID0gaW1wbGljaXREb3duY2FzdC4ucGFyZW50ID0gdmFyaWFibGU7CiAgICAgIGlmIChib2R5ID09IG51bGwpIHsKICAgICAgICBpZiAocGFyZW50IGlzIEZvckluRWxlbWVudCkgewogICAgICAgICAgcGFyZW50LnByb2xvZ3VlID0gdmFyaWFibGU7CiAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQgaXMgRm9ySW5NYXBFbnRyeSkgewogICAgICAgICAgcGFyZW50LnByb2xvZ3VlID0gdmFyaWFibGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHVuaGFuZGxlZCgiJHtwYXJlbnQucnVudGltZVR5cGV9IiwgImhhbmRsZUZvckluRGVjbGFyaW5nVmFyaWFibGUiLAogICAgICAgICAgICAgIHZhcmlhYmxlLmZpbGVPZmZzZXQsIHZhcmlhYmxlLmxvY2F0aW9uLmZpbGUpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBwYXJlbnQucmVwbGFjZUNoaWxkKGJvZHksIGNvbWJpbmVTdGF0ZW1lbnRzKHZhcmlhYmxlLCBib2R5KSk7CiAgICAgIH0KICAgIH0KICB9CgogIERhcnRUeXBlIGluZmVyRm9ySW5JdGVyYWJsZSgKICAgICAgRXhwcmVzc2lvbiBpdGVyYWJsZSwgRGFydFR5cGUgZWxlbWVudFR5cGUsIGJvb2wgdHlwZU5lZWRlZCwKICAgICAge2Jvb2wgaXNBc3luYzogZmFsc2V9KSB7CiAgICBDbGFzcyBpdGVyYWJsZUNsYXNzID0gaXNBc3luYwogICAgICAgID8gaW5mZXJyZXIuY29yZVR5cGVzLnN0cmVhbUNsYXNzCiAgICAgICAgOiBpbmZlcnJlci5jb3JlVHlwZXMuaXRlcmFibGVDbGFzczsKICAgIERhcnRUeXBlIGNvbnRleHQgPSBpbmZlcnJlci53cmFwVHlwZShlbGVtZW50VHlwZSwgaXRlcmFibGVDbGFzcyk7CiAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oaXRlcmFibGUsIGNvbnRleHQsIHR5cGVOZWVkZWQpOwogICAgRGFydFR5cGUgaW5mZXJyZWRFeHByZXNzaW9uVHlwZSA9CiAgICAgICAgaW5mZXJyZXIucmVzb2x2ZVR5cGVQYXJhbWV0ZXIoZ2V0SW5mZXJyZWRUeXBlKGl0ZXJhYmxlLCBpbmZlcnJlcikpOwogICAgaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZSgKICAgICAgICBpbmZlcnJlci53cmFwVHlwZShjb25zdCBEeW5hbWljVHlwZSgpLCBpdGVyYWJsZUNsYXNzKSwKICAgICAgICBpbmZlcnJlZEV4cHJlc3Npb25UeXBlLAogICAgICAgIGl0ZXJhYmxlLAogICAgICAgIGl0ZXJhYmxlLmZpbGVPZmZzZXQsCiAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlRm9ySW5Mb29wVHlwZU5vdEl0ZXJhYmxlKTsKICAgIERhcnRUeXBlIGluZmVycmVkVHlwZTsKICAgIGlmICh0eXBlTmVlZGVkKSB7CiAgICAgIGluZmVycmVkVHlwZSA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgIGlmIChpbmZlcnJlZEV4cHJlc3Npb25UeXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICBJbnRlcmZhY2VUeXBlIHN1cGVydHlwZSA9IGluZmVycmVyLmNsYXNzSGllcmFyY2h5CiAgICAgICAgICAgIC5nZXRUeXBlQXNJbnN0YW5jZU9mKGluZmVycmVkRXhwcmVzc2lvblR5cGUsIGl0ZXJhYmxlQ2xhc3MpOwogICAgICAgIGlmIChzdXBlcnR5cGUgIT0gbnVsbCkgewogICAgICAgICAgaW5mZXJyZWRUeXBlID0gc3VwZXJ0eXBlLnR5cGVBcmd1bWVudHNbMF07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gaW5mZXJyZWRUeXBlOwogIH0KCiAgdm9pZCBoYW5kbGVGb3JJbldpdGhvdXRWYXJpYWJsZSgKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgRXhwcmVzc2lvbiBpdGVyYWJsZSwgU3RhdGVtZW50IGJvZHksCiAgICAgIHtib29sIGlzQXN5bmM6IGZhbHNlfSkgewogICAgRGFydFR5cGUgZWxlbWVudFR5cGU7CiAgICBib29sIHR5cGVDaGVja3NOZWVkZWQgPSAhaW5mZXJyZXIuaXNUb3BMZXZlbDsKICAgIERhcnRUeXBlIHN5bnRoZXRpY1dyaXRlVHlwZTsKICAgIEV4cHJlc3Npb24gc3ludGhldGljQXNzaWdubWVudDsKICAgIEV4cHJlc3Npb24gcmhzOwogICAgRXhwcmVzc2lvblN0YXRlbWVudCBzdGF0ZW1lbnQgPQogICAgICAgIGJvZHkgaXMgQmxvY2sgPyBib2R5LnN0YXRlbWVudHMuZmlyc3QgOiBib2R5OwogICAgU3ludGhldGljRXhwcmVzc2lvbkp1ZGdtZW50IGp1ZGdtZW50ID0gc3RhdGVtZW50LmV4cHJlc3Npb247CiAgICBzeW50aGV0aWNBc3NpZ25tZW50ID0ganVkZ21lbnQuZGVzdWdhcmVkOwogICAgaWYgKHN5bnRoZXRpY0Fzc2lnbm1lbnQgaXMgVmFyaWFibGVTZXQpIHsKICAgICAgc3ludGhldGljV3JpdGVUeXBlID0gZWxlbWVudFR5cGUgPSBzeW50aGV0aWNBc3NpZ25tZW50LnZhcmlhYmxlLnR5cGU7CiAgICAgIHJocyA9IHN5bnRoZXRpY0Fzc2lnbm1lbnQudmFsdWU7CiAgICB9IGVsc2UgaWYgKHN5bnRoZXRpY0Fzc2lnbm1lbnQgaXMgUHJvcGVydHlTZXQgfHwKICAgICAgICBzeW50aGV0aWNBc3NpZ25tZW50IGlzIFN1cGVyUHJvcGVydHlTZXQpIHsKICAgICAgRGFydFR5cGUgcmVjZWl2ZXJUeXBlID0gaW5mZXJyZXIudGhpc1R5cGU7CiAgICAgIE9iamVjdCB3cml0ZU1lbWJlciA9CiAgICAgICAgICBpbmZlcnJlci5maW5kUHJvcGVydHlTZXRNZW1iZXIocmVjZWl2ZXJUeXBlLCBzeW50aGV0aWNBc3NpZ25tZW50KTsKICAgICAgc3ludGhldGljV3JpdGVUeXBlID0KICAgICAgICAgIGVsZW1lbnRUeXBlID0gaW5mZXJyZXIuZ2V0U2V0dGVyVHlwZSh3cml0ZU1lbWJlciwgcmVjZWl2ZXJUeXBlKTsKICAgICAgaWYgKHN5bnRoZXRpY0Fzc2lnbm1lbnQgaXMgUHJvcGVydHlTZXQpIHsKICAgICAgICByaHMgPSBzeW50aGV0aWNBc3NpZ25tZW50LnZhbHVlOwogICAgICB9IGVsc2UgaWYgKHN5bnRoZXRpY0Fzc2lnbm1lbnQgaXMgU3VwZXJQcm9wZXJ0eVNldCkgewogICAgICAgIHJocyA9IHN5bnRoZXRpY0Fzc2lnbm1lbnQudmFsdWU7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc3ludGhldGljQXNzaWdubWVudCBpcyBTdGF0aWNTZXQpIHsKICAgICAgc3ludGhldGljV3JpdGVUeXBlID0gZWxlbWVudFR5cGUgPSBzeW50aGV0aWNBc3NpZ25tZW50LnRhcmdldC5zZXR0ZXJUeXBlOwogICAgICByaHMgPSBzeW50aGV0aWNBc3NpZ25tZW50LnZhbHVlOwogICAgfSBlbHNlIGlmIChzeW50aGV0aWNBc3NpZ25tZW50IGlzIEludmFsaWRFeHByZXNzaW9uKSB7CiAgICAgIGVsZW1lbnRUeXBlID0gY29uc3QgVW5rbm93blR5cGUoKTsKICAgIH0gZWxzZSB7CiAgICAgIHVuaGFuZGxlZCgKICAgICAgICAgICIke3N5bnRoZXRpY0Fzc2lnbm1lbnQucnVudGltZVR5cGV9IiwKICAgICAgICAgICJoYW5kbGVGb3JJblN0YXRlbWVudFdpdGhvdXRWYXJpYWJsZSIsCiAgICAgICAgICBzeW50aGV0aWNBc3NpZ25tZW50LmZpbGVPZmZzZXQsCiAgICAgICAgICBpbmZlcnJlci5oZWxwZXIudXJpKTsKICAgIH0KCiAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGUgPSBpbmZlckZvckluSXRlcmFibGUoCiAgICAgICAgaXRlcmFibGUsIGVsZW1lbnRUeXBlLCB0eXBlQ2hlY2tzTmVlZGVkLAogICAgICAgIGlzQXN5bmM6IGlzQXN5bmMpOwogICAgaWYgKHR5cGVDaGVja3NOZWVkZWQpIHsKICAgICAgdmFyaWFibGUudHlwZSA9IGluZmVycmVkVHlwZTsKICAgIH0KCiAgICBpbmZlcnJlci5pbmZlclN0YXRlbWVudChib2R5KTsKCiAgICBpZiAoc3ludGhldGljV3JpdGVUeXBlICE9IG51bGwpIHsKICAgICAgaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZSgKICAgICAgICAgIGdyZWF0ZXN0Q2xvc3VyZShpbmZlcnJlci5jb3JlVHlwZXMsIHN5bnRoZXRpY1dyaXRlVHlwZSksCiAgICAgICAgICB2YXJpYWJsZS50eXBlLAogICAgICAgICAgcmhzLAogICAgICAgICAgcmhzLmZpbGVPZmZzZXQsCiAgICAgICAgICB0ZW1wbGF0ZTogdGVtcGxhdGVGb3JJbkxvb3BFbGVtZW50VHlwZU5vdEFzc2lnbmFibGUsCiAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGb3JJblN0YXRlbWVudChGb3JJblN0YXRlbWVudCBub2RlLCBfKSB7CiAgICBpZiAobm9kZS52YXJpYWJsZS5uYW1lID09IG51bGwpIHsKICAgICAgaGFuZGxlRm9ySW5XaXRob3V0VmFyaWFibGUobm9kZS52YXJpYWJsZSwgbm9kZS5pdGVyYWJsZSwgbm9kZS5ib2R5LAogICAgICAgICAgaXNBc3luYzogbm9kZS5pc0FzeW5jKTsKICAgIH0gZWxzZSB7CiAgICAgIGhhbmRsZUZvckluRGVjbGFyaW5nVmFyaWFibGUobm9kZS52YXJpYWJsZSwgbm9kZS5pdGVyYWJsZSwgbm9kZS5ib2R5LAogICAgICAgICAgaXNBc3luYzogbm9kZS5pc0FzeW5jKTsKICAgIH0KICB9CgogIHZvaWQgdmlzaXRGb3JKdWRnbWVudChGb3JKdWRnbWVudCBub2RlKSB7CiAgICB2YXIgY29uZGl0aW9uSnVkZ21lbnQgPSBub2RlLmNvbmRpdGlvbkp1ZGdtZW50OwogICAgZm9yIChWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlIGluIG5vZGUudmFyaWFibGVzKSB7CiAgICAgIGlmICh2YXJpYWJsZS5uYW1lID09IG51bGwpIHsKICAgICAgICBFeHByZXNzaW9uIGluaXRpYWxpemVyID0gdmFyaWFibGUuaW5pdGlhbGl6ZXI7CiAgICAgICAgaWYgKGluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgICAgIHZhcmlhYmxlLnR5cGUgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgICAgICAgaW5pdGlhbGl6ZXIsIGNvbnN0IFVua25vd25UeXBlKCksIHRydWUsCiAgICAgICAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGluZmVycmVyLmluZmVyU3RhdGVtZW50KHZhcmlhYmxlKTsKICAgICAgfQogICAgfQogICAgaWYgKGNvbmRpdGlvbkp1ZGdtZW50ICE9IG51bGwpIHsKICAgICAgdmFyIGV4cGVjdGVkVHlwZSA9IGluZmVycmVyLmNvcmVUeXBlcy5ib29sQ2xhc3MucmF3VHlwZTsKICAgICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgICAgY29uZGl0aW9uSnVkZ21lbnQsIGV4cGVjdGVkVHlwZSwgIWluZmVycmVyLmlzVG9wTGV2ZWwpOwogICAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKAogICAgICAgICAgZXhwZWN0ZWRUeXBlLAogICAgICAgICAgZ2V0SW5mZXJyZWRUeXBlKGNvbmRpdGlvbkp1ZGdtZW50LCBpbmZlcnJlciksCiAgICAgICAgICBub2RlLmNvbmRpdGlvbiwKICAgICAgICAgIG5vZGUuY29uZGl0aW9uLmZpbGVPZmZzZXQpOwogICAgfQogICAgZm9yICh2YXIgdXBkYXRlIGluIG5vZGUudXBkYXRlSnVkZ21lbnRzKSB7CiAgICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICAgIHVwZGF0ZSwgY29uc3QgVW5rbm93blR5cGUoKSwgIWluZmVycmVyLmlzVG9wTGV2ZWwsCiAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgIH0KICAgIGluZmVycmVyLmluZmVyU3RhdGVtZW50KG5vZGUuYm9keSk7CiAgfQoKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0RnVuY3Rpb25Ob2RlSnVkZ21lbnQoCiAgICAgIEZ1bmN0aW9uTm9kZUp1ZGdtZW50IG5vZGUsCiAgICAgIERhcnRUeXBlIHR5cGVDb250ZXh0LAogICAgICBEYXJ0VHlwZSByZXR1cm5Db250ZXh0LAogICAgICBpbnQgcmV0dXJuVHlwZUluc3RydW1lbnRhdGlvbk9mZnNldCkgewogICAgcmV0dXJuIGluZmVycmVyLmluZmVyTG9jYWxGdW5jdGlvbigKICAgICAgICBub2RlLCB0eXBlQ29udGV4dCwgcmV0dXJuVHlwZUluc3RydW1lbnRhdGlvbk9mZnNldCwgcmV0dXJuQ29udGV4dCk7CiAgfQoKICB2b2lkIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbkp1ZGdtZW50KEZ1bmN0aW9uRGVjbGFyYXRpb25KdWRnbWVudCBub2RlKSB7CiAgICBpbmZlcnJlci5pbmZlck1ldGFkYXRhS2VlcGluZ0hlbHBlcihub2RlLnZhcmlhYmxlLmFubm90YXRpb25zKTsKICAgIERhcnRUeXBlIHJldHVybkNvbnRleHQgPQogICAgICAgIG5vZGUuX2hhc0ltcGxpY2l0UmV0dXJuVHlwZSA/IG51bGwgOiBub2RlLmZ1bmN0aW9uLnJldHVyblR5cGU7CiAgICB2YXIgaW5mZXJlbmNlUmVzdWx0ID0gdmlzaXRGdW5jdGlvbk5vZGVKdWRnbWVudCgKICAgICAgICBub2RlLmZ1bmN0aW9uSnVkZ21lbnQsIG51bGwsIHJldHVybkNvbnRleHQsIG5vZGUuZmlsZU9mZnNldCk7CiAgICBub2RlLnZhcmlhYmxlLnR5cGUgPSBpbmZlcmVuY2VSZXN1bHQudHlwZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oRnVuY3Rpb25FeHByZXNzaW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICB2YXIgaW5mZXJlbmNlUmVzdWx0ID0gdmlzaXRGdW5jdGlvbk5vZGVKdWRnbWVudCgKICAgICAgICBub2RlLmZ1bmN0aW9uLCB0eXBlQ29udGV4dCwgbnVsbCwgbm9kZS5maWxlT2Zmc2V0KTsKICAgIGluZmVycmVyLnN0b3JlSW5mZXJyZWRUeXBlKG5vZGUsIGluZmVyZW5jZVJlc3VsdC50eXBlKTsKICB9CgogIHZvaWQgdmlzaXRJbnZhbGlkU3VwZXJJbml0aWFsaXplckp1ZGdtZW50KAogICAgICBJbnZhbGlkU3VwZXJJbml0aWFsaXplckp1ZGdtZW50IG5vZGUpIHsKICAgIHZhciBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbVN1cGVydHlwZShpbmZlcnJlci5jbGFzc0hpZXJhcmNoeQogICAgICAgIC5nZXRDbGFzc0FzSW5zdGFuY2VPZigKICAgICAgICAgICAgaW5mZXJyZXIudGhpc1R5cGUuY2xhc3NOb2RlLCBub2RlLnRhcmdldC5lbmNsb3NpbmdDbGFzcykpOwogICAgaW5mZXJyZXIuaW5mZXJJbnZvY2F0aW9uKAogICAgICAgIG51bGwsCiAgICAgICAgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZSgKICAgICAgICAgICAgbm9kZS50YXJnZXQuZnVuY3Rpb24uZnVuY3Rpb25UeXBlLndpdGhvdXRUeXBlUGFyYW1ldGVycyksCiAgICAgICAgaW5mZXJyZXIudGhpc1R5cGUsCiAgICAgICAgbm9kZS5hcmd1bWVudHNKdWRnbWVudCwKICAgICAgICBza2lwVHlwZUFyZ3VtZW50SW5mZXJlbmNlOiB0cnVlKTsKICB9CgogIHZvaWQgdmlzaXRJZk51bGxKdWRnbWVudChJZk51bGxKdWRnbWVudCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgdmFyIGxlZnRKdWRnbWVudCA9IG5vZGUubGVmdEp1ZGdtZW50OwogICAgdmFyIHJpZ2h0SnVkZ21lbnQgPSBub2RlLnJpZ2h0SnVkZ21lbnQ7CiAgICAvLyBUbyBpbmZlciBgZTAgPz8gZTFgIGluIGNvbnRleHQgSzoKICAgIC8vIC0gSW5mZXIgZTAgaW4gY29udGV4dCBLIHRvIGdldCBUMAogICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKGxlZnRKdWRnbWVudCwgdHlwZUNvbnRleHQsIHRydWUpOwogICAgdmFyIGxoc1R5cGUgPSBnZXRJbmZlcnJlZFR5cGUobGVmdEp1ZGdtZW50LCBpbmZlcnJlcik7CiAgICBub2RlLnZhcmlhYmxlLnR5cGUgPSBsaHNUeXBlOwogICAgLy8gLSBMZXQgSiA9IFQwIGlmIEsgaXMgYD9gIGVsc2UgSy4KICAgIC8vIC0gSW5mZXIgZTEgaW4gY29udGV4dCBKIHRvIGdldCBUMQogICAgaWYgKHR5cGVDb250ZXh0IGlzIFVua25vd25UeXBlKSB7CiAgICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihyaWdodEp1ZGdtZW50LCBsaHNUeXBlLCB0cnVlLAogICAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24ocmlnaHRKdWRnbWVudCwgdHlwZUNvbnRleHQsIHRydWUsCiAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgIH0KICAgIHZhciByaHNUeXBlID0gZ2V0SW5mZXJyZWRUeXBlKHJpZ2h0SnVkZ21lbnQsIGluZmVycmVyKTsKICAgIC8vIC0gTGV0IFQgPSBncmVhdGVzdCBjbG9zdXJlIG9mIEsgd2l0aCByZXNwZWN0IHRvIGA/YCBpZiBLIGlzIG5vdCBgX2AsIGVsc2UKICAgIC8vICAgVVAodDAsIHQxKQogICAgLy8gLSBUaGVuIHRoZSBpbmZlcnJlZCB0eXBlIGlzIFQuCiAgICBub2RlLmluZmVycmVkVHlwZSA9CiAgICAgICAgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LmdldFN0YW5kYXJkVXBwZXJCb3VuZChsaHNUeXBlLCByaHNUeXBlKTsKICAgIG5vZGUuYm9keS5zdGF0aWNUeXBlID0gZ2V0SW5mZXJyZWRUeXBlKG5vZGUsIGluZmVycmVyKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCB2aXNpdElmSnVkZ21lbnQoSWZKdWRnbWVudCBub2RlKSB7CiAgICB2YXIgY29uZGl0aW9uSnVkZ21lbnQgPSBub2RlLmNvbmRpdGlvbkp1ZGdtZW50OwogICAgdmFyIGV4cGVjdGVkVHlwZSA9IGluZmVycmVyLmNvcmVUeXBlcy5ib29sQ2xhc3MucmF3VHlwZTsKICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICBjb25kaXRpb25KdWRnbWVudCwgZXhwZWN0ZWRUeXBlLCAhaW5mZXJyZXIuaXNUb3BMZXZlbCk7CiAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKAogICAgICAgIGV4cGVjdGVkVHlwZSwKICAgICAgICBnZXRJbmZlcnJlZFR5cGUoY29uZGl0aW9uSnVkZ21lbnQsIGluZmVycmVyKSwKICAgICAgICBub2RlLmNvbmRpdGlvbiwKICAgICAgICBub2RlLmNvbmRpdGlvbi5maWxlT2Zmc2V0KTsKICAgIGluZmVycmVyLmluZmVyU3RhdGVtZW50KG5vZGUudGhlbik7CiAgICBpZiAobm9kZS5vdGhlcndpc2UgIT0gbnVsbCkgewogICAgICBpbmZlcnJlci5pbmZlclN0YXRlbWVudChub2RlLm90aGVyd2lzZSk7CiAgICB9CiAgfQoKICB2b2lkIHZpc2l0SWxsZWdhbEFzc2lnbm1lbnRKdWRnbWVudCgKICAgICAgSWxsZWdhbEFzc2lnbm1lbnRKdWRnbWVudCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgaWYgKG5vZGUud3JpdGUgIT0gbnVsbCkgewogICAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgICBub2RlLndyaXRlLCBjb25zdCBVbmtub3duVHlwZSgpLCAhaW5mZXJyZXIuaXNUb3BMZXZlbCk7CiAgICB9CiAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgbm9kZS5yaHMsIGNvbnN0IFVua25vd25UeXBlKCksICFpbmZlcnJlci5pc1RvcExldmVsKTsKICAgIG5vZGUuX3JlcGxhY2VXaXRoRGVzdWdhcmVkKCk7CiAgICBub2RlLmluZmVycmVkVHlwZSA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgdmlzaXRJbmRleEFzc2lnbm1lbnRKdWRnbWVudCgKICAgICAgSW5kZXhBc3NpZ25tZW50SnVkZ21lbnQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHZhciByZWNlaXZlclR5cGUgPSBub2RlLl9pbmZlclJlY2VpdmVyKGluZmVycmVyKTsKICAgIHZhciB3cml0ZU1lbWJlciA9CiAgICAgICAgaW5mZXJyZXIuZmluZE1ldGhvZEludm9jYXRpb25NZW1iZXIocmVjZWl2ZXJUeXBlLCBub2RlLndyaXRlKTsKICAgIC8vIFRvIHJlcGxpY2F0ZSBhbmFseXplciBiZWhhdmlvciwgd2UgYmFzZSB0eXBlIGluZmVyZW5jZSBvbiB0aGUgd3JpdGUKICAgIC8vIG1lbWJlci4gIFRPRE8ocGF1bGJlcnJ5KTogd291bGQgaXQgYmUgYmV0dGVyIHRvIHVzZSB0aGUgcmVhZCBtZW1iZXIKICAgIC8vIHdoZW4gZG9pbmcgY29tcG91bmQgYXNzaWdubWVudD8KICAgIHZhciBjYWxsZWVUeXBlID0gaW5mZXJyZXIuZ2V0Q2FsbGVlRnVuY3Rpb25UeXBlKAogICAgICAgIGluZmVycmVyLmdldENhbGxlZVR5cGUod3JpdGVNZW1iZXIsIHJlY2VpdmVyVHlwZSksIGZhbHNlKTsKICAgIERhcnRUeXBlIGV4cGVjdGVkSW5kZXhUeXBlRm9yV3JpdGU7CiAgICBEYXJ0VHlwZSBpbmRleENvbnRleHQgPSBjb25zdCBVbmtub3duVHlwZSgpOwogICAgRGFydFR5cGUgd3JpdGVDb250ZXh0ID0gY29uc3QgVW5rbm93blR5cGUoKTsKICAgIGlmIChjYWxsZWVUeXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCA+PSAyKSB7CiAgICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogd2Ugb3VnaHQgdG8gZ2V0IGEgY29udGV4dCBmb3IgdGhlIGluZGV4IGV4cHJlc3Npb24KICAgICAgLy8gZnJvbSB0aGUgaW5kZXggZm9ybWFsIHBhcmFtZXRlciwgYnV0IGFuYWx5emVyIGRvZXNuJ3Qgc28gZm9yIG5vdyB3ZQogICAgICAvLyByZXBsaWNhdGUgaXRzIGJlaGF2aW9yLgogICAgICBleHBlY3RlZEluZGV4VHlwZUZvcldyaXRlID0gY2FsbGVlVHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVyc1swXTsKICAgICAgd3JpdGVDb250ZXh0ID0gY2FsbGVlVHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVyc1sxXTsKICAgIH0KICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihub2RlLmluZGV4LCBpbmRleENvbnRleHQsIHRydWUpOwogICAgdmFyIGluZGV4VHlwZSA9IGdldEluZmVycmVkVHlwZShub2RlLmluZGV4LCBpbmZlcnJlcik7CiAgICBub2RlLl9zdG9yZUxldFR5cGUoaW5mZXJyZXIsIG5vZGUuaW5kZXgsIGluZGV4VHlwZSk7CiAgICBpZiAod3JpdGVDb250ZXh0IGlzISBVbmtub3duVHlwZSkgewogICAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKAogICAgICAgICAgZXhwZWN0ZWRJbmRleFR5cGVGb3JXcml0ZSwKICAgICAgICAgIGluZGV4VHlwZSwKICAgICAgICAgIG5vZGUuX2dldEludm9jYXRpb25Bcmd1bWVudHMoaW5mZXJyZXIsIG5vZGUud3JpdGUpLnBvc2l0aW9uYWxbMF0sCiAgICAgICAgICBub2RlLndyaXRlLmZpbGVPZmZzZXQpOwogICAgfQogICAgSW52b2NhdGlvbkV4cHJlc3Npb24gcmVhZCA9IG5vZGUucmVhZDsKICAgIERhcnRUeXBlIHJlYWRUeXBlOwogICAgaWYgKHJlYWQgIT0gbnVsbCkgewogICAgICB2YXIgcmVhZE1lbWJlciA9IGluZmVycmVyLmZpbmRNZXRob2RJbnZvY2F0aW9uTWVtYmVyKHJlY2VpdmVyVHlwZSwgcmVhZCwKICAgICAgICAgIGluc3RydW1lbnRlZDogZmFsc2UpOwogICAgICB2YXIgY2FsbGVlRnVuY3Rpb25UeXBlID0gaW5mZXJyZXIuZ2V0Q2FsbGVlRnVuY3Rpb25UeXBlKAogICAgICAgICAgaW5mZXJyZXIuZ2V0Q2FsbGVlVHlwZShyZWFkTWVtYmVyLCByZWNlaXZlclR5cGUpLCBmYWxzZSk7CiAgICAgIGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgICBnZXRQb3NpdGlvbmFsUGFyYW1ldGVyVHlwZShjYWxsZWVGdW5jdGlvblR5cGUsIDApLAogICAgICAgICAgaW5kZXhUeXBlLAogICAgICAgICAgbm9kZS5fZ2V0SW52b2NhdGlvbkFyZ3VtZW50cyhpbmZlcnJlciwgcmVhZCkucG9zaXRpb25hbFswXSwKICAgICAgICAgIHJlYWQuZmlsZU9mZnNldCk7CiAgICAgIHJlYWRUeXBlID0gY2FsbGVlRnVuY3Rpb25UeXBlLnJldHVyblR5cGU7CiAgICAgIHZhciBkZXN1Z2FyZWRJbnZvY2F0aW9uID0gcmVhZCBpcyBNZXRob2RJbnZvY2F0aW9uID8gcmVhZCA6IG51bGw7CiAgICAgIHZhciBjaGVja0tpbmQgPSBpbmZlcnJlci5wcmVDaGVja0ludm9jYXRpb25Db250cmF2YXJpYW5jZShub2RlLnJlY2VpdmVyLAogICAgICAgICAgcmVjZWl2ZXJUeXBlLCByZWFkTWVtYmVyLCBkZXN1Z2FyZWRJbnZvY2F0aW9uLCByZWFkLmFyZ3VtZW50cywgcmVhZCk7CiAgICAgIHZhciByZXBsYWNlZFJlYWQgPSBpbmZlcnJlci5oYW5kbGVJbnZvY2F0aW9uQ29udHJhdmFyaWFuY2UoCiAgICAgICAgICBjaGVja0tpbmQsCiAgICAgICAgICBkZXN1Z2FyZWRJbnZvY2F0aW9uLAogICAgICAgICAgcmVhZC5hcmd1bWVudHMsCiAgICAgICAgICByZWFkLAogICAgICAgICAgcmVhZFR5cGUsCiAgICAgICAgICBjYWxsZWVGdW5jdGlvblR5cGUsCiAgICAgICAgICByZWFkLmZpbGVPZmZzZXQpOwogICAgICBub2RlLl9zdG9yZUxldFR5cGUoaW5mZXJyZXIsIHJlcGxhY2VkUmVhZCwgcmVhZFR5cGUpOwogICAgfQogICAgbm9kZS5faW5mZXJSaHMoaW5mZXJyZXIsIHJlYWRUeXBlLCB3cml0ZUNvbnRleHQpOwogICAgbm9kZS5fcmVwbGFjZVdpdGhEZXN1Z2FyZWQoKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCB2aXNpdEludEp1ZGdtZW50KEludEp1ZGdtZW50IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBpZiAoaW5mZXJyZXIuaXNEb3VibGVDb250ZXh0KHR5cGVDb250ZXh0KSkgewogICAgICBkb3VibGUgZG91YmxlVmFsdWUgPSBub2RlLmFzRG91YmxlKCk7CiAgICAgIGlmIChkb3VibGVWYWx1ZSAhPSBudWxsKSB7CiAgICAgICAgbm9kZS5wYXJlbnQucmVwbGFjZUNoaWxkKAogICAgICAgICAgICBub2RlLCBEb3VibGVMaXRlcmFsKGRvdWJsZVZhbHVlKS4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldCk7CiAgICAgICAgbm9kZS5pbmZlcnJlZFR5cGUgPSBpbmZlcnJlci5jb3JlVHlwZXMuZG91YmxlQ2xhc3MucmF3VHlwZTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgRXhwcmVzc2lvbiBlcnJvciA9IGNoZWNrV2ViSW50TGl0ZXJhbHNFcnJvcklmVW5leGFjdCgKICAgICAgICBpbmZlcnJlciwgbm9kZS52YWx1ZSwgbm9kZS5saXRlcmFsLCBub2RlLmZpbGVPZmZzZXQpOwogICAgaWYgKGVycm9yICE9IG51bGwpIHsKICAgICAgbm9kZS5wYXJlbnQucmVwbGFjZUNoaWxkKG5vZGUsIGVycm9yKTsKICAgICAgbm9kZS5pbmZlcnJlZFR5cGUgPSBjb25zdCBCb3R0b21UeXBlKCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgbm9kZS5pbmZlcnJlZFR5cGUgPSBpbmZlcnJlci5jb3JlVHlwZXMuaW50Q2xhc3MucmF3VHlwZTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCB2aXNpdFNoYWRvd0xhcmdlSW50TGl0ZXJhbCgKICAgICAgU2hhZG93TGFyZ2VJbnRMaXRlcmFsIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBpZiAoaW5mZXJyZXIuaXNEb3VibGVDb250ZXh0KHR5cGVDb250ZXh0KSkgewogICAgICBkb3VibGUgZG91YmxlVmFsdWUgPSBub2RlLmFzRG91YmxlKCk7CiAgICAgIGlmIChkb3VibGVWYWx1ZSAhPSBudWxsKSB7CiAgICAgICAgbm9kZS5wYXJlbnQucmVwbGFjZUNoaWxkKAogICAgICAgICAgICBub2RlLCBEb3VibGVMaXRlcmFsKGRvdWJsZVZhbHVlKS4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldCk7CiAgICAgICAgbm9kZS5pbmZlcnJlZFR5cGUgPSBpbmZlcnJlci5jb3JlVHlwZXMuZG91YmxlQ2xhc3MucmF3VHlwZTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQoKICAgIGludCBpbnRWYWx1ZSA9IG5vZGUuYXNJbnQ2NCgpOwogICAgaWYgKGludFZhbHVlID09IG51bGwpIHsKICAgICAgRXhwcmVzc2lvbiByZXBsYWNlbWVudCA9IGluZmVycmVyLmhlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbigKICAgICAgICAgIGluZmVycmVyLmhlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgICAgICAgdGVtcGxhdGVJbnRlZ2VyTGl0ZXJhbElzT3V0T2ZSYW5nZS53aXRoQXJndW1lbnRzKG5vZGUubGl0ZXJhbCksCiAgICAgICAgICAgICAgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgICAgICAgIG5vZGUubGl0ZXJhbC5sZW5ndGgpKTsKICAgICAgbm9kZS5wYXJlbnQucmVwbGFjZUNoaWxkKG5vZGUsIHJlcGxhY2VtZW50KTsKICAgICAgbm9kZS5pbmZlcnJlZFR5cGUgPSBjb25zdCBCb3R0b21UeXBlKCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgRXhwcmVzc2lvbiBlcnJvciA9IGNoZWNrV2ViSW50TGl0ZXJhbHNFcnJvcklmVW5leGFjdCgKICAgICAgICBpbmZlcnJlciwgaW50VmFsdWUsIG5vZGUubGl0ZXJhbCwgbm9kZS5maWxlT2Zmc2V0KTsKICAgIGlmIChlcnJvciAhPSBudWxsKSB7CiAgICAgIG5vZGUucGFyZW50LnJlcGxhY2VDaGlsZChub2RlLCBlcnJvcik7CiAgICAgIG5vZGUuaW5mZXJyZWRUeXBlID0gY29uc3QgQm90dG9tVHlwZSgpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIG5vZGUucGFyZW50CiAgICAgICAgLnJlcGxhY2VDaGlsZChub2RlLCBJbnRMaXRlcmFsKGludFZhbHVlKS4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldCk7CiAgICBub2RlLmluZmVycmVkVHlwZSA9IGluZmVycmVyLmNvcmVUeXBlcy5pbnRDbGFzcy5yYXdUeXBlOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIHZpc2l0U2hhZG93SW52YWxpZEluaXRpYWxpemVyKFNoYWRvd0ludmFsaWRJbml0aWFsaXplciBub2RlKSB7CiAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgbm9kZS52YXJpYWJsZS5pbml0aWFsaXplciwgY29uc3QgVW5rbm93blR5cGUoKSwgIWluZmVycmVyLmlzVG9wTGV2ZWwpOwogIH0KCiAgdm9pZCB2aXNpdFNoYWRvd0ludmFsaWRGaWVsZEluaXRpYWxpemVyKFNoYWRvd0ludmFsaWRGaWVsZEluaXRpYWxpemVyIG5vZGUpIHsKICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihub2RlLnZhbHVlLCBub2RlLmZpZWxkLnR5cGUsICFpbmZlcnJlci5pc1RvcExldmVsKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJc0V4cHJlc3Npb24oSXNFeHByZXNzaW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgbm9kZS5vcGVyYW5kLCBjb25zdCBVbmtub3duVHlwZSgpLCAhaW5mZXJyZXIuaXNUb3BMZXZlbCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGFiZWxlZFN0YXRlbWVudChMYWJlbGVkU3RhdGVtZW50IG5vZGUsIF8pIHsKICAgIGluZmVycmVyLmluZmVyU3RhdGVtZW50KG5vZGUuYm9keSk7CiAgfQoKICBEYXJ0VHlwZSBnZXRTcHJlYWRFbGVtZW50VHlwZShEYXJ0VHlwZSBzcHJlYWRUeXBlLCBib29sIGlzTnVsbEF3YXJlKSB7CiAgICBpZiAoc3ByZWFkVHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIEludGVyZmFjZVR5cGUgc3VwZXJ0eXBlID0gaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50CiAgICAgICAgICAuZ2V0VHlwZUFzSW5zdGFuY2VPZihzcHJlYWRUeXBlLCBpbmZlcnJlci5jb3JlVHlwZXMuaXRlcmFibGVDbGFzcyk7CiAgICAgIGlmIChzdXBlcnR5cGUgIT0gbnVsbCkgcmV0dXJuIHN1cGVydHlwZS50eXBlQXJndW1lbnRzWzBdOwogICAgICBpZiAoc3ByZWFkVHlwZS5jbGFzc05vZGUgPT0gaW5mZXJyZXIuY29yZVR5cGVzLm51bGxDbGFzcyAmJiBpc051bGxBd2FyZSkgewogICAgICAgIHJldHVybiBzcHJlYWRUeXBlOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKHNwcmVhZFR5cGUgaXMgRHluYW1pY1R5cGUpIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBEYXJ0VHlwZSBpbmZlckVsZW1lbnQoCiAgICAgIEV4cHJlc3Npb24gZWxlbWVudCwKICAgICAgVHJlZU5vZGUgcGFyZW50LAogICAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGVBcmd1bWVudCwKICAgICAgTWFwPFRyZWVOb2RlLCBEYXJ0VHlwZT4gaW5mZXJyZWRTcHJlYWRUeXBlcywKICAgICAgYm9vbCBpbmZlcmVuY2VOZWVkZWQsCiAgICAgIGJvb2wgdHlwZUNoZWNrc05lZWRlZCkgewogICAgaWYgKGVsZW1lbnQgaXMgU3ByZWFkRWxlbWVudCkgewogICAgICBEYXJ0VHlwZSBzcHJlYWRUeXBlID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgICAgZWxlbWVudC5leHByZXNzaW9uLAogICAgICAgICAgbmV3IEludGVyZmFjZVR5cGUoaW5mZXJyZXIuY29yZVR5cGVzLml0ZXJhYmxlQ2xhc3MsCiAgICAgICAgICAgICAgPERhcnRUeXBlPltpbmZlcnJlZFR5cGVBcmd1bWVudF0pLAogICAgICAgICAgaW5mZXJlbmNlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQsCiAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgICAgaW5mZXJyZWRTcHJlYWRUeXBlc1tlbGVtZW50LmV4cHJlc3Npb25dID0gc3ByZWFkVHlwZTsKICAgICAgaWYgKHR5cGVDaGVja3NOZWVkZWQpIHsKICAgICAgICBEYXJ0VHlwZSBzcHJlYWRFbGVtZW50VHlwZSA9CiAgICAgICAgICAgIGdldFNwcmVhZEVsZW1lbnRUeXBlKHNwcmVhZFR5cGUsIGVsZW1lbnQuaXNOdWxsQXdhcmUpOwogICAgICAgIGlmIChzcHJlYWRFbGVtZW50VHlwZSA9PSBudWxsKSB7CiAgICAgICAgICBpZiAoc3ByZWFkVHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgICAgICAgc3ByZWFkVHlwZS5jbGFzc05vZGUgPT0gaW5mZXJyZXIuY29yZVR5cGVzLm51bGxDbGFzcyAmJgogICAgICAgICAgICAgICFlbGVtZW50LmlzTnVsbEF3YXJlKSB7CiAgICAgICAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQoCiAgICAgICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAgICAgaW5mZXJyZXIuaGVscGVyLmRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKGluZmVycmVyLmhlbHBlcgogICAgICAgICAgICAgICAgICAgIC5idWlsZFByb2JsZW0obWVzc2FnZU5vbk51bGxBd2FyZVNwcmVhZElzTnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5leHByZXNzaW9uLmZpbGVPZmZzZXQsIDEpKSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwYXJlbnQucmVwbGFjZUNoaWxkKAogICAgICAgICAgICAgICAgZWxlbWVudCwKICAgICAgICAgICAgICAgIGluZmVycmVyLmhlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihpbmZlcnJlci5oZWxwZXIKICAgICAgICAgICAgICAgICAgICAuYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVNwcmVhZFR5cGVNaXNtYXRjaC53aXRoQXJndW1lbnRzKHNwcmVhZFR5cGUpLAogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmV4cHJlc3Npb24uZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgMSkpKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHNwcmVhZFR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICAgICAgaWYgKCFpbmZlcnJlci5pc0Fzc2lnbmFibGUoaW5mZXJyZWRUeXBlQXJndW1lbnQsIHNwcmVhZEVsZW1lbnRUeXBlKSkgewogICAgICAgICAgICBwYXJlbnQucmVwbGFjZUNoaWxkKAogICAgICAgICAgICAgICAgZWxlbWVudCwKICAgICAgICAgICAgICAgIGluZmVycmVyLmhlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihpbmZlcnJlci5oZWxwZXIKICAgICAgICAgICAgICAgICAgICAuYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVNwcmVhZEVsZW1lbnRUeXBlTWlzbWF0Y2gud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmVhZEVsZW1lbnRUeXBlLCBpbmZlcnJlZFR5cGVBcmd1bWVudCksCiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZXhwcmVzc2lvbi5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAxKSkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvLyBVc2UgJ2R5bmFtaWMnIGZvciBlcnJvciByZWNvdmVyeS4KICAgICAgcmV0dXJuIGVsZW1lbnQuZWxlbWVudFR5cGUgPQogICAgICAgICAgZ2V0U3ByZWFkRWxlbWVudFR5cGUoc3ByZWFkVHlwZSwgZWxlbWVudC5pc051bGxBd2FyZSkgPz8KICAgICAgICAgICAgICBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgfSBlbHNlIGlmIChlbGVtZW50IGlzIElmRWxlbWVudCkgewogICAgICBEYXJ0VHlwZSBib29sVHlwZSA9IGluZmVycmVyLmNvcmVUeXBlcy5ib29sQ2xhc3MucmF3VHlwZTsKICAgICAgRGFydFR5cGUgY29uZGl0aW9uVHlwZSA9IGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICAgIGVsZW1lbnQuY29uZGl0aW9uLCBib29sVHlwZSwgdHlwZUNoZWNrc05lZWRlZCwKICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IGZhbHNlKTsKICAgICAgaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZShib29sVHlwZSwgY29uZGl0aW9uVHlwZSwgZWxlbWVudC5jb25kaXRpb24sCiAgICAgICAgICBlbGVtZW50LmNvbmRpdGlvbi5maWxlT2Zmc2V0KTsKICAgICAgRGFydFR5cGUgdGhlblR5cGUgPSBpbmZlckVsZW1lbnQoCiAgICAgICAgICBlbGVtZW50LnRoZW4sCiAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgaW5mZXJyZWRUeXBlQXJndW1lbnQsCiAgICAgICAgICBpbmZlcnJlZFNwcmVhZFR5cGVzLAogICAgICAgICAgaW5mZXJlbmNlTmVlZGVkLAogICAgICAgICAgdHlwZUNoZWNrc05lZWRlZCk7CiAgICAgIERhcnRUeXBlIG90aGVyd2lzZVR5cGU7CiAgICAgIGlmIChlbGVtZW50Lm90aGVyd2lzZSAhPSBudWxsKSB7CiAgICAgICAgb3RoZXJ3aXNlVHlwZSA9IGluZmVyRWxlbWVudCgKICAgICAgICAgICAgZWxlbWVudC5vdGhlcndpc2UsCiAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgIGluZmVycmVkVHlwZUFyZ3VtZW50LAogICAgICAgICAgICBpbmZlcnJlZFNwcmVhZFR5cGVzLAogICAgICAgICAgICBpbmZlcmVuY2VOZWVkZWQsCiAgICAgICAgICAgIHR5cGVDaGVja3NOZWVkZWQpOwogICAgICB9CiAgICAgIHJldHVybiBvdGhlcndpc2VUeXBlID09IG51bGwKICAgICAgICAgID8gdGhlblR5cGUKICAgICAgICAgIDogaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50CiAgICAgICAgICAgICAgLmdldFN0YW5kYXJkVXBwZXJCb3VuZCh0aGVuVHlwZSwgb3RoZXJ3aXNlVHlwZSk7CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaXMgRm9yRWxlbWVudCkgewogICAgICBmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gaW4gZWxlbWVudC52YXJpYWJsZXMpIHsKICAgICAgICBpZiAoZGVjbGFyYXRpb24ubmFtZSA9PSBudWxsKSB7CiAgICAgICAgICBpZiAoZGVjbGFyYXRpb24uaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgICBkZWNsYXJhdGlvbi50eXBlID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKGRlY2xhcmF0aW9uLmluaXRpYWxpemVyLAogICAgICAgICAgICAgICAgZGVjbGFyYXRpb24udHlwZSwgaW5mZXJlbmNlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQsCiAgICAgICAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQoZGVjbGFyYXRpb24pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZWxlbWVudC5jb25kaXRpb24gIT0gbnVsbCkgewogICAgICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICAgICAgZWxlbWVudC5jb25kaXRpb24sCiAgICAgICAgICAgIGluZmVycmVyLmNvcmVUeXBlcy5ib29sQ2xhc3MucmF3VHlwZSwKICAgICAgICAgICAgaW5mZXJlbmNlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQsCiAgICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IGZhbHNlKTsKICAgICAgfQogICAgICBmb3IgKEV4cHJlc3Npb24gZXhwcmVzc2lvbiBpbiBlbGVtZW50LnVwZGF0ZXMpIHsKICAgICAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oZXhwcmVzc2lvbiwgY29uc3QgVW5rbm93blR5cGUoKSwKICAgICAgICAgICAgaW5mZXJlbmNlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQsCiAgICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgICB9CiAgICAgIHJldHVybiBpbmZlckVsZW1lbnQoZWxlbWVudC5ib2R5LCBlbGVtZW50LCBpbmZlcnJlZFR5cGVBcmd1bWVudCwKICAgICAgICAgIGluZmVycmVkU3ByZWFkVHlwZXMsIGluZmVyZW5jZU5lZWRlZCwgdHlwZUNoZWNrc05lZWRlZCk7CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaXMgRm9ySW5FbGVtZW50KSB7CiAgICAgIGlmIChlbGVtZW50LnZhcmlhYmxlLm5hbWUgPT0gbnVsbCkgewogICAgICAgIGhhbmRsZUZvckluV2l0aG91dFZhcmlhYmxlKAogICAgICAgICAgICBlbGVtZW50LnZhcmlhYmxlLCBlbGVtZW50Lml0ZXJhYmxlLCBlbGVtZW50LnByb2xvZ3VlLAogICAgICAgICAgICBpc0FzeW5jOiBlbGVtZW50LmlzQXN5bmMpOwogICAgICB9IGVsc2UgewogICAgICAgIGhhbmRsZUZvckluRGVjbGFyaW5nVmFyaWFibGUoCiAgICAgICAgICAgIGVsZW1lbnQudmFyaWFibGUsIGVsZW1lbnQuaXRlcmFibGUsIGVsZW1lbnQucHJvbG9ndWUsCiAgICAgICAgICAgIGlzQXN5bmM6IGVsZW1lbnQuaXNBc3luYyk7CiAgICAgIH0KICAgICAgaWYgKGVsZW1lbnQucHJvYmxlbSAhPSBudWxsKSB7CiAgICAgICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKGVsZW1lbnQucHJvYmxlbSwgY29uc3QgVW5rbm93blR5cGUoKSwKICAgICAgICAgICAgaW5mZXJlbmNlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQsCiAgICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgICB9CiAgICAgIHJldHVybiBpbmZlckVsZW1lbnQoZWxlbWVudC5ib2R5LCBlbGVtZW50LCBpbmZlcnJlZFR5cGVBcmd1bWVudCwKICAgICAgICAgIGluZmVycmVkU3ByZWFkVHlwZXMsIGluZmVyZW5jZU5lZWRlZCwgdHlwZUNoZWNrc05lZWRlZCk7CiAgICB9IGVsc2UgewogICAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGUgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgICBlbGVtZW50LCBpbmZlcnJlZFR5cGVBcmd1bWVudCwgaW5mZXJlbmNlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQsCiAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgICAgaWYgKGluZmVycmVkVHlwZUFyZ3VtZW50IGlzISBVbmtub3duVHlwZSkgewogICAgICAgIGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgICAgIGluZmVycmVkVHlwZUFyZ3VtZW50LCBpbmZlcnJlZFR5cGUsIGVsZW1lbnQsIGVsZW1lbnQuZmlsZU9mZnNldCwKICAgICAgICAgICAgaXNWb2lkQWxsb3dlZDogaW5mZXJyZWRUeXBlQXJndW1lbnQgaXMgVm9pZFR5cGUpOwogICAgICB9CiAgICAgIHJldHVybiBpbmZlcnJlZFR5cGU7CiAgICB9CiAgfQoKICB2b2lkIGNoZWNrRWxlbWVudChFeHByZXNzaW9uIGl0ZW0sIEV4cHJlc3Npb24gcGFyZW50LCBEYXJ0VHlwZSB0eXBlQXJndW1lbnQsCiAgICAgIE1hcDxUcmVlTm9kZSwgRGFydFR5cGU+IGluZmVycmVkU3ByZWFkVHlwZXMpIHsKICAgIGlmIChpdGVtIGlzIFNwcmVhZEVsZW1lbnQpIHsKICAgICAgRGFydFR5cGUgc3ByZWFkVHlwZSA9IGluZmVycmVkU3ByZWFkVHlwZXNbaXRlbS5leHByZXNzaW9uXTsKICAgICAgaWYgKHNwcmVhZFR5cGUgaXMgRHluYW1pY1R5cGUpIHsKICAgICAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKGluZmVycmVyLmNvcmVUeXBlcy5pdGVyYWJsZUNsYXNzLnJhd1R5cGUsCiAgICAgICAgICAgIHNwcmVhZFR5cGUsIGl0ZW0uZXhwcmVzc2lvbiwgaXRlbS5leHByZXNzaW9uLmZpbGVPZmZzZXQpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGl0ZW0gaXMgSWZFbGVtZW50KSB7CiAgICAgIGNoZWNrRWxlbWVudChpdGVtLnRoZW4sIGl0ZW0sIHR5cGVBcmd1bWVudCwgaW5mZXJyZWRTcHJlYWRUeXBlcyk7CiAgICAgIGlmIChpdGVtLm90aGVyd2lzZSAhPSBudWxsKSB7CiAgICAgICAgY2hlY2tFbGVtZW50KGl0ZW0ub3RoZXJ3aXNlLCBpdGVtLCB0eXBlQXJndW1lbnQsIGluZmVycmVkU3ByZWFkVHlwZXMpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGl0ZW0gaXMgRm9yRWxlbWVudCkgewogICAgICBpZiAoaXRlbS5jb25kaXRpb24gIT0gbnVsbCkgewogICAgICAgIERhcnRUeXBlIGNvbmRpdGlvblR5cGUgPSBnZXRJbmZlcnJlZFR5cGUoaXRlbS5jb25kaXRpb24sIGluZmVycmVyKTsKICAgICAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKGluZmVycmVyLmNvcmVUeXBlcy5ib29sQ2xhc3MucmF3VHlwZSwKICAgICAgICAgICAgY29uZGl0aW9uVHlwZSwgaXRlbS5jb25kaXRpb24sIGl0ZW0uY29uZGl0aW9uLmZpbGVPZmZzZXQpOwogICAgICB9CiAgICAgIGNoZWNrRWxlbWVudChpdGVtLmJvZHksIGl0ZW0sIHR5cGVBcmd1bWVudCwgaW5mZXJyZWRTcHJlYWRUeXBlcyk7CiAgICB9IGVsc2UgaWYgKGl0ZW0gaXMgRm9ySW5FbGVtZW50KSB7CiAgICAgIGNoZWNrRWxlbWVudChpdGVtLmJvZHksIGl0ZW0sIHR5cGVBcmd1bWVudCwgaW5mZXJyZWRTcHJlYWRUeXBlcyk7CiAgICB9IGVsc2UgewogICAgICAvLyBEbyBub3RoaW5nLiAgQXNzaWduYWJpbGl0eSBjaGVja3MgYXJlIGRvbmUgZHVyaW5nIHR5cGUgaW5mZXJlbmNlLgogICAgfQogIH0KCiAgdm9pZCB2aXNpdExpc3RMaXRlcmFsSnVkZ21lbnQoCiAgICAgIExpc3RMaXRlcmFsSnVkZ21lbnQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHZhciBsaXN0Q2xhc3MgPSBpbmZlcnJlci5jb3JlVHlwZXMubGlzdENsYXNzOwogICAgdmFyIGxpc3RUeXBlID0gbGlzdENsYXNzLnRoaXNUeXBlOwogICAgTGlzdDxEYXJ0VHlwZT4gaW5mZXJyZWRUeXBlczsKICAgIERhcnRUeXBlIGluZmVycmVkVHlwZUFyZ3VtZW50OwogICAgTGlzdDxEYXJ0VHlwZT4gZm9ybWFsVHlwZXM7CiAgICBMaXN0PERhcnRUeXBlPiBhY3R1YWxUeXBlczsKICAgIGJvb2wgaW5mZXJlbmNlTmVlZGVkID0gbm9kZS50eXBlQXJndW1lbnQgaXMgSW1wbGljaXRUeXBlQXJndW1lbnQ7CiAgICBib29sIHR5cGVDaGVja3NOZWVkZWQgPSAhaW5mZXJyZXIuaXNUb3BMZXZlbDsKICAgIE1hcDxUcmVlTm9kZSwgRGFydFR5cGU+IGluZmVycmVkU3ByZWFkVHlwZXM7CiAgICBpZiAoaW5mZXJlbmNlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQpIHsKICAgICAgZm9ybWFsVHlwZXMgPSBbXTsKICAgICAgYWN0dWFsVHlwZXMgPSBbXTsKICAgICAgaW5mZXJyZWRTcHJlYWRUeXBlcyA9IG5ldyBNYXA8VHJlZU5vZGUsIERhcnRUeXBlPi5pZGVudGl0eSgpOwogICAgfQogICAgaWYgKGluZmVyZW5jZU5lZWRlZCkgewogICAgICBpbmZlcnJlZFR5cGVzID0gW2NvbnN0IFVua25vd25UeXBlKCldOwogICAgICBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQuaW5mZXJHZW5lcmljRnVuY3Rpb25PclR5cGUobGlzdFR5cGUsCiAgICAgICAgICBsaXN0Q2xhc3MudHlwZVBhcmFtZXRlcnMsIG51bGwsIG51bGwsIHR5cGVDb250ZXh0LCBpbmZlcnJlZFR5cGVzLAogICAgICAgICAgaXNDb25zdDogbm9kZS5pc0NvbnN0KTsKICAgICAgaW5mZXJyZWRUeXBlQXJndW1lbnQgPSBpbmZlcnJlZFR5cGVzWzBdOwogICAgfSBlbHNlIHsKICAgICAgaW5mZXJyZWRUeXBlQXJndW1lbnQgPSBub2RlLnR5cGVBcmd1bWVudDsKICAgIH0KICAgIGlmIChpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGUuZXhwcmVzc2lvbnMubGVuZ3RoOyArK2kpIHsKICAgICAgICBEYXJ0VHlwZSB0eXBlID0gaW5mZXJFbGVtZW50KAogICAgICAgICAgICBub2RlLmV4cHJlc3Npb25zW2ldLAogICAgICAgICAgICBub2RlLAogICAgICAgICAgICBpbmZlcnJlZFR5cGVBcmd1bWVudCwKICAgICAgICAgICAgaW5mZXJyZWRTcHJlYWRUeXBlcywKICAgICAgICAgICAgaW5mZXJlbmNlTmVlZGVkLAogICAgICAgICAgICB0eXBlQ2hlY2tzTmVlZGVkKTsKICAgICAgICBhY3R1YWxUeXBlcy5hZGQodHlwZSk7CiAgICAgICAgaWYgKGluZmVyZW5jZU5lZWRlZCkgewogICAgICAgICAgZm9ybWFsVHlwZXMuYWRkKGxpc3RUeXBlLnR5cGVBcmd1bWVudHNbMF0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGluZmVyZW5jZU5lZWRlZCkgewogICAgICBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQuaW5mZXJHZW5lcmljRnVuY3Rpb25PclR5cGUoCiAgICAgICAgICBsaXN0VHlwZSwKICAgICAgICAgIGxpc3RDbGFzcy50eXBlUGFyYW1ldGVycywKICAgICAgICAgIGZvcm1hbFR5cGVzLAogICAgICAgICAgYWN0dWFsVHlwZXMsCiAgICAgICAgICB0eXBlQ29udGV4dCwKICAgICAgICAgIGluZmVycmVkVHlwZXMpOwogICAgICBpbmZlcnJlZFR5cGVBcmd1bWVudCA9IGluZmVycmVkVHlwZXNbMF07CiAgICAgIGluZmVycmVyLmluc3RydW1lbnRhdGlvbj8ucmVjb3JkKAogICAgICAgICAgaW5mZXJyZXIudXJpLAogICAgICAgICAgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgICAgJ3R5cGVBcmdzJywKICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGVBcmdzKFtpbmZlcnJlZFR5cGVBcmd1bWVudF0pKTsKICAgICAgbm9kZS50eXBlQXJndW1lbnQgPSBpbmZlcnJlZFR5cGVBcmd1bWVudDsKICAgIH0KICAgIGlmICh0eXBlQ2hlY2tzTmVlZGVkKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZS5leHByZXNzaW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgIGNoZWNrRWxlbWVudCgKICAgICAgICAgICAgbm9kZS5leHByZXNzaW9uc1tpXSwgbm9kZSwgbm9kZS50eXBlQXJndW1lbnQsIGluZmVycmVkU3ByZWFkVHlwZXMpOwogICAgICB9CiAgICB9CiAgICBub2RlLmluZmVycmVkVHlwZSA9IG5ldyBJbnRlcmZhY2VUeXBlKGxpc3RDbGFzcywgW2luZmVycmVkVHlwZUFyZ3VtZW50XSk7CiAgICBpZiAoIWluZmVycmVyLmlzVG9wTGV2ZWwpIHsKICAgICAgS2VybmVsTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGluZmVycmVyLmxpYnJhcnk7CiAgICAgIGlmIChpbmZlcmVuY2VOZWVkZWQpIHsKICAgICAgICBsaWJyYXJ5LmNoZWNrQm91bmRzSW5MaXN0TGl0ZXJhbChub2RlLCBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQsCiAgICAgICAgICAgIGluZmVycmVkOiB0cnVlKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExvZ2ljYWxFeHByZXNzaW9uKExvZ2ljYWxFeHByZXNzaW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICB2YXIgYm9vbFR5cGUgPSBpbmZlcnJlci5jb3JlVHlwZXMuYm9vbENsYXNzLnJhd1R5cGU7CiAgICB2YXIgbGVmdCA9IG5vZGUubGVmdDsKICAgIHZhciByaWdodCA9IG5vZGUucmlnaHQ7CiAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24obGVmdCwgYm9vbFR5cGUsICFpbmZlcnJlci5pc1RvcExldmVsKTsKICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihyaWdodCwgYm9vbFR5cGUsICFpbmZlcnJlci5pc1RvcExldmVsKTsKICAgIGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoYm9vbFR5cGUsIGdldEluZmVycmVkVHlwZShsZWZ0LCBpbmZlcnJlciksCiAgICAgICAgbm9kZS5sZWZ0LCBub2RlLmxlZnQuZmlsZU9mZnNldCk7CiAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKGJvb2xUeXBlLCBnZXRJbmZlcnJlZFR5cGUocmlnaHQsIGluZmVycmVyKSwKICAgICAgICBub2RlLnJpZ2h0LCBub2RlLnJpZ2h0LmZpbGVPZmZzZXQpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLyBDYWxjdWxhdGVzIHRoZSBrZXkgYW5kIHRoZSB2YWx1ZSB0eXBlIG9mIGEgc3ByZWFkIG1hcCBlbnRyeSBvZiB0eXBlCiAgLy8gc3ByZWFkTWFwRW50cnlUeXBlIGFuZCBzdG9yZXMgdGhlbSBpbiBvdXRwdXQgaW4gcG9zaXRpb25zIG9mZnNldCBhbmQgb2Zmc2V0CiAgLy8gKyAxLiAgSWYgdGhlIHR5cGVzIGNhbid0IGJlIGNhbGN1bGF0ZWQsIGZvciBleGFtcGxlLCBpZiBzcHJlYWRNYXBFbnRyeVR5cGUKICAvLyBpcyBhIGZ1bmN0aW9uIHR5cGUsIHRoZSBvcmlnaW5hbCB2YWx1ZXMgaW4gb3V0cHV0IGFyZSBwcmVzZXJ2ZWQuCiAgdm9pZCBzdG9yZVNwcmVhZE1hcEVudHJ5RWxlbWVudFR5cGVzKERhcnRUeXBlIHNwcmVhZE1hcEVudHJ5VHlwZSwKICAgICAgYm9vbCBpc051bGxBd2FyZSwgTGlzdDxEYXJ0VHlwZT4gb3V0cHV0LCBpbnQgb2Zmc2V0KSB7CiAgICBpZiAoc3ByZWFkTWFwRW50cnlUeXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgSW50ZXJmYWNlVHlwZSBzdXBlcnR5cGUgPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAgIC5nZXRUeXBlQXNJbnN0YW5jZU9mKHNwcmVhZE1hcEVudHJ5VHlwZSwgaW5mZXJyZXIuY29yZVR5cGVzLm1hcENsYXNzKTsKICAgICAgaWYgKHN1cGVydHlwZSAhPSBudWxsKSB7CiAgICAgICAgb3V0cHV0W29mZnNldF0gPSBzdXBlcnR5cGUudHlwZUFyZ3VtZW50c1swXTsKICAgICAgICBvdXRwdXRbb2Zmc2V0ICsgMV0gPSBzdXBlcnR5cGUudHlwZUFyZ3VtZW50c1sxXTsKICAgICAgfSBlbHNlIGlmIChzcHJlYWRNYXBFbnRyeVR5cGUuY2xhc3NOb2RlID09IGluZmVycmVyLmNvcmVUeXBlcy5udWxsQ2xhc3MgJiYKICAgICAgICAgIGlzTnVsbEF3YXJlKSB7CiAgICAgICAgb3V0cHV0W29mZnNldF0gPSBvdXRwdXRbb2Zmc2V0ICsgMV0gPSBzcHJlYWRNYXBFbnRyeVR5cGU7CiAgICAgIH0KICAgIH0KICAgIGlmIChzcHJlYWRNYXBFbnRyeVR5cGUgaXMgRHluYW1pY1R5cGUpIHsKICAgICAgb3V0cHV0W29mZnNldF0gPSBvdXRwdXRbb2Zmc2V0ICsgMV0gPSBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgfQogIH0KCiAgLy8gTm90ZSB0aGF0IGluZmVyTWFwRW50cnkgYWRkcyBleGFjdGx5IHR3byBlbGVtZW50cyB0byBhY3R1YWxUeXBlcyAtLSB0aGUKICAvLyBhY3R1YWwgdHlwZXMgb2YgdGhlIGtleSBhbmQgdGhlIHZhbHVlLiAgVGhlIHNhbWUgdGVjaG5pcXVlIGlzIHVzZWQgZm9yCiAgLy8gYWN0dWFsVHlwZXNGb3JTZXQsIG9ubHkgaW5mZXJNYXBFbnRyeSBhZGRzIGV4YWN0bHkgb25lIGVsZW1lbnQgdG8gdGhhdAogIC8vIGxpc3Q6IHRoZSBhY3R1YWwgdHlwZSBvZiB0aGUgaXRlcmFibGUgc3ByZWFkIGVsZW1lbnRzIGluIGNhc2UgdGhlIG1hcAogIC8vIGxpdGVyYWwgd2lsbCBiZSBkaXNhbWJpZ3VhdGVkIGFzIGEgc2V0IGxpdGVyYWwgbGF0ZXIuCiAgdm9pZCBpbmZlck1hcEVudHJ5KAogICAgICBNYXBFbnRyeSBlbnRyeSwKICAgICAgVHJlZU5vZGUgcGFyZW50LAogICAgICBEYXJ0VHlwZSBpbmZlcnJlZEtleVR5cGUsCiAgICAgIERhcnRUeXBlIGluZmVycmVkVmFsdWVUeXBlLAogICAgICBEYXJ0VHlwZSBzcHJlYWRDb250ZXh0LAogICAgICBMaXN0PERhcnRUeXBlPiBhY3R1YWxUeXBlcywKICAgICAgTGlzdDxEYXJ0VHlwZT4gYWN0dWFsVHlwZXNGb3JTZXQsCiAgICAgIE1hcDxUcmVlTm9kZSwgRGFydFR5cGU+IGluZmVycmVkU3ByZWFkVHlwZXMsCiAgICAgIGJvb2wgaW5mZXJlbmNlTmVlZGVkLAogICAgICBib29sIHR5cGVDaGVja3NOZWVkZWQpIHsKICAgIGlmIChlbnRyeSBpcyBTcHJlYWRNYXBFbnRyeSkgewogICAgICBEYXJ0VHlwZSBzcHJlYWRUeXBlID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgICAgZW50cnkuZXhwcmVzc2lvbiwgc3ByZWFkQ29udGV4dCwgaW5mZXJlbmNlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQsCiAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgICAgaW5mZXJyZWRTcHJlYWRUeXBlc1tlbnRyeS5leHByZXNzaW9uXSA9IHNwcmVhZFR5cGU7CiAgICAgIGludCBsZW5ndGggPSBhY3R1YWxUeXBlcy5sZW5ndGg7CiAgICAgIGFjdHVhbFR5cGVzLmFkZChudWxsKTsKICAgICAgYWN0dWFsVHlwZXMuYWRkKG51bGwpOwogICAgICBzdG9yZVNwcmVhZE1hcEVudHJ5RWxlbWVudFR5cGVzKAogICAgICAgICAgc3ByZWFkVHlwZSwgZW50cnkuaXNOdWxsQXdhcmUsIGFjdHVhbFR5cGVzLCBsZW5ndGgpOwogICAgICBEYXJ0VHlwZSBhY3R1YWxLZXlUeXBlID0gYWN0dWFsVHlwZXNbbGVuZ3RoXTsKICAgICAgRGFydFR5cGUgYWN0dWFsVmFsdWVUeXBlID0gYWN0dWFsVHlwZXNbbGVuZ3RoICsgMV07CiAgICAgIERhcnRUeXBlIGFjdHVhbEVsZW1lbnRUeXBlID0KICAgICAgICAgIGdldFNwcmVhZEVsZW1lbnRUeXBlKHNwcmVhZFR5cGUsIGVudHJ5LmlzTnVsbEF3YXJlKTsKCiAgICAgIGlmICh0eXBlQ2hlY2tzTmVlZGVkKSB7CiAgICAgICAgaWYgKGFjdHVhbEtleVR5cGUgPT0gbnVsbCkgewogICAgICAgICAgaWYgKHNwcmVhZFR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgICAgICAgIHNwcmVhZFR5cGUuY2xhc3NOb2RlID09IGluZmVycmVyLmNvcmVUeXBlcy5udWxsQ2xhc3MgJiYKICAgICAgICAgICAgICAhZW50cnkuaXNOdWxsQXdhcmUpIHsKICAgICAgICAgICAgcGFyZW50LnJlcGxhY2VDaGlsZCgKICAgICAgICAgICAgICAgIGVudHJ5LAogICAgICAgICAgICAgICAgbmV3IE1hcEVudHJ5KAogICAgICAgICAgICAgICAgICAgIGluZmVycmVyLmhlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihpbmZlcnJlci5oZWxwZXIKICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkUHJvYmxlbShtZXNzYWdlTm9uTnVsbEF3YXJlU3ByZWFkSXNOdWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZXhwcmVzc2lvbi5maWxlT2Zmc2V0LCAxKSksCiAgICAgICAgICAgICAgICAgICAgbmV3IE51bGxMaXRlcmFsKCkpCiAgICAgICAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGVudHJ5LmZpbGVPZmZzZXQpOwogICAgICAgICAgfSBlbHNlIGlmIChhY3R1YWxFbGVtZW50VHlwZSAhPSBudWxsKSB7CiAgICAgICAgICAgIC8vIERvbid0IHJlcG9ydCB0aGUgZXJyb3IgaGVyZSwgaXQgbWlnaHQgYmUgYW4gYW1iaWd1b3VzIFNldC4gIFRoZQogICAgICAgICAgICAvLyBlcnJvciBpcyByZXBvcnRlZCBpbiBjaGVja01hcEVudHJ5IGlmIGl0J3MgZGlzYW1iaWd1YXRlZCBhcyBtYXAuCiAgICAgICAgICAgIGl0ZXJhYmxlU3ByZWFkVHlwZSA9IHNwcmVhZFR5cGU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwYXJlbnQucmVwbGFjZUNoaWxkKAogICAgICAgICAgICAgICAgZW50cnksCiAgICAgICAgICAgICAgICBuZXcgTWFwRW50cnkoCiAgICAgICAgICAgICAgICAgICAgaW5mZXJyZXIuaGVscGVyLmRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKGluZmVycmVyLmhlbHBlcgogICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVTcHJlYWRNYXBFbnRyeVR5cGVNaXNtYXRjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHNwcmVhZFR5cGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZXhwcmVzc2lvbi5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMSkpLAogICAgICAgICAgICAgICAgICAgIG5ldyBOdWxsTGl0ZXJhbCgpKQogICAgICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBlbnRyeS5maWxlT2Zmc2V0KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHNwcmVhZFR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICAgICAgRXhwcmVzc2lvbiBrZXlFcnJvcjsKICAgICAgICAgIEV4cHJlc3Npb24gdmFsdWVFcnJvcjsKICAgICAgICAgIGlmICghaW5mZXJyZXIuaXNBc3NpZ25hYmxlKGluZmVycmVkS2V5VHlwZSwgYWN0dWFsS2V5VHlwZSkpIHsKICAgICAgICAgICAga2V5RXJyb3IgPSBpbmZlcnJlci5oZWxwZXIuZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oCiAgICAgICAgICAgICAgICBpbmZlcnJlci5oZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlU3ByZWFkTWFwRW50cnlFbGVtZW50S2V5VHlwZU1pc21hdGNoLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbEtleVR5cGUsIGluZmVycmVkS2V5VHlwZSksCiAgICAgICAgICAgICAgICAgICAgZW50cnkuZXhwcmVzc2lvbi5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgIDEpKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghaW5mZXJyZXIuaXNBc3NpZ25hYmxlKGluZmVycmVkVmFsdWVUeXBlLCBhY3R1YWxWYWx1ZVR5cGUpKSB7CiAgICAgICAgICAgIHZhbHVlRXJyb3IgPSBpbmZlcnJlci5oZWxwZXIuZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oCiAgICAgICAgICAgICAgICBpbmZlcnJlci5oZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlU3ByZWFkTWFwRW50cnlFbGVtZW50VmFsdWVUeXBlTWlzbWF0Y2gKICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoYWN0dWFsVmFsdWVUeXBlLCBpbmZlcnJlZFZhbHVlVHlwZSksCiAgICAgICAgICAgICAgICAgICAgZW50cnkuZXhwcmVzc2lvbi5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgIDEpKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChrZXlFcnJvciAhPSBudWxsIHx8IHZhbHVlRXJyb3IgIT0gbnVsbCkgewogICAgICAgICAgICBrZXlFcnJvciA/Pz0gbmV3IE51bGxMaXRlcmFsKCk7CiAgICAgICAgICAgIHZhbHVlRXJyb3IgPz89IG5ldyBOdWxsTGl0ZXJhbCgpOwogICAgICAgICAgICBwYXJlbnQucmVwbGFjZUNoaWxkKAogICAgICAgICAgICAgICAgZW50cnksCiAgICAgICAgICAgICAgICBuZXcgTWFwRW50cnkoa2V5RXJyb3IsIHZhbHVlRXJyb3IpCiAgICAgICAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGVudHJ5LmZpbGVPZmZzZXQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gVXNlICdkeW5hbWljJyBmb3IgZXJyb3IgcmVjb3ZlcnkuCiAgICAgIGlmIChhY3R1YWxLZXlUeXBlID09IG51bGwpIHsKICAgICAgICBhY3R1YWxLZXlUeXBlID0gYWN0dWFsVHlwZXNbbGVuZ3RoXSA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgICAgYWN0dWFsVmFsdWVUeXBlID0gYWN0dWFsVHlwZXNbbGVuZ3RoICsgMV0gPSBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgICB9CiAgICAgIC8vIFN0b3JlIHRoZSB0eXBlIGluIGNhc2Ugb2YgYW4gYW1iaWd1b3VzIFNldC4gIFVzZSAnZHluYW1pYycgZm9yIGVycm9yCiAgICAgIC8vIHJlY292ZXJ5LgogICAgICBhY3R1YWxUeXBlc0ZvclNldC5hZGQoYWN0dWFsRWxlbWVudFR5cGUgPz8gY29uc3QgRHluYW1pY1R5cGUoKSk7CgogICAgICBtYXBFbnRyeUNsYXNzID8/PQogICAgICAgICAgaW5mZXJyZXIuY29yZVR5cGVzLmluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnTWFwRW50cnknKTsKICAgICAgLy8gVE9ETyhkbWl0cnlhcyk6ICBIYW5kbGUgdGhlIGNhc2Ugb2YgYW4gYW1iaWd1b3VzIFNldC4KICAgICAgZW50cnkuZW50cnlUeXBlID0gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICBtYXBFbnRyeUNsYXNzLCA8RGFydFR5cGU+W2FjdHVhbEtleVR5cGUsIGFjdHVhbFZhbHVlVHlwZV0pOwoKICAgICAgYm9vbCBpc01hcCA9IGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudAogICAgICAgICAgLmlzU3VidHlwZU9mKHNwcmVhZFR5cGUsIGluZmVycmVyLmNvcmVUeXBlcy5tYXBDbGFzcy5yYXdUeXBlKTsKICAgICAgYm9vbCBpc0l0ZXJhYmxlID0gaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50CiAgICAgICAgICAuaXNTdWJ0eXBlT2Yoc3ByZWFkVHlwZSwgaW5mZXJyZXIuY29yZVR5cGVzLml0ZXJhYmxlQ2xhc3MucmF3VHlwZSk7CiAgICAgIGlmIChpc01hcCAmJiAhaXNJdGVyYWJsZSkgewogICAgICAgIG1hcFNwcmVhZE9mZnNldCA9IGVudHJ5LmZpbGVPZmZzZXQ7CiAgICAgIH0KICAgICAgaWYgKCFpc01hcCAmJiBpc0l0ZXJhYmxlKSB7CiAgICAgICAgaXRlcmFibGVTcHJlYWRPZmZzZXQgPSBlbnRyeS5leHByZXNzaW9uLmZpbGVPZmZzZXQ7CiAgICAgIH0KCiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZiAoZW50cnkgaXMgSWZNYXBFbnRyeSkgewogICAgICBEYXJ0VHlwZSBib29sVHlwZSA9IGluZmVycmVyLmNvcmVUeXBlcy5ib29sQ2xhc3MucmF3VHlwZTsKICAgICAgRGFydFR5cGUgY29uZGl0aW9uVHlwZSA9IGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICAgIGVudHJ5LmNvbmRpdGlvbiwgYm9vbFR5cGUsIHR5cGVDaGVja3NOZWVkZWQsCiAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiBmYWxzZSk7CiAgICAgIGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgICBib29sVHlwZSwgY29uZGl0aW9uVHlwZSwgZW50cnkuY29uZGl0aW9uLCBlbnRyeS5jb25kaXRpb24uZmlsZU9mZnNldCk7CiAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIHJlY3Vyc2l2ZSBpbnZvY2F0aW9uIG9mIGluZmVyTWFwRW50cnkgd2lsbCBhZGQgdHdvIHR5cGVzCiAgICAgIC8vIHRvIGFjdHVhbFR5cGVzOyB0aGV5IGFyZSB0aGUgYWN0dWFsIHR5cGVzIG9mIHRoZSBjdXJyZW50IGludm9jYXRpb24gaWYKICAgICAgLy8gdGhlICdlbHNlJyBicmFuY2ggaXMgZW1wdHkuCiAgICAgIGluZmVyTWFwRW50cnkoCiAgICAgICAgICBlbnRyeS50aGVuLAogICAgICAgICAgZW50cnksCiAgICAgICAgICBpbmZlcnJlZEtleVR5cGUsCiAgICAgICAgICBpbmZlcnJlZFZhbHVlVHlwZSwKICAgICAgICAgIHNwcmVhZENvbnRleHQsCiAgICAgICAgICBhY3R1YWxUeXBlcywKICAgICAgICAgIGFjdHVhbFR5cGVzRm9yU2V0LAogICAgICAgICAgaW5mZXJyZWRTcHJlYWRUeXBlcywKICAgICAgICAgIGluZmVyZW5jZU5lZWRlZCwKICAgICAgICAgIHR5cGVDaGVja3NOZWVkZWQpOwogICAgICBpZiAoZW50cnkub3RoZXJ3aXNlICE9IG51bGwpIHsKICAgICAgICAvLyBXZSBuZWVkIHRvIG1vZGlmeSB0aGUgYWN0dWFsIHR5cGVzIGFkZGVkIGluIHRoZSByZWN1cnNpdmUgY2FsbCB0bwogICAgICAgIC8vIGluZmVyTWFwRW50cnkuCiAgICAgICAgRGFydFR5cGUgYWN0dWFsVmFsdWVUeXBlID0gYWN0dWFsVHlwZXMucmVtb3ZlTGFzdCgpOwogICAgICAgIERhcnRUeXBlIGFjdHVhbEtleVR5cGUgPSBhY3R1YWxUeXBlcy5yZW1vdmVMYXN0KCk7CiAgICAgICAgRGFydFR5cGUgYWN0dWFsVHlwZUZvclNldCA9IGFjdHVhbFR5cGVzRm9yU2V0LnJlbW92ZUxhc3QoKTsKICAgICAgICBpbmZlck1hcEVudHJ5KAogICAgICAgICAgICBlbnRyeS5vdGhlcndpc2UsCiAgICAgICAgICAgIGVudHJ5LAogICAgICAgICAgICBpbmZlcnJlZEtleVR5cGUsCiAgICAgICAgICAgIGluZmVycmVkVmFsdWVUeXBlLAogICAgICAgICAgICBzcHJlYWRDb250ZXh0LAogICAgICAgICAgICBhY3R1YWxUeXBlcywKICAgICAgICAgICAgYWN0dWFsVHlwZXNGb3JTZXQsCiAgICAgICAgICAgIGluZmVycmVkU3ByZWFkVHlwZXMsCiAgICAgICAgICAgIGluZmVyZW5jZU5lZWRlZCwKICAgICAgICAgICAgdHlwZUNoZWNrc05lZWRlZCk7CiAgICAgICAgaW50IGxlbmd0aCA9IGFjdHVhbFR5cGVzLmxlbmd0aDsKICAgICAgICBhY3R1YWxUeXBlc1tsZW5ndGggLSAyXSA9IGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudAogICAgICAgICAgICAuZ2V0U3RhbmRhcmRVcHBlckJvdW5kKGFjdHVhbEtleVR5cGUsIGFjdHVhbFR5cGVzW2xlbmd0aCAtIDJdKTsKICAgICAgICBhY3R1YWxUeXBlc1tsZW5ndGggLSAxXSA9IGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudAogICAgICAgICAgICAuZ2V0U3RhbmRhcmRVcHBlckJvdW5kKGFjdHVhbFZhbHVlVHlwZSwgYWN0dWFsVHlwZXNbbGVuZ3RoIC0gMV0pOwogICAgICAgIGludCBsZW5ndGhGb3JTZXQgPSBhY3R1YWxUeXBlc0ZvclNldC5sZW5ndGg7CiAgICAgICAgYWN0dWFsVHlwZXNGb3JTZXRbbGVuZ3RoRm9yU2V0IC0gMV0gPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAgICAgLmdldFN0YW5kYXJkVXBwZXJCb3VuZCgKICAgICAgICAgICAgICAgIGFjdHVhbFR5cGVGb3JTZXQsIGFjdHVhbFR5cGVzRm9yU2V0W2xlbmd0aEZvclNldCAtIDFdKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9IGVsc2UgaWYgKGVudHJ5IGlzIEZvck1hcEVudHJ5KSB7CiAgICAgIGZvciAoVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiBpbiBlbnRyeS52YXJpYWJsZXMpIHsKICAgICAgICBpZiAoZGVjbGFyYXRpb24ubmFtZSA9PSBudWxsKSB7CiAgICAgICAgICBpZiAoZGVjbGFyYXRpb24uaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgICBkZWNsYXJhdGlvbi50eXBlID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKGRlY2xhcmF0aW9uLmluaXRpYWxpemVyLAogICAgICAgICAgICAgICAgZGVjbGFyYXRpb24udHlwZSwgaW5mZXJlbmNlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQsCiAgICAgICAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQoZGVjbGFyYXRpb24pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZW50cnkuY29uZGl0aW9uICE9IG51bGwpIHsKICAgICAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgICAgIGVudHJ5LmNvbmRpdGlvbiwKICAgICAgICAgICAgaW5mZXJyZXIuY29yZVR5cGVzLmJvb2xDbGFzcy5yYXdUeXBlLAogICAgICAgICAgICBpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCwKICAgICAgICAgICAgaXNWb2lkQWxsb3dlZDogZmFsc2UpOwogICAgICB9CiAgICAgIGZvciAoRXhwcmVzc2lvbiBleHByZXNzaW9uIGluIGVudHJ5LnVwZGF0ZXMpIHsKICAgICAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oZXhwcmVzc2lvbiwgY29uc3QgVW5rbm93blR5cGUoKSwKICAgICAgICAgICAgaW5mZXJlbmNlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQsCiAgICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgICB9CiAgICAgIC8vIEFjdHVhbCB0eXBlcyBhcmUgYWRkZWQgYnkgdGhlIHJlY3Vyc2l2ZSBjYWxsLgogICAgICByZXR1cm4gaW5mZXJNYXBFbnRyeSgKICAgICAgICAgIGVudHJ5LmJvZHksCiAgICAgICAgICBlbnRyeSwKICAgICAgICAgIGluZmVycmVkS2V5VHlwZSwKICAgICAgICAgIGluZmVycmVkVmFsdWVUeXBlLAogICAgICAgICAgc3ByZWFkQ29udGV4dCwKICAgICAgICAgIGFjdHVhbFR5cGVzLAogICAgICAgICAgYWN0dWFsVHlwZXNGb3JTZXQsCiAgICAgICAgICBpbmZlcnJlZFNwcmVhZFR5cGVzLAogICAgICAgICAgaW5mZXJlbmNlTmVlZGVkLAogICAgICAgICAgdHlwZUNoZWNrc05lZWRlZCk7CiAgICB9IGVsc2UgaWYgKGVudHJ5IGlzIEZvckluTWFwRW50cnkpIHsKICAgICAgaWYgKGVudHJ5LnZhcmlhYmxlLm5hbWUgPT0gbnVsbCkgewogICAgICAgIGhhbmRsZUZvckluV2l0aG91dFZhcmlhYmxlKAogICAgICAgICAgICBlbnRyeS52YXJpYWJsZSwgZW50cnkuaXRlcmFibGUsIGVudHJ5LnByb2xvZ3VlLAogICAgICAgICAgICBpc0FzeW5jOiBlbnRyeS5pc0FzeW5jKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBoYW5kbGVGb3JJbkRlY2xhcmluZ1ZhcmlhYmxlKAogICAgICAgICAgICBlbnRyeS52YXJpYWJsZSwgZW50cnkuaXRlcmFibGUsIGVudHJ5LnByb2xvZ3VlLAogICAgICAgICAgICBpc0FzeW5jOiBlbnRyeS5pc0FzeW5jKTsKICAgICAgfQogICAgICBpZiAoZW50cnkucHJvYmxlbSAhPSBudWxsKSB7CiAgICAgICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKGVudHJ5LnByb2JsZW0sIGNvbnN0IFVua25vd25UeXBlKCksCiAgICAgICAgICAgIGluZmVyZW5jZU5lZWRlZCB8fCB0eXBlQ2hlY2tzTmVlZGVkLAogICAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgICAgfQogICAgICAvLyBBY3R1YWwgdHlwZXMgYXJlIGFkZGVkIGJ5IHRoZSByZWN1cnNpdmUgY2FsbC4KICAgICAgaW5mZXJNYXBFbnRyeSgKICAgICAgICAgIGVudHJ5LmJvZHksCiAgICAgICAgICBlbnRyeSwKICAgICAgICAgIGluZmVycmVkS2V5VHlwZSwKICAgICAgICAgIGluZmVycmVkVmFsdWVUeXBlLAogICAgICAgICAgc3ByZWFkQ29udGV4dCwKICAgICAgICAgIGFjdHVhbFR5cGVzLAogICAgICAgICAgYWN0dWFsVHlwZXNGb3JTZXQsCiAgICAgICAgICBpbmZlcnJlZFNwcmVhZFR5cGVzLAogICAgICAgICAgaW5mZXJlbmNlTmVlZGVkLAogICAgICAgICAgdHlwZUNoZWNrc05lZWRlZCk7CiAgICB9IGVsc2UgewogICAgICBEYXJ0VHlwZSBrZXlUeXBlID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgICAgZW50cnkua2V5LCBpbmZlcnJlZEtleVR5cGUsIHRydWUsCiAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgICAgRGFydFR5cGUgdmFsdWVUeXBlID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgICAgZW50cnkudmFsdWUsIGluZmVycmVkVmFsdWVUeXBlLCB0cnVlLAogICAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICAgIGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgICBpbmZlcnJlZEtleVR5cGUsIGtleVR5cGUsIGVudHJ5LmtleSwgZW50cnkua2V5LmZpbGVPZmZzZXQsCiAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiBpbmZlcnJlZEtleVR5cGUgaXMgVm9pZFR5cGUpOwogICAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKAogICAgICAgICAgaW5mZXJyZWRWYWx1ZVR5cGUsIHZhbHVlVHlwZSwgZW50cnkudmFsdWUsIGVudHJ5LnZhbHVlLmZpbGVPZmZzZXQsCiAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiBpbmZlcnJlZFZhbHVlVHlwZSBpcyBWb2lkVHlwZSk7CiAgICAgIGFjdHVhbFR5cGVzLmFkZChrZXlUeXBlKTsKICAgICAgYWN0dWFsVHlwZXMuYWRkKHZhbHVlVHlwZSk7CiAgICAgIC8vIFVzZSAnZHluYW1pYycgZm9yIGVycm9yIHJlY292ZXJ5LgogICAgICBhY3R1YWxUeXBlc0ZvclNldC5hZGQoY29uc3QgRHluYW1pY1R5cGUoKSk7CiAgICAgIG1hcEVudHJ5T2Zmc2V0ID0gZW50cnkuZmlsZU9mZnNldDsKICAgICAgcmV0dXJuOwogICAgfQogIH0KCiAgdm9pZCBjaGVja01hcEVudHJ5KAogICAgICBNYXBFbnRyeSBlbnRyeSwKICAgICAgVHJlZU5vZGUgcGFyZW50LAogICAgICBFeHByZXNzaW9uIGNhY2hlZEtleSwKICAgICAgRXhwcmVzc2lvbiBjYWNoZWRWYWx1ZSwKICAgICAgRGFydFR5cGUga2V5VHlwZSwKICAgICAgRGFydFR5cGUgdmFsdWVUeXBlLAogICAgICBNYXA8VHJlZU5vZGUsIERhcnRUeXBlPiBpbmZlcnJlZFNwcmVhZFR5cGVzKSB7CiAgICAvLyBJdCdzIGRpc2FtYmlndWF0ZWQgYXMgYSBtYXAgbGl0ZXJhbC4KICAgIGlmIChpdGVyYWJsZVNwcmVhZE9mZnNldCAhPSBudWxsKSB7CiAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQoCiAgICAgICAgICBlbnRyeSwKICAgICAgICAgIG5ldyBNYXBFbnRyeSgKICAgICAgICAgICAgICBpbmZlcnJlci5oZWxwZXIuZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oaW5mZXJyZXIuaGVscGVyCiAgICAgICAgICAgICAgICAgIC5idWlsZFByb2JsZW0oCiAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVNwcmVhZE1hcEVudHJ5VHlwZU1pc21hdGNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoaXRlcmFibGVTcHJlYWRUeXBlKSwKICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhYmxlU3ByZWFkT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgMSkpLAogICAgICAgICAgICAgIG5ldyBOdWxsTGl0ZXJhbCgpKSk7CiAgICB9CiAgICBpZiAoZW50cnkgaXMgU3ByZWFkTWFwRW50cnkpIHsKICAgICAgRGFydFR5cGUgc3ByZWFkVHlwZSA9IGluZmVycmVkU3ByZWFkVHlwZXNbZW50cnkuZXhwcmVzc2lvbl07CiAgICAgIGlmIChzcHJlYWRUeXBlIGlzIER5bmFtaWNUeXBlKSB7CiAgICAgICAgaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZShpbmZlcnJlci5jb3JlVHlwZXMubWFwQ2xhc3MucmF3VHlwZSwKICAgICAgICAgICAgc3ByZWFkVHlwZSwgZW50cnkuZXhwcmVzc2lvbiwgZW50cnkuZXhwcmVzc2lvbi5maWxlT2Zmc2V0KTsKICAgICAgfQogICAgfSBlbHNlIGlmIChlbnRyeSBpcyBJZk1hcEVudHJ5KSB7CiAgICAgIGNoZWNrTWFwRW50cnkoZW50cnkudGhlbiwgZW50cnksIGNhY2hlZEtleSwgY2FjaGVkVmFsdWUsIGtleVR5cGUsCiAgICAgICAgICB2YWx1ZVR5cGUsIGluZmVycmVkU3ByZWFkVHlwZXMpOwogICAgICBpZiAoZW50cnkub3RoZXJ3aXNlICE9IG51bGwpIHsKICAgICAgICBjaGVja01hcEVudHJ5KGVudHJ5Lm90aGVyd2lzZSwgZW50cnksIGNhY2hlZEtleSwgY2FjaGVkVmFsdWUsIGtleVR5cGUsCiAgICAgICAgICAgIHZhbHVlVHlwZSwgaW5mZXJyZWRTcHJlYWRUeXBlcyk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZW50cnkgaXMgRm9yTWFwRW50cnkpIHsKICAgICAgaWYgKGVudHJ5LmNvbmRpdGlvbiAhPSBudWxsKSB7CiAgICAgICAgRGFydFR5cGUgY29uZGl0aW9uVHlwZSA9IGdldEluZmVycmVkVHlwZShlbnRyeS5jb25kaXRpb24sIGluZmVycmVyKTsKICAgICAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKGluZmVycmVyLmNvcmVUeXBlcy5ib29sQ2xhc3MucmF3VHlwZSwKICAgICAgICAgICAgY29uZGl0aW9uVHlwZSwgZW50cnkuY29uZGl0aW9uLCBlbnRyeS5jb25kaXRpb24uZmlsZU9mZnNldCk7CiAgICAgIH0KICAgICAgY2hlY2tNYXBFbnRyeShlbnRyeS5ib2R5LCBlbnRyeSwgY2FjaGVkS2V5LCBjYWNoZWRWYWx1ZSwga2V5VHlwZSwKICAgICAgICAgIHZhbHVlVHlwZSwgaW5mZXJyZWRTcHJlYWRUeXBlcyk7CiAgICB9IGVsc2UgaWYgKGVudHJ5IGlzIEZvckluTWFwRW50cnkpIHsKICAgICAgY2hlY2tNYXBFbnRyeShlbnRyeS5ib2R5LCBlbnRyeSwgY2FjaGVkS2V5LCBjYWNoZWRWYWx1ZSwga2V5VHlwZSwKICAgICAgICAgIHZhbHVlVHlwZSwgaW5mZXJyZWRTcHJlYWRUeXBlcyk7CiAgICB9IGVsc2UgewogICAgICAvLyBEbyBub3RoaW5nLiAgQXNzaWduYWJpbGl0eSBjaGVja3MgYXJlIGRvbmUgZHVyaW5nIHR5cGUgaW5mZXJlbmNlLgogICAgfQogIH0KCiAgdm9pZCB2aXNpdE1hcExpdGVyYWxKdWRnbWVudChNYXBMaXRlcmFsSnVkZ21lbnQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHZhciBtYXBDbGFzcyA9IGluZmVycmVyLmNvcmVUeXBlcy5tYXBDbGFzczsKICAgIHZhciBtYXBUeXBlID0gbWFwQ2xhc3MudGhpc1R5cGU7CiAgICBMaXN0PERhcnRUeXBlPiBpbmZlcnJlZFR5cGVzOwogICAgRGFydFR5cGUgaW5mZXJyZWRLZXlUeXBlOwogICAgRGFydFR5cGUgaW5mZXJyZWRWYWx1ZVR5cGU7CiAgICBMaXN0PERhcnRUeXBlPiBmb3JtYWxUeXBlczsKICAgIExpc3Q8RGFydFR5cGU+IGFjdHVhbFR5cGVzOwogICAgTGlzdDxEYXJ0VHlwZT4gYWN0dWFsVHlwZXNGb3JTZXQ7CiAgICBhc3NlcnQoKG5vZGUua2V5VHlwZSBpcyBJbXBsaWNpdFR5cGVBcmd1bWVudCkgPT0KICAgICAgICAobm9kZS52YWx1ZVR5cGUgaXMgSW1wbGljaXRUeXBlQXJndW1lbnQpKTsKICAgIGJvb2wgaW5mZXJlbmNlTmVlZGVkID0gbm9kZS5rZXlUeXBlIGlzIEltcGxpY2l0VHlwZUFyZ3VtZW50OwogICAgS2VybmVsTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGluZmVycmVyLmxpYnJhcnk7CiAgICBib29sIHR5cGVDb250ZXh0SXNNYXAgPSBub2RlLmtleVR5cGUgaXMhIEltcGxpY2l0VHlwZUFyZ3VtZW50OwogICAgYm9vbCB0eXBlQ29udGV4dElzSXRlcmFibGUgPSBmYWxzZTsKICAgIGlmICghaW5mZXJyZXIuaXNUb3BMZXZlbCkgewogICAgICBpZiAobGlicmFyeS5sb2FkZXIudGFyZ2V0LmVuYWJsZVNldExpdGVyYWxzICYmIGluZmVyZW5jZU5lZWRlZCkgewogICAgICAgIC8vIEFtYmlndW91cyBzZXQvbWFwIGxpdGVyYWwKICAgICAgICBEYXJ0VHlwZSBjb250ZXh0ID0KICAgICAgICAgICAgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LnVuZnV0dXJlVHlwZSh0eXBlQ29udGV4dCk7CiAgICAgICAgaWYgKGNvbnRleHQgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICAgICAgdHlwZUNvbnRleHRJc01hcCA9IHR5cGVDb250ZXh0SXNNYXAgfHwKICAgICAgICAgICAgICBpbmZlcnJlci5jbGFzc0hpZXJhcmNoeQogICAgICAgICAgICAgICAgICAuaXNTdWJ0eXBlT2YoY29udGV4dC5jbGFzc05vZGUsIGluZmVycmVyLmNvcmVUeXBlcy5tYXBDbGFzcyk7CiAgICAgICAgICB0eXBlQ29udGV4dElzSXRlcmFibGUgPSB0eXBlQ29udGV4dElzSXRlcmFibGUgfHwKICAgICAgICAgICAgICBpbmZlcnJlci5jbGFzc0hpZXJhcmNoeS5pc1N1YnR5cGVPZigKICAgICAgICAgICAgICAgICAgY29udGV4dC5jbGFzc05vZGUsIGluZmVycmVyLmNvcmVUeXBlcy5pdGVyYWJsZUNsYXNzKTsKICAgICAgICAgIGlmIChub2RlLmVudHJpZXMuaXNFbXB0eSAmJgogICAgICAgICAgICAgIHR5cGVDb250ZXh0SXNJdGVyYWJsZSAmJgogICAgICAgICAgICAgICF0eXBlQ29udGV4dElzTWFwKSB7CiAgICAgICAgICAgIC8vIFNldCBsaXRlcmFsCiAgICAgICAgICAgIFNldExpdGVyYWxKdWRnbWVudCBzZXRMaXRlcmFsID0gbmV3IFNldExpdGVyYWxKdWRnbWVudChbXSwKICAgICAgICAgICAgICAgIHR5cGVBcmd1bWVudDogY29uc3QgSW1wbGljaXRUeXBlQXJndW1lbnQoKSwKICAgICAgICAgICAgICAgIGlzQ29uc3Q6IG5vZGUuaXNDb25zdCkKICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICAgICAgICAgIG5vZGUucGFyZW50LnJlcGxhY2VDaGlsZChub2RlLCBzZXRMaXRlcmFsKTsKICAgICAgICAgICAgdmlzaXRTZXRMaXRlcmFsSnVkZ21lbnQoc2V0TGl0ZXJhbCwgdHlwZUNvbnRleHQpOwogICAgICAgICAgICBub2RlLmluZmVycmVkVHlwZSA9IHNldExpdGVyYWwuaW5mZXJyZWRUeXBlOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBib29sIHR5cGVDaGVja3NOZWVkZWQgPSAhaW5mZXJyZXIuaXNUb3BMZXZlbDsKICAgIE1hcDxUcmVlTm9kZSwgRGFydFR5cGU+IGluZmVycmVkU3ByZWFkVHlwZXM7CiAgICBpZiAoaW5mZXJlbmNlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQpIHsKICAgICAgZm9ybWFsVHlwZXMgPSBbXTsKICAgICAgYWN0dWFsVHlwZXMgPSBbXTsKICAgICAgYWN0dWFsVHlwZXNGb3JTZXQgPSBbXTsKICAgICAgaW5mZXJyZWRTcHJlYWRUeXBlcyA9IG5ldyBNYXA8VHJlZU5vZGUsIERhcnRUeXBlPi5pZGVudGl0eSgpOwogICAgfQogICAgaWYgKGluZmVyZW5jZU5lZWRlZCkgewogICAgICBpbmZlcnJlZFR5cGVzID0gW2NvbnN0IFVua25vd25UeXBlKCksIGNvbnN0IFVua25vd25UeXBlKCldOwogICAgICBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQuaW5mZXJHZW5lcmljRnVuY3Rpb25PclR5cGUobWFwVHlwZSwKICAgICAgICAgIG1hcENsYXNzLnR5cGVQYXJhbWV0ZXJzLCBudWxsLCBudWxsLCB0eXBlQ29udGV4dCwgaW5mZXJyZWRUeXBlcywKICAgICAgICAgIGlzQ29uc3Q6IG5vZGUuaXNDb25zdCk7CiAgICAgIGluZmVycmVkS2V5VHlwZSA9IGluZmVycmVkVHlwZXNbMF07CiAgICAgIGluZmVycmVkVmFsdWVUeXBlID0gaW5mZXJyZWRUeXBlc1sxXTsKICAgIH0gZWxzZSB7CiAgICAgIGluZmVycmVkS2V5VHlwZSA9IG5vZGUua2V5VHlwZTsKICAgICAgaW5mZXJyZWRWYWx1ZVR5cGUgPSBub2RlLnZhbHVlVHlwZTsKICAgIH0KICAgIExpc3Q8RXhwcmVzc2lvbj4gY2FjaGVkS2V5cyA9IG5ldyBMaXN0KG5vZGUuZW50cmllcy5sZW5ndGgpOwogICAgTGlzdDxFeHByZXNzaW9uPiBjYWNoZWRWYWx1ZXMgPSBuZXcgTGlzdChub2RlLmVudHJpZXMubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZS5lbnRyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIE1hcEVudHJ5IGVudHJ5ID0gbm9kZS5lbnRyaWVzW2ldOwogICAgICBpZiAoZW50cnkgaXMhIENvbnRyb2xGbG93TWFwRW50cnkpIHsKICAgICAgICBjYWNoZWRLZXlzW2ldID0gbm9kZS5lbnRyaWVzW2ldLmtleTsKICAgICAgICBjYWNoZWRWYWx1ZXNbaV0gPSBub2RlLmVudHJpZXNbaV0udmFsdWU7CiAgICAgIH0KICAgIH0KICAgIGJvb2wgaGFzTWFwRW50cnkgPSBmYWxzZTsKICAgIGJvb2wgaGFzTWFwU3ByZWFkID0gZmFsc2U7CiAgICBib29sIGhhc0l0ZXJhYmxlU3ByZWFkID0gZmFsc2U7CiAgICBpZiAoaW5mZXJlbmNlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQpIHsKICAgICAgbWFwRW50cnlPZmZzZXQgPSBudWxsOwogICAgICBtYXBTcHJlYWRPZmZzZXQgPSBudWxsOwogICAgICBpdGVyYWJsZVNwcmVhZE9mZnNldCA9IG51bGw7CiAgICAgIGl0ZXJhYmxlU3ByZWFkVHlwZSA9IG51bGw7CiAgICAgIERhcnRUeXBlIHNwcmVhZFR5cGVDb250ZXh0ID0gY29uc3QgVW5rbm93blR5cGUoKTsKICAgICAgaWYgKHR5cGVDb250ZXh0SXNJdGVyYWJsZSAmJiAhdHlwZUNvbnRleHRJc01hcCkgewogICAgICAgIHNwcmVhZFR5cGVDb250ZXh0ID0gaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50CiAgICAgICAgICAgIC5nZXRUeXBlQXNJbnN0YW5jZU9mKHR5cGVDb250ZXh0LCBpbmZlcnJlci5jb3JlVHlwZXMuaXRlcmFibGVDbGFzcyk7CiAgICAgIH0gZWxzZSBpZiAoIXR5cGVDb250ZXh0SXNJdGVyYWJsZSAmJiB0eXBlQ29udGV4dElzTWFwKSB7CiAgICAgICAgc3ByZWFkVHlwZUNvbnRleHQgPSBuZXcgSW50ZXJmYWNlVHlwZShpbmZlcnJlci5jb3JlVHlwZXMubWFwQ2xhc3MsCiAgICAgICAgICAgIDxEYXJ0VHlwZT5baW5mZXJyZWRLZXlUeXBlLCBpbmZlcnJlZFZhbHVlVHlwZV0pOwogICAgICB9CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZS5lbnRyaWVzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgTWFwRW50cnkgZW50cnkgPSBub2RlLmVudHJpZXNbaV07CiAgICAgICAgaW5mZXJNYXBFbnRyeSgKICAgICAgICAgICAgZW50cnksCiAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgIGluZmVycmVkS2V5VHlwZSwKICAgICAgICAgICAgaW5mZXJyZWRWYWx1ZVR5cGUsCiAgICAgICAgICAgIHNwcmVhZFR5cGVDb250ZXh0LAogICAgICAgICAgICBhY3R1YWxUeXBlcywKICAgICAgICAgICAgYWN0dWFsVHlwZXNGb3JTZXQsCiAgICAgICAgICAgIGluZmVycmVkU3ByZWFkVHlwZXMsCiAgICAgICAgICAgIGluZmVyZW5jZU5lZWRlZCwKICAgICAgICAgICAgdHlwZUNoZWNrc05lZWRlZCk7CiAgICAgICAgaWYgKGluZmVyZW5jZU5lZWRlZCkgewogICAgICAgICAgZm9ybWFsVHlwZXMuYWRkKG1hcFR5cGUudHlwZUFyZ3VtZW50c1swXSk7CiAgICAgICAgICBmb3JtYWxUeXBlcy5hZGQobWFwVHlwZS50eXBlQXJndW1lbnRzWzFdKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaGFzTWFwRW50cnkgPSBtYXBFbnRyeU9mZnNldCAhPSBudWxsOwogICAgICBoYXNNYXBTcHJlYWQgPSBtYXBTcHJlYWRPZmZzZXQgIT0gbnVsbDsKICAgICAgaGFzSXRlcmFibGVTcHJlYWQgPSBpdGVyYWJsZVNwcmVhZE9mZnNldCAhPSBudWxsOwogICAgfQogICAgaWYgKGluZmVyZW5jZU5lZWRlZCkgewogICAgICBib29sIGNhbkJlU2V0ID0gIWhhc01hcFNwcmVhZCAmJiAhaGFzTWFwRW50cnkgJiYgIXR5cGVDb250ZXh0SXNNYXA7CiAgICAgIGJvb2wgY2FuQmVNYXAgPSAhaGFzSXRlcmFibGVTcHJlYWQgJiYgIXR5cGVDb250ZXh0SXNJdGVyYWJsZTsKICAgICAgaWYgKGNhbkJlU2V0ICYmICFjYW5CZU1hcCkgewogICAgICAgIExpc3Q8RXhwcmVzc2lvbj4gc2V0RWxlbWVudHMgPSA8RXhwcmVzc2lvbj5bXTsKICAgICAgICBMaXN0PERhcnRUeXBlPiBmb3JtYWxUeXBlc0ZvclNldCA9IDxEYXJ0VHlwZT5bXTsKICAgICAgICBJbnRlcmZhY2VUeXBlIHNldFR5cGUgPSBpbmZlcnJlci5jb3JlVHlwZXMuc2V0Q2xhc3MudGhpc1R5cGU7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLmVudHJpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgIHNldEVsZW1lbnRzLmFkZChjb252ZXJ0VG9FbGVtZW50KG5vZGUuZW50cmllc1tpXSwgaW5mZXJyZXIuaGVscGVyKSk7CiAgICAgICAgICBmb3JtYWxUeXBlc0ZvclNldC5hZGQoc2V0VHlwZS50eXBlQXJndW1lbnRzWzBdKTsKICAgICAgICB9CgogICAgICAgIExpc3Q8RGFydFR5cGU+IGluZmVycmVkVHlwZXNGb3JTZXQgPSA8RGFydFR5cGU+W2NvbnN0IFVua25vd25UeXBlKCldOwogICAgICAgIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC5pbmZlckdlbmVyaWNGdW5jdGlvbk9yVHlwZSgKICAgICAgICAgICAgc2V0VHlwZSwKICAgICAgICAgICAgaW5mZXJyZXIuY29yZVR5cGVzLnNldENsYXNzLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgICAgICBudWxsLAogICAgICAgICAgICBudWxsLAogICAgICAgICAgICB0eXBlQ29udGV4dCwKICAgICAgICAgICAgaW5mZXJyZWRUeXBlc0ZvclNldCwKICAgICAgICAgICAgaXNDb25zdDogbm9kZS5pc0NvbnN0KTsKICAgICAgICBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQuaW5mZXJHZW5lcmljRnVuY3Rpb25PclR5cGUoCiAgICAgICAgICAgIGluZmVycmVyLmNvcmVUeXBlcy5zZXRDbGFzcy50aGlzVHlwZSwKICAgICAgICAgICAgaW5mZXJyZXIuY29yZVR5cGVzLnNldENsYXNzLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgICAgICBmb3JtYWxUeXBlc0ZvclNldCwKICAgICAgICAgICAgYWN0dWFsVHlwZXNGb3JTZXQsCiAgICAgICAgICAgIHR5cGVDb250ZXh0LAogICAgICAgICAgICBpbmZlcnJlZFR5cGVzRm9yU2V0KTsKICAgICAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGVBcmd1bWVudCA9IGluZmVycmVkVHlwZXNGb3JTZXRbMF07CiAgICAgICAgaW5mZXJyZXIuaW5zdHJ1bWVudGF0aW9uPy5yZWNvcmQoCiAgICAgICAgICAgIGluZmVycmVyLnVyaSwKICAgICAgICAgICAgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgICAgICAndHlwZUFyZ3MnLAogICAgICAgICAgICBuZXcgSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JUeXBlQXJncyhbaW5mZXJyZWRUeXBlQXJndW1lbnRdKSk7CgogICAgICAgIFNldExpdGVyYWxKdWRnbWVudCBzZXRMaXRlcmFsID0gbmV3IFNldExpdGVyYWxKdWRnbWVudChzZXRFbGVtZW50cywKICAgICAgICAgICAgdHlwZUFyZ3VtZW50OiBpbmZlcnJlZFR5cGVBcmd1bWVudCwgaXNDb25zdDogbm9kZS5pc0NvbnN0KQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OwogICAgICAgIG5vZGUucGFyZW50LnJlcGxhY2VDaGlsZChub2RlLCBzZXRMaXRlcmFsKTsKICAgICAgICBpZiAodHlwZUNoZWNrc05lZWRlZCkgewogICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXRMaXRlcmFsLmV4cHJlc3Npb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGNoZWNrRWxlbWVudChzZXRMaXRlcmFsLmV4cHJlc3Npb25zW2ldLCBzZXRMaXRlcmFsLAogICAgICAgICAgICAgICAgc2V0TGl0ZXJhbC50eXBlQXJndW1lbnQsIGluZmVycmVkU3ByZWFkVHlwZXMpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbm9kZS5pbmZlcnJlZFR5cGUgPSBzZXRMaXRlcmFsLmluZmVycmVkVHlwZSA9CiAgICAgICAgICAgIG5ldyBJbnRlcmZhY2VUeXBlKGluZmVycmVyLmNvcmVUeXBlcy5zZXRDbGFzcywgaW5mZXJyZWRUeXBlc0ZvclNldCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChjYW5CZVNldCAmJiBjYW5CZU1hcCAmJiBub2RlLmVudHJpZXMuaXNOb3RFbXB0eSkgewogICAgICAgIG5vZGUucGFyZW50LnJlcGxhY2VDaGlsZCgKICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgaW5mZXJyZXIuaGVscGVyLmRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKGluZmVycmVyLmhlbHBlcgogICAgICAgICAgICAgICAgLmJ1aWxkUHJvYmxlbShtZXNzYWdlQ2FudERpc2FtYmlndWF0ZU5vdEVub3VnaEluZm9ybWF0aW9uLAogICAgICAgICAgICAgICAgICAgIG5vZGUuZmlsZU9mZnNldCwgMSkpKTsKICAgICAgICBub2RlLmluZmVycmVkVHlwZSA9IGNvbnN0IEJvdHRvbVR5cGUoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKCFjYW5CZVNldCAmJiAhY2FuQmVNYXApIHsKICAgICAgICBpZiAoIWluZmVycmVyLmlzVG9wTGV2ZWwpIHsKICAgICAgICAgIG5vZGUucGFyZW50LnJlcGxhY2VDaGlsZCgKICAgICAgICAgICAgICBub2RlLAogICAgICAgICAgICAgIGluZmVycmVyLmhlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihpbmZlcnJlci5oZWxwZXIKICAgICAgICAgICAgICAgICAgLmJ1aWxkUHJvYmxlbShtZXNzYWdlQ2FudERpc2FtYmlndWF0ZUFtYmlndW91c0luZm9ybWF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgbm9kZS5maWxlT2Zmc2V0LCAxKSkpOwogICAgICAgIH0KICAgICAgICBub2RlLmluZmVycmVkVHlwZSA9IGNvbnN0IEJvdHRvbVR5cGUoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LmluZmVyR2VuZXJpY0Z1bmN0aW9uT3JUeXBlKAogICAgICAgICAgbWFwVHlwZSwKICAgICAgICAgIG1hcENsYXNzLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgICAgZm9ybWFsVHlwZXMsCiAgICAgICAgICBhY3R1YWxUeXBlcywKICAgICAgICAgIHR5cGVDb250ZXh0LAogICAgICAgICAgaW5mZXJyZWRUeXBlcyk7CiAgICAgIGluZmVycmVkS2V5VHlwZSA9IGluZmVycmVkVHlwZXNbMF07CiAgICAgIGluZmVycmVkVmFsdWVUeXBlID0gaW5mZXJyZWRUeXBlc1sxXTsKICAgICAgaW5mZXJyZXIuaW5zdHJ1bWVudGF0aW9uPy5yZWNvcmQoCiAgICAgICAgICBpbmZlcnJlci51cmksCiAgICAgICAgICBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgICAndHlwZUFyZ3MnLAogICAgICAgICAgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZUFyZ3MoCiAgICAgICAgICAgICAgW2luZmVycmVkS2V5VHlwZSwgaW5mZXJyZWRWYWx1ZVR5cGVdKSk7CiAgICAgIG5vZGUua2V5VHlwZSA9IGluZmVycmVkS2V5VHlwZTsKICAgICAgbm9kZS52YWx1ZVR5cGUgPSBpbmZlcnJlZFZhbHVlVHlwZTsKICAgIH0KICAgIGlmICh0eXBlQ2hlY2tzTmVlZGVkKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZS5lbnRyaWVzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgY2hlY2tNYXBFbnRyeShub2RlLmVudHJpZXNbaV0sIG5vZGUsIGNhY2hlZEtleXNbaV0sIGNhY2hlZFZhbHVlc1tpXSwKICAgICAgICAgICAgbm9kZS5rZXlUeXBlLCBub2RlLnZhbHVlVHlwZSwgaW5mZXJyZWRTcHJlYWRUeXBlcyk7CiAgICAgIH0KICAgIH0KICAgIG5vZGUuaW5mZXJyZWRUeXBlID0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZShtYXBDbGFzcywgW2luZmVycmVkS2V5VHlwZSwgaW5mZXJyZWRWYWx1ZVR5cGVdKTsKICAgIGlmICghaW5mZXJyZXIuaXNUb3BMZXZlbCkgewogICAgICBLZXJuZWxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5ID0gaW5mZXJyZXIubGlicmFyeTsKICAgICAgLy8gRWl0aGVyIGJvdGggW19kZWNsYXJlZEtleVR5cGVdIGFuZCBbX2RlY2xhcmVkVmFsdWVUeXBlXSBhcmUgb21pdHRlZCBvcgogICAgICAvLyBub25lIG9mIHRoZW0sIHNvIHdlIG1heSBqdXN0IGNoZWNrIG9uZS4KICAgICAgaWYgKGluZmVyZW5jZU5lZWRlZCkgewogICAgICAgIGxpYnJhcnkuY2hlY2tCb3VuZHNJbk1hcExpdGVyYWwobm9kZSwgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LAogICAgICAgICAgICBpbmZlcnJlZDogdHJ1ZSk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgdmlzaXRNZXRob2RJbnZvY2F0aW9uSnVkZ21lbnQoCiAgICAgIE1ldGhvZEludm9jYXRpb25KdWRnbWVudCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgaWYgKG5vZGUubmFtZS5uYW1lID09ICd1bmFyeS0nICYmCiAgICAgICAgbm9kZS5hcmd1bWVudHMudHlwZXMuaXNFbXB0eSAmJgogICAgICAgIG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwuaXNFbXB0eSAmJgogICAgICAgIG5vZGUuYXJndW1lbnRzLm5hbWVkLmlzRW1wdHkpIHsKICAgICAgLy8gUmVwbGFjZSBpbnRlZ2VyIGxpdGVyYWxzIGluIGEgZG91YmxlIGNvbnRleHQgd2l0aCB0aGUgY29ycmVzcG9uZGluZwogICAgICAvLyBkb3VibGUgbGl0ZXJhbCBpZiBpdCdzIGV4YWN0LiAgRm9yIGRvdWJsZSBsaXRlcmFscywgdGhlIG5lZ2F0aW9uIGlzCiAgICAgIC8vIGZvbGRlZCBhd2F5LiAgSW4gYW55IG5vbi1kb3VibGUgY29udGV4dCwgb3IgaWYgdGhlcmUgaXMgbm8gZXhhY3QKICAgICAgLy8gZG91YmxlIHZhbHVlLCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIGludGVnZXIgbGl0ZXJhbCBpcyBsZWZ0LiAgVGhlCiAgICAgIC8vIG5lZ2F0aW9uIGlzIG5vdCBmb2xkZWQgYXdheSBzbyB0aGF0IHBsYXRmb3JtcyB3aXRoIHdlYiBsaXRlcmFscyBjYW4KICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiAobm9uLW5lZ2F0ZWQpIDB4ODAwMDAwMDAwMDAwMDAwMCByZXByZXNlbnRlZCBhcwogICAgICAvLyBpbnRlZ2VyIGxpdGVyYWwgLTkyMjMzNzIwMzY4NTQ3NzU4MDggd2hpY2ggc2hvdWxkIGJlIGEgcG9zaXRpdmUgbnVtYmVyLAogICAgICAvLyBhbmQgbmVnYXRlZCA5MjIzMzcyMDM2ODU0Nzc1ODA4IHJlcHJlc2VudGVkIGFzCiAgICAgIC8vIC05MjIzMzcyMDM2ODU0Nzc1ODA4LnVuYXJ5LSgpIHdoaWNoIHNob3VsZCBiZSBhIG5lZ2F0aXZlIG51bWJlci4KICAgICAgaWYgKG5vZGUucmVjZWl2ZXIgaXMgSW50SnVkZ21lbnQpIHsKICAgICAgICBJbnRKdWRnbWVudCByZWNlaXZlciA9IG5vZGUucmVjZWl2ZXI7CiAgICAgICAgaWYgKGluZmVycmVyLmlzRG91YmxlQ29udGV4dCh0eXBlQ29udGV4dCkpIHsKICAgICAgICAgIGRvdWJsZSBkb3VibGVWYWx1ZSA9IHJlY2VpdmVyLmFzRG91YmxlKG5lZ2F0ZWQ6IHRydWUpOwogICAgICAgICAgaWYgKGRvdWJsZVZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgbm9kZS5wYXJlbnQucmVwbGFjZUNoaWxkKAogICAgICAgICAgICAgICAgbm9kZSwgRG91YmxlTGl0ZXJhbChkb3VibGVWYWx1ZSkuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQpOwogICAgICAgICAgICBub2RlLmluZmVycmVkVHlwZSA9IGluZmVycmVyLmNvcmVUeXBlcy5kb3VibGVDbGFzcy5yYXdUeXBlOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgRXhwcmVzc2lvbiBlcnJvciA9IGNoZWNrV2ViSW50TGl0ZXJhbHNFcnJvcklmVW5leGFjdCgKICAgICAgICAgICAgaW5mZXJyZXIsIHJlY2VpdmVyLnZhbHVlLCByZWNlaXZlci5saXRlcmFsLCByZWNlaXZlci5maWxlT2Zmc2V0KTsKICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkgewogICAgICAgICAgbm9kZS5wYXJlbnQucmVwbGFjZUNoaWxkKG5vZGUsIGVycm9yKTsKICAgICAgICAgIG5vZGUuaW5mZXJyZWRUeXBlID0gY29uc3QgQm90dG9tVHlwZSgpOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKG5vZGUucmVjZWl2ZXIgaXMgU2hhZG93TGFyZ2VJbnRMaXRlcmFsKSB7CiAgICAgICAgU2hhZG93TGFyZ2VJbnRMaXRlcmFsIHJlY2VpdmVyID0gbm9kZS5yZWNlaXZlcjsKICAgICAgICBpZiAoIXJlY2VpdmVyLmlzUGFyZW50aGVzaXplZCkgewogICAgICAgICAgaWYgKGluZmVycmVyLmlzRG91YmxlQ29udGV4dCh0eXBlQ29udGV4dCkpIHsKICAgICAgICAgICAgZG91YmxlIGRvdWJsZVZhbHVlID0gcmVjZWl2ZXIuYXNEb3VibGUobmVnYXRlZDogdHJ1ZSk7CiAgICAgICAgICAgIGlmIChkb3VibGVWYWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgbm9kZS5wYXJlbnQucmVwbGFjZUNoaWxkKG5vZGUsCiAgICAgICAgICAgICAgICAgIERvdWJsZUxpdGVyYWwoZG91YmxlVmFsdWUpLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0KTsKICAgICAgICAgICAgICBub2RlLmluZmVycmVkVHlwZSA9IGluZmVycmVyLmNvcmVUeXBlcy5kb3VibGVDbGFzcy5yYXdUeXBlOwogICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpbnQgaW50VmFsdWUgPSByZWNlaXZlci5hc0ludDY0KG5lZ2F0ZWQ6IHRydWUpOwogICAgICAgICAgaWYgKGludFZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgRXhwcmVzc2lvbiBlcnJvciA9IGluZmVycmVyLmhlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbigKICAgICAgICAgICAgICAgIGluZmVycmVyLmhlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVJbnRlZ2VyTGl0ZXJhbElzT3V0T2ZSYW5nZQogICAgICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhyZWNlaXZlci5saXRlcmFsKSwKICAgICAgICAgICAgICAgICAgICByZWNlaXZlci5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyLmxpdGVyYWwubGVuZ3RoKSk7CiAgICAgICAgICAgIG5vZGUucGFyZW50LnJlcGxhY2VDaGlsZChub2RlLCBlcnJvcik7CiAgICAgICAgICAgIG5vZGUuaW5mZXJyZWRUeXBlID0gY29uc3QgQm90dG9tVHlwZSgpOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpbnRWYWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICAgIEV4cHJlc3Npb24gZXJyb3IgPSBjaGVja1dlYkludExpdGVyYWxzRXJyb3JJZlVuZXhhY3QoCiAgICAgICAgICAgICAgICBpbmZlcnJlciwgaW50VmFsdWUsIHJlY2VpdmVyLmxpdGVyYWwsIHJlY2VpdmVyLmZpbGVPZmZzZXQpOwogICAgICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkgewogICAgICAgICAgICAgIG5vZGUucGFyZW50LnJlcGxhY2VDaGlsZChub2RlLCBlcnJvcik7CiAgICAgICAgICAgICAgbm9kZS5pbmZlcnJlZFR5cGUgPSBjb25zdCBCb3R0b21UeXBlKCk7CiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbm9kZS5yZWNlaXZlciA9IEludExpdGVyYWwoLWludFZhbHVlKQogICAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUucmVjZWl2ZXIuZmlsZU9mZnNldAogICAgICAgICAgICAgIC4ucGFyZW50ID0gbm9kZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHZhciBpbmZlcmVuY2VSZXN1bHQgPSBpbmZlcnJlci5pbmZlck1ldGhvZEludm9jYXRpb24oCiAgICAgICAgbm9kZSwgbm9kZS5yZWNlaXZlciwgbm9kZS5maWxlT2Zmc2V0LCBub2RlLl9pc0ltcGxpY2l0Q2FsbCwgdHlwZUNvbnRleHQsCiAgICAgICAgZGVzdWdhcmVkSW52b2NhdGlvbjogbm9kZSk7CiAgICBub2RlLmluZmVycmVkVHlwZSA9IGluZmVyZW5jZVJlc3VsdC50eXBlOwogIH0KCiAgdm9pZCB2aXNpdE5hbWVkRnVuY3Rpb25FeHByZXNzaW9uSnVkZ21lbnQoCiAgICAgIE5hbWVkRnVuY3Rpb25FeHByZXNzaW9uSnVkZ21lbnQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIgPSBub2RlLnZhcmlhYmxlSnVkZ21lbnQuaW5pdGlhbGl6ZXI7CiAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oaW5pdGlhbGl6ZXIsIHR5cGVDb250ZXh0LCB0cnVlKTsKICAgIG5vZGUuaW5mZXJyZWRUeXBlID0gZ2V0SW5mZXJyZWRUeXBlKGluaXRpYWxpemVyLCBpbmZlcnJlcik7CiAgICBub2RlLnZhcmlhYmxlLnR5cGUgPSBub2RlLmluZmVycmVkVHlwZTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE5vdChOb3Qgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHZhciBvcGVyYW5kID0gbm9kZS5vcGVyYW5kOwogICAgdmFyIGJvb2xUeXBlID0gaW5mZXJyZXIuY29yZVR5cGVzLmJvb2xDbGFzcy5yYXdUeXBlOwogICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKG9wZXJhbmQsIGJvb2xUeXBlLCAhaW5mZXJyZXIuaXNUb3BMZXZlbCk7CiAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKGJvb2xUeXBlLCBnZXRJbmZlcnJlZFR5cGUob3BlcmFuZCwgaW5mZXJyZXIpLAogICAgICAgIG5vZGUub3BlcmFuZCwgbm9kZS5maWxlT2Zmc2V0KTsKICB9CgogIHZvaWQgdmlzaXROdWxsQXdhcmVNZXRob2RJbnZvY2F0aW9uSnVkZ21lbnQoCiAgICAgIE51bGxBd2FyZU1ldGhvZEludm9jYXRpb25KdWRnbWVudCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgdmFyIGluZmVyZW5jZVJlc3VsdCA9IGluZmVycmVyLmluZmVyTWV0aG9kSW52b2NhdGlvbigKICAgICAgICBub2RlLCBub2RlLnZhcmlhYmxlLmluaXRpYWxpemVyLCBub2RlLmZpbGVPZmZzZXQsIGZhbHNlLCB0eXBlQ29udGV4dCwKICAgICAgICByZWNlaXZlclZhcmlhYmxlOiBub2RlLnZhcmlhYmxlLAogICAgICAgIGRlc3VnYXJlZEludm9jYXRpb246IG5vZGUuX2Rlc3VnYXJlZEludm9jYXRpb24pOwogICAgbm9kZS5pbmZlcnJlZFR5cGUgPSBpbmZlcmVuY2VSZXN1bHQudHlwZTsKICAgIG5vZGUuYm9keS5zdGF0aWNUeXBlID0gbm9kZS5pbmZlcnJlZFR5cGU7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgdmlzaXROdWxsQXdhcmVQcm9wZXJ0eUdldEp1ZGdtZW50KAogICAgICBOdWxsQXdhcmVQcm9wZXJ0eUdldEp1ZGdtZW50IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBpbmZlcnJlci5pbmZlclByb3BlcnR5R2V0KAogICAgICAgIG5vZGUsIG5vZGUucmVjZWl2ZXJKdWRnbWVudCwgbm9kZS5maWxlT2Zmc2V0LCB0eXBlQ29udGV4dCwKICAgICAgICByZWNlaXZlclZhcmlhYmxlOiBub2RlLnZhcmlhYmxlLCBkZXN1Z2FyZWRHZXQ6IG5vZGUuX2Rlc3VnYXJlZEdldCk7CiAgICBub2RlLmJvZHkuc3RhdGljVHlwZSA9IG5vZGUuaW5mZXJyZWRUeXBlOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TnVsbExpdGVyYWwoTnVsbExpdGVyYWwgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHt9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMZXQoTGV0IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBEYXJ0VHlwZSB2YXJpYWJsZVR5cGUgPSBub2RlLnZhcmlhYmxlLnR5cGU7CiAgICBpZiAodmFyaWFibGVUeXBlID09IGNvbnN0IER5bmFtaWNUeXBlKCkpIHsKICAgICAgcmV0dXJuIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIHR5cGVDb250ZXh0KTsKICAgIH0KICAgIEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIgPSBub2RlLnZhcmlhYmxlLmluaXRpYWxpemVyOwogICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKGluaXRpYWxpemVyLCB2YXJpYWJsZVR5cGUsIHRydWUsCiAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICBFeHByZXNzaW9uIGJvZHkgPSBub2RlLmJvZHk7CiAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oYm9keSwgdHlwZUNvbnRleHQsIHRydWUsIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgLy8gVE9ETyhhaGUpOiBUaGlzIHNob3VsZG4ndCBiZSBuZWVkZWQuIFNlZSBJbmZlcnJlZFR5cGVWaXNpdG9yLnZpc2l0TGV0LgogICAgaW5mZXJyZXIuc3RvcmVJbmZlcnJlZFR5cGUobm9kZSwgZ2V0SW5mZXJyZWRUeXBlKGJvZHksIGluZmVycmVyKSk7CiAgfQoKICB2b2lkIHZpc2l0UHJvcGVydHlBc3NpZ25tZW50SnVkZ21lbnQoCiAgICAgIFByb3BlcnR5QXNzaWdubWVudEp1ZGdtZW50IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICB2YXIgcmVjZWl2ZXJUeXBlID0gbm9kZS5faW5mZXJSZWNlaXZlcihpbmZlcnJlcik7CgogICAgRGFydFR5cGUgcmVhZFR5cGU7CiAgICBpZiAobm9kZS5yZWFkICE9IG51bGwpIHsKICAgICAgdmFyIHJlYWRNZW1iZXIgPSBpbmZlcnJlci5maW5kUHJvcGVydHlHZXRNZW1iZXIocmVjZWl2ZXJUeXBlLCBub2RlLnJlYWQsCiAgICAgICAgICBpbnN0cnVtZW50ZWQ6IGZhbHNlKTsKICAgICAgcmVhZFR5cGUgPSBpbmZlcnJlci5nZXRDYWxsZWVUeXBlKHJlYWRNZW1iZXIsIHJlY2VpdmVyVHlwZSk7CiAgICAgIGluZmVycmVyLmhhbmRsZVByb3BlcnR5R2V0Q29udHJhdmFyaWFuY2UoCiAgICAgICAgICBub2RlLnJlY2VpdmVyLAogICAgICAgICAgcmVhZE1lbWJlciwKICAgICAgICAgIG5vZGUucmVhZCBpcyBQcm9wZXJ0eUdldCA/IG5vZGUucmVhZCA6IG51bGwsCiAgICAgICAgICBub2RlLnJlYWQsCiAgICAgICAgICByZWFkVHlwZSwKICAgICAgICAgIG5vZGUucmVhZC5maWxlT2Zmc2V0KTsKICAgICAgbm9kZS5fc3RvcmVMZXRUeXBlKGluZmVycmVyLCBub2RlLnJlYWQsIHJlYWRUeXBlKTsKICAgIH0KICAgIE1lbWJlciB3cml0ZU1lbWJlcjsKICAgIGlmIChub2RlLndyaXRlICE9IG51bGwpIHsKICAgICAgd3JpdGVNZW1iZXIgPSBub2RlLl9oYW5kbGVXcml0ZUNvbnRyYXZhcmlhbmNlKGluZmVycmVyLCByZWNlaXZlclR5cGUpOwogICAgfQogICAgLy8gVG8gcmVwbGljYXRlIGFuYWx5emVyIGJlaGF2aW9yLCB3ZSBiYXNlIHR5cGUgaW5mZXJlbmNlIG9uIHRoZSB3cml0ZQogICAgLy8gbWVtYmVyLiAgVE9ETyhwYXVsYmVycnkpOiB3b3VsZCBpdCBiZSBiZXR0ZXIgdG8gdXNlIHRoZSByZWFkIG1lbWJlciB3aGVuCiAgICAvLyBkb2luZyBjb21wb3VuZCBhc3NpZ25tZW50PwogICAgdmFyIHdyaXRlQ29udGV4dCA9IGluZmVycmVyLmdldFNldHRlclR5cGUod3JpdGVNZW1iZXIsIHJlY2VpdmVyVHlwZSk7CiAgICBub2RlLl9pbmZlclJocyhpbmZlcnJlciwgcmVhZFR5cGUsIHdyaXRlQ29udGV4dCk7CiAgICBub2RlLm51bGxBd2FyZUd1YXJkPy5zdGF0aWNUeXBlID0gbm9kZS5pbmZlcnJlZFR5cGU7CiAgICBub2RlLl9yZXBsYWNlV2l0aERlc3VnYXJlZCgpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UHJvcGVydHlHZXQoUHJvcGVydHlHZXQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIGluZmVycmVyLmluZmVyUHJvcGVydHlHZXQobm9kZSwgbm9kZS5yZWNlaXZlciwgbm9kZS5maWxlT2Zmc2V0LCB0eXBlQ29udGV4dCwKICAgICAgICBkZXN1Z2FyZWRHZXQ6IG5vZGUpOwogIH0KCiAgdm9pZCB2aXNpdFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXJKdWRnbWVudCgKICAgICAgUmVkaXJlY3RpbmdJbml0aWFsaXplckp1ZGdtZW50IG5vZGUpIHsKICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gY2xhc3NUeXBlUGFyYW1ldGVycyA9CiAgICAgICAgbm9kZS50YXJnZXQuZW5jbG9zaW5nQ2xhc3MudHlwZVBhcmFtZXRlcnM7CiAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0KICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4oY2xhc3NUeXBlUGFyYW1ldGVycy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHR5cGVBcmd1bWVudHNbaV0gPSBuZXcgVHlwZVBhcmFtZXRlclR5cGUoY2xhc3NUeXBlUGFyYW1ldGVyc1tpXSk7CiAgICB9CiAgICBBcmd1bWVudHNKdWRnbWVudC5zZXROb25JbmZlcnJhYmxlQXJndW1lbnRUeXBlcygKICAgICAgICBub2RlLmFyZ3VtZW50cywgdHlwZUFyZ3VtZW50cyk7CiAgICBpbmZlcnJlci5pbmZlckludm9jYXRpb24oCiAgICAgICAgbnVsbCwKICAgICAgICBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgbm9kZS50YXJnZXQuZnVuY3Rpb24uZnVuY3Rpb25UeXBlLAogICAgICAgIG5vZGUudGFyZ2V0LmVuY2xvc2luZ0NsYXNzLnRoaXNUeXBlLAogICAgICAgIG5vZGUuYXJndW1lbnRKdWRnbWVudHMsCiAgICAgICAgc2tpcFR5cGVBcmd1bWVudEluZmVyZW5jZTogdHJ1ZSk7CiAgICBBcmd1bWVudHNKdWRnbWVudC5yZW1vdmVOb25JbmZlcnJhYmxlQXJndW1lbnRUeXBlcyhub2RlLmFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UmV0aHJvdyhSZXRocm93IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7fQoKICB2b2lkIHZpc2l0UmV0dXJuSnVkZ21lbnQoUmV0dXJuSnVkZ21lbnQgbm9kZSkgewogICAgdmFyIGp1ZGdtZW50ID0gbm9kZS5qdWRnbWVudDsKICAgIHZhciBjbG9zdXJlQ29udGV4dCA9IGluZmVycmVyLmNsb3N1cmVDb250ZXh0OwogICAgRGFydFR5cGUgdHlwZUNvbnRleHQgPSAhY2xvc3VyZUNvbnRleHQuaXNHZW5lcmF0b3IKICAgICAgICA/IGNsb3N1cmVDb250ZXh0LnJldHVybk9yWWllbGRDb250ZXh0CiAgICAgICAgOiBjb25zdCBVbmtub3duVHlwZSgpOwogICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlOwogICAgaWYgKG5vZGUuZXhwcmVzc2lvbiAhPSBudWxsKSB7CiAgICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihqdWRnbWVudCwgdHlwZUNvbnRleHQsIHRydWUsCiAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgICAgaW5mZXJyZWRUeXBlID0gZ2V0SW5mZXJyZWRUeXBlKGp1ZGdtZW50LCBpbmZlcnJlcik7CiAgICB9IGVsc2UgewogICAgICBpbmZlcnJlZFR5cGUgPSBpbmZlcnJlci5jb3JlVHlwZXMubnVsbENsYXNzLnJhd1R5cGU7CiAgICB9CiAgICBjbG9zdXJlQ29udGV4dC5oYW5kbGVSZXR1cm4oaW5mZXJyZXIsIG5vZGUsIGluZmVycmVkVHlwZSwKICAgICAgICAhaWRlbnRpY2FsKG5vZGUucmV0dXJuS2V5d29yZExleGVtZSwgInJldHVybiIpKTsKICB9CgogIHZvaWQgdmlzaXRTZXRMaXRlcmFsSnVkZ21lbnQoU2V0TGl0ZXJhbEp1ZGdtZW50IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICB2YXIgc2V0Q2xhc3MgPSBpbmZlcnJlci5jb3JlVHlwZXMuc2V0Q2xhc3M7CiAgICB2YXIgc2V0VHlwZSA9IHNldENsYXNzLnRoaXNUeXBlOwogICAgTGlzdDxEYXJ0VHlwZT4gaW5mZXJyZWRUeXBlczsKICAgIERhcnRUeXBlIGluZmVycmVkVHlwZUFyZ3VtZW50OwogICAgTGlzdDxEYXJ0VHlwZT4gZm9ybWFsVHlwZXM7CiAgICBMaXN0PERhcnRUeXBlPiBhY3R1YWxUeXBlczsKICAgIGJvb2wgaW5mZXJlbmNlTmVlZGVkID0gbm9kZS50eXBlQXJndW1lbnQgaXMgSW1wbGljaXRUeXBlQXJndW1lbnQ7CiAgICBib29sIHR5cGVDaGVja3NOZWVkZWQgPSAhaW5mZXJyZXIuaXNUb3BMZXZlbDsKICAgIE1hcDxUcmVlTm9kZSwgRGFydFR5cGU+IGluZmVycmVkU3ByZWFkVHlwZXM7CiAgICBpZiAoaW5mZXJlbmNlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQpIHsKICAgICAgZm9ybWFsVHlwZXMgPSBbXTsKICAgICAgYWN0dWFsVHlwZXMgPSBbXTsKICAgICAgaW5mZXJyZWRTcHJlYWRUeXBlcyA9IG5ldyBNYXA8VHJlZU5vZGUsIERhcnRUeXBlPi5pZGVudGl0eSgpOwogICAgfQogICAgaWYgKGluZmVyZW5jZU5lZWRlZCkgewogICAgICBpbmZlcnJlZFR5cGVzID0gW2NvbnN0IFVua25vd25UeXBlKCldOwogICAgICBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQuaW5mZXJHZW5lcmljRnVuY3Rpb25PclR5cGUoc2V0VHlwZSwKICAgICAgICAgIHNldENsYXNzLnR5cGVQYXJhbWV0ZXJzLCBudWxsLCBudWxsLCB0eXBlQ29udGV4dCwgaW5mZXJyZWRUeXBlcywKICAgICAgICAgIGlzQ29uc3Q6IG5vZGUuaXNDb25zdCk7CiAgICAgIGluZmVycmVkVHlwZUFyZ3VtZW50ID0gaW5mZXJyZWRUeXBlc1swXTsKICAgIH0gZWxzZSB7CiAgICAgIGluZmVycmVkVHlwZUFyZ3VtZW50ID0gbm9kZS50eXBlQXJndW1lbnQ7CiAgICB9CiAgICBpZiAoaW5mZXJlbmNlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQpIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLmV4cHJlc3Npb25zLmxlbmd0aDsgKytpKSB7CiAgICAgICAgRGFydFR5cGUgdHlwZSA9IGluZmVyRWxlbWVudCgKICAgICAgICAgICAgbm9kZS5leHByZXNzaW9uc1tpXSwKICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgaW5mZXJyZWRUeXBlQXJndW1lbnQsCiAgICAgICAgICAgIGluZmVycmVkU3ByZWFkVHlwZXMsCiAgICAgICAgICAgIGluZmVyZW5jZU5lZWRlZCwKICAgICAgICAgICAgdHlwZUNoZWNrc05lZWRlZCk7CiAgICAgICAgYWN0dWFsVHlwZXMuYWRkKHR5cGUpOwogICAgICAgIGlmIChpbmZlcmVuY2VOZWVkZWQpIHsKICAgICAgICAgIGZvcm1hbFR5cGVzLmFkZChzZXRUeXBlLnR5cGVBcmd1bWVudHNbMF0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGluZmVyZW5jZU5lZWRlZCkgewogICAgICBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQuaW5mZXJHZW5lcmljRnVuY3Rpb25PclR5cGUoCiAgICAgICAgICBzZXRUeXBlLAogICAgICAgICAgc2V0Q2xhc3MudHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICBmb3JtYWxUeXBlcywKICAgICAgICAgIGFjdHVhbFR5cGVzLAogICAgICAgICAgdHlwZUNvbnRleHQsCiAgICAgICAgICBpbmZlcnJlZFR5cGVzKTsKICAgICAgaW5mZXJyZWRUeXBlQXJndW1lbnQgPSBpbmZlcnJlZFR5cGVzWzBdOwogICAgICBpbmZlcnJlci5pbnN0cnVtZW50YXRpb24/LnJlY29yZCgKICAgICAgICAgIGluZmVycmVyLnVyaSwKICAgICAgICAgIG5vZGUuZmlsZU9mZnNldCwKICAgICAgICAgICd0eXBlQXJncycsCiAgICAgICAgICBuZXcgSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JUeXBlQXJncyhbaW5mZXJyZWRUeXBlQXJndW1lbnRdKSk7CiAgICAgIG5vZGUudHlwZUFyZ3VtZW50ID0gaW5mZXJyZWRUeXBlQXJndW1lbnQ7CiAgICB9CiAgICBpZiAodHlwZUNoZWNrc05lZWRlZCkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGUuZXhwcmVzc2lvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBjaGVja0VsZW1lbnQoCiAgICAgICAgICAgIG5vZGUuZXhwcmVzc2lvbnNbaV0sIG5vZGUsIG5vZGUudHlwZUFyZ3VtZW50LCBpbmZlcnJlZFNwcmVhZFR5cGVzKTsKICAgICAgfQogICAgfQogICAgbm9kZS5pbmZlcnJlZFR5cGUgPSBuZXcgSW50ZXJmYWNlVHlwZShzZXRDbGFzcywgW2luZmVycmVkVHlwZUFyZ3VtZW50XSk7CiAgICBpZiAoIWluZmVycmVyLmlzVG9wTGV2ZWwpIHsKICAgICAgS2VybmVsTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGluZmVycmVyLmxpYnJhcnk7CiAgICAgIGlmIChpbmZlcmVuY2VOZWVkZWQpIHsKICAgICAgICBsaWJyYXJ5LmNoZWNrQm91bmRzSW5TZXRMaXRlcmFsKG5vZGUsIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudCwKICAgICAgICAgICAgaW5mZXJyZWQ6IHRydWUpOwogICAgICB9CgogICAgICBpZiAoIWxpYnJhcnkubG9hZGVyLnRhcmdldC5iYWNrZW5kVGFyZ2V0LnN1cHBvcnRzU2V0TGl0ZXJhbHMpIHsKICAgICAgICBpbmZlcnJlci5oZWxwZXIudHJhbnNmb3JtU2V0TGl0ZXJhbHMgPSB0cnVlOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHZpc2l0U3RhdGljQXNzaWdubWVudEp1ZGdtZW50KAogICAgICBTdGF0aWNBc3NpZ25tZW50SnVkZ21lbnQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIERhcnRUeXBlIHJlYWRUeXBlID0gY29uc3QgRHluYW1pY1R5cGUoKTsgLy8gT25seSB1c2VkIGluIGVycm9yIHJlY292ZXJ5CiAgICB2YXIgcmVhZCA9IG5vZGUucmVhZDsKICAgIGlmIChyZWFkIGlzIFN0YXRpY0dldCkgewogICAgICByZWFkVHlwZSA9IHJlYWQudGFyZ2V0LmdldHRlclR5cGU7CiAgICAgIG5vZGUuX3N0b3JlTGV0VHlwZShpbmZlcnJlciwgcmVhZCwgcmVhZFR5cGUpOwogICAgfQogICAgTWVtYmVyIHdyaXRlTWVtYmVyOwogICAgRGFydFR5cGUgd3JpdGVDb250ZXh0ID0gY29uc3QgVW5rbm93blR5cGUoKTsKICAgIHZhciB3cml0ZSA9IG5vZGUud3JpdGU7CiAgICBpZiAod3JpdGUgaXMgU3RhdGljU2V0KSB7CiAgICAgIHdyaXRlQ29udGV4dCA9IHdyaXRlLnRhcmdldC5zZXR0ZXJUeXBlOwogICAgICB3cml0ZU1lbWJlciA9IHdyaXRlLnRhcmdldDsKICAgICAgVHlwZUluZmVyZW5jZUVuZ2luZS5yZXNvbHZlSW5mZXJlbmNlTm9kZSh3cml0ZU1lbWJlcik7CiAgICB9CiAgICBub2RlLl9pbmZlclJocyhpbmZlcnJlciwgcmVhZFR5cGUsIHdyaXRlQ29udGV4dCk7CiAgICBub2RlLl9yZXBsYWNlV2l0aERlc3VnYXJlZCgpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RhdGljR2V0KFN0YXRpY0dldCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgdmFyIHRhcmdldCA9IG5vZGUudGFyZ2V0OwogICAgVHlwZUluZmVyZW5jZUVuZ2luZS5yZXNvbHZlSW5mZXJlbmNlTm9kZSh0YXJnZXQpOwogICAgdmFyIHR5cGUgPSB0YXJnZXQuZ2V0dGVyVHlwZTsKICAgIGlmICh0YXJnZXQgaXMgUHJvY2VkdXJlICYmIHRhcmdldC5raW5kID09IFByb2NlZHVyZUtpbmQuTWV0aG9kKSB7CiAgICAgIHR5cGUgPSBpbmZlcnJlci5pbnN0YW50aWF0ZVRlYXJPZmYodHlwZSwgdHlwZUNvbnRleHQsIG5vZGUpOwogICAgfQogICAgaW5mZXJyZXIuc3RvcmVJbmZlcnJlZFR5cGUobm9kZSwgdHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RhdGljSW52b2NhdGlvbihTdGF0aWNJbnZvY2F0aW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBGdW5jdGlvblR5cGUgY2FsbGVlVHlwZSA9IG5vZGUudGFyZ2V0ICE9IG51bGwKICAgICAgICA/IG5vZGUudGFyZ2V0LmZ1bmN0aW9uLmZ1bmN0aW9uVHlwZQogICAgICAgIDogbmV3IEZ1bmN0aW9uVHlwZShbXSwgY29uc3QgRHluYW1pY1R5cGUoKSk7CiAgICBib29sIGhhZEV4cGxpY2l0VHlwZUFyZ3VtZW50cyA9CiAgICAgICAgZ2V0RXhwbGljaXRUeXBlQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKSAhPSBudWxsOwogICAgdmFyIGluZmVyZW5jZVJlc3VsdCA9IGluZmVycmVyLmluZmVySW52b2NhdGlvbih0eXBlQ29udGV4dCwgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgIGNhbGxlZVR5cGUsIGNhbGxlZVR5cGUucmV0dXJuVHlwZSwgbm9kZS5hcmd1bWVudHMpOwogICAgaW5mZXJyZXIuc3RvcmVJbmZlcnJlZFR5cGUobm9kZSwgaW5mZXJlbmNlUmVzdWx0LnR5cGUpOwogICAgaWYgKCFoYWRFeHBsaWNpdFR5cGVBcmd1bWVudHMgJiYgbm9kZS50YXJnZXQgIT0gbnVsbCkgewogICAgICBpbmZlcnJlci5saWJyYXJ5Py5jaGVja0JvdW5kc0luU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgIG5vZGUsIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudCwKICAgICAgICAgIGluZmVycmVkOiB0cnVlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKAogICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBpZiAoIWluZmVycmVyLmlzVG9wTGV2ZWwpIHsKICAgICAgZm9yICh2YXIgZXhwcmVzc2lvbiBpbiBub2RlLmV4cHJlc3Npb25zKSB7CiAgICAgICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgICAgICBleHByZXNzaW9uLCBjb25zdCBVbmtub3duVHlwZSgpLCAhaW5mZXJyZXIuaXNUb3BMZXZlbCk7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdHJpbmdMaXRlcmFsKFN0cmluZ0xpdGVyYWwgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHt9CgogIHZvaWQgdmlzaXRTdXBlckluaXRpYWxpemVySnVkZ21lbnQoU3VwZXJJbml0aWFsaXplckp1ZGdtZW50IG5vZGUpIHsKICAgIHZhciBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbVN1cGVydHlwZShpbmZlcnJlci5jbGFzc0hpZXJhcmNoeQogICAgICAgIC5nZXRDbGFzc0FzSW5zdGFuY2VPZigKICAgICAgICAgICAgaW5mZXJyZXIudGhpc1R5cGUuY2xhc3NOb2RlLCBub2RlLnRhcmdldC5lbmNsb3NpbmdDbGFzcykpOwogICAgaW5mZXJyZXIuaW5mZXJJbnZvY2F0aW9uKAogICAgICAgIG51bGwsCiAgICAgICAgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZSgKICAgICAgICAgICAgbm9kZS50YXJnZXQuZnVuY3Rpb24uZnVuY3Rpb25UeXBlLndpdGhvdXRUeXBlUGFyYW1ldGVycyksCiAgICAgICAgaW5mZXJyZXIudGhpc1R5cGUsCiAgICAgICAgbm9kZS5hcmd1bWVudEp1ZGdtZW50cywKICAgICAgICBza2lwVHlwZUFyZ3VtZW50SW5mZXJlbmNlOiB0cnVlKTsKICB9CgogIHZvaWQgdmlzaXRTdXBlck1ldGhvZEludm9jYXRpb25KdWRnbWVudCgKICAgICAgU3VwZXJNZXRob2RJbnZvY2F0aW9uSnVkZ21lbnQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIGlmIChub2RlLmludGVyZmFjZVRhcmdldCAhPSBudWxsKSB7CiAgICAgIGluZmVycmVyLmluc3RydW1lbnRhdGlvbj8ucmVjb3JkKGluZmVycmVyLnVyaSwgbm9kZS5maWxlT2Zmc2V0LCAndGFyZ2V0JywKICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvck1lbWJlcihub2RlLmludGVyZmFjZVRhcmdldCkpOwogICAgfQogICAgdmFyIGluZmVyZW5jZVJlc3VsdCA9IGluZmVycmVyLmluZmVyTWV0aG9kSW52b2NhdGlvbigKICAgICAgICBub2RlLCBudWxsLCBub2RlLmZpbGVPZmZzZXQsIGZhbHNlLCB0eXBlQ29udGV4dCwKICAgICAgICBpbnRlcmZhY2VNZW1iZXI6IG5vZGUuaW50ZXJmYWNlVGFyZ2V0LAogICAgICAgIG1ldGhvZE5hbWU6IG5vZGUubmFtZSwKICAgICAgICBhcmd1bWVudHM6IG5vZGUuYXJndW1lbnRzKTsKICAgIG5vZGUuaW5mZXJyZWRUeXBlID0gaW5mZXJlbmNlUmVzdWx0LnR5cGU7CiAgfQoKICB2b2lkIHZpc2l0U3VwZXJQcm9wZXJ0eUdldEp1ZGdtZW50KAogICAgICBTdXBlclByb3BlcnR5R2V0SnVkZ21lbnQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIGlmIChub2RlLmludGVyZmFjZVRhcmdldCAhPSBudWxsKSB7CiAgICAgIGluZmVycmVyLmluc3RydW1lbnRhdGlvbj8ucmVjb3JkKGluZmVycmVyLnVyaSwgbm9kZS5maWxlT2Zmc2V0LCAndGFyZ2V0JywKICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvck1lbWJlcihub2RlLmludGVyZmFjZVRhcmdldCkpOwogICAgfQogICAgaW5mZXJyZXIuaW5mZXJQcm9wZXJ0eUdldChub2RlLCBudWxsLCBub2RlLmZpbGVPZmZzZXQsIHR5cGVDb250ZXh0LAogICAgICAgIGludGVyZmFjZU1lbWJlcjogbm9kZS5pbnRlcmZhY2VUYXJnZXQsIHByb3BlcnR5TmFtZTogbm9kZS5uYW1lKTsKICB9CgogIHZvaWQgdmlzaXRTd2l0Y2hTdGF0ZW1lbnRKdWRnbWVudChTd2l0Y2hTdGF0ZW1lbnRKdWRnbWVudCBub2RlKSB7CiAgICB2YXIgZXhwcmVzc2lvbkp1ZGdtZW50ID0gbm9kZS5leHByZXNzaW9uSnVkZ21lbnQ7CiAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oZXhwcmVzc2lvbkp1ZGdtZW50LCBjb25zdCBVbmtub3duVHlwZSgpLCB0cnVlKTsKICAgIHZhciBleHByZXNzaW9uVHlwZSA9IGdldEluZmVycmVkVHlwZShleHByZXNzaW9uSnVkZ21lbnQsIGluZmVycmVyKTsKCiAgICBmb3IgKHZhciBzd2l0Y2hDYXNlIGluIG5vZGUuY2FzZUp1ZGdtZW50cykgewogICAgICBmb3IgKHZhciBjYXNlRXhwcmVzc2lvbiBpbiBzd2l0Y2hDYXNlLmV4cHJlc3Npb25KdWRnbWVudHMpIHsKICAgICAgICBEYXJ0VHlwZSBjYXNlRXhwcmVzc2lvblR5cGUgPQogICAgICAgICAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oY2FzZUV4cHJlc3Npb24sIGV4cHJlc3Npb25UeXBlLCB0cnVlKTsKCiAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgZXhwcmVzc2lvbiB0eXBlIGlzIGFzc2lnbmFibGUgdG8gdGhlIGNhc2UgZXhwcmVzc2lvbiB0eXBlLgogICAgICAgIGlmICghaW5mZXJyZXIuaXNBc3NpZ25hYmxlKGV4cHJlc3Npb25UeXBlLCBjYXNlRXhwcmVzc2lvblR5cGUpKSB7CiAgICAgICAgICBpbmZlcnJlci5oZWxwZXIuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICB0ZW1wbGF0ZVN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25UeXBlLCBjYXNlRXhwcmVzc2lvblR5cGUpLAogICAgICAgICAgICAgIGNhc2VFeHByZXNzaW9uLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgICAgICAgY29udGV4dDogWwogICAgICAgICAgICAgICAgbWVzc2FnZVN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlQ2F1c2Uud2l0aExvY2F0aW9uKAogICAgICAgICAgICAgICAgICAgIGluZmVycmVyLnVyaSwgZXhwcmVzc2lvbkp1ZGdtZW50LmZpbGVPZmZzZXQsIG5vTGVuZ3RoKQogICAgICAgICAgICAgIF0pOwogICAgICAgIH0KICAgICAgfQogICAgICBpbmZlcnJlci5pbmZlclN0YXRlbWVudChzd2l0Y2hDYXNlLmJvZHkpOwogICAgfQogIH0KCiAgdm9pZCB2aXNpdFN5bWJvbExpdGVyYWxKdWRnbWVudCgKICAgICAgU3ltYm9sTGl0ZXJhbEp1ZGdtZW50IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBub2RlLmluZmVycmVkVHlwZSA9IGluZmVycmVyLmNvcmVUeXBlcy5zeW1ib2xDbGFzcy5yYXdUeXBlOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIHZpc2l0SW52YWxpZENvbnN0cnVjdG9ySW52b2NhdGlvbkp1ZGdtZW50KAogICAgICBJbnZhbGlkQ29uc3RydWN0b3JJbnZvY2F0aW9uSnVkZ21lbnQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIEZ1bmN0aW9uVHlwZSBjYWxsZWVUeXBlOwogICAgRGFydFR5cGUgcmV0dXJuVHlwZTsKICAgIGlmIChub2RlLmNvbnN0cnVjdG9yICE9IG51bGwpIHsKICAgICAgY2FsbGVlVHlwZSA9IG5vZGUuY29uc3RydWN0b3IuZnVuY3Rpb24uZnVuY3Rpb25UeXBlOwogICAgICByZXR1cm5UeXBlID0gY29tcHV0ZUNvbnN0cnVjdG9yUmV0dXJuVHlwZShub2RlLmNvbnN0cnVjdG9yKTsKICAgIH0gZWxzZSB7CiAgICAgIGNhbGxlZVR5cGUgPSBuZXcgRnVuY3Rpb25UeXBlKFtdLCBjb25zdCBEeW5hbWljVHlwZSgpKTsKICAgICAgcmV0dXJuVHlwZSA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICB9CiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGluZmVyZW5jZVJlc3VsdCA9IGluZmVycmVyLmluZmVySW52b2NhdGlvbigKICAgICAgICB0eXBlQ29udGV4dCwKICAgICAgICBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgY2FsbGVlVHlwZSwKICAgICAgICByZXR1cm5UeXBlLAogICAgICAgIG5vZGUuYXJndW1lbnRKdWRnbWVudHMpOwogICAgbm9kZS5pbmZlcnJlZFR5cGUgPSBpbmZlcmVuY2VSZXN1bHQudHlwZTsKICAgIHJldHVybiB2aXNpdFN5bnRoZXRpY0V4cHJlc3Npb25KdWRnbWVudChub2RlLCB0eXBlQ29udGV4dCk7CiAgfQoKICB2b2lkIHZpc2l0SW52YWxpZFdyaXRlSnVkZ21lbnQoCiAgICAgIEludmFsaWRXcml0ZUp1ZGdtZW50IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICAvLyBXaGVuIGEgY29tcG91bmQgYXNzaWdubWVudCwgdGhlIGV4cHJlc3Npb24gaXMgYWxyZWFkeSB3cmFwcGluZyBpbgogICAgLy8gVmFyaWFibGVEZWNsYXJhdGlvbiBpbiBfbWFrZVJlYWQoKS4gT3RoZXJ3aXNlLCB0ZW1wb3JhcnkgYXNzb2NpYXRlCiAgICAvLyB0aGUgZXhwcmVzc2lvbiB3aXRoIHRoaXMgbm9kZS4KICAgIG5vZGUuZXhwcmVzc2lvbi5wYXJlbnQgPz89IG5vZGU7CgogICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgIG5vZGUuZXhwcmVzc2lvbiwgY29uc3QgVW5rbm93blR5cGUoKSwgIWluZmVycmVyLmlzVG9wTGV2ZWwpOwogICAgcmV0dXJuIHZpc2l0U3ludGhldGljRXhwcmVzc2lvbkp1ZGdtZW50KG5vZGUsIHR5cGVDb250ZXh0KTsKICB9CgogIHZvaWQgdmlzaXRTeW50aGV0aWNFeHByZXNzaW9uSnVkZ21lbnQoCiAgICAgIFN5bnRoZXRpY0V4cHJlc3Npb25KdWRnbWVudCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgbm9kZS5fcmVwbGFjZVdpdGhEZXN1Z2FyZWQoKTsKICAgIG5vZGUuaW5mZXJyZWRUeXBlID0gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCB2aXNpdFRoaXNFeHByZXNzaW9uKFRoaXNFeHByZXNzaW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VGhyb3coVGhyb3cgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICBub2RlLmV4cHJlc3Npb24sIGNvbnN0IFVua25vd25UeXBlKCksICFpbmZlcnJlci5pc1RvcExldmVsKTsKICB9CgogIHZvaWQgdmlzaXRDYXRjaEp1ZGdtZW50KENhdGNoSnVkZ21lbnQgbm9kZSkgewogICAgaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQobm9kZS5ib2R5KTsKICB9CgogIHZvaWQgdmlzaXRUcnlDYXRjaEp1ZGdtZW50KFRyeUNhdGNoSnVkZ21lbnQgbm9kZSkgewogICAgaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQobm9kZS5ib2R5KTsKICAgIGZvciAodmFyIGNhdGNoXyBpbiBub2RlLmNhdGNoSnVkZ21lbnRzKSB7CiAgICAgIHZpc2l0Q2F0Y2hKdWRnbWVudChjYXRjaF8pOwogICAgfQogIH0KCiAgdm9pZCB2aXNpdFRyeUZpbmFsbHlKdWRnbWVudChUcnlGaW5hbGx5SnVkZ21lbnQgbm9kZSkgewogICAgaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQobm9kZS5ib2R5KTsKICAgIGluZmVycmVyLmluZmVyU3RhdGVtZW50KG5vZGUuZmluYWxpemVyKTsKICB9CgogIHZvaWQgdmlzaXRUeXBlTGl0ZXJhbEp1ZGdtZW50KAogICAgICBUeXBlTGl0ZXJhbEp1ZGdtZW50IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBub2RlLmluZmVycmVkVHlwZSA9IGluZmVycmVyLmNvcmVUeXBlcy50eXBlQ2xhc3MucmF3VHlwZTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCB2aXNpdFZhcmlhYmxlQXNzaWdubWVudEp1ZGdtZW50KAogICAgICBWYXJpYWJsZUFzc2lnbm1lbnRKdWRnbWVudCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgRGFydFR5cGUgcmVhZFR5cGU7CiAgICB2YXIgcmVhZCA9IG5vZGUucmVhZDsKICAgIGlmIChyZWFkIGlzIFZhcmlhYmxlR2V0KSB7CiAgICAgIHJlYWRUeXBlID0gcmVhZC5wcm9tb3RlZFR5cGUgPz8gcmVhZC52YXJpYWJsZS50eXBlOwogICAgfQogICAgRGFydFR5cGUgd3JpdGVDb250ZXh0ID0gY29uc3QgVW5rbm93blR5cGUoKTsKICAgIHZhciB3cml0ZSA9IG5vZGUud3JpdGU7CiAgICBpZiAod3JpdGUgaXMgVmFyaWFibGVTZXQpIHsKICAgICAgd3JpdGVDb250ZXh0ID0gd3JpdGUudmFyaWFibGUudHlwZTsKICAgICAgaWYgKHJlYWQgIT0gbnVsbCkgewogICAgICAgIG5vZGUuX3N0b3JlTGV0VHlwZShpbmZlcnJlciwgcmVhZCwgd3JpdGVDb250ZXh0KTsKICAgICAgfQogICAgfQogICAgbm9kZS5faW5mZXJSaHMoaW5mZXJyZXIsIHJlYWRUeXBlLCB3cml0ZUNvbnRleHQpOwogICAgbm9kZS5fcmVwbGFjZVdpdGhEZXN1Z2FyZWQoKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudChWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQgbm9kZSkgewogICAgdmFyIGluaXRpYWxpemVySnVkZ21lbnQgPSBub2RlLmluaXRpYWxpemVySnVkZ21lbnQ7CiAgICB2YXIgZGVjbGFyZWRUeXBlID0gbm9kZS5faW1wbGljaXRseVR5cGVkID8gY29uc3QgVW5rbm93blR5cGUoKSA6IG5vZGUudHlwZTsKICAgIERhcnRUeXBlIGluZmVycmVkVHlwZTsKICAgIERhcnRUeXBlIGluaXRpYWxpemVyVHlwZTsKICAgIGlmIChpbml0aWFsaXplckp1ZGdtZW50ICE9IG51bGwpIHsKICAgICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKGluaXRpYWxpemVySnVkZ21lbnQsIGRlY2xhcmVkVHlwZSwKICAgICAgICAgICFpbmZlcnJlci5pc1RvcExldmVsIHx8IG5vZGUuX2ltcGxpY2l0bHlUeXBlZCwKICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgICBpbml0aWFsaXplclR5cGUgPSBnZXRJbmZlcnJlZFR5cGUoaW5pdGlhbGl6ZXJKdWRnbWVudCwgaW5mZXJyZXIpOwogICAgICBpbmZlcnJlZFR5cGUgPSBpbmZlcnJlci5pbmZlckRlY2xhcmF0aW9uVHlwZShpbml0aWFsaXplclR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgaW5mZXJyZWRUeXBlID0gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIH0KICAgIGlmIChub2RlLl9pbXBsaWNpdGx5VHlwZWQpIHsKICAgICAgaW5mZXJyZXIuaW5zdHJ1bWVudGF0aW9uPy5yZWNvcmQoaW5mZXJyZXIudXJpLCBub2RlLmZpbGVPZmZzZXQsICd0eXBlJywKICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGUoaW5mZXJyZWRUeXBlKSk7CiAgICAgIG5vZGUudHlwZSA9IGluZmVycmVkVHlwZTsKICAgIH0KICAgIGlmIChub2RlLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgdmFyIHJlcGxhY2VkSW5pdGlhbGl6ZXIgPSBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKAogICAgICAgICAgbm9kZS50eXBlLCBpbml0aWFsaXplclR5cGUsIG5vZGUuaW5pdGlhbGl6ZXIsIG5vZGUuZmlsZU9mZnNldCwKICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IG5vZGUudHlwZSBpcyBWb2lkVHlwZSk7CiAgICAgIGlmIChyZXBsYWNlZEluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgICBub2RlLmluaXRpYWxpemVyID0gcmVwbGFjZWRJbml0aWFsaXplcjsKICAgICAgfQogICAgfQogICAgaWYgKCFpbmZlcnJlci5pc1RvcExldmVsKSB7CiAgICAgIEtlcm5lbExpYnJhcnlCdWlsZGVyIGxpYnJhcnkgPSBpbmZlcnJlci5saWJyYXJ5OwogICAgICBpZiAobm9kZS5faW1wbGljaXRseVR5cGVkKSB7CiAgICAgICAgbGlicmFyeS5jaGVja0JvdW5kc0luVmFyaWFibGVEZWNsYXJhdGlvbigKICAgICAgICAgICAgbm9kZSwgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LAogICAgICAgICAgICBpbmZlcnJlZDogdHJ1ZSk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgdmlzaXRVbnJlc29sdmVkVGFyZ2V0SW52b2NhdGlvbkp1ZGdtZW50KAogICAgICBVbnJlc29sdmVkVGFyZ2V0SW52b2NhdGlvbkp1ZGdtZW50IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICB2YXIgcmVzdWx0ID0gdmlzaXRTeW50aGV0aWNFeHByZXNzaW9uSnVkZ21lbnQobm9kZSwgdHlwZUNvbnRleHQpOwogICAgaW5mZXJyZXIuaW5mZXJJbnZvY2F0aW9uKAogICAgICAgIHR5cGVDb250ZXh0LAogICAgICAgIG5vZGUuZmlsZU9mZnNldCwKICAgICAgICBUeXBlSW5mZXJyZXJJbXBsLnVua25vd25GdW5jdGlvbiwKICAgICAgICBjb25zdCBEeW5hbWljVHlwZSgpLAogICAgICAgIG5vZGUuYXJndW1lbnRzSnVkZ21lbnQpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgdmlzaXRVbnJlc29sdmVkVmFyaWFibGVBc3NpZ25tZW50SnVkZ21lbnQoCiAgICAgIFVucmVzb2x2ZWRWYXJpYWJsZUFzc2lnbm1lbnRKdWRnbWVudCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKG5vZGUucmhzLCBjb25zdCBVbmtub3duVHlwZSgpLCB0cnVlKTsKICAgIG5vZGUuaW5mZXJyZWRUeXBlID0gbm9kZS5pc0NvbXBvdW5kCiAgICAgICAgPyBjb25zdCBEeW5hbWljVHlwZSgpCiAgICAgICAgOiBnZXRJbmZlcnJlZFR5cGUobm9kZS5yaHMsIGluZmVycmVyKTsKICAgIHJldHVybiB2aXNpdFN5bnRoZXRpY0V4cHJlc3Npb25KdWRnbWVudChub2RlLCB0eXBlQ29udGV4dCk7CiAgfQoKICB2b2lkIHZpc2l0VmFyaWFibGVHZXRKdWRnbWVudCgKICAgICAgVmFyaWFibGVHZXRKdWRnbWVudCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50IHZhcmlhYmxlID0gbm9kZS52YXJpYWJsZTsKICAgIGJvb2wgbXV0YXRlZEluQ2xvc3VyZSA9IHZhcmlhYmxlLl9tdXRhdGVkSW5DbG9zdXJlOwogICAgRGFydFR5cGUgZGVjbGFyZWRPckluZmVycmVkVHlwZSA9IHZhcmlhYmxlLnR5cGU7CgogICAgRGFydFR5cGUgcHJvbW90ZWRUeXBlID0gaW5mZXJyZXIudHlwZVByb21vdGVyCiAgICAgICAgLmNvbXB1dGVQcm9tb3RlZFR5cGUobm9kZS5fZmFjdCwgbm9kZS5fc2NvcGUsIG11dGF0ZWRJbkNsb3N1cmUpOwogICAgaWYgKHByb21vdGVkVHlwZSAhPSBudWxsKSB7CiAgICAgIGluZmVycmVyLmluc3RydW1lbnRhdGlvbj8ucmVjb3JkKGluZmVycmVyLnVyaSwgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgICAgJ3Byb21vdGVkVHlwZScsIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGUocHJvbW90ZWRUeXBlKSk7CiAgICB9CiAgICBub2RlLnByb21vdGVkVHlwZSA9IHByb21vdGVkVHlwZTsKICAgIHZhciB0eXBlID0gcHJvbW90ZWRUeXBlID8/IGRlY2xhcmVkT3JJbmZlcnJlZFR5cGU7CiAgICBpZiAodmFyaWFibGUuX2lzTG9jYWxGdW5jdGlvbikgewogICAgICB0eXBlID0gaW5mZXJyZXIuaW5zdGFudGlhdGVUZWFyT2ZmKHR5cGUsIHR5cGVDb250ZXh0LCBub2RlKTsKICAgIH0KICAgIG5vZGUuaW5mZXJyZWRUeXBlID0gdHlwZTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCB2aXNpdFdoaWxlSnVkZ21lbnQoV2hpbGVKdWRnbWVudCBub2RlKSB7CiAgICB2YXIgY29uZGl0aW9uSnVkZ21lbnQgPSBub2RlLmNvbmRpdGlvbkp1ZGdtZW50OwogICAgdmFyIGV4cGVjdGVkVHlwZSA9IGluZmVycmVyLmNvcmVUeXBlcy5ib29sQ2xhc3MucmF3VHlwZTsKICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICBjb25kaXRpb25KdWRnbWVudCwgZXhwZWN0ZWRUeXBlLCAhaW5mZXJyZXIuaXNUb3BMZXZlbCk7CiAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKAogICAgICAgIGV4cGVjdGVkVHlwZSwKICAgICAgICBnZXRJbmZlcnJlZFR5cGUoY29uZGl0aW9uSnVkZ21lbnQsIGluZmVycmVyKSwKICAgICAgICBub2RlLmNvbmRpdGlvbiwKICAgICAgICBub2RlLmNvbmRpdGlvbi5maWxlT2Zmc2V0KTsKICAgIGluZmVycmVyLmluZmVyU3RhdGVtZW50KG5vZGUuYm9keSk7CiAgfQoKICB2b2lkIHZpc2l0WWllbGRKdWRnbWVudChZaWVsZEp1ZGdtZW50IG5vZGUpIHsKICAgIHZhciBqdWRnbWVudCA9IG5vZGUuanVkZ21lbnQ7CiAgICB2YXIgY2xvc3VyZUNvbnRleHQgPSBpbmZlcnJlci5jbG9zdXJlQ29udGV4dDsKICAgIGlmIChjbG9zdXJlQ29udGV4dC5pc0dlbmVyYXRvcikgewogICAgICB2YXIgdHlwZUNvbnRleHQgPSBjbG9zdXJlQ29udGV4dC5yZXR1cm5PcllpZWxkQ29udGV4dDsKICAgICAgaWYgKG5vZGUuaXNZaWVsZFN0YXIgJiYgdHlwZUNvbnRleHQgIT0gbnVsbCkgewogICAgICAgIHR5cGVDb250ZXh0ID0gaW5mZXJyZXIud3JhcFR5cGUoCiAgICAgICAgICAgIHR5cGVDb250ZXh0LAogICAgICAgICAgICBjbG9zdXJlQ29udGV4dC5pc0FzeW5jCiAgICAgICAgICAgICAgICA/IGluZmVycmVyLmNvcmVUeXBlcy5zdHJlYW1DbGFzcwogICAgICAgICAgICAgICAgOiBpbmZlcnJlci5jb3JlVHlwZXMuaXRlcmFibGVDbGFzcyk7CiAgICAgIH0KICAgICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKGp1ZGdtZW50LCB0eXBlQ29udGV4dCwgdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oanVkZ21lbnQsIGNvbnN0IFVua25vd25UeXBlKCksIHRydWUpOwogICAgfQogICAgY2xvc3VyZUNvbnRleHQuaGFuZGxlWWllbGQoaW5mZXJyZXIsIG5vZGUuaXNZaWVsZFN0YXIsCiAgICAgICAgZ2V0SW5mZXJyZWRUeXBlKGp1ZGdtZW50LCBpbmZlcnJlciksIG5vZGUuZXhwcmVzc2lvbiwgbm9kZS5maWxlT2Zmc2V0KTsKICB9CgogIHZvaWQgdmlzaXRMb2FkTGlicmFyeUp1ZGdtZW50KAogICAgICBMb2FkTGlicmFyeUp1ZGdtZW50IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBub2RlLmluZmVycmVkVHlwZSA9CiAgICAgICAgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LmZ1dHVyZVR5cGUoY29uc3QgRHluYW1pY1R5cGUoKSk7CiAgICBpZiAobm9kZS5hcmd1bWVudHMgIT0gbnVsbCkgewogICAgICB2YXIgY2FsbGVlVHlwZSA9IG5ldyBGdW5jdGlvblR5cGUoW10sIG5vZGUuaW5mZXJyZWRUeXBlKTsKICAgICAgaW5mZXJyZXIuaW5mZXJJbnZvY2F0aW9uKHR5cGVDb250ZXh0LCBub2RlLmZpbGVPZmZzZXQsIGNhbGxlZVR5cGUsCiAgICAgICAgICBjYWxsZWVUeXBlLnJldHVyblR5cGUsIG5vZGUuYXJndW1lbnRKdWRnbWVudHMpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIHZpc2l0TG9hZExpYnJhcnlUZWFyT2ZmSnVkZ21lbnQoCiAgICAgIExvYWRMaWJyYXJ5VGVhck9mZkp1ZGdtZW50IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBub2RlLmluZmVycmVkVHlwZSA9IG5ldyBGdW5jdGlvblR5cGUoCiAgICAgICAgW10sIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC5mdXR1cmVUeXBlKGNvbnN0IER5bmFtaWNUeXBlKCkpKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENoZWNrTGlicmFyeUlzTG9hZGVkKAogICAg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dXJuIGV4cHJlc3Npb24uaW5mZXJyZWRUeXBlOwogIH0gZWxzZSB7CiAgICByZXR1cm4gZXhwcmVzc2lvbi5hY2NlcHQxKGNvbnN0IEluZmVycmVkVHlwZVZpc2l0b3IoKSwgaW5mZXJyZXIpOwogIH0KfQoKRGFydFR5cGUgaW52YWxpZFRvQm90dG9tKERhcnRUeXBlIHR5cGUpIHsKICAvLyBUT0RPKGFoZSk6IFRoaXMgc2hvdWxkIHJlYWxseSByZXR1cm4gW0JvdHRvbVR5cGVdLCBidXQgdGhhdCByZXF1aXJlcyBtb3JlCiAgLy8gd29yayB0byB0aGUgS2VybmVsIHR5cGUgc3lzdGVtIGFuZCBpbXBsZW1lbnRhdGlvbi4KICByZXR1cm4gKHR5cGUgPT0gbnVsbCB8fCB0eXBlIGlzIEludmFsaWRUeXBlKSA/IGNvbnN0IER5bmFtaWNUeXBlKCkgOiB0eXBlOwp9CgpEYXJ0VHlwZSBpbnZhbGlkVG9Ub3AoRGFydFR5cGUgdHlwZSkgewogIHJldHVybiAodHlwZSA9PSBudWxsIHx8IHR5cGUgaXMgSW52YWxpZFR5cGUpID8gY29uc3QgRHluYW1pY1R5cGUoKSA6IHR5cGU7Cn0KCmNsYXNzIEluZmVycmVkVHlwZVZpc2l0b3IKICAgIGV4dGVuZHMgRXhwcmVzc2lvblZpc2l0b3IxPERhcnRUeXBlLCBUeXBlSW5mZXJyZXJJbXBsPiB7CiAgY29uc3QgSW5mZXJyZWRUeXBlVmlzaXRvcigpOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBkZWZhdWx0RXhwcmVzc2lvbihFeHByZXNzaW9uIG5vZGUsIFR5cGVJbmZlcnJlckltcGwgaW5mZXJyZXIpIHsKICAgIHVuaGFuZGxlZCgiJHtub2RlLnJ1bnRpbWVUeXBlfSIsICJnZXRJbmZlcnJlZFR5cGUiLCBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgaW5mZXJyZXIudXJpKTsKICAgIHJldHVybiBjb25zdCBJbnZhbGlkVHlwZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRJbnRMaXRlcmFsKEludExpdGVyYWwgbm9kZSwgVHlwZUluZmVycmVySW1wbCBpbmZlcnJlcikgewogICAgcmV0dXJuIGluZmVycmVyLmNvcmVUeXBlcy5pbnRDbGFzcy5yYXdUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXREb3VibGVMaXRlcmFsKERvdWJsZUxpdGVyYWwgbm9kZSwgVHlwZUluZmVycmVySW1wbCBpbmZlcnJlcikgewogICAgcmV0dXJuIGluZmVycmVyLmNvcmVUeXBlcy5kb3VibGVDbGFzcy5yYXdUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRJbnZhbGlkRXhwcmVzc2lvbigKICAgICAgSW52YWxpZEV4cHJlc3Npb24gbm9kZSwgVHlwZUluZmVycmVySW1wbCBpbmZlcnJlcikgewogICAgcmV0dXJuIGNvbnN0IEJvdHRvbVR5cGUoKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0QXNFeHByZXNzaW9uKEFzRXhwcmVzc2lvbiBub2RlLCBUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyKSB7CiAgICByZXR1cm4gaW52YWxpZFRvQm90dG9tKG5vZGUudHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdEF3YWl0RXhwcmVzc2lvbigKICAgICAgQXdhaXRFeHByZXNzaW9uIG5vZGUsIFR5cGVJbmZlcnJlckltcGwgaW5mZXJyZXIpIHsKICAgIHJldHVybiBpbmZlcnJlci5yZWFkSW5mZXJyZWRUeXBlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRUaGlzRXhwcmVzc2lvbihUaGlzRXhwcmVzc2lvbiBub2RlLCBUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyKSB7CiAgICByZXR1cm4gaW52YWxpZFRvQm90dG9tKGluZmVycmVyLnRoaXNUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0Qm9vbExpdGVyYWwoQm9vbExpdGVyYWwgbm9kZSwgVHlwZUluZmVycmVySW1wbCBpbmZlcnJlcikgewogICAgcmV0dXJuIGluZmVycmVyLmNvcmVUeXBlcy5ib29sQ2xhc3MucmF3VHlwZTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uKAogICAgICBDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSwgVHlwZUluZmVycmVySW1wbCBpbmZlcnJlcikgewogICAgcmV0dXJuIG5vZGUuc3RhdGljVHlwZTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgICBDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSwgVHlwZUluZmVycmVySW1wbCBpbmZlcnJlcikgewogICAgcmV0dXJuIGluZmVycmVyLnJlYWRJbmZlcnJlZFR5cGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdElzRXhwcmVzc2lvbihJc0V4cHJlc3Npb24gbm9kZSwgVHlwZUluZmVycmVySW1wbCBpbmZlcnJlcikgewogICAgcmV0dXJuIGluZmVycmVyLmNvcmVUeXBlcy5ib29sQ2xhc3MucmF3VHlwZTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKAogICAgICBGdW5jdGlvbkV4cHJlc3Npb24gbm9kZSwgVHlwZUluZmVycmVySW1wbCBpbmZlcnJlcikgewogICAgcmV0dXJuIGluZmVycmVyLnJlYWRJbmZlcnJlZFR5cGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdExvZ2ljYWxFeHByZXNzaW9uKAogICAgICBMb2dpY2FsRXhwcmVzc2lvbiBub2RlLCBUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyKSB7CiAgICByZXR1cm4gaW5mZXJyZXIuY29yZVR5cGVzLmJvb2xDbGFzcy5yYXdUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXROb3QoTm90IG5vZGUsIFR5cGVJbmZlcnJlckltcGwgaW5mZXJyZXIpIHsKICAgIHJldHVybiBpbmZlcnJlci5jb3JlVHlwZXMuYm9vbENsYXNzLnJhd1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdE51bGxMaXRlcmFsKE51bGxMaXRlcmFsIG5vZGUsIFR5cGVJbmZlcnJlckltcGwgaW5mZXJyZXIpIHsKICAgIHJldHVybiBpbmZlcnJlci5jb3JlVHlwZXMubnVsbENsYXNzLnJhd1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdFByb3BlcnR5R2V0KFByb3BlcnR5R2V0IG5vZGUsIFR5cGVJbmZlcnJlckltcGwgaW5mZXJyZXIpIHsKICAgIHJldHVybiBpbmZlcnJlci5yZWFkSW5mZXJyZWRUeXBlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRSZXRocm93KFJldGhyb3cgbm9kZSwgVHlwZUluZmVycmVySW1wbCBpbmZlcnJlcikgewogICAgcmV0dXJuIGNvbnN0IEJvdHRvbVR5cGUoKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0U3RyaW5nQ29uY2F0ZW5hdGlvbigKICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlLCBUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyKSB7CiAgICByZXR1cm4gaW5mZXJyZXIuY29yZVR5cGVzLnN0cmluZ0NsYXNzLnJhd1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdFN0cmluZ0xpdGVyYWwoU3RyaW5nTGl0ZXJhbCBub2RlLCBUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyKSB7CiAgICByZXR1cm4gaW5mZXJyZXIuY29yZVR5cGVzLnN0cmluZ0NsYXNzLnJhd1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdExldChMZXQgbm9kZSwgVHlwZUluZmVycmVySW1wbCBpbmZlcnJlcikgewogICAgLy8gVE9ETyhhaGUpOiBXZSBzaG91bGQgYmUgYWJsZSB0byByZXR1cm4gdGhlIGluZmVycmVkIHR5cGUgb2YKICAgIC8vIG5vZGUuYm9keS4gSG93ZXZlciwgdGhhdCB0eXBlIG1heSBiZSBsb3N0LCBmb3IgZXhhbXBsZSwgaW4KICAgIC8vIFZhcmlhYmxlQXNzaWdubWVudEp1ZGdtZW50Ll9yZXBsYWNlV2l0aERlc3VnYXJlZC4KICAgIHJldHVybiBpbmZlcnJlci5yZWFkSW5mZXJyZWRUeXBlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRTdGF0aWNHZXQoU3RhdGljR2V0IG5vZGUsIFR5cGVJbmZlcnJlckltcGwgaW5mZXJyZXIpIHsKICAgIHJldHVybiBpbmZlcnJlci5yZWFkSW5mZXJyZWRUeXBlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKAogICAgICBTdGF0aWNJbnZvY2F0aW9uIG5vZGUsIFR5cGVJbmZlcnJlckltcGwgaW5mZXJyZXIpIHsKICAgIHJldHVybiBpbmZlcnJlci5yZWFkSW5mZXJyZWRUeXBlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRUaHJvdyhUaHJvdyBub2RlLCBUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyKSB7CiAgICByZXR1cm4gY29uc3QgQm90dG9tVHlwZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRDaGVja0xpYnJhcnlJc0xvYWRlZCgKICAgICAgQ2hlY2tMaWJyYXJ5SXNMb2FkZWQgbm9kZSwgVHlwZUluZmVycmVySW1wbCBpbmZlcnJlcikgewogICAgcmV0dXJuIGluZmVycmVyLmNvcmVUeXBlcy5vYmplY3RDbGFzcy5yYXdUeXBlOwogIH0KfQqApABOTjwBIgFNKiQLRgQCASpPOE0CASdNAgEaPR8BDEtJFyAEAQxJMAQBDE8zBAEMIzsfBAEMTScEAQwhOSwEAQxRLwQBDEsxBAEMJz8cBAEMJz8sBAEMTTEEAQwkPCwEAQwjOzEEAQw7MQQBDEsxBAEMSywEAQxDHwQBDCU9MwQBDE8zBAEMO0NCOSwEAQxHLAQBDCI6LAQBDD8fBAEMJj4zBAIBPXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvaW5mZXJyZWRfdHlwZV92aXNpdG9yLmRhcnQ5c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvYnVpbGRlci5kYXJ0h3YvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5idWlsZGVyOwoKZXhwb3J0ICcuLi9pZGVudGlmaWVycy5kYXJ0JwogICAgc2hvdwogICAgICAgIElkZW50aWZpZXIsCiAgICAgICAgSW5pdGlhbGl6ZWRJZGVudGlmaWVyLAogICAgICAgIFF1YWxpZmllZE5hbWUsCiAgICAgICAgZGVwcmVjYXRlZF9leHRyYWN0VG9rZW4sCiAgICAgICAgZmxhdHRlbk5hbWU7CgpleHBvcnQgJy4uL3Njb3BlLmRhcnQnIHNob3cgQWNjZXNzRXJyb3JCdWlsZGVyLCBTY29wZSwgU2NvcGVCdWlsZGVyOwoKZXhwb3J0ICdidWlsdGluX3R5cGVfYnVpbGRlci5kYXJ0JyBzaG93IEJ1aWx0aW5UeXBlQnVpbGRlcjsKCmV4cG9ydCAnY2xhc3NfYnVpbGRlci5kYXJ0JyBzaG93IENsYXNzQnVpbGRlcjsKCmV4cG9ydCAnY29uc3RydWN0b3JfcmVmZXJlbmNlX2J1aWxkZXIuZGFydCcgc2hvdyBDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXI7CgpleHBvcnQgJ2RlY2xhcmF0aW9uLmRhcnQnIHNob3cgRGVjbGFyYXRpb247CgpleHBvcnQgJ2R5bmFtaWNfdHlwZV9idWlsZGVyLmRhcnQnIHNob3cgRHluYW1pY1R5cGVCdWlsZGVyOwoKZXhwb3J0ICdlbnVtX2J1aWxkZXIuZGFydCcgc2hvdyBFbnVtQnVpbGRlciwgRW51bUNvbnN0YW50SW5mbzsKCmV4cG9ydCAnZmllbGRfYnVpbGRlci5kYXJ0JyBzaG93IEZpZWxkQnVpbGRlcjsKCmV4cG9ydCAnZm9ybWFsX3BhcmFtZXRlcl9idWlsZGVyLmRhcnQnIHNob3cgRm9ybWFsUGFyYW1ldGVyQnVpbGRlcjsKCmV4cG9ydCAnZnVuY3Rpb25fdHlwZV9idWlsZGVyLmRhcnQnIHNob3cgRnVuY3Rpb25UeXBlQnVpbGRlcjsKCmV4cG9ydCAnaW52YWxpZF90eXBlX2J1aWxkZXIuZGFydCcgc2hvdyBJbnZhbGlkVHlwZUJ1aWxkZXI7CgpleHBvcnQgJ2xpYnJhcnlfYnVpbGRlci5kYXJ0JyBzaG93IExpYnJhcnlCdWlsZGVyOwoKZXhwb3J0ICdtZW1iZXJfYnVpbGRlci5kYXJ0JyBzaG93IE1lbWJlckJ1aWxkZXI7CgpleHBvcnQgJ21ldGFkYXRhX2J1aWxkZXIuZGFydCcgc2hvdyBNZXRhZGF0YUJ1aWxkZXI7CgpleHBvcnQgJ21peGluX2FwcGxpY2F0aW9uX2J1aWxkZXIuZGFydCcgc2hvdyBNaXhpbkFwcGxpY2F0aW9uQnVpbGRlcjsKCmV4cG9ydCAnbW9kaWZpZXJfYnVpbGRlci5kYXJ0JyBzaG93IE1vZGlmaWVyQnVpbGRlcjsKCmV4cG9ydCAnbmFtZV9pdGVyYXRvci5kYXJ0JyBzaG93IE5hbWVJdGVyYXRvcjsKCmV4cG9ydCAnbmFtZWRfdHlwZV9idWlsZGVyLmRhcnQnIHNob3cgTmFtZWRUeXBlQnVpbGRlcjsKCmV4cG9ydCAncHJlZml4X2J1aWxkZXIuZGFydCcgc2hvdyBQcmVmaXhCdWlsZGVyOwoKZXhwb3J0ICdwcm9jZWR1cmVfYnVpbGRlci5kYXJ0JyBzaG93IFByb2NlZHVyZUJ1aWxkZXI7CgpleHBvcnQgJ3R5cGVfYWxpYXNfYnVpbGRlci5kYXJ0JyBzaG93IFR5cGVBbGlhc0J1aWxkZXI7CgpleHBvcnQgJ3R5cGVfYnVpbGRlci5kYXJ0JyBzaG93IFR5cGVCdWlsZGVyOwoKZXhwb3J0ICd0eXBlX2RlY2xhcmF0aW9uX2J1aWxkZXIuZGFydCcgc2hvdyBUeXBlRGVjbGFyYXRpb25CdWlsZGVyOwoKZXhwb3J0ICd0eXBlX3ZhcmlhYmxlX2J1aWxkZXIuZGFydCcgc2hvdyBUeXBlVmFyaWFibGVCdWlsZGVyOwoKZXhwb3J0ICd1bnJlc29sdmVkX3R5cGUuZGFydCcgc2hvdyBVbnJlc29sdmVkVHlwZTsKCmV4cG9ydCAndm9pZF90eXBlX2J1aWxkZXIuZGFydCcgc2hvdyBWb2lkVHlwZUJ1aWxkZXI7CkMATk48ARcBHQkUHxchFQFFATwBLwFOASwBPAE/AS8BRAE+ATwBMwExATUBRgE1AS8BOAExATcBOAEtAUQBPgEzATYBMHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2J1aWxkZXIuZGFydEVzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvc2Nhbm5lci9hcnJheV9iYXNlZF9zY2FubmVyLmRhcnSyZS8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnNjYW5uZXIuYXJyYXlfYmFzZWRfc2Nhbm5lcjsKCmltcG9ydCAnZXJyb3JfdG9rZW4uZGFydCcgc2hvdyBFcnJvclRva2VuLCBVbm1hdGNoZWRUb2tlbjsKCmltcG9ydCAnLi4vLi4vc2Nhbm5lci90b2tlbi5kYXJ0JwogICAgc2hvdyBCZWdpblRva2VuLCBLZXl3b3JkLCBLZXl3b3JkVG9rZW4sIFN5bnRoZXRpY1Rva2VuLCBUb2tlbiwgVG9rZW5UeXBlOwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIGFzIGFuYWx5emVyIHNob3cgU3RyaW5nVG9rZW47CgppbXBvcnQgJ3Rva2VuX2NvbnN0YW50cy5kYXJ0JwogICAgc2hvdwogICAgICAgIExUX1RPS0VOLAogICAgICAgIE9QRU5fQ1VSTFlfQlJBQ0tFVF9UT0tFTiwKICAgICAgICBPUEVOX1BBUkVOX1RPS0VOLAogICAgICAgIFNUUklOR19JTlRFUlBPTEFUSU9OX1RPS0VOOwoKaW1wb3J0ICdjaGFyYWN0ZXJzLmRhcnQnIHNob3cgJExGLCAkU1RYOwoKaW1wb3J0ICdhYnN0cmFjdF9zY2FubmVyLmRhcnQnIHNob3cgQWJzdHJhY3RTY2FubmVyLCBjbG9zZUJyYWNlSW5mb0ZvcjsKCmltcG9ydCAnLi4vdXRpbC9saW5rLmRhcnQnIHNob3cgTGluazsKCmFic3RyYWN0IGNsYXNzIEFycmF5QmFzZWRTY2FubmVyIGV4dGVuZHMgQWJzdHJhY3RTY2FubmVyIHsKICBib29sIGhhc0Vycm9ycyA9IGZhbHNlOwoKICBBcnJheUJhc2VkU2Nhbm5lcihib29sIGluY2x1ZGVDb21tZW50cywge2ludCBudW1iZXJPZkJ5dGVzSGludH0pCiAgICAgIDogc3VwZXIoaW5jbHVkZUNvbW1lbnRzLCBudW1iZXJPZkJ5dGVzSGludDogbnVtYmVyT2ZCeXRlc0hpbnQpOwoKICAvKioKICAgKiBUaGUgc3RhY2sgb2Ygb3BlbiBncm91cHMsIGUuZyBbOiB7IC4uLiAoIC4uIDpdCiAgICogRWFjaCBCZWdpblRva2VuIGhhcyBhIHBvaW50ZXIgdG8gdGhlIHRva2VuIHdoZXJlIHRoZSBncm91cAogICAqIGVuZHMuIFRoaXMgZmllbGQgaXMgc2V0IHdoZW4gc2Nhbm5pbmcgdGhlIGVuZCBncm91cCB0b2tlbi4KICAgKi8KICBMaW5rPEJlZ2luVG9rZW4+IGdyb3VwaW5nU3RhY2sgPSBjb25zdCBMaW5rPEJlZ2luVG9rZW4+KCk7CgogIC8qKgogICAqIEFwcGVuZHMgYSBmaXhlZCB0b2tlbiB3aG9zZSBraW5kIGFuZCBjb250ZW50IGlzIGRldGVybWluZWQgYnkgW3R5cGVdLgogICAqIEFwcGVuZHMgYW4gKm9wZXJhdG9yKiB0b2tlbiBmcm9tIFt0eXBlXS4KICAgKgogICAqIEFuIG9wZXJhdG9yIHRva2VuIHJlcHJlc2VudCBvcGVyYXRvcnMgbGlrZSAnOicsICcuJywgJzsnLCAnJiYnLCAnPT0nLCAnLS0nLAogICAqICc9PicsIGV0Yy4KICAgKi8KICB2b2lkIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUgdHlwZSkgewogICAgYXBwZW5kVG9rZW4obmV3IFRva2VuKHR5cGUsIHRva2VuU3RhcnQsIGNvbW1lbnRzKSk7CiAgfQoKICAvKioKICAgKiBBcHBlbmRzIGEgZml4ZWQgdG9rZW4gYmFzZWQgb24gd2hldGhlciB0aGUgY3VycmVudCBjaGFyIGlzIFtjaG9pY2VdIG9yIG5vdC4KICAgKiBJZiB0aGUgY3VycmVudCBjaGFyIGlzIFtjaG9pY2VdIGEgZml4ZWQgdG9rZW4gd2hvc2Uga2luZCBhbmQgY29udGVudAogICAqIGlzIGRldGVybWluZWQgYnkgW3llc10gaXMgYXBwZW5kZWQsIG90aGVyd2lzZSBhIGZpeGVkIHRva2VuIHdob3NlIGtpbmQKICAgKiBhbmQgY29udGVudCBpcyBkZXRlcm1pbmVkIGJ5IFtub10gaXMgYXBwZW5kZWQuCiAgICovCiAgaW50IHNlbGVjdChpbnQgY2hvaWNlLCBUb2tlblR5cGUgeWVzLCBUb2tlblR5cGUgbm8pIHsKICAgIGludCBuZXh0ID0gYWR2YW5jZSgpOwogICAgaWYgKGlkZW50aWNhbChuZXh0LCBjaG9pY2UpKSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbih5ZXMpOwogICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgfSBlbHNlIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKG5vKTsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CiAgfQoKICAvKioKICAgKiBBcHBlbmRzIGEga2V5d29yZCB0b2tlbiB3aG9zZSBraW5kIGlzIGRldGVybWluZWQgYnkgW2tleXdvcmRdLgogICAqLwogIHZvaWQgYXBwZW5kS2V5d29yZFRva2VuKEtleXdvcmQga2V5d29yZCkgewogICAgU3RyaW5nIHN5bnRheCA9IGtleXdvcmQubGV4ZW1lOwogICAgLy8gVHlwZSBwYXJhbWV0ZXJzIGFuZCBhcmd1bWVudHMgY2Fubm90IGNvbnRhaW4gJ3RoaXMnLgogICAgaWYgKGlkZW50aWNhbChzeW50YXgsICd0aGlzJykpIHsKICAgICAgZGlzY2FyZE9wZW5MdCgpOwogICAgfQogICAgYXBwZW5kVG9rZW4obmV3IEtleXdvcmRUb2tlbihrZXl3b3JkLCB0b2tlblN0YXJ0LCBjb21tZW50cykpOwogIH0KCiAgdm9pZCBhcHBlbmRFb2ZUb2tlbigpIHsKICAgIGJlZ2luVG9rZW4oKTsKICAgIGRpc2NhcmRPcGVuTHQoKTsKICAgIHdoaWxlICghZ3JvdXBpbmdTdGFjay5pc0VtcHR5KSB7CiAgICAgIHVubWF0Y2hlZEJlZ2luR3JvdXAoZ3JvdXBpbmdTdGFjay5oZWFkKTsKICAgICAgZ3JvdXBpbmdTdGFjayA9IGdyb3VwaW5nU3RhY2sudGFpbDsKICAgIH0KICAgIGFwcGVuZFRva2VuKG5ldyBUb2tlbi5lb2YodG9rZW5TdGFydCwgY29tbWVudHMpKTsKICB9CgogIC8qKgogICAqIE5vdGlmaWVzIHNjYW5uaW5nIGEgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuIE5vdGUgdGhhdCBbYXBwZW5kV2hpdGVTcGFjZV0gaXMKICAgKiBub3QgYWx3YXlzIGludm9rZWQgZm9yIFskU1BBQ0VdIGNoYXJhY3RlcnMuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSBzY2FubmVycyB0byB0cmFjayBsaW5lIGJyZWFrcyBhbmQgY3JlYXRlIHRoZQogICAqIFtsaW5lU3RhcnRzXSBtYXAuCiAgICovCiAgdm9pZCBhcHBlbmRXaGl0ZVNwYWNlKGludCBuZXh0KSB7CiAgICBpZiAobmV4dCA9PSAkTEYpIHsKICAgICAgbGluZVN0YXJ0cy5hZGQoc3RyaW5nT2Zmc2V0ICsgMSk7IC8vICsxLCB0aGUgbGluZSBzdGFydHMgYWZ0ZXIgdGhlICRMRi4KICAgIH0KICB9CgogIC8qKgogICAqIE5vdGlmaWVzIG9uIFskTEZdIGNoYXJhY3RlcnMgaW4gbXVsdGktbGluZSBjb21tZW50cyBvciBzdHJpbmdzLgogICAqCiAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSB0aGUgc2Nhbm5lcnMgdG8gdHJhY2sgbGluZSBicmVha3MgYW5kIGNyZWF0ZSB0aGUKICAgKiBbbGluZVN0YXJ0c10gbWFwLgogICAqLwogIHZvaWQgbGluZUZlZWRJbk11bHRpbGluZSgpIHsKICAgIGxpbmVTdGFydHMuYWRkKHN0cmluZ09mZnNldCArIDEpOwogIH0KCiAgLyoqCiAgICogQXBwZW5kcyBhIHRva2VuIHRoYXQgYmVnaW5zIGEgbmV3IGdyb3VwLCByZXByZXNlbnRlZCBieSBbdHlwZV0uCiAgICogR3JvdXAgYmVnaW4gdG9rZW5zIGFyZSAneycsICcoJywgJ1snLCAnPCcgYW5kICckeycuCiAgICovCiAgdm9pZCBhcHBlbmRCZWdpbkdyb3VwKFRva2VuVHlwZSB0eXBlKSB7CiAgICBUb2tlbiB0b2tlbiA9IG5ldyBCZWdpblRva2VuKHR5cGUsIHRva2VuU3RhcnQsIGNvbW1lbnRzKTsKICAgIGFwcGVuZFRva2VuKHRva2VuKTsKCiAgICAvLyB7IFsgJHsgY2Fubm90IGFwcGVhciBpbnNpZGUgYSB0eXBlIHBhcmFtZXRlcnMgLyBhcmd1bWVudHMuCiAgICBpZiAoIWlkZW50aWNhbCh0eXBlLmtpbmQsIExUX1RPS0VOKSAmJgogICAgICAgICFpZGVudGljYWwodHlwZS5raW5kLCBPUEVOX1BBUkVOX1RPS0VOKSkgewogICAgICBkaXNjYXJkT3Blbkx0KCk7CiAgICB9CiAgICBncm91cGluZ1N0YWNrID0gZ3JvdXBpbmdTdGFjay5wcmVwZW5kKHRva2VuKTsKICB9CgogIC8qKgogICAqIEFwcGVuZHMgYSB0b2tlbiB0aGF0IGJlZ2lucyBhbiBlbmQgZ3JvdXAsIHJlcHJlc2VudGVkIGJ5IFt0eXBlXS4KICAgKiBJdCBoYW5kbGVzIHRoZSBncm91cCBlbmQgdG9rZW5zICd9JywgJyknIGFuZCAnXScuIFRoZSB0b2tlbnMgJz4nIGFuZAogICAqICc+PicgYXJlIGhhbmRsZWQgc2VwYXJhdGVseSBieSBbYXBwZW5kR3RdIGFuZCBbYXBwZW5kR3RHdF0uCiAgICovCiAgaW50IGFwcGVuZEVuZEdyb3VwKFRva2VuVHlwZSB0eXBlLCBpbnQgb3BlbktpbmQpIHsKICAgIGFzc2VydCghaWRlbnRpY2FsKG9wZW5LaW5kLCBMVF9UT0tFTikpOyAvLyBvcGVuS2luZCBpcyA8IGZvciA+IGFuZCA+PgogICAgaWYgKCFkaXNjYXJkQmVnaW5Hcm91cFVudGlsKG9wZW5LaW5kKSkgewogICAgICAvLyBObyBiZWdpbiBncm91cCBmb3VuZC4gSnVzdCBjb250aW51ZS4KICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKHR5cGUpOwogICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgfQogICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKHR5cGUpOwogICAgVG9rZW4gY2xvc2UgPSB0YWlsOwogICAgQmVnaW5Ub2tlbiBiZWdpbiA9IGdyb3VwaW5nU3RhY2suaGVhZDsKICAgIGlmICghaWRlbnRpY2FsKGJlZ2luLmtpbmQsIG9wZW5LaW5kKSkgewogICAgICBhc3NlcnQoYmVnaW4ua2luZCA9PSBTVFJJTkdfSU5URVJQT0xBVElPTl9UT0tFTiAmJgogICAgICAgICAgb3BlbktpbmQgPT0gT1BFTl9DVVJMWV9CUkFDS0VUX1RPS0VOKTsKICAgICAgLy8gV2UncmUgZW5kaW5nIGFuIGludGVycG9sYXRlZCBleHByZXNzaW9uLgogICAgICBiZWdpbi5lbmRHcm91cCA9IGNsb3NlOwogICAgICBncm91cGluZ1N0YWNrID0gZ3JvdXBpbmdTdGFjay50YWlsOwogICAgICAvLyBVc2luZyAic3RhcnQtb2YtdGV4dCIgdG8gc2lnbmFsIHRoYXQgd2UncmUgYmFjayBpbiBzdHJpbmcKICAgICAgLy8gc2Nhbm5pbmcgbW9kZS4KICAgICAgcmV0dXJuICRTVFg7CiAgICB9CiAgICBiZWdpbi5lbmRHcm91cCA9IGNsb3NlOwogICAgZ3JvdXBpbmdTdGFjayA9IGdyb3VwaW5nU3RhY2sudGFpbDsKICAgIHJldHVybiBhZHZhbmNlKCk7CiAgfQoKICAvKioKICAgKiBJZiBhIGJlZ2luIGdyb3VwIHRva2VuIG1hdGNoZXMgW29wZW5LaW5kXSwKICAgKiB0aGVuIGRpc2NhcmQgYmVnaW4gZ3JvdXAgdG9rZW5zIHVwIHRvIHRoYXQgbWF0Y2ggYW5kIHJldHVybiBgdHJ1ZWAsCiAgICogb3RoZXJ3aXNlIHJldHVybiBgZmFsc2VgLgogICAqIFRoaXMgcmVjb3ZlcnMgbmljZWx5IGZyb20gZnJvbSBzaXR1YXRpb25zIGxpa2UgIntbfSIgYW5kICJ7Zm9vKCkpO30iLAogICAqIGJ1dCBub3QgImZvbygoKSB7YmFyKCkpO30pOwogICAqLwogIGJvb2wgZGlzY2FyZEJlZ2luR3JvdXBVbnRpbChpbnQgb3BlbktpbmQpIHsKICAgIExpbms8QmVnaW5Ub2tlbj4gb3JpZ2luYWxTdGFjayA9IGdyb3VwaW5nU3RhY2s7CgogICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICBkbyB7CiAgICAgIC8vIERvbid0IHJlcG9ydCB1bm1hdGNoZWQgZXJyb3JzIGZvciA8OyBpdCBpcyBhbHNvIHRoZSBsZXNzLXRoYW4gb3BlcmF0b3IuCiAgICAgIGRpc2NhcmRPcGVuTHQoKTsKICAgICAgaWYgKGdyb3VwaW5nU3RhY2suaXNFbXB0eSkgYnJlYWs7IC8vIHJlY292ZXIKICAgICAgQmVnaW5Ub2tlbiBiZWdpbiA9IGdyb3VwaW5nU3RhY2suaGVhZDsKICAgICAgaWYgKG9wZW5LaW5kID09IGJlZ2luLmtpbmQgfHwKICAgICAgICAgIChvcGVuS2luZCA9PSBPUEVOX0NVUkxZX0JSQUNLRVRfVE9LRU4gJiYKICAgICAgICAgICAgICBiZWdpbi5raW5kID09IFNUUklOR19JTlRFUlBPTEFUSU9OX1RPS0VOKSkgewogICAgICAgIGlmIChmaXJzdCkgewogICAgICAgICAgLy8gSWYgdGhlIGV4cGVjdGVkIG9wZW5lciBoYXMgYmVlbiBmb3VuZCBvbiB0aGUgZmlyc3QgcGFzcwogICAgICAgICAgLy8gdGhlbiBubyByZWNvdmVyeSBuZWNlc3NhcnkuCiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7IC8vIHJlY292ZXIKICAgICAgfQogICAgICBmaXJzdCA9IGZhbHNlOwogICAgICBncm91cGluZ1N0YWNrID0gZ3JvdXBpbmdTdGFjay50YWlsOwogICAgfSB3aGlsZSAoIWdyb3VwaW5nU3RhY2suaXNFbXB0eSk7CgogICAgLy8gSWYgdGhlIHN0YWNrIGRvZXMgbm90IGhhdmUgYW55IG9wZW5lciBvZiB0aGUgZ2l2ZW4gdHlwZSwKICAgIC8vIHRoZW4gcmV0dXJuIHdpdGhvdXQgZGlzY2FyZGluZyBhbnl0aGluZy4KICAgIC8vIFRoaXMgcmVjb3ZlcnMgbmljZWx5IGZyb20gZnJvbSBzaXR1YXRpb25zIGxpa2UgIntmb28oKSk7fSIuCiAgICBpZiAoZ3JvdXBpbmdTdGFjay5pc0VtcHR5KSB7CiAgICAgIGdyb3VwaW5nU3RhY2sgPSBvcmlnaW5hbFN0YWNrOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gSW5zZXJ0IHN5bnRoZXRpYyBjbG9zZXJzIGFuZCByZXBvcnQgZXJyb3JzIGZvciBhbnkgdW5iYWxhbmNlZCBvcGVuZXJzLgogICAgLy8gVGhpcyByZWNvdmVycyBuaWNlbHkgZnJvbSBmcm9tIHNpdHVhdGlvbnMgbGlrZSAie1t9Ii4KICAgIHdoaWxlICghaWRlbnRpY2FsKG9yaWdpbmFsU3RhY2ssIGdyb3VwaW5nU3RhY2spKSB7CiAgICAgIC8vIERvbid0IHJlcG9ydCB1bm1hdGNoZWQgZXJyb3JzIGZvciA8OyBpdCBpcyBhbHNvIHRoZSBsZXNzLXRoYW4gb3BlcmF0b3IuCiAgICAgIGlmICghaWRlbnRpY2FsKGdyb3VwaW5nU3RhY2suaGVhZC5raW5kLCBMVF9UT0tFTikpCiAgICAgICAgdW5tYXRjaGVkQmVnaW5Hcm91cChvcmlnaW5hbFN0YWNrLmhlYWQpOwogICAgICBvcmlnaW5hbFN0YWNrID0gb3JpZ2luYWxTdGFjay50YWlsOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvKioKICAgKiBBcHBlbmRzIGEgdG9rZW4gZm9yICc+Jy4KICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBpc3N1ZSB1bm1hdGNoZWQgZXJyb3JzLCBiZWNhdXNlID4gaXMgYWxzbyB0aGUKICAgKiBncmVhdGVyLXRoYW4gb3BlcmF0b3IuIEl0IGRvZXMgbm90IG5lY2Vzc2FyaWx5IGhhdmUgdG8gY2xvc2UgYSBncm91cC4KICAgKi8KICB2b2lkIGFwcGVuZEd0KFRva2VuVHlwZSB0eXBlKSB7CiAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4odHlwZSk7CiAgICBpZiAoZ3JvdXBpbmdTdGFjay5pc0VtcHR5KSByZXR1cm47CiAgICBpZiAoaWRlbnRpY2FsKGdyb3VwaW5nU3RhY2suaGVhZC5raW5kLCBMVF9UT0tFTikpIHsKICAgICAgZ3JvdXBpbmdTdGFjay5oZWFkLmVuZEdyb3VwID0gdGFpbDsKICAgICAgZ3JvdXBpbmdTdGFjayA9IGdyb3VwaW5nU3RhY2sudGFpbDsKICAgIH0KICB9CgogIC8qKgogICAqIEFwcGVuZHMgYSB0b2tlbiBmb3IgJz4+Jy4KICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBpc3N1ZSB1bm1hdGNoZWQgZXJyb3JzLCBiZWNhdXNlID4+IGlzIGFsc28gdGhlCiAgICogc2hpZnQgb3BlcmF0b3IuIEl0IGRvZXMgbm90IG5lY2Vzc2FyaWx5IGhhdmUgdG8gY2xvc2UgYSBncm91cC4KICAgKi8KICB2b2lkIGFwcGVuZEd0R3QoVG9rZW5UeXBlIHR5cGUpIHsKICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbih0eXBlKTsKICAgIGlmIChncm91cGluZ1N0YWNrLmlzRW1wdHkpIHJldHVybjsKICAgIGlmIChpZGVudGljYWwoZ3JvdXBpbmdTdGFjay5oZWFkLmtpbmQsIExUX1RPS0VOKSkgewogICAgICAvLyBEb24ndCBhc3NpZ24gZW5kR3JvdXA6IGluICJUPFU8Vj4+IiwgdGhlICc+PicgdG9rZW4gY2xvc2VzIHRoZSBvdXRlcgogICAgICAvLyAnPCcsIHRoZSBpbm5lciAnPCcgaXMgbGVmdCB3aXRob3V0IGVuZEdyb3VwLgogICAgICBncm91cGluZ1N0YWNrID0gZ3JvdXBpbmdTdGFjay50YWlsOwogICAgfQogICAgaWYgKGdyb3VwaW5nU3RhY2suaXNFbXB0eSkgcmV0dXJuOwogICAgaWYgKGlkZW50aWNhbChncm91cGluZ1N0YWNrLmhlYWQua2luZCwgTFRfVE9LRU4pKSB7CiAgICAgIGdyb3VwaW5nU3RhY2suaGVhZC5lbmRHcm91cCA9IHRhaWw7CiAgICAgIGdyb3VwaW5nU3RhY2sgPSBncm91cGluZ1N0YWNrLnRhaWw7CiAgICB9CiAgfQoKICB2b2lkIGFwcGVuZEVycm9yVG9rZW4oRXJyb3JUb2tlbiB0b2tlbikgewogICAgaGFzRXJyb3JzID0gdHJ1ZTsKICAgIGFwcGVuZFRva2VuKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYXBwZW5kU3Vic3RyaW5nVG9rZW4oVG9rZW5UeXBlIHR5cGUsIGludCBzdGFydCwgYm9vbCBhc2NpaU9ubHksCiAgICAgIFtpbnQgZXh0cmFPZmZzZXQgPSAwXSkgewogICAgYXBwZW5kVG9rZW4oY3JlYXRlU3Vic3RyaW5nVG9rZW4odHlwZSwgc3RhcnQsIGFzY2lpT25seSwgZXh0cmFPZmZzZXQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYXBwZW5kU3ludGhldGljU3Vic3RyaW5nVG9rZW4oCiAgICAgIFRva2VuVHlwZSB0eXBlLCBpbnQgc3RhcnQsIGJvb2wgYXNjaWlPbmx5LCBTdHJpbmcgc3ludGhldGljQ2hhcnMpIHsKICAgIGFwcGVuZFRva2VuKAogICAgICAgIGNyZWF0ZVN5bnRoZXRpY1N1YnN0cmluZ1Rva2VuKHR5cGUsIHN0YXJ0LCBhc2NpaU9ubHksIHN5bnRoZXRpY0NoYXJzKSk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IHN1YnN0cmluZyBmcm9tIHRoZSBzY2FuIG9mZnNldCBbc3RhcnRdIHRvIHRoZSBjdXJyZW50CiAgICogW3NjYW5PZmZzZXRdIHBsdXMgdGhlIFtleHRyYU9mZnNldF0uIEZvciBleGFtcGxlLCBpZiB0aGUgY3VycmVudAogICAqIHNjYW5PZmZzZXQgaXMgMTAsIHRoZW4gW2FwcGVuZFN1YnN0cmluZ1Rva2VuKDUsIC0xKV0gd2lsbCBhcHBlbmQgdGhlCiAgICogc3Vic3RyaW5nIHN0cmluZyBbNSw5KS4KICAgKgogICAqIE5vdGUgdGhhdCBbZXh0cmFPZmZzZXRdIGNhbiBvbmx5IGJlIHVzZWQgaWYgdGhlIGNvdmVyZWQgY2hhcmFjdGVyKHMpIGFyZQogICAqIGtub3duIHRvIGJlIEFTQ0lJLgogICAqLwogIGFuYWx5emVyLlN0cmluZ1Rva2VuIGNyZWF0ZVN1YnN0cmluZ1Rva2VuKAogICAgICBUb2tlblR5cGUgdHlwZSwgaW50IHN0YXJ0LCBib29sIGFzY2lpT25seSwKICAgICAgW2ludCBleHRyYU9mZnNldCA9IDBdKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBzeW50aGV0aWMgc3Vic3RyaW5nIGZyb20gdGhlIHNjYW4gb2Zmc2V0IFtzdGFydF0KICAgKiB0byB0aGUgY3VycmVudCBbc2Nhbk9mZnNldF0gcGx1cyB0aGUgW3N5bnRoZXRpY0NoYXJzXS4KICAgKiBUaGUgW3N5bnRoZXRpY0NoYXJzXSBhcmUgYXBwZW5kZWQgdG8gdGhlIHVudGVybWluYXRlZCBzdHJpbmcKICAgKiBsaXRlcmFsJ3MgbGV4ZW1lIGJ1dCB0aGUgcmV0dXJuZWQgdG9rZW4ncyBsZW5ndGggd2lsbCAqbm90KiBpbmNsdWRlCiAgICogdGhvc2UgYWRkaXRpb25hbCBjaGFyYWN0ZXJzIHNvIGFzIHRvIGJlIHRydWUgdG8gdGhlIG9yaWdpbmFsIHNvdXJjZS4KICAgKi8KICBhbmFseXplci5TdHJpbmdUb2tlbiBjcmVhdGVTeW50aGV0aWNTdWJzdHJpbmdUb2tlbigKICAgICAgVG9rZW5UeXBlIHR5cGUsIGludCBzdGFydCwgYm9vbCBhc2NpaU9ubHksIFN0cmluZyBzeW50aGV0aWNDaGFycyk7CgogIC8qKgogICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBkaXNjYXJkICc8JyBmcm9tIHRoZSAiZ3JvdXBpbmciIHN0YWNrLgogICAqCiAgICogW1BhcnRpYWxQYXJzZXIuc2tpcEV4cHJlc3Npb25dIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IHdlIGRvIG5vdAogICAqIGNyZWF0ZSBncm91cHMgZm9yIHN0dWZmIGxpa2U6CiAgICogWzphID0gYiA8IGMsIGQgPSBlID4gZjpdLgogICAqCiAgICogSW4gb3RoZXIgd29yZHMsIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBzY2FubmVyIHJlY29nbml6ZXMKICAgKiBzb21ldGhpbmcgd2hpY2ggY2Fubm90IHBvc3NpYmx5IGJlIHBhcnQgb2YgYSB0eXBlIHBhcmFtZXRlci9hcmd1bWVudAogICAqIGxpc3QsIGxpa2UgdGhlICc9JyBpbiB0aGUgYWJvdmUgZXhhbXBsZS4KICAgKi8KICB2b2lkIGRpc2NhcmRPcGVuTHQoKSB7CiAgICB3aGlsZSAoIWdyb3VwaW5nU3RhY2suaXNFbXB0eSAmJgogICAgICAgIGlkZW50aWNhbChncm91cGluZ1N0YWNrLmhlYWQua2luZCwgTFRfVE9LRU4pKSB7CiAgICAgIGdyb3VwaW5nU3RhY2sgPSBncm91cGluZ1N0YWNrLnRhaWw7CiAgICB9CiAgfQoKICAvKioKICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gZGlzY2FyZCAnJHsnIGZyb20gdGhlICJncm91cGluZyIgc3RhY2suCiAgICoKICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgc2Nhbm5lciBmaW5kcyBhbiB1bnRlcm1pbmF0ZWQKICAgKiBpbnRlcnBvbGF0aW9uIGV4cHJlc3Npb24uCiAgICovCiAgdm9pZCBkaXNjYXJkSW50ZXJwb2xhdGlvbigpIHsKICAgIHdoaWxlICghZ3JvdXBpbmdTdGFjay5pc0VtcHR5KSB7CiAgICAgIEJlZ2luVG9rZW4gYmVnaW5Ub2tlbiA9IGdyb3VwaW5nU3RhY2suaGVhZDsKICAgICAgdW5tYXRjaGVkQmVnaW5Hcm91cChiZWdpblRva2VuKTsKICAgICAgZ3JvdXBpbmdTdGFjayA9IGdyb3VwaW5nU3RhY2sudGFpbDsKICAgICAgaWYgKGlkZW50aWNhbChiZWdpblRva2VuLmtpbmQsIFNUUklOR19JTlRFUlBPTEFUSU9OX1RPS0VOKSkgYnJlYWs7CiAgICB9CiAgfQoKICB2b2lkIHVubWF0Y2hlZEJlZ2luR3JvdXAoQmVnaW5Ub2tlbiBiZWdpbikgewogICAgLy8gV2Ugd2FudCB0byBlbnN1cmUgdGhhdCB1bm1hdGNoZWQgQmVnaW5Ub2tlbnMgYXJlIHJlcG9ydGVkIGFzCiAgICAvLyBlcnJvcnMuICBIb3dldmVyLCB0aGUgZGlldCBwYXJzZXIgYXNzdW1lcyB0aGF0IGdyb3VwcyBhcmUgd2VsbC1iYWxhbmNlZAogICAgLy8gYW5kIHdpbGwgbmV2ZXIgbG9vayBhdCB0aGUgZW5kR3JvdXAgdG9rZW4uICBUaGlzIGlzIGEgbmljZSBwcm9wZXJ0eSB0aGF0CiAgICAvLyBhbGxvd3MgdXMgdG8gc2tpcCBxdWlja2x5IG92ZXIgY29ycmVjdCBjb2RlLiBCeSBpbnNlcnRpbmcgYW4gYWRkaXRpb25hbAogICAgLy8gc3ludGhldGljIHRva2VuIGluIHRoZSBzdHJlYW0sIHdlIGNhbiBrZWVwIGlnbm9yaW5nIGVuZEdyb3VwIHRva2Vucy4KICAgIC8vCiAgICAvLyBbYmVnaW5dIC0tbmV4dC0tPiBbdGFpbF0KICAgIC8vIFtiZWdpbl0gLS1lbmRHLS0+IFtzeW50aGV0aWNdIC0tbmV4dC0tPiBbbmV4dF0gLS1uZXh0LS0+IFt0YWlsXQogICAgLy8KICAgIC8vIFRoaXMgYWxsb3dzIHRoZSBkaWV0IHBhcnNlciB0byBza2lwIGZyb20gW2JlZ2luXSB2aWEgZW5kR3JvdXAgdG8KICAgIC8vIFtzeW50aGV0aWNdIGFuZCBpZ25vcmUgdGhlIFtzeW50aGV0aWNdIHRva2VuIChhc3N1bWluZyBpdCdzIGNvcnJlY3QpLAogICAgLy8gdGhlbiB0aGUgZXJyb3Igd2lsbCBiZSByZXBvcnRlZCB3aGVuIHBhcnNpbmcgdGhlIFtuZXh0XSB0b2tlbi4KICAgIC8vCiAgICAvLyBGb3IgZXhhbXBsZSwgdG9rZW5pemUoIntbMX07IikgcHJvZHVjZXM6CiAgICAvLwogICAgLy8gU3ltYm9sVG9rZW4oeykgLS1lbmRHcm91cC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgIC8vICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAvLyAgICAgbmV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgLy8gICAgICB2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgIC8vIFN5bWJvbFRva2VuKFspIC0tZW5kR3JvdXAtLSsgICAgICAgICAgICAgICAgICAgICB8CiAgICAvLyAgICAgIHwgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgfAogICAgLy8gICAgIG5leHQgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwKICAgIC8vICAgICAgdiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICB8CiAgICAvLyBTdHJpbmdUb2tlbigxKSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgfAogICAgLy8gICAgICB8ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwKICAgIC8vICAgICBuZXh0ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICB8CiAgICAvLyAgICAgIHYgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgfAogICAgLy8gU3ltYm9sVG9rZW4oXSk8LS0tLS0tLS0tLS0tKyA8LS0gU3ludGhldGljIHRva2VuIHwKICAgIC8vICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAvLyAgICAgbmV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgLy8gICAgICB2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgIC8vIFVubWF0Y2hlZFRva2VuKFspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAvLyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgLy8gICAgIG5leHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgIC8vICAgICAgdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAvLyBTeW1ib2xUb2tlbih9KTwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICAgLy8gICAgICB8CiAgICAvLyAgICAgbmV4dAogICAgLy8gICAgICB2CiAgICAvLyBTeW1ib2xUb2tlbig7KQogICAgLy8gICAgICB8CiAgICAvLyAgICAgbmV4dAogICAgLy8gICAgICB2CiAgICAvLyAgICAgRU9GCiAgICBUb2tlblR5cGUgdHlwZSA9IGNsb3NlQnJhY2VJbmZvRm9yKGJlZ2luKTsKICAgIGFwcGVuZFRva2VuKG5ldyBTeW50aGV0aWNUb2tlbih0eXBlLCB0b2tlblN0YXJ0KS4uYmVmb3JlU3ludGhldGljID0gdGFpbCk7CiAgICBiZWdpbi5lbmRHcm91cCA9IHRhaWw7CiAgICBhcHBlbmRFcnJvclRva2VuKG5ldyBVbm1hdGNoZWRUb2tlbihiZWdpbikpOwogIH0KfQqBcABOTjwBKwE7ASJOAUABHgkSIhokASkBSAEmATsaAUNGAQY0QEAGPQEGSy4FURAGLzgEAQZRSkw0BjgaIyIYDSETBgQBBkQGLSQ8JRcGQgQBGhIVJS8qBjYEAQZPMQVNFwYkF04GBAEGRQVNFwYfJgQBBkU5Bio+GAFCKzMXBjIEAQZGSkEGNUotLiMYBiEYKyw5MTIeKkMYEwYcKBYEAQYwSR9LIQYuNAEXCVEXMy0kMzsVRSkXChoIFSomAUAwQyElFAYBTj03UTkxKgYRBAEGHkhLBiIhJzgqKgYEAQYfSUQGJCEnOE42KgYnOCoqBgQBLBYYBAEMRx9MBAEMJkoRUAQBBklGSh0FThgGLTEeAQZEPEJJSgY2SQEGRQVGIx8FR0ouBhklOCoGBAEGRgVCHwYgJTInKkkGBAEvRE9QT0wHIEcHSE1GBzAHOjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6DhAOFg4QDg8vTxsxBAIBPHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zY2FubmVyL2FycmF5X2Jhc2VkX3NjYW5uZXIuZGFydE5zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvYXBpX3Byb3RvdHlwZS9pbmNyZW1lbnRhbF9rZXJuZWxfZ2VuZXJhdG9yLmRhcnSRSS8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6YXN5bmMnIHNob3cgRnV0dXJlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9rZXJuZWwuZGFydCcKICAgIHNob3cgQ29tcG9uZW50LCBQcm9jZWR1cmUsIERhcnRUeXBlLCBUeXBlUGFyYW1ldGVyOwoKaW1wb3J0ICcuLi9iYXNlL3Byb2Nlc3NlZF9vcHRpb25zLmRhcnQnIHNob3cgUHJvY2Vzc2VkT3B0aW9uczsKCmltcG9ydCAnLi4vZmFzdGEvY29tcGlsZXJfY29udGV4dC5kYXJ0JyBzaG93IENvbXBpbGVyQ29udGV4dDsKCmltcG9ydCAnLi4vZmFzdGEvaW5jcmVtZW50YWxfY29tcGlsZXIuZGFydCcgc2hvdyBJbmNyZW1lbnRhbENvbXBpbGVyOwoKaW1wb3J0ICcuLi9mYXN0YS9zY2FubmVyL3N0cmluZ19zY2FubmVyLmRhcnQnIHNob3cgU3RyaW5nU2Nhbm5lcjsKCmltcG9ydCAnY29tcGlsZXJfb3B0aW9ucy5kYXJ0JyBzaG93IENvbXBpbGVyT3B0aW9uczsKCmFic3RyYWN0IGNsYXNzIEluY3JlbWVudGFsS2VybmVsR2VuZXJhdG9yIHsKICBmYWN0b3J5IEluY3JlbWVudGFsS2VybmVsR2VuZXJhdG9yKENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLCBVcmkgZW50cnlQb2ludCwKICAgICAgW1VyaSBpbml0aWFsaXplRnJvbURpbGxVcmksIGJvb2wgb3V0bGluZU9ubHldKSB7CiAgICByZXR1cm4gbmV3IEluY3JlbWVudGFsQ29tcGlsZXIoCiAgICAgICAgbmV3IENvbXBpbGVyQ29udGV4dCgKICAgICAgICAgICAgbmV3IFByb2Nlc3NlZE9wdGlvbnMob3B0aW9uczogb3B0aW9ucywgaW5wdXRzOiBbZW50cnlQb2ludF0pKSwKICAgICAgICBpbml0aWFsaXplRnJvbURpbGxVcmksCiAgICAgICAgb3V0bGluZU9ubHkpOwogIH0KCiAgLy8vIEluaXRpYWxpemUgdGhlIGluY3JlbWVudGFsIGNvbXBpbGVyIGZyb20gYSBjb21wb25lbnQuCiAgLy8vCiAgLy8vIE5vdGljZSB0aGF0IHRoZSBjb21wb25lbnQgaGFzIHRvIGluY2x1ZGUgdGhlIHBsYXRmb3JtLCBhbmQgdGhhdCBubyBvdGhlcgogIC8vLyBwbGF0Zm9ybSB3aWxsIGJlIGxvYWRlZC4KICBmYWN0b3J5IEluY3JlbWVudGFsS2VybmVsR2VuZXJhdG9yLmZyb21Db21wb25lbnQoCiAgICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLCBVcmkgZW50cnlQb2ludCwgQ29tcG9uZW50IGNvbXBvbmVudCwKICAgICAgW2Jvb2wgb3V0bGluZU9ubHldKSB7CiAgICByZXR1cm4gbmV3IEluY3JlbWVudGFsQ29tcGlsZXIuZnJvbUNvbXBvbmVudCgKICAgICAgICBuZXcgQ29tcGlsZXJDb250ZXh0KAogICAgICAgICAgICBuZXcgUHJvY2Vzc2VkT3B0aW9ucyhvcHRpb25zOiBvcHRpb25zLCBpbnB1dHM6IFtlbnRyeVBvaW50XSkpLAogICAgICAgIGNvbXBvbmVudCwKICAgICAgICBvdXRsaW5lT25seSk7CiAgfQoKICAvLy8gUmV0dXJucyBhIGNvbXBvbmVudCB3aG9zZSBsaWJyYXJpZXMgYXJlIHRoZSByZWNvbXBpbGVkIGxpYnJhcmllcywKICAvLy8gb3IgLSBpbiB0aGUgY2FzZSBvZiBbZnVsbENvbXBvbmVudF0gLSBhIGZ1bGwgQ29tcG9uZW50LgogIEZ1dHVyZTxDb21wb25lbnQ+IGNvbXB1dGVEZWx0YSh7TGlzdDxVcmk+IGVudHJ5UG9pbnRzLCBib29sIGZ1bGxDb21wb25lbnR9KTsKCiAgLy8vIFJlbW92ZSB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZpbGUgW3VyaV0gZnJvbSB0aGUgc2V0IG9mCiAgLy8vIHZhbGlkIGZpbGVzLiAgVGhpcyBndWFyYW50ZWVzIHRoYXQgdGhvc2UgZmlsZXMgd2lsbCBiZSByZS1yZWFkIG9uIHRoZQogIC8vLyBuZXh0IGNhbGwgdG8gW2NvbXB1dGVEZWx0YV0pLgogIHZvaWQgaW52YWxpZGF0ZShVcmkgdXJpKTsKCiAgLy8vIEludmFsaWRhdGUgYWxsIGxpYnJhcmllcyB0aGF0IHdlcmUgYnVpbGQgZnJvbSBzb3VyY2UuCiAgLy8vCiAgLy8vIFRoaXMgaXMgZXF1aXZhbGVudCB0byBhIG51bWJlciBvZiBjYWxscyB0byBbaW52YWxpZGF0ZV06IE9uZSBmb3IgZWFjaCBVUkkKICAvLy8gdGhhdCBoYXBwZW5zIHRvIGhhdmUgYmVlbiByZWFkIGZyb20gc291cmNlLgogIC8vLyBTYWlkIGFub3RoZXIgd2F5LCB0aGlzIGludmFsaWRhdGVzIGV2ZXJ5dGhpbmcgbm90IGxvYWRlZCBmcm9tIGRpbGwKICAvLy8gKGF0IHN0YXJ0dXApIG9yIHZpYSBbc2V0TW9kdWxlc1RvTG9hZE9uTmV4dENvbXB1dGVEZWx0YV0uCiAgdm9pZCBpbnZhbGlkYXRlQWxsU291cmNlcygpOwoKICAvLy8gU2V0IHRoZSBnaXZlbiBbY29tcG9uZW50c10gYXMgY29tcG9uZW50cyB0byBsb2FkIG9uIHRoZSBuZXh0IGl0ZXJhdGlvbgogIC8vLyBvZiBbY29tcHV0ZURlbHRhXS4KICAvLy8KICAvLy8gSWYgc3BlY2lmaWVkLCBhbGwgbGlicmFyaWVzIG5vdCBjb21waWxlZCBmcm9tIHNvdXJjZSBhbmQgbm90IGluY2x1ZGVkIGluCiAgLy8vIHRoZXNlIGNvbXBvbmVudHMgd2lsbCBiZSBpbnZhbGlkYXRlZCBhbmQgdGhlIGxpYnJhcmllcyBpbnNpZGUgdGhlc2UKICAvLy8gY29tcG9uZW50cyB3aWxsIGJlIGxvYWRlZCBpbnN0ZWFkLgogIC8vLwogIC8vLyBVc2VmdWwgZm9yLCBmb3IgaW5zdGFuY2UsIG1vZHVsYXIgY29tcGlsYXRpb24sIHdoZXJlIG1vZHVsZXMKICAvLy8gKGNyZWF0ZWQgZXh0ZXJuYWxseSkgdmlhIHRoaXMgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWRkZWQsIGNoYW5nZWQgb3IKICAvLy8gcmVtb3ZlZC4KICB2b2lkIHNldE1vZHVsZXNUb0xvYWRPbk5leHRDb21wdXRlRGVsdGEoTGlzdDxDb21wb25lbnQ+IGNvbXBvbmVudHMpOwoKICAvLy8gQ29tcGlsZSBbZXhwcmVzc2lvbl0gYXMgYW4gW0V4cHJlc3Npb25dLiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGF0CiAgLy8vIGV4cHJlc3Npb24gaXMgY29tcGlsZWQuCiAgLy8vCiAgLy8vIFtleHByZXNzaW9uXSBtYXkgdXNlIHRoZSB2YXJpYWJsZXMgc3VwcGxpZWQgaW4gW2RlZmluaXRpb25zXSBhcyBmcmVlCiAgLy8vIHZhcmlhYmxlcyBhbmQgW3R5cGVEZWZpbml0aW9uc10gYXMgZnJlZSB0eXBlIHZhcmlhYmxlcy4gVGhlc2Ugd2lsbCBiZWNvbWUKICAvLy8gcmVxdWlyZWQgcGFyYW1ldGVycyB0byB0aGUgY29tcGlsZWQgZnVuY3Rpb24uIEFsbCBlbGVtZW50cyBvZgogIC8vLyBbZGVmaW5pdGlvbnNdIGFuZCBbdHlwZURlZmluaXRpb25zXSB3aWxsIGJlY29tZSBwYXJhbWV0ZXJzL3R5cGUKICAvLy8gcGFyYW1ldGVycywgd2hldGhlciBvciBub3QgdGhleSBhcHBlYXIgZnJlZSBpbiBbZXhwcmVzc2lvbl0uIFRoZSB0eXBlCiAgLy8vIHBhcmFtZXRlcnMgc2hvdWxkIGhhdmUgYSBudWxsIHBhcmVudCBwb2ludGVyLgogIC8vLwogIC8vLyBbbGlicmFyeVVyaV0gbXVzdCByZWZlciB0byBlaXRoZXIgYSBwcmV2aW91c2x5IGNvbXBpbGVkIGxpYnJhcnkuCiAgLy8vIFtjbGFzc05hbWVdIG1heSBvcHRpb25hbGx5IHJlZmVyIHRvIGEgY2xhc3Mgd2l0aGluIHN1Y2ggbGlicmFyeSB0byB1c2UgZm9yCiAgLy8vIHRoZSBzY29wZSBvZiB0aGUgZXhwcmVzc2lvbi4gSW4gdGhhdCBjYXNlLCBbaXNTdGF0aWNdIGluZGljYXRlcyB3aGV0aGVyCiAgLy8vIHRoZSBzY29wZSBjYW4gYWNjZXNzIFt0aGlzXS4KICAvLy8KICAvLy8gSXQgaXMgaWxsZWdhbCB0byB1c2UgImF3YWl0IiBpbiBbZXhwcmVzc2lvbl0gYW5kIHRoZSBjb21waWxlZCBmdW5jdGlvbgogIC8vLyB3aWxsIGFsd2F5cyBiZSBzeW5jaHJvbm91cy4KICAvLy8KICAvLy8gW2NvbXB1dGVEZWx0YV0gbXVzdCBoYXZlIGJlZW4gY2FsbGVkIGF0IGxlYXN0IG9uY2UgcHJpb3IuCiAgLy8vCiAgLy8vIFtjb21waWxlRXhwcmVzc2lvbl0gd2lsbCByZXR1cm4gW251bGxdIGlmIHRoZSBsaWJyYXJ5IG9yIGNsYXNzIGZvcgogIC8vLyBbZW5jbG9zaW5nTm9kZV0gY291bGQgbm90IGJlIGZvdW5kLiBPdGhlcndpc2UsIGVycm9ycyBhcmUgcmVwb3J0ZWQgaW4gdGhlCiAgLy8vIG5vcm1hbCB3YXkuCiAgRnV0dXJlPFByb2NlZHVyZT4gY29tcGlsZUV4cHJlc3Npb24oCiAgICAgIFN0cmluZyBleHByZXNzaW9uLAogICAgICBNYXA8U3RyaW5nLCBEYXJ0VHlwZT4gZGVmaW5pdGlvbnMsCiAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZURlZmluaXRpb25zLAogICAgICBTdHJpbmcgc3ludGhldGljUHJvY2VkdXJlTmFtZSwKICAgICAgVXJpIGxpYnJhcnlVcmksCiAgICAgIFtTdHJpbmcgY2xhc3NOYW1lLAogICAgICBib29sIGlzU3RhdGljID0gZmFsc2VdKTsKfQoKYm9vbCBpc0xlZ2FsSWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcikgewogIHJldHVybiBTdHJpbmdTY2FubmVyLmlzTGVnYWxJZGVudGlmaWVyKGlkZW50aWZpZXIpOwp9Cm4ATk48ASEBJDgBPwE+AUYBQgE1ASxONyQdSx8WBAE8Bk8fNEQcMh1LExYEAUg+TwFLTCQcATwGUDJJQB8BTRkGT0opBkNLD0cBSR4GS1BERkw0BkdRTiMGTSIGQAZJUBInGSkrJRYZHwIBLDYCAUVwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS9pbmNyZW1lbnRhbF9rZXJuZWxfZ2VuZXJhdG9yLmRhcnREc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2FwaV9wcm90b3R5cGUvbWVtb3J5X2ZpbGVfc3lzdGVtLmRhcnSPYC8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZyb250X2VuZC5tZW1vcnlfZmlsZV9zeXN0ZW07CgppbXBvcnQgJ2RhcnQ6YXN5bmMnOwppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CmltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKCmltcG9ydCAnZmlsZV9zeXN0ZW0uZGFydCc7CgovLy8gQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgW0ZpbGVTeXN0ZW1dIHdoaWNoIHBlcmZvcm1zIGl0cyBvcGVyYXRpb25zIG9uIGFuCi8vLyBpbi1tZW1vcnkgdmlydHVhbCBmaWxlIHN5c3RlbS4KLy8vCi8vLyBOb3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgb3IgZXh0ZW5kZWQgYnkgY2xpZW50cy4KY2xhc3MgTWVtb3J5RmlsZVN5c3RlbSBpbXBsZW1lbnRzIEZpbGVTeXN0ZW0gewogIGZpbmFsIE1hcDxVcmksIFVpbnQ4TGlzdD4gX2ZpbGVzID0ge307CiAgZmluYWwgU2V0PFVyaT4gX2RpcmVjdG9yaWVzID0gbmV3IFNldDxVcmk+KCk7CgogIC8vLyBUaGUgImN1cnJlbnQgZGlyZWN0b3J5IiBpbiB0aGUgaW4tbWVtb3J5IHZpcnR1YWwgZmlsZSBzeXN0ZW0uCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCB0byBjb252ZXJ0IHJlbGF0aXZlIFVSSXMgdG8gYWJzb2x1dGUgVVJJcy4KICAvLy8KICAvLy8gQWx3YXlzIGVuZHMgaW4gYSB0cmFpbGluZyAnLycuCiAgVXJpIGN1cnJlbnREaXJlY3Rvcnk7CgogIE1lbW9yeUZpbGVTeXN0ZW0oVXJpIGN1cnJlbnREaXJlY3RvcnkpCiAgICAgIDogY3VycmVudERpcmVjdG9yeSA9IF9hZGRUcmFpbGluZ1NsYXNoKGN1cnJlbnREaXJlY3RvcnkpOwoKICBAb3ZlcnJpZGUKICBNZW1vcnlGaWxlU3lzdGVtRW50aXR5IGVudGl0eUZvclVyaShVcmkgdXJpKSB7CiAgICByZXR1cm4gbmV3IE1lbW9yeUZpbGVTeXN0ZW1FbnRpdHkuXygKICAgICAgICB0aGlzLCBjdXJyZW50RGlyZWN0b3J5LnJlc29sdmVVcmkodXJpKS5ub3JtYWxpemVQYXRoKCkpOwogIH0KCiAgU3RyaW5nIGdldCBkZWJ1Z1N0cmluZyB7CiAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBfZmlsZXMuZm9yRWFjaCgodXJpLCBfKSA9PiBzYi53cml0ZSgiLSAkdXJpXG4iKSk7CiAgICBfZGlyZWN0b3JpZXMuZm9yRWFjaCgodXJpKSA9PiBzYi53cml0ZSgiLSAkdXJpXG4iKSk7CiAgICByZXR1cm4gJyRzYic7CiAgfQoKICBzdGF0aWMgVXJpIF9hZGRUcmFpbGluZ1NsYXNoKFVyaSB1cmkpIHsKICAgIGlmICghdXJpLnBhdGguZW5kc1dpdGgoJy8nKSkgewogICAgICB1cmkgPSB1cmkucmVwbGFjZShwYXRoOiB1cmkucGF0aCArICcvJyk7CiAgICB9CiAgICByZXR1cm4gdXJpOwogIH0KfQoKLy8vIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIFtGaWxlU3lzdGVtRW50aXR5XSBmb3IgdXNlIGJ5Ci8vLyBbTWVtb3J5RmlsZVN5c3RlbV0uCmNsYXNzIE1lbW9yeUZpbGVTeXN0ZW1FbnRpdHkgaW1wbGVtZW50cyBGaWxlU3lzdGVtRW50aXR5IHsKICBmaW5hbCBNZW1vcnlGaWxlU3lzdGVtIF9maWxlU3lzdGVtOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBVcmkgdXJpOwoKICBNZW1vcnlGaWxlU3lzdGVtRW50aXR5Ll8odGhpcy5fZmlsZVN5c3RlbSwgdGhpcy51cmkpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHVyaS5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpID0+CiAgICAgIG90aGVyIGlzIE1lbW9yeUZpbGVTeXN0ZW1FbnRpdHkgJiYKICAgICAgb3RoZXIudXJpID09IHVyaSAmJgogICAgICBpZGVudGljYWwob3RoZXIuX2ZpbGVTeXN0ZW0sIF9maWxlU3lzdGVtKTsKCiAgLy8vIENyZWF0ZSBhIGRpcmVjdG9yeSBmb3IgdGhpcyBmaWxlIHN5c3RlbSBlbnRyeS4KICAvLy8KICAvLy8gSWYgdGhlIGVudHJ5IGlzIGFuIGV4aXN0aW5nIGZpbGUsIHRoaXMgaXMgYW4gZXJyb3IuCiAgdm9pZCBjcmVhdGVEaXJlY3RvcnkoKSB7CiAgICBpZiAoX2ZpbGVTeXN0ZW0uX2ZpbGVzW3VyaV0gIT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbih1cmksICdFbnRyeSAkdXJpIGlzIGEgZmlsZS4nKTsKICAgIH0KICAgIF9maWxlU3lzdGVtLl9kaXJlY3Rvcmllcy5hZGQodXJpKTsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxib29sPiBleGlzdHMoKSBhc3luYyB7CiAgICByZXR1cm4gX2ZpbGVTeXN0ZW0uX2ZpbGVzW3VyaV0gIT0gbnVsbCB8fAogICAgICAgIF9maWxlU3lzdGVtLl9kaXJlY3Rvcmllcy5jb250YWlucyh1cmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgRnV0dXJlPExpc3Q8aW50Pj4gcmVhZEFzQnl0ZXMoKSBhc3luYyB7CiAgICBVaW50OExpc3QgY29udGVudHMgPSBfZmlsZVN5c3RlbS5fZmlsZXNbdXJpXTsKICAgIGlmIChjb250ZW50cyA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKHVyaSwgJ0ZpbGUgJHVyaSBkb2VzIG5vdCBleGlzdC4nKTsKICAgIH0KICAgIHJldHVybiBjb250ZW50czsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxTdHJpbmc+IHJlYWRBc1N0cmluZygpIGFzeW5jIHsKICAgIExpc3Q8aW50PiBieXRlcyA9IGF3YWl0IHJlYWRBc0J5dGVzKCk7CiAgICB0cnkgewogICAgICByZXR1cm4gdXRmOC5kZWNvZGUoYnl0ZXMpOwogICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gY2F0Y2ggKGUpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24odXJpLCBlLm1lc3NhZ2UpOwogICAgfQogIH0KCiAgLy8vIFdyaXRlcyB0aGUgZ2l2ZW4gcmF3IGJ5dGVzIHRvIHRoaXMgZmlsZSBzeXN0ZW0gZW50aXR5LgogIC8vLwogIC8vLyBJZiBubyBmaWxlIGV4aXN0cywgb25lIGlzIGNyZWF0ZWQuICBJZiBhIGZpbGUgZXhpc3RzIGFscmVhZHksIGl0IGlzCiAgLy8vIG92ZXJ3cml0dGVuLgogIHZvaWQgd3JpdGVBc0J5dGVzU3luYyhMaXN0PGludD4gYnl0ZXMpIHsKICAgIGlmIChieXRlcyBpcyBVaW50OExpc3QpIHsKICAgICAgX3VwZGF0ZSh1cmksIGJ5dGVzKTsKICAgIH0gZWxzZSB7CiAgICAgIF91cGRhdGUodXJpLCBuZXcgVWludDhMaXN0LmZyb21MaXN0KGJ5dGVzKSk7CiAgICB9CiAgfQoKICAvLy8gV3JpdGVzIHRoZSBnaXZlbiBzdHJpbmcgdG8gdGhpcyBmaWxlIHN5c3RlbSBlbnRpdHkuCiAgLy8vCiAgLy8vIFRoZSBzdHJpbmcgaXMgZW5jb2RlZCBhcyBVVEYtOC4KICAvLy8KICAvLy8gSWYgbm8gZmlsZSBleGlzdHMsIG9uZSBpcyBjcmVhdGVkLiAgSWYgYSBmaWxlIGV4aXN0cyBhbHJlYWR5LCBpdCBpcwogIC8vLyBvdmVyd3JpdHRlbi4KICB2b2lkIHdyaXRlQXNTdHJpbmdTeW5jKFN0cmluZyBzKSB7CiAgICAvLyBOb3RlOiB0aGUgcmV0dXJuIHR5cGUgb2YgdXRmOC5lbmNvZGUgaXMgTGlzdDxpbnQ+LCBidXQgaW4gcHJhY3RpY2UgaXQKICAgIC8vIGFsd2F5cyByZXR1cm5zIFVpbnQ4TGlzdC4gIFdlIHJlbHkgb24gdGhhdCBmb3IgZWZmaWNpZW5jeSwgc28gdGhhdCB3ZQogICAgLy8gZG9uJ3QgaGF2ZSB0byBtYWtlIGFuIGV4dHJhIGNvcHkuCiAgICBfdXBkYXRlKHVyaSwgdXRmOC5lbmNvZGUocykgYXMgVWludDhMaXN0KTsKICB9CgogIHZvaWQgX3VwZGF0ZShVcmkgdXJpLCBVaW50OExpc3QgZGF0YSkgewogICAgaWYgKF9maWxlU3lzdGVtLl9kaXJlY3Rvcmllcy5jb250YWlucyh1cmkpKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKHVyaSwgJ0VudHJ5ICR1cmkgaXMgYSBkaXJlY3RvcnkuJyk7CiAgICB9CiAgICBfZmlsZVN5c3RlbS5fZmlsZXNbdXJpXSA9IGRhdGE7CiAgfQp9CoCLAE5OPAEmARUXGgEbAVAjBDsvKTABRAY+BiUYASlAAQwxKUEEARshNjkSBAEqIy8GEAQCAT0YOyYBDBEBOAEMJAEMJCkaMQE1BjobK0MGJwQBDCAuMAQBDCoyHEcGFQQBDCgrCiElNQYEAT0GShMrHhsNMwYEAToGJgZKEyVNTSkvBAEqMkgGJAQCATtwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS9tZW1vcnlfZmlsZV9zeXN0ZW0uZGFydDdzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlcl9ncmFwaC5kYXJ0iF4vLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5idWlsZGVyX2dyYXBoOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9rZXJuZWwuZGFydCcgc2hvdyBMaWJyYXJ5RGVwZW5kZW5jeSwgTGlicmFyeVBhcnQ7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3V0aWwvZ3JhcGguZGFydCcgc2hvdyBHcmFwaDsKCmltcG9ydCAnYnVpbGRlci9idWlsZGVyLmRhcnQnIHNob3cgTGlicmFyeUJ1aWxkZXI7CgppbXBvcnQgJ2V4cG9ydC5kYXJ0JyBzaG93IEV4cG9ydDsKCmltcG9ydCAnaW1wb3J0LmRhcnQnIHNob3cgSW1wb3J0OwoKaW1wb3J0ICdkaWxsL2RpbGxfbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgRGlsbExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICdzb3VyY2Uvc291cmNlX2xpYnJhcnlfYnVpbGRlci5kYXJ0JyBzaG93IFNvdXJjZUxpYnJhcnlCdWlsZGVyOwoKY2xhc3MgQnVpbGRlckdyYXBoIGltcGxlbWVudHMgR3JhcGg8VXJpPiB7CiAgZmluYWwgTWFwPFVyaSwgTGlicmFyeUJ1aWxkZXI+IGJ1aWxkZXJzOwoKICBCdWlsZGVyR3JhcGgodGhpcy5idWlsZGVycyk7CgogIEl0ZXJhYmxlPFVyaT4gZ2V0IHZlcnRpY2VzID0+IGJ1aWxkZXJzLmtleXM7CgogIEl0ZXJhYmxlPFVyaT4gbmVpZ2hib3JzT2YoVXJpIHZlcnRleCkgc3luYyogewogICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGJ1aWxkZXJzW3ZlcnRleF07CiAgICBpZiAobGlicmFyeSA9PSBudWxsKSB7CiAgICAgIHRocm93ICJMaWJyYXJ5IG5vdCBmb3VuZDogJHZlcnRleCI7CiAgICB9CiAgICBpZiAobGlicmFyeSBpcyBTb3VyY2VMaWJyYXJ5QnVpbGRlcikgewogICAgICBmb3IgKEltcG9ydCBpbXBvcnQgaW4gbGlicmFyeS5pbXBvcnRzKSB7CiAgICAgICAgLy8gJ2ltcG9ydGVkJyBjYW4gYmUgbnVsbCBmb3IgZmFrZSBpbXBvcnRzLCBzdWNoIGFzIGRhcnQtZXh0Oi4KICAgICAgICBpZiAoaW1wb3J0LmltcG9ydGVkICE9IG51bGwpIHsKICAgICAgICAgIFVyaSB1cmkgPSBpbXBvcnQuaW1wb3J0ZWQudXJpOwogICAgICAgICAgaWYgKGJ1aWxkZXJzLmNvbnRhaW5zS2V5KHVyaSkpIHsKICAgICAgICAgICAgeWllbGQgdXJpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKEV4cG9ydCBleHBvcnQgaW4gbGlicmFyeS5leHBvcnRzKSB7CiAgICAgICAgVXJpIHVyaSA9IGV4cG9ydC5leHBvcnRlZC51cmk7CiAgICAgICAgaWYgKGJ1aWxkZXJzLmNvbnRhaW5zS2V5KHVyaSkpIHsKICAgICAgICAgIHlpZWxkIHVyaTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yIChTb3VyY2VMaWJyYXJ5QnVpbGRlciBwYXJ0IGluIGxpYnJhcnkucGFydHMpIHsKICAgICAgICBVcmkgdXJpID0gcGFydC51cmk7CiAgICAgICAgaWYgKGJ1aWxkZXJzLmNvbnRhaW5zS2V5KHVyaSkpIHsKICAgICAgICAgIHlpZWxkIHVyaTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobGlicmFyeSBpcyBEaWxsTGlicmFyeUJ1aWxkZXIpIHsKICAgICAgLy8gSW1wb3J0cyBhbmQgZXhwb3J0cwogICAgICBmb3IgKExpYnJhcnlEZXBlbmRlbmN5IGRlcGVuZGVuY3kgaW4gbGlicmFyeS5saWJyYXJ5LmRlcGVuZGVuY2llcykgewogICAgICAgIFVyaSB1cmkgPSBkZXBlbmRlbmN5LnRhcmdldExpYnJhcnkuaW1wb3J0VXJpOwogICAgICAgIGlmIChidWlsZGVycy5jb250YWluc0tleSh1cmkpKSB7CiAgICAgICAgICB5aWVsZCB1cmk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBQYXJ0cwogICAgICBmb3IgKExpYnJhcnlQYXJ0IHBhcnQgaW4gbGlicmFyeS5saWJyYXJ5LnBhcnRzKSB7CiAgICAgICAgVXJpIHVyaSA9IGxpYnJhcnkudXJpLnJlc29sdmUocGFydC5wYXJ0VXJpKTsKICAgICAgICBpZiAoYnVpbGRlcnMuY29udGFpbnNLZXkodXJpKSkgewogICAgICAgICAgeWllbGQgdXJpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQpLAE5OPAEdAUkBNAEzASIBIgFBAUcBKysBHwEvATAvGyoGKy9HJykrFwwKCC8nKRUKCDkcKRUKCDAdSzYpFQoIAQ84NSkVCggGBAIBLnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyX2dyYXBoLmRhcnQ0c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2NvbWJpbmF0b3IuZGFydIK7Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuY29tYmluYXRvcjsKCmNsYXNzIENvbWJpbmF0b3IgewogIGZpbmFsIGJvb2wgaXNTaG93OwoKICBmaW5hbCBTZXQ8U3RyaW5nPiBuYW1lczsKCiAgQ29tYmluYXRvcih0aGlzLmlzU2hvdywgdGhpcy5uYW1lcywgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpKTsKCiAgQ29tYmluYXRvci5zaG93KEl0ZXJhYmxlPFN0cmluZz4gbmFtZXMsIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSkKICAgICAgOiB0aGlzKHRydWUsIG5ldyBTZXQ8U3RyaW5nPi5mcm9tKG5hbWVzKSwgY2hhck9mZnNldCwgZmlsZVVyaSk7CgogIENvbWJpbmF0b3IuaGlkZShJdGVyYWJsZTxTdHJpbmc+IG5hbWVzLCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpCiAgICAgIDogdGhpcyhmYWxzZSwgbmV3IFNldDxTdHJpbmc+LmZyb20obmFtZXMpLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKCiAgYm9vbCBnZXQgaXNIaWRlID0+ICFpc1Nob3c7Cn0KFwBOTjwBGgETFQEbAUQBR0YBR0cBHgIBK3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9jb21iaW5hdG9yLmRhcnRJc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3V0aWwvZXJyb3JfcmVwb3J0ZXJfZmlsZV9jb3BpZXIuZGFydILlLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDppbycgc2hvdyBEaXJlY3RvcnksIEZpbGUsIEdaaXBDb2RlYzsKClVyaSBzYXZlQXNHemlwKExpc3Q8aW50PiBkYXRhLCBTdHJpbmcgZmlsZW5hbWUpIHsKICAvLyBUT0RPKGplbnNqKTogVGhpcyBzaG91bGQgYmUgZG9uZSB2aWEgdGhlIEZpbGVTeXN0ZW0gaW5zdGVhZCwgYnV0IGl0CiAgLy8gY3VycmVudGx5IGRvZXNuJ3Qgc3VwcG9ydCB3cml0aW5nLgogIEdaaXBDb2RlYyBnWmlwQ29kZWMgPSBuZXcgR1ppcENvZGVjKCk7CiAgTGlzdDxpbnQ+IGd6aXBwZWRJbml0aWFsaXplZEZyb21EYXRhID0gZ1ppcENvZGVjLmVuY29kZShkYXRhKTsKICBEaXJlY3RvcnkgdGVtcERpciA9IERpcmVjdG9yeS5zeXN0ZW1UZW1wLmNyZWF0ZVRlbXBTeW5jKCIkZmlsZW5hbWUiKTsKICBGaWxlIGZpbGUgPSBuZXcgRmlsZSgiJHt0ZW1wRGlyLnBhdGh9LyR7ZmlsZW5hbWV9Lmd6Iik7CiAgZmlsZS53cml0ZUFzQnl0ZXNTeW5jKGd6aXBwZWRJbml0aWFsaXplZEZyb21EYXRhKTsKICByZXR1cm4gZmlsZS51cmk7Cn0KEgBOTjwBMgEySSgpQUg6NRMCAUBwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdXRpbC9lcnJvcl9yZXBvcnRlcl9maWxlX2NvcGllci5kYXJ0PHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9oeWJyaWRfZmlsZV9zeXN0ZW0uZGFydIeSLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBBIG1lbW9yeSArIHBoeXNpY2FsIGZpbGUgc3lzdGVtIHVzZWQgdG8gbW9jayBpbnB1dCBmb3IgdGVzdHMgYnV0IHByb3ZpZGUKLy8vIHNkayBzb3VyY2VzIGZyb20gZGlzay4KbGlicmFyeSBmcm9udF9lbmQuc3JjLmh5YnJpZF9maWxlX3N5c3RlbTsKCmltcG9ydCAnZGFydDphc3luYyc7CgppbXBvcnQgJy4uL2FwaV9wcm90b3R5cGUvZmlsZV9zeXN0ZW0uZGFydCc7CmltcG9ydCAnLi4vYXBpX3Byb3RvdHlwZS9tZW1vcnlfZmlsZV9zeXN0ZW0uZGFydCc7CmltcG9ydCAnLi4vYXBpX3Byb3RvdHlwZS9zdGFuZGFyZF9maWxlX3N5c3RlbS5kYXJ0JzsKCi8vLyBBIGZpbGUgc3lzdGVtIHRoYXQgbWl4ZXMgZmlsZXMgZnJvbSBtZW1vcnkgYW5kIGEgcGh5c2ljYWwgZmlsZSBzeXN0ZW0uIEFsbAovLy8gbWVtb3J5IGVudGl0aWVzIHRha2UgcHJpb3RpdHkgb3ZlciBmaWxlIHN5c3RlbSBlbnRpdGllcy4KY2xhc3MgSHlicmlkRmlsZVN5c3RlbSBpbXBsZW1lbnRzIEZpbGVTeXN0ZW0gewogIGZpbmFsIE1lbW9yeUZpbGVTeXN0ZW0gbWVtb3J5OwogIGZpbmFsIEZpbGVTeXN0ZW0gcGh5c2ljYWw7CgogIEh5YnJpZEZpbGVTeXN0ZW0odGhpcy5tZW1vcnksIFtGaWxlU3lzdGVtIF9waHlzaWNhbF0pCiAgICAgIDogcGh5c2ljYWwgPSBfcGh5c2ljYWwgPz8gU3RhbmRhcmRGaWxlU3lzdGVtLmluc3RhbmNlOwoKICBAb3ZlcnJpZGUKICBGaWxlU3lzdGVtRW50aXR5IGVudGl0eUZvclVyaShVcmkgdXJpKSA9PgogICAgICBuZXcgSHlicmlkRmlsZVN5c3RlbUVudGl0eSh1cmksIHRoaXMpOwp9CgovLy8gRW50aXR5IHRoYXQgZGVsZWdhdGVzIHRvIGFuIHVuZGVybHlpbmcgbWVtb3J5IG9yIHBoaXNpY2FsIGZpbGUgc3lzdGVtCi8vLyBlbnRpdHkuCmNsYXNzIEh5YnJpZEZpbGVTeXN0ZW1FbnRpdHkgaW1wbGVtZW50cyBGaWxlU3lzdGVtRW50aXR5IHsKICBmaW5hbCBVcmkgdXJpOwogIEZpbGVTeXN0ZW1FbnRpdHkgX2RlbGVnYXRlOwogIGZpbmFsIEh5YnJpZEZpbGVTeXN0ZW0gX2ZzOwoKICBIeWJyaWRGaWxlU3lzdGVtRW50aXR5KHRoaXMudXJpLCB0aGlzLl9mcyk7CgogIEZ1dHVyZTxGaWxlU3lzdGVtRW50aXR5PiBnZXQgZGVsZWdhdGUgYXN5bmMgewogICAgaWYgKF9kZWxlZ2F0ZSAhPSBudWxsKSByZXR1cm4gX2RlbGVnYXRlOwogICAgRmlsZVN5c3RlbUVudGl0eSBlbnRpdHkgPSBfZnMubWVtb3J5LmVudGl0eUZvclVyaSh1cmkpOwogICAgaWYgKCgodXJpLnNjaGVtZSAhPSAnZmlsZScgJiYgdXJpLnNjaGVtZSAhPSAnZGF0YScpICYmCiAgICAgICAgICAgIF9mcy5waHlzaWNhbCBpcyBTdGFuZGFyZEZpbGVTeXN0ZW0pIHx8CiAgICAgICAgYXdhaXQgZW50aXR5LmV4aXN0cygpKSB7CiAgICAgIF9kZWxlZ2F0ZSA9IGVudGl0eTsKICAgICAgcmV0dXJuIF9kZWxlZ2F0ZTsKICAgIH0KICAgIHJldHVybiBfZGVsZWdhdGUgPSBfZnMucGh5c2ljYWwuZW50aXR5Rm9yVXJpKHVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICBGdXR1cmU8Ym9vbD4gZXhpc3RzKCkgYXN5bmMgPT4gKGF3YWl0IGRlbGVnYXRlKS5leGlzdHMoKTsKCiAgQG92ZXJyaWRlCiAgRnV0dXJlPExpc3Q8aW50Pj4gcmVhZEFzQnl0ZXMoKSBhc3luYyA9PiAoYXdhaXQgZGVsZWdhdGUpLnJlYWRBc0J5dGVzKCk7CgogIEBvdmVycmlkZQogIEZ1dHVyZTxTdHJpbmc+IHJlYWRBc1N0cmluZygpIGFzeW5jID0+IChhd2FpdCBkZWxlZ2F0ZSkucmVhZEFzU3RyaW5nKCk7Cn0KPABOTjwBTRsqARUBLDM1AU89LyEdATg9AQwsLQIBSgw7ER4eAS4BMC08OzMhGhgGNwQBDDwBDEsBDEoCATNwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvaHlicmlkX2ZpbGVfc3lzdGVtLmRhcnRHc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfbGlicmFyeV9idWlsZGVyLmRhcnTAAQCSLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEua2VybmVsX2xpYnJhcnlfYnVpbGRlcjsKCmltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IGpzb25FbmNvZGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIEFyZ3VtZW50cywKICAgICAgICBDbGFzcywKICAgICAgICBDb25zdHJ1Y3RvciwKICAgICAgICBDb25zdHJ1Y3Rvckludm9jYXRpb24sCiAgICAgICAgRGFydFR5cGUsCiAgICAgICAgRHluYW1pY1R5cGUsCiAgICAgICAgRXhwcmVzc2lvbiwKICAgICAgICBGaWVsZCwKICAgICAgICBGdW5jdGlvbk5vZGUsCiAgICAgICAgRnVuY3Rpb25UeXBlLAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgTGlicmFyeSwKICAgICAgICBMaWJyYXJ5RGVwZW5kZW5jeSwKICAgICAgICBMaWJyYXJ5UGFydCwKICAgICAgICBMaXN0TGl0ZXJhbCwKICAgICAgICBNYXBMaXRlcmFsLAogICAgICAgIE1lbWJlciwKICAgICAgICBOYW1lLAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBQcm9jZWR1cmVLaW5kLAogICAgICAgIFNldExpdGVyYWwsCiAgICAgICAgU3RhdGljSW52b2NhdGlvbiwKICAgICAgICBTdHJpbmdMaXRlcmFsLAogICAgICAgIFN1cGVydHlwZSwKICAgICAgICBUeXBlZGVmLAogICAgICAgIFR5cGVQYXJhbWV0ZXIsCiAgICAgICAgVHlwZVBhcmFtZXRlclR5cGUsCiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiwKICAgICAgICBWb2lkVHlwZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnIHNob3cgQ2xhc3NIaWVyYXJjaHk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2Nsb25lLmRhcnQnIHNob3cgQ2xvbmVWaXNpdG9yOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9zcmMvYm91bmRzX2NoZWNrcy5kYXJ0JwogICAgc2hvdwogICAgICAgIFR5cGVBcmd1bWVudElzc3VlLAogICAgICAgIGZpbmRUeXBlQXJndW1lbnRJc3N1ZXMsCiAgICAgICAgZmluZFR5cGVBcmd1bWVudElzc3Vlc0Zvckludm9jYXRpb24sCiAgICAgICAgZ2V0R2VuZXJpY1R5cGVOYW1lOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgc2hvdyBzdWJzdGl0dXRlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQnIHNob3cgVHlwZUVudmlyb25tZW50OwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJy4uL2V4cG9ydC5kYXJ0JyBzaG93IEV4cG9ydDsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cKICAgICAgICBGb3JtYXR0ZWRNZXNzYWdlLAogICAgICAgIExvY2F0ZWRNZXNzYWdlLAogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgbWVzc2FnZUNvbmZsaWN0c1dpdGhUeXBlVmFyaWFibGVDYXVzZSwKICAgICAgICBtZXNzYWdlR2VuZXJpY0Z1bmN0aW9uVHlwZUluQm91bmQsCiAgICAgICAgbWVzc2FnZUdlbmVyaWNGdW5jdGlvblR5cGVVc2VkQXNBY3R1YWxUeXBlQXJndW1lbnQsCiAgICAgICAgbWVzc2FnZUluY29ycmVjdFR5cGVBcmd1bWVudFZhcmlhYmxlLAogICAgICAgIG1lc3NhZ2VUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZSwKICAgICAgICBtZXNzYWdlVHlwZVZhcmlhYmxlU2FtZU5hbWVBc0VuY2xvc2luZywKICAgICAgICBub0xlbmd0aCwKICAgICAgICB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhUeXBlVmFyaWFibGUsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkRXhwb3J0LAogICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZEV4cG9ydEluVHlwZSwKICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWRJbXBvcnQsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkSW1wb3J0SW5UeXBlLAogICAgICAgIHRlbXBsYXRlRXhwb3J0SGlkZXNFeHBvcnQsCiAgICAgICAgdGVtcGxhdGVHZW5lcmljRnVuY3Rpb25UeXBlSW5mZXJyZWRBc0FjdHVhbFR5cGVBcmd1bWVudCwKICAgICAgICB0ZW1wbGF0ZUltcG9ydEhpZGVzSW1wb3J0LAogICAgICAgIHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50LAogICAgICAgIHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5SZXR1cm5UeXBlLAogICAgICAgIHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5mZXJyZWQsCiAgICAgICAgdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWQsCiAgICAgICAgdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWRJbmZlcnJlZCwKICAgICAgICB0ZW1wbGF0ZUludGVyc2VjdGlvblR5cGVBc1R5cGVBcmd1bWVudCwKICAgICAgICB0ZW1wbGF0ZUxvYWRMaWJyYXJ5SGlkZXNNZW1iZXIsCiAgICAgICAgdGVtcGxhdGVMb2NhbERlZmluaXRpb25IaWRlc0V4cG9ydCwKICAgICAgICB0ZW1wbGF0ZUxvY2FsRGVmaW5pdGlvbkhpZGVzSW1wb3J0LAogICAgICAgIHRlbXBsYXRlUGF0Y2hJbmplY3Rpb25GYWlsZWQsCiAgICAgICAgdGVtcGxhdGVUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZUNhdXNlOwoKaW1wb3J0ICcuLi9pbXBvcnQuZGFydCcgc2hvdyBJbXBvcnQ7CgppbXBvcnQgJy4uL2xvYWRlci5kYXJ0JyBzaG93IExvYWRlcjsKCmltcG9ydCAnLi4vbW9kaWZpZXIuZGFydCcKICAgIHNob3cKICAgICAgICBhYnN0cmFjdE1hc2ssCiAgICAgICAgaGFzQ29uc3RDb25zdHJ1Y3Rvck1hc2ssCiAgICAgICAgaGFzSW5pdGlhbGl6ZXJNYXNrLAogICAgICAgIGluaXRpYWxpemluZ0Zvcm1hbE1hc2ssCiAgICAgICAgbWl4aW5EZWNsYXJhdGlvbk1hc2ssCiAgICAgICAgbmFtZWRNaXhpbkFwcGxpY2F0aW9uTWFzaywKICAgICAgICBzdGF0aWNNYXNrOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuZXhwZWN0ZWQsIHVuaGFuZGxlZDsKCmltcG9ydCAnLi4vc2V2ZXJpdHkuZGFydCcgc2hvdyBTZXZlcml0eTsKCmltcG9ydCAnLi4vc291cmNlL3NvdXJjZV9jbGFzc19idWlsZGVyLmRhcnQnIHNob3cgU291cmNlQ2xhc3NCdWlsZGVyOwoKaW1wb3J0ICcuLi9zb3VyY2Uvc291cmNlX2xpYnJhcnlfYnVpbGRlci5kYXJ0JwogICAgc2hvdyBEZWNsYXJhdGlvbkJ1aWxkZXIsIFNvdXJjZUxpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX2luZmVycmVyLmRhcnQnIHNob3cgVHlwZUluZmVycmVySW1wbDsKCmltcG9ydCAna2VybmVsX2J1aWxkZXIuZGFydCcKICAgIHNob3cKICAgICAgICBBY2Nlc3NFcnJvckJ1aWxkZXIsCiAgICAgICAgQnVpbHRpblR5cGVCdWlsZGVyLAogICAgICAgIENsYXNzQnVpbGRlciwKICAgICAgICBDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXIsCiAgICAgICAgRGVjbGFyYXRpb24sCiAgICAgICAgRHluYW1pY1R5cGVCdWlsZGVyLAogICAgICAgIEVudW1Db25zdGFudEluZm8sCiAgICAgICAgRm9ybWFsUGFyYW1ldGVyQnVpbGRlciwKICAgICAgICBJbXBsaWNpdEZpZWxkVHlwZSwKICAgICAgICBJbnZhbGlkVHlwZUJ1aWxkZXIsCiAgICAgICAgS2VybmVsQ2xhc3NCdWlsZGVyLAogICAgICAgIEtlcm5lbENvbnN0cnVjdG9yQnVpbGRlciwKICAgICAgICBLZXJuZWxFbnVtQnVpbGRlciwKICAgICAgICBLZXJuZWxGaWVsZEJ1aWxkZXIsCiAgICAgICAgS2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlciwKICAgICAgICBLZXJuZWxGdW5jdGlvbkJ1aWxkZXIsCiAgICAgICAgS2VybmVsVHlwZUFsaWFzQnVpbGRlciwKICAgICAgICBLZXJuZWxGdW5jdGlvblR5cGVCdWlsZGVyLAogICAgICAgIEtlcm5lbEludmFsaWRUeXBlQnVpbGRlciwKICAgICAgICBLZXJuZWxNaXhpbkFwcGxpY2F0aW9uQnVpbGRlciwKICAgICAgICBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyLAogICAgICAgIEtlcm5lbFByb2NlZHVyZUJ1aWxkZXIsCiAgICAgICAgS2VybmVsUmVkaXJlY3RpbmdGYWN0b3J5QnVpbGRlciwKICAgICAgICBLZXJuZWxUeXBlQnVpbGRlciwKICAgICAgICBLZXJuZWxUeXBlVmFyaWFibGVCdWlsZGVyLAogICAgICAgIExpYnJhcnlCdWlsZGVyLAogICAgICAgIExvYWRMaWJyYXJ5QnVpbGRlciwKICAgICAgICBNZW1iZXJCdWlsZGVyLAogICAgICAgIE1ldGFkYXRhQnVpbGRlciwKICAgICAgICBOYW1lSXRlcmF0b3IsCiAgICAgICAgUHJlZml4QnVpbGRlciwKICAgICAgICBQcm9jZWR1cmVCdWlsZGVyLAogICAgICAgIFF1YWxpZmllZE5hbWUsCiAgICAgICAgU2NvcGUsCiAgICAgICAgVHlwZUJ1aWxkZXIsCiAgICAgICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciwKICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyLAogICAgICAgIFVucmVzb2x2ZWRUeXBlLAogICAgICAgIFZvaWRUeXBlQnVpbGRlciwKICAgICAgICBjb21wYXJlUHJvY2VkdXJlcywKICAgICAgICB0b0tlcm5lbENvbWJpbmF0b3JzOwoKaW1wb3J0ICdtZXRhZGF0YV9jb2xsZWN0b3IuZGFydCc7CgppbXBvcnQgJ3R5cGVfYWxnb3JpdGhtcy5kYXJ0JwogICAgc2hvdwogICAgICAgIGNhbGN1bGF0ZUJvdW5kcywKICAgICAgICBmaW5kR2VuZXJpY0Z1bmN0aW9uVHlwZXMsCiAgICAgICAgZ2V0Tm9uU2ltcGxpY2l0eUlzc3Vlc0ZvckRlY2xhcmF0aW9uLAogICAgICAgIGdldE5vblNpbXBsaWNpdHlJc3N1ZXNGb3JUeXBlVmFyaWFibGVzOwoKY2xhc3MgS2VybmVsTGlicmFyeUJ1aWxkZXIKICAgIGV4dGVuZHMgU291cmNlTGlicmFyeUJ1aWxkZXI8S2VybmVsVHlwZUJ1aWxkZXIsIExpYnJhcnk+IHsKICBmaW5hbCBMaWJyYXJ5IGxpYnJhcnk7CgogIGZpbmFsIEtlcm5lbExpYnJhcnlCdWlsZGVyIGFjdHVhbE9yaWdpbjsKCiAgZmluYWwgTGlzdDxLZXJuZWxGdW5jdGlvbkJ1aWxkZXI+IG5hdGl2ZU1ldGhvZHMgPSA8S2VybmVsRnVuY3Rpb25CdWlsZGVyPltdOwoKICBmaW5hbCBMaXN0PEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXI+IGJvdW5kbGVzc1R5cGVWYXJpYWJsZXMgPQogICAgICA8S2VybmVsVHlwZVZhcmlhYmxlQnVpbGRlcj5bXTsKCiAgLy8gQSBsaXN0IG9mIGFsdGVybmF0aW5nIGZvcndhcmRlcnMgYW5kIHRoZSBwcm9jZWR1cmVzIHRoZXkgd2VyZSBnZW5lcmF0ZWQKICAvLyBmb3IuICBOb3RlIHRoYXQgaXQgbWF5IG5vdCBpbmNsdWRlIGEgZm9yd2FyZGVyLW9yaWdpbiBwYWlyIGluIGNhc2VzIHdoZW4KICAvLyB0aGUgZm9ybWVyIGRvZXMgbm90IG5lZWQgdG8gYmUgdXBkYXRlZCBhZnRlciB0aGUgYm9keSBvZiB0aGUgbGF0dGVyIHdhcwogIC8vIGJ1aWx0LgogIGZpbmFsIExpc3Q8UHJvY2VkdXJlPiBmb3J3YXJkZXJzT3JpZ2lucyA9IDxQcm9jZWR1cmU+W107CgogIC8vIExpc3Qgb2YgdHlwZXMgaW5mZXJyZWQgaW4gdGhlIG91dGxpbmUuICBFcnJvcnMgaW4gdGhlc2Ugc2hvdWxkIGJlIHJlcG9ydGVkCiAgLy8gZGlmZmVyZW50bHkgdGhhbiBmb3Igc3BlY2lmaWVkIHR5cGVzLgogIC8vIFRPRE8oZG1pdHJ5YXMpOiAgRmluZCBhIHdheSB0byBtYXJrIGluZmVycmVkIHR5cGVzLgogIGZpbmFsIFNldDxEYXJ0VHlwZT4gaW5mZXJyZWRUeXBlcyA9IG5ldyBTZXQ8RGFydFR5cGU+LmlkZW50aXR5KCk7CgogIC8vLyBFeHBvcnRzIHRoYXQgY2FuJ3QgYmUgc2VyaWFsaXplZC4KICAvLy8KICAvLy8gVGhlIGtleSBpcyB0aGUgbmFtZSBvZiB0aGUgZXhwb3J0ZWQgbWVtYmVyLgogIC8vLwogIC8vLyBJZiB0aGUgbmFtZSBpcyBgZHluYW1pY2Agb3IgYHZvaWRgLCB0aGlzIGxpYnJhcnkgcmVleHBvcnRzIHRoZQogIC8vLyBjb3JyZXNwb25kaW5nIHR5cGUgZnJvbSBgZGFydDpjb3JlYCwgYW5kIHRoZSB2YWx1ZSBpcyBudWxsLgogIC8vLwogIC8vLyBPdGhlcndpc2UsIHRoaXMgcmVwcmVzZW50cyBhbiBlcnJvciAoYW4gYW1iaWd1b3VzIGV4cG9ydCkuIEluIHRoaXMgY2FzZSwKICAvLy8gdGhlIGVycm9yIG1lc3NhZ2UgaXMgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gdGhlIG1hcC4KICBNYXA8U3RyaW5nLCBTdHJpbmc+IHVuc2VyaWFsaXphYmxlRXhwb3J0czsKCiAgTGlzdDxLZXJuZWxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiB1bnR5cGVkSW5pdGlhbGl6aW5nRm9ybWFsczsKCiAgS2VybmVsTGlicmFyeUJ1aWxkZXIoVXJpIHVyaSwgVXJpIGZpbGVVcmksIExvYWRlciBsb2FkZXIsIHRoaXMuYWN0dWFsT3JpZ2luLAogICAgICBbU2NvcGUgc2NvcGUsIExpYnJhcnkgdGFyZ2V0XSkKICAgICAgOiBsaWJyYXJ5ID0gdGFyZ2V0ID8/CiAgICAgICAgICAgIChhY3R1YWxPcmlnaW4/LmxpYnJhcnkgPz8gbmV3IExpYnJhcnkodXJpLCBmaWxlVXJpOiBmaWxlVXJpKSksCiAgICAgICAgc3VwZXIobG9hZGVyLCBmaWxlVXJpLCBzY29wZSk7CgogIEBvdmVycmlkZQogIEtlcm5lbExpYnJhcnlCdWlsZGVyIGdldCBvcmlnaW4gPT4gYWN0dWFsT3JpZ2luID8/IHRoaXM7CgogIEBvdmVycmlkZQogIExpYnJhcnkgZ2V0IHRhcmdldCA9PiBsaWJyYXJ5OwoKICBVcmkgZ2V0IHVyaSA9PiBsaWJyYXJ5LmltcG9ydFVyaTsKCiAgdm9pZCBhZGRTeW50aGV0aWNEZWNsYXJhdGlvbk9mRHluYW1pYygpIHsKICAgIGFkZEJ1aWxkZXIoCiAgICAgICAgImR5bmFtaWMiLAogICAgICAgIG5ldyBEeW5hbWljVHlwZUJ1aWxkZXI8S2VybmVsVHlwZUJ1aWxkZXIsIERhcnRUeXBlPigKICAgICAgICAgICAgY29uc3QgRHluYW1pY1R5cGUoKSwgdGhpcywgLTEpLAogICAgICAgIC0xKTsKICB9CgogIEtlcm5lbFR5cGVCdWlsZGVyIGFkZE5hbWVkVHlwZSgKICAgICAgT2JqZWN0IG5hbWUsIExpc3Q8S2VybmVsVHlwZUJ1aWxkZXI+IGFyZ3VtZW50cywgaW50IGNoYXJPZmZzZXQpIHsKICAgIHJldHVybiBhZGRUeXBlKG5ldyBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyKG5hbWUsIGFyZ3VtZW50cyksIGNoYXJPZmZzZXQpOwogIH0KCiAgS2VybmVsVHlwZUJ1aWxkZXIgYWRkTWl4aW5BcHBsaWNhdGlvbihLZXJuZWxUeXBlQnVpbGRlciBzdXBlcnR5cGUsCiAgICAgIExpc3Q8S2VybmVsVHlwZUJ1aWxkZXI+IG1peGlucywgaW50IGNoYXJPZmZzZXQpIHsKICAgIHJldHVybiBhZGRUeXBlKAogICAgICAgIG5ldyBLZXJuZWxNaXhpbkFwcGxpY2F0aW9uQnVpbGRlcihzdXBlcnR5cGUsIG1peGlucyksIGNoYXJPZmZzZXQpOwogIH0KCiAgS2VybmVsVHlwZUJ1aWxkZXIgYWRkVm9pZFR5cGUoaW50IGNoYXJPZmZzZXQpIHsKICAgIHJldHVybiBhZGROYW1lZFR5cGUoInZvaWQiLCBudWxsLCBjaGFyT2Zmc2V0KQogICAgICAuLmJpbmQobmV3IFZvaWRUeXBlQnVpbGRlcjxLZXJuZWxUeXBlQnVpbGRlciwgVm9pZFR5cGU+KAogICAgICAgICAgY29uc3QgVm9pZFR5cGUoKSwgdGhpcywgY2hhck9mZnNldCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgRm9ybWF0dGVkTWVzc2FnZSBhZGRQcm9ibGVtKAogICAgICBNZXNzYWdlIG1lc3NhZ2UsIGludCBjaGFyT2Zmc2V0LCBpbnQgbGVuZ3RoLCBVcmkgZmlsZVVyaSwKICAgICAge2Jvb2wgd2FzSGFuZGxlZDogZmFsc2UsCiAgICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQsCiAgICAgIFNldmVyaXR5IHNldmVyaXR5LAogICAgICBib29sIHByb2JsZW1PbkxpYnJhcnk6IGZhbHNlfSkgewogICAgRm9ybWF0dGVkTWVzc2FnZSBmb3JtYXR0ZWRNZXNzYWdlID0gc3VwZXIuYWRkUHJvYmxlbSgKICAgICAgICBtZXNzYWdlLCBjaGFyT2Zmc2V0LCBsZW5ndGgsIGZpbGVVcmksCiAgICAgICAgd2FzSGFuZGxlZDogd2FzSGFuZGxlZCwKICAgICAgICBjb250ZXh0OiBjb250ZXh0LAogICAgICAgIHNldmVyaXR5OiBzZXZlcml0eSwKICAgICAgICBwcm9ibGVtT25MaWJyYXJ5OiB0cnVlKTsKICAgIGlmIChmb3JtYXR0ZWRNZXNzYWdlICE9IG51bGwpIHsKICAgICAgdGFyZ2V0LnByb2JsZW1zQXNKc29uID8/PSA8U3RyaW5nPltdOwogICAgICB0YXJnZXQucHJvYmxlbXNBc0pzb24uYWRkKGZvcm1hdHRlZE1lc3NhZ2UudG9Kc29uU3RyaW5nKCkpOwogICAgfQogICAgcmV0dXJuIGZvcm1hdHRlZE1lc3NhZ2U7CiAgfQoKICB2b2lkIGFkZENsYXNzKAogICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgU3RyaW5nIGNsYXNzTmFtZSwKICAgICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzLAogICAgICBLZXJuZWxUeXBlQnVpbGRlciBzdXBlcnR5cGUsCiAgICAgIExpc3Q8S2VybmVsVHlwZUJ1aWxkZXI+IGludGVyZmFjZXMsCiAgICAgIGludCBzdGFydENoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhckVuZE9mZnNldCwKICAgICAgaW50IHN1cGVydHlwZU9mZnNldCkgewogICAgLy8gTmVzdGVkIGRlY2xhcmF0aW9uIGJlZ2FuIGluIGBPdXRsaW5lQnVpbGRlci5iZWdpbkNsYXNzRGVjbGFyYXRpb25gLgogICAgdmFyIGRlY2xhcmF0aW9uID0gZW5kTmVzdGVkRGVjbGFyYXRpb24oY2xhc3NOYW1lKQogICAgICAuLnJlc29sdmVUeXBlcyh0eXBlVmFyaWFibGVzLCB0aGlzKTsKICAgIGFzc2VydChkZWNsYXJhdGlvbi5wYXJlbnQgPT0gbGlicmFyeURlY2xhcmF0aW9uKTsKICAgIE1hcDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+IG1lbWJlcnMgPSBkZWNsYXJhdGlvbi5tZW1iZXJzOwogICAgTWFwPFN0cmluZywgTWVtYmVyQnVpbGRlcj4gY29uc3RydWN0b3JzID0gZGVjbGFyYXRpb24uY29uc3RydWN0b3JzOwogICAgTWFwPFN0cmluZywgTWVtYmVyQnVpbGRlcj4gc2V0dGVycyA9IGRlY2xhcmF0aW9uLnNldHRlcnM7CgogICAgU2NvcGUgY2xhc3NTY29wZSA9IG5ldyBTY29wZShtZW1iZXJzLCBzZXR0ZXJzLAogICAgICAgIHNjb3BlLndpdGhUeXBlVmFyaWFibGVzKHR5cGVWYXJpYWJsZXMpLCAiY2xhc3MgJGNsYXNzTmFtZSIsCiAgICAgICAgaXNNb2RpZmlhYmxlOiBmYWxzZSk7CgogICAgLy8gV2hlbiBsb29raW5nIHVwIGEgY29uc3RydWN0b3IsIHdlIGRvbid0IGNvbnNpZGVyIHR5cGUgdmFyaWFibGVzIG9yIHRoZQogICAgLy8gbGlicmFyeSBzY29wZS4KICAgIFNjb3BlIGNvbnN0cnVjdG9yU2NvcGUgPQogICAgICAgIG5ldyBTY29wZShjb25zdHJ1Y3RvcnMsIG51bGwsIG51bGwsIGNsYXNzTmFtZSwgaXNNb2RpZmlhYmxlOiBmYWxzZSk7CiAgICBib29sIGlzTWl4aW5EZWNsYXJhdGlvbiA9IGZhbHNlOwogICAgaWYgKG1vZGlmaWVycyAmIG1peGluRGVjbGFyYXRpb25NYXNrICE9IDApIHsKICAgICAgaXNNaXhpbkRlY2xhcmF0aW9uID0gdHJ1ZTsKICAgICAgbW9kaWZpZXJzID0gKG1vZGlmaWVycyAmIH5taXhpbkRlY2xhcmF0aW9uTWFzaykgfCBhYnN0cmFjdE1hc2s7CiAgICB9CiAgICBpZiAoZGVjbGFyYXRpb24uaGFzQ29uc3RDb25zdHJ1Y3RvcikgewogICAgICBtb2RpZmllcnMgfD0gaGFzQ29uc3RDb25zdHJ1Y3Rvck1hc2s7CiAgICB9CiAgICBDbGFzc0J1aWxkZXIgY2xzID0gbmV3IFNvdXJjZUNsYXNzQnVpbGRlcigKICAgICAgICBtZXRhZGF0YSwKICAgICAgICBtb2RpZmllcnMsCiAgICAgICAgY2xhc3NOYW1lLAogICAgICAgIHR5cGVWYXJpYWJsZXMsCiAgICAgICAgYXBwbHlNaXhpbnMoc3VwZXJ0eXBlLCBzdGFydENoYXJPZmZzZXQsIGNoYXJPZmZzZXQsIGNoYXJFbmRPZmZzZXQsCiAgICAgICAgICAgIGNsYXNzTmFtZSwgaXNNaXhpbkRlY2xhcmF0aW9uLAogICAgICAgICAgICB0eXBlVmFyaWFibGVzOiB0eXBlVmFyaWFibGVzKSwKICAgICAgICBpbnRlcmZhY2VzLAogICAgICAgIGNsYXNzU2NvcGUsCiAgICAgICAgY29uc3RydWN0b3JTY29wZSwKICAgICAgICB0aGlzLAogICAgICAgIG5ldyBMaXN0PENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlcj4uZnJvbShjb25zdHJ1Y3RvclJlZmVyZW5jZXMpLAogICAgICAgIHN0YXJ0Q2hhck9mZnNldCwKICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgIGNoYXJFbmRPZmZzZXQsCiAgICAgICAgaXNNaXhpbkRlY2xhcmF0aW9uOiBpc01peGluRGVjbGFyYXRpb24pOwogICAgbG9hZGVyLnRhcmdldC5tZXRhZGF0YUNvbGxlY3RvcgogICAgICAgID8uc2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQoY2xzLnRhcmdldCwgZG9jdW1lbnRhdGlvbkNvbW1lbnQpOwoKICAgIGNvbnN0cnVjdG9yUmVmZXJlbmNlcy5jbGVhcigpOwogICAgTWFwPFN0cmluZywgVHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlc0J5TmFtZSA9CiAgICAgICAgY2hlY2tUeXBlVmFyaWFibGVzKHR5cGVWYXJpYWJsZXMsIGNscyk7CiAgICB2b2lkIHNldFBhcmVudChTdHJpbmcgbmFtZSwgTWVtYmVyQnVpbGRlciBtZW1iZXIpIHsKICAgICAgd2hpbGUgKG1lbWJlciAhPSBudWxsKSB7CiAgICAgICAgbWVtYmVyLnBhcmVudCA9IGNsczsKICAgICAgICBtZW1iZXIgPSBtZW1iZXIubmV4dDsKICAgICAgfQogICAgfQoKICAgIHZvaWQgc2V0UGFyZW50QW5kQ2hlY2tDb25mbGljdHMoU3RyaW5nIG5hbWUsIE1lbWJlckJ1aWxkZXIgbWVtYmVyKSB7CiAgICAgIGlmICh0eXBlVmFyaWFibGVzQnlOYW1lICE9IG51bGwpIHsKICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyIHR2ID0gdHlwZVZhcmlhYmxlc0J5TmFtZVtuYW1lXTsKICAgICAgICBpZiAodHYgIT0gbnVsbCkgewogICAgICAgICAgY2xzLmFkZFByb2JsZW0odGVtcGxhdGVDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlLndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICAgICAgbWVtYmVyLmNoYXJPZmZzZXQsIG5hbWUubGVuZ3RoLAogICAgICAgICAgICAgIGNvbnRleHQ6IFsKICAgICAgICAgICAgICAgIG1lc3NhZ2VDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlQ2F1c2Uud2l0aExvY2F0aW9uKAogICAgICAgICAgICAgICAgICAgIHR2LmZpbGVVcmksIHR2LmNoYXJPZmZzZXQsIG5hbWUubGVuZ3RoKQogICAgICAgICAgICAgIF0pOwogICAgICAgIH0KICAgICAgfQogICAgICBzZXRQYXJlbnQobmFtZSwgbWVtYmVyKTsKICAgIH0KCiAgICBtZW1iZXJzLmZvckVhY2goc2V0UGFyZW50QW5kQ2hlY2tDb25mbGljdHMpOwogICAgY29uc3RydWN0b3JzLmZvckVhY2goc2V0UGFyZW50QW5kQ2hlY2tDb25mbGljdHMpOwogICAgc2V0dGVycy5mb3JFYWNoKHNldFBhcmVudEFuZENoZWNrQ29uZmxpY3RzKTsKICAgIGFkZEJ1aWxkZXIoY2xhc3NOYW1lLCBjbHMsIGNoYXJPZmZzZXQpOwogIH0KCiAgTWFwPFN0cmluZywgVHlwZVZhcmlhYmxlQnVpbGRlcj4gY2hlY2tUeXBlVmFyaWFibGVzKAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMsIERlY2xhcmF0aW9uIG93bmVyKSB7CiAgICBpZiAodHlwZVZhcmlhYmxlcz8uaXNFbXB0eSA/PyB0cnVlKSByZXR1cm4gbnVsbDsKICAgIE1hcDxTdHJpbmcsIFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXNCeU5hbWUgPQogICAgICAgIDxTdHJpbmcsIFR5cGVWYXJpYWJsZUJ1aWxkZXI+e307CiAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgdHYgaW4gdHlwZVZhcmlhYmxlcykgewogICAgICBUeXBlVmFyaWFibGVCdWlsZGVyIGV4aXN0aW5nID0gdHlwZVZhcmlhYmxlc0J5TmFtZVt0di5uYW1lXTsKICAgICAgaWYgKGV4aXN0aW5nICE9IG51bGwpIHsKICAgICAgICBhZGRQcm9ibGVtKG1lc3NhZ2VUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZSwgdHYuY2hhck9mZnNldCwKICAgICAgICAgICAgdHYubmFtZS5sZW5ndGgsIGZpbGVVcmksCiAgICAgICAgICAgIGNvbnRleHQ6IFsKICAgICAgICAgICAgICB0ZW1wbGF0ZVR5cGVWYXJpYWJsZUR1cGxpY2F0ZWROYW1lQ2F1c2UKICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHModHYubmFtZSkKICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICAgIGZpbGVVcmksIGV4aXN0aW5nLmNoYXJPZmZzZXQsIGV4aXN0aW5nLm5hbWUubGVuZ3RoKQogICAgICAgICAgICBdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0eXBlVmFyaWFibGVzQnlOYW1lW3R2Lm5hbWVdID0gdHY7CiAgICAgICAgaWYgKG93bmVyIGlzIENsYXNzQnVpbGRlcikgewogICAgICAgICAgLy8gT25seSBjbGFzc2VzIGFuZCB0eXBlIHZhcmlhYmxlcyBjYW4ndCBoYXZlIHRoZSBzYW1lIG5hbWUuIFNlZQogICAgICAgICAgLy8gWyMyOTU1NV0oaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzI5NTU1KS4KICAgICAgICAgIGlmICh0di5uYW1lID09IG93bmVyLm5hbWUpIHsKICAgICAgICAgICAgYWRkUHJvYmxlbShtZXNzYWdlVHlwZVZhcmlhYmxlU2FtZU5hbWVBc0VuY2xvc2luZywgdHYuY2hhck9mZnNldCwKICAgICAgICAgICAgICAgIHR2Lm5hbWUubGVuZ3RoLCBmaWxlVXJpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0eXBlVmFyaWFibGVzQnlOYW1lOwogIH0KCiAgS2VybmVsVHlwZUJ1aWxkZXIgYXBwbHlNaXhpbnMoCiAgICAgIEtlcm5lbFR5cGVCdWlsZGVyIHR5cGUsCiAgICAgIGludCBzdGFydENoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhckVuZE9mZnNldCwKICAgICAgU3RyaW5nIHN1YmNsYXNzTmFtZSwKICAgICAgYm9vbCBpc01peGluRGVjbGFyYXRpb24sCiAgICAgIHtTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgTGlzdDxLZXJuZWxUeXBlQnVpbGRlcj4gaW50ZXJmYWNlc30pIHsKICAgIGlmIChuYW1lID09IG51bGwpIHsKICAgICAgLy8gVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBidWlsZGluZyBhIG5hbWVkCiAgICAgIC8vIG1peGluIGFwcGxpY2F0aW9uLgogICAgICBpZiAoZG9jdW1lbnRhdGlvbkNvbW1lbnQgIT0gbnVsbCkgewogICAgICAgIHVuaGFuZGxlZCgiZG9jdW1lbnRhdGlvbkNvbW1lbnQiLCAidW5uYW1lZCBtaXhpbiBhcHBsaWNhdGlvbiIsCiAgICAgICAgICAgIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgICB9IGVsc2UgaWYgKG1ldGFkYXRhICE9IG51bGwpIHsKICAgICAgICB1bmhhbmRsZWQoIm1ldGFkYXRhIiwgInVubmFtZWQgbWl4aW4gYXBwbGljYXRpb24iLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgICAgfSBlbHNlIGlmIChpbnRlcmZhY2VzICE9IG51bGwpIHsKICAgICAgICB1bmhhbmRsZWQoCiAgICAgICAgICAgICJpbnRlcmZhY2VzIiwgInVubmFtZWQgbWl4aW4gYXBwbGljYXRpb24iLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgICAgfQogICAgfQogICAgaWYgKHR5cGUgaXMgS2VybmVsTWl4aW5BcHBsaWNhdGlvbkJ1aWxkZXIpIHsKICAgICAgLy8gRG9jdW1lbnRhdGlvbiBiZWxvdyBhc3N1bWVzIHRoZSBnaXZlbiBtaXhpbiBhcHBsaWNhdGlvbiBpcyBpbiBvbmUgb2YKICAgICAgLy8gdGhlc2UgZm9ybXM6CiAgICAgIC8vCiAgICAgIC8vICAgICBjbGFzcyBDIGV4dGVuZHMgUyB3aXRoIE0xLCBNMiwgTTM7CiAgICAgIC8vICAgICBjbGFzcyBOYW1lZCA9IFMgd2l0aCBNMSwgTTIsIE0zOwogICAgICAvLwogICAgICAvLyBXaGVuIHdlIHJlZmVyIHRvIHRoZSBzdWJjbGFzcywgd2UgbWVhbiBgQ2Agb3IgYE5hbWVkYC4KCiAgICAgIC8vLyBUaGUgY3VycmVudCBzdXBlcnR5cGUuCiAgICAgIC8vLwogICAgICAvLy8gU3RhcnRzIG91dCBoYXZpbmcgdGhlIHZhbHVlIGBTYCBhbmQgb24gZWFjaCBpdGVyYXRpb24gb2YgdGhlIGxvb3AKICAgICAgLy8vIGJlbG93LCBpdCB3aWxsIHRha2Ugb24gdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG86CiAgICAgIC8vLwogICAgICAvLy8gMS4gYFMgd2l0aCBNMWAuCiAgICAgIC8vLyAyLiBgKFMgd2l0aCBNMSkgd2l0aCBNMmAuCiAgICAgIC8vLyAzLiBgKChTIHdpdGggTTEpIHdpdGggTTIpIHdpdGggTTNgLgogICAgICBLZXJuZWxUeXBlQnVpbGRlciBzdXBlcnR5cGUgPSB0eXBlLnN1cGVydHlwZSA/PyBsb2FkZXIudGFyZ2V0Lm9iamVjdFR5cGU7CgogICAgICAvLy8gVGhlIHZhcmlhYmxlIHBhcnQgb2YgdGhlIG1peGluIGFwcGxpY2F0aW9uJ3Mgc3ludGhldGljIG5hbWUuIEl0CiAgICAgIC8vLyBzdGFydHMgb3V0IGFzIHRoZSBuYW1lIG9mIHRoZSBzdXBlcmNsYXNzLCBidXQgaXMgb25seSB1c2VkIGFmdGVyIGl0CiAgICAgIC8vLyBoYXMgYmVlbiBjb21iaW5lZCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IG1peGluLiBJbiB0aGUgZXhhbXBsZXMKICAgICAgLy8vIGZyb20gYWJvdmUsIGl0IHdpbGwgdGFrZSB0aGVzZSB2YWx1ZXM6CiAgICAgIC8vLwogICAgICAvLy8gMS4gYFMmTTFgCiAgICAgIC8vLyAyLiBgUyZNMSZNMmAKICAgICAgLy8vIDMuIGBTJk0xJk0yJk0zYC4KICAgICAgLy8vCiAgICAgIC8vLyBUaGUgZnVsbCBuYW1lIG9mIHRoZSBtaXhpbiBhcHBsaWNhdGlvbiBpcyBvYnRhaW5lZCBieSBwcmVwZW5kaW5nIHRoZQogICAgICAvLy8gbmFtZSBvZiB0aGUgc3ViY2xhc3MgKGBDYCBvciBgTmFtZWRgIGluIHRoZSBhYm92ZSBleGFtcGxlcykgdG8gdGhlCiAgICAgIC8vLyBydW5uaW5nIG5hbWUuIEZvciB0aGUgZXhhbXBsZSBgQ2AsIHRoYXQgbGVhZHMgdG8gdGhlc2UgZnVsbCBuYW1lczoKICAgICAgLy8vCiAgICAgIC8vLyAxLiBgX0MmUyZNMWAKICAgICAgLy8vIDIuIGBfQyZTJk0xJk0yYAogICAgICAvLy8gMy4gYF9DJlMmTTEmTTImTTNgLgogICAgICAvLy8KICAgICAgLy8vIEZvciBhIG5hbWVkIG1peGluIGFwcGxpY2F0aW9uLCB0aGUgbGFzdCBuYW1lIGhhcyBiZWVuIGdpdmVuIGJ5IHRoZQogICAgICAvLy8gcHJvZ3JhbW1lciwgc28gZm9yIHRoZSBleGFtcGxlIGBOYW1lZGAgd2Ugc2VlIHRoZXNlIGZ1bGwgbmFtZXM6CiAgICAgIC8vLwogICAgICAvLy8gMS4gYF9OYW1lZCZTJk0xYAogICAgICAvLy8gMi4gYF9OYW1lZCZTJk0xJk0yYAogICAgICAvLy8gMy4gYE5hbWVkYC4KICAgICAgU3RyaW5nIHJ1bm5pbmdOYW1lID0gZXh0cmFjdE5hbWUoc3VwZXJ0eXBlLm5hbWUpOwoKICAgICAgLy8vIFRydWUgd2hlbiB3ZSdyZSBidWlsZGluZyBhIG5hbWVkIG1peGluIGFwcGxpY2F0aW9uLiBOb3RpY2UgdGhhdCBmb3IKICAgICAgLy8vIHRoZSBgTmFtZWRgIGV4YW1wbGUgYWJvdmUsIHRoaXMgaXMgb25seSB0cnVlIG9uIHRoZSBsYXN0CiAgICAgIC8vLyBpdGVyYXRpb24gYmVjYXVzZSBvbmx5IHRoZSBmdWxsIG1peGluIGFwcGxpY2F0aW9uIGlzIG5hbWVkLgogICAgICBib29sIGlzTmFtZWRNaXhpbkFwcGxpY2F0aW9uOwoKICAgICAgLy8vIFRoZSBuYW1lcyBvZiB0aGUgdHlwZSB2YXJpYWJsZXMgb2YgdGhlIHN1YmNsYXNzLgogICAgICBTZXQ8U3RyaW5nPiB0eXBlVmFyaWFibGVOYW1lczsKICAgICAgaWYgKHR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICAgIHR5cGVWYXJpYWJsZU5hbWVzID0gbmV3IFNldDxTdHJpbmc+KCk7CiAgICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIHR5cGVWYXJpYWJsZSBpbiB0eXBlVmFyaWFibGVzKSB7CiAgICAgICAgICB0eXBlVmFyaWFibGVOYW1lcy5hZGQodHlwZVZhcmlhYmxlLm5hbWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8vIEhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYHRydWVgIGlmIGEgdHlwZSB2YXJpYWJsZSB3aXRoIGEgbmFtZQogICAgICAvLy8gZnJvbSBbdHlwZVZhcmlhYmxlTmFtZXNdIGlzIHJlZmVyZW5jZWQgaW4gW3R5cGVdLgogICAgICBib29sIHVzZXNUeXBlVmFyaWFibGVzKEtlcm5lbFR5cGVCdWlsZGVyIHR5cGUpIHsKICAgICAgICBpZiAodHlwZSBpcyBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyKSB7CiAgICAgICAgICBpZiAodHlwZS5kZWNsYXJhdGlvbiBpcyBLZXJuZWxUeXBlVmFyaWFibGVCdWlsZGVyKSB7CiAgICAgICAgICAgIHJldHVybiB0eXBlVmFyaWFibGVOYW1lcy5jb250YWlucyh0eXBlLmRlY2xhcmF0aW9uLm5hbWUpOwogICAgICAgICAgfQoKICAgICAgICAgIExpc3Q8S2VybmVsVHlwZUJ1aWxkZXI+IHR5cGVBcmd1bWVudHMgPSB0eXBlLmFyZ3VtZW50czsKICAgICAgICAgIGlmICh0eXBlQXJndW1lbnRzICE9IG51bGwgJiYgdHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgICAgICAgIGZvciAoS2VybmVsVHlwZUJ1aWxkZXIgYXJndW1lbnQgaW4gdHlwZUFyZ3VtZW50cykgewogICAgICAgICAgICAgIGlmICh1c2VzVHlwZVZhcmlhYmxlcyhhcmd1bWVudCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodHlwZSBpcyBLZXJuZWxGdW5jdGlvblR5cGVCdWlsZGVyKSB7CiAgICAgICAgICBpZiAodHlwZS5mb3JtYWxzICE9IG51bGwpIHsKICAgICAgICAgICAgZm9yIChGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGZvcm1hbCBpbiB0eXBlLmZvcm1hbHMpIHsKICAgICAgICAgICAgICBpZiAodXNlc1R5cGVWYXJpYWJsZXMoZm9ybWFsLnR5cGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB1c2VzVHlwZVZhcmlhYmxlcyh0eXBlLnJldHVyblR5cGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8vLyBJdGVyYXRlIG92ZXIgdGhlIG1peGlucyBmcm9tIGxlZnQgdG8gcmlnaHQuIEF0IHRoZSBlbmQgb2YgZWFjaAogICAgICAvLy8gaXRlcmF0aW9uLCBhIG5ldyBbc3VwZXJ0eXBlXSBpcyBjb21wdXRlZCB0aGF0IGlzIHRoZSBtaXhpbgogICAgICAvLy8gYXBwbGljYXRpb24gb2YgW3N1cGVydHlwZV0gd2l0aCB0aGUgY3VycmVudCBtaXhpbi4KICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLm1peGlucy5sZW5ndGg7IGkrKykgewogICAgICAgIEtlcm5lbFR5cGVCdWlsZGVyIG1peGluID0gdHlwZS5taXhpbnNbaV07CiAgICAgICAgaXNOYW1lZE1peGluQXBwbGljYXRpb24gPSBuYW1lICE9IG51bGwgJiYgbWl4aW4gPT0gdHlwZS5taXhpbnMubGFzdDsKICAgICAgICBib29sIGlzR2VuZXJpYyA9IGZhbHNlOwogICAgICAgIGlmICghaXNOYW1lZE1peGluQXBwbGljYXRpb24pIHsKICAgICAgICAgIGlmIChzdXBlcnR5cGUgaXMgS2VybmVsTmFtZWRUeXBlQnVpbGRlcikgewogICAgICAgICAgICBpc0dlbmVyaWMgPSBpc0dlbmVyaWMgfHwgdXNlc1R5cGVWYXJpYWJsZXMoc3VwZXJ0eXBlKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtaXhpbiBpcyBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyKSB7CiAgICAgICAgICAgIHJ1bm5pbmdOYW1lICs9ICImJHtleHRyYWN0TmFtZShtaXhpbi5uYW1lKX0iOwogICAgICAgICAgICBpc0dlbmVyaWMgPSBpc0dlbmVyaWMgfHwgdXNlc1R5cGVWYXJpYWJsZXMobWl4aW4pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBTdHJpbmcgZnVsbG5hbWUgPQogICAgICAgICAgICBpc05hbWVkTWl4aW5BcHBsaWNhdGlvbiA/IG5hbWUgOiAiXyRzdWJjbGFzc05hbWUmJHJ1bm5pbmdOYW1lIjsKICAgICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IGFwcGxpY2F0aW9uVHlwZVZhcmlhYmxlczsKICAgICAgICBMaXN0PEtlcm5lbFR5cGVCdWlsZGVyPiBhcHBsaWNhdGlvblR5cGVBcmd1bWVudHM7CiAgICAgICAgaWYgKGlzTmFtZWRNaXhpbkFwcGxpY2F0aW9uKSB7CiAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbmFtZWQgbWl4aW4gYXBwbGljYXRpb24sIGl0IG11c3QgYmUgZ2l2ZW4gYWxsIHRoZQogICAgICAgICAgLy8gZGVjbGFyYXRlZCB0eXBlIHZhcmlhYmxlcy4KICAgICAgICAgIGFwcGxpY2F0aW9uVHlwZVZhcmlhYmxlcyA9IHR5cGVWYXJpYWJsZXM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgcGFzcyB0aGUgZnJlc2ggdHlwZSB2YXJpYWJsZXMgdG8gdGhlIG1peGluCiAgICAgICAgICAvLyBhcHBsaWNhdGlvbiBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5J3JlIGRlY2xhcmVkIG9uIHRoZSBzdWJjbGFzcy4KICAgICAgICAgIGlmIChpc0dlbmVyaWMpIHsKICAgICAgICAgICAgdGhpcy5iZWdpbk5lc3RlZERlY2xhcmF0aW9uKCJtaXhpbiBhcHBsaWNhdGlvbiIpOwoKICAgICAgICAgICAgYXBwbGljYXRpb25UeXBlVmFyaWFibGVzID0KICAgICAgICAgICAgICAgIGNvcHlUeXBlVmFyaWFibGVzKHR5cGVWYXJpYWJsZXMsIGN1cnJlbnREZWNsYXJhdGlvbik7CgogICAgICAgICAgICBMaXN0PFR5cGVCdWlsZGVyPiBuZXdUeXBlcyA9IDxUeXBlQnVpbGRlcj5bXTsKICAgICAgICAgICAgaWYgKHN1cGVydHlwZSBpcyBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyICYmCiAgICAgICAgICAgICAgICBzdXBlcnR5cGUuYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1cGVydHlwZS5hcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgIHN1cGVydHlwZS5hcmd1bWVudHNbaV0gPSBzdXBlcnR5cGUuYXJndW1lbnRzW2ldLmNsb25lKG5ld1R5cGVzKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1peGluIGlzIEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIgJiYgbWl4aW4uYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1peGluLmFyZ3VtZW50cy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgbWl4aW4uYXJndW1lbnRzW2ldID0gbWl4aW4uYXJndW1lbnRzW2ldLmNsb25lKG5ld1R5cGVzKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChUeXBlQnVpbGRlciBuZXdUeXBlIGluIG5ld1R5cGVzKSB7CiAgICAgICAgICAgICAgY3VycmVudERlY2xhcmF0aW9uLmFkZFR5cGUoCiAgICAgICAgICAgICAgICAgIG5ldyBVbnJlc29sdmVkVHlwZTxLZXJuZWxUeXBlQnVpbGRlcj4obmV3VHlwZSwgLTEsIG51bGwpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgRGVjbGFyYXRpb25CdWlsZGVyIG1peGluRGVjbGFyYXRpb24gPQogICAgICAgICAgICAgICAgdGhpcy5lbmROZXN0ZWREZWNsYXJhdGlvbigibWl4aW4gYXBwbGljYXRpb24iKTsKICAgICAgICAgICAgbWl4aW5EZWNsYXJhdGlvbi5yZXNvbHZlVHlwZXMoYXBwbGljYXRpb25UeXBlVmFyaWFibGVzLCB0aGlzKTsKCiAgICAgICAgICAgIGFwcGxpY2F0aW9uVHlwZUFyZ3VtZW50cyA9IDxLZXJuZWxUeXBlQnVpbGRlcj5bXTsKICAgICAgICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIHR5cGVWYXJpYWJsZSBpbiB0eXBlVmFyaWFibGVzKSB7CiAgICAgICAgICAgICAgYXBwbGljYXRpb25UeXBlQXJndW1lbnRzCiAgICAgICAgICAgICAgICAgIC5hZGQoYWRkTmFtZWRUeXBlKHR5cGVWYXJpYWJsZS5uYW1lLCBudWxsLCBjaGFyT2Zmc2V0KS4uYmluZCgKICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB0eXBlIHZhcmlhYmxlIHR5cGVzIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAvLyBnZW5lcmljIGNsYXNzIHJlcHJlc2VudGluZyB0aGUgYW5vbnltb3VzIG1peGluCiAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBsaWNhdGlvbiBzaG91bGQgcmVmZXIgYmFjayB0byB0aGUgdHlwZSB2YXJpYWJsZXMgb2YKICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjbGFzcyB0aGF0IGV4dGVuZCB0aGUgYW5vbnltb3VzIG1peGluIGFwcGxpY2F0aW9uLgogICAgICAgICAgICAgICAgICAgICAgdHlwZVZhcmlhYmxlKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZmluYWwgaW50IGNvbXB1dGVkU3RhcnRDaGFyT2Zmc2V0ID0KICAgICAgICAgICAgKGlzTmFtZWRNaXhpbkFwcGxpY2F0aW9uID8gbWV0YWRhdGEgOiBudWxsKSA9PSBudWxsCiAgICAgICAgICAgICAgICA/IHN0YXJ0Q2hhck9mZnNldAogICAgICAgICAgICAgICAgOiBtZXRhZGF0YS5maXJzdC5jaGFyT2Zmc2V0OwogICAgICAgIFNvdXJjZUNsYXNzQnVpbGRlciBhcHBsaWNhdGlvbiA9IG5ldyBTb3VyY2VDbGFzc0J1aWxkZXIoCiAgICAgICAgICAgIGlzTmFtZWRNaXhpbkFwcGxpY2F0aW9uID8gbWV0YWRhdGEgOiBudWxsLAogICAgICAgICAgICBpc05hbWVkTWl4aW5BcHBsaWNhdGlvbgogICAgICAgICAgICAgICAgPyBtb2RpZmllcnMgfCBuYW1lZE1peGluQXBwbGljYXRpb25NYXNrCiAgICAgICAgICAgICAgICA6IGFic3RyYWN0TWFzaywKICAgICAgICAgICAgZnVsbG5hbWUsCiAgICAgICAgICAgIGFwcGxpY2F0aW9uVHlwZVZhcmlhYmxlcywKICAgICAgICAgICAgaXNNaXhpbkRlY2xhcmF0aW9uID8gbnVsbCA6IHN1cGVydHlwZSwKICAgICAgICAgICAgaXNOYW1lZE1peGluQXBwbGljYXRpb24KICAgICAgICAgICAgICAgID8gaW50ZXJmYWNlcwogICAgICAgICAgICAgICAgOiBpc01peGluRGVjbGFyYXRpb24gPyBbc3VwZXJ0eXBlLCBtaXhpbl0gOiBudWxsLAogICAgICAgICAgICBuZXcgU2NvcGUoPFN0cmluZywgTWVtYmVyQnVpbGRlcj57fSwgPFN0cmluZywgTWVtYmVyQnVpbGRlcj57fSwKICAgICAgICAgICAgICAgIHNjb3BlLndpdGhUeXBlVmFyaWFibGVzKHR5cGVWYXJpYWJsZXMpLAogICAgICAgICAgICAgICAgIm1peGluICRmdWxsbmFtZSAiLCBpc01vZGlmaWFibGU6IGZhbHNlKSwKICAgICAgICAgICAgbmV3IFNjb3BlKDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+e30sIG51bGwsIG51bGwsIGZ1bGxuYW1lLAogICAgICAgICAgICAgICAgaXNNb2RpZmlhYmxlOiBmYWxzZSksCiAgICAgICAgICAgIHRoaXMsCiAgICAgICAgICAgIDxDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXI+W10sCiAgICAgICAgICAgIGNvbXB1dGVkU3RhcnRDaGFyT2Zmc2V0LAogICAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgICBjaGFyRW5kT2Zmc2V0LAogICAgICAgICAgICBtaXhlZEluVHlwZTogaXNNaXhpbkRlY2xhcmF0aW9uID8gbnVsbCA6IG1peGluKTsKICAgICAgICBpZiAoaXNOYW1lZE1peGluQXBwbGljYXRpb24pIHsKICAgICAgICAgIGxvYWRlci50YXJnZXQubWV0YWRhdGFDb2xsZWN0b3I/LnNldERvY3VtZW50YXRpb25Db21tZW50KAogICAgICAgICAgICAgIGFwcGxpY2F0aW9uLnRhcmdldCwgZG9jdW1lbnRhdGlvbkNvbW1lbnQpOwogICAgICAgIH0KICAgICAgICAvLyBUT0RPKGFoZSwga21pbGxpa2luKTogU2hvdWxkIGFsd2F5cyBiZSB0cnVlPwogICAgICAgIC8vIHBrZy9hbmFseXplci90ZXN0L3NyYy9zdW1tYXJ5L3Jlc3ludGhlc2l6ZV9rZXJuZWxfdGVzdC5kYXJ0IGNhbid0CiAgICAgICAgLy8gaGFuZGxlIHRoYXQgOigKICAgICAgICBhcHBsaWNhdGlvbi5jbHMuaXNBbm9ueW1vdXNNaXhpbiA9ICFpc05hbWVkTWl4aW5BcHBsaWNhdGlvbjsKICAgICAgICBhZGRCdWlsZGVyKGZ1bGxuYW1lLCBhcHBsaWNhdGlvbiwgY2hhck9mZnNldCk7CiAgICAgICAgc3VwZXJ0eXBlID0KICAgICAgICAgICAgYWRkTmFtZWRUeXBlKGZ1bGxuYW1lLCBhcHBsaWNhdGlvblR5cGVBcmd1bWVudHMsIGNoYXJPZmZzZXQpOwogICAgICB9CiAgICAgIHJldHVybiBzdXBlcnR5cGU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdHlwZTsKICAgIH0KICB9CgogIHZvaWQgYWRkTmFtZWRNaXhpbkFwcGxpY2F0aW9uKAogICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgS2VybmVsVHlwZUJ1aWxkZXIgbWl4aW5BcHBsaWNhdGlvbiwKICAgICAgTGlzdDxLZXJuZWxUeXBlQnVpbGRlcj4gaW50ZXJmYWNlcywKICAgICAgaW50IHN0YXJ0Q2hhck9mZnNldCwKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyRW5kT2Zmc2V0KSB7CiAgICAvLyBOZXN0ZWQgZGVjbGFyYXRpb24gYmVnYW4gaW4gYE91dGxpbmVCdWlsZGVyLmJlZ2luTmFtZWRNaXhpbkFwcGxpY2F0aW9uYC4KICAgIGVuZE5lc3RlZERlY2xhcmF0aW9uKG5hbWUpLnJlc29sdmVUeXBlcyh0eXBlVmFyaWFibGVzLCB0aGlzKTsKICAgIEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIgc3VwZXJ0eXBlID0gYXBwbHlNaXhpbnMobWl4aW5BcHBsaWNhdGlvbiwKICAgICAgICBzdGFydENoYXJPZmZzZXQsIGNoYXJPZmZzZXQsIGNoYXJFbmRPZmZzZXQsIG5hbWUsIGZhbHNlLAogICAgICAgIGRvY3VtZW50YXRpb25Db21tZW50OiBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGEsCiAgICAgICAgbmFtZTogbmFtZSwKICAgICAgICB0eXBlVmFyaWFibGVzOiB0eXBlVmFyaWFibGVzLAogICAgICAgIG1vZGlmaWVyczogbW9kaWZpZXJzLAogICAgICAgIGludGVyZmFjZXM6IGludGVyZmFjZXMpOwogICAgY2hlY2tUeXBlVmFyaWFibGVzKHR5cGVWYXJpYWJsZXMsIHN1cGVydHlwZS5kZWNsYXJhdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZEZpZWxkKAogICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgS2VybmVsVHlwZUJ1aWxkZXIgdHlwZSwKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhckVuZE9mZnNldCwKICAgICAgVG9rZW4gaW5pdGlhbGl6ZXJUb2tlbkZvckluZmVyZW5jZSwKICAgICAgYm9vbCBoYXNJbml0aWFsaXplcikgewogICAgaWYgKGhhc0luaXRpYWxpemVyKSB7CiAgICAgIG1vZGlmaWVycyB8PSBoYXNJbml0aWFsaXplck1hc2s7CiAgICB9CiAgICBLZXJuZWxGaWVsZEJ1aWxkZXIgZmllbGQgPSBuZXcgS2VybmVsRmllbGRCdWlsZGVyKAogICAgICAgIG1ldGFkYXRhLCB0eXBlLCBuYW1lLCBtb2RpZmllcnMsIHRoaXMsIGNoYXJPZmZzZXQsIGNoYXJFbmRPZmZzZXQpOwogICAgYWRkQnVpbGRlcihuYW1lLCBmaWVsZCwgY2hhck9mZnNldCk7CiAgICBpZiAoaW5pdGlhbGl6ZXJUb2tlbkZvckluZmVyZW5jZSAhPSBudWxsKSB7CiAgICAgIGFzc2VydCh0eXBlID09IG51bGwpOwogICAgICBmaWVsZC50YXJnZXQudHlwZSA9CiAgICAgICAgICBuZXcgSW1wbGljaXRGaWVsZFR5cGUoZmllbGQsIGluaXRpYWxpemVyVG9rZW5Gb3JJbmZlcmVuY2UpOwogICAgfQogICAgbG9hZGVyLnRhcmdldC5tZXRhZGF0YUNvbGxlY3RvcgogICAgICAgID8uc2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQoZmllbGQudGFyZ2V0LCBkb2N1bWVudGF0aW9uQ29tbWVudCk7CiAgfQoKICB2b2lkIGFkZENvbnN0cnVjdG9yKAogICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgS2VybmVsVHlwZUJ1aWxkZXIgcmV0dXJuVHlwZSwKICAgICAgZmluYWwgT2JqZWN0IG5hbWUsCiAgICAgIFN0cmluZyBjb25zdHJ1Y3Rvck5hbWUsCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywKICAgICAgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBmb3JtYWxzLAogICAgICBpbnQgc3RhcnRDaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhck9mZnNldCwKICAgICAgaW50IGNoYXJPcGVuUGFyZW5PZmZzZXQsCiAgICAgIGludCBjaGFyRW5kT2Zmc2V0LAogICAgICBTdHJpbmcgbmF0aXZlTWV0aG9kTmFtZSkgewogICAgTWV0YWRhdGFDb2xsZWN0b3IgbWV0YWRhdGFDb2xsZWN0b3IgPSBsb2FkZXIudGFyZ2V0Lm1ldGFkYXRhQ29sbGVjdG9yOwogICAgUHJvY2VkdXJlQnVpbGRlciBwcm9jZWR1cmUgPSBuZXcgS2VybmVsQ29uc3RydWN0b3JCdWlsZGVyKAogICAgICAgIG1ldGFkYXRhLAogICAgICAgIG1vZGlmaWVycyAmIH5hYnN0cmFjdE1hc2ssCiAgICAgICAgcmV0dXJuVHlwZSwKICAgICAgICBjb25zdHJ1Y3Rvck5hbWUsCiAgICAgICAgdHlwZVZhcmlhYmxlcywKICAgICAgICBmb3JtYWxzLAogICAgICAgIHRoaXMsCiAgICAgICAgc3RhcnRDaGFyT2Zmc2V0LAogICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgY2hhck9wZW5QYXJlbk9mZnNldCwKICAgICAgICBjaGFyRW5kT2Zmc2V0LAogICAgICAgIG5hdGl2ZU1ldGhvZE5hbWUpOwogICAgaWYgKGZvcm1hbHMgIT0gbnVsbCkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZvcm1hbHMubGVuZ3RoOyBpKyspIHsKICAgICAgICBmb3JtYWxzW2ldLnBhcmVudCA9IHByb2NlZHVyZTsKICAgICAgfQogICAgfQogICAgbWV0YWRhdGFDb2xsZWN0b3I/LnNldERvY3VtZW50YXRpb25Db21tZW50KAogICAgICAgIHByb2NlZHVyZS50YXJnZXQsIGRvY3VtZW50YXRpb25Db21tZW50KTsKICAgIG1ldGFkYXRhQ29sbGVjdG9yPy5zZXRDb25zdHJ1Y3Rvck5hbWVPZmZzZXQocHJvY2VkdXJlLnRhcmdldCwgbmFtZSk7CiAgICBjaGVja1R5cGVWYXJpYWJsZXModHlwZVZhcmlhYmxlcywgcHJvY2VkdXJlKTsKICAgIGFkZEJ1aWxkZXIoY29uc3RydWN0b3JOYW1lLCBwcm9jZWR1cmUsIGNoYXJPZmZzZXQpOwogICAgaWYgKG5hdGl2ZU1ldGhvZE5hbWUgIT0gbnVsbCkgewogICAgICBhZGROYXRpdmVNZXRob2QocHJvY2VkdXJlKTsKICAgIH0KICAgIGlmIChwcm9jZWR1cmUuaXNDb25zdCkgY3VycmVudERlY2xhcmF0aW9uPy5oYXNDb25zdENvbnN0cnVjdG9yID0gdHJ1ZTsKICB9CgogIHZvaWQgYWRkUHJvY2VkdXJlKAogICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgS2VybmVsVHlwZUJ1aWxkZXIgcmV0dXJuVHlwZSwKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywKICAgICAgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBmb3JtYWxzLAogICAgICBQcm9jZWR1cmVLaW5kIGtpbmQsCiAgICAgIGludCBzdGFydENoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhck9wZW5QYXJlbk9mZnNldCwKICAgICAgaW50IGNoYXJFbmRPZmZzZXQsCiAgICAgIFN0cmluZyBuYXRpdmVNZXRob2ROYW1lLAogICAgICB7Ym9vbCBpc1RvcExldmVsfSkgewogICAgTWV0YWRhdGFDb2xsZWN0b3IgbWV0YWRhdGFDb2xsZWN0b3IgPSBsb2FkZXIudGFyZ2V0Lm1ldGFkYXRhQ29sbGVjdG9yOwogICAgUHJvY2VkdXJlQnVpbGRlciBwcm9jZWR1cmUgPSBuZXcgS2VybmVsUHJvY2VkdXJlQnVpbGRlcigKICAgICAgICBtZXRhZGF0YSwKICAgICAgICBtb2RpZmllcnMsCiAgICAgICAgcmV0dXJuVHlwZSwKICAgICAgICBuYW1lLAogICAgICAgIHR5cGVWYXJpYWJsZXMsCiAgICAgICAgZm9ybWFscywKICAgICAgICBraW5kLAogICAgICAgIHRoaXMsCiAgICAgICAgc3RhcnRDaGFyT2Zmc2V0LAogICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgY2hhck9wZW5QYXJlbk9mZnNldCwKICAgICAgICBjaGFyRW5kT2Zmc2V0LAogICAgICAgIG5hdGl2ZU1ldGhvZE5hbWUpOwogICAgbWV0YWRhdGFDb2xsZWN0b3I/LnNldERvY3VtZW50YXRpb25Db21tZW50KAogICAgICAgIHByb2NlZHVyZS50YXJnZXQsIGRvY3VtZW50YXRpb25Db21tZW50KTsKICAgIGNoZWNrVHlwZVZhcmlhYmxlcyh0eXBlVmFyaWFibGVzLCBwcm9jZWR1cmUpOwogICAgYWRkQnVpbGRlcihuYW1lLCBwcm9jZWR1cmUsIGNoYXJPZmZzZXQpOwogICAgaWYgKG5hdGl2ZU1ldGhvZE5hbWUgIT0gbnVsbCkgewogICAgICBhZGROYXRpdmVNZXRob2QocHJvY2VkdXJlKTsKICAgIH0KICB9CgogIHZvaWQgYWRkRmFjdG9yeU1ldGhvZCgKICAgICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50LAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIGludCBtb2RpZmllcnMsCiAgICAgIE9iamVjdCBuYW1lLAogICAgICBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+IGZvcm1hbHMsCiAgICAgIENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlciByZWRpcmVjdGlvblRhcmdldCwKICAgICAgaW50IHN0YXJ0Q2hhck9mZnNldCwKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyT3BlblBhcmVuT2Zmc2V0LAogICAgICBpbnQgY2hhckVuZE9mZnNldCwKICAgICAgU3RyaW5nIG5hdGl2ZU1ldGhvZE5hbWUpIHsKICAgIEtlcm5lbFR5cGVCdWlsZGVyIHJldHVyblR5cGUgPSBhZGROYW1lZFR5cGUoCiAgICAgICAgY3VycmVudERlY2xhcmF0aW9uLnBhcmVudC5uYW1lLCA8S2VybmVsVHlwZUJ1aWxkZXI+W10sIGNoYXJPZmZzZXQpOwogICAgLy8gTmVzdGVkIGRlY2xhcmF0aW9uIGJlZ2FuIGluIGBPdXRsaW5lQnVpbGRlci5iZWdpbkZhY3RvcnlNZXRob2RgLgogICAgRGVjbGFyYXRpb25CdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyPiBmYWN0b3J5RGVjbGFyYXRpb24gPQogICAgICAgIGVuZE5lc3RlZERlY2xhcmF0aW9uKCIjZmFjdG9yeV9tZXRob2QiKTsKCiAgICAvLyBQcmVwYXJlIHRoZSBzaW1wbGUgcHJvY2VkdXJlIG5hbWUuCiAgICBTdHJpbmcgcHJvY2VkdXJlTmFtZTsKICAgIFN0cmluZyBjb25zdHJ1Y3Rvck5hbWUgPQogICAgICAgIGNvbXB1dGVBbmRWYWxpZGF0ZUNvbnN0cnVjdG9yTmFtZShuYW1lLCBjaGFyT2Zmc2V0LCBpc0ZhY3Rvcnk6IHRydWUpOwogICAgaWYgKGNvbnN0cnVjdG9yTmFtZSAhPSBudWxsKSB7CiAgICAgIHByb2NlZHVyZU5hbWUgPSBjb25zdHJ1Y3Rvck5hbWU7CiAgICB9IGVsc2UgewogICAgICBwcm9jZWR1cmVOYW1lID0gbmFtZTsKICAgIH0KCiAgICBLZXJuZWxQcm9jZWR1cmVCdWlsZGVyIHByb2NlZHVyZTsKICAgIGlmIChyZWRpcmVjdGlvblRhcmdldCAhPSBudWxsKSB7CiAgICAgIHByb2NlZHVyZSA9IG5ldyBLZXJuZWxSZWRpcmVjdGluZ0ZhY3RvcnlCdWlsZGVyKAogICAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgICBzdGF0aWNNYXNrIHwgbW9kaWZpZXJzLAogICAgICAgICAgcmV0dXJuVHlwZSwKICAgICAgICAgIHByb2NlZHVyZU5hbWUsCiAgICAgICAgICBjb3B5VHlwZVZhcmlhYmxlcygKICAgICAgICAgICAgICBjdXJyZW50RGVjbGFyYXRpb24udHlwZVZhcmlhYmxlcyA/PyA8VHlwZVZhcmlhYmxlQnVpbGRlcj5bXSwKICAgICAgICAgICAgICBmYWN0b3J5RGVjbGFyYXRpb24pLAogICAgICAgICAgZm9ybWFscywKICAgICAgICAgIHRoaXMsCiAgICAgICAgICBzdGFydENoYXJPZmZzZXQsCiAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgY2hhck9wZW5QYXJlbk9mZnNldCwKICAgICAgICAgIGNoYXJFbmRPZmZzZXQsCiAgICAgICAgICBuYXRpdmVNZXRob2ROYW1lLAogICAgICAgICAgcmVkaXJlY3Rpb25UYXJnZXQpOwogICAgfSBlbHNlIHsKICAgICAgcHJvY2VkdXJlID0gbmV3IEtlcm5lbFByb2NlZHVyZUJ1aWxkZXIoCiAgICAgICAgICBtZXRhZGF0YSwKICAgICAgICAgIHN0YXRpY01hc2sgfCBtb2RpZmllcnMsCiAgICAgICAgICByZXR1cm5UeXBlLAogICAgICAgICAgcHJvY2VkdXJlTmFtZSwKICAgICAgICAgIGNvcHlUeXBlVmFyaWFibGVzKAogICAgICAgICAgICAgIGN1cnJlbnREZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzID8/IDxUeXBlVmFyaWFibGVCdWlsZGVyPltdLAogICAgICAgICAgICAgIGZhY3RvcnlEZWNsYXJhdGlvbiksCiAgICAgICAgICBmb3JtYWxzLAogICAgICAgICAgUHJvY2VkdXJlS2luZC5GYWN0b3J5LAogICAgICAgICAgdGhpcywKICAgICAgICAgIHN0YXJ0Q2hhck9mZnNldCwKICAgICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgICBjaGFyT3BlblBhcmVuT2Zmc2V0LAogICAgICAgICAgY2hhckVuZE9mZnNldCwKICAgICAgICAgIG5hdGl2ZU1ldGhvZE5hbWUpOwogICAgfQoKICAgIHZhciBtZXRhZGF0YUNvbGxlY3RvciA9IGxvYWRlci50YXJnZXQubWV0YWRhdGFDb2xsZWN0b3I7CiAgICBtZXRhZGF0YUNvbGxlY3Rvcj8uc2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQoCiAgICAgICAgcHJvY2VkdXJlLnRhcmdldCwgZG9jdW1lbnRhdGlvbkNvbW1lbnQpOwogICAgbWV0YWRhdGFDb2xsZWN0b3I/LnNldENvbnN0cnVjdG9yTmFtZU9mZnNldChwcm9jZWR1cmUudGFyZ2V0LCBuYW1lKTsKCiAgICBEZWNsYXJhdGlvbkJ1aWxkZXI8VHlwZUJ1aWxkZXI+IHNhdmVkRGVjbGFyYXRpb24gPSBjdXJyZW50RGVjbGFyYXRpb247CiAgICBjdXJyZW50RGVjbGFyYXRpb24gPSBmYWN0b3J5RGVjbGFyYXRpb247CiAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgdHYgaW4gcHJvY2VkdXJlLnR5cGVWYXJpYWJsZXMpIHsKICAgICAgS2VybmVsTmFtZWRUeXBlQnVpbGRlciB0ID0gcHJvY2VkdXJlLnJldHVyblR5cGU7CiAgICAgIHQuYXJndW1lbnRzLmFkZChhZGROYW1lZFR5cGUodHYubmFtZSwgbnVsbCwgcHJvY2VkdXJlLmNoYXJPZmZzZXQpKTsKICAgIH0KICAgIGN1cnJlbnREZWNsYXJhdGlvbiA9IHNhdmVkRGVjbGFyYXRpb247CgogICAgZmFjdG9yeURlY2xhcmF0aW9uLnJlc29sdmVUeXBlcyhwcm9jZWR1cmUudHlwZVZhcmlhYmxlcywgdGhpcyk7CiAgICBhZGRCdWlsZGVyKHByb2NlZHVyZU5hbWUsIHByb2NlZHVyZSwgY2hhck9mZnNldCk7CiAgICBpZiAobmF0aXZlTWV0aG9kTmFtZSAhPSBudWxsKSB7CiAgICAgIGFkZE5hdGl2ZU1ldGhvZChwcm9jZWR1cmUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRFbnVtKAogICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIExpc3Q8RW51bUNvbnN0YW50SW5mbz4gZW51bUNvbnN0YW50SW5mb3MsCiAgICAgIGludCBzdGFydENoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhckVuZE9mZnNldCkgewogICAgTWV0YWRhdGFDb2xsZWN0b3IgbWV0YWRhdGFDb2xsZWN0b3IgPSBsb2FkZXIudGFyZ2V0Lm1ldGFkYXRhQ29sbGVjdG9yOwogICAgS2VybmVsRW51bUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBLZXJuZWxFbnVtQnVpbGRlcigKICAgICAgICBtZXRhZGF0YUNvbGxlY3RvciwKICAgICAgICBtZXRhZGF0YSwKICAgICAgICBuYW1lLAogICAgICAgIGVudW1Db25zdGFudEluZm9zLAogICAgICAgIHRoaXMsCiAgICAgICAgc3RhcnRDaGFyT2Zmc2V0LAogICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgY2hhckVuZE9mZnNldCk7CiAgICBhZGRCdWlsZGVyKG5hbWUsIGJ1aWxkZXIsIGNoYXJPZmZzZXQpOwogICAgbWV0YWRhdGFDb2xsZWN0b3I/LnNldERvY3VtZW50YXRpb25Db21tZW50KAogICAgICAgIGJ1aWxkZXIudGFyZ2V0LCBkb2N1bWVudGF0aW9uQ29tbWVudCk7CiAgfQoKICB2b2lkIGFkZEZ1bmN0aW9uVHlwZUFsaWFzKAogICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywKICAgICAgY292YXJpYW50IEtlcm5lbEZ1bmN0aW9uVHlwZUJ1aWxkZXIgdHlwZSwKICAgICAgaW50IGNoYXJPZmZzZXQpIHsKICAgIEtlcm5lbFR5cGVBbGlhc0J1aWxkZXIgdHlwZWRlZiA9IG5ldyBLZXJuZWxUeXBlQWxpYXNCdWlsZGVyKAogICAgICAgIG1ldGFkYXRhLCBuYW1lLCB0eXBlVmFyaWFibGVzLCB0eXBlLCB0aGlzLCBjaGFyT2Zmc2V0KTsKICAgIGxvYWRlci50YXJnZXQubWV0YWRhdGFDb2xsZWN0b3IKICAgICAgICA/LnNldERvY3VtZW50YXRpb25Db21tZW50KHR5cGVkZWYudGFyZ2V0LCBkb2N1bWVudGF0aW9uQ29tbWVudCk7CiAgICBjaGVja1R5cGVWYXJpYWJsZXModHlwZVZhcmlhYmxlcywgdHlwZWRlZik7CiAgICAvLyBOZXN0ZWQgZGVjbGFyYXRpb24gYmVnYW4gaW4gYE91dGxpbmVCdWlsZGVyLmJlZ2luRnVuY3Rpb25UeXBlQWxpYXNgLgogICAgZW5kTmVzdGVkRGVjbGFyYXRpb24oIiN0eXBlZGVmIikucmVzb2x2ZVR5cGVzKHR5cGVWYXJpYWJsZXMsIHRoaXMpOwogICAgYWRkQnVpbGRlcihuYW1lLCB0eXBlZGVmLCBjaGFyT2Zmc2V0KTsKICB9CgogIEtlcm5lbEZ1bmN0aW9uVHlwZUJ1aWxkZXIgYWRkRnVuY3Rpb25UeXBlKAogICAgICBLZXJuZWxUeXBlQnVpbGRlciByZXR1cm5UeXBlLAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMsCiAgICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscywKICAgICAgaW50IGNoYXJPZmZzZXQpIHsKICAgIHZhciBidWlsZGVyID0KICAgICAgICBuZXcgS2VybmVsRnVuY3Rpb25UeXBlQnVpbGRlcihyZXR1cm5UeXBlLCB0eXBlVmFyaWFibGVzLCBmb3JtYWxzKTsKICAgIGNoZWNrVHlwZVZhcmlhYmxlcyh0eXBlVmFyaWFibGVzLCBudWxsKTsKICAgIC8vIE5lc3RlZCBkZWNsYXJhdGlvbiBiZWdhbiBpbiBgT3V0bGluZUJ1aWxkZXIuYmVnaW5GdW5jdGlvblR5cGVgIG9yCiAgICAvLyBgT3V0bGluZUJ1aWxkZXIuYmVnaW5GdW5jdGlvblR5cGVkRm9ybWFsUGFyYW1ldGVyYC4KICAgIGVuZE5lc3RlZERlY2xhcmF0aW9uKCIjZnVuY3Rpb25fdHlwZSIpLnJlc29sdmVUeXBlcyh0eXBlVmFyaWFibGVzLCB0aGlzKTsKICAgIHJldHVybiBhZGRUeXBlKGJ1aWxkZXIsIGNoYXJPZmZzZXQpOwogIH0KCiAgS2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBhZGRGb3JtYWxQYXJhbWV0ZXIoCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgS2VybmVsVHlwZUJ1aWxkZXIgdHlwZSwKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIGJvb2wgaGFzVGhpcywKICAgICAgaW50IGNoYXJPZmZzZXQpIHsKICAgIGlmIChoYXNUaGlzKSB7CiAgICAgIG1vZGlmaWVycyB8PSBpbml0aWFsaXppbmdGb3JtYWxNYXNrOwogICAgfQogICAgS2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgPSBuZXcgS2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlcigKICAgICAgICBtZXRhZGF0YSwgbW9kaWZpZXJzLCB0eXBlLCBuYW1lLCB0aGlzLCBjaGFyT2Zmc2V0KTsKICAgIGlmIChsZWdhY3lNb2RlICYmIGhhc1RoaXMgJiYgdHlwZSA9PSBudWxsKSB7CiAgICAgICh1bnR5cGVkSW5pdGlhbGl6aW5nRm9ybWFscyA/Pz0gPEtlcm5lbEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+W10pCiAgICAgICAgICAuYWRkKGZvcm1hbCk7CiAgICB9CiAgICByZXR1cm4gZm9ybWFsOwogIH0KCiAgS2VybmVsVHlwZVZhcmlhYmxlQnVpbGRlciBhZGRUeXBlVmFyaWFibGUoCiAgICAgIFN0cmluZyBuYW1lLCBLZXJuZWxUeXBlQnVpbGRlciBib3VuZCwgaW50IGNoYXJPZmZzZXQpIHsKICAgIHZhciBidWlsZGVyID0gbmV3IEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXIobmFtZSwgdGhpcywgY2hhck9mZnNldCwgYm91bmQpOwogICAgYm91bmRsZXNzVHlwZVZhcmlhYmxlcy5hZGQoYnVpbGRlcik7CiAgICByZXR1cm4gYnVpbGRlcjsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYnVpbGRCdWlsZGVyKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBMaWJyYXJ5QnVpbGRlciBjb3JlTGlicmFyeSkgewogICAgQ2xhc3MgY2xzOwogICAgTWVtYmVyIG1lbWJlcjsKICAgIFR5cGVkZWYgdHlwZWRlZjsKICAgIGlmIChkZWNsYXJhdGlvbiBpcyBTb3VyY2VDbGFzc0J1aWxkZXIpIHsKICAgICAgY2xzID0gZGVjbGFyYXRpb24uYnVpbGQodGhpcywgY29yZUxpYnJhcnkpOwogICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBLZXJuZWxGaWVsZEJ1aWxkZXIpIHsKICAgICAgbWVtYmVyID0gZGVjbGFyYXRpb24uYnVpbGQodGhpcykuLmlzU3RhdGljID0gdHJ1ZTsKICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24gaXMgS2VybmVsUHJvY2VkdXJlQnVpbGRlcikgewogICAgICBtZW1iZXIgPSBkZWNsYXJhdGlvbi5idWlsZCh0aGlzKS4uaXNTdGF0aWMgPSB0cnVlOwogICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBLZXJuZWxUeXBlQWxpYXNCdWlsZGVyKSB7CiAgICAgIHR5cGVkZWYgPSBkZWNsYXJhdGlvbi5idWlsZCh0aGlzKTsKICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24gaXMgS2VybmVsRW51bUJ1aWxkZXIpIHsKICAgICAgY2xzID0gZGVjbGFyYXRpb24uYnVpbGQodGhpcywgY29yZUxpYnJhcnkpOwogICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBQcmVmaXhCdWlsZGVyKSB7CiAgICAgIC8vIElnbm9yZWQuIEtlcm5lbCBkb2Vzbid0IHJlcHJlc2VudCBwcmVmaXhlcy4KICAgICAgcmV0dXJuOwogICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBCdWlsdGluVHlwZUJ1aWxkZXIpIHsKICAgICAgLy8gTm90aGluZyBuZWVkZWQuCiAgICAgIHJldHVybjsKICAgIH0gZWxzZSB7CiAgICAgIHVuaGFuZGxlZCgiJHtkZWNsYXJhdGlvbi5ydW50aW1lVHlwZX0iLCAiYnVpbGRCdWlsZGVyIiwKICAgICAgICAgIGRlY2xhcmF0aW9uLmNoYXJPZmZzZXQsIGRlY2xhcmF0aW9uLmZpbGVVcmkpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoZGVjbGFyYXRpb24uaXNQYXRjaCkgewogICAgICAvLyBUaGUga2VybmVsIG5vZGUgb2YgYSBwYXRjaCBpcyBzaGFyZWQgd2l0aCB0aGUgb3JpZ2luIGRlY2xhcmF0aW9uLiBXZQogICAgICAvLyBoYXZlIHR3byBidWlsZGVyczogdGhlIG9yaWdpbiwgYW5kIHRoZSBwYXRjaCwgYnV0IG9ubHkgb25lIGtlcm5lbCBub2RlCiAgICAgIC8vICh3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgZmluYWwgb3V0cHV0KS4gQ29uc2VxdWVudGx5LCB0aGUgbm9kZQogICAgICAvLyBzaG91bGRuJ3QgYmUgYWRkZWQgdG8gaXRzIGFwcGFyZW50IGtlcm5lbCBwYXJlbnQgYXMgdGhpcyB3b3VsZCBjcmVhdGUKICAgICAgLy8gYSBkdXBsaWNhdGUgZW50cnkgaW4gdGhlIHBhcmVudCdzIGxpc3Qgb2YgY2hpbGRyZW4vbWVtYmVycy4KICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGNscyAhPSBudWxsKSB7CiAgICAgIGlmIChkZWNsYXJhdGlvbi5uZXh0ICE9IG51bGwpIHsKICAgICAgICBpbnQgY291bnQgPSAwOwogICAgICAgIERlY2xhcmF0aW9uIGN1cnJlbnQgPSBkZWNsYXJhdGlvbi5uZXh0OwogICAgICAgIHdoaWxlIChjdXJyZW50ICE9IG51bGwpIHsKICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0OwogICAgICAgIH0KICAgICAgICBjbHMubmFtZSArPSAiIyRjb3VudCI7CiAgICAgIH0KICAgICAgbGlicmFyeS5hZGRDbGFzcyhjbHMpOwogICAgfSBlbHNlIGlmIChtZW1iZXIgIT0gbnVsbCkgewogICAgICBpZiAoZGVjbGFyYXRpb24ubmV4dCA9PSBudWxsKSB7CiAgICAgICAgbGlicmFyeS5hZGRNZW1iZXIobWVtYmVyKTsKICAgICAgfQogICAgfSBlbHNlIGlmICh0eXBlZGVmICE9IG51bGwpIHsKICAgICAgaWYgKGRlY2xhcmF0aW9uLm5leHQgPT0gbnVsbCkgewogICAgICAgIGxpYnJhcnkuYWRkVHlwZWRlZih0eXBlZGVmKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBhZGROYXRpdmVEZXBlbmRlbmN5KFN0cmluZyBuYXRpdmVJbXBvcnRQYXRoKSB7CiAgICBEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvciA9IGxvYWRlci5nZXROYXRpdmVBbm5vdGF0aW9uKCk7CiAgICBBcmd1bWVudHMgYXJndW1lbnRzID0KICAgICAgICBuZXcgQXJndW1lbnRzKDxFeHByZXNzaW9uPltuZXcgU3RyaW5nTGl0ZXJhbChuYXRpdmVJbXBvcnRQYXRoKV0pOwogICAgRXhwcmVzc2lvbiBhbm5vdGF0aW9uOwogICAgaWYgKGNvbnN0cnVjdG9yLmlzQ29uc3RydWN0b3IpIHsKICAgICAgYW5ub3RhdGlvbiA9IG5ldyBDb25zdHJ1Y3Rvckludm9jYXRpb24oY29uc3RydWN0b3IudGFyZ2V0LCBhcmd1bWVudHMpCiAgICAgICAgLi5pc0NvbnN0ID0gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGFubm90YXRpb24gPSBuZXcgU3RhdGljSW52b2NhdGlvbihjb25zdHJ1Y3Rvci50YXJnZXQsIGFyZ3VtZW50cykKICAgICAgICAuLmlzQ29uc3QgPSB0cnVlOwogICAgfQogICAgbGlicmFyeS5hZGRBbm5vdGF0aW9uKGFubm90YXRpb24pOwogIH0KCiAgdm9pZCBhZGREZXBlbmRlbmNpZXMoTGlicmFyeSBsaWJyYXJ5LCBTZXQ8S2VybmVsTGlicmFyeUJ1aWxkZXI+IHNlZW4pIHsKICAgIGlmICghc2Vlbi5hZGQodGhpcykpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIE1lcmdlIGltcG9ydCBhbmQgZXhwb3J0IGxpc3RzIHRvIGhhdmUgdGhlIGRlcGVuZGVuY2llcyBpbiBzb3VyY2Ugb3JkZXIuCiAgICAvLyBUaGlzIGlzIHJlcXVpcmVkIGZvciB0aGUgRGlldExpc3RlbmVyIHRvIGNvcnJlY3RseSBtYXRjaCB1cCBtZXRhZGF0YS4KICAgIGludCBpbXBvcnRJbmRleCA9IDA7CiAgICBpbnQgZXhwb3J0SW5kZXggPSAwOwogICAgd2hpbGUgKGltcG9ydEluZGV4IDwgaW1wb3J0cy5sZW5ndGggfHwgZXhwb3J0SW5kZXggPCBleHBvcnRzLmxlbmd0aCkgewogICAgICBpZiAoZXhwb3J0SW5kZXggPj0gZXhwb3J0cy5sZW5ndGggfHwKICAgICAgICAgIChpbXBvcnRJbmRleCA8IGltcG9ydHMubGVuZ3RoICYmCiAgICAgICAgICAgICAgaW1wb3J0c1tpbXBvcnRJbmRleF0uY2hhck9mZnNldCA8CiAgICAgICAgICAgICAgICAgIGV4cG9ydHNbZXhwb3J0SW5kZXhdLmNoYXJPZmZzZXQpKSB7CiAgICAgICAgLy8gQWRkIGltcG9ydAogICAgICAgIEltcG9ydCBpbXBvcnQgPSBpbXBvcnRzW2ltcG9ydEluZGV4KytdOwoKICAgICAgICAvLyBSYXRoZXIgdGhhbiBhZGQgYSBMaWJyYXJ5RGVwZW5kZW5jeSwgd2UgYXR0YWNoIGFuIGFubm90YXRpb24uCiAgICAgICAgaWYgKGltcG9ydC5uYXRpdmVJbXBvcnRQYXRoICE9IG51bGwpIHsKICAgICAgICAgIGFkZE5hdGl2ZURlcGVuZGVuY3koaW1wb3J0Lm5hdGl2ZUltcG9ydFBhdGgpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoaW1wb3J0LmRlZmVycmVkICYmIGltcG9ydC5wcmVmaXhCdWlsZGVyPy5kZXBlbmRlbmN5ICE9IG51bGwpIHsKICAgICAgICAgIGxpYnJhcnkuYWRkRGVwZW5kZW5jeShpbXBvcnQucHJlZml4QnVpbGRlci5kZXBlbmRlbmN5KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGlicmFyeS5hZGREZXBlbmRlbmN5KG5ldyBMaWJyYXJ5RGVwZW5kZW5jeS5pbXBvcnQoCiAgICAgICAgICAgICAgaW1wb3J0LmltcG9ydGVkLnRhcmdldCwKICAgICAgICAgICAgICBuYW1lOiBpbXBvcnQucHJlZml4LAogICAgICAgICAgICAgIGNvbWJpbmF0b3JzOiB0b0tlcm5lbENvbWJpbmF0b3JzKGltcG9ydC5jb21iaW5hdG9ycykpCiAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGltcG9ydC5jaGFyT2Zmc2V0KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQWRkIGV4cG9ydAogICAgICAgIEV4cG9ydCBleHBvcnQgPSBleHBvcnRzW2V4cG9ydEluZGV4KytdOwogICAgICAgIGxpYnJhcnkuYWRkRGVwZW5kZW5jeShuZXcgTGlicmFyeURlcGVuZGVuY3kuZXhwb3J0KAogICAgICAgICAgICBleHBvcnQuZXhwb3J0ZWQudGFyZ2V0LAogICAgICAgICAgICBjb21iaW5hdG9yczogdG9LZXJuZWxDb21iaW5hdG9ycyhleHBvcnQuY29tYmluYXRvcnMpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZXhwb3J0LmNoYXJPZmZzZXQpOwogICAgICB9CiAgICB9CgogICAgZm9yIChLZXJuZWxMaWJyYXJ5QnVpbGRlciBwYXJ0IGluIHBhcnRzKSB7CiAgICAgIHBhcnQuYWRkRGVwZW5kZW5jaWVzKGxpYnJhcnksIHNlZW4pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRQYXJ0KExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwgU3RyaW5nIHVyaSwgaW50IGNoYXJPZmZzZXQpIHsKICAgIHN1cGVyLmFkZFBhcnQobWV0YWRhdGEsIHVyaSwgY2hhck9mZnNldCk7CiAgICAvLyBUT0RPKGFoZSk6IFttZXRhZGF0YV0gc2hvdWxkIGJlIHN0b3JlZCwgZXZhbHVhdGVkLCBhbmQgYWRkZWQgdG8gW3BhcnRdLgogICAgTGlicmFyeVBhcnQgcGFydCA9IG5ldyBMaWJyYXJ5UGFydCg8RXhwcmVzc2lvbj5bXSwgdXJpKQogICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0OwogICAgbGlicmFyeS5hZGRQYXJ0KHBhcnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlicmFyeSBidWlsZChMaWJyYXJ5QnVpbGRlciBjb3JlTGlicmFyeSwge2Jvb2wgbW9kaWZ5VGFyZ2V0fSkgewogICAgc3VwZXIuYnVpbGQoY29yZUxpYnJhcnkpOwoKICAgIGlmIChtb2RpZnlUYXJnZXQgPT0gZmFsc2UpIHJldHVybiBsaWJyYXJ5OwoKICAgIGxpYnJhcnkuaXNTeW50aGV0aWMgPSBpc1N5bnRoZXRpYzsKICAgIGFkZERlcGVuZGVuY2llcyhsaWJyYXJ5LCBuZXcgU2V0PEtlcm5lbExpYnJhcnlCdWlsZGVyPigpKTsKCiAgICBsb2FkZXIudGFyZ2V0Lm1ldGFkYXRhQ29sbGVjdG9yCiAgICAgICAgPy5zZXREb2N1bWVudGF0aW9uQ29tbWVudChsaWJyYXJ5LCBkb2N1bWVudGF0aW9uQ29tbWVudCk7CgogICAgbGlicmFyeS5uYW1lID0gbmFtZTsKICAgIGxpYnJhcnkucHJvY2VkdXJlcy5zb3J0KGNvbXBhcmVQcm9jZWR1cmVzKTsKCiAgICBpZiAodW5zZXJpYWxpemFibGVFeHBvcnRzICE9IG51bGwpIHsKICAgICAgbGlicmFyeS5hZGRNZW1iZXIobmV3IEZpZWxkKG5ldyBOYW1lKCJfZXhwb3J0cyMiLCBsaWJyYXJ5KSwKICAgICAgICAgIGluaXRpYWxpemVyOiBuZXcgU3RyaW5nTGl0ZXJhbChqc29uRW5jb2RlKHVuc2VyaWFsaXphYmxlRXhwb3J0cykpLAogICAgICAgICAgaXNTdGF0aWM6IHRydWUsCiAgICAgICAgICBpc0NvbnN0OiB0cnVlKSk7CiAgICB9CgogICAgcmV0dXJuIGxpYnJhcnk7CiAgfQoKICBAb3ZlcnJpZGUKICBEZWNsYXJhdGlvbiBjb21wdXRlQW1iaWd1b3VzRGVjbGFyYXRpb24oCiAgICAgIFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgRGVjbGFyYXRpb24gb3RoZXIsIGludCBjaGFyT2Zmc2V0LAogICAgICB7Ym9vbCBpc0V4cG9ydDogZmFsc2UsIGJvb2wgaXNJbXBvcnQ6IGZhbHNlfSkgewogICAgLy8gVE9ETyhhaGUpOiBDYW4gSSBtb3ZlIHRoaXMgdG8gU2NvcGUgb3IgUHJlZml4PwogICAgaWYgKGRlY2xhcmF0aW9uID09IG90aGVyKSByZXR1cm4gZGVjbGFyYXRpb247CiAgICBpZiAoZGVjbGFyYXRpb24gaXMgSW52YWxpZFR5cGVCdWlsZGVyKSByZXR1cm4gZGVjbGFyYXRpb247CiAgICBpZiAob3RoZXIgaXMgSW52YWxpZFR5cGVCdWlsZGVyKSByZXR1cm4gb3RoZXI7CiAgICBpZiAoZGVjbGFyYXRpb24gaXMgQWNjZXNzRXJyb3JCdWlsZGVyKSB7CiAgICAgIEFjY2Vzc0Vycm9yQnVpbGRlciBlcnJvciA9IGRlY2xhcmF0aW9uOwogICAgICBkZWNsYXJhdGlvbiA9IGVycm9yLmJ1aWxkZXI7CiAgICB9CiAgICBpZiAob3RoZXIgaXMgQWNjZXNzRXJyb3JCdWlsZGVyKSB7CiAgICAgIEFjY2Vzc0Vycm9yQnVpbGRlciBlcnJvciA9IG90aGVyOwogICAgICBvdGhlciA9IGVycm9yLmJ1aWxkZXI7CiAgICB9CiAgICBib29sIGlzTG9jYWwgPSBmYWxzZTsKICAgIGJvb2wgaXNMb2FkTGlicmFyeSA9IGZhbHNlOwogICAgRGVjbGFyYXRpb24gcHJlZmVycmVkOwogICAgVXJpIHVyaTsKICAgIFVyaSBvdGhlclVyaTsKICAgIFVyaSBwcmVmZXJyZWRVcmk7CiAgICBVcmkgaGlkZGVuVXJpOwogICAgaWYgKHNjb3BlLmxvY2FsW25hbWVdID09IGRlY2xhcmF0aW9uKSB7CiAgICAgIGlzTG9jYWwgPSB0cnVlOwogICAgICBwcmVmZXJyZWQgPSBkZWNsYXJhdGlvbjsKICAgICAgaGlkZGVuVXJpID0gY29tcHV0ZUxpYnJhcnlVcmkob3RoZXIpOwogICAgfSBlbHNlIHsKICAgICAgdXJpID0gY29tcHV0ZUxpYnJhcnlVcmkoZGVjbGFyYXRpb24pOwogICAgICBvdGhlclVyaSA9IGNvbXB1dGVMaWJyYXJ5VXJpKG90aGVyKTsKICAgICAgaWYgKGRlY2xhcmF0aW9uIGlzIExvYWRMaWJyYXJ5QnVpbGRlcikgewogICAgICAgIGlzTG9hZExpYnJhcnkgPSB0cnVlOwogICAgICAgIHByZWZlcnJlZCA9IGRlY2xhcmF0aW9uOwogICAgICAgIHByZWZlcnJlZFVyaSA9IG90aGVyVXJpOwogICAgICB9IGVsc2UgaWYgKG90aGVyIGlzIExvYWRMaWJyYXJ5QnVpbGRlcikgewogICAgICAgIGlzTG9hZExpYnJhcnkgPSB0cnVlOwogICAgICAgIHByZWZlcnJlZCA9IG90aGVyOwogICAgICAgIHByZWZlcnJlZFVyaSA9IHVyaTsKICAgICAgfSBlbHNlIGlmIChvdGhlclVyaT8uc2NoZW1lID09ICJkYXJ0IiAmJiB1cmk/LnNjaGVtZSAhPSAiZGFydCIpIHsKICAgICAgICBwcmVmZXJyZWQgPSBkZWNsYXJhdGlvbjsKICAgICAgICBwcmVmZXJyZWRVcmkgPSB1cmk7CiAgICAgICAgaGlkZGVuVXJpID0gb3RoZXJVcmk7CiAgICAgIH0gZWxzZSBpZiAodXJpPy5zY2hlbWUgPT0gImRhcnQiICYmIG90aGVyVXJpPy5zY2hlbWUgIT0gImRhcnQiKSB7CiAgICAgICAgcHJlZmVycmVkID0gb3RoZXI7CiAgICAgICAgcHJlZmVycmVkVXJpID0gb3RoZXJVcmk7CiAgICAgICAgaGlkZGVuVXJpID0gdXJpOwogICAgICB9CiAgICB9CiAgICBpZiAocHJlZmVycmVkICE9IG51bGwpIHsKICAgICAgaWYgKGlzTG9jYWwpIHsKICAgICAgICB2YXIgdGVtcGxhdGUgPSBpc0V4cG9ydAogICAgICAgICAgICA/IHRlbXBsYXRlTG9jYWxEZWZpbml0aW9uSGlkZXNFeHBvcnQKICAgICAgICAgICAgOiB0ZW1wbGF0ZUxvY2FsRGVmaW5pdGlvbkhpZGVzSW1wb3J0OwogICAgICAgIGFkZFByb2JsZW0odGVtcGxhdGUud2l0aEFyZ3VtZW50cyhuYW1lLCBoaWRkZW5VcmkpLCBjaGFyT2Zmc2V0LAogICAgICAgICAgICBub0xlbmd0aCwgZmlsZVVyaSk7CiAgICAgIH0gZWxzZSBpZiAoaXNMb2FkTGlicmFyeSkgewogICAgICAgIGFkZFByb2JsZW0odGVtcGxhdGVMb2FkTGlicmFyeUhpZGVzTWVtYmVyLndpdGhBcmd1bWVudHMocHJlZmVycmVkVXJpKSwKICAgICAgICAgICAgY2hhck9mZnNldCwgbm9MZW5ndGgsIGZpbGVVcmkpOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciB0ZW1wbGF0ZSA9CiAgICAgICAgICAgIGlzRXhwb3J0ID8gdGVtcGxhdGVFeHBvcnRIaWRlc0V4cG9ydCA6IHRlbXBsYXRlSW1wb3J0SGlkZXNJbXBvcnQ7CiAgICAgICAgYWRkUHJvYmxlbSh0ZW1wbGF0ZS53aXRoQXJndW1lbnRzKG5hbWUsIHByZWZlcnJlZFVyaSwgaGlkZGVuVXJpKSwKICAgICAgICAgICAgY2hhck9mZnNldCwgbm9MZW5ndGgsIGZpbGVVcmkpOwogICAgICB9CiAgICAgIHJldHVybiBwcmVmZXJyZWQ7CiAgICB9CiAgICBpZiAoZGVjbGFyYXRpb24ubmV4dCA9PSBudWxsICYmIG90aGVyLm5leHQgPT0gbnVsbCkgewogICAgICBpZiAoaXNJbXBvcnQgJiYgZGVjbGFyYXRpb24gaXMgUHJlZml4QnVpbGRlciAmJiBvdGhlciBpcyBQcmVmaXhCdWlsZGVyKSB7CiAgICAgICAgLy8gSGFuZGxlcyB0aGUgY2FzZSB3aGVyZSB0aGUgc2FtZSBwcmVmaXggaXMgdXNlZCBmb3IgZGlmZmVyZW50CiAgICAgICAgLy8gaW1wb3J0cy4KICAgICAgICByZXR1cm4gZGVjbGFyYXRpb24KICAgICAgICAgIC4uZXhwb3J0U2NvcGUubWVyZ2Uob3RoZXIuZXhwb3J0U2NvcGUsCiAgICAgICAgICAgICAgKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBleGlzdGluZywgRGVjbGFyYXRpb24gbWVtYmVyKSB7CiAgICAgICAgICAgIHJldHVybiBjb21wdXRlQW1iaWd1b3VzRGVjbGFyYXRpb24oCiAgICAgICAgICAgICAgICBuYW1lLCBleGlzdGluZywgbWVtYmVyLCBjaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgaXNFeHBvcnQ6IGlzRXhwb3J0LCBpc0ltcG9ydDogaXNJbXBvcnQpOwogICAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIHZhciB0ZW1wbGF0ZSA9CiAgICAgICAgaXNFeHBvcnQgPyB0ZW1wbGF0ZUR1cGxpY2F0ZWRFeHBvcnQgOiB0ZW1wbGF0ZUR1cGxpY2F0ZWRJbXBvcnQ7CiAgICBNZXNzYWdlIG1lc3NhZ2UgPSB0ZW1wbGF0ZS53aXRoQXJndW1lbnRzKG5hbWUsIHVyaSwgb3RoZXJVcmkpOwogICAgYWRkUHJvYmxlbShtZXNzYWdlLCBjaGFyT2Zmc2V0LCBub0xlbmd0aCwgZmlsZVVyaSk7CiAgICB2YXIgYnVpbGRlclRlbXBsYXRlID0gaXNFeHBvcnQKICAgICAgICA/IHRlbXBsYXRlRHVwbGljYXRlZEV4cG9ydEluVHlwZQogICAgICAgIDogdGVtcGxhdGVEdXBsaWNhdGVkSW1wb3J0SW5UeXBlOwogICAgcmV0dXJuIG5ldyBLZXJuZWxJbnZhbGlkVHlwZUJ1aWxkZXIoCiAgICAgICAgbmFtZSwKICAgICAgICBidWlsZGVyVGVtcGxhdGUKICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgLy8gVE9ETyhhaGUpOiBXZSBzaG91bGQgcHJvYmFibHkgdXNlIGEgY29udGV4dCBvYmplY3QgaGVyZQogICAgICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBpbmNsdWRpbmcgVVJJcyBpbiB0aGlzIG1lc3NhZ2UuCiAgICAgICAgICAgICAgICB1cmksCiAgICAgICAgICAgICAgICBvdGhlclVyaSkKICAgICAgICAgICAgLndpdGhMb2NhdGlvbihmaWxlVXJpLCBjaGFyT2Zmc2V0LCBuYW1lLmxlbmd0aCkpOwogIH0KCiAgaW50IGZpbmlzaERlZmVycmVkTG9hZFRlYXJvZmZzKCkgewogICAgaW50IHRvdGFsID0gMDsKICAgIGZvciAodmFyIGltcG9ydCBpbiBpbXBvcnRzKSB7CiAgICAgIGlmIChpbXBvcnQuZGVmZXJyZWQpIHsKICAgICAgICBQcm9jZWR1cmUgdGVhcm9mZiA9IGltcG9ydC5wcmVmaXhCdWlsZGVyLmxvYWRMaWJyYXJ5QnVpbGRlci50ZWFyb2ZmOwogICAgICAgIGlmICh0ZWFyb2ZmICE9IG51bGwpIGxpYnJhcnkuYWRkTWVtYmVyKHRlYXJvZmYpOwogICAgICAgIHRvdGFsKys7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0b3RhbDsKICB9CgogIGludCBmaW5pc2hGb3J3YXJkZXJzKCkgewogICAgaW50IGNvdW50ID0gMDsKICAgIENsb25lVmlzaXRvciBjbG9uZXIgPSBuZXcgQ2xvbmVWaXNpdG9yKCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGZvcndhcmRlcnNPcmlnaW5zLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgIFByb2NlZHVyZSBmb3J3YXJkZXIgPSBmb3J3YXJkZXJzT3JpZ2luc1tpXTsKICAgICAgUHJvY2VkdXJlIG9yaWdpbiA9IGZvcndhcmRlcnNPcmlnaW5zW2kgKyAxXTsKCiAgICAgIGludCBwb3NpdGlvbmFsQ291bnQgPSBvcmlnaW4uZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoOwogICAgICBpZiAoZm9yd2FyZGVyLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCAhPSBwb3NpdGlvbmFsQ291bnQpIHsKICAgICAgICByZXR1cm4gdW5leHBlY3RlZCgKICAgICAgICAgICAgIiRwb3NpdGlvbmFsQ291bnQiLAogICAgICAgICAgICAiJHtmb3J3YXJkZXIuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RofSIsCiAgICAgICAgICAgIG9yaWdpbi5maWxlT2Zmc2V0LAogICAgICAgICAgICBvcmlnaW4uZmlsZVVyaSk7CiAgICAgIH0KICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwb3NpdGlvbmFsQ291bnQ7ICsraikgewogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gZm9yd2FyZGVyUGFyYW1ldGVyID0KICAgICAgICAgICAgZm9yd2FyZGVyLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2pdOwogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gb3JpZ2luUGFyYW1ldGVyID0KICAgICAgICAgICAgb3JpZ2luLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2pdOwogICAgICAgIGlmIChvcmlnaW5QYXJhbWV0ZXIuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgZm9yd2FyZGVyUGFyYW1ldGVyLmluaXRpYWxpemVyID0KICAgICAgICAgICAgICBjbG9uZXIuY2xvbmUob3JpZ2luUGFyYW1ldGVyLmluaXRpYWxpemVyKTsKICAgICAgICAgIGZvcndhcmRlclBhcmFtZXRlci5pbml0aWFsaXplci5wYXJlbnQgPSBmb3J3YXJkZXJQYXJhbWV0ZXI7CiAgICAgICAgfQogICAgICB9CgogICAgICBNYXA8U3RyaW5nLCBWYXJpYWJsZURlY2xhcmF0aW9uPiBvcmlnaW5OYW1lZE1hcCA9CiAgICAgICAgICA8U3RyaW5nLCBWYXJpYWJsZURlY2xhcmF0aW9uPnt9OwogICAgICBmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb24gb3JpZ2luTmFtZWQgaW4gb3JpZ2luLmZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycykgewogICAgICAgIG9yaWdpbk5hbWVkTWFwW29yaWdpbk5hbWVkLm5hbWVdID0gb3JpZ2luTmFtZWQ7CiAgICAgIH0KICAgICAgZm9yIChWYXJpYWJsZURlY2xhcmF0aW9uIGZvcndhcmRlck5hbWVkCiAgICAgICAgICBpbiBmb3J3YXJkZXIuZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBvcmlnaW5OYW1lZCA9IG9yaWdpbk5hbWVkTWFwW2ZvcndhcmRlck5hbWVkLm5hbWVdOwogICAgICAgIGlmIChvcmlnaW5OYW1lZCA9PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gdW5oYW5kbGVkKAogICAgICAgICAgICAgICJudWxsIiwgZm9yd2FyZGVyLm5hbWUubmFtZSwgb3JpZ2luLmZpbGVPZmZzZXQsIG9yaWdpbi5maWxlVXJpKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9yaWdpbk5hbWVkLmluaXRpYWxpemVyID09IG51bGwpIGNvbnRpbnVlOwogICAgICAgIGZvcndhcmRlck5hbWVkLmluaXRpYWxpemVyID0gY2xvbmVyLmNsb25lKG9yaWdpbk5hbWVkLmluaXRpYWxpemVyKTsKICAgICAgICBmb3J3YXJkZXJOYW1lZC5pbml0aWFsaXplci5wYXJlbnQgPSBmb3J3YXJkZXJOYW1lZDsKICAgICAgfQoKICAgICAgKytjb3VudDsKICAgIH0KICAgIGZvcndhcmRlcnNPcmlnaW5zLmNsZWFyKCk7CiAgICByZXR1cm4gY291bnQ7CiAgfQoKICB2b2lkIGFkZE5hdGl2ZU1ldGhvZChLZXJuZWxGdW5jdGlvbkJ1aWxkZXIgbWV0aG9kKSB7CiAgICBuYXRpdmVNZXRob2RzLmFkZChtZXRob2QpOwogIH0KCiAgaW50IGZpbmlzaE5hdGl2ZU1ldGhvZHMoKSB7CiAgICBmb3IgKEtlcm5lbEZ1bmN0aW9uQnVpbGRlciBtZXRob2QgaW4gbmF0aXZlTWV0aG9kcykgewogICAgICBtZXRob2QuYmVjb21lTmF0aXZlKGxvYWRlcik7CiAgICB9CiAgICByZXR1cm4gbmF0aXZlTWV0aG9kcy5sZW5ndGg7CiAgfQoKICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IGNvcHlUeXBlVmFyaWFibGVzKAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IG9yaWdpbmFsLCBEZWNsYXJhdGlvbkJ1aWxkZXIgZGVjbGFyYXRpb24pIHsKICAgIExpc3Q8VHlwZUJ1aWxkZXI+IG5ld1R5cGVzID0gPFR5cGVCdWlsZGVyPltdOwogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiBjb3B5ID0gPFR5cGVWYXJpYWJsZUJ1aWxkZXI+W107CiAgICBmb3IgKEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXIgdmFyaWFibGUgaW4gb3JpZ2luYWwpIHsKICAgICAgdmFyIG5ld1ZhcmlhYmxlID0gbmV3IEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXIodmFyaWFibGUubmFtZSwgdGhpcywKICAgICAgICAgIHZhcmlhYmxlLmNoYXJPZmZzZXQsIHZhcmlhYmxlLmJvdW5kPy5jbG9uZShuZXdUeXBlcykpOwogICAgICBjb3B5LmFkZChuZXdWYXJpYWJsZSk7CiAgICAgIGJvdW5kbGVzc1R5cGVWYXJpYWJsZXMuYWRkKG5ld1ZhcmlhYmxlKTsKICAgIH0KICAgIGZvciAoVHlwZUJ1aWxkZXIgbmV3VHlwZSBpbiBuZXdUeXBlcykgewogICAgICBkZWNsYXJhdGlvbgogICAgICAgICAgLmFkZFR5cGUobmV3IFVucmVzb2x2ZWRUeXBlPEtlcm5lbFR5cGVCdWlsZGVyPihuZXdUeXBlLCAtMSwgbnVsbCkpOwogICAgfQogICAgcmV0dXJuIGNvcHk7CiAgfQoKICBpbnQgZmluaXNoVHlwZVZhcmlhYmxlcyhDbGFzc0J1aWxkZXIgb2JqZWN0LCBUeXBlQnVpbGRlciBkeW5hbWljVHlwZSkgewogICAgaW50IGNvdW50ID0gYm91bmRsZXNzVHlwZVZhcmlhYmxlcy5sZW5ndGg7CiAgICBmb3IgKEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXIgYnVpbGRlciBpbiBib3VuZGxlc3NUeXBlVmFyaWFibGVzKSB7CiAgICAgIGJ1aWxkZXIuZmluaXNoKHRoaXMsIG9iamVjdCwgZHluYW1pY1R5cGUpOwogICAgfQogICAgYm91bmRsZXNzVHlwZVZhcmlhYmxlcy5jbGVhcigpOwogICAgcmV0dXJuIGNvdW50OwogIH0KCiAgaW50IGNvbXB1dGVEZWZhdWx0VHlwZXMoVHlwZUJ1aWxkZXIgZHluYW1pY1R5cGUsIFR5cGVCdWlsZGVyIGJvdHRvbVR5cGUsCiAgICAgIENsYXNzQnVpbGRlciBvYmplY3RDbGFzcykgewogICAgaW50IGNvdW50ID0gMDsKCiAgICBpbnQgY29tcHV0ZURlZmF1bHRUeXBlc0ZvclZhcmlhYmxlcygKICAgICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4+IHZhcmlhYmxlcywKICAgICAgICBib29sIGxlZ2FjeU1vZGUpIHsKICAgICAgaWYgKHZhcmlhYmxlcyA9PSBudWxsKSByZXR1cm4gMDsKCiAgICAgIGJvb2wgaGF2ZUVycm9uZW91c0JvdW5kcyA9IGZhbHNlOwogICAgICBpZiAoIWxlZ2FjeU1vZGUpIHsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhcmlhYmxlcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlcjxUeXBlQnVpbGRlciwgT2JqZWN0PiB2YXJpYWJsZSA9IHZhcmlhYmxlc1tpXTsKICAgICAgICAgIExpc3Q8VHlwZUJ1aWxkZXI+IGdlbmVyaWNGdW5jdGlvblR5cGVzID0gPFR5cGVCdWlsZGVyPltdOwogICAgICAgICAgZmluZEdlbmVyaWNGdW5jdGlvblR5cGVzKHZhcmlhYmxlLmJvdW5kLAogICAgICAgICAgICAgIHJlc3VsdDogZ2VuZXJpY0Z1bmN0aW9uVHlwZXMpOwogICAgICAgICAgaWYgKGdlbmVyaWNGdW5jdGlvblR5cGVzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgaGF2ZUVycm9uZW91c0JvdW5kcyA9IHRydWU7CiAgICAgICAgICAgIGFkZFByb2JsZW0obWVzc2FnZUdlbmVyaWNGdW5jdGlvblR5cGVJbkJvdW5kLCB2YXJpYWJsZS5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZS5sZW5ndGgsIHZhcmlhYmxlLmZpbGVVcmkpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCFoYXZlRXJyb25lb3VzQm91bmRzKSB7CiAgICAgICAgICBMaXN0PEtlcm5lbFR5cGVCdWlsZGVyPiBjYWxjdWxhdGVkQm91bmRzID0KICAgICAgICAgICAgICBjYWxjdWxhdGVCb3VuZHModmFyaWFibGVzLCBkeW5hbWljVHlwZSwgYm90dG9tVHlwZSwgb2JqZWN0Q2xhc3MpOwogICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJpYWJsZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgdmFyaWFibGVzW2ldLmRlZmF1bHRUeXBlID0gY2FsY3VsYXRlZEJvdW5kc1tpXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChsZWdhY3lNb2RlIHx8IGhhdmVFcnJvbmVvdXNCb3VuZHMpIHsKICAgICAgICAvLyBJbiBEYXJ0IDEsIHB1dCBgZHluYW1pY2AgZXZlcnl3aGVyZS4KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhcmlhYmxlcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgdmFyaWFibGVzW2ldLmRlZmF1bHRUeXBlID0gZHluYW1pY1R5cGU7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gdmFyaWFibGVzLmxlbmd0aDsKICAgIH0KCiAgICB2b2lkIHJlcG9ydElzc3VlcyhMaXN0PE9iamVjdD4gaXNzdWVzKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXNzdWVzLmxlbmd0aDsgaSArPSAzKSB7CiAgICAgICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlcjxUeXBlQnVpbGRlciwgT2JqZWN0PiBkZWNsYXJhdGlvbiA9IGlzc3Vlc1tpXTsKICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBpc3N1ZXNbaSArIDFdOwogICAgICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQgPSBpc3N1ZXNbaSArIDJdOwoKICAgICAgICBhZGRQcm9ibGVtKG1lc3NhZ2UsIGRlY2xhcmF0aW9uLmNoYXJPZmZzZXQsIGRlY2xhcmF0aW9uLm5hbWUubGVuZ3RoLAogICAgICAgICAgICBkZWNsYXJhdGlvbi5maWxlVXJpLAogICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICAgICAgfQogICAgfQoKICAgIGJvb2wgbGVnYWN5TW9kZSA9IGxvYWRlci50YXJnZXQubGVnYWN5TW9kZTsKICAgIGZvciAodmFyIGRlY2xhcmF0aW9uIGluIGxpYnJhcnlEZWNsYXJhdGlvbi5tZW1iZXJzLnZhbHVlcykgewogICAgICBpZiAoZGVjbGFyYXRpb24gaXMgS2VybmVsQ2xhc3NCdWlsZGVyKSB7CiAgICAgICAgewogICAgICAgICAgTGlzdDxPYmplY3Q+IGlzc3VlcyA9IGxlZ2FjeU1vZGUKICAgICAgICAgICAgICA/IGNvbnN0IDxPYmplY3Q+W10KICAgICAgICAgICAgICA6IGdldE5vblNpbXBsaWNpdHlJc3N1ZXNGb3JEZWNsYXJhdGlvbihkZWNsYXJhdGlvbiwKICAgICAgICAgICAgICAgICAgcGVyZm9ybUVycm9yUmVjb3Zlcnk6IHRydWUpOwogICAgICAgICAgcmVwb3J0SXNzdWVzKGlzc3Vlcyk7CiAgICAgICAgICAvLyBJbiBjYXNlIG9mIGlzc3VlcywgdXNlIGxlZ2FjeSBtb2RlIGZvciBlcnJvciByZWNvdmVyeS4KICAgICAgICAgIGNvdW50ICs9IGNvbXB1dGVEZWZhdWx0VHlwZXNGb3JWYXJpYWJsZXMoCiAgICAgICAgICAgICAgZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlcywgbGVnYWN5TW9kZSB8fCBpc3N1ZXMuaXNOb3RFbXB0eSk7CiAgICAgICAgfQogICAgICAgIGRlY2xhcmF0aW9uLmZvckVhY2goKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBtZW1iZXIpIHsKICAgICAgICAgIGlmIChtZW1iZXIgaXMgS2VybmVsUHJvY2VkdXJlQnVpbGRlcikgewogICAgICAgICAgICBMaXN0PE9iamVjdD4gaXNzdWVzID0gbGVnYWN5TW9kZQogICAgICAgICAgICAgICAgPyBjb25zdCA8T2JqZWN0PltdCiAgICAgICAgICAgICAgICA6IGdldE5vblNpbXBsaWNpdHlJc3N1ZXNGb3JUeXBlVmFyaWFibGVzKG1lbWJlci50eXBlVmFyaWFibGVzKTsKICAgICAgICAgICAgcmVwb3J0SXNzdWVzKGlzc3Vlcyk7CiAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgaXNzdWVzLCB1c2UgbGVnYWN5IG1vZGUgZm9yIGVycm9yIHJlY292ZXJ5LgogICAgICAgICAgICBjb3VudCArPSBjb21wdXRlRGVmYXVsdFR5cGVzRm9yVmFyaWFibGVzKAogICAgICAgICAgICAgICAgbWVtYmVyLnR5cGVWYXJpYWJsZXMsIGxlZ2FjeU1vZGUgfHwgaXNzdWVzLmlzTm90RW1wdHkpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIEtlcm5lbFR5cGVBbGlhc0J1aWxkZXIpIHsKICAgICAgICBMaXN0PE9iamVjdD4gaXNzdWVzID0gbGVnYWN5TW9kZQogICAgICAgICAgICA/IGNvbnN0IDxPYmplY3Q+W10KICAgICAgICAgICAgOiBnZXROb25TaW1wbGljaXR5SXNzdWVzRm9yRGVjbGFyYXRpb24oZGVjbGFyYXRpb24sCiAgICAgICAgICAgICAgICBwZXJmb3JtRXJyb3JSZWNvdmVyeTogdHJ1ZSk7CiAgICAgICAgcmVwb3J0SXNzdWVzKGlzc3Vlcyk7CiAgICAgICAgLy8gSW4gY2FzZSBvZiBpc3N1ZXMsIHVzZSBsZWdhY3kgbW9kZSBmb3IgZXJyb3IgcmVjb3ZlcnkuCiAgICAgICAgY291bnQgKz0gY29tcHV0ZURlZmF1bHRUeXBlc0ZvclZhcmlhYmxlcygKICAgICAgICAgICAgZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlcywgbGVnYWN5TW9kZSB8fCBpc3N1ZXMuaXNOb3RFbXB0eSk7CiAgICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24gaXMgS2VybmVsRnVuY3Rpb25CdWlsZGVyKSB7CiAgICAgICAgTGlzdDxPYmplY3Q+IGlzc3VlcyA9IGxlZ2FjeU1vZGUKICAgICAgICAgICAgPyBjb25zdCA8T2JqZWN0PltdCiAgICAgICAgICAgIDogZ2V0Tm9uU2ltcGxpY2l0eUlzc3Vlc0ZvclR5cGVWYXJpYWJsZXMoZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlcyk7CiAgICAgICAgcmVwb3J0SXNzdWVzKGlzc3Vlcyk7CiAgICAgICAgLy8gSW4gY2FzZSBvZiBpc3N1ZXMsIHVzZSBsZWdhY3kgbW9kZSBmb3IgZXJyb3IgcmVjb3ZlcnkuCiAgICAgICAgY291bnQgKz0gY29tcHV0ZURlZmF1bHRUeXBlc0ZvclZhcmlhYmxlcygKICAgICAgICAgICAgZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlcywgbGVnYWN5TW9kZSB8fCBpc3N1ZXMuaXNOb3RFbXB0eSk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gY291bnQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGluY2x1ZGVQYXJ0KAogICAgICBjb3ZhcmlhbnQgS2VybmVsTGlicmFyeUJ1aWxkZXIgcGFydCwgU2V0PFVyaT4gdXNlZFBhcnRzLCBpbnQgcGFydE9mZnNldCkgewogICAgc3VwZXIuaW5jbHVkZVBhcnQocGFydCwgdXNlZFBhcnRzLCBwYXJ0T2Zmc2V0KTsKICAgIG5hdGl2ZU1ldGhvZHMuYWRkQWxsKHBhcnQubmF0aXZlTWV0aG9kcyk7CiAgICBib3VuZGxlc3NUeXBlVmFyaWFibGVzLmFkZEFsbChwYXJ0LmJvdW5kbGVzc1R5cGVWYXJpYWJsZXMpOwogICAgLy8gQ2hlY2sgdGhhdCB0aGUgdGFyZ2V0cyBhcmUgZGlmZmVyZW50LiBUaGlzIGlzIG5vdCBub3JtYWxseSBhIHByb2JsZW0KICAgIC8vIGJ1dCBpcyBmb3IgcGF0Y2ggZmlsZXMuCiAgICBpZiAodGFyZ2V0ICE9IHBhcnQudGFyZ2V0ICYmIHBhcnQudGFyZ2V0LnByb2JsZW1zQXNKc29uICE9IG51bGwpIHsKICAgICAgdGFyZ2V0LnByb2JsZW1zQXNKc29uID8/PSA8U3RyaW5nPltdOwogICAgICB0YXJnZXQucHJvYmxlbXNBc0pzb24uYWRkQWxsKHBhcnQudGFyZ2V0LnByb2JsZW1zQXNKc29uKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWRkSW1wb3J0c1RvU2NvcGUoKSB7CiAgICBzdXBlci5hZGRJbXBvcnRzVG9TY29wZSgpOwogICAgZXhwb3J0U2NvcGUuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIG1lbWJlcikgewogICAgICBpZiAobWVtYmVyLnBhcmVudCAhPSB0aGlzKSB7CiAgICAgICAgc3dpdGNoIChuYW1lKSB7CiAgICAgICAgICBjYXNlICJkeW5hbWljIjoKICAgICAgICAgIGNhc2UgInZvaWQiOgogICAgICAgICAgICB1bnNlcmlhbGl6YWJsZUV4cG9ydHMgPz89IDxTdHJpbmcsIFN0cmluZz57fTsKICAgICAgICAgICAgdW5zZXJpYWxpemFibGVFeHBvcnRzW25hbWVdID0gbnVsbDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgaWYgKG1lbWJlciBpcyBJbnZhbGlkVHlwZUJ1aWxkZXIpIHsKICAgICAgICAgICAgICB1bnNlcmlhbGl6YWJsZUV4cG9ydHMgPz89IDxTdHJpbmcsIFN0cmluZz57fTsKICAgICAgICAgICAgICB1bnNlcmlhbGl6YWJsZUV4cG9ydHNbbmFtZV0gPSBtZW1iZXIubWVzc2FnZS5tZXNzYWdlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGxpYnJhcnkuYWRkaXRpb25hbEV4cG9ydHMuYWRkKG1lbWJlci50YXJnZXQucmVmZXJlbmNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFwcGx5UGF0Y2hlcygpIHsKICAgIGlmICghaXNQYXRjaCkgcmV0dXJuOwogICAgTmFtZUl0ZXJhdG9yIG9yaWdpbkRlY2xhcmF0aW9ucyA9IG9yaWdpbi5uYW1lSXRlcmF0b3I7CiAgICB3aGlsZSAob3JpZ2luRGVjbGFyYXRpb25zLm1vdmVOZXh0KCkpIHsKICAgICAgU3RyaW5nIG5hbWUgPSBvcmlnaW5EZWNsYXJhdGlvbnMubmFtZTsKICAgICAgRGVjbGFyYXRpb24gbWVtYmVyID0gb3JpZ2luRGVjbGFyYXRpb25zLmN1cnJlbnQ7CiAgICAgIGJvb2wgaXNTZXR0ZXIgPSBtZW1iZXIuaXNTZXR0ZXI7CiAgICAgIERlY2xhcmF0aW9uIHBhdGNoID0gaXNTZXR0ZXIgPyBzY29wZS5zZXR0ZXJzW25hbWVdIDogc2NvcGUubG9jYWxbbmFtZV07CiAgICAgIGlmIChwYXRjaCAhPSBudWxsKSB7CiAgICAgICAgLy8gW3BhdGNoXSBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhIFttZW1iZXJdIGluIFtvcmlnaW5dIGxpYnJhcnksIHNvIGl0CiAgICAgICAgLy8gbXVzdCBiZSBhIHBhdGNoIHRvIFttZW1iZXJdLgogICAgICAgIG1lbWJlci5hcHBseVBhdGNoKHBhdGNoKTsKICAgICAgICAvLyBUT0RPKGFoZSk6IFZlcmlmeSB0aGF0IHBhdGNoIGhhcyB0aGUgQHBhdGNoIGFubm90YXRpb24uCiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gTm8gbWVtYmVyIHdpdGggW25hbWVdIGV4aXN0cyBpbiB0aGlzIGxpYnJhcnkgYWxyZWFkeS4gU28gd2UgbmVlZCB0bwogICAgICAgIC8vIGltcG9ydCBpdCBpbnRvIHRoZSBwYXRjaCBsaWJyYXJ5LiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgb3JpZ2luCiAgICAgICAgLy8gbGlicmFyeSBpcyBpbiBzY29wZSBvZiB0aGUgcGF0Y2ggbGlicmFyeS4KICAgICAgICBpZiAoaXNTZXR0ZXIpIHsKICAgICAgICAgIHNjb3BlQnVpbGRlci5hZGRTZXR0ZXIobmFtZSwgbWVtYmVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2NvcGVCdWlsZGVyLmFkZE1lbWJlcihuYW1lLCBtZW1iZXIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgTmFtZUl0ZXJhdG9yIHBhdGNoRGVjbGFyYXRpb25zID0gbmFtZUl0ZXJhdG9yOwogICAgd2hpbGUgKHBhdGNoRGVjbGFyYXRpb25zLm1vdmVOZXh0KCkpIHsKICAgICAgU3RyaW5nIG5hbWUgPSBwYXRjaERlY2xhcmF0aW9ucy5uYW1lOwogICAgICBEZWNsYXJhdGlvbiBtZW1iZXIgPSBwYXRjaERlY2xhcmF0aW9ucy5jdXJyZW50OwogICAgICAvLyBXZSBuZWVkIHRvIGluamVjdCBhbGwgbm9uLXBhdGNoIG1lbWJlcnMgaW50byB0aGUgb3JpZ2luIGxpYnJhcnkuIFRoaXMKICAgICAgLy8gc2hvdWxkIG9ubHkgYXBwbHkgdG8gcHJpdmF0ZSBtZW1iZXJzLgogICAgICBpZiAobWVtYmVyLmlzUGF0Y2gpIHsKICAgICAgICAvLyBJZ25vcmUgcGF0Y2hlcy4KICAgICAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoIl8iKSkgewogICAgICAgIG9yaWdpbi5pbmplY3RNZW1iZXJGcm9tUGF0Y2gobmFtZSwgbWVtYmVyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvcmlnaW4uZXhwb3J0TWVtYmVyRnJvbVBhdGNoKG5hbWUsIG1lbWJlcik7CiAgICAgIH0KICAgIH0KICB9CgogIGludCBmaW5pc2hQYXRjaE1ldGhvZHMoKSB7CiAgICBpZiAoIWlzUGF0Y2gpIHJldHVybiAwOwogICAgaW50IGNvdW50ID0gMDsKICAgIEl0ZXJhdG9yPERlY2xhcmF0aW9uPiBpdGVyYXRvciA9IHRoaXMuaXRlcmF0b3I7CiAgICB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICBjb3VudCArPSBpdGVyYXRvci5jdXJyZW50LmZpbmlzaFBhdGNoKCk7CiAgICB9CiAgICByZXR1cm4gY291bnQ7CiAgfQoKICB2b2lkIGluamVjdE1lbWJlckZyb21QYXRjaChTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gbWVtYmVyKSB7CiAgICBpZiAobWVtYmVyLmlzU2V0dGVyKSB7CiAgICAgIGFzc2VydChzY29wZS5zZXR0ZXJzW25hbWVdID09IG51bGwpOwogICAgICBzY29wZUJ1aWxkZXIuYWRkU2V0dGVyKG5hbWUsIG1lbWJlcik7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoc2NvcGUubG9jYWxbbmFtZV0gPT0gbnVsbCk7CiAgICAgIHNjb3BlQnVpbGRlci5hZGRNZW1iZXIobmFtZSwgbWVtYmVyKTsKICAgIH0KICB9CgogIHZvaWQgZXhwb3J0TWVtYmVyRnJvbVBhdGNoKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBtZW1iZXIpIHsKICAgIGlmICh1cmkuc2NoZW1lICE9ICJkYXJ0IiB8fCAhdXJpLnBhdGguc3RhcnRzV2l0aCgiXyIpKSB7CiAgICAgIGFkZFByb2JsZW0odGVtcGxhdGVQYXRjaEluamVjdGlvbkZhaWxlZC53aXRoQXJndW1lbnRzKG5hbWUsIHVyaSksCiAgICAgICAgICBtZW1iZXIuY2hhck9mZnNldCwgbm9MZW5ndGgsIG1lbWJlci5maWxlVXJpKTsKICAgIH0KICAgIC8vIFBsYXRmb3JtLXByaXZhdGUgbGlicmFyaWVzLCBzdWNoIGFzICJkYXJ0Ol9pbnRlcm5hbCIgaGF2ZSBzcGVjaWFsCiAgICAvLyBzZW1hbnRpY3M6IHB1YmxpYyBtZW1iZXJzIGFyZSBpbmplY3RlZCBpbnRvIHRoZSBvcmlnaW4gbGlicmFyeS4KICAgIC8vIFRPRE8oYWhlKTogU2VlIGlmIHdlIGNhbiByZW1vdmUgdGhpcyBzcGVjaWFsIGNhc2UuCgogICAgLy8gSWYgdGhpcyBtZW1iZXIgYWxyZWFkeSBleGlzdCBpbiB0aGUgb3JpZ2luIGxpYnJhcnkgc2NvcGUsIGl0IHNob3VsZAogICAgLy8gaGF2ZSBiZWVuIG1hcmtlZCBhcyBwYXRjaC4KICAgIGFzc2VydCgobWVtYmVyLmlzU2V0dGVyICYmIHNjb3BlLnNldHRlcnNbbmFtZV0gPT0gbnVsbCkgfHwKICAgICAgICAoIW1lbWJlci5pc1NldHRlciAmJiBzY29wZS5sb2NhbFtuYW1lXSA9PSBudWxsKSk7CiAgICBhZGRUb0V4cG9ydFNjb3BlKG5hbWUsIG1lbWJlcik7CiAgfQoKICB2b2lkIHJlcG9ydFR5cGVBcmd1bWVudElzc3VlcyhMaXN0PFR5cGVBcmd1bWVudElzc3VlPiBpc3N1ZXMsIGludCBvZmZzZXQsCiAgICAgIHtib29sIGluZmVycmVkLCBEYXJ0VHlwZSB0YXJnZXRSZWNlaXZlciwgU3RyaW5nIHRhcmdldE5hbWV9KSB7CiAgICBmb3IgKFR5cGVBcmd1bWVudElzc3VlIGlzc3VlIGluIGlzc3VlcykgewogICAgICBEYXJ0VHlwZSBhcmd1bWVudCA9IGlzc3VlLmFyZ3VtZW50OwogICAgICBUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSBpc3N1ZS50eXBlUGFyYW1ldGVyOwoKICAgICAgTWVzc2FnZSBtZXNzYWdlOwogICAgICBib29sIGlzc3VlSW5mZXJyZWQgPSBpbmZlcnJlZCA/PyBpbmZlcnJlZFR5cGVzLmNvbnRhaW5zKGFyZ3VtZW50KTsKICAgICAgaWYgKGFyZ3VtZW50IGlzIEZ1bmN0aW9uVHlwZSAmJiBhcmd1bWVudC50eXBlUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7CiAgICAgICAgaWYgKGlzc3VlSW5mZXJyZWQpIHsKICAgICAgICAgIG1lc3NhZ2UgPSB0ZW1wbGF0ZUdlbmVyaWNGdW5jdGlvblR5cGVJbmZlcnJlZEFzQWN0dWFsVHlwZUFyZ3VtZW50CiAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoYXJndW1lbnQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZUdlbmVyaWNGdW5jdGlvblR5cGVVc2VkQXNBY3R1YWxUeXBlQXJndW1lbnQ7CiAgICAgICAgfQogICAgICAgIHR5cGVQYXJhbWV0ZXIgPSBudWxsOwogICAgICB9IGVsc2UgaWYgKGFyZ3VtZW50IGlzIFR5cGVQYXJhbWV0ZXJUeXBlICYmCiAgICAgICAgICBhcmd1bWVudC5wcm9tb3RlZEJvdW5kICE9IG51bGwpIHsKICAgICAgICBhZGRQcm9ibGVtKAogICAgICAgICAgICB0ZW1wbGF0ZUludGVyc2VjdGlvblR5cGVBc1R5cGVBcmd1bWVudC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5uYW1lLCBhcmd1bWVudCwgYXJndW1lbnQucHJvbW90ZWRCb3VuZCksCiAgICAgICAgICAgIG9mZnNldCwKICAgICAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgICAgIGZpbGVVcmkpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChpc3N1ZS5lbmNsb3NpbmdUeXBlID09IG51bGwgJiYgdGFyZ2V0UmVjZWl2ZXIgIT0gbnVsbCkgewogICAgICAgICAgaWYgKGlzc3VlSW5mZXJyZWQpIHsKICAgICAgICAgICAgbWVzc2FnZSA9CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZEluZmVycmVkLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQsCiAgICAgICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5ib3VuZCwKICAgICAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UmVjZWl2ZXIsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtZXNzYWdlID0gdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWQud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgIGFyZ3VtZW50LAogICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5ib3VuZCwKICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIubmFtZSwKICAgICAgICAgICAgICAgIHRhcmdldFJlY2VpdmVyLAogICAgICAgICAgICAgICAgdGFyZ2V0TmFtZSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIFN0cmluZyBlbmNsb3NpbmdOYW1lID0gaXNzdWUuZW5jbG9zaW5nVHlwZSA9PSBudWxsCiAgICAgICAgICAgICAgPyB0YXJnZXROYW1lCiAgICAgICAgICAgICAgOiBnZXRHZW5lcmljVHlwZU5hbWUoaXNzdWUuZW5jbG9zaW5nVHlwZSk7CiAgICAgICAgICBhc3NlcnQoZW5jbG9zaW5nTmFtZSAhPSBudWxsKTsKICAgICAgICAgIGlmIChpc3N1ZUluZmVycmVkKSB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudEluZmVycmVkLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICBhcmd1bWVudCwKICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIuYm91bmQsCiAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLm5hbWUsCiAgICAgICAgICAgICAgICBlbmNsb3NpbmdOYW1lKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudC53aXRoQXJndW1lbnRzKGFyZ3VtZW50LAogICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5ib3VuZCwgdHlwZVBhcmFtZXRlci5uYW1lLCBlbmNsb3NpbmdOYW1lKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJlcG9ydFR5cGVBcmd1bWVudElzc3VlKG1lc3NhZ2UsIG9mZnNldCwgdHlwZVBhcmFtZXRlcik7CiAgICB9CiAgfQoKICB2b2lkIHJlcG9ydFR5cGVBcmd1bWVudElzc3VlKAogICAgICBNZXNzYWdlIG1lc3NhZ2UsIGludCBmaWxlT2Zmc2V0LCBUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIpIHsKICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQ7CiAgICBpZiAodHlwZVBhcmFtZXRlciAhPSBudWxsICYmIHR5cGVQYXJhbWV0ZXIuZmlsZU9mZnNldCAhPSAtMSkgewogICAgICAvLyBJdCBsb29rcyBsaWtlIHdoZW4gcGFyYW1ldGVycyBjb21lIGZyb20gcGF0Y2ggZmlsZXMsIHRoZXkgZG9uJ3QKICAgICAgLy8gaGF2ZSBhIHJlcG9ydGFibGUgbG9jYXRpb24uCiAgICAgIGNvbnRleHQgPSA8TG9jYXRlZE1lc3NhZ2U+WwogICAgICAgIG1lc3NhZ2VJbmNvcnJlY3RUeXBlQXJndW1lbnRWYXJpYWJsZS53aXRoTG9jYXRpb24oCiAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIubG9jYXRpb24uZmlsZSwgdHlwZVBhcmFtZXRlci5maWxlT2Zmc2V0LCBub0xlbmd0aCkKICAgICAgXTsKICAgIH0KICAgIGFkZFByb2JsZW0obWVzc2FnZSwgZmlsZU9mZnNldCwgbm9MZW5ndGgsIGZpbGVVcmksIGNvbnRleHQ6IGNvbnRleHQpOwogIH0KCiAgdm9pZCBjaGVja0JvdW5kc0luRmllbGQoRmllbGQgZmllbGQsIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQpIHsKICAgIGlmIChsb2FkZXIudGFyZ2V0LmxlZ2FjeU1vZGUpIHJldHVybjsKICAgIGNoZWNrQm91bmRzSW5UeXBlKGZpZWxkLnR5cGUsIHR5cGVFbnZpcm9ubWVudCwgZmllbGQuZmlsZU9mZnNldCwKICAgICAgICBhbGxvd1N1cGVyQm91bmRlZDogdHJ1ZSk7CiAgfQoKICB2b2lkIGNoZWNrQm91bmRzSW5GdW5jdGlvbk5vZGVQYXJ0cygKICAgICAgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwgaW50IGZpbGVPZmZzZXQsCiAgICAgIHtMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVycywKICAgICAgRGFydFR5cGUgcmV0dXJuVHlwZX0pIHsKICAgIGlmIChsb2FkZXIudGFyZ2V0LmxlZ2FjeU1vZGUpIHJldHVybjsKICAgIGlmICh0eXBlUGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIGZvciAoVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIgaW4gdHlwZVBhcmFtZXRlcnMpIHsKICAgICAgICBjaGVja0JvdW5kc0luVHlwZSgKICAgICAgICAgICAgcGFyYW1ldGVyLmJvdW5kLCB0eXBlRW52aXJvbm1lbnQsIHBhcmFtZXRlci5maWxlT2Zmc2V0LAogICAgICAgICAgICBhbGxvd1N1cGVyQm91bmRlZDogZmFsc2UpOwogICAgICB9CiAgICB9CiAgICBpZiAocG9zaXRpb25hbFBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICBmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb24gZm9ybWFsIGluIHBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgICAgY2hlY2tCb3VuZHNJblR5cGUoZm9ybWFsLnR5cGUsIHR5cGVFbnZpcm9ubWVudCwgZm9ybWFsLmZpbGVPZmZzZXQsCiAgICAgICAgICAgIGFsbG93U3VwZXJCb3VuZGVkOiB0cnVlKTsKICAgICAgfQogICAgfQogICAgaWYgKG5hbWVkUGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIGZvciAoVmFyaWFibGVEZWNsYXJhdGlvbiBuYW1lZCBpbiBuYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgICBjaGVja0JvdW5kc0luVHlwZShuYW1lZC50eXBlLCB0eXBlRW52aXJvbm1lbnQsIG5hbWVkLmZpbGVPZmZzZXQsCiAgICAgICAgICAgIGFsbG93U3VwZXJCb3VuZGVkOiB0cnVlKTsKICAgICAgfQogICAgfQogICAgaWYgKHJldHVyblR5cGUgIT0gbnVsbCkgewogICAgICBMaXN0PFR5cGVBcmd1bWVudElzc3VlPiBpc3N1ZXMgPSBmaW5kVHlwZUFyZ3VtZW50SXNzdWVzKAogICAgICAgICAgcmV0dXJuVHlwZSwgdHlwZUVudmlyb25tZW50LAogICAgICAgICAgYWxsb3dTdXBlckJvdW5kZWQ6IHRydWUpOwogICAgICBpZiAoaXNzdWVzICE9IG51bGwpIHsKICAgICAgICBpbnQgb2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgICAgICBmb3IgKFR5cGVBcmd1bWVudElzc3VlIGlzc3VlIGluIGlzc3VlcykgewogICAgICAgICAgRGFydFR5cGUgYXJndW1lbnQgPSBpc3N1ZS5hcmd1bWVudDsKICAgICAgICAgIFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IGlzc3VlLnR5cGVQYXJhbWV0ZXI7CgogICAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBjaGVjayBpZiBbYXJndW1lbnRdIHdhcyBpbmZlcnJlZCBvciBzcGVjaWZpZWQKICAgICAgICAgIC8vIGhlcmUsIGJlY2F1c2UgaW5mZXJlbmNlIGluIHJldHVybiB0eXBlcyBib2lscyBkb3duIHRvIGluc3RhbnRpYXRlLQogICAgICAgICAgLy8gLXRvLWJvdW5kLCBhbmQgaXQgY2FuJ3QgcHJvdmlkZSBhIHR5cGUgdGhhdCB2aW9sYXRlcyB0aGUgYm91bmQuCiAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2U7CiAgICAgICAgICBpZiAoYXJndW1lbnQgaXMgRnVuY3Rpb25UeXBlICYmIGFyZ3VtZW50LnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VHZW5lcmljRnVuY3Rpb25UeXBlVXNlZEFzQWN0dWFsVHlwZUFyZ3VtZW50OwogICAgICAgICAgICB0eXBlUGFyYW1ldGVyID0gbnVsbDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudEluUmV0dXJuVHlwZS53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgYXJndW1lbnQsCiAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLmJvdW5kLAogICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5uYW1lLAogICAgICAgICAgICAgICAgZ2V0R2VuZXJpY1R5cGVOYW1lKGlzc3VlLmVuY2xvc2luZ1R5cGUpKTsKICAgICAgICAgIH0KCiAgICAgICAgICByZXBvcnRUeXBlQXJndW1lbnRJc3N1ZShtZXNzYWdlLCBvZmZzZXQsIHR5cGVQYXJhbWV0ZXIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBjaGVja0JvdW5kc0luRnVuY3Rpb25Ob2RlKAogICAgICBGdW5jdGlvbk5vZGUgZnVuY3Rpb24sIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQpIHsKICAgIGlmIChsb2FkZXIudGFyZ2V0LmxlZ2FjeU1vZGUpIHJldHVybjsKICAgIGNoZWNrQm91bmRzSW5GdW5jdGlvbk5vZGVQYXJ0cyh0eXBlRW52aXJvbm1lbnQsIGZ1bmN0aW9uLmZpbGVPZmZzZXQsCiAgICAgICAgdHlwZVBhcmFtZXRlcnM6IGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzOiBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycywKICAgICAgICBuYW1lZFBhcmFtZXRlcnM6IGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycywKICAgICAgICByZXR1cm5UeXBlOiBmdW5jdGlvbi5yZXR1cm5UeXBlKTsKICB9CgogIHZvaWQgY2hlY2tCb3VuZHNJbkxpc3RMaXRlcmFsKAogICAgICBMaXN0TGl0ZXJhbCBub2RlLCBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LAogICAgICB7Ym9vbCBpbmZlcnJlZCA9IGZhbHNlfSkgewogICAgaWYgKGxvYWRlci50YXJnZXQubGVnYWN5TW9kZSkgcmV0dXJuOwogICAgY2hlY2tCb3VuZHNJblR5cGUobm9kZS50eXBlQXJndW1lbnQsIHR5cGVFbnZpcm9ubWVudCwgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgIGluZmVycmVkOiBpbmZlcnJlZCwgYWxsb3dTdXBlckJvdW5kZWQ6IHRydWUpOwogIH0KCiAgdm9pZCBjaGVja0JvdW5kc0luU2V0TGl0ZXJhbChTZXRMaXRlcmFsIG5vZGUsIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQsCiAgICAgIHtib29sIGluZmVycmVkID0gZmFsc2V9KSB7CiAgICBpZiAobG9hZGVyLnRhcmdldC5sZWdhY3lNb2RlKSByZXR1cm47CiAgICBjaGVja0JvdW5kc0luVHlwZShub2RlLnR5cGVBcmd1bWVudCwgdHlwZUVudmlyb25tZW50LCBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgaW5mZXJyZWQ6IGluZmVycmVkLCBhbGxvd1N1cGVyQm91bmRlZDogdHJ1ZSk7CiAgfQoKICB2b2lkIGNoZWNrQm91bmRzSW5NYXBMaXRlcmFsKE1hcExpdGVyYWwgbm9kZSwgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwKICAgICAge2Jvb2wgaW5mZXJyZWQgPSBmYWxzZX0pIHsKICAgIGlmIChsb2FkZXIudGFyZ2V0LmxlZ2FjeU1vZGUpIHJldHVybjsKICAgIGNoZWNrQm91bmRzSW5UeXBlKG5vZGUua2V5VHlwZSwgdHlwZUVudmlyb25tZW50LCBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgaW5mZXJyZWQ6IGluZmVycmVkLCBhbGxvd1N1cGVyQm91bmRlZDogdHJ1ZSk7CiAgICBjaGVja0JvdW5kc0luVHlwZShub2RlLnZhbHVlVHlwZSwgdHlwZUVudmlyb25tZW50LCBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgaW5mZXJyZWQ6IGluZmVycmVkLCBhbGxvd1N1cGVyQm91bmRlZDogdHJ1ZSk7CiAgfQoKICB2b2lkIGNoZWNrQm91bmRzSW5UeXBlKAogICAgICBEYXJ0VHlwZSB0eXBlLCBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LCBpbnQgb2Zmc2V0LAogICAgICB7Ym9vbCBpbmZlcnJlZCwgYm9vbCBhbGxvd1N1cGVyQm91bmRlZCA9IHRydWV9KSB7CiAgICBpZiAobG9hZGVyLnRhcmdldC5sZWdhY3lNb2RlKSByZXR1cm47CiAgICBMaXN0PFR5cGVBcmd1bWVudElzc3VlPiBpc3N1ZXMgPSBmaW5kVHlwZUFyZ3VtZW50SXNzdWVzKAogICAgICAgIHR5cGUsIHR5cGVFbnZpcm9ubWVudCwKICAgICAgICBhbGxvd1N1cGVyQm91bmRlZDogYWxsb3dTdXBlckJvdW5kZWQpOwogICAgaWYgKGlzc3VlcyAhPSBudWxsKSB7CiAgICAgIHJlcG9ydFR5cGVBcmd1bWVudElzc3Vlcyhpc3N1ZXMsIG9mZnNldCwgaW5mZXJyZWQ6IGluZmVycmVkKTsKICAgIH0KICB9CgogIHZvaWQgY2hlY2tCb3VuZHNJblZhcmlhYmxlRGVjbGFyYXRpb24oCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSwgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwKICAgICAge2Jvb2wgaW5mZXJyZWQgPSBmYWxzZX0pIHsKICAgIGlmIChsb2FkZXIudGFyZ2V0LmxlZ2FjeU1vZGUpIHJldHVybjsKICAgIGlmIChub2RlLnR5cGUgPT0gbnVsbCkgcmV0dXJuOwogICAgY2hlY2tCb3VuZHNJblR5cGUobm9kZS50eXBlLCB0eXBlRW52aXJvbm1lbnQsIG5vZGUuZmlsZU9mZnNldCwKICAgICAgICBpbmZlcnJlZDogaW5mZXJyZWQsIGFsbG93U3VwZXJCb3VuZGVkOiB0cnVlKTsKICB9CgogIHZvaWQgY2hlY2tCb3VuZHNJbkNvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUsIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQsCiAgICAgIHtib29sIGluZmVycmVkID0gZmFsc2V9KSB7CiAgICBpZiAobG9hZGVyLnRhcmdldC5sZWdhY3lNb2RlKSByZXR1cm47CiAgICBpZiAobm9kZS5hcmd1bWVudHMudHlwZXMuaXNFbXB0eSkgcmV0dXJuOwogICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBub2RlLnRhcmdldDsKICAgIENsYXNzIGtsYXNzID0gY29uc3RydWN0b3IuZW5jbG9zaW5nQ2xhc3M7CiAgICBEYXJ0VHlwZSBjb25zdHJ1Y3RlZFR5cGUgPSBuZXcgSW50ZXJmYWNlVHlwZShrbGFzcywgbm9kZS5hcmd1bWVudHMudHlwZXMpOwogICAgY2hlY2tCb3VuZHNJblR5cGUoY29uc3RydWN0ZWRUeXBlLCB0eXBlRW52aXJvbm1lbnQsIG5vZGUuZmlsZU9mZnNldCwKICAgICAgICBpbmZlcnJlZDogaW5mZXJyZWQsIGFsbG93U3VwZXJCb3VuZGVkOiBmYWxzZSk7CiAgfQoKICB2b2lkIGNoZWNrQm91bmRzSW5GYWN0b3J5SW52b2NhdGlvbigKICAgICAgU3RhdGljSW52b2NhdGlvbiBub2RlLCBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LAogICAgICB7Ym9vbCBpbmZlcnJlZCA9IGZhbHNlfSkgewogICAgaWYgKGxvYWRlci50YXJnZXQubGVnYWN5TW9kZSkgcmV0dXJuOwogICAgaWYgKG5vZGUuYXJndW1lbnRzLnR5cGVzLmlzRW1wdHkpIHJldHVybjsKICAgIFByb2NlZHVyZSBmYWN0b3J5ID0gbm9kZS50YXJnZXQ7CiAgICBhc3NlcnQoZmFjdG9yeS5pc0ZhY3RvcnkpOwogICAgQ2xhc3Mga2xhc3MgPSBmYWN0b3J5LmVuY2xvc2luZ0NsYXNzOwogICAgRGFydFR5cGUgY29uc3RydWN0ZWRUeXBlID0gbmV3IEludGVyZmFjZVR5cGUoa2xhc3MsIG5vZGUuYXJndW1lbnRzLnR5cGVzKTsKICAgIGNoZWNrQm91bmRzSW5UeXBlKGNvbnN0cnVjdGVkVHlwZSwgdHlwZUVudmlyb25tZW50LCBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgaW5mZXJyZWQ6IGluZmVycmVkLCBhbGxvd1N1cGVyQm91bmRlZDogZmFsc2UpOwogIH0KCiAgdm9pZCBjaGVja0JvdW5kc0luU3RhdGljSW52b2NhdGlvbigKICAgICAgU3RhdGljSW52b2NhdGlvbiBub2RlLCBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LAogICAgICB7Ym9vbCBpbmZlcnJlZCA9IGZhbHNlfSkgewogICAgaWYgKGxvYWRlci50YXJnZXQubGVnYWN5TW9kZSkgcmV0dXJuOwogICAgaWYgKG5vZGUuYXJndW1lbnRzLnR5cGVzLmlzRW1wdHkpIHJldHVybjsKICAgIENsYXNzIGtsYXNzID0gbm9kZS50YXJnZXQuZW5jbG9zaW5nQ2xhc3M7CiAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBub2RlLnRhcmdldC5mdW5jdGlvbi50eXBlUGFyYW1ldGVyczsKICAgIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cyA9IG5vZGUuYXJndW1lbnRzLnR5cGVzOwogICAgLy8gVGhlIGZvbGxvd2luZyBlcnJvciBpcyB0byBiZSByZXBvcnRlZCBlbHNld2hlcmUuCiAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggIT0gYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuOwogICAgTGlzdDxUeXBlQXJndW1lbnRJc3N1ZT4gaXNzdWVzID0gZmluZFR5cGVBcmd1bWVudElzc3Vlc0Zvckludm9jYXRpb24oCiAgICAgICAgcGFyYW1ldGVycywgYXJndW1lbnRzLCB0eXBlRW52aXJvbm1lbnQpOwogICAgaWYgKGlzc3VlcyAhPSBudWxsKSB7CiAgICAgIERhcnRUeXBlIHRhcmdldFJlY2VpdmVyOwogICAgICBpZiAoa2xhc3MgIT0gbnVsbCkgewogICAgICAgIHRhcmdldFJlY2VpdmVyID0gbmV3IEludGVyZmFjZVR5cGUoa2xhc3MpOwogICAgICB9CiAgICAgIFN0cmluZyB0YXJnZXROYW1lID0gbm9kZS50YXJnZXQubmFtZS5uYW1lOwogICAgICByZXBvcnRUeXBlQXJndW1lbnRJc3N1ZXMoaXNzdWVzLCBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgICBpbmZlcnJlZDogaW5mZXJyZWQsCiAgICAgICAgICB0YXJnZXRSZWNlaXZlcjogdGFyZ2V0UmVjZWl2ZXIsCiAgICAgICAgICB0YXJnZXROYW1lOiB0YXJnZXROYW1lKTsKICAgIH0KICB9CgogIHZvaWQgY2hlY2tCb3VuZHNJbk1ldGhvZEludm9jYXRpb24oCiAgICAgIERhcnRUeXBlIHJlY2VpdmVyVHlwZSwKICAgICAgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwKICAgICAgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5LAogICAgICBUeXBlSW5mZXJyZXJJbXBsIHR5cGVJbmZlcnJlciwKICAgICAgTmFtZSBuYW1lLAogICAgICBNZW1iZXIgaW50ZXJmYWNlVGFyZ2V0LAogICAgICBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICBpbnQgb2Zmc2V0LAogICAgICB7Ym9vbCBpbmZlcnJlZCA9IGZhbHNlfSkgewogICAgaWYgKGxvYWRlci50YXJnZXQubGVnYWN5TW9kZSkgcmV0dXJuOwogICAgaWYgKGFyZ3VtZW50cy50eXBlcy5pc0VtcHR5KSByZXR1cm47CiAgICBDbGFzcyBrbGFzczsKICAgIExpc3Q8RGFydFR5cGU+IHJlY2VpdmVyVHlwZUFyZ3VtZW50czsKICAgIGlmIChyZWNlaXZlclR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICBrbGFzcyA9IHJlY2VpdmVyVHlwZS5jbGFzc05vZGU7CiAgICAgIHJlY2VpdmVyVHlwZUFyZ3VtZW50cyA9IHJlY2VpdmVyVHlwZS50eXBlQXJndW1lbnRzOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gVE9ETyhkbWl0cnlhcyk6IEZpbmQgYSBiZXR0ZXIgd2F5IHRoYW4gcmVseWluZyBvbiBbaW50ZXJmYWNlVGFyZ2V0XS4KICAgIE1lbWJlciBtZXRob2QgPSBoaWVyYXJjaHkuZ2V0RGlzcGF0Y2hUYXJnZXQoa2xhc3MsIG5hbWUpID8/IGludGVyZmFjZVRhcmdldDsKICAgIGlmIChtZXRob2QgPT0gbnVsbCB8fCBtZXRob2QgaXMhIFByb2NlZHVyZSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoa2xhc3MgIT0gbWV0aG9kLmVuY2xvc2luZ0NsYXNzKSB7CiAgICAgIFN1cGVydHlwZSBwYXJlbnQgPQogICAgICAgICAgaGllcmFyY2h5LmdldENsYXNzQXNJbnN0YW5jZU9mKGtsYXNzLCBtZXRob2QuZW5jbG9zaW5nQ2xhc3MpOwogICAgICBrbGFzcyA9IG1ldGhvZC5lbmNsb3NpbmdDbGFzczsKICAgICAgcmVjZWl2ZXJUeXBlQXJndW1lbnRzID0gcGFyZW50LnR5cGVBcmd1bWVudHM7CiAgICB9CiAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbk1hcCA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVjZWl2ZXJUeXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgIHN1YnN0aXR1dGlvbk1hcFtrbGFzcy50eXBlUGFyYW1ldGVyc1tpXV0gPSByZWNlaXZlclR5cGVBcmd1bWVudHNbaV07CiAgICB9CiAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IG1ldGhvZFBhcmFtZXRlcnMgPSBtZXRob2QuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnM7CiAgICAvLyBUaGUgZXJyb3IgaXMgdG8gYmUgcmVwb3J0ZWQgZWxzZXdoZXJlLgogICAgaWYgKG1ldGhvZFBhcmFtZXRlcnMubGVuZ3RoICE9IGFyZ3VtZW50cy50eXBlcy5sZW5ndGgpIHJldHVybjsKICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gaW5zdGFudGlhdGVkTWV0aG9kUGFyYW1ldGVycyA9CiAgICAgICAgbmV3IExpc3Q8VHlwZVBhcmFtZXRlcj4uZmlsbGVkKG1ldGhvZFBhcmFtZXRlcnMubGVuZ3RoLCBudWxsKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFudGlhdGVkTWV0aG9kUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICBpbnN0YW50aWF0ZWRNZXRob2RQYXJhbWV0ZXJzW2ldID0KICAgICAgICAgIG5ldyBUeXBlUGFyYW1ldGVyKG1ldGhvZFBhcmFtZXRlcnNbaV0ubmFtZSk7CiAgICAgIHN1YnN0aXR1dGlvbk1hcFttZXRob2RQYXJhbWV0ZXJzW2ldXSA9CiAgICAgICAgICBuZXcgVHlwZVBhcmFtZXRlclR5cGUoaW5zdGFudGlhdGVkTWV0aG9kUGFyYW1ldGVyc1tpXSk7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbnRpYXRlZE1ldGhvZFBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgaW5zdGFudGlhdGVkTWV0aG9kUGFyYW1ldGVyc1tpXS5ib3VuZCA9CiAgICAgICAgICBzdWJzdGl0dXRlKG1ldGhvZFBhcmFtZXRlcnNbaV0uYm91bmQsIHN1YnN0aXR1dGlvbk1hcCk7CiAgICB9CiAgICBMaXN0PFR5cGVBcmd1bWVudElzc3VlPiBpc3N1ZXMgPSBmaW5kVHlwZUFyZ3VtZW50SXNzdWVzRm9ySW52b2NhdGlvbigKICAgICAgICBpbnN0YW50aWF0ZWRNZXRob2RQYXJhbWV0ZXJzLCBhcmd1bWVudHMudHlwZXMsIHR5cGVFbnZpcm9ubWVudCk7CiAgICBpZiAoaXNzdWVzICE9IG51bGwpIHsKICAgICAgcmVwb3J0VHlwZUFyZ3VtZW50SXNzdWVzKGlzc3Vlcywgb2Zmc2V0LAogICAgICAgICAgaW5mZXJyZWQ6IGluZmVycmVkLAogICAgICAgICAgdGFyZ2V0UmVjZWl2ZXI6IHJlY2VpdmVyVHlwZSwKICAgICAgICAgIHRhcmdldE5hbWU6IG5hbWUubmFtZSk7CiAgICB9CiAgfQoKICB2b2lkIGNoZWNrQm91bmRzSW5PdXRsaW5lKFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQpIHsKICAgIGlmIChsb2FkZXIudGFyZ2V0LmxlZ2FjeU1vZGUpIHJldHVybjsKICAgIEl0ZXJhdG9yPERlY2xhcmF0aW9uPiBpdGVyYXRvciA9IHRoaXMuaXRlcmF0b3I7CiAgICB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IGl0ZXJhdG9yLmN1cnJlbnQ7CiAgICAgIGlmIChkZWNsYXJhdGlvbiBpcyBLZXJuZWxGaWVsZEJ1aWxkZXIpIHsKICAgICAgICBjaGVja0JvdW5kc0luRmllbGQoZGVjbGFyYXRpb24udGFyZ2V0LCB0eXBlRW52aXJvbm1lbnQpOwogICAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIEtlcm5lbFByb2NlZHVyZUJ1aWxkZXIpIHsKICAgICAgICBjaGVja0JvdW5kc0luRnVuY3Rpb25Ob2RlKGRlY2xhcmF0aW9uLnRhcmdldC5mdW5jdGlvbiwgdHlwZUVudmlyb25tZW50KTsKICAgICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBLZXJuZWxDbGFzc0J1aWxkZXIpIHsKICAgICAgICBkZWNsYXJhdGlvbi5jaGVja0JvdW5kc0luT3V0bGluZSh0eXBlRW52aXJvbm1lbnQpOwogICAgICB9CiAgICB9CiAgICBpbmZlcnJlZFR5cGVzLmNsZWFyKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZmluYWxpemVJbml0aWFsaXppbmdGb3JtYWxzKCkgewogICAgaWYgKCFsZWdhY3lNb2RlIHx8IHVudHlwZWRJbml0aWFsaXppbmdGb3JtYWxzID09IG51bGwpIHJldHVybiAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bnR5cGVkSW5pdGlhbGl6aW5nRm9ybWFscy5sZW5ndGg7IGkrKykgewogICAgICB1bnR5cGVkSW5pdGlhbGl6aW5nRm9ybWFsc1tpXS5maW5hbGl6ZUluaXRpYWxpemluZ0Zvcm1hbCgpOwogICAgfQogICAgaW50IGNvdW50ID0gdW50eXBlZEluaXRpYWxpemluZ0Zvcm1hbHMubGVuZ3RoOwogICAgdW50eXBlZEluaXRpYWxpemluZ0Zvcm1hbHMgPSBudWxsOwogICAgcmV0dXJuIGNvdW50OwogIH0KfQoKVXJpIGNvbXB1dGVMaWJyYXJ5VXJpKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CiAgRGVjbGFyYXRpb24gY3VycmVudCA9IGRlY2xhcmF0aW9uOwogIGRvIHsKICAgIGlmIChjdXJyZW50IGlzIExpYnJhcnlCdWlsZGVyKSByZXR1cm4gY3VycmVudC51cmk7CiAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7CiAgfSB3aGlsZSAoY3VycmVudCAhPSBudWxsKTsKICByZXR1cm4gdW5oYW5kbGVkKCJubyBsaWJyYXJ5IHBhcmVudCIsICIke2RlY2xhcmF0aW9uLnJ1bnRpbWVUeXBlfSIsCiAgICAgIGRlY2xhcmF0aW9uLmNoYXJPZmZzZXQsIGRlY2xhcmF0aW9uLmZpbGVVcmkpOwp9CgpTdHJpbmcgZXh0cmFjdE5hbWUobmFtZSkgPT4gbmFtZSBp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RC5CBkpJGi8eKCIGBAE/KjQiMi9BOlE2OwgGGwQBDCZFQkIGMycSBAIBMSUHNx4dRjQCAUYBPnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2xpYnJhcnlfYnVpbGRlci5kYXJ0N3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9saWJyYXJ5X2dyYXBoLmRhcnSGPS8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmxpYnJhcnlfZ3JhcGg7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2tlcm5lbC5kYXJ0JwogICAgc2hvdyBMaWJyYXJ5LCBMaWJyYXJ5RGVwZW5kZW5jeSwgTGlicmFyeVBhcnQ7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3V0aWwvZ3JhcGguZGFydCcgc2hvdyBHcmFwaDsKCmNsYXNzIExpYnJhcnlHcmFwaCBpbXBsZW1lbnRzIEdyYXBoPFVyaT4gewogIGZpbmFsIE1hcDxVcmksIExpYnJhcnk+IGxpYnJhcmllczsKCiAgTGlicmFyeUdyYXBoKHRoaXMubGlicmFyaWVzKTsKCiAgSXRlcmFibGU8VXJpPiBnZXQgdmVydGljZXMgPT4gbGlicmFyaWVzLmtleXM7CgogIEl0ZXJhYmxlPFVyaT4gbmVpZ2hib3JzT2YoVXJpIHZlcnRleCkgc3luYyogewogICAgTGlicmFyeSBsaWJyYXJ5ID0gbGlicmFyaWVzW3ZlcnRleF07CiAgICBpZiAobGlicmFyeSA9PSBudWxsKSB7CiAgICAgIHRocm93ICJMaWJyYXJ5IG5vdCBmb3VuZDogJHZlcnRleCI7CiAgICB9CgogICAgLy8gSW1wb3J0cyBhbmQgZXhwb3J0cy4KICAgIGZvciAoTGlicmFyeURlcGVuZGVuY3kgZGVwZW5kZW5jeSBpbiBsaWJyYXJ5LmRlcGVuZGVuY2llcykgewogICAgICBVcmkgdXJpMSA9IGRlcGVuZGVuY3kudGFyZ2V0TGlicmFyeS5pbXBvcnRVcmk7CiAgICAgIFVyaSB1cmkyID0gZGVwZW5kZW5jeS50YXJnZXRMaWJyYXJ5LmZpbGVVcmk7CiAgICAgIGlmIChsaWJyYXJpZXMuY29udGFpbnNLZXkodXJpMSkpIHsKICAgICAgICB5aWVsZCB1cmkxOwogICAgICB9IGVsc2UgaWYgKHVyaTIgIT0gbnVsbCkgewogICAgICAgIGlmIChsaWJyYXJpZXMuY29udGFpbnNLZXkodXJpMikpIHsKICAgICAgICAgIHlpZWxkIHVyaTI7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gUGFydHMuCiAgICAvLyBOb3JtYWxseSB0aGVyZSB3b24ndCBiZSBsaWJyYXJpZXMgZm9yIHRoZXNlLCBidXQgaWYsIGZvciBpbnN0YW5jZSwKICAgIC8vIHRoZSBwYXJ0IGRpZG4ndCBleGlzdCB0aGVyZSB3aWxsIGJlIGEgc3ludGhldGljIGxpYnJhcnkuCiAgICBmb3IgKExpYnJhcnlQYXJ0IHBhcnQgaW4gbGlicmFyeS5wYXJ0cykgewogICAgICBVcmkgcGFydFVyaSA9IGxpYnJhcnkuaW1wb3J0VXJpLnJlc29sdmUocGFydC5wYXJ0VXJpKTsKICAgICAgVXJpIGZpbGVVcmkgPSBsaWJyYXJ5LmZpbGVVcmkucmVzb2x2ZShwYXJ0LnBhcnRVcmkpOwogICAgICBpZiAobGlicmFyaWVzLmNvbnRhaW5zS2V5KHBhcnRVcmkpKSB7CiAgICAgICAgeWllbGQgcGFydFVyaTsKICAgICAgfSBlbHNlIGlmIChmaWxlVXJpICE9IHBhcnRVcmkgJiYgbGlicmFyaWVzLmNvbnRhaW5zS2V5KGZpbGVVcmkpKSB7CiAgICAgICAgeWllbGQgZmlsZVVyaTsKICAgICAgfQogICAgfQogIH0KfQo1AE5OPAEdASQyATQBKyUBIAEwATApGyoGARxBNTMpFCErFgoIBgEOSkAuPTssF0kXCAYEAgEucGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2xpYnJhcnlfZ3JhcGguZGFydEdzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvc291cmNlL3NvdXJjZV9saWJyYXJ5X2J1aWxkZXIuZGFydMAAhb4vLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5zb3VyY2VfbGlicmFyeV9idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBQcm9jZWR1cmVLaW5kOwoKaW1wb3J0ICcuLi8uLi9iYXNlL3Jlc29sdmVfcmVsYXRpdmVfdXJpLmRhcnQnIHNob3cgcmVzb2x2ZVJlbGF0aXZlVXJpOwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJy4uL2J1aWxkZXIvYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIENsYXNzQnVpbGRlciwKICAgICAgICBDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXIsCiAgICAgICAgRGVjbGFyYXRpb24sCiAgICAgICAgRW51bUNvbnN0YW50SW5mbywKICAgICAgICBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyLAogICAgICAgIEZ1bmN0aW9uVHlwZUJ1aWxkZXIsCiAgICAgICAgTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgTWVtYmVyQnVpbGRlciwKICAgICAgICBNZXRhZGF0YUJ1aWxkZXIsCiAgICAgICAgTmFtZUl0ZXJhdG9yLAogICAgICAgIFByZWZpeEJ1aWxkZXIsCiAgICAgICAgUHJvY2VkdXJlQnVpbGRlciwKICAgICAgICBRdWFsaWZpZWROYW1lLAogICAgICAgIFNjb3BlLAogICAgICAgIFR5cGVCdWlsZGVyLAogICAgICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIsCiAgICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlciwKICAgICAgICBVbnJlc29sdmVkVHlwZSwKICAgICAgICBmbGF0dGVuTmFtZTsKCmltcG9ydCAnLi4vY29tYmluYXRvci5kYXJ0JyBzaG93IENvbWJpbmF0b3I7CgppbXBvcnQgJy4uL2V4cG9ydC5kYXJ0JyBzaG93IEV4cG9ydDsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cKICAgICAgICBMb2NhdGVkTWVzc2FnZSwKICAgICAgICBNZXNzYWdlLAogICAgICAgIG1lc3NhZ2VDb25zdHJ1Y3RvcldpdGhXcm9uZ05hbWUsCiAgICAgICAgbWVzc2FnZUV4cGVjdGVkVXJpLAogICAgICAgIG1lc3NhZ2VNZW1iZXJXaXRoU2FtZU5hbWVBc0NsYXNzLAogICAgICAgIG1lc3NhZ2VQYXJ0RXhwb3J0LAogICAgICAgIG1lc3NhZ2VQYXJ0RXhwb3J0Q29udGV4dCwKICAgICAgICBtZXNzYWdlUGFydEluUGFydCwKICAgICAgICBtZXNzYWdlUGFydEluUGFydExpYnJhcnlDb250ZXh0LAogICAgICAgIG1lc3NhZ2VQYXJ0T2ZTZWxmLAogICAgICAgIG1lc3NhZ2VQYXJ0T2ZUd29MaWJyYXJpZXMsCiAgICAgICAgbWVzc2FnZVBhcnRPZlR3b0xpYnJhcmllc0NvbnRleHQsCiAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgdGVtcGxhdGVDb25mbGljdHNXaXRoTWVtYmVyLAogICAgICAgIHRlbXBsYXRlQ29uZmxpY3RzV2l0aFNldHRlciwKICAgICAgICB0ZW1wbGF0ZUNvbnN0cnVjdG9yV2l0aFdyb25nTmFtZUNvbnRleHQsCiAgICAgICAgdGVtcGxhdGVDb3VsZE5vdFBhcnNlVXJpLAogICAgICAgIHRlbXBsYXRlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkLAogICAgICAgIHRlbXBsYXRlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkQ2F1c2UsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb24sCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25DYXVzZSwKICAgICAgICB0ZW1wbGF0ZU1pc3NpbmdQYXJ0T2YsCiAgICAgICAgdGVtcGxhdGVOb3RBUHJlZml4SW5UeXBlQW5ub3RhdGlvbiwKICAgICAgICB0ZW1wbGF0ZVBhcnRPZkluTGlicmFyeSwKICAgICAgICB0ZW1wbGF0ZVBhcnRPZkxpYnJhcnlOYW1lTWlzbWF0Y2gsCiAgICAgICAgdGVtcGxhdGVQYXJ0T2ZVcmlNaXNtYXRjaCwKICAgICAgICB0ZW1wbGF0ZVBhcnRPZlVzZVVyaSwKICAgICAgICB0ZW1wbGF0ZVBhcnRUd2ljZTsKCmltcG9ydCAnLi4vaW1wb3J0LmRhcnQnIHNob3cgSW1wb3J0OwoKaW1wb3J0ICcuLi9jb25maWd1cmF0aW9uLmRhcnQnIHNob3cgQ29uZmlndXJhdGlvbjsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyB1bmV4cGVjdGVkLCB1bmhhbmRsZWQ7CgppbXBvcnQgJ3NvdXJjZV9sb2FkZXIuZGFydCcgc2hvdyBTb3VyY2VMb2FkZXI7CgphYnN0cmFjdCBjbGFzcyBTb3VyY2VMaWJyYXJ5QnVpbGRlcjxUIGV4dGVuZHMgVHlwZUJ1aWxkZXIsIFI+CiAgICBleHRlbmRzIExpYnJhcnlCdWlsZGVyPFQsIFI+IHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIE1BTEZPUk1FRF9VUklfU0NIRU1FID0gIm9yZy1kYXJ0bGFuZy1tYWxmb3JtZWQtdXJpIjsKCiAgZmluYWwgU291cmNlTG9hZGVyIGxvYWRlcjsKCiAgZmluYWwgRGVjbGFyYXRpb25CdWlsZGVyPFQ+IGxpYnJhcnlEZWNsYXJhdGlvbjsKCiAgZmluYWwgTGlzdDxDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXI+IGNvbnN0cnVjdG9yUmVmZXJlbmNlcyA9CiAgICAgIDxDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXI+W107CgogIGZpbmFsIExpc3Q8U291cmNlTGlicmFyeUJ1aWxkZXI8VCwgUj4+IHBhcnRzID0gPFNvdXJjZUxpYnJhcnlCdWlsZGVyPFQsIFI+PltdOwoKICAvLyBDYW4gSSB1c2UgbGlicmFyeS5wYXJ0cyBpbnN0ZWFkPyBTZWUgS2VybmVsTGlicmFyeUJ1aWxkZXIuYWRkUGFydC4KICBmaW5hbCBMaXN0PGludD4gcGFydE9mZnNldHMgPSA8aW50PltdOwoKICBmaW5hbCBMaXN0PEltcG9ydD4gaW1wb3J0cyA9IDxJbXBvcnQ+W107CgogIGZpbmFsIExpc3Q8RXhwb3J0PiBleHBvcnRzID0gPEV4cG9ydD5bXTsKCiAgZmluYWwgU2NvcGUgaW1wb3J0U2NvcGU7CgogIGZpbmFsIFVyaSBmaWxlVXJpOwoKICBmaW5hbCBMaXN0PExpc3Q+IGltcGxlbWVudGF0aW9uQnVpbGRlcnMgPSA8TGlzdDxMaXN0Pj5bXTsKCiAgZmluYWwgTGlzdDxPYmplY3Q+IGFjY2Vzc29ycyA9IDxPYmplY3Q+W107CgogIGZpbmFsIGJvb2wgbGVnYWN5TW9kZTsKCiAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50OwoKICBTdHJpbmcgbmFtZTsKCiAgU3RyaW5nIHBhcnRPZk5hbWU7CgogIFVyaSBwYXJ0T2ZVcmk7CgogIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YTsKCiAgLy8vIFRoZSBjdXJyZW50IGRlY2xhcmF0aW9uIHRoYXQgaXMgYmVpbmcgYnVpbHQuIFdoZW4gd2Ugc3RhcnQgcGFyc2luZyBhCiAgLy8vIGRlY2xhcmF0aW9uIChjbGFzcywgbWV0aG9kLCBhbmQgc28gb24pLCB3ZSBkb24ndCBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbgogIC8vLyB0byBjcmVhdGUgYSBidWlsZGVyIGFuZCB0aGlzIG9iamVjdCByZWNvcmRzIGl0cyBtZW1iZXJzIGFuZCB0eXBlcyB1bnRpbCwKICAvLy8gZm9yIGV4YW1wbGUsIFthZGRDbGFzc10gaXMgY2FsbGVkLgogIERlY2xhcmF0aW9uQnVpbGRlcjxUPiBjdXJyZW50RGVjbGFyYXRpb247CgogIGJvb2wgY2FuQWRkSW1wbGVtZW50YXRpb25CdWlsZGVycyA9IGZhbHNlOwoKICAvLy8gTm9uLW51bGwgaWYgdGhpcyBsaWJyYXJ5IGNhdXNlcyBhbiBlcnJvciB1cG9uIGFjY2VzcywgdGhhdCBpcywgdGhlcmUgd2FzCiAgLy8vIGFuIGVycm9yIHJlYWRpbmcgaXRzIHNvdXJjZS4KICBNZXNzYWdlIGFjY2Vzc1Byb2JsZW07CgogIFNvdXJjZUxpYnJhcnlCdWlsZGVyKFNvdXJjZUxvYWRlciBsb2FkZXIsIFVyaSBmaWxlVXJpLCBTY29wZSBzY29wZSkKICAgICAgOiB0aGlzLmZyb21TY29wZXMobG9hZGVyLCBmaWxlVXJpLCBuZXcgRGVjbGFyYXRpb25CdWlsZGVyPFQ+LmxpYnJhcnkoKSwKICAgICAgICAgICAgc2NvcGUgPz8gbmV3IFNjb3BlLnRvcCgpKTsKCiAgU291cmNlTGlicmFyeUJ1aWxkZXIuZnJvbVNjb3BlcygKICAgICAgdGhpcy5sb2FkZXIsIHRoaXMuZmlsZVVyaSwgdGhpcy5saWJyYXJ5RGVjbGFyYXRpb24sIHRoaXMuaW1wb3J0U2NvcGUpCiAgICAgIDogY3VycmVudERlY2xhcmF0aW9uID0gbGlicmFyeURlY2xhcmF0aW9uLAogICAgICAgIGxlZ2FjeU1vZGUgPSBsb2FkZXIudGFyZ2V0LmxlZ2FjeU1vZGUsCiAgICAgICAgc3VwZXIoCiAgICAgICAgICAgIGZpbGVVcmksIGxpYnJhcnlEZWNsYXJhdGlvbi50b1Njb3BlKGltcG9ydFNjb3BlKSwgbmV3IFNjb3BlLnRvcCgpKTsKCiAgVXJpIGdldCB1cmk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUGFydCA9PiBwYXJ0T2ZOYW1lICE9IG51bGwgfHwgcGFydE9mVXJpICE9IG51bGw7CgogIExpc3Q8VW5yZXNvbHZlZFR5cGU8VD4+IGdldCB0eXBlcyA9PiBsaWJyYXJ5RGVjbGFyYXRpb24udHlwZXM7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU3ludGhldGljID0+IGFjY2Vzc1Byb2JsZW0gIT0gbnVsbDsKCiAgVCBhZGROYW1lZFR5cGUoT2JqZWN0IG5hbWUsIExpc3Q8VD4gYXJndW1lbnRzLCBpbnQgY2hhck9mZnNldCk7CgogIFQgYWRkTWl4aW5BcHBsaWNhdGlvbihUIHN1cGVydHlwZSwgTGlzdDxUPiBtaXhpbnMsIGludCBjaGFyT2Zmc2V0KTsKCiAgVCBhZGRUeXBlKFQgdHlwZSwgaW50IGNoYXJPZmZzZXQpIHsKICAgIGN1cnJlbnREZWNsYXJhdGlvbgogICAgICAgIC5hZGRUeXBlKG5ldyBVbnJlc29sdmVkVHlwZTxUPih0eXBlLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKSk7CiAgICByZXR1cm4gdHlwZTsKICB9CgogIFQgYWRkVm9pZFR5cGUoaW50IGNoYXJPZmZzZXQpOwoKICBDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXIgYWRkQ29uc3RydWN0b3JSZWZlcmVuY2UoCiAgICAgIE9iamVjdCBuYW1lLCBMaXN0PFQ+IHR5cGVBcmd1bWVudHMsIFN0cmluZyBzdWZmaXgsIGludCBjaGFyT2Zmc2V0KSB7CiAgICBDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXIgcmVmID0gbmV3IENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlcigKICAgICAgICBuYW1lLCB0eXBlQXJndW1lbnRzLCBzdWZmaXgsIHRoaXMsIGNoYXJPZmZzZXQpOwogICAgY29uc3RydWN0b3JSZWZlcmVuY2VzLmFkZChyZWYpOwogICAgcmV0dXJuIHJlZjsKICB9CgogIHZvaWQgYmVnaW5OZXN0ZWREZWNsYXJhdGlvbihTdHJpbmcgbmFtZSwge2Jvb2wgaGFzTWVtYmVyczogdHJ1ZX0pIHsKICAgIGN1cnJlbnREZWNsYXJhdGlvbiA9IGN1cnJlbnREZWNsYXJhdGlvbi5jcmVhdGVOZXN0ZWQobmFtZSwgaGFzTWVtYmVycyk7CiAgfQoKICBEZWNsYXJhdGlvbkJ1aWxkZXI8VD4gZW5kTmVzdGVkRGVjbGFyYXRpb24oU3RyaW5nIG5hbWUpIHsKICAgIGFzc2VydCgKICAgICAgICAobmFtZT8uc3RhcnRzV2l0aChjdXJyZW50RGVjbGFyYXRpb24ubmFtZSkgPz8KICAgICAgICAgICAgICAgIChuYW1lID09IGN1cnJlbnREZWNsYXJhdGlvbi5uYW1lKSkgfHwKICAgICAgICAgICAgY3VycmVudERlY2xhcmF0aW9uLm5hbWUgPT0gIm9wZXJhdG9yIiB8fAogICAgICAgICAgICBpZGVudGljYWwobmFtZSwgIjxzeW50YXgtZXJyb3I+IiksCiAgICAgICAgIiR7bmFtZX0gIT0gJHtjdXJyZW50RGVjbGFyYXRpb24ubmFtZX0iKTsKICAgIERlY2xhcmF0aW9uQnVpbGRlcjxUPiBwcmV2aW91cyA9IGN1cnJlbnREZWNsYXJhdGlvbjsKICAgIGN1cnJlbnREZWNsYXJhdGlvbiA9IGN1cnJlbnREZWNsYXJhdGlvbi5wYXJlbnQ7CiAgICByZXR1cm4gcHJldmlvdXM7CiAgfQoKICBib29sIHVyaUlzVmFsaWQoVXJpIHVyaSkgPT4gdXJpLnNjaGVtZSAhPSBNQUxGT1JNRURfVVJJX1NDSEVNRTsKCiAgVXJpIHJlc29sdmUoVXJpIGJhc2VVcmksIFN0cmluZyB1cmksIGludCB1cmlPZmZzZXQsIHtpc1BhcnQ6IGZhbHNlfSkgewogICAgaWYgKHVyaSA9PSBudWxsKSB7CiAgICAgIGFkZFByb2JsZW0obWVzc2FnZUV4cGVjdGVkVXJpLCB1cmlPZmZzZXQsIG5vTGVuZ3RoLCB0aGlzLnVyaSk7CiAgICAgIHJldHVybiBuZXcgVXJpKHNjaGVtZTogTUFMRk9STUVEX1VSSV9TQ0hFTUUpOwogICAgfQogICAgVXJpIHBhcnNlZFVyaTsKICAgIHRyeSB7CiAgICAgIHBhcnNlZFVyaSA9IFVyaS5wYXJzZSh1cmkpOwogICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gY2F0Y2ggKGUpIHsKICAgICAgLy8gUG9pbnQgdG8gcG9zaXRpb24gaW4gc3RyaW5nIGluZGljYXRlZCBieSB0aGUgZXhjZXB0aW9uLAogICAgICAvLyBvciB0byB0aGUgaW5pdGlhbCBxdW90ZSBpZiBubyBwb3NpdGlvbiBpcyBnaXZlbi4KICAgICAgLy8gKEFzc3VtZXMgdGhlIGRpcmVjdGl2ZSBpcyB1c2luZyBhIHNpbmdsZS1saW5lIHN0cmluZy4pCiAgICAgIGFkZFByb2JsZW0odGVtcGxhdGVDb3VsZE5vdFBhcnNlVXJpLndpdGhBcmd1bWVudHModXJpLCBlLm1lc3NhZ2UpLAogICAgICAgICAgdXJpT2Zmc2V0ICsgMSArIChlLm9mZnNldCA/PyAtMSksIDEsIHRoaXMudXJpKTsKICAgICAgcmV0dXJuIG5ldyBVcmkoCiAgICAgICAgICBzY2hlbWU6IE1BTEZPUk1FRF9VUklfU0NIRU1FLCBxdWVyeTogVXJpLmVuY29kZVF1ZXJ5Q29tcG9uZW50KHVyaSkpOwogICAgfQogICAgaWYgKGlzUGFydCAmJiBiYXNlVXJpLnNjaGVtZSA9PSAiZGFydCIpIHsKICAgICAgLy8gUmVzb2x2ZSB1c2luZyBzcGVjaWFsIHJ1bGVzIGZvciBkYXJ0OiBVUklzCiAgICAgIHJldHVybiByZXNvbHZlUmVsYXRpdmVVcmkoYmFzZVVyaSwgcGFyc2VkVXJpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBiYXNlVXJpLnJlc29sdmVVcmkocGFyc2VkVXJpKTsKICAgIH0KICB9CgogIFN0cmluZyBjb21wdXRlQW5kVmFsaWRhdGVDb25zdHJ1Y3Rvck5hbWUoT2JqZWN0IG5hbWUsIGludCBjaGFyT2Zmc2V0LAogICAgICB7aXNGYWN0b3J5OiBmYWxzZX0pIHsKICAgIFN0cmluZyBjbGFzc05hbWUgPSBjdXJyZW50RGVjbGFyYXRpb24ubmFtZTsKICAgIFN0cmluZyBwcmVmaXg7CiAgICBTdHJpbmcgc3VmZml4OwogICAgaWYgKG5hbWUgaXMgUXVhbGlmaWVkTmFtZSkgewogICAgICBwcmVmaXggPSBuYW1lLnF1YWxpZmllcjsKICAgICAgc3VmZml4ID0gbmFtZS5uYW1lOwogICAgfSBlbHNlIHsKICAgICAgcHJlZml4ID0gbmFtZTsKICAgICAgc3VmZml4ID0gbnVsbDsKICAgIH0KICAgIGlmIChwcmVmaXggPT0gY2xhc3NOYW1lKSB7CiAgICAgIHJldHVybiBzdWZmaXggPz8gIiI7CiAgICB9CiAgICBpZiAoc3VmZml4ID09IG51bGwgJiYgIWlzRmFjdG9yeSkgewogICAgICAvLyBBIGxlZ2FsIG5hbWUgZm9yIGEgcmVndWxhciBtZXRob2QsIGJ1dCBub3QgZm9yIGEgY29uc3RydWN0b3IuCiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGFkZFByb2JsZW0oCiAgICAgICAgbWVzc2FnZUNvbnN0cnVjdG9yV2l0aFdyb25nTmFtZSwgY2hhck9mZnNldCwgcHJlZml4Lmxlbmd0aCwgZmlsZVVyaSwKICAgICAgICBjb250ZXh0OiBbCiAgICAgICAgICB0ZW1wbGF0ZUNvbnN0cnVjdG9yV2l0aFdyb25nTmFtZUNvbnRleHQKICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhjdXJyZW50RGVjbGFyYXRpb24ubmFtZSkKICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKHVyaSwgY3VycmVudERlY2xhcmF0aW9uLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgIGN1cnJlbnREZWNsYXJhdGlvbi5uYW1lLmxlbmd0aCkKICAgICAgICBdKTsKCiAgICByZXR1cm4gc3VmZml4OwogIH0KCiAgdm9pZCBhZGRFeHBvcnQoCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgU3RyaW5nIHVyaSwKICAgICAgTGlzdDxDb25maWd1cmF0aW9uPiBjb25maWd1cmF0aW9ucywKICAgICAgTGlzdDxDb21iaW5hdG9yPiBjb21iaW5hdG9ycywKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIGludCB1cmlPZmZzZXQpIHsKICAgIGlmIChjb25maWd1cmF0aW9ucyAhPSBudWxsKSB7CiAgICAgIGZvciAoQ29uZmlndXJhdGlvbiBjb25maWcgaW4gY29uZmlndXJhdGlvbnMpIHsKICAgICAgICBpZiAobG9va3VwSW1wb3J0Q29uZGl0aW9uKGNvbmZpZy5kb3R0ZWROYW1lKSA9PSBjb25maWcuY29uZGl0aW9uKSB7CiAgICAgICAgICB1cmkgPSBjb25maWcuaW1wb3J0VXJpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgdmFyIGV4cG9ydGVkTGlicmFyeSA9IGxvYWRlcgogICAgICAgIC5yZWFkKHJlc29sdmUodGhpcy51cmksIHVyaSwgdXJpT2Zmc2V0KSwgY2hhck9mZnNldCwgYWNjZXNzb3I6IHRoaXMpOwogICAgZXhwb3J0ZWRMaWJyYXJ5LmFkZEV4cG9ydGVyKHRoaXMsIGNvbWJpbmF0b3JzLCBjaGFyT2Zmc2V0KTsKICAgIGV4cG9ydHMuYWRkKG5ldyBFeHBvcnQodGhpcywgZXhwb3J0ZWRMaWJyYXJ5LCBjb21iaW5hdG9ycywgY2hhck9mZnNldCkpOwogIH0KCiAgU3RyaW5nIGxvb2t1cEltcG9ydENvbmRpdGlvbihTdHJpbmcgZG90dGVkTmFtZSkgewogICAgY29uc3QgU3RyaW5nIHByZWZpeCA9ICJkYXJ0LmxpYnJhcnkuIjsKICAgIGlmICghZG90dGVkTmFtZS5zdGFydHNXaXRoKHByZWZpeCkpIHJldHVybiAiIjsKICAgIGRvdHRlZE5hbWUgPSBkb3R0ZWROYW1lLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKTsKICAgIGlmICghbG9hZGVyLnRhcmdldC51cmlUcmFuc2xhdG9yLmlzTGlicmFyeVN1cHBvcnRlZChkb3R0ZWROYW1lKSkgcmV0dXJuICIiOwoKICAgIExpYnJhcnlCdWlsZGVyIGltcG9ydGVkID0KICAgICAgICBsb2FkZXIuYnVpbGRlcnNbbmV3IFVyaShzY2hlbWU6ICJkYXJ0IiwgcGF0aDogZG90dGVkTmFtZSldOwoKICAgIGlmIChpbXBvcnRlZCA9PSBudWxsKSB7CiAgICAgIExpYnJhcnlCdWlsZGVyIGNvcmVMaWJyYXJ5ID0gbG9hZGVyLnJlYWQoCiAgICAgICAgICByZXNvbHZlKAogICAgICAgICAgICAgIHRoaXMudXJpLCBuZXcgVXJpKHNjaGVtZTogImRhcnQiLCBwYXRoOiAiY29yZSIpLnRvU3RyaW5nKCksIC0xKSwKICAgICAgICAgIC0xKTsKICAgICAgaW1wb3J0ZWQgPSBjb3JlTGlicmFyeQogICAgICAgICAgLmxvYWRlci5idWlsZGVyc1tuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiBkb3R0ZWROYW1lKV07CiAgICB9CiAgICByZXR1cm4gaW1wb3J0ZWQgIT0gbnVsbCA/ICJ0cnVlIiA6ICIiOwogIH0KCiAgdm9pZCBhZGRJbXBvcnQoCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgU3RyaW5nIHVyaSwKICAgICAgTGlzdDxDb25maWd1cmF0aW9uPiBjb25maWd1cmF0aW9ucywKICAgICAgU3RyaW5nIHByZWZpeCwKICAgICAgTGlzdDxDb21iaW5hdG9yPiBjb21iaW5hdG9ycywKICAgICAgYm9vbCBkZWZlcnJlZCwKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIGludCBwcmVmaXhDaGFyT2Zmc2V0LAogICAgICBpbnQgdXJpT2Zmc2V0LAogICAgICBpbnQgaW1wb3J0SW5kZXgpIHsKICAgIGlmIChjb25maWd1cmF0aW9ucyAhPSBudWxsKSB7CiAgICAgIGZvciAoQ29uZmlndXJhdGlvbiBjb25maWcgaW4gY29uZmlndXJhdGlvbnMpIHsKICAgICAgICBpZiAobG9va3VwSW1wb3J0Q29uZGl0aW9uKGNvbmZpZy5kb3R0ZWROYW1lKSA9PSBjb25maWcuY29uZGl0aW9uKSB7CiAgICAgICAgICB1cmkgPSBjb25maWcuaW1wb3J0VXJpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgTGlicmFyeUJ1aWxkZXIgYnVpbGRlciA9IG51bGw7CgogICAgVXJpIHJlc29sdmVkVXJpOwogICAgU3RyaW5nIG5hdGl2ZVBhdGg7CiAgICBjb25zdCBTdHJpbmcgbmF0aXZlRXh0ZW5zaW9uU2NoZW1lID0gImRhcnQtZXh0OiI7CiAgICBpZiAodXJpLnN0YXJ0c1dpdGgobmF0aXZlRXh0ZW5zaW9uU2NoZW1lKSkgewogICAgICBTdHJpbmcgc3RyaXBwZWRVcmkgPSB1cmkuc3Vic3RyaW5nKG5hdGl2ZUV4dGVuc2lvblNjaGVtZS5sZW5ndGgpOwogICAgICBpZiAoc3RyaXBwZWRVcmkuc3RhcnRzV2l0aCgicGFja2FnZSIpKSB7CiAgICAgICAgcmVzb2x2ZWRVcmkgPSByZXNvbHZlKAogICAgICAgICAgICB0aGlzLnVyaSwgc3RyaXBwZWRVcmksIHVyaU9mZnNldCArIG5hdGl2ZUV4dGVuc2lvblNjaGVtZS5sZW5ndGgpOwogICAgICAgIHJlc29sdmVkVXJpID0gbG9hZGVyLnRhcmdldC50cmFuc2xhdGVVcmkocmVzb2x2ZWRVcmkpOwogICAgICAgIG5hdGl2ZVBhdGggPSByZXNvbHZlZFVyaS50b1N0cmluZygpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc29sdmVkVXJpID0gbmV3IFVyaShzY2hlbWU6ICJkYXJ0LWV4dCIsIHBhdGhTZWdtZW50czogW3VyaV0pOwogICAgICAgIG5hdGl2ZVBhdGggPSB1cmk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlc29sdmVkVXJpID0gcmVzb2x2ZSh0aGlzLnVyaSwgdXJpLCB1cmlPZmZzZXQpOwogICAgICBidWlsZGVyID0gbG9hZGVyLnJlYWQocmVzb2x2ZWRVcmksIHVyaU9mZnNldCwgYWNjZXNzb3I6IHRoaXMpOwogICAgfQoKICAgIGltcG9ydHMuYWRkKG5ldyBJbXBvcnQodGhpcywgYnVpbGRlciwgZGVmZXJyZWQsIHByZWZpeCwgY29tYmluYXRvcnMsCiAgICAgICAgY29uZmlndXJhdGlvbnMsIGNoYXJPZmZzZXQsIHByZWZpeENoYXJPZmZzZXQsIGltcG9ydEluZGV4LAogICAgICAgIG5hdGl2ZUltcG9ydFBhdGg6IG5hdGl2ZVBhdGgpKTsKICB9CgogIHZvaWQgYWRkUGFydChMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsIFN0cmluZyB1cmksIGludCBjaGFyT2Zmc2V0KSB7CiAgICBVcmkgcmVzb2x2ZWRVcmk7CiAgICBVcmkgbmV3RmlsZVVyaTsKICAgIHJlc29sdmVkVXJpID0gcmVzb2x2ZSh0aGlzLnVyaSwgdXJpLCBjaGFyT2Zmc2V0LCBpc1BhcnQ6IHRydWUpOwogICAgbmV3RmlsZVVyaSA9IHJlc29sdmUoZmlsZVVyaSwgdXJpLCBjaGFyT2Zmc2V0KTsKICAgIHBhcnRzLmFkZChsb2FkZXIucmVhZChyZXNvbHZlZFVyaSwgY2hhck9mZnNldCwKICAgICAgICBmaWxlVXJpOiBuZXdGaWxlVXJpLCBhY2Nlc3NvcjogdGhpcykpOwogICAgcGFydE9mZnNldHMuYWRkKGNoYXJPZmZzZXQpOwogIH0KCiAgdm9pZCBhZGRQYXJ0T2YoCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwgU3RyaW5nIG5hbWUsIFN0cmluZyB1cmksIGludCB1cmlPZmZzZXQpIHsKICAgIHBhcnRPZk5hbWUgPSBuYW1lOwogICAgaWYgKHVyaSAhPSBudWxsKSB7CiAgICAgIHBhcnRPZlVyaSA9IHJlc29sdmUodGhpcy51cmksIHVyaSwgdXJpT2Zmc2V0KTsKICAgICAgVXJpIG5ld0ZpbGVVcmkgPSByZXNvbHZlKGZpbGVVcmksIHVyaSwgdXJpT2Zmc2V0KTsKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGxvYWRlci5yZWFkKHBhcnRPZlVyaSwgdXJpT2Zmc2V0LAogICAgICAgICAgZmlsZVVyaTogbmV3RmlsZVVyaSwgYWNjZXNzb3I6IHRoaXMpOwogICAgICBpZiAobG9hZGVyLmZpcnN0ID09IHRoaXMpIHsKICAgICAgICAvLyBUaGlzIGlzIGEgcGFydCwgYW5kIGl0IHdhcyB0aGUgZmlyc3QgaW5wdXQuIExldCB0aGUgbG9hZGVyIGtub3cKICAgICAgICAvLyBhYm91dCB0aGF0LgogICAgICAgIGxvYWRlci5maXJzdCA9IGxpYnJhcnk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgYWRkQ2xhc3MoCiAgICAgIFN0cmluZyBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhLAogICAgICBpbnQgbW9kaWZpZXJzLAogICAgICBTdHJpbmcgbmFtZSwKICAgICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzLAogICAgICBUIHN1cGVydHlwZSwKICAgICAgTGlzdDxUPiBpbnRlcmZhY2VzLAogICAgICBpbnQgc3RhcnRDaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhck9mZnNldCwKICAgICAgaW50IGNoYXJFbmRPZmZzZXQsCiAgICAgIGludCBzdXBlcnR5cGVPZmZzZXQpOwoKICB2b2lkIGFkZE5hbWVkTWl4aW5BcHBsaWNhdGlvbigKICAgICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50LAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMsCiAgICAgIGludCBtb2RpZmllcnMsCiAgICAgIFQgbWl4aW5BcHBsaWNhdGlvbiwKICAgICAgTGlzdDxUPiBpbnRlcmZhY2VzLAogICAgICBpbnQgc3RhcnRDaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhck9mZnNldCwKICAgICAgaW50IGNoYXJFbmRPZmZzZXQpOwoKICB2b2lkIGFkZEZpZWxkKAogICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgVCB0eXBlLAogICAgICBTdHJpbmcgbmFtZSwKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyRW5kT2Zmc2V0LAogICAgICBUb2tlbiBpbml0aWFsaXplclRva2VuRm9ySW5mZXJlbmNlLAogICAgICBib29sIGhhc0luaXRpYWxpemVyKTsKCiAgdm9pZCBhZGRGaWVsZHMoU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50LCBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIGludCBtb2RpZmllcnMsIFQgdHlwZSwgTGlzdDxGaWVsZEluZm8+IGZpZWxkSW5mb3MpIHsKICAgIGZvciAoRmllbGRJbmZvIGluZm8gaW4gZmllbGRJbmZvcykgewogICAgICBTdHJpbmcgbmFtZSA9IGluZm8ubmFtZTsKICAgICAgaW50IGNoYXJPZmZzZXQgPSBpbmZvLmNoYXJPZmZzZXQ7CiAgICAgIGludCBjaGFyRW5kT2Zmc2V0ID0gaW5mby5jaGFyRW5kT2Zmc2V0OwogICAgICBib29sIGhhc0luaXRpYWxpemVyID0gaW5mby5pbml0aWFsaXplclRva2VuRm9ySW5mZXJlbmNlICE9IG51bGw7CiAgICAgIFRva2VuIGluaXRpYWxpemVyVG9rZW5Gb3JJbmZlcmVuY2UgPQogICAgICAgICAgdHlwZSAhPSBudWxsIHx8IGxlZ2FjeU1vZGUgPyBudWxsIDogaW5mby5pbml0aWFsaXplclRva2VuRm9ySW5mZXJlbmNlOwogICAgICBpZiAoaW5pdGlhbGl6ZXJUb2tlbkZvckluZmVyZW5jZSAhPSBudWxsKSB7CiAgICAgICAgVG9rZW4gYmVmb3JlTGFzdCA9IGluZm8uYmVmb3JlTGFzdDsKICAgICAgICBiZWZvcmVMYXN0LnNldE5leHQobmV3IFRva2VuLmVvZihiZWZvcmVMYXN0Lm5leHQub2Zmc2V0KSk7CiAgICAgIH0KICAgICAgYWRkRmllbGQoCiAgICAgICAgICBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgICAgIG1ldGFkYXRhLAogICAgICAgICAgbW9kaWZpZXJzLAogICAgICAgICAgdHlwZSwKICAgICAgICAgIG5hbWUsCiAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgY2hhckVuZE9mZnNldCwKICAgICAgICAgIGluaXRpYWxpemVyVG9rZW5Gb3JJbmZlcmVuY2UsCiAgICAgICAgICBoYXNJbml0aWFsaXplcik7CiAgICB9CiAgfQoKICB2b2lkIGFkZENvbnN0cnVjdG9yKAogICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgVCByZXR1cm5UeXBlLAogICAgICBmaW5hbCBPYmplY3QgbmFtZSwKICAgICAgU3RyaW5nIGNvbnN0cnVjdG9yTmFtZSwKICAgICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzLAogICAgICBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+IGZvcm1hbHMsCiAgICAgIGludCBzdGFydENoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhck9wZW5QYXJlbk9mZnNldCwKICAgICAgaW50IGNoYXJFbmRPZmZzZXQsCiAgICAgIFN0cmluZyBuYXRpdmVNZXRob2ROYW1lKTsKCiAgdm9pZCBhZGRQcm9jZWR1cmUoCiAgICAgIFN0cmluZyBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhLAogICAgICBpbnQgbW9kaWZpZXJzLAogICAgICBUIHJldHVyblR5cGUsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMsCiAgICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscywKICAgICAgUHJvY2VkdXJlS2luZCBraW5kLAogICAgICBpbnQgc3RhcnRDaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhck9mZnNldCwKICAgICAgaW50IGNoYXJPcGVuUGFyZW5PZmZzZXQsCiAgICAgIGludCBjaGFyRW5kT2Zmc2V0LAogICAgICBTdHJpbmcgbmF0aXZlTWV0aG9kTmFtZSwKICAgICAge2Jvb2wgaXNUb3BMZXZlbH0pOwoKICB2b2lkIGFkZEVudW0oCiAgICAgIFN0cmluZyBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhLAogICAgICBTdHJpbmcgbmFtZSwKICAgICAgTGlzdDxFbnVtQ29uc3RhbnRJbmZvPiBlbnVtQ29uc3RhbnRJbmZvcywKICAgICAgaW50IHN0YXJ0Q2hhck9mZnNldCwKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyRW5kT2Zmc2V0KTsKCiAgdm9pZCBhZGRGdW5jdGlvblR5cGVBbGlhcygKICAgICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50LAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMsCiAgICAgIEZ1bmN0aW9uVHlwZUJ1aWxkZXIgdHlwZSwKICAgICAgaW50IGNoYXJPZmZzZXQpOwoKICBGdW5jdGlvblR5cGVCdWlsZGVyIGFkZEZ1bmN0aW9uVHlwZSgKICAgICAgVCByZXR1cm5UeXBlLAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMsCiAgICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscywKICAgICAgaW50IGNoYXJPZmZzZXQpOwoKICB2b2lkIGFkZEZhY3RvcnlNZXRob2QoCiAgICAgIFN0cmluZyBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhLAogICAgICBpbnQgbW9kaWZpZXJzLAogICAgICBPYmplY3QgbmFtZSwKICAgICAgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBmb3JtYWxzLAogICAgICBDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXIgcmVkaXJlY3Rpb25UYXJnZXQsCiAgICAgIGludCBzdGFydENoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhck9wZW5QYXJlbk9mZnNldCwKICAgICAgaW50IGNoYXJFbmRPZmZzZXQsCiAgICAgIFN0cmluZyBuYXRpdmVNZXRob2ROYW1lKTsKCiAgRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBhZGRGb3JtYWxQYXJhbWV0ZXIoTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhLAogICAgICBpbnQgbW9kaWZpZXJzLCBUIHR5cGUsIFN0cmluZyBuYW1lLCBib29sIGhhc1RoaXMsIGludCBjaGFyT2Zmc2V0KTsKCiAgVHlwZVZhcmlhYmxlQnVpbGRlciBhZGRUeXBlVmFyaWFibGUoU3RyaW5nIG5hbWUsIFQgYm91bmQsIGludCBjaGFyT2Zmc2V0KTsKCiAgRGVjbGFyYXRpb24gYWRkQnVpbGRlcihTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIGludCBjaGFyT2Zmc2V0KSB7CiAgICAvLyBUT0RPKGFoZSk6IFNldCB0aGUgcGFyZW50IGNvcnJlY3RseSBoZXJlLiBDb3VsZCB0aGVuIGNoYW5nZSB0aGUKICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIE1lbWJlckJ1aWxkZXIuaXNUb3BMZXZlbCB0byB0ZXN0IGV4cGxpY2l0bHkgZm9yIGEKICAgIC8vIExpYnJhcnlCdWlsZGVyLgogICAgaWYgKG5hbWUgPT0gbnVsbCkgewogICAgICB1bmhhbmRsZWQoIm51bGwiLCAibmFtZSIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgfQogICAgaWYgKGN1cnJlbnREZWNsYXJhdGlvbiA9PSBsaWJyYXJ5RGVjbGFyYXRpb24pIHsKICAgICAgaWYgKGRlY2xhcmF0aW9uIGlzIE1lbWJlckJ1aWxkZXIpIHsKICAgICAgICBkZWNsYXJhdGlvbi5wYXJlbnQgPSB0aGlzOwogICAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIpIHsKICAgICAgICBkZWNsYXJhdGlvbi5wYXJlbnQgPSB0aGlzOwogICAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIFByZWZpeEJ1aWxkZXIpIHsKICAgICAgICBhc3NlcnQoZGVjbGFyYXRpb24ucGFyZW50ID09IHRoaXMpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB1bmhhbmRsZWQoCiAgICAgICAgICAgICIke2RlY2xhcmF0aW9uLnJ1bnRpbWVUeXBlfSIsICJhZGRCdWlsZGVyIiwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChjdXJyZW50RGVjbGFyYXRpb24ucGFyZW50ID09IGxpYnJhcnlEZWNsYXJhdGlvbik7CiAgICB9CiAgICBib29sIGlzQ29uc3RydWN0b3IgPSBkZWNsYXJhdGlvbiBpcyBQcm9jZWR1cmVCdWlsZGVyICYmCiAgICAgICAgKGRlY2xhcmF0aW9uLmlzQ29uc3RydWN0b3IgfHwgZGVjbGFyYXRpb24uaXNGYWN0b3J5KTsKICAgIGlmICghaXNDb25zdHJ1Y3RvciAmJiBuYW1lID09IGN1cnJlbnREZWNsYXJhdGlvbi5uYW1lKSB7CiAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICBtZXNzYWdlTWVtYmVyV2l0aFNhbWVOYW1lQXNDbGFzcywgY2hhck9mZnNldCwgbm9MZW5ndGgsIGZpbGVVcmkpOwogICAgfQogICAgTWFwPFN0cmluZywgRGVjbGFyYXRpb24+IG1lbWJlcnMgPSBpc0NvbnN0cnVjdG9yCiAgICAgICAgPyBjdXJyZW50RGVjbGFyYXRpb24uY29uc3RydWN0b3JzCiAgICAgICAgOiAoZGVjbGFyYXRpb24uaXNTZXR0ZXIKICAgICAgICAgICAgPyBjdXJyZW50RGVjbGFyYXRpb24uc2V0dGVycwogICAgICAgICAgICA6IGN1cnJlbnREZWNsYXJhdGlvbi5tZW1iZXJzKTsKICAgIERlY2xhcmF0aW9uIGV4aXN0aW5nID0gbWVtYmVyc1tuYW1lXTsKICAgIGlmIChkZWNsYXJhdGlvbi5uZXh0ICE9IG51bGwgJiYgZGVjbGFyYXRpb24ubmV4dCAhPSBleGlzdGluZykgewogICAgICB1bmV4cGVjdGVkKAogICAgICAgICAgIiR7ZGVjbGFyYXRpb24ubmV4dC5maWxlVXJpfUAke2RlY2xhcmF0aW9uLm5leHQuY2hhck9mZnNldH0iLAogICAgICAgICAgIiR7ZXhpc3Rpbmc/LmZpbGVVcml9QCR7ZXhpc3Rpbmc/LmNoYXJPZmZzZXR9IiwKICAgICAgICAgIGRlY2xhcmF0aW9uLmNoYXJPZmZzZXQsCiAgICAgICAgICBkZWNsYXJhdGlvbi5maWxlVXJpKTsKICAgIH0KICAgIGRlY2xhcmF0aW9uLm5leHQgPSBleGlzdGluZzsKICAgIGlmIChkZWNsYXJhdGlvbiBpcyBQcmVmaXhCdWlsZGVyICYmIGV4aXN0aW5nIGlzIFByZWZpeEJ1aWxkZXIpIHsKICAgICAgYXNzZXJ0KGV4aXN0aW5nLm5leHQgaXMhIFByZWZpeEJ1aWxkZXIpOwogICAgICBEZWNsYXJhdGlvbiBkZWZlcnJlZDsKICAgICAgRGVjbGFyYXRpb24gb3RoZXI7CiAgICAgIGlmIChkZWNsYXJhdGlvbi5kZWZlcnJlZCkgewogICAgICAgIGRlZmVycmVkID0gZGVjbGFyYXRpb247CiAgICAgICAgb3RoZXIgPSBleGlzdGluZzsKICAgICAgfSBlbHNlIGlmIChleGlzdGluZy5kZWZlcnJlZCkgewogICAgICAgIGRlZmVycmVkID0gZXhpc3Rpbmc7CiAgICAgICAgb3RoZXIgPSBkZWNsYXJhdGlvbjsKICAgICAgfQogICAgICBpZiAoZGVmZXJyZWQgIT0gbnVsbCkgewogICAgICAgIGFkZFByb2JsZW0odGVtcGxhdGVEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWQud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgICAgZGVmZXJyZWQuY2hhck9mZnNldCwgbm9MZW5ndGgsIGZpbGVVcmksCiAgICAgICAgICAgIGNvbnRleHQ6IFsKICAgICAgICAgICAgICB0ZW1wbGF0ZURlZmVycmVkUHJlZml4RHVwbGljYXRlZENhdXNlCiAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUpCiAgICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oZmlsZVVyaSwgb3RoZXIuY2hhck9mZnNldCwgbm9MZW5ndGgpCiAgICAgICAgICAgIF0pOwogICAgICB9CiAgICAgIHJldHVybiBleGlzdGluZwogICAgICAgIC4uZXhwb3J0U2NvcGUubWVyZ2UoZGVjbGFyYXRpb24uZXhwb3J0U2NvcGUsCiAgICAgICAgICAgIChTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gZXhpc3RpbmcsIERlY2xhcmF0aW9uIG1lbWJlcikgewogICAgICAgICAgcmV0dXJuIGNvbXB1dGVBbWJpZ3VvdXNEZWNsYXJhdGlvbigKICAgICAgICAgICAgICBuYW1lLCBleGlzdGluZywgbWVtYmVyLCBjaGFyT2Zmc2V0KTsKICAgICAgICB9KTsKICAgIH0gZWxzZSBpZiAoaXNEdXBsaWNhdGVkRGVjbGFyYXRpb24oZXhpc3RpbmcsIGRlY2xhcmF0aW9uKSkgewogICAgICBTdHJpbmcgZnVsbE5hbWUgPSBuYW1lOwogICAgICBpZiAoaXNDb25zdHJ1Y3RvcikgewogICAgICAgIGlmIChuYW1lLmlzRW1wdHkpIHsKICAgICAgICAgIGZ1bGxOYW1lID0gY3VycmVudERlY2xhcmF0aW9uLm5hbWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZ1bGxOYW1lID0gIiR7Y3VycmVudERlY2xhcmF0aW9uLm5hbWV9LiRuYW1lIjsKICAgICAgICB9CiAgICAgIH0KICAgICAgYWRkUHJvYmxlbSh0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbi53aXRoQXJndW1lbnRzKGZ1bGxOYW1lKSwKICAgICAgICAgIGNoYXJPZmZzZXQsIGZ1bGxOYW1lLmxlbmd0aCwgZGVjbGFyYXRpb24uZmlsZVVyaSwKICAgICAgICAgIGNvbnRleHQ6IDxMb2NhdGVkTWVzc2FnZT5bCiAgICAgICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uQ2F1c2UKICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGZ1bGxOYW1lKQogICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5maWxlVXJpLCBleGlzdGluZy5jaGFyT2Zmc2V0LCBmdWxsTmFtZS5sZW5ndGgpCiAgICAgICAgICBdKTsKICAgIH0KICAgIHJldHVybiBtZW1iZXJzW25hbWVdID0gZGVjbGFyYXRpb247CiAgfQoKICBib29sIGlzRHVwbGljYXRlZERlY2xhcmF0aW9uKERlY2xhcmF0aW9uIGV4aXN0aW5nLCBEZWNsYXJhdGlvbiBvdGhlcikgewogICAgaWYgKGV4aXN0aW5nID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIERlY2xhcmF0aW9uIG5leHQgPSBleGlzdGluZy5uZXh0OwogICAgaWYgKG5leHQgPT0gbnVsbCkgewogICAgICBpZiAoZXhpc3RpbmcuaXNHZXR0ZXIgJiYgb3RoZXIuaXNTZXR0ZXIpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKGV4aXN0aW5nLmlzU2V0dGVyICYmIG90aGVyLmlzR2V0dGVyKSByZXR1cm4gZmFsc2U7CiAgICB9IGVsc2UgewogICAgICBpZiAobmV4dCBpcyBDbGFzc0J1aWxkZXIgJiYgIW5leHQuaXNNaXhpbkFwcGxpY2F0aW9uKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChleGlzdGluZyBpcyBDbGFzc0J1aWxkZXIgJiYgb3RoZXIgaXMgQ2xhc3NCdWlsZGVyKSB7CiAgICAgIC8vIFdlIGFsbG93IG11bHRpcGxlIG1peGluIGFwcGxpY2F0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUuIEFuCiAgICAgIC8vIGFsdGVybmF0aXZlIGlzIHRvIHNoYXJlIHRoZXNlIG1peGluIGFwcGxpY2F0aW9ucy4gVGhpcyBzaXR1YXRpb24gY2FuCiAgICAgIC8vIGhhcHBlbiBpZiB5b3UgaGF2ZSBgY2xhc3MgQSBleHRlbmRzIE9iamVjdCB3aXRoIE1peGluIHt9YCBhbmQgYGNsYXNzIEIKICAgICAgLy8gZXh0ZW5kcyBPYmplY3Qgd2l0aCBNaXhpbiB7fWAgaW4gdGhlIHNhbWUgbGlicmFyeS4KICAgICAgcmV0dXJuICFleGlzdGluZy5pc01peGluQXBwbGljYXRpb24gfHwgIW90aGVyLmlzTWl4aW5BcHBsaWNhdGlvbjsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgdm9pZCBidWlsZEJ1aWxkZXIoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIExpYnJhcnlCdWlsZGVyIGNvcmVMaWJyYXJ5KTsKCiAgUiBidWlsZChMaWJyYXJ5QnVpbGRlciBjb3JlTGlicmFyeSkgewogICAgYXNzZXJ0KGltcGxlbWVudGF0aW9uQnVpbGRlcnMuaXNFbXB0eSk7CiAgICBjYW5BZGRJbXBsZW1lbnRhdGlvbkJ1aWxkZXJzID0gdHJ1ZTsKICAgIEl0ZXJhdG9yPERlY2xhcmF0aW9uPiBpdGVyYXRvciA9IHRoaXMuaXRlcmF0b3I7CiAgICB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICBidWlsZEJ1aWxkZXIoaXRlcmF0b3IuY3VycmVudCwgY29yZUxpYnJhcnkpOwogICAgfQogICAgZm9yIChMaXN0IGxpc3QgaW4gaW1wbGVtZW50YXRpb25CdWlsZGVycykgewogICAgICBTdHJpbmcgbmFtZSA9IGxpc3RbMF07CiAgICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gbGlzdFsxXTsKICAgICAgaW50IGNoYXJPZmZzZXQgPSBsaXN0WzJdOwogICAgICBhZGRCdWlsZGVyKG5hbWUsIGRlY2xhcmF0aW9uLCBjaGFyT2Zmc2V0KTsKICAgICAgYnVpbGRCdWlsZGVyKGRlY2xhcmF0aW9uLCBjb3JlTGlicmFyeSk7CiAgICB9CiAgICBjYW5BZGRJbXBsZW1lbnRhdGlvbkJ1aWxkZXJzID0gZmFsc2U7CgogICAgc2NvcGUuc2V0dGVycy5mb3JFYWNoKChTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gc2V0dGVyKSB7CiAgICAgIERlY2xhcmF0aW9uIG1lbWJlciA9IHNjb3BlQnVpbGRlcltuYW1lXTsKICAgICAgaWYgKG1lbWJlciA9PSBudWxsIHx8ICFtZW1iZXIuaXNGaWVsZCB8fCBtZW1iZXIuaXNGaW5hbCkgcmV0dXJuOwogICAgICBhZGRQcm9ibGVtKHRlbXBsYXRlQ29uZmxpY3RzV2l0aE1lbWJlci53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgc2V0dGVyLmNoYXJPZmZzZXQsIG5vTGVuZ3RoLCBmaWxlVXJpKTsKICAgICAgLy8gVE9ETyhhaGUpOiBDb250ZXh0IHRvIHByZXZpb3VzIG1lc3NhZ2U/CiAgICAgIGFkZFByb2JsZW0odGVtcGxhdGVDb25mbGljdHNXaXRoU2V0dGVyLndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICBtZW1iZXIuY2hhck9mZnNldCwgbm9MZW5ndGgsIGZpbGVVcmkpOwogICAgfSk7CgogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLy8gVXNlZCB0byBhZGQgaW1wbGVtZW50YXRpb24gYnVpbGRlciBkdXJpbmcgdGhlIGNhbGwgdG8gW2J1aWxkXSBhYm92ZS4KICAvLy8gQ3VycmVudGx5LCBvbmx5IGFub255bW91cyBtaXhpbnMgYXJlIHVzaW5nIGltcGxlbWVudGF0aW9uIGJ1aWxkZXJzIChzZWUKICAvLy8gW0tlcm5lbE1peGluQXBwbGljYXRpb25CdWlsZGVyXQogIC8vLyAoLi4va2VybmVsL2tlcm5lbF9taXhpbl9hcHBsaWNhdGlvbl9idWlsZGVyLmRhcnQpKS4KICB2b2lkIGFkZEltcGxlbWVudGF0aW9uQnVpbGRlcigKICAgICAgU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBpbnQgY2hhck9mZnNldCkgewogICAgYXNzZXJ0KGNhbkFkZEltcGxlbWVudGF0aW9uQnVpbGRlcnMsICIkdXJpIik7CiAgICBpbXBsZW1lbnRhdGlvbkJ1aWxkZXJzLmFkZChbbmFtZSwgZGVjbGFyYXRpb24sIGNoYXJPZmZzZXRdKTsKICB9CgogIHZvaWQgdmFsaWRhdGVQYXJ0KFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnksIFNldDxVcmk+IHVzZWRQYXJ0cykgewogICAgaWYgKGxpYnJhcnkgIT0gbnVsbCAmJiBwYXJ0cy5pc05vdEVtcHR5KSB7CiAgICAgIC8vIElmIFtsaWJyYXJ5XSBpcyBudWxsLCB3ZSBoYXZlIGFscmVhZHkgcmVwb3J0ZWQgYSBwcm9ibGVtIHRoYXQgdGhpcwogICAgICAvLyBwYXJ0IGlzIG9ycGhhbmVkLgogICAgICBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0ID0gPExvY2F0ZWRNZXNzYWdlPlsKICAgICAgICBtZXNzYWdlUGFydEluUGFydExpYnJhcnlDb250ZXh0LndpdGhMb2NhdGlvbihsaWJyYXJ5LmZpbGVVcmksIDAsIDEpLAogICAgICBdOwogICAgICBmb3IgKGludCBvZmZzZXQgaW4gcGFydE9mZnNldHMpIHsKICAgICAgICBhZGRQcm9ibGVtKG1lc3NhZ2VQYXJ0SW5QYXJ0LCBvZmZzZXQsIG5vTGVuZ3RoLCBmaWxlVXJpLAogICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICAgICAgfQogICAgICBmb3IgKFNvdXJjZUxpYnJhcnlCdWlsZGVyIHBhcnQgaW4gcGFydHMpIHsKICAgICAgICAvLyBNYXJrIHRoaXMgcGFydCBhcyB1c2VkIHNvIHdlIGRvbid0IHJlcG9ydCBpdCBhcyBvcnBoYW5lZC4KICAgICAgICB1c2VkUGFydHMuYWRkKHBhcnQudXJpKTsKICAgICAgfQogICAgfQogICAgcGFydHMuY2xlYXIoKTsKICAgIGlmIChleHBvcnRlcnMuaXNOb3RFbXB0eSkgewogICAgICBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0ID0gPExvY2F0ZWRNZXNzYWdlPlsKICAgICAgICBtZXNzYWdlUGFydEV4cG9ydENvbnRleHQud2l0aExvY2F0aW9uKGZpbGVVcmksIDAsIDEpLAogICAgICBdOwogICAgICBmb3IgKEV4cG9ydCBleHBvcnQgaW4gZXhwb3J0ZXJzKSB7CiAgICAgICAgZXhwb3J0LmV4cG9ydGVyLmFkZFByb2JsZW0oCiAgICAgICAgICAgIG1lc3NhZ2VQYXJ0RXhwb3J0LCBleHBvcnQuY2hhck9mZnNldCwgImV4cG9ydCIubGVuZ3RoLCBudWxsLAogICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBpbmNsdWRlUGFydHMoU2V0PFVyaT4gdXNlZFBhcnRzKSB7CiAgICBTZXQ8VXJpPiBzZWVuUGFydHMgPSBuZXcgU2V0PFVyaT4oKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHsKICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXI8VCwgUj4gcGFydCA9IHBhcnRzW2ldOwogICAgICBpbnQgcGFydE9mZnNldCA9IHBhcnRPZmZzZXRzW2ldOwogICAgICBpZiAocGFydCA9PSB0aGlzKSB7CiAgICAgICAgYWRkUHJvYmxlbShtZXNzYWdlUGFydE9mU2VsZiwgLTEsIG5vTGVuZ3RoLCBmaWxlVXJpKTsKICAgICAgfSBlbHNlIGlmIChzZWVuUGFydHMuYWRkKHBhcnQuZmlsZVVyaSkpIHsKICAgICAgICBpZiAocGFydC5wYXJ0T2ZMaWJyYXJ5ICE9IG51bGwpIHsKICAgICAgICAgIGFkZFByb2JsZW0obWVzc2FnZVBhcnRPZlR3b0xpYnJhcmllcywgLTEsIG5vTGVuZ3RoLCBwYXJ0LmZpbGVVcmksCiAgICAgICAgICAgICAgY29udGV4dDogWwogICAgICAgICAgICAgICAgbWVzc2FnZVBhcnRPZlR3b0xpYnJhcmllc0NvbnRleHQud2l0aExvY2F0aW9uKAogICAgICAgICAgICAgICAgICAgIHBhcnQucGFydE9mTGlicmFyeS5maWxlVXJpLCAtMSwgbm9MZW5ndGgpLAogICAgICAgICAgICAgICAgbWVzc2FnZVBhcnRPZlR3b0xpYnJhcmllc0NvbnRleHQud2l0aExvY2F0aW9uKAogICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZVVyaSwgLTEsIG5vTGVuZ3RoKQogICAgICAgICAgICAgIF0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoaXNQYXRjaCkgewogICAgICAgICAgICB1c2VkUGFydHMuYWRkKHBhcnQuZmlsZVVyaSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1c2VkUGFydHMuYWRkKHBhcnQudXJpKTsKICAgICAgICAgIH0KICAgICAgICAgIGluY2x1ZGVQYXJ0KHBhcnQsIHVzZWRQYXJ0cywgcGFydE9mZnNldCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGFkZFByb2JsZW0odGVtcGxhdGVQYXJ0VHdpY2Uud2l0aEFyZ3VtZW50cyhwYXJ0LmZpbGVVcmkpLCAtMSwgbm9MZW5ndGgsCiAgICAgICAgICAgIGZpbGVVcmkpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGluY2x1ZGVQYXJ0KAogICAgICBTb3VyY2VMaWJyYXJ5QnVpbGRlcjxULCBSPiBwYXJ0LCBTZXQ8VXJpPiB1c2VkUGFydHMsIGludCBwYXJ0T2Zmc2V0KSB7CiAgICBpZiAocGFydC5wYXJ0T2ZVcmkgIT0gbnVsbCkgewogICAgICBpZiAodXJpSXNWYWxpZChwYXJ0LnBhcnRPZlVyaSkgJiYgcGFydC5wYXJ0T2ZVcmkgIT0gdXJpKSB7CiAgICAgICAgLy8gVGhpcyBpcyBhbiBlcnJvciwgYnV0IHRoZSBwYXJ0IGlzIG5vdCByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2YgcGFydHMsCiAgICAgICAgLy8gc28gdGhhdCBtZXRhZGF0YSBhbm5vdGF0aW9ucyBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGl0LgogICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlUGFydE9mVXJpTWlzbWF0Y2gud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgIHBhcnQuZmlsZVVyaSwgdXJpLCBwYXJ0LnBhcnRPZlVyaSksCiAgICAgICAgICAgIHBhcnRPZmZzZXQsCiAgICAgICAgICAgIG5vTGVuZ3RoLAogICAgICAgICAgICBmaWxlVXJpKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocGFydC5wYXJ0T2ZOYW1lICE9IG51bGwpIHsKICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewogICAgICAgIGlmIChwYXJ0LnBhcnRPZk5hbWUgIT0gbmFtZSkgewogICAgICAgICAgLy8gVGhpcyBpcyBhbiBlcnJvciwgYnV0IHRoZSBwYXJ0IGlzIG5vdCByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2YKICAgICAgICAgIC8vIHBhcnRzLCBzbyB0aGF0IG1ldGFkYXRhIGFubm90YXRpb25zIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggaXQuCiAgICAgICAgICBhZGRQcm9ibGVtKAogICAgICAgICAgICAgIHRlbXBsYXRlUGFydE9mTGlicmFyeU5hbWVNaXNtYXRjaC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICBwYXJ0LmZpbGVVcmksIG5hbWUsIHBhcnQucGFydE9mTmFtZSksCiAgICAgICAgICAgICAgcGFydE9mZnNldCwKICAgICAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgICAgICBmaWxlVXJpKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVGhpcyBpcyBhbiBlcnJvciwgYnV0IHRoZSBwYXJ0IGlzIG5vdCByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2YgcGFydHMsCiAgICAgICAgLy8gc28gdGhhdCBtZXRhZGF0YSBhbm5vdGF0aW9ucyBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGl0LgogICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlUGFydE9mVXNlVXJpLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICBwYXJ0LmZpbGVVcmksIGZpbGVVcmksIHBhcnQucGFydE9mTmFtZSksCiAgICAgICAgICAgIHBhcnRPZmZzZXQsCiAgICAgICAgICAgIG5vTGVuZ3RoLAogICAgICAgICAgICBmaWxlVXJpKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIFRoaXMgaXMgYW4gZXJyb3IsIGJ1dCB0aGUgcGFydCBpcyBub3QgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIHBhcnRzLAogICAgICAvLyBzbyB0aGF0IG1ldGFkYXRhIGFubm90YXRpb25zIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggaXQuCiAgICAgIGFzc2VydCghcGFydC5pc1BhcnQpOwogICAgICBpZiAodXJpSXNWYWxpZChwYXJ0LmZpbGVVcmkpKSB7CiAgICAgICAgYWRkUHJvYmxlbSh0ZW1wbGF0ZU1pc3NpbmdQYXJ0T2Yud2l0aEFyZ3VtZW50cyhwYXJ0LmZpbGVVcmkpLAogICAgICAgICAgICBwYXJ0T2Zmc2V0LCBub0xlbmd0aCwgZmlsZVVyaSk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgcGFydC52YWxpZGF0ZVBhcnQodGhpcywgdXNlZFBhcnRzKTsKICAgIE5hbWVJdGVyYXRvciBwYXJ0RGVjbGFyYXRpb25zID0gcGFydC5uYW1lSXRlcmF0b3I7CiAgICB3aGlsZSAocGFydERlY2xhcmF0aW9ucy5tb3ZlTmV4dCgpKSB7CiAgICAgIFN0cmluZyBuYW1lID0gcGFydERlY2xhcmF0aW9ucy5uYW1lOwogICAgICBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IHBhcnREZWNsYXJhdGlvbnMuY3VycmVudDsKCiAgICAgIGlmIChkZWNsYXJhdGlvbi5uZXh0ICE9IG51bGwpIHsKICAgICAgICBMaXN0PERlY2xhcmF0aW9uPiBkdXBsaWNhdGVkID0gPERlY2xhcmF0aW9uPltdOwogICAgICAgIHdoaWxlIChkZWNsYXJhdGlvbi5uZXh0ICE9IG51bGwpIHsKICAgICAgICAgIGR1cGxpY2F0ZWQuYWRkKGRlY2xhcmF0aW9uKTsKICAgICAgICAgIHBhcnREZWNsYXJhdGlvbnMubW92ZU5leHQoKTsKICAgICAgICAgIGRlY2xhcmF0aW9uID0gcGFydERlY2xhcmF0aW9ucy5jdXJyZW50OwogICAgICAgIH0KICAgICAgICBkdXBsaWNhdGVkLmFkZChkZWNsYXJhdGlvbik7CiAgICAgICAgLy8gSGFuZGxlIGR1cGxpY2F0ZWQgZGVjbGFyYXRpb25zIGluIHRoZSBwYXJ0LgogICAgICAgIC8vCiAgICAgICAgLy8gRHVwbGljYXRlZCBkZWNsYXJhdGlvbnMgYXJlIGhhbmRsZWQgYnkgY3JlYXRpbmcgYSBsaW5rZWQgbGlzdCB1c2luZwogICAgICAgIC8vIHRoZSBgbmV4dGAgZmllbGQuIFRoaXMgaXMgcHJlZmVycmVkIG92ZXIgbWFraW5nIGFsbCBzY29wZSBlbnRyaWVzIGJlCiAgICAgICAgLy8gYSBgTGlzdDxEZWNsYXJhdGlvbj5gLgogICAgICAgIC8vCiAgICAgICAgLy8gV2UgbWFpbnRhaW4gdGhlIGxpbmtlZCBsaXN0IHNvIHRoYXQgdGhlIGxhc3QgZW50cnkgaXMgZWFzeSB0bwogICAgICAgIC8vIHJlY29nbml6ZSAoaXQncyBgbmV4dGAgZmllbGQgaXMgbnVsbCkuIFRoaXMgbWVhbnMgdGhhdCBpdCBpcwogICAgICAgIC8vIHJldmVyc2VkIHdpdGggcmVzcGVjdCB0byBzb3VyY2UgY29kZSBvcmRlci4gU2luY2Uga2VybmVsIGRvZXNuJ3QKICAgICAgICAvLyBhbGxvdyBkdXBsaWNhdGVkIGRlY2xhcmF0aW9ucywgd2UgZW5zdXJlIHRoYXQgd2Ugb25seSBhZGQgdGhlIGZpcnN0CiAgICAgICAgLy8gZGVjbGFyYXRpb24gdG8gdGhlIGtlcm5lbCB0cmVlLgogICAgICAgIC8vCiAgICAgICAgLy8gU2luY2UgdGhlIGR1cGxpY2F0ZWQgZGVjbGFyYXRpb25zIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSBvcmRlciwgd2UKICAgICAgICAvLyBpdGVyYXRlIG92ZXIgdGhlbSBpbiByZXZlcnNlIG9yZGVyIGFzIHRoaXMgaXMgc2ltcGxlciBhbmQgbm9ybWFsbHkKICAgICAgICAvLyBub3QgYSBwcm9ibGVtLiBIb3dldmVyLCBpbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBjYWxsIFthZGRCdWlsZGVyXSBpbgogICAgICAgIC8vIHNvdXJjZSBvcmRlciBhcyBpdCB3b3VsZCBvdGhlcndpc2UgY3JlYXRlIGN5Y2xlcy4KICAgICAgICAvLwogICAgICAgIC8vIFdlIGFsc28gbmVlZCB0byBiZSBjYXJlZnVsIHByZXNlcnZpbmcgdGhlIG9yZGVyIG9mIHRoZSBsaW5rcy4gVGhlCiAgICAgICAgLy8gcGFydCBsaWJyYXJ5IHN0aWxsIGtlZXBzIHRoZXNlIGRlY2xhcmF0aW9ucyBpbiBpdHMgc2NvcGUgc28gdGhhdAogICAgICAgIC8vIERpZXRMaXN0ZW5lciBjYW4gZmluZCB0aGVtLgogICAgICAgIGZvciAoaW50IGkgPSBkdXBsaWNhdGVkLmxlbmd0aDsgaSA+IDA7IGktLSkgewogICAgICAgICAgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBkdXBsaWNhdGVkW2kgLSAxXTsKICAgICAgICAgIGFkZEJ1aWxkZXIobmFtZSwgZGVjbGFyYXRpb24sIGRlY2xhcmF0aW9uLmNoYXJPZmZzZXQpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBhZGRCdWlsZGVyKG5hbWUsIGRlY2xhcmF0aW9uLCBkZWNsYXJhdGlvbi5jaGFyT2Zmc2V0KTsKICAgICAgfQogICAgfQogICAgdHlwZXMuYWRkQWxsKHBhcnQudHlwZXMpOwogICAgY29uc3RydWN0b3JSZWZlcmVuY2VzLmFkZEFsbChwYXJ0LmNvbnN0cnVjdG9yUmVmZXJlbmNlcyk7CiAgICBwYXJ0LnBhcnRPZkxpYnJhcnkgPSB0aGlzOwogICAgcGFydC5zY29wZS5iZWNvbWVQYXJ0T2Yoc2NvcGUpOwogICAgLy8gVE9ETyhhaGUpOiBJbmNsdWRlIG1ldGFkYXRhIGZyb20gcGFydD8KICB9CgogIHZvaWQgYnVpbGRJbml0aWFsU2NvcGVzKCkgewogICAgTmFtZUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmFtZUl0ZXJhdG9yOwogICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgYWRkVG9FeHBvcnRTY29wZShpdGVyYXRvci5uYW1lLCBpdGVyYXRvci5jdXJyZW50KTsKICAgIH0KICB9CgogIHZvaWQgYWRkSW1wb3J0c1RvU2NvcGUoKSB7CiAgICBib29sIGV4cGxpY2l0Q29yZUltcG9ydCA9IHRoaXMgPT0gbG9hZGVyLmNvcmVMaWJyYXJ5OwogICAgZm9yIChJbXBvcnQgaW1wb3J0IGluIGltcG9ydHMpIHsKICAgICAgaWYgKGltcG9ydC5pbXBvcnRlZCA9PSBsb2FkZXIuY29yZUxpYnJhcnkpIHsKICAgICAgICBleHBsaWNpdENvcmVJbXBvcnQgPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChpbXBvcnQuaW1wb3J0ZWQ/LmlzUGFydCA/PyBmYWxzZSkgewogICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlUGFydE9mSW5MaWJyYXJ5LndpdGhBcmd1bWVudHMoaW1wb3J0LmltcG9ydGVkLmZpbGVVcmkpLAogICAgICAgICAgICBpbXBvcnQuY2hhck9mZnNldCwKICAgICAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgICAgIGZpbGVVcmkpOwogICAgICB9CiAgICAgIGltcG9ydC5maW5hbGl6ZUltcG9ydHModGhpcyk7CiAgICB9CiAgICBpZiAoIWV4cGxpY2l0Q29yZUltcG9ydCkgewogICAgICBsb2FkZXIuY29yZUxpYnJhcnkuZXhwb3J0U2NvcGUuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIG1lbWJlcikgewogICAgICAgIGFkZFRvU2NvcGUobmFtZSwgbWVtYmVyLCAtMSwgdHJ1ZSk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRUb1Njb3BlKAogICAgICBTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gbWVtYmVyLCBpbnQgY2hhck9mZnNldCwgYm9vbCBpc0ltcG9ydCkgewogICAgTWFwPFN0cmluZywgRGVjbGFyYXRpb24+IG1hcCA9CiAgICAgICAgbWVtYmVyLmlzU2V0dGVyID8gaW1wb3J0U2NvcGUuc2V0dGVycyA6IGltcG9ydFNjb3BlLmxvY2FsOwogICAgRGVjbGFyYXRpb24gZXhpc3RpbmcgPSBtYXBbbmFtZV07CiAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkgewogICAgICBpZiAoZXhpc3RpbmcgIT0gbWVtYmVyKSB7CiAgICAgICAgbWFwW25hbWVdID0gY29tcHV0ZUFtYmlndW91c0RlY2xhcmF0aW9uKAogICAgICAgICAgICBuYW1lLCBleGlzdGluZywgbWVtYmVyLCBjaGFyT2Zmc2V0LAogICAgICAgICAgICBpc0ltcG9ydDogaXNJbXBvcnQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBtYXBbbmFtZV0gPSBtZW1iZXI7CiAgICB9CiAgfQoKICAvLy8gUmVzb2x2ZXMgYWxsIHVucmVzb2x2ZWQgdHlwZXMgaW4gW3R5cGVzXS4gVGhlIGxpc3Qgb2YgdHlwZXMgaXMgY2xlYXJlZAogIC8vLyB3aGVuIGRvbmUuCiAgaW50IHJlc29sdmVUeXBlcygpIHsKICAgIGludCB0eXBlQ291bnQgPSB0eXBlcy5sZW5ndGg7CiAgICBmb3IgKFVucmVzb2x2ZWRUeXBlPFQ+IHQgaW4gdHlwZXMpIHsKICAgICAgdC5yZXNvbHZlSW4oc2NvcGUsIHRoaXMpOwogICAgICBpZiAoIWxvYWRlci50YXJnZXQubGVnYWN5TW9kZSkgewogICAgICAgIHQuY2hlY2tUeXBlKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdC5ub3JtYWxpemVUeXBlKCk7CiAgICAgIH0KICAgIH0KICAgIHR5cGVzLmNsZWFyKCk7CiAgICByZXR1cm4gdHlwZUNvdW50OwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHJlc29sdmVDb25zdHJ1Y3RvcnMoXykgewogICAgaW50IGNvdW50ID0gMDsKICAgIEl0ZXJhdG9yPERlY2xhcmF0aW9uPiBpdGVyYXRvciA9IHRoaXMuaXRlcmF0b3I7CiAgICB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICBjb3VudCArPSBpdGVyYXRvci5jdXJyZW50LnJlc29sdmVDb25zdHJ1Y3RvcnModGhpcyk7CiAgICB9CiAgICByZXR1cm4gY291bnQ7CiAgfQoKICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IGNvcHlUeXBlVmFyaWFibGVzKAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IG9yaWdpbmFsLCBEZWNsYXJhdGlvbkJ1aWxkZXIgZGVjbGFyYXRpb24pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGZ1bGxOYW1lRm9yRXJyb3JzIHsKICAgIC8vIFRPRE8oYWhlKTogQ29uc2lkZXIgaWYgd2Ugc2hvdWxkIHVzZSByZWxhdGl2aXplVXJpIGhlcmUuIFRoZSBkb3duc2lkZSB0bwogICAgLy8gZG9pbmcgdGhhdCBpcyB0aGF0IHRoaXMgVVJJIG1heSBiZSB1c2VkIGluIGFuIGVycm9yIG1lc3NhZ2UuIElkZWFsbHksIHdlCiAgICAvLyBzaG91bGQgY3JlYXRlIGEgY2xhc3MgdGhhdCByZXByZXNlbnRzIHF1YWxpZmllZCBuYW1lcyB0aGF0IHdlIGNhbgogICAgLy8gcmVsYXRpdml6ZSB3aGVuIHByaW50aW5nIGEgbWVzc2FnZSwgYnV0IHN0aWxsIHN0b3JlIHRoZSBmdWxsIFVSSSBpbgogICAgLy8gLmRpbGwgZmlsZXMuCiAgICByZXR1cm4gbmFtZSA/PyAiPGxpYnJhcnkgJyRmaWxlVXJpJz4iOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWNvcmRBY2Nlc3MoaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgsIFVyaSBmaWxlVXJpKSB7CiAgICBhY2Nlc3NvcnMuYWRkKGZpbGVVcmkpOwogICAgYWNjZXNzb3JzLmFkZChjaGFyT2Zmc2V0KTsKICAgIGFjY2Vzc29ycy5hZGQobGVuZ3RoKTsKICAgIGlmIChhY2Nlc3NQcm9ibGVtICE9IG51bGwpIHsKICAgICAgYWRkUHJvYmxlbShhY2Nlc3NQcm9ibGVtLCBjaGFyT2Zmc2V0LCBsZW5ndGgsIGZpbGVVcmkpOwogICAgfQogIH0KCiAgdm9pZCBhZGRQcm9ibGVtQXRBY2Nlc3NvcnMoTWVzc2FnZSBtZXNzYWdlKSB7CiAgICBpZiAoYWNjZXNzUHJvYmxlbSA9PSBudWxsKSB7CiAgICAgIGlmIChhY2Nlc3NvcnMuaXNFbXB0eSAmJiB0aGlzID09IGxvYWRlci5maXJzdCkgewogICAgICAgIC8vIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IGxpYnJhcnksIGFuZCBub2JvZHkgYWNjZXNzIGl0IGRpcmVjdGx5LiBTbwogICAgICAgIC8vIHdlIG5lZWQgdG8gcmVwb3J0IGEgcHJvYmxlbS4KICAgICAgICBsb2FkZXIuYWRkUHJvYmxlbShtZXNzYWdlLCAtMSwgMSwgbnVsbCk7CiAgICAgIH0KICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhY2Nlc3NvcnMubGVuZ3RoOyBpICs9IDMpIHsKICAgICAgICBVcmkgYWNjZXNzb3IgPSBhY2Nlc3NvcnNbaV07CiAgICAgICAgaW50IGNoYXJPZmZzZXQgPSBhY2Nlc3NvcnNbaSArIDFdOwogICAgICAgIGludCBsZW5ndGggPSBhY2Nlc3NvcnNbaSArIDJdOwogICAgICAgIGFkZFByb2JsZW0obWVzc2FnZSwgY2hhck9mZnNldCwgbGVuZ3RoLCBhY2Nlc3Nvcik7CiAgICAgIH0KICAgICAgYWNjZXNzUHJvYmxlbSA9IG1lc3NhZ2U7CiAgICB9CiAgfQoKICB2b2lkIGNoZWNrQm91bmRzSW5PdXRsaW5lKGNvdmFyaWFudCB0eXBlRW52aXJvbm1lbnQpOwoKICBpbnQgZmluYWxpemVJbml0aWFsaXppbmdGb3JtYWxzKCk7Cn0KCi8vLyBVbmxpa2UgW1Njb3BlXSwgdGhpcyBzY29wZSBpcyB1c2VkIGR1cmluZyBjb25zdHJ1Y3Rpb24gb2YgYnVpbGRlcnMgdG8KLy8vIGVuc3VyZSB0eXBlcyBhbmQgbWVtYmVycyBhcmUgYWRkZWQgdG8gYW5kIHJlc29sdmVkIGluIHRoZSBjb3JyZWN0IGxvY2F0aW9uLgpjbGFzcyBEZWNsYXJhdGlvbkJ1aWxkZXI8VCBleHRlbmRzIFR5cGVCdWlsZGVyPiB7CiAgZmluYWwgRGVjbGFyYXRpb25CdWlsZGVyPFQ+IHBhcmVudDsKCiAgZmluYWwgTWFwPFN0cmluZywgRGVjbGFyYXRpb24+IG1lbWJlcnM7CgogIGZpbmFsIE1hcDxTdHJpbmcsIERlY2xhcmF0aW9uPiBjb25zdHJ1Y3RvcnM7CgogIGZpbmFsIE1hcDxTdHJpbmcsIERlY2xhcmF0aW9uPiBzZXR0ZXJzOwoKICBmaW5hbCBMaXN0PFVucmVzb2x2ZWRUeXBlPFQ+PiB0eXBlcyA9IDxVbnJlc29sdmVkVHlwZTxUPj5bXTsKCiAgU3RyaW5nIG5hbWU7CgogIC8vIE9mZnNldCBvZiBuYW1lIHRva2VuLCB1cGRhdGVkIGJ5IHRoZSBvdXRsaW5lIGJ1aWxkZXIgYWxvbmcKICAvLyB3aXRoIHRoZSBuYW1lIGFzIHRoZSBjdXJyZW50IGRlY2xhcmF0aW9uIGNoYW5nZXMuCiAgaW50IGNoYXJPZmZzZXQ7CgogIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlczsKCiAgYm9vbCBoYXNDb25zdENvbnN0cnVjdG9yID0gZmFsc2U7CgogIERlY2xhcmF0aW9uQnVpbGRlcih0aGlzLm1lbWJlcnMsIHRoaXMuc2V0dGVycywgdGhpcy5jb25zdHJ1Y3RvcnMsIHRoaXMubmFtZSwKICAgICAgdGhpcy5jaGFyT2Zmc2V0LCB0aGlzLnBhcmVudCkgewogICAgYXNzZXJ0KG5hbWUgIT0gbnVsbCk7CiAgfQoKICBEZWNsYXJhdGlvbkJ1aWxkZXIubGlicmFyeSgpCiAgICAgIDogdGhpcyg8U3RyaW5nLCBEZWNsYXJhdGlvbj57fSwgPFN0cmluZywgRGVjbGFyYXRpb24+e30sIG51bGwsCiAgICAgICAgICAgICI8bGlicmFyeT4iLCAtMSwgbnVsbCk7CgogIERlY2xhcmF0aW9uQnVpbGRlciBjcmVhdGVOZXN0ZWQoU3RyaW5nIG5hbWUsIGJvb2wgaGFzTWVtYmVycykgewogICAgcmV0dXJuIG5ldyBEZWNsYXJhdGlvbkJ1aWxkZXI8VD4oCiAgICAgICAgaGFzTWVtYmVycyA/IDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+e30gOiBudWxsLAogICAgICAgIGhhc01lbWJlcnMgPyA8U3RyaW5nLCBNZW1iZXJCdWlsZGVyPnt9IDogbnVsbCwKICAgICAgICBoYXNNZW1iZXJzID8gPFN0cmluZywgTWVtYmVyQnVpbGRlcj57fSA6IG51bGwsCiAgICAgICAgbmFtZSwKICAgICAgICAtMSwKICAgICAgICB0aGlzKTsKICB9CgogIHZvaWQgYWRkVHlwZShVbnJlc29sdmVkVHlwZTxUPiB0eXBlKSB7CiAgICB0eXBlcy5hZGQodHlwZSk7CiAgfQoKICAvLy8gUmVzb2x2ZXMgdHlwZSB2YXJpYWJsZXMgaW4gW3R5cGVzXSBhbmQgcHJvcGFnYXRlIG90aGVyIHR5cGVzIHRvIFtwYXJlbnRdLgogIHZvaWQgcmVzb2x2ZVR5cGVzKAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMsIFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgIE1hcDxTdHJpbmcsIFR5cGVWYXJpYWJsZUJ1aWxkZXI+IG1hcDsKICAgIGlmICh0eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgbWFwID0gPFN0cmluZywgVHlwZVZhcmlhYmxlQnVpbGRlcj57fTsKICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIGJ1aWxkZXIgaW4gdHlwZVZhcmlhYmxlcykgewogICAgICAgIG1hcFtidWlsZGVyLm5hbWVdID0gYnVpbGRlcjsKICAgICAgfQogICAgfQogICAgU2NvcGUgc2NvcGU7CiAgICBmb3IgKFVucmVzb2x2ZWRUeXBlPFQ+IHR5cGUgaW4gdHlwZXMpIHsKICAgICAgT2JqZWN0IG5hbWVPclF1YWxpZmllZCA9IHR5cGUuYnVpbGRlci5uYW1lOwogICAgICBTdHJpbmcgbmFtZSA9IG5hbWVPclF1YWxpZmllZCBpcyBRdWFsaWZpZWROYW1lCiAgICAgICAgICA/IG5hbWVPclF1YWxpZmllZC5xdWFsaWZpZXIKICAgICAgICAgIDogbmFtZU9yUXVhbGlmaWVkOwogICAgICBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbjsKICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewogICAgICAgIGlmIChtZW1iZXJzICE9IG51bGwpIHsKICAgICAgICAgIGRlY2xhcmF0aW9uID0gbWVtYmVyc1tuYW1lXTsKICAgICAgICB9CiAgICAgICAgaWYgKGRlY2xhcmF0aW9uID09IG51bGwgJiYgbWFwICE9IG51bGwpIHsKICAgICAgICAgIGRlY2xhcmF0aW9uID0gbWFwW25hbWVdOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZGVjbGFyYXRpb24gPT0gbnVsbCkgewogICAgICAgIC8vIFNpbmNlIG5hbWUgZGlkbid0IHJlc29sdmUgaW4gdGhpcyBzY29wZSwgcHJvcGFnYXRlIGl0IHRvIHRoZQogICAgICAgIC8vIHBhcmVudCBkZWNsYXJhdGlvbi4KICAgICAgICBwYXJlbnQuYWRkVHlwZSh0eXBlKTsKICAgICAgfSBlbHNlIGlmIChuYW1lT3JRdWFsaWZpZWQgaXMgUXVhbGlmaWVkTmFtZSkgewogICAgICAgIC8vIEF0dGVtcHQgdG8gdXNlIGEgbWVtYmVyIG9yIHR5cGUgdmFyaWFibGUgYXMgYSBwcmVmaXguCiAgICAgICAgdHlwZS5idWlsZGVyLmJpbmQodHlwZS5idWlsZGVyLmJ1aWxkSW52YWxpZFR5cGUoCiAgICAgICAgICAgIHRlbXBsYXRlTm90QVByZWZpeEluVHlwZUFubm90YXRpb24KICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICAgIGZsYXR0ZW5OYW1lKG5hbWVPclF1YWxpZmllZC5xdWFsaWZpZXIsIHR5cGUuY2hhck9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5maWxlVXJpKSwKICAgICAgICAgICAgICAgICAgICBuYW1lT3JRdWFsaWZpZWQubmFtZSkKICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24odHlwZS5maWxlVXJpLCB0eXBlLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgbmFtZU9yUXVhbGlmaWVkLmVuZENoYXJPZmZzZXQgLSB0eXBlLmNoYXJPZmZzZXQpKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2NvcGUgPz89IHRvU2NvcGUobnVsbCkud2l0aFR5cGVWYXJpYWJsZXModHlwZVZhcmlhYmxlcyk7CiAgICAgICAgdHlwZS5yZXNvbHZlSW4oc2NvcGUsIGxpYnJhcnkpOwogICAgICB9CiAgICB9CiAgICB0eXBlcy5jbGVhcigpOwogIH0KCiAgU2NvcGUgdG9TY29wZShTY29wZSBwYXJlbnQpIHsKICAgIHJldHVybiBuZXcgU2NvcGUobWVtYmVycywgc2V0dGVycywgcGFyZW50LCBuYW1lLCBpc01vZGlmaWFibGU6IGZhbHNlKTsKICB9Cn0KCmNsYXNzIEZpZWxkSW5mbyB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgZmluYWwgaW50IGNoYXJPZmZzZXQ7CiAgZmluYWwgVG9rZW4gaW5pdGlhbGl6ZXJUb2tlbkZvckluZmVy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ICBjb25zdCBOdWxsQ29tcGlsZXJPdXRwdXQoKTsKCiAgQG92ZXJyaWRlCiAgT3V0cHV0U2luayBjcmVhdGVPdXRwdXRTaW5rKFN0cmluZyBuYW1lLCBTdHJpbmcgZXh0ZW5zaW9uLCBPdXRwdXRUeXBlIHR5cGUpIHsKICAgIHJldHVybiBOdWxsU2luay5vdXRwdXRQcm92aWRlcihuYW1lLCBleHRlbnNpb24sIHR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQmluYXJ5T3V0cHV0U2luayBjcmVhdGVCaW5hcnlTaW5rKFVyaSB1cmkpIHsKICAgIHJldHVybiBuZXcgTnVsbEJpbmFyeVNpbmsodXJpKTsKICB9Cn0KCi8vLyBBIHNpbmsgdGhhdCBkcmFpbnMgaW50byAvZGV2L251bGwuCmNsYXNzIE51bGxTaW5rIGltcGxlbWVudHMgT3V0cHV0U2luayB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIE51bGxTaW5rKHRoaXMubmFtZSk7CgogIEBvdmVycmlkZQogIHZvaWQgYWRkKFN0cmluZyB2YWx1ZSkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCBjbG9zZSgpIHt9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IG5hbWU7CgogIC8vLyBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgYW4gW2FwaS5Db21waWxlck91dHB1dFByb3ZpZGVyXS4KICBzdGF0aWMgTnVsbFNpbmsgb3V0cHV0UHJvdmlkZXIoCiAgICAgIFN0cmluZyBuYW1lLCBTdHJpbmcgZXh0ZW5zaW9uLCBPdXRwdXRUeXBlIHR5cGUpIHsKICAgIHJldHVybiBuZXcgTnVsbFNpbmsoJyRuYW1lLiRleHRlbnNpb24uJHR5cGUnKTsKICB9Cn0KCmNsYXNzIE51bGxCaW5hcnlTaW5rIGltcGxlbWVudHMgQmluYXJ5T3V0cHV0U2luayB7CiAgZmluYWwgVXJpIHVyaTsKCiAgTnVsbEJpbmFyeVNpbmsodGhpcy51cmkpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlKExpc3Q8aW50PiBidWZmZXIsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCBjbG9zZSgpIHt9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdOdWxsQmluYXJ5U2luaygkdXJpKSc7Cn0KPwBOTjwBQwEbAR8BQzUeAQxQOwQBDC8kBAIBJycVARcBDBwBDBIBDB0BRiI4MwQCATMRARwBDDwBDBIBDC8CAS5wYWNrYWdlOmNvbXBpbGVyL3NyYy9udWxsX2NvbXBpbGVyX291dHB1dC5kYXJ0QnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2RpYWdub3N0aWNzL2RpYWdub3N0aWNfbGlzdGVuZXIuZGFydIraLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5kaWFnbm9zdGljX2xpc3RlbmVyOwoKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9vcHRpb25zLmRhcnQnIHNob3cgRGlhZ25vc3RpY09wdGlvbnM7CmltcG9ydCAnbWVzc2FnZXMuZGFydCc7CmltcG9ydCAnc291cmNlX3NwYW4uZGFydCcgc2hvdyBTb3VyY2VTcGFuOwppbXBvcnQgJ3NwYW5uYWJsZS5kYXJ0JyBzaG93IFNwYW5uYWJsZTsKCi8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbmFtZSBhbmQgY2xlYW51cCB0aGlzIGludGVyZmFjZS4gQWRkIHNldmVyaXR5IGVudW0uCmFic3RyYWN0IGNsYXNzIERpYWdub3N0aWNSZXBvcnRlciB7CiAgRGlhZ25vc3RpY09wdGlvbnMgZ2V0IG9wdGlvbnM7CgogIC8vIFRPRE8oa2FybGtsb3NlKTogcmVuYW1lIGxvZyB0byBzb21ldGhpbmcgbGlrZSByZXBvcnRJbmZvLgogIHZvaWQgbG9nKG1lc3NhZ2UpOwoKICBpbnRlcm5hbEVycm9yKFNwYW5uYWJsZSBzcGFubmFibGUsIG1lc3NhZ2UpOwoKICAvLy8gQ3JlYXRlcyBhIFtTb3VyY2VTcGFuXSBmb3IgW25vZGVdIGluIHNjb3BlIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQuCiAgLy8vCiAgLy8vIElmIFtub2RlXSBpcyBhIFtOb2RlXSB3ZSBhc3NlcnQgaW4gY2hlY2tlZCBtb2RlIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcKICAvLy8gdG9rZW5zIGNhbiBiZSBmb3VuZCB3aXRoaW4gdGhlIHRva2VucyBvZiB0aGUgY3VycmVudCBlbGVtZW50LgogIFNvdXJjZVNwYW4gc3BhbkZyb21TcGFubmFibGUoU3Bhbm5hYmxlIG5vZGUpOwoKICB2b2lkIHJlcG9ydEVycm9yTWVzc2FnZShTcGFubmFibGUgc3Bhbm5hYmxlLCBNZXNzYWdlS2luZCBtZXNzYWdlS2luZCwKICAgICAgW01hcCBhcmd1bWVudHMgPSBjb25zdCB7fV0pIHsKICAgIHJlcG9ydEVycm9yKGNyZWF0ZU1lc3NhZ2Uoc3Bhbm5hYmxlLCBtZXNzYWdlS2luZCwgYXJndW1lbnRzKSk7CiAgfQoKICB2b2lkIHJlcG9ydEVycm9yKERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UsCiAgICAgIFtMaXN0PERpYWdub3N0aWNNZXNzYWdlPiBpbmZvcyA9IGNvbnN0IDxEaWFnbm9zdGljTWVzc2FnZT5bXV0pOwoKICB2b2lkIHJlcG9ydFdhcm5pbmdNZXNzYWdlKFNwYW5uYWJsZSBzcGFubmFibGUsIE1lc3NhZ2VLaW5kIG1lc3NhZ2VLaW5kLAogICAgICBbTWFwIGFyZ3VtZW50cyA9IGNvbnN0IHt9XSkgewogICAgcmVwb3J0V2FybmluZyhjcmVhdGVNZXNzYWdlKHNwYW5uYWJsZSwgbWVzc2FnZUtpbmQsIGFyZ3VtZW50cykpOwogIH0KCiAgdm9pZCByZXBvcnRXYXJuaW5nKERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UsCiAgICAgIFtMaXN0PERpYWdub3N0aWNNZXNzYWdlPiBpbmZvcyA9IGNvbnN0IDxEaWFnbm9zdGljTWVzc2FnZT5bXV0pOwoKICB2b2lkIHJlcG9ydEhpbnRNZXNzYWdlKFNwYW5uYWJsZSBzcGFubmFibGUsIE1lc3NhZ2VLaW5kIG1lc3NhZ2VLaW5kLAogICAgICBbTWFwIGFyZ3VtZW50cyA9IGNvbnN0IHt9XSkgewogICAgcmVwb3J0SGludChjcmVhdGVNZXNzYWdlKHNwYW5uYWJsZSwgbWVzc2FnZUtpbmQsIGFyZ3VtZW50cykpOwogIH0KCiAgdm9pZCByZXBvcnRIaW50KERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UsCiAgICAgIFtMaXN0PERpYWdub3N0aWNNZXNzYWdlPiBpbmZvcyA9IGNvbnN0IDxEaWFnbm9zdGljTWVzc2FnZT5bXV0pOwoKICBAZGVwcmVjYXRlZAogIHZvaWQgcmVwb3J0SW5mbyhTcGFubmFibGUgbm9kZSwgTWVzc2FnZUtpbmQgZXJyb3JDb2RlLAogICAgICBbTWFwIGFyZ3VtZW50cyA9IGNvbnN0IHt9XSk7CgogIC8vLyBTZXQgY3VycmVudCBlbGVtZW50IG9mIHRoaXMgcmVwb3J0ZXIgdG8gW2VsZW1lbnRdLiBUaGlzIGlzIHVzZWQgZm9yCiAgLy8vIGNyZWF0aW5nIFtTb3VyY2VTcGFuXSBpbiBbc3BhbkZyb21TcGFubmFibGVdLgogIHdpdGhDdXJyZW50RWxlbWVudChFbnRpdHkgZWxlbWVudCwgZigpKTsKCiAgRGlhZ25vc3RpY01lc3NhZ2UgY3JlYXRlTWVzc2FnZShTcGFubmFibGUgc3Bhbm5hYmxlLCBNZXNzYWdlS2luZCBtZXNzYWdlS2luZCwKICAgICAgW01hcCBhcmd1bWVudHMgPSBjb25zdCB7fV0pOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgYSBjcmFzaCwgYW4gZXJyb3Igb3IgYSBmYXRhbCB3YXJuaW5nIGhhcyBiZWVuIHJlcG9ydGVkLgogIGJvb2wgZ2V0IGhhc1JlcG9ydGVkRXJyb3I7CgogIC8vLyBDYWxsZWQgd2hlbiBhbiBbZXhjZXB0aW9uXSBpcyB0aHJvd24gZnJvbSB1c2VyLXByb3ZpZGVkIGNvZGUsIGxpa2UgZnJvbQogIC8vLyB0aGUgaW5wdXQgcHJvdmlkZXIgb3IgZGlhZ25vc3RpY3MgaGFuZGxlci4KICB2b2lkIG9uQ3Jhc2hJblVzZXJDb2RlKFN0cmluZyBtZXNzYWdlLCBleGNlcHRpb24sIHN0YWNrVHJhY2UpIHt9Cn0KCmNsYXNzIERpYWdub3N0aWNNZXNzYWdlIHsKICBmaW5hbCBTb3VyY2VTcGFuIHNvdXJjZVNwYW47CiAgZmluYWwgU3Bhbm5hYmxlIHNwYW5uYWJsZTsKICBmaW5hbCBNZXNzYWdlIG1lc3NhZ2U7CgogIERpYWdub3N0aWNNZXNzYWdlKHRoaXMuc291cmNlU3BhbiwgdGhpcy5zcGFubmFibGUsIHRoaXMubWVzc2FnZSk7Cn0KTwBOTjwBJQEkMRgrKAFOJCEBPxUBLwFJBk1EMAFIJEMEAS5GAUokRQQBMEYBRyRCBAEtRgEOOSMBSjQrAVAjAVAdAU4xQwIBGh8dGQFEAgE5cGFja2FnZTpjb21waWxlci9zcmMvZGlhZ25vc3RpY3MvZGlhZ25vc3RpY19saXN0ZW5lci5kYXJ0OHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2RpYWdub3N0aWNzL2ludmFyaWFudC5kYXJ0hykvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmRpYWdub3N0aWNzLmludmFyaWFudDsKCmltcG9ydCAnc3Bhbm5hYmxlLmRhcnQnOwoKLy8vIEZsYWcgdGhhdCBjYW4gYmUgdXNlZCBpbiBhc3NlcnRpb25zIHRvIGFzc2VydCB0aGF0IGEgY29kZSBwYXRoIGlzIG9ubHkKLy8vIGV4ZWN1dGVkIGFzIHBhcnQgb2YgZGV2ZWxvcG1lbnQuCi8vLwovLy8gVGhpcyBmbGFnIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHRvIHRydWUgaWYgaGVscGVyIG1ldGhvZHMgbGlrZSwgW2RlYnVnUHJpbnRdLAovLy8gW2RlYnVnV3JhcFByaW50XSwgW3RyYWNlXSwgYW5kIFtyZXBvcnRIZXJlXSBhcmUgY2FsbGVkLgpib29sIERFQlVHX01PREUgPSBmYWxzZTsKCi8vLyBBc3NlcnQgdGhhdCBbREVCVUdfTU9ERV0gaXMgYHRydWVgIGFuZCBwcm92aWRlIFttZXNzYWdlXSBhcyBwYXJ0IG9mIHRoZQovLy8gZXJyb3IgbWVzc2FnZS4KYXNzZXJ0RGVidWdNb2RlKFN0cmluZyBtZXNzYWdlKSB7CiAgYXNzZXJ0KERFQlVHX01PREUsCiAgICAgIGZhaWxlZEF0KE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwgJ0RlYnVnIG1vZGUgaXMgbm90IGVuYWJsZWQ6ICRtZXNzYWdlJykpOwp9CgovLy8gVGhyb3dzIGEgW1NwYW5uYWJsZUFzc2VydGlvbkZhaWx1cmVdLgovLy8KLy8vIFVzZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGJldHRlciBpbmZvcm1hdGlvbiBmb3IgYXNzZXJ0aW9uIGJ5IGNhbGxpbmcKLy8vIFtmYWlsZWRBdF0gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBhbiBgYXNzZXJ0YCBzdGF0ZW1lbnQ6Ci8vLwovLy8gICAgIGFzc2VydChjb25kaXRpb24sIGZhaWxlZEF0KHBvc2l0aW9uLCBtZXNzYWdlKSk7Ci8vLwovLy8gW3NwYW5uYWJsZV0gbXVzdCBiZSBub24tbnVsbCBhbmQgd2lsbCBiZSB1c2VkIHRvIHByb3ZpZGUgcG9zaXRpb25hbAovLy8gaW5mb3JtYXRpb24gaW4gdGhlIGdlbmVyYXRlZCBlcnJvciBtZXNzYWdlLgovLy8KLy8vIFRoaXMgbWV0aG9kIGNhbiBhbHNvIGJlIHVzZWQgdG8gdGhyb3cgYSBbU3Bhbm5hYmxlQXNzZXJ0aW9uRmFpbHVyZV0gb3V0c2lkZQovLy8gYW4gYXNzZXJ0OgovLy8KLy8vICAgICBmYWlsZWRBdChwb3NpdGlvbiwgbWVzc2FnZSk7Ci8vLwovLy8gb3IsIGlmIHRoZSBlbmNsb3NpbmcgZnVuY3Rpb24gcmVxdWlyZXMgYSByZXN1bHQgb3IgY29udHJvbCBmbG93OgovLy8KLy8vICAgICB0aHJvdyBmYWlsZWRBdChwb3NpdGlvbiwgbWVzc2FnZSk7Ci8vLwpib29sIGZhaWxlZEF0KFNwYW5uYWJsZSBzcGFubmFibGUsIFtTdHJpbmcgbWVzc2FnZV0pIHsKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2UgW3NwYW5uYWJsZV0gYW5kIFttZXNzYWdlXSB0byBwcm92aWRlIGJldHRlcgogIC8vIGluZm9ybWF0aW9uIG9uIGFzc2VydGlvbiBlcnJvcnMuCiAgaWYgKHNwYW5uYWJsZSA9PSBudWxsKSB7CiAgICB0aHJvdyBuZXcgU3Bhbm5hYmxlQXNzZXJ0aW9uRmFpbHVyZShDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICdTcGFubmFibGUgd2FzIG51bGwgZm9yIGZhaWxlZEF0LiBVc2UgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRS4nKTsKICB9CiAgdGhyb3cgbmV3IFNwYW5uYWJsZUFzc2VydGlvbkZhaWx1cmUoc3Bhbm5hYmxlLCBtZXNzYWdlKTsKfQo0AE5OPAEnARkBSyUEUTwZAUwTIhVPAgEqBEtABDgESDAEUA8EJQRFBCsEN0omG0NMBDsCAS9wYWNrYWdlOmNvbXBpbGVyL3NyYy9kaWFnbm9zdGljcy9pbnZhcmlhbnQuZGFydDpzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9kaWFnbm9zdGljcy9zb3VyY2Vfc3Bhbi5kYXJ0g0MvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmRpYWdub3N0aWNzLnNvdXJjZV9zcGFuOwoKaW1wb3J0ICdzcGFubmFibGUuZGFydCcgc2hvdyBTcGFubmFibGU7CgpjbGFzcyBTb3VyY2VTcGFuIGltcGxlbWVudHMgU3Bhbm5hYmxlIHsKICBmaW5hbCBVcmkgdXJpOwogIGZpbmFsIGludCBiZWdpbjsKICBmaW5hbCBpbnQgZW5kOwoKICBjb25zdCBTb3VyY2VTcGFuKHRoaXMudXJpLCB0aGlzLmJlZ2luLCB0aGlzLmVuZCk7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgewogICAgcmV0dXJuIDEzICogdXJpLmhhc2hDb2RlICsgMTcgKiBiZWdpbi5oYXNoQ29kZSArIDE5ICogZW5kLmhhc2hDb2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzISBTb3VyY2VTcGFuKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdXJpID09IG90aGVyLnVyaSAmJiBiZWdpbiA9PSBvdGhlci5iZWdpbiAmJiBlbmQgPT0gb3RoZXIuZW5kOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1NvdXJjZVNwYW4oJHVyaSwgJGJlZ2luLCAkZW5kKSc7Cn0KIABOTjwBKQEoASgRExEBNAEMFUgEAQwcLSxJBAEMOQIBMXBhY2thZ2U6Y29tcGlsZXIvc3JjL2RpYWdub3N0aWNzL3NvdXJjZV9zcGFuLmRhcnQ4c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvZGlhZ25vc3RpY3Mvc3Bhbm5hYmxlLmRhcnSFSC8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuZGlhZ25vc3RpY3Muc3Bhbm5hYmxlOwoKLy8vIFRhZ2dpbmcgaW50ZXJmYWNlIGZvciBjbGFzc2VzIGZyb20gd2hpY2ggc291cmNlIHNwYW5zIGNhbiBiZSBnZW5lcmF0ZWQuCi8vIFRPRE8oam9obm5pd2ludGhlcik6IEZpbmQgYSBiZXR0ZXIgbmFtZS4KLy8gVE9ETyhhaGUpOiBIb3cgYWJvdXQgIkJvbHQiPwphYnN0cmFjdCBjbGFzcyBTcGFubmFibGUge30KCmNsYXNzIF9TcGFubmFibGVTZW50aW5lbCBpbXBsZW1lbnRzIFNwYW5uYWJsZSB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIGNvbnN0IF9TcGFubmFibGVTZW50aW5lbCh0aGlzLm5hbWUpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBuYW1lOwp9CgovLy8gU2VudGluZWwgc3Bhbm5hYmxlIHVzZWQgdG8gbWFyayB0aGF0IGRpYWdub3N0aWNzIHNob3VsZCBwb2ludCB0byB0aGUKLy8vIGN1cnJlbnQgZWxlbWVudC4gTm90ZSB0aGF0IHRoZSBkaWFnbm9zdGljIHJlcG9ydGluZyB3aWxsIGZhaWwgaWYgdGhlIGN1cnJlbnQKLy8vIGVsZW1lbnQgaXMgYG51bGxgLgpjb25zdCBTcGFubmFibGUgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSA9CiAgICBjb25zdCBfU3Bhbm5hYmxlU2VudGluZWwoIkN1cnJlbnQgZWxlbWVudCIpOwoKLy8vIFNlbnRpbmVsIHNwYW5uYWJsZSB1c2VkIHRvIG1hcmsgdGhhdCB0aGVyZSBtaWdodCBiZSBubyBsb2NhdGlvbiBmb3IgdGhlCi8vLyBkaWFnbm9zdGljLiBVc2UgdGhpcyBvbmx5IHdoZW4gaXQgaXMgbm90IGFuIGVycm9yIG5vdCB0byBoYXZlIGEgY3VycmVudAovLy8gZWxlbWVudC4KY29uc3QgU3Bhbm5hYmxlIE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSA9IGNvbnN0IF9TcGFubmFibGVTZW50aW5lbCgiTm8gbG9jYXRpb24iKTsKCmNsYXNzIFNwYW5uYWJsZUFzc2VydGlvbkZhaWx1cmUgewogIGZpbmFsIFNwYW5uYWJsZSBub2RlOwogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwogIFNwYW5uYWJsZUFzc2VydGlvbkZhaWx1cmUodGhpcy5ub2RlLCB0aGlzLm1lc3NhZ2UpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnQXNzZXJ0aW9uIGZhaWx1cmUnCiAgICAgICcke21lc3NhZ2UgIT0gbnVsbCA/ICc6ICRtZXNzYWdlJyA6ICcnfSc7Cn0KKgBOTjwBJwFMLCAcATAVAScBDB0CAUlRFywxAUxMDVEBIhgYNgEMKzACAS9wYWNrYWdlOmNvbXBpbGVyL3NyYy9kaWFnbm9zdGljcy9zcGFubmFibGUuZGFydDJzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9oZWxwZXJzL2hlbHBlcnMuZGFydJC+Ly8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBMaWJyYXJ5IGZvciBkZWJ1Z2dpbmcgaGVscGVycy4gVGhlIHVuaXR0ZXN0IGFuYWx5emVfdW51c2VkX3Rlc3QgY2hlY2tzIHRoYXQKLy8vIHRoZSBoZWxwZXIgYXJlIG5vdCB1c2VkIGluIHByb2R1Y3Rpb24gY29kZS4KCmxpYnJhcnkgZGFydDJqcy5oZWxwZXJzOwoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vZGlhZ25vc3RpY3MvaW52YXJpYW50LmRhcnQnIHNob3cgREVCVUdfTU9ERTsKaW1wb3J0ICcuLi91dGlsL3V0aWwuZGFydCc7CmltcG9ydCAndHJhY2UuZGFydCc7CgpleHBvcnQgJ2RlYnVnX2NvbGxlY3Rpb24uZGFydCc7CmV4cG9ydCAnZXhwZW5zaXZlX21hcC5kYXJ0JzsKZXhwb3J0ICdleHBlbnNpdmVfc2V0LmRhcnQnOwpleHBvcnQgJ3N0YXRzLmRhcnQnOwpleHBvcnQgJ3RyYWNlLmRhcnQnOwpleHBvcnQgJ3RyYWNrX21hcC5kYXJ0JzsKCi8vLyBHbG9iYWwgZmxhZyB0byBlbmFibGUgW2RlYnVnUHJpbnRdLiBUaGlzIHNob3VsZCBhbHdheXMgYmUgYHRydWVgIGJ5IGRlZmF1bHQKLy8vIGFuZCBiZSBzZXQgdG8gYGZhbHNlYCBhcyBhIG1lYW5zIHRvIHRlbXBvcmFyaWx5IHR1cm4gb2ZmIGFsbCBkZWJ1Z2dpbmcKLy8vIHByaW50b3V0cy4KY29uc3QgYm9vbCBERUJVR19QUklOVF9FTkFCTEVEID0gdHJ1ZTsKCi8vLyBFbmFibGVzIGRlYnVnIG1vZGUuCi8vLwovLy8gU2V0cyB0aGUgW0RFQlVHX01PREVdIHRvIGB0cnVlYC4Kdm9pZCBlbmFibGVEZWJ1Z01vZGUoKSB7CiAgREVCVUdfTU9ERSA9IHRydWU7Cn0KCmNsYXNzIF9EZWJ1Z0luZGVudGF0aW9uIGV4dGVuZHMgSW5kZW50YXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBpbmRlbnRhdGlvblVuaXQgPSAiICI7Cn0KCl9EZWJ1Z0luZGVudGF0aW9uIF9pbmRlbnRhdGlvbiA9IG5ldyBfRGVidWdJbmRlbnRhdGlvbigpOwoKLy8vIEZ1bmN0aW9uIHNpZ25hdHVyZSBvZiBbZGVidWdQcmludF0uCnR5cGVkZWYgRGVidWdQcmludChzKTsKCi8vLyBJZiBbREVCVUdfUFJJTlRfRU5BQkxFRF0gaXMgYHRydWVgIHByaW50IFtzXSB1c2luZyB0aGUgY3VycmVudCBpbmRlbnRhdGlvbi4KRGVidWdQcmludCBnZXQgZGVidWdQcmludCB7CiAgZW5hYmxlRGVidWdNb2RlKCk7CiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWF5YmUgZGlzYWJsZSBkZWJ1ZyBtb2RlIGFmdGVyIHRoZSBjYWxsLgogIHJldHVybiBfZGVidWdQcmludDsKfQoKLy8vIEltcGxlbWVudGF0aW9uIG9mIFtkZWJ1Z1ByaW50XS4KX2RlYnVnUHJpbnQocykgewogIGlmIChERUJVR19QUklOVF9FTkFCTEVEKSBwcmludCgnJHtfaW5kZW50YXRpb24uaW5kZW50YXRpb259JHMnKTsKfQoKLy8vIEZ1bmN0aW9uIHNpZ25hdHVyZSBvZiBbZGVidWdXcmFwUHJpbnRdLgp0eXBlZGVmIERlYnVnV3JhcFByaW50KHMsIGYoKSk7CgovLy8gV3JhcHMgdGhlIGNhbGwgdG8gW2ZdIHdpdGggYSBwcmludCBvZiAnc3RhcnQ6JHMnIGFuZCAnZW5kOiRzJyBpbmNyZW1lbnRpbmcKLy8vIHRoZSBjdXJyZW50IGluZGVudGF0aW9uIHVzZWQgYnkgW2RlYnVnUHJpbnRdIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIFtmXS4KLy8vCi8vLyBVc2UgdGhpcyB0byBnZXQgYSB0cmVlLWxpa2UgZGVidWcgcHJpbnRvdXQgZm9yIG5lc3RlZCBjYWxscy4KRGVidWdXcmFwUHJpbnQgZ2V0IGRlYnVnV3JhcFByaW50IHsKICBlbmFibGVEZWJ1Z01vZGUoKTsKICByZXR1cm4gX2RlYnVnV3JhcFByaW50Owp9CgovLy8gSW1wbGVtZW50YXRpb24gb2YgW2RlYnVnV3JhcFByaW50XS4KX2RlYnVnV3JhcFByaW50KHMsIGYoKSkgewogIGRlYnVnUHJpbnQoJ3N0YXJ0OiRzJyk7CiAgdmFyIHJlc3VsdCA9IF9pbmRlbnRhdGlvbi5pbmRlbnRCbG9jayhmKTsKICBkZWJ1Z1ByaW50KCdlbmQ6JHMnKTsKICByZXR1cm4gcmVzdWx0Owp9CgovLy8gRHVtbXkgbWV0aG9kIHRvIG1hcmsgYnJlYWtwb2ludHMuCmRlYnVnQnJlYWsoKSB7CiAgZW5hYmxlRGVidWdNb2RlKCk7Cn0KCi8vLyBGdW5jdGlvbiBzaWduYXR1cmUgb2YgW3JlcG9ydEhlcmVdLgp0eXBlZGVmIFJlcG9ydEhlcmUoCiAgICBEaWFnbm9zdGljUmVwb3J0ZXIgcmVwb3J0ZXIsIFNwYW5uYWJsZSBub2RlLCBTdHJpbmcgZGVidWdNZXNzYWdlKTsKCi8vLyBQcmludCBhIG1lc3NhZ2Ugd2l0aCBhIHNvdXJjZSBsb2NhdGlvbi4KUmVwb3J0SGVyZSBnZXQgcmVwb3J0SGVyZSB7CiAgZW5hYmxlRGVidWdNb2RlKCk7CiAgcmV0dXJuIF9yZXBvcnRIZXJlOwp9CgovLy8gSW1wbGVtZW50YXRpb24gb2YgW3JlcG9ydEhlcmVdCl9yZXBvcnRIZXJlKERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwgU3Bhbm5hYmxlIG5vZGUsIFN0cmluZyBkZWJ1Z01lc3NhZ2UpIHsKICByZXBvcnRlcgogICAgICAucmVwb3J0SW5mbyhub2RlLCBNZXNzYWdlS2luZC5HRU5FUklDLCB7J3RleHQnOiAnSEVSRTogJGRlYnVnTWVzc2FnZSd9KTsKfQoKLy8vIFNldCBvZiB0cmFja2VkIG9iamVjdHMgdXNlZCBieSBbdHJhY2tdIGFuZCBbaWZUcmFja2VkXS4KdmFyIF90cmFja2VkT2JqZWN0cyA9IG5ldyBTZXQ8T2JqZWN0PigpOwoKLy8vIEdsb2JhbCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYHByaW50VHJhY2VgIG9wdGlvbiBvZiBbdHJhY2tdIGFuZCBbaWZUcmFja2VkXS4KYm9vbCB0cmFja1dpdGhUcmFjZSA9IGZhbHNlOwoKLy8vIElmIFtkb1RyYWNrXSBpcyBgdHJ1ZWAsIGFkZCBbb2JqZWN0XSB0byB0aGUgc2V0IG9mIHRyYWNrZWQgb2JqZWN0cy4KLy8vCi8vLyBJZiB0cmFja2VkLCBbbWVzc2FnZV0gaXMgcHJpbnRlZCBhbG9uZyB0aGUgaGFzaCBjb2RlIGFuZCB0b1N0cmluZyBvZgovLy8gW29iamVjdF0uIElmIFtwcmludFRyYWNlXSBpcyBgdHJ1ZWAgYSB0cmFjZSBwcmludGVkIGFkZGl0aW9uYWxseS4KLy8vIElmIFtwcmludFRyYWNlXSBpcyBgbnVsbGAsIFt0cmFja1dpdGhUcmFjZV0gZGV0ZXJtaW5lcyB3aGV0aGVyIGEgdHJhY2UgaXMKLy8vIHByaW50ZWQuCi8vLwovLy8gW29iamVjdF0gaXMgcmV0dXJuZWQgYXMgdGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kLgp0cmFjayhib29sIGRvVHJhY2ssIE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXNzYWdlLCB7Ym9vbCBwcmludFRyYWNlfSkgewogIGlmICghZG9UcmFjaykgcmV0dXJuIG9iamVjdDsKICBfdHJhY2tlZE9iamVjdHMuYWRkKG9iamVjdCk7CiAgU3RyaW5nIG1zZyA9ICd0cmFjazogJHtvYmplY3QuaGFzaENvZGV9OiRvYmplY3Q6JG1lc3NhZ2UnOwogIGlmIChwcmludFRyYWNlID09IG51bGwpIHByaW50VHJhY2UgPSB0cmFja1dpdGhUcmFjZTsKICBpZiAocHJpbnRUcmFjZSkgewogICAgdHJhY2UobXNnKTsKICB9IGVsc2UgewogICAgZGVidWdQcmludChtc2cpOwogIH0KICByZXR1cm4gb2JqZWN0Owp9CgovLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW29iamVjdF0gaXMgaW4gdGhlIHNldCBvZiB0cmFja2VkIG9iamVjdHMuCi8vLwovLy8gSWYgW21lc3NhZ2VdIGlzIHByb3ZpZGVkIGl0IGlzIHByaW50ZWQgYWxvbmcgdGhlIGhhc2ggY29kZSBhbmQgdG9TdHJpbmcgb2YKLy8vIFtvYmplY3RdLiBJZiBbcHJpbnRUcmFjZV0gaXMgYHRydWVgIGEgdHJhY2UgcHJpbnRlZCBhZGRpdGlvbmFsbHkuIElmCi8vLyBbcHJpbnRUcmFjZV0gaXMgYG51bGxgLCBbdHJhY2tXaXRoVHJhY2VdIGRldGVybWluZXMgd2hldGhlciBhIHRyYWNlIGlzCi8vLyBwcmludGVkLgpib29sIGlmVHJhY2tlZChPYmplY3Qgb2JqZWN0LCB7U3RyaW5nIG1lc3NhZ2UsIGJvb2wgcHJpbnRUcmFjZX0pIHsKICBpZiAoX3RyYWNrZWRPYmplY3RzLmNvbnRhaW5zKG9iamVjdCkpIHsKICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKICAgICAgU3RyaW5nIG1zZyA9ICd0cmFja2VkOiAke29iamVjdC5oYXNoQ29kZX06JG9iamVjdDokbWVzc2FnZSc7CiAgICAgIGlmIChwcmludFRyYWNlID09IG51bGwpIHByaW50VHJhY2UgPSB0cmFja1dpdGhUcmFjZTsKICAgICAgaWYgKHByaW50VHJhY2UpIHsKICAgICAgICB0cmFjZShtc2cpOwogICAgICB9IGVsc2UgewogICAgICAgIGRlYnVnUHJpbnQobXNnKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIHJldHVybiBmYWxzZTsKfQqAkgBOTjwBUDABGQEZOBwVASAdHRUVGQFQSw8nARgEJRkVAgEuDCYCAToBKBcBUBwVQxYCASQRQwIBLCABT04EQSQVGgIBKBoaLBgRAgEmDxUCASgURwEsHBUWAgEjUAtPAgE8KQFRHQFIBElGTg0ENkgfHz03FBALFQQRAgFBBE9JSw1DKhtDOxgUDxkIBhEEEAIBKXBhY2thZ2U6Y29tcGlsZXIvc3JjL2hlbHBlcnMvaGVscGVycy5kYXJ0M3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2JhY2tlbmRfc3RyYXRlZ3kuZGFydIkdLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5iYWNrZW5kX3N0cmF0ZWd5OwoKaW1wb3J0ICdjb21tb24uZGFydCc7CmltcG9ydCAnY29tbW9uL3Rhc2tzLmRhcnQnOwppbXBvcnQgJ2RlZmVycmVkX2xvYWQuZGFydCcgc2hvdyBPdXRwdXRVbml0RGF0YTsKaW1wb3J0ICdlbnF1ZXVlLmRhcnQnOwppbXBvcnQgJ2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJ2luZmVycmVyL3R5cGVzLmRhcnQnOwppbXBvcnQgJ2lvL3NvdXJjZV9pbmZvcm1hdGlvbi5kYXJ0JzsKaW1wb3J0ICdqc19iYWNrZW5kL2luZmVycmVkX2RhdGEuZGFydCc7CmltcG9ydCAnanNfYmFja2VuZC9qc19iYWNrZW5kLmRhcnQnOwppbXBvcnQgJ2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydCc7CmltcG9ydCAnc3NhL3NzYS5kYXJ0JzsKaW1wb3J0ICd1bml2ZXJzZS9jb2RlZ2VuX3dvcmxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAndW5pdmVyc2Uvd29ybGRfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICd3b3JsZC5kYXJ0JzsKCi8vLyBTdHJhdGVneSBwYXR0ZXJuIHRoYXQgZGVmaW5lcyB0aGUgZWxlbWVudCBtb2RlbCB1c2VkIGluIHR5cGUgaW5mZXJlbmNlCi8vLyBhbmQgY29kZSBnZW5lcmF0aW9uLgphYnN0cmFjdCBjbGFzcyBCYWNrZW5kU3RyYXRlZ3kgewogIC8vLyBDcmVhdGUgdGhlIFtKQ2xvc2VkV29ybGRdIGZyb20gW2Nsb3NlZFdvcmxkXS4KICBKQ2xvc2VkV29ybGQgY3JlYXRlSkNsb3NlZFdvcmxkKAogICAgICBLQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsIE91dHB1dFVuaXREYXRhIG91dHB1dFVuaXREYXRhKTsKCiAgLy8vIFJlZ2lzdGVycyBbY2xvc2VkV29ybGRdIGFzIHRoZSBjdXJyZW50IGNsb3NlZCB3b3JsZCB1c2VkIGJ5IHRoaXMgYmFja2VuZAogIC8vLyBzdHJhdGVneS4KICAvLy8KICAvLy8gVGhpcyBpcyB1c2VkIHRvIHN1cHBvcnQgc2VyaWFsaXphdGlvbiBhZnRlciB0eXBlIGluZmVyZW5jZS4KICB2b2lkIHJlZ2lzdGVySkNsb3NlZFdvcmxkKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCk7CgogIC8vLyBDcmVhdGVzIHRoZSBbQ29kZWdlbldvcmxkQnVpbGRlcl0gdXNlZCBieSB0aGUgY29kZWdlbiBlbnF1ZXVlci4KICBDb2RlZ2VuV29ybGRCdWlsZGVyIGNyZWF0ZUNvZGVnZW5Xb3JsZEJ1aWxkZXIoCiAgICAgIE5hdGl2ZUJhc2ljRGF0YSBuYXRpdmVCYXNpY0RhdGEsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwKICAgICAgU2VsZWN0b3JDb25zdHJhaW50c1N0cmF0ZWd5IHNlbGVjdG9yQ29uc3RyYWludHNTdHJhdGVneSk7CgogIC8vLyBDcmVhdGVzIHRoZSBbV29ya0l0ZW1CdWlsZGVyXSB1c2VkIGJ5IHRoZSBjb2RlZ2VuIGVucXVldWVyLgogIFdvcmtJdGVtQnVpbGRlciBjcmVhdGVDb2RlZ2VuV29ya0l0ZW1CdWlsZGVyKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cyk7CgogIC8vLyBDcmVhdGVzIHRoZSBbU3NhQnVpbGRlcl0gdXNlZCBmb3IgdGhlIGVsZW1lbnQgbW9kZWwuCiAgU3NhQnVpbGRlciBjcmVhdGVTc2FCdWlsZGVyKENvbXBpbGVyVGFzayB0YXNrLCBKYXZhU2NyaXB0QmFja2VuZCBiYWNrZW5kLAogICAgICBTb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5IHNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kpOwoKICAvLy8gUmV0dXJucyB0aGUgW1NvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3ldIHVzZSBmb3IgdGhlIGVsZW1lbnQgbW9kZWwuCiAgU291cmNlSW5mb3JtYXRpb25TdHJhdGVneSBnZXQgc291cmNlSW5mb3JtYXRpb25TdHJhdGVneTsKCiAgLy8vIENyZWF0ZXMgYSBbU291cmNlU3Bhbl0gZnJvbSBbc3Bhbm5hYmxlXSBpbiBjb250ZXh0IG9mIFtjdXJyZW50RWxlbWVudF0uCiAgU291cmNlU3BhbiBzcGFuRnJvbVNwYW5uYWJsZShTcGFubmFibGUgc3Bhbm5hYmxlLCBFbnRpdHkgY3VycmVudEVsZW1lbnQpOwoKICAvLy8gQ3JlYXRlcyB0aGUgW1R5cGVzSW5mZXJyZXJdIHVzZWQgYnkgdGhpcyBzdHJhdGVneS4KICBUeXBlc0luZmVycmVyIGNyZWF0ZVR5cGVzSW5mZXJyZXIoCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwgSW5mZXJyZWREYXRhQnVpbGRlciBpbmZlcnJlZERhdGFCdWlsZGVyKTsKfQo8AE5OPAEiARYcMRchHiUoJSYXLiYVAUsZITQjQAFPEAZCNwFGMScgQAFCSToBO0w8AUk7AU5MATklSgIBKnBhY2thZ2U6Y29tcGlsZXIvc3JjL2JhY2tlbmRfc3RyYXRlZ3kuZGFydC9zZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9jb21tb24vbmFtZXMuZGFydKCtLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBMaWJyYXJ5IGNvbnRhaW5pbmcgaWRlbnRpZmllciwgbmFtZXMsIGFuZCBzZWxlY3RvcnMgY29tbW9ubHkgdXNlZCB0aHJvdWdoCi8vLyB0aGUgY29tcGlsZXIuCmxpYnJhcnkgZGFydDJqcy5jb21tb24ubmFtZXM7CgppbXBvcnQgJy4uL2VsZW1lbnRzL25hbWVzLmRhcnQnIHNob3cgTmFtZSwgUHVibGljTmFtZTsKaW1wb3J0ICcuLi91bml2ZXJzZS9jYWxsX3N0cnVjdHVyZS5kYXJ0JyBzaG93IENhbGxTdHJ1Y3R1cmU7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCcgc2hvdyBTZWxlY3RvcjsKCi8vLyBbU3RyaW5nXXMgY29tbW9ubHkgdXNlZC4KY2xhc3MgSWRlbnRpZmllcnMgewogIC8vLyBUaGUgbmFtZSBvZiB0aGUgY2FsbCBvcGVyYXRvci4KICBzdGF0aWMgY29uc3QgU3RyaW5nIGNhbGwgPSAnY2FsbCc7CgogIC8vLyBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBlbGVtZW50IHByb3BlcnR5IHVzZWQgb24gaXRlcmF0b3JzIGluIGZvci1lYWNoCiAgLy8vIGxvb3BzLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgY3VycmVudCA9ICdjdXJyZW50JzsKCiAgLy8vIFRoZSBuYW1lIG9mIHRoZSBmcm9tIGVudmlyb25tZW50IGNvbnN0cnVjdG9ycyBvbiAnaW50JywgJ2Jvb2wnIGFuZAogIC8vLyAnU3RyaW5nJy4KICBzdGF0aWMgY29uc3QgU3RyaW5nIGZyb21FbnZpcm9ubWVudCA9ICdmcm9tRW52aXJvbm1lbnQnOwoKICAvLy8gVGhlIG5hbWUgb2YgdGhlIGl0ZXJhdG9yIHByb3BlcnR5IHVzZWQgaW4gZm9yLWVhY2ggbG9vcHMuCiAgc3RhdGljIGNvbnN0IFN0cmluZyBpdGVyYXRvciA9ICdpdGVyYXRvcic7CgogIC8vLyBUaGUgbmFtZSBvZiB0aGUgYGxvYWRMaWJyYXJ5YCBnZXR0ZXIgZGVmaW5lZCBvbiBkZWZlcnJlZCBwcmVmaXhlcy4KICBzdGF0aWMgY29uc3QgU3RyaW5nIGxvYWRMaWJyYXJ5ID0gJ2xvYWRMaWJyYXJ5JzsKCiAgLy8vIFRoZSBuYW1lIG9mIHRoZSBtYWluIG1ldGhvZC4KICBzdGF0aWMgY29uc3QgU3RyaW5nIG1haW4gPSAnbWFpbic7CgogIC8vLyBUaGUgbmFtZSBvZiB0aGUgbm8gc3VjaCBtZXRob2QgaGFuZGxlciBvbiAnT2JqZWN0Jy4KICBzdGF0aWMgY29uc3QgU3RyaW5nIG5vU3VjaE1ldGhvZF8gPSAnbm9TdWNoTWV0aG9kJzsKCiAgLy8vIFRoZSBuYW1lIG9mIHRoZSBydW50aW1lIHR5cGUgcHJvcGVydHkgb24gJ09iamVjdCcuCiAgc3RhdGljIGNvbnN0IFN0cmluZyBydW50aW1lVHlwZV8gPSAncnVudGltZVR5cGUnOwoKICAvLy8gVGhlIG5hbWUgb2YgdGhlIGdldHRlciByZXR1cm5pbmcgdGhlIHNpemUgb2YgY29udGFpbmVycyBhbmQgc3RyaW5ncy4KICBzdGF0aWMgY29uc3QgU3RyaW5nIGxlbmd0aCA9ICdsZW5ndGgnOwoKICAvLy8gVGhlIG5hbWUgb2YgdGhlIHNpZ25hdHVyZSBmdW5jdGlvbiBpbiBjbG9zdXJlIGNsYXNzZXMuCiAgc3RhdGljIGNvbnN0IFN0cmluZyBzaWduYXR1cmUgPSAnOnNpZ25hdHVyZSc7Cn0KCi8vLyBbTmFtZV1zIGNvbW1vbmx5IHVzZWQuCmNsYXNzIE5hbWVzIHsKICAvLy8gVGhlIG5hbWUgb2YgdGhlIGNhbGwgb3BlcmF0b3IuCiAgc3RhdGljIGNvbnN0IE5hbWUgY2FsbCA9IGNvbnN0IFB1YmxpY05hbWUoSWRlbnRpZmllcnMuY2FsbCk7CgogIC8vLyBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBlbGVtZW50IHByb3BlcnR5IHVzZWQgb24gaXRlcmF0b3JzIGluIGZvci1lYWNoCiAgLy8vIGxvb3BzLgogIHN0YXRpYyBjb25zdCBOYW1lIGN1cnJlbnQgPSBjb25zdCBQdWJsaWNOYW1lKElkZW50aWZpZXJzLmN1cnJlbnQpOwoKICAvLy8gVGhlIG5hbWUgb2YgdGhlIGR5bmFtaWMgdHlwZS4KICBzdGF0aWMgY29uc3QgTmFtZSBkeW5hbWljXyA9IGNvbnN0IFB1YmxpY05hbWUoJ2R5bmFtaWMnKTsKCiAgLy8vIFRoZSBuYW1lIG9mIHRoZSBpdGVyYXRvciBwcm9wZXJ0eSB1c2VkIGluIGZvci1lYWNoIGxvb3BzLgogIHN0YXRpYyBjb25zdCBOYW1lIGl0ZXJhdG9yID0gY29uc3QgUHVibGljTmFtZShJZGVudGlmaWVycy5pdGVyYXRvcik7CgogIC8vLyBUaGUgbmFtZSBvZiB0aGUgbW92ZSBuZXh0IG1ldGhvZCB1c2VkIG9uIGl0ZXJhdG9ycyBpbiBmb3ItZWFjaCBsb29wcy4KICBzdGF0aWMgY29uc3QgTmFtZSBtb3ZlTmV4dCA9IGNvbnN0IFB1YmxpY05hbWUoJ21vdmVOZXh0Jyk7CgogIC8vLyBUaGUgbmFtZSBvZiB0aGUgbm8gc3VjaCBtZXRob2QgaGFuZGxlciBvbiAnT2JqZWN0Jy4KICBzdGF0aWMgY29uc3QgTmFtZSBub1N1Y2hNZXRob2RfID0gY29uc3QgUHVibGljTmFtZShJZGVudGlmaWVycy5ub1N1Y2hNZXRob2RfKTsKCiAgLy8vIFRoZSBuYW1lIG9mIHRoZSB0by1zdHJpbmcgbWV0aG9kIG9uICdPYmplY3QnLgogIHN0YXRpYyBjb25zdCBOYW1lIHRvU3RyaW5nXyA9IGNvbnN0IFB1YmxpY05hbWUoJ3RvU3RyaW5nJyk7CgogIHN0YXRpYyBjb25zdCBOYW1lIElOREVYX05BTUUgPSBjb25zdCBQdWJsaWNOYW1lKCJbXSIpOwogIHN0YXRpYyBjb25zdCBOYW1lIElOREVYX1NFVF9OQU1FID0gY29uc3QgUHVibGljTmFtZSgiW109Iik7CiAgc3RhdGljIGNvbnN0IE5hbWUgQ0FMTF9OQU1FID0gTmFtZXMuY2FsbDsKCiAgc3RhdGljIGNvbnN0IE5hbWUgbGVuZ3RoID0gY29uc3QgUHVibGljTmFtZShJZGVudGlmaWVycy5sZW5ndGgpOwoKICBzdGF0aWMgY29uc3QgTmFtZSBydW50aW1lVHlwZV8gPSBjb25zdCBQdWJsaWNOYW1lKElkZW50aWZpZXJzLnJ1bnRpbWVUeXBlXyk7CgogIHN0YXRpYyBjb25zdCBOYW1lIGdlbmVyaWNJbnN0YW50aWF0aW9uID0gY29uc3QgUHVibGljTmFtZSgnaW5zdGFudGlhdGUnKTsKCiAgLy8vIFRoZSBuYW1lIG9mIHRoZSBzaWduYXR1cmUgZnVuY3Rpb24gaW4gY2xvc3VyZSBjbGFzc2VzLgogIHN0YXRpYyBjb25zdCBOYW1lIHNpZ25hdHVyZSA9IGNvbnN0IFB1YmxpY05hbWUoSWRlbnRpZmllcnMuc2lnbmF0dXJlKTsKfQoKLy8vIFtTZWxlY3Rvcl1zIGNvbW1vbmx5IHVzZWQuCmNsYXNzIFNlbGVjdG9ycyB7CiAgLy8vIFRoZSBzZWxlY3RvciBmb3IgY2FsbGluZyB0aGUgY2FuY2VsIG1ldGhvZCBvbiAnU3RyZWFtSXRlcmF0b3InLgogIHN0YXRpYyBmaW5hbCBTZWxlY3RvciBjYW5jZWwgPQogICAgICBuZXcgU2VsZWN0b3IuY2FsbChjb25zdCBQdWJsaWNOYW1lKCdjYW5jZWwnKSwgQ2FsbFN0cnVjdHVyZS5OT19BUkdTKTsKCiAgLy8vIFRoZSBzZWxlY3RvciBmb3IgZ2V0dGluZyB0aGUgY3VycmVudCBlbGVtZW50IHByb3BlcnR5IHVzZWQgaW4gZm9yLWVhY2gKICAvLy8gbG9vcHMuCiAgc3RhdGljIGZpbmFsIFNlbGVjdG9yIGN1cnJlbnQgPSBuZXcgU2VsZWN0b3IuZ2V0dGVyKE5hbWVzLmN1cnJlbnQpOwoKICAvLy8gVGhlIHNlbGVjdG9yIGZvciBnZXR0aW5nIHRoZSBpdGVyYXRvciBwcm9wZXJ0eSB1c2VkIGluIGZvci1lYWNoIGxvb3BzLgogIHN0YXRpYyBmaW5hbCBTZWxlY3RvciBpdGVyYXRvciA9IG5ldyBTZWxlY3Rvci5nZXR0ZXIoTmFtZXMuaXRlcmF0b3IpOwoKICAvLy8gVGhlIHNlbGVjdG9yIGZvciBjYWxsaW5nIHRoZSBtb3ZlIG5leHQgbWV0aG9kIHVzZWQgaW4gZm9yLWVhY2ggbG9vcHMuCiAgc3RhdGljIGZpbmFsIFNlbGVjdG9yIG1vdmVOZXh0ID0KICAgICAgbmV3IFNlbGVjdG9yLmNhbGwoTmFtZXMubW92ZU5leHQsIENhbGxTdHJ1Y3R1cmUuTk9fQVJHUyk7CgogIC8vLyBUaGUgc2VsZWN0b3IgZm9yIGNhbGxpbmcgdGhlIG5vIHN1Y2ggbWV0aG9kIGhhbmRsZXIgb24gJ09iamVjdCcuCiAgc3RhdGljIGZpbmFsIFNlbGVjdG9yIG5vU3VjaE1ldGhvZF8gPQogICAgICBuZXcgU2VsZWN0b3IuY2FsbChOYW1lcy5ub1N1Y2hNZXRob2RfLCBDYWxsU3RydWN0dXJlLk9ORV9BUkcpOwoKICAvLy8gVGhlIHNlbGVjdG9yIGZvciB0ZWFyaW5nIG9mZiBub1N1Y2hNZXRob2QuCiAgc3RhdGljIGZpbmFsIFNlbGVjdG9yIG5vU3VjaE1ldGhvZEdldHRlciA9CiAgICAgIG5ldyBTZWxlY3Rvci5nZXR0ZXIoTmFtZXMubm9TdWNoTWV0aG9kXyk7CgogIC8vLyBUaGUgc2VsZWN0b3IgZm9yIGNhbGxpbmcgdGhlIHRvLXN0cmluZyBtZXRob2Qgb24gJ09iamVjdCcuCiAgc3RhdGljIGZpbmFsIFNlbGVjdG9yIHRvU3RyaW5nXyA9CiAgICAgIG5ldyBTZWxlY3Rvci5jYWxsKE5hbWVzLnRvU3RyaW5nXywgQ2FsbFN0cnVjdHVyZS5OT19BUkdTKTsKCiAgLy8vIFRoZSBzZWxlY3RvciBmb3IgdGVhcmluZyBvZmYgdG9TdHJpbmcuCiAgc3RhdGljIGZpbmFsIFNlbGVjdG9yIHRvU3RyaW5nR2V0dGVyID0gbmV3IFNlbGVjdG9yLmdldHRlcihOYW1lcy50b1N0cmluZ18pOwoKICBzdGF0aWMgZmluYWwgU2VsZWN0b3IgaGFzaENvZGVfID0KICAgICAgbmV3IFNlbGVjdG9yLmdldHRlcihjb25zdCBQdWJsaWNOYW1lKCdoYXNoQ29kZScpKTsKCiAgc3RhdGljIGZpbmFsIFNlbGVjdG9yIGNvbXBhcmVUbyA9CiAgICAgIG5ldyBTZWxlY3Rvci5jYWxsKGNvbnN0IFB1YmxpY05hbWUoImNvbXBhcmVUbyIpLCBDYWxsU3RydWN0dXJlLk9ORV9BUkcpOwoKICBzdGF0aWMgZmluYWwgU2VsZWN0b3IgZXF1YWxzID0gbmV3IFNlbGVjdG9yLmJpbmFyeU9wZXJhdG9yKCc9PScpOwoKICBzdGF0aWMgZmluYWwgU2VsZWN0b3IgbGVuZ3RoID0gbmV3IFNlbGVjdG9yLmdldHRlcihOYW1lcy5sZW5ndGgpOwoKICBzdGF0aWMgZmluYWwgU2VsZWN0b3IgY29kZVVuaXRBdCA9CiAgICAgIG5ldyBTZWxlY3Rvci5jYWxsKGNvbnN0IFB1YmxpY05hbWUoJ2NvZGVVbml0QXQnKSwgQ2FsbFN0cnVjdHVyZS5PTkVfQVJHKTsKCiAgc3RhdGljIGZpbmFsIFNlbGVjdG9yIGluZGV4ID0gbmV3IFNlbGVjdG9yLmluZGV4KCk7CgogIHN0YXRpYyBmaW5hbCBTZWxlY3RvciBydW50aW1lVHlwZV8gPSBuZXcgU2VsZWN0b3IuZ2V0dGVyKE5hbWVzLnJ1bnRpbWVUeXBlXyk7CgogIC8vLyBMaXN0IG9mIGFsbCB0aGUgc2VsZWN0b3JzIGhlbGQgaW4gc3RhdGljIGZpZWxkcy4KICAvLy8KICAvLy8gVGhlc2Ugb2JqZWN0cyBhcmUgc2hhcmVkIGJldHdlZW4gZGlmZmVyZW50IHJ1bnMgaW4gYmF0Y2gtbW9kZSBhbmQgbXVzdAogIC8vLyB0aHVzIHJlbWFpbiBpbiB0aGUgW1NlbGVjdG9yLmNhbm9uaWNhbGl6ZWRWYWx1ZXNdIG1hcC4KICBzdGF0aWMgZmluYWwgTGlzdDxTZWxlY3Rvcj4gQUxMID0gPFNlbGVjdG9yPlsKICAgIGNhbmNlbCwKICAgIGN1cnJlbnQsCiAgICBpdGVyYXRvciwKICAgIG1vdmVOZXh0LAogICAgbm9TdWNoTWV0aG9kXywKICAgIG5vU3VjaE1ldGhvZEdldHRlciwKICAgIHRvU3RyaW5nXywKICAgIHRvU3RyaW5nR2V0dGVyLAogICAgaGFzaENvZGVfLAogICAgY29tcGFyZVRvLAogICAgZXF1YWxzLAogICAgbGVuZ3RoLAogICAgY29kZVVuaXRBdCwKICAgIGluZGV4LAogICAgcnVudGltZVR5cGVfCiAgXTsKfQoKLy8vIFtVcmldcyBjb21tb25seSB1c2VkLgpjbGFzcyBVcmlzIHsKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6YXN5bmMnLgogIHN0YXRpYyBmaW5hbCBVcmkgZGFydF9hc3luYyA9IG5ldyBVcmkoc2NoZW1lOiAnZGFydCcsIHBhdGg6ICdhc3luYycpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6Y29sbGVjdGlvbicuCiAgc3RhdGljIGZpbmFsIFVyaSBkYXJ0X2NvbGxlY3Rpb24gPQogICAgICBuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiAnY29sbGVjdGlvbicpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6Y29yZScuCiAgc3RhdGljIGZpbmFsIFVyaSBkYXJ0X2NvcmUgPSBuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiAnY29yZScpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6aHRtbCcuCiAgc3RhdGljIGZpbmFsIFVyaSBkYXJ0X2h0bWwgPSBuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiAnaHRtbCcpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6aHRtbF9jb21tb24nLgogIHN0YXRpYyBmaW5hbCBVcmkgZGFydF9odG1sX2NvbW1vbiA9CiAgICAgIG5ldyBVcmkoc2NoZW1lOiAnZGFydCcsIHBhdGg6ICdodG1sX2NvbW1vbicpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6aW5kZXhlZF9kYicuCiAgc3RhdGljIGZpbmFsIFVyaSBkYXJ0X2luZGV4ZWRfZGIgPQogICAgICBuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiAnaW5kZXhlZF9kYicpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6aXNvbGF0ZScuCiAgc3RhdGljIGZpbmFsIFVyaSBkYXJ0X2lzb2xhdGUgPSBuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiAnaXNvbGF0ZScpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6bWF0aCcuCiAgc3RhdGljIGZpbmFsIFVyaSBkYXJ0X21hdGggPSBuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiAnbWF0aCcpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6bWlycm9ycycuCiAgc3RhdGljIGZpbmFsIFVyaSBkYXJ0X21pcnJvcnMgPSBuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiAnbWlycm9ycycpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6X2ludGVybmFsJy4KICBzdGF0aWMgZmluYWwgVXJpIGRhcnRfX2ludGVybmFsID0gbmV3IFVyaShzY2hlbWU6ICdkYXJ0JywgcGF0aDogJ19pbnRlcm5hbCcpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6X25hdGl2ZV90eXBlZF9kYXRhJy4KICBzdGF0aWMgZmluYWwgVXJpIGRhcnRfX25hdGl2ZV90eXBlZF9kYXRhID0KICAgICAgbmV3IFVyaShzY2hlbWU6ICdkYXJ0JywgcGF0aDogJ19uYXRpdmVfdHlwZWRfZGF0YScpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6dHlwZWRfZGF0YScuCiAgc3RhdGljIGZpbmFsIFVyaSBkYXJ0X3R5cGVkX2RhdGEgPQogICAgICBuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiAndHlwZWRfZGF0YScpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6c3ZnJy4KICBzdGF0aWMgZmluYWwgVXJpIGRhcnRfc3ZnID0gbmV3IFVyaShzY2hlbWU6ICdkYXJ0JywgcGF0aDogJ3N2ZycpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6d2ViX2F1ZGlvJy4KICBzdGF0aWMgZmluYWwgVXJpIGRhcnRfd2ViX2F1ZGlvID0gbmV3IFVyaShzY2hlbWU6ICdkYXJ0JywgcGF0aDogJ3dlYl9hdWRpbycpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6d2ViX2dsJy4KICBzdGF0aWMgZmluYWwgVXJpIGRhcnRfd2ViX2dsID0gbmV3IFVyaShzY2hlbWU6ICdkYXJ0JywgcGF0aDogJ3dlYl9nbCcpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6d2ViX3NxbCcuCiAgc3RhdGljIGZpbmFsIFVyaSBkYXJ0X3dlYl9zcWwgPSBuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiAnd2ViX3NxbCcpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6X2pzX2hlbHBlcicuCiAgc3RhdGljIGZpbmFsIFVyaSBkYXJ0X19qc19oZWxwZXIgPQogICAgICBuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiAnX2pzX2hlbHBlcicpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6X2ludGVyY2VwdG9ycycuCiAgc3RhdGljIGZpbmFsIFVyaSBkYXJ0X19pbnRlcmNlcHRvcnMgPQogICAgICBuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiAnX2ludGVyY2VwdG9ycycpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6X2ZvcmVpZ25faGVscGVyJy4KICBzdGF0aWMgZmluYWwgVXJpIGRhcnRfX2ZvcmVpZ25faGVscGVyID0KICAgICAgbmV3IFVyaShzY2hlbWU6ICdkYXJ0JywgcGF0aDogJ19mb3JlaWduX2hlbHBlcicpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6X2pzX25hbWVzJy4KICBzdGF0aWMgZmluYWwgVXJpIGRhcnRfX2pzX25hbWVzID0gbmV3IFVyaShzY2hlbWU6ICdkYXJ0JywgcGF0aDogJ19qc19uYW1lcycpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6X2pzX2VtYmVkZGVkX25hbWVzJy4KICBzdGF0aWMgZmluYWwgVXJpIGRhcnRfX2pzX2VtYmVkZGVkX25hbWVzID0KICAgICAgbmV3IFVyaShzY2hlbWU6ICdkYXJ0JywgcGF0aDogJ19qc19lbWJlZGRlZF9uYW1lcycpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ3BhY2thZ2U6anMnLgogIHN0YXRpYyBmaW5hbCBVcmkgcGFja2FnZV9qcyA9IG5ldyBVcmkoc2NoZW1lOiAncGFja2FnZScsIHBhdGg6ICdqcy9qcy5kYXJ0Jyk7CgogIC8vLyBUaGUgVVJJIGZvciAncGFja2FnZTptZXRhL2RhcnQyanMuZGFydCcuCiAgc3RhdGljIGZpbmFsIFVyaSBwYWNrYWdlX21ldGFfZGFydDJqcyA9CiAgICAgIG5ldyBVcmkoc2NoZW1lOiAncGFja2FnZScsIHBhdGg6ICdtZXRhL2RhcnQyanMuZGFydCcpOwp9CoDwAE5OPAFOEh4BNz0yAR0UJSUBTQ0rAUkQOwFALQFJMwEjJQE6NgE5NAFLKQE9MAIBGw4lPwFNDUUBJDwBQEcBTD0BOlEBND4BOT4sAUMBTwFMAT1JAgEfEkYhTAFNDUYBTUgBTCNAAUcoRQExLTABQSRBAS1PASQ5ASRPAUQBRAElUAE2AVABNwZNPTAMDQ4OExgPFA8PDAwQCxEFAgEaDSBIASUlMwEfRgEfRgEmJjQBJSUzASJMAR9GASJMASRQAS0tOwElJTMBHkQBJFABIUoBIkwBJSUzASgoNgEqKjgBJFABLS07ASBQAS8qPQIBJnBhY2thZ2U6Y29tcGlsZXIvc3JjL2NvbW1vbi9uYW1lcy5kYXJ0LnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2NvbW1vbi93b3JrLmRhcnSB4y8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuY29tbW9uLndvcms7CgppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnIHNob3cgTWVtYmVyRW50aXR5OwppbXBvcnQgJy4uL3VuaXZlcnNlL3dvcmxkX2ltcGFjdC5kYXJ0JyBzaG93IFdvcmxkSW1wYWN0OwoKYWJzdHJhY3QgY2xhc3MgV29ya0l0ZW0gewogIC8vLyBFbGVtZW50IG9uIHdoaWNoIHRoZSB3b3JrIHdpbGwgYmUgZG9uZS4KICBNZW1iZXJFbnRpdHkgZ2V0IGVsZW1lbnQ7CgogIFdvcmxkSW1wYWN0IHJ1bigpOwp9ChEATk48AR0BNjkBGi4cARUCASVwYWNrYWdlOmNvbXBpbGVyL3NyYy9jb21tb24vd29yay5kYXJ0OXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2NvbXBpbGVfdGltZV9jb25zdGFudHMuZGFydIQ0Ly8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5jb21waWxlX3RpbWVfY29uc3RhbnRfZXZhbHVhdG9yOwoKaW1wb3J0ICdjb21tb24vdGFza3MuZGFydCcgc2hvdyBDb21waWxlclRhc2ssIE1lYXN1cmVyOwppbXBvcnQgJ2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwoKLy8vIEEgW0NvbnN0YW50RW52aXJvbm1lbnRdIHByb3ZpZGVzIGFjY2VzcyBmb3IgY29uc3RhbnRzIGNvbXBpbGVkIGZvciB2YXJpYWJsZQovLy8gaW5pdGlhbGl6ZXJzLgphYnN0cmFjdCBjbGFzcyBDb25zdGFudEVudmlyb25tZW50IHt9CgovLy8gQSBbQmFja2VuZENvbnN0YW50RW52aXJvbm1lbnRdIHByb3ZpZGVzIGFjY2VzcyB0byBjb25zdGFudHMgbmVlZGVkIGZvcgovLy8gYmFja2VuZCBpbXBsZW1lbnRhdGlvbi4KYWJzdHJhY3QgY2xhc3MgQmFja2VuZENvbnN0YW50RW52aXJvbm1lbnQgZXh0ZW5kcyBDb25zdGFudEVudmlyb25tZW50IHsKICAvLy8gUmVnaXN0ZXIgdGhhdCBbZWxlbWVudF0gbmVlZHMgbGF6eSBpbml0aWFsaXphdGlvbi4KICB2b2lkIHJlZ2lzdGVyTGF6eVN0YXRpYyhGaWVsZEVudGl0eSBlbGVtZW50KTsKfQoKLy8vIEludGVyZmFjZSBmb3IgdGhlIHRhc2sgdGhhdCBjb21waWxlcyB0aGUgY29uc3RhbnQgZW52aXJvbm1lbnRzIGZvciB0aGUKLy8vIGZyb250ZW5kIGFuZCBiYWNrZW5kIGludGVycHJldGF0aW9uIG9mIGNvbXBpbGUtdGltZSBjb25zdGFudHMuCmFic3RyYWN0IGNsYXNzIENvbnN0YW50Q29tcGlsZXJUYXNrIGV4dGVuZHMgQ29tcGlsZXJUYXNrCiAgICBpbXBsZW1lbnRzIENvbnN0YW50RW52aXJvbm1lbnQgewogIENvbnN0YW50Q29tcGlsZXJUYXNrKE1lYXN1cmVyIG1lYXN1cmVyKSA6IHN1cGVyKG1lYXN1cmVyKTsKfQocAE5OPAExATghAVASJgFLHEg5MAIBS0M5JT0CATBwYWNrYWdlOmNvbXBpbGVyL3NyYy9jb21waWxlX3RpbWVfY29uc3RhbnRzLmRhcnQyc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvY29tbW9uX2VsZW1lbnRzLmRhcnTAAQYYLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIFRPRE8oc2lnbXVuZCk6IHJlbmFtZSBhbmQgbW92ZSB0byBjb21tb24vZWxlbWVudHMuZGFydApsaWJyYXJ5IGRhcnQyanMudHlwZV9zeXN0ZW07CgppbXBvcnQgJ2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICdjb21tb24vbmFtZXMuZGFydCcgc2hvdyBJZGVudGlmaWVycywgVXJpczsKaW1wb3J0ICdjb25zdGFudHMvY29uc3RhbnRfc3lzdGVtLmRhcnQnIGFzIGNvbnN0YW50X3N5c3RlbTsKaW1wb3J0ICdjb25zdGFudHMvZXhwcmVzc2lvbnMuZGFydCcgc2hvdyBDb25zdGFudEV4cHJlc3Npb247CmltcG9ydCAnY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICdlbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICdlbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICdpbmZlcnJlci9hYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydCc7CmltcG9ydCAnanNfYmFja2VuZC9uYXRpdmVfZGF0YS5kYXJ0JyBzaG93IE5hdGl2ZUJhc2ljRGF0YTsKaW1wb3J0ICdrZXJuZWwvZGFydDJqc190YXJnZXQuZGFydCc7CmltcG9ydCAndW5pdmVyc2Uvc2VsZWN0b3IuZGFydCcgc2hvdyBTZWxlY3RvcjsKCi8vLyBUaGUgY29tbW9uIGVsZW1lbnRzIGFuZCB0eXBlcyBpbiBEYXJ0LgphYnN0cmFjdCBjbGFzcyBDb21tb25FbGVtZW50cyB7CiAgLy8vIFRoZSBgT2JqZWN0YCBjbGFzcyBkZWZpbmVkIGluICdkYXJ0OmNvcmUnLgogIENsYXNzRW50aXR5IGdldCBvYmplY3RDbGFzczsKCiAgLy8vIFRoZSBgYm9vbGAgY2xhc3MgZGVmaW5lZCBpbiAnZGFydDpjb3JlJy4KICBDbGFzc0VudGl0eSBnZXQgYm9vbENsYXNzOwoKICAvLy8gVGhlIGBudW1gIGNsYXNzIGRlZmluZWQgaW4gJ2RhcnQ6Y29yZScuCiAgQ2xhc3NFbnRpdHkgZ2V0IG51bUNsYXNzOwoKICAvLy8gVGhlIGBpbnRgIGNsYXNzIGRlZmluZWQgaW4gJ2RhcnQ6Y29yZScuCiAgQ2xhc3NFbnRpdHkgZ2V0IGludENsYXNzOwoKICAvLy8gVGhlIGBkb3VibGVgIGNsYXNzIGRlZmluZWQgaW4gJ2RhcnQ6Y29yZScuCiAgQ2xhc3NFbnRpdHkgZ2V0IGRvdWJsZUNsYXNzOwoKICAvLy8gVGhlIGBTdHJpbmdgIGNsYXNzIGRlZmluZWQgaW4gJ2RhcnQ6Y29yZScuCiAgQ2xhc3NFbnRpdHkgZ2V0IHN0cmluZ0NsYXNzOwoKICAvLy8gVGhlIGBGdW5jdGlvbmAgY2xhc3MgZGVmaW5lZCBpbiAnZGFydDpjb3JlJy4KICBDbGFzc0VudGl0eSBnZXQgZnVuY3Rpb25DbGFzczsKCiAgLy8vIFRoZSBgUmVzb3VyY2VgIGNsYXNzIGRlZmluZWQgaW4gJ2RhcnQ6Y29yZScuCiAgQ2xhc3NFbnRpdHkgZ2V0IHJlc291cmNlQ2xhc3M7CgogIC8vLyBUaGUgYFN5bWJvbGAgY2xhc3MgZGVmaW5lZCBpbiAnZGFydDpjb3JlJy4KICBDbGFzc0VudGl0eSBnZXQgc3ltYm9sQ2xhc3M7CgogIC8vLyBUaGUgYE51bGxgIGNsYXNzIGRlZmluZWQgaW4gJ2RhcnQ6Y29yZScuCiAgQ2xhc3NFbnRpdHkgZ2V0IG51bGxDbGFzczsKCiAgLy8vIFRoZSBgVHlwZWAgY2xhc3MgZGVmaW5lZCBpbiAnZGFydDpjb3JlJy4KICBDbGFzc0VudGl0eSBnZXQgdHlwZUNsYXNzOwoKICAvLy8gVGhlIGBTdGFja1RyYWNlYCBjbGFzcyBkZWZpbmVkIGluICdkYXJ0OmNvcmUnOwogIENsYXNzRW50aXR5IGdldCBzdGFja1RyYWNlQ2xhc3M7CgogIC8vLyBUaGUgYExpc3RgIGNsYXNzIGRlZmluZWQgaW4gJ2RhcnQ6Y29yZSc7CiAgQ2xhc3NFbnRpdHkgZ2V0IGxpc3RDbGFzczsKCiAgLy8vIFRoZSBgU2V0YCBjbGFzcyBkZWZpbmVkIGluICdkYXJ0OmNvcmUnOwogIENsYXNzRW50aXR5IGdldCBzZXRDbGFzczsKCiAgLy8vIFRoZSBgTWFwYCBjbGFzcyBkZWZpbmVkIGluICdkYXJ0OmNvcmUnOwogIENsYXNzRW50aXR5IGdldCBtYXBDbGFzczsKCiAgLy8vIFRoZSBgU2V0YCBjbGFzcyBkZWZpbmVkIGluICdkYXJ0OmNvcmUnOwogIENsYXNzRW50aXR5IGdldCB1bm1vZGlmaWFibGVTZXRDbGFzczsKCiAgLy8vIFRoZSBgSXRlcmFibGVgIGNsYXNzIGRlZmluZWQgaW4gJ2RhcnQ6Y29yZSc7CiAgQ2xhc3NFbnRpdHkgZ2V0IGl0ZXJhYmxlQ2xhc3M7CgogIC8vLyBUaGUgYEZ1dHVyZWAgY2xhc3MgZGVmaW5lZCBpbiAnYXN5bmMnOy4KICBDbGFzc0VudGl0eSBnZXQgZnV0dXJlQ2xhc3M7CgogIC8vLyBUaGUgYFN0cmVhbWAgY2xhc3MgZGVmaW5lZCBpbiAnYXN5bmMnOwogIENsYXNzRW50aXR5IGdldCBzdHJlYW1DbGFzczsKCiAgLy8vIFRoZSBkYXJ0OmNvcmUgbGlicmFyeS4KICBMaWJyYXJ5RW50aXR5IGdldCBjb3JlTGlicmFyeTsKCiAgLy8vIFRoZSBkYXJ0OmFzeW5jIGxpYnJhcnkuCiAgTGlicmFyeUVudGl0eSBnZXQgYXN5bmNMaWJyYXJ5OwoKICAvLy8gVGhlIGRhcnQ6bWlycm9ycyBsaWJyYXJ5LgogIExpYnJhcnlFbnRpdHkgZ2V0IG1pcnJvcnNMaWJyYXJ5OwoKICAvLy8gVGhlIGRhcnQ6dHlwZWRfZGF0YSBsaWJyYXJ5LgogIExpYnJhcnlFbnRpdHkgZ2V0IHR5cGVkRGF0YUxpYnJhcnk7CgogIC8vLyBUaGUgZGFydDpfanNfaGVscGVyIGxpYnJhcnkuCiAgTGlicmFyeUVudGl0eSBnZXQganNIZWxwZXJMaWJyYXJ5OwoKICAvLy8gVGhlIGRhcnQ6X2ludGVyY2VwdG9ycyBsaWJyYXJ5LgogIExpYnJhcnlFbnRpdHkgZ2V0IGludGVyY2VwdG9yc0xpYnJhcnk7CgogIC8vLyBUaGUgZGFydDpfZm9yZWlnbl9oZWxwZXIgbGlicmFyeS4KICBMaWJyYXJ5RW50aXR5IGdldCBmb3JlaWduTGlicmFyeTsKCiAgLy8vIFRoZSBkYXJ0Ol9pbnRlcm5hbCBsaWJyYXJ5LgogIExpYnJhcnlFbnRpdHkgZ2V0IGludGVybmFsTGlicmFyeTsKCiAgLy8vIFRoZSBgTmF0aXZlVHlwZWREYXRhYCBjbGFzcyBmcm9tIGRhcnQ6dHlwZWRfZGF0YS4KICBDbGFzc0VudGl0eSBnZXQgdHlwZWREYXRhQ2xhc3M7CgogIC8vLyBDb25zdHJ1Y3RvciBvZiB0aGUgYFN5bWJvbGAgY2xhc3MgaW4gZGFydDppbnRlcm5hbC4KICAvLy8KICAvLy8gVGhpcyBnZXR0ZXIgd2lsbCBlbnN1cmUgdGhhdCBgU3ltYm9sYCBpcyByZXNvbHZlZCBhbmQgbG9va3VwIHRoZQogIC8vLyBjb25zdHJ1Y3RvciBvbiBkZW1hbmQuCiAgQ29uc3RydWN0b3JFbnRpdHkgZ2V0IHN5bWJvbENvbnN0cnVjdG9yVGFyZ2V0OwoKICAvLy8gV2hldGhlciBbZWxlbWVudF0gaXMgdGhlIHNhbWUgYXMgW3N5bWJvbENvbnN0cnVjdG9yXS4KICAvLy8KICAvLy8gVXNlZCB0byBjaGVjayBmb3IgdGhlIGNvbnN0cnVjdG9yIHdpdGhvdXQgY29tcHV0aW5nIGl0IHVudGlsIGl0IGlzIGxpa2VseQogIC8vLyB0byBiZSBzZWVuLgogIGJvb2wgaXNTeW1ib2xDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvckVudGl0eSBlbGVtZW50KTsKCiAgLy8vIFRoZSBmdW5jdGlvbiBgaWRlbnRpY2FsYCBpbiBkYXJ0OmNvcmUuCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGlkZW50aWNhbEZ1bmN0aW9uOwoKICAvLy8gV2hldGhlciBbZWxlbWVudF0gaXMgdGhlIGBGdW5jdGlvbi5hcHBseWAgbWV0aG9kLgogIC8vLwogIC8vLyBUaGlzIHdpbGwgbm90IHJlc29sdmUgdGhlIGFwcGx5IG1ldGhvZCBpZiBpdCBoYXNuJ3QgYmVlbiBzZWVuIHlldCBkdXJpbmcKICAvLy8gY29tcGlsYXRpb24uCiAgYm9vbCBpc0Z1bmN0aW9uQXBwbHlNZXRob2QoTWVtYmVyRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gVGhlIGBkeW5hbWljYCB0eXBlLgogIER5bmFtaWNUeXBlIGdldCBkeW5hbWljVHlwZTsKCiAgLy8vIFRoZSBgT2JqZWN0YCB0eXBlIGRlZmluZWQgaW4gJ2RhcnQ6Y29yZScuCiAgSW50ZXJmYWNlVHlwZSBnZXQgb2JqZWN0VHlwZTsKCiAgLy8vIFRoZSBgYm9vbGAgdHlwZSBkZWZpbmVkIGluICdkYXJ0OmNvcmUnLgogIEludGVyZmFjZVR5cGUgZ2V0IGJvb2xUeXBlOwoKICAvLy8gVGhlIGBudW1gIHR5cGUgZGVmaW5lZCBpbiAnZGFydDpjb3JlJy4KICBJbnRlcmZhY2VUeXBlIGdldCBudW1UeXBlOwoKICAvLy8gVGhlIGBpbnRgIHR5cGUgZGVmaW5lZCBpbiAnZGFydDpjb3JlJy4KICBJbnRlcmZhY2VUeXBlIGdldCBpbnRUeXBlOwoKICAvLy8gVGhlIGBkb3VibGVgIHR5cGUgZGVmaW5lZCBpbiAnZGFydDpjb3JlJy4KICBJbnRlcmZhY2VUeXBlIGdldCBkb3VibGVUeXBlOwoKICAvLy8gVGhlIGBTdHJpbmdgIHR5cGUgZGVmaW5lZCBpbiAnZGFydDpjb3JlJy4KICBJbnRlcmZhY2VUeXBlIGdldCBzdHJpbmdUeXBlOwoKICAvLy8gVGhlIGBTeW1ib2xgIHR5cGUgZGVmaW5lZCBpbiAnZGFydDpjb3JlJy4KICBJbnRlcmZhY2VUeXBlIGdldCBzeW1ib2xUeXBlOwoKICAvLy8gVGhlIGBGdW5jdGlvbmAgdHlwZSBkZWZpbmVkIGluICdkYXJ0OmNvcmUnLgogIEludGVyZmFjZVR5cGUgZ2V0IGZ1bmN0aW9uVHlwZTsKCiAgLy8vIFRoZSBgTnVsbGAgdHlwZSBkZWZpbmVkIGluICdkYXJ0OmNvcmUnLgogIEludGVyZmFjZVR5cGUgZ2V0IG51bGxUeXBlOwoKICAvLy8gVGhlIGBUeXBlYCB0eXBlIGRlZmluZWQgaW4gJ2RhcnQ6Y29yZScuCiAgSW50ZXJmYWNlVHlwZSBnZXQgdHlwZVR5cGU7CgogIEludGVyZmFjZVR5cGUgZ2V0IHR5cGVMaXRlcmFsVHlwZTsKCiAgLy8vIFRoZSBgU3RhY2tUcmFjZWAgdHlwZSBkZWZpbmVkIGluICdkYXJ0OmNvcmUnOwogIEludGVyZmFjZVR5cGUgZ2V0IHN0YWNrVHJhY2VUeXBlOwoKICAvLy8gUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgYExpc3RgIHR5cGUgZGVmaW5lZCBpbiAnZGFydDpjb3JlJyB3aXRoCiAgLy8vIFtlbGVtZW50VHlwZV0gYXMgaXRzIHR5cGUgYXJndW1lbnQuCiAgLy8vCiAgLy8vIElmIG5vIHR5cGUgYXJndW1lbnQgaXMgcHJvdmlkZWQsIHRoZSBjYW5vbmljYWwgcmF3IHR5cGUgaXMgcmV0dXJuZWQuCiAgSW50ZXJmYWNlVHlwZSBsaXN0VHlwZShbRGFydFR5cGUgZWxlbWVudFR5cGVdKTsKCiAgLy8vIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIGBTZXRgIHR5cGUgZGVmaW5lZCBpbiAnZGFydDpjb3JlJyB3aXRoCiAgLy8vIFtlbGVtZW50VHlwZV0gYXMgaXRzIHR5cGUgYXJndW1lbnQuCiAgLy8vCiAgLy8vIElmIG5vIHR5cGUgYXJndW1lbnQgaXMgcHJvdmlkZWQsIHRoZSBjYW5vbmljYWwgcmF3IHR5cGUgaXMgcmV0dXJuZWQuCiAgSW50ZXJmYWNlVHlwZSBzZXRUeXBlKFtEYXJ0VHlwZSBlbGVtZW50VHlwZV0pOwoKICAvLy8gUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgYE1hcGAgdHlwZSBkZWZpbmVkIGluICdkYXJ0OmNvcmUnIHdpdGgKICAvLy8gW2tleVR5cGVdIGFuZCBbdmFsdWVUeXBlXSBhcyBpdHMgdHlwZSBhcmd1bWVudHMuCiAgLy8vCiAgLy8vIElmIG5vIHR5cGUgYXJndW1lbnRzIGFyZSBwcm92aWRlZCwgdGhlIGNhbm9uaWNhbCByYXcgdHlwZSBpcyByZXR1cm5lZC4KICBJbnRlcmZhY2VUeXBlIG1hcFR5cGUoW0RhcnRUeXBlIGtleVR5cGUsIERhcnRUeXBlIHZhbHVlVHlwZV0pOwoKICAvLy8gUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgYEl0ZXJhYmxlYCB0eXBlIGRlZmluZWQgaW4gJ2RhcnQ6Y29yZScgd2l0aAogIC8vLyBbZWxlbWVudFR5cGVdIGFzIGl0cyB0eXBlIGFyZ3VtZW50LgogIC8vLwogIC8vLyBJZiBubyB0eXBlIGFyZ3VtZW50IGlzIHByb3ZpZGVkLCB0aGUgY2Fub25pY2FsIHJhdyB0eXBlIGlzIHJldHVybmVkLgogIEludGVyZmFjZVR5cGUgaXRlcmFibGVUeXBlKFtEYXJ0VHlwZSBlbGVtZW50VHlwZV0pOwoKICAvLy8gUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgYEZ1dHVyZWAgdHlwZSBkZWZpbmVkIGluICdkYXJ0OmFzeW5jJyB3aXRoCiAgLy8vIFtlbGVtZW50VHlwZV0gYXMgaXRzIHR5cGUgYXJndW1lbnQuCiAgLy8vCiAgLy8vIElmIG5vIHR5cGUgYXJndW1lbnQgaXMgcHJvdmlkZWQsIHRoZSBjYW5vbmljYWwgcmF3IHR5cGUgaXMgcmV0dXJuZWQuCiAgSW50ZXJmYWNlVHlwZSBmdXR1cmVUeXBlKFtEYXJ0VHlwZSBlbGVtZW50VHlwZV0pOwoKICAvLy8gUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgYFN0cmVhbWAgdHlwZSBkZWZpbmVkIGluICdkYXJ0OmFzeW5jJyB3aXRoCiAgLy8vIFtlbGVtZW50VHlwZV0gYXMgaXRzIHR5cGUgYXJndW1lbnQuCiAgLy8vCiAgLy8vIElmIG5vIHR5cGUgYXJndW1lbnQgaXMgcHJvdmlkZWQsIHRoZSBjYW5vbmljYWwgcmF3IHR5cGUgaXMgcmV0dXJuZWQuCiAgSW50ZXJmYWNlVHlwZSBzdHJlYW1UeXBlKFtEYXJ0VHlwZSBlbGVtZW50VHlwZV0pOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2VsZW1lbnRdIGlzIGEgc3VwZXJjbGFzcyBvZiBgU3RyaW5nYCBvciBgbnVtYC4KICBib29sIGlzTnVtYmVyT3JTdHJpbmdTdXBlcnR5cGUoQ2xhc3NFbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbZWxlbWVudF0gaXMgYSBzdXBlcmNsYXNzIG9mIGBTdHJpbmdgLgogIGJvb2wgaXNTdHJpbmdPbmx5U3VwZXJ0eXBlKENsYXNzRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2VsZW1lbnRdIGlzIGEgc3VwZXJjbGFzcyBvZiBgTGlzdGAuCiAgYm9vbCBpc0xpc3RTdXBlcnR5cGUoQ2xhc3NFbnRpdHkgZWxlbWVudCk7CgogIEludGVyZmFjZVR5cGUgZ2V0Q29uc3RhbnRNYXBUeXBlRm9yKEludGVyZmFjZVR5cGUgc291cmNlVHlwZSwKICAgICAge2Jvb2wgaGFzUHJvdG9LZXk6IGZhbHNlLCBib29sIG9ubHlTdHJpbmdLZXlzOiBmYWxzZX0pOwoKICBJbnRlcmZhY2VUeXBlIGdldENvbnN0YW50U2V0VHlwZUZvcihJbnRlcmZhY2VUeXBlIHNvdXJjZVR5cGUpOwoKICBGaWVsZEVudGl0eSBnZXQgc3ltYm9sRmllbGQ7CgogIEludGVyZmFjZVR5cGUgZ2V0IHN5bWJvbEltcGxlbWVudGF0aW9uVHlwZTsKCiAgLy8gRnJvbSBkYXJ0OmNvcmUKICBDbGFzc0VudGl0eSBnZXQgbWFwTGl0ZXJhbENsYXNzOwogIENvbnN0cnVjdG9yRW50aXR5IGdldCBtYXBMaXRlcmFsQ29uc3RydWN0b3I7CiAgQ29uc3RydWN0b3JFbnRpdHkgZ2V0IG1hcExpdGVyYWxDb25zdHJ1Y3RvckVtcHR5OwogIEZ1bmN0aW9uRW50aXR5IGdldCBtYXBMaXRlcmFsVW50eXBlZE1ha2VyOwogIEZ1bmN0aW9uRW50aXR5IGdldCBtYXBMaXRlcmFsVW50eXBlZEVtcHR5TWFrZXI7CgogIENsYXNzRW50aXR5IGdldCBzZXRMaXRlcmFsQ2xhc3M7CiAgQ29uc3RydWN0b3JFbnRpdHkgZ2V0IHNldExpdGVyYWxDb25zdHJ1Y3RvcjsKICBDb25zdHJ1Y3RvckVudGl0eSBnZXQgc2V0TGl0ZXJhbENvbnN0cnVjdG9yRW1wdHk7CiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHNldExpdGVyYWxVbnR5cGVkTWFrZXI7CiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHNldExpdGVyYWxVbnR5cGVkRW1wdHlNYWtlcjsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IG9iamVjdE5vU3VjaE1ldGhvZDsKCiAgYm9vbCBpc0RlZmF1bHROb1N1Y2hNZXRob2RJbXBsZW1lbnRhdGlvbihGdW5jdGlvbkVudGl0eSBlbGVtZW50KTsKCiAgLy8gRnJvbSBkYXJ0OmFzeW5jCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGFzeW5jSGVscGVyU3RhcnRTeW5jOwogIEZ1bmN0aW9uRW50aXR5IGdldCBhc3luY0hlbHBlckF3YWl0OwogIEZ1bmN0aW9uRW50aXR5IGdldCBhc3luY0hlbHBlclJldHVybjsKICBGdW5jdGlvbkVudGl0eSBnZXQgYXN5bmNIZWxwZXJSZXRocm93OwoKICBGdW5jdGlvbkVudGl0eSBnZXQgd3JhcEJvZHk7CgogIEZ1bmN0aW9uRW50aXR5IGdldCB5aWVsZFN0YXI7CgogIEZ1bmN0aW9uRW50aXR5IGdldCB5aWVsZFNpbmdsZTsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHN5bmNTdGFyVW5jYXVnaHRFcnJvcjsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGFzeW5jU3RhckhlbHBlcjsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHN0cmVhbU9mQ29udHJvbGxlcjsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGVuZE9mSXRlcmF0aW9uOwoKICBDbGFzc0VudGl0eSBnZXQgc3luY1N0YXJJdGVyYWJsZTsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGZ1dHVyZUltcGxlbWVudGF0aW9uOwoKICBDbGFzc0VudGl0eSBnZXQgY29udHJvbGxlclN0cmVhbTsKCiAgQ2xhc3NFbnRpdHkgZ2V0IHN0cmVhbUl0ZXJhdG9yOwoKICBDb25zdHJ1Y3RvckVudGl0eSBnZXQgc3RyZWFtSXRlcmF0b3JDb25zdHJ1Y3RvcjsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHN5bmNTdGFySXRlcmFibGVGYWN0b3J5OwoKICBGdW5jdGlvbkVudGl0eSBnZXQgYXN5bmNBd2FpdENvbXBsZXRlckZhY3Rvcnk7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBhc3luY1N0YXJTdHJlYW1Db250cm9sbGVyRmFjdG9yeTsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzSW50ZXJjZXB0b3JDbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzU3RyaW5nQ2xhc3M7CgogIENsYXNzRW50aXR5IGdldCBqc0FycmF5Q2xhc3M7CgogIENsYXNzRW50aXR5IGdldCBqc051bWJlckNsYXNzOwoKICBDbGFzc0VudGl0eSBnZXQganNJbnRDbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzRG91YmxlQ2xhc3M7CgogIENsYXNzRW50aXR5IGdldCBqc051bGxDbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzQm9vbENsYXNzOwoKICBDbGFzc0VudGl0eSBnZXQganNQbGFpbkphdmFTY3JpcHRPYmplY3RDbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzVW5rbm93bkphdmFTY3JpcHRPYmplY3RDbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzSmF2YVNjcmlwdEZ1bmN0aW9uQ2xhc3M7CgogIENsYXNzRW50aXR5IGdldCBqc0phdmFTY3JpcHRPYmplY3RDbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzSW5kZXhhYmxlQ2xhc3M7CgogIENsYXNzRW50aXR5IGdldCBqc011dGFibGVJbmRleGFibGVDbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzTXV0YWJsZUFycmF5Q2xhc3M7CgogIENsYXNzRW50aXR5IGdldCBqc0ZpeGVkQXJyYXlDbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzRXh0ZW5kYWJsZUFycmF5Q2xhc3M7CgogIENsYXNzRW50aXR5IGdldCBqc1VubW9kaWZpYWJsZUFycmF5Q2xhc3M7CgogIENsYXNzRW50aXR5IGdldCBqc1Bvc2l0aXZlSW50Q2xhc3M7CgogIENsYXNzRW50aXR5IGdldCBqc1VJbnQzMkNsYXNzOwoKICBDbGFzc0VudGl0eSBnZXQganNVSW50MzFDbGFzczsKCiAgLy8vIFJldHVybnMgYHRydWVgIG1lbWJlciBpcyB0aGUgJ2ZpbmRJbmRleEZvck5hdGl2ZVN1YmNsYXNzVHlwZScgbWV0aG9kCiAgLy8vIGRlY2xhcmVkIGluIGBkYXJ0Ol9pbnRlcmNlcHRvcnNgLgogIGJvb2wgaXNGaW5kSW5kZXhGb3JOYXRpdmVTdWJjbGFzc1R5cGUoTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBnZXROYXRpdmVJbnRlcmNlcHRvck1ldGhvZDsKCiAgQ29uc3RydWN0b3JFbnRpdHkgZ2V0IGpzQXJyYXlUeXBlZENvbnN0cnVjdG9yOwoKICAvLyBGcm9tIGRhcnQ6X2pzX2hlbHBlcgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEF2b2lkIHRoZSBuZWVkIGZvciB0aGlzIChmcm9tIFtDaGVja2VkTW9kZUhlbHBlcl0pLgogIEZ1bmN0aW9uRW50aXR5IGZpbmRIZWxwZXJGdW5jdGlvbihTdHJpbmcgbmFtZSk7CgogIENsYXNzRW50aXR5IGdldCBjbG9zdXJlQ2xhc3M7CgogIENsYXNzRW50aXR5IGdldCBib3VuZENsb3N1cmVDbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IHR5cGVMaXRlcmFsQ2xhc3M7CgogIENsYXNzRW50aXR5IGdldCBjb25zdE1hcExpdGVyYWxDbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGNvbnN0U2V0TGl0ZXJhbENsYXNzOwoKICBDbGFzc0VudGl0eSBnZXQgdHlwZVZhcmlhYmxlQ2xhc3M7CgogIENsYXNzRW50aXR5IGdldCBqc0ludm9jYXRpb25NaXJyb3JDbGFzczsKCiAgTWVtYmVyRW50aXR5IGdldCBpbnZvY2F0aW9uVHlwZUFyZ3VtZW50R2V0dGVyOwoKICAvLy8gSW50ZXJmYWNlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBoYXMgdGhlIEphdmFTY3JpcHQKICAvLy8gaW5kZXhpbmcgYmVoYXZpb3IuIFRoZSBpbnRlcmZhY2UgaXMgb25seSB2aXNpYmxlIHRvIHNwZWNpZmljIGxpYnJhcmllcy4KICBDbGFzc0VudGl0eSBnZXQganNJbmRleGluZ0JlaGF2aW9ySW50ZXJmYWNlOwoKICBDbGFzc0VudGl0eSBnZXQgc3RhY2tUcmFjZUhlbHBlckNsYXNzOwoKICBDbGFzc0VudGl0eSBnZXQgY29uc3RhbnRNYXBDbGFzczsKICBDbGFzc0VudGl0eSBnZXQgY29uc3RhbnRTdHJpbmdNYXBDbGFzczsKICBDbGFzc0VudGl0eSBnZXQgY29uc3RhbnRQcm90b01hcENsYXNzOwogIENsYXNzRW50aXR5IGdldCBnZW5lcmFsQ29uc3RhbnRNYXBDbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGFubm90YXRpb25DcmVhdGVzQ2xhc3M7CgogIENsYXNzRW50aXR5IGdldCBhbm5vdGF0aW9uUmV0dXJuc0NsYXNzOwoKICBDbGFzc0VudGl0eSBnZXQgYW5ub3RhdGlvbkpTTmFtZUNsYXNzOwoKICAvLy8gVGhlIGNsYXNzIGZvciBuYXRpdmUgYW5ub3RhdGlvbnMgZGVmaW5lZCBpbiBkYXJ0Ol9qc19oZWxwZXIuCiAgQ2xhc3NFbnRpdHkgZ2V0IG5hdGl2ZUFubm90YXRpb25DbGFzczsKCiAgQ29uc3RydWN0b3JFbnRpdHkgZ2V0IHR5cGVWYXJpYWJsZUNvbnN0cnVjdG9yOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgYXNzZXJ0VGVzdDsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGFzc2VydFRocm93OwoKICBGdW5jdGlvbkVudGl0eSBnZXQgYXNzZXJ0SGVscGVyOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgYXNzZXJ0VW5yZWFjaGFibGVNZXRob2Q7CgogIC8vLyBIb2xkcyB0aGUgbWV0aG9kICJnZXRJc29sYXRlQWZmaW5pdHlUYWciIHdoZW4gZGFydDpfanNfaGVscGVyIGhhcyBiZWVuCiAgLy8vIGxvYWRlZC4KICBGdW5jdGlvbkVudGl0eSBnZXQgZ2V0SXNvbGF0ZUFmZmluaXR5VGFnTWFya2VyOwoKICAvLy8gSG9sZHMgdGhlIG1ldGhvZCAicmVxdWlyZXNQcmVhbWJsZSIgaW4gX2pzX2hlbHBlci4KICBGdW5jdGlvbkVudGl0eSBnZXQgcmVxdWlyZXNQcmVhbWJsZU1hcmtlcjsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGxvYWRMaWJyYXJ5V3JhcHBlcjsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGxvYWREZWZlcnJlZExpYnJhcnk7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBib29sQ29udmVyc2lvbkNoZWNrOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgdHJhY2VIZWxwZXI7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBjbG9zdXJlRnJvbVRlYXJPZmY7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBpc0pzSW5kZXhhYmxlOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgdGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247CgogIEZ1bmN0aW9uRW50aXR5IGdldCB0aHJvd0luZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbjsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGV4Y2VwdGlvblVud3JhcHBlcjsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHRocm93UnVudGltZUVycm9yOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgdGhyb3dVbnN1cHBvcnRlZEVycm9yOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgdGhyb3dUeXBlRXJyb3I7CgogIEZ1bmN0aW9uRW50aXR5IGdldCB0aHJvd0Fic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3I7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBjaGVja0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcjsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHRocm93Q29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgc3RyaW5nSW50ZXJwb2xhdGlvbkhlbHBlcjsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHdyYXBFeGNlcHRpb25IZWxwZXI7CgogIEZ1bmN0aW9uRW50aXR5IGdldCB0aHJvd0V4cHJlc3Npb25IZWxwZXI7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBjbG9zdXJlQ29udmVydGVyOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgdHJhY2VGcm9tRXhjZXB0aW9uOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgc2V0UnVudGltZVR5cGVJbmZvOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgZ2V0UnVudGltZVR5cGVJbmZvOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgZ2V0VHlwZUFyZ3VtZW50QnlJbmRleDsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGNvbXB1dGVTaWduYXR1cmU7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBnZXRSdW50aW1lVHlwZUFyZ3VtZW50czsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGdldFJ1bnRpbWVUeXBlQXJndW1lbnQ7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBnZXRSdW50aW1lVHlwZUFyZ3VtZW50SW50ZXJjZXB0ZWQ7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBhc3NlcnRJc1N1YnR5cGU7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBjaGVja1N1YnR5cGU7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBhc3NlcnRTdWJ0eXBlOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgc3VidHlwZUNhc3Q7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBmdW5jdGlvblR5cGVUZXN0OwoKICBGdW5jdGlvbkVudGl0eSBnZXQgZnV0dXJlT3JUZXN0OwoKICBGdW5jdGlvbkVudGl0eSBnZXQgY2hlY2tTdWJ0eXBlT2ZSdW50aW1lVHlwZTsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGFzc2VydFN1YnR5cGVPZlJ1bnRpbWVUeXBlOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgc3VidHlwZU9mUnVudGltZVR5cGVDYXN0OwoKICBGdW5jdGlvbkVudGl0eSBnZXQgY2hlY2tEZWZlcnJlZElzTG9hZGVkOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgdGhyb3dOb1N1Y2hNZXRob2Q7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBjcmVhdGVSdW50aW1lVHlwZTsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGZhbGxUaHJvdWdoRXJyb3I7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBjcmVhdGVJbnZvY2F0aW9uTWlycm9yOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgY3JlYXRlVW5tYW5nbGVkSW52b2NhdGlvbk1pcnJvcjsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGN5Y2xpY1Rocm93SGVscGVyOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgZGVmaW5lUHJvcGVydHk7CgogIGJvb2wgaXNFeHRyYWN0VHlwZUFyZ3VtZW50cyhGdW5jdGlvbkVudGl0eSBtZW1iZXIpOwoKICBDbGFzc0VudGl0eSBnZXRJbnN0YW50aWF0aW9uQ2xhc3MoaW50IHR5cGVBcmd1bWVudENvdW50KTsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0SW5zdGFudGlhdGVGdW5jdGlvbihpbnQgdHlwZUFyZ3VtZW50Q291bnQpOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgaW5zdGFudGlhdGVkR2VuZXJpY0Z1bmN0aW9uVHlwZTsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGV4dHJhY3RGdW5jdGlvblR5cGVPYmplY3RGcm9tSW50ZXJuYWw7CgogIC8vIEZyb20gZGFydDpfaW50ZXJuYWwKCiAgQ2xhc3NFbnRpdHkgZ2V0IHN5bWJvbEltcGxlbWVudGF0aW9uQ2xhc3M7CgogIC8vLyBVc2VkIHRvIGFubm90YXRlIGl0ZW1zIHRoYXQgaGF2ZSB0aGUga2V5d29yZCAibmF0aXZlIi4KICBDbGFzc0VudGl0eSBnZXQgZXh0ZXJuYWxOYW1lQ2xhc3M7CgogIEludGVyZmFjZVR5cGUgZ2V0IGV4dGVybmFsTmFtZVR5cGU7CgogIENvbnN0cnVjdG9yRW50aXR5IGdldCBzeW1ib2xWYWxpZGF0ZWRDb25zdHJ1Y3RvcjsKCiAgLy8gRnJvbSBkYXJ0Ol9qc19lbWJlZGRlZF9uYW1lcwoKICAvLy8gSG9sZHMgdGhlIGNsYXNzIGZvciB0aGUgW0pzR2V0TmFtZV0gZW51bS4KICBDbGFzc0VudGl0eSBnZXQganNHZXROYW1lRW51bTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFttZW1iZXJdIGlzIGEgImZvcmVpZ24gaGVscGVyIiwgdGhhdCBpcywgYSBtZW1iZXIgd2hvc2UKICAvLy8gc2VtYW50aWNzIGlzIGRlZmluZWQgc3ludGhldGljYWxseSBhbmQgbm90IHRocm91Z2ggRGFydCBjb2RlLgogIC8vLwogIC8vLyBNb3N0IGZvcmVpZ24gaGVscGVycyBhcmUgbG9jYXRlZCBpbiB0aGUgYGRhcnQ6X2ZvcmVpZ25faGVscGVyYCBsaWJyYXJ5LgogIGJvb2wgaXNGb3JlaWduSGVscGVyKE1lbWJlckVudGl0eSBtZW1iZXIpOwoKICBDbGFzc0VudGl0eSBnZXREZWZhdWx0U3VwZXJjbGFzcygKICAgICAgQ2xhc3NFbnRpdHkgY2xzLCBOYXRpdmVCYXNpY0RhdGEgbmF0aXZlQmFzaWNEYXRhKTsKfQoKYWJzdHJhY3QgY2xhc3MgS0NvbW1vbkVsZW1lbnRzIGltcGxlbWVudHMgQ29tbW9uRWxlbWVudHMgewogIC8vIEZyb20gcGFja2FnZTpqcwogIENsYXNzRW50aXR5IGdldCBqc0Fubm90YXRpb25DbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzQW5vbnltb3VzQ2xhc3M7CgogIENsYXNzRW50aXR5IGdldCBwcmFnbWFDbGFzczsKICBGaWVsZEVudGl0eSBnZXQgcHJhZ21hQ2xhc3NOYW1lRmllbGQ7CiAgRmllbGRFbnRpdHkgZ2V0IHByYWdtYUNsYXNzT3B0aW9uc0ZpZWxkOwoKICBib29sIGlzQ3JlYXRlSW52b2NhdGlvbk1pcnJvckhlbHBlcihNZW1iZXJFbnRpdHkgbWVtYmVyKTsKCiAgYm9vbCBpc1N5bWJvbFZhbGlkYXRlZENvbnN0cnVjdG9yKENvbnN0cnVjdG9yRW50aXR5IGVsZW1lbnQpOwoKICBDbGFzc0VudGl0eSBnZXQgbWV0YU5vSW5saW5lQ2xhc3M7CgogIENsYXNzRW50aXR5IGdldCBtZXRhVHJ5SW5saW5lQ2xhc3M7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbZnVuY3Rpb25dIGlzIGFsbG93ZWQgdG8gYmUgZXh0ZXJuYWwuCiAgLy8vCiAgLy8vIFRoaXMgcmV0dXJucyBgdHJ1ZWAgZm9yIGZvcmVpZ24gaGVscGVycywgZnJvbSBlbnZpcm9ubWVudCBjb25zdHJ1Y3RvcnMgYW5kCiAgLy8vIG1lbWJlcnMgb2YgbGlicmFyaWVzIHRoYXQgc3VwcG9ydCBuYXRpdmUuCiAgLy8vCiAgLy8vIFRoaXMgcmV0dXJucyBgZmFsc2VgIGZvciBKUyBpbnRlcm9wIG1lbWJlcnMgd2hpY2ggdGhlcmVmb3JlIG11c3QgYmUKICAvLy8gYWxsb3dlZCB0byBiZSBleHRlcm5hbCB0aHJvdWdoIHRoZSBKUyBpbnRlcm9wIGFubm90YXRpb24gaGFuZGxpbmcuCiAgYm9vbCBpc0V4dGVybmFsQWxsb3dlZChGdW5jdGlvbkVudGl0eSBmdW5jdGlvbik7Cn0KCmFic3RyYWN0IGNsYXNzIEpDb21tb25FbGVtZW50cyBpbXBsZW1lbnRzIENvbW1vbkVsZW1lbnRzIHsKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2VsZW1lbnRdIGlzIHRoZSB1bm5hbWVkIGNvbnN0cnVjdG9yIG9mIGBMaXN0YC4KICAvLy8KICAvLy8gVGhpcyB3aWxsIG5vdCByZXNvbHZlIHRoZSBjb25zdHJ1Y3RvciBpZiBpdCBoYXNuJ3QgYmVlbiBzZWVuIHlldCBkdXJpbmcKICAvLy8gY29tcGlsYXRpb24uCiAgYm9vbCBpc1VubmFtZWRMaXN0Q29uc3RydWN0b3IoQ29uc3RydWN0b3JFbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbZWxlbWVudF0gaXMgdGhlICdmaWxsZWQnIGNvbnN0cnVjdG9yIG9mIGBMaXN0YC4KICAvLy8KICAvLy8gVGhpcyB3aWxsIG5vdCByZXNvbHZlIHRoZSBjb25zdHJ1Y3RvciBpZiBpdCBoYXNuJ3QgYmVlbiBzZWVuIHlldCBkdXJpbmcKICAvLy8gY29tcGlsYXRpb24uCiAgYm9vbCBpc0ZpbGxlZExpc3RDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvckVudGl0eSBlbGVtZW50KTsKCiAgYm9vbCBpc0RlZmF1bHRFcXVhbGl0eUltcGxlbWVudGF0aW9uKE1lbWJlckVudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtzZWxlY3Rvcl0gYXBwbGllcyB0byBgSlNJbmRleGFibGUubGVuZ3RoYC4KICBib29sIGFwcGxpZXNUb0pzSW5kZXhhYmxlTGVuZ3RoKFNlbGVjdG9yIHNlbGVjdG9yKTsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGpzQXJyYXlSZW1vdmVMYXN0OwoKICBGdW5jdGlvbkVudGl0eSBnZXQganNBcnJheUFkZDsKCiAgYm9vbCBpc0pzU3RyaW5nU3BsaXQoTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbc2VsZWN0b3JdIGFwcGxpZXMgdG8gYEpTU3RyaW5nLnNwbGl0YCBvbiBbcmVjZWl2ZXJdCiAgLy8vIGluIHRoZSBnaXZlbiBbd29ybGRdLgogIC8vLwogIC8vLyBSZXR1cm5zIGBmYWxzZWAgaWYgYEpTU3RyaW5nLnNwbGl0YCBpcyBub3QgYXZhaWxhYmxlLgogIGJvb2wgYXBwbGllc1RvSnNTdHJpbmdTcGxpdChTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSByZWNlaXZlciwKICAgICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluKTsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGpzU3RyaW5nU3BsaXQ7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBqc1N0cmluZ1RvU3RyaW5nOwoKICBGdW5jdGlvbkVudGl0eSBnZXQganNTdHJpbmdPcGVyYXRvckFkZDsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzQ29uc3RDbGFzczsKCiAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgW21lbWJlcl0gaXMgdGhlICdjaGVja0ludCcgZnVuY3Rpb24gZGVmaW5lZCBpbgogIC8vLyBkYXJ0Ol9qc19oZWxwZXJzLgogIGJvb2wgaXNDaGVja0ludChNZW1iZXJFbnRpdHkgbWVtYmVyKTsKCiAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgW21lbWJlcl0gaXMgdGhlICdjaGVja051bScgZnVuY3Rpb24gZGVmaW5lZCBpbgogIC8vLyBkYXJ0Ol9qc19oZWxwZXJzLgogIGJvb2wgaXNDaGVja051bShNZW1iZXJFbnRpdHkgbWVtYmVyKTsKCiAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgW21lbWJlcl0gaXMgdGhlICdjaGVja1N0cmluZycgZnVuY3Rpb24gZGVmaW5lZCBpbgogIC8vLyBkYXJ0Ol9qc19oZWxwZXJzLgogIGJvb2wgaXNDaGVja1N0cmluZyhNZW1iZXJFbnRpdHkgbWVtYmVyKTsKCiAgYm9vbCBpc0luc3RhbnRpYXRpb25DbGFzcyhDbGFzc0VudGl0eSBjbHMpOwoKICAvLyBGcm9tIGRhcnQ6X25hdGl2ZV90eXBlZF9kYXRhCgogIENsYXNzRW50aXR5IGdldCB0eXBlZEFycmF5T2ZJbnRDbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IHR5cGVkQXJyYXlPZkRvdWJsZUNsYXNzOwoKICAvLy8gSG9sZHMgdGhlIGNsYXNzIGZvciB0aGUgW0pzQnVpbHRpbnNdIGVudW0uCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzQnVpbHRpbkVudW07CgogIGJvb2wgaXNGb3JlaWduKE1lbWJlckVudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgJ29wZXJhdG9yID09JyBbZnVuY3Rpb25dIGlzCiAgLy8vIGtub3duIHRvIGhhbmRsZSBgbnVsbGAgYXMgYXJndW1lbnQuCiAgYm9vbCBvcGVyYXRvckVxSGFuZGxlc051bGxBcmd1bWVudChGdW5jdGlvbkVudGl0eSBmdW5jdGlvbik7Cn0KCmNsYXNzIENvbW1vbkVsZW1lbnRzSW1wbAogICAgaW1wbGVtZW50cyBDb21tb25FbGVtZW50cywgS0NvbW1vbkVsZW1lbnRzLCBKQ29tbW9uRWxlbWVudHMgewogIGZpbmFsIEVsZW1lbnRFbnZpcm9ubWVudCBfZW52OwoKICBDb21tb25FbGVtZW50c0ltcGwodGhpcy5fZW52KTsKCiAgQ2xhc3NFbnRpdHkgX29iamVjdENsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBvYmplY3RDbGFzcyA9PgogICAgICBfb2JqZWN0Q2xhc3MgPz89IF9maW5kQ2xhc3MoY29yZUxpYnJhcnksICdPYmplY3QnKTsKCiAgQ2xhc3NFbnRpdHkgX2Jvb2xDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgYm9vbENsYXNzID0+IF9ib29sQ2xhc3MgPz89IF9maW5kQ2xhc3MoY29yZUxpYnJhcnksICdib29sJyk7CgogIENsYXNzRW50aXR5IF9udW1DbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgbnVtQ2xhc3MgPT4gX251bUNsYXNzID8/PSBfZmluZENsYXNzKGNvcmVMaWJyYXJ5LCAnbnVtJyk7CgogIENsYXNzRW50aXR5IF9pbnRDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgaW50Q2xhc3MgPT4gX2ludENsYXNzID8/PSBfZmluZENsYXNzKGNvcmVMaWJyYXJ5LCAnaW50Jyk7CgogIENsYXNzRW50aXR5IF9kb3VibGVDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgZG91YmxlQ2xhc3MgPT4KICAgICAgX2RvdWJsZUNsYXNzID8/PSBfZmluZENsYXNzKGNvcmVMaWJyYXJ5LCAnZG91YmxlJyk7CgogIENsYXNzRW50aXR5IF9zdHJpbmdDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgc3RyaW5nQ2xhc3MgPT4KICAgICAgX3N0cmluZ0NsYXNzID8/PSBfZmluZENsYXNzKGNvcmVMaWJyYXJ5LCAnU3RyaW5nJyk7CgogIENsYXNzRW50aXR5IF9mdW5jdGlvbkNsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBmdW5jdGlvbkNsYXNzID0+CiAgICAgIF9mdW5jdGlvbkNsYXNzID8/PSBfZmluZENsYXNzKGNvcmVMaWJyYXJ5LCAnRnVuY3Rpb24nKTsKCiAgQ2xhc3NFbnRpdHkgX3Jlc291cmNlQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IHJlc291cmNlQ2xhc3MgPT4KICAgICAgX3Jlc291cmNlQ2xhc3MgPz89IF9maW5kQ2xhc3MoY29yZUxpYnJhcnksICdSZXNvdXJjZScpOwoKICBDbGFzc0VudGl0eSBfc3ltYm9sQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IHN5bWJvbENsYXNzID0+CiAgICAgIF9zeW1ib2xDbGFzcyA/Pz0gX2ZpbmRDbGFzcyhjb3JlTGlicmFyeSwgJ1N5bWJvbCcpOwoKICBDbGFzc0VudGl0eSBfbnVsbENsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBudWxsQ2xhc3MgPT4gX251bGxDbGFzcyA/Pz0gX2ZpbmRDbGFzcyhjb3JlTGlicmFyeSwgJ051bGwnKTsKCiAgQ2xhc3NFbnRpdHkgX3R5cGVDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgdHlwZUNsYXNzID0+IF90eXBlQ2xhc3MgPz89IF9maW5kQ2xhc3MoY29yZUxpYnJhcnksICdUeXBlJyk7CgogIENsYXNzRW50aXR5IF9zdGFja1RyYWNlQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IHN0YWNrVHJhY2VDbGFzcyA9PgogICAgICBfc3RhY2tUcmFjZUNsYXNzID8/PSBfZmluZENsYXNzKGNvcmVMaWJyYXJ5LCAnU3RhY2tUcmFjZScpOwoKICBDbGFzc0VudGl0eSBfbGlzdENsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBsaXN0Q2xhc3MgPT4gX2xpc3RDbGFzcyA/Pz0gX2ZpbmRDbGFzcyhjb3JlTGlicmFyeSwgJ0xpc3QnKTsKCiAgQ2xhc3NFbnRpdHkgX3NldENsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBzZXRDbGFzcyA9PiBfc2V0Q2xhc3MgPz89IF9maW5kQ2xhc3MoY29yZUxpYnJhcnksICdTZXQnKTsKCiAgQ2xhc3NFbnRpdHkgX21hcENsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBtYXBDbGFzcyA9PiBfbWFwQ2xhc3MgPz89IF9maW5kQ2xhc3MoY29yZUxpYnJhcnksICdNYXAnKTsKCiAgQ2xhc3NFbnRpdHkgX3VubW9kaWZpYWJsZVNldENsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCB1bm1vZGlmaWFibGVTZXRDbGFzcyA9PiBfdW5tb2RpZmlhYmxlU2V0Q2xhc3MgPz89CiAgICAgIF9maW5kQ2xhc3MoX2Vudi5sb29rdXBMaWJyYXJ5KFVyaXMuZGFydF9jb2xsZWN0aW9uKSwgJ19Vbm1vZGlmaWFibGVTZXQnKTsKCiAgQ2xhc3NFbnRpdHkgX2l0ZXJhYmxlQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGl0ZXJhYmxlQ2xhc3MgPT4KICAgICAgX2l0ZXJhYmxlQ2xhc3MgPz89IF9maW5kQ2xhc3MoY29yZUxpYnJhcnksICdJdGVyYWJsZScpOwoKICBDbGFzc0VudGl0eSBfZnV0dXJlQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGZ1dHVyZUNsYXNzID0+CiAgICAgIF9mdXR1cmVDbGFzcyA/Pz0gX2ZpbmRDbGFzcyhhc3luY0xpYnJhcnksICdGdXR1cmUnKTsKCiAgQ2xhc3NFbnRpdHkgX3N0cmVhbUNsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBzdHJlYW1DbGFzcyA9PgogICAgICBfc3RyZWFtQ2xhc3MgPz89IF9maW5kQ2xhc3MoYXN5bmNMaWJyYXJ5LCAnU3RyZWFtJyk7CgogIExpYnJhcnlFbnRpdHkgX2NvcmVMaWJyYXJ5OwogIEBvdmVycmlkZQogIExpYnJhcnlFbnRpdHkgZ2V0IGNvcmVMaWJyYXJ5ID0+CiAgICAgIF9jb3JlTGlicmFyeSA/Pz0gX2Vudi5sb29rdXBMaWJyYXJ5KFVyaXMuZGFydF9jb3JlLCByZXF1aXJlZDogdHJ1ZSk7CgogIExpYnJhcnlFbnRpdHkgX2FzeW5jTGlicmFyeTsKICBAb3ZlcnJpZGUKICBMaWJyYXJ5RW50aXR5IGdldCBhc3luY0xpYnJhcnkgPT4KICAgICAgX2FzeW5jTGlicmFyeSA/Pz0gX2Vudi5sb29rdXBMaWJyYXJ5KFVyaXMuZGFydF9hc3luYyk7CgogIC8vLyBUaGUgZGFydDptaXJyb3JzIGxpYnJhcnkuCiAgLy8vCiAgLy8vIE51bGwgaWYgdGhlIHByb2dyYW0gZG9lc24ndCBhY2Nlc3MgZGFydDptaXJyb3JzLgogIExpYnJhcnlFbnRpdHkgX21pcnJvcnNMaWJyYXJ5OwogIEBvdmVycmlkZQogIExpYnJhcnlFbnRpdHkgZ2V0IG1pcnJvcnNMaWJyYXJ5ID0+CiAgICAgIF9taXJyb3JzTGlicmFyeSA/Pz0gX2Vudi5sb29rdXBMaWJyYXJ5KFVyaXMuZGFydF9taXJyb3JzKTsKCiAgTGlicmFyeUVudGl0eSBfdHlwZWREYXRhTGlicmFyeTsKICBAb3ZlcnJpZGUKICBMaWJyYXJ5RW50aXR5IGdldCB0eXBlZERhdGFMaWJyYXJ5ID0+CiAgICAgIF90eXBlZERhdGFMaWJyYXJ5ID8/PSBfZW52Lmxvb2t1cExpYnJhcnkoVXJpcy5kYXJ0X19uYXRpdmVfdHlwZWRfZGF0YSk7CgogIExpYnJhcnlFbnRpdHkgX2pzSGVscGVyTGlicmFyeTsKICBAb3ZlcnJpZGUKICBMaWJyYXJ5RW50aXR5IGdldCBqc0hlbHBlckxpYnJhcnkgPT4KICAgICAgX2pzSGVscGVyTGlicmFyeSA/Pz0gX2Vudi5sb29rdXBMaWJyYXJ5KFVyaXMuZGFydF9fanNfaGVscGVyKTsKCiAgTGlicmFyeUVudGl0eSBfaW50ZXJjZXB0b3JzTGlicmFyeTsKICBAb3ZlcnJpZGUKICBMaWJyYXJ5RW50aXR5IGdldCBpbnRlcmNlcHRvcnNMaWJyYXJ5ID0+CiAgICAgIF9pbnRlcmNlcHRvcnNMaWJyYXJ5ID8/PSBfZW52Lmxvb2t1cExpYnJhcnkoVXJpcy5kYXJ0X19pbnRlcmNlcHRvcnMpOwoKICBMaWJyYXJ5RW50aXR5IF9mb3JlaWduTGlicmFyeTsKICBAb3ZlcnJpZGUKICBMaWJyYXJ5RW50aXR5IGdldCBmb3JlaWduTGlicmFyeSA9PgogICAgICBfZm9yZWlnbkxpYnJhcnkgPz89IF9lbnYubG9va3VwTGlicmFyeShVcmlzLmRhcnRfX2ZvcmVpZ25faGVscGVyKTsKCiAgLy8vIFJlZmVyZW5jZSB0byB0aGUgaW50ZXJuYWwgbGlicmFyeSB0byBsb29rdXAgZnVuY3Rpb25zIHRvIGFsd2F5cyBpbmxpbmUuCiAgTGlicmFyeUVudGl0eSBfaW50ZXJuYWxMaWJyYXJ5OwogIEBvdmVycmlkZQogIExpYnJhcnlFbnRpdHkgZ2V0IGludGVybmFsTGlicmFyeSA9PiBfaW50ZXJuYWxMaWJyYXJ5ID8/PQogICAgICBfZW52Lmxvb2t1cExpYnJhcnkoVXJpcy5kYXJ0X19pbnRlcm5hbCwgcmVxdWlyZWQ6IHRydWUpOwoKICBDbGFzc0VudGl0eSBfdHlwZWREYXRhQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IHR5cGVkRGF0YUNsYXNzID0+CiAgICAgIF90eXBlZERhdGFDbGFzcyA/Pz0gX2ZpbmRDbGFzcyh0eXBlZERhdGFMaWJyYXJ5LCAnTmF0aXZlVHlwZWREYXRhJyk7CgogIENvbnN0cnVjdG9yRW50aXR5IF9zeW1ib2xDb25zdHJ1Y3RvclRhcmdldDsKICBAb3ZlcnJpZGUKICBDb25zdHJ1Y3RvckVudGl0eSBnZXQgc3ltYm9sQ29uc3RydWN0b3JUYXJnZXQgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogS2VybmVsIGRvZXMgbm90IGluY2x1ZGUgcmVkaXJlY3RpbmcgZmFjdG9yaWVzCiAgICAvLyBzbyB0aGlzIGNhbm5vdCBiZSBmb3VuZCBpbiBrZXJuZWwuIEZpbmQgYSBjb25zaXN0ZW50IHdheSB0byBoYW5kbGUKICAgIC8vIHRoaXMgYW5kIHNpbWlsYXIgY2FzZXMuCiAgICByZXR1cm4gX3N5bWJvbENvbnN0cnVjdG9yVGFyZ2V0ID8/PQogICAgICAgIF9maW5kQ29uc3RydWN0b3Ioc3ltYm9sSW1wbGVtZW50YXRpb25DbGFzcywgJycpOwogIH0KCiAgYm9vbCBfY29tcHV0ZWRTeW1ib2xDb25zdHJ1Y3RvckRlcGVuZGVuY2llcyA9IGZhbHNlOwogIENvbnN0cnVjdG9yRW50aXR5IF9zeW1ib2xDb25zdHJ1Y3RvckltcGxlbWVudGF0aW9uVGFyZ2V0OwoKICB2b2lkIF9lbnN1cmVTeW1ib2xDb25zdHJ1Y3RvckRlcGVuZGVuY2llcygpIHsKICAgIGlmIChfY29tcHV0ZWRTeW1ib2xDb25zdHJ1Y3RvckRlcGVuZGVuY2llcykgcmV0dXJuOwogICAgX2NvbXB1dGVkU3ltYm9sQ29uc3RydWN0b3JEZXBlbmRlbmNpZXMgPSB0cnVlOwogICAgaWYgKF9zeW1ib2xDb25zdHJ1Y3RvclRhcmdldCA9PSBudWxsKSB7CiAgICAgIGlmIChfc3ltYm9sSW1wbGVtZW50YXRpb25DbGFzcyA9PSBudWxsKSB7CiAgICAgICAgX3N5bWJvbEltcGxlbWVudGF0aW9uQ2xhc3MgPQogICAgICAgICAgICBfZmluZENsYXNzKGludGVybmFsTGlicmFyeSwgJ1N5bWJvbCcsIHJlcXVpcmVkOiBmYWxzZSk7CiAgICAgIH0KICAgICAgaWYgKF9zeW1ib2xJbXBsZW1lbnRhdGlvbkNsYXNzICE9IG51bGwpIHsKICAgICAgICBfc3ltYm9sQ29uc3RydWN0b3JUYXJnZXQgPQogICAgICAgICAgICBfZmluZENvbnN0cnVjdG9yKF9zeW1ib2xJbXBsZW1lbnRhdGlvbkNsYXNzLCAnJywgcmVxdWlyZWQ6IGZhbHNlKTsKICAgICAgfQogICAgfQogICAgaWYgKF9zeW1ib2xDbGFzcyA9PSBudWxsKSB7CiAgICAgIF9zeW1ib2xDbGFzcyA9IF9maW5kQ2xhc3MoY29yZUxpYnJhcnksICdTeW1ib2wnLCByZXF1aXJlZDogZmFsc2UpOwogICAgfQogICAgaWYgKF9zeW1ib2xDbGFzcyA9PSBudWxsKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIF9zeW1ib2xDb25zdHJ1Y3RvckltcGxlbWVudGF0aW9uVGFyZ2V0ID0KICAgICAgICBfZmluZENvbnN0cnVjdG9yKHN5bWJvbENsYXNzLCAnJywgcmVxdWlyZWQ6IGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNTeW1ib2xDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvckVudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQoZWxlbWVudCAhPSBudWxsKTsKICAgIF9lbnN1cmVTeW1ib2xDb25zdHJ1Y3RvckRlcGVuZGVuY2llcygpOwogICAgcmV0dXJuIGVsZW1lbnQgPT0gX3N5bWJvbENvbnN0cnVjdG9ySW1wbGVtZW50YXRpb25UYXJnZXQgfHwKICAgICAgICBlbGVtZW50ID09IF9zeW1ib2xDb25zdHJ1Y3RvclRhcmdldDsKICB9CgogIEZ1bmN0aW9uRW50aXR5IF9pZGVudGljYWxGdW5jdGlvbjsKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgaWRlbnRpY2FsRnVuY3Rpb24gPT4KICAgICAgX2lkZW50aWNhbEZ1bmN0aW9uID8/PSBfZmluZExpYnJhcnlNZW1iZXIoY29yZUxpYnJhcnksICdpZGVudGljYWwnKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0Z1bmN0aW9uQXBwbHlNZXRob2QoTWVtYmVyRW50aXR5IGVsZW1lbnQpID0+CiAgICAgIGVsZW1lbnQubmFtZSA9PSAnYXBwbHknICYmIGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MgPT0gZnVuY3Rpb25DbGFzczsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtlbGVtZW50XSBpcyB0aGUgdW5uYW1lZCBjb25zdHJ1Y3RvciBvZiBgTGlzdGAuCiAgLy8vCiAgLy8vIFRoaXMgd2lsbCBub3QgcmVzb2x2ZSB0aGUgY29uc3RydWN0b3IgaWYgaXQgaGFzbid0IGJlZW4gc2VlbiB5ZXQgZHVyaW5nCiAgLy8vIGNvbXBpbGF0aW9uLgogIEBvdmVycmlkZQogIGJvb2wgaXNVbm5hbWVkTGlzdENvbnN0cnVjdG9yKENvbnN0cnVjdG9yRW50aXR5IGVsZW1lbnQpID0+CiAgICAgIChlbGVtZW50Lm5hbWUgPT0gJycgJiYgZWxlbWVudC5lbmNsb3NpbmdDbGFzcyA9PSBsaXN0Q2xhc3MpIHx8CiAgICAgIChlbGVtZW50Lm5hbWUgPT0gJ2xpc3QnICYmIGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MgPT0ganNBcnJheUNsYXNzKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtlbGVtZW50XSBpcyB0aGUgJ2ZpbGxlZCcgY29uc3RydWN0b3Igb2YgYExpc3RgLgogIC8vLwogIC8vLyBUaGlzIHdpbGwgbm90IHJlc29sdmUgdGhlIGNvbnN0cnVjdG9yIGlmIGl0IGhhc24ndCBiZWVuIHNlZW4geWV0IGR1cmluZwogIC8vLyBjb21waWxhdGlvbi4KICBAb3ZlcnJpZGUKICBib29sIGlzRmlsbGVkTGlzdENvbnN0cnVjdG9yKENvbnN0cnVjdG9yRW50aXR5IGVsZW1lbnQpID0+CiAgICAgIGVsZW1lbnQubmFtZSA9PSAnZmlsbGVkJyAmJiBlbGVtZW50LmVuY2xvc2luZ0NsYXNzID09IGxpc3RDbGFzczsKCiAgQG92ZXJyaWRlCiAgRHluYW1pY1R5cGUgZ2V0IGR5bmFtaWNUeXBlID0+IF9lbnYuZHluYW1pY1R5cGU7CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0IG9iamVjdFR5cGUgPT4gX2dldFJhd1R5cGUob2JqZWN0Q2xhc3MpOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldCBib29sVHlwZSA9PiBfZ2V0UmF3VHlwZShib29sQ2xhc3MpOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldCBudW1UeXBlID0+IF9nZXRSYXdUeXBlKG51bUNsYXNzKTsKCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXQgaW50VHlwZSA9PiBfZ2V0UmF3VHlwZShpbnRDbGFzcyk7CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0IGRvdWJsZVR5cGUgPT4gX2dldFJhd1R5cGUoZG91YmxlQ2xhc3MpOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldCBzdHJpbmdUeXBlID0+IF9nZXRSYXdUeXBlKHN0cmluZ0NsYXNzKTsKCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXQgc3ltYm9sVHlwZSA9PiBfZ2V0UmF3VHlwZShzeW1ib2xDbGFzcyk7CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0IGZ1bmN0aW9uVHlwZSA9PiBfZ2V0UmF3VHlwZShmdW5jdGlvbkNsYXNzKTsKCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXQgbnVsbFR5cGUgPT4gX2dldFJhd1R5cGUobnVsbENsYXNzKTsKCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXQgdHlwZVR5cGUgPT4gX2dldFJhd1R5cGUodHlwZUNsYXNzKTsKCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXQgdHlwZUxpdGVyYWxUeXBlID0+IF9nZXRSYXdUeXBlKHR5cGVMaXRlcmFsQ2xhc3MpOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldCBzdGFja1RyYWNlVHlwZSA9PiBfZ2V0UmF3VHlwZShzdGFja1RyYWNlQ2xhc3MpOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGxpc3RUeXBlKFtEYXJ0VHlwZSBlbGVtZW50VHlwZV0pIHsKICAgIGlmIChlbGVtZW50VHlwZSA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfZ2V0UmF3VHlwZShsaXN0Q2xhc3MpOwogICAgfQogICAgcmV0dXJuIF9jcmVhdGVJbnRlcmZhY2VUeXBlKGxpc3RDbGFzcywgW2VsZW1lbnRUeXBlXSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIHNldFR5cGUoW0RhcnRUeXBlIGVsZW1lbnRUeXBlXSkgewogICAgaWYgKGVsZW1lbnRUeXBlID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9nZXRSYXdUeXBlKHNldENsYXNzKTsKICAgIH0KICAgIHJldHVybiBfY3JlYXRlSW50ZXJmYWNlVHlwZShzZXRDbGFzcywgW2VsZW1lbnRUeXBlXSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIG1hcFR5cGUoW0RhcnRUeXBlIGtleVR5cGUsIERhcnRUeXBlIHZhbHVlVHlwZV0pIHsKICAgIGlmIChrZXlUeXBlID09IG51bGwgJiYgdmFsdWVUeXBlID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9nZXRSYXdUeXBlKG1hcENsYXNzKTsKICAgIH0gZWxzZSBpZiAoa2V5VHlwZSA9PSBudWxsKSB7CiAgICAgIGtleVR5cGUgPSBkeW5hbWljVHlwZTsKICAgIH0gZWxzZSBpZiAodmFsdWVUeXBlID09IG51bGwpIHsKICAgICAgdmFsdWVUeXBlID0gZHluYW1pY1R5cGU7CiAgICB9CiAgICByZXR1cm4gX2NyZWF0ZUludGVyZmFjZVR5cGUobWFwQ2xhc3MsIFtrZXlUeXBlLCB2YWx1ZVR5cGVdKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgaXRlcmFibGVUeXBlKFtEYXJ0VHlwZSBlbGVtZW50VHlwZV0pIHsKICAgIGlmIChlbGVtZW50VHlwZSA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfZ2V0UmF3VHlwZShpdGVyYWJsZUNsYXNzKTsKICAgIH0KICAgIHJldHVybiBfY3JlYXRlSW50ZXJmYWNlVHlwZShpdGVyYWJsZUNsYXNzLCBbZWxlbWVudFR5cGVdKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZnV0dXJlVHlwZShbRGFydFR5cGUgZWxlbWVudFR5cGVdKSB7CiAgICBpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkgewogICAgICByZXR1cm4gX2dldFJhd1R5cGUoZnV0dXJlQ2xhc3MpOwogICAgfQogICAgcmV0dXJuIF9jcmVhdGVJbnRlcmZhY2VUeXBlKGZ1dHVyZUNsYXNzLCBbZWxlbWVudFR5cGVdKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgc3RyZWFtVHlwZShbRGFydFR5cGUgZWxlbWVudFR5cGVdKSB7CiAgICBpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkgewogICAgICByZXR1cm4gX2dldFJhd1R5cGUoc3RyZWFtQ2xhc3MpOwogICAgfQogICAgcmV0dXJuIF9jcmVhdGVJbnRlcmZhY2VUeXBlKHN0cmVhbUNsYXNzLCBbZWxlbWVudFR5cGVdKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNOdW1iZXJPclN0cmluZ1N1cGVydHlwZShDbGFzc0VudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gZWxlbWVudCA9PSBfZmluZENsYXNzKGNvcmVMaWJyYXJ5LCAnQ29tcGFyYWJsZScsIHJlcXVpcmVkOiBmYWxzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzU3RyaW5nT25seVN1cGVydHlwZShDbGFzc0VudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gZWxlbWVudCA9PSBfZmluZENsYXNzKGNvcmVMaWJyYXJ5LCAnUGF0dGVybicsIHJlcXVpcmVkOiBmYWxzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzTGlzdFN1cGVydHlwZShDbGFzc0VudGl0eSBlbGVtZW50KSA9PiBlbGVtZW50ID09IGl0ZXJhYmxlQ2xhc3M7CgogIENsYXNzRW50aXR5IF9maW5kQ2xhc3MoTGlicmFyeUVudGl0eSBsaWJyYXJ5LCBTdHJpbmcgbmFtZSwKICAgICAge2Jvb2wgcmVxdWlyZWQ6IHRydWV9KSB7CiAgICBpZiAobGlicmFyeSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBfZW52Lmxvb2t1cENsYXNzKGxpYnJhcnksIG5hbWUsIHJlcXVpcmVkOiByZXF1aXJlZCk7CiAgfQoKICBNZW1iZXJFbnRpdHkgX2ZpbmRMaWJyYXJ5TWVtYmVyKExpYnJhcnlFbnRpdHkgbGlicmFyeSwgU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2UsIGJvb2wgcmVxdWlyZWQ6IHRydWV9KSB7CiAgICBpZiAobGlicmFyeSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBfZW52Lmxvb2t1cExpYnJhcnlNZW1iZXIobGlicmFyeSwgbmFtZSwKICAgICAgICBzZXR0ZXI6IHNldHRlciwgcmVxdWlyZWQ6IHJlcXVpcmVkKTsKICB9CgogIE1lbWJlckVudGl0eSBfZmluZENsYXNzTWVtYmVyKENsYXNzRW50aXR5IGNscywgU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2UsIGJvb2wgcmVxdWlyZWQ6IHRydWV9KSB7CiAgICByZXR1cm4gX2Vudi5sb29rdXBMb2NhbENsYXNzTWVtYmVyKGNscywgbmFtZSwKICAgICAgICBzZXR0ZXI6IHNldHRlciwgcmVxdWlyZWQ6IHJlcXVpcmVkKTsKICB9CgogIENvbnN0cnVjdG9yRW50aXR5IF9maW5kQ29uc3RydWN0b3IoQ2xhc3NFbnRpdHkgY2xzLCBTdHJpbmcgbmFtZSwKICAgICAge2Jvb2wgcmVxdWlyZWQ6IHRydWV9KSB7CiAgICByZXR1cm4gX2Vudi5sb29rdXBDb25zdHJ1Y3RvcihjbHMsIG5hbWUsIHJlcXVpcmVkOiByZXF1aXJlZCk7CiAgfQoKICAvLy8gUmV0dXJuIHRoZSByYXcgdHlwZSBvZiBbY2xzXS4KICBJbnRlcmZhY2VUeXBlIF9nZXRSYXdUeXBlKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIF9lbnYuZ2V0UmF3VHlwZShjbHMpOwogIH0KCiAgLy8vIENyZWF0ZSB0aGUgaW5zdGFudGlhdGlvbiBvZiBbY2xzXSB3aXRoIHRoZSBnaXZlbiBbdHlwZUFyZ3VtZW50c10uCiAgSW50ZXJmYWNlVHlwZSBfY3JlYXRlSW50ZXJmYWNlVHlwZSgKICAgICAgQ2xhc3NFbnRpdHkgY2xzLCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICByZXR1cm4gX2Vudi5jcmVhdGVJbnRlcmZhY2VUeXBlKGNscywgdHlwZUFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldENvbnN0YW50TWFwVHlwZUZvcihJbnRlcmZhY2VUeXBlIHNvdXJjZVR5cGUsCiAgICAgIHtib29sIGhhc1Byb3RvS2V5OiBmYWxzZSwgYm9vbCBvbmx5U3RyaW5nS2V5czogZmFsc2V9KSB7CiAgICBDbGFzc0VudGl0eSBjbGFzc0VsZW1lbnQgPSBvbmx5U3RyaW5nS2V5cwogICAgICAgID8gKGhhc1Byb3RvS2V5ID8gY29uc3RhbnRQcm90b01hcENsYXNzIDogY29uc3RhbnRTdHJpbmdNYXBDbGFzcykKICAgICAgICA6IGdlbmVyYWxDb25zdGFudE1hcENsYXNzOwogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50ID0gc291cmNlVHlwZS50eXBlQXJndW1lbnRzOwogICAgaWYgKHNvdXJjZVR5cGUudHJlYXRBc1JhdykgewogICAgICByZXR1cm4gX2Vudi5nZXRSYXdUeXBlKGNsYXNzRWxlbWVudCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gX2Vudi5jcmVhdGVJbnRlcmZhY2VUeXBlKGNsYXNzRWxlbWVudCwgdHlwZUFyZ3VtZW50KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0Q29uc3RhbnRTZXRUeXBlRm9yKEludGVyZmFjZVR5cGUgc291cmNlVHlwZSkgPT4KICAgICAgc291cmNlVHlwZS50cmVhdEFzUmF3CiAgICAgICAgICA/IF9lbnYuZ2V0UmF3VHlwZShjb25zdFNldExpdGVyYWxDbGFzcykKICAgICAgICAgIDogX2Vudi5jcmVhdGVJbnRlcmZhY2VUeXBlKAogICAgICAgICAgICAgIGNvbnN0U2V0TGl0ZXJhbENsYXNzLCBzb3VyY2VUeXBlLnR5cGVBcmd1bWVudHMpOwoKICBAb3ZlcnJpZGUKICBGaWVsZEVudGl0eSBnZXQgc3ltYm9sRmllbGQgPT4gc3ltYm9sSW1wbGVtZW50YXRpb25GaWVsZDsKCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXQgc3ltYm9sSW1wbGVtZW50YXRpb25UeXBlID0+CiAgICAgIF9lbnYuZ2V0UmF3VHlwZShzeW1ib2xJbXBsZW1lbnRhdGlvbkNsYXNzKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0RlZmF1bHRFcXVhbGl0eUltcGxlbWVudGF0aW9uKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQoZWxlbWVudC5uYW1lID09ICc9PScpOwogICAgQ2xhc3NFbnRpdHkgY2xhc3NFbGVtZW50ID0gZWxlbWVudC5lbmNsb3NpbmdDbGFzczsKICAgIHJldHVybiBjbGFzc0VsZW1lbnQgPT0gb2JqZWN0Q2xhc3MgfHwKICAgICAgICBjbGFzc0VsZW1lbnQgPT0ganNJbnRlcmNlcHRvckNsYXNzIHx8CiAgICAgICAgY2xhc3NFbGVtZW50ID09IGpzTnVsbENsYXNzOwogIH0KCiAgLy8gRnJvbSBkYXJ0OmNvcmUKCiAgQ2xhc3NFbnRpdHkgX21hcExpdGVyYWxDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgbWFwTGl0ZXJhbENsYXNzIHsKICAgIGlmIChfbWFwTGl0ZXJhbENsYXNzID09IG51bGwpIHsKICAgICAgX21hcExpdGVyYWxDbGFzcyA9IF9lbnYubG9va3VwQ2xhc3MoY29yZUxpYnJhcnksICdMaW5rZWRIYXNoTWFwJyk7CiAgICAgIGlmIChfbWFwTGl0ZXJhbENsYXNzID09IG51bGwpIHsKICAgICAgICBfbWFwTGl0ZXJhbENsYXNzID0gX2ZpbmRDbGFzcygKICAgICAgICAgICAgX2Vudi5sb29rdXBMaWJyYXJ5KFVyaXMuZGFydF9jb2xsZWN0aW9uKSwgJ0xpbmtlZEhhc2hNYXAnKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIF9tYXBMaXRlcmFsQ2xhc3M7CiAgfQoKICBDb25zdHJ1Y3RvckVudGl0eSBfbWFwTGl0ZXJhbENvbnN0cnVjdG9yOwogIENvbnN0cnVjdG9yRW50aXR5IF9tYXBMaXRlcmFsQ29uc3RydWN0b3JFbXB0eTsKICBGdW5jdGlvbkVudGl0eSBfbWFwTGl0ZXJhbFVudHlwZWRNYWtlcjsKICBGdW5jdGlvbkVudGl0eSBfbWFwTGl0ZXJhbFVudHlwZWRFbXB0eU1ha2VyOwogIHZvaWQgX2Vuc3VyZU1hcExpdGVyYWxIZWxwZXJzKCkgewogICAgaWYgKF9tYXBMaXRlcmFsQ29uc3RydWN0b3IgIT0gbnVsbCkgcmV0dXJuOwoKICAgIF9tYXBMaXRlcmFsQ29uc3RydWN0b3IgPQogICAgICAgIF9lbnYubG9va3VwQ29uc3RydWN0b3IobWFwTGl0ZXJhbENsYXNzLCAnX2xpdGVyYWwnKTsKICAgIF9tYXBMaXRlcmFsQ29uc3RydWN0b3JFbXB0eSA9CiAgICAgICAgX2Vudi5sb29rdXBDb25zdHJ1Y3RvcihtYXBMaXRlcmFsQ2xhc3MsICdfZW1wdHknKTsKICAgIF9tYXBMaXRlcmFsVW50eXBlZE1ha2VyID0KICAgICAgICBfZW52Lmxvb2t1cExvY2FsQ2xhc3NNZW1iZXIobWFwTGl0ZXJhbENsYXNzLCAnX21ha2VMaXRlcmFsJyk7CiAgICBfbWFwTGl0ZXJhbFVudHlwZWRFbXB0eU1ha2VyID0KICAgICAgICBfZW52Lmxvb2t1cExvY2FsQ2xhc3NNZW1iZXIobWFwTGl0ZXJhbENsYXNzLCAnX21ha2VFbXB0eScpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RydWN0b3JFbnRpdHkgZ2V0IG1hcExpdGVyYWxDb25zdHJ1Y3RvciB7CiAgICBfZW5zdXJlTWFwTGl0ZXJhbEhlbHBlcnMoKTsKICAgIHJldHVybiBfbWFwTGl0ZXJhbENvbnN0cnVjdG9yOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RydWN0b3JFbnRpdHkgZ2V0IG1hcExpdGVyYWxDb25zdHJ1Y3RvckVtcHR5IHsKICAgIF9lbnN1cmVNYXBMaXRlcmFsSGVscGVycygpOwogICAgcmV0dXJuIF9tYXBMaXRlcmFsQ29uc3RydWN0b3JFbXB0eTsKICB9CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBtYXBMaXRlcmFsVW50eXBlZE1ha2VyIHsKICAgIF9lbnN1cmVNYXBMaXRlcmFsSGVscGVycygpOwogICAgcmV0dXJuIF9tYXBMaXRlcmFsVW50eXBlZE1ha2VyOwogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IG1hcExpdGVyYWxVbnR5cGVkRW1wdHlNYWtlciB7CiAgICBfZW5zdXJlTWFwTGl0ZXJhbEhlbHBlcnMoKTsKICAgIHJldHVybiBfbWFwTGl0ZXJhbFVudHlwZWRFbXB0eU1ha2VyOwogIH0KCiAgQ2xhc3NFbnRpdHkgX3NldExpdGVyYWxDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgc2V0TGl0ZXJhbENsYXNzID0+IF9zZXRMaXRlcmFsQ2xhc3MgPz89CiAgICAgIF9maW5kQ2xhc3MoX2Vudi5sb29rdXBMaWJyYXJ5KFVyaXMuZGFydF9jb2xsZWN0aW9uKSwgJ0xpbmtlZEhhc2hTZXQnKTsKCiAgQ29uc3RydWN0b3JFbnRpdHkgX3NldExpdGVyYWxDb25zdHJ1Y3RvcjsKICBDb25zdHJ1Y3RvckVudGl0eSBfc2V0TGl0ZXJhbENvbnN0cnVjdG9yRW1wdHk7CiAgRnVuY3Rpb25FbnRpdHkgX3NldExpdGVyYWxVbnR5cGVkTWFrZXI7CiAgRnVuY3Rpb25FbnRpdHkgX3NldExpdGVyYWxVbnR5cGVkRW1wdHlNYWtlcjsKCiAgdm9pZCBfZW5zdXJlU2V0TGl0ZXJhbEhlbHBlcnMoKSB7CiAgICBpZiAoX3NldExpdGVyYWxDb25zdHJ1Y3RvciAhPSBudWxsKSByZXR1cm47CgogICAgX3NldExpdGVyYWxDb25zdHJ1Y3RvciA9CiAgICAgICAgX2Vudi5sb29rdXBDb25zdHJ1Y3RvcihzZXRMaXRlcmFsQ2xhc3MsICdfbGl0ZXJhbCcpOwogICAgX3NldExpdGVyYWxDb25zdHJ1Y3RvckVtcHR5ID0KICAgICAgICBfZW52Lmxvb2t1cENvbnN0cnVjdG9yKHNldExpdGVyYWxDbGFzcywgJ19lbXB0eScpOwogICAgX3NldExpdGVyYWxVbnR5cGVkTWFrZXIgPQogICAgICAgIF9lbnYubG9va3VwTG9jYWxDbGFzc01lbWJlcihzZXRMaXRlcmFsQ2xhc3MsICdfbWFrZUxpdGVyYWwnKTsKICAgIF9zZXRMaXRlcmFsVW50eXBlZEVtcHR5TWFrZXIgPQogICAgICAgIF9lbnYubG9va3VwTG9jYWxDbGFzc01lbWJlcihzZXRMaXRlcmFsQ2xhc3MsICdfbWFrZUVtcHR5Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdHJ1Y3RvckVudGl0eSBnZXQgc2V0TGl0ZXJhbENvbnN0cnVjdG9yIHsKICAgIF9lbnN1cmVTZXRMaXRlcmFsSGVscGVycygpOwogICAgcmV0dXJuIF9zZXRMaXRlcmFsQ29uc3RydWN0b3I7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdHJ1Y3RvckVudGl0eSBnZXQgc2V0TGl0ZXJhbENvbnN0cnVjdG9yRW1wdHkgewogICAgX2Vuc3VyZVNldExpdGVyYWxIZWxwZXJzKCk7CiAgICByZXR1cm4gX3NldExpdGVyYWxDb25zdHJ1Y3RvckVtcHR5OwogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHNldExpdGVyYWxVbnR5cGVkTWFrZXIgewogICAgX2Vuc3VyZVNldExpdGVyYWxIZWxwZXJzKCk7CiAgICByZXR1cm4gX3NldExpdGVyYWxVbnR5cGVkTWFrZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgc2V0TGl0ZXJhbFVudHlwZWRFbXB0eU1ha2VyIHsKICAgIF9lbnN1cmVTZXRMaXRlcmFsSGVscGVycygpOwogICAgcmV0dXJuIF9zZXRMaXRlcmFsVW50eXBlZEVtcHR5TWFrZXI7CiAgfQoKICBGdW5jdGlvbkVudGl0eSBfb2JqZWN0Tm9TdWNoTWV0aG9kOwogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBvYmplY3ROb1N1Y2hNZXRob2QgewogICAgcmV0dXJuIF9vYmplY3ROb1N1Y2hNZXRob2QgPz89CiAgICAgICAgX2Vudi5sb29rdXBMb2NhbENsYXNzTWVtYmVyKG9iamVjdENsYXNzLCBJZGVudGlmaWVycy5ub1N1Y2hNZXRob2RfKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNEZWZhdWx0Tm9TdWNoTWV0aG9kSW1wbGVtZW50YXRpb24oRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgewogICAgQ2xhc3NFbnRpdHkgY2xhc3NFbGVtZW50ID0gZWxlbWVudC5lbmNsb3NpbmdDbGFzczsKICAgIHJldHVybiBjbGFzc0VsZW1lbnQgPT0gb2JqZWN0Q2xhc3MgfHwKICAgICAgICBjbGFzc0VsZW1lbnQgPT0ganNJbnRlcmNlcHRvckNsYXNzIHx8CiAgICAgICAgY2xhc3NFbGVtZW50ID09IGpzTnVsbENsYXNzOwogIH0KCiAgLy8gRnJvbSBkYXJ0OmFzeW5jCiAgQ2xhc3NFbnRpdHkgX2ZpbmRBc3luY0hlbHBlckNsYXNzKFN0cmluZyBuYW1lKSA9PgogICAgICBfZmluZENsYXNzKGFzeW5jTGlicmFyeSwgbmFtZSk7CgogIEZ1bmN0aW9uRW50aXR5IF9maW5kQXN5bmNIZWxwZXJGdW5jdGlvbihTdHJpbmcgbmFtZSkgPT4KICAgICAgX2ZpbmRMaWJyYXJ5TWVtYmVyKGFzeW5jTGlicmFyeSwgbmFtZSk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBhc3luY0hlbHBlclN0YXJ0U3luYyA9PgogICAgICBfZmluZEFzeW5jSGVscGVyRnVuY3Rpb24oIl9hc3luY1N0YXJ0U3luYyIpOwogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBhc3luY0hlbHBlckF3YWl0ID0+CiAgICAgIF9maW5kQXN5bmNIZWxwZXJGdW5jdGlvbigiX2FzeW5jQXdhaXQiKTsKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgYXN5bmNIZWxwZXJSZXR1cm4gPT4KICAgICAgX2ZpbmRBc3luY0hlbHBlckZ1bmN0aW9uKCJfYXN5bmNSZXR1cm4iKTsKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgYXN5bmNIZWxwZXJSZXRocm93ID0+CiAgICAgIF9maW5kQXN5bmNIZWxwZXJGdW5jdGlvbigiX2FzeW5jUmV0aHJvdyIpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgd3JhcEJvZHkgPT4KICAgICAgX2ZpbmRBc3luY0hlbHBlckZ1bmN0aW9uKCJfd3JhcEpzRnVuY3Rpb25Gb3JBc3luYyIpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgeWllbGRTdGFyID0+IF9lbnYubG9va3VwTG9jYWxDbGFzc01lbWJlcigKICAgICAgX2ZpbmRBc3luY0hlbHBlckNsYXNzKCJfSXRlcmF0aW9uTWFya2VyIiksICJ5aWVsZFN0YXIiKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHlpZWxkU2luZ2xlID0+IF9lbnYubG9va3VwTG9jYWxDbGFzc01lbWJlcigKICAgICAgX2ZpbmRBc3luY0hlbHBlckNsYXNzKCJfSXRlcmF0aW9uTWFya2VyIiksICJ5aWVsZFNpbmdsZSIpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgc3luY1N0YXJVbmNhdWdodEVycm9yID0+IF9lbnYubG9va3VwTG9jYWxDbGFzc01lbWJlcigKICAgICAgX2ZpbmRBc3luY0hlbHBlckNsYXNzKCJfSXRlcmF0aW9uTWFya2VyIiksICJ1bmNhdWdodEVycm9yIik7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBhc3luY1N0YXJIZWxwZXIgPT4KICAgICAgX2ZpbmRBc3luY0hlbHBlckZ1bmN0aW9uKCJfYXN5bmNTdGFySGVscGVyIik7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBzdHJlYW1PZkNvbnRyb2xsZXIgPT4KICAgICAgX2ZpbmRBc3luY0hlbHBlckZ1bmN0aW9uKCJfc3RyZWFtT2ZDb250cm9sbGVyIik7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBlbmRPZkl0ZXJhdGlvbiA9PiBfZW52Lmxvb2t1cExvY2FsQ2xhc3NNZW1iZXIoCiAgICAgIF9maW5kQXN5bmNIZWxwZXJDbGFzcygiX0l0ZXJhdGlvbk1hcmtlciIpLCAiZW5kT2ZJdGVyYXRpb24iKTsKCiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IHN5bmNTdGFySXRlcmFibGUgPT4KICAgICAgX2ZpbmRBc3luY0hlbHBlckNsYXNzKCJfU3luY1N0YXJJdGVyYWJsZSIpOwoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgZnV0dXJlSW1wbGVtZW50YXRpb24gPT4gX2ZpbmRBc3luY0hlbHBlckNsYXNzKCdfRnV0dXJlJyk7CgogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBjb250cm9sbGVyU3RyZWFtID0+CiAgICAgIF9maW5kQXN5bmNIZWxwZXJDbGFzcygiX0NvbnRyb2xsZXJTdHJlYW0iKTsKCiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IHN0cmVhbUl0ZXJhdG9yID0+IF9maW5kQXN5bmNIZWxwZXJDbGFzcygiU3RyZWFtSXRlcmF0b3IiKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RydWN0b3JFbnRpdHkgZ2V0IHN0cmVhbUl0ZXJhdG9yQ29uc3RydWN0b3IgPT4KICAgICAgX2Vudi5sb29rdXBDb25zdHJ1Y3RvcihzdHJlYW1JdGVyYXRvciwgIiIpOwoKICBGdW5jdGlvbkVudGl0eSBfc3luY1N0YXJJdGVyYWJsZUZhY3Rvcnk7CiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHN5bmNTdGFySXRlcmFibGVGYWN0b3J5ID0+IF9zeW5jU3Rhckl0ZXJhYmxlRmFjdG9yeSA/Pz0KICAgICAgX2ZpbmRBc3luY0hlbHBlckZ1bmN0aW9uKCdfbWFrZVN5bmNTdGFySXRlcmFibGUnKTsKCiAgRnVuY3Rpb25FbnRpdHkgX2FzeW5jQXdhaXRDb21wbGV0ZXJGYWN0b3J5OwogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBhc3luY0F3YWl0Q29tcGxldGVyRmFjdG9yeSA9PgogICAgICBfYXN5bmNBd2FpdENvbXBsZXRlckZhY3RvcnkgPz89CiAgICAgICAgICBfZmluZEFzeW5jSGVscGVyRnVuY3Rpb24oJ19tYWtlQXN5bmNBd2FpdENvbXBsZXRlcicpOwoKICBGdW5jdGlvbkVudGl0eSBfYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckZhY3Rvcnk7CiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGFzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJGYWN0b3J5ID0+CiAgICAgIF9hc3luY1N0YXJTdHJlYW1Db250cm9sbGVyRmFjdG9yeSA/Pz0KICAgICAgICAgIF9maW5kQXN5bmNIZWxwZXJGdW5jdGlvbignX21ha2VBc3luY1N0YXJTdHJlYW1Db250cm9sbGVyJyk7CgogIC8vIEZyb20gZGFydDpfaW50ZXJjZXB0b3JzCiAgQ2xhc3NFbnRpdHkgX2ZpbmRJbnRlcmNlcHRvcnNDbGFzcyhTdHJpbmcgbmFtZSkgPT4KICAgICAgX2ZpbmRDbGFzcyhpbnRlcmNlcHRvcnNMaWJyYXJ5LCBuYW1lKTsKCiAgRnVuY3Rpb25FbnRpdHkgX2ZpbmRJbnRlcmNlcHRvcnNGdW5jdGlvbihTdHJpbmcgbmFtZSkgPT4KICAgICAgX2ZpbmRMaWJyYXJ5TWVtYmVyKGludGVyY2VwdG9yc0xpYnJhcnksIG5hbWUpOwoKICBDbGFzc0VudGl0eSBfanNJbnRlcmNlcHRvckNsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBqc0ludGVyY2VwdG9yQ2xhc3MgPT4KICAgICAgX2pzSW50ZXJjZXB0b3JDbGFzcyA/Pz0gX2ZpbmRJbnRlcmNlcHRvcnNDbGFzcygnSW50ZXJjZXB0b3InKTsKCiAgQ2xhc3NFbnRpdHkgX2pzU3RyaW5nQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzU3RyaW5nQ2xhc3MgPT4KICAgICAgX2pzU3RyaW5nQ2xhc3MgPz89IF9maW5kSW50ZXJjZXB0b3JzQ2xhc3MoJ0pTU3RyaW5nJyk7CgogIENsYXNzRW50aXR5IF9qc0FycmF5Q2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzQXJyYXlDbGFzcyA9PgogICAgICBfanNBcnJheUNsYXNzID8/PSBfZmluZEludGVyY2VwdG9yc0NsYXNzKCdKU0FycmF5Jyk7CgogIENsYXNzRW50aXR5IF9qc051bWJlckNsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBqc051bWJlckNsYXNzID0+CiAgICAgIF9qc051bWJlckNsYXNzID8/PSBfZmluZEludGVyY2VwdG9yc0NsYXNzKCdKU051bWJlcicpOwoKICBDbGFzc0VudGl0eSBfanNJbnRDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQganNJbnRDbGFzcyA9PiBfanNJbnRDbGFzcyA/Pz0gX2ZpbmRJbnRlcmNlcHRvcnNDbGFzcygnSlNJbnQnKTsKCiAgQ2xhc3NFbnRpdHkgX2pzRG91YmxlQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzRG91YmxlQ2xhc3MgPT4KICAgICAgX2pzRG91YmxlQ2xhc3MgPz89IF9maW5kSW50ZXJjZXB0b3JzQ2xhc3MoJ0pTRG91YmxlJyk7CgogIENsYXNzRW50aXR5IF9qc051bGxDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQganNOdWxsQ2xhc3MgPT4KICAgICAgX2pzTnVsbENsYXNzID8/PSBfZmluZEludGVyY2VwdG9yc0NsYXNzKCdKU051bGwnKTsKCiAgQ2xhc3NFbnRpdHkgX2pzQm9vbENsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBqc0Jvb2xDbGFzcyA9PgogICAgICBfanNCb29sQ2xhc3MgPz89IF9maW5kSW50ZXJjZXB0b3JzQ2xhc3MoJ0pTQm9vbCcpOwoKICBDbGFzc0VudGl0eSBfanNQbGFpbkphdmFTY3JpcHRPYmplY3RDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQganNQbGFpbkphdmFTY3JpcHRPYmplY3RDbGFzcyA9PgogICAgICBfanNQbGFpbkphdmFTY3JpcHRPYmplY3RDbGFzcyA/Pz0KICAgICAgICAgIF9maW5kSW50ZXJjZXB0b3JzQ2xhc3MoJ1BsYWluSmF2YVNjcmlwdE9iamVjdCcpOwoKICBDbGFzc0VudGl0eSBfanNVbmtub3duSmF2YVNjcmlwdE9iamVjdENsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBqc1Vua25vd25KYXZhU2NyaXB0T2JqZWN0Q2xhc3MgPT4KICAgICAgX2pzVW5rbm93bkphdmFTY3JpcHRPYmplY3RDbGFzcyA/Pz0KICAgICAgICAgIF9maW5kSW50ZXJjZXB0b3JzQ2xhc3MoJ1Vua25vd25KYXZhU2NyaXB0T2JqZWN0Jyk7CgogIENsYXNzRW50aXR5IF9qc0phdmFTY3JpcHRGdW5jdGlvbkNsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBqc0phdmFTY3JpcHRGdW5jdGlvbkNsYXNzID0+IF9qc0phdmFTY3JpcHRGdW5jdGlvbkNsYXNzID8/PQogICAgICBfZmluZEludGVyY2VwdG9yc0NsYXNzKCdKYXZhU2NyaXB0RnVuY3Rpb24nKTsKCiAgQ2xhc3NFbnRpdHkgX2pzSmF2YVNjcmlwdE9iamVjdENsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBqc0phdmFTY3JpcHRPYmplY3RDbGFzcyA9PgogICAgICBfanNKYXZhU2NyaXB0T2JqZWN0Q2xhc3MgPz89IF9maW5kSW50ZXJjZXB0b3JzQ2xhc3MoJ0phdmFTY3JpcHRPYmplY3QnKTsKCiAgQ2xhc3NFbnRpdHkgX2pzSW5kZXhhYmxlQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzSW5kZXhhYmxlQ2xhc3MgPT4KICAgICAgX2pzSW5kZXhhYmxlQ2xhc3MgPz89IF9maW5kSW50ZXJjZXB0b3JzQ2xhc3MoJ0pTSW5kZXhhYmxlJyk7CgogIENsYXNzRW50aXR5IF9qc011dGFibGVJbmRleGFibGVDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQganNNdXRhYmxlSW5kZXhhYmxlQ2xhc3MgPT4KICAgICAgX2pzTXV0YWJsZUluZGV4YWJsZUNsYXNzID8/PSBfZmluZEludGVyY2VwdG9yc0NsYXNzKCdKU011dGFibGVJbmRleGFibGUnKTsKCiAgQ2xhc3NFbnRpdHkgX2pzTXV0YWJsZUFycmF5Q2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzTXV0YWJsZUFycmF5Q2xhc3MgPT4KICAgICAgX2pzTXV0YWJsZUFycmF5Q2xhc3MgPz89IF9maW5kSW50ZXJjZXB0b3JzQ2xhc3MoJ0pTTXV0YWJsZUFycmF5Jyk7CgogIENsYXNzRW50aXR5IF9qc0ZpeGVkQXJyYXlDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQganNGaXhlZEFycmF5Q2xhc3MgPT4KICAgICAgX2pzRml4ZWRBcnJheUNsYXNzID8/PSBfZmluZEludGVyY2VwdG9yc0NsYXNzKCdKU0ZpeGVkQXJyYXknKTsKCiAgQ2xhc3NFbnRpdHkgX2pzRXh0ZW5kYWJsZUFycmF5Q2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzRXh0ZW5kYWJsZUFycmF5Q2xhc3MgPT4KICAgICAgX2pzRXh0ZW5kYWJsZUFycmF5Q2xhc3MgPz89IF9maW5kSW50ZXJjZXB0b3JzQ2xhc3MoJ0pTRXh0ZW5kYWJsZUFycmF5Jyk7CgogIENsYXNzRW50aXR5IF9qc1VubW9kaWZpYWJsZUFycmF5Q2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzVW5tb2RpZmlhYmxlQXJyYXlDbGFzcyA9PiBfanNVbm1vZGlmaWFibGVBcnJheUNsYXNzID8/PQogICAgICBfZmluZEludGVyY2VwdG9yc0NsYXNzKCdKU1VubW9kaWZpYWJsZUFycmF5Jyk7CgogIENsYXNzRW50aXR5IF9qc1Bvc2l0aXZlSW50Q2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzUG9zaXRpdmVJbnRDbGFzcyA9PgogICAgICBfanNQb3NpdGl2ZUludENsYXNzID8/PSBfZmluZEludGVyY2VwdG9yc0NsYXNzKCdKU1Bvc2l0aXZlSW50Jyk7CgogIENsYXNzRW50aXR5IF9qc1VJbnQzMkNsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBqc1VJbnQzMkNsYXNzID0+CiAgICAgIF9qc1VJbnQzMkNsYXNzID8/PSBfZmluZEludGVyY2VwdG9yc0NsYXNzKCdKU1VJbnQzMicpOwoKICBDbGFzc0VudGl0eSBfanNVSW50MzFDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQganNVSW50MzFDbGFzcyA9PgogICAgICBfanNVSW50MzFDbGFzcyA/Pz0gX2ZpbmRJbnRlcmNlcHRvcnNDbGFzcygnSlNVSW50MzEnKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0ZpbmRJbmRleEZvck5hdGl2ZVN1YmNsYXNzVHlwZShNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICByZXR1cm4gbWVtYmVyLm5hbWUgPT0gJ2ZpbmRJbmRleEZvck5hdGl2ZVN1YmNsYXNzVHlwZScgJiYKICAgICAgICBtZW1iZXIuaXNUb3BMZXZlbCAmJgogICAgICAgIG1lbWJlci5saWJyYXJ5ID09IGludGVyY2VwdG9yc0xpYnJhcnk7CiAgfQoKICBGdW5jdGlvbkVudGl0eSBfZ2V0TmF0aXZlSW50ZXJjZXB0b3JNZXRob2Q7CiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGdldE5hdGl2ZUludGVyY2VwdG9yTWV0aG9kID0+CiAgICAgIF9nZXROYXRpdmVJbnRlcmNlcHRvck1ldGhvZCA/Pz0KICAgICAgICAgIF9maW5kSW50ZXJjZXB0b3JzRnVuY3Rpb24oJ2dldE5hdGl2ZUludGVyY2VwdG9yJyk7CgogIEBvdmVycmlkZQogIGJvb2wgYXBwbGllc1RvSnNJbmRleGFibGVMZW5ndGgoU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgIHJldHVybiBzZWxlY3Rvci5uYW1lID09ICdsZW5ndGgnICYmIChzZWxlY3Rvci5pc0dldHRlciB8fCBzZWxlY3Rvci5pc0NhbGwpOwogIH0KCiAgQ29uc3RydWN0b3JFbnRpdHkgX2pzQXJyYXlUeXBlZENvbnN0cnVjdG9yOwogIEBvdmVycmlkZQogIENvbnN0cnVjdG9yRW50aXR5IGdldCBqc0FycmF5VHlwZWRDb25zdHJ1Y3RvciA9PgogICAgICBfanNBcnJheVR5cGVkQ29uc3RydWN0b3IgPz89IF9maW5kQ29uc3RydWN0b3IoanNBcnJheUNsYXNzLCAndHlwZWQnKTsKCiAgRnVuY3Rpb25FbnRpdHkgX2pzQXJyYXlSZW1vdmVMYXN0OwogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBqc0FycmF5UmVtb3ZlTGFzdCA9PgogICAgICBfanNBcnJheVJlbW92ZUxhc3QgPz89IF9maW5kQ2xhc3NNZW1iZXIoanNBcnJheUNsYXNzLCAncmVtb3ZlTGFzdCcpOwoKICBGdW5jdGlvbkVudGl0eSBfanNBcnJheUFkZDsKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQganNBcnJheUFkZCA9PgogICAgICBfanNBcnJheUFkZCA/Pz0gX2ZpbmRDbGFzc01lbWJlcihqc0FycmF5Q2xhc3MsICdhZGQnKTsKCiAgYm9vbCBfaXNKc1N0cmluZ0NsYXNzKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGNscy5uYW1lID09ICdKU1N0cmluZycgJiYgY2xzLmxpYnJhcnkgPT0gaW50ZXJjZXB0b3JzTGlicmFyeTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNKc1N0cmluZ1NwbGl0KE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIHJldHVybiBtZW1iZXIubmFtZSA9PSAnc3BsaXQnICYmCiAgICAgICAgbWVtYmVyLmlzSW5zdGFuY2VNZW1iZXIgJiYKICAgICAgICBfaXNKc1N0cmluZ0NsYXNzKG1lbWJlci5lbmNsb3NpbmdDbGFzcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGFwcGxpZXNUb0pzU3RyaW5nU3BsaXQoU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXIsCiAgICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbikgewogICAgaWYgKF9qc1N0cmluZ1NwbGl0ID09IG51bGwpIHsKICAgICAgQ2xhc3NFbnRpdHkgY2xzID0KICAgICAgICAgIF9maW5kQ2xhc3MoaW50ZXJjZXB0b3JzTGlicmFyeSwgJ0pTU3RyaW5nJywgcmVxdWlyZWQ6IGZhbHNlKTsKICAgICAgaWYgKGNscyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAgIF9qc1N0cmluZ1NwbGl0ID0gX2ZpbmRDbGFzc01lbWJlcihjbHMsICdzcGxpdCcsIHJlcXVpcmVkOiBmYWxzZSk7CiAgICAgIGlmIChfanNTdHJpbmdTcGxpdCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gc2VsZWN0b3IuYXBwbGllcyhfanNTdHJpbmdTcGxpdCkgJiYKICAgICAgICAocmVjZWl2ZXIgPT0gbnVsbCB8fAogICAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgICAgICAgICAuaXNUYXJnZXRpbmdNZW1iZXIocmVjZWl2ZXIsIGpzU3RyaW5nU3BsaXQsIHNlbGVjdG9yLm1lbWJlck5hbWUpCiAgICAgICAgICAgICAgICAuaXNQb3RlbnRpYWxseVRydWUpOwogIH0KCiAgRnVuY3Rpb25FbnRpdHkgX2pzU3RyaW5nU3BsaXQ7CiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGpzU3RyaW5nU3BsaXQgPT4KICAgICAgX2pzU3RyaW5nU3BsaXQgPz89IF9maW5kQ2xhc3NNZW1iZXIoanNTdHJpbmdDbGFzcywgJ3NwbGl0Jyk7CgogIEZ1bmN0aW9uRW50aXR5IF9qc1N0cmluZ1RvU3RyaW5nOwogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBqc1N0cmluZ1RvU3RyaW5nID0+CiAgICAgIF9qc1N0cmluZ1RvU3RyaW5nID8/PSBfZmluZENsYXNzTWVtYmVyKGpzU3RyaW5nQ2xhc3MsICd0b1N0cmluZycpOwoKICBGdW5jdGlvbkVudGl0eSBfanNTdHJpbmdPcGVyYXRvckFkZDsKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQganNTdHJpbmdPcGVyYXRvckFkZCA9PgogICAgICBfanNTdHJpbmdPcGVyYXRvckFkZCA/Pz0gX2ZpbmRDbGFzc01lbWJlcihqc1N0cmluZ0NsYXNzLCAnKycpOwoKICBDbGFzc0VudGl0eSBfanNDb25zdENsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBqc0NvbnN0Q2xhc3MgPT4KICAgICAgX2pzQ29uc3RDbGFzcyA/Pz0gX2ZpbmRDbGFzcyhmb3JlaWduTGlicmFyeSwgJ0pTX0NPTlNUJyk7CgogIC8vIEZyb20gcGFja2FnZTpqcwogIENsYXNzRW50aXR5IF9qc0Fubm90YXRpb25DbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQganNBbm5vdGF0aW9uQ2xhc3MgewogICAgaWYgKF9qc0Fubm90YXRpb25DbGFzcyA9PSBudWxsKSB7CiAgICAgIExpYnJhcnlFbnRpdHkgbGlicmFyeSA9IF9lbnYubG9va3VwTGlicmFyeShVcmlzLnBhY2thZ2VfanMpOwogICAgICBpZiAobGlicmFyeSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgX2pzQW5ub3RhdGlvbkNsYXNzID0gX2ZpbmRDbGFzcyhsaWJyYXJ5LCAnSlMnKTsKICAgIH0KICAgIHJldHVybiBfanNBbm5vdGF0aW9uQ2xhc3M7CiAgfQoKICBDbGFzc0VudGl0eSBfanNBbm9ueW1vdXNDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQganNBbm9ueW1vdXNDbGFzcyB7CiAgICBpZiAoX2pzQW5vbnltb3VzQ2xhc3MgPT0gbnVsbCkgewogICAgICBMaWJyYXJ5RW50aXR5IGxpYnJhcnkgPSBfZW52Lmxvb2t1cExpYnJhcnkoVXJpcy5wYWNrYWdlX2pzKTsKICAgICAgaWYgKGxpYnJhcnkgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIF9qc0Fub255bW91c0NsYXNzID0gX2ZpbmRDbGFzcyhsaWJyYXJ5LCAnX0Fub255bW91cycpOwogICAgfQogICAgcmV0dXJuIF9qc0Fub255bW91c0NsYXNzOwogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZmluZEhlbHBlckZ1bmN0aW9uKFN0cmluZyBuYW1lKSA9PiBfZmluZEhlbHBlckZ1bmN0aW9uKG5hbWUpOwoKICBGdW5jdGlvbkVudGl0eSBfZmluZEhlbHBlckZ1bmN0aW9uKFN0cmluZyBuYW1lKSA9PgogICAgICBfZmluZExpYnJhcnlNZW1iZXIoanNIZWxwZXJMaWJyYXJ5LCBuYW1lKTsKCiAgQ2xhc3NFbnRpdHkgX2ZpbmRIZWxwZXJDbGFzcyhTdHJpbmcgbmFtZSkgPT4KICAgICAgX2ZpbmRDbGFzcyhqc0hlbHBlckxpYnJhcnksIG5hbWUpOwoKICBDbGFzc0VudGl0eSBfY2xvc3VyZUNsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBjbG9zdXJlQ2xhc3MgPT4gX2Nsb3N1cmVDbGFzcyA/Pz0gX2ZpbmRIZWxwZXJDbGFzcygnQ2xvc3VyZScpOwoKICBDbGFzc0VudGl0eSBfYm91bmRDbG9zdXJlQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGJvdW5kQ2xvc3VyZUNsYXNzID0+CiAgICAgIF9ib3VuZENsb3N1cmVDbGFzcyA/Pz0gX2ZpbmRIZWxwZXJDbGFzcygnQm91bmRDbG9zdXJlJyk7CgogIENsYXNzRW50aXR5IF90eXBlTGl0ZXJhbENsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCB0eXBlTGl0ZXJhbENsYXNzID0+CiAgICAgIF90eXBlTGl0ZXJhbENsYXNzID8/PSBfZmluZEhlbHBlckNsYXNzKCdUeXBlSW1wbCcpOwoKICBDbGFzc0VudGl0eSBfY29uc3RNYXBMaXRlcmFsQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGNvbnN0TWFwTGl0ZXJhbENsYXNzID0+CiAgICAgIF9jb25zdE1hcExpdGVyYWxDbGFzcyA/Pz0gX2ZpbmRIZWxwZXJDbGFzcygnQ29uc3RhbnRNYXAnKTsKCiAgLy8gVE9ETyhmaXNoeXRoZWZpc2gpOiBJbXBsZW1lbnQgYSBgQ29uc3RhbnRTZXRgIGNsYXNzIGFuZCB1cGRhdGUgdGhlIGJhY2tlbmQKICAvLyBpbXBhY3RzICsgY29uc3RhbnQgZW1pdHRlciBhY2NvcmRpbmdseS4KICBDbGFzc0VudGl0eSBfY29uc3RTZXRMaXRlcmFsQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGNvbnN0U2V0TGl0ZXJhbENsYXNzID0+CiAgICAgIF9jb25zdFNldExpdGVyYWxDbGFzcyA/Pz0gdW5tb2RpZmlhYmxlU2V0Q2xhc3M7CgogIENsYXNzRW50aXR5IF90eXBlVmFyaWFibGVDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgdHlwZVZhcmlhYmxlQ2xhc3MgPT4KICAgICAgX3R5cGVWYXJpYWJsZUNsYXNzID8/PSBfZmluZEhlbHBlckNsYXNzKCdUeXBlVmFyaWFibGUnKTsKCiAgQ2xhc3NFbnRpdHkgX3ByYWdtYUNsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBwcmFnbWFDbGFzcyA9PgogICAgICBfcHJhZ21hQ2xhc3MgPz89IF9maW5kQ2xhc3MoY29yZUxpYnJhcnksICdwcmFnbWEnKTsKCiAgRmllbGRFbnRpdHkgX3ByYWdtYUNsYXNzTmFtZUZpZWxkOwogIEBvdmVycmlkZQogIEZpZWxkRW50aXR5IGdldCBwcmFnbWFDbGFzc05hbWVGaWVsZCA9PgogICAgICBfcHJhZ21hQ2xhc3NOYW1lRmllbGQgPz89IF9maW5kQ2xhc3NNZW1iZXIocHJhZ21hQ2xhc3MsICduYW1lJyk7CgogIEZpZWxkRW50aXR5IF9wcmFnbWFDbGFzc09wdGlvbnNGaWVsZDsKICBAb3ZlcnJpZGUKICBGaWVsZEVudGl0eSBnZXQgcHJhZ21hQ2xhc3NPcHRpb25zRmllbGQgPT4KICAgICAgX3ByYWdtYUNsYXNzT3B0aW9uc0ZpZWxkID8/PSBfZmluZENsYXNzTWVtYmVyKHByYWdtYUNsYXNzLCAnb3B0aW9ucycpOwoKICBDbGFzc0VudGl0eSBfanNJbnZvY2F0aW9uTWlycm9yQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzSW52b2NhdGlvbk1pcnJvckNsYXNzID0+CiAgICAgIF9qc0ludm9jYXRpb25NaXJyb3JDbGFzcyA/Pz0gX2ZpbmRIZWxwZXJDbGFzcygnSlNJbnZvY2F0aW9uTWlycm9yJyk7CgogIE1lbWJlckVudGl0eSBfaW52b2NhdGlvblR5cGVBcmd1bWVudEdldHRlcjsKICBAb3ZlcnJpZGUKICBNZW1iZXJFbnRpdHkgZ2V0IGludm9jYXRpb25UeXBlQXJndW1lbnRHZXR0ZXIgPT4KICAgICAgX2ludm9jYXRpb25UeXBlQXJndW1lbnRHZXR0ZXIgPz89CiAgICAgICAgICBfZmluZENsYXNzTWVtYmVyKGpzSW52b2NhdGlvbk1pcnJvckNsYXNzLCAndHlwZUFyZ3VtZW50cycpOwoKICBDbGFzc0VudGl0eSBfanNJbmRleGluZ0JlaGF2aW9ySW50ZXJmYWNlOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBqc0luZGV4aW5nQmVoYXZpb3JJbnRlcmZhY2UgPT4KICAgICAgX2pzSW5kZXhpbmdCZWhhdmlvckludGVyZmFjZSA/Pz0KICAgICAgICAgIF9maW5kSGVscGVyQ2xhc3MoJ0phdmFTY3JpcHRJbmRleGluZ0JlaGF2aW9yJyk7CgogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBzdGFja1RyYWNlSGVscGVyQ2xhc3MgPT4gX2ZpbmRIZWxwZXJDbGFzcygnX1N0YWNrVHJhY2UnKTsKCiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGNvbnN0YW50TWFwQ2xhc3MgPT4KICAgICAgX2ZpbmRIZWxwZXJDbGFzcyhjb25zdGFudF9zeXN0ZW0uSmF2YVNjcmlwdE1hcENvbnN0YW50LkRBUlRfQ0xBU1MpOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBjb25zdGFudFN0cmluZ01hcENsYXNzID0+CiAgICAgIF9maW5kSGVscGVyQ2xhc3MoY29uc3RhbnRfc3lzdGVtLkphdmFTY3JpcHRNYXBDb25zdGFudC5EQVJUX1NUUklOR19DTEFTUyk7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGNvbnN0YW50UHJvdG9NYXBDbGFzcyA9PgogICAgICBfZmluZEhlbHBlckNsYXNzKGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0TWFwQ29uc3RhbnQuREFSVF9QUk9UT19DTEFTUyk7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGdlbmVyYWxDb25zdGFudE1hcENsYXNzID0+IF9maW5kSGVscGVyQ2xhc3MoCiAgICAgIGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0TWFwQ29uc3RhbnQuREFSVF9HRU5FUkFMX0NMQVNTKTsKCiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGFubm90YXRpb25DcmVhdGVzQ2xhc3MgPT4gX2ZpbmRIZWxwZXJDbGFzcygnQ3JlYXRlcycpOwoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgYW5ub3RhdGlvblJldHVybnNDbGFzcyA9PiBfZmluZEhlbHBlckNsYXNzKCdSZXR1cm5zJyk7CgogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBhbm5vdGF0aW9uSlNOYW1lQ2xhc3MgPT4gX2ZpbmRIZWxwZXJDbGFzcygnSlNOYW1lJyk7CgogIENsYXNzRW50aXR5IF9uYXRpdmVBbm5vdGF0aW9uQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IG5hdGl2ZUFubm90YXRpb25DbGFzcyA9PgogICAgICBfbmF0aXZlQW5ub3RhdGlvbkNsYXNzID8/PSBfZmluZEhlbHBlckNsYXNzKCdOYXRpdmUnKTsKCiAgQ29uc3RydWN0b3JFbnRpdHkgX3R5cGVWYXJpYWJsZUNvbnN0cnVjdG9yOwogIEBvdmVycmlkZQogIENvbnN0cnVjdG9yRW50aXR5IGdldCB0eXBlVmFyaWFibGVDb25zdHJ1Y3RvciA9PiBfdHlwZVZhcmlhYmxlQ29uc3RydWN0b3IgPz89CiAgICAgIF9lbnYubG9va3VwQ29uc3RydWN0b3IodHlwZVZhcmlhYmxlQ2xhc3MsICcnKTsKCiAgRnVuY3Rpb25FbnRpdHkgX2Fzc2VydFRlc3Q7CiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGFzc2VydFRlc3QgPT4KICAgICAgX2Fzc2VydFRlc3QgPz89IF9maW5kSGVscGVyRnVuY3Rpb24oJ2Fzc2VydFRlc3QnKTsKCiAgRnVuY3Rpb25FbnRpdHkgX2Fzc2VydFRocm93OwogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBhc3NlcnRUaHJvdyA9PgogICAgICBfYXNzZXJ0VGhyb3cgPz89IF9maW5kSGVscGVyRnVuY3Rpb24oJ2Fzc2VydFRocm93Jyk7CgogIEZ1bmN0aW9uRW50aXR5IF9hc3NlcnRIZWxwZXI7CiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGFzc2VydEhlbHBlciA9PgogICAgICBfYXNzZXJ0SGVscGVyID8/PSBfZmluZEhlbHBlckZ1bmN0aW9uKCdhc3NlcnRIZWxwZXInKTsKCiAgRnVuY3Rpb25FbnRpdHkgX2Fzc2VydFVucmVhY2hhYmxlTWV0aG9kOwogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBhc3NlcnRVbnJlYWNoYWJsZU1ldGhvZCA9PgogICAgICBfYXNzZXJ0VW5yZWFjaGFibGVNZXRob2QgPz89IF9maW5kSGVscGVyRnVuY3Rpb24oJ2Fzc2VydFVucmVhY2hhYmxlJyk7CgogIEZ1bmN0aW9uRW50aXR5IF9nZXRJc29sYXRlQWZmaW5pdHlUYWdNYXJrZXI7CiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGdldElzb2xhdGVBZmZpbml0eVRhZ01hcmtlciA9PgogICAgICBfZ2V0SXNvbGF0ZUFmZmluaXR5VGFnTWFya2VyID8/PQogICAgICAgICAgX2ZpbmRIZWxwZXJGdW5jdGlvbignZ2V0SXNvbGF0ZUFmZmluaXR5VGFnJyk7CgogIEZ1bmN0aW9uRW50aXR5IF9yZXF1aXJlc1ByZWFtYmxlTWFya2VyOwogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCByZXF1aXJlc1ByZWFtYmxlTWFya2VyID0+CiAgICAgIF9yZXF1aXJlc1ByZWFtYmxlTWFya2VyID8/PSBfZmluZEhlbHBlckZ1bmN0aW9uKCdyZXF1aXJlc1ByZWFtYmxlJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBsb2FkTGlicmFyeVdyYXBwZXIgPT4KICAgICAgX2ZpbmRIZWxwZXJGdW5jdGlvbigiX2xvYWRMaWJyYXJ5V3JhcHBlciIpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgbG9hZERlZmVycmVkTGlicmFyeSA9PgogICAgICBfZmluZEhlbHBlckZ1bmN0aW9uKCJsb2FkRGVmZXJyZWRMaWJyYXJ5Iik7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBib29sQ29udmVyc2lvbkNoZWNrID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ2Jvb2xDb252ZXJzaW9uQ2hlY2snKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHRyYWNlSGVscGVyID0+IF9maW5kSGVscGVyRnVuY3Rpb24oJ3RyYWNlSGVscGVyJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBjbG9zdXJlRnJvbVRlYXJPZmYgPT4KICAgICAgX2ZpbmRIZWxwZXJGdW5jdGlvbignY2xvc3VyZUZyb21UZWFyT2ZmJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBpc0pzSW5kZXhhYmxlID0+IF9maW5kSGVscGVyRnVuY3Rpb24oJ2lzSnNJbmRleGFibGUnKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHRocm93SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ2lhZScpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgdGhyb3dJbmRleE91dE9mUmFuZ2VFeGNlcHRpb24gPT4KICAgICAgX2ZpbmRIZWxwZXJGdW5jdGlvbignaW9vcmUnKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGV4Y2VwdGlvblVud3JhcHBlciA9PgogICAgICBfZmluZEhlbHBlckZ1bmN0aW9uKCd1bndyYXBFeGNlcHRpb24nKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHRocm93UnVudGltZUVycm9yID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ3Rocm93UnVudGltZUVycm9yJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCB0aHJvd1Vuc3VwcG9ydGVkRXJyb3IgPT4KICAgICAgX2ZpbmRIZWxwZXJGdW5jdGlvbigndGhyb3dVbnN1cHBvcnRlZEVycm9yJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCB0aHJvd1R5cGVFcnJvciA9PiBfZmluZEhlbHBlckZ1bmN0aW9uKCd0aHJvd1R5cGVFcnJvcicpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgdGhyb3dBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ3Rocm93QWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25FcnJvcicpOwoKICBGdW5jdGlvbkVudGl0eSBfY2FjaGVkQ2hlY2tDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3I7CiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGNoZWNrQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yID0+CiAgICAgIF9jYWNoZWRDaGVja0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvciA/Pz0KICAgICAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ2NoZWNrQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCB0aHJvd0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvciA9PgogICAgICBfZmluZEhlbHBlckZ1bmN0aW9uKCd0aHJvd0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcicpOwoKICBAb3ZlcnJpZGUKICBib29sIGlzQ2hlY2tJbnQoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgcmV0dXJuIG1lbWJlci5pc0Z1bmN0aW9uICYmCiAgICAgICAgbWVtYmVyLmlzVG9wTGV2ZWwgJiYKICAgICAgICBtZW1iZXIubGlicmFyeSA9PSBqc0hlbHBlckxpYnJhcnkgJiYKICAgICAgICBtZW1iZXIubmFtZSA9PSAnY2hlY2tJbnQnOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NoZWNrTnVtKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIHJldHVybiBtZW1iZXIuaXNGdW5jdGlvbiAmJgogICAgICAgIG1lbWJlci5pc1RvcExldmVsICYmCiAgICAgICAgbWVtYmVyLmxpYnJhcnkgPT0ganNIZWxwZXJMaWJyYXJ5ICYmCiAgICAgICAgbWVtYmVyLm5hbWUgPT0gJ2NoZWNrTnVtJzsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNDaGVja1N0cmluZyhNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICByZXR1cm4gbWVtYmVyLmlzRnVuY3Rpb24gJiYKICAgICAgICBtZW1iZXIuaXNUb3BMZXZlbCAmJgogICAgICAgIG1lbWJlci5saWJyYXJ5ID09IGpzSGVscGVyTGlicmFyeSAmJgogICAgICAgIG1lbWJlci5uYW1lID09ICdjaGVja1N0cmluZyc7CiAgfQoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgc3RyaW5nSW50ZXJwb2xhdGlvbkhlbHBlciA9PiBfZmluZEhlbHBlckZ1bmN0aW9uKCdTJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCB3cmFwRXhjZXB0aW9uSGVscGVyID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ3dyYXBFeGNlcHRpb24nKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHRocm93RXhwcmVzc2lvbkhlbHBlciA9PgogICAgICBfZmluZEhlbHBlckZ1bmN0aW9uKCd0aHJvd0V4cHJlc3Npb24nKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGNsb3N1cmVDb252ZXJ0ZXIgPT4KICAgICAgX2ZpbmRIZWxwZXJGdW5jdGlvbignY29udmVydERhcnRDbG9zdXJlVG9KUycpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgdHJhY2VGcm9tRXhjZXB0aW9uID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ2dldFRyYWNlRnJvbUV4Y2VwdGlvbicpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgc2V0UnVudGltZVR5cGVJbmZvID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ3NldFJ1bnRpbWVUeXBlSW5mbycpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgZ2V0UnVudGltZVR5cGVJbmZvID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ2dldFJ1bnRpbWVUeXBlSW5mbycpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgZ2V0VHlwZUFyZ3VtZW50QnlJbmRleCA9PgogICAgICBfZmluZEhlbHBlckZ1bmN0aW9uKCdnZXRUeXBlQXJndW1lbnRCeUluZGV4Jyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBjb21wdXRlU2lnbmF0dXJlID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ2NvbXB1dGVTaWduYXR1cmUnKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGdldFJ1bnRpbWVUeXBlQXJndW1lbnRzID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ2dldFJ1bnRpbWVUeXBlQXJndW1lbnRzJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBnZXRSdW50aW1lVHlwZUFyZ3VtZW50ID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ2dldFJ1bnRpbWVUeXBlQXJndW1lbnQnKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGdldFJ1bnRpbWVUeXBlQXJndW1lbnRJbnRlcmNlcHRlZCA9PgogICAgICBfZmluZEhlbHBlckZ1bmN0aW9uKCdnZXRSdW50aW1lVHlwZUFyZ3VtZW50SW50ZXJjZXB0ZWQnKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGFzc2VydElzU3VidHlwZSA9PiBfZmluZEhlbHBlckZ1bmN0aW9uKCdhc3NlcnRJc1N1YnR5cGUnKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGNoZWNrU3VidHlwZSA9PiBfZmluZEhlbHBlckZ1bmN0aW9uKCdjaGVja1N1YnR5cGUnKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGFzc2VydFN1YnR5cGUgPT4gX2ZpbmRIZWxwZXJGdW5jdGlvbignYXNzZXJ0U3VidHlwZScpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgc3VidHlwZUNhc3QgPT4gX2ZpbmRIZWxwZXJGdW5jdGlvbignc3VidHlwZUNhc3QnKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGZ1bmN0aW9uVHlwZVRlc3QgPT4KICAgICAgX2ZpbmRIZWxwZXJGdW5jdGlvbignZnVuY3Rpb25UeXBlVGVzdCcpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgZnV0dXJlT3JUZXN0ID0+IF9maW5kSGVscGVyRnVuY3Rpb24oJ2Z1dHVyZU9yVGVzdCcpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgY2hlY2tTdWJ0eXBlT2ZSdW50aW1lVHlwZSA9PgogICAgICBfZmluZEhlbHBlckZ1bmN0aW9uKCdjaGVja1N1YnR5cGVPZlJ1bnRpbWVUeXBlJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBhc3NlcnRTdWJ0eXBlT2ZSdW50aW1lVHlwZSA9PgogICAgICBfZmluZEhlbHBlckZ1bmN0aW9uKCdhc3NlcnRTdWJ0eXBlT2ZSdW50aW1lVHlwZScpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgc3VidHlwZU9mUnVudGltZVR5cGVDYXN0ID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ3N1YnR5cGVPZlJ1bnRpbWVUeXBlQ2FzdCcpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgY2hlY2tEZWZlcnJlZElzTG9hZGVkID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ2NoZWNrRGVmZXJyZWRJc0xvYWRlZCcpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgdGhyb3dOb1N1Y2hNZXRob2QgPT4KICAgICAgX2ZpbmRIZWxwZXJGdW5jdGlvbigndGhyb3dOb1N1Y2hNZXRob2QnKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGNyZWF0ZVJ1bnRpbWVUeXBlID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ2NyZWF0ZVJ1bnRpbWVUeXBlJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBmYWxsVGhyb3VnaEVycm9yID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oImdldEZhbGxUaHJvdWdoRXJyb3IiKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGNyZWF0ZUludm9jYXRpb25NaXJyb3IgPT4KICAgICAgX2ZpbmRIZWxwZXJGdW5jdGlvbignY3JlYXRlSW52b2NhdGlvbk1pcnJvcicpOwoKICBAb3ZlcnJpZGUKICBib29sIGlzQ3JlYXRlSW52b2NhdGlvbk1pcnJvckhlbHBlcihNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICByZXR1cm4gbWVtYmVyLmlzVG9wTGV2ZWwgJiYKICAgICAgICBtZW1iZXIubmFtZSA9PSAnX2NyZWF0ZUludm9jYXRpb25NaXJyb3InICYmCiAgICAgICAgbWVtYmVyLmxpYnJhcnkgPT0gY29yZUxpYnJhcnk7CiAgfQoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgY3JlYXRlVW5tYW5nbGVkSW52b2NhdGlvbk1pcnJvciA9PgogICAgICBfZmluZEhlbHBlckZ1bmN0aW9uKCdjcmVhdGVVbm1hbmdsZWRJbnZvY2F0aW9uTWlycm9yJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBjeWNsaWNUaHJvd0hlbHBlciA9PgogICAgICBfZmluZEhlbHBlckZ1bmN0aW9uKCJ0aHJvd0N5Y2xpY0luaXQiKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGRlZmluZVByb3BlcnR5ID0+IF9maW5kSGVscGVyRnVuY3Rpb24oJ2RlZmluZVByb3BlcnR5Jyk7CgogIEBvdmVycmlkZQogIGJvb2wgaXNFeHRyYWN0VHlwZUFyZ3VtZW50cyhGdW5jdGlvbkVudGl0eSBtZW1iZXIpIHsKICAgIHJldHVybiBtZW1iZXIubmFtZSA9PSAnZXh0cmFjdFR5cGVBcmd1bWVudHMnICYmCiAgICAgICAgbWVtYmVyLmxpYnJhcnkgPT0gaW50ZXJuYWxMaWJyYXJ5OwogIH0KCiAgLy8gVE9ETyhqb2hubml3aW50aGVyLHNyYSk6IFN1cHBvcnQgYXJiaXRyYXJ5IHR5cGUgYXJndW1lbnQgY291bnQuCiAgdm9pZCBfY2hlY2tUeXBlQXJndW1lbnRDb3VudChpbnQgdHlwZUFyZ3VtZW50Q291bnQpIHsKICAgIGFzc2VydCh0eXBlQXJndW1lbnRDb3VudCA+IDApOwogICAgaWYgKHR5cGVBcmd1bWVudENvdW50ID4gMjApIHsKICAgICAgZmFpbGVkQXQoCiAgICAgICAgICBOT19MT0NBVElPTl9TUEFOTkFCTEUsCiAgICAgICAgICAiVW5zdXBwb3J0ZWQgaW5zdGFudGlhdGlvbiBhcmd1bWVudCBjb3VudDogIgogICAgICAgICAgIiR7dHlwZUFyZ3VtZW50Q291bnR9Iik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXRJbnN0YW50aWF0aW9uQ2xhc3MoaW50IHR5cGVBcmd1bWVudENvdW50KSB7CiAgICBfY2hlY2tUeXBlQXJndW1lbnRDb3VudCh0eXBlQXJndW1lbnRDb3VudCk7CiAgICByZXR1cm4gX2ZpbmRIZWxwZXJDbGFzcygnSW5zdGFudGlhdGlvbiR0eXBlQXJndW1lbnRDb3VudCcpOwogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0SW5zdGFudGlhdGVGdW5jdGlvbihpbnQgdHlwZUFyZ3VtZW50Q291bnQpIHsKICAgIF9jaGVja1R5cGVBcmd1bWVudENvdW50KHR5cGVBcmd1bWVudENvdW50KTsKICAgIHJldHVybiBfZmluZEhlbHBlckZ1bmN0aW9uKCdpbnN0YW50aWF0ZSR0eXBlQXJndW1lbnRDb3VudCcpOwogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGluc3RhbnRpYXRlZEdlbmVyaWNGdW5jdGlvblR5cGUgPT4KICAgICAgX2ZpbmRIZWxwZXJGdW5jdGlvbignaW5zdGFudGlhdGVkR2VuZXJpY0Z1bmN0aW9uVHlwZScpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgZXh0cmFjdEZ1bmN0aW9uVHlwZU9iamVjdEZyb21JbnRlcm5hbCA9PgogICAgICBfZmluZEhlbHBlckZ1bmN0aW9uKCdleHRyYWN0RnVuY3Rpb25UeXBlT2JqZWN0RnJvbUludGVybmFsJyk7CgogIEBvdmVycmlkZQogIGJvb2wgaXNJbnN0YW50aWF0aW9uQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gY2xzLmxpYnJhcnkgPT0gX2pzSGVscGVyTGlicmFyeSAmJgogICAgICAgIGNscy5uYW1lICE9ICdJbnN0YW50aWF0aW9uJyAmJgogICAgICAgIGNscy5uYW1lLnN0YXJ0c1dpdGgoJ0luc3RhbnRpYXRpb24nKTsKICB9CgogIC8vIEZyb20gZGFydDpfaW50ZXJuYWwKCiAgQ2xhc3NFbnRpdHkgX3N5bWJvbEltcGxlbWVudGF0aW9uQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IHN5bWJvbEltcGxlbWVudGF0aW9uQ2xhc3MgPT4KICAgICAgX3N5bWJvbEltcGxlbWVudGF0aW9uQ2xhc3MgPz89IF9maW5kQ2xhc3MoaW50ZXJuYWxMaWJyYXJ5LCAnU3ltYm9sJyk7CgogIENsYXNzRW50aXR5IF9leHRlcm5hbE5hbWVDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgZXh0ZXJuYWxOYW1lQ2xhc3MgPT4KICAgICAgX2V4dGVybmFsTmFtZUNsYXNzID8/PSBfZmluZENsYXNzKGludGVybmFsTGlicmFyeSwgJ0V4dGVybmFsTmFtZScpOwogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0IGV4dGVybmFsTmFtZVR5cGUgPT4gX2dldFJhd1R5cGUoZXh0ZXJuYWxOYW1lQ2xhc3MpOwoKICBAb3ZlcnJpZGUKICBDb25zdHJ1Y3RvckVudGl0eSBnZXQgc3ltYm9sVmFsaWRhdGVkQ29uc3RydWN0b3IgPT4KICAgICAgX3N5bWJvbFZhbGlkYXRlZENvbnN0cnVjdG9yID8/PQogICAgICAgICAgX2ZpbmRDb25zdHJ1Y3RvcihzeW1ib2xJbXBsZW1lbnRhdGlvbkNsYXNzLCAndmFsaWRhdGVkJyk7CgogIC8vLyBSZXR1cm5zIHRoZSBmaWVsZCB0aGF0IGhvbGRzIHRoZSBpbnRlcm5hbCBuYW1lIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcwogIC8vLyBmb3IgYFN5bWJvbGAuCiAgRmllbGRFbnRpdHkgX3N5bWJvbEltcGxlbWVudGF0aW9uRmllbGQ7CiAgRmllbGRFbnRpdHkgZ2V0IHN5bWJvbEltcGxlbWVudGF0aW9uRmllbGQgPT4gX3N5bWJvbEltcGxlbWVudGF0aW9uRmllbGQgPz89CiAgICAgIF9lbnYubG9va3VwTG9jYWxDbGFzc01lbWJlcihzeW1ib2xJbXBsZW1lbnRhdGlvbkNsYXNzLCAnX25hbWUnLAogICAgICAgICAgcmVxdWlyZWQ6IHRydWUpOwoKICBDb25zdHJ1Y3RvckVudGl0eSBfc3ltYm9sVmFsaWRhdGVkQ29uc3RydWN0b3I7CiAgQG92ZXJyaWRlCiAgYm9vbCBpc1N5bWJvbFZhbGlkYXRlZENvbnN0cnVjdG9yKENvbnN0cnVjdG9yRW50aXR5IGVsZW1lbnQpIHsKICAgIGlmIChfc3ltYm9sVmFsaWRhdGVkQ29uc3RydWN0b3IgIT0gbnVsbCkgewogICAgICByZXR1cm4gZWxlbWVudCA9PSBfc3ltYm9sVmFsaWRhdGVkQ29uc3RydWN0b3I7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLyBGcm9tIGRhcnQ6X25hdGl2ZV90eXBlZF9kYXRhCgogIENsYXNzRW50aXR5IF90eXBlZEFycmF5T2ZJbnRDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgdHlwZWRBcnJheU9mSW50Q2xhc3MgPT4gX3R5cGVkQXJyYXlPZkludENsYXNzID8/PSBfZmluZENsYXNzKAogICAgICBfZW52Lmxvb2t1cExpYnJhcnkoVXJpcy5kYXJ0X19uYXRpdmVfdHlwZWRfZGF0YSwgcmVxdWlyZWQ6IHRydWUpLAogICAgICAnTmF0aXZlVHlwZWRBcnJheU9mSW50Jyk7CgogIENsYXNzRW50aXR5IF90eXBlZEFycmF5T2ZEb3VibGVDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgdHlwZWRBcnJheU9mRG91YmxlQ2xhc3MgPT4KICAgICAgX3R5cGVkQXJyYXlPZkRvdWJsZUNsYXNzID8/PSBfZmluZENsYXNzKAogICAgICAgICAgX2Vudi5sb29rdXBMaWJyYXJ5KFVyaXMuZGFydF9fbmF0aXZlX3R5cGVkX2RhdGEsIHJlcXVpcmVkOiB0cnVlKSwKICAgICAgICAgICdOYXRpdmVUeXBlZEFycmF5T2ZEb3VibGUnKTsKCiAgLy8gRnJvbSBkYXJ0Ol9qc19lbWJlZGRlZF9uYW1lcwoKICBDbGFzc0VudGl0eSBfanNHZXROYW1lRW51bTsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQganNHZXROYW1lRW51bSA9PiBfanNHZXROYW1lRW51bSA/Pz0gX2ZpbmRDbGFzcygKICAgICAgX2Vudi5sb29rdXBMaWJyYXJ5KFVyaXMuZGFydF9fanNfZW1iZWRkZWRfbmFtZXMsIHJlcXVpcmVkOiB0cnVlKSwKICAgICAgJ0pzR2V0TmFtZScpOwoKICBDbGFzc0VudGl0eSBfanNCdWlsdGluRW51bTsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQganNCdWlsdGluRW51bSA9PiBfanNCdWlsdGluRW51bSA/Pz0gX2ZpbmRDbGFzcygKICAgICAgX2Vudi5sb29rdXBMaWJyYXJ5KFVyaXMuZGFydF9fanNfZW1iZWRkZWRfbmFtZXMsIHJlcXVpcmVkOiB0cnVlKSwKICAgICAgJ0pzQnVpbHRpbicpOwoKICBib29sIF9tZXRhQW5ub3RhdGlvbkNoZWNrZWQgPSBmYWxzZTsKICBDbGFzc0VudGl0eSBfbWV0YU5vSW5saW5lQ2xhc3M7CiAgQ2xhc3NFbnRpdHkgX21ldGFUcnlJbmxpbmVDbGFzczsKCiAgdm9pZCBfZW5zdXJlTWV0YUFubm90YXRpb25zKCkgewogICAgaWYgKCFfbWV0YUFubm90YXRpb25DaGVja2VkKSB7CiAgICAgIF9tZXRhQW5ub3RhdGlvbkNoZWNrZWQgPSB0cnVlOwogICAgICBMaWJyYXJ5RW50aXR5IGxpYnJhcnkgPSBfZW52Lmxvb2t1cExpYnJhcnkoVXJpcy5wYWNrYWdlX21ldGFfZGFydDJqcyk7CiAgICAgIGlmIChsaWJyYXJ5ICE9IG51bGwpIHsKICAgICAgICBfbWV0YU5vSW5saW5lQ2xhc3MgPSBfZW52Lmxvb2t1cENsYXNzKGxpYnJhcnksICdfTm9JbmxpbmUnKTsKICAgICAgICBfbWV0YVRyeUlubGluZUNsYXNzID0gX2Vudi5sb29rdXBDbGFzcyhsaWJyYXJ5LCAnX1RyeUlubGluZScpOwogICAgICAgIGlmIChfbWV0YU5vSW5saW5lQ2xhc3MgPT0gbnVsbCB8fCBfbWV0YVRyeUlubGluZUNsYXNzID09IG51bGwpIHsKICAgICAgICAgIC8vIFRoaXMgaXMgbm90IHRoZSBwYWNrYWdlIHlvdSdyZSBsb29raW5nIGZvci4KICAgICAgICAgIF9tZXRhTm9JbmxpbmVDbGFzcyA9IG51bGw7CiAgICAgICAgICBfbWV0YVRyeUlubGluZUNsYXNzID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBtZXRhTm9JbmxpbmVDbGFzcyB7CiAgICBfZW5zdXJlTWV0YUFubm90YXRpb25zKCk7CiAgICByZXR1cm4gX21ldGFOb0lubGluZUNsYXNzOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IG1ldGFUcnlJbmxpbmVDbGFzcyB7CiAgICBfZW5zdXJlTWV0YUFubm90YXRpb25zKCk7CiAgICByZXR1cm4gX21ldGFUcnlJbmxpbmVDbGFzczsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNGb3JlaWduKE1lbWJlckVudGl0eSBlbGVtZW50KSA9PiBlbGVtZW50LmxpYnJhcnkgPT0gZm9yZWlnbkxpYnJhcnk7CgogIEBvdmVycmlkZQogIGJvb2wgaXNGb3JlaWduSGVscGVyKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIHJldHVybiBtZW1iZXIubGlicmFyeSA9PSBmb3JlaWduTGlicmFyeSB8fAogICAgICAgIGlzQ3JlYXRlSW52b2NhdGlvbk1pcnJvckhlbHBlcihtZW1iZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0V4dGVybmFsQWxsb3dlZChGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikgewogICAgcmV0dXJuIGlzRm9yZWlnbkhlbHBlcihmdW5jdGlvbikgfHwKICAgICAgICAoZnVuY3Rpb24gaXMgQ29uc3RydWN0b3JFbnRpdHkgJiYKICAgICAgICAgICAgZnVuY3Rpb24uaXNGcm9tRW52aXJvbm1lbnRDb25zdHJ1Y3RvcikgfHwKICAgICAgICBtYXliZUVuYWJsZU5hdGl2ZShmdW5jdGlvbi5saWJyYXJ5LmNhbm9uaWNhbFVyaSkgfHwKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhpcyB3aGVuIGltcG9ydGluZyBkYXJ0Om1pcnJvcnMgaXMKICAgICAgICAvLyBhIGNvbXBpbGUtdGltZSBlcnJvci4KICAgICAgICBmdW5jdGlvbi5saWJyYXJ5LmNhbm9uaWNhbFVyaSA9PSBVcmlzLmRhcnRfbWlycm9yczsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3JFcUhhbmRsZXNOdWxsQXJndW1lbnQoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pIHsKICAgIGFzc2VydChmdW5jdGlvbi5uYW1lID09ICc9PScsCiAgICAgICAgZmFpbGVkQXQoZnVuY3Rpb24sICJVbmV4cGVjdGVkIGZ1bmN0aW9uICRmdW5jdGlvbi4iKSk7CiAgICBDbGFzc0VudGl0eSBjbHMgPSBmdW5jdGlvbi5lbmNsb3NpbmdDbGFzczsKICAgIHJldHVybiBjbHMgPT0gb2JqZWN0Q2xhc3MgfHwKICAgICAgICBjbHMgPT0ganNJbnRlcmNlcHRvckNsYXNzIHx8CiAgICAgICAgY2xzID09IGpzTnVsbENsYXNzOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0RGVmYXVsdFN1cGVyY2xhc3MoCiAgICAgIENsYXNzRW50aXR5IGNscywgTmF0aXZlQmFzaWNEYXRhIG5hdGl2ZUJhc2ljRGF0YSkgewogICAgaWYgKG5hdGl2ZUJhc2ljRGF0YS5pc0pzSW50ZXJvcENsYXNzKGNscykpIHsKICAgICAgcmV0dXJuIGpzSmF2YVNjcmlwdE9iamVjdENsYXNzOwogICAgfQogICAgLy8gTmF0aXZlIGNsYXNzZXMgaW5oZXJpdCBmcm9tIEludGVyY2VwdG9yLgogICAgcmV0dXJuIG5hdGl2ZUJhc2ljRGF0YS5pc05hdGl2ZUNsYXNzKGNscykKICAgICAgICA/IGpzSW50ZXJjZXB0b3JDbGFzcwogICAgICAgIDogb2JqZWN0Q2xhc3M7CiAgfQp9CgovLy8gSW50ZXJmYWNlIGZvciBhY2Nlc3NpbmcgbGlicmFyaWVzLCBjbGFzc2VzIGFuZCBtZW1iZXJzLgovLy8KLy8vIFRoZSBlbGVtZW50IGVudmlyb25tZW50IG1ha2VzIHByaXZhdGUgYW5kIGluamVjdGVkIG1lbWJlcnMgZGlyZWN0bHkKLy8vIGF2YWlsYWJsZSBhbmQgc2hvdWxkIHRoZXJlZm9yZSBub3QgYmUgdXNlZCB0byBkZXRlcm1pbmUgc2NvcGVzLgovLy8KLy8vIFRoZSBwcm9wZXJ0aWVzIGV4cG9zZWQgYXJlIERhcnQtY2VudHJpYyBhbmQgc2hvdWxkIHRoZXJlZm9yZSwgbG9uZy10ZXJtLCBub3QKLy8vIGJlIHVzZWQgZHVyaW5nIGNvZGVnZW4sIGV4cGVjdCBmb3IgbWlycm9ycy4KLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3BsaXQgdGhpcyBpbnRvIGFuIGVsZW1lbnQgZW52aXJvbm1lbnQgYW5kIGEgdHlwZSBxdWVyeQovLyBpbnRlcmZhY2UsIHRoZSBmaXJzdCBzaG91bGQgb25seSBiZSB1c2VkIGR1cmluZyByZXNvbHV0aW9uIGFuZCB0aGUgbGF0dGVyIGluCi8vIGJvdGggcmVzb2x1dGlvbiBhbmQgY29kZWdlbi4KYWJzdHJhY3QgY2xhc3MgRWxlbWVudEVudmlyb25tZW50IHsKICAvLy8gUmV0dXJucyB0aGUgbWFpbiBsaWJyYXJ5IGZvciB0aGUgY29tcGlsYXRpb24uCiAgTGlicmFyeUVudGl0eSBnZXQgbWFpbkxpYnJhcnk7CgogIC8vLyBSZXR1cm5zIHRoZSBtYWluIG1ldGhvZCBmb3IgdGhlIGNvbXBpbGF0aW9uLgogIEZ1bmN0aW9uRW50aXR5IGdldCBtYWluRnVuY3Rpb247CgogIC8vLyBSZXR1cm5zIGFsbCBrbm93biBsaWJyYXJpZXMuCiAgSXRlcmFibGU8TGlicmFyeUVudGl0eT4gZ2V0IGxpYnJhcmllczsKCiAgLy8vIFJldHVybnMgdGhlIGxpYnJhcnkgbmFtZSBvZiBbbGlicmFyeV0gb3IgJycgaWYgdGhlIGxpYnJhcnkgaXMgdW5uYW1lZC4KICBTdHJpbmcgZ2V0TGlicmFyeU5hbWUoTGlicmFyeUVudGl0eSBsaWJyYXJ5KTsKCiAgLy8vIExvb2t1cCB0aGUgbGlicmFyeSB3aXRoIHRoZSBjYW5vbmljYWwgW3VyaV0sIGZhaWwgaWYgdGhlIGxpYnJhcnkgaXMKICAvLy8gbWlzc2luZyBhbmQgW3JlcXVpcmVkXTsKICBMaWJyYXJ5RW50aXR5IGxvb2t1cExpYnJhcnkoVXJpIHVyaSwge2Jvb2wgcmVxdWlyZWQ6IGZhbHNlfSk7CgogIC8vLyBDYWxscyBbZl0gZm9yIGV2ZXJ5IGNsYXNzIGRlY2xhcmVkIGluIFtsaWJyYXJ5XS4KICB2b2lkIGZvckVhY2hDbGFzcyhMaWJyYXJ5RW50aXR5IGxpYnJhcnksIHZvaWQgZihDbGFzc0VudGl0eSBjbHMpKTsKCiAgLy8vIExvb2t1cCB0aGUgY2xhc3MgW25hbWVdIGluIFtsaWJyYXJ5XSwgZmFpbCBpZiB0aGUgY2xhc3MgaXMgbWlzc2luZyBhbmQKICAvLy8gW3JlcXVpcmVkXS4KICBDbGFzc0VudGl0eSBsb29rdXBDbGFzcyhMaWJyYXJ5RW50aXR5IGxpYnJhcnksIFN0cmluZyBuYW1lLAogICAgICB7Ym9vbCByZXF1aXJlZDogZmFsc2V9KTsKCiAgLy8vIENhbGxzIFtmXSBmb3IgZXZlcnkgdG9wIGxldmVsIG1lbWJlciBpbiBbbGlicmFyeV0uCiAgdm9pZCBmb3JFYWNoTGlicmFyeU1lbWJlcihMaWJyYXJ5RW50aXR5IGxpYnJhcnksIHZvaWQgZihNZW1iZXJFbnRpdHkgbWVtYmVyKSk7CgogIC8vLyBMb29rdXAgdGhlIG1lbWJlciBbbmFtZV0gaW4gW2xpYnJhcnldLCBmYWlsIGlmIHRoZSBjbGFzcyBpcyBtaXNzaW5nIGFuZAogIC8vLyBbcmVxdWlyZWRdLgogIE1lbWJlckVudGl0eSBsb29rdXBMaWJyYXJ5TWVtYmVyKExpYnJhcnlFbnRpdHkgbGlicmFyeSwgU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2UsIGJvb2wgcmVxdWlyZWQ6IGZhbHNlfSk7CgogIC8vLyBMb29rdXAgdGhlIG1lbWJlciBbbmFtZV0gaW4gW2Nsc10sIGZhaWwgaWYgdGhlIGNsYXNzIGlzIG1pc3NpbmcgYW5kCiAgLy8vIFtyZXF1aXJlZF0uCiAgTWVtYmVyRW50aXR5IGxvb2t1cExvY2FsQ2xhc3NNZW1iZXIoQ2xhc3NFbnRpdHkgY2xzLCBTdHJpbmcgbmFtZSwKICAgICAge2Jvb2wgc2V0dGVyOiBmYWxzZSwgYm9vbCByZXF1aXJlZDogZmFsc2V9KTsKCiAgLy8vIExvb2t1cCB0aGUgbWVtYmVyIFtuYW1lXSBpbiBbY2xzXSBhbmQgaXRzIHN1cGVyY2xhc3Nlcy4KICAvLy8KICAvLy8gUmV0dXJuIGBudWxsYCBpZiB0aGUgbWVtYmVyIGlzIG5vdCBmb3VuZCBpbiB0aGUgY2xhc3Mgb3IgYW55IHN1cGVyY2xhc3MuCiAgTWVtYmVyRW50aXR5IGxvb2t1cENsYXNzTWVtYmVyKENsYXNzRW50aXR5IGNscywgU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2V9KSB7CiAgICB2YXIgZW50aXR5ID0gbG9va3VwTG9jYWxDbGFzc01lbWJlcihjbHMsIG5hbWUsIHNldHRlcjogc2V0dGVyKTsKICAgIGlmIChlbnRpdHkgIT0gbnVsbCkgcmV0dXJuIGVudGl0eTsKCiAgICB2YXIgc3VwZXJjbGFzcyA9IGdldFN1cGVyQ2xhc3MoY2xzKTsKICAgIGlmIChzdXBlcmNsYXNzID09IG51bGwpIHJldHVybiBudWxsOwoKICAgIHJldHVybiBsb29rdXBDbGFzc01lbWJlcihzdXBlcmNsYXNzLCBuYW1lLCBzZXR0ZXI6IHNldHRlcik7CiAgfQoKICAvLy8gTG9va3VwIHRoZSBjb25zdHJ1Y3RvciBbbmFtZV0gaW4gW2Nsc10sIGZhaWwgaWYgdGhlIGNsYXNzIGlzIG1pc3NpbmcgYW5kCiAgLy8vIFtyZXF1aXJlZF0uCiAgQ29uc3RydWN0b3JFbnRpdHkgbG9va3VwQ29uc3RydWN0b3IoQ2xhc3NFbnRpdHkgY2xzLCBTdHJpbmcgbmFtZSwKICAgICAge2Jvb2wgcmVxdWlyZWQ6IGZhbHNlfSk7CgogIC8vLyBDYWxscyBbZl0gZm9yIGVhY2ggY2xhc3MgbWVtYmVyIGRlY2xhcmVkIGluIFtjbHNdLgogIHZvaWQgZm9yRWFjaExvY2FsQ2xhc3NNZW1iZXIoQ2xhc3NFbnRpdHkgY2xzLCB2b2lkIGYoTWVtYmVyRW50aXR5IG1lbWJlcikpOwoKICAvLy8gQ2FsbHMgW2ZdIGZvciBlYWNoIGNsYXNzIG1lbWJlciBkZWNsYXJlZCBvciBpbmhlcml0ZWQgaW4gW2Nsc10gdG9nZXRoZXIKICAvLy8gd2l0aCB0aGUgY2xhc3MgdGhhdCBkZWNsYXJlZCB0aGUgbWVtYmVyLgogIC8vLwogIC8vLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGlzIHNob3VsZCBub3QgaW5jbHVkZSBzdGF0aWMgbWVtYmVycyBvZgogIC8vLyBzdXBlcmNsYXNzZXMuCiAgdm9pZCBmb3JFYWNoQ2xhc3NNZW1iZXIoCiAgICAgIENsYXNzRW50aXR5IGNscywgdm9pZCBmKENsYXNzRW50aXR5IGRlY2xhcmVyLCBNZW1iZXJFbnRpdHkgbWVtYmVyKSk7CgogIC8vLyBDYWxscyBbZl0gZm9yIGV2ZXJ5IGNvbnN0cnVjdG9yIGRlY2xhcmVkIGluIFtjbHNdLgogIC8vLwogIC8vLyBXaWxsIGVuc3VyZSB0aGF0IHRoZSBjbGFzcyBhbmQgYWxsIGNvbnN0cnVjdG9ycyBhcmUgcmVzb2x2ZWQgaWYKICAvLy8gW2Vuc3VyZVJlc29sdmVkXSBpcyBgdHJ1ZWAuCiAgdm9pZCBmb3JFYWNoQ29uc3RydWN0b3IoCiAgICAgIENsYXNzRW50aXR5IGNscywgdm9pZCBmKENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yKSk7CgogIC8vLyBSZXR1cm5zIHRoZSBzdXBlcmNsYXNzIG9mIFtjbHNdLgogIC8vLwogIC8vLyBJZiBbc2tpcFVubmFtZWRNaXhpbkFwcGxpY2F0aW9uc10gaXMgYHRydWVgLCB1bm5hbWVkIG1peGluIGFwcGxpY2F0aW9ucwogIC8vLyBhcmUgZXhjbHVkZWQsIGZvciBpbnN0YW5jZSBmb3IgdGhlc2UgY2xhc3NlcwogIC8vLwogIC8vLyAgICAgY2xhc3MgUyB7fQogIC8vLyAgICAgY2xhc3MgTSB7fQogIC8vLyAgICAgY2xhc3MgQyBleHRlbmRzIFMgd2l0aCBNIHt9CiAgLy8vCiAgLy8vIHRoZSByZXN1bHQgb2YgYGdldFN1cGVyQ2xhc3MoQylgIGlzIHRoZSB1bm5hbWVkIG1peGluIGFwcGxpY2F0aW9uCiAgLy8vIHR5cGljYWxseSBuYW1lZCBgUytNYCBhbmQgYGdldFN1cGVyQ2xhc3MoUytNKWAgaXMgYFNgLCB3aGVyZWFzCiAgLy8vIHRoZSByZXN1bHQgb2YgYGdldFN1cGVyQ2xhc3MoQywgc2tpcFVubmFtZWRNaXhpbkFwcGxpY2F0aW9uczogZmFsc2UpYCBpcwogIC8vLyBgU2AuCiAgQ2xhc3NFbnRpdHkgZ2V0U3VwZXJDbGFzcyhDbGFzc0VudGl0eSBjbHMsCiAgICAgIHtib29sIHNraXBVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbnM6IGZhbHNlfSk7CgogIC8vLyBDYWxscyBbZl0gZm9yIGVhY2ggc3VwZXJ0eXBlIG9mIFtjbHNdLgogIHZvaWQgZm9yRWFjaFN1cGVydHlwZShDbGFzc0VudGl0eSBjbHMsIHZvaWQgZihJbnRlcmZhY2VUeXBlIHN1cGVydHlwZSkpOwoKICAvLy8gQ3JlYXRlIHRoZSBpbnN0YW50aWF0aW9uIG9mIFtjbHNdIHdpdGggdGhlIGdpdmVuIFt0eXBlQXJndW1lbnRzXS4KICBJbnRlcmZhY2VUeXBlIGNyZWF0ZUludGVyZmFjZVR5cGUoCiAgICAgIENsYXNzRW50aXR5IGNscywgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyk7CgogIC8vLyBSZXR1cm5zIHRoZSBgZHluYW1pY2AgdHlwZS4KICBEYXJ0VHlwZSBnZXQgZHluYW1pY1R5cGU7CgogIC8vLyBSZXR1cm5zIHRoZSAncmF3IHR5cGUnIG9mIFtjbHNdLiBUaGF0IGlzLCB0aGUgaW5zdGFudGlhdGlvbiBvZiBbY2xzXQogIC8vLyB3aGVyZSBhbGwgdHlwZXMgYXJndW1lbnRzIGFyZSBgZHluYW1pY2AuCiAgSW50ZXJmYWNlVHlwZSBnZXRSYXdUeXBlKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIHRoZSAndGhpcyB0eXBlJyBvZiBbY2xzXS4gVGhhdCBpcywgdGhlIGluc3RhbnRpYXRpb24gb2YgW2Nsc10KICAvLy8gd2hlcmUgdGhlIHR5cGUgYXJndW1lbnRzIGFyZSB0aGUgdHlwZSB2YXJpYWJsZXMgb2YgW2Nsc10uCiAgSW50ZXJmYWNlVHlwZSBnZXRUaGlzVHlwZShDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2Nsc10gaXMgZ2VuZXJpYy4KICBib29sIGlzR2VuZXJpY0NsYXNzKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbY2xzXSBpcyBhIG1peGluIGFwcGxpY2F0aW9uIChuYW1lZCBvciB1bm5hbWVkKS4KICBib29sIGlzTWl4aW5BcHBsaWNhdGlvbihDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2Nsc10gaXMgYW4gdW5uYW1lZCBtaXhpbiBhcHBsaWNhdGlvbi4KICBib29sIGlzVW5uYW1lZE1peGluQXBwbGljYXRpb24oQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFRoZSB1cHBlciBib3VuZCBvbiB0aGUgW3R5cGVWYXJpYWJsZV0uIElmIG5vdCBleHBsaWNpdGx5IGRlY2xhcmVkLCB0aGlzIGlzCiAgLy8vIGBPYmplY3RgLgogIERhcnRUeXBlIGdldFR5cGVWYXJpYWJsZUJvdW5kKFR5cGVWYXJpYWJsZUVudGl0eSB0eXBlVmFyaWFibGUpOwoKICAvLy8gUmV0dXJucyB0aGUgdHlwZSBvZiBbZnVuY3Rpb25dLgogIEZ1bmN0aW9uVHlwZSBnZXRGdW5jdGlvblR5cGUoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pOwoKICAvLy8gUmV0dXJucyB0aGUgZnVuY3Rpb24gdHlwZSB2YXJpYWJsZXMgZGVmaW5lZCBvbiBbZnVuY3Rpb25dLgogIExpc3Q8VHlwZVZhcmlhYmxlVHlwZT4gZ2V0RnVuY3Rpb25UeXBlVmFyaWFibGVzKEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uKTsKCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIFtsb2NhbF0gZnVuY3Rpb24uCiAgRnVuY3Rpb25UeXBlIGdldExvY2FsRnVuY3Rpb25UeXBlKExvY2FsIGxvY2FsKTsKCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgW2ZpZWxkXS4KICBEYXJ0VHlwZSBnZXRGaWVsZFR5cGUoRmllbGRFbnRpdHkgZmllbGQpOwoKICAvLy8gUmV0dXJucyB0aGUgJ3VuYWxpYXNlZCcgdHlwZSBvZiBbdHlwZV0uIEZvciB0eXBlZGVmcyB0aGlzIGlzIHRoZSBmdW5jdGlvbgogIC8vLyB0eXBlIGl0IGlzIGFuIGFsaWFzIG9mLCBmb3Igb3RoZXIgdHlwZXMgaXQgaXMgdGhlIHR5cGUgaXRzZWxmLgogIC8vLwogIC8vLyBVc2UgdGhpcyBkdXJpbmcgcmVzb2x1dGlvbiB0byBlbnN1cmUgdGhhdCB0aGUgYWxpYXMgaGFzIGJlZW4gY29tcHV0ZWQuCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMgd2hlbiB0aGUgcmVzb2x2ZXIgaXMgcmVtb3ZlZC4KICBEYXJ0VHlwZSBnZXRVbmFsaWFzZWRUeXBlKERhcnRUeXBlIHR5cGUpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2Nsc10gaXMgYSBEYXJ0IGVudW0gY2xhc3MuCiAgYm9vbCBpc0VudW1DbGFzcyhDbGFzc0VudGl0eSBjbHMpOwp9CgphYnN0cmFjdCBjbGFzcyBLRWxlbWVudEVudmlyb25tZW50IGV4dGVuZHMgRWxlbWVudEVudmlyb25tZW50IHsKICAvLy8gQ2FsbHMgW2ZdIGZvciBlYWNoIGNsYXNzIHRoYXQgaXMgbWl4ZWQgaW50byBbY2xzXSBvciBvbmUgb2YgaXRzCiAgLy8vIHN1cGVyY2xhc3Nlcy4KICB2b2lkIGZvckVhY2hNaXhpbihDbGFzc0VudGl0eSBjbHMsIHZvaWQgZihDbGFzc0VudGl0eSBtaXhpbikpOwoKICAvLy8gR2V0cyB0aGUgY29uc3RhbnQgdmFsdWUgb2YgW2ZpZWxkXSwgb3IgYG51bGxgIGlmIFtmaWVsZF0gaXMgbm9uLWNvbnN0LgogIENvbnN0YW50RXhwcmVzc2lvbiBnZXRGaWVsZENvbnN0YW50Rm9yVGVzdGluZyhGaWVsZEVudGl0eSBmaWVsZCk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbbWVtYmVyXSBhIHRoZSBzeW50aGV0aWMgZ2V0dGVyIGBsb2FkTGlicmFyeWAgaW5qZWN0ZWQKICAvLy8gb24gZGVmZXJyZWQgbGlicmFyaWVzLgogIGJvb2wgaXNEZWZlcnJlZExvYWRMaWJyYXJ5R2V0dGVyKE1lbWJlckVudGl0eSBtZW1iZXIpOwoKICAvLy8gUmV0dXJucyB0aGUgaW1wb3J0cyBzZWVuIGluIFtsaWJyYXJ5XQogIEl0ZXJhYmxlPEltcG9ydEVudGl0eT4gZ2V0SW1wb3J0cyhMaWJyYXJ5RW50aXR5IGxpYnJhcnkpOwoKICAvLy8gUmV0dXJucyB0aGUgbWV0YWRhdGEgY29uc3RhbnRzIGRlY2xhcmVkIG9uIFtsaWJyYXJ5XS4KICBJdGVyYWJsZTxDb25zdGFudFZhbHVlPiBnZXRMaWJyYXJ5TWV0YWRhdGEoTGlicmFyeUVudGl0eSBsaWJyYXJ5KTsKCiAgLy8vIFJldHVybnMgdGhlIG1ldGFkYXRhIGNvbnN0YW50cyBkZWNsYXJlZCBvbiBbY2xzXS4KICBJdGVyYWJsZTxDb25zdGFudFZhbHVlPiBnZXRDbGFzc01ldGFkYXRhKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIHRoZSBtZXRhZGF0YSBjb25zdGFudHMgZGVjbGFyZWQgb24gW21lbWJlcl0uCiAgSXRlcmFibGU8Q29uc3RhbnRWYWx1ZT4gZ2V0TWVtYmVyTWV0YWRhdGEoTWVtYmVyRW50aXR5IG1lbWJlciwKICAgICAge2Jvb2wgaW5jbHVkZVBhcmFtZXRlck1ldGFkYXRhOiBmYWxzZX0pOwp9CgphYnN0cmFjdCBjbGFzcyBKRWxlbWVudEVudmlyb25tZW50IGV4dGVuZHMgRWxlbWVudEVudmlyb25tZW50IHsKICAvLy8gQ2FsbHMgW2ZdIGZvciBlYWNoIGNsYXNzIG1lbWJlciBhZGRlZCB0byBbY2xzXSBkdXJpbmcgY29tcGlsYXRpb24uCiAgdm9pZCBmb3JFYWNoSW5qZWN0ZWRDbGFzc01lbWJlcihDbGFzc0VudGl0eSBjbHMsIHZvaWQgZihNZW1iZXJFbnRpdHkgbWVtYmVyKSk7CgogIC8vLyBDYWxscyBbZl0gZm9yIGV2ZXJ5IGNvbnN0cnVjdG9yIGJvZHkgaW4gW2Nsc10uCiAgdm9pZCBmb3JFYWNoQ29uc3RydWN0b3JCb2R5KAogICAgICBDbGFzc0VudGl0eSBjbHMsIHZvaWQgZihDb25zdHJ1Y3RvckJvZHlFbnRpdHkgY29uc3RydWN0b3JCb2R5KSk7CgogIC8vLyBDYWxscyBbZl0gZm9yIGVhY2ggbmVzdGVkIGNsb3N1cmUgaW4gW21lbWJlcl0uCiAgdm9pZCBmb3JFYWNoTmVzdGVkQ2xvc3VyZSgKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciwgdm9pZCBmKEZ1bmN0aW9uRW50aXR5IGNsb3N1cmUpKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtjbHNdIGlzIGEgbWl4aW4gYXBwbGljYXRpb24gdGhhdCBtaXhlcyBpbiBtZXRob2RzIHdpdGgKICAvLy8gc3VwZXIgY2FsbHMuCiAgYm9vbCBpc1N1cGVyTWl4aW5BcHBsaWNhdGlvbihDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyB0aGUgJ2VmZmVjdGl2ZScgbWl4aW4gY2xhc3MgaWYgW2Nsc10gaXMgYSBtaXhpbiBhcHBsaWNhdGlvbiwgYW5kCiAgLy8vIGBudWxsYCBvdGhlcndpc2UuCiAgLy8vCiAgLy8vIFRoZSAnZWZmZWN0aXZlJyBtaXhpbiBjbGFzcyBpcyB0aGUgY2xhc3MgZnJvbSB3aGljaCBtZW1iZXJzIGFyZSBtaXhlZCBpbi4KICAvLy8gTm9ybWFsbHkgdGhpcyBpcyB0aGUgbWl4aW4gY2xhc3MgaXRzZWxmLCBidXQgbm90IGlmIHRoZSBtaXhpbiBjbGFzcyBpdHNlbGYKICAvLy8gaXMgYSBtaXhpbiBhcHBsaWNhdGlvbi4KICAvLy8KICAvLy8gQ29uc2lkZXIgdGhpcyBoaWVyYXJjaHk6CiAgLy8vCiAgLy8vICAgICBjbGFzcyBBIHt9CiAgLy8vICAgICBjbGFzcyBCID0gT2JqZWN0IHdpdGggQSB7fQogIC8vLyAgICAgY2xhc3MgQyA9IE9iamVjdCB3aXRoIEIge30KICAvLy8KICAvLy8gVGhlIG1peGluIGNsYXNzZXMgb2YgYEJgIGFuZCBgQ2AgYXJlIGBBYCBhbmQgYEJgLCByZXNwZWN0aXZlbHksIGJ1dCB0aGUKICAvLy8gX2VmZmVjdGl2ZV8gbWl4aW4gY2xhc3Mgb2YgYm90aCBpcyBgQWAuCiAgQ2xhc3NFbnRpdHkgZ2V0RWZmZWN0aXZlTWl4aW5DbGFzcyhDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gVGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgW3R5cGVWYXJpYWJsZV0uCiAgLy8vCiAgLy8vIFRoaXMgaXMgdGhlIHR5cGUgdXNlZCBhcyB0aGUgZGVmYXVsdCB0eXBlIGFyZ3VtZW50IHdoZW4gbm8gZXhwbGljaXQgdHlwZQogIC8vLyBhcmd1bWVudCBpcyBwYXNzZWQuCiAgRGFydFR5cGUgZ2V0VHlwZVZhcmlhYmxlRGVmYXVsdFR5cGUoVHlwZVZhcmlhYmxlRW50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Tk8zSwIBKXBhY2thZ2U6Y29tcGlsZXIvc3JjL2NvbW1vbl9lbGVtZW50cy5kYXJ0MHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2RlZmVycmVkX2xvYWQuZGFydMAA+iEvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkZWZlcnJlZF9sb2FkOwoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nIHNob3cgUXVldWU7CgppbXBvcnQgJ2NvbW1vbi90YXNrcy5kYXJ0JyBzaG93IENvbXBpbGVyVGFzazsKaW1wb3J0ICdjb21tb24uZGFydCc7CmltcG9ydCAnY29tbW9uX2VsZW1lbnRzLmRhcnQnCiAgICBzaG93IENvbW1vbkVsZW1lbnRzLCBFbGVtZW50RW52aXJvbm1lbnQsIEtFbGVtZW50RW52aXJvbm1lbnQ7CmltcG9ydCAnY29tcGlsZXIuZGFydCcgc2hvdyBDb21waWxlcjsKaW1wb3J0ICdjb25zdGFudHMvdmFsdWVzLmRhcnQnCiAgICBzaG93CiAgICAgICAgQ29uc3RhbnRWYWx1ZSwKICAgICAgICBDb25zdHJ1Y3RlZENvbnN0YW50VmFsdWUsCiAgICAgICAgVHlwZUNvbnN0YW50VmFsdWUsCiAgICAgICAgRGVmZXJyZWRHbG9iYWxDb25zdGFudFZhbHVlLAogICAgICAgIEluc3RhbnRpYXRpb25Db25zdGFudFZhbHVlOwppbXBvcnQgJ2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJ2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJ2tlcm5lbC9rZWxlbWVudHMuZGFydCcgc2hvdyBLTG9jYWxGdW5jdGlvbjsKaW1wb3J0ICdzZXJpYWxpemF0aW9uL3NlcmlhbGl6YXRpb24uZGFydCc7CmltcG9ydCAnb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICd1bml2ZXJzZS91c2UuZGFydCc7CmltcG9ydCAndW5pdmVyc2Uvd29ybGRfaW1wYWN0LmRhcnQnCiAgICBzaG93IEltcGFjdFVzZUNhc2UsIFdvcmxkSW1wYWN0LCBXb3JsZEltcGFjdFZpc2l0b3JJbXBsOwppbXBvcnQgJ3V0aWwvdXJpX2V4dHJhcy5kYXJ0JyBhcyB1cmlfZXh0cmFzOwppbXBvcnQgJ3V0aWwvdXRpbC5kYXJ0JyBzaG93IG1ha2VVbmlxdWU7CmltcG9ydCAnd29ybGQuZGFydCcgc2hvdyBLQ2xvc2VkV29ybGQ7CgovLy8gQSAiaHVuayIgb2YgdGhlIHByb2dyYW0gdGhhdCB3aWxsIGJlIGxvYWRlZCB3aGVuZXZlciBvbmUgb2YgaXRzIFtpbXBvcnRzXQovLy8gYXJlIGxvYWRlZC4KLy8vCi8vLyBFbGVtZW50cyB0aGF0IGFyZSBvbmx5IHVzZWQgaW4gb25lIGRlZmVycmVkIGltcG9ydCwgaXMgaW4gYW4gT3V0cHV0VW5pdCB3aXRoCi8vLyB0aGUgZGVmZXJyZWQgaW1wb3J0IGFzIHNpbmdsZSBlbGVtZW50IGluIHRoZSBbaW1wb3J0c10gc2V0LgovLy8KLy8vIFdoZW5ldmVyIGEgZGVmZXJyZWQgRWxlbWVudCBpcyBzaGFyZWQgYmV0d2VlbiBzZXZlcmFsIGRlZmVycmVkIGltcG9ydHMgaXQgaXMKLy8vIGluIGFuIG91dHB1dCB1bml0IHdpdGggdGhvc2UgaW1wb3J0cyBpbiB0aGUgW2ltcG9ydHNdIFNldC4KLy8vCi8vLyBXZSBuZXZlciBjcmVhdGUgdHdvIE91dHB1dFVuaXRzIHNoYXJpbmcgdGhlIHNhbWUgc2V0IG9mIFtpbXBvcnRzXS4KY2xhc3MgT3V0cHV0VW5pdCBpbXBsZW1lbnRzIENvbXBhcmFibGU8T3V0cHV0VW5pdD4gewogIC8vLyBgdHJ1ZWAgaWYgdGhpcyBvdXRwdXQgdW5pdCBpcyBmb3IgdGhlIG1haW4gb3V0cHV0IGZpbGUuCiAgZmluYWwgYm9vbCBpc01haW5PdXRwdXQ7CgogIC8vLyBBIHVuaXF1ZSBuYW1lIHJlcHJlc2VudGluZyB0aGlzIFtPdXRwdXRVbml0XS4KICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgLy8vIFRoZSBkZWZlcnJlZCBpbXBvcnRzIHRoYXQgdXNlIHRoZSBlbGVtZW50cyBpbiB0aGlzIG91dHB1dCB1bml0LgogIGZpbmFsIFNldDxJbXBvcnRFbnRpdHk+IF9pbXBvcnRzOwoKICBPdXRwdXRVbml0KHRoaXMuaXNNYWluT3V0cHV0LCB0aGlzLm5hbWUsIHRoaXMuX2ltcG9ydHMpOwoKICBAb3ZlcnJpZGUKICBpbnQgY29tcGFyZVRvKE91dHB1dFVuaXQgb3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gMDsKICAgIGlmIChpc01haW5PdXRwdXQgJiYgIW90aGVyLmlzTWFpbk91dHB1dCkgcmV0dXJuIC0xOwogICAgaWYgKCFpc01haW5PdXRwdXQgJiYgb3RoZXIuaXNNYWluT3V0cHV0KSByZXR1cm4gMTsKICAgIHZhciBzaXplID0gX2ltcG9ydHMubGVuZ3RoOwogICAgdmFyIG90aGVyU2l6ZSA9IG90aGVyLl9pbXBvcnRzLmxlbmd0aDsKICAgIGlmIChzaXplICE9IG90aGVyU2l6ZSkgcmV0dXJuIHNpemUuY29tcGFyZVRvKG90aGVyU2l6ZSk7CiAgICB2YXIgaW1wb3J0cyA9IF9pbXBvcnRzLnRvTGlzdCgpOwogICAgdmFyIG90aGVySW1wb3J0cyA9IG90aGVyLl9pbXBvcnRzLnRvTGlzdCgpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgaWYgKGltcG9ydHNbaV0gPT0gb3RoZXJJbXBvcnRzW2ldKSBjb250aW51ZTsKICAgICAgdmFyIGEgPSBpbXBvcnRzW2ldLnVyaS5wYXRoOwogICAgICB2YXIgYiA9IG90aGVySW1wb3J0c1tpXS51cmkucGF0aDsKICAgICAgdmFyIGNtcCA9IGEuY29tcGFyZVRvKGIpOwogICAgICBpZiAoY21wICE9IDApIHJldHVybiBjbXA7CiAgICB9CiAgICAvLyBUT0RPKHNpZ211bmQpOiBtYWtlIGNvbXBhcmUgc3RhYmxlLiAgSWYgd2UgaGl0IHRoaXMgcG9pbnQsIGFsbCBpbXBvcnRlZAogICAgLy8gbGlicmFyaWVzIGFyZSB0aGUgc2FtZSwgaG93ZXZlciBbdGhpc10gYW5kIFtvdGhlcl0gdXNlIGRpZmZlcmVudCBkZWZlcnJlZAogICAgLy8gaW1wb3J0cyBpbiB0aGUgcHJvZ3JhbS4gV2UgY2FuIG1ha2UgdGhpcyBzdGFibGUgaWYgd2Ugc29ydCBiYXNlZCBvbiB0aGUKICAgIC8vIGRlZmVycmVkIGltcG9ydHMgdGhlbXNlbHZlcyAoZS5nLiB0aGVpciBkZWNsYXJhdGlvbiBsb2NhdGlvbikuCiAgICByZXR1cm4gbmFtZS5jb21wYXJlVG8ob3RoZXIubmFtZSk7CiAgfQoKICBTZXQ8SW1wb3J0RW50aXR5PiBnZXQgaW1wb3J0c0ZvclRlc3RpbmcgPT4gX2ltcG9ydHM7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICJPdXRwdXRVbml0KCRuYW1lLCAkX2ltcG9ydHMpIjsKfQoKLy8vIEZvciBlYWNoIGRlZmVycmVkIGltcG9ydCwgZmluZCBlbGVtZW50cyBhbmQgY29uc3RhbnRzIHRvIGJlIGxvYWRlZCB3aGVuIHRoYXQKLy8vIGltcG9ydCBpcyBsb2FkZWQuIEVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgYnkgc2V2ZXJhbCBkZWZlcnJlZCBpbXBvcnRzIGFyZSBpbgovLy8gc2hhcmVkIE91dHB1dFVuaXRzLgphYnN0cmFjdCBjbGFzcyBEZWZlcnJlZExvYWRUYXNrIGV4dGVuZHMgQ29tcGlsZXJUYXNrIHsKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IG5hbWUgPT4gJ0RlZmVycmVkIExvYWRpbmcnOwoKICAvLy8gVGhlIE91dHB1dFVuaXQgdGhhdCB3aWxsIGJlIGxvYWRlZCB3aGVuIHRoZSBwcm9ncmFtIHN0YXJ0cy4KICBPdXRwdXRVbml0IF9tYWluT3V0cHV0VW5pdDsKCiAgLy8vIEEgc2V0IGNvbnRhaW5pbmcgKGV2ZW50dWFsbHkpIGFsbCBvdXRwdXQgdW5pdHMgdGhhdCB3aWxsIHJlc3VsdCBmcm9tIHRoZQogIC8vLyBwcm9ncmFtLgogIGZpbmFsIExpc3Q8T3V0cHV0VW5pdD4gX2FsbE91dHB1dFVuaXRzID0gbmV3IExpc3Q8T3V0cHV0VW5pdD4oKTsKCiAgLy8vIFdpbGwgYmUgYHRydWVgIGlmIHRoZSBwcm9ncmFtIGNvbnRhaW5zIGRlZmVycmVkIGxpYnJhcmllcy4KICBib29sIGlzUHJvZ3JhbVNwbGl0ID0gZmFsc2U7CgogIHN0YXRpYyBjb25zdCBJbXBhY3RVc2VDYXNlIElNUEFDVF9VU0UgPSBjb25zdCBJbXBhY3RVc2VDYXNlKCdEZWZlcnJlZCBsb2FkJyk7CgogIC8vLyBBIGNhY2hlIG9mIHRoZSByZXN1bHQgb2YgY2FsbGluZyBgY29tcHV0ZUltcG9ydERlZmVyTmFtZWAgb24gdGhlIGtleXMgb2YKICAvLy8gdGhpcyBtYXAuCiAgZmluYWwgTWFwPEltcG9ydEVudGl0eSwgU3RyaW5nPiBfaW1wb3J0RGVmZXJOYW1lID0gPEltcG9ydEVudGl0eSwgU3RyaW5nPnt9OwoKICAvLy8gQSBtYXBwaW5nIGZyb20gY2xhc3NlcyB0byB0aGVpciBpbXBvcnQgc2V0LgogIE1hcDxDbGFzc0VudGl0eSwgSW1wb3J0U2V0PiBfY2xhc3NUb1NldCA9IG5ldyBNYXA8Q2xhc3NFbnRpdHksIEltcG9ydFNldD4oKTsKCiAgLy8vIEEgbWFwcGluZyBmcm9tIG1lbWJlcnMgdG8gdGhlaXIgaW1wb3J0IHNldC4KICBNYXA8TWVtYmVyRW50aXR5LCBJbXBvcnRTZXQ+IF9tZW1iZXJUb1NldCA9CiAgICAgIG5ldyBNYXA8TWVtYmVyRW50aXR5LCBJbXBvcnRTZXQ+KCk7CgogIC8vLyBBIG1hcHBpbmcgZnJvbSBsb2NhbCBmdW5jdGlvbnMgdG8gdGhlaXIgaW1wb3J0IHNldC4KICBNYXA8TG9jYWwsIEltcG9ydFNldD4gX2xvY2FsRnVuY3Rpb25Ub1NldCA9IG5ldyBNYXA8TG9jYWwsIEltcG9ydFNldD4oKTsKCiAgLy8vIEEgbWFwcGluZyBmcm9tIGNvbnN0YW50cyB0byB0aGVpciBpbXBvcnQgc2V0LgogIE1hcDxDb25zdGFudFZhbHVlLCBJbXBvcnRTZXQ+IF9jb25zdGFudFRvU2V0ID0KICAgICAgbmV3IE1hcDxDb25zdGFudFZhbHVlLCBJbXBvcnRTZXQ+KCk7CgogIEl0ZXJhYmxlPEltcG9ydEVudGl0eT4gZ2V0IF9hbGxEZWZlcnJlZEltcG9ydHMgPT4KICAgICAgX2RlZmVycmVkSW1wb3J0RGVzY3JpcHRpb25zLmtleXM7CgogIC8vLyBCZWNhdXNlIHRoZSB0b2tlbi1zdHJlYW0gaXMgZm9yZ290dGVuIGxhdGVyIGluIHRoZSBwcm9ncmFtLCB3ZSBjYWNoZSBhCiAgLy8vIGRlc2NyaXB0aW9uIG9mIGVhY2ggZGVmZXJyZWQgaW1wb3J0LgogIGZpbmFsIE1hcDxJbXBvcnRFbnRpdHksIEltcG9ydERlc2NyaXB0aW9uPiBfZGVmZXJyZWRJbXBvcnREZXNjcmlwdGlvbnMgPQogICAgICA8SW1wb3J0RW50aXR5LCBJbXBvcnREZXNjcmlwdGlvbj57fTsKCiAgLy8vIEEgbGF0dGljZSB0byBjb21wYWN0bHkgcmVwcmVzZW50IG11bHRpcGxlIHN1YnNldHMgb2YgaW1wb3J0cy4KICBmaW5hbCBJbXBvcnRTZXRMYXR0aWNlIGltcG9ydFNldHMgPSBuZXcgSW1wb3J0U2V0TGF0dGljZSgpOwoKICBmaW5hbCBDb21waWxlciBjb21waWxlcjsKCiAgYm9vbCBnZXQgZGlzYWJsZVByb2dyYW1TcGxpdCA9PiBjb21waWxlci5vcHRpb25zLmRpc2FibGVQcm9ncmFtU3BsaXQ7CiAgYm9vbCBnZXQgbmV3RGVmZXJyZWRTcGxpdCA9PiBjb21waWxlci5vcHRpb25zLm5ld0RlZmVycmVkU3BsaXQ7CiAgYm9vbCBnZXQgcmVwb3J0SW52YWxpZEluZmVycmVkRGVmZXJyZWRUeXBlcyA9PgogICAgICBjb21waWxlci5vcHRpb25zLnJlcG9ydEludmFsaWRJbmZlcnJlZERlZmVycmVkVHlwZXM7CgogIERlZmVycmVkTG9hZFRhc2sodGhpcy5jb21waWxlcikgOiBzdXBlcihjb21waWxlci5tZWFzdXJlcikgewogICAgX21haW5PdXRwdXRVbml0ID0gbmV3IE91dHB1dFVuaXQodHJ1ZSwgJ21haW4nLCBuZXcgU2V0PEltcG9ydEVudGl0eT4oKSk7CiAgICBpbXBvcnRTZXRzLm1haW5TZXQudW5pdCA9IF9tYWluT3V0cHV0VW5pdDsKICAgIF9hbGxPdXRwdXRVbml0cy5hZGQoX21haW5PdXRwdXRVbml0KTsKICB9CgogIEtFbGVtZW50RW52aXJvbm1lbnQgZ2V0IGVsZW1lbnRFbnZpcm9ubWVudCA9PgogICAgICBjb21waWxlci5mcm9udGVuZFN0cmF0ZWd5LmVsZW1lbnRFbnZpcm9ubWVudDsKCiAgQ29tbW9uRWxlbWVudHMgZ2V0IGNvbW1vbkVsZW1lbnRzID0+IGNvbXBpbGVyLmZyb250ZW5kU3RyYXRlZ3kuY29tbW9uRWxlbWVudHM7CgogIERpYWdub3N0aWNSZXBvcnRlciBnZXQgcmVwb3J0ZXIgPT4gY29tcGlsZXIucmVwb3J0ZXI7CgogIC8vLyBHaXZlbiBbaW1wb3J0c10gdGhhdCByZWZlciB0byBhbiBlbGVtZW50IGZyb20gYSBsaWJyYXJ5LCBkZXRlcm1pbmUgd2hldGhlcgogIC8vLyB0aGUgZWxlbWVudCBpcyBleHBsaWNpdGx5IGRlZmVycmVkLgogIHN0YXRpYyBib29sIF9pc0V4cGxpY2l0bHlEZWZlcnJlZChJdGVyYWJsZTxJbXBvcnRFbnRpdHk+IGltcG9ydHMpIHsKICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIG5vdCBpbXBvcnRlZCBleHBsaWNpdGx5LCBpdCBpcyBpbXBsaWNpdGx5IGltcG9ydGVkCiAgICAvLyBub3QgZGVmZXJyZWQuCiAgICBpZiAoaW1wb3J0cy5pc0VtcHR5KSByZXR1cm4gZmFsc2U7CiAgICAvLyBBbiBlbGVtZW50IGNvdWxkIHBvdGVudGlhbGx5IGJlIGxvYWRlZCBieSBzZXZlcmFsIGltcG9ydHMuIElmIGFsbCBvZiB0aGVtCiAgICAvLyBpcyBleHBsaWNpdGx5IGRlZmVycmVkLCB3ZSBzYXkgdGhlIGVsZW1lbnQgaXMgZXhwbGljaXRseSBkZWZlcnJlZC4KICAgIC8vIFRPRE8oc2lndXJkbSk6IFdlIG1pZ2h0IHdhbnQgdG8gZ2l2ZSBhIHdhcm5pbmcgaWYgdGhlIGltcG9ydHMgZG8gbm90CiAgICAvLyBhZ3JlZS4KICAgIHJldHVybiBpbXBvcnRzLmV2ZXJ5KChJbXBvcnRFbnRpdHkgaW1wb3J0KSA9PiBpbXBvcnQuaXNEZWZlcnJlZCk7CiAgfQoKICAvLy8gUmV0dXJucyBldmVyeSBbSW1wb3J0RW50aXR5XSB0aGF0IGltcG9ydHMgW2VsZW1lbnRdIGludG8gW2xpYnJhcnldLgogIEl0ZXJhYmxlPEltcG9ydEVudGl0eT4gY2xhc3NJbXBvcnRzVG8oCiAgICAgIENsYXNzRW50aXR5IGVsZW1lbnQsIExpYnJhcnlFbnRpdHkgbGlicmFyeSk7CgogIC8vLyBSZXR1cm5zIGV2ZXJ5IFtJbXBvcnRFbnRpdHldIHRoYXQgaW1wb3J0cyBbZWxlbWVudF0gaW50byBbbGlicmFyeV0uCiAgSXRlcmFibGU8SW1wb3J0RW50aXR5PiBtZW1iZXJJbXBvcnRzVG8oCiAgICAgIE1lbWJlckVudGl0eSBlbGVtZW50LCBMaWJyYXJ5RW50aXR5IGxpYnJhcnkpOwoKICAvLy8gUmV0dXJucyBldmVyeSBbSW1wb3J0RW50aXR5XSB0aGF0IGltcG9ydHMgW2VsZW1lbnRdIGludG8gW2xpYnJhcnldLgogIEl0ZXJhYmxlPEltcG9ydEVudGl0eT4gdHlwZWRlZkltcG9ydHNUbygKICAgICAgVHlwZWRlZkVudGl0eSBlbGVtZW50LCBMaWJyYXJ5RW50aXR5IGxpYnJhcnkpOwoKICAvLy8gQ29sbGVjdHMgYWxsIGRpcmVjdCBkZXBlbmRlbmNpZXMgb2YgW2VsZW1lbnRdLgogIC8vLwogIC8vLyBUaGUgY29sbGVjdGVkIGRlcGVuZGVudCBlbGVtZW50cyBhbmQgY29uc3RhbnRzIGFyZSBhcmUgYWRkZWQgdG8KICAvLy8gW2VsZW1lbnRzXSBhbmQgW2NvbnN0YW50c10gcmVzcGVjdGl2ZWx5LgogIHZvaWQgX2NvbGxlY3REaXJlY3RNZW1iZXJEZXBlbmRlbmNpZXMoCiAgICAgIE1lbWJlckVudGl0eSBlbGVtZW50LCBEZXBlbmRlbmNpZXMgZGVwZW5kZW5jaWVzKSB7CiAgICAvLyBUT0RPKHNpZ3VyZG0pOiBXZSB3YW50IHRvIGJlIG1vcmUgc3BlY2lmaWMgYWJvdXQgdGhpcyAtIG5lZWQgYSBiZXR0ZXIKICAgIC8vIHdheSB0byBxdWVyeSAibGl2ZW5lc3MiLgogICAgaWYgKCFjb21waWxlci5yZXNvbHV0aW9uV29ybGRCdWlsZGVyLmlzTWVtYmVyVXNlZChlbGVtZW50KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBfY29sbGVjdERlcGVuZGVuY2llc0Zyb21JbXBhY3QoZWxlbWVudCwgZGVwZW5kZW5jaWVzKTsKICAgIGNvbGxlY3RDb25zdGFudHNJbkJvZHkoZWxlbWVudCwgZGVwZW5kZW5jaWVzKTsKICB9CgogIC8vLyBGaW5kcyBhbGwgZWxlbWVudHMgYW5kIGNvbnN0YW50cyB0aGF0IFtlbGVtZW50XSBkZXBlbmRzIGRpcmVjdGx5IG9uLgogIC8vLyAobm90IHRoZSB0cmFuc2l0aXZlIGNsb3N1cmUuKQogIC8vLwogIC8vLyBBZGRzIHRoZSByZXN1bHRzIHRvIFtlbGVtZW50c10gYW5kIFtjb25zdGFudHNdLgogIHZvaWQgX2NvbGxlY3RBbGxFbGVtZW50c0FuZENvbnN0YW50c1Jlc29sdmVkRnJvbUNsYXNzKAogICAgICBDbGFzc0VudGl0eSBlbGVtZW50LCBEZXBlbmRlbmNpZXMgZGVwZW5kZW5jaWVzKSB7CiAgICAvLyBJZiB3ZSBzZWUgYSBjbGFzcywgYWRkIGV2ZXJ5dGhpbmcgaXRzIGxpdmUgaW5zdGFuY2UgbWVtYmVycyByZWZlcgogICAgLy8gdG8uICBTdGF0aWMgbWVtYmVycyBhcmUgbm90IHJlbGV2YW50LCB1bmxlc3Mgd2UgYXJlIHByb2Nlc3NpbmcKICAgIC8vIGV4dHJhIGRlcGVuZGVuY2llcyBkdWUgdG8gbWlycm9ycy4KICAgIHZvaWQgYWRkTGl2ZUluc3RhbmNlTWVtYmVyKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgICAgaWYgKCFjb21waWxlci5yZXNvbHV0aW9uV29ybGRCdWlsZGVyLmlzTWVtYmVyVXNlZChtZW1iZXIpKSByZXR1cm47CiAgICAgIGlmICghbWVtYmVyLmlzSW5zdGFuY2VNZW1iZXIpIHJldHVybjsKICAgICAgZGVwZW5kZW5jaWVzLmFkZE1lbWJlcihtZW1iZXIpOwogICAgICBfY29sbGVjdERpcmVjdE1lbWJlckRlcGVuZGVuY2llcyhtZW1iZXIsIGRlcGVuZGVuY2llcyk7CiAgICB9CgogICAgQ2xhc3NFbnRpdHkgY2xzID0gZWxlbWVudDsKICAgIGVsZW1lbnRFbnZpcm9ubWVudC5mb3JFYWNoTG9jYWxDbGFzc01lbWJlcihjbHMsIGFkZExpdmVJbnN0YW5jZU1lbWJlcik7CiAgICBlbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaFN1cGVydHlwZShjbHMsIChJbnRlcmZhY2VUeXBlIHR5cGUpIHsKICAgICAgX2NvbGxlY3RUeXBlRGVwZW5kZW5jaWVzKHR5cGUsIGRlcGVuZGVuY2llcyk7CiAgICB9KTsKICAgIGRlcGVuZGVuY2llcy5hZGRDbGFzcyhjbHMpOwogIH0KCiAgLy8vIEZpbmRzIGFsbCBlbGVtZW50cyBhbmQgY29uc3RhbnRzIHRoYXQgW2VsZW1lbnRdIGRlcGVuZHMgZGlyZWN0bHkgb24uCiAgLy8vIChub3QgdGhlIHRyYW5zaXRpdmUgY2xvc3VyZS4pCiAgLy8vCiAgLy8vIEFkZHMgdGhlIHJlc3VsdHMgdG8gW2VsZW1lbnRzXSBhbmQgW2NvbnN0YW50c10uCiAgdm9pZCBfY29sbGVjdEFsbEVsZW1lbnRzQW5kQ29uc3RhbnRzUmVzb2x2ZWRGcm9tTWVtYmVyKAogICAgICBNZW1iZXJFbnRpdHkgZWxlbWVudCwgRGVwZW5kZW5jaWVzIGRlcGVuZGVuY2llcykgewogICAgaWYgKGVsZW1lbnQgaXMgRnVuY3Rpb25FbnRpdHkpIHsKICAgICAgX2NvbGxlY3RUeXBlRGVwZW5kZW5jaWVzKAogICAgICAgICAgZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZShlbGVtZW50KSwgZGVwZW5kZW5jaWVzKTsKICAgIH0KICAgIGlmIChlbGVtZW50LmlzU3RhdGljIHx8IGVsZW1lbnQuaXNUb3BMZXZlbCB8fCBlbGVtZW50LmlzQ29uc3RydWN0b3IpIHsKICAgICAgZGVwZW5kZW5jaWVzLmFkZE1lbWJlcihlbGVtZW50KTsKICAgICAgX2NvbGxlY3REaXJlY3RNZW1iZXJEZXBlbmRlbmNpZXMoZWxlbWVudCwgZGVwZW5kZW5jaWVzKTsKICAgIH0KICAgIGlmIChlbGVtZW50IGlzIENvbnN0cnVjdG9yRW50aXR5ICYmIGVsZW1lbnQuaXNHZW5lcmF0aXZlQ29uc3RydWN0b3IpIHsKICAgICAgLy8gV2hlbiBpbnN0YW50aWF0aW5nIGEgY2xhc3MsIHdlIHJlY29yZCBhIHJlZmVyZW5jZSB0byB0aGUKICAgICAgLy8gY29uc3RydWN0b3IsIG5vdCB0aGUgY2xhc3MgaXRzZWxmLiAgV2UgbXVzdCBhZGQgYWxsIHRoZQogICAgICAvLyBpbnN0YW5jZSBtZW1iZXJzIG9mIHRoZSBjb25zdHJ1Y3RvcidzIGNsYXNzLgogICAgICBDbGFzc0VudGl0eSBjbHMgPSBlbGVtZW50LmVuY2xvc2luZ0NsYXNzOwogICAgICBfY29sbGVjdEFsbEVsZW1lbnRzQW5kQ29uc3RhbnRzUmVzb2x2ZWRGcm9tQ2xhc3MoY2xzLCBkZXBlbmRlbmNpZXMpOwogICAgfQoKICAgIC8vIE90aGVyIGVsZW1lbnRzLCBpbiBwYXJ0aWN1bGFyIGluc3RhbmNlIG1lbWJlcnMsIGFyZSBpZ25vcmVkIGFzCiAgICAvLyB0aGV5IGFyZSBwcm9jZXNzZWQgYXMgcGFydCBvZiB0aGUgY2xhc3MuCiAgfQoKICAvLy8gRXh0cmFjdCB0aGUgc2V0IG9mIGNvbnN0YW50cyB0aGF0IGFyZSB1c2VkIGluIGFubm90YXRpb25zIG9mIFtlbGVtZW50XS4KICAvLy8KICAvLy8gSWYgdGhlIHVuZGVybHlpbmcgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBtaXJyb3JzLCB0aGVuIG5vIGNvbnN0YW50cyBhcmUKICAvLy8gYWRkZWQuCiAgdm9pZCBjb2xsZWN0Q29uc3RhbnRzRnJvbU1ldGFkYXRhKAogICAgICBFbnRpdHkgZWxlbWVudCwgU2V0PENvbnN0YW50VmFsdWU+IGNvbnN0YW50cyk7CgogIC8vLyBFeHRyYWN0IHRoZSBzZXQgb2YgY29uc3RhbnRzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIGJvZHkgb2YgW2VsZW1lbnRdLgogIHZvaWQgY29sbGVjdENvbnN0YW50c0luQm9keShNZW1iZXJFbnRpdHkgZWxlbWVudCwgRGVwZW5kZW5jaWVzIGRlcGVuZGVuY2llcyk7CgogIC8vLyBSZWN1cnNpdmVseSBjb2xsZWN0cyBhbGwgdGhlIGRlcGVuZGVuY2llcyBvZiBbdHlwZV0uCiAgdm9pZCBfY29sbGVjdFR5cGVEZXBlbmRlbmNpZXMoRGFydFR5cGUgdHlwZSwgRGVwZW5kZW5jaWVzIGRlcGVuZGVuY2llcywKICAgICAgW0ltcG9ydEVudGl0eSBpbXBvcnRdKSB7CiAgICBuZXcgVHlwZURlcGVuZGVuY3lWaXNpdG9yKGRlcGVuZGVuY2llcywgaW1wb3J0LCBjb21tb25FbGVtZW50cykudmlzaXQodHlwZSk7CiAgfQoKICB2b2lkIF9jb2xsZWN0VHlwZUFyZ3VtZW50RGVwZW5kZW5jaWVzKAogICAgICBJdGVyYWJsZTxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cywgRGVwZW5kZW5jaWVzIGRlcGVuZGVuY2llcywKICAgICAgW0ltcG9ydEVudGl0eSBpbXBvcnRdKSB7CiAgICBpZiAodHlwZUFyZ3VtZW50cyA9PSBudWxsKSByZXR1cm47CiAgICBuZXcgVHlwZURlcGVuZGVuY3lWaXNpdG9yKGRlcGVuZGVuY2llcywgaW1wb3J0LCBjb21tb25FbGVtZW50cykKICAgICAgICAudmlzaXRMaXN0KHR5cGVBcmd1bWVudHMpOwogIH0KCiAgLy8vIEV4dHJhY3QgYW55IGRlcGVuZGVuY2llcyB0aGF0IGFyZSBrbm93biBmcm9tIHRoZSBpbXBhY3Qgb2YgW2VsZW1lbnRdLgogIHZvaWQgX2NvbGxlY3REZXBlbmRlbmNpZXNGcm9tSW1wYWN0KAogICAgICBNZW1iZXJFbnRpdHkgZWxlbWVudCwgRGVwZW5kZW5jaWVzIGRlcGVuZGVuY2llcykgewogICAgV29ybGRJbXBhY3Qgd29ybGRJbXBhY3QgPSBjb21waWxlci5pbXBhY3RDYWNoZVtlbGVtZW50XTsKICAgIGNvbXBpbGVyLmltcGFjdFN0cmF0ZWd5LnZpc2l0SW1wYWN0KAogICAgICAgIGVsZW1lbnQsCiAgICAgICAgd29ybGRJbXBhY3QsCiAgICAgICAgbmV3IFdvcmxkSW1wYWN0VmlzaXRvckltcGwodmlzaXRTdGF0aWNVc2U6IChTdGF0aWNVc2Ugc3RhdGljVXNlKSB7CiAgICAgICAgICBFbnRpdHkgdXNlZEVudGl0eSA9IHN0YXRpY1VzZS5lbGVtZW50OwogICAgICAgICAgaWYgKHVzZWRFbnRpdHkgaXMgTWVtYmVyRW50aXR5KSB7CiAgICAgICAgICAgIGRlcGVuZGVuY2llcy5hZGRNZW1iZXIodXNlZEVudGl0eSwgc3RhdGljVXNlLmRlZmVycmVkSW1wb3J0KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFzc2VydCh1c2VkRW50aXR5IGlzIEtMb2NhbEZ1bmN0aW9uLAogICAgICAgICAgICAgICAgZmFpbGVkQXQodXNlZEVudGl0eSwgIlVuZXhwZWN0ZWQgc3RhdGljIHVzZSAkc3RhdGljVXNlLiIpKTsKICAgICAgICAgICAgS0xvY2FsRnVuY3Rpb24gbG9jYWxGdW5jdGlvbiA9IHVzZWRFbnRpdHk7CiAgICAgICAgICAgIC8vIFRPRE8oc3JhKTogQ29uc3VsdCBLQ2xvc2VkV29ybGQgdG8gc2VlIGlmIHNpZ25hdHVyZSBpcyBuZWVkZWQuCiAgICAgICAgICAgIF9jb2xsZWN0VHlwZURlcGVuZGVuY2llcyhsb2NhbEZ1bmN0aW9uLmZ1bmN0aW9uVHlwZSwgZGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgZGVwZW5kZW5jaWVzLmxvY2FsRnVuY3Rpb25zLmFkZChsb2NhbEZ1bmN0aW9uKTsKICAgICAgICAgIH0KICAgICAgICAgIHN3aXRjaCAoc3RhdGljVXNlLmtpbmQpIHsKICAgICAgICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkNPTlNUUlVDVE9SX0lOVk9LRToKICAgICAgICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkNPTlNUX0NPTlNUUlVDVE9SX0lOVk9LRToKICAgICAgICAgICAgICAvLyBUaGUgcmVjZWl2ZXIgdHlwZSBvZiBnZW5lcmF0aXZlIGNvbnN0cnVjdG9ycyBpcyBhIGRlcGVuZGVuY3kgb2YKICAgICAgICAgICAgICAvLyB0aGUgY29uc3RydWN0b3IgKGhhbmRsZWQgYnkgYGFkZE1lbWJlcmAgYWJvdmUpIGFuZCBub3QgYQogICAgICAgICAgICAgIC8vIGRlcGVuZGVuY3kgYXQgdGhlIGNhbGwgc2l0ZS4KICAgICAgICAgICAgICAvLyBGYWN0b3J5IG1ldGhvZHMsIG9uIHRoZSBvdGhlciBoYW5kLCBhcmUgbGlrZSBzdGF0aWMgbWV0aG9kcyBzbwogICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgdHlwZSBpcyBub3QgcmVsZXZhbnQuCiAgICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVXNlIHJ0aSBuZWVkIGRhdGEgdG8gc2tpcCB1bm5lZWRlZCB0eXBlCiAgICAgICAgICAgICAgLy8gYXJndW1lbnRzLgogICAgICAgICAgICAgIF9jb2xsZWN0VHlwZUFyZ3VtZW50RGVwZW5kZW5jaWVzKAogICAgICAgICAgICAgICAgICBzdGF0aWNVc2UudHlwZS50eXBlQXJndW1lbnRzLCBkZXBlbmRlbmNpZXMpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuSU5WT0tFOgogICAgICAgICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuQ0xPU1VSRV9DQUxMOgogICAgICAgICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuRElSRUNUX0lOVk9LRToKICAgICAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2UgcnRpIG5lZWQgZGF0YSB0byBza2lwIHVubmVlZGVkIHR5cGUKICAgICAgICAgICAgICAvLyBhcmd1bWVudHMuCiAgICAgICAgICAgICAgX2NvbGxlY3RUeXBlQXJndW1lbnREZXBlbmRlbmNpZXMoCiAgICAgICAgICAgICAgICAgIHN0YXRpY1VzZS50eXBlQXJndW1lbnRzLCBkZXBlbmRlbmNpZXMpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgfQogICAgICAgIH0sIHZpc2l0VHlwZVVzZTogKFR5cGVVc2UgdHlwZVVzZSkgewogICAgICAgICAgRGFydFR5cGUgdHlwZSA9IHR5cGVVc2UudHlwZTsKICAgICAgICAgIHN3aXRjaCAodHlwZVVzZS5raW5kKSB7CiAgICAgICAgICAgIGNhc2UgVHlwZVVzZUtpbmQuVFlQRV9MSVRFUkFMOgogICAgICAgICAgICAgIGlmICh0eXBlLmlzSW50ZXJmYWNlVHlwZSkgewogICAgICAgICAgICAgICAgSW50ZXJmYWNlVHlwZSBpbnRlcmZhY2UgPSB0eXBlOwogICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLmFkZENsYXNzKAogICAgICAgICAgICAgICAgICAgIGludGVyZmFjZS5lbGVtZW50LCB0eXBlVXNlLmRlZmVycmVkSW1wb3J0KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgVHlwZVVzZUtpbmQuQ09OU1RfSU5TVEFOVElBVElPTjoKICAgICAgICAgICAgICBfY29sbGVjdFR5cGVEZXBlbmRlbmNpZXMoCiAgICAgICAgICAgICAgICAgIHR5cGUsIGRlcGVuZGVuY2llcywgdHlwZVVzZS5kZWZlcnJlZEltcG9ydCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgVHlwZVVzZUtpbmQuSU5TVEFOVElBVElPTjoKICAgICAgICAgICAgY2FzZSBUeXBlVXNlS2luZC5OQVRJVkVfSU5TVEFOVElBVElPTjoKICAgICAgICAgICAgY2FzZSBUeXBlVXNlS2luZC5JU19DSEVDSzoKICAgICAgICAgICAgY2FzZSBUeXBlVXNlS2luZC5DQVRDSF9UWVBFOgogICAgICAgICAgICAgIF9jb2xsZWN0VHlwZURlcGVuZGVuY2llcyh0eXBlLCBkZXBlbmRlbmNpZXMpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFR5cGVVc2VLaW5kLkFTX0NBU1Q6CiAgICAgICAgICAgICAgaWYgKCFjb21waWxlci5vcHRpb25zLm9taXRBc0Nhc3RzKSB7CiAgICAgICAgICAgICAgICBfY29sbGVjdFR5cGVEZXBlbmRlbmNpZXModHlwZSwgZGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgVHlwZVVzZUtpbmQuSU1QTElDSVRfQ0FTVDoKICAgICAgICAgICAgICBpZiAoY29tcGlsZXIub3B0aW9ucy5pbXBsaWNpdERvd25jYXN0Q2hlY2tQb2xpY3kuaXNFbWl0dGVkKSB7CiAgICAgICAgICAgICAgICBfY29sbGVjdFR5cGVEZXBlbmRlbmNpZXModHlwZSwgZGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgVHlwZVVzZUtpbmQuUEFSQU1FVEVSX0NIRUNLOgogICAgICAgICAgICAgIGlmIChjb21waWxlci5vcHRpb25zLnBhcmFtZXRlckNoZWNrUG9saWN5LmlzRW1pdHRlZCkgewogICAgICAgICAgICAgICAgX2NvbGxlY3RUeXBlRGVwZW5kZW5jaWVzKHR5cGUsIGRlcGVuZGVuY2llcyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFR5cGVVc2VLaW5kLlJUSV9WQUxVRToKICAgICAgICAgICAgY2FzZSBUeXBlVXNlS2luZC5UWVBFX0FSR1VNRU5UOgogICAgICAgICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsICJVbmV4cGVjdGVkIHR5cGUgdXNlOiAkdHlwZVVzZS4iKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9LCB2aXNpdER5bmFtaWNVc2U6IChEeW5hbWljVXNlIGR5bmFtaWNVc2UpIHsKICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSBydGkgbmVlZCBkYXRhIHRvIHNraXAgdW5uZWVkZWQgdHlwZQogICAgICAgICAgLy8gYXJndW1lbnRzLgogICAgICAgICAgX2NvbGxlY3RUeXBlQXJndW1lbnREZXBlbmRlbmNpZXMoCiAgICAgICAgICAgICAgZHluYW1pY1VzZS50eXBlQXJndW1lbnRzLCBkZXBlbmRlbmNpZXMpOwogICAgICAgIH0pLAogICAgICAgIERlZmVycmVkTG9hZFRhc2suSU1QQUNUX1VTRSk7CiAgfQoKICAvLy8gVXBkYXRlIHRoZSBpbXBvcnQgc2V0IG9mIGFsbCBjb25zdGFudHMgcmVhY2hhYmxlIGZyb20gW2NvbnN0YW50XSwgYXMgbG9uZwogIC8vLyBhcyB0aGV5IGhhZCB0aGUgW29sZFNldF0uIEFzIHNvb24gYXMgd2Ugc2VlIGEgY29uc3RhbnQgd2l0aCBhIGRpZmZlcmVudAogIC8vLyBpbXBvcnQgc2V0LCB3ZSBzdG9wIGFuZCBlbnF1ZXVlIGEgbmV3IHJlY3Vyc2l2ZSB1cGRhdGUgaW4gW3F1ZXVlXS4KICAvLy8KICAvLy8gSW52YXJpYW50czogb2xkU2V0IGlzIGVpdGhlciBudWxsIG9yIGEgc3Vic2V0IG9mIG5ld1NldC4KICB2b2lkIF91cGRhdGVDb25zdGFudFJlY3Vyc2l2ZShDb25zdGFudFZhbHVlIGNvbnN0YW50LCBJbXBvcnRTZXQgb2xkU2V0LAogICAgICBJbXBvcnRTZXQgbmV3U2V0LCBXb3JrUXVldWUgcXVldWUpIHsKICAgIGlmIChjb25zdGFudCA9PSBudWxsKSByZXR1cm47CiAgICB2YXIgY3VycmVudFNldCA9IF9jb25zdGFudFRvU2V0W2NvbnN0YW50XTsKCiAgICAvLyBBbHJlYWR5IHZpc2l0ZWQuCiAgICBpZiAoY3VycmVudFNldCA9PSBuZXdTZXQpIHJldHVybjsKCiAgICAvLyBFbGVtZW50cyBpbiB0aGUgbWFpbiBvdXRwdXQgdW5pdCBhbHdheXMgcmVtYWluIHRoZXJlLgogICAgaWYgKGN1cnJlbnRTZXQgPT0gaW1wb3J0U2V0cy5tYWluU2V0KSByZXR1cm47CgogICAgaWYgKGN1cnJlbnRTZXQgPT0gb2xkU2V0KSB7CiAgICAgIF9jb25zdGFudFRvU2V0W2NvbnN0YW50XSA9IG5ld1NldDsKICAgICAgaWYgKGNvbnN0YW50IGlzIENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZSkgewogICAgICAgIENsYXNzRW50aXR5IGNscyA9IGNvbnN0YW50LnR5cGUuZWxlbWVudDsKICAgICAgICBfdXBkYXRlQ2xhc3NSZWN1cnNpdmUoY2xzLCBvbGRTZXQsIG5ld1NldCwgcXVldWUpOwogICAgICB9CiAgICAgIGlmIChjb25zdGFudCBpcyBJbnN0YW50aWF0aW9uQ29uc3RhbnRWYWx1ZSkgewogICAgICAgIGZvciAoRGFydFR5cGUgdHlwZSBpbiBjb25zdGFudC50eXBlQXJndW1lbnRzKSB7CiAgICAgICAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgICAgIF91cGRhdGVDbGFzc1JlY3Vyc2l2ZSh0eXBlLmVsZW1lbnQsIG9sZFNldCwgbmV3U2V0LCBxdWV1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0YW50LmdldERlcGVuZGVuY2llcygpLmZvckVhY2goKENvbnN0YW50VmFsdWUgZGVwZW5kZW5jeSkgewogICAgICAgIC8vIENvbnN0YW50cyBhcmUgbm90IGFsbG93ZWQgdG8gcmVmZXIgdG8gZGVmZXJyZWQgY29uc3RhbnRzLCBzbwogICAgICAgIC8vIG5vIG5lZWQgdG8gY2hlY2sgZm9yIGEgZGVmZXJyZWQgdHlwZSBsaXRlcmFsIGhlcmUuCiAgICAgICAgX3VwZGF0ZUNvbnN0YW50UmVjdXJzaXZlKGRlcGVuZGVuY3ksIG9sZFNldCwgbmV3U2V0LCBxdWV1ZSk7CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KAogICAgICAgICAgLy8gSW52YXJpYW50OiB3ZSBtdXN0IG1hcmsgbWFpbiBiZWZvcmUgd2UgbWFyayBhbnkgZGVmZXJyZWQgaW1wb3J0LgogICAgICAgICAgbmV3U2V0ICE9IGltcG9ydFNldHMubWFpblNldCB8fCBvbGRTZXQgIT0gbnVsbCwKICAgICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICAgIE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwKICAgICAgICAgICAgICAiVHJpZWQgdG8gYXNzaWduICR7Y29uc3RhbnQudG9EYXJ0VGV4dCgpfSB0byB0aGUgbWFpbiBvdXRwdXQgIgogICAgICAgICAgICAgICJ1bml0LCBidXQgaXQgd2FzIGFzc2lnbmVkIHRvICRjdXJyZW50U2V0LiIpKTsKICAgICAgcXVldWUuYWRkQ29uc3RhbnQoY29uc3RhbnQsIG5ld1NldCk7CiAgICB9CiAgfQoKICB2b2lkIF91cGRhdGVDbGFzc1JlY3Vyc2l2ZShDbGFzc0VudGl0eSBlbGVtZW50LCBJbXBvcnRTZXQgb2xkU2V0LAogICAgICBJbXBvcnRTZXQgbmV3U2V0LCBXb3JrUXVldWUgcXVldWUpIHsKICAgIGlmIChlbGVtZW50ID09IG51bGwpIHJldHVybjsKCiAgICBJbXBvcnRTZXQgY3VycmVudFNldCA9IF9jbGFzc1RvU2V0W2VsZW1lbnRdOwoKICAgIC8vIEFscmVhZHkgdmlzaXRlZC4gV2UgbWF5IHZpc2l0IHNvbWUgcm9vdCBub2RlcyBhIHNlY29uZCB0aW1lIHdpdGgKICAgIC8vIFtpc01pcnJvclVzYWdlXSBpbiBvcmRlciB0byBtYXJrIHN0YXRpYyBtZW1iZXJzIHVzZWQgcmVmbGVjdGl2ZWx5LgogICAgaWYgKGN1cnJlbnRTZXQgPT0gbmV3U2V0KSByZXR1cm47CgogICAgLy8gRWxlbWVudHMgaW4gdGhlIG1haW4gb3V0cHV0IHVuaXQgYWx3YXlzIHJlbWFpbiB0aGVyZS4KICAgIGlmIChjdXJyZW50U2V0ID09IGltcG9ydFNldHMubWFpblNldCkgcmV0dXJuOwoKICAgIGlmIChjdXJyZW50U2V0ID09IG9sZFNldCkgewogICAgICAvLyBDb250aW51ZSByZWN1cnNpdmVseSB1cGRhdGluZyBmcm9tIFtvbGRTZXRdIHRvIFtuZXdTZXRdLgogICAgICBfY2xhc3NUb1NldFtlbGVtZW50XSA9IG5ld1NldDsKCiAgICAgIERlcGVuZGVuY2llcyBkZXBlbmRlbmNpZXMgPSBuZXcgRGVwZW5kZW5jaWVzKCk7CiAgICAgIF9jb2xsZWN0QWxsRWxlbWVudHNBbmRDb25zdGFudHNSZXNvbHZlZEZyb21DbGFzcyhlbGVtZW50LCBkZXBlbmRlbmNpZXMpOwogICAgICBMaWJyYXJ5RW50aXR5IGxpYnJhcnkgPSBlbGVtZW50LmxpYnJhcnk7CiAgICAgIF9wcm9jZXNzRGVwZW5kZW5jaWVzKAogICAgICAgICAgbGlicmFyeSwgZGVwZW5kZW5jaWVzLCBvbGRTZXQsIG5ld1NldCwgcXVldWUsIGVsZW1lbnQpOwogICAgfSBlbHNlIHsKICAgICAgcXVldWUuYWRkQ2xhc3MoZWxlbWVudCwgbmV3U2V0KTsKICAgIH0KICB9CgogIHZvaWQgX3VwZGF0ZU1lbWJlclJlY3Vyc2l2ZShNZW1iZXJFbnRpdHkgZWxlbWVudCwgSW1wb3J0U2V0IG9sZFNldCwKICAgICAgSW1wb3J0U2V0IG5ld1NldCwgV29ya1F1ZXVlIHF1ZXVlKSB7CiAgICBpZiAoZWxlbWVudCA9PSBudWxsKSByZXR1cm47CgogICAgSW1wb3J0U2V0IGN1cnJlbnRTZXQgPSBfbWVtYmVyVG9TZXRbZWxlbWVudF07CgogICAgLy8gQWxyZWFkeSB2aXNpdGVkLiBXZSBtYXkgdmlzaXQgc29tZSByb290IG5vZGVzIGEgc2Vjb25kIHRpbWUgd2l0aAogICAgLy8gW2lzTWlycm9yVXNhZ2VdIGluIG9yZGVyIHRvIG1hcmsgc3RhdGljIG1lbWJlcnMgdXNlZCByZWZsZWN0aXZlbHkuCiAgICBpZiAoY3VycmVudFNldCA9PSBuZXdTZXQpIHJldHVybjsKCiAgICAvLyBFbGVtZW50cyBpbiB0aGUgbWFpbiBvdXRwdXQgdW5pdCBhbHdheXMgcmVtYWluIHRoZXJlLgogICAgaWYgKGN1cnJlbnRTZXQgPT0gaW1wb3J0U2V0cy5tYWluU2V0KSByZXR1cm47CgogICAgaWYgKGN1cnJlbnRTZXQgPT0gb2xkU2V0KSB7CiAgICAgIC8vIENvbnRpbnVlIHJlY3Vyc2l2ZWx5IHVwZGF0aW5nIGZyb20gW29sZFNldF0gdG8gW25ld1NldF0uCiAgICAgIF9tZW1iZXJUb1NldFtlbGVtZW50XSA9IG5ld1NldDsKCiAgICAgIERlcGVuZGVuY2llcyBkZXBlbmRlbmNpZXMgPSBuZXcgRGVwZW5kZW5jaWVzKCk7CiAgICAgIF9jb2xsZWN0QWxsRWxlbWVudHNBbmRDb25zdGFudHNSZXNvbHZlZEZyb21NZW1iZXIoZWxlbWVudCwgZGVwZW5kZW5jaWVzKTsKCiAgICAgIExpYnJhcnlFbnRpdHkgbGlicmFyeSA9IGVsZW1lbnQubGlicmFyeTsKICAgICAgX3Byb2Nlc3NEZXBlbmRlbmNpZXMoCiAgICAgICAgICBsaWJyYXJ5LCBkZXBlbmRlbmNpZXMsIG9sZFNldCwgbmV3U2V0LCBxdWV1ZSwgZWxlbWVudCk7CiAgICB9IGVsc2UgewogICAgICBxdWV1ZS5hZGRNZW1iZXIoZWxlbWVudCwgbmV3U2V0KTsKICAgIH0KICB9CgogIHZvaWQgX3VwZGF0ZUxvY2FsRnVuY3Rpb24oCiAgICAgIExvY2FsIGxvY2FsRnVuY3Rpb24sIEltcG9ydFNldCBvbGRTZXQsIEltcG9ydFNldCBuZXdTZXQpIHsKICAgIEltcG9ydFNldCBjdXJyZW50U2V0ID0gX2xvY2FsRnVuY3Rpb25Ub1NldFtsb2NhbEZ1bmN0aW9uXTsKICAgIGlmIChjdXJyZW50U2V0ID09IG5ld1NldCkgcmV0dXJuOwoKICAgIC8vIEVsZW1lbnRzIGluIHRoZSBtYWluIG91dHB1dCB1bml0IGFsd2F5cyByZW1haW4gdGhlcmUuCiAgICBpZiAoY3VycmVudFNldCA9PSBpbXBvcnRTZXRzLm1haW5TZXQpIHJldHVybjsKCiAgICBpZiAoY3VycmVudFNldCA9PSBvbGRTZXQpIHsKICAgICAgX2xvY2FsRnVuY3Rpb25Ub1NldFtsb2NhbEZ1bmN0aW9uXSA9IG5ld1NldDsKICAgIH0gZWxzZSB7CiAgICAgIF9sb2NhbEZ1bmN0aW9uVG9TZXRbbG9jYWxGdW5jdGlvbl0gPSBpbXBvcnRTZXRzLnVuaW9uKGN1cnJlbnRTZXQsIG5ld1NldCk7CiAgICB9CiAgICAvLyBOb3RlOiBsb2NhbCBmdW5jdGlvbnMgYXJlIG5vdCB1cGRhdGVkIHJlY3Vyc2l2ZWx5IGJlY2F1c2UgdGhlCiAgICAvLyBkZXBlbmRlbmNpZXMgYXJlIGFscmVhZHkgdmlzaXRlZCBhcyBkZXBlbmRlbmNpZXMgb2YgdGhlIGVuY2xvc2luZyBtZW1iZXIuCiAgfQoKICAvLy8gV2hldGhlciB0byBlbnF1ZXVlIGEgZGVmZXJyZWQgZGVwZW5kZW5jeS4KICAvLy8KICAvLy8gRHVlIHRvIHRoZSBuYXR1cmUgb2YgdGhlIGFsZ29yaXRobSwgc29tZSBkZXBlbmRlbmNpZXMgbWF5IGJlIHZpc2l0ZWQgbW9yZQogIC8vLyB0aGFuIG9uY2UuIEhvd2V2ZXIsIHdlIGtub3cgdGhhdCBuZXcgZGVmZXJyZWQtaW1wb3J0cyBhcmUgb25seSBkaXNjb3ZlcmVkCiAgLy8vIHdoZW4gd2UgYXJlIHZpc2l0aW5nIHRoZSBtYWluIG91dHB1dCB1bml0IChzaXplID09IDApIG9yIGNvZGUgcmVhY2hhYmxlCiAgLy8vIGZyb20gYSBkZWZlcnJlZCBpbXBvcnQgKHNpemUgPT0gMSkuIEFmdGVyIHRoYXQsIHdlIGFyZSByZWRpc2NvdmVyaW5nIHRoZQogIC8vLyBzYW1lIG5vZGVzIHdlIGhhdmUgYWxyZWFkeSBzZWVuLgogIF9zaG91bGRBZGREZWZlcnJlZERlcGVuZGVuY3koSW1wb3J0U2V0IG5ld1NldCkgPT4gbmV3U2V0Lmxlbmd0aCA8PSAxOwoKICB2b2lkIF9maXhEZXBlbmRlbmN5SW5mbyhEZXBlbmRlbmN5SW5mbyBpbmZvLCBMaXN0PEltcG9ydEVudGl0eT4gaW1wb3J0cywKICAgICAgU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUsIFNwYW5uYWJsZSBjb250ZXh0KSB7CiAgICB2YXIgaXNEZWZlcnJlZCA9IF9pc0V4cGxpY2l0bHlEZWZlcnJlZChpbXBvcnRzKTsKICAgIGlmIChpc0RlZmVycmVkKSB7CiAgICAgIGlmICghbmV3RGVmZXJyZWRTcGxpdCkgewogICAgICAgIGluZm8uaXNEZWZlcnJlZCA9IHRydWU7CiAgICAgICAgaW5mby5pbXBvcnRzID0gaW1wb3J0czsKICAgICAgfQogICAgICBpZiAocmVwb3J0SW52YWxpZEluZmVycmVkRGVmZXJyZWRUeXBlcykgewogICAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZShjb250ZXh0LCBNZXNzYWdlS2luZC5HRU5FUklDLCB7CiAgICAgICAgICAndGV4dCc6ICIkcHJlZml4ICckbmFtZScgaXMgZGVmZXJyZWQgYnV0IGFwcGVhcnMgdG8gYmUgaW5mZXJyZWQgYXMiCiAgICAgICAgICAgICAgIiBhIHJldHVybiB0eXBlIG9yIGEgdHlwZSBwYXJhbWV0ZXIgKGRhcnRidWcuY29tLzM1MzExKS4iCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFRoZSBmb2xsb3dpbmcgMyBtZXRob2RzIGFyZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIG5ldyBkZWZlcnJlZCBzcGxpdAogIC8vIGFsZ29yaXRobSBhbmQgdGhlIG9sZCBvbmUgbWF0Y2guIEJlY2F1c2Ugb2YgYSBzb3VuZG5lc3MgYnVnIGluIHRoZSBvbGQKICAvLyBhbGdvcml0aG0gdGhlIG5ldyBhbGdvcml0aG0gY2FuIHB1bGwgaW4gYSBsb3Qgb2YgY29kZSB0byB0aGUgbWFpbiBvdXRwdXQKICAvLyB1bml0LiBUaGlzIGxvZ2ljIGRldGVjdHMgaXQgYW5kIHdpbGwgbWFrZSBpdCBlYXNpZXIgZm9yIHVzIHRvIG1pZ3JhdGUgY29kZQogIC8vIG9mZiBpdCBpbmNyZW1lbnRhbGx5LgogIC8vIE5vdGU6IHdlIG9ubHkgZXhwZWN0IGRpc2NyZXBhbmNpZXMgb24gY2xhc3MtZGVwZW5kZW5jeS1pbmZvIGR1ZSB0byBob3cKICAvLyBpbmZlcnJlZCB0eXBlcyBleHBvc2UgZGVmZXJyZWQgdHlwZXMgaW4gdHlwZS12YXJpYWJsZXMgYW5kIHJldHVybiB0eXBlcwogIC8vIChJc3N1ZSAjMzUzMTEpLiBXZSBhZGRlZCB0aGUgb3RoZXIgdHdvIG1ldGhvZHMgdG8gdGVzdCBvdXIgdHJhbnNpdGlvbiwgYnV0CiAgLy8gd2UgZG9uJ3QgZXhwZWN0IHRvIGRldGVjdCBhbnkgbWlzbWF0Y2hlcyB0aGVyZS4KICAvLwogIC8vIFRPRE8oc2lnbXVuZCk6IGRlbGV0ZSBvbmNlIHRoZSBuZXcgaW1wbGVtZW50YXRpb24gaXMgb24gYnkgZGVmYXVsdC4KICB2b2lkIF9maXhDbGFzc0RlcGVuZGVuY3lJbmZvKERlcGVuZGVuY3lJbmZvIGluZm8sIENsYXNzRW50aXR5IGNscywKICAgICAgTGlicmFyeUVudGl0eSBsaWJyYXJ5LCBTcGFubmFibGUgY29udGV4dCkgewogICAgaWYgKGluZm8uaXNEZWZlcnJlZCkgcmV0dXJuOwogICAgaWYgKG5ld0RlZmVycmVkU3BsaXQgJiYgIXJlcG9ydEludmFsaWRJbmZlcnJlZERlZmVycmVkVHlwZXMpIHJldHVybjsKICAgIHZhciBpbXBvcnRzID0gY2xhc3NJbXBvcnRzVG8oY2xzLCBsaWJyYXJ5KTsKICAgIF9maXhEZXBlbmRlbmN5SW5mbyhpbmZvLCBpbXBvcnRzLCAiQ2xhc3MiLCBjbHMubmFtZSwgY29udGV4dCk7CiAgfQoKICB2b2lkIF9maXhNZW1iZXJEZXBlbmRlbmN5SW5mbyhEZXBlbmRlbmN5SW5mbyBpbmZvLCBNZW1iZXJFbnRpdHkgbWVtYmVyLAogICAgICBMaWJyYXJ5RW50aXR5IGxpYnJhcnksIFNwYW5uYWJsZSBjb250ZXh0KSB7CiAgICBpZiAoaW5mby5pc0RlZmVycmVkIHx8IGNvbXBpbGVyLm9wdGlvbnMubmV3RGVmZXJyZWRTcGxpdCkgcmV0dXJuOwogICAgdmFyIGltcG9ydHMgPSBtZW1iZXJJbXBvcnRzVG8obWVtYmVyLCBsaWJyYXJ5KTsKICAgIF9maXhEZXBlbmRlbmN5SW5mbyhpbmZvLCBpbXBvcnRzLCAiTWVtYmVyIiwgbWVtYmVyLm5hbWUsIGNvbnRleHQpOwogIH0KCiAgdm9pZCBfZml4Q29uc3RhbnREZXBlbmRlbmN5SW5mbyhEZXBlbmRlbmN5SW5mbyBpbmZvLCBDb25zdGFudFZhbHVlIGNvbnN0YW50LAogICAgICBMaWJyYXJ5RW50aXR5IGxpYnJhcnksIFNwYW5uYWJsZSBjb250ZXh0KSB7CiAgICBpZiAoaW5mby5pc0RlZmVycmVkIHx8IGNvbXBpbGVyLm9wdGlvbnMubmV3RGVmZXJyZWRTcGxpdCkgcmV0dXJuOwogICAgaWYgKGNvbnN0YW50IGlzIFR5cGVDb25zdGFudFZhbHVlKSB7CiAgICAgIHZhciB0eXBlID0gY29uc3RhbnQucmVwcmVzZW50ZWRUeXBlOwogICAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgdmFyIGltcG9ydHMgPSBjbGFzc0ltcG9ydHNUbyh0eXBlLmVsZW1lbnQsIGxpYnJhcnkpOwogICAgICAgIF9maXhEZXBlbmRlbmN5SW5mbygKICAgICAgICAgICAgaW5mbywgaW1wb3J0cywgIkNsYXNzIChpbiBjb25zdGFudCkgIiwgdHlwZS5lbGVtZW50Lm5hbWUsIGNvbnRleHQpOwogICAgICB9IGVsc2UgaWYgKHR5cGUgaXMgVHlwZWRlZlR5cGUpIHsKICAgICAgICB2YXIgaW1wb3J0cyA9IHR5cGVkZWZJbXBvcnRzVG8odHlwZS5lbGVtZW50LCBsaWJyYXJ5KTsKICAgICAgICBfZml4RGVwZW5kZW5jeUluZm8oCiAgICAgICAgICAgIGluZm8sIGltcG9ydHMsICJUeXBlZGVmICIsIHR5cGUuZWxlbWVudC5uYW1lLCBjb250ZXh0KTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBfcHJvY2Vzc0RlcGVuZGVuY2llcyhMaWJyYXJ5RW50aXR5IGxpYnJhcnksIERlcGVuZGVuY2llcyBkZXBlbmRlbmNpZXMsCiAgICAgIEltcG9ydFNldCBvbGRTZXQsIEltcG9ydFNldCBuZXdTZXQsIFdvcmtRdWV1ZSBxdWV1ZSwgU3Bhbm5hYmxlIGNvbnRleHQpIHsKICAgIGRlcGVuZGVuY2llcy5jbGFzc2VzLmZvckVhY2goKENsYXNzRW50aXR5IGNscywgRGVwZW5kZW5jeUluZm8gaW5mbykgewogICAgICBfZml4Q2xhc3NEZXBlbmRlbmN5SW5mbyhpbmZvLCBjbHMsIGxpYnJhcnksIGNvbnRleHQpOwogICAgICBpZiAoaW5mby5pc0RlZmVycmVkKSB7CiAgICAgICAgaWYgKF9zaG91bGRBZGREZWZlcnJlZERlcGVuZGVuY3kobmV3U2V0KSkgewogICAgICAgICAgZm9yIChJbXBvcnRFbnRpdHkgZGVmZXJyZWRJbXBvcnQgaW4gaW5mby5pbXBvcnRzKSB7CiAgICAgICAgICAgIHF1ZXVlLmFkZENsYXNzKGNscywgaW1wb3J0U2V0cy5zaW5nbGV0b24oZGVmZXJyZWRJbXBvcnQpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX3VwZGF0ZUNsYXNzUmVjdXJzaXZlKGNscywgb2xkU2V0LCBuZXdTZXQsIHF1ZXVlKTsKICAgICAgfQogICAgfSk7CgogICAgZGVwZW5kZW5jaWVzLm1lbWJlcnMuZm9yRWFjaCgoTWVtYmVyRW50aXR5IG1lbWJlciwgRGVwZW5kZW5jeUluZm8gaW5mbykgewogICAgICBfZml4TWVtYmVyRGVwZW5kZW5jeUluZm8oaW5mbywgbWVtYmVyLCBsaWJyYXJ5LCBjb250ZXh0KTsKICAgICAgaWYgKGluZm8uaXNEZWZlcnJlZCkgewogICAgICAgIGlmIChfc2hvdWxkQWRkRGVmZXJyZWREZXBlbmRlbmN5KG5ld1NldCkpIHsKICAgICAgICAgIGZvciAoSW1wb3J0RW50aXR5IGRlZmVycmVkSW1wb3J0IGluIGluZm8uaW1wb3J0cykgewogICAgICAgICAgICBxdWV1ZS5hZGRNZW1iZXIobWVtYmVyLCBpbXBvcnRTZXRzLnNpbmdsZXRvbihkZWZlcnJlZEltcG9ydCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBfdXBkYXRlTWVtYmVyUmVjdXJzaXZlKG1lbWJlciwgb2xkU2V0LCBuZXdTZXQsIHF1ZXVlKTsKICAgICAgfQogICAgfSk7CgogICAgZm9yIChMb2NhbCBsb2NhbEZ1bmN0aW9uIGluIGRlcGVuZGVuY2llcy5sb2NhbEZ1bmN0aW9ucykgewogICAgICBfdXBkYXRlTG9jYWxGdW5jdGlvbihsb2NhbEZ1bmN0aW9uLCBvbGRTZXQsIG5ld1NldCk7CiAgICB9CgogICAgZGVwZW5kZW5jaWVzLmNvbnN0YW50cwogICAgICAgIC5mb3JFYWNoKChDb25zdGFudFZhbHVlIGNvbnN0YW50LCBEZXBlbmRlbmN5SW5mbyBpbmZvKSB7CiAgICAgIF9maXhDb25zdGFudERlcGVuZGVuY3lJbmZvKGluZm8sIGNvbnN0YW50LCBsaWJyYXJ5LCBjb250ZXh0KTsKICAgICAgaWYgKGluZm8uaXNEZWZlcnJlZCkgewogICAgICAgIGlmIChfc2hvdWxkQWRkRGVmZXJyZWREZXBlbmRlbmN5KG5ld1NldCkpIHsKICAgICAgICAgIGZvciAoSW1wb3J0RW50aXR5IGRlZmVycmVkSW1wb3J0IGluIGluZm8uaW1wb3J0cykgewogICAgICAgICAgICBxdWV1ZS5hZGRDb25zdGFudChjb25zdGFudCwgaW1wb3J0U2V0cy5zaW5nbGV0b24oZGVmZXJyZWRJbXBvcnQpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX3VwZGF0ZUNvbnN0YW50UmVjdXJzaXZlKGNvbnN0YW50LCBvbGRTZXQsIG5ld1NldCwgcXVldWUpOwogICAgICB9CiAgICB9KTsKICB9CgogIC8vLyBDb21wdXRlcyBhIHVuaXF1ZSBzdHJpbmcgZm9yIHRoZSBuYW1lIGZpZWxkIGZvciBlYWNoIG91dHB1dFVuaXQuCiAgdm9pZCBfY3JlYXRlT3V0cHV0VW5pdHMoKSB7CiAgICBpbnQgY291bnRlciA9IDE7CiAgICB2b2lkIGFkZFVuaXQoSW1wb3J0U2V0IGltcG9ydFNldCkgewogICAgICBpZiAoaW1wb3J0U2V0LnVuaXQgIT0gbnVsbCkgcmV0dXJuOwogICAgICB2YXIgdW5pdCA9IG5ldyBPdXRwdXRVbml0KGZhbHNlLCAnJGNvdW50ZXInLAogICAgICAgICAgaW1wb3J0U2V0Ll9pbXBvcnRzLm1hcCgoaSkgPT4gaS5kZWNsYXJhdGlvbikudG9TZXQoKSk7CiAgICAgIGNvdW50ZXIrKzsKICAgICAgaW1wb3J0U2V0LnVuaXQgPSB1bml0OwogICAgICBfYWxsT3V0cHV0VW5pdHMuYWRkKHVuaXQpOwogICAgfQoKICAgIC8vIEdlbmVyYXRlIGFuIG91dHB1dCB1bml0IGZvciBhbGwgaW1wb3J0IHNldHMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIGFuCiAgICAvLyBlbGVtZW50IG9yIGNvbnN0YW50LgogICAgX2NsYXNzVG9TZXQudmFsdWVzLmZvckVhY2goYWRkVW5pdCk7CiAgICBfbWVtYmVyVG9TZXQudmFsdWVzLmZvckVhY2goYWRkVW5pdCk7CiAgICBfbG9jYWxGdW5jdGlvblRvU2V0LnZhbHVlcy5mb3JFYWNoKGFkZFVuaXQpOwogICAgX2NvbnN0YW50VG9TZXQudmFsdWVzLmZvckVhY2goYWRkVW5pdCk7CgogICAgLy8gU29ydCBvdXRwdXQgdW5pdHMgdG8gbWFrZSB0aGUgb3V0cHV0IG9mIHRoZSBjb21waWxlciBtb3JlIHN0YWJsZS4KICAgIF9hbGxPdXRwdXRVbml0cy5zb3J0KCk7CiAgfQoKICBNYXA8U3RyaW5nLCBMaXN0PE91dHB1dFVuaXQ+PiBfc2V0dXBIdW5rc1RvTG9hZCgpIHsKICAgIE1hcDxTdHJpbmcsIExpc3Q8T3V0cHV0VW5pdD4+IGh1bmtzVG9Mb2FkID0ge307CiAgICBTZXQ8U3RyaW5nPiB1c2VkSW1wb3J0TmFtZXMgPSBuZXcgU2V0PFN0cmluZz4oKTsKCiAgICBmb3IgKEltcG9ydEVudGl0eSBpbXBvcnQgaW4gX2FsbERlZmVycmVkSW1wb3J0cykgewogICAgICBTdHJpbmcgcmVzdWx0ID0gY29tcHV0ZUltcG9ydERlZmVyTmFtZShpbXBvcnQsIGNvbXBpbGVyKTsKICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKTsKICAgICAgLy8gTm90ZTogdG9vbHMgdGhhdCBwcm9jZXNzIHRoZSBqc29uIGZpbGUgdG8gYnVpbGQgbXVsdGktcGFydCBpbml0aWFsIGxvYWQKICAgICAgLy8gYnVuZGxlcyBkZXBlbmQgb24gdGhlIGZhY3QgdGhhdCBtYWtlVW5pcXVlIGFwcGVuZHMgb25seSBkaWdpdHMsIG9yIGEKICAgICAgLy8gcGVyaW9kIGZvbGxvd2VkIGJ5IGRpZ2l0cy4KICAgICAgX2ltcG9ydERlZmVyTmFtZVtpbXBvcnRdID0gbWFrZVVuaXF1ZShyZXN1bHQsIHVzZWRJbXBvcnROYW1lcywgJy4nKTsKICAgIH0KCiAgICAvLyBTb3J0IHRoZSBvdXRwdXQgdW5pdHMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiB0aGUgbnVtYmVyIG9mIGltcG9ydHMgdGhleQogICAgLy8gaW5jbHVkZS4KCiAgICAvLyBUaGUgbG9hZGluZyBvZiB0aGUgb3V0cHV0IHVuaXRzIG11c3QgYmUgb3JkZXJlZCBiZWNhdXNlIGEgc3VwZXJjbGFzcwogICAgLy8gbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGl0cyBzdWJjbGFzcy4KICAgIC8vIEJ1dCBhIGNsYXNzIGNhbiBvbmx5IGRlcGVuZCBvbiBhbm90aGVyIGNsYXNzIGluIGFuIG91dHB1dCB1bml0IHNoYXJlZCBieQogICAgLy8gYSBzdHJpY3Qgc3VwZXJzZXQgb2YgdGhlIGltcG9ydHM6CiAgICAvLyBCeSBjb250cmFkaWN0aW9uOiBBc3N1bWUgYSBjbGFzcyBDIGluIG91dHB1dCB1bml0IHNoYXJlZCBieSBpbXBvcnRzIGluCiAgICAvLyB0aGUgc2V0IFMxID0gKGxpYjEsLi4sIGxpYl9uKSBkZXBlbmRzIG9uIGEgY2xhc3MgRCBpbiBhbiBvdXRwdXQgdW5pdAogICAgLy8gc2hhcmVkIGJ5IFMyIHN1Y2ggdGhhdCBTMiBub3QgYSBzdXBlcnNldCBvZiBTMS4gTGV0IGxpYl9zIGJlIGEgbGlicmFyeSBpbgogICAgLy8gUzEgbm90IGluIFMyLiBsaWJfcyBtdXN0IGRlcGVuZCBvbiBDLCBhbmQgdGhlbiBpbiB0dXJuIG9uIEQuIFRoZXJlZm9yZSBECiAgICAvLyBpcyBub3QgaW4gdGhlIHJpZ2h0IG91dHB1dCB1bml0LgogICAgTGlzdDxPdXRwdXRVbml0PiBzb3J0ZWRPdXRwdXRVbml0cyA9IF9hbGxPdXRwdXRVbml0cy5yZXZlcnNlZC50b0xpc3QoKTsKCiAgICAvLyBGb3IgZWFjaCBkZWZlcnJlZCBpbXBvcnQgd2UgZmluZCBvdXQgd2hpY2ggb3V0cHV0VW5pdHMgdG8gbG9hZC4KICAgIGZvciAoSW1wb3J0RW50aXR5IGltcG9ydCBpbiBfYWxsRGVmZXJyZWRJbXBvcnRzKSB7CiAgICAgIC8vIFdlIGV4cGVjdCB0byBmaW5kIGFuIGVudHJ5IGZvciBhbnkgY2FsbCB0byBgbG9hZExpYnJhcnlgLCBldmVuIGlmCiAgICAgIC8vIHRoZXJlIGlzIG5vIGNvZGUgdG8gbG9hZC4gSW4gdGhhdCBjYXNlLCB0aGUgZW50cnkgd2lsbCBiZSBhbiBlbXB0eQogICAgICAvLyBsaXN0LgogICAgICBodW5rc1RvTG9hZFtfaW1wb3J0RGVmZXJOYW1lW2ltcG9ydF1dID0gbmV3IExpc3Q8T3V0cHV0VW5pdD4oKTsKICAgICAgZm9yIChPdXRwdXRVbml0IG91dHB1dFVuaXQgaW4gc29ydGVkT3V0cHV0VW5pdHMpIHsKICAgICAgICBpZiAob3V0cHV0VW5pdCA9PSBfbWFpbk91dHB1dFVuaXQpIGNvbnRpbnVlOwogICAgICAgIGlmIChvdXRwdXRVbml0Ll9pbXBvcnRzLmNvbnRhaW5zKGltcG9ydCkpIHsKICAgICAgICAgIGh1bmtzVG9Mb2FkW19pbXBvcnREZWZlck5hbWVbaW1wb3J0XV0uYWRkKG91dHB1dFVuaXQpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGh1bmtzVG9Mb2FkOwogIH0KCiAgLy8vIFJldHVybnMgYSBuYW1lIGZvciBhIGRlZmVycmVkIGltcG9ydC4KICBTdHJpbmcgY29tcHV0ZUltcG9ydERlZmVyTmFtZShJbXBvcnRFbnRpdHkgZGVjbGFyYXRpb24sIENvbXBpbGVyIGNvbXBpbGVyKSB7CiAgICBhc3NlcnQoZGVjbGFyYXRpb24uaXNEZWZlcnJlZCk7CiAgICBpZiAoZGVjbGFyYXRpb24ubmFtZSAhPSBudWxsKSB7CiAgICAgIHJldHVybiBkZWNsYXJhdGlvbi5uYW1lOwogICAgfSBlbHNlIHsKICAgICAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gdGhlIGRlZmVycmVkIGltcG9ydCBpc24ndCBkZWNsYXJlZCB3aXRoIGEgcHJlZml4LgogICAgICBhc3NlcnQoY29tcGlsZXIuY29tcGlsYXRpb25GYWlsZWQpOwogICAgICByZXR1cm4gJyc7CiAgICB9CiAgfQoKICAvLy8gUGVyZm9ybXMgdGhlIGRlZmVycmVkIGxvYWRpbmcgYWxnb3JpdGhtLgogIC8vLwogIC8vLyBUaGUgZGVmZXJyZWQgbG9hZGluZyBhbGdvcml0aG0gbWFwcyBlbGVtZW50cyBhbmQgY29uc3RhbnRzIHRvIGFuIG91dHB1dAogIC8vLyB1bml0LiBFYWNoIG91dHB1dCB1bml0IGlzIGlkZW50aWZpZWQgYnkgYSBzdWJzZXQgb2YgZGVmZXJyZWQgaW1wb3J0cyAoYW4KICAvLy8gW0ltcG9ydFNldF0pLCBhbmQgdGhleSB3aWxsIGNvbnRhaW4gdGhlIGVsZW1lbnRzIHRoYXQgYXJlIGluaGVyZW50bHkgdXNlZAogIC8vLyBieSBhbGwgdGhvc2UgZGVmZXJyZWQgaW1wb3J0cy4gQW4gZWxlbWVudCBpcyB1c2VkIGJ5IGEgZGVmZXJyZWQgaW1wb3J0IGlmCiAgLy8vIGl0IGlzIGVpdGhlciBsb2FkZWQgYnkgdGhhdCBpbXBvcnQgb3IgdHJhbnNpdGl2ZWx5IGFjY2Vzc2VkIGJ5IGFuIGVsZW1lbnQKICAvLy8gdGhhdCB0aGUgaW1wb3J0IGxvYWRzLiAgQW4gZW1wdHkgc2V0IHJlcHJlc2VudHMgdGhlIG1haW4gb3V0cHV0IHVuaXQsCiAgLy8vIHdoaWNoIGNvbnRhaW5zIGFueSBlbGVtZW50cyB0aGF0IGFyZSBhY2Nlc3NlZCBkaXJlY3RseSBhbmQgYXJlIG5vdAogIC8vLyBkZWZlcnJlZC4KICAvLy8KICAvLy8gVGhlIGFsZ29yaXRobSB0cmF2ZXJzZXMgdGhlIGVsZW1lbnQgbW9kZWwgcmVjdXJzaXZlbHkgbG9va2luZyBmb3IKICAvLy8gZGVwZW5kZW5jaWVzIGJldHdlZW4gZWxlbWVudHMuIFRoZXNlIGRlcGVuZGVuY2llcyBtYXkgYmUgZGVmZXJyZWQgb3IKICAvLy8gbm9uLWRlZmVycmVkLiBEZWZlcnJlZCBkZXBlbmRlbmNpZXMgYXJlIG1haW5seSB1c2VkIHRvIGRpc2NvdmVyIHRoZSByb290CiAgLy8vIGVsZW1lbnRzIHRoYXQgYXJlIGxvYWRlZCBmcm9tIGRlZmVycmVkIGltcG9ydHMsIHdoaWxlIG5vbi1kZWZlcnJlZAogIC8vLyBkZXBlbmRlbmNpZXMgYXJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgYXNzb2NpYXRlIG1vcmUgZWxlbWVudHMgdG8gb3V0cHV0CiAgLy8vIHVuaXRzLgogIC8vLwogIC8vLyBOYWl2ZWx5LCB0aGUgYWxnb3JpdGhtIHRyYXZlcnNlcyBlYWNoIHJvb3Qgb2YgYSBkZWZlcnJlZCBpbXBvcnQgYW5kIG1hcmtzCiAgLy8vIGV2ZXJ5dGhpbmcgaXQgY2FuIHJlYWNoIGFzIGJlaW5nIHVzZWQgYnkgdGhhdCBpbXBvcnQuIFRvIHJlZHVjZSBob3cgbWFueQogIC8vLyB0aW1lcyB3ZSB2aXNpdCBhbiBlbGVtZW50LCB3ZSB1c2UgYW4gYWxnb3JpdGhtIHRoYXQgd29ya3MgaW4gc2VnbWVudHM6IGl0CiAgLy8vIG1hcmtzIGVsZW1lbnRzIHdpdGggYSBzdWJzZXQgb2YgZGVmZXJyZWQgaW1wb3J0cyBhdCBhIHRpbWUsIHVudGlsIGl0CiAgLy8vIGRldGVjdHMgYSBtZXJnZSBwb2ludCB3aGVyZSBtb3JlIGRlZmVycmVkIGltcG9ydHMgY291bGQgYmUgY29uc2lkZXJlZCBhdAogIC8vLyBvbmNlLgogIC8vLwogIC8vLyBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhpcyBkZXBlbmRlbmN5IGdyYXBoIChpZ25vcmluZyBlbGVtZW50cyBpbiB0aGUgbWFpbgogIC8vLyBvdXRwdXQgdW5pdCk6CiAgLy8vCiAgLy8vICAgZGVmZXJyZWQgaW1wb3J0IEE6IGExIC0tLT4gczEgLS0tPiBzMiAgLT4gczMKICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICAgICAgIF4KICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKICAvLy8gICBkZWZlcnJlZCBpbXBvcnQgQjogYjEgLS0tLS0rICAgICAgIHwKICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAvLy8gICBkZWZlcnJlZCBpbXBvcnQgQzogYzEgLS0tPiBjMiAtLS0+IGMzCiAgLy8vCiAgLy8vIFRoZSBhbGdvcml0aG0gd2lsbCBjb21wdXRlIGEgcmVzdWx0IHdpdGggNSBkZWZlcnJlZCBvdXRwdXQgdW5pdHM6CiAgLy8KICAvLy8gICAqIHVuaXQge0F9OiAgICAgICAgY29udGFpbnMgYTEKICAvLy8gICAqIHVuaXQge0J9OiAgICAgICAgY29udGFpbnMgYjEKICAvLy8gICAqIHVuaXQge0N9OiAgICAgICAgY29udGFpbnMgYzEsIGMyLCBhbmQgYzMKICAvLy8gICAqIHVuaXQge0EsIEJ9OiAgICAgY29udGFpbnMgczEKICAvLy8gICAqIHVuaXQge0EsIEIsIEN9OiAgY29udGFpbnMgczIsIGFuZCBzMwogIC8vLwogIC8vLyBBZnRlciBtYXJraW5nIGV2ZXJ5dGhpbmcgcmVhY2hhYmxlIGZyb20gbWFpbiBhcyBwYXJ0IG9mIHRoZSBtYWluIG91dHB1dAogIC8vLyB1bml0LCBvdXIgYWxnb3JpdGhtIHdpbGwgd29yayBhcyBmb2xsb3dzOgogIC8vLwogIC8vLyAgICogSW5pdGlhbGx5IGFsbCBkZWZlcnJlZCBlbGVtZW50cyBoYXZlIG5vIG1hcHBpbmcuCiAgLy8vICAgKiBXZSBtYWtlIG5vdGUgb2Ygd29yayB0byBkbywgaW5pdGlhbGx5IHRvIG1hcmsgdGhlIHJvb3Qgb2YgZWFjaAogIC8vLyAgICAgZGVmZXJyZWQgaW1wb3J0OgogIC8vLyAgICAgICAgKiBhMSB3aXRoIEEsIGFuZCByZWN1cnNlIGZyb20gdGhlcmUuCiAgLy8vICAgICAgICAqIGIxIHdpdGggQiwgYW5kIHJlY3Vyc2UgZnJvbSB0aGVyZS4KICAvLy8gICAgICAgICogYzEgd2l0aCBDLCBhbmQgcmVjdXJzZSBmcm9tIHRoZXJlLgogIC8vLyAgICogd2UgdXBkYXRlIGExLCBzMSwgczIsIHMzIGZyb20gbm8gbWFwcGluZyB0byB7QX0KICAvLy8gICAqIHdlIHVwZGF0ZSBiMSBmcm9tIG5vIG1hcHBpbmcgdG8ge0J9LCBhbmQgd2hlbiB3ZSBmaW5kIHMxIHdlIG5vdGljZQogIC8vLyAgICAgdGhhdCBzMSBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBhbm90aGVyIGltcG9ydCBzZXQge0F9LCBzbyB3ZSBtYWtlCiAgLy8vICAgICBub3RlIG9mIGFkZGl0aW9uYWwgd29yayBmb3IgbGF0ZXIgdG8gbWFyayBzMSB3aXRoIHtBLCBCfQogIC8vLyAgICogd2UgdXBkYXRlIGMxLCBjMiwgYzMgdG8ge0N9LCBhbmQgbWFrZSBhIG5vdGUgdG8gdXBkYXRlIHMyIHdpdGgge0EsIEN9CiAgLy8vICAgKiB3ZSB1cGRhdGUgczEgdG8ge0EsIEJ9LCBhbmQgdXBkYXRlIHRoZSBleGlzdGluZyBub3RlIHRvIHVwZGF0ZSBzMiwgbm93CiAgLy8vICAgICB3aXRoIHtBLCBCLCBDfQogIC8vLyAgICogZmluYWxseSB3ZSB1cGRhdGUgczIgYW5kIHMzIHdpdGgge0EsIEIsIEN9IGluIG9uZSBnbywgd2l0aG91dCBldmVyCiAgLy8vICAgICB1cGRhdGluZyB0aGVtIHRvIHRoZSBpbnRlcm1lZGlhdGUgc3RhdGUge0EsIEN9LgogIC8vLwogIC8vLyBUaGUgaW1wbGVtZW50YXRpb24gYmVsb3cgZG9lcyBhdG9taWMgdXBkYXRlcyBmcm9tIG9uZSBpbXBvcnQtc2V0IHRvCiAgLy8vIGFub3RoZXIuICBBdCBmaXJzdCB3ZSBhZGQgb25lIGRlZmVycmVkIGltcG9ydCBhdCBhIHRpbWUsIGJ1dCBhcyB0aGUKICAvLy8gYWxnb3JpdGhtIHByb2dlc3NlcyBpdCBtYXkgdXBkYXRlIGEgc21hbGwgaW1wb3J0LXNldCB3aXRoIGEgbGFyZ2VyCiAgLy8vIGltcG9ydC1zZXQgaW4gb25lIGdvLiBUaGUga2V5IG9mIHRoaXMgYWxnb3JpdGhtIGlzIHRvIGRldGVjdCB3aGVuIHNoYXJpbmcKICAvLy8gYmVnaW5zLCBzbyB3ZSBjYW4gdXBkYXRlIHRob3NlIGVsZW1lbnRzIG1vcmUgZWZmaWNlbnRseS4KICAvLy8KICAvLy8gVG8gZGV0ZWN0IHRoZXNlIG1lcmdlIHBvaW50cyB3aGVyZSBzaGFyaW5nIGJlZ2lucywgdGhlIGltcGxlbWVudGF0aW9uCiAgLy8vIGJlbG93IHVzZXMgYGEgc3dhcCBvcGVyYXRpb25gOiB3ZSBmaXJzdCBjb21wYXJlIHdoYXQgdGhlIG9sZCBpbXBvcnQtc2V0CiAgLy8vIGlzLCBhbmQgaWYgaXQgbWF0Y2hlcyBvdXIgZXhwZWN0YXRpb24sIHRoZSBzd2FwIGlzIGRvbmUgYW5kIHdlIHJlY3Vyc2UsCiAgLy8vIG90aGVyd2lzZSBhIG1lcmdlIHJvb3Qgd2FzIGRldGVjdGVkIGFuZCB3ZSBlbnF1ZXVlIGEgbmV3IHNlZ21lbnQgb2YKICAvLy8gdXBkYXRlcyBmb3IgbGF0ZXIuCiAgLy8vCiAgLy8vIFRPRE8oc2lnbXVuZCk6IGludmVzdGlnYXRlIGRpZmZlcmVudCBoZXVyaXN0aWNzIGZvciBob3cgdG8gc2VsZWN0IHRoZSBuZXh0CiAgLy8vIHdvcmsgaXRlbSAoZS5nLiB3ZSBtaWdodCBjb252ZXJnZSBmYXN0ZXIgaWYgd2UgcGljayBmaXJzdCB0aGUgdXBkYXRlIHRoYXQKICAvLy8gY29udGFpbnMgYSBiaWdnZXIgZGVsdGEuKQogIE91dHB1dFVuaXREYXRhIHJ1bihGdW5jdGlvbkVudGl0eSBtYWluLCBLQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGlmICghaXNQcm9ncmFtU3BsaXQgfHwgbWFpbiA9PSBudWxsIHx8IGRpc2FibGVQcm9ncmFtU3BsaXQpIHsKICAgICAgcmV0dXJuIF9idWlsZFJlc3VsdCgpOwogICAgfQoKICAgIHdvcmsoKSB7CiAgICAgIHZhciBxdWV1ZSA9IG5ldyBXb3JrUXVldWUodGhpcy5pbXBvcnRTZXRzKTsKCiAgICAgIC8vIEFkZCBgbWFpbmAgYW5kIHRoZWlyIHJlY3Vyc2l2ZSBkZXBlbmRlbmNpZXMgdG8gdGhlIG1haW4gb3V0cHV0IHVuaXQuCiAgICAgIC8vIFdlIGRvIHRoaXMgdXBmcm9udCB0byBhdm9pZCB3YXN0aW5nIHRpbWUgdmlzaXRpbmcgdGhlc2UgZWxlbWVudHMgd2hlbgogICAgICAvLyBhbmFseXppbmcgZGVmZXJyZWQgaW1wb3J0cy4KICAgICAgcXVldWUuYWRkTWVtYmVyKG1haW4sIGltcG9ydFNldHMubWFpblNldCk7CgogICAgICAvLyBBbHNvIGFkZCAiZ2xvYmFsIiBkZXBlbmRlbmNpZXMgdG8gdGhlIG1haW4gb3V0cHV0IHVuaXQuICBUaGVzZSBhcmUKICAgICAgLy8gdGhpbmdzIHRoYXQgdGhlIGJhY2tlbmQgbmVlZHMgYnV0IGNhbm5vdCBhc3NvY2lhdGUgd2l0aCBhIHBhcnRpY3VsYXIKICAgICAgLy8gZWxlbWVudC4gVGhpcyBzZXQgYWxzbyBjb250YWlucyBlbGVtZW50cyBmb3Igd2hpY2ggd2UgbGFjayBwcmVjaXNlCiAgICAgIC8vIGluZm9ybWF0aW9uLgogICAgICBmb3IgKE1lbWJlckVudGl0eSBlbGVtZW50CiAgICAgICAgICBpbiBjbG9zZWRXb3JsZC5iYWNrZW5kVXNhZ2UuZ2xvYmFsRnVuY3Rpb25EZXBlbmRlbmNpZXMpIHsKICAgICAgICBxdWV1ZS5hZGRNZW1iZXIoZWxlbWVudCwgaW1wb3J0U2V0cy5tYWluU2V0KTsKICAgICAgfQogICAgICBmb3IgKENsYXNzRW50aXR5IGVsZW1lbnQKICAgICAgICAgIGluIGNsb3NlZFdvcmxkLmJhY2tlbmRVc2FnZS5nbG9iYWxDbGFzc0RlcGVuZGVuY2llcykgewogICAgICAgIHF1ZXVlLmFkZENsYXNzKGVsZW1lbnQsIGltcG9ydFNldHMubWFpblNldCk7CiAgICAgIH0KCiAgICAgIHZvaWQgZW1wdHlRdWV1ZSgpIHsKICAgICAgICB3aGlsZSAocXVldWUuaXNOb3RFbXB0eSkgewogICAgICAgICAgV29ya0l0ZW0gaXRlbSA9IHF1ZXVlLm5leHRJdGVtKCk7CiAgICAgICAgICBpdGVtLnVwZGF0ZSh0aGlzLCBxdWV1ZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBlbXB0eVF1ZXVlKCk7CiAgICB9CgogICAgcmVwb3J0ZXIud2l0aEN1cnJlbnRFbGVtZW50KG1haW4ubGlicmFyeSwgKCkgPT4gbWVhc3VyZSh3b3JrKSk7CgogICAgLy8gTm90aWZ5IHRoYXQgd2Ugbm8gbG9uZ2VyIG5lZWQgaW1wYWN0cyBmb3IgZGVmZXJyZWQgbG9hZCwgc28gdGhleSBjYW4gYmUKICAgIC8vIGRpc2NhcmRlZCBhdCB0aGlzIHRpbWUuCiAgICBjb21waWxlci5pbXBhY3RTdHJhdGVneS5vbkltcGFjdFVzZWQoRGVmZXJyZWRMb2FkVGFzay5JTVBBQ1RfVVNFKTsKICAgIHJldHVybiBfYnVpbGRSZXN1bHQoKTsKICB9CgogIE91dHB1dFVuaXREYXRhIF9idWlsZFJlc3VsdCgpIHsKICAgIF9jcmVhdGVPdXRwdXRVbml0cygpOwogICAgTWFwPFN0cmluZywgTGlzdDxPdXRwdXRVbml0Pj4gaHVua3NUb0xvYWQgPSBfc2V0dXBIdW5rc1RvTG9hZCgpOwogICAgTWFwPENsYXNzRW50aXR5LCBPdXRwdXRVbml0PiBjbGFzc01hcCA9IDxDbGFzc0VudGl0eSwgT3V0cHV0VW5pdD57fTsKICAgIE1hcDxNZW1iZXJFbnRpdHksIE91dHB1dFVuaXQ+IG1lbWJlck1hcCA9IDxNZW1iZXJFbnRpdHksIE91dHB1dFVuaXQ+e307CiAgICBNYXA8TG9jYWwsIE91dHB1dFVuaXQ+IGxvY2FsRnVuY3Rpb25NYXAgPSA8TG9jYWwsIE91dHB1dFVuaXQ+e307CiAgICBNYXA8Q29uc3RhbnRWYWx1ZSwgT3V0cHV0VW5pdD4gY29uc3RhbnRNYXAgPSA8Q29uc3RhbnRWYWx1ZSwgT3V0cHV0VW5pdD57fTsKICAgIF9jbGFzc1RvU2V0LmZvckVhY2goKGNscywgcykgPT4gY2xhc3NNYXBbY2xzXSA9IHMudW5pdCk7CiAgICBfbWVtYmVyVG9TZXQuZm9yRWFjaCgobWVtYmVyLCBzKSA9PiBtZW1iZXJNYXBbbWVtYmVyXSA9IHMudW5pdCk7CiAgICBfbG9jYWxGdW5jdGlvblRvU2V0LmZvckVhY2goCiAgICAgICAgKGxvY2FsRnVuY3Rpb24sIHMpID0+IGxvY2FsRnVuY3Rpb25NYXBbbG9jYWxGdW5jdGlvbl0gPSBzLnVuaXQpOwogICAgX2NvbnN0YW50VG9TZXQuZm9yRWFjaCgoY29uc3RhbnQsIHMpID0+IGNvbnN0YW50TWFwW2NvbnN0YW50XSA9IHMudW5pdCk7CgogICAgX2NsYXNzVG9TZXQgPSBudWxsOwogICAgX21lbWJlclRvU2V0ID0gbnVsbDsKICAgIF9sb2NhbEZ1bmN0aW9uVG9TZXQgPSBudWxsOwogICAgX2NvbnN0YW50VG9TZXQgPSBudWxsOwogICAgY2xlYW51cCgpOwogICAgcmV0dXJuIG5ldyBPdXRwdXRVbml0RGF0YSgKICAgICAgICB0aGlzLmlzUHJvZ3JhbVNwbGl0ICYmICFkaXNhYmxlUHJvZ3JhbVNwbGl0LAogICAgICAgIHRoaXMuX21haW5PdXRwdXRVbml0LAogICAgICAgIGNsYXNzTWFwLAogICAgICAgIG1lbWJlck1hcCwKICAgICAgICBsb2NhbEZ1bmN0aW9uTWFwLAogICAgICAgIGNvbnN0YW50TWFwLAogICAgICAgIF9hbGxPdXRwdXRVbml0cywKICAgICAgICBfaW1wb3J0RGVmZXJOYW1lLAogICAgICAgIGh1bmtzVG9Mb2FkLAogICAgICAgIF9kZWZlcnJlZEltcG9ydERlc2NyaXB0aW9ucyk7CiAgfQoKICAvLy8gRnJlZXMgdXAgc3RyYXRlZ3ktc3BlY2lmaWMgdGVtcG9yYXJ5IGRhdGEuCiAgdm9pZCBjbGVhbnVwKCkge30KCiAgdm9pZCBiZWZvcmVSZXNvbHV0aW9uKFVyaSByb290TGlicmFyeVVyaSwgSXRlcmFibGU8VXJpPiBsaWJyYXJpZXMpIHsKICAgIG1lYXN1cmVTdWJ0YXNrKCdwcmVwYXJlJywgKCkgewogICAgICBmb3IgKFVyaSB1cmkgaW4gbGlicmFyaWVzKSB7CiAgICAgICAgTGlicmFyeUVudGl0eSBsaWJyYXJ5ID0gZWxlbWVudEVudmlyb25tZW50Lmxvb2t1cExpYnJhcnkodXJpKTsKICAgICAgICByZXBvcnRlci53aXRoQ3VycmVudEVsZW1lbnQobGlicmFyeSwgKCkgewogICAgICAgICAgY2hlY2tGb3JEZWZlcnJlZEVycm9yQ2FzZXMobGlicmFyeSk7CiAgICAgICAgICBmb3IgKEltcG9ydEVudGl0eSBpbXBvcnQgaW4gZWxlbWVudEVudmlyb25tZW50LmdldEltcG9ydHMobGlicmFyeSkpIHsKICAgICAgICAgICAgaWYgKGltcG9ydC5pc0RlZmVycmVkKSB7CiAgICAgICAgICAgICAgX2RlZmVycmVkSW1wb3J0RGVzY3JpcHRpb25zW2ltcG9ydF0gPQogICAgICAgICAgICAgICAgICBuZXcgSW1wb3J0RGVzY3JpcHRpb24oaW1wb3J0LCBsaWJyYXJ5LCByb290TGlicmFyeVVyaSk7CiAgICAgICAgICAgICAgaXNQcm9ncmFtU3BsaXQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgLy8vIERldGVjdHMgZXJyb3JzIGxpa2UgZHVwbGljYXRlIHVzZXMgb2YgYSBwcmVmaXggb3IgdXNpbmcgdGhlIG9sZCBkZWZlcnJlZAogIC8vLyBsb2FkaW5nIHN5bnRheC4KICAvLy8KICAvLy8gVGhlc2UgY2hlY2tzIGFyZSBhbHJlYWR5IGRvbmUgYnkgdGhlIHNoYXJlZCBmcm9udC1lbmQsIHNvIHRoZXkgY2FuIGJlCiAgLy8vIHNraXBwZWQgYnkgdGhlIG5ldyBjb21waWxlciBwaXBlbGluZS4KICB2b2lkIGNoZWNrRm9yRGVmZXJyZWRFcnJvckNhc2VzKExpYnJhcnlFbnRpdHkgbGlicmFyeSk7CgogIGJvb2wgaWdub3JlRW50aXR5SW5EdW1wKEVudGl0eSBlbGVtZW50KSA9PiBmYWxzZTsKCiAgLy8vIENyZWF0ZXMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvdXRwdXQgdW5pdCBjb250ZW50LgogIFN0cmluZyBkdW1wKCkgewogICAgTWFwPE91dHB1dFVuaXQsIExpc3Q8U3RyaW5nPj4gZWxlbWVudE1hcCA9IDxPdXRwdXRVbml0LCBMaXN0PFN0cmluZz4+e307CiAgICBNYXA8T3V0cHV0VW5pdCwgTGlzdDxTdHJpbmc+PiBjb25zdGFudE1hcCA9IDxPdXRwdXRVbml0LCBMaXN0PFN0cmluZz4+e307CiAgICBfY2xhc3NUb1NldC5mb3JFYWNoKChDbGFzc0VudGl0eSBlbGVtZW50LCBJbXBvcnRTZXQgaW1wb3J0U2V0KSB7CiAgICAgIGlmIChpZ25vcmVFbnRpdHlJbkR1bXAoZWxlbWVudCkpIHJldHVybjsKICAgICAgdmFyIGVsZW1lbnRzID0gZWxlbWVudE1hcC5wdXRJZkFic2VudChpbXBvcnRTZXQudW5pdCwgKCkgPT4gPFN0cmluZz5bXSk7CiAgICAgIHZhciBpZCA9IGVsZW1lbnQubmFtZSA/PyAnJGVsZW1lbnQnOwogICAgICBpZCA9ICckaWQgY2xzJzsKICAgICAgZWxlbWVudHMuYWRkKGlkKTsKICAgIH0pOwogICAgX21lbWJlclRvU2V0LmZvckVhY2goKE1lbWJlckVudGl0eSBlbGVtZW50LCBJbXBvcnRTZXQgaW1wb3J0U2V0KSB7CiAgICAgIGlmIChpZ25vcmVFbnRpdHlJbkR1bXAoZWxlbWVudCkpIHJldHVybjsKICAgICAgdmFyIGVsZW1lbnRzID0gZWxlbWVudE1hcC5wdXRJZkFic2VudChpbXBvcnRTZXQudW5pdCwgKCkgPT4gPFN0cmluZz5bXSk7CiAgICAgIHZhciBpZCA9IGVsZW1lbnQubmFtZSA/PyAnJGVsZW1lbnQnOwogICAgICB2YXIgY2xzID0gZWxlbWVudC5lbmNsb3NpbmdDbGFzcz8ubmFtZTsKICAgICAgaWYgKGNscyAhPSBudWxsKSBpZCA9ICckY2xzLiRpZCc7CiAgICAgIGlmIChlbGVtZW50LmlzU2V0dGVyKSBpZCA9ICckaWQ9JzsKICAgICAgaWQgPSAnJGlkIG1lbWJlcic7CiAgICAgIGVsZW1lbnRzLmFkZChpZCk7CiAgICB9KTsKICAgIF9sb2NhbEZ1bmN0aW9uVG9TZXQuZm9yRWFjaCgoTG9jYWwgZWxlbWVudCwgSW1wb3J0U2V0IGltcG9ydFNldCkgewogICAgICBpZiAoaWdub3JlRW50aXR5SW5EdW1wKGVsZW1lbnQpKSByZXR1cm47CiAgICAgIHZhciBlbGVtZW50cyA9IGVsZW1lbnRNYXAucHV0SWZBYnNlbnQoaW1wb3J0U2V0LnVuaXQsICgpID0+IDxTdHJpbmc+W10pOwogICAgICB2YXIgaWQgPSBlbGVtZW50Lm5hbWUgPz8gJyRlbGVtZW50JzsKICAgICAgdmFyIGNvbnRleHQgPSAoZWxlbWVudCBhcyBkeW5hbWljKS5tZW1iZXJDb250ZXh0Lm5hbWU7CiAgICAgIGlkID0gZWxlbWVudC5uYW1lID09IG51bGwgfHwgZWxlbWVudC5uYW1lID09ICcnID8gJzxhbm9ueW1vdXM+JyA6IGlkOwogICAgICBpZCA9ICckY29udGV4dC4kaWQnOwogICAgICBpZCA9ICckaWQgbG9jYWwnOwogICAgICBlbGVtZW50cy5hZGQoaWQpOwogICAgfSk7CiAgICBfY29uc3RhbnRUb1NldC5mb3JFYWNoKChDb25zdGFudFZhbHVlIHZhbHVlLCBJbXBvcnRTZXQgaW1wb3J0U2V0KSB7CiAgICAgIC8vIFNraXAgcHJpbWl0aXZlIHZhbHVlczogdGhleSBhcmUgbm90IHN0b3JlZCBpbiB0aGUgY29uc3RhbnQgdGFibGVzIGFuZAogICAgICAvLyBpZiB0aGV5IGFyZSBzaGFyZWQsIHRoZXkgZW5kIHVwIGR1cGxpY2F0ZWQgYW55d2F5cyBhY3Jvc3Mgb3V0cHV0IHVuaXRzLgogICAgICBpZiAodmFsdWUuaXNQcmltaXRpdmUpIHJldHVybjsKICAgICAgY29uc3RhbnRNYXAKICAgICAgICAgIC5wdXRJZkFic2VudChpbXBvcnRTZXQudW5pdCwgKCkgPT4gPFN0cmluZz5bXSkKICAgICAgICAgIC5hZGQodmFsdWUudG9TdHJ1Y3R1cmVkVGV4dCgpKTsKICAgIH0pOwoKICAgIE1hcDxPdXRwdXRVbml0LCBTdHJpbmc+IHRleHQgPSB7fTsKICAgIGZvciAoT3V0cHV0VW5pdCBvdXRwdXRVbml0IGluIF9hbGxPdXRwdXRVbml0cykgewogICAgICBTdHJpbmdCdWZmZXIgdW5pdFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgIGlmIChvdXRwdXRVbml0LmlzTWFpbk91dHB1dCkgewogICAgICAgIHVuaXRUZXh0LndyaXRlKCcgPE1BSU4gVU5JVD4nKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB1bml0VGV4dC53cml0ZSgnIGltcG9ydHM6Jyk7CiAgICAgICAgdmFyIGltcG9ydHMgPSBvdXRwdXRVbml0Ll9pbXBvcnRzCiAgICAgICAgICAgIC5tYXAoKGkpID0+ICcke2kuZW5jbG9zaW5nTGlicmFyeVVyaS5yZXNvbHZlVXJpKGkudXJpKX0nKQogICAgICAgICAgICAudG9MaXN0KCk7CiAgICAgICAgZm9yICh2YXIgaSBpbiBpbXBvcnRzLi5zb3J0KCkpIHsKICAgICAgICAgIHVuaXRUZXh0LndyaXRlKCdcbiAgICRpOicpOwogICAgICAgIH0KICAgICAgfQogICAgICBMaXN0PFN0cmluZz4gZWxlbWVudHMgPSBlbGVtZW50TWFwW291dHB1dFVuaXRdOwogICAgICBpZiAoZWxlbWVudHMgIT0gbnVsbCkgewogICAgICAgIHVuaXRUZXh0LndyaXRlKCdcbiBlbGVtZW50czonKTsKICAgICAgICBmb3IgKFN0cmluZyBlbGVtZW50IGluIGVsZW1lbnRzLi5zb3J0KCkpIHsKICAgICAgICAgIHVuaXRUZXh0LndyaXRlKCdcbiAgJGVsZW1lbnQnKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgTGlzdDxTdHJpbmc+IGNvbnN0YW50cyA9IGNvbnN0YW50TWFwW291dHB1dFVuaXRdOwogICAgICBpZiAoY29uc3RhbnRzICE9IG51bGwpIHsKICAgICAgICB1bml0VGV4dC53cml0ZSgnXG4gY29uc3RhbnRzOicpOwogICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIGluIGNvbnN0YW50cy4uc29ydCgpKSB7CiAgICAgICAgICB1bml0VGV4dC53cml0ZSgnXG4gICR2YWx1ZScpOwogICAgICAgIH0KICAgICAgfQogICAgICB0ZXh0W291dHB1dFVuaXRdID0gJyR1bml0VGV4dCc7CiAgICB9CgogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgZm9yIChPdXRwdXRVbml0IG91dHB1dFVuaXQgaW4gX2FsbE91dHB1dFVuaXRzLnRvTGlzdCgpCiAgICAgIC4uc29ydCgoYSwgYikgPT4gdGV4dFthXS5jb21wYXJlVG8odGV4dFtiXSkpKSB7CiAgICAgIHNiLndyaXRlKCdcblxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuJyk7CiAgICAgIHNiLndyaXRlKCdPdXRwdXQgdW5pdDogJHtvdXRwdXRVbml0Lm5hbWV9Jyk7CiAgICAgIHNiLndyaXRlKCdcbiAke3RleHRbb3V0cHV0VW5pdF19Jyk7CiAgICB9CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCmNsYXNzIEltcG9ydERlc2NyaXB0aW9uIHsKICAvLy8gUmVsYXRpdmUgdXJpIHRvIHRoZSBpbXBvcnRpbmcgbGlicmFyeS4KICBmaW5hbCBTdHJpbmcgaW1wb3J0aW5nVXJpOwoKICAvLy8gVGhlIHByZWZpeCB0aGlzIGltcG9ydCBpcyBpbXBvcnRlZCBhcy4KICBmaW5hbCBTdHJpbmcgcHJlZml4OwoKICBmaW5hbCBMaWJyYXJ5RW50aXR5IF9pbXBvcnRpbmdMaWJyYXJ5OwoKICBJbXBvcnREZXNjcmlwdGlvbi5pbnRlcm5hbCgKICAgICAgdGhpcy5pbXBvcnRpbmdVcmksIHRoaXMucHJlZml4LCB0aGlzLl9pbXBvcnRpbmdMaWJyYXJ5KTsKCiAgSW1wb3J0RGVzY3JpcHRpb24oCiAgICAgIEltcG9ydEVudGl0eSBpbXBvcnQsIExpYnJhcnlFbnRpdHkgaW1wb3J0aW5nTGlicmFyeSwgVXJpIG1haW5MaWJyYXJ5VXJpKQogICAgICA6IHRoaXMuaW50ZXJuYWwoCiAgICAgICAgICAgIHVyaV9leHRyYXMucmVsYXRpdml6ZSgKICAgICAgICAgICAgICAgIG1haW5MaWJyYXJ5VXJpLCBpbXBvcnRpbmdMaWJyYXJ5LmNhbm9uaWNhbFVyaSwgZmFsc2UpLAogICAgICAgICAgICBpbXBvcnQubmFtZSwKICAgICAgICAgICAgaW1wb3J0aW5nTGlicmFyeSk7Cn0KCi8vLyBJbmRpcmVjdGx5IHJlcHJlc2VudHMgYSBkZWZlcnJlZCBpbXBvcnQgaW4gYW4gW0ltcG9ydFNldF0uCi8vLwovLy8gV2UgY291bGQgZGlyZWN0bHkgc3RvcmUgdGhlIFtkZWNsYXJhdGlvbl0gaW4gW0ltcG9ydFNldF0sIGJ1dCBhZGRpbmcgdGhpcwovLy8gY2xhc3MgbWFrZXMgc29tZSBvZiB0aGUgaW1wb3J0IHNldCBvcGVyYXRpb25zIG1vcmUgZWZmaWNpZW50LgpjbGFzcyBfRGVmZXJyZWRJbXBvcnQgewogIGZpbmFsIEltcG9ydEVudGl0eSBkZWNsYXJhdGlvbjsKCiAgLy8vIENhbm9uaWNhbCBpbmRleCBhc3NvY2lhdGVkIHdpdGggW2RlY2xhcmF0aW9uXS4gVGhpcyBpcyB1c2VkIHRvIGVmZmljaWVudGx5CiAgLy8vIGltcGxlbWVudCBbSW1wb3J0U2V0TGF0dGljZS51bmlvbl0uCiAgZmluYWwgaW50IGluZGV4OwoKICBfRGVmZXJyZWRJbXBvcnQodGhpcy5kZWNsYXJhdGlvbiwgdGhpcy5pbmRleCk7Cn0KCi8vLyBBIGNvbXBhY3QgbGF0dGljZSByZXByZXNlbnRhdGlvbiBvZiBpbXBvcnQgc2V0cyBhbmQgc3Vic2V0cy4KLy8vCi8vLyBXZSB1c2UgYSBncmFwaCBvZiBub2RlcyB0byByZXByZXNlbnQgZWxlbWVudHMgb2YgdGhlIGxhdHRpY2UsIGJ1dCBvbmx5Ci8vLyBjcmVhdGUgbmV3IG5vZGVzIG9uLWRlbWFuZCBhcyB0aGV5IGFyZSBuZWVkZWQgYnkgdGhlIGRlZmVycmVkIGxvYWRpbmcKLy8vIGFsZ29yaXRobS4KLy8vCi8vLyBUaGUgY29uc3RydWN0aW9ucyBvZiBub2RlcyBpcyBjYXJlZnVsbHkgZG9uZSBieSBzdG9yaW5nIGltcG9ydHMgaW4gYQovLy8gc3BlY2lmaWMgb3JkZXIuIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGhhdmUgYSB1bmlxdWUgYW5kIGNhbm9uaWNhbAovLy8gcmVwcmVzZW50YXRpb24gZm9yIGVhY2ggc3Vic2V0LgpjbGFzcyBJbXBvcnRTZXRMYXR0aWNlIHsKICAvLy8gSW5kZXggb2YgZGVmZXJyZWQgaW1wb3J0cyB0aGF0IGRlZmluZXMgdGhlIGNhbm9uaWNhbCBvcmRlciB1c2VkIGJ5IHRoZQogIC8vLyBvcGVyYXRpb25zIGJlbG93LgogIE1hcDxJbXBvcnRFbnRpdHksIF9EZWZlcnJlZEltcG9ydD4gX2ltcG9ydEluZGV4ID0ge307CgogIC8vLyBUaGUgY2Fub25pY2FsIGluc3RhbmNlIHJlcHJlc2VudGluZyB0aGUgZW1wdHkgaW1wb3J0IHNldC4KICBJbXBvcnRTZXQgX2VtcHR5U2V0ID0gbmV3IEltcG9ydFNldCgpOwoKICAvLy8gVGhlIGltcG9ydCBzZXQgcmVwcmVzZW50aW5nIHRoZSBtYWluIG91dHB1dCB1bml0LCB3aGljaCBoYXBwZW5zIHRvIGJlCiAgLy8vIGltcGxlbWVudGVkIGFzIGFuIGVtcHR5IHNldCBpbiBvdXIgYWxnb3JpdGhtLgogIEltcG9ydFNldCBnZXQgbWFpblNldCA9PiBfZW1wdHlTZXQ7CgogIC8vLyBHZXQgdGhlIHNpbmdsZXRvbiBpbXBvcnQgc2V0IHRoYXQgb25seSBjb250YWlucyBbaW1wb3J0XS4KICBJbXBvcnRTZXQgc2luZ2xldG9uKEltcG9ydEVudGl0eSBpbXBvcnQpIHsKICAgIC8vIEVuc3VyZSB3ZSBoYXZlIGltcG9ydCBpbiB0aGUgaW5kZXguCiAgICByZXR1cm4gX2VtcHR5U2V0Ll9hZGQoX3dyYXAoaW1wb3J0KSk7CiAgfQoKICAvLy8gR2V0IHRoZSBpbXBvcnQgc2V0IHRoYXQgaW5jbHVkZXMgdGhlIHVuaW9uIG9mIFthXSBhbmQgW2JdLgogIEltcG9ydFNldCB1bmlvbihJbXBvcnRTZXQgYSwgSW1wb3J0U2V0IGIpIHsKICAgIGlmIChhID09IG51bGwgfHwgYSA9PSBfZW1wdHlTZXQpIHJldHVybiBiOwogICAgaWYgKGIgPT0gbnVsbCB8fCBiID09IF9lbXB0eVNldCkgcmV0dXJuIGE7CgogICAgLy8gV2UgY3JlYXRlIHRoZSB1bmlvbiBieSBtZXJnaW5nIHRoZSBpbXBvcnRzIGluIGNhbm9uaWNhbCBvcmRlciBmaXJzdCwgYW5kCiAgICAvLyB0aGVuIGdldHRpbmcgKG9yIGNyZWF0aW5nKSB0aGUgY2Fub25pY2FsIHNldHMgYnkgYWRkaW5nIGFuIGltcG9ydCBhdCBhCiAgICAvLyB0aW1lLgogICAgTGlzdDxfRGVmZXJyZWRJbXBvcnQ+IGFJbXBvcnRzID0gYS5faW1wb3J0czsKICAgIExpc3Q8X0RlZmVycmVkSW1wb3J0PiBiSW1wb3J0cyA9IGIuX2ltcG9ydHM7CiAgICBpbnQgaSA9IDAsIGogPSAwLCBsYXN0QUluZGV4ID0gMCwgbGFzdEJJbmRleCA9IDA7CiAgICB2YXIgcmVzdWx0ID0gX2VtcHR5U2V0OwogICAgd2hpbGUgKGkgPCBhSW1wb3J0cy5sZW5ndGggJiYgaiA8IGJJbXBvcnRzLmxlbmd0aCkgewogICAgICB2YXIgaW1wb3J0QSA9IGFJbXBvcnRzW2ldOwogICAgICB2YXIgaW1wb3J0QiA9IGJJbXBvcnRzW2pdOwogICAgICBhc3NlcnQobGFzdEFJbmRleCA8PSBpbXBvcnRBLmluZGV4KTsKICAgICAgYXNzZXJ0KGxhc3RCSW5kZXggPD0gaW1wb3J0Qi5pbmRleCk7CiAgICAgIGlmIChpbXBvcnRBLmluZGV4IDwgaW1wb3J0Qi5pbmRleCkgewogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5fYWRkKGltcG9ydEEpOwogICAgICAgIGkrKzsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXN1bHQgPSByZXN1bHQuX2FkZChpbXBvcnRCKTsKICAgICAgICBqKys7CiAgICAgIH0KICAgIH0KICAgIGZvciAoOyBpIDwgYUltcG9ydHMubGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0ID0gcmVzdWx0Ll9hZGQoYUltcG9ydHNbaV0pOwogICAgfQogICAgZm9yICg7IGogPCBiSW1wb3J0cy5sZW5ndGg7IGorKykgewogICAgICByZXN1bHQgPSByZXN1bHQuX2FkZChiSW1wb3J0c1tqXSk7CiAgICB9CgogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBHZXQgdGhlIGluZGV4IGZvciBhbiBbaW1wb3J0XSBhY2NvcmRpbmcgdG8gdGhlIGNhbm9uaWNhbCBvcmRlci4KICBfRGVmZXJyZWRJbXBvcnQgX3dyYXAoSW1wb3J0RW50aXR5IGltcG9ydCkgewogICAgcmV0dXJuIF9pbXBvcnRJbmRleC5wdXRJZkFic2VudCgKICAgICAgICBpbXBvcnQsICgpID0+IG5ldyBfRGVmZXJyZWRJbXBvcnQoaW1wb3J0LCBfaW1wb3J0SW5kZXgubGVuZ3RoKSk7CiAgfQp9CgovLy8gQSBjYW5vbmljYWwgc2V0IG9mIGRlZmVycmVkIGltcG9ydHMuCmNsYXNzIEltcG9ydFNldCB7CiAgLy8vIEltcG9ydHMgdGhhdCBhcmUgcGFydCBvZiB0aGlzIHNldC4KICAvLy8KICAvLy8gSW52YXJpYW50OiB0aGUgb3JkZXIgaW4gd2hpY2ggZWxlbWVudHMgYXJlIGFkZGVkIG11c3QgcmVzcGVjdCB0aGUKICAvLy8gY2Fub25pY2FsIG9yZGVyIG9mIGFsbCBpbXBvcnRzIGluIFtJbXBvcnRTZXRMYXR0aWNlXS4KICBmaW5hbCBMaXN0PF9EZWZlcnJlZEltcG9ydD4gX2ltcG9ydHM7CgogIC8vLyBMaW5rcyB0byBvdGhlciBpbXBvcnQgc2V0cyBpbiB0aGUgbGF0dGljZSBieSBhZGRpbmcgb25lIGltcG9ydC4KICBmaW5hbCBNYXA8X0RlZmVycmVkSW1wb3J0LCBJbXBvcnRTZXQ+IF90cmFuc2l0aW9ucyA9CiAgICAgIDxfRGVmZXJyZWRJbXBvcnQsIEltcG9ydFNldD57fTsKCiAgSW1wb3J0U2V0KFt0aGlzLl9pbXBvcnRzID0gY29uc3QgPF9EZWZlcnJlZEltcG9ydD5bXV0pOwoKICAvLy8gVGhlIG91dHB1dCB1bml0IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBzZXQgb2YgaW1wb3J0cywgaWYgYW55LgogIE91dHB1dFVuaXQgdW5pdDsKCiAgaW50IGdldCBsZW5ndGggPT4gX2ltcG9ydHMubGVuZ3RoOwoKICAvLy8gQ3JlYXRlIGFuIGltcG9ydCBzZXQgdGhhdCBhZGRzIFtpbXBvcnRdIHRvIGFsbCB0aGUgaW1wb3J0cyBvbiB0aGlzIHNldC4KICAvLy8gVGhpcyBhc3N1bWVzIHRoYXQgaW1wb3J0J3MgY2Fub25pY2FsIG9yZGVyIGNvbWVzIGFmdGVyIGFsbCBpbXBvcnRzIGluCiAgLy8vIHRoaXMgY3VycmVudCBzZXQuIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gW0ltcG9ydFNldExhdHRpY2VdLAogIC8vLyBzaW5jZSBpdCBpcyB3aGVyZSB3ZSBwcmVzZXJ2ZSB0aGlzIGludmFyaWFudC4KICBJbXBvcnRTZXQgX2FkZChfRGVmZXJyZWRJbXBvcnQgaW1wb3J0KSB7CiAgICBJbXBvcnRTZXQgcmVzdWx0ID0gX3RyYW5zaXRpb25zW2ltcG9ydF07CiAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKICAgICAgcmVzdWx0ID0gbmV3IEltcG9ydFNldChuZXcgTGlzdC5mcm9tKF9pbXBvcnRzKS4uYWRkKGltcG9ydCkpOwogICAgICByZXN1bHQuX3RyYW5zaXRpb25zW2ltcG9ydF0gPSByZXN1bHQ7CiAgICAgIF90cmFuc2l0aW9uc1tpbXBvcnRdID0gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCdJbXBvcnRTZXQoc2l6ZTogJGxlbmd0aCwgJyk7CiAgICBmb3IgKHZhciBpbXBvcnQgaW4gX2ltcG9ydHMpIHsKICAgICAgc2Iud3JpdGUoJyR7aW1wb3J0LmRlY2xhcmF0aW9uLm5hbWV9ICcpOwogICAgfQogICAgc2Iud3JpdGUoJyknKTsKICAgIHJldHVybiAnJHNiJzsKICB9Cn0KCi8vLyBUaGUgYWxnb3JpdGhtIHdvcmsgcXVldWUuCmNsYXNzIFdvcmtRdWV1ZSB7CiAgLy8vIFRoZSBhY3R1YWwgcXVldWUgb2Ygd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUuCiAgZmluYWwgUXVldWU8V29ya0l0ZW0+IHF1ZXVlID0gbmV3IFF1ZXVlPFdvcmtJdGVtPigpOwoKICAvLy8gQW4gaW5kZXggdG8gZmluZCB3b3JrIGl0ZW1zIGluIHRoZSBxdWV1ZSBjb3JyZXNwb25kaW5nIHRvIGEgY2xhc3MuCiAgZmluYWwgTWFwPENsYXNzRW50aXR5LCBXb3JrSXRlbT4gcGVuZGluZ0NsYXNzZXMgPSA8Q2xhc3NFbnRpdHksIFdvcmtJdGVtPnt9OwoKICAvLy8gQW4gaW5kZXggdG8gZmluZCB3b3JrIGl0ZW1zIGluIHRoZSBxdWV1ZSBjb3JyZXNwb25kaW5nIHRvIGEgbWVtYmVyLgogIGZpbmFsIE1hcDxNZW1iZXJFbnRpdHksIFdvcmtJdGVtPiBwZW5kaW5nTWVtYmVycyA9IDxNZW1iZXJFbnRpdHksIFdvcmtJdGVtPnt9OwoKICAvLy8gQW4gaW5kZXggdG8gZmluZCB3b3JrIGl0ZW1zIGluIHRoZSBxdWV1ZSBjb3JyZXNwb25kaW5nIHRvIGEgY29uc3RhbnQuCiAgZmluYWwgTWFwPENvbnN0YW50VmFsdWUsIFdvcmtJdGVtPiBwZW5kaW5nQ29uc3RhbnRzID0KICAgICAgPENvbnN0YW50VmFsdWUsIFdvcmtJdGVtPnt9OwoKICAvLy8gTGF0dGljZSB1c2VkIHRvIGNvbXB1dGUgdW5pb25zIG9mIFtJbXBvcnRTZXRdcy4KICBmaW5hbCBJbXBvcnRTZXRMYXR0aWNlIF9pbXBvcnRTZXRzOwoKICBXb3JrUXVldWUodGhpcy5faW1wb3J0U2V0cyk7CgogIC8vLyBXaGV0aGVyIHRoZXJlIGFyZSBubyBtb3JlIHdvcmsgaXRlbXMgaW4gdGhlIHF1ZXVlLgogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gcXVldWUuaXNOb3RFbXB0eTsKCiAgLy8vIFBvcCB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBxdWV1ZS4KICBXb3JrSXRlbSBuZXh0SXRlbSgpIHsKICAgIGFzc2VydChpc05vdEVtcHR5KTsKICAgIHJldHVybiBxdWV1ZS5yZW1vdmVGaXJzdCgpOwogIH0KCiAgLy8vIEFkZCB0byB0aGUgcXVldWUgdGhhdCBbZWxlbWVudF0gc2hvdWxkIGJlIHVwZGF0ZWQgdG8gaW5jbHVkZSBhbGwgaW1wb3J0cwogIC8vLyBpbiBbaW1wb3J0U2V0XS4gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHdvcmsgaXRlbSBpbiB0aGUgcXVldWUgZm9yCiAgLy8vIFtlbGVtZW50XSwgdGhpcyBtYWtlcyBzdXJlIHRoYXQgdGhlIHdvcmsgaXRlbSBub3cgaW5jbHVkZXMgdGhlIHVuaW9uIG9mCiAgLy8vIFtpbXBvcnRTZXRdIGFuZCB0aGUgZXhpc3Rpbmcgd29yayBpdGVtJ3MgaW1wb3J0IHNldC4KICB2b2lkIGFkZENsYXNzKENsYXNzRW50aXR5IGVsZW1lbnQsIEltcG9ydFNldCBpbXBvcnRTZXQpIHsKICAgIHZhciBpdGVtID0gcGVuZGluZ0NsYXNzZXNbZWxlbWVudF07CiAgICBpZiAoaXRlbSA9PSBudWxsKSB7CiAgICAgIGl0ZW0gPSBuZXcgQ2xhc3NXb3JrSXRlbShlbGVtZW50LCBpbXBvcnRTZXQpOwogICAgICBwZW5kaW5nQ2xhc3Nlc1tlbGVtZW50XSA9IGl0ZW07CiAgICAgIHF1ZXVlLmFkZChpdGVtKTsKICAgIH0gZWxzZSB7CiAgICAgIGl0ZW0uaW1wb3J0c1RvQWRkID0gX2ltcG9ydFNldHMudW5pb24oaXRlbS5pbXBvcnRzVG9BZGQsIGltcG9ydFNldCk7CiAgICB9CiAgfQoKICAvLy8gQWRkIHRvIHRoZSBxdWV1ZSB0aGF0IFtlbGVtZW50XSBzaG91bGQgYmUgdXBkYXRlZCB0byBpbmNsdWRlIGFsbCBpbXBvcnRzCiAgLy8vIGluIFtpbXBvcnRTZXRdLiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgd29yayBpdGVtIGluIHRoZSBxdWV1ZSBmb3IKICAvLy8gW2VsZW1lbnRdLCB0aGlzIG1ha2VzIHN1cmUgdGhhdCB0aGUgd29yayBpdGVtIG5vdyBpbmNsdWRlcyB0aGUgdW5pb24gb2YKICAvLy8gW2ltcG9ydFNldF0gYW5kIHRoZSBleGlzdGluZyB3b3JrIGl0ZW0ncyBpbXBvcnQgc2V0LgogIHZvaWQgYWRkTWVtYmVyKE1lbWJlckVudGl0eSBlbGVtZW50LCBJbXBvcnRTZXQgaW1wb3J0U2V0KSB7CiAgICB2YXIgaXRlbSA9IHBlbmRpbmdNZW1iZXJzW2VsZW1lbnRdOwogICAgaWYgKGl0ZW0gPT0gbnVsbCkgewogICAgICBpdGVtID0gbmV3IE1lbWJlcldvcmtJdGVtKGVsZW1lbnQsIGltcG9ydFNldCk7CiAgICAgIHBlbmRpbmdNZW1iZXJzW2VsZW1lbnRdID0gaXRlbTsKICAgICAgcXVldWUuYWRkKGl0ZW0pOwogICAgfSBlbHNlIHsKICAgICAgaXRlbS5pbXBvcnRzVG9BZGQgPSBfaW1wb3J0U2V0cy51bmlvbihpdGVtLmltcG9ydHNUb0FkZCwgaW1wb3J0U2V0KTsKICAgIH0KICB9CgogIC8vLyBBZGQgdG8gdGhlIHF1ZXVlIHRoYXQgW2NvbnN0YW50XSBzaG91bGQgYmUgdXBkYXRlZCB0byBpbmNsdWRlIGFsbCBpbXBvcnRzCiAgLy8vIGluIFtpbXBvcnRTZXRdLiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgd29yayBpdGVtIGluIHRoZSBxdWV1ZSBmb3IKICAvLy8gW2NvbnN0YW50XSwgdGhpcyBtYWtlcyBzdXJlIHRoYXQgdGhlIHdvcmsgaXRlbSBub3cgaW5jbHVkZXMgdGhlIHVuaW9uIG9mCiAgLy8vIFtpbXBvcnRTZXRdIGFuZCB0aGUgZXhpc3Rpbmcgd29yayBpdGVtJ3MgaW1wb3J0IHNldC4KICB2b2lkIGFkZENvbnN0YW50KENvbnN0YW50VmFsdWUgY29uc3RhbnQsIEltcG9ydFNldCBpbXBvcnRTZXQpIHsKICAgIHZhciBpdGVtID0gcGVuZGluZ0NvbnN0YW50c1tjb25zdGFudF07CiAgICBpZiAoaXRlbSA9PSBudWxsKSB7CiAgICAgIGl0ZW0gPSBuZXcgQ29uc3RhbnRXb3JrSXRlbShjb25zdGFudCwgaW1wb3J0U2V0KTsKICAgICAgcGVuZGluZ0NvbnN0YW50c1tjb25zdGFudF0gPSBpdGVtOwogICAgICBxdWV1ZS5hZGQoaXRlbSk7CiAgICB9IGVsc2UgewogICAgICBpdGVtLmltcG9ydHNUb0FkZCA9IF9pbXBvcnRTZXRzLnVuaW9uKGl0ZW0uaW1wb3J0c1RvQWRkLCBpbXBvcnRTZXQpOwogICAgfQogIH0KfQoKLy8vIFN1bW1hcnkgb2YgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIG9uIGEgY2xhc3MsIG1lbWJlciwgb3IgY29uc3RhbnQuCmFic3RyYWN0IGNsYXNzIFdvcmtJdGVtIHsKICAvLy8gQWRkaXRpb25hbCBpbXBvcnRzIHRoYXQgdXNlIFtlbGVtZW50XSBvciBbdmFsdWVdIGFuZCBuZWVkIHRvIGJlIGFkZGVkIGJ5CiAgLy8vIHRoZSBhbGdvcml0aG0uCiAgLy8vCiAgLy8vIFRoaXMgaXMgbm9uLWZpbmFsIGluIGNhc2Ugd2UgYWRkIG1vcmUgZGVmZXJyZWQgaW1wb3J0cyB0byB0aGUgc2V0IGJlZm9yZQogIC8vLyB0aGUgd29yayBpdGVtIGlzIGFwcGxpZWQgKHNlZSBbV29ya1F1ZXVlLmFkZEVsZW1lbnRdIGFuZAogIC8vLyBbV29ya1F1ZXVlLmFkZENvbnN0YW50XSkuCiAgSW1wb3J0U2V0IGltcG9ydHNUb0FkZDsKCiAgV29ya0l0ZW0odGhpcy5pbXBvcnRzVG9BZGQpOwoKICB2b2lkIHVwZGF0ZShEZWZlcnJlZExvYWRUYXNrIHRhc2ssIFdvcmtRdWV1ZSBxdWV1ZSk7Cn0KCi8vLyBTdW1tYXJ5IG9mIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBvbiBhIGNsYXNzLgpjbGFzcyBDbGFzc1dvcmtJdGVtIGV4dGVuZHMgV29ya0l0ZW0gewogIC8vLyBDbGFzcyB0byBiZSByZWN1cnNpdmVseSB1cGRhdGVkLgogIGZpbmFsIENsYXNzRW50aXR5IGNsczsKCiAgQ2xhc3NXb3JrSXRlbSh0aGlzLmNscywgSW1wb3J0U2V0IG5ld1NldCkgOiBzdXBlcihuZXdTZXQpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHVwZGF0ZShEZWZlcnJlZExvYWRUYXNrIHRhc2ssIFdvcmtRdWV1ZSBxdWV1ZSkgewogICAgcXVldWUucGVuZGluZ0NsYXNzZXMucmVtb3ZlKGNscyk7CiAgICBJbXBvcnRTZXQgb2xkU2V0ID0gdGFzay5fY2xhc3NUb1NldFtjbHNdOwogICAgSW1wb3J0U2V0IG5ld1NldCA9IHRhc2suaW1wb3J0U2V0cy51bmlvbihvbGRTZXQsIGltcG9ydHNUb0FkZCk7CiAgICB0YXNrLl91cGRhdGVDbGFzc1JlY3Vyc2l2ZShjbHMsIG9sZFNldCwgbmV3U2V0LCBxdWV1ZSk7CiAgfQp9CgovLy8gU3VtbWFyeSBvZiB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgb24gYSBtZW1iZXIuCmNsYXNzIE1lbWJlcldvcmtJdGVtIGV4dGVuZHMgV29ya0l0ZW0gewogIC8vLyBNZW1iZXIgdG8gYmUgcmVjdXJzaXZlbHkgdXBkYXRlZC4KICBmaW5hbCBNZW1iZXJFbnRpdHkgbWVtYmVyOwoKICBNZW1iZXJXb3JrSXRlbSh0aGlzLm1lbWJlciwgSW1wb3J0U2V0IG5ld1NldCkgOiBzdXBlcihuZXdTZXQpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHVwZGF0ZShEZWZlcnJlZExvYWRUYXNrIHRhc2ssIFdvcmtRdWV1ZSBxdWV1ZSkgewogICAgcXVldWUucGVuZGluZ01lbWJlcnMucmVtb3ZlKG1lbWJlcik7CiAgICBJbXBvcnRTZXQgb2xkU2V0ID0gdGFzay5fbWVtYmVyVG9TZXRbbWVtYmVyXTsKICAgIEltcG9ydFNldCBuZXdTZXQgPSB0YXNrLmltcG9ydFNldHMudW5pb24ob2xkU2V0LCBpbXBvcnRzVG9BZGQpOwogICAgdGFzay5fdXBkYXRlTWVtYmVyUmVjdXJzaXZlKG1lbWJlciwgb2xkU2V0LCBuZXdTZXQsIHF1ZXVlKTsKICB9Cn0KCi8vLyBTdW1tYXJ5IG9mIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBvbiBhIGNvbnN0YW50LgpjbGFzcyBDb25zdGFudFdvcmtJdGVtIGV4dGVuZHMgV29ya0l0ZW0gewogIC8vLyBDb25zdGFudCB0byBiZSByZWN1cnNpdmVseSB1cGRhdGVkLgogIGZpbmFsIENvbnN0YW50VmFsdWUgY29uc3RhbnQ7CgogIENvbnN0YW50V29ya0l0ZW0odGhpcy5jb25zdGFudCwgSW1wb3J0U2V0IG5ld1NldCkgOiBzdXBlcihuZXdTZXQpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHVwZGF0ZShEZWZlcnJlZExvYWRUYXNrIHRhc2ssIFdvcmtRdWV1ZSBxdWV1ZSkgewogICAgcXVldWUucGVuZGluZ0NvbnN0YW50cy5yZW1vdmUoY29uc3RhbnQpOwogICAgSW1wb3J0U2V0IG9sZFNldCA9IHRhc2suX2NvbnN0YW50VG9TZXRbY29uc3RhbnRdOwogICAgSW1wb3J0U2V0IG5ld1NldCA9IHRhc2suaW1wb3J0U2V0cy51bmlvbihvbGRTZXQsIGltcG9ydHNUb0FkZCk7CiAgICB0YXNrLl91cGRhdGVDb25zdGFudFJlY3Vyc2l2ZShjb25zdGFudCwgb2xkU2V0LCBuZXdTZXQsIHF1ZXVlKTsKICB9Cn0KCi8vLyBSZXN1bHRzIG9mIHRoZSBkZWZlcnJlZCBsb2FkaW5nIGFsZ29yaXRobS4KLy8vCi8vLyBQcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3V0cHV0IHVuaXQgYXNzb2NpYXRlZCB3aXRoIGVudGl0aWVzIGFuZAovLy8gY29uc3RhbnRzLCBhcyB3ZWxsIGFzIG90aGVyIGhlbHBlciBtZXRob2RzLgovLyBUT0RPKHNpZ211bmQpOiBjb25zaWRlciBtb3ZpbmcgaGVyZSBldmVyeSBwaWVjZSBvZiBkYXRhIHVzZWQgYXMgYSByZXN1bHQgb2YKLy8gZGVmZXJyZWQgbG9hZGluZyAoaW5jbHVkaW5nIGh1bmtzVG9Mb2FkLCBldGMpLgpjbGFzcyBPdXRwdXRVbml0RGF0YSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtPdXRwdXRVbml0RGF0YV0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdvdXRwdXQtdW5pdC1kYXRhJzsKCiAgZmluYWwgYm9vbCBpc1Byb2dyYW1TcGxpdDsKICBmaW5hbCBPdXRwdXRVbml0IG1haW5PdXRwdXRVbml0OwogIGZpbmFsIE1hcDxDbGFzc0VudGl0eSwgT3V0cHV0VW5pdD4gX2NsYXNzVG9Vbml0OwogIGZpbmFsIE1hcDxNZW1iZXJFbnRpdHksIE91dHB1dFVuaXQ+IF9tZW1iZXJUb1VuaXQ7CiAgZmluYWwgTWFwPExvY2FsLCBPdXRwdXRVbml0PiBfbG9jYWxGdW5jdGlvblRvVW5pdDsKICBmaW5hbCBNYXA8Q29uc3RhbnRWYWx1ZSwgT3V0cHV0VW5pdD4gX2NvbnN0YW50VG9Vbml0OwogIGZpbmFsIEl0ZXJhYmxlPE91dHB1dFVuaXQ+IG91dHB1dFVuaXRzOwogIGZpbmFsIE1hcDxJbXBvcnRFbnRpdHksIFN0cmluZz4gX2ltcG9ydERlZmVyTmFtZTsKCiAgLy8vIEEgbWFwcGluZyBmcm9tIHRoZSBuYW1lIG9mIGEgZGVmZXIgaW1wb3J0IHRvIGFsbCB0aGUgb3V0cHV0IHVuaXRzIGl0CiAgLy8vIGRlcGVuZHMgb24gaW4gYSBsaXN0IG9mIGxpc3RzIHRvIGJlIGxvYWRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIuCiAgLy8vCiAgLy8vIEZvciBleGFtcGxlIHsibGliMSI6IFtbbGliMV9saWIyX2xpYjNdLCBbbGliMV9saWIyLCBsaWIxX2xpYjNdLAogIC8vLyBbbGliMV1dfSB3b3VsZCBtZWFuIHRoYXQgaW4gb3JkZXIgdG8gbG9hZCAibGliMSIgZmlyc3QgdGhlIGh1bmsKICAvLy8gbGliMV9saWIyX2xpYjIgc2hvdWxkIGJlIGxvYWRlZCwgdGhlbiB0aGUgaHVua3MgbGliMV9saWIyIGFuZCBsaWIxX2xpYjMKICAvLy8gY2FuIGJlIGxvYWRlZCBpbiBwYXJhbGxlbC4gQW5kIGZpbmFsbHkgbGliMSBjYW4gYmUgbG9hZGVkLgogIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8T3V0cHV0VW5pdD4+IGh1bmtzVG9Mb2FkOwoKICAvLy8gQmVjYXVzZSB0aGUgdG9rZW4tc3RyZWFtIGlzIGZvcmdvdHRlbiBsYXRlciBpbiB0aGUgcHJvZ3JhbSwgd2UgY2FjaGUgYQogIC8vLyBkZXNjcmlwdGlvbiBvZiBlYWNoIGRlZmVycmVkIGltcG9ydC4KICBmaW5hbCBNYXA8SW1wb3J0RW50aXR5LCBJbXBvcnREZXNjcmlwdGlvbj4gX2RlZmVycmVkSW1wb3J0RGVzY3JpcHRpb25zOwoKICBPdXRwdXRVbml0RGF0YSgKICAgICAgdGhpcy5pc1Byb2dyYW1TcGxpdCwKICAgICAgdGhpcy5tYWluT3V0cHV0VW5pdCwKICAgICAgdGhpcy5fY2xhc3NUb1VuaXQsCiAgICAgIHRoaXMuX21lbWJlclRvVW5pdCwKICAgICAgdGhpcy5fbG9jYWxGdW5jdGlvblRvVW5pdCwKICAgICAgdGhpcy5fY29uc3RhbnRUb1VuaXQsCiAgICAgIHRoaXMub3V0cHV0VW5pdHMsCiAgICAgIHRoaXMuX2ltcG9ydERlZmVyTmFtZSwKICAgICAgdGhpcy5odW5rc1RvTG9hZCwKICAgICAgdGhpcy5fZGVmZXJyZWRJbXBvcnREZXNjcmlwdGlvbnMpOwoKICAvLyBDcmVhdGVzIEotd29ybGQgZGF0YSBmcm9tIHRoZSBLLXdvcmxkIGRhdGEuCiAgZmFjdG9yeSBPdXRwdXRVbml0RGF0YS5mcm9tKAogICAgICBPdXRwdXRVbml0RGF0YSBvdGhlciwKICAgICAgTGlicmFyeUVudGl0eSBjb252ZXJ0TGlicmFyeShMaWJyYXJ5RW50aXR5IGxpYnJhcnkpLAogICAgICBNYXA8Q2xhc3NFbnRpdHksIE91dHB1dFVuaXQ+IEZ1bmN0aW9uKAogICAgICAgICAgICAgIE1hcDxDbGFzc0VudGl0eSwgT3V0cHV0VW5pdD4sIE1hcDxMb2NhbCwgT3V0cHV0VW5pdD4pCiAgICAgICAgICBjb252ZXJ0Q2xhc3NNYXAsCiAgICAgIE1hcDxNZW1iZXJFbnRpdHksIE91dHB1dFVuaXQ+IEZ1bmN0aW9uKAogICAgICAgICAgICAgIE1hcDxNZW1iZXJFbnRpdHksIE91dHB1dFVuaXQ+LCBNYXA8TG9jYWwsIE91dHB1dFVuaXQ+KQogICAgICAgICAgY29udmVydE1lbWJlck1hcCwKICAgICAgTWFwPENvbnN0YW50VmFsdWUsIE91dHB1dFVuaXQ+IEZ1bmN0aW9uKE1hcDxDb25zdGFudFZhbHVlLCBPdXRwdXRVbml0PikKICAgICAgICAgIGNvbnZlcnRDb25zdGFudE1hcCkgewogICAgTWFwPENsYXNzRW50aXR5LCBPdXRwdXRVbml0PiBjbGFzc1RvVW5pdCA9CiAgICAgICAgY29udmVydENsYXNzTWFwKG90aGVyLl9jbGFzc1RvVW5pdCwgb3RoZXIuX2xvY2FsRnVuY3Rpb25Ub1VuaXQpOwogICAgTWFwPE1lbWJlckVudGl0eSwgT3V0cHV0VW5pdD4gbWVtYmVyVG9Vbml0ID0KICAgICAgICBjb252ZXJ0TWVtYmVyTWFwKG90aGVyLl9tZW1iZXJUb1VuaXQsIG90aGVyLl9sb2NhbEZ1bmN0aW9uVG9Vbml0KTsKICAgIE1hcDxDb25zdGFudFZhbHVlLCBPdXRwdXRVbml0PiBjb25zdGFudFRvVW5pdCA9CiAgICAgICAgY29udmVydENvbnN0YW50TWFwKG90aGVyLl9jb25zdGFudFRvVW5pdCk7CiAgICBNYXA8SW1wb3J0RW50aXR5LCBJbXBvcnREZXNjcmlwdGlvbj4gZGVmZXJyZWRJbXBvcnREZXNjcmlwdGlvbnMgPSB7fTsKICAgIG90aGVyLl9kZWZlcnJlZEltcG9ydERlc2NyaXB0aW9ucwogICAgICAgIC5mb3JFYWNoKChJbXBvcnRFbnRpdHkgaW1wb3J0LCBJbXBvcnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewogICAgICBkZWZlcnJlZEltcG9ydERlc2NyaXB0aW9uc1tpbXBvcnRdID0gbmV3IEltcG9ydERlc2NyaXB0aW9uLmludGVybmFsKAogICAgICAgICAgZGVzY3JpcHRpb24uaW1wb3J0aW5nVXJpLAogICAgICAgICAgZGVzY3JpcHRpb24ucHJlZml4LAogICAgICAgICAgY29udmVydExpYnJhcnkoZGVzY3JpcHRpb24uX2ltcG9ydGluZ0xpYnJhcnkpKTsKICAgIH0pOwoKICAgIHJldHVybiBuZXcgT3V0cHV0VW5pdERhdGEoCiAgICAgICAgb3RoZXIuaXNQcm9ncmFtU3BsaXQsCiAgICAgICAgb3RoZXIubWFpbk91dHB1dFVuaXQsCiAgICAgICAgY2xhc3NUb1VuaXQsCiAgICAgICAgbWVtYmVyVG9Vbml0LAogICAgICAgIC8vIExvY2FsIGZ1bmN0aW9ucyBvbmx5IG1ha2Ugc2Vuc2UgaW4gdGhlIEstd29ybGQgbW9kZWwuCiAgICAgICAgY29uc3QgPExvY2FsLCBPdXRwdXRVbml0Pnt9LAogICAgICAgIGNvbnN0YW50VG9Vbml0LAogICAgICAgIG90aGVyLm91dHB1dFVuaXRzLAogICAgICAgIG90aGVyLl9pbXBvcnREZWZlck5hbWUsCiAgICAgICAgb3RoZXIuaHVua3NUb0xvYWQsCiAgICAgICAgZGVmZXJyZWRJbXBvcnREZXNjcmlwdGlvbnMpOwogIH0KCiAgLy8vIERlc2VyaWFsaXplcyBhbiBbT3V0cHV0VW5pdERhdGFdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgT3V0cHV0VW5pdERhdGEucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGJvb2wgaXNQcm9ncmFtU3BsaXQgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIExpc3Q8T3V0cHV0VW5pdD4gb3V0cHV0VW5pdHMgPSBzb3VyY2UucmVhZExpc3QoKCkgewogICAgICBib29sIGlzTWFpbk91dHB1dCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgICBTdHJpbmcgbmFtZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICAgIFNldDxJbXBvcnRFbnRpdHk+IGltcG9ydFNldCA9IHNvdXJjZS5yZWFkSW1wb3J0cygpLnRvU2V0KCk7CiAgICAgIHJldHVybiBuZXcgT3V0cHV0VW5pdChpc01haW5PdXRwdXQsIG5hbWUsIGltcG9ydFNldCk7CiAgICB9KTsKICAgIE91dHB1dFVuaXQgbWFpbk91dHB1dFVuaXQgPSBvdXRwdXRVbml0c1tzb3VyY2UucmVhZEludCgpXTsKCiAgICBNYXA8Q2xhc3NFbnRpdHksIE91dHB1dFVuaXQ+IGNsYXNzVG9Vbml0ID0gc291cmNlLnJlYWRDbGFzc01hcCgoKSB7CiAgICAgIHJldHVybiBvdXRwdXRVbml0c1tzb3VyY2UucmVhZEludCgpXTsKICAgIH0pOwogICAgTWFwPE1lbWJlckVudGl0eSwgT3V0cHV0VW5pdD4gbWVtYmVyVG9Vbml0ID0gc291cmNlLnJlYWRNZW1iZXJNYXAoKCkgewogICAgICByZXR1cm4gb3V0cHV0VW5pdHNbc291cmNlLnJlYWRJbnQoKV07CiAgICB9KTsKICAgIE1hcDxDb25zdGFudFZhbHVlLCBPdXRwdXRVbml0PiBjb25zdGFudFRvVW5pdCA9IHNvdXJjZS5yZWFkQ29uc3RhbnRNYXAoKCkgewogICAgICByZXR1cm4gb3V0cHV0VW5pdHNbc291cmNlLnJlYWRJbnQoKV07CiAgICB9KTsKICAgIE1hcDxJbXBvcnRFbnRpdHksIFN0cmluZz4gaW1wb3J0RGVmZXJOYW1lID0KICAgICAgICBzb3VyY2UucmVhZEltcG9ydE1hcChzb3VyY2UucmVhZFN0cmluZyk7CiAgICBNYXA8U3RyaW5nLCBMaXN0PE91dHB1dFVuaXQ+PiBodW5rc1RvTG9hZCA9IHNvdXJjZS5yZWFkU3RyaW5nTWFwKCgpIHsKICAgICAgcmV0dXJuIHNvdXJjZS5yZWFkTGlzdCgoKSB7CiAgICAgICAgcmV0dXJuIG91dHB1dFVuaXRzW3NvdXJjZS5yZWFkSW50KCldOwogICAgICB9KTsKICAgIH0pOwogICAgTWFwPEltcG9ydEVudGl0eSwgSW1wb3J0RGVzY3JpcHRpb24+IGRlZmVycmVkSW1wb3J0RGVzY3JpcHRpb25zID0KICAgICAgICBzb3VyY2UucmVhZEltcG9ydE1hcCgoKSB7CiAgICAgIFN0cmluZyBpbXBvcnRpbmdVcmkgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgICBTdHJpbmcgcHJlZml4ID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgICAgTGlicmFyeUVudGl0eSBpbXBvcnRpbmdMaWJyYXJ5ID0gc291cmNlLnJlYWRMaWJyYXJ5KCk7CiAgICAgIHJldHVybiBuZXcgSW1wb3J0RGVzY3JpcHRpb24uaW50ZXJuYWwoCiAgICAgICAgICBpbXBvcnRpbmdVcmksIHByZWZpeCwgaW1wb3J0aW5nTGlicmFyeSk7CiAgICB9KTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgT3V0cHV0VW5pdERhdGEoCiAgICAgICAgaXNQcm9ncmFtU3BsaXQsCiAgICAgICAgbWFpbk91dHB1dFVuaXQsCiAgICAgICAgY2xhc3NUb1VuaXQsCiAgICAgICAgbWVtYmVyVG9Vbml0LAogICAgICAgIC8vIExvY2FsIGZ1bmN0aW9ucyBvbmx5IG1ha2Ugc2Vuc2UgaW4gdGhlIEstd29ybGQgbW9kZWwuCiAgICAgICAgY29uc3QgPExvY2FsLCBPdXRwdXRVbml0Pnt9LAogICAgICAgIGNvbnN0YW50VG9Vbml0LAogICAgICAgIG91dHB1dFVuaXRzLAogICAgICAgIGltcG9ydERlZmVyTmFtZSwKICAgICAgICBodW5rc1RvTG9hZCwKICAgICAgICBkZWZlcnJlZEltcG9ydERlc2NyaXB0aW9ucyk7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtPdXRwdXRVbml0RGF0YV0gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVCb29sKGlzUHJvZ3JhbVNwbGl0KTsKICAgIE1hcDxPdXRwdXRVbml0LCBpbnQ+IG91dHB1dFVuaXRJbmRpY2VzID0ge307CiAgICBzaW5rLndyaXRlTGlzdChvdXRwdXRVbml0cywgKE91dHB1dFVuaXQgb3V0cHV0VW5pdCkgewogICAgICBvdXRwdXRVbml0SW5kaWNlc1tvdXRwdXRVbml0XSA9IG91dHB1dFVuaXRJbmRpY2VzLmxlbmd0aDsKICAgICAgc2luay53cml0ZUJvb2wob3V0cHV0VW5pdC5pc01haW5PdXRwdXQpOwogICAgICBzaW5rLndyaXRlU3RyaW5nKG91dHB1dFVuaXQubmFtZSk7CiAgICAgIHNpbmsud3JpdGVJbXBvcnRzKG91dHB1dFVuaXQuX2ltcG9ydHMpOwogICAgfSk7CiAgICBzaW5rLndyaXRlSW50KG91dHB1dFVuaXRJbmRpY2VzW21haW5PdXRwdXRVbml0XSk7CiAgICBzaW5rLndyaXRlQ2xhc3NNYXAoX2NsYXNzVG9Vbml0LCAoT3V0cHV0VW5pdCBvdXRwdXRVbml0KSB7CiAgICAgIHNpbmsud3JpdGVJbnQob3V0cHV0VW5pdEluZGljZXNbb3V0cHV0VW5pdF0pOwogICAgfSk7CiAgICBzaW5rLndyaXRlTWVtYmVyTWFwKF9tZW1iZXJUb1VuaXQsIChPdXRwdXRVbml0IG91dHB1dFVuaXQpIHsKICAgICAgc2luay53cml0ZUludChvdXRwdXRVbml0SW5kaWNlc1tvdXRwdXRVbml0XSk7CiAgICB9KTsKICAgIHNpbmsud3JpdGVDb25zdGFudE1hcChfY29uc3RhbnRUb1VuaXQsIChPdXRwdXRVbml0IG91dHB1dFVuaXQpIHsKICAgICAgc2luay53cml0ZUludChvdXRwdXRVbml0SW5kaWNlc1tvdXRwdXRVbml0XSk7CiAgICB9KTsKICAgIHNpbmsud3JpdGVJbXBvcnRNYXAoX2ltcG9ydERlZmVyTmFtZSwgc2luay53cml0ZVN0cmluZyk7CiAgICBzaW5rLndyaXRlU3RyaW5nTWFwKGh1bmtzVG9Mb2FkLCAoTGlzdDxPdXRwdXRVbml0PiBvdXRwdXRVbml0cykgewogICAgICBzaW5rLndyaXRlTGlzdCgKICAgICAgICAgIG91dHB1dFVuaXRzLAogICAgICAgICAgKE91dHB1dFVuaXQgb3V0cHV0VW5pdCkgPT4KICAgICAgICAgICAgICBzaW5rLndyaXRlSW50KG91dHB1dFVuaXRJbmRpY2VzW291dHB1dFVuaXRdKSk7CiAgICB9KTsKICAgIHNpbmsud3JpdGVJbXBvcnRNYXAoX2RlZmVycmVkSW1wb3J0RGVzY3JpcHRpb25zLAogICAgICAgIChJbXBvcnREZXNjcmlwdGlvbiBpbXBvcnREZXNjcmlwdGlvbikgewogICAgICBzaW5rLndyaXRlU3RyaW5nKGltcG9ydERlc2NyaXB0aW9uLmltcG9ydGluZ1VyaSk7CiAgICAgIHNpbmsud3JpdGVTdHJpbmcoaW1wb3J0RGVzY3JpcHRpb24ucHJlZml4KTsKICAgICAgc2luay53cml0ZUxpYnJhcnkoaW1wb3J0RGVzY3JpcHRpb24uX2ltcG9ydGluZ0xpYnJhcnkpOwogICAgfSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIFtPdXRwdXRVbml0XSB3aGVyZSBbY2xzXSBiZWxvbmdzLgogIE91dHB1dFVuaXQgb3V0cHV0VW5pdEZvckNsYXNzKENsYXNzRW50aXR5IGNscykgewogICAgaWYgKCFpc1Byb2dyYW1TcGxpdCkgcmV0dXJuIG1haW5PdXRwdXRVbml0OwogICAgT3V0cHV0VW5pdCB1bml0ID0gX2NsYXNzVG9Vbml0W2Nsc107CiAgICByZXR1cm4gdW5pdCA/PyBtYWluT3V0cHV0VW5pdDsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBbT3V0cHV0VW5pdF0gd2hlcmUgW21lbWJlcl0gYmVsb25ncy4KICBPdXRwdXRVbml0IG91dHB1dFVuaXRGb3JNZW1iZXIoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgaWYgKCFpc1Byb2dyYW1TcGxpdCkgcmV0dXJuIG1haW5PdXRwdXRVbml0OwogICAgT3V0cHV0VW5pdCB1bml0ID0gX21lbWJlclRvVW5pdFttZW1iZXJdOwogICAgaWYgKHVuaXQgIT0gbnVsbCkgcmV0dXJuIHVuaXQ7CiAgICBpZiAobWVtYmVyLmlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgcmV0dXJuIG91dHB1dFVuaXRGb3JDbGFzcyhtZW1iZXIuZW5jbG9zaW5nQ2xhc3MpOwogICAgfQoKICAgIHJldHVybiBtYWluT3V0cHV0VW5pdDsKICB9CgogIC8vLyBEaXJlY3QgYWNjZXNzIHRvIHRoZSBvdXRwdXQtdW5pdCB0byBjb25zdGFudHMgbWFwIHVzZWQgZm9yIHRlc3RpbmcuCiAgSXRlcmFibGU8Q29uc3RhbnRWYWx1ZT4gZ2V0IGNvbnN0YW50c0ZvclRlc3RpbmcgPT4gX2NvbnN0YW50VG9Vbml0LmtleXM7CgogIC8vLyBSZXR1cm5zIHRoZSBbT3V0cHV0VW5pdF0gd2hlcmUgW2NvbnN0YW50XSBiZWxvbmdzLgogIE91dHB1dFVuaXQgb3V0cHV0VW5pdEZvckNvbnN0YW50KENvbnN0YW50VmFsdWUgY29uc3RhbnQpIHsKICAgIGlmICghaXNQcm9ncmFtU3BsaXQpIHJldHVybiBtYWluT3V0cHV0VW5pdDsKICAgIHJldHVybiBfY29uc3RhbnRUb1VuaXRbY29uc3RhbnRdOwogIH0KCiAgLy8vIEluZGljYXRlcyB3aGV0aGVyIFtlbGVtZW50XSBpcyBkZWZlcnJlZC4KICBib29sIGlzRGVmZXJyZWRDbGFzcyhDbGFzc0VudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gb3V0cHV0VW5pdEZvckNsYXNzKGVsZW1lbnQpICE9IG1haW5PdXRwdXRVbml0OwogIH0KCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIGVsZW1lbnQgW3RvXSBpcyByZWFjaGFibGUgZnJvbSBlbGVtZW50IFtmcm9tXSB3aXRob3V0CiAgLy8vIGNyb3NzaW5nIGEgZGVmZXJyZWQgaW1wb3J0LgogIC8vLwogIC8vLyBGb3IgZXhhbXBsZSwgaWYgd2UgaGF2ZSB0d28gZGVmZXJyZWQgbGlicmFyaWVzIGBBYCBhbmQgYEJgIHRoYXQgYm90aAogIC8vLyBpbXBvcnQgYSBsaWJyYXJ5IGBDYCwgdGhlbiBldmVuIHRob3VnaCBlbGVtZW50cyBmcm9tIGBBYCBhbmQgYENgIGVuZCB1cCBpbgogIC8vLyBkaWZmZXJlbnQgb3V0cHV0IHVuaXRzLCB0aGVyZSBpcyBhIG5vbi1kZWZlcnJlZCBwYXRoIGJldHdlZW4gYEFgIGFuZCBgQ2AuCiAgYm9vbCBoYXNPbmx5Tm9uRGVmZXJyZWRJbXBvcnRQYXRocyhNZW1iZXJFbnRpdHkgZnJvbSwgTWVtYmVyRW50aXR5IHRvKSB7CiAgICBPdXRwdXRVbml0IG91dHB1dFVuaXRGcm9tID0gb3V0cHV0VW5pdEZvck1lbWJlcihmcm9tKTsKICAgIE91dHB1dFVuaXQgb3V0cHV0VW5pdFRvID0gb3V0cHV0VW5pdEZvck1lbWJlcih0byk7CiAgICBpZiAob3V0cHV0VW5pdFRvID09IG1haW5PdXRwdXRVbml0KSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdXRwdXRVbml0RnJvbSA9PSBtYWluT3V0cHV0VW5pdCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIG91dHB1dFVuaXRUby5faW1wb3J0cy5jb250YWluc0FsbChvdXRwdXRVbml0RnJvbS5faW1wb3J0cyk7CiAgfQoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgY29uc3RhbnQgW3RvXSBpcyByZWFjaGFibGUgZnJvbSBlbGVtZW50IFtmcm9tXSB3aXRob3V0CiAgLy8vIGNyb3NzaW5nIGEgZGVmZXJyZWQgaW1wb3J0LgogIC8vLwogIC8vLyBGb3IgZXhhbXBsZSwgaWYgd2UgaGF2ZSB0d28gZGVmZXJyZWQgbGlicmFyaWVzIGBBYCBhbmQgYEJgIHRoYXQgYm90aAogIC8vLyBpbXBvcnQgYSBsaWJyYXJ5IGBDYCwgdGhlbiBldmVuIHRob3VnaCBlbGVtZW50cyBmcm9tIGBBYCBhbmQgYENgIGVuZCB1cCBpbgogIC8vLyBkaWZmZXJlbnQgb3V0cHV0IHVuaXRzLCB0aGVyZSBpcyBhIG5vbi1kZWZlcnJlZCBwYXRoIGJldHdlZW4gYEFgIGFuZCBgQ2AuCiAgYm9vbCBoYXNPbmx5Tm9uRGVmZXJyZWRJbXBvcnRQYXRoc1RvQ29uc3RhbnQoCiAgICAgIE1lbWJlckVudGl0eSBmcm9tLCBDb25zdGFudFZhbHVlIHRvKSB7CiAgICBPdXRwdXRVbml0IG91dHB1dFVuaXRGcm9tID0gb3V0cHV0VW5pdEZvck1lbWJlcihmcm9tKTsKICAgIE91dHB1dFVuaXQgb3V0cHV0VW5pdFRvID0gb3V0cHV0VW5pdEZvckNvbnN0YW50KHRvKTsKICAgIGlmIChvdXRwdXRVbml0VG8gPT0gbWFpbk91dHB1dFVuaXQpIHJldHVybiB0cnVlOwogICAgaWYgKG91dHB1dFVuaXRGcm9tID09IG1haW5PdXRwdXRVbml0KSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gb3V0cHV0VW5pdFRvLl9pbXBvcnRzLmNvbnRhaW5zQWxsKG91dHB1dFVuaXRGcm9tLl9pbXBvcnRzKTsKICB9CgogIC8vLyBSZWdpc3RlcnMgdGhhdCBhIGNvbnN0YW50IGlzIHVzZWQgaW4gdGhlIHNhbWUgZGVmZXJyZWQgb3V0cHV0IHVuaXQgYXMKICAvLy8gW2ZpZWxkXS4KICB2b2lkIHJlZ2lzdGVyQ29uc3RhbnREZWZlcnJlZFVzZSgKICAgICAgRGVmZXJyZWRHbG9iYWxDb25zdGFudFZhbHVlIGNvbnN0YW50LCBPdXRwdXRVbml0IHVuaXQpIHsKICAgIGlmICghaXNQcm9ncmFtU3BsaXQpIHJldHVybjsKICAgIGFzc2VydCgKICAgICAgICBfY29uc3RhbnRUb1VuaXRbY29uc3RhbnRdID09IG51bGwgfHwgX2NvbnN0YW50VG9Vbml0W2NvbnN0YW50XSA9PSB1bml0KTsKICAgIF9jb25zdGFudFRvVW5pdFtjb25zdGFudF0gPSB1bml0OwogIH0KCiAgLy8vIFJlZ2lzdGVycyBbbmV3RW50aXR5XSB0byBiZSBlbWl0dGVkIGluIHRoZSBzYW1lIG91dHB1dCB1bml0IGFzCiAgLy8vIFtleGlzdGluZ0VudGl0eV07CiAgdm9pZCByZWdpc3RlckNvbG9jYXRlZE1lbWJlcnMoCiAgICAgIE1lbWJlckVudGl0eSBleGlzdGluZ0VudGl0eSwgTWVtYmVyRW50aXR5IG5ld0VudGl0eSkgewogICAgYXNzZXJ0KF9tZW1iZXJUb1VuaXRbbmV3RW50aXR5XSA9PSBudWxsKTsKICAgIF9tZW1iZXJUb1VuaXRbbmV3RW50aXR5XSA9IG91dHB1dFVuaXRGb3JNZW1iZXIoZXhpc3RpbmdFbnRpdHkpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHVuaXF1ZSBuYW1lIGZvciB0aGUgZ2l2ZW4gZGVmZXJyZWQgW2ltcG9ydF0uCiAgU3RyaW5nIGdldEltcG9ydERlZmVyTmFtZShTcGFubmFibGUgbm9kZSwgSW1wb3J0RW50aXR5IGltcG9ydCkgewogICAgU3RyaW5nIG5hbWUgPSBfaW1wb3J0RGVmZXJOYW1lW2ltcG9ydF07CiAgICBpZiAobmFtZSA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBTcGFubmFibGVBc3NlcnRpb25GYWlsdXJlKAogICAgICAgICAgbm9kZSwgIk5vIGRlZmVycmVkIG5hbWUgZm9yICRpbXBvcnQuIik7CiAgICB9CiAgICByZXR1cm4gbmFtZTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBuYW1lcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBkZWZlcnJlZCBpbXBvcnQgaW4gW3VuaXRdLgogIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SW1wb3J0TmFtZXMoT3V0cHV0VW5pdCB1bml0KSB7CiAgICByZXR1cm4gdW5pdC5faW1wb3J0cy5tYXAoKGkpID0+IF9pbXBvcnREZWZlck5hbWVbaV0pOwogIH0KCiAgLy8vIFJldHVybnMgYSBqc29uLXN0eWxlIG1hcCBmb3IgZGVzY3JpYmluZyB3aGF0IGZpbGVzIHRoYXQgYXJlIGxvYWRlZCBieSBhCiAgLy8vIGdpdmVuIGRlZmVycmVkIGltcG9ydC4KICAvLy8gVGhlIG1hcHBpbmcgaXMgc3RydWN0dXJlZCBhczoKICAvLy8gbGlicmFyeSB1cmkgLT4geyJuYW1lIjogbGlicmFyeSBuYW1lLCAiZmlsZXMiOiAocHJlZml4IC0+IGxpc3Qgb2YgZmlsZXMpfQogIC8vLyBXaGVyZQogIC8vLwogIC8vLyAtIDxsaWJyYXJ5IHVyaT4gaXMgdGhlIHJlbGF0aXZlIHVyaSBvZiB0aGUgbGlicmFyeSBtYWtpbmcgYSBkZWZlcnJlZAogIC8vLyAgIGltcG9ydC4KICAvLy8gLSA8bGlicmFyeSBuYW1lPiBpcyB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSwgb3IgIjx1bm5hbWVkPiIgaWYgaXQgaXMKICAvLy8gICB1bm5hbWVkLgogIC8vLyAtIDxwcmVmaXg+IGlzIHRoZSBgYXNgIHByZWZpeCB1c2VkIGZvciBhIGdpdmVuIGRlZmVycmVkIGltcG9ydC4KICAvLy8gLSA8bGlzdCBvZiBmaWxlcz4gaXMgYSBsaXN0IG9mIHRoZSBmaWxlbmFtZXMgdGhlIG11c3QgYmUgbG9hZGVkIHdoZW4gdGhhdAogIC8vLyAgIGltcG9ydCBpcyBsb2FkZWQuCiAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgZHluYW1pYz4+IGNvbXB1dGVEZWZlcnJlZE1hcCgKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsIEVsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQsCiAgICAgIHtTZXQ8T3V0cHV0VW5pdD4gb21pdHRlZFVuaXRzfSkgewogICAgb21pdHRlZFVuaXRzID8/PSBTZXQoKTsKICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIGR5bmFtaWM+PiBtYXBwaW5nID0ge307CgogICAgX2RlZmVycmVkSW1wb3J0RGVzY3JpcHRpb25zLmtleXMuZm9yRWFjaCgoSW1wb3J0RW50aXR5IGltcG9ydCkgewogICAgICBMaXN0PE91dHB1dFVuaXQ+IG91dHB1dFVuaXRzID0gaHVua3NUb0xvYWRbX2ltcG9ydERlZmVyTmFtZVtpbXBvcnRdXTsKICAgICAgSW1wb3J0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBfZGVmZXJyZWRJbXBvcnREZXNjcmlwdGlvbnNbaW1wb3J0XTsKICAgICAgU3RyaW5nIGdldE5hbWUoTGlicmFyeUVudGl0eSBsaWJyYXJ5KSB7CiAgICAgICAgdmFyIG5hbWUgPSBlbGVtZW50RW52aXJvbm1lbnQuZ2V0TGlicmFyeU5hbWUobGlicmFyeSk7CiAgICAgICAgcmV0dXJuIG5hbWUgPT0gJycgPyAnPHVubmFtZWQ+JyA6IG5hbWU7CiAgICAgIH0KCiAgICAgIE1hcDxTdHJpbmcsIGR5bmFtaWM+IGxpYnJhcnlNYXAgPSBtYXBwaW5nLnB1dElmQWJzZW50KAogICAgICAgICAgZGVzY3JpcHRpb24uaW1wb3J0aW5nVXJpLAogICAgICAgICAgKCkgPT4gPFN0cmluZywgZHluYW1pYz57CiAgICAgICAgICAgICAgICAibmFtZSI6IGdldE5hbWUoZGVzY3JpcHRpb24uX2ltcG9ydGluZ0xpYnJhcnkpLAogICAgICAgICAgICAgICAgImltcG9ydHMiOiA8U3RyaW5nLCBMaXN0PFN0cmluZz4+e30KICAgICAgICAgICAgICB9KTsKCiAgICAgIExpc3Q8U3RyaW5nPiBwYXJ0RmlsZU5hbWVzID0gb3V0cHV0VW5pdHMKICAgICAgICAgIC53aGVyZSgob3V0cHV0VW5pdCkgPT4gIW9taXR0ZWRVbml0cy5jb250YWlucyhvdXRwdXRVbml0KSkKICAgICAgICAgIC5tYXAoKG91dHB1dFVuaXQpID0+IGRlZmVycmVkUGFydEZpbGVOYW1lKG9wdGlvbnMsIG91dHB1dFVuaXQubmFtZSkpCiAgICAgICAgICAudG9MaXN0KCk7CiAgICAgIGxpYnJhcnlNYXBbImltcG9ydHMiXVtfaW1wb3J0RGVmZXJOYW1lW2ltcG9ydF1dID0gcGFydEZpbGVOYW1lczsKICAgIH0pOwogICAgcmV0dXJuIG1hcHBpbmc7CiAgfQp9CgovLy8gUmV0dXJucyB0aGUgZmlsZW5hbWUgZm9yIHRoZSBvdXRwdXQtdW5pdCBuYW1lZCBbbmFtZV0uCi8vLwovLy8gVGhlIGZpbGVuYW1lIGlzIG9mIHRoZSBmb3JtICI8bWFpbiBvdXRwdXQgZmlsZT5fPG5hbWU+LnBhcnQuanMiLgovLy8gSWYgW2FkZEV4dGVuc2lvbl0gaXMgZmFsc2UsIHRoZSAiLnBhcnQuanMiIHN1ZmZpeCBpcyBsZWZ0IG91dC4KU3RyaW5nIGRlZmVycmVkUGFydEZpbGVOYW1lKENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLCBTdHJpbmcgbmFtZSwKICAgIHtib29sIGFkZEV4dGVuc2lvbjogdHJ1ZX0pIHsKICBhc3NlcnQobmFtZSAhPSAiIik7CiAgU3RyaW5nIG91dFBhdGggPSBvcHRpb25zLm91dHB1dFVyaSAhPSBudWxsID8gb3B0aW9ucy5vdXRwdXRVcmkucGF0aCA6ICJvdXQiOwogIFN0cmluZyBvdXROYW1lID0gb3V0UGF0aC5zdWJzdHJpbmcob3V0UGF0aC5sYXN0SW5kZXhPZignLycpICsgMSk7CiAgU3RyaW5nIGV4dGVuc2lvbiA9IGFkZEV4dGVuc2lvbiA/ICIucGFydC5qcyIgOiAiIjsKICByZXR1cm4gIiR7b3V0TmFtZX1fJG5hbWUkZXh0ZW5zaW9uIjsKfQoKY2xhc3MgRGVwZW5kZW5jaWVzIHsKICBmaW5hbCBNYXA8Q2xhc3NFbnRpdHksIERlcGVuZGVuY3lJbmZvPiBjbGFzc2VzID0ge307CiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwgRGVwZW5kZW5jeUluZm8+IG1lbWJlcnMgPSB7fTsKICBmaW5hbCBTZXQ8TG9jYWw+IGxvY2FsRnVuY3Rpb25zID0gbmV3IFNldDxMb2NhbD4oKTsKICBmaW5hbCBNYXA8Q29uc3RhbnRWYWx1ZSwgRGVwZW5kZW5jeUluZm8+IGNvbnN0YW50cyA9IHt9OwoKICB2b2lkIGFkZENsYXNzKENsYXNzRW50aXR5IGNscywgW0ltcG9ydEVudGl0eSBpbXBvcnRdKSB7CiAgICAoY2xhc3Nlc1tjbHNdID8/PSBuZXcgRGVwZW5kZW5jeUluZm8oKSkucmVnaXN0ZXJJbXBvcnQoaW1wb3J0KTsKICB9CgogIHZvaWQgYWRkTWVtYmVyKE1lbWJlckVudGl0eSBtLCBbSW1wb3J0RW50aXR5IGltcG9ydF0pIHsKICAgIChtZW1iZXJzW21dID8/PSBuZXcgRGVwZW5kZW5jeUluZm8oKSkucmVnaXN0ZXJJbXBvcnQoaW1wb3J0KTsKICB9CgogIHZvaWQgYWRkQ29uc3RhbnQoQ29uc3RhbnRWYWx1ZSBjLCBbSW1wb3J0RW50aXR5IGltcG9ydF0pIHsKICAgIChjb25zdGFudHNbY10gPz89IG5ldyBEZXBlbmRlbmN5SW5mbygpKS5yZWdpc3RlckltcG9ydChpbXBvcnQpOwogIH0KfQoKY2xhc3MgRGVwZW5kZW5jeUluZm8gewogIGJvb2wgaXNEZWZlcnJlZCA9IHRydWU7CiAgTGlzdDxJbXBvcnRFbnRpdHk+IGltcG9ydHM7CgogIHJlZ2lzdGVySW1wb3J0KEltcG9ydEVudGl0eSBpbXBvcnQpIHsKICAgIGlmICghaXNEZWZlcnJlZCkgcmV0dXJuOwogICAgLy8gQSBudWxsIGltcG9ydCByZXByZXNlbnRzIGEgZGlyZWN0IG5vbi1kZWZlcnJlZCBkZXBlbmRlbmN5LgogICAgaWYgKGltcG9ydCAhPSBudWxsKSB7CiAgICAgIChpbXBvcnRzID8/PSBbXSkuYWRkKGltcG9ydCk7CiAgICB9IGVsc2UgewogICAgICBpbXBvcnRzID0gbnVsbDsKICAgICAgaXNEZWZlcnJlZCA9IGZhbHNlOwogICAgfQogIH0KfQoKY2xhc3MgVHlwZURlcGVuZGVuY3lWaXNpdG9yIGltcGxlbWVudHMgRGFydFR5cGVWaXNpdG9yPHZvaWQsIE51bGw+IHsKICBmaW5hbCBEZXBlbmRlbmNpZXMgX2RlcGVuZGVuY2llczsKICBmaW5hbCBJbXBvcnRFbnRpdHkgX2ltcG9ydDsKICBmaW5hbCBDb21tb25FbGVtZW50cyBfY29tbW9uRWxlbWVudHM7CgogIFR5cGVEZXBlbmRlbmN5VmlzaXRvcih0aGlzLl9kZXBlbmRlbmNpZXMsIHRoaXMuX2ltcG9ydCwgdGhpcy5fY29tbW9uRWxlbWVudHMpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0KERhcnRUeXBlIHR5cGUsIFtfXSkgewogICAgdHlwZS5hY2NlcHQodGhpcywgbnVsbCk7CiAgfQoKICB2b2lkIHZpc2l0TGlzdChMaXN0PERhcnRUeXBlPiB0eXBlcykgewogICAgdHlwZXMuZm9yRWFjaCh2aXNpdCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RnV0dXJlT3JUeXBlKEZ1dHVyZU9yVHlwZSB0eXBlLCBOdWxsIGFyZ3VtZW50KSB7CiAgICBfZGVwZW5kZW5jaWVzLmFkZENsYXNzKF9jb21tb25FbGVtZW50cy5mdXR1cmVDbGFzcyk7CiAgICB2aXNpdCh0eXBlLnR5cGVBcmd1bWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RHluYW1pY1R5cGUoRHluYW1pY1R5cGUgdHlwZSwgTnVsbCBhcmd1bWVudCkgewogICAgLy8gTm90aGluZyB0byBhZGQuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgdHlwZSwgTnVsbCBhcmd1bWVudCkgewogICAgdmlzaXRMaXN0KHR5cGUudHlwZUFyZ3VtZW50cyk7CiAgICB2aXNpdCh0eXBlLnVuYWxpYXNlZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIHR5cGUsIE51bGwgYXJndW1lbnQpIHsKICAgIHZpc2l0TGlzdCh0eXBlLnR5cGVBcmd1bWVudHMpOwogICAgLy8gVE9ETyhzaWdtdW5kKTogd2hlbiB3ZSBhcmUgYWJsZSB0byBzcGxpdCBjbGFzc2VzIGZyb20gdHlwZXMgaW4gb3VyCiAgICAvLyBydW50aW1lLXR5cGUgcmVwcmVzZW50YXRpb24sIHRoaXMgc2hvdWxkIHRyYWNrIHR5cGUuZWxlbWVudCBhcyBhIHR5cGUKICAgIC8vIGRlcGVuZGVuY3kgaW5zdGVhZC4KICAgIF9kZXBlbmRlbmNpZXMuYWRkQ2xhc3ModHlwZS5lbGVtZW50LCBfaW1wb3J0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIHR5cGUsIE51bGwgYXJndW1lbnQpIHsKICAgIGZvciAoRnVuY3Rpb25UeXBlVmFyaWFibGUgdHlwZVZhcmlhYmxlIGluIHR5cGUudHlwZVZhcmlhYmxlcykgewogICAgICB2aXNpdCh0eXBlVmFyaWFibGUuYm91bmQpOwogICAgfQogICAgdmlzaXRMaXN0KHR5cGUucGFyYW1ldGVyVHlwZXMpOwogICAgdmlzaXRMaXN0KHR5cGUub3B0aW9uYWxQYXJhbWV0ZXJUeXBlcyk7CiAgICB2aXNpdExpc3QodHlwZS5uYW1lZFBhcmFtZXRlclR5cGVzKTsKICAgIHZpc2l0KHR5cGUucmV0dXJuVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RnVuY3Rpb25UeXBlVmFyaWFibGUoRnVuY3Rpb25UeXBlVmFyaWFibGUgdHlwZSwgTnVsbCBhcmd1bWVudCkgewogICAgLy8gTm90aGluZyB0byBhZGQuIEhhbmRsZWQgaW4gW3Zpc2l0RnVuY3Rpb25UeXBlXS4KICB9CgogIEBvdmVy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AgEXGh4BKB1CGiQNFhoGBAIBRSQeKAFRAQwjHQQBKRoEAQw9OR4EAQw7FwQBDDsjGwQBDD8jSk0bMwQBDD1EIQYkLCkcBAEMTTcEAQxFPQQBDDUXBAIBJ3BhY2thZ2U6Y29tcGlsZXIvc3JjL2RlZmVycmVkX2xvYWQuZGFydDxzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9kaWFnbm9zdGljcy9jb2RlX2xvY2F0aW9uLmRhcnSKGC8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuZGlhZ25vc3RpY3MuY29kZV9sb2NhdGlvbjsKCmltcG9ydCAnLi4vdXRpbC91cmlfZXh0cmFzLmRhcnQnIGFzIHVyaV9leHRyYXMgc2hvdyByZWxhdGl2aXplOwoKLy8vIFtDb2RlTG9jYXRpb25dIGRpdmlkZXMgdXJpcyBpbnRvIGRpZmZlcmVudCBjbGFzc2VzLgovLy8KLy8vIFRoZXNlIGFyZSB1c2VkIHRvIGdyb3VwIHVyaXMgZnJvbSB1c2VyIGNvZGUsIHBsYXRmb3JtIGxpYnJhcmllcyBhbmQKLy8vIHBhY2thZ2VzLgphYnN0cmFjdCBjbGFzcyBDb2RlTG9jYXRpb24gewogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbdXJpXSBpcyBpbiB0aGlzIGNvZGUgbG9jYXRpb24uCiAgYm9vbCBpblNhbWVMb2NhdGlvbihVcmkgdXJpKTsKCiAgLy8vIFJldHVybnMgdGhlIHVyaSBvZiB0aGlzIGxvY2F0aW9uIHJlbGF0aXZlIHRvIFtiYXNlVXJpXS4KICBTdHJpbmcgcmVsYXRpdml6ZShVcmkgYmFzZVVyaSk7CgogIGZhY3RvcnkgQ29kZUxvY2F0aW9uKFVyaSB1cmkpIHsKICAgIGlmICh1cmkuc2NoZW1lID09ICdwYWNrYWdlJykgewogICAgICBpbnQgc2xhc2hQb3MgPSB1cmkucGF0aC5pbmRleE9mKCcvJyk7CiAgICAgIGlmIChzbGFzaFBvcyAhPSAtMSkgewogICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IHVyaS5wYXRoLnN1YnN0cmluZygwLCBzbGFzaFBvcyk7CiAgICAgICAgcmV0dXJuIG5ldyBQYWNrYWdlTG9jYXRpb24ocGFja2FnZU5hbWUpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBuZXcgVXJpTG9jYXRpb24odXJpKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBTY2hlbWVMb2NhdGlvbih1cmkpOwogICAgfQogIH0KfQoKLy8vIEEgY29kZSBsb2NhdGlvbiBkZWZpbmVkIGJ5IHRoZSBzY2hlbWUgb2YgdGhlIHVyaS4KLy8vCi8vLyBVc2VkIGZvciBub24tcGFja2FnZSB1cmlzLCBzdWNoIGFzICdkYXJ0JywgJ2ZpbGUnLCBhbmQgJ2h0dHAnLgpjbGFzcyBTY2hlbWVMb2NhdGlvbiBpbXBsZW1lbnRzIENvZGVMb2NhdGlvbiB7CiAgZmluYWwgVXJpIHVyaTsKCiAgU2NoZW1lTG9jYXRpb24odGhpcy51cmkpOwoKICBAb3ZlcnJpZGUKICBib29sIGluU2FtZUxvY2F0aW9uKFVyaSB1cmkpIHsKICAgIHJldHVybiB0aGlzLnVyaS5zY2hlbWUgPT0gdXJpLnNjaGVtZTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyByZWxhdGl2aXplKFVyaSBiYXNlVXJpKSB7CiAgICByZXR1cm4gdXJpX2V4dHJhcy5yZWxhdGl2aXplKGJhc2VVcmksIHVyaSwgZmFsc2UpOwogIH0KfQoKLy8vIEEgY29kZSBsb2NhdGlvbiBkZWZpbmVkIGJ5IHRoZSBwYWNrYWdlIG5hbWUuCi8vLwovLy8gVXNlZCBmb3IgcGFja2FnZSB1cmlzLCBzZXBhcmF0ZWQgYnkgdGhlaXIgYHBhY2thZ2UgbmFtZXNgLCB0aGF0IGlzLCB0aGUKLy8vICdmb28nIG9mICdwYWNrYWdlOmZvby9iYXIuZGFydCcuCmNsYXNzIFBhY2thZ2VMb2NhdGlvbiBpbXBsZW1lbnRzIENvZGVMb2NhdGlvbiB7CiAgZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lOwoKICBQYWNrYWdlTG9jYXRpb24odGhpcy5wYWNrYWdlTmFtZSk7CgogIEBvdmVycmlkZQogIGJvb2wgaW5TYW1lTG9jYXRpb24oVXJpIHVyaSkgewogICAgcmV0dXJuIHVyaS5zY2hlbWUgPT0gJ3BhY2thZ2UnICYmIHVyaS5wYXRoLnN0YXJ0c1dpdGgoJyRwYWNrYWdlTmFtZS8nKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyByZWxhdGl2aXplKFVyaSBiYXNlVXJpKSA9PiAncGFja2FnZTokcGFja2FnZU5hbWUnOwp9CgovLy8gQSBjb2RlIGxvY2F0aW9uIGRlZmluZWQgYnkgdGhlIHdob2xlIHVyaS4KLy8vCi8vLyBVc2VkIGZvciBwYWNrYWdlIHVyaXMgd2l0aCBubyBwYWNrYWdlIG5hbWUuIEZvciBpbnN0YW5jZSAncGFja2FnZTpmb28uZGFydCcuCmNsYXNzIFVyaUxvY2F0aW9uIGltcGxlbWVudHMgQ29kZUxvY2F0aW9uIHsKICBmaW5hbCBVcmkgdXJpOwoKICBVcmlMb2NhdGlvbih0aGlzLnVyaSk7CgogIEBvdmVycmlkZQogIGJvb2wgaW5TYW1lTG9jYXRpb24oVXJpIHVyaSkgPT4gdGhpcy51cmkgPT0gdXJpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgcmVsYXRpdml6ZShVcmkgYmFzZVVyaSkgewogICAgcmV0dXJuIHVyaV9leHRyYXMucmVsYXRpdml6ZShiYXNlVXJpLCB1cmksIGZhbHNlKTsKICB9Cn0KCi8vLyBBIGNvZGUgbG9jYXRpb24gdGhhdCBjb250YWlucyBhbnkgdXJpLgpjbGFzcyBBbnlMb2NhdGlvbiBpbXBsZW1lbnRzIENvZGVMb2NhdGlvbiB7CiAgY29uc3QgQW55TG9jYXRpb24oKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpblNhbWVMb2NhdGlvbihVcmkgdXJpKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgcmVsYXRpdml6ZShVcmkgYmFzZVVyaSkgPT4gJyRiYXNlVXJpJzsKfQpkAE5OPAErAUABOARIDh44IAE+IgEiIywcPjEPJQgNJgYEAgE2BEMvEQEcAQwhKgQBDCM3BAIBMQRMJTAcASUBDCFMBAEMPAIBLgRRLBEBGQEMMwEMIzcEAgErLBcBDCgBDDACATNwYWNrYWdlOmNvbXBpbGVyL3NyYy9kaWFnbm9zdGljcy9jb2RlX2xvY2F0aW9uLmRhcnQsc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvZHVtcF9pbmZvLmRhcnTAAGBmLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZHVtcF9pbmZvOwoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnCiAgICBzaG93IENodW5rZWRDb252ZXJzaW9uU2luaywgSnNvbkVuY29kZXIsIFN0cmluZ0NvbnZlcnNpb25TaW5rOwoKaW1wb3J0ICdwYWNrYWdlOmRhcnQyanNfaW5mby9pbmZvLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6ZGFydDJqc19pbmZvL2pzb25faW5mb19jb2RlYy5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmRhcnQyanNfaW5mby9iaW5hcnlfc2VyaWFsaXphdGlvbi5kYXJ0JyBhcyBkdW1wX2luZm87CgppbXBvcnQgJy4uL2NvbXBpbGVyX25ldy5kYXJ0JzsKaW1wb3J0ICdjb21tb24vbmFtZXMuZGFydCc7CmltcG9ydCAnY29tbW9uL3Rhc2tzLmRhcnQnIHNob3cgQ29tcGlsZXJUYXNrOwppbXBvcnQgJ2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICdjb21tb25fZWxlbWVudHMuZGFydCcgc2hvdyBKRWxlbWVudEVudmlyb25tZW50OwppbXBvcnQgJ2NvbXBpbGVyLmRhcnQnIHNob3cgQ29tcGlsZXI7CmltcG9ydCAnY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JyBzaG93IENvbnN0YW50VmFsdWUsIEludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZTsKaW1wb3J0ICdkZWZlcnJlZF9sb2FkLmRhcnQnIHNob3cgT3V0cHV0VW5pdCwgZGVmZXJyZWRQYXJ0RmlsZU5hbWU7CmltcG9ydCAnZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJ2luZmVycmVyL3R5cGVzLmRhcnQnCiAgICBzaG93IEdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHQsIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzOwppbXBvcnQgJ2pzL2pzLmRhcnQnIGFzIGpzQXN0OwppbXBvcnQgJ2pzX2JhY2tlbmQvanNfYmFja2VuZC5kYXJ0JyBzaG93IEphdmFTY3JpcHRCYWNrZW5kOwppbXBvcnQgJ2pzX2JhY2tlbmQvZmllbGRfYW5hbHlzaXMuZGFydCc7CmltcG9ydCAndW5pdmVyc2UvY29kZWdlbl93b3JsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3VuaXZlcnNlL3dvcmxkX2ltcGFjdC5kYXJ0JwogICAgc2hvdyBJbXBhY3RVc2VDYXNlLCBXb3JsZEltcGFjdCwgV29ybGRJbXBhY3RWaXNpdG9ySW1wbDsKaW1wb3J0ICd1dGlsL3NpbmtfYWRhcHRlci5kYXJ0JzsKaW1wb3J0ICd3b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKCmNsYXNzIEVsZW1lbnRJbmZvQ29sbGVjdG9yIHsKICBmaW5hbCBDb21waWxlciBjb21waWxlcjsKICBmaW5hbCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQ7CiAgZmluYWwgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgX2dsb2JhbEluZmVyZW5jZVJlc3VsdHM7CiAgZmluYWwgRHVtcEluZm9UYXNrIGR1bXBJbmZvVGFzazsKCiAgSkVsZW1lbnRFbnZpcm9ubWVudCBnZXQgZW52aXJvbm1lbnQgPT4gY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50OwogIENvZGVnZW5Xb3JsZEJ1aWxkZXIgZ2V0IGNvZGVnZW5Xb3JsZEJ1aWxkZXIgPT4gY29tcGlsZXIuY29kZWdlbldvcmxkQnVpbGRlcjsKCiAgZmluYWwgQWxsSW5mbyByZXN1bHQgPSBuZXcgQWxsSW5mbygpOwogIGZpbmFsIE1hcDxFbnRpdHksIEluZm8+IF9lbnRpdHlUb0luZm8gPSA8RW50aXR5LCBJbmZvPnt9OwogIGZpbmFsIE1hcDxDb25zdGFudFZhbHVlLCBJbmZvPiBfY29uc3RhbnRUb0luZm8gPSA8Q29uc3RhbnRWYWx1ZSwgSW5mbz57fTsKICBmaW5hbCBNYXA8T3V0cHV0VW5pdCwgT3V0cHV0VW5pdEluZm8+IF9vdXRwdXRUb0luZm8gPSB7fTsKCiAgRWxlbWVudEluZm9Db2xsZWN0b3IodGhpcy5jb21waWxlciwgdGhpcy5kdW1wSW5mb1Rhc2ssIHRoaXMuY2xvc2VkV29ybGQsCiAgICAgIHRoaXMuX2dsb2JhbEluZmVyZW5jZVJlc3VsdHMpOwoKICB2b2lkIHJ1bigpIHsKICAgIGR1bXBJbmZvVGFzay5fY29uc3RhbnRUb05vZGUuZm9yRWFjaCgoY29uc3RhbnQsIG5vZGUpIHsKICAgICAgLy8gVE9ETyhzaWdtdW5kKTogYWRkIGRlcGVuZGVuY2llcyBvbiBvdGhlciBjb25zdGFudHMKICAgICAgdmFyIHNwYW4gPSBkdW1wSW5mb1Rhc2suX25vZGVEYXRhW25vZGVdOwogICAgICB2YXIgaW5mbyA9IG5ldyBDb25zdGFudEluZm8oCiAgICAgICAgICBzaXplOiBzcGFuLmVuZCAtIHNwYW4uc3RhcnQsCiAgICAgICAgICBjb2RlOiBbc3Bhbl0sCiAgICAgICAgICBvdXRwdXRVbml0OiBfdW5pdEluZm9Gb3JDb25zdGFudChjb25zdGFudCkpOwogICAgICBfY29uc3RhbnRUb0luZm9bY29uc3RhbnRdID0gaW5mbzsKICAgICAgcmVzdWx0LmNvbnN0YW50cy5hZGQoaW5mbyk7CiAgICB9KTsKICAgIGVudmlyb25tZW50LmxpYnJhcmllcy5mb3JFYWNoKHZpc2l0TGlicmFyeSk7CiAgfQoKICAvLy8gV2hldGhlciB0byBlbWl0IGluZm9ybWF0aW9uIGFib3V0IFtlbnRpdHldLgogIC8vLwogIC8vLyBCeSBkZWZhdWx0IHdlIGVtaXQgaW5mb3JtYXRpb24gZm9yIGFueSBlbnRpdHkgdGhhdCBjb250cmlidXRlcyB0byB0aGUKICAvLy8gb3V0cHV0IHNpemUuIEVpdGhlciBiZWNhdXNlIGl0IGlzIGEgZnVuY3Rpb24gYmVpbmcgZW1pdHRlZCBvciBpbmxpbmVkLAogIC8vLyBvciBiZWNhdXNlIGl0IGlzIGFuIGVudGl0eSB0aGF0IGhvbGRzIGRlcGVuZGVuY2llcyB0byBvdGhlciBlbnRpdGllcy4KICBib29sIHNob3VsZEtlZXAoRW50aXR5IGVudGl0eSkgewogICAgcmV0dXJuIGR1bXBJbmZvVGFzay5pbXBhY3RzLmNvbnRhaW5zS2V5KGVudGl0eSkgfHwKICAgICAgICBkdW1wSW5mb1Rhc2suaW5saW5lQ291bnQuY29udGFpbnNLZXkoZW50aXR5KTsKICB9CgogIExpYnJhcnlJbmZvIHZpc2l0TGlicmFyeShMaWJyYXJ5RW50aXR5IGxpYikgewogICAgU3RyaW5nIGxpYm5hbWUgPSBlbnZpcm9ubWVudC5nZXRMaWJyYXJ5TmFtZShsaWIpOwogICAgaWYgKGxpYm5hbWUuaXNFbXB0eSkgewogICAgICBsaWJuYW1lID0gJzx1bm5hbWVkPic7CiAgICB9CiAgICBpbnQgc2l6ZSA9IGR1bXBJbmZvVGFzay5zaXplT2YobGliKTsKICAgIExpYnJhcnlJbmZvIGluZm8gPSBuZXcgTGlicmFyeUluZm8obGlibmFtZSwgbGliLmNhbm9uaWNhbFVyaSwgbnVsbCwgc2l6ZSk7CiAgICBfZW50aXR5VG9JbmZvW2xpYl0gPSBpbmZvOwoKICAgIGVudmlyb25tZW50LmZvckVhY2hMaWJyYXJ5TWVtYmVyKGxpYiwgKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgICAgaWYgKG1lbWJlci5pc0Z1bmN0aW9uIHx8IG1lbWJlci5pc0dldHRlciB8fCBtZW1iZXIuaXNTZXR0ZXIpIHsKICAgICAgICBGdW5jdGlvbkluZm8gZnVuY3Rpb25JbmZvID0gdmlzaXRGdW5jdGlvbihtZW1iZXIpOwogICAgICAgIGlmIChmdW5jdGlvbkluZm8gIT0gbnVsbCkgewogICAgICAgICAgaW5mby50b3BMZXZlbEZ1bmN0aW9ucy5hZGQoZnVuY3Rpb25JbmZvKTsKICAgICAgICAgIGZ1bmN0aW9uSW5mby5wYXJlbnQgPSBpbmZvOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChtZW1iZXIuaXNGaWVsZCkgewogICAgICAgIEZpZWxkSW5mbyBmaWVsZEluZm8gPSB2aXNpdEZpZWxkKG1lbWJlcik7CiAgICAgICAgaWYgKGZpZWxkSW5mbyAhPSBudWxsKSB7CiAgICAgICAgICBpbmZvLnRvcExldmVsVmFyaWFibGVzLmFkZChmaWVsZEluZm8pOwogICAgICAgICAgZmllbGRJbmZvLnBhcmVudCA9IGluZm87CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKCiAgICBlbnZpcm9ubWVudC5mb3JFYWNoQ2xhc3MobGliLCAoQ2xhc3NFbnRpdHkgY2xhenopIHsKICAgICAgQ2xhc3NJbmZvIGNsYXNzSW5mbyA9IHZpc2l0Q2xhc3MoY2xhenopOwogICAgICBpZiAoY2xhc3NJbmZvICE9IG51bGwpIHsKICAgICAgICBpbmZvLmNsYXNzZXMuYWRkKGNsYXNzSW5mbyk7CiAgICAgICAgY2xhc3NJbmZvLnBhcmVudCA9IGluZm87CiAgICAgIH0KICAgIH0pOwoKICAgIGlmIChpbmZvLmlzRW1wdHkgJiYgIXNob3VsZEtlZXAobGliKSkgcmV0dXJuIG51bGw7CiAgICByZXN1bHQubGlicmFyaWVzLmFkZChpbmZvKTsKICAgIHJldHVybiBpbmZvOwogIH0KCiAgR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdCBfcmVzdWx0T2ZNZW1iZXIoTWVtYmVyRW50aXR5IGUpID0+CiAgICAgIF9nbG9iYWxJbmZlcmVuY2VSZXN1bHRzLnJlc3VsdE9mTWVtYmVyKGUpOwoKICBBYnN0cmFjdFZhbHVlIF9yZXN1bHRPZlBhcmFtZXRlcihMb2NhbCBlKSA9PgogICAgICBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cy5yZXN1bHRPZlBhcmFtZXRlcihlKTsKCiAgRmllbGRJbmZvIHZpc2l0RmllbGQoRmllbGRFbnRpdHkgZmllbGQsIHtDbGFzc0VudGl0eSBjb250YWluaW5nQ2xhc3N9KSB7CiAgICBBYnN0cmFjdFZhbHVlIGluZmVycmVkVHlwZSA9IF9yZXN1bHRPZk1lbWJlcihmaWVsZCkudHlwZTsKICAgIC8vIElmIGEgZmllbGQgaGFzIGFuIGVtcHR5IGluZmVycmVkIHR5cGUgaXQgaXMgbmV2ZXIgdXNlZC4KICAgIGlmIChpbmZlcnJlZFR5cGUgPT0gbnVsbCB8fAogICAgICAgIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAgICAgLmlzRW1wdHkoaW5mZXJyZWRUeXBlKQogICAgICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBpbnQgc2l6ZSA9IGR1bXBJbmZvVGFzay5zaXplT2YoZmllbGQpOwogICAgTGlzdDxDb2RlU3Bhbj4gY29kZSA9IGR1bXBJbmZvVGFzay5jb2RlT2YoZmllbGQpOwoKICAgIC8vIFRPRE8oaGV0KTogV2h5IGRvZXNuJ3QgYHNpemVgIGFjY291bnQgZm9yIHRoZSBjb2RlIHNpemUgYWxyZWFkeT8KICAgIGlmIChjb2RlICE9IG51bGwpIHNpemUgKz0gY29kZS5sZW5ndGg7CgogICAgRmllbGRJbmZvIGluZm8gPSBuZXcgRmllbGRJbmZvKAogICAgICAgIG5hbWU6IGZpZWxkLm5hbWUsCiAgICAgICAgdHlwZTogJyR7ZW52aXJvbm1lbnQuZ2V0RmllbGRUeXBlKGZpZWxkKX0nLAogICAgICAgIGluZmVycmVkVHlwZTogJyRpbmZlcnJlZFR5cGUnLAogICAgICAgIGNvZGU6IGNvZGUsCiAgICAgICAgb3V0cHV0VW5pdDogX3VuaXRJbmZvRm9yTWVtYmVyKGZpZWxkKSwKICAgICAgICBpc0NvbnN0OiBmaWVsZC5pc0NvbnN0KTsKICAgIF9lbnRpdHlUb0luZm9bZmllbGRdID0gaW5mbzsKICAgIEZpZWxkQW5hbHlzaXNEYXRhIGZpZWxkRGF0YSA9IGNsb3NlZFdvcmxkLmZpZWxkQW5hbHlzaXMuZ2V0RmllbGREYXRhKGZpZWxkKTsKICAgIGlmIChmaWVsZERhdGEuaW5pdGlhbFZhbHVlICE9IG51bGwpIHsKICAgICAgaW5mby5pbml0aWFsaXplciA9IF9jb25zdGFudFRvSW5mb1tmaWVsZERhdGEuaW5pdGlhbFZhbHVlXTsKICAgIH0KCiAgICBpZiAoY29tcGlsZXIub3B0aW9ucy5leHBlcmltZW50Q2FsbEluc3RydW1lbnRhdGlvbikgewogICAgICAvLyBXZSB1c2UgZmllbGQuaGFzaENvZGUgYmVjYXVzZSBpdCBpcyBnbG9iYWxseSB1bmlxdWUgYW5kIGl0IGlzCiAgICAgIC8vIGF2YWlsYWJsZSB3aGlsZSB3ZSBhcmUgZG9pbmcgY29kZWdlbi4KICAgICAgaW5mby5jb3ZlcmFnZUlkID0gJyR7ZmllbGQuaGFzaENvZGV9JzsKICAgIH0KCiAgICBpbnQgY2xvc3VyZVNpemUgPSBfYWRkQ2xvc3VyZUluZm8oaW5mbywgZmllbGQpOwogICAgaW5mby5zaXplID0gc2l6ZSArIGNsb3N1cmVTaXplOwoKICAgIHJlc3VsdC5maWVsZHMuYWRkKGluZm8pOwogICAgcmV0dXJuIGluZm87CiAgfQoKICBDbGFzc0luZm8gdmlzaXRDbGFzcyhDbGFzc0VudGl0eSBjbGF6eikgewogICAgLy8gT21pdCBjbGFzcyBpZiBpdCBpcyBub3QgbmVlZGVkLgogICAgQ2xhc3NJbmZvIGNsYXNzSW5mbyA9IG5ldyBDbGFzc0luZm8oCiAgICAgICAgbmFtZTogY2xhenoubmFtZSwKICAgICAgICBpc0Fic3RyYWN0OiBjbGF6ei5pc0Fic3RyYWN0LAogICAgICAgIG91dHB1dFVuaXQ6IF91bml0SW5mb0ZvckNsYXNzKGNsYXp6KSk7CiAgICBfZW50aXR5VG9JbmZvW2NsYXp6XSA9IGNsYXNzSW5mbzsKCiAgICBpbnQgc2l6ZSA9IGR1bXBJbmZvVGFzay5zaXplT2YoY2xhenopOwogICAgZW52aXJvbm1lbnQuZm9yRWFjaExvY2FsQ2xhc3NNZW1iZXIoY2xhenosIChtZW1iZXIpIHsKICAgICAgaWYgKG1lbWJlci5pc0Z1bmN0aW9uIHx8IG1lbWJlci5pc0dldHRlciB8fCBtZW1iZXIuaXNTZXR0ZXIpIHsKICAgICAgICBGdW5jdGlvbkluZm8gZnVuY3Rpb25JbmZvID0gdmlzaXRGdW5jdGlvbihtZW1iZXIpOwogICAgICAgIGlmIChmdW5jdGlvbkluZm8gIT0gbnVsbCkgewogICAgICAgICAgY2xhc3NJbmZvLmZ1bmN0aW9ucy5hZGQoZnVuY3Rpb25JbmZvKTsKICAgICAgICAgIGZ1bmN0aW9uSW5mby5wYXJlbnQgPSBjbGFzc0luZm87CiAgICAgICAgICBmb3IgKHZhciBjbG9zdXJlSW5mbyBpbiBmdW5jdGlvbkluZm8uY2xvc3VyZXMpIHsKICAgICAgICAgICAgc2l6ZSArPSBjbG9zdXJlSW5mby5zaXplOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChtZW1iZXIuaXNGaWVsZCkgewogICAgICAgIEZpZWxkSW5mbyBmaWVsZEluZm8gPSB2aXNpdEZpZWxkKG1lbWJlciwgY29udGFpbmluZ0NsYXNzOiBjbGF6eik7CiAgICAgICAgaWYgKGZpZWxkSW5mbyAhPSBudWxsKSB7CiAgICAgICAgICBjbGFzc0luZm8uZmllbGRzLmFkZChmaWVsZEluZm8pOwogICAgICAgICAgZmllbGRJbmZvLnBhcmVudCA9IGNsYXNzSW5mbzsKICAgICAgICAgIGZvciAodmFyIGNsb3N1cmVJbmZvIGluIGZpZWxkSW5mby5jbG9zdXJlcykgewogICAgICAgICAgICBzaXplICs9IGNsb3N1cmVJbmZvLnNpemU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCdDbGFzcyBtZW1iZXIgbm90IGEgZnVuY3Rpb24gb3IgZmllbGQnKTsKICAgICAgfQogICAgfSk7CiAgICBlbnZpcm9ubWVudC5mb3JFYWNoQ29uc3RydWN0b3IoY2xhenosIChjb25zdHJ1Y3RvcikgewogICAgICBGdW5jdGlvbkluZm8gZnVuY3Rpb25JbmZvID0gdmlzaXRGdW5jdGlvbihjb25zdHJ1Y3Rvcik7CiAgICAgIGlmIChmdW5jdGlvbkluZm8gIT0gbnVsbCkgewogICAgICAgIGNsYXNzSW5mby5mdW5jdGlvbnMuYWRkKGZ1bmN0aW9uSW5mbyk7CiAgICAgICAgZnVuY3Rpb25JbmZvLnBhcmVudCA9IGNsYXNzSW5mbzsKICAgICAgICBmb3IgKHZhciBjbG9zdXJlSW5mbyBpbiBmdW5jdGlvbkluZm8uY2xvc3VyZXMpIHsKICAgICAgICAgIHNpemUgKz0gY2xvc3VyZUluZm8uc2l6ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwoKICAgIGNsYXNzSW5mby5zaXplID0gc2l6ZTsKCiAgICBpZiAoIWNvbXBpbGVyLmJhY2tlbmQuZW1pdHRlci5uZWVkZWRDbGFzc2VzLmNvbnRhaW5zKGNsYXp6KSAmJgogICAgICAgIGNsYXNzSW5mby5maWVsZHMuaXNFbXB0eSAmJgogICAgICAgIGNsYXNzSW5mby5mdW5jdGlvbnMuaXNFbXB0eSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICByZXN1bHQuY2xhc3Nlcy5hZGQoY2xhc3NJbmZvKTsKICAgIHJldHVybiBjbGFzc0luZm87CiAgfQoKICBDbG9zdXJlSW5mbyB2aXNpdENsb3N1cmVDbGFzcyhDbGFzc0VudGl0eSBlbGVtZW50KSB7CiAgICBDbG9zdXJlSW5mbyBjbG9zdXJlSW5mbyA9IG5ldyBDbG9zdXJlSW5mbygKICAgICAgICBuYW1lOiBlbGVtZW50Lm5hbWUsCiAgICAgICAgb3V0cHV0VW5pdDogX3VuaXRJbmZvRm9yQ2xhc3MoZWxlbWVudCksCiAgICAgICAgc2l6ZTogZHVtcEluZm9UYXNrLnNpemVPZihlbGVtZW50KSk7CiAgICBfZW50aXR5VG9JbmZvW2VsZW1lbnRdID0gY2xvc3VyZUluZm87CgogICAgRnVuY3Rpb25FbnRpdHkgY2FsbE1ldGhvZCA9IGNsb3NlZFdvcmxkLmVsZW1lbnRFbnZpcm9ubWVudAogICAgICAgIC5sb29rdXBDbGFzc01lbWJlcihlbGVtZW50LCBJZGVudGlmaWVycy5jYWxsKTsKCiAgICBGdW5jdGlvbkluZm8gZnVuY3Rpb25JbmZvID0gdmlzaXRGdW5jdGlvbihjYWxsTWV0aG9kKTsKICAgIGlmIChmdW5jdGlvbkluZm8gPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBjbG9zdXJlSW5mby5mdW5jdGlvbiA9IGZ1bmN0aW9uSW5mbzsKICAgIGZ1bmN0aW9uSW5mby5wYXJlbnQgPSBjbG9zdXJlSW5mbzsKCiAgICByZXN1bHQuY2xvc3VyZXMuYWRkKGNsb3N1cmVJbmZvKTsKICAgIHJldHVybiBjbG9zdXJlSW5mbzsKICB9CgogIEZ1bmN0aW9uSW5mbyB2aXNpdEZ1bmN0aW9uKEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uKSB7CiAgICBpbnQgc2l6ZSA9IGR1bXBJbmZvVGFzay5zaXplT2YoZnVuY3Rpb24pOwogICAgLy8gVE9ETyhzaWdtdW5kKTogY29uc2lkZXIgYWRkaW5nIGEgc21hbGwgaW5mbyB0byByZXByZXNlbnQgdW5yZWFjaGFibGUKICAgIC8vIGNvZGUgaGVyZS4KICAgIGlmIChzaXplID09IDAgJiYgIXNob3VsZEtlZXAoZnVuY3Rpb24pKSByZXR1cm4gbnVsbDsKCiAgICAvLyBUT0RPKGhldCk6IHVzZSAndG9TdHJpbmcnIGluc3RlYWQgb2YgJ3RleHQnPyBJdCB3aWxsIGFkZCAnPScgZm9yIHNldHRlcnMKICAgIFN0cmluZyBuYW1lID0gZnVuY3Rpb24ubWVtYmVyTmFtZS50ZXh0OwogICAgaW50IGtpbmQ7CiAgICBpZiAoZnVuY3Rpb24uaXNTdGF0aWMgfHwgZnVuY3Rpb24uaXNUb3BMZXZlbCkgewogICAgICBraW5kID0gRnVuY3Rpb25JbmZvLlRPUF9MRVZFTF9GVU5DVElPTl9LSU5EOwogICAgfSBlbHNlIGlmIChmdW5jdGlvbi5lbmNsb3NpbmdDbGFzcyAhPSBudWxsKSB7CiAgICAgIGtpbmQgPSBGdW5jdGlvbkluZm8uTUVUSE9EX0ZVTkNUSU9OX0tJTkQ7CiAgICB9CgogICAgaWYgKGZ1bmN0aW9uLmlzQ29uc3RydWN0b3IpIHsKICAgICAgbmFtZSA9IG5hbWUgPT0gIiIKICAgICAgICAgID8gIiR7ZnVuY3Rpb24uZW5jbG9zaW5nQ2xhc3MubmFtZX0iCiAgICAgICAgICA6ICIke2Z1bmN0aW9uLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiR7ZnVuY3Rpb24ubmFtZX0iOwogICAgICBraW5kID0gRnVuY3Rpb25JbmZvLkNPTlNUUlVDVE9SX0ZVTkNUSU9OX0tJTkQ7CiAgICB9CgogICAgYXNzZXJ0KGtpbmQgIT0gbnVsbCk7CgogICAgRnVuY3Rpb25Nb2RpZmllcnMgbW9kaWZpZXJzID0gbmV3IEZ1bmN0aW9uTW9kaWZpZXJzKAogICAgICBpc1N0YXRpYzogZnVuY3Rpb24uaXNTdGF0aWMsCiAgICAgIGlzQ29uc3Q6IGZ1bmN0aW9uLmlzQ29uc3QsCiAgICAgIGlzRmFjdG9yeTogZnVuY3Rpb24uaXNDb25zdHJ1Y3RvcgogICAgICAgICAgPyAoZnVuY3Rpb24gYXMgQ29uc3RydWN0b3JFbnRpdHkpLmlzRmFjdG9yeUNvbnN0cnVjdG9yCiAgICAgICAgICA6IGZhbHNlLAogICAgICBpc0V4dGVybmFsOiBmdW5jdGlvbi5pc0V4dGVybmFsLAogICAgKTsKICAgIExpc3Q8Q29kZVNwYW4+IGNvZGUgPSBkdW1wSW5mb1Rhc2suY29kZU9mKGZ1bmN0aW9uKTsKCiAgICBMaXN0PFBhcmFtZXRlckluZm8+IHBhcmFtZXRlcnMgPSA8UGFyYW1ldGVySW5mbz5bXTsKICAgIExpc3Q8U3RyaW5nPiBpbmZlcnJlZFBhcmFtZXRlclR5cGVzID0gPFN0cmluZz5bXTsKICAgIGNvZGVnZW5Xb3JsZEJ1aWxkZXIuZm9yRWFjaFBhcmFtZXRlckFzTG9jYWwoZnVuY3Rpb24sIChwYXJhbWV0ZXIpIHsKICAgICAgaW5mZXJyZWRQYXJhbWV0ZXJUeXBlcy5hZGQoJyR7X3Jlc3VsdE9mUGFyYW1ldGVyKHBhcmFtZXRlcil9Jyk7CiAgICB9KTsKICAgIGludCBwYXJhbWV0ZXJJbmRleCA9IDA7CiAgICBjb2RlZ2VuV29ybGRCdWlsZGVyLmZvckVhY2hQYXJhbWV0ZXIoZnVuY3Rpb24sICh0eXBlLCBuYW1lLCBfKSB7CiAgICAgIHBhcmFtZXRlcnMuYWRkKG5ldyBQYXJhbWV0ZXJJbmZvKAogICAgICAgICAgbmFtZSwgaW5mZXJyZWRQYXJhbWV0ZXJUeXBlc1twYXJhbWV0ZXJJbmRleCsrXSwgJyR0eXBlJykpOwogICAgfSk7CgogICAgdmFyIGZ1bmN0aW9uVHlwZSA9IGVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZShmdW5jdGlvbik7CiAgICBTdHJpbmcgcmV0dXJuVHlwZSA9ICcke2Z1bmN0aW9uVHlwZS5yZXR1cm5UeXBlfSc7CgogICAgU3RyaW5nIGluZmVycmVkUmV0dXJuVHlwZSA9ICcke19yZXN1bHRPZk1lbWJlcihmdW5jdGlvbikucmV0dXJuVHlwZX0nOwogICAgU3RyaW5nIHNpZGVFZmZlY3RzID0KICAgICAgICAnJHtfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cy5pbmZlcnJlZERhdGEuZ2V0U2lkZUVmZmVjdHNPZkVsZW1lbnQoZnVuY3Rpb24pfSc7CgogICAgaW50IGlubGluZWRDb3VudCA9IGR1bXBJbmZvVGFzay5pbmxpbmVDb3VudFtmdW5jdGlvbl07CiAgICBpZiAoaW5saW5lZENvdW50ID09IG51bGwpIGlubGluZWRDb3VudCA9IDA7CgogICAgRnVuY3Rpb25JbmZvIGluZm8gPSBuZXcgRnVuY3Rpb25JbmZvKAogICAgICAgIG5hbWU6IG5hbWUsCiAgICAgICAgZnVuY3Rpb25LaW5kOiBraW5kLAogICAgICAgIG1vZGlmaWVyczogbW9kaWZpZXJzLAogICAgICAgIHJldHVyblR5cGU6IHJldHVyblR5cGUsCiAgICAgICAgaW5mZXJyZWRSZXR1cm5UeXBlOiBpbmZlcnJlZFJldHVyblR5cGUsCiAgICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycywKICAgICAgICBzaWRlRWZmZWN0czogc2lkZUVmZmVjdHMsCiAgICAgICAgaW5saW5lZENvdW50OiBpbmxpbmVkQ291bnQsCiAgICAgICAgY29kZTogY29kZSwKICAgICAgICB0eXBlOiBmdW5jdGlvblR5cGUudG9TdHJpbmcoKSwKICAgICAgICBvdXRwdXRVbml0OiBfdW5pdEluZm9Gb3JNZW1iZXIoZnVuY3Rpb24pKTsKICAgIF9lbnRpdHlUb0luZm9bZnVuY3Rpb25dID0gaW5mbzsKCiAgICBpbnQgY2xvc3VyZVNpemUgPSBfYWRkQ2xvc3VyZUluZm8oaW5mbywgZnVuY3Rpb24pOwogICAgc2l6ZSArPSBjbG9zdXJlU2l6ZTsKCiAgICBpZiAoY29tcGlsZXIub3B0aW9ucy5leHBlcmltZW50Q2FsbEluc3RydW1lbnRhdGlvbikgewogICAgICAvLyBXZSB1c2UgZnVuY3Rpb24uaGFzaENvZGUgYmVjYXVzZSBpdCBpcyBnbG9iYWxseSB1bmlxdWUgYW5kIGl0IGlzCiAgICAgIC8vIGF2YWlsYWJsZSB3aGlsZSB3ZSBhcmUgZG9pbmcgY29kZWdlbi4KICAgICAgaW5mby5jb3ZlcmFnZUlkID0gJyR7ZnVuY3Rpb24uaGFzaENvZGV9JzsKICAgIH0KCiAgICBpbmZvLnNpemUgPSBzaXplOwoKICAgIHJlc3VsdC5mdW5jdGlvbnMuYWRkKGluZm8pOwogICAgcmV0dXJuIGluZm87CiAgfQoKICAvLy8gQWRkcyBjbG9zdXJlIGluZm9ybWF0aW9uIHRvIFtpbmZvXSwgdXNpbmcgYWxsIG5lc3RlZCBjbG9zdXJlcyBpbiBbbWVtYmVyXS4KICAvLy8KICAvLy8gUmV0dXJucyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgbmVzdGVkIGNsb3N1cmVzLCB0byBhZGQgdG8gdGhlIGluZm8gc2l6ZS4KICBpbnQgX2FkZENsb3N1cmVJbmZvKEluZm8gaW5mbywgTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgYXNzZXJ0KGluZm8gaXMgRnVuY3Rpb25JbmZvIHx8IGluZm8gaXMgRmllbGRJbmZvKTsKICAgIGludCBzaXplID0gMDsKICAgIExpc3Q8Q2xvc3VyZUluZm8+IG5lc3RlZENsb3N1cmVzID0gPENsb3N1cmVJbmZvPltdOwogICAgZW52aXJvbm1lbnQuZm9yRWFjaE5lc3RlZENsb3N1cmUobWVtYmVyLCAoY2xvc3VyZSkgewogICAgICBDbG9zdXJlSW5mbyBjbG9zdXJlSW5mbyA9IHZpc2l0Q2xvc3VyZUNsYXNzKGNsb3N1cmUuZW5jbG9zaW5nQ2xhc3MpOwogICAgICBpZiAoY2xvc3VyZUluZm8gIT0gbnVsbCkgewogICAgICAgIGNsb3N1cmVJbmZvLnBhcmVudCA9IGluZm87CiAgICAgICAgbmVzdGVkQ2xvc3VyZXMuYWRkKGNsb3N1cmVJbmZvKTsKICAgICAgICBzaXplICs9IGNsb3N1cmVJbmZvLnNpemU7CiAgICAgIH0KICAgIH0pOwogICAgaWYgKGluZm8gaXMgRnVuY3Rpb25JbmZvKSBpbmZvLmNsb3N1cmVzID0gbmVzdGVkQ2xvc3VyZXM7CiAgICBpZiAoaW5mbyBpcyBGaWVsZEluZm8pIGluZm8uY2xvc3VyZXMgPSBuZXN0ZWRDbG9zdXJlczsKCiAgICByZXR1cm4gc2l6ZTsKICB9CgogIE91dHB1dFVuaXRJbmZvIF9pbmZvRnJvbU91dHB1dFVuaXQoT3V0cHV0VW5pdCBvdXRwdXRVbml0KSB7CiAgICByZXR1cm4gX291dHB1dFRvSW5mby5wdXRJZkFic2VudChvdXRwdXRVbml0LCAoKSB7CiAgICAgIC8vIER1bXAtaW5mbyBjdXJyZW50bHkgb25seSB3b3JrcyB3aXRoIHRoZSBmdWxsIGVtaXR0ZXIuIElmIGFub3RoZXIKICAgICAgLy8gZW1pdHRlciBpcyB1c2VkIGl0IHdpbGwgZmFpbCBoZXJlLgogICAgICBKYXZhU2NyaXB0QmFja2VuZCBiYWNrZW5kID0gY29tcGlsZXIuYmFja2VuZDsKICAgICAgYXNzZXJ0KG91dHB1dFVuaXQubmFtZSAhPSBudWxsIHx8IG91dHB1dFVuaXQuaXNNYWluT3V0cHV0KTsKICAgICAgdmFyIGZpbGVuYW1lID0gb3V0cHV0VW5pdC5pc01haW5PdXRwdXQKICAgICAgICAgID8gY29tcGlsZXIub3B0aW9ucy5vdXRwdXRVcmkucGF0aFNlZ21lbnRzLmxhc3QKICAgICAgICAgIDogZGVmZXJyZWRQYXJ0RmlsZU5hbWUoY29tcGlsZXIub3B0aW9ucywgb3V0cHV0VW5pdC5uYW1lKTsKICAgICAgT3V0cHV0VW5pdEluZm8gaW5mbyA9IG5ldyBPdXRwdXRVbml0SW5mbyhmaWxlbmFtZSwgb3V0cHV0VW5pdC5uYW1lLAogICAgICAgICAgYmFja2VuZC5lbWl0dGVyLmVtaXR0ZXIuZ2VuZXJhdGVkU2l6ZShvdXRwdXRVbml0KSk7CiAgICAgIGluZm8uaW1wb3J0cwogICAgICAgICAgLmFkZEFsbChjbG9zZWRXb3JsZC5vdXRwdXRVbml0RGF0YS5nZXRJbXBvcnROYW1lcyhvdXRwdXRVbml0KSk7CiAgICAgIHJlc3VsdC5vdXRwdXRVbml0cy5hZGQoaW5mbyk7CiAgICAgIHJldHVybiBpbmZvOwogICAgfSk7CiAgfQoKICBPdXRwdXRVbml0SW5mbyBfdW5pdEluZm9Gb3JNZW1iZXIoTWVtYmVyRW50aXR5IGVudGl0eSkgewogICAgcmV0dXJuIF9pbmZvRnJvbU91dHB1dFVuaXQoCiAgICAgICAgY2xvc2VkV29ybGQub3V0cHV0VW5pdERhdGEub3V0cHV0VW5pdEZvck1lbWJlcihlbnRpdHkpKTsKICB9CgogIE91dHB1dFVuaXRJbmZvIF91bml0SW5mb0ZvckNsYXNzKENsYXNzRW50aXR5IGVudGl0eSkgewogICAgcmV0dXJuIF9pbmZvRnJvbU91dHB1dFVuaXQoCiAgICAgICAgY2xvc2VkV29ybGQub3V0cHV0VW5pdERhdGEub3V0cHV0VW5pdEZvckNsYXNzKGVudGl0eSkpOwogIH0KCiAgT3V0cHV0VW5pdEluZm8gX3VuaXRJbmZvRm9yQ29uc3RhbnQoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgT3V0cHV0VW5pdCBvdXRwdXRVbml0ID0KICAgICAgICBjbG9zZWRXb3JsZC5vdXRwdXRVbml0RGF0YS5vdXRwdXRVbml0Rm9yQ29uc3RhbnQoY29uc3RhbnQpOwogICAgaWYgKG91dHB1dFVuaXQgPT0gbnVsbCkgewogICAgICBhc3NlcnQoY29uc3RhbnQgaXMgSW50ZXJjZXB0b3JDb25zdGFudFZhbHVlKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gX2luZm9Gcm9tT3V0cHV0VW5pdChvdXRwdXRVbml0KTsKICB9Cn0KCmNsYXNzIFNlbGVjdGlvbiB7CiAgZmluYWwgRW50aXR5IHNlbGVjdGVkRW50aXR5OwogIGZpbmFsIE9iamVjdCByZWNlaXZlckNvbnN0cmFpbnQ7CiAgU2VsZWN0aW9uKHRoaXMuc2VsZWN0ZWRFbnRpdHksIHRoaXMucmVjZWl2ZXJDb25zdHJhaW50KTsKfQoKLy8vIEludGVyZmFjZSB1c2VkIHRvIHJlY29yZCBpbmZvcm1hdGlvbiBmcm9tIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgY29tcGlsZXIgc28KLy8vIHdlIGNhbiBlbWl0IHRoZW0gaW4gdGhlIGR1bXAtaW5mbyB0YXNrLgovLyBUT0RPKHNpZ211bmQsaGV0KTogbW92ZSBtb3JlIGZlYXR1cmVzIGhlcmUuIElkZWFsbHkgdGhlIGR1bXAtaW5mbyB0YXNrCi8vIHNob3VsZG4ndCByZWFjaCBpbnRvIGludGVybmFscyBvZiBvdGhlciBwYXJ0cyBvZiB0aGUgY29tcGlsZXIuIEZvciBleGFtcGxlLAovLyB3ZSBjdXJyZW50bHkgcmVhY2ggaW50byB0aGUgZnVsbCBlbWl0dGVyIGFuZCBhcyBhIHJlc3VsdCB3ZSBkb24ndCBzdXBwb3J0Ci8vIGR1bXAtaW5mbyB3aGVuIHVzaW5nIHRoZSBzdGFydHVwLWVtaXR0ZXIgKGlzc3VlICMyNDE5MCkuCmFic3RyYWN0IGNsYXNzIEluZm9SZXBvcnRlciB7CiAgdm9pZCByZXBvcnRJbmxpbmVkKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQsIE1lbWJlckVudGl0eSBpbmxpbmVkRnJvbSk7Cn0KCmNsYXNzIER1bXBJbmZvVGFzayBleHRlbmRzIENvbXBpbGVyVGFzayBpbXBsZW1lbnRzIEluZm9SZXBvcnRlciB7CiAgc3RhdGljIGNvbnN0IEltcGFjdFVzZUNhc2UgSU1QQUNUX1VTRSA9IGNvbnN0IEltcGFjdFVzZUNhc2UoJ0R1bXAgaW5mbycpOwogIGZpbmFsIENvbXBpbGVyIGNvbXBpbGVyOwogIGZpbmFsIGJvb2wgdXNlQmluYXJ5Rm9ybWF0OwoKICBEdW1wSW5mb1Rhc2sodGhpcy5jb21waWxlcikKICAgICAgOiB1c2VCaW5hcnlGb3JtYXQgPSBjb21waWxlci5vcHRpb25zLnVzZUR1bXBJbmZvQmluYXJ5Rm9ybWF0LAogICAgICAgIHN1cGVyKGNvbXBpbGVyLm1lYXN1cmVyKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+ICJEdW1wIEluZm8iOwoKICBFbGVtZW50SW5mb0NvbGxlY3RvciBpbmZvQ29sbGVjdG9yOwoKICAvLy8gVGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBvdXRwdXQuCiAgaW50IF9wcm9ncmFtU2l6ZTsKCiAgLy8vIERhdGEgYXNzb2NpYXRlZCB3aXRoIGphdmFzY3JpcHQgQVNUIG5vZGVzLiBUaGUgbWFwIG9ubHkgY29udGFpbnMga2V5cyBmb3IKICAvLy8gbm9kZXMgdGhhdCB3ZSBjYXJlIGFib3V0LiAgS2V5cyBhcmUgYXV0b21hdGljYWxseSBhZGRlZCB3aGVuCiAgLy8vIFtyZWdpc3RlckVudGl0eUFzdF0gaXMgY2FsbGVkLgogIGZpbmFsIE1hcDxqc0FzdC5Ob2RlLCBDb2RlU3Bhbj4gX25vZGVEYXRhID0gPGpzQXN0Lk5vZGUsIENvZGVTcGFuPnt9OwoKICAvLyBBIG1hcHBpbmcgZnJvbSBEYXJ0IEVudGl0aWVzIHRvIEphdmFzY3JpcHQgQVNUIE5vZGVzLgogIGZpbmFsIE1hcDxFbnRpdHksIExpc3Q8anNBc3QuTm9kZT4+IF9lbnRpdHlUb05vZGVzID0KICAgICAgPEVudGl0eSwgTGlzdDxqc0FzdC5Ob2RlPj57fTsKICBmaW5hbCBNYXA8Q29uc3RhbnRWYWx1ZSwganNBc3QuTm9kZT4gX2NvbnN0YW50VG9Ob2RlID0KICAgICAgPENvbnN0YW50VmFsdWUsIGpzQXN0Lk5vZGU+e307CgogIGZpbmFsIE1hcDxFbnRpdHksIGludD4gaW5saW5lQ291bnQgPSA8RW50aXR5LCBpbnQ+e307CgogIC8vIEEgbWFwcGluZyBmcm9tIGFuIGVudGl0eSB0byBhIGxpc3Qgb2YgZW50aXRpZXMgdGhhdCBhcmUKICAvLyBpbmxpbmVkIGluc2lkZSBvZiBpdC4KICBmaW5hbCBNYXA8RW50aXR5LCBMaXN0PEVudGl0eT4+IGlubGluZU1hcCA9IDxFbnRpdHksIExpc3Q8RW50aXR5Pj57fTsKCiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwgV29ybGRJbXBhY3Q+IGltcGFjdHMgPSA8TWVtYmVyRW50aXR5LCBXb3JsZEltcGFjdD57fTsKCiAgLy8vIFJlZ2lzdGVyIHRoZSBzaXplIG9mIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LgogIHZvaWQgcmVwb3J0U2l6ZShpbnQgcHJvZ3JhbVNpemUpIHsKICAgIF9wcm9ncmFtU2l6ZSA9IHByb2dyYW1TaXplOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZXBvcnRJbmxpbmVkKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQsIE1lbWJlckVudGl0eSBpbmxpbmVkRnJvbSkgewogICAgaW5saW5lQ291bnQucHV0SWZBYnNlbnQoZWxlbWVudCwgKCkgPT4gMCk7CiAgICBpbmxpbmVDb3VudFtlbGVtZW50XSArPSAxOwogICAgaW5saW5lTWFwLnB1dElmQWJzZW50KGlubGluZWRGcm9tLCAoKSA9PiBuZXcgTGlzdDxFbnRpdHk+KCkpOwogICAgaW5saW5lTWFwW2lubGluZWRGcm9tXS5hZGQoZWxlbWVudCk7CiAgfQoKICB2b2lkIHJlZ2lzdGVySW1wYWN0KE1lbWJlckVudGl0eSBtZW1iZXIsIFdvcmxkSW1wYWN0IGltcGFjdCkgewogICAgaWYgKGNvbXBpbGVyLm9wdGlvbnMuZHVtcEluZm8pIHsKICAgICAgaW1wYWN0c1ttZW1iZXJdID0gaW1wYWN0OwogICAgfQogIH0KCiAgdm9pZCB1bnJlZ2lzdGVySW1wYWN0KHZhciBpbXBhY3RTb3VyY2UpIHsKICAgIGltcGFjdHMucmVtb3ZlKGltcGFjdFNvdXJjZSk7CiAgfQoKICAvLy8gUmV0dXJucyBhbiBpdGVyYWJsZSBvZiBbU2VsZWN0aW9uXXMgdGhhdCBhcmUgdXNlZCBieSBbZW50aXR5XS4gRWFjaAogIC8vLyBbU2VsZWN0aW9uXSBjb250YWlucyBhbiBlbnRpdHkgdGhhdCBpcyB1c2VkIGFuZCB0aGUgc2VsZWN0b3IgdGhhdAogIC8vLyBzZWxlY3RlZCB0aGUgZW50aXR5LgogIEl0ZXJhYmxlPFNlbGVjdGlvbj4gZ2V0UmV0YWluaW5nKEVudGl0eSBlbnRpdHksIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgV29ybGRJbXBhY3QgaW1wYWN0ID0gaW1wYWN0c1tlbnRpdHldOwogICAgaWYgKGltcGFjdCA9PSBudWxsKSByZXR1cm4gY29uc3QgPFNlbGVjdGlvbj5bXTsKCiAgICB2YXIgc2VsZWN0aW9ucyA9IDxTZWxlY3Rpb24+W107CiAgICBjb21waWxlci5pbXBhY3RTdHJhdGVneS52aXNpdEltcGFjdCgKICAgICAgICBlbnRpdHksCiAgICAgICAgaW1wYWN0LAogICAgICAgIG5ldyBXb3JsZEltcGFjdFZpc2l0b3JJbXBsKHZpc2l0RHluYW1pY1VzZTogKGR5bmFtaWNVc2UpIHsKICAgICAgICAgIEFic3RyYWN0VmFsdWUgbWFzayA9IGR5bmFtaWNVc2UucmVjZWl2ZXJDb25zdHJhaW50OwogICAgICAgICAgc2VsZWN0aW9ucy5hZGRBbGwoY2xvc2VkV29ybGQKICAgICAgICAgICAgICAvLyBUT0RPKGhldCk6IEhhbmRsZSBgY2FsbGAgb24gYENsb3N1cmVgIHRocm91Z2gKICAgICAgICAgICAgICAvLyBgd29ybGQuaW5jbHVkZXNDbG9zdXJlQ2FsbGAuCiAgICAgICAgICAgICAgLmxvY2F0ZU1lbWJlcnMoZHluYW1pY1VzZS5zZWxlY3RvciwgbWFzaykKICAgICAgICAgICAgICAubWFwKChNZW1iZXJFbnRpdHkgZSkgPT4gbmV3IFNlbGVjdGlvbihlLCBtYXNrKSkpOwogICAgICAgIH0sIHZpc2l0U3RhdGljVXNlOiAoc3RhdGljVXNlKSB7CiAgICAgICAgICBzZWxlY3Rpb25zLmFkZChuZXcgU2VsZWN0aW9uKHN0YXRpY1VzZS5lbGVtZW50LCBudWxsKSk7CiAgICAgICAgfSksCiAgICAgICAgSU1QQUNUX1VTRSk7CiAgICByZXR1cm4gc2VsZWN0aW9uczsKICB9CgogIC8vLyBSZWdpc3RlcnMgdGhhdCBhIGphdmFzY3JpcHQgQVNUIG5vZGUgW2NvZGVdIHdhcyBwcm9kdWNlZCBieSB0aGUgZGFydAogIC8vLyBFbnRpdHkgW2VudGl0eV0uCiAgdm9pZCByZWdpc3RlckVudGl0eUFzdChFbnRpdHkgZW50aXR5LCBqc0FzdC5Ob2RlIGNvZGUsCiAgICAgIHtMaWJyYXJ5RW50aXR5IGxpYnJhcnl9KSB7CiAgICBpZiAoY29tcGlsZXIub3B0aW9ucy5kdW1wSW5mbykgewogICAgICBfZW50aXR5VG9Ob2RlcwogICAgICAgICAgLnB1dElmQWJzZW50KGVudGl0eSwgKCkgPT4gbmV3IExpc3Q8anNBc3QuTm9kZT4oKSkKICAgICAgICAgIC5hZGQoY29kZSk7CiAgICAgIF9ub2RlRGF0YVtjb2RlXSA/Pz0gdXNlQmluYXJ5Rm9ybWF0ID8gbmV3IENvZGVTcGFuKCkgOiBuZXcgX0NvZGVEYXRhKCk7CiAgICB9CiAgfQoKICB2b2lkIHJlZ2lzdGVyQ29uc3RhbnRBc3QoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwganNBc3QuTm9kZSBjb2RlKSB7CiAgICBpZiAoY29tcGlsZXIub3B0aW9ucy5kdW1wSW5mbykgewogICAgICBhc3NlcnQoX2NvbnN0YW50VG9Ob2RlW2NvbnN0YW50XSA9PSBudWxsIHx8CiAgICAgICAgICBfY29uc3RhbnRUb05vZGVbY29uc3RhbnRdID09IGNvZGUpOwogICAgICBfY29uc3RhbnRUb05vZGVbY29uc3RhbnRdID0gY29kZTsKICAgICAgX25vZGVEYXRhW2NvZGVdID8/PSB1c2VCaW5hcnlGb3JtYXQgPyBuZXcgQ29kZVNwYW4oKSA6IG5ldyBfQ29kZURhdGEoKTsKICAgIH0KICB9CgogIGJvb2wgZ2V0IHNob3VsZEVtaXRUZXh0ID0+ICF1c2VCaW5hcnlGb3JtYXQ7CiAgLy8gVE9ETyhzaWdtdW5kKTogZGVsZXRlIHRoZSBzdGFjayBvbmNlIHdlIHN0b3AgZW1pdHRpbmcgdGhlIHNvdXJjZSB0ZXh0LgogIExpc3Q8X0NvZGVEYXRhPiBfc3RhY2sgPSBbXTsKICB2b2lkIGVudGVyTm9kZShqc0FzdC5Ob2RlIG5vZGUsIGludCBzdGFydCkgewogICAgdmFyIGRhdGEgPSBfbm9kZURhdGFbbm9kZV07CiAgICBkYXRhPy5zdGFydCA9IHN0YXJ0OwoKICAgIGlmIChzaG91bGRFbWl0VGV4dCAmJiBkYXRhICE9IG51bGwpIHsKICAgICAgX3N0YWNrLmFkZChkYXRhKTsKICAgIH0KICB9CgogIHZvaWQgZW1pdChTdHJpbmcgc3RyaW5nKSB7CiAgICBpZiAoc2hvdWxkRW1pdFRleHQpIHsKICAgICAgLy8gTm90ZTogaGlzdG9yaWNhbGx5IHdlIGVtaXR0ZWQgdGhlIGZ1bGwgYm9keSBvZiBjbGFzc2VzIGFuZCBtZXRob2RzLCBzbwogICAgICAvLyBpbnN0YW5jZSBtZXRob2RzIGVuZGVkIHVwIGVtaXR0ZWQgdHdpY2UuICBPbmNlIHdlIHVzZSBhIGRpZmZlcmVudAogICAgICAvLyBlbmNvZGluZyBvZiBkdW1wIGluZm8sIHdlIGFsc28gcGxhbiB0byByZW1vdmUgdGhpcyBkdXBsaWNhdGlvbi4KICAgICAgX3N0YWNrLmZvckVhY2goKGYpID0+IGYuX3RleHQud3JpdGUoc3RyaW5nKSk7CiAgICB9CiAgfQoKICB2b2lkIGV4aXROb2RlKGpzQXN0Lk5vZGUgbm9kZSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY2xvc2luZykgewogICAgdmFyIGRhdGEgPSBfbm9kZURhdGFbbm9kZV07CiAgICBkYXRhPy5lbmQgPSBlbmQ7CiAgICBpZiAoc2hvdWxkRW1pdFRleHQgJiYgZGF0YSAhPSBudWxsKSB7CiAgICAgIHZhciBsYXN0ID0gX3N0YWNrLnJlbW92ZUxhc3QoKTsKICAgICAgYXNzZXJ0KGRhdGEgPT0gbGFzdCk7CiAgICAgIGFzc2VydChkYXRhLnN0YXJ0ID09IHN0YXJ0KTsKICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBzb3VyY2UgY29kZSB0aGF0IHdhcyBnZW5lcmF0ZWQgZm9yIGFuIGVudGl0eS4KICAvLy8gSWYgbm8gc291cmNlIGNvZGUgd2FzIHByb2R1Y2VkLCByZXR1cm4gMC4KICBpbnQgc2l6ZU9mKEVudGl0eSBlbnRpdHkpIHsKICAgIGlmIChfZW50aXR5VG9Ob2Rlcy5jb250YWluc0tleShlbnRpdHkpKSB7CiAgICAgIHJldHVybiBfZW50aXR5VG9Ob2Rlc1tlbnRpdHldLm1hcChzaXplT2ZOb2RlKS5mb2xkKDAsIChhLCBiKSA9PiBhICsgYik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gMDsKICAgIH0KICB9CgogIGludCBzaXplT2ZOb2RlKGpzQXN0Lk5vZGUgbm9kZSkgewogICAgQ29kZVNwYW4gc3BhbiA9IF9ub2RlRGF0YVtub2RlXTsKICAgIGlmIChzcGFuID09IG51bGwpIHJldHVybiAwOwogICAgcmV0dXJuIHNwYW4uZW5kIC0gc3Bhbi5zdGFydDsKICB9CgogIExpc3Q8Q29kZVNwYW4+IGNvZGVPZihNZW1iZXJFbnRpdHkgZW50aXR5KSB7CiAgICBMaXN0PGpzQXN0Lk5vZGU+IGNvZGUgPSBfZW50aXR5VG9Ob2Rlc1tlbnRpdHldOwogICAgaWYgKGNvZGUgPT0gbnVsbCkgcmV0dXJuIGNvbnN0IFtdOwogICAgcmV0dXJuIGNvZGUubWFwKChhc3QpID0+IF9ub2RlRGF0YVthc3RdKS50b0xpc3QoKTsKICB9CgogIHZvaWQgZHVtcEluZm8oSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBnbG9iYWxJbmZlcmVuY2VSZXN1bHRzKSB7CiAgICBtZWFzdXJlKCgpIHsKICAgICAgaW5mb0NvbGxlY3RvciA9IG5ldyBFbGVtZW50SW5mb0NvbGxlY3RvcigKICAgICAgICAgIGNvbXBpbGVyLCB0aGlzLCBjbG9zZWRXb3JsZCwgZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cykKICAgICAgICAuLnJ1bigpOwoKICAgICAgdmFyIGFsbEluZm8gPSBidWlsZER1bXBJbmZvRGF0YShjbG9zZWRXb3JsZCk7CiAgICAgIGlmICh1c2VCaW5hcnlGb3JtYXQpIHsKICAgICAgICBkdW1wSW5mb0JpbmFyeShhbGxJbmZvKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkdW1wSW5mb0pzb24oYWxsSW5mbyk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgdm9pZCBkdW1wSW5mb0pzb24oQWxsSW5mbyBkYXRhKSB7CiAgICBTdHJpbmdCdWZmZXIganNvbkJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIEpzb25FbmNvZGVyIGVuY29kZXIgPSBjb25zdCBKc29uRW5jb2Rlci53aXRoSW5kZW50KCcgICcpOwogICAgQ2h1bmtlZENvbnZlcnNpb25TaW5rPE9iamVjdD4gc2luayA9IGVuY29kZXIuc3RhcnRDaHVua2VkQ29udmVyc2lvbigKICAgICAgICBuZXcgU3RyaW5nQ29udmVyc2lvblNpbmsuZnJvbVN0cmluZ1NpbmsoanNvbkJ1ZmZlcikpOwogICAgc2luay5hZGQobmV3IEFsbEluZm9Kc29uQ29kZWMoaXNCYWNrd2FyZENvbXBhdGlibGU6IHRydWUpLmVuY29kZShkYXRhKSk7CiAgICBjb21waWxlci5vdXRwdXRQcm92aWRlci5jcmVhdGVPdXRwdXRTaW5rKAogICAgICAgIGNvbXBpbGVyLm9wdGlvbnMub3V0cHV0VXJpLnBhdGhTZWdtZW50cy5sYXN0LAogICAgICAgICdpbmZvLmpzb24nLAogICAgICAgIE91dHB1dFR5cGUuZHVtcEluZm8pCiAgICAgIC4uYWRkKGpzb25CdWZmZXIudG9TdHJpbmcoKSkKICAgICAgLi5jbG9zZSgpOwogICAgY29tcGlsZXIucmVwb3J0ZXIucmVwb3J0SW5mbyhOT19MT0NBVElPTl9TUEFOTkFCTEUsIE1lc3NhZ2VLaW5kLkdFTkVSSUMsIHsKICAgICAgJ3RleHQnOiAiVmlldyB0aGUgZHVtcGVkIC5pbmZvLmpzb24gZmlsZSBhdCAiCiAgICAgICAgICAiaHR0cHM6Ly9kYXJ0LWxhbmcuZ2l0aHViLmlvL2R1bXAtaW5mby12aXN1YWxpemVyIgogICAgfSk7CiAgfQoKICB2b2lkIGR1bXBJbmZvQmluYXJ5KEFsbEluZm8gZGF0YSkgewogICAgdmFyIG5hbWUgPSBjb21waWxlci5vcHRpb25zLm91dHB1dFVyaS5wYXRoU2VnbWVudHMubGFzdCArICIuaW5mby5kYXRhIjsKICAgIFNpbms8TGlzdDxpbnQ+PiBzaW5rID0gbmV3IEJpbmFyeU91dHB1dFNpbmtBZGFwdGVyKGNvbXBpbGVyLm91dHB1dFByb3ZpZGVyCiAgICAgICAgLmNyZWF0ZUJpbmFyeVNpbmsoY29tcGlsZXIub3B0aW9ucy5vdXRwdXRVcmkucmVzb2x2ZShuYW1lKSkpOwogICAgZHVtcF9pbmZvLmVuY29kZShkYXRhLCBzaW5rKTsKICAgIGNvbXBpbGVyLnJlcG9ydGVyLnJlcG9ydEluZm8oTk9fTE9DQVRJT05fU1BBTk5BQkxFLCBNZXNzYWdlS2luZC5HRU5FUklDLCB7CiAgICAgICd0ZXh0JzogIlVzZSBgcGFja2FnZTpkYXJ0MmpzX2luZm9gIHRvIHBhcnNlIGFuZCBwcm9jZXNzIHRoZSBkdW1wZWQgIgogICAgICAgICAgIi5pbmZvLmRhdGEgZmlsZS4iCiAgICB9KTsKICB9CgogIEFsbEluZm8gYnVpbGREdW1wSW5mb0RhdGEoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBTdG9wd2F0Y2ggc3RvcHdhdGNoID0gbmV3IFN0b3B3YXRjaCgpOwogICAgc3RvcHdhdGNoLnN0YXJ0KCk7CgogICAgQWxsSW5mbyByZXN1bHQgPSBpbmZvQ29sbGVjdG9yLnJlc3VsdDsKCiAgICAvLyBSZWN1cnNpdmVseSBidWlsZCBsaW5rcyB0byBmdW5jdGlvbiB1c2VzCiAgICBJdGVyYWJsZTxFbnRpdHk+IGZ1bmN0aW9uRW50aXRpZXMgPQogICAgICAgIGluZm9Db2xsZWN0b3IuX2VudGl0eVRvSW5mby5rZXlzLndoZXJlKChrKSA9PiBrIGlzIEZ1bmN0aW9uRW50aXR5KTsKICAgIGZvciAoRnVuY3Rpb25FbnRpdHkgZW50aXR5IGluIGZ1bmN0aW9uRW50aXRpZXMpIHsKICAgICAgRnVuY3Rpb25JbmZvIGluZm8gPSBpbmZvQ29sbGVjdG9yLl9lbnRpdHlUb0luZm9bZW50aXR5XTsKICAgICAgSXRlcmFibGU8U2VsZWN0aW9uPiB1c2VzID0gZ2V0UmV0YWluaW5nKGVudGl0eSwgY2xvc2VkV29ybGQpOwogICAgICAvLyBEb24ndCBib3RoZXIgcmVjb3JkaW5nIGFuIGVtcHR5IGxpc3Qgb2YgZGVwZW5kZW5jaWVzLgogICAgICBmb3IgKFNlbGVjdGlvbiBzZWxlY3Rpb24gaW4gdXNlcykgewogICAgICAgIC8vIERvbid0IHJlZ2lzdGVyIGRhcnQyanMgYnVpbHRpbiBmdW5jdGlvbnMgdGhhdCBhcmUgbm90IHJlY29yZGVkLgogICAgICAgIEluZm8gdXNlSW5mbyA9IGluZm9Db2xsZWN0b3IuX2VudGl0eVRvSW5mb1tzZWxlY3Rpb24uc2VsZWN0ZWRFbnRpdHldOwogICAgICAgIGlmICh1c2VJbmZvID09IG51bGwpIGNvbnRpbnVlOwogICAgICAgIGluZm8udXNlcy5hZGQobmV3IERlcGVuZGVuY3lJbmZvKAogICAgICAgICAgICB1c2VJbmZvLCBzZWxlY3Rpb24ucmVjZWl2ZXJDb25zdHJhaW50Py50b1N0cmluZygpKSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBSZWN1cnNpdmVseSBidWlsZCBsaW5rcyB0byBmaWVsZCB1c2VzCiAgICBJdGVyYWJsZTxFbnRpdHk+IGZpZWxkRW50aXR5ID0KICAgICAgICBpbmZvQ29sbGVjdG9yLl9lbnRpdHlUb0luZm8ua2V5cy53aGVyZSgoaykgPT4gayBpcyBGaWVsZEVudGl0eSk7CiAgICBmb3IgKEZpZWxkRW50aXR5IGVudGl0eSBpbiBmaWVsZEVudGl0eSkgewogICAgICBGaWVsZEluZm8gaW5mbyA9IGluZm9Db2xsZWN0b3IuX2VudGl0eVRvSW5mb1tlbnRpdHldOwogICAgICBJdGVyYWJsZTxTZWxlY3Rpb24+IHVzZXMgPSBnZXRSZXRhaW5pbmcoZW50aXR5LCBjbG9zZWRXb3JsZCk7CiAgICAgIC8vIERvbid0IGJvdGhlciByZWNvcmRpbmcgYW4gZW1wdHkgbGlzdCBvZiBkZXBlbmRlbmNpZXMuCiAgICAgIGZvciAoU2VsZWN0aW9uIHNlbGVjdGlvbiBpbiB1c2VzKSB7CiAgICAgICAgSW5mbyB1c2VJbmZvID0gaW5mb0NvbGxlY3Rvci5fZW50aXR5VG9JbmZvW3NlbGVjdGlvbi5zZWxlY3RlZEVudGl0eV07CiAgICAgICAgaWYgKHVzZUluZm8gPT0gbnVsbCkgY29udGludWU7CiAgICAgICAgaW5mby51c2VzLmFkZChuZXcgRGVwZW5kZW5jeUluZm8oCiAgICAgICAgICAgIHVzZUluZm8sIHNlbGVjdGlvbi5yZWNlaXZlckNvbnN0cmFpbnQ/LnRvU3RyaW5nKCkpKTsKICAgICAgfQogICAgfQoKICAgIC8vIE5vdGlmeSB0aGUgaW1wYWN0IHN0cmF0ZWd5IGltcGFjdHMgYXJlIG5vIGxvbmdlciBuZWVkZWQgZm9yIGR1bXAgaW5mby4KICAgIGNvbXBpbGVyLmltcGFjdFN0cmF0ZWd5Lm9uSW1wYWN0VXNlZChJTVBBQ1RfVVNFKTsKCiAgICAvLyBUcmFjayBkZXBlbmRlbmNpZXMgdGhhdCBjb21lIGZyb20gaW5saW5pbmcuCiAgICBmb3IgKEVudGl0eSBlbnRpdHkgaW4gaW5saW5lTWFwLmtleXMpIHsKICAgICAgQ29kZUluZm8gb3V0ZXJJbmZvID0gaW5mb0NvbGxlY3Rvci5fZW50aXR5VG9JbmZvW2VudGl0eV07CiAgICAgIGlmIChvdXRlckluZm8gPT0gbnVsbCkgY29udGludWU7CiAgICAgIGZvciAoRW50aXR5IGlubGluZWQgaW4gaW5saW5lTWFwW2VudGl0eV0pIHsKICAgICAgICBJbmZvIGlubGluZWRJbmZvID0gaW5mb0NvbGxlY3Rvci5fZW50aXR5VG9JbmZvW2lubGluZWRdOwogICAgICAgIGlmIChpbmxpbmVkSW5mbyA9PSBudWxsKSBjb250aW51ZTsKICAgICAgICBvdXRlckluZm8udXNlcy5hZGQobmV3IERlcGVuZGVuY3lJbmZvKGlubGluZWRJbmZvLCAnaW5saW5lZCcpKTsKICAgICAgfQogICAgfQoKICAgIHJlc3VsdC5kZWZlcnJlZEZpbGVzID0gY2xvc2VkV29ybGQub3V0cHV0VW5pdERhdGEKICAgICAgICAuY29tcHV0ZURlZmVycmVkTWFwKGNvbXBpbGVyLm9wdGlvbnMsIGNsb3NlZFdvcmxkLmVsZW1lbnRFbnZpcm9ubWVudCk7CiAgICBzdG9wd2F0Y2guc3RvcCgpOwoKICAgIHJlc3VsdC5wcm9ncmFtID0gbmV3IFByb2dyYW1JbmZvKAogICAgICAgIGVudHJ5cG9pbnQ6IGluZm9Db2xsZWN0b3IKICAgICAgICAgICAgLl9lbnRpdHlUb0luZm9bY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50Lm1haW5GdW5jdGlvbl0sCiAgICAgICAgc2l6ZTogX3Byb2dyYW1TaXplLAogICAgICAgIGRhcnQyanNWZXJzaW9uOgogICAgICAgICAgICBjb21waWxlci5vcHRpb25zLmhhc0J1aWxkSWQgPyBjb21waWxlci5vcHRpb25zLmJ1aWxkSWQgOiBudWxsLAogICAgICAgIGNvbXBpbGF0aW9uTW9tZW50OiBuZXcgRGF0ZVRpbWUubm93KCksCiAgICAgICAgY29tcGlsYXRpb25EdXJhdGlvbjogY29tcGlsZXIubWVhc3VyZXIuZWxhcHNlZFdhbGxDbG9jaywKICAgICAgICB0b0pzb25EdXJhdGlvbjoKICAgICAgICAgICAgbmV3IER1cmF0aW9uKG1pbGxpc2Vjb25kczogc3RvcHdhdGNoLmVsYXBzZWRNaWxsaXNlY29uZHMpLAogICAgICAgIGR1bXBJbmZvRHVyYXRpb246IG5ldyBEdXJhdGlvbihtaWxsaXNlY29uZHM6IHRoaXMudGltaW5nKSwKICAgICAgICBub1N1Y2hNZXRob2RFbmFibGVkOiBjbG9zZWRXb3JsZC5iYWNrZW5kVXNhZ2UuaXNOb1N1Y2hNZXRob2RVc2VkLAogICAgICAgIGlzUnVudGltZVR5cGVVc2VkOiBjbG9zZWRXb3JsZC5iYWNrZW5kVXNhZ2UuaXNSdW50aW1lVHlwZVVzZWQsCiAgICAgICAgaXNJc29sYXRlSW5Vc2U6IGZhbHNlLAogICAgICAgIGlzRnVuY3Rpb25BcHBseVVzZWQ6IGNsb3NlZFdvcmxkLmJhY2tlbmRVc2FnZS5pc0Z1bmN0aW9uQXBwbHlVc2VkLAogICAgICAgIGlzTWlycm9yc1VzZWQ6IGNsb3NlZFdvcmxkLmJhY2tlbmRVc2FnZS5pc01pcnJvcnNVc2VkLAogICAgICAgIG1pbmlmaWVkOiBjb21waWxlci5vcHRpb25zLmVuYWJsZU1pbmlmaWNhdGlvbik7CgogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KCi8vLyBIZWxwZXIgY2xhc3MgdG8gc3RvcmUgd2hhdCBkdW1wLWluZm8gd2lsbCBzaG93IGZvciBhIHBpZWNlIG9mIGNvZGUuCi8vIFRPRE8oc2lnbXVuZCk6IGRlbGV0ZSBvbmNlIHdlIG5vIGxvbmdlciBlbWl0IHRleHQgYnkgZGVmYXVsdC4KY2xhc3MgX0NvZGVEYXRhIGV4dGVuZHMgQ29kZVNwYW4gewogIFN0cmluZ0J1ZmZlciBfdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IHRleHQgPT4gJyRfdGV4dCc7CiAgaW50IGdldCBsZW5ndGggPT4gZW5kIC0gc3RhcnQ7Cn0Kgq0ATk48ARMBFkMBKTRGAR8cLhY4Jk1DIS4dRh48KS4kPSEnAR0bIjwjAUlPASg8TDwBSyUBDzw8LyMnGDcoIggxBAEyBkxNTCM3NgQBMDYbHQYpTx8BQkU7JDQmCiMyITEjCggIATgvHyUhCAgBNyARBAFFMQEvNAFLPj8gKCMhEwYBKzYBSCsBJBo0JxQvISFRKkIGATpHLy0GATQkAR0RBAEsJykaJi8mASs6RTskMSs7JgwKI0ohKyg4JgwKD0YICDo+Ii8pOSQKCAgBGwFDJCcTBgEjFgQBNy8cMC0qAT83ATsrKScBJhgEATguTBI5AVAsDjQzMjAGASIYLkA1BgEaATkjIShBEycHOQE4NkhGCBxFKEUIAT42AUsZVQE7MAEqFBweIDAgIiQUJzMkATcZATpKLzAGARYBIBEEAVEGTjg3Ejg5SyEjKSIICD47AREEAT42Siw0Qi05RUo+E0okEwgEATsgQQQBOSBABAFAHEQeNBMGLAQCARIfIzsCAVEsSk9NPB5IAgFCTBseAR5EIgEMIgEmASgUAVBDJUgBOzckOSUBOAE9G0gBUAExJSAEAQxJLx9CKQQBQSUgBgQBLCIEAUpIG04qNAEkKRAQQz4oPy44QSlCDBUXBAFLFzkhJRU9Fk4GBAFGJTIuKE4GBAEvTB8vIBkBKhgGBAEdGlBLSTQGBAFEIBUqJhwjBgQBTDAeLk4NEAYEASQlICIEAS80JzcEASo7ETA/EQE0HSEPHwgIBAEkMj5JPk0uNhUdIxFPND0IBAEmTE9GIk9MHQgEATgrFwErATAoTDY/RD8qS04nKkEIBgEtI0kuPEQ/Kk4nKkEIBgFONgEzLEAnMkErSAgGATZPFgEmIkkcGEsvQRhHQ0pHH0s/OAETBAIBSEEjKwwfIQIBI3BhY2thZ2U6Y29tcGlsZXIvc3JjL2R1bXBfaW5mby5kYXJ0NHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2VsZW1lbnRzL2VudGl0aWVzLmRhcnSygy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGVudGl0aWVzOwoKaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL2RhcnQyanMuZGFydCcgc2hvdyBBc3luY01vZGlmaWVyOwoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NhbGxfc3RydWN0dXJlLmRhcnQnIHNob3cgQ2FsbFN0cnVjdHVyZTsKaW1wb3J0ICcuLi91dGlsL3V0aWwuZGFydCc7CmltcG9ydCAnbmFtZXMuZGFydCc7CmltcG9ydCAndHlwZXMuZGFydCc7CgovLy8gQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBlbnRpdGllcy4KLy8vCi8vLyBJbXBsZW1lbnQgdGhpcyBkaXJlY3RseSBpZiB0aGUgZW50aXR5IGlzIG5vdCBhIERhcnQgbGFuZ3VhZ2UgZW50aXR5LgovLy8gRW50aXRpZXMgZGVmaW5lZCB3aXRoaW4gdGhlIERhcnQgbGFuZ3VhZ2Ugc2hvdWxkIGltcGxlbWVudCBbRWxlbWVudF0uCi8vLwovLy8gRm9yIGluc3RhbmNlLCB0aGUgSmF2YVNjcmlwdCBiYWNrZW5kIG5lZWQgdG8gY3JlYXRlIHN5bnRoZXRpYyB2YXJpYWJsZXMgZm9yCi8vLyBjYWxsaW5nIGludGVyY2VwdGVkIGNsYXNzZXMgYW5kIHN1Y2ggdmFyaWFibGVzIGRvIG5vdCBjb3JyZXNwb25kIHRvIGFuCi8vLyBlbnRpdHkgaW4gdGhlIERhcnQgc291cmNlIGNvZGUgbm9yIGluIHRoZSB0ZXJtaW5vbG9neSBvZiB0aGUgRGFydCBsYW5ndWFnZQovLy8gYW5kIHNob3VsZCB0aGVyZWZvcmUgaW1wbGVtZW50IFtFbnRpdHldIGRpcmVjdGx5LgphYnN0cmFjdCBjbGFzcyBFbnRpdHkgaW1wbGVtZW50cyBTcGFubmFibGUgewogIFN0cmluZyBnZXQgbmFtZTsKfQoKLy8vIFN0cmlwcGVkIGRvd24gc3VwZXIgaW50ZXJmYWNlIGZvciBsaWJyYXJ5IGxpa2UgZW50aXRpZXMuCi8vLwovLy8gQ3VycmVudGx5IG9ubHkgW0xpYnJhcnlFbGVtZW50XSBidXQgbGF0ZXIgYWxzbyBrZXJuZWwgYmFzZWQgRGFydCBjbGFzc2VzCi8vLyBhbmQvb3IgRGFydC1pbi1KUyBjbGFzc2VzLgphYnN0cmFjdCBjbGFzcyBMaWJyYXJ5RW50aXR5IGV4dGVuZHMgRW50aXR5IHsKICAvLy8gUmV0dXJuIHRoZSBjYW5vbmljYWwgdXJpIHRoYXQgaWRlbnRpZmllcyB0aGlzIGxpYnJhcnkuCiAgVXJpIGdldCBjYW5vbmljYWxVcmk7Cn0KCi8vLyBTdHJpcHBlZCBkb3duIHN1cGVyIGludGVyZmFjZSBmb3IgaW1wb3J0IGVudGl0aWVzLgovLy8KLy8vIFRoZSBbbmFtZV0gcHJvcGVydHkgY29ycmVzcG9uZHMgdG8gdGhlIHByZWZpeCBuYW1lLCBpZiBhbnkuCmNsYXNzIEltcG9ydEVudGl0eSB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIC8vLyBUaGUgY2Fub25pY2FsIFVSSSBvZiB0aGUgbGlicmFyeSB3aGVyZSB0aGlzIGltcG9ydCBvY2N1cnMKICAvLy8gKHdoZXJlIHRoZSBpbXBvcnQgaXMgZGVjbGFyZWQpLgogIGZpbmFsIFVyaSBlbmNsb3NpbmdMaWJyYXJ5VXJpOwoKICAvLy8gV2hldGhlciB0aGUgaW1wb3J0IGlzIGEgZGVmZXJyZWQgaW1wb3J0LgogIGZpbmFsIGJvb2wgaXNEZWZlcnJlZDsKCiAgLy8vIFRoZSB0YXJnZXQgaW1wb3J0IFVSSS4KICBmaW5hbCBVcmkgdXJpOwoKICBJbXBvcnRFbnRpdHkodGhpcy5pc0RlZmVycmVkLCB0aGlzLm5hbWUsIHRoaXMudXJpLCB0aGlzLmVuY2xvc2luZ0xpYnJhcnlVcmkpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnaW1wb3J0KCRuYW1lOiR7aXNEZWZlcnJlZCA/ICcgZGVmZXJyZWQnIDogJyd9KSc7Cn0KCi8vLyBTdHJpcHBlZCBkb3duIHN1cGVyIGludGVyZmFjZSBmb3IgY2xhc3MgbGlrZSBlbnRpdGllcy4KLy8vCi8vLyBDdXJyZW50bHkgb25seSBbQ2xhc3NFbGVtZW50XSBidXQgbGF0ZXIgYWxzbyBrZXJuZWwgYmFzZWQgRGFydCBjbGFzc2VzCi8vLyBhbmQvb3IgRGFydC1pbi1KUyBjbGFzc2VzLgphYnN0cmFjdCBjbGFzcyBDbGFzc0VudGl0eSBleHRlbmRzIEVudGl0eSB7CiAgLy8vIElmIHRoaXMgaXMgYSBub3JtYWwgY2xhc3MsIHRoZSBlbmNsb3NpbmcgbGlicmFyeSBmb3IgdGhpcyBjbGFzcy4gSWYgdGhpcwogIC8vLyBpcyBhIGNsb3N1cmUgY2xhc3MsIHRoZSBlbmNsb3NpbmcgY2xhc3Mgb2YgdGhlIGNsb3N1cmUgZm9yIHdoaWNoIGl0IHdhcwogIC8vLyBjcmVhdGVkLgogIExpYnJhcnlFbnRpdHkgZ2V0IGxpYnJhcnk7CgogIC8vLyBXaGV0aGVyIHRoaXMgaXMgYSBzeW50aGVzaXplZCBjbGFzcyBmb3IgYSBjbG9zdXJpemVkIG1ldGhvZCBvciBsb2NhbAogIC8vLyBmdW5jdGlvbi4KICBib29sIGdldCBpc0Nsb3N1cmU7CgogIC8vLyBXaGV0aGVyIHRoaXMgaXMgYW4gYWJzdHJhY3QgY2xhc3MuCiAgYm9vbCBnZXQgaXNBYnN0cmFjdDsKfQoKYWJzdHJhY3QgY2xhc3MgVHlwZWRlZkVudGl0eSBleHRlbmRzIEVudGl0eSB7CiAgLy8vIFRoZSBsaWJyYXJ5IGluIHdoaWNoIHRoZSB0eXBlZGVmIHdhcyBkZWNsYXJlZC4KICBMaWJyYXJ5RW50aXR5IGdldCBsaWJyYXJ5Owp9CgphYnN0cmFjdCBjbGFzcyBUeXBlVmFyaWFibGVFbnRpdHkgZXh0ZW5kcyBFbnRpdHkgewogIC8vLyBUaGUgY2xhc3Mgb3IgZ2VuZXJpYyBtZXRob2QgdGhhdCBkZWNsYXJlZCB0aGlzIHR5cGUgdmFyaWFibGUuCiAgRW50aXR5IGdldCB0eXBlRGVjbGFyYXRpb247CgogIC8vLyBUaGUgaW5kZXggb2YgdGhpcyB0eXBlIHZhcmlhYmxlIGluIHRoZSB0eXBlIHZhcmlhYmxlcyBvZiBpdHMKICAvLy8gW3R5cGVEZWNsYXJhdGlvbl0uCiAgaW50IGdldCBpbmRleDsKfQoKLy8vIFN0cmlwcGVkIGRvd24gc3VwZXIgaW50ZXJmYWNlIGZvciBtZW1iZXIgbGlrZSBlbnRpdGllcywgdGhhdCBpcywKLy8vIGNvbnN0cnVjdG9ycywgbWV0aG9kcywgZmllbGRzIGV0Yy4KLy8vCi8vLyBDdXJyZW50bHkgb25seSBbTWVtYmVyRWxlbWVudF0gYnV0IGxhdGVyIGFsc28ga2VybmVsIGJhc2VkIERhcnQgbWVtYmVycwovLy8gYW5kL29yIERhcnQtaW4tSlMgcHJvcGVydGllcy4KYWJzdHJhY3QgY2xhc3MgTWVtYmVyRW50aXR5IGV4dGVuZHMgRW50aXR5IHsKICAvLy8gVGhlIFtOYW1lXSBvZiBtZW1iZXIgd2hpY2ggdGFrZXMgcHJpdmFjeSBhbmQgZ2V0dGVyL3NldHRlciBuYW1pbmcgaW50bwogIC8vLyBhY2NvdW50LgogIE5hbWUgZ2V0IG1lbWJlck5hbWU7CgogIC8vLyBXaGV0aGVyIHRoaXMgaXMgYSBtZW1iZXIgb2YgYSBsaWJyYXJ5LgogIGJvb2wgZ2V0IGlzVG9wTGV2ZWw7CgogIC8vLyBXaGV0aGVyIHRoaXMgaXMgYSBzdGF0aWMgbWVtYmVyIG9mIGEgY2xhc3MuCiAgYm9vbCBnZXQgaXNTdGF0aWM7CgogIC8vLyBXaGV0aGVyIHRoaXMgaXMgYW4gaW5zdGFuY2UgbWVtYmVyIG9mIGEgY2xhc3MuCiAgYm9vbCBnZXQgaXNJbnN0YW5jZU1lbWJlcjsKCiAgLy8vIFdoZXRoZXIgdGhpcyBpcyBhIGNvbnN0cnVjdG9yLgogIGJvb2wgZ2V0IGlzQ29uc3RydWN0b3I7CgogIC8vLyBXaGV0aGVyIHRoaXMgaXMgYSBmaWVsZC4KICBib29sIGdldCBpc0ZpZWxkOwoKICAvLy8gV2hldGhlciB0aGlzIGlzIGEgbm9ybWFsIG1ldGhvZCAobmVpdGhlciBjb25zdHJ1Y3RvciwgZ2V0dGVyIG9yIHNldHRlcikKICAvLy8gb3Igb3BlcmF0b3IgbWV0aG9kLgogIGJvb2wgZ2V0IGlzRnVuY3Rpb247CgogIC8vLyBXaGV0aGVyIHRoaXMgaXMgYSBnZXR0ZXIuCiAgYm9vbCBnZXQgaXNHZXR0ZXI7CgogIC8vLyBXaGV0aGVyIHRoaXMgaXMgYSBzZXR0ZXIuCiAgYm9vbCBnZXQgaXNTZXR0ZXI7CgogIC8vLyBXaGV0aGVyIHRoaXMgbWVtYmVyIGlzIGFzc2lnbmFibGUsIGkuZS4gYSBub24tZmluYWwsIG5vbi1jb25zdCBmaWVsZC4KICBib29sIGdldCBpc0Fzc2lnbmFibGU7CgogIC8vLyBXaGV0aGVyIHRoaXMgbWVtYmVyIGlzIGNvbnN0YW50LCBpLmUuIGEgY29uc3RhbnQgZmllbGQgb3IgY29uc3RydWN0b3IuCiAgYm9vbCBnZXQgaXNDb25zdDsKCiAgLy8vIFdoZXRoZXIgdGhpcyBtZW1iZXIgaXMgYWJzdHJhY3QsIGkuZS4gYW4gYWJzdHJhY3QgbWV0aG9kLCBnZXR0ZXIgb3IKICAvLy8gc2V0dGVyLgogIGJvb2wgZ2V0IGlzQWJzdHJhY3Q7CgogIC8vLyBUaGUgZW5jbG9zaW5nIGNsYXNzIGlmIHRoaXMgaXMgYSBjb25zdHJ1Y3RvciwgaW5zdGFuY2UgbWVtYmVyIG9yCiAgLy8vIHN0YXRpYyBtZW1iZXIgb2YgYSBjbGFzcy4KICBDbGFzc0VudGl0eSBnZXQgZW5jbG9zaW5nQ2xhc3M7CgogIC8vLyBUaGUgZW5jbG9zaW5nIGxpYnJhcnkgaWYgdGhpcyBpcyBhIGxpYnJhcnkgbWVtYmVyLCBvdGhlcndpc2UgdGhlCiAgLy8vIGVuY2xvc2luZyBsaWJyYXJ5IG9mIHRoZSBbZW5jbG9zaW5nQ2xhc3NdLgogIExpYnJhcnlFbnRpdHkgZ2V0IGxpYnJhcnk7Cn0KCi8vLyBTdHJpcHBlZCBkb3duIHN1cGVyIGludGVyZmFjZSBmb3IgZmllbGQgbGlrZSBlbnRpdGllcy4KLy8vCi8vLyBDdXJyZW50bHkgb25seSBbRmllbGRFbGVtZW50XSBidXQgbGF0ZXIgYWxzbyBrZXJuZWwgYmFzZWQgRGFydCBmaWVsZHMKLy8vIGFuZC9vciBEYXJ0LWluLUpTIGZpZWxkLWxpa2UgcHJvcGVydGllcy4KYWJzdHJhY3QgY2xhc3MgRmllbGRFbnRpdHkgZXh0ZW5kcyBNZW1iZXJFbnRpdHkge30KCi8vLyBTdHJpcHBlZCBkb3duIHN1cGVyIGludGVyZmFjZSBmb3IgZnVuY3Rpb24gbGlrZSBlbnRpdGllcy4KLy8vCi8vLyBDdXJyZW50bHkgb25seSBbTWV0aG9kRWxlbWVudF0gYnV0IGxhdGVyIGFsc28ga2VybmVsIGJhc2VkIERhcnQgY29uc3RydWN0b3JzCi8vLyBhbmQgbWV0aG9kcyBhbmQvb3IgRGFydC1pbi1KUyBmdW5jdGlvbi1saWtlIHByb3BlcnRpZXMuCmFic3RyYWN0IGNsYXNzIEZ1bmN0aW9uRW50aXR5IGV4dGVuZHMgTWVtYmVyRW50aXR5IHsKICAvLy8gV2hldGhlciB0aGlzIGZ1bmN0aW9uIGlzIGV4dGVybmFsLCBpLmUuIHRoZSBib2R5IGlzIG5vdCBkZWZpbmVkIGluIHRlcm1zCiAgLy8vIG9mIERhcnQgY29kZS4KICBib29sIGdldCBpc0V4dGVybmFsOwoKICAvLy8gVGhlIHN0cnVjdHVyZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycy4KICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZTsKCiAgLy8vIFRoZSBzeW5jaHJvbm91cy9hc3luY2hyb25vdXMgbWFya2VyIG9uIHRoaXMgZnVuY3Rpb24uCiAgQXN5bmNNYXJrZXIgZ2V0IGFzeW5jTWFya2VyOwp9CgovLy8gRW51bSBmb3IgdGhlIHN5bmNocm9ub3VzL2FzeW5jaHJvbm91cyBmdW5jdGlvbiBib2R5IG1vZGlmaWVycy4KY2xhc3MgQXN5bmNNYXJrZXIgewogIC8vLyBUaGUgZGVmYXVsdCBmdW5jdGlvbiBib2R5IG1hcmtlci4KICBzdGF0aWMgY29uc3QgQXN5bmNNYXJrZXIgU1lOQyA9IGNvbnN0IEFzeW5jTWFya2VyLl8oQXN5bmNNb2RpZmllci5TeW5jKTsKCiAgLy8vIFRoZSBgc3luYypgIGZ1bmN0aW9uIGJvZHkgbWFya2VyLgogIHN0YXRpYyBjb25zdCBBc3luY01hcmtlciBTWU5DX1NUQVIgPQogICAgICBjb25zdCBBc3luY01hcmtlci5fKEFzeW5jTW9kaWZpZXIuU3luY1N0YXIsIGlzWWllbGRpbmc6IHRydWUpOwoKICAvLy8gVGhlIGBhc3luY2AgZnVuY3Rpb24gYm9keSBtYXJrZXIuCiAgc3RhdGljIGNvbnN0IEFzeW5jTWFya2VyIEFTWU5DID0KICAgICAgY29uc3QgQXN5bmNNYXJrZXIuXyhBc3luY01vZGlmaWVyLkFzeW5jLCBpc0FzeW5jOiB0cnVlKTsKCiAgLy8vIFRoZSBgYXN5bmMqYCBmdW5jdGlvbiBib2R5IG1hcmtlci4KICBzdGF0aWMgY29uc3QgQXN5bmNNYXJrZXIgQVNZTkNfU1RBUiA9IGNvbnN0IEFzeW5jTWFya2VyLl8oCiAgICAgIEFzeW5jTW9kaWZpZXIuQXN5bmNTdGFyLAogICAgICBpc0FzeW5jOiB0cnVlLAogICAgICBpc1lpZWxkaW5nOiB0cnVlKTsKCiAgLy8vIElzIGB0cnVlYCBpZiB0aGlzIG1hcmtlciBkZWZpbmVzIHRoZSBmdW5jdGlvbiBib2R5IHRvIGhhdmUgYW4KICAvLy8gYXN5bmNocm9ub3VzIHJlc3VsdCwgdGhhdCBpcywgZWl0aGVyIGEgW0Z1dHVyZV0gb3IgYSBbU3RyZWFtXS4KICBmaW5hbCBib29sIGlzQXN5bmM7CgogIC8vLyBJcyBgdHJ1ZWAgaWYgdGhpcyBtYXJrZXIgZGVmaW5lcyB0aGUgZnVuY3Rpb24gYm9keSB0byBoYXZlIGEgcGx1cmFsCiAgLy8vIHJlc3VsdCwgdGhhdCBpcywgZWl0aGVyIGFuIFtJdGVyYWJsZV0gb3IgYSBbU3RyZWFtXS4KICBmaW5hbCBib29sIGlzWWllbGRpbmc7CgogIGZpbmFsIEFzeW5jTW9kaWZpZXIgYXN5bmNQYXJzZXJTdGF0ZTsKCiAgY29uc3QgQXN5bmNNYXJrZXIuXyh0aGlzLmFzeW5jUGFyc2VyU3RhdGUsCiAgICAgIHt0aGlzLmlzQXN5bmM6IGZhbHNlLCB0aGlzLmlzWWllbGRpbmc6IGZhbHNlfSk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnJHtpc0FzeW5jID8gJ2FzeW5jJyA6ICdzeW5jJ30ke2lzWWllbGRpbmcgPyAnKicgOiAnJ30nOwogIH0KCiAgLy8vIENhbm9uaWNhbCBsaXN0IG9mIG1hcmtlciB2YWx1ZXMuCiAgLy8vCiAgLy8vIEFkZGVkIHRvIG1ha2UgW0FzeW5jTWFya2VyXSBlbnVtLWxpa2UuCiAgc3RhdGljIGNvbnN0IExpc3Q8QXN5bmNNYXJrZXI+IHZhbHVlcyA9IGNvbnN0IDxBc3luY01hcmtlcj5bCiAgICBTWU5DLAogICAgU1lOQ19TVEFSLAogICAgQVNZTkMsCiAgICBBU1lOQ19TVEFSCiAgXTsKCiAgLy8vIEluZGV4IHRvIHRoaXMgbWFya2VyIHdpdGhpbiBbdmFsdWVzXS4KICAvLy8KICAvLy8gQWRkZWQgdG8gbWFrZSBbQXN5bmNNYXJrZXJdIGVudW0tbGlrZS4KICBpbnQgZ2V0IGluZGV4ID0+IHZhbHVlcy5pbmRleE9mKHRoaXMpOwp9CgovLy8gU3RyaXBwZWQgZG93biBzdXBlciBpbnRlcmZhY2UgZm9yIGNvbnN0cnVjdG9yIGxpa2UgZW50aXRpZXMuCi8vLwovLy8gQ3VycmVudGx5IG9ubHkgW0NvbnN0cnVjdG9yRWxlbWVudF0gYnV0IGxhdGVyIGFsc28ga2VybmVsIGJhc2VkIERhcnQKLy8vIGNvbnN0cnVjdG9ycyBhbmQvb3IgRGFydC1pbi1KUyBjb25zdHJ1Y3Rvci1saWtlIHByb3BlcnRpZXMuCi8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSBmYWN0b3J5IGNvbnN0cnVjdG9ycyBmcm9tIHRoZSBzZXQgb2YKLy8gY29uc3RydWN0b3JzLgphYnN0cmFjdCBjbGFzcyBDb25zdHJ1Y3RvckVudGl0eSBleHRlbmRzIEZ1bmN0aW9uRW50aXR5IHsKICAvLy8gV2hldGhlciB0aGlzIGlzIGEgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvciwgcG9zc2libHkgcmVkaXJlY3RpbmcuCiAgYm9vbCBnZXQgaXNHZW5lcmF0aXZlQ29uc3RydWN0b3I7CgogIC8vLyBXaGV0aGVyIHRoaXMgaXMgYSBmYWN0b3J5IGNvbnN0cnVjdG9yLCBwb3NzaWJseSByZWRpcmVjdGluZy4KICBib29sIGdldCBpc0ZhY3RvcnlDb25zdHJ1Y3RvcjsKCiAgLy8vIFdoZXRoZXIgdGhpcyBpcyBhIGBmcm9tRW52aXJvbm1lbnRgIGNvbnN0IGNvbnN0cnVjdG9yIGluIGBpbnRgLCBgYm9vbGAgb3IKICAvLy8gYFN0cmluZ2AuCiAgYm9vbCBnZXQgaXNGcm9tRW52aXJvbm1lbnRDb25zdHJ1Y3RvcjsKfQoKLy8vIFRoZSBjb25zdHJ1Y3RvciBib2R5IGZvciBhIFtDb25zdHJ1Y3RvckVudGl0eV0uCi8vLwovLy8gVGhpcyBpcyB1c2VkIG9ubHkgaW4gdGhlIGJhY2tlbmQgdG8gc3BsaXQgZW5jb2Rpbmcgb2YgYSBEYXJ0IGNvbnN0cnVjdG9yCi8vLyBpbnRvIHR3byBKYXZhU2NyaXB0IGZ1bmN0aW9uczsgdGhlIGNvbnN0cnVjdG9yIGFuZCB0aGUgY29uc3RydWN0b3IgYm9keS4KLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMgd2hlbiBtb2RlbHggaXMgcmVtb3ZlZC4gQ29uc3RydWN0b3IgYm9kaWVzCi8vIHNob3VsZCB0aGVuIGJlIGNyZWF0ZWQgZGlyZWN0bHkgd2l0aCB0aGUgSi1tb2RlbC4KYWJzdHJhY3QgY2xhc3MgQ29uc3RydWN0b3JCb2R5RW50aXR5IGV4dGVuZHMgRnVuY3Rpb25FbnRpdHkgewogIC8vLyBUaGUgY29uc3RydWN0b3IgZm9yIHdoaWNoIHRoaXMgY29uc3RydWN0b3IgYm9keSB3YXMgY3JlYXRlZC4KICBDb25zdHJ1Y3RvckVudGl0eSBnZXQgY29uc3RydWN0b3I7Cn0KCi8vLyBBbiBlbnRpdHkgdGhhdCBkZWZpbmVzIGEgbG9jYWwgZW50aXR5IChtZW1vcnkgc2xvdCkgaW4gZ2VuZXJhdGVkIGNvZGUuCi8vLwovLy8gUGFyYW1ldGVycywgbG9jYWwgdmFyaWFibGVzIGFuZCBsb2NhbCBmdW5jdGlvbnMgKGNhbikgZGVmaW5lIGxvY2FsIGVudGl0eQovLy8gYW5kIHRodXMgaW1wbGVtZW50IFtMb2NhbF0gdGhyb3VnaCBbTG9jYWxFbGVtZW50XS4gRm9yIG5vbi1lbGVtZW50IGxvY2FscywKLy8vIGxpa2UgYHRoaXNgIGFuZCBib3hlcywgc3BlY2lhbGl6ZWQgW0xvY2FsXSBjbGFzc2VzIGFyZSBjcmVhdGVkLgovLy8KLy8vIFR5cGUgdmFyaWFibGVzIGNhbiBpbnRyb2R1Y2UgbG9jYWxzIGluIGZhY3RvcmllcyBhbmQgY29uc3RydWN0b3JzCi8vLyBidXQgc2luY2Ugb25lIHR5cGUgdmFyaWFibGUgY2FuIGludHJvZHVjZSBkaWZmZXJlbnQgbG9jYWxzIGluIGRpZmZlcmVudAovLy8gZmFjdG9yaWVzIGFuZCBjb25zdHJ1Y3RvcnMgaXQgaXMgbm90IGl0c2VsZiBhIFtMb2NhbF0gYnV0IGluc3RlYWQKLy8vIGEgbm9uLWVsZW1lbnQgW0xvY2FsXSBpcyBjcmVhdGVkIHRocm91Z2ggYSBzcGVjaWFsaXplZCBjbGFzcy4KYWJzdHJhY3QgY2xhc3MgTG9jYWwgZXh0ZW5kcyBFbnRpdHkge30KCi8vLyBUaGUgc3RydWN0dXJlIG9mIGZ1bmN0aW9uIHBhcmFtZXRlcnMuCmNsYXNzIFBhcmFtZXRlclN0cnVjdHVyZSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtQYXJhbWV0ZXJTdHJ1Y3R1cmVdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAncGFyYW1ldGVyLXN0cnVjdHVyZSc7CgogIC8vLyBUaGUgbnVtYmVyIG9mIHJlcXVpcmVkIChwb3NpdGlvbmFsKSBwYXJhbWV0ZXJzLgogIGZpbmFsIGludCByZXF1aXJlZFBhcmFtZXRlcnM7CgogIC8vLyBUaGUgbnVtYmVyIG9mIHBvc2l0aW9uYWwgcGFyYW1ldGVycy4KICBmaW5hbCBpbnQgcG9zaXRpb25hbFBhcmFtZXRlcnM7CgogIC8vLyBUaGUgbmFtZWQgcGFyYW1ldGVycyBzb3J0ZWQgYWxwaGFiZXRpY2FsbHkuCiAgZmluYWwgTGlzdDxTdHJpbmc+IG5hbWVkUGFyYW1ldGVyczsKCiAgLy8vIFRoZSBudW1iZXIgb2YgdHlwZSBwYXJhbWV0ZXJzLgogIGZpbmFsIGludCB0eXBlUGFyYW1ldGVyczsKCiAgY29uc3QgUGFyYW1ldGVyU3RydWN0dXJlKHRoaXMucmVxdWlyZWRQYXJhbWV0ZXJzLCB0aGlzLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICB0aGlzLm5hbWVkUGFyYW1ldGVycywgdGhpcy50eXBlUGFyYW1ldGVycyk7CgogIGNvbnN0IFBhcmFtZXRlclN0cnVjdHVyZS5nZXR0ZXIoKSA6IHRoaXMoMCwgMCwgY29uc3QgPFN0cmluZz5bXSwgMCk7CgogIGNvbnN0IFBhcmFtZXRlclN0cnVjdHVyZS5zZXR0ZXIoKSA6IHRoaXMoMSwgMSwgY29uc3QgPFN0cmluZz5bXSwgMCk7CgogIGZhY3RvcnkgUGFyYW1ldGVyU3RydWN0dXJlLmZyb21UeXBlKEZ1bmN0aW9uVHlwZSB0eXBlKSB7CiAgICByZXR1cm4gbmV3IFBhcmFtZXRlclN0cnVjdHVyZSgKICAgICAgICB0eXBlLnBhcmFtZXRlclR5cGVzLmxlbmd0aCwKICAgICAgICB0eXBlLnBhcmFtZXRlclR5cGVzLmxlbmd0aCArIHR5cGUub3B0aW9uYWxQYXJhbWV0ZXJUeXBlcy5sZW5ndGgsCiAgICAgICAgdHlwZS5uYW1lZFBhcmFtZXRlcnMsCiAgICAgICAgdHlwZS50eXBlVmFyaWFibGVzLmxlbmd0aCk7CiAgfQoKICAvLy8gRGVzZXJpYWxpemVzIGEgW1BhcmFtZXRlclN0cnVjdHVyZV0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBQYXJhbWV0ZXJTdHJ1Y3R1cmUucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGludCByZXF1aXJlZFBhcmFtZXRlcnMgPSBzb3VyY2UucmVhZEludCgpOwogICAgaW50IHBvc2l0aW9uYWxQYXJhbWV0ZXJzID0gc291cmNlLnJlYWRJbnQoKTsKICAgIExpc3Q8U3RyaW5nPiBuYW1lZFBhcmFtZXRlcnMgPSBzb3VyY2UucmVhZFN0cmluZ3MoKTsKICAgIGludCB0eXBlUGFyYW1ldGVycyA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IFBhcmFtZXRlclN0cnVjdHVyZShyZXF1aXJlZFBhcmFtZXRlcnMsIHBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgIG5hbWVkUGFyYW1ldGVycywgdHlwZVBhcmFtZXRlcnMpOwogIH0KCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbUGFyYW1ldGVyU3RydWN0dXJlXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUludChyZXF1aXJlZFBhcmFtZXRlcnMpOwogICAgc2luay53cml0ZUludChwb3NpdGlvbmFsUGFyYW1ldGVycyk7CiAgICBzaW5rLndyaXRlU3RyaW5ncyhuYW1lZFBhcmFtZXRlcnMpOwogICAgc2luay53cml0ZUludCh0eXBlUGFyYW1ldGVycyk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgLy8vIFRoZSBudW1iZXIgb2Ygb3B0aW9uYWwgcGFyYW1ldGVycyAocG9zaXRpb25hbCBvciBuYW1lZCkuCiAgaW50IGdldCBvcHRpb25hbFBhcmFtZXRlcnMgPT4KICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnMgLSByZXF1aXJlZFBhcmFtZXRlcnMgKyBuYW1lZFBhcmFtZXRlcnMubGVuZ3RoOwoKICAvLy8gVGhlIHRvdGFsIG51bWJlciBvZiBwYXJhbWV0ZXJzIChyZXF1aXJlZCBvciBvcHRpb25hbCkuCiAgaW50IGdldCB0b3RhbFBhcmFtZXRlcnMgPT4gcG9zaXRpb25hbFBhcmFtZXRlcnMgKyBuYW1lZFBhcmFtZXRlcnMubGVuZ3RoOwoKICAvLy8gUmV0dXJucyB0aGUgW0NhbGxTdHJ1Y3R1cmVdIGNvcnJlc3BvbmRpbmcgdG8gYSBjYWxsIHNpdGUgcGFzc2luZyBhbGwKICAvLy8gcGFyYW1ldGVycyBib3RoIHJlcXVpcmVkIGFuZCBvcHRpb25hbC4KICBDYWxsU3RydWN0dXJlIGdldCBjYWxsU3RydWN0dXJlIHsKICAgIHJldHVybiBuZXcgQ2FsbFN0cnVjdHVyZShwb3NpdGlvbmFsUGFyYW1ldGVycyArIG5hbWVkUGFyYW1ldGVycy5sZW5ndGgsCiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzLCB0eXBlUGFyYW1ldGVycyk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IEhhc2hpbmcubGlzdEhhc2goCiAgICAgIG5hbWVkUGFyYW1ldGVycywKICAgICAgSGFzaGluZy5vYmplY3RIYXNoKAogICAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgICBIYXNoaW5nLm9iamVjdEhhc2goCiAgICAgICAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJzLCBIYXNoaW5nLm9iamVjdEhhc2godHlwZVBhcmFtZXRlcnMpKSkpOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIFBhcmFtZXRlclN0cnVjdHVyZSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKHJlcXVpcmVkUGFyYW1ldGVycyAhPSBvdGhlci5yZXF1aXJlZFBhcmFtZXRlcnMgfHwKICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVycyAhPSBvdGhlci5wb3NpdGlvbmFsUGFyYW1ldGVycyB8fAogICAgICAgIHR5cGVQYXJhbWV0ZXJzICE9IG90aGVyLnR5cGVQYXJhbWV0ZXJzIHx8CiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCAhPSBvdGhlci5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZWRQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChuYW1lZFBhcmFtZXRlcnNbaV0gIT0gb3RoZXIubmFtZWRQYXJhbWV0ZXJzW2ldKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8vLyBTaG9ydCB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIHVzZSBmb3IgdGVzdGluZy4KICBTdHJpbmcgZ2V0IHNob3J0VGV4dCB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBpZiAodHlwZVBhcmFtZXRlcnMgIT0gMCkgewogICAgICBzYi53cml0ZSgnPCcpOwogICAgICBzYi53cml0ZSh0eXBlUGFyYW1ldGVycyk7CiAgICAgIHNiLndyaXRlKCc+Jyk7CiAgICB9CiAgICBzYi53cml0ZSgnKCcpOwogICAgc2Iud3JpdGUocG9zaXRpb25hbFBhcmFtZXRlcnMpOwogICAgaWYgKG5hbWVkUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7CiAgICAgIHNiLndyaXRlKCcsJyk7CiAgICAgIHNiLndyaXRlKG5hbWVkUGFyYW1ldGVycy5qb2luKCcsJykpOwogICAgfQogICAgc2Iud3JpdGUoJyknKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJ1BhcmFtZXRlclN0cnVjdHVyZSgnKTsKICAgIHNiLndyaXRlKCdyZXF1aXJlZFBhcmFtZXRlcnM9JHJlcXVpcmVkUGFyYW1ldGVycywnKTsKICAgIHNiLndyaXRlKCdwb3NpdGlvbmFsUGFyYW1ldGVycz0kcG9zaXRpb25hbFBhcmFtZXRlcnMsJyk7CiAgICBzYi53cml0ZSgnbmFtZWRQYXJhbWV0ZXJzPXske25hbWVkUGFyYW1ldGVycy5qb2luKCcsJyl9fSwnKTsKICAgIHNiLndyaXRlKCd0eXBlUGFyYW1ldGVycz0kdHlwZVBhcmFtZXRlcnMpJyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIGludCBnZXQgc2l6ZSA9PgogICAgICBwb3NpdGlvbmFsUGFyYW1ldGVycyArIHR5cGVQYXJhbWV0ZXJzICsgbmFtZWRQYXJhbWV0ZXJzLmxlbmd0aDsKfQqBhgBOTjwBEgFNARkuPRwVFQElBElKBFBLTzYtEwIBPQRNHy49GAIBNwRAFRUBQCYhAS8ZAR0RAVABDEkCATsESx8sT04PHQFLEBYBKRcCAS41HQIBM0QeAUMZEQIBRScETCItTQ8XAS0XATIVATUdASUaAR8UAU4aFwEgFQEgFQFMGQFNFAFKDhcBRyAiAUcxHQIBOwRKLTMBPgRRPDVPFBcBMC0BPB8CAUMUKEsBKCdFASgjPwEpPR8VGQFERRYBSjsZASgBLTYBDBZEBAEnBi0/Cg8LDwUBLAYtKQIBQQRJQEQROkYkAUMhAVAQKQIBNARNTU81PkMlAgFLBE5PRARGTEZCJwEqG0wdMwE2IAErIgEyJgElHAFPMgFHAUcBOyMkSR4kBAFARRcvMTkrFUwqBAE2KBUnKSgjEwQBPyBKAT1MAUstJEwqBAEMKBcaIB5JAQwcLTQ6PjJCFAY3PBYIBhEEATQZKh8VIBUGEyQmFSsGExoEAQwWKiU5PUExGgQBEkYCAStwYWNrYWdlOmNvbXBpbGVyL3NyYy9lbGVtZW50cy9lbnRpdGllcy5kYXJ0KnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2VucXVldWUuZGFydMAARsUvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmVucXVldWU7CgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbicgc2hvdyBRdWV1ZTsKCmltcG9ydCAnY29tbW9uL3Rhc2tzLmRhcnQnIHNob3cgQ29tcGlsZXJUYXNrOwppbXBvcnQgJ2NvbW1vbi93b3JrLmRhcnQnIHNob3cgV29ya0l0ZW07CmltcG9ydCAnY29tbW9uLmRhcnQnOwppbXBvcnQgJ2NvbW1vbl9lbGVtZW50cy5kYXJ0JyBzaG93IEVsZW1lbnRFbnZpcm9ubWVudDsKaW1wb3J0ICdjb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJ2NvbXBpbGVyLmRhcnQnIHNob3cgQ29tcGlsZXI7CmltcG9ydCAnb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICdlbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICdlbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICdpbmZlcnJlci90eXBlcy5kYXJ0JzsKaW1wb3J0ICdqc19iYWNrZW5kL2VucXVldWVyLmRhcnQnOwppbXBvcnQgJ3VuaXZlcnNlL21lbWJlcl91c2FnZS5kYXJ0JzsKaW1wb3J0ICd1bml2ZXJzZS9yZXNvbHV0aW9uX3dvcmxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAndW5pdmVyc2Uvd29ybGRfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICd1bml2ZXJzZS91c2UuZGFydCcKICAgIHNob3cKICAgICAgICBDb25zdGFudFVzZSwKICAgICAgICBEeW5hbWljVXNlLAogICAgICAgIFN0YXRpY1VzZSwKICAgICAgICBTdGF0aWNVc2VLaW5kLAogICAgICAgIFR5cGVVc2UsCiAgICAgICAgVHlwZVVzZUtpbmQ7CmltcG9ydCAndW5pdmVyc2Uvd29ybGRfaW1wYWN0LmRhcnQnCiAgICBzaG93IEltcGFjdFN0cmF0ZWd5LCBJbXBhY3RVc2VDYXNlLCBXb3JsZEltcGFjdCwgV29ybGRJbXBhY3RWaXNpdG9yOwppbXBvcnQgJ3V0aWwvZW51bXNldC5kYXJ0JzsKaW1wb3J0ICd1dGlsL3V0aWwuZGFydCcgc2hvdyBTZXRsZXQ7CmltcG9ydCAnd29ybGQuZGFydCcgc2hvdyBKQ2xvc2VkV29ybGQ7CgpjbGFzcyBFbnF1ZXVlVGFzayBleHRlbmRzIENvbXBpbGVyVGFzayB7CiAgUmVzb2x1dGlvbkVucXVldWVyIF9yZXNvbHV0aW9uOwogIENvZGVnZW5FbnF1ZXVlciBjb2RlZ2VuRW5xdWV1ZXJGb3JUZXN0aW5nOwogIGZpbmFsIENvbXBpbGVyIGNvbXBpbGVyOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IG5hbWUgPT4gJ0VucXVldWUnOwoKICBFbnF1ZXVlVGFzayhDb21waWxlciBjb21waWxlcikKICAgICAgOiB0aGlzLmNvbXBpbGVyID0gY29tcGlsZXIsCiAgICAgICAgc3VwZXIoY29tcGlsZXIubWVhc3VyZXIpOwoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhlIG5lZWQgZm9yIHRoaXMuCiAgYm9vbCBnZXQgaGFzUmVzb2x1dGlvbiA9PiBfcmVzb2x1dGlvbiAhPSBudWxsOwoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhlIG5lZWQgZm9yIHRoaXMuCiAgUmVzb2x1dGlvbkVucXVldWVyIGdldCByZXNvbHV0aW9uIHsKICAgIGFzc2VydCgKICAgICAgICBfcmVzb2x1dGlvbiAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwKICAgICAgICAgICAgIlJlc29sdXRpb25FbnF1ZXVlciBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQuIikpOwogICAgcmV0dXJuIF9yZXNvbHV0aW9uOwogIH0KCiAgUmVzb2x1dGlvbkVucXVldWVyIGNyZWF0ZVJlc29sdXRpb25FbnF1ZXVlcigpIHsKICAgIHJldHVybiBfcmVzb2x1dGlvbiA/Pz0gY29tcGlsZXIuYmFja2VuZAogICAgICAgIC5jcmVhdGVSZXNvbHV0aW9uRW5xdWV1ZXIodGhpcywgY29tcGlsZXIpCiAgICAgICAgICAuLm9uRW1wdHlGb3JUZXN0aW5nID0gY29tcGlsZXIub25SZXNvbHV0aW9uUXVldWVFbXB0eUZvclRlc3Rpbmc7CiAgfQoKICBFbnF1ZXVlciBjcmVhdGVDb2RlZ2VuRW5xdWV1ZXIoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBnbG9iYWxJbmZlcmVuY2VSZXN1bHRzKSB7CiAgICBFbnF1ZXVlciBlbnF1ZXVlciA9IGNvbXBpbGVyLmJhY2tlbmQuY3JlYXRlQ29kZWdlbkVucXVldWVyKAogICAgICAgIHRoaXMsIGNvbXBpbGVyLCBjbG9zZWRXb3JsZCwgZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cykKICAgICAgLi5vbkVtcHR5Rm9yVGVzdGluZyA9IGNvbXBpbGVyLm9uQ29kZWdlblF1ZXVlRW1wdHlGb3JUZXN0aW5nOwogICAgaWYgKHJldGFpbkRhdGFGb3JUZXN0aW5nKSB7CiAgICAgIGNvZGVnZW5FbnF1ZXVlckZvclRlc3RpbmcgPSBlbnF1ZXVlcjsKICAgIH0KICAgIHJldHVybiBlbnF1ZXVlcjsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIEVucXVldWVyIHsKICAvLy8gSWYgYHRydWVgIHRoZSBjaGVja2luZyBmb3IgdW5lbnF1ZXVlZCBtZW1iZXJzIGlzIHNraXBwZWQuIFRoZSBjdXJyZW50CiAgLy8vIGltcGxlbWVudGF0aW9uIHJlZ2lzdGVycyBwYXJhbWV0ZXIgdXNhZ2VzIGFzIGEgc2lkZS1lZmZlY3Qgc28gdW5pdAogIC8vLyB0ZXN0aW5nIG9mIG1lbWJlciB1c2FnZSB3ZSBuZWVkIHRvIHRlc3QgYm90aCB3aXRoIGFuZCB3aXRob3V0IHRoZQogIC8vLyBlbnF1ZXVlciBjaGVjay4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBbY2hlY2tFbnF1ZXVlckNvbnNpc3RlbmN5XSBzaG91bGQgbm90IGhhdmUKICAvLyBzaWRlLWVmZmVjdHMuCiAgc3RhdGljIGJvb2wgc2tpcEVucXVldWVyQ2hlY2tGb3JUZXN0aW5nID0gZmFsc2U7CgogIFdvcmxkQnVpbGRlciBnZXQgd29ybGRCdWlsZGVyOwoKICB2b2lkIG9wZW4oSW1wYWN0U3RyYXRlZ3kgaW1wYWN0U3RyYXRlZ3ksIEZ1bmN0aW9uRW50aXR5IG1haW5NZXRob2QsCiAgICAgIEl0ZXJhYmxlPFVyaT4gbGlicmFyaWVzKTsKICB2b2lkIGNsb3NlKCk7CgogIC8vLyBSZXR1cm5zIFs6dHJ1ZTpdIGlmIHRoaXMgZW5xdWV1ZXIgaXMgdGhlIHJlc29sdXRpb24gZW5xdWV1ZXIuCiAgYm9vbCBnZXQgaXNSZXNvbHV0aW9uUXVldWU7CgogIGJvb2wgcXVldWVJc0Nsb3NlZDsKCiAgYm9vbCBnZXQgcXVldWVJc0VtcHR5OwoKICBJbXBhY3RVc2VDYXNlIGdldCBpbXBhY3RVc2U7CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoV29ya0l0ZW0gd29yaykpOwoKICAvLy8gQXBwbHkgdGhlIFt3b3JsZEltcGFjdF0gdG8gdGhpcyBlbnF1ZXVlci4gSWYgdGhlIFtpbXBhY3RTb3VyY2VdIGlzCiAgLy8vIHByb3ZpZGVkIHRoZSBpbXBhY3Qgc3RyYXRlZ3kgd2lsbCByZW1vdmUgaXQgZnJvbSB0aGUgZWxlbWVudCBpbXBhY3QgY2FjaGUsCiAgLy8vIGlmIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQuCiAgdm9pZCBhcHBseUltcGFjdChXb3JsZEltcGFjdCB3b3JsZEltcGFjdCwge3ZhciBpbXBhY3RTb3VyY2V9KTsKICBib29sIGNoZWNrTm9FbnF1ZXVlZEludm9rZWRJbnN0YW5jZU1ldGhvZHMoCiAgICAgIEVsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQpOwoKICAvLy8gQ2hlY2sgdGhlIGVucXVldWVyIHF1ZXVlIGlzIGVtcHR5IG9yIGZhaWwgb3RoZXJ3aXNlLgogIHZvaWQgY2hlY2tRdWV1ZUlzRW1wdHkoKTsKICB2b2lkIGxvZ1N1bW1hcnkodm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpKTsKCiAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBnZXQgcHJvY2Vzc2VkRW50aXRpZXM7CgogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBnZXQgcHJvY2Vzc2VkQ2xhc3NlczsKfQoKYWJzdHJhY3QgY2xhc3MgRW5xdWV1ZXJMaXN0ZW5lciB7CiAgLy8vIENhbGxlZCB0byBpbnN0cnVjdCB0byB0aGUgYmFja2VuZCB0aGF0IFt0eXBlXSBoYXMgYmVlbiBpbnN0YW50aWF0ZWQuCiAgdm9pZCByZWdpc3Rlckluc3RhbnRpYXRlZFR5cGUoSW50ZXJmYWNlVHlwZSB0eXBlLAogICAgICB7Ym9vbCBpc0dsb2JhbDogZmFsc2UsIGJvb2wgbmF0aXZlVXNhZ2U6IGZhbHNlfSk7CgogIC8vLyBDYWxsZWQgdG8gbm90aWZ5IHRvIHRoZSBiYWNrZW5kIHRoYXQgYSBjbGFzcyBpcyBiZWluZyBpbnN0YW50aWF0ZWQuIEFueQogIC8vLyBiYWNrZW5kIHNwZWNpZmljIFtXb3JsZEltcGFjdF0gb2YgdGhpcyBpcyByZXR1cm5lZC4KICBXb3JsZEltcGFjdCByZWdpc3Rlckluc3RhbnRpYXRlZENsYXNzKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBDYWxsZWQgdG8gbm90aWZ5IHRvIHRoZSBiYWNrZW5kIHRoYXQgYSBjbGFzcyBpcyBpbXBsZW1lbnRlZCBieSBhbgogIC8vLyBpbnN0YW50aWF0ZWQgY2xhc3MuIEFueSBiYWNrZW5kIHNwZWNpZmljIFtXb3JsZEltcGFjdF0gb2YgdGhpcyBpcwogIC8vLyByZXR1cm5lZC4KICBXb3JsZEltcGFjdCByZWdpc3RlckltcGxlbWVudGVkQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIENhbGxlZCB0byByZWdpc3RlciB0aGF0IGEgc3RhdGljIGZ1bmN0aW9uIGhhcyBiZWVuIGNsb3N1cml6ZWQuIEFueSBiYWNrZW5kCiAgLy8vIHNwZWNpZmljIFtXb3JsZEltcGFjdF0gb2YgdGhpcyBpcyByZXR1cm5lZC4KICBXb3JsZEltcGFjdCByZWdpc3RlckdldE9mU3RhdGljRnVuY3Rpb24oKTsKCiAgLy8vIENhbGxlZCB0byByZWdpc3RlciB0aGF0IFtmdW5jdGlvbl0gaGFzIGJlZW4gY2xvc3VyaXplZC4gQW55IGJhY2tlbmQKICAvLy8gc3BlY2lmaWMgW1dvcmxkSW1wYWN0XSBvZiB0aGlzIGlzIHJldHVybmVkLgogIFdvcmxkSW1wYWN0IHJlZ2lzdGVyQ2xvc3VyaXplZE1lbWJlcihGdW5jdGlvbkVudGl0eSBmdW5jdGlvbik7CgogIC8vLyBDYWxsZWQgdG8gcmVnaXN0ZXIgdGhhdCBbZWxlbWVudF0gaXMgc3RhdGljYWxseSBrbm93biB0byBiZSB1c2VkLiBBbnkKICAvLy8gYmFja2VuZCBzcGVjaWZpYyBbV29ybGRJbXBhY3RdIG9mIHRoaXMgaXMgcmV0dXJuZWQuCiAgV29ybGRJbXBhY3QgcmVnaXN0ZXJVc2VkRWxlbWVudChNZW1iZXJFbnRpdHkgbWVtYmVyKTsKCiAgLy8vIENhbGxlZCB0byByZWdpc3RlciB0aGF0IFt2YWx1ZV0gaXMgc3RhdGljYWxseSBrbm93biB0byBiZSB1c2VkLiBBbnkKICAvLy8gYmFja2VuZCBzcGVjaWZpYyBbV29ybGRJbXBhY3RdIG9mIHRoaXMgaXMgcmV0dXJuZWQuCiAgV29ybGRJbXBhY3QgcmVnaXN0ZXJVc2VkQ29uc3RhbnQoQ29uc3RhbnRWYWx1ZSB2YWx1ZSk7CgogIHZvaWQgb25RdWV1ZU9wZW4oCiAgICAgIEVucXVldWVyIGVucXVldWVyLCBGdW5jdGlvbkVudGl0eSBtYWluTWV0aG9kLCBJdGVyYWJsZTxVcmk+IGxpYnJhcmllcyk7CgogIC8vLyBDYWxsZWQgd2hlbiBbZW5xdWV1ZXJdJ3MgcXVldWUgaXMgZW1wdHksIGJ1dCBiZWZvcmUgaXQgaXMgY2xvc2VkLgogIC8vLwogIC8vLyBUaGlzIGlzIHVzZWQsIGZvciBleGFtcGxlLCBieSB0aGUgSlMgYmFja2VuZCB0byBlbnF1ZXVlIGFkZGl0aW9uYWwKICAvLy8gZWxlbWVudHMgbmVlZGVkIGZvciByZWZsZWN0aW9uLiBbcmVjZW50Q2xhc3Nlc10gaXMgYSBjb2xsZWN0aW9uIG9mCiAgLy8vIGFsbCBjbGFzc2VzIHNlZW4gZm9yIHRoZSBmaXJzdCB0aW1lIGJ5IHRoZSBbZW5xdWV1ZXJdIHNpbmNlIHRoZSBsYXN0IGNhbGwKICAvLy8gdG8gW29uUXVldWVFbXB0eV0uCiAgLy8vCiAgLy8vIEEgcmV0dXJuIHZhbHVlIG9mIGB0cnVlYCBpbmRpY2F0ZXMgdGhhdCBbcmVjZW50Q2xhc3Nlc10gaGFzIGJlZW4KICAvLy8gcHJvY2Vzc2VkIGFuZCBpdHMgZWxlbWVudHMgZG8gbm90IG5lZWQgdG8gYmUgc2VlbiBpbiB0aGUgbmV4dCByb3VuZC4gV2hlbgogIC8vLyBgZmFsc2VgIGlzIHJldHVybmVkLCBbb25RdWV1ZUVtcHR5XSB3aWxsIGJlIGNhbGxlZCBhZ2FpbiBvbmNlIHRoZQogIC8vLyByZXNvbHV0aW9uIHF1ZXVlIGhhcyBkcmFpbmVkIGFuZCBbcmVjZW50Q2xhc3Nlc10gd2lsbCBiZSBhIHN1cGVyc2V0IG9mIHRoZQogIC8vLyBjdXJyZW50IHZhbHVlLgogIC8vLwogIC8vLyBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBhIGNsYXNzIGlzIG9ubHkgcHJlc2VudCBvbmNlIGluCiAgLy8vIFtyZWNlbnRDbGFzc2VzXSwgYnV0IGV2ZXJ5IGNsYXNzIHNlZW4gYnkgdGhlIFtlbnF1ZXVlcl0gd2lsbCBiZSBwcmVzZW50IGluCiAgLy8vIFtyZWNlbnRDbGFzc2VzXSBhdCBsZWFzdCBvbmNlLgogIGJvb2wgb25RdWV1ZUVtcHR5KEVucXVldWVyIGVucXVldWVyLCBJdGVyYWJsZTxDbGFzc0VudGl0eT4gcmVjZW50Q2xhc3Nlcyk7CgogIC8vLyBDYWxsZWQgd2hlbiB0byB0aGUgcXVldWUgaGFzIGJlZW4gY2xvc2VkLgogIHZvaWQgb25RdWV1ZUNsb3NlZCgpOwoKICAvLy8gQ2FsbGVkIGFmdGVyIHRoZSBxdWV1ZSBoYXMgYmVlbiBlbXB0aWVkLgogIHZvaWQgbG9nU3VtbWFyeSh2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkpOwp9CgphYnN0cmFjdCBjbGFzcyBFbnF1ZXVlckltcGwgZXh0ZW5kcyBFbnF1ZXVlciB7CiAgQ29tcGlsZXJUYXNrIGdldCB0YXNrOwogIHZvaWQgY2hlY2tDbGFzcyhDbGFzc0VudGl0eSBjbHMpOwogIHZvaWQgcHJvY2Vzc1N0YXRpY1VzZShTdGF0aWNVc2Ugc3RhdGljVXNlKTsKICB2b2lkIHByb2Nlc3NUeXBlVXNlKFR5cGVVc2UgdHlwZVVzZSk7CiAgdm9pZCBwcm9jZXNzRHluYW1pY1VzZShEeW5hbWljVXNlIGR5bmFtaWNVc2UpOwogIHZvaWQgcHJvY2Vzc0NvbnN0YW50VXNlKENvbnN0YW50VXNlIGNvbnN0YW50VXNlKTsKICBFbnF1ZXVlckxpc3RlbmVyIGdldCBsaXN0ZW5lcjsKCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogSW5pdGlhbGl6ZSBbX2ltcGFjdFN0cmF0ZWd5XSB0byBgbnVsbGAuCiAgSW1wYWN0U3RyYXRlZ3kgX2ltcGFjdFN0cmF0ZWd5ID0gY29uc3QgSW1wYWN0U3RyYXRlZ3koKTsKCiAgSW1wYWN0U3RyYXRlZ3kgZ2V0IGltcGFjdFN0cmF0ZWd5ID0+IF9pbXBhY3RTdHJhdGVneTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBvcGVuKEltcGFjdFN0cmF0ZWd5IGltcGFjdFN0cmF0ZWd5LCBGdW5jdGlvbkVudGl0eSBtYWluTWV0aG9kLAogICAgICBJdGVyYWJsZTxVcmk+IGxpYnJhcmllcykgewogICAgX2ltcGFjdFN0cmF0ZWd5ID0gaW1wYWN0U3RyYXRlZ3k7CiAgICBsaXN0ZW5lci5vblF1ZXVlT3Blbih0aGlzLCBtYWluTWV0aG9kLCBsaWJyYXJpZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjbG9zZSgpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFNldCBbX2ltcGFjdFN0cmF0ZWd5XSB0byBgbnVsbGAgYW5kIFtxdWV1ZUlzQ2xvc2VkXQogICAgLy8gdG8gYHRydWVgIGhlcmUuCiAgICBfaW1wYWN0U3RyYXRlZ3kgPSBjb25zdCBJbXBhY3RTdHJhdGVneSgpOwogICAgbGlzdGVuZXIub25RdWV1ZUNsb3NlZCgpOwogIH0KCiAgLy8vIENoZWNrIGVucXVldWVyIGNvbnNpc3RlbmN5IGFmdGVyIHRoZSBxdWV1ZSBoYXMgYmVlbiBjbG9zZWQuCiAgYm9vbCBjaGVja0VucXVldWVyQ29uc2lzdGVuY3koRWxlbWVudEVudmlyb25tZW50IGVsZW1lbnRFbnZpcm9ubWVudCkgewogICAgdGFzay5tZWFzdXJlKCgpIHsKICAgICAgLy8gUnVuIHRocm91Z2ggdGhlIGNsYXNzZXMgYW5kIHNlZSBpZiB3ZSBuZWVkIHRvIGVucXVldWUgbW9yZSBtZXRob2RzLgogICAgICBmb3IgKENsYXNzRW50aXR5IGNsYXNzRWxlbWVudAogICAgICAgICAgaW4gd29ybGRCdWlsZGVyLmRpcmVjdGx5SW5zdGFudGlhdGVkQ2xhc3NlcykgewogICAgICAgIGZvciAoQ2xhc3NFbnRpdHkgY3VycmVudENsYXNzID0gY2xhc3NFbGVtZW50OwogICAgICAgICAgICBjdXJyZW50Q2xhc3MgIT0gbnVsbDsKICAgICAgICAgICAgY3VycmVudENsYXNzID0gZWxlbWVudEVudmlyb25tZW50LmdldFN1cGVyQ2xhc3MoY3VycmVudENsYXNzKSkgewogICAgICAgICAgY2hlY2tDbGFzcyhjdXJyZW50Q2xhc3MpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn0KCi8vLyBbRW5xdWV1ZXJdIHdoaWNoIGlzIHNwZWNpZmljIHRvIHJlc29sdXRpb24uCmNsYXNzIFJlc29sdXRpb25FbnF1ZXVlciBleHRlbmRzIEVucXVldWVySW1wbCB7CiAgc3RhdGljIGNvbnN0IEltcGFjdFVzZUNhc2UgSU1QQUNUX1VTRSA9CiAgICAgIGNvbnN0IEltcGFjdFVzZUNhc2UoJ1Jlc29sdXRpb25FbnF1ZXVlcicpOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBDb21waWxlclRhc2sgdGFzazsKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBmaW5hbCBDb21waWxlck9wdGlvbnMgX29wdGlvbnM7CiAgQG92ZXJyaWRlCiAgZmluYWwgRW5xdWV1ZXJMaXN0ZW5lciBsaXN0ZW5lcjsKCiAgZmluYWwgU2V0PENsYXNzRW50aXR5PiBfcmVjZW50Q2xhc3NlcyA9IG5ldyBTZXRsZXQ8Q2xhc3NFbnRpdHk+KCk7CiAgYm9vbCBfcmVjZW50Q29uc3RhbnRzID0gZmFsc2U7CiAgZmluYWwgUmVzb2x1dGlvbkVucXVldWVyV29ybGRCdWlsZGVyIF93b3JsZEJ1aWxkZXI7CiAgZmluYWwgV29ya0l0ZW1CdWlsZGVyIF93b3JrSXRlbUJ1aWxkZXI7CiAgZmluYWwgRGlhZ25vc3RpY1JlcG9ydGVyIF9yZXBvcnRlcjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBxdWV1ZUlzQ2xvc2VkID0gZmFsc2U7CgogIFdvcmxkSW1wYWN0VmlzaXRvciBfaW1wYWN0VmlzaXRvcjsKCiAgZmluYWwgUXVldWU8V29ya0l0ZW0+IF9xdWV1ZSA9IG5ldyBRdWV1ZTxXb3JrSXRlbT4oKTsKCiAgLy8gSWYgbm90IGBudWxsYCB0aGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBxdWV1ZSBoYXMgYmVlbiBlbXB0aWVkLiBJdCBhbGxvd3MgZm9yCiAgLy8gYXBwbHlpbmcgYWRkaXRpb25hbCBpbXBhY3RzIGJlZm9yZSByZS1lbXB0eWluZyB0aGUgcXVldWUuCiAgdm9pZCBGdW5jdGlvbigpIG9uRW1wdHlGb3JUZXN0aW5nOwoKICBSZXNvbHV0aW9uRW5xdWV1ZXIodGhpcy50YXNrLCB0aGlzLl9vcHRpb25zLCB0aGlzLl9yZXBvcnRlciwgdGhpcy5saXN0ZW5lciwKICAgICAgdGhpcy5fd29ybGRCdWlsZGVyLCB0aGlzLl93b3JrSXRlbUJ1aWxkZXIsCiAgICAgIFt0aGlzLm5hbWUgPSAncmVzb2x1dGlvbiBlbnF1ZXVlciddKSB7CiAgICBfaW1wYWN0VmlzaXRvciA9IG5ldyBFbnF1ZXVlckltcGxJbXBhY3RWaXNpdG9yKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgUmVzb2x1dGlvbldvcmxkQnVpbGRlciBnZXQgd29ybGRCdWlsZGVyID0+IF93b3JsZEJ1aWxkZXI7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IHF1ZXVlSXNFbXB0eSA9PiBfcXVldWUuaXNFbXB0eTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBjaGVja1F1ZXVlSXNFbXB0eSgpIHsKICAgIGlmIChfcXVldWUuaXNOb3RFbXB0eSkgewogICAgICBmYWlsZWRBdChfcXVldWUuZmlyc3QuZWxlbWVudCwgIiRuYW1lIHF1ZXVlIGlzIG5vdCBlbXB0eS4iKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBnZXQgcHJvY2Vzc2VkQ2xhc3NlcyA9PiBfd29ybGRCdWlsZGVyLnByb2Nlc3NlZENsYXNzZXM7CgogIEBvdmVycmlkZQogIHZvaWQgYXBwbHlJbXBhY3QoV29ybGRJbXBhY3Qgd29ybGRJbXBhY3QsIHt2YXIgaW1wYWN0U291cmNlfSkgewogICAgaWYgKHdvcmxkSW1wYWN0LmlzRW1wdHkpIHJldHVybjsKICAgIGltcGFjdFN0cmF0ZWd5LnZpc2l0SW1wYWN0KAogICAgICAgIGltcGFjdFNvdXJjZSwgd29ybGRJbXBhY3QsIF9pbXBhY3RWaXNpdG9yLCBpbXBhY3RVc2UpOwogIH0KCiAgdm9pZCBfcmVnaXN0ZXJJbnN0YW50aWF0ZWRUeXBlKEludGVyZmFjZVR5cGUgdHlwZSwKICAgICAge0NvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yLAogICAgICBib29sIG5hdGl2ZVVzYWdlOiBmYWxzZSwKICAgICAgYm9vbCBnbG9iYWxEZXBlbmRlbmN5OiBmYWxzZSwKICAgICAgYm9vbCBpc1JlZGlyZWN0aW9uOiBmYWxzZX0pIHsKICAgIHRhc2subWVhc3VyZSgoKSB7CiAgICAgIF93b3JsZEJ1aWxkZXIucmVnaXN0ZXJUeXBlSW5zdGFudGlhdGlvbih0eXBlLCBfYXBwbHlDbGFzc1VzZSwKICAgICAgICAgIGNvbnN0cnVjdG9yOiBjb25zdHJ1Y3RvciwgaXNSZWRpcmVjdGlvbjogaXNSZWRpcmVjdGlvbik7CiAgICAgIGxpc3RlbmVyLnJlZ2lzdGVySW5zdGFudGlhdGVkVHlwZSh0eXBlLAogICAgICAgICAgaXNHbG9iYWw6IGdsb2JhbERlcGVuZGVuY3ksIG5hdGl2ZVVzYWdlOiBuYXRpdmVVc2FnZSk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY2hlY2tOb0VucXVldWVkSW52b2tlZEluc3RhbmNlTWV0aG9kcygKICAgICAgRWxlbWVudEVudmlyb25tZW50IGVsZW1lbnRFbnZpcm9ubWVudCkgewogICAgaWYgKEVucXVldWVyLnNraXBFbnF1ZXVlckNoZWNrRm9yVGVzdGluZykgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gY2hlY2tFbnF1ZXVlckNvbnNpc3RlbmN5KGVsZW1lbnRFbnZpcm9ubWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNoZWNrQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICBfd29ybGRCdWlsZGVyLnByb2Nlc3NDbGFzc01lbWJlcnMoY2xzLAogICAgICAgIChNZW1iZXJFbnRpdHkgbWVtYmVyLCBFbnVtU2V0PE1lbWJlclVzZT4gdXNlU2V0KSB7CiAgICAgIGlmICh1c2VTZXQuaXNOb3RFbXB0eSkgewogICAgICAgIF9yZXBvcnRlci5pbnRlcm5hbEVycm9yKG1lbWJlciwKICAgICAgICAgICAgJ1VuZW5xdWV1ZWQgdXNlIG9mICRtZW1iZXI6ICR7dXNlU2V0Lml0ZXJhYmxlKE1lbWJlclVzZS52YWx1ZXMpfScpOwogICAgICB9CiAgICB9LCBkcnlSdW46IHRydWUpOwogIH0KCiAgLy8vIENhbGxiYWNrIGZvciBhcHBseWluZyB0aGUgdXNlIG9mIGEgW21lbWJlcl0uCiAgdm9pZCBfYXBwbHlNZW1iZXJVc2UoRW50aXR5IG1lbWJlciwgRW51bVNldDxNZW1iZXJVc2U+IHVzZVNldCkgewogICAgaWYgKHVzZVNldC5jb250YWlucyhNZW1iZXJVc2UuTk9STUFMKSkgewogICAgICBfYWRkVG9Xb3JrTGlzdChtZW1iZXIpOwogICAgfQogICAgaWYgKHVzZVNldC5jb250YWlucyhNZW1iZXJVc2UuQ0xPU1VSSVpFX0lOU1RBTkNFKSkgewogICAgICBfcmVnaXN0ZXJDbG9zdXJpemVkTWVtYmVyKG1lbWJlcik7CiAgICB9CiAgICBpZiAodXNlU2V0LmNvbnRhaW5zKE1lbWJlclVzZS5DTE9TVVJJWkVfU1RBVElDKSkgewogICAgICBhcHBseUltcGFjdChsaXN0ZW5lci5yZWdpc3RlckdldE9mU3RhdGljRnVuY3Rpb24oKSwKICAgICAgICAgIGltcGFjdFNvdXJjZTogJ2dldCBvZiBzdGF0aWMgZnVuY3Rpb24nKTsKICAgIH0KICB9CgogIC8vLyBDYWxsYmFjayBmb3IgYXBwbHlpbmcgdGhlIHVzZSBvZiBhIFtjbHNdLgogIHZvaWQgX2FwcGx5Q2xhc3NVc2UoQ2xhc3NFbnRpdHkgY2xzLCBFbnVtU2V0PENsYXNzVXNlPiB1c2VTZXQpIHsKICAgIGlmICh1c2VTZXQuY29udGFpbnMoQ2xhc3NVc2UuSU5TVEFOVElBVEVEKSkgewogICAgICBfcmVjZW50Q2xhc3Nlcy5hZGQoY2xzKTsKICAgICAgX3dvcmxkQnVpbGRlci5wcm9jZXNzQ2xhc3NNZW1iZXJzKGNscywgX2FwcGx5TWVtYmVyVXNlKTsKICAgICAgLy8gV2Ugb25seSB0ZWxsIHRoZSBiYWNrZW5kIG9uY2UgdGhhdCBbY2xzXSB3YXMgaW5zdGFudGlhdGVkLCBzbwogICAgICAvLyBhbnkgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgbXVzdCBiZSB0cmVhdGVkIGFzIGdsb2JhbAogICAgICAvLyBkZXBlbmRlbmNpZXMuCiAgICAgIGFwcGx5SW1wYWN0KGxpc3RlbmVyLnJlZ2lzdGVySW5zdGFudGlhdGVkQ2xhc3MoY2xzKSwKICAgICAgICAgIGltcGFjdFNvdXJjZTogJ2luc3RhbnRpYXRlZCBjbGFzcycpOwogICAgfQogICAgaWYgKHVzZVNldC5jb250YWlucyhDbGFzc1VzZS5JTVBMRU1FTlRFRCkpIHsKICAgICAgYXBwbHlJbXBhY3QobGlzdGVuZXIucmVnaXN0ZXJJbXBsZW1lbnRlZENsYXNzKGNscyksCiAgICAgICAgICBpbXBhY3RTb3VyY2U6ICdpbXBsZW1lbnRlZCBjbGFzcycpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcm9jZXNzRHluYW1pY1VzZShEeW5hbWljVXNlIGR5bmFtaWNVc2UpIHsKICAgIHRhc2subWVhc3VyZSgoKSB7CiAgICAgIF93b3JsZEJ1aWxkZXIucmVnaXN0ZXJEeW5hbWljVXNlKGR5bmFtaWNVc2UsIF9hcHBseU1lbWJlclVzZSk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJvY2Vzc0NvbnN0YW50VXNlKENvbnN0YW50VXNlIGNvbnN0YW50VXNlKSB7CiAgICB0YXNrLm1lYXN1cmUoKCkgewogICAgICBpZiAoX3dvcmxkQnVpbGRlci5yZWdpc3RlckNvbnN0YW50VXNlKGNvbnN0YW50VXNlKSkgewogICAgICAgIGFwcGx5SW1wYWN0KGxpc3RlbmVyLnJlZ2lzdGVyVXNlZENvbnN0YW50KGNvbnN0YW50VXNlLnZhbHVlKSwKICAgICAgICAgICAgaW1wYWN0U291cmNlOiAnY29uc3RhbnQgdXNlJyk7CiAgICAgICAgX3JlY2VudENvbnN0YW50cyA9IHRydWU7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcm9jZXNzU3RhdGljVXNlKFN0YXRpY1VzZSBzdGF0aWNVc2UpIHsKICAgIF93b3JsZEJ1aWxkZXIucmVnaXN0ZXJTdGF0aWNVc2Uoc3RhdGljVXNlLCBfYXBwbHlNZW1iZXJVc2UpOwogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQWRkIGBSZXNvbHV0aW9uV29ybGRCdWlsZGVyLnJlZ2lzdGVyQ29uc3RydWN0b3JVc2VgCiAgICAvLyBmb3IgdGhlc2U6CiAgICBzd2l0Y2ggKHN0YXRpY1VzZS5raW5kKSB7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5DT05TVFJVQ1RPUl9JTlZPS0U6CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5DT05TVF9DT05TVFJVQ1RPUl9JTlZPS0U6CiAgICAgICAgX3JlZ2lzdGVySW5zdGFudGlhdGVkVHlwZShzdGF0aWNVc2UudHlwZSwKICAgICAgICAgICAgY29uc3RydWN0b3I6IHN0YXRpY1VzZS5lbGVtZW50LCBnbG9iYWxEZXBlbmRlbmN5OiBmYWxzZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5SRURJUkVDVElPTjoKICAgICAgICBfcmVnaXN0ZXJJbnN0YW50aWF0ZWRUeXBlKHN0YXRpY1VzZS50eXBlLAogICAgICAgICAgICBjb25zdHJ1Y3Rvcjogc3RhdGljVXNlLmVsZW1lbnQsCiAgICAgICAgICAgIGdsb2JhbERlcGVuZGVuY3k6IGZhbHNlLAogICAgICAgICAgICBpc1JlZGlyZWN0aW9uOiB0cnVlKTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBicmVhazsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJvY2Vzc1R5cGVVc2UoVHlwZVVzZSB0eXBlVXNlKSB7CiAgICBEYXJ0VHlwZSB0eXBlID0gdHlwZVVzZS50eXBlOwogICAgc3dpdGNoICh0eXBlVXNlLmtpbmQpIHsKICAgICAgY2FzZSBUeXBlVXNlS2luZC5JTlNUQU5USUFUSU9OOgogICAgICBjYXNlIFR5cGVVc2VLaW5kLkNPTlNUX0lOU1RBTlRJQVRJT046CiAgICAgICAgX3JlZ2lzdGVySW5zdGFudGlhdGVkVHlwZSh0eXBlLCBnbG9iYWxEZXBlbmRlbmN5OiBmYWxzZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuTkFUSVZFX0lOU1RBTlRJQVRJT046CiAgICAgICAgX3JlZ2lzdGVySW5zdGFudGlhdGVkVHlwZSh0eXBlLAogICAgICAgICAgICBuYXRpdmVVc2FnZTogdHJ1ZSwgZ2xvYmFsRGVwZW5kZW5jeTogdHJ1ZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuSVNfQ0hFQ0s6CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuQ0FUQ0hfVFlQRToKICAgICAgICBfcmVnaXN0ZXJJc0NoZWNrKHR5cGUpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFR5cGVVc2VLaW5kLkFTX0NBU1Q6CiAgICAgICAgaWYgKCFfb3B0aW9ucy5vbWl0QXNDYXN0cykgewogICAgICAgICAgX3JlZ2lzdGVySXNDaGVjayh0eXBlKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuSU1QTElDSVRfQ0FTVDoKICAgICAgICBpZiAoX29wdGlvbnMuaW1wbGljaXREb3duY2FzdENoZWNrUG9saWN5LmlzRW1pdHRlZCkgewogICAgICAgICAgX3JlZ2lzdGVySXNDaGVjayh0eXBlKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuUEFSQU1FVEVSX0NIRUNLOgogICAgICAgIGlmIChfb3B0aW9ucy5wYXJhbWV0ZXJDaGVja1BvbGljeS5pc0VtaXR0ZWQpIHsKICAgICAgICAgIF9yZWdpc3RlcklzQ2hlY2sodHlwZSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFR5cGVVc2VLaW5kLlRZUEVfTElURVJBTDoKICAgICAgICBpZiAodHlwZSBpcyBUeXBlVmFyaWFibGVUeXBlKSB7CiAgICAgICAgICBfd29ybGRCdWlsZGVyLnJlZ2lzdGVyVHlwZVZhcmlhYmxlVHlwZUxpdGVyYWwodHlwZSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFR5cGVVc2VLaW5kLlJUSV9WQUxVRToKICAgICAgY2FzZSBUeXBlVXNlS2luZC5UWVBFX0FSR1VNRU5UOgogICAgICAgIGZhaWxlZEF0KENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsICJVbmV4cGVjdGVkIHR5cGUgdXNlOiAkdHlwZVVzZS4iKTsKICAgICAgICBicmVhazsKICAgIH0KICB9CgogIHZvaWQgX3JlZ2lzdGVySXNDaGVjayhEYXJ0VHlwZSB0eXBlKSB7CiAgICBfd29ybGRCdWlsZGVyLnJlZ2lzdGVySXNDaGVjayh0eXBlKTsKICB9CgogIHZvaWQgX3JlZ2lzdGVyQ2xvc3VyaXplZE1lbWJlcihNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgYXNzZXJ0KGVsZW1lbnQuaXNJbnN0YW5jZU1lbWJlcik7CiAgICBhcHBseUltcGFjdChsaXN0ZW5lci5yZWdpc3RlckNsb3N1cml6ZWRNZW1iZXIoZWxlbWVudCksCiAgICAgICAgaW1wYWN0U291cmNlOiAnY2xvc3VyaXplZCBtZW1iZXInKTsKICAgIF93b3JsZEJ1aWxkZXIucmVnaXN0ZXJDbG9zdXJpemVkTWVtYmVyKGVsZW1lbnQpOwogIH0KCiAgdm9pZCBfZm9yRWFjaCh2b2lkIGYoV29ya0l0ZW0gd29yaykpIHsKICAgIGRvIHsKICAgICAgd2hpbGUgKF9xdWV1ZS5pc05vdEVtcHR5KSB7CiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogRmluZCBhbiBvcHRpbWFsIHByb2Nlc3Mgb3JkZXIuCiAgICAgICAgV29ya0l0ZW0gd29yayA9IF9xdWV1ZS5yZW1vdmVMYXN0KCk7CiAgICAgICAgaWYgKCFfd29ybGRCdWlsZGVyLmlzTWVtYmVyUHJvY2Vzc2VkKHdvcmsuZWxlbWVudCkpIHsKICAgICAgICAgIGYod29yayk7CiAgICAgICAgICBfd29ybGRCdWlsZGVyLnJlZ2lzdGVyUHJvY2Vzc2VkTWVtYmVyKHdvcmsuZWxlbWVudCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIExpc3Q8Q2xhc3NFbnRpdHk+IHJlY2VudHMgPSBfcmVjZW50Q2xhc3Nlcy50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICAgICAgX3JlY2VudENsYXNzZXMuY2xlYXIoKTsKICAgICAgX3JlY2VudENvbnN0YW50cyA9IGZhbHNlOwogICAgICBpZiAoIV9vblF1ZXVlRW1wdHkocmVjZW50cykpIHsKICAgICAgICBfcmVjZW50Q2xhc3Nlcy5hZGRBbGwocmVjZW50cyk7CiAgICAgIH0KICAgIH0gd2hpbGUgKAogICAgICAgIF9xdWV1ZS5pc05vdEVtcHR5IHx8IF9yZWNlbnRDbGFzc2VzLmlzTm90RW1wdHkgfHwgX3JlY2VudENvbnN0YW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2godm9pZCBmKFdvcmtJdGVtIHdvcmspKSB7CiAgICBfZm9yRWFjaChmKTsKICAgIGlmIChvbkVtcHR5Rm9yVGVzdGluZyAhPSBudWxsKSB7CiAgICAgIG9uRW1wdHlGb3JUZXN0aW5nKCk7CiAgICAgIF9mb3JFYWNoKGYpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBsb2dTdW1tYXJ5KHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSkgewogICAgbG9nKCdSZXNvbHZlZCAke3Byb2Nlc3NlZEVudGl0aWVzLmxlbmd0aH0gZWxlbWVudHMuJyk7CiAgICBsaXN0ZW5lci5sb2dTdW1tYXJ5KGxvZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnRW5xdWV1ZXIoJG5hbWUpJzsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBnZXQgcHJvY2Vzc2VkRW50aXRpZXMgPT4KICAgICAgX3dvcmxkQnVpbGRlci5wcm9jZXNzZWRNZW1iZXJzOwoKICBAb3ZlcnJpZGUKICBJbXBhY3RVc2VDYXNlIGdldCBpbXBhY3RVc2UgPT4gSU1QQUNUX1VTRTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNSZXNvbHV0aW9uUXVldWUgPT4gdHJ1ZTsKCiAgLy8vIFJlZ2lzdGVycyBbZW50aXR5XSBhcyBwcm9jZXNzZWQgYnkgdGhlIHJlc29sdXRpb24gZW5xdWV1ZXIuIFVzZWQgb25seSBmb3IKICAvLy8gdGVzdGluZy4KICB2b2lkIHJlZ2lzdGVyUHJvY2Vzc2VkRWxlbWVudEludGVybmFsKE1lbWJlckVudGl0eSBlbnRpdHkpIHsKICAgIF93b3JsZEJ1aWxkZXIucmVnaXN0ZXJQcm9jZXNzZWRNZW1iZXIoZW50aXR5KTsKICB9CgogIC8vLyBDcmVhdGUgYSBbV29ya0l0ZW1dIGZvciBbZW50aXR5XSBhbmQgYWRkIGl0IHRvIHRoZSB3b3JrIGxpc3QgaWYgaXQgaGFzIG5vdAogIC8vLyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkLgogIHZvaWQgX2FkZFRvV29ya0xpc3QoTWVtYmVyRW50aXR5IGVudGl0eSkgewogICAgaWYgKF93b3JsZEJ1aWxkZXIuaXNNZW1iZXJQcm9jZXNzZWQoZW50aXR5KSkgcmV0dXJuOwogICAgV29ya0l0ZW0gd29ya0l0ZW0gPSBfd29ya0l0ZW1CdWlsZGVyLmNyZWF0ZVdvcmtJdGVtKGVudGl0eSk7CiAgICBpZiAod29ya0l0ZW0gPT0gbnVsbCkgcmV0dXJuOwoKICAgIGlmIChxdWV1ZUlzQ2xvc2VkKSB7CiAgICAgIGZhaWxlZEF0KAogICAgICAgICAgZW50aXR5LCAiUmVzb2x1dGlvbiB3b3JrIGxpc3QgaXMgY2xvc2VkLiBUcnlpbmcgdG8gYWRkICRlbnRpdHkuIik7CiAgICB9CgogICAgYXBwbHlJbXBhY3QobGlzdGVuZXIucmVnaXN0ZXJVc2VkRWxlbWVudChlbnRpdHkpLAogICAgICAgIGltcGFjdFNvdXJjZTogJ3VzZWQgZWxlbWVudCcpOwogICAgX3dvcmxkQnVpbGRlci5yZWdpc3RlclVzZWRFbGVtZW50KGVudGl0eSk7CiAgICBfcXVldWUuYWRkKHdvcmtJdGVtKTsKICB9CgogIC8vLyBbX29uUXVldWVFbXB0eV0gaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBxdWV1ZSBpcyBkcmFpbmVkLiBbcmVjZW50Q2xhc3Nlc10KICAvLy8gY29udGFpbnMgdGhlIHNldCBvZiBhbGwgY2xhc3NlcyBzZWVuIGZvciB0aGUgZmlyc3QgdGltZSBzaW5jZQogIC8vLyBbX29uUXVldWVFbXB0eV0gd2FzIGNhbGxlZCBsYXN0LiBBIHJldHVybiB2YWx1ZSBvZiBbdHJ1ZV0gaW5kaWNhdGVzIHRoYXQKICAvLy8gdGhlIFtyZWNlbnRDbGFzc2VzXSBoYXZlIGJlZW4gcHJvY2Vzc2VkIGFuZCBtYXkgYmUgY2xlYXJlZC4gSWYgW2ZhbHNlXSBpcwogIC8vLyByZXR1cm5lZCwgW19vblF1ZXVlRW1wdHldIHdpbGwgYmUgY2FsbGVkIG9uY2UgdGhlIHF1ZXVlIGlzIGVtcHR5IGFnYWluIChvcgogIC8vLyBzdGlsbCBlbXB0eSkgYW5kIFtyZWNlbnRDbGFzc2VzXSB3aWxsIGJlIGEgc3VwZXJzZXQgb2YgdGhlIGN1cnJlbnQgdmFsdWUuCiAgYm9vbCBfb25RdWV1ZUVtcHR5KEl0ZXJhYmxlPENsYXNzRW50aXR5PiByZWNlbnRDbGFzc2VzKSB7CiAgICByZXR1cm4gbGlzdGVuZXIub25RdWV1ZUVtcHR5KHRoaXMsIHJlY2VudENsYXNzZXMpOwogIH0KfQoKY2xhc3MgRW5xdWV1ZXJJbXBsSW1wYWN0VmlzaXRvciBpbXBsZW1lbnRzIFdvcmxkSW1wYWN0VmlzaXRvciB7CiAgZmluYWwgRW5xdWV1ZXJJbXBsIGVucXVldWVyOwoKICBFbnF1ZXVlckltcGxJbXBhY3RWaXNpdG9yKHRoaXMuZW5xdWV1ZXIpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RHluYW1pY1VzZShEeW5hbWljVXNlIGR5bmFtaWNVc2UpIHsKICAgIGVucXVldWVyLnByb2Nlc3NEeW5hbWljVXNlKGR5bmFtaWNVc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN0YXRpY1VzZShTdGF0aWNVc2Ugc3RhdGljVXNlKSB7CiAgICBlbnF1ZXVlci5wcm9jZXNzU3RhdGljVXNlKHN0YXRpY1VzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZVVzZShUeXBlVXNlIHR5cGVVc2UpIHsKICAgIGVucXVldWVyLnByb2Nlc3NUeXBlVXNlKHR5cGVVc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbnN0YW50VXNlKENvbnN0YW50VXNlIGNvbnN0YW50VXNlKSB7CiAgICBlbnF1ZXVlci5wcm9jZXNzQ29uc3RhbnRVc2UoY29uc3RhbnRVc2UpOwogIH0KfQoKLy8vIEludGVyZmFjZSBmb3IgY3JlYXRpbmcgd29yayBpdGVtcyBmb3IgZW5xdWV1ZWQgbWVtYmVyIGVudGl0aWVzLgphYnN0cmFjdCBjbGFzcyBXb3JrSXRlbUJ1aWxkZXIgewogIFdvcmtJdGVtIGNyZWF0ZVdvcmtJdGVtKGNvdmFyaWFudCBNZW1iZXJFbnRpdHkgZW50aXR5KTsKfQqCKQBOTjwBGQElAS4pFjcgJhchHh4jJTEmGwkVFBMXERUkSRwlJwEpIi0bAQwgASEiIgE0MQE0JgwdKD4YBAEyLDJLBAE7O0A9RCAsBhUEAgEaTElIFkUTMwEhAUYgEAFEHgEWARkBHwEnAUlRIUEuLgE7HC0BMAEuAgEiSzQ4AU46OgFISBA5AVEyLQFKMkEBTDo4AUo6OQEUTgFIBklJUBkGR1BIURUGQVElTQEwGAEvLQIBLxkkLigxNCEBQjsBOAEMRiEmNwQBDBFQFy4eBAFCSRZNJDk2Ik0kCggIEQQCATAwKjEBDBsVIgwjAUUhNiomAQweASUBOAFRPyUBTjEtOgQBDDwBDCsBDB0dQwYEAQxQAQxCJSA/BAE1Jh8kJBZEQy5BCAQBDC4vOzkEAQwlKzsfKFAIFgQBM0MtHgY5KQY3OjMGBAEwQzIfP0c/FzsvBjE6LgYEAQwyFkUIBAEMNRY8RishCAgEAQwvQVASHi0zMkYPJjIsJSIPDw8GBAEMKSIcJixCDy0oOA8hIyAPICUiCg8mPiIKDyg3IgoPJSg/Cg8iJk8PBgQBKSkEATkmPCw1BAEpCSI/LT4TPwoISh4gJSgIDk0EAQwoESUbEwYEAQwuOx4EAQwqAQwyJgEMLQEMJgFQDz8zBAFRHi05QSIBGRBNBgE2Jy8aBAFPRE9QUVA8NwQCAUAfASwBDDAsBAEMLSoEAQwnJgQBDDMuBAIBRCE6AgEhcGFja2FnZTpjb21waWxlci9zcmMvZW5xdWV1ZS5kYXJ0NHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2Zyb250ZW5kX3N0cmF0ZWd5LmRhcnSWGy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuZnJvbnRlbmRfc3RyYXRlZ3k7CgppbXBvcnQgJ2NvbW1vbi9iYWNrZW5kX2FwaS5kYXJ0JzsKaW1wb3J0ICdjb21tb24uZGFydCc7CmltcG9ydCAnY29tbW9uX2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJ2NvbXBpbGVyLmRhcnQnIHNob3cgQ29tcGlsZXI7CmltcG9ydCAnZGVmZXJyZWRfbG9hZC5kYXJ0JyBzaG93IERlZmVycmVkTG9hZFRhc2s7CmltcG9ydCAnZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnZW5xdWV1ZS5kYXJ0JzsKaW1wb3J0ICdqc19iYWNrZW5kL2Fubm90YXRpb25zLmRhcnQnOwppbXBvcnQgJ2pzX2JhY2tlbmQvZmllbGRfYW5hbHlzaXMuZGFydCcgc2hvdyBLRmllbGRBbmFseXNpczsKaW1wb3J0ICdqc19iYWNrZW5kL2JhY2tlbmRfdXNhZ2UuZGFydCc7CmltcG9ydCAnanNfYmFja2VuZC9pbnRlcmNlcHRvcl9kYXRhLmRhcnQnOwppbXBvcnQgJ2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydCc7CmltcG9ydCAnanNfYmFja2VuZC9ub19zdWNoX21ldGhvZF9yZWdpc3RyeS5kYXJ0JzsKaW1wb3J0ICdqc19iYWNrZW5kL3J1bnRpbWVfdHlwZXMuZGFydCc7CmltcG9ydCAna2VybmVsL2xvYWRlci5kYXJ0JzsKaW1wb3J0ICduYXRpdmUvZW5xdWV1ZS5kYXJ0JyBzaG93IE5hdGl2ZVJlc29sdXRpb25FbnF1ZXVlcjsKaW1wb3J0ICduYXRpdmUvcmVzb2x2ZXIuZGFydCc7CmltcG9ydCAndW5pdmVyc2UvY2xhc3NfaGllcmFyY2h5LmRhcnQnOwppbXBvcnQgJ3VuaXZlcnNlL3Jlc29sdXRpb25fd29ybGRfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICd1bml2ZXJzZS93b3JsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3VuaXZlcnNlL3dvcmxkX2ltcGFjdC5kYXJ0JzsKCi8vLyBTdHJhdGVneSBwYXR0ZXJuIHRoYXQgZGVmaW5lcyB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBpbnB1dCBmb3JtYXQgYW5kCi8vLyB0aGUgcmVzb2x2ZWQgZWxlbWVudCBtb2RlbC4KYWJzdHJhY3QgY2xhc3MgRnJvbnRlbmRTdHJhdGVneSB7CiAgLy8vIFJlZ2lzdGVycyBhIHNldCBvZiBsb2FkZWQgbGlicmFyaWVzIHdpdGggdGhpcyBzdHJhdGVneS4KICB2b2lkIHJlZ2lzdGVyTG9hZGVkTGlicmFyaWVzKEtlcm5lbFJlc3VsdCByZXN1bHQpOwoKICAvLy8gUmV0dXJucyB0aGUgW0VsZW1lbnRFbnZpcm9ubWVudF0gZm9yIHRoZSBlbGVtZW50IG1vZGVsIHVzZWQgaW4gdGhpcwogIC8vLyBzdHJhdGVneS4KICBFbGVtZW50RW52aXJvbm1lbnQgZ2V0IGVsZW1lbnRFbnZpcm9ubWVudDsKCiAgLy8vIFJldHVybnMgdGhlIFtDb21tb25FbGVtZW50c10gZm9yIHRoZSBlbGVtZW50IG1vZGVsIHVzZWQgaW4gdGhpcwogIC8vLyBzdHJhdGVneS4KICBDb21tb25FbGVtZW50cyBnZXQgY29tbW9uRWxlbWVudHM7CgogIC8vLyBSZXR1cm5zIHRoZSBbRGFydFR5cGVzXSBmb3IgdGhlIGVsZW1lbnQgbW9kZWwgdXNlZCBpbiB0aGlzIHN0cmF0ZWd5LgogIERhcnRUeXBlcyBnZXQgZGFydFR5cGVzOwoKICAvLy8gUmV0dXJucyB0aGUgW0Fubm90YXRpb25Qcm9jZXNzb3JdIGZvciB0aGlzIHN0cmF0ZWd5LgogIEFubm90YXRpb25Qcm9jZXNzb3IgZ2V0IGFubm90YXRpb25Qcm9jZXNzb3I7CgogIE5hdGl2ZUJhc2ljRGF0YSBnZXQgbmF0aXZlQmFzaWNEYXRhOwoKICAvLy8gQ3JlYXRlcyBhIFtEZWZlcnJlZExvYWRUYXNrXSBmb3IgdGhlIGVsZW1lbnQgbW9kZWwgdXNlZCBpbiB0aGlzIHN0cmF0ZWd5LgogIERlZmVycmVkTG9hZFRhc2sgY3JlYXRlRGVmZXJyZWRMb2FkVGFzayhDb21waWxlciBjb21waWxlcik7CgogIC8vLyBDcmVhdGVzIHRoZSBbTmF0aXZlQ2xhc3NGaW5kZXJdIGZvciB0aGlzIHN0cmF0ZWd5LgogIE5hdGl2ZUNsYXNzRmluZGVyIGNyZWF0ZU5hdGl2ZUNsYXNzRmluZGVyKE5hdGl2ZUJhc2ljRGF0YSBuYXRpdmVCYXNpY0RhdGEpOwoKICAvLy8gQ3JlYXRlcyB0aGUgW05vU3VjaE1ldGhvZFJlc29sdmVyXSBjb3JyZXNwb25kaW5nIHRoZSByZXNvbHZlZCBtb2RlbCBvZgogIC8vLyB0aGlzIHN0cmF0ZWd5LgogIE5vU3VjaE1ldGhvZFJlc29sdmVyIGNyZWF0ZU5vU3VjaE1ldGhvZFJlc29sdmVyKCk7CgogIC8vLyBSZXR1cm5zIHRoZSBbUnVudGltZVR5cGVzTmVlZEJ1aWxkZXJdIHVzZWQgYnkgdGhpcyBmcm9udGVuZCBzdHJhdGVneS4KICBSdW50aW1lVHlwZXNOZWVkQnVpbGRlciBnZXQgcnVudGltZVR5cGVzTmVlZEJ1aWxkZXJGb3JUZXN0aW5nOwoKICAvLy8gQ3JlYXRlcyB0aGUgW1Jlc29sdXRpb25Xb3JsZEJ1aWxkZXJdIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQgbW9kZWwKICAvLy8gdXNlZCBpbiB0aGlzIHN0cmF0ZWd5LgogIFJlc29sdXRpb25Xb3JsZEJ1aWxkZXIgY3JlYXRlUmVzb2x1dGlvbldvcmxkQnVpbGRlcigKICAgICAgTmF0aXZlQmFzaWNEYXRhIG5hdGl2ZUJhc2ljRGF0YSwKICAgICAgTmF0aXZlRGF0YUJ1aWxkZXIgbmF0aXZlRGF0YUJ1aWxkZXIsCiAgICAgIEludGVyY2VwdG9yRGF0YUJ1aWxkZXIgaW50ZXJjZXB0b3JEYXRhQnVpbGRlciwKICAgICAgQmFja2VuZFVzYWdlQnVpbGRlciBiYWNrZW5kVXNhZ2VCdWlsZGVyLAogICAgICBSdW50aW1lVHlwZXNOZWVkQnVpbGRlciBydGlOZWVkQnVpbGRlciwKICAgICAgS0ZpZWxkQW5hbHlzaXMgYWxsb2NhdG9yQW5hbHlzaXMsCiAgICAgIE5hdGl2ZVJlc29sdXRpb25FbnF1ZXVlciBuYXRpdmVSZXNvbHV0aW9uRW5xdWV1ZXIsCiAgICAgIE5vU3VjaE1ldGhvZFJlZ2lzdHJ5IG5vU3VjaE1ldGhvZFJlZ2lzdHJ5LAogICAgICBBbm5vdGF0aW9uc0RhdGFCdWlsZGVyIGFubm90YXRpb25zRGF0YUJ1aWxkZXIsCiAgICAgIFNlbGVjdG9yQ29uc3RyYWludHNTdHJhdGVneSBzZWxlY3RvckNvbnN0cmFpbnRzU3RyYXRlZ3ksCiAgICAgIENsYXNzSGllcmFyY2h5QnVpbGRlciBjbGFzc0hpZXJhcmNoeUJ1aWxkZXIsCiAgICAgIENsYXNzUXVlcmllcyBjbGFzc1F1ZXJpZXMpOwoKICAvLy8gQ3JlYXRlcyB0aGUgW1dvcmtJdGVtQnVpbGRlcl0gY29ycmVzcG9uZGluZyB0byBob3cgYSByZXNvbHZlZCBtb2RlbCBmb3IKICAvLy8gYSBzaW5nbGUgbWVtYmVyIGlzIG9idGFpbmVkIGluIHRoaXMgc3RyYXRlZ3kuCiAgV29ya0l0ZW1CdWlsZGVyIGNyZWF0ZVJlc29sdXRpb25Xb3JrSXRlbUJ1aWxkZXIoCiAgICAgIE5hdGl2ZUJhc2ljRGF0YSBuYXRpdmVCYXNpY0RhdGEsCiAgICAgIE5hdGl2ZURhdGFCdWlsZGVyIG5hdGl2ZURhdGFCdWlsZGVyLAogICAgICBBbm5vdGF0aW9uc0RhdGFCdWlsZGVyIGFubm90YXRpb25zRGF0YUJ1aWxkZXIsCiAgICAgIEltcGFjdFRyYW5zZm9ybWVyIGltcGFjdFRyYW5zZm9ybWVyLAogICAgICBNYXA8RW50aXR5LCBXb3JsZEltcGFjdD4gaW1wYWN0Q2FjaGUsCiAgICAgIEtGaWVsZEFuYWx5c2lzIGZpZWxkQW5hbHlzaXMpOwoKICAvLy8gQ29tcHV0ZXMgdGhlIG1haW4gZnVuY3Rpb24gZnJvbSBbbWFpbkxpYnJhcnldIGFkZGluZyBhZGRpdGlvbmFsIHdvcmxkCiAgLy8vIGltcGFjdCB0byBbaW1wYWN0QnVpbGRlcl0uCiAgRnVuY3Rpb25FbnRpdHkgY29tcHV0ZU1haW4oV29ybGRJbXBhY3RCdWlsZGVyIGltcGFjdEJ1aWxkZXIpOwoKICAvLy8gQ3JlYXRlcyB0aGUgW1J1bnRpbWVUeXBlc05lZWRCdWlsZGVyXSBmb3IgdGhpcyBzdHJhdGVneS4KICBSdW50aW1lVHlwZXNOZWVkQnVpbGRlciBjcmVhdGVSdW50aW1lVHlwZXNOZWVkQnVpbGRlcigpOwoKICAvLy8gQ3JlYXRlcyB0aGUgW0NsYXNzUXVlcmllc10gZm9yIHRoaXMgc3RyYXRlZ3kuCiAgQ2xhc3NRdWVyaWVzIGNyZWF0ZUNsYXNzUXVlcmllcygpOwoKICAvLy8gQ3JlYXRlcyBhIFtTb3VyY2VTcGFuXSBmcm9tIFtzcGFubmFibGVdIGluIGNvbnRleHQgb2YgW2N1cnJlbnRFbGVtZW50XS4KICBTb3VyY2VTcGFuIHNwYW5Gcm9tU3Bhbm5hYmxlKFNwYW5uYWJsZSBzcGFubmFibGUsIEVudGl0eSBjdXJyZW50RWxlbWVudCk7Cn0KCi8vLyBDbGFzcyB0aGF0IHBlcmZvcm1zIHRoZSBtZWNoYW5pY3MgdG8gaW52ZXN0aWdhdGUgYW5ub3RhdGlvbnMgaW4gdGhlIGNvZGUuCmFic3RyYWN0IGNsYXNzIEFubm90YXRpb25Qcm9jZXNzb3IgewogIHZvaWQgZXh0cmFjdE5hdGl2ZUFubm90YXRpb25zKExpYnJhcnlFbnRpdHkgbGlicmFyeSk7CgogIHZvaWQgZXh0cmFjdEpzSW50ZXJvcEFubm90YXRpb25zKExpYnJhcnlFbnRpdHkgbGlicmFyeSk7CgogIHZvaWQgcHJvY2Vzc0pzSW50ZXJvcEFubm90YXRpb25zKAogICAgICBOYXRpdmVCYXNpY0RhdGEgbmF0aXZlQmFzaWNEYXRhLCBOYXRpdmVEYXRhQnVpbGRlciBuYXRpdmVEYXRhQnVpbGRlcik7Cn0KCmFic3RyYWN0IGNsYXNzIEZyb250ZW5kU3RyYXRlZ3lCYXNlIGltcGxlbWVudHMgRnJvbnRlbmRTdHJhdGVneSB7CiAgZmluYWwgTmF0aXZlQmFzaWNEYXRhQnVpbGRlckltcGwgbmF0aXZlQmFzaWNEYXRhQnVpbGRlciA9CiAgICAgIG5ldyBOYXRpdmVCYXNpY0RhdGFCdWlsZGVySW1wbCgpOwogIE5hdGl2ZUJhc2ljRGF0YSBfbmF0aXZlQmFzaWNEYXRhOwoKICBAb3ZlcnJpZGUKICBOYXRpdmVCYXNpY0RhdGEgZ2V0IG5hdGl2ZUJhc2ljRGF0YSB7CiAgICBpZiAoX25hdGl2ZUJhc2ljRGF0YSA9PSBudWxsKSB7CiAgICAgIF9uYXRpdmVCYXNpY0RhdGEgPSBuYXRpdmVCYXNpY0RhdGFCdWlsZGVyLmNsb3NlKGVsZW1lbnRFbnZpcm9ubWVudCk7CiAgICAgIGFzc2VydCgKICAgICAgICAgIF9uYXRpdmVCYXNpY0RhdGEgIT0gbnVsbCwKICAgICAgICAgIGZhaWxlZEF0KE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwKICAgICAgICAgICAgICAiTmF0aXZlQmFzaWNEYXRhIGhhcyBub3QgYmVlbiBjb21wdXRlZCB5ZXQuIikpOwogICAgfQogICAgcmV0dXJuIF9uYXRpdmVCYXNpY0RhdGE7CiAgfQp9CgovLy8gQ2xhc3MgdGhhdCBkZWxldGVzIHRoZSBjb250ZW50cyBvZiBhbiBbV29ybGRJbXBhY3RdIGNhY2hlLgovLyBUT0RPKHJlZGVtcHRpb24pOiB0aGlzIGNhbiBiZSBkZWxldGVkIHdoZW4gd2Ugc3Vuc2V0IHRoZSBvbGQgZnJvbnQgZW5kLgphYnN0cmFjdCBjbGFzcyBJbXBhY3RDYWNoZURlbGV0ZXIgewogIC8vLyBSZW1vdmVzIHRoZSBbV29ybGRJbXBhY3RdIGZvciBbZWxlbWVudF0gZnJvbSB0aGUgcmVzb2x1dGlvbiBjYWNoZS4gTGF0ZXIKICAvLy8gY2FsbHMgdG8gW2dldFdvcmxkSW1wYWN0XSBvciBbY29tcHV0ZVdvcmxkSW1wYWN0XSByZXR1cm5zIGFuIGVtcHR5IGltcGFjdC4KICB2b2lkIHVuY2FjaGVXb3JsZEltcGFjdChFbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZW1vdmVzIHRoZSBbV29ybGRJbXBhY3RdcyBmb3IgYWxsIFtFbGVtZW50XXMgaW4gdGhlIHJlc29sdXRpb24gY2FjaGUuICwKICAvLy8gTGF0ZXIgY2FsbHMgdG8gW2dldFdvcmxkSW1wYWN0XSBvciBbY29tcHV0ZVdvcmxkSW1wYWN0XSByZXR1cm5zIGFuIGVtcHR5CiAgLy8vIGltcGFjdC4KICB2b2lkIGVtcHR5Q2FjaGUoKTsKfQqAkgBOTjwBIwEiFh8mMyEeFyY9KCsmMigdPB8oMSYlAU4gIj41AUoQLQFGECUBSxsBOy8BJwFQPgE5TgFNFTUBTEEBTh03Jys1Ly4oOTE1PzMiAU40MycrNSssJQFMIUABPzsBNCUBTkwCAU4lOAE7ASRNAgFCPCgkAQwoJEsOJCo+Bh0EAgE/SyRPUSsBT08OFQIBK3BhY2thZ2U6Y29tcGlsZXIvc3JjL2Zyb250ZW5kX3N0cmF0ZWd5LmRhcnRBc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnTAAFiHLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5hYnN0cmFjdF92YWx1ZV9kb21haW47CgppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCcgc2hvdyBDb25zdGFudFZhbHVlLCBQcmltaXRpdmVDb25zdGFudFZhbHVlOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL25hbWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnIHNob3cgRGFydFR5cGU7CmltcG9ydCAnLi4vc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3dvcmxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vd29ybGQuZGFydCc7CgovLy8gRW51bS1saWtlIHZhbHVlcyB1c2VkIGZvciByZXBvcnRpbmcga25vd24gYW5kIHVua25vd24gdHJ1dGggdmFsdWVzLgpjbGFzcyBBYnN0cmFjdEJvb2wgewogIGZpbmFsIGJvb2wgX3ZhbHVlOwoKICBjb25zdCBBYnN0cmFjdEJvb2wuXyh0aGlzLl92YWx1ZSk7CgogIGJvb2wgZ2V0IGlzRGVmaW5pdGVseVRydWUgPT4gX3ZhbHVlID09IHRydWU7CgogIGJvb2wgZ2V0IGlzUG90ZW50aWFsbHlUcnVlID0+IF92YWx1ZSAhPSBmYWxzZTsKCiAgYm9vbCBnZXQgaXNEZWZpbml0ZWx5RmFsc2UgPT4gX3ZhbHVlID09IGZhbHNlOwoKICBib29sIGdldCBpc1BvdGVudGlhbGx5RmFsc2UgPT4gX3ZhbHVlICE9IHRydWU7CgogIC8vLyBBIHZhbHVlIG9mIGBBYnN0cmFjdC5UcnVlYCBpcyB1c2VkIHdoZW4gdGhlIHByb3BlcnR5IGlzIGtub3duIF9hbHdheXNfIHRvCiAgLy8vIGJlIHRydWUuCiAgc3RhdGljIGNvbnN0IEFic3RyYWN0Qm9vbCBUcnVlID0gY29uc3QgQWJzdHJhY3RCb29sLl8odHJ1ZSk7CgogIC8vLyBBIHZhbHVlIG9mIGBBYnN0cmFjdC5GYWxzZWAgaXMgdXNlZCB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBrbm93biBfbmV2ZXJfIHRvCiAgLy8vIGJlIHRydWUuCiAgc3RhdGljIGNvbnN0IEFic3RyYWN0Qm9vbCBGYWxzZSA9IGNvbnN0IEFic3RyYWN0Qm9vbC5fKGZhbHNlKTsKCiAgLy8vIEEgdmFsdWUgb2YgYEFic3RyYWN0Lk1heWJlYCBpcyB1c2VkIHdoZW4gdGhlIHByb3BlcnR5IG1pZ2h0IG9yIG1pZ2h0IG5vdAogIC8vLyBiZSB0cnVlLgogIHN0YXRpYyBjb25zdCBBYnN0cmFjdEJvb2wgTWF5YmUgPSBjb25zdCBBYnN0cmFjdEJvb2wuXyhudWxsKTsKCiAgc3RhdGljIEFic3RyYWN0Qm9vbCB0cnVlT3JNYXliZShib29sIHZhbHVlKSA9PiB2YWx1ZSA/IFRydWUgOiBNYXliZTsKCiAgc3RhdGljIEFic3RyYWN0Qm9vbCB0cnVlT3JGYWxzZShib29sIHZhbHVlKSA9PiB2YWx1ZSA/IFRydWUgOiBGYWxzZTsKCiAgc3RhdGljIEFic3RyYWN0Qm9vbCBtYXliZU9yRmFsc2UoYm9vbCB2YWx1ZSkgPT4gdmFsdWUgPyBNYXliZSA6IEZhbHNlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PgogICAgICAnQWJzdHJhY3RCb29sLiR7X3ZhbHVlID09IG51bGwgPyAnTWF5YmUnIDogKF92YWx1ZSA/ICdUcnVlJyA6ICdGYWxzZScpfSc7Cn0KCi8vLyBTdHJhdGVneSBmb3IgdGhlIGFic3RyYWN0aW9uIG9mIHJ1bnRpbWUgdmFsdWVzIHVzZWQgYnkgdGhlIGdsb2JhbCB0eXBlCi8vLyBpbmZlcmVuY2UuCmFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsdWVTdHJhdGVneSB7CiAgLy8vIENyZWF0ZXMgdGhlIGFic3RyYWN0IHZhbHVlIGRvbWFpbiBmb3IgW2Nsb3NlZFdvcmxkXS4KICBBYnN0cmFjdFZhbHVlRG9tYWluIGNyZWF0ZURvbWFpbihKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpOwoKICAvLy8gQ3JlYXRlcyB0aGUgW1NlbGVjdG9yQ29uc3RyYWludHNTdHJhdGVneV0gdXNlZCBieSB0aGUgYmFja2VuZCBlbnF1ZXVlci4KICBTZWxlY3RvckNvbnN0cmFpbnRzU3RyYXRlZ3kgY3JlYXRlU2VsZWN0b3JTdHJhdGVneSgpOwp9CgovLy8gQSB2YWx1ZSBpbiBhbiBhYnN0cmFjdGlvbiBvZiBydW50aW1lIHZhbHVlcy4KYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWx1ZSB7fQoKLy8vIEEgc3lzdGVtIHRoYXQgaW1wbGVtZW50cyBhbiBhYnN0cmFjdGlvbiBvdmVyIHJ1bnRpbWUgdmFsdWVzLgphYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbHVlRG9tYWluIHsKICAvLy8gVGhlIFtBYnN0cmFjdFZhbHVlXSB0aGF0IHJlcHJlc2VudHMgYW4gdW5rbm93biBydW50aW1lIHZhbHVlLgogIEFic3RyYWN0VmFsdWUgZ2V0IGR5bmFtaWNUeXBlOwoKICAvLy8gVGhlIFtBYnN0cmFjdFZhbHVlXSB0aGF0IHJlcHJlc2VudHMgYSBub24tbnVsbCBzdWJ0eXBlIG9mIGBUeXBlYCBhdAogIC8vLyBydW50aW1lLgogIEFic3RyYWN0VmFsdWUgZ2V0IHR5cGVUeXBlOwoKICAvLy8gVGhlIFtBYnN0cmFjdFZhbHVlXSB0aGF0IHJlcHJlc2VudHMgYSBub24tbnVsbCBzdWJ0eXBlIG9mIGBGdW5jdGlvbmAgYXQKICAvLy8gcnVudGltZS4KICBBYnN0cmFjdFZhbHVlIGdldCBmdW5jdGlvblR5cGU7CgogIC8vLyBUaGUgW0Fic3RyYWN0VmFsdWVdIHRoYXQgcmVwcmVzZW50cyBhIG5vbi1udWxsIHN1YnR5cGUgb2YgYGJvb2xgIGF0CiAgLy8vIHJ1bnRpbWUuCiAgQWJzdHJhY3RWYWx1ZSBnZXQgYm9vbFR5cGU7CgogIC8vLyBUaGUgW0Fic3RyYWN0VmFsdWVdIHRoYXQgcmVwcmVzZW50cyBhIG5vbi1udWxsIHN1YnR5cGUgb2YgYGludGAgYXQKICAvLy8gcnVudGltZS4KICBBYnN0cmFjdFZhbHVlIGdldCBpbnRUeXBlOwoKICAvLy8gVGhlIFtBYnN0cmFjdFZhbHVlXSB0aGF0IHJlcHJlc2VudHMgYSBub24tbnVsbCBzdWJ0eXBlIG9mIGBkb3VibGVgIGF0CiAgLy8vIHJ1bnRpbWUuCiAgQWJzdHJhY3RWYWx1ZSBnZXQgZG91YmxlVHlwZTsKCiAgLy8vIFRoZSBbQWJzdHJhY3RWYWx1ZV0gdGhhdCByZXByZXNlbnRzIGEgbm9uLW51bGwgc3VidHlwZSBvZiBgbnVtYCBhdAogIC8vLyBydW50aW1lLgogIEFic3RyYWN0VmFsdWUgZ2V0IG51bVR5cGU7CgogIC8vLyBUaGUgW0Fic3RyYWN0VmFsdWVdIHRoYXQgcmVwcmVzZW50cyBhIG5vbi1udWxsIHN1YnR5cGUgb2YgYFN0cmluZ2AgYXQKICAvLy8gcnVudGltZS4KICBBYnN0cmFjdFZhbHVlIGdldCBzdHJpbmdUeXBlOwoKICAvLy8gVGhlIFtBYnN0cmFjdFZhbHVlXSB0aGF0IHJlcHJlc2VudHMgYSBub24tbnVsbCBzdWJ0eXBlIG9mIGBMaXN0YCBhdAogIC8vLyBydW50aW1lLgogIEFic3RyYWN0VmFsdWUgZ2V0IGxpc3RUeXBlOwoKICAvLy8gVGhlIFtBYnN0cmFjdFZhbHVlXSB0aGF0IHJlcHJlc2VudHMgYSBub24tbnVsbCBzdWJ0eXBlIG9mIGBTZXRgIGF0CiAgLy8vIHJ1bnRpbWUuCiAgQWJzdHJhY3RWYWx1ZSBnZXQgc2V0VHlwZTsKCiAgLy8vIFRoZSBbQWJzdHJhY3RWYWx1ZV0gdGhhdCByZXByZXNlbnRzIGEgbm9uLW51bGwgc3VidHlwZSBvZiBgTWFwYCBhdAogIC8vLyBydW50aW1lLgogIEFic3RyYWN0VmFsdWUgZ2V0IG1hcFR5cGU7CgogIC8vLyBUaGUgW0Fic3RyYWN0VmFsdWVdIHRoYXQgcmVwcmVzZW50cyBhIG5vbi1udWxsIHZhbHVlIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RWYWx1ZSBnZXQgbm9uTnVsbFR5cGU7CgogIC8vLyBUaGUgW0Fic3RyYWN0VmFsdWVdIHRoYXQgcmVwcmVzZW50cyB0aGUgYG51bGxgIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RWYWx1ZSBnZXQgbnVsbFR5cGU7CgogIC8vLyBUaGUgW0Fic3RyYWN0VmFsdWVdIHRoYXQgcmVwcmVzZW50cyBhIG5vbi1udWxsIGdyb3dhYmxlIEphdmFTY3JpcHQgYXJyYXkKICAvLy8gYXQgcnVudGltZS4KICBBYnN0cmFjdFZhbHVlIGdldCBncm93YWJsZUxpc3RUeXBlOwoKICAvLy8gVGhlIFtBYnN0cmFjdFZhbHVlXSB0aGF0IHJlcHJlc2VudHMgYSBub24tbnVsbCBmaXhlZCBzaXplIEphdmFTY3JpcHQgYXJyYXkKICAvLy8gYXQgcnVudGltZS4KICBBYnN0cmFjdFZhbHVlIGdldCBmaXhlZExpc3RUeXBlOwoKICAvLy8gVGhlIFtBYnN0cmFjdFZhbHVlXSB0aGF0IHJlcHJlc2VudHMgYSBub24tbnVsbCAzMS1iaXQgdW5zaWduZWQgaW50ZWdlciBhdAogIC8vLyBydW50aW1lLgogIEFic3RyYWN0VmFsdWUgZ2V0IHVpbnQzMVR5cGU7CgogIC8vLyBUaGUgW0Fic3RyYWN0VmFsdWVdIHRoYXQgcmVwcmVzZW50cyBhIG5vbi1udWxsIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGF0CiAgLy8vIHJ1bnRpbWUuCiAgQWJzdHJhY3RWYWx1ZSBnZXQgdWludDMyVHlwZTsKCiAgLy8vIFRoZSBbQWJzdHJhY3RWYWx1ZV0gdGhhdCByZXByZXNlbnRzIGEgbm9uLW51bGwgdW5zaWduZWQgaW50ZWdlciBhdAogIC8vLyBydW50aW1lLgogIEFic3RyYWN0VmFsdWUgZ2V0IHBvc2l0aXZlSW50VHlwZTsKCiAgLy8vIFRoZSBbQWJzdHJhY3RWYWx1ZV0gdGhhdCByZXByZXNlbnRzIGEgbm9uLW51bGwgY29uc3RhbnQgbGlzdCBsaXRlcmFsIGF0CiAgLy8vIHJ1bnRpbWUuCiAgQWJzdHJhY3RWYWx1ZSBnZXQgY29uc3RMaXN0VHlwZTsKCiAgLy8vIFRoZSBbQWJzdHJhY3RWYWx1ZV0gdGhhdCByZXByZXNlbnRzIGEgbm9uLW51bGwgY29uc3RhbnQgc2V0IGxpdGVyYWwgYXQKICAvLy8gcnVudGltZS4KICBBYnN0cmFjdFZhbHVlIGdldCBjb25zdFNldFR5cGU7CgogIC8vLyBUaGUgW0Fic3RyYWN0VmFsdWVdIHRoYXQgcmVwcmVzZW50cyBhIG5vbi1udWxsIGNvbnN0YW50IG1hcCBsaXRlcmFsIGF0CiAgLy8vIHJ1bnRpbWUuCiAgQWJzdHJhY3RWYWx1ZSBnZXQgY29uc3RNYXBUeXBlOwoKICAvLy8gVGhlIFtBYnN0cmFjdFZhbHVlXSB0aGF0IHJlcHJlc2VudHMgdGhlIGVtcHR5IHNldCBvZiBydW50aW1lIHZhbHVlcy4KICBBYnN0cmFjdFZhbHVlIGdldCBlbXB0eVR5cGU7CgogIC8vLyBUaGUgW0Fic3RyYWN0VmFsdWVdIHRoYXQgcmVwcmVzZW50cyBhIG5vbi1udWxsIGluc3RhbmNlIGF0IHJ1bnRpbWUgb2YgdGhlCiAgLy8vIGBJdGVyYWJsZWAgY2xhc3MgdXNlZCBmb3IgdGhlIGBzeW5jKmAgaW1wbGVtZW50YXRpb24uCiAgQWJzdHJhY3RWYWx1ZSBnZXQgc3luY1N0YXJJdGVyYWJsZVR5cGU7CgogIC8vLyBUaGUgW0Fic3RyYWN0VmFsdWVdIHRoYXQgcmVwcmVzZW50cyBhIG5vbi1udWxsIGluc3RhbmNlIGF0IHJ1bnRpbWUgb2YgdGhlCiAgLy8vIGBGdXR1cmVgIGNsYXNzIHVzZWQgZm9yIHRoZSBgYXN5bmNgIGltcGxlbWVudGF0aW9uLgogIEFic3RyYWN0VmFsdWUgZ2V0IGFzeW5jRnV0dXJlVHlwZTsKCiAgLy8vIFRoZSBbQWJzdHJhY3RWYWx1ZV0gdGhhdCByZXByZXNlbnRzIGEgbm9uLW51bGwgaW5zdGFuY2UgYXQgcnVudGltZSBvZiB0aGUKICAvLy8gYFN0cmVhbWAgY2xhc3MgdXNlZCBmb3IgdGhlIGBhc3luYypgIGltcGxlbWVudGF0aW9uLgogIEFic3RyYWN0VmFsdWUgZ2V0IGFzeW5jU3RhclN0cmVhbVR5cGU7CgogIC8vLyBDcmVhdGVzIGFuIFtBYnN0cmFjdFZhbHVlXSBmb3IgYSBub24tbnVsbCBleGFjdCBpbnN0YW5jZSBvZiBbY2xzXS4KICBBYnN0cmFjdFZhbHVlIGNyZWF0ZU5vbk51bGxFeGFjdChDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gQ3JlYXRlcyBhbiBbQWJzdHJhY3RWYWx1ZV0gZm9yIGEgcG90ZW50aWFsbHkgbnVsbCBleGFjdCBpbnN0YW5jZSBvZiBbY2xzXS4KICBBYnN0cmFjdFZhbHVlIGNyZWF0ZU51bGxhYmxlRXhhY3QoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIENyZWF0ZXMgYW4gW0Fic3RyYWN0VmFsdWVdIGZvciBhIG5vbi1udWxsIGluc3RhbmNlIHRoYXQgZXh0ZW5kcyBbY2xzXS4KICBBYnN0cmFjdFZhbHVlIGNyZWF0ZU5vbk51bGxTdWJjbGFzcyhDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gQ3JlYXRlcyBhbiBbQWJzdHJhY3RWYWx1ZV0gZm9yIGEgbm9uLW51bGwgaW5zdGFuY2UgdGhhdCBpbXBsZW1lbnRzIFtjbHNdLgogIEFic3RyYWN0VmFsdWUgY3JlYXRlTm9uTnVsbFN1YnR5cGUoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIENyZWF0ZXMgYW4gW0Fic3RyYWN0VmFsdWVdIGZvciBhIHBvdGVudGlhbGx5IG51bGwgaW5zdGFuY2UgdGhhdCBpbXBsZW1lbnRzCiAgLy8vIFtjbHNdLgogIEFic3RyYWN0VmFsdWUgY3JlYXRlTnVsbGFibGVTdWJ0eXBlKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhIG5hdGl2ZSB0eXBlZAogIC8vLyBhcnJheSBvciBgbnVsbGAgYXQgcnVudGltZS4KICBBYnN0cmFjdEJvb2wgaXNUeXBlZEFycmF5KGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbdmFsdWVdIGNvdWxkIGJlIGEgbmF0aXZlCiAgLy8vIHR5cGVkIGFycmF5IGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGNvdWxkQmVUeXBlZEFycmF5KGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhlIGFic3RyYWN0IFt2YWx1ZV0gdGhhdCBleGNsdWRlcyBgbnVsbGAuCiAgQWJzdHJhY3RWYWx1ZSBleGNsdWRlTnVsbChjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIHRoZSBhYnN0cmFjdCBbdmFsdWVdIHRoYXQgaW5jbHVkZXMgYG51bGxgLgogIEFic3RyYWN0VmFsdWUgaW5jbHVkZU51bGwoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyB3aGV0aGVyIFt2YWx1ZV0gY29udGFpbnMKICAvLy8gaW5zdGFuY2VzIG9mIFtjbHNdIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGNvbnRhaW5zVHlwZShjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSwgQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbdmFsdWVdIG9ubHkgY29udGFpbnMKICAvLy8gc3VidHlwZXMgb2YgW2Nsc10gb3IgYG51bGxgIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGNvbnRhaW5zT25seVR5cGUoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUsIENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhbiBpbnN0YW5jZSBvZgogIC8vLyBbY2xzXSBvciBgbnVsbGAgYXQgcnVudGltZS4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNZXJnZSB0aGlzIHdpdGggW2lzSW5zdGFuY2VPZl0uCiAgQWJzdHJhY3RCb29sIGlzSW5zdGFuY2VPZk9yTnVsbCgKICAgICAgY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUsIENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBrbm93biB0byBiZSBhbgogIC8vLyBpbnN0YW5jZSBvZiBbY2xzXSBhdCBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc0luc3RhbmNlT2YoQWJzdHJhY3RWYWx1ZSB2YWx1ZSwgQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbdmFsdWVdIGlzIGVtcHR5IHNldCBvZgogIC8vLyBydW50aW1lIHZhbHVlcy4KICBBYnN0cmFjdEJvb2wgaXNFbXB0eShjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhIG5vbi1udWxsCiAgLy8vIGV4YWN0IGNsYXNzIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzRXhhY3QoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyB3aGV0aGVyIFt2YWx1ZV0gaXMgYW4gZXhhY3QgY2xhc3MKICAvLy8gb3IgYG51bGxgIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzRXhhY3RPck51bGwoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyB0aGUgW0NsYXNzRW50aXR5XSBpZiB0aGlzIFt2YWx1ZV0gaXMgYSBub24tbnVsbCBpbnN0YW5jZSBvZiBhbgogIC8vLyBleGFjdCBjbGFzcyBhdCBydW50aW1lLCBhbmQgYG51bGxgIG90aGVyd2lzZS4KICBDbGFzc0VudGl0eSBnZXRFeGFjdENsYXNzKGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbdmFsdWVdIGlzIGBudWxsYCBhdAogIC8vLyBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc051bGwoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyB3aGV0aGVyIFt2YWx1ZV0gaXMgYSBKYXZhU2NyaXB0CiAgLy8vIGJvb2wsIG51bWJlciwgc3RyaW5nLCBhcnJheSBvciBgbnVsbGAgYXQgcnVudGltZS4KICBBYnN0cmFjdEJvb2wgaXNQcmltaXRpdmUoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyB3aGV0aGVyIFt2YWx1ZV0gaXMgYSBKYXZhU2NyaXB0CiAgLy8vIG51bWJlciBhdCBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc1ByaW1pdGl2ZU51bWJlcihjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhIEphdmFTY3JpcHQKICAvLy8gYm9vbCBhdCBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc1ByaW1pdGl2ZUJvb2xlYW4oY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyB3aGV0aGVyIFt2YWx1ZV0gaXMgYSBKYXZhU2NyaXB0CiAgLy8vIGFycmF5IGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzUHJpbWl0aXZlQXJyYXkoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyB3aGV0aGVyIFt2YWx1ZV0gaXMgYSBKYXZhU2NyaXB0CiAgLy8vIHN0cmluZywgYXJyYXksIG5hdGl2ZSBIVE1MIGxpc3Qgb3IgYG51bGxgIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzSW5kZXhhYmxlUHJpbWl0aXZlKGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbdmFsdWVdIGlzIGEgZml4ZWQtc2l6ZQogIC8vLyBvciBjb25zdGFudCBKYXZhU2NyaXB0IGFycmF5IG9yIGBudWxsYCBhdCBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc0ZpeGVkQXJyYXkoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyB3aGV0aGVyIFt2YWx1ZV0gaXMgYSBncm93YWJsZQogIC8vLyBKYXZhU2NyaXB0IGFycmF5IG9yIGBudWxsYCBhdCBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc0V4dGVuZGFibGVBcnJheShjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhIG11dGFibGUKICAvLy8gSmF2YVNjcmlwdCBhcnJheSBvciBgbnVsbGAgYXQgcnVudGltZS4KICBBYnN0cmFjdEJvb2wgaXNNdXRhYmxlQXJyYXkoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyB3aGV0aGVyIFt2YWx1ZV0gaXMgYSBtdXRhYmxlCiAgLy8vIEphdmFTY3JpcHQgYXJyYXksIG5hdGl2ZSBIVE1MIGxpc3Qgb3IgYG51bGxgIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzTXV0YWJsZUluZGV4YWJsZShjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhIEphdmFTY3JpcHQKICAvLy8gYXJyYXkgb3IgYG51bGxgIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzQXJyYXkoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyB3aGV0aGVyIFt2YWx1ZV0gaXMgYSBKYXZhU2NyaXB0CiAgLy8vIHN0cmluZyBhdCBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc1ByaW1pdGl2ZVN0cmluZyhjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhbiBpbnRlcmNlcHRvcgogIC8vLyBhdCBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc0ludGVyY2VwdG9yKGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbdmFsdWVdIGlzIGEgbm9uLW51bGwKICAvLy8gaW50ZWdlciB2YWx1ZSBhdCBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc0ludGVnZXIoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyB3aGV0aGVyIFt2YWx1ZV0gaXMgYSBub24tbnVsbCAzMgogIC8vLyBiaXQgdW5zaWduZWQgaW50ZWdlciB2YWx1ZSBhdCBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc1VJbnQzMihjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhIG5vbi1udWxsIDMxCiAgLy8vIGJpdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzVUludDMxKGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbdmFsdWVdIGlzIGEgbm9uLW51bGwKICAvLy8gdW5zaWduZWQgaW50ZWdlciB2YWx1ZSBhdCBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc1Bvc2l0aXZlSW50ZWdlcihjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhbiB1bnNpZ25lZAogIC8vLyBpbnRlZ2VyIHZhbHVlIG9yIGBudWxsYCBhdCBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc1Bvc2l0aXZlSW50ZWdlck9yTnVsbChjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhbiBpbnRlZ2VyCiAgLy8vIHZhbHVlIG9yIGBudWxsYCBhdCBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc0ludGVnZXJPck51bGwoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyB3aGV0aGVyIFt2YWx1ZV0gaXMgYSBub24tbnVsbAogIC8vLyBKYXZhU2NyaXB0IG51bWJlciBhdCBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc051bWJlcihjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhIEphdmFTY3JpcHQKICAvLy8gbnVtYmVyIG9yIGBudWxsYCBhdCBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc051bWJlck9yTnVsbChjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhIG5vbi1pbnRlZ2VyCiAgLy8vIG51bWJlciBhdCBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc0RvdWJsZShjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhIG5vbi1pbnRlZ2VyCiAgLy8vIG51bWJlciBvciBgbnVsbGAgYXQgcnVudGltZS4KICBBYnN0cmFjdEJvb2wgaXNEb3VibGVPck51bGwoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyB3aGV0aGVyIFt2YWx1ZV0gaXMgYSBKYXZhU2NyaXB0CiAgLy8vIGJvb2wgYXQgcnVudGltZS4KICBBYnN0cmFjdEJvb2wgaXNCb29sZWFuKGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbdmFsdWVdIGlzIGEgSmF2YVNjcmlwdAogIC8vLyBib29sIG9yIGBudWxsYCBhdCBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc0Jvb2xlYW5Pck51bGwoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyB3aGV0aGVyIFt2YWx1ZV0gaXMgYSBKYXZhU2NyaXB0CiAgLy8vIHN0cmluZyBhdCBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc1N0cmluZyhjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhIEphdmFTY3JpcHQKICAvLy8gc3RyaW5nIG9yIGBudWxsYCBhdCBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc1N0cmluZ09yTnVsbChjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBhIEphdmFTY3JpcHQKICAvLy8gcHJpbWl0aXZlLCBwb3NzaWJsZSBgbnVsbGAuCiAgQWJzdHJhY3RCb29sIGlzUHJpbWl0aXZlT3JOdWxsKGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgW0Fic3RyYWN0VmFsdWVdIGZvciB0aGUgcnVudGltZSB2YWx1ZXMgY29udGFpbmVkIGluIGVpdGhlciBbYV0gb3IKICAvLy8gW2JdLgogIEFic3RyYWN0VmFsdWUgdW5pb24oY292YXJpYW50IEFic3RyYWN0VmFsdWUgYSwgY292YXJpYW50IEFic3RyYWN0VmFsdWUgYik7CgogIC8vLyBSZXR1cm5zIFtBYnN0cmFjdFZhbHVlXSBmb3IgdGhlIHJ1bnRpbWUgdmFsdWVzIGNvbnRhaW5lZCBpbiBhdCBsZWFzdCBvbmUKICAvLy8gb2YgW3ZhbHVlc10uCiAgQWJzdHJhY3RWYWx1ZSB1bmlvbk9mTWFueShJdGVyYWJsZTxBYnN0cmFjdFZhbHVlPiB2YWx1ZXMpOwoKICAvLy8gUmV0dXJucyBbQWJzdHJhY3RWYWx1ZV0gZm9yIHRoZSBydW50aW1lIHZhbHVlcyB0aGF0IFthXSBhbmQgW2JdIGhhdmUgaW4KICAvLy8gY29tbW9uLgogIEFic3RyYWN0VmFsdWUgaW50ZXJzZWN0aW9uKAogICAgICBjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSBhLCBjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSBiKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbYV0gYW5kIFtiXSBoYXZlIG5vCiAgLy8vIHJ1bnRpbWUgdmFsdWVzIGluIGNvbW1vbi4KICBBYnN0cmFjdEJvb2wgYXJlRGlzam9pbnQoCiAgICAgIGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIGEsIGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIGIpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyB3aGV0aGVyIFthXSBjb250YWlucyBhbGwgbm9uLW51bGwKICAvLy8gcnVudGltZSB2YWx1ZXMuCiAgQWJzdHJhY3RCb29sIGNvbnRhaW5zQWxsKGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIGEpOwoKICAvLy8gQ29tcHV0ZXMgdGhlIFtBYnN0cmFjdFZhbHVlXSBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb25zdGFudCBbdmFsdWVdLgogIEFic3RyYWN0VmFsdWUgY29tcHV0ZUFic3RyYWN0VmFsdWVGb3JDb25zdGFudChDb25zdGFudFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFt2YWx1ZV0gcmVwcmVzZW50cyBhIGNvbnRhaW5lciB2YWx1ZSBhdCBydW50aW1lLgogIGJvb2wgaXNDb250YWluZXIoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gQ3JlYXRlcyBhIGNvbnRhaW5lciB2YWx1ZSBzcGVjaWFsaXphdGlvbiBvZiBbb3JpZ2luYWxWYWx1ZV0gd2l0aCB0aGUKICAvLy8gaW5mZXJyZWQgW2VsZW1lbnRdIHJ1bnRpbWUgdmFsdWUgYW5kIGluZmVycmVkIHJ1bnRpbWUgW2xlbmd0aF0uCiAgLy8vCiAgLy8vIFRoZSBbYWxsb2NhdGlvbk5vZGVdIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBwYXJ0aWN1bGFyIG1hcCBhbGxvY2F0aW9uLgogIC8vLyBUaGUgW2FsbG9jYXRpb25FbGVtZW50XSBpcyB1c2VkIG9ubHkgZm9yIGRlYnVnZ2luZy4KICBBYnN0cmFjdFZhbHVlIGNyZWF0ZUNvbnRhaW5lclZhbHVlKAogICAgICBBYnN0cmFjdFZhbHVlIG9yaWdpbmFsVmFsdWUsCiAgICAgIE9iamVjdCBhbGxvY2F0aW9uTm9kZSwKICAgICAgTWVtYmVyRW50aXR5IGFsbG9jYXRpb25FbGVtZW50LAogICAgICBBYnN0cmFjdFZhbHVlIGVsZW1lbnRUeXBlLAogICAgICBpbnQgbGVuZ3RoKTsKCiAgLy8vIFJldHVybnMgdGhlIGVsZW1lbnQgdHlwZSBvZiBbdmFsdWVdIGlmIGl0IHJlcHJlc2VudHMgYSBjb250YWluZXIgdmFsdWUKICAvLy8gYXQgcnVudGltZS4gUmV0dXJucyBbZHluYW1pY1R5cGVdIG90aGVyd2lzZS4KICBBYnN0cmFjdFZhbHVlIGdldENvbnRhaW5lckVsZW1lbnRUeXBlKEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJuIHRoZSBrbm93biBsZW5ndGggb2YgW3ZhbHVlXSBpZiBpdCByZXByZXNlbnRzIGEgY29udGFpbmVyIHZhbHVlCiAgLy8vIGF0IHJ1bnRpbWUuIFJldHVybnMgYG51bGxgIGlmIHRoZSBsZW5ndGggaXMgdW5rbm93biBvciBpZiBbdmFsdWVdIGRvZXNuJ3QKICAvLy8gcmVwcmVzZW50IGEgY29udGFpbmVyIHZhbHVlIGF0IHJ1bnRpbWUuCiAgaW50IGdldENvbnRhaW5lckxlbmd0aChBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFt2YWx1ZV0gcmVwcmVzZW50cyBhIHNldCB2YWx1ZSBhdCBydW50aW1lLgogIGJvb2wgaXNTZXQoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gQ3JlYXRlcyBhIHNldCB2YWx1ZSBzcGVjaWFsaXphdGlvbiBvZiBbb3JpZ2luYWxWYWx1ZV0gd2l0aCB0aGUgaW5mZXJyZWQKICAvLy8gW2VsZW1lbnRUeXBlXSBydW50aW1lIHZhbHVlLgogIC8vLwogIC8vLyBUaGUgW2FsbG9jYXRpb25Ob2RlXSBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgcGFydGljdWxhciBzZXQgYWxsb2NhdGlvbi4KICAvLy8gVGhlIFthbGxvY2F0aW9uRWxlbWVudF0gaXMgdXNlZCBvbmx5IGZvciBkZWJ1Z2dpbmcuCiAgQWJzdHJhY3RWYWx1ZSBjcmVhdGVTZXRWYWx1ZSgKICAgICAgQWJzdHJhY3RWYWx1ZSBvcmlnaW5hbFZhbHVlLAogICAgICBPYmplY3QgYWxsb2NhdGlvbk5vZGUsCiAgICAgIE1lbWJlckVudGl0eSBhbGxvY2F0aW9uRWxlbWVudCwKICAgICAgQWJzdHJhY3RWYWx1ZSBlbGVtZW50VHlwZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBlbGVtZW50IHR5cGUgb2YgW3ZhbHVlXSBpZiBpdCByZXByZXNlbnRzIGEgc2V0IHZhbHVlIGF0CiAgLy8vIHJ1bnRpbWUuIFJldHVybnMgW2R5bmFtaWNUeXBlXSBvdGhlcndpc2UuCiAgQWJzdHJhY3RWYWx1ZSBnZXRTZXRFbGVtZW50VHlwZShBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFt2YWx1ZV0gcmVwcmVzZW50cyBhIG1hcCB2YWx1ZSBhdCBydW50aW1lLgogIGJvb2wgaXNNYXAoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gQ3JlYXRlcyBhIG1hcCB2YWx1ZSBzcGVjaWFsaXphdGlvbiBvZiBbb3JpZ2luYWxWYWx1ZV0gd2l0aCB0aGUgaW5mZXJyZWQKICAvLy8gW2tleV0gYW5kIFt2YWx1ZV0gcnVudGltZSB2YWx1ZXMuCiAgLy8vCiAgLy8vIFRoZSBbYWxsb2NhdGlvbk5vZGVdIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBwYXJ0aWN1bGFyIG1hcCBhbGxvY2F0aW9uLgogIC8vLyBUaGUgW2FsbG9jYXRpb25FbGVtZW50XSBpcyB1c2VkIG9ubHkgZm9yIGRlYnVnZ2luZy4KICBBYnN0cmFjdFZhbHVlIGNyZWF0ZU1hcFZhbHVlKAogICAgICBBYnN0cmFjdFZhbHVlIG9yaWdpbmFsVmFsdWUsCiAgICAgIE9iamVjdCBhbGxvY2F0aW9uTm9kZSwKICAgICAgTWVtYmVyRW50aXR5IGFsbG9jYXRpb25FbGVtZW50LAogICAgICBBYnN0cmFjdFZhbHVlIGtleSwKICAgICAgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBrZXkgdHlwZSBvZiBbdmFsdWVdIGlmIGl0IHJlcHJlc2VudHMgYSBtYXAgdmFsdWUgYXQgcnVudGltZS4KICAvLy8gUmV0dXJucyBbZHluYW1pY1R5cGVdIG90aGVyd2lzZS4KICBBYnN0cmFjdFZhbHVlIGdldE1hcEtleVR5cGUoQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSB0eXBlIG9mIFt2YWx1ZV0gaWYgaXQgcmVwcmVzZW50cyBhIG1hcCB2YWx1ZSBhdCBydW50aW1lLgogIC8vLyBSZXR1cm5zIFtkeW5hbWljVHlwZV0gb3RoZXJ3aXNlLgogIEFic3RyYWN0VmFsdWUgZ2V0TWFwVmFsdWVUeXBlKEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW3ZhbHVlXSByZXByZXNlbnRzIGEgZGljdGlvbmFyeSB2YWx1ZSwgdGhhdCBpcywgYSBtYXAKICAvLy8gd2l0aCBzdHJpbmdzIGFzIGtleXMsIGF0IHJ1bnRpbWUuCiAgYm9vbCBpc0RpY3Rpb25hcnkoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gQ3JlYXRlcyBhIGRpY3Rpb25hcnkgdmFsdWUgc3BlY2lhbGl6YXRpb24gb2YgW29yaWdpbmFsVmFsdWVdIHdpdGggdGhlCiAgLy8vIGluZmVycmVkIFtrZXldIGFuZCBbdmFsdWVdIHJ1bnRpbWUgdmFsdWVzLgogIC8vLwogIC8vLyBUaGUgW2FsbG9jYXRpb25Ob2RlXSBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgcGFydGljdWxhciBtYXAgYWxsb2NhdGlvbi4KICAvLy8gVGhlIFthbGxvY2F0aW9uRWxlbWVudF0gaXMgdXNlZCBvbmx5IGZvciBkZWJ1Z2dpbmcuCiAgQWJzdHJhY3RWYWx1ZSBjcmVhdGVEaWN0aW9uYXJ5VmFsdWUoCiAgICAgIEFic3RyYWN0VmFsdWUgb3JpZ2luYWxWYWx1ZSwKICAgICAgT2JqZWN0IGFsbG9jYXRpb25Ob2RlLAogICAgICBNZW1iZXJFbnRpdHkgYWxsb2NhdGlvbkVsZW1lbnQsCiAgICAgIEFic3RyYWN0VmFsdWUga2V5LAogICAgICBBYnN0cmFjdFZhbHVlIHZhbHVlLAogICAgICBNYXA8U3RyaW5nLCBBYnN0cmFjdFZhbHVlPiBtYXBwaW5ncyk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbdmFsdWVdIGlzIGEgZGljdGlvbmFyeSB2YWx1ZSB3aGljaCBjb250YWlucyBba2V5XSBhcwogIC8vLyBhIGtleS4KICBib29sIGNvbnRhaW5zRGljdGlvbmFyeUtleShBYnN0cmFjdFZhbHVlIHZhbHVlLCBTdHJpbmcga2V5KTsKCiAgLy8vIFJldHVybnMgdGhlIHZhbHVlIHR5cGUgZm9yIFtrZXldIGluIFt2YWx1ZV0gaWYgaXQgcmVwcmVzZW50cyBhIGRpY3Rpb25hcnkKICAvLy8gdmFsdWUgYXQgcnVudGltZS4gUmV0dXJucyBbZHluYW1pY1R5cGVdIG90aGVyd2lzZS4KICBBYnN0cmFjdFZhbHVlIGdldERpY3Rpb25hcnlWYWx1ZUZvcktleShBYnN0cmFjdFZhbHVlIHZhbHVlLCBTdHJpbmcga2V5KTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtzcGVjaWFsaXphdGlvbl0gaXMgYSBzcGVjaWFsaXphdGlvbiBvZgogIC8vLyBbZ2VuZXJhbGl6YXRpb25dLgogIC8vLwogIC8vLyBTcGVjaWFsaXphdGlvbnMgYXJlIGNyZWF0ZWQgdGhyb3VnaCBbY3JlYXRlUHJpbWl0aXZlVmFsdWVdLAogIC8vLyBbY3JlYXRlTWFwVmFsdWVdLCBbY3JlYXRlRGljdGlvbmFyeVZhbHVlXSBhbmQgW2NyZWF0ZUNvbnRhaW5lclZhbHVlXS4KICBib29sIGlzU3BlY2lhbGl6YXRpb25PZigKICAgICAgQWJzdHJhY3RWYWx1ZSBzcGVjaWFsaXphdGlvbiwgQWJzdHJhY3RWYWx1ZSBnZW5lcmFsaXphdGlvbik7CgogIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB3aGljaCBbdmFsdWVdIGlzIGEgc3BlY2lhbGl6YXRpb24uIFJldHVybiBgbnVsbGAgaWYKICAvLy8gW3ZhbHVlXSBpcyBub3QgYSBzcGVjaWFsaXphdGlvbi4KICAvLy8KICAvLy8gU3BlY2lhbGl6YXRpb25zIGFyZSBjcmVhdGVkIHRocm91Z2ggW2NyZWF0ZVByaW1pdGl2ZVZhbHVlXSwKICAvLy8gW2NyZWF0ZU1hcFZhbHVlXSwgW2NyZWF0ZURpY3Rpb25hcnlWYWx1ZV0gYW5kIFtjcmVhdGVDb250YWluZXJWYWx1ZV0uCiAgQWJzdHJhY3RWYWx1ZSBnZXRHZW5lcmFsaXphdGlvbihBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybiB0aGUgb2JqZWN0IGlkZW50aWZ5aW5nIHRoZSBhbGxvY2F0aW9uIG9mIFt2YWx1ZV0gaWYgaXQgaXMgYW4KICAvLy8gYWxsb2NhdGlvbiBiYXNlZCBzcGVjaWFsaXphdGlvbi4gT3RoZXJ3aXNlIHJldHVybnMgYG51bGxgLgogIC8vLwogIC8vLyBBbGxvY2F0aW9uIGJhc2VkIHNwZWNpYWxpemF0aW9ucyBhcmUgY3JlYXRlZCB0aHJvdWdoIFtjcmVhdGVNYXBWYWx1ZV0sCiAgLy8vIFtjcmVhdGVEaWN0aW9uYXJ5VmFsdWVdIGFuZCBbY3JlYXRlQ29udGFpbmVyVmFsdWVdCiAgT2JqZWN0IGdldEFsbG9jYXRpb25Ob2RlKEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJuIHRoZSBhbGxvY2F0aW9uIGVsZW1lbnQgb2YgW3ZhbHVlXSBpZiBpdCBpcyBhbiBhbGxvY2F0aW9uIGJhc2VkCiAgLy8vIHNwZWNpYWxpemF0aW9uLiBPdGhlcndpc2UgcmV0dXJucyBgbnVsbGAuCiAgLy8vCiAgLy8vIEFsbG9jYXRpb24gYmFzZWQgc3BlY2lhbGl6YXRpb25zIGFyZSBjcmVhdGVkIHRocm91Z2ggW2NyZWF0ZU1hcFZhbHVlXSwKICAvLy8gW2NyZWF0ZURpY3Rpb25hcnlWYWx1ZV0gYW5kIFtjcmVhdGVDb250YWluZXJWYWx1ZV0KICBNZW1iZXJFbnRpdHkgZ2V0QWxsb2NhdGlvbkVsZW1lbnQoQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbdmFsdWVdIGEga25vd24gcHJpbWl0aXZlIEphdmFTY3JpcHQgdmFsdWUgYXQgcnVudGltZS4KICBib29sIGlzUHJpbWl0aXZlVmFsdWUoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gQ3JlYXRlcyBhIHByaW1pdGl2ZSB2YWx1ZSBzcGVjaWFsaXphdGlvbiBvZiBbb3JpZ2luYWxWYWx1ZV0gd2l0aCB0aGUKICAvLy8gaW5mZXJyZWQgcHJpbWl0aXZlIGNvbnN0YW50IFt2YWx1ZV0uCiAgQWJzdHJhY3RWYWx1ZSBjcmVhdGVQcmltaXRpdmVWYWx1ZSgKICAgICAgQWJzdHJhY3RWYWx1ZSBvcmlnaW5hbFZhbHVlLCBQcmltaXRpdmVDb25zdGFudFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgdGhlIHByaW1pdGl2ZSBKYXZhU2NyaXB0IHZhbHVlIG9mIFt2YWx1ZV0gaWYgaXQgcmVwcmVzZW50cyBhCiAgLy8vIHByaW1pdGl2ZSBKYXZhU2NyaXB0IHZhbHVlIGF0IHJ1bnRpbWUsIHZhbHVlIGF0IHJ1bnRpbWUuIFJldHVybnMgYG51bGxgCiAgLy8vIG90aGVyd2lzZS4KICBQcmltaXRpdmVDb25zdGFudFZhbHVlIGdldFByaW1pdGl2ZVZhbHVlKGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIENvbXB1dGUgdGhlIHR5cGUgb2YgYWxsIHBvdGVudGlhbCByZWNlaXZlcnMgb2YgdGhlIHNldCBvZiBsaXZlIFttZW1iZXJzXS4KICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVSZWNlaXZlcihJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IG1lbWJlcnMpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyB3aGV0aGVyIFttZW1iZXJdIGlzIGEgcG90ZW50aWFsCiAgLy8vIHRhcmdldCB3aGVuIGJlaW5nIGludm9rZWQgb24gYSBbcmVjZWl2ZXJdLiBbbmFtZV0gaXMgdXNlZCB0byBlbnN1cmUKICAvLy8gbGlicmFyeSBwcml2YWN5IGlzIHRha2VuIGludG8gYWNjb3VudC4KICBBYnN0cmFjdEJvb2wgaXNUYXJnZXRpbmdNZW1iZXIoCiAgICAgIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXIsIE1lbWJlckVudGl0eSBtZW1iZXIsIE5hbWUgbmFtZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3NlbGVjdG9yXSBpbnZva2VkIG9uIGEKICAvLy8gW3JlY2VpdmVyXSBjYW4gaGl0IGEgW25vU3VjaE1ldGhvZF0uCiAgQWJzdHJhY3RCb29sIG5lZWRzTm9TdWNoTWV0aG9kSGFuZGxpbmcoCiAgICAgIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXIsIFNlbGVjdG9yIHNlbGVjdG9yKTsKCiAgLy8vIFJldHVybnMgdGhlIFtBYnN0cmFjdFZhbHVlXSBmb3IgdGhlIFtwYXJhbWV0ZXJUeXBlXSBvZiBhIG5hdGl2ZQogIC8vLyBtZXRob2QuIE1heSByZXR1cm4gYG51bGxgLCBmb3IgZXhhbXBsZSwgaWYgW3BhcmFtZXRlclR5cGVdIGlzIG5vdCBtb2RlbGxlZAogIC8vLyBwcmVjaXNlbHkgYnkgYW4gW0Fic3RyYWN0VmFsdWVdLgogIEFic3RyYWN0VmFsdWUgZ2V0QWJzdHJhY3RWYWx1ZUZvck5hdGl2ZU1ldGhvZFBhcmFtZXRlclR5cGUoRGFydFR5cGUgdHlwZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIGlmIHRoZSBzZXQgb2YgcnVudGltZSB2YWx1ZXMgb2YKICAvLy8gW3N1YnNldF0gYXJlIGtub3duIHRvIGFsbCBiZSBpbiB0aGUgc2V0IG9mIHJ1bnRpbWUgdmFsdWVzIG9mIFtzdXBlcnNldF0uCiAgQWJzdHJhY3RCb29sIGNvbnRhaW5zKEFic3RyYWN0VmFsdWUgc3VwZXJzZXQsIEFic3RyYWN0VmFsdWUgc3Vic2V0KTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgaWYgdGhlIHNldCBvZiBydW50aW1lIHZhbHVlcyBvZgogIC8vLyBbc3Vic2V0XSBhcmUga25vd24gdG8gYWxsIGJlIGluIHRoZSBzZXQgb2YgcnVudGltZSB2YWx1ZXMgb2YgW3N1cGVyc2V0XS4KICBBYnN0cmFjdEJvb2wgaXNJbihBYnN0cmFjdFZhbHVlIHN1YnNldCwgQWJzdHJhY3RWYWx1ZSBzdXBlcnNldCk7CgogIC8vLyBSZXR1cm5zIHRoZSBbTWVtYmVyRW50aXR5XSB0aGF0IGlzIGtub3duIHRvIGFsd2F5cyBiZSBoaXQgYXQgcnVudGltZQogIC8vLyBbcmVjZWl2ZXJdLgogIC8vLwogIC8vLyBSZXR1cm5zIGBudWxsYCBpZiAwIG9yIG1vcmUgdGhhbiAxIG1lbWJlciBjYW4gYmUgaGl0IGF0IHJ1bnRpbWUuCiAgTWVtYmVyRW50aXR5IGxvY2F0ZVNpbmdsZU1lbWJlcihBYnN0cmFjdFZhbHVlIHJlY2VpdmVyLCBTZWxlY3RvciBzZWxlY3Rvcik7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIGlmIFt2YWx1ZV0gaXMga25vd24gdG8gYmUgYW4KICAvLy8gaW5kZXhhYmxlIEphdmFTY3JpcHQgdmFsdWUgYXQgcnVudGltZS4KICBBYnN0cmFjdEJvb2wgaXNKc0luZGV4YWJsZShjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyBpZiBbdmFsdWVdIGlzIGtub3duIHRvIGJlIGFuCiAgLy8vIGluZGV4YWJsZSBvciBpdGVyYWJsZSBKYXZhU2NyaXB0IHZhbHVlIGF0IHJ1bnRpbWUuCiAgLy8vCiAgLy8vIEphdmFTY3JpcHQgYXJyYXlzIGFyZSBib3RoIGluZGV4YWJsZSBhbmQgaXRlcmFibGUgd2hlcmVhcyBKYXZhU2NyaXB0CiAgLy8vIHN0cmluZ3MgYXJlIGluZGV4YWJsZSBidXQgbm90IGl0ZXJhYmxlLgogIEFic3RyYWN0Qm9vbCBpc0pzSW5kZXhhYmxlQW5kSXRlcmFibGUoQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIGlmIFt2YWx1ZV0gaXMga25vd24gdG8gYmUgYQogIC8vLyBKYXZhU2NyaXB0IGluZGV4YWJsZSBvZiBmaXhlZCBsZW5ndGguCiAgQWJzdHJhY3RCb29sIGlzRml4ZWRMZW5ndGhKc0luZGV4YWJsZShBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgY29tcGFjdCBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gZm9yIFt2YWx1ZV0gdXNlZCBmb3IgZGVidWdnaW5nLgogIFN0cmluZyBnZXRDb21wYWN0VGV4dChBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIERlc2VyaWFsaXplcyBhbiBbQWJzdHJhY3RWYWx1ZV0gZm9yIHRoaXMgZG9tYWluIGZyb20gW3NvdXJjZV0uCiAgQWJzdHJhY3RWYWx1ZSByZWFkQWJzdHJhY3RWYWx1ZUZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKTsKCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbdmFsdWVdIGZvciB0aGlzIGRvbWFpbiB0byBbc2lua10uCiAgdm9pZCB3cml0ZUFic3RyYWN0VmFsdWVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmssIEFic3RyYWN0VmFsdWUgdmFsdWUpOwp9CoIrAE5OPAEnAU4kIS8uJCkYAUgVFQElAS8BMQExATEBUA8/AVAPQQFPD0ABRwFHAUkBDBdQAgFLDyc7PgFOOAIBMSABQSVEIQFKDx4BTg8iAUoPHgFJDx0BTA8gAUkPHQFMDyABSg8eAUkPHQFJDx0BRyEBQR4BTxImAVESIwFQDyABUA8gAUkPJQFODyMBTQ8iAU0PIgFLHwFQPCoBUDolAVA7KQFJNQFRNgFNOAFQNwFRDTgBUSI8AVEeQQFIPAFIPAFIJU0BTS5RAVEiOiM3AVEkQwFPFjcBTR43AVEcPQFNNDwBTA82AU84OwFPGUEBTxdCAU8YQAFPPEQBTzk8AU0tQQFMLT4BTD9CAU8iNwFPGUEBURI9AU0gOQFQLTgBUC04AU0pQQFOKkcBTSI/AU0kOAFPIz4BUBk4AVAjPgFPFzkBTyE/AU8ZOAFPIz4BTCJBAVALTQFPEz0BTg4ePQFLIBw9AVEWNwFKRgFJMwFLRgZPOiYjHSYhEwFNMz4BTFAuLwFDLQFOIwZPOiAjHSYiAUowOAFDLQFOKAZPOiAjHSYZHAFPJzQBUSc2AU4oNAFMMQZPOicjHSYZGywBTg0/AVA5SwFAGAZCTBtDAU8nBkJMOAFKQQZNOTEBTDAGTTk6AU84AUsrJkIBS04RSwFQQQFPSi0iPwFPKyoyAUZRJ00BT09HAU9PQwFLEgZHTgFMLT0BTTkGSy4+AUssPgFPLgFFRAE5SQIBOHBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL2Fic3RyYWN0X3ZhbHVlX2RvbWFpbi5kYXJ0M3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2luZmVycmVyL3RyaXZpYWwuZGFydLPcLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JyBzaG93IENvbnN0YW50VmFsdWUsIFByaW1pdGl2ZUNvbnN0YW50VmFsdWU7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvbmFtZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCcgc2hvdyBEYXJ0VHlwZTsKaW1wb3J0ICcuLi9zZXJpYWxpemF0aW9uL3NlcmlhbGl6YXRpb24uZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvd29ybGRfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS91c2UuZGFydCc7CmltcG9ydCAnLi4vd29ybGQuZGFydCc7CmltcG9ydCAnYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwoKY2xhc3MgVHJpdmlhbEFic3RyYWN0VmFsdWUgaW1wbGVtZW50cyBBYnN0cmFjdFZhbHVlIHsKICBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnPyc7Cn0KCmNsYXNzIFRyaXZpYWxBYnN0cmFjdFZhbHVlRG9tYWluIGltcGxlbWVudHMgQWJzdHJhY3RWYWx1ZURvbWFpbiB7CiAgY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWVEb21haW4oKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBnZXQgZHluYW1pY1R5cGUgPT4gY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUFic3RyYWN0VmFsdWVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmssIEFic3RyYWN0VmFsdWUgdmFsdWUpIHt9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgcmVhZEFic3RyYWN0VmFsdWVGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgPT4KICAgICAgY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldENvbXBhY3RUZXh0KEFic3RyYWN0VmFsdWUgdmFsdWUpID0+ICc/JzsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzRml4ZWRMZW5ndGhKc0luZGV4YWJsZShBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PgogICAgICBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc0pzSW5kZXhhYmxlQW5kSXRlcmFibGUoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4KICAgICAgQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNKc0luZGV4YWJsZShBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIE1lbWJlckVudGl0eSBsb2NhdGVTaW5nbGVNZW1iZXIoQWJzdHJhY3RWYWx1ZSByZWNlaXZlciwgU2VsZWN0b3Igc2VsZWN0b3IpID0+CiAgICAgIG51bGw7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc0luKEFic3RyYWN0VmFsdWUgc3Vic2V0LCBBYnN0cmFjdFZhbHVlIHN1cGVyc2V0KSA9PgogICAgICBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBjb250YWlucyhBYnN0cmFjdFZhbHVlIHN1cGVyc2V0LCBBYnN0cmFjdFZhbHVlIHN1YnNldCkgPT4KICAgICAgQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgbmVlZHNOb1N1Y2hNZXRob2RIYW5kbGluZygKICAgICAgICAgIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXIsIFNlbGVjdG9yIHNlbGVjdG9yKSA9PgogICAgICBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc1RhcmdldGluZ01lbWJlcigKICAgICAgICAgIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXIsIE1lbWJlckVudGl0eSBtZW1iZXIsIE5hbWUgbmFtZSkgPT4KICAgICAgQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVSZWNlaXZlcihJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IG1lbWJlcnMpID0+CiAgICAgIGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIFByaW1pdGl2ZUNvbnN0YW50VmFsdWUgZ2V0UHJpbWl0aXZlVmFsdWUoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjcmVhdGVQcmltaXRpdmVWYWx1ZSgKICAgICAgICAgIEFic3RyYWN0VmFsdWUgb3JpZ2luYWxWYWx1ZSwgUHJpbWl0aXZlQ29uc3RhbnRWYWx1ZSB2YWx1ZSkgPT4KICAgICAgY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1ByaW1pdGl2ZVZhbHVlKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBNZW1iZXJFbnRpdHkgZ2V0QWxsb2NhdGlvbkVsZW1lbnQoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgT2JqZWN0IGdldEFsbG9jYXRpb25Ob2RlKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IG51bGw7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0R2VuZXJhbGl6YXRpb24oQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4KICAgICAgY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1NwZWNpYWxpemF0aW9uT2YoCiAgICAgICAgICBBYnN0cmFjdFZhbHVlIHNwZWNpYWxpemF0aW9uLCBBYnN0cmFjdFZhbHVlIGdlbmVyYWxpemF0aW9uKSA9PgogICAgICBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBnZXREaWN0aW9uYXJ5VmFsdWVGb3JLZXkoQWJzdHJhY3RWYWx1ZSB2YWx1ZSwgU3RyaW5nIGtleSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIlRyaXZpYWxBYnN0cmFjdFZhbHVlRG9tYWluLmdldERpY3Rpb25hcnlWYWx1ZUZvcktleSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc0RpY3Rpb25hcnlLZXkoQWJzdHJhY3RWYWx1ZSB2YWx1ZSwgU3RyaW5nIGtleSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIlRyaXZpYWxBYnN0cmFjdFZhbHVlRG9tYWluLmNvbnRhaW5zRGljdGlvbmFyeUtleSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjcmVhdGVEaWN0aW9uYXJ5VmFsdWUoCiAgICAgICAgICBBYnN0cmFjdFZhbHVlIG9yaWdpbmFsVmFsdWUsCiAgICAgICAgICBPYmplY3QgYWxsb2NhdGlvbk5vZGUsCiAgICAgICAgICBNZW1iZXJFbnRpdHkgYWxsb2NhdGlvbkVsZW1lbnQsCiAgICAgICAgICBBYnN0cmFjdFZhbHVlIGtleSwKICAgICAgICAgIEFic3RyYWN0VmFsdWUgdmFsdWUsCiAgICAgICAgICBNYXA8U3RyaW5nLCBBYnN0cmFjdFZhbHVlPiBtYXBwaW5ncykgPT4KICAgICAgY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0RpY3Rpb25hcnkoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0TWFwVmFsdWVUeXBlKEFic3RyYWN0VmFsdWUgdmFsdWUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJUcml2aWFsQWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRNYXBWYWx1ZVR5cGUiKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0TWFwS2V5VHlwZShBYnN0cmFjdFZhbHVlIHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVHJpdmlhbEFic3RyYWN0VmFsdWVEb21haW4uZ2V0TWFwS2V5VHlwZSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjcmVhdGVNYXBWYWx1ZSgKICAgICAgICAgIEFic3RyYWN0VmFsdWUgb3JpZ2luYWxWYWx1ZSwKICAgICAgICAgIE9iamVjdCBhbGxvY2F0aW9uTm9kZSwKICAgICAgICAgIE1lbWJlckVudGl0eSBhbGxvY2F0aW9uRWxlbWVudCwKICAgICAgICAgIEFic3RyYWN0VmFsdWUga2V5LAogICAgICAgICAgQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4KICAgICAgY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc01hcChBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBnZXRTZXRFbGVtZW50VHlwZShBYnN0cmFjdFZhbHVlIHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVHJpdmlhbEFic3RyYWN0VmFsdWVEb21haW4uZ2V0U2V0RWxlbWVudFR5cGUiKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY3JlYXRlU2V0VmFsdWUoCiAgICAgICAgICBBYnN0cmFjdFZhbHVlIG9yaWdpbmFsVmFsdWUsCiAgICAgICAgICBPYmplY3QgYWxsb2NhdGlvbk5vZGUsCiAgICAgICAgICBNZW1iZXJFbnRpdHkgYWxsb2NhdGlvbkVsZW1lbnQsCiAgICAgICAgICBBYnN0cmFjdFZhbHVlIGVsZW1lbnRUeXBlKSA9PgogICAgICBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBib29sIGlzU2V0KEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0Q29udGFpbmVyTGVuZ3RoKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IG51bGw7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0Q29udGFpbmVyRWxlbWVudFR5cGUoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIlRyaXZpYWxBYnN0cmFjdFZhbHVlRG9tYWluLmdldENvbnRhaW5lckVsZW1lbnRUeXBlIik7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNyZWF0ZUNvbnRhaW5lclZhbHVlKAogICAgICAgICAgQWJzdHJhY3RWYWx1ZSBvcmlnaW5hbFZhbHVlLAogICAgICAgICAgT2JqZWN0IGFsbG9jYXRpb25Ob2RlLAogICAgICAgICAgTWVtYmVyRW50aXR5IGFsbG9jYXRpb25FbGVtZW50LAogICAgICAgICAgQWJzdHJhY3RWYWx1ZSBlbGVtZW50VHlwZSwKICAgICAgICAgIGludCBsZW5ndGgpID0+CiAgICAgIGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIGJvb2wgaXNDb250YWluZXIoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZUFic3RyYWN0VmFsdWVGb3JDb25zdGFudChDb25zdGFudFZhbHVlIHZhbHVlKSA9PgogICAgICBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldEFic3RyYWN0VmFsdWVGb3JOYXRpdmVNZXRob2RQYXJhbWV0ZXJUeXBlKERhcnRUeXBlIHR5cGUpID0+CiAgICAgIG51bGw7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBjb250YWluc0FsbChBYnN0cmFjdFZhbHVlIGEpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGFyZURpc2pvaW50KEFic3RyYWN0VmFsdWUgYSwgQWJzdHJhY3RWYWx1ZSBiKSA9PgogICAgICBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgaW50ZXJzZWN0aW9uKEFic3RyYWN0VmFsdWUgYSwgQWJzdHJhY3RWYWx1ZSBiKSA9PgogICAgICBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHVuaW9uT2ZNYW55KEl0ZXJhYmxlPEFic3RyYWN0VmFsdWU+IHZhbHVlcykgPT4KICAgICAgY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB1bmlvbihBYnN0cmFjdFZhbHVlIGEsIEFic3RyYWN0VmFsdWUgYikgPT4KICAgICAgY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzUHJpbWl0aXZlT3JOdWxsKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzU3RyaW5nT3JOdWxsKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzU3RyaW5nKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzQm9vbGVhbk9yTnVsbChBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc0Jvb2xlYW4oQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNEb3VibGVPck51bGwoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNEb3VibGUoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNOdW1iZXJPck51bGwoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNOdW1iZXIoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNJbnRlZ2VyT3JOdWxsKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzUG9zaXRpdmVJbnRlZ2VyT3JOdWxsKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+CiAgICAgIEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzUG9zaXRpdmVJbnRlZ2VyKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzVUludDMxKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzVUludDMyKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzSW50ZWdlcihBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc0ludGVyY2VwdG9yKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzUHJpbWl0aXZlU3RyaW5nKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzQXJyYXkoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNNdXRhYmxlSW5kZXhhYmxlKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzTXV0YWJsZUFycmF5KEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzRXh0ZW5kYWJsZUFycmF5KEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzRml4ZWRBcnJheShBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc0luZGV4YWJsZVByaW1pdGl2ZShBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc1ByaW1pdGl2ZUFycmF5KEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzUHJpbWl0aXZlQm9vbGVhbihBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc1ByaW1pdGl2ZU51bWJlcihBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc1ByaW1pdGl2ZShBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc051bGwoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXRFeGFjdENsYXNzKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IG51bGw7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc0V4YWN0T3JOdWxsKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzRXhhY3QoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNFbXB0eShBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc0luc3RhbmNlT2YoQWJzdHJhY3RWYWx1ZSB2YWx1ZSwgQ2xhc3NFbnRpdHkgY2xzKSA9PgogICAgICBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc0luc3RhbmNlT2ZPck51bGwoQWJzdHJhY3RWYWx1ZSB2YWx1ZSwgQ2xhc3NFbnRpdHkgY2xzKSA9PgogICAgICBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBjb250YWluc09ubHlUeXBlKEFic3RyYWN0VmFsdWUgdmFsdWUsIENsYXNzRW50aXR5IGNscykgPT4KICAgICAgQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgY29udGFpbnNUeXBlKEFic3RyYWN0VmFsdWUgdmFsdWUsIENsYXNzRW50aXR5IGNscykgPT4KICAgICAgQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGluY2x1ZGVOdWxsKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+CiAgICAgIGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZXhjbHVkZU51bGwoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4KICAgICAgY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGNvdWxkQmVUeXBlZEFycmF5KEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzVHlwZWRBcnJheShBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY3JlYXRlTnVsbGFibGVTdWJ0eXBlKENsYXNzRW50aXR5IGNscykgPT4KICAgICAgY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjcmVhdGVOb25OdWxsU3VidHlwZShDbGFzc0VudGl0eSBjbHMpID0+CiAgICAgIGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY3JlYXRlTm9uTnVsbFN1YmNsYXNzKENsYXNzRW50aXR5IGNscykgPT4KICAgICAgY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjcmVhdGVOdWxsYWJsZUV4YWN0KENsYXNzRW50aXR5IGNscykgPT4KICAgICAgY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjcmVhdGVOb25OdWxsRXhhY3QoQ2xhc3NFbnRpdHkgY2xzKSA9PgogICAgICBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldCBhc3luY1N0YXJTdHJlYW1UeXBlID0+IGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IGFzeW5jRnV0dXJlVHlwZSA9PiBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldCBzeW5jU3Rhckl0ZXJhYmxlVHlwZSA9PiBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldCBlbXB0eVR5cGUgPT4gY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBnZXQgY29uc3RNYXBUeXBlID0+IGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IGNvbnN0U2V0VHlwZSA9PiBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldCBjb25zdExpc3RUeXBlID0+IGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IHBvc2l0aXZlSW50VHlwZSA9PiBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldCB1aW50MzJUeXBlID0+IGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IHVpbnQzMVR5cGUgPT4gY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBnZXQgZml4ZWRMaXN0VHlwZSA9PiBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldCBncm93YWJsZUxpc3RUeXBlID0+IGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IG51bGxUeXBlID0+IGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IG5vbk51bGxUeXBlID0+IGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IG1hcFR5cGUgPT4gY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBnZXQgc2V0VHlwZSA9PiBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldCBsaXN0VHlwZSA9PiBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldCBzdHJpbmdUeXBlID0+IGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IG51bVR5cGUgPT4gY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBnZXQgZG91YmxlVHlwZSA9PiBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldCBpbnRUeXBlID0+IGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IGJvb2xUeXBlID0+IGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IGZ1bmN0aW9uVHlwZSA9PiBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldCB0eXBlVHlwZSA9PiBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwp9CgpjbGFzcyBUcml2aWFsQWJzdHJhY3RWYWx1ZVN0cmF0ZWd5IGltcGxlbWVudHMgQWJzdHJhY3RWYWx1ZVN0cmF0ZWd5IHsKICBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZVN0cmF0ZWd5KCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWVEb21haW4gY3JlYXRlRG9tYWluKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlRG9tYWluKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTZWxlY3RvckNvbnN0cmFpbnRzU3RyYXRlZ3kgY3JlYXRlU2VsZWN0b3JTdHJhdGVneSgpIHsKICAgIHJldHVybiBjb25zdCBUcml2aWFsU2VsZWN0b3JTdHJhdGVneSgpOwogIH0KfQoKY2xhc3MgVHJpdmlhbFNlbGVjdG9yU3RyYXRlZ3kgaW1wbGVtZW50cyBTZWxlY3RvckNvbnN0cmFpbnRzU3RyYXRlZ3kgewogIGNvbnN0IFRyaXZpYWxTZWxlY3RvclN0cmF0ZWd5KCk7CgogIEBvdmVycmlkZQogIFVuaXZlcnNlU2VsZWN0b3JDb25zdHJhaW50cyBjcmVhdGVTZWxlY3RvckNvbnN0cmFpbnRzKAogICAgICBTZWxlY3RvciBzZWxlY3RvciwgT2JqZWN0IGluaXRpYWxDb25zdHJhaW50KSB7CiAgICByZXR1cm4gY29uc3QgVHJpdmlhbFVuaXZlcnNlU2VsZWN0b3JDb25zdHJhaW50cygpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBhcHBsaWVkVW5uYW1lZChEeW5hbWljVXNlIGR5bmFtaWNVc2UsIE1lbWJlckVudGl0eSBtZW1iZXIsCiAgICAgIGNvdmFyaWFudCBKQ2xvc2VkV29ybGQgd29ybGQpIHsKICAgIHJldHVybiBkeW5hbWljVXNlLnNlbGVjdG9yLmFwcGxpZXNVbm5hbWVkKG1lbWJlcik7CiAgfQp9CgpjbGFzcyBUcml2aWFsVW5pdmVyc2VTZWxlY3RvckNvbnN0cmFpbnRzCiAgICBpbXBsZW1lbnRzIFVuaXZlcnNlU2VsZWN0b3JDb25zdHJhaW50cyB7CiAgY29uc3QgVHJpdmlhbFVuaXZlcnNlU2VsZWN0b3JDb25zdHJhaW50cygpOwoKICBAb3ZlcnJpZGUKICBib29sIGFkZFJlY2VpdmVyQ29uc3RyYWludChPYmplY3QgY29uc3RyYWludCkgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgbmVlZHNOb1N1Y2hNZXRob2RIYW5kbGluZyhTZWxlY3RvciBzZWxlY3RvciwgV29ybGQgd29ybGQpID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgY2FuSGl0KE1lbWJlckVudGl0eSBlbGVtZW50LCBOYW1lIG5hbWUsIFdvcmxkIHdvcmxkKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnVHJpdmlhbFVuaXZlcnNlU2VsZWN0b3JDb25zdHJhaW50czokaGFzaENvZGUnOwp9CoHgAE5OPAFOJCEvLiQpHxglATYgAQwcAgFCJgEMQQEMSwEMRiQBDDUBDEAaAQxAGgEMSQEMUAwBDEUaAQxJGgEMKjgaAQwiRRoBDEMkAQxJAQwmSCQBDDcBDEIBDDkBDDokAQwbSQ0BDEwgQAQBDEAgPQQBDCcnISodHzIkAQwzAQw3TgQBDDVMBAEMICchKh0iJAEMLAEMOVAEAQwgJyEqKCQBDCwBDDcBDD8gPwQBDCYnISolGSQBDDIBDEgkAQxPDAEMQwEMQBoBDEIkAQw/JAEMOyQBDE0BDEoBDEQBDEsBDEUBDEoBDEQBDEoBDEQBDEsBDD8aAQxNAQxEAQxEAQxFAQxJAQxNAQxDAQxOAQxKAQxNAQxIAQxQAQxMAQxOAQxNAQxHAQxCAQw6AQxJAQxDAQxDAQxFGgEMSxoBDEkaAQxFGgEMNCQBDDQkAQxNAQxIAQw6JAEMOSQBDDokAQw4JAEMNyQBDEkBDEUBDEoBDD8BDEIBDEIBDEMBDEUBDEABDEABDEMBDEYBDD4BDEEBDD0BDD0BDD4BDEABDD0BDEABDD0BDD4BDEIBDD4CAUYoAQw/LwQBDDksBAIBRyMBDDk1NwQBDEImNwQCASktLgEMOgEMSgEMRQEMRwIBKnBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL3RyaXZpYWwuZGFydDtzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pbmZlcnJlci90eXBlbWFza3MvbWFza3MuZGFydMAAbi4vLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBtYXNrczsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwoKaW1wb3J0ICcuLi8uLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgQ29tbW9uRWxlbWVudHM7CmltcG9ydCAnLi4vLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi8uLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi8uLi9lbGVtZW50cy9uYW1lcy5kYXJ0JzsKaW1wb3J0ICcuLi8uLi9lbGVtZW50cy90eXBlcy5kYXJ0JyBzaG93IERhcnRUeXBlLCBJbnRlcmZhY2VUeXBlLCBEeW5hbWljVHlwZTsKaW1wb3J0ICcuLi8uLi9zZXJpYWxpemF0aW9uL3NlcmlhbGl6YXRpb24uZGFydCc7CmltcG9ydCAnLi4vLi4vdW5pdmVyc2UvY2xhc3NfaGllcmFyY2h5LmRhcnQnOwppbXBvcnQgJy4uLy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3I7CmltcG9ydCAnLi4vLi4vdW5pdmVyc2UvdXNlLmRhcnQnIHNob3cgRHluYW1pY1VzZTsKaW1wb3J0ICcuLi8uLi91bml2ZXJzZS93b3JsZF9idWlsZGVyLmRhcnQnCiAgICBzaG93IFVuaXZlcnNlU2VsZWN0b3JDb25zdHJhaW50cywgU2VsZWN0b3JDb25zdHJhaW50c1N0cmF0ZWd5OwppbXBvcnQgJy4uLy4uL3V0aWwvdXRpbC5kYXJ0JzsKaW1wb3J0ICcuLi8uLi93b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKaW1wb3J0ICcuLi9hYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydCc7CmltcG9ydCAnLi4vdHlwZV9ncmFwaF9pbmZlcnJlci5kYXJ0JyBzaG93IFR5cGVHcmFwaEluZmVycmVyOwppbXBvcnQgJ2NvbnN0YW50cy5kYXJ0JzsKCnBhcnQgJ2NvbnRhaW5lcl90eXBlX21hc2suZGFydCc7CnBhcnQgJ2RpY3Rpb25hcnlfdHlwZV9tYXNrLmRhcnQnOwpwYXJ0ICdmbGF0X3R5cGVfbWFzay5kYXJ0JzsKcGFydCAnZm9yd2FyZGluZ190eXBlX21hc2suZGFydCc7CnBhcnQgJ21hcF90eXBlX21hc2suZGFydCc7CnBhcnQgJ3NldF90eXBlX21hc2suZGFydCc7CnBhcnQgJ3R5cGVfbWFzay5kYXJ0JzsKcGFydCAndW5pb25fdHlwZV9tYXNrLmRhcnQnOwpwYXJ0ICd2YWx1ZV90eXBlX21hc2suZGFydCc7CgpjbGFzcyBDb21tb25NYXNrcyBpbXBsZW1lbnRzIEFic3RyYWN0VmFsdWVEb21haW4gewogIC8vIFRPRE8oc2lnbXVuZCk6IG9uY2Ugd2Ugc3BsaXQgb3V0IHRoZSBiYWNrZW5kIGNvbW1vbiBlbGVtZW50cywgZGVwZW5kCiAgLy8gZGlyZWN0bHkgb24gdGhvc2UgaW5zdGVhZC4KICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwoKICBDb21tb25NYXNrcyh0aGlzLl9jbG9zZWRXb3JsZCk7CgogIENvbW1vbkVsZW1lbnRzIGdldCBjb21tb25FbGVtZW50cyA9PiBfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHM7CgogIFR5cGVNYXNrIF9keW5hbWljVHlwZTsKICBUeXBlTWFzayBfbm9uTnVsbFR5cGU7CiAgVHlwZU1hc2sgX251bGxUeXBlOwogIFR5cGVNYXNrIF9pbnRUeXBlOwogIFR5cGVNYXNrIF91aW50MzJUeXBlOwogIFR5cGVNYXNrIF91aW50MzFUeXBlOwogIFR5cGVNYXNrIF9wb3NpdGl2ZUludFR5cGU7CiAgVHlwZU1hc2sgX2RvdWJsZVR5cGU7CiAgVHlwZU1hc2sgX251bVR5cGU7CiAgVHlwZU1hc2sgX2Jvb2xUeXBlOwogIFR5cGVNYXNrIF9mdW5jdGlvblR5cGU7CiAgVHlwZU1hc2sgX2xpc3RUeXBlOwogIFR5cGVNYXNrIF9jb25zdExpc3RUeXBlOwogIFR5cGVNYXNrIF9maXhlZExpc3RUeXBlOwogIFR5cGVNYXNrIF9ncm93YWJsZUxpc3RUeXBlOwogIFR5cGVNYXNrIF9zZXRUeXBlOwogIFR5cGVNYXNrIF9jb25zdFNldFR5cGU7CiAgVHlwZU1hc2sgX21hcFR5cGU7CiAgVHlwZU1hc2sgX2NvbnN0TWFwVHlwZTsKICBUeXBlTWFzayBfc3RyaW5nVHlwZTsKICBUeXBlTWFzayBfdHlwZVR5cGU7CiAgVHlwZU1hc2sgX3N5bmNTdGFySXRlcmFibGVUeXBlOwogIFR5cGVNYXNrIF9hc3luY0Z1dHVyZVR5cGU7CiAgVHlwZU1hc2sgX2FzeW5jU3RhclN0cmVhbVR5cGU7CiAgVHlwZU1hc2sgX2luZGV4YWJsZVByaW1pdGl2ZVR5cGU7CiAgVHlwZU1hc2sgX3JlYWRhYmxlQXJyYXlUeXBlOwogIFR5cGVNYXNrIF9tdXRhYmxlQXJyYXlUeXBlOwogIFR5cGVNYXNrIF91bm1vZGlmaWFibGVBcnJheVR5cGU7CiAgVHlwZU1hc2sgX2ludGVyY2VwdG9yVHlwZTsKCiAgLy8vIENhY2hlIG9mIFtGbGF0VHlwZU1hc2tdcyBncm91cGVkIGJ5IHRoZSA4IHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUKICAvLy8gYEZsYXRUeXBlTWFzay5mbGFnc2AgcHJvcGVydHkuCiAgZmluYWwgTGlzdDxNYXA8Q2xhc3NFbnRpdHksIFR5cGVNYXNrPj4gX2Nhbm9uaWNhbGl6ZWRUeXBlTWFza3MgPQogICAgICBuZXcgTGlzdDxNYXA8Q2xhc3NFbnRpdHksIFR5cGVNYXNrPj4uZmlsbGVkKDgsIG51bGwpOwoKICAvLy8gUmV0dXJuIHRoZSBjYWNoZWQgbWFzayBmb3IgW2Jhc2VdIHdpdGggdGhlIGdpdmVuIGZsYWdzLCBvcgogIC8vLyBjYWxscyBbY3JlYXRlTWFza10gdG8gY3JlYXRlIHRoZSBtYXNrIGFuZCBjYWNoZSBpdC4KICBUeXBlTWFzayBnZXRDYWNoZWRNYXNrKENsYXNzRW50aXR5IGJhc2UsIGludCBmbGFncywgVHlwZU1hc2sgY3JlYXRlTWFzaygpKSB7CiAgICBNYXA8Q2xhc3NFbnRpdHksIFR5cGVNYXNrPiBjYWNoZWRNYXNrcyA9CiAgICAgICAgX2Nhbm9uaWNhbGl6ZWRUeXBlTWFza3NbZmxhZ3NdID8/PSA8Q2xhc3NFbnRpdHksIFR5cGVNYXNrPnt9OwogICAgcmV0dXJuIGNhY2hlZE1hc2tzLnB1dElmQWJzZW50KGJhc2UsIGNyZWF0ZU1hc2spOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgZ2V0IGR5bmFtaWNUeXBlID0+IF9keW5hbWljVHlwZSA/Pz0gbmV3IFR5cGVNYXNrLnN1YmNsYXNzKAogICAgICBfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MsIF9jbG9zZWRXb3JsZCk7CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIGdldCBub25OdWxsVHlwZSA9PiBfbm9uTnVsbFR5cGUgPz89IG5ldyBUeXBlTWFzay5ub25OdWxsU3ViY2xhc3MoCiAgICAgIF9jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5vYmplY3RDbGFzcywgX2Nsb3NlZFdvcmxkKTsKCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgZ2V0IGludFR5cGUgPT4gX2ludFR5cGUgPz89CiAgICAgIG5ldyBUeXBlTWFzay5ub25OdWxsU3ViY2xhc3MoY29tbW9uRWxlbWVudHMuanNJbnRDbGFzcywgX2Nsb3NlZFdvcmxkKTsKCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgZ2V0IHVpbnQzMlR5cGUgPT4gX3VpbnQzMlR5cGUgPz89CiAgICAgIG5ldyBUeXBlTWFzay5ub25OdWxsU3ViY2xhc3MoY29tbW9uRWxlbWVudHMuanNVSW50MzJDbGFzcywgX2Nsb3NlZFdvcmxkKTsKCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgZ2V0IHVpbnQzMVR5cGUgPT4gX3VpbnQzMVR5cGUgPz89CiAgICAgIG5ldyBUeXBlTWFzay5ub25OdWxsRXhhY3QoY29tbW9uRWxlbWVudHMuanNVSW50MzFDbGFzcywgX2Nsb3NlZFdvcmxkKTsKCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgZ2V0IHBvc2l0aXZlSW50VHlwZSA9PgogICAgICBfcG9zaXRpdmVJbnRUeXBlID8/PSBuZXcgVHlwZU1hc2subm9uTnVsbFN1YmNsYXNzKAogICAgICAgICAgY29tbW9uRWxlbWVudHMuanNQb3NpdGl2ZUludENsYXNzLCBfY2xvc2VkV29ybGQpOwoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBnZXQgZG91YmxlVHlwZSA9PiBfZG91YmxlVHlwZSA/Pz0KICAgICAgbmV3IFR5cGVNYXNrLm5vbk51bGxFeGFjdChjb21tb25FbGVtZW50cy5qc0RvdWJsZUNsYXNzLCBfY2xvc2VkV29ybGQpOwoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBnZXQgbnVtVHlwZSA9PiBfbnVtVHlwZSA/Pz0KICAgICAgbmV3IFR5cGVNYXNrLm5vbk51bGxTdWJjbGFzcyhjb21tb25FbGVtZW50cy5qc051bWJlckNsYXNzLCBfY2xvc2VkV29ybGQpOwoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBnZXQgYm9vbFR5cGUgPT4gX2Jvb2xUeXBlID8/PQogICAgICBuZXcgVHlwZU1hc2subm9uTnVsbEV4YWN0KGNvbW1vbkVsZW1lbnRzLmpzQm9vbENsYXNzLCBfY2xvc2VkV29ybGQpOwoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBnZXQgZnVuY3Rpb25UeXBlID0+IF9mdW5jdGlvblR5cGUgPz89CiAgICAgIG5ldyBUeXBlTWFzay5ub25OdWxsU3VidHlwZShjb21tb25FbGVtZW50cy5mdW5jdGlvbkNsYXNzLCBfY2xvc2VkV29ybGQpOwoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBnZXQgbGlzdFR5cGUgPT4gX2xpc3RUeXBlID8/PQogICAgICBuZXcgVHlwZU1hc2subm9uTnVsbEV4YWN0KGNvbW1vbkVsZW1lbnRzLmpzQXJyYXlDbGFzcywgX2Nsb3NlZFdvcmxkKTsKCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgZ2V0IGNvbnN0TGlzdFR5cGUgPT4gX2NvbnN0TGlzdFR5cGUgPz89IG5ldyBUeXBlTWFzay5ub25OdWxsRXhhY3QoCiAgICAgIGNvbW1vbkVsZW1lbnRzLmpzVW5tb2RpZmlhYmxlQXJyYXlDbGFzcywgX2Nsb3NlZFdvcmxkKTsKCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgZ2V0IGZpeGVkTGlzdFR5cGUgPT4gX2ZpeGVkTGlzdFR5cGUgPz89CiAgICAgIG5ldyBUeXBlTWFzay5ub25OdWxsRXhhY3QoY29tbW9uRWxlbWVudHMuanNGaXhlZEFycmF5Q2xhc3MsIF9jbG9zZWRXb3JsZCk7CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIGdldCBncm93YWJsZUxpc3RUeXBlID0+CiAgICAgIF9ncm93YWJsZUxpc3RUeXBlID8/PSBuZXcgVHlwZU1hc2subm9uTnVsbEV4YWN0KAogICAgICAgICAgY29tbW9uRWxlbWVudHMuanNFeHRlbmRhYmxlQXJyYXlDbGFzcywgX2Nsb3NlZFdvcmxkKTsKCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgZ2V0IHNldFR5cGUgPT4gX3NldFR5cGUgPz89CiAgICAgIG5ldyBUeXBlTWFzay5ub25OdWxsU3VidHlwZShjb21tb25FbGVtZW50cy5zZXRMaXRlcmFsQ2xhc3MsIF9jbG9zZWRXb3JsZCk7CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIGdldCBjb25zdFNldFR5cGUgPT4gX2NvbnN0U2V0VHlwZSA/Pz0gbmV3IFR5cGVNYXNrLm5vbk51bGxTdWJ0eXBlKAogICAgICBjb21tb25FbGVtZW50cy5jb25zdFNldExpdGVyYWxDbGFzcywgX2Nsb3NlZFdvcmxkKTsKCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgZ2V0IG1hcFR5cGUgPT4gX21hcFR5cGUgPz89CiAgICAgIG5ldyBUeXBlTWFzay5ub25OdWxsU3VidHlwZShjb21tb25FbGVtZW50cy5tYXBMaXRlcmFsQ2xhc3MsIF9jbG9zZWRXb3JsZCk7CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIGdldCBjb25zdE1hcFR5cGUgPT4gX2NvbnN0TWFwVHlwZSA/Pz0gbmV3IFR5cGVNYXNrLm5vbk51bGxTdWJ0eXBlKAogICAgICBjb21tb25FbGVtZW50cy5jb25zdE1hcExpdGVyYWxDbGFzcywgX2Nsb3NlZFdvcmxkKTsKCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgZ2V0IHN0cmluZ1R5cGUgPT4gX3N0cmluZ1R5cGUgPz89CiAgICAgIG5ldyBUeXBlTWFzay5ub25OdWxsRXhhY3QoY29tbW9uRWxlbWVudHMuanNTdHJpbmdDbGFzcywgX2Nsb3NlZFdvcmxkKTsKCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgZ2V0IHR5cGVUeXBlID0+IF90eXBlVHlwZSA/Pz0KICAgICAgbmV3IFR5cGVNYXNrLm5vbk51bGxFeGFjdChjb21tb25FbGVtZW50cy50eXBlTGl0ZXJhbENsYXNzLCBfY2xvc2VkV29ybGQpOwoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBnZXQgc3luY1N0YXJJdGVyYWJsZVR5cGUgPT4gX3N5bmNTdGFySXRlcmFibGVUeXBlID8/PQogICAgICBuZXcgVHlwZU1hc2subm9uTnVsbEV4YWN0KGNvbW1vbkVsZW1lbnRzLnN5bmNTdGFySXRlcmFibGUsIF9jbG9zZWRXb3JsZCk7CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIGdldCBhc3luY0Z1dHVyZVR5cGUgPT4KICAgICAgX2FzeW5jRnV0dXJlVHlwZSA/Pz0gbmV3IFR5cGVNYXNrLm5vbk51bGxFeGFjdCgKICAgICAgICAgIGNvbW1vbkVsZW1lbnRzLmZ1dHVyZUltcGxlbWVudGF0aW9uLCBfY2xvc2VkV29ybGQpOwoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBnZXQgYXN5bmNTdGFyU3RyZWFtVHlwZSA9PiBfYXN5bmNTdGFyU3RyZWFtVHlwZSA/Pz0KICAgICAgbmV3IFR5cGVNYXNrLm5vbk51bGxFeGFjdChjb21tb25FbGVtZW50cy5jb250cm9sbGVyU3RyZWFtLCBfY2xvc2VkV29ybGQpOwoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBc3NlcnQgdGhhdCB0aGUgbnVsbCB0eXBlIGhhcyBiZWVuIHJlc29sdmVkLgogIEBvdmVycmlkZQogIFR5cGVNYXNrIGdldCBudWxsVHlwZSA9PiBfbnVsbFR5cGUgPz89IGNvbnN0IFR5cGVNYXNrLmVtcHR5KCk7CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIGdldCBlbXB0eVR5cGUgPT4gY29uc3QgVHlwZU1hc2subm9uTnVsbEVtcHR5KCk7CgogIFR5cGVNYXNrIGdldCBpbmRleGFibGVQcmltaXRpdmVUeXBlID0+CiAgICAgIF9pbmRleGFibGVQcmltaXRpdmVUeXBlID8/PSBuZXcgVHlwZU1hc2subm9uTnVsbFN1YnR5cGUoCiAgICAgICAgICBjb21tb25FbGVtZW50cy5qc0luZGV4YWJsZUNsYXNzLCBfY2xvc2VkV29ybGQpOwoKICBUeXBlTWFzayBnZXQgcmVhZGFibGVBcnJheVR5cGUgPT4gX3JlYWRhYmxlQXJyYXlUeXBlID8/PQogICAgICBuZXcgVHlwZU1hc2subm9uTnVsbFN1YmNsYXNzKGNvbW1vbkVsZW1lbnRzLmpzQXJyYXlDbGFzcywgX2Nsb3NlZFdvcmxkKTsKCiAgVHlwZU1hc2sgZ2V0IG11dGFibGVBcnJheVR5cGUgPT4KICAgICAgX211dGFibGVBcnJheVR5cGUgPz89IG5ldyBUeXBlTWFzay5ub25OdWxsU3ViY2xhc3MoCiAgICAgICAgICBjb21tb25FbGVtZW50cy5qc011dGFibGVBcnJheUNsYXNzLCBfY2xvc2VkV29ybGQpOwoKICBUeXBlTWFzayBnZXQgdW5tb2RpZmlhYmxlQXJyYXlUeXBlID0+CiAgICAgIF91bm1vZGlmaWFibGVBcnJheVR5cGUgPz89IG5ldyBUeXBlTWFzay5ub25OdWxsRXhhY3QoCiAgICAgICAgICBjb21tb25FbGVtZW50cy5qc1VubW9kaWZpYWJsZUFycmF5Q2xhc3MsIF9jbG9zZWRXb3JsZCk7CgogIFR5cGVNYXNrIGdldCBpbnRlcmNlcHRvclR5cGUgPT4KICAgICAgX2ludGVyY2VwdG9yVHlwZSA/Pz0gbmV3IFR5cGVNYXNrLm5vbk51bGxTdWJjbGFzcygKICAgICAgICAgIGNvbW1vbkVsZW1lbnRzLmpzSW50ZXJjZXB0b3JDbGFzcywgX2Nsb3NlZFdvcmxkKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzVHlwZWRBcnJheShUeXBlTWFzayBtYXNrKSB7CiAgICAvLyBKdXN0IGNoZWNraW5nIGZvciBgVHlwZWREYXRhYCBpcyBub3Qgc3VmZmljaWVudCwgYXMgaXQgaXMgYW4gYWJzdHJhY3QKICAgIC8vIGNsYXNzIGFueSB1c2VyLWRlZmluZWQgY2xhc3MgY2FuIGltcGxlbWVudC4gU28gd2UgYWxzbyBjaGVjayBmb3IgdGhlCiAgICAvLyBpbnRlcmZhY2UgYEphdmFTY3JpcHRJbmRleGluZ0JlaGF2aW9yYC4KICAgIENsYXNzRW50aXR5IHR5cGVkRGF0YUNsYXNzID0gX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLnR5cGVkRGF0YUNsYXNzOwogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZSh0eXBlZERhdGFDbGFzcyAhPSBudWxsICYmCiAgICAgICAgX2Nsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmlzSW5zdGFudGlhdGVkKHR5cGVkRGF0YUNsYXNzKSAmJgogICAgICAgIG1hc2suc2F0aXNmaWVzKHR5cGVkRGF0YUNsYXNzLCBfY2xvc2VkV29ybGQpICYmCiAgICAgICAgbWFzay5zYXRpc2ZpZXMoX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmpzSW5kZXhpbmdCZWhhdmlvckludGVyZmFjZSwKICAgICAgICAgICAgX2Nsb3NlZFdvcmxkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgY291bGRCZVR5cGVkQXJyYXkoVHlwZU1hc2sgbWFzaykgewogICAgYm9vbCBpbnRlcnNlY3RzKFR5cGVNYXNrIHR5cGUxLCBUeXBlTWFzayB0eXBlMikgPT4KICAgICAgICAhdHlwZTEuaW50ZXJzZWN0aW9uKHR5cGUyLCBfY2xvc2VkV29ybGQpLmlzRW1wdHk7CiAgICAvLyBUT0RPKGhlcmh1dCk6IE1heWJlIGNhY2hlIHRoZSBUeXBlTWFzayBmb3IgdHlwZWREYXRhQ2xhc3MgYW5kCiAgICAvLyAgICAgICAgICAgICAgIGpzSW5kZXhpbmdCZWhhdmlvdXJJbnRlcmZhY2UuCiAgICBDbGFzc0VudGl0eSB0eXBlZERhdGFDbGFzcyA9IF9jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy50eXBlZERhdGFDbGFzczsKICAgIHJldHVybiBBYnN0cmFjdEJvb2wubWF5YmVPckZhbHNlKHR5cGVkRGF0YUNsYXNzICE9IG51bGwgJiYKICAgICAgICBfY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNJbnN0YW50aWF0ZWQodHlwZWREYXRhQ2xhc3MpICYmCiAgICAgICAgaW50ZXJzZWN0cyhtYXNrLCBuZXcgVHlwZU1hc2suc3VidHlwZSh0eXBlZERhdGFDbGFzcywgX2Nsb3NlZFdvcmxkKSkgJiYKICAgICAgICBpbnRlcnNlY3RzKAogICAgICAgICAgICBtYXNrLAogICAgICAgICAgICBuZXcgVHlwZU1hc2suc3VidHlwZSgKICAgICAgICAgICAgICAgIF9jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5qc0luZGV4aW5nQmVoYXZpb3JJbnRlcmZhY2UsCiAgICAgICAgICAgICAgICBfY2xvc2VkV29ybGQpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBjcmVhdGVOb25OdWxsRXhhY3QoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gbmV3IFR5cGVNYXNrLm5vbk51bGxFeGFjdChjbHMsIF9jbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBjcmVhdGVOdWxsYWJsZUV4YWN0KENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIG5ldyBUeXBlTWFzay5leGFjdChjbHMsIF9jbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBjcmVhdGVOb25OdWxsU3ViY2xhc3MoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gbmV3IFR5cGVNYXNrLm5vbk51bGxTdWJjbGFzcyhjbHMsIF9jbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBjcmVhdGVOb25OdWxsU3VidHlwZShDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBuZXcgVHlwZU1hc2subm9uTnVsbFN1YnR5cGUoY2xzLCBfY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgY3JlYXRlTnVsbGFibGVTdWJ0eXBlKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIG5ldyBUeXBlTWFzay5zdWJ0eXBlKGNscywgX2Nsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIGV4Y2x1ZGVOdWxsKFR5cGVNYXNrIG1hc2spID0+IG1hc2subm9uTnVsbGFibGUoKTsKCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgaW5jbHVkZU51bGwoVHlwZU1hc2sgbWFzaykgPT4gbWFzay5udWxsYWJsZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgY29udGFpbnNUeXBlKFR5cGVNYXNrIHR5cGVNYXNrLCBDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBBYnN0cmFjdEJvb2wudHJ1ZU9yTWF5YmUoX2NvbnRhaW5zVHlwZSh0eXBlTWFzaywgY2xzKSk7CiAgfQoKICBib29sIF9jb250YWluc1R5cGUoVHlwZU1hc2sgdHlwZU1hc2ssIENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIF9jbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc0luc3RhbnRpYXRlZChjbHMpICYmCiAgICAgICAgdHlwZU1hc2suY29udGFpbnMoY2xzLCBfY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGNvbnRhaW5zT25seVR5cGUoVHlwZU1hc2sgdHlwZU1hc2ssIENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZShfY29udGFpbnNPbmx5VHlwZSh0eXBlTWFzaywgY2xzKSk7CiAgfQoKICBib29sIF9jb250YWluc09ubHlUeXBlKFR5cGVNYXNrIHR5cGVNYXNrLCBDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBfY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNJbnN0YW50aWF0ZWQoY2xzKSAmJgogICAgICAgIHR5cGVNYXNrLmNvbnRhaW5zT25seShjbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzSW5zdGFuY2VPZk9yTnVsbChUeXBlTWFzayB0eXBlTWFzaywgQ2xhc3NFbnRpdHkgY2xzKSA9PgogICAgICBBYnN0cmFjdEJvb2wudHJ1ZU9yTWF5YmUoX2lzSW5zdGFuY2VPZk9yTnVsbCh0eXBlTWFzaywgY2xzKSk7CgogIGJvb2wgX2lzSW5zdGFuY2VPZk9yTnVsbChUeXBlTWFzayB0eXBlTWFzaywgQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gX2Nsb3NlZFdvcmxkLmlzSW1wbGVtZW50ZWQoY2xzKSAmJgogICAgICAgIHR5cGVNYXNrLnNhdGlzZmllcyhjbHMsIF9jbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNJbnN0YW5jZU9mKAogICAgICBjb3ZhcmlhbnQgVHlwZU1hc2sgZXhwcmVzc2lvbk1hc2ssIENsYXNzRW50aXR5IGNscykgewogICAgQWJzdHJhY3RWYWx1ZSB0eXBlTWFzayA9IChjbHMgPT0gY29tbW9uRWxlbWVudHMubnVsbENsYXNzKQogICAgICAgID8gY3JlYXRlTnVsbGFibGVTdWJ0eXBlKGNscykKICAgICAgICA6IGNyZWF0ZU5vbk51bGxTdWJ0eXBlKGNscyk7CiAgICBpZiAoZXhwcmVzc2lvbk1hc2sudW5pb24odHlwZU1hc2ssIF9jbG9zZWRXb3JsZCkgPT0gdHlwZU1hc2spIHsKICAgICAgcmV0dXJuIEFic3RyYWN0Qm9vbC5UcnVlOwogICAgfSBlbHNlIGlmIChleHByZXNzaW9uTWFzay5pc0Rpc2pvaW50KHR5cGVNYXNrLCBfY2xvc2VkV29ybGQpKSB7CiAgICAgIHJldHVybiBBYnN0cmFjdEJvb2wuRmFsc2U7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gQWJzdHJhY3RCb29sLk1heWJlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzRW1wdHkoVHlwZU1hc2sgdmFsdWUpID0+CiAgICAgIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZSh2YWx1ZS5pc0VtcHR5KTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzRXhhY3QoVHlwZU1hc2sgdmFsdWUpID0+CiAgICAgIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZSh2YWx1ZS5pc0V4YWN0ICYmICF2YWx1ZS5pc051bGxhYmxlKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzRXhhY3RPck51bGwoVHlwZU1hc2sgdmFsdWUpID0+CiAgICAgIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZSh2YWx1ZS5pc0V4YWN0IHx8IF9pc051bGwodmFsdWUpKTsKCiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0RXhhY3RDbGFzcyhUeXBlTWFzayBtYXNrKSB7CiAgICByZXR1cm4gbWFzay5zaW5nbGVDbGFzcyhfY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1ByaW1pdGl2ZVZhbHVlKFR5cGVNYXNrIHZhbHVlKSA9PiB2YWx1ZS5pc1ZhbHVlOwoKICBAb3ZlcnJpZGUKICBQcmltaXRpdmVDb25zdGFudFZhbHVlIGdldFByaW1pdGl2ZVZhbHVlKFR5cGVNYXNrIG1hc2spIHsKICAgIGlmIChtYXNrLmlzVmFsdWUpIHsKICAgICAgVmFsdWVUeXBlTWFzayB2YWx1ZU1hc2sgPSBtYXNrOwogICAgICByZXR1cm4gdmFsdWVNYXNrLnZhbHVlOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNyZWF0ZVByaW1pdGl2ZVZhbHVlKAogICAgICBjb3ZhcmlhbnQgVHlwZU1hc2sgb3JpZ2luYWxWYWx1ZSwgUHJpbWl0aXZlQ29uc3RhbnRWYWx1ZSB2YWx1ZSkgewogICAgcmV0dXJuIG5ldyBWYWx1ZVR5cGVNYXNrKG9yaWdpbmFsVmFsdWUsIHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc051bGwoVHlwZU1hc2sgdmFsdWUpIHsKICAgIGlmICh2YWx1ZS5pc051bGwpIHsKICAgICAgcmV0dXJuIEFic3RyYWN0Qm9vbC5UcnVlOwogICAgfSBlbHNlIGlmICh2YWx1ZS5pc051bGxhYmxlKSB7CiAgICAgIHJldHVybiBBYnN0cmFjdEJvb2wuTWF5YmU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gQWJzdHJhY3RCb29sLkZhbHNlOwogICAgfQogIH0KCiAgYm9vbCBfaXNOdWxsKFR5cGVNYXNrIHZhbHVlKSA9PiB2YWx1ZS5pc051bGw7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc1ByaW1pdGl2ZShUeXBlTWFzayB2YWx1ZSkgewogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC5tYXliZU9yRmFsc2UoX2NhbkJlUHJpbWl0aXZlTnVtYmVyKHZhbHVlKSB8fAogICAgICAgIF9jYW5CZVByaW1pdGl2ZUFycmF5KHZhbHVlKSB8fAogICAgICAgIF9jYW5CZVByaW1pdGl2ZUJvb2xlYW4odmFsdWUpIHx8CiAgICAgICAgX2NhbkJlUHJpbWl0aXZlU3RyaW5nKHZhbHVlKSB8fAogICAgICAgIF9pc051bGwodmFsdWUpKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc1ByaW1pdGl2ZU51bWJlcihUeXBlTWFzayB2YWx1ZSkgPT4KICAgICAgQWJzdHJhY3RCb29sLm1heWJlT3JGYWxzZShfY2FuQmVQcmltaXRpdmVOdW1iZXIodmFsdWUpKTsKCiAgYm9vbCBfY2FuQmVQcmltaXRpdmVOdW1iZXIoVHlwZU1hc2sgdmFsdWUpIHsKICAgIC8vIFRPRE8oc3JhKTogSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHRlc3Qgb25seSBqc0RvdWJsZUNsYXNzIGFuZAogICAgLy8ganNVSW50MzFDbGFzcywgc2luY2UgYWxsIG90aGVycyBhcmUgc3VwZXJjbGFzc2VzIG9mIHRoZXNlIHR3by4KICAgIHJldHVybiBfY29udGFpbnNUeXBlKHZhbHVlLCBjb21tb25FbGVtZW50cy5qc051bWJlckNsYXNzKSB8fAogICAgICAgIF9jb250YWluc1R5cGUodmFsdWUsIGNvbW1vbkVsZW1lbnRzLmpzSW50Q2xhc3MpIHx8CiAgICAgICAgX2NvbnRhaW5zVHlwZSh2YWx1ZSwgY29tbW9uRWxlbWVudHMuanNQb3NpdGl2ZUludENsYXNzKSB8fAogICAgICAgIF9jb250YWluc1R5cGUodmFsdWUsIGNvbW1vbkVsZW1lbnRzLmpzVUludDMyQ2xhc3MpIHx8CiAgICAgICAgX2NvbnRhaW5zVHlwZSh2YWx1ZSwgY29tbW9uRWxlbWVudHMuanNVSW50MzFDbGFzcykgfHwKICAgICAgICBfY29udGFpbnNUeXBlKHZhbHVlLCBjb21tb25FbGVtZW50cy5qc0RvdWJsZUNsYXNzKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc1ByaW1pdGl2ZUJvb2xlYW4oVHlwZU1hc2sgdmFsdWUpID0+CiAgICAgIEFic3RyYWN0Qm9vbC5tYXliZU9yRmFsc2UoX2NhbkJlUHJpbWl0aXZlQm9vbGVhbih2YWx1ZSkpOwoKICBib29sIF9jYW5CZVByaW1pdGl2ZUJvb2xlYW4oVHlwZU1hc2sgdmFsdWUpIHsKICAgIHJldHVybiBfY29udGFpbnNUeXBlKHZhbHVlLCBjb21tb25FbGVtZW50cy5qc0Jvb2xDbGFzcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNQcmltaXRpdmVBcnJheShUeXBlTWFzayB2YWx1ZSkgPT4KICAgICAgQWJzdHJhY3RCb29sLm1heWJlT3JGYWxzZShfY2FuQmVQcmltaXRpdmVBcnJheSh2YWx1ZSkpOwoKICBib29sIF9jYW5CZVByaW1pdGl2ZUFycmF5KFR5cGVNYXNrIHZhbHVlKSB7CiAgICByZXR1cm4gX2NvbnRhaW5zVHlwZSh2YWx1ZSwgY29tbW9uRWxlbWVudHMuanNBcnJheUNsYXNzKSB8fAogICAgICAgIF9jb250YWluc1R5cGUodmFsdWUsIGNvbW1vbkVsZW1lbnRzLmpzRml4ZWRBcnJheUNsYXNzKSB8fAogICAgICAgIF9jb250YWluc1R5cGUodmFsdWUsIGNvbW1vbkVsZW1lbnRzLmpzRXh0ZW5kYWJsZUFycmF5Q2xhc3MpIHx8CiAgICAgICAgX2NvbnRhaW5zVHlwZSh2YWx1ZSwgY29tbW9uRWxlbWVudHMuanNVbm1vZGlmaWFibGVBcnJheUNsYXNzKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc0luZGV4YWJsZVByaW1pdGl2ZShUeXBlTWFzayB2YWx1ZSkgPT4KICAgICAgQWJzdHJhY3RCb29sLnRydWVPck1heWJlKF9pc0luZGV4YWJsZVByaW1pdGl2ZSh2YWx1ZSkpOwoKICBib29sIF9pc0luZGV4YWJsZVByaW1pdGl2ZShUeXBlTWFzayB2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlLmNvbnRhaW5zT25seVN0cmluZyhfY2xvc2VkV29ybGQpIHx8CiAgICAgICAgX2lzSW5zdGFuY2VPZk9yTnVsbCh2YWx1ZSwgY29tbW9uRWxlbWVudHMuanNJbmRleGFibGVDbGFzcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNGaXhlZEFycmF5KFR5cGVNYXNrIHZhbHVlKSB7CiAgICAvLyBUT0RPKHNyYSk6IFJlY29nbml6ZSB0aGUgdW5pb24gb2YgdGhlc2UgdHlwZXMgYXMgd2VsbC4KICAgIHJldHVybiBBYnN0cmFjdEJvb2wudHJ1ZU9yTWF5YmUoCiAgICAgICAgX2NvbnRhaW5zT25seVR5cGUodmFsdWUsIGNvbW1vbkVsZW1lbnRzLmpzRml4ZWRBcnJheUNsYXNzKSB8fAogICAgICAgICAgICBfY29udGFpbnNPbmx5VHlwZSh2YWx1ZSwgY29tbW9uRWxlbWVudHMuanNVbm1vZGlmaWFibGVBcnJheUNsYXNzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNFeHRlbmRhYmxlQXJyYXkoVHlwZU1hc2sgdmFsdWUpIHsKICAgIHJldHVybiBBYnN0cmFjdEJvb2wudHJ1ZU9yTWF5YmUoCiAgICAgICAgX2NvbnRhaW5zT25seVR5cGUodmFsdWUsIGNvbW1vbkVsZW1lbnRzLmpzRXh0ZW5kYWJsZUFycmF5Q2xhc3MpKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc011dGFibGVBcnJheShUeXBlTWFzayB2YWx1ZSkgewogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZSgKICAgICAgICBfaXNJbnN0YW5jZU9mT3JOdWxsKHZhbHVlLCBjb21tb25FbGVtZW50cy5qc011dGFibGVBcnJheUNsYXNzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNNdXRhYmxlSW5kZXhhYmxlKFR5cGVNYXNrIHZhbHVlKSB7CiAgICByZXR1cm4gQWJzdHJhY3RCb29sLnRydWVPck1heWJlKAogICAgICAgIF9pc0luc3RhbmNlT2ZPck51bGwodmFsdWUsIGNvbW1vbkVsZW1lbnRzLmpzTXV0YWJsZUluZGV4YWJsZUNsYXNzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNBcnJheShUeXBlTWFzayB2YWx1ZSkgewogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZSgKICAgICAgICBfaXNJbnN0YW5jZU9mT3JOdWxsKHZhbHVlLCBjb21tb25FbGVtZW50cy5qc0FycmF5Q2xhc3MpKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc1ByaW1pdGl2ZVN0cmluZyhUeXBlTWFzayB2YWx1ZSkgPT4KICAgICAgQWJzdHJhY3RCb29sLm1heWJlT3JGYWxzZShfY2FuQmVQcmltaXRpdmVTdHJpbmcodmFsdWUpKTsKCiAgYm9vbCBfY2FuQmVQcmltaXRpdmVTdHJpbmcoVHlwZU1hc2sgdmFsdWUpIHsKICAgIHJldHVybiBfY29udGFpbnNUeXBlKHZhbHVlLCBjb21tb25FbGVtZW50cy5qc1N0cmluZ0NsYXNzKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc0ludGVnZXIoVHlwZU1hc2sgdmFsdWUpIHsKICAgIHJldHVybiBBYnN0cmFjdEJvb2wudHJ1ZU9yTWF5YmUoCiAgICAgICAgdmFsdWUuY29udGFpbnNPbmx5SW50KF9jbG9zZWRXb3JsZCkgJiYgIXZhbHVlLmlzTnVsbGFibGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzVUludDMyKFR5cGVNYXNrIHZhbHVlKSB7CiAgICByZXR1cm4gQWJzdHJhY3RCb29sLnRydWVPck1heWJlKCF2YWx1ZS5pc051bGxhYmxlICYmCiAgICAgICAgX2lzSW5zdGFuY2VPZk9yTnVsbCh2YWx1ZSwgY29tbW9uRWxlbWVudHMuanNVSW50MzJDbGFzcykpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzVUludDMxKFR5cGVNYXNrIHZhbHVlKSB7CiAgICByZXR1cm4gQWJzdHJhY3RCb29sLnRydWVPck1heWJlKCF2YWx1ZS5pc051bGxhYmxlICYmCiAgICAgICAgX2lzSW5zdGFuY2VPZk9yTnVsbCh2YWx1ZSwgY29tbW9uRWxlbWVudHMuanNVSW50MzFDbGFzcykpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzUG9zaXRpdmVJbnRlZ2VyKFR5cGVNYXNrIHZhbHVlKSB7CiAgICByZXR1cm4gQWJzdHJhY3RCb29sLnRydWVPck1heWJlKCF2YWx1ZS5pc051bGxhYmxlICYmCiAgICAgICAgX2lzSW5zdGFuY2VPZk9yTnVsbCh2YWx1ZSwgY29tbW9uRWxlbWVudHMuanNQb3NpdGl2ZUludENsYXNzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNQb3NpdGl2ZUludGVnZXJPck51bGwoVHlwZU1hc2sgdmFsdWUpIHsKICAgIHJldHVybiBBYnN0cmFjdEJvb2wudHJ1ZU9yTWF5YmUoCiAgICAgICAgX2lzSW5zdGFuY2VPZk9yTnVsbCh2YWx1ZSwgY29tbW9uRWxlbWVudHMuanNQb3NpdGl2ZUludENsYXNzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNJbnRlZ2VyT3JOdWxsKFR5cGVNYXNrIHZhbHVlKSB7CiAgICByZXR1cm4gQWJzdHJhY3RCb29sLnRydWVPck1heWJlKHZhbHVlLmNvbnRhaW5zT25seUludChfY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc051bWJlcihUeXBlTWFzayB2YWx1ZSkgewogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZSgKICAgICAgICB2YWx1ZS5jb250YWluc09ubHlOdW0oX2Nsb3NlZFdvcmxkKSAmJiAhdmFsdWUuaXNOdWxsYWJsZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNOdW1iZXJPck51bGwoVHlwZU1hc2sgdmFsdWUpID0+CiAgICAgIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZShfaXNOdW1iZXJPck51bGwodmFsdWUpKTsKCiAgYm9vbCBfaXNOdW1iZXJPck51bGwoVHlwZU1hc2sgdmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZS5jb250YWluc09ubHlOdW0oX2Nsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc0RvdWJsZShUeXBlTWFzayB2YWx1ZSkgewogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZSgKICAgICAgICB2YWx1ZS5jb250YWluc09ubHlEb3VibGUoX2Nsb3NlZFdvcmxkKSAmJiAhdmFsdWUuaXNOdWxsYWJsZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNEb3VibGVPck51bGwoVHlwZU1hc2sgdmFsdWUpIHsKICAgIHJldHVybiBBYnN0cmFjdEJvb2wudHJ1ZU9yTWF5YmUodmFsdWUuY29udGFpbnNPbmx5RG91YmxlKF9jbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzQm9vbGVhbihUeXBlTWFzayB2YWx1ZSkgewogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZSgKICAgICAgICB2YWx1ZS5jb250YWluc09ubHlCb29sKF9jbG9zZWRXb3JsZCkgJiYgIXZhbHVlLmlzTnVsbGFibGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzQm9vbGVhbk9yTnVsbChUeXBlTWFzayB2YWx1ZSkgPT4KICAgICAgQWJzdHJhY3RCb29sLnRydWVPck1heWJlKF9pc0Jvb2xlYW5Pck51bGwodmFsdWUpKTsKCiAgYm9vbCBfaXNCb29sZWFuT3JOdWxsKFR5cGVNYXNrIHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUuY29udGFpbnNPbmx5Qm9vbChfY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzU3RyaW5nKFR5cGVNYXNrIHZhbHVlKSB7CiAgICByZXR1cm4gQWJzdHJhY3RCb29sLnRydWVPck1heWJlKAogICAgICAgIHZhbHVlLmNvbnRhaW5zT25seVN0cmluZyhfY2xvc2VkV29ybGQpICYmICF2YWx1ZS5pc051bGxhYmxlKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc1N0cmluZ09yTnVsbChUeXBlTWFzayB2YWx1ZSkgewogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZSh2YWx1ZS5jb250YWluc09ubHlTdHJpbmcoX2Nsb3NlZFdvcmxkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNQcmltaXRpdmVPck51bGwoVHlwZU1hc2sgdmFsdWUpID0+CiAgICAgIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZShfaXNQcmltaXRpdmVPck51bGwodmFsdWUpKTsKCiAgYm9vbCBfaXNQcmltaXRpdmVPck51bGwoVHlwZU1hc2sgdmFsdWUpIHsKICAgIHJldHVybiBfaXNJbmRleGFibGVQcmltaXRpdmUodmFsdWUpIHx8CiAgICAgICAgX2lzTnVtYmVyT3JOdWxsKHZhbHVlKSB8fAogICAgICAgIF9pc0Jvb2xlYW5Pck51bGwodmFsdWUpIHx8CiAgICAgICAgX2lzTnVsbCh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayB1bmlvbihUeXBlTWFzayBhLCBUeXBlTWFzayBiKSA9PiBhLnVuaW9uKGIsIF9jbG9zZWRXb3JsZCk7CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIGludGVyc2VjdGlvbihUeXBlTWFzayBhLCBUeXBlTWFzayBiKSA9PgogICAgICBhLmludGVyc2VjdGlvbihiLCBfY2xvc2VkV29ybGQpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgYXJlRGlzam9pbnQoVHlwZU1hc2sgYSwgVHlwZU1hc2sgYikgPT4KICAgICAgQWJzdHJhY3RCb29sLnRydWVPck1heWJlKGEuaXNEaXNqb2ludChiLCBfY2xvc2VkV29ybGQpKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGNvbnRhaW5zQWxsKFR5cGVNYXNrIGEpID0+CiAgICAgIEFic3RyYWN0Qm9vbC5tYXliZU9yRmFsc2UoYS5jb250YWluc0FsbChfY2xvc2VkV29ybGQpKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlQWJzdHJhY3RWYWx1ZUZvckNvbnN0YW50KENvbnN0YW50VmFsdWUgdmFsdWUpIHsKICAgIHJldHVybiBjb21wdXRlVHlwZU1hc2soX2Nsb3NlZFdvcmxkLCB2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldE1hcEtleVR5cGUoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgewogICAgaWYgKHZhbHVlIGlzIE1hcFR5cGVNYXNrKSB7CiAgICAgIHJldHVybiB2YWx1ZS5rZXlUeXBlOwogICAgfQogICAgcmV0dXJuIGR5bmFtaWNUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBnZXRNYXBWYWx1ZVR5cGUoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgewogICAgaWYgKHZhbHVlIGlzIE1hcFR5cGVNYXNrKSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEFzc2VydCB0aGUgYHZhbHVlLnZhbHVlVHlwZWAgaXMgbm90IG51bGwuCiAgICAgIHJldHVybiB2YWx1ZS52YWx1ZVR5cGUgPz8gZHluYW1pY1R5cGU7CiAgICB9CiAgICByZXR1cm4gZHluYW1pY1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldENvbnRhaW5lckVsZW1lbnRUeXBlKEFic3RyYWN0VmFsdWUgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSBpcyBDb250YWluZXJUeXBlTWFzaykgewogICAgICByZXR1cm4gdmFsdWUuZWxlbWVudFR5cGUgPz8gZHluYW1pY1R5cGU7CiAgICB9CiAgICByZXR1cm4gZHluYW1pY1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0Q29udGFpbmVyTGVuZ3RoKEFic3RyYWN0VmFsdWUgdmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZSBpcyBDb250YWluZXJUeXBlTWFzayA/IHZhbHVlLmxlbmd0aCA6IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNyZWF0ZUNvbnRhaW5lclZhbHVlKAogICAgICBBYnN0cmFjdFZhbHVlIGZvcndhcmRUbywKICAgICAgT2JqZWN0IGFsbG9jYXRpb25Ob2RlLAogICAgICBNZW1iZXJFbnRpdHkgYWxsb2NhdGlvbkVsZW1lbnQsCiAgICAgIEFic3RyYWN0VmFsdWUgZWxlbWVudFR5cGUsCiAgICAgIGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgQ29udGFpbmVyVHlwZU1hc2soCiAgICAgICAgZm9yd2FyZFRvLCBhbGxvY2F0aW9uTm9kZSwgYWxsb2NhdGlvbkVsZW1lbnQsIGVsZW1lbnRUeXBlLCBsZW5ndGgpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB1bmlvbk9mTWFueShJdGVyYWJsZTxBYnN0cmFjdFZhbHVlPiB2YWx1ZXMpIHsKICAgIFR5cGVNYXNrIHJlc3VsdCA9IGNvbnN0IFR5cGVNYXNrLm5vbk51bGxFbXB0eSgpOwogICAgZm9yIChUeXBlTWFzayB2YWx1ZSBpbiB2YWx1ZXMpIHsKICAgICAgcmVzdWx0ID0gcmVzdWx0LnVuaW9uKHZhbHVlLCBfY2xvc2VkV29ybGQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVJlY2VpdmVyKEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gbWVtYmVycykgewogICAgYXNzZXJ0KF9jbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeQogICAgICAgIC5oYXNBbnlTdHJpY3RTdWJjbGFzcyhfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MpKTsKICAgIHJldHVybiBuZXcgVHlwZU1hc2sudW5pb25PZigKICAgICAgICBtZW1iZXJzLmV4cGFuZCgoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgICAgICAgIENsYXNzRW50aXR5IGNscyA9IGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3M7CiAgICAgICAgICByZXR1cm4gW2Nsc10uLmFkZEFsbChfY2xvc2VkV29ybGQubWl4aW5Vc2VzT2YoY2xzKSk7CiAgICAgICAgfSkubWFwKChjbHMpIHsKICAgICAgICAgIGlmIChfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuanNOdWxsQ2xhc3MgPT0gY2xzKSB7CiAgICAgICAgICAgIHJldHVybiBjb25zdCBUeXBlTWFzay5lbXB0eSgpOwogICAgICAgICAgfSBlbHNlIGlmIChfY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNJbnN0YW50aWF0ZWQoY2xzKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFR5cGVNYXNrLm5vbk51bGxTdWJjbGFzcyhjbHMsIF9jbG9zZWRXb3JsZCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBdm9pZCB0aGUgbmVlZCBmb3IgdGhpcyBjYXNlLgogICAgICAgICAgICByZXR1cm4gY29uc3QgVHlwZU1hc2suZW1wdHkoKTsKICAgICAgICAgIH0KICAgICAgICB9KSwKICAgICAgICBfY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzVGFyZ2V0aW5nTWVtYmVyKAogICAgICBjb3ZhcmlhbnQgVHlwZU1hc2sgcmVjZWl2ZXIsIE1lbWJlckVudGl0eSBtZW1iZXIsIE5hbWUgbmFtZSkgewogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC5tYXliZU9yRmFsc2UoCiAgICAgICAgcmVjZWl2ZXIuY2FuSGl0KG1lbWJlciwgbmFtZSwgX2Nsb3NlZFdvcmxkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgbmVlZHNOb1N1Y2hNZXRob2RIYW5kbGluZygKICAgICAgY292YXJpYW50IFR5cGVNYXNrIHJlY2VpdmVyLCBTZWxlY3RvciBzZWxlY3RvcikgewogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC50cnVlT3JGYWxzZSgKICAgICAgICByZWNlaXZlci5uZWVkc05vU3VjaE1ldGhvZEhhbmRsaW5nKHNlbGVjdG9yLCBfY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBjb250YWlucygKICAgICAgY292YXJpYW50IFR5cGVNYXNrIHN1cGVyc2V0LCBjb3ZhcmlhbnQgVHlwZU1hc2sgc3Vic2V0KSB7CiAgICByZXR1cm4gQWJzdHJhY3RCb29sLm1heWJlT3JGYWxzZSgKICAgICAgICBzdXBlcnNldC5jb250YWluc01hc2soc3Vic2V0LCBfY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc0luKGNvdmFyaWFudCBUeXBlTWFzayBzdWJzZXQsIGNvdmFyaWFudCBUeXBlTWFzayBzdXBlcnNldCkgewogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZShzdWJzZXQuaXNJbk1hc2soc3VwZXJzZXQsIF9jbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyRW50aXR5IGxvY2F0ZVNpbmdsZU1lbWJlcigKICAgICAgY292YXJpYW50IFR5cGVNYXNrIHJlY2VpdmVyLCBTZWxlY3RvciBzZWxlY3RvcikgewogICAgcmV0dXJuIHJlY2VpdmVyLmxvY2F0ZVNpbmdsZU1lbWJlcihzZWxlY3RvciwgX2Nsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc0pzSW5kZXhhYmxlKFR5cGVNYXNrIG1hc2spIHsKICAgIHJldHVybiBBYnN0cmFjdEJvb2wudHJ1ZU9yTWF5YmUobWFzay5zYXRpc2ZpZXMoCiAgICAgICAgX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmpzSW5kZXhhYmxlQ2xhc3MsIF9jbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzSnNJbmRleGFibGVBbmRJdGVyYWJsZShjb3ZhcmlhbnQgVHlwZU1hc2sgbWFzaykgewogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZShtYXNrICE9IG51bGwgJiYKICAgICAgICBtYXNrLnNhdGlzZmllcygKICAgICAgICAgICAgX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmpzSW5kZXhhYmxlQ2xhc3MsIF9jbG9zZWRXb3JsZCkgJiYKICAgICAgICAvLyBTdHJpbmcgaXMgaW5kZXhhYmxlIGJ1dCBub3QgaXRlcmFibGUuCiAgICAgICAgIW1hc2suc2F0aXNmaWVzKAogICAgICAgICAgICBfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuanNTdHJpbmdDbGFzcywgX2Nsb3NlZFdvcmxkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNGaXhlZExlbmd0aEpzSW5kZXhhYmxlKGNvdmFyaWFudCBUeXBlTWFzayBtYXNrKSB7CiAgICBpZiAobWFzay5pc0NvbnRhaW5lciAmJiAobWFzayBhcyBDb250YWluZXJUeXBlTWFzaykubGVuZ3RoICE9IG51bGwpIHsKICAgICAgLy8gQSBjb250YWluZXIgb24gd2hpY2ggd2UgaGF2ZSBpbmZlcnJlZCB0aGUgbGVuZ3RoLgogICAgICByZXR1cm4gQWJzdHJhY3RCb29sLlRydWU7CiAgICB9CiAgICAvLyBUT0RPKHNyYSk6IFJlY29nbml6ZSBhbnkgY29tYmluYXRpb24gb2YgZml4ZWQgbGVuZ3RoIGluZGV4YWJsZXMuCiAgICBpZiAobWFzay5jb250YWluc09ubHkoX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmpzRml4ZWRBcnJheUNsYXNzKSB8fAogICAgICAgIG1hc2suY29udGFpbnNPbmx5KAogICAgICAgICAgICBfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuanNVbm1vZGlmaWFibGVBcnJheUNsYXNzKSB8fAogICAgICAgIG1hc2suY29udGFpbnNPbmx5U3RyaW5nKF9jbG9zZWRXb3JsZCkgfHwKICAgICAgICBfY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5pc1R5cGVkQXJyYXkobWFzaykuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICByZXR1cm4gQWJzdHJhY3RCb29sLlRydWU7CiAgICB9CiAgICByZXR1cm4gQWJzdHJhY3RCb29sLk1heWJlOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzSW50ZXJjZXB0b3IoVHlwZU1hc2sgdmFsdWUpIHsKICAgIHJldHVybiBBYnN0cmFjdEJvb2wubWF5YmVPckZhbHNlKAogICAgICAgICFpbnRlcmNlcHRvclR5cGUuaXNEaXNqb2ludCh2YWx1ZSwgX2Nsb3NlZFdvcmxkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzTWFwKFR5cGVNYXNrIHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUuaXNNYXA7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzU2V0KFR5cGVNYXNrIHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUuaXNTZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzQ29udGFpbmVyKFR5cGVNYXNrIHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUuaXNDb250YWluZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzRGljdGlvbmFyeShUeXBlTWFzayB2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlLmlzRGljdGlvbmFyeTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNEaWN0aW9uYXJ5S2V5KEFic3RyYWN0VmFsdWUgdmFsdWUsIFN0cmluZyBrZXkpIHsKICAgIHJldHVybiB2YWx1ZSBpcyBEaWN0aW9uYXJ5VHlwZU1hc2sgJiYgdmFsdWUuY29udGFpbnNLZXkoa2V5KTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0RGljdGlvbmFyeVZhbHVlRm9yS2V5KEFic3RyYWN0VmFsdWUgdmFsdWUsIFN0cmluZyBrZXkpIHsKICAgIGlmICh2YWx1ZSBpcyBEaWN0aW9uYXJ5VHlwZU1hc2spIHJldHVybiB2YWx1ZS5nZXRWYWx1ZUZvcktleShrZXkpOwogICAgcmV0dXJuIGR5bmFtaWNUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjcmVhdGVNYXBWYWx1ZShBYnN0cmFjdFZhbHVlIGZvcndhcmRUbywgT2JqZWN0IGFsbG9jYXRpb25Ob2RlLAogICAgICBNZW1iZXJFbnRpdHkgYWxsb2NhdGlvbkVsZW1lbnQsIEFic3RyYWN0VmFsdWUga2V5LCBBYnN0cmFjdFZhbHVlIHZhbHVlKSB7CiAgICByZXR1cm4gbmV3IE1hcFR5cGVNYXNrKAogICAgICAgIGZvcndhcmRUbywgYWxsb2NhdGlvbk5vZGUsIGFsbG9jYXRpb25FbGVtZW50LCBrZXksIHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY3JlYXRlRGljdGlvbmFyeVZhbHVlKAogICAgICBBYnN0cmFjdFZhbHVlIGZvcndhcmRUbywKICAgICAgT2JqZWN0IGFsbG9jYXRpb25Ob2RlLAogICAgICBNZW1iZXJFbnRpdHkgYWxsb2NhdGlvbkVsZW1lbnQsCiAgICAgIEFic3RyYWN0VmFsdWUga2V5LAogICAgICBBYnN0cmFjdFZhbHVlIHZhbHVlLAogICAgICBNYXA8U3RyaW5nLCBBYnN0cmFjdFZhbHVlPiBtYXBwaW5ncykgewogICAgcmV0dXJuIG5ldyBEaWN0aW9uYXJ5VHlwZU1hc2soCiAgICAgICAgZm9yd2FyZFRvLCBhbGxvY2F0aW9uTm9kZSwgYWxsb2NhdGlvbkVsZW1lbnQsIGtleSwgdmFsdWUsIG1hcHBpbmdzKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY3JlYXRlU2V0VmFsdWUoQWJzdHJhY3RWYWx1ZSBmb3J3YXJkVG8sIE9iamVjdCBhbGxvY2F0aW9uTm9kZSwKICAgICAgTWVtYmVyRW50aXR5IGFsbG9jYXRpb25FbGVtZW50LCBBYnN0cmFjdFZhbHVlIGVsZW1lbnRUeXBlKSB7CiAgICByZXR1cm4gbmV3IFNldFR5cGVNYXNrKAogICAgICAgIGZvcndhcmRUbywgYWxsb2NhdGlvbk5vZGUsIGFsbG9jYXRpb25FbGVtZW50LCBlbGVtZW50VHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldFNldEVsZW1lbnRUeXBlKEFic3RyYWN0VmFsdWUgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSBpcyBTZXRUeXBlTWFzaykgewogICAgICByZXR1cm4gdmFsdWUuZWxlbWVudFR5cGUgPz8gZHluYW1pY1R5cGU7CiAgICB9CiAgICByZXR1cm4gZHluYW1pY1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzU3BlY2lhbGl6YXRpb25PZigKICAgICAgQWJzdHJhY3RWYWx1ZSBzcGVjaWFsaXphdGlvbiwgQWJzdHJhY3RWYWx1ZSBnZW5lcmFsaXphdGlvbikgewogICAgcmV0dXJuIHNwZWNpYWxpemF0aW9uIGlzIEZvcndhcmRpbmdUeXBlTWFzayAmJgogICAgICAgIHNwZWNpYWxpemF0aW9uLmZvcndhcmRUbyA9PSBnZW5lcmFsaXphdGlvbjsKICB9CgogIEBvdmVycmlkZQogIE9iamVjdCBnZXRBbGxvY2F0aW9uTm9kZShBYnN0cmFjdFZhbHVlIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgaXMgQWxsb2NhdGlvblR5cGVNYXNrKSB7CiAgICAgIHJldHVybiB2YWx1ZS5hbGxvY2F0aW9uTm9kZTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyRW50aXR5IGdldEFsbG9jYXRpb25FbGVtZW50KEFic3RyYWN0VmFsdWUgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSBpcyBBbGxvY2F0aW9uVHlwZU1hc2spIHsKICAgICAgcmV0dXJuIHZhbHVlLmFsbG9jYXRpb25FbGVtZW50OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldEdlbmVyYWxpemF0aW9uKEFic3RyYWN0VmFsdWUgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSBpcyBBbGxvY2F0aW9uVHlwZU1hc2spIHsKICAgICAgcmV0dXJuIHZhbHVlLmZvcndhcmRUbzsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBnZXRBYnN0cmFjdFZhbHVlRm9yTmF0aXZlTWV0aG9kUGFyYW1ldGVyVHlwZShEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIGlmICh0eXBlLnR5cGVBcmd1bWVudHMuaXNOb3RFbXB0eSkgcmV0dXJuIG51bGw7CiAgICAgIC8vIFRPRE8oc3JhKTogQ29uc2lkZXIgdXNpbmcgYSBzdHJlbmd0aGVuZWQgdHlwZSBjaGVjayB0byBhdm9pZCBwYXNzaW5nCiAgICAgIC8vIGBudWxsYCB0byBwcmltaXRpdmUgdHlwZXMgc2luY2UgdGhlIG5hdGl2ZSBtZXRob2RzIHVzdWFsbHkgaGF2ZQogICAgICAvLyBub24tbnVsbGFibGUgcHJpbWl0aXZlIHBhcmFtZXRlciB0eXBlcy4KICAgICAgcmV0dXJuIGNyZWF0ZU51bGxhYmxlU3VidHlwZSh0eXBlLmVsZW1lbnQpOwogICAgfQogICAgaWYgKHR5cGUgaXMgRHluYW1pY1R5cGUpIHJldHVybiBkeW5hbWljVHlwZTsKICAgIC8vIFRPRE8oc3JhKTogQ29udmVydCBvdGhlciBbRGFydFR5cGVdcyB0byBbQWJzdHJhY3RWYWx1ZV1zCiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXRDb21wYWN0VGV4dChBYnN0cmFjdFZhbHVlIHZhbHVlKSB7CiAgICByZXR1cm4gZm9ybWF0VHlwZSh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayByZWFkQWJzdHJhY3RWYWx1ZUZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICByZXR1cm4gc291cmNlLnJlYWRDYWNoZWQ8VHlwZU1hc2s+KAogICAgICAgICgpID0+IG5ldyBUeXBlTWFzay5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlLCBfY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVBYnN0cmFjdFZhbHVlVG9EYXRhU2luayhEYXRhU2luayBzaW5rLCBjb3ZhcmlhbnQgVHlwZU1hc2sgdmFsdWUpIHsKICAgIHNpbmsud3JpdGVDYWNoZWQ8VHlwZU1hc2s+KAogICAgICAgIHZhbHVlLCAoVHlwZU1hc2sgdmFsdWUpID0+IHZhbHVlLndyaXRlVG9EYXRhU2luayhzaW5rKSk7CiAgfQp9CgovLy8gQ29udmVydCB0aGUgZ2l2ZW4gVHlwZU1hc2sgdG8gYSBjb21wYWN0IHN0cmluZyBmb3JtYXQuCi8vLwovLy8gVGhlIGRlZmF1bHQgZm9ybWF0IGlzIHRvbyB2ZXJib3NlIGZvciB0aGUgZ3JhcGggZm9ybWF0IHNpbmNlIGxvbmcgc3RyaW5ncwovLy8gY3JlYXRlIG9ibG9uZyBub2RlcyB0aGF0IG9ic3RydWN0IHRoZSBncmFwaCBsYXlvdXQuClN0cmluZyBmb3JtYXRUeXBlKFR5cGVNYXNrIHR5cGUpIHsKICBpZiAodHlwZSBpcyBGbGF0VHlwZU1hc2spIHsKICAgIC8vIFRPRE8oYXNnZXJmKTogRGlzYW1iaWd1YXRlIGNsYXNzZXMgd2hvc2UgbmFtZSBpcyBub3QgdW5pcXVlLiBVc2luZyB0aGUKICAgIC8vICAgICBsaWJyYXJ5IG5hbWUgZm9yIGFsbCBjbGFzc2VzIGlzIG5vdCBhIGdvb2QgaWRlYSwgc2luY2UgbGlicmFyeSBuYW1lcwogICAgLy8gICAgIGNhbiBiZSByZWFsbHkgbG9uZyBhbmQgbWVzcyB1cCB0aGUgbGF5b3V0LgogICAgLy8gQ2FwaXRhbGl6ZSBOdWxsIHRvIGVtcGhhc2l6ZSB0aGF0IGl0J3MgdGhlIG51bGwgdHlwZSBtYXNrIGFuZCBub3QKICAgIC8vIGEgbnVsbCB2YWx1ZSB3ZSBhY2NpZGVudGFsbHkgcHJpbnRlZCBvdXQuCiAgICBpZiAodHlwZS5pc0VtcHR5T3JOdWxsKSByZXR1cm4gdHlwZS5pc051bGxhYmxlID8gJ051bGwnIDogJ0VtcHR5JzsKICAgIFN0cmluZyBudWxsRmxhZyA9IHR5cGUuaXNOdWxsYWJsZSA/ICc/JyA6ICcnOwogICAgU3RyaW5nIHN1YkZsYWcgPSB0eXBlLmlzRXhhY3QgPyAnJyA6IHR5cGUuaXNTdWJjbGFzcyA/ICcrJyA6ICcqJzsKICAgIHJldHVybiAnJHt0eXBlLmJhc2UubmFtZX0kbnVsbEZsYWckc3ViRmxhZyc7CiAgfQogIGlmICh0eXBlIGlzIFVuaW9uVHlwZU1hc2spIHsKICAgIHJldHVybiB0eXBlLmRpc2pvaW50TWFza3MubWFwKGZvcm1hdFR5cGUpLmpvaW4oJyB8ICcpOwogIH0KICBpZiAodHlwZSBpcyBDb250YWluZXJUeXBlTWFzaykgewogICAgU3RyaW5nIGNvbnRhaW5lciA9IGZvcm1hdFR5cGUodHlwZS5mb3J3YXJkVG8pOwogICAg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aWMgYWxsb2NhdGlvbiBzaXRlIG9mIGEgY29udGFpbmVyIChjdXJyZW50bHkgb25seQovLy8gTGlzdCkgdGhhdCB3aWxsIGdldCBzcGVjaWFsaXplZCBvbmNlIHRoZSBbVHlwZUdyYXBoSW5mZXJyZXJdIHBoYXNlIGZpbmRzIGFuCi8vLyBlbGVtZW50IHR5cGUgZm9yIGl0LgpjbGFzcyBDb250YWluZXJUeXBlTWFzayBleHRlbmRzIEFsbG9jYXRpb25UeXBlTWFzayB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtDb250YWluZXJUeXBlTWFza10gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdjb250YWluZXItdHlwZS1tYXNrJzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgVHlwZU1hc2sgZm9yd2FyZFRvOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBpci5Ob2RlIGFsbG9jYXRpb25Ob2RlOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBNZW1iZXJFbnRpdHkgYWxsb2NhdGlvbkVsZW1lbnQ7CgogIC8vIFRoZSBlbGVtZW50IHR5cGUgb2YgdGhpcyBjb250YWluZXIuCiAgZmluYWwgVHlwZU1hc2sgZWxlbWVudFR5cGU7CgogIC8vIFRoZSBsZW5ndGggb2YgdGhlIGNvbnRhaW5lci4KICBmaW5hbCBpbnQgbGVuZ3RoOwoKICBDb250YWluZXJUeXBlTWFzayh0aGlzLmZvcndhcmRUbywgdGhpcy5hbGxvY2F0aW9uTm9kZSwgdGhpcy5hbGxvY2F0aW9uRWxlbWVudCwKICAgICAgdGhpcy5lbGVtZW50VHlwZSwgdGhpcy5sZW5ndGgpOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW0NvbnRhaW5lclR5cGVNYXNrXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IENvbnRhaW5lclR5cGVNYXNrLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgRGF0YVNvdXJjZSBzb3VyY2UsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBUeXBlTWFzayBmb3J3YXJkVG8gPSBuZXcgVHlwZU1hc2sucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSwgY2xvc2VkV29ybGQpOwogICAgaXIuVHJlZU5vZGUgYWxsb2NhdGlvbk5vZGUgPSBzb3VyY2UucmVhZFRyZWVOb2RlT3JOdWxsKCk7CiAgICBNZW1iZXJFbnRpdHkgYWxsb2NhdGlvbkVsZW1lbnQgPSBzb3VyY2UucmVhZE1lbWJlck9yTnVsbCgpOwogICAgVHlwZU1hc2sgZWxlbWVudFR5cGUgPSBuZXcgVHlwZU1hc2sucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSwgY2xvc2VkV29ybGQpOwogICAgaW50IGxlbmd0aCA9IHNvdXJjZS5yZWFkSW50T3JOdWxsKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IENvbnRhaW5lclR5cGVNYXNrKAogICAgICAgIGZvcndhcmRUbywgYWxsb2NhdGlvbk5vZGUsIGFsbG9jYXRpb25FbGVtZW50LCBlbGVtZW50VHlwZSwgbGVuZ3RoKTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0NvbnRhaW5lclR5cGVNYXNrXSB0byBbc2lua10uCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oVHlwZU1hc2tLaW5kLmNvbnRhaW5lcik7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBmb3J3YXJkVG8ud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay53cml0ZVRyZWVOb2RlT3JOdWxsKGFsbG9jYXRpb25Ob2RlKTsKICAgIHNpbmsud3JpdGVNZW1iZXJPck51bGwoYWxsb2NhdGlvbkVsZW1lbnQpOwogICAgZWxlbWVudFR5cGUud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay53cml0ZUludE9yTnVsbChsZW5ndGgpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIG51bGxhYmxlKCkgewogICAgcmV0dXJuIGlzTnVsbGFibGUKICAgICAgICA/IHRoaXMKICAgICAgICA6IG5ldyBDb250YWluZXJUeXBlTWFzayhmb3J3YXJkVG8ubnVsbGFibGUoKSwgYWxsb2NhdGlvbk5vZGUsCiAgICAgICAgICAgIGFsbG9jYXRpb25FbGVtZW50LCBlbGVtZW50VHlwZSwgbGVuZ3RoKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIG5vbk51bGxhYmxlKCkgewogICAgcmV0dXJuIGlzTnVsbGFibGUKICAgICAgICA/IG5ldyBDb250YWluZXJUeXBlTWFzayhmb3J3YXJkVG8ubm9uTnVsbGFibGUoKSwgYWxsb2NhdGlvbk5vZGUsCiAgICAgICAgICAgIGFsbG9jYXRpb25FbGVtZW50LCBlbGVtZW50VHlwZSwgbGVuZ3RoKQogICAgICAgIDogdGhpczsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQ29udGFpbmVyID0+IHRydWU7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFeGFjdCA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGVxdWFsc0Rpc3JlZ2FyZE51bGwob3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyEgQ29udGFpbmVyVHlwZU1hc2spIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBzdXBlci5lcXVhbHNEaXNyZWdhcmROdWxsKG90aGVyKSAmJgogICAgICAgIGFsbG9jYXRpb25Ob2RlID09IG90aGVyLmFsbG9jYXRpb25Ob2RlICYmCiAgICAgICAgZWxlbWVudFR5cGUgPT0gb3RoZXIuZWxlbWVudFR5cGUgJiYKICAgICAgICBsZW5ndGggPT0gb3RoZXIubGVuZ3RoOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgaW50ZXJzZWN0aW9uKFR5cGVNYXNrIG90aGVyLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIFR5cGVNYXNrIGZvcndhcmRJbnRlcnNlY3Rpb24gPSBmb3J3YXJkVG8uaW50ZXJzZWN0aW9uKG90aGVyLCBjbG9zZWRXb3JsZCk7CiAgICBpZiAoZm9yd2FyZEludGVyc2VjdGlvbi5pc0VtcHR5T3JOdWxsKSByZXR1cm4gZm9yd2FyZEludGVyc2VjdGlvbjsKICAgIHJldHVybiBmb3J3YXJkSW50ZXJzZWN0aW9uLmlzTnVsbGFibGUgPyBudWxsYWJsZSgpIDogbm9uTnVsbGFibGUoKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIHVuaW9uKGR5bmFtaWMgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgaWYgKHRoaXMgPT0gb3RoZXIpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9IGVsc2UgaWYgKGVxdWFsc0Rpc3JlZ2FyZE51bGwob3RoZXIpKSB7CiAgICAgIHJldHVybiBvdGhlci5pc051bGxhYmxlID8gb3RoZXIgOiB0aGlzOwogICAgfSBlbHNlIGlmIChvdGhlci5pc0VtcHR5T3JOdWxsKSB7CiAgICAgIHJldHVybiBvdGhlci5pc051bGxhYmxlID8gdGhpcy5udWxsYWJsZSgpIDogdGhpczsKICAgIH0gZWxzZSBpZiAob3RoZXIuaXNDb250YWluZXIgJiYKICAgICAgICBlbGVtZW50VHlwZSAhPSBudWxsICYmCiAgICAgICAgb3RoZXIuZWxlbWVudFR5cGUgIT0gbnVsbCkgewogICAgICBUeXBlTWFzayBuZXdFbGVtZW50VHlwZSA9CiAgICAgICAgICBlbGVtZW50VHlwZS51bmlvbihvdGhlci5lbGVtZW50VHlwZSwgY2xvc2VkV29ybGQpOwogICAgICBpbnQgbmV3TGVuZ3RoID0gKGxlbmd0aCA9PSBvdGhlci5sZW5ndGgpID8gbGVuZ3RoIDogbnVsbDsKICAgICAgVHlwZU1hc2sgbmV3Rm9yd2FyZFRvID0gZm9yd2FyZFRvLnVuaW9uKG90aGVyLmZvcndhcmRUbywgY2xvc2VkV29ybGQpOwogICAgICByZXR1cm4gbmV3IENvbnRhaW5lclR5cGVNYXNrKAogICAgICAgICAgbmV3Rm9yd2FyZFRvLAogICAgICAgICAgYWxsb2NhdGlvbk5vZGUgPT0gb3RoZXIuYWxsb2NhdGlvbk5vZGUgPyBhbGxvY2F0aW9uTm9kZSA6IG51bGwsCiAgICAgICAgICBhbGxvY2F0aW9uRWxlbWVudCA9PSBvdGhlci5hbGxvY2F0aW9uRWxlbWVudAogICAgICAgICAgICAgID8gYWxsb2NhdGlvbkVsZW1lbnQKICAgICAgICAgICAgICA6IG51bGwsCiAgICAgICAgICBuZXdFbGVtZW50VHlwZSwKICAgICAgICAgIG5ld0xlbmd0aCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZm9yd2FyZFRvLnVuaW9uKG90aGVyLCBjbG9zZWRXb3JsZCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSA9PiBzdXBlciA9PSBvdGhlcjsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICByZXR1cm4gY29tcHV0ZUhhc2hDb2RlKAogICAgICAgIGFsbG9jYXRpb25Ob2RlLCBpc051bGxhYmxlLCBlbGVtZW50VHlwZSwgbGVuZ3RoLCBmb3J3YXJkVG8pOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICdDb250YWluZXIoJGZvcndhcmRUbywgZWxlbWVudDogJGVsZW1lbnRUeXBlLCBsZW5ndGg6ICRsZW5ndGgpJzsKICB9Cn0KgIwATk48AQ8BT1AZNUsdMwEMHAEMIAEMKAEpHgEiFAFRJgE/MDUXTz5AUSkVIkwEATUMKCwVJS4vJyETBAEMGBYPRjUEAQwbFkk0EAQBDCAMHAEMJDMvMiwgBAEMRE9HSAQBDDwZEy0uJjgkHyUgPUBNJBhKNyIWGhYNMgYEAQwtAQwVHEUEAQwWTAQCAUBwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci90eXBlbWFza3MvY29udGFpbmVyX3R5cGVfbWFzay5kYXJ0SnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2luZmVycmVyL3R5cGVtYXNrcy9kaWN0aW9uYXJ5X3R5cGVfbWFzay5kYXJ0lrsvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBtYXNrczsKCi8vLyBBIFtEaWN0aW9uYXJ5VHlwZU1hc2tdIGlzIGEgW1R5cGVNYXNrXSBmb3IgYSBzcGVjaWZpYyBhbGxvY2F0aW9uCi8vLyBzaXRlIG9mIGEgbWFwIChjdXJyZW50bHkgb25seSBpbnRlcm5hbCBNYXAgY2xhc3MpIHRoYXQgaXMgdXNlZCBhcwovLy8gYSBkaWN0aW9uYXJ5LCBpLmUuIGEgbWFwcGluZyBmcm9tIGEgc2V0IG9mIHN0YXRpY2FsbHkga25vd24gc3RyaW5ncwovLy8gdG8gdmFsdWVzLiBUaGVzZSB0eXBlbWFza3Mgb25seSBjb21lIGludG8gZXhpc3RlbmNlIGFmdGVyIHRoZQovLy8gW1R5cGVHcmFwaEluZmVycmVyXSBoYXMgc3VjY2Vzc2Z1bGx5IGlkZW50aWZpZWQgc3VjaCBhIHVzYWdlLiBPdGhlcndpc2UsCi8vLyB0aGUgbW9yZSBnZW5lcmFsIFtNYXBUeXBlTWFza10gaXMgdXNlZC4KY2xhc3MgRGljdGlvbmFyeVR5cGVNYXNrIGV4dGVuZHMgTWFwVHlwZU1hc2sgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbRGljdGlvbmFyeVR5cGVNYXNrXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2RpY3Rpb25hcnktdHlwZS1tYXNrJzsKCiAgLy8gVGhlIHVuZGVybHlpbmcga2V5L3ZhbHVlIG1hcCBvZiB0aGlzIGRpY3Rpb25hcnkuCiAgZmluYWwgTWFwPFN0cmluZywgQWJzdHJhY3RWYWx1ZT4gX3R5cGVNYXA7CgogIERpY3Rpb25hcnlUeXBlTWFzaygKICAgICAgVHlwZU1hc2sgZm9yd2FyZFRvLAogICAgICBpci5Ob2RlIGFsbG9jYXRpb25Ob2RlLAogICAgICBNZW1iZXJFbnRpdHkgYWxsb2NhdGlvbkVsZW1lbnQsCiAgICAgIFR5cGVNYXNrIGtleVR5cGUsCiAgICAgIFR5cGVNYXNrIHZhbHVlVHlwZSwKICAgICAgdGhpcy5fdHlwZU1hcCkKICAgICAgOiBzdXBlcihmb3J3YXJkVG8sIGFsbG9jYXRpb25Ob2RlLCBhbGxvY2F0aW9uRWxlbWVudCwga2V5VHlwZSwgdmFsdWVUeXBlKTsKCiAgLy8vIERlc2VyaWFsaXplcyBhIFtEaWN0aW9uYXJ5VHlwZU1hc2tdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgRGljdGlvbmFyeVR5cGVNYXNrLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgRGF0YVNvdXJjZSBzb3VyY2UsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBUeXBlTWFzayBmb3J3YXJkVG8gPSBuZXcgVHlwZU1hc2sucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSwgY2xvc2VkV29ybGQpOwogICAgaXIuVHJlZU5vZGUgYWxsb2NhdGlvbk5vZGUgPSBzb3VyY2UucmVhZFRyZWVOb2RlT3JOdWxsKCk7CiAgICBNZW1iZXJFbnRpdHkgYWxsb2NhdGlvbkVsZW1lbnQgPSBzb3VyY2UucmVhZE1lbWJlck9yTnVsbCgpOwogICAgVHlwZU1hc2sga2V5VHlwZSA9IG5ldyBUeXBlTWFzay5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlLCBjbG9zZWRXb3JsZCk7CiAgICBUeXBlTWFzayB2YWx1ZVR5cGUgPSBuZXcgVHlwZU1hc2sucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSwgY2xvc2VkV29ybGQpOwogICAgTWFwPFN0cmluZywgQWJzdHJhY3RWYWx1ZT4gdHlwZU1hcCA9IHNvdXJjZS5yZWFkU3RyaW5nTWFwKAogICAgICAgICgpID0+IG5ldyBUeXBlTWFzay5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlLCBjbG9zZWRXb3JsZCkpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBEaWN0aW9uYXJ5VHlwZU1hc2soZm9yd2FyZFRvLCBhbGxvY2F0aW9uTm9kZSwgYWxsb2NhdGlvbkVsZW1lbnQsCiAgICAgICAga2V5VHlwZSwgdmFsdWVUeXBlLCB0eXBlTWFwKTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0RpY3Rpb25hcnlUeXBlTWFza10gdG8gW3NpbmtdLgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKFR5cGVNYXNrS2luZC5kaWN0aW9uYXJ5KTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIGZvcndhcmRUby53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLndyaXRlVHJlZU5vZGVPck51bGwoYWxsb2NhdGlvbk5vZGUpOwogICAgc2luay53cml0ZU1lbWJlck9yTnVsbChhbGxvY2F0aW9uRWxlbWVudCk7CiAgICBrZXlUeXBlLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIHZhbHVlVHlwZS53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLndyaXRlU3RyaW5nTWFwKF90eXBlTWFwLCAoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgewogICAgICBUeXBlTWFzayB0eXBlTWFzayA9IHZhbHVlOwogICAgICB0eXBlTWFzay53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICB9KTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBudWxsYWJsZSgpIHsKICAgIHJldHVybiBpc051bGxhYmxlCiAgICAgICAgPyB0aGlzCiAgICAgICAgOiBuZXcgRGljdGlvbmFyeVR5cGVNYXNrKGZvcndhcmRUby5udWxsYWJsZSgpLCBhbGxvY2F0aW9uTm9kZSwKICAgICAgICAgICAgYWxsb2NhdGlvbkVsZW1lbnQsIGtleVR5cGUsIHZhbHVlVHlwZSwgX3R5cGVNYXApOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgbm9uTnVsbGFibGUoKSB7CiAgICByZXR1cm4gaXNOdWxsYWJsZQogICAgICAgID8gbmV3IERpY3Rpb25hcnlUeXBlTWFzayhmb3J3YXJkVG8ubm9uTnVsbGFibGUoKSwgYWxsb2NhdGlvbk5vZGUsCiAgICAgICAgICAgIGFsbG9jYXRpb25FbGVtZW50LCBrZXlUeXBlLCB2YWx1ZVR5cGUsIF90eXBlTWFwKQogICAgICAgIDogdGhpczsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRGljdGlvbmFyeSA9PiB0cnVlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRXhhY3QgPT4gdHJ1ZTsKCiAgYm9vbCBjb250YWluc0tleShTdHJpbmcga2V5KSA9PiBfdHlwZU1hcC5jb250YWluc0tleShrZXkpOwoKICBUeXBlTWFzayBnZXRWYWx1ZUZvcktleShTdHJpbmcga2V5KSA9PiBfdHlwZU1hcFtrZXldOwoKICBAb3ZlcnJpZGUKICBib29sIGVxdWFsc0Rpc3JlZ2FyZE51bGwob3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyEgRGljdGlvbmFyeVR5cGVNYXNrKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gYWxsb2NhdGlvbk5vZGUgPT0gb3RoZXIuYWxsb2NhdGlvbk5vZGUgJiYKICAgICAgICBrZXlUeXBlID09IG90aGVyLmtleVR5cGUgJiYKICAgICAgICB2YWx1ZVR5cGUgPT0gb3RoZXIudmFsdWVUeXBlICYmCiAgICAgICAgX3R5cGVNYXAua2V5cy5ldmVyeSgoaykgPT4gb3RoZXIuX3R5cGVNYXAuY29udGFpbnNLZXkoaykpICYmCiAgICAgICAgb3RoZXIuX3R5cGVNYXAua2V5cy5ldmVyeSgKICAgICAgICAgICAgKGspID0+IF90eXBlTWFwLmNvbnRhaW5zS2V5KGspICYmIF90eXBlTWFwW2tdID09IG90aGVyLl90eXBlTWFwW2tdKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIGludGVyc2VjdGlvbihUeXBlTWFzayBvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBUeXBlTWFzayBmb3J3YXJkSW50ZXJzZWN0aW9uID0gZm9yd2FyZFRvLmludGVyc2VjdGlvbihvdGhlciwgY2xvc2VkV29ybGQpOwogICAgaWYgKGZvcndhcmRJbnRlcnNlY3Rpb24uaXNFbXB0eU9yTnVsbCkgcmV0dXJuIGZvcndhcmRJbnRlcnNlY3Rpb247CiAgICByZXR1cm4gZm9yd2FyZEludGVyc2VjdGlvbi5pc051bGxhYmxlID8gbnVsbGFibGUoKSA6IG5vbk51bGxhYmxlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayB1bmlvbihkeW5hbWljIG90aGVyLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGlmICh0aGlzID09IG90aGVyKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSBlbHNlIGlmIChlcXVhbHNEaXNyZWdhcmROdWxsKG90aGVyKSkgewogICAgICByZXR1cm4gb3RoZXIuaXNOdWxsYWJsZSA/IG90aGVyIDogdGhpczsKICAgIH0gZWxzZSBpZiAob3RoZXIuaXNFbXB0eU9yTnVsbCkgewogICAgICByZXR1cm4gb3RoZXIuaXNOdWxsYWJsZSA/IHRoaXMubnVsbGFibGUoKSA6IHRoaXM7CiAgICB9IGVsc2UgaWYgKG90aGVyLmlzRGljdGlvbmFyeSkgewogICAgICBUeXBlTWFzayBuZXdGb3J3YXJkVG8gPSBmb3J3YXJkVG8udW5pb24ob3RoZXIuZm9yd2FyZFRvLCBjbG9zZWRXb3JsZCk7CiAgICAgIFR5cGVNYXNrIG5ld0tleVR5cGUgPSBrZXlUeXBlLnVuaW9uKG90aGVyLmtleVR5cGUsIGNsb3NlZFdvcmxkKTsKICAgICAgVHlwZU1hc2sgbmV3VmFsdWVUeXBlID0gdmFsdWVUeXBlLnVuaW9uKG90aGVyLnZhbHVlVHlwZSwgY2xvc2VkV29ybGQpOwogICAgICBNYXA8U3RyaW5nLCBUeXBlTWFzaz4gbWFwcGluZ3MgPSA8U3RyaW5nLCBUeXBlTWFzaz57fTsKICAgICAgX3R5cGVNYXAuZm9yRWFjaCgoaywgZHluYW1pYyB2KSB7CiAgICAgICAgaWYgKCFvdGhlci5fdHlwZU1hcC5jb250YWluc0tleShrKSkgewogICAgICAgICAgbWFwcGluZ3Nba10gPSB2Lm51bGxhYmxlKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgb3RoZXIuX3R5cGVNYXAuZm9yRWFjaCgoaywgdikgewogICAgICAgIGlmIChfdHlwZU1hcC5jb250YWluc0tleShrKSkgewogICAgICAgICAgbWFwcGluZ3Nba10gPSB2LnVuaW9uKF90eXBlTWFwW2tdLCBjbG9zZWRXb3JsZCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG1hcHBpbmdzW2tdID0gdi5udWxsYWJsZSgpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiBuZXcgRGljdGlvbmFyeVR5cGVNYXNrKAogICAgICAgICAgbmV3Rm9yd2FyZFRvLCBudWxsLCBudWxsLCBuZXdLZXlUeXBlLCBuZXdWYWx1ZVR5cGUsIG1hcHBpbmdzKTsKICAgIH0gZWxzZSBpZiAob3RoZXIuaXNNYXAgJiYKICAgICAgICAob3RoZXIua2V5VHlwZSAhPSBudWxsKSAmJgogICAgICAgIChvdGhlci52YWx1ZVR5cGUgIT0gbnVsbCkpIHsKICAgICAgVHlwZU1hc2sgbmV3Rm9yd2FyZFRvID0gZm9yd2FyZFRvLnVuaW9uKG90aGVyLmZvcndhcmRUbywgY2xvc2VkV29ybGQpOwogICAgICBUeXBlTWFzayBuZXdLZXlUeXBlID0ga2V5VHlwZS51bmlvbihvdGhlci5rZXlUeXBlLCBjbG9zZWRXb3JsZCk7CiAgICAgIFR5cGVNYXNrIG5ld1ZhbHVlVHlwZSA9IHZhbHVlVHlwZS51bmlvbihvdGhlci52YWx1ZVR5cGUsIGNsb3NlZFdvcmxkKTsKICAgICAgcmV0dXJuIG5ldyBNYXBUeXBlTWFzaygKICAgICAgICAgIG5ld0ZvcndhcmRUbywgbnVsbCwgbnVsbCwgbmV3S2V5VHlwZSwgbmV3VmFsdWVUeXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmb3J3YXJkVG8udW5pb24ob3RoZXIsIGNsb3NlZFdvcmxkKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+IHN1cGVyID09IG90aGVyOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIHJldHVybiBjb21wdXRlSGFzaENvZGUoYWxsb2NhdGlvbk5vZGUsIGlzTnVsbGFibGUsIF90eXBlTWFwLCBmb3J3YXJkVG8pOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICdEaWN0aW9uYXJ5KCRmb3J3YXJkVG8sIGtleTogJGtleVR5cGUsICcKICAgICAgICAndmFsdWU6ICR2YWx1ZVR5cGUsIG1hcDogJF90eXBlTWFwKSc7CiAgfQp9CoChAE5OPAEPAUVGSEJNLC9MHTQBNi0BFhoeJhgaFVEBQDE1F08+QE1PP0UVUCYEATYMKC0VJS4vIyU6ISYIEwQBDBgWD0c+BAEMGxZKPRAEAQwhDBwBPQE4AQwkNDUkKEUjUQQBDERPR0gEAQw8GRMtLiY4JU1HTT0oLiYKCiYnOxEmCgolSR4jJU1HTR4/DTIGBAEMLQEMFU0EAQwWNC4EAgFBcGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvdHlwZW1hc2tzL2RpY3Rpb25hcnlfdHlwZV9tYXNrLmRhcnREc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaW5mZXJyZXIvdHlwZW1hc2tzL2ZsYXRfdHlwZV9tYXNrLmRhcnTAAF6zLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgbWFza3M7CgovLy8gQSBmbGF0IHR5cGUgbWFzayBpcyBhIHR5cGUgbWFzayB0aGF0IGhhcyBiZWVuIGZsYXR0ZW5lZCB0byBjb250YWluIGEKLy8vIGJhc2UgdHlwZS4KY2xhc3MgRmxhdFR5cGVNYXNrIGltcGxlbWVudHMgVHlwZU1hc2sgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbRmxhdFR5cGVNYXNrXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2ZsYXQtdHlwZS1tYXNrJzsKCiAgc3RhdGljIGNvbnN0IGludCBFTVBUWSA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBFWEFDVCA9IDE7CiAgc3RhdGljIGNvbnN0IGludCBTVUJDTEFTUyA9IDI7CiAgc3RhdGljIGNvbnN0IGludCBTVUJUWVBFID0gMzsKCiAgZmluYWwgQ2xhc3NFbnRpdHkgYmFzZTsKICBmaW5hbCBpbnQgZmxhZ3M7CgogIEZsYXRUeXBlTWFzayhDbGFzc0VudGl0eSBiYXNlLCBpbnQga2luZCwgYm9vbCBpc051bGxhYmxlKQogICAgICA6IHRoaXMuaW50ZXJuYWwoYmFzZSwgKGtpbmQgPDwgMSkgfCAoaXNOdWxsYWJsZSA/IDEgOiAwKSk7CgogIEZsYXRUeXBlTWFzay5leGFjdChDbGFzc0VudGl0eSBiYXNlKSA6IHRoaXMuaW50ZXJuYWwoYmFzZSwgKEVYQUNUIDw8IDEpIHwgMSk7CiAgRmxhdFR5cGVNYXNrLnN1YmNsYXNzKENsYXNzRW50aXR5IGJhc2UpCiAgICAgIDogdGhpcy5pbnRlcm5hbChiYXNlLCAoU1VCQ0xBU1MgPDwgMSkgfCAxKTsKICBGbGF0VHlwZU1hc2suc3VidHlwZShDbGFzc0VudGl0eSBiYXNlKQogICAgICA6IHRoaXMuaW50ZXJuYWwoYmFzZSwgKFNVQlRZUEUgPDwgMSkgfCAxKTsKCiAgY29uc3QgRmxhdFR5cGVNYXNrLm5vbk51bGxFbXB0eSgpCiAgICAgIDogYmFzZSA9IG51bGwsCiAgICAgICAgZmxhZ3MgPSAwOwogIGNvbnN0IEZsYXRUeXBlTWFzay5lbXB0eSgpCiAgICAgIDogYmFzZSA9IG51bGwsCiAgICAgICAgZmxhZ3MgPSAxOwoKICBGbGF0VHlwZU1hc2subm9uTnVsbEV4YWN0KENsYXNzRW50aXR5IGJhc2UpIDogdGhpcy5pbnRlcm5hbChiYXNlLCBFWEFDVCA8PCAxKTsKICBGbGF0VHlwZU1hc2subm9uTnVsbFN1YmNsYXNzKENsYXNzRW50aXR5IGJhc2UpCiAgICAgIDogdGhpcy5pbnRlcm5hbChiYXNlLCBTVUJDTEFTUyA8PCAxKTsKICBGbGF0VHlwZU1hc2subm9uTnVsbFN1YnR5cGUoQ2xhc3NFbnRpdHkgYmFzZSkKICAgICAgOiB0aGlzLmludGVybmFsKGJhc2UsIFNVQlRZUEUgPDwgMSk7CgogIEZsYXRUeXBlTWFzay5pbnRlcm5hbCh0aGlzLmJhc2UsIHRoaXMuZmxhZ3MpOwoKICAvLy8gRW5zdXJlcyB0aGF0IHRoZSBnZW5lcmF0ZWQgbWFzayBpcyBub3JtYWxpemVkLCBpLmUuLCBhIGNhbGwgdG8KICAvLy8gW1R5cGVNYXNrLmFzc2VydElzTm9ybWFsaXplZF0gd2l0aCB0aGUgZmFjdG9yeSdzIHJlc3VsdCByZXR1cm5zIGB0cnVlYC4KICBmYWN0b3J5IEZsYXRUeXBlTWFzay5ub3JtYWxpemVkKAogICAgICBDbGFzc0VudGl0eSBiYXNlLCBpbnQgZmxhZ3MsIEpDbG9zZWRXb3JsZCB3b3JsZCkgewogICAgaWYgKChmbGFncyA+PiAxKSA9PSBFTVBUWSB8fCAoKGZsYWdzID4+IDEpID09IEVYQUNUKSkgewogICAgICByZXR1cm4gbmV3IEZsYXRUeXBlTWFzay5pbnRlcm5hbChiYXNlLCBmbGFncyk7CiAgICB9CiAgICBpZiAoKGZsYWdzID4+IDEpID09IFNVQlRZUEUpIHsKICAgICAgaWYgKCF3b3JsZC5jbGFzc0hpZXJhcmNoeS5oYXNBbnlTdHJpY3RTdWJ0eXBlKGJhc2UpIHx8CiAgICAgICAgICB3b3JsZC5jbGFzc0hpZXJhcmNoeS5oYXNPbmx5U3ViY2xhc3NlcyhiYXNlKSkgewogICAgICAgIGZsYWdzID0gKGZsYWdzICYgMHgxKSB8IChTVUJDTEFTUyA8PCAxKTsKICAgICAgfQogICAgfQogICAgaWYgKCgoZmxhZ3MgPj4gMSkgPT0gU1VCQ0xBU1MpICYmCiAgICAgICAgIXdvcmxkLmNsYXNzSGllcmFyY2h5Lmhhc0FueVN0cmljdFN1YmNsYXNzKGJhc2UpKSB7CiAgICAgIGZsYWdzID0gKGZsYWdzICYgMHgxKSB8IChFWEFDVCA8PCAxKTsKICAgIH0KICAgIENvbW1vbk1hc2tzIGNvbW1vbk1hc2tzID0gd29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbjsKICAgIHJldHVybiBjb21tb25NYXNrcy5nZXRDYWNoZWRNYXNrKAogICAgICAgIGJhc2UsIGZsYWdzLCAoKSA9PiBuZXcgRmxhdFR5cGVNYXNrLmludGVybmFsKGJhc2UsIGZsYWdzKSk7CiAgfQoKICAvLy8gRGVzZXJpYWxpemVzIGEgW0ZsYXRUeXBlTWFza10gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBGbGF0VHlwZU1hc2sucmVhZEZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIENsYXNzRW50aXR5IGJhc2UgPSBzb3VyY2UucmVhZENsYXNzT3JOdWxsKCk7CiAgICBpbnQgZmxhZ3MgPSBzb3VyY2UucmVhZEludCgpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgQ29tbW9uTWFza3MgY29tbW9uTWFza3MgPSBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluOwogICAgcmV0dXJuIGNvbW1vbk1hc2tzLmdldENhY2hlZE1hc2soCiAgICAgICAgYmFzZSwgZmxhZ3MsICgpID0+IG5ldyBGbGF0VHlwZU1hc2suaW50ZXJuYWwoYmFzZSwgZmxhZ3MpKTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0ZsYXRUeXBlTWFza10gdG8gW3NpbmtdLgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKFR5cGVNYXNrS2luZC5mbGF0KTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVDbGFzc09yTnVsbChiYXNlKTsKICAgIHNpbmsud3JpdGVJbnQoZmxhZ3MpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIENsYXNzUXVlcnkgZ2V0IF9jbGFzc1F1ZXJ5ID0+IGlzRXhhY3QKICAgICAgPyBDbGFzc1F1ZXJ5LkVYQUNUCiAgICAgIDogKGlzU3ViY2xhc3MgPyBDbGFzc1F1ZXJ5LlNVQkNMQVNTIDogQ2xhc3NRdWVyeS5TVUJUWVBFKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBpc0VtcHR5T3JOdWxsICYmICFpc051bGxhYmxlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTnVsbCA9PiBpc0VtcHR5T3JOdWxsICYmIGlzTnVsbGFibGU7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFbXB0eU9yTnVsbCA9PiAoZmxhZ3MgPj4gMSkgPT0gRU1QVFk7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFeGFjdCA9PiAoZmxhZ3MgPj4gMSkgPT0gRVhBQ1Q7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOdWxsYWJsZSA9PiAoZmxhZ3MgJiAxKSAhPSAwOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1VuaW9uID0+IGZhbHNlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQ29udGFpbmVyID0+IGZhbHNlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU2V0ID0+IGZhbHNlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTWFwID0+IGZhbHNlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRGljdGlvbmFyeSA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0ZvcndhcmRpbmcgPT4gZmFsc2U7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNWYWx1ZSA9PiBmYWxzZTsKCiAgLy8gVE9ETyhrYXNwZXJsKTogR2V0IHJpZCBvZiB0aGVzZS4gVGhleSBzaG91bGQgbm90IGJlIGEgdmlzaWJsZQogIC8vIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIGJlY2F1c2UgdGhleSBtYWtlIGl0IGhhcmQgdG8gYWRkCiAgLy8gcHJvcGVyIHVuaW9uIHR5cGVzIGlmIHdlIGV2ZXIgd2FudCB0by4KICBib29sIGdldCBpc1N1YmNsYXNzID0+IChmbGFncyA+PiAxKSA9PSBTVUJDTEFTUzsKICBib29sIGdldCBpc1N1YnR5cGUgPT4gKGZsYWdzID4+IDEpID09IFNVQlRZUEU7CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIG51bGxhYmxlKCkgewogICAgcmV0dXJuIGlzTnVsbGFibGUgPyB0aGlzIDogbmV3IEZsYXRUeXBlTWFzay5pbnRlcm5hbChiYXNlLCBmbGFncyB8IDEpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgbm9uTnVsbGFibGUoKSB7CiAgICByZXR1cm4gaXNOdWxsYWJsZSA/IG5ldyBGbGF0VHlwZU1hc2suaW50ZXJuYWwoYmFzZSwgZmxhZ3MgJiB+MSkgOiB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWlucyhDbGFzc0VudGl0eSBvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBpZiAoaXNFbXB0eU9yTnVsbCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbChiYXNlLCBvdGhlcikpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgaWYgKGlzRXhhY3QpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIGlmIChpc1N1YmNsYXNzKSB7CiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc1N1YmNsYXNzT2Yob3RoZXIsIGJhc2UpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KGlzU3VidHlwZSk7CiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc1N1YnR5cGVPZihvdGhlciwgYmFzZSk7CiAgICB9CiAgfQoKICBib29sIGlzU2luZ2xlSW1wbGVtZW50YXRpb25PZihDbGFzc0VudGl0eSBjbHMsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgLy8gU3BlY2lhbCBjYXNlIGJhc2ljIHR5cGVzIHNvIHRoYXQsIGZvciBleGFtcGxlLCBKU1N0cmluZyBpcyB0aGUKICAgIC8vIHNpbmdsZSBpbXBsZW1lbnRhdGlvbiBvZiBTdHJpbmcuCiAgICAvLyBUaGUgZ2VuZXJhbCBvcHRpbWl6YXRpb24gaXMgdG8gcmVhbGl6ZSB0aGVyZSBpcyBvbmx5IG9uZSBjbGFzcyB0aGF0CiAgICAvLyBpbXBsZW1lbnRzIFtiYXNlXSBhbmQgW2Jhc2VdIGlzIG5vdCBpbnN0YW50aWF0ZWQuIFdlIGhvd2V2ZXIgZG8KICAgIC8vIG5vdCB0cmFjayBjb3JyZWN0bHkgdGhlIGxpc3Qgb2YgdHJ1bHkgaW5zdGFudGlhdGVkIGNsYXNzZXMuCiAgICBDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cyA9IGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzOwogICAgaWYgKGNvbnRhaW5zT25seVN0cmluZyhjbG9zZWRXb3JsZCkpIHsKICAgICAgcmV0dXJuIGNscyA9PSBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5zdHJpbmdDbGFzcyB8fAogICAgICAgICAgY2xzID09IGNvbW1vbkVsZW1lbnRzLmpzU3RyaW5nQ2xhc3M7CiAgICB9CiAgICBpZiAoY29udGFpbnNPbmx5Qm9vbChjbG9zZWRXb3JsZCkpIHsKICAgICAgcmV0dXJuIGNscyA9PSBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5ib29sQ2xhc3MgfHwKICAgICAgICAgIGNscyA9PSBjb21tb25FbGVtZW50cy5qc0Jvb2xDbGFzczsKICAgIH0KICAgIGlmIChjb250YWluc09ubHlJbnQoY2xvc2VkV29ybGQpKSB7CiAgICAgIHJldHVybiBjbHMgPT0gY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuaW50Q2xhc3MgfHwKICAgICAgICAgIGNscyA9PSBjb21tb25FbGVtZW50cy5qc0ludENsYXNzIHx8CiAgICAgICAgICBjbHMgPT0gY29tbW9uRWxlbWVudHMuanNQb3NpdGl2ZUludENsYXNzIHx8CiAgICAgICAgICBjbHMgPT0gY29tbW9uRWxlbWVudHMuanNVSW50MzJDbGFzcyB8fAogICAgICAgICAgY2xzID09IGNvbW1vbkVsZW1lbnRzLmpzVUludDMxQ2xhc3M7CiAgICB9CiAgICBpZiAoY29udGFpbnNPbmx5RG91YmxlKGNsb3NlZFdvcmxkKSkgewogICAgICByZXR1cm4gY2xzID09IGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmRvdWJsZUNsYXNzIHx8CiAgICAgICAgICBjbHMgPT0gY29tbW9uRWxlbWVudHMuanNEb3VibGVDbGFzczsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNJbk1hc2soVHlwZU1hc2sgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgaWYgKGlzRW1wdHlPck51bGwpIHJldHVybiBpc051bGxhYmxlID8gb3RoZXIuaXNOdWxsYWJsZSA6IHRydWU7CiAgICAvLyBUaGUgZW1wdHkgdHlwZSBjb250YWlucyBubyBjbGFzc2VzLgogICAgaWYgKG90aGVyLmlzRW1wdHlPck51bGwpIHJldHVybiBmYWxzZTsKICAgIC8vIFF1aWNrIGNoZWNrIHdoZXRoZXIgdG8gaGFuZGxlIG51bGwuCiAgICBpZiAoaXNOdWxsYWJsZSAmJiAhb3RoZXIuaXNOdWxsYWJsZSkgcmV0dXJuIGZhbHNlOwogICAgb3RoZXIgPSBUeXBlTWFzay5ub25Gb3J3YXJkaW5nTWFzayhvdGhlcik7CiAgICAvLyBJZiBvdGhlciBpcyB1bmlvbiwgZGVsZWdhdGUgdG8gVW5pb25UeXBlTWFzay5jb250YWluc01hc2suCiAgICBpZiAob3RoZXIgaXMhIEZsYXRUeXBlTWFzaykgcmV0dXJuIG90aGVyLmNvbnRhaW5zTWFzayh0aGlzLCBjbG9zZWRXb3JsZCk7CiAgICAvLyBUaGUgb3RoZXIgbXVzdCBiZSBmbGF0LCBzbyBjb21wYXJlIGJhc2UgYW5kIGZsYWdzLgogICAgRmxhdFR5cGVNYXNrIGZsYXRPdGhlciA9IG90aGVyOwogICAgQ2xhc3NFbnRpdHkgb3RoZXJCYXNlID0gZmxhdE90aGVyLmJhc2U7CiAgICAvLyBJZiBvdGhlciBpcyBleGFjdCwgaXQgb25seSBjb250YWlucyBpdHMgYmFzZS4KICAgIC8vIFRPRE8oaGVyaHV0KTogR2V0IHJpZCBvZiBpc1NpbmdsZUltcGxlbWVudGF0aW9uT2YuCiAgICBpZiAoZmxhdE90aGVyLmlzRXhhY3QpIHsKICAgICAgcmV0dXJuIChpc0V4YWN0ICYmIGJhc2UgPT0gb3RoZXJCYXNlKSB8fAogICAgICAgICAgaXNTaW5nbGVJbXBsZW1lbnRhdGlvbk9mKG90aGVyQmFzZSwgY2xvc2VkV29ybGQpOwogICAgfQogICAgLy8gSWYgb3RoZXIgaXMgc3ViY2xhc3MsIHRoaXMgaGFzIHRvIGJlIHN1YmNsYXNzLCBhcyB3ZWxsLiBVbmxlc3MKICAgIC8vIGZsYXRPdGhlci5iYXNlIGNvdmVycyBhbGwgc3VidHlwZXMgb2YgdGhpcy4gQ3VycmVudGx5LCB3ZSBvbmx5CiAgICAvLyBjb25zaWRlciBvYmplY3QgdG8gYmVoYXZlIHRoYXQgd2F5LgogICAgLy8gVE9ETyhoZXJodXQpOiBBZGQgY2hlY2sgd2hldGhlciBmbGF0T3RoZXIuYmFzZSBpcyBzdXBlcmNsYXNzIG9mCiAgICAvLyAgICAgICAgICAgICAgIGFsbCBzdWJjbGFzc2VzIG9mIHRoaXMuYmFzZS4KICAgIGlmIChmbGF0T3RoZXIuaXNTdWJjbGFzcykgewogICAgICBpZiAoaXNTdWJ0eXBlKQogICAgICAgIHJldHVybiAob3RoZXJCYXNlID09IGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKTsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmlzU3ViY2xhc3NPZihiYXNlLCBvdGhlckJhc2UpOwogICAgfQogICAgYXNzZXJ0KGZsYXRPdGhlci5pc1N1YnR5cGUpOwogICAgLy8gQ2hlY2sgd2hldGhlciB0aGlzIFR5cGVNYXNrIHNhdGlzZmllcyBvdGhlckJhc2UncyBpbnRlcmZhY2UuCiAgICByZXR1cm4gc2F0aXNmaWVzKG90aGVyQmFzZSwgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc01hc2soVHlwZU1hc2sgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIG90aGVyLmlzSW5NYXNrKHRoaXMsIGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNPbmx5SW50KEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMgPSBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50czsKICAgIHJldHVybiBiYXNlID09IGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmludENsYXNzIHx8CiAgICAgICAgYmFzZSA9PSBjb21tb25FbGVtZW50cy5qc0ludENsYXNzIHx8CiAgICAgICAgYmFzZSA9PSBjb21tb25FbGVtZW50cy5qc1Bvc2l0aXZlSW50Q2xhc3MgfHwKICAgICAgICBiYXNlID09IGNvbW1vbkVsZW1lbnRzLmpzVUludDMxQ2xhc3MgfHwKICAgICAgICBiYXNlID09IGNvbW1vbkVsZW1lbnRzLmpzVUludDMyQ2xhc3M7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zT25seURvdWJsZShKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBiYXNlID09IGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmRvdWJsZUNsYXNzIHx8CiAgICAgICAgYmFzZSA9PSBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5qc0RvdWJsZUNsYXNzOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc09ubHlOdW0oSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gY29udGFpbnNPbmx5SW50KGNsb3NlZFdvcmxkKSB8fAogICAgICAgIGNvbnRhaW5zT25seURvdWJsZShjbG9zZWRXb3JsZCkgfHwKICAgICAgICBiYXNlID09IGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLm51bUNsYXNzIHx8CiAgICAgICAgYmFzZSA9PSBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5qc051bWJlckNsYXNzOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc09ubHlCb29sKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGJhc2UgPT0gY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuYm9vbENsYXNzIHx8CiAgICAgICAgYmFzZSA9PSBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5qc0Jvb2xDbGFzczsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNPbmx5U3RyaW5nKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGJhc2UgPT0gY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuc3RyaW5nQ2xhc3MgfHwKICAgICAgICBiYXNlID09IGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmpzU3RyaW5nQ2xhc3M7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zT25seShDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBiYXNlID09IGNsczsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgc2F0aXNmaWVzKENsYXNzRW50aXR5IGNscywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBpZiAoaXNFbXB0eU9yTnVsbCkgcmV0dXJuIGZhbHNlOwogICAgaWYgKGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmlzU3VidHlwZU9mKGJhc2UsIGNscykpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgc2luZ2xlQ2xhc3MoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBpZiAoaXNFbXB0eU9yTnVsbCkgcmV0dXJuIG51bGw7CiAgICBpZiAoaXNOdWxsYWJsZSkgcmV0dXJuIG51bGw7IC8vIEl0IGlzIE51bGwgYW5kIHNvbWUgb3RoZXIgY2xhc3MuCiAgICBpZiAoaXNFeGFjdCkgewogICAgICByZXR1cm4gYmFzZTsKICAgIH0gZWxzZSBpZiAoaXNTdWJjbGFzcykgewogICAgICByZXR1cm4gY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaGFzQW55U3RyaWN0U3ViY2xhc3MoYmFzZSkKICAgICAgICAgID8gbnVsbAogICAgICAgICAgOiBiYXNlOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KGlzU3VidHlwZSk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc0FsbChKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGlmIChpc0VtcHR5T3JOdWxsIHx8IGlzRXhhY3QpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBpZGVudGljYWwoYmFzZSwgY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgdW5pb24oVHlwZU1hc2sgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgYXNzZXJ0KG90aGVyICE9IG51bGwpOwogICAgYXNzZXJ0KFR5cGVNYXNrLmFzc2VydElzTm9ybWFsaXplZCh0aGlzLCBjbG9zZWRXb3JsZCkpOwogICAgYXNzZXJ0KFR5cGVNYXNrLmFzc2VydElzTm9ybWFsaXplZChvdGhlciwgY2xvc2VkV29ybGQpKTsKICAgIGlmIChvdGhlciBpcyEgRmxhdFR5cGVNYXNrKSByZXR1cm4gb3RoZXIudW5pb24odGhpcywgY2xvc2VkV29ybGQpOwogICAgRmxhdFR5cGVNYXNrIGZsYXRPdGhlciA9IG90aGVyOwogICAgaWYgKGlzRW1wdHlPck51bGwpIHsKICAgICAgcmV0dXJuIGlzTnVsbGFibGUgPyBmbGF0T3RoZXIubnVsbGFibGUoKSA6IGZsYXRPdGhlcjsKICAgIH0gZWxzZSBpZiAoZmxhdE90aGVyLmlzRW1wdHlPck51bGwpIHsKICAgICAgcmV0dXJuIGZsYXRPdGhlci5pc051bGxhYmxlID8gbnVsbGFibGUoKSA6IHRoaXM7CiAgICB9IGVsc2UgaWYgKGJhc2UgPT0gZmxhdE90aGVyLmJhc2UpIHsKICAgICAgcmV0dXJuIHVuaW9uU2FtZShmbGF0T3RoZXIsIGNsb3NlZFdvcmxkKTsKICAgIH0gZWxzZSBpZiAoY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNTdWJjbGFzc09mKGZsYXRPdGhlci5iYXNlLCBiYXNlKSkgewogICAgICByZXR1cm4gdW5pb25TdHJpY3RTdWJjbGFzcyhmbGF0T3RoZXIsIGNsb3NlZFdvcmxkKTsKICAgIH0gZWxzZSBpZiAoY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNTdWJjbGFzc09mKGJhc2UsIGZsYXRPdGhlci5iYXNlKSkgewogICAgICByZXR1cm4gZmxhdE90aGVyLnVuaW9uU3RyaWN0U3ViY2xhc3ModGhpcywgY2xvc2VkV29ybGQpOwogICAgfSBlbHNlIGlmIChjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc1N1YnR5cGVPZihmbGF0T3RoZXIuYmFzZSwgYmFzZSkpIHsKICAgICAgcmV0dXJuIHVuaW9uU3RyaWN0U3VidHlwZShmbGF0T3RoZXIsIGNsb3NlZFdvcmxkKTsKICAgIH0gZWxzZSBpZiAoY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNTdWJ0eXBlT2YoYmFzZSwgZmxhdE90aGVyLmJhc2UpKSB7CiAgICAgIHJldHVybiBmbGF0T3RoZXIudW5pb25TdHJpY3RTdWJ0eXBlKHRoaXMsIGNsb3NlZFdvcmxkKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgVW5pb25UeXBlTWFzay5faW50ZXJuYWwoPEZsYXRUeXBlTWFzaz5bdGhpcywgZmxhdE90aGVyXSk7CiAgICB9CiAgfQoKICBUeXBlTWFzayB1bmlvblNhbWUoRmxhdFR5cGVNYXNrIG90aGVyLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGFzc2VydChiYXNlID09IG90aGVyLmJhc2UpOwogICAgYXNzZXJ0KFR5cGVNYXNrLmFzc2VydElzTm9ybWFsaXplZCh0aGlzLCBjbG9zZWRXb3JsZCkpOwogICAgYXNzZXJ0KFR5cGVNYXNrLmFzc2VydElzTm9ybWFsaXplZChvdGhlciwgY2xvc2VkV29ybGQpKTsKICAgIC8vIFRoZSB0d28gbWFza3Mgc2hhcmUgdGhlIGJhc2UgdHlwZSwgc28gd2UgbXVzdCBjaG9zZSB0aGUgbGVhc3QKICAgIC8vIGNvbnN0cmFpbmluZyBraW5kICh0aGUgaGlnaGVzdCkgb2YgdGhlIHR3by4gSWYgZWl0aGVyIG9uZSBvZgogICAgLy8gdGhlIG1hc2tzIGFyZSBudWxsYWJsZSB0aGUgcmVzdWx0IHNob3VsZCBiZSBudWxsYWJsZSB0b28uCiAgICAvLyBBcyBib3RoIG1hc2tzIGFyZSBub3JtYWxpemVkLCB0aGUgcmVzdWx0IHdpbGwgYmUsIHRvby4KICAgIGludCBjb21iaW5lZCA9IChmbGFncyA+IG90aGVyLmZsYWdzKQogICAgICAgID8gZmxhZ3MgfCAob3RoZXIuZmxhZ3MgJiAxKQogICAgICAgIDogb3RoZXIuZmxhZ3MgfCAoZmxhZ3MgJiAxKTsKICAgIGlmIChmbGFncyA9PSBjb21iaW5lZCkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0gZWxzZSBpZiAob3RoZXIuZmxhZ3MgPT0gY29tYmluZWQpIHsKICAgICAgcmV0dXJuIG90aGVyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBGbGF0VHlwZU1hc2subm9ybWFsaXplZChiYXNlLCBjb21iaW5lZCwgY2xvc2VkV29ybGQpOwogICAgfQogIH0KCiAgVHlwZU1hc2sgdW5pb25TdHJpY3RTdWJjbGFzcyhGbGF0VHlwZU1hc2sgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgYXNzZXJ0KGJhc2UgIT0gb3RoZXIuYmFzZSk7CiAgICBhc3NlcnQoY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNTdWJjbGFzc09mKG90aGVyLmJhc2UsIGJhc2UpKTsKICAgIGFzc2VydChUeXBlTWFzay5hc3NlcnRJc05vcm1hbGl6ZWQodGhpcywgY2xvc2VkV29ybGQpKTsKICAgIGFzc2VydChUeXBlTWFzay5hc3NlcnRJc05vcm1hbGl6ZWQob3RoZXIsIGNsb3NlZFdvcmxkKSk7CiAgICBpbnQgY29tYmluZWQ7CiAgICBpZiAoKGlzRXhhY3QgJiYgb3RoZXIuaXNFeGFjdCkgfHwKICAgICAgICBiYXNlID09IGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKSB7CiAgICAgIC8vIFNpbmNlIHRoZSBvdGhlciBtYXNrIGlzIGEgc3ViY2xhc3Mgb2YgdGhpcyBtYXNrLCB3ZSBuZWVkIHRoZQogICAgICAvLyByZXN1bHRpbmcgdW5pb24gdG8gYmUgYSBzdWJjbGFzcyB0b28uIElmIGVpdGhlciBvbmUgb2YgdGhlCiAgICAgIC8vIG1hc2tzIGFyZSBudWxsYWJsZSB0aGUgcmVzdWx0IHNob3VsZCBiZSBudWxsYWJsZSB0b28uCiAgICAgIGNvbWJpbmVkID0gKFNVQkNMQVNTIDw8IDEpIHwgKChmbGFncyB8IG90aGVyLmZsYWdzKSAmIDEpOwogICAgfSBlbHNlIHsKICAgICAgLy8gQm90aCBtYXNrcyBhcmUgYXQgbGVhc3Qgc3ViY2xhc3MgbWFza3MsIHNvIHdlIHBpY2sgdGhlIGxlYXN0CiAgICAgIC8vIGNvbnN0cmFpbmluZyBraW5kICh0aGUgaGlnaGVzdCkgb2YgdGhlIHR3by4gSWYgZWl0aGVyIG9uZSBvZgogICAgICAvLyB0aGUgbWFza3MgYXJlIG51bGxhYmxlIHRoZSByZXN1bHQgc2hvdWxkIGJlIG51bGxhYmxlIHRvby4KICAgICAgY29tYmluZWQgPSAoZmxhZ3MgPiBvdGhlci5mbGFncykKICAgICAgICAgID8gZmxhZ3MgfCAob3RoZXIuZmxhZ3MgJiAxKQogICAgICAgICAgOiBvdGhlci5mbGFncyB8IChmbGFncyAmIDEpOwogICAgfQogICAgLy8gSWYgd2Ugd2Vha2VuIHRoZSBjb25zdHJhaW50IG9uIHRoaXMgdHlwZSwgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdAogICAgLy8gdGhlIHJlc3VsdCBpcyBub3JtYWxpemVkLgogICAgcmV0dXJuIChmbGFncyAhPSBjb21iaW5lZCkKICAgICAgICA/IG5ldyBGbGF0VHlwZU1hc2subm9ybWFsaXplZChiYXNlLCBjb21iaW5lZCwgY2xvc2VkV29ybGQpCiAgICAgICAgOiB0aGlzOwogIH0KCiAgVHlwZU1hc2sgdW5pb25TdHJpY3RTdWJ0eXBlKEZsYXRUeXBlTWFzayBvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBhc3NlcnQoYmFzZSAhPSBvdGhlci5iYXNlKTsKICAgIGFzc2VydCghY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNTdWJjbGFzc09mKG90aGVyLmJhc2UsIGJhc2UpKTsKICAgIGFzc2VydChjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc1N1YnR5cGVPZihvdGhlci5iYXNlLCBiYXNlKSk7CiAgICBhc3NlcnQoVHlwZU1hc2suYXNzZXJ0SXNOb3JtYWxpemVkKHRoaXMsIGNsb3NlZFdvcmxkKSk7CiAgICBhc3NlcnQoVHlwZU1hc2suYXNzZXJ0SXNOb3JtYWxpemVkKG90aGVyLCBjbG9zZWRXb3JsZCkpOwogICAgLy8gU2luY2UgdGhlIG90aGVyIG1hc2sgaXMgYSBzdWJ0eXBlIG9mIHRoaXMgbWFzaywgd2UgbmVlZCB0aGUKICAgIC8vIHJlc3VsdGluZyB1bmlvbiB0byBiZSBhIHN1YnR5cGUgdG9vLiBJZiBlaXRoZXIgb25lIG9mIHRoZSBtYXNrcwogICAgLy8gYXJlIG51bGxhYmxlIHRoZSByZXN1bHQgc2hvdWxkIGJlIG51bGxhYmxlIHRvby4KICAgIGludCBjb21iaW5lZCA9IChTVUJUWVBFIDw8IDEpIHwgKChmbGFncyB8IG90aGVyLmZsYWdzKSAmIDEpOwogICAgLy8gV2Uga25vdyB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgc3VidHlwZSwgW290aGVyLmJhc2VdLCBzbyBubyBuZWVkCiAgICAvLyB0byBub3JtYWxpemUuCiAgICByZXR1cm4gKGZsYWdzICE9IGNvbWJpbmVkKQogICAgICAgID8gbmV3IEZsYXRUeXBlTWFzay5ub3JtYWxpemVkKGJhc2UsIGNvbWJpbmVkLCBjbG9zZWRXb3JsZCkKICAgICAgICA6IHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBpbnRlcnNlY3Rpb24oVHlwZU1hc2sgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgYXNzZXJ0KG90aGVyICE9IG51bGwpOwogICAgaWYgKG90aGVyIGlzISBGbGF0VHlwZU1hc2spIHJldHVybiBvdGhlci5pbnRlcnNlY3Rpb24odGhpcywgY2xvc2VkV29ybGQpOwogICAgYXNzZXJ0KFR5cGVNYXNrLmFzc2VydElzTm9ybWFsaXplZCh0aGlzLCBjbG9zZWRXb3JsZCkpOwogICAgYXNzZXJ0KFR5cGVNYXNrLmFzc2VydElzTm9ybWFsaXplZChvdGhlciwgY2xvc2VkV29ybGQpKTsKICAgIEZsYXRUeXBlTWFzayBmbGF0T3RoZXIgPSBvdGhlcjsKCiAgICBDbGFzc0VudGl0eSBvdGhlckJhc2UgPSBmbGF0T3RoZXIuYmFzZTsKCiAgICBib29sIGluY2x1ZGVOdWxsID0gaXNOdWxsYWJsZSAmJiBmbGF0T3RoZXIuaXNOdWxsYWJsZTsKCiAgICBpZiAoaXNFbXB0eU9yTnVsbCkgewogICAgICByZXR1cm4gaW5jbHVkZU51bGwgPyB0aGlzIDogbm9uTnVsbGFibGUoKTsKICAgIH0gZWxzZSBpZiAoZmxhdE90aGVyLmlzRW1wdHlPck51bGwpIHsKICAgICAgcmV0dXJuIGluY2x1ZGVOdWxsID8gb3RoZXIgOiBvdGhlci5ub25OdWxsYWJsZSgpOwogICAgfQoKICAgIFN1YmNsYXNzUmVzdWx0IHJlc3VsdCA9IGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5CiAgICAgICAgLmNvbW1vblN1YmNsYXNzZXMoYmFzZSwgX2NsYXNzUXVlcnksIG90aGVyQmFzZSwgZmxhdE90aGVyLl9jbGFzc1F1ZXJ5KTsKCiAgICBzd2l0Y2ggKHJlc3VsdC5raW5kKSB7CiAgICAgIGNhc2UgU3ViY2xhc3NSZXN1bHRLaW5kLkVNUFRZOgogICAgICAgIHJldHVybiBpbmNsdWRlTnVsbAogICAgICAgICAgICA/IGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4ubnVsbFR5cGUKICAgICAgICAgICAgOiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmVtcHR5VHlwZTsKICAgICAgY2FzZSBTdWJjbGFzc1Jlc3VsdEtpbmQuRVhBQ1QxOgogICAgICAgIGFzc2VydChpc0V4YWN0KTsKICAgICAgICByZXR1cm4gaW5jbHVkZU51bGwgPyB0aGlzIDogbm9uTnVsbGFibGUoKTsKICAgICAgY2FzZSBTdWJjbGFzc1Jlc3VsdEtpbmQuRVhBQ1QyOgogICAgICAgIGFzc2VydChvdGhlci5pc0V4YWN0KTsKICAgICAgICByZXR1cm4gaW5jbHVkZU51bGwgPyBvdGhlciA6IG90aGVyLm5vbk51bGxhYmxlKCk7CiAgICAgIGNhc2UgU3ViY2xhc3NSZXN1bHRLaW5kLlNVQkNMQVNTMToKICAgICAgICBhc3NlcnQoaXNTdWJjbGFzcyk7CiAgICAgICAgcmV0dXJuIGluY2x1ZGVOdWxsID8gdGhpcyA6IG5vbk51bGxhYmxlKCk7CiAgICAgIGNhc2UgU3ViY2xhc3NSZXN1bHRLaW5kLlNVQkNMQVNTMjoKICAgICAgICBhc3NlcnQoZmxhdE90aGVyLmlzU3ViY2xhc3MpOwogICAgICAgIHJldHVybiBpbmNsdWRlTnVsbCA/IG90aGVyIDogb3RoZXIubm9uTnVsbGFibGUoKTsKICAgICAgY2FzZSBTdWJjbGFzc1Jlc3VsdEtpbmQuU1VCVFlQRTE6CiAgICAgICAgYXNzZXJ0KGlzU3VidHlwZSk7CiAgICAgICAgcmV0dXJuIGluY2x1ZGVOdWxsID8gdGhpcyA6IG5vbk51bGxhYmxlKCk7CiAgICAgIGNhc2UgU3ViY2xhc3NSZXN1bHRLaW5kLlNVQlRZUEUyOgogICAgICAgIGFzc2VydChmbGF0T3RoZXIuaXNTdWJ0eXBlKTsKICAgICAgICByZXR1cm4gaW5jbHVkZU51bGwgPyBvdGhlciA6IG90aGVyLm5vbk51bGxhYmxlKCk7CiAgICAgIGNhc2UgU3ViY2xhc3NSZXN1bHRLaW5kLlNFVDoKICAgICAgZGVmYXVsdDoKICAgICAgICBpZiAocmVzdWx0LmNsYXNzZXMuaXNFbXB0eSkgewogICAgICAgICAgcmV0dXJuIGluY2x1ZGVOdWxsCiAgICAgICAgICAgICAgPyBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLm51bGxUeXBlCiAgICAgICAgICAgICAgOiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmVtcHR5VHlwZTsKICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5jbGFzc2VzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICBDbGFzc0VudGl0eSBjbHMgPSByZXN1bHQuY2xhc3Nlcy5maXJzdDsKICAgICAgICAgIHJldHVybiBpbmNsdWRlTnVsbAogICAgICAgICAgICAgID8gbmV3IFR5cGVNYXNrLnN1YmNsYXNzKGNscywgY2xvc2VkV29ybGQpCiAgICAgICAgICAgICAgOiBuZXcgVHlwZU1hc2subm9uTnVsbFN1YmNsYXNzKGNscywgY2xvc2VkV29ybGQpOwogICAgICAgIH0KCiAgICAgICAgTGlzdDxGbGF0VHlwZU1hc2s+IG1hc2tzID0gPEZsYXRUeXBlTWFzaz5bXTsKICAgICAgICBpZiAoaW5jbHVkZU51bGwpIHsKICAgICAgICAgIGZvciAoQ2xhc3NFbnRpdHkgY2xzIGluIHJlc3VsdC5jbGFzc2VzKSB7CiAgICAgICAgICAgIG1hc2tzLmFkZChuZXcgVHlwZU1hc2suc3ViY2xhc3MoY2xzLCBjbG9zZWRXb3JsZCkpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmb3IgKENsYXNzRW50aXR5IGNscyBpbiByZXN1bHQuY2xhc3NlcykgewogICAgICAgICAgICBtYXNrcy5hZGQobmV3IFR5cGVNYXNrLm5vbk51bGxTdWJjbGFzcyhjbHMsIGNsb3NlZFdvcmxkKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChtYXNrcy5sZW5ndGggPiBVbmlvblR5cGVNYXNrLk1BWF9VTklPTl9MRU5HVEgpIHsKICAgICAgICAgIHJldHVybiBVbmlvblR5cGVNYXNrLmZsYXR0ZW4obWFza3MsIGNsb3NlZFdvcmxkKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBVbmlvblR5cGVNYXNrLl9pbnRlcm5hbChtYXNrcyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzRGlzam9pbnQoVHlwZU1hc2sgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgaWYgKG90aGVyIGlzISBGbGF0VHlwZU1hc2spIHJldHVybiBvdGhlci5pc0Rpc2pvaW50KHRoaXMsIGNsb3NlZFdvcmxkKTsKICAgIEZsYXRUeXBlTWFzayBmbGF0T3RoZXIgPSBvdGhlcjsKCiAgICBpZiAoaXNOdWxsYWJsZSAmJiBmbGF0T3RoZXIuaXNOdWxsYWJsZSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKGlzRW1wdHlPck51bGwgfHwgZmxhdE90aGVyLmlzRW1wdHlPck51bGwpIHJldHVybiB0cnVlOwogICAgaWYgKGJhc2UgPT0gZmxhdE90aGVyLmJhc2UpIHJldHVybiBmYWxzZTsKICAgIGlmIChpc0V4YWN0ICYmIGZsYXRPdGhlci5pc0V4YWN0KSByZXR1cm4gdHJ1ZTsKCiAgICBpZiAoaXNFeGFjdCkgcmV0dXJuICFmbGF0T3RoZXIuY29udGFpbnMoYmFzZSwgY2xvc2VkV29ybGQpOwogICAgaWYgKGZsYXRPdGhlci5pc0V4YWN0KSByZXR1cm4gIWNvbnRhaW5zKGZsYXRPdGhlci5iYXNlLCBjbG9zZWRXb3JsZCk7CgogICAgLy8gTm9ybWFsaXphdGlvbiBndWFyYW50ZWVzIHRoYXQgaXNFeGFjdCA9PT0gIWlzU3ViY2xhc3MgJiYgIWlzU3VidHlwZS4KICAgIC8vIEJvdGggYXJlIHN1YmNsYXNzIG9yIHN1YnR5cGUgbWFza3MsIHNvIGlmIHRoZXJlIGlzIGEgc3ViY2xhc3MKICAgIC8vIHJlbGF0aW9uc2hpcCwgdGhleSBhcmUgbm90IGRpc2pvaW50LgogICAgaWYgKGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmlzU3ViY2xhc3NPZihmbGF0T3RoZXIuYmFzZSwgYmFzZSkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmlzU3ViY2xhc3NPZihiYXNlLCBmbGF0T3RoZXIuYmFzZSkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIFR3byBkaWZmZXJlbnQgYmFzZSBjbGFzc2VzIGhhdmUgbm8gY29tbW9uIHN1YmNsYXNzIHVubGVzcyBvbmUgaXMgYQogICAgLy8gc3ViY2xhc3Mgb2YgdGhlIG90aGVyIChjaGVja2VkIGFib3ZlKS4KICAgIGlmIChpc1N1YmNsYXNzICYmIGZsYXRPdGhlci5pc1N1YmNsYXNzKSByZXR1cm4gdHJ1ZTsKCiAgICByZXR1cm4gX2lzRGlzam9pbnRIZWxwZXIodGhpcywgZmxhdE90aGVyLCBjbG9zZWRXb3JsZCk7CiAgfQoKICBzdGF0aWMgYm9vbCBfaXNEaXNqb2ludEhlbHBlcigKICAgICAgRmxhdFR5cGVNYXNrIGEsIEZsYXRUeXBlTWFzayBiLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGlmICghYS5pc1N1YmNsYXNzICYmIGIuaXNTdWJjbGFzcykgewogICAgICByZXR1cm4gX2lzRGlzam9pbnRIZWxwZXIoYiwgYSwgY2xvc2VkV29ybGQpOwogICAgfQogICAgYXNzZXJ0KGEuaXNTdWJjbGFzcyB8fCBhLmlzU3VidHlwZSk7CiAgICBhc3NlcnQoYi5pc1N1YnR5cGUpOwogICAgdmFyIGVsZW1lbnRzID0gYS5pc1N1YmNsYXNzCiAgICAgICAgPyBjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5zdHJpY3RTdWJjbGFzc2VzT2YoYS5iYXNlKQogICAgICAgIDogY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuc3RyaWN0U3VidHlwZXNPZihhLmJhc2UpOwogICAgZm9yICh2YXIgZWxlbWVudCBpbiBlbGVtZW50cykgewogICAgICBpZiAoY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNTdWJ0eXBlT2YoZWxlbWVudCwgYi5iYXNlKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBUeXBlTWFzayBpbnRlcnNlY3Rpb25TYW1lKEZsYXRUeXBlTWFzayBvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBhc3NlcnQoYmFzZSA9PSBvdGhlci5iYXNlKTsKICAgIC8vIFRoZSB0d28gbWFza3Mgc2hhcmUgdGhlIGJhc2UgdHlwZSwgc28gd2UgbXVzdCBjaG9zZSB0aGUgbW9zdAogICAgLy8gY29uc3RyYWluaW5nIGtpbmQgKHRoZSBsb3dlc3QpIG9mIHRoZSB0d28uIE9ubHkgaWYgYm90aCBtYXNrcwogICAgLy8gYXJlIG51bGxhYmxlLCB3aWxsIHRoZSByZXN1bHQgYmUgbnVsbGFibGUgdG9vLgogICAgLy8gVGhlIHJlc3VsdCB3aWxsIGJlIG5vcm1hbGl6ZWQsIGFzIHRoZSB0d28gaW5wdXRzIGFyZSBub3JtYWxpemVkLCB0b28uCiAgICBpbnQgY29tYmluZWQgPSAoZmxhZ3MgPCBvdGhlci5mbGFncykKICAgICAgICA/IGZsYWdzICYgKChvdGhlci5mbGFncyAmIDEpIHwgfjEpCiAgICAgICAgOiBvdGhlci5mbGFncyAmICgoZmxhZ3MgJiAxKSB8IH4xKTsKICAgIGlmIChmbGFncyA9PSBjb21iaW5lZCkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0gZWxzZSBpZiAob3RoZXIuZmxhZ3MgPT0gY29tYmluZWQpIHsKICAgICAgcmV0dXJuIG90aGVyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBGbGF0VHlwZU1hc2subm9ybWFsaXplZChiYXNlLCBjb21iaW5lZCwgY2xvc2VkV29ybGQpOwogICAgfQogIH0KCiAgVHlwZU1hc2sgaW50ZXJzZWN0aW9uU3RyaWN0U3ViY2xhc3MoCiAgICAgIEZsYXRUeXBlTWFzayBvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBhc3NlcnQoYmFzZSAhPSBvdGhlci5iYXNlKTsKICAgIGFzc2VydChjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc1N1YmNsYXNzT2Yob3RoZXIuYmFzZSwgYmFzZSkpOwogICAgLy8gSWYgdGhpcyBtYXNrIGlzbid0IGF0IGxlYXN0IGEgc3ViY2xhc3MgbWFzaywgdGhlbiB0aGUKICAgIC8vIGludGVyc2VjdGlvbiB3aXRoIHRoZSBvdGhlciBtYXNrIGlzIGVtcHR5LgogICAgaWYgKGlzRXhhY3QpIHJldHVybiBpbnRlcnNlY3Rpb25FbXB0eShvdGhlcik7CiAgICAvLyBPbmx5IHRoZSBvdGhlciBtYXNrIHB1dHMgY29uc3RyYWludHMgb24gdGhlIGludGVyc2VjdGlvbiBtYXNrLAogICAgLy8gc28gYmFzZSB0aGUgY29tYmluZWQgZmxhZ3Mgb24gdGhlIG90aGVyIG1hc2suIE9ubHkgaWYgYm90aAogICAgLy8gbWFza3MgYXJlIG51bGxhYmxlLCB3aWxsIHRoZSByZXN1bHQgYmUgbnVsbGFibGUgdG9vLgogICAgLy8gVGhlIHJlc3VsdCBpcyBndWFyYW50ZWVkIHRvIGJlIG5vcm1hbGl6ZWQsIGFzIHRoZSBvdGhlciB0eXBlCiAgICAvLyB3YXMgbm9ybWFsaXplZC4KICAgIGludCBjb21iaW5lZCA9IG90aGVyLmZsYWdzICYgKChmbGFncyAmIDEpIHwgfjEpOwogICAgaWYgKG90aGVyLmZsYWdzID09IGNvbWJpbmVkKSB7CiAgICAgIHJldHVybiBvdGhlcjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgRmxhdFR5cGVNYXNrLm5vcm1hbGl6ZWQob3RoZXIuYmFzZSwgY29tYmluZWQsIGNsb3NlZFdvcmxkKTsKICAgIH0KICB9CgogIFR5cGVNYXNrIGludGVyc2VjdGlvbkVtcHR5KEZsYXRUeXBlTWFzayBvdGhlcikgewogICAgcmV0dXJuIGlzTnVsbGFibGUgJiYgb3RoZXIuaXNOdWxsYWJsZQogICAgICAgID8gbmV3IFR5cGVNYXNrLmVtcHR5KCkKICAgICAgICA6IG5ldyBUeXBlTWFzay5ub25OdWxsRW1wdHkoKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY2FuSGl0KE1lbWJlckVudGl0eSBlbGVtZW50LCBOYW1lIG5hbWUsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMgPSBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50czsKICAgIGFzc2VydChlbGVtZW50Lm5hbWUgPT0gbmFtZS50ZXh0KTsKICAgIGlmIChpc0VtcHR5KSByZXR1cm4gZmFsc2U7CiAgICBpZiAoaXNOdWxsKSB7CiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5oYXNFbGVtZW50SW4oCiAgICAgICAgICBjb21tb25FbGVtZW50cy5qc051bGxDbGFzcywgbmFtZSwgZWxlbWVudCk7CiAgICB9CgogICAgQ2xhc3NFbnRpdHkgb3RoZXIgPSBlbGVtZW50LmVuY2xvc2luZ0NsYXNzOwogICAgaWYgKG90aGVyID09IGNvbW1vbkVsZW1lbnRzLmpzTnVsbENsYXNzKSB7CiAgICAgIHJldHVybiBpc051bGxhYmxlOwogICAgfSBlbHNlIGlmIChpc0V4YWN0KSB7CiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5oYXNFbGVtZW50SW4oYmFzZSwgbmFtZSwgZWxlbWVudCk7CiAgICB9IGVsc2UgaWYgKGlzU3ViY2xhc3MpIHsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmhhc0VsZW1lbnRJbihiYXNlLCBuYW1lLCBlbGVtZW50KSB8fAogICAgICAgICAgY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNTdWJjbGFzc09mKG90aGVyLCBiYXNlKSB8fAogICAgICAgICAgY2xvc2VkV29ybGQuaGFzQW55U3ViY2xhc3NUaGF0TWl4ZXMoYmFzZSwgb3RoZXIpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KGlzU3VidHlwZSk7CiAgICAgIGJvb2wgcmVzdWx0ID0gY2xvc2VkV29ybGQuaGFzRWxlbWVudEluKGJhc2UsIG5hbWUsIGVsZW1lbnQpIHx8CiAgICAgICAgICBjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc1N1YnR5cGVPZihvdGhlciwgYmFzZSkgfHwKICAgICAgICAgIGNsb3NlZFdvcmxkLmhhc0FueVN1YmNsYXNzVGhhdEltcGxlbWVudHMob3RoZXIsIGJhc2UpIHx8CiAgICAgICAgICBjbG9zZWRXb3JsZC5oYXNBbnlTdWJjbGFzc09mTWl4aW5Vc2VUaGF0SW1wbGVtZW50cyhvdGhlciwgYmFzZSk7CiAgICAgIGlmIChyZXN1bHQpIHJldHVybiB0cnVlOwogICAgICAvLyBJZiB0aGUgY2xhc3MgaXMgdXNlZCBhcyBhIG1peGluLCB3ZSBoYXZlIHRvIGNoZWNrIGlmIHRoZSBlbGVtZW50CiAgICAgIC8vIGNhbiBiZSBoaXQgZnJvbSBhbnkgb2YgdGhlIG1peGluIGFwcGxpY2F0aW9ucy4KICAgICAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IG1peGluVXNlcyA9IGNsb3NlZFdvcmxkLm1peGluVXNlc09mKGJhc2UpOwogICAgICByZXR1cm4gbWl4aW5Vc2VzLmFueSgobWl4aW5BcHBsaWNhdGlvbikgPT4KICAgICAgICAgIGNsb3NlZFdvcmxkLmhhc0VsZW1lbnRJbihtaXhpbkFwcGxpY2F0aW9uLCBuYW1lLCBlbGVtZW50KSB8fAogICAgICAgICAgY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNTdWJjbGFzc09mKG90aGVyLCBtaXhpbkFwcGxpY2F0aW9uKSB8fAogICAgICAgICAgY2xvc2VkV29ybGQuaGFzQW55U3ViY2xhc3NUaGF0TWl4ZXMobWl4aW5BcHBsaWNhdGlvbiwgb3RoZXIpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgbmVlZHNOb1N1Y2hNZXRob2RIYW5kbGluZygKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsIGNvdmFyaWFudCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIC8vIEEgY2FsbCBvbiBhbiBlbXB0eSB0eXBlIG1hc2sgaXMgZWl0aGVyIGRlYWQgY29kZSwgb3IgYSBjYWxsIG9uCiAgICAvLyBgbnVsbGAuCiAgICBpZiAoaXNFbXB0eU9yTnVsbCkgcmV0dXJuIGZhbHNlOwogICAgLy8gQSBjYWxsIG9uIGFuIGV4YWN0IG1hc2sgZm9yIGFuIGFic3RyYWN0IGNsYXNzIGlzIGRlYWQgY29kZS4KICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEEgdHlwZSBtYXNrIGNhbm5vdCBiZSBhYnN0cmFjdC4gUmVtb3ZlIHRoZSBuZWVkCiAgICAvLyBmb3IgdGhpcyBub2lzZSAoY3VycmVudGx5IHVzZWQgZm9yIHN1cGVyLWNhbGxzIGluIGluZmVyZW5jZSBhbmQgbWlycm9yCiAgICAvLyB1c2FnZSkuCiAgICBpZiAoaXNFeGFjdCAmJiBiYXNlLmlzQWJzdHJhY3QpIHJldHVybiBmYWxzZTsKCiAgICByZXR1cm4gY2xvc2VkV29ybGQubmVlZHNOb1N1Y2hNZXRob2QoYmFzZSwgc2VsZWN0b3IsIF9jbGFzc1F1ZXJ5KTsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlckVudGl0eSBsb2NhdGVTaW5nbGVNZW1iZXIoU2VsZWN0b3Igc2VsZWN0b3IsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgaWYgKGlzRW1wdHlPck51bGwpIHJldHVybiBudWxsOwogICAgaWYgKGNsb3NlZFdvcmxkLmluY2x1ZGVzQ2xvc3VyZUNhbGwoc2VsZWN0b3IsIHRoaXMpKSByZXR1cm4gbnVsbDsKICAgIEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gdGFyZ2V0cyA9IGNsb3NlZFdvcmxkLmxvY2F0ZU1lbWJlcnMoc2VsZWN0b3IsIHRoaXMpOwogICAgaWYgKHRhcmdldHMubGVuZ3RoICE9IDEpIHJldHVybiBudWxsOwogICAgTWVtYmVyRW50aXR5IHJlc3VsdCA9IHRhcmdldHMuZmlyc3Q7CiAgICBDbGFzc0VudGl0eSBlbmNsb3NpbmcgPSByZXN1bHQuZW5jbG9zaW5nQ2xhc3M7CiAgICAvLyBXZSBvbmx5IHJldHVybiB0aGUgZm91bmQgZWxlbWVudCBpZiBpdCBpcyBndWFyYW50ZWVkIHRvIGJlIGltcGxlbWVudGVkIG9uCiAgICAvLyBhbGwgY2xhc3NlcyBpbiB0aGUgcmVjZWl2ZXIgdHlwZSBbdGhpc10uIEl0IGNvdWxkIGJlIGZvdW5kIG9ubHkgaW4gYQogICAgLy8gc3ViY2xhc3Mgb3IgaW4gYW4gaW5oZXJpdGFuY2Utd2lzZSB1bnJlbGF0ZWQgY2xhc3MgaW4gY2FzZSBvZiBzdWJ0eXBlCiAgICAvLyBzZWxlY3RvcnMuCiAgICBpZiAoaXNTdWJ0eXBlKSB7CiAgICAgIC8vIGlmIChjbG9zZWRXb3JsZC5pc1VzZWRBc01peGluKGVuY2xvc2luZykpIHsKICAgICAgaWYgKGNsb3NlZFdvcmxkLmV2ZXJ5U3VidHlwZUlzU3ViY2xhc3NPZk9yTWl4aW5Vc2VPZihiYXNlLCBlbmNsb3NpbmcpKSB7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICAvL30KICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgewogICAgICBpZiAoY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNTdWJjbGFzc09mKGJhc2UsIGVuY2xvc2luZykpIHsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIGlmIChjbG9zZWRXb3JsZC5pc1N1YmNsYXNzT2ZNaXhpblVzZU9mKGJhc2UsIGVuY2xvc2luZykpIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0odmFyIG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBp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cGVNYXNrIHsKICBUeXBlTWFzayBnZXQgZm9yd2FyZFRvOwoKICBGb3J3YXJkaW5nVHlwZU1hc2soKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFbXB0eU9yTnVsbCA9PiBmb3J3YXJkVG8uaXNFbXB0eU9yTnVsbDsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0VtcHR5ID0+IGZvcndhcmRUby5pc0VtcHR5OwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTnVsbGFibGUgPT4gZm9yd2FyZFRvLmlzTnVsbGFibGU7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOdWxsID0+IGZvcndhcmRUby5pc051bGw7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFeGFjdCA9PiBmb3J3YXJkVG8uaXNFeGFjdDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNVbmlvbiA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0NvbnRhaW5lciA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1NldCA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc01hcCA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0RpY3Rpb25hcnkgPT4gZmFsc2U7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNWYWx1ZSA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0ZvcndhcmRpbmcgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0luTWFzayhUeXBlTWFzayBvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gZm9yd2FyZFRvLmlzSW5NYXNrKG90aGVyLCBjbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zTWFzayhUeXBlTWFzayBvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gZm9yd2FyZFRvLmNvbnRhaW5zTWFzayhvdGhlciwgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc09ubHlJbnQoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gZm9yd2FyZFRvLmNvbnRhaW5zT25seUludChjbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zT25seURvdWJsZShKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBmb3J3YXJkVG8uY29udGFpbnNPbmx5RG91YmxlKGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNPbmx5TnVtKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGZvcndhcmRUby5jb250YWluc09ubHlOdW0oY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc09ubHlCb29sKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGZvcndhcmRUby5jb250YWluc09ubHlCb29sKGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNPbmx5U3RyaW5nKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGZvcndhcmRUby5jb250YWluc09ubHlTdHJpbmcoY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc09ubHkoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gZm9yd2FyZFRvLmNvbnRhaW5zT25seShjbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBzYXRpc2ZpZXMoQ2xhc3NFbnRpdHkgY2xzLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBmb3J3YXJkVG8uc2F0aXNmaWVzKGNscywgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWlucyhDbGFzc0VudGl0eSBjbHMsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGZvcndhcmRUby5jb250YWlucyhjbHMsIGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNBbGwoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gZm9yd2FyZFRvLmNvbnRhaW5zQWxsKGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IHNpbmdsZUNsYXNzKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGZvcndhcmRUby5zaW5nbGVDbGFzcyhjbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayB1bmlvbihvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBpZiAodGhpcyA9PSBvdGhlcikgewogICAgICByZXR1cm4gdGhpczsKICAgIH0gZWxzZSBpZiAoZXF1YWxzRGlzcmVnYXJkTnVsbChvdGhlcikpIHsKICAgICAgcmV0dXJuIG90aGVyLmlzTnVsbGFibGUgPyBvdGhlciA6IHRoaXM7CiAgICB9IGVsc2UgaWYgKG90aGVyLmlzRW1wdHlPck51bGwpIHsKICAgICAgcmV0dXJuIG90aGVyLmlzTnVsbGFibGUgPyB0aGlzLm51bGxhYmxlKCkgOiB0aGlzOwogICAgfQogICAgcmV0dXJuIGZvcndhcmRUby51bmlvbihvdGhlciwgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0Rpc2pvaW50KFR5cGVNYXNrIG90aGVyLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBmb3J3YXJkVG8uaXNEaXNqb2ludChvdGhlciwgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgaW50ZXJzZWN0aW9uKFR5cGVNYXNrIG90aGVyLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBmb3J3YXJkVG8uaW50ZXJzZWN0aW9uKG90aGVyLCBjbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG5lZWRzTm9TdWNoTWV0aG9kSGFuZGxpbmcoCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLCBjb3ZhcmlhbnQgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gZm9yd2FyZFRvLm5lZWRzTm9TdWNoTWV0aG9kSGFuZGxpbmcoc2VsZWN0b3IsIGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY2FuSGl0KE1lbWJlckVudGl0eSBlbGVtZW50LCBOYW1lIG5hbWUsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGZvcndhcmRUby5jYW5IaXQoZWxlbWVudCwgbmFtZSwgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyRW50aXR5IGxvY2F0ZVNpbmdsZU1lbWJlcihTZWxlY3RvciBzZWxlY3RvciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gZm9yd2FyZFRvLmxvY2F0ZVNpbmdsZU1lbWJlcihzZWxlY3RvciwgY2xvc2VkV29ybGQpOwogIH0KCiAgYm9vbCBlcXVhbHNEaXNyZWdhcmROdWxsKG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMhIEZvcndhcmRpbmdUeXBlTWFzaykgcmV0dXJuIGZhbHNlOwogICAgaWYgKGZvcndhcmRUby5pc051bGxhYmxlKSB7CiAgICAgIHJldHVybiBmb3J3YXJkVG8gPT0gb3RoZXIuZm9yd2FyZFRvLm51bGxhYmxlKCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZm9yd2FyZFRvID09IG90aGVyLmZvcndhcmRUby5ub25OdWxsYWJsZSgpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgcmV0dXJuIGVxdWFsc0Rpc3JlZ2FyZE51bGwob3RoZXIpICYmIGlzTnVsbGFibGUgPT0gb3RoZXIuaXNOdWxsYWJsZTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gdGhyb3cgIlN1YmNsYXNzIHNob3VsZCBpbXBsZW1lbnQgaGFzaENvZGUgZ2V0dGVyIjsKfQoKYWJzdHJhY3QgY2xhc3MgQWxsb2NhdGlvblR5cGVNYXNrIGV4dGVuZHMgRm9yd2FyZGluZ1R5cGVNYXNrIHsKICAvLyBUaGUgW2lyLk5vZGVdIHdoZXJlIHRoaXMgdHlwZSBtYXNrIHdhcyBjcmVhdGVkLgogIGlyLk5vZGUgZ2V0IGFsbG9jYXRpb25Ob2RlOwoKICAvLyBUaGUgW0VudGl0eV0gd2hlcmUgdGhpcyB0eXBlIG1hc2sgd2FzIGNyZWF0ZWQuCiAgTWVtYmVyRW50aXR5IGdldCBhbGxvY2F0aW9uRWxlbWVudDsKfQqApABOTjwBDwE+IjgaARgBDDUMKQwvDCcMKQEMHQwhDBsMGwwiDB0MIQEMPDMEAQxANwQBDDMzBAEMNjYEAQwzMwQBDDQ0BAEMNjYEAQwnKAQBDD4yBAEMPTEEAQwvLwQBDDYvBAEMNBkTLS4mOAYwBAEMPjUEAQxENwQBDCI/RwQBDEs5BAEMUUAEASQ0IDYNOQYEAQwcSQQBDEkCAT81HgE0JgIBQXBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL3R5cGVtYXNrcy9mb3J3YXJkaW5nX3R5cGVfbWFzay5kYXJ0Q3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2luZmVycmVyL3R5cGVtYXNrcy9tYXBfdHlwZV9tYXNrLmRhcnSUQC8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIG1hc2tzOwoKLy8vIEEgW01hcFR5cGVNYXNrXSBpcyBhIFtUeXBlTWFza10gZm9yIGEgc3BlY2lmaWMgYWxsb2NhdGlvbgovLy8gc2l0ZSBvZiBhIG1hcCAoY3VycmVudGx5IG9ubHkgaW50ZXJuYWwgTWFwIGNsYXNzKSB0aGF0IHdpbGwgZ2V0IHNwZWNpYWxpemVkCi8vLyBvbmNlIHRoZSBbVHlwZUdyYXBoSW5mZXJyZXJdIHBoYXNlIGZpbmRzIGEga2V5IGFuZC9vciB2YWx1ZSB0eXBlIGZvciBpdC4KY2xhc3MgTWFwVHlwZU1hc2sgZXh0ZW5kcyBBbGxvY2F0aW9uVHlwZU1hc2sgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbTWFwVHlwZU1hc2tdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnbWFwLXR5cGUtbWFzayc7CgogIEBvdmVycmlkZQogIGZpbmFsIFR5cGVNYXNrIGZvcndhcmRUbzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgaXIuTm9kZSBhbGxvY2F0aW9uTm9kZTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgTWVtYmVyRW50aXR5IGFsbG9jYXRpb25FbGVtZW50OwoKICAvLyBUaGUgdmFsdWUgdHlwZSBvZiB0aGlzIG1hcC4KICBmaW5hbCBUeXBlTWFzayB2YWx1ZVR5cGU7CgogIC8vIFRoZSBrZXkgdHlwZSBvZiB0aGlzIG1hcC4KICBmaW5hbCBUeXBlTWFzayBrZXlUeXBlOwoKICBNYXBUeXBlTWFzayh0aGlzLmZvcndhcmRUbywgdGhpcy5hbGxvY2F0aW9uTm9kZSwgdGhpcy5hbGxvY2F0aW9uRWxlbWVudCwKICAgICAgdGhpcy5rZXlUeXBlLCB0aGlzLnZhbHVlVHlwZSk7CgogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbTWFwVHlwZU1hc2tdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgTWFwVHlwZU1hc2sucmVhZEZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIFR5cGVNYXNrIGZvcndhcmRUbyA9IG5ldyBUeXBlTWFzay5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlLCBjbG9zZWRXb3JsZCk7CiAgICBpci5UcmVlTm9kZSBhbGxvY2F0aW9uTm9kZSA9IHNvdXJjZS5yZWFkVHJlZU5vZGVPck51bGwoKTsKICAgIE1lbWJlckVudGl0eSBhbGxvY2F0aW9uRWxlbWVudCA9IHNvdXJjZS5yZWFkTWVtYmVyT3JOdWxsKCk7CiAgICBUeXBlTWFzayBrZXlUeXBlID0gbmV3IFR5cGVNYXNrLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UsIGNsb3NlZFdvcmxkKTsKICAgIFR5cGVNYXNrIHZhbHVlVHlwZSA9IG5ldyBUeXBlTWFzay5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlLCBjbG9zZWRXb3JsZCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IE1hcFR5cGVNYXNrKAogICAgICAgIGZvcndhcmRUbywgYWxsb2NhdGlvbk5vZGUsIGFsbG9jYXRpb25FbGVtZW50LCBrZXlUeXBlLCB2YWx1ZVR5cGUpOwogIH0KCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbTWFwVHlwZU1hc2tdIHRvIFtzaW5rXS4KICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShUeXBlTWFza0tpbmQubWFwKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIGZvcndhcmRUby53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLndyaXRlVHJlZU5vZGVPck51bGwoYWxsb2NhdGlvbk5vZGUpOwogICAgc2luay53cml0ZU1lbWJlck9yTnVsbChhbGxvY2F0aW9uRWxlbWVudCk7CiAgICBrZXlUeXBlLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIHZhbHVlVHlwZS53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgbnVsbGFibGUoKSB7CiAgICByZXR1cm4gaXNOdWxsYWJsZQogICAgICAgID8gdGhpcwogICAgICAgIDogbmV3IE1hcFR5cGVNYXNrKGZvcndhcmRUby5udWxsYWJsZSgpLCBhbGxvY2F0aW9uTm9kZSwKICAgICAgICAgICAgYWxsb2NhdGlvbkVsZW1lbnQsIGtleVR5cGUsIHZhbHVlVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBub25OdWxsYWJsZSgpIHsKICAgIHJldHVybiBpc051bGxhYmxlCiAgICAgICAgPyBuZXcgTWFwVHlwZU1hc2soZm9yd2FyZFRvLm5vbk51bGxhYmxlKCksIGFsbG9jYXRpb25Ob2RlLAogICAgICAgICAgICBhbGxvY2F0aW9uRWxlbWVudCwga2V5VHlwZSwgdmFsdWVUeXBlKQogICAgICAgIDogdGhpczsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQ29udGFpbmVyID0+IGZhbHNlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTWFwID0+IHRydWU7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFeGFjdCA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGVxdWFsc0Rpc3JlZ2FyZE51bGwob3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyEgTWFwVHlwZU1hc2spIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBzdXBlci5lcXVhbHNEaXNyZWdhcmROdWxsKG90aGVyKSAmJgogICAgICAgIGFsbG9jYXRpb25Ob2RlID09IG90aGVyLmFsbG9jYXRpb25Ob2RlICYmCiAgICAgICAga2V5VHlwZSA9PSBvdGhlci5rZXlUeXBlICYmCiAgICAgICAgdmFsdWVUeXBlID09IG90aGVyLnZhbHVlVHlwZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIGludGVyc2VjdGlvbihUeXBlTWFzayBvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBUeXBlTWFzayBmb3J3YXJkSW50ZXJzZWN0aW9uID0gZm9yd2FyZFRvLmludGVyc2VjdGlvbihvdGhlciwgY2xvc2VkV29ybGQpOwogICAgaWYgKGZvcndhcmRJbnRlcnNlY3Rpb24uaXNFbXB0eU9yTnVsbCkgcmV0dXJuIGZvcndhcmRJbnRlcnNlY3Rpb247CiAgICByZXR1cm4gZm9yd2FyZEludGVyc2VjdGlvbi5pc051bGxhYmxlID8gbnVsbGFibGUoKSA6IG5vbk51bGxhYmxlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayB1bmlvbihkeW5hbWljIG90aGVyLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGlmICh0aGlzID09IG90aGVyKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSBlbHNlIGlmIChlcXVhbHNEaXNyZWdhcmROdWxsKG90aGVyKSkgewogICAgICByZXR1cm4gb3RoZXIuaXNOdWxsYWJsZSA/IG90aGVyIDogdGhpczsKICAgIH0gZWxzZSBpZiAob3RoZXIuaXNFbXB0eU9yTnVsbCkgewogICAgICByZXR1cm4gb3RoZXIuaXNOdWxsYWJsZSA/IHRoaXMubnVsbGFibGUoKSA6IHRoaXM7CiAgICB9IGVsc2UgaWYgKG90aGVyLmlzTWFwICYmCiAgICAgICAga2V5VHlwZSAhPSBudWxsICYmCiAgICAgICAgb3RoZXIua2V5VHlwZSAhPSBudWxsICYmCiAgICAgICAgdmFsdWVUeXBlICE9IG51bGwgJiYKICAgICAgICBvdGhlci52YWx1ZVR5cGUgIT0gbnVsbCkgewogICAgICBUeXBlTWFzayBuZXdLZXlUeXBlID0ga2V5VHlwZS51bmlvbihvdGhlci5rZXlUeXBlLCBjbG9zZWRXb3JsZCk7CiAgICAgIFR5cGVNYXNrIG5ld1ZhbHVlVHlwZSA9IHZhbHVlVHlwZS51bmlvbihvdGhlci52YWx1ZVR5cGUsIGNsb3NlZFdvcmxkKTsKICAgICAgVHlwZU1hc2sgbmV3Rm9yd2FyZFRvID0gZm9yd2FyZFRvLnVuaW9uKG90aGVyLmZvcndhcmRUbywgY2xvc2VkV29ybGQpOwogICAgICByZXR1cm4gbmV3IE1hcFR5cGVNYXNrKAogICAgICAgICAgbmV3Rm9yd2FyZFRvLCBudWxsLCBudWxsLCBuZXdLZXlUeXBlLCBuZXdWYWx1ZVR5cGUpOwogICAgfSBlbHNlIGlmIChvdGhlci5pc0RpY3Rpb25hcnkpIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogRmluZCBhbm90aGVyIHdheSB0byBjaGVjayB0aGlzIGludmFyaWFudCB0aGF0CiAgICAgIC8vIGRvZXNuJ3QgbmVlZCB0aGUgY29tcGlsZXIuCiAgICAgIGFzc2VydChvdGhlci5rZXlUeXBlID09CiAgICAgICAgICBuZXcgVHlwZU1hc2subm9uTnVsbEV4YWN0KAogICAgICAgICAgICAgIGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmpzU3RyaW5nQ2xhc3MsIGNsb3NlZFdvcmxkKSk7CiAgICAgIFR5cGVNYXNrIG5ld0tleVR5cGUgPSBrZXlUeXBlLnVuaW9uKG90aGVyLmtleVR5cGUsIGNsb3NlZFdvcmxkKTsKICAgICAgVHlwZU1hc2sgbmV3VmFsdWVUeXBlID0KICAgICAgICAgIG90aGVyLnR5cGVNYXAudmFsdWVzLmZvbGQoa2V5VHlwZSwgKHAsIG4pID0+IHAudW5pb24obiwgY2xvc2VkV29ybGQpKTsKICAgICAgVHlwZU1hc2sgbmV3Rm9yd2FyZFRvID0gZm9yd2FyZFRvLnVuaW9uKG90aGVyLmZvcndhcmRUbywgY2xvc2VkV29ybGQpOwogICAgICBNYXBUeXBlTWFzayBuZXdNYXBUeXBlTWFzayA9IG5ldyBNYXBUeXBlTWFzaygKICAgICAgICAgIG5ld0ZvcndhcmRUbywKICAgICAgICAgIGFsbG9jYXRpb25Ob2RlID09IG90aGVyLmFsbG9jYXRpb25Ob2RlID8gYWxsb2NhdGlvbk5vZGUgOiBudWxsLAogICAgICAgICAgYWxsb2NhdGlvbkVsZW1lbnQgPT0gb3RoZXIuYWxsb2NhdGlvbkVsZW1lbnQKICAgICAgICAgICAgICA/IGFsbG9jYXRpb25FbGVtZW50CiAgICAgICAgICAgICAgOiBudWxsLAogICAgICAgICAgbmV3S2V5VHlwZSwKICAgICAgICAgIG5ld1ZhbHVlVHlwZSk7CiAgICAgIHJldHVybiBuZXdNYXBUeXBlTWFzazsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmb3J3YXJkVG8udW5pb24ob3RoZXIsIGNsb3NlZFdvcmxkKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+IHN1cGVyID09IG90aGVyOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIHJldHVybiBjb21wdXRlSGFzaENvZGUoCiAgICAgICAgYWxsb2NhdGlvbk5vZGUsIGlzTnVsbGFibGUsIGtleVR5cGUsIHZhbHVlVHlwZSwgZm9yd2FyZFRvKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnTWFwKCRmb3J3YXJkVG8sIGtleTogJGtleVR5cGUsIHZhbHVlOiAkdmFsdWVUeXBlKSc7CiAgfQp9CoCcAE5OPAEPAT5QTS9FHS0BDBwBDCABDCgBIRwBHxoBSyUBOSo1F08+QE1PFRxLBAEvDCgmFSUuLyMlEwQBDBgWD0A0BAEMGxZDMxAEAQwhDBoMHAEMJC0vMiQmBAEMRE9HSAQBDDwZEy0uJjgeGyEdI0dNTR4/JUwkHiVHRx5RTTQYSjciFhYZHQ0yBgQBDC0BDBUcRAQBDBZABAIBOnBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL3R5cGVtYXNrcy9tYXBfdHlwZV9tYXNrLmRhcnRDc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaW5mZXJyZXIvdHlwZW1hc2tzL3NldF90eXBlX21hc2suZGFydI7eLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgbWFza3M7CgovLy8gQSBbU2V0VHlwZU1hc2tdIGlzIGEgW1R5cGVNYXNrXSBmb3IgYSBzcGVjaWZpYyBhbGxvY2F0aW9uIHNpdGUgb2YgYSBzZXQKLy8vIChjdXJyZW50bHkgb25seSB0aGUgaW50ZXJuYWwgU2V0IGNsYXNzKSB0aGF0IHdpbGwgZ2V0IHNwZWNpYWxpemVkIG9uY2UgdGhlCi8vLyBbVHlwZUdyYXBoSW5mZXJyZXJdIHBoYXNlIGZpbmRzIGFuIGVsZW1lbnQgdHlwZSBmb3IgaXQuCmNsYXNzIFNldFR5cGVNYXNrIGV4dGVuZHMgQWxsb2NhdGlvblR5cGVNYXNrIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW1NldFR5cGVNYXNrXSBvYmplY3RzIGluIGEgZGVidWdnaW5nCiAgLy8vIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ3NldC10eXBlLW1hc2snOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBUeXBlTWFzayBmb3J3YXJkVG87CgogIEBvdmVycmlkZQogIGZpbmFsIGlyLk5vZGUgYWxsb2NhdGlvbk5vZGU7CgogIEBvdmVycmlkZQogIGZpbmFsIE1lbWJlckVudGl0eSBhbGxvY2F0aW9uRWxlbWVudDsKCiAgLy8gVGhlIGVsZW1lbnQgdHlwZSBvZiB0aGlzIHNldC4KICBmaW5hbCBUeXBlTWFzayBlbGVtZW50VHlwZTsKCiAgU2V0VHlwZU1hc2sodGhpcy5mb3J3YXJkVG8sIHRoaXMuYWxsb2NhdGlvbk5vZGUsIHRoaXMuYWxsb2NhdGlvbkVsZW1lbnQsCiAgICAgIHRoaXMuZWxlbWVudFR5cGUpOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW1NldFR5cGVNYXNrXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IFNldFR5cGVNYXNrLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgRGF0YVNvdXJjZSBzb3VyY2UsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBUeXBlTWFzayBmb3J3YXJkVG8gPSBuZXcgVHlwZU1hc2sucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSwgY2xvc2VkV29ybGQpOwogICAgaXIuVHJlZU5vZGUgYWxsb2NhdGlvbk5vZGUgPSBzb3VyY2UucmVhZFRyZWVOb2RlT3JOdWxsKCk7CiAgICBNZW1iZXJFbnRpdHkgYWxsb2NhdGlvbkVsZW1lbnQgPSBzb3VyY2UucmVhZE1lbWJlck9yTnVsbCgpOwogICAgVHlwZU1hc2sgZWxlbWVudFR5cGUgPSBuZXcgVHlwZU1hc2sucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSwgY2xvc2VkV29ybGQpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBTZXRUeXBlTWFzaygKICAgICAgICBmb3J3YXJkVG8sIGFsbG9jYXRpb25Ob2RlLCBhbGxvY2F0aW9uRWxlbWVudCwgZWxlbWVudFR5cGUpOwogIH0KCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbU2V0VHlwZU1hc2tdIHRvIFtzaW5rXS4KICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShUeXBlTWFza0tpbmQuc2V0KTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIGZvcndhcmRUby53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLndyaXRlVHJlZU5vZGVPck51bGwoYWxsb2NhdGlvbk5vZGUpOwogICAgc2luay53cml0ZU1lbWJlck9yTnVsbChhbGxvY2F0aW9uRWxlbWVudCk7CiAgICBlbGVtZW50VHlwZS53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgbnVsbGFibGUoKSA9PiBpc051bGxhYmxlCiAgICAgID8gdGhpcwogICAgICA6IG5ldyBTZXRUeXBlTWFzaygKICAgICAgICAgIGZvcndhcmRUby5udWxsYWJsZSgpLCBhbGxvY2F0aW9uTm9kZSwgYWxsb2NhdGlvbkVsZW1lbnQsIGVsZW1lbnRUeXBlKTsKCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgbm9uTnVsbGFibGUoKSA9PiBpc051bGxhYmxlCiAgICAgID8gbmV3IFNldFR5cGVNYXNrKGZvcndhcmRUby5ub25OdWxsYWJsZSgpLCBhbGxvY2F0aW9uTm9kZSwKICAgICAgICAgIGFsbG9jYXRpb25FbGVtZW50LCBlbGVtZW50VHlwZSkKICAgICAgOiB0aGlzOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1NldCA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0V4YWN0ID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgZXF1YWxzRGlzcmVnYXJkTnVsbChvdGhlcikgewogICAgaWYgKG90aGVyIGlzISBTZXRUeXBlTWFzaykgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHN1cGVyLmVxdWFsc0Rpc3JlZ2FyZE51bGwob3RoZXIpICYmCiAgICAgICAgYWxsb2NhdGlvbk5vZGUgPT0gb3RoZXIuYWxsb2NhdGlvbk5vZGUgJiYKICAgICAgICBlbGVtZW50VHlwZSA9PSBvdGhlci5lbGVtZW50VHlwZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIGludGVyc2VjdGlvbihUeXBlTWFzayBvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBUeXBlTWFzayBmb3J3YXJkSW50ZXJzZWN0aW9uID0gZm9yd2FyZFRvLmludGVyc2VjdGlvbihvdGhlciwgY2xvc2VkV29ybGQpOwogICAgaWYgKGZvcndhcmRJbnRlcnNlY3Rpb24uaXNFbXB0eU9yTnVsbCkgcmV0dXJuIGZvcndhcmRJbnRlcnNlY3Rpb247CiAgICByZXR1cm4gZm9yd2FyZEludGVyc2VjdGlvbi5pc051bGxhYmxlID8gbnVsbGFibGUoKSA6IG5vbk51bGxhYmxlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayB1bmlvbihkeW5hbWljIG90aGVyLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGlmICh0aGlzID09IG90aGVyKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSBlbHNlIGlmIChlcXVhbHNEaXNyZWdhcmROdWxsKG90aGVyKSkgewogICAgICByZXR1cm4gb3RoZXIuaXNOdWxsYWJsZSA/IG90aGVyIDogdGhpczsKICAgIH0gZWxzZSBpZiAob3RoZXIuaXNFbXB0eU9yTnVsbCkgewogICAgICByZXR1cm4gb3RoZXIuaXNOdWxsYWJsZSA/IHRoaXMubnVsbGFibGUoKSA6IHRoaXM7CiAgICB9IGVsc2UgaWYgKG90aGVyLmlzU2V0ICYmCiAgICAgICAgZWxlbWVudFR5cGUgIT0gbnVsbCAmJgogICAgICAgIG90aGVyLmVsZW1lbnRUeXBlICE9IG51bGwpIHsKICAgICAgVHlwZU1hc2sgbmV3RWxlbWVudFR5cGUgPQogICAgICAgICAgZWxlbWVudFR5cGUudW5pb24ob3RoZXIuZWxlbWVudFR5cGUsIGNsb3NlZFdvcmxkKTsKICAgICAgVHlwZU1hc2sgbmV3Rm9yd2FyZFRvID0gZm9yd2FyZFRvLnVuaW9uKG90aGVyLmZvcndhcmRUbywgY2xvc2VkV29ybGQpOwogICAgICByZXR1cm4gbmV3IFNldFR5cGVNYXNrKG5ld0ZvcndhcmRUbywgbnVsbCwgbnVsbCwgbmV3RWxlbWVudFR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGZvcndhcmRUby51bmlvbihvdGhlciwgY2xvc2VkV29ybGQpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgPT4gc3VwZXIgPT0gb3RoZXI7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4KICAgICAgY29tcHV0ZUhhc2hDb2RlKGFsbG9jYXRpb25Ob2RlLCBpc051bGxhYmxlLCBlbGVtZW50VHlwZSwgZm9yd2FyZFRvKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1NldCgkZm9yd2FyZFRvLCBlbGVtZW50OiAkZWxlbWVudFR5cGUpJzsKfQp3AE5OPAEPAUxPPC9PEy0BDBwBDCABDCgBIx4BSxkBOSo1F08+QFEVHEQEAS8MKCYVJS4vJxMEAQwkDRlRAQwnQSoOAQwaAQwcAQwkLS8yKgQBDERPR0gEAQw8GRMtLiY4Hh8lID1NSA0yBgQBDC0BDBZLAQxBAgE6cGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvdHlwZW1hc2tzL3NldF90eXBlX21hc2suZGFydD9zZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pbmZlcnJlci90eXBlbWFza3MvdHlwZV9tYXNrLmRhcnS5Wi8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIG1hc2tzOwoKLy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIGEgW1VuaXZlcnNlU2VsZWN0b3JDb25zdHJhaW50c10gdGhhdCBpcyBjb25zaXN0cyBpZiBhbgovLy8gb25seSBpbmNyZWFzaW5nIHNldCBvZiBbVHlwZU1hc2tdcywgdGhhdCBpcywgb25jZSBhIG1hc2sgaXMgYWRkZWQgaXQgY2Fubm90Ci8vLyBiZSByZW1vdmVkLgpjbGFzcyBJbmNyZWFzaW5nVHlwZU1hc2tTZXQgZXh0ZW5kcyBVbml2ZXJzZVNlbGVjdG9yQ29uc3RyYWludHMgewogIGJvb2wgaXNBbGwgPSBmYWxzZTsKICBTZXQ8VHlwZU1hc2s+IF9tYXNrczsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjYW5IaXQoTWVtYmVyRW50aXR5IGVsZW1lbnQsIE5hbWUgbmFtZSwgSkNsb3NlZFdvcmxkIHdvcmxkKSB7CiAgICBpZiAoaXNBbGwpIHJldHVybiB0cnVlOwogICAgaWYgKF9tYXNrcyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICBmb3IgKFR5cGVNYXNrIG1hc2sgaW4gX21hc2tzKSB7CiAgICAgIGlmIChtYXNrLmNhbkhpdChlbGVtZW50LCBuYW1lLCB3b3JsZCkpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBuZWVkc05vU3VjaE1ldGhvZEhhbmRsaW5nKFNlbGVjdG9yIHNlbGVjdG9yLCBKQ2xvc2VkV29ybGQgd29ybGQpIHsKICAgIGlmIChpc0FsbCkgewogICAgICBUeXBlTWFzayBtYXNrID0KICAgICAgICAgIG5ldyBUeXBlTWFzay5zdWJjbGFzcyh3b3JsZC5jb21tb25FbGVtZW50cy5vYmplY3RDbGFzcywgd29ybGQpOwogICAgICByZXR1cm4gbWFzay5uZWVkc05vU3VjaE1ldGhvZEhhbmRsaW5nKHNlbGVjdG9yLCB3b3JsZCk7CiAgICB9CiAgICBmb3IgKFR5cGVNYXNrIG1hc2sgaW4gX21hc2tzKSB7CiAgICAgIGlmIChtYXNrLm5lZWRzTm9TdWNoTWV0aG9kSGFuZGxpbmcoc2VsZWN0b3IsIHdvcmxkKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGFkZFJlY2VpdmVyQ29uc3RyYWludChUeXBlTWFzayBtYXNrKSB7CiAgICBpZiAoaXNBbGwpIHJldHVybiBmYWxzZTsKICAgIGlmIChtYXNrID09IG51bGwpIHsKICAgICAgaXNBbGwgPSB0cnVlOwogICAgICBfbWFza3MgPSBudWxsOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9tYXNrcyA/Pz0gbmV3IFNldDxUeXBlTWFzaz4oKTsKICAgIHJldHVybiBfbWFza3MuYWRkKG1hc2spOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgaWYgKGlzQWxsKSB7CiAgICAgIHJldHVybiAnPGFsbD4nOwogICAgfSBlbHNlIGlmIChfbWFza3MgIT0gbnVsbCkgewogICAgICByZXR1cm4gJyRfbWFza3MnOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICc8bm9uZT4nOwogICAgfQogIH0KfQoKY2xhc3MgVHlwZU1hc2tTdHJhdGVneSBpbXBsZW1lbnRzIEFic3RyYWN0VmFsdWVTdHJhdGVneSB7CiAgY29uc3QgVHlwZU1hc2tTdHJhdGVneSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlRG9tYWluIGNyZWF0ZURvbWFpbihKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBuZXcgQ29tbW9uTWFza3MoY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgU2VsZWN0b3JDb25zdHJhaW50c1N0cmF0ZWd5IGNyZWF0ZVNlbGVjdG9yU3RyYXRlZ3koKSB7CiAgICByZXR1cm4gbmV3IFR5cGVNYXNrU2VsZWN0b3JTdHJhdGVneSgpOwogIH0KfQoKY2xhc3MgVHlwZU1hc2tTZWxlY3RvclN0cmF0ZWd5IGltcGxlbWVudHMgU2VsZWN0b3JDb25zdHJhaW50c1N0cmF0ZWd5IHsKICBjb25zdCBUeXBlTWFza1NlbGVjdG9yU3RyYXRlZ3koKTsKCiAgQG92ZXJyaWRlCiAgVW5pdmVyc2VTZWxlY3RvckNvbnN0cmFpbnRzIGNyZWF0ZVNlbGVjdG9yQ29uc3RyYWludHMoCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLCBPYmplY3QgaW5pdGlhbENvbnN0cmFpbnQpIHsKICAgIHJldHVybiBuZXcgSW5jcmVhc2luZ1R5cGVNYXNrU2V0KCkKICAgICAgLi5hZGRSZWNlaXZlckNvbnN0cmFpbnQoaW5pdGlhbENvbnN0cmFpbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBhcHBsaWVkVW5uYW1lZChEeW5hbWljVXNlIGR5bmFtaWNVc2UsIE1lbWJlckVudGl0eSBtZW1iZXIsCiAgICAgIGNvdmFyaWFudCBKQ2xvc2VkV29ybGQgd29ybGQpIHsKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gZHluYW1pY1VzZS5zZWxlY3RvcjsKICAgIFR5cGVNYXNrIG1hc2sgPSBkeW5hbWljVXNlLnJlY2VpdmVyQ29uc3RyYWludDsKICAgIHJldHVybiBzZWxlY3Rvci5hcHBsaWVzVW5uYW1lZChtZW1iZXIpICYmCiAgICAgICAgKG1hc2sgPT0gbnVsbCB8fCBtYXNrLmNhbkhpdChtZW1iZXIsIHNlbGVjdG9yLm1lbWJlck5hbWUsIHdvcmxkKSk7CiAgfQp9CgovLy8gRW51bSB1c2VkIGZvciBpZGVudGlmeWluZyBbVHlwZU1hc2tdIHN1YmNsYXNzZXMgaW4gc2VyaWFsaXphdGlvbi4KZW51bSBUeXBlTWFza0tpbmQgewogIGZsYXQsCiAgdW5pb24sCiAgY29udGFpbmVyLAogIHNldCwKICBtYXAsCiAgZGljdGlvbmFyeSwKICB2YWx1ZSwKfQoKLy8vIEEgdHlwZSBtYXNrIHJlcHJlc2VudHMgYSBzZXQgb2YgY29udGFpbmVkIGNsYXNzZXMsIGJ1dCB0aGUKLy8vIG9wZXJhdGlvbnMgb24gaXQgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIHByZWNpc2UgYW5kIHRoZXkgbWF5Ci8vLyB5aWVsZCBjb25zZXJ2YXRpdmUgYW5zd2VycyB0aGF0IGNvbnRhaW4gdG9vIG1hbnkgY2xhc3Nlcy4KYWJzdHJhY3QgY2xhc3MgVHlwZU1hc2sgaW1wbGVtZW50cyBBYnN0cmFjdFZhbHVlIHsKICBmYWN0b3J5IFR5cGVNYXNrKAogICAgICBDbGFzc0VudGl0eSBiYXNlLCBpbnQga2luZCwgYm9vbCBpc051bGxhYmxlLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBuZXcgRmxhdFR5cGVNYXNrLm5vcm1hbGl6ZWQoCiAgICAgICAgYmFzZSwgKGtpbmQgPDwgMSkgfCAoaXNOdWxsYWJsZSA/IDEgOiAwKSwgY2xvc2VkV29ybGQpOwogIH0KCiAgY29uc3QgZmFjdG9yeSBUeXBlTWFzay5lbXB0eSgpID0gRmxhdFR5cGVNYXNrLmVtcHR5OwoKICBmYWN0b3J5IFR5cGVNYXNrLmV4YWN0KENsYXNzRW50aXR5IGJhc2UsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgYXNzZXJ0KAogICAgICAgIGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmlzSW5zdGFudGlhdGVkKGJhc2UpLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBiYXNlID8/IENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIGV4YWN0IHR5cGUgbWFzayBmb3IgdW5pbnN0YW50aWF0ZWQgIgogICAgICAgICAgICAiY2xhc3MgJGJhc2UuXG4ke2Nsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmR1bXAoYmFzZSl9IikpOwogICAgcmV0dXJuIG5ldyBGbGF0VHlwZU1hc2suZXhhY3QoYmFzZSk7CiAgfQoKICBmYWN0b3J5IFR5cGVNYXNrLmV4YWN0T3JFbXB0eShDbGFzc0VudGl0eSBiYXNlLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGlmIChjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc0luc3RhbnRpYXRlZChiYXNlKSkKICAgICAgcmV0dXJuIG5ldyBGbGF0VHlwZU1hc2suZXhhY3QoYmFzZSk7CiAgICByZXR1cm4gY29uc3QgVHlwZU1hc2suZW1wdHkoKTsKICB9CgogIGZhY3RvcnkgVHlwZU1hc2suc3ViY2xhc3MoQ2xhc3NFbnRpdHkgYmFzZSwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBhc3NlcnQoCiAgICAgICAgY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNJbnN0YW50aWF0ZWQoYmFzZSksCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIGJhc2UgPz8gQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgc3ViY2xhc3MgdHlwZSBtYXNrIGZvciB1bmluc3RhbnRpYXRlZCAiCiAgICAgICAgICAgICJjbGFzcyAkYmFzZS5cbiR7Y2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuZHVtcChiYXNlKX0iKSk7CiAgICBDbGFzc0VudGl0eSB0b3Btb3N0ID0gY2xvc2VkV29ybGQuZ2V0THViT2ZJbnN0YW50aWF0ZWRTdWJjbGFzc2VzKGJhc2UpOwogICAgaWYgKHRvcG1vc3QgPT0gbnVsbCkgewogICAgICByZXR1cm4gbmV3IFR5cGVNYXNrLmVtcHR5KCk7CiAgICB9IGVsc2UgaWYgKGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5Lmhhc0FueVN0cmljdFN1YmNsYXNzKHRvcG1vc3QpKSB7CiAgICAgIHJldHVybiBuZXcgRmxhdFR5cGVNYXNrLnN1YmNsYXNzKHRvcG1vc3QpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBUeXBlTWFzay5leGFjdCh0b3Btb3N0LCBjbG9zZWRXb3JsZCk7CiAgICB9CiAgfQoKICBmYWN0b3J5IFR5cGVNYXNrLnN1YnR5cGUoQ2xhc3NFbnRpdHkgYmFzZSwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBDbGFzc0VudGl0eSB0b3Btb3N0ID0gY2xvc2VkV29ybGQuZ2V0THViT2ZJbnN0YW50aWF0ZWRTdWJ0eXBlcyhiYXNlKTsKICAgIGlmICh0b3Btb3N0ID09IG51bGwpIHsKICAgICAgcmV0dXJuIG5ldyBUeXBlTWFzay5lbXB0eSgpOwogICAgfQogICAgaWYgKGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5Lmhhc09ubHlTdWJjbGFzc2VzKHRvcG1vc3QpKSB7CiAgICAgIHJldHVybiBuZXcgVHlwZU1hc2suc3ViY2xhc3ModG9wbW9zdCwgY2xvc2VkV29ybGQpOwogICAgfQogICAgaWYgKGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5Lmhhc0FueVN0cmljdFN1YnR5cGUodG9wbW9zdCkpIHsKICAgICAgcmV0dXJuIG5ldyBGbGF0VHlwZU1hc2suc3VidHlwZSh0b3Btb3N0KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgVHlwZU1hc2suZXhhY3QodG9wbW9zdCwgY2xvc2VkV29ybGQpOwogICAgfQogIH0KCiAgY29uc3QgZmFjdG9yeSBUeXBlTWFzay5ub25OdWxsRW1wdHkoKSA9IEZsYXRUeXBlTWFzay5ub25OdWxsRW1wdHk7CgogIGZhY3RvcnkgVHlwZU1hc2subm9uTnVsbEV4YWN0KENsYXNzRW50aXR5IGJhc2UsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgYXNzZXJ0KAogICAgICAgIGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmlzSW5zdGFudGlhdGVkKGJhc2UpLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBiYXNlID8/IENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIGV4YWN0IHR5cGUgbWFzayBmb3IgdW5pbnN0YW50aWF0ZWQgIgogICAgICAgICAgICAiY2xhc3MgJGJhc2UuXG4ke2Nsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmR1bXAoYmFzZSl9IikpOwogICAgcmV0dXJuIG5ldyBGbGF0VHlwZU1hc2subm9uTnVsbEV4YWN0KGJhc2UpOwogIH0KCiAgZmFjdG9yeSBUeXBlTWFzay5ub25OdWxsRXhhY3RPckVtcHR5KAogICAgICBDbGFzc0VudGl0eSBiYXNlLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGlmIChjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc0luc3RhbnRpYXRlZChiYXNlKSkgewogICAgICByZXR1cm4gbmV3IEZsYXRUeXBlTWFzay5ub25OdWxsRXhhY3QoYmFzZSk7CiAgICB9CiAgICByZXR1cm4gY29uc3QgVHlwZU1hc2subm9uTnVsbEVtcHR5KCk7CiAgfQoKICBmYWN0b3J5IFR5cGVNYXNrLm5vbk51bGxTdWJjbGFzcyhDbGFzc0VudGl0eSBiYXNlLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGFzc2VydCgKICAgICAgICBjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc0luc3RhbnRpYXRlZChiYXNlKSwKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgYmFzZSA/PyBDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICAgICAiQ2Fubm90IGNyZWF0ZSBzdWJjbGFzcyB0eXBlIG1hc2sgZm9yIHVuaW5zdGFudGlhdGVkICIKICAgICAgICAgICAgImNsYXNzICRiYXNlLlxuJHtjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5kdW1wKGJhc2UpfSIpKTsKICAgIENsYXNzRW50aXR5IHRvcG1vc3QgPSBjbG9zZWRXb3JsZC5nZXRMdWJPZkluc3RhbnRpYXRlZFN1YmNsYXNzZXMoYmFzZSk7CiAgICBpZiAodG9wbW9zdCA9PSBudWxsKSB7CiAgICAgIHJldHVybiBuZXcgVHlwZU1hc2subm9uTnVsbEVtcHR5KCk7CiAgICB9IGVsc2UgaWYgKGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5Lmhhc0FueVN0cmljdFN1YmNsYXNzKHRvcG1vc3QpKSB7CiAgICAgIHJldHVybiBuZXcgRmxhdFR5cGVNYXNrLm5vbk51bGxTdWJjbGFzcyh0b3Btb3N0KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgVHlwZU1hc2subm9uTnVsbEV4YWN0KHRvcG1vc3QsIGNsb3NlZFdvcmxkKTsKICAgIH0KICB9CgogIGZhY3RvcnkgVHlwZU1hc2subm9uTnVsbFN1YnR5cGUoQ2xhc3NFbnRpdHkgYmFzZSwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBDbGFzc0VudGl0eSB0b3Btb3N0ID0gY2xvc2VkV29ybGQuZ2V0THViT2ZJbnN0YW50aWF0ZWRTdWJ0eXBlcyhiYXNlKTsKICAgIGlmICh0b3Btb3N0ID09IG51bGwpIHsKICAgICAgcmV0dXJuIG5ldyBUeXBlTWFzay5ub25OdWxsRW1wdHkoKTsKICAgIH0KICAgIGlmIChjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5oYXNPbmx5U3ViY2xhc3Nlcyh0b3Btb3N0KSkgewogICAgICByZXR1cm4gbmV3IFR5cGVNYXNrLm5vbk51bGxTdWJjbGFzcyh0b3Btb3N0LCBjbG9zZWRXb3JsZCk7CiAgICB9CiAgICBpZiAoY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaGFzQW55U3RyaWN0U3VidHlwZSh0b3Btb3N0KSkgewogICAgICByZXR1cm4gbmV3IEZsYXRUeXBlTWFzay5ub25OdWxsU3VidHlwZSh0b3Btb3N0KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgVHlwZU1hc2subm9uTnVsbEV4YWN0KHRvcG1vc3QsIGNsb3NlZFdvcmxkKTsKICAgIH0KICB9CgogIGZhY3RvcnkgVHlwZU1hc2sudW5pb25PZihJdGVyYWJsZTxUeXBlTWFzaz4gbWFza3MsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIFVuaW9uVHlwZU1hc2sudW5pb25PZihtYXNrcywgY2xvc2VkV29ybGQpOwogIH0KCiAgLy8vIERlc2VyaWFsaXplcyBhIFtUeXBlTWFza10gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBUeXBlTWFzay5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgIERhdGFTb3VyY2Ugc291cmNlLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIFR5cGVNYXNrS2luZCBraW5kID0gc291cmNlLnJlYWRFbnVtKFR5cGVNYXNrS2luZC52YWx1ZXMpOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgVHlwZU1hc2tLaW5kLmZsYXQ6CiAgICAgICAgcmV0dXJuIG5ldyBGbGF0VHlwZU1hc2sucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSwgY2xvc2VkV29ybGQpOwogICAgICBjYXNlIFR5cGVNYXNrS2luZC51bmlvbjoKICAgICAgICByZXR1cm4gbmV3IFVuaW9uVHlwZU1hc2sucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSwgY2xvc2VkV29ybGQpOwogICAgICBjYXNlIFR5cGVNYXNrS2luZC5jb250YWluZXI6CiAgICAgICAgcmV0dXJuIG5ldyBDb250YWluZXJUeXBlTWFzay5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlLCBjbG9zZWRXb3JsZCk7CiAgICAgIGNhc2UgVHlwZU1hc2tLaW5kLnNldDoKICAgICAgICByZXR1cm4gbmV3IFNldFR5cGVNYXNrLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UsIGNsb3NlZFdvcmxkKTsKICAgICAgY2FzZSBUeXBlTWFza0tpbmQubWFwOgogICAgICAgIHJldHVybiBuZXcgTWFwVHlwZU1hc2sucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSwgY2xvc2VkV29ybGQpOwogICAgICBjYXNlIFR5cGVNYXNrS2luZC5kaWN0aW9uYXJ5OgogICAgICAgIHJldHVybiBuZXcgRGljdGlvbmFyeVR5cGVNYXNrLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UsIGNsb3NlZFdvcmxkKTsKICAgICAgY2FzZSBUeXBlTWFza0tpbmQudmFsdWU6CiAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZVR5cGVNYXNrLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UsIGNsb3NlZFdvcmxkKTsKICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmV4cGVjdGVkIFR5cGVNYXNrS2luZCAka2luZC4iKTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW1R5cGVNYXNrXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luayk7CgogIC8vLyBJZiBbbWFza10gaXMgZm9yd2FyZGluZywgcmV0dXJucyB0aGUgZmlyc3Qgbm9uLWZvcndhcmRpbmcgW1R5cGVNYXNrXSBpbgogIC8vLyBbbWFza10ncyBmb3J3YXJkaW5nIGNoYWluLgogIHN0YXRpYyBUeXBlTWFzayBub25Gb3J3YXJkaW5nTWFzayhtYXNrKSB7CiAgICB3aGlsZSAobWFzay5pc0ZvcndhcmRpbmcpIHsKICAgICAgbWFzayA9IG1hc2suZm9yd2FyZFRvOwogICAgfQogICAgcmV0dXJuIG1hc2s7CiAgfQoKICAvLy8gQXNzZXJ0cyB0aGF0IHRoaXMgbWFzayB1c2VzIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSByZXByZXNlbnRhdGlvbiBmb3IKICAvLy8gaXRzIHR5cGVzLiBDdXJyZW50bHksIHdlIG5vcm1hbGl6ZSBzdWJ0eXBlIGFuZCBzdWJjbGFzcyB0byBleGFjdCBpZiBubwogIC8vLyBzdWJ0eXBlcyBvciBzdWJjbGFzc2VzIGFyZSBwcmVzZW50IGFuZCBzdWJ0eXBlIHRvIHN1YmNsYXNzIGlmIG9ubHkKICAvLy8gc3ViY2xhc3NlcyBleGlzdC4gV2UgYWxzbyBub3JtYWxpemUgZXhhY3QgdG8gZW1wdHkgaWYgdGhlIGNvcnJlc3BvbmRpbmcKICAvLy8gYmFzZWNsYXNzIHdhcyBuZXZlciBpbnN0YW50aWF0ZWQuCiAgc3RhdGljIGJvb2wgYXNzZXJ0SXNOb3JtYWxpemVkKFR5cGVNYXNrIG1hc2ssIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgU3RyaW5nIHJlYXNvbiA9IGdldE5vdE5vcm1hbGl6ZWRSZWFzb24obWFzaywgY2xvc2VkV29ybGQpOwogICAgYXNzZXJ0KHJlYXNvbiA9PSBudWxsLAogICAgICAgIGZhaWxlZEF0KE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwgJyRtYXNrIGlzIG5vdCBub3JtYWxpemVkOiAkcmVhc29uJykpOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBzdGF0aWMgU3RyaW5nIGdldE5vdE5vcm1hbGl6ZWRSZWFzb24oCiAgICAgIFR5cGVNYXNrIG1hc2ssIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgbWFzayA9IG5vbkZvcndhcmRpbmdNYXNrKG1hc2spOwogICAgaWYgKG1hc2sgaXMgRmxhdFR5cGVNYXNrKSB7CiAgICAgIGlmIChtYXNrLmlzRW1wdHlPck51bGwpIHJldHVybiBudWxsOwogICAgICBpZiAobWFzay5pc0V4YWN0KSB7CiAgICAgICAgaWYgKCFjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc0luc3RhbnRpYXRlZChtYXNrLmJhc2UpKSB7CiAgICAgICAgICByZXR1cm4gJ0V4YWN0ICR7bWFzay5iYXNlfSBpcyBub3QgaW5zdGFudGlhdGVkLic7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlmIChtYXNrLmlzU3ViY2xhc3MpIHsKICAgICAgICBpZiAoIWNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5Lmhhc0FueVN0cmljdFN1YmNsYXNzKG1hc2suYmFzZSkpIHsKICAgICAgICAgIHJldHVybiAnU3ViY2xhc3MgJHttYXNrLmJhc2V9IGRvZXMgbm90IGhhdmUgYW55IHN1YmNsYXNzZXMuJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgYXNzZXJ0KG1hc2suaXNTdWJ0eXBlKTsKICAgICAgaWYgKCFjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5oYXNBbnlTdHJpY3RTdWJ0eXBlKG1hc2suYmFzZSkpIHsKICAgICAgICByZXR1cm4gJ1N1YnR5cGUgJHttYXNrLmJhc2V9IGRvZXMgbm90IGhhdmUgYW55IHN1YmNsYXNzZXMuJzsKICAgICAgfQogICAgICBpZiAoY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaGFzT25seVN1YmNsYXNzZXMobWFzay5iYXNlKSkgewogICAgICAgIHJldHVybiAnU3VidHlwZSAke21hc2suYmFzZX0gb25seSBoYXMgc3ViY2xhc3Nlcy4nOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIGlmIChtYXNrIGlzIFVuaW9uVHlwZU1hc2spIHsKICAgICAgZm9yIChUeXBlTWFzayBzdWJtYXNrIGluIG1hc2suZGlzam9pbnRNYXNrcykgewogICAgICAgIFN0cmluZyBzdWJtYXNrUmVhc29uID0gZ2V0Tm90Tm9ybWFsaXplZFJlYXNvbihzdWJtYXNrLCBjbG9zZWRXb3JsZCk7CiAgICAgICAgaWYgKHN1Ym1hc2tSZWFzb24gIT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuICdTdWJtYXNrICRzdWJtYXNrIGluICRtYXNrOiAkc3VibWFza1JlYXNvbi4nOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiAnVW5rbm93biB0eXBlIG1hc2sgJG1hc2suJzsKICB9CgogIC8vLyBSZXR1cm5zIGEgbnVsbGFibGUgdmFyaWFudCBvZiBbdGhpc10gdHlwZSBtYXNrLgogIFR5cGVNYXNrIG51bGxhYmxlKCk7CgogIC8vLyBSZXR1cm5zIGEgbm9uLW51bGxhYmxlIHZhcmlhbnQgb2YgW3RoaXNdIHR5cGUgbWFzay4KICBUeXBlTWFzayBub25OdWxsYWJsZSgpOwoKICAvLy8gV2hldGhlciBub3RoaW5nIG1hdGNoZXMgdGhpcyBtYXNrLCBub3QgZXZlbiBudWxsLgogIGJvb2wgZ2V0IGlzRW1wdHk7CgogIC8vLyBXaGV0aGVyIG51bGwgaXMgYSB2YWxpZCB2YWx1ZSBvZiB0aGlzIG1hc2suCiAgYm9vbCBnZXQgaXNOdWxsYWJsZTsKCiAgLy8vIFdoZXRoZXIgdGhlIG9ubHkgcG9zc2libGUgdmFsdWUgaW4gdGhpcyBtYXNrIGlzIE51bGwuCiAgYm9vbCBnZXQgaXNOdWxsOwoKICAvLy8gV2hldGhlciBbaXNFbXB0eV0gb3IgW2lzTnVsbF0gaXMgdHJ1ZS4KICBib29sIGdldCBpc0VtcHR5T3JOdWxsOwoKICAvLy8gV2hldGhlciB0aGlzIG1hc2sgb25seSBpbmNsdWRlcyBpbnN0YW5jZXMgb2YgYW4gZXhhY3QgY2xhc3MsIGFuZCBub25lIG9mCiAgLy8vIGl0J3Mgc3ViY2xhc3NlcyBvciBzdWJ0eXBlcy4KICBib29sIGdldCBpc0V4YWN0OwoKICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgbWFzayBpcyBhIHVuaW9uIHR5cGUuCiAgYm9vbCBnZXQgaXNVbmlvbjsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHRoaXMgbWFzayBpcyBhIFtDb250YWluZXJUeXBlTWFza10uCiAgYm9vbCBnZXQgaXNDb250YWluZXI7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIG1hc2sgaXMgYSBbU2V0VHlwZU1hc2tdLgogIGJvb2wgZ2V0IGlzU2V0OwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBtYXNrIGlzIGEgW01hcFR5cGVNYXNrXS4KICBib29sIGdldCBpc01hcDsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHRoaXMgbWFzayBpcyBhIFtNYXBUeXBlTWFza10gaW4gZGljdGlvbmFyeSBtb2RlLCBpLmUuLAogIC8vLyBhbGwga2V5cyBhcmUga25vd24gc3RyaW5nIHZhbHVlcyBhbmQgd2UgaGF2ZSBzcGVjaWZpYyB0eXBlIGluZm9ybWF0aW9uIGZvcgogIC8vLyBjb3JyZXNwb25kaW5nIHZhbHVlcy4KICBib29sIGdldCBpc0RpY3Rpb25hcnk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIG1hc2sgaXMgd3JhcHBpbmcgYW5vdGhlciBtYXNrIGZvciB0aGUgcHVycG9zZSBvZgogIC8vLyB0cmFjaW5nLgogIGJvb2wgZ2V0IGlzRm9yd2FyZGluZzsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHRoaXMgbWFzayBob2xkcyBlbmNvZGVzIGFuIGV4YWN0IHZhbHVlIHdpdGhpbiBhIHR5cGUuCiAgYm9vbCBnZXQgaXNWYWx1ZTsKCiAgYm9vbCBjb250YWluc09ubHlJbnQoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKTsKICBib29sIGNvbnRhaW5zT25seURvdWJsZShKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpOwogIGJvb2wgY29udGFpbnNPbmx5TnVtKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCk7CiAgYm9vbCBjb250YWluc09ubHlCb29sKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCk7CiAgYm9vbCBjb250YWluc09ubHlTdHJpbmcoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKTsKICBib29sIGNvbnRhaW5zT25seShDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gQ29tcGFyZXMgdHdvIFtUeXBlTWFza10gb2JqZWN0cyBmb3Igc3RydWN0dXJhbCBlcXVhbGl0eS4KICAvLy8KICAvLy8gTm90ZTogVGhpcyBtYXkgZGlmZmVyIGZyb20gc2VtYW50aWMgZXF1YWxpdHkgaW4gdGhlIHNldCBjb250YWlubWVudCBzZW5zZS4KICAvLy8gICBVc2UgW2NvbnRhaW5zTWFza10gYW5kIFtpc0luTWFza10gZm9yIHRoYXQsIGluc3RlYWQuCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcik7CgogIC8vLyBJZiB0aGlzIHJldHVybnMgYHRydWVgLCBbb3RoZXJdIGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBzdXBlcnR5cGUgb2YgdGhpcwogIC8vLyBtYXNrLCBpLmUuLCB0aGlzIG1hc2sgaXMgaW4gW290aGVyXS4gSG93ZXZlciwgdGhlIGludmVyc2UgZG9lcyBub3QgaG9sZC4KICAvLy8gRW5hYmxlIFtVbmlvblR5cGVNYXNrLlBFUkZPUk1fRVhUUkFfQ09OVEFJTlNfQ0hFQ0tdIHRvIGJlIG5vdGlmaWVkIG9mCiAgLy8vIGZhbHNlIG5lZ2F0aXZlcy4KICBib29sIGlzSW5NYXNrKFR5cGVNYXNrIG90aGVyLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpOwoKICAvLy8gSWYgdGhpcyByZXR1cm5zIGB0cnVlYCwgW290aGVyXSBpcyBndWFyYW50ZWVkIHRvIGJlIGEgc3VidHlwZSBvZiB0aGlzCiAgLy8vIG1hc2ssIGkuZS4gdGhpcyBtYXNrIGNvbnRhaW5zIFtvdGhlcl0uIEhvd2V2ZXIsIHRoZSBpbnZlcnNlIGRvZXMgbm90IGhvbGQuCiAgLy8vIEVuYWJsZSBbVW5pb25UeXBlTWFzay5QRVJGT1JNX0VYVFJBX0NPTlRBSU5TX0NIRUNLXSB0byBiZSBub3RpZmllZCBvZgogIC8vLyBmYWxzZSBuZWdhdGl2ZXMuCiAgYm9vbCBjb250YWluc01hc2soVHlwZU1hc2sgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCk7CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIG1hc2sgaXMgYW4gaW5zdGFuY2Ugb2YgW2Nsc10uCiAgYm9vbCBzYXRpc2ZpZXMoQ2xhc3NFbnRpdHkgY2xzLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpOwoKICAvLy8gUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGlzIHR5cGUgbWFzayBjb250YWlucyB0aGUgZ2l2ZW4gY2xhc3MgW2Nsc10uCiAgYm9vbCBjb250YWlucyhDbGFzc0VudGl0eSBjbHMsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCk7CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoaXMgdHlwZSBtYXNrIGNvbnRhaW5zIGFsbCB0eXBlcy4KICBib29sIGNvbnRhaW5zQWxsKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCk7CgogIC8vLyBSZXR1cm5zIHRoZSBbQ2xhc3NFbnRpdHldIGlmIHRoaXMgdHlwZSByZXByZXNlbnRzIGEgc2luZ2xlIGNsYXNzLAogIC8vLyBvdGhlcndpc2UgcmV0dXJucyBgbnVsbGAuICBUaGlzIG1ldGhvZCBpcyBjb25zZXJ2YXRpdmUuCiAgQ2xhc3NFbnRpdHkgc2luZ2xlQ2xhc3MoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKTsKCiAgLy8vIFJldHVybnMgYSB0eXBlIG1hc2sgcmVwcmVzZW50aW5nIHRoZSB1bmlvbiBvZiBbdGhpc10gYW5kIFtvdGhlcl0uCiAgVHlwZU1hc2sgdW5pb24oVHlwZU1hc2sgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCk7CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIGFuZCBbb3RoZXJdIGlzIGVtcHR5LgogIGJvb2wgaXNEaXNqb2ludChUeXBlTWFzayBvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKTsKCiAgLy8vIFJldHVybnMgYSB0eXBlIG1hc2sgcmVwcmVzZW50aW5nIHRoZSBpbnRlcnNlY3Rpb24gb2YgW3RoaXNdIGFuZCBbb3RoZXJdLgogIFR5cGVNYXNrIGludGVyc2VjdGlvbihUeXBlTWFzayBvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKTsKCiAgLy8vIFJldHVybnMgd2hldGhlciBbZWxlbWVudF0gaXMgYSBwb3RlbnRpYWwgdGFyZ2V0IHdoZW4gYmVpbmcgaW52b2tlZCBvbiB0aGlzCiAgLy8vIHR5cGUgbWFzay4KICAvLy8KICAvLy8KICAvLy8gW25hbWVdIGlzIHVzZWQgdG8gZW5zdXJlIGxpYnJhcnkgcHJpdmFjeSBpcyB0YWtlbiBpbnRvIGFjY291bnQuCiAgYm9vbCBjYW5IaXQoTWVtYmVyRW50aXR5IGVsZW1lbnQsIE5hbWUgbmFtZSwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKTsKCiAgLy8vIFJldHVybnMgd2hldGhlciB0aGlzIFtUeXBlTWFza10gYXBwbGllZCB0byBbc2VsZWN0b3JdIGNhbiBoaXQgYQogIC8vLyBbbm9TdWNoTWV0aG9kXS4KICBib29sIG5lZWRzTm9TdWNoTWV0aG9kSGFuZGxpbmcoU2VsZWN0b3Igc2VsZWN0b3IsIEpDbG9zZWRXb3JsZCB3b3JsZCk7CgogIC8vLyBSZXR1cm5zIHRoZSBbZWxlbWVudF0gdGhhdCBpcyBrbm93biB0byBhbHdheXMgYmUgaGl0IGF0IHJ1bnRpbWUKICAvLy8gb24gdGhpcyBtYXNrLiBSZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm9uZS4KICBNZW1iZXJFbnRpdHkgbG9jYXRlU2luZ2xlTWVtYmVyKFNlbGVjdG9yIHNlbGVjdG9yLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpOwp9CoGiAE5OPAEPAVBQEEIWGAEMRRwmJDoGEgQBDEoRFko+BiQ9FQgGEgQBDC4dGBQVEwYkHQQBDBYRFiEYDRcGBAIBOhwBDD8pBAEMOSsEAgFIJAEMOTUnMgQBDEImLTMuSwQCAUYUCAkNBwcOCQIBP0M+MxRPKEAEATcBRww5Ei9ASCkEAU45KyMEAUoMORIvQ0hMGyNLMQ03BgQBSUobIwZBOgZDMA03BgQBRQFODDkSL0BIMAQBKDQ7MgYqBAFRDDkSL0NITBsqSzgNPgYEAVBKGyoGQUEGQzcNPgYEAVE2BAE2JzU+FB5JH0ojTh1IHUgkTx9KBkIEASwnAU4hLCAdBhEEAUtNSU4oTD8bThEEASgxJCArGkU8ChUIHUtIChUIHkhFCEU8CBMoNU0lPwoIEwYnBAE2FwE6GgE4FAEyFwE8EwEtGgFPIxQBMRQBPBgBNhIBNhIBT1EcGQFODxkBThQBMjUyMzUmAT8GUT0MGwFOT0wXOwFMUUwXPwE+PQFMPAFALgFIPjUBSDwBRT0BT0MBUREGBkZKAUYWSQFGM1ACATZwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci90eXBlbWFza3MvdHlwZV9tYXNrLmRhcnRFc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaW5mZXJyZXIvdHlwZW1hc2tzL3VuaW9uX3R5cGVfbWFzay5kYXJ0vF0vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBtYXNrczsKCmNsYXNzIFVuaW9uVHlwZU1hc2sgaW1wbGVtZW50cyBUeXBlTWFzayB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtVbmlvblR5cGVNYXNrXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ3VuaW9uLXR5cGUtbWFzayc7CgogIHN0YXRpYyBjb25zdCBpbnQgTUFYX1VOSU9OX0xFTkdUSCA9IDQ7CgogIC8vIFNldCB0aGlzIGZsYWcgdG8gYHRydWVgIHRvIHBlcmZvcm0gYSBzZXQtbWVtYmVyc2hpcCBiYXNlZCBjb250YWlubWVudCBjaGVjawogIC8vIGluc3RlYWQgb2YgcmVseWluZyBvbiBub3JtYWxpemVkIHR5cGVzLiBUaGlzIGlzIHF1aXRlIHNsb3cgYnV0IGNhbiBiZQogIC8vIGhlbHBmdWwgaW4gZGVidWdnaW5nLgogIHN0YXRpYyBjb25zdCBib29sIFBFUkZPUk1fRVhUUkFfQ09OVEFJTlNfQ0hFQ0sgPSBmYWxzZTsKCiAgZmluYWwgTGlzdDxGbGF0VHlwZU1hc2s+IGRpc2pvaW50TWFza3M7CgogIFVuaW9uVHlwZU1hc2suX2ludGVybmFsKHRoaXMuZGlzam9pbnRNYXNrcykgewogICAgYXNzZXJ0KGRpc2pvaW50TWFza3MubGVuZ3RoID4gMSk7CiAgICBhc3NlcnQoZGlzam9pbnRNYXNrcy5ldmVyeSgoVHlwZU1hc2sgbWFzaykgPT4gIW1hc2suaXNVbmlvbikpOwogIH0KCiAgLy8vIERlc2VyaWFsaXplcyBhIFtVbmlvblR5cGVNYXNrXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IFVuaW9uVHlwZU1hc2sucmVhZEZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIExpc3Q8RmxhdFR5cGVNYXNrPiBkaXNqb2ludE1hc2tzID0gc291cmNlCiAgICAgICAgLnJlYWRMaXN0KCgpID0+IG5ldyBUeXBlTWFzay5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlLCBjbG9zZWRXb3JsZCkpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBVbmlvblR5cGVNYXNrLl9pbnRlcm5hbChkaXNqb2ludE1hc2tzKTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW1VuaW9uVHlwZU1hc2tdIHRvIFtzaW5rXS4KICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShUeXBlTWFza0tpbmQudW5pb24pOwogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUxpc3QoCiAgICAgICAgZGlzam9pbnRNYXNrcywgKEZsYXRUeXBlTWFzayBtYXNrKSA9PiBtYXNrLndyaXRlVG9EYXRhU2luayhzaW5rKSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgc3RhdGljIFR5cGVNYXNrIHVuaW9uT2YoSXRlcmFibGU8VHlwZU1hc2s+IG1hc2tzLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGFzc2VydCgKICAgICAgICBtYXNrcy5ldmVyeSgobWFzaykgPT4gVHlwZU1hc2suYXNzZXJ0SXNOb3JtYWxpemVkKG1hc2ssIGNsb3NlZFdvcmxkKSkpOwogICAgTGlzdDxGbGF0VHlwZU1hc2s+IGRpc2pvaW50ID0gPEZsYXRUeXBlTWFzaz5bXTsKICAgIHVuaW9uT2ZIZWxwZXIobWFza3MsIGRpc2pvaW50LCBjbG9zZWRXb3JsZCk7CiAgICBpZiAoZGlzam9pbnQuaXNFbXB0eSkgcmV0dXJuIG5ldyBUeXBlTWFzay5ub25OdWxsRW1wdHkoKTsKICAgIGlmIChkaXNqb2ludC5sZW5ndGggPiBNQVhfVU5JT05fTEVOR1RIKSB7CiAgICAgIHJldHVybiBmbGF0dGVuKGRpc2pvaW50LCBjbG9zZWRXb3JsZCk7CiAgICB9CiAgICBpZiAoZGlzam9pbnQubGVuZ3RoID09IDEpIHJldHVybiBkaXNqb2ludFswXTsKICAgIFVuaW9uVHlwZU1hc2sgdW5pb24gPSBuZXcgVW5pb25UeXBlTWFzay5faW50ZXJuYWwoZGlzam9pbnQpOwogICAgYXNzZXJ0KFR5cGVNYXNrLmFzc2VydElzTm9ybWFsaXplZCh1bmlvbiwgY2xvc2VkV29ybGQpKTsKICAgIHJldHVybiB1bmlvbjsKICB9CgogIHN0YXRpYyB2b2lkIHVuaW9uT2ZIZWxwZXIoSXRlcmFibGU8VHlwZU1hc2s+IG1hc2tzLAogICAgICBMaXN0PEZsYXRUeXBlTWFzaz4gZGlzam9pbnQsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogSW1wb3NlIGFuIG9yZGVyIG9uIHRoZSBtYXNrIHRvIGVuc3VyZSBzdWJjbGFzcyBtYXNrcwogICAgLy8gYXJlIHByZWZlcnJlZCB0byBzdWJ0eXBlIG1hc2tzLgogICAgZm9yIChUeXBlTWFzayBtYXNrIGluIG1hc2tzKSB7CiAgICAgIG1hc2sgPSBUeXBlTWFzay5ub25Gb3J3YXJkaW5nTWFzayhtYXNrKTsKICAgICAgaWYgKG1hc2suaXNVbmlvbikgewogICAgICAgIFVuaW9uVHlwZU1hc2sgdW5pb24gPSBtYXNrOwogICAgICAgIHVuaW9uT2ZIZWxwZXIodW5pb24uZGlzam9pbnRNYXNrcywgZGlzam9pbnQsIGNsb3NlZFdvcmxkKTsKICAgICAgfSBlbHNlIGlmIChtYXNrLmlzRW1wdHkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBGbGF0VHlwZU1hc2sgZmxhdE1hc2sgPSBtYXNrOwogICAgICAgIGludCBpbkxpc3RJbmRleCA9IC0xOwogICAgICAgIGJvb2wgY292ZXJlZCA9IGZhbHNlOwoKICAgICAgICAvLyBJdGVyYXRlIG92ZXIgW2Rpc2pvaW50XSB0byBmaW5kIG91dCBpZiBvbmUgb2YgdGhlIG1hc2sKICAgICAgICAvLyBhbHJlYWR5IGNvdmVycyBbbWFza10uCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXNqb2ludC5sZW5ndGg7IGkrKykgewogICAgICAgICAgRmxhdFR5cGVNYXNrIGN1cnJlbnQgPSBkaXNqb2ludFtpXTsKICAgICAgICAgIGlmIChjdXJyZW50ID09IG51bGwpIGNvbnRpbnVlOwogICAgICAgICAgVHlwZU1hc2sgbmV3TWFzayA9IGZsYXRNYXNrLnVuaW9uKGN1cnJlbnQsIGNsb3NlZFdvcmxkKTsKICAgICAgICAgIC8vIElmIHdlIGhhdmUgZm91bmQgYSBkaXNqb2ludCB1bmlvbiwgY29udGludWUgaXRlcmF0aW5nLgogICAgICAgICAgaWYgKG5ld01hc2suaXNVbmlvbikgY29udGludWU7CiAgICAgICAgICBjb3ZlcmVkID0gdHJ1ZTsKICAgICAgICAgIC8vIFdlIGZvdW5kIGEgbWFzayB0aGF0IGlzIGVpdGhlciBlcXVhbCB0byBbbWFza10gb3IgaXMgYQogICAgICAgICAgLy8gc3VwZXJ0eXBlIG9mIFttYXNrXS4KICAgICAgICAgIGlmIChjdXJyZW50ID09IG5ld01hc2spIGJyZWFrOwoKICAgICAgICAgIC8vIFttYXNrXSBpcyBhIHN1cGVydHlwZSBvZiBbY3VycmVudF0sIHJlcGxhY2UgdGhlIFtkaXNqb2ludF0KICAgICAgICAgIC8vIGxpc3Qgd2l0aCBbbmV3TWFza10gaW5zdGVhZCBvZiBbY3VycmVudF0uIE5vdGUgdGhhdAogICAgICAgICAgLy8gW25ld01hc2tdIG1heSBjb250YWluIGRpZmZlcmVudCBpbmZvcm1hdGlvbiB0aGFuIFttYXNrXSwKICAgICAgICAgIC8vIGxpa2UgbnVsbGFiaWxpdHkuCiAgICAgICAgICBkaXNqb2ludFtpXSA9IG5ld01hc2s7CiAgICAgICAgICBmbGF0TWFzayA9IG5ld01hc2s7CgogICAgICAgICAgaWYgKGluTGlzdEluZGV4ICE9IC0xKSB7CiAgICAgICAgICAgIC8vIElmIHRoZSBtYXNrIHdhcyBhbHJlYWR5IGNvdmVyZWQsIHdlIHJlbW92ZSB0aGUgcHJldmlvdXMKICAgICAgICAgICAgLy8gcGxhY2Ugd2hlcmUgaXQgd2FzIGluc2VydGVkLiBUaGlzIG5ldyBtYXNrIHN1YnN1bWVzIHRoZQogICAgICAgICAgICAvLyBwcmV2aW91c2x5IGNvdmVyZWQgb25lLgogICAgICAgICAgICBkaXNqb2ludC5yZW1vdmVBdChpbkxpc3RJbmRleCk7CiAgICAgICAgICAgIGktLTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIFJlY29yZCB3aGVyZSB0aGUgbWFzayB3YXMgaW5zZXJ0ZWQuCiAgICAgICAgICBpbkxpc3RJbmRleCA9IGk7CiAgICAgICAgfQogICAgICAgIC8vIElmIG5vbmUgb2YgdGhlIG1hc2tzIGluIFtkaXNqb2ludF0gY292ZXJzIFttYXNrXSwgd2UganVzdAogICAgICAgIC8vIGFkZCBbbWFza10gdG8gdGhlIGxpc3QuCiAgICAgICAgaWYgKCFjb3ZlcmVkKSBkaXNqb2ludC5hZGQoZmxhdE1hc2spOwogICAgICB9CiAgICB9CiAgfQoKICBzdGF0aWMgVHlwZU1hc2sgZmxhdHRlbihMaXN0PEZsYXRUeXBlTWFzaz4gbWFza3MsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTW92ZSB0aGlzIGNvbXB1dGF0aW9uIHRvIFtDbG9zZWRXb3JsZF0gYW5kIHVzZSB0aGUKICAgIC8vIGNsYXNzIHNldCBzdHJ1Y3R1cmVzLgogICAgYXNzZXJ0KG1hc2tzLmxlbmd0aCA+IDEpOwogICAgLy8gSWYgZWl0aGVyIHR5cGUgbWFzayBpcyBhIHN1YnR5cGUgdHlwZSBtYXNrLCB3ZSBjYW5ub3QgdXNlIGEKICAgIC8vIHN1YmNsYXNzIHR5cGUgbWFzayB0byByZXByZXNlbnQgdGhlaXIgdW5pb24uCiAgICBib29sIHVzZVN1YmNsYXNzID0gbWFza3MuZXZlcnkoKGUpID0+ICFlLmlzU3VidHlwZSk7CiAgICBib29sIGlzTnVsbGFibGUgPSBtYXNrcy5hbnkoKGUpID0+IGUuaXNOdWxsYWJsZSk7CgogICAgTGlzdDxDbGFzc0VudGl0eT4gbWFza3NCYXNlcyA9IG1hc2tzLm1hcCgobWFzaykgPT4gbWFzay5iYXNlKS50b0xpc3QoKTsKICAgIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBjYW5kaWRhdGVzID0KICAgICAgICBjbG9zZWRXb3JsZC5jb21tb25TdXBlcnR5cGVzT2YobWFza3NCYXNlcyk7CgogICAgLy8gQ29tcHV0ZSB0aGUgYmVzdCBjYW5kaWRhdGUgYW5kIGl0cyBraW5kLgogICAgQ2xhc3NFbnRpdHkgYmVzdEVsZW1lbnQ7CiAgICBpbnQgYmVzdEtpbmQ7CiAgICBpbnQgYmVzdFNpemU7CiAgICBmb3IgKENsYXNzRW50aXR5IGNhbmRpZGF0ZSBpbiBjYW5kaWRhdGVzKSB7CiAgICAgIGJvb2wgaXNJbnN0YW50aWF0ZWRTdHJpY3RTdWJjbGFzcyhjbHMpID0+CiAgICAgICAgICBjbHMgIT0gY2FuZGlkYXRlICYmCiAgICAgICAgICBjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc0V4cGxpY2l0bHlJbnN0YW50aWF0ZWQoY2xzKSAmJgogICAgICAgICAgY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNTdWJjbGFzc09mKGNscywgY2FuZGlkYXRlKTsKCiAgICAgIGludCBzaXplOwogICAgICBpbnQga2luZDsKICAgICAgaWYgKHVzZVN1YmNsYXNzICYmIG1hc2tzQmFzZXMuZXZlcnkoaXNJbnN0YW50aWF0ZWRTdHJpY3RTdWJjbGFzcykpIHsKICAgICAgICAvLyBJZiBib3RoIFt0aGlzXSBhbmQgW290aGVyXSBhcmUgc3ViY2xhc3NlcyBvZiB0aGUgc3VwZXJ0eXBlLAogICAgICAgIC8vIHRoZW4gd2UgcHJlZmVyIHRvIGNvbnN0cnVjdCBhIHN1YmNsYXNzIHR5cGUgbWFzayBiZWNhdXNlIGl0CiAgICAgICAgLy8gd2lsbCBhbHdheXMgYmUgYXQgbGVhc3QgYXMgc21hbGwgYXMgdGhlIGNvcnJlc3BvbmRpbmcKICAgICAgICAvLyBzdWJ0eXBlIHR5cGUgbWFzay4KICAgICAgICBraW5kID0gRmxhdFR5cGVNYXNrLlNVQkNMQVNTOwogICAgICAgIC8vIFRPRE8oc2lnbXVuZCwgam9obm5pd2ludGhlcik6IGNvbXB1dGluZyBsZW5ndGggaGVyZSAoYW5kIGJlbG93KSBpcwogICAgICAgIC8vIGV4cGVuc2l2ZS4gSWYgd2UgY2FuJ3QgcHJldmVudCBgZmxhdHRlbmAgZnJvbSBiZWluZyBjYWxsZWQgYSBsb3QsIGl0CiAgICAgICAgLy8gbWlnaHQgYmUgd29ydGggY2FjaGluZyByZXN1bHRzLgogICAgICAgIHNpemUgPSBjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5zdHJpY3RTdWJjbGFzc0NvdW50KGNhbmRpZGF0ZSk7CiAgICAgICAgYXNzZXJ0KAogICAgICAgICAgICBzaXplIDw9IGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LnN0cmljdFN1YnR5cGVDb3VudChjYW5kaWRhdGUpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBraW5kID0gRmxhdFR5cGVNYXNrLlNVQlRZUEU7CiAgICAgICAgc2l6ZSA9IGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LnN0cmljdFN1YnR5cGVDb3VudChjYW5kaWRhdGUpOwogICAgICB9CiAgICAgIC8vIFVwZGF0ZSB0aGUgYmVzdCBjYW5kaWRhdGUgaWYgdGhlIG5ldyBvbmUgaXMgYmV0dGVyLgogICAgICBpZiAoYmVzdEVsZW1lbnQgPT0gbnVsbCB8fCBzaXplIDwgYmVzdFNpemUpIHsKICAgICAgICBiZXN0RWxlbWVudCA9IGNhbmRpZGF0ZTsKICAgICAgICBiZXN0U2l6ZSA9IHNpemU7CiAgICAgICAgYmVzdEtpbmQgPSBraW5kOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IFR5cGVNYXNrKGJlc3RFbGVtZW50LCBiZXN0S2luZCwgaXNOdWxsYWJsZSwgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgdW5pb24oZHluYW1pYyBvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBvdGhlciA9IFR5cGVNYXNrLm5vbkZvcndhcmRpbmdNYXNrKG90aGVyKTsKICAgIGlmICghb3RoZXIuaXNVbmlvbiAmJiBkaXNqb2ludE1hc2tzLmNvbnRhaW5zKG90aGVyKSkgcmV0dXJuIHRoaXM7CgogICAgTGlzdDxGbGF0VHlwZU1hc2s+IG5ld0xpc3QgPSBuZXcgTGlzdDxGbGF0VHlwZU1hc2s+LmZyb20oZGlzam9pbnRNYXNrcyk7CiAgICBpZiAoIW90aGVyLmlzVW5pb24pIHsKICAgICAgbmV3TGlzdC5hZGQob3RoZXIpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KG90aGVyIGlzIFVuaW9uVHlwZU1hc2spOwogICAgICBuZXdMaXN0LmFkZEFsbChvdGhlci5kaXNqb2ludE1hc2tzKTsKICAgIH0KICAgIHJldHVybiBuZXcgVHlwZU1hc2sudW5pb25PZihuZXdMaXN0LCBjbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBpbnRlcnNlY3Rpb24oZHluYW1pYyBvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBvdGhlciA9IFR5cGVNYXNrLm5vbkZvcndhcmRpbmdNYXNrKG90aGVyKTsKICAgIGlmICghb3RoZXIuaXNVbmlvbiAmJiBkaXNqb2ludE1hc2tzLmNvbnRhaW5zKG90aGVyKSkgcmV0dXJuIG90aGVyOwogICAgaWYgKG90aGVyLmlzVW5pb24gJiYgdGhpcyA9PSBvdGhlcikgcmV0dXJuIHRoaXM7CgogICAgTGlzdDxUeXBlTWFzaz4gaW50ZXJzZWN0aW9ucyA9IDxUeXBlTWFzaz5bXTsKICAgIGZvciAoVHlwZU1hc2sgY3VycmVudCBpbiBkaXNqb2ludE1hc2tzKSB7CiAgICAgIGlmIChvdGhlci5pc1VuaW9uKSB7CiAgICAgICAgaWYgKG90aGVyLmRpc2pvaW50TWFza3MuY29udGFpbnMoY3VycmVudCkpIHsKICAgICAgICAgIGludGVyc2VjdGlvbnMuYWRkKGN1cnJlbnQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmb3IgKEZsYXRUeXBlTWFzayBmbGF0T3RoZXIgaW4gb3RoZXIuZGlzam9pbnRNYXNrcykgewogICAgICAgICAgICBpbnRlcnNlY3Rpb25zLmFkZChjdXJyZW50LmludGVyc2VjdGlvbihmbGF0T3RoZXIsIGNsb3NlZFdvcmxkKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGludGVyc2VjdGlvbnMuYWRkKGN1cnJlbnQuaW50ZXJzZWN0aW9uKG90aGVyLCBjbG9zZWRXb3JsZCkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IFR5cGVNYXNrLnVuaW9uT2YoaW50ZXJzZWN0aW9ucywgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0Rpc2pvaW50KFR5cGVNYXNrIG90aGVyLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGZvciAodmFyIGN1cnJlbnQgaW4gZGlzam9pbnRNYXNrcykgewogICAgICBpZiAoIWN1cnJlbnQuaXNEaXNqb2ludChvdGhlciwgY2xvc2VkV29ybGQpKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIG51bGxhYmxlKCkgewogICAgaWYgKGlzTnVsbGFibGUpIHJldHVybiB0aGlzOwogICAgTGlzdDxGbGF0VHlwZU1hc2s+IG5ld0xpc3QgPSBuZXcgTGlzdDxGbGF0VHlwZU1hc2s+LmZyb20oZGlzam9pbnRNYXNrcyk7CiAgICBuZXdMaXN0WzBdID0gbmV3TGlzdFswXS5udWxsYWJsZSgpOwogICAgcmV0dXJuIG5ldyBVbmlvblR5cGVNYXNrLl9pbnRlcm5hbChuZXdMaXN0KTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIG5vbk51bGxhYmxlKCkgewogICAgaWYgKCFpc051bGxhYmxlKSByZXR1cm4gdGhpczsKICAgIEl0ZXJhYmxlPEZsYXRUeXBlTWFzaz4gbmV3SXRlcmFibGUgPSBkaXNqb2ludE1hc2tzLm1hcCgoZSkgewogICAgICBGbGF0VHlwZU1hc2sgciA9IGUubm9uTnVsbGFibGUoKTsKICAgICAgcmV0dXJuIHI7CiAgICB9KS50b0xpc3QoKTsKICAgIHJldHVybiBuZXcgVW5pb25UeXBlTWFzay5faW50ZXJuYWwobmV3SXRlcmFibGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFbXB0eU9yTnVsbCA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0VtcHR5ID0+IGZhbHNlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTnVsbCA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc051bGxhYmxlID0+IGRpc2pvaW50TWFza3MuYW55KChlKSA9PiBlLmlzTnVsbGFibGUpOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRXhhY3QgPT4gZmFsc2U7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNVbmlvbiA9PiB0cnVlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQ29udGFpbmVyID0+IGZhbHNlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU2V0ID0+IGZhbHNlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTWFwID0+IGZhbHNlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRGljdGlvbmFyeSA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0ZvcndhcmRpbmcgPT4gZmFsc2U7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNWYWx1ZSA9PiBmYWxzZTsKCiAgLy8vIENoZWNrcyB3aGV0aGVyIFtvdGhlcl0gaXMgY29udGFpbmVkIGluIHRoaXMgdW5pb24uCiAgLy8vCiAgLy8vIEludmFyaWFudHM6CiAgLy8vIC0gW290aGVyXSBtYXkgbm90IGJlIGEgW1VuaW9uVHlwZU1hc2tdIGl0c2VsZgogIC8vLyAtIHRoZSBjaGVhcCB0ZXN0IG1hdGNoaW5nIGFnYWluc3QgaW5kaXZpZHVhbCBtZW1iZXJzIG9mIFtkaXNqb2ludE1hc2tzXQogIC8vLyAgIG11c3QgaGF2ZSBmYWlsZWQuCiAgYm9vbCBzbG93Q29udGFpbnNDaGVjayhUeXBlTWFzayBvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICAvLyBVbmlvbnMgc2hvdWxkIG5ldmVyIG1ha2UgaXQgaGVyZS4KICAgIGFzc2VydCghb3RoZXIuaXNVbmlvbik7CiAgICAvLyBFbnN1cmUgdGhlIGNoZWFwIHRlc3QgZmFpbHMuCiAgICBhc3NlcnQoIWRpc2pvaW50TWFza3MuYW55KChtYXNrKSA9PiBtYXNrLmNvbnRhaW5zTWFzayhvdGhlciwgY2xvc2VkV29ybGQpKSk7CiAgICAvLyBJZiB3ZSBjb3ZlciBvYmplY3QsIHdlIHNob3VsZCBuZXZlciBnZXQgaGVyZS4KICAgIGFzc2VydCghY29udGFpbnMoY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MsIGNsb3NlZFdvcmxkKSk7CiAgICAvLyBMaWtld2lzZSwgbnVsbG5lc3Mgc2hvdWxkIGJlIGNvdmVyZWQuCiAgICBhc3NlcnQoaXNOdWxsYWJsZSB8fCAhb3RoZXIuaXNOdWxsYWJsZSk7CiAgICAvLyBUaGUgZmFzdCB0ZXN0IGlzIHByZWNpc2UgZm9yIGV4YWN0IHR5cGVzLgogICAgaWYgKG90aGVyLmlzRXhhY3QpIHJldHVybiBmYWxzZTsKICAgIC8vIFdlIGNhbm5vdCBjb250YWluIG9iamVjdC4KICAgIGlmIChvdGhlci5jb250YWlucyhjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5vYmplY3RDbGFzcywgY2xvc2VkV29ybGQpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIEZsYXRUeXBlTWFzayBmbGF0ID0gVHlwZU1hc2subm9uRm9yd2FyZGluZ01hc2sob3RoZXIpOwogICAgLy8gQ2hlY2sgd2UgY292ZXIgdGhlIGJhc2UgY2xhc3MuCiAgICBpZiAoIWNvbnRhaW5zKGZsYXQuYmFzZSwgY2xvc2VkV29ybGQpKSByZXR1cm4gZmFsc2U7CiAgICAvLyBDaGVjayBmb3Igb3RoZXIgbWVtYmVycy4KICAgIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBtZW1iZXJzOwogICAgaWYgKGZsYXQuaXNTdWJjbGFzcykgewogICAgICBtZW1iZXJzID0gY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuc3RyaWN0U3ViY2xhc3Nlc09mKGZsYXQuYmFzZSk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoZmxhdC5pc1N1YnR5cGUpOwogICAgICBtZW1iZXJzID0gY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuc3RyaWN0U3VidHlwZXNPZihmbGF0LmJhc2UpOwogICAgfQogICAgcmV0dXJuIG1lbWJlcnMuZXZlcnkoKENsYXNzRW50aXR5IGNscykgPT4gdGhpcy5jb250YWlucyhjbHMsIGNsb3NlZFdvcmxkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSW5NYXNrKFR5cGVNYXNrIG90aGVyLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIG90aGVyID0gVHlwZU1hc2subm9uRm9yd2FyZGluZ01hc2sob3RoZXIpOwogICAgaWYgKGlzTnVsbGFibGUgJiYgIW90aGVyLmlzTnVsbGFibGUpIHJldHVybiBmYWxzZTsKICAgIGlmIChvdGhlci5pc1VuaW9uKSB7CiAgICAgIFVuaW9uVHlwZU1hc2sgdW5pb24gPSBvdGhlcjsKICAgICAgYm9vbCBjb250YWluZWRJbkFueU9mKEZsYXRUeXBlTWFzayBtYXNrLCBJdGVyYWJsZTxGbGF0VHlwZU1hc2s+IG1hc2tzKSB7CiAgICAgICAgLy8gbnVsbCBpcyBub3QgY2Fub25pY2FsaXplZCBmb3IgdGhlIHVuaW9uIGJ1dCBzdG9yZWQgb25seSBvbiBzb21lCiAgICAgICAgLy8gbWFza3MgaW4gW2Rpc2pvaW50TWFza10uIEl0IGhhcyBiZWVuIGNoZWNrZWQgaW4gdGhlIHN1cnJvdW5kaW5nCiAgICAgICAgLy8gY29udGV4dCwgc28gd2UgY2FuIHNhZmVseSBpZ25vcmUgaXQgaGVyZS4KICAgICAgICBGbGF0VHlwZU1hc2sgbWFza0Rpc3JlZ2FyZE51bGwgPSBtYXNrLm5vbk51bGxhYmxlKCk7CiAgICAgICAgcmV0dXJuIG1hc2tzLmFueSgoRmxhdFR5cGVNYXNrIG90aGVyKSB7CiAgICAgICAgICByZXR1cm4gb3RoZXIuY29udGFpbnNNYXNrKG1hc2tEaXNyZWdhcmROdWxsLCBjbG9zZWRXb3JsZCk7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIHJldHVybiBkaXNqb2ludE1hc2tzLmV2ZXJ5KChGbGF0VHlwZU1hc2sgZGlzam9pbnRNYXNrKSB7CiAgICAgICAgYm9vbCBjb250YWluZWQgPSBjb250YWluZWRJbkFueU9mKGRpc2pvaW50TWFzaywgdW5pb24uZGlzam9pbnRNYXNrcyk7CiAgICAgICAgaWYgKFBFUkZPUk1fRVhUUkFfQ09OVEFJTlNfQ0hFQ0sgJiYKICAgICAgICAgICAgIWNvbnRhaW5lZCAmJgogICAgICAgICAgICB1bmlvbi5zbG93Q29udGFpbnNDaGVjayhkaXNqb2ludE1hc2ssIGNsb3NlZFdvcmxkKSkgewogICAgICAgICAgdGhyb3cgIlR5cGVNYXNrIGJhc2VkIGNvbnRhaW5tZW50IGNoZWNrIGZhaWxlZCBmb3IgJHRoaXMgYW5kICRvdGhlci4iOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29udGFpbmVkOwogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBkaXNqb2ludE1hc2tzLmV2ZXJ5KChtYXNrKSA9PiBtYXNrLmlzSW5NYXNrKG90aGVyLCBjbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc01hc2soVHlwZU1hc2sgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgb3RoZXIgPSBUeXBlTWFzay5ub25Gb3J3YXJkaW5nTWFzayhvdGhlcik7CiAgICBpZiAob3RoZXIuaXNOdWxsYWJsZSAmJiAhaXNOdWxsYWJsZSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKG90aGVyLmlzVW5pb24pIHJldHVybiBvdGhlci5pc0luTWFzayh0aGlzLCBjbG9zZWRXb3JsZCk7CiAgICBvdGhlciA9IG90aGVyLm5vbk51bGxhYmxlKCk7IC8vIG51bGxhYmxlIGlzIG5vdCBjYW5vbmljYWxpemVkLCBzbyBkcm9wIGl0LgogICAgYm9vbCBjb250YWluZWQgPQogICAgICAgIGRpc2pvaW50TWFza3MuYW55KChtYXNrKSA9PiBtYXNrLmNvbnRhaW5zTWFzayhvdGhlciwgY2xvc2VkV29ybGQpKTsKICAgIGlmIChQRVJGT1JNX0VYVFJBX0NPTlRBSU5TX0NIRUNLICYmCiAgICAgICAgIWNvbnRhaW5lZCAmJgogICAgICAgIHNsb3dDb250YWluc0NoZWNrKG90aGVyLCBjbG9zZWRXb3JsZCkpIHsKICAgICAgdGhyb3cgIlR5cGVNYXNrIGJhc2VkIGNvbnRhaW5tZW50IGNoZWNrIGZhaWxlZCBmb3IgJHRoaXMgYW5kICRvdGhlci4iOwogICAgfQogICAgcmV0dXJuIGNvbnRhaW5lZDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNPbmx5SW50KEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGRpc2pvaW50TWFza3MuZXZlcnkoKG1hc2spID0+IG1hc2suY29udGFpbnNPbmx5SW50KGNsb3NlZFdvcmxkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zT25seURvdWJsZShKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBkaXNqb2ludE1hc2tzLmV2ZXJ5KChtYXNrKSA9PiBtYXNrLmNvbnRhaW5zT25seURvdWJsZShjbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc09ubHlOdW0oSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gZGlzam9pbnRNYXNrcy5ldmVyeSgobWFzaykgewogICAgICByZXR1cm4gbWFzay5jb250YWluc09ubHlOdW0oY2xvc2VkV29ybGQpOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zT25seUJvb2woSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gZGlzam9pbnRNYXNrcy5ldmVyeSgobWFzaykgPT4gbWFzay5jb250YWluc09ubHlCb29sKGNsb3NlZFdvcmxkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zT25seVN0cmluZyhKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBkaXNqb2ludE1hc2tzLmV2ZXJ5KChtYXNrKSA9PiBtYXNrLmNvbnRhaW5zT25seVN0cmluZyhjbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc09ubHkoQ2xhc3NFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIGRpc2pvaW50TWFza3MuZXZlcnkoKG1hc2spID0+IG1hc2suY29udGFpbnNPbmx5KGVsZW1lbnQpKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgc2F0aXNmaWVzKENsYXNzRW50aXR5IGNscywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gZGlzam9pbnRNYXNrcy5ldmVyeSgobWFzaykgPT4gbWFzay5zYXRpc2ZpZXMoY2xzLCBjbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWlucyhDbGFzc0VudGl0eSBjbHMsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGRpc2pvaW50TWFza3MuYW55KChlKSA9PiBlLmNvbnRhaW5zKGNscywgY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNBbGwoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gZGlzam9pbnRNYXNrcy5hbnkoKG1hc2spID0+IG1hc2suY29udGFpbnNBbGwoY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IHNpbmdsZUNsYXNzKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBuZWVkc05vU3VjaE1ldGhvZEhhbmRsaW5nKFNlbGVjdG9yIHNlbGVjdG9yLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBkaXNqb2ludE1hc2tzCiAgICAgICAgLmFueSgoZSkgPT4gZS5uZWVkc05vU3VjaE1ldGhvZEhhbmRsaW5nKHNlbGVjdG9yLCBjbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjYW5IaXQoTWVtYmVyRW50aXR5IGVsZW1lbnQsIE5hbWUgbmFtZSwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gZGlzam9pbnRNYXNrcy5hbnkoKGUpID0+IGUuY2FuSGl0KGVsZW1lbnQsIG5hbWUsIGNsb3NlZFdvcmxkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBNZW1iZXJFbnRpdHkgbG9jYXRlU2luZ2xlTWVtYmVyKFNlbGVjdG9yIHNlbGVjdG9yLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIE1lbWJlckVudGl0eSBjYW5kaWRhdGU7CiAgICBmb3IgKEZsYXRUeXBlTWFzayBtYXNrIGluIGRpc2pvaW50TWFza3MpIHsKICAgICAgTWVtYmVyRW50aXR5IGN1cnJlbnQgPSBtYXNrLmxvY2F0ZVNpbmdsZU1lbWJlcihzZWxlY3RvciwgY2xvc2VkV29ybGQpOwogICAgICBpZiAoY3VycmVudCA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0gZWxzZSBpZiAoY2FuZGlkYXRlID09IG51bGwpIHsKICAgICAgICBjYW5kaWRhdGUgPSBjdXJyZW50OwogICAgICB9IGVsc2UgaWYgKGNhbmRpZGF0ZSAhPSBjdXJyZW50KSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBjYW5kaWRhdGU7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmcgbWFza3NTdHJpbmcgPQogICAgICAgIChkaXNqb2ludE1hc2tzLm1hcCgoVHlwZU1hc2sgbWFzaykgPT4gbWFzay50b1N0cmluZygpKS50b0xpc3QoKS4uc29ydCgpKQogICAgICAgICAgICAuam9pbigiLCAiKTsKICAgIHJldHVybiAnVW5pb24oJG1hc2tzU3RyaW5nKSc7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CgogICAgYm9vbCBjb250YWluc0FsbCgpIHsKICAgICAgcmV0dXJuIG90aGVyLmRpc2pvaW50TWFza3MuZXZlcnkoKGUpIHsKICAgICAgICB2YXIgbWFwID0gZGlzam9pbnRNYXNrcy5tYXAoKGUpID0+IGUubm9uTnVsbGFibGUoKSk7CiAgICAgICAgcmV0dXJuIG1hcC5jb250YWlucyhlLm5vbk51bGxhYmxlKCkpOwogICAgICB9KTsKICAgIH0KCiAgICByZXR1cm4gb3RoZXIgaXMgVW5pb25UeXBlTWFzayAmJgogICAgICAgIG90aGVyLmlzTnVsbGFibGUgPT0gaXNOdWxsYWJsZSAmJgogICAgICAgIG90aGVyLmRpc2pvaW50TWFza3MubGVuZ3RoID09IGRpc2pvaW50TWFza3MubGVuZ3RoICYmCiAgICAgICAgY29udGFpbnNBbGwoKTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgewogICAgaW50IGhhc2hDb2RlID0gaXNOdWxsYWJsZSA/IDg2IDogNDM7CiAgICAvLyBUaGUgb3JkZXIgb2YgdGhlIG1hc2tzIGluIFtkaXNqb2ludE1hc2tzXSBtdXN0IG5vdCBhZmZlY3QgdGhlCiAgICAvLyBoYXNoQ29kZS4KICAgIGZvciAodmFyIG1hc2sgaW4gZGlzam9pbnRNYXNrcykgewogICAgICBoYXNoQ29kZSA9IChoYXNoQ29kZSBeIG1hc2subm9uTnVsbGFibGUoKS5oYXNoQ29kZSkgJiAweDNmZmZmZmZmOwogICAgfQogICAgcmV0dXJuIGhhc2hDb2RlOwogIH0KfQqBwABOTjwBDwEqRx0vASkBUUsbOgEqATAmQwQBOyw1Fy5PFTcEATEMKCgVFEsTBAFQDFA0MT4uLQYyQT0SBAE2P1EnIy8aJEMhEg8mHh4BQiI0LilDRCkaRCIpAUhBRh8hHgEjR0cnLBEMMRsKRSMuCAYEAVBPHR5DNDk2AUwnNAEwHRISMDAeRkMBEBBLR0dBHiZOUCtKEE8PJUkIPTQhGRkIBkkEAQw8L0YBTRoaDSYrBjcEAQxDL0c1ATEuGzUmEUBNDAoPRQgGPQQBDD4pQQYRBAEMGCFNKDEEAQwbIkEoEBE1BAEMIwwdDBwMQQwdDBwMIQwbDBsMIgwiDB0BOQYSNE4aRSkcJFE1TC0tMSUhTxQGOyY5ICMbSg0eSAZQBAEMPC83GSNPS0s1PTBFDAgBP04sGkJRChoKBk0EAQxALzdBTxVMKBYxTQYWBAEMM00EAQw2UAQBDDMoMAgEAQw0TgQBDDZQBAEMK0YEAQw+TAQBDD1DBAEML0cEAQw9AQxQGUkEAQxLSwQBDFEcL00dFSYdKRUIBhYEAQwWGVEZIgQBDBwtARktPS4KBgElKj4XBAEMFSlFESZIBhUEAgE8cGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvdHlwZW1hc2tzL3VuaW9uX3R5cGVfbWFzay5kYXJ0RXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2luZmVycmVyL3R5cGVtYXNrcy92YWx1ZV90eXBlX21hc2suZGFydIi3Ly8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgbWFza3M7CgpjbGFzcyBWYWx1ZVR5cGVNYXNrIGV4dGVuZHMgRm9yd2FyZGluZ1R5cGVNYXNrIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW1ZhbHVlVHlwZU1hc2tdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAndmFsdWUtdHlwZS1tYXNrJzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgVHlwZU1hc2sgZm9yd2FyZFRvOwogIGZpbmFsIFByaW1pdGl2ZUNvbnN0YW50VmFsdWUgdmFsdWU7CgogIFZhbHVlVHlwZU1hc2sodGhpcy5mb3J3YXJkVG8sIHRoaXMudmFsdWUpOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW1ZhbHVlVHlwZU1hc2tdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgVmFsdWVUeXBlTWFzay5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgIERhdGFTb3VyY2Ugc291cmNlLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgVHlwZU1hc2sgZm9yd2FyZFRvID0gbmV3IFR5cGVNYXNrLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UsIGNsb3NlZFdvcmxkKTsKICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnQgPSBzb3VyY2UucmVhZENvbnN0YW50KCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IFZhbHVlVHlwZU1hc2soZm9yd2FyZFRvLCBjb25zdGFudCk7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtWYWx1ZVR5cGVNYXNrXSB0byBbc2lua10uCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oVHlwZU1hc2tLaW5kLnZhbHVlKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIGZvcndhcmRUby53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLndyaXRlQ29uc3RhbnQodmFsdWUpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIG51bGxhYmxlKCkgewogICAgcmV0dXJuIGlzTnVsbGFibGUgPyB0aGlzIDogbmV3IFZhbHVlVHlwZU1hc2soZm9yd2FyZFRvLm51bGxhYmxlKCksIHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIG5vbk51bGxhYmxlKCkgewogICAgcmV0dXJuIGlzTnVsbGFibGUKICAgICAgICA/IG5ldyBWYWx1ZVR5cGVNYXNrKGZvcndhcmRUby5ub25OdWxsYWJsZSgpLCB2YWx1ZSkKICAgICAgICA6IHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1ZhbHVlID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgZXF1YWxzRGlzcmVnYXJkTnVsbChvdGhlcikgewogICAgaWYgKG90aGVyIGlzISBWYWx1ZVR5cGVNYXNrKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gc3VwZXIuZXF1YWxzRGlzcmVnYXJkTnVsbChvdGhlcikgJiYgdmFsdWUgPT0gb3RoZXIudmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBpbnRlcnNlY3Rpb24oVHlwZU1hc2sgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgVHlwZU1hc2sgZm9yd2FyZEludGVyc2VjdGlvbiA9IGZvcndhcmRUby5pbnRlcnNlY3Rpb24ob3RoZXIsIGNsb3NlZFdvcmxkKTsKICAgIGlmIChmb3J3YXJkSW50ZXJzZWN0aW9uLmlzRW1wdHlPck51bGwpIHJldHVybiBmb3J3YXJkSW50ZXJzZWN0aW9uOwogICAgcmV0dXJuIGZvcndhcmRJbnRlcnNlY3Rpb24uaXNOdWxsYWJsZSA/IG51bGxhYmxlKCkgOiBub25OdWxsYWJsZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgPT4gc3VwZXIgPT0gb3RoZXI7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgewogICAgcmV0dXJuIGNvbXB1dGVIYXNoQ29kZSh2YWx1ZSwgaXNOdWxsYWJsZSwgZm9yd2FyZFRvKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnVmFsdWUoJGZvcndhcmRUbywgdmFsdWU6ICR7dmFsdWUudG9EYXJ0VGV4dCgpfSknOwogIH0KfQpQAE5OPAEPATFHHS8BDBwmAS0BOyw1F080FTMEATEMKCgVJR8TBAEMGE8EAQwbFjwQBAEMHAEMJC9FBAEMRE9HSAQBDC0BDBU6BAEMFj4EAgE8cGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvdHlwZW1hc2tzL3ZhbHVlX3R5cGVfbWFzay5kYXJ0MXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2luZmVycmVyL3R5cGVzLmRhcnTAAFUvLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgdHlwZXM7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICcuLi9jb21tb24uZGFydCcgc2hvdyBmYWlsZWRBdCwgcmV0YWluRGF0YUZvclRlc3Rpbmc7CmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbi90YXNrcy5kYXJ0JyBzaG93IENvbXBpbGVyVGFzazsKaW1wb3J0ICcuLi9jb21waWxlci5kYXJ0JyBzaG93IENvbXBpbGVyOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvaW5mZXJyZWRfZGF0YS5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci90eXBlX2dyYXBoX2luZmVycmVyLmRhcnQnIHNob3cgVHlwZUdyYXBoSW5mZXJyZXI7CmltcG9ydCAnLi4vc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3I7CmltcG9ydCAnLi4vd29ybGQuZGFydCcgc2hvdyBKQ2xvc2VkV29ybGQ7CmltcG9ydCAnYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJy4uL2luZmVycmVyL2luZmVycmVyX2VuZ2luZS5kYXJ0JzsKCi8vLyBSZXN1bHRzIGFib3V0IGEgc2luZ2xlIGVsZW1lbnQgKGUuZy4gYSBtZXRob2QsIHBhcmFtZXRlciwgb3IgZmllbGQpCi8vLyBwcm9kdWNlZCBieSB0aGUgZ2xvYmFsIHR5cGUtaW5mZXJlbmNlIGFsZ29yaXRobS4KLy8vCi8vLyBBbGwgcXVlcmllcyBpbiB0aGlzIGNsYXNzIG1heSBjb250YWluIHJlc3VsdHMgdGhhdCBhc3N1bWUgd2hvbGUtcHJvZ3JhbQovLy8gY2xvc2VkLXdvcmxkIHNlbWFudGljcy4gQW55IFtUeXBlTWFza10gZm9yIGFuIGVsZW1lbnQgb3Igbm9kZSB0aGF0IHdlIHJldHVybgovLy8gd2FzIGluZmVycmVkIHRvIGJlIGEgImd1YXJhbnRlZWQgdHlwZSIsIHRoYXQgbWVhbnMsIGl0IGlzIGEgdHlwZSB0aGF0IHdlCi8vLyBjYW4gcHJvdmUgdG8gYmUgY29ycmVjdCBmb3IgYWxsIGV4ZWN1dGlvbnMgb2YgdGhlIHByb2dyYW0uICBBIHRyaXZpYWwKLy8vIGltcGxlbWVudGF0aW9uIHdvdWxkIHJldHVybiBmYWxzZSBvbiBhbGwgYm9vbGVhbiBwcm9wZXJ0aWVzIChnaXZpbmcgbm8KLy8vIGd1YXJhbnRlZXMpIGFuZCB0aGUgYHN1YmNsYXNzIG9mIE9iamVjdCBvciBudWxsYCB0eXBlIG1hc2sgZm9yIHRoZSB0eXBlCi8vLyBiYXNlZCBxdWVyaWVzICh0aGUgcnVudGltZSB2YWx1ZSBjb3VsZCBiZSBhbnl0aGluZykuCmFic3RyYWN0IGNsYXNzIEdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHQgewogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdF0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBHbG9iYWxUeXBlSW5mZXJlbmNlTWVtYmVyUmVzdWx0LnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgICAgIERhdGFTb3VyY2Ugc291cmNlLCBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4pID0KICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdEltcGwucmVhZEZyb21EYXRhU291cmNlOwoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtHbG9iYWxUeXBlSW5mZXJlbmNlTWVtYmVyUmVzdWx0XSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaywgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluKTsKCiAgLy8vIFRoZSBpbmZlcnJlZCB0eXBlIHdoZW4gdGhpcyByZXN1bHQgYmVsb25ncyB0byBhIGZpZWxkLCBudWxsIG90aGVyd2lzZS4KICBBYnN0cmFjdFZhbHVlIGdldCB0eXBlOwoKICAvLy8gV2hldGhlciB0aGUgbWVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlc3VsdCBpcyBvbmx5IGNhbGxlZCBvbmNlIGluIG9uZQogIC8vLyBsb2NhdGlvbiBpbiB0aGUgZW50aXJlIHByb2dyYW0uCiAgYm9vbCBnZXQgaXNDYWxsZWRPbmNlOwoKICAvLy8gV2hldGhlciB0aGUgbWV0aG9kIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVzdWx0IGFsd2F5cyB0aHJvd3MuCiAgYm9vbCBnZXQgdGhyb3dzQWx3YXlzOwoKICAvLy8gVGhlIGluZmVycmVkIHJldHVybiB0eXBlIHdoZW4gdGhpcyByZXN1bHQgYmVsb25ncyB0byBhIGZ1bmN0aW9uIGVsZW1lbnQuCiAgQWJzdHJhY3RWYWx1ZSBnZXQgcmV0dXJuVHlwZTsKCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgYSBzZW5kIFtub2RlXS4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW5hbWUgdGhpcy4KICBBYnN0cmFjdFZhbHVlIHR5cGVPZlNlbmQoaXIuVHJlZU5vZGUgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBnZXR0ZXIgaW4gYSBjb21wbGV4IHNlbmQtc2V0IFtub2RlXSwgZm9yIGV4YW1wbGUsCiAgLy8vIHRoZSB0eXBlIG9mIHRoZSBgYS5mYCBnZXR0ZXIgaW4gYGEuZiArPSBiYC4KICBBYnN0cmFjdFZhbHVlIHR5cGVPZkdldHRlcihpci5UcmVlTm9kZSBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGl0ZXJhdG9yIGluIGEgW2xvb3BdLgogIEFic3RyYWN0VmFsdWUgdHlwZU9mSXRlcmF0b3IoaXIuVHJlZU5vZGUgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBgbW92ZU5leHRgIGNhbGwgb2YgYW4gaXRlcmF0b3IgaW4gYSBbbG9vcF0uCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZJdGVyYXRvck1vdmVOZXh0KGlyLlRyZWVOb2RlIG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgYGN1cnJlbnRgIGdldHRlciBvZiBhbiBpdGVyYXRvciBpbiBhIFtsb29wXS4KICBBYnN0cmFjdFZhbHVlIHR5cGVPZkl0ZXJhdG9yQ3VycmVudChpci5UcmVlTm9kZSBub2RlKTsKfQoKLy8vIEludGVybmFsIGRhdGEgdXNlZCBkdXJpbmcgdHlwZS1pbmZlcmVuY2UgdG8gc3RvcmUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgYWJvdXQKLy8vIGEgc2luZ2xlIGVsZW1lbnQuCmFic3RyYWN0IGNsYXNzIEdsb2JhbFR5cGVJbmZlcmVuY2VFbGVtZW50RGF0YSB7CiAgLy8vIERlc2VyaWFsaXplcyBhIFtHbG9iYWxUeXBlSW5mZXJlbmNlRWxlbWVudERhdGFdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgR2xvYmFsVHlwZUluZmVyZW5jZUVsZW1lbnREYXRhLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgICAgIERhdGFTb3VyY2Ugc291cmNlLCBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4pID0KICAgICAgS2VybmVsR2xvYmFsVHlwZUluZmVyZW5jZUVsZW1lbnREYXRhLnJlYWRGcm9tRGF0YVNvdXJjZTsKCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbR2xvYmFsVHlwZUluZmVyZW5jZUVsZW1lbnREYXRhXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaywgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluKTsKCiAgLy8vIENvbXByZXNzZXMgdGhlIGlubmVyIHJlcHJlc2VudGF0aW9uIGJ5IHJlbW92aW5nIFtBYnN0cmFjdFZhbHVlXSBtYXBwaW5ncwogIC8vLyB0byBgbnVsbGAuIFJldHVybnMgdGhlIGRhdGEgb2JqZWN0IGl0c2VsZiBvciBgbnVsbGAgaWYgdGhlIGRhdGEgb2JqZWN0CiAgLy8vIHdhcyBlbXB0eSBhZnRlciBjb21wcmVzc2lvbi4KICBHbG9iYWxUeXBlSW5mZXJlbmNlRWxlbWVudERhdGEgY29tcHJlc3MoKTsKCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMuIE1heWJlIHNwbGl0IGJ5IGFjY2Vzcy9pbnZva2UuCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZTZW5kKGlyLlRyZWVOb2RlIG5vZGUpOwogIEFic3RyYWN0VmFsdWUgdHlwZU9mR2V0dGVyKGlyLlRyZWVOb2RlIG5vZGUpOwoKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkl0ZXJhdG9yKGlyLlRyZWVOb2RlIG5vZGUpOwoKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkl0ZXJhdG9yTW92ZU5leHQoaXIuVHJlZU5vZGUgbm9kZSk7CgogIEFic3RyYWN0VmFsdWUgdHlwZU9mSXRlcmF0b3JDdXJyZW50KGlyLlRyZWVOb2RlIG5vZGUpOwp9CgovLy8gQVBJIHRvIGludGVyYWN0IHdpdGggdGhlIGdsb2JhbCB0eXBlLWluZmVyZW5jZSBlbmdpbmUuCmFic3RyYWN0IGNsYXNzIFR5cGVzSW5mZXJyZXIgewogIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIGFuYWx5emVNYWluKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpOwp9CgovLy8gUmVzdWx0cyBwcm9kdWNlZCBieSB0aGUgZ2xvYmFsIHR5cGUtaW5mZXJlbmNlIGFsZ29yaXRobS4KLy8vCi8vLyBBbGwgcXVlcmllcyBpbiB0aGlzIGNsYXNzIG1heSBjb250YWluIHJlc3VsdHMgdGhhdCBhc3N1bWUgd2hvbGUtcHJvZ3JhbQovLy8gY2xvc2VkLXdvcmxkIHNlbWFudGljcy4gQW55IFtBYnN0cmFjdFZhbHVlXSBmb3IgYW4gZWxlbWVudCBvciBub2RlIHRoYXQgd2UKLy8vIHJldHVybiB3YXMgaW5mZXJyZWQgdG8gYmUgYSAiZ3VhcmFudGVlZCB0eXBlIiwgdGhhdCBtZWFucywgaXQgaXMgYSB0eXBlIHRoYXQKLy8vIHdlIGNhbiBwcm92ZSB0byBiZSBjb3JyZWN0IGZvciBhbGwgZXhlY3V0aW9ucyBvZiB0aGUgcHJvZ3JhbS4KYWJzdHJhY3QgY2xhc3MgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgewogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHNdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMucmVhZEZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLCBJbmZlcnJlZERhdGEgaW5mZXJyZWREYXRhKSB7CiAgICBib29sIGlzVHJpdmlhbCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgaWYgKGlzVHJpdmlhbCkgewogICAgICByZXR1cm4gbmV3IFRyaXZpYWxHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyhjbG9zZWRXb3JsZCk7CiAgICB9CiAgICByZXR1cm4gbmV3IEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzSW1wbC5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgICAgc291cmNlLCBjbG9zZWRXb3JsZCwgaW5mZXJyZWREYXRhKTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0dsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luayk7CgogIEpDbG9zZWRXb3JsZCBnZXQgY2xvc2VkV29ybGQ7CgogIEluZmVycmVkRGF0YSBnZXQgaW5mZXJyZWREYXRhOwoKICBHbG9iYWxUeXBlSW5mZXJlbmNlTWVtYmVyUmVzdWx0IHJlc3VsdE9mTWVtYmVyKE1lbWJlckVudGl0eSBtZW1iZXIpOwoKICBBYnN0cmFjdFZhbHVlIHJlc3VsdE9mUGFyYW1ldGVyKExvY2FsIHBhcmFtZXRlcik7CgogIC8vLyBSZXR1cm5zIHRoZSB0eXBlIG9mIGEgW3NlbGVjdG9yXSB3aGVuIGFwcGxpZWQgdG8gYSByZWNlaXZlciB3aXRoIHRoZSBnaXZlbgogIC8vLyB0eXBlIFttYXNrXS4KICBBYnN0cmFjdFZhbHVlIHR5cGVPZlNlbGVjdG9yKFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIG1hc2spOwoKICAvLy8gUmV0dXJucyB3aGV0aGVyIGEgZml4ZWQtbGVuZ3RoIGNvbnN0cnVjdG9yIGNhbGwgZ29lcyB0aHJvdWdoIGEgZ3Jvd2FibGUKICAvLy8gY2hlY2suCiAgYm9vbCBpc0ZpeGVkQXJyYXlDaGVja2VkRm9yR3Jvd2FibGUoaXIuVHJlZU5vZGUgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSB0eXBlIG9mIGEgbGlzdCBuZXcgZXhwcmVzc2lvbiBbbm9kZV0uCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZOZXdMaXN0KGlyLlRyZWVOb2RlIG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgdHlwZSBvZiBhIGxpc3QgbGl0ZXJhbCBbbm9kZV0uCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZMaXN0TGl0ZXJhbChpci5UcmVlTm9kZSBub2RlKTsKfQoKLy8vIEdsb2JhbCBhbmFseXNpcyB0aGF0IGluZmVycyBjb25jcmV0ZSB0eXBlcy4KY2xhc3MgR2xvYmFsVHlwZUluZmVyZW5jZVRhc2sgZXh0ZW5kcyBDb21waWxlclRhc2sgewogIC8vIFRPRE8oc2lnbXVuZCk6IHJlbmFtZSBhdCB0aGUgc2FtZSB0aW1lIGFzIG91ciBiZW5jaG1hcmtpbmcgdG9vbHMuCiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAnVHlwZSBpbmZlcmVuY2UnOwoKICBmaW5hbCBDb21waWxlciBjb21waWxlcjsKCiAgLy8vIFRoZSBbVHlwZUdyYXBoSW5mZXJyZXJdIHVzZWQgYnkgdGhlIGdsb2JhbCB0eXBlIGluZmVyZW5jZS4gVGhpcyBzaG91bGQgYnkKICAvLy8gYWNjZXNzZWQgZnJvbSBvdXRzaWRlIHRoaXMgY2xhc3MgZm9yIHRlc3Rpbmcgb25seS4KICBUeXBlR3JhcGhJbmZlcnJlciB0eXBlc0luZmVycmVySW50ZXJuYWw7CgogIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHNGb3JUZXN0aW5nOwoKICBHbG9iYWxUeXBlSW5mZXJlbmNlVGFzayhDb21waWxlciBjb21waWxlcikKICAgICAgOiBjb21waWxlciA9IGNvbXBpbGVyLAogICAgICAgIHN1cGVyKGNvbXBpbGVyLm1lYXN1cmVyKTsKCiAgLy8vIFJ1bnMgdGhlIGdsb2JhbCB0eXBlLWluZmVyZW5jZSBhbGdvcml0aG0gb25jZS4KICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBydW5HbG9iYWxUeXBlSW5mZXJlbmNlKEZ1bmN0aW9uRW50aXR5IG1haW5FbGVtZW50LAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsIEluZmVycmVkRGF0YUJ1aWxkZXIgaW5mZXJyZWREYXRhQnVpbGRlcikgewogICAgcmV0dXJuIG1lYXN1cmUoKCkgewogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzOwogICAgICBpZiAoY29tcGlsZXIuZGlzYWJsZVR5cGVJbmZlcmVuY2UpIHsKICAgICAgICByZXN1bHRzID0gbmV3IFRyaXZpYWxHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyhjbG9zZWRXb3JsZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdHlwZXNJbmZlcnJlckludGVybmFsID8/PSBjb21waWxlci5iYWNrZW5kU3RyYXRlZ3kKICAgICAgICAgICAgLmNyZWF0ZVR5cGVzSW5mZXJyZXIoY2xvc2VkV29ybGQsIGluZmVycmVkRGF0YUJ1aWxkZXIpOwogICAgICAgIHJlc3VsdHMgPSB0eXBlc0luZmVycmVySW50ZXJuYWwuYW5hbHl6ZU1haW4obWFpbkVsZW1lbnQpOwogICAgICB9CiAgICAgIGNsb3NlZFdvcmxkLm5vU3VjaE1ldGhvZERhdGEuY2F0ZWdvcml6ZUNvbXBsZXhJbXBsZW1lbnRhdGlvbnMocmVzdWx0cyk7CiAgICAgIGlmIChyZXRhaW5EYXRhRm9yVGVzdGluZykgewogICAgICAgIHJlc3VsdHNGb3JUZXN0aW5nID0gcmVzdWx0czsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0pOwogIH0KfQoKY2xhc3MgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHNJbXBsIGltcGxlbWVudHMgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHNdIG9iamVjdHMKICAvLy8gaW4gYSBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnZ2xvYmFsLXR5cGUtaW5mZXJlbmNlLXJlc3VsdHMnOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQ7CiAgQG92ZXJyaWRlCiAgZmluYWwgSW5mZXJyZWREYXRhIGluZmVycmVkRGF0YTsKICBmaW5hbCBHbG9iYWxUeXBlSW5mZXJlbmNlTWVtYmVyUmVzdWx0IF9kZWFkRmllbGRSZXN1bHQ7CiAgZmluYWwgR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdCBfZGVhZE1ldGhvZFJlc3VsdDsKICBmaW5hbCBBYnN0cmFjdFZhbHVlIF90cml2aWFsUGFyYW1ldGVyUmVzdWx0OwoKICBmaW5hbCBNYXA8TWVtYmVyRW50aXR5LCBHbG9iYWxUeXBlSW5mZXJlbmNlTWVtYmVyUmVzdWx0PiBtZW1iZXJSZXN1bHRzOwogIGZpbmFsIE1hcDxMb2NhbCwgQWJzdHJhY3RWYWx1ZT4gcGFyYW1ldGVyUmVzdWx0czsKICBmaW5hbCBTZXQ8aXIuVHJlZU5vZGU+IGNoZWNrZWRGb3JHcm93YWJsZUxpc3RzOwogIGZpbmFsIFNldDxTZWxlY3Rvcj4gcmV0dXJuc0xpc3RFbGVtZW50VHlwZVNldDsKICBmaW5hbCBNYXA8aXIuVHJlZU5vZGUsIEFic3RyYWN0VmFsdWU+IF9hbGxvY2F0ZWRMaXN0czsKCiAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHNJbXBsKAogICAgICB0aGlzLmNsb3NlZFdvcmxkLAogICAgICB0aGlzLmluZmVycmVkRGF0YSwKICAgICAgdGhpcy5tZW1iZXJSZXN1bHRzLAogICAgICB0aGlzLnBhcmFtZXRlclJlc3VsdHMsCiAgICAgIHRoaXMuY2hlY2tlZEZvckdyb3dhYmxlTGlzdHMsCiAgICAgIHRoaXMucmV0dXJuc0xpc3RFbGVtZW50VHlwZVNldCwKICAgICAgdGhpcy5fYWxsb2NhdGVkTGlzdHMpCiAgICAgIDogX2RlYWRGaWVsZFJlc3VsdCA9IG5ldyBEZWFkRmllbGRHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0KAogICAgICAgICAgICBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKSwKICAgICAgICBfZGVhZE1ldGhvZFJlc3VsdCA9IG5ldyBEZWFkTWV0aG9kR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdCgKICAgICAgICAgICAgY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbiksCiAgICAgICAgX3RyaXZpYWxQYXJhbWV0ZXJSZXN1bHQgPSBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlOwoKICBmYWN0b3J5IEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzSW1wbC5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgIERhdGFTb3VyY2Ugc291cmNlLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsIEluZmVycmVkRGF0YSBpbmZlcnJlZERhdGEpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgTWFwPE1lbWJlckVudGl0eSwgR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdD4gbWVtYmVyUmVzdWx0cyA9CiAgICAgICAgc291cmNlLnJlYWRNZW1iZXJNYXAoKCkgPT4KICAgICAgICAgICAgbmV3IEdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHQucmVhZEZyb21EYXRhU291cmNlKAogICAgICAgICAgICAgICAgc291cmNlLCBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKSk7CiAgICBNYXA8TG9jYWwsIEFic3RyYWN0VmFsdWU+IHBhcmFtZXRlclJlc3VsdHMgPSBzb3VyY2UucmVhZExvY2FsTWFwKCgpID0+CiAgICAgICAgY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgICAgICAucmVhZEFic3RyYWN0VmFsdWVGcm9tRGF0YVNvdXJjZShzb3VyY2UpKTsKICAgIFNldDxpci5UcmVlTm9kZT4gY2hlY2tlZEZvckdyb3dhYmxlTGlzdHMgPSBzb3VyY2UucmVhZFRyZWVOb2RlcygpLnRvU2V0KCk7CiAgICBTZXQ8U2VsZWN0b3I+IHJldHVybnNMaXN0RWxlbWVudFR5cGVTZXQgPQogICAgICAgIHNvdXJjZS5yZWFkTGlzdCgoKSA9PiBuZXcgU2VsZWN0b3IucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSkpLnRvU2V0KCk7CiAgICBNYXA8aXIuVHJlZU5vZGUsIEFic3RyYWN0VmFsdWU+IGFsbG9jYXRlZExpc3RzID0gc291cmNlLnJlYWRUcmVlTm9kZU1hcCgKICAgICAgICAoKSA9PiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgICAgIC5yZWFkQWJzdHJhY3RWYWx1ZUZyb21EYXRhU291cmNlKHNvdXJjZSkpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0c0ltcGwoCiAgICAgICAgY2xvc2VkV29ybGQsCiAgICAgICAgaW5mZXJyZWREYXRhLAogICAgICAgIG1lbWJlclJlc3VsdHMsCiAgICAgICAgcGFyYW1ldGVyUmVzdWx0cywKICAgICAgICBjaGVja2VkRm9yR3Jvd2FibGVMaXN0cywKICAgICAgICByZXR1cm5zTGlzdEVsZW1lbnRUeXBlU2V0LAogICAgICAgIGFsbG9jYXRlZExpc3RzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVCb29sKGZhbHNlKTsgLy8gSXMgX25vdF8gdHJpdmlhbC4KICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVNZW1iZXJNYXAoCiAgICAgICAgbWVtYmVyUmVzdWx0cywKICAgICAgICAoR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdCByZXN1bHQpID0+CiAgICAgICAgICAgIHJlc3VsdC53cml0ZVRvRGF0YVNpbmsoc2luaywgY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikpOwogICAgc2luay53cml0ZUxvY2FsTWFwKAogICAgICAgIHBhcmFtZXRlclJlc3VsdHMsCiAgICAgICAgKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAgICAgLndyaXRlQWJzdHJhY3RWYWx1ZVRvRGF0YVNpbmsoc2luaywgdmFsdWUpKTsKICAgIHNpbmsud3JpdGVUcmVlTm9kZXMoY2hlY2tlZEZvckdyb3dhYmxlTGlzdHMpOwogICAgc2luay53cml0ZUxpc3QocmV0dXJuc0xpc3RFbGVtZW50VHlwZVNldCwKICAgICAgICAoU2VsZWN0b3Igc2VsZWN0b3IpID0+IHNlbGVjdG9yLndyaXRlVG9EYXRhU2luayhzaW5rKSk7CiAgICBzaW5rLndyaXRlVHJlZU5vZGVNYXAoCiAgICAgICAgX2FsbG9jYXRlZExpc3RzLAogICAgICAgIChBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgICAgIC53cml0ZUFic3RyYWN0VmFsdWVUb0RhdGFTaW5rKHNpbmssIHZhbHVlKSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdCByZXN1bHRPZk1lbWJlcihNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICBhc3NlcnQoCiAgICAgICAgbWVtYmVyIGlzISBDb25zdHJ1Y3RvckJvZHlFbnRpdHksCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIG1lbWJlciwKICAgICAgICAgICAgInVuZXhwZWN0ZWQgaW5wdXQ6IENvbnN0cnVjdG9yQm9keUVsZW1lbnRzIGFyZSBjcmVhdGVkIgogICAgICAgICAgICAiIGFmdGVyIGdsb2JhbCB0eXBlIGluZmVyZW5jZSwgbm8gZGF0YSBpcyBhdmFpYWJsZSBmb3IgdGhlbS4iKSk7CiAgICAvLyBUT0RPKHNpZ211bmQsam9obm5pd2ludGhlcik6IE1ha2UgaXQgYW4gZXJyb3IgdG8gcXVlcnkgZm9yIHJlc3VsdHMgdGhhdAogICAgLy8gZG9uJ3QgZXhpc3QuLgogICAgLyphc3NlcnQobWVtYmVyUmVzdWx0cy5jb250YWluc0tleShtZW1iZXIpIHx8IG1lbWJlciBpcyBKU2lnbmF0dXJlTWV0aG9kLAogICAgICAgICJObyBpbmZlcmVuY2UgcmVzdWx0IGZvciBtZW1iZXIgJG1lbWJlciIpOyovCiAgICByZXR1cm4gbWVtYmVyUmVzdWx0c1ttZW1iZXJdID8/CiAgICAgICAgKG1lbWJlciBpcyBGdW5jdGlvbkVudGl0eSA/IF9kZWFkTWV0aG9kUmVzdWx0IDogX2RlYWRGaWVsZFJlc3VsdCk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHJlc3VsdE9mUGFyYW1ldGVyKExvY2FsIHBhcmFtZXRlcikgewogICAgLy8gVE9ETyhzaWdtdW5kLGpvaG5uaXdpbnRoZXIpOiBNYWtlIGl0IGFuIGVycm9yIHRvIHF1ZXJ5IGZvciByZXN1bHRzIHRoYXQKICAgIC8vIGRvbid0IGV4aXN0LgogICAgLyphc3NlcnQocGFyYW1ldGVyUmVzdWx0cy5jb250YWluc0tleShwYXJhbWV0ZXIpLAogICAgICAgICJObyBpbmZlcmVuY2UgcmVzdWx0IGZvciBwYXJhbWV0ZXIgJHBhcmFtZXRlciIpOyovCiAgICByZXR1cm4gcGFyYW1ldGVyUmVzdWx0c1twYXJhbWV0ZXJdID8/IF90cml2aWFsUGFyYW1ldGVyUmVzdWx0OwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgYSBbc2VsZWN0b3JdIHdoZW4gYXBwbGllZCB0byBhIHJlY2VpdmVyIHdpdGggdGhlIGdpdmVuCiAgLy8vIFtyZWNlaXZlcl0gdHlwZS4KICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZlNlbGVjdG9yKFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyKSB7CiAgICAvLyBCYWlsb3V0IGZvciBjbG9zdXJlIGNhbGxzLiBXZSdyZSBub3QgdHJhY2tpbmcgdHlwZXMgb2YKICAgIC8vIGNsb3N1cmVzLgogICAgaWYgKHNlbGVjdG9yLmlzQ2xvc3VyZUNhbGwpCiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlOwogICAgaWYgKHNlbGVjdG9yLmlzU2V0dGVyIHx8IHNlbGVjdG9yLmlzSW5kZXhTZXQpIHsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGU7CiAgICB9CiAgICBpZiAocmV0dXJuc0xpc3RFbGVtZW50VHlwZShzZWxlY3RvciwgcmVjZWl2ZXIpKSB7CiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmdldENvbnRhaW5lckVsZW1lbnRUeXBlKHJlY2VpdmVyKTsKICAgIH0KICAgIGlmIChyZXR1cm5zTWFwVmFsdWVUeXBlKHNlbGVjdG9yLCByZWNlaXZlcikpIHsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uZ2V0TWFwVmFsdWVUeXBlKHJlY2VpdmVyKTsKICAgIH0KCiAgICBpZiAoY2xvc2VkV29ybGQuaW5jbHVkZXNDbG9zdXJlQ2FsbChzZWxlY3RvciwgcmVjZWl2ZXIpKSB7CiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlOwogICAgfSBlbHNlIHsKICAgICAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBlbGVtZW50cyA9CiAgICAgICAgICBjbG9zZWRXb3JsZC5sb2NhdGVNZW1iZXJzKHNlbGVjdG9yLCByZWNlaXZlcik7CiAgICAgIExpc3Q8QWJzdHJhY3RWYWx1ZT4gdHlwZXMgPSA8QWJzdHJhY3RWYWx1ZT5bXTsKICAgICAgZm9yIChNZW1iZXJFbnRpdHkgZWxlbWVudCBpbiBlbGVtZW50cykgewogICAgICAgIEFic3RyYWN0VmFsdWUgdHlwZSA9IHR5cGVPZk1lbWJlcldpdGhTZWxlY3RvcihlbGVtZW50LCBzZWxlY3Rvcik7CiAgICAgICAgdHlwZXMuYWRkKHR5cGUpOwogICAgICB9CiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLnVuaW9uT2ZNYW55KHR5cGVzKTsKICAgIH0KICB9CgogIGJvb2wgcmV0dXJuc0xpc3RFbGVtZW50VHlwZShTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSBtYXNrKSB7CiAgICByZXR1cm4gbWFzayAhPSBudWxsICYmCiAgICAgICAgY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5pc0NvbnRhaW5lcihtYXNrKSAmJgogICAgICAgIHJldHVybnNMaXN0RWxlbWVudFR5cGVTZXQuY29udGFpbnMoc2VsZWN0b3IpOwogIH0KCiAgYm9vbCByZXR1cm5zTWFwVmFsdWVUeXBlKFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIG1hc2spIHsKICAgIHJldHVybiBtYXNrICE9IG51bGwgJiYKICAgICAgICBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmlzTWFwKG1hc2spICYmCiAgICAgICAgc2VsZWN0b3IuaXNJbmRleDsKICB9CgogIEFic3RyYWN0VmFsdWUgdHlwZU9mTWVtYmVyV2l0aFNlbGVjdG9yKAogICAgICBNZW1iZXJFbnRpdHkgZWxlbWVudCwgU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgIGlmIChlbGVtZW50Lm5hbWUgPT0gSWRlbnRpZmllcnMubm9TdWNoTWV0aG9kXyAmJgogICAgICAgIHNlbGVjdG9yLm5hbWUgIT0gZWxlbWVudC5uYW1lKSB7CiAgICAgIC8vIEFuIGludm9jYXRpb24gY2FuIHJlc29sdmUgdG8gYSBbbm9TdWNoTWV0aG9kXSwgaW4gd2hpY2ggY2FzZQogICAgICAvLyB3ZSBnZXQgdGhlIHJldHVybiB0eXBlIG9mIFtub1N1Y2hNZXRob2RdLgogICAgICByZXR1cm4gcmVzdWx0T2ZNZW1iZXIoZWxlbWVudCkucmV0dXJuVHlwZTsKICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaXNHZXR0ZXIpIHsKICAgICAgaWYgKGVsZW1lbnQuaXNGdW5jdGlvbikgewogICAgICAgIC8vIFtmdW5jdGlvblR5cGVdIGlzIG51bGwgaWYgdGhlIGluZmVycmVyIGRpZCBub3QgcnVuLgogICAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmZ1bmN0aW9uVHlwZTsKICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmlzRmllbGQpIHsKICAgICAgICByZXR1cm4gcmVzdWx0T2ZNZW1iZXIoZWxlbWVudCkudHlwZTsKICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmlzR2V0dGVyKSB7CiAgICAgICAgcmV0dXJuIHJlc3VsdE9mTWVtYmVyKGVsZW1lbnQpLnJldHVyblR5cGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXNzZXJ0KGZhbHNlLCBmYWlsZWRBdChlbGVtZW50LCAiVW5leHBlY3RlZCBtZW1iZXIgJGVsZW1lbnQiKSk7CiAgICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGU7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZWxlbWVudC5pc0dldHRlciB8fCBlbGVtZW50LmlzRmllbGQpIHsKICAgICAgYXNzZXJ0KHNlbGVjdG9yLmlzQ2FsbCB8fCBzZWxlY3Rvci5pc1NldHRlcik7CiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHJlc3VsdE9mTWVtYmVyKGVsZW1lbnQpLnJldHVyblR5cGU7CiAgICB9CiAgfQoKICAvLy8gUmV0dXJucyB3aGV0aGVyIGEgZml4ZWQtbGVuZ3RoIGNvbnN0cnVjdG9yIGNhbGwgZ29lcyB0aHJvdWdoIGEgZ3Jvd2FibGUKICAvLy8gY2hlY2suCiAgLy8gVE9ETyhzaWdtdW5kKTogbW92ZSBpbnRvIHRoZSByZXN1bHQgb2YgdGhlIGVsZW1lbnQgY29udGFpbmluZyBzdWNoCiAgLy8gY29uc3RydWN0b3IgY2FsbC4KICBAb3ZlcnJpZGUKICBib29sIGlzRml4ZWRBcnJheUNoZWNrZWRGb3JHcm93YWJsZShpci5Ob2RlIGN0b3JDYWxsKSA9PgogICAgICBjaGVja2VkRm9yR3Jvd2FibGVMaXN0cy5jb250YWlucyhjdG9yQ2FsbCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdHlwZU9mTmV3TGlzdChpci5Ob2RlIG5vZGUpID0+IF9hbGxvY2F0ZWRMaXN0c1tub2RlXTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZMaXN0TGl0ZXJhbChpci5Ob2RlIG5vZGUpID0+IF9hbGxvY2F0ZWRMaXN0c1tub2RlXTsKfQoKY2xhc3MgR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdEltcGwKICAgIGltcGxlbWVudHMgR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdCB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtHbG9iYWxUeXBlSW5mZXJlbmNlTWVtYmVyUmVzdWx0XQogIC8vLyBvYmplY3RzIGluIGEgZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2dsb2JhbC10eXBlLWluZmVyZW5jZS1tZW1iZXItcmVzdWx0JzsKCiAgZmluYWwgR2xvYmFsVHlwZUluZmVyZW5jZUVsZW1lbnREYXRhIF9kYXRhOwogIEBvdmVycmlkZQogIGZpbmFsIEFic3RyYWN0VmFsdWUgcmV0dXJuVHlwZTsKICBAb3ZlcnJpZGUKICBmaW5hbCBBYnN0cmFjdFZhbHVlIHR5cGU7CiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCB0aHJvd3NBbHdheXM7CiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc0NhbGxlZE9uY2U7CgogIEdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHRJbXBsKHRoaXMuX2RhdGEsIHRoaXMucmV0dXJuVHlwZSwgdGhpcy50eXBlLAogICAgICB7dGhpcy50aHJvd3NBbHdheXMsIHRoaXMuaXNDYWxsZWRPbmNlfSk7CgogIGZhY3RvcnkgR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdEltcGwucmVhZEZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VFbGVtZW50RGF0YSBkYXRhID0gc291cmNlLnJlYWRWYWx1ZU9yTnVsbCgoKSB7CiAgICAgIHJldHVybiBuZXcgR2xvYmFsVHlwZUluZmVyZW5jZUVsZW1lbnREYXRhLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgICAgIHNvdXJjZSwgYWJzdHJhY3RWYWx1ZURvbWFpbik7CiAgICB9KTsKICAgIEFic3RyYWN0VmFsdWUgcmV0dXJuVHlwZSA9CiAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5yZWFkQWJzdHJhY3RWYWx1ZUZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBBYnN0cmFjdFZhbHVlIHR5cGUgPQogICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4ucmVhZEFic3RyYWN0VmFsdWVGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgYm9vbCB0aHJvd3NBbHdheXMgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGJvb2wgaXNDYWxsZWRPbmNlID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHRJbXBsKGRhdGEsIHJldHVyblR5cGUsIHR5cGUsCiAgICAgICAgdGhyb3dzQWx3YXlzOiB0aHJvd3NBbHdheXMsIGlzQ2FsbGVkT25jZTogaXNDYWxsZWRPbmNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmssIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbikgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZVZhbHVlT3JOdWxsKF9kYXRhLCAoR2xvYmFsVHlwZUluZmVyZW5jZUVsZW1lbnREYXRhIGRhdGEpIHsKICAgICAgZGF0YS53cml0ZVRvRGF0YVNpbmsoc2luaywgYWJzdHJhY3RWYWx1ZURvbWFpbik7CiAgICB9KTsKICAgIGFic3RyYWN0VmFsdWVEb21haW4ud3JpdGVBYnN0cmFjdFZhbHVlVG9EYXRhU2luayhzaW5rLCByZXR1cm5UeXBlKTsKICAgIGFic3RyYWN0VmFsdWVEb21haW4ud3JpdGVBYnN0cmFjdFZhbHVlVG9EYXRhU2luayhzaW5rLCB0eXBlKTsKICAgIHNpbmsud3JpdGVCb29sKHRocm93c0Fsd2F5cyk7CiAgICBzaW5rLndyaXRlQm9vbChpc0NhbGxlZE9uY2UpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdHlwZU9mU2VuZChpci5Ob2RlIG5vZGUpID0+IF9kYXRhPy50eXBlT2ZTZW5kKG5vZGUpOwogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdHlwZU9mR2V0dGVyKGlyLk5vZGUgbm9kZSkgPT4gX2RhdGE/LnR5cGVPZkdldHRlcihub2RlKTsKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkl0ZXJhdG9yKGlyLk5vZGUgbm9kZSkgPT4gX2RhdGE/LnR5cGVPZkl0ZXJhdG9yKG5vZGUpOwogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdHlwZU9mSXRlcmF0b3JNb3ZlTmV4dChpci5Ob2RlIG5vZGUpID0+CiAgICAgIF9kYXRhPy50eXBlT2ZJdGVyYXRvck1vdmVOZXh0KG5vZGUpOwogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdHlwZU9mSXRlcmF0b3JDdXJyZW50KGlyLk5vZGUgbm9kZSkgPT4KICAgICAgX2RhdGE/LnR5cGVPZkl0ZXJhdG9yQ3VycmVudChub2RlKTsKfQoKY2xhc3MgVHJpdmlhbEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIGltcGxlbWVudHMgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgewogIEBvdmVycmlkZQogIGZpbmFsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZDsKICBmaW5hbCBUcml2aWFsR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdCBfdHJpdmlhbE1lbWJlclJlc3VsdDsKICBmaW5hbCBBYnN0cmFjdFZhbHVlIF90cml2aWFsUGFyYW1ldGVyUmVzdWx0OwogIEBvdmVycmlkZQogIGZpbmFsIEluZmVycmVkRGF0YSBpbmZlcnJlZERhdGEgPSBuZXcgVHJpdmlhbEluZmVycmVkRGF0YSgpOwoKICBUcml2aWFsR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHModGhpcy5jbG9zZWRXb3JsZCkKICAgICAgOiBfdHJpdmlhbE1lbWJlclJlc3VsdCA9IG5ldyBUcml2aWFsR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdCgKICAgICAgICAgICAgY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSksCiAgICAgICAgX3RyaXZpYWxQYXJhbWV0ZXJSZXN1bHQgPSBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlOwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlQm9vbCh0cnVlKTsgLy8gSXMgdHJpdmlhbC4KICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNGaXhlZEFycmF5Q2hlY2tlZEZvckdyb3dhYmxlKGlyLk5vZGUgbm9kZSkgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdHlwZU9mU2VsZWN0b3IoU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgbWFzaykgewogICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHJlc3VsdE9mUGFyYW1ldGVyKExvY2FsIHBhcmFtZXRlcikgewogICAgcmV0dXJuIF90cml2aWFsUGFyYW1ldGVyUmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdCByZXN1bHRPZk1lbWJlcihNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICByZXR1cm4gX3RyaXZpYWxNZW1iZXJSZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkxpc3RMaXRlcmFsKGlyLlRyZWVOb2RlIG5vZGUpID0+IG51bGw7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdHlwZU9mTmV3TGlzdChpci5UcmVlTm9kZSBub2RlKSA9PiBudWxsOwp9CgpjbGFzcyBUcml2aWFsR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdAogICAgaW1wbGVtZW50cyBHbG9iYWxUeXBlSW5mZXJlbmNlTWVtYmVyUmVzdWx0IHsKICBmaW5hbCBBYnN0cmFjdFZhbHVlIGR5bmFtaWNUeXBlOwoKICBUcml2aWFsR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdCh0aGlzLmR5bmFtaWNUeXBlKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBnZXQgdHlwZSA9PiBkeW5hbWljVHlwZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBnZXQgcmV0dXJuVHlwZSA9PiBkeW5hbWljVHlwZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgdGhyb3dzQWx3YXlzID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkl0ZXJhdG9yQ3VycmVudChpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdHlwZU9mSXRlcmF0b3JNb3ZlTmV4dChpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdHlwZU9mSXRlcmF0b3IoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkdldHRlcihpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdHlwZU9mU2VuZChpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQ2FsbGVkT25jZSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaywgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiVHJpdmlhbEdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHQud3JpdGVUb0RhdGFTaW5rIik7CiAgfQp9CgpjbGFzcyBEZWFkRmllbGRHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0CiAgICBpbXBsZW1lbnRzIEdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHQgewogIGZpbmFsIEFic3RyYWN0VmFsdWUgZHluYW1pY1R5cGU7CiAgZmluYWwgQWJzdHJhY3RWYWx1ZSBlbXB0eVR5cGU7CgogIERlYWRGaWVsZEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHQoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pCiAgICAgIDogdGhpcy5keW5hbWljVHlwZSA9IGRvbWFpbi5keW5hbWljVHlwZSwKICAgICAgICB0aGlzLmVtcHR5VHlwZSA9IGRvbWFpbi5lbXB0eVR5cGU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IHR5cGUgPT4gZW1wdHlUeXBlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldCByZXR1cm5UeXBlID0+IGR5bmFtaWNUeXBlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCB0aHJvd3NBbHdheXMgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdHlwZU9mSXRlcmF0b3JDdXJyZW50KGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZJdGVyYXRvck1vdmVOZXh0KGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZJdGVyYXRvcihpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdHlwZU9mR2V0dGVyKGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZTZW5kKGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNDYWxsZWRPbmNlID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rLCBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4pIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJEZWFkRmllbGRHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0LndyaXRlVG9EYXRhU2luayIpOwogIH0KfQoKY2xhc3MgRGVhZE1ldGhvZEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHQKICAgIGltcGxlbWVudHMgR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdCB7CiAgZmluYWwgQWJzdHJhY3RWYWx1ZSBlbXB0eVR5cGU7CiAgZmluYWwgQWJzdHJhY3RWYWx1ZSBmdW5jdGlvblR5cGU7CgogIERlYWRNZXRob2RHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0KEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKQogICAgICA6IHRoaXMuZnVuY3Rpb25UeXBlID0gZG9tYWluLmZ1bmN0aW9uVHlwZSwKICAgICAgICB0aGlzLmVtcHR5VHlwZSA9IGRvbWFpbi5lbXB0eVR5cGU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IHR5cGUgPT4gZnVuY3Rpb25UeXBlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldCByZXR1cm5UeXBlID0+IGVtcHR5VHlwZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgdGhyb3dzQWx3YXlzID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkl0ZXJhdG9yQ3VycmVudChpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdHlwZU9mSXRlcmF0b3JNb3ZlTmV4dChpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdHlwZU9mSXRlcmF0b3IoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkdldHRlcihpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdHlwZU9mU2VuZChpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQ2FsbGVkT25jZSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaywgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiRGVhZEZpZWxkR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdC53cml0ZVRvRGF0YVNpbmsiKTsKICB9Cn0KgmQATk48AQ8BKD0fMSkkK0YuMiolKwFINQRMUU1KS0w5MU0+SD4BQ1ABTRoBUCYZAUwZAU8gASknLgFQMjABNDIBSjoBSzkCAVEWMEw9SD8BQlABT00jLQFFLjABMgE6ATkCATsfQgIBPQRMT1FCLEg5UCgVQQZCLAQBPicBIAEhAUcBNAFRE0cBTg05ATgxATE1AgEwNUcMKAEbAVA5KwEwAS0dIgE1UEsYKitGDztEQghOIiUIFggEAgFNTyI9AQwiDCM6Oy8BSjQyMTkBIhgZGh0kJhxDLkUuTwE9UBdHI0Q7Syg3Ty5QTS43FS8VFhcaISMZBAEMKDAVGRc0TBgaQTkyLkAbGUE5EwQBDEgMKhIURE1PFU41JEsEAQw1TxQ2O0MEAVEXDEw+ESA6NDoGNlAGM0gGAT86DSg5NS9KGQhBBgQBRxs9NgQBRBs3GgQBKjE1KUYzMSQgPz0kLSUzD0g8CDY0Og0xBgQBTg1IFww7MgEMRgEMSgIBKjFMKkMBLgwiDBwMGwwbAU4vAUJEF0ZEKAgfRRlFKysVS0EEAQxRFUk3CEhCIiITBAEMRQxJDE0MOCsMNyoCAVAMIkUvDD8BNks6TwEMKCkEAQw+AQxIOAQBDDUkBAEMSCEEAQw9AQw5AgEtMSMBPAEMKQEMLwEMIgEMPQEMPgEMNgEMNAEMMgEMIgEMUSBDBAIBKTEjIQFBLysBDCcBDC8BDCIBDD0BDD4BDDYBDDQBDDIBDCIBDFEgPwQCASoxISQBQjErAQwqAQwtAQwiAQw9AQw+AQw2AQw0AQwyAQwiAQxRID8EAgEocGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvdHlwZXMuZGFydDhzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pby9zb3VyY2VfaW5mb3JtYXRpb24uZGFydLSgLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5zb3VyY2VfaW5mb3JtYXRpb247CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vanMvanMuZGFydCcgc2hvdyBKYXZhU2NyaXB0Tm9kZVNvdXJjZUluZm9ybWF0aW9uOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NhbGxfc3RydWN0dXJlLmRhcnQnOwppbXBvcnQgJ3NvdXJjZV9maWxlLmRhcnQnOwoKLy8vIEludGVyZmFjZSBmb3IgcGFzc2luZyBzb3VyY2UgaW5mb3JtYXRpb24sIGZvciBpbnN0YW5jZSBmb3IgdXNlIGluIHNvdXJjZQovLy8gbWFwcywgdGhyb3VnaCB0aGUgYmFja2VuZC4KYWJzdHJhY3QgY2xhc3MgU291cmNlSW5mb3JtYXRpb24gZXh0ZW5kcyBKYXZhU2NyaXB0Tm9kZVNvdXJjZUluZm9ybWF0aW9uIHsKICBjb25zdCBTb3VyY2VJbmZvcm1hdGlvbigpOwoKICBTb3VyY2VTcGFuIGdldCBzb3VyY2VTcGFuOwoKICAvLy8gVGhlIHNvdXJjZSBsb2NhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBKUyBub2RlLgogIFNvdXJjZUxvY2F0aW9uIGdldCBzdGFydFBvc2l0aW9uID0+IG51bGw7CgogIC8vLyBUaGUgc291cmNlIGxvY2F0aW9uIGFzc29jaWF0ZWQgd2l0aCBhbiBpbm5lciBvZiB0aGUgSlMgbm9kZS4KICAvLy8KICAvLy8gVGhlIGlubmVyIHBvc2l0aW9uIGlzIGZvciBpbnN0YW5jZSBgZm9vKClgIGluIGBvLmZvbygpYC4KICBTb3VyY2VMb2NhdGlvbiBnZXQgaW5uZXJQb3NpdGlvbiA9PiBudWxsOwoKICAvLy8gVGhlIHNvdXJjZSBsb2NhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGVuZCBvZiB0aGUgSlMgbm9kZS4KICBTb3VyY2VMb2NhdGlvbiBnZXQgZW5kUG9zaXRpb24gPT4gbnVsbDsKCiAgLy8vIEEgbGlzdCBjb250YWluaW5nIHN0YXJ0LCBpbm5lciwgYW5kIGVuZCBwb3NpdGlvbnMuCiAgTGlzdDxTb3VyY2VMb2NhdGlvbj4gZ2V0IHNvdXJjZUxvY2F0aW9uczsKCiAgLy8vIEEgbGlzdCBvZiBpbmxpbmluZyBjb250ZXh0IGxvY2F0aW9ucy4KICBMaXN0PEZyYW1lQ29udGV4dD4gZ2V0IGlubGluaW5nQ29udGV4dCA9PiBudWxsOwoKICAvLy8gUmV0dXJuIGEgc2hvcnQgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc291cmNlIGxvY2F0aW9uLgogIFN0cmluZyBnZXQgc2hvcnRUZXh0Owp9CgovLy8gQ29udGV4dCBpbmZvcm1hdGlvbiBhYm91dCBpbmxpbmVkIGNhbGxzLgovLy8KLy8vIFRoaXMgaXMgYXNzb2NpYXRlZCB3aXRoIFNvdXJjZUluZm9ybWF0aW9uIG9iamVjdHMgdG8gYmUgYWJsZSB0byBlbWl0Ci8vLyBwcmVjaXNlIGRhdGEgYWJvdXQgaW5saW5pbmcgdGhhdCBjYW4gdGhlbiBiZSB1c2VkIGJ5IGRlZm9idXNjYXRpb24gdG9vbHMKLy8vIHdoZW4gcmVjb25zdHJ1Y3RpbmcgYSBzb3VyY2Ugc3RhY2sgZnJvbSBhIHByb2R1Y3Rpb24gc3RhY2sgdHJhY2UuCmNsYXNzIEZyYW1lQ29udGV4dCB7CiAgLy8vIExvY2F0aW9uIG9mIHRoZSBjYWxsIHRoYXQgd2FzIGlubGluZWQuCiAgZmluYWwgU291cmNlSW5mb3JtYXRpb24gY2FsbEluZm9ybWF0aW9uOwoKICAvLy8gTmFtZSBvZiB0aGUgbWV0aG9kIHRoYXQgd2FzIGlubGluZWQuCiAgZmluYWwgU3RyaW5nIGlubGluZWRNZXRob2ROYW1lOwoKICBGcmFtZUNvbnRleHQodGhpcy5jYWxsSW5mb3JtYXRpb24sIHRoaXMuaW5saW5lZE1ldGhvZE5hbWUpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiKEZyYW1lQ29udGV4dDogJGNhbGxJbmZvcm1hdGlvbiwgJGlubGluZWRNZXRob2ROYW1lKSI7Cn0KCi8vLyBTdHJhdGVneSBmb3IgY3JlYXRpbmcsIHByb2Nlc3NpbmcgYW5kIGFwcGx5aW5nIFtTb3VyY2VJbmZvcm1hdGlvbl0uCmNsYXNzIFNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kgewogIGNvbnN0IFNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3koKTsKCiAgLy8vIENyZWF0ZSBhIFtTb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXJdIGZvciBbbWVtYmVyXS4KICBTb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIgY3JlYXRlQnVpbGRlckZvckNvbnRleHQoCiAgICAgIGNvdmFyaWFudCBNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICByZXR1cm4gbmV3IFNvdXJjZUluZm9ybWF0aW9uQnVpbGRlcigpOwogIH0KCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gbWFya2VyIGZvciBub24tcHJlYW1ibGUgY29kZS4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZFNvdXJjZU1hcHBlZE1hcmtlcigpID0+IG51bGw7CgogIC8vLyBDYWxsZWQgd2hlbiBjb21waWxhdGlvbiBoYXMgY29tcGxldGVkLgogIHZvaWQgb25Db21wbGV0ZSgpIHt9Cn0KCi8vLyBJbnRlcmZhY2UgZm9yIGdlbmVyYXRpbmcgW1NvdXJjZUluZm9ybWF0aW9uXS4KY2xhc3MgU291cmNlSW5mb3JtYXRpb25CdWlsZGVyIHsKICBjb25zdCBTb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIoKTsKCiAgLy8vIENyZWF0ZSBhIFtTb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXJdIGZvciBbbWVtYmVyXSB3aXRoIGFkZGl0aW9uYWwgaW5saW5pbmcKICAvLy8gW2NvbnRleHRdLgogIFNvdXJjZUluZm9ybWF0aW9uQnVpbGRlciBmb3JDb250ZXh0KAogICAgICAgICAgY292YXJpYW50IE1lbWJlckVudGl0eSBtZW1iZXIsIFNvdXJjZUluZm9ybWF0aW9uIGNvbnRleHQpID0+CiAgICAgIHRoaXM7CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIFttZW1iZXJdLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkRGVjbGFyYXRpb24oY292YXJpYW50IE1lbWJlckVudGl0eSBtZW1iZXIpID0+IG51bGw7CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIGZvciB0aGUgc3R1YiBvZiBbY2FsbFN0cnVjdHVyZV0gZm9yIFttZW1iZXJdLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkU3R1YigKICAgICAgICAgIGNvdmFyaWFudCBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlKSA9PgogICAgICBudWxsOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgdGhlIGdlbmVyaWMgW25vZGVdLgogIEBkZXByZWNhdGVkCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRHZW5lcmljKGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIGFuIGluc3RhbnRpYXRpb24gb2YgYSBjbGFzcyB1c2luZyBbbm9kZV0KICAvLy8gZm9yIHRoZSBzb3VyY2UgcG9zaXRpb24uCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRDcmVhdGUoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgdGhlIHJldHVybiBbbm9kZV0uCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRSZXR1cm4oaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgYW4gaW1wbGljaXQgcmV0dXJuIGluIFtlbGVtZW50XS4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEltcGxpY2l0UmV0dXJuKGNvdmFyaWFudCBNZW1iZXJFbnRpdHkgZWxlbWVudCkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIHRoZSBsb29wIFtub2RlXS4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZExvb3AoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgYSByZWFkIGFjY2VzcyBsaWtlIGBhLmJgLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkR2V0KGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIGEgd3JpdGUgYWNjZXNzIGxpa2UgYGEuYiA9IDNgLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkU2V0KGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIGEgY2FsbCBpbiBbbm9kZV0uCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRDYWxsKGlyLk5vZGUgcmVjZWl2ZXIsIGlyLk5vZGUgY2FsbCkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIHRoZSBpZiBzdGF0ZW1lbnQgaW4gW25vZGVdLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkSWYoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgdGhlIGNvbnN0cnVjdG9yIGludm9jYXRpb24gaW4gW25vZGVdLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkTmV3KGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIHRoZSB0aHJvdyBpbiBbbm9kZV0uCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRUaHJvdyhpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIGZvciB0aGUgYXNzZXJ0IGluIFtub2RlXS4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEFzc2VydChpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIGZvciB0aGUgYXNzaWdubWVudCBpbiBbbm9kZV0uCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRBc3NpZ25tZW50KGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBpbnNlcnRlZCBhcwogIC8vLyBmaXJzdCBzdGF0ZW1lbnQgb2YgYSBmdW5jdGlvbi4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZFZhcmlhYmxlRGVjbGFyYXRpb24oKSA9PiBudWxsOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgdGhlIGF3YWl0IFtub2RlXS4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEF3YWl0KGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIHRoZSB5aWVsZCBvciB5aWVsZCogW25vZGVdLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkWWllbGQoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgYXN5bmMvYXdhaXQgYm9pbGVyIHBsYXRlIGNvZGUuCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRBc3luY0JvZHkoKSA9PiBudWxsOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgZXhpdGluZyBhc3luYy9hd2FpdCBjb2RlLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkQXN5bmNFeGl0KCkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIGFuIGludm9jYXRpb24gb2YgYSBmb3JlaWduIG1ldGhvZC4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEZvcmVpZ25Db2RlKGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIGEgc3RyaW5nIGludGVycG9sYXRpb24gb2YgW25vZGVdLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkU3RyaW5nSW50ZXJwb2xhdGlvbihpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIGZvciB0aGUgZm9yLWluIGBpdGVyYXRvcmAgYWNjZXNzIGluIFtub2RlXS4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEZvckluSXRlcmF0b3IoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgdGhlIGZvci1pbiBgbW92ZU5leHRgIGNhbGwgaW4gW25vZGVdLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkRm9ySW5Nb3ZlTmV4dChpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIGZvciB0aGUgZm9yLWluIGBjdXJyZW50YCBhY2Nlc3MgaW4gW25vZGVdLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkRm9ySW5DdXJyZW50KGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIHRoZSBmb3ItaW4gdmFyaWFibGUgYXNzaWdubWVudCBpbiBbbm9kZV0uCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRGb3JJblNldChpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIGZvciB0aGUgb3BlcmF0b3IgYFtdYCBhY2Nlc3MgaW4gW25vZGVdLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkSW5kZXgoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgdGhlIG9wZXJhdG9yIGBbXT1gIGFzc2lnbm1lbnQgaW4gW25vZGVdLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkSW5kZXhTZXQoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgdGhlIGJpbmFyeSBvcGVyYXRpb24gaW4gW25vZGVdLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkQmluYXJ5KGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIHRoZSB1bmFyeSBvcGVyYXRpb24gaW4gW25vZGVdLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkVW5hcnkoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgdGhlIHRyeSBzdGF0ZW1lbnQgaW4gW25vZGVdLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkVHJ5KGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIHRoZSB1bmFyeSBvcGVyYXRvciBpbiBbbm9kZV0uCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRDYXRjaChpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIGZvciB0aGUgaXMtdGVzdCBpbiBbbm9kZV0uCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRJcyhpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIGZvciB0aGUgYXMtY2FzdCBpbiBbbm9kZV0uCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRBcyhpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIGZvciB0aGUgc3dpdGNoIHN0YXRlbWVudCBbbm9kZV0uCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRTd2l0Y2goaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgdGhlIHN3aXRjaCBjYXNlIGluIFtub2RlXS4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZFN3aXRjaENhc2UoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgdGhlIGxpc3QgbGl0ZXJhbCBpbiBbbm9kZV0uCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRMaXN0TGl0ZXJhbChpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIGZvciB0aGUgYnJlYWsvY29udGludWUgaW4gW25vZGVdLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkR290byhpci5Ob2RlIG5vZGUpID0+IG51bGw7Cn0KCi8vLyBBIGxvY2F0aW9uIGluIGEgc291cmNlIGZpbGUuCmFic3RyYWN0IGNsYXNzIFNvdXJjZUxvY2F0aW9uIHsKICBjb25zdCBTb3VyY2VMb2NhdGlvbigpOwoKICAvLy8gVGhlIGFic29sdXRlIFVSSSBvZiB0aGUgc291cmNlIGZpbGUgb2YgdGhpcyBzb3VyY2UgbG9jYXRpb24uCiAgVXJpIGdldCBzb3VyY2VVcmk7CgogIC8vLyBUaGUgY2hhcmFjdGVyIG9mZnNldCBvZiB0aGUgdGhpcyBzb3VyY2UgbG9jYXRpb24gaW50byB0aGUgc291cmNlIGZpbGUuCiAgaW50IGdldCBvZmZzZXQ7CgogIC8vLyBUaGUgMS1iYXNlZCBsaW5lIG51bWJlciBvZiB0aGUgW29mZnNldF0uCiAgaW50IGdldCBsaW5lOwoKICAvLy8gVGhlIDEtYmFzZWQgY29sdW1uIG51bWJlciBvZiB0aGUgW29mZnNldF0gd2l0aCBpdHMgbGluZS4KICBpbnQgZ2V0IGNvbHVtbjsKCiAgLy8vIFRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvdXJjZSBsb2NhdGlvbiwgaWYgYW55LgogIFN0cmluZyBnZXQgc291cmNlTmFtZTsKCiAgLy8vIGB0cnVlYCBpZiB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgZmlsZS4KICBib29sIGdldCBpc1ZhbGlkOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIHJldHVybiBzb3VyY2VVcmkuaGFzaENvZGUgKiAxNyArCiAgICAgICAgb2Zmc2V0Lmhhc2hDb2RlICogMTkgKwogICAgICAgIHNvdXJjZU5hbWUuaGFzaENvZGUgKiAyMzsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgU291cmNlTG9jYXRpb24pIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBzb3VyY2VVcmkgPT0gb3RoZXIuc291cmNlVXJpICYmCiAgICAgICAgb2Zmc2V0ID09IG90aGVyLm9mZnNldCAmJgogICAgICAgIHNvdXJjZU5hbWUgPT0gb3RoZXIuc291cmNlTmFtZTsKICB9CgogIFN0cmluZyBnZXQgc2hvcnRUZXh0ID0+ICcke3NvdXJjZVVyaT8ucGF0aFNlZ21lbnRzPy5sYXN0fTpbJGxpbmUsJGNvbHVtbl0nOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJHtzb3VyY2VVcml9Olske2xpbmV9LCR7Y29sdW1ufV0nOwp9CgovLy8gQSBsb2NhdGlvbiBpbiBhIHNvdXJjZSBmaWxlLgphYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNvdXJjZUxvY2F0aW9uIGV4dGVuZHMgU291cmNlTG9jYXRpb24gewogIGZpbmFsIFNvdXJjZUZpbGUgX3NvdXJjZUZpbGU7CiAgaXIuTG9jYXRpb24gX2xvY2F0aW9uOwoKICBBYnN0cmFjdFNvdXJjZUxvY2F0aW9uKHRoaXMuX3NvdXJjZUZpbGUpIHsKICAgIGFzc2VydCgKICAgICAgICBpc1ZhbGlkLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBuZXcgU291cmNlU3Bhbihzb3VyY2VVcmksIDAsIDApLAogICAgICAgICAgICAiSW52YWxpZCBzb3VyY2UgbG9jYXRpb24gaW4gJHtzb3VyY2VVcml9OiAiCiAgICAgICAgICAgICJvZmZzZXQ9JG9mZnNldCwgbGVuZ3RoPSR7X3NvdXJjZUZpbGUubGVuZ3RofS4iKSk7CiAgfQoKICBBYnN0cmFjdFNvdXJjZUxvY2F0aW9uLmZyb21Mb2NhdGlvbih0aGlzLl9sb2NhdGlvbikgOiBfc291cmNlRmlsZSA9IG51bGw7CgogIEFic3RyYWN0U291cmNlTG9jYXRpb24uZnJvbU90aGVyKEFic3RyYWN0U291cmNlTG9jYXRpb24gbG9jYXRpb24pCiAgICAgIDogdGhpcy5mcm9tTG9jYXRpb24obG9jYXRpb24uX2xvY2F0aW9uKTsKCiAgQG92ZXJyaWRlCiAgVXJpIGdldCBzb3VyY2VVcmkgPT4gX3NvdXJjZUZpbGUudXJpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IG9mZnNldDsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsaW5lID0+IChfbG9jYXRpb24gPz89IF9zb3VyY2VGaWxlLmdldExvY2F0aW9uKG9mZnNldCkpLmxpbmU7CgogIEBvdmVycmlkZQogIGludCBnZXQgY29sdW1uID0+IChfbG9jYXRpb24gPz89IF9zb3VyY2VGaWxlLmdldExvY2F0aW9uKG9mZnNldCkpLmNvbHVtbjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBzb3VyY2VOYW1lOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1ZhbGlkID0+IG9mZnNldCA8IF9zb3VyY2VGaWxlLmxlbmd0aDsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBzaG9ydFRleHQgPT4gJyR7c291cmNlVXJpLnBhdGhTZWdtZW50cy5sYXN0fTpbJGxpbmUsJGNvbHVtbl0nOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJHtzb3VyY2VVcml9OlskbGluZSwkY29sdW1uXSc7Cn0KCmNsYXNzIE9mZnNldFNvdXJjZUxvY2F0aW9uIGV4dGVuZHMgQWJzdHJhY3RTb3VyY2VMb2NhdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IG9mZnNldDsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgc291cmNlTmFtZTsKCiAgT2Zmc2V0U291cmNlTG9jYXRpb24oU291cmNlRmlsZSBzb3VyY2VGaWxlLCB0aGlzLm9mZnNldCwgdGhpcy5zb3VyY2VOYW1lKQogICAgICA6IHN1cGVyKHNvdXJjZUZpbGUpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IHNob3J0VGV4dCA9PiAnJHtzdXBlci5zaG9ydFRleHR9OiRzb3VyY2VOYW1lJzsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyR7c3VwZXIudG9TdHJpbmcoKX06JHNvdXJjZU5hbWUnOwp9CgovLy8gQ29tcHV0ZSB0aGUgc291cmNlIG1hcCBuYW1lIGZvciBbZWxlbWVudF0uIElmIFtjYWxsU3RydWN0dXJlXSBpcyBub24tbnVsbAovLy8gaXQgaXMgdXNlZCB0byBuYW1lIHRoZSBwYXJhbWV0ZXIgc3R1YiBmb3IgW2VsZW1lbnRdLgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNZXJnZSB0aGlzIHdpdGggYGNvbXB1dGVLZXJuZWxFbGVtZW50TmFtZUZvclNvdXJjZU1hcHNgCi8vIHdoZW4gdGhlIG9sZCBmcm9udGVuZCBpcyByZW1vdmVkLgpTdHJpbmcgY29tcHV0ZUVsZW1lbnROYW1lRm9yU291cmNlTWFwcyhFbnRpdHkgZWxlbWVudCwKICAgIFtDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmVdKSB7CiAgaWYgKGVsZW1lbnQgaXMgQ2xhc3NFbnRpdHkpIHsKICAgIHJldHVybiBlbGVtZW50Lm5hbWU7CiAgfSBlbHNlIGlmIChlbGVtZW50IGlzIE1lbWJlckVudGl0eSkgewogICAgU3RyaW5nIHN1ZmZpeCA9IGNvbXB1dGVTdHViU3VmZml4KGNhbGxTdHJ1Y3R1cmUpOwogICAgaWYgKGVsZW1lbnQgaXMgQ29uc3RydWN0b3JFbnRpdHkgfHwgZWxlbWVudCBpcyBDb25zdHJ1Y3RvckJvZHlFbnRpdHkpIHsKICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MubmFtZTsKICAgICAgaWYgKGVsZW1lbnQubmFtZSA9PSAnJykgewogICAgICAgIHJldHVybiBjbGFzc05hbWU7CiAgICAgIH0KICAgICAgcmV0dXJuICckY2xhc3NOYW1lLiR7ZWxlbWVudC5uYW1lfSRzdWZmaXgnOwogICAgfSBlbHNlIGlmIChlbGVtZW50LmVuY2xvc2luZ0NsYXNzICE9IG51bGwpIHsKICAgICAgaWYgKGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MuaXNDbG9zdXJlKSB7CiAgICAgICAgcmV0dXJuIGNvbXB1dGVFbGVtZW50TmFtZUZvclNvdXJjZU1hcHMoCiAgICAgICAgICAgIGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MsIGNhbGxTdHJ1Y3R1cmUpOwogICAgICB9CiAgICAgIHJldHVybiAnJHtlbGVtZW50LmVuY2xvc2luZ0NsYXNzLm5hbWV9LiR7ZWxlbWVudC5uYW1lfSRzdWZmaXgnOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICcke2VsZW1lbnQubmFtZX0kc3VmZml4JzsKICAgIH0KICB9CiAgLy8gVE9ETyhyZWRlbXB0aW9uKTogQ3JlYXRlIGVsZW1lbnQgbmFtZXMgZnJvbSBrZXJuZWwgbG9jYWxzIGFuZCBjbG9zdXJlcy4KICByZXR1cm4gZWxlbWVudC5uYW1lOwp9CgovLy8gQ29tcHV0ZSB0aGUgc3VmZml4IHVzZWQgZm9yIGEgcGFyYW1ldGVyIHN0dWIgZm9yIFtjYWxsU3RydWN0dXJlXS4KU3RyaW5nIGNvbXB1dGVTdHViU3VmZml4KENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSkgewogIGlmIChjYWxsU3RydWN0dXJlID09IG51bGwpIHJldHVybiAnJzsKICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgc2Iud3JpdGUocidbZnVuY3Rpb24tZW50cnkkJyk7CiAgc2Iud3JpdGUoY2FsbFN0cnVjdHVyZS5wb3NpdGlvbmFsQXJndW1lbnRDb3VudCk7CiAgaWYgKGNhbGxTdHJ1Y3R1cmUubmFtZWRBcmd1bWVudHMuaXNOb3RFbXB0eSkgewogICAgc2Iud3JpdGUocickJyk7CiAgICBzYi53cml0ZShjYWxsU3RydWN0dXJlLmdldE9yZGVyZWROYW1lZEFyZ3VtZW50cygpLmpvaW4ocickJykpOwogIH0KICBzYi53cml0ZSgnXScpOwogIHJldHVybiBzYi50b1N0cmluZygpOwp9CgpjbGFzcyBOb1NvdXJjZUxvY2F0aW9uTWFya2VyIGV4dGVuZHMgU291cmNlTG9jYXRpb24gewogIGNvbnN0IE5vU291cmNlTG9jYXRpb25NYXJrZXIoKTsKCiAgQG92ZXJyaWRlCiAgVXJpIGdldCBzb3VyY2VVcmkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNWYWxpZCA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IHNvdXJjZU5hbWUgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBjb2x1bW4gPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsaW5lID0+IG51bGw7CgogIEBvdmVycmlkZQogIGludCBnZXQgb2Zmc2V0ID0+IG51bGw7CgogIFN0cmluZyBnZXQgc2hvcnROYW1lID0+ICc8bm8tbG9jYXRpb24+JzsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJzxuby1sb2NhdGlvbj4nOwp9CgovLy8gSW5mb3JtYXRpb24gdHJhY2tlZCBhYm91dCBpbmxpbmVkIGZyYW1lcy4KLy8vCi8vLyBEYXJ0MmpzIGFkZHMgYW4gZXh0ZW5zaW9uIHRvIHNvdXJjZS1tYXAgZmlsZXMgdG8gdHJhY2sgd2hlcmUgY2FsbHMgYXJlCi8vLyBpbmxpbmVkLiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gaW1wcm92ZSB0aGUgcHJlY2lzaW9uIG9mIHRvb2xzIHRoYXQKLy8vIGRlb2JmdXNjYXRlIHByb2R1Y3Rpb24gc3RhY2sgdHJhY2VzLgpjbGFzcyBGcmFtZUVudHJ5IHsKICAvLy8gRm9yIHB1c2ggb3BlcmF0aW9ucywgdGhlIGxvY2F0aW9uIG9mIHRoZSBpbmxpbmluZyBjYWxsLCBvdGhlcndpc2UgbnVsbC4KICBmaW5hbCBTb3VyY2VMb2NhdGlvbiBwdXNoTG9jYXRpb247CgogIC8vLyBGb3IgcHVzaCBvcGVyYXRpb25zLCB0aGUgaW5saW5lZCBtZXRob2QgbmFtZSwgb3RoZXJ3aXNlIG51bGwuCiAgZmluYWwgU3RyaW5nIGlubGluZWRNZXRob2ROYW1lOwoKICAvLy8gV2hldGhlciBhIHBvcCBpcyB0aGUgbGFzdCBwb3AgdGhhdCBtYWtlcyB0aGUgaW5saW5pbmcgc3RhY2sgZW1wdHkuCiAgZmluYWwgYm9vbCBpc0VtcHR5UG9wOwoKICBGcmFtZUVudHJ5LnB1c2godGhpcy5wdXNoTG9jYXRpb24sIHRoaXMuaW5saW5lZE1ldGhvZE5hbWUpCiAgICAgIDogaXNFbXB0eVBvcCA9IGZhbHNlOwoKICBGcmFtZUVudHJ5LnBvcCh0aGlzLmlzRW1wdHlQb3ApCiAgICAgIDogcHVzaExvY2F0aW9uID0gbnVsbCwKICAgICAgICBpbmxpbmVkTWV0aG9kTmFtZSA9IG51bGw7CgogIGJvb2wgZ2V0IGlzUHVzaCA9PiBwdXNoTG9jYXRpb24gIT0gbnVsbDsKICBib29sIGdldCBpc1BvcCA9PiBwdXNoTG9jYXRpb24gPT0gbnVsbDsKfQqBmABOTjwBJAEoGSQ9KhsBTR9LHQEdAUQsAUMGPywBQioBOSwBLDIBRBgCAS0ESU1GFS0rASsiAT4BDE8CAUgiJQE4NCcrBAFBNwEtFwIBMiEkAVARJ0cMAUhNAVEfTQwBOw44AVAfNwE6NwFIUQE4NQFBNAFGNAE5RwFDMwFNNAE8NgE9NwFBOwFMJTgBOTYBQzYBRi4BQS4BSjwBSUQBTz4BTT4BTj0BUTkBSzYBUDkBRzcBRjYBRDQBRTYBPjMBPjMBRDcBQjsBQzwBRTUCASEgGgFDFQFNEgEvEAE/EgE9GQFBFAEMFSUfIgQBDBwtMCsiKAQBTgEMOwIBIT8gGQEtDBESLTg/BAFMAUQvAQwoAQwSAQxIAQxMAQwZAQwzAQxMAQw3AgE8DBQMGwFMGwEMPAEMOgIBTjlQJTclIBkoNkw2IBoIMjEuMDQIRg0nBgRNFwIBRjgoKCEzMRRDBBEYAgE2IgEMHQEMHAEMIQEMGgEMGAEMGgErAQwoAgEuBEtNKRNOJQFEIgFJGQE9HAEiHSIBKyoCAS9wYWNrYWdlOmNvbXBpbGVyL3NyYy9pby9zb3VyY2VfaW5mb3JtYXRpb24uZGFydDVzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL2JhY2tlbmQuZGFydMAAjz0vLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBqc19iYWNrZW5kLmJhY2tlbmQ7CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24vYmFja2VuZF9hcGkuZGFydCcgc2hvdyBJbXBhY3RUcmFuc2Zvcm1lcjsKaW1wb3J0ICcuLi9jb21tb24vY29kZWdlbi5kYXJ0JyBzaG93IENvZGVnZW5SZWdpc3RyeSwgQ29kZWdlbldvcmtJdGVtOwppbXBvcnQgJy4uL2NvbW1vbi9uYW1lcy5kYXJ0JyBzaG93IFVyaXM7CmltcG9ydCAnLi4vY29tbW9uL3Rhc2tzLmRhcnQnIHNob3cgQ29tcGlsZXJUYXNrOwppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JwogICAgc2hvdyBDb21tb25FbGVtZW50cywgRWxlbWVudEVudmlyb25tZW50LCBKRWxlbWVudEVudmlyb25tZW50OwppbXBvcnQgJy4uL2NvbXBpbGVyLmRhcnQnIHNob3cgQ29tcGlsZXI7CmltcG9ydCAnLi4vZGVmZXJyZWRfbG9hZC5kYXJ0JyBzaG93IERlZmVycmVkTG9hZFRhc2s7CmltcG9ydCAnLi4vZHVtcF9pbmZvLmRhcnQnIHNob3cgRHVtcEluZm9UYXNrOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2VucXVldWUuZGFydCcgc2hvdyBFbnF1ZXVlciwgRW5xdWV1ZVRhc2ssIFJlc29sdXRpb25FbnF1ZXVlcjsKaW1wb3J0ICcuLi9mcm9udGVuZF9zdHJhdGVneS5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pby9zb3VyY2VfaW5mb3JtYXRpb24uZGFydCcKICAgIHNob3cgU291cmNlSW5mb3JtYXRpb24sIFNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3k7CmltcG9ydCAnLi4vanMvanMuZGFydCcgYXMganNBc3Q7CmltcG9ydCAnLi4vanMvanMuZGFydCcgc2hvdyBqczsKaW1wb3J0ICcuLi9qc19tb2RlbC9lbGVtZW50cy5kYXJ0JzsKaW1wb3J0ICcuLi9qcy9yZXdyaXRlX2FzeW5jLmRhcnQnOwppbXBvcnQgJy4uL2pzX2VtaXR0ZXIvanNfZW1pdHRlci5kYXJ0JyBzaG93IENvZGVFbWl0dGVyVGFzazsKaW1wb3J0ICcuLi9qc19lbWl0dGVyL3NvcnRlci5kYXJ0JyBzaG93IFNvcnRlcjsKaW1wb3J0ICcuLi9rZXJuZWwvZGFydDJqc190YXJnZXQuZGFydCc7CmltcG9ydCAnLi4vbmF0aXZlL2VucXVldWUuZGFydCc7CmltcG9ydCAnLi4vc3NhL3NzYS5kYXJ0JyBzaG93IFNzYUZ1bmN0aW9uQ29tcGlsZXI7CmltcG9ydCAnLi4vdHJhY2VyLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NhbGxfc3RydWN0dXJlLmRhcnQnIHNob3cgQ2FsbFN0cnVjdHVyZTsKaW1wb3J0ICcuLi91bml2ZXJzZS9jbGFzc19oaWVyYXJjaHkuZGFydCcKICAgIHNob3cgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyLCBDbGFzc1F1ZXJpZXM7CmltcG9ydCAnLi4vdW5pdmVyc2UvY29kZWdlbl93b3JsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3I7CmltcG9ydCAnLi4vdW5pdmVyc2UvdXNlLmRhcnQnIHNob3cgU3RhdGljVXNlOwppbXBvcnQgJy4uL3VuaXZlcnNlL3dvcmxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvd29ybGRfaW1wYWN0LmRhcnQnCiAgICBzaG93IEltcGFjdFN0cmF0ZWd5LCBJbXBhY3RVc2VDYXNlLCBXb3JsZEltcGFjdCwgV29ybGRJbXBhY3RWaXNpdG9yOwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JzsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKaW1wb3J0ICdmaWVsZF9hbmFseXNpcy5kYXJ0JzsKaW1wb3J0ICdhbm5vdGF0aW9ucy5kYXJ0JzsKaW1wb3J0ICdiYWNrZW5kX2ltcGFjdC5kYXJ0JzsKaW1wb3J0ICdiYWNrZW5kX3VzYWdlLmRhcnQnOwppbXBvcnQgJ2NoZWNrZWRfbW9kZV9oZWxwZXJzLmRhcnQnOwppbXBvcnQgJ2NvZGVnZW5fbGlzdGVuZXIuZGFydCc7CmltcG9ydCAnY29uc3RhbnRfaGFuZGxlcl9qYXZhc2NyaXB0LmRhcnQnOwppbXBvcnQgJ2N1c3RvbV9lbGVtZW50c19hbmFseXNpcy5kYXJ0JzsKaW1wb3J0ICdlbnF1ZXVlci5kYXJ0JzsKaW1wb3J0ICdpbXBhY3RfdHJhbnNmb3JtZXIuZGFydCc7CmltcG9ydCAnaW5mZXJyZWRfZGF0YS5kYXJ0JzsKaW1wb3J0ICdpbnRlcmNlcHRvcl9kYXRhLmRhcnQnOwppbXBvcnQgJ25hbWVyLmRhcnQnOwppbXBvcnQgJ25hdGl2ZV9kYXRhLmRhcnQnOwppbXBvcnQgJ25vX3N1Y2hfbWV0aG9kX3JlZ2lzdHJ5LmRhcnQnOwppbXBvcnQgJ3Jlc29sdXRpb25fbGlzdGVuZXIuZGFydCc7CmltcG9ydCAncnVudGltZV90eXBlcy5kYXJ0JzsKCmFic3RyYWN0IGNsYXNzIEZ1bmN0aW9uQ29tcGlsZXIgewogIHZvaWQgb25Db2RlZ2VuU3RhcnQoKTsKCiAgLy8vIEdlbmVyYXRlcyBKYXZhU2NyaXB0IGNvZGUgZm9yIGB3b3JrLmVsZW1lbnRgLgogIGpzQXN0LkZ1biBjb21waWxlKENvZGVnZW5Xb3JrSXRlbSB3b3JrLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIGdsb2JhbEluZmVyZW5jZVJlc3VsdHMpOwoKICBJdGVyYWJsZSBnZXQgdGFza3M7Cn0KCi8qCiAqIEludmFyaWFudHM6CiAqICAgY2FuSW5saW5lKGZ1bmN0aW9uKSBpbXBsaWVzIGNhbklubGluZShmdW5jdGlvbiwgaW5zaWRlTG9vcDp0cnVlKQogKiAgICFjYW5JbmxpbmUoZnVuY3Rpb24sIGluc2lkZUxvb3A6IHRydWUpIGltcGxpZXMgIWNhbklubGluZShmdW5jdGlvbikKICovCmNsYXNzIEZ1bmN0aW9uSW5saW5lQ2FjaGUgewogIHN0YXRpYyBjb25zdCBpbnQgX3Vua25vd24gPSAtMTsKICBzdGF0aWMgY29uc3QgaW50IF9tdXN0Tm90SW5saW5lID0gMDsKICAvLyBNYXktaW5saW5lLWluLWxvb3AgbWVhbnMgdGhhdCB0aGUgZnVuY3Rpb24gbWF5IG5vdCBiZSBpbmxpbmVkIG91dHNpZGUgbG9vcHMKICAvLyBidXQgbWF5IGJlIGlubGluZWQgaW4gYSBsb29wLgogIHN0YXRpYyBjb25zdCBpbnQgX21heUlubGluZUluTG9vcE11c3ROb3RPdXRzaWRlID0gMTsKICAvLyBUaGUgZnVuY3Rpb24gY2FuIGJlIGlubGluZWQgaW4gYSBsb29wLCBidXQgbm90IG91dHNpZGUuCiAgc3RhdGljIGNvbnN0IGludCBfY2FuSW5saW5lSW5Mb29wTXVzdE5vdE91dHNpZGUgPSAyOwogIC8vIE1heS1pbmxpbmUgbWVhbnMgdGhhdCB3ZSBrbm93IHRoYXQgaXQgY2FuIGJlIGlubGluZWQgaW5zaWRlIGEgbG9vcCwgYnV0CiAgLy8gZG9uJ3Qga25vdyBhYm91dCB0aGUgZ2VuZXJhbCBjYXNlIHlldC4KICBzdGF0aWMgY29uc3QgaW50IF9jYW5JbmxpbmVJbkxvb3BNYXlJbmxpbmVPdXRzaWRlID0gMzsKICBzdGF0aWMgY29uc3QgaW50IF9jYW5JbmxpbmUgPSA0OwoKICBmaW5hbCBNYXA8RnVuY3Rpb25FbnRpdHksIGludD4gX2NhY2hlZERlY2lzaW9ucyA9CiAgICAgIG5ldyBNYXA8RnVuY3Rpb25FbnRpdHksIGludD4oKTsKCiAgZmluYWwgU2V0PEZ1bmN0aW9uRW50aXR5PiBfdHJ5SW5saW5lRnVuY3Rpb25zID0gbmV3IFNldDxGdW5jdGlvbkVudGl0eT4oKTsKCiAgRnVuY3Rpb25JbmxpbmVDYWNoZShBbm5vdGF0aW9uc0RhdGEgYW5ub3RhdGlvbnNEYXRhKSB7CiAgICBhbm5vdGF0aW9uc0RhdGEuZm9yRWFjaE5vSW5saW5lKChGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikgewogICAgICBtYXJrQXNOb25JbmxpbmFibGUoZnVuY3Rpb24pOwogICAgfSk7CiAgICBhbm5vdGF0aW9uc0RhdGEuZm9yRWFjaFRyeUlubGluZSgoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pIHsKICAgICAgbWFya0FzVHJ5SW5saW5lKGZ1bmN0aW9uKTsKICAgIH0pOwogIH0KCiAgLy8vIENoZWNrcyB0aGF0IFttZXRob2RdIGlzIHRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpdmUgZm9yIHRoaXMgbWV0aG9kLgogIC8vLwogIC8vLyBGb3IgYSBbTWV0aG9kRWxlbWVudF0gdGhpcyBtZWFucyBpdCBtdXN0IGJlIHRoZSBkZWNsYXJhdGlvbiBlbGVtZW50LgogIGJvb2wgY2hlY2tGdW5jdGlvbihGdW5jdGlvbkVudGl0eSBtZXRob2QpIHsKICAgIHJldHVybiAnJG1ldGhvZCcuc3RhcnRzV2l0aChqc0VsZW1lbnRQcmVmaXgpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIGN1cnJlbnQgY2FjaGUgZGVjaXNpb24uIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgdGVzdGluZy4KICBpbnQgZ2V0Q3VycmVudENhY2hlRGVjaXNpb25Gb3JUZXN0aW5nKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICAgIGFzc2VydChjaGVja0Z1bmN0aW9uKGVsZW1lbnQpLCBmYWlsZWRBdChlbGVtZW50KSk7CiAgICByZXR1cm4gX2NhY2hlZERlY2lzaW9uc1tlbGVtZW50XTsKICB9CgogIC8vIFJldHVybnMgYHRydWVgL2BmYWxzZWAgaWYgd2UgaGF2ZSBhIGNhY2hlZCBkZWNpc2lvbi4KICAvLyBSZXR1cm5zIGBudWxsYCBvdGhlcndpc2UuCiAgYm9vbCBjYW5JbmxpbmUoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCwge2Jvb2wgaW5zaWRlTG9vcH0pIHsKICAgIGFzc2VydChjaGVja0Z1bmN0aW9uKGVsZW1lbnQpLCBmYWlsZWRBdChlbGVtZW50KSk7CiAgICBpbnQgZGVjaXNpb24gPSBfY2FjaGVkRGVjaXNpb25zW2VsZW1lbnRdOwoKICAgIGlmIChkZWNpc2lvbiA9PSBudWxsKSB7CiAgICAgIC8vIFRPRE8oc3JhKTogSGF2ZSBhbm5vdGF0aW9ucyBmb3IgbXVzdElubGluZSAvIG5vSW5saW5lIGZvciBjb25zdHJ1Y3RvcgogICAgICAvLyBib2RpZXMuIChUaGVyZSB1c2VkIHRvIGJlIHNvbWUgbG9naWMgaGVyZSB0byBoYXZlIGNvbnN0cnVjdG9yIGJvZGllcywKICAgICAgLy8gaW5oZXJpdCB0aGUgc2V0dGluZ3MgZnJvbSBhbm5vdGF0aW9ucyBvbiB0aGUgZ2VuZXJhdGl2ZQogICAgICAvLyBjb25zdHJ1Y3Rvci4gVGhpcyB3YXMgY29uZmxhdGVkIHdpdGggdGhlIGhldXJpc3RpYyBkZWNpc2lvbnMsIGxlYWRpbmcKICAgICAgLy8gdG8gbGFjayBvZiBpbmxpbmluZyB3aGVyZSBpdCB3YXMgYmVuZWZpY2lhbC4pCiAgICAgIGRlY2lzaW9uID0gX3Vua25vd247CiAgICB9CgogICAgaWYgKGluc2lkZUxvb3ApIHsKICAgICAgc3dpdGNoIChkZWNpc2lvbikgewogICAgICAgIGNhc2UgX211c3ROb3RJbmxpbmU6CiAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgIGNhc2UgX3Vua25vd246CiAgICAgICAgY2FzZSBfbWF5SW5saW5lSW5Mb29wTXVzdE5vdE91dHNpZGU6CiAgICAgICAgICAvLyBXZSBrbm93IHdlIGNhbid0IGlubGluZSBvdXRzaWRlIGEgbG9vcCwgYnV0IGRvbid0IGtub3cgZm9yIHRoZQogICAgICAgICAgLy8gbG9vcCBjYXNlLiBSZXR1cm4gYG51bGxgIHRvIGluZGljYXRlIHRoYXQgd2UgZG9uJ3Qga25vdyB5ZXQuCiAgICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgICAgY2FzZSBfY2FuSW5saW5lSW5Mb29wTXVzdE5vdE91dHNpZGU6CiAgICAgICAgY2FzZSBfY2FuSW5saW5lSW5Mb29wTWF5SW5saW5lT3V0c2lkZToKICAgICAgICBjYXNlIF9jYW5JbmxpbmU6CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgc3dpdGNoIChkZWNpc2lvbikgewogICAgICAgIGNhc2UgX211c3ROb3RJbmxpbmU6CiAgICAgICAgY2FzZSBfbWF5SW5saW5lSW5Mb29wTXVzdE5vdE91dHNpZGU6CiAgICAgICAgY2FzZSBfY2FuSW5saW5lSW5Mb29wTXVzdE5vdE91dHNpZGU6CiAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgIGNhc2UgX3Vua25vd246CiAgICAgICAgY2FzZSBfY2FuSW5saW5lSW5Mb29wTWF5SW5saW5lT3V0c2lkZToKICAgICAgICAgIC8vIFdlIGtub3cgd2UgY2FuIGlubGluZSBpbnNpZGUgYSBsb29wLCBidXQgZG9uJ3Qga25vdyBmb3IgdGhlCiAgICAgICAgICAvLyBub24tbG9vcCBjYXNlLiBSZXR1cm4gYG51bGxgIHRvIGluZGljYXRlIHRoYXQgd2UgZG9uJ3Qga25vdyB5ZXQuCiAgICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgICAgY2FzZSBfY2FuSW5saW5lOgogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KCiAgICAvLyBRdWlldCBzdGF0aWMgY2hlY2tlci4KICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCBtYXJrQXNJbmxpbmFibGUoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCwge2Jvb2wgaW5zaWRlTG9vcH0pIHsKICAgIGFzc2VydChjaGVja0Z1bmN0aW9uKGVsZW1lbnQpLCBmYWlsZWRBdChlbGVtZW50KSk7CiAgICBpbnQgb2xkRGVjaXNpb24gPSBfY2FjaGVkRGVjaXNpb25zW2VsZW1lbnRdOwoKICAgIGlmIChvbGREZWNpc2lvbiA9PSBudWxsKSB7CiAgICAgIG9sZERlY2lzaW9uID0gX3Vua25vd247CiAgICB9CgogICAgaWYgKGluc2lkZUxvb3ApIHsKICAgICAgc3dpdGNoIChvbGREZWNpc2lvbikgewogICAgICAgIGNhc2UgX211c3ROb3RJbmxpbmU6CiAgICAgICAgICB0aHJvdyBmYWlsZWRBdCgKICAgICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAgICJDYW4ndCBtYXJrIGEgZnVuY3Rpb24gYXMgbm9uLWlubGluYWJsZSBhbmQgaW5saW5hYmxlIGF0IHRoZSAiCiAgICAgICAgICAgICAgInNhbWUgdGltZS4iKTsKCiAgICAgICAgY2FzZSBfdW5rbm93bjoKICAgICAgICAgIC8vIFdlIGtub3cgdGhhdCBpdCBjYW4gYmUgaW5saW5lZCBpbiBhIGxvb3AsIGJ1dCBkb24ndCBrbm93IGFib3V0IHRoZQogICAgICAgICAgLy8gbm9uLWxvb3AgY2FzZSB5ZXQuCiAgICAgICAgICBfY2FjaGVkRGVjaXNpb25zW2VsZW1lbnRdID0gX2NhbklubGluZUluTG9vcE1heUlubGluZU91dHNpZGU7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBfbWF5SW5saW5lSW5Mb29wTXVzdE5vdE91dHNpZGU6CiAgICAgICAgICBfY2FjaGVkRGVjaXNpb25zW2VsZW1lbnRdID0gX2NhbklubGluZUluTG9vcE11c3ROb3RPdXRzaWRlOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgX2NhbklubGluZUluTG9vcE11c3ROb3RPdXRzaWRlOgogICAgICAgIGNhc2UgX2NhbklubGluZUluTG9vcE1heUlubGluZU91dHNpZGU6CiAgICAgICAgY2FzZSBfY2FuSW5saW5lOgogICAgICAgICAgLy8gRG8gbm90aGluZy4KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBzd2l0Y2ggKG9sZERlY2lzaW9uKSB7CiAgICAgICAgY2FzZSBfbXVzdE5vdElubGluZToKICAgICAgICBjYXNlIF9tYXlJbmxpbmVJbkxvb3BNdXN0Tm90T3V0c2lkZToKICAgICAgICBjYXNlIF9jYW5JbmxpbmVJbkxvb3BNdXN0Tm90T3V0c2lkZToKICAgICAgICAgIHRocm93IGZhaWxlZEF0KAogICAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgICAgIkNhbid0IG1hcmsgYSBmdW5jdGlvbiBhcyBub24taW5saW5hYmxlIGFuZCBpbmxpbmFibGUgYXQgdGhlICIKICAgICAgICAgICAgICAic2FtZSB0aW1lLiIpOwoKICAgICAgICBjYXNlIF91bmtub3duOgogICAgICAgIGNhc2UgX2NhbklubGluZUluTG9vcE1heUlubGluZU91dHNpZGU6CiAgICAgICAgICBfY2FjaGVkRGVjaXNpb25zW2VsZW1lbnRdID0gX2NhbklubGluZTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9jYW5JbmxpbmU6CiAgICAgICAgICAvLyBEbyBub3RoaW5nLgogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgbWFya0FzTm9uSW5saW5hYmxlKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQsIHtib29sIGluc2lkZUxvb3A6IHRydWV9KSB7CiAgICBhc3NlcnQoY2hlY2tGdW5jdGlvbihlbGVtZW50KSwgZmFpbGVkQXQoZWxlbWVudCkpOwogICAgaW50IG9sZERlY2lzaW9uID0gX2NhY2hlZERlY2lzaW9uc1tlbGVtZW50XTsKCiAgICBpZiAob2xkRGVjaXNpb24gPT0gbnVsbCkgewogICAgICBvbGREZWNpc2lvbiA9IF91bmtub3duOwogICAgfQoKICAgIGlmIChpbnNpZGVMb29wKSB7CiAgICAgIHN3aXRjaCAob2xkRGVjaXNpb24pIHsKICAgICAgICBjYXNlIF9jYW5JbmxpbmVJbkxvb3BNdXN0Tm90T3V0c2lkZToKICAgICAgICBjYXNlIF9jYW5JbmxpbmVJbkxvb3BNYXlJbmxpbmVPdXRzaWRlOgogICAgICAgIGNhc2UgX2NhbklubGluZToKICAgICAgICAgIHRocm93IGZhaWxlZEF0KAogICAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgICAgIkNhbid0IG1hcmsgYSBmdW5jdGlvbiBhcyBub24taW5saW5hYmxlIGFuZCBpbmxpbmFibGUgYXQgdGhlICIKICAgICAgICAgICAgICAic2FtZSB0aW1lLiIpOwoKICAgICAgICBjYXNlIF9tYXlJbmxpbmVJbkxvb3BNdXN0Tm90T3V0c2lkZToKICAgICAgICBjYXNlIF91bmtub3duOgogICAgICAgICAgX2NhY2hlZERlY2lzaW9uc1tlbGVtZW50XSA9IF9tdXN0Tm90SW5saW5lOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgX211c3ROb3RJbmxpbmU6CiAgICAgICAgICAvLyBEbyBub3RoaW5nLgogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHN3aXRjaCAob2xkRGVjaXNpb24pIHsKICAgICAgICBjYXNlIF9jYW5JbmxpbmU6CiAgICAgICAgICB0aHJvdyBmYWlsZWRBdCgKICAgICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAgICJDYW4ndCBtYXJrIGEgZnVuY3Rpb24gYXMgbm9uLWlubGluYWJsZSBhbmQgaW5saW5hYmxlIGF0IHRoZSAiCiAgICAgICAgICAgICAgInNhbWUgdGltZS4iKTsKCiAgICAgICAgY2FzZSBfdW5rbm93bjoKICAgICAgICAgIC8vIFdlIGNhbid0IGlubGluZSBvdXRzaWRlIGEgbG9vcCwgYnV0IHdlIG1pZ2h0IHN0aWxsIGJlIGFsbG93ZWQgdG8gZG8KICAgICAgICAgIC8vIHNvIG91dHNpZGUuCiAgICAgICAgICBfY2FjaGVkRGVjaXNpb25zW2VsZW1lbnRdID0gX21heUlubGluZUluTG9vcE11c3ROb3RPdXRzaWRlOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgX2NhbklubGluZUluTG9vcE1heUlubGluZU91dHNpZGU6CiAgICAgICAgICAvLyBXZSBhbHJlYWR5IGtuZXcgdGhhdCB0aGUgZnVuY3Rpb24gY291bGQgYmUgaW5saW5lZCBpbnNpZGUgYSBsb29wLAogICAgICAgICAgLy8gYnV0IGRpZG4ndCBoYXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBub24tbG9vcCBjYXNlLiBOb3cgd2Uga25vdwogICAgICAgICAgLy8gdGhhdCBpdCBjYW4ndCBiZSBpbmxpbmVkIG91dHNpZGUgYSBsb29wLgogICAgICAgICAgX2NhY2hlZERlY2lzaW9uc1tlbGVtZW50XSA9IF9jYW5JbmxpbmVJbkxvb3BNdXN0Tm90T3V0c2lkZTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9tYXlJbmxpbmVJbkxvb3BNdXN0Tm90T3V0c2lkZToKICAgICAgICBjYXNlIF9jYW5JbmxpbmVJbkxvb3BNdXN0Tm90T3V0c2lkZToKICAgICAgICBjYXNlIF9tdXN0Tm90SW5saW5lOgogICAgICAgICAgLy8gRG8gbm90aGluZy4KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIG1hcmtBc1RyeUlubGluZShGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQoY2hlY2tGdW5jdGlvbihlbGVtZW50KSwgZmFpbGVkQXQoZWxlbWVudCkpOwogICAgX3RyeUlubGluZUZ1bmN0aW9ucy5hZGQoZWxlbWVudCk7CiAgfQoKICBib29sIG1hcmtlZEFzVHJ5SW5saW5lKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICAgIGFzc2VydChjaGVja0Z1bmN0aW9uKGVsZW1lbnQpLCBmYWlsZWRBdChlbGVtZW50KSk7CiAgICByZXR1cm4gX3RyeUlubGluZUZ1bmN0aW9ucy5jb250YWlucyhlbGVtZW50KTsKICB9Cn0KCmVudW0gU3ludGhldGljQ29uc3RhbnRLaW5kIHsKICBEVU1NWV9JTlRFUkNFUFRPUiwKICBFTVBUWV9WQUxVRSwKICBUWVBFVkFSSUFCTEVfUkVGRVJFTkNFLCAvLyBSZWZlcmVuY2UgdG8gYSB0eXBlIGluIHJlZmxlY3Rpb24gZGF0YS4KICBOQU1FCn0KCmNsYXNzIEphdmFTY3JpcHRCYWNrZW5kIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIEpTID0gJ0pTJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIEpTX0JVSUxUSU4gPSAnSlNfQlVJTFRJTic7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBKU19FTUJFRERFRF9HTE9CQUwgPSAnSlNfRU1CRURERURfR0xPQkFMJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIEpTX0lOVEVSQ0VQVE9SX0NPTlNUQU5UID0gJ0pTX0lOVEVSQ0VQVE9SX0NPTlNUQU5UJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIEpTX1NUUklOR19DT05DQVQgPSAnSlNfU1RSSU5HX0NPTkNBVCc7CgogIGZpbmFsIENvbXBpbGVyIGNvbXBpbGVyOwoKICBGcm9udGVuZFN0cmF0ZWd5IGdldCBmcm9udGVuZFN0cmF0ZWd5ID0+IGNvbXBpbGVyLmZyb250ZW5kU3RyYXRlZ3k7CgogIEZ1bmN0aW9uQ29tcGlsZXIgZnVuY3Rpb25Db21waWxlcjsKCiAgQ29kZUVtaXR0ZXJUYXNrIGVtaXR0ZXI7CgogIC8vLyBUaGUgZ2VuZXJhdGVkIGNvZGUgYXMgYSBqcyBBU1QgZm9yIGNvbXBpbGVkIG1ldGhvZHMuCiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwganNBc3QuRXhwcmVzc2lvbj4gZ2VuZXJhdGVkQ29kZSA9CiAgICAgIDxNZW1iZXJFbnRpdHksIGpzQXN0LkV4cHJlc3Npb24+e307CgogIE5hbWVyIF9uYW1lcjsKCiAgTmFtZXIgZ2V0IG5hbWVyIHsKICAgIGFzc2VydChfbmFtZXIgIT0gbnVsbCwKICAgICAgICBmYWlsZWRBdChOT19MT0NBVElPTl9TUEFOTkFCTEUsICJOYW1lciBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQuIikpOwogICAgcmV0dXJuIF9uYW1lcjsKICB9CgogIC8vLyBTZXQgb2YgY2xhc3NlcyB3aG9zZSBgb3BlcmF0b3IgPT1gIG1ldGhvZHMgaGFuZGxlIGBudWxsYCB0aGVtc2VsdmVzLgogIGZpbmFsIFNldDxDbGFzc0VudGl0eT4gc3BlY2lhbE9wZXJhdG9yRXFDbGFzc2VzID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKCiAgTGlzdDxDb21waWxlclRhc2s+IGdldCB0YXNrcyB7CiAgICBMaXN0PENvbXBpbGVyVGFzaz4gcmVzdWx0ID0gZnVuY3Rpb25Db21waWxlci50YXNrczsKICAgIHJlc3VsdC5hZGQoZW1pdHRlcik7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgUnVudGltZVR5cGVzQ2hlY2tzQnVpbGRlciBfcnRpQ2hlY2tzQnVpbGRlcjsKCiAgUnVudGltZVR5cGVzU3Vic3RpdHV0aW9ucyBfcnRpU3Vic3RpdHV0aW9uczsKCiAgUnVudGltZVR5cGVzRW5jb2RlciBfcnRpRW5jb2RlcjsKCiAgLy8vIFRydWUgaWYgdGhlIGh0bWwgbGlicmFyeSBoYXMgYmVlbiBsb2FkZWQuCiAgYm9vbCBodG1sTGlicmFyeUlzTG9hZGVkID0gZmFsc2U7CgogIC8vLyBSZXNvbHV0aW9uIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgdGFibGUgb2YgaW50ZXJjZXB0b3JzIGFuZAogIC8vLyBjb25zdHJ1Y3RvcnMgZm9yIGN1c3RvbSBlbGVtZW50cy4KICBDdXN0b21FbGVtZW50c1Jlc29sdXRpb25BbmFseXNpcyBfY3VzdG9tRWxlbWVudHNSZXNvbHV0aW9uQW5hbHlzaXM7CgogIC8vLyBDb2RlZ2VuIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgdGFibGUgb2YgaW50ZXJjZXB0b3JzIGFuZAogIC8vLyBjb25zdHJ1Y3RvcnMgZm9yIGN1c3RvbSBlbGVtZW50cy4KICBDdXN0b21FbGVtZW50c0NvZGVnZW5BbmFseXNpcyBfY3VzdG9tRWxlbWVudHNDb2RlZ2VuQW5hbHlzaXM7CgogIEtGaWVsZEFuYWx5c2lzIF9maWVsZEFuYWx5c2lzOwoKICAvLy8gU3VwcG9ydCBmb3IgY2xhc3NpZnlpbmcgYG5vU3VjaE1ldGhvZGAgaW1wbGVtZW50YXRpb25zLgogIE5vU3VjaE1ldGhvZFJlZ2lzdHJ5IG5vU3VjaE1ldGhvZFJlZ2lzdHJ5OwoKICAvLy8gVGhlIGNvbXBpbGVyIHRhc2sgcmVzcG9uc2libGUgZm9yIHRoZSBjb21waWxhdGlvbiBvZiBjb25zdGFudHMgZm9yIGJvdGgKICAvLy8gdGhlIGZyb250ZW5kIGFuZCB0aGUgYmFja2VuZC4KICBmaW5hbCBKYXZhU2NyaXB0Q29uc3RhbnRUYXNrIGNvbnN0YW50Q29tcGlsZXJUYXNrOwoKICAvLy8gQmFja2VuZCB0cmFuc2Zvcm1hdGlvbiBtZXRob2RzIGZvciB0aGUgd29ybGQgaW1wYWN0cy4KICBJbXBhY3RUcmFuc2Zvcm1lciBpbXBhY3RUcmFuc2Zvcm1lcjsKCiAgQ29kZWdlbkltcGFjdFRyYW5zZm9ybWVyIF9jb2RlZ2VuSW1wYWN0VHJhbnNmb3JtZXI7CgogIC8vLyBUaGUgc3RyYXRlZ3kgdXNlZCBmb3IgY29sbGVjdGluZyBhbmQgZW1pdHRpbmcgc291cmNlIGluZm9ybWF0aW9uLgogIFNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kgc291cmNlSW5mb3JtYXRpb25TdHJhdGVneTsKCiAgTmF0aXZlRGF0YUJ1aWxkZXJJbXBsIF9uYXRpdmVEYXRhQnVpbGRlcjsKICBOYXRpdmVEYXRhQnVpbGRlciBnZXQgbmF0aXZlRGF0YUJ1aWxkZXIgPT4gX25hdGl2ZURhdGFCdWlsZGVyOwogIE9uZVNob3RJbnRlcmNlcHRvckRhdGEgX29uZVNob3RJbnRlcmNlcHRvckRhdGE7CiAgQmFja2VuZFVzYWdlQnVpbGRlciBfYmFja2VuZFVzYWdlQnVpbGRlcjsKCiAgQ2hlY2tlZE1vZGVIZWxwZXJzIF9jaGVja2VkTW9kZUhlbHBlcnM7CgogIGZpbmFsIFN1cGVyTWVtYmVyRGF0YSBzdXBlck1lbWJlckRhdGEgPSBuZXcgU3VwZXJNZW1iZXJEYXRhKCk7CgogIE5hdGl2ZVJlc29sdXRpb25FbnF1ZXVlciBfbmF0aXZlUmVzb2x1dGlvbkVucXVldWVyOwogIE5hdGl2ZUNvZGVnZW5FbnF1ZXVlciBfbmF0aXZlQ29kZWdlbkVucXVldWVyOwoKICBUcmFjZXIgdHJhY2VyOwoKICBKYXZhU2NyaXB0QmFja2VuZCh0aGlzLmNvbXBpbGVyLAogICAgICB7Ym9vbCBnZW5lcmF0ZVNvdXJjZU1hcDogdHJ1ZSwKICAgICAgYm9vbCB1c2VNdWx0aVNvdXJjZUluZm86IGZhbHNlLAogICAgICBib29sIHVzZU5ld1NvdXJjZUluZm86IGZhbHNlfSkKICAgICAgOiB0aGlzLnNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kgPQogICAgICAgICAgICBjb21waWxlci5iYWNrZW5kU3RyYXRlZ3kuc291cmNlSW5mb3JtYXRpb25TdHJhdGVneSwKICAgICAgICBjb25zdGFudENvbXBpbGVyVGFzayA9IG5ldyBKYXZhU2NyaXB0Q29uc3RhbnRUYXNrKGNvbXBpbGVyKSB7CiAgICBDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cyA9IGNvbXBpbGVyLmZyb250ZW5kU3RyYXRlZ3kuY29tbW9uRWxlbWVudHM7CiAgICBfYmFja2VuZFVzYWdlQnVpbGRlciA9CiAgICAgICAgbmV3IEJhY2tlbmRVc2FnZUJ1aWxkZXJJbXBsKGNvbXBpbGVyLmZyb250ZW5kU3RyYXRlZ3kpOwogICAgX2NoZWNrZWRNb2RlSGVscGVycyA9IG5ldyBDaGVja2VkTW9kZUhlbHBlcnMoKTsKICAgIGVtaXR0ZXIgPSBuZXcgQ29kZUVtaXR0ZXJUYXNrKGNvbXBpbGVyLCBnZW5lcmF0ZVNvdXJjZU1hcCk7CiAgICBub1N1Y2hNZXRob2RSZWdpc3RyeSA9IG5ldyBOb1N1Y2hNZXRob2RSZWdpc3RyeUltcGwoCiAgICAgICAgY29tbW9uRWxlbWVudHMsIGNvbXBpbGVyLmZyb250ZW5kU3RyYXRlZ3kuY3JlYXRlTm9TdWNoTWV0aG9kUmVzb2x2ZXIoKSk7CiAgICBmdW5jdGlvbkNvbXBpbGVyID0gbmV3IFNzYUZ1bmN0aW9uQ29tcGlsZXIoCiAgICAgICAgdGhpcywgY29tcGlsZXIubWVhc3VyZXIsIHNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kpOwogIH0KCiAgRGlhZ25vc3RpY1JlcG9ydGVyIGdldCByZXBvcnRlciA9PiBjb21waWxlci5yZXBvcnRlcjsKCiAgSW1wYWN0Q2FjaGVEZWxldGVyIGdldCBpbXBhY3RDYWNoZURlbGV0ZXIgPT4gY29tcGlsZXIuaW1wYWN0Q2FjaGVEZWxldGVyOwoKICBLRmllbGRBbmFseXNpcyBnZXQgZmllbGRBbmFseXNpc0ZvclRlc3RpbmcgPT4gX2ZpZWxkQW5hbHlzaXM7CgogIC8vLyBSZXNvbHV0aW9uIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgdGFibGUgb2YgaW50ZXJjZXB0b3JzIGFuZAogIC8vLyBjb25zdHJ1Y3RvcnMgZm9yIGN1c3RvbSBlbGVtZW50cy4KICBDdXN0b21FbGVtZW50c1Jlc29sdXRpb25BbmFseXNpcyBnZXQgY3VzdG9tRWxlbWVudHNSZXNvbHV0aW9uQW5hbHlzaXMgewogICAgYXNzZXJ0KAogICAgICAgIF9jdXN0b21FbGVtZW50c1Jlc29sdXRpb25BbmFseXNpcyAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwKICAgICAgICAgICAgIkN1c3RvbUVsZW1lbnRzUmVzb2x1dGlvbkFuYWx5c2lzIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldC4iKSk7CiAgICByZXR1cm4gX2N1c3RvbUVsZW1lbnRzUmVzb2x1dGlvbkFuYWx5c2lzOwogIH0KCiAgLy8vIENvZGVnZW4gc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyB0YWJsZSBvZiBpbnRlcmNlcHRvcnMgYW5kCiAgLy8vIGNvbnN0cnVjdG9ycyBmb3IgY3VzdG9tIGVsZW1lbnRzLgogIEN1c3RvbUVsZW1lbnRzQ29kZWdlbkFuYWx5c2lzIGdldCBjdXN0b21FbGVtZW50c0NvZGVnZW5BbmFseXNpcyB7CiAgICBhc3NlcnQoCiAgICAgICAgX2N1c3RvbUVsZW1lbnRzQ29kZWdlbkFuYWx5c2lzICE9IG51bGwsCiAgICAgICAgZmFpbGVkQXQoTk9fTE9DQVRJT05fU1BBTk5BQkxFLAogICAgICAgICAgICAiQ3VzdG9tRWxlbWVudHNDb2RlZ2VuQW5hbHlzaXMgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0LiIpKTsKICAgIHJldHVybiBfY3VzdG9tRWxlbWVudHNDb2RlZ2VuQW5hbHlzaXM7CiAgfQoKICBPbmVTaG90SW50ZXJjZXB0b3JEYXRhIGdldCBvbmVTaG90SW50ZXJjZXB0b3JEYXRhIHsKICAgIGFzc2VydCgKICAgICAgICBfb25lU2hvdEludGVyY2VwdG9yRGF0YSAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwKICAgICAgICAgICAgIk9uZVNob3RJbnRlcmNlcHRvckRhdGEgaGFzIG5vdCBiZWVuIHByZXBhcmVkIHlldC4iKSk7CiAgICByZXR1cm4gX29uZVNob3RJbnRlcmNlcHRvckRhdGE7CiAgfQoKICBSdW50aW1lVHlwZXNDaGVja3NCdWlsZGVyIGdldCBydGlDaGVja3NCdWlsZGVyIHsKICAgIGFzc2VydCgKICAgICAgICBfcnRpQ2hlY2tzQnVpbGRlciAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwKICAgICAgICAgICAgIlJ1bnRpbWVUeXBlc0NoZWNrc0J1aWxkZXIgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0LiIpKTsKICAgIGFzc2VydCgKICAgICAgICAhX3J0aUNoZWNrc0J1aWxkZXIucnRpQ2hlY2tzQnVpbGRlckNsb3NlZCwKICAgICAgICBmYWlsZWRBdChOT19MT0NBVElPTl9TUEFOTkFCTEUsCiAgICAgICAgICAgICJSdW50aW1lVHlwZXNDaGVja3MgaGFzIGFscmVhZHkgYmVlbiBjb21wdXRlZC4iKSk7CiAgICByZXR1cm4gX3J0aUNoZWNrc0J1aWxkZXI7CiAgfQoKICBSdW50aW1lVHlwZXNDaGVja3NCdWlsZGVyIGdldCBydGlDaGVja3NCdWlsZGVyRm9yVGVzdGluZyA9PiBfcnRpQ2hlY2tzQnVpbGRlcjsKCiAgUnVudGltZVR5cGVzU3Vic3RpdHV0aW9ucyBnZXQgcnRpU3Vic3RpdHV0aW9ucyB7CiAgICBhc3NlcnQoCiAgICAgICAgX3J0aVN1YnN0aXR1dGlvbnMgIT0gbnVsbCwKICAgICAgICBmYWlsZWRBdChOT19MT0NBVElPTl9TUEFOTkFCTEUsCiAgICAgICAgICAgICJSdW50aW1lVHlwZXNTdWJzdGl0dXRpb25zIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldC4iKSk7CiAgICByZXR1cm4gX3J0aVN1YnN0aXR1dGlvbnM7CiAgfQoKICBSdW50aW1lVHlwZXNFbmNvZGVyIGdldCBydGlFbmNvZGVyIHsKICAgIGFzc2VydCgKICAgICAgICBfcnRpRW5jb2RlciAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwKICAgICAgICAgICAgIlJ1bnRpbWVUeXBlc0VuY29kZXIgaGFzIG5vdCBiZWVuIGNyZWF0ZWQuIikpOwogICAgcmV0dXJuIF9ydGlFbmNvZGVyOwogIH0KCiAgQ2hlY2tlZE1vZGVIZWxwZXJzIGdldCBjaGVja2VkTW9kZUhlbHBlcnMgPT4gX2NoZWNrZWRNb2RlSGVscGVyczsKCiAgLy8vIFJldHVybnMgY29uc3RhbnQgZW52aXJvbm1lbnQgZm9yIHRoZSBKYXZhU2NyaXB0IGludGVycHJldGF0aW9uIG9mIHRoZQogIC8vLyBjb25zdGFudHMuCiAgSmF2YVNjcmlwdENvbnN0YW50Q29tcGlsZXIgZ2V0IGNvbnN0YW50cyB7CiAgICByZXR1cm4gY29uc3RhbnRDb21waWxlclRhc2suanNDb25zdGFudENvbXBpbGVyOwogIH0KCiAgTmFtZXIgZGV0ZXJtaW5lTmFtZXIoCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwgQ29kZWdlbldvcmxkQnVpbGRlciBjb2RlZ2VuV29ybGRCdWlsZGVyKSB7CiAgICByZXR1cm4gY29tcGlsZXIub3B0aW9ucy5lbmFibGVNaW5pZmljYXRpb24KICAgICAgICA/IGNvbXBpbGVyLm9wdGlvbnMudXNlRnJlcXVlbmN5TmFtZXIKICAgICAgICAgICAgPyBuZXcgRnJlcXVlbmN5QmFzZWROYW1lcihjbG9zZWRXb3JsZCwgY29kZWdlbldvcmxkQnVpbGRlcikKICAgICAgICAgICAgOiBuZXcgTWluaWZ5TmFtZXIoY2xvc2VkV29ybGQsIGNvZGVnZW5Xb3JsZEJ1aWxkZXIpCiAgICAgICAgOiBuZXcgTmFtZXIoY2xvc2VkV29ybGQsIGNvZGVnZW5Xb3JsZEJ1aWxkZXIpOwogIH0KCiAgdm9pZCB2YWxpZGF0ZUludGVyY2VwdG9ySW1wbGVtZW50c0FsbE9iamVjdE1ldGhvZHMoCiAgICAgIENsYXNzRW50aXR5IGludGVyY2VwdG9yQ2xhc3MpIHsKICAgIGlmIChpbnRlcmNlcHRvckNsYXNzID09IG51bGwpIHJldHVybjsKICAgIENsYXNzRW50aXR5IG9iamVjdENsYXNzID0gZnJvbnRlbmRTdHJhdGVneS5jb21tb25FbGVtZW50cy5vYmplY3RDbGFzczsKICAgIGZyb250ZW5kU3RyYXRlZ3kuZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hDbGFzc01lbWJlcihvYmplY3RDbGFzcywKICAgICAgICAoXywgTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgICBNZW1iZXJFbnRpdHkgaW50ZXJjZXB0b3JNZW1iZXIgPSBmcm9udGVuZFN0cmF0ZWd5LmVsZW1lbnRFbnZpcm9ubWVudAogICAgICAgICAgLmxvb2t1cExvY2FsQ2xhc3NNZW1iZXIoaW50ZXJjZXB0b3JDbGFzcywgbWVtYmVyLm5hbWUpOwogICAgICAvLyBJbnRlcmNlcHRvcnMgbXVzdCBvdmVycmlkZSBhbGwgT2JqZWN0IG1ldGhvZHMgZHVlIHRvIGNhbGxpbmcgY29udmVudGlvbgogICAgICAvLyBkaWZmZXJlbmNlcy4KICAgICAgYXNzZXJ0KAogICAgICAgICAgaW50ZXJjZXB0b3JNZW1iZXIuZW5jbG9zaW5nQ2xhc3MgPT0gaW50ZXJjZXB0b3JDbGFzcywKICAgICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICAgIGludGVyY2VwdG9yTWVtYmVyLAogICAgICAgICAgICAgICJNZW1iZXIgJHttZW1iZXIubmFtZX0gbm90IG92ZXJyaWRkZW4gaW4gJHtpbnRlcmNlcHRvckNsYXNzfS4gIgogICAgICAgICAgICAgICJGb3VuZCAkaW50ZXJjZXB0b3JNZW1iZXIgZnJvbSAiCiAgICAgICAgICAgICAgIiR7aW50ZXJjZXB0b3JNZW1iZXIuZW5jbG9zaW5nQ2xhc3N9LiIpKTsKICAgIH0pOwogIH0KCiAgLy8vIENhbGxlZCBiZWZvcmUgcHJvY2Vzc2luZyBvZiB0aGUgcmVzb2x1dGlvbiBxdWV1ZSBpcyBzdGFydGVkLgogIHZvaWQgb25SZXNvbHV0aW9uU3RhcnQoKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBdm9pZCB0aGUgY29tcGlsZXIuZWxlbWVudEVudmlyb25tZW50LmdldFRoaXNUeXBlCiAgICAvLyBjYWxscy4gQ3VycmVudGx5IG5lZWRlZCB0byBlbnN1cmUgcmVzb2x1dGlvbiBvZiB0aGUgY2xhc3NlcyBmb3IgdmFyaW91cwogICAgLy8gcXVlcmllcyBpbiBuYXRpdmUgYmVoYXZpb3IgY29tcHV0YXRpb24sIGluZmVyZW5jZSBhbmQgY29kZWdlbi4KICAgIGZyb250ZW5kU3RyYXRlZ3kuZWxlbWVudEVudmlyb25tZW50CiAgICAgICAgLmdldFRoaXNUeXBlKGZyb250ZW5kU3RyYXRlZ3kuY29tbW9uRWxlbWVudHMuanNBcnJheUNsYXNzKTsKICAgIGZyb250ZW5kU3RyYXRlZ3kuZWxlbWVudEVudmlyb25tZW50CiAgICAgICAgLmdldFRoaXNUeXBlKGZyb250ZW5kU3RyYXRlZ3kuY29tbW9uRWxlbWVudHMuanNFeHRlbmRhYmxlQXJyYXlDbGFzcyk7CgogICAgdmFsaWRhdGVJbnRlcmNlcHRvckltcGxlbWVudHNBbGxPYmplY3RNZXRob2RzKAogICAgICAgIGZyb250ZW5kU3RyYXRlZ3kuY29tbW9uRWxlbWVudHMuanNJbnRlcmNlcHRvckNsYXNzKTsKICAgIC8vIFRoZSBudWxsLWludGVyY2VwdG9yIG11c3QgYWxzbyBpbXBsZW1lbnQgKmFsbCogbWV0aG9kcy4KICAgIHZhbGlkYXRlSW50ZXJjZXB0b3JJbXBsZW1lbnRzQWxsT2JqZWN0TWV0aG9kcygKICAgICAgICBmcm9udGVuZFN0cmF0ZWd5LmNvbW1vbkVsZW1lbnRzLmpzTnVsbENsYXNzKTsKICB9CgogIC8vLyBDYWxsZWQgd2hlbiB0aGUgcmVzb2x1dGlvbiBxdWV1ZSBoYXMgYmVlbiBjbG9zZWQuCiAgdm9pZCBvblJlc29sdXRpb25FbmQoKSB7CiAgICBmcm9udGVuZFN0cmF0ZWd5LmFubm90YXRpb25Qcm9jZXNzb3IucHJvY2Vzc0pzSW50ZXJvcEFubm90YXRpb25zKAogICAgICAgIGZyb250ZW5kU3RyYXRlZ3kubmF0aXZlQmFzaWNEYXRhLCBuYXRpdmVEYXRhQnVpbGRlcik7CiAgfQoKICBSZXNvbHV0aW9uRW5xdWV1ZXIgY3JlYXRlUmVzb2x1dGlvbkVucXVldWVyKAogICAgICBDb21waWxlclRhc2sgdGFzaywgQ29tcGlsZXIgY29tcGlsZXIpIHsKICAgIEVsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQgPQogICAgICAgIGNvbXBpbGVyLmZyb250ZW5kU3RyYXRlZ3kuZWxlbWVudEVudmlyb25tZW50OwogICAgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMgPSBjb21waWxlci5mcm9udGVuZFN0cmF0ZWd5LmNvbW1vbkVsZW1lbnRzOwogICAgTmF0aXZlQmFzaWNEYXRhIG5hdGl2ZUJhc2ljRGF0YSA9IGNvbXBpbGVyLmZyb250ZW5kU3RyYXRlZ3kubmF0aXZlQmFzaWNEYXRhOwogICAgUnVudGltZVR5cGVzTmVlZEJ1aWxkZXIgcnRpTmVlZEJ1aWxkZXIgPQogICAgICAgIGNvbXBpbGVyLmZyb250ZW5kU3RyYXRlZ3kuY3JlYXRlUnVudGltZVR5cGVzTmVlZEJ1aWxkZXIoKTsKICAgIEJhY2tlbmRJbXBhY3RzIGltcGFjdHMgPSBuZXcgQmFja2VuZEltcGFjdHMoY29tbW9uRWxlbWVudHMpOwogICAgX25hdGl2ZVJlc29sdXRpb25FbnF1ZXVlciA9IG5ldyBOYXRpdmVSZXNvbHV0aW9uRW5xdWV1ZXIoCiAgICAgICAgY29tcGlsZXIub3B0aW9ucywKICAgICAgICBlbGVtZW50RW52aXJvbm1lbnQsCiAgICAgICAgY29tbW9uRWxlbWVudHMsCiAgICAgICAgY29tcGlsZXIuZnJvbnRlbmRTdHJhdGVneS5kYXJ0VHlwZXMsCiAgICAgICAgY29tcGlsZXIuZnJvbnRlbmRTdHJhdGVneS5jcmVhdGVOYXRpdmVDbGFzc0ZpbmRlcihuYXRpdmVCYXNpY0RhdGEpKTsKICAgIF9uYXRpdmVEYXRhQnVpbGRlciA9IG5ldyBOYXRpdmVEYXRhQnVpbGRlckltcGwobmF0aXZlQmFzaWNEYXRhKTsKICAgIF9jdXN0b21FbGVtZW50c1Jlc29sdXRpb25BbmFseXNpcyA9IG5ldyBDdXN0b21FbGVtZW50c1Jlc29sdXRpb25BbmFseXNpcygKICAgICAgICBlbGVtZW50RW52aXJvbm1lbnQsCiAgICAgICAgY29tbW9uRWxlbWVudHMsCiAgICAgICAgbmF0aXZlQmFzaWNEYXRhLAogICAgICAgIF9iYWNrZW5kVXNhZ2VCdWlsZGVyKTsKICAgIF9maWVsZEFuYWx5c2lzID0gbmV3IEtGaWVsZEFuYWx5c2lzKGNvbXBpbGVyLmZyb250ZW5kU3RyYXRlZ3kpOwogICAgQ2xhc3NRdWVyaWVzIGNsYXNzUXVlcmllcyA9IGNvbXBpbGVyLmZyb250ZW5kU3RyYXRlZ3kuY3JlYXRlQ2xhc3NRdWVyaWVzKCk7CiAgICBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgY2xhc3NIaWVyYXJjaHlCdWlsZGVyID0KICAgICAgICBuZXcgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyKGNvbW1vbkVsZW1lbnRzLCBjbGFzc1F1ZXJpZXMpOwogICAgaW1wYWN0VHJhbnNmb3JtZXIgPSBuZXcgSmF2YVNjcmlwdEltcGFjdFRyYW5zZm9ybWVyKAogICAgICAgIGNvbXBpbGVyLm9wdGlvbnMsCiAgICAgICAgZWxlbWVudEVudmlyb25tZW50LAogICAgICAgIGNvbW1vbkVsZW1lbnRzLAogICAgICAgIGltcGFjdHMsCiAgICAgICAgbmF0aXZlQmFzaWNEYXRhLAogICAgICAgIF9uYXRpdmVSZXNvbHV0aW9uRW5xdWV1ZXIsCiAgICAgICAgX2JhY2tlbmRVc2FnZUJ1aWxkZXIsCiAgICAgICAgY3VzdG9tRWxlbWVudHNSZXNvbHV0aW9uQW5hbHlzaXMsCiAgICAgICAgcnRpTmVlZEJ1aWxkZXIsCiAgICAgICAgY2xhc3NIaWVyYXJjaHlCdWlsZGVyKTsKICAgIEludGVyY2VwdG9yRGF0YUJ1aWxkZXIgaW50ZXJjZXB0b3JEYXRhQnVpbGRlciA9CiAgICAgICAgbmV3IEludGVyY2VwdG9yRGF0YUJ1aWxkZXJJbXBsKAogICAgICAgICAgICBuYXRpdmVCYXNpY0RhdGEsIGVsZW1lbnRFbnZpcm9ubWVudCwgY29tbW9uRWxlbWVudHMpOwogICAgQW5ub3RhdGlvbnNEYXRhQnVpbGRlciBhbm5vdGF0aW9uc0RhdGFCdWlsZGVyID0KICAgICAgICBuZXcgQW5ub3RhdGlvbnNEYXRhQnVpbGRlcigpOwogICAgcmV0dXJuIG5ldyBSZXNvbHV0aW9uRW5xdWV1ZXIoCiAgICAgICAgdGFzaywKICAgICAgICBjb21waWxlci5vcHRpb25zLAogICAgICAgIGNvbXBpbGVyLnJlcG9ydGVyLAogICAgICAgIG5ldyBSZXNvbHV0aW9uRW5xdWV1ZXJMaXN0ZW5lcigKICAgICAgICAgICAgY29tcGlsZXIub3B0aW9ucywKICAgICAgICAgICAgZWxlbWVudEVudmlyb25tZW50LAogICAgICAgICAgICBjb21tb25FbGVtZW50cywKICAgICAgICAgICAgaW1wYWN0cywKICAgICAgICAgICAgbmF0aXZlQmFzaWNEYXRhLAogICAgICAgICAgICBpbnRlcmNlcHRvckRhdGFCdWlsZGVyLAogICAgICAgICAgICBfYmFja2VuZFVzYWdlQnVpbGRlciwKICAgICAgICAgICAgbm9TdWNoTWV0aG9kUmVnaXN0cnksCiAgICAgICAgICAgIGN1c3RvbUVsZW1lbnRzUmVzb2x1dGlvbkFuYWx5c2lzLAogICAgICAgICAgICBfbmF0aXZlUmVzb2x1dGlvbkVucXVldWVyLAogICAgICAgICAgICBfZmllbGRBbmFseXNpcywKICAgICAgICAgICAgY29tcGlsZXIuZGVmZXJyZWRMb2FkVGFzayksCiAgICAgICAgY29tcGlsZXIuZnJvbnRlbmRTdHJhdGVneS5jcmVhdGVSZXNvbHV0aW9uV29ybGRCdWlsZGVyKAogICAgICAgICAgICBuYXRpdmVCYXNpY0RhdGEsCiAgICAgICAgICAgIF9uYXRpdmVEYXRhQnVpbGRlciwKICAgICAgICAgICAgaW50ZXJjZXB0b3JEYXRhQnVpbGRlciwKICAgICAgICAgICAgX2JhY2tlbmRVc2FnZUJ1aWxkZXIsCiAgICAgICAgICAgIHJ0aU5lZWRCdWlsZGVyLAogICAgICAgICAgICBfZmllbGRBbmFseXNpcywKICAgICAgICAgICAgX25hdGl2ZVJlc29sdXRpb25FbnF1ZXVlciwKICAgICAgICAgICAgbm9TdWNoTWV0aG9kUmVnaXN0cnksCiAgICAgICAgICAgIGFubm90YXRpb25zRGF0YUJ1aWxkZXIsCiAgICAgICAgICAgIGNvbnN0IFN0cm9uZ01vZGVXb3JsZFN0cmF0ZWd5KCksCiAgICAgICAgICAgIGNsYXNzSGllcmFyY2h5QnVpbGRlciwKICAgICAgICAgICAgY2xhc3NRdWVyaWVzKSwKICAgICAgICBjb21waWxlci5mcm9udGVuZFN0cmF0ZWd5LmNyZWF0ZVJlc29sdXRpb25Xb3JrSXRlbUJ1aWxkZXIoCiAgICAgICAgICAgIG5hdGl2ZUJhc2ljRGF0YSwKICAgICAgICAgICAgX25hdGl2ZURhdGFCdWlsZGVyLAogICAgICAgICAgICBhbm5vdGF0aW9uc0RhdGFCdWlsZGVyLAogICAgICAgICAgICBpbXBhY3RUcmFuc2Zvcm1lciwKICAgICAgICAgICAgY29tcGlsZXIuaW1wYWN0Q2FjaGUsCiAgICAgICAgICAgIF9maWVsZEFuYWx5c2lzKSk7CiAgfQoKICAvLy8gQ3JlYXRlcyBhbiBbRW5xdWV1ZXJdIGZvciBjb2RlIGdlbmVyYXRpb24gc3BlY2lmaWMgdG8gdGhpcyBiYWNrZW5kLgogIENvZGVnZW5FbnF1ZXVlciBjcmVhdGVDb2RlZ2VuRW5xdWV1ZXIoCiAgICAgIENvbXBpbGVyVGFzayB0YXNrLAogICAgICBDb21waWxlciBjb21waWxlciwKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBnbG9iYWxJbmZlcmVuY2VSZXN1bHRzKSB7CiAgICBFbGVtZW50RW52aXJvbm1lbnQgZWxlbWVudEVudmlyb25tZW50ID0gY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50OwogICAgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMgPSBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50czsKICAgIEJhY2tlbmRJbXBhY3RzIGltcGFjdHMgPSBuZXcgQmFja2VuZEltcGFjdHMoY29tbW9uRWxlbWVudHMpOwogICAgX2N1c3RvbUVsZW1lbnRzQ29kZWdlbkFuYWx5c2lzID0gbmV3IEN1c3RvbUVsZW1lbnRzQ29kZWdlbkFuYWx5c2lzKAogICAgICAgIGNvbW1vbkVsZW1lbnRzLCBlbGVtZW50RW52aXJvbm1lbnQsIGNsb3NlZFdvcmxkLm5hdGl2ZURhdGEpOwogICAgX25hdGl2ZUNvZGVnZW5FbnF1ZXVlciA9IG5ldyBOYXRpdmVDb2RlZ2VuRW5xdWV1ZXIoCiAgICAgICAgY29tcGlsZXIub3B0aW9ucywKICAgICAgICBlbGVtZW50RW52aXJvbm1lbnQsCiAgICAgICAgY29tbW9uRWxlbWVudHMsCiAgICAgICAgY2xvc2VkV29ybGQuZGFydFR5cGVzLAogICAgICAgIGVtaXR0ZXIsCiAgICAgICAgY2xvc2VkV29ybGQubGl2ZU5hdGl2ZUNsYXNzZXMsCiAgICAgICAgY2xvc2VkV29ybGQubmF0aXZlRGF0YSk7CiAgICByZXR1cm4gbmV3IENvZGVnZW5FbnF1ZXVlcigKICAgICAgICB0YXNrLAogICAgICAgIGNvbXBpbGVyLm9wdGlvbnMsCiAgICAgICAgY29tcGlsZXIuYmFja2VuZFN0cmF0ZWd5LmNyZWF0ZUNvZGVnZW5Xb3JsZEJ1aWxkZXIoCiAgICAgICAgICAgIGNsb3NlZFdvcmxkLm5hdGl2ZURhdGEsCiAgICAgICAgICAgIGNsb3NlZFdvcmxkLAogICAgICAgICAgICBjb21waWxlci5hYnN0cmFjdFZhbHVlU3RyYXRlZ3kuY3JlYXRlU2VsZWN0b3JTdHJhdGVneSgpKSwKICAgICAgICBjb21waWxlci5iYWNrZW5kU3RyYXRlZ3kKICAgICAgICAgICAgLmNyZWF0ZUNvZGVnZW5Xb3JrSXRlbUJ1aWxkZXIoY2xvc2VkV29ybGQsIGdsb2JhbEluZmVyZW5jZVJlc3VsdHMpLAogICAgICAgIG5ldyBDb2RlZ2VuRW5xdWV1ZXJMaXN0ZW5lcigKICAgICAgICAgICAgZWxlbWVudEVudmlyb25tZW50LAogICAgICAgICAgICBjb21tb25FbGVtZW50cywKICAgICAgICAgICAgaW1wYWN0cywKICAgICAgICAgICAgY2xvc2VkV29ybGQuYmFja2VuZFVzYWdlLAogICAgICAgICAgICBjbG9zZWRXb3JsZC5ydGlOZWVkLAogICAgICAgICAgICBjdXN0b21FbGVtZW50c0NvZGVnZW5BbmFseXNpcywKICAgICAgICAgICAgbmF0aXZlQ29kZWdlbkVucXVldWVyKSk7CiAgfQoKICBNYXA8TWVtYmVyRW50aXR5LCBXb3JsZEltcGFjdD4gY29kZWdlbkltcGFjdHNGb3JUZXN0aW5nOwoKICBXb3JsZEltcGFjdCBjb2RlZ2VuKENvZGVnZW5Xb3JrSXRlbSB3b3JrLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIGdsb2JhbEluZmVyZW5jZVJlc3VsdHMpIHsKICAgIE1lbWJlckVudGl0eSBlbGVtZW50ID0gd29yay5lbGVtZW50OwogICAgaWYgKGNvbXBpbGVyLmVsZW1lbnRIYXNDb21waWxlVGltZUVycm9yKGVsZW1lbnQpKSB7CiAgICAgIERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UgPQogICAgICAgICAgLy8gSWYgdGhlcmUncyBtb3JlIHRoYW4gb25lIGVycm9yLCB0aGUgZmlyc3QgaXMgcHJvYmFibHkgbW9zdAogICAgICAgICAgLy8gaW5mb3JtYXRpdmUsIGFzIHRoZSBmb2xsb3dpbmcgZXJyb3JzIG1heSBiZSBzaWRlLWVmZmVjdHMgb2YgdGhlCiAgICAgICAgICAvLyBmaXJzdCBlcnJvci4KICAgICAgICAgIGNvbXBpbGVyLmVsZW1lbnRzV2l0aENvbXBpbGVUaW1lRXJyb3JzW2VsZW1lbnRdLmZpcnN0OwogICAgICBTdHJpbmcgbWVzc2FnZVRleHQgPSBtZXNzYWdlLm1lc3NhZ2UuY29tcHV0ZU1lc3NhZ2UoKTsKICAgICAganNBc3QuTGl0ZXJhbFN0cmluZyBtZXNzYWdlTGl0ZXJhbCA9CiAgICAgICAgICBqcy5lc2NhcGVkU3RyaW5nKCJDb21waWxlIHRpbWUgZXJyb3IgaW4gJGVsZW1lbnQ6ICRtZXNzYWdlVGV4dCIpOwogICAgICBnZW5lcmF0ZWRDb2RlW2VsZW1lbnRdID0KICAgICAgICAgIGpzKCJmdW5jdGlvbiAoKSB7IHRocm93IG5ldyBFcnJvcigjKTsgfSIsIFttZXNzYWdlTGl0ZXJhbF0pOwogICAgICByZXR1cm4gY29uc3QgV29ybGRJbXBhY3QoKTsKICAgIH0KICAgIGlmIChlbGVtZW50LmlzQ29uc3RydWN0b3IgJiYKICAgICAgICBlbGVtZW50LmVuY2xvc2luZ0NsYXNzID09IGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmpzTnVsbENsYXNzKSB7CiAgICAgIC8vIFdvcmsgYXJvdW5kIGEgcHJvYmxlbSBjb21waWxpbmcgSlNOdWxsJ3MgY29uc3RydWN0b3IuCiAgICAgIHJldHVybiBjb25zdCBXb3JsZEltcGFjdCgpOwogICAgfQoKICAgIGpzQXN0LkZ1biBmdW5jdGlvbiA9CiAgICAgICAgZnVuY3Rpb25Db21waWxlci5jb21waWxlKHdvcmssIGNsb3NlZFdvcmxkLCBnbG9iYWxJbmZlcmVuY2VSZXN1bHRzKTsKICAgIGlmIChmdW5jdGlvbiAhPSBudWxsKSB7CiAgICAgIGlmIChmdW5jdGlvbi5zb3VyY2VJbmZvcm1hdGlvbiA9PSBudWxsKSB7CiAgICAgICAgZnVuY3Rpb24gPSBmdW5jdGlvbi53aXRoU291cmNlSW5mb3JtYXRpb24oCiAgICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kuYnVpbGRTb3VyY2VNYXBwZWRNYXJrZXIoKSk7CiAgICAgIH0KICAgICAgZ2VuZXJhdGVkQ29kZVtlbGVtZW50XSA9IGZ1bmN0aW9uOwogICAgfQogICAgaWYgKHJldGFpbkRhdGFGb3JUZXN0aW5nKSB7CiAgICAgIGNvZGVnZW5JbXBhY3RzRm9yVGVzdGluZyA/Pz0gPE1lbWJlckVudGl0eSwgV29ybGRJbXBhY3Q+e307CiAgICAgIGNvZGVnZW5JbXBhY3RzRm9yVGVzdGluZ1tlbGVtZW50XSA9IHdvcmsucmVnaXN0cnkud29ybGRJbXBhY3Q7CiAgICB9CiAgICBXb3JsZEltcGFjdCB3b3JsZEltcGFjdCA9IF9jb2RlZ2VuSW1wYWN0VHJhbnNmb3JtZXIKICAgICAgICAudHJhbnNmb3JtQ29kZWdlbkltcGFjdCh3b3JrLnJlZ2lzdHJ5LndvcmxkSW1wYWN0KTsKICAgIGNvbXBpbGVyLmR1bXBJbmZvVGFzay5yZWdpc3RlckltcGFjdChlbGVtZW50LCB3b3JsZEltcGFjdCk7CiAgICByZXR1cm4gd29ybGRJbXBhY3Q7CiAgfQoKICBOYXRpdmVSZXNvbHV0aW9uRW5xdWV1ZXIgZ2V0IG5hdGl2ZVJlc29sdXRpb25FbnF1ZXVlckZvclRlc3RpbmcgPT4KICAgICAgX25hdGl2ZVJlc29sdXRpb25FbnF1ZXVlcjsKCiAgTmF0aXZlRW5xdWV1ZXIgZ2V0IG5hdGl2ZUNvZGVnZW5FbnF1ZXVlciA9PiBfbmF0aXZlQ29kZWdlbkVucXVldWVyOwoKICAvLy8gVW5pdCB0ZXN0IGhvb2sgdGhhdCByZXR1cm5zIGNvZGUgb2YgYW4gZWxlbWVudCBhcyBhIFN0cmluZy4KICAvLy8KICAvLy8gSW52YXJpYW50OiBbZWxlbWVudF0gbXVzdCBiZSBhIGRlY2xhcmF0aW9uIGVsZW1lbnQuCiAgU3RyaW5nIGdldEdlbmVyYXRlZENvZGUoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBqc0FzdC5wcmV0dHlQcmludChnZW5lcmF0ZWRDb2RlW2VsZW1lbnRdLAogICAgICAgIGVuYWJsZU1pbmlmaWNhdGlvbjogY29tcGlsZXIub3B0aW9ucy5lbmFibGVNaW5pZmljYXRpb24pOwogIH0KCiAgLy8vIEdlbmVyYXRlcyB0aGUgb3V0cHV0IGFuZCByZXR1cm5zIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBnZW5lcmF0ZWQgY29kZS4KICBpbnQgYXNzZW1ibGVQcm9ncmFtKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwgSW5mZXJyZWREYXRhIGluZmVycmVkRGF0YSkgewogICAgaW50IHByb2dyYW1TaXplID0gZW1pdHRlci5hc3NlbWJsZVByb2dyYW0obmFtZXIsIGNsb3NlZFdvcmxkLCBpbmZlcnJlZERhdGEpOwogICAgY2xvc2VkV29ybGQubm9TdWNoTWV0aG9kRGF0YS5lbWl0RGlhZ25vc3RpYyhyZXBvcnRlcik7CiAgICByZXR1cm4gcHJvZ3JhbVNpemU7CiAgfQoKICAvLy8gUmV0dXJucyBbOnRydWU6XSBpZiB0aGUgY2hlY2tpbmcgb2YgW3R5cGVdIGlzIHBlcmZvcm1lZCBkaXJlY3RseSBvbiB0aGUKICAvLy8gb2JqZWN0IGFuZCBub3Qgb24gYW4gaW50ZXJjZXB0b3IuCiAgYm9vbCBoYXNEaXJlY3RDaGVja0ZvcihDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywgRGFydFR5cGUgdHlwZSkgewogICAgaWYgKCF0eXBlLmlzSW50ZXJmYWNlVHlwZSkgcmV0dXJuIGZhbHNlOwogICAgSW50ZXJmYWNlVHlwZSBpbnRlcmZhY2VUeXBlID0gdHlwZTsKICAgIENsYXNzRW50aXR5IGVsZW1lbnQgPSBpbnRlcmZhY2VUeXBlLmVsZW1lbnQ7CiAgICByZXR1cm4gZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5zdHJpbmdDbGFzcyB8fAogICAgICAgIGVsZW1lbnQgPT0gY29tbW9uRWxlbWVudHMuYm9vbENsYXNzIHx8CiAgICAgICAgZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5udW1DbGFzcyB8fAogICAgICAgIGVsZW1lbnQgPT0gY29tbW9uRWxlbWVudHMuaW50Q2xhc3MgfHwKICAgICAgICBlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmRvdWJsZUNsYXNzIHx8CiAgICAgICAgZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5qc0FycmF5Q2xhc3MgfHwKICAgICAgICBlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmpzTXV0YWJsZUFycmF5Q2xhc3MgfHwKICAgICAgICBlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmpzRXh0ZW5kYWJsZUFycmF5Q2xhc3MgfHwKICAgICAgICBlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmpzRml4ZWRBcnJheUNsYXNzIHx8CiAgICAgICAgZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5qc1VubW9kaWZpYWJsZUFycmF5Q2xhc3M7CiAgfQoKICAvLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBbbGlicmFyeV0gYW5kIGl0cyBwYXJ0cyBoYXZlCiAgLy8vIGJlZW4gbG9hZGVkLgogIHZvaWQgc2V0QW5ub3RhdGlvbnMoTGlicmFyeUVudGl0eSBsaWJyYXJ5KSB7CiAgICBBbm5vdGF0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9CiAgICAgICAgY29tcGlsZXIuZnJvbnRlbmRTdHJhdGVneS5hbm5vdGF0aW9uUHJvY2Vzc29yOwogICAgaWYgKG1heWJlRW5hYmxlTmF0aXZlKGxpYnJhcnkuY2Fub25pY2FsVXJpKSkgewogICAgICBwcm9jZXNzb3IuZXh0cmFjdE5hdGl2ZUFubm90YXRpb25zKGxpYnJhcnkpOwogICAgfQogICAgcHJvY2Vzc29yLmV4dHJhY3RKc0ludGVyb3BBbm5vdGF0aW9ucyhsaWJyYXJ5KTsKICAgIFVyaSB1cmkgPSBsaWJyYXJ5LmNhbm9uaWNhbFVyaTsKICAgIGlmICh1cmkgPT0gVXJpcy5kYXJ0X2h0bWwpIHsKICAgICAgaHRtbExpYnJhcnlJc0xvYWRlZCA9IHRydWU7CiAgICB9CiAgfQoKICAvLy8gQ2FsbGVkIHdoZW4gdGhlIGNvbXBpbGVyIHN0YXJ0cyBydW5uaW5nIHRoZSBjb2RlZ2VuIGVucXVldWVyLiBUaGUKICAvLy8gW1dvcmxkSW1wYWN0XSBvZiBlbmFibGVkIGJhY2tlbmQgZmVhdHVyZXMgaXMgcmV0dXJuZWQuCiAgV29ybGRJbXBhY3Qgb25Db2RlZ2VuU3RhcnQoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBDb2RlZ2VuV29ybGRCdWlsZGVyIGNvZGVnZW5Xb3JsZEJ1aWxkZXIsIFNvcnRlciBzb3J0ZXIpIHsKICAgIGZ1bmN0aW9uQ29tcGlsZXIub25Db2RlZ2VuU3RhcnQoKTsKICAgIF9vbmVTaG90SW50ZXJjZXB0b3JEYXRhID0gbmV3IE9uZVNob3RJbnRlcmNlcHRvckRhdGEoCiAgICAgICAgY2xvc2VkV29ybGQuaW50ZXJjZXB0b3JEYXRhLCBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cyk7CiAgICBfbmFtZXIgPSBkZXRlcm1pbmVOYW1lcihjbG9zZWRXb3JsZCwgY29kZWdlbldvcmxkQnVpbGRlcik7CiAgICB0cmFjZXIgPSBuZXcgVHJhY2VyKGNsb3NlZFdvcmxkLCBuYW1lciwgY29tcGlsZXIub3V0cHV0UHJvdmlkZXIpOwogICAgX3J0aUVuY29kZXIgPSBfbmFtZXIucnRpRW5jb2RlciA9IG5ldyBSdW50aW1lVHlwZXNFbmNvZGVySW1wbCgKICAgICAgICBuYW1lciwKICAgICAgICBjbG9zZWRXb3JsZC5uYXRpdmVEYXRhLAogICAgICAgIGNsb3NlZFdvcmxkLmVsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgICBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cywKICAgICAgICBjbG9zZWRXb3JsZC5ydGlOZWVkKTsKICAgIGVtaXR0ZXIuY3JlYXRlRW1pdHRlcihuYW1lciwgY2xvc2VkV29ybGQsIGNvZGVnZW5Xb3JsZEJ1aWxkZXIsIHNvcnRlcik7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTaGFyZSB0aGUgaW1wYWN0IG9iamVjdCBjcmVhdGVkIGluCiAgICAvLyBjcmVhdGVDb2RlZ2VuRW5xdWV1ZXIuCiAgICBCYWNrZW5kSW1wYWN0cyBpbXBhY3RzID0gbmV3IEJhY2tlbmRJbXBhY3RzKGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzKTsKICAgIGlmIChjb21waWxlci5vcHRpb25zLmRpc2FibGVSdGlPcHRpbWl6YXRpb24pIHsKICAgICAgX3J0aVN1YnN0aXR1dGlvbnMgPSBuZXcgVHJpdmlhbFJ1bnRpbWVUeXBlc1N1YnN0aXR1dGlvbnMoY2xvc2VkV29ybGQpOwogICAgICBfcnRpQ2hlY2tzQnVpbGRlciA9CiAgICAgICAgICBuZXcgVHJpdmlhbFJ1bnRpbWVUeXBlc0NoZWNrc0J1aWxkZXIoY2xvc2VkV29ybGQsIF9ydGlTdWJzdGl0dXRpb25zKTsKICAgIH0gZWxzZSB7CiAgICAgIFJ1bnRpbWVUeXBlc0ltcGwgcnVudGltZVR5cGVzSW1wbCA9IG5ldyBSdW50aW1lVHlwZXNJbXBsKGNsb3NlZFdvcmxkKTsKICAgICAgX3J0aUNoZWNrc0J1aWxkZXIgPSBydW50aW1lVHlwZXNJbXBsOwogICAgICBfcnRpU3Vic3RpdHV0aW9ucyA9IHJ1bnRpbWVUeXBlc0ltcGw7CiAgICB9CgogICAgX2NvZGVnZW5JbXBhY3RUcmFuc2Zvcm1lciA9IG5ldyBDb2RlZ2VuSW1wYWN0VHJhbnNmb3JtZXIoCiAgICAgICAgY29tcGlsZXIub3B0aW9ucywKICAgICAgICBjbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQsCiAgICAgICAgY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMsCiAgICAgICAgaW1wYWN0cywKICAgICAgICBjbG9zZWRXb3JsZC5uYXRpdmVEYXRhLAogICAgICAgIGNsb3NlZFdvcmxkLmJhY2tlbmRVc2FnZSwKICAgICAgICBjbG9zZWRXb3JsZC5ydGlOZWVkLAogICAgICAgIG5hdGl2ZUNvZGVnZW5FbnF1ZXVlciwKICAgICAgICBuYW1lciwKICAgICAgICBvbmVTaG90SW50ZXJjZXB0b3JEYXRhLAogICAgICAgIHJ0aUNoZWNrc0J1aWxkZXIpOwogICAgcmV0dXJuIGNvbnN0IFdvcmxkSW1wYWN0KCk7CiAgfQoKICAvLy8gQ2FsbGVkIHdoZW4gY29kZSBnZW5lcmF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4KICB2b2lkIG9uQ29kZWdlbkVuZCgpIHsKICAgIHNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kub25Db21wbGV0ZSgpOwogICAgdHJhY2VyLmNsb3NlKCk7CiAgfQoKICAvLy8gRW5hYmxlIGNvbXBpbGF0aW9uIG9mIGNvZGUgd2l0aCBjb21waWxlIHRpbWUgZXJyb3JzLiBSZXR1cm5zIGB0cnVlYCBpZgogIC8vLyBzdXBwb3J0ZWQgYnkgdGhlIGJhY2tlbmQuCiAgYm9vbCBlbmFibGVDb2RlZ2VuV2l0aEVycm9yc0lmU3VwcG9ydGVkKFNwYW5uYWJsZSBub2RlKSA9PiB0cnVlOwoKICBqc0FzdC5FeHByZXNzaW9uIHJld3JpdGVBc3luYygKICAgICAgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIEpFbGVtZW50RW52aXJvbm1lbnQgZWxlbWVudEVudmlyb25tZW50LAogICAgICBDb2RlZ2VuUmVnaXN0cnkgcmVnaXN0cnksCiAgICAgIEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQsCiAgICAgIGpzQXN0LkV4cHJlc3Npb24gY29kZSwKICAgICAgRGFydFR5cGUgYXN5bmNUeXBlUGFyYW1ldGVyLAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBib2R5U291cmNlSW5mb3JtYXRpb24sCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIGV4aXRTb3VyY2VJbmZvcm1hdGlvbikgewogICAgaWYgKGVsZW1lbnQuYXN5bmNNYXJrZXIgPT0gQXN5bmNNYXJrZXIuU1lOQykgcmV0dXJuIGNvZGU7CgogICAgQXN5bmNSZXdyaXRlckJhc2UgcmV3cml0ZXIgPSBudWxsOwogICAganNBc3QuTmFtZSBuYW1lID0gbmFtZXIubWV0aG9kUHJvcGVydHlOYW1lKAogICAgICAgIGVsZW1lbnQgaXMgSkdlbmVyYXRvckJvZHkgPyBlbGVtZW50LmZ1bmN0aW9uIDogZWxlbWVudCk7CgogICAgc3dpdGNoIChlbGVtZW50LmFzeW5jTWFya2VyKSB7CiAgICAgIGNhc2UgQXN5bmNNYXJrZXIuQVNZTkM6CiAgICAgICAgcmV3cml0ZXIgPSBfbWFrZUFzeW5jUmV3cml0ZXIoY29tbW9uRWxlbWVudHMsIGVsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgICAgICAgcmVnaXN0cnksIGVsZW1lbnQsIGNvZGUsIGFzeW5jVHlwZVBhcmFtZXRlciwgbmFtZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQXN5bmNNYXJrZXIuU1lOQ19TVEFSOgogICAgICAgIHJld3JpdGVyID0gbmV3IFN5bmNTdGFyUmV3cml0ZXIocmVwb3J0ZXIsIGVsZW1lbnQsCiAgICAgICAgICAgIGVuZE9mSXRlcmF0aW9uOgogICAgICAgICAgICAgICAgZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2Vzcyhjb21tb25FbGVtZW50cy5lbmRPZkl0ZXJhdGlvbiksCiAgICAgICAgICAgIGl0ZXJhYmxlRmFjdG9yeTogZW1pdHRlcgogICAgICAgICAgICAgICAgLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGNvbW1vbkVsZW1lbnRzLnN5bmNTdGFySXRlcmFibGVGYWN0b3J5KSwKICAgICAgICAgICAgaXRlcmFibGVGYWN0b3J5VHlwZUFyZ3VtZW50czogX2ZldGNoSXRlbVR5cGUoYXN5bmNUeXBlUGFyYW1ldGVyKSwKICAgICAgICAgICAgeWllbGRTdGFyRXhwcmVzc2lvbjoKICAgICAgICAgICAgICAgIGVtaXR0ZXIuc3RhdGljRnVuY3Rpb25BY2Nlc3MoY29tbW9uRWxlbWVudHMueWllbGRTdGFyKSwKICAgICAgICAgICAgdW5jYXVnaHRFcnJvckV4cHJlc3Npb246IGVtaXR0ZXIKICAgICAgICAgICAgICAgIC5zdGF0aWNGdW5jdGlvbkFjY2Vzcyhjb21tb25FbGVtZW50cy5zeW5jU3RhclVuY2F1Z2h0RXJyb3IpLAogICAgICAgICAgICBzYWZlVmFyaWFibGVOYW1lOiBuYW1lci5zYWZlVmFyaWFibGVQcmVmaXhGb3JBc3luY1Jld3JpdGUsCiAgICAgICAgICAgIGJvZHlOYW1lOiBuYW1lci5kZXJpdmVBc3luY0JvZHlOYW1lKG5hbWUpKTsKICAgICAgICByZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN0YXRpY0ludm9rZSgKICAgICAgICAgICAgY29tbW9uRWxlbWVudHMuc3luY1N0YXJJdGVyYWJsZUZhY3RvcnksCiAgICAgICAgICAgIGNvbnN0IENhbGxTdHJ1Y3R1cmUudW5uYW1lZCgxLCAxKSwgWwogICAgICAgICAgZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uQXN5bmNPclN5bmNTdGFyRWxlbWVudFR5cGUoZWxlbWVudCkKICAgICAgICBdKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQXN5bmNNYXJrZXIuQVNZTkNfU1RBUjoKICAgICAgICByZXdyaXRlciA9IG5ldyBBc3luY1N0YXJSZXdyaXRlcihyZXBvcnRlciwgZWxlbWVudCwKICAgICAgICAgICAgYXN5bmNTdGFySGVscGVyOgogICAgICAgICAgICAgICAgZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2Vzcyhjb21tb25FbGVtZW50cy5hc3luY1N0YXJIZWxwZXIpLAogICAgICAgICAgICBzdHJlYW1PZkNvbnRyb2xsZXI6CiAgICAgICAgICAgICAgICBlbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGNvbW1vbkVsZW1lbnRzLnN0cmVhbU9mQ29udHJvbGxlciksCiAgICAgICAgICAgIHdyYXBCb2R5OiBlbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGNvbW1vbkVsZW1lbnRzLndyYXBCb2R5KSwKICAgICAgICAgICAgbmV3Q29udHJvbGxlcjogZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2VzcygKICAgICAgICAgICAgICAgIGNvbW1vbkVsZW1lbnRzLmFzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJGYWN0b3J5KSwKICAgICAgICAgICAgbmV3Q29udHJvbGxlclR5cGVBcmd1bWVudHM6IF9mZXRjaEl0ZW1UeXBlKGFzeW5jVHlwZVBhcmFtZXRlciksCiAgICAgICAgICAgIHNhZmVWYXJpYWJsZU5hbWU6IG5hbWVyLnNhZmVWYXJpYWJsZVByZWZpeEZvckFzeW5jUmV3cml0ZSwKICAgICAgICAgICAgeWllbGRFeHByZXNzaW9uOgogICAgICAgICAgICAgICAgZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2Vzcyhjb21tb25FbGVtZW50cy55aWVsZFNpbmdsZSksCiAgICAgICAgICAgIHlpZWxkU3RhckV4cHJlc3Npb246CiAgICAgICAgICAgICAgICBlbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGNvbW1vbkVsZW1lbnRzLnlpZWxkU3RhciksCiAgICAgICAgICAgIGJvZHlOYW1lOiBuYW1lci5kZXJpdmVBc3luY0JvZHlOYW1lKG5hbWUpKTsKICAgICAgICByZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN0YXRpY0ludm9rZSgKICAgICAgICAgICAgY29tbW9uRWxlbWVudHMuYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckZhY3RvcnksCiAgICAgICAgICAgIGNvbnN0IENhbGxTdHJ1Y3R1cmUudW5uYW1lZCgxLCAxKSwgWwogICAgICAgICAgZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uQXN5bmNPclN5bmNTdGFyRWxlbWVudFR5cGUoZWxlbWVudCkKICAgICAgICBdKSk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gcmV3cml0ZXIucmV3cml0ZShjb2RlLCBib2R5U291cmNlSW5mb3JtYXRpb24sIGV4aXRTb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICAvLy8gUmV0dXJucyBhbiBvcHRpb25hbCBleHByZXNzaW9uIHRoYXQgZXZhbHVhdGVzIFt0eXBlXS4gIFJldHVybnMgYG51bGxgIGlmCiAgLy8vIHRoZSB0eXBlIGV4cHJlc3Npb24gaXMgZGV0ZXJtaW5lZCBieSB0aGUgb3V0c2lkZSBjb250ZXh0IGFuZCBzaG91bGQgYmUKICAvLy8gYWRkZWQgYXMgYSBmdW5jdGlvbiBwYXJhbWV0ZXIgdG8gdGhlIHJld3JpdHRlbiBjb2RlLgogIC8vIFRPRE8oc3JhKTogV2UgY291bGQgYWxzbyByZXR1cm4gYW4gZW1wdHkgbGlzdCBpZiB0aGUgZ2VuZXJhdG9yIHRha2VzIG5vCiAgLy8gdHlwZSAoZS5nLiBkdWUgdG8gcnRpTmVlZCBvcHRpbWl6YXRpb24pLgogIExpc3Q8anNBc3QuRXhwcmVzc2lvbj4gX2ZldGNoSXRlbVR5cGUoRGFydFR5cGUgdHlwZSkgewogICAgaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICB2YXIgYXN0ID0gcnRpRW5jb2Rlci5nZXRUeXBlUmVwcmVzZW50YXRpb24oZW1pdHRlci5lbWl0dGVyLCB0eXBlLCBudWxsKTsKICAgIHJldHVybiA8anNBc3QuRXhwcmVzc2lvbj5bYXN0XTsKICB9CgogIEFzeW5jUmV3cml0ZXIgX21ha2VBc3luY1Jld3JpdGVyKAogICAgICBDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgICAgSkVsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQsCiAgICAgIENvZGVnZW5SZWdpc3RyeSByZWdpc3RyeSwKICAgICAgRnVuY3Rpb25FbnRpdHkgZWxlbWVudCwKICAgICAganNBc3QuRXhwcmVzc2lvbiBjb2RlLAogICAgICBEYXJ0VHlwZSBlbGVtZW50VHlwZSwKICAgICAganNBc3QuTmFtZSBuYW1lKSB7CiAgICB2YXIgc3RhcnRGdW5jdGlvbiA9IGNvbW1vbkVsZW1lbnRzLmFzeW5jSGVscGVyU3RhcnRTeW5jOwogICAgdmFyIGNvbXBsZXRlckZhY3RvcnkgPSBjb21tb25FbGVtZW50cy5hc3luY0F3YWl0Q29tcGxldGVyRmFjdG9yeTsKCiAgICBMaXN0PGpzQXN0LkV4cHJlc3Npb24+IGl0ZW1UeXBlRXhwcmVzc2lvbiA9IF9mZXRjaEl0ZW1UeXBlKGVsZW1lbnRUeXBlKTsKCiAgICB2YXIgcmV3cml0ZXIgPSBuZXcgQXN5bmNSZXdyaXRlcihyZXBvcnRlciwgZWxlbWVudCwKICAgICAgICBhc3luY1N0YXJ0OiBlbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKHN0YXJ0RnVuY3Rpb24pLAogICAgICAgIGFzeW5jQXdhaXQ6CiAgICAgICAgICAgIGVtaXR0ZXIuc3RhdGljRnVuY3Rpb25BY2Nlc3MoY29tbW9uRWxlbWVudHMuYXN5bmNIZWxwZXJBd2FpdCksCiAgICAgICAgYXN5bmNSZXR1cm46CiAgICAgICAgICAgIGVtaXR0ZXIuc3RhdGljRnVuY3Rpb25BY2Nlc3MoY29tbW9uRWxlbWVudHMuYXN5bmNIZWxwZXJSZXR1cm4pLAogICAgICAgIGFzeW5jUmV0aHJvdzoKICAgICAgICAgICAgZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2Vzcyhjb21tb25FbGVtZW50cy5hc3luY0hlbHBlclJldGhyb3cpLAogICAgICAgIHdyYXBCb2R5OiBlbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGNvbW1vbkVsZW1lbnRzLndyYXBCb2R5KSwKICAgICAgICBjb21wbGV0ZXJGYWN0b3J5OiBlbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGNvbXBsZXRlckZhY3RvcnkpLAogICAgICAgIGNvbXBsZXRlckZhY3RvcnlUeXBlQXJndW1lbnRzOiBpdGVtVHlwZUV4cHJlc3Npb24sCiAgICAgICAgc2FmZVZhcmlhYmxlTmFtZTogbmFtZXIuc2FmZVZhcmlhYmxlUHJlZml4Rm9yQXN5bmNSZXdyaXRlLAogICAgICAgIGJvZHlOYW1lOiBuYW1lci5kZXJpdmVBc3luY0JvZHlOYW1lKG5hbWUpKTsKCiAgICByZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN0YXRpY0ludm9rZSgKICAgICAgICBjb21wbGV0ZXJGYWN0b3J5LAogICAgICAgIGNvbnN0IENhbGxTdHJ1Y3R1cmUudW5uYW1lZCgwLCAxKSwKICAgICAgICBbZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uQXN5bmNPclN5bmNTdGFyRWxlbWVudFR5cGUoZWxlbWVudCldKSk7CgogICAgcmV0dXJuIHJld3JpdGVyOwogIH0KCiAgLy8vIENyZWF0ZXMgYW4gaW1wYWN0IHN0cmF0ZWd5IHRvIHVzZSBmb3IgY29tcGlsYXRpb24uCiAgSW1wYWN0U3RyYXRlZ3kgY3JlYXRlSW1wYWN0U3RyYXRlZ3koCiAgICAgIHtib29sIHN1cHBvcnREZWZlcnJlZExvYWQ6IHRydWUsIGJvb2wgc3VwcG9ydER1bXBJbmZvOiB0cnVlfSkgewogICAgcmV0dXJuIG5ldyBKYXZhU2NyaXB0SW1wYWN0U3RyYXRlZ3koCiAgICAgICAgaW1wYWN0Q2FjaGVEZWxldGVyLCBjb21waWxlci5kdW1wSW5mb1Rhc2ssCiAgICAgICAgc3VwcG9ydERlZmVycmVkTG9hZDogc3VwcG9ydERlZmVycmVkTG9hZCwKICAgICAgICBzdXBwb3J0RHVtcEluZm86IHN1cHBvcnREdW1wSW5mbyk7CiAgfQoKICBFbnF1ZXVlVGFzayBtYWtlRW5xdWV1ZXIoKSA9PiBuZXcgRW5xdWV1ZVRhc2soY29tcGlsZXIpOwp9CgpjbGFzcyBKYXZhU2NyaXB0SW1wYWN0U3RyYXRlZ3kgZXh0ZW5kcyBJbXBhY3RTdHJhdGVneSB7CiAgZmluYWwgSW1wYWN0Q2FjaGVEZWxldGVyIGltcGFjdENhY2hlRGVsZXRlcjsKICBmaW5hbCBEdW1wSW5mb1Rhc2sgZHVtcEluZm9UYXNrOwogIGZpbmFsIGJvb2wgc3VwcG9ydERlZmVycmVkTG9hZDsKICBmaW5hbCBib29sIHN1cHBvcnREdW1wSW5mbzsKCiAgSmF2YVNjcmlwdEltcGFjdFN0cmF0ZWd5KHRoaXMuaW1wYWN0Q2FjaGVEZWxldGVyLCB0aGlzLmR1bXBJbmZvVGFzaywKICAgICAge3RoaXMuc3VwcG9ydERlZmVycmVkTG9hZCwgdGhpcy5zdXBwb3J0RHVtcEluZm99KTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEltcGFjdCh2YXIgaW1wYWN0U291cmNlLCBXb3JsZEltcGFjdCBpbXBhY3QsCiAgICAgIFdvcmxkSW1wYWN0VmlzaXRvciB2aXNpdG9yLCBJbXBhY3RVc2VDYXNlIGltcGFjdFVzZSkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ29tcHV0ZSB0aGUgYXBwbGljYXRpb24gc3RyYXRlZ3kgb25jZSBmb3IgZWFjaCB1c2UuCiAgICBpZiAoaW1wYWN0VXNlID09IFJlc29sdXRpb25FbnF1ZXVlci5JTVBBQ1RfVVNFKSB7CiAgICAgIGlmIChzdXBwb3J0RGVmZXJyZWRMb2FkKSB7CiAgICAgICAgaW1wYWN0LmFwcGx5KHZpc2l0b3IpOwogICAgICB9IGVsc2UgewogICAgICAgIGltcGFjdC5hcHBseSh2aXNpdG9yKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChpbXBhY3RVc2UgPT0gRGVmZXJyZWRMb2FkVGFzay5JTVBBQ1RfVVNFKSB7CiAgICAgIGltcGFjdC5hcHBseSh2aXNpdG9yKTsKICAgICAgLy8gSW1wYWN0cyBhcmUgdW5jYWNoZWQgZ2xvYmFsbHkgaW4gW29uSW1wYWN0VXNlZF0uCiAgICB9IGVsc2UgaWYgKGltcGFjdFVzZSA9PSBEdW1wSW5mb1Rhc2suSU1QQUNUX1VTRSkgewogICAgICBpbXBhY3QuYXBwbHkodmlzaXRvcik7CiAgICAgIGR1bXBJbmZvVGFzay51bnJlZ2lzdGVySW1wYWN0KGltcGFjdFNvdXJjZSk7CiAgICB9IGVsc2UgewogICAgICBpbXBhY3QuYXBwbHkodmlzaXRvcik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIG9uSW1wYWN0VXNlZChJbXBhY3RVc2VDYXNlIGltcGFjdFVzZSkgewogICAgaWYgKGltcGFjdFVzZSA9PSBEZWZlcnJlZExvYWRUYXNrLklNUEFDVF9VU0UpIHsKICAgICAgaW1wYWN0Q2FjaGVEZWxldGVyLmVtcHR5Q2FjaGUoKTsKICAgIH0KICB9Cn0KCmNsYXNzIFN1cGVyTWVtYmVyRGF0YSB7CiAgLy8vIEEgc2V0IG9mIG1lbWJlciB0aGF0IGFyZSBjYWxsZWQgZnJvbSBzdWJjbGFzc2VzIHZpYSBgc3VwZXJgLgogIGZpbmFsIFNldDxNZW1iZXJFbnRpdHk+IF9hbGlhc2VkU3VwZXJNZW1iZXJzID0gbmV3IFNldGxldDxNZW1iZXJFbnRpdHk+KCk7CgogIC8vLyBSZWNvcmQgdGhhdCBbbWVtYmVyXSBpcyBjYWxsZWQgZnJvbSBhIHN1YmNsYXNzIHZpYSBgc3VwZXJgLgogIGJvb2wgbWF5YmVSZWdpc3RlckFsaWFzZWRTdXBlck1lbWJlcihNZW1iZXJFbnRpdHkgbWVtYmVyLCBTZWxlY3RvciBzZWxlY3RvcikgewogICAgaWYgKCFjYW5Vc2VBbGlhc2VkU3VwZXJNZW1iZXIobWVtYmVyLCBzZWxlY3RvcikpIHsKICAgICAgLy8gSW52b2tpbmcgYSBzdXBlciBnZXR0ZXIgaXNuJ3Qgc3VwcG9ydGVkLCB0aGlzIHdvdWxkIHJlcXVpcmUgY2hhbmdlcyB0bwogICAgICAvLyBjb21wYWN0IGZpZWxkIGRlc2NyaXB0b3JzIGluIHRoZSBlbWl0dGVyLgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBfYWxpYXNlZFN1cGVyTWVtYmVycy5hZGQobWVtYmVyKTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgYm9vbCBjYW5Vc2VBbGlhc2VkU3VwZXJNZW1iZXIoTWVtYmVyRW50aXR5IG1lbWJlciwgU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgIHJldHVybiAhc2VsZWN0b3IuaXNHZXR0ZXI7CiAgfQoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW21lbWJlcl0gaXMgY2FsbGVkIGZyb20gYSBzdWJjbGFzcyB2aWEgYHN1cGVyYC4KICBib29sIGlzQWxpYXNlZFN1cGVyTWVtYmVyKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIHJldHVybiBfYWxpYXNlZFN1cGVyTWVtYmVycy5jb250YWlucyhtZW1iZXIpOwogIH0KfQqD1ABOTjwBHAEZPEcpMSFCKTYuJCFJJCEnNyEgJCM9MCghMxk9Ki4xMi4pJ0kcKh4bHh0kICsoGCIdIBUbJyMdASIZATREOgEWAgEDD0ZJBBwiJ1EjNz03TSw5IwE0JgFNATlAJAhBIQgEAUwGSy4yBAFQQjcmBAE6Hz43LgEcT09BTzcbBgEWGh0YARctTEoXAS0vGRcIDRodLS0YARcvSU4XARkXCAYBHREEAUQ3MQEfHgYBFh0dGhdNHQEXUCBIEQEtRhEBLS8ZGREIDR0dLS0aF00dARcvMhEBGRkRCAYEAU03MQEfHgYBFh0tLxkaF00dAS0XNhEBHRkRCA0dGRoXTR0BF1EZRhEBL09ONkYRAS0tHRkRCAYEATE3JgQBMzcyBAIBHRUPRQcCARohMUFLPQEbAUYBJQEbATs8KgEQARQbTRMEAUtMASE4GRMEAS8BLwEjATAkAUIoRgE/KEABIQE+LQFOJDUBPCcBNgFINwEsQTIsASoBQQE2MAERASMlJiUpQEZOG0A0QDlRMD0EATgBTAFAAUIoSgwzKEwuBAE/KEQMMChJKwQBNgwpKEMkBAEzDCMoRQwzKD8eBAFRATMMIyhFHgQBJwwdKDsYBAFEAUwRLTQEARhLLy1IQDcEATYmKktII0tCURYOQBQhTi84CAQBQx1OT0YoRChOATM9PzM2BAE4G0Y+BAEvLiw2TlEtQ0E+GhwYLU1FThwYGR9EUDJBORocGBEZIx4qGCA0KEI0JiMOGhsoHiAcFR0kIiIuJxwoQB0gJCIcHCciJC0jG0MdICQfIh4EAUopGRkgO0xAQUhFOBocGB8RJyEgDho8JBlGIVAlIBwVJiErJQQBOwFGOyk4IkhNGkE9K0wfRyIGIUw/IgYBGU0cMDNCCCkGIEJFBjg8QBgEAUUhAUYBQgY6MjVCBAFNTVE7GAQBTihJLSgxNC8uLjEyOTw3PAQBTxMvJDczMwY0JCEiBgQBSD03QCc6Qj9GQw8gKCQeTD8eTTNNGlANTSwsBgE+GigkESAiHR8PIBsgBAE2GCwUBAFNIEMBISUuIB4dIy8xPgEnMEEBIx5KQA8iOxxNJU9OIUgtTUc4PzQxTA0PIzwdTiBRTTlCTEcdSiFIOD89MUwNDwZRBAFPTTtNLjkjTSQEASQlLiAeHRwZPUYBTQE4QRRLFUwWTUlKO0M0ATsaK08BFQQBOSdGKTMyKwQBOwIBOC8jIh4BRzkBDDk9UDYhHw8fCDsdOjcdMw0dBgQBDC80JwYEAgEYQ00BQlE3UDMUBiYRBAFKHwQBSDMyBAIBLHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvYmFja2VuZC5kYXJ0O3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2JhY2tlbmQvaW5mZXJyZWRfZGF0YS5kYXJ0rawvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nIHNob3cgUXVldWU7CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci9hYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydCc7CmltcG9ydCAnLi4vc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NpZGVfZWZmZWN0cy5kYXJ0JzsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JzsKaW1wb3J0ICdhbm5vdGF0aW9ucy5kYXJ0JzsKCmFic3RyYWN0IGNsYXNzIEluZmVycmVkRGF0YSB7CiAgLy8vIERlc2VyaWFsaXplcyBhIFtJbmZlcnJlZERhdGFdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgSW5mZXJyZWREYXRhLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgRGF0YVNvdXJjZSBzb3VyY2UsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgYm9vbCBpc1RyaXZpYWwgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGlmIChpc1RyaXZpYWwpIHsKICAgICAgcmV0dXJuIG5ldyBUcml2aWFsSW5mZXJyZWREYXRhKCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IEluZmVycmVkRGF0YUltcGwucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSwgY2xvc2VkV29ybGQpOwogICAgfQogIH0KCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbSW5mZXJyZWREYXRhXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luayk7CgogIC8vLyBSZXR1cm5zIHRoZSBzaWRlIGVmZmVjdHMgb2YgZXhlY3V0aW5nIFtlbGVtZW50XS4KICBTaWRlRWZmZWN0cyBnZXRTaWRlRWZmZWN0c09mRWxlbWVudChGdW5jdGlvbkVudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybnMgdGhlIHNpZGUgZWZmZWN0cyBvZiBjYWxsaW5nIFtzZWxlY3Rvcl0gb24gdGhlIFtyZWNlaXZlcl0uCiAgU2lkZUVmZmVjdHMgZ2V0U2lkZUVmZmVjdHNPZlNlbGVjdG9yKAogICAgICBTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSByZWNlaXZlcik7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbZWxlbWVudF0gaXMgZ3VhcmFudGVlZCBub3QgdG8gdGhyb3cgYW4gZXhjZXB0aW9uLgogIGJvb2wgZ2V0Q2Fubm90VGhyb3coRnVuY3Rpb25FbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbZWxlbWVudF0gaXMgY2FsbGVkIGluIGEgbG9vcC4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBJcyB0aGlzICdwb3RlbnRpYWxseSBjYWxsZWQnIG9yICdrbm93biB0byBiZSBjYWxsZWQnPwogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENoYW5nZSBbTWVtYmVyRW50aXR5XSB0byBbRnVuY3Rpb25FbnRpdHldLgogIGJvb2wgaXNDYWxsZWRJbkxvb3AoTWVtYmVyRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2VsZW1lbnRdIG1pZ2h0IGJlIHBhc3NlZCB0byBgRnVuY3Rpb24uYXBwbHlgLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IElzIHRoaXMgJ3Bhc3NlZCBpbnZvY2F0aW9uIHRhcmdldGAgb3IKICAvLyBgcGFzc2VkIGFzIGFyZ3VtZW50YD8KICBib29sIGdldE1pZ2h0QmVQYXNzZWRUb0FwcGx5KEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpOwp9CgphYnN0cmFjdCBjbGFzcyBJbmZlcnJlZERhdGFCdWlsZGVyIHsKICAvLy8gUmVnaXN0ZXJzIHRoZSBleGVjdXRpbmcgb2YgW2VsZW1lbnRdIGFzIHdpdGhvdXQgc2lkZSBlZmZlY3RzLgogIHZvaWQgcmVnaXN0ZXJTaWRlRWZmZWN0c0ZyZWUoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZXR1cm5zIHRoZSBbU2lkZUVmZmVjdEJ1aWxkZXJdIGFzc29jaWF0ZWQgd2l0aCBbZWxlbWVudF0uCiAgU2lkZUVmZmVjdHNCdWlsZGVyIGdldFNpZGVFZmZlY3RzQnVpbGRlcihGdW5jdGlvbkVudGl0eSBtZW1iZXIpOwoKICAvLy8gUmVnaXN0ZXJzIHRoYXQgW2VsZW1lbnRdIG1pZ2h0IGJlIHBhc3NlZCB0byBgRnVuY3Rpb24uYXBwbHlgLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IElzIHRoaXMgJ3Bhc3NlZCBpbnZvY2F0aW9uIHRhcmdldGAgb3IKICAvLyBgcGFzc2VkIGFzIGFyZ3VtZW50YD8KICB2b2lkIHJlZ2lzdGVyTWlnaHRCZVBhc3NlZFRvQXBwbHkoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbZWxlbWVudF0gbWlnaHQgYmUgcGFzc2VkIHRvIGBGdW5jdGlvbi5hcHBseWAgZ2l2ZW4gdGhlCiAgLy8vIGN1cnJlbnRseSBpbmZlcnJlZCBpbmZvcm1hdGlvbi4KICBib29sIGdldEN1cnJlbnRseUtub3duTWlnaHRCZVBhc3NlZFRvQXBwbHkoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZWdpc3RlcnMgdGhhdCBbZWxlbWVudF0gaXMgY2FsbGVkIGluIGEgbG9vcC4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBJcyB0aGlzICdwb3RlbnRpYWxseSBjYWxsZWQnIG9yICdrbm93biB0byBiZSBjYWxsZWQnPwogIHZvaWQgYWRkRnVuY3Rpb25DYWxsZWRJbkxvb3AoTWVtYmVyRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmVnaXN0ZXJzIHRoYXQgW2VsZW1lbnRdIGlzIGd1YXJhbnRlZWQgbm90IHRvIHRocm93IGFuIGV4Y2VwdGlvbi4KICB2b2lkIHJlZ2lzdGVyQ2Fubm90VGhyb3coRnVuY3Rpb25FbnRpdHkgZWxlbWVudCk7CgogIC8vLyBDcmVhdGUgYSBbSW5mZXJyZWREYXRhXSBvYmplY3QgZm9yIHRoZSBjb2xsZWN0ZWQgaW5mb3JtYXRpb24uCiAgSW5mZXJyZWREYXRhIGNsb3NlKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCk7Cn0KCmNsYXNzIEluZmVycmVkRGF0YUltcGwgaW1wbGVtZW50cyBJbmZlcnJlZERhdGEgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbSW5mZXJyZWREYXRhXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2luZmVycmVkLWRhdGEnOwoKICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwogIGZpbmFsIFNldDxNZW1iZXJFbnRpdHk+IF9mdW5jdGlvbnNDYWxsZWRJbkxvb3A7CiAgZmluYWwgTWFwPEZ1bmN0aW9uRW50aXR5LCBTaWRlRWZmZWN0cz4gX3NpZGVFZmZlY3RzOwoKICBmaW5hbCBTZXQ8RnVuY3Rpb25FbnRpdHk+IF9zaWRlRWZmZWN0c0ZyZWVFbGVtZW50czsKCiAgZmluYWwgU2V0PEZ1bmN0aW9uRW50aXR5PiBfZWxlbWVudHNUaGF0Q2Fubm90VGhyb3c7CgogIGZpbmFsIFNldDxGdW5jdGlvbkVudGl0eT4gX2Z1bmN0aW9uc1RoYXRNaWdodEJlUGFzc2VkVG9BcHBseTsKCiAgSW5mZXJyZWREYXRhSW1wbCgKICAgICAgdGhpcy5fY2xvc2VkV29ybGQsCiAgICAgIHRoaXMuX2Z1bmN0aW9uc0NhbGxlZEluTG9vcCwKICAgICAgdGhpcy5fc2lkZUVmZmVjdHMsCiAgICAgIHRoaXMuX3NpZGVFZmZlY3RzRnJlZUVsZW1lbnRzLAogICAgICB0aGlzLl9lbGVtZW50c1RoYXRDYW5ub3RUaHJvdywKICAgICAgdGhpcy5fZnVuY3Rpb25zVGhhdE1pZ2h0QmVQYXNzZWRUb0FwcGx5KTsKCiAgZmFjdG9yeSBJbmZlcnJlZERhdGFJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgRGF0YVNvdXJjZSBzb3VyY2UsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBTZXQ8TWVtYmVyRW50aXR5PiBmdW5jdGlvbnNDYWxsZWRJbkxvb3AgPSBzb3VyY2UucmVhZE1lbWJlcnMoKS50b1NldCgpOwogICAgTWFwPEZ1bmN0aW9uRW50aXR5LCBTaWRlRWZmZWN0cz4gc2lkZUVmZmVjdHMgPQogICAgICAgIHNvdXJjZS5yZWFkTWVtYmVyTWFwKCgpID0+IG5ldyBTaWRlRWZmZWN0cy5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKSk7CiAgICBTZXQ8RnVuY3Rpb25FbnRpdHk+IHNpZGVFZmZlY3RzRnJlZUVsZW1lbnRzID0KICAgICAgICBzb3VyY2UucmVhZE1lbWJlcnM8RnVuY3Rpb25FbnRpdHk+KCkudG9TZXQoKTsKICAgIFNldDxGdW5jdGlvbkVudGl0eT4gZWxlbWVudHNUaGF0Q2Fubm90VGhyb3cgPQogICAgICAgIHNvdXJjZS5yZWFkTWVtYmVyczxGdW5jdGlvbkVudGl0eT4oKS50b1NldCgpOwogICAgU2V0PEZ1bmN0aW9uRW50aXR5PiBmdW5jdGlvbnNUaGF0TWlnaHRCZVBhc3NlZFRvQXBwbHkgPQogICAgICAgIHNvdXJjZS5yZWFkTWVtYmVyczxGdW5jdGlvbkVudGl0eT4oKS50b1NldCgpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBJbmZlcnJlZERhdGFJbXBsKAogICAgICAgIGNsb3NlZFdvcmxkLAogICAgICAgIGZ1bmN0aW9uc0NhbGxlZEluTG9vcCwKICAgICAgICBzaWRlRWZmZWN0cywKICAgICAgICBzaWRlRWZmZWN0c0ZyZWVFbGVtZW50cywKICAgICAgICBlbGVtZW50c1RoYXRDYW5ub3RUaHJvdywKICAgICAgICBmdW5jdGlvbnNUaGF0TWlnaHRCZVBhc3NlZFRvQXBwbHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUJvb2woZmFsc2UpOyAvLyBJcyBfbm90XyB0cml2aWFsLgogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZU1lbWJlcnMoX2Z1bmN0aW9uc0NhbGxlZEluTG9vcCk7CiAgICBzaW5rLndyaXRlTWVtYmVyTWFwKF9zaWRlRWZmZWN0cywKICAgICAgICAoU2lkZUVmZmVjdHMgc2lkZUVmZmVjdHMpID0+IHNpZGVFZmZlY3RzLndyaXRlVG9EYXRhU2luayhzaW5rKSk7CiAgICBzaW5rLndyaXRlTWVtYmVycyhfc2lkZUVmZmVjdHNGcmVlRWxlbWVudHMpOwogICAgc2luay53cml0ZU1lbWJlcnMoX2VsZW1lbnRzVGhhdENhbm5vdFRocm93KTsKICAgIHNpbmsud3JpdGVNZW1iZXJzKF9mdW5jdGlvbnNUaGF0TWlnaHRCZVBhc3NlZFRvQXBwbHkpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIFNpZGVFZmZlY3RzIGdldFNpZGVFZmZlY3RzT2ZTZWxlY3RvcigKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXIpIHsKICAgIC8vIFdlJ3JlIG5vdCB0cmFja2luZyBzaWRlIGVmZmVjdHMgb2YgY2xvc3VyZXMuCiAgICBpZiAoc2VsZWN0b3IuaXNDbG9zdXJlQ2FsbCB8fAogICAgICAgIF9jbG9zZWRXb3JsZC5pbmNsdWRlc0Nsb3N1cmVDYWxsKHNlbGVjdG9yLCByZWNlaXZlcikpIHsKICAgICAgcmV0dXJuIG5ldyBTaWRlRWZmZWN0cygpOwogICAgfQogICAgU2lkZUVmZmVjdHMgc2lkZUVmZmVjdHMgPSBuZXcgU2lkZUVmZmVjdHMuZW1wdHkoKTsKICAgIGZvciAoTWVtYmVyRW50aXR5IGUgaW4gX2Nsb3NlZFdvcmxkLmxvY2F0ZU1lbWJlcnMoc2VsZWN0b3IsIHJlY2VpdmVyKSkgewogICAgICBpZiAoZS5pc0ZpZWxkKSB7CiAgICAgICAgaWYgKHNlbGVjdG9yLmlzR2V0dGVyKSB7CiAgICAgICAgICBpZiAoIV9jbG9zZWRXb3JsZC5maWVsZE5ldmVyQ2hhbmdlcyhlKSkgewogICAgICAgICAgICBzaWRlRWZmZWN0cy5zZXREZXBlbmRzT25JbnN0YW5jZVByb3BlcnR5U3RvcmUoKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmlzU2V0dGVyKSB7CiAgICAgICAgICBzaWRlRWZmZWN0cy5zZXRDaGFuZ2VzSW5zdGFuY2VQcm9wZXJ0eSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhc3NlcnQoc2VsZWN0b3IuaXNDYWxsKTsKICAgICAgICAgIHNpZGVFZmZlY3RzLnNldEFsbFNpZGVFZmZlY3RzKCk7CiAgICAgICAgICBzaWRlRWZmZWN0cy5zZXREZXBlbmRzT25Tb21ldGhpbmcoKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2lkZUVmZmVjdHMuYWRkKGdldFNpZGVFZmZlY3RzT2ZFbGVtZW50KGUpKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNpZGVFZmZlY3RzOwogIH0KCiAgQG92ZXJyaWRlCiAgU2lkZUVmZmVjdHMgZ2V0U2lkZUVmZmVjdHNPZkVsZW1lbnQoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgewogICAgYXNzZXJ0KF9zaWRlRWZmZWN0cyAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsICJTaWRlIGVmZmVjdHMgaGF2ZSBub3QgYmVlbiBjb21wdXRlZCB5ZXQuIikpOwogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ2hlY2sgdGhhdCBbX21ha2VTaWRlRWZmZWN0c10gaXMgb25seSBjYWxsZWQgaWYKICAgIC8vIHR5cGUgaW5mZXJlbmNlIGhhcyBiZWVuIGRpc2FibGVkIChleHBsaWNpdGx5IG9yIGJlY2F1c2Ugb2YgY29tcGlsZSB0aW1lCiAgICAvLyBlcnJvcnMpLgogICAgcmV0dXJuIF9zaWRlRWZmZWN0cy5wdXRJZkFic2VudChlbGVtZW50LCBfbWFrZVNpZGVFZmZlY3RzKTsKICB9CgogIHN0YXRpYyBTaWRlRWZmZWN0cyBfbWFrZVNpZGVFZmZlY3RzKCkgPT4gbmV3IFNpZGVFZmZlY3RzKCk7CgogIEBvdmVycmlkZQogIGJvb2wgaXNDYWxsZWRJbkxvb3AoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBfZnVuY3Rpb25zQ2FsbGVkSW5Mb29wLmNvbnRhaW5zKGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXRDYW5ub3RUaHJvdyhGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gX2VsZW1lbnRzVGhhdENhbm5vdFRocm93LmNvbnRhaW5zKGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXRNaWdodEJlUGFzc2VkVG9BcHBseShGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICAvLyBXZSBhc3N1bWUgYWxsIGZ1bmN0aW9ucyByZWFjaCBGdW5jdGlvbi5hcHBseSBpZiBubyBmdW5jdGlvbnMgYXJlCiAgICAvLyByZWdpc3RlcmVkIHNvLiAgV2UgZ2V0IGFuIGVtcHR5IHNldCBpbiB0d28gY2lyY3Vtc3RhbmNlcyAoMSkgYSB0cml2aWFsCiAgICAvLyBwcm9ncmFtIGFuZCAoMikgd2hlbiBjb21waWxpbmcgd2l0aG91dCB0eXBlIGluZmVyZW5jZQogICAgLy8gKGkuZS4gLS1kaXNhYmxlLXR5cGUtaW5mZXJlbmNlKS4gUmV0dXJuaW5nIGB0cnVlYCBoYXMgY29uc2VxdWVuY2VzIChleHRyYQogICAgLy8gbWV0YWRhdGEgZm9yIEZ1bmN0aW9uLmFwcGx5KSBvbmx5IHdoZW4gRnVuY3Rpb24uYXBwbHkgaXMgYWxzbyBwYXJ0IG9mIHRoZQogICAgLy8gcHJvZ3JhbS4gSXQgaXMgYW4gdW51c3VhbCB0cml2aWFsIHByb2dyYW0gdGhhdCBpbmNsdWRlcyBGdW5jdGlvbi5hcHBseQogICAgLy8gYnV0IGRvZXMgbm90IGNhbGwgaXQgb24gYSBmdW5jdGlvbi4KICAgIC8vCiAgICAvLyBUT0RPKHNyYSk6IFdlIHNob3VsZCByZXZlcnNlIHRoZSBzZW5zZSBvZiB0aGlzIHNldCBhbmQgcmVnaXN0ZXIgZnVuY3Rpb25zCiAgICAvLyB0aGF0IHdlIGhhdmUgcHJvdmVuIGRvIG5vdCByZWFjaCBGdW5jdGlvbi5hcHBseS4KICAgIGlmIChfZnVuY3Rpb25zVGhhdE1pZ2h0QmVQYXNzZWRUb0FwcGx5LmlzRW1wdHkpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIF9mdW5jdGlvbnNUaGF0TWlnaHRCZVBhc3NlZFRvQXBwbHkuY29udGFpbnMoZWxlbWVudCk7CiAgfQp9CgpjbGFzcyBJbmZlcnJlZERhdGFCdWlsZGVySW1wbCBpbXBsZW1lbnRzIEluZmVycmVkRGF0YUJ1aWxkZXIgewogIGZpbmFsIFNldDxNZW1iZXJFbnRpdHk+IF9mdW5jdGlvbnNDYWxsZWRJbkxvb3AgPSBuZXcgU2V0PE1lbWJlckVudGl0eT4oKTsKICBNYXA8TWVtYmVyRW50aXR5LCBTaWRlRWZmZWN0c0J1aWxkZXI+IF9zaWRlRWZmZWN0c0J1aWxkZXJzID0KICAgICAgPE1lbWJlckVudGl0eSwgU2lkZUVmZmVjdHNCdWlsZGVyPnt9OwogIGZpbmFsIFNldDxGdW5jdGlvbkVudGl0eT4gcHJlbWF0dXJlU2lkZUVmZmVjdEFjY2Vzc2VzID0KICAgICAgbmV3IFNldDxGdW5jdGlvbkVudGl0eT4oKTsKCiAgZmluYWwgU2V0PEZ1bmN0aW9uRW50aXR5PiBfc2lkZUVmZmVjdHNGcmVlRWxlbWVudHMgPQogICAgICBuZXcgU2V0PEZ1bmN0aW9uRW50aXR5PigpOwoKICBmaW5hbCBTZXQ8RnVuY3Rpb25FbnRpdHk+IF9lbGVtZW50c1RoYXRDYW5ub3RUaHJvdyA9CiAgICAgIG5ldyBTZXQ8RnVuY3Rpb25FbnRpdHk+KCk7CgogIGZpbmFsIFNldDxGdW5jdGlvbkVudGl0eT4gX2Z1bmN0aW9uc1RoYXRNaWdodEJlUGFzc2VkVG9BcHBseSA9CiAgICAgIG5ldyBTZXQ8RnVuY3Rpb25FbnRpdHk+KCk7CgogIEluZmVycmVkRGF0YUJ1aWxkZXJJbXBsKEFubm90YXRpb25zRGF0YSBhbm5vdGF0aW9uc0RhdGEpIHsKICAgIGFubm90YXRpb25zRGF0YS5mb3JFYWNoTm9UaHJvd3MocmVnaXN0ZXJDYW5ub3RUaHJvdyk7CiAgICBhbm5vdGF0aW9uc0RhdGEuZm9yRWFjaE5vU2lkZUVmZmVjdHMocmVnaXN0ZXJTaWRlRWZmZWN0c0ZyZWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU2lkZUVmZmVjdHNCdWlsZGVyIGdldFNpZGVFZmZlY3RzQnVpbGRlcihNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICByZXR1cm4gX3NpZGVFZmZlY3RzQnVpbGRlcnNbbWVtYmVyXSA/Pz0gbmV3IFNpZGVFZmZlY3RzQnVpbGRlcihtZW1iZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclNpZGVFZmZlY3RzRnJlZShGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICBfc2lkZUVmZmVjdHNGcmVlRWxlbWVudHMuYWRkKGVsZW1lbnQpOwogICAgYXNzZXJ0KCFfc2lkZUVmZmVjdHNCdWlsZGVycy5jb250YWluc0tleShlbGVtZW50KSk7CiAgICBfc2lkZUVmZmVjdHNCdWlsZGVyc1tlbGVtZW50XSA9IG5ldyBTaWRlRWZmZWN0c0J1aWxkZXIuZnJlZShlbGVtZW50KTsKICB9CgogIC8vLyBDb21wdXRlIFtTaWRlRWZmZWN0c10gZm9yIGFsbCByZWdpc3RlcmVkIFtTaWRlRWZmZWN0QnVpbGRlcl1zLgogIEBvdmVycmlkZQogIEluZmVycmVkRGF0YSBjbG9zZShKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGFzc2VydChfc2lkZUVmZmVjdHNCdWlsZGVycyAhPSBudWxsLAogICAgICAgICJJbmZlcnJlZCBkYXRhIGhhcyBhbHJlYWR5IGJlZW4gY29tcHV0ZWQuIik7CiAgICBNYXA8RnVuY3Rpb25FbnRpdHksIFNpZGVFZmZlY3RzPiBfc2lkZUVmZmVjdHMgPQogICAgICAgIDxGdW5jdGlvbkVudGl0eSwgU2lkZUVmZmVjdHM+e307CiAgICBJdGVyYWJsZTxTaWRlRWZmZWN0c0J1aWxkZXI+IHNpZGVFZmZlY3RzQnVpbGRlcnMgPQogICAgICAgIF9zaWRlRWZmZWN0c0J1aWxkZXJzLnZhbHVlczsKICAgIGVtcHR5V29ya0xpc3Qoc2lkZUVmZmVjdHNCdWlsZGVycyk7CiAgICBmb3IgKFNpZGVFZmZlY3RzQnVpbGRlciBzaWRlRWZmZWN0c0J1aWxkZXIgaW4gc2lkZUVmZmVjdHNCdWlsZGVycykgewogICAgICBfc2lkZUVmZmVjdHNbc2lkZUVmZmVjdHNCdWlsZGVyLm1lbWJlcl0gPSBzaWRlRWZmZWN0c0J1aWxkZXIuc2lkZUVmZmVjdHM7CiAgICB9CiAgICBfc2lkZUVmZmVjdHNCdWlsZGVycyA9IG51bGw7CgogICAgcmV0dXJuIG5ldyBJbmZlcnJlZERhdGFJbXBsKAogICAgICAgIGNsb3NlZFdvcmxkLAogICAgICAgIF9mdW5jdGlvbnNDYWxsZWRJbkxvb3AsCiAgICAgICAgX3NpZGVFZmZlY3RzLAogICAgICAgIF9zaWRlRWZmZWN0c0ZyZWVFbGVtZW50cywKICAgICAgICBfZWxlbWVudHNUaGF0Q2Fubm90VGhyb3csCiAgICAgICAgX2Z1bmN0aW9uc1RoYXRNaWdodEJlUGFzc2VkVG9BcHBseSk7CiAgfQoKICBzdGF0aWMgdm9pZCBlbXB0eVdvcmtMaXN0KEl0ZXJhYmxlPFNpZGVFZmZlY3RzQnVpbGRlcj4gc2lkZUVmZmVjdHNCdWlsZGVycykgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogT3B0aW1pemUgdGhpcyBhbGdvcml0aG0uCiAgICBRdWV1ZTxTaWRlRWZmZWN0c0J1aWxkZXI+IHF1ZXVlID0gbmV3IFF1ZXVlPFNpZGVFZmZlY3RzQnVpbGRlcj4oKTsKICAgIFNldDxTaWRlRWZmZWN0c0J1aWxkZXI+IGluUXVldWUgPSBuZXcgU2V0PFNpZGVFZmZlY3RzQnVpbGRlcj4oKTsKCiAgICBmb3IgKFNpZGVFZmZlY3RzQnVpbGRlciBidWlsZGVyIGluIHNpZGVFZmZlY3RzQnVpbGRlcnMpIHsKICAgICAgcXVldWUuYWRkTGFzdChidWlsZGVyKTsKICAgICAgaW5RdWV1ZS5hZGQoYnVpbGRlcik7CiAgICB9CiAgICB3aGlsZSAocXVldWUuaXNOb3RFbXB0eSkgewogICAgICBTaWRlRWZmZWN0c0J1aWxkZXIgc2lkZUVmZmVjdHNCdWlsZGVyID0gcXVldWUucmVtb3ZlRmlyc3QoKTsKICAgICAgaW5RdWV1ZS5yZW1vdmUoc2lkZUVmZmVjdHNCdWlsZGVyKTsKICAgICAgZm9yIChTaWRlRWZmZWN0c0J1aWxkZXIgZGVwZW5kZW50IGluIHNpZGVFZmZlY3RzQnVpbGRlci5kZXBlbmRpbmcpIHsKICAgICAgICBpZiAoZGVwZW5kZW50LmFkZChzaWRlRWZmZWN0c0J1aWxkZXIuc2lkZUVmZmVjdHMpKSB7CiAgICAgICAgICBpZiAoaW5RdWV1ZS5hZGQoZGVwZW5kZW50KSkgewogICAgICAgICAgICBxdWV1ZS5hZGRMYXN0KGRlcGVuZGVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZEZ1bmN0aW9uQ2FsbGVkSW5Mb29wKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBfZnVuY3Rpb25zQ2FsbGVkSW5Mb29wLmFkZChlbGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJDYW5ub3RUaHJvdyhGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICBfZWxlbWVudHNUaGF0Q2Fubm90VGhyb3cuYWRkKGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck1pZ2h0QmVQYXNzZWRUb0FwcGx5KEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICAgIF9mdW5jdGlvbnNUaGF0TWlnaHRCZVBhc3NlZFRvQXBwbHkuYWRkKGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXRDdXJyZW50bHlLbm93bk1pZ2h0QmVQYXNzZWRUb0FwcGx5KEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBfZnVuY3Rpb25zVGhhdE1pZ2h0QmVQYXNzZWRUb0FwcGx5LmNvbnRhaW5zKGVsZW1lbnQpOwogIH0KfQoKY2xhc3MgVHJpdmlhbEluZmVycmVkRGF0YSBpbXBsZW1lbnRzIEluZmVycmVkRGF0YSB7CiAgZmluYWwgU2lkZUVmZmVjdHMgX2FsbFNpZGVFZmZlY3RzID0gbmV3IFNpZGVFZmZlY3RzKCk7CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVCb29sKHRydWUpOyAvLyBJcyB0cml2aWFsLgogIH0KCiAgQG92ZXJyaWRlCiAgU2lkZUVmZmVjdHMgZ2V0U2lkZUVmZmVjdHNPZkVsZW1lbnQoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIF9hbGxTaWRlRWZmZWN0czsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0TWlnaHRCZVBhc3NlZFRvQXBwbHkoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NhbGxlZEluTG9vcChNZW1iZXJFbnRpdHkgZWxlbWVudCkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXRDYW5ub3RUaHJvdyhGdW5jdGlvbkVudGl0eSBlbGVtZW50KSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgU2lkZUVmZmVjdHMgZ2V0U2lkZUVmZmVjdHNPZlNlbGVjdG9yKAogICAgICBTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSByZWNlaXZlcikgewogICAgcmV0dXJuIF9hbGxTaWRlRWZmZWN0czsKICB9Cn0KgU4ATk48ASUBGSQxLiQoGBsBHjorNSgVKA1LBgQBMCcBNz8BSCgyAUsvATdQRS0BR0AbOAIBJUQ4AUFDAURAGz0BUCZGATRQNgFINAFEMAIBMUYdLQEjMjcBNgE2AUABFBkjGSUlMAEvNRdMM1AyNjI2PDYVIRUfFSEhLAQBDCgwFS8mSTExOxMEAQwoMzQiQCAGN00XITQ9DCg0ESMrLwoPNQgGGAQBDEAhSExPEEAEAT4BDC41BAEMMDcEAQw5SE49UVFOKwdROEFBBAIBP0w/LDohATchATchAUEhAT06QwQBDEJMBAEMOSs4SgQBRQwxKTU0KTclKElQBiEBIRUgFiIiLQQBUDVHRQE+HhwGH0MqSz0oJgwKCAYEAQw3KQQBDDUrBAEMPjUEAQxHQQQCATQ5AQwoKQQBDEAcBAEMQAEMNQEMOAEMKDMcBAIBMnBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvaW5mZXJyZWRfZGF0YS5kYXJ0N3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX21vZGVsL2pzX3N0cmF0ZWd5LmRhcnSlmi8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuanNfbW9kZWwuc3RyYXRlZ3k7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAnLi4vYmFja2VuZF9zdHJhdGVneS5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uL2NvZGVnZW4uZGFydCcgc2hvdyBDb2RlZ2VuUmVnaXN0cnksIENvZGVnZW5Xb3JrSXRlbTsKaW1wb3J0ICcuLi9jb21tb24vdGFza3MuZGFydCc7CmltcG9ydCAnLi4vY29tcGlsZXIuZGFydCc7CmltcG9ydCAnLi4vZGVmZXJyZWRfbG9hZC5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbnF1ZXVlLmRhcnQnOwppbXBvcnQgJy4uL2lvL2tlcm5lbF9zb3VyY2VfaW5mb3JtYXRpb24uZGFydCcKICAgIHNob3cgS2VybmVsU291cmNlSW5mb3JtYXRpb25TdHJhdGVneTsKaW1wb3J0ICcuLi9pby9zb3VyY2VfaW5mb3JtYXRpb24uZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJy4uL2luZmVycmVyL3R5cGVfZ3JhcGhfaW5mZXJyZXIuZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vanMvanNfc291cmNlX21hcHBpbmcuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9iYWNrZW5kLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvaW5mZXJyZWRfZGF0YS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL25hdGl2ZV9kYXRhLmRhcnQnOwppbXBvcnQgJy4uL2tlcm5lbC9rZXJuZWxfc3RyYXRlZ3kuZGFydCc7CmltcG9ydCAnLi4vbmF0aXZlL2JlaGF2aW9yLmRhcnQnOwppbXBvcnQgJy4uL3NzYS9idWlsZGVyX2tlcm5lbC5kYXJ0JzsKaW1wb3J0ICcuLi9zc2Evbm9kZXMuZGFydCc7CmltcG9ydCAnLi4vc3NhL3NzYS5kYXJ0JzsKaW1wb3J0ICcuLi9zc2EvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY29kZWdlbl93b3JsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3dvcmxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvd29ybGRfaW1wYWN0LmRhcnQnOwppbXBvcnQgJy4uL3dvcmxkLmRhcnQnOwppbXBvcnQgJ2Nsb3N1cmUuZGFydCc7CmltcG9ydCAnZWxlbWVudF9tYXAuZGFydCc7CmltcG9ydCAnZWxlbWVudF9tYXBfaW1wbC5kYXJ0JzsKaW1wb3J0ICdqc193b3JsZC5kYXJ0JzsKaW1wb3J0ICdqc193b3JsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2xvY2Fscy5kYXJ0JzsKCmNsYXNzIEpzQmFja2VuZFN0cmF0ZWd5IGltcGxlbWVudHMgQmFja2VuZFN0cmF0ZWd5IHsKICBmaW5hbCBDb21waWxlciBfY29tcGlsZXI7CiAgSnNLZXJuZWxUb0VsZW1lbnRNYXAgX2VsZW1lbnRNYXA7CgogIEpzQmFja2VuZFN0cmF0ZWd5KHRoaXMuX2NvbXBpbGVyKTsKCiAgQGRlcHJlY2F0ZWQKICBKc1RvRWxlbWVudE1hcCBnZXQgZWxlbWVudE1hcCB7CiAgICBhc3NlcnQoX2VsZW1lbnRNYXAgIT0gbnVsbCwKICAgICAgICAiSnNCYWNrZW5kU3RyYXRlZ3kuZWxlbWVudE1hcCBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQuIik7CiAgICByZXR1cm4gX2VsZW1lbnRNYXA7CiAgfQoKICBAb3ZlcnJpZGUKICBKQ2xvc2VkV29ybGQgY3JlYXRlSkNsb3NlZFdvcmxkKAogICAgICBLQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsIE91dHB1dFVuaXREYXRhIG91dHB1dFVuaXREYXRhKSB7CiAgICBLZXJuZWxGcm9udEVuZFN0cmF0ZWd5IHN0cmF0ZWd5ID0gX2NvbXBpbGVyLmZyb250ZW5kU3RyYXRlZ3k7CiAgICBfZWxlbWVudE1hcCA9IG5ldyBKc0tlcm5lbFRvRWxlbWVudE1hcCgKICAgICAgICBfY29tcGlsZXIucmVwb3J0ZXIsCiAgICAgICAgX2NvbXBpbGVyLmVudmlyb25tZW50LAogICAgICAgIHN0cmF0ZWd5LmVsZW1lbnRNYXAsCiAgICAgICAgY2xvc2VkV29ybGQubGl2ZU1lbWJlclVzYWdlLAogICAgICAgIGNsb3NlZFdvcmxkLmFubm90YXRpb25zRGF0YSk7CiAgICBHbG9iYWxMb2NhbHNNYXAgX2dsb2JhbExvY2Fsc01hcCA9IG5ldyBHbG9iYWxMb2NhbHNNYXAoKTsKICAgIENsb3N1cmVEYXRhQnVpbGRlciBjbG9zdXJlRGF0YUJ1aWxkZXIgPSBuZXcgQ2xvc3VyZURhdGFCdWlsZGVyKAogICAgICAgIF9lbGVtZW50TWFwLCBfZ2xvYmFsTG9jYWxzTWFwLCBfY29tcGlsZXIub3B0aW9ucyk7CiAgICBKc0Nsb3NlZFdvcmxkQnVpbGRlciBjbG9zZWRXb3JsZEJ1aWxkZXIgPSBuZXcgSnNDbG9zZWRXb3JsZEJ1aWxkZXIoCiAgICAgICAgX2VsZW1lbnRNYXAsCiAgICAgICAgX2dsb2JhbExvY2Fsc01hcCwKICAgICAgICBjbG9zdXJlRGF0YUJ1aWxkZXIsCiAgICAgICAgX2NvbXBpbGVyLm9wdGlvbnMsCiAgICAgICAgX2NvbXBpbGVyLmFic3RyYWN0VmFsdWVTdHJhdGVneSk7CiAgICByZXR1cm4gY2xvc2VkV29ybGRCdWlsZGVyLmNvbnZlcnRDbG9zZWRXb3JsZCgKICAgICAgICBjbG9zZWRXb3JsZCwgc3RyYXRlZ3kuY2xvc3VyZU1vZGVscywgb3V0cHV0VW5pdERhdGEpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckpDbG9zZWRXb3JsZChjb3ZhcmlhbnQgSnNDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgX2VsZW1lbnRNYXAgPSBjbG9zZWRXb3JsZC5lbGVtZW50TWFwOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb25TdHJhdGVneSBnZXQgc291cmNlSW5mb3JtYXRpb25TdHJhdGVneSB7CiAgICBpZiAoIV9jb21waWxlci5vcHRpb25zLmdlbmVyYXRlU291cmNlTWFwKSB7CiAgICAgIHJldHVybiBjb25zdCBKYXZhU2NyaXB0U291cmNlSW5mb3JtYXRpb25TdHJhdGVneSgpOwogICAgfQogICAgcmV0dXJuIG5ldyBLZXJuZWxTb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5KHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3NhQnVpbGRlciBjcmVhdGVTc2FCdWlsZGVyKENvbXBpbGVyVGFzayB0YXNrLCBKYXZhU2NyaXB0QmFja2VuZCBiYWNrZW5kLAogICAgICBTb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5IHNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kpIHsKICAgIHJldHVybiBuZXcgS2VybmVsU3NhQnVpbGRlcigKICAgICAgICB0YXNrLAogICAgICAgIGJhY2tlbmQuY29tcGlsZXIsCiAgICAgICAgLy8gaWdub3JlOmRlcHJlY2F0ZWRfbWVtYmVyX3VzZV9mcm9tX3NhbWVfcGFja2FnZQogICAgICAgIGVsZW1lbnRNYXApOwogIH0KCiAgQG92ZXJyaWRlCiAgV29ya0l0ZW1CdWlsZGVyIGNyZWF0ZUNvZGVnZW5Xb3JrSXRlbUJ1aWxkZXIoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBnbG9iYWxJbmZlcmVuY2VSZXN1bHRzKSB7CiAgICByZXR1cm4gbmV3IEtlcm5lbENvZGVnZW5Xb3JrSXRlbUJ1aWxkZXIoCiAgICAgICAgX2NvbXBpbGVyLmJhY2tlbmQsIGNsb3NlZFdvcmxkLCBnbG9iYWxJbmZlcmVuY2VSZXN1bHRzKTsKICB9CgogIEBvdmVycmlkZQogIENvZGVnZW5Xb3JsZEJ1aWxkZXIgY3JlYXRlQ29kZWdlbldvcmxkQnVpbGRlcigKICAgICAgTmF0aXZlQmFzaWNEYXRhIG5hdGl2ZUJhc2ljRGF0YSwKICAgICAgY292YXJpYW50IEpzQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsCiAgICAgIFNlbGVjdG9yQ29uc3RyYWludHNTdHJhdGVneSBzZWxlY3RvckNvbnN0cmFpbnRzU3RyYXRlZ3kpIHsKICAgIHJldHVybiBuZXcgQ29kZWdlbldvcmxkQnVpbGRlckltcGwoCiAgICAgICAgY2xvc2VkV29ybGQuZWxlbWVudE1hcCwgY2xvc2VkV29ybGQsIHNlbGVjdG9yQ29uc3RyYWludHNTdHJhdGVneSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTb3VyY2VTcGFuIHNwYW5Gcm9tU3Bhbm5hYmxlKFNwYW5uYWJsZSBzcGFubmFibGUsIEVudGl0eSBjdXJyZW50RWxlbWVudCkgewogICAgcmV0dXJuIF9lbGVtZW50TWFwLmdldFNvdXJjZVNwYW4oc3Bhbm5hYmxlLCBjdXJyZW50RWxlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlc0luZmVycmVyIGNyZWF0ZVR5cGVzSW5mZXJyZXIoCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwgSW5mZXJyZWREYXRhQnVpbGRlciBpbmZlcnJlZERhdGFCdWlsZGVyKSB7CiAgICByZXR1cm4gbmV3IFR5cGVHcmFwaEluZmVycmVyKF9jb21waWxlciwgY2xvc2VkV29ybGQsIGluZmVycmVkRGF0YUJ1aWxkZXIpOwogIH0KfQoKY2xhc3MgS2VybmVsQ29kZWdlbldvcmtJdGVtQnVpbGRlciBpbXBsZW1lbnRzIFdvcmtJdGVtQnVpbGRlciB7CiAgZmluYWwgSmF2YVNjcmlwdEJhY2tlbmQgX2JhY2tlbmQ7CiAgZmluYWwgSkNsb3NlZFdvcmxkIF9jbG9zZWRXb3JsZDsKICBmaW5hbCBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0czsKCiAgS2VybmVsQ29kZWdlbldvcmtJdGVtQnVpbGRlcigKICAgICAgdGhpcy5fYmFja2VuZCwgdGhpcy5fY2xvc2VkV29ybGQsIHRoaXMuX2dsb2JhbEluZmVyZW5jZVJlc3VsdHMpOwoKICBAb3ZlcnJpZGUKICBDb2RlZ2VuV29ya0l0ZW0gY3JlYXRlV29ya0l0ZW0oTWVtYmVyRW50aXR5IGVudGl0eSkgewogICAgaWYgKGVudGl0eS5pc0Fic3RyYWN0KSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBuZXcgS2VybmVsQ29kZWdlbldvcmtJdGVtKAogICAgICAgIF9iYWNrZW5kLCBfY2xvc2VkV29ybGQsIF9nbG9iYWxJbmZlcmVuY2VSZXN1bHRzLCBlbnRpdHkpOwogIH0KfQoKY2xhc3MgS2VybmVsQ29kZWdlbldvcmtJdGVtIGV4dGVuZHMgQ29kZWdlbldvcmtJdGVtIHsKICBmaW5hbCBKYXZhU2NyaXB0QmFja2VuZCBfYmFja2VuZDsKICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwogIEBvdmVycmlkZQogIGZpbmFsIE1lbWJlckVudGl0eSBlbGVtZW50OwogIEBvdmVycmlkZQogIGZpbmFsIENvZGVnZW5SZWdpc3RyeSByZWdpc3RyeTsKICBmaW5hbCBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0czsKCiAgS2VybmVsQ29kZWdlbldvcmtJdGVtKHRoaXMuX2JhY2tlbmQsIHRoaXMuX2Nsb3NlZFdvcmxkLAogICAgICB0aGlzLl9nbG9iYWxJbmZlcmVuY2VSZXN1bHRzLCB0aGlzLmVsZW1lbnQpCiAgICAgIDogcmVnaXN0cnkgPQogICAgICAgICAgICBuZXcgQ29kZWdlblJlZ2lzdHJ5KF9jbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQsIGVsZW1lbnQpOwoKICBAb3ZlcnJpZGUKICBXb3JsZEltcGFjdCBydW4oKSB7CiAgICByZXR1cm4gX2JhY2tlbmQuY29kZWdlbih0aGlzLCBfY2xvc2VkV29ybGQsIF9nbG9iYWxJbmZlcmVuY2VSZXN1bHRzKTsKICB9Cn0KCi8vLyBUYXNrIGZvciBidWlsZGluZyBTU0EgZnJvbSBrZXJuZWwgSVIgbG9hZGVkIGZyb20gLmRpbGwuCmNsYXNzIEtlcm5lbFNzYUJ1aWxkZXIgaW1wbGVtZW50cyBTc2FCdWlsZGVyIHsKICBmaW5hbCBDb21waWxlclRhc2sgdGFzazsKICBmaW5hbCBDb21waWxlciBfY29tcGlsZXI7CiAgZmluYWwgSnNUb0VsZW1lbnRNYXAgX2VsZW1lbnRNYXA7CiAgRnVuY3Rpb25JbmxpbmVDYWNoZSBfaW5saW5lQ2FjaGU7CgogIEtlcm5lbFNzYUJ1aWxkZXIodGhpcy50YXNrLCB0aGlzLl9jb21waWxlciwgdGhpcy5fZWxlbWVudE1hcCk7CgogIEBvdmVycmlkZQogIEhHcmFwaCBidWlsZChDb2RlZ2VuV29ya0l0ZW0gd29yaywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzKSB7CiAgICBfaW5saW5lQ2FjaGUgPz89IG5ldyBGdW5jdGlvbklubGluZUNhY2hlKGNsb3NlZFdvcmxkLmFubm90YXRpb25zRGF0YSk7CiAgICByZXR1cm4gdGFzay5tZWFzdXJlKCgpIHsKICAgICAgS2VybmVsU3NhR3JhcGhCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgS2VybmVsU3NhR3JhcGhCdWlsZGVyKAogICAgICAgICAgd29yay5lbGVtZW50LAogICAgICAgICAgX2VsZW1lbnRNYXAuZ2V0TWVtYmVyVGhpc1R5cGUod29yay5lbGVtZW50KSwKICAgICAgICAgIF9jb21waWxlciwKICAgICAgICAgIF9lbGVtZW50TWFwLAogICAgICAgICAgcmVzdWx0cywKICAgICAgICAgIGNsb3NlZFdvcmxkLAogICAgICAgICAgX2NvbXBpbGVyLmNvZGVnZW5Xb3JsZEJ1aWxkZXIsCiAgICAgICAgICB3b3JrLnJlZ2lzdHJ5LAogICAgICAgICAgX2NvbXBpbGVyLmJhY2tlbmQuZW1pdHRlci5uYXRpdmVFbWl0dGVyLAogICAgICAgICAgX2NvbXBpbGVyLmJhY2tlbmQuc291cmNlSW5mb3JtYXRpb25TdHJhdGVneSwKICAgICAgICAgIF9pbmxpbmVDYWNoZSk7CiAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CiAgICB9KTsKICB9Cn0KCmNsYXNzIEtlcm5lbFRvVHlwZUluZmVyZW5jZU1hcEltcGwgaW1wbGVtZW50cyBLZXJuZWxUb1R5cGVJbmZlcmVuY2VNYXAgewogIGZpbmFsIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIF9nbG9iYWxJbmZlcmVuY2VSZXN1bHRzOwogIEdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHQgX3RhcmdldFJlc3VsdHM7CgogIEtlcm5lbFRvVHlwZUluZmVyZW5jZU1hcEltcGwoCiAgICAgIE1lbWJlckVudGl0eSB0YXJnZXQsIHRoaXMuX2dsb2JhbEluZmVyZW5jZVJlc3VsdHMpIHsKICAgIF90YXJnZXRSZXN1bHRzID0gX3Jlc3VsdE9mKHRhcmdldCk7CiAgfQoKICBHbG9iYWxUeXBlSW5mZXJlbmNlTWVtYmVyUmVzdWx0IF9yZXN1bHRPZihNZW1iZXJFbnRpdHkgZSkgPT4KICAgICAgX2dsb2JhbEluZmVyZW5jZVJlc3VsdHMKICAgICAgICAgIC5yZXN1bHRPZk1lbWJlcihlIGlzIENvbnN0cnVjdG9yQm9keUVudGl0eSA/IGUuY29uc3RydWN0b3IgOiBlKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBnZXRSZXR1cm5UeXBlT2YoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pIHsKICAgIHJldHVybiBBYnN0cmFjdFZhbHVlRmFjdG9yeS5pbmZlcnJlZFJldHVyblR5cGVGb3JFbGVtZW50KAogICAgICAgIGZ1bmN0aW9uLCBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyVHlwZU9mSW52b2NhdGlvbigKICAgICAgaXIuTWV0aG9kSW52b2NhdGlvbiBub2RlLCBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4pIHsKICAgIHJldHVybiBfdGFyZ2V0UmVzdWx0cy50eXBlT2ZTZW5kKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSByZWNlaXZlclR5cGVPZkdldChpci5Qcm9wZXJ0eUdldCBub2RlKSB7CiAgICByZXR1cm4gX3RhcmdldFJlc3VsdHMudHlwZU9mU2VuZChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXJUeXBlT2ZEaXJlY3RHZXQoaXIuRGlyZWN0UHJvcGVydHlHZXQgbm9kZSkgewogICAgcmV0dXJuIF90YXJnZXRSZXN1bHRzLnR5cGVPZlNlbmQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyVHlwZU9mU2V0KAogICAgICBpci5Qcm9wZXJ0eVNldCBub2RlLCBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4pIHsKICAgIHJldHVybiBfdGFyZ2V0UmVzdWx0cy50eXBlT2ZTZW5kKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZMaXN0TGl0ZXJhbCgKICAgICAgaXIuTGlzdExpdGVyYWwgbGlzdExpdGVyYWwsIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbikgewogICAgcmV0dXJuIF9nbG9iYWxJbmZlcmVuY2VSZXN1bHRzLnR5cGVPZkxpc3RMaXRlcmFsKGxpc3RMaXRlcmFsKSA/PwogICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkl0ZXJhdG9yKGlyLkZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIHJldHVybiBfdGFyZ2V0UmVzdWx0cy50eXBlT2ZJdGVyYXRvcihub2RlKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdHlwZU9mSXRlcmF0b3JDdXJyZW50KGlyLkZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIHJldHVybiBfdGFyZ2V0UmVzdWx0cy50eXBlT2ZJdGVyYXRvckN1cnJlbnQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkl0ZXJhdG9yTW92ZU5leHQoaXIuRm9ySW5TdGF0ZW1lbnQgbm9kZSkgewogICAgcmV0dXJuIF90YXJnZXRSZXN1bHRzLnR5cGVPZkl0ZXJhdG9yTW92ZU5leHQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSnNJbmRleGFibGVJdGVyYXRvcigKICAgICAgaXIuRm9ySW5TdGF0ZW1lbnQgbm9kZSwgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluKSB7CiAgICBBYnN0cmFjdFZhbHVlIG1hc2sgPSB0eXBlT2ZJdGVyYXRvcihub2RlKTsKICAgIHJldHVybiBhYnN0cmFjdFZhbHVlRG9tYWluLmlzSnNJbmRleGFibGVBbmRJdGVyYWJsZShtYXNrKS5pc0RlZmluaXRlbHlUcnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBpbmZlcnJlZEluZGV4VHlwZShpci5Gb3JJblN0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gQWJzdHJhY3RWYWx1ZUZhY3RvcnkuaW5mZXJyZWRUeXBlRm9yU2VsZWN0b3IoCiAgICAgICAgbmV3IFNlbGVjdG9yLmluZGV4KCksIHR5cGVPZkl0ZXJhdG9yKG5vZGUpLCBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldEluZmVycmVkVHlwZU9mKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIHJldHVybiBBYnN0cmFjdFZhbHVlRmFjdG9yeS5pbmZlcnJlZFR5cGVGb3JNZW1iZXIoCiAgICAgICAgbWVtYmVyLCBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldEluZmVycmVkVHlwZU9mUGFyYW1ldGVyKExvY2FsIHBhcmFtZXRlcikgewogICAgcmV0dXJuIEFic3RyYWN0VmFsdWVGYWN0b3J5LmluZmVycmVkVHlwZUZvclBhcmFtZXRlcigKICAgICAgICBwYXJhbWV0ZXIsIF9nbG9iYWxJbmZlcmVuY2VSZXN1bHRzKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgc2VsZWN0b3JUeXBlT2YoU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgbWFzaykgewogICAgcmV0dXJuIEFic3RyYWN0VmFsdWVGYWN0b3J5LmluZmVycmVkVHlwZUZvclNlbGVjdG9yKAogICAgICAgIHNlbGVjdG9yLCBtYXNrLCBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVGcm9tTmF0aXZlQmVoYXZpb3IoCiAgICAgIE5hdGl2ZUJlaGF2aW9yIG5hdGl2ZUJlaGF2aW9yLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBBYnN0cmFjdFZhbHVlRmFjdG9yeS5mcm9tTmF0aXZlQmVoYXZpb3IobmF0aXZlQmVoYXZpb3IsIGNsb3NlZFdvcmxkKTsKICB9Cn0KgSwATk48ASMBKAEjGUcfGyAkGi4qKDEvISclKykpIiUcGhwxJCkoGBcbIBggFgE1HCQBJQEOIiBDGAQBDCNBQiwcHx0lJj5EO0gVGhwbKjI+BAEMQyoEAQw8MDoGNgQBDEw9IQ4aOhUEAQxJOy1BBAEMMScrQShLBAEMTUEEAQwlS08EAgFAJCM8ASBHAQw4KCZCBAIBNiQjDB4MIjwBOjITSwEMFkoEAgE8LxscJCQBQQEMPyxLHUEYNxUXExcpGTM3GR4IBAIBSTwyASA7KAQBPx5LAQw7PiwEAQwqSywEAQw5LAQBDEUsBAEMI0YsBAEMI01FKQQBDDkwBAEMQDcEAQxBOAQBDB5JL1AEAQw8OU4EAQw5NyoEAQw+Oi0EAQxIOTIEAQwoQVEEAgEucGFja2FnZTpjb21waWxlci9zcmMvanNfbW9kZWwvanNfc3RyYXRlZ3kuZGFydDlzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9rZXJuZWwva2VybmVsX3N0cmF0ZWd5LmRhcnSxVi8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMua2VybmVsLmZyb250ZW5kX3N0cmF0ZWd5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24vYmFja2VuZF9hcGkuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uL3Jlc29sdXRpb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uL3Rhc2tzLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbi93b3JrLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JzsKaW1wb3J0ICcuLi9jb21waWxlci5kYXJ0JzsKaW1wb3J0ICcuLi9kZWZlcnJlZF9sb2FkLmRhcnQnIHNob3cgRGVmZXJyZWRMb2FkVGFzazsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbnF1ZXVlLmRhcnQnOwppbXBvcnQgJy4uL2Vudmlyb25tZW50LmRhcnQnIGFzIGVudjsKaW1wb3J0ICcuLi9mcm9udGVuZF9zdHJhdGVneS5kYXJ0JzsKaW1wb3J0ICcuLi9pci9hbm5vdGF0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi9pci9jbG9zdXJlLmRhcnQnIHNob3cgQ2xvc3VyZVNjb3BlTW9kZWw7CmltcG9ydCAnLi4vaXIvaW1wYWN0LmRhcnQnOwppbXBvcnQgJy4uL2lyL21vZHVsYXIuZGFydCc7CmltcG9ydCAnLi4vaXIvc2NvcGUuZGFydCcgc2hvdyBTY29wZU1vZGVsOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvYW5ub3RhdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9maWVsZF9hbmFseXNpcy5kYXJ0JyBzaG93IEtGaWVsZEFuYWx5c2lzOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvYmFja2VuZF91c2FnZS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2ludGVyY2VwdG9yX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9uYXRpdmVfZGF0YS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL25vX3N1Y2hfbWV0aG9kX3JlZ2lzdHJ5LmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvcnVudGltZV90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9uYXRpdmUvZW5xdWV1ZS5kYXJ0JyBzaG93IE5hdGl2ZVJlc29sdXRpb25FbnF1ZXVlcjsKaW1wb3J0ICcuLi9uYXRpdmUvcmVzb2x2ZXIuZGFydCc7CmltcG9ydCAnLi4vb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jbGFzc19oaWVyYXJjaHkuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvcmVzb2x1dGlvbl93b3JsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3dvcmxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvd29ybGRfaW1wYWN0LmRhcnQnOwppbXBvcnQgJy4uL3V0aWwvZW51bXNldC5kYXJ0JzsKaW1wb3J0ICdkZWZlcnJlZF9sb2FkLmRhcnQnOwppbXBvcnQgJ2VsZW1lbnRfbWFwLmRhcnQnOwppbXBvcnQgJ2VsZW1lbnRfbWFwX2ltcGwuZGFydCc7CmltcG9ydCAnbG9hZGVyLmRhcnQnOwoKLy8vIEZyb250IGVuZCBzdHJhdGVneSB0aGF0IGxvYWRzICcuZGlsbCcgZmlsZXMgYW5kIGJ1aWxkcyBhIHJlc29sdmVkIGVsZW1lbnQKLy8vIG1vZGVsIGZyb20ga2VybmVsIElSIG5vZGVzLgpjbGFzcyBLZXJuZWxGcm9udEVuZFN0cmF0ZWd5IGV4dGVuZHMgRnJvbnRlbmRTdHJhdGVneUJhc2UgewogIENvbXBpbGVyT3B0aW9ucyBfb3B0aW9uczsKICBDb21waWxlclRhc2sgX2NvbXBpbGVyVGFzazsKICBLZXJuZWxUb0VsZW1lbnRNYXBJbXBsIF9lbGVtZW50TWFwOwogIFJ1bnRpbWVUeXBlc05lZWRCdWlsZGVyIF9ydW50aW1lVHlwZXNOZWVkQnVpbGRlcjsKCiAgS2VybmVsQW5ub3RhdGlvblByb2Nlc3NvciBfYW5ub3RhdGlvblByb2Nlc3NvcjsKCiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwgQ2xvc3VyZVNjb3BlTW9kZWw+IGNsb3N1cmVNb2RlbHMgPSB7fTsKCiAgTW9kdWxhclN0cmF0ZWd5IF9tb2R1bGFyU3RyYXRlZ3k7CiAgSXJBbm5vdGF0aW9uRGF0YSBfaXJBbm5vdGF0aW9uRGF0YTsKCiAgS2VybmVsRnJvbnRFbmRTdHJhdGVneSh0aGlzLl9jb21waWxlclRhc2ssIHRoaXMuX29wdGlvbnMsCiAgICAgIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwgZW52LkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICBhc3NlcnQoX2NvbXBpbGVyVGFzayAhPSBudWxsKTsKICAgIF9lbGVtZW50TWFwID0KICAgICAgICBuZXcgS2VybmVsVG9FbGVtZW50TWFwSW1wbChyZXBvcnRlciwgZW52aXJvbm1lbnQsIHRoaXMsIF9vcHRpb25zKTsKICAgIF9tb2R1bGFyU3RyYXRlZ3kgPSBuZXcgS2VybmVsTW9kdWxhclN0cmF0ZWd5KF9jb21waWxlclRhc2ssIF9lbGVtZW50TWFwKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJMb2FkZWRMaWJyYXJpZXMoS2VybmVsUmVzdWx0IGtlcm5lbFJlc3VsdCkgewogICAgX2VsZW1lbnRNYXAuYWRkQ29tcG9uZW50KGtlcm5lbFJlc3VsdC5jb21wb25lbnQpOwogICAgaWYgKF9vcHRpb25zLnVzZUNGRUNvbnN0YW50cykgewogICAgICBfaXJBbm5vdGF0aW9uRGF0YSA9IHByb2Nlc3NBbm5vdGF0aW9ucyhrZXJuZWxSZXN1bHQuY29tcG9uZW50KTsKICAgIH0KICAgIF9hbm5vdGF0aW9uUHJvY2Vzc29yID0gbmV3IEtlcm5lbEFubm90YXRpb25Qcm9jZXNzb3IoCiAgICAgICAgZWxlbWVudE1hcCwgbmF0aXZlQmFzaWNEYXRhQnVpbGRlciwgX2lyQW5ub3RhdGlvbkRhdGEpOwogIH0KCiAgSXJBbm5vdGF0aW9uRGF0YSBnZXQgaXJBbm5vdGF0aW9uRGF0YUZvclRlc3RpbmcgPT4gX2lyQW5ub3RhdGlvbkRhdGE7CgogIE1vZHVsYXJTdHJhdGVneSBnZXQgbW9kdWxhclN0cmF0ZWd5Rm9yVGVzdGluZyA9PiBfbW9kdWxhclN0cmF0ZWd5OwoKICBAb3ZlcnJpZGUKICBFbGVtZW50RW52aXJvbm1lbnQgZ2V0IGVsZW1lbnRFbnZpcm9ubWVudCA9PiBfZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQ7CgogIEBvdmVycmlkZQogIENvbW1vbkVsZW1lbnRzIGdldCBjb21tb25FbGVtZW50cyA9PiBfZWxlbWVudE1hcC5jb21tb25FbGVtZW50czsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGVzIGdldCBkYXJ0VHlwZXMgPT4gX2VsZW1lbnRNYXAudHlwZXM7CgogIEtlcm5lbFRvRWxlbWVudE1hcCBnZXQgZWxlbWVudE1hcCA9PiBfZWxlbWVudE1hcDsKCiAgQG92ZXJyaWRlCiAgQW5ub3RhdGlvblByb2Nlc3NvciBnZXQgYW5ub3RhdGlvblByb2Nlc3NvciB7CiAgICBhc3NlcnQoX2Fubm90YXRpb25Qcm9jZXNzb3IgIT0gbnVsbCwKICAgICAgICAiQW5ub3RhdGlvblByb2Nlc3NvciBoYXMgbm90IGJlZW4gY3JlYXRlZC4iKTsKICAgIHJldHVybiBfYW5ub3RhdGlvblByb2Nlc3NvcjsKICB9CgogIEBvdmVycmlkZQogIERlZmVycmVkTG9hZFRhc2sgY3JlYXRlRGVmZXJyZWRMb2FkVGFzayhDb21waWxlciBjb21waWxlcikgPT4KICAgICAgbmV3IEtlcm5lbERlZmVycmVkTG9hZFRhc2soY29tcGlsZXIsIF9lbGVtZW50TWFwKTsKCiAgQG92ZXJyaWRlCiAgTmF0aXZlQ2xhc3NGaW5kZXIgY3JlYXRlTmF0aXZlQ2xhc3NGaW5kZXIoTmF0aXZlQmFzaWNEYXRhIG5hdGl2ZUJhc2ljRGF0YSkgewogICAgcmV0dXJuIG5ldyBCYXNlTmF0aXZlQ2xhc3NGaW5kZXIoCiAgICAgICAgX2VsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50LCBuYXRpdmVCYXNpY0RhdGEpOwogIH0KCiAgQG92ZXJyaWRlCiAgTm9TdWNoTWV0aG9kUmVzb2x2ZXIgY3JlYXRlTm9TdWNoTWV0aG9kUmVzb2x2ZXIoKSB7CiAgICByZXR1cm4gbmV3IEtlcm5lbE5vU3VjaE1ldGhvZFJlc29sdmVyKGVsZW1lbnRNYXApOwogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgY29tcHV0ZU1haW4oV29ybGRJbXBhY3RCdWlsZGVyIGltcGFjdEJ1aWxkZXIpIHsKICAgIHJldHVybiBlbGVtZW50RW52aXJvbm1lbnQubWFpbkZ1bmN0aW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgUnVudGltZVR5cGVzTmVlZEJ1aWxkZXIgY3JlYXRlUnVudGltZVR5cGVzTmVlZEJ1aWxkZXIoKSB7CiAgICByZXR1cm4gX3J1bnRpbWVUeXBlc05lZWRCdWlsZGVyID8/PSBfb3B0aW9ucy5kaXNhYmxlUnRpT3B0aW1pemF0aW9uCiAgICAgICAgPyBjb25zdCBUcml2aWFsUnVudGltZVR5cGVzTmVlZEJ1aWxkZXIoKQogICAgICAgIDogbmV3IFJ1bnRpbWVUeXBlc05lZWRCdWlsZGVySW1wbCgKICAgICAgICAgICAgZWxlbWVudEVudmlyb25tZW50LCBfZWxlbWVudE1hcC50eXBlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBSdW50aW1lVHlwZXNOZWVkQnVpbGRlciBnZXQgcnVudGltZVR5cGVzTmVlZEJ1aWxkZXJGb3JUZXN0aW5nID0+CiAgICAgIF9ydW50aW1lVHlwZXNOZWVkQnVpbGRlcjsKCiAgQG92ZXJyaWRlCiAgUmVzb2x1dGlvbldvcmxkQnVpbGRlciBjcmVhdGVSZXNvbHV0aW9uV29ybGRCdWlsZGVyKAogICAgICBOYXRpdmVCYXNpY0RhdGEgbmF0aXZlQmFzaWNEYXRhLAogICAgICBOYXRpdmVEYXRhQnVpbGRlciBuYXRpdmVEYXRhQnVpbGRlciwKICAgICAgSW50ZXJjZXB0b3JEYXRhQnVpbGRlciBpbnRlcmNlcHRvckRhdGFCdWlsZGVyLAogICAgICBCYWNrZW5kVXNhZ2VCdWlsZGVyIGJhY2tlbmRVc2FnZUJ1aWxkZXIsCiAgICAgIFJ1bnRpbWVUeXBlc05lZWRCdWlsZGVyIHJ0aU5lZWRCdWlsZGVyLAogICAgICBLRmllbGRBbmFseXNpcyBhbGxvY2F0b3JBbmFseXNpcywKICAgICAgTmF0aXZlUmVzb2x1dGlvbkVucXVldWVyIG5hdGl2ZVJlc29sdXRpb25FbnF1ZXVlciwKICAgICAgTm9TdWNoTWV0aG9kUmVnaXN0cnkgbm9TdWNoTWV0aG9kUmVnaXN0cnksCiAgICAgIEFubm90YXRpb25zRGF0YUJ1aWxkZXIgYW5ub3RhdGlvbnNEYXRhQnVpbGRlciwKICAgICAgU2VsZWN0b3JDb25zdHJhaW50c1N0cmF0ZWd5IHNlbGVjdG9yQ29uc3RyYWludHNTdHJhdGVneSwKICAgICAgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGNsYXNzSGllcmFyY2h5QnVpbGRlciwKICAgICAgQ2xhc3NRdWVyaWVzIGNsYXNzUXVlcmllcykgewogICAgcmV0dXJuIG5ldyBSZXNvbHV0aW9uV29ybGRCdWlsZGVySW1wbCgKICAgICAgICBfb3B0aW9ucywKICAgICAgICBlbGVtZW50TWFwLAogICAgICAgIGVsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50LAogICAgICAgIGVsZW1lbnRNYXAudHlwZXMsCiAgICAgICAgZWxlbWVudE1hcC5jb21tb25FbGVtZW50cywKICAgICAgICBuYXRpdmVCYXNpY0RhdGEsCiAgICAgICAgbmF0aXZlRGF0YUJ1aWxkZXIsCiAgICAgICAgaW50ZXJjZXB0b3JEYXRhQnVpbGRlciwKICAgICAgICBiYWNrZW5kVXNhZ2VCdWlsZGVyLAogICAgICAgIHJ0aU5lZWRCdWlsZGVyLAogICAgICAgIGFsbG9jYXRvckFuYWx5c2lzLAogICAgICAgIG5hdGl2ZVJlc29sdXRpb25FbnF1ZXVlciwKICAgICAgICBub1N1Y2hNZXRob2RSZWdpc3RyeSwKICAgICAgICBhbm5vdGF0aW9uc0RhdGFCdWlsZGVyLAogICAgICAgIHNlbGVjdG9yQ29uc3RyYWludHNTdHJhdGVneSwKICAgICAgICBjbGFzc0hpZXJhcmNoeUJ1aWxkZXIsCiAgICAgICAgY2xhc3NRdWVyaWVzKTsKICB9CgogIEBvdmVycmlkZQogIFdvcmtJdGVtQnVpbGRlciBjcmVhdGVSZXNvbHV0aW9uV29ya0l0ZW1CdWlsZGVyKAogICAgICBOYXRpdmVCYXNpY0RhdGEgbmF0aXZlQmFzaWNEYXRhLAogICAgICBOYXRpdmVEYXRhQnVpbGRlciBuYXRpdmVEYXRhQnVpbGRlciwKICAgICAgQW5ub3RhdGlvbnNEYXRhQnVpbGRlciBhbm5vdGF0aW9uc0RhdGFCdWlsZGVyLAogICAgICBJbXBhY3RUcmFuc2Zvcm1lciBpbXBhY3RUcmFuc2Zvcm1lciwKICAgICAgTWFwPEVudGl0eSwgV29ybGRJbXBhY3Q+IGltcGFjdENhY2hlLAogICAgICBLRmllbGRBbmFseXNpcyBmaWVsZEFuYWx5c2lzKSB7CiAgICByZXR1cm4gbmV3IEtlcm5lbFdvcmtJdGVtQnVpbGRlcigKICAgICAgICBfY29tcGlsZXJUYXNrLAogICAgICAgIGVsZW1lbnRNYXAsCiAgICAgICAgbmF0aXZlQmFzaWNEYXRhLAogICAgICAgIG5hdGl2ZURhdGFCdWlsZGVyLAogICAgICAgIGFubm90YXRpb25zRGF0YUJ1aWxkZXIsCiAgICAgICAgaW1wYWN0VHJhbnNmb3JtZXIsCiAgICAgICAgY2xvc3VyZU1vZGVscywKICAgICAgICBpbXBhY3RDYWNoZSwKICAgICAgICBmaWVsZEFuYWx5c2lzLAogICAgICAgIF9tb2R1bGFyU3RyYXRlZ3ksCiAgICAgICAgX2lyQW5ub3RhdGlvbkRhdGEpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3NRdWVyaWVzIGNyZWF0ZUNsYXNzUXVlcmllcygpIHsKICAgIHJldHVybiBuZXcgS2VybmVsQ2xhc3NRdWVyaWVzKGVsZW1lbnRNYXApOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlU3BhbiBzcGFuRnJvbVNwYW5uYWJsZShTcGFubmFibGUgc3Bhbm5hYmxlLCBFbnRpdHkgY3VycmVudEVsZW1lbnQpIHsKICAgIHJldHVybiBfZWxlbWVudE1hcC5nZXRTb3VyY2VTcGFuKHNwYW5uYWJsZSwgY3VycmVudEVsZW1lbnQpOwogIH0KfQoKY2xhc3MgS2VybmVsV29ya0l0ZW1CdWlsZGVyIGltcGxlbWVudHMgV29ya0l0ZW1CdWlsZGVyIHsKICBmaW5hbCBDb21waWxlclRhc2sgX2NvbXBpbGVyVGFzazsKICBmaW5hbCBLZXJuZWxUb0VsZW1lbnRNYXBJbXBsIF9lbGVtZW50TWFwOwogIGZpbmFsIEltcGFjdFRyYW5zZm9ybWVyIF9pbXBhY3RUcmFuc2Zvcm1lcjsKICBmaW5hbCBOYXRpdmVNZW1iZXJSZXNvbHZlciBfbmF0aXZlTWVtYmVyUmVzb2x2ZXI7CiAgZmluYWwgQW5ub3RhdGlvbnNEYXRhQnVpbGRlciBfYW5ub3RhdGlvbnNEYXRhQnVpbGRlcjsKICBmaW5hbCBNYXA8TWVtYmVyRW50aXR5LCBDbG9zdXJlU2NvcGVNb2RlbD4gX2Nsb3N1cmVNb2RlbHM7CiAgZmluYWwgTWFwPEVudGl0eSwgV29ybGRJbXBhY3Q+IF9pbXBhY3RDYWNoZTsKICBmaW5hbCBLRmllbGRBbmFseXNpcyBfZmllbGRBbmFseXNpczsKICBmaW5hbCBNb2R1bGFyU3RyYXRlZ3kgX21vZHVsYXJTdHJhdGVneTsKICBmaW5hbCBJckFubm90YXRpb25EYXRhIF9pckFubm90YXRpb25EYXRhOwoKICBLZXJuZWxXb3JrSXRlbUJ1aWxkZXIoCiAgICAgIHRoaXMuX2NvbXBpbGVyVGFzaywKICAgICAgdGhpcy5fZWxlbWVudE1hcCwKICAgICAgTmF0aXZlQmFzaWNEYXRhIG5hdGl2ZUJhc2ljRGF0YSwKICAgICAgTmF0aXZlRGF0YUJ1aWxkZXIgbmF0aXZlRGF0YUJ1aWxkZXIsCiAgICAgIHRoaXMuX2Fubm90YXRpb25zRGF0YUJ1aWxkZXIsCiAgICAgIHRoaXMuX2ltcGFjdFRyYW5zZm9ybWVyLAogICAgICB0aGlzLl9jbG9zdXJlTW9kZWxzLAogICAgICB0aGlzLl9pbXBhY3RDYWNoZSwKICAgICAgdGhpcy5fZmllbGRBbmFseXNpcywKICAgICAgdGhpcy5fbW9kdWxhclN0cmF0ZWd5LAogICAgICB0aGlzLl9pckFubm90YXRpb25EYXRhKQogICAgICA6IF9uYXRpdmVNZW1iZXJSZXNvbHZlciA9IG5ldyBLZXJuZWxOYXRpdmVNZW1iZXJSZXNvbHZlcigKICAgICAgICAgICAgX2VsZW1lbnRNYXAsIG5hdGl2ZUJhc2ljRGF0YSwgbmF0aXZlRGF0YUJ1aWxkZXIpOwoKICBAb3ZlcnJpZGUKICBXb3JrSXRlbSBjcmVhdGVXb3JrSXRlbShNZW1iZXJFbnRpdHkgZW50aXR5KSB7CiAgICByZXR1cm4gbmV3IEtlcm5lbFdvcmtJdGVtKAogICAgICAgIF9jb21waWxlclRhc2ssCiAgICAgICAgX2VsZW1lbnRNYXAsCiAgICAgICAgX2ltcGFjdFRyYW5zZm9ybWVyLAogICAgICAgIF9uYXRpdmVNZW1iZXJSZXNvbHZlciwKICAgICAgICBfYW5ub3RhdGlvbnNEYXRhQnVpbGRlciwKICAgICAgICBlbnRpdHksCiAgICAgICAgX2Nsb3N1cmVNb2RlbHMsCiAgICAgICAgX2ltcGFjdENhY2hlLAogICAgICAgIF9maWVsZEFuYWx5c2lzLAogICAgICAgIF9tb2R1bGFyU3RyYXRlZ3ksCiAgICAgICAgX2lyQW5ub3RhdGlvbkRhdGEpOwogIH0KfQoKY2xhc3MgS2VybmVsV29ya0l0ZW0gaW1wbGVtZW50cyBXb3JrSXRlbSB7CiAgZmluYWwgQ29tcGlsZXJUYXNrIF9jb21waWxlclRhc2s7CiAgZmluYWwgS2VybmVsVG9FbGVtZW50TWFwSW1wbCBfZWxlbWVudE1hcDsKICBmaW5hbCBJbXBhY3RUcmFuc2Zvcm1lciBfaW1wYWN0VHJhbnNmb3JtZXI7CiAgZmluYWwgTmF0aXZlTWVtYmVyUmVzb2x2ZXIgX25hdGl2ZU1lbWJlclJlc29sdmVyOwogIGZpbmFsIEFubm90YXRpb25zRGF0YUJ1aWxkZXIgX2Fubm90YXRpb25zRGF0YUJ1aWxkZXI7CiAgQG92ZXJyaWRlCiAgZmluYWwgTWVtYmVyRW50aXR5IGVsZW1lbnQ7CiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwgQ2xvc3VyZVNjb3BlTW9kZWw+IF9jbG9zdXJlTW9kZWxzOwogIGZpbmFsIE1hcDxFbnRpdHksIFdvcmxkSW1wYWN0PiBfaW1wYWN0Q2FjaGU7CiAgZmluYWwgS0ZpZWxkQW5hbHlzaXMgX2ZpZWxkQW5hbHlzaXM7CiAgZmluYWwgTW9kdWxhclN0cmF0ZWd5IF9tb2R1bGFyU3RyYXRlZ3k7CiAgZmluYWwgSXJBbm5vdGF0aW9uRGF0YSBfaXJBbm5vdGF0aW9uRGF0YTsKCiAgS2VybmVsV29ya0l0ZW0oCiAgICAgIHRoaXMuX2NvbXBpbGVyVGFzaywKICAgICAgdGhpcy5fZWxlbWVudE1hcCwKICAgICAgdGhpcy5faW1wYWN0VHJhbnNmb3JtZXIsCiAgICAgIHRoaXMuX25hdGl2ZU1lbWJlclJlc29sdmVyLAogICAgICB0aGlzLl9hbm5vdGF0aW9uc0RhdGFCdWlsZGVyLAogICAgICB0aGlzLmVsZW1lbnQsCiAgICAgIHRoaXMuX2Nsb3N1cmVNb2RlbHMsCiAgICAgIHRoaXMuX2ltcGFjdENhY2hlLAogICAgICB0aGlzLl9maWVsZEFuYWx5c2lzLAogICAgICB0aGlzLl9tb2R1bGFyU3RyYXRlZ3ksCiAgICAgIHRoaXMuX2lyQW5ub3RhdGlvbkRhdGEpOwoKICBAb3ZlcnJpZGUKICBXb3JsZEltcGFjdCBydW4oKSB7CiAgICByZXR1cm4gX2NvbXBpbGVyVGFzay5tZWFzdXJlKCgpIHsKICAgICAgaXIuTWVtYmVyIG5vZGUgPSBfZWxlbWVudE1hcC5nZXRNZW1iZXJOb2RlKGVsZW1lbnQpOwogICAgICBfbmF0aXZlTWVtYmVyUmVzb2x2ZXIucmVzb2x2ZU5hdGl2ZU1lbWJlcihub2RlLCBfaXJBbm5vdGF0aW9uRGF0YSk7CgogICAgICBMaXN0PFByYWdtYUFubm90YXRpb25EYXRhPiBwcmFnbWFBbm5vdGF0aW9uRGF0YSA9CiAgICAgICAgICBfbW9kdWxhclN0cmF0ZWd5LmdldFByYWdtYUFubm90YXRpb25EYXRhKG5vZGUpOwoKICAgICAgRW51bVNldDxQcmFnbWFBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucyA9IHByb2Nlc3NNZW1iZXJBbm5vdGF0aW9ucygKICAgICAgICAgIF9lbGVtZW50TWFwLm9wdGlvbnMsCiAgICAgICAgICBfZWxlbWVudE1hcC5yZXBvcnRlciwKICAgICAgICAgIF9lbGVtZW50TWFwLmdldE1lbWJlck5vZGUoZWxlbWVudCksCiAgICAgICAgICBwcmFnbWFBbm5vdGF0aW9uRGF0YSk7CiAgICAgIF9hbm5vdGF0aW9uc0RhdGFCdWlsZGVyLnJlZ2lzdGVyUHJhZ21hQW5ub3RhdGlvbnMoZWxlbWVudCwgYW5ub3RhdGlvbnMpOwoKICAgICAgTW9kdWxhck1lbWJlckRhdGEgbW9kdWxhck1lbWJlckRhdGEgPQogICAgICAgICAgX21vZHVsYXJTdHJhdGVneS5nZXRNb2R1bGFyTWVtYmVyRGF0YShub2RlLCBhbm5vdGF0aW9ucyk7CiAgICAgIFNjb3BlTW9kZWwgc2NvcGVNb2RlbCA9IG1vZHVsYXJNZW1iZXJEYXRhLnNjb3BlTW9kZWw7CiAgICAgIGlmIChzY29wZU1vZGVsLmNsb3N1cmVTY29wZU1vZGVsICE9IG51bGwpIHsKICAgICAgICBfY2xvc3VyZU1vZGVsc1tlbGVtZW50XSA9IHNjb3BlTW9kZWwuY2xvc3VyZVNjb3BlTW9kZWw7CiAgICAgIH0KICAgICAgaWYgKGVsZW1lbnQuaXNGaWVsZCAmJiAhZWxlbWVudC5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgICAgX2ZpZWxkQW5hbHlzaXMucmVnaXN0ZXJTdGF0aWNGaWVsZCgKICAgICAgICAgICAgZWxlbWVudCwgc2NvcGVNb2RlbC5pbml0aWFsaXplckNvbXBsZXhpdHkpOwogICAgICB9CiAgICAgIEltcGFjdEJ1aWxkZXJEYXRhIGltcGFjdEJ1aWxkZXJEYXRhID0gbW9kdWxhck1lbWJlckRhdGEuaW1wYWN0QnVpbGRlckRhdGE7CiAgICAgIHJldHVybiBfY29tcGlsZXJUYXNrLm1lYXN1cmVTdWJ0YXNrKCd3b3JsZEltcGFjdCcsICgpIHsKICAgICAgICBSZXNvbHV0aW9uSW1wYWN0IGltcGFjdCA9IF9lbGVtZW50TWFwLmNvbXB1dGVXb3JsZEltcGFjdCgKICAgICAgICAgICAgZWxlbWVudCwKICAgICAgICAgICAgc2NvcGVNb2RlbC52YXJpYWJsZVNjb3BlTW9kZWwsCiAgICAgICAgICAgIG5ldyBTZXQ8UHJhZ21hQW5ub3RhdGlvbj4uZnJvbSgKICAgICAgICAgICAgICAgIGFubm90YXRpb25zLml0ZXJhYmxlKFByYWdtYUFubm90YXRpb24udmFsdWVzKSksCiAgICAgICAgICAgIGltcGFjdEJ1aWxkZXJEYXRhOiBpbXBhY3RCdWlsZGVyRGF0YSk7CiAgICAgICAgV29ybGRJbXBhY3Qgd29ybGRJbXBhY3QgPQogICAgICAgICAgICBfaW1wYWN0VHJhbnNmb3JtZXIudHJhbnNmb3JtUmVzb2x1dGlvbkltcGFjdChpbXBhY3QpOwogICAgICAgIGlmIChfaW1wYWN0Q2FjaGUgIT0gbnVsbCkgewogICAgICAgICAgX2ltcGFjdENhY2hlW2VsZW1lbnRdID0gd29ybGRJbXBhY3Q7CiAgICAgICAgfQogICAgICAgIHJldHVybiB3b3JsZEltcGFjdDsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdLZXJuZWxXb3JrSXRlbSgkZWxlbWVudCknOwp9CgovLy8gSWYgYHRydWVgIGtlcm5lbCBpbXBhY3RzIGFyZSBjb21wdXRlZCBhcyBbSW1wYWN0RGF0YV0gZGlyZWN0bHkgb24ga2VybmVsCi8vLyBhbmQgY29udmVydGVkIHRvIHRoZSBLIG1vZGVsIGFmdGVyd2FyZHMuIFRoaXMgaXMgYSBwcmUtc3RlcCB0byBtb2R1bGFyaXppbmcKLy8vIHRoZSB3b3JsZCBpbXBhY3QgY29tcHV0YXRpb24uCmJvb2wgdXNlSW1wYWN0RGF0YUZvclRlc3RpbmcgPSBmYWxzZTsKCmNsYXNzIEtlcm5lbE1vZHVsYXJTdHJhdGVneSBleHRlbmRzIE1vZHVsYXJTdHJhdGVneSB7CiAgZmluYWwgQ29tcGlsZXJUYXNrIF9jb21waWxlclRhc2s7CiAgZmluYWwgS2VybmVsVG9FbGVtZW50TWFwSW1wbCBfZWxlbWVudE1hcDsKCiAgS2VybmVsTW9kdWxhclN0cmF0ZWd5KHRoaXMuX2NvbXBpbGVyVGFzaywgdGhpcy5fZWxlbWVudE1hcCk7CgogIEBvdmVycmlkZQogIExpc3Q8UHJhZ21hQW5ub3RhdGlvbkRhdGE+IGdldFByYWdtYUFubm90YXRpb25EYXRhKGlyLk1lbWJlciBub2RlKSB7CiAgICBpZiAoX2VsZW1lbnRNYXAub3B0aW9ucy51c2VDRkVDb25zdGFudHMpIHsKICAgICAgcmV0dXJuIGNvbXB1dGVQcmFnbWFBbm5vdGF0aW9uRGF0YUZyb21Jcihub2RlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBjb21wdXRlUHJhZ21hQW5ub3RhdGlvbkRhdGEoX2VsZW1lbnRNYXAuY29tbW9uRWxlbWVudHMsCiAgICAgICAgICBfZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQsIF9lbGVtZW50TWFwLmdldE1lbWJlcihub2RlKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBNb2R1bGFyTWVtYmVyRGF0YSBnZXRNb2R1bGFyTWVtYmVyRGF0YSgKICAgICAgaXIuTWVtYmVyIG5vZGUsIEVudW1TZXQ8UHJhZ21hQW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMpIHsKICAgIFNjb3BlTW9kZWwgc2NvcGVNb2RlbCA9IF9jb21waWxlclRhc2subWVhc3VyZVN1YnRhc2soJ2Nsb3N1cmVzJywKICAgICAgICAoKSA9PiBuZXcgU2NvcGVNb2RlbC5mcm9tKG5vZGUsIF9lbGVtZW50TWFwLmNvbnN0YW50RXZhbHVhdG9yKSk7CiAgICBJbXBhY3RCdWlsZGVyRGF0YSBpbXBhY3RCdWlsZGVyRGF0YTsKICAgIGlmICh1c2VJbXBhY3REYXRhRm9yVGVzdGluZykgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBbHdheXMgY3JlYXRlIGFuZCB1c2UgdGhlIFtJbXBhY3RCdWlsZGVyRGF0YV0uCiAgICAgIC8vIEN1cnJlbnRseSBpdCBpcyBhIGJpdCBoYWxmLWJha2VkIHNpbmNlIHdlIGNhbm5vdCBjb21wdXRlIGRhdGEgdGhhdAogICAgICAvLyBkZXBlbmQgb24gbWV0YWRhdGEsIHNvIHRoZXNlIHBhcnRzIG9mIHRoZSBpbXBhY3QgZGF0YSBuZWVkIHRvIGJlCiAgICAgIC8vIGNvbXB1dGVkIGR1cmluZyBjb252ZXJzaW9uIHRvIFtSZXNvbHV0aW9uSW1wYWN0XS4KICAgICAgaW1wYWN0QnVpbGRlckRhdGEgPSBfY29tcGlsZXJUYXNrLm1lYXN1cmVTdWJ0YXNrKCd3b3JsZEltcGFjdCcsICgpIHsKICAgICAgICBJbXBhY3RCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSW1wYWN0QnVpbGRlcihfZWxlbWVudE1hcC50eXBlRW52aXJvbm1lbnQsCiAgICAgICAgICAgIF9lbGVtZW50TWFwLmNsYXNzSGllcmFyY2h5LCBzY29wZU1vZGVsLnZhcmlhYmxlU2NvcGVNb2RlbCwKICAgICAgICAgICAgdXNlQXNzZXJ0czogX2VsZW1lbnRNYXAub3B0aW9ucy5lbmFibGVVc2VyQXNzZXJ0aW9ucywKICAgICAgICAgICAgaW5mZXJFZmZlY3RpdmVseUZpbmFsVmFyaWFibGVUeXBlczoKICAgICAgICAgICAgICAgICFhbm5vdGF0aW9ucy5jb250YWlucyhQcmFnbWFBbm5vdGF0aW9uLmRpc2FibGVGaW5hbCkpOwogICAgICAgIHJldHVybiBidWlsZGVyLmNvbXB1dGVJbXBhY3Qobm9kZSk7CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIG5ldyBNb2R1bGFyTWVtYmVyRGF0YShzY29wZU1vZGVsLCBpbXBhY3RCdWlsZGVyRGF0YSk7CiAgfQp9CoFtAE5OPAEqASgBGSUkHx4iGzYkIRolJCE0HB0rKUArLik1Kz8iGis0KSgfHRsgFgFOIDwcHiY0ATIBQQEkJgE8QiMSS04EAQw8NiRGBjpABAFIAUUBDE8BDEMBDDABNAEMMCk2IQQBDEA5AQxPJjoEAQw2NwQBDEEsBAEMPEgxKzQEAQxDIAEMNycrNS8uKDkxNT8zIysSFCcaIxkbIB0YGyIeICUfFwQBDDMnKzUrLCYmFxQZGyAbFxUXGhwEAQwmLwQBDE1BBAIBOSQsLjQ4PS8nKiwBGRoYJyskHxsZGx0eQD4BDDEfFxUcHyEQGBYYGhwEAgErJCwuNDgMHj0vJyosARIaGB8iJBQbGRsdHwEMFiY7SgE4OgFIHyAuIU8BLEQ8MkAIOiw4CFE+QhUrLEAzIkIkLwocCggEAQwzAgFNUCImATYkLAE/AQxHLzYNRUgGBAEMKj9FSSkjTUxKO0tPR0IwRywKBkEEAgEwcGFja2FnZTpjb21waWxlci9zcmMva2VybmVsL2tlcm5lbF9zdHJhdGVneS5kYXJ0MHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2tlcm5lbC9sb2FkZXIuZGFydJyCLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5saWJyYXJ5X2xvYWRlcjsKCmltcG9ydCAnZGFydDphc3luYyc7CgppbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvdXRpbHMuZGFydCc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2JpbmFyeS9hc3RfZnJvbV9iaW5hcnkuZGFydCcgc2hvdyBCaW5hcnlCdWlsZGVyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2JpbmFyeS9hc3RfdG9fYmluYXJ5LmRhcnQnIHNob3cgQmluYXJ5UHJpbnRlcjsKCmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV91bnN0YWJsZS9kYXJ0MmpzLmRhcnQnIGFzIGZlOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2tlcm5lbC5kYXJ0JyBoaWRlIExpYnJhcnlEZXBlbmRlbmN5LCBDb21iaW5hdG9yOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3RhcmdldC90YXJnZXRzLmRhcnQnIGhpZGUgRGlhZ25vc3RpY1JlcG9ydGVyOwoKaW1wb3J0ICcuLi8uLi9jb21waWxlcl9uZXcuZGFydCcgYXMgYXBpOwppbXBvcnQgJy4uL2NvbW1vbi90YXNrcy5kYXJ0JyBzaG93IENvbXBpbGVyVGFzaywgTWVhc3VyZXI7CmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vdXRpbC9zaW5rX2FkYXB0ZXIuZGFydCc7CgppbXBvcnQgJ2Zyb250X2VuZF9hZGFwdGVyLmRhcnQnOwppbXBvcnQgJ2RhcnQyanNfdGFyZ2V0LmRhcnQnIHNob3cgRGFydDJqc1RhcmdldDsKCi8vLyBBIHRhc2sgdGhhdCBwcm9kdWNlcyB0aGUga2VybmVsIElSIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbi4KLy8vCi8vLyBJdCBzdXBwb3J0cyBsb2FkaW5nIGJvdGggLmRhcnQgc291cmNlIGZpbGVzIG9yIHByZS1jb21waWxlZCAuZGlsbCBmaWxlcy4KLy8vIFdoZW4gZ2l2ZW4gLmRhcnQgc291cmNlIGZpbGVzLCBpdCBpbnZva2VzIHRoZSBjb21tb24gZnJvbnQtZW5kIChDRkUpCi8vLyB0byBwcm9kdWNlIHRoZSBjb3JyZXNwb25kaW5nIGtlcm5lbCBJUiByZXByZXNlbnRhdGlvbi4KY2xhc3MgS2VybmVsTG9hZGVyVGFzayBleHRlbmRzIENvbXBpbGVyVGFzayB7CiAgZmluYWwgRGlhZ25vc3RpY1JlcG9ydGVyIF9yZXBvcnRlcjsKCiAgZmluYWwgYXBpLkNvbXBpbGVySW5wdXQgX2NvbXBpbGVySW5wdXQ7CiAgZmluYWwgYXBpLkNvbXBpbGVyT3V0cHV0IF9jb21waWxlck91dHB1dDsKCiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwoKICAvLy8gU2hhcmVkIHN0YXRlIGJldHdlZW4gY29tcGlsYXRpb25zLgogIGZlLkluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZSBpbml0aWFsaXplZENvbXBpbGVyU3RhdGU7CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSB0aGlzIHdoZW4gIzM0OTQyIGlzIGZpeGVkLgogIC8vLyBGb3JjZSBpbi1tZW1vcnkgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gb2YgdGhlIGxvYWRlZCBjb21wb25lbnQuCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCBmb3IgdGVzdGluZy4KICBib29sIGZvcmNlU2VyaWFsaXphdGlvbiA9IGZhbHNlOwoKICBLZXJuZWxMb2FkZXJUYXNrKHRoaXMuX29wdGlvbnMsIHRoaXMuX2NvbXBpbGVySW5wdXQsIHRoaXMuX2NvbXBpbGVyT3V0cHV0LAogICAgICB0aGlzLl9yZXBvcnRlciwgTWVhc3VyZXIgbWVhc3VyZXIpCiAgICAgIDogaW5pdGlhbGl6ZWRDb21waWxlclN0YXRlID0gX29wdGlvbnMua2VybmVsSW5pdGlhbGl6ZWRDb21waWxlclN0YXRlLAogICAgICAgIHN1cGVyKG1lYXN1cmVyKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+ICdrZXJuZWwgbG9hZGVyJzsKCiAgLy8vIExvYWRzIGFuIGVudGlyZSBLZXJuZWwgW0NvbXBvbmVudF0gZnJvbSBhIGZpbGUgb24gZGlzay4KICBGdXR1cmU8S2VybmVsUmVzdWx0PiBsb2FkKFVyaSByZXNvbHZlZFVyaSkgewogICAgcmV0dXJuIG1lYXN1cmUoKCkgYXN5bmMgewogICAgICBTdHJpbmcgdGFyZ2V0TmFtZSA9CiAgICAgICAgICBfb3B0aW9ucy5jb21waWxlRm9yU2VydmVyID8gImRhcnQyanNfc2VydmVyIiA6ICJkYXJ0MmpzIjsKICAgICAgU3RyaW5nIHBsYXRmb3JtID0gJyR7dGFyZ2V0TmFtZX1fcGxhdGZvcm0uZGlsbCc7CiAgICAgIHZhciBpc0RpbGwgPSByZXNvbHZlZFVyaS5wYXRoLmVuZHNXaXRoKCcuZGlsbCcpOwogICAgICBpci5Db21wb25lbnQgY29tcG9uZW50OwogICAgICBpZiAoaXNEaWxsKSB7CiAgICAgICAgY29tcG9uZW50ID0gbmV3IGlyLkNvbXBvbmVudCgpOwogICAgICAgIEZ1dHVyZTx2b2lkPiByZWFkKFVyaSB1cmkpIGFzeW5jIHsKICAgICAgICAgIGFwaS5JbnB1dCBpbnB1dCA9IGF3YWl0IF9jb21waWxlcklucHV0LnJlYWRGcm9tVXJpKHVyaSwKICAgICAgICAgICAgICBpbnB1dEtpbmQ6IGFwaS5JbnB1dEtpbmQuYmluYXJ5KTsKICAgICAgICAgIG5ldyBCaW5hcnlCdWlsZGVyKGlucHV0LmRhdGEpLnJlYWRDb21wb25lbnQoY29tcG9uZW50KTsKICAgICAgICB9CgogICAgICAgIGF3YWl0IHJlYWQocmVzb2x2ZWRVcmkpOwogICAgICAgIGlmIChfb3B0aW9ucy5kaWxsRGVwZW5kZW5jaWVzICE9IG51bGwpIHsKICAgICAgICAgIC8vIE1vZHVsYXIgY29tcGlsZXMgZG8gbm90IGluY2x1ZGUgdGhlIHBsYXRmb3JtIG9uIHRoZSBpbnB1dCBkaWxsCiAgICAgICAgICAvLyBlaXRoZXIuCiAgICAgICAgICBpZiAoX29wdGlvbnMucGxhdGZvcm1CaW5hcmllcyAhPSBudWxsKSB7CiAgICAgICAgICAgIGF3YWl0IHJlYWQoX29wdGlvbnMucGxhdGZvcm1CaW5hcmllcy5yZXNvbHZlKHBsYXRmb3JtKSk7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKFVyaSBkZXBlbmRlbmN5IGluIF9vcHRpb25zLmRpbGxEZXBlbmRlbmNpZXMpIHsKICAgICAgICAgICAgYXdhaXQgcmVhZChkZXBlbmRlbmN5KTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFRoaXMgaXMgbm90IGV4cGVjdGVkIHRvIGJlIG51bGwgd2hlbiBjcmVhdGluZyBhIHdob2xlLXByb2dyYW0gLmRpbGwKICAgICAgICAvLyBmaWxlLCBidXQgbmVlZHMgdG8gYmUgY2hlY2tlZCBmb3IgbW9kdWxhciBpbnB1dHMuCiAgICAgICAgaWYgKGNvbXBvbmVudC5tYWluTWV0aG9kID09IG51bGwpIHsKICAgICAgICAgIC8vIFRPRE8oc2lnbXVuZCk6IG1vdmUgdGhpcyBzbyB0aGF0IHdlIHVzZSB0aGUgc2FtZSBlcnJvciB0ZW1wbGF0ZQogICAgICAgICAgLy8gZnJvbSB0aGUgQ0ZFLgogICAgICAgICAgX3JlcG9ydGVyLnJlcG9ydEVycm9yKF9yZXBvcnRlci5jcmVhdGVNZXNzYWdlKE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwKICAgICAgICAgICAgICBNZXNzYWdlS2luZC5HRU5FUklDLCB7J3RleHQnOiAiTm8gJ21haW4nIG1ldGhvZCBmb3VuZC4ifSkpOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIExpc3Q8VXJpPiBkZXBlbmRlbmNpZXMgPSBbXTsKICAgICAgICBpZiAoX29wdGlvbnMucGxhdGZvcm1CaW5hcmllcyAhPSBudWxsKSB7CiAgICAgICAgICBkZXBlbmRlbmNpZXMuYWRkKF9vcHRpb25zLnBsYXRmb3JtQmluYXJpZXMucmVzb2x2ZShwbGF0Zm9ybSkpOwogICAgICAgIH0KICAgICAgICBpZiAoX29wdGlvbnMuZGlsbERlcGVuZGVuY2llcyAhPSBudWxsKSB7CiAgICAgICAgICBkZXBlbmRlbmNpZXMuYWRkQWxsKF9vcHRpb25zLmRpbGxEZXBlbmRlbmNpZXMpOwogICAgICAgIH0KICAgICAgICBpbml0aWFsaXplZENvbXBpbGVyU3RhdGUgPSBmZS5pbml0aWFsaXplQ29tcGlsZXIoCiAgICAgICAgICAgIGluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZSwKICAgICAgICAgICAgbmV3IERhcnQyanNUYXJnZXQodGFyZ2V0TmFtZSwgbmV3IFRhcmdldEZsYWdzKCkpLAogICAgICAgICAgICBfb3B0aW9ucy5saWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpLAogICAgICAgICAgICBkZXBlbmRlbmNpZXMsCiAgICAgICAgICAgIF9vcHRpb25zLnBhY2thZ2VDb25maWcsCiAgICAgICAgICAgIGV4cGVyaW1lbnRhbEZsYWdzOiBfb3B0aW9ucy5sYW5ndWFnZUV4cGVyaW1lbnRzLAogICAgICAgICAgICBlbmFibGVBc3NlcnRzOiBfb3B0aW9ucy5lbmFibGVVc2VyQXNzZXJ0aW9ucyk7CiAgICAgICAgY29tcG9uZW50ID0gYXdhaXQgZmUuY29tcGlsZSgKICAgICAgICAgICAgaW5pdGlhbGl6ZWRDb21waWxlclN0YXRlLAogICAgICAgICAgICBmYWxzZSwKICAgICAgICAgICAgbmV3IENvbXBpbGVyRmlsZVN5c3RlbShfY29tcGlsZXJJbnB1dCksCiAgICAgICAgICAgIChlKSA9PiByZXBvcnRGcm9udEVuZE1lc3NhZ2UoX3JlcG9ydGVyLCBlKSwKICAgICAgICAgICAgcmVzb2x2ZWRVcmkpOwogICAgICB9CiAgICAgIGlmIChjb21wb25lbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CgogICAgICBpZiAoX29wdGlvbnMuY2ZlT25seSkgewogICAgICAgIG1lYXN1cmVTdWJ0YXNrKCdzZXJpYWxpemUgZGlsbCcsICgpIHsKICAgICAgICAgIF9yZXBvcnRlci5sb2coJ1dyaXRpbmcgZGlsbCB0byAke19vcHRpb25zLm91dHB1dFVyaX0nKTsKICAgICAgICAgIGFwaS5CaW5hcnlPdXRwdXRTaW5rIGRpbGxPdXRwdXQgPQogICAgICAgICAgICAgIF9jb21waWxlck91dHB1dC5jcmVhdGVCaW5hcnlTaW5rKF9vcHRpb25zLm91dHB1dFVyaSk7CiAgICAgICAgICBCaW5hcnlPdXRwdXRTaW5rQWRhcHRlciBpclNpbmsgPQogICAgICAgICAgICAgIG5ldyBCaW5hcnlPdXRwdXRTaW5rQWRhcHRlcihkaWxsT3V0cHV0KTsKICAgICAgICAgIEJpbmFyeVByaW50ZXIgcHJpbnRlciA9IG5ldyBCaW5hcnlQcmludGVyKGlyU2luayk7CiAgICAgICAgICBwcmludGVyLndyaXRlQ29tcG9uZW50RmlsZShjb21wb25lbnQpOwogICAgICAgICAgaXJTaW5rLmNsb3NlKCk7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIGlmIChmb3JjZVNlcmlhbGl6YXRpb24pIHsKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhpcyB3aGVuICMzNDk0MiBpcyBmaXhlZC4KICAgICAgICBMaXN0PGludD4gZGF0YSA9IHNlcmlhbGl6ZUNvbXBvbmVudChjb21wb25lbnQpOwogICAgICAgIGNvbXBvbmVudCA9IG5ldyBpci5Db21wb25lbnQoKTsKICAgICAgICBuZXcgQmluYXJ5QnVpbGRlcihkYXRhKS5yZWFkQ29tcG9uZW50KGNvbXBvbmVudCk7CiAgICAgIH0KICAgICAgcmV0dXJuIF90b1Jlc3VsdChjb21wb25lbnQpOwogICAgfSk7CiAgfQoKICBLZXJuZWxSZXN1bHQgX3RvUmVzdWx0KGlyLkNvbXBvbmVudCBjb21wb25lbnQpIHsKICAgIFVyaSByb290TGlicmFyeVVyaSA9IG51bGw7CiAgICBJdGVyYWJsZTxpci5MaWJyYXJ5PiBsaWJyYXJpZXMgPSBjb21wb25lbnQubGlicmFyaWVzOwogICAgaWYgKGNvbXBvbmVudC5tYWluTWV0aG9kICE9IG51bGwpIHsKICAgICAgdmFyIHJvb3QgPSBjb21wb25lbnQubWFpbk1ldGhvZC5lbmNsb3NpbmdMaWJyYXJ5OwogICAgICByb290TGlicmFyeVVyaSA9IHJvb3QuaW1wb3J0VXJpOwoKICAgICAgLy8gRmlsdGVyIHVucmVhY2hhYmxlIGxpYnJhcmllczogW0NvbXBvbmVudF0gd2FzIGJ1aWx0IGJ5IGxpbmtpbmcgaW4gdGhlCiAgICAgIC8vIGVudGlyZSBTREsgbGlicmFyaWVzLCBub3QgYWxsIG9mIHRoZW0gYXJlIHVzZWQuIFdlIGluY2x1ZGUgYW55dGhpbmcKICAgICAgLy8gdGhhdCBpcyByZWFjaGFibGUgZnJvbSBgbWFpbmAuIE5vdGUgdGhhdCBhbGwgaW50ZXJuYWwgbGlicmFyaWVzIHRoYXQKICAgICAgLy8gdGhlIGNvbXBpbGVyIHJlbGllcyBvbiBhcmUgcmVhY2hhYmxlIGZyb20gYGRhcnQ6Y29yZWAuCiAgICAgIHZhciBzZWVuID0gbmV3IFNldDxMaWJyYXJ5PigpOwogICAgICBzZWFyY2goaXIuTGlicmFyeSBjdXJyZW50KSB7CiAgICAgICAgaWYgKCFzZWVuLmFkZChjdXJyZW50KSkgcmV0dXJuOwogICAgICAgIGZvciAoaXIuTGlicmFyeURlcGVuZGVuY3kgZGVwIGluIGN1cnJlbnQuZGVwZW5kZW5jaWVzKSB7CiAgICAgICAgICBzZWFyY2goZGVwLnRhcmdldExpYnJhcnkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgc2VhcmNoKHJvb3QpOwoKICAgICAgLy8gTGlicmFyaWVzIGRlcGVuZGVuY2llcyBkbyBub3Qgc2hvdyBpbXBsaWNpdCBpbXBvcnRzIHRvIGBkYXJ0OmNvcmVgLgogICAgICB2YXIgZGFydENvcmUgPSBjb21wb25lbnQubGlicmFyaWVzLmZpcnN0V2hlcmUoKGxpYikgewogICAgICAgIHJldHVybiBsaWIuaW1wb3J0VXJpLnNjaGVtZSA9PSAnZGFydCcgJiYgbGliLmltcG9ydFVyaS5wYXRoID09ICdjb3JlJzsKICAgICAgfSk7CiAgICAgIHNlYXJjaChkYXJ0Q29yZSk7CgogICAgICBsaWJyYXJpZXMgPSBsaWJyYXJpZXMud2hlcmUoc2Vlbi5jb250YWlucyk7CiAgICB9CiAgICByZXR1cm4gbmV3IEtlcm5lbFJlc3VsdChjb21wb25lbnQsIHJvb3RMaWJyYXJ5VXJpLAogICAgICAgIGxpYnJhcmllcy5tYXAoKGxpYikgPT4gbGliLmltcG9ydFVyaSkudG9MaXN0KCkpOwogIH0KfQoKLy8vIFJlc3VsdCBvZiBpbnZva2luZyB0aGUgQ0ZFIHRvIHByb2R1Y2UgdGhlIGtlcm5lbCBJUi4KY2xhc3MgS2VybmVsUmVzdWx0IHsKICBmaW5hbCBpci5Db21wb25lbnQgY29tcG9uZW50OwoKICAvLy8gVGhlIFtVcmldIG9mIHRoZSByb290IGxpYnJhcnkgY29udGFpbmluZyBtYWluLgogIGZpbmFsIFVyaSByb290TGlicmFyeVVyaTsKCiAgLy8vIFJldHVybnMgdGhlIFtVcmldcyBvZiBhbGwgbGlicmFyaWVzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZCB0aGF0IGFyZQogIC8vLyByZWFjaGFibGUgZnJvbSB0aGUgW3Jvb3RMaWJyYXJ5VXJpXS4KICAvLy8KICAvLy8gTm90ZSB0aGF0IFtjb21wb25lbnRdIG1heSBjb250YWluIHNvbWUgbGlicmFyaWVzIHRoYXQgYXJlIGV4Y2x1ZGVkIGhlcmUuCiAgZmluYWwgSXRlcmFibGU8VXJpPiBsaWJyYXJpZXM7CgogIEtlcm5lbFJlc3VsdCh0aGlzLmNvbXBvbmVudCwgdGhpcy5yb290TGlicmFyeVVyaSwgdGhpcy5saWJyYXJpZXMpIHsKICAgIGFzc2VydChyb290TGlicmFyeVVyaSAhPSBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdyb290PSRyb290TGlicmFyeVVyaSxsaWJyYXJpZXM9JHtsaWJyYXJpZXN9JzsKfQqAxQBOTjwBIAEVATgoSEYBQEhFASk7GRokASExAUoETUk7LiYBKiwBIgEpOAE8TQYgIwFNKUwZAQwmAT4vHhpENzceFCgrQjBCCgEhMUwVM0UMPiQMCgFPPSxNG09KFwoPJTFJCjE6CjomPjAaJD07JiYTNDgaCCoBHi5CLEQrNz0xGgwIASBCOCg6CCMIBAEzHzooOCcBT01OQCUjKEElCggBFAFNPE8KGAEyBjc5BAIBORUgATUcAUkrBk8hAUYkBAEMRgIBJ3BhY2thZ2U6Y29tcGlsZXIvc3JjL2tlcm5lbC9sb2FkZXIuZGFydDVzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9zZXJpYWxpemF0aW9uL3Rhc2suZGFydJFGLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDphc3luYyc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2JpbmFyeS9hc3RfZnJvbV9iaW5hcnkuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvYmluYXJ5L2FzdF90b19iaW5hcnkuZGFydCcgYXMgaXI7CmltcG9ydCAnLi4vLi4vY29tcGlsZXJfbmV3LmRhcnQnIGFzIGFwaTsKaW1wb3J0ICcuLi9jb21tb24vdGFza3MuZGFydCc7CmltcG9ydCAnLi4vY29tcGlsZXIuZGFydCc7CmltcG9ydCAnLi4vZGlhZ25vc3RpY3MvZGlhZ25vc3RpY19saXN0ZW5lci5kYXJ0JzsKaW1wb3J0ICcuLi9lbnZpcm9ubWVudC5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci9hYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9pbmZlcnJlZF9kYXRhLmRhcnQnOwppbXBvcnQgJy4uL2pzX21vZGVsL2pzX3dvcmxkLmRhcnQnOwppbXBvcnQgJy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vdXRpbC9zaW5rX2FkYXB0ZXIuZGFydCc7CmltcG9ydCAnc2VyaWFsaXphdGlvbi5kYXJ0JzsKCnZvaWQgc2VyaWFsaXplR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMoCiAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLCBEYXRhU2luayBzaW5rKSB7CiAgSnNDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCA9IHJlc3VsdHMuY2xvc2VkV29ybGQ7CiAgSW5mZXJyZWREYXRhIGluZmVycmVkRGF0YSA9IHJlc3VsdHMuaW5mZXJyZWREYXRhOwogIGNsb3NlZFdvcmxkLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICBpbmZlcnJlZERhdGEud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogIHJlc3VsdHMud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogIHNpbmsuY2xvc2UoKTsKfQoKR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgZGVzZXJpYWxpemVHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cygKICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgRGlhZ25vc3RpY1JlcG9ydGVyIHJlcG9ydGVyLAogICAgRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsCiAgICBBYnN0cmFjdFZhbHVlU3RyYXRlZ3kgYWJzdHJhY3RWYWx1ZVN0cmF0ZWd5LAogICAgaXIuQ29tcG9uZW50IGNvbXBvbmVudCwKICAgIERhdGFTb3VyY2Ugc291cmNlKSB7CiAgSnNDbG9zZWRXb3JsZCBuZXdDbG9zZWRXb3JsZCA9IG5ldyBKc0Nsb3NlZFdvcmxkLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgb3B0aW9ucywgcmVwb3J0ZXIsIGVudmlyb25tZW50LCBhYnN0cmFjdFZhbHVlU3RyYXRlZ3ksIGNvbXBvbmVudCwgc291cmNlKTsKICBJbmZlcnJlZERhdGEgbmV3SW5mZXJyZWREYXRhID0KICAgICAgbmV3IEluZmVycmVkRGF0YS5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlLCBuZXdDbG9zZWRXb3JsZCk7CiAgcmV0dXJuIG5ldyBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cy5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgIHNvdXJjZSwgbmV3Q2xvc2VkV29ybGQsIG5ld0luZmVycmVkRGF0YSk7Cn0KCmNsYXNzIFNlcmlhbGl6YXRpb25UYXNrIGV4dGVuZHMgQ29tcGlsZXJUYXNrIHsKICBmaW5hbCBDb21waWxlciBjb21waWxlcjsKCiAgU2VyaWFsaXphdGlvblRhc2sodGhpcy5jb21waWxlciwgTWVhc3VyZXIgbWVhc3VyZXIpIDogc3VwZXIobWVhc3VyZXIpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IG5hbWUgPT4gJ1NlcmlhbGl6YXRpb24nOwoKICB2b2lkIHNlcmlhbGl6ZShHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzKSB7CiAgICBtZWFzdXJlU3VidGFzaygnc2VyaWFsaXplIGRpbGwnLCAoKSB7CiAgICAgIC8vIFRPRE8oc2lnbXVuZCk6IHJlbW92ZSBlbnRpcmVseTogd2Ugd2lsbCBkbyB0aGlzIGltbWVkaWF0ZWx5IGFzIHNvb24gYXMKICAgICAgLy8gd2UgZ2V0IHRoZSBjb21wb25lbnQgaW4gdGhlIGtlcm5lbC9sb2FkZXIuZGFydCB0YXNrIG9uY2Ugd2UgcmVmYWN0b3IKICAgICAgLy8gaG93IHdlIGFwcGx5IG91ciBtb2R1bGFyIGtlcm5lbCB0cmFuc2Zvcm1hdGlvbiBmb3Igc3VwZXIgbWl4aW4gY2FsbHMuCiAgICAgIGNvbXBpbGVyLnJlcG9ydGVyLmxvZygnV3JpdGluZyBkaWxsIHRvICR7Y29tcGlsZXIub3B0aW9ucy5vdXRwdXRVcml9Jyk7CiAgICAgIGFwaS5CaW5hcnlPdXRwdXRTaW5rIGRpbGxPdXRwdXQgPQogICAgICAgICAgY29tcGlsZXIub3V0cHV0UHJvdmlkZXIuY3JlYXRlQmluYXJ5U2luayhjb21waWxlci5vcHRpb25zLm91dHB1dFVyaSk7CiAgICAgIEpzQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQgPSByZXN1bHRzLmNsb3NlZFdvcmxkOwogICAgICBpci5Db21wb25lbnQgY29tcG9uZW50ID0gY2xvc2VkV29ybGQuZWxlbWVudE1hcC5wcm9ncmFtRW52Lm1haW5Db21wb25lbnQ7CiAgICAgIEJpbmFyeU91dHB1dFNpbmtBZGFwdGVyIGlyU2luayA9IG5ldyBCaW5hcnlPdXRwdXRTaW5rQWRhcHRlcihkaWxsT3V0cHV0KTsKICAgICAgaXIuQmluYXJ5UHJpbnRlciBwcmludGVyID0gbmV3IGlyLkJpbmFyeVByaW50ZXIoaXJTaW5rKTsKICAgICAgcHJpbnRlci53cml0ZUNvbXBvbmVudEZpbGUoY29tcG9uZW50KTsKICAgICAgaXJTaW5rLmNsb3NlKCk7CiAgICB9KTsKCiAgICBtZWFzdXJlU3VidGFzaygnc2VyaWFsaXplIGRhdGEnLCAoKSB7CiAgICAgIGNvbXBpbGVyLnJlcG9ydGVyLmxvZygnV3JpdGluZyBkYXRhIHRvICR7Y29tcGlsZXIub3B0aW9ucy53cml0ZURhdGFVcml9Jyk7CiAgICAgIGFwaS5CaW5hcnlPdXRwdXRTaW5rIGRhdGFPdXRwdXQgPSBjb21waWxlci5vdXRwdXRQcm92aWRlcgogICAgICAgICAgLmNyZWF0ZUJpbmFyeVNpbmsoY29tcGlsZXIub3B0aW9ucy53cml0ZURhdGFVcmkpOwogICAgICBEYXRhU2luayBzaW5rID0gbmV3IEJpbmFyeVNpbmsobmV3IEJpbmFyeU91dHB1dFNpbmtBZGFwdGVyKGRhdGFPdXRwdXQpKTsKICAgICAgc2VyaWFsaXplR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMocmVzdWx0cywgc2luayk7CiAgICB9KTsKICB9CgogIEZ1dHVyZTxHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cz4gZGVzZXJpYWxpemUoKSBhc3luYyB7CiAgICBpci5Db21wb25lbnQgY29tcG9uZW50ID0KICAgICAgICBhd2FpdCBtZWFzdXJlSW9TdWJ0YXNrKCdkZXNlcmlhbGl6ZSBkaWxsJywgKCkgYXN5bmMgewogICAgICBjb21waWxlci5yZXBvcnRlci5sb2coJ1JlYWRpbmcgZGlsbCBmcm9tICR7Y29tcGlsZXIub3B0aW9ucy5lbnRyeVBvaW50fScpOwogICAgICBhcGkuSW5wdXQ8TGlzdDxpbnQ+PiBkaWxsSW5wdXQgPSBhd2FpdCBjb21waWxlci5wcm92aWRlci5yZWFkRnJvbVVyaSgKICAgICAgICAgIGNvbXBpbGVyLm9wdGlvbnMuZW50cnlQb2ludCwKICAgICAgICAgIGlucHV0S2luZDogYXBpLklucHV0S2luZC5iaW5hcnkpOwogICAgICBpci5Db21wb25lbnQgY29tcG9uZW50ID0gbmV3IGlyLkNvbXBvbmVudCgpOwogICAgICBuZXcgaXIuQmluYXJ5QnVpbGRlcihkaWxsSW5wdXQuZGF0YSkucmVhZENvbXBvbmVudChjb21wb25lbnQpOwogICAgICByZXR1cm4gY29tcG9uZW50OwogICAgfSk7CgogICAgcmV0dXJuIGF3YWl0IG1lYXN1cmVJb1N1YnRhc2soJ2Rlc2VyaWFsaXplIGRhdGEnLCAoKSBhc3luYyB7CiAgICAgIGNvbXBpbGVyLnJlcG9ydGVyCiAgICAgICAgICAubG9nKCdSZWFkaW5nIGRhdGEgZnJvbSAke2NvbXBpbGVyLm9wdGlvbnMucmVhZERhdGFVcml9Jyk7CiAgICAgIGFwaS5JbnB1dDxMaXN0PGludD4+IGRhdGFJbnB1dCA9IGF3YWl0IGNvbXBpbGVyLnByb3ZpZGVyLnJlYWRGcm9tVXJpKAogICAgICAgICAgY29tcGlsZXIub3B0aW9ucy5yZWFkRGF0YVVyaSwKICAgICAgICAgIGlucHV0S2luZDogYXBpLklucHV0S2luZC5iaW5hcnkpOwogICAgICBEYXRhU291cmNlIHNvdXJjZSA9IG5ldyBCaW5hcnlTb3VyY2VJbXBsKGRhdGFJbnB1dC5kYXRhKTsKICAgICAgcmV0dXJuIGRlc2VyaWFsaXplR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMoCiAgICAgICAgICBjb21waWxlci5vcHRpb25zLAogICAgICAgICAgY29tcGlsZXIucmVwb3J0ZXIsCiAgICAgICAgICBjb21waWxlci5lbnZpcm9ubWVudCwKICAgICAgICAgIGNvbXBpbGVyLmFic3RyYWN0VmFsdWVTdHJhdGVneSwKICAgICAgICAgIGNvbXBvbmVudCwKICAgICAgICAgIHNvdXJjZSk7CiAgICB9KTsKICB9Cn0KbgBOTjwBFSg7OSkfGzIeMSErJBokHQEqOTM0JSYhEAIBQh0hHTEcGUdRIUM8MAIBLxsBSQEMJgE3KlBOT04oUDdQUD8tFggBKlFAPE86CAQBOx0+UUwnLDNFGAgBQRhFTCgsQDQcHSAqFRMIBAIBLHBhY2thZ2U6Y29tcGlsZXIvc3JjL3NlcmlhbGl6YXRpb24vdGFzay5kYXJ0O3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3NlcmlhbGl6YXRpb24vc3RyYXRlZ2llcy5kYXJ0kd0vLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC91dGlscy5kYXJ0JyBhcyBpcgogICAgc2hvdyBzZXJpYWxpemVDb21wb25lbnQ7CmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC91dGlscy5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvYmluYXJ5L2FzdF9mcm9tX2JpbmFyeS5kYXJ0JyBzaG93IEJpbmFyeUJ1aWxkZXI7CgppbXBvcnQgJy4uL2RpYWdub3N0aWNzL2RpYWdub3N0aWNfbGlzdGVuZXIuZGFydCc7CmltcG9ydCAnLi4vZW52aXJvbm1lbnQuZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJy4uL2luZmVycmVyL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2pzX21vZGVsL2pzX3dvcmxkLmRhcnQnOwppbXBvcnQgJy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vc291cmNlX2ZpbGVfcHJvdmlkZXIuZGFydCc7CmltcG9ydCAnLi4vdXRpbC9zaW5rX2FkYXB0ZXIuZGFydCc7CmltcG9ydCAnc2VyaWFsaXphdGlvbi5kYXJ0JzsKaW1wb3J0ICd0YXNrLmRhcnQnOwoKYWJzdHJhY3QgY2xhc3MgU2VyaWFsaXphdGlvblN0cmF0ZWd5PFQ+IHsKICBjb25zdCBTZXJpYWxpemF0aW9uU3RyYXRlZ3koKTsKCiAgTGlzdDxpbnQ+IHNlcmlhbGl6ZUNvbXBvbmVudChHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzKSB7CiAgICBKc0Nsb3NlZFdvcmxkIGNsb3NlZFdvcmxkID0gcmVzdWx0cy5jbG9zZWRXb3JsZDsKICAgIGlyLkNvbXBvbmVudCBjb21wb25lbnQgPSBjbG9zZWRXb3JsZC5lbGVtZW50TWFwLnByb2dyYW1FbnYubWFpbkNvbXBvbmVudDsKICAgIHJldHVybiBpci5zZXJpYWxpemVDb21wb25lbnQoY29tcG9uZW50KTsKICB9CgogIExpc3Q8VD4gc2VyaWFsaXplRGF0YShHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzKTsKCiAgaXIuQ29tcG9uZW50IGRlc2VyaWFsaXplQ29tcG9uZW50KExpc3Q8aW50PiBkYXRhKSB7CiAgICBpci5Db21wb25lbnQgY29tcG9uZW50ID0gbmV3IGlyLkNvbXBvbmVudCgpOwogICAgbmV3IEJpbmFyeUJ1aWxkZXIoZGF0YSkucmVhZENvbXBvbmVudChjb21wb25lbnQpOwogICAgcmV0dXJuIGNvbXBvbmVudDsKICB9CgogIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIGRlc2VyaWFsaXplRGF0YSgKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCiAgICAgIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwKICAgICAgRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsCiAgICAgIEFic3RyYWN0VmFsdWVTdHJhdGVneSBhYnN0cmFjdFZhbHVlU3RyYXRlZ3ksCiAgICAgIGlyLkNvbXBvbmVudCBjb21wb25lbnQsCiAgICAgIExpc3Q8VD4gZGF0YSk7Cn0KCmNsYXNzIEJ5dGVzSW5NZW1vcnlTZXJpYWxpemF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBTZXJpYWxpemF0aW9uU3RyYXRlZ3k8aW50PiB7CiAgZmluYWwgYm9vbCB1c2VEYXRhS2luZHM7CgogIGNvbnN0IEJ5dGVzSW5NZW1vcnlTZXJpYWxpemF0aW9uU3RyYXRlZ3koe3RoaXMudXNlRGF0YUtpbmRzOiBmYWxzZX0pOwoKICBAb3ZlcnJpZGUKICBMaXN0PGludD4gc2VyaWFsaXplRGF0YShHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzKSB7CiAgICBCeXRlU2luayBieXRlU2luayA9IG5ldyBCeXRlU2luaygpOwogICAgRGF0YVNpbmsgc2luayA9IG5ldyBCaW5hcnlTaW5rKGJ5dGVTaW5rLCB1c2VEYXRhS2luZHM6IHVzZURhdGFLaW5kcyk7CiAgICBzZXJpYWxpemVHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyhyZXN1bHRzLCBzaW5rKTsKICAgIHJldHVybiBieXRlU2luay5idWlsZGVyLnRha2VCeXRlcygpOwogIH0KCiAgQG92ZXJyaWRlCiAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgZGVzZXJpYWxpemVEYXRhKAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgICAgRGlhZ25vc3RpY1JlcG9ydGVyIHJlcG9ydGVyLAogICAgICBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwKICAgICAgQWJzdHJhY3RWYWx1ZVN0cmF0ZWd5IGFic3RyYWN0VmFsdWVTdHJhdGVneSwKICAgICAgaXIuQ29tcG9uZW50IGNvbXBvbmVudCwKICAgICAgTGlzdDxpbnQ+IGRhdGEpIHsKICAgIERhdGFTb3VyY2Ugc291cmNlID0gbmV3IEJpbmFyeVNvdXJjZUltcGwoZGF0YSwgdXNlRGF0YUtpbmRzOiB1c2VEYXRhS2luZHMpOwogICAgcmV0dXJuIGRlc2VyaWFsaXplR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMob3B0aW9ucywgcmVwb3J0ZXIsIGVudmlyb25tZW50LAogICAgICAgIGFic3RyYWN0VmFsdWVTdHJhdGVneSwgY29tcG9uZW50LCBzb3VyY2UpOwogIH0KfQoKY2xhc3MgQnl0ZXNPbkRpc2tTZXJpYWxpemF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBTZXJpYWxpemF0aW9uU3RyYXRlZ3k8aW50PiB7CiAgZmluYWwgYm9vbCB1c2VEYXRhS2luZHM7CgogIGNvbnN0IEJ5dGVzT25EaXNrU2VyaWFsaXphdGlvblN0cmF0ZWd5KHt0aGlzLnVzZURhdGFLaW5kczogZmFsc2V9KTsKCiAgQG92ZXJyaWRlCiAgTGlzdDxpbnQ+IHNlcmlhbGl6ZURhdGEoR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cykgewogICAgVXJpIHVyaSA9IFVyaS5iYXNlLnJlc29sdmUoJ3dvcmxkLmRhdGEnKTsKICAgIERhdGFTaW5rIHNpbmsgPSBuZXcgQmluYXJ5U2luaygKICAgICAgICBuZXcgQmluYXJ5T3V0cHV0U2lua0FkYXB0ZXIobmV3IFJhbmRvbUFjY2Vzc0JpbmFyeU91dHB1dFNpbmsodXJpKSksCiAgICAgICAgdXNlRGF0YUtpbmRzOiB1c2VEYXRhS2luZHMpOwogICAgc2VyaWFsaXplR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMocmVzdWx0cywgc2luayk7CiAgICByZXR1cm4gbmV3IEZpbGUuZnJvbVVyaSh1cmkpLnJlYWRBc0J5dGVzU3luYygpOwogIH0KCiAgQG92ZXJyaWRlCiAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgZGVzZXJpYWxpemVEYXRhKAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgICAgRGlhZ25vc3RpY1JlcG9ydGVyIHJlcG9ydGVyLAogICAgICBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwKICAgICAgQWJzdHJhY3RWYWx1ZVN0cmF0ZWd5IGFic3RyYWN0VmFsdWVTdHJhdGVneSwKICAgICAgaXIuQ29tcG9uZW50IGNvbXBvbmVudCwKICAgICAgTGlzdDxpbnQ+IGRhdGEpIHsKICAgIERhdGFTb3VyY2Ugc291cmNlID0gbmV3IEJpbmFyeVNvdXJjZUltcGwoZGF0YSwgdXNlRGF0YUtpbmRzOiB1c2VEYXRhS2luZHMpOwogICAgcmV0dXJuIGRlc2VyaWFsaXplR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMob3B0aW9ucywgcmVwb3J0ZXIsIGVudmlyb25tZW50LAogICAgICAgIGFic3RyYWN0VmFsdWVTdHJhdGVneSwgY29tcG9uZW50LCBzb3VyY2UpOwogIH0KfQoKY2xhc3MgT2JqZWN0c0luTWVtb3J5U2VyaWFsaXphdGlvblN0cmF0ZWd5CiAgICBleHRlbmRzIFNlcmlhbGl6YXRpb25TdHJhdGVneTxPYmplY3Q+IHsKICBmaW5hbCBib29sIHVzZURhdGFLaW5kczsKCiAgY29uc3QgT2JqZWN0c0luTWVtb3J5U2VyaWFsaXphdGlvblN0cmF0ZWd5KHt0aGlzLnVzZURhdGFLaW5kczogdHJ1ZX0pOwoKICBAb3ZlcnJpZGUKICBMaXN0PE9iamVjdD4gc2VyaWFsaXplRGF0YShHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzKSB7CiAgICBMaXN0PE9iamVjdD4gZGF0YSA9IFtdOwogICAgRGF0YVNpbmsgc2luayA9IG5ldyBPYmplY3RTaW5rKGRhdGEsIHVzZURhdGFLaW5kczogdXNlRGF0YUtpbmRzKTsKICAgIHNlcmlhbGl6ZUdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzKHJlc3VsdHMsIHNpbmspOwogICAgcmV0dXJuIGRhdGE7CiAgfQoKICBAb3ZlcnJpZGUKICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBkZXNlcmlhbGl6ZURhdGEoCiAgICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgICBEaWFnbm9zdGljUmVwb3J0ZXIgcmVwb3J0ZXIsCiAgICAgIEVudmlyb25tZW50IGVudmlyb25tZW50LAogICAgICBBYnN0cmFjdFZhbHVlU3RyYXRlZ3kgYWJzdHJhY3RWYWx1ZVN0cmF0ZWd5LAogICAgICBpci5Db21wb25lbnQgY29tcG9uZW50LAogICAgICBMaXN0PE9iamVjdD4gZGF0YSkgewogICAgRGF0YVNvdXJjZSBzb3VyY2UgPSBuZXcgT2JqZWN0U291cmNlKGRhdGEsIHVzZURhdGFLaW5kczogdXNlRGF0YUtpbmRzKTsKICAgIHJldHVybiBkZXNlcmlhbGl6ZUdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzKG9wdGlvbnMsIHJlcG9ydGVyLCBlbnZpcm9ubWVudCwKICAgICAgICBhYnN0cmFjdFZhbHVlU3RyYXRlZ3ksIGNvbXBvbmVudCwgc291cmNlKTsKICB9Cn0KgIYATk48ARIBPR04KEgBMh4xISQaJyQdFAEqIQFFNU4tBAE9ATYxNhYEAS4fIx8zHhUCAU4bAUgBDEAoSjgpBAEMLh8jHzMeGFBRMwQCAUwbAUYBDEAuJEwlODQEAQwuHyMfMx4YUFEzBAIBKywbAUkBDEMcRjgRBAEMLh8jHzMeG0xRMwQCATJwYWNrYWdlOmNvbXBpbGVyL3NyYy9zZXJpYWxpemF0aW9uL3N0cmF0ZWdpZXMuZGFydCxzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9zc2Evbm9kZXMuZGFydMACDk4vLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL2RhcnQyanMuZGFydCcgc2hvdyBMaW5rOwoKaW1wb3J0ICcuLi9jbG9zdXJlLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb25zdGFudHMvY29uc3RhbnRfc3lzdGVtLmRhcnQnIGFzIGNvbnN0YW50X3N5c3RlbTsKaW1wb3J0ICcuLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJy4uL2RlZmVycmVkX2xvYWQuZGFydCcgc2hvdyBPdXRwdXRVbml0OwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2p1bXBzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2luZmVycmVyL2Fic3RyYWN0X3ZhbHVlX2RvbWFpbi5kYXJ0JzsKaW1wb3J0ICcuLi9pby9zb3VyY2VfaW5mb3JtYXRpb24uZGFydCc7CmltcG9ydCAnLi4vanMvanMuZGFydCcgYXMganM7CmltcG9ydCAnLi4vanNfYmFja2VuZC9qc19iYWNrZW5kLmRhcnQnOwppbXBvcnQgJy4uL25hdGl2ZS9iZWhhdmlvci5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9zZWxlY3Rvci5kYXJ0JyBzaG93IFNlbGVjdG9yOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NpZGVfZWZmZWN0cy5kYXJ0JyBzaG93IFNpZGVFZmZlY3RzOwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JzsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKaW1wb3J0ICdpbnZva2VfZHluYW1pY19zcGVjaWFsaXplcnMuZGFydCc7CmltcG9ydCAndmFsaWRhdGUuZGFydCc7CgphYnN0cmFjdCBjbGFzcyBIVmlzaXRvcjxSPiB7CiAgUiB2aXNpdEFicyhIQWJzIG5vZGUpOwogIFIgdmlzaXRBZGQoSEFkZCBub2RlKTsKICBSIHZpc2l0QXdhaXQoSEF3YWl0IG5vZGUpOwogIFIgdmlzaXRCaXRBbmQoSEJpdEFuZCBub2RlKTsKICBSIHZpc2l0Qml0Tm90KEhCaXROb3Qgbm9kZSk7CiAgUiB2aXNpdEJpdE9yKEhCaXRPciBub2RlKTsKICBSIHZpc2l0Qml0WG9yKEhCaXRYb3Igbm9kZSk7CiAgUiB2aXNpdEJvb2xpZnkoSEJvb2xpZnkgbm9kZSk7CiAgUiB2aXNpdEJvdW5kc0NoZWNrKEhCb3VuZHNDaGVjayBub2RlKTsKICBSIHZpc2l0QnJlYWsoSEJyZWFrIG5vZGUpOwogIFIgdmlzaXRDb25zdGFudChIQ29uc3RhbnQgbm9kZSk7CiAgUiB2aXNpdENvbnRpbnVlKEhDb250aW51ZSBub2RlKTsKICBSIHZpc2l0Q3JlYXRlKEhDcmVhdGUgbm9kZSk7CiAgUiB2aXNpdENyZWF0ZUJveChIQ3JlYXRlQm94IG5vZGUpOwogIFIgdmlzaXREaXZpZGUoSERpdmlkZSBub2RlKTsKICBSIHZpc2l0RXhpdChIRXhpdCBub2RlKTsKICBSIHZpc2l0RXhpdFRyeShIRXhpdFRyeSBub2RlKTsKICBSIHZpc2l0RmllbGRHZXQoSEZpZWxkR2V0IG5vZGUpOwogIFIgdmlzaXRGaWVsZFNldChIRmllbGRTZXQgbm9kZSk7CiAgUiB2aXNpdEZvcmVpZ25Db2RlKEhGb3JlaWduQ29kZSBub2RlKTsKICBSIHZpc2l0R2V0TGVuZ3RoKEhHZXRMZW5ndGggbm9kZSk7CiAgUiB2aXNpdEdvdG8oSEdvdG8gbm9kZSk7CiAgUiB2aXNpdEdyZWF0ZXIoSEdyZWF0ZXIgbm9kZSk7CiAgUiB2aXNpdEdyZWF0ZXJFcXVhbChIR3JlYXRlckVxdWFsIG5vZGUpOwogIFIgdmlzaXRJZGVudGl0eShISWRlbnRpdHkgbm9kZSk7CiAgUiB2aXNpdElmKEhJZiBub2RlKTsKICBSIHZpc2l0SW5kZXgoSEluZGV4IG5vZGUpOwogIFIgdmlzaXRJbmRleEFzc2lnbihISW5kZXhBc3NpZ24gbm9kZSk7CiAgUiB2aXNpdEludGVyY2VwdG9yKEhJbnRlcmNlcHRvciBub2RlKTsKICBSIHZpc2l0SW52b2tlQ2xvc3VyZShISW52b2tlQ2xvc3VyZSBub2RlKTsKICBSIHZpc2l0SW52b2tlRHluYW1pY0dldHRlcihISW52b2tlRHluYW1pY0dldHRlciBub2RlKTsKICBSIHZpc2l0SW52b2tlRHluYW1pY01ldGhvZChISW52b2tlRHluYW1pY01ldGhvZCBub2RlKTsKICBSIHZpc2l0SW52b2tlRHluYW1pY1NldHRlcihISW52b2tlRHluYW1pY1NldHRlciBub2RlKTsKICBSIHZpc2l0SW52b2tlU3RhdGljKEhJbnZva2VTdGF0aWMgbm9kZSk7CiAgUiB2aXNpdEludm9rZVN1cGVyKEhJbnZva2VTdXBlciBub2RlKTsKICBSIHZpc2l0SW52b2tlQ29uc3RydWN0b3JCb2R5KEhJbnZva2VDb25zdHJ1Y3RvckJvZHkgbm9kZSk7CiAgUiB2aXNpdEludm9rZUdlbmVyYXRvckJvZHkoSEludm9rZUdlbmVyYXRvckJvZHkgbm9kZSk7CiAgUiB2aXNpdElzKEhJcyBub2RlKTsKICBSIHZpc2l0SXNWaWFJbnRlcmNlcHRvcihISXNWaWFJbnRlcmNlcHRvciBub2RlKTsKICBSIHZpc2l0TGF0ZVZhbHVlKEhMYXRlVmFsdWUgbm9kZSk7CiAgUiB2aXNpdExhenlTdGF0aWMoSExhenlTdGF0aWMgbm9kZSk7CiAgUiB2aXNpdExlc3MoSExlc3Mgbm9kZSk7CiAgUiB2aXNpdExlc3NFcXVhbChITGVzc0VxdWFsIG5vZGUpOwogIFIgdmlzaXRMaXRlcmFsTGlzdChITGl0ZXJhbExpc3Qgbm9kZSk7CiAgUiB2aXNpdExvY2FsR2V0KEhMb2NhbEdldCBub2RlKTsKICBSIHZpc2l0TG9jYWxTZXQoSExvY2FsU2V0IG5vZGUpOwogIFIgdmlzaXRMb2NhbFZhbHVlKEhMb2NhbFZhbHVlIG5vZGUpOwogIFIgdmlzaXRMb29wQnJhbmNoKEhMb29wQnJhbmNoIG5vZGUpOwogIFIgdmlzaXRNdWx0aXBseShITXVsdGlwbHkgbm9kZSk7CiAgUiB2aXNpdE5lZ2F0ZShITmVnYXRlIG5vZGUpOwogIFIgdmlzaXROb3QoSE5vdCBub2RlKTsKICBSIHZpc2l0T25lU2hvdEludGVyY2VwdG9yKEhPbmVTaG90SW50ZXJjZXB0b3Igbm9kZSk7CiAgUiB2aXNpdFBhcmFtZXRlclZhbHVlKEhQYXJhbWV0ZXJWYWx1ZSBub2RlKTsKICBSIHZpc2l0UGhpKEhQaGkgbm9kZSk7CiAgUiB2aXNpdFJhbmdlQ29udmVyc2lvbihIUmFuZ2VDb252ZXJzaW9uIG5vZGUpOwogIFIgdmlzaXRSZWFkTW9kaWZ5V3JpdGUoSFJlYWRNb2RpZnlXcml0ZSBub2RlKTsKICBSIHZpc2l0UmVmKEhSZWYgbm9kZSk7CiAgUiB2aXNpdFJlbWFpbmRlcihIUmVtYWluZGVyIG5vZGUpOwogIFIgdmlzaXRSZXR1cm4oSFJldHVybiBub2RlKTsKICBSIHZpc2l0U2hpZnRMZWZ0KEhTaGlmdExlZnQgbm9kZSk7CiAgUiB2aXNpdFNoaWZ0UmlnaHQoSFNoaWZ0UmlnaHQgbm9kZSk7CiAgUiB2aXNpdFN0YXRpYyhIU3RhdGljIG5vZGUpOwogIFIgdmlzaXRTdGF0aWNTdG9yZShIU3RhdGljU3RvcmUgbm9kZSk7CiAgUiB2aXNpdFN0cmluZ0NvbmNhdChIU3RyaW5nQ29uY2F0IG5vZGUpOwogIFIgdmlzaXRTdHJpbmdpZnkoSFN0cmluZ2lmeSBub2RlKTsKICBSIHZpc2l0U3VidHJhY3QoSFN1YnRyYWN0IG5vZGUpOwogIFIgdmlzaXRTd2l0Y2goSFN3aXRjaCBub2RlKTsKICBSIHZpc2l0VGhpcyhIVGhpcyBub2RlKTsKICBSIHZpc2l0VGhyb3coSFRocm93IG5vZGUpOwogIFIgdmlzaXRUaHJvd0V4cHJlc3Npb24oSFRocm93RXhwcmVzc2lvbiBub2RlKTsKICBSIHZpc2l0VHJ1bmNhdGluZ0RpdmlkZShIVHJ1bmNhdGluZ0RpdmlkZSBub2RlKTsKICBSIHZpc2l0VHJ5KEhUcnkgbm9kZSk7CiAgUiB2aXNpdFR5cGVDb252ZXJzaW9uKEhUeXBlQ29udmVyc2lvbiBub2RlKTsKICBSIHZpc2l0VHlwZUtub3duKEhUeXBlS25vd24gbm9kZSk7CiAgUiB2aXNpdFlpZWxkKEhZaWVsZCBub2RlKTsKCiAgUiB2aXNpdFR5cGVJbmZvUmVhZFJhdyhIVHlwZUluZm9SZWFkUmF3IG5vZGUpOwogIFIgdmlzaXRUeXBlSW5mb1JlYWRWYXJpYWJsZShIVHlwZUluZm9SZWFkVmFyaWFibGUgbm9kZSk7CiAgUiB2aXNpdFR5cGVJbmZvRXhwcmVzc2lvbihIVHlwZUluZm9FeHByZXNzaW9uIG5vZGUpOwp9CgphYnN0cmFjdCBjbGFzcyBIR3JhcGhWaXNpdG9yIHsKICB2aXNpdERvbWluYXRvclRyZWUoSEdyYXBoIGdyYXBoKSB7CiAgICAvLyBSZWN1cnNpb24gZnJlZSB2ZXJzaW9uIG9mOgogICAgLy8KICAgIC8vICAgICB2b2lkIHZpc2l0QmFzaWNCbG9ja0FuZFN1Y2Nlc3NvcnMoSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIC8vICAgICAgIHZpc2l0QmFzaWNCbG9jayhibG9jayk7CiAgICAvLyAgICAgICBMaXN0IGRvbWluYXRlZCA9IGJsb2NrLmRvbWluYXRlZEJsb2NrczsKICAgIC8vICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZG9taW5hdGVkLmxlbmd0aDsgaSsrKSB7CiAgICAvLyAgICAgICAgIHZpc2l0QmFzaWNCbG9ja0FuZFN1Y2Nlc3NvcnMoZG9taW5hdGVkW2ldKTsKICAgIC8vICAgICAgIH0KICAgIC8vICAgICB9CiAgICAvLyAgICAgdmlzaXRCYXNpY0Jsb2NrQW5kU3VjY2Vzc29ycyhncmFwaC5lbnRyeSk7CgogICAgX0ZyYW1lIGZyYW1lID0gbmV3IF9GcmFtZShudWxsKTsKICAgIGZyYW1lLmJsb2NrID0gZ3JhcGguZW50cnk7CiAgICBmcmFtZS5pbmRleCA9IDA7CgogICAgdmlzaXRCYXNpY0Jsb2NrKGZyYW1lLmJsb2NrKTsKCiAgICB3aGlsZSAoZnJhbWUgIT0gbnVsbCkgewogICAgICBIQmFzaWNCbG9jayBibG9jayA9IGZyYW1lLmJsb2NrOwogICAgICBpbnQgaW5kZXggPSBmcmFtZS5pbmRleDsKICAgICAgaWYgKGluZGV4IDwgYmxvY2suZG9taW5hdGVkQmxvY2tzLmxlbmd0aCkgewogICAgICAgIGZyYW1lLmluZGV4ID0gaW5kZXggKyAxOwogICAgICAgIGZyYW1lID0gZnJhbWUubmV4dCA/Pz0gbmV3IF9GcmFtZShmcmFtZSk7CiAgICAgICAgZnJhbWUuYmxvY2sgPSBibG9jay5kb21pbmF0ZWRCbG9ja3NbaW5kZXhdOwogICAgICAgIGZyYW1lLmluZGV4ID0gMDsKICAgICAgICB2aXNpdEJhc2ljQmxvY2soZnJhbWUuYmxvY2spOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZyYW1lID0gZnJhbWUucHJldmlvdXM7CiAgICB9CiAgfQoKICB2aXNpdFBvc3REb21pbmF0b3JUcmVlKEhHcmFwaCBncmFwaCkgewogICAgLy8gUmVjdXNpb24gZnJlZSB2ZXJzaW9uIG9mOgogICAgLy8KICAgIC8vICAgICB2b2lkIHZpc2l0QmFzaWNCbG9ja0FuZFN1Y2Nlc3NvcnMoSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIC8vICAgICAgIExpc3QgZG9taW5hdGVkID0gYmxvY2suZG9taW5hdGVkQmxvY2tzOwogICAgLy8gICAgICAgZm9yIChpbnQgaSA9IGRvbWluYXRlZC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgLy8gICAgICAgICB2aXNpdEJhc2ljQmxvY2tBbmRTdWNjZXNzb3JzKGRvbWluYXRlZFtpXSk7CiAgICAvLyAgICAgICB9CiAgICAvLyAgICAgICB2aXNpdEJhc2ljQmxvY2soYmxvY2spOwogICAgLy8gICAgIH0KICAgIC8vICAgICB2aXNpdEJhc2ljQmxvY2tBbmRTdWNjZXNzb3JzKGdyYXBoLmVudHJ5KTsKCiAgICBfRnJhbWUgZnJhbWUgPSBuZXcgX0ZyYW1lKG51bGwpOwogICAgZnJhbWUuYmxvY2sgPSBncmFwaC5lbnRyeTsKICAgIGZyYW1lLmluZGV4ID0gZnJhbWUuYmxvY2suZG9taW5hdGVkQmxvY2tzLmxlbmd0aDsKCiAgICB3aGlsZSAoZnJhbWUgIT0gbnVsbCkgewogICAgICBIQmFzaWNCbG9jayBibG9jayA9IGZyYW1lLmJsb2NrOwogICAgICBpbnQgaW5kZXggPSBmcmFtZS5pbmRleDsKICAgICAgaWYgKGluZGV4ID4gMCkgewogICAgICAgIGZyYW1lLmluZGV4ID0gaW5kZXggLSAxOwogICAgICAgIGZyYW1lID0gZnJhbWUubmV4dCA/Pz0gbmV3IF9GcmFtZShmcmFtZSk7CiAgICAgICAgZnJhbWUuYmxvY2sgPSBibG9jay5kb21pbmF0ZWRCbG9ja3NbaW5kZXggLSAxXTsKICAgICAgICBmcmFtZS5pbmRleCA9IGZyYW1lLmJsb2NrLmRvbWluYXRlZEJsb2Nrcy5sZW5ndGg7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdmlzaXRCYXNpY0Jsb2NrKGJsb2NrKTsKICAgICAgZnJhbWUgPSBmcmFtZS5wcmV2aW91czsKICAgIH0KICB9CgogIHZpc2l0QmFzaWNCbG9jayhIQmFzaWNCbG9jayBibG9jayk7Cn0KCmNsYXNzIF9GcmFtZSB7CiAgZmluYWwgX0ZyYW1lIHByZXZpb3VzOwogIF9GcmFtZSBuZXh0OwogIEhCYXNpY0Jsb2NrIGJsb2NrOwogIGludCBpbmRleDsKICBfRnJhbWUodGhpcy5wcmV2aW91cyk7Cn0KCmFic3RyYWN0IGNsYXNzIEhJbnN0cnVjdGlvblZpc2l0b3IgZXh0ZW5kcyBIR3JhcGhWaXNpdG9yIHsKICBIQmFzaWNCbG9jayBjdXJyZW50QmxvY2s7CgogIHZpc2l0SW5zdHJ1Y3Rpb24oSEluc3RydWN0aW9uIG5vZGUpOwoKICBAb3ZlcnJpZGUKICB2aXNpdEJhc2ljQmxvY2soSEJhc2ljQmxvY2sgbm9kZSkgewogICAgdm9pZCB2aXNpdEluc3RydWN0aW9uTGlzdChISW5zdHJ1Y3Rpb25MaXN0IGxpc3QpIHsKICAgICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gbGlzdC5maXJzdDsKICAgICAgd2hpbGUgKGluc3RydWN0aW9uICE9IG51bGwpIHsKICAgICAgICB2aXNpdEluc3RydWN0aW9uKGluc3RydWN0aW9uKTsKICAgICAgICBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uLm5leHQ7CiAgICAgICAgYXNzZXJ0KGluc3RydWN0aW9uICE9IGxpc3QuZmlyc3QpOwogICAgICB9CiAgICB9CgogICAgY3VycmVudEJsb2NrID0gbm9kZTsKICAgIHZpc2l0SW5zdHJ1Y3Rpb25MaXN0KG5vZGUpOwogIH0KfQoKY2xhc3MgSEdyYXBoIHsKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNYXliZSB0aGlzIHNob3VsZCBiZSBbTWVtYmVyTGlrZV0uCiAgRW50aXR5IGVsZW1lbnQ7IC8vIFVzZWQgZm9yIGRlYnVnIHByaW50aW5nLgogIEhCYXNpY0Jsb2NrIGVudHJ5OwogIEhCYXNpY0Jsb2NrIGV4aXQ7CiAgSFRoaXMgdGhpc0luc3RydWN0aW9uOwoKICAvLy8gYHRydWVgIGlmIHRoaXMgZ3JhcGggc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGJ5IGEgc3luYyovYXN5bmMvYXN5bmMqCiAgLy8vIHJld3JpdGUuCiAgYm9vbCBuZWVkc0FzeW5jUmV3cml0ZSA9IGZhbHNlOwoKICAvLy8gSWYgdGhpcyBmdW5jdGlvbiByZXF1aXJlcyBhbiBhc3luYyByZXdyaXRlLCB0aGlzIGlzIHRoZSBlbGVtZW50IHR5cGUgb2YKICAvLy8gdGhlIGdlbmVyYXRvci4KICBEYXJ0VHlwZSBhc3luY0VsZW1lbnRUeXBlOwoKICAvLy8gUmVjZWl2ZXIgcGFyYW1ldGVyLCBzZXQgZm9yIG1ldGhvZHMgdXNpbmcgaW50ZXJjZXB0b3IgY2FsbGluZyBjb252ZW50aW9uLgogIEhQYXJhbWV0ZXJWYWx1ZSBleHBsaWNpdFJlY2VpdmVyUGFyYW1ldGVyOwogIGJvb2wgaXNSZWN1cnNpdmVNZXRob2QgPSBmYWxzZTsKICBib29sIGNhbGxlZEluTG9vcCA9IGZhbHNlOwoKICBmaW5hbCBMaXN0PEhCYXNpY0Jsb2NrPiBibG9ja3MgPSA8SEJhc2ljQmxvY2s+W107CgogIC8vLyBOb2RlcyBjb250YWluaW5nIGxpc3QgYWxsb2NhdGlvbnMgZm9yIHdoaWNoIHRoZXJlIGlzIGEga25vd24gZml4ZWQgbGVuZ3RoLgogIC8vIFRPRE8oc2lnbXVuZCxzcmEpOiBjb25zaWRlciBub3Qgc3RvcmluZyB0aGlzIGV4cGxpY2l0bHkgaGVyZSAoZS5nLiBtYXliZQogIC8vIHN0b3JlIGl0IG9uIEhJbnN0cnVjdGlvbiwgb3IgbWF5YmUgdGhpcyBjYW4gYmUgY29tcHV0ZWQgb24gZGVtYW5kKS4KICBmaW5hbCBTZXQ8SEluc3RydWN0aW9uPiBhbGxvY2F0ZWRGaXhlZExpc3RzID0gbmV3IFNldDxISW5zdHJ1Y3Rpb24+KCk7CgogIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uOwoKICAvLyBXZSBjYW5vbmljYWxpemUgYWxsIGNvbnN0YW50cyB1c2VkIHdpdGhpbiBhIGdyYXBoIHNvIHdlIGRvIG5vdAogIC8vIGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlbSBmb3IgZ2xvYmFsIHZhbHVlIG51bWJlcmluZy4KICBNYXA8Q29uc3RhbnRWYWx1ZSwgSENvbnN0YW50PiBjb25zdGFudHMgPSBuZXcgTWFwPENvbnN0YW50VmFsdWUsIEhDb25zdGFudD4oKTsKCiAgSEdyYXBoKCkgewogICAgZW50cnkgPSBhZGROZXdCbG9jaygpOwogICAgLy8gVGhlIGV4aXQgYmxvY2sgd2lsbCBiZSBhZGRlZCBsYXRlciwgc28gaXQgaGFzIGFuIGlkIHRoYXQgaXMKICAgIC8vIGFmdGVyIGFsbCBvdGhlcnMgaW4gdGhlIHN5c3RlbS4KICAgIGV4aXQgPSBuZXcgSEJhc2ljQmxvY2soKTsKICB9CgogIHZvaWQgYWRkQmxvY2soSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIGludCBpZCA9IGJsb2Nrcy5sZW5ndGg7CiAgICBibG9jay5pZCA9IGlkOwogICAgYmxvY2tzLmFkZChibG9jayk7CiAgICBhc3NlcnQoaWRlbnRpY2FsKGJsb2Nrc1tpZF0sIGJsb2NrKSk7CiAgfQoKICBIQmFzaWNCbG9jayBhZGROZXdCbG9jaygpIHsKICAgIEhCYXNpY0Jsb2NrIHJlc3VsdCA9IG5ldyBIQmFzaWNCbG9jaygpOwogICAgYWRkQmxvY2socmVzdWx0KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBIQmFzaWNCbG9jayBhZGROZXdMb29wSGVhZGVyQmxvY2soCiAgICAgIEp1bXBUYXJnZXQgdGFyZ2V0LCBMaXN0PExhYmVsRGVmaW5pdGlvbj4gbGFiZWxzKSB7CiAgICBIQmFzaWNCbG9jayByZXN1bHQgPSBhZGROZXdCbG9jaygpOwogICAgcmVzdWx0Lmxvb3BJbmZvcm1hdGlvbiA9IG5ldyBITG9vcEluZm9ybWF0aW9uKHJlc3VsdCwgdGFyZ2V0LCBsYWJlbHMpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEhDb25zdGFudCBhZGRDb25zdGFudChDb25zdGFudFZhbHVlIGNvbnN0YW50LCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsCiAgICAgIHtTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbn0pIHsKICAgIEhDb25zdGFudCByZXN1bHQgPSBjb25zdGFudHNbY29uc3RhbnRdOwogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3VwcG9ydCBzb3VyY2UgaW5mb3JtYXRpb24gcGVyIGNvbnN0YW50IHJlZmVyZW5jZS4KICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewogICAgICBpZiAoIWNvbnN0YW50LmlzQ29uc3RhbnQpIHsKICAgICAgICAvLyBXZSB1c2UgYG51bGxgIGFzIHRoZSB2YWx1ZSBmb3IgaW52YWxpZCBjb25zdGFudCBleHByZXNzaW9ucy4KICAgICAgICBjb25zdGFudCA9IGNvbnN0IE51bGxDb25zdGFudFZhbHVlKCk7CiAgICAgIH0KICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlID0gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgICAgLmNvbXB1dGVBYnN0cmFjdFZhbHVlRm9yQ29uc3RhbnQoY29uc3RhbnQpOwogICAgICByZXN1bHQgPSBuZXcgSENvbnN0YW50LmludGVybmFsKGNvbnN0YW50LCB0eXBlKQogICAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKICAgICAgZW50cnkuYWRkQXRFeGl0KHJlc3VsdCk7CiAgICAgIGNvbnN0YW50c1tjb25zdGFudF0gPSByZXN1bHQ7CiAgICB9IGVsc2UgaWYgKHJlc3VsdC5ibG9jayA9PSBudWxsKSB7CiAgICAgIC8vIFRoZSBjb25zdGFudCB3YXMgbm90IHVzZWQgYW55bW9yZS4KICAgICAgZW50cnkuYWRkQXRFeGl0KHJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgSENvbnN0YW50IGFkZERlZmVycmVkQ29uc3RhbnQoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgT3V0cHV0VW5pdCB1bml0LAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBDb25zdGFudFZhbHVlIHdyYXBwZXIgPSBuZXcgRGVmZXJyZWRHbG9iYWxDb25zdGFudFZhbHVlKGNvbnN0YW50LCB1bml0KTsKICAgIGNsb3NlZFdvcmxkLm91dHB1dFVuaXREYXRhLnJlZ2lzdGVyQ29uc3RhbnREZWZlcnJlZFVzZSh3cmFwcGVyLCB1bml0KTsKICAgIHJldHVybiBhZGRDb25zdGFudCh3cmFwcGVyLCBjbG9zZWRXb3JsZCwKICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgSENvbnN0YW50IGFkZENvbnN0YW50SW50KGludCBpLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBhZGRDb25zdGFudChjb25zdGFudF9zeXN0ZW0uY3JlYXRlSW50RnJvbUludChpKSwgY2xvc2VkV29ybGQpOwogIH0KCiAgSENvbnN0YW50IGFkZENvbnN0YW50SW50QXNVbnNpZ25lZChpbnQgaSwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gYWRkQ29uc3RhbnQoCiAgICAgICAgY29uc3RhbnRfc3lzdGVtLmNyZWF0ZUludChuZXcgQmlnSW50LmZyb20oaSkudG9VbnNpZ25lZCg2NCkpLAogICAgICAgIGNsb3NlZFdvcmxkKTsKICB9CgogIEhDb25zdGFudCBhZGRDb25zdGFudERvdWJsZShkb3VibGUgZCwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gYWRkQ29uc3RhbnQoY29uc3RhbnRfc3lzdGVtLmNyZWF0ZURvdWJsZShkKSwgY2xvc2VkV29ybGQpOwogIH0KCiAgSENvbnN0YW50IGFkZENvbnN0YW50U3RyaW5nKFN0cmluZyBzdHIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGFkZENvbnN0YW50KGNvbnN0YW50X3N5c3RlbS5jcmVhdGVTdHJpbmcoc3RyKSwgY2xvc2VkV29ybGQpOwogIH0KCiAgSENvbnN0YW50IGFkZENvbnN0YW50U3RyaW5nRnJvbU5hbWUoanMuTmFtZSBuYW1lLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBhZGRDb25zdGFudCgKICAgICAgICBuZXcgU3ludGhldGljQ29uc3RhbnRWYWx1ZSgKICAgICAgICAgICAgU3ludGhldGljQ29uc3RhbnRLaW5kLk5BTUUsIGpzLnF1b3RlTmFtZShuYW1lKSksCiAgICAgICAgY2xvc2VkV29ybGQpOwogIH0KCiAgSENvbnN0YW50IGFkZENvbnN0YW50Qm9vbChib29sIHZhbHVlLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBhZGRDb25zdGFudChjb25zdGFudF9zeXN0ZW0uY3JlYXRlQm9vbCh2YWx1ZSksIGNsb3NlZFdvcmxkKTsKICB9CgogIEhDb25zdGFudCBhZGRDb25zdGFudE51bGwoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gYWRkQ29uc3RhbnQoY29uc3RhbnRfc3lzdGVtLmNyZWF0ZU51bGwoKSwgY2xvc2VkV29ybGQpOwogIH0KCiAgSENvbnN0YW50IGFkZENvbnN0YW50VW5yZWFjaGFibGUoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICAvLyBBIGNvbnN0YW50IHdpdGggYW4gZW1wdHkgdHlwZSB1c2VkIGFzIHRoZSBISW5zdHJ1Y3Rpb24gb2YgYW4gZXhwcmVzc2lvbgogICAgLy8gaW4gYW4gdW5yZWFjaGFibGUgY29udGV4dC4KICAgIHJldHVybiBhZGRDb25zdGFudCgKICAgICAgICBuZXcgU3ludGhldGljQ29uc3RhbnRWYWx1ZShTeW50aGV0aWNDb25zdGFudEtpbmQuRU1QVFlfVkFMVUUsCiAgICAgICAgICAgIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uZW1wdHlUeXBlKSwKICAgICAgICBjbG9zZWRXb3JsZCk7CiAgfQoKICB2b2lkIGZpbmFsaXplKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSB7CiAgICBhZGRCbG9jayhleGl0KTsKICAgIGV4aXQub3BlbigpOwogICAgZXhpdC5jbG9zZShuZXcgSEV4aXQoZG9tYWluKSk7CiAgICBhc3NpZ25Eb21pbmF0b3JzKCk7CiAgfQoKICB2b2lkIGFzc2lnbkRvbWluYXRvcnMoKSB7CiAgICAvLyBSdW4gdGhyb3VnaCB0aGUgYmxvY2tzIGluIG9yZGVyIG9mIGluY3JlYXNpbmcgaWRzIHNvIHdlIGFyZQogICAgLy8gZ3VhcmFudGVlZCB0aGF0IHdlIGhhdmUgY29tcHV0ZWQgZG9taW5hdG9ycyBmb3IgYWxsIGJsb2NrcwogICAgLy8gaGlnaGVyIHVwIGluIHRoZSBkb21pbmF0b3IgdHJlZS4KICAgIGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBibG9ja3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgSEJhc2ljQmxvY2sgYmxvY2sgPSBibG9ja3NbaV07CiAgICAgIExpc3Q8SEJhc2ljQmxvY2s+IHByZWRlY2Vzc29ycyA9IGJsb2NrLnByZWRlY2Vzc29yczsKICAgICAgaWYgKGJsb2NrLmlzTG9vcEhlYWRlcigpKSB7CiAgICAgICAgYmxvY2suYXNzaWduQ29tbW9uRG9taW5hdG9yKHByZWRlY2Vzc29yc1swXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChpbnQgaiA9IHByZWRlY2Vzc29ycy5sZW5ndGggLSAxOyBqID49IDA7IGotLSkgewogICAgICAgICAgYmxvY2suYXNzaWduQ29tbW9uRG9taW5hdG9yKHByZWRlY2Vzc29yc1tqXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBhc3NpZ25Eb21pbmF0b3JSYW5nZXMoKTsKICB9CgogIHZvaWQgYXNzaWduRG9taW5hdG9yUmFuZ2VzKCkgewogICAgLy8gREZTIHdhbGsgb2YgZG9taW5hdG9yIHRyZWUgdG8gYXNzaWduIGRmcy1pbiBhbmQgZGZzLW91dCBudW1iZXJzIHRvIGJhc2ljCiAgICAvLyBibG9ja3MuIEEgZG9taW5hdG9yIGhhcyBhIGRmcy1pbi4uZGZzLW91dCByYW5nZSB0aGF0IGluY2x1ZGVzIHRoZSByYW5nZQogICAgLy8gb2YgdGhlIGRvbWluYXRlZCBibG9jay4gU2VlIFtIR3JhcGhWaXNpdG9yLnZpc2l0RG9taW5hdG9yVHJlZV0gZm9yCiAgICAvLyByZWN1cnNpb24tZnJlZSBzY2hlbWEuCiAgICBfRnJhbWUgZnJhbWUgPSBuZXcgX0ZyYW1lKG51bGwpOwogICAgZnJhbWUuYmxvY2sgPSBlbnRyeTsKICAgIGZyYW1lLmluZGV4ID0gMDsKCiAgICBpbnQgZGZzTnVtYmVyID0gMDsKICAgIGZyYW1lLmJsb2NrLmRvbWluYXRvckRmc0luID0gZGZzTnVtYmVyOwoKICAgIHdoaWxlIChmcmFtZSAhPSBudWxsKSB7CiAgICAgIEhCYXNpY0Jsb2NrIGJsb2NrID0gZnJhbWUuYmxvY2s7CiAgICAgIGludCBpbmRleCA9IGZyYW1lLmluZGV4OwogICAgICBpZiAoaW5kZXggPCBibG9jay5kb21pbmF0ZWRCbG9ja3MubGVuZ3RoKSB7CiAgICAgICAgZnJhbWUuaW5kZXggPSBpbmRleCArIDE7CiAgICAgICAgZnJhbWUgPSBmcmFtZS5uZXh0ID8/PSBuZXcgX0ZyYW1lKGZyYW1lKTsKICAgICAgICBmcmFtZS5ibG9jayA9IGJsb2NrLmRvbWluYXRlZEJsb2Nrc1tpbmRleF07CiAgICAgICAgZnJhbWUuaW5kZXggPSAwOwogICAgICAgIGZyYW1lLmJsb2NrLmRvbWluYXRvckRmc0luID0gKytkZnNOdW1iZXI7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgYmxvY2suZG9taW5hdG9yRGZzT3V0ID0gZGZzTnVtYmVyOwogICAgICBmcmFtZSA9IGZyYW1lLnByZXZpb3VzOwogICAgfQogIH0KCiAgYm9vbCBpc1ZhbGlkKCkgewogICAgSFZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgSFZhbGlkYXRvcigpOwogICAgdmFsaWRhdG9yLnZpc2l0R3JhcGgodGhpcyk7CiAgICByZXR1cm4gdmFsaWRhdG9yLmlzVmFsaWQ7CiAgfQoKICBAb3ZlcnJpZGUKICB0b1N0cmluZygpID0+ICdIR3JhcGgoJGVsZW1lbnQpJzsKfQoKY2xhc3MgSEJhc2VWaXNpdG9yIGV4dGVuZHMgSEdyYXBoVmlzaXRvciBpbXBsZW1lbnRzIEhWaXNpdG9yIHsKICBIQmFzaWNCbG9jayBjdXJyZW50QmxvY2s7CgogIEBvdmVycmlkZQogIHZpc2l0QmFzaWNCbG9jayhIQmFzaWNCbG9jayBub2RlKSB7CiAgICBjdXJyZW50QmxvY2sgPSBub2RlOwoKICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IG5vZGUuZmlyc3Q7CiAgICB3aGlsZSAoaW5zdHJ1Y3Rpb24gIT0gbnVsbCkgewogICAgICBpbnN0cnVjdGlvbi5hY2NlcHQodGhpcyk7CiAgICAgIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb24ubmV4dDsKICAgIH0KICB9CgogIHZpc2l0SW5zdHJ1Y3Rpb24oSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7fQoKICB2aXNpdEJpbmFyeUFyaXRobWV0aWMoSEJpbmFyeUFyaXRobWV0aWMgbm9kZSkgPT4gdmlzaXRJbnZva2VCaW5hcnkobm9kZSk7CiAgdmlzaXRCaW5hcnlCaXRPcChIQmluYXJ5Qml0T3Agbm9kZSkgPT4gdmlzaXRJbnZva2VCaW5hcnkobm9kZSk7CiAgdmlzaXRJbnZva2UoSEludm9rZSBub2RlKSA9PiB2aXNpdEluc3RydWN0aW9uKG5vZGUpOwogIHZpc2l0SW52b2tlQmluYXJ5KEhJbnZva2VCaW5hcnkgbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKICB2aXNpdEludm9rZUR5bmFtaWMoSEludm9rZUR5bmFtaWMgbm9kZSkgPT4gdmlzaXRJbnZva2Uobm9kZSk7CiAgdmlzaXRJbnZva2VEeW5hbWljRmllbGQoSEludm9rZUR5bmFtaWNGaWVsZCBub2RlKSA9PiB2aXNpdEludm9rZUR5bmFtaWMobm9kZSk7CiAgdmlzaXRJbnZva2VVbmFyeShISW52b2tlVW5hcnkgbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKICB2aXNpdENvbmRpdGlvbmFsQnJhbmNoKEhDb25kaXRpb25hbEJyYW5jaCBub2RlKSA9PiB2aXNpdENvbnRyb2xGbG93KG5vZGUpOwogIHZpc2l0Q29udHJvbEZsb3coSENvbnRyb2xGbG93IG5vZGUpID0+IHZpc2l0SW5zdHJ1Y3Rpb24obm9kZSk7CiAgdmlzaXRGaWVsZEFjY2VzcyhIRmllbGRBY2Nlc3Mgbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKICB2aXNpdFJlbGF0aW9uYWwoSFJlbGF0aW9uYWwgbm9kZSkgPT4gdmlzaXRJbnZva2VCaW5hcnkobm9kZSk7CgogIEBvdmVycmlkZQogIHZpc2l0QWJzKEhBYnMgbm9kZSkgPT4gdmlzaXRJbnZva2VVbmFyeShub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdEFkZChIQWRkIG5vZGUpID0+IHZpc2l0QmluYXJ5QXJpdGhtZXRpYyhub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdEJpdEFuZChIQml0QW5kIG5vZGUpID0+IHZpc2l0QmluYXJ5Qml0T3Aobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRCaXROb3QoSEJpdE5vdCBub2RlKSA9PiB2aXNpdEludm9rZVVuYXJ5KG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0Qml0T3IoSEJpdE9yIG5vZGUpID0+IHZpc2l0QmluYXJ5Qml0T3Aobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRCaXRYb3IoSEJpdFhvciBub2RlKSA9PiB2aXNpdEJpbmFyeUJpdE9wKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0Qm9vbGlmeShIQm9vbGlmeSBub2RlKSA9PiB2aXNpdEluc3RydWN0aW9uKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0Qm91bmRzQ2hlY2soSEJvdW5kc0NoZWNrIG5vZGUpID0+IHZpc2l0Q2hlY2sobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRCcmVhayhIQnJlYWsgbm9kZSkgPT4gdmlzaXRKdW1wKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0Q29udGludWUoSENvbnRpbnVlIG5vZGUpID0+IHZpc2l0SnVtcChub2RlKTsKICB2aXNpdENoZWNrKEhDaGVjayBub2RlKSA9PiB2aXNpdEluc3RydWN0aW9uKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0Q29uc3RhbnQoSENvbnN0YW50IG5vZGUpID0+IHZpc2l0SW5zdHJ1Y3Rpb24obm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRDcmVhdGUoSENyZWF0ZSBub2RlKSA9PiB2aXNpdEluc3RydWN0aW9uKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0Q3JlYXRlQm94KEhDcmVhdGVCb3ggbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdERpdmlkZShIRGl2aWRlIG5vZGUpID0+IHZpc2l0QmluYXJ5QXJpdGhtZXRpYyhub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdEV4aXQoSEV4aXQgbm9kZSkgPT4gdmlzaXRDb250cm9sRmxvdyhub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdEV4aXRUcnkoSEV4aXRUcnkgbm9kZSkgPT4gdmlzaXRDb250cm9sRmxvdyhub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdEZpZWxkR2V0KEhGaWVsZEdldCBub2RlKSA9PiB2aXNpdEZpZWxkQWNjZXNzKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0RmllbGRTZXQoSEZpZWxkU2V0IG5vZGUpID0+IHZpc2l0RmllbGRBY2Nlc3Mobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRGb3JlaWduQ29kZShIRm9yZWlnbkNvZGUgbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdEdldExlbmd0aChIR2V0TGVuZ3RoIG5vZGUpID0+IHZpc2l0SW5zdHJ1Y3Rpb24obm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRHb3RvKEhHb3RvIG5vZGUpID0+IHZpc2l0Q29udHJvbEZsb3cobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRHcmVhdGVyKEhHcmVhdGVyIG5vZGUpID0+IHZpc2l0UmVsYXRpb25hbChub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdEdyZWF0ZXJFcXVhbChIR3JlYXRlckVxdWFsIG5vZGUpID0+IHZpc2l0UmVsYXRpb25hbChub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdElkZW50aXR5KEhJZGVudGl0eSBub2RlKSA9PiB2aXNpdFJlbGF0aW9uYWwobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRJZihISWYgbm9kZSkgPT4gdmlzaXRDb25kaXRpb25hbEJyYW5jaChub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdEluZGV4KEhJbmRleCBub2RlKSA9PiB2aXNpdEluc3RydWN0aW9uKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0SW5kZXhBc3NpZ24oSEluZGV4QXNzaWduIG5vZGUpID0+IHZpc2l0SW5zdHJ1Y3Rpb24obm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRJbnRlcmNlcHRvcihISW50ZXJjZXB0b3Igbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdEludm9rZUNsb3N1cmUoSEludm9rZUNsb3N1cmUgbm9kZSkgPT4gdmlzaXRJbnZva2VEeW5hbWljKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0SW52b2tlQ29uc3RydWN0b3JCb2R5KEhJbnZva2VDb25zdHJ1Y3RvckJvZHkgbm9kZSkgPT4KICAgICAgdmlzaXRJbnZva2VTdGF0aWMobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRJbnZva2VHZW5lcmF0b3JCb2R5KEhJbnZva2VHZW5lcmF0b3JCb2R5IG5vZGUpID0+CiAgICAgIHZpc2l0SW52b2tlU3RhdGljKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0SW52b2tlRHluYW1pY01ldGhvZChISW52b2tlRHluYW1pY01ldGhvZCBub2RlKSA9PgogICAgICB2aXNpdEludm9rZUR5bmFtaWMobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRJbnZva2VEeW5hbWljR2V0dGVyKEhJbnZva2VEeW5hbWljR2V0dGVyIG5vZGUpID0+CiAgICAgIHZpc2l0SW52b2tlRHluYW1pY0ZpZWxkKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0SW52b2tlRHluYW1pY1NldHRlcihISW52b2tlRHluYW1pY1NldHRlciBub2RlKSA9PgogICAgICB2aXNpdEludm9rZUR5bmFtaWNGaWVsZChub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdEludm9rZVN0YXRpYyhISW52b2tlU3RhdGljIG5vZGUpID0+IHZpc2l0SW52b2tlKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0SW52b2tlU3VwZXIoSEludm9rZVN1cGVyIG5vZGUpID0+IHZpc2l0SW52b2tlU3RhdGljKG5vZGUpOwogIHZpc2l0SnVtcChISnVtcCBub2RlKSA9PiB2aXNpdENvbnRyb2xGbG93KG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0TGF6eVN0YXRpYyhITGF6eVN0YXRpYyBub2RlKSA9PiB2aXNpdEluc3RydWN0aW9uKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0TGVzcyhITGVzcyBub2RlKSA9PiB2aXNpdFJlbGF0aW9uYWwobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRMZXNzRXF1YWwoSExlc3NFcXVhbCBub2RlKSA9PiB2aXNpdFJlbGF0aW9uYWwobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRMaXRlcmFsTGlzdChITGl0ZXJhbExpc3Qgbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKICB2aXNpdExvY2FsQWNjZXNzKEhMb2NhbEFjY2VzcyBub2RlKSA9PiB2aXNpdEluc3RydWN0aW9uKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0TG9jYWxHZXQoSExvY2FsR2V0IG5vZGUpID0+IHZpc2l0TG9jYWxBY2Nlc3Mobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRMb2NhbFNldChITG9jYWxTZXQgbm9kZSkgPT4gdmlzaXRMb2NhbEFjY2Vzcyhub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdExvY2FsVmFsdWUoSExvY2FsVmFsdWUgbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdExvb3BCcmFuY2goSExvb3BCcmFuY2ggbm9kZSkgPT4gdmlzaXRDb25kaXRpb25hbEJyYW5jaChub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdE5lZ2F0ZShITmVnYXRlIG5vZGUpID0+IHZpc2l0SW52b2tlVW5hcnkobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXROb3QoSE5vdCBub2RlKSA9PiB2aXNpdEluc3RydWN0aW9uKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0T25lU2hvdEludGVyY2VwdG9yKEhPbmVTaG90SW50ZXJjZXB0b3Igbm9kZSkgPT4gdmlzaXRJbnZva2VEeW5hbWljKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0UGhpKEhQaGkgbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdE11bHRpcGx5KEhNdWx0aXBseSBub2RlKSA9PiB2aXNpdEJpbmFyeUFyaXRobWV0aWMobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRQYXJhbWV0ZXJWYWx1ZShIUGFyYW1ldGVyVmFsdWUgbm9kZSkgPT4gdmlzaXRMb2NhbFZhbHVlKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0UmFuZ2VDb252ZXJzaW9uKEhSYW5nZUNvbnZlcnNpb24gbm9kZSkgPT4gdmlzaXRDaGVjayhub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdFJlYWRNb2RpZnlXcml0ZShIUmVhZE1vZGlmeVdyaXRlIG5vZGUpID0+IHZpc2l0SW5zdHJ1Y3Rpb24obm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRSZWYoSFJlZiBub2RlKSA9PiBub2RlLnZhbHVlLmFjY2VwdCh0aGlzKTsKICBAb3ZlcnJpZGUKICB2aXNpdFJlbWFpbmRlcihIUmVtYWluZGVyIG5vZGUpID0+IHZpc2l0QmluYXJ5QXJpdGhtZXRpYyhub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdFJldHVybihIUmV0dXJuIG5vZGUpID0+IHZpc2l0Q29udHJvbEZsb3cobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRTaGlmdExlZnQoSFNoaWZ0TGVmdCBub2RlKSA9PiB2aXNpdEJpbmFyeUJpdE9wKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0U2hpZnRSaWdodChIU2hpZnRSaWdodCBub2RlKSA9PiB2aXNpdEJpbmFyeUJpdE9wKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0U3VidHJhY3QoSFN1YnRyYWN0IG5vZGUpID0+IHZpc2l0QmluYXJ5QXJpdGhtZXRpYyhub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdFN3aXRjaChIU3dpdGNoIG5vZGUpID0+IHZpc2l0Q29udHJvbEZsb3cobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRTdGF0aWMoSFN0YXRpYyBub2RlKSA9PiB2aXNpdEluc3RydWN0aW9uKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0U3RhdGljU3RvcmUoSFN0YXRpY1N0b3JlIG5vZGUpID0+IHZpc2l0SW5zdHJ1Y3Rpb24obm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRTdHJpbmdDb25jYXQoSFN0cmluZ0NvbmNhdCBub2RlKSA9PiB2aXNpdEluc3RydWN0aW9uKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0U3RyaW5naWZ5KEhTdHJpbmdpZnkgbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdFRoaXMoSFRoaXMgbm9kZSkgPT4gdmlzaXRQYXJhbWV0ZXJWYWx1ZShub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdFRocm93KEhUaHJvdyBub2RlKSA9PiB2aXNpdENvbnRyb2xGbG93KG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0VGhyb3dFeHByZXNzaW9uKEhUaHJvd0V4cHJlc3Npb24gbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdFRydW5jYXRpbmdEaXZpZGUoSFRydW5jYXRpbmdEaXZpZGUgbm9kZSkgPT4gdmlzaXRCaW5hcnlBcml0aG1ldGljKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0VHJ5KEhUcnkgbm9kZSkgPT4gdmlzaXRDb250cm9sRmxvdyhub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdElzKEhJcyBub2RlKSA9PiB2aXNpdEluc3RydWN0aW9uKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0TGF0ZVZhbHVlKEhMYXRlVmFsdWUgbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdElzVmlhSW50ZXJjZXB0b3IoSElzVmlhSW50ZXJjZXB0b3Igbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdFR5cGVDb252ZXJzaW9uKEhUeXBlQ29udmVyc2lvbiBub2RlKSA9PiB2aXNpdENoZWNrKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0VHlwZUtub3duKEhUeXBlS25vd24gbm9kZSkgPT4gdmlzaXRDaGVjayhub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdEF3YWl0KEhBd2FpdCBub2RlKSA9PiB2aXNpdEluc3RydWN0aW9uKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0WWllbGQoSFlpZWxkIG5vZGUpID0+IHZpc2l0SW5zdHJ1Y3Rpb24obm9kZSk7CgogIEBvdmVycmlkZQogIHZpc2l0VHlwZUluZm9SZWFkUmF3KEhUeXBlSW5mb1JlYWRSYXcgbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdFR5cGVJbmZvUmVhZFZhcmlhYmxlKEhUeXBlSW5mb1JlYWRWYXJpYWJsZSBub2RlKSA9PgogICAgICB2aXNpdEluc3RydWN0aW9uKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0VHlwZUluZm9FeHByZXNzaW9uKEhUeXBlSW5mb0V4cHJlc3Npb24gbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKfQoKY2xhc3MgU3ViR3JhcGggewogIC8vIFRoZSBmaXJzdCBhbmQgbGFzdCBibG9jayBvZiB0aGUgc3ViLWdyYXBoLgogIGZpbmFsIEhCYXNpY0Jsb2NrIHN0YXJ0OwogIGZpbmFsIEhCYXNpY0Jsb2NrIGVuZDsKCiAgY29uc3QgU3ViR3JhcGgodGhpcy5zdGFydCwgdGhpcy5lbmQpOwoKICBib29sIGNvbnRhaW5zKEhCYXNpY0Jsb2NrIGJsb2NrKSB7CiAgICBhc3NlcnQoc3RhcnQgIT0gbnVsbCk7CiAgICBhc3NlcnQoZW5kICE9IG51bGwpOwogICAgYXNzZXJ0KGJsb2NrICE9IG51bGwpOwogICAgcmV0dXJuIHN0YXJ0LmlkIDw9IGJsb2NrLmlkICYmIGJsb2NrLmlkIDw9IGVuZC5pZDsKICB9Cn0KCmNsYXNzIFN1YkV4cHJlc3Npb24gZXh0ZW5kcyBTdWJHcmFwaCB7CiAgY29uc3QgU3ViRXhwcmVzc2lvbihIQmFzaWNCbG9jayBzdGFydCwgSEJhc2ljQmxvY2sgZW5kKSA6IHN1cGVyKHN0YXJ0LCBlbmQpOwoKICAvLy8gRmluZCB0aGUgY29uZGl0aW9uIGV4cHJlc3Npb24gaWYgdGhpcyBzdWItZXhwcmVzc2lvbiBpcyBhIGNvbmRpdGlvbi4KICBISW5zdHJ1Y3Rpb24gZ2V0IGNvbmRpdGlvbkV4cHJlc3Npb24gewogICAgSEluc3RydWN0aW9uIGxhc3QgPSBlbmQubGFzdDsKICAgIGlmIChsYXN0IGlzIEhDb25kaXRpb25hbEJyYW5jaCB8fCBsYXN0IGlzIEhTd2l0Y2gpIHJldHVybiBsYXN0LmlucHV0c1swXTsKICAgIHJldHVybiBudWxsOwogIH0KfQoKY2xhc3MgSEluc3RydWN0aW9uTGlzdCB7CiAgSEluc3RydWN0aW9uIGZpcnN0ID0gbnVsbDsKICBISW5zdHJ1Y3Rpb24gbGFzdCA9IG51bGw7CgogIGJvb2wgZ2V0IGlzRW1wdHkgewogICAgcmV0dXJuIGZpcnN0ID09IG51bGw7CiAgfQoKICB2b2lkIGludGVybmFsQWRkQWZ0ZXIoSEluc3RydWN0aW9uIGN1cnNvciwgSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBpZiAoY3Vyc29yID09IG51bGwpIHsKICAgICAgYXNzZXJ0KGlzRW1wdHkpOwogICAgICBmaXJzdCA9IGxhc3QgPSBpbnN0cnVjdGlvbjsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKGN1cnNvciwgbGFzdCkpIHsKICAgICAgbGFzdC5uZXh0ID0gaW5zdHJ1Y3Rpb247CiAgICAgIGluc3RydWN0aW9uLnByZXZpb3VzID0gbGFzdDsKICAgICAgbGFzdCA9IGluc3RydWN0aW9uOwogICAgfSBlbHNlIHsKICAgICAgaW5zdHJ1Y3Rpb24ucHJldmlvdXMgPSBjdXJzb3I7CiAgICAgIGluc3RydWN0aW9uLm5leHQgPSBjdXJzb3IubmV4dDsKICAgICAgY3Vyc29yLm5leHQucHJldmlvdXMgPSBpbnN0cnVjdGlvbjsKICAgICAgY3Vyc29yLm5leHQgPSBpbnN0cnVjdGlvbjsKICAgIH0KICB9CgogIHZvaWQgaW50ZXJuYWxBZGRCZWZvcmUoSEluc3RydWN0aW9uIGN1cnNvciwgSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBpZiAoY3Vyc29yID09IG51bGwpIHsKICAgICAgYXNzZXJ0KGlzRW1wdHkpOwogICAgICBmaXJzdCA9IGxhc3QgPSBpbnN0cnVjdGlvbjsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKGN1cnNvciwgZmlyc3QpKSB7CiAgICAgIGZpcnN0LnByZXZpb3VzID0gaW5zdHJ1Y3Rpb247CiAgICAgIGluc3RydWN0aW9uLm5leHQgPSBmaXJzdDsKICAgICAgZmlyc3QgPSBpbnN0cnVjdGlvbjsKICAgIH0gZWxzZSB7CiAgICAgIGluc3RydWN0aW9uLm5leHQgPSBjdXJzb3I7CiAgICAgIGluc3RydWN0aW9uLnByZXZpb3VzID0gY3Vyc29yLnByZXZpb3VzOwogICAgICBjdXJzb3IucHJldmlvdXMubmV4dCA9IGluc3RydWN0aW9uOwogICAgICBjdXJzb3IucHJldmlvdXMgPSBpbnN0cnVjdGlvbjsKICAgIH0KICB9CgogIHZvaWQgZGV0YWNoKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgYXNzZXJ0KF90cnVuY2F0ZWRDb250YWluc0ZvckFzc2VydChpbnN0cnVjdGlvbikpOwogICAgYXNzZXJ0KGluc3RydWN0aW9uLmlzSW5CYXNpY0Jsb2NrKCkpOwogICAgaWYgKGluc3RydWN0aW9uLnByZXZpb3VzID09IG51bGwpIHsKICAgICAgZmlyc3QgPSBpbnN0cnVjdGlvbi5uZXh0OwogICAgfSBlbHNlIHsKICAgICAgaW5zdHJ1Y3Rpb24ucHJldmlvdXMubmV4dCA9IGluc3RydWN0aW9uLm5leHQ7CiAgICB9CiAgICBpZiAoaW5zdHJ1Y3Rpb24ubmV4dCA9PSBudWxsKSB7CiAgICAgIGxhc3QgPSBpbnN0cnVjdGlvbi5wcmV2aW91czsKICAgIH0gZWxzZSB7CiAgICAgIGluc3RydWN0aW9uLm5leHQucHJldmlvdXMgPSBpbnN0cnVjdGlvbi5wcmV2aW91czsKICAgIH0KICAgIGluc3RydWN0aW9uLnByZXZpb3VzID0gbnVsbDsKICAgIGluc3RydWN0aW9uLm5leHQgPSBudWxsOwogIH0KCiAgdm9pZCByZW1vdmUoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBhc3NlcnQoaW5zdHJ1Y3Rpb24udXNlZEJ5LmlzRW1wdHkpOwogICAgZGV0YWNoKGluc3RydWN0aW9uKTsKICB9CgogIC8vLyBMaW5lYXIgc2VhcmNoIGZvciBbaW5zdHJ1Y3Rpb25dLgogIGJvb2wgY29udGFpbnMoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBISW5zdHJ1Y3Rpb24gY3Vyc29yID0gZmlyc3Q7CiAgICB3aGlsZSAoY3Vyc29yICE9IG51bGwpIHsKICAgICAgaWYgKGlkZW50aWNhbChjdXJzb3IsIGluc3RydWN0aW9uKSkgcmV0dXJuIHRydWU7CiAgICAgIGN1cnNvciA9IGN1cnNvci5uZXh0OwogICAgfQoKICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vLyBMaW5lYXIgc2VhcmNoIGZvciBbaW5zdHJ1Y3Rpb25dLCB1cCB0byBhIGxpbWl0IG9mIDEwMC4gUmV0dXJucyB3aGV0aGVyCiAgLy8vIHRoZSBpbnN0cnVjdGlvbiBpcyBmb3VuZCBvciB0aGUgbGlzdCBpcyB0b28gYmlnLgogIC8vLwogIC8vLyBUaGlzIGlzIHVzZWQgZm9yIGFzc2VydGlvbnMgb25seTogc29tZSB0ZXN0cyBoYXZlIHBhdGhvbG9naWNhbCBjYXNlcyB3aGVyZQogIC8vLyB0aGUgYmFzaWMgYmxvY2tzIGFyZSBodWdlICg1MEsgbm9kZXMhKSwgYW5kIHdlIGZvdW5kIHRoYXQgY2hlY2tpbmcgZm9yCiAgLy8vIFtjb250YWluc10gd2l0aGluIG91ciBhc3NlcnRpb25zIG1hZGUgY29tcGlsYXRpb24gcmVhbGx5IHNsb3cuCiAgYm9vbCBfdHJ1bmNhdGVkQ29udGFpbnNGb3JBc3NlcnQoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBISW5zdHJ1Y3Rpb24gY3Vyc29yID0gZmlyc3Q7CiAgICBpbnQgY291bnQgPSAwOwogICAgd2hpbGUgKGN1cnNvciAhPSBudWxsKSB7CiAgICAgIGNvdW50Kys7CiAgICAgIGlmIChjb3VudCA+IDEwMCkgcmV0dXJuIHRydWU7CiAgICAgIGlmIChpZGVudGljYWwoY3Vyc29yLCBpbnN0cnVjdGlvbikpIHJldHVybiB0cnVlOwogICAgICBjdXJzb3IgPSBjdXJzb3IubmV4dDsKICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CgpjbGFzcyBIQmFzaWNCbG9jayBleHRlbmRzIEhJbnN0cnVjdGlvbkxpc3QgewogIC8vIFRoZSBbaWRdIG11c3QgYmUgc3VjaCB0aGF0IGFueSBzdWNjZXNzb3IncyBpZCBpcyBncmVhdGVyIHRoYW4KICAvLyB0aGlzIFtpZF0uIFRoZSBleGNlcHRpb24gYXJlIGJhY2stZWRnZXMuCiAgaW50IGlkOwoKICBzdGF0aWMgY29uc3QgaW50IFNUQVRVU19ORVcgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgU1RBVFVTX09QRU4gPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgU1RBVFVTX0NMT1NFRCA9IDI7CiAgaW50IHN0YXR1cyA9IFNUQVRVU19ORVc7CgogIEhJbnN0cnVjdGlvbkxpc3QgcGhpczsKCiAgSExvb3BJbmZvcm1hdGlvbiBsb29wSW5mb3JtYXRpb24gPSBudWxsOwogIEhCbG9ja0Zsb3cgYmxvY2tGbG93ID0gbnVsbDsKICBIQmFzaWNCbG9jayBwYXJlbnRMb29wSGVhZGVyID0gbnVsbDsKICBib29sIGlzTGl2ZSA9IHRydWU7CgogIGZpbmFsIExpc3Q8SEJhc2ljQmxvY2s+IHByZWRlY2Vzc29yczsKICBMaXN0PEhCYXNpY0Jsb2NrPiBzdWNjZXNzb3JzOwoKICBIQmFzaWNCbG9jayBkb21pbmF0b3IgPSBudWxsOwogIGZpbmFsIExpc3Q8SEJhc2ljQmxvY2s+IGRvbWluYXRlZEJsb2NrczsKICBpbnQgZG9taW5hdG9yRGZzSW47CiAgaW50IGRvbWluYXRvckRmc091dDsKCiAgSEJhc2ljQmxvY2soKSA6IHRoaXMud2l0aElkKG51bGwpOwogIEhCYXNpY0Jsb2NrLndpdGhJZCh0aGlzLmlkKQogICAgICA6IHBoaXMgPSBuZXcgSEluc3RydWN0aW9uTGlzdCgpLAogICAgICAgIHByZWRlY2Vzc29ycyA9IDxIQmFzaWNCbG9jaz5bXSwKICAgICAgICBzdWNjZXNzb3JzID0gY29uc3QgPEhCYXNpY0Jsb2NrPltdLAogICAgICAgIGRvbWluYXRlZEJsb2NrcyA9IDxIQmFzaWNCbG9jaz5bXTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBpZDsKCiAgYm9vbCBpc05ldygpID0+IHN0YXR1cyA9PSBTVEFUVVNfTkVXOwogIGJvb2wgaXNPcGVuKCkgPT4gc3RhdHVzID09IFNUQVRVU19PUEVOOwogIGJvb2wgaXNDbG9zZWQoKSA9PiBzdGF0dXMgPT0gU1RBVFVTX0NMT1NFRDsKCiAgYm9vbCBpc0xvb3BIZWFkZXIoKSB7CiAgICByZXR1cm4gbG9vcEluZm9ybWF0aW9uICE9IG51bGw7CiAgfQoKICB2b2lkIHNldEJsb2NrRmxvdyhIQmxvY2tJbmZvcm1hdGlvbiBibG9ja0luZm8sIEhCYXNpY0Jsb2NrIGNvbnRpbnVhdGlvbikgewogICAgYmxvY2tGbG93ID0gbmV3IEhCbG9ja0Zsb3coYmxvY2tJbmZvLCBjb250aW51YXRpb24pOwogIH0KCiAgYm9vbCBpc0xhYmVsZWRCbG9jaygpID0+CiAgICAgIGJsb2NrRmxvdyAhPSBudWxsICYmIGJsb2NrRmxvdy5ib2R5IGlzIEhMYWJlbGVkQmxvY2tJbmZvcm1hdGlvbjsKCiAgSEJhc2ljQmxvY2sgZ2V0IGVuY2xvc2luZ0xvb3BIZWFkZXIgewogICAgaWYgKGlzTG9vcEhlYWRlcigpKSByZXR1cm4gdGhpczsKICAgIHJldHVybiBwYXJlbnRMb29wSGVhZGVyOwogIH0KCiAgdm9pZCBvcGVuKCkgewogICAgYXNzZXJ0KGlzTmV3KCkpOwogICAgc3RhdHVzID0gU1RBVFVTX09QRU47CiAgfQoKICB2b2lkIGNsb3NlKEhDb250cm9sRmxvdyBlbmQpIHsKICAgIGFzc2VydChpc09wZW4oKSk7CiAgICBhZGRBZnRlcihsYXN0LCBlbmQpOwogICAgc3RhdHVzID0gU1RBVFVTX0NMT1NFRDsKICB9CgogIHZvaWQgYWRkQXRFbnRyeShISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGFzc2VydChpbnN0cnVjdGlvbiBpcyEgSFBoaSk7CiAgICBpbnRlcm5hbEFkZEJlZm9yZShmaXJzdCwgaW5zdHJ1Y3Rpb24pOwogICAgaW5zdHJ1Y3Rpb24ubm90aWZ5QWRkZWRUb0Jsb2NrKHRoaXMpOwogIH0KCiAgdm9pZCBhZGRBdEV4aXQoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBhc3NlcnQoaXNDbG9zZWQoKSk7CiAgICBhc3NlcnQobGFzdCBpcyBIQ29udHJvbEZsb3cpOwogICAgYXNzZXJ0KGluc3RydWN0aW9uIGlzISBIUGhpKTsKICAgIGludGVybmFsQWRkQmVmb3JlKGxhc3QsIGluc3RydWN0aW9uKTsKICAgIGluc3RydWN0aW9uLm5vdGlmeUFkZGVkVG9CbG9jayh0aGlzKTsKICB9CgogIHZvaWQgbW92ZUF0RXhpdChISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGFzc2VydChpbnN0cnVjdGlvbiBpcyEgSFBoaSk7CiAgICBhc3NlcnQoaW5zdHJ1Y3Rpb24uaXNJbkJhc2ljQmxvY2soKSk7CiAgICBhc3NlcnQoaXNDbG9zZWQoKSk7CiAgICBhc3NlcnQobGFzdCBpcyBIQ29udHJvbEZsb3cpOwogICAgaW50ZXJuYWxBZGRCZWZvcmUobGFzdCwgaW5zdHJ1Y3Rpb24pOwogICAgaW5zdHJ1Y3Rpb24uYmxvY2sgPSB0aGlzOwogICAgYXNzZXJ0KGlzVmFsaWQoKSk7CiAgfQoKICB2b2lkIGFkZChISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGFzc2VydChpbnN0cnVjdGlvbiBpcyEgSENvbnRyb2xGbG93KTsKICAgIGFzc2VydChpbnN0cnVjdGlvbiBpcyEgSFBoaSk7CiAgICBpbnRlcm5hbEFkZEFmdGVyKGxhc3QsIGluc3RydWN0aW9uKTsKICAgIGluc3RydWN0aW9uLm5vdGlmeUFkZGVkVG9CbG9jayh0aGlzKTsKICB9CgogIHZvaWQgYWRkUGhpKEhQaGkgcGhpKSB7CiAgICBhc3NlcnQocGhpLmlucHV0cy5sZW5ndGggPT0gMCB8fCBwaGkuaW5wdXRzLmxlbmd0aCA9PSBwcmVkZWNlc3NvcnMubGVuZ3RoKTsKICAgIGFzc2VydChwaGkuYmxvY2sgPT0gbnVsbCk7CiAgICBwaGlzLmludGVybmFsQWRkQWZ0ZXIocGhpcy5sYXN0LCBwaGkpOwogICAgcGhpLm5vdGlmeUFkZGVkVG9CbG9jayh0aGlzKTsKICB9CgogIHZvaWQgcmVtb3ZlUGhpKEhQaGkgcGhpKSB7CiAgICBwaGlzLnJlbW92ZShwaGkpOwogICAgYXNzZXJ0KHBoaS5ibG9jayA9PSB0aGlzKTsKICAgIHBoaS5ub3RpZnlSZW1vdmVkRnJvbUJsb2NrKCk7CiAgfQoKICB2b2lkIGFkZEFmdGVyKEhJbnN0cnVjdGlvbiBjdXJzb3IsIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgYXNzZXJ0KGN1cnNvciBpcyEgSFBoaSk7CiAgICBhc3NlcnQoaW5zdHJ1Y3Rpb24gaXMhIEhQaGkpOwogICAgYXNzZXJ0KGlzT3BlbigpIHx8IGlzQ2xvc2VkKCkpOwogICAgaW50ZXJuYWxBZGRBZnRlcihjdXJzb3IsIGluc3RydWN0aW9uKTsKICAgIGluc3RydWN0aW9uLm5vdGlmeUFkZGVkVG9CbG9jayh0aGlzKTsKICB9CgogIHZvaWQgYWRkQmVmb3JlKEhJbnN0cnVjdGlvbiBjdXJzb3IsIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgYXNzZXJ0KGN1cnNvciBpcyEgSFBoaSk7CiAgICBhc3NlcnQoaW5zdHJ1Y3Rpb24gaXMhIEhQaGkpOwogICAgYXNzZXJ0KGlzT3BlbigpIHx8IGlzQ2xvc2VkKCkpOwogICAgaW50ZXJuYWxBZGRCZWZvcmUoY3Vyc29yLCBpbnN0cnVjdGlvbik7CiAgICBpbnN0cnVjdGlvbi5ub3RpZnlBZGRlZFRvQmxvY2sodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlbW92ZShISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGFzc2VydChpc09wZW4oKSB8fCBpc0Nsb3NlZCgpKTsKICAgIGFzc2VydChpbnN0cnVjdGlvbiBpcyEgSFBoaSk7CiAgICBzdXBlci5yZW1vdmUoaW5zdHJ1Y3Rpb24pOwogICAgYXNzZXJ0KGluc3RydWN0aW9uLmJsb2NrID09IHRoaXMpOwogICAgaW5zdHJ1Y3Rpb24ubm90aWZ5UmVtb3ZlZEZyb21CbG9jaygpOwogIH0KCiAgdm9pZCBhZGRTdWNjZXNzb3IoSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIGlmIChzdWNjZXNzb3JzLmlzRW1wdHkpIHsKICAgICAgc3VjY2Vzc29ycyA9IFtibG9ja107CiAgICB9IGVsc2UgewogICAgICBzdWNjZXNzb3JzLmFkZChibG9jayk7CiAgICB9CiAgICBibG9jay5wcmVkZWNlc3NvcnMuYWRkKHRoaXMpOwogIH0KCiAgdm9pZCBwb3N0UHJvY2Vzc0xvb3BIZWFkZXIoKSB7CiAgICBhc3NlcnQoaXNMb29wSGVhZGVyKCkpOwogICAgLy8gT25seSB0aGUgZmlyc3QgZW50cnkgaW50byB0aGUgbG9vcCBpcyBmcm9tIG91dHNpZGUgdGhlCiAgICAvLyBsb29wLiBBbGwgb3RoZXIgZW50cmllcyBtdXN0IGJlIGJhY2sgZWRnZXMuCiAgICBmb3IgKGludCBpID0gMSwgbGVuZ3RoID0gcHJlZGVjZXNzb3JzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGxvb3BJbmZvcm1hdGlvbi5hZGRCYWNrRWRnZShwcmVkZWNlc3NvcnNbaV0pOwogICAgfQogIH0KCiAgLy8vIFJld3JpdGVzIGFsbCB1c2VzIG9mIHRoZSBbZnJvbV0gaW5zdHJ1Y3Rpb24gdG8gdXNpbmcgdGhlIFt0b10KICAvLy8gaW5zdHJ1Y3Rpb24gaW5zdGVhZC4KICB2b2lkIHJld3JpdGUoSEluc3RydWN0aW9uIGZyb20sIEhJbnN0cnVjdGlvbiB0bykgewogICAgZm9yIChISW5zdHJ1Y3Rpb24gdXNlIGluIGZyb20udXNlZEJ5KSB7CiAgICAgIHVzZS5yZXdyaXRlSW5wdXQoZnJvbSwgdG8pOwogICAgfQogICAgdG8udXNlZEJ5LmFkZEFsbChmcm9tLnVzZWRCeSk7CiAgICBmcm9tLnVzZWRCeS5jbGVhcigpOwogIH0KCiAgLy8vIFJld3JpdGVzIGFsbCB1c2VzIG9mIHRoZSBbZnJvbV0gaW5zdHJ1Y3Rpb24gdG8gdXNpbmcgZWl0aGVyIHRoZQogIC8vLyBbdG9dIGluc3RydWN0aW9uLCBvciBhIFtIQ2hlY2tdIGluc3RydWN0aW9uIHRoYXQgaGFzIGJldHRlciB0eXBlCiAgLy8vIGluZm9ybWF0aW9uIG9uIFt0b10sIGFuZCB0aGF0IGRvbWluYXRlcyB0aGUgdXNlci4KICB2b2lkIHJld3JpdGVXaXRoQmV0dGVyVXNlcihISW5zdHJ1Y3Rpb24gZnJvbSwgSEluc3RydWN0aW9uIHRvKSB7CiAgICAvLyBCVUcoMTE4NDEpOiBUdXJuIHRoaXMgbWV0aG9kIGludG8gYSBwaGFzZSB0byBiZSBydW4gYWZ0ZXIgR1ZOIHBoYXNlcy4KICAgIExpbms8SENoZWNrPiBiZXR0ZXIgPSBjb25zdCBMaW5rPEhDaGVjaz4oKTsKICAgIGZvciAoSEluc3RydWN0aW9uIHVzZXIgaW4gdG8udXNlZEJ5KSB7CiAgICAgIGlmICh1c2VyID09IGZyb20gfHwgdXNlciBpcyEgSENoZWNrKSBjb250aW51ZTsKICAgICAgSENoZWNrIGNoZWNrID0gdXNlcjsKICAgICAgaWYgKGNoZWNrLmNoZWNrZWRJbnB1dCA9PSB0bykgewogICAgICAgIGJldHRlciA9IGJldHRlci5wcmVwZW5kKHVzZXIpOwogICAgICB9CiAgICB9CgogICAgaWYgKGJldHRlci5pc0VtcHR5KSByZXR1cm4gcmV3cml0ZShmcm9tLCB0byk7CgogICAgTDE6CiAgICBmb3IgKEhJbnN0cnVjdGlvbiB1c2VyIGluIGZyb20udXNlZEJ5KSB7CiAgICAgIGZvciAoSENoZWNrIGNoZWNrIGluIGJldHRlcikgewogICAgICAgIGlmIChjaGVjay5kb21pbmF0ZXModXNlcikpIHsKICAgICAgICAgIHVzZXIucmV3cml0ZUlucHV0KGZyb20sIGNoZWNrKTsKICAgICAgICAgIGNoZWNrLnVzZWRCeS5hZGQodXNlcik7CiAgICAgICAgICBjb250aW51ZSBMMTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdXNlci5yZXdyaXRlSW5wdXQoZnJvbSwgdG8pOwogICAgICB0by51c2VkQnkuYWRkKHVzZXIpOwogICAgfQogICAgZnJvbS51c2VkQnkuY2xlYXIoKTsKICB9CgogIGJvb2wgaXNFeGl0QmxvY2soKSB7CiAgICByZXR1cm4gaWRlbnRpY2FsKGZpcnN0LCBsYXN0KSAmJiBmaXJzdCBpcyBIRXhpdDsKICB9CgogIHZvaWQgYWRkRG9taW5hdGVkQmxvY2soSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIGFzc2VydChpc0Nsb3NlZCgpKTsKICAgIGFzc2VydChpZCAhPSBudWxsICYmIGJsb2NrLmlkICE9IG51bGwpOwogICAgYXNzZXJ0KGRvbWluYXRlZEJsb2Nrcy5pbmRleE9mKGJsb2NrKSA8IDApOwogICAgLy8gS2VlcCB0aGUgbGlzdCBvZiBkb21pbmF0ZWQgYmxvY2tzIHNvcnRlZCBzdWNoIHRoYXQgaWYgdGhlcmUgYXJlIHR3bwogICAgLy8gc3VjY2VlZGluZyBibG9ja3MgaW4gdGhlIGxpc3QsIHRoZSBwcmVkZWNlc3NvciBpcyBiZWZvcmUgdGhlIHN1Y2Nlc3Nvci4KICAgIC8vIEFzc3VtZSB0aGF0IHdlIGFkZCB0aGUgZG9taW5hdGVkIGJsb2NrcyBpbiB0aGUgcmlnaHQgb3JkZXIuCiAgICBpbnQgaW5kZXggPSBkb21pbmF0ZWRCbG9ja3MubGVuZ3RoOwogICAgd2hpbGUgKGluZGV4ID4gMCAmJiBkb21pbmF0ZWRCbG9ja3NbaW5kZXggLSAxXS5pZCA+IGJsb2NrLmlkKSB7CiAgICAgIGluZGV4LS07CiAgICB9CiAgICBpZiAoaW5kZXggPT0gZG9taW5hdGVkQmxvY2tzLmxlbmd0aCkgewogICAgICBkb21pbmF0ZWRCbG9ja3MuYWRkKGJsb2NrKTsKICAgIH0gZWxzZSB7CiAgICAgIGRvbWluYXRlZEJsb2Nrcy5pbnNlcnQoaW5kZXgsIGJsb2NrKTsKICAgIH0KICAgIGFzc2VydChibG9jay5kb21pbmF0b3IgPT0gbnVsbCk7CiAgICBibG9jay5kb21pbmF0b3IgPSB0aGlzOwogIH0KCiAgdm9pZCByZW1vdmVEb21pbmF0ZWRCbG9jayhIQmFzaWNCbG9jayBibG9jaykgewogICAgYXNzZXJ0KGlzQ2xvc2VkKCkpOwogICAgYXNzZXJ0KGlkICE9IG51bGwgJiYgYmxvY2suaWQgIT0gbnVsbCk7CiAgICBpbnQgaW5kZXggPSBkb21pbmF0ZWRCbG9ja3MuaW5kZXhPZihibG9jayk7CiAgICBhc3NlcnQoaW5kZXggPj0gMCk7CiAgICBpZiAoaW5kZXggPT0gZG9taW5hdGVkQmxvY2tzLmxlbmd0aCAtIDEpIHsKICAgICAgZG9taW5hdGVkQmxvY2tzLnJlbW92ZUxhc3QoKTsKICAgIH0gZWxzZSB7CiAgICAgIGRvbWluYXRlZEJsb2Nrcy5yZW1vdmVSYW5nZShpbmRleCwgaW5kZXggKyAxKTsKICAgIH0KICAgIGFzc2VydChpZGVudGljYWwoYmxvY2suZG9taW5hdG9yLCB0aGlzKSk7CiAgICBibG9jay5kb21pbmF0b3IgPSBudWxsOwogIH0KCiAgdm9pZCBhc3NpZ25Db21tb25Eb21pbmF0b3IoSEJhc2ljQmxvY2sgcHJlZGVjZXNzb3IpIHsKICAgIGFzc2VydChpc0Nsb3NlZCgpKTsKICAgIGlmIChkb21pbmF0b3IgPT0gbnVsbCkgewogICAgICAvLyBJZiB0aGlzIGJhc2ljIGJsb2NrIGRvZXNuJ3QgaGF2ZSBhIGRvbWluYXRvciB5ZXQgd2UgdXNlIHRoZQogICAgICAvLyBnaXZlbiBwcmVkZWNlc3NvciBhcyB0aGUgZG9taW5hdG9yLgogICAgICBwcmVkZWNlc3Nvci5hZGREb21pbmF0ZWRCbG9jayh0aGlzKTsKICAgIH0gZWxzZSBpZiAocHJlZGVjZXNzb3IuZG9taW5hdG9yICE9IG51bGwpIHsKICAgICAgLy8gSWYgdGhlIHByZWRlY2Vzc29yIGhhcyBhIGRvbWluYXRvciBhbmQgdGhpcyBiYXNpYyBibG9jayBoYXMgYQogICAgICAvLyBkb21pbmF0b3IsIHdlIGZpbmQgYSBjb21tb24gcGFyZW50IGluIHRoZSBkb21pbmF0b3IgdHJlZSBhbmQKICAgICAgLy8gdXNlIHRoYXQgYXMgdGhlIGRvbWluYXRvci4KICAgICAgSEJhc2ljQmxvY2sgYmxvY2swID0gZG9taW5hdG9yOwogICAgICBIQmFzaWNCbG9jayBibG9jazEgPSBwcmVkZWNlc3NvcjsKICAgICAgd2hpbGUgKCFpZGVudGljYWwoYmxvY2swLCBibG9jazEpKSB7CiAgICAgICAgaWYgKGJsb2NrMC5pZCA+IGJsb2NrMS5pZCkgewogICAgICAgICAgYmxvY2swID0gYmxvY2swLmRvbWluYXRvcjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYmxvY2sxID0gYmxvY2sxLmRvbWluYXRvcjsKICAgICAgICB9CiAgICAgICAgYXNzZXJ0KGJsb2NrMCAhPSBudWxsICYmIGJsb2NrMSAhPSBudWxsKTsKICAgICAgfQogICAgICBpZiAoIWlkZW50aWNhbChkb21pbmF0b3IsIGJsb2NrMCkpIHsKICAgICAgICBkb21pbmF0b3IucmVtb3ZlRG9taW5hdGVkQmxvY2sodGhpcyk7CiAgICAgICAgYmxvY2swLmFkZERvbWluYXRlZEJsb2NrKHRoaXMpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGZvckVhY2hQaGkodm9pZCBmKEhQaGkgcGhpKSkgewogICAgSFBoaSBjdXJyZW50ID0gcGhpcy5maXJzdDsKICAgIHdoaWxlIChjdXJyZW50ICE9IG51bGwpIHsKICAgICAgSEluc3RydWN0aW9uIHNhdmVkID0gY3VycmVudC5uZXh0OwogICAgICBmKGN1cnJlbnQpOwogICAgICBjdXJyZW50ID0gc2F2ZWQ7CiAgICB9CiAgfQoKICB2b2lkIGZvckVhY2hJbnN0cnVjdGlvbih2b2lkIGYoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSkgewogICAgSEluc3RydWN0aW9uIGN1cnJlbnQgPSBmaXJzdDsKICAgIHdoaWxlIChjdXJyZW50ICE9IG51bGwpIHsKICAgICAgSEluc3RydWN0aW9uIHNhdmVkID0gY3VycmVudC5uZXh0OwogICAgICBmKGN1cnJlbnQpOwogICAgICBjdXJyZW50ID0gc2F2ZWQ7CiAgICB9CiAgfQoKICBib29sIGlzVmFsaWQoKSB7CiAgICBhc3NlcnQoaXNDbG9zZWQoKSk7CiAgICBIVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBIVmFsaWRhdG9yKCk7CiAgICB2YWxpZGF0b3IudmlzaXRCYXNpY0Jsb2NrKHRoaXMpOwogICAgcmV0dXJuIHZhbGlkYXRvci5pc1ZhbGlkOwogIH0KCiAgYm9vbCBkb21pbmF0ZXMoSEJhc2ljQmxvY2sgb3RoZXIpIHsKICAgIHJldHVybiB0aGlzLmRvbWluYXRvckRmc0luIDw9IG90aGVyLmRvbWluYXRvckRmc0luICYmCiAgICAgICAgb3RoZXIuZG9taW5hdG9yRGZzT3V0IDw9IHRoaXMuZG9taW5hdG9yRGZzT3V0OwogIH0KCiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAnSEJhc2ljQmxvY2soJGlkKSc7Cn0KCmFic3RyYWN0IGNsYXNzIEhJbnN0cnVjdGlvbiBpbXBsZW1lbnRzIFNwYW5uYWJsZSB7CiAgRW50aXR5IHNvdXJjZUVsZW1lbnQ7CiAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb247CgogIGZpbmFsIGludCBpZDsKICBzdGF0aWMgaW50IGlkQ291bnRlcjsKCiAgZmluYWwgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0czsKICBmaW5hbCBMaXN0PEhJbnN0cnVjdGlvbj4gdXNlZEJ5OwoKICBIQmFzaWNCbG9jayBibG9jazsKICBISW5zdHJ1Y3Rpb24gcHJldmlvdXMgPSBudWxsOwogIEhJbnN0cnVjdGlvbiBuZXh0ID0gbnVsbDsKCiAgU2lkZUVmZmVjdHMgc2lkZUVmZmVjdHMgPSBuZXcgU2lkZUVmZmVjdHMuZW1wdHkoKTsKICBib29sIF91c2VHdm4gPSBmYWxzZTsKCiAgLy8gVHlwZSBjb2Rlcy4KICBzdGF0aWMgY29uc3QgaW50IFVOREVGSU5FRF9UWVBFQ09ERSA9IC0xOwogIHN0YXRpYyBjb25zdCBpbnQgQk9PTElGWV9UWVBFQ09ERSA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBUWVBFX0dVQVJEX1RZUEVDT0RFID0gMTsKICBzdGF0aWMgY29uc3QgaW50IEJPVU5EU19DSEVDS19UWVBFQ09ERSA9IDI7CiAgc3RhdGljIGNvbnN0IGludCBJTlRFR0VSX0NIRUNLX1RZUEVDT0RFID0gMzsKICBzdGF0aWMgY29uc3QgaW50IElOVEVSQ0VQVE9SX1RZUEVDT0RFID0gNDsKICBzdGF0aWMgY29uc3QgaW50IEFERF9UWVBFQ09ERSA9IDU7CiAgc3RhdGljIGNvbnN0IGludCBESVZJREVfVFlQRUNPREUgPSA2OwogIHN0YXRpYyBjb25zdCBpbnQgTVVMVElQTFlfVFlQRUNPREUgPSA3OwogIHN0YXRpYyBjb25zdCBpbnQgU1VCVFJBQ1RfVFlQRUNPREUgPSA4OwogIHN0YXRpYyBjb25zdCBpbnQgU0hJRlRfTEVGVF9UWVBFQ09ERSA9IDk7CiAgc3RhdGljIGNvbnN0IGludCBCSVRfT1JfVFlQRUNPREUgPSAxMDsKICBzdGF0aWMgY29uc3QgaW50IEJJVF9BTkRfVFlQRUNPREUgPSAxMTsKICBzdGF0aWMgY29uc3QgaW50IEJJVF9YT1JfVFlQRUNPREUgPSAxMjsKICBzdGF0aWMgY29uc3QgaW50IE5FR0FURV9UWVBFQ09ERSA9IDEzOwogIHN0YXRpYyBjb25zdCBpbnQgQklUX05PVF9UWVBFQ09ERSA9IDE0OwogIHN0YXRpYyBjb25zdCBpbnQgTk9UX1RZUEVDT0RFID0gMTU7CiAgc3RhdGljIGNvbnN0IGludCBJREVOVElUWV9UWVBFQ09ERSA9IDE2OwogIHN0YXRpYyBjb25zdCBpbnQgR1JFQVRFUl9UWVBFQ09ERSA9IDE3OwogIHN0YXRpYyBjb25zdCBpbnQgR1JFQVRFUl9FUVVBTF9UWVBFQ09ERSA9IDE4OwogIHN0YXRpYyBjb25zdCBpbnQgTEVTU19UWVBFQ09ERSA9IDE5OwogIHN0YXRpYyBjb25zdCBpbnQgTEVTU19FUVVBTF9UWVBFQ09ERSA9IDIwOwogIHN0YXRpYyBjb25zdCBpbnQgU1RBVElDX1RZUEVDT0RFID0gMjE7CiAgc3RhdGljIGNvbnN0IGludCBTVEFUSUNfU1RPUkVfVFlQRUNPREUgPSAyMjsKICBzdGF0aWMgY29uc3QgaW50IEZJRUxEX0dFVF9UWVBFQ09ERSA9IDIzOwogIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9DT05WRVJTSU9OX1RZUEVDT0RFID0gMjQ7CiAgc3RhdGljIGNvbnN0IGludCBUWVBFX0tOT1dOX1RZUEVDT0RFID0gMjU7CiAgc3RhdGljIGNvbnN0IGludCBJTlZPS0VfU1RBVElDX1RZUEVDT0RFID0gMjY7CiAgc3RhdGljIGNvbnN0IGludCBJTkRFWF9UWVBFQ09ERSA9IDI3OwogIHN0YXRpYyBjb25zdCBpbnQgSVNfVFlQRUNPREUgPSAyODsKICBzdGF0aWMgY29uc3QgaW50IElOVk9LRV9EWU5BTUlDX1RZUEVDT0RFID0gMjk7CiAgc3RhdGljIGNvbnN0IGludCBTSElGVF9SSUdIVF9UWVBFQ09ERSA9IDMwOwoKICBzdGF0aWMgY29uc3QgaW50IFRSVU5DQVRJTkdfRElWSURFX1RZUEVDT0RFID0gMzY7CiAgc3RhdGljIGNvbnN0IGludCBJU19WSUFfSU5URVJDRVBUT1JfVFlQRUNPREUgPSAzNzsKCiAgc3RhdGljIGNvbnN0IGludCBUWVBFX0lORk9fUkVBRF9SQVdfVFlQRUNPREUgPSAzODsKICBzdGF0aWMgY29uc3QgaW50IFRZUEVfSU5GT19SRUFEX1ZBUklBQkxFX1RZUEVDT0RFID0gMzk7CiAgc3RhdGljIGNvbnN0IGludCBUWVBFX0lORk9fRVhQUkVTU0lPTl9UWVBFQ09ERSA9IDQwOwoKICBzdGF0aWMgY29uc3QgaW50IEZPUkVJR05fQ09ERV9UWVBFQ09ERSA9IDQxOwogIHN0YXRpYyBjb25zdCBpbnQgUkVNQUlOREVSX1RZUEVDT0RFID0gNDI7CiAgc3RhdGljIGNvbnN0IGludCBHRVRfTEVOR1RIX1RZUEVDT0RFID0gNDM7CiAgc3RhdGljIGNvbnN0IGludCBBQlNfVFlQRUNPREUgPSA0NDsKCiAgSEluc3RydWN0aW9uKHRoaXMuaW5wdXRzLCB0aGlzLmluc3RydWN0aW9uVHlwZSkKICAgICAgOiBpZCA9IGlkQ291bnRlcisrLAogICAgICAgIHVzZWRCeSA9IDxISW5zdHJ1Y3Rpb24+W10gewogICAgYXNzZXJ0KGlucHV0cy5ldmVyeSgoZSkgPT4gZSAhPSBudWxsKSwgImlucHV0czogJGlucHV0cyIpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBpZDsKCiAgYm9vbCB1c2VHdm4oKSA9PiBfdXNlR3ZuOwogIHZvaWQgc2V0VXNlR3ZuKCkgewogICAgX3VzZUd2biA9IHRydWU7CiAgfQoKICBib29sIGdldCBpc01vdmFibGUgPT4gdXNlR3ZuKCk7CgogIC8vLyBBIHB1cmUgaW5zdHJ1Y3Rpb24gaXMgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBkb2VzIG5vdCBoYXZlIGFueSBzaWRlCiAgLy8vIGVmZmVjdCwgbm9yIGFueSBkZXBlbmRlbmN5LiBUaGV5IGNhbiBiZSBtb3ZlZCBhbnl3aGVyZSBpbiB0aGUKICAvLy8gZ3JhcGguCiAgYm9vbCBpc1B1cmUoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pIHsKICAgIHJldHVybiAhc2lkZUVmZmVjdHMuaGFzU2lkZUVmZmVjdHMoKSAmJgogICAgICAgICFzaWRlRWZmZWN0cy5kZXBlbmRzT25Tb21ldGhpbmcoKSAmJgogICAgICAgICFjYW5UaHJvdyhkb21haW4pOwogIH0KCiAgLy8vIEFuIGluc3RydWN0aW9uIGlzIGFuICdhbGxvY2F0aW9uJyBpcyBpdCBpcyB0aGUgc29sZSBhbGlhcyBmb3IgYW4gb2JqZWN0LgogIC8vLyBUaGlzIGFwcGxpZXMgdG8gaW5zdHJ1Y3Rpb25zIHRoYXQgYWxsb2NhdGUgbmV3IG9iamVjdHMgYW5kIGNhbiBiZSBleHRlbmRlZAogIC8vLyB0byBtZXRob2RzIHRoYXQgcmV0dXJuIG90aGVyIGFsbG9jYXRpb25zIHdpdGhvdXQgZXNjYXBpbmcgdGhlbS4KICBib29sIGlzQWxsb2NhdGlvbihBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4gZmFsc2U7CgogIC8vLyBPdmVycmlkZGVuIGJ5IFtIQ2hlY2tdIHRvIHJldHVybiB0aGUgYWN0dWFsIG5vbi1bSENoZWNrXQogIC8vLyBpbnN0cnVjdGlvbiBpdCBjaGVja3MgYWdhaW5zdC4KICBISW5zdHJ1Y3Rpb24gbm9uQ2hlY2soKSA9PiB0aGlzOwoKICAvLy8gQ2FuIHRoaXMgbm9kZSB0aHJvdyBhbiBleGNlcHRpb24/CiAgYm9vbCBjYW5UaHJvdyhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4gZmFsc2U7CgogIC8vLyBEb2VzIHRoaXMgbm9kZSBwb3RlbnRpYWxseSBhZmZlY3QgY29udHJvbCBmbG93LgogIGJvb2wgaXNDb250cm9sRmxvdygpID0+IGZhbHNlOwoKICBib29sIGlzVmFsdWUoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc1ByaW1pdGl2ZVZhbHVlKGluc3RydWN0aW9uVHlwZSk7CgogIEFic3RyYWN0Qm9vbCBpc051bGwoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc051bGwoaW5zdHJ1Y3Rpb25UeXBlKTsKCiAgQWJzdHJhY3RCb29sIGlzQ29uZmxpY3RpbmcoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc0VtcHR5KGluc3RydWN0aW9uVHlwZSk7CgogIEFic3RyYWN0Qm9vbCBpc1ByaW1pdGl2ZShBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4KICAgICAgZG9tYWluLmlzUHJpbWl0aXZlKGluc3RydWN0aW9uVHlwZSk7CgogIEFic3RyYWN0Qm9vbCBpc1ByaW1pdGl2ZU51bWJlcihBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4KICAgICAgZG9tYWluLmlzUHJpbWl0aXZlTnVtYmVyKGluc3RydWN0aW9uVHlwZSk7CgogIEFic3RyYWN0Qm9vbCBpc1ByaW1pdGl2ZUJvb2xlYW4oQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc1ByaW1pdGl2ZUJvb2xlYW4oaW5zdHJ1Y3Rpb25UeXBlKTsKCiAgQWJzdHJhY3RCb29sIGlzUHJpbWl0aXZlQXJyYXkoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc1ByaW1pdGl2ZUFycmF5KGluc3RydWN0aW9uVHlwZSk7CgogIEFic3RyYWN0Qm9vbCBpc0luZGV4YWJsZVByaW1pdGl2ZShBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4KICAgICAgZG9tYWluLmlzSW5kZXhhYmxlUHJpbWl0aXZlKGluc3RydWN0aW9uVHlwZSk7CgogIEFic3RyYWN0Qm9vbCBpc0ZpeGVkQXJyYXkoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc0ZpeGVkQXJyYXkoaW5zdHJ1Y3Rpb25UeXBlKTsKCiAgQWJzdHJhY3RCb29sIGlzRXh0ZW5kYWJsZUFycmF5KEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PgogICAgICBkb21haW4uaXNFeHRlbmRhYmxlQXJyYXkoaW5zdHJ1Y3Rpb25UeXBlKTsKCiAgQWJzdHJhY3RCb29sIGlzTXV0YWJsZUFycmF5KEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PgogICAgICBkb21haW4uaXNNdXRhYmxlQXJyYXkoaW5zdHJ1Y3Rpb25UeXBlKTsKCiAgQWJzdHJhY3RCb29sIGlzTXV0YWJsZUluZGV4YWJsZShBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4KICAgICAgZG9tYWluLmlzTXV0YWJsZUluZGV4YWJsZShpbnN0cnVjdGlvblR5cGUpOwoKICBBYnN0cmFjdEJvb2wgaXNBcnJheShBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4KICAgICAgZG9tYWluLmlzQXJyYXkoaW5zdHJ1Y3Rpb25UeXBlKTsKCiAgQWJzdHJhY3RCb29sIGlzUHJpbWl0aXZlU3RyaW5nKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PgogICAgICBkb21haW4uaXNQcmltaXRpdmVTdHJpbmcoaW5zdHJ1Y3Rpb25UeXBlKTsKCiAgQWJzdHJhY3RCb29sIGlzSW50ZWdlcihBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4KICAgICAgZG9tYWluLmlzSW50ZWdlcihpbnN0cnVjdGlvblR5cGUpOwoKICBBYnN0cmFjdEJvb2wgaXNVSW50MzIoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc1VJbnQzMihpbnN0cnVjdGlvblR5cGUpOwoKICBBYnN0cmFjdEJvb2wgaXNVSW50MzEoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc1VJbnQzMShpbnN0cnVjdGlvblR5cGUpOwoKICBBYnN0cmFjdEJvb2wgaXNQb3NpdGl2ZUludGVnZXIoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc1Bvc2l0aXZlSW50ZWdlcihpbnN0cnVjdGlvblR5cGUpOwoKICBBYnN0cmFjdEJvb2wgaXNQb3NpdGl2ZUludGVnZXJPck51bGwoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc1Bvc2l0aXZlSW50ZWdlck9yTnVsbChpbnN0cnVjdGlvblR5cGUpOwoKICBBYnN0cmFjdEJvb2wgaXNJbnRlZ2VyT3JOdWxsKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PgogICAgICBkb21haW4uaXNJbnRlZ2VyT3JOdWxsKGluc3RydWN0aW9uVHlwZSk7CgogIEFic3RyYWN0Qm9vbCBpc051bWJlcihBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4KICAgICAgZG9tYWluLmlzTnVtYmVyKGluc3RydWN0aW9uVHlwZSk7CgogIEFic3RyYWN0Qm9vbCBpc051bWJlck9yTnVsbChBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4KICAgICAgZG9tYWluLmlzTnVtYmVyT3JOdWxsKGluc3RydWN0aW9uVHlwZSk7CgogIEFic3RyYWN0Qm9vbCBpc0RvdWJsZShBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4KICAgICAgZG9tYWluLmlzRG91YmxlKGluc3RydWN0aW9uVHlwZSk7CgogIEFic3RyYWN0Qm9vbCBpc0RvdWJsZU9yTnVsbChBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4KICAgICAgZG9tYWluLmlzRG91YmxlT3JOdWxsKGluc3RydWN0aW9uVHlwZSk7CgogIEFic3RyYWN0Qm9vbCBpc0Jvb2xlYW4oQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc0Jvb2xlYW4oaW5zdHJ1Y3Rpb25UeXBlKTsKCiAgQWJzdHJhY3RCb29sIGlzQm9vbGVhbk9yTnVsbChBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4KICAgICAgZG9tYWluLmlzQm9vbGVhbk9yTnVsbChpbnN0cnVjdGlvblR5cGUpOwoKICBBYnN0cmFjdEJvb2wgaXNTdHJpbmcoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc1N0cmluZyhpbnN0cnVjdGlvblR5cGUpOwoKICBBYnN0cmFjdEJvb2wgaXNTdHJpbmdPck51bGwoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc1N0cmluZ09yTnVsbChpbnN0cnVjdGlvblR5cGUpOwoKICBBYnN0cmFjdEJvb2wgaXNQcmltaXRpdmVPck51bGwoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc1ByaW1pdGl2ZU9yTnVsbChpbnN0cnVjdGlvblR5cGUpOwoKICAvLy8gVHlwZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCiAgQWJzdHJhY3RWYWx1ZSBpbnN0cnVjdGlvblR5cGU7CgogIFNlbGVjdG9yIGdldCBzZWxlY3RvciA9PiBudWxsOwogIEhJbnN0cnVjdGlvbiBnZXREYXJ0UmVjZWl2ZXIoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSA9PiBudWxsOwogIGJvb2wgb25seVRocm93c05TTSgpID0+IGZhbHNlOwoKICBib29sIGlzSW5CYXNpY0Jsb2NrKCkgPT4gYmxvY2sgIT0gbnVsbDsKCiAgYm9vbCBndm5FcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSB7CiAgICBhc3NlcnQodXNlR3ZuKCkgJiYgb3RoZXIudXNlR3ZuKCkpOwogICAgLy8gQ2hlY2sgdGhhdCB0aGUgdHlwZSBhbmQgdGhlIHNpZGVFZmZlY3RzIG1hdGNoLgogICAgYm9vbCBoYXNTYW1lVHlwZSA9IHR5cGVFcXVhbHMob3RoZXIpOwogICAgYXNzZXJ0KGhhc1NhbWVUeXBlID09ICh0eXBlQ29kZSgpID09IG90aGVyLnR5cGVDb2RlKCkpKTsKICAgIGlmICghaGFzU2FtZVR5cGUpIHJldHVybiBmYWxzZTsKICAgIGlmIChzaWRlRWZmZWN0cyAhPSBvdGhlci5zaWRlRWZmZWN0cykgcmV0dXJuIGZhbHNlOwogICAgLy8gQ2hlY2sgdGhhdCB0aGUgaW5wdXRzIG1hdGNoLgogICAgZmluYWwgaW50IGlucHV0c0xlbmd0aCA9IGlucHV0cy5sZW5ndGg7CiAgICBmaW5hbCBMaXN0PEhJbnN0cnVjdGlvbj4gb3RoZXJJbnB1dHMgPSBvdGhlci5pbnB1dHM7CiAgICBpZiAoaW5wdXRzTGVuZ3RoICE9IG90aGVySW5wdXRzLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dHNMZW5ndGg7IGkrKykgewogICAgICBpZiAoIWlkZW50aWNhbChpbnB1dHNbaV0ubm9uQ2hlY2soKSwgb3RoZXJJbnB1dHNbaV0ubm9uQ2hlY2soKSkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIC8vIENoZWNrIHRoYXQgdGhlIGRhdGEgaW4gdGhlIGluc3RydWN0aW9uIG1hdGNoZXMuCiAgICByZXR1cm4gZGF0YUVxdWFscyhvdGhlcik7CiAgfQoKICBpbnQgZ3ZuSGFzaENvZGUoKSB7CiAgICBpbnQgcmVzdWx0ID0gdHlwZUNvZGUoKTsKICAgIGludCBsZW5ndGggPSBpbnB1dHMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICByZXN1bHQgPSAocmVzdWx0ICogMTkpICsgKGlucHV0c1tpXS5ub25DaGVjaygpLmlkKSArIChyZXN1bHQgPj4gNyk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8gVGhlc2UgbWV0aG9kcyBzaG91bGQgYmUgb3ZlcndyaXR0ZW4gYnkgaW5zdHJ1Y3Rpb25zIHRoYXQKICAvLyBwYXJ0aWNpcGF0ZSBpbiBnbG9iYWwgdmFsdWUgbnVtYmVyaW5nLgogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5VTkRFRklORURfVFlQRUNPREU7CiAgYm9vbCB0eXBlRXF1YWxzKGNvdmFyaWFudCBISW5zdHJ1Y3Rpb24gb3RoZXIpID0+IGZhbHNlOwogIGJvb2wgZGF0YUVxdWFscyhjb3ZhcmlhbnQgSEluc3RydWN0aW9uIG90aGVyKSA9PiBmYWxzZTsKCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpOwoKICB2b2lkIG5vdGlmeUFkZGVkVG9CbG9jayhIQmFzaWNCbG9jayB0YXJnZXRCbG9jaykgewogICAgYXNzZXJ0KCFpc0luQmFzaWNCbG9jaygpKTsKICAgIGFzc2VydChibG9jayA9PSBudWxsKTsKICAgIC8vIEFkZCBbdGhpc10gdG8gdGhlIGlucHV0cycgdXNlcy4KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGFzc2VydChpbnB1dHNbaV0uaXNJbkJhc2ljQmxvY2soKSk7CiAgICAgIGlucHV0c1tpXS51c2VkQnkuYWRkKHRoaXMpOwogICAgfQogICAgYmxvY2sgPSB0YXJnZXRCbG9jazsKICAgIGFzc2VydChpc1ZhbGlkKCkpOwogIH0KCiAgdm9pZCBub3RpZnlSZW1vdmVkRnJvbUJsb2NrKCkgewogICAgYXNzZXJ0KGlzSW5CYXNpY0Jsb2NrKCkpOwogICAgYXNzZXJ0KHVzZWRCeS5pc0VtcHR5KTsKCiAgICAvLyBSZW1vdmUgW3RoaXNdIGZyb20gdGhlIGlucHV0cycgdXNlcy4KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlucHV0c1tpXS5yZW1vdmVVc2VyKHRoaXMpOwogICAgfQogICAgdGhpcy5ibG9jayA9IG51bGw7CiAgICBhc3NlcnQoaXNWYWxpZCgpKTsKICB9CgogIC8vLyBEbyBhIGluLXBsYWNlIGNoYW5nZSBvZiBbZnJvbV0gdG8gW3RvXS4gV2FybmluZzogdGhpcyBmdW5jdGlvbgogIC8vLyBkb2VzIG5vdCB1cGRhdGUgW2lucHV0c10gYW5kIFt1c2VkQnldLiBVc2UgW2NoYW5nZVVzZV0gaW5zdGVhZC4KICB2b2lkIHJld3JpdGVJbnB1dChISW5zdHJ1Y3Rpb24gZnJvbSwgSEluc3RydWN0aW9uIHRvKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaWRlbnRpY2FsKGlucHV0c1tpXSwgZnJvbSkpIGlucHV0c1tpXSA9IHRvOwogICAgfQogIH0KCiAgLy8vIFJlbW92ZXMgYWxsIG9jY3VycmVuY2VzIG9mIFtpbnN0cnVjdGlvbl0gZnJvbSBbbGlzdF0uCiAgdm9pZCByZW1vdmVGcm9tTGlzdChMaXN0PEhJbnN0cnVjdGlvbj4gbGlzdCwgSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBpbnQgbGVuZ3RoID0gbGlzdC5sZW5ndGg7CiAgICBpbnQgaSA9IDA7CiAgICB3aGlsZSAoaSA8IGxlbmd0aCkgewogICAgICBpZiAoaW5zdHJ1Y3Rpb24gPT0gbGlzdFtpXSkgewogICAgICAgIGxpc3RbaV0gPSBsaXN0W2xlbmd0aCAtIDFdOwogICAgICAgIGxlbmd0aC0tOwogICAgICB9IGVsc2UgewogICAgICAgIGkrKzsKICAgICAgfQogICAgfQogICAgbGlzdC5sZW5ndGggPSBsZW5ndGg7CiAgfQoKICAvLy8gUmVtb3ZlcyBhbGwgb2NjdXJyZW5jZXMgb2YgW3VzZXJdIGZyb20gW3VzZWRCeV0uCiAgdm9pZCByZW1vdmVVc2VyKEhJbnN0cnVjdGlvbiB1c2VyKSB7CiAgICByZW1vdmVGcm9tTGlzdCh1c2VkQnksIHVzZXIpOwogIH0KCiAgLy8gQ2hhbmdlIGFsbCB1c2VzIG9mIFtvbGRJbnB1dF0gYnkgW3RoaXNdIHRvIFtuZXdJbnB1dF0uIEFsc28KICAvLyB1cGRhdGVzIHRoZSBbdXNlZEJ5XSBvZiBbb2xkSW5wdXRdIGFuZCBbbmV3SW5wdXRdLgogIHZvaWQgY2hhbmdlVXNlKEhJbnN0cnVjdGlvbiBvbGRJbnB1dCwgSEluc3RydWN0aW9uIG5ld0lucHV0KSB7CiAgICBhc3NlcnQobmV3SW5wdXQgIT0gbnVsbCAmJiAhaWRlbnRpY2FsKG9sZElucHV0LCBuZXdJbnB1dCkpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dHMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGlkZW50aWNhbChpbnB1dHNbaV0sIG9sZElucHV0KSkgewogICAgICAgIGlucHV0c1tpXSA9IG5ld0lucHV0OwogICAgICAgIG5ld0lucHV0LnVzZWRCeS5hZGQodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIHJlbW92ZUZyb21MaXN0KG9sZElucHV0LnVzZWRCeSwgdGhpcyk7CiAgfQoKICB2b2lkIHJlcGxhY2VBbGxVc2Vyc0RvbWluYXRlZEJ5KAogICAgICBISW5zdHJ1Y3Rpb24gY3Vyc29yLCBISW5zdHJ1Y3Rpb24gbmV3SW5zdHJ1Y3Rpb24pIHsKICAgIERvbWluYXRlZFVzZXMub2YodGhpcywgY3Vyc29yKS5yZXBsYWNlV2l0aChuZXdJbnN0cnVjdGlvbik7CiAgfQoKICB2b2lkIG1vdmVCZWZvcmUoSEluc3RydWN0aW9uIG90aGVyKSB7CiAgICBhc3NlcnQodGhpcyBpcyEgSENvbnRyb2xGbG93KTsKICAgIGFzc2VydCh0aGlzIGlzISBIUGhpKTsKICAgIGFzc2VydChvdGhlciBpcyEgSFBoaSk7CiAgICBibG9jay5kZXRhY2godGhpcyk7CiAgICBvdGhlci5ibG9jay5pbnRlcm5hbEFkZEJlZm9yZShvdGhlciwgdGhpcyk7CiAgICBibG9jayA9IG90aGVyLmJsb2NrOwogIH0KCiAgYm9vbCBpc0NvbnN0YW50KCkgPT4gZmFsc2U7CiAgYm9vbCBpc0NvbnN0YW50Qm9vbGVhbigpID0+IGZhbHNlOwogIGJvb2wgaXNDb25zdGFudE51bGwoKSA9PiBmYWxzZTsKICBib29sIGlzQ29uc3RhbnROdW1iZXIoKSA9PiBmYWxzZTsKICBib29sIGlzQ29uc3RhbnRJbnRlZ2VyKCkgPT4gZmFsc2U7CiAgYm9vbCBpc0NvbnN0YW50U3RyaW5nKCkgPT4gZmFsc2U7CiAgYm9vbCBpc0NvbnN0YW50TGlzdCgpID0+IGZhbHNlOwogIGJvb2wgaXNDb25zdGFudE1hcCgpID0+IGZhbHNlOwogIGJvb2wgaXNDb25zdGFudEZhbHNlKCkgPT4gZmFsc2U7CiAgYm9vbCBpc0NvbnN0YW50VHJ1ZSgpID0+IGZhbHNlOwoKICBib29sIGlzSW50ZXJjZXB0b3IoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSA9PiBmYWxzZTsKCiAgYm9vbCBpc1ZhbGlkKCkgewogICAgSFZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgSFZhbGlkYXRvcigpOwogICAgdmFsaWRhdG9yLmN1cnJlbnRCbG9jayA9IGJsb2NrOwogICAgdmFsaWRhdG9yLnZpc2l0SW5zdHJ1Y3Rpb24odGhpcyk7CiAgICByZXR1cm4gdmFsaWRhdG9yLmlzVmFsaWQ7CiAgfQoKICBib29sIGlzQ29kZU1vdGlvbkludmFyaWFudCgpID0+IGZhbHNlOwoKICBib29sIGlzSnNTdGF0ZW1lbnQoKSA9PiBmYWxzZTsKCiAgYm9vbCBkb21pbmF0ZXMoSEluc3RydWN0aW9uIG90aGVyKSB7CiAgICAvLyBBbiBpbnN0cnVjdGlvbiBkb2VzIG5vdCBkb21pbmF0ZXMgaXRzZWxmLgogICAgaWYgKHRoaXMgPT0gb3RoZXIpIHJldHVybiBmYWxzZTsKICAgIGlmIChibG9jayAhPSBvdGhlci5ibG9jaykgcmV0dXJuIGJsb2NrLmRvbWluYXRlcyhvdGhlci5ibG9jayk7CgogICAgSEluc3RydWN0aW9uIGN1cnJlbnQgPSB0aGlzLm5leHQ7CiAgICB3aGlsZSAoY3VycmVudCAhPSBudWxsKSB7CiAgICAgIGlmIChjdXJyZW50ID09IG90aGVyKSByZXR1cm4gdHJ1ZTsKICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEhJbnN0cnVjdGlvbiBjb252ZXJ0VHlwZShKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsIERhcnRUeXBlIHR5cGUsIGludCBraW5kKSB7CiAgICBpZiAodHlwZSA9PSBudWxsKSByZXR1cm4gdGhpczsKICAgIHR5cGUgPSB0eXBlLnVuYWxpYXNlZDsKICAgIC8vIE9ubHkgdGhlIGJ1aWxkZXIga25vd3MgaG93IHRvIGNyZWF0ZSBbSFR5cGVDb252ZXJzaW9uXQogICAgLy8gaW5zdHJ1Y3Rpb25zIHdpdGggZ2VuZXJpY3MuIEl0IGhhcyB0aGUgZ2VuZXJpYyB0eXBlIGNvbnRleHQKICAgIC8vIGF2YWlsYWJsZS4KICAgIGFzc2VydCghdHlwZS5pc1R5cGVWYXJpYWJsZSk7CiAgICBhc3NlcnQodHlwZS50cmVhdEFzUmF3IHx8IHR5cGUuaXNGdW5jdGlvblR5cGUpOwogICAgaWYgKHR5cGUuaXNEeW5hbWljKSByZXR1cm4gdGhpczsKICAgIGlmICh0eXBlLmlzVm9pZCkgcmV0dXJuIHRoaXM7CiAgICBpZiAodHlwZSA9PSBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5vYmplY3RUeXBlKSByZXR1cm4gdGhpczsKICAgIGlmICh0eXBlLmlzRnVuY3Rpb25UeXBlIHx8IHR5cGUuaXNGdXR1cmVPcikgewogICAgICByZXR1cm4gbmV3IEhUeXBlQ29udmVyc2lvbih0eXBlLCBraW5kLAogICAgICAgICAgY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSwgdGhpcywgc291cmNlSW5mb3JtYXRpb24pOwogICAgfQogICAgYXNzZXJ0KHR5cGUuaXNJbnRlcmZhY2VUeXBlKTsKICAgIGlmIChraW5kID09IEhUeXBlQ29udmVyc2lvbi5CT09MRUFOX0NPTlZFUlNJT05fQ0hFQ0spIHsKICAgICAgLy8gQm9vbGVhbiBjb252ZXJzaW9uIGNoZWNrcyB3b3JrIG9uIG5vbi1udWxsYWJsZSBib29sZWFucy4KICAgICAgcmV0dXJuIG5ldyBIVHlwZUNvbnZlcnNpb24odHlwZSwga2luZCwKICAgICAgICAgIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUsIHRoaXMsIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0gZWxzZSBpZiAoa2luZCA9PSBIVHlwZUNvbnZlcnNpb24uQ0hFQ0tFRF9NT0RFX0NIRUNLICYmICF0eXBlLnRyZWF0QXNSYXcpIHsKICAgICAgdGhyb3cgJ2NyZWF0aW5nIGNvbXBvdW5kIGNoZWNrIHRvICR0eXBlICh0aGlzID0gJHt0aGlzfSknOwogICAgfSBlbHNlIHsKICAgICAgSW50ZXJmYWNlVHlwZSBpbnRlcmZhY2VUeXBlID0gdHlwZTsKICAgICAgQWJzdHJhY3RWYWx1ZSBzdWJ0eXBlID0gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgICAgLmNyZWF0ZU51bGxhYmxlU3VidHlwZShpbnRlcmZhY2VUeXBlLmVsZW1lbnQpOwogICAgICByZXR1cm4gbmV3IEhUeXBlQ29udmVyc2lvbih0eXBlLCBraW5kLCBzdWJ0eXBlLCB0aGlzLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CiAgfQoKICAvLy8gUmV0dXJuIHdoZXRoZXIgdGhlIGluc3RydWN0aW9ucyBkbyBub3QgYmVsb25nIHRvIGEgbG9vcCBvcgogIC8vLyBiZWxvbmcgdG8gdGhlIHNhbWUgbG9vcC4KICBib29sIGhhc1NhbWVMb29wSGVhZGVyQXMoSEluc3RydWN0aW9uIG90aGVyKSB7CiAgICByZXR1cm4gYmxvY2suZW5jbG9zaW5nTG9vcEhlYWRlciA9PSBvdGhlci5ibG9jay5lbmNsb3NpbmdMb29wSGVhZGVyOwogIH0KfQoKLy8vIFRoZSBzZXQgb2YgdXNlcyBvZiBbc291cmNlXSB0aGF0IGFyZSBkb21pbmF0ZWQgYnkgW2RvbWluYXRvcl0uCmNsYXNzIERvbWluYXRlZFVzZXMgewogIGZpbmFsIEhJbnN0cnVjdGlvbiBfc291cmNlOwoKICAvLyBUd28gbGlzdCBvZiBtYXRjaGluZyBsZW5ndGggaG9sZGluZyAoaW5zdHJ1Y3Rpb24sIGlucHV0LWluZGV4KSBwYWlycyBmb3IKICAvLyB0aGUgZG9taW5hdGVkIHVzZXMuCiAgZmluYWwgTGlzdDxISW5zdHJ1Y3Rpb24+IF9pbnN0cnVjdGlvbnMgPSA8SEluc3RydWN0aW9uPltdOwogIGZpbmFsIExpc3Q8aW50PiBfaW5kZXhlcyA9IDxpbnQ+W107CgogIERvbWluYXRlZFVzZXMuXyh0aGlzLl9zb3VyY2UpOwoKICAvLy8gVGhlIHVzZXMgb2YgW3NvdXJjZV0gdGhhdCBhcmUgZG9taW5hdGVkIGJ5IFtkb21pbmF0b3JdLgogIC8vLwogIC8vLyBUaGUgdXNlcyBieSBbZG9taW5hdG9yXSBhcmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdCwgdW5sZXNzCiAgLy8vIFtleGNsdWRlRG9taW5hdG9yXSBpcyBgdHJ1ZWAsIHNvIGB0cnVlYCBzZWxlY3RzIHVzZXMgZm9sbG93aW5nCiAgLy8vIFtkb21pbmF0b3JdLgogIC8vLwogIC8vLyBUaGUgdXNlcyBpbmNsdWRlIHRoZSBpbi1lZGdlcyBvZiBhIEhQaGkgbm9kZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGEKICAvLy8gZG9taW5hdGVkIGJsb2NrLiAoVGhlcmUgY2FuIGJlIG1hbnkgc3VjaCBlZGdlcyBvbiBhIHNpbmdsZSBwaGkgYXQgdGhlIGV4aXQKICAvLy8gb2YgYSBsb29wIHdpdGggbWFueSBicmVhayBzdGF0ZW1lbnRzKS4gIElmIFtleGNsdWRlUGhpT3V0RWRnZXNdIGlzIGB0cnVlYAogIC8vLyB0aGVuIHRoZXNlIGVkZ2UgdXNlcyBhcmUgbm90IGluY2x1ZGVkLgogIHN0YXRpYyBEb21pbmF0ZWRVc2VzIG9mKEhJbnN0cnVjdGlvbiBzb3VyY2UsIEhJbnN0cnVjdGlvbiBkb21pbmF0b3IsCiAgICAgIHtib29sIGV4Y2x1ZGVEb21pbmF0b3I6IGZhbHNlLCBib29sIGV4Y2x1ZGVQaGlPdXRFZGdlczogZmFsc2V9KSB7CiAgICByZXR1cm4gbmV3IERvbWluYXRlZFVzZXMuXyhzb3VyY2UpCiAgICAgIC4uX2NvbXB1dGUoc291cmNlLCBkb21pbmF0b3IsIGV4Y2x1ZGVEb21pbmF0b3IsIGV4Y2x1ZGVQaGlPdXRFZGdlcyk7CiAgfQoKICBib29sIGdldCBpc0VtcHR5ID0+IF9pbnN0cnVjdGlvbnMuaXNFbXB0eTsKICBib29sIGdldCBpc05vdEVtcHR5ID0+ICFpc0VtcHR5OwogIGludCBnZXQgbGVuZ3RoID0+IF9pbnN0cnVjdGlvbnMubGVuZ3RoOwoKICAvLy8gQ2hhbmdlcyBhbGwgdGhlIHVzZXMgaW4gdGhlIHNldCB0byBbbmV3SW5zdHJ1Y3Rpb25dLgogIHZvaWQgcmVwbGFjZVdpdGgoSEluc3RydWN0aW9uIG5ld0luc3RydWN0aW9uKSB7CiAgICBhc3NlcnQoIWlkZW50aWNhbChuZXdJbnN0cnVjdGlvbiwgX3NvdXJjZSkpOwogICAgaWYgKGlzRW1wdHkpIHJldHVybjsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2luc3RydWN0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICBISW5zdHJ1Y3Rpb24gdXNlciA9IF9pbnN0cnVjdGlvbnNbaV07CiAgICAgIGludCBpbmRleCA9IF9pbmRleGVzW2ldOwogICAgICBISW5zdHJ1Y3Rpb24gb2xkSW5zdHJ1Y3Rpb24gPSB1c2VyLmlucHV0c1tpbmRleF07CiAgICAgIGFzc2VydCgKICAgICAgICAgIGlkZW50aWNhbChvbGRJbnN0cnVjdGlvbiwgX3NvdXJjZSksCiAgICAgICAgICAnSW5wdXQgJHtpbmRleH0gb2YgJHt1c2VyfSBjaGFuZ2VkLicKICAgICAgICAgICdcbiAgRm91bmQ6ICR7b2xkSW5zdHJ1Y3Rpb259XG4gIEV4cGVjdGVkOiAke19zb3VyY2V9Jyk7CiAgICAgIHVzZXIuaW5wdXRzW2luZGV4XSA9IG5ld0luc3RydWN0aW9uOwogICAgICBvbGRJbnN0cnVjdGlvbi51c2VkQnkucmVtb3ZlKHVzZXIpOwogICAgICBuZXdJbnN0cnVjdGlvbi51c2VkQnkuYWRkKHVzZXIpOwogICAgfQogIH0KCiAgYm9vbCBnZXQgaXNTaW5nbGV0b24gPT4gX2luc3RydWN0aW9ucy5sZW5ndGggPT0gMTsKCiAgSEluc3RydWN0aW9uIGdldCBzaW5nbGUgPT4gX2luc3RydWN0aW9ucy5zaW5nbGU7CgogIEl0ZXJhYmxlPEhJbnN0cnVjdGlvbj4gZ2V0IGluc3RydWN0aW9ucyA9PiBfaW5zdHJ1Y3Rpb25zOwoKICB2b2lkIF9hZGRVc2UoSEluc3RydWN0aW9uIHVzZXIsIGludCBpbnB1dEluZGV4KSB7CiAgICBfaW5zdHJ1Y3Rpb25zLmFkZCh1c2VyKTsKICAgIF9pbmRleGVzLmFkZChpbnB1dEluZGV4KTsKICB9CgogIHZvaWQgX2NvbXB1dGUoSEluc3RydWN0aW9uIHNvdXJjZSwgSEluc3RydWN0aW9uIGRvbWluYXRvciwKICAgICAgYm9vbCBleGNsdWRlRG9taW5hdG9yLCBib29sIGV4Y2x1ZGVQaGlPdXRFZGdlcykgewogICAgLy8gS2VlcCB0cmFjayBvZiBhbGwgaW5zdHJ1Y3Rpb25zIHRoYXQgd2UgaGF2ZSB0byBkZWFsIHdpdGggbGF0ZXIgYW5kIGNvdW50CiAgICAvLyB0aGUgbnVtYmVyIG9mIHRoZW0gdGhhdCBhcmUgaW4gdGhlIGN1cnJlbnQgYmxvY2suCiAgICBTZXQ8SEluc3RydWN0aW9uPiB1c2VycyA9IG5ldyBTZXRsZXQ8SEluc3RydWN0aW9uPigpOwogICAgU2V0PEhJbnN0cnVjdGlvbj4gc2VlbiA9IG5ldyBTZXRsZXQ8SEluc3RydWN0aW9uPigpOwogICAgaW50IHVzZXJzSW5DdXJyZW50QmxvY2sgPSAwOwoKICAgIEhCYXNpY0Jsb2NrIGRvbWluYXRvckJsb2NrID0gZG9taW5hdG9yLmJsb2NrOwoKICAgIC8vIFJ1biB0aHJvdWdoIGFsbCB0aGUgdXNlcnMgYW5kIHNlZSBpZiB0aGV5IGFyZSBkb21pbmF0ZWQsIG9yIHBvdGVudGlhbGx5CiAgICAvLyBkb21pbmF0ZWQsIG9yIHBhcnRpYWxseSBkb21pbmF0ZWQgYnkgW2RvbWluYXRvcl0uIEl0IGlzIGVhc2llciB0bwogICAgLy8gZGUtZHVwbGljYXRlIFt1c2VkQnldIGFuZCBwcm9jZXNzIGFsbCBpbnB1dHMgb2YgYW4gaW5zdHJ1Y3Rpb24gdGhhbiB0bwogICAgLy8gdHJhY2sgdGhlIHJlcGVhdGVkIGVsZW1lbnRzIG9mIHVzZWRCeSBhbmQgbWF0Y2ggdGhlbSB1cCBieSBpbmRleC4KICAgIGZvciAoSEluc3RydWN0aW9uIGN1cnJlbnQgaW4gc291cmNlLnVzZWRCeSkgewogICAgICBpZiAoIXNlZW4uYWRkKGN1cnJlbnQpKSBjb250aW51ZTsKICAgICAgSEJhc2ljQmxvY2sgY3VycmVudEJsb2NrID0gY3VycmVudC5ibG9jazsKICAgICAgaWYgKGRvbWluYXRvckJsb2NrLmRvbWluYXRlcyhjdXJyZW50QmxvY2spKSB7CiAgICAgICAgdXNlcnMuYWRkKGN1cnJlbnQpOwogICAgICAgIGlmIChpZGVudGljYWwoY3VycmVudEJsb2NrLCBkb21pbmF0b3JCbG9jaykpIHVzZXJzSW5DdXJyZW50QmxvY2srKzsKICAgICAgfSBlbHNlIGlmICghZXhjbHVkZVBoaU91dEVkZ2VzICYmIGN1cnJlbnQgaXMgSFBoaSkgewogICAgICAgIC8vIEEgbm9uLWRvbWluYXRlZCBIUGhpLgogICAgICAgIC8vIFNlZSBpZiB0aGVyZSBhIGRvbWluYXRlZCBlZGdlIGludG8gdGhlIHBoaS4gVGhlIGlucHV0IG11c3QgYmUKICAgICAgICAvLyBbc291cmNlXSBhbmQgdGhlIHBvc2l0aW9uIG11c3QgY29ycmVzcG9uZCB0byBhIGRvbWluYXRlZCBibG9jay4KICAgICAgICBMaXN0PEhCYXNpY0Jsb2NrPiBwcmVkZWNlc3NvcnMgPSBjdXJyZW50QmxvY2sucHJlZGVjZXNzb3JzOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJlZGVjZXNzb3JzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBpZiAoY3VycmVudC5pbnB1dHNbaV0gIT0gc291cmNlKSBjb250aW51ZTsKICAgICAgICAgIEhCYXNpY0Jsb2NrIHByZWRlY2Vzc29yID0gcHJlZGVjZXNzb3JzW2ldOwogICAgICAgICAgaWYgKGRvbWluYXRvckJsb2NrLmRvbWluYXRlcyhwcmVkZWNlc3NvcikpIHsKICAgICAgICAgICAgX2FkZFVzZShjdXJyZW50LCBpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBSdW4gdGhyb3VnaCBhbGwgdGhlIHBoaXMgaW4gdGhlIHNhbWUgYmxvY2sgYXMgW2RvbWluYXRvcl0gYW5kIHJlbW92ZSB0aGVtCiAgICAvLyBmcm9tIHRoZSB1c2VycyBzZXQuIFRoZXNlIGNvbWUgYmVmb3JlIFtkb21pbmF0b3JdLgogICAgLy8gVE9ETyhzcmEpOiBDb3VsZCB3ZSBzaW1wbHkgbm90IGFkZCB0aGVtIGluIHRoZSBmaXJzdCBwbGFjZT8KICAgIGlmICh1c2Vyc0luQ3VycmVudEJsb2NrID4gMCkgewogICAgICBmb3IgKEhQaGkgcGhpID0gZG9taW5hdG9yQmxvY2sucGhpcy5maXJzdDsgcGhpICE9IG51bGw7IHBoaSA9IHBoaS5uZXh0KSB7CiAgICAgICAgaWYgKHVzZXJzLnJlbW92ZShwaGkpKSB7CiAgICAgICAgICBpZiAoLS11c2Vyc0luQ3VycmVudEJsb2NrID09IDApIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIFJ1biB0aHJvdWdoIGFsbCB0aGUgaW5zdHJ1Y3Rpb25zIGJlZm9yZSBbZG9taW5hdG9yXSBhbmQgcmVtb3ZlIHRoZW0gZnJvbQogICAgLy8gdGhlIHVzZXJzIHNldC4KICAgIGlmICh1c2Vyc0luQ3VycmVudEJsb2NrID4gMCkgewogICAgICBISW5zdHJ1Y3Rpb24gY3VycmVudCA9IGRvbWluYXRvckJsb2NrLmZpcnN0OwogICAgICB3aGlsZSAoIWlkZW50aWNhbChjdXJyZW50LCBkb21pbmF0b3IpKSB7CiAgICAgICAgaWYgKHVzZXJzLmNvbnRhaW5zKGN1cnJlbnQpKSB7CiAgICAgICAgICAvLyBUT0RPKDI5MzAyKTogVXNlICd1c2VyLnJlbW92ZShjdXJyZW50KScgYXMgdGhlIGNvbmRpdGlvbi4KICAgICAgICAgIHVzZXJzLnJlbW92ZShjdXJyZW50KTsKICAgICAgICAgIGlmICgtLXVzZXJzSW5DdXJyZW50QmxvY2sgPT0gMCkgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7CiAgICAgIH0KICAgICAgaWYgKGV4Y2x1ZGVEb21pbmF0b3IpIHsKICAgICAgICB1c2Vycy5yZW1vdmUoZG9taW5hdG9yKTsKICAgICAgfQogICAgfQoKICAgIC8vIENvbnZlcnQgdXNlcnMgaW50byBhIGxpc3Qgb2YgKHVzZXIsIGlucHV0LWluZGV4KSB1c2VzLgogICAgZm9yIChISW5zdHJ1Y3Rpb24gdXNlciBpbiB1c2VycykgewogICAgICB2YXIgaW5wdXRzID0gdXNlci5pbnB1dHM7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGlucHV0c1tpXSA9PSBzb3VyY2UpIHsKICAgICAgICAgIF9hZGRVc2UodXNlciwgaSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgovLy8gQSByZWZlcmVuY2UgdG8gYSBbSEluc3RydWN0aW9uXSB0aGF0IGNhbiBob2xkIGl0cyBvd24gc291cmNlIGluZm9ybWF0aW9uLgovLy8KLy8vIFRoaXMgdXNlZCBmb3IgYXR0YWNoaW5nIHNvdXJjZSBpbmZvcm1hdGlvbiB0byByZWFkcyBvZiBsb2NhbHMuCmNsYXNzIEhSZWYgZXh0ZW5kcyBISW5zdHJ1Y3Rpb24gewogIEhSZWYoSEluc3RydWN0aW9uIHZhbHVlLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikKICAgICAgOiBzdXBlcihbdmFsdWVdLCB2YWx1ZS5pbnN0cnVjdGlvblR5cGUpIHsKICAgIHRoaXMuc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKICB9CgogIEhJbnN0cnVjdGlvbiBnZXQgdmFsdWUgPT4gaW5wdXRzWzBdOwoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gY29udmVydFR5cGUoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLCBEYXJ0VHlwZSB0eXBlLCBpbnQga2luZCkgewogICAgSEluc3RydWN0aW9uIGNvbnZlcnRlZCA9IHZhbHVlLmNvbnZlcnRUeXBlKGNsb3NlZFdvcmxkLCB0eXBlLCBraW5kKTsKICAgIGlmIChjb252ZXJ0ZWQgPT0gdmFsdWUpIHJldHVybiB0aGlzOwogICAgSFR5cGVDb252ZXJzaW9uIGNvbnZlcnNpb24gPSBjb252ZXJ0ZWQ7CiAgICBjb252ZXJzaW9uLmlucHV0c1swXSA9IHRoaXM7CiAgICByZXR1cm4gY29udmVyc2lvbjsKICB9CgogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0UmVmKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnSFJlZigke3ZhbHVlfSknOwp9CgovLy8gTGF0ZSBpbnN0cnVjdGlvbnMgYXJlIHVzZWQgYWZ0ZXIgdGhlIG1haW4gb3B0aW1pemF0aW9uIHBoYXNlcy4gIFRoZXkgY2FwdHVyZQovLy8gY29kZWdlbiBkZWNpc2lvbnMganVzdCBwcmlvciB0byBnZW5lcmF0aW5nIEphdmFTY3JpcHQuCmFic3RyYWN0IGNsYXNzIEhMYXRlSW5zdHJ1Y3Rpb24gZXh0ZW5kcyBISW5zdHJ1Y3Rpb24gewogIEhMYXRlSW5zdHJ1Y3Rpb24oTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cywgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKGlucHV0cywgdHlwZSk7Cn0KCmNsYXNzIEhCb29saWZ5IGV4dGVuZHMgSEluc3RydWN0aW9uIHsKICBIQm9vbGlmeShISW5zdHJ1Y3Rpb24gdmFsdWUsIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcig8SEluc3RydWN0aW9uPlt2YWx1ZV0sIHR5cGUpIHsKICAgIHNldFVzZUd2bigpOwogICAgc291cmNlSW5mb3JtYXRpb24gPSB2YWx1ZS5zb3VyY2VJbmZvcm1hdGlvbjsKICB9CgogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0Qm9vbGlmeSh0aGlzKTsKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uQk9PTElGWV9UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMob3RoZXIpID0+IG90aGVyIGlzIEhCb29saWZ5OwogIEBvdmVycmlkZQogIGJvb2wgZGF0YUVxdWFscyhISW5zdHJ1Y3Rpb24gb3RoZXIpID0+IHRydWU7Cn0KCi8vLyBBIFtIQ2hlY2tdIGluc3RydWN0aW9uIGlzIGFuIGluc3RydWN0aW9uIHRoYXQgbWlnaHQgZG8gYSBkeW5hbWljCi8vLyBjaGVjayBhdCBydW50aW1lIG9uIGFub3RoZXIgaW5zdHJ1Y3Rpb24uIFRvIGhhdmUgcHJvcGVyIGluc3RydWN0aW9uCi8vLyBkZXBlbmRlbmNpZXMgaW4gdGhlIGdyYXBoLCBpbnN0cnVjdGlvbnMgdGhhdCBkZXBlbmQgb24gdGhlIGNoZWNrCi8vLyBiZWluZyBkb25lIHJlZmVyZW5jZSB0aGUgW0hDaGVja10gaW5zdHJ1Y3Rpb24gaW5zdGVhZCBvZiB0aGUKLy8vIGluc3RydWN0aW9uIGl0c2VsZi4KYWJzdHJhY3QgY2xhc3MgSENoZWNrIGV4dGVuZHMgSEluc3RydWN0aW9uIHsKICBIQ2hlY2soaW5wdXRzLCB0eXBlKSA6IHN1cGVyKGlucHV0cywgdHlwZSkgewogICAgc2V0VXNlR3ZuKCk7CiAgfQogIEhJbnN0cnVjdGlvbiBnZXQgY2hlY2tlZElucHV0ID0+IGlucHV0c1swXTsKICBAb3ZlcnJpZGUKICBib29sIGlzSnNTdGF0ZW1lbnQoKSA9PiB0cnVlOwogIEBvdmVycmlkZQogIGJvb2wgY2FuVGhyb3coQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+IHRydWU7CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBub25DaGVjaygpID0+IGNoZWNrZWRJbnB1dC5ub25DaGVjaygpOwp9CgpjbGFzcyBIQm91bmRzQ2hlY2sgZXh0ZW5kcyBIQ2hlY2sgewogIHN0YXRpYyBjb25zdCBpbnQgQUxXQVlTX0ZBTFNFID0gMDsKICBzdGF0aWMgY29uc3QgaW50IEZVTExfQ0hFQ0sgPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgQUxXQVlTX0FCT1ZFX1pFUk8gPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgQUxXQVlTX0JFTE9XX0xFTkdUSCA9IDM7CiAgc3RhdGljIGNvbnN0IGludCBBTFdBWVNfVFJVRSA9IDQ7CgogIC8vLyBEZXRhaWxzIHdoaWNoIHRlc3RzIGhhdmUgYmVlbiBkb25lIHN0YXRpY2FsbHkgZHVyaW5nIGNvbXBpbGF0aW9uLgogIC8vLyBEZWZhdWx0IGlzIHRoYXQgYWxsIGNoZWNrcyBtdXN0IGJlIHBlcmZvcm1lZCBkeW5hbWljYWxseS4KICBpbnQgc3RhdGljQ2hlY2tzID0gRlVMTF9DSEVDSzsKCiAgSEJvdW5kc0NoZWNrKGxlbmd0aCwgaW5kZXgsIGFycmF5LCB0eXBlKQogICAgICA6IHN1cGVyKDxISW5zdHJ1Y3Rpb24+W2xlbmd0aCwgaW5kZXgsIGFycmF5XSwgdHlwZSk7CgogIEhJbnN0cnVjdGlvbiBnZXQgbGVuZ3RoID0+IGlucHV0c1sxXTsKICBISW5zdHJ1Y3Rpb24gZ2V0IGluZGV4ID0+IGlucHV0c1swXTsKICBISW5zdHJ1Y3Rpb24gZ2V0IGFycmF5ID0+IGlucHV0c1syXTsKICAvLyBUaGVyZSBjYW4gYmUgYW4gYWRkaXRpb25hbCBmb3VydGggaW5wdXQgd2hpY2ggaXMgdGhlIGluZGV4IHRvIHJlcG9ydCB0bwogIC8vIFtpb29yZV0uIFRoaXMgaXMgdXNlZCBieSB0aGUgZXhwYW5zaW9uIG9mIFtKU0FycmF5LnJlbW92ZUxhc3RdLgogIEhJbnN0cnVjdGlvbiBnZXQgcmVwb3J0ZWRJbmRleCA9PiBpbnB1dHMubGVuZ3RoID4gMyA/IGlucHV0c1szXSA6IGluZGV4OwogIEBvdmVycmlkZQogIGJvb2wgaXNDb250cm9sRmxvdygpID0+IHRydWU7CgogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0Qm91bmRzQ2hlY2sodGhpcyk7CiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLkJPVU5EU19DSEVDS19UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMob3RoZXIpID0+IG90aGVyIGlzIEhCb3VuZHNDaGVjazsKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiB0cnVlOwp9CgphYnN0cmFjdCBjbGFzcyBIQ29uZGl0aW9uYWxCcmFuY2ggZXh0ZW5kcyBIQ29udHJvbEZsb3cgewogIEhDb25kaXRpb25hbEJyYW5jaChBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbiwgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cykKICAgICAgOiBzdXBlcihkb21haW4sIGlucHV0cyk7CiAgSEluc3RydWN0aW9uIGdldCBjb25kaXRpb24gPT4gaW5wdXRzWzBdOwogIEhCYXNpY0Jsb2NrIGdldCB0cnVlQnJhbmNoID0+IGJsb2NrLnN1Y2Nlc3NvcnNbMF07CiAgSEJhc2ljQmxvY2sgZ2V0IGZhbHNlQnJhbmNoID0+IGJsb2NrLnN1Y2Nlc3NvcnNbMV07Cn0KCmFic3RyYWN0IGNsYXNzIEhDb250cm9sRmxvdyBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgSENvbnRyb2xGbG93KEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluLCBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzKQogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNYXkgb25seSBleHByZXNzaW9uLWxpa2UgW0hJbnN0cnVjdGlvbl1zIHNob3VsZAogICAgICAvLyBoYXZlIGFuIGBpbnN0cnVjdGlvblR5cGVgLCBvciBzdGF0ZW1lbnQtbGlrZSBbSEluc3RydWN0aW9uXXMgc2hvdWxkCiAgICAgIC8vIGhhdmUgYSB0aHJvd2luZyBnZXR0ZXIuCiAgICAgIDogc3VwZXIoaW5wdXRzLCBkb21haW4uZW1wdHlUeXBlKTsKICBAb3ZlcnJpZGUKICBib29sIGlzQ29udHJvbEZsb3coKSA9PiB0cnVlOwogIEBvdmVycmlkZQogIGJvb2wgaXNKc1N0YXRlbWVudCgpID0+IHRydWU7Cn0KCi8vIEFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYW4gaW5zdGFuY2UuCmNsYXNzIEhDcmVhdGUgZXh0ZW5kcyBISW5zdHJ1Y3Rpb24gewogIGZpbmFsIENsYXNzRW50aXR5IGVsZW1lbnQ7CgogIC8vLyBEb2VzIHRoaXMgaW5zdHJ1Y3Rpb24gaGF2ZSByZWlmaWVkIHR5cGUgaW5mb3JtYXRpb24gYXMgdGhlIGxhc3QgaW5wdXQ/CiAgZmluYWwgYm9vbCBoYXNSdGlJbnB1dDsKCiAgLy8vIElmIHRoaXMgZmllbGQgaXMgbm90IGBudWxsYCwgdGhpcyBjYWxsIGlzIGZyb20gYW4gaW5saW5lZCBjb25zdHJ1Y3RvciBhbmQKICAvLy8gd2UgaGF2ZSB0byByZWdpc3RlciB0aGUgaW5zdGFudGlhdGVkIHR5cGUgaW4gdGhlIGNvZGUgZ2VuZXJhdG9yLiBUaGUKICAvLy8gW2luc3RydWN0aW9uVHlwZV0gb2YgdGhpcyBub2RlIGlzIG5vdCBlbm91Z2gsIGJlY2F1c2Ugd2UgYWxzbyBuZWVkIHRoZQogIC8vLyB0eXBlIGFyZ3VtZW50cy4gU2VlIGFsc28gW1NzYUZyb21Bc3RNaXhpbi5jdXJyZW50SW5saW5lZEluc3RhbnRpYXRpb25zXS4KICBMaXN0PEludGVyZmFjZVR5cGU+IGluc3RhbnRpYXRlZFR5cGVzOwoKICAvLy8gSWYgdGhpcyBub2RlIGNyZWF0ZXMgYSBjbG9zdXJlIGNsYXNzLCBbY2FsbE1ldGhvZF0gaXMgdGhlIGNhbGwgbWV0aG9kIG9mCiAgLy8vIHRoZSBjbG9zdXJlIGNsYXNzLgogIEZ1bmN0aW9uRW50aXR5IGNhbGxNZXRob2Q7CgogIEhDcmVhdGUodGhpcy5lbGVtZW50LCBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzLCBBYnN0cmFjdFZhbHVlIHR5cGUsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICB7dGhpcy5pbnN0YW50aWF0ZWRUeXBlcywgdGhpcy5oYXNSdGlJbnB1dDogZmFsc2UsIHRoaXMuY2FsbE1ldGhvZH0pCiAgICAgIDogc3VwZXIoaW5wdXRzLCB0eXBlKSB7CiAgICB0aGlzLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzQWxsb2NhdGlvbihBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4gdHJ1ZTsKCiAgSEluc3RydWN0aW9uIGdldCBydGlJbnB1dCB7CiAgICBhc3NlcnQoaGFzUnRpSW5wdXQpOwogICAgcmV0dXJuIGlucHV0cy5sYXN0OwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRDcmVhdGUodGhpcyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdIQ3JlYXRlKCRlbGVtZW50LCAke2luc3RhbnRpYXRlZFR5cGVzfSknOwp9CgovLyBBbGxvY2F0ZXMgYSBib3ggdG8gaG9sZCBtdXRhdGVkIGNhcHR1cmVkIHZhcmlhYmxlcy4KY2xhc3MgSENyZWF0ZUJveCBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgSENyZWF0ZUJveChBYnN0cmFjdFZhbHVlIHR5cGUpIDogc3VwZXIoPEhJbnN0cnVjdGlvbj5bXSwgdHlwZSk7CgogIEBvdmVycmlkZQogIGJvb2wgaXNBbGxvY2F0aW9uKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdENyZWF0ZUJveCh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0hDcmVhdGVCb3goKSc7Cn0KCmFic3RyYWN0IGNsYXNzIEhJbnZva2UgZXh0ZW5kcyBISW5zdHJ1Y3Rpb24gewogIGJvb2wgX2lzQWxsb2NhdGlvbiA9IGZhbHNlOwoKICAvLy8gW2lzSW50ZXJjZXB0ZWRDYWxsXSBpcyB0cnVlIGlmIHRoaXMgaW52b2NhdGlvbiB1c2VzIHRoZSBpbnRlcmNlcHRvcgogIC8vLyBjYWxsaW5nIGNvbnZlbnRpb24gd2hlcmUgdGhlIGZpcnN0IGlucHV0IGlzIHRoZSBtZXRob2RzIGFuZCB0aGUgc2Vjb25kCiAgLy8vIGlucHV0IGlzIHRoZSBEYXJ0IHJlY2VpdmVyLgogIGJvb2wgaXNJbnRlcmNlcHRlZENhbGwgPSBmYWxzZTsKICBISW52b2tlKExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMsIHR5cGUpIDogc3VwZXIoaW5wdXRzLCB0eXBlKSB7CiAgICBzaWRlRWZmZWN0cy5zZXRBbGxTaWRlRWZmZWN0cygpOwogICAgc2lkZUVmZmVjdHMuc2V0RGVwZW5kc09uU29tZXRoaW5nKCk7CiAgfQogIHN0YXRpYyBjb25zdCBpbnQgQVJHVU1FTlRTX09GRlNFVCA9IDE7CiAgQG92ZXJyaWRlCiAgYm9vbCBjYW5UaHJvdyhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4gdHJ1ZTsKICBAb3ZlcnJpZGUKICBib29sIGlzQWxsb2NhdGlvbihBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4gX2lzQWxsb2NhdGlvbjsKICB2b2lkIHNldEFsbG9jYXRpb24oYm9vbCB2YWx1ZSkgewogICAgX2lzQWxsb2NhdGlvbiA9IHZhbHVlOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgSEludm9rZUR5bmFtaWMgZXh0ZW5kcyBISW52b2tlIHsKICBmaW5hbCBJbnZva2VEeW5hbWljU3BlY2lhbGl6ZXIgc3BlY2lhbGl6ZXI7CiAgQG92ZXJyaWRlCiAgU2VsZWN0b3Igc2VsZWN0b3I7CiAgQWJzdHJhY3RWYWx1ZSBtYXNrOwogIE1lbWJlckVudGl0eSBlbGVtZW50OwoKICBISW52b2tlRHluYW1pYyhTZWxlY3RvciBzZWxlY3RvciwgdGhpcy5tYXNrLCB0aGlzLmVsZW1lbnQsCiAgICAgIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMsIGJvb2wgaXNJbnRlcmNlcHRlZCwgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvciwKICAgICAgICBzcGVjaWFsaXplciA9IGlzSW50ZXJjZXB0ZWQKICAgICAgICAgICAgPyBJbnZva2VEeW5hbWljU3BlY2lhbGl6ZXIubG9va3VwU3BlY2lhbGl6ZXIoc2VsZWN0b3IpCiAgICAgICAgICAgIDogY29uc3QgSW52b2tlRHluYW1pY1NwZWNpYWxpemVyKCksCiAgICAgICAgc3VwZXIoaW5wdXRzLCB0eXBlKSB7CiAgICBhc3NlcnQoaXNJbnRlcmNlcHRlZCAhPSBudWxsKTsKICAgIGlzSW50ZXJjZXB0ZWRDYWxsID0gaXNJbnRlcmNlcHRlZDsKICB9CiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAnaW52b2tlIGR5bmFtaWM6IHNlbGVjdG9yPSRzZWxlY3RvciwgbWFzaz0kbWFzayc7CiAgSEluc3RydWN0aW9uIGdldCByZWNlaXZlciA9PiBpbnB1dHNbMF07CiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIGdldERhcnRSZWNlaXZlcihKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBpc0NhbGxPbkludGVyY2VwdG9yKGNsb3NlZFdvcmxkKSA/IGlucHV0c1sxXSA6IGlucHV0c1swXTsKICB9CgogIC8vLyBUaGUgdHlwZSBhcmd1bWVudHMgcGFzc2VkIGluIHRoaXMgZHluYW1pYyBpbnZvY2F0aW9uLgogIExpc3Q8RGFydFR5cGU+IGdldCB0eXBlQXJndW1lbnRzOwoKICAvLy8gUmV0dXJucyB3aGV0aGVyIHRoaXMgY2FsbCBpcyBvbiBhbiBpbnRlcmNlcHRvciBvYmplY3QuCiAgYm9vbCBpc0NhbGxPbkludGVyY2VwdG9yKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGlzSW50ZXJjZXB0ZWRDYWxsICYmIHJlY2VpdmVyLmlzSW50ZXJjZXB0b3IoY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLklOVk9LRV9EWU5BTUlDX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhvdGhlcikgPT4gb3RoZXIgaXMgSEludm9rZUR5bmFtaWM7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhJbnZva2VEeW5hbWljIG90aGVyKSB7CiAgICAvLyBVc2UgdGhlIG5hbWUgYW5kIHRoZSBraW5kIGluc3RlYWQgb2YgW1NlbGVjdG9yLm9wZXJhdG9yPT1dCiAgICAvLyBiZWNhdXNlIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlIGFyaXR5IChhbHJlYWR5IGNoZWNrZWQgaW4KICAgIC8vIFtndm5FcXVhbHNdKSwgYW5kIHRoZSByZWNlaXZlciB0eXBlcyBtYXkgbm90IGJlIGluIHN5bmMuCiAgICByZXR1cm4gc2VsZWN0b3IubmFtZSA9PSBvdGhlci5zZWxlY3Rvci5uYW1lICYmCiAgICAgICAgc2VsZWN0b3Iua2luZCA9PSBvdGhlci5zZWxlY3Rvci5raW5kOwogIH0KfQoKY2xhc3MgSEludm9rZUNsb3N1cmUgZXh0ZW5kcyBISW52b2tlRHluYW1pYyB7CiAgQG92ZXJyaWRlCiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKCiAgSEludm9rZUNsb3N1cmUoU2VsZWN0b3Igc2VsZWN0b3IsIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMsCiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZSwgdGhpcy50eXBlQXJndW1lbnRzKQogICAgICA6IHN1cGVyKHNlbGVjdG9yLCBudWxsLCBudWxsLCBpbnB1dHMsIGZhbHNlLCB0eXBlKSB7CiAgICBhc3NlcnQoc2VsZWN0b3IuaXNDbG9zdXJlQ2FsbCk7CiAgICBhc3NlcnQoc2VsZWN0b3IuY2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRDb3VudCA9PSB0eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgICBhc3NlcnQoIWlzSW50ZXJjZXB0ZWRDYWxsKTsKICB9CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRJbnZva2VDbG9zdXJlKHRoaXMpOwp9CgpjbGFzcyBISW52b2tlRHluYW1pY01ldGhvZCBleHRlbmRzIEhJbnZva2VEeW5hbWljIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzOwoKICBISW52b2tlRHluYW1pY01ldGhvZCgKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgbWFzaywKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cywKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlLAogICAgICB0aGlzLnR5cGVBcmd1bWVudHMsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICB7Ym9vbCBpc0ludGVyY2VwdGVkOiBmYWxzZX0pCiAgICAgIDogc3VwZXIoc2VsZWN0b3IsIG1hc2ssIG51bGwsIGlucHV0cywgaXNJbnRlcmNlcHRlZCwgdHlwZSkgewogICAgdGhpcy5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogICAgYXNzZXJ0KHNlbGVjdG9yLmNhbGxTdHJ1Y3R1cmUudHlwZUFyZ3VtZW50Q291bnQgPT0gdHlwZUFyZ3VtZW50cy5sZW5ndGgpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ2ludm9rZSBkeW5hbWljIG1ldGhvZDogc2VsZWN0b3I9JHNlbGVjdG9yLCBtYXNrPSRtYXNrJzsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdEludm9rZUR5bmFtaWNNZXRob2QodGhpcyk7Cn0KCmFic3RyYWN0IGNsYXNzIEhJbnZva2VEeW5hbWljRmllbGQgZXh0ZW5kcyBISW52b2tlRHluYW1pYyB7CiAgSEludm9rZUR5bmFtaWNGaWVsZCgKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgbWFzaywKICAgICAgTWVtYmVyRW50aXR5IGVsZW1lbnQsCiAgICAgIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMsCiAgICAgIGJvb2wgaXNJbnRlcmNlcHRlZCwKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKHNlbGVjdG9yLCBtYXNrLCBlbGVtZW50LCBpbnB1dHMsIGlzSW50ZXJjZXB0ZWQsIHR5cGUpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnaW52b2tlIGR5bmFtaWMgZmllbGQ6IHNlbGVjdG9yPSRzZWxlY3RvciwgbWFzaz0kbWFzayc7Cn0KCmNsYXNzIEhJbnZva2VEeW5hbWljR2V0dGVyIGV4dGVuZHMgSEludm9rZUR5bmFtaWNGaWVsZCB7CiAgSEludm9rZUR5bmFtaWNHZXR0ZXIoCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBBYnN0cmFjdFZhbHVlIG1hc2ssCiAgICAgIE1lbWJlckVudGl0eSBlbGVtZW50LAogICAgICBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzLAogICAgICBib29sIGlzSW50ZXJjZXB0ZWQsCiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZSwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pCiAgICAgIDogc3VwZXIoc2VsZWN0b3IsIG1hc2ssIGVsZW1lbnQsIGlucHV0cywgaXNJbnRlcmNlcHRlZCwgdHlwZSkgewogICAgdGhpcy5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRJbnZva2VEeW5hbWljR2V0dGVyKHRoaXMpOwoKICBib29sIGdldCBpc1RlYXJPZmYgPT4gZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuaXNGdW5jdGlvbjsKCiAgQG92ZXJyaWRlCiAgTGlzdDxEYXJ0VHlwZT4gZ2V0IHR5cGVBcmd1bWVudHMgPT4gY29uc3QgPERhcnRUeXBlPltdOwoKICAvLyBUaGVyZSBtaWdodCBiZSBhbiBpbnRlcmNlcHRvciBpbnB1dCwgc28gYGlucHV0cy5sYXN0YCBpcyB0aGUgZGFydCByZWNlaXZlci4KICBAb3ZlcnJpZGUKICBib29sIGNhblRocm93KEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PiBpc1RlYXJPZmYKICAgICAgPyBpbnB1dHMubGFzdC5pc051bGwoZG9tYWluKS5pc1BvdGVudGlhbGx5VHJ1ZQogICAgICA6IHN1cGVyLmNhblRocm93KGRvbWFpbik7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdpbnZva2UgZHluYW1pYyBnZXR0ZXI6IHNlbGVjdG9yPSRzZWxlY3RvciwgbWFzaz0kbWFzayc7Cn0KCmNsYXNzIEhJbnZva2VEeW5hbWljU2V0dGVyIGV4dGVuZHMgSEludm9rZUR5bmFtaWNGaWVsZCB7CiAgLy8vIElmIGB0cnVlYCBhIGNhbGwgdG8gdGhlIHNldHRlciBpcyBuZWVkZWQgZm9yIGNoZWNraW5nIHRoZSB0eXBlIGV2ZW4KICAvLy8gdGhvdWdoIHRoZSB0YXJnZXQgZmllbGQgaXMga25vd24uCiAgYm9vbCBuZWVkc0NoZWNrID0gZmFsc2U7CgogIEhJbnZva2VEeW5hbWljU2V0dGVyKAogICAgICBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrLAogICAgICBNZW1iZXJFbnRpdHkgZWxlbWVudCwKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cywKICAgICAgYm9vbCBpc0ludGVyY2VwdGVkLAogICAgICBBYnN0cmFjdFZhbHVlIHR5cGUsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKQogICAgICA6IHN1cGVyKHNlbGVjdG9yLCBtYXNrLCBlbGVtZW50LCBpbnB1dHMsIGlzSW50ZXJjZXB0ZWQsIHR5cGUpIHsKICAgIHRoaXMuc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKICB9CgogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0SW52b2tlRHluYW1pY1NldHRlcih0aGlzKTsKCiAgQG92ZXJyaWRlCiAgTGlzdDxEYXJ0VHlwZT4gZ2V0IHR5cGVBcmd1bWVudHMgPT4gY29uc3QgPERhcnRUeXBlPltdOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PgogICAgICAnaW52b2tlIGR5bmFtaWMgc2V0dGVyOiBzZWxlY3Rvcj0kc2VsZWN0b3IsIG1hc2s9JG1hc2ssIGVsZW1lbnQ9JGVsZW1lbnQnOwp9CgpjbGFzcyBISW52b2tlU3RhdGljIGV4dGVuZHMgSEludm9rZSB7CiAgZmluYWwgTWVtYmVyRW50aXR5IGVsZW1lbnQ7CgogIC8vLyBUaGUgdHlwZSBhcmd1bWVudHMgcGFzc2VkIGluIHRoaXMgc3RhdGljIGludm9jYXRpb24uCiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKCiAgZmluYWwgYm9vbCB0YXJnZXRDYW5UaHJvdzsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjYW5UaHJvdyhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4gdGFyZ2V0Q2FuVGhyb3c7CgogIC8vLyBJZiB0aGlzIGluc3RydWN0aW9uIGlzIGEgY2FsbCB0byBhIGNvbnN0cnVjdG9yLCBbaW5zdGFudGlhdGVkVHlwZXNdCiAgLy8vIGNvbnRhaW5zIHRoZSB0eXBlKHMpIHVzZWQgaW4gdGhlIChEYXJ0KSBgTmV3YCBleHByZXNzaW9uKHMpLiBUaGUKICAvLy8gW2luc3RydWN0aW9uVHlwZV0gb2YgdGhpcyBub2RlIGlzIG5vdCBlbm91Z2gsIGJlY2F1c2Ugd2UgYWxzbyBuZWVkIHRoZQogIC8vLyB0eXBlIGFyZ3VtZW50cy4gU2VlIGFsc28gW1NzYUZyb21Bc3RNaXhpbi5jdXJyZW50SW5saW5lZEluc3RhbnRpYXRpb25zXS4KICBMaXN0PEludGVyZmFjZVR5cGU+IGluc3RhbnRpYXRlZFR5cGVzOwoKICAvLy8gVGhlIGZpcnN0IGlucHV0IG11c3QgYmUgdGhlIHRhcmdldC4KICBISW52b2tlU3RhdGljKHRoaXMuZWxlbWVudCwgaW5wdXRzLCBBYnN0cmFjdFZhbHVlIHR5cGUsIHRoaXMudHlwZUFyZ3VtZW50cywKICAgICAge3RoaXMudGFyZ2V0Q2FuVGhyb3c6IHRydWUsIGJvb2wgaXNJbnRlcmNlcHRlZDogZmFsc2V9KQogICAgICA6IHN1cGVyKGlucHV0cywgdHlwZSkgewogICAgaXNJbnRlcmNlcHRlZENhbGwgPSBpc0ludGVyY2VwdGVkOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRJbnZva2VTdGF0aWModGhpcyk7CgogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5JTlZPS0VfU1RBVElDX1RZUEVDT0RFOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnaW52b2tlIHN0YXRpYzogJGVsZW1lbnQnOwp9CgpjbGFzcyBISW52b2tlU3VwZXIgZXh0ZW5kcyBISW52b2tlU3RhdGljIHsKICAvLy8gVGhlIGNsYXNzIHdoZXJlIHRoZSBjYWxsIHRvIHN1cGVyIGlzIGJlaW5nIGRvbmUuCiAgZmluYWwgQ2xhc3NFbnRpdHkgY2FsbGVyOwogIGZpbmFsIGJvb2wgaXNTZXR0ZXI7CiAgQG92ZXJyaWRlCiAgZmluYWwgU2VsZWN0b3Igc2VsZWN0b3I7CgogIEhJbnZva2VTdXBlcigKICAgICAgTWVtYmVyRW50aXR5IGVsZW1lbnQsCiAgICAgIHRoaXMuY2FsbGVyLAogICAgICB0aGlzLnNlbGVjdG9yLAogICAgICBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzLAogICAgICBib29sIGlzSW50ZXJjZXB0ZWQsCiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZSwKICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cywKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIHt0aGlzLmlzU2V0dGVyfSkKICAgICAgOiBzdXBlcihlbGVtZW50LCBpbnB1dHMsIHR5cGUsIHR5cGVBcmd1bWVudHMsCiAgICAgICAgICAgIGlzSW50ZXJjZXB0ZWQ6IGlzSW50ZXJjZXB0ZWQpIHsKICAgIHRoaXMuc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKICB9CgogIEhJbnN0cnVjdGlvbiBnZXQgcmVjZWl2ZXIgPT4gaW5wdXRzWzBdOwogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBnZXREYXJ0UmVjZWl2ZXIoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gaXNDYWxsT25JbnRlcmNlcHRvcihjbG9zZWRXb3JsZCkgPyBpbnB1dHNbMV0gOiBpbnB1dHNbMF07CiAgfQoKICAvLy8gUmV0dXJucyB3aGV0aGVyIHRoaXMgY2FsbCBpcyBvbiBhbiBpbnRlcmNlcHRvciBvYmplY3QuCiAgYm9vbCBpc0NhbGxPbkludGVyY2VwdG9yKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGlzSW50ZXJjZXB0ZWRDYWxsICYmIHJlY2VpdmVyLmlzSW50ZXJjZXB0b3IoY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAnaW52b2tlIHN1cGVyOiAkZWxlbWVudCc7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRJbnZva2VTdXBlcih0aGlzKTsKCiAgSEluc3RydWN0aW9uIGdldCB2YWx1ZSB7CiAgICBhc3NlcnQoaXNTZXR0ZXIpOwogICAgLy8gVGhlICdpbnB1dHMnIGFyZSBbcmVjZWl2ZXIsIHZhbHVlXSBvciBbaW50ZXJjZXB0b3IsIHJlY2VpdmVyLCB2YWx1ZV0uCiAgICByZXR1cm4gaW5wdXRzLmxhc3Q7CiAgfQp9CgpjbGFzcyBISW52b2tlQ29uc3RydWN0b3JCb2R5IGV4dGVuZHMgSEludm9rZVN0YXRpYyB7CiAgLy8gVGhlICdpbnB1dHMnIGFyZQogIC8vICAgICBbcmVjZWl2ZXIsIGFyZzEsIC4uLiwgYXJnTl0gb3IKICAvLyAgICAgW2ludGVyY2VwdG9yLCByZWNlaXZlciwgYXJnMSwgLi4uIGFyZ05dLgogIEhJbnZva2VDb25zdHJ1Y3RvckJvZHkoCiAgICAgIENvbnN0cnVjdG9yQm9keUVudGl0eSBlbGVtZW50LAogICAgICBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzLAogICAgICBBYnN0cmFjdFZhbHVlIHR5cGUsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKQogICAgICA6IHN1cGVyKGVsZW1lbnQsIGlucHV0cywgdHlwZSwgY29uc3QgPERhcnRUeXBlPltdKSB7CiAgICB0aGlzLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnaW52b2tlIGNvbnN0cnVjdG9yIGJvZHk6ICR7ZWxlbWVudC5uYW1lfSc7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRJbnZva2VDb25zdHJ1Y3RvckJvZHkodGhpcyk7Cn0KCmNsYXNzIEhJbnZva2VHZW5lcmF0b3JCb2R5IGV4dGVuZHMgSEludm9rZVN0YXRpYyB7CiAgLy8gRGlyZWN0bHkgY2FsbCB0aGUgSkdlbmVyYXRvckJvZHkgbWV0aG9kLiBUaGUgZ2VuZXJhdG9yIGJvZHkgY2FuIGJlIGEgc3RhdGljCiAgLy8gbWV0aG9kIG9yIGEgbWVtYmVyLiBUaGUgdGFyZ2V0IGlzIGRpcmVjdGx5IGNhbGxlZC4KICAvLyBUaGUgJ2lucHV0cycgYXJlCiAgLy8gICAgIFthcmcxLCAuLi4sIGFyZ05dIG9yCiAgLy8gICAgIFtyZWNlaXZlciwgYXJnMSwgLi4uLCBhcmdOXSBvcgogIC8vICAgICBbaW50ZXJjZXB0b3IsIHJlY2VpdmVyLCBhcmcxLCAuLi4gYXJnTl0uCiAgLy8gVGhlICdpbnB1dHMnIG1heSBvciBtYXkgbm90IGhhdmUgYW4gYWRkaXRpb25hbCB0eXBlIGFyZ3VtZW50IHVzZWQgZm9yCiAgLy8gY3JlYXRpbmcgdGhlIGdlbmVyYXRvciAoVCBmb3IgbmV3IENvbXBsZXRlcjxUPigpIGluc2lkZSB0aGUgYm9keSkuCiAgSEludm9rZUdlbmVyYXRvckJvZHkoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCwgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cywKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikKICAgICAgOiBzdXBlcihlbGVtZW50LCBpbnB1dHMsIHR5cGUsIGNvbnN0IDxEYXJ0VHlwZT5bXSkgewogICAgdGhpcy5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0hJbnZva2VHZW5lcmF0b3JCb2R5KCR7ZWxlbWVudC5uYW1lfSknOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0SW52b2tlR2VuZXJhdG9yQm9keSh0aGlzKTsKfQoKYWJzdHJhY3QgY2xhc3MgSEZpZWxkQWNjZXNzIGV4dGVuZHMgSEluc3RydWN0aW9uIHsKICBmaW5hbCBGaWVsZEVudGl0eSBlbGVtZW50OwoKICBIRmllbGRBY2Nlc3ModGhpcy5lbGVtZW50LCBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzLCBBYnN0cmFjdFZhbHVlIHR5cGUpCiAgICAgIDogc3VwZXIoaW5wdXRzLCB0eXBlKTsKCiAgSEluc3RydWN0aW9uIGdldCByZWNlaXZlciA9PiBpbnB1dHNbMF07Cn0KCmNsYXNzIEhGaWVsZEdldCBleHRlbmRzIEhGaWVsZEFjY2VzcyB7CiAgZmluYWwgYm9vbCBpc0Fzc2lnbmFibGU7CgogIEhGaWVsZEdldChGaWVsZEVudGl0eSBlbGVtZW50LCBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIsIEFic3RyYWN0VmFsdWUgdHlwZSwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIHtib29sIGlzQXNzaWduYWJsZX0pCiAgICAgIDogdGhpcy5pc0Fzc2lnbmFibGUgPQogICAgICAgICAgICAoaXNBc3NpZ25hYmxlICE9IG51bGwpID8gaXNBc3NpZ25hYmxlIDogZWxlbWVudC5pc0Fzc2lnbmFibGUsCiAgICAgICAgc3VwZXIoZWxlbWVudCwgPEhJbnN0cnVjdGlvbj5bcmVjZWl2ZXJdLCB0eXBlKSB7CiAgICB0aGlzLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgICBzaWRlRWZmZWN0cy5jbGVhckFsbFNpZGVFZmZlY3RzKCk7CiAgICBzaWRlRWZmZWN0cy5jbGVhckFsbERlcGVuZGVuY2llcygpOwogICAgc2V0VXNlR3ZuKCk7CiAgICBpZiAodGhpcy5pc0Fzc2lnbmFibGUpIHsKICAgICAgc2lkZUVmZmVjdHMuc2V0RGVwZW5kc09uSW5zdGFuY2VQcm9wZXJ0eVN0b3JlKCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSW50ZXJjZXB0b3IoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBpZiAoc291cmNlRWxlbWVudCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAvLyBJbiBjYXNlIG9mIGEgY2xvc3VyZSBpbnNpZGUgYW4gaW50ZXJjZXB0b3IgY2xhc3MsIFs6dGhpczpdIGlzCiAgICAvLyBzdG9yZWQgaW4gdGhlIGdlbmVyYXRlZCBjbG9zdXJlIGNsYXNzLCBhbmQgYWNjZXNzZWQgdGhyb3VnaCBhCiAgICAvLyBbSEZpZWxkR2V0XS4KICAgIGlmIChzb3VyY2VFbGVtZW50IGlzIFRoaXNMb2NhbCkgewogICAgICBUaGlzTG9jYWwgdGhpc0xvY2FsID0gc291cmNlRWxlbWVudDsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmludGVyY2VwdG9yRGF0YQogICAgICAgICAgLmlzSW50ZXJjZXB0ZWRDbGFzcyh0aGlzTG9jYWwuZW5jbG9zaW5nQ2xhc3MpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjYW5UaHJvdyhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4KICAgICAgcmVjZWl2ZXIuaXNOdWxsKGRvbWFpbikuaXNQb3RlbnRpYWxseVRydWU7CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBnZXREYXJ0UmVjZWl2ZXIoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSA9PiByZWNlaXZlcjsKICBAb3ZlcnJpZGUKICBib29sIG9ubHlUaHJvd3NOU00oKSA9PiB0cnVlOwogIGJvb2wgZ2V0IGlzTnVsbENoZWNrID0+IGVsZW1lbnQgPT0gbnVsbDsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRGaWVsZEdldCh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLkZJRUxEX0dFVF9UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMob3RoZXIpID0+IG90aGVyIGlzIEhGaWVsZEdldDsKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSEZpZWxkR2V0IG90aGVyKSA9PiBlbGVtZW50ID09IG90aGVyLmVsZW1lbnQ7CiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIkZpZWxkR2V0KGVsZW1lbnQ9JGVsZW1lbnQsdHlwZT0kaW5zdHJ1Y3Rpb25UeXBlKSI7Cn0KCmNsYXNzIEhGaWVsZFNldCBleHRlbmRzIEhGaWVsZEFjY2VzcyB7CiAgSEZpZWxkU2V0KEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluLCBGaWVsZEVudGl0eSBlbGVtZW50LAogICAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIsIEhJbnN0cnVjdGlvbiB2YWx1ZSkKICAgICAgOiBzdXBlcihlbGVtZW50LCA8SEluc3RydWN0aW9uPltyZWNlaXZlciwgdmFsdWVdLCBkb21haW4uZW1wdHlUeXBlKSB7CiAgICBzaWRlRWZmZWN0cy5jbGVhckFsbFNpZGVFZmZlY3RzKCk7CiAgICBzaWRlRWZmZWN0cy5jbGVhckFsbERlcGVuZGVuY2llcygpOwogICAgc2lkZUVmZmVjdHMuc2V0Q2hhbmdlc0luc3RhbmNlUHJvcGVydHkoKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY2FuVGhyb3coQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIHJlY2VpdmVyLmlzTnVsbChkb21haW4pLmlzUG90ZW50aWFsbHlUcnVlOwoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gZ2V0RGFydFJlY2VpdmVyKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgPT4gcmVjZWl2ZXI7CiAgQG92ZXJyaWRlCiAgYm9vbCBvbmx5VGhyb3dzTlNNKCkgPT4gdHJ1ZTsKCiAgSEluc3RydWN0aW9uIGdldCB2YWx1ZSA9PiBpbnB1dHNbMV07CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRGaWVsZFNldCh0aGlzKTsKCiAgLy8gSEZpZWxkU2V0IGlzIGFuIGV4cHJlc3Npb24gaWYgaXQgaGFzIGEgdXNlci4KICBAb3ZlcnJpZGUKICBib29sIGlzSnNTdGF0ZW1lbnQoKSA9PiB1c2VkQnkuaXNFbXB0eTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIkZpZWxkU2V0KGVsZW1lbnQ9JGVsZW1lbnQsdHlwZT0kaW5zdHJ1Y3Rpb25UeXBlKSI7Cn0KCmNsYXNzIEhHZXRMZW5ndGggZXh0ZW5kcyBISW5zdHJ1Y3Rpb24gewogIGZpbmFsIGJvb2wgaXNBc3NpZ25hYmxlOwogIEhHZXRMZW5ndGgoSEluc3RydWN0aW9uIHJlY2VpdmVyLCBBYnN0cmFjdFZhbHVlIHR5cGUsCiAgICAgIHtib29sIHRoaXMuaXNBc3NpZ25hYmxlfSkKICAgICAgOiBzdXBlcig8SEluc3RydWN0aW9uPltyZWNlaXZlcl0sIHR5cGUpIHsKICAgIGFzc2VydChpc0Fzc2lnbmFibGUgIT0gbnVsbCk7CiAgICBzaWRlRWZmZWN0cy5jbGVhckFsbFNpZGVFZmZlY3RzKCk7CiAgICBzaWRlRWZmZWN0cy5jbGVhckFsbERlcGVuZGVuY2llcygpOwogICAgc2V0VXNlR3ZuKCk7CiAgICBpZiAodGhpcy5pc0Fzc2lnbmFibGUpIHsKICAgICAgc2lkZUVmZmVjdHMuc2V0RGVwZW5kc09uSW5zdGFuY2VQcm9wZXJ0eVN0b3JlKCk7CiAgICB9CiAgfQoKICBISW5zdHJ1Y3Rpb24gZ2V0IHJlY2VpdmVyID0+IGlucHV0cy5zaW5nbGU7CgogIEBvdmVycmlkZQogIGJvb2wgY2FuVGhyb3coQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIHJlY2VpdmVyLmlzTnVsbChkb21haW4pLmlzUG90ZW50aWFsbHlUcnVlOwoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gZ2V0RGFydFJlY2VpdmVyKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgPT4gcmVjZWl2ZXI7CiAgQG92ZXJyaWRlCiAgYm9vbCBvbmx5VGhyb3dzTlNNKCkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRHZXRMZW5ndGgodGhpcyk7CgogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5HRVRfTEVOR1RIX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhvdGhlcikgPT4gb3RoZXIgaXMgSEdldExlbmd0aDsKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSEdldExlbmd0aCBvdGhlcikgPT4gdHJ1ZTsKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiR2V0TGVuZ3RoKCkiOwp9CgovLy8gSFJlYWRNb2RpZnlXcml0ZSBpcyBhIGxhdGUgc3RhZ2UgaW5zdHJ1Y3Rpb24gZm9yIGEgZmllbGQgKHByb3BlcnR5KSB1cGRhdGUKLy8vIHZpYSBhbiBhc3NpZ25tZW50IG9wZXJhdGlvbiBvciBwcmUtIG9yIHBvc3QtaW5jcmVtZW50LgpjbGFzcyBIUmVhZE1vZGlmeVdyaXRlIGV4dGVuZHMgSExhdGVJbnN0cnVjdGlvbiB7CiAgc3RhdGljIGNvbnN0IEFTU0lHTl9PUCA9IDA7CiAgc3RhdGljIGNvbnN0IFBSRV9PUCA9IDE7CiAgc3RhdGljIGNvbnN0IFBPU1RfT1AgPSAyOwogIGZpbmFsIEZpZWxkRW50aXR5IGVsZW1lbnQ7CiAgZmluYWwgU3RyaW5nIGpzT3A7CiAgZmluYWwgaW50IG9wS2luZDsKCiAgSFJlYWRNb2RpZnlXcml0ZS5fKHRoaXMuZWxlbWVudCwgdGhpcy5qc09wLCB0aGlzLm9wS2luZCwKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cywgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKGlucHV0cywgdHlwZSkgewogICAgc2lkZUVmZmVjdHMuY2xlYXJBbGxTaWRlRWZmZWN0cygpOwogICAgc2lkZUVmZmVjdHMuY2xlYXJBbGxEZXBlbmRlbmNpZXMoKTsKICAgIHNpZGVFZmZlY3RzLnNldENoYW5nZXNJbnN0YW5jZVByb3BlcnR5KCk7CiAgICBzaWRlRWZmZWN0cy5zZXREZXBlbmRzT25JbnN0YW5jZVByb3BlcnR5U3RvcmUoKTsKICB9CgogIEhSZWFkTW9kaWZ5V3JpdGUuYXNzaWduT3AoRmllbGRFbnRpdHkgZWxlbWVudCwgU3RyaW5nIGpzT3AsCiAgICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciwgSEluc3RydWN0aW9uIG9wZXJhbmQsIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiB0aGlzLl8oCiAgICAgICAgICAgIGVsZW1lbnQsIGpzT3AsIEFTU0lHTl9PUCwgPEhJbnN0cnVjdGlvbj5bcmVjZWl2ZXIsIG9wZXJhbmRdLCB0eXBlKTsKCiAgSFJlYWRNb2RpZnlXcml0ZS5wcmVPcChGaWVsZEVudGl0eSBlbGVtZW50LCBTdHJpbmcganNPcCwKICAgICAgSEluc3RydWN0aW9uIHJlY2VpdmVyLCBBYnN0cmFjdFZhbHVlIHR5cGUpCiAgICAgIDogdGhpcy5fKGVsZW1lbnQsIGpzT3AsIFBSRV9PUCwgPEhJbnN0cnVjdGlvbj5bcmVjZWl2ZXJdLCB0eXBlKTsKCiAgSFJlYWRNb2RpZnlXcml0ZS5wb3N0T3AoRmllbGRFbnRpdHkgZWxlbWVudCwgU3RyaW5nIGpzT3AsCiAgICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciwgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHRoaXMuXyhlbGVtZW50LCBqc09wLCBQT1NUX09QLCA8SEluc3RydWN0aW9uPltyZWNlaXZlcl0sIHR5cGUpOwoKICBISW5zdHJ1Y3Rpb24gZ2V0IHJlY2VpdmVyID0+IGlucHV0c1swXTsKCiAgYm9vbCBnZXQgaXNQcmVPcCA9PiBvcEtpbmQgPT0gUFJFX09QOwogIGJvb2wgZ2V0IGlzUG9zdE9wID0+IG9wS2luZCA9PSBQT1NUX09QOwogIGJvb2wgZ2V0IGlzQXNzaWduT3AgPT4gb3BLaW5kID09IEFTU0lHTl9PUDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjYW5UaHJvdyhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4KICAgICAgcmVjZWl2ZXIuaXNOdWxsKGRvbWFpbikuaXNQb3RlbnRpYWxseVRydWU7CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBnZXREYXJ0UmVjZWl2ZXIoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSA9PiByZWNlaXZlcjsKICBAb3ZlcnJpZGUKICBib29sIG9ubHlUaHJvd3NOU00oKSA9PiB0cnVlOwoKICBISW5zdHJ1Y3Rpb24gZ2V0IHZhbHVlID0+IGlucHV0c1sxXTsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFJlYWRNb2RpZnlXcml0ZSh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0pzU3RhdGVtZW50KCkgPT4gaXNBc3NpZ25PcDsKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiUmVhZE1vZGlmeVdyaXRlICRqc09wICRvcEtpbmQgJGVsZW1lbnQiOwp9CgphYnN0cmFjdCBjbGFzcyBITG9jYWxBY2Nlc3MgZXh0ZW5kcyBISW5zdHJ1Y3Rpb24gewogIGZpbmFsIExvY2FsIHZhcmlhYmxlOwoKICBITG9jYWxBY2Nlc3ModGhpcy52YXJpYWJsZSwgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cywgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKGlucHV0cywgdHlwZSk7CgogIEhJbnN0cnVjdGlvbiBnZXQgcmVjZWl2ZXIgPT4gaW5wdXRzWzBdOwp9CgpjbGFzcyBITG9jYWxHZXQgZXh0ZW5kcyBITG9jYWxBY2Nlc3MgewogIC8vIE5vIG5lZWQgdG8gdXNlIEdWTiBmb3IgYSBbSExvY2FsR2V0XSwgaXQgaXMganVzdCBhIGxvY2FsCiAgLy8gYWNjZXNzLgogIEhMb2NhbEdldChMb2NhbCB2YXJpYWJsZSwgSExvY2FsVmFsdWUgbG9jYWwsIEFic3RyYWN0VmFsdWUgdHlwZSwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pCiAgICAgIDogc3VwZXIodmFyaWFibGUsIDxISW5zdHJ1Y3Rpb24+W2xvY2FsXSwgdHlwZSkgewogICAgdGhpcy5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRMb2NhbEdldCh0aGlzKTsKCiAgSExvY2FsVmFsdWUgZ2V0IGxvY2FsID0+IGlucHV0c1swXTsKfQoKY2xhc3MgSExvY2FsU2V0IGV4dGVuZHMgSExvY2FsQWNjZXNzIHsKICBITG9jYWxTZXQoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4sIExvY2FsIHZhcmlhYmxlLCBITG9jYWxWYWx1ZSBsb2NhbCwKICAgICAgSEluc3RydWN0aW9uIHZhbHVlKQogICAgICA6IHN1cGVyKHZhcmlhYmxlLCA8SEluc3RydWN0aW9uPltsb2NhbCwgdmFsdWVdLCBkb21haW4uZW1wdHlUeXBlKTsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRMb2NhbFNldCh0aGlzKTsKCiAgSExvY2FsVmFsdWUgZ2V0IGxvY2FsID0+IGlucHV0c1swXTsKICBISW5zdHJ1Y3Rpb24gZ2V0IHZhbHVlID0+IGlucHV0c1sxXTsKICBAb3ZlcnJpZGUKICBib29sIGlzSnNTdGF0ZW1lbnQoKSA9PiB0cnVlOwp9CgphYnN0cmFjdCBjbGFzcyBIRm9yZWlnbiBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgSEZvcmVpZ24oQWJzdHJhY3RWYWx1ZSB0eXBlLCBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzKSA6IHN1cGVyKGlucHV0cywgdHlwZSk7CgogIGJvb2wgZ2V0IGlzU3RhdGVtZW50ID0+IGZhbHNlOwogIE5hdGl2ZUJlaGF2aW9yIGdldCBuYXRpdmVCZWhhdmlvciA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBib29sIGNhblRocm93KEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSB7CiAgICByZXR1cm4gc2lkZUVmZmVjdHMuaGFzU2lkZUVmZmVjdHMoKSB8fCBzaWRlRWZmZWN0cy5kZXBlbmRzT25Tb21ldGhpbmcoKTsKICB9Cn0KCmNsYXNzIEhGb3JlaWduQ29kZSBleHRlbmRzIEhGb3JlaWduIHsKICBmaW5hbCBqcy5UZW1wbGF0ZSBjb2RlVGVtcGxhdGU7CiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc1N0YXRlbWVudDsKICBAb3ZlcnJpZGUKICBmaW5hbCBOYXRpdmVCZWhhdmlvciBuYXRpdmVCZWhhdmlvcjsKICBOYXRpdmVUaHJvd0JlaGF2aW9yIHRocm93QmVoYXZpb3I7CiAgZmluYWwgRnVuY3Rpb25FbnRpdHkgZm9yZWlnbkZ1bmN0aW9uOwoKICBIRm9yZWlnbkNvZGUodGhpcy5jb2RlVGVtcGxhdGUsIEFic3RyYWN0VmFsdWUgdHlwZSwgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cywKICAgICAge3RoaXMuaXNTdGF0ZW1lbnQ6IGZhbHNlLAogICAgICBTaWRlRWZmZWN0cyBlZmZlY3RzLAogICAgICBOYXRpdmVCZWhhdmlvciBuYXRpdmVCZWhhdmlvciwKICAgICAgTmF0aXZlVGhyb3dCZWhhdmlvciB0aHJvd0JlaGF2aW9yLAogICAgICB0aGlzLmZvcmVpZ25GdW5jdGlvbn0pCiAgICAgIDogdGhpcy5uYXRpdmVCZWhhdmlvciA9IG5hdGl2ZUJlaGF2aW9yLAogICAgICAgIHRoaXMudGhyb3dCZWhhdmlvciA9IHRocm93QmVoYXZpb3IsCiAgICAgICAgc3VwZXIodHlwZSwgaW5wdXRzKSB7CiAgICBhc3NlcnQoY29kZVRlbXBsYXRlICE9IG51bGwpOwogICAgaWYgKGVmZmVjdHMgPT0gbnVsbCAmJiBuYXRpdmVCZWhhdmlvciAhPSBudWxsKSB7CiAgICAgIGVmZmVjdHMgPSBuYXRpdmVCZWhhdmlvci5zaWRlRWZmZWN0czsKICAgIH0KICAgIGlmICh0aGlzLnRocm93QmVoYXZpb3IgPT0gbnVsbCkgewogICAgICB0aGlzLnRocm93QmVoYXZpb3IgPSAobmF0aXZlQmVoYXZpb3IgPT0gbnVsbCkKICAgICAgICAgID8gTmF0aXZlVGhyb3dCZWhhdmlvci5NQVkKICAgICAgICAgIDogbmF0aXZlQmVoYXZpb3IudGhyb3dCZWhhdmlvcjsKICAgIH0KICAgIGFzc2VydCh0aGlzLnRocm93QmVoYXZpb3IgIT0gbnVsbCk7CgogICAgaWYgKGVmZmVjdHMgIT0gbnVsbCkgc2lkZUVmZmVjdHMuYWRkKGVmZmVjdHMpOwogICAgaWYgKG5hdGl2ZUJlaGF2aW9yICE9IG51bGwgJiYgbmF0aXZlQmVoYXZpb3IudXNlR3ZuKSB7CiAgICAgIHNldFVzZUd2bigpOwogICAgfQogIH0KCiAgSEZvcmVpZ25Db2RlLnN0YXRlbWVudChqcy5UZW1wbGF0ZSBjb2RlVGVtcGxhdGUsIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMsCiAgICAgIFNpZGVFZmZlY3RzIGVmZmVjdHMsIE5hdGl2ZUJlaGF2aW9yIG5hdGl2ZUJlaGF2aW9yLCBBYnN0cmFjdFZhbHVlIHR5cGUpCiAgICAgIDogdGhpcyhjb2RlVGVtcGxhdGUsIHR5cGUsIGlucHV0cywKICAgICAgICAgICAgaXNTdGF0ZW1lbnQ6IHRydWUsCiAgICAgICAgICAgIGVmZmVjdHM6IGVmZmVjdHMsCiAgICAgICAgICAgIG5hdGl2ZUJlaGF2aW9yOiBuYXRpdmVCZWhhdmlvcik7CgogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0Rm9yZWlnbkNvZGUodGhpcyk7CgogIEBvdmVycmlkZQogIGJvb2wgaXNKc1N0YXRlbWVudCgpID0+IGlzU3RhdGVtZW50OwogIEBvdmVycmlkZQogIGJvb2wgY2FuVGhyb3coQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pIHsKICAgIGlmIChpbnB1dHMubGVuZ3RoID4gMCkgewogICAgICByZXR1cm4gaW5wdXRzLmZpcnN0LmlzTnVsbChkb21haW4pLmlzUG90ZW50aWFsbHlUcnVlCiAgICAgICAgICA/IHRocm93QmVoYXZpb3IuY2FuVGhyb3cKICAgICAgICAgIDogdGhyb3dCZWhhdmlvci5vbk5vbk51bGwuY2FuVGhyb3c7CiAgICB9CiAgICByZXR1cm4gdGhyb3dCZWhhdmlvci5jYW5UaHJvdzsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb25seVRocm93c05TTSgpID0+IHRocm93QmVoYXZpb3IuaXNPbmx5TnVsbE5TTUd1YXJkOwoKICBAb3ZlcnJpZGUKICBib29sIGlzQWxsb2NhdGlvbihBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4KICAgICAgbmF0aXZlQmVoYXZpb3IgIT0gbnVsbCAmJgogICAgICBuYXRpdmVCZWhhdmlvci5pc0FsbG9jYXRpb24gJiYKICAgICAgaXNOdWxsKGRvbWFpbikuaXNEZWZpbml0ZWx5RmFsc2U7CgogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5GT1JFSUdOX0NPREVfVFlQRUNPREU7CiAgQG92ZXJyaWRlCiAgYm9vbCB0eXBlRXF1YWxzKG90aGVyKSA9PiBvdGhlciBpcyBIRm9yZWlnbkNvZGU7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhGb3JlaWduQ29kZSBvdGhlcikgewogICAgcmV0dXJuIGNvZGVUZW1wbGF0ZS5zb3VyY2UgIT0gbnVsbCAmJgogICAgICAgIGNvZGVUZW1wbGF0ZS5zb3VyY2UgPT0gb3RoZXIuY29kZVRlbXBsYXRlLnNvdXJjZTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdIRm9yZWlnbkNvZGUoIiR7Y29kZVRlbXBsYXRlLnNvdXJjZX0iKSc7Cn0KCmFic3RyYWN0IGNsYXNzIEhJbnZva2VCaW5hcnkgZXh0ZW5kcyBISW5zdHJ1Y3Rpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFNlbGVjdG9yIHNlbGVjdG9yOwogIEhJbnZva2VCaW5hcnkoCiAgICAgIEhJbnN0cnVjdGlvbiBsZWZ0LCBISW5zdHJ1Y3Rpb24gcmlnaHQsIHRoaXMuc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcig8SEluc3RydWN0aW9uPltsZWZ0LCByaWdodF0sIHR5cGUpIHsKICAgIHNpZGVFZmZlY3RzLmNsZWFyQWxsU2lkZUVmZmVjdHMoKTsKICAgIHNpZGVFZmZlY3RzLmNsZWFyQWxsRGVwZW5kZW5jaWVzKCk7CiAgICBzZXRVc2VHdm4oKTsKICB9CgogIEhJbnN0cnVjdGlvbiBnZXQgbGVmdCA9PiBpbnB1dHNbMF07CiAgSEluc3RydWN0aW9uIGdldCByaWdodCA9PiBpbnB1dHNbMV07CgogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCk7Cn0KCmFic3RyYWN0IGNsYXNzIEhCaW5hcnlBcml0aG1ldGljIGV4dGVuZHMgSEludm9rZUJpbmFyeSB7CiAgSEJpbmFyeUFyaXRobWV0aWMoSEluc3RydWN0aW9uIGxlZnQsIEhJbnN0cnVjdGlvbiByaWdodCwgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcihsZWZ0LCByaWdodCwgc2VsZWN0b3IsIHR5cGUpOwogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCk7Cn0KCmNsYXNzIEhBZGQgZXh0ZW5kcyBIQmluYXJ5QXJpdGhtZXRpYyB7CiAgSEFkZChISW5zdHJ1Y3Rpb24gbGVmdCwgSEluc3RydWN0aW9uIHJpZ2h0LCBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKGxlZnQsIHJpZ2h0LCBzZWxlY3RvciwgdHlwZSk7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRBZGQodGhpcyk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLmFkZDsKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uQUREX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhvdGhlcikgPT4gb3RoZXIgaXMgSEFkZDsKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiB0cnVlOwp9CgpjbGFzcyBIRGl2aWRlIGV4dGVuZHMgSEJpbmFyeUFyaXRobWV0aWMgewogIEhEaXZpZGUoSEluc3RydWN0aW9uIGxlZnQsIEhJbnN0cnVjdGlvbiByaWdodCwgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcihsZWZ0LCByaWdodCwgc2VsZWN0b3IsIHR5cGUpOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0RGl2aWRlKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpID0+IGNvbnN0YW50X3N5c3RlbS5kaXZpZGU7CiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLkRJVklERV9UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMob3RoZXIpID0+IG90aGVyIGlzIEhEaXZpZGU7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gdHJ1ZTsKfQoKY2xhc3MgSE11bHRpcGx5IGV4dGVuZHMgSEJpbmFyeUFyaXRobWV0aWMgewogIEhNdWx0aXBseShISW5zdHJ1Y3Rpb24gbGVmdCwgSEluc3RydWN0aW9uIHJpZ2h0LCBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKGxlZnQsIHJpZ2h0LCBzZWxlY3RvciwgdHlwZSk7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRNdWx0aXBseSh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgY29uc3RhbnRfc3lzdGVtLkJpbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24oKSA9PiBjb25zdGFudF9zeXN0ZW0ubXVsdGlwbHk7CiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLk1VTFRJUExZX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhvdGhlcikgPT4gb3RoZXIgaXMgSE11bHRpcGx5OwogIEBvdmVycmlkZQogIGJvb2wgZGF0YUVxdWFscyhISW5zdHJ1Y3Rpb24gb3RoZXIpID0+IHRydWU7Cn0KCmNsYXNzIEhTdWJ0cmFjdCBleHRlbmRzIEhCaW5hcnlBcml0aG1ldGljIHsKICBIU3VidHJhY3QoSEluc3RydWN0aW9uIGxlZnQsIEhJbnN0cnVjdGlvbiByaWdodCwgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcihsZWZ0LCByaWdodCwgc2VsZWN0b3IsIHR5cGUpOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0U3VidHJhY3QodGhpcyk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLnN1YnRyYWN0OwogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5TVUJUUkFDVF9UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMob3RoZXIpID0+IG90aGVyIGlzIEhTdWJ0cmFjdDsKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiB0cnVlOwp9CgpjbGFzcyBIVHJ1bmNhdGluZ0RpdmlkZSBleHRlbmRzIEhCaW5hcnlBcml0aG1ldGljIHsKICBIVHJ1bmNhdGluZ0RpdmlkZShISW5zdHJ1Y3Rpb24gbGVmdCwgSEluc3RydWN0aW9uIHJpZ2h0LCBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKGxlZnQsIHJpZ2h0LCBzZWxlY3RvciwgdHlwZSk7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRUcnVuY2F0aW5nRGl2aWRlKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpID0+CiAgICAgIGNvbnN0YW50X3N5c3RlbS50cnVuY2F0aW5nRGl2aWRlOwogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5UUlVOQ0FUSU5HX0RJVklERV9UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMob3RoZXIpID0+IG90aGVyIGlzIEhUcnVuY2F0aW5nRGl2aWRlOwogIEBvdmVycmlkZQogIGJvb2wgZGF0YUVxdWFscyhISW5zdHJ1Y3Rpb24gb3RoZXIpID0+IHRydWU7Cn0KCmNsYXNzIEhSZW1haW5kZXIgZXh0ZW5kcyBIQmluYXJ5QXJpdGhtZXRpYyB7CiAgSFJlbWFpbmRlcihISW5zdHJ1Y3Rpb24gbGVmdCwgSEluc3RydWN0aW9uIHJpZ2h0LCBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKGxlZnQsIHJpZ2h0LCBzZWxlY3RvciwgdHlwZSk7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRSZW1haW5kZXIodGhpcyk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLnJlbWFpbmRlcjsKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uUkVNQUlOREVSX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhvdGhlcikgPT4gb3RoZXIgaXMgSFJlbWFpbmRlcjsKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiB0cnVlOwp9CgovLy8gQW4gW0hTd2l0Y2hdIGluc3RydWN0aW9uIGhhcyBvbmUgaW5wdXQgZm9yIHRoZSBpbmNvbWluZwovLy8gdmFsdWUsIGFuZCBvbmUgaW5wdXQgcGVyIGNvbnN0YW50IHRoYXQgaXQgY2FuIHN3aXRjaCBvbi4KLy8vIEl0cyBibG9jayBoYXMgb25lIHN1Y2Nlc3NvciBwZXIgY29uc3RhbnQsIGFuZCBvbmUgZm9yIHRoZSBkZWZhdWx0LgpjbGFzcyBIU3dpdGNoIGV4dGVuZHMgSENvbnRyb2xGbG93IHsKICBIU3dpdGNoKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluLCBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzKQogICAgICA6IHN1cGVyKGRvbWFpbiwgaW5wdXRzKTsKCiAgSENvbnN0YW50IGNvbnN0YW50KGludCBpbmRleCkgPT4gaW5wdXRzW2luZGV4ICsgMV07CiAgSEluc3RydWN0aW9uIGdldCBleHByZXNzaW9uID0+IGlucHV0c1swXTsKCiAgLy8vIFByb3ZpZGVzIHRoZSB0YXJnZXQgdG8ganVtcCB0byBpZiBub25lIG9mIHRoZSBjb25zdGFudHMgbWF0Y2gKICAvLy8gdGhlIGV4cHJlc3Npb24uIElmIHRoZSBzd2l0Y2ggaGFkIG5vIGRlZmF1bHQgY2FzZSwgdGhpcyBpcyB0aGUKICAvLy8gZm9sbG93aW5nIGpvaW4tYmxvY2suCiAgSEJhc2ljQmxvY2sgZ2V0IGRlZmF1bHRUYXJnZXQgPT4gYmxvY2suc3VjY2Vzc29ycy5sYXN0OwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFN3aXRjaCh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIkhTd2l0Y2ggY2FzZXMgPSAkaW5wdXRzIjsKfQoKYWJzdHJhY3QgY2xhc3MgSEJpbmFyeUJpdE9wIGV4dGVuZHMgSEludm9rZUJpbmFyeSB7CiAgSEJpbmFyeUJpdE9wKEhJbnN0cnVjdGlvbiBsZWZ0LCBISW5zdHJ1Y3Rpb24gcmlnaHQsIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBBYnN0cmFjdFZhbHVlIHR5cGUpCiAgICAgIDogc3VwZXIobGVmdCwgcmlnaHQsIHNlbGVjdG9yLCB0eXBlKTsKfQoKY2xhc3MgSFNoaWZ0TGVmdCBleHRlbmRzIEhCaW5hcnlCaXRPcCB7CiAgSFNoaWZ0TGVmdChISW5zdHJ1Y3Rpb24gbGVmdCwgSEluc3RydWN0aW9uIHJpZ2h0LCBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKGxlZnQsIHJpZ2h0LCBzZWxlY3RvciwgdHlwZSk7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRTaGlmdExlZnQodGhpcyk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLnNoaWZ0TGVmdDsKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uU0hJRlRfTEVGVF9UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMob3RoZXIpID0+IG90aGVyIGlzIEhTaGlmdExlZnQ7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gdHJ1ZTsKfQoKY2xhc3MgSFNoaWZ0UmlnaHQgZXh0ZW5kcyBIQmluYXJ5Qml0T3AgewogIEhTaGlmdFJpZ2h0KEhJbnN0cnVjdGlvbiBsZWZ0LCBISW5zdHJ1Y3Rpb24gcmlnaHQsIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBBYnN0cmFjdFZhbHVlIHR5cGUpCiAgICAgIDogc3VwZXIobGVmdCwgcmlnaHQsIHNlbGVjdG9yLCB0eXBlKTsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFNoaWZ0UmlnaHQodGhpcyk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLnNoaWZ0UmlnaHQ7CiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLlNISUZUX1JJR0hUX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhvdGhlcikgPT4gb3RoZXIgaXMgSFNoaWZ0UmlnaHQ7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gdHJ1ZTsKfQoKY2xhc3MgSEJpdE9yIGV4dGVuZHMgSEJpbmFyeUJpdE9wIHsKICBIQml0T3IoSEluc3RydWN0aW9uIGxlZnQsIEhJbnN0cnVjdGlvbiByaWdodCwgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcihsZWZ0LCByaWdodCwgc2VsZWN0b3IsIHR5cGUpOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0Qml0T3IodGhpcyk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLmJpdE9yOwogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5CSVRfT1JfVFlQRUNPREU7CiAgQG92ZXJyaWRlCiAgYm9vbCB0eXBlRXF1YWxzKG90aGVyKSA9PiBvdGhlciBpcyBIQml0T3I7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gdHJ1ZTsKfQoKY2xhc3MgSEJpdEFuZCBleHRlbmRzIEhCaW5hcnlCaXRPcCB7CiAgSEJpdEFuZChISW5zdHJ1Y3Rpb24gbGVmdCwgSEluc3RydWN0aW9uIHJpZ2h0LCBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKGxlZnQsIHJpZ2h0LCBzZWxlY3RvciwgdHlwZSk7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRCaXRBbmQodGhpcyk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLmJpdEFuZDsKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uQklUX0FORF9UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMob3RoZXIpID0+IG90aGVyIGlzIEhCaXRBbmQ7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gdHJ1ZTsKfQoKY2xhc3MgSEJpdFhvciBleHRlbmRzIEhCaW5hcnlCaXRPcCB7CiAgSEJpdFhvcihISW5zdHJ1Y3Rpb24gbGVmdCwgSEluc3RydWN0aW9uIHJpZ2h0LCBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKGxlZnQsIHJpZ2h0LCBzZWxlY3RvciwgdHlwZSk7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRCaXRYb3IodGhpcyk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLmJpdFhvcjsKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uQklUX1hPUl9UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMob3RoZXIpID0+IG90aGVyIGlzIEhCaXRYb3I7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gdHJ1ZTsKfQoKYWJzdHJhY3QgY2xhc3MgSEludm9rZVVuYXJ5IGV4dGVuZHMgSEluc3RydWN0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTZWxlY3RvciBzZWxlY3RvcjsKICBISW52b2tlVW5hcnkoSEluc3RydWN0aW9uIGlucHV0LCB0aGlzLnNlbGVjdG9yLCB0eXBlKQogICAgICA6IHN1cGVyKDxISW5zdHJ1Y3Rpb24+W2lucHV0XSwgdHlwZSkgewogICAgc2lkZUVmZmVjdHMuY2xlYXJBbGxTaWRlRWZmZWN0cygpOwogICAgc2lkZUVmZmVjdHMuY2xlYXJBbGxEZXBlbmRlbmNpZXMoKTsKICAgIHNldFVzZUd2bigpOwogIH0KCiAgSEluc3RydWN0aW9uIGdldCBvcGVyYW5kID0+IGlucHV0c1swXTsKCiAgY29uc3RhbnRfc3lzdGVtLlVuYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpOwp9CgpjbGFzcyBITmVnYXRlIGV4dGVuZHMgSEludm9rZVVuYXJ5IHsKICBITmVnYXRlKEhJbnN0cnVjdGlvbiBpbnB1dCwgU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcihpbnB1dCwgc2VsZWN0b3IsIHR5cGUpOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0TmVnYXRlKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uVW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLm5lZ2F0ZTsKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uTkVHQVRFX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhvdGhlcikgPT4gb3RoZXIgaXMgSE5lZ2F0ZTsKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiB0cnVlOwp9CgpjbGFzcyBIQWJzIGV4dGVuZHMgSEludm9rZVVuYXJ5IHsKICBIQWJzKEhJbnN0cnVjdGlvbiBpbnB1dCwgU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcihpbnB1dCwgc2VsZWN0b3IsIHR5cGUpOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0QWJzKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uVW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLmFiczsKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uQUJTX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhvdGhlcikgPT4gb3RoZXIgaXMgSEFiczsKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiB0cnVlOwp9CgpjbGFzcyBIQml0Tm90IGV4dGVuZHMgSEludm9rZVVuYXJ5IHsKICBIQml0Tm90KEhJbnN0cnVjdGlvbiBpbnB1dCwgU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcihpbnB1dCwgc2VsZWN0b3IsIHR5cGUpOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0Qml0Tm90KHRoaXMpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uVW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLmJpdE5vdDsKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uQklUX05PVF9UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMob3RoZXIpID0+IG90aGVyIGlzIEhCaXROb3Q7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gdHJ1ZTsKfQoKY2xhc3MgSEV4aXQgZXh0ZW5kcyBIQ29udHJvbEZsb3cgewogIEhFeGl0KEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA6IHN1cGVyKGRvbWFpbiwgY29uc3QgPEhJbnN0cnVjdGlvbj5bXSk7CiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAnZXhpdCc7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRFeGl0KHRoaXMpOwp9CgpjbGFzcyBIR290byBleHRlbmRzIEhDb250cm9sRmxvdyB7CiAgSEdvdG8oQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pIDogc3VwZXIoZG9tYWluLCBjb25zdCA8SEluc3RydWN0aW9uPltdKTsKICBAb3ZlcnJpZGUKICB0b1N0cmluZygpID0+ICdnb3RvJzsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdEdvdG8odGhpcyk7Cn0KCmFic3RyYWN0IGNsYXNzIEhKdW1wIGV4dGVuZHMgSENvbnRyb2xGbG93IHsKICBmaW5hbCBKdW1wVGFyZ2V0IHRhcmdldDsKICBmaW5hbCBMYWJlbERlZmluaXRpb24gbGFiZWw7CiAgSEp1bXAoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4sIHRoaXMudGFyZ2V0LAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikKICAgICAgOiBsYWJlbCA9IG51bGwsCiAgICAgICAgc3VwZXIoZG9tYWluLCBjb25zdCA8SEluc3RydWN0aW9uPltdKSB7CiAgICB0aGlzLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgfQogIEhKdW1wLnRvTGFiZWwoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4sIExhYmVsRGVmaW5pdGlvbiBsYWJlbCwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pCiAgICAgIDogbGFiZWwgPSBsYWJlbCwKICAgICAgICB0YXJnZXQgPSBsYWJlbC50YXJnZXQsCiAgICAgICAgc3VwZXIoZG9tYWluLCBjb25zdCA8SEluc3RydWN0aW9uPltdKSB7CiAgICB0aGlzLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgfQp9CgpjbGFzcyBIQnJlYWsgZXh0ZW5kcyBISnVtcCB7CiAgLy8vIFNpZ25hbHMgdGhhdCB0aGlzIGlzIGEgc3BlY2lhbCBicmVhayBpbnN0cnVjdGlvbiBmb3IgdGhlIHN5bnRoZXRpYyBsb29wCiAgLy8vIGdlbmVyYXRlZCBmb3IgYSBzd2l0Y2ggc3RhdGVtZW50IHdpdGggY29udGludWUgc3RhdGVtZW50cy4gU2VlCiAgLy8vIFtTc2FGcm9tQXN0TWl4aW4uYnVpbGRDb21wbGV4U3dpdGNoU3RhdGVtZW50XSBmb3IgZGV0YWlsLgogIGZpbmFsIGJvb2wgYnJlYWtTd2l0Y2hDb250aW51ZUxvb3A7CgogIEhCcmVhayhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbiwgSnVtcFRhcmdldCB0YXJnZXQsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICB7Ym9vbCB0aGlzLmJyZWFrU3dpdGNoQ29udGludWVMb29wOiBmYWxzZX0pCiAgICAgIDogc3VwZXIoZG9tYWluLCB0YXJnZXQsIHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgSEJyZWFrLnRvTGFiZWwoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4sIExhYmVsRGVmaW5pdGlvbiBsYWJlbCwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pCiAgICAgIDogYnJlYWtTd2l0Y2hDb250aW51ZUxvb3AgPSBmYWxzZSwKICAgICAgICBzdXBlci50b0xhYmVsKGRvbWFpbiwgbGFiZWwsIHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gKGxhYmVsICE9IG51bGwpID8gJ2JyZWFrICR7bGFiZWwubGFiZWxOYW1lfScgOiAnYnJlYWsnOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdEJyZWFrKHRoaXMpOwp9CgpjbGFzcyBIQ29udGludWUgZXh0ZW5kcyBISnVtcCB7CiAgSENvbnRpbnVlKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluLCBKdW1wVGFyZ2V0IHRhcmdldCwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pCiAgICAgIDogc3VwZXIoZG9tYWluLCB0YXJnZXQsIHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgSENvbnRpbnVlLnRvTGFiZWwoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4sIExhYmVsRGVmaW5pdGlvbiBsYWJlbCwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pCiAgICAgIDogc3VwZXIudG9MYWJlbChkb21haW4sIGxhYmVsLCBzb3VyY2VJbmZvcm1hdGlvbik7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+CiAgICAgIChsYWJlbCAhPSBudWxsKSA/ICdjb250aW51ZSAke2xhYmVsLmxhYmVsTmFtZX0nIDogJ2NvbnRpbnVlJzsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRDb250aW51ZSh0aGlzKTsKfQoKY2xhc3MgSFRyeSBleHRlbmRzIEhDb250cm9sRmxvdyB7CiAgSExvY2FsVmFsdWUgZXhjZXB0aW9uOwogIEhCYXNpY0Jsb2NrIGNhdGNoQmxvY2s7CiAgSEJhc2ljQmxvY2sgZmluYWxseUJsb2NrOwogIEhUcnkoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pIDogc3VwZXIoZG9tYWluLCBjb25zdCA8SEluc3RydWN0aW9uPltdKTsKICBAb3ZlcnJpZGUKICB0b1N0cmluZygpID0+ICd0cnknOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0VHJ5KHRoaXMpOwogIEhCYXNpY0Jsb2NrIGdldCBqb2luQmxvY2sgPT4gdGhpcy5ibG9jay5zdWNjZXNzb3JzLmxhc3Q7Cn0KCi8vIEFuIFtIRXhpdFRyeV0gY29udHJvbCBmbG93IG5vZGUgaXMgdXNlZCB3aGVuIHRoZSBib2R5IG9mIGEgdHJ5IG9yCi8vIHRoZSBib2R5IG9mIGEgY2F0Y2ggY29udGFpbnMgYSByZXR1cm4sIGJyZWFrIG9yIGNvbnRpbnVlLiBUbyBidWlsZAovLyB0aGUgY29udHJvbCBmbG93IGdyYXBoLCB3ZSBleHBsaWNpdGx5IG1hcmsgdGhlIGJvZHkgdGhhdAovLyBsZWFkcyB0byBvbmUgb2YgdGhpcyBpbnN0cnVjdGlvbiBhIHByZWRlY2Vzc29yIG9mIGNhdGNoIGFuZAovLyBmaW5hbGx5LgpjbGFzcyBIRXhpdFRyeSBleHRlbmRzIEhDb250cm9sRmxvdyB7CiAgSEV4aXRUcnkoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pIDogc3VwZXIoZG9tYWluLCBjb25zdCA8SEluc3RydWN0aW9uPltdKTsKICBAb3ZlcnJpZGUKICB0b1N0cmluZygpID0+ICdleGl0IHRyeSc7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRFeGl0VHJ5KHRoaXMpOwogIEhCYXNpY0Jsb2NrIGdldCBib2R5VHJ5U3VjY2Vzc29yID0+IGJsb2NrLnN1Y2Nlc3NvcnNbMF07Cn0KCmNsYXNzIEhJZiBleHRlbmRzIEhDb25kaXRpb25hbEJyYW5jaCB7CiAgSEJsb2NrRmxvdyBibG9ja0luZm9ybWF0aW9uID0gbnVsbDsKICBISWYoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4sIEhJbnN0cnVjdGlvbiBjb25kaXRpb24pCiAgICAgIDogc3VwZXIoZG9tYWluLCA8SEluc3RydWN0aW9uPltjb25kaXRpb25dKTsKICBAb3ZlcnJpZGUKICB0b1N0cmluZygpID0+ICdpZic7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRJZih0aGlzKTsKCiAgSEJhc2ljQmxvY2sgZ2V0IHRoZW5CbG9jayB7CiAgICBhc3NlcnQoaWRlbnRpY2FsKGJsb2NrLmRvbWluYXRlZEJsb2Nrc1swXSwgYmxvY2suc3VjY2Vzc29yc1swXSkpOwogICAgcmV0dXJuIGJsb2NrLnN1Y2Nlc3NvcnNbMF07CiAgfQoKICBIQmFzaWNCbG9jayBnZXQgZWxzZUJsb2NrIHsKICAgIGFzc2VydChpZGVudGljYWwoYmxvY2suZG9taW5hdGVkQmxvY2tzWzFdLCBibG9jay5zdWNjZXNzb3JzWzFdKSk7CiAgICByZXR1cm4gYmxvY2suc3VjY2Vzc29yc1sxXTsKICB9CgogIEhCYXNpY0Jsb2NrIGdldCBqb2luQmxvY2sgPT4gYmxvY2tJbmZvcm1hdGlvbi5jb250aW51YXRpb247Cn0KCmNsYXNzIEhMb29wQnJhbmNoIGV4dGVuZHMgSENvbmRpdGlvbmFsQnJhbmNoIHsKICBzdGF0aWMgY29uc3QgaW50IENPTkRJVElPTl9GSVJTVF9MT09QID0gMDsKICBzdGF0aWMgY29uc3QgaW50IERPX1dISUxFX0xPT1AgPSAxOwoKICBmaW5hbCBpbnQga2luZDsKICBITG9vcEJyYW5jaChBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbiwgSEluc3RydWN0aW9uIGNvbmRpdGlvbiwKICAgICAgW3RoaXMua2luZCA9IENPTkRJVElPTl9GSVJTVF9MT09QXSkKICAgICAgOiBzdXBlcihkb21haW4sIDxISW5zdHJ1Y3Rpb24+W2NvbmRpdGlvbl0pOwogIEBvdmVycmlkZQogIHRvU3RyaW5nKCkgPT4gJ2xvb3AtYnJhbmNoJzsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdExvb3BCcmFuY2godGhpcyk7Cn0KCmNsYXNzIEhDb25zdGFudCBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgZmluYWwgQ29uc3RhbnRWYWx1ZSBjb25zdGFudDsKICBIQ29uc3RhbnQuaW50ZXJuYWwodGhpcy5jb25zdGFudCwgQWJzdHJhY3RWYWx1ZSBjb25zdGFudFR5cGUpCiAgICAgIDogc3VwZXIoPEhJbnN0cnVjdGlvbj5bXSwgY29uc3RhbnRUeXBlKTsKCiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAnbGl0ZXJhbDogJHtjb25zdGFudC50b1N0cnVjdHVyZWRUZXh0KCl9JzsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdENvbnN0YW50KHRoaXMpOwoKICBAb3ZlcnJpZGUKICBib29sIGlzQ29uc3RhbnQoKSA9PiB0cnVlOwogIEBvdmVycmlkZQogIGJvb2wgaXNDb25zdGFudEJvb2xlYW4oKSA9PiBjb25zdGFudC5pc0Jvb2w7CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvbnN0YW50TnVsbCgpID0+IGNvbnN0YW50LmlzTnVsbDsKICBAb3ZlcnJpZGUKICBib29sIGlzQ29uc3RhbnROdW1iZXIoKSA9PiBjb25zdGFudC5pc051bTsKICBAb3ZlcnJpZGUKICBib29sIGlzQ29uc3RhbnRJbnRlZ2VyKCkgPT4gY29uc3RhbnQuaXNJbnQ7CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvbnN0YW50U3RyaW5nKCkgPT4gY29uc3RhbnQuaXNTdHJpbmc7CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvbnN0YW50TGlzdCgpID0+IGNvbnN0YW50LmlzTGlzdDsKICBAb3ZlcnJpZGUKICBib29sIGlzQ29uc3RhbnRNYXAoKSA9PiBjb25zdGFudC5pc01hcDsKICBAb3ZlcnJpZGUKICBib29sIGlzQ29uc3RhbnRGYWxzZSgpID0+IGNvbnN0YW50LmlzRmFsc2U7CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvbnN0YW50VHJ1ZSgpID0+IGNvbnN0YW50LmlzVHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0ludGVyY2VwdG9yKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgPT4gY29uc3RhbnQuaXNJbnRlcmNlcHRvcjsKCiAgLy8gTWF5YmUgYXZvaWQgdGhpcyBpZiB0aGUgbGl0ZXJhbCBpcyBiaWc/CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvZGVNb3Rpb25JbnZhcmlhbnQoKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBzZXQgaW5zdHJ1Y3Rpb25UeXBlKHR5cGUpIHsKICAgIC8vIE9ubHkgbGlzdHMgY2FuIGJlIHNwZWNpYWxpemVkLiBUaGUgU1NBIGJ1aWxkZXIgdXNlcyB0aGUKICAgIC8vIGluZmVycmVyIGZvciBmaW5kaW5nIHRoZSB0eXBlIG9mIGEgY29uc3RhbnQgbGlzdC4gV2Ugc2hvdWxkCiAgICAvLyBoYXZlIHRoZSBjb25zdGFudCBrbm93IGl0cyB0eXBlIGluc3RlYWQuCiAgICBpZiAoIWlzQ29uc3RhbnRMaXN0KCkpIHJldHVybjsKICAgIHN1cGVyLmluc3RydWN0aW9uVHlwZSA9IHR5cGU7CiAgfQp9CgpjbGFzcyBITm90IGV4dGVuZHMgSEluc3RydWN0aW9uIHsKICBITm90KEhJbnN0cnVjdGlvbiB2YWx1ZSwgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKDxISW5zdHJ1Y3Rpb24+W3ZhbHVlXSwgdHlwZSkgewogICAgc2V0VXNlR3ZuKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdE5vdCh0aGlzKTsKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uTk9UX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhvdGhlcikgPT4gb3RoZXIgaXMgSE5vdDsKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiB0cnVlOwp9CgovLy8gQW4gW0hMb2NhbFZhbHVlXSByZXByZXNlbnRzIGEgbG9jYWwuIFVubGlrZSBbSFBhcmFtZXRlclZhbHVlXXMgaXRzCi8vLyBmaXJzdCB1c2UgbXVzdCBiZSBpbiBhbiBITG9jYWxTZXQuIFRoYXQgaXMsIFtIUGFyYW1ldGVyVmFsdWVdcyBoYXZlIGEKLy8vIHZhbHVlIGZyb20gdGhlIHN0YXJ0LCB3aGVyZWFzIFtITG9jYWxWYWx1ZV1zIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgZmlyc3QuCmNsYXNzIEhMb2NhbFZhbHVlIGV4dGVuZHMgSEluc3RydWN0aW9uIHsKICBITG9jYWxWYWx1ZShFbnRpdHkgdmFyaWFibGUsIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcig8SEluc3RydWN0aW9uPltdLCB0eXBlKSB7CiAgICBzb3VyY2VFbGVtZW50ID0gdmFyaWFibGU7CiAgfQoKICBAb3ZlcnJpZGUKICB0b1N0cmluZygpID0+ICdsb2NhbCAke3NvdXJjZUVsZW1lbnQubmFtZX0nOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0TG9jYWxWYWx1ZSh0aGlzKTsKfQoKY2xhc3MgSFBhcmFtZXRlclZhbHVlIGV4dGVuZHMgSExvY2FsVmFsdWUgewogIEhQYXJhbWV0ZXJWYWx1ZShFbnRpdHkgdmFyaWFibGUsIEFic3RyYWN0VmFsdWUgdHlwZSkgOiBzdXBlcih2YXJpYWJsZSwgdHlwZSk7CgogIC8vIFtIUGFyYW1ldGVyVmFsdWVdcyBhcmUgZWl0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyIChpbiBmdWxseSBTU0EKICAvLyBjb252ZXJ0ZWQgY29kZSksIG9yIHRoZSBtdXRhYmxlIHZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIHZhbHVlIChpbgogIC8vIGluY29tcGxldGVseSBTU0EgY29udmVydGVkIGNvZGUsIGUuZy4gbWV0aG9kcyBjb250YWluaW5nIGV4Y2VwdGlvbnMpLgogIGJvb2wgdXNlZEFzVmFyaWFibGUoKSB7CiAgICBmb3IgKEhJbnN0cnVjdGlvbiB1c2VyIGluIHVzZWRCeSkgewogICAgICBpZiAodXNlciBpcyBITG9jYWxHZXQpIHJldHVybiB0cnVlOwogICAgICBpZiAodXNlciBpcyBITG9jYWxTZXQgJiYgdXNlci5sb2NhbCA9PSB0aGlzKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIHRvU3RyaW5nKCkgPT4gJ3BhcmFtZXRlciAke3NvdXJjZUVsZW1lbnQubmFtZX0nOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0UGFyYW1ldGVyVmFsdWUodGhpcyk7Cn0KCmNsYXNzIEhUaGlzIGV4dGVuZHMgSFBhcmFtZXRlclZhbHVlIHsKICBIVGhpcyhUaGlzTG9jYWwgZWxlbWVudCwgQWJzdHJhY3RWYWx1ZSB0eXBlKSA6IHN1cGVyKGVsZW1lbnQsIHR5cGUpOwoKICBAb3ZlcnJpZGUKICBUaGlzTG9jYWwgZ2V0IHNvdXJjZUVsZW1lbnQgPT4gc3VwZXIuc291cmNlRWxlbWVudDsKICBAb3ZlcnJpZGUKICB2b2lkIHNldCBzb3VyY2VFbGVtZW50KGNvdmFyaWFudCBUaGlzTG9jYWwgbG9jYWwpIHsKICAgIHN1cGVyLnNvdXJjZUVsZW1lbnQgPSBsb2NhbDsKICB9CgogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0VGhpcyh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvZGVNb3Rpb25JbnZhcmlhbnQoKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGlzSW50ZXJjZXB0b3IoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gY2xvc2VkV29ybGQuaW50ZXJjZXB0b3JEYXRhCiAgICAgICAgLmlzSW50ZXJjZXB0ZWRDbGFzcyhzb3VyY2VFbGVtZW50LmVuY2xvc2luZ0NsYXNzKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICd0aGlzJzsKfQoKY2xhc3MgSFBoaSBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgc3RhdGljIGNvbnN0IElTX05PVF9MT0dJQ0FMX09QRVJBVE9SID0gMDsKICBzdGF0aWMgY29uc3QgSVNfQU5EID0gMTsKICBzdGF0aWMgY29uc3QgSVNfT1IgPSAyOwoKICBpbnQgbG9naWNhbE9wZXJhdG9yVHlwZSA9IElTX05PVF9MT0dJQ0FMX09QRVJBVE9SOwoKICAvLyBUaGUgb3JkZXIgb2YgdGhlIFtpbnB1dHNdIG11c3QgY29ycmVzcG9uZCB0byB0aGUgb3JkZXIgb2YgdGhlCiAgLy8gcHJlZGVjZXNzb3ItZWRnZXMuIFRoYXQgaXMgaWYgYW4gaW5wdXQgY29tZXMgZnJvbSB0aGUgZmlyc3QgcHJlZGVjZXNzb3IKICAvLyBvZiB0aGUgc3Vycm91bmRpbmcgYmxvY2ssIHRoZW4gdGhlIGlucHV0IG11c3QgYmUgdGhlIGZpcnN0IGluIHRoZSBbSFBoaV0uCiAgSFBoaShMb2NhbCB2YXJpYWJsZSwgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cywgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKGlucHV0cywgdHlwZSkgewogICAgc291cmNlRWxlbWVudCA9IHZhcmlhYmxlOwogIH0KICBIUGhpLm5vSW5wdXRzKExvY2FsIHZhcmlhYmxlLCBBYnN0cmFjdFZhbHVlIHR5cGUpCiAgICAgIDogdGhpcyh2YXJpYWJsZSwgPEhJbnN0cnVjdGlvbj5bXSwgdHlwZSk7CiAgSFBoaS5zaW5nbGVJbnB1dChMb2NhbCB2YXJpYWJsZSwgSEluc3RydWN0aW9uIGlucHV0LCBBYnN0cmFjdFZhbHVlIHR5cGUpCiAgICAgIDogdGhpcyh2YXJpYWJsZSwgPEhJbnN0cnVjdGlvbj5baW5wdXRdLCB0eXBlKTsKICBIUGhpLm1hbnlJbnB1dHMoTG9jYWwgdmFyaWFibGUsIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMsIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiB0aGlzKHZhcmlhYmxlLCBpbnB1dHMsIHR5cGUpOwoKICB2b2lkIGFkZElucHV0KEhJbnN0cnVjdGlvbiBpbnB1dCkgewogICAgYXNzZXJ0KGlzSW5CYXNpY0Jsb2NrKCkpOwogICAgaW5wdXRzLmFkZChpbnB1dCk7CiAgICBhc3NlcnQoaW5wdXRzLmxlbmd0aCA8PSBibG9jay5wcmVkZWNlc3NvcnMubGVuZ3RoKTsKICAgIGlucHV0LnVzZWRCeS5hZGQodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB0b1N0cmluZygpID0+ICdwaGkgJGlkJzsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFBoaSh0aGlzKTsKfQoKYWJzdHJhY3QgY2xhc3MgSFJlbGF0aW9uYWwgZXh0ZW5kcyBISW52b2tlQmluYXJ5IHsKICBib29sIHVzZXNCb29saWZpZWRJbnRlcmNlcHRvciA9IGZhbHNlOwogIEhSZWxhdGlvbmFsKGxlZnQsIHJpZ2h0LCBzZWxlY3RvciwgdHlwZSkgOiBzdXBlcihsZWZ0LCByaWdodCwgc2VsZWN0b3IsIHR5cGUpOwp9CgpjbGFzcyBISWRlbnRpdHkgZXh0ZW5kcyBIUmVsYXRpb25hbCB7CiAgLy8gQ2FjaGVkIGNvZGVnZW4gZGVjaXNpb24uCiAgU3RyaW5nIHNpbmdsZUNvbXBhcmlzb25PcDsgLy8gbnVsbCwgJz09PScsICc9PScKCiAgSElkZW50aXR5KGxlZnQsIHJpZ2h0LCBzZWxlY3RvciwgdHlwZSkgOiBzdXBlcihsZWZ0LCByaWdodCwgc2VsZWN0b3IsIHR5cGUpOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0SWRlbnRpdHkodGhpcyk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLmlkZW50aXR5OwogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5JREVOVElUWV9UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMob3RoZXIpID0+IG90aGVyIGlzIEhJZGVudGl0eTsKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiB0cnVlOwp9CgpjbGFzcyBIR3JlYXRlciBleHRlbmRzIEhSZWxhdGlvbmFsIHsKICBIR3JlYXRlcihsZWZ0LCByaWdodCwgc2VsZWN0b3IsIHR5cGUpIDogc3VwZXIobGVmdCwgcmlnaHQsIHNlbGVjdG9yLCB0eXBlKTsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdEdyZWF0ZXIodGhpcyk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLmdyZWF0ZXI7CiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLkdSRUFURVJfVFlQRUNPREU7CiAgQG92ZXJyaWRlCiAgYm9vbCB0eXBlRXF1YWxzKG90aGVyKSA9PiBvdGhlciBpcyBIR3JlYXRlcjsKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiB0cnVlOwp9CgpjbGFzcyBIR3JlYXRlckVxdWFsIGV4dGVuZHMgSFJlbGF0aW9uYWwgewogIEhHcmVhdGVyRXF1YWwobGVmdCwgcmlnaHQsIHNlbGVjdG9yLCB0eXBlKQogICAgICA6IHN1cGVyKGxlZnQsIHJpZ2h0LCBzZWxlY3RvciwgdHlwZSk7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRHcmVhdGVyRXF1YWwodGhpcyk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLmdyZWF0ZXJFcXVhbDsKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uR1JFQVRFUl9FUVVBTF9UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMob3RoZXIpID0+IG90aGVyIGlzIEhHcmVhdGVyRXF1YWw7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gdHJ1ZTsKfQoKY2xhc3MgSExlc3MgZXh0ZW5kcyBIUmVsYXRpb25hbCB7CiAgSExlc3MobGVmdCwgcmlnaHQsIHNlbGVjdG9yLCB0eXBlKSA6IHN1cGVyKGxlZnQsIHJpZ2h0LCBzZWxlY3RvciwgdHlwZSk7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRMZXNzKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpID0+IGNvbnN0YW50X3N5c3RlbS5sZXNzOwogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5MRVNTX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhvdGhlcikgPT4gb3RoZXIgaXMgSExlc3M7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gdHJ1ZTsKfQoKY2xhc3MgSExlc3NFcXVhbCBleHRlbmRzIEhSZWxhdGlvbmFsIHsKICBITGVzc0VxdWFsKGxlZnQsIHJpZ2h0LCBzZWxlY3RvciwgdHlwZSkgOiBzdXBlcihsZWZ0LCByaWdodCwgc2VsZWN0b3IsIHR5cGUpOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0TGVzc0VxdWFsKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpID0+IGNvbnN0YW50X3N5c3RlbS5sZXNzRXF1YWw7CiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLkxFU1NfRVFVQUxfVFlQRUNPREU7CiAgQG92ZXJyaWRlCiAgYm9vbCB0eXBlRXF1YWxzKG90aGVyKSA9PiBvdGhlciBpcyBITGVzc0VxdWFsOwogIEBvdmVycmlkZQogIGJvb2wgZGF0YUVxdWFscyhISW5zdHJ1Y3Rpb24gb3RoZXIpID0+IHRydWU7Cn0KCmNsYXNzIEhSZXR1cm4gZXh0ZW5kcyBIQ29udHJvbEZsb3cgewogIEhSZXR1cm4oQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4sIEhJbnN0cnVjdGlvbiB2YWx1ZSwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pCiAgICAgIDogc3VwZXIoZG9tYWluLCA8SEluc3RydWN0aW9uPlt2YWx1ZV0pIHsKICAgIHRoaXMuc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKICB9CiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAncmV0dXJuJzsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFJldHVybih0aGlzKTsKfQoKY2xhc3MgSFRocm93RXhwcmVzc2lvbiBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgSFRocm93RXhwcmVzc2lvbihBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbiwgSEluc3RydWN0aW9uIHZhbHVlLAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikKICAgICAgOiBzdXBlcig8SEluc3RydWN0aW9uPlt2YWx1ZV0sIGRvbWFpbi5lbXB0eVR5cGUpIHsKICAgIHRoaXMuc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKICB9CiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAndGhyb3cgZXhwcmVzc2lvbic7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRUaHJvd0V4cHJlc3Npb24odGhpcyk7CiAgQG92ZXJyaWRlCiAgYm9vbCBjYW5UaHJvdyhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4gdHJ1ZTsKfQoKY2xhc3MgSEF3YWl0IGV4dGVuZHMgSEluc3RydWN0aW9uIHsKICBIQXdhaXQoSEluc3RydWN0aW9uIHZhbHVlLCBBYnN0cmFjdFZhbHVlIHR5cGUpCiAgICAgIDogc3VwZXIoPEhJbnN0cnVjdGlvbj5bdmFsdWVdLCB0eXBlKTsKICBAb3ZlcnJpZGUKICB0b1N0cmluZygpID0+ICdhd2FpdCc7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRBd2FpdCh0aGlzKTsKICAvLyBBbiBhd2FpdCB3aWxsIHRocm93IGlmIGl0cyBhcmd1bWVudCBpcyBub3QgYSByZWFsIGZ1dHVyZS4KICBAb3ZlcnJpZGUKICBib29sIGNhblRocm93KEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PiB0cnVlOwogIEBvdmVycmlkZQogIFNpZGVFZmZlY3RzIHNpZGVFZmZlY3RzID0gbmV3IFNpZGVFZmZlY3RzKCk7Cn0KCmNsYXNzIEhZaWVsZCBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgSFlpZWxkKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluLCBISW5zdHJ1Y3Rpb24gdmFsdWUsIHRoaXMuaGFzU3RhciwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pCiAgICAgIDogc3VwZXIoPEhJbnN0cnVjdGlvbj5bdmFsdWVdLCBkb21haW4uZW1wdHlUeXBlKSB7CiAgICB0aGlzLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgfQogIGJvb2wgaGFzU3RhcjsKICBAb3ZlcnJpZGUKICB0b1N0cmluZygpID0+ICd5aWVsZCc7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRZaWVsZCh0aGlzKTsKICBAb3ZlcnJpZGUKICBib29sIGNhblRocm93KEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBTaWRlRWZmZWN0cyBzaWRlRWZmZWN0cyA9IG5ldyBTaWRlRWZmZWN0cygpOwp9CgpjbGFzcyBIVGhyb3cgZXh0ZW5kcyBIQ29udHJvbEZsb3cgewogIGZpbmFsIGJvb2wgaXNSZXRocm93OwogIEhUaHJvdyhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbiwgSEluc3RydWN0aW9uIHZhbHVlLAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAge3RoaXMuaXNSZXRocm93OiBmYWxzZX0pCiAgICAgIDogc3VwZXIoZG9tYWluLCA8SEluc3RydWN0aW9uPlt2YWx1ZV0pIHsKICAgIHRoaXMuc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKICB9CiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAndGhyb3cnOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0VGhyb3codGhpcyk7Cn0KCmNsYXNzIEhTdGF0aWMgZXh0ZW5kcyBISW5zdHJ1Y3Rpb24gewogIGZpbmFsIE1lbWJlckVudGl0eSBlbGVtZW50OwogIEhTdGF0aWModGhpcy5lbGVtZW50LCBBYnN0cmFjdFZhbHVlIHR5cGUsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKQogICAgICA6IHN1cGVyKDxISW5zdHJ1Y3Rpb24+W10sIHR5cGUpIHsKICAgIGFzc2VydChlbGVtZW50ICE9IG51bGwpOwogICAgc2lkZUVmZmVjdHMuY2xlYXJBbGxTaWRlRWZmZWN0cygpOwogICAgc2lkZUVmZmVjdHMuY2xlYXJBbGxEZXBlbmRlbmNpZXMoKTsKICAgIGlmIChlbGVtZW50LmlzQXNzaWduYWJsZSkgewogICAgICBzaWRlRWZmZWN0cy5zZXREZXBlbmRzT25TdGF0aWNQcm9wZXJ0eVN0b3JlKCk7CiAgICB9CiAgICBzZXRVc2VHdm4oKTsKICAgIHRoaXMuc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKICB9CiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAnc3RhdGljICR7ZWxlbWVudC5uYW1lfSc7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRTdGF0aWModGhpcyk7CgogIEBvdmVycmlkZQogIGludCBndm5IYXNoQ29kZSgpID0+IHN1cGVyLmd2bkhhc2hDb2RlKCkgXiBlbGVtZW50Lmhhc2hDb2RlOwogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5TVEFUSUNfVFlQRUNPREU7CiAgQG92ZXJyaWRlCiAgYm9vbCB0eXBlRXF1YWxzKG90aGVyKSA9PiBvdGhlciBpcyBIU3RhdGljOwogIEBvdmVycmlkZQogIGJvb2wgZGF0YUVxdWFscyhIU3RhdGljIG90aGVyKSA9PiBlbGVtZW50ID09IG90aGVyLmVsZW1lbnQ7CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvZGVNb3Rpb25JbnZhcmlhbnQoKSA9PiAhZWxlbWVudC5pc0Fzc2lnbmFibGU7Cn0KCmNsYXNzIEhJbnRlcmNlcHRvciBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgLy8gVGhpcyBmaWVsZCBzaG91bGQgb3JpZ2luYWxseSBiZSBudWxsIHRvIGFsbG93IEdWTidpbmcgYWxsCiAgLy8gW0hJbnRlcmNlcHRvcl0gb24gdGhlIHNhbWUgaW5wdXQuCiAgU2V0PENsYXNzRW50aXR5PiBpbnRlcmNlcHRlZENsYXNzZXM7CgogIC8vIGlucHV0c1swXSBpcyBpbml0aWFsbHkgdGhlIG9ubHkgaW5wdXQsIHRoZSByZWNlaXZlci4KCiAgLy8gaW5wdXRzWzFdIGlzIGEgY29uc3RhbnQgaW50ZXJjZXB0b3Igd2hlbiB0aGUgaW50ZXJjZXB0b3IgaXMgYSBjb25zdGFudAogIC8vIGV4Y2VwdCBmb3IgYSBgbnVsbGAgcmVjZWl2ZXIuICBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgcmVjZWl2ZXIgY2FuJ3QgYmUKICAvLyBmYWxzeSwgZXhjZXB0IGZvciBgbnVsbGAsIGFsbG93aW5nIHRoZSBnZW5lcmF0aW9uIG9mIGNvZGUgbGlrZQogIC8vCiAgLy8gICAgIChhICYmIEMuSlNBcnJheV9tZXRob2RzKS5nZXQkZmlyc3QoYSkKICAvLwoKICBISW50ZXJjZXB0b3IoSEluc3RydWN0aW9uIHJlY2VpdmVyLCBBYnN0cmFjdFZhbHVlIHR5cGUpCiAgICAgIDogc3VwZXIoPEhJbnN0cnVjdGlvbj5bcmVjZWl2ZXJdLCB0eXBlKSB7CiAgICB0aGlzLnNvdXJjZUluZm9ybWF0aW9uID0gcmVjZWl2ZXIuc291cmNlSW5mb3JtYXRpb247CiAgICBzaWRlRWZmZWN0cy5jbGVhckFsbFNpZGVFZmZlY3RzKCk7CiAgICBzaWRlRWZmZWN0cy5jbGVhckFsbERlcGVuZGVuY2llcygpOwogICAgc2V0VXNlR3ZuKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnaW50ZXJjZXB0b3Igb24gJGludGVyY2VwdGVkQ2xhc3Nlcyc7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRJbnRlcmNlcHRvcih0aGlzKTsKICBISW5zdHJ1Y3Rpb24gZ2V0IHJlY2VpdmVyID0+IGlucHV0c1swXTsKCiAgYm9vbCBnZXQgaXNDb25kaXRpb25hbENvbnN0YW50SW50ZXJjZXB0b3IgPT4gaW5wdXRzLmxlbmd0aCA9PSAyOwogIEhJbnN0cnVjdGlvbiBnZXQgY29uZGl0aW9uYWxDb25zdGFudEludGVyY2VwdG9yID0+IGlucHV0c1sxXTsKICB2b2lkIHNldCBjb25kaXRpb25hbENvbnN0YW50SW50ZXJjZXB0b3IoSENvbnN0YW50IGNvbnN0YW50KSB7CiAgICBhc3NlcnQoIWlzQ29uZGl0aW9uYWxDb25zdGFudEludGVyY2VwdG9yKTsKICAgIGlucHV0cy5hZGQoY29uc3RhbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0ludGVyY2VwdG9yKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLklOVEVSQ0VQVE9SX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhvdGhlcikgPT4gb3RoZXIgaXMgSEludGVyY2VwdG9yOwogIEBvdmVycmlkZQogIGJvb2wgZGF0YUVxdWFscyhISW50ZXJjZXB0b3Igb3RoZXIpIHsKICAgIHJldHVybiBpbnRlcmNlcHRlZENsYXNzZXMgPT0gb3RoZXIuaW50ZXJjZXB0ZWRDbGFzc2VzIHx8CiAgICAgICAgKGludGVyY2VwdGVkQ2xhc3Nlcy5sZW5ndGggPT0gb3RoZXIuaW50ZXJjZXB0ZWRDbGFzc2VzLmxlbmd0aCAmJgogICAgICAgICAgICBpbnRlcmNlcHRlZENsYXNzZXMuY29udGFpbnNBbGwob3RoZXIuaW50ZXJjZXB0ZWRDbGFzc2VzKSk7CiAgfQp9CgovLy8gQSAib25lLXNob3QiIGludGVyY2VwdG9yIGlzIGEgY2FsbCB0byBhIHN5bnRoZXRpemVkIG1ldGhvZCB0aGF0Ci8vLyB3aWxsIGZldGNoIHRoZSBpbnRlcmNlcHRvciBvZiBpdHMgZmlyc3QgcGFyYW1ldGVyLCBhbmQgbWFrZSBhIGNhbGwKLy8vIG9uIGEgZ2l2ZW4gc2VsZWN0b3Igd2l0aCB0aGUgcmVtYWluaW5nIHBhcmFtZXRlcnMuCi8vLwovLy8gSW4gb3JkZXIgdG8gc2hhcmUgdGhlIHNhbWUgb3B0aW1pemF0aW9ucyB3aXRoIHJlZ3VsYXIgaW50ZXJjZXB0b3IKLy8vIGNhbGxzLCB0aGlzIGNsYXNzIGV4dGVuZHMgW0hJbnZva2VEeW5hbWljXSBhbmQgYWxzbyBoYXMgdGhlIG51bGwKLy8vIGNvbnN0YW50IGFzIHRoZSBmaXJzdCBpbnB1dC4KY2xhc3MgSE9uZVNob3RJbnRlcmNlcHRvciBleHRlbmRzIEhJbnZva2VEeW5hbWljIHsKICBAb3ZlcnJpZGUKICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzOwogIFNldDxDbGFzc0VudGl0eT4gaW50ZXJjZXB0ZWRDbGFzc2VzOwoKICBIT25lU2hvdEludGVyY2VwdG9yKAogICAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbiwKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgbWFzaywKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cywKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlLAogICAgICB0aGlzLnR5cGVBcmd1bWVudHMsCiAgICAgIHRoaXMuaW50ZXJjZXB0ZWRDbGFzc2VzKQogICAgICA6IHN1cGVyKHNlbGVjdG9yLCBtYXNrLCBudWxsLCBpbnB1dHMsIHRydWUsIHR5cGUpIHsKICAgIGFzc2VydChpbnB1dHNbMF0gaXMgSENvbnN0YW50KTsKICAgIGFzc2VydChpbnB1dHNbMF0uaW5zdHJ1Y3Rpb25UeXBlID09IGRvbWFpbi5udWxsVHlwZSk7CiAgICBhc3NlcnQoc2VsZWN0b3IuY2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRDb3VudCA9PSB0eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgfQogIEBvdmVycmlkZQogIGJvb2wgaXNDYWxsT25JbnRlcmNlcHRvcihKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpID0+IHRydWU7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdvbmUgc2hvdCBpbnRlcmNlcHRvcjogc2VsZWN0b3I9JHNlbGVjdG9yLCBtYXNrPSRtYXNrJzsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdE9uZVNob3RJbnRlcmNlcHRvcih0aGlzKTsKfQoKLy8vIEFuIFtITGF6eVN0YXRpY10gaXMgYSBzdGF0aWMgdGhhdCBpcyBpbml0aWFsaXplZCBsYXppbHkgYXQgZmlyc3QgcmVhZC4KY2xhc3MgSExhenlTdGF0aWMgZXh0ZW5kcyBISW5zdHJ1Y3Rpb24gewogIGZpbmFsIEZpZWxkRW50aXR5IGVsZW1lbnQ7CgogIEhMYXp5U3RhdGljKAogICAgICB0aGlzLmVsZW1lbnQsIEFic3RyYWN0VmFsdWUgdHlwZSwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pCiAgICAgIDogc3VwZXIoPEhJbnN0cnVjdGlvbj5bXSwgdHlwZSkgewogICAgLy8gVE9ETyg0OTMxKTogVGhlIGZpcnN0IGFjY2VzcyBoYXMgc2lkZS1lZmZlY3RzLCBidXQgd2UgYWZ0ZXJ3YXJkcyB3ZQogICAgLy8gc2hvdWxkIGJlIGFibGUgdG8gR1ZOLgogICAgc2lkZUVmZmVjdHMuc2V0QWxsU2lkZUVmZmVjdHMoKTsKICAgIHNpZGVFZmZlY3RzLnNldERlcGVuZHNPblNvbWV0aGluZygpOwogICAgdGhpcy5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAnbGF6eSBzdGF0aWMgJHtlbGVtZW50Lm5hbWV9JzsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdExhenlTdGF0aWModGhpcyk7CgogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IDMwOwogIC8vIFRPRE8oNDkzMSk6IGNhbiB3ZSBkbyBiZXR0ZXIgaGVyZT8KICBAb3ZlcnJpZGUKICBib29sIGlzQ29kZU1vdGlvbkludmFyaWFudCgpID0+IGZhbHNlOwogIEBvdmVycmlkZQogIGJvb2wgY2FuVGhyb3coQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+IHRydWU7Cn0KCmNsYXNzIEhTdGF0aWNTdG9yZSBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgTWVtYmVyRW50aXR5IGVsZW1lbnQ7CiAgSFN0YXRpY1N0b3JlKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluLCB0aGlzLmVsZW1lbnQsIEhJbnN0cnVjdGlvbiB2YWx1ZSkKICAgICAgOiBzdXBlcig8SEluc3RydWN0aW9uPlt2YWx1ZV0sIGRvbWFpbi5lbXB0eVR5cGUpIHsKICAgIHNpZGVFZmZlY3RzLmNsZWFyQWxsU2lkZUVmZmVjdHMoKTsKICAgIHNpZGVFZmZlY3RzLmNsZWFyQWxsRGVwZW5kZW5jaWVzKCk7CiAgICBzaWRlRWZmZWN0cy5zZXRDaGFuZ2VzU3RhdGljUHJvcGVydHkoKTsKICB9CiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAnc3RhdGljIHN0b3JlICR7ZWxlbWVudC5uYW1lfSc7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRTdGF0aWNTdG9yZSh0aGlzKTsKCiAgSEluc3RydWN0aW9uIGdldCB2YWx1ZSA9PiBpbnB1dHMuc2luZ2xlOwoKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uU1RBVElDX1NUT1JFX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhvdGhlcikgPT4gb3RoZXIgaXMgSFN0YXRpY1N0b3JlOwogIEBvdmVycmlkZQogIGJvb2wgZGF0YUVxdWFscyhIU3RhdGljU3RvcmUgb3RoZXIpID0+IGVsZW1lbnQgPT0gb3RoZXIuZWxlbWVudDsKICBAb3ZlcnJpZGUKICBib29sIGlzSnNTdGF0ZW1lbnQoKSA9PiB1c2VkQnkuaXNFbXB0eTsKfQoKY2xhc3MgSExpdGVyYWxMaXN0IGV4dGVuZHMgSEluc3RydWN0aW9uIHsKICBITGl0ZXJhbExpc3QoTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cywgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKGlucHV0cywgdHlwZSk7CiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAnbGl0ZXJhbCBsaXN0JzsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdExpdGVyYWxMaXN0KHRoaXMpOwoKICBAb3ZlcnJpZGUKICBib29sIGlzQWxsb2NhdGlvbihBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4gdHJ1ZTsKfQoKLy8vIFRoZSBwcmltaXRpdmUgYXJyYXkgaW5kZXhpbmcgb3BlcmF0aW9uLiBOb3RlIHRoYXQgdGhpcyBpbnN0cnVjdGlvbgovLy8gZG9lcyBub3QgdGhyb3cgYmVjYXVzZSB3ZSBnZW5lcmF0ZSB0aGUgY2hlY2tzIGV4cGxpY2l0bHkuCmNsYXNzIEhJbmRleCBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU2VsZWN0b3Igc2VsZWN0b3I7CiAgSEluZGV4KEhJbnN0cnVjdGlvbiByZWNlaXZlciwgSEluc3RydWN0aW9uIGluZGV4LCB0aGlzLnNlbGVjdG9yLAogICAgICBBYnN0cmFjdFZhbHVlIHR5cGUpCiAgICAgIDogc3VwZXIoPEhJbnN0cnVjdGlvbj5bcmVjZWl2ZXIsIGluZGV4XSwgdHlwZSkgewogICAgc2lkZUVmZmVjdHMuY2xlYXJBbGxTaWRlRWZmZWN0cygpOwogICAgc2lkZUVmZmVjdHMuY2xlYXJBbGxEZXBlbmRlbmNpZXMoKTsKICAgIHNpZGVFZmZlY3RzLnNldERlcGVuZHNPbkluZGV4U3RvcmUoKTsKICAgIHNldFVzZUd2bigpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ2luZGV4IG9wZXJhdG9yJzsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdEluZGV4KHRoaXMpOwoKICBISW5zdHJ1Y3Rpb24gZ2V0IHJlY2VpdmVyID0+IGlucHV0c1swXTsKICBISW5zdHJ1Y3Rpb24gZ2V0IGluZGV4ID0+IGlucHV0c1sxXTsKCiAgLy8gSW1wbGljaXQgZGVwZW5kZW5jeSBvbiBIQm91bmRzQ2hlY2sgb3IgY29uc3RyYWludHMgb24gaW5kZXguCiAgLy8gVE9ETygyNzI3Mik6IE1ha2UgSEluZGV4IGRlcGVuZGVudCBvbiBib3VuZHMgY2hlY2tpbmcuCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNNb3ZhYmxlID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gZ2V0RGFydFJlY2VpdmVyKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgPT4gcmVjZWl2ZXI7CiAgQG92ZXJyaWRlCiAgYm9vbCBvbmx5VGhyb3dzTlNNKCkgPT4gdHJ1ZTsKICBAb3ZlcnJpZGUKICBib29sIGNhblRocm93KEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PgogICAgICByZWNlaXZlci5pc051bGwoZG9tYWluKS5pc1BvdGVudGlhbGx5VHJ1ZTsKCiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLklOREVYX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhISW5zdHJ1Y3Rpb24gb3RoZXIpID0+IG90aGVyIGlzIEhJbmRleDsKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSEluZGV4IG90aGVyKSA9PiB0cnVlOwp9CgovLy8gVGhlIHByaW1pdGl2ZSBhcnJheSBhc3NpZ25tZW50IG9wZXJhdGlvbi4gTm90ZSB0aGF0IHRoaXMgaW5zdHJ1Y3Rpb24KLy8vIGRvZXMgbm90IHRocm93IGJlY2F1c2Ugd2UgZ2VuZXJhdGUgdGhlIGNoZWNrcyBleHBsaWNpdGx5LgpjbGFzcyBISW5kZXhBc3NpZ24gZXh0ZW5kcyBISW5zdHJ1Y3Rpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFNlbGVjdG9yIHNlbGVjdG9yOwogIEhJbmRleEFzc2lnbihBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbiwgSEluc3RydWN0aW9uIHJlY2VpdmVyLAogICAgICBISW5zdHJ1Y3Rpb24gaW5kZXgsIEhJbnN0cnVjdGlvbiB2YWx1ZSwgdGhpcy5zZWxlY3RvcikKICAgICAgOiBzdXBlcig8SEluc3RydWN0aW9uPltyZWNlaXZlciwgaW5kZXgsIHZhbHVlXSwgZG9tYWluLmVtcHR5VHlwZSkgewogICAgc2lkZUVmZmVjdHMuY2xlYXJBbGxTaWRlRWZmZWN0cygpOwogICAgc2lkZUVmZmVjdHMuY2xlYXJBbGxEZXBlbmRlbmNpZXMoKTsKICAgIHNpZGVFZmZlY3RzLnNldENoYW5nZXNJbmRleCgpOwogIH0KICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnaW5kZXggYXNzaWduIG9wZXJhdG9yJzsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdEluZGV4QXNzaWduKHRoaXMpOwoKICBISW5zdHJ1Y3Rpb24gZ2V0IHJlY2VpdmVyID0+IGlucHV0c1swXTsKICBISW5zdHJ1Y3Rpb24gZ2V0IGluZGV4ID0+IGlucHV0c1sxXTsKICBISW5zdHJ1Y3Rpb24gZ2V0IHZhbHVlID0+IGlucHV0c1syXTsKCiAgLy8gSW1wbGljaXQgZGVwZW5kZW5jeSBvbiBIQm91bmRzQ2hlY2sgb3IgY29uc3RyYWludHMgb24gaW5kZXguCiAgLy8gVE9ETygyNzI3Mik6IE1ha2UgSEluZGV4IGRlcGVuZGVudCBvbiBib3VuZHMgY2hlY2tpbmcuCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNNb3ZhYmxlID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gZ2V0RGFydFJlY2VpdmVyKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgPT4gcmVjZWl2ZXI7CiAgQG92ZXJyaWRlCiAgYm9vbCBvbmx5VGhyb3dzTlNNKCkgPT4gdHJ1ZTsKICBAb3ZlcnJpZGUKICBib29sIGNhblRocm93KEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PgogICAgICByZWNlaXZlci5pc051bGwoZG9tYWluKS5pc1BvdGVudGlhbGx5VHJ1ZTsKfQoKY2xhc3MgSElzIGV4dGVuZHMgSEluc3RydWN0aW9uIHsKICAvLy8gQSBjaGVjayBhZ2FpbnN0IGEgcmF3IHR5cGU6ICdvIGlzIGludCcsICdvIGlzIEEnLgogIHN0YXRpYyBjb25zdCBpbnQgUkFXX0NIRUNLID0gMDsKCiAgLy8vIEEgY2hlY2sgYWdhaW5zdCBhIHR5cGUgd2l0aCB0eXBlIGFyZ3VtZW50czogJ28gaXMgTGlzdDxpbnQ+JywgJ28gaXMgQzxUPicuCiAgc3RhdGljIGNvbnN0IGludCBDT01QT1VORF9DSEVDSyA9IDE7CgogIC8vLyBBIGNoZWNrIGFnYWluc3QgYSBzaW5nbGUgdHlwZSB2YXJpYWJsZTogJ28gaXMgVCcuCiAgc3RhdGljIGNvbnN0IGludCBWQVJJQUJMRV9DSEVDSyA9IDI7CgogIGZpbmFsIERhcnRUeXBlIHR5cGVFeHByZXNzaW9uOwogIGZpbmFsIGludCBraW5kOwogIGZpbmFsIGJvb2wgdXNlSW5zdGFuY2VPZjsKCiAgSElzLmRpcmVjdChEYXJ0VHlwZSB0eXBlRXhwcmVzc2lvbiwgSEluc3RydWN0aW9uIGV4cHJlc3Npb24sCiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZSwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pCiAgICAgIDogdGhpcy5pbnRlcm5hbCgKICAgICAgICAgICAgdHlwZUV4cHJlc3Npb24sIFtleHByZXNzaW9uXSwgUkFXX0NIRUNLLCB0eXBlLCBzb3VyY2VJbmZvcm1hdGlvbik7CgogIC8vIFByZS12ZXJpZmllZCB0aGF0IHRoZSBjaGVjayBjYW4gYmUgZG9uZSB1c2luZyAnaW5zdGFuY2VvZicuCiAgSElzLmluc3RhbmNlT2YoRGFydFR5cGUgdHlwZUV4cHJlc3Npb24sIEhJbnN0cnVjdGlvbiBleHByZXNzaW9uLAogICAgICBBYnN0cmFjdFZhbHVlIHR5cGUsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKQogICAgICA6IHRoaXMuaW50ZXJuYWwoCiAgICAgICAgICAgIHR5cGVFeHByZXNzaW9uLCBbZXhwcmVzc2lvbl0sIFJBV19DSEVDSywgdHlwZSwgc291cmNlSW5mb3JtYXRpb24sCiAgICAgICAgICAgIHVzZUluc3RhbmNlT2Y6IHRydWUpOwoKICBmYWN0b3J5IEhJcy5yYXcoCiAgICAgIERhcnRUeXBlIHR5cGVFeHByZXNzaW9uLAogICAgICBISW5zdHJ1Y3Rpb24gZXhwcmVzc2lvbiwKICAgICAgSEludGVyY2VwdG9yIGludGVyY2VwdG9yLAogICAgICBBYnN0cmFjdFZhbHVlIHR5cGUsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICAvLyBUT0RPKHNpZ211bmQpOiByZS1hZGQgYCYmIHR5cGVFeHByZXNzaW9uLnRyZWF0QXNSYXdgIG9yIHNvbWV0aGluZwogICAgLy8gZXF1aXZhbGVudCAod2hpY2ggc3RhcnRlZCBmYWlsaW5nIG9uY2Ugd2UgYWxsb3dlZCB0eXBlRXhwcmVzc2lvbnMgdGhhdAogICAgLy8gY29udGFpbiB0eXBlIHBhcmFtZXRlcnMgbWF0Y2hpbmcgdGhlIG9yaWdpbmFsIGJvdW5kcyBvZiB0aGUgdHlwZSkuCiAgICBhc3NlcnQoKHR5cGVFeHByZXNzaW9uLmlzRnVuY3Rpb25UeXBlIHx8IHR5cGVFeHByZXNzaW9uLmlzSW50ZXJmYWNlVHlwZSksCiAgICAgICAgIlVuZXhwZWN0ZWQgcmF3IGlzLXRlc3QgdHlwZTogJHR5cGVFeHByZXNzaW9uIik7CiAgICByZXR1cm4gbmV3IEhJcy5pbnRlcm5hbCh0eXBlRXhwcmVzc2lvbiwgW2V4cHJlc3Npb24sIGludGVyY2VwdG9yXSwKICAgICAgICBSQVdfQ0hFQ0ssIHR5cGUsIHNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIEhJcy5jb21wb3VuZCgKICAgICAgRGFydFR5cGUgdHlwZUV4cHJlc3Npb24sCiAgICAgIEhJbnN0cnVjdGlvbiBleHByZXNzaW9uLAogICAgICBISW5zdHJ1Y3Rpb24gY2FsbCwKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlLAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikKICAgICAgOiB0aGlzLmludGVybmFsKHR5cGVFeHByZXNzaW9uLCBbZXhwcmVzc2lvbiwgY2FsbF0sIENPTVBPVU5EX0NIRUNLLCB0eXBlLAogICAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbik7CgogIEhJcy52YXJpYWJsZSgKICAgICAgRGFydFR5cGUgdHlwZUV4cHJlc3Npb24sCiAgICAgIEhJbnN0cnVjdGlvbiBleHByZXNzaW9uLAogICAgICBISW5zdHJ1Y3Rpb24gY2FsbCwKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlLAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikKICAgICAgOiB0aGlzLmludGVybmFsKHR5cGVFeHByZXNzaW9uLCBbZXhwcmVzc2lvbiwgY2FsbF0sIFZBUklBQkxFX0NIRUNLLCB0eXBlLAogICAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbik7CgogIEhJcy5pbnRlcm5hbCh0aGlzLnR5cGVFeHByZXNzaW9uLCBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzLCB0aGlzLmtpbmQsCiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZSwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIHtib29sIHRoaXMudXNlSW5zdGFuY2VPZjogZmFsc2V9KQogICAgICA6IHN1cGVyKGlucHV0cywgdHlwZSkgewogICAgYXNzZXJ0KGtpbmQgPj0gUkFXX0NIRUNLICYmIGtpbmQgPD0gVkFSSUFCTEVfQ0hFQ0spOwogICAgc2V0VXNlR3ZuKCk7CiAgICB0aGlzLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgfQoKICBISW5zdHJ1Y3Rpb24gZ2V0IGV4cHJlc3Npb24gPT4gaW5wdXRzWzBdOwoKICBISW5zdHJ1Y3Rpb24gZ2V0IGludGVyY2VwdG9yIHsKICAgIGFzc2VydChraW5kID09IFJBV19DSEVDSyk7CiAgICByZXR1cm4gaW5wdXRzLmxlbmd0aCA+IDEgPyBpbnB1dHNbMV0gOiBudWxsOwogIH0KCiAgSEluc3RydWN0aW9uIGdldCBjaGVja0NhbGwgewogICAgYXNzZXJ0KGtpbmQgPT0gVkFSSUFCTEVfQ0hFQ0sgfHwga2luZCA9PSBDT01QT1VORF9DSEVDSyk7CiAgICByZXR1cm4gaW5wdXRzWzFdOwogIH0KCiAgYm9vbCBnZXQgaXNSYXdDaGVjayA9PiBraW5kID09IFJBV19DSEVDSzsKICBib29sIGdldCBpc1ZhcmlhYmxlQ2hlY2sgPT4ga2luZCA9PSBWQVJJQUJMRV9DSEVDSzsKICBib29sIGdldCBpc0NvbXBvdW5kQ2hlY2sgPT4ga2luZCA9PSBDT01QT1VORF9DSEVDSzsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRJcyh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAiJGV4cHJlc3Npb24gaXMgJHR5cGVFeHByZXNzaW9uIjsKCiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLklTX1RZUEVDT0RFOwoKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiBvdGhlciBpcyBISXM7CgogIEBvdmVycmlkZQogIGJvb2wgZGF0YUVxdWFscyhISXMgb3RoZXIpIHsKICAgIHJldHVybiB0eXBlRXhwcmVzc2lvbiA9PSBvdGhlci50eXBlRXhwcmVzc2lvbiAmJiBraW5kID09IG90aGVyLmtpbmQ7CiAgfQp9CgovLy8gSElzVmlhSW50ZXJjZXB0b3IgaXMgYSBsYXRlLXN0YWdlIGluc3RydWN0aW9uIGZvciBhIHR5cGUgdGVzdCB0aGF0IGNhbiBiZQovLy8gZG9uZSBlbnRpcmVseSBvbiBhbiBpbnRlcmNlcHRvci4gIEl0IGlzIG5vdCBhIEhDaGVjayBiZWNhdXNlIHRoZSBjaGVja2VkCi8vLyBpbnB1dCBpcyBub3Qgb25lIG9mIHRoZSBpbnB1dHMuCmNsYXNzIEhJc1ZpYUludGVyY2VwdG9yIGV4dGVuZHMgSExhdGVJbnN0cnVjdGlvbiB7CiAgZmluYWwgRGFydFR5cGUgdHlwZUV4cHJlc3Npb247CiAgSElzVmlhSW50ZXJjZXB0b3IoCiAgICAgIHRoaXMudHlwZUV4cHJlc3Npb24sIEhJbnN0cnVjdGlvbiBpbnRlcmNlcHRvciwgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKDxISW5zdHJ1Y3Rpb24+W2ludGVyY2VwdG9yXSwgdHlwZSkgewogICAgc2V0VXNlR3ZuKCk7CiAgfQoKICBISW5zdHJ1Y3Rpb24gZ2V0IGludGVyY2VwdG9yID0+IGlucHV0c1swXTsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRJc1ZpYUludGVyY2VwdG9yKHRoaXMpOwogIEBvdmVycmlkZQogIHRvU3RyaW5nKCkgPT4gIiRpbnRlcmNlcHRvciBpcyAkdHlwZUV4cHJlc3Npb24iOwogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5JU19WSUFfSU5URVJDRVBUT1JfVFlQRUNPREU7CiAgQG92ZXJyaWRlCiAgYm9vbCB0eXBlRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gb3RoZXIgaXMgSElzVmlhSW50ZXJjZXB0b3I7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhJcyBvdGhlcikgewogICAgcmV0dXJuIHR5cGVFeHByZXNzaW9uID09IG90aGVyLnR5cGVFeHByZXNzaW9uOwogIH0KfQoKLy8vIEhMYXRlVmFsdWUgaXMgYSBsYXRlLXN0YWdlIGluc3RydWN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZm9yY2UgYSB2YWx1ZQovLy8gaW50byBhIHRlbXBvcmFyeS4KLy8vCi8vLyBITGF0ZVZhbHVlIGlzIHVzZWZ1bCBmb3IgbmFtaW5nIHZhbHVlcyB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBnZW5lcmF0ZWQgYXQKLy8vIHVzZSBzaXRlLCBmb3IgZXhhbXBsZSwgaWYgJ3RoaXMnIGlzIHVzZWQgbWFueSB0aW1lcywgcmVwbGFjaW5nIHVzZXMgb2YKLy8vICd0aGlzJyB3aXRoIEhMYXRlVmFsaGUoSFRoaXMpIHdpbGwgaGF2ZSB0aGUgZWZmZWN0IG9mIGNvcHlpbmcgJ3RoaXMnIHRvIGEKLy8vIHRlbXBvcmFyeSB3aWxsIHJlZHVjZSB0aGUgc2l6ZSBvZiBtaW5pZmllZCBjb2RlLgpjbGFzcyBITGF0ZVZhbHVlIGV4dGVuZHMgSExhdGVJbnN0cnVjdGlvbiB7CiAgSExhdGVWYWx1ZShISW5zdHJ1Y3Rpb24gdGFyZ2V0KSA6IHN1cGVyKFt0YXJnZXRdLCB0YXJnZXQuaW5zdHJ1Y3Rpb25UeXBlKTsKCiAgSEluc3RydWN0aW9uIGdldCB0YXJnZXQgPT4gaW5wdXRzLnNpbmdsZTsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRMYXRlVmFsdWUodGhpcyk7CiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAnSExhdGVWYWx1ZSgkdGFyZ2V0KSc7Cn0KCmNsYXNzIEhUeXBlQ29udmVyc2lvbiBleHRlbmRzIEhDaGVjayB7CiAgLy8gVmFsdWVzIGZvciBba2luZF0uCiAgc3RhdGljIGNvbnN0IGludCBDSEVDS0VEX01PREVfQ0hFQ0sgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgQVJHVU1FTlRfVFlQRV9DSEVDSyA9IDE7CiAgc3RhdGljIGNvbnN0IGludCBDQVNUX1RZUEVfQ0hFQ0sgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgQk9PTEVBTl9DT05WRVJTSU9OX0NIRUNLID0gMzsKICBzdGF0aWMgY29uc3QgaW50IFJFQ0VJVkVSX1RZUEVfQ0hFQ0sgPSA0OwoKICBmaW5hbCBEYXJ0VHlwZSB0eXBlRXhwcmVzc2lvbjsKICBmaW5hbCBpbnQga2luZDsKICAvLyBbcmVjZWl2ZXJUeXBlQ2hlY2tTZWxlY3Rvcl0gaXMgdGhlIHNlbGVjdG9yIHVzZWQgZm9yIGEgcmVjZWl2ZXIgdHlwZSBjaGVjawogIC8vIG9uIG9wZW4tY29kZWQgb3BlcmF0b3JzLCBlLmcuIHRoZSBub3QtbnVsbCBjaGVjayBvbiBgeGAgaW4gYHggKyAxYCB3b3VsZCBiZQogIC8vIGNvbXBpbGVkIHRvIHRoZSBmb2xsb3dpbmcsIGZvciB3aGljaCB3ZSBuZWVkIHRoZSBzZWxlY3RvciBgJGFkZGAuCiAgLy8KICAvLyAgICAgaWYgKHR5cGVvZiB4ICE9ICJudW1iZXIiKSB4LiRhZGQoKTsKICAvLwogIGZpbmFsIFNlbGVjdG9yIHJlY2VpdmVyVHlwZUNoZWNrU2VsZWN0b3I7CgogIEFic3RyYWN0VmFsdWUgY2hlY2tlZFR5cGU7IC8vIE5vdCBmaW5hbCBiZWNhdXNlIHdlIHJlZmluZSBpdC4KICBBYnN0cmFjdFZhbHVlCiAgICAgIGlucHV0VHlwZTsgLy8gSG9sZHMgaW5wdXQgdHlwZSBmb3IgY29kZWdlbiBhZnRlciBIVHlwZUtub3duIHJlbW92YWwuCgogIEhUeXBlQ29udmVyc2lvbih0aGlzLnR5cGVFeHByZXNzaW9uLCB0aGlzLmtpbmQsIEFic3RyYWN0VmFsdWUgdHlwZSwKICAgICAgSEluc3RydWN0aW9uIGlucHV0LCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAge3RoaXMucmVjZWl2ZXJUeXBlQ2hlY2tTZWxlY3Rvcn0pCiAgICAgIDogY2hlY2tlZFR5cGUgPSB0eXBlLAogICAgICAgIHN1cGVyKDxISW5zdHJ1Y3Rpb24+W2lucHV0XSwgdHlwZSkgewogICAgYXNzZXJ0KCFpc1JlY2VpdmVyVHlwZUNoZWNrIHx8IHJlY2VpdmVyVHlwZUNoZWNrU2VsZWN0b3IgIT0gbnVsbCk7CiAgICBhc3NlcnQodHlwZUV4cHJlc3Npb24gPT0gbnVsbCB8fCAhdHlwZUV4cHJlc3Npb24uaXNUeXBlZGVmKTsKICAgIGFzc2VydCghaXNDb250cm9sRmxvdygpIHx8IHR5cGVFeHByZXNzaW9uICE9IG51bGwpOwogICAgc291cmNlRWxlbWVudCA9IGlucHV0LnNvdXJjZUVsZW1lbnQ7CiAgICB0aGlzLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgfQoKICBIVHlwZUNvbnZlcnNpb24ud2l0aFR5cGVSZXByZXNlbnRhdGlvbih0aGlzLnR5cGVFeHByZXNzaW9uLCB0aGlzLmtpbmQsCiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZSwgSEluc3RydWN0aW9uIGlucHV0LCBISW5zdHJ1Y3Rpb24gdHlwZVJlcHJlc2VudGF0aW9uKQogICAgICA6IGNoZWNrZWRUeXBlID0gdHlwZSwKICAgICAgICByZWNlaXZlclR5cGVDaGVja1NlbGVjdG9yID0gbnVsbCwKICAgICAgICBzdXBlcig8SEluc3RydWN0aW9uPltpbnB1dCwgdHlwZVJlcHJlc2VudGF0aW9uXSwgdHlwZSkgewogICAgYXNzZXJ0KCF0eXBlRXhwcmVzc2lvbi5pc1R5cGVkZWYpOwogICAgc291cmNlRWxlbWVudCA9IGlucHV0LnNvdXJjZUVsZW1lbnQ7CiAgfQoKICBIVHlwZUNvbnZlcnNpb24udmlhTWV0aG9kT25UeXBlKHRoaXMudHlwZUV4cHJlc3Npb24sIHRoaXMua2luZCwKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlLCBISW5zdHJ1Y3Rpb24gcmVpZmllZFR5cGUsIEhJbnN0cnVjdGlvbiBpbnB1dCkKICAgICAgOiBjaGVja2VkVHlwZSA9IHR5cGUsCiAgICAgICAgcmVjZWl2ZXJUeXBlQ2hlY2tTZWxlY3RvciA9IG51bGwsCiAgICAgICAgc3VwZXIoPEhJbnN0cnVjdGlvbj5bcmVpZmllZFR5cGUsIGlucHV0XSwgdHlwZSkgewogICAgLy8gVGhpcyBmb3JtIGlzIGN1cnJlbnRseSB1c2VkIG9ubHkgZm9yIGZ1bmN0aW9uIHR5cGVzLgogICAgYXNzZXJ0KHR5cGVFeHByZXNzaW9uLmlzRnVuY3Rpb25UeXBlKTsKICAgIGFzc2VydChraW5kID09IENIRUNLRURfTU9ERV9DSEVDSyB8fCBraW5kID09IENBU1RfVFlQRV9DSEVDSyk7CiAgICBzb3VyY2VFbGVtZW50ID0gaW5wdXQuc291cmNlRWxlbWVudDsKICB9CgogIGJvb2wgZ2V0IGhhc1R5cGVSZXByZXNlbnRhdGlvbiB7CiAgICByZXR1cm4gdHlwZUV4cHJlc3Npb24gIT0gbnVsbCAmJgogICAgICAgIHR5cGVFeHByZXNzaW9uLmlzSW50ZXJmYWNlVHlwZSAmJgogICAgICAgIGlucHV0cy5sZW5ndGggPiAxOwogIH0KCiAgSEluc3RydWN0aW9uIGdldCB0eXBlUmVwcmVzZW50YXRpb24gPT4gaW5wdXRzWzFdOwoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gZ2V0IGNoZWNrZWRJbnB1dCA9PiBzdXBlci5jaGVja2VkSW5wdXQ7CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBjb252ZXJ0VHlwZShKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsIERhcnRUeXBlIHR5cGUsIGludCBraW5kKSB7CiAgICBpZiAodHlwZUV4cHJlc3Npb24gPT0gdHlwZSkgewogICAgICAvLyBEb24ndCBvbWl0IGEgYm9vbGVhbiBjb252ZXJzaW9uICh3aGljaCBkb2Vzbid0IGFsbG93IGBudWxsYCkgdW5sZXNzCiAgICAgIC8vIHRoaXMgdHlwZSBjb252ZXJzaW9uIGlzIGFscmVhZHkgYSBib29sZWFuIGNvbnZlcnNpb24uCiAgICAgIGlmIChraW5kICE9IEJPT0xFQU5fQ09OVkVSU0lPTl9DSEVDSyB8fCBpc0Jvb2xlYW5Db252ZXJzaW9uQ2hlY2spIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN1cGVyLmNvbnZlcnRUeXBlKGNsb3NlZFdvcmxkLCB0eXBlLCBraW5kKTsKICB9CgogIGJvb2wgZ2V0IGlzQ2hlY2tlZE1vZGVDaGVjayB7CiAgICByZXR1cm4ga2luZCA9PSBDSEVDS0VEX01PREVfQ0hFQ0sgfHwga2luZCA9PSBCT09MRUFOX0NPTlZFUlNJT05fQ0hFQ0s7CiAgfQoKICBib29sIGdldCBpc0FyZ3VtZW50VHlwZUNoZWNrID0+IGtpbmQgPT0gQVJHVU1FTlRfVFlQRV9DSEVDSzsKICBib29sIGdldCBpc1JlY2VpdmVyVHlwZUNoZWNrID0+IGtpbmQgPT0gUkVDRUlWRVJfVFlQRV9DSEVDSzsKICBib29sIGdldCBpc0Nhc3RUeXBlQ2hlY2sgPT4ga2luZCA9PSBDQVNUX1RZUEVfQ0hFQ0s7CiAgYm9vbCBnZXQgaXNCb29sZWFuQ29udmVyc2lvbkNoZWNrID0+IGtpbmQgPT0gQk9PTEVBTl9DT05WRVJTSU9OX0NIRUNLOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFR5cGVDb252ZXJzaW9uKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBib29sIGlzSnNTdGF0ZW1lbnQoKSA9PiBpc0NvbnRyb2xGbG93KCk7CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvbnRyb2xGbG93KCkgPT4gaXNBcmd1bWVudFR5cGVDaGVjayB8fCBpc1JlY2VpdmVyVHlwZUNoZWNrOwoKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uVFlQRV9DT05WRVJTSU9OX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhISW5zdHJ1Y3Rpb24gb3RoZXIpID0+IG90aGVyIGlzIEhUeXBlQ29udmVyc2lvbjsKICBAb3ZlcnJpZGUKICBib29sIGlzQ29kZU1vdGlvbkludmFyaWFudCgpID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSFR5cGVDb252ZXJzaW9uIG90aGVyKSB7CiAgICByZXR1cm4ga2luZCA9PSBvdGhlci5raW5kICYmCiAgICAgICAgdHlwZUV4cHJlc3Npb24gPT0gb3RoZXIudHlwZUV4cHJlc3Npb24gJiYKICAgICAgICBjaGVja2VkVHlwZSA9PSBvdGhlci5jaGVja2VkVHlwZSAmJgogICAgICAgIHJlY2VpdmVyVHlwZUNoZWNrU2VsZWN0b3IgPT0gb3RoZXIucmVjZWl2ZXJUeXBlQ2hlY2tTZWxlY3RvcjsKICB9CgogIGJvb2wgaXNSZWR1bmRhbnQoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4gPSBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluOwogICAgRGFydFR5cGUgdHlwZSA9IHR5cGVFeHByZXNzaW9uOwogICAgaWYgKHR5cGUgIT0gbnVsbCkgewogICAgICBpZiAodHlwZS5pc1R5cGVWYXJpYWJsZSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAodHlwZS5pc0Z1dHVyZU9yKSB7CiAgICAgICAgLy8gYG51bGxgIGFsd2F5cyBwYXNzZXMgdHlwZSBjb252ZXJzaW9uLgogICAgICAgIGlmIChjaGVja2VkSW5wdXQuaXNOdWxsKGFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBPcHRpbWl6ZSBGdXR1cmVPciB0eXBlIGNvbnZlcnNpb25zLgogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAoIXR5cGUudHJlYXRBc1JhdykgewogICAgICAgIC8vIGBudWxsYCBhbHdheXMgcGFzc2VzIHR5cGUgY29udmVyc2lvbi4KICAgICAgICBpZiAoY2hlY2tlZElucHV0LmlzTnVsbChhYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGlmICh0eXBlLmlzRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgLy8gYG51bGxgIGFsd2F5cyBwYXNzZXMgdHlwZSBjb252ZXJzaW9uLgogICAgICAgIGlmIChjaGVja2VkSW5wdXQuaXNOdWxsKGFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBPcHRpbWl6ZSBmdW5jdGlvbiB0eXBlIGNvbnZlcnNpb25zLgogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgLy8gVHlwZSBpcyByZWZpbmVkIGZyb20gYGR5bmFtaWNgLCBzbyBpdCBtaWdodCBiZWNvbWUgbm9uLXJlZHVuZGFudC4KICAgIGlmIChhYnN0cmFjdFZhbHVlRG9tYWluLmNvbnRhaW5zQWxsKGNoZWNrZWRUeXBlKS5pc1BvdGVudGlhbGx5VHJ1ZSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBBYnN0cmFjdFZhbHVlIGlucHV0VHlwZSA9IGNoZWNrZWRJbnB1dC5pbnN0cnVjdGlvblR5cGU7CiAgICByZXR1cm4gYWJzdHJhY3RWYWx1ZURvbWFpbi5pc0luKGlucHV0VHlwZSwgY2hlY2tlZFR5cGUpLmlzRGVmaW5pdGVseVRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnSFR5cGVDb252ZXJzaW9uKHR5cGU9JHR5cGVFeHByZXNzaW9uLCBraW5kPSRraW5kLCAnCiAgICAgICcke2hhc1R5cGVSZXByZXNlbnRhdGlvbiA/ICdyZXByZXNlbnRhdGlvbj0kdHlwZVJlcHJlc2VudGF0aW9uLCAnIDogJyd9JwogICAgICAnY2hlY2tlZElucHV0PSRjaGVja2VkSW5wdXQpJzsKfQoKLy8vIFRoZSBbSFR5cGVLbm93bl0gaW5zdHJ1Y3Rpb24gbWFya3MgYSB2YWx1ZSB3aXRoIGEgcmVmaW5lZCB0eXBlLgpjbGFzcyBIVHlwZUtub3duIGV4dGVuZHMgSENoZWNrIHsKICBBYnN0cmFjdFZhbHVlIGtub3duVHlwZTsKICBmaW5hbCBib29sIF9pc01vdmFibGU7CgogIEhUeXBlS25vd24ucGlubmVkKEFic3RyYWN0VmFsdWUga25vd25UeXBlLCBISW5zdHJ1Y3Rpb24gaW5wdXQpCiAgICAgIDogdGhpcy5rbm93blR5cGUgPSBrbm93blR5cGUsCiAgICAgICAgdGhpcy5faXNNb3ZhYmxlID0gZmFsc2UsCiAgICAgICAgc3VwZXIoPEhJbnN0cnVjdGlvbj5baW5wdXRdLCBrbm93blR5cGUpOwoKICBIVHlwZUtub3duLndpdG5lc3NlZCgKICAgICAgQWJzdHJhY3RWYWx1ZSBrbm93blR5cGUsIEhJbnN0cnVjdGlvbiBpbnB1dCwgSEluc3RydWN0aW9uIHdpdG5lc3MpCiAgICAgIDogdGhpcy5rbm93blR5cGUgPSBrbm93blR5cGUsCiAgICAgICAgdGhpcy5faXNNb3ZhYmxlID0gdHJ1ZSwKICAgICAgICBzdXBlcig8SEluc3RydWN0aW9uPltpbnB1dCwgd2l0bmVzc10sIGtub3duVHlwZSk7CgogIEBvdmVycmlkZQogIHRvU3RyaW5nKCkgPT4gJ1R5cGVLbm93biAka25vd25UeXBlJzsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFR5cGVLbm93bih0aGlzKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0pzU3RhdGVtZW50KCkgPT4gZmFsc2U7CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvbnRyb2xGbG93KCkgPT4gZmFsc2U7CiAgQG92ZXJyaWRlCiAgYm9vbCBjYW5UaHJvdyhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4gZmFsc2U7CgogIGJvb2wgZ2V0IGlzUGlubmVkID0+IGlucHV0cy5sZW5ndGggPT0gMTsKCiAgSEluc3RydWN0aW9uIGdldCB3aXRuZXNzID0+IGlucHV0cy5sZW5ndGggPT0gMiA/IGlucHV0c1sxXSA6IG51bGw7CgogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5UWVBFX0tOT1dOX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhISW5zdHJ1Y3Rpb24gb3RoZXIpID0+IG90aGVyIGlzIEhUeXBlS25vd247CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvZGVNb3Rpb25JbnZhcmlhbnQoKSA9PiB0cnVlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTW92YWJsZSA9PiBfaXNNb3ZhYmxlICYmIHVzZUd2bigpOwoKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSFR5cGVLbm93biBvdGhlcikgewogICAgcmV0dXJuIGtub3duVHlwZSA9PSBvdGhlci5rbm93blR5cGUgJiYKICAgICAgICBpbnN0cnVjdGlvblR5cGUgPT0gb3RoZXIuaW5zdHJ1Y3Rpb25UeXBlOwogIH0KCiAgYm9vbCBpc1JlZHVuZGFudChKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiA9IGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CiAgICBpZiAoYWJzdHJhY3RWYWx1ZURvbWFpbi5jb250YWluc0FsbChrbm93blR5cGUpLmlzUG90ZW50aWFsbHlUcnVlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIEFic3RyYWN0VmFsdWUgaW5wdXRUeXBlID0gY2hlY2tlZElucHV0Lmluc3RydWN0aW9uVHlwZTsKICAgIHJldHVybiBhYnN0cmFjdFZhbHVlRG9tYWluLmlzSW4oaW5wdXRUeXBlLCBrbm93blR5cGUpLmlzRGVmaW5pdGVseVRydWU7CiAgfQp9CgpjbGFzcyBIUmFuZ2VDb252ZXJzaW9uIGV4dGVuZHMgSENoZWNrIHsKICBIUmFuZ2VDb252ZXJzaW9uKEhJbnN0cnVjdGlvbiBpbnB1dCwgdHlwZSkKICAgICAgOiBzdXBlcig8SEluc3RydWN0aW9uPltpbnB1dF0sIHR5cGUpIHsKICAgIHNvdXJjZUVsZW1lbnQgPSBpbnB1dC5zb3VyY2VFbGVtZW50OwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNNb3ZhYmxlID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFJhbmdlQ29udmVyc2lvbih0aGlzKTsKfQoKY2xhc3MgSFN0cmluZ0NvbmNhdCBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgSFN0cmluZ0NvbmNhdChISW5zdHJ1Y3Rpb24gbGVmdCwgSEluc3RydWN0aW9uIHJpZ2h0LCBBYnN0cmFjdFZhbHVlIHR5cGUpCiAgICAgIDogc3VwZXIoPEhJbnN0cnVjdGlvbj5bbGVmdCwgcmlnaHRdLCB0eXBlKSB7CiAgICAvLyBUT0RPKHNyYSk6IFVudGlsIElzc3VlIDkyOTMgaXMgZml4ZWQsIHRoaXMgZmFsc2UgZGVwZW5kZW5jeSBrZWVwcyB0aGUKICAgIC8vIGNvbmNhdHMgYnVuY2hlZCB3aXRoIHN0cmluZ2lmaWVkIGlucHV0cyBmb3IgbXVjaCBiZXR0ZXIgbG9va2luZyBjb2RlIHdpdGgKICAgIC8vIGZld2VyIHRlbXBzLgogICAgc2lkZUVmZmVjdHMuc2V0RGVwZW5kc09uU29tZXRoaW5nKCk7CiAgfQoKICBISW5zdHJ1Y3Rpb24gZ2V0IGxlZnQgPT4gaW5wdXRzWzBdOwogIEhJbnN0cnVjdGlvbiBnZXQgcmlnaHQgPT4gaW5wdXRzWzFdOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFN0cmluZ0NvbmNhdCh0aGlzKTsKICBAb3ZlcnJpZGUKICB0b1N0cmluZygpID0+ICJzdHJpbmcgY29uY2F0IjsKfQoKLy8vIFRoZSBwYXJ0IG9mIHN0cmluZyBpbnRlcnBvbGF0aW9uIHdoaWNoIGNvbnZlcnRzIGFuZCBpbnRlcnBvbGF0ZWQgZXhwcmVzc2lvbgovLy8gaW50byBhIFN0cmluZyB2YWx1ZS4KY2xhc3MgSFN0cmluZ2lmeSBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgSFN0cmluZ2lmeShISW5zdHJ1Y3Rpb24gaW5wdXQsIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcig8SEluc3RydWN0aW9uPltpbnB1dF0sIHR5cGUpIHsKICAgIHNpZGVFZmZlY3RzLnNldEFsbFNpZGVFZmZlY3RzKCk7CiAgICBzaWRlRWZmZWN0cy5zZXREZXBlbmRzT25Tb21ldGhpbmcoKTsKICB9CgogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0U3RyaW5naWZ5KHRoaXMpOwogIEBvdmVycmlkZQogIHRvU3RyaW5nKCkgPT4gInN0cmluZ2lmeSI7Cn0KCi8vLyBOb24tYmxvY2stYmFzZWQgKGFrYS4gdHJhZGl0aW9uYWwpIGxvb3AgaW5mb3JtYXRpb24uCmNsYXNzIEhMb29wSW5mb3JtYXRpb24gewogIGZpbmFsIEhCYXNpY0Jsb2NrIGhlYWRlcjsKICBmaW5hbCBMaXN0PEhCYXNpY0Jsb2NrPiBibG9ja3M7CiAgZmluYWwgTGlzdDxIQmFzaWNCbG9jaz4gYmFja0VkZ2VzOwogIGZpbmFsIExpc3Q8TGFiZWxEZWZpbml0aW9uPiBsYWJlbHM7CiAgZmluYWwgSnVtcFRhcmdldCB0YXJnZXQ7CgogIC8vLyBDb3JyZXNwb25kaW5nIGJsb2NrIGluZm9ybWF0aW9uIGZvciB0aGUgbG9vcC4KICBITG9vcEJsb2NrSW5mb3JtYXRpb24gbG9vcEJsb2NrSW5mb3JtYXRpb247CgogIEhMb29wSW5mb3JtYXRpb24odGhpcy5oZWFkZXIsIHRoaXMudGFyZ2V0LCB0aGlzLmxhYmVscykKICAgICAgOiBibG9ja3MgPSBuZXcgTGlzdDxIQmFzaWNCbG9jaz4oKSwKICAgICAgICBiYWNrRWRnZXMgPSBuZXcgTGlzdDxIQmFzaWNCbG9jaz4oKTsKCiAgdm9pZCBhZGRCYWNrRWRnZShIQmFzaWNCbG9jayBwcmVkZWNlc3NvcikgewogICAgYmFja0VkZ2VzLmFkZChwcmVkZWNlc3Nvcik7CiAgICBMaXN0PEhCYXNpY0Jsb2NrPiB3b3JrUXVldWUgPSA8SEJhc2ljQmxvY2s+W3ByZWRlY2Vzc29yXTsKICAgIGRvIHsKICAgICAgSEJhc2ljQmxvY2sgY3VycmVudCA9IHdvcmtRdWV1ZS5yZW1vdmVMYXN0KCk7CiAgICAgIGFkZEJsb2NrKGN1cnJlbnQsIHdvcmtRdWV1ZSk7CiAgICB9IHdoaWxlICghd29ya1F1ZXVlLmlzRW1wdHkpOwogIH0KCiAgLy8gQWRkcyBhIGJsb2NrIGFuZCB0cmFuc2l0aXZlbHkgYWxsIGl0cyBwcmVkZWNlc3NvcnMgaW4gdGhlIGxvb3AgYXMKICAvLyBsb29wIGJsb2Nrcy4KICB2b2lkIGFkZEJsb2NrKEhCYXNpY0Jsb2NrIGJsb2NrLCBMaXN0PEhCYXNpY0Jsb2NrPiB3b3JrUXVldWUpIHsKICAgIGlmIChpZGVudGljYWwoYmxvY2ssIGhlYWRlcikpIHJldHVybjsKICAgIEhCYXNpY0Jsb2NrIHBhcmVudEhlYWRlciA9IGJsb2NrLnBhcmVudExvb3BIZWFkZXI7CiAgICBpZiAoaWRlbnRpY2FsKHBhcmVudEhlYWRlciwgaGVhZGVyKSkgewogICAgICAvLyBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY2FzZS4KICAgIH0gZWxzZSBpZiAocGFyZW50SGVhZGVyICE9IG51bGwpIHsKICAgICAgd29ya1F1ZXVlLmFkZChwYXJlbnRIZWFkZXIpOwogICAgfSBlbHNlIHsKICAgICAgYmxvY2sucGFyZW50TG9vcEhlYWRlciA9IGhlYWRlcjsKICAgICAgYmxvY2tzLmFkZChibG9jayk7CiAgICAgIHdvcmtRdWV1ZS5hZGRBbGwoYmxvY2sucHJlZGVjZXNzb3JzKTsKICAgIH0KICB9Cn0KCi8vLyBFbWJlZGRpbmcgb2YgYSBbSEJsb2NrSW5mb3JtYXRpb25dIGZvciBibG9jay1zdHJ1Y3R1cmUgYmFzZWQgdHJhdmVyc2FsCi8vLyBpbiBhIGRvbWluYXRvciBiYXNlZCBmbG93IHRyYXZlcnNhbCBieSBhdHRhY2hpbmcgaXQgdG8gYSBiYXNpYyBibG9jay4KLy8vIFRvIGdvIGJhY2sgdG8gZG9taW5hdG9yLWJhc2VkIHRyYXZlcnNhbCwgYSBbSFN1YkdyYXBoQmxvY2tJbmZvcm1hdGlvbl0KLy8vIHN0cnVjdHVyZSBjYW4gYmUgYWRkZWQgaW4gdGhlIGJsb2NrIHN0cnVjdHVyZS4KY2xhc3MgSEJsb2NrRmxvdyB7CiAgZmluYWwgSEJsb2NrSW5mb3JtYXRpb24gYm9keTsKICBmaW5hbCBIQmFzaWNCbG9jayBjb250aW51YXRpb247CiAgSEJsb2NrRmxvdyh0aGlzLmJvZHksIHRoaXMuY29udGludWF0aW9uKTsKfQoKLy8vIEluZm9ybWF0aW9uIGFib3V0IGEgc3ludGFjdGljLWxpa2Ugc3RydWN0dXJlLgphYnN0cmFjdCBjbGFzcyBIQmxvY2tJbmZvcm1hdGlvbiB7CiAgSEJhc2ljQmxvY2sgZ2V0IHN0YXJ0OwogIEhCYXNpY0Jsb2NrIGdldCBlbmQ7CiAgYm9vbCBhY2NlcHQoSEJsb2NrSW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpOwp9CgovLy8gSW5mb3JtYXRpb24gYWJvdXQgYSBzdGF0ZW1lbnQtbGlrZSBzdHJ1Y3R1cmUuCmFic3RyYWN0IGNsYXNzIEhTdGF0ZW1lbnRJbmZvcm1hdGlvbiBleHRlbmRzIEhCbG9ja0luZm9ybWF0aW9uIHsKICBAb3ZlcnJpZGUKICBib29sIGFjY2VwdChIU3RhdGVtZW50SW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpOwp9CgovLy8gSW5mb3JtYXRpb24gYWJvdXQgYW4gZXhwcmVzc2lvbi1saWtlIHN0cnVjdHVyZS4KYWJzdHJhY3QgY2xhc3MgSEV4cHJlc3Npb25JbmZvcm1hdGlvbiBleHRlbmRzIEhCbG9ja0luZm9ybWF0aW9uIHsKICBAb3ZlcnJpZGUKICBib29sIGFjY2VwdChIRXhwcmVzc2lvbkluZm9ybWF0aW9uVmlzaXRvciB2aXNpdG9yKTsKICBISW5zdHJ1Y3Rpb24gZ2V0IGNvbmRpdGlvbkV4cHJlc3Npb247Cn0KCmFic3RyYWN0IGNsYXNzIEhTdGF0ZW1lbnRJbmZvcm1hdGlvblZpc2l0b3IgewogIGJvb2wgdmlzaXRMYWJlbGVkQmxvY2tJbmZvKEhMYWJlbGVkQmxvY2tJbmZvcm1hdGlvbiBpbmZvKTsKICBib29sIHZpc2l0TG9vcEluZm8oSExvb3BCbG9ja0luZm9ybWF0aW9uIGluZm8pOwogIGJvb2wgdmlzaXRJZkluZm8oSElmQmxvY2tJbmZvcm1hdGlvbiBpbmZvKTsKICBib29sIHZpc2l0VHJ5SW5mbyhIVHJ5QmxvY2tJbmZvcm1hdGlvbiBpbmZvKTsKICBib29sIHZpc2l0U3dpdGNoSW5mbyhIU3dpdGNoQmxvY2tJbmZvcm1hdGlvbiBpbmZvKTsKICBib29sIHZpc2l0U2VxdWVuY2VJbmZvKEhTdGF0ZW1lbnRTZXF1ZW5jZUluZm9ybWF0aW9uIGluZm8pOwogIC8vIFBzZXVkby1zdHJ1Y3R1cmUgZW1iZWRkaW5nIGEgZG9taW5hdG9yLWJhc2VkIHRyYXZlcnNhbCBpbnRvCiAgLy8gdGhlIGJsb2NrLXN0cnVjdHVyZSB0cmF2ZXJzYWwuIFRoaXMgd2lsbCBldmVudHVhbGx5IGdvIGF3YXkuCiAgYm9vbCB2aXNpdFN1YkdyYXBoSW5mbyhIU3ViR3JhcGhCbG9ja0luZm9ybWF0aW9uIGluZm8pOwp9CgphYnN0cmFjdCBjbGFzcyBIRXhwcmVzc2lvbkluZm9ybWF0aW9uVmlzaXRvciB7CiAgYm9vbCB2aXNpdEFuZE9ySW5mbyhIQW5kT3JCbG9ja0luZm9ybWF0aW9uIGluZm8pOwogIGJvb2wgdmlzaXRTdWJFeHByZXNzaW9uSW5mbyhIU3ViRXhwcmVzc2lvbkJsb2NrSW5mb3JtYXRpb24gaW5mbyk7Cn0KCmFic3RyYWN0IGNsYXNzIEhCbG9ja0luZm9ybWF0aW9uVmlzaXRvcgogICAgaW1wbGVtZW50cyBIU3RhdGVtZW50SW5mb3JtYXRpb25WaXNpdG9yLCBIRXhwcmVzc2lvbkluZm9ybWF0aW9uVmlzaXRvciB7fQoKLy8vIEdlbmVyaWMgY2xhc3Mgd3JhcHBpbmcgYSBbU3ViR3JhcGhdIGFzIGEgYmxvY2staW5mb3JtYXRpb24gdW50aWwKLy8vIGFsbCBzdHJ1Y3R1cmVzIGFyZSBoYW5kbGVkIHByb3Blcmx5LgpjbGFzcyBIU3ViR3JhcGhCbG9ja0luZm9ybWF0aW9uIGltcGxlbWVudHMgSFN0YXRlbWVudEluZm9ybWF0aW9uIHsKICBmaW5hbCBTdWJHcmFwaCBzdWJHcmFwaDsKICBIU3ViR3JhcGhCbG9ja0luZm9ybWF0aW9uKHRoaXMuc3ViR3JhcGgpOwoKICBAb3ZlcnJpZGUKICBIQmFzaWNCbG9jayBnZXQgc3RhcnQgPT4gc3ViR3JhcGguc3RhcnQ7CiAgQG92ZXJyaWRlCiAgSEJhc2ljQmxvY2sgZ2V0IGVuZCA9PiBzdWJHcmFwaC5lbmQ7CgogIEBvdmVycmlkZQogIGJvb2wgYWNjZXB0KEhTdGF0ZW1lbnRJbmZvcm1hdGlvblZpc2l0b3IgdmlzaXRvcikgPT4KICAgICAgdmlzaXRvci52aXNpdFN1YkdyYXBoSW5mbyh0aGlzKTsKfQoKLy8vIEdlbmVyaWMgY2xhc3Mgd3JhcHBpbmcgYSBbU3ViRXhwcmVzc2lvbl0gYXMgYSBibG9jay1pbmZvcm1hdGlvbiB1bnRpbAovLy8gZXhwcmVzc2lvbnMgc3RydWN0dXJlcyBhcmUgaGFuZGxlZCBwcm9wZXJseS4KY2xhc3MgSFN1YkV4cHJlc3Npb25CbG9ja0luZm9ybWF0aW9uIGltcGxlbWVudHMgSEV4cHJlc3Npb25JbmZvcm1hdGlvbiB7CiAgZmluYWwgU3ViRXhwcmVzc2lvbiBzdWJFeHByZXNzaW9uOwogIEhTdWJFeHByZXNzaW9uQmxvY2tJbmZvcm1hdGlvbih0aGlzLnN1YkV4cHJlc3Npb24pOwoKICBAb3ZlcnJpZGUKICBIQmFzaWNCbG9jayBnZXQgc3RhcnQgPT4gc3ViRXhwcmVzc2lvbi5zdGFydDsKICBAb3ZlcnJpZGUKICBIQmFzaWNCbG9jayBnZXQgZW5kID0+IHN1YkV4cHJlc3Npb24uZW5kOwoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gZ2V0IGNvbmRpdGlvbkV4cHJlc3Npb24gPT4gc3ViRXhwcmVzc2lvbi5jb25kaXRpb25FeHByZXNzaW9uOwoKICBAb3ZlcnJpZGUKICBib29sIGFjY2VwdChIRXhwcmVzc2lvbkluZm9ybWF0aW9uVmlzaXRvciB2aXNpdG9yKSA9PgogICAgICB2aXNpdG9yLnZpc2l0U3ViRXhwcmVzc2lvbkluZm8odGhpcyk7Cn0KCi8vLyBBIHNlcXVlbmNlIG9mIHNlcGFyYXRlIHN0YXRlbWVudHMuCmNsYXNzIEhTdGF0ZW1lbnRTZXF1ZW5jZUluZm9ybWF0aW9uIGltcGxlbWVudHMgSFN0YXRlbWVudEluZm9ybWF0aW9uIHsKICBmaW5hbCBMaXN0PEhTdGF0ZW1lbnRJbmZvcm1hdGlvbj4gc3RhdGVtZW50czsKICBIU3RhdGVtZW50U2VxdWVuY2VJbmZvcm1hdGlvbih0aGlzLnN0YXRlbWVudHMpOwoKICBAb3ZlcnJpZGUKICBIQmFzaWNCbG9jayBnZXQgc3RhcnQgPT4gc3RhdGVtZW50c1swXS5zdGFydDsKICBAb3ZlcnJpZGUKICBIQmFzaWNCbG9jayBnZXQgZW5kID0+IHN0YXRlbWVudHMubGFzdC5lbmQ7CgogIEBvdmVycmlkZQogIGJvb2wgYWNjZXB0KEhTdGF0ZW1lbnRJbmZvcm1hdGlvblZpc2l0b3IgdmlzaXRvcikgPT4KICAgICAgdmlzaXRvci52aXNpdFNlcXVlbmNlSW5mbyh0aGlzKTsKfQoKY2xhc3MgSExhYmVsZWRCbG9ja0luZm9ybWF0aW9uIGltcGxlbWVudHMgSFN0YXRlbWVudEluZm9ybWF0aW9uIHsKICBmaW5hbCBIU3RhdGVtZW50SW5mb3JtYXRpb24gYm9keTsKICBmaW5hbCBMaXN0PExhYmVsRGVmaW5pdGlvbj4gbGFiZWxzOwogIGZpbmFsIEp1bXBUYXJnZXQgdGFyZ2V0OwogIGZpbmFsIGJvb2wgaXNDb250aW51ZTsKCiAgSExhYmVsZWRCbG9ja0luZm9ybWF0aW9uKHRoaXMuYm9keSwgTGlzdDxMYWJlbERlZmluaXRpb24+IGxhYmVscywKICAgICAge3RoaXMuaXNDb250aW51ZTogZmFsc2V9KQogICAgICA6IHRoaXMubGFiZWxzID0gbGFiZWxzLAogICAgICAgIHRoaXMudGFyZ2V0ID0gbGFiZWxzWzBdLnRhcmdldDsKCiAgSExhYmVsZWRCbG9ja0luZm9ybWF0aW9uLmltcGxpY2l0KHRoaXMuYm9keSwgdGhpcy50YXJnZXQsCiAgICAgIHt0aGlzLmlzQ29udGludWU6IGZhbHNlfSkKICAgICAgOiB0aGlzLmxhYmVscyA9IGNvbnN0IDxMYWJlbERlZmluaXRpb24+W107CgogIEBvdmVycmlkZQogIEhCYXNpY0Jsb2NrIGdldCBzdGFydCA9PiBib2R5LnN0YXJ0OwogIEBvdmVycmlkZQogIEhCYXNpY0Jsb2NrIGdldCBlbmQgPT4gYm9keS5lbmQ7CgogIEBvdmVycmlkZQogIGJvb2wgYWNjZXB0KEhTdGF0ZW1lbnRJbmZvcm1hdGlvblZpc2l0b3IgdmlzaXRvcikgPT4KICAgICAgdmlzaXRvci52aXNpdExhYmVsZWRCbG9ja0luZm8odGhpcyk7Cn0KCmNsYXNzIEhMb29wQmxvY2tJbmZvcm1hdGlvbiBpbXBsZW1lbnRzIEhTdGF0ZW1lbnRJbmZvcm1hdGlvbiB7CiAgc3RhdGljIGNvbnN0IGludCBXSElMRV9MT09QID0gMDsKICBzdGF0aWMgY29uc3QgaW50IEZPUl9MT09QID0gMTsKICBzdGF0aWMgY29uc3QgaW50IERPX1dISUxFX0xPT1AgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgRk9SX0lOX0xPT1AgPSAzOwogIHN0YXRpYyBjb25zdCBpbnQgU1dJVENIX0NPTlRJTlVFX0xPT1AgPSA0OwogIHN0YXRpYyBjb25zdCBpbnQgTk9UX0FfTE9PUCA9IC0xOwoKICBmaW5hbCBpbnQga2luZDsKICBmaW5hbCBIRXhwcmVzc2lvbkluZm9ybWF0aW9uIGluaXRpYWxpemVyOwogIGZpbmFsIEhFeHByZXNzaW9uSW5mb3JtYXRpb24gY29uZGl0aW9uOwogIGZpbmFsIEhTdGF0ZW1lbnRJbmZvcm1hdGlvbiBib2R5OwogIGZpbmFsIEhFeHByZXNzaW9uSW5mb3JtYXRpb24gdXBkYXRlczsKICBmaW5hbCBKdW1wVGFyZ2V0IHRhcmdldDsKICBmaW5hbCBMaXN0PExhYmVsRGVmaW5pdGlvbj4gbGFiZWxzOwogIGZpbmFsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uOwoKICBITG9vcEJsb2NrSW5mb3JtYXRpb24odGhpcy5raW5kLCB0aGlzLmluaXRpYWxpemVyLCB0aGlzLmNvbmRpdGlvbiwgdGhpcy5ib2R5LAogICAgICB0aGlzLnVwZGF0ZXMsIHRoaXMudGFyZ2V0LCB0aGlzLmxhYmVscywgdGhpcy5zb3VyY2VJbmZvcm1hdGlvbikgewogICAgYXNzZXJ0KAogICAgICAgIChraW5kID09IERPX1dISUxFX0xPT1AgPyBib2R5LnN0YXJ0IDogY29uZGl0aW9uLnN0YXJ0KS5pc0xvb3BIZWFkZXIoKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBIQmFzaWNCbG9jayBnZXQgc3RhcnQgewogICAgaWYgKGluaXRpYWxpemVyICE9IG51bGwpIHJldHVybiBpbml0aWFsaXplci5zdGFydDsKICAgIGlmIChraW5kID09IERPX1dISUxFX0xPT1ApIHsKICAgICAgcmV0dXJuIGJvZHkuc3RhcnQ7CiAgICB9CiAgICByZXR1cm4gY29uZGl0aW9uLnN0YXJ0OwogIH0KCiAgSEJhc2ljQmxvY2sgZ2V0IGxvb3BIZWFkZXIgewogICAgcmV0dXJuIGtpbmQgPT0gRE9fV0hJTEVfTE9PUCA/IGJvZHkuc3RhcnQgOiBjb25kaXRpb24uc3RhcnQ7CiAgfQoKICBAb3ZlcnJpZGUKICBIQmFzaWNCbG9jayBnZXQgZW5kIHsKICAgIGlmICh1cGRhdGVzICE9IG51bGwpIHJldHVybiB1cGRhdGVzLmVuZDsKICAgIGlmIChraW5kID09IERPX1dISUxFX0xPT1AgJiYgY29uZGl0aW9uICE9IG51bGwpIHsKICAgICAgcmV0dXJuIGNvbmRpdGlvbi5lbmQ7CiAgICB9CiAgICByZXR1cm4gYm9keS5lbmQ7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGFjY2VwdChIU3RhdGVtZW50SW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpID0+CiAgICAgIHZpc2l0b3IudmlzaXRMb29wSW5mbyh0aGlzKTsKfQoKY2xhc3MgSElmQmxvY2tJbmZvcm1hdGlvbiBpbXBsZW1lbnRzIEhTdGF0ZW1lbnRJbmZvcm1hdGlvbiB7CiAgZmluYWwgSEV4cHJlc3Npb25JbmZvcm1hdGlvbiBjb25kaXRpb247CiAgZmluYWwgSFN0YXRlbWVudEluZm9ybWF0aW9uIHRoZW5HcmFwaDsKICBmaW5hbCBIU3RhdGVtZW50SW5mb3JtYXRpb24gZWxzZUdyYXBoOwogIEhJZkJsb2NrSW5mb3JtYXRpb24odGhpcy5jb25kaXRpb24sIHRoaXMudGhlbkdyYXBoLCB0aGlzLmVsc2VHcmFwaCk7CgogIEBvdmVycmlkZQogIEhCYXNpY0Jsb2NrIGdldCBzdGFydCA9PiBjb25kaXRpb24uc3RhcnQ7CiAgQG92ZXJyaWRlCiAgSEJhc2ljQmxvY2sgZ2V0IGVuZCA9PiBlbHNlR3JhcGggPT0gbnVsbCA/IHRoZW5HcmFwaC5lbmQgOiBlbHNlR3JhcGguZW5kOwoKICBAb3ZlcnJpZGUKICBib29sIGFjY2VwdChIU3RhdGVtZW50SW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpID0+CiAgICAgIHZpc2l0b3IudmlzaXRJZkluZm8odGhpcyk7Cn0KCmNsYXNzIEhBbmRPckJsb2NrSW5mb3JtYXRpb24gaW1wbGVtZW50cyBIRXhwcmVzc2lvbkluZm9ybWF0aW9uIHsKICBmaW5hbCBib29sIGlzQW5kOwogIGZpbmFsIEhFeHByZXNzaW9uSW5mb3JtYXRpb24gbGVmdDsKICBmaW5hbCBIRXhwcmVzc2lvbkluZm9ybWF0aW9uIHJpZ2h0OwogIEhBbmRPckJsb2NrSW5mb3JtYXRpb24odGhpcy5pc0FuZCwgdGhpcy5sZWZ0LCB0aGlzLnJpZ2h0KTsKCiAgQG92ZXJyaWRlCiAgSEJhc2ljQmxvY2sgZ2V0IHN0YXJ0ID0+IGxlZnQuc3RhcnQ7CiAgQG92ZXJyaWRlCiAgSEJhc2ljQmxvY2sgZ2V0IGVuZCA9PiByaWdodC5lbmQ7CgogIC8vIFdlIGRvbid0IGN1cnJlbnRseSB1c2UgSEFuZE9yQmxvY2tJbmZvcm1hdGlvbi4KICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gZ2V0IGNvbmRpdGlvbkV4cHJlc3Npb24gewogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGFjY2VwdChIRXhwcmVzc2lvbkluZm9ybWF0aW9uVmlzaXRvciB2aXNpdG9yKSA9PgogICAgICB2aXNpdG9yLnZpc2l0QW5kT3JJbmZvKHRoaXMpOwp9CgpjbGFzcyBIVHJ5QmxvY2tJbmZvcm1hdGlvbiBpbXBsZW1lbnRzIEhTdGF0ZW1lbnRJbmZvcm1hdGlvbiB7CiAgZmluYWwgSFN0YXRlbWVudEluZm9ybWF0aW9uIGJvZHk7CiAgZmluYWwgSExvY2FsVmFsdWUgY2F0Y2hWYXJpYWJsZTsKICBmaW5hbCBIU3RhdGVtZW50SW5mb3JtYXRpb24gY2F0Y2hCbG9jazsKICBmaW5hbCBIU3RhdGVtZW50SW5mb3JtYXRpb24gZmluYWxseUJsb2NrOwogIEhUcnlCbG9ja0luZm9ybWF0aW9uKAogICAgICB0aGlzLmJvZHksIHRoaXMuY2F0Y2hWYXJpYWJsZSwgdGhpcy5jYXRjaEJsb2NrLCB0aGlzLmZpbmFsbHlCbG9jayk7CgogIEBvdmVycmlkZQogIEhCYXNpY0Jsb2NrIGdldCBzdGFydCA9PiBib2R5LnN0YXJ0OwogIEBvdmVycmlkZQogIEhCYXNpY0Jsb2NrIGdldCBlbmQgPT4KICAgICAgZmluYWxseUJsb2NrID09IG51bGwgPyBjYXRjaEJsb2NrLmVuZCA6IGZpbmFsbHlCbG9jay5lbmQ7CgogIEBvdmVycmlkZQogIGJvb2wgYWNjZXB0KEhTdGF0ZW1lbnRJbmZvcm1hdGlvblZpc2l0b3IgdmlzaXRvcikgPT4KICAgICAgdmlzaXRvci52aXNpdFRyeUluZm8odGhpcyk7Cn0KCmNsYXNzIEhTd2l0Y2hCbG9ja0luZm9ybWF0aW9uIGltcGxlbWVudHMgSFN0YXRlbWVudEluZm9ybWF0aW9uIHsKICBmaW5hbCBIRXhwcmVzc2lvbkluZm9ybWF0aW9uIGV4cHJlc3Npb247CiAgZmluYWwgTGlzdDxIU3RhdGVtZW50SW5mb3JtYXRpb24+IHN0YXRlbWVudHM7CiAgZmluYWwgSnVtcFRhcmdldCB0YXJnZXQ7CiAgZmluYWwgTGlzdDxMYWJlbERlZmluaXRpb24+IGxhYmVsczsKICBmaW5hbCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbjsKCiAgSFN3aXRjaEJsb2NrSW5mb3JtYXRpb24odGhpcy5leHByZXNzaW9uLCB0aGlzLnN0YXRlbWVudHMsIHRoaXMudGFyZ2V0LAogICAgICB0aGlzLmxhYmVscywgdGhpcy5zb3VyY2VJbmZvcm1hdGlvbik7CgogIEBvdmVycmlkZQogIEhCYXNpY0Jsb2NrIGdldCBzdGFydCA9PiBleHByZXNzaW9uLnN0YXJ0OwogIEBvdmVycmlkZQogIEhCYXNpY0Jsb2NrIGdldCBlbmQgewogICAgLy8gV2UgZG9uJ3QgY3JlYXRlIGEgc3dpdGNoIGJsb2NrIGlmIHRoZXJlIGFyZSBubyBjYXNlcy4KICAgIGFzc2VydCghc3RhdGVtZW50cy5pc0VtcHR5KTsKICAgIHJldHVybiBzdGF0ZW1lbnRzLmxhc3QuZW5kOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBhY2NlcHQoSFN0YXRlbWVudEluZm9ybWF0aW9uVmlzaXRvciB2aXNpdG9yKSA9PgogICAgICB2aXNpdG9yLnZpc2l0U3dpdGNoSW5mbyh0aGlzKTsKfQoKLy8vIFJlYWRzIHJhdyByZWlmaWVkIHR5cGUgaW5mbyBmcm9tIGFuIG9iamVjdC4KY2xhc3MgSFR5cGVJbmZvUmVhZFJhdyBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgSFR5cGVJbmZvUmVhZFJhdyhISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIsIEFic3RyYWN0VmFsdWUgaW5zdHJ1Y3Rpb25UeXBlKQogICAgICA6IHN1cGVyKDxISW5zdHJ1Y3Rpb24+W3JlY2VpdmVyXSwgaW5zdHJ1Y3Rpb25UeXBlKSB7CiAgICBzZXRVc2VHdm4oKTsKICB9CgogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0VHlwZUluZm9SZWFkUmF3KHRoaXMpOwoKICBAb3ZlcnJpZGUKICBib29sIGNhblRocm93KEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLlRZUEVfSU5GT19SRUFEX1JBV19UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiBvdGhlciBpcyBIVHlwZUluZm9SZWFkUmF3OwoKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSFR5cGVJbmZvUmVhZFJhdyBvdGhlcikgewogICAgcmV0dXJuIHRydWU7CiAgfQp9CgovLy8gUmVhZHMgYSB0eXBlIHZhcmlhYmxlIGZyb20gYW4gb2JqZWN0LiBUaGUgcmVhZCBtYXkgYmUgYSBzaW1wbGUgaW5kZXhpbmcgb2YKLy8vIHRoZSB0eXBlIHBhcmFtZXRlcnMgb3IgaXQgbWF5IHJlcXVpcmUgJ3N1YnN0aXR1dGlvbicuIFRoZXJlIG1heSBiZSBhbgovLy8gaW50ZXJjZXB0b3IgYXJndW1lbnQgdG8gYWNjZXNzIHRoZSBzdWJzdGl0dXRpb24gb2YgbmF0aXZlIGNsYXNzZXMuCmNsYXNzIEhUeXBlSW5mb1JlYWRWYXJpYWJsZSBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgLy8vIFRoZSB0eXBlIHZhcmlhYmxlIGJlaW5nIHJlYWQuCiAgZmluYWwgVHlwZVZhcmlhYmxlVHlwZSB2YXJpYWJsZTsKICBmaW5hbCBib29sIGlzSW50ZXJjZXB0ZWQ7CgogIEhUeXBlSW5mb1JlYWRWYXJpYWJsZS5pbnRlcmNlcHRlZCh0aGlzLnZhcmlhYmxlLCBISW5zdHJ1Y3Rpb24gaW50ZXJjZXB0b3IsCiAgICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciwgQWJzdHJhY3RWYWx1ZSBpbnN0cnVjdGlvblR5cGUpCiAgICAgIDogaXNJbnRlcmNlcHRlZCA9IHRydWUsCiAgICAgICAgc3VwZXIoPEhJbnN0cnVjdGlvbj5baW50ZXJjZXB0b3IsIHJlY2VpdmVyXSwgaW5zdHJ1Y3Rpb25UeXBlKSB7CiAgICBzZXRVc2VHdm4oKTsKICB9CgogIEhUeXBlSW5mb1JlYWRWYXJpYWJsZS5ub0ludGVyY2VwdG9yKAogICAgICB0aGlzLnZhcmlhYmxlLCBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIsIEFic3RyYWN0VmFsdWUgaW5zdHJ1Y3Rpb25UeXBlKQogICAgICA6IGlzSW50ZXJjZXB0ZWQgPSBmYWxzZSwKICAgICAgICBzdXBlcig8SEluc3RydWN0aW9uPltyZWNlaXZlcl0sIGluc3RydWN0aW9uVHlwZSkgewogICAgc2V0VXNlR3ZuKCk7CiAgfQoKICBISW5zdHJ1Y3Rpb24gZ2V0IGludGVyY2VwdG9yIHsKICAgIGFzc2VydChpc0ludGVyY2VwdGVkKTsKICAgIHJldHVybiBpbnB1dHMuZmlyc3Q7CiAgfQoKICBISW5zdHJ1Y3Rpb24gZ2V0IG9iamVjdCA9PiBpbnB1dHMubGFzdDsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRUeXBlSW5mb1JlYWRWYXJpYWJsZSh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjYW5UaHJvdyhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5UWVBFX0lORk9fUkVBRF9WQVJJQUJMRV9UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiBvdGhlciBpcyBIVHlwZUluZm9SZWFkVmFyaWFibGU7CgogIEBvdmVycmlkZQogIGJvb2wgZGF0YUVxdWFscyhIVHlwZUluZm9SZWFkVmFyaWFibGUgb3RoZXIpIHsKICAgIHJldHVybiB2YXJpYWJsZSA9PSBvdGhlci52YXJpYWJsZTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdIVHlwZUluZm9SZWFkVmFyaWFibGUoJHZhcmlhYmxlKSc7Cn0KCmVudW0gVHlwZUluZm9FeHByZXNzaW9uS2luZCB7IENPTVBMRVRFLCBJTlNUQU5DRSB9CgovLy8gQ29uc3RydWN0cyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgY2xvc2VkIG9yIGdyb3VuZC10ZXJtIHR5cGUgKHRoYXQgaXMsIGEgdHlwZQovLy8gd2l0aG91dCB0eXBlIHZhcmlhYmxlcykuCi8vLwovLy8gVGhlcmUgYXJlIHR3byBmb3JtczoKLy8vCi8vLyAtIENPTVBMRVRFOiBBIGNvbXBsZXRlIGZvcm0gdGhhdCBpcyBzZWxmIGNvbnRhaW5lZCwgdXNlZCBmb3IgdGhlIHZhbHVlcyBvZgovLy8gICB0eXBlIHBhcmFtZXRlcnMgYW5kIG5vbi1yYXcgaXMtY2hlY2tzLgovLy8KLy8vIC0gSU5TVEFOQ0U6IEEgaGVhZGxlc3MgZmxhdCBmb3JtIGZvciByZXByZXNlbnRpbmcgdGhlIHNlcXVlbmNlIG9mIHZhbHVlcyBvZgovLy8gICB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9mIGFuIGluc3RhbmNlIG9mIGEgZ2VuZXJpYyB0eXBlLgovLy8KLy8vIFRoZSBDT01QTEVURSBmb3JtIHZhbHVlIGlzIGNvbnN0cnVjdGVkIGZyb20gW2RhcnRUeXBlXSBieSByZXBsYWNpbmcgdGhlIHR5cGUKLy8vIHZhcmlhYmxlcyB3aXRoIGNvbnNlY3V0aXZlIHZhbHVlcyBmcm9tIFtpbnB1dHNdLCBpbiB0aGUgb3JkZXIgZ2VuZXJhdGVkIGJ5Ci8vLyBbRGFydFR5cGUuZm9yRWFjaFR5cGVWYXJpYWJsZV0uICBUaGUgdHlwZSB2YXJpYWJsZXMgaW4gW2RhcnRUeXBlXSBhcmUKLy8vIHRyZWF0ZWQgYXMgJ2hvbGVzJyBpbiB0aGUgdGVybSwgd2hpY2ggbWVhbnMgdGhhdCBpdCBtdXN0IGJlIGVuc3VyZWQgYXQKLy8vIGNvbnN0cnVjdGlvbiwgdGhhdCBkdXBsaWNhdGUgb2NjdXJlbmNlcyBvZiBhIHR5cGUgdmFyaWFibGUgaW4gW2RhcnRUeXBlXSBhcmUKLy8vIGFzc2lnbmVkIHRoZSBzYW1lIHZhbHVlLgovLy8KLy8vIFRoZSBJTlNUQU5DRSBmb3JtIGlzIGNvbnN0cnVjdGVkIGFzIGEgbGlzdCBvZiBbaW5wdXRzXS4gVGhpcyBpcyB0aGUgc2FtZSBhcwovLy8gdGhlIENPTVBMRVRFIGZvcm0gZm9yIHRoZSAndGhpc1R5cGUnLCBleGNlcHQgdGhlIHJvb3QgdGVybSdzIHR5cGUgaXMKLy8vIG1pc3Npbmc7IHRoaXMgaXMgaW1wbGljaXQgYXMgdGhlIHJhdyB0eXBlIG9mIGluc3RhbmNlLiAgVGhlIFtkYXJ0VHlwZV0gb2YKLy8vIHRoZSBJTlNUQU5DRSBmb3JtIG11c3QgYmUgdGhlIHRoaXNUeXBlIG9mIHNvbWUgY2xhc3MuCi8vLwovLy8gV2Ugd2FudCB0byByZW1vdmUgdGhlIGNvbnN0cmFpbnMgb24gdGhlIElOU1RBTkNFIGZvcm0uIEluIHRoZSBtZWFudGltZSB3ZQovLy8gZ2V0IGJ5IHdpdGggYSB0cmVlIG9mIFR5cGVFeHByZXNzaW9ucy4gIENvbnNpZGVyOgovLy8KLy8vICAgICBjbGFzcyBGb288VD4gewovLy8gICAgICAgLi4uIG5ldyBTZXQ8TGlzdDxUPj4oKQovLy8gICAgIH0KLy8vICAgICBjbGFzcyBTZXQ8RTE+IHsKLy8vICAgICAgIGZhY3RvcnkgU2V0KCkgPT4gbmV3IF9MaW5rZWRIYXNoU2V0PEUxPigpOwovLy8gICAgIH0KLy8vICAgICBjbGFzcyBMaXN0PEUyPiB7IC4uLiB9Ci8vLyAgICAgY2xhc3MgX0xpbmtlZEhhc2hTZXQ8RTM+IHsgLi4uIH0KLy8vCi8vLyBBZnRlciBpbmxpbmluZyB0aGUgZmFjdG9yeSBjb25zdHJ1Y3RvciBmb3IgYFNldDxFMT5gLCB0aGUgSENyZWF0ZSBzaG91bGQKLy8vIGhhdmUgdHlwZSBgX0xpbmtlZEhhc2hTZXQ8TGlzdDxUPj5gIGFuZCB0aGUgVHlwZUV4cHJlc3Npb24gc2hvdWxkIGJlIGEgdHJlZToKLy8vCi8vLyAgICBIQ3JlYXRlKGRhcnRUeXBlOiBfTGlua2VkSGFzaFNldDxMaXN0PFQ+PiwKLy8vICAgICAgICBbXSwgLy8gTm8gYXJndW1lbnRzCi8vLyAgICAgICAgSFR5cGVJbmZvRXhwcmVzc2lvbihJTlNUQU5DRSwKLy8vICAgICAgICAgICAgZGFydFR5cGU6IF9MaW5rZWRIYXNoU2V0PEUzPiwgLy8gX0xpbmtlZEhhc2hTZXQncyB0aGlzVHlwZQovLy8gICAgICAgICAgICBIVHlwZUluZm9FeHByZXNzaW9uKENPTVBMRVRFLCAgLy8gRTMgPSBMaXN0PFQ+Ci8vLyAgICAgICAgICAgICAgICBkYXJ0VHlwZTogTGlzdDxFMj4sCi8vLyAgICAgICAgICAgICAgICBIVHlwZUluZm9SZWFkVmFyaWFibGUodGhpcywgVCkpKSkgLy8gRTIgPSBUCgovLyBUT0RPKHNyYSk6IFRoZSBJTlNUQU5DRSBmb3JtIHJlcXVpcmVzIHRoZSBhY3R1YWwgaW5zdGFuY2UgZm9yIGZ1bGwKLy8gaW50ZXJwcmV0YXRpb24uIElmIHRoZSBDT01QTEVURSBmb3JtIHdhcyB1c2VkIG9uIGluc3RhbmNlcywgdGhlbiB3ZSBjb3VsZAovLyBzaW1wbGlmeSBIVHlwZUluZm9SZWFkVmFyaWFibGUgd2l0aG91dCBhbiBvYmplY3QuCgpjbGFzcyBIVHlwZUluZm9FeHByZXNzaW9uIGV4dGVuZHMgSEluc3RydWN0aW9uIHsKICBmaW5hbCBUeXBlSW5mb0V4cHJlc3Npb25LaW5kIGtpbmQ7CiAgZmluYWwgRGFydFR5cGUgZGFydFR5cGU7CgogIC8vLyBgdHJ1ZWAgaWYgdGhpcwogIGZpbmFsIGJvb2wgaXNUeXBlVmFyaWFibGVSZXBsYWNlbWVudDsKCiAgSFR5cGVJbmZvRXhwcmVzc2lvbih0aGlzLmtpbmQsIHRoaXMuZGFydFR5cGUsIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMsCiAgICAgIEFic3RyYWN0VmFsdWUgaW5zdHJ1Y3Rpb25UeXBlLAogICAgICB7dGhpcy5pc1R5cGVWYXJpYWJsZVJlcGxhY2VtZW50OiBmYWxzZX0pCiAgICAgIDogc3VwZXIoaW5wdXRzLCBpbnN0cnVjdGlvblR5cGUpIHsKICAgIHNldFVzZUd2bigpOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRUeXBlSW5mb0V4cHJlc3Npb24odGhpcyk7CgogIEBvdmVycmlkZQogIGJvb2wgY2FuVGhyb3coQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uVFlQRV9JTkZPX0VYUFJFU1NJT05fVFlQRUNPREU7CiAgQG92ZXJyaWRlCiAgYm9vbCB0eXBlRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gb3RoZXIgaXMgSFR5cGVJbmZvRXhwcmVzc2lvbjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhUeXBlSW5mb0V4cHJlc3Npb24gb3RoZXIpIHsKICAgIHJldHVybiBraW5kID09IG90aGVyLmtpbmQgJiYgZGFydFR5cGUgPT0gb3RoZXIuZGFydFR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnSFR5cGVJbmZvRXhwcmVzc2lvbigka2luZEFzU3RyaW5nLCAkZGFydFR5cGUpJzsKCiAgLy8gaWdub3JlOiBNSVNTSU5HX1JFVFVSTgogIFN0cmluZyBnZXQga2luZEFzU3RyaW5nIHsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIFR5cGVJbmZvRXhwcmVzc2lvbktpbmQuQ09NUExFVEU6CiAgICAgICAgcmV0dXJuICdDT01QTEVURSc7CiAgICAgIGNhc2UgVHlwZUluZm9FeHByZXNzaW9uS2luZC5JTlNUQU5D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IEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuc2VsZWN0b3I7CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24vbmFtZXMuZGFydCcgc2hvdyBOYW1lczsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdHlfdXRpbHMuZGFydCcgYXMgdXRpbHM7CmltcG9ydCAnLi4vZWxlbWVudHMvbmFtZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvb3BlcmF0b3JzLmRhcnQnOwppbXBvcnQgJy4uL2tlcm5lbC9pbnZvY2F0aW9uX21pcnJvcl9jb25zdGFudHMuZGFydCc7CmltcG9ydCAnLi4vc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JyBzaG93IEhhc2hpbmc7CmltcG9ydCAnY2FsbF9zdHJ1Y3R1cmUuZGFydCcgc2hvdyBDYWxsU3RydWN0dXJlOwoKY2xhc3MgU2VsZWN0b3JLaW5kIHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgaGFzaENvZGU7CiAgY29uc3QgU2VsZWN0b3JLaW5kKHRoaXMubmFtZSwgdGhpcy5oYXNoQ29kZSk7CgogIHN0YXRpYyBjb25zdCBTZWxlY3RvcktpbmQgR0VUVEVSID0gY29uc3QgU2VsZWN0b3JLaW5kKCdnZXR0ZXInLCAwKTsKICBzdGF0aWMgY29uc3QgU2VsZWN0b3JLaW5kIFNFVFRFUiA9IGNvbnN0IFNlbGVjdG9yS2luZCgnc2V0dGVyJywgMSk7CiAgc3RhdGljIGNvbnN0IFNlbGVjdG9yS2luZCBDQUxMID0gY29uc3QgU2VsZWN0b3JLaW5kKCdjYWxsJywgMik7CiAgc3RhdGljIGNvbnN0IFNlbGVjdG9yS2luZCBPUEVSQVRPUiA9IGNvbnN0IFNlbGVjdG9yS2luZCgnb3BlcmF0b3InLCAzKTsKICBzdGF0aWMgY29uc3QgU2VsZWN0b3JLaW5kIElOREVYID0gY29uc3QgU2VsZWN0b3JLaW5kKCdpbmRleCcsIDQpOwogIHN0YXRpYyBjb25zdCBTZWxlY3RvcktpbmQgU1BFQ0lBTCA9IGNvbnN0IFNlbGVjdG9yS2luZCgnc3BlY2lhbCcsIDUpOwoKICBpbnQgZ2V0IGluZGV4ID0+IGhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBuYW1lOwoKICBzdGF0aWMgTGlzdDxTZWxlY3RvcktpbmQ+IHZhbHVlcyA9IGNvbnN0IDxTZWxlY3RvcktpbmQ+WwogICAgR0VUVEVSLAogICAgU0VUVEVSLAogICAgQ0FMTCwKICAgIE9QRVJBVE9SLAogICAgSU5ERVgsCiAgICBTUEVDSUFMCiAgXTsKfQoKY2xhc3MgU2VsZWN0b3IgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbU2VsZWN0b3JdIG9iamVjdHMgaW4gYSBkZWJ1Z2dpbmcKICAvLy8gZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnc2VsZWN0b3InOwoKICBmaW5hbCBTZWxlY3RvcktpbmQga2luZDsKICBmaW5hbCBOYW1lIG1lbWJlck5hbWU7CiAgZmluYWwgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgaGFzaENvZGU7CgogIGludCBnZXQgYXJndW1lbnRDb3VudCA9PiBjYWxsU3RydWN0dXJlLmFyZ3VtZW50Q291bnQ7CiAgaW50IGdldCBuYW1lZEFyZ3VtZW50Q291bnQgPT4gY2FsbFN0cnVjdHVyZS5uYW1lZEFyZ3VtZW50Q291bnQ7CiAgaW50IGdldCBwb3NpdGlvbmFsQXJndW1lbnRDb3VudCA9PiBjYWxsU3RydWN0dXJlLnBvc2l0aW9uYWxBcmd1bWVudENvdW50OwogIGludCBnZXQgdHlwZUFyZ3VtZW50Q291bnQgPT4gY2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRDb3VudDsKICBMaXN0PFN0cmluZz4gZ2V0IG5hbWVkQXJndW1lbnRzID0+IGNhbGxTdHJ1Y3R1cmUubmFtZWRBcmd1bWVudHM7CgogIFN0cmluZyBnZXQgbmFtZSA9PiBtZW1iZXJOYW1lLnRleHQ7CgogIExpYnJhcnlFbnRpdHkgZ2V0IGxpYnJhcnkgPT4gbWVtYmVyTmFtZS5saWJyYXJ5OwoKICBzdGF0aWMgYm9vbCBpc09wZXJhdG9yTmFtZShTdHJpbmcgbmFtZSkgewogICAgaWYgKG5hbWUgPT0gTmFtZXMuSU5ERVhfU0VUX05BTUUudGV4dCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSBVbmFyeU9wZXJhdG9yLk5FR0FURS5zZWxlY3Rvck5hbWUpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgaWYgKG5hbWUgPT0gVW5hcnlPcGVyYXRvci5DT01QTEVNRU5ULnNlbGVjdG9yTmFtZSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvci5wYXJzZVVzZXJEZWZpbmFibGUobmFtZSkgIT0gbnVsbDsKICAgIH0KICB9CgogIFNlbGVjdG9yLmludGVybmFsKAogICAgICB0aGlzLmtpbmQsIHRoaXMubWVtYmVyTmFtZSwgdGhpcy5jYWxsU3RydWN0dXJlLCB0aGlzLmhhc2hDb2RlKSB7CiAgICBhc3NlcnQoCiAgICAgICAga2luZCA9PSBTZWxlY3RvcktpbmQuSU5ERVggfHwKICAgICAgICAgICAgKG1lbWJlck5hbWUgIT0gTmFtZXMuSU5ERVhfTkFNRSAmJgogICAgICAgICAgICAgICAgbWVtYmVyTmFtZSAhPSBOYW1lcy5JTkRFWF9TRVRfTkFNRSksCiAgICAgICAgZmFpbGVkQXQoTk9fTE9DQVRJT05fU1BBTk5BQkxFLAogICAgICAgICAgICAia2luZD0ka2luZCxtZW1iZXJOYW1lPSRtZW1iZXJOYW1lLGNhbGxTdHJ1Y3R1cmU6JGNhbGxTdHJ1Y3R1cmUiKSk7CiAgICBhc3NlcnQoCiAgICAgICAga2luZCA9PSBTZWxlY3RvcktpbmQuT1BFUkFUT1IgfHwKICAgICAgICAgICAga2luZCA9PSBTZWxlY3RvcktpbmQuSU5ERVggfHwKICAgICAgICAgICAgIWlzT3BlcmF0b3JOYW1lKG1lbWJlck5hbWUudGV4dCkgfHwKICAgICAgICAgICAgbWVtYmVyTmFtZS50ZXh0ID09ICc/PycsCiAgICAgICAgZmFpbGVkQXQoTk9fTE9DQVRJT05fU1BBTk5BQkxFLAogICAgICAgICAgICAia2luZD0ka2luZCxtZW1iZXJOYW1lPSRtZW1iZXJOYW1lLGNhbGxTdHJ1Y3R1cmU6JGNhbGxTdHJ1Y3R1cmUiKSk7CiAgICBhc3NlcnQoCiAgICAgICAga2luZCA9PSBTZWxlY3RvcktpbmQuQ0FMTCB8fAogICAgICAgICAgICBraW5kID09IFNlbGVjdG9yS2luZC5HRVRURVIgfHwKICAgICAgICAgICAga2luZCA9PSBTZWxlY3RvcktpbmQuU0VUVEVSIHx8CiAgICAgICAgICAgIGlzT3BlcmF0b3JOYW1lKG1lbWJlck5hbWUudGV4dCkgfHwKICAgICAgICAgICAgbWVtYmVyTmFtZS50ZXh0ID09ICc/PycsCiAgICAgICAgZmFpbGVkQXQoTk9fTE9DQVRJT05fU1BBTk5BQkxFLAogICAgICAgICAgICAia2luZD0ka2luZCxtZW1iZXJOYW1lPSRtZW1iZXJOYW1lLGNhbGxTdHJ1Y3R1cmU6JGNhbGxTdHJ1Y3R1cmUiKSk7CiAgfQoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBFeHRyYWN0IGNhY2hpbmcuCiAgc3RhdGljIE1hcDxpbnQsIExpc3Q8U2VsZWN0b3I+PiBjYW5vbmljYWxpemVkVmFsdWVzID0KICAgICAgbmV3IE1hcDxpbnQsIExpc3Q8U2VsZWN0b3I+PigpOwoKICBmYWN0b3J5IFNlbGVjdG9yKFNlbGVjdG9yS2luZCBraW5kLCBOYW1lIG5hbWUsIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWF5YmUgdXNlIGVxdWFsaXR5IGluc3RlYWQgb2YgaW1wbGljaXQgaGFzaGluZy4KICAgIGludCBoYXNoQ29kZSA9IGNvbXB1dGVIYXNoQ29kZShraW5kLCBuYW1lLCBjYWxsU3RydWN0dXJlKTsKICAgIExpc3Q8U2VsZWN0b3I+IGxpc3QgPQogICAgICAgIGNhbm9uaWNhbGl6ZWRWYWx1ZXMucHV0SWZBYnNlbnQoaGFzaENvZGUsICgpID0+IDxTZWxlY3Rvcj5bXSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgU2VsZWN0b3IgZXhpc3RpbmcgPSBsaXN0W2ldOwogICAgICBpZiAoZXhpc3RpbmcubWF0Y2goa2luZCwgbmFtZSwgY2FsbFN0cnVjdHVyZSkpIHsKICAgICAgICBhc3NlcnQoZXhpc3RpbmcuaGFzaENvZGUgPT0gaGFzaENvZGUpOwogICAgICAgIHJldHVybiBleGlzdGluZzsKICAgICAgfQogICAgfQogICAgU2VsZWN0b3IgcmVzdWx0ID0KICAgICAgICBuZXcgU2VsZWN0b3IuaW50ZXJuYWwoa2luZCwgbmFtZSwgY2FsbFN0cnVjdHVyZSwgaGFzaENvZGUpOwogICAgbGlzdC5hZGQocmVzdWx0KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBmYWN0b3J5IFNlbGVjdG9yLmZyb21FbGVtZW50KE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBOYW1lIG5hbWUgPSBlbGVtZW50Lm1lbWJlck5hbWU7CiAgICBpZiAoZWxlbWVudC5pc0Z1bmN0aW9uKSB7CiAgICAgIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uID0gZWxlbWVudDsKICAgICAgaWYgKG5hbWUgPT0gTmFtZXMuSU5ERVhfTkFNRSkgewogICAgICAgIHJldHVybiBuZXcgU2VsZWN0b3IuaW5kZXgoKTsKICAgICAgfSBlbHNlIGlmIChuYW1lID09IE5hbWVzLklOREVYX1NFVF9OQU1FKSB7CiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rvci5pbmRleFNldCgpOwogICAgICB9CiAgICAgIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSA9IGZ1bmN0aW9uLnBhcmFtZXRlclN0cnVjdHVyZS5jYWxsU3RydWN0dXJlOwogICAgICBpZiAoaXNPcGVyYXRvck5hbWUoZWxlbWVudC5uYW1lKSkgewogICAgICAgIC8vIE9wZXJhdG9ycyBjYW5ub3QgaGF2ZSBuYW1lZCBhcmd1bWVudHMsIGhvd2V2ZXIsIHRoYXQgZG9lc24ndCBwcmV2ZW50CiAgICAgICAgLy8gYSB1c2VyIGZyb20gZGVjbGFyaW5nIHN1Y2ggYW4gb3BlcmF0b3IuCiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RvcihTZWxlY3RvcktpbmQuT1BFUkFUT1IsIG5hbWUsIGNhbGxTdHJ1Y3R1cmUpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBuZXcgU2VsZWN0b3IuY2FsbChuYW1lLCBjYWxsU3RydWN0dXJlKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChlbGVtZW50LmlzU2V0dGVyKSB7CiAgICAgIHJldHVybiBuZXcgU2VsZWN0b3Iuc2V0dGVyKG5hbWUpOwogICAgfSBlbHNlIGlmIChlbGVtZW50LmlzR2V0dGVyKSB7CiAgICAgIHJldHVybiBuZXcgU2VsZWN0b3IuZ2V0dGVyKG5hbWUpOwogICAgfSBlbHNlIGlmIChlbGVtZW50LmlzRmllbGQpIHsKICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rvci5nZXR0ZXIobmFtZSk7CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQuaXNDb25zdHJ1Y3RvcikgewogICAgICByZXR1cm4gbmV3IFNlbGVjdG9yLmNhbGxDb25zdHJ1Y3RvcihuYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IGZhaWxlZEF0KGVsZW1lbnQsICJDYW4ndCBnZXQgc2VsZWN0b3IgZnJvbSAkZWxlbWVudCIpOwogICAgfQogIH0KCiAgZmFjdG9yeSBTZWxlY3Rvci5nZXR0ZXIoTmFtZSBuYW1lKSA9PgogICAgICBuZXcgU2VsZWN0b3IoU2VsZWN0b3JLaW5kLkdFVFRFUiwgbmFtZS5nZXR0ZXIsIENhbGxTdHJ1Y3R1cmUuTk9fQVJHUyk7CgogIGZhY3RvcnkgU2VsZWN0b3Iuc2V0dGVyKE5hbWUgbmFtZSkgPT4KICAgICAgbmV3IFNlbGVjdG9yKFNlbGVjdG9yS2luZC5TRVRURVIsIG5hbWUuc2V0dGVyLCBDYWxsU3RydWN0dXJlLk9ORV9BUkcpOwoKICBmYWN0b3J5IFNlbGVjdG9yLnVuYXJ5T3BlcmF0b3IoU3RyaW5nIG5hbWUpID0+IG5ldyBTZWxlY3RvcigKICAgICAgU2VsZWN0b3JLaW5kLk9QRVJBVE9SLAogICAgICBuZXcgUHVibGljTmFtZSh1dGlscy5jb25zdHJ1Y3RPcGVyYXRvck5hbWUobmFtZSwgdHJ1ZSkpLAogICAgICBDYWxsU3RydWN0dXJlLk5PX0FSR1MpOwoKICBmYWN0b3J5IFNlbGVjdG9yLmJpbmFyeU9wZXJhdG9yKFN0cmluZyBuYW1lKSA9PiBuZXcgU2VsZWN0b3IoCiAgICAgIFNlbGVjdG9yS2luZC5PUEVSQVRPUiwKICAgICAgbmV3IFB1YmxpY05hbWUodXRpbHMuY29uc3RydWN0T3BlcmF0b3JOYW1lKG5hbWUsIGZhbHNlKSksCiAgICAgIENhbGxTdHJ1Y3R1cmUuT05FX0FSRyk7CgogIGZhY3RvcnkgU2VsZWN0b3IuaW5kZXgoKSA9PgogICAgICBuZXcgU2VsZWN0b3IoU2VsZWN0b3JLaW5kLklOREVYLCBOYW1lcy5JTkRFWF9OQU1FLCBDYWxsU3RydWN0dXJlLk9ORV9BUkcpOwoKICBmYWN0b3J5IFNlbGVjdG9yLmluZGV4U2V0KCkgPT4gbmV3IFNlbGVjdG9yKAogICAgICBTZWxlY3RvcktpbmQuSU5ERVgsIE5hbWVzLklOREVYX1NFVF9OQU1FLCBDYWxsU3RydWN0dXJlLlRXT19BUkdTKTsKCiAgZmFjdG9yeSBTZWxlY3Rvci5jYWxsKE5hbWUgbmFtZSwgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlKSA9PgogICAgICBuZXcgU2VsZWN0b3IoU2VsZWN0b3JLaW5kLkNBTEwsIG5hbWUsIGNhbGxTdHJ1Y3R1cmUpOwoKICBmYWN0b3J5IFNlbGVjdG9yLmNhbGxDbG9zdXJlKGludCBhcml0eSwKICAgICAgICAgIFtMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHMsIGludCB0eXBlQXJndW1lbnRDb3VudCA9IDBdKSA9PgogICAgICBuZXcgU2VsZWN0b3IoU2VsZWN0b3JLaW5kLkNBTEwsIE5hbWVzLmNhbGwsCiAgICAgICAgICBuZXcgQ2FsbFN0cnVjdHVyZShhcml0eSwgbmFtZWRBcmd1bWVudHMsIHR5cGVBcmd1bWVudENvdW50KSk7CgogIGZhY3RvcnkgU2VsZWN0b3IuY2FsbENsb3N1cmVGcm9tKFNlbGVjdG9yIHNlbGVjdG9yKSA9PgogICAgICBuZXcgU2VsZWN0b3IoU2VsZWN0b3JLaW5kLkNBTEwsIE5hbWVzLmNhbGwsIHNlbGVjdG9yLmNhbGxTdHJ1Y3R1cmUpOwoKICBmYWN0b3J5IFNlbGVjdG9yLmNhbGxDb25zdHJ1Y3RvcihOYW1lIG5hbWUsCiAgICAgICAgICBbaW50IGFyaXR5ID0gMCwgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzXSkgPT4KICAgICAgbmV3IFNlbGVjdG9yKAogICAgICAgICAgU2VsZWN0b3JLaW5kLkNBTEwsIG5hbWUsIG5ldyBDYWxsU3RydWN0dXJlKGFyaXR5LCBuYW1lZEFyZ3VtZW50cykpOwoKICBmYWN0b3J5IFNlbGVjdG9yLmNhbGxEZWZhdWx0Q29uc3RydWN0b3IoKSA9PiBuZXcgU2VsZWN0b3IoCiAgICAgIFNlbGVjdG9yS2luZC5DQUxMLCBjb25zdCBQdWJsaWNOYW1lKCcnKSwgQ2FsbFN0cnVjdHVyZS5OT19BUkdTKTsKCiAgLy8gVE9ETygzMTk1Myk6IFJlbW92ZSB0aGlzIGlmIHdlIGNhbiBpbXBsZW1lbnQgdmlhIHN0YXRpYyBjYWxscy4KICBmYWN0b3J5IFNlbGVjdG9yLmdlbmVyaWNJbnN0YW50aWF0aW9uKGludCB0eXBlQXJndW1lbnRzKSA9PiBuZXcgU2VsZWN0b3IoCiAgICAgIFNlbGVjdG9yS2luZC5TUEVDSUFMLAogICAgICBOYW1lcy5nZW5lcmljSW5zdGFudGlhdGlvbiwKICAgICAgbmV3IENhbGxTdHJ1Y3R1cmUoMCwgbnVsbCwgdHlwZUFyZ3VtZW50cykpOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW1NlbGVjdG9yXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IFNlbGVjdG9yLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBTZWxlY3RvcktpbmQga2luZCA9IHNvdXJjZS5yZWFkRW51bShTZWxlY3RvcktpbmQudmFsdWVzKTsKICAgIGJvb2wgaXNTZXR0ZXIgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIExpYnJhcnlFbnRpdHkgbGlicmFyeSA9IHNvdXJjZS5yZWFkTGlicmFyeU9yTnVsbCgpOwogICAgU3RyaW5nIHRleHQgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlID0gbmV3IENhbGxTdHJ1Y3R1cmUucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IFNlbGVjdG9yKAogICAgICAgIGtpbmQsIG5ldyBOYW1lKHRleHQsIGxpYnJhcnksIGlzU2V0dGVyOiBpc1NldHRlciksIGNhbGxTdHJ1Y3R1cmUpOwogIH0KCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbU2VsZWN0b3JdIHRvIFtzaW5rXS4KICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlRW51bShraW5kKTsKICAgIHNpbmsud3JpdGVCb29sKG1lbWJlck5hbWUuaXNTZXR0ZXIpOwogICAgc2luay53cml0ZUxpYnJhcnlPck51bGwobWVtYmVyTmFtZS5saWJyYXJ5KTsKICAgIHNpbmsud3JpdGVTdHJpbmcobWVtYmVyTmFtZS50ZXh0KTsKICAgIGNhbGxTdHJ1Y3R1cmUud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIGJvb2wgZ2V0IGlzR2V0dGVyID0+IGtpbmQgPT0gU2VsZWN0b3JLaW5kLkdFVFRFUjsKICBib29sIGdldCBpc1NldHRlciA9PiBraW5kID09IFNlbGVjdG9yS2luZC5TRVRURVI7CiAgYm9vbCBnZXQgaXNDYWxsID0+IGtpbmQgPT0gU2VsZWN0b3JLaW5kLkNBTEw7CiAgYm9vbCBnZXQgaXNDbG9zdXJlQ2FsbCA9PiBpc0NhbGwgJiYgbWVtYmVyTmFtZSA9PSBOYW1lcy5DQUxMX05BTUU7CgogIGJvb2wgZ2V0IGlzSW5kZXggPT4ga2luZCA9PSBTZWxlY3RvcktpbmQuSU5ERVggJiYgYXJndW1lbnRDb3VudCA9PSAxOwogIGJvb2wgZ2V0IGlzSW5kZXhTZXQgPT4ga2luZCA9PSBTZWxlY3RvcktpbmQuSU5ERVggJiYgYXJndW1lbnRDb3VudCA9PSAyOwoKICBib29sIGdldCBpc09wZXJhdG9yID0+IGtpbmQgPT0gU2VsZWN0b3JLaW5kLk9QRVJBVE9SOwogIGJvb2wgZ2V0IGlzVW5hcnlPcGVyYXRvciA9PiBpc09wZXJhdG9yICYmIGFyZ3VtZW50Q291bnQgPT0gMDsKCiAgLy8vIFRoZSBtZW1iZXIgbmFtZSBmb3IgaW52b2NhdGlvbiBtaXJyb3JzIGNyZWF0ZWQgZnJvbSB0aGlzIHNlbGVjdG9yLgogIFN0cmluZyBnZXQgaW52b2NhdGlvbk1pcnJvck1lbWJlck5hbWUgPT4gaXNTZXR0ZXIgPyAnJG5hbWU9JyA6IG5hbWU7CgogIGludCBnZXQgaW52b2NhdGlvbk1pcnJvcktpbmQgewogICAgaW50IGtpbmQgPSBpbnZvY2F0aW9uTWlycm9yTWV0aG9kS2luZDsKICAgIGlmIChpc0dldHRlcikgewogICAgICBraW5kID0gaW52b2NhdGlvbk1pcnJvckdldHRlcktpbmQ7CiAgICB9IGVsc2UgaWYgKGlzU2V0dGVyKSB7CiAgICAgIGtpbmQgPSBpbnZvY2F0aW9uTWlycm9yU2V0dGVyS2luZDsKICAgIH0KICAgIHJldHVybiBraW5kOwogIH0KCiAgYm9vbCBhcHBsaWVzVW5uYW1lZChNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgYXNzZXJ0KG5hbWUgPT0gZWxlbWVudC5uYW1lKTsKICAgIGlmIChtZW1iZXJOYW1lLmlzUHJpdmF0ZSAmJiBtZW1iZXJOYW1lLmxpYnJhcnkgIT0gZWxlbWVudC5saWJyYXJ5KSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IE1heWJlIHRoaXMgc2hvdWxkIGJlCiAgICAgIC8vIGBtZW1iZXJOYW1lICE9IGVsZW1lbnQubWVtYmVyTmFtZWAuCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChlbGVtZW50LmlzU2V0dGVyKSByZXR1cm4gaXNTZXR0ZXI7CiAgICBpZiAoZWxlbWVudC5pc0dldHRlcikgcmV0dXJuIGlzR2V0dGVyIHx8IGlzQ2FsbDsKICAgIGlmIChlbGVtZW50LmlzRmllbGQpIHsKICAgICAgcmV0dXJuIGlzU2V0dGVyID8gZWxlbWVudC5pc0Fzc2lnbmFibGUgOiBpc0dldHRlciB8fCBpc0NhbGw7CiAgICB9CiAgICBpZiAoaXNHZXR0ZXIpIHJldHVybiB0cnVlOwogICAgaWYgKGlzU2V0dGVyKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gc2lnbmF0dXJlQXBwbGllcyhlbGVtZW50KTsKICB9CgogIC8vLyBXaGV0aGVyIFt0aGlzXSBjb3VsZCBiZSBhIHZhbGlkIHNlbGVjdG9yIG9uIGBOdWxsYCB3aXRob3V0IHRocm93aW5nLgogIGJvb2wgYXBwbGllc1RvTnVsbFdpdGhvdXRUaHJvdygpIHsKICAgIHZhciBuYW1lID0gdGhpcy5uYW1lOwogICAgaWYgKGlzT3BlcmF0b3IgJiYgbmFtZSA9PSAiPT0iKSByZXR1cm4gdHJ1ZTsKICAgIC8vIEtub3duIGdldHRlcnMgYW5kIHZhbGlkIHRlYXItb2Zmcy4KICAgIGlmIChpc0dldHRlciAmJgogICAgICAgIChuYW1lID09ICJoYXNoQ29kZSIgfHwKICAgICAgICAgICAgbmFtZSA9PSAicnVudGltZVR5cGUiIHx8CiAgICAgICAgICAgIG5hbWUgPT0gInRvU3RyaW5nIiB8fAogICAgICAgICAgICBuYW1lID09ICJub1N1Y2hNZXRob2QiKSkgcmV0dXJuIHRydWU7CiAgICAvLyBDYWxsaW5nIHRvU3RyaW5nIGFsd2F5cyBzdWNjZWVkcywgY2FsbHMgdG8gYG5vU3VjaE1ldGhvZGAgKGV2ZW4gd2VsbAogICAgLy8gZm9ybWVkIGNhbGxzKSBhbHdheXMgdGhyb3cuCiAgICBpZiAoaXNDYWxsICYmCiAgICAgICAgbmFtZSA9PSAidG9TdHJpbmciICYmCiAgICAgICAgcG9zaXRpb25hbEFyZ3VtZW50Q291bnQgPT0gMCAmJgogICAgICAgIG5hbWVkQXJndW1lbnRDb3VudCA9PSAwKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgYm9vbCBzaWduYXR1cmVBcHBsaWVzKEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uKSB7CiAgICByZXR1cm4gY2FsbFN0cnVjdHVyZS5zaWduYXR1cmVBcHBsaWVzKGZ1bmN0aW9uLnBhcmFtZXRlclN0cnVjdHVyZSk7CiAgfQoKICBib29sIGFwcGxpZXMoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIGlmIChuYW1lICE9IGVsZW1lbnQubmFtZSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIGFwcGxpZXNVbm5hbWVkKGVsZW1lbnQpOwogIH0KCiAgYm9vbCBtYXRjaChTZWxlY3RvcktpbmQga2luZCwgTmFtZSBtZW1iZXJOYW1lLCBDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUpIHsKICAgIHJldHVybiB0aGlzLmtpbmQgPT0ga2luZCAmJgogICAgICAgIHRoaXMubWVtYmVyTmFtZSA9PSBtZW1iZXJOYW1lICYmCiAgICAgICAgdGhpcy5jYWxsU3RydWN0dXJlLm1hdGNoKGNhbGxTdHJ1Y3R1cmUpOwogIH0KCiAgc3RhdGljIGludCBjb21wdXRlSGFzaENvZGUoCiAgICAgIFNlbGVjdG9yS2luZCBraW5kLCBOYW1lIG5hbWUsIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSkgewogICAgLy8gQWRkIGJpdHMgZnJvbSBuYW1lIGFuZCBraW5kLgogICAgaW50IGhhc2ggPSBIYXNoaW5nLm1peEhhc2hDb2RlQml0cyhuYW1lLmhhc2hDb2RlLCBraW5kLmhhc2hDb2RlKTsKICAgIC8vIEFkZCBiaXRzIGZyb20gdGhlIGNhbGwgc3RydWN0dXJlLgogICAgcmV0dXJuIEhhc2hpbmcubWl4SGFzaENvZGVCaXRzKGhhc2gsIGNhbGxTdHJ1Y3R1cmUuaGFzaENvZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICdTZWxlY3Rvcigka2luZCwgJG5hbWUsICR7Y2FsbFN0cnVjdHVyZS5zdHJ1Y3R1cmVUb1N0cmluZygpfSknOwogIH0KCiAgU2VsZWN0b3IgdG9DYWxsU2VsZWN0b3IoKSA9PiBuZXcgU2VsZWN0b3IuY2FsbENsb3N1cmVGcm9tKHRoaXMpOwoKICAvLy8gUmV0dXJucyB0aGUgbm9uLWdlbmVyaWMgW1NlbGVjdG9yXSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc2VsZWN0b3IuCiAgU2VsZWN0b3IgdG9Ob25HZW5lcmljKCkgewogICAgcmV0dXJuIGNhbGxTdHJ1Y3R1cmUudHlwZUFyZ3VtZW50Q291bnQgPiAwCiAgICAgICAgPyBuZXcgU2VsZWN0b3Ioa2luZCwgbWVtYmVyTmFtZSwgY2FsbFN0cnVjdHVyZS5ub25HZW5lcmljKQogICAgICAgIDogdGhpczsKICB9Cn0KgUgATk48ARoBGSokMSElNS4pMQEVFQwWMAFGRkJKREgBHQEMHQE7DAwKDgsMBQIBEUwTKAEbGSUBDBYBOEJMQEMBJgEzASwtEzwTQBMNPgYEARVHDCYvNShQDCkqMCUoUAwlKysvJShQBAErOCYBUEw/GkcsIzcvGQgGFkQWEwQBNyQeKSYlMSgITypQM0kPNwgjKCMoIigoMQ1DBgQBKE0BKE0BPx0/HgFAHUAeAR5RAS9JAUM8ASpHMkgBOUsBLjsUTgE9RwFETBwiMgE2Oxc+JzgnUBUZSwQBLCgVGikxJykTBAE0NDBFAUhLAThAAUlHASErFCkbKQYRBAEuIkkzLRQGKzUbQwYfICYEAUslGjEqFB8lIjJMIxIeKCMTBhIEATNIBAEnLCQEAVAgKTEEAR5DJEYpQgQBDBZLBAFDAUkcL0MQBAIBK3BhY2thZ2U6Y29tcGlsZXIvc3JjL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnRBc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvdW5pdmVyc2UvY29kZWdlbl93b3JsZF9idWlsZGVyLmRhcnTAAGc0Ly8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKCmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnIHNob3cgSWRlbnRpZmllcnM7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9uYXRpdmVfZGF0YS5kYXJ0JyBzaG93IE5hdGl2ZUJhc2ljRGF0YTsKaW1wb3J0ICcuLi9qc19tb2RlbC9sb2NhbHMuZGFydCc7CmltcG9ydCAnLi4vanNfbW9kZWwvZWxlbWVudF9tYXBfaW1wbC5kYXJ0JzsKaW1wb3J0ICcuLi91dGlsL2VudW1zZXQuZGFydCc7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnOwppbXBvcnQgJy4uL3dvcmxkLmRhcnQnIHNob3cgSkNsb3NlZFdvcmxkOwppbXBvcnQgJ21lbWJlcl91c2FnZS5kYXJ0JzsKaW1wb3J0ICdzZWxlY3Rvci5kYXJ0JyBzaG93IFNlbGVjdG9yOwppbXBvcnQgJ3VzZS5kYXJ0JwogICAgc2hvdyBDb25zdGFudFVzZSwgRHluYW1pY1VzZSwgRHluYW1pY1VzZUtpbmQsIFN0YXRpY1VzZSwgU3RhdGljVXNlS2luZDsKaW1wb3J0ICd3b3JsZF9idWlsZGVyLmRhcnQnOwoKLy8vIFdvcmxkIGJ1aWxkZXIgc3BlY2lmaWMgdG8gY29kZWdlbi4KLy8vCi8vLyBUaGlzIGFkZHMgYWRkaXRpb25hbCBhY2Nlc3MgdG8gbGl2ZW5lc3Mgb2Ygc2VsZWN0b3JzIGFuZCBlbGVtZW50cy4KYWJzdHJhY3QgY2xhc3MgQ29kZWdlbldvcmxkQnVpbGRlciBpbXBsZW1lbnRzIFdvcmxkQnVpbGRlciB7CiAgLy8vIEFsbCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluc3RhbnRpYXRlZCBjbGFzc2VzLgogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBnZXQgaW5zdGFudGlhdGVkQ2xhc3NlczsKCiAgLy8vIENhbGxzIFtmXSB3aXRoIGV2ZXJ5IGluc3RhbmNlIGZpZWxkLCB0b2dldGhlciB3aXRoIGl0cyBkZWNsYXJlciwgaW4gYW4KICAvLy8gaW5zdGFuY2Ugb2YgW2Nsc10uIEFsbCBmaWVsZHMgaW5oZXJpdGVkIGZyb20gc3VwZXJjbGFzc2VzIGFuZCBtaXhpbnMgYXJlCiAgLy8vIGluY2x1ZGVkLgogIC8vLwogIC8vLyBJZiBbaXNFbGlkZWRdIGlzIGB0cnVlYCwgdGhlIGZpZWxkIGlzIG5vdCByZWFkIGFuZCBzaG91bGQgdGhlcmVmb3JlIG5vdAogIC8vLyBiZSBlbWl0dGVkLgogIHZvaWQgZm9yRWFjaEluc3RhbmNlRmllbGQoY292YXJpYW50IENsYXNzRW50aXR5IGNscywKICAgICAgdm9pZCBmKENsYXNzRW50aXR5IGRlY2xhcmVyLCBGaWVsZEVudGl0eSBmaWVsZCwge2Jvb2wgaXNFbGlkZWR9KSk7CgogIC8vLyBDYWxscyBbZl0gd2l0aCBldmVyeSBpbnN0YW5jZSBmaWVsZCBkZWNsYXJlZCBkaXJlY3RseSBpbiBjbGFzcyBbY2xzXQogIC8vLyAoaS5lLiBubyBpbmhlcml0ZWQgZmllbGRzKS4gRmllbGRzIGFyZSBwcmVzZW50ZWQgaW4gaW5pdGlhbGl6YXRpb24KICAvLy8gKGkuZS4gdGV4dHVhbCkgb3JkZXIuCiAgLy8vCiAgLy8vIElmIFtpc0VsaWRlZF0gaXMgYHRydWVgLCB0aGUgZmllbGQgaXMgbm90IHJlYWQgYW5kIHNob3VsZCB0aGVyZWZvcmUgbm90CiAgLy8vIGJlIGVtaXR0ZWQuCiAgdm9pZCBmb3JFYWNoRGlyZWN0SW5zdGFuY2VGaWVsZCgKICAgICAgY292YXJpYW50IENsYXNzRW50aXR5IGNscywgdm9pZCBmKEZpZWxkRW50aXR5IGZpZWxkLCB7Ym9vbCBpc0VsaWRlZH0pKTsKCiAgLy8vIENhbGxzIFtmXSBmb3IgZWFjaCBwYXJhbWV0ZXIgb2YgW2Z1bmN0aW9uXSBwcm92aWRpbmcgdGhlIHR5cGUgYW5kIG5hbWUgb2YKICAvLy8gdGhlIHBhcmFtZXRlciBhbmQgdGhlIFtkZWZhdWx0VmFsdWVdIGlmIHRoZSBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwuCiAgdm9pZCBmb3JFYWNoUGFyYW1ldGVyKGNvdmFyaWFudCBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwKICAgICAgdm9pZCBmKERhcnRUeXBlIHR5cGUsIFN0cmluZyBuYW1lLCBDb25zdGFudFZhbHVlIGRlZmF1bHRWYWx1ZSkpOwoKICAvLy8gQ2FsbHMgW2ZdIGZvciBlYWNoIHBhcmFtZXRlciAtIGdpdmVuIGFzIGEgW0xvY2FsXSAtIG9mIFtmdW5jdGlvbl0uCiAgdm9pZCBmb3JFYWNoUGFyYW1ldGVyQXNMb2NhbCgKICAgICAgY292YXJpYW50IEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uLCB2b2lkIGYoTG9jYWwgcGFyYW1ldGVyKSk7CgogIHZvaWQgZm9yRWFjaEludm9rZWROYW1lKAogICAgICBmKFN0cmluZyBuYW1lLCBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+IHNlbGVjdG9ycykpOwoKICB2b2lkIGZvckVhY2hJbnZva2VkR2V0dGVyKAogICAgICBmKFN0cmluZyBuYW1lLCBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+IHNlbGVjdG9ycykpOwoKICB2b2lkIGZvckVhY2hJbnZva2VkU2V0dGVyKAogICAgICBmKFN0cmluZyBuYW1lLCBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+IHNlbGVjdG9ycykpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW21lbWJlcl0gaXMgaW52b2tlZCBhcyBhIHNldHRlci4KICBib29sIGhhc0ludm9rZWRTZXR0ZXIoTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIGJvb2wgaGFzSW52b2tlZEdldHRlcihNZW1iZXJFbnRpdHkgbWVtYmVyKTsKCiAgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPiBpbnZvY2F0aW9uc0J5TmFtZShTdHJpbmcgbmFtZSk7CgogIE1hcDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4gZ2V0dGVySW52b2NhdGlvbnNCeU5hbWUoU3RyaW5nIG5hbWUpOwoKICBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+IHNldHRlckludm9jYXRpb25zQnlOYW1lKFN0cmluZyBuYW1lKTsKCiAgSXRlcmFibGU8RnVuY3Rpb25FbnRpdHk+IGdldCBzdGF0aWNGdW5jdGlvbnNOZWVkaW5nR2V0dGVyOwogIEl0ZXJhYmxlPEZ1bmN0aW9uRW50aXR5PiBnZXQgbWV0aG9kc05lZWRpbmdTdXBlckdldHRlcjsKCiAgLy8vIFRoZSBzZXQgb2YgYWxsIHJlZmVyZW5jZWQgc3RhdGljIGZpZWxkcy4KICAvLy8KICAvLy8gSW52YXJpYW50OiBFbGVtZW50cyBhcmUgZGVjbGFyYXRpb24gZWxlbWVudHMuCiAgSXRlcmFibGU8RmllbGRFbnRpdHk+IGdldCBhbGxSZWZlcmVuY2VkU3RhdGljRmllbGRzOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxGdW5jdGlvbkVudGl0eT4gZ2V0IGNsb3N1cml6ZWRNZW1iZXJzOwoKICAvLy8gUmVnaXN0ZXIgW2NvbnN0YW50XSBhcyBuZWVkZWQgZm9yIGVtaXNzaW9uLgogIHZvaWQgYWRkQ29tcGlsZVRpbWVDb25zdGFudEZvckVtaXNzaW9uKENvbnN0YW50VmFsdWUgY29uc3RhbnQpOwoKICAvLy8gUmV0dXJucyBhIGxpc3Qgb2YgY29uc3RhbnRzIHRvcG9sb2dpY2FsbHkgc29ydGVkIHNvIHRoYXQgZGVwZW5kZW5jaWVzCiAgLy8vIGFwcGVhciBiZWZvcmUgdGhlIGRlcGVuZGVudCBjb25zdGFudC4KICAvLy8KICAvLy8gW3ByZVNvcnRDb21wYXJlXSBpcyBhIGNvbXBhcmF0b3IgZnVuY3Rpb24gdGhhdCBnaXZlcyB0aGUgY29uc3RhbnRzIGEKICAvLy8gY29uc2lzdGVudCBvcmRlciBwcmlvciB0byB0aGUgdG9wb2xvZ2ljYWwgc29ydCB3aGljaCBnaXZlcyB0aGUgY29uc3RhbnRzCiAgLy8vIGFuIG9yZGVyaW5nIHRoYXQgaXMgbGVzcyBzZW5zaXRpdmUgdG8gcGVydHVyYmF0aW9ucyBpbiB0aGUgc291cmNlIGNvZGUuCiAgTGlzdDxDb25zdGFudFZhbHVlPiBnZXRDb25zdGFudHNGb3JFbWlzc2lvbigKICAgICAgW0NvbXBhcmF0b3I8Q29uc3RhbnRWYWx1ZT4gcHJlU29ydENvbXBhcmVdKTsKCiAgLy8vIFJldHVybnMgdGhlIHR5cGVzIHRoYXQgYXJlIGxpdmUgYXMgY29uc3RhbnQgdHlwZSBsaXRlcmFscy4KICBJdGVyYWJsZTxEYXJ0VHlwZT4gZ2V0IGNvbnN0VHlwZUxpdGVyYWxzOwoKICAvLy8gUmV0dXJucyB0aGUgdHlwZXMgdGhhdCBhcmUgbGl2ZSBhcyBjb25zdGFudCB0eXBlIGFyZ3VtZW50cy4KICBJdGVyYWJsZTxEYXJ0VHlwZT4gZ2V0IGxpdmVUeXBlQXJndW1lbnRzOwp9CgpjbGFzcyBDb2RlZ2VuV29ybGRCdWlsZGVySW1wbCBleHRlbmRzIFdvcmxkQnVpbGRlckJhc2UKICAgIGltcGxlbWVudHMgQ29kZWdlbldvcmxkQnVpbGRlciB7CiAgZmluYWwgSkNsb3NlZFdvcmxkIF93b3JsZDsKCiAgLy8vIFRoZSBzZXQgb2YgYWxsIGRpcmVjdGx5IGluc3RhbnRpYXRlZCBjbGFzc2VzLCB0aGF0IGlzLCBjbGFzc2VzIHdpdGggYQogIC8vLyBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yIHRoYXQgaGFzIGJlZW4gY2FsbGVkIGRpcmVjdGx5IGFuZCBub3Qgb25seSB0aHJvdWdoCiAgLy8vIGEgc3VwZXItY2FsbC4KICAvLy8KICAvLy8gSW52YXJpYW50OiBFbGVtZW50cyBhcmUgZGVjbGFyYXRpb24gZWxlbWVudHMuCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogW19kaXJlY3RseUluc3RhbnRpYXRlZENsYXNzZXNdIGFuZAogIC8vIFtfaW5zdGFudGlhdGVkVHlwZXNdIHNldHMgc2hvdWxkIGJlIG1lcmdlZC4KICBmaW5hbCBTZXQ8Q2xhc3NFbnRpdHk+IF9kaXJlY3RseUluc3RhbnRpYXRlZENsYXNzZXMgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwoKICAvLy8gVGhlIHNldCBvZiBhbGwgZGlyZWN0bHkgaW5zdGFudGlhdGVkIHR5cGVzLCB0aGF0IGlzLCB0aGUgdHlwZXMgb2YgdGhlCiAgLy8vIGRpcmVjdGx5IGluc3RhbnRpYXRlZCBjbGFzc2VzLgogIC8vLwogIC8vLyBTZWUgW19kaXJlY3RseUluc3RhbnRpYXRlZENsYXNzZXNdLgogIGZpbmFsIFNldDxJbnRlcmZhY2VUeXBlPiBfaW5zdGFudGlhdGVkVHlwZXMgPSBuZXcgU2V0PEludGVyZmFjZVR5cGU+KCk7CgogIC8vLyBDbGFzc2VzIGltcGxlbWVudGVkIGJ5IGRpcmVjdGx5IGluc3RhbnRpYXRlZCBjbGFzc2VzLgogIGZpbmFsIFNldDxDbGFzc0VudGl0eT4gX2ltcGxlbWVudGVkQ2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CgogIEBvdmVycmlkZQogIGZpbmFsIFNldDxGaWVsZEVudGl0eT4gYWxsUmVmZXJlbmNlZFN0YXRpY0ZpZWxkcyA9IG5ldyBTZXQ8RmllbGRFbnRpdHk+KCk7CgogIEBvdmVycmlkZQogIGZpbmFsIFNldDxGdW5jdGlvbkVudGl0eT4gc3RhdGljRnVuY3Rpb25zTmVlZGluZ0dldHRlciA9CiAgICAgIG5ldyBTZXQ8RnVuY3Rpb25FbnRpdHk+KCk7CiAgQG92ZXJyaWRlCiAgZmluYWwgU2V0PEZ1bmN0aW9uRW50aXR5PiBtZXRob2RzTmVlZGluZ1N1cGVyR2V0dGVyID0KICAgICAgbmV3IFNldDxGdW5jdGlvbkVudGl0eT4oKTsKICBmaW5hbCBNYXA8U3RyaW5nLCBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+PiBfaW52b2tlZE5hbWVzID0KICAgICAgPFN0cmluZywgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPj57fTsKICBmaW5hbCBNYXA8U3RyaW5nLCBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+PiBfaW52b2tlZEdldHRlcnMgPQogICAgICA8U3RyaW5nLCBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+Pnt9OwogIGZpbmFsIE1hcDxTdHJpbmcsIE1hcDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4+IF9pbnZva2VkU2V0dGVycyA9CiAgICAgIDxTdHJpbmcsIE1hcDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4+e307CgogIGZpbmFsIE1hcDxDbGFzc0VudGl0eSwgQ2xhc3NVc2FnZT4gX3Byb2Nlc3NlZENsYXNzZXMgPQogICAgICA8Q2xhc3NFbnRpdHksIENsYXNzVXNhZ2U+e307CgogIE1hcDxDbGFzc0VudGl0eSwgQ2xhc3NVc2FnZT4gZ2V0IGNsYXNzVXNhZ2VGb3JUZXN0aW5nID0+IF9wcm9jZXNzZWRDbGFzc2VzOwoKICAvLy8gTWFwIG9mIHJlZ2lzdGVyZWQgdXNhZ2Ugb2Ygc3RhdGljIG1lbWJlcnMgb2YgbGl2ZSBjbGFzc2VzLgogIGZpbmFsIE1hcDxFbnRpdHksIFN0YXRpY01lbWJlclVzYWdlPiBfc3RhdGljTWVtYmVyVXNhZ2UgPQogICAgICA8RW50aXR5LCBTdGF0aWNNZW1iZXJVc2FnZT57fTsKCiAgTWFwPEVudGl0eSwgU3RhdGljTWVtYmVyVXNhZ2U+IGdldCBzdGF0aWNNZW1iZXJVc2FnZUZvclRlc3RpbmcgPT4KICAgICAgX3N0YXRpY01lbWJlclVzYWdlOwoKICAvLy8gTWFwIG9mIHJlZ2lzdGVyZWQgdXNhZ2Ugb2YgaW5zdGFuY2UgbWVtYmVycyBvZiBsaXZlIGNsYXNzZXMuCiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwgTWVtYmVyVXNhZ2U+IF9pbnN0YW5jZU1lbWJlclVzYWdlID0KICAgICAgPE1lbWJlckVudGl0eSwgTWVtYmVyVXNhZ2U+e307CgogIE1hcDxNZW1iZXJFbnRpdHksIE1lbWJlclVzYWdlPiBnZXQgaW5zdGFuY2VNZW1iZXJVc2FnZUZvclRlc3RpbmcgPT4KICAgICAgX2luc3RhbmNlTWVtYmVyVXNhZ2U7CgogIC8vLyBNYXAgY29udGFpbmluZyBpbnN0YW5jZSBtZW1iZXJzIG9mIGxpdmUgY2xhc3NlcyB0aGF0IGFyZSBub3QgeWV0IGxpdmUKICAvLy8gdGhlbXNlbHZlcy4KICBmaW5hbCBNYXA8U3RyaW5nLCBTZXQ8TWVtYmVyVXNhZ2U+PiBfaW5zdGFuY2VNZW1iZXJzQnlOYW1lID0KICAgICAgPFN0cmluZywgU2V0PE1lbWJlclVzYWdlPj57fTsKCiAgLy8vIE1hcCBjb250YWluaW5nIGluc3RhbmNlIG1ldGhvZHMgb2YgbGl2ZSBjbGFzc2VzIHRoYXQgYXJlIG5vdCB5ZXQKICAvLy8gY2xvc3VyaXplZC4KICBmaW5hbCBNYXA8U3RyaW5nLCBTZXQ8TWVtYmVyVXNhZ2U+PiBfaW5zdGFuY2VGdW5jdGlvbnNCeU5hbWUgPQogICAgICA8U3RyaW5nLCBTZXQ8TWVtYmVyVXNhZ2U+Pnt9OwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTZXQ8RGFydFR5cGU+IGlzQ2hlY2tzID0gbmV3IFNldDxEYXJ0VHlwZT4oKTsKCiAgZmluYWwgU2VsZWN0b3JDb25zdHJhaW50c1N0cmF0ZWd5IHNlbGVjdG9yQ29uc3RyYWludHNTdHJhdGVneTsKCiAgZmluYWwgU2V0PENvbnN0YW50VmFsdWU+IF9jb25zdGFudFZhbHVlcyA9IG5ldyBTZXQ8Q29uc3RhbnRWYWx1ZT4oKTsKCiAgZmluYWwgSnNUb1dvcmxkQnVpbGRlciBfZWxlbWVudE1hcDsKCiAgZmluYWwgU2V0PERhcnRUeXBlPiBfY29uc3RUeXBlTGl0ZXJhbHMgPSBuZXcgU2V0PERhcnRUeXBlPigpOwogIGZpbmFsIFNldDxEYXJ0VHlwZT4gX2xpdmVUeXBlQXJndW1lbnRzID0gbmV3IFNldDxEYXJ0VHlwZT4oKTsKCiAgQ29kZWdlbldvcmxkQnVpbGRlckltcGwoCiAgICAgIHRoaXMuX2VsZW1lbnRNYXAsIHRoaXMuX3dvcmxkLCB0aGlzLnNlbGVjdG9yQ29uc3RyYWludHNTdHJhdGVneSk7CgogIEVsZW1lbnRFbnZpcm9ubWVudCBnZXQgX2VsZW1lbnRFbnZpcm9ubWVudCA9PiBfd29ybGQuZWxlbWVudEVudmlyb25tZW50OwoKICBOYXRpdmVCYXNpY0RhdGEgZ2V0IF9uYXRpdmVCYXNpY0RhdGEgPT4gX3dvcmxkLm5hdGl2ZURhdGE7CgogIEdsb2JhbExvY2Fsc01hcCBnZXQgX2dsb2JhbExvY2Fsc01hcCA9PiBfd29ybGQuZ2xvYmFsTG9jYWxzTWFwOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0IGluc3RhbnRpYXRlZENsYXNzZXMgPT4gX3Byb2Nlc3NlZENsYXNzZXMua2V5cwogICAgICAud2hlcmUoKGNscykgPT4gX3Byb2Nlc3NlZENsYXNzZXNbY2xzXS5pc0luc3RhbnRpYXRlZCk7CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEltcHJvdmUgc2VtYW50aWMgcHJlY2lzaW9uLgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBnZXQgZGlyZWN0bHlJbnN0YW50aWF0ZWRDbGFzc2VzIHsKICAgIHJldHVybiBfZGlyZWN0bHlJbnN0YW50aWF0ZWRDbGFzc2VzOwogIH0KCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogSW1wcm92ZSBzZW1hbnRpYyBwcmVjaXNpb24uCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8SW50ZXJmYWNlVHlwZT4gZ2V0IGluc3RhbnRpYXRlZFR5cGVzID0+IF9pbnN0YW50aWF0ZWRUeXBlczsKCiAgLy8vIFJlZ2lzdGVyIFt0eXBlXSBhcyAoZGlyZWN0bHkpIGluc3RhbnRpYXRlZC4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBGdWxseSBlbmZvcmNlIHRoZSBzZXBhcmF0aW9uIGJldHdlZW4gZXhhY3QsIHRocm91Z2gKICAvLyBzdWJjbGFzcyBhbmQgdGhyb3VnaCBzdWJ0eXBlIGluc3RhbnRpYXRlZCB0eXBlcy9jbGFzc2VzLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFN1cHBvcnQgdW5rbm93biB0eXBlIGFyZ3VtZW50cyBmb3IgZ2VuZXJpYyB0eXBlcy4KICB2b2lkIHJlZ2lzdGVyVHlwZUluc3RhbnRpYXRpb24oCiAgICAgIEludGVyZmFjZVR5cGUgdHlwZSwgQ2xhc3NVc2VkQ2FsbGJhY2sgY2xhc3NVc2VkKSB7CiAgICBDbGFzc0VudGl0eSBjbHMgPSB0eXBlLmVsZW1lbnQ7CiAgICBib29sIGlzTmF0aXZlID0gX25hdGl2ZUJhc2ljRGF0YS5pc05hdGl2ZUNsYXNzKGNscyk7CiAgICBfaW5zdGFudGlhdGVkVHlwZXMuYWRkKHR5cGUpOwogICAgLy8gV2UgY2FuJ3QgdXNlIHRoZSBjbG9zZWQtd29ybGQgYXNzdW1wdGlvbiB3aXRoIG5hdGl2ZSBhYnN0cmFjdAogICAgLy8gY2xhc3NlczsgYSBuYXRpdmUgYWJzdHJhY3QgY2xhc3MgbWF5IGhhdmUgbm9uLWFic3RyYWN0IHN1YmNsYXNzZXMKICAgIC8vIG5vdCBkZWNsYXJlZCB0byB0aGUgcHJvZ3JhbS4gIEluc3RhbmNlcyBvZiB0aGVzZSBjbGFzc2VzIGFyZQogICAgLy8gaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgYWJzdHJhY3QgY2xhc3MuCiAgICBpZiAoIWNscy5pc0Fic3RyYWN0IHx8IGlzTmF0aXZlKSB7CiAgICAgIF9kaXJlY3RseUluc3RhbnRpYXRlZENsYXNzZXMuYWRkKGNscyk7CiAgICAgIF9wcm9jZXNzSW5zdGFudGlhdGVkQ2xhc3MoY2xzLCBjbGFzc1VzZWQpOwogICAgfQoKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlcGxhY2UgdGhpcyBieSBzZXBhcmF0ZSBtb3JlIHNwZWNpZmljIG1hcHBpbmdzIHRoYXQKICAgIC8vIGluY2x1ZGUgdGhlIHR5cGUgYXJndW1lbnRzLgogICAgaWYgKF9pbXBsZW1lbnRlZENsYXNzZXMuYWRkKGNscykpIHsKICAgICAgY2xhc3NVc2VkKGNscywgX2dldENsYXNzVXNhZ2UoY2xzKS5pbXBsZW1lbnQoKSk7CiAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaFN1cGVydHlwZShjbHMsIChJbnRlcmZhY2VUeXBlIHN1cGVydHlwZSkgewogICAgICAgIGlmIChfaW1wbGVtZW50ZWRDbGFzc2VzLmFkZChzdXBlcnR5cGUuZWxlbWVudCkpIHsKICAgICAgICAgIGNsYXNzVXNlZCgKICAgICAgICAgICAgICBzdXBlcnR5cGUuZWxlbWVudCwgX2dldENsYXNzVXNhZ2Uoc3VwZXJ0eXBlLmVsZW1lbnQpLmltcGxlbWVudCgpKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0KCiAgYm9vbCBfaGFzTWF0Y2hpbmdTZWxlY3RvcihNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+IHNlbGVjdG9ycywKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciwgSkNsb3NlZFdvcmxkIHdvcmxkKSB7CiAgICBpZiAoc2VsZWN0b3JzID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIGZvciAoU2VsZWN0b3Igc2VsZWN0b3IgaW4gc2VsZWN0b3JzLmtleXMpIHsKICAgICAgaWYgKHNlbGVjdG9yLmFwcGxpZXNVbm5hbWVkKG1lbWJlcikpIHsKICAgICAgICBTZWxlY3RvckNvbnN0cmFpbnRzIG1hc2tzID0gc2VsZWN0b3JzW3NlbGVjdG9yXTsKICAgICAgICBpZiAobWFza3MuY2FuSGl0KG1lbWJlciwgc2VsZWN0b3IubWVtYmVyTmFtZSwgd29ybGQpKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGJvb2wgaGFzSW52b2NhdGlvbihNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICByZXR1cm4gX2hhc01hdGNoaW5nU2VsZWN0b3IoX2ludm9rZWROYW1lc1ttZW1iZXIubmFtZV0sIG1lbWJlciwgX3dvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaGFzSW52b2tlZEdldHRlcihNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICByZXR1cm4gX2hhc01hdGNoaW5nU2VsZWN0b3IoX2ludm9rZWRHZXR0ZXJzW21lbWJlci5uYW1lXSwgbWVtYmVyLCBfd29ybGQpIHx8CiAgICAgICAgbWVtYmVyLmlzRnVuY3Rpb24gJiYgbWV0aG9kc05lZWRpbmdTdXBlckdldHRlci5jb250YWlucyhtZW1iZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNJbnZva2VkU2V0dGVyKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIHJldHVybiBfaGFzTWF0Y2hpbmdTZWxlY3RvcihfaW52b2tlZFNldHRlcnNbbWVtYmVyLm5hbWVdLCBtZW1iZXIsIF93b3JsZCk7CiAgfQoKICBib29sIHJlZ2lzdGVyRHluYW1pY1VzZSgKICAgICAgRHluYW1pY1VzZSBkeW5hbWljVXNlLCBNZW1iZXJVc2VkQ2FsbGJhY2sgbWVtYmVyVXNlZCkgewogICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBkeW5hbWljVXNlLnNlbGVjdG9yOwogICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBzZWxlY3Rvci5uYW1lOwoKICAgIHZvaWQgX3Byb2Nlc3MoTWFwPFN0cmluZywgU2V0PE1lbWJlclVzYWdlPj4gbWVtYmVyTWFwLAogICAgICAgIEVudW1TZXQ8TWVtYmVyVXNlPiBhY3Rpb24oTWVtYmVyVXNhZ2UgdXNhZ2UpKSB7CiAgICAgIF9wcm9jZXNzU2V0KG1lbWJlck1hcCwgbWV0aG9kTmFtZSwgKE1lbWJlclVzYWdlIHVzYWdlKSB7CiAgICAgICAgaWYgKHNlbGVjdG9yLmFwcGxpZXNVbm5hbWVkKHVzYWdlLmVudGl0eSkgJiYKICAgICAgICAgICAgc2VsZWN0b3JDb25zdHJhaW50c1N0cmF0ZWd5LmFwcGxpZWRVbm5hbWVkKAogICAgICAgICAgICAgICAgZHluYW1pY1VzZSwgdXNhZ2UuZW50aXR5LCBfd29ybGQpKSB7CiAgICAgICAgICBtZW1iZXJVc2VkKHVzYWdlLmVudGl0eSwgYWN0aW9uKHVzYWdlKSk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9KTsKICAgIH0KCiAgICBzd2l0Y2ggKGR5bmFtaWNVc2Uua2luZCkgewogICAgICBjYXNlIER5bmFtaWNVc2VLaW5kLklOVk9LRToKICAgICAgICByZWdpc3RlckR5bmFtaWNJbnZvY2F0aW9uKAogICAgICAgICAgICBkeW5hbWljVXNlLnNlbGVjdG9yLCBkeW5hbWljVXNlLnR5cGVBcmd1bWVudHMpOwogICAgICAgIGlmIChfcmVnaXN0ZXJOZXdTZWxlY3RvcihkeW5hbWljVXNlLCBfaW52b2tlZE5hbWVzKSkgewogICAgICAgICAgLy8gV2UgZG9uJ3QgdHJhY2sgcGFyYW1ldGVycyBpbiB0aGUgY29kZWdlbiB3b3JsZCBidWlsZGVyLCBzbyB3ZQogICAgICAgICAgLy8gcGFzcyBgbnVsbGAgaW5zdGVhZCBvZiB0aGUgY29uY3JldGUgY2FsbCBzdHJ1Y3R1cmUuCiAgICAgICAgICBfcHJvY2VzcyhfaW5zdGFuY2VNZW1iZXJzQnlOYW1lLCAobSkgPT4gbS5pbnZva2UobnVsbCkpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIER5bmFtaWNVc2VLaW5kLkdFVDoKICAgICAgICBpZiAoX3JlZ2lzdGVyTmV3U2VsZWN0b3IoZHluYW1pY1VzZSwgX2ludm9rZWRHZXR0ZXJzKSkgewogICAgICAgICAgX3Byb2Nlc3MoX2luc3RhbmNlTWVtYmVyc0J5TmFtZSwgKG0pID0+IG0ucmVhZCgpKTsKICAgICAgICAgIF9wcm9jZXNzKF9pbnN0YW5jZUZ1bmN0aW9uc0J5TmFtZSwgKG0pID0+IG0ucmVhZCgpKTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBEeW5hbWljVXNlS2luZC5TRVQ6CiAgICAgICAgaWYgKF9yZWdpc3Rlck5ld1NlbGVjdG9yKGR5bmFtaWNVc2UsIF9pbnZva2VkU2V0dGVycykpIHsKICAgICAgICAgIF9wcm9jZXNzKF9pbnN0YW5jZU1lbWJlcnNCeU5hbWUsIChtKSA9PiBtLndyaXRlKCkpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgYm9vbCBfcmVnaXN0ZXJOZXdTZWxlY3RvcihEeW5hbWljVXNlIGR5bmFtaWNVc2UsCiAgICAgIE1hcDxTdHJpbmcsIE1hcDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4+IHNlbGVjdG9yTWFwKSB7CiAgICBTZWxlY3RvciBzZWxlY3RvciA9IGR5bmFtaWNVc2Uuc2VsZWN0b3I7CiAgICBTdHJpbmcgbmFtZSA9IHNlbGVjdG9yLm5hbWU7CiAgICBPYmplY3QgY29uc3RyYWludCA9IGR5bmFtaWNVc2UucmVjZWl2ZXJDb25zdHJhaW50OwogICAgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPiBzZWxlY3RvcnMgPQogICAgICAgIHNlbGVjdG9yTWFwW25hbWVdID8/PSBuZXcgTWFwbGV0PFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPigpOwogICAgVW5pdmVyc2VTZWxlY3RvckNvbnN0cmFpbnRzIGNvbnN0cmFpbnRzID0gc2VsZWN0b3JzW3NlbGVjdG9yXTsKICAgIGlmIChjb25zdHJhaW50cyA9PSBudWxsKSB7CiAgICAgIHNlbGVjdG9yc1tzZWxlY3Rvcl0gPSBzZWxlY3RvckNvbnN0cmFpbnRzU3RyYXRlZ3kKICAgICAgICAgIC5jcmVhdGVTZWxlY3RvckNvbnN0cmFpbnRzKHNlbGVjdG9yLCBjb25zdHJhaW50KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gY29uc3RyYWludHMuYWRkUmVjZWl2ZXJDb25zdHJhaW50KGNvbnN0cmFpbnQpOwogIH0KCiAgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPiBfYXNVbm1vZGlmaWFibGUoCiAgICAgIE1hcDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4gbWFwKSB7CiAgICBpZiAobWFwID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIG5ldyBVbm1vZGlmaWFibGVNYXBWaWV3KG1hcCk7CiAgfQoKICBAb3ZlcnJpZGUKICBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+IGludm9jYXRpb25zQnlOYW1lKFN0cmluZyBuYW1lKSB7CiAgICByZXR1cm4gX2FzVW5tb2RpZmlhYmxlKF9pbnZva2VkTmFtZXNbbmFtZV0pOwogIH0KCiAgQG92ZXJyaWRlCiAgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPiBnZXR0ZXJJbnZvY2F0aW9uc0J5TmFtZShTdHJpbmcgbmFtZSkgewogICAgcmV0dXJuIF9hc1VubW9kaWZpYWJsZShfaW52b2tlZEdldHRlcnNbbmFtZV0pOwogIH0KCiAgQG92ZXJyaWRlCiAgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPiBzZXR0ZXJJbnZvY2F0aW9uc0J5TmFtZShTdHJpbmcgbmFtZSkgewogICAgcmV0dXJuIF9hc1VubW9kaWZpYWJsZShfaW52b2tlZFNldHRlcnNbbmFtZV0pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoSW52b2tlZE5hbWUoCiAgICAgIGYoU3RyaW5nIG5hbWUsIE1hcDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4gc2VsZWN0b3JzKSkgewogICAgX2ludm9rZWROYW1lcy5mb3JFYWNoKGYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoSW52b2tlZEdldHRlcigKICAgICAgZihTdHJpbmcgbmFtZSwgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPiBzZWxlY3RvcnMpKSB7CiAgICBfaW52b2tlZEdldHRlcnMuZm9yRWFjaChmKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaEludm9rZWRTZXR0ZXIoCiAgICAgIGYoU3RyaW5nIG5hbWUsIE1hcDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4gc2VsZWN0b3JzKSkgewogICAgX2ludm9rZWRTZXR0ZXJzLmZvckVhY2goZik7CiAgfQoKICB2b2lkIHJlZ2lzdGVySXNDaGVjayhjb3ZhcmlhbnQgRGFydFR5cGUgdHlwZSkgewogICAgaXNDaGVja3MuYWRkKHR5cGUudW5hbGlhc2VkKTsKICB9CgogIHZvaWQgX3JlZ2lzdGVyU3RhdGljVXNlKFN0YXRpY1VzZSBzdGF0aWNVc2UpIHsKICAgIGlmIChzdGF0aWNVc2UuZWxlbWVudCBpcyBGaWVsZEVudGl0eSkgewogICAgICBGaWVsZEVudGl0eSBmaWVsZCA9IHN0YXRpY1VzZS5lbGVtZW50OwogICAgICBpZiAoZmllbGQuaXNUb3BMZXZlbCB8fCBmaWVsZC5pc1N0YXRpYykgewogICAgICAgIGFsbFJlZmVyZW5jZWRTdGF0aWNGaWVsZHMuYWRkKGZpZWxkKTsKICAgICAgfQogICAgfQogICAgc3dpdGNoIChzdGF0aWNVc2Uua2luZCkgewogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuU1RBVElDX1RFQVJfT0ZGOgogICAgICAgIHN0YXRpY0Z1bmN0aW9uc05lZWRpbmdHZXR0ZXIuYWRkKHN0YXRpY1VzZS5lbGVtZW50KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLlNVUEVSX1RFQVJfT0ZGOgogICAgICAgIG1ldGhvZHNOZWVkaW5nU3VwZXJHZXR0ZXIuYWRkKHN0YXRpY1VzZS5lbGVtZW50KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLlNVUEVSX0ZJRUxEX1NFVDoKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkZJRUxEX1NFVDoKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkNMT1NVUkU6CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5DTE9TVVJFX0NBTEw6CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5DQUxMX01FVEhPRDoKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkZJRUxEX0dFVDoKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkNPTlNUUlVDVE9SX0lOVk9LRToKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkNPTlNUX0NPTlNUUlVDVE9SX0lOVk9LRToKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLlJFRElSRUNUSU9OOgogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuRElSRUNUX0lOVk9LRToKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLklOTElOSU5HOgogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuSU5WT0tFOgogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuR0VUOgogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuU0VUOgogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuRklFTERfSU5JVDoKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkZJRUxEX0NPTlNUQU5UX0lOSVQ6CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICB2b2lkIHJlZ2lzdGVyU3RhdGljVXNlKFN0YXRpY1VzZSBzdGF0aWNVc2UsIE1lbWJlclVzZWRDYWxsYmFjayBtZW1iZXJVc2VkKSB7CiAgICBFbnRpdHkgZWxlbWVudCA9IHN0YXRpY1VzZS5lbGVtZW50OwogICAgX3JlZ2lzdGVyU3RhdGljVXNlKHN0YXRpY1VzZSk7CiAgICBTdGF0aWNNZW1iZXJVc2FnZSB1c2FnZSA9IF9zdGF0aWNNZW1iZXJVc2FnZS5wdXRJZkFic2VudChlbGVtZW50LCAoKSB7CiAgICAgIGlmIChlbGVtZW50IGlzIE1lbWJlckVudGl0eSAmJgogICAgICAgICAgKGVsZW1lbnQuaXNTdGF0aWMgfHwgZWxlbWVudC5pc1RvcExldmVsKSAmJgogICAgICAgICAgZWxlbWVudC5pc0Z1bmN0aW9uKSB7CiAgICAgICAgcmV0dXJuIG5ldyBTdGF0aWNGdW5jdGlvblVzYWdlKGVsZW1lbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBuZXcgR2VuZXJhbFN0YXRpY01lbWJlclVzYWdlKGVsZW1lbnQpOwogICAgICB9CiAgICB9KTsKICAgIEVudW1TZXQ8TWVtYmVyVXNlPiB1c2VTZXQgPSBuZXcgRW51bVNldDxNZW1iZXJVc2U+KCk7CiAgICBzd2l0Y2ggKHN0YXRpY1VzZS5raW5kKSB7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5TVEFUSUNfVEVBUl9PRkY6CiAgICAgICAgY2xvc3VyaXplZFN0YXRpY3MuYWRkKGVsZW1lbnQpOwogICAgICAgIHVzZVNldC5hZGRBbGwodXNhZ2UudGVhck9mZigpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkZJRUxEX0dFVDoKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkZJRUxEX1NFVDoKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkNMT1NVUkU6CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5DTE9TVVJFX0NBTEw6CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5DQUxMX01FVEhPRDoKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBdm9pZCB0aGlzLiBDdXJyZW50bHkgW0ZJRUxEX0dFVF0gYW5kCiAgICAgICAgLy8gW0ZJRUxEX1NFVF0gY29udGFpbnMgW0JveEZpZWxkRWxlbWVudF1zIHdoaWNoIHdlIGNhbm5vdCBlbnF1ZXVlLgogICAgICAgIC8vIEFsc28gW0NMT1NVUkVdIGNvbnRhaW5zIFtMb2NhbEZ1bmN0aW9uRWxlbWVudF0gd2hpY2ggd2UgY2Fubm90CiAgICAgICAgLy8gZW5xdWV1ZS4KICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLklOVk9LRToKICAgICAgICByZWdpc3RlclN0YXRpY0ludm9jYXRpb24oc3RhdGljVXNlKTsKICAgICAgICB1c2VTZXQuYWRkQWxsKHVzYWdlLm5vcm1hbFVzZSgpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLlNVUEVSX0ZJRUxEX1NFVDoKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLlNVUEVSX1RFQVJfT0ZGOgogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuR0VUOgogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuU0VUOgogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuRklFTERfSU5JVDoKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkZJRUxEX0NPTlNUQU5UX0lOSVQ6CiAgICAgICAgdXNlU2V0LmFkZEFsbCh1c2FnZS5ub3JtYWxVc2UoKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5DT05TVFJVQ1RPUl9JTlZPS0U6CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5DT05TVF9DT05TVFJVQ1RPUl9JTlZPS0U6CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5SRURJUkVDVElPTjoKICAgICAgICB1c2VTZXQuYWRkQWxsKHVzYWdlLm5vcm1hbFVzZSgpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkRJUkVDVF9JTlZPS0U6CiAgICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IHN0YXRpY1VzZS5lbGVtZW50OwogICAgICAgIE1lbWJlclVzYWdlIGluc3RhbmNlVXNhZ2UgPSBfZ2V0TWVtYmVyVXNhZ2UobWVtYmVyLCBtZW1iZXJVc2VkKTsKICAgICAgICAvLyBXZSBkb24ndCB0cmFjayBwYXJhbWV0ZXJzIGluIHRoZSBjb2RlZ2VuIHdvcmxkIGJ1aWxkZXIsIHNvIHdlCiAgICAgICAgLy8gcGFzcyBgbnVsbGAgaW5zdGVhZCBvZiB0aGUgY29uY3JldGUgY2FsbCBzdHJ1Y3R1cmUuCiAgICAgICAgbWVtYmVyVXNlZChpbnN0YW5jZVVzYWdlLmVudGl0eSwgaW5zdGFuY2VVc2FnZS5pbnZva2UobnVsbCkpOwogICAgICAgIF9pbnN0YW5jZU1lbWJlcnNCeU5hbWVbaW5zdGFuY2VVc2FnZS5lbnRpdHkubmFtZV0KICAgICAgICAgICAgPy5yZW1vdmUoaW5zdGFuY2VVc2FnZSk7CiAgICAgICAgdXNlU2V0LmFkZEFsbCh1c2FnZS5ub3JtYWxVc2UoKSk7CiAgICAgICAgaWYgKHN0YXRpY1VzZS50eXBlQXJndW1lbnRzPy5pc05vdEVtcHR5ID8/IGZhbHNlKSB7CiAgICAgICAgICByZWdpc3RlckR5bmFtaWNJbnZvY2F0aW9uKAogICAgICAgICAgICAgIG5ldyBTZWxlY3Rvci5jYWxsKG1lbWJlci5tZW1iZXJOYW1lLCBzdGF0aWNVc2UuY2FsbFN0cnVjdHVyZSksCiAgICAgICAgICAgICAgc3RhdGljVXNlLnR5cGVBcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLklOTElOSU5HOgogICAgICAgIHJlZ2lzdGVyU3RhdGljSW52b2NhdGlvbihzdGF0aWNVc2UpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKHVzZVNldC5pc05vdEVtcHR5KSB7CiAgICAgIG1lbWJlclVzZWQodXNhZ2UuZW50aXR5LCB1c2VTZXQpOwogICAgfQogIH0KCiAgLy8vIFJlZ2lzdGVycyB0aGF0IFtlbGVtZW50XSBoYXMgYmVlbiBjbG9zdXJpemVkLgogIHZvaWQgcmVnaXN0ZXJDbG9zdXJpemVkTWVtYmVyKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBjbG9zdXJpemVkTWVtYmVycy5hZGQoZWxlbWVudCk7CiAgfQoKICB2b2lkIHByb2Nlc3NDbGFzc01lbWJlcnMoQ2xhc3NFbnRpdHkgY2xzLCBNZW1iZXJVc2VkQ2FsbGJhY2sgbWVtYmVyVXNlZCwKICAgICAge2Jvb2wgZHJ5UnVuOiBmYWxzZX0pIHsKICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaENsYXNzTWVtYmVyKGNscywKICAgICAgICAoQ2xhc3NFbnRpdHkgY2xzLCBNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAgIF9wcm9jZXNzSW5zdGFudGlhdGVkQ2xhc3NNZW1iZXIoY2xzLCBtZW1iZXIsIG1lbWJlclVzZWQsIGRyeVJ1bjogZHJ5UnVuKTsKICAgIH0pOwogIH0KCiAgdm9pZCBfcHJvY2Vzc0luc3RhbnRpYXRlZENsYXNzTWVtYmVyKENsYXNzRW50aXR5IGNscywKICAgICAgY292YXJpYW50IE1lbWJlckVudGl0eSBtZW1iZXIsIE1lbWJlclVzZWRDYWxsYmFjayBtZW1iZXJVc2VkLAogICAgICB7Ym9vbCBkcnlSdW46IGZhbHNlfSkgewogICAgaWYgKCFtZW1iZXIuaXNJbnN0YW5jZU1lbWJlcikgcmV0dXJuOwogICAgX2dldE1lbWJlclVzYWdlKG1lbWJlciwgbWVtYmVyVXNlZCk7CiAgfQoKICBNZW1iZXJVc2FnZSBfZ2V0TWVtYmVyVXNhZ2UoCiAgICAgIGNvdmFyaWFudCBNZW1iZXJFbnRpdHkgbWVtYmVyLCBNZW1iZXJVc2VkQ2FsbGJhY2sgbWVtYmVyVXNlZCwKICAgICAge2Jvb2wgZHJ5UnVuOiBmYWxzZX0pIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENoYW5nZSBbVHlwZU1hc2tdIHRvIG5vdCBhcHBseSB0byBhIHN1cGVyY2xhc3MKICAgIC8vIG1lbWJlciB1bmxlc3MgdGhlIGNsYXNzIGhhcyBiZWVuIGluc3RhbnRpYXRlZC4gU2ltaWxhciB0bwogICAgLy8gW1N0cm9uZ01vZGVDb25zdHJhaW50XS4KICAgIE1lbWJlclVzYWdlIHVzYWdlID0gX2luc3RhbmNlTWVtYmVyVXNhZ2VbbWVtYmVyXTsKICAgIGlmICh1c2FnZSA9PSBudWxsKSB7CiAgICAgIFN0cmluZyBtZW1iZXJOYW1lID0gbWVtYmVyLm5hbWU7CiAgICAgIENsYXNzRW50aXR5IGNscyA9IG1lbWJlci5lbmNsb3NpbmdDbGFzczsKICAgICAgYm9vbCBpc05hdGl2ZSA9IF9uYXRpdmVCYXNpY0RhdGEuaXNOYXRpdmVDbGFzcyhjbHMpOwogICAgICB1c2FnZSA9IG5ldyBNZW1iZXJVc2FnZShtZW1iZXIsIGlzTmF0aXZlOiBpc05hdGl2ZSk7CiAgICAgIEVudW1TZXQ8TWVtYmVyVXNlPiB1c2VTZXQgPSBuZXcgRW51bVNldDxNZW1iZXJVc2U+KCk7CiAgICAgIHVzZVNldC5hZGRBbGwodXNhZ2UuYXBwbGllZFVzZSk7CiAgICAgIGlmICghdXNhZ2UuaGFzUmVhZCAmJiBoYXNJbnZva2VkR2V0dGVyKG1lbWJlcikpIHsKICAgICAgICB1c2VTZXQuYWRkQWxsKHVzYWdlLnJlYWQoKSk7CiAgICAgIH0KICAgICAgaWYgKCF1c2FnZS5oYXNXcml0ZSAmJiBoYXNJbnZva2VkU2V0dGVyKG1lbWJlcikpIHsKICAgICAgICB1c2VTZXQuYWRkQWxsKHVzYWdlLndyaXRlKCkpOwogICAgICB9CiAgICAgIGlmICghdXNhZ2UuaGFzSW52b2tlICYmIGhhc0ludm9jYXRpb24obWVtYmVyKSkgewogICAgICAgIC8vIFdlIGRvbid0IHRyYWNrIHBhcmFtZXRlcnMgaW4gdGhlIGNvZGVnZW4gd29ybGQgYnVpbGRlciwgc28gd2UKICAgICAgICAvLyBwYXNzIGBudWxsYCBpbnN0ZWFkIG9mIHRoZSBjb25jcmV0ZSBjYWxsIHN0cnVjdHVyZXMuCiAgICAgICAgdXNlU2V0LmFkZEFsbCh1c2FnZS5pbnZva2UobnVsbCkpOwogICAgICB9CgogICAgICBpZiAoIWRyeVJ1bikgewogICAgICAgIGlmICh1c2FnZS5oYXNQZW5kaW5nQ2xvc3VyaXphdGlvblVzZSkgewogICAgICAgICAgLy8gU3RvcmUgdGhlIG1lbWJlciBpbiBbaW5zdGFuY2VGdW5jdGlvbnNCeU5hbWVdIHRvIGNhdGNoCiAgICAgICAgICAvLyBnZXR0ZXJzIG9uIHRoZSBmdW5jdGlvbi4KICAgICAgICAgIF9pbnN0YW5jZUZ1bmN0aW9uc0J5TmFtZQogICAgICAgICAgICAgIC5wdXRJZkFic2VudCh1c2FnZS5lbnRpdHkubmFtZSwgKCkgPT4gbmV3IFNldDxNZW1iZXJVc2FnZT4oKSkKICAgICAgICAgICAgICAuYWRkKHVzYWdlKTsKICAgICAgICB9CiAgICAgICAgaWYgKHVzYWdlLmhhc1BlbmRpbmdOb3JtYWxVc2UpIHsKICAgICAgICAgIC8vIFRoZSBlbGVtZW50IGlzIG5vdCB5ZXQgdXNlZC4gQWRkIGl0IHRvIHRoZSBsaXN0IG9mIGluc3RhbmNlCiAgICAgICAgICAvLyBtZW1iZXJzIHRvIHN0aWxsIGJlIHByb2Nlc3NlZC4KICAgICAgICAgIF9pbnN0YW5jZU1lbWJlcnNCeU5hbWUKICAgICAgICAgICAgICAucHV0SWZBYnNlbnQobWVtYmVyTmFtZSwgKCkgPT4gbmV3IFNldDxNZW1iZXJVc2FnZT4oKSkKICAgICAgICAgICAgICAuYWRkKHVzYWdlKTsKICAgICAgICB9CiAgICAgICAgX2luc3RhbmNlTWVtYmVyVXNhZ2VbbWVtYmVyXSA9IHVzYWdlOwogICAgICB9CiAgICAgIG1lbWJlclVzZWQobWVtYmVyLCB1c2VTZXQpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGRyeVJ1bikgewogICAgICAgIHVzYWdlID0gdXNhZ2UuY2xvbmUoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHVzYWdlOwogIH0KCiAgdm9pZCBfcHJvY2Vzc1NldChNYXA8U3RyaW5nLCBTZXQ8TWVtYmVyVXNhZ2U+PiBtYXAsIFN0cmluZyBtZW1iZXJOYW1lLAogICAgICBib29sIGYoTWVtYmVyVXNhZ2UgZSkpIHsKICAgIFNldDxNZW1iZXJVc2FnZT4gbWVtYmVycyA9IG1hcFttZW1iZXJOYW1lXTsKICAgIGlmIChtZW1iZXJzID09IG51bGwpIHJldHVybjsKICAgIC8vIFtmXSBtaWdodCBhZGQgZWxlbWVudHMgdG8gWzogbWFwW21lbWJlck5hbWVdIDpdIGR1cmluZyB0aGUgbG9vcCBiZWxvdwogICAgLy8gc28gd2UgY3JlYXRlIGEgbmV3IGxpc3QgZm9yIFs6IG1hcFttZW1iZXJOYW1lXSA6XSBhbmQgcHJlcGVuZCB0aGUKICAgIC8vIFtyZW1haW5pbmddIG1lbWJlcnMgYWZ0ZXIgdGhlIGxvb3AuCiAgICBtYXBbbWVtYmVyTmFtZV0gPSBuZXcgU2V0PE1lbWJlclVzYWdlPigpOwogICAgU2V0PE1lbWJlclVzYWdlPiByZW1haW5pbmcgPSBuZXcgU2V0PE1lbWJlclVzYWdlPigpOwogICAgZm9yIChNZW1iZXJVc2FnZSBtZW1iZXIgaW4gbWVtYmVycykgewogICAgICBpZiAoIWYobWVtYmVyKSkgcmVtYWluaW5nLmFkZChtZW1iZXIpOwogICAgfQogICAgbWFwW21lbWJlck5hbWVdLmFkZEFsbChyZW1haW5pbmcpOwogIH0KCiAgLy8vIFJldHVybiB0aGUgY2Fub25pY2FsIFtDbGFzc1VzYWdlXSBmb3IgW2Nsc10uCiAgQ2xhc3NVc2FnZSBfZ2V0Q2xhc3NVc2FnZShDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBfcHJvY2Vzc2VkQ2xhc3Nlcy5wdXRJZkFic2VudChjbHMsICgpID0+IG5ldyBDbGFzc1VzYWdlKGNscykpOwogIH0KCiAgdm9pZCBfcHJvY2Vzc0luc3RhbnRpYXRlZENsYXNzKENsYXNzRW50aXR5IGNscywgQ2xhc3NVc2VkQ2FsbGJhY2sgY2xhc3NVc2VkKSB7CiAgICAvLyBSZWdpc3RlcnMgW3N1cGVyY2xhc3NdIGFzIGluc3RhbnRpYXRlZC4gUmV0dXJucyBgdHJ1ZWAgaWYgaXQgd2Fzbid0CiAgICAvLyBhbHJlYWR5IGluc3RhbnRpYXRlZCBhbmQgd2UgdGhlcmVmb3JlIGhhdmUgdG8gcHJvY2VzcyBpdHMgc3VwZXJjbGFzcyBhcwogICAgLy8gd2VsbC4KICAgIGJvb2wgcHJvY2Vzc0NsYXNzKENsYXNzRW50aXR5IHN1cGVyY2xhc3MpIHsKICAgICAgQ2xhc3NVc2FnZSB1c2FnZSA9IF9nZXRDbGFzc1VzYWdlKHN1cGVyY2xhc3MpOwogICAgICBpZiAoIXVzYWdlLmlzSW5zdGFudGlhdGVkKSB7CiAgICAgICAgY2xhc3NVc2VkKHVzYWdlLmNscywgdXNhZ2UuaW5zdGFudGlhdGUoKSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHdoaWxlIChjbHMgIT0gbnVsbCAmJiBwcm9jZXNzQ2xhc3MoY2xzKSkgewogICAgICBjbHMgPSBfZWxlbWVudEVudmlyb25tZW50LmdldFN1cGVyQ2xhc3MoY2xzKTsKICAgIH0KICB9CgogIC8vLyBTZXQgb2YgYWxsIHJlZ2lzdGVyZWQgY29tcGlsZWQgY29uc3RhbnRzLgogIGZpbmFsIFNldDxDb25zdGFudFZhbHVlPiBjb21waWxlZENvbnN0YW50cyA9IG5ldyBTZXQ8Q29uc3RhbnRWYWx1ZT4oKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRDb21waWxlVGltZUNvbnN0YW50Rm9yRW1pc3Npb24oQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgY29tcGlsZWRDb25zdGFudHMuYWRkKGNvbnN0YW50KTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8Q29uc3RhbnRWYWx1ZT4gZ2V0Q29uc3RhbnRzRm9yRW1pc3Npb24oCiAgICAgIFtDb21wYXJhdG9yPENvbnN0YW50VmFsdWU+IHByZVNvcnRDb21wYXJlXSkgewogICAgLy8gV2UgbXVzdCBlbWl0IGRlcGVuZGVuY2llcyBiZWZvcmUgdGhlaXIgdXNlcy4KICAgIFNldDxDb25zdGFudFZhbHVlPiBzZWVuQ29uc3RhbnRzID0gbmV3IFNldDxDb25zdGFudFZhbHVlPigpOwogICAgTGlzdDxDb25zdGFudFZhbHVlPiByZXN1bHQgPSBuZXcgTGlzdDxDb25zdGFudFZhbHVlPigpOwoKICAgIHZvaWQgYWRkQ29uc3RhbnQoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgICBpZiAoIXNlZW5Db25zdGFudHMuY29udGFpbnMoY29uc3RhbnQpKSB7CiAgICAgICAgY29uc3RhbnQuZ2V0RGVwZW5kZW5jaWVzKCkuZm9yRWFjaChhZGRDb25zdGFudCk7CiAgICAgICAgYXNzZXJ0KCFzZWVuQ29uc3RhbnRzLmNvbnRhaW5zKGNvbnN0YW50KSk7CiAgICAgICAgcmVzdWx0LmFkZChjb25zdGFudCk7CiAgICAgICAgc2VlbkNvbnN0YW50cy5hZGQoY29uc3RhbnQpOwogICAgICB9CiAgICB9CgogICAgTGlzdDxDb25zdGFudFZhbHVlPiBzb3J0ZWQgPSBjb21waWxlZENvbnN0YW50cy50b0xpc3QoKTsKICAgIGlmIChwcmVTb3J0Q29tcGFyZSAhPSBudWxsKSB7CiAgICAgIHNvcnRlZC5zb3J0KHByZVNvcnRDb21wYXJlKTsKICAgIH0KICAgIHNvcnRlZC5mb3JFYWNoKGFkZENvbnN0YW50KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gUmVnaXN0ZXIgdGhlIGNvbnN0YW50IFt1c2VdIHdpdGggdGhpcyB3b3JsZCBidWlsZGVyLiBSZXR1cm5zIGB0cnVlYCBpZgogIC8vLyB0aGUgY29uc3RhbnQgdXNlIHdhcyBuZXcgdG8gdGhlIHdvcmxkLgogIGJvb2wgcmVnaXN0ZXJDb25zdGFudFVzZShDb25zdGFudFVzZSB1c2UpIHsKICAgIGFkZENvbXBpbGVUaW1lQ29uc3RhbnRGb3JFbWlzc2lvbih1c2UudmFsdWUpOwogICAgcmV0dXJuIF9jb25zdGFudFZhbHVlcy5hZGQodXNlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPExvY2FsPiBnZXQgZ2VuZXJpY0xvY2FsRnVuY3Rpb25zID0+IGNvbnN0IDxMb2NhbD5bXTsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8RnVuY3Rpb25FbnRpdHk+IGdldCBnZW5lcmljSW5zdGFuY2VNZXRob2RzIHsKICAgIExpc3Q8RnVuY3Rpb25FbnRpdHk+IGZ1bmN0aW9ucyA9IDxGdW5jdGlvbkVudGl0eT5bXTsKCiAgICB2b2lkIHByb2Nlc3NNZW1iZXJVc2UoTWVtYmVyRW50aXR5IG1lbWJlciwgTWVtYmVyVXNhZ2UgbWVtYmVyVXNhZ2UpIHsKICAgICAgaWYgKG1lbWJlci5pc0luc3RhbmNlTWVtYmVyICYmCiAgICAgICAgICBtZW1iZXIgaXMgRnVuY3Rpb25FbnRpdHkgJiYKICAgICAgICAgIG1lbWJlclVzYWdlLmhhc1VzZSAmJgogICAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRGdW5jdGlvblR5cGVWYXJpYWJsZXMobWVtYmVyKS5pc05vdEVtcHR5KSB7CiAgICAgICAgZnVuY3Rpb25zLmFkZChtZW1iZXIpOwogICAgICB9CiAgICB9CgogICAgX2luc3RhbmNlTWVtYmVyVXNhZ2UuZm9yRWFjaChwcm9jZXNzTWVtYmVyVXNlKTsKICAgIHJldHVybiBmdW5jdGlvbnM7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxGdW5jdGlvbkVudGl0eT4gZ2V0IHVzZXJOb1N1Y2hNZXRob2RzIHsKICAgIExpc3Q8RnVuY3Rpb25FbnRpdHk+IGZ1bmN0aW9ucyA9IDxGdW5jdGlvbkVudGl0eT5bXTsKCiAgICB2b2lkIHByb2Nlc3NNZW1iZXJVc2UoTWVtYmVyRW50aXR5IG1lbWJlciwgTWVtYmVyVXNhZ2UgbWVtYmVyVXNhZ2UpIHsKICAgICAgaWYgKG1lbWJlci5pc0luc3RhbmNlTWVtYmVyICYmCiAgICAgICAgICBtZW1iZXIgaXMgRnVuY3Rpb25FbnRpdHkgJiYKICAgICAgICAgIG1lbWJlclVzYWdlLmhhc1VzZSAmJgogICAgICAgICAgbWVtYmVyLm5hbWUgPT0gSWRlbnRpZmllcnMubm9TdWNoTWV0aG9kXyAmJgogICAgICAgICAgIV93b3JsZC5jb21tb25FbGVtZW50cy5pc0RlZmF1bHROb1N1Y2hNZXRob2RJbXBsZW1lbnRhdGlvbihtZW1iZXIpKSB7CiAgICAgICAgZnVuY3Rpb25zLmFkZChtZW1iZXIpOwogICAgICB9CiAgICB9CgogICAgX2luc3RhbmNlTWVtYmVyVXNhZ2UuZm9yRWFjaChwcm9jZXNzTWVtYmVyVXNlKTsKICAgIHJldHVybiBmdW5jdGlvbnM7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxGdW5jdGlvbkVudGl0eT4gZ2V0IGdlbmVyaWNNZXRob2RzIHsKICAgIExpc3Q8RnVuY3Rpb25FbnRpdHk+IGZ1bmN0aW9ucyA9IDxGdW5jdGlvbkVudGl0eT5bXTsKCiAgICB2b2lkIHByb2Nlc3NNZW1iZXJVc2UoRW50aXR5IG1lbWJlciwgQWJzdHJhY3RVc2FnZSBtZW1iZXJVc2FnZSkgewogICAgICBpZiAobWVtYmVyIGlzIEZ1bmN0aW9uRW50aXR5ICYmCiAgICAgICAgICBtZW1iZXJVc2FnZS5oYXNVc2UgJiYKICAgICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0RnVuY3Rpb25UeXBlVmFyaWFibGVzKG1lbWJlcikuaXNOb3RFbXB0eSkgewogICAgICAgIGZ1bmN0aW9ucy5hZGQobWVtYmVyKTsKICAgICAgfQogICAgfQoKICAgIF9pbnN0YW5jZU1lbWJlclVzYWdlLmZvckVhY2gocHJvY2Vzc01lbWJlclVzZSk7CiAgICBfc3RhdGljTWVtYmVyVXNhZ2UuZm9yRWFjaChwcm9jZXNzTWVtYmVyVXNlKTsKICAgIHJldHVybiBmdW5jdGlvbnM7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hQYXJhbWV0ZXIoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24sCiAgICAgIHZvaWQgZihEYXJ0VHlwZSB0eXBlLCBTdHJpbmcgbmFtZSwgQ29uc3RhbnRWYWx1ZSBkZWZhdWx0VmFsdWUpKSB7CiAgICBfZWxlbWVudE1hcC5mb3JFYWNoUGFyYW1ldGVyKGZ1bmN0aW9uLCBmLAogICAgICAgIGlzTmF0aXZlOiBfd29ybGQubmF0aXZlRGF0YS5pc05hdGl2ZU1lbWJlcihmdW5jdGlvbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoUGFyYW1ldGVyQXNMb2NhbCgKICAgICAgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24sIHZvaWQgZihMb2NhbCBwYXJhbWV0ZXIpKSB7CiAgICBmb3JFYWNoT3JkZXJlZFBhcmFtZXRlckFzTG9jYWwoX2dsb2JhbExvY2Fsc01hcCwgX2VsZW1lbnRNYXAsIGZ1bmN0aW9uLAogICAgICAgIChMb2NhbCBwYXJhbWV0ZXIsIHtib29sIGlzRWxpZGVkfSkgewogICAgICBpZiAoIWlzRWxpZGVkKSB7CiAgICAgICAgZihwYXJhbWV0ZXIpOwogICAgICB9CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaEluc3RhbmNlRmllbGQoQ2xhc3NFbnRpdHkgY2xzLAogICAgICB2b2lkIGYoQ2xhc3NFbnRpdHkgZGVjbGFyZXIsIEZpZWxkRW50aXR5IGZpZWxkLCB7Ym9vbCBpc0VsaWRlZH0pKSB7CiAgICBfZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hDbGFzc01lbWJlcihjbHMsCiAgICAgICAgKENsYXNzRW50aXR5IGRlY2xhcmVyLCBNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAgIGlmIChtZW1iZXIuaXNGaWVsZCAmJiBtZW1iZXIuaXNJbnN0YW5jZU1lbWJlcikgewogICAgICAgIGYoZGVjbGFyZXIsIG1lbWJlciwKICAgICAgICAgICAgaXNFbGlkZWQ6IF93b3JsZC5maWVsZEFuYWx5c2lzLmdldEZpZWxkRGF0YShtZW1iZXIpLmlzRWxpZGVkKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hEaXJlY3RJbnN0YW5jZUZpZWxkKAogICAgICBDbGFzc0VudGl0eSBjbHMsIHZvaWQgZihGaWVsZEVudGl0eSBmaWVsZCwge2Jvb2wgaXNFbGlkZWR9KSkgewogICAgLy8gVE9ETyhzcmEpOiBBZGQgRWxlbWVudEVudmlyb25tZW50LmZvckVhY2hEaXJlY3RJbnN0YW5jZUZpZWxkIG9yCiAgICAvLyBwYXJhbWV0ZXJpemUgW2ZvckVhY2hJbnN0YW5jZUZpZWxkXSB0byBmaWx0ZXIgbWVtYmVycyB0byBhdm9pZCBhCiAgICAvLyBwb3RlbnRpYWxseSBPKG5eMikgc2NhbiBvZiB0aGUgc3VwZXJjbGFzc2VzLgogICAgX2VsZW1lbnRFbnZpcm9ubWVudC5mb3JFYWNoQ2xhc3NNZW1iZXIoY2xzLAogICAgICAgIChDbGFzc0VudGl0eSBkZWNsYXJlciwgTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgICBpZiAoZGVjbGFyZXIgIT0gY2xzKSByZXR1cm47CiAgICAgIGlmICghbWVtYmVyLmlzRmllbGQpIHJldHVybjsKICAgICAgaWYgKCFtZW1iZXIuaXNJbnN0YW5jZU1lbWJlcikgcmV0dXJuOwogICAgICBmKG1lbWJlciwgaXNFbGlkZWQ6IF93b3JsZC5maWVsZEFuYWx5c2lzLmdldEZpZWxkRGF0YShtZW1iZXIpLmlzRWxpZGVkKTsKICAgIH0pOwogIH0KCiAgdm9pZCByZWdpc3RlckNvbnN0VHlwZUxpdGVyYWwoRGFydFR5cGUgdHlwZSkgewogICAgX2NvbnN0VHlwZUxpdGVyYWxzLmFkZCh0eXBlKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPERhcnRUeXBlPiBnZXQgY29uc3RUeXBlTGl0ZXJhbHMgPT4gX2NvbnN0VHlwZUxpdGVyYWxzOwoKICB2b2lkIHJlZ2lzdGVyVHlwZUFyZ3VtZW50KERhcnRUeXBlIHR5cGUpIHsKICAgIF9saXZlVHlwZUFyZ3VtZW50cy5hZGQodHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxEYXJ0VHlwZT4gZ2V0IGxpdmVUeXBlQXJndW1lbnRzID0+IF9saXZlVHlwZUFyZ3VtZW50czsKfQqC5gBOTjwBGgEwIiMkIT4iLB8cKhwmEkwdAScERz03MQFNTxAGThI3SQFLSRwGThIjTgFQSTtHAUkgQwEbRQEdRQEdRQE5LgEuAUUBSwFLAT06AS8GNDcBDDIBMkIBTCwGS09OLzMBQSwBQiwCATclHQFMUBQGND0xUAFMJQYqSgE8RwEMTQEMOyEMOCFINko2SjYBOSMBTgFBPCUBRBoBQz4lAUYcAUwSPyQBRxJBJAEMNgFBAUcBJgFAQAEbSAFLAT0BQgEMSj4BNgw6KQQBNgxHATJOPkwiOSQ5IkVJRDInLTEGAVEjKDdMOhVRCgoGBAFKMSkwLTlAFwoIBhIEASxNBAEML1FJBAEML08EARs+LScBOzg/NTg1MxcKFgoGAR8iIzw/S0FDFwoPH0E9PxcKDx9BPhcKDwYSBAEzRS0hNzNLQx84PBMGOgQBNjAiKQQBDEYxBAEMTDMEAQxMMwQBDBtGHgQBDB1GIAQBDB1GIAQBMiIEATEsLTAuCAYeKj0PKToPKiQiJyYkLTMmKCMhHh4lLg8GBAFPKCNLJTYgMQ82CAg6HiooKA8kJCInJkZMShQPIS0qDyopHh4lLioPLTMmKg8oMUlJP0Y6JSo8JU0oCg8jLQ8GHSgGBAE0OCQEAUseMDFQCAQBOEQeKikEAR9EHktBHzYZJy87OzwnOCUIOSYIN0lAKwgBFTBEJiNMGwopSSwhRRsKLggiDRQfCAYSBAFJHzAhTUkrLjkqLQYnBAEzL0oEAVFLTw0wNSMzFQgUBgEvNAYEATBJAQxDJQQBDC80NEE8AS8vOTMeJQgGAT0iIwYhEwQBTS0uMisEAQxAAQw4OQFKJSYgTR8IBgE0FgQBDDM5AUolJiA2UB8IBgE0FgQBDDA5AUYmIE0fCAYBNDIWBAEMMUguPwQBDCA6TC0XFggIBAEMLUowNjccSwgIBAEMI0VHSDQwNiMjLE8IBAExIgQBDEIBLSIEAQxCAgE4cGFja2FnZTpjb21waWxlci9zcmMvdW5pdmVyc2UvY29kZWdlbl93b3JsZF9idWlsZGVyLmRhcnREc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvdW5pdmVyc2UvcmVzb2x1dGlvbl93b3JsZF9idWlsZGVyLmRhcnTAAKMOLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbi9uYW1lcy5kYXJ0JyBzaG93IElkZW50aWZpZXJzLCBOYW1lczsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pci9zdGF0aWNfdHlwZS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2Fubm90YXRpb25zLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvZmllbGRfYW5hbHlzaXMuZGFydCcgc2hvdyBLRmllbGRBbmFseXNpczsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2JhY2tlbmRfdXNhZ2UuZGFydCcKICAgIHNob3cgQmFja2VuZFVzYWdlLCBCYWNrZW5kVXNhZ2VCdWlsZGVyOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvaW50ZXJjZXB0b3JfZGF0YS5kYXJ0JyBzaG93IEludGVyY2VwdG9yRGF0YUJ1aWxkZXI7CmltcG9ydCAnLi4vanNfYmFja2VuZC9uYXRpdmVfZGF0YS5kYXJ0JyBzaG93IE5hdGl2ZUJhc2ljRGF0YSwgTmF0aXZlRGF0YUJ1aWxkZXI7CmltcG9ydCAnLi4vanNfYmFja2VuZC9ub19zdWNoX21ldGhvZF9yZWdpc3RyeS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXMuZGFydCc7CmltcG9ydCAnLi4va2VybmVsL2VsZW1lbnRfbWFwX2ltcGwuZGFydCc7CmltcG9ydCAnLi4va2VybmVsL2tlbGVtZW50cy5kYXJ0JzsKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX3dvcmxkLmRhcnQnOwppbXBvcnQgJy4uL25hdGl2ZS9lbnF1ZXVlLmRhcnQnIHNob3cgTmF0aXZlUmVzb2x1dGlvbkVucXVldWVyOwppbXBvcnQgJy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vdXRpbC9lbnVtc2V0LmRhcnQnOwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JzsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JyBzaG93IEtDbG9zZWRXb3JsZCwgT3BlbldvcmxkOwppbXBvcnQgJ2NhbGxfc3RydWN0dXJlLmRhcnQnOwppbXBvcnQgJ2NsYXNzX2hpZXJhcmNoeS5kYXJ0JyBzaG93IENsYXNzSGllcmFyY2h5QnVpbGRlciwgQ2xhc3NRdWVyaWVzOwppbXBvcnQgJ2NsYXNzX3NldC5kYXJ0JzsKaW1wb3J0ICdtZW1iZXJfdXNhZ2UuZGFydCc7CmltcG9ydCAnc2VsZWN0b3IuZGFydCcgc2hvdyBTZWxlY3RvcjsKaW1wb3J0ICd1c2UuZGFydCcKICAgIHNob3cgQ29uc3RhbnRVc2UsIER5bmFtaWNVc2UsIER5bmFtaWNVc2VLaW5kLCBTdGF0aWNVc2UsIFN0YXRpY1VzZUtpbmQ7CmltcG9ydCAnd29ybGRfYnVpbGRlci5kYXJ0JzsKCmFic3RyYWN0IGNsYXNzIFJlc29sdXRpb25Xb3JsZEJ1aWxkZXIgaW1wbGVtZW50cyBXb3JsZEJ1aWxkZXIsIE9wZW5Xb3JsZCB7CiAgLy8vIENhbGxzIFtmXSBmb3IgYWxsIGxvY2FsIGZ1bmN0aW9ucyBpbiB0aGUgcHJvZ3JhbSB0b2dldGhlciB3aXRoIHRoZSBtZW1iZXIKICAvLy8gaW4gd2hpY2ggdGhleSBhcmUgZGVjbGFyZWQuCiAgLy8vCiAgLy8vIFVzZWQgYnkgdGhlIG1pcnJvciB0cmFja2luZyBzeXN0ZW0gdG8gZmluZCBhbGwgbGl2ZSBjbG9zdXJlIGluc3RhbmNlcy4KICB2b2lkIGZvckVhY2hMb2NhbEZ1bmN0aW9uKHZvaWQgZihNZW1iZXJFbnRpdHkgbWVtYmVyLCBMb2NhbCBsb2NhbEZ1bmN0aW9uKSk7CgogIC8vLyBTZXQgb2YgKGxpdmUpIGxvY2FsIGZ1bmN0aW9ucyAoY2xvc3VyZXMpLgogIC8vLwogIC8vLyBBIGxpdmUgZnVuY3Rpb24gaXMgb25lIHdob3NlIGVuY2xvc2luZyBtZW1iZXIgZnVuY3Rpb24gaGFzIGJlZW4gZW5xdWV1ZWQuCiAgSXRlcmFibGU8TG9jYWw+IGdldCBsb2NhbEZ1bmN0aW9uczsKCiAgLy8vIFNldCBvZiAobGl2ZSkgbG9jYWwgZnVuY3Rpb25zIChjbG9zdXJlcykgd2hvc2Ugc2lnbmF0dXJlcyByZWZlcmVuY2UgdHlwZQogIC8vLyB2YXJpYWJsZXMuCiAgLy8vCiAgLy8vIEEgbGl2ZSBmdW5jdGlvbiBpcyBvbmUgd2hvc2UgZW5jbG9zaW5nIG1lbWJlciBmdW5jdGlvbiBoYXMgYmVlbiBlbnF1ZXVlZC4KICBJdGVyYWJsZTxMb2NhbD4gZ2V0IGxvY2FsRnVuY3Rpb25zV2l0aEZyZWVUeXBlVmFyaWFibGVzOwoKICAvLy8gU2V0IG9mIGxpdmUgY2xvc3VyaXplZCBtZW1iZXJzIHdob3NlIHNpZ25hdHVyZXMgcmVmZXJlbmNlIHR5cGUgdmFyaWFibGVzLgogIC8vLwogIC8vLyBBIGNsb3N1cml6ZWQgbWV0aG9kIGlzIGNvbnNpZGVyZWQgbGl2ZSBpZiB0aGUgZW5jbG9zaW5nIGNsYXNzIGhhcyBiZWVuCiAgLy8vIGluc3RhbnRpYXRlZC4KICBJdGVyYWJsZTxGdW5jdGlvbkVudGl0eT4gZ2V0IGNsb3N1cml6ZWRNZW1iZXJzV2l0aEZyZWVUeXBlVmFyaWFibGVzOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2Nsc10gaXMgY29uc2lkZXJlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBhbgogIC8vLyBpbnN0YW50aWF0ZWQgY2xhc3MsIGVpdGhlciBkaXJlY3RseSwgdGhyb3VnaCBzdWJjbGFzc2VzIG9yIHRocm91Z2gKICAvLy8gc3VidHlwZXMuIFRoZSBsYXR0ZXIgY2FzZSBvbmx5IGNvbnRhaW5zIHNwdXJpb3VzIGluZm9ybWF0aW9uIGZyb20KICAvLy8gaW5zdGFudGlhdGlvbnMgdGhyb3VnaCBmYWN0b3J5IGNvbnN0cnVjdG9ycyBhbmQgbWl4aW5zLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEltcHJvdmUgc2VtYW50aWMgcHJlY2lzaW9uLgogIGJvb2wgaXNJbXBsZW1lbnRlZChjb3ZhcmlhbnQgQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFNldCBvZiBhbGwgZmllbGRzIHRoYXQgYXJlIHN0YXRpY2FsbHkga25vd24gdG8gYmUgd3JpdHRlbiB0by4KICBJdGVyYWJsZTxGaWVsZEVudGl0eT4gZ2V0IGZpZWxkU2V0dGVyczsKCiAgLy8vIENhbGwgW2ZdIGZvciBhbGwgY2xhc3NlcyB3aXRoIGluc3RhbnRpYXRlZCB0eXBlcy4gVGhpcyBpbmNsdWRlcyB0aGUKICAvLy8gZGlyZWN0bHkgYW5kIGFic3RyYWN0bHkgaW5zdGFudGlhdGVkIGNsYXNzZXMgYnV0IGFsc28gY2xhc3NlcyB3aG9zZSB0eXBlCiAgLy8vIGFyZ3VtZW50cyBhcmUgdXNlZCBpbiBsaXZlIGZhY3RvcnkgY29uc3RydWN0b3JzLgogIHZvaWQgZm9yRWFjaEluc3RhbnRpYXRlZENsYXNzKGYoQ2xhc3NFbnRpdHkgY2xzLCBJbnN0YW50aWF0aW9uSW5mbyBpbmZvKSk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbbWVtYmVyXSBpcyBpbnZva2VkIGFzIGEgc2V0dGVyLgogIGJvb2wgaGFzSW52b2tlZFNldHRlcihNZW1iZXJFbnRpdHkgbWVtYmVyKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFttZW1iZXJdIGhhcyBiZWVuIG1hcmtlZCBhcyB1c2VkIChjYWxsZWQsIHJlYWQsIGV0Yy4pIGluCiAgLy8vIHRoaXMgd29ybGQgYnVpbGRlci4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNYXliZSB0aGlzIHNob3VsZCBiZSBwYXJ0IG9mIFtDbG9zZWRXb3JsZF0gKGluc3RlYWQpLgogIGJvb2wgaXNNZW1iZXJVc2VkKE1lbWJlckVudGl0eSBtZW1iZXIpOwoKICAvLy8gVGhlIGNsb3NlZCB3b3JsZCBjb21wdXRlZCBieSB0aGlzIHdvcmxkIGJ1aWxkZXIuCiAgLy8vCiAgLy8vIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHdvcmxkIGJ1aWxkZXIgaGFzIGJlZW4gY2xvc2VkLgogIEtDbG9zZWRXb3JsZCBnZXQgY2xvc2VkV29ybGRGb3JUZXN0aW5nOwoKICB2b2lkIHJlZ2lzdGVyQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKTsKfQoKLy8vIEV4dGVuZGVkIFtSZXNvbHV0aW9uV29ybGRCdWlsZGVyXSBpbnRlcmZhY2UgdXNlZCBieSB0aGUKLy8vIFtSZXNvbHV0aW9uRW5xdWV1ZXJdLgphYnN0cmFjdCBjbGFzcyBSZXNvbHV0aW9uRW5xdWV1ZXJXb3JsZEJ1aWxkZXIgZXh0ZW5kcyBSZXNvbHV0aW9uV29ybGRCdWlsZGVyIHsKICAvLy8gUmV0dXJucyB0aGUgY2xhc3NlcyByZWdpc3RlcmVkIGFzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5zdGFudGlhdGVkLgogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBnZXQgcHJvY2Vzc2VkQ2xhc3NlczsKCiAgLy8vIFJlZ2lzdGVycyB0aGF0IFtlbGVtZW50XSBoYXMgYmVlbiBjbG9zdXJpemVkLgogIHZvaWQgcmVnaXN0ZXJDbG9zdXJpemVkTWVtYmVyKE1lbWJlckVudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJlZ2lzdGVyIFt0eXBlXSBhcyAoZGlyZWN0bHkpIGluc3RhbnRpYXRlZC4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBGdWxseSBlbmZvcmNlIHRoZSBzZXBhcmF0aW9uIGJldHdlZW4gZXhhY3QsIHRocm91Z2gKICAvLyBzdWJjbGFzcyBhbmQgdGhyb3VnaCBzdWJ0eXBlIGluc3RhbnRpYXRlZCB0eXBlcy9jbGFzc2VzLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFN1cHBvcnQgdW5rbm93biB0eXBlIGFyZ3VtZW50cyBmb3IgZ2VuZXJpYyB0eXBlcy4KICB2b2lkIHJlZ2lzdGVyVHlwZUluc3RhbnRpYXRpb24oCiAgICAgIEludGVyZmFjZVR5cGUgdHlwZSwgQ2xhc3NVc2VkQ2FsbGJhY2sgY2xhc3NVc2VkLAogICAgICB7Q29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IsIGJvb2wgaXNSZWRpcmVjdGlvbjogZmFsc2V9KTsKCiAgLy8vIENvbXB1dGVzIHVzYWdlIGZvciBhbGwgbWVtYmVycyBkZWNsYXJlZCBieSBbY2xzXS4gQ2FsbHMgW21lbWJlcnNVc2VkXSB3aXRoCiAgLy8vIHRoZSB1c2FnZSBjaGFuZ2VzIGZvciBlYWNoIG1lbWJlci4KICB2b2lkIHByb2Nlc3NDbGFzc01lbWJlcnMoQ2xhc3NFbnRpdHkgY2xzLCBNZW1iZXJVc2VkQ2FsbGJhY2sgbWVtYmVyVXNlZCwKICAgICAge2Jvb2wgZHJ5UnVuOiBmYWxzZX0pOwoKICAvLy8gQXBwbGllcyB0aGUgW2R5bmFtaWNVc2VdIHRvIGFwcGxpY2FibGUgaW5zdGFuY2UgbWVtYmVycy4gQ2FsbHMKICAvLy8gW21lbWJlcnNVc2VkXSB3aXRoIHRoZSB1c2FnZSBjaGFuZ2VzIGZvciBlYWNoIG1lbWJlci4KICB2b2lkIHJlZ2lzdGVyRHluYW1pY1VzZShEeW5hbWljVXNlIGR5bmFtaWNVc2UsIE1lbWJlclVzZWRDYWxsYmFjayBtZW1iZXJVc2VkKTsKCiAgLy8vIEFwcGxpZXMgdGhlIFtzdGF0aWNVc2VdIHRvIGFwcGxpY2FibGUgbWVtYmVycy4gQ2FsbHMgW21lbWJlcnNVc2VkXSB3aXRoCiAgLy8vIHRoZSB1c2FnZSBjaGFuZ2VzIGZvciBlYWNoIG1lbWJlci4KICB2b2lkIHJlZ2lzdGVyU3RhdGljVXNlKFN0YXRpY1VzZSBzdGF0aWNVc2UsIE1lbWJlclVzZWRDYWxsYmFjayBtZW1iZXJVc2VkKTsKCiAgLy8vIFJlZ2lzdGVyIHRoZSBjb25zdGFudCBbdXNlXSB3aXRoIHRoaXMgd29ybGQgYnVpbGRlci4gUmV0dXJucyBgdHJ1ZWAgaWYKICAvLy8gdGhlIGNvbnN0YW50IHVzZSB3YXMgbmV3IHRvIHRoZSB3b3JsZC4KICBib29sIHJlZ2lzdGVyQ29uc3RhbnRVc2UoQ29uc3RhbnRVc2UgdXNlKTsKCiAgYm9vbCBpc01lbWJlclByb2Nlc3NlZChNZW1iZXJFbnRpdHkgbWVtYmVyKTsKICB2b2lkIHJlZ2lzdGVyUHJvY2Vzc2VkTWVtYmVyKE1lbWJlckVudGl0eSBtZW1iZXIpOwogIEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gZ2V0IHByb2Nlc3NlZE1lbWJlcnM7CgogIC8vLyBSZWdpc3RlcnMgdGhhdCBbdHlwZV0gaXMgY2hlY2tlZCBpbiB0aGlzIHdvcmxkIGJ1aWxkZXIuIFRoZSB1bmFsaWFzZWQgdHlwZQogIC8vLyBpcyByZXR1cm5lZC4KICB2b2lkIHJlZ2lzdGVySXNDaGVjayhEYXJ0VHlwZSB0eXBlKTsKCiAgdm9pZCByZWdpc3RlclR5cGVWYXJpYWJsZVR5cGVMaXRlcmFsKFR5cGVWYXJpYWJsZVR5cGUgdHlwZVZhcmlhYmxlKTsKfQoKLy8vIFRoZSB0eXBlIGFuZCBraW5kIG9mIGFuIGluc3RhbnRpYXRpb24gcmVnaXN0ZXJlZCB0aHJvdWdoCi8vLyBgUmVzb2x1dGlvbldvcmxkQnVpbGRlci5yZWdpc3RlclR5cGVJbnN0YW50aWF0aW9uYC4KY2xhc3MgSW5zdGFuY2UgewogIGZpbmFsIEludGVyZmFjZVR5cGUgdHlwZTsKICBmaW5hbCBJbnN0YW50aWF0aW9uIGtpbmQ7CiAgZmluYWwgYm9vbCBpc1JlZGlyZWN0aW9uOwoKICBJbnN0YW5jZSh0aGlzLnR5cGUsIHRoaXMua2luZCwge3RoaXMuaXNSZWRpcmVjdGlvbjogZmFsc2V9KTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICByZXR1cm4gSGFzaGluZy5vYmplY3RIYXNoKAogICAgICAgIHR5cGUsIEhhc2hpbmcub2JqZWN0SGFzaChraW5kLCBIYXNoaW5nLm9iamVjdEhhc2goaXNSZWRpcmVjdGlvbikpKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgSW5zdGFuY2UpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB0eXBlID09IG90aGVyLnR5cGUgJiYKICAgICAgICBraW5kID09IG90aGVyLmtpbmQgJiYKICAgICAgICBpc1JlZGlyZWN0aW9uID09IG90aGVyLmlzUmVkaXJlY3Rpb247CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSh0eXBlKTsKICAgIGlmIChraW5kID09IEluc3RhbnRpYXRpb24uRElSRUNUTFlfSU5TVEFOVElBVEVEKSB7CiAgICAgIHNiLndyaXRlKCcgZGlyZWN0bHknKTsKICAgIH0gZWxzZSBpZiAoa2luZCA9PSBJbnN0YW50aWF0aW9uLkFCU1RSQUNUTFlfSU5TVEFOVElBVEVEKSB7CiAgICAgIHNiLndyaXRlKCcgYWJzdHJhY3RseScpOwogICAgfSBlbHNlIGlmIChraW5kID09IEluc3RhbnRpYXRpb24uVU5JTlNUQU5USUFURUQpIHsKICAgICAgc2Iud3JpdGUoJyBub25lJyk7CiAgICB9CiAgICBpZiAoaXNSZWRpcmVjdGlvbikgewogICAgICBzYi53cml0ZSgnIHJlZGlyZWN0Jyk7CiAgICB9CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCi8vLyBJbmZvcm1hdGlvbiBhYm91dCBpbnN0YW50aWF0aW9ucyBvZiBhIGNsYXNzLgpjbGFzcyBJbnN0YW50aWF0aW9uSW5mbyB7CiAgLy8vIEEgbWFwIGZyb20gY29uc3RydWN0b3Igb2YgdGhlIGNsYXNzIHRvIHRoZWlyIGluc3RhbnRpYXRlZCB0eXBlcy4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlCiAgLy8vCiAgLy8vICAgIGltcG9ydCAnZGFydDpodG1sJzsKICAvLy8KICAvLy8gICAgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDbGFzczxTPiB7CiAgLy8vICAgICAgZmFjdG9yeSBBYnN0cmFjdENsYXNzLmEoKSA9IENsYXNzPFM+LmE7CiAgLy8vICAgICAgZmFjdG9yeSBBYnN0cmFjdENsYXNzLmIoKSA9PiBuZXcgQ2xhc3M8Uz4uYigpOwogIC8vLyAgICB9CiAgLy8vICAgIGNsYXNzIENsYXNzPFQ+IGltcGxlbWVudHMgQWJzdHJhY3RDbGFzczxUPiB7CiAgLy8vICAgICAgQ2xhc3MuYSgpOwogIC8vLyAgICAgIENsYXNzLmIoKTsKICAvLy8gICAgICBmYWN0b3J5IENsYXNzLmMoKSA9IENsYXNzLmI8VD47CiAgLy8vICAgIH0KICAvLy8KICAvLy8KICAvLy8gICAgbWFpbigpIHsKICAvLy8gICAgICBuZXcgQ2xhc3MuYSgpOwogIC8vLyAgICAgIG5ldyBDbGFzczxpbnQ+LmEoKTsKICAvLy8gICAgICBuZXcgQ2xhc3M8U3RyaW5nPi5iKCk7CiAgLy8vICAgICAgbmV3IENsYXNzPG51bT4uYygpOwogIC8vLyAgICAgIG5ldyBBYnN0cmFjdENsYXNzPGRvdWJsZT4uYSgpOwogIC8vLyAgICAgIG5ldyBBYnN0cmFjdENsYXNzPGJvb2w+LmIoKTsKICAvLy8gICAgICBuZXcgRGl2RWxlbWVudCgpOyAvLyBuYXRpdmUgaW5zdGFudGlhdGlvbgogIC8vLyAgICB9CiAgLy8vCiAgLy8vIHdpbGwgZ2VuZXJhdGUgdGhlIG1hcHBpbmdzCiAgLy8vCiAgLy8vICAgIEFic3RyYWN0Q2xhc3M6IHsKICAvLy8gICAgICBBYnN0cmFjdENsYXNzLmE6IHsKICAvLy8gICAgICAgIEFic3RyYWN0Q2xhc3M8ZG91YmxlPiBub25lLCAvLyBmcm9tIGBuZXcgQWJzdHJhY3RDbGFzczxkb3VibGU+LmEoKWAKICAvLy8gICAgICB9LAogIC8vLyAgICAgIEFic3RyYWN0Q2xhc3MuYjogewogIC8vLyAgICAgICAgQWJzdHJhY3RDbGFzczxib29sPiBub25lLCAvLyBmcm9tIGBuZXcgQWJzdHJhY3RDbGFzczxib29sPi5iKClgCiAgLy8vICAgICAgfSwKICAvLy8gICAgfSwKICAvLy8gICAgQ2xhc3M6IHsKICAvLy8gICAgICBDbGFzcy5hOiB7CiAgLy8vICAgICAgICBDbGFzcyBkaXJlY3RseSwgLy8gZnJvbSBgbmV3IENsYXNzLmEoKWAKICAvLy8gICAgICAgIENsYXNzPGludD4gZGlyZWN0bHksIC8vIGZyb20gYG5ldyBDbGFzczxpbnQ+LmEoKWAKICAvLy8gICAgICAgIENsYXNzPFM+IGRpcmVjdGx5IHJlZGlyZWN0LCAvLyBmcm9tIGBmYWN0b3J5IEFic3RyYWN0Q2xhc3MuYWAKICAvLy8gICAgICB9LAogIC8vLyAgICAgIENsYXNzLmI6IHsKICAvLy8gICAgICAgIENsYXNzPFN0cmluZz4gZGlyZWN0bHksIC8vIGZyb20gYG5ldyBDbGFzczxTdHJpbmc+LmIoKWAKICAvLy8gICAgICAgIENsYXNzPFQ+IGRpcmVjdGx5IHJlZGlyZWN0LCAvLyBmcm9tIGBmYWN0b3J5IENsYXNzLmNgCiAgLy8vICAgICAgICBDbGFzczxTPiBkaXJlY3RseSwgLy8gZnJvbSBgZmFjdG9yeSBBYnN0cmFjdENsYXNzLmJgCiAgLy8vICAgICAgfSwKICAvLy8gICAgICBDbGFzcy5jOiB7CiAgLy8vICAgICAgICBDbGFzczxudW0+IGRpcmVjdGx5LCAvLyBmcm9tIGBuZXcgQ2xhc3M8bnVtPi5jKClgCiAgLy8vICAgICAgfSwKICAvLy8gICAgfSwKICAvLy8gICAgRGl2RWxlbWVudDogewogIC8vLyAgICAgIERpdkVsZW1lbnQ6IHsKICAvLy8gICAgICAgIERpdkVsZW1lbnQgYWJzdHJhY3RseSwgLy8gZnJvbSBgbmV3IERpdkVsZW1lbnQoKWAKICAvLy8gICAgICB9LAogIC8vLyAgICB9CiAgLy8vCiAgLy8vIElmIHRoZSBjb25zdHJ1Y3RvciBpcyB1bmtub3duLCBmb3IgaW5zdGFuY2UgZm9yIG5hdGl2ZSBvciBtaXJyb3IgdXNhZ2UsCiAgLy8vIGBudWxsYCBpcyB1c2VkIGFzIGtleS4KICBNYXA8Q29uc3RydWN0b3JFbnRpdHksIFNldDxJbnN0YW5jZT4+IGluc3RhbnRpYXRpb25NYXA7CgogIC8vLyBSZWdpc3RlciBbdHlwZV0gYXMgdGhlIGluc3RhbnRpYXRpb24gW2tpbmRdIHVzaW5nIFtjb25zdHJ1Y3Rvcl0uCiAgdm9pZCBhZGRJbnN0YW50aWF0aW9uKAogICAgICBDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvciwgSW50ZXJmYWNlVHlwZSB0eXBlLCBJbnN0YW50aWF0aW9uIGtpbmQsCiAgICAgIHtib29sIGlzUmVkaXJlY3Rpb246IGZhbHNlfSkgewogICAgaW5zdGFudGlhdGlvbk1hcCA/Pz0gPENvbnN0cnVjdG9yRW50aXR5LCBTZXQ8SW5zdGFuY2U+Pnt9OwogICAgaW5zdGFudGlhdGlvbk1hcAogICAgICAgIC5wdXRJZkFic2VudChjb25zdHJ1Y3RvciwgKCkgPT4gbmV3IFNldDxJbnN0YW5jZT4oKSkKICAgICAgICAuYWRkKG5ldyBJbnN0YW5jZSh0eXBlLCBraW5kLCBpc1JlZGlyZWN0aW9uOiBpc1JlZGlyZWN0aW9uKSk7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBJbnN0YW50aWF0aW9uLkRJUkVDVExZX0lOU1RBTlRJQVRFRDoKICAgICAgICBpc0RpcmVjdGx5SW5zdGFudGlhdGVkID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBJbnN0YW50aWF0aW9uLkFCU1RSQUNUTFlfSU5TVEFOVElBVEVEOgogICAgICAgIGlzQWJzdHJhY3RseUluc3RhbnRpYXRlZCA9IHRydWU7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSW5zdGFudGlhdGlvbi5VTklOU1RBTlRJQVRFRDoKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiSW5zdGFudGlhdGlvbiAka2luZCBpcyBub3QgYWxsb3dlZC4iKTsKICAgIH0KICB9CgogIC8vLyBgdHJ1ZWAgaWYgdGhlIGNsYXNzIGlzIGVpdGhlciBkaXJlY3RseSBvciBhYnN0cmFjdGx5IGluc3RhbnRpYXRlZC4KICBib29sIGdldCBoYXNJbnN0YW50aWF0aW9uID0+CiAgICAgIGlzRGlyZWN0bHlJbnN0YW50aWF0ZWQgfHwgaXNBYnN0cmFjdGx5SW5zdGFudGlhdGVkOwoKICAvLy8gYHRydWVgIGlmIHRoZSBjbGFzcyBpcyBkaXJlY3RseSBpbnN0YW50aWF0ZWQuCiAgYm9vbCBpc0RpcmVjdGx5SW5zdGFudGlhdGVkID0gZmFsc2U7CgogIC8vLyBgdHJ1ZWAgaWYgdGhlIGNsYXNzIGlzIGFic3RyYWN0bHkgaW5zdGFudGlhdGVkLgogIGJvb2wgaXNBYnN0cmFjdGx5SW5zdGFudGlhdGVkID0gZmFsc2U7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCdJbnN0YW50aWF0aW9uSW5mb1snKTsKICAgIGlmIChpbnN0YW50aWF0aW9uTWFwICE9IG51bGwpIHsKICAgICAgYm9vbCBuZWVkc0NvbW1hID0gZmFsc2U7CiAgICAgIGluc3RhbnRpYXRpb25NYXAKICAgICAgICAgIC5mb3JFYWNoKChDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvciwgU2V0PEluc3RhbmNlPiBzZXQpIHsKICAgICAgICBpZiAobmVlZHNDb21tYSkgewogICAgICAgICAgc2Iud3JpdGUoJywgJyk7CiAgICAgICAgfQogICAgICAgIGlmIChjb25zdHJ1Y3RvciAhPSBudWxsKSB7CiAgICAgICAgICBzYi53cml0ZShjb25zdHJ1Y3Rvcik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNiLndyaXRlKCc8dW5rbm93bj4nKTsKICAgICAgICB9CiAgICAgICAgc2Iud3JpdGUoJzogJyk7CiAgICAgICAgc2Iud3JpdGUoc2V0KTsKICAgICAgICBuZWVkc0NvbW1hID0gdHJ1ZTsKICAgICAgfSk7CiAgICB9CiAgICBzYi53cml0ZSgnXScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgovLy8gSW1wbGVtZW50YXRpb24gb2YgW1Jlc29sdXRpb25FbnF1ZXVlcldvcmxkQnVpbGRlcl0uCmNsYXNzIFJlc29sdXRpb25Xb3JsZEJ1aWxkZXJJbXBsIGV4dGVuZHMgV29ybGRCdWlsZGVyQmFzZQogICAgaW1wbGVtZW50cyBSZXNvbHV0aW9uRW5xdWV1ZXJXb3JsZEJ1aWxkZXIgewogIC8vLyBJbnN0YW50aWF0aW9uIGluZm9ybWF0aW9uIGZvciBhbGwgY2xhc3NlcyB3aXRoIGluc3RhbnRpYXRlZCB0eXBlcy4KICAvLy8KICAvLy8gSW52YXJpYW50OiBFbGVtZW50cyBhcmUgZGVjbGFyYXRpb24gZWxlbWVudHMuCiAgZmluYWwgTWFwPENsYXNzRW50aXR5LCBJbnN0YW50aWF0aW9uSW5mbz4gX2luc3RhbnRpYXRpb25JbmZvID0KICAgICAgPENsYXNzRW50aXR5LCBJbnN0YW50aWF0aW9uSW5mbz57fTsKCiAgLy8vIENsYXNzZXMgaW1wbGVtZW50ZWQgYnkgZGlyZWN0bHkgaW5zdGFudGlhdGVkIGNsYXNzZXMuCiAgZmluYWwgU2V0PENsYXNzRW50aXR5PiBfaW1wbGVtZW50ZWRDbGFzc2VzID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKCiAgLy8vIFRoZSBzZXQgb2YgYWxsIHJlZmVyZW5jZWQgc3RhdGljIGZpZWxkcy4KICAvLy8KICAvLy8gSW52YXJpYW50OiBFbGVtZW50cyBhcmUgZGVjbGFyYXRpb24gZWxlbWVudHMuCiAgZmluYWwgU2V0PEZpZWxkRW50aXR5PiBhbGxSZWZlcmVuY2VkU3RhdGljRmllbGRzID0gbmV3IFNldDxGaWVsZEVudGl0eT4oKTsKCiAgLy8vIERvY3VtZW50YXRpb24gd2FudGVkIC0tIGpvaG5uaXdpbnRoZXIKICAvLy8KICAvLy8gSW52YXJpYW50OiBFbGVtZW50cyBhcmUgZGVjbGFyYXRpb24gZWxlbWVudHMuCiAgZmluYWwgU2V0PEZ1bmN0aW9uRW50aXR5PiBtZXRob2RzTmVlZGluZ1N1cGVyR2V0dGVyID0KICAgICAgbmV3IFNldDxGdW5jdGlvbkVudGl0eT4oKTsKICBmaW5hbCBNYXA8U3RyaW5nLCBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+PiBfaW52b2tlZE5hbWVzID0KICAgICAgPFN0cmluZywgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPj57fTsKICBmaW5hbCBNYXA8U3RyaW5nLCBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+PiBfaW52b2tlZEdldHRlcnMgPQogICAgICA8U3RyaW5nLCBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+Pnt9OwogIGZpbmFsIE1hcDxTdHJpbmcsIE1hcDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4+IF9pbnZva2VkU2V0dGVycyA9CiAgICAgIDxTdHJpbmcsIE1hcDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4+e307CgogIGZpbmFsIE1hcDxDbGFzc0VudGl0eSwgQ2xhc3NVc2FnZT4gX3Byb2Nlc3NlZENsYXNzZXMgPQogICAgICA8Q2xhc3NFbnRpdHksIENsYXNzVXNhZ2U+e307CgogIE1hcDxDbGFzc0VudGl0eSwgQ2xhc3NVc2FnZT4gZ2V0IGNsYXNzVXNhZ2VGb3JUZXN0aW5nID0+IF9wcm9jZXNzZWRDbGFzc2VzOwoKICAvLy8gTWFwIG9mIHJlZ2lzdGVyZWQgdXNhZ2Ugb2YgbWVtYmVycyBvZiBsaXZlIGNsYXNzZXMuCiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwgTWVtYmVyVXNhZ2U+IF9tZW1iZXJVc2FnZSA9CiAgICAgIDxNZW1iZXJFbnRpdHksIE1lbWJlclVzYWdlPnt9OwoKICBNYXA8TWVtYmVyRW50aXR5LCBNZW1iZXJVc2FnZT4gZ2V0IG1lbWJlclVzYWdlRm9yVGVzdGluZyA9PiBfbWVtYmVyVXNhZ2U7CgogIE1hcDxNZW1iZXJFbnRpdHksIE1lbWJlclVzYWdlPiBnZXQgc3RhdGljTWVtYmVyVXNhZ2VGb3JUZXN0aW5nIHsKICAgIE1hcDxNZW1iZXJFbnRpdHksIE1lbWJlclVzYWdlPiBtYXAgPSA8TWVtYmVyRW50aXR5LCBNZW1iZXJVc2FnZT57fTsKICAgIF9tZW1iZXJVc2FnZS5mb3JFYWNoKChNZW1iZXJFbnRpdHkgbWVtYmVyLCBNZW1iZXJVc2FnZSB1c2FnZSkgewogICAgICBpZiAoIW1lbWJlci5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgICAgbWFwW21lbWJlcl0gPSB1c2FnZTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gbWFwOwogIH0KCiAgTWFwPE1lbWJlckVudGl0eSwgTWVtYmVyVXNhZ2U+IGdldCBpbnN0YW5jZU1lbWJlclVzYWdlRm9yVGVzdGluZyB7CiAgICBNYXA8TWVtYmVyRW50aXR5LCBNZW1iZXJVc2FnZT4gbWFwID0gPE1lbWJlckVudGl0eSwgTWVtYmVyVXNhZ2U+e307CiAgICBfbWVtYmVyVXNhZ2UuZm9yRWFjaCgoTWVtYmVyRW50aXR5IG1lbWJlciwgTWVtYmVyVXNhZ2UgdXNhZ2UpIHsKICAgICAgaWYgKG1lbWJlci5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgICAgbWFwW21lbWJlcl0gPSB1c2FnZTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gbWFwOwogIH0KCiAgLy8vIE1hcCBjb250YWluaW5nIGluc3RhbmNlIG1lbWJlcnMgb2YgbGl2ZSBjbGFzc2VzIHRoYXQgYXJlIG5vdCB5ZXQgZnVsbHkKICAvLy8gbGl2ZSB0aGVtc2VsdmVzLgogIGZpbmFsIE1hcDxTdHJpbmcsIFNldDxNZW1iZXJVc2FnZT4+IF9pbnN0YW5jZU1lbWJlcnNCeU5hbWUgPQogICAgICA8U3RyaW5nLCBTZXQ8TWVtYmVyVXNhZ2U+Pnt9OwoKICAvLy8gTWFwIGNvbnRhaW5pbmcgaW5zdGFuY2UgbWV0aG9kcyBvZiBsaXZlIGNsYXNzZXMgdGhhdCBhcmUgbm90IHlldAogIC8vLyBjbG9zdXJpemVkLgogIGZpbmFsIE1hcDxTdHJpbmcsIFNldDxNZW1iZXJVc2FnZT4+IF9pbnN0YW5jZUZ1bmN0aW9uc0J5TmFtZSA9CiAgICAgIDxTdHJpbmcsIFNldDxNZW1iZXJVc2FnZT4+e307CgogIEBvdmVycmlkZQogIGZpbmFsIFNldDxGaWVsZEVudGl0eT4gZmllbGRTZXR0ZXJzID0gbmV3IFNldDxGaWVsZEVudGl0eT4oKTsKICBAb3ZlcnJpZGUKICBmaW5hbCBTZXQ8RGFydFR5cGU+IGlzQ2hlY2tzID0gbmV3IFNldDxEYXJ0VHlwZT4oKTsKCiAgLy8vIFNldCBvZiBhbGwgY2xvc3VyZXMgaW4gdGhlIHByb2dyYW0uIFVzZWQgYnkgdGhlIG1pcnJvciB0cmFja2luZyBzeXN0ZW0KICAvLy8gdG8gZmluZCBhbGwgbGl2ZSBjbG9zdXJlIGluc3RhbmNlcy4KICBAb3ZlcnJpZGUKICBmaW5hbCBTZXQ8TG9jYWw+IGxvY2FsRnVuY3Rpb25zID0gbmV3IFNldDxMb2NhbD4oKTsKCiAgLy8vIFNldCBvZiBsaXZlIGxvY2FsIGZ1bmN0aW9ucyAoY2xvc3VyZXMpIHdob3NlIHNpZ25hdHVyZXMgcmVmZXJlbmNlIHR5cGUKICAvLy8gdmFyaWFibGVzLgogIC8vLwogIC8vLyBBIGxvY2FsIGZ1bmN0aW9uIGlzIGNvbnNpZGVyZWQgbGl2ZSBpZiB0aGUgZW5jbG9zaW5nIG1lbWJlciBmdW5jdGlvbiBpcwogIC8vLyBsaXZlLgogIEBvdmVycmlkZQogIGZpbmFsIFNldDxMb2NhbD4gbG9jYWxGdW5jdGlvbnNXaXRoRnJlZVR5cGVWYXJpYWJsZXMgPSBuZXcgU2V0PExvY2FsPigpOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTZXQ8RnVuY3Rpb25FbnRpdHk+IGNsb3N1cml6ZWRNZW1iZXJzV2l0aEZyZWVUeXBlVmFyaWFibGVzID0KICAgICAgbmV3IFNldDxGdW5jdGlvbkVudGl0eT4oKTsKCiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwogIGZpbmFsIEVsZW1lbnRFbnZpcm9ubWVudCBfZWxlbWVudEVudmlyb25tZW50OwogIGZpbmFsIERhcnRUeXBlcyBfZGFydFR5cGVzOwogIGZpbmFsIENvbW1vbkVsZW1lbnRzIF9jb21tb25FbGVtZW50czsKCiAgZmluYWwgTmF0aXZlQmFzaWNEYXRhIF9uYXRpdmVCYXNpY0RhdGE7CiAgZmluYWwgTmF0aXZlRGF0YUJ1aWxkZXIgX25hdGl2ZURhdGFCdWlsZGVyOwogIGZpbmFsIEludGVyY2VwdG9yRGF0YUJ1aWxkZXIgX2ludGVyY2VwdG9yRGF0YUJ1aWxkZXI7CiAgZmluYWwgQmFja2VuZFVzYWdlQnVpbGRlciBfYmFja2VuZFVzYWdlQnVpbGRlcjsKICBmaW5hbCBSdW50aW1lVHlwZXNOZWVkQnVpbGRlciBfcnRpTmVlZEJ1aWxkZXI7CiAgZmluYWwgS0ZpZWxkQW5hbHlzaXMgX2FsbG9jYXRvckFuYWx5c2lzOwogIGZpbmFsIE5hdGl2ZVJlc29sdXRpb25FbnF1ZXVlciBfbmF0aXZlUmVzb2x1dGlvbkVucXVldWVyOwogIGZpbmFsIE5vU3VjaE1ldGhvZFJlZ2lzdHJ5IF9ub1N1Y2hNZXRob2RSZWdpc3RyeTsKICBmaW5hbCBBbm5vdGF0aW9uc0RhdGFCdWlsZGVyIF9hbm5vdGF0aW9uc0RhdGFCdWlsZGVyOwoKICBmaW5hbCBTZWxlY3RvckNvbnN0cmFpbnRzU3RyYXRlZ3kgX3NlbGVjdG9yQ29uc3RyYWludHNTdHJhdGVneTsKICBmaW5hbCBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgX2NsYXNzSGllcmFyY2h5QnVpbGRlcjsKICBmaW5hbCBDbGFzc1F1ZXJpZXMgX2NsYXNzUXVlcmllczsKCiAgYm9vbCBoYXNSdW50aW1lVHlwZVN1cHBvcnQgPSBmYWxzZTsKICBib29sIGhhc0Z1bmN0aW9uQXBwbHlTdXBwb3J0ID0gZmFsc2U7CgogIGJvb2wgX2Nsb3NlZCA9IGZhbHNlOwogIEtDbG9zZWRXb3JsZCBfY2xvc2VkV29ybGRDYWNoZTsKICBmaW5hbCBTZXQ8TWVtYmVyRW50aXR5PiBfbGl2ZUluc3RhbmNlTWVtYmVycyA9IG5ldyBTZXQ8TWVtYmVyRW50aXR5PigpOwoKICBmaW5hbCBTZXQ8Q29uc3RhbnRWYWx1ZT4gX2NvbnN0YW50VmFsdWVzID0gbmV3IFNldDxDb25zdGFudFZhbHVlPigpOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTZXQ8TG9jYWw+IGdlbmVyaWNMb2NhbEZ1bmN0aW9ucyA9IG5ldyBTZXQ8TG9jYWw+KCk7CgogIFNldDxNZW1iZXJFbnRpdHk+IF9wcm9jZXNzZWRNZW1iZXJzID0gbmV3IFNldDxNZW1iZXJFbnRpdHk+KCk7CgogIGJvb2wgZ2V0IGlzQ2xvc2VkID0+IF9jbG9zZWQ7CgogIGZpbmFsIEtlcm5lbFRvRWxlbWVudE1hcEltcGwgX2VsZW1lbnRNYXA7CgogIFJlc29sdXRpb25Xb3JsZEJ1aWxkZXJJbXBsKAogICAgICB0aGlzLl9vcHRpb25zLAogICAgICB0aGlzLl9lbGVtZW50TWFwLAogICAgICB0aGlzLl9lbGVtZW50RW52aXJvbm1lbnQsCiAgICAgIHRoaXMuX2RhcnRUeXBlcywKICAgICAgdGhpcy5fY29tbW9uRWxlbWVudHMsCiAgICAgIHRoaXMuX25hdGl2ZUJhc2ljRGF0YSwKICAgICAgdGhpcy5fbmF0aXZlRGF0YUJ1aWxkZXIsCiAgICAgIHRoaXMuX2ludGVyY2VwdG9yRGF0YUJ1aWxkZXIsCiAgICAgIHRoaXMuX2JhY2tlbmRVc2FnZUJ1aWxkZXIsCiAgICAgIHRoaXMuX3J0aU5lZWRCdWlsZGVyLAogICAgICB0aGlzLl9hbGxvY2F0b3JBbmFseXNpcywKICAgICAgdGhpcy5fbmF0aXZlUmVzb2x1dGlvbkVucXVldWVyLAogICAgICB0aGlzLl9ub1N1Y2hNZXRob2RSZWdpc3RyeSwKICAgICAgdGhpcy5fYW5ub3RhdGlvbnNEYXRhQnVpbGRlciwKICAgICAgdGhpcy5fc2VsZWN0b3JDb25zdHJhaW50c1N0cmF0ZWd5LAogICAgICB0aGlzLl9jbGFzc0hpZXJhcmNoeUJ1aWxkZXIsCiAgICAgIHRoaXMuX2NsYXNzUXVlcmllcyk7CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBnZXQgcHJvY2Vzc2VkQ2xhc3NlcyA9PiBfcHJvY2Vzc2VkQ2xhc3Nlcy5rZXlzCiAgICAgIC53aGVyZSgoY2xzKSA9PiBfcHJvY2Vzc2VkQ2xhc3Nlc1tjbHNdLmlzSW5zdGFudGlhdGVkKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc01lbWJlclByb2Nlc3NlZChNZW1iZXJFbnRpdHkgbWVtYmVyKSA9PgogICAgICBfcHJvY2Vzc2VkTWVtYmVycy5jb250YWlucyhtZW1iZXIpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyUHJvY2Vzc2VkTWVtYmVyKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIF9wcm9jZXNzZWRNZW1iZXJzLmFkZChtZW1iZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8RnVuY3Rpb25FbnRpdHk+IGdldCBnZW5lcmljSW5zdGFuY2VNZXRob2RzIHsKICAgIExpc3Q8RnVuY3Rpb25FbnRpdHk+IGZ1bmN0aW9ucyA9IDxGdW5jdGlvbkVudGl0eT5bXTsKICAgIGZvciAoTWVtYmVyRW50aXR5IG1lbWJlciBpbiBwcm9jZXNzZWRNZW1iZXJzKSB7CiAgICAgIGlmIChtZW1iZXIuaXNJbnN0YW5jZU1lbWJlciAmJgogICAgICAgICAgbWVtYmVyLmlzRnVuY3Rpb24gJiYKICAgICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0RnVuY3Rpb25UeXBlVmFyaWFibGVzKG1lbWJlcikuaXNOb3RFbXB0eSkgewogICAgICAgIGZ1bmN0aW9ucy5hZGQobWVtYmVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZ1bmN0aW9uczsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPEZ1bmN0aW9uRW50aXR5PiBnZXQgdXNlck5vU3VjaE1ldGhvZHMgewogICAgTGlzdDxGdW5jdGlvbkVudGl0eT4gZnVuY3Rpb25zID0gPEZ1bmN0aW9uRW50aXR5PltdOwogICAgZm9yIChNZW1iZXJFbnRpdHkgbWVtYmVyIGluIHByb2Nlc3NlZE1lbWJlcnMpIHsKICAgICAgaWYgKG1lbWJlci5pc0luc3RhbmNlTWVtYmVyICYmCiAgICAgICAgICBtZW1iZXIuaXNGdW5jdGlvbiAmJgogICAgICAgICAgbWVtYmVyLm5hbWUgPT0gSWRlbnRpZmllcnMubm9TdWNoTWV0aG9kXyAmJgogICAgICAgICAgIV9jb21tb25FbGVtZW50cy5pc0RlZmF1bHROb1N1Y2hNZXRob2RJbXBsZW1lbnRhdGlvbihtZW1iZXIpKSB7CiAgICAgICAgZnVuY3Rpb25zLmFkZChtZW1iZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZnVuY3Rpb25zOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBnZXQgcHJvY2Vzc2VkTWVtYmVycyA9PiBfcHJvY2Vzc2VkTWVtYmVyczsKCiAgQG92ZXJyaWRlCiAgS0Nsb3NlZFdvcmxkIGdldCBjbG9zZWRXb3JsZEZvclRlc3RpbmcgewogICAgaWYgKCFfY2xvc2VkKSB7CiAgICAgIGZhaWxlZEF0KAogICAgICAgICAgTk9fTE9DQVRJT05fU1BBTk5BQkxFLCAiVGhlIHdvcmxkIGJ1aWxkZXIgaGFzIG5vdCB5ZXQgYmVlbiBjbG9zZWQuIik7CiAgICB9CiAgICByZXR1cm4gX2Nsb3NlZFdvcmxkQ2FjaGU7CiAgfQoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBJbXByb3ZlIHNlbWFudGljIHByZWNpc2lvbi4KICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0IGRpcmVjdGx5SW5zdGFudGlhdGVkQ2xhc3NlcyB7CiAgICBTZXQ8Q2xhc3NFbnRpdHk+IGNsYXNzZXMgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwogICAgZ2V0SW5zdGFudGlhdGlvbk1hcCgpLmZvckVhY2goKENsYXNzRW50aXR5IGNscywgSW5zdGFudGlhdGlvbkluZm8gaW5mbykgewogICAgICBpZiAoaW5mby5oYXNJbnN0YW50aWF0aW9uKSB7CiAgICAgICAgY2xhc3Nlcy5hZGQoY2xzKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gY2xhc3NlczsKICB9CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEltcHJvdmUgc2VtYW50aWMgcHJlY2lzaW9uLgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPEludGVyZmFjZVR5cGU+IGdldCBpbnN0YW50aWF0ZWRUeXBlcyB7CiAgICBTZXQ8SW50ZXJmYWNlVHlwZT4gdHlwZXMgPSBuZXcgU2V0PEludGVyZmFjZVR5cGU+KCk7CiAgICBnZXRJbnN0YW50aWF0aW9uTWFwKCkuZm9yRWFjaCgoXywgSW5zdGFudGlhdGlvbkluZm8gaW5mbykgewogICAgICBpZiAoaW5mby5pbnN0YW50aWF0aW9uTWFwICE9IG51bGwpIHsKICAgICAgICBmb3IgKFNldDxJbnN0YW5jZT4gaW5zdGFuY2VzIGluIGluZm8uaW5zdGFudGlhdGlvbk1hcC52YWx1ZXMpIHsKICAgICAgICAgIGZvciAoSW5zdGFuY2UgaW5zdGFuY2UgaW4gaW5zdGFuY2VzKSB7CiAgICAgICAgICAgIHR5cGVzLmFkZChpbnN0YW5jZS50eXBlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIHR5cGVzOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0ltcGxlbWVudGVkKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIF9pbXBsZW1lbnRlZENsYXNzZXMuY29udGFpbnMoY2xzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJDbG9zdXJpemVkTWVtYmVyKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBjbG9zdXJpemVkTWVtYmVycy5hZGQoZWxlbWVudCk7CiAgICBGdW5jdGlvblR5cGUgdHlwZSA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0RnVuY3Rpb25UeXBlKGVsZW1lbnQpOwogICAgaWYgKHR5cGUuY29udGFpbnNUeXBlVmFyaWFibGVzKSB7CiAgICAgIGNsb3N1cml6ZWRNZW1iZXJzV2l0aEZyZWVUeXBlVmFyaWFibGVzLmFkZChlbGVtZW50KTsKICAgIH0KICB9CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEZ1bGx5IGVuZm9yY2UgdGhlIHNlcGFyYXRpb24gYmV0d2VlbiBleGFjdCwgdGhyb3VnaAogIC8vIHN1YmNsYXNzIGFuZCB0aHJvdWdoIHN1YnR5cGUgaW5zdGFudGlhdGVkIHR5cGVzL2NsYXNzZXMuCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3VwcG9ydCB1bmtub3duIHR5cGUgYXJndW1lbnRzIGZvciBnZW5lcmljIHR5cGVzLgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJUeXBlSW5zdGFudGlhdGlvbigKICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlLCBDbGFzc1VzZWRDYWxsYmFjayBjbGFzc1VzZWQsCiAgICAgIHtDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvciwgYm9vbCBpc1JlZGlyZWN0aW9uOiBmYWxzZX0pIHsKICAgIENsYXNzRW50aXR5IGNscyA9IHR5cGUuZWxlbWVudDsKICAgIEluc3RhbnRpYXRpb25JbmZvIGluZm8gPQogICAgICAgIF9pbnN0YW50aWF0aW9uSW5mby5wdXRJZkFic2VudChjbHMsICgpID0+IG5ldyBJbnN0YW50aWF0aW9uSW5mbygpKTsKICAgIEluc3RhbnRpYXRpb24ga2luZCA9IEluc3RhbnRpYXRpb24uVU5JTlNUQU5USUFURUQ7CiAgICBib29sIGlzTmF0aXZlID0gX25hdGl2ZUJhc2ljRGF0YS5pc05hdGl2ZUNsYXNzKGNscyk7CiAgICAvLyBXZSBjYW4ndCB1c2UgdGhlIGNsb3NlZC13b3JsZCBhc3N1bXB0aW9uIHdpdGggbmF0aXZlIGFic3RyYWN0CiAgICAvLyBjbGFzc2VzOyBhIG5hdGl2ZSBhYnN0cmFjdCBjbGFzcyBtYXkgaGF2ZSBub24tYWJzdHJhY3Qgc3ViY2xhc3NlcwogICAgLy8gbm90IGRlY2xhcmVkIHRvIHRoZSBwcm9ncmFtLiAgSW5zdGFuY2VzIG9mIHRoZXNlIGNsYXNzZXMgYXJlCiAgICAvLyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIHRoZSBhYnN0cmFjdCBjbGFzcy4KICAgIGlmICghY2xzLmlzQWJzdHJhY3QgfHwgaXNOYXRpdmUpIHsKICAgICAgaWYgKGlzTmF0aXZlKSB7CiAgICAgICAga2luZCA9IEluc3RhbnRpYXRpb24uQUJTVFJBQ1RMWV9JTlNUQU5USUFURUQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAga2luZCA9IEluc3RhbnRpYXRpb24uRElSRUNUTFlfSU5TVEFOVElBVEVEOwogICAgICB9CiAgICB9CiAgICBpbmZvLmFkZEluc3RhbnRpYXRpb24oY29uc3RydWN0b3IsIHR5cGUsIGtpbmQsCiAgICAgICAgaXNSZWRpcmVjdGlvbjogaXNSZWRpcmVjdGlvbik7CiAgICBpZiAoa2luZCAhPSBJbnN0YW50aWF0aW9uLlVOSU5TVEFOVElBVEVEKSB7CiAgICAgIF9jbGFzc0hpZXJhcmNoeUJ1aWxkZXIudXBkYXRlQ2xhc3NIaWVyYXJjaHlOb2RlRm9yQ2xhc3MoY2xzLAogICAgICAgICAgZGlyZWN0bHlJbnN0YW50aWF0ZWQ6IGluZm8uaXNEaXJlY3RseUluc3RhbnRpYXRlZCwKICAgICAgICAgIGFic3RyYWN0bHlJbnN0YW50aWF0ZWQ6IGluZm8uaXNBYnN0cmFjdGx5SW5zdGFudGlhdGVkKTsKICAgICAgX3Byb2Nlc3NJbnN0YW50aWF0ZWRDbGFzcyhjbHMsIGNsYXNzVXNlZCk7CiAgICB9CgogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVXNlIFtfaW5zdGFudGlhdGlvbkluZm9dIHRvIGNvbXB1dGUgdGhpcyBpbmZvcm1hdGlvbgogICAgLy8gaW5zdGVhZC4KICAgIGlmIChfaW1wbGVtZW50ZWRDbGFzc2VzLmFkZChjbHMpKSB7CiAgICAgIGNsYXNzVXNlZChjbHMsIF9nZXRDbGFzc1VzYWdlKGNscykuaW1wbGVtZW50KCkpOwogICAgICBfZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hTdXBlcnR5cGUoY2xzLCAoSW50ZXJmYWNlVHlwZSBzdXBlcnR5cGUpIHsKICAgICAgICBpZiAoX2ltcGxlbWVudGVkQ2xhc3Nlcy5hZGQoc3VwZXJ0eXBlLmVsZW1lbnQpKSB7CiAgICAgICAgICBjbGFzc1VzZWQoCiAgICAgICAgICAgICAgc3VwZXJ0eXBlLmVsZW1lbnQsIF9nZXRDbGFzc1VzYWdlKHN1cGVydHlwZS5lbGVtZW50KS5pbXBsZW1lbnQoKSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaEluc3RhbnRpYXRlZENsYXNzKGYoQ2xhc3NFbnRpdHkgY2xzLCBJbnN0YW50aWF0aW9uSW5mbyBpbmZvKSkgewogICAgZ2V0SW5zdGFudGlhdGlvbk1hcCgpLmZvckVhY2goZik7CiAgfQoKICBJdGVyYWJsZTxDYWxsU3RydWN0dXJlPiBfZ2V0TWF0Y2hpbmdDYWxsU3RydWN0dXJlcygKICAgICAgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPiBzZWxlY3RvcnMsIE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIGlmIChzZWxlY3RvcnMgPT0gbnVsbCkgcmV0dXJuIGNvbnN0IDxDYWxsU3RydWN0dXJlPltdOwogICAgU2V0PENhbGxTdHJ1Y3R1cmU+IGNhbGxTdHJ1Y3R1cmVzOwogICAgZm9yIChTZWxlY3RvciBzZWxlY3RvciBpbiBzZWxlY3RvcnMua2V5cykgewogICAgICBpZiAoc2VsZWN0b3IuYXBwbGllc1VubmFtZWQobWVtYmVyKSkgewogICAgICAgIFNlbGVjdG9yQ29uc3RyYWludHMgbWFza3MgPSBzZWxlY3RvcnNbc2VsZWN0b3JdOwogICAgICAgIGlmIChtYXNrcy5jYW5IaXQobWVtYmVyLCBzZWxlY3Rvci5tZW1iZXJOYW1lLCB0aGlzKSkgewogICAgICAgICAgY2FsbFN0cnVjdHVyZXMgPz89IG5ldyBTZXQ8Q2FsbFN0cnVjdHVyZT4oKTsKICAgICAgICAgIGNhbGxTdHJ1Y3R1cmVzLmFkZChzZWxlY3Rvci5jYWxsU3RydWN0dXJlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBjYWxsU3RydWN0dXJlcyA/PyBjb25zdCA8Q2FsbFN0cnVjdHVyZT5bXTsKICB9CgogIGJvb2wgX2hhc01hdGNoaW5nU2VsZWN0b3IoCiAgICAgIE1hcDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4gc2VsZWN0b3JzLCBNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICBpZiAoc2VsZWN0b3JzID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIGZvciAoU2VsZWN0b3Igc2VsZWN0b3IgaW4gc2VsZWN0b3JzLmtleXMpIHsKICAgICAgaWYgKHNlbGVjdG9yLmFwcGxpZXNVbm5hbWVkKG1lbWJlcikpIHsKICAgICAgICBTZWxlY3RvckNvbnN0cmFpbnRzIG1hc2tzID0gc2VsZWN0b3JzW3NlbGVjdG9yXTsKICAgICAgICBpZiAobWFza3MuY2FuSGl0KG1lbWJlciwgc2VsZWN0b3IubWVtYmVyTmFtZSwgdGhpcykpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIGluc3RhbnRpYXRpb24gbWFwIHVzZWQgZm9yIGNvbXB1dGluZyB0aGUgY2xvc2VkIHdvcmxkLgogIE1hcDxDbGFzc0VudGl0eSwgSW5zdGFudGlhdGlvbkluZm8+IGdldEluc3RhbnRpYXRpb25NYXAoKSB7CiAgICByZXR1cm4gX2luc3RhbnRpYXRpb25JbmZvOwogIH0KCiAgSXRlcmFibGU8Q2FsbFN0cnVjdHVyZT4gX2dldEludm9jYXRpb25DYWxsU3RydWN0dXJlcyhNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICByZXR1cm4gX2dldE1hdGNoaW5nQ2FsbFN0cnVjdHVyZXMoX2ludm9rZWROYW1lc1ttZW1iZXIubmFtZV0sIG1lbWJlcik7CiAgfQoKICBib29sIF9oYXNJbnZva2VkR2V0dGVyKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIHJldHVybiBfaGFzTWF0Y2hpbmdTZWxlY3RvcihfaW52b2tlZEdldHRlcnNbbWVtYmVyLm5hbWVdLCBtZW1iZXIpIHx8CiAgICAgICAgbWVtYmVyLmlzRnVuY3Rpb24gJiYgbWV0aG9kc05lZWRpbmdTdXBlckdldHRlci5jb250YWlucyhtZW1iZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNJbnZva2VkU2V0dGVyKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIHJldHVybiBfaGFzTWF0Y2hpbmdTZWxlY3RvcihfaW52b2tlZFNldHRlcnNbbWVtYmVyLm5hbWVdLCBtZW1iZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckR5bmFtaWNVc2UoCiAgICAgIER5bmFtaWNVc2UgZHluYW1pY1VzZSwgTWVtYmVyVXNlZENhbGxiYWNrIG1lbWJlclVzZWQpIHsKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gZHluYW1pY1VzZS5zZWxlY3RvcjsKICAgIFN0cmluZyBtZXRob2ROYW1lID0gc2VsZWN0b3IubmFtZTsKCiAgICB2b2lkIF9wcm9jZXNzKAogICAgICAgIE1hcDxTdHJpbmcsIFNldDxNZW1iZXJVc2FnZT4+IG1lbWJlck1hcCwKICAgICAgICBFbnVtU2V0PE1lbWJlclVzZT4gYWN0aW9uKE1lbWJlclVzYWdlIHVzYWdlKSwKICAgICAgICBib29sIHNob3VsZEJlUmVtb3ZlZChNZW1iZXJVc2FnZSB1c2FnZSkpIHsKICAgICAgX3Byb2Nlc3NTZXQobWVtYmVyTWFwLCBtZXRob2ROYW1lLCAoTWVtYmVyVXNhZ2UgdXNhZ2UpIHsKICAgICAgICBpZiAoc2VsZWN0b3IuYXBwbGllc1VubmFtZWQodXNhZ2UuZW50aXR5KSAmJgogICAgICAgICAgICBfc2VsZWN0b3JDb25zdHJhaW50c1N0cmF0ZWd5LmFwcGxpZWRVbm5hbWVkKAogICAgICAgICAgICAgICAgZHluYW1pY1VzZSwgdXNhZ2UuZW50aXR5LCB0aGlzKSkgewogICAgICAgICAgbWVtYmVyVXNlZCh1c2FnZS5lbnRpdHksIGFjdGlvbih1c2FnZSkpOwogICAgICAgICAgcmV0dXJuIHNob3VsZEJlUmVtb3ZlZCh1c2FnZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfSk7CiAgICB9CgogICAgc3dpdGNoIChkeW5hbWljVXNlLmtpbmQpIHsKICAgICAgY2FzZSBEeW5hbWljVXNlS2luZC5JTlZPS0U6CiAgICAgICAgcmVnaXN0ZXJEeW5hbWljSW52b2NhdGlvbigKICAgICAgICAgICAgZHluYW1pY1VzZS5zZWxlY3RvciwgZHluYW1pY1VzZS50eXBlQXJndW1lbnRzKTsKICAgICAgICBpZiAoX3JlZ2lzdGVyTmV3U2VsZWN0b3IoZHluYW1pY1VzZSwgX2ludm9rZWROYW1lcykpIHsKICAgICAgICAgIF9wcm9jZXNzKAogICAgICAgICAgICAgIF9pbnN0YW5jZU1lbWJlcnNCeU5hbWUsCiAgICAgICAgICAgICAgKG0pID0+IG0uaW52b2tlKGR5bmFtaWNVc2Uuc2VsZWN0b3IuY2FsbFN0cnVjdHVyZSksCiAgICAgICAgICAgICAgKHUpID0+ICF1Lmhhc1BlbmRpbmdOb3JtYWxVc2UpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBEeW5hbWljVXNlS2luZC5HRVQ6CiAgICAgICAgaWYgKF9yZWdpc3Rlck5ld1NlbGVjdG9yKGR5bmFtaWNVc2UsIF9pbnZva2VkR2V0dGVycykpIHsKICAgICAgICAgIF9wcm9jZXNzKF9pbnN0YW5jZU1lbWJlcnNCeU5hbWUsIChtKSA9PiBtLnJlYWQoKSwKICAgICAgICAgICAgICAodSkgPT4gIXUuaGFzUGVuZGluZ05vcm1hbFVzZSk7CiAgICAgICAgICBfcHJvY2VzcyhfaW5zdGFuY2VGdW5jdGlvbnNCeU5hbWUsIChtKSA9PiBtLnJlYWQoKSwKICAgICAgICAgICAgICAodSkgPT4gIXUuaGFzUGVuZGluZ0Nsb3N1cml6YXRpb25Vc2UpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBEeW5hbWljVXNlS2luZC5TRVQ6CiAgICAgICAgaWYgKF9yZWdpc3Rlck5ld1NlbGVjdG9yKGR5bmFtaWNVc2UsIF9pbnZva2VkU2V0dGVycykpIHsKICAgICAgICAgIF9wcm9jZXNzKF9pbnN0YW5jZU1lbWJlcnNCeU5hbWUsIChtKSA9PiBtLndyaXRlKCksCiAgICAgICAgICAgICAgKHUpID0+ICF1Lmhhc1BlbmRpbmdOb3JtYWxVc2UpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIH0KICB9CgogIGJvb2wgX3JlZ2lzdGVyTmV3U2VsZWN0b3IoRHluYW1pY1VzZSBkeW5hbWljVXNlLAogICAgICBNYXA8U3RyaW5nLCBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+PiBzZWxlY3Rvck1hcCkgewogICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBkeW5hbWljVXNlLnNlbGVjdG9yOwogICAgU3RyaW5nIG5hbWUgPSBzZWxlY3Rvci5uYW1lOwogICAgT2JqZWN0IGNvbnN0cmFpbnQgPSBkeW5hbWljVXNlLnJlY2VpdmVyQ29uc3RyYWludDsKICAgIE1hcDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4gc2VsZWN0b3JzID0gc2VsZWN0b3JNYXAucHV0SWZBYnNlbnQoCiAgICAgICAgbmFtZSwgKCkgPT4gbmV3IE1hcGxldDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4oKSk7CiAgICBVbml2ZXJzZVNlbGVjdG9yQ29uc3RyYWludHMgY29uc3RyYWludHMgPSBzZWxlY3RvcnNbc2VsZWN0b3JdOwogICAgaWYgKGNvbnN0cmFpbnRzID09IG51bGwpIHsKICAgICAgc2VsZWN0b3JzW3NlbGVjdG9yXSA9IF9zZWxlY3RvckNvbnN0cmFpbnRzU3RyYXRlZ3kKICAgICAgICAgIC5jcmVhdGVTZWxlY3RvckNvbnN0cmFpbnRzKHNlbGVjdG9yLCBjb25zdHJhaW50KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gY29uc3RyYWludHMuYWRkUmVjZWl2ZXJDb25zdHJhaW50KGNvbnN0cmFpbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlcklzQ2hlY2soY292YXJpYW50IERhcnRUeXBlIHR5cGUpIHsKICAgIGlzQ2hlY2tzLmFkZCh0eXBlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgcmVnaXN0ZXJDb25zdGFudFVzZShDb25zdGFudFVzZSB1c2UpIHsKICAgIHJldHVybiBfY29uc3RhbnRWYWx1ZXMuYWRkKHVzZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyU3RhdGljVXNlKFN0YXRpY1VzZSBzdGF0aWNVc2UsIE1lbWJlclVzZWRDYWxsYmFjayBtZW1iZXJVc2VkKSB7CiAgICBpZiAoc3RhdGljVXNlLmtpbmQgPT0gU3RhdGljVXNlS2luZC5DTE9TVVJFKSB7CiAgICAgIExvY2FsIGxvY2FsRnVuY3Rpb24gPSBzdGF0aWNVc2UuZWxlbWVudDsKICAgICAgRnVuY3Rpb25UeXBlIHR5cGUgPQogICAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRMb2NhbEZ1bmN0aW9uVHlwZShsb2NhbEZ1bmN0aW9uKTsKICAgICAgaWYgKHR5cGUuY29udGFpbnNUeXBlVmFyaWFibGVzKSB7CiAgICAgICAgbG9jYWxGdW5jdGlvbnNXaXRoRnJlZVR5cGVWYXJpYWJsZXMuYWRkKGxvY2FsRnVuY3Rpb24pOwogICAgICB9CiAgICAgIGlmICh0eXBlLnR5cGVWYXJpYWJsZXMuaXNOb3RFbXB0eSkgewogICAgICAgIGdlbmVyaWNMb2NhbEZ1bmN0aW9ucy5hZGQobG9jYWxGdW5jdGlvbik7CiAgICAgIH0KICAgICAgbG9jYWxGdW5jdGlvbnMuYWRkKHN0YXRpY1VzZS5lbGVtZW50KTsKICAgICAgcmV0dXJuOwogICAgfSBlbHNlIGlmIChzdGF0aWNVc2Uua2luZCA9PSBTdGF0aWNVc2VLaW5kLkNMT1NVUkVfQ0FMTCkgewogICAgICBpZiAoc3RhdGljVXNlLnR5cGVBcmd1bWVudHM/LmlzTm90RW1wdHkgPz8gZmFsc2UpIHsKICAgICAgICByZWdpc3RlckR5bmFtaWNJbnZvY2F0aW9uKAogICAgICAgICAgICBuZXcgU2VsZWN0b3IuY2FsbChOYW1lcy5jYWxsLCBzdGF0aWNVc2UuY2FsbFN0cnVjdHVyZSksCiAgICAgICAgICAgIHN0YXRpY1VzZS50eXBlQXJndW1lbnRzKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CgogICAgTWVtYmVyRW50aXR5IGVsZW1lbnQgPSBzdGF0aWNVc2UuZWxlbWVudDsKICAgIEVudW1TZXQ8TWVtYmVyVXNlPiB1c2VTZXQgPSBuZXcgRW51bVNldDxNZW1iZXJVc2U+KCk7CiAgICBNZW1iZXJVc2FnZSB1c2FnZSA9IF9nZXRNZW1iZXJVc2FnZShlbGVtZW50LCB1c2VTZXQpOwoKICAgIGlmICgoZWxlbWVudC5pc1N0YXRpYyB8fCBlbGVtZW50LmlzVG9wTGV2ZWwpICYmIGVsZW1lbnQuaXNGaWVsZCkgewogICAgICBhbGxSZWZlcmVuY2VkU3RhdGljRmllbGRzLmFkZChzdGF0aWNVc2UuZWxlbWVudCk7CiAgICB9CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBdm9pZCB0aGlzLiBDdXJyZW50bHkgW0ZJRUxEX0dFVF0gYW5kCiAgICAvLyBbRklFTERfU0VUXSBjb250YWlucyBbQm94RmllbGRFbGVtZW50XXMgd2hpY2ggd2UgY2Fubm90IGVucXVldWUuCiAgICAvLyBBbHNvIFtDTE9TVVJFXSBjb250YWlucyBbTG9jYWxGdW5jdGlvbkVsZW1lbnRdIHdoaWNoIHdlIGNhbm5vdAogICAgLy8gZW5xdWV1ZS4KICAgIHN3aXRjaCAoc3RhdGljVXNlLmtpbmQpIHsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkZJRUxEX0dFVDoKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkZJRUxEX1NFVDoKICAgICAgICBmaWVsZFNldHRlcnMuYWRkKHN0YXRpY1VzZS5lbGVtZW50KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkNMT1NVUkU6CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5DTE9TVVJFX0NBTEw6CiAgICAgICAgLy8gQWxyZWFkeSBoYW5kbGVkIGFib3ZlLgogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuU1VQRVJfVEVBUl9PRkY6CiAgICAgICAgdXNlU2V0LmFkZEFsbCh1c2FnZS5yZWFkKCkpOwogICAgICAgIG1ldGhvZHNOZWVkaW5nU3VwZXJHZXR0ZXIuYWRkKHN0YXRpY1VzZS5lbGVtZW50KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLlNVUEVSX0ZJRUxEX1NFVDoKICAgICAgICBmaWVsZFNldHRlcnMuYWRkKHN0YXRpY1VzZS5lbGVtZW50KTsKICAgICAgICB1c2VTZXQuYWRkQWxsKHVzYWdlLndyaXRlKCkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuR0VUOgogICAgICAgIHVzZVNldC5hZGRBbGwodXNhZ2UucmVhZCgpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLlNUQVRJQ19URUFSX09GRjoKICAgICAgICBjbG9zdXJpemVkU3RhdGljcy5hZGQoZWxlbWVudCk7CiAgICAgICAgdXNlU2V0LmFkZEFsbCh1c2FnZS5yZWFkKCkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuU0VUOgogICAgICAgIHVzZVNldC5hZGRBbGwodXNhZ2Uud3JpdGUoKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5GSUVMRF9JTklUOgogICAgICAgIHVzZVNldC5hZGRBbGwodXNhZ2UuaW5pdCgpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkZJRUxEX0NPTlNUQU5UX0lOSVQ6CiAgICAgICAgdXNlU2V0LmFkZEFsbCh1c2FnZS5jb25zdGFudEluaXQoc3RhdGljVXNlLmNvbnN0YW50KSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5JTlZPS0U6CiAgICAgICAgcmVnaXN0ZXJTdGF0aWNJbnZvY2F0aW9uKHN0YXRpY1VzZSk7CiAgICAgICAgdXNlU2V0LmFkZEFsbCh1c2FnZS5pbnZva2Uoc3RhdGljVXNlLmNhbGxTdHJ1Y3R1cmUpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkNPTlNUUlVDVE9SX0lOVk9LRToKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkNPTlNUX0NPTlNUUlVDVE9SX0lOVk9LRToKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLlJFRElSRUNUSU9OOgogICAgICAgIHVzZVNldC5hZGRBbGwodXNhZ2UuaW52b2tlKHN0YXRpY1VzZS5jYWxsU3RydWN0dXJlKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5ESVJFQ1RfSU5WT0tFOgogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsICdEaXJlY3Qgc3RhdGljIHVzZSBpcyBub3Qgc3VwcG9ydGVkIGZvciByZXNvbHV0aW9uLicpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuSU5MSU5JTkc6CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5DQUxMX01FVEhPRDoKICAgICAgICBmYWlsZWRBdChDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICAgICAiU3RhdGljIHVzZSAke3N0YXRpY1VzZS5raW5kfSBpcyBub3Qgc3VwcG9ydGVkIGR1cmluZyByZXNvbHV0aW9uLiIpOwogICAgfQogICAgaWYgKHVzZVNldC5pc05vdEVtcHR5KSB7CiAgICAgIG1lbWJlclVzZWQodXNhZ2UuZW50aXR5LCB1c2VTZXQpOwogICAgfQogIH0KCiAgLy8vIENhbGxlZCB0byBjcmVhdGUgYSBbQ2xhc3NVc2FnZV0gZm9yIFtjbHNdLgogIC8vLwogIC8vLyBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgdG8gZW5zdXJlIG5lZWRlZCBpbnZhcmlhbnRzIG9uIFtjbHNdLgogIENsYXNzVXNhZ2UgX2NyZWF0ZUNsYXNzVXNhZ2UoY292YXJpYW50IENsYXNzRW50aXR5IGNscykgPT4KICAgICAgbmV3IENsYXNzVXNhZ2UoY2xzKTsKCiAgLy8vIFJldHVybiB0aGUgY2Fub25pY2FsIFtDbGFzc1VzYWdlXSBmb3IgW2Nsc10uCiAgQ2xhc3NVc2FnZSBfZ2V0Q2xhc3NVc2FnZShDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBfcHJvY2Vzc2VkQ2xhc3Nlcy5wdXRJZkFic2VudChjbHMsICgpIHsKICAgICAgcmV0dXJuIF9jcmVhdGVDbGFzc1VzYWdlKGNscyk7CiAgICB9KTsKICB9CgogIC8vLyBSZWdpc3RlciBbY2xzXSBhbmQgYWxsIGl0cyBzdXBlcmNsYXNzZXMgYXMgaW5zdGFudGlhdGVkLgogIHZvaWQgX3Byb2Nlc3NJbnN0YW50aWF0ZWRDbGFzcyhDbGFzc0VudGl0eSBjbHMsIENsYXNzVXNlZENhbGxiYWNrIGNsYXNzVXNlZCkgewogICAgLy8gUmVnaXN0ZXJzIFtzdXBlcmNsYXNzXSBhcyBpbnN0YW50aWF0ZWQuIFJldHVybnMgYHRydWVgIGlmIGl0IHdhc24ndAogICAgLy8gYWxyZWFkeSBpbnN0YW50aWF0ZWQgYW5kIHdlIHRoZXJlZm9yZSBoYXZlIHRvIHByb2Nlc3MgaXRzIHN1cGVyY2xhc3MgYXMKICAgIC8vIHdlbGwuCiAgICBib29sIHByb2Nlc3NDbGFzcyhDbGFzc0VudGl0eSBzdXBlcmNsYXNzKSB7CiAgICAgIENsYXNzVXNhZ2UgdXNhZ2UgPSBfZ2V0Q2xhc3NVc2FnZShzdXBlcmNsYXNzKTsKICAgICAgaWYgKCF1c2FnZS5pc0luc3RhbnRpYXRlZCkgewogICAgICAgIGNsYXNzVXNlZCh1c2FnZS5jbHMsIHVzYWdlLmluc3RhbnRpYXRlKCkpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICB3aGlsZSAoY2xzICE9IG51bGwgJiYgcHJvY2Vzc0NsYXNzKGNscykpIHsKICAgICAgY2xzID0gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRTdXBlckNsYXNzKGNscyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHByb2Nlc3NDbGFzc01lbWJlcnMoQ2xhc3NFbnRpdHkgY2xzLCBNZW1iZXJVc2VkQ2FsbGJhY2sgbWVtYmVyVXNlZCwKICAgICAge2Jvb2wgZHJ5UnVuOiBmYWxzZX0pIHsKICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaENsYXNzTWVtYmVyKGNscywKICAgICAgICAoQ2xhc3NFbnRpdHkgY2xzLCBNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAgIF9wcm9jZXNzSW5zdGFudGlhdGVkQ2xhc3NNZW1iZXIoY2xzLCBtZW1iZXIsIG1lbWJlclVzZWQsIGRyeVJ1bjogZHJ5UnVuKTsKICAgIH0pOwogIH0KCiAgLy8vIENhbGwgW3VwZGF0ZVVzYWdlXSBvbiBhbGwgW01lbWJlclVzYWdlXXMgaW4gdGhlIHNldCBpbiBbbWFwXSBmb3IKICAvLy8gW21lbWJlck5hbWVdLiBJZiBbdXBkYXRlVXNhZ2VdIHJldHVybnMgYHRydWVgIHRoZSB1c2FnZSBpcyByZW1vdmVkIGZyb20KICAvLy8gdGhlIHNldC4KICB2b2lkIF9wcm9jZXNzU2V0KE1hcDxTdHJpbmcsIFNldDxNZW1iZXJVc2FnZT4+IG1hcCwgU3RyaW5nIG1lbWJlck5hbWUsCiAgICAgIGJvb2wgdXBkYXRlVXNhZ2UoTWVtYmVyVXNhZ2UgZSkpIHsKICAgIFNldDxNZW1iZXJVc2FnZT4gbWVtYmVycyA9IG1hcFttZW1iZXJOYW1lXTsKICAgIGlmIChtZW1iZXJzID09IG51bGwpIHJldHVybjsKICAgIC8vIFtmXSBtaWdodCBhZGQgZWxlbWVudHMgdG8gWzogbWFwW21lbWJlck5hbWVdIDpdIGR1cmluZyB0aGUgbG9vcCBiZWxvdwogICAgLy8gc28gd2UgY3JlYXRlIGEgbmV3IGxpc3QgZm9yIFs6IG1hcFttZW1iZXJOYW1lXSA6XSBhbmQgcHJlcGVuZCB0aGUKICAgIC8vIFtyZW1haW5pbmddIG1lbWJlcnMgYWZ0ZXIgdGhlIGxvb3AuCiAgICBtYXBbbWVtYmVyTmFtZV0gPSBuZXcgU2V0PE1lbWJlclVzYWdlPigpOwogICAgU2V0PE1lbWJlclVzYWdlPiByZW1haW5pbmcgPSBuZXcgU2V0PE1lbWJlclVzYWdlPigpOwogICAgZm9yIChNZW1iZXJVc2FnZSB1c2FnZSBpbiBtZW1iZXJzKSB7CiAgICAgIGlmICghdXBkYXRlVXNhZ2UodXNhZ2UpKSB7CiAgICAgICAgcmVtYWluaW5nLmFkZCh1c2FnZSk7CiAgICAgIH0KICAgIH0KICAgIG1hcFttZW1iZXJOYW1lXS5hZGRBbGwocmVtYWluaW5nKTsKICB9CgogIE1lbWJlclVzYWdlIF9nZXRNZW1iZXJVc2FnZShNZW1iZXJFbnRpdHkgbWVtYmVyLCBFbnVtU2V0PE1lbWJlclVzZT4gdXNlU2V0LAogICAgICB7Ym9vbCBkcnlSdW46IGZhbHNlfSkgewogICAgTWVtYmVyVXNhZ2UgdXNhZ2UgPSBfbWVtYmVyVXNhZ2VbbWVtYmVyXTsKICAgIGlmICh1c2FnZSA9PSBudWxsKSB7CiAgICAgIGlmIChtZW1iZXIuaXNJbnN0YW5jZU1lbWJlcikgewogICAgICAgIFN0cmluZyBtZW1iZXJOYW1lID0gbWVtYmVyLm5hbWU7CiAgICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gbWVtYmVyLmVuY2xvc2luZ0NsYXNzOwogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENoYW5nZSB0aGlzIHRvIHVzZSBpc05hdGl2ZU1lbWJlciB3aGVuIHdlIHVzZQogICAgICAgIC8vIENGRSBjb25zdGFudHMuCiAgICAgICAgLy8gVGhlIG9idmlvdXMgdGhpbmcgdG8gdGVzdCBoZXJlIHdvdWxkIGJlICJtZW1iZXIuaXNOYXRpdmUiLAogICAgICAgIC8vIGhvd2V2ZXIsIHRoYXQgb25seSB3b3JrcyBhZnRlciBtZXRhZGF0YSBoYXMgYmVlbiBwYXJzZWQvYW5hbHl6ZWQsCiAgICAgICAgLy8gYW5kIHRoYXQgbWF5IG5vdCBoYXZlIGhhcHBlbmVkIHlldC4KICAgICAgICAvLyBTbyBpbnN0ZWFkIHdlIHVzZSB0aGUgZW5jbG9zaW5nIGNsYXNzLCB3aGljaCB3ZSBrbm93IGhhdmUgaGFkCiAgICAgICAgLy8gaXRzIG1ldGFkYXRhIHBhcnNlZCBhbmQgYW5hbHl6ZWQuCiAgICAgICAgLy8gTm90ZTogdGhpcyBhc3N1bWVzIHRoYXQgdGhlcmUgYXJlIG5vIG5vbi1uYXRpdmUgZmllbGRzIG9uIG5hdGl2ZQogICAgICAgIC8vIGNsYXNzZXMsIHdoaWNoIG1heSBub3QgYmUgdGhlIGNhc2Ugd2hlbiBhIG5hdGl2ZSBjbGFzcyBpcyBzdWJjbGFzc2VkLgogICAgICAgIGJvb2wgaXNOYXRpdmUgPSBfbmF0aXZlQmFzaWNEYXRhLmlzTmF0aXZlQ2xhc3MoY2xzKTsKICAgICAgICB1c2FnZSA9CiAgICAgICAgICAgIG5ldyBNZW1iZXJVc2FnZShtZW1iZXIsIGlzTmF0aXZlOiBpc05hdGl2ZSwgdHJhY2tQYXJhbWV0ZXJzOiB0cnVlKTsKICAgICAgICB1c2VTZXQuYWRkQWxsKHVzYWdlLmFwcGxpZWRVc2UpOwogICAgICAgIGlmICghZHJ5UnVuKSB7CiAgICAgICAgICBpZiAobWVtYmVyLmlzRmllbGQgJiYgaXNOYXRpdmUpIHsKICAgICAgICAgICAgcmVnaXN0ZXJVc2VkRWxlbWVudChtZW1iZXIpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG1lbWJlci5pc0Z1bmN0aW9uICYmCiAgICAgICAgICAgICAgbWVtYmVyLm5hbWUgPT0gSWRlbnRpZmllcnMuY2FsbCAmJgogICAgICAgICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuaXNHZW5lcmljQ2xhc3MoY2xzKSkgewogICAgICAgICAgICBjbG9zdXJpemVkTWVtYmVyc1dpdGhGcmVlVHlwZVZhcmlhYmxlcy5hZGQobWVtYmVyKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghdXNhZ2UuaGFzUmVhZCAmJiBfaGFzSW52b2tlZEdldHRlcihtZW1iZXIpKSB7CiAgICAgICAgICB1c2VTZXQuYWRkQWxsKHVzYWdlLnJlYWQoKSk7CiAgICAgICAgfQogICAgICAgIGlmICghdXNhZ2UuaXNGdWxseUludm9rZWQpIHsKICAgICAgICAgIEl0ZXJhYmxlPENhbGxTdHJ1Y3R1cmU+IGNhbGxTdHJ1Y3R1cmVzID0KICAgICAgICAgICAgICBfZ2V0SW52b2NhdGlvbkNhbGxTdHJ1Y3R1cmVzKG1lbWJlcik7CiAgICAgICAgICBmb3IgKENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSBpbiBjYWxsU3RydWN0dXJlcykgewogICAgICAgICAgICB1c2VTZXQuYWRkQWxsKHVzYWdlLmludm9rZShjYWxsU3RydWN0dXJlKSk7CiAgICAgICAgICAgIGlmICh1c2FnZS5pc0Z1bGx5SW52b2tlZCkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghdXNhZ2UuaGFzV3JpdGUgJiYgaGFzSW52b2tlZFNldHRlcihtZW1iZXIpKSB7CiAgICAgICAgICB1c2VTZXQuYWRkQWxsKHVzYWdlLndyaXRlKCkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFkcnlSdW4pIHsKICAgICAgICAgIGlmICh1c2FnZS5oYXNQZW5kaW5nTm9ybWFsVXNlKSB7CiAgICAgICAgICAgIC8vIFRoZSBlbGVtZW50IGlzIG5vdCB5ZXQgdXNlZC4gQWRkIGl0IHRvIHRoZSBsaXN0IG9mIGluc3RhbmNlCiAgICAgICAgICAgIC8vIG1lbWJlcnMgdG8gc3RpbGwgYmUgcHJvY2Vzc2VkLgogICAgICAgICAgICBfaW5zdGFuY2VNZW1iZXJzQnlOYW1lCiAgICAgICAgICAgICAgICAucHV0SWZBYnNlbnQobWVtYmVyTmFtZSwgKCkgPT4gbmV3IFNldDxNZW1iZXJVc2FnZT4oKSkKICAgICAgICAgICAgICAgIC5hZGQodXNhZ2UpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHVzYWdlLmhhc1BlbmRpbmdDbG9zdXJpemF0aW9uVXNlKSB7CiAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBtZW1iZXIgaW4gW2luc3RhbmNlRnVuY3Rpb25zQnlOYW1lXSB0byBjYXRjaAogICAgICAgICAgICAvLyBnZXR0ZXJzIG9uIHRoZSBmdW5jdGlvbi4KICAgICAgICAgICAgX2luc3RhbmNlRnVuY3Rpb25zQnlOYW1lCiAgICAgICAgICAgICAgICAucHV0SWZBYnNlbnQobWVtYmVyTmFtZSwgKCkgPT4gbmV3IFNldDxNZW1iZXJVc2FnZT4oKSkKICAgICAgICAgICAgICAgIC5hZGQodXNhZ2UpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB1c2FnZSA9IG5ldyBNZW1iZXJVc2FnZShtZW1iZXIsIHRyYWNrUGFyYW1ldGVyczogdHJ1ZSk7CiAgICAgICAgdXNlU2V0LmFkZEFsbCh1c2FnZS5hcHBsaWVkVXNlKTsKICAgICAgfQogICAgfQogICAgaWYgKCFkcnlSdW4pIHsKICAgICAgX21lbWJlclVzYWdlW21lbWJlcl0gPSB1c2FnZTsKICAgIH0KICAgIHJldHVybiB1c2FnZTsKICB9CgogIHZvaWQgX3Byb2Nlc3NJbnN0YW50aWF0ZWRDbGFzc01lbWJlcihDbGFzc0VudGl0eSBjbHMsCiAgICAgIGNvdmFyaWFudCBNZW1iZXJFbnRpdHkgbWVtYmVyLCBNZW1iZXJVc2VkQ2FsbGJhY2sgbWVtYmVyVXNlZCwKICAgICAge2Jvb2wgZHJ5UnVuOiBmYWxzZX0pIHsKICAgIGlmICghbWVtYmVyLmlzSW5zdGFuY2VNZW1iZXIpIHJldHVybjsKICAgIFN0cmluZyBtZW1iZXJOYW1lID0gbWVtYmVyLm5hbWU7CgogICAgTWVtYmVyVXNhZ2UgdXNhZ2UgPSBfbWVtYmVyVXNhZ2VbbWVtYmVyXTsKICAgIGlmICh1c2FnZSA9PSBudWxsKSB7CiAgICAgIEVudW1TZXQ8TWVtYmVyVXNlPiB1c2VTZXQgPSBuZXcgRW51bVNldDxNZW1iZXJVc2U+KCk7CiAgICAgIHVzYWdlID0gX2dldE1lbWJlclVzYWdlKG1lbWJlciwgdXNlU2V0LCBkcnlSdW46IGRyeVJ1bik7CiAgICAgIG1lbWJlclVzZWQodXNhZ2UuZW50aXR5LCB1c2VTZXQpOwogICAgfSBlbHNlIHsKICAgICAgTWVtYmVyVXNhZ2Ugb3JpZ2luYWwgPSB1c2FnZTsKICAgICAgaWYgKGRyeVJ1bikgewogICAgICAgIHVzYWdlID0gdXNhZ2UuY2xvbmUoKTsKICAgICAgfQogICAgICBpZiAoIXVzYWdlLmZ1bGx5VXNlZCkgewogICAgICAgIEVudW1TZXQ8TWVtYmVyVXNlPiB1c2VTZXQgPSBuZXcgRW51bVNldDxNZW1iZXJVc2U+KCk7CiAgICAgICAgaWYgKCF1c2FnZS5oYXNSZWFkICYmIF9oYXNJbnZva2VkR2V0dGVyKG1lbWJlcikpIHsKICAgICAgICAgIHVzZVNldC5hZGRBbGwodXNhZ2UucmVhZCgpKTsKICAgICAgICB9CiAgICAgICAgaWYgKCF1c2FnZS5pc0Z1bGx5SW52b2tlZCkgewogICAgICAgICAgSXRlcmFibGU8Q2FsbFN0cnVjdHVyZT4gY2FsbFN0cnVjdHVyZXMgPQogICAgICAgICAgICAgIF9nZXRJbnZvY2F0aW9uQ2FsbFN0cnVjdHVyZXMobWVtYmVyKTsKICAgICAgICAgIGZvciAoQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlIGluIGNhbGxTdHJ1Y3R1cmVzKSB7CiAgICAgICAgICAgIHVzZVNldC5hZGRBbGwodXNhZ2UuaW52b2tlKGNhbGxTdHJ1Y3R1cmUpKTsKICAgICAgICAgICAgaWYgKHVzYWdlLmlzRnVsbHlJbnZva2VkKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCF1c2FnZS5oYXNXcml0ZSAmJiBoYXNJbnZva2VkU2V0dGVyKG1lbWJlcikpIHsKICAgICAgICAgIHVzZVNldC5hZGRBbGwodXNhZ2Uud3JpdGUoKSk7CiAgICAgICAgfQogICAgICAgIGlmICghZHJ5UnVuKSB7CiAgICAgICAgICBpZiAoIXVzYWdlLmhhc1BlbmRpbmdOb3JtYWxVc2UpIHsKICAgICAgICAgICAgX2luc3RhbmNlTWVtYmVyc0J5TmFtZVttZW1iZXJOYW1lXT8ucmVtb3ZlKHVzYWdlKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdXNhZ2UuaGFzUGVuZGluZ0Nsb3N1cml6YXRpb25Vc2UpIHsKICAgICAgICAgICAgX2luc3RhbmNlRnVuY3Rpb25zQnlOYW1lW21lbWJlck5hbWVdPy5yZW1vdmUodXNhZ2UpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBtZW1iZXJVc2VkKHVzYWdlLmVudGl0eSwgdXNlU2V0KTsKICAgICAgfQogICAgICBpZiAoZHJ5UnVuICYmICFvcmlnaW5hbC5kYXRhRXF1YWxzKHVzYWdlKSkgewogICAgICAgIF9lbGVtZW50TWFwLnJlcG9ydGVyLmludGVybmFsRXJyb3IobWVtYmVyLAogICAgICAgICAgICAnVW5lbnF1ZXVlZCB1c2FnZSBvZiAkbWVtYmVyOiBiZWZvcmU6ICRvcmlnaW5hbCwgYWZ0ZXI6ICR1c2FnZScpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gYWxsTWl4aW5Vc2VzT2YoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gdXNlcyA9IF9jbGFzc0hpZXJhcmNoeUJ1aWxkZXIubWl4aW5Vc2VzW2Nsc107CiAgICByZXR1cm4gdXNlcyAhPSBudWxsID8gdXNlcyA6IGNvbnN0IDxDbGFzc0VudGl0eT5bXTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJVc2VkRWxlbWVudChNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgaWYgKGVsZW1lbnQuaXNJbnN0YW5jZU1lbWJlciAmJiAhZWxlbWVudC5pc0Fic3RyYWN0KSB7CiAgICAgIF9saXZlSW5zdGFuY2VNZW1iZXJzLmFkZChlbGVtZW50KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNNZW1iZXJVc2VkKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIHJldHVybiBfbWVtYmVyVXNhZ2VbbWVtYmVyXT8uaGFzVXNlID8/IGZhbHNlOwogIH0KCiAgTWFwPENsYXNzRW50aXR5LCBTZXQ8Q2xhc3NFbnRpdHk+PiBwb3B1bGF0ZUhpZXJhcmNoeU5vZGVzKCkgewogICAgTWFwPENsYXNzRW50aXR5LCBTZXQ8Q2xhc3NFbnRpdHk+PiB0eXBlc0ltcGxlbWVudGVkQnlTdWJjbGFzc2VzID0KICAgICAgICBuZXcgTWFwPENsYXNzRW50aXR5LCBTZXQ8Q2xhc3NFbnRpdHk+PigpOwoKICAgIC8vIFVwZGF0ZXMgdGhlIGBpc0RpcmVjdGx5SW5zdGFudGlhdGVkYCBhbmQgYGlzSW5kaXJlY3RseUluc3RhbnRpYXRlZGAKICAgIC8vIHByb3BlcnRpZXMgb2YgdGhlIFtDbGFzc0hpZXJhcmNoeU5vZGVdIGZvciBbY2xzXS4KCiAgICB2b2lkIGFkZFN1YnR5cGVzKENsYXNzRW50aXR5IGNscywgSW5zdGFudGlhdGlvbkluZm8gaW5mbykgewogICAgICBpZiAoIWluZm8uaGFzSW5zdGFudGlhdGlvbikgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBfY2xhc3NIaWVyYXJjaHlCdWlsZGVyLnVwZGF0ZUNsYXNzSGllcmFyY2h5Tm9kZUZvckNsYXNzKGNscywKICAgICAgICAgIGRpcmVjdGx5SW5zdGFudGlhdGVkOiBpbmZvLmlzRGlyZWN0bHlJbnN0YW50aWF0ZWQsCiAgICAgICAgICBhYnN0cmFjdGx5SW5zdGFudGlhdGVkOiBpbmZvLmlzQWJzdHJhY3RseUluc3RhbnRpYXRlZCk7CgogICAgICAvLyBXYWxrIHRocm91Z2ggdGhlIHN1cGVyY2xhc3NlcywgYW5kIHJlY29yZCB0aGUgdHlwZXMKICAgICAgLy8gaW1wbGVtZW50ZWQgYnkgdGhhdCB0eXBlIG9uIHRoZSBzdXBlcmNsYXNzZXMuCiAgICAgIENsYXNzRW50aXR5IHN1cGVyY2xhc3MgPSBfY2xhc3NRdWVyaWVzLmdldFN1cGVyQ2xhc3MoY2xzKTsKICAgICAgd2hpbGUgKHN1cGVyY2xhc3MgIT0gbnVsbCkgewogICAgICAgIFNldDxDbGFzc0VudGl0eT4gdHlwZXNJbXBsZW1lbnRlZEJ5U3ViY2xhc3Nlc09mQ2xzID0KICAgICAgICAgICAgdHlwZXNJbXBsZW1lbnRlZEJ5U3ViY2xhc3Nlcy5wdXRJZkFic2VudCgKICAgICAgICAgICAgICAgIHN1cGVyY2xhc3MsICgpID0+IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCkpOwogICAgICAgIGZvciAoSW50ZXJmYWNlVHlwZSBjdXJyZW50IGluIF9jbGFzc1F1ZXJpZXMuZ2V0U3VwZXJ0eXBlcyhjbHMpKSB7CiAgICAgICAgICB0eXBlc0ltcGxlbWVudGVkQnlTdWJjbGFzc2VzT2ZDbHMuYWRkKGN1cnJlbnQuZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIHN1cGVyY2xhc3MgPSBfY2xhc3NRdWVyaWVzLmdldFN1cGVyQ2xhc3Moc3VwZXJjbGFzcyk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBVc2UgdGhlIFs6c2VlbkNsYXNzZXM6XSBzZXQgdG8gaW5jbHVkZSBub24taW5zdGFudGlhdGVkCiAgICAvLyBjbGFzc2VzOiBpZiB0aGUgc3VwZXJjbGFzcyBvZiB0aGVzZSBjbGFzc2VzIHJlcXVpcmUgUlRJLCB0aGVuCiAgICAvLyB0aGV5IGFsc28gbmVlZCBSVEksIHNvIHRoYXQgYSBjb25zdHJ1Y3RvciBwYXNzZXMgdGhlIHR5cGUKICAgIC8vIHZhcmlhYmxlcyB0byB0aGUgc3VwZXIgY29uc3RydWN0b3IuCiAgICBmb3JFYWNoSW5zdGFudGlhdGVkQ2xhc3MoYWRkU3VidHlwZXMpOwoKICAgIHJldHVybiB0eXBlc0ltcGxlbWVudGVkQnlTdWJjbGFzc2VzOwogIH0KCiAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBjb21wdXRlQXNzaWduZWRJbnN0YW5jZU1lbWJlcnMoKSB7CiAgICBTZXQ8TWVtYmVyRW50aXR5PiBhc3NpZ25lZEluc3RhbmNlTWVtYmVycyA9IG5ldyBTZXQ8TWVtYmVyRW50aXR5PigpOwogICAgZm9yIChNZW1iZXJFbnRpdHkgaW5zdGFuY2VNZW1iZXIgaW4gX2xpdmVJbnN0YW5jZU1lbWJlcnMpIHsKICAgICAgaWYgKGhhc0ludm9rZWRTZXR0ZXIoaW5zdGFuY2VNZW1iZXIpKSB7CiAgICAgICAgYXNzaWduZWRJbnN0YW5jZU1lbWJlcnMuYWRkKGluc3RhbmNlTWVtYmVyKTsKICAgICAgfQogICAgfQogICAgYXNzaWduZWRJbnN0YW5jZU1lbWJlcnMuYWRkQWxsKGZpZWxkU2V0dGVycyk7CiAgICByZXR1cm4gYXNzaWduZWRJbnN0YW5jZU1lbWJlcnM7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICBfY2xhc3NIaWVyYXJjaHlCdWlsZGVyLnJlZ2lzdGVyQ2xhc3MoY2xzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNJbmhlcml0ZWRJbigKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciwgQ2xhc3NFbnRpdHkgdHlwZSwgQ2xhc3NSZWxhdGlvbiByZWxhdGlvbikgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVXNlIHRoZSBbbWVtYmVyXSBpdHNlbGYgdG8gYXZvaWQgZW5xdWV1ZWluZyBtZW1iZXJzCiAgICAvLyB0aGF0IGFyZSBvdmVycmlkZGVuLgogICAgcmV0dXJuIGlzSW5oZXJpdGVkSW5DbGFzcyhtZW1iZXIuZW5jbG9zaW5nQ2xhc3MsIHR5cGUsIHJlbGF0aW9uKTsKICB9CgogIGJvb2wgaXNJbmhlcml0ZWRJbkNsYXNzKENsYXNzRW50aXR5IG1lbWJlckhvbGRpbmdDbGFzcywgQ2xhc3NFbnRpdHkgdHlwZSwKICAgICAgQ2xhc3NSZWxhdGlvbiByZWxhdGlvbikgewogICAgc3dpdGNoIChyZWxhdGlvbikgewogICAgICBjYXNlIENsYXNzUmVsYXRpb24uZXhhY3Q6CiAgICAgICAgcmV0dXJuIF9jbGFzc0hpZXJhcmNoeUJ1aWxkZXIuaXNJbmhlcml0ZWRJbkV4YWN0Q2xhc3MoCiAgICAgICAgICAgIG1lbWJlckhvbGRpbmdDbGFzcywgdHlwZSk7CiAgICAgIGNhc2UgQ2xhc3NSZWxhdGlvbi50aGlzRXhwcmVzc2lvbjoKICAgICAgICByZXR1cm4gX2NsYXNzSGllcmFyY2h5QnVpbGRlci5pc0luaGVyaXRlZEluVGhpc0NsYXNzKAogICAgICAgICAgICBtZW1iZXJIb2xkaW5nQ2xhc3MsIHR5cGUpOwogICAgICBjYXNlIENsYXNzUmVsYXRpb24uc3VidHlwZToKICAgICAgICBpZiAobWVtYmVySG9sZGluZ0NsYXNzID09IF9jb21tb25FbGVtZW50cy5udWxsQ2xhc3MgfHwKICAgICAgICAgICAgbWVtYmVySG9sZGluZ0NsYXNzID09IF9jb21tb25FbGVtZW50cy5qc051bGxDbGFzcykgewogICAgICAgICAgLy8gTWVtYmVycyBvZiBgTnVsbGAgYW5kIGBKU051bGxgIGFyZSBhbHdheXMgcG90ZW50aWFsIHRhcmdldHMuCiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9jbGFzc0hpZXJhcmNoeUJ1aWxkZXIuaXNJbmhlcml0ZWRJblN1YnR5cGVPZigKICAgICAgICAgICAgbWVtYmVySG9sZGluZ0NsYXNzLCB0eXBlKTsKICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmV4cGVjdGVkIENsYXNzUmVsYXRpb24gJHJlbGF0aW9uLiIpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8RnVuY3Rpb25FbnRpdHk+IGdldCBnZW5lcmljTWV0aG9kcyB7CiAgICBMaXN0PEZ1bmN0aW9uRW50aXR5PiBmdW5jdGlvbnMgPSA8RnVuY3Rpb25FbnRpdHk+W107CgogICAgdm9pZCBwcm9jZXNzTWVtYmVyVXNlKEVudGl0eSBtZW1iZXIsIEFic3RyYWN0VXNhZ2UgbWVtYmVyVXNhZ2UpIHsKICAgICAgaWYgKG1lbWJlciBpcyBGdW5jdGlvbkVudGl0eSAmJgogICAgICAgICAgbWVtYmVyVXNhZ2UuaGFzVXNlICYmCiAgICAgICAgICBfZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZVZhcmlhYmxlcyhtZW1iZXIpLmlzTm90RW1wdHkpIHsKICAgICAgICBmdW5jdGlvbnMuYWRkKG1lbWJlcik7CiAgICAgIH0KICAgIH0KCiAgICBfbWVtYmVyVXNhZ2UuZm9yRWFjaChwcm9jZXNzTWVtYmVyVXNlKTsKICAgIHJldHVybiBmdW5jdGlvbnM7CiAgfQoKICBAb3ZlcnJpZGUKICBLQ2xvc2VkV29ybGQgY2xvc2VXb3JsZChEaWFnbm9zdGljUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKICAgIE1hcDxDbGFzc0VudGl0eSwgU2V0PENsYXNzRW50aXR5Pj4gdHlwZXNJbXBsZW1lbnRlZEJ5U3ViY2xhc3NlcyA9CiAgICAgICAgcG9wdWxhdGVIaWVyYXJjaHlOb2RlcygpOwoKICAgIEJhY2tlbmRVc2FnZSBiYWNrZW5kVXNhZ2UgPSBfYmFja2VuZFVzYWdlQnVpbGRlci5jbG9zZSgpOwogICAgX2Nsb3NlZCA9IHRydWU7CgogICAgTWFwPE1lbWJlckVudGl0eSwgTWVtYmVyVXNhZ2U+IGxpdmVNZW1iZXJVc2FnZSA9IHt9OwogICAgX21lbWJlclVzYWdlLmZvckVhY2goKE1lbWJlckVudGl0eSBtZW1iZXIsIE1lbWJlclVzYWdlIG1lbWJlclVzYWdlKSB7CiAgICAgIGlmIChtZW1iZXJVc2FnZS5oYXNVc2UpIHsKICAgICAgICBsaXZlTWVtYmVyVXNhZ2VbbWVtYmVyXSA9IG1lbWJlclVzYWdlOwogICAgICAgIGFzc2VydChfcHJvY2Vzc2VkTWVtYmVycy5jb250YWlucyhtZW1iZXIpLAogICAgICAgICAgICAiTWVtYmVyICRtZW1iZXIgaXMgdXNlZCBidXQgbm90IHByb2Nlc3NlZDogJG1lbWJlclVzYWdlLiIpOwogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydCghX3Byb2Nlc3NlZE1lbWJlcnMuY29udGFpbnMobWVtYmVyKSwKICAgICAgICAgICAgIk1lbWJlciAkbWVtYmVyIGlzIHByb2Nlc3NlZCBidXQgbm90IHVzZWQ6ICRtZW1iZXJVc2FnZS4iKTsKICAgICAgfQogICAgfSk7CiAgICBmb3IgKE1lbWJlckVudGl0eSBtZW1iZXIgaW4gX3Byb2Nlc3NlZE1lbWJlcnMpIHsKICAgICAgYXNzZXJ0KF9tZW1iZXJVc2FnZS5jb250YWluc0tleShtZW1iZXIpLAogICAgICAgICAgIk1lbWJlciAkbWVtYmVyIGlzIHByb2Nlc3NlZCBidXQgaGFzIG5vdCB1c2FnZS4iKTsKICAgIH0KCiAgICBLQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQgPSBuZXcgS0Nsb3NlZFdvcmxkSW1wbChfZWxlbWVudE1hcCwKICAgICAgICBvcHRpb25zOiBfb3B0aW9ucywKICAgICAgICBlbGVtZW50RW52aXJvbm1lbnQ6IF9lbGVtZW50RW52aXJvbm1lbnQsCiAgICAgICAgZGFydFR5cGVzOiBfZGFydFR5cGVzLAogICAgICAgIGNvbW1vbkVsZW1lbnRzOiBfY29tbW9uRWxlbWVudHMsCiAgICAgICAgbmF0aXZlRGF0YTogX25hdGl2ZURhdGFCdWlsZGVyLmNsb3NlKCksCiAgICAgICAgaW50ZXJjZXB0b3JEYXRhOiBfaW50ZXJjZXB0b3JEYXRhQnVpbGRlci5jbG9zZSgpLAogICAgICAgIGJhY2tlbmRVc2FnZTogYmFja2VuZFVzYWdlLAogICAgICAgIG5vU3VjaE1ldGhvZERhdGE6IF9ub1N1Y2hNZXRob2RSZWdpc3RyeS5jbG9zZSgpLAogICAgICAgIHJlc29sdXRpb25Xb3JsZEJ1aWxkZXI6IHRoaXMsCiAgICAgICAgcnRpTmVlZEJ1aWxkZXI6IF9ydGlOZWVkQnVpbGRlciwKICAgICAgICBmaWVsZEFuYWx5c2lzOiBfYWxsb2NhdG9yQW5hbHlzaXMsCiAgICAgICAgaW1wbGVtZW50ZWRDbGFzc2VzOiBfaW1wbGVtZW50ZWRDbGFzc2VzLAogICAgICAgIGxpdmVOYXRpdmVDbGFzc2VzOiBfbmF0aXZlUmVzb2x1dGlvbkVucXVldWVyLmxpdmVOYXRpdmVDbGFzc2VzLAogICAgICAgIGxpdmVJbnN0YW5jZU1lbWJlcnM6IF9saXZlSW5zdGFuY2VNZW1iZXJzLAogICAgICAgIGFzc2lnbmVkSW5zdGFuY2VNZW1iZXJzOiBjb21wdXRlQXNzaWduZWRJbnN0YW5jZU1lbWJlcnMoKSwKICAgICAgICBsaXZlTWVtYmVyVXNhZ2U6IGxpdmVNZW1iZXJVc2FnZSwKICAgICAgICBtaXhpblVzZXM6IF9jbGFzc0hpZXJhcmNoeUJ1aWxkZXIubWl4aW5Vc2VzLAogICAgICAgIHR5cGVzSW1wbGVtZW50ZWRCeVN1YmNsYXNzZXM6IHR5cGVzSW1wbGVtZW50ZWRCeVN1YmNsYXNzZXMsCiAgICAgICAgY2xhc3NIaWVyYXJjaHk6IF9jbGFzc0hpZXJhcmNoeUJ1aWxkZXIuY2xvc2UoKSwKICAgICAgICBhbm5vdGF0aW9uc0RhdGE6IF9hbm5vdGF0aW9uc0RhdGFCdWlsZGVyLmNsb3NlKCkpOwogICAgaWYgKHJldGFpbkRhdGFGb3JUZXN0aW5nKSB7CiAgICAgIF9jbG9zZWRXb3JsZENhY2hlID0gY2xvc2VkV29ybGQ7CiAgICB9CiAgICByZXR1cm4gY2xvc2VkV29ybGQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hMb2NhbEZ1bmN0aW9uKHZvaWQgZihNZW1iZXJFbnRpdHkgbWVtYmVyLCBMb2NhbCBsb2NhbEZ1bmN0aW9uKSkgewogICAgZm9yIChLTG9jYWxGdW5jdGlvbiBsb2NhbCBpbiBsb2NhbEZ1bmN0aW9ucykgewogICAgICBmKGxvY2FsLm1lbWJlckNvbnRleHQsIGxvY2FsKTsKICAgIH0KICB9Cn0KhJIATk48ARk3IiMkISEpQCosSlE1KyojJj8aHxw1HkgZHCYSTB0BS1AiBk1PATAGUCYBTxEGUDsBUAZNFEcBRElIPjYxAUQqAUpPN00BOS4BURpQKgE3BkYqAScCATwaT00uATQ3ATJOPkwiN0MBUSlLHQFFPFEBTilOAU0tLQEvNS8BURMnAUcCAT04ERwcHAE/AQwVH0wEAQwcLSohHi4EAQwWKhQ3HUAfNxkGGR0GGgQCATEaRwYTBh0GKzM6CzYWFisLBgYSGh8iHyooNQsGIQYaHlEOHk0ODBIWNT9LDhZFQ0IOFj8ODBcZPw4LBk4dOgFHGU0lPxU9RhQwJw8yKQ8pDw9FBgQBSR86ATQnATYpAQwWKiQkHxdIGhoKIyERIQoYFxsKBhMaBAIBODowSQY0QSoBPEcBLwY0TQEsBjQ4IUg2SjZKNgE5IwFOATo2JQFMAUNIRCYdCAgQBAFFSEQlHQgIEAQBTRc/JAFHEkEkAQxADDYBTSoMNgFNEQZODAxLAQxFIQEiMB4oASouODIxKzw0OAFCNiQBJigBGCJKAUcBDD0BQQEgASwBHhUYIBccHR8kIRwfJiIkKSMbAQxHPgEMMSoBDDYjBAEMODk0JR9NHwgGFgQBDDM5NCUfNkofCAYWBAEMRAEMKxQQUAYeBAE2DDo3TiMaCAgUBAE2DDI5QCtIMSYMCggIEgQBDCguBAEMOCRGJjsGBAFOPkwMIjdEJB1MNzlFSUQyJxY2DzQIBjMnMEM9QjEGAVEQKDdMOhVRCgoGBAEMTiYEATZLOycwLTk/NzYKCAY2BAEdSykwLTk/FwoIBhIEAUk+HwQBTksEATBJSQQBDC9HBAEMGz4tJwETMTYzPzU5MzMpChYKBgEfIiM8PxQmQi4KDx9BPC4+NQoPH0E9LgoPBgQBM0UtITdMQkMfOTwTBjoEAQwyGAQBDC4rBAEMTzMvGkMoQAgrMggtDj86I0QmCA4GAS46OgFHOAZCSEYQHiQPJC0PIiciDyklOg8qLSYPHiUPKiglDx4mDyUlDy4/DyEtPg8tMyY+DyhRDyMmLFEGHSgGBAExBkU9GwEzLzMlCAQBP1FLTw0wNSMzFQgUBgEvNAYEAQxLHjAxUAgEAUdOD0kpMCFNSSsuOSkhHggGJwQBTh4uGSUpMU4aRk0vSS1MUT0QUCkXLCkMIzE5QAwKATsnCiUzNEA4KBUODAo7KAoBFytLLiNHHQwyRiglRx0MCg9AKQgGEyQGEgQBOEQeKiUBLhk8PygNJBQfCB4+OycKJTM0QDgoFQ4MCjsoChcsPwwzQQwKKggzM04IBgQBDDpIOAQBDDM7KQYEAQwrMgQBQEYyAUs5AUAkEAhDPUIBPTdBIz02O0pCCj4IBgE/RUErKwEpBAE8SUAuNQgGMiQEAQwoLwQBDBZHUBxGBAFMIBggPycpPiciP0FKFwo+JwZHBAEMMDkBRiYgTR8IBgEsFgQBDDlGIgE+FAE5SiAvM0gPNEgICDUvPQYBQRsxHykwOiQ5JikrMUgzQyo1RDg7ICcGGAQBDFAzJQYEAgE7cGFja2FnZTpjb21waWxlci9zcmMvdW5pdmVyc2UvcmVzb2x1dGlvbl93b3JsZF9idWlsZGVyLmRhcnQ4c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvdW5pdmVyc2Uvd29ybGRfaW1wYWN0LmRhcnSqqy8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMudW5pdmVyc2Uud29ybGRfaW1wYWN0OwoKaW1wb3J0ICcuLi91dGlsL3V0aWwuZGFydCcgc2hvdyBTZXRsZXQ7CmltcG9ydCAndXNlLmRhcnQnOwoKLy8vIERlc2NyaWJlcyBob3cgYW4gZWxlbWVudCAoZS5nLiBhIG1ldGhvZCkgaW1wYWN0cyB0aGUgY2xvc2VkLXdvcmxkCi8vLyBzZW1hbnRpY3Mgb2YgYSBwcm9ncmFtLgovLy8KLy8vIEEgW1dvcmxkSW1wYWN0XSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBob3cgYSBwcm9ncmFtIGVsZW1lbnQgYWZmZWN0cyBvdXIKLy8vIHVuZGVyc3RhbmRpbmcgb2Ygd2hhdCdzIGxpdmUgaW4gYSBwcm9ncmFtLiBGb3IgZXhhbXBsZSwgaXQgY2FuIGluZGljYXRlCi8vLyB0aGF0IGEgbWV0aG9kIHVzZXMgYSBjZXJ0YWluIGZlYXR1cmUsIG9yIGFsbG9jYXRlcyBhIHNwZWNpZmljIHR5cGUuCi8vLwovLy8gVGhlIGltcGFjdCBvYmplY3QgY2FuIGJlIGNvbXB1dGVkIGxvY2FsbHkgYnkgaW5zcGVjdGluZyBqdXN0IHRoZSByZXNvbHV0aW9uCi8vLyBpbmZvcm1hdGlvbiBvZiB0aGF0IGVsZW1lbnQgYWxvbmUuIFRoZSBjb21waWxlciB1c2VzIFtVbml2ZXJzZV0gYW5kCi8vLyBbV29ybGRdIHRvIGNvbWJpbmUgdGhlIGluZm9ybWF0aW9uIGRpc2NvdmVyZWQgaW4gdGhlIGltcGFjdCBvYmplY3RzIG9mCi8vLyBhbGwgZWxlbWVudHMgcmVhY2hhYmxlIGluIGFuIGFwcGxpY2F0aW9uLgpjbGFzcyBXb3JsZEltcGFjdCB7CiAgY29uc3QgV29ybGRJbXBhY3QoKTsKCiAgSXRlcmFibGU8RHluYW1pY1VzZT4gZ2V0IGR5bmFtaWNVc2VzID0+IGNvbnN0IDxEeW5hbWljVXNlPltdOwoKICBJdGVyYWJsZTxTdGF0aWNVc2U+IGdldCBzdGF0aWNVc2VzID0+IGNvbnN0IDxTdGF0aWNVc2U+W107CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlcGxhY2UgdGhpcyBieSBjYWxsZWQgY29uc3RydWN0b3JzIHdpdGggdHlwZQogIC8vIGFyZ3VtZW50cy4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDb2xsZWN0IGFsbCBjaGVja2VkIHR5cGVzIGZvciBjaGVja2VkIG1vZGUgc2VwYXJhdGVseQogIC8vIHRvIHN1cHBvcnQgc2VyaWFsaXphdGlvbi4KCiAgSXRlcmFibGU8VHlwZVVzZT4gZ2V0IHR5cGVVc2VzID0+IGNvbnN0IDxUeXBlVXNlPltdOwoKICBJdGVyYWJsZTxDb25zdGFudFVzZT4gZ2V0IGNvbnN0YW50VXNlcyA9PiBjb25zdCA8Q29uc3RhbnRVc2U+W107CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gdHJ1ZTsKCiAgdm9pZCBhcHBseShXb3JsZEltcGFjdFZpc2l0b3IgdmlzaXRvcikgewogICAgc3RhdGljVXNlcy5mb3JFYWNoKHZpc2l0b3IudmlzaXRTdGF0aWNVc2UpOwogICAgZHluYW1pY1VzZXMuZm9yRWFjaCh2aXNpdG9yLnZpc2l0RHluYW1pY1VzZSk7CiAgICB0eXBlVXNlcy5mb3JFYWNoKHZpc2l0b3IudmlzaXRUeXBlVXNlKTsKICAgIGNvbnN0YW50VXNlcy5mb3JFYWNoKHZpc2l0b3IudmlzaXRDb25zdGFudFVzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBkdW1wKHRoaXMpOwoKICBzdGF0aWMgU3RyaW5nIGR1bXAoV29ybGRJbXBhY3Qgd29ybGRJbXBhY3QpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHByaW50T24oc2IsIHdvcmxkSW1wYWN0KTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgc3RhdGljIHZvaWQgcHJpbnRPbihTdHJpbmdCdWZmZXIgc2IsIFdvcmxkSW1wYWN0IHdvcmxkSW1wYWN0KSB7CiAgICB2b2lkIGFkZChTdHJpbmcgdGl0bGUsIEl0ZXJhYmxlIGl0ZXJhYmxlKSB7CiAgICAgIGlmIChpdGVyYWJsZS5pc05vdEVtcHR5KSB7CiAgICAgICAgc2Iud3JpdGUoJ1xuICR0aXRsZTonKTsKICAgICAgICBpdGVyYWJsZS5mb3JFYWNoKChlKSA9PiBzYi53cml0ZSgnXG4gICRlJykpOwogICAgICB9CiAgICB9CgogICAgYWRkKCdkeW5hbWljIHVzZXMnLCB3b3JsZEltcGFjdC5keW5hbWljVXNlcyk7CiAgICBhZGQoJ3N0YXRpYyB1c2VzJywgd29ybGRJbXBhY3Quc3RhdGljVXNlcyk7CiAgICBhZGQoJ3R5cGUgdXNlcycsIHdvcmxkSW1wYWN0LnR5cGVVc2VzKTsKICAgIGFkZCgnY29uc3RhbnQgdXNlcycsIHdvcmxkSW1wYWN0LmNvbnN0YW50VXNlcyk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBXb3JsZEltcGFjdEJ1aWxkZXIgewogIHZvaWQgcmVnaXN0ZXJEeW5hbWljVXNlKER5bmFtaWNVc2UgZHluYW1pY1VzZSk7CiAgdm9pZCByZWdpc3RlclR5cGVVc2UoVHlwZVVzZSB0eXBlVXNlKTsKICB2b2lkIHJlZ2lzdGVyU3RhdGljVXNlKFN0YXRpY1VzZSBzdGF0aWNVc2UpOwogIHZvaWQgcmVnaXN0ZXJDb25zdGFudFVzZShDb25zdGFudFVzZSBjb25zdGFudFVzZSk7Cn0KCmNsYXNzIFdvcmxkSW1wYWN0QnVpbGRlckltcGwgZXh0ZW5kcyBXb3JsZEltcGFjdCBpbXBsZW1lbnRzIFdvcmxkSW1wYWN0QnVpbGRlciB7CiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogRG8gd2UgYmVuZWZpdCBmcm9tIGxhenkgaW5pdGlhbGl6YXRpb24gb2YgdGhlCiAgLy8gW1NldGxldF1zPwogIFNldDxEeW5hbWljVXNlPiBfZHluYW1pY1VzZXM7CiAgU2V0PFN0YXRpY1VzZT4gX3N0YXRpY1VzZXM7CiAgU2V0PFR5cGVVc2U+IF90eXBlVXNlczsKICBTZXQ8Q29uc3RhbnRVc2U+IF9jb25zdGFudFVzZXM7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRW1wdHkgPT4KICAgICAgX2R5bmFtaWNVc2VzID09IG51bGwgJiYKICAgICAgX3N0YXRpY1VzZXMgPT0gbnVsbCAmJgogICAgICBfdHlwZVVzZXMgPT0gbnVsbCAmJgogICAgICBfY29uc3RhbnRVc2VzID09IG51bGw7CgogIC8vLyBDb3B5IHVzZXMgaW4gW2ltcGFjdF0gdG8gdGhpcyBpbXBhY3QgYnVpbGRlci4KICB2b2lkIGFkZEltcGFjdChXb3JsZEltcGFjdCBpbXBhY3QpIHsKICAgIGlmIChpbXBhY3QuaXNFbXB0eSkgcmV0dXJuOwogICAgaW1wYWN0LmR5bmFtaWNVc2VzLmZvckVhY2gocmVnaXN0ZXJEeW5hbWljVXNlKTsKICAgIGltcGFjdC5zdGF0aWNVc2VzLmZvckVhY2gocmVnaXN0ZXJTdGF0aWNVc2UpOwogICAgaW1wYWN0LnR5cGVVc2VzLmZvckVhY2gocmVnaXN0ZXJUeXBlVXNlKTsKICAgIGltcGFjdC5jb25zdGFudFVzZXMuZm9yRWFjaChyZWdpc3RlckNvbnN0YW50VXNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJEeW5hbWljVXNlKER5bmFtaWNVc2UgZHluYW1pY1VzZSkgewogICAgYXNzZXJ0KGR5bmFtaWNVc2UgIT0gbnVsbCk7CiAgICBfZHluYW1pY1VzZXMgPz89IG5ldyBTZXRsZXQ8RHluYW1pY1VzZT4oKTsKICAgIF9keW5hbWljVXNlcy5hZGQoZHluYW1pY1VzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxEeW5hbWljVXNlPiBnZXQgZHluYW1pY1VzZXMgewogICAgcmV0dXJuIF9keW5hbWljVXNlcyAhPSBudWxsID8gX2R5bmFtaWNVc2VzIDogY29uc3QgPER5bmFtaWNVc2U+W107CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyVHlwZVVzZShUeXBlVXNlIHR5cGVVc2UpIHsKICAgIGFzc2VydCh0eXBlVXNlICE9IG51bGwpOwogICAgX3R5cGVVc2VzID8/PSBuZXcgU2V0bGV0PFR5cGVVc2U+KCk7CiAgICBfdHlwZVVzZXMuYWRkKHR5cGVVc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8VHlwZVVzZT4gZ2V0IHR5cGVVc2VzIHsKICAgIHJldHVybiBfdHlwZVVzZXMgIT0gbnVsbCA/IF90eXBlVXNlcyA6IGNvbnN0IDxUeXBlVXNlPltdOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN0YXRpY1VzZShTdGF0aWNVc2Ugc3RhdGljVXNlKSB7CiAgICBhc3NlcnQoc3RhdGljVXNlICE9IG51bGwpOwogICAgX3N0YXRpY1VzZXMgPz89IG5ldyBTZXRsZXQ8U3RhdGljVXNlPigpOwogICAgX3N0YXRpY1VzZXMuYWRkKHN0YXRpY1VzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxTdGF0aWNVc2U+IGdldCBzdGF0aWNVc2VzIHsKICAgIHJldHVybiBfc3RhdGljVXNlcyAhPSBudWxsID8gX3N0YXRpY1VzZXMgOiBjb25zdCA8U3RhdGljVXNlPltdOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckNvbnN0YW50VXNlKENvbnN0YW50VXNlIGNvbnN0YW50VXNlKSB7CiAgICBhc3NlcnQoY29uc3RhbnRVc2UgIT0gbnVsbCk7CiAgICBfY29uc3RhbnRVc2VzID8/PSBuZXcgU2V0bGV0PENvbnN0YW50VXNlPigpOwogICAgX2NvbnN0YW50VXNlcy5hZGQoY29uc3RhbnRVc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Q29uc3RhbnRVc2U+IGdldCBjb25zdGFudFVzZXMgewogICAgcmV0dXJuIF9jb25zdGFudFVzZXMgIT0gbnVsbCA/IF9jb25zdGFudFVzZXMgOiBjb25zdCA8Q29uc3RhbnRVc2U+W107CiAgfQp9CgovLy8gW1dvcmxkSW1wYWN0QnVpbGRlcl0gdGhhdCBjYW4gY3JlYXRlIGFuZCBjb2xsZWN0IGEgc2VxdWVuY2Ugb2YKLy8vIFtXb3JsZEltcGFjdF1zLgpjbGFzcyBTdGFnZWRXb3JsZEltcGFjdEJ1aWxkZXIgaW1wbGVtZW50cyBXb3JsZEltcGFjdEJ1aWxkZXIgewogIGZpbmFsIGJvb2wgY29sbGVjdEltcGFjdHM7CiAgV29ybGRJbXBhY3RCdWlsZGVySW1wbCBfY3VycmVudEJ1aWxkZXI7CiAgTGlzdDxXb3JsZEltcGFjdEJ1aWxkZXJJbXBsPiBfYnVpbGRlcnMgPSA8V29ybGRJbXBhY3RCdWlsZGVySW1wbD5bXTsKCiAgU3RhZ2VkV29ybGRJbXBhY3RCdWlsZGVyKHt0aGlzLmNvbGxlY3RJbXBhY3RzOiBmYWxzZX0pOwoKICB2b2lkIF9lbnN1cmVCdWlsZGVyKCkgewogICAgaWYgKF9jdXJyZW50QnVpbGRlciA9PSBudWxsKSB7CiAgICAgIF9jdXJyZW50QnVpbGRlciA9IG5ldyBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsKCk7CiAgICAgIGlmIChjb2xsZWN0SW1wYWN0cykgewogICAgICAgIF9idWlsZGVycy5hZGQoX2N1cnJlbnRCdWlsZGVyKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclR5cGVVc2UoVHlwZVVzZSB0eXBlVXNlKSB7CiAgICBfZW5zdXJlQnVpbGRlcigpOwogICAgX2N1cnJlbnRCdWlsZGVyLnJlZ2lzdGVyVHlwZVVzZSh0eXBlVXNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJEeW5hbWljVXNlKER5bmFtaWNVc2UgZHluYW1pY1VzZSkgewogICAgX2Vuc3VyZUJ1aWxkZXIoKTsKICAgIF9jdXJyZW50QnVpbGRlci5yZWdpc3RlckR5bmFtaWNVc2UoZHluYW1pY1VzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyU3RhdGljVXNlKFN0YXRpY1VzZSBzdGF0aWNVc2UpIHsKICAgIF9lbnN1cmVCdWlsZGVyKCk7CiAgICBfY3VycmVudEJ1aWxkZXIucmVnaXN0ZXJTdGF0aWNVc2Uoc3RhdGljVXNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJDb25zdGFudFVzZShDb25zdGFudFVzZSBjb25zdGFudFVzZSkgewogICAgX2Vuc3VyZUJ1aWxkZXIoKTsKICAgIF9jdXJyZW50QnVpbGRlci5yZWdpc3RlckNvbnN0YW50VXNlKGNvbnN0YW50VXNlKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBbV29ybGRJbXBhY3RdIGJ1aWx0IHNvIGZhciB3aXRoIHRoaXMgYnVpbGRlci4gVGhlIGJ1aWxkZXIKICAvLy8gaXMgcmVzZXQsIGFuZCBpZiBbY29sbGVjdEltcGFjdHNdIGlzIGB0cnVlYCB0aGUgaW1wYWN0IGlzIGNhY2hlZCBmb3IKICAvLy8gW3dvcmxkSW1wYWN0c10uCiAgV29ybGRJbXBhY3QgZmx1c2goKSB7CiAgICBpZiAoX2N1cnJlbnRCdWlsZGVyID09IG51bGwpIHJldHVybiBjb25zdCBXb3JsZEltcGFjdCgpOwogICAgV29ybGRJbXBhY3Qgd29ybGRJbXBhY3QgPSBfY3VycmVudEJ1aWxkZXI7CiAgICBfY3VycmVudEJ1aWxkZXIgPSBudWxsOwogICAgcmV0dXJuIHdvcmxkSW1wYWN0OwogIH0KCiAgLy8vIElmIFtjb2xsZWN0SW1wYWN0c10gaXMgYHRydWVgIHRoaXMgcmV0dXJucyBhbGwgW1dvcmxkSW1wYWN0XXMgYnVpbHQgd2l0aAogIC8vLyB0aGlzIGJ1aWxkZXIuCiAgSXRlcmFibGU8V29ybGRJbXBhY3Q+IGdldCB3b3JsZEltcGFjdHMgPT4gX2J1aWxkZXJzOwp9CgovLy8gTXV0YWJsZSBpbXBsZW1lbnRhdGlvbiBvZiBbV29ybGRJbXBhY3RdIHVzZWQgdG8gdHJhbnNmb3JtCi8vLyBbUmVzb2x1dGlvbkltcGFjdF0gb3IgW0NvZGVnZW5JbXBhY3RdIHRvIFtXb3JsZEltcGFjdF0uCmNsYXNzIFRyYW5zZm9ybWVkV29ybGRJbXBhY3QgaW1wbGVtZW50cyBXb3JsZEltcGFjdCwgV29ybGRJbXBhY3RCdWlsZGVyIHsKICBmaW5hbCBXb3JsZEltcGFjdCB3b3JsZEltcGFjdDsKCiAgU2V0bGV0PFN0YXRpY1VzZT4gX3N0YXRpY1VzZXM7CiAgU2V0bGV0PFR5cGVVc2U+IF90eXBlVXNlczsKICBTZXRsZXQ8RHluYW1pY1VzZT4gX2R5bmFtaWNVc2VzOwogIFNldGxldDxDb25zdGFudFVzZT4gX2NvbnN0YW50VXNlczsKCiAgVHJhbnNmb3JtZWRXb3JsZEltcGFjdCh0aGlzLndvcmxkSW1wYWN0KTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFbXB0eSB7CiAgICByZXR1cm4gd29ybGRJbXBhY3QuaXNFbXB0eSAmJgogICAgICAgIF9zdGF0aWNVc2VzID09IG51bGwgJiYKICAgICAgICBfdHlwZVVzZXMgPT0gbnVsbCAmJgogICAgICAgIF9keW5hbWljVXNlcyA9PSBudWxsICYmCiAgICAgICAgX2NvbnN0YW50VXNlcyA9PSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8RHluYW1pY1VzZT4gZ2V0IGR5bmFtaWNVc2VzIHsKICAgIHJldHVybiBfZHluYW1pY1VzZXMgIT0gbnVsbCA/IF9keW5hbWljVXNlcyA6IHdvcmxkSW1wYWN0LmR5bmFtaWNVc2VzOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckR5bmFtaWNVc2UoRHluYW1pY1VzZSBkeW5hbWljVXNlKSB7CiAgICBpZiAoX2R5bmFtaWNVc2VzID09IG51bGwpIHsKICAgICAgX2R5bmFtaWNVc2VzID0gbmV3IFNldGxldDxEeW5hbWljVXNlPigpOwogICAgICBfZHluYW1pY1VzZXMuYWRkQWxsKHdvcmxkSW1wYWN0LmR5bmFtaWNVc2VzKTsKICAgIH0KICAgIF9keW5hbWljVXNlcy5hZGQoZHluYW1pY1VzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyVHlwZVVzZShUeXBlVXNlIHR5cGVVc2UpIHsKICAgIGlmIChfdHlwZVVzZXMgPT0gbnVsbCkgewogICAgICBfdHlwZVVzZXMgPSBuZXcgU2V0bGV0PFR5cGVVc2U+KCk7CiAgICAgIF90eXBlVXNlcy5hZGRBbGwod29ybGRJbXBhY3QudHlwZVVzZXMpOwogICAgfQogICAgX3R5cGVVc2VzLmFkZCh0eXBlVXNlKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPFR5cGVVc2U+IGdldCB0eXBlVXNlcyB7CiAgICByZXR1cm4gX3R5cGVVc2VzICE9IG51bGwgPyBfdHlwZVVzZXMgOiB3b3JsZEltcGFjdC50eXBlVXNlczsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTdGF0aWNVc2UoU3RhdGljVXNlIHN0YXRpY1VzZSkgewogICAgaWYgKF9zdGF0aWNVc2VzID09IG51bGwpIHsKICAgICAgX3N0YXRpY1VzZXMgPSBuZXcgU2V0bGV0PFN0YXRpY1VzZT4oKTsKICAgICAgX3N0YXRpY1VzZXMuYWRkQWxsKHdvcmxkSW1wYWN0LnN0YXRpY1VzZXMpOwogICAgfQogICAgX3N0YXRpY1VzZXMuYWRkKHN0YXRpY1VzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxTdGF0aWNVc2U+IGdldCBzdGF0aWNVc2VzIHsKICAgIHJldHVybiBfc3RhdGljVXNlcyAhPSBudWxsID8gX3N0YXRpY1VzZXMgOiB3b3JsZEltcGFjdC5zdGF0aWNVc2VzOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Q29uc3RhbnRVc2U+IGdldCBjb25zdGFudFVzZXMgewogICAgcmV0dXJuIF9jb25zdGFudFVzZXMgIT0gbnVsbCA/IF9jb25zdGFudFVzZXMgOiB3b3JsZEltcGFjdC5jb25zdGFudFVzZXM7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyQ29uc3RhbnRVc2UoQ29uc3RhbnRVc2UgY29uc3RhbnRVc2UpIHsKICAgIGlmIChfY29uc3RhbnRVc2VzID09IG51bGwpIHsKICAgICAgX2NvbnN0YW50VXNlcyA9IG5ldyBTZXRsZXQ8Q29uc3RhbnRVc2U+KCk7CiAgICAgIF9jb25zdGFudFVzZXMuYWRkQWxsKHdvcmxkSW1wYWN0LmNvbnN0YW50VXNlcyk7CiAgICB9CiAgICBfY29uc3RhbnRVc2VzLmFkZChjb25zdGFudFVzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFwcGx5KFdvcmxkSW1wYWN0VmlzaXRvciB2aXNpdG9yKSB7CiAgICBzdGF0aWNVc2VzLmZvckVhY2godmlzaXRvci52aXNpdFN0YXRpY1VzZSk7CiAgICBkeW5hbWljVXNlcy5mb3JFYWNoKHZpc2l0b3IudmlzaXREeW5hbWljVXNlKTsKICAgIHR5cGVVc2VzLmZvckVhY2godmlzaXRvci52aXNpdFR5cGVVc2UpOwogICAgY29uc3RhbnRVc2VzLmZvckVhY2godmlzaXRvci52aXNpdENvbnN0YW50VXNlKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCdUcmFuc2Zvcm1lZFdvcmxkSW1wYWN0KCR3b3JsZEltcGFjdCknKTsKICAgIFdvcmxkSW1wYWN0LnByaW50T24oc2IsIHRoaXMpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgovLy8gQ29uc3RhbnQgdXNlZCB0byBkZW5vdGUgYSBzcGVjaWZpYyB1c2Ugb2YgYSBbV29ybGRJbXBhY3RdLgpjbGFzcyBJbXBhY3RVc2VDYXNlIHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgY29uc3QgSW1wYWN0VXNlQ2FzZSh0aGlzLm5hbWUpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnSW1wYWN0VXNlQ2FzZSgkbmFtZSknOwp9CgovLy8gU3RyYXRlZ3kgdXNlZCBmb3IgcHJvY2Vzc2luZyBbV29ybGRJbXBhY3RdIG9iamVjdCBpbiB2YXJpb3VzIHVzZSBjYXNlcy4KY2xhc3MgSW1wYWN0U3RyYXRlZ3kgewogIGNvbnN0IEltcGFjdFN0cmF0ZWd5KCk7CgogIC8vLyBBcHBsaWVzIFtpbXBhY3RdIHRvIFt2aXNpdG9yXSBmb3IgdGhlIFtpbXBhY3RVc2VDYXNlXSBvZiBbaW1wYWN0U291cmNlXS4KICB2b2lkIHZpc2l0SW1wYWN0KHZhciBpbXBhY3RTb3VyY2UsIFdvcmxkSW1wYWN0IGltcGFjdCwKICAgICAgV29ybGRJbXBhY3RWaXNpdG9yIHZpc2l0b3IsIEltcGFjdFVzZUNhc2UgaW1wYWN0VXNlQ2FzZSkgewogICAgLy8gQXBwbHkgdW5jb25kaXRpb25hbGx5LgogICAgaW1wYWN0LmFwcGx5KHZpc2l0b3IpOwogIH0KCiAgLy8vIE5vdGlmaWVzIHRoZSBzdHJhdGVneSB0aGF0IG5vIG1vcmUgaW1wYWN0cyBvZiBbaW1wYWN0VXNlQ2FzZV0gd2lsbCBiZQogIC8vLyBhcHBsaWVkLgogIHZvaWQgb25JbXBhY3RVc2VkKEltcGFjdFVzZUNhc2UgaW1wYWN0VXNlQ2FzZSkgewogICAgLy8gRG8gbm90aGluZy4KICB9Cn0KCi8vLyBWaXNpdG9yIHVzZWQgdG8gcHJvY2VzcyB0aGUgdXNlcyBvZiBhIFtXb3JsZEltcGFjdF0uCmFic3RyYWN0IGNsYXNzIFdvcmxkSW1wYWN0VmlzaXRvciB7CiAgdm9pZCB2aXNpdFN0YXRpY1VzZShTdGF0aWNVc2Ugc3RhdGljVXNlKTsKICB2b2lkIHZpc2l0RHluYW1pY1VzZShEeW5hbWljVXNlIGR5bmFtaWNVc2UpOwogIHZvaWQgdmlzaXRUeXBlVXNlKFR5cGVVc2UgdHlwZVVzZSk7CiAgdm9pZCB2aXNpdENvbnN0YW50VXNlKENvbnN0YW50VXNlIHR5cGVVc2UpOwp9CgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhlc2Ugd2hlbiB3ZSBnZXQgYW5vbnltb3VzIGxvY2FsIGNsYXNzZXMuCnR5cGVkZWYgdm9pZCBWaXNpdFVzZTxVPihVIHVzZSk7CgpjbGFzcyBXb3JsZEltcGFjdFZpc2l0b3JJbXBsIGltcGxlbWVudHMgV29ybGRJbXBhY3RWaXNpdG9yIHsKICBmaW5hbCBWaXNpdFVzZTxTdGF0aWNVc2U+IF92aXNpdFN0YXRpY1VzZTsKICBmaW5hbCBWaXNpdFVzZTxEeW5hbWljVXNlPiBfdmlzaXREeW5hbWljVXNlOwogIGZpbmFsIFZpc2l0VXNlPFR5cGVVc2U+IF92aXNpdFR5cGVVc2U7CiAgZmluYWwgVmlzaXRVc2U8Q29uc3RhbnRVc2U+IF92aXNpdENvbnN0YW50VXNlOwoKICBXb3JsZEltcGFjdFZpc2l0b3JJbXBsKAogICAgICB7VmlzaXRVc2U8U3RhdGljVXNlPiB2aXNpdFN0YXRpY1VzZSwKICAgICAgVmlzaXRVc2U8RHluYW1pY1VzZT4gdmlzaXREeW5hbWljVXNlLAogICAgICBWaXNpdFVzZTxUeXBlVXNlPiB2aXNpdFR5cGVVc2UsCiAgICAgIFZpc2l0VXNlPENvbnN0YW50VXNlPiB2aXNpdENvbnN0YW50VXNlfSkKICAgICAgOiBfdmlzaXRTdGF0aWNVc2UgPSB2aXNpdFN0YXRpY1VzZSwKICAgICAgICBfdmlzaXREeW5hbWljVXNlID0gdmlzaXREeW5hbWljVXNlLAogICAgICAgIF92aXNpdFR5cGVVc2UgPSB2aXNpdFR5cGVVc2UsCiAgICAgICAgX3Zpc2l0Q29uc3RhbnRVc2UgPSB2aXNpdENvbnN0YW50VXNlOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RhdGljVXNlKFN0YXRpY1VzZSB1c2UpIHsKICAgIGlmIChfdmlzaXRTdGF0aWNVc2UgIT0gbnVsbCkgewogICAgICBfdmlzaXRTdGF0aWNVc2UodXNlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREeW5hbWljVXNlKER5bmFtaWNVc2UgdXNlKSB7CiAgICBpZiAoX3Zpc2l0RHluYW1pY1VzZSAhPSBudWxsKSB7CiAgICAgIF92aXNpdER5bmFtaWNVc2UodXNlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlVXNlKFR5cGVVc2UgdXNlKSB7CiAgICBpZiAoX3Zpc2l0VHlwZVVzZSAhPSBudWxsKSB7CiAgICAgIF92aXNpdFR5cGVVc2UodXNlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDb25zdGFudFVzZShDb25zdGFudFVzZSB1c2UpIHsKICAgIGlmIChfdmlzaXRDb25zdGFudFVzZSAhPSBudWxsKSB7CiAgICAgIF92aXNpdENvbnN0YW50VXNlKHVzZSk7CiAgICB9CiAgfQp9CoGBAE5OPAEnASgTAUYcBFFMSARQSEsuFBcBQAE9AUgQUB8BNwFDARwBKzAyLDQEAQwjATAqHhoEAUIwISA1CAYBMjAsNAQCASQyKS81AgFRSBAgHhoiAQwWHh0bHQE0JyA0Mi42BAEMMyAvIgQBDClHBAEMKh0pHAQBDCM+BAEMMB8tIAQBDCdEBAEMNiExJAQBDCtKBAIBQxQ/HSpHAToBGiM2HCgIBgQBDCoWLgQBDDMWNAQBDDAWMgQBDDYWNgQBTEsWGD0vHBgEAU8UNwIBPjxKIQEhHSMlASwBDBUiHx0gHwQBDClKBAEMMyAvNAYiBAEMKh0pLgYcBAEMI0EEAQwwHy0yBiAEAQwnRwQBDCtNBAEMNiExNgYkBAEMKzAyLDQEAQwWKjYjGgQCAT8WFQEiAQwvAgFMFxoBTzlBHhsEAUwPMxMEAgE5JCwvJi4CAUohAT0tLykxARorLCYvKiwmLgEMJyMcBgQBDCkkHQYEAQwjIRoGBAEMKyUeBgQCAS9wYWNrYWdlOmNvbXBpbGVyL3NyYy91bml2ZXJzZS93b3JsZF9pbXBhY3QuZGFydChzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy93b3JsZC5kYXJ0p98vLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLndvcmxkOwoKaW1wb3J0ICdjbG9zdXJlLmRhcnQnOwppbXBvcnQgJ2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICdjb21tb25fZWxlbWVudHMuZGFydCcKICAgIHNob3cKICAgICAgICBKQ29tbW9uRWxlbWVudHMsCiAgICAgICAgSkVsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgICBLQ29tbW9uRWxlbWVudHMsCiAgICAgICAgS0VsZW1lbnRFbnZpcm9ubWVudDsKaW1wb3J0ICdkZWZlcnJlZF9sb2FkLmRhcnQnOwppbXBvcnQgJ2RpYWdub3N0aWNzL2RpYWdub3N0aWNfbGlzdGVuZXIuZGFydCc7CmltcG9ydCAnZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnZWxlbWVudHMvbmFtZXMuZGFydCc7CmltcG9ydCAnZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJ2lyL3N0YXRpY190eXBlLmRhcnQnOwppbXBvcnQgJ2pzX2JhY2tlbmQvYW5ub3RhdGlvbnMuZGFydCc7CmltcG9ydCAnanNfYmFja2VuZC9maWVsZF9hbmFseXNpcy5kYXJ0JyBzaG93IEpGaWVsZEFuYWx5c2lzLCBLRmllbGRBbmFseXNpczsKaW1wb3J0ICdqc19iYWNrZW5kL2JhY2tlbmRfdXNhZ2UuZGFydCcgc2hvdyBCYWNrZW5kVXNhZ2U7CmltcG9ydCAnanNfYmFja2VuZC9pbnRlcmNlcHRvcl9kYXRhLmRhcnQnIHNob3cgSW50ZXJjZXB0b3JEYXRhOwppbXBvcnQgJ2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydCcgc2hvdyBOYXRpdmVEYXRhOwppbXBvcnQgJ2pzX2JhY2tlbmQvbm9fc3VjaF9tZXRob2RfcmVnaXN0cnkuZGFydCcgc2hvdyBOb1N1Y2hNZXRob2REYXRhOwppbXBvcnQgJ2pzX2JhY2tlbmQvcnVudGltZV90eXBlcy5kYXJ0JyBzaG93IFJ1bnRpbWVUeXBlc05lZWQ7CmltcG9ydCAnanNfbW9kZWwvbG9jYWxzLmRhcnQnOwppbXBvcnQgJ2pzX2VtaXR0ZXIvc29ydGVyLmRhcnQnOwppbXBvcnQgJ3VuaXZlcnNlL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JzsKaW1wb3J0ICd1bml2ZXJzZS9tZW1iZXJfdXNhZ2UuZGFydCc7CmltcG9ydCAndW5pdmVyc2Uvc2VsZWN0b3IuZGFydCcgc2hvdyBTZWxlY3RvcjsKCi8vLyBDb21tb24gc3VwZXJpbnRlcmZhY2UgZm9yIFtPcGVuV29ybGRdIGFuZCBbSkNsb3NlZFdvcmxkXS4KYWJzdHJhY3QgY2xhc3MgV29ybGQge30KCi8vLyBUaGUgW0pDbG9zZWRXb3JsZF0gcmVwcmVzZW50cyB0aGUgaW5mb3JtYXRpb24ga25vd24gYWJvdXQgYSBwcm9ncmFtIHdoZW4KLy8vIGNvbXBpbGluZyB3aXRoIGNsb3NlZC13b3JsZCBzZW1hbnRpY3MuCi8vLwovLy8gR2l2ZW4gdGhlIGVudHJ5cG9pbnQgb2YgYW4gYXBwbGljYXRpb24sIHdlIGNhbiB0cmFjayB3aGF0J3MgcmVhY2hhYmxlIGZyb20KLy8vIGl0LCB3aGF0IGZ1bmN0aW9ucyBhcmUgY2FsbGVkLCB3aGF0IGNsYXNzZXMgYXJlIGFsbG9jYXRlZCwgd2hpY2ggbmF0aXZlCi8vLyBKYXZhU2NyaXB0IHR5cGVzIGFyZSB0b3VjaGVkLCB3aGF0IGxhbmd1YWdlIGZlYXR1cmVzIGFyZSB1c2VkLCBhbmQgc28gb24uCi8vLyBUaGlzIHByZWNpc2Uga25vd2xlZGdlIGFib3V0IHdoYXQncyBsaXZlIGluIHRoZSBwcm9ncmFtIGlzIGxhdGVyIHVzZWQgaW4KLy8vIG9wdGltaXphdGlvbnMgYW5kIG90aGVyIGNvbXBpbGVyIGRlY2lzaW9ucyBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNYXliZSB0aGlzIHNob3VsZCBqdXN0IGJlIGNhbGxlZCB0aGUgSldvcmxkLgphYnN0cmFjdCBjbGFzcyBKQ2xvc2VkV29ybGQgaW1wbGVtZW50cyBXb3JsZCB7CiAgSkZpZWxkQW5hbHlzaXMgZ2V0IGZpZWxkQW5hbHlzaXM7CgogIEJhY2tlbmRVc2FnZSBnZXQgYmFja2VuZFVzYWdlOwoKICBOYXRpdmVEYXRhIGdldCBuYXRpdmVEYXRhOwoKICBJbnRlcmNlcHRvckRhdGEgZ2V0IGludGVyY2VwdG9yRGF0YTsKCiAgSkVsZW1lbnRFbnZpcm9ubWVudCBnZXQgZWxlbWVudEVudmlyb25tZW50OwoKICBEYXJ0VHlwZXMgZ2V0IGRhcnRUeXBlczsKCiAgSkNvbW1vbkVsZW1lbnRzIGdldCBjb21tb25FbGVtZW50czsKCiAgLy8vIFJldHVybnMgdGhlIFtBYnN0cmFjdFZhbHVlRG9tYWluXSB1c2VkIGluIHRoZSBnbG9iYWwgdHlwZSBpbmZlcmVuY2UuCiAgQWJzdHJhY3RWYWx1ZURvbWFpbiBnZXQgYWJzdHJhY3RWYWx1ZURvbWFpbjsKCiAgUnVudGltZVR5cGVzTmVlZCBnZXQgcnRpTmVlZDsKCiAgTm9TdWNoTWV0aG9kRGF0YSBnZXQgbm9TdWNoTWV0aG9kRGF0YTsKCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGdldCBsaXZlTmF0aXZlQ2xhc3NlczsKCiAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBnZXQgcHJvY2Vzc2VkTWVtYmVyczsKCiAgQ2xhc3NIaWVyYXJjaHkgZ2V0IGNsYXNzSGllcmFyY2h5OwoKICBBbm5vdGF0aW9uc0RhdGEgZ2V0IGFubm90YXRpb25zRGF0YTsKCiAgR2xvYmFsTG9jYWxzTWFwIGdldCBnbG9iYWxMb2NhbHNNYXA7CiAgQ2xvc3VyZURhdGEgZ2V0IGNsb3N1cmVEYXRhTG9va3VwOwoKICBPdXRwdXRVbml0RGF0YSBnZXQgb3V0cHV0VW5pdERhdGE7CgogIC8vLyBUaGUgW1NvcnRlcl0gdXNlZCBmb3Igc29ydGluZyBlbGVtZW50cyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuCiAgU29ydGVyIGdldCBzb3J0ZXI7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbY2xzXSBpcyBpbXBsZW1lbnRlZCBieSBhbiBpbnN0YW50aWF0ZWQgY2xhc3MuCiAgYm9vbCBpc0ltcGxlbWVudGVkKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIHRoZSBtb3N0IHNwZWNpZmljIHN1YmNsYXNzIG9mIFtjbHNdIChpbmNsdWRpbmcgW2Nsc10pIHRoYXQgaXMKICAvLy8gZGlyZWN0bHkgaW5zdGFudGlhdGVkIG9yIGEgc3VwZXJjbGFzcyBvZiBhbGwgZGlyZWN0bHkgaW5zdGFudGlhdGVkCiAgLy8vIHN1YmNsYXNzZXMuIElmIFtjbHNdIGlzIG5vdCBpbnN0YW50aWF0ZWQsIGBudWxsYCBpcyByZXR1cm5lZC4KICBDbGFzc0VudGl0eSBnZXRMdWJPZkluc3RhbnRpYXRlZFN1YmNsYXNzZXMoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgdGhlIG1vc3Qgc3BlY2lmaWMgc3VidHlwZSBvZiBbY2xzXSAoaW5jbHVkaW5nIFtjbHNdKSB0aGF0IGlzCiAgLy8vIGRpcmVjdGx5IGluc3RhbnRpYXRlZCBvciBhIHN1cGVyY2xhc3Mgb2YgYWxsIGRpcmVjdGx5IGluc3RhbnRpYXRlZAogIC8vLyBzdWJ0eXBlcy4gSWYgbm8gc3VidHlwZXMgb2YgW2Nsc10gYXJlIGluc3RhbnRpYXRlZCwgYG51bGxgIGlzIHJldHVybmVkLgogIENsYXNzRW50aXR5IGdldEx1Yk9mSW5zdGFudGlhdGVkU3VidHlwZXMoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYW4gaXRlcmFibGUgb3ZlciB0aGUgY29tbW9uIHN1cGVydHlwZXMgb2YgdGhlIFtjbGFzc2VzXS4KICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gY29tbW9uU3VwZXJ0eXBlc09mKEl0ZXJhYmxlPENsYXNzRW50aXR5PiBjbGFzc2VzKTsKCiAgLy8vIFJldHVybnMgYW4gaXRlcmFibGUgb3ZlciB0aGUgbGl2ZSBtaXhpbiBhcHBsaWNhdGlvbnMgdGhhdCBtaXhpbiBbY2xzXS4KICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gbWl4aW5Vc2VzT2YoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtjbHNdIGlzIG1peGVkIGludG8gYSBsaXZlIGNsYXNzLgogIGJvb2wgaXNVc2VkQXNNaXhpbihDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGxpdmUgY2xhc3MgdGhhdCBtaXhlcyBpbiBbY2xzXSBpbXBsZW1lbnRzIFt0eXBlXS4KICBib29sIGhhc0FueVN1YmNsYXNzT2ZNaXhpblVzZVRoYXRJbXBsZW1lbnRzKAogICAgICBDbGFzc0VudGl0eSBjbHMsIENsYXNzRW50aXR5IHR5cGUpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGxpdmUgY2xhc3MgdGhhdCBtaXhlcyBpbiBbbWl4aW5dIGlzIGFsc28gYSBzdWJjbGFzcwogIC8vLyBvZiBbc3VwZXJjbGFzc10uCiAgYm9vbCBoYXNBbnlTdWJjbGFzc1RoYXRNaXhlcyhDbGFzc0VudGl0eSBzdXBlcmNsYXNzLCBDbGFzc0VudGl0eSBtaXhpbik7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbY2xzXSBvciBhbnkgc3VwZXJjbGFzcyBtaXhlcyBpbiBbbWl4aW5dLgogIGJvb2wgaXNTdWJjbGFzc09mTWl4aW5Vc2VPZihDbGFzc0VudGl0eSBjbHMsIENsYXNzRW50aXR5IG1peGluKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIGV2ZXJ5IHN1YnR5cGUgb2YgW3hdIGlzIGEgc3ViY2xhc3Mgb2YgW3ldIG9yIGEgc3ViY2xhc3MKICAvLy8gb2YgYSBtaXhpbiBhcHBsaWNhdGlvbiBvZiBbeV0uCiAgYm9vbCBldmVyeVN1YnR5cGVJc1N1YmNsYXNzT2ZPck1peGluVXNlT2YoQ2xhc3NFbnRpdHkgeCwgQ2xhc3NFbnRpdHkgeSk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgc3ViY2xhc3Mgb2YgW3N1cGVyY2xhc3NdIGltcGxlbWVudHMgW3R5cGVdLgogIGJvb2wgaGFzQW55U3ViY2xhc3NUaGF0SW1wbGVtZW50cyhDbGFzc0VudGl0eSBzdXBlcmNsYXNzLCBDbGFzc0VudGl0eSB0eXBlKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIGEgY2FsbCBvZiBbc2VsZWN0b3JdIG9uIFtjbHNdIGFuZC9vciBzdWJjbGFzc2VzL3N1YnR5cGVzCiAgLy8vIG5lZWQgbm9TdWNoTWV0aG9kIGhhbmRsaW5nLgogIC8vLwogIC8vLyBJZiB0aGUgcmVjZWl2ZXIgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGEgbWVtYmVyIHRoYXQgbWF0Y2hlcyB3aGF0IHdlJ3JlCiAgLy8vIGxvb2tpbmcgZm9yLCB0aGVyZSdzIG5vIG5lZWQgdG8gaW50cm9kdWNlIGEgbm9TdWNoTWV0aG9kIGhhbmRsZXIuIEl0IHdpbGwKICAvLy8gbmV2ZXIgYmUgY2FsbGVkLgogIC8vLwogIC8vLyBBcyBhbiBleGFtcGxlLCBjb25zaWRlciB0aGlzIGNsYXNzIGhpZXJhcmNoeToKICAvLy8KICAvLy8gICAgICAgICAgICAgICAgICAgQSAgICA8LS0gbm9TdWNoTWV0aG9kCiAgLy8vICAgICAgICAgICAgICAgICAgLyBcCiAgLy8vICAgICAgICAgICAgICAgICBDICAgQiAgPC0tIGZvbwogIC8vLwogIC8vLyBJZiB3ZSBrbm93IHdlJ3JlIGNhbGxpbmcgZm9vIG9uIGFuIG9iamVjdCBvZiB0eXBlIEIgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeQogIC8vLyBhYm91dCB0aGUgbm9TdWNoTWV0aG9kIG1ldGhvZCBpbiBBIGJlY2F1c2Ugb2JqZWN0cyBvZiB0eXBlIEIgaW1wbGVtZW50CiAgLy8vIGZvby4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHdlIGVuZCB1cCBjYWxsaW5nIGZvbyBvbiBzb21ldGhpbmcgb2YgdHlwZSBDIHdlCiAgLy8vIGhhdmUgdG8gYWRkIGEgaGFuZGxlciBmb3IgaXQuCiAgLy8vCiAgLy8vIElmIHRoZSBob2xkZXJzIG9mIGFsbCB1c2VyLWRlZmluZWQgbm9TdWNoTWV0aG9kIGltcGxlbWVudGF0aW9ucyB0aGF0IG1pZ2h0CiAgLy8vIGJlIGFwcGxpY2FibGUgdG8gdGhlIHJlY2VpdmVyIHR5cGUgaGF2ZSBhIG1hdGNoaW5nIG1lbWJlciBmb3IgdGhlIGN1cnJlbnQKICAvLy8gbmFtZSBhbmQgc2VsZWN0b3IsIHdlIGF2b2lkIGludHJvZHVjaW5nIGEgbm9TdWNoTWV0aG9kIGhhbmRsZXIuCiAgLy8vCiAgLy8vIEFzIGFuIGV4YW1wbGUsIGNvbnNpZGVyIHRoaXMgY2xhc3MgaGllcmFyY2h5OgogIC8vLwogIC8vLyAgICAgICAgICAgICAgICAgICAgICAgIEEgICAgPC0tIGZvbwogIC8vLyAgICAgICAgICAgICAgICAgICAgICAgLyBcCiAgLy8vICAgIG5vU3VjaE1ldGhvZCAtLT4gIEIgICBDICA8LS0gYmFyCiAgLy8vICAgICAgICAgICAgICAgICAgICAgIHwgICB8CiAgLy8vICAgICAgICAgICAgICAgICAgICAgIEMgICBEICA8LS0gbm9TdWNoTWV0aG9kCiAgLy8vCiAgLy8vIFdoZW4gY2FsbGluZyBmb28gb24gYW4gb2JqZWN0IG9mIHR5cGUgQSwgd2Uga25vdyB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbnMKICAvLy8gb2Ygbm9TdWNoTWV0aG9kIGFyZSBpbiB0aGUgY2xhc3NlcyBCIGFuZCBEIHRoYXQgYWxzbyAoaW5kaXJlY3RseSkKICAvLy8gaW1wbGVtZW50IGZvbywgc28gd2UgZG8gbm90IG5lZWQgYSBoYW5kbGVyIGZvciBpdC4KICAvLy8KICAvLy8gSWYgd2UncmUgY2FsbGluZyBiYXIgb24gYW4gb2JqZWN0IG9mIHR5cGUgRCwgd2UgZG9uJ3QgbmVlZCB0aGUgaGFuZGxlcgogIC8vLyBlaXRoZXIgYmVjYXVzZSBhbGwgb2JqZWN0cyBvZiB0eXBlIEQgaW1wbGVtZW50IGJhciB0aHJvdWdoIGluaGVyaXRhbmNlLgogIC8vLwogIC8vLyBJZiB3ZSdyZSBjYWxsaW5nIGJhciBvbiBhbiBvYmplY3Qgb2YgdHlwZSBBIHdlIGRvIG5lZWQgdGhlIGhhbmRsZXIgYmVjYXVzZQogIC8vLyB3ZSBtYXkgaGF2ZSB0byBjYWxsIEIubm9TdWNoTWV0aG9kIHNpbmNlIEIgZG9lcyBub3QgaW1wbGVtZW50IGJhci4KICBib29sIG5lZWRzTm9TdWNoTWV0aG9kKENsYXNzRW50aXR5IGNscywgU2VsZWN0b3Igc2VsZWN0b3IsIENsYXNzUXVlcnkgcXVlcnkpOwoKICAvLy8gUmV0dXJucyB3aGV0aGVyIFtlbGVtZW50XSB3aWxsIGJlIHRoZSBvbmUgdXNlZCBhdCBydW50aW1lIHdoZW4gYmVpbmcKICAvLy8gaW52b2tlZCBvbiBhbiBpbnN0YW5jZSBvZiBbY2xzXS4gW25hbWVdIGlzIHVzZWQgdG8gZW5zdXJlIGxpYnJhcnkKICAvLy8gcHJpdmFjeSBpcyB0YWtlbiBpbnRvIGFjY291bnQuCiAgYm9vbCBoYXNFbGVtZW50SW4oQ2xhc3NFbnRpdHkgY2xzLCBOYW1lIG5hbWUsIE1lbWJlckVudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHRoZSBmaWVsZCBbZWxlbWVudF0gaXMga25vd24gdG8gYmUgZWZmZWN0aXZlbHkgZmluYWwuCiAgYm9vbCBmaWVsZE5ldmVyQ2hhbmdlcyhNZW1iZXJFbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbc2VsZWN0b3JdIG9uIFtyZWNlaXZlcl0gY2FuIGhpdCBhIGBjYWxsYCBtZXRob2Qgb24gYQogIC8vLyBzdWJjbGFzcyBvZiBgQ2xvc3VyZWAuCiAgLy8vCiAgLy8vIEV2ZXJ5IGltcGxlbWVudGF0aW9uIG9mIGBDbG9zdXJlYCBoYXMgYSAnY2FsbCcgbWV0aG9kIHdpdGggaXRzIG93bgogIC8vLyBzaWduYXR1cmUgc28gaXQgY2Fubm90IGJlIG1vZGVsbGVkIGJ5IGEgW0Z1bmN0aW9uRW50aXR5XS4gQWxzbywKICAvLy8gY2FsbC1tZXRob2RzIGZvciB0ZWFyLW9mZiBhcmUgbm90IHBhcnQgb2YgdGhlIGVsZW1lbnQgbW9kZWwuCiAgYm9vbCBpbmNsdWRlc0Nsb3N1cmVDYWxsKFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyKTsKCiAgLy8vIFJldHVybnMgdGhlIG1hc2sgZm9yIHRoZSBwb3RlbnRpYWwgcmVjZWl2ZXJzIG9mIGEgZHluYW1pYyBjYWxsIHRvCiAgLy8vIFtzZWxlY3Rvcl0gb24gW3JlY2VpdmVyXS4KICAvLy8KICAvLy8gVGhpcyB3aWxsIG5hcnJvdyB0aGUgY29uc3RyYWludHMgb2YgW3JlY2VpdmVyXSB0byBhbiBbQWJzdHJhY3RWYWx1ZV0gb2YKICAvLy8gdGhlIHNldCBvZiBjbGFzc2VzIHRoYXQgYWN0dWFsbHkgaW1wbGVtZW50IHRoZSBzZWxlY3RlZCBtZW1iZXIgb3IKICAvLy8gaW1wbGVtZW50IHRoZSBoYW5kbGluZyAnbm9TdWNoTWV0aG9kJyB3aGVyZSB0aGUgc2VsZWN0ZWQgbWVtYmVyIGlzCiAgLy8vIHVuaW1wbGVtZW50ZWQuCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlUmVjZWl2ZXJUeXBlKFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyKTsKCiAgLy8vIFJldHVybnMgYWxsIHRoZSBpbnN0YW5jZSBtZW1iZXJzIHRoYXQgbWF5IGJlIGludm9rZWQgd2l0aCB0aGUgW3NlbGVjdG9yXQogIC8vLyBvbiB0aGUgZ2l2ZW4gW3JlY2VpdmVyXS4gVGhlIHJldHVybmVkIGVsZW1lbnRzIG1heSBpbmNsdWRlIG5vU3VjaE1ldGhvZAogIC8vLyBoYW5kbGVycyB0aGF0IGFyZSBwb3RlbnRpYWwgdGFyZ2V0cyBpbmRpcmVjdGx5IHRocm91Z2ggdGhlIG5vU3VjaE1ldGhvZAogIC8vLyBtZWNoYW5pc20uCiAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBsb2NhdGVNZW1iZXJzKAogICAgICBTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSByZWNlaXZlcik7CgogIC8vLyBSZXR1cm5zIHRoZSBzaW5nbGUgW01lbWJlckVudGl0eV0gdGhhdCBtYXRjaGVzIGEgY2FsbCB0byBbc2VsZWN0b3JdIG9uIHRoZQogIC8vLyBbcmVjZWl2ZXJdLiBJZiBtdWx0aXBsZSB0YXJnZXRzIGV4aXN0LCBgbnVsbGAgaXMgcmV0dXJuZWQuCiAgTWVtYmVyRW50aXR5IGxvY2F0ZVNpbmdsZU1lbWJlcihTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSByZWNlaXZlcik7Cn0KCmFic3RyYWN0IGNsYXNzIE9wZW5Xb3JsZCBpbXBsZW1lbnRzIFdvcmxkIHsKICB2b2lkIHJlZ2lzdGVyVXNlZEVsZW1lbnQoTWVtYmVyRW50aXR5IGVsZW1lbnQpOwoKICBLQ2xvc2VkV29ybGQgY2xvc2VXb3JsZChEaWFnbm9zdGljUmVwb3J0ZXIgcmVwb3J0ZXIpOwoKICAvLy8gUmV0dXJucyBhbiBpdGVyYWJsZSBvdmVyIGFsbCBtaXhpbiBhcHBsaWNhdGlvbnMgdGhhdCBtaXhpbiBbY2xzXS4KICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gYWxsTWl4aW5Vc2VzT2YoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFttZW1iZXJdIGlzIGluaGVyaXRlZCBpbnRvIGEgc3VidHlwZSBvZiBbdHlwZV0uCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZToKICAvLy8KICAvLy8gICAgIGNsYXNzIEEgeyBtKCkge30gfQogIC8vLyAgICAgY2xhc3MgQiBleHRlbmRzIEEgaW1wbGVtZW50cyBJIHt9CiAgLy8vICAgICBjbGFzcyBDIGV4dGVuZHMgT2JqZWN0IHdpdGggQSBpbXBsZW1lbnRzIEkge30KICAvLy8gICAgIGFic3RyYWN0IGNsYXNzIEkgeyBtKCk7IH0KICAvLy8gICAgIGFic3RyYWN0IGNsYXNzIEogaW1wbGVtZW50cyBBIHsgfQogIC8vLwogIC8vLyBIZXJlIGBBLm1gIGlzIGluaGVyaXRlZCBpbnRvIGBBYCwgYEJgLCBhbmQgYENgLiBCZWNhdXNlIGBCYCBhbmQKICAvLy8gYENgIGltcGxlbWVudCBgSWAsIGBpc0luaGVyaXRlZEluU3VidHlwZU9mKEEubSwgSSlgIGlzIHRydWUsIGJ1dAogIC8vLyBgaXNJbmhlcml0ZWRJblN1YnR5cGVPZihBLm0sIEopYCBpcyBmYWxzZS4KICBib29sIGlzSW5oZXJpdGVkSW4oCiAgICAgIE1lbWJlckVudGl0eSBtZW1iZXIsIENsYXNzRW50aXR5IHR5cGUsIENsYXNzUmVsYXRpb24gcmVsYXRpb24pOwp9CgphYnN0cmFjdCBjbGFzcyBLQ2xvc2VkV29ybGQgewogIERhcnRUeXBlcyBnZXQgZGFydFR5cGVzOwogIEtGaWVsZEFuYWx5c2lzIGdldCBmaWVsZEFuYWx5c2lzOwogIEJhY2tlbmRVc2FnZSBnZXQgYmFja2VuZFVzYWdlOwogIE5hdGl2ZURhdGEgZ2V0IG5hdGl2ZURhdGE7CiAgSW50ZXJjZXB0b3JEYXRhIGdldCBpbnRlcmNlcHRvckRhdGE7CiAgS0VsZW1lbnRFbnZpcm9ubWVudCBnZXQgZWxlbWVudEVudmlyb25tZW50OwogIEtDb21tb25FbGVtZW50cyBnZXQgY29tbW9uRWxlbWVudHM7CiAgQ2xhc3NIaWVyYXJjaHkgZ2V0IGNsYXNzSGllcmFyY2h5OwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2Nsc10gaXMgaW1wbGVtZW50ZWQgYnkgYW4gaW5zdGFudGlhdGVkIGNsYXNzLgogIGJvb2wgaXNJbXBsZW1lbnRlZChDbGFzc0VudGl0eSBjbHMpOwoKICBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IGdldCBsaXZlSW5zdGFuY2VNZW1iZXJzOwogIE1hcDxDbGFzc0VudGl0eSwgU2V0PENsYXNzRW50aXR5Pj4gZ2V0IG1peGluVXNlczsKICBNYXA8Q2xhc3NFbnRpdHksIFNldDxDbGFzc0VudGl0eT4+IGdldCB0eXBlc0ltcGxlbWVudGVkQnlTdWJjbGFzc2VzOwoKICAvLy8gTWVtYmVycyB0aGF0IGFyZSB3cml0dGVuIGVpdGhlciBkaXJlY3RseSBvciB0aHJvdWdoIGEgc2V0dGVyIHNlbGVjdG9yLgogIEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gZ2V0IGFzc2lnbmVkSW5zdGFuY2VNZW1iZXJzOwoKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0IGxpdmVOYXRpdmVDbGFzc2VzOwogIE1hcDxNZW1iZXJFbnRpdHksIE1lbWJlclVzYWdlPiBnZXQgbGl2ZU1lbWJlclVzYWdlOwogIFJ1bnRpbWVUeXBlc05lZWQgZ2V0IHJ0aU5lZWQ7CiAgTm9TdWNoTWV0aG9kRGF0YSBnZXQgbm9TdWNoTWV0aG9kRGF0YTsKCiAgQW5ub3RhdGlvbnNEYXRhIGdldCBhbm5vdGF0aW9uc0RhdGE7Cn0KgQAATk48ARcBFxYeCRkdGR0dLyEeHi4eJk06QDZIPh8hKCUvAT4YAU0rBE9MTk1HRS8kASEBHQEnAS4BGwEmAUsvASABKQEvAS8BJQEnASclASUBRBUBRycBTElEPwFLSU49AUdLAU02ATonAU4vKgFQF0sBQkMBUCVLAUhPAVEiBk1QFwY0Bi4bJQZRTVEkBlFQRgY0BiogKiEzBlBIOQZNTgZRSVABS0glRwFOMAFOHQZJRkNHAUggBk5ISRVQAU9OThEoMgFRQU4CASwyATgBSDkBSAYUBh0sOCQsBkZHMRZGAgEeGyQhHScuJiUBRycBMjRHAU02AS82ICkBJwIBH3BhY2thZ2U6Y29tcGlsZXIvc3JjL3dvcmxkLmRhcnRIc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvZGlhZ25vc3RpY3MvZ2VuZXJhdGVkL3NoYXJlZF9tZXNzYWdlcy5kYXJ0oK0vLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgovKgpET04nVCBFRElULiBHRU5FUkFURUQuIERPTidUIEVESVQuClRoaXMgZmlsZSBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkgJ3B1Ymxpc2guZGFydCcgaW4gdGhlIGRhcnRfbWVzc2FnZXMgcGFja2FnZS4KCk1lc3NhZ2VzIGFyZSBtYWludGFpbmVkIGluIGBsaWIvc2hhcmVkX21lc3NhZ2VzLmRhcnRgIG9mIHRoYXQgc2FtZSBwYWNrYWdlLgpBZnRlciBhbnkgY2hhbmdlIHRvIHRoYXQgZmlsZSwgcnVuIGBiaW4vcHVibGlzaC5kYXJ0YCB0byBnZW5lcmF0ZSBhIG5ldyB2ZXJzaW9uCm9mIHRoZSBqc29uLCBkYXJ0MmpzIGFuZCBhbmFseXplciByZXByZXNlbnRhdGlvbnMuCiovCmltcG9ydCAnLi4vbWVzc2FnZXMuZGFydCcgc2hvdyBNZXNzYWdlS2luZCwgTWVzc2FnZVRlbXBsYXRlOwoKY29uc3QgTWFwPE1lc3NhZ2VLaW5kLCBNZXNzYWdlVGVtcGxhdGU+IFRFTVBMQVRFUyA9CiAgICBjb25zdCA8TWVzc2FnZUtpbmQsIE1lc3NhZ2VUZW1wbGF0ZT57CiAgTWVzc2FnZUtpbmQuQ09OU1RfQ09OU1RSVUNUT1JfV0lUSF9CT0RZOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgIE1lc3NhZ2VLaW5kLkNPTlNUX0NPTlNUUlVDVE9SX1dJVEhfQk9EWSwKICAgICAgIkNvbnN0IGNvbnN0cnVjdG9yIGNhbid0IGhhdmUgYSBib2R5LiIsCiAgICAgIGhvd1RvRml4OiAiVHJ5IHJlbW92aW5nIHRoZSAnY29uc3QnIGtleXdvcmQgb3IgdGhlIGJvZHkuIiwKICAgICAgZXhhbXBsZXM6IGNvbnN0IFsKICAgICAgICByIiIiCiAgICAgICAgIGNsYXNzIEMgewogICAgICAgICAgIGNvbnN0IEMoKSB7fQogICAgICAgICB9CgogICAgICAgICBtYWluKCkgPT4gbmV3IEMoKTsiIiIsCiAgICAgIF0pLCAvLyBHZW5lcmF0ZWQuIERvbid0IGVkaXQuCiAgTWVzc2FnZUtpbmQuQ09OU1RfRkFDVE9SWTogY29uc3QgTWVzc2FnZVRlbXBsYXRlKE1lc3NhZ2VLaW5kLkNPTlNUX0ZBQ1RPUlksCiAgICAgICJPbmx5IHJlZGlyZWN0aW5nIGZhY3RvcnkgY29uc3RydWN0b3JzIGNhbiBiZSBkZWNsYXJlZCB0byBiZSAnY29uc3QnLiIsCiAgICAgIGhvd1RvRml4OgogICAgICAgICAgIlRyeSByZW1vdmluZyB0aGUgJ2NvbnN0JyBrZXl3b3JkIG9yIHJlcGxhY2luZyB0aGUgYm9keSB3aXRoICc9JyBmb2xsb3dlZCBieSBhIHZhbGlkIHRhcmdldC4iLAogICAgICBleGFtcGxlczogY29uc3QgWwogICAgICAgIHIiIiIKICAgICAgICAgY2xhc3MgQyB7CiAgICAgICAgICAgY29uc3QgZmFjdG9yeSBDKCkge30KICAgICAgICAgfQoKICAgICAgICAgbWFpbigpID0+IG5ldyBDKCk7IiIiLAogICAgICBdKSwgLy8gR2VuZXJhdGVkLiBEb24ndCBlZGl0LgogIE1lc3NhZ2VLaW5kLkVYVFJBTkVPVVNfTU9ESUZJRVI6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgTWVzc2FnZUtpbmQuRVhUUkFORU9VU19NT0RJRklFUiwKICAgICAgIkNhbid0IGhhdmUgbW9kaWZpZXIgJyN7bW9kaWZpZXJ9JyBoZXJlLiIsCiAgICAgIGhvd1RvRml4OiAiVHJ5IHJlbW92aW5nICcje21vZGlmaWVyfScuIiwKICAgICAgZXhhbXBsZXM6IGNvbnN0IFsKICAgICAgICAidmFyIFN0cmluZyBmb287IG1haW4oKXt9IiwKICAgICAgICAidmFyIGZpbmFsIGZvbzsgbWFpbigpe30iLAogICAgICAgICJ2YXIgdmFyIGZvbzsgbWFpbigpe30iLAogICAgICAgICJ2YXIgY29uc3QgZm9vOyBtYWluKCl7fSIsCiAgICAgICAgInZhciBhYnN0cmFjdCBmb287IG1haW4oKXt9IiwKICAgICAgICAidmFyIHN0YXRpYyBmb287IG1haW4oKXt9IiwKICAgICAgICAidmFyIGV4dGVybmFsIGZvbzsgbWFpbigpe30iLAogICAgICAgICJmaW5hbCB2YXIgZm9vOyBtYWluKCl7fSIsCiAgICAgICAgInZhciB2YXIgZm9vOyBtYWluKCl7fSIsCiAgICAgICAgImNvbnN0IHZhciBmb287IG1haW4oKXt9IiwKICAgICAgICAiYWJzdHJhY3QgdmFyIGZvbzsgbWFpbigpe30iLAogICAgICAgICJzdGF0aWMgdmFyIGZvbzsgbWFpbigpe30iLAogICAgICAgICJleHRlcm5hbCB2YXIgZm9vOyBtYWluKCl7fSIsCiAgICAgIF0pLCAvLyBHZW5lcmF0ZWQuIERvbid0IGVkaXQuCiAgTWVzc2FnZUtpbmQuRVhUUkFORU9VU19NT0RJRklFUl9SRVBMQUNFOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgIE1lc3NhZ2VLaW5kLkVYVFJBTkVPVVNfTU9ESUZJRVJfUkVQTEFDRSwKICAgICAgIkNhbid0IGhhdmUgbW9kaWZpZXIgJyN7bW9kaWZpZXJ9JyBoZXJlLiIsCiAgICAgIGhvd1RvRml4OgogICAgICAgICAgIlRyeSByZXBsYWNpbmcgbW9kaWZpZXIgJyN7bW9kaWZpZXJ9JyB3aXRoICd2YXInLCAnZmluYWwnLCBvciBhIHR5cGUuIiwKICAgICAgZXhhbXBsZXM6IGNvbnN0IFsKICAgICAgICAic2V0IGZvbzsgbWFpbigpe30iLAogICAgICAgICJhYnN0cmFjdCBmb287IG1haW4oKXt9IiwKICAgICAgICAic3RhdGljIGZvbzsgbWFpbigpe30iLAogICAgICAgICJleHRlcm5hbCBmb287IG1haW4oKXt9IiwKICAgICAgXSksIC8vIEdlbmVyYXRlZC4gRG9uJ3QgZWRpdC4KICBNZXNzYWdlS2luZC5DT05TVFJVQ1RPUl9XSVRIX1JFVFVSTl9UWVBFOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgIE1lc3NhZ2VLaW5kLkNPTlNUUlVDVE9SX1dJVEhfUkVUVVJOX1RZUEUsCiAgICAgICJDb25zdHJ1Y3RvcnMgY2FuJ3QgaGF2ZSBhIHJldHVybiB0eXBlLiIsCiAgICAgIGhvd1RvRml4OiAiVHJ5IHJlbW92aW5nIHRoZSByZXR1cm4gdHlwZS4iLAogICAgICBleGFtcGxlczogY29uc3QgWwogICAgICAgICJjbGFzcyBBIHsgaW50IEEoKSB7fSB9IG1haW4oKSB7IG5ldyBBKCk7IH0iLAogICAgICBdKSwgLy8gR2VuZXJhdGVkLiBEb24ndCBlZGl0LgogIE1lc3NhZ2VLaW5kLk1JU1NJTkdfRVhQUkVTU0lPTl9JTl9USFJPVzogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICBNZXNzYWdlS2luZC5NSVNTSU5HX0VYUFJFU1NJT05fSU5fVEhST1csCiAgICAgICJNaXNzaW5nIGV4cHJlc3Npb24gYWZ0ZXIgJ3Rocm93Jy4iLAogICAgICBob3dUb0ZpeDogIkRpZCB5b3UgbWVhbiAncmV0aHJvdyc/IiksIC8vIEdlbmVyYXRlZC4gRG9uJ3QgZWRpdC4KICBNZXNzYWdlS2luZC5SRVRIUk9XX09VVFNJREVfQ0FUQ0g6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgTWVzc2FnZUtpbmQuUkVUSFJPV19PVVRTSURFX0NBVENILAogICAgICAiUmV0aHJvdyBtdXN0IGJlIGluc2lkZSBvZiBjYXRjaCBjbGF1c2UuIiwKICAgICAgaG93VG9GaXg6CiAgICAgICAgICAiVHJ5IG1vdmluZyB0aGUgZXhwcmVzc2lvbiBpbnRvIGEgY2F0Y2ggY2xhdXNlLCBvciB1c2luZyBhICd0aHJvdycgZXhwcmVzc2lvbi4iLAogICAgICBleGFtcGxlczogY29uc3QgWwogICAgICAgICJtYWluKCkgeyByZXRocm93OyB9IiwKICAgICAgXSksIC8vIEdlbmVyYXRlZC4gRG9uJ3QgZWRpdC4KICBNZXNzYWdlS2luZC5SRVRVUk5fSU5fR0VORVJBVElWRV9DT05TVFJVQ1RPUjogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICBNZXNzYWdlS2luZC5SRVRVUk5fSU5fR0VORVJBVElWRV9DT05TVFJVQ1RPUiwKICAgICAgIkNvbnN0cnVjdG9ycyBjYW4ndCByZXR1cm4gdmFsdWVzLiIsCiAgICAgIGhvd1RvRml4OgogICAgICAgICAgIlRyeSByZW1vdmluZyB0aGUgcmV0dXJuIHN0YXRlbWVudCBvciB1c2luZyBhIGZhY3RvcnkgY29uc3RydWN0b3IuIiwKICAgICAgZXhhbXBsZXM6IGNvbnN0IFsKICAgICAgICByIiIiCiAgICAgICAgY2xhc3MgQyB7CiAgICAgICAgICBDKCkgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG1haW4oKSA9PiBuZXcgQygpOyIiIiwKICAgICAgXSksIC8vIEdlbmVyYXRlZC4gRG9uJ3QgZWRpdC4KICBNZXNzYWdlS2luZC5SRVRVUk5fSU5fR0VORVJBVE9SOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgIE1lc3NhZ2VLaW5kLlJFVFVSTl9JTl9HRU5FUkFUT1IsCiAgICAgICJDYW4ndCByZXR1cm4gYSB2YWx1ZSBmcm9tIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uICh1c2luZyB0aGUgJyN7bW9kaWZpZXJ9JyBtb2RpZmllcikuIiwKICAgICAgaG93VG9GaXg6CiAgICAgICAgICAiVHJ5IHJlbW92aW5nIHRoZSB2YWx1ZSwgcmVwbGFjaW5nICdyZXR1cm4nIHdpdGggJ3lpZWxkJyBvciBjaGFuZ2luZyB0aGUgbWV0aG9kIGJvZHkgbW9kaWZpZXIuIiwKICAgICAgZXhhbXBsZXM6IGNvbnN0IFsKICAgICAgICByIiIiCiAgICAgICAgZm9vKCkgYXN5bmMqIHsgcmV0dXJuIDA7IH0KICAgICAgICBtYWluKCkgPT4gZm9vKCk7CiAgICAgICAgIiIiLAogICAgICAgIHIiIiIKICAgICAgICBmb28oKSBzeW5jKiB7IHJldHVybiAwOyB9CiAgICAgICAgbWFpbigpID0+IGZvbygpOwogICAgICAgICIiIiwKICAgICAgXSksIC8vIEdlbmVyYXRlZC4gRG9uJ3QgZWRpdC4KICBNZXNzYWdlS2luZC5OT1RfQVNTSUdOQUJMRTogY29uc3QgTWVzc2FnZVRlbXBsYXRlKE1lc3NhZ2VLaW5kLk5PVF9BU1NJR05BQkxFLAogICAgICAiJyN7ZnJvbVR5cGV9JyBpcyBub3QgYXNzaWduYWJsZSB0byAnI3t0b1R5cGV9Jy4iKSwgLy8gR2VuZXJhdGVkLiBEb24ndCBlZGl0LgogIE1lc3NhZ2VLaW5kLkZPUklOX05PVF9BU1NJR05BQkxFOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgIE1lc3NhZ2VLaW5kLkZPUklOX05PVF9BU1NJR05BQkxFLAogICAgICAiVGhlIGVsZW1lbnQgdHlwZSAnI3tjdXJyZW50VHlwZX0nIG9mICcje2V4cHJlc3Npb25UeXBlfScgaXMgbm90IGFzc2lnbmFibGUgdG8gJyN7ZWxlbWVudFR5cGV9Jy4iLAogICAgICBleGFtcGxlczogY29uc3QgWwogICAgICAgIHIiIiIKICAgICAgICBtYWluKCkgewogICAgICAgICAgTGlzdDxpbnQ+IGxpc3QgPSA8aW50PlsxLCAyXTsKICAgICAgICAgIGZvciAoU3RyaW5nIHggaW4gbGlzdCkgeDsKICAgICAgICB9CiAgICAgICAgIiIiLAogICAgICBdKSwgLy8gR2VuZXJhdGVkLiBEb24ndCBlZGl0LgogIE1lc3NhZ2VLaW5kLkNBTk5PVF9SRVNPTFZFOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoTWVzc2FnZUtpbmQuQ0FOTk9UX1JFU09MVkUsCiAgICAgICJDYW4ndCByZXNvbHZlICcje25hbWV9Jy4iKSwgLy8gR2VuZXJhdGVkLiBEb24ndCBlZGl0LgogIE1lc3NhZ2VLaW5kLlVOREVGSU5FRF9NRVRIT0Q6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgTWVzc2FnZUtpbmQuVU5ERUZJTkVEX01FVEhPRCwKICAgICAgIlRoZSBtZXRob2QgJyN7bWVtYmVyTmFtZX0nIGlzIG5vdCBkZWZpbmVkIGZvciB0aGUgY2xhc3MgJyN7Y2xhc3NOYW1lfScuIiwKICAgICAgZXhhbXBsZXM6IGNvbnN0IFsKICAgICAgICByIiIiCiAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICBmb28oKSB7IGJhcigpOyB9CiAgICAgICAgfQogICAgICAgIG1haW4oKSB7IG5ldyBBKCkuZm9vKCk7IH0KICAgICAgICAiIiIsCiAgICAgIF0pLCAvLyBHZW5lcmF0ZWQuIERvbid0IGVkaXQuCiAgTWVzc2FnZUtpbmQuVU5ERUZJTkVEX0dFVFRFUjogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICBNZXNzYWdlS2luZC5VTkRFRklORURfR0VUVEVSLAogICAgICAiVGhlIGdldHRlciAnI3ttZW1iZXJOYW1lfScgaXMgbm90IGRlZmluZWQgZm9yIHRoZSBjbGFzcyAnI3tjbGFzc05hbWV9Jy4iLAogICAgICBleGFtcGxlczogY29uc3QgWwogICAgICAgICJjbGFzcyBBIHt9IG1haW4oKSB7IG5ldyBBKCkueDsgfSIsCiAgICAgICAgImNsYXNzIEEge30gbWFpbigpIHsgQS54OyB9IiwKICAgICAgXSksIC8vIEdlbmVyYXRlZC4gRG9uJ3QgZWRpdC4KICBNZXNzYWdlS2luZC5VTkRFRklORURfSU5TVEFOQ0VfR0VUVEVSX0JVVF9TRVRURVI6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgTWVzc2FnZUtpbmQuVU5ERUZJTkVEX0lOU1RBTkNFX0dFVFRFUl9CVVRfU0VUVEVSLAogICAgICAiVGhlIHNldHRlciAnI3ttZW1iZXJOYW1lfScgaW4gY2xhc3MgJyN7Y2xhc3NOYW1lfScgY2FuIG5vdCBiZSB1c2VkIGFzIGEgZ2V0dGVyLiIsCiAgICAgIGV4YW1wbGVzOiBjb25zdCBbCiAgICAgICAgImNsYXNzIEEgeyBzZXQgeCh5KSB7fSB9IG1haW4oKSB7IG5ldyBBKCkueDsgfSIsCiAgICAgIF0pLCAvLyBHZW5lcmF0ZWQuIERvbid0IGVkaXQuCiAgTWVzc2FnZUtpbmQuVU5ERUZJTkVEX09QRVJBVE9SOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgIE1lc3NhZ2VLaW5kLlVOREVGSU5FRF9PUEVSQVRPUiwKICAgICAgIlRoZSBvcGVyYXRvciAnI3ttZW1iZXJOYW1lfScgaXMgbm90IGRlZmluZWQgZm9yIHRoZSBjbGFzcyAnI3tjbGFzc05hbWV9Jy4iLAogICAgICBleGFtcGxlczogY29uc3QgWwogICAgICAgICJjbGFzcyBBIHt9IG1haW4oKSB7IG5ldyBBKCkgKyAzOyB9IiwKICAgICAgXSksIC8vIEdlbmVyYXRlZC4gRG9uJ3QgZWRpdC4KICBNZXNzYWdlS2luZC5VTkRFRklORURfU0VUVEVSOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgIE1lc3NhZ2VLaW5kLlVOREVGSU5FRF9TRVRURVIsCiAgICAgICJUaGUgc2V0dGVyICcje21lbWJlck5hbWV9JyBpcyBub3QgZGVmaW5lZCBmb3IgdGhlIGNsYXNzICcje2NsYXNzTmFtZX0nLiIsCiAgICAgIGV4YW1wbGVzOiBjb25zdCBbCiAgICAgICAgImNsYXNzIEEge30gbWFpbigpIHsgbmV3IEEoKS54ID0gNDk5OyB9IiwKICAgICAgXSksIC8vIEdlbmVyYXRlZC4gRG9uJ3QgZWRpdC4KICBNZXNzYWdlS2luZC5OT19TVUNIX1NVUEVSX01FTUJFUjogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICBNZXNzYWdlS2luZC5OT19TVUNIX1NVUEVSX01FTUJFUiwKICAgICAgIkNhbid0IHJlc29sdmUgJyN7bWVtYmVyTmFtZX0nIGluIGEgc3VwZXJjbGFzcyBvZiAnI3tjbGFzc05hbWV9Jy4iKSwgLy8gR2VuZXJhdGVkLiBEb24ndCBlZGl0LgogIE1lc3NhZ2VLaW5kLlVOREVGSU5FRF9TVVBFUl9TRVRURVI6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgTWVzc2FnZUtpbmQuVU5ERUZJTkVEX1NVUEVSX1NFVFRFUiwKICAgICAgIlRoZSBzZXR0ZXIgJyN7bWVtYmVyTmFtZX0nIGlzIG5vdCBkZWZpbmVkIGluIGEgc3VwZXJjbGFzcyBvZiAnI3tjbGFzc05hbWV9Jy4iLAogICAgICBleGFtcGxlczogY29uc3QgWwogICAgICAgIHIiIiIKICAgICAgICBjbGFzcyBBIHt9CiAgICAgICAgY2xhc3MgQiBleHRlbmRzIEEgewogICAgICAgICAgZm9vKCkgeyBzdXBlci54ID0gNDk5OyB9CiAgICAgICAgfQogICAgICAgIG1haW4oKSB7IG5ldyBCKCkuZm9vKCk7IH0KICAgICAgICAiIiIsCiAgICAgIF0pLCAvLyBHZW5lcmF0ZWQuIERvbid0IGVkaXQuCiAgTWVzc2FnZUtpbmQuVU5ERUZJTkVEX1NUQVRJQ19HRVRURVJfQlVUX1NFVFRFUjogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICBNZXNzYWdlS2luZC5VTkRFRklORURfU1RBVElDX0dFVFRFUl9CVVRfU0VUVEVSLAogICAgICAiQ2Fubm90IHJlc29sdmUgZ2V0dGVyICcje25hbWV9Jy4iLAogICAgICBleGFtcGxlczogY29uc3QgWwogICAgICAgICJzZXQgZm9vKHgpIHt9ICBtYWluKCkgeyBmb287IH0iLAogICAgICBdKSwgLy8gR2VuZXJhdGVkLiBEb24ndCBlZGl0LgogIE1lc3NhZ2VLaW5kLlVOREVGSU5FRF9TVEFUSUNfU0VUVEVSX0JVVF9HRVRURVI6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgTWVzc2FnZUtpbmQuVU5ERUZJTkVEX1NUQVRJQ19TRVRURVJfQlVUX0dFVFRFUiwKICAgICAgIkNhbm5vdCByZXNvbHZlIHNldHRlciAnI3tuYW1lfScuIiwKICAgICAgZXhhbXBsZXM6IGNvbnN0IFsKICAgICAgICByIiIiCiAgICAgICAgbWFpbigpIHsKICAgICAgICAgIGZpbmFsIHggPSAxOwogICAgICAgICAgeCA9IDI7CiAgICAgICAgfSIiIiwKICAgICAgICByIiIiCiAgICAgICAgbWFpbigpIHsKICAgICAgICAgIGNvbnN0IHggPSAxOwogICAgICAgICAgeCA9IDI7CiAgICAgICAgfQogICAgICAgICIiIiwKICAgICAgICByIiIiCiAgICAgICAgZmluYWwgeCA9IDE7CiAgICAgICAgbWFpbigpIHsgeCA9IDM7IH0KICAgICAgICAiIiIsCiAgICAgICAgciIiIgogICAgICAgIGNvbnN0IHggPSAxOwogICAgICAgIG1haW4oKSB7IHggPSAzOyB9CiAgICAgICAgIiIiLAogICAgICAgICJnZXQgZm9vID0+IG51bGwgIG1haW4oKSB7IGZvbyA9IDU7IH0iLAogICAgICAgICJjb25zdCBmb28gPSAwICBtYWluKCkgeyBmb28gPSA1OyB9IiwKICAgICAgXSksIC8vIEdlbmVyYXRlZC4gRG9uJ3QgZWRpdC4KfTsKgNsATk48AyNNAUxQMwM9ATQqQi8uQRgNExgLASAkTk4QaRgNEyALASAkOicxLxgkIyEjJiQmIyEjJiQmJEIvMRBSGB0iICIkQzAwMRg2JEIvK0Y8KTEQWxgfJEc0KxBPGA0SEBYMCgEfJDonXBBrGA0jGQ0NIhkNJFBUOyhpGA0RKCQKDSRQPTckURgNEhsKIg0kNyRRGCwmJEs4WRg5JDkmUxguJDckURgyJDsoZT0qVhgNExwjCiINJEk2KhgqJEk2KhgNERcRDg0RFxEKDQ0VGg0NFRoNMC4kAwE/cGFja2FnZTpjb21waWxlci9zcmMvZGlhZ25vc3RpY3MvZ2VuZXJhdGVkL3NoYXJlZF9tZXNzYWdlcy5kYXJ0OHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2NvbnN0YW50cy9leHByZXNzaW9ucy5kYXJ0wAEnDS8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuY29uc3RhbnRzLmV4cHJlc3Npb25zOwoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOwoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy9jb25zdGFudF9zeXN0ZW0uZGFydCcgYXMgY29uc3RhbnRfc3lzdGVtOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL29wZXJhdG9ycy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jYWxsX3N0cnVjdHVyZS5kYXJ0JyBzaG93IENhbGxTdHJ1Y3R1cmU7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnOwppbXBvcnQgJ2NvbnN0cnVjdG9ycy5kYXJ0JzsKaW1wb3J0ICdldmFsdWF0aW9uLmRhcnQnOwppbXBvcnQgJ3ZhbHVlcy5kYXJ0JzsKCmVudW0gQ29uc3RhbnRFeHByZXNzaW9uS2luZCB7CiAgQVMsCiAgQklOQVJZLAogIEJPT0wsCiAgQk9PTF9GUk9NX0VOVklST05NRU5ULAogIENPTkNBVEVOQVRFLAogIENPTkRJVElPTkFMLAogIENPTlNUUlVDVEVELAogIERPVUJMRSwKICBFUlJPTkVPVVMsCiAgRlVOQ1RJT04sCiAgRklFTEQsCiAgSURFTlRJQ0FMLAogIElOVCwKICBJTlRfRlJPTV9FTlZJUk9OTUVOVCwKICBMSVNULAogIFNFVCwKICBNQVAsCiAgTlVMTCwKICBTVFJJTkcsCiAgU1RSSU5HX0ZST01fRU5WSVJPTk1FTlQsCiAgU1RSSU5HX0xFTkdUSCwKICBTWU1CT0wsCiAgVFlQRSwKICBVTkFSWSwKICBMT0NBTF9WQVJJQUJMRSwKICBQT1NJVElPTkFMX1JFRkVSRU5DRSwKICBOQU1FRF9SRUZFUkVOQ0UsCiAgQVNTRVJULAogIElOU1RBTlRJQVRJT04sCn0KCi8vLyBBbiBleHByZXNzaW9uIHRoYXQgaXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuCi8vLwovLy8gV2hlcmVhcyBbQ29uc3RhbnRWYWx1ZV0gcmVwcmVzZW50IGEgY29tcGlsZS10aW1lIHZhbHVlLCBhCi8vLyBbQ29uc3RhbnRFeHByZXNzaW9uXSByZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gZm9yIGNyZWF0aW5nIGEgY29uc3RhbnQuCi8vLwovLy8gVGhlcmUgaXMgbm8gb25lLXRvLW9uZSBtYXBwaW5nIGJldHdlZW4gW0NvbnN0YW50RXhwcmVzc2lvbl0gYW5kCi8vLyBbQ29uc3RhbnRWYWx1ZV0sIGJlY2F1c2UgZGlmZmVyZW50IGV4cHJlc3Npb25zIGNhbiBkZW5vdGUgdGhlIHNhbWUgY29uc3RhbnQuCi8vLyBGb3IgaW5zdGFuY2UsIG11bHRpcGxlIGBjb25zdGAgY29uc3RydWN0b3JzIG1heSBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgc2FtZQovLy8gb2JqZWN0LCBhbmQgZGlmZmVyZW50IGBjb25zdGAgdmFyaWFibGVzIG1heSBob2xkIHRoZSBzYW1lIHZhbHVlLgphYnN0cmFjdCBjbGFzcyBDb25zdGFudEV4cHJlc3Npb24gewogIGludCBfaGFzaENvZGU7CgogIENvbnN0YW50RXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQ7CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVuaWZ5IHByZWNlZGVuY2UgaGFuZGxlZCBiZXR3ZWVuIGNvbnN0YW50cywgZnJvbnQtZW5kCiAgLy8gYW5kIGJhY2stZW5kLgogIGludCBnZXQgcHJlY2VkZW5jZSA9PiAxNjsKCiAgYWNjZXB0KENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvciwgW2NvbnRleHRdKTsKCiAgLy8vIFN1YnN0aXR1dGUgZnJlZSB2YXJpYWJsZXMgdXNpbmcgYXJndW1lbnRzLgogIENvbnN0YW50RXhwcmVzc2lvbiBhcHBseShOb3JtYWxpemVkQXJndW1lbnRzIGFyZ3VtZW50cykgPT4gdGhpczsKCiAgLy8vIENvbXB1dGUgdGhlIFtDb25zdGFudFZhbHVlXSBmb3IgdGhpcyBleHByZXNzaW9uIHVzaW5nIHRoZSBbZW52aXJvbm1lbnRdLgogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KTsKCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBjb25zdGFudCBleHByZXNzaW9uLCBpZiBpdCBpcyBpbmRlcGVuZGVudCBvZiB0aGUKICAvLy8gZW52aXJvbm1lbnQgdmFsdWVzLgogIERhcnRUeXBlIGdldEtub3duVHlwZShDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cykgPT4gbnVsbDsKCiAgLy8vIFJldHVybnMgYSB0ZXh0IHN0cmluZyByZXNlbWJsaW5nIHRoZSBEYXJ0IGNvZGUgY3JlYXRpbmcgdGhpcyBjb25zdGFudC4KICBTdHJpbmcgdG9EYXJ0VGV4dCgpIHsKICAgIENvbnN0RXhwUHJpbnRlciBwcmludGVyID0gbmV3IENvbnN0RXhwUHJpbnRlcigpOwogICAgYWNjZXB0KHByaW50ZXIpOwogICAgcmV0dXJuIHByaW50ZXIudG9TdHJpbmcoKTsKICB9CgogIC8vLyBSZXR1cm5zIGEgdGV4dCBzdHJpbmcgc2hvd2luZyB0aGUgc3RydWN0dXJlIG9mIHRoaXMgY29uc3RhbnQuCiAgU3RyaW5nIHRvU3RydWN0dXJlZFRleHQoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBfY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQoKICAvLy8gV3JpdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvbnN0YW50IGludG8gW3NiXS4KICB2b2lkIF9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChTdHJpbmdCdWZmZXIgc2IpOwoKICBpbnQgX2NvbXB1dGVIYXNoQ29kZSgpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IF9oYXNoQ29kZSA/Pz0gX2NvbXB1dGVIYXNoQ29kZSgpOwoKICBib29sIF9lcXVhbHMoY292YXJpYW50IENvbnN0YW50RXhwcmVzc2lvbiBvdGhlcik7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgQ29uc3RhbnRFeHByZXNzaW9uKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoa2luZCAhPSBvdGhlci5raW5kKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoaGFzaENvZGUgIT0gb3RoZXIuaGFzaENvZGUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBfZXF1YWxzKG90aGVyKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIGFzc2VydERlYnVnTW9kZSgnVXNlIENvbnN0YW50RXhwcmVzc2lvbi50b0RhcnRUZXh0KCkgb3IgJwogICAgICAgICdDb25zdGFudEV4cHJlc3Npb24udG9TdHJ1Y3R1cmVkVGV4dCgpIGluc3RlYWQgb2YgJwogICAgICAgICdDb25zdGFudEV4cHJlc3Npb24udG9TdHJpbmcoKScpOwogICAgcmV0dXJuIHRvRGFydFRleHQoKTsKICB9CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGV4cHJlc3Npb24gaXMgaW1wbGljaXRseSBjb25zdGFudCwgdGhhdCBpcywgdGhhdAogIC8vLyBpdCBkb2Vzbid0IGRlY2xhcmUgaXRzIGNvbnN0bmVzcyB3aXRoIHRoZSAnY29uc3QnIGtleXdvcmQuCiAgLy8vCiAgLy8vIEltcGxpY2l0IGNvbnN0YW50cyBhcmUgc2ltcGxlIGxpdGVyYWxzLCBsaWtlIGJvb2wsIGludCBhbmQgc3RyaW5nCiAgLy8vIGxpdGVyYWxzLCBjb25zdGFudCByZWZlcmVuY2VzIGFuZCBjb21wb3NpdGlvbnMgb2YgaW1wbGljaXQgY29uc3RhbnRzLgogIC8vLyBFeHBsaWNpdCBjb25zdGFudHMgYXJlIGNvbnN0cnVjdG9yIGNvbnN0YW50cywgYW5kIGNvbnN0YW50IG1hcCBhbmQgbGlzdAogIC8vLyBsaXRlcmFscy4KICBib29sIGdldCBpc0ltcGxpY2l0ID0+IHRydWU7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGV4cHJlc3Npb24gaXMgb25seSBwb3RlbnRpYWxseSBjb25zdGFudCwgdGhhdCBpcywKICAvLy8gaWYgaXQgY29udGFpbnMgcG9zaXRpb25hbCBvciBuYW1lZCByZWZlcmVuY2VzLCB1c2VkIHRvIGRlZmluZSBjb25zdGFudAogIC8vLyBjb25zdHJ1Y3RvcnMuCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWF5YmUgbWFrZSB0aGlzIGZpbmFsIGlmIHdlIHVzZSBpdCBvdXRzaWRlIGFzc2VydGlvbnMuCiAgYm9vbCBnZXQgaXNQb3RlbnRpYWwgPT4gZmFsc2U7Cn0KCi8vLyBBIHN5bnRoZXRpYyBjb25zdGFudCB1c2VkIHRvIHJlY292ZXIgZnJvbSBlcnJvcnMuCmNsYXNzIEVycm9uZW91c0NvbnN0YW50RXhwcmVzc2lvbiBleHRlbmRzIENvbnN0YW50RXhwcmVzc2lvbiB7CiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBDb25zdGFudEV4cHJlc3Npb25LaW5kLkVSUk9ORU9VUzsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvciwgW2NvbnRleHRdKSB7CiAgICAvLyBEbyBub3RoaW5nLiBUaGlzIGlzIGFuIGVycm9yLgogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSBub24tY29uc3RhbnQgdmFsdWVzIGZvciBlcnJvcnMuCiAgICByZXR1cm4gbmV3IE5vbkNvbnN0YW50VmFsdWUoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KFN0cmluZ0J1ZmZlciBzYikgewogICAgc2Iud3JpdGUoJ0Vycm9uZW91cygpJyk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgX2NvbXB1dGVIYXNoQ29kZSgpID0+IDEzOwoKICBAb3ZlcnJpZGUKICBib29sIF9lcXVhbHMoRXJyb25lb3VzQ29uc3RhbnRFeHByZXNzaW9uIG90aGVyKSA9PiB0cnVlOwp9CgovLy8gQm9vbGVhbiBsaXRlcmFsIGNvbnN0YW50LgpjbGFzcyBCb29sQ29uc3RhbnRFeHByZXNzaW9uIGV4dGVuZHMgQ29uc3RhbnRFeHByZXNzaW9uIHsKICBmaW5hbCBib29sIGJvb2xWYWx1ZTsKCiAgQm9vbENvbnN0YW50RXhwcmVzc2lvbih0aGlzLmJvb2xWYWx1ZSk7CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgPT4gQ29uc3RhbnRFeHByZXNzaW9uS2luZC5CT09MOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yLCBbY29udGV4dF0pIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0Qm9vbCh0aGlzLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KFN0cmluZ0J1ZmZlciBzYikgewogICAgc2Iud3JpdGUoJ0Jvb2wodmFsdWU9JHtib29sVmFsdWV9KScpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0uY3JlYXRlQm9vbChib29sVmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IF9jb21wdXRlSGFzaENvZGUoKSA9PiAxMyAqIGJvb2xWYWx1ZS5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBfZXF1YWxzKEJvb2xDb25zdGFudEV4cHJlc3Npb24gb3RoZXIpIHsKICAgIHJldHVybiBib29sVmFsdWUgPT0gb3RoZXIuYm9vbFZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXRLbm93blR5cGUoQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpID0+CiAgICAgIGNvbW1vbkVsZW1lbnRzLmJvb2xUeXBlOwp9CgovLy8gSW50ZWdlciBsaXRlcmFsIGNvbnN0YW50LgpjbGFzcyBJbnRDb25zdGFudEV4cHJlc3Npb24gZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb24gewogIGZpbmFsIEJpZ0ludCBpbnRWYWx1ZTsKCiAgSW50Q29uc3RhbnRFeHByZXNzaW9uKHRoaXMuaW50VmFsdWUpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IENvbnN0YW50RXhwcmVzc2lvbktpbmQuSU5UOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yLCBbY29udGV4dF0pIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0SW50KHRoaXMsIGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfY3JlYXRlU3RydWN0dXJlZFRleHQoU3RyaW5nQnVmZmVyIHNiKSB7CiAgICBzYi53cml0ZSgnSW50KHZhbHVlPSR7aW50VmFsdWV9KScpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0uY3JlYXRlSW50KGludFZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIGludCBfY29tcHV0ZUhhc2hDb2RlKCkgPT4gMTcgKiBpbnRWYWx1ZS5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBfZXF1YWxzKEludENvbnN0YW50RXhwcmVzc2lvbiBvdGhlcikgewogICAgcmV0dXJuIGludFZhbHVlID09IG90aGVyLmludFZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXRLbm93blR5cGUoQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpID0+CiAgICAgIGNvbW1vbkVsZW1lbnRzLmludFR5cGU7Cn0KCi8vLyBEb3VibGUgbGl0ZXJhbCBjb25zdGFudC4KY2xhc3MgRG91YmxlQ29uc3RhbnRFeHByZXNzaW9uIGV4dGVuZHMgQ29uc3RhbnRFeHByZXNzaW9uIHsKICBmaW5hbCBkb3VibGUgZG91YmxlVmFsdWU7CgogIERvdWJsZUNvbnN0YW50RXhwcmVzc2lvbih0aGlzLmRvdWJsZVZhbHVlKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBDb25zdGFudEV4cHJlc3Npb25LaW5kLkRPVUJMRTsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvciwgW2NvbnRleHRdKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdERvdWJsZSh0aGlzLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KFN0cmluZ0J1ZmZlciBzYikgewogICAgc2Iud3JpdGUoJ0RvdWJsZSh2YWx1ZT0ke2RvdWJsZVZhbHVlfSknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZURvdWJsZShkb3VibGVWYWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgX2NvbXB1dGVIYXNoQ29kZSgpID0+IDE5ICogZG91YmxlVmFsdWUuaGFzaENvZGU7CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhEb3VibGVDb25zdGFudEV4cHJlc3Npb24gb3RoZXIpIHsKICAgIHJldHVybiBkb3VibGVWYWx1ZSA9PSBvdGhlci5kb3VibGVWYWx1ZTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0S25vd25UeXBlKENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzKSA9PgogICAgICBjb21tb25FbGVtZW50cy5kb3VibGVUeXBlOwp9CgovLy8gU3RyaW5nIGxpdGVyYWwgY29uc3RhbnQuCmNsYXNzIFN0cmluZ0NvbnN0YW50RXhwcmVzc2lvbiBleHRlbmRzIENvbnN0YW50RXhwcmVzc2lvbiB7CiAgZmluYWwgU3RyaW5nIHN0cmluZ1ZhbHVlOwoKICBTdHJpbmdDb25zdGFudEV4cHJlc3Npb24odGhpcy5zdHJpbmdWYWx1ZSk7CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgPT4gQ29uc3RhbnRFeHByZXNzaW9uS2luZC5TVFJJTkc7CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IsIFtjb250ZXh0XSkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRTdHJpbmcodGhpcywgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChTdHJpbmdCdWZmZXIgc2IpIHsKICAgIHNiLndyaXRlKCdTdHJpbmcodmFsdWU9JHtzdHJpbmdWYWx1ZX0pJyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGV2YWx1YXRlKEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewogICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5jcmVhdGVTdHJpbmcoc3RyaW5nVmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IF9jb21wdXRlSGFzaENvZGUoKSA9PiAyMyAqIHN0cmluZ1ZhbHVlLmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIF9lcXVhbHMoU3RyaW5nQ29uc3RhbnRFeHByZXNzaW9uIG90aGVyKSB7CiAgICByZXR1cm4gc3RyaW5nVmFsdWUgPT0gb3RoZXIuc3RyaW5nVmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldEtub3duVHlwZShDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cykgPT4KICAgICAgY29tbW9uRWxlbWVudHMuc3RyaW5nVHlwZTsKfQoKLy8vIE51bGwgbGl0ZXJhbCBjb25zdGFudC4KY2xhc3MgTnVsbENvbnN0YW50RXhwcmVzc2lvbiBleHRlbmRzIENvbnN0YW50RXhwcmVzc2lvbiB7CiAgTnVsbENvbnN0YW50RXhwcmVzc2lvbigpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IENvbnN0YW50RXhwcmVzc2lvbktpbmQuTlVMTDsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvciwgW2NvbnRleHRdKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdE51bGwodGhpcywgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChTdHJpbmdCdWZmZXIgc2IpIHsKICAgIHNiLndyaXRlKCdOdWxsKCknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZU51bGwoKTsKICB9CgogIEBvdmVycmlkZQogIGludCBfY29tcHV0ZUhhc2hDb2RlKCkgPT4gMjk7CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhOdWxsQ29uc3RhbnRFeHByZXNzaW9uIG90aGVyKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldEtub3duVHlwZShDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cykgPT4KICAgICAgY29tbW9uRWxlbWVudHMubnVsbFR5cGU7Cn0KCi8vLyBMaXRlcmFsIGxpc3QgY29uc3RhbnQuCmNsYXNzIExpc3RDb25zdGFudEV4cHJlc3Npb24gZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb24gewogIGZpbmFsIEludGVyZmFjZVR5cGUgdHlwZTsKICBmaW5hbCBMaXN0PENvbnN0YW50RXhwcmVzc2lvbj4gdmFsdWVzOwoKICBMaXN0Q29uc3RhbnRFeHByZXNzaW9uKHRoaXMudHlwZSwgdGhpcy52YWx1ZXMpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IENvbnN0YW50RXhwcmVzc2lvbktpbmQuTElTVDsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvciwgW2NvbnRleHRdKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdExpc3QodGhpcywgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChTdHJpbmdCdWZmZXIgc2IpIHsKICAgIHNiLndyaXRlKCdMaXN0KHR5cGU9JHR5cGUsdmFsdWVzPVsnKTsKICAgIFN0cmluZyBkZWxpbWl0ZXIgPSAnJzsKICAgIGZvciAoQ29uc3RhbnRFeHByZXNzaW9uIHZhbHVlIGluIHZhbHVlcykgewogICAgICBzYi53cml0ZShkZWxpbWl0ZXIpOwogICAgICB2YWx1ZS5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgICBkZWxpbWl0ZXIgPSAnLCc7CiAgICB9CiAgICBzYi53cml0ZSgnXSknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZUxpc3QoCiAgICAgICAgdHlwZSwgdmFsdWVzLm1hcCgodikgPT4gdi5ldmFsdWF0ZShlbnZpcm9ubWVudCkpLnRvTGlzdCgpKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiBhcHBseShOb3JtYWxpemVkQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIG5ldyBMaXN0Q29uc3RhbnRFeHByZXNzaW9uKAogICAgICAgIHR5cGUsIHZhbHVlcy5tYXAoKHYpID0+IHYuYXBwbHkoYXJndW1lbnRzKSkudG9MaXN0KCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IF9jb21wdXRlSGFzaENvZGUoKSB7CiAgICBpbnQgaGFzaENvZGUgPSAxMyAqIHR5cGUuaGFzaENvZGUgKyAxNyAqIHZhbHVlcy5sZW5ndGg7CiAgICBmb3IgKENvbnN0YW50RXhwcmVzc2lvbiB2YWx1ZSBpbiB2YWx1ZXMpIHsKICAgICAgaGFzaENvZGUgXj0gMTkgKiB2YWx1ZS5oYXNoQ29kZTsKICAgIH0KICAgIHJldHVybiBoYXNoQ29kZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhMaXN0Q29uc3RhbnRFeHByZXNzaW9uIG90aGVyKSB7CiAgICBpZiAodHlwZSAhPSBvdGhlci50eXBlKSByZXR1cm4gZmFsc2U7CiAgICBpZiAodmFsdWVzLmxlbmd0aCAhPSBvdGhlci52YWx1ZXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICBpZiAodmFsdWVzW2ldICE9IG90aGVyLnZhbHVlc1tpXSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRLbm93blR5cGUoQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpID0+IHR5cGU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzSW1wbGljaXQgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUG90ZW50aWFsID0+IHZhbHVlcy5hbnkoKGUpID0+IGUuaXNQb3RlbnRpYWwpOwp9CgovLy8gTGl0ZXJhbCBzZXQgY29uc3RhbnQuCmNsYXNzIFNldENvbnN0YW50RXhwcmVzc2lvbiBleHRlbmRzIENvbnN0YW50RXhwcmVzc2lvbiB7CiAgZmluYWwgSW50ZXJmYWNlVHlwZSB0eXBlOwogIGZpbmFsIExpc3Q8Q29uc3RhbnRFeHByZXNzaW9uPiB2YWx1ZXM7CgogIFNldENvbnN0YW50RXhwcmVzc2lvbih0aGlzLnR5cGUsIHRoaXMudmFsdWVzKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBDb25zdGFudEV4cHJlc3Npb25LaW5kLlNFVDsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvciwgW2NvbnRleHRdKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFNldCh0aGlzLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiBhcHBseShOb3JtYWxpemVkQXJndW1lbnRzIGFyZ3VtZW50cykgPT4KICAgICAgbmV3IFNldENvbnN0YW50RXhwcmVzc2lvbigKICAgICAgICAgIHR5cGUsIHZhbHVlcy5tYXAoKHYpID0+IHYuYXBwbHkoYXJndW1lbnRzKSkudG9MaXN0KCkpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGV2YWx1YXRlKEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewogICAgLy8gVE9ETyhmaXNoeXRoZWZpc2gpOiBEZWxldGUgb25jZSB0aGUgQ0ZFIHByb3ZpZGVzIHRoZXNlIGVycm9yIG1lc3NhZ2VzLgogICAgU2V0PENvbnN0YW50VmFsdWU+IHNldCA9IG5ldyBMaW5rZWRIYXNoU2V0PENvbnN0YW50VmFsdWU+KCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICBDb25zdGFudFZhbHVlIHZhbHVlID0gdmFsdWVzW2ldLmV2YWx1YXRlKGVudmlyb25tZW50KTsKICAgICAgaWYgKCF2YWx1ZS5pc0NvbnN0YW50KSByZXR1cm4gbmV3IE5vbkNvbnN0YW50VmFsdWUoKTsKICAgICAgaWYgKCFzZXQuYWRkKHZhbHVlKSkgewogICAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKHZhbHVlc1tpXSwgTWVzc2FnZUtpbmQuRVFVQUxfU0VUX0VOVFJZLCB7fSk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZVNldCgKICAgICAgICBlbnZpcm9ubWVudC5jb21tb25FbGVtZW50cywgdHlwZSwgc2V0LnRvTGlzdCgpKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldEtub3duVHlwZShDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cykgPT4gdHlwZTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBfY3JlYXRlU3RydWN0dXJlZFRleHQoU3RyaW5nQnVmZmVyIHNiKSB7CiAgICBzYi53cml0ZSgnU2V0KHR5cGU9JHR5cGUsdmFsdWVzPVsnKTsKICAgIFN0cmluZyBkZWxpbWl0ZXIgPSAnJzsKICAgIGZvciAoQ29uc3RhbnRFeHByZXNzaW9uIHZhbHVlIGluIHZhbHVlcykgewogICAgICBzYi53cml0ZShkZWxpbWl0ZXIpOwogICAgICB2YWx1ZS5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgICBkZWxpbWl0ZXIgPSAnLCc7CiAgICB9CiAgICBzYi53cml0ZSgnXSknKTsKICB9CgogIEBvdmVycmlkZQogIGludCBfY29tcHV0ZUhhc2hDb2RlKCkgPT4gSGFzaGluZy5saXN0SGFzaCh2YWx1ZXMsIEhhc2hpbmcub2JqZWN0SGFzaCh0eXBlKSk7CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhTZXRDb25zdGFudEV4cHJlc3Npb24gb3RoZXIpIHsKICAgIGlmICh0eXBlICE9IG90aGVyLnR5cGUpIHJldHVybiBmYWxzZTsKICAgIGlmICh2YWx1ZXMubGVuZ3RoICE9IG90aGVyLnZhbHVlcy5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh2YWx1ZXNbaV0gIT0gb3RoZXIudmFsdWVzW2ldKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzSW1wbGljaXQgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUG90ZW50aWFsID0+IHZhbHVlcy5hbnkoKHYpID0+IHYuaXNQb3RlbnRpYWwpOwp9CgovLy8gTGl0ZXJhbCBtYXAgY29uc3RhbnQuCmNsYXNzIE1hcENvbnN0YW50RXhwcmVzc2lvbiBleHRlbmRzIENvbnN0YW50RXhwcmVzc2lvbiB7CiAgZmluYWwgSW50ZXJmYWNlVHlwZSB0eXBlOwogIGZpbmFsIExpc3Q8Q29uc3RhbnRFeHByZXNzaW9uPiBrZXlzOwogIGZpbmFsIExpc3Q8Q29uc3RhbnRFeHByZXNzaW9uPiB2YWx1ZXM7CgogIE1hcENvbnN0YW50RXhwcmVzc2lvbih0aGlzLnR5cGUsIHRoaXMua2V5cywgdGhpcy52YWx1ZXMpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IENvbnN0YW50RXhwcmVzc2lvbktpbmQuTUFQOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yLCBbY29udGV4dF0pIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TWFwKHRoaXMsIGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfY3JlYXRlU3RydWN0dXJlZFRleHQoU3RyaW5nQnVmZmVyIHNiKSB7CiAgICBzYi53cml0ZSgnTWFwKHR5cGU9JHR5cGUsZW50cmllcz1bJyk7CiAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwga2V5cy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgaWYgKGluZGV4ID4gMCkgewogICAgICAgIHNiLndyaXRlKCcsJyk7CiAgICAgIH0KICAgICAga2V5c1tpbmRleF0uX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KHNiKTsKICAgICAgc2Iud3JpdGUoJy0+Jyk7CiAgICAgIHZhbHVlc1tpbmRleF0uX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KHNiKTsKICAgIH0KICAgIHNiLndyaXRlKCddKScpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIC8vIFRPRE8oc2lnbXVuZCk6IGRlbGV0ZSBvbmNlIHRoZSBDRkUgcHJvdmlkZXMgdGhlc2UgZXJyb3IgbWVzc2FnZXMuCiAgICByZXR1cm4gZW52aXJvbm1lbnQuZXZhbHVhdGVNYXBCb2R5KCgpIHsKICAgICAgTWFwPENvbnN0YW50VmFsdWUsIENvbnN0YW50VmFsdWU+IG1hcCA9IDxDb25zdGFudFZhbHVlLCBDb25zdGFudFZhbHVlPnt9OwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBDb25zdGFudFZhbHVlIGtleSA9IGtleXNbaV0uZXZhbHVhdGUoZW52aXJvbm1lbnQpOwogICAgICAgIGlmICgha2V5LmlzQ29uc3RhbnQpIHsKICAgICAgICAgIHJldHVybiBuZXcgTm9uQ29uc3RhbnRWYWx1ZSgpOwogICAgICAgIH0KICAgICAgICBDb25zdGFudFZhbHVlIHZhbHVlID0gdmFsdWVzW2ldLmV2YWx1YXRlKGVudmlyb25tZW50KTsKICAgICAgICBpZiAoIXZhbHVlLmlzQ29uc3RhbnQpIHsKICAgICAgICAgIHJldHVybiBuZXcgTm9uQ29uc3RhbnRWYWx1ZSgpOwogICAgICAgIH0KICAgICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KGtleSkpIHsKICAgICAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKGtleXNbaV0sIE1lc3NhZ2VLaW5kLkVRVUFMX01BUF9FTlRSWV9LRVksIHt9KTsKICAgICAgICB9CiAgICAgICAgbWFwW2tleV0gPSB2YWx1ZTsKICAgICAgfQogICAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZU1hcChlbnZpcm9ubWVudC5jb21tb25FbGVtZW50cywgdHlwZSwKICAgICAgICAgIG1hcC5rZXlzLnRvTGlzdCgpLCBtYXAudmFsdWVzLnRvTGlzdCgpKTsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIGFwcGx5KE5vcm1hbGl6ZWRBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IE1hcENvbnN0YW50RXhwcmVzc2lvbigKICAgICAgICB0eXBlLAogICAgICAgIGtleXMubWFwKChrKSA9PiBrLmFwcGx5KGFyZ3VtZW50cykpLnRvTGlzdCgpLAogICAgICAgIHZhbHVlcy5tYXAoKHYpID0+IHYuYXBwbHkoYXJndW1lbnRzKSkudG9MaXN0KCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IF9jb21wdXRlSGFzaENvZGUoKSB7CiAgICBpbnQgaGFzaENvZGUgPSAxMyAqIHR5cGUuaGFzaENvZGUgKyAxNyAqIHZhbHVlcy5sZW5ndGg7CiAgICBmb3IgKENvbnN0YW50RXhwcmVzc2lvbiB2YWx1ZSBpbiB2YWx1ZXMpIHsKICAgICAgaGFzaENvZGUgXj0gMTkgKiB2YWx1ZS5oYXNoQ29kZTsKICAgIH0KICAgIHJldHVybiBoYXNoQ29kZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhNYXBDb25zdGFudEV4cHJlc3Npb24gb3RoZXIpIHsKICAgIGlmICh0eXBlICE9IG90aGVyLnR5cGUpIHJldHVybiBmYWxzZTsKICAgIGlmICh2YWx1ZXMubGVuZ3RoICE9IG90aGVyLnZhbHVlcy5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChrZXlzW2ldICE9IG90aGVyLmtleXNbaV0pIHJldHVybiBmYWxzZTsKICAgICAgaWYgKHZhbHVlc1tpXSAhPSBvdGhlci52YWx1ZXNbaV0pIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0S25vd25UeXBlKENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzKSA9PiB0eXBlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0ltcGxpY2l0ID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1BvdGVudGlhbCB7CiAgICByZXR1cm4ga2V5cy5hbnkoKGUpID0+IGUuaXNQb3RlbnRpYWwpIHx8IHZhbHVlcy5hbnkoKGUpID0+IGUuaXNQb3RlbnRpYWwpOwogIH0KfQoKLy8vIEludm9jYXRpb24gb2YgYSBjb25zdCBjb25zdHJ1Y3Rvci4KY2xhc3MgQ29uc3RydWN0ZWRDb25zdGFudEV4cHJlc3Npb24gZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb24gewogIGZpbmFsIEludGVyZmFjZVR5cGUgdHlwZTsKICBmaW5hbCBDb25zdHJ1Y3RvckVudGl0eSB0YXJnZXQ7CiAgZmluYWwgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlOwogIGZpbmFsIExpc3Q8Q29uc3RhbnRFeHByZXNzaW9uPiBhcmd1bWVudHM7CgogIENvbnN0cnVjdGVkQ29uc3RhbnRFeHByZXNzaW9uKAogICAgICB0aGlzLnR5cGUsIHRoaXMudGFyZ2V0LCB0aGlzLmNhbGxTdHJ1Y3R1cmUsIHRoaXMuYXJndW1lbnRzKSB7CiAgICBhc3NlcnQodHlwZS5lbGVtZW50ID09IHRhcmdldC5lbmNsb3NpbmdDbGFzcyk7CiAgICBhc3NlcnQoIWFyZ3VtZW50cy5jb250YWlucyhudWxsKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IENvbnN0YW50RXhwcmVzc2lvbktpbmQuQ09OU1RSVUNURUQ7CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IsIFtjb250ZXh0XSkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRDb25zdHJ1Y3RlZCh0aGlzLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KFN0cmluZ0J1ZmZlciBzYikgewogICAgc2Iud3JpdGUoJ0NvbnN0cnVjdGVkKHR5cGU9JHR5cGUsY29uc3RydWN0b3I9JHRhcmdldCwnCiAgICAgICAgJ2NhbGxTdHJ1Y3R1cmU9JGNhbGxTdHJ1Y3R1cmUsYXJndW1lbnRzPVsnKTsKICAgIFN0cmluZyBkZWxpbWl0ZXIgPSAnJzsKICAgIGZvciAoQ29uc3RhbnRFeHByZXNzaW9uIHZhbHVlIGluIGFyZ3VtZW50cykgewogICAgICBzYi53cml0ZShkZWxpbWl0ZXIpOwogICAgICB2YWx1ZS5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgICBkZWxpbWl0ZXIgPSAnLCc7CiAgICB9CiAgICBzYi53cml0ZSgnXSknKTsKICB9CgogIEluc3RhbmNlRGF0YSBjb21wdXRlSW5zdGFuY2VEYXRhKEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewogICAgQ29uc3RhbnRDb25zdHJ1Y3RvciBjb25zdGFudENvbnN0cnVjdG9yID0KICAgICAgICBlbnZpcm9ubWVudC5nZXRDb25zdHJ1Y3RvckNvbnN0YW50KHRhcmdldCk7CiAgICBhc3NlcnQoY29uc3RhbnRDb25zdHJ1Y3RvciAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KHRhcmdldCwgIk5vIGNvbnN0YW50IGNvbnN0cnVjdG9yIGNvbXB1dGVkIGZvciAkdGFyZ2V0LiIpKTsKICAgIHJldHVybiBjb25zdGFudENvbnN0cnVjdG9yLmNvbXB1dGVJbnN0YW5jZURhdGEoCiAgICAgICAgZW52aXJvbm1lbnQsIGFyZ3VtZW50cywgY2FsbFN0cnVjdHVyZSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGNvbXB1dGVJbnN0YW5jZVR5cGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICByZXR1cm4gZW52aXJvbm1lbnQKICAgICAgICAuZ2V0Q29uc3RydWN0b3JDb25zdGFudCh0YXJnZXQpCiAgICAgICAgLmNvbXB1dGVJbnN0YW5jZVR5cGUoZW52aXJvbm1lbnQsIHR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RydWN0ZWRDb25zdGFudEV4cHJlc3Npb24gYXBwbHkoTm9ybWFsaXplZEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBuZXcgQ29uc3RydWN0ZWRDb25zdGFudEV4cHJlc3Npb24odHlwZSwgdGFyZ2V0LCBjYWxsU3RydWN0dXJlLAogICAgICAgIHRoaXMuYXJndW1lbnRzLm1hcCgoYSkgPT4gYS5hcHBseShhcmd1bWVudHMpKS50b0xpc3QoKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGV2YWx1YXRlKEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewogICAgSW50ZXJmYWNlVHlwZSBpbnN0YW5jZVR5cGUgPSBjb21wdXRlSW5zdGFuY2VUeXBlKGVudmlyb25tZW50KTsKICAgIHJldHVybiBlbnZpcm9ubWVudC5ldmFsdWF0ZUNvbnN0cnVjdG9yKHRhcmdldCwgaW5zdGFuY2VUeXBlLCAoKSB7CiAgICAgIEluc3RhbmNlRGF0YSBpbnN0YW5jZURhdGEgPSBjb21wdXRlSW5zdGFuY2VEYXRhKGVudmlyb25tZW50KTsKICAgICAgaWYgKGluc3RhbmNlRGF0YSA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIG5ldyBOb25Db25zdGFudFZhbHVlKCk7CiAgICAgIH0KICAgICAgYm9vbCBpc1ZhbGlkQXNDb25zdGFudCA9IHRydWU7CiAgICAgIE1hcDxGaWVsZEVudGl0eSwgQ29uc3RhbnRWYWx1ZT4gZmllbGRWYWx1ZXMgPQogICAgICAgICAgPEZpZWxkRW50aXR5LCBDb25zdGFudFZhbHVlPnt9OwogICAgICBpbnN0YW5jZURhdGEuZmllbGRNYXAKICAgICAgICAgIC5mb3JFYWNoKChGaWVsZEVudGl0eSBmaWVsZCwgQ29uc3RhbnRFeHByZXNzaW9uIGNvbnN0YW50KSB7CiAgICAgICAgQ29uc3RhbnRWYWx1ZSB2YWx1ZSA9IGNvbnN0YW50LmV2YWx1YXRlKGVudmlyb25tZW50KTsKICAgICAgICBhc3NlcnQoCiAgICAgICAgICAgIHZhbHVlICE9IG51bGwsCiAgICAgICAgICAgIGZhaWxlZEF0KENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgICAgICAgICAiTm8gdmFsdWUgY29tcHV0ZWQgZm9yICR7Y29uc3RhbnQudG9TdHJ1Y3R1cmVkVGV4dCgpfS4iKSk7CiAgICAgICAgaWYgKHZhbHVlLmlzQ29uc3RhbnQpIHsKICAgICAgICAgIGZpZWxkVmFsdWVzW2ZpZWxkXSA9IHZhbHVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpc1ZhbGlkQXNDb25zdGFudCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGZvciAoQXNzZXJ0Q29uc3RhbnRFeHByZXNzaW9uIGFzc2VydGlvbiBpbiBpbnN0YW5jZURhdGEuYXNzZXJ0aW9ucykgewogICAgICAgIGlmICghYXNzZXJ0aW9uLmV2YWx1YXRlKGVudmlyb25tZW50KS5pc0NvbnN0YW50KSB7CiAgICAgICAgICBpc1ZhbGlkQXNDb25zdGFudCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaXNWYWxpZEFzQ29uc3RhbnQpIHsKICAgICAgICByZXR1cm4gbmV3IENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZShpbnN0YW5jZVR5cGUsIGZpZWxkVmFsdWVzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbmV3IE5vbkNvbnN0YW50VmFsdWUoKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgX2NvbXB1dGVIYXNoQ29kZSgpIHsKICAgIGludCBoYXNoQ29kZSA9CiAgICAgICAgMTMgKiB0eXBlLmhhc2hDb2RlICsgMTcgKiB0YXJnZXQuaGFzaENvZGUgKyAxOSAqIGNhbGxTdHJ1Y3R1cmUuaGFzaENvZGU7CiAgICBmb3IgKENvbnN0YW50RXhwcmVzc2lvbiB2YWx1ZSBpbiBhcmd1bWVudHMpIHsKICAgICAgaGFzaENvZGUgXj0gMjMgKiB2YWx1ZS5oYXNoQ29kZTsKICAgIH0KICAgIHJldHVybiBoYXNoQ29kZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhDb25zdHJ1Y3RlZENvbnN0YW50RXhwcmVzc2lvbiBvdGhlcikgewogICAgaWYgKHR5cGUgIT0gb3RoZXIudHlwZSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKHRhcmdldCAhPSBvdGhlci50YXJnZXQpIHJldHVybiBmYWxzZTsKICAgIGlmIChjYWxsU3RydWN0dXJlICE9IG90aGVyLmNhbGxTdHJ1Y3R1cmUpIHJldHVybiBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChhcmd1bWVudHNbaV0gIT0gb3RoZXIuYXJndW1lbnRzW2ldKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzSW1wbGljaXQgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUG90ZW50aWFsIHsKICAgIHJldHVybiBhcmd1bWVudHMuYW55KChlKSA9PiBlLmlzUG90ZW50aWFsKTsKICB9Cn0KCi8vLyBTdHJpbmcgbGl0ZXJhbCB3aXRoIGp1eHRhcG9zaXRpb24gYW5kL29yIGludGVycG9sYXRpb25zLgpjbGFzcyBDb25jYXRlbmF0ZUNvbnN0YW50RXhwcmVzc2lvbiBleHRlbmRzIENvbnN0YW50RXhwcmVzc2lvbiB7CiAgZmluYWwgTGlzdDxDb25zdGFudEV4cHJlc3Npb24+IGV4cHJlc3Npb25zOwoKICBDb25jYXRlbmF0ZUNvbnN0YW50RXhwcmVzc2lvbih0aGlzLmV4cHJlc3Npb25zKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBDb25zdGFudEV4cHJlc3Npb25LaW5kLkNPTkNBVEVOQVRFOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yLCBbY29udGV4dF0pIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0Q29uY2F0ZW5hdGUodGhpcywgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChTdHJpbmdCdWZmZXIgc2IpIHsKICAgIHNiLndyaXRlKCdDb25jYXRlbmF0ZShleHByZXNzaW9ucz1bJyk7CiAgICBTdHJpbmcgZGVsaW1pdGVyID0gJyc7CiAgICBmb3IgKENvbnN0YW50RXhwcmVzc2lvbiB2YWx1ZSBpbiBleHByZXNzaW9ucykgewogICAgICBzYi53cml0ZShkZWxpbWl0ZXIpOwogICAgICB2YWx1ZS5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgICBkZWxpbWl0ZXIgPSAnLCc7CiAgICB9CiAgICBzYi53cml0ZSgnXSknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiBhcHBseShOb3JtYWxpemVkQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIG5ldyBDb25jYXRlbmF0ZUNvbnN0YW50RXhwcmVzc2lvbigKICAgICAgICBleHByZXNzaW9ucy5tYXAoKGEpID0+IGEuYXBwbHkoYXJndW1lbnRzKSkudG9MaXN0KCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIGJvb2wgaXNWYWxpZCA9IHRydWU7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBmb3IgKENvbnN0YW50RXhwcmVzc2lvbiBleHByZXNzaW9uIGluIGV4cHJlc3Npb25zKSB7CiAgICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBleHByZXNzaW9uLmV2YWx1YXRlKGVudmlyb25tZW50KTsKICAgICAgaWYgKCF2YWx1ZS5pc0NvbnN0YW50KSB7CiAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgIC8vIFVzZSBgY29udGludWVgIGluc3RlYWQgb2YgYHJldHVybmAgaGVyZSB0byByZXBvcnQgYWxsIGVycm9ycyBpbiB0aGUKICAgICAgICAvLyBleHByZXNzaW9uIGFuZCBub3QganVzdCB0aGUgZmlyc3QuCiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKHZhbHVlLmlzUHJpbWl0aXZlKSB7CiAgICAgICAgaWYgKHZhbHVlIGlzIFN0cmluZ0NvbnN0YW50VmFsdWUpIHsKICAgICAgICAgIHNiLndyaXRlKHZhbHVlLnN0cmluZ1ZhbHVlKTsKICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGlzIEludENvbnN0YW50VmFsdWUpIHsKICAgICAgICAgIHNiLndyaXRlKHZhbHVlLmludFZhbHVlKTsKICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGlzIERvdWJsZUNvbnN0YW50VmFsdWUpIHsKICAgICAgICAgIHNiLndyaXRlKHZhbHVlLmRvdWJsZVZhbHVlKTsKICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGlzIEJvb2xDb25zdGFudFZhbHVlKSB7CiAgICAgICAgICBzYi53cml0ZSh2YWx1ZS5ib29sVmFsdWUpOwogICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaXMgTnVsbENvbnN0YW50VmFsdWUpIHsKICAgICAgICAgIHNiLndyaXRlKG51bGwpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBlbnZpcm9ubWVudC5yZXBvcnRFcnJvcigKICAgICAgICAgICAgZXhwcmVzc2lvbiwgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9JTlRFUlBPTEFUSU9OX1RZUEUsIHsKICAgICAgICAgICdjb25zdGFudCc6IGV4cHJlc3Npb24sCiAgICAgICAgICAndHlwZSc6IHZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpCiAgICAgICAgfSk7CiAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgIC8vIFVzZSBgY29udGludWVgIGluc3RlYWQgb2YgYHJldHVybmAgaGVyZSB0byByZXBvcnQgYWxsIGVycm9ycyBpbiB0aGUKICAgICAgICAvLyBleHByZXNzaW9uIGFuZCBub3QganVzdCB0aGUgZmlyc3QuCiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgIH0KICAgIGlmIChpc1ZhbGlkKSB7CiAgICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0uY3JlYXRlU3RyaW5nKHNiLnRvU3RyaW5nKCkpOwogICAgfQogICAgcmV0dXJuIG5ldyBOb25Db25zdGFudFZhbHVlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgX2NvbXB1dGVIYXNoQ29kZSgpIHsKICAgIGludCBoYXNoQ29kZSA9IDE3ICogZXhwcmVzc2lvbnMubGVuZ3RoOwogICAgZm9yIChDb25zdGFudEV4cHJlc3Npb24gdmFsdWUgaW4gZXhwcmVzc2lvbnMpIHsKICAgICAgaGFzaENvZGUgXj0gMTkgKiB2YWx1ZS5oYXNoQ29kZTsKICAgIH0KICAgIHJldHVybiBoYXNoQ29kZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhDb25jYXRlbmF0ZUNvbnN0YW50RXhwcmVzc2lvbiBvdGhlcikgewogICAgaWYgKGV4cHJlc3Npb25zLmxlbmd0aCAhPSBvdGhlci5leHByZXNzaW9ucy5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwcmVzc2lvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGV4cHJlc3Npb25zW2ldICE9IG90aGVyLmV4cHJlc3Npb25zW2ldKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0S25vd25UeXBlKENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzKSA9PgogICAgICBjb21tb25FbGVtZW50cy5zdHJpbmdUeXBlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1BvdGVudGlhbCB7CiAgICByZXR1cm4gZXhwcmVzc2lvbnMuYW55KChlKSA9PiBlLmlzUG90ZW50aWFsKTsKICB9Cn0KCi8vLyBTeW1ib2wgbGl0ZXJhbC4KY2xhc3MgU3ltYm9sQ29uc3RhbnRFeHByZXNzaW9uIGV4dGVuZHMgQ29uc3RhbnRFeHByZXNzaW9uIHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgU3ltYm9sQ29uc3RhbnRFeHByZXNzaW9uKHRoaXMubmFtZSk7CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgPT4gQ29uc3RhbnRFeHByZXNzaW9uS2luZC5TWU1CT0w7CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IsIFtjb250ZXh0XSkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRTeW1ib2wodGhpcywgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChTdHJpbmdCdWZmZXIgc2IpIHsKICAgIHNiLndyaXRlKCdTeW1ib2wobmFtZT0kbmFtZSknKTsKICB9CgogIEBvdmVycmlkZQogIGludCBfY29tcHV0ZUhhc2hDb2RlKCkgPT4gMTMgKiBuYW1lLmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIF9lcXVhbHMoU3ltYm9sQ29uc3RhbnRFeHByZXNzaW9uIG90aGVyKSB7CiAgICByZXR1cm4gbmFtZSA9PSBvdGhlci5uYW1lOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0uY3JlYXRlU3ltYm9sKGVudmlyb25tZW50LmNvbW1vbkVsZW1lbnRzLCBuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0S25vd25UeXBlKENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzKSA9PgogICAgICBjb21tb25FbGVtZW50cy5zeW1ib2xUeXBlOwp9CgovLy8gVHlwZSBsaXRlcmFsLgpjbGFzcyBUeXBlQ29uc3RhbnRFeHByZXNzaW9uIGV4dGVuZHMgQ29uc3RhbnRFeHByZXNzaW9uIHsKICAvLy8gRWl0aGVyIFtEeW5hbWljVHlwZV0gb3IgYSByYXcgW0dlbmVyaWNUeXBlXS4KICBmaW5hbCBEYXJ0VHlwZSB0eXBlOwogIGZpbmFsIFN0cmluZyBuYW1lOwoKICBUeXBlQ29uc3RhbnRFeHByZXNzaW9uKHRoaXMudHlwZSwgdGhpcy5uYW1lKSB7CiAgICBhc3NlcnQodHlwZS5pc0ludGVyZmFjZVR5cGUgfHwgdHlwZS5pc1R5cGVkZWYgfHwgdHlwZS5pc0R5bmFtaWMsCiAgICAgICAgIlVuZXhwZWN0ZWQgdHlwZSBjb25zdGFudCB0eXBlOiAkdHlwZSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBDb25zdGFudEV4cHJlc3Npb25LaW5kLlRZUEU7CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IsIFtjb250ZXh0XSkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRUeXBlKHRoaXMsIGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfY3JlYXRlU3RydWN0dXJlZFRleHQoU3RyaW5nQnVmZmVyIHNiKSB7CiAgICBzYi53cml0ZSgnVHlwZSh0eXBlPSR0eXBlKScpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0uY3JlYXRlVHlwZShlbnZpcm9ubWVudC5jb21tb25FbGVtZW50cywgdHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgX2NvbXB1dGVIYXNoQ29kZSgpID0+IDEzICogdHlwZS5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBfZXF1YWxzKFR5cGVDb25zdGFudEV4cHJlc3Npb24gb3RoZXIpIHsKICAgIHJldHVybiB0eXBlID09IG90aGVyLnR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldEtub3duVHlwZShDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cykgPT4KICAgICAgY29tbW9uRWxlbWVudHMudHlwZVR5cGU7Cn0KCi8vLyBDYXN0IGV4cHJlc3Npb25zOiB0aGVzZSBtYXkgYmUgZnJvbSBlaXRoZXIgZXhwbGljaXQgb3IgaW1wbGljaXQgYGFzYAovLy8gY2hlY2tzLgpjbGFzcyBBc0NvbnN0YW50RXhwcmVzc2lvbiBleHRlbmRzIENvbnN0YW50RXhwcmVzc2lvbiB7CiAgZmluYWwgQ29uc3RhbnRFeHByZXNzaW9uIGV4cHJlc3Npb247CiAgZmluYWwgRGFydFR5cGUgdHlwZTsKCiAgQXNDb25zdGFudEV4cHJlc3Npb24odGhpcy5leHByZXNzaW9uLCB0aGlzLnR5cGUpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IENvbnN0YW50RXhwcmVzc2lvbktpbmQuQVM7CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IsIFtjb250ZXh0XSkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRBcyh0aGlzLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KFN0cmluZ0J1ZmZlciBzYikgewogICAgc2Iud3JpdGUoJ0FzKHZhbHVlPScpOwogICAgZXhwcmVzc2lvbi5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgc2Iud3JpdGUoJyx0eXBlPSR0eXBlKScpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIC8vIFJ1bm5pbmcgZXhhbXBsZSBmb3IgY29tbWVudHM6CiAgICAvLwogICAgLy8gICAgIGNsYXNzIEE8VD4gewogICAgLy8gICAgICAgZmluYWwgVCB0OwogICAgLy8gICAgICAgY29uc3QgQShkeW5hbWljIHQpIDogdGhpcy50ID0gdDsgLy8gaW1wbGljaXRseSBgdCBhcyBBLlRgCiAgICAvLyAgICAgfQogICAgLy8gICAgIGNsYXNzIEI8Uz4gZXh0ZW5kcyBBPFM+IHsKICAgIC8vICAgICAgIGNvbnN0IEIoZHluYW1pYyBzKSA6IHN1cGVyKHMpOwogICAgLy8gICAgIH0KICAgIC8vICAgICBtYWluKCkgPT4gY29uc3QgQjxudW0+KDApOwogICAgLy8KICAgIC8vIFdlIHZpc2l0IGB0IGFzIEEuVGAgd2hpbGUgZXZhbHVhdGluZyBgY29uc3QgQjxudW0+KDApYC4KCiAgICAvLyBUaGUgZXhwcmVzc2lvbiB2YWx1ZSBpcyBgMGAuCiAgICBDb25zdGFudFZhbHVlIGV4cHJlc3Npb25WYWx1ZSA9IGV4cHJlc3Npb24uZXZhbHVhdGUoZW52aXJvbm1lbnQpOwoKICAgIGlmICghZW52aXJvbm1lbnQuY2hlY2tDYXN0cykgcmV0dXJuIGV4cHJlc3Npb25WYWx1ZTsKCiAgICAvLyBUaGUgZXhwcmVzc2lvbiB0eXBlIGlzIGBpbnRgLgogICAgRGFydFR5cGUgZXhwcmVzc2lvblR5cGUgPQogICAgICAgIGV4cHJlc3Npb25WYWx1ZS5nZXRUeXBlKGVudmlyb25tZW50LmNvbW1vbkVsZW1lbnRzKTsKCiAgICAvLyBUaGUgYGFzYCB0eXBlIGBBLlRgIGluIHRoZSBjb250ZXh0IG9mIGBCPG51bT5gIGlzIGBudW1gLgogICAgRGFydFR5cGUgdHlwZUluQ29udGV4dCA9IGVudmlyb25tZW50LmdldFR5cGVJbkNvbnRleHQodHlwZSk7CgogICAgLy8gQ2hlY2sgdGhhdCB0aGUgZXhwcmVzc2lvbiB0eXBlLCBgaW50YCwgaXMgYSBzdWJ0eXBlIG9mIHRoZSB0eXBlIGluCiAgICAvLyBjb250ZXh0LCBgbnVtYC4KICAgIGlmICghY29uc3RhbnRfc3lzdGVtLmlzU3VidHlwZSgKICAgICAgICBlbnZpcm9ubWVudC50eXBlcywgZXhwcmVzc2lvblR5cGUsIHR5cGVJbkNvbnRleHQpKSB7CiAgICAgIC8vIFRPRE8oc2lnbXVuZCk6IGNvbnNpZGVyIHJlcG9ydGluZyBkaWZmZXJlbnQgbWVzc2FnZXMgYW5kIGVycm9yCiAgICAgIC8vIGxvY2F0aW9ucyBmb3IgaW1wbGljaXQgdnMgZXhwbGljaXQgY2FzdHMuCiAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKGV4cHJlc3Npb24sIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQ0FTVCwKICAgICAgICAgIHsnY29uc3RhbnQnOiBleHByZXNzaW9uLCAndHlwZSc6IGV4cHJlc3Npb25UeXBlLCAnY2FzdFR5cGUnOiB0eXBlfSk7CiAgICAgIHJldHVybiBuZXcgTm9uQ29uc3RhbnRWYWx1ZSgpOwogICAgfQogICAgcmV0dXJuIGV4cHJlc3Npb25WYWx1ZTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiBhcHBseShOb3JtYWxpemVkQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIG5ldyBBc0NvbnN0YW50RXhwcmVzc2lvbihleHByZXNzaW9uLmFwcGx5KGFyZ3VtZW50cyksIHR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IF9jb21wdXRlSGFzaENvZGUoKSA9PiAxMyAqIHR5cGUuaGFzaENvZGUgKyAxNyAqIGV4cHJlc3Npb24uaGFzaENvZGU7CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhBc0NvbnN0YW50RXhwcmVzc2lvbiBvdGhlcikgewogICAgcmV0dXJuIGV4cHJlc3Npb24gPT0gb3RoZXIuZXhwcmVzc2lvbiAmJiB0eXBlID09IG90aGVyLnR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldEtub3duVHlwZShDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cykgPT4KICAgICAgZXhwcmVzc2lvbi5nZXRLbm93blR5cGUoY29tbW9uRWxlbWVudHMpOwp9CgovLy8gUmVmZXJlbmNlIHRvIGEgY29uc3RhbnQgdG9wLWxldmVsIG9yIHN0YXRpYyBmaWVsZC4KY2xhc3MgRmllbGRDb25zdGFudEV4cHJlc3Npb24gZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb24gewogIGZpbmFsIEZpZWxkRW50aXR5IGVsZW1lbnQ7CgogIEZpZWxkQ29uc3RhbnRFeHByZXNzaW9uKHRoaXMuZWxlbWVudCk7CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgPT4gQ29uc3RhbnRFeHByZXNzaW9uS2luZC5GSUVMRDsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvciwgW2NvbnRleHRdKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEZpZWxkKHRoaXMsIGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfY3JlYXRlU3RydWN0dXJlZFRleHQoU3RyaW5nQnVmZmVyIHNiKSB7CiAgICBzYi53cml0ZSgnRmllbGQoZWxlbWVudD0kZWxlbWVudCknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICByZXR1cm4gZW52aXJvbm1lbnQuZXZhbHVhdGVGaWVsZChlbGVtZW50LCAoKSB7CiAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBjb25zdGFudCA9IGVudmlyb25tZW50LmdldEZpZWxkQ29uc3RhbnQoZWxlbWVudCk7CiAgICAgIHJldHVybiBjb25zdGFudC5ldmFsdWF0ZShlbnZpcm9ubWVudCk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIGludCBfY29tcHV0ZUhhc2hDb2RlKCkgPT4gMTMgKiBlbGVtZW50Lmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIF9lcXVhbHMoRmllbGRDb25zdGFudEV4cHJlc3Npb24gb3RoZXIpIHsKICAgIHJldHVybiBlbGVtZW50ID09IG90aGVyLmVsZW1lbnQ7CiAgfQp9CgovLy8gUmVmZXJlbmNlIHRvIGEgY29uc3RhbnQgbG9jYWwgdmFyaWFibGUuCmNsYXNzIExvY2FsVmFyaWFibGVDb25zdGFudEV4cHJlc3Npb24gZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb24gewogIGZpbmFsIExvY2FsIGVsZW1lbnQ7CgogIExvY2FsVmFyaWFibGVDb25zdGFudEV4cHJlc3Npb24odGhpcy5lbGVtZW50KTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBDb25zdGFudEV4cHJlc3Npb25LaW5kLkxPQ0FMX1ZBUklBQkxFOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yLCBbY29udGV4dF0pIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TG9jYWxWYXJpYWJsZSh0aGlzLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KFN0cmluZ0J1ZmZlciBzYikgewogICAgc2Iud3JpdGUoJ0xvY2FsVmFyaWFibGUoZWxlbWVudD0kZWxlbWVudCknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICBDb25zdGFudEV4cHJlc3Npb24gY29uc3RhbnQgPSBlbnZpcm9ubWVudC5nZXRMb2NhbENvbnN0YW50KGVsZW1lbnQpOwogICAgcmV0dXJuIGNvbnN0YW50LmV2YWx1YXRlKGVudmlyb25tZW50KTsKICB9CgogIEBvdmVycmlkZQogIGludCBfY29tcHV0ZUhhc2hDb2RlKCkgPT4gMTMgKiBlbGVtZW50Lmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIF9lcXVhbHMoTG9jYWxWYXJpYWJsZUNvbnN0YW50RXhwcmVzc2lvbiBvdGhlcikgewogICAgcmV0dXJuIGVsZW1lbnQgPT0gb3RoZXIuZWxlbWVudDsKICB9Cn0KCi8vLyBSZWZlcmVuY2UgdG8gYSB0b3AtbGV2ZWwgb3Igc3RhdGljIGZ1bmN0aW9uLgpjbGFzcyBGdW5jdGlvbkNvbnN0YW50RXhwcmVzc2lvbiBleHRlbmRzIENvbnN0YW50RXhwcmVzc2lvbiB7CiAgZmluYWwgRnVuY3Rpb25FbnRpdHkgZWxlbWVudDsKICBmaW5hbCBGdW5jdGlvblR5cGUgdHlwZTsKCiAgRnVuY3Rpb25Db25zdGFudEV4cHJlc3Npb24odGhpcy5lbGVtZW50LCB0aGlzLnR5cGUpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IENvbnN0YW50RXhwcmVzc2lvbktpbmQuRlVOQ1RJT047CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IsIFtjb250ZXh0XSkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRGdW5jdGlvbih0aGlzLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KFN0cmluZ0J1ZmZlciBzYikgewogICAgc2Iud3JpdGUoJ0Z1bmN0aW9uKGVsZW1lbnQ9JGVsZW1lbnQpJyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGV2YWx1YXRlKEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewogICAgcmV0dXJuIG5ldyBGdW5jdGlvbkNvbnN0YW50VmFsdWUoZWxlbWVudCwgdHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgX2NvbXB1dGVIYXNoQ29kZSgpID0+IDEzICogZWxlbWVudC5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBfZXF1YWxzKEZ1bmN0aW9uQ29uc3RhbnRFeHByZXNzaW9uIG90aGVyKSB7CiAgICByZXR1cm4gZWxlbWVudCA9PSBvdGhlci5lbGVtZW50OwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXRLbm93blR5cGUoQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpID0+CiAgICAgIGNvbW1vbkVsZW1lbnRzLmZ1bmN0aW9uVHlwZTsKfQoKLy8vIEEgY29uc3RhbnQgYmluYXJ5IGV4cHJlc3Npb24gbGlrZSBgYSAqIGJgLgpjbGFzcyBCaW5hcnlDb25zdGFudEV4cHJlc3Npb24gZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb24gewogIGZpbmFsIENvbnN0YW50RXhwcmVzc2lvbiBsZWZ0OwogIGZpbmFsIEJpbmFyeU9wZXJhdG9yIG9wZXJhdG9yOwogIGZpbmFsIENvbnN0YW50RXhwcmVzc2lvbiByaWdodDsKCiAgQmluYXJ5Q29uc3RhbnRFeHByZXNzaW9uKHRoaXMubGVmdCwgdGhpcy5vcGVyYXRvciwgdGhpcy5yaWdodCkgewogICAgYXNzZXJ0KFBSRUNFREVOQ0VfTUFQW29wZXJhdG9yLmtpbmRdICE9IG51bGwsCiAgICAgICAgIk1pc3NpbmcgcHJlY2VuZGVuY2UgZm9yIGJpbmFyeSBvcGVyYXRvcjogJyRvcGVyYXRvcicuIik7CiAgfQoKICBzdGF0aWMgYm9vbCBwb3RlbnRpYWxPcGVyYXRvcihCaW5hcnlPcGVyYXRvciBvcGVyYXRvcikgPT4KICAgICAgUFJFQ0VERU5DRV9NQVBbb3BlcmF0b3Iua2luZF0gIT0gbnVsbDsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBDb25zdGFudEV4cHJlc3Npb25LaW5kLkJJTkFSWTsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvciwgW2NvbnRleHRdKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEJpbmFyeSh0aGlzLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KFN0cmluZ0J1ZmZlciBzYikgewogICAgc2Iud3JpdGUoJ0JpbmFyeShsZWZ0PScpOwogICAgbGVmdC5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgc2Iud3JpdGUoJyxvcD0kb3BlcmF0b3IscmlnaHQ9Jyk7CiAgICByaWdodC5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgc2Iud3JpdGUoJyknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICBDb25zdGFudFZhbHVlIGxlZnRWYWx1ZSA9IGxlZnQuZXZhbHVhdGUoZW52aXJvbm1lbnQpOwogICAgaWYgKCFsZWZ0VmFsdWUuaXNDb25zdGFudCkgcmV0dXJuIG5ldyBOb25Db25zdGFudFZhbHVlKCk7CiAgICBDb25zdGFudFZhbHVlIHJpZ2h0VmFsdWU7CiAgICAvLyBTaG9ydC1jaXJjdWl0ICYmIGFuZCB8fCBvcGVyYXRvcnMuCiAgICBzd2l0Y2ggKG9wZXJhdG9yLmtpbmQpIHsKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuTE9HSUNBTF9BTkQ6CiAgICAgICAgaWYgKGxlZnRWYWx1ZS5pc0Jvb2wgJiYgbGVmdFZhbHVlLmlzRmFsc2UpIHsKICAgICAgICAgIHJpZ2h0VmFsdWUgPSBuZXcgRmFsc2VDb25zdGFudFZhbHVlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJpZ2h0VmFsdWUgPSByaWdodC5ldmFsdWF0ZShlbnZpcm9ubWVudCk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuTE9HSUNBTF9PUjoKICAgICAgICBpZiAobGVmdFZhbHVlLmlzQm9vbCAmJiBsZWZ0VmFsdWUuaXNUcnVlKSB7CiAgICAgICAgICByaWdodFZhbHVlID0gbmV3IFRydWVDb25zdGFudFZhbHVlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJpZ2h0VmFsdWUgPSByaWdodC5ldmFsdWF0ZShlbnZpcm9ubWVudCk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHJpZ2h0VmFsdWUgPSByaWdodC5ldmFsdWF0ZShlbnZpcm9ubWVudCk7CiAgICB9CgogICAgaWYgKCFyaWdodFZhbHVlLmlzQ29uc3RhbnQpIHJldHVybiBuZXcgTm9uQ29uc3RhbnRWYWx1ZSgpOwogICAgYm9vbCBpc1ZhbGlkID0gdHJ1ZTsKICAgIHN3aXRjaCAob3BlcmF0b3Iua2luZCkgewogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5FUToKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuTk9UX0VROgogICAgICAgIGlmICghbGVmdFZhbHVlLmlzUHJpbWl0aXZlKSB7CiAgICAgICAgICBpZiAoIXJpZ2h0VmFsdWUuaXNOdWxsKSB7CiAgICAgICAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKAogICAgICAgICAgICAgICAgbGVmdCwgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9CSU5BUllfUFJJTUlUSVZFX1RZUEUsIHsKICAgICAgICAgICAgICAnY29uc3RhbnQnOiBsZWZ0LAogICAgICAgICAgICAgICd0eXBlJzogbGVmdFZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpLAogICAgICAgICAgICAgICdvcGVyYXRvcic6IG9wZXJhdG9yCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghcmlnaHRWYWx1ZS5pc1ByaW1pdGl2ZSkgewogICAgICAgICAgaWYgKCFsZWZ0VmFsdWUuaXNOdWxsKSB7CiAgICAgICAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKAogICAgICAgICAgICAgICAgcmlnaHQsIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQklOQVJZX1BSSU1JVElWRV9UWVBFLCB7CiAgICAgICAgICAgICAgJ2NvbnN0YW50JzogcmlnaHQsCiAgICAgICAgICAgICAgJ3R5cGUnOiByaWdodFZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpLAogICAgICAgICAgICAgICdvcGVyYXRvcic6IG9wZXJhdG9yCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5BREQ6CiAgICAgICAgaWYgKGxlZnRWYWx1ZS5pc1N0cmluZykgewogICAgICAgICAgaWYgKCFyaWdodFZhbHVlLmlzU3RyaW5nKSB7CiAgICAgICAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKAogICAgICAgICAgICAgICAgcmlnaHQsIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfU1RSSU5HX0FERF9UWVBFLCB7CiAgICAgICAgICAgICAgJ2NvbnN0YW50JzogcmlnaHQsCiAgICAgICAgICAgICAgJ3R5cGUnOiByaWdodFZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChsZWZ0VmFsdWUuaXNOdW0pIHsKICAgICAgICAgIGlmICghcmlnaHRWYWx1ZS5pc051bSkgewogICAgICAgICAgICBlbnZpcm9ubWVudC5yZXBvcnRFcnJvcigKICAgICAgICAgICAgICAgIHJpZ2h0LCBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX05VTV9BRERfVFlQRSwgewogICAgICAgICAgICAgICdjb25zdGFudCc6IHJpZ2h0LAogICAgICAgICAgICAgICd0eXBlJzogcmlnaHRWYWx1ZS5nZXRUeXBlKGVudmlyb25tZW50LmNvbW1vbkVsZW1lbnRzKQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAocmlnaHRWYWx1ZS5pc1N0cmluZykgewogICAgICAgICAgaWYgKCFsZWZ0VmFsdWUuaXNTdHJpbmcpIHsKICAgICAgICAgICAgZW52aXJvbm1lbnQucmVwb3J0RXJyb3IoCiAgICAgICAgICAgICAgICBsZWZ0LCBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX1NUUklOR19BRERfVFlQRSwgewogICAgICAgICAgICAgICdjb25zdGFudCc6IGxlZnQsCiAgICAgICAgICAgICAgJ3R5cGUnOiBsZWZ0VmFsdWUuZ2V0VHlwZShlbnZpcm9ubWVudC5jb21tb25FbGVtZW50cykKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHJpZ2h0VmFsdWUuaXNOdW0pIHsKICAgICAgICAgIGlmICghbGVmdFZhbHVlLmlzTnVtKSB7CiAgICAgICAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKAogICAgICAgICAgICAgICAgbGVmdCwgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9OVU1fQUREX1RZUEUsIHsKICAgICAgICAgICAgICAnY29uc3RhbnQnOiBsZWZ0LAogICAgICAgICAgICAgICd0eXBlJzogbGVmdFZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVudmlyb25tZW50CiAgICAgICAgICAgICAgLnJlcG9ydEVycm9yKHRoaXMsIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQUREX1RZUEVTLCB7CiAgICAgICAgICAgICdsZWZ0Q29uc3RhbnQnOiBsZWZ0LAogICAgICAgICAgICAnbGVmdFR5cGUnOiBsZWZ0VmFsdWUuZ2V0VHlwZShlbnZpcm9ubWVudC5jb21tb25FbGVtZW50cyksCiAgICAgICAgICAgICdyaWdodENvbnN0YW50JzogcmlnaHQsCiAgICAgICAgICAgICdyaWdodFR5cGUnOiByaWdodFZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpCiAgICAgICAgICB9KTsKICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLlNVQjoKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuTVVMOgogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5ESVY6CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLklESVY6CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLk1PRDoKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuR1RFUToKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuR1Q6CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkxURVE6CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkxUOgogICAgICAgIGlmICghbGVmdFZhbHVlLmlzTnVtKSB7CiAgICAgICAgICBlbnZpcm9ubWVudAogICAgICAgICAgICAgIC5yZXBvcnRFcnJvcihsZWZ0LCBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0JJTkFSWV9OVU1fVFlQRSwgewogICAgICAgICAgICAnY29uc3RhbnQnOiBsZWZ0LAogICAgICAgICAgICAndHlwZSc6IGxlZnRWYWx1ZS5nZXRUeXBlKGVudmlyb25tZW50LmNvbW1vbkVsZW1lbnRzKSwKICAgICAgICAgICAgJ29wZXJhdG9yJzogb3BlcmF0b3IKICAgICAgICAgIH0pOwogICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAoIXJpZ2h0VmFsdWUuaXNOdW0pIHsKICAgICAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKAogICAgICAgICAgICAgIHJpZ2h0LCBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0JJTkFSWV9OVU1fVFlQRSwgewogICAgICAgICAgICAnY29uc3RhbnQnOiByaWdodCwKICAgICAgICAgICAgJ3R5cGUnOiByaWdodFZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpLAogICAgICAgICAgICAnb3BlcmF0b3InOiBvcGVyYXRvcgogICAgICAgICAgfSk7CiAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmIChpc1ZhbGlkICYmCiAgICAgICAgICAgIChvcGVyYXRvci5raW5kID09IEJpbmFyeU9wZXJhdG9yS2luZC5JRElWIHx8CiAgICAgICAgICAgICAgICBvcGVyYXRvci5raW5kID09IEJpbmFyeU9wZXJhdG9yS2luZC5NT0QpKSB7CiAgICAgICAgICBpZiAocmlnaHRWYWx1ZS5pc1plcm8pIHsKICAgICAgICAgICAgZW52aXJvbm1lbnQucmVwb3J0RXJyb3IocmlnaHQsIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfRElWLAogICAgICAgICAgICAgICAgeydsZWZ0JzogbGVmdCwgJ3JpZ2h0JzogcmlnaHQsICdvcGVyYXRvcic6IG9wZXJhdG9yfSk7CiAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLlNITDoKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuU0hSOgogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5BTkQ6CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLk9SOgogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5YT1I6CiAgICAgICAgaWYgKCFsZWZ0VmFsdWUuaXNJbnQpIHsKICAgICAgICAgIGVudmlyb25tZW50CiAgICAgICAgICAgICAgLnJlcG9ydEVycm9yKGxlZnQsIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQklOQVJZX0lOVF9UWVBFLCB7CiAgICAgICAgICAgICdjb25zdGFudCc6IGxlZnQsCiAgICAgICAgICAgICd0eXBlJzogbGVmdFZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpLAogICAgICAgICAgICAnb3BlcmF0b3InOiBvcGVyYXRvcgogICAgICAgICAgfSk7CiAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICghcmlnaHRWYWx1ZS5pc0ludCkgewogICAgICAgICAgZW52aXJvbm1lbnQucmVwb3J0RXJyb3IoCiAgICAgICAgICAgICAgcmlnaHQsIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQklOQVJZX0lOVF9UWVBFLCB7CiAgICAgICAgICAgICdjb25zdGFudCc6IHJpZ2h0LAogICAgICAgICAgICAndHlwZSc6IHJpZ2h0VmFsdWUuZ2V0VHlwZShlbnZpcm9ubWVudC5jb21tb25FbGVtZW50cyksCiAgICAgICAgICAgICdvcGVyYXRvcic6IG9wZXJhdG9yCiAgICAgICAgICB9KTsKICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzVmFsaWQgJiYKICAgICAgICAgICAgKG9wZXJhdG9yLmtpbmQgPT0gQmluYXJ5T3BlcmF0b3JLaW5kLlNITCB8fAogICAgICAgICAgICAgICAgb3BlcmF0b3Iua2luZCA9PSBCaW5hcnlPcGVyYXRvcktpbmQuU0hSKSkgewogICAgICAgICAgSW50Q29uc3RhbnRWYWx1ZSBzaGlmdCA9IHJpZ2h0VmFsdWU7CiAgICAgICAgICBpZiAoc2hpZnQuaW50VmFsdWUgPCBCaWdJbnQuemVybykgewogICAgICAgICAgICBlbnZpcm9ubWVudC5yZXBvcnRFcnJvcihyaWdodCwgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9TSElGVCwKICAgICAgICAgICAgICAgIHsnbGVmdCc6IGxlZnQsICdyaWdodCc6IHJpZ2h0LCAnb3BlcmF0b3InOiBvcGVyYXRvcn0pOwogICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5MT0dJQ0FMX0FORDoKICAgICAgICBpZiAoIWxlZnRWYWx1ZS5pc0Jvb2wpIHsKICAgICAgICAgIGVudmlyb25tZW50CiAgICAgICAgICAgICAgLnJlcG9ydEVycm9yKGxlZnQsIE1lc3NhZ2VLaW5kLklOVkFMSURfTE9HSUNBTF9BTkRfT1BFUkFORF9UWVBFLCB7CiAgICAgICAgICAgICdjb25zdGFudCc6IGxlZnQsCiAgICAgICAgICAgICd0eXBlJzogbGVmdFZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpLAogICAgICAgICAgICAnb3BlcmF0b3InOiBvcGVyYXRvcgogICAgICAgICAgfSk7CiAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICghcmlnaHRWYWx1ZS5pc0Jvb2wpIHsKICAgICAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKAogICAgICAgICAgICAgIHJpZ2h0LCBNZXNzYWdlS2luZC5JTlZBTElEX0xPR0lDQUxfQU5EX09QRVJBTkRfVFlQRSwgewogICAgICAgICAgICAnY29uc3RhbnQnOiByaWdodCwKICAgICAgICAgICAgJ3R5cGUnOiByaWdodFZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpLAogICAgICAgICAgICAnb3BlcmF0b3InOiBvcGVyYXRvcgogICAgICAgICAgfSk7CiAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5MT0dJQ0FMX09SOgogICAgICAgIGlmICghbGVmdFZhbHVlLmlzQm9vbCkgewogICAgICAgICAgZW52aXJvbm1lbnQKICAgICAgICAgICAgICAucmVwb3J0RXJyb3IobGVmdCwgTWVzc2FnZUtpbmQuSU5WQUxJRF9MT0dJQ0FMX09SX09QRVJBTkRfVFlQRSwgewogICAgICAgICAgICAnY29uc3RhbnQnOiBsZWZ0LAogICAgICAgICAgICAndHlwZSc6IGxlZnRWYWx1ZS5nZXRUeXBlKGVudmlyb25tZW50LmNvbW1vbkVsZW1lbnRzKSwKICAgICAgICAgICAgJ29wZXJhdG9yJzogb3BlcmF0b3IKICAgICAgICAgIH0pOwogICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAoIXJpZ2h0VmFsdWUuaXNCb29sKSB7CiAgICAgICAgICBlbnZpcm9ubWVudAogICAgICAgICAgICAgIC5yZXBvcnRFcnJvcihyaWdodCwgTWVzc2FnZUtpbmQuSU5WQUxJRF9MT0dJQ0FMX09SX09QRVJBTkRfVFlQRSwgewogICAgICAgICAgICAnY29uc3RhbnQnOiByaWdodCwKICAgICAgICAgICAgJ3R5cGUnOiByaWdodFZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpLAogICAgICAgICAgICAnb3BlcmF0b3InOiBvcGVyYXRvcgogICAgICAgICAgfSk7CiAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5JTkRFWDoKICAgICAgICBlbnZpcm9ubWVudC5yZXBvcnRFcnJvcih0aGlzLCBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0lOREVYLCB7fSk7CiAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5JRl9OVUxMOgogICAgICAgIC8vIFZhbGlkIHNpbmNlIFtsZWZ0VmFsdWVdIGFuZCBbcmlnaHRWYWx1ZV0gYXJlIGNvbnN0YW50cy4KICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChpc1ZhbGlkKSB7CiAgICAgIHN3aXRjaCAob3BlcmF0b3Iua2luZCkgewogICAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLk5PVF9FUToKICAgICAgICAgIEJvb2xDb25zdGFudFZhbHVlIGVxdWFscyA9CiAgICAgICAgICAgICAgY29uc3RhbnRfc3lzdGVtLmVxdWFsLmZvbGQobGVmdFZhbHVlLCByaWdodFZhbHVlKTsKICAgICAgICAgIHJldHVybiBlcXVhbHMubmVnYXRlKCk7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBjb25zdGFudF9zeXN0ZW0KICAgICAgICAgICAgICAubG9va3VwQmluYXJ5KG9wZXJhdG9yKQogICAgICAgICAgICAgIC5mb2xkKGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZSk7CiAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgICBlbnZpcm9ubWVudAogICAgICAgICAgICAgIC5yZXBvcnRFcnJvcih0aGlzLCBNZXNzYWdlS2luZC5OT1RfQV9DT01QSUxFX1RJTUVfQ09OU1RBTlQsIHt9KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBOb25Db25zdGFudFZhbHVlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gYXBwbHkoTm9ybWFsaXplZEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBuZXcgQmluYXJ5Q29uc3RhbnRFeHByZXNzaW9uKAogICAgICAgIGxlZnQuYXBwbHkoYXJndW1lbnRzKSwgb3BlcmF0b3IsIHJpZ2h0LmFwcGx5KGFyZ3VtZW50cykpOwogIH0KCiAgQG92ZXJyaWRlCiAgLy8gaWdub3JlOiBNSVNTSU5HX1JFVFVSTgogIEludGVyZmFjZVR5cGUgZ2V0S25vd25UeXBlKENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzKSB7CiAgICBEYXJ0VHlwZSBrbm93bkxlZnRUeXBlID0gbGVmdC5nZXRLbm93blR5cGUoY29tbW9uRWxlbWVudHMpOwogICAgRGFydFR5cGUga25vd25SaWdodFR5cGUgPSByaWdodC5nZXRLbm93blR5cGUoY29tbW9uRWxlbWVudHMpOwogICAgc3dpdGNoIChvcGVyYXRvci5raW5kKSB7CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkVROgogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5OT1RfRVE6CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkxPR0lDQUxfQU5EOgogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5MT0dJQ0FMX09SOgogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5HVDoKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuTFQ6CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkdURVE6CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkxURVE6CiAgICAgICAgcmV0dXJuIGNvbW1vbkVsZW1lbnRzLmJvb2xUeXBlOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5BREQ6CiAgICAgICAgaWYgKGtub3duTGVmdFR5cGUgPT0gY29tbW9uRWxlbWVudHMuc3RyaW5nVHlwZSkgewogICAgICAgICAgYXNzZXJ0KGtub3duUmlnaHRUeXBlID09IGNvbW1vbkVsZW1lbnRzLnN0cmluZ1R5cGUpOwogICAgICAgICAgcmV0dXJuIGNvbW1vbkVsZW1lbnRzLnN0cmluZ1R5cGU7CiAgICAgICAgfSBlbHNlIGlmIChrbm93bkxlZnRUeXBlID09IGNvbW1vbkVsZW1lbnRzLmludFR5cGUgJiYKICAgICAgICAgICAga25vd25SaWdodFR5cGUgPT0gY29tbW9uRWxlbWVudHMuaW50VHlwZSkgewogICAgICAgICAgcmV0dXJuIGNvbW1vbkVsZW1lbnRzLmludFR5cGU7CiAgICAgICAgfQogICAgICAgIGFzc2VydChrbm93bkxlZnRUeXBlID09IGNvbW1vbkVsZW1lbnRzLmRvdWJsZVR5cGUgfHwKICAgICAgICAgICAga25vd25SaWdodFR5cGUgPT0gY29tbW9uRWxlbWVudHMuZG91YmxlVHlwZSk7CiAgICAgICAgcmV0dXJuIGNvbW1vbkVsZW1lbnRzLmRvdWJsZVR5cGU7CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLlNVQjoKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuTVVMOgogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5NT0Q6CiAgICAgICAgaWYgKGtub3duTGVmdFR5cGUgPT0gY29tbW9uRWxlbWVudHMuaW50VHlwZSAmJgogICAgICAgICAgICBrbm93blJpZ2h0VHlwZSA9PSBjb21tb25FbGVtZW50cy5pbnRUeXBlKSB7CiAgICAgICAgICByZXR1cm4gY29tbW9uRWxlbWVudHMuaW50VHlwZTsKICAgICAgICB9CiAgICAgICAgYXNzZXJ0KGtub3duTGVmdFR5cGUgPT0gY29tbW9uRWxlbWVudHMuZG91YmxlVHlwZSB8fAogICAgICAgICAgICBrbm93blJpZ2h0VHlwZSA9PSBjb21tb25FbGVtZW50cy5kb3VibGVUeXBlKTsKICAgICAgICByZXR1cm4gY29tbW9uRWxlbWVudHMuZG91YmxlVHlwZTsKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuRElWOgogICAgICAgIHJldHVybiBjb21tb25FbGVtZW50cy5kb3VibGVUeXBlOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5JRElWOgogICAgICAgIHJldHVybiBjb21tb25FbGVtZW50cy5pbnRUeXBlOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5BTkQ6CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLk9SOgogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5YT1I6CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLlNIUjoKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuU0hMOgogICAgICAgIHJldHVybiBjb21tb25FbGVtZW50cy5pbnRUeXBlOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5JRl9OVUxMOgogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5JTkRFWDoKICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgY29uc3RhbnQgYmluYXJ5IG9wZXJhdG9yOiAkb3BlcmF0b3InKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgcHJlY2VkZW5jZSA9PiBQUkVDRURFTkNFX01BUFtvcGVyYXRvci5raW5kXTsKCiAgQG92ZXJyaWRlCiAgaW50IF9jb21wdXRlSGFzaENvZGUoKSB7CiAgICByZXR1cm4gMTMgKiBvcGVyYXRvci5oYXNoQ29kZSArIDE3ICogbGVmdC5oYXNoQ29kZSArIDE5ICogcmlnaHQuaGFzaENvZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIF9lcXVhbHMoQmluYXJ5Q29uc3RhbnRFeHByZXNzaW9uIG90aGVyKSB7CiAgICByZXR1cm4gb3BlcmF0b3IgPT0gb3RoZXIub3BlcmF0b3IgJiYKICAgICAgICBsZWZ0ID09IG90aGVyLmxlZnQgJiYKICAgICAgICByaWdodCA9PSBvdGhlci5yaWdodDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUG90ZW50aWFsIHsKICAgIHJldHVybiBsZWZ0LmlzUG90ZW50aWFsIHx8IHJpZ2h0LmlzUG90ZW50aWFsOwogIH0KCiAgc3RhdGljIGNvbnN0IE1hcDxCaW5hcnlPcGVyYXRvcktpbmQsIGludD4gUFJFQ0VERU5DRV9NQVAgPSBjb25zdCB7CiAgICBCaW5hcnlPcGVyYXRvcktpbmQuRVE6IDYsCiAgICBCaW5hcnlPcGVyYXRvcktpbmQuTk9UX0VROiA2LAogICAgQmluYXJ5T3BlcmF0b3JLaW5kLkxPR0lDQUxfQU5EOiA1LAogICAgQmluYXJ5T3BlcmF0b3JLaW5kLkxPR0lDQUxfT1I6IDQsCiAgICBCaW5hcnlPcGVyYXRvcktpbmQuWE9SOiA5LAogICAgQmluYXJ5T3BlcmF0b3JLaW5kLkFORDogMTAsCiAgICBCaW5hcnlPcGVyYXRvcktpbmQuT1I6IDgsCiAgICBCaW5hcnlPcGVyYXRvcktpbmQuU0hSOiAxMSwKICAgIEJpbmFyeU9wZXJhdG9yS2luZC5TSEw6IDExLAogICAgQmluYXJ5T3BlcmF0b3JLaW5kLkFERDogMTIsCiAgICBCaW5hcnlPcGVyYXRvcktpbmQuU1VCOiAxMiwKICAgIEJpbmFyeU9wZXJhdG9yS2luZC5NVUw6IDEzLAogICAgQmluYXJ5T3BlcmF0b3JLaW5kLkRJVjogMTMsCiAgICBCaW5hcnlPcGVyYXRvcktpbmQuSURJVjogMTMsCiAgICBCaW5hcnlPcGVyYXRvcktpbmQuR1Q6IDcsCiAgICBCaW5hcnlPcGVyYXRvcktpbmQuTFQ6IDcsCiAgICBCaW5hcnlPcGVyYXRvcktpbmQuR1RFUTogNywKICAgIEJpbmFyeU9wZXJhdG9yS2luZC5MVEVROiA3LAogICAgQmluYXJ5T3BlcmF0b3JLaW5kLk1PRDogMTMsCiAgICBCaW5hcnlPcGVyYXRvcktpbmQuSUZfTlVMTDogMywKICAgIEJpbmFyeU9wZXJhdG9yS2luZC5JTkRFWDogMywKICB9Owp9CgovLy8gQSBjb25zdGFudCBpZGVudGljYWwgaW52b2NhdGlvbiBsaWtlIGBpZGVudGljYWwoYSwgYilgLgpjbGFzcyBJZGVudGljYWxDb25zdGFudEV4cHJlc3Npb24gZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb24gewogIGZpbmFsIENvbnN0YW50RXhwcmVzc2lvbiBsZWZ0OwogIGZpbmFsIENvbnN0YW50RXhwcmVzc2lvbiByaWdodDsKCiAgSWRlbnRpY2FsQ29uc3RhbnRFeHByZXNzaW9uKHRoaXMubGVmdCwgdGhpcy5yaWdodCk7CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgPT4gQ29uc3RhbnRFeHByZXNzaW9uS2luZC5JREVOVElDQUw7CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IsIFtjb250ZXh0XSkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRJZGVudGljYWwodGhpcywgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChTdHJpbmdCdWZmZXIgc2IpIHsKICAgIHNiLndyaXRlKCdJZGVudGljYWwobGVmdD0nKTsKICAgIGxlZnQuX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KHNiKTsKICAgIHNiLndyaXRlKCcscmlnaHQ9Jyk7CiAgICByaWdodC5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgc2Iud3JpdGUoJyknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICBDb25zdGFudFZhbHVlIGxlZnRWYWx1ZSA9IGxlZnQuZXZhbHVhdGUoZW52aXJvbm1lbnQpOwogICAgQ29uc3RhbnRWYWx1ZSByaWdodFZhbHVlID0gcmlnaHQuZXZhbHVhdGUoZW52aXJvbm1lbnQpOwogICAgaWYgKGxlZnRWYWx1ZS5pc0NvbnN0YW50ICYmIHJpZ2h0VmFsdWUuaXNDb25zdGFudCkgewogICAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmlkZW50aXR5LmZvbGQobGVmdFZhbHVlLCByaWdodFZhbHVlKTsKICAgIH0KICAgIHJldHVybiBuZXcgTm9uQ29uc3RhbnRWYWx1ZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIGFwcGx5KE5vcm1hbGl6ZWRBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IElkZW50aWNhbENvbnN0YW50RXhwcmVzc2lvbigKICAgICAgICBsZWZ0LmFwcGx5KGFyZ3VtZW50cyksIHJpZ2h0LmFwcGx5KGFyZ3VtZW50cykpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBwcmVjZWRlbmNlID0+IDE1OwoKICBAb3ZlcnJpZGUKICBpbnQgX2NvbXB1dGVIYXNoQ29kZSgpIHsKICAgIHJldHVybiAxNyAqIGxlZnQuaGFzaENvZGUgKyAxOSAqIHJpZ2h0Lmhhc2hDb2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBfZXF1YWxzKElkZW50aWNhbENvbnN0YW50RXhwcmVzc2lvbiBvdGhlcikgewogICAgcmV0dXJuIGxlZnQgPT0gb3RoZXIubGVmdCAmJiByaWdodCA9PSBvdGhlci5yaWdodDsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0S25vd25UeXBlKENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzKSA9PgogICAgICBjb21tb25FbGVtZW50cy5ib29sVHlwZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNQb3RlbnRpYWwgewogICAgcmV0dXJuIGxlZnQuaXNQb3RlbnRpYWwgfHwgcmlnaHQuaXNQb3RlbnRpYWw7CiAgfQp9CgovLy8gQSB1bmFyeSBjb25zdGFudCBleHByZXNzaW9uIGxpa2UgYC1hYC4KY2xhc3MgVW5hcnlDb25zdGFudEV4cHJlc3Npb24gZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb24gewogIGZpbmFsIFVuYXJ5T3BlcmF0b3Igb3BlcmF0b3I7CiAgZmluYWwgQ29uc3RhbnRFeHByZXNzaW9uIGV4cHJlc3Npb247CgogIFVuYXJ5Q29uc3RhbnRFeHByZXNzaW9uKHRoaXMub3BlcmF0b3IsIHRoaXMuZXhwcmVzc2lvbikgewogICAgYXNzZXJ0KFBSRUNFREVOQ0VfTUFQW29wZXJhdG9yLmtpbmRdICE9IG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBDb25zdGFudEV4cHJlc3Npb25LaW5kLlVOQVJZOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yLCBbY29udGV4dF0pIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0VW5hcnkodGhpcywgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChTdHJpbmdCdWZmZXIgc2IpIHsKICAgIHNiLndyaXRlKCdVbmFyeShvcD0kb3BlcmF0b3IsZXhwcmVzc2lvbj0nKTsKICAgIGV4cHJlc3Npb24uX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KHNiKTsKICAgIHNiLndyaXRlKCcpJyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGV2YWx1YXRlKEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewogICAgQ29uc3RhbnRWYWx1ZSBleHByZXNzaW9uVmFsdWUgPSBleHByZXNzaW9uLmV2YWx1YXRlKGVudmlyb25tZW50KTsKICAgIGJvb2wgaXNWYWxpZCA9IHRydWU7CiAgICBzd2l0Y2ggKG9wZXJhdG9yLmtpbmQpIHsKICAgICAgY2FzZSBVbmFyeU9wZXJhdG9yS2luZC5OT1Q6CiAgICAgICAgaWYgKCFleHByZXNzaW9uVmFsdWUuaXNCb29sKSB7CiAgICAgICAgICBlbnZpcm9ubWVudAogICAgICAgICAgICAgIC5yZXBvcnRFcnJvcihleHByZXNzaW9uLCBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX05PVF9UWVBFLCB7CiAgICAgICAgICAgICdjb25zdGFudCc6IGV4cHJlc3Npb24sCiAgICAgICAgICAgICd0eXBlJzogZXhwcmVzc2lvblZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpLAogICAgICAgICAgICAnb3BlcmF0b3InOiBvcGVyYXRvcgogICAgICAgICAgfSk7CiAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFVuYXJ5T3BlcmF0b3JLaW5kLk5FR0FURToKICAgICAgICBpZiAoIWV4cHJlc3Npb25WYWx1ZS5pc051bSkgewogICAgICAgICAgZW52aXJvbm1lbnQucmVwb3J0RXJyb3IoCiAgICAgICAgICAgICAgZXhwcmVzc2lvbiwgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9ORUdBVEVfVFlQRSwgewogICAgICAgICAgICAnY29uc3RhbnQnOiBleHByZXNzaW9uLAogICAgICAgICAgICAndHlwZSc6IGV4cHJlc3Npb25WYWx1ZS5nZXRUeXBlKGVudmlyb25tZW50LmNvbW1vbkVsZW1lbnRzKSwKICAgICAgICAgICAgJ29wZXJhdG9yJzogb3BlcmF0b3IKICAgICAgICAgIH0pOwogICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBVbmFyeU9wZXJhdG9yS2luZC5DT01QTEVNRU5UOgogICAgICAgIGlmICghZXhwcmVzc2lvblZhbHVlLmlzSW50KSB7CiAgICAgICAgICBlbnZpcm9ubWVudC5yZXBvcnRFcnJvcigKICAgICAgICAgICAgICBleHByZXNzaW9uLCBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0NPTVBMRU1FTlRfVFlQRSwgewogICAgICAgICAgICAnY29uc3RhbnQnOiBleHByZXNzaW9uLAogICAgICAgICAgICAndHlwZSc6IGV4cHJlc3Npb25WYWx1ZS5nZXRUeXBlKGVudmlyb25tZW50LmNvbW1vbkVsZW1lbnRzKSwKICAgICAgICAgICAgJ29wZXJhdG9yJzogb3BlcmF0b3IKICAgICAgICAgIH0pOwogICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChpc1ZhbGlkKSB7CiAgICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPQogICAgICAgICAgY29uc3RhbnRfc3lzdGVtLmxvb2t1cFVuYXJ5KG9wZXJhdG9yKS5mb2xkKGV4cHJlc3Npb25WYWx1ZSk7CiAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IE5vbkNvbnN0YW50VmFsdWUoKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiBhcHBseShOb3JtYWxpemVkQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIG5ldyBVbmFyeUNvbnN0YW50RXhwcmVzc2lvbihvcGVyYXRvciwgZXhwcmVzc2lvbi5hcHBseShhcmd1bWVudHMpKTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgcHJlY2VkZW5jZSA9PiBQUkVDRURFTkNFX01BUFtvcGVyYXRvci5raW5kXTsKCiAgQG92ZXJyaWRlCiAgaW50IF9jb21wdXRlSGFzaENvZGUoKSB7CiAgICByZXR1cm4gMTMgKiBvcGVyYXRvci5oYXNoQ29kZSArIDE3ICogZXhwcmVzc2lvbi5oYXNoQ29kZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhVbmFyeUNvbnN0YW50RXhwcmVzc2lvbiBvdGhlcikgewogICAgcmV0dXJuIG9wZXJhdG9yID09IG90aGVyLm9wZXJhdG9yICYmIGV4cHJlc3Npb24gPT0gb3RoZXIuZXhwcmVzc2lvbjsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldEtub3duVHlwZShDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cykgewogICAgcmV0dXJuIGV4cHJlc3Npb24uZ2V0S25vd25UeXBlKGNvbW1vbkVsZW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUG90ZW50aWFsIHsKICAgIHJldHVybiBleHByZXNzaW9uLmlzUG90ZW50aWFsOwogIH0KCiAgc3RhdGljIGNvbnN0IE1hcDxVbmFyeU9wZXJhdG9yS2luZCwgaW50PiBQUkVDRURFTkNFX01BUCA9IGNvbnN0IHsKICAgIFVuYXJ5T3BlcmF0b3JLaW5kLk5PVDogMTQsCiAgICBVbmFyeU9wZXJhdG9yS2luZC5DT01QTEVNRU5UOiAxNCwKICAgIFVuYXJ5T3BlcmF0b3JLaW5kLk5FR0FURTogMTQsCiAgfTsKfQoKLy8vIEEgc3RyaW5nIGxlbmd0aCBjb25zdGFudCBleHByZXNzaW9uIGxpa2UgYGEubGVuZ3RoYC4KY2xhc3MgU3RyaW5nTGVuZ3RoQ29uc3RhbnRFeHByZXNzaW9uIGV4dGVuZHMgQ29uc3RhbnRFeHByZXNzaW9uIHsKICBmaW5hbCBDb25zdGFudEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKCiAgU3RyaW5nTGVuZ3RoQ29uc3RhbnRFeHByZXNzaW9uKHRoaXMuZXhwcmVzc2lvbik7CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgPT4gQ29uc3RhbnRFeHByZXNzaW9uS2luZC5TVFJJTkdfTEVOR1RIOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yLCBbY29udGV4dF0pIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0U3RyaW5nTGVuZ3RoKHRoaXMsIGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfY3JlYXRlU3RydWN0dXJlZFRleHQoU3RyaW5nQnVmZmVyIHNiKSB7CiAgICBzYi53cml0ZSgnU3RyaW5nTGVuZ3RoKGV4cHJlc3Npb249Jyk7CiAgICBleHByZXNzaW9uLl9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChzYik7CiAgICBzYi53cml0ZSgnKScpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBleHByZXNzaW9uLmV2YWx1YXRlKGVudmlyb25tZW50KTsKICAgIGlmICghdmFsdWUuaXNTdHJpbmcpIHsKICAgICAgZW52aXJvbm1lbnQucmVwb3J0RXJyb3IoCiAgICAgICAgICBleHByZXNzaW9uLCBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX1NUUklOR19MRU5HVEhfVFlQRSwgewogICAgICAgICdjb25zdGFudCc6IGV4cHJlc3Npb24sCiAgICAgICAgJ3R5cGUnOiB2YWx1ZS5nZXRUeXBlKGVudmlyb25tZW50LmNvbW1vbkVsZW1lbnRzKQogICAgICB9KTsKICAgICAgcmV0dXJuIG5ldyBOb25Db25zdGFudFZhbHVlKCk7CiAgICB9IGVsc2UgewogICAgICBTdHJpbmdDb25zdGFudFZhbHVlIHN0cmluZ1ZhbHVlID0gdmFsdWU7CiAgICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0KICAgICAgICAgIC5jcmVhdGVJbnQobmV3IEJpZ0ludC5mcm9tKHN0cmluZ1ZhbHVlLnN0cmluZ1ZhbHVlLmxlbmd0aCkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIGFwcGx5KE5vcm1hbGl6ZWRBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IFN0cmluZ0xlbmd0aENvbnN0YW50RXhwcmVzc2lvbihleHByZXNzaW9uLmFwcGx5KGFyZ3VtZW50cykpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBwcmVjZWRlbmNlID0+IDE1OwoKICBAb3ZlcnJpZGUKICBpbnQgX2NvbXB1dGVIYXNoQ29kZSgpIHsKICAgIHJldHVybiAyMyAqIGV4cHJlc3Npb24uaGFzaENvZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIF9lcXVhbHMoU3RyaW5nTGVuZ3RoQ29uc3RhbnRFeHByZXNzaW9uIG90aGVyKSB7CiAgICByZXR1cm4gZXhwcmVzc2lvbiA9PSBvdGhlci5leHByZXNzaW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXRLbm93blR5cGUoQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpID0+CiAgICAgIGNvbW1vbkVsZW1lbnRzLmludFR5cGU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUG90ZW50aWFsIHsKICAgIHJldHVybiBleHByZXNzaW9uLmlzUG90ZW50aWFsOwogIH0KfQoKLy8vIEEgY29uc3RhbnQgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBsaWtlIGBhID8gYiA6IGNgLgpjbGFzcyBDb25kaXRpb25hbENvbnN0YW50RXhwcmVzc2lvbiBleHRlbmRzIENvbnN0YW50RXhwcmVzc2lvbiB7CiAgZmluYWwgQ29uc3RhbnRFeHByZXNzaW9uIGNvbmRpdGlvbjsKICBmaW5hbCBDb25zdGFudEV4cHJlc3Npb24gdHJ1ZUV4cDsKICBmaW5hbCBDb25zdGFudEV4cHJlc3Npb24gZmFsc2VFeHA7CgogIENvbmRpdGlvbmFsQ29uc3RhbnRFeHByZXNzaW9uKHRoaXMuY29uZGl0aW9uLCB0aGlzLnRydWVFeHAsIHRoaXMuZmFsc2VFeHApOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IENvbnN0YW50RXhwcmVzc2lvbktpbmQuQ09ORElUSU9OQUw7CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IsIFtjb250ZXh0XSkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRDb25kaXRpb25hbCh0aGlzLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KFN0cmluZ0J1ZmZlciBzYikgewogICAgc2Iud3JpdGUoJ0NvbmRpdGlvbmFsKGNvbmRpdGlvbj0nKTsKICAgIGNvbmRpdGlvbi5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgc2Iud3JpdGUoJyx0cnVlPScpOwogICAgdHJ1ZUV4cC5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgc2Iud3JpdGUoJyxmYWxzZT0nKTsKICAgIGZhbHNlRXhwLl9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChzYik7CiAgICBzYi53cml0ZSgnKScpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIGFwcGx5KE5vcm1hbGl6ZWRBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IENvbmRpdGlvbmFsQ29uc3RhbnRFeHByZXNzaW9uKGNvbmRpdGlvbi5hcHBseShhcmd1bWVudHMpLAogICAgICAgIHRydWVFeHAuYXBwbHkoYXJndW1lbnRzKSwgZmFsc2VFeHAuYXBwbHkoYXJndW1lbnRzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IHByZWNlZGVuY2UgPT4gMzsKCiAgQG92ZXJyaWRlCiAgaW50IF9jb21wdXRlSGFzaENvZGUoKSB7CiAgICByZXR1cm4gMTMgKiBjb25kaXRpb24uaGFzaENvZGUgKwogICAgICAgIDE3ICogdHJ1ZUV4cC5oYXNoQ29kZSArCiAgICAgICAgMTkgKiBmYWxzZUV4cC5oYXNoQ29kZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhDb25kaXRpb25hbENvbnN0YW50RXhwcmVzc2lvbiBvdGhlcikgewogICAgcmV0dXJuIGNvbmRpdGlvbiA9PSBvdGhlci5jb25kaXRpb24gJiYKICAgICAgICB0cnVlRXhwID09IG90aGVyLnRydWVFeHAgJiYKICAgICAgICBmYWxzZUV4cCA9PSBvdGhlci5mYWxzZUV4cDsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICBDb25zdGFudFZhbHVlIGNvbmRpdGlvblZhbHVlID0gY29uZGl0aW9uLmV2YWx1YXRlKGVudmlyb25tZW50KTsKICAgIENvbnN0YW50VmFsdWUgdHJ1ZVZhbHVlID0gdHJ1ZUV4cC5ldmFsdWF0ZShlbnZpcm9ubWVudCk7CiAgICBDb25zdGFudFZhbHVlIGZhbHNlVmFsdWUgPSBmYWxzZUV4cC5ldmFsdWF0ZShlbnZpcm9ubWVudCk7CiAgICBib29sIGlzVmFsaWQgPSB0cnVlOwogICAgaWYgKCFjb25kaXRpb25WYWx1ZS5pc0Jvb2wpIHsKICAgICAgZW52aXJvbm1lbnQucmVwb3J0RXJyb3IoCiAgICAgICAgICBjb25kaXRpb24sIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQ09ORElUSU9OQUxfVFlQRSwgewogICAgICAgICdjb25zdGFudCc6IGNvbmRpdGlvbiwKICAgICAgICAndHlwZSc6IGNvbmRpdGlvblZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpCiAgICAgIH0pOwogICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICB9CiAgICBpZiAoaXNWYWxpZCkgewogICAgICBpZiAoY29uZGl0aW9uVmFsdWUuaXNUcnVlKSB7CiAgICAgICAgcmV0dXJuIHRydWVWYWx1ZTsKICAgICAgfSBlbHNlIGlmIChjb25kaXRpb25WYWx1ZS5pc0ZhbHNlKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlVmFsdWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgTm9uQ29uc3RhbnRWYWx1ZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0S25vd25UeXBlKENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzKSB7CiAgICBEYXJ0VHlwZSB0cnVlVHlwZSA9IHRydWVFeHAuZ2V0S25vd25UeXBlKGNvbW1vbkVsZW1lbnRzKTsKICAgIERhcnRUeXBlIGZhbHNlVHlwZSA9IGZhbHNlRXhwLmdldEtub3duVHlwZShjb21tb25FbGVtZW50cyk7CiAgICBpZiAodHJ1ZVR5cGUgPT0gZmFsc2VUeXBlKSB7CiAgICAgIHJldHVybiB0cnVlVHlwZTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNQb3RlbnRpYWwgewogICAgcmV0dXJuIGNvbmRpdGlvbi5pc1BvdGVudGlhbCB8fCB0cnVlRXhwLmlzUG90ZW50aWFsIHx8IGZhbHNlRXhwLmlzUG90ZW50aWFsOwogIH0KfQoKLy8vIEEgcmVmZXJlbmNlIHRvIGEgcG9zaXRpb24gcGFyYW1ldGVyLgpjbGFzcyBQb3NpdGlvbmFsQXJndW1lbnRSZWZlcmVuY2UgZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb24gewogIGZpbmFsIGludCBpbmRleDsKCiAgUG9zaXRpb25hbEFyZ3VtZW50UmVmZXJlbmNlKHRoaXMuaW5kZXgpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb25LaW5kIGdldCBraW5kIHsKICAgIHJldHVybiBDb25zdGFudEV4cHJlc3Npb25LaW5kLlBPU0lUSU9OQUxfUkVGRVJFTkNFOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvciwgW2NvbnRleHRdKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFBvc2l0aW9uYWwodGhpcywgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChTdHJpbmdCdWZmZXIgc2IpIHsKICAgIHNiLndyaXRlKCdQb3NpdGlvbmFsKGluZGV4PSRpbmRleCknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiBhcHBseShOb3JtYWxpemVkQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5nZXRQb3NpdGlvbmFsQXJndW1lbnQoaW5kZXgpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IF9jb21wdXRlSGFzaENvZGUoKSA9PiAxMyAqIGluZGV4Lmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIF9lcXVhbHMoUG9zaXRpb25hbEFyZ3VtZW50UmVmZXJlbmNlIG90aGVyKSA9PiBpbmRleCA9PSBvdGhlci5pbmRleDsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIHJldHVybiBuZXcgTm9uQ29uc3RhbnRWYWx1ZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNQb3RlbnRpYWwgPT4gdHJ1ZTsKfQoKLy8vIEEgcmVmZXJlbmNlIHRvIGEgbmFtZWQgcGFyYW1ldGVyLgpjbGFzcyBOYW1lZEFyZ3VtZW50UmVmZXJlbmNlIGV4dGVuZHMgQ29uc3RhbnRFeHByZXNzaW9uIHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgTmFtZWRBcmd1bWVudFJlZmVyZW5jZSh0aGlzLm5hbWUpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb25LaW5kIGdldCBraW5kIHsKICAgIHJldHVybiBDb25zdGFudEV4cHJlc3Npb25LaW5kLk5BTUVEX1JFRkVSRU5DRTsKICB9CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IsIFtjb250ZXh0XSkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXROYW1lZCh0aGlzLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KFN0cmluZ0J1ZmZlciBzYikgewogICAgc2Iud3JpdGUoJ05hbWVkKG5hbWU9JG5hbWUpJyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gYXBwbHkoTm9ybWFsaXplZEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBhcmd1bWVudHMuZ2V0TmFtZWRBcmd1bWVudChuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIGludCBfY29tcHV0ZUhhc2hDb2RlKCkgPT4gMTMgKiBuYW1lLmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIF9lcXVhbHMoTmFtZWRBcmd1bWVudFJlZmVyZW5jZSBvdGhlcikgPT4gbmFtZSA9PSBvdGhlci5uYW1lOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGV2YWx1YXRlKEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewogICAgcmV0dXJuIG5ldyBOb25Db25zdGFudFZhbHVlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1BvdGVudGlhbCA9PiB0cnVlOwp9CgphYnN0cmFjdCBjbGFzcyBGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb24gZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb24gewogIGZpbmFsIENvbnN0YW50RXhwcmVzc2lvbiBuYW1lOwogIGZpbmFsIENvbnN0YW50RXhwcmVzc2lvbiBkZWZhdWx0VmFsdWU7CgogIEZyb21FbnZpcm9ubWVudENvbnN0YW50RXhwcmVzc2lvbih0aGlzLm5hbWUsIHRoaXMuZGVmYXVsdFZhbHVlKTsKCiAgYm9vbCBfY2hlY2tOYW1lRnJvbUVudmlyb25tZW50KEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCwKICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIG5hbWUsIENvbnN0YW50VmFsdWUgbmFtZVZhbHVlKSB7CiAgICBpZiAoIW5hbWVWYWx1ZS5pc1N0cmluZykgewogICAgICBlbnZpcm9ubWVudC5yZXBvcnRFcnJvcigKICAgICAgICAgIG5hbWUsIE1lc3NhZ2VLaW5kLklOVkFMSURfRlJPTV9FTlZJUk9OTUVOVF9OQU1FX1RZUEUsIHsKICAgICAgICAnY29uc3RhbnQnOiBuYW1lLAogICAgICAgICd0eXBlJzogbmFtZVZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpCiAgICAgIH0pOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGludCBfY29tcHV0ZUhhc2hDb2RlKCkgewogICAgcmV0dXJuIDEzICogbmFtZS5oYXNoQ29kZSArIDE3ICogZGVmYXVsdFZhbHVlLmhhc2hDb2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBfZXF1YWxzKEZyb21FbnZpcm9ubWVudENvbnN0YW50RXhwcmVzc2lvbiBvdGhlcikgewogICAgcmV0dXJuIG5hbWUgPT0gb3RoZXIubmFtZSAmJiBkZWZhdWx0VmFsdWUgPT0gb3RoZXIuZGVmYXVsdFZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNJbXBsaWNpdCB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1BvdGVudGlhbCB7CiAgICByZXR1cm4gbmFtZS5pc1BvdGVudGlhbCB8fAogICAgICAgIChkZWZhdWx0VmFsdWUgIT0gbnVsbCAmJiBkZWZhdWx0VmFsdWUuaXNQb3RlbnRpYWwpOwogIH0KfQoKLy8vIEEgYGNvbnN0IGJvb2wuZnJvbUVudmlyb25tZW50YCBjb25zdGFudC4KY2xhc3MgQm9vbEZyb21FbnZpcm9ubWVudENvbnN0YW50RXhwcmVzc2lvbgogICAgZXh0ZW5kcyBGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb24gewogIEJvb2xGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb24oCiAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBuYW1lLCBDb25zdGFudEV4cHJlc3Npb24gZGVmYXVsdFZhbHVlKQogICAgICA6IHN1cGVyKG5hbWUsIGRlZmF1bHRWYWx1ZSk7CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgewogICAgcmV0dXJuIENvbnN0YW50RXhwcmVzc2lvbktpbmQuQk9PTF9GUk9NX0VOVklST05NRU5UOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvciwgW2NvbnRleHRdKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEJvb2xGcm9tRW52aXJvbm1lbnQodGhpcywgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChTdHJpbmdCdWZmZXIgc2IpIHsKICAgIHNiLndyaXRlKCdib29sLmZyb21FbnZpcm9ubWVudChuYW1lPScpOwogICAgbmFtZS5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgc2Iud3JpdGUoJyxkZWZhdWx0VmFsdWU9Jyk7CiAgICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKICAgICAgZGVmYXVsdFZhbHVlLl9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChzYik7CiAgICB9IGVsc2UgewogICAgICBzYi53cml0ZSgnbnVsbCcpOwogICAgfQogICAgc2Iud3JpdGUoJyknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICBDb25zdGFudFZhbHVlIG5hbWVDb25zdGFudFZhbHVlID0gbmFtZS5ldmFsdWF0ZShlbnZpcm9ubWVudCk7CiAgICBDb25zdGFudFZhbHVlIGRlZmF1bHRDb25zdGFudFZhbHVlOwogICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7CiAgICAgIGRlZmF1bHRDb25zdGFudFZhbHVlID0gZGVmYXVsdFZhbHVlLmV2YWx1YXRlKGVudmlyb25tZW50KTsKICAgIH0gZWxzZSB7CiAgICAgIGRlZmF1bHRDb25zdGFudFZhbHVlID0gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZUJvb2woZmFsc2UpOwogICAgfQogICAgaWYgKCFuYW1lQ29uc3RhbnRWYWx1ZS5pc0NvbnN0YW50IHx8ICFkZWZhdWx0Q29uc3RhbnRWYWx1ZS5pc0NvbnN0YW50KSB7CiAgICAgIHJldHVybiBuZXcgTm9uQ29uc3RhbnRWYWx1ZSgpOwogICAgfQogICAgYm9vbCBpc1ZhbGlkID0KICAgICAgICBfY2hlY2tOYW1lRnJvbUVudmlyb25tZW50KGVudmlyb25tZW50LCBuYW1lLCBuYW1lQ29uc3RhbnRWYWx1ZSk7CiAgICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKICAgICAgaWYgKCFkZWZhdWx0Q29uc3RhbnRWYWx1ZS5pc0Jvb2wgJiYgIWRlZmF1bHRDb25zdGFudFZhbHVlLmlzTnVsbCkgewogICAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKGRlZmF1bHRWYWx1ZSwKICAgICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9CT09MX0ZST01fRU5WSVJPTk1FTlRfREVGQVVMVF9WQUxVRV9UWVBFLCB7CiAgICAgICAgICAnY29uc3RhbnQnOiBkZWZhdWx0VmFsdWUsCiAgICAgICAgICAndHlwZSc6IGRlZmF1bHRDb25zdGFudFZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpCiAgICAgICAgfSk7CiAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICBpZiAoaXNWYWxpZCkgewogICAgICBTdHJpbmdDb25zdGFudFZhbHVlIG5hbWVTdHJpbmdDb25zdGFudFZhbHVlID0gbmFtZUNvbnN0YW50VmFsdWU7CiAgICAgIFN0cmluZyB0ZXh0ID0KICAgICAgICAgIGVudmlyb25tZW50LnJlYWRGcm9tRW52aXJvbm1lbnQobmFtZVN0cmluZ0NvbnN0YW50VmFsdWUuc3RyaW5nVmFsdWUpOwogICAgICBpZiAodGV4dCA9PSAndHJ1ZScpIHsKICAgICAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZUJvb2wodHJ1ZSk7CiAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnZmFsc2UnKSB7CiAgICAgICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5jcmVhdGVCb29sKGZhbHNlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZGVmYXVsdENvbnN0YW50VmFsdWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgTm9uQ29uc3RhbnRWYWx1ZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIGFwcGx5KE5vcm1hbGl6ZWRBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IEJvb2xGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb24obmFtZS5hcHBseShhcmd1bWVudHMpLAogICAgICAgIGRlZmF1bHRWYWx1ZSAhPSBudWxsID8gZGVmYXVsdFZhbHVlLmFwcGx5KGFyZ3VtZW50cykgOiBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0S25vd25UeXBlKENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzKSA9PgogICAgICBjb21tb25FbGVtZW50cy5ib29sVHlwZTsKfQoKLy8vIEEgYGNvbnN0IGludC5mcm9tRW52aXJvbm1lbnRgIGNvbnN0YW50LgpjbGFzcyBJbnRGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb24KICAgIGV4dGVuZHMgRnJvbUVudmlyb25tZW50Q29uc3RhbnRFeHByZXNzaW9uIHsKICBJbnRGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb24oCiAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBuYW1lLCBDb25zdGFudEV4cHJlc3Npb24gZGVmYXVsdFZhbHVlKQogICAgICA6IHN1cGVyKG5hbWUsIGRlZmF1bHRWYWx1ZSk7CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgewogICAgcmV0dXJuIENvbnN0YW50RXhwcmVzc2lvbktpbmQuSU5UX0ZST01fRU5WSVJPTk1FTlQ7CiAgfQoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yLCBbY29udGV4dF0pIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0SW50RnJvbUVudmlyb25tZW50KHRoaXMsIGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfY3JlYXRlU3RydWN0dXJlZFRleHQoU3RyaW5nQnVmZmVyIHNiKSB7CiAgICBzYi53cml0ZSgnaW50LmZyb21FbnZpcm9ubWVudChuYW1lPScpOwogICAgbmFtZS5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgc2Iud3JpdGUoJyxkZWZhdWx0VmFsdWU9Jyk7CiAgICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKICAgICAgZGVmYXVsdFZhbHVlLl9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChzYik7CiAgICB9IGVsc2UgewogICAgICBzYi53cml0ZSgnbnVsbCcpOwogICAgfQogICAgc2Iud3JpdGUoJyknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICBDb25zdGFudFZhbHVlIG5hbWVDb25zdGFudFZhbHVlID0gbmFtZS5ldmFsdWF0ZShlbnZpcm9ubWVudCk7CiAgICBDb25zdGFudFZhbHVlIGRlZmF1bHRDb25zdGFudFZhbHVlOwogICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7CiAgICAgIGRlZmF1bHRDb25zdGFudFZhbHVlID0gZGVmYXVsdFZhbHVlLmV2YWx1YXRlKGVudmlyb25tZW50KTsKICAgIH0gZWxzZSB7CiAgICAgIGRlZmF1bHRDb25zdGFudFZhbHVlID0gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZU51bGwoKTsKICAgIH0KICAgIGlmICghbmFtZUNvbnN0YW50VmFsdWUuaXNDb25zdGFudCB8fCAhZGVmYXVsdENvbnN0YW50VmFsdWUuaXNDb25zdGFudCkgewogICAgICByZXR1cm4gbmV3IE5vbkNvbnN0YW50VmFsdWUoKTsKICAgIH0KICAgIGJvb2wgaXNWYWxpZCA9CiAgICAgICAgX2NoZWNrTmFtZUZyb21FbnZpcm9ubWVudChlbnZpcm9ubWVudCwgbmFtZSwgbmFtZUNvbnN0YW50VmFsdWUpOwogICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7CiAgICAgIGlmICghZGVmYXVsdENvbnN0YW50VmFsdWUuaXNJbnQgJiYgIWRlZmF1bHRDb25zdGFudFZhbHVlLmlzTnVsbCkgewogICAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKGRlZmF1bHRWYWx1ZSwKICAgICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9JTlRfRlJPTV9FTlZJUk9OTUVOVF9ERUZBVUxUX1ZBTFVFX1RZUEUsIHsKICAgICAgICAgICdjb25zdGFudCc6IGRlZmF1bHRWYWx1ZSwKICAgICAgICAgICd0eXBlJzogZGVmYXVsdENvbnN0YW50VmFsdWUuZ2V0VHlwZShlbnZpcm9ubWVudC5jb21tb25FbGVtZW50cykKICAgICAgICB9KTsKICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmIChpc1ZhbGlkKSB7CiAgICAgIFN0cmluZ0NvbnN0YW50VmFsdWUgbmFtZVN0cmluZ0NvbnN0YW50VmFsdWUgPSBuYW1lQ29uc3RhbnRWYWx1ZTsKICAgICAgU3RyaW5nIHRleHQgPQogICAgICAgICAgZW52aXJvbm1lbnQucmVhZEZyb21FbnZpcm9ubWVudChuYW1lU3RyaW5nQ29uc3RhbnRWYWx1ZS5zdHJpbmdWYWx1ZSk7CiAgICAgIEJpZ0ludCB2YWx1ZTsKICAgICAgaWYgKHRleHQgIT0gbnVsbCkgewogICAgICAgIHZhbHVlID0gQmlnSW50LnRyeVBhcnNlKHRleHQpOwogICAgICB9CiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGRlZmF1bHRDb25zdGFudFZhbHVlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0uY3JlYXRlSW50KHZhbHVlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBOb25Db25zdGFudFZhbHVlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gYXBwbHkoTm9ybWFsaXplZEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBuZXcgSW50RnJvbUVudmlyb25tZW50Q29uc3RhbnRFeHByZXNzaW9uKG5hbWUuYXBwbHkoYXJndW1lbnRzKSwKICAgICAgICBkZWZhdWx0VmFsdWUgIT0gbnVsbCA/IGRlZmF1bHRWYWx1ZS5hcHBseShhcmd1bWVudHMpIDogbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldEtub3duVHlwZShDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cykgPT4KICAgICAgY29tbW9uRWxlbWVudHMuaW50VHlwZTsKfQoKLy8vIEEgYGNvbnN0IFN0cmluZy5mcm9tRW52aXJvbm1lbnRgIGNvbnN0YW50LgpjbGFzcyBTdHJpbmdGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb24KICAgIGV4dGVuZHMgRnJvbUVudmlyb25tZW50Q29uc3RhbnRFeHByZXNzaW9uIHsKICBTdHJpbmdGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb24oCiAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBuYW1lLCBDb25zdGFudEV4cHJlc3Npb24gZGVmYXVsdFZhbHVlKQogICAgICA6IHN1cGVyKG5hbWUsIGRlZmF1bHRWYWx1ZSk7CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgewogICAgcmV0dXJuIENvbnN0YW50RXhwcmVzc2lvbktpbmQuU1RSSU5HX0ZST01fRU5WSVJPTk1FTlQ7CiAgfQoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yLCBbY29udGV4dF0pIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0U3RyaW5nRnJvbUVudmlyb25tZW50KHRoaXMsIGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfY3JlYXRlU3RydWN0dXJlZFRleHQoU3RyaW5nQnVmZmVyIHNiKSB7CiAgICBzYi53cml0ZSgnU3RyaW5nLmZyb21FbnZpcm9ubWVudChuYW1lPScpOwogICAgbmFtZS5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgc2Iud3JpdGUoJyxkZWZhdWx0VmFsdWU9Jyk7CiAgICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKICAgICAgZGVmYXVsdFZhbHVlLl9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChzYik7CiAgICB9IGVsc2UgewogICAgICBzYi53cml0ZSgnbnVsbCcpOwogICAgfQogICAgc2Iud3JpdGUoJyknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICBDb25zdGFudFZhbHVlIG5hbWVDb25zdGFudFZhbHVlID0gbmFtZS5ldmFsdWF0ZShlbnZpcm9ubWVudCk7CiAgICBDb25zdGFudFZhbHVlIGRlZmF1bHRDb25zdGFudFZhbHVlOwogICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7CiAgICAgIGRlZmF1bHRDb25zdGFudFZhbHVlID0gZGVmYXVsdFZhbHVlLmV2YWx1YXRlKGVudmlyb25tZW50KTsKICAgIH0gZWxzZSB7CiAgICAgIGRlZmF1bHRDb25zdGFudFZhbHVlID0gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZU51bGwoKTsKICAgIH0KICAgIGlmICghbmFtZUNvbnN0YW50VmFsdWUuaXNDb25zdGFudCB8fCAhZGVmYXVsdENvbnN0YW50VmFsdWUuaXNDb25zdGFudCkgewogICAgICByZXR1cm4gbmV3IE5vbkNvbnN0YW50VmFsdWUoKTsKICAgIH0KICAgIGJvb2wgaXNWYWxpZCA9CiAgICAgICAgX2NoZWNrTmFtZUZyb21FbnZpcm9ubWVudChlbnZpcm9ubWVudCwgbmFtZSwgbmFtZUNvbnN0YW50VmFsdWUpOwogICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7CiAgICAgIGlmICghZGVmYXVsdENvbnN0YW50VmFsdWUuaXNTdHJpbmcgJiYgIWRlZmF1bHRDb25zdGFudFZhbHVlLmlzTnVsbCkgewogICAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKGRlZmF1bHRWYWx1ZSwKICAgICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9TVFJJTkdfRlJPTV9FTlZJUk9OTUVOVF9ERUZBVUxUX1ZBTFVFX1RZUEUsIHsKICAgICAgICAgICdjb25zdGFudCc6IGRlZmF1bHRWYWx1ZSwKICAgICAgICAgICd0eXBlJzogZGVmYXVsdENvbnN0YW50VmFsdWUuZ2V0VHlwZShlbnZpcm9ubWVudC5jb21tb25FbGVtZW50cykKICAgICAgICB9KTsKICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmIChpc1ZhbGlkKSB7CiAgICAgIFN0cmluZ0NvbnN0YW50VmFsdWUgbmFtZVN0cmluZ0NvbnN0YW50VmFsdWUgPSBuYW1lQ29uc3RhbnRWYWx1ZTsKICAgICAgU3RyaW5nIHRleHQgPQogICAgICAgICAgZW52aXJvbm1lbnQucmVhZEZyb21FbnZpcm9ubWVudChuYW1lU3RyaW5nQ29uc3RhbnRWYWx1ZS5zdHJpbmdWYWx1ZSk7CiAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKICAgICAgICByZXR1cm4gZGVmYXVsdENvbnN0YW50VmFsdWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5jcmVhdGVTdHJpbmcodGV4dCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgTm9uQ29uc3RhbnRWYWx1ZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIGFwcGx5KE5vcm1hbGl6ZWRBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IFN0cmluZ0Zyb21FbnZpcm9ubWVudENvbnN0YW50RXhwcmVzc2lvbihuYW1lLmFwcGx5KGFyZ3VtZW50cyksCiAgICAgICAgZGVmYXVsdFZhbHVlICE9IG51bGwgPyBkZWZhdWx0VmFsdWUuYXBwbHkoYXJndW1lbnRzKSA6IG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXRLbm93blR5cGUoQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpID0+CiAgICAgIGNvbW1vbkVsZW1lbnRzLnN0cmluZ1R5cGU7Cn0KCmNsYXNzIEFzc2VydENvbnN0YW50RXhwcmVzc2lvbiBleHRlbmRzIENvbnN0YW50RXhwcmVzc2lvbiB7CiAgZmluYWwgQ29uc3RhbnRFeHByZXNzaW9uIGNvbmRpdGlvbjsKICBmaW5hbCBDb25zdGFudEV4cHJlc3Npb24gbWVzc2FnZTsKCiAgQXNzZXJ0Q29uc3RhbnRFeHByZXNzaW9uKHRoaXMuY29uZGl0aW9uLCB0aGlzLm1lc3NhZ2UpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IENvbnN0YW50RXhwcmVzc2lvbktpbmQuQVNTRVJUOwoKICBAb3ZlcnJpZGUKICBib29sIF9lcXVhbHMoQXNzZXJ0Q29uc3RhbnRFeHByZXNzaW9uIG90aGVyKSB7CiAgICByZXR1cm4gY29uZGl0aW9uID09IG90aGVyLmNvbmRpdGlvbiAmJiBtZXNzYWdlID09IG90aGVyLm1lc3NhZ2U7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgX2NvbXB1dGVIYXNoQ29kZSgpIHsKICAgIHJldHVybiAxMyAqIGNvbmRpdGlvbi5oYXNoQ29kZSArIDE3ICogbWVzc2FnZS5oYXNoQ29kZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KFN0cmluZ0J1ZmZlciBzYikgewogICAgc2Iud3JpdGUoJ2Fzc2VydCgnKTsKICAgIGNvbmRpdGlvbi5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgc2Iud3JpdGUoJyxtZXNzYWdlPScpOwogICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewogICAgICBtZXNzYWdlLl9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChzYik7CiAgICB9IGVsc2UgewogICAgICBzYi53cml0ZSgnbnVsbCcpOwogICAgfQogICAgc2Iud3JpdGUoJyknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICBDb25zdGFudFZhbHVlIGNvbmRpdGlvblZhbHVlID0gY29uZGl0aW9uLmV2YWx1YXRlKGVudmlyb25tZW50KTsKICAgIGJvb2wgdmFsaWRBc3NlcnQ7CiAgICBpZiAoZW52aXJvbm1lbnQuZW5hYmxlQXNzZXJ0aW9ucykgewogICAgICAvLyBCb29sZWFuIGNvbnZlcnNpb246CiAgICAgIHZhbGlkQXNzZXJ0ID0KICAgICAgICAgIGNvbmRpdGlvblZhbHVlIGlzIEJvb2xDb25zdGFudFZhbHVlICYmIGNvbmRpdGlvblZhbHVlLmJvb2xWYWx1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHZhbGlkQXNzZXJ0ID0gdHJ1ZTsKICAgIH0KICAgIGlmICghdmFsaWRBc3NlcnQpIHsKICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewogICAgICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBtZXNzYWdlLmV2YWx1YXRlKGVudmlyb25tZW50KTsKICAgICAgICBpZiAodmFsdWUgaXMgU3RyaW5nQ29uc3RhbnRWYWx1ZSkgewogICAgICAgICAgU3RyaW5nIHRleHQgPSAnJHt2YWx1ZS5zdHJpbmdWYWx1ZX0nOwogICAgICAgICAgZW52aXJvbm1lbnQucmVwb3J0RXJyb3IodGhpcywKICAgICAgICAgICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0FTU0VSVF9WQUxVRV9NRVNTQUdFLCB7J21lc3NhZ2UnOiB0ZXh0fSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKHRoaXMsIE1lc3NhZ2VLaW5kLklOVkFMSURfQVNTRVJUX1ZBTFVFLAogICAgICAgICAgICAgIHsnYXNzZXJ0aW9uJzogY29uZGl0aW9uLnRvRGFydFRleHQoKX0pOwogICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVwb3J0IGludmFsaWQgY29uc3RhbnQgbWVzc2FnZT8KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZW52aXJvbm1lbnQucmVwb3J0RXJyb3IodGhpcywgTWVzc2FnZUtpbmQuSU5WQUxJRF9BU1NFUlRfVkFMVUUsCiAgICAgICAgICAgIHsnYXNzZXJ0aW9uJzogY29uZGl0aW9uLnRvRGFydFRleHQoKX0pOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgTm9uQ29uc3RhbnRWYWx1ZSgpOwogICAgfQoKICAgIC8vIFJldHVybiBhIHZhbGlkIGNvbnN0YW50IHZhbHVlIHRvIHNpZ25hbCB0aGF0IGFzc2VydGlvbiBkaWRuJ3QgZmFpbC4KICAgIHJldHVybiBuZXcgTnVsbENvbnN0YW50VmFsdWUoKTsKICB9CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IsIFtjb250ZXh0XSkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRBc3NlcnQodGhpcywgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gYXBwbHkoTm9ybWFsaXplZEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBuZXcgQXNzZXJ0Q29uc3RhbnRFeHByZXNzaW9uKAogICAgICAgIGNvbmRpdGlvbi5hcHBseShhcmd1bWVudHMpLCBtZXNzYWdlPy5hcHBseShhcmd1bWVudHMpKTsKICB9Cn0KCmNsYXNzIEluc3RhbnRpYXRpb25Db25zdGFudEV4cHJlc3Npb24gZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb24gewogIGZpbmFsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHM7CiAgZmluYWwgQ29uc3RhbnRFeHByZXNzaW9uIGV4cHJlc3Npb247CgogIEluc3RhbnRpYXRpb25Db25zdGFudEV4cHJlc3Npb24odGhpcy50eXBlQXJndW1lbnRzLCB0aGlzLmV4cHJlc3Npb24pOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IENvbnN0YW50RXhwcmVzc2lvbktpbmQuSU5TVEFOVElBVElPTjsKCiAgQG92ZXJyaWRlCiAgdm9pZCBfY3JlYXRlU3RydWN0dXJlZFRleHQoU3RyaW5nQnVmZmVyIHNiKSB7CiAgICBzYi53cml0ZSgnSW5zdGFudGlhdGlvbih0eXBlQXJndW1lbnRzPSR0eXBlQXJndW1lbnRzLGV4cHJlc3Npb249Jyk7CiAgICBleHByZXNzaW9uLl9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChzYik7CiAgICBzYi53cml0ZSgnKScpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHNJbkNvbnRleHQgPQogICAgICAgIHR5cGVBcmd1bWVudHMubWFwKGVudmlyb25tZW50LmdldFR5cGVJbkNvbnRleHQpLnRvTGlzdCgpOwogICAgcmV0dXJuIG5ldyBJbnN0YW50aWF0aW9uQ29uc3RhbnRWYWx1ZSgKICAgICAgICB0eXBlQXJndW1lbnRzSW5Db250ZXh0LCBleHByZXNzaW9uLmV2YWx1YXRlKGVudmlyb25tZW50KSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgX2NvbXB1dGVIYXNoQ29kZSgpIHsKICAgIHJldHVybiBIYXNoaW5nLm9iamVjdEhhc2goZXhwcmVzc2lvbiwgSGFzaGluZy5saXN0SGFzaCh0eXBlQXJndW1lbnRzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gYXBwbHkoTm9ybWFsaXplZEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBuZXcgSW5zdGFudGlhdGlvbkNvbnN0YW50RXhwcmVzc2lvbigKICAgICAgICB0eXBlQXJndW1lbnRzLCBleHByZXNzaW9uLmFwcGx5KGFyZ3VtZW50cykpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBfZXF1YWxzKEluc3RhbnRpYXRpb25Db25zdGFudEV4cHJlc3Npb24gb3RoZXIpIHsKICAgIHJldHVybiBlcXVhbEVsZW1lbnRzKHR5cGVBcmd1bWVudHMsIG90aGVyLnR5cGVBcmd1bWVudHMpICYmCiAgICAgICAgZXhwcmVzc2lvbiA9PSBvdGhlci5leHByZXNzaW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvciwgW2NvbnRleHRdKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEluc3RhbnRpYXRpb24odGhpcywgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1BvdGVudGlhbCB7CiAgICByZXR1cm4gZXhwcmVzc2lvbi5pc1BvdGVudGlhbDsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3I8UiwgQT4gewogIGNvbnN0IENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3IoKTsKCiAgUiB2aXNpdChDb25zdGFudEV4cHJlc3Npb24gY29uc3RhbnQsIEEgY29udGV4dCkgewogICAgcmV0dXJuIGNvbnN0YW50LmFjY2VwdCh0aGlzLCBjb250ZXh0KTsKICB9CgogIFIgdmlzaXRBcyhBc0NvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdEJvb2woQm9vbENvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdEludChJbnRDb25zdGFudEV4cHJlc3Npb24gZXhwLCBBIGNvbnRleHQpOwogIFIgdmlzaXREb3VibGUoRG91YmxlQ29uc3RhbnRFeHByZXNzaW9uIGV4cCwgQSBjb250ZXh0KTsKICBSIHZpc2l0U3RyaW5nKFN0cmluZ0NvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdE51bGwoTnVsbENvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdExpc3QoTGlzdENvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdFNldChTZXRDb25zdGFudEV4cHJlc3Npb24gZXhwLCBBIGNvbnRleHQpOwogIFIgdmlzaXRNYXAoTWFwQ29uc3RhbnRFeHByZXNzaW9uIGV4cCwgQSBjb250ZXh0KTsKICBSIHZpc2l0Q29uc3RydWN0ZWQoQ29uc3RydWN0ZWRDb25zdGFudEV4cHJlc3Npb24gZXhwLCBBIGNvbnRleHQpOwogIFIgdmlzaXRDb25jYXRlbmF0ZShDb25jYXRlbmF0ZUNvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdFN5bWJvbChTeW1ib2xDb25zdGFudEV4cHJlc3Npb24gZXhwLCBBIGNvbnRleHQpOwogIFIgdmlzaXRUeXBlKFR5cGVDb25zdGFudEV4cHJlc3Npb24gZXhwLCBBIGNvbnRleHQpOwogIFIgdmlzaXRMb2NhbFZhcmlhYmxlKExvY2FsVmFyaWFibGVDb25zdGFudEV4cHJlc3Npb24gZXhwLCBBIGNvbnRleHQpOwogIFIgdmlzaXRGaWVsZChGaWVsZENvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdEZ1bmN0aW9uKEZ1bmN0aW9uQ29uc3RhbnRFeHByZXNzaW9uIGV4cCwgQSBjb250ZXh0KTsKICBSIHZpc2l0QmluYXJ5KEJpbmFyeUNvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdElkZW50aWNhbChJZGVudGljYWxDb25zdGFudEV4cHJlc3Npb24gZXhwLCBBIGNvbnRleHQpOwogIFIgdmlzaXRVbmFyeShVbmFyeUNvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdFN0cmluZ0xlbmd0aChTdHJpbmdMZW5ndGhDb25zdGFudEV4cHJlc3Npb24gZXhwLCBBIGNvbnRleHQpOwogIFIgdmlzaXRDb25kaXRpb25hbChDb25kaXRpb25hbENvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdEJvb2xGcm9tRW52aXJvbm1lbnQoCiAgICAgIEJvb2xGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb24gZXhwLCBBIGNvbnRleHQpOwogIFIgdmlzaXRJbnRGcm9tRW52aXJvbm1lbnQoCiAgICAgIEludEZyb21FbnZpcm9ubWVudENvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdFN0cmluZ0Zyb21FbnZpcm9ubWVudCgKICAgICAgU3RyaW5nRnJvbUVudmlyb25tZW50Q29uc3RhbnRFeHByZXNzaW9uIGV4cCwgQSBjb250ZXh0KTsKICBSIHZpc2l0QXNzZXJ0KEFzc2VydENvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdEluc3RhbnRpYXRpb24oSW5zdGFudGlhdGlvbkNvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CgogIFIgdmlzaXRQb3NpdGlvbmFsKFBvc2l0aW9uYWxBcmd1bWVudFJlZmVyZW5jZSBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdE5hbWVkKE5hbWVkQXJndW1lbnRSZWZlcmVuY2UgZXhwLCBBIGNvbnRleHQpOwp9CgpjbGFzcyBDb25zdEV4cFByaW50ZXIgZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb25WaXNpdG9yIHsKICBmaW5hbCBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CgogIHZvaWQgd3JpdGUoQ29uc3RhbnRFeHByZXNzaW9uIHBhcmVudCwgQ29uc3RhbnRFeHByZXNzaW9uIGNoaWxkLAogICAgICB7Ym9vbCBsZWZ0QXNzb2NpYXRpdmU6IHRydWV9KSB7CiAgICBpZiAoY2hpbGQucHJlY2VkZW5jZSA8IHBhcmVudC5wcmVjZWRlbmNlIHx8CiAgICAgICAgIWxlZnRBc3NvY2lhdGl2ZSAmJiBjaGlsZC5wcmVjZWRlbmNlID09IHBhcmVudC5wcmVjZWRlbmNlKSB7CiAgICAgIHNiLndyaXRlKCcoJyk7CiAgICAgIGNoaWxkLmFjY2VwdCh0aGlzKTsKICAgICAgc2Iud3JpdGUoJyknKTsKICAgIH0gZWxzZSB7CiAgICAgIGNoaWxkLmFjY2VwdCh0aGlzKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVUeXBlQXJndW1lbnRzKEludGVyZmFjZVR5cGUgdHlwZSkgewogICAgaWYgKHR5cGUudHJlYXRBc1JhdykgcmV0dXJuOwogICAgc2Iud3JpdGUoJzwnKTsKICAgIGJvb2wgbmVlZHNDb21tYSA9IGZhbHNlOwogICAgZm9yIChEYXJ0VHlwZSB2YWx1ZSBpbiB0eXBlLnR5cGVBcmd1bWVudHMpIHsKICAgICAgaWYgKG5lZWRzQ29tbWEpIHsKICAgICAgICBzYi53cml0ZSgnLCAnKTsKICAgICAgfQogICAgICBzYi53cml0ZSh2YWx1ZSk7CiAgICAgIG5lZWRzQ29tbWEgPSB0cnVlOwogICAgfQogICAgc2Iud3JpdGUoJz4nKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXQoQ29uc3RhbnRFeHByZXNzaW9uIGNvbnN0YW50LCBbX10pIHsKICAgIHJldHVybiBjb25zdGFudC5hY2NlcHQodGhpcywgbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXMoQXNDb25zdGFudEV4cHJlc3Npb24gZXhwLCBbX10pIHsKICAgIHZpc2l0KGV4cC5leHByZXNzaW9uKTsKICAgIHNiLndyaXRlKCcgYXMgJyk7CiAgICBzYi53cml0ZShleHAudHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Qm9vbChCb29sQ29uc3RhbnRFeHByZXNzaW9uIGV4cCwgW19dKSB7CiAgICBzYi53cml0ZShleHAuYm9vbFZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREb3VibGUoRG91YmxlQ29uc3RhbnRFeHByZXNzaW9uIGV4cCwgW19dKSB7CiAgICBzYi53cml0ZShleHAuZG91YmxlVmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludChJbnRDb25zdGFudEV4cHJlc3Npb24gZXhwLCBbX10pIHsKICAgIHNiLndyaXRlKGV4cC5pbnRWYWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TnVsbChOdWxsQ29uc3RhbnRFeHByZXNzaW9uIGV4cCwgW19dKSB7CiAgICBzYi53cml0ZShudWxsKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdHJpbmcoU3RyaW5nQ29uc3RhbnRFeHByZXNzaW9uIGV4cCwgW19dKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBFbnN1cmUgY29ycmVjdCBlc2NhcGluZy4KICAgIHNiLndyaXRlKCciJHtleHAuc3RyaW5nVmFsdWV9IicpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExpc3QoTGlzdENvbnN0YW50RXhwcmVzc2lvbiBleHAsIFtfXSkgewogICAgc2Iud3JpdGUoJ2NvbnN0ICcpOwogICAgd3JpdGVUeXBlQXJndW1lbnRzKGV4cC50eXBlKTsKICAgIHNiLndyaXRlKCdbJyk7CiAgICBib29sIG5lZWRzQ29tbWEgPSBmYWxzZTsKICAgIGZvciAoQ29uc3RhbnRFeHByZXNzaW9uIHZhbHVlIGluIGV4cC52YWx1ZXMpIHsKICAgICAgaWYgKG5lZWRzQ29tbWEpIHsKICAgICAgICBzYi53cml0ZSgnLCAnKTsKICAgICAgfQogICAgICB2aXNpdCh2YWx1ZSk7CiAgICAgIG5lZWRzQ29tbWEgPSB0cnVlOwogICAgfQogICAgc2Iud3JpdGUoJ10nKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTZXQoU2V0Q29uc3RhbnRFeHByZXNzaW9uIGV4cCwgW19dKSB7CiAgICBzYi53cml0ZSgnY29uc3QgJyk7CiAgICB3cml0ZVR5cGVBcmd1bWVudHMoZXhwLnR5cGUpOwogICAgc2Iud3JpdGUoJ3snKTsKICAgIHNiLndyaXRlQWxsKGV4cC52YWx1ZXMsICcsICcpOwogICAgc2Iud3JpdGUoJ30nKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRNYXAoTWFwQ29uc3RhbnRFeHByZXNzaW9uIGV4cCwgW19dKSB7CiAgICBzYi53cml0ZSgnY29uc3QgJyk7CiAgICB3cml0ZVR5cGVBcmd1bWVudHMoZXhwLnR5cGUpOwogICAgc2Iud3JpdGUoJ3snKTsKICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBleHAua2V5cy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgaWYgKGluZGV4ID4gMCkgewogICAgICAgIHNiLndyaXRlKCcsICcpOwogICAgICB9CiAgICAgIHZpc2l0KGV4cC5rZXlzW2luZGV4XSk7CiAgICAgIHNiLndyaXRlKCc6ICcpOwogICAgICB2aXNpdChleHAudmFsdWVzW2luZGV4XSk7CiAgICB9CiAgICBzYi53cml0ZSgnfScpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbnN0cnVjdGVkKENvbnN0cnVjdGVkQ29uc3RhbnRFeHByZXNzaW9uIGV4cCwgW19dKSB7CiAgICBzYi53cml0ZSgnY29uc3QgJyk7CiAgICBzYi53cml0ZShleHAudGFyZ2V0LmVuY2xvc2luZ0NsYXNzLm5hbWUpOwogICAgd3JpdGVUeXBlQXJndW1lbnRzKGV4cC50eXBlKTsKICAgIGlmIChleHAudGFyZ2V0Lm5hbWUgIT0gJycpIHsKICAgICAgc2Iud3JpdGUoJy4nKTsKICAgICAgc2Iud3JpdGUoZXhwLnRhcmdldC5uYW1lKTsKICAgIH0KICAgIHNiLndyaXRlKCcoJyk7CiAgICBib29sIG5lZWRzQ29tbWEgPSBmYWxzZTsKCiAgICBpbnQgbmFtZWRPZmZzZXQgPSBleHAuY2FsbFN0cnVjdHVyZS5wb3NpdGlvbmFsQXJndW1lbnRDb3VudDsKICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBuYW1lZE9mZnNldDsgaW5kZXgrKykgewogICAgICBpZiAobmVlZHNDb21tYSkgewogICAgICAgIHNiLndyaXRlKCcsICcpOwogICAgICB9CiAgICAgIHZpc2l0KGV4cC5hcmd1bWVudHNbaW5kZXhdKTsKICAgICAgbmVlZHNDb21tYSA9IHRydWU7CiAgICB9CiAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZXhwLmNhbGxTdHJ1Y3R1cmUubmFtZWRBcmd1bWVudENvdW50OyBpbmRleCsrKSB7CiAgICAgIGlmIChuZWVkc0NvbW1hKSB7CiAgICAgICAgc2Iud3JpdGUoJywgJyk7CiAgICAgIH0KICAgICAgc2Iud3JpdGUoZXhwLmNhbGxTdHJ1Y3R1cmUubmFtZWRBcmd1bWVudHNbaW5kZXhdKTsKICAgICAgc2Iud3JpdGUoJzogJyk7CiAgICAgIHZpc2l0KGV4cC5hcmd1bWVudHNbbmFtZWRPZmZzZXQgKyBpbmRleF0pOwogICAgICBuZWVkc0NvbW1hID0gdHJ1ZTsKICAgIH0KICAgIHNiLndyaXRlKCcpJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29uY2F0ZW5hdGUoQ29uY2F0ZW5hdGVDb25zdGFudEV4cHJlc3Npb24gZXhwLCBbX10pIHsKICAgIHNiLndyaXRlKCciJyk7CiAgICBmb3IgKENvbnN0YW50RXhwcmVzc2lvbiBleHByZXNzaW9uIGluIGV4cC5leHByZXNzaW9ucykgewogICAgICBpZiAoZXhwcmVzc2lvbi5raW5kID09IENvbnN0YW50RXhwcmVzc2lvbktpbmQuU1RSSU5HKSB7CiAgICAgICAgU3RyaW5nQ29uc3RhbnRFeHByZXNzaW9uIHN0cmluZyA9IGV4cHJlc3Npb247CiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogRW5zdXJlIGNvcnJlY3QgZXNjYXBpbmcuCiAgICAgICAgc2Iud3JpdGUoJyR7c3RyaW5nLnN0cmluZ1ZhbHVlfScpOwogICAgICB9IGVsc2UgewogICAgICAgIHNiLndyaXRlKHIiJHsiKTsKICAgICAgICB2aXNpdChleHByZXNzaW9uKTsKICAgICAgICBzYi53cml0ZSgifSIpOwogICAgICB9CiAgICB9CiAgICBzYi53cml0ZSgnIicpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN5bWJvbChTeW1ib2xDb25zdGFudEV4cHJlc3Npb24gZXhwLCBbX10pIHsKICAgIHNiLndyaXRlKCcjJyk7CiAgICBzYi53cml0ZShleHAubmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZShUeXBlQ29uc3RhbnRFeHByZXNzaW9uIGV4cCwgW19dKSB7CiAgICBzYi53cml0ZShleHAubmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RmllbGQoRmllbGRDb25zdGFudEV4cHJlc3Npb24gZXhwLCBbX10pIHsKICAgIGlmIChleHAuZWxlbWVudC5pc1N0YXRpYykgewogICAgICBzYi53cml0ZShleHAuZWxlbWVudC5lbmNsb3NpbmdDbGFzcy5uYW1lKTsKICAgICAgc2Iud3JpdGUoJy4nKTsKICAgIH0KICAgIHNiLndyaXRlKGV4cC5lbGVtZW50Lm5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExvY2FsVmFyaWFibGUoTG9jYWxWYXJpYWJsZUNvbnN0YW50RXhwcmVzc2lvbiBleHAsIFtfXSkgewogICAgc2Iud3JpdGUoZXhwLmVsZW1lbnQubmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RnVuY3Rpb24oRnVuY3Rpb25Db25zdGFudEV4cHJlc3Npb24gZXhwLCBbX10pIHsKICAgIGlmIChleHAuZWxlbWVudC5pc1N0YXRpYykgewogICAgICBzYi53cml0ZShleHAuZWxlbWVudC5lbmNsb3NpbmdDbGFzcy5uYW1lKTsKICAgICAgc2Iud3JpdGUoJy4nKTsKICAgIH0KICAgIHNiLndyaXRlKGV4cC5lbGVtZW50Lm5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJpbmFyeShCaW5hcnlDb25zdGFudEV4cHJlc3Npb24gZXhwLCBbX10pIHsKICAgIHdyaXRlKGV4cCwgZXhwLmxlZnQpOwogICAgc2Iud3JpdGUoJyAnKTsKICAgIHNiLndyaXRlKGV4cC5vcGVyYXRvci5uYW1lKTsKICAgIHNiLndyaXRlKCcgJyk7CiAgICB3cml0ZShleHAsIGV4cC5yaWdodCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SWRlbnRpY2FsKElkZW50aWNhbENvbnN0YW50RXhwcmVzc2lvbiBleHAsIFtfXSkgewogICAgc2Iud3JpdGUoJ2lkZW50aWNhbCgnKTsKICAgIHZpc2l0KGV4cC5sZWZ0KTsKICAgIHNiLndyaXRlKCcsICcpOwogICAgdmlzaXQoZXhwLnJpZ2h0KTsKICAgIHNiLndyaXRlKCcpJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VW5hcnkoVW5hcnlDb25zdGFudEV4cHJlc3Npb24gZXhwLCBbX10pIHsKICAgIHNiLndyaXRlKGV4cC5vcGVyYXRvcik7CiAgICB3cml0ZShleHAsIGV4cC5leHByZXNzaW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdHJpbmdMZW5ndGgoU3RyaW5nTGVuZ3RoQ29uc3RhbnRFeHByZXNzaW9uIGV4cCwgW19dKSB7CiAgICB3cml0ZShleHAsIGV4cC5leHByZXNzaW9uLCBsZWZ0QXNzb2NpYXRpdmU6IGZhbHNlKTsKICAgIHNiLndyaXRlKCcubGVuZ3RoJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29uZGl0aW9uYWwoQ29uZGl0aW9uYWxDb25zdGFudEV4cHJlc3Npb24gZXhwLCBbX10pIHsKICAgIHdyaXRlKGV4cCwgZXhwLmNvbmRpdGlvbiwgbGVmdEFzc29jaWF0aXZlOiBmYWxzZSk7CiAgICBzYi53cml0ZSgnID8gJyk7CiAgICB3cml0ZShleHAsIGV4cC50cnVlRXhwKTsKICAgIHNiLndyaXRlKCcgOiAnKTsKICAgIHdyaXRlKGV4cCwgZXhwLmZhbHNlRXhwKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRQb3NpdGlvbmFsKFBvc2l0aW9uYWxBcmd1bWVudFJlZmVyZW5jZSBleHAsIFtfXSkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWF5YmUgdGhpcyBzaG91bGQgdGhyb3cuCiAgICBzYi53cml0ZSgnYXJnc1ske2V4cC5pbmRleH1dJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TmFtZWQoTmFtZWRBcmd1bWVudFJlZmVyZW5jZSBleHAsIFtfXSkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWF5YmUgdGhpcyBzaG91bGQgdGhyb3cuCiAgICBzYi53cml0ZSgnYXJnc1ske2V4cC5uYW1lfV0nKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCb29sRnJvbUVudmlyb25tZW50KEJvb2xGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb24gZXhwLAogICAgICBbX10pIHsKICAgIHNiLndyaXRlKCdjb25zdCBib29sLmZyb21FbnZpcm9ubWVudCgnKTsKICAgIHZpc2l0KGV4cC5uYW1lKTsKICAgIGlmIChleHAuZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJywgZGVmYXVsdFZhbHVlOiAnKTsKICAgICAgdmlzaXQoZXhwLmRlZmF1bHRWYWx1ZSk7CiAgICB9CiAgICBzYi53cml0ZSgnKScpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludEZyb21FbnZpcm9ubWVudChJbnRGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb24gZXhwLCBbX10pIHsKICAgIHNiLndyaXRlKCdjb25zdCBpbnQuZnJvbUVudmlyb25tZW50KCcpOwogICAgdmlzaXQoZXhwLm5hbWUpOwogICAgaWYgKGV4cC5kZWZhdWx0VmFsdWUgIT0gbnVsbCkgewogICAgICBzYi53cml0ZSgnLCBkZWZhdWx0VmFsdWU6ICcpOwogICAgICB2aXNpdChleHAuZGVmYXVsdFZhbHVlKTsKICAgIH0KICAgIHNiLndyaXRlKCcpJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RyaW5nRnJvbUVudmlyb25tZW50KFN0cmluZ0Zyb21FbnZpcm9ubWVudENvbnN0YW50RXhwcmVzc2lvbiBleHAsCiAgICAgIFtfXSkgewogICAgc2Iud3JpdGUoJ2NvbnN0IFN0cmluZy5mcm9tRW52aXJvbm1lbnQoJyk7CiAgICB2aXNpdChleHAubmFtZSk7CiAgICBpZiAoZXhwLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCcsIGRlZmF1bHRWYWx1ZTogJyk7CiAgICAgIHZpc2l0KGV4cC5kZWZhdWx0VmFsdWUpOwogICAgfQogICAgc2Iud3JpdGUoJyknKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRBc3NlcnQoQXNzZXJ0Q29uc3RhbnRFeHByZXNzaW9uIGV4cCwgW19dKSB7CiAgICBzYi53cml0ZSgnYXNzZXJ0KCcpOwogICAgdmlzaXQoZXhwLmNvbmRpdGlvbik7CiAgICBpZiAoZXhwLm1lc3NhZ2UgIT0gbnVsbCkgewogICAgICBzYi53cml0ZSgnLCAnKTsKICAgICAgdmlzaXQoZXhwLm1lc3NhZ2UpOwogICAgfQogICAgc2Iud3JpdGUoJyknKTsK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FSEGEx0BQTgYGAgjGQZRGBgIORYxGQYTBAEMQhM9PjY5Kw8ZGxcIBhMEAQw4ExgEAQw0GAQBDDYgMRUGIAQBDEYgBAEMPCAxFQYgBAEMOBoTIRMbBAEMPhwVFBYTBAEMNhwgBAEMRDgZBAEMQjcVHRUeBAEMPzUkBAEMNTUjBAEMSw0tFSQkHwYTBAEMUCwVJCQfBhMEAQxPDS8VJCQfBhMEAQw4GRofFhoGEwQBDEYTLBQbEwQBDCYCAS9wYWNrYWdlOmNvbXBpbGVyL3NyYy9jb25zdGFudHMvZXhwcmVzc2lvbnMuZGFydDFzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pby9jb2RlX291dHB1dC5kYXJ0m9AvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmNvZGVfb3V0cHV0OwoKaW1wb3J0ICcuLi8uLi9jb21waWxlcl9uZXcuZGFydCc7CmltcG9ydCAnc291cmNlX2luZm9ybWF0aW9uLmRhcnQnOwoKLy8vIExpc3RlbmVyIGludGVyZmFjZSBmb3IgW0NvZGVPdXRwdXRdIGFjdGl2aXR5LgphYnN0cmFjdCBjbGFzcyBDb2RlT3V0cHV0TGlzdGVuZXIgewogIC8vLyBDYWxsZWQgd2hlbiBbdGV4dF0gaXMgYWRkZWQgdG8gdGhlIG91dHB1dC4KICB2b2lkIG9uVGV4dChTdHJpbmcgdGV4dCk7CgogIC8vLyBDYWxsZWQgd2hlbiB0aGUgb3V0cHV0IGlzIGNsb3NlZCB3aXRoIGEgZmluYWwgbGVuZ3RoIG9mIFtsZW5ndGhdLgogIHZvaWQgb25Eb25lKGludCBsZW5ndGgpOwp9CgovLy8gSW50ZXJmYWNlIGZvciBhIG1hcHBpbmcgb2YgdGFyZ2V0IG9mZnNldHMgdG8gc291cmNlIGxvY2F0aW9ucyBhbmQgZm9yCi8vLyB0cmFja2luZyBpbmxpbmluZyBmcmFtZSBkYXRhLgovLy8KLy8vIFNvdXJjZS1sb2NhdGlvbiBtYXBwaW5nIGlzIHVzZWQgdG8gYnVpbGQgc3RhbmRhcmQgc291cmNlLW1hcHMgZmlsZXMuCi8vLyBJbmxpbmluZyBmcmFtZXMgaXMgdXNlZCB0byBhdHRhY2ggYW4gZXh0ZW5zaW9uIHRvIHNvdXJjZS1tYXAgZmlsZXMgdG8KLy8vIGltcHJvdmUgZGVvYmZ1c2NhdGlvbiBvZiBwcm9kdWN0aW9uIHN0YWNrIHRyYWNlcy4KYWJzdHJhY3QgY2xhc3MgU291cmNlTG9jYXRpb25zIHsKICAvLy8gVGhlIG5hbWUgaWRlbnRpZnlpbmcgdGhpcyBzb3VyY2UgbWFwcGluZy4KICBTdHJpbmcgZ2V0IG5hbWU7CgogIC8vLyBBZGRzIGEgW3NvdXJjZUxvY2F0aW9uXSBhdCB0aGUgc3BlY2lmaWVkIFt0YXJnZXRPZmZzZXRdLgogIHZvaWQgYWRkU291cmNlTG9jYXRpb24oaW50IHRhcmdldE9mZnNldCwgU291cmNlTG9jYXRpb24gc291cmNlUG9zaXRpb24pOwoKICAvLy8gUmVjb3JkIGFuIGlubGluaW5nIGNhbGwgYXQgdGhlIFt0YXJnZXRPZmZzZXRdLgogIC8vLwogIC8vLyBUaGUgaW5saW5pbmcgY2FsbC1zaXRlIHdhcyBtYWRlIGZyb20gW3B1c2hMb2NhdGlvbl0gYW5kIGNhbGxzCiAgLy8vIFtpbmxpbmVkTWV0aG9kTmFtZV0uCiAgdm9pZCBhZGRQdXNoKAogICAgICBpbnQgdGFyZ2V0T2Zmc2V0LCBTb3VyY2VMb2NhdGlvbiBwdXNoUG9zaXRpb24sIFN0cmluZyBpbmxpbmVkTWV0aG9kTmFtZSk7CgogIC8vLyBSZWNvcmQgYSByZXR1cm4gb2YgYW4gaW5saW5pbmcgY2FsbCBhdCB0aGUgW3RhcmdldE9mZnNldF0uCiAgLy8vCiAgLy8vIFtpc0VtcHR5XSBpbmRpY2F0ZXMgdGhhdCB0aGlzIHJldHVybiBhbHNvIG1ha2VzIHRoZSBpbmxpbmluZyBzdGFjayBlbXB0eS4KICB2b2lkIGFkZFBvcChpbnQgdGFyZ2V0T2Zmc2V0LCBib29sIGlzRW1wdHkpOwoKICAvLy8gQXBwbGllcyBbZl0gdG8gZXZlcnkgdGFyZ2V0IG9mZnNldCBhbmQgYXNzb2NpYXRlZCBzb3VyY2UgbG9jYXRpb24uCiAgdm9pZCBmb3JFYWNoU291cmNlTG9jYXRpb24oCiAgICAgIHZvaWQgZihpbnQgdGFyZ2V0T2Zmc2V0LCBTb3VyY2VMb2NhdGlvbiBzb3VyY2VMb2NhdGlvbikpOwoKICAvLy8gUmVjb3JkZWQgaW5saW5pbmcgZGF0YSBwZXIgdGFyZ2V0LW9mZnNldC4KICBNYXA8aW50LCBMaXN0PEZyYW1lRW50cnk+PiBnZXQgZnJhbWVNYXJrZXJzOwp9CgpjbGFzcyBfU291cmNlTG9jYXRpb25zSW1wbCBpbXBsZW1lbnRzIFNvdXJjZUxvY2F0aW9ucyB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgZmluYWwgQWJzdHJhY3RDb2RlT3V0cHV0IGNvZGVPdXRwdXQ7CiAgTWFwPGludCwgTGlzdDxTb3VyY2VMb2NhdGlvbj4+IG1hcmtlcnMgPSA8aW50LCBMaXN0PFNvdXJjZUxvY2F0aW9uPj57fTsKICBAb3ZlcnJpZGUKICBNYXA8aW50LCBMaXN0PEZyYW1lRW50cnk+PiBmcmFtZU1hcmtlcnMgPSA8aW50LCBMaXN0PEZyYW1lRW50cnk+Pnt9OwoKICBfU291cmNlTG9jYXRpb25zSW1wbCh0aGlzLm5hbWUsIHRoaXMuY29kZU91dHB1dCk7CgogIEBvdmVycmlkZQogIHZvaWQgYWRkU291cmNlTG9jYXRpb24oaW50IHRhcmdldE9mZnNldCwgU291cmNlTG9jYXRpb24gc291cmNlTG9jYXRpb24pIHsKICAgIGFzc2VydCh0YXJnZXRPZmZzZXQgPD0gY29kZU91dHB1dC5sZW5ndGgpOwogICAgTGlzdDxTb3VyY2VMb2NhdGlvbj4gc291cmNlTG9jYXRpb25zID0KICAgICAgICBtYXJrZXJzLnB1dElmQWJzZW50KHRhcmdldE9mZnNldCwgKCkgPT4gPFNvdXJjZUxvY2F0aW9uPltdKTsKICAgIHNvdXJjZUxvY2F0aW9ucy5hZGQoc291cmNlTG9jYXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRQdXNoKGludCB0YXJnZXRPZmZzZXQsIFNvdXJjZUxvY2F0aW9uIHNvdXJjZUxvY2F0aW9uLAogICAgICBTdHJpbmcgaW5saW5lZE1ldGhvZE5hbWUpIHsKICAgIGFzc2VydCh0YXJnZXRPZmZzZXQgPD0gY29kZU91dHB1dC5sZW5ndGgpOwogICAgTGlzdDxGcmFtZUVudHJ5PiBmcmFtZXMgPSBmcmFtZU1hcmtlcnNbdGFyZ2V0T2Zmc2V0XSA/Pz0gW107CiAgICBmcmFtZXMuYWRkKG5ldyBGcmFtZUVudHJ5LnB1c2goc291cmNlTG9jYXRpb24sIGlubGluZWRNZXRob2ROYW1lKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZFBvcChpbnQgdGFyZ2V0T2Zmc2V0LCBib29sIGlzRW1wdHkpIHsKICAgIGFzc2VydCh0YXJnZXRPZmZzZXQgPD0gY29kZU91dHB1dC5sZW5ndGgpOwogICAgTGlzdDxGcmFtZUVudHJ5PiBmcmFtZXMgPSBmcmFtZU1hcmtlcnNbdGFyZ2V0T2Zmc2V0XSA/Pz0gW107CiAgICBmcmFtZXMuYWRkKG5ldyBGcmFtZUVudHJ5LnBvcChpc0VtcHR5KSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hTb3VyY2VMb2NhdGlvbigKICAgICAgdm9pZCBmKGludCB0YXJnZXRPZmZzZXQsIFNvdXJjZUxvY2F0aW9uIHNvdXJjZUxvY2F0aW9uKSkgewogICAgbWFya2Vycy5mb3JFYWNoKChpbnQgdGFyZ2V0T2Zmc2V0LCBMaXN0PFNvdXJjZUxvY2F0aW9uPiBzb3VyY2VMb2NhdGlvbnMpIHsKICAgICAgZm9yIChTb3VyY2VMb2NhdGlvbiBzb3VyY2VMb2NhdGlvbiBpbiBzb3VyY2VMb2NhdGlvbnMpIHsKICAgICAgICBmKHRhcmdldE9mZnNldCwgc291cmNlTG9jYXRpb24pOwogICAgICB9CiAgICB9KTsKICB9CgogIHZvaWQgX21lcmdlKF9Tb3VyY2VMb2NhdGlvbnNJbXBsIG90aGVyKSB7CiAgICBhc3NlcnQobmFtZSA9PSBvdGhlci5uYW1lKTsKICAgIGludCBsZW5ndGggPSBjb2RlT3V0cHV0Lmxlbmd0aDsKICAgIGlmIChvdGhlci5tYXJrZXJzLmxlbmd0aCA+IDApIHsKICAgICAgb3RoZXIubWFya2VycwogICAgICAgICAgLmZvckVhY2goKGludCB0YXJnZXRPZmZzZXQsIExpc3Q8U291cmNlTG9jYXRpb24+IHNvdXJjZUxvY2F0aW9ucykgewogICAgICAgIChtYXJrZXJzW2xlbmd0aCArIHRhcmdldE9mZnNldF0gPz89IDxTb3VyY2VMb2NhdGlvbj5bXSkKICAgICAgICAgICAgLmFkZEFsbChzb3VyY2VMb2NhdGlvbnMpOwogICAgICB9KTsKICAgIH0KCiAgICBpZiAob3RoZXIuZnJhbWVNYXJrZXJzLmxlbmd0aCA+IDApIHsKICAgICAgb3RoZXIuZnJhbWVNYXJrZXJzLmZvckVhY2goKGludCB0YXJnZXRPZmZzZXQsIExpc3Q8RnJhbWVFbnRyeT4gZnJhbWVzKSB7CiAgICAgICAgKGZyYW1lTWFya2Vyc1tsZW5ndGggKyB0YXJnZXRPZmZzZXRdID8/PSA8RnJhbWVFbnRyeT5bXSkuYWRkQWxsKGZyYW1lcyk7CiAgICAgIH0pOwogICAgfQogIH0KfQoKYWJzdHJhY3QgY2xhc3MgU291cmNlTG9jYXRpb25zUHJvdmlkZXIgewogIC8vLyBDcmVhdGVzIGEgW1NvdXJjZUxvY2F0aW9uc10gbWFwcGluZyBpZGVudGlmaWVkIGJ5IFtuYW1lXSBhbmQgYXNzb2NpYXRlcwogIC8vLyBpdCB3aXRoIHRoaXMgY29kZSBvdXRwdXQuCiAgU291cmNlTG9jYXRpb25zIGNyZWF0ZVNvdXJjZUxvY2F0aW9ucyhTdHJpbmcgbmFtZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBzb3VyY2UgbG9jYXRpb24gbWFwcGluZ3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29kZSBvdXRwdXQuCiAgSXRlcmFibGU8U291cmNlTG9jYXRpb25zPiBnZXQgc291cmNlTG9jYXRpb25zOwp9CgphYnN0cmFjdCBjbGFzcyBDb2RlT3V0cHV0IGltcGxlbWVudHMgU291cmNlTG9jYXRpb25zUHJvdmlkZXIgewogIC8vLyBXcml0ZSBbdGV4dF0gdG8gdGhpcyBvdXRwdXQuCiAgLy8vCiAgLy8vIElmIHRoZSBvdXRwdXQgaXMgY2xvc2VkLCBhIFtTdGF0ZUVycm9yXSBpcyB0aHJvd24uCiAgdm9pZCBhZGQoU3RyaW5nIHRleHQpOwoKICAvLy8gQWRkcyB0aGUgY29udGVudCBvZiBbYnVmZmVyXSB0byB0aGUgb3V0cHV0IGFuZCBhZGRzIGl0cyBtYXJrZXJzIHRvCiAgLy8vIFttYXJrZXJzXS4KICAvLy8KICAvLy8gSWYgdGhlIG91dHB1dCBpcyBjbG9zZWQsIGEgW1N0YXRlRXJyb3JdIGlzIHRocm93bi4KICB2b2lkIGFkZEJ1ZmZlcihDb2RlQnVmZmVyIGJ1ZmZlcik7CgogIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBjdXJyZW50bHkgd3JpdHRlbiB0byB0aGlzIG91dHB1dC4KICBpbnQgZ2V0IGxlbmd0aDsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHRoaXMgb3V0cHV0IGhhcyBiZWVuIGNsb3NlZC4KICBib29sIGdldCBpc0Nsb3NlZDsKCiAgLy8vIENsb3NlcyB0aGUgb3V0cHV0LiBGdXJ0aGVyIHdyaXRlcyB3aWxsIGNhdXNlIGEgW1N0YXRlRXJyb3JdLgogIHZvaWQgY2xvc2UoKTsKfQoKYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb2RlT3V0cHV0IGV4dGVuZHMgQ29kZU91dHB1dCB7CiAgTWFwPFN0cmluZywgX1NvdXJjZUxvY2F0aW9uc0ltcGw+IHNvdXJjZUxvY2F0aW9uc01hcCA9CiAgICAgIDxTdHJpbmcsIF9Tb3VyY2VMb2NhdGlvbnNJbXBsPnt9OwogIEBvdmVycmlkZQogIGJvb2wgaXNDbG9zZWQgPSBmYWxzZTsKCiAgdm9pZCBfYWRkSW50ZXJuYWwoU3RyaW5nIHRleHQpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZChTdHJpbmcgdGV4dCkgewogICAgaWYgKGlzQ2xvc2VkKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJDb2RlIG91dHB1dCBpcyBjbG9zZWQuIFRyeWluZyB0byB3cml0ZSAnJHRleHQnLiIpOwogICAgfQogICAgX2FkZEludGVybmFsKHRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRCdWZmZXIoQ29kZUJ1ZmZlciBvdGhlcikgewogICAgb3RoZXIuc291cmNlTG9jYXRpb25zTWFwLmZvckVhY2goKFN0cmluZyBuYW1lLCBfU291cmNlTG9jYXRpb25zSW1wbCBvdGhlcikgewogICAgICBjcmVhdGVTb3VyY2VMb2NhdGlvbnMobmFtZSkuX21lcmdlKG90aGVyKTsKICAgIH0pOwogICAgaWYgKCFvdGhlci5pc0Nsb3NlZCkgewogICAgICBvdGhlci5jbG9zZSgpOwogICAgfQogICAgX2FkZEludGVybmFsKG90aGVyLmdldFRleHQoKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNsb3NlKCkgewogICAgaWYgKGlzQ2xvc2VkKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJDb2RlIG91dHB1dCBpcyBhbHJlYWR5IGNsb3NlZC4iKTsKICAgIH0KICAgIGlzQ2xvc2VkID0gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPFNvdXJjZUxvY2F0aW9ucz4gZ2V0IHNvdXJjZUxvY2F0aW9ucyA9PiBzb3VyY2VMb2NhdGlvbnNNYXAudmFsdWVzOwoKICBAb3ZlcnJpZGUKICBfU291cmNlTG9jYXRpb25zSW1wbCBjcmVhdGVTb3VyY2VMb2NhdGlvbnMoU3RyaW5nIG5hbWUpIHsKICAgIHJldHVybiBzb3VyY2VMb2NhdGlvbnNNYXBbbmFtZV0gPz89IG5ldyBfU291cmNlTG9jYXRpb25zSW1wbChuYW1lLCB0aGlzKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIEJ1ZmZlcmVkQ29kZU91dHB1dCB7CiAgU3RyaW5nIGdldFRleHQoKTsKfQoKLy8vIFtDb2RlT3V0cHV0XSB1c2luZyBhIFtTdHJpbmdCdWZmZXJdIGFzIGJhY2tlbmQuCmNsYXNzIENvZGVCdWZmZXIgZXh0ZW5kcyBBYnN0cmFjdENvZGVPdXRwdXQgaW1wbGVtZW50cyBCdWZmZXJlZENvZGVPdXRwdXQgewogIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CgogIEBvdmVycmlkZQogIHZvaWQgX2FkZEludGVybmFsKFN0cmluZyB0ZXh0KSB7CiAgICBidWZmZXIud3JpdGUodGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGxlbmd0aCA9PiBidWZmZXIubGVuZ3RoOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0VGV4dCgpIHsKICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHRocm93ICJEb24ndCB1c2UgQ29kZUJ1ZmZlci50b1N0cmluZygpIHNpbmNlIGl0IGRyb3BzIHNvdXJjZW1hcCBkYXRhLiI7CiAgfQp9CgovLy8gW0NvZGVPdXRwdXRdIHVzaW5nIGEgW0NvbXBpbGF0aW9uT3V0cHV0XSBhcyBiYWNrZW5kLgpjbGFzcyBTdHJlYW1Db2RlT3V0cHV0IGV4dGVuZHMgQWJzdHJhY3RDb2RlT3V0cHV0IHsKICBAb3ZlcnJpZGUKICBpbnQgbGVuZ3RoID0gMDsKICBmaW5hbCBPdXRwdXRTaW5rIG91dHB1dDsKICBmaW5hbCBMaXN0PENvZGVPdXRwdXRMaXN0ZW5lcj4gX2xpc3RlbmVyczsKCiAgU3RyZWFtQ29kZU91dHB1dCh0aGlzLm91dHB1dCwgW3RoaXMuX2xpc3RlbmVyc10pOwoKICBAb3ZlcnJpZGUKICB2b2lkIF9hZGRJbnRlcm5hbChTdHJpbmcgdGV4dCkgewogICAgb3V0cHV0LmFkZCh0ZXh0KTsKICAgIGxlbmd0aCArPSB0ZXh0Lmxlbmd0aDsKICAgIGlmIChfbGlzdGVuZXJzICE9IG51bGwpIHsKICAgICAgX2xpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4gbGlzdGVuZXIub25UZXh0KHRleHQpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2xvc2UoKSB7CiAgICBvdXRwdXQuY2xvc2UoKTsKICAgIHN1cGVyLmNsb3NlKCk7CiAgICBpZiAoX2xpc3RlbmVycyAhPSBudWxsKSB7CiAgICAgIF9saXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IGxpc3RlbmVyLm9uRG9uZShsZW5ndGgpKTsKICAgIH0KICB9Cn0KgPQATk48AR0BIiIBMiQxHAFIGwIBSiIESUo2ITATAT9LATUGRBsQUAFBBlAvAUkeQAEwLwIBOAwVJ0oMRwE0AQxMLytFKQQBDEAiL0FIBAEMMC9BLQQBDB5BTz8pCAgEASwgJCQUTkAmCgYBKU9RCgYEAgEpTiA2AU0xAgE/IwY5GQFJEQY5JQFJEgE1FQFDEAIBNzkoDBkBIgEMGhRPBhgEAQwlUTEIGxUGIwQBDBEUPgYVBAEMTgEMPE4EAgEkFAIBNEwsAQwjGAQBDCMBDBUeBAEMFkwEAgE5NAwSGy0BNAEMIxYbHj8GBAEMERQTHkEGBAIBKHBhY2thZ2U6Y29tcGlsZXIvc3JjL2lvL2NvZGVfb3V0cHV0LmRhcnRBc2Rrcm9vdDovcGtnL2tlcm5lbC9saWIvc3JjL2hpZXJhcmNoeV9iYXNlZF90eXBlX2Vudmlyb25tZW50LmRhcnSDQS8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGtlcm5lbC5oaWVyYXJjaHlfYmFzZWRfdHlwZV9lbnZpcm9ubWVudDsKCmltcG9ydCAnLi4vYXN0LmRhcnQnIHNob3cgQ2xhc3MsIEludGVyZmFjZVR5cGU7CgppbXBvcnQgJy4uL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JyBzaG93IENsYXNzSGllcmFyY2h5OwoKaW1wb3J0ICcuLi9jb3JlX3R5cGVzLmRhcnQnIHNob3cgQ29yZVR5cGVzOwoKaW1wb3J0ICcuLi90eXBlX2Vudmlyb25tZW50LmRhcnQnIHNob3cgVHlwZUVudmlyb25tZW50OwoKY2xhc3MgSGllcmFyY2h5QmFzZWRUeXBlRW52aXJvbm1lbnQgZXh0ZW5kcyBUeXBlRW52aXJvbm1lbnQgewogIGZpbmFsIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeTsKCiAgSGllcmFyY2h5QmFzZWRUeXBlRW52aXJvbm1lbnQoQ29yZVR5cGVzIGNvcmVUeXBlcywgdGhpcy5oaWVyYXJjaHkpCiAgICAgIDogc3VwZXIuZnJvbVN1YmNsYXNzKGNvcmVUeXBlcyk7CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0VHlwZUFzSW5zdGFuY2VPZihJbnRlcmZhY2VUeXBlIHR5cGUsIENsYXNzIHN1cGVyY2xhc3MpIHsKICAgIHJldHVybiBoaWVyYXJjaHkuZ2V0VHlwZUFzSW5zdGFuY2VPZih0eXBlLCBzdXBlcmNsYXNzKTsKICB9Cn0KGwBOTjwBMQEwATYBLAE4AT4iAUUnAQxMPAQCAThwYWNrYWdlOmtlcm5lbC9zcmMvaGllcmFyY2h5X2Jhc2VkX3R5cGVfZW52aXJvbm1lbnQuZGFydDRzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvc2Nhbm5lci9pbnRlcm5lci5kYXJ0guEvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLyoqCiAqIFRoZSBpbnRlcmZhY2UgYEludGVybmVyYCBkZWZpbmVzIHRoZSBiZWhhdmlvciBvZiBvYmplY3RzIHRoYXQgY2FuIGludGVybgogKiBzdHJpbmdzLgogKi8KYWJzdHJhY3QgY2xhc3MgSW50ZXJuZXIgewogIC8qKgogICAqIFJldHVybiBhIHN0cmluZyB0aGF0IGlzIGlkZW50aWNhbCB0byBhbGwgb2YgdGhlIG90aGVyIHN0cmluZ3MgdGhhdCBoYXZlCiAgICogYmVlbiBpbnRlcm5lZCB0aGF0IGFyZSBlcXVhbCB0byB0aGUgZ2l2ZW4gW3N0cmluZ10uCiAgICovCiAgU3RyaW5nIGludGVybihTdHJpbmcgc3RyaW5nKTsKfQoKLyoqCiAqIFRoZSBjbGFzcyBgTnVsbEludGVybmVyYCBpbXBsZW1lbnRzIGFuIGludGVybmVyIHRoYXQgZG9lcyBub3RoaW5nIChkb2VzIG5vdAogKiBhY3R1YWxseSBpbnRlcm4gYW55IHN0cmluZ3MpLgogKi8KY2xhc3MgTnVsbEludGVybmVyIGltcGxlbWVudHMgSW50ZXJuZXIgewogIEBvdmVycmlkZQogIFN0cmluZyBpbnRlcm4oU3RyaW5nIHN0cmluZykgPT4gc3RyaW5nOwp9ChoATk48AQRMDAQaBk05BiACAQRPIQQpDCoCAStwYWNrYWdlOmZyb250X2VuZC9zcmMvc2Nhbm5lci9pbnRlcm5lci5kYXJ0SHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvY2xhc3NfaGllcmFyY2h5X2J1aWxkZXIuZGFydMAAlj0vLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5jbGFzc19oaWVyYXJjaHlfYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQ2xhc3MsCiAgICAgICAgRGFydFR5cGUsCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBUeXBlUGFyYW1ldGVyLAogICAgICAgIExpYnJhcnksCiAgICAgICAgTWVtYmVyLAogICAgICAgIE5hbWUsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFByb2NlZHVyZUtpbmQsCiAgICAgICAgU3VwZXJ0eXBlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCcgc2hvdyBDbGFzc0hpZXJhcmNoeTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JyBzaG93IENvcmVUeXBlczsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQnIHNob3cgU3Vic3RpdHV0aW9uOwoKaW1wb3J0ICcuLi9sb2FkZXIuZGFydCcgc2hvdyBMb2FkZXI7CgppbXBvcnQgJy4uL21lc3NhZ2VzLmRhcnQnCiAgICBzaG93CiAgICAgICAgTG9jYXRlZE1lc3NhZ2UsCiAgICAgICAgTWVzc2FnZSwKICAgICAgICBtZXNzYWdlRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVyLAogICAgICAgIG1lc3NhZ2VEZWNsYXJlZE1lbWJlckNvbmZsaWN0c1dpdGhJbmhlcml0ZWRNZW1iZXJDYXVzZSwKICAgICAgICBtZXNzYWdlSW5oZXJpdGVkTWVtYmVyc0NvbmZsaWN0LAogICAgICAgIG1lc3NhZ2VJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3RDYXVzZTEsCiAgICAgICAgbWVzc2FnZUluaGVyaXRlZE1lbWJlcnNDb25mbGljdENhdXNlMiwKICAgICAgICBtZXNzYWdlU3RhdGljQW5kSW5zdGFuY2VDb25mbGljdCwKICAgICAgICBtZXNzYWdlU3RhdGljQW5kSW5zdGFuY2VDb25mbGljdENhdXNlLAogICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uLAogICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uQ2F1c2UsCiAgICAgICAgdGVtcGxhdGVNaXNzaW5nSW1wbGVtZW50YXRpb25DYXVzZSwKICAgICAgICB0ZW1wbGF0ZU1pc3NpbmdJbXBsZW1lbnRhdGlvbk5vdEFic3RyYWN0OwoKaW1wb3J0ICcuLi9uYW1lcy5kYXJ0JyBzaG93IG5vU3VjaE1ldGhvZE5hbWU7CgppbXBvcnQgJy4uL3Njb3BlLmRhcnQnIHNob3cgU2NvcGU7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3N0YW5kYXJkX2JvdW5kcy5kYXJ0JyBzaG93IFN0YW5kYXJkQm91bmRzOwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX2NvbnN0cmFpbnRfZ2F0aGVyZXIuZGFydCcKICAgIHNob3cgVHlwZUNvbnN0cmFpbnRHYXRoZXJlcjsKCmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2UvdHlwZV9pbmZlcnJlci5kYXJ0JyBzaG93IE1peGluSW5mZXJyZXI7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfc2NoZW1hLmRhcnQnIHNob3cgVW5rbm93blR5cGU7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfc2NoZW1hX2Vudmlyb25tZW50LmRhcnQnIHNob3cgVHlwZUNvbnN0cmFpbnQ7CgppbXBvcnQgJ2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgRGVjbGFyYXRpb24sCiAgICAgICAgS2VybmVsQ2xhc3NCdWlsZGVyLAogICAgICAgIEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIsCiAgICAgICAgS2VybmVsVHlwZUJ1aWxkZXIsCiAgICAgICAgTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgVHlwZUJ1aWxkZXIsCiAgICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlcjsKCmltcG9ydCAndHlwZXMuZGFydCcgc2hvdyBUeXBlczsKCmludCBjb21wYXJlRGVjbGFyYXRpb25zKERlY2xhcmF0aW9uIGEsIERlY2xhcmF0aW9uIGIpIHsKICByZXR1cm4gQ2xhc3NIaWVyYXJjaHkuY29tcGFyZU1lbWJlcnMoYS50YXJnZXQsIGIudGFyZ2V0KTsKfQoKUHJvY2VkdXJlS2luZCBtZW1iZXJLaW5kKE1lbWJlciBtZW1iZXIpIHsKICByZXR1cm4gbWVtYmVyIGlzIFByb2NlZHVyZSA/IG1lbWJlci5raW5kIDogbnVsbDsKfQoKYm9vbCBpc05hbWVWaXNpYmxlSW4oCiAgICBOYW1lIG5hbWUsIExpYnJhcnlCdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyLCBMaWJyYXJ5PiBsaWJyYXJ5KSB7CiAgcmV0dXJuICFuYW1lLmlzUHJpdmF0ZSB8fCBuYW1lLmxpYnJhcnkgPT0gbGlicmFyeS50YXJnZXQ7Cn0KCi8vLyBSZXR1cm5zIHRydWUgaWYgW2FdIGlzIGEgY2xhc3MgbWVtYmVyIGNvbmZsaWN0IHdpdGggW2JdLiAgW2FdIGlzIGFzc3VtZWQgdG8KLy8vIGJlIGRlY2xhcmVkIGluIHRoZSBjbGFzcywgW2JdIGlzIGFzc3VtZWQgdG8gYmUgaW5oZXJpdGVkLgovLy8KLy8vIFNlZSB0aGUgc2VjdGlvbiBuYW1lZCAiQ2xhc3MgTWVtYmVyIENvbmZsaWN0cyIgaW4gW0RhcnQgUHJvZ3JhbW1pbmcKLy8vIExhbmd1YWdlIFNwZWNpZmljYXRpb25dKAovLy8gLi4vLi4vLi4vLi4vLi4vLi4vZG9jcy9sYW5ndWFnZS9kYXJ0TGFuZ1NwZWMudGV4I2NsYXNzTWVtYmVyQ29uZmxpY3RzKS4KYm9vbCBpc0luaGVyaXRhbmNlQ29uZmxpY3QoRGVjbGFyYXRpb24gYSwgRGVjbGFyYXRpb24gYikgewogIGlmIChhLmlzU3RhdGljKSByZXR1cm4gdHJ1ZTsKICBpZiAobWVtYmVyS2luZChhLnRhcmdldCkgPT0gbWVtYmVyS2luZChiLnRhcmdldCkpIHJldHVybiBmYWxzZTsKICBpZiAoYS5pc0ZpZWxkKSByZXR1cm4gIShiLmlzRmllbGQgfHwgYi5pc0dldHRlciB8fCBiLmlzU2V0dGVyKTsKICBpZiAoYi5pc0ZpZWxkKSByZXR1cm4gIShhLmlzRmllbGQgfHwgYS5pc0dldHRlciB8fCBhLmlzU2V0dGVyKTsKICBpZiAoYS5pc1NldHRlcikgcmV0dXJuICEoYi5pc0dldHRlciB8fCBiLmlzU2V0dGVyKTsKICBpZiAoYi5pc1NldHRlcikgcmV0dXJuICEoYS5pc0dldHRlciB8fCBhLmlzU2V0dGVyKTsKICByZXR1cm4gdHJ1ZTsKfQoKYm9vbCBpbXBsaWVzU2V0dGVyKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CiAgcmV0dXJuIGRlY2xhcmF0aW9uLmlzRmllbGQgJiYgIShkZWNsYXJhdGlvbi5pc0ZpbmFsIHx8IGRlY2xhcmF0aW9uLmlzQ29uc3QpOwp9CgpjbGFzcyBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgewogIGZpbmFsIE1hcDxDbGFzcywgQ2xhc3NIaWVyYXJjaHlOb2RlPiBub2RlcyA9IDxDbGFzcywgQ2xhc3NIaWVyYXJjaHlOb2RlPnt9OwoKICBmaW5hbCBLZXJuZWxDbGFzc0J1aWxkZXIgb2JqZWN0Q2xhc3M7CgogIGZpbmFsIExvYWRlcjxMaWJyYXJ5PiBsb2FkZXI7CgogIGZpbmFsIENsYXNzIG9iamVjdEtlcm5lbENsYXNzOwoKICBmaW5hbCBDbGFzcyBmdXR1cmVLZXJuZWxDbGFzczsKCiAgZmluYWwgQ2xhc3MgZnV0dXJlT3JLZXJuZWxDbGFzczsKCiAgZmluYWwgQ2xhc3MgZnVuY3Rpb25LZXJuZWxDbGFzczsKCiAgZmluYWwgQ2xhc3MgbnVsbEtlcm5lbENsYXNzOwoKICAvLyBUT0RPKGFoZSk6IFJlbW92ZSB0aGlzLgogIGZpbmFsIENvcmVUeXBlcyBjb3JlVHlwZXM7CgogIFR5cGVzIHR5cGVzOwoKICBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIodGhpcy5vYmplY3RDbGFzcywgdGhpcy5sb2FkZXIsIHRoaXMuY29yZVR5cGVzKQogICAgICA6IG9iamVjdEtlcm5lbENsYXNzID0gb2JqZWN0Q2xhc3MudGFyZ2V0LAogICAgICAgIGZ1dHVyZUtlcm5lbENsYXNzID0gY29yZVR5cGVzLmZ1dHVyZUNsYXNzLAogICAgICAgIGZ1dHVyZU9yS2VybmVsQ2xhc3MgPSBjb3JlVHlwZXMuZnV0dXJlT3JDbGFzcywKICAgICAgICBmdW5jdGlvbktlcm5lbENsYXNzID0gY29yZVR5cGVzLmZ1bmN0aW9uQ2xhc3MsCiAgICAgICAgbnVsbEtlcm5lbENsYXNzID0gY29yZVR5cGVzLm51bGxDbGFzcyB7CiAgICB0eXBlcyA9IG5ldyBUeXBlcyh0aGlzKTsKICB9CgogIENsYXNzSGllcmFyY2h5Tm9kZSBnZXROb2RlRnJvbUNsYXNzKEtlcm5lbENsYXNzQnVpbGRlciBjbHMpIHsKICAgIHJldHVybiBub2Rlc1tjbHMudGFyZ2V0XSA/Pz0KICAgICAgICBuZXcgQ2xhc3NIaWVyYXJjaHlOb2RlQnVpbGRlcih0aGlzLCBjbHMpLmJ1aWxkKCk7CiAgfQoKICBDbGFzc0hpZXJhcmNoeU5vZGUgZ2V0Tm9kZUZyb21UeXBlKEtlcm5lbFR5cGVCdWlsZGVyIHR5cGUpIHsKICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gdHlwZS5kZWNsYXJhdGlvbjsKICAgIHJldHVybiBkZWNsYXJhdGlvbiBpcyBLZXJuZWxDbGFzc0J1aWxkZXIKICAgICAgICA/IGdldE5vZGVGcm9tQ2xhc3MoZGVjbGFyYXRpb24pCiAgICAgICAgOiBudWxsOwogIH0KCiAgQ2xhc3NIaWVyYXJjaHlOb2RlIGdldE5vZGVGcm9tS2VybmVsQ2xhc3MoQ2xhc3MgY2xzKSB7CiAgICByZXR1cm4gbm9kZXNbY2xzXSA/PwogICAgICAgIGdldE5vZGVGcm9tQ2xhc3MobG9hZGVyLmNvbXB1dGVDbGFzc0J1aWxkZXJGcm9tVGFyZ2V0Q2xhc3MoY2xzKSk7CiAgfQoKICBLZXJuZWxUeXBlQnVpbGRlciBhc1N1cGVydHlwZU9mKENsYXNzIGNscywgQ2xhc3Mgc3VwZXJ0eXBlKSB7CiAgICBDbGFzc0hpZXJhcmNoeU5vZGUgY2xzTm9kZSA9IGdldE5vZGVGcm9tS2VybmVsQ2xhc3MoY2xzKTsKICAgIGlmIChjbHMgPT0gc3VwZXJ0eXBlKSB7CiAgICAgIHJldHVybiBuZXcgS2VybmVsTmFtZWRUeXBlQnVpbGRlcihjbHNOb2RlLmNscy5uYW1lLCBudWxsKQogICAgICAgIC4uYmluZChjbHNOb2RlLmNscyk7CiAgICB9CiAgICBDbGFzc0hpZXJhcmNoeU5vZGUgc3VwZXJ0eXBlTm9kZSA9IGdldE5vZGVGcm9tS2VybmVsQ2xhc3Moc3VwZXJ0eXBlKTsKICAgIExpc3Q8S2VybmVsVHlwZUJ1aWxkZXI+IHN1cGVydHlwZXMgPSBjbHNOb2RlLnN1cGVyY2xhc3NlczsKICAgIGludCBkZXB0aCA9IHN1cGVydHlwZU5vZGUuZGVwdGg7CiAgICBEZWNsYXJhdGlvbiBzdXBlcnR5cGVEZWNsYXJhdGlvbiA9IHN1cGVydHlwZU5vZGUuY2xzOwogICAgaWYgKGRlcHRoIDwgc3VwZXJ0eXBlcy5sZW5ndGgpIHsKICAgICAgS2VybmVsVHlwZUJ1aWxkZXIgYXNTdXBlcnR5cGVPZiA9IHN1cGVydHlwZXNbZGVwdGhdOwogICAgICBpZiAoYXNTdXBlcnR5cGVPZi5kZWNsYXJhdGlvbiA9PSBzdXBlcnR5cGVEZWNsYXJhdGlvbikKICAgICAgICByZXR1cm4gYXNTdXBlcnR5cGVPZjsKICAgIH0KICAgIHN1cGVydHlwZXMgPSBjbHNOb2RlLmludGVyZmFjZXM7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1cGVydHlwZXMubGVuZ3RoOyBpKyspIHsKICAgICAgS2VybmVsVHlwZUJ1aWxkZXIgdHlwZSA9IHN1cGVydHlwZXNbaV07CiAgICAgIGlmICh0eXBlLmRlY2xhcmF0aW9uID09IHN1cGVydHlwZURlY2xhcmF0aW9uKSByZXR1cm4gdHlwZTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXRLZXJuZWxUeXBlQXNJbnN0YW5jZU9mKAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUsIENsYXNzIHN1cGVyY2xhc3MpIHsKICAgIENsYXNzIGtlcm5lbENsYXNzID0gdHlwZS5jbGFzc05vZGU7CiAgICBpZiAoa2VybmVsQ2xhc3MgPT0gc3VwZXJjbGFzcykgcmV0dXJuIHR5cGU7CiAgICBpZiAoa2VybmVsQ2xhc3MgPT0gbnVsbEtlcm5lbENsYXNzKSB7CiAgICAgIGlmIChzdXBlcmNsYXNzLnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHsKICAgICAgICByZXR1cm4gc3VwZXJjbGFzcy5yYXdUeXBlOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRoaXMgaXMgYSBzYWZlIGZhbGwtYmFjayBmb3IgZGVhbGluZyB3aXRoIGBOdWxsYC4gSXQgd2lsbCBsaWtlbHkgYmUKICAgICAgICAvLyBmYXN0ZXIgdG8gY2hlY2sgZm9yIGBOdWxsYCBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC4KICAgICAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICAgIHN1cGVyY2xhc3MsCiAgICAgICAgICAgIG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQoCiAgICAgICAgICAgICAgICBzdXBlcmNsYXNzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwgbnVsbEtlcm5lbENsYXNzLnJhd1R5cGUpKTsKICAgICAgfQogICAgfQogICAgS2VybmVsTmFtZWRUeXBlQnVpbGRlciBzdXBlcnR5cGUgPSBhc1N1cGVydHlwZU9mKGtlcm5lbENsYXNzLCBzdXBlcmNsYXNzKTsKICAgIGlmIChzdXBlcnR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBpZiAoc3VwZXJ0eXBlLmFyZ3VtZW50cyA9PSBudWxsKSByZXR1cm4gc3VwZXJjbGFzcy5yYXdUeXBlOwogICAgcmV0dXJuIFN1YnN0aXR1dGlvbi5mcm9tSW50ZXJmYWNlVHlwZSh0eXBlKQogICAgICAgIC5zdWJzdGl0dXRlVHlwZShzdXBlcnR5cGUuYnVpbGQobnVsbCkpOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXRLZXJuZWxMZWdhY3lMZWFzdFVwcGVyQm91bmQoCiAgICAgIEludGVyZmFjZVR5cGUgdHlwZTEsIEludGVyZmFjZVR5cGUgdHlwZTIpIHsKICAgIGlmICh0eXBlMSA9PSB0eXBlMikgcmV0dXJuIHR5cGUxOwogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIG5vZGUxID0gZ2V0Tm9kZUZyb21LZXJuZWxDbGFzcyh0eXBlMS5jbGFzc05vZGUpOwogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIG5vZGUyID0gZ2V0Tm9kZUZyb21LZXJuZWxDbGFzcyh0eXBlMi5jbGFzc05vZGUpOwogICAgU2V0PENsYXNzSGllcmFyY2h5Tm9kZT4gbm9kZXMxID0gbm9kZTEuY29tcHV0ZUFsbFN1cGVyTm9kZXModGhpcykudG9TZXQoKTsKICAgIExpc3Q8Q2xhc3NIaWVyYXJjaHlOb2RlPiBub2RlczIgPSBub2RlMi5jb21wdXRlQWxsU3VwZXJOb2Rlcyh0aGlzKTsKICAgIExpc3Q8Q2xhc3NIaWVyYXJjaHlOb2RlPiBjb21tb24gPSA8Q2xhc3NIaWVyYXJjaHlOb2RlPltdOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMyLmxlbmd0aDsgaSsrKSB7CiAgICAgIENsYXNzSGllcmFyY2h5Tm9kZSBub2RlID0gbm9kZXMyW2ldOwogICAgICBpZiAobm9kZSA9PSBudWxsKSBjb250aW51ZTsKICAgICAgaWYgKG5vZGVzMS5jb250YWlucyhub2RlKSkgewogICAgICAgIERhcnRUeXBlIGNhbmRpZGF0ZTEgPSBnZXRLZXJuZWxUeXBlQXNJbnN0YW5jZU9mKHR5cGUxLCBub2RlLmNscy50YXJnZXQpOwogICAgICAgIERhcnRUeXBlIGNhbmRpZGF0ZTIgPSBnZXRLZXJuZWxUeXBlQXNJbnN0YW5jZU9mKHR5cGUyLCBub2RlLmNscy50YXJnZXQpOwogICAgICAgIGlmIChjYW5kaWRhdGUxID09IGNhbmRpZGF0ZTIpIHsKICAgICAgICAgIGNvbW1vbi5hZGQobm9kZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKGNvbW1vbi5sZW5ndGggPT0gMSkgcmV0dXJuIG9iamVjdEtlcm5lbENsYXNzLnJhd1R5cGU7CiAgICBjb21tb24uc29ydChDbGFzc0hpZXJhcmNoeU5vZGUuY29tcGFyZU1heEluaGVyaXRhbmNlUGF0aCk7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tb24ubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgIENsYXNzSGllcmFyY2h5Tm9kZSBub2RlID0gY29tbW9uW2ldOwogICAgICBpZiAobm9kZS5tYXhJbmhlcml0YW5jZVBhdGggIT0gY29tbW9uW2kgKyAxXS5tYXhJbmhlcml0YW5jZVBhdGgpIHsKICAgICAgICByZXR1cm4gZ2V0S2VybmVsVHlwZUFzSW5zdGFuY2VPZih0eXBlMSwgbm9kZS5jbHMudGFyZ2V0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkbyB7CiAgICAgICAgICBpKys7CiAgICAgICAgfSB3aGlsZSAobm9kZS5tYXhJbmhlcml0YW5jZVBhdGggPT0gY29tbW9uW2kgKyAxXS5tYXhJbmhlcml0YW5jZVBhdGgpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gb2JqZWN0S2VybmVsQ2xhc3MucmF3VHlwZTsKICB9CgogIHN0YXRpYyBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgYnVpbGQoCiAgICAgIEtlcm5lbENsYXNzQnVpbGRlciBvYmplY3RDbGFzcywKICAgICAgTGlzdDxLZXJuZWxDbGFzc0J1aWxkZXI+IGNsYXNzZXMsCiAgICAgIExvYWRlcjxPYmplY3Q+IGxvYWRlciwKICAgICAgQ29yZVR5cGVzIGNvcmVUeXBlcykgewogICAgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGhpZXJhcmNoeSA9CiAgICAgICAgbmV3IENsYXNzSGllcmFyY2h5QnVpbGRlcihvYmplY3RDbGFzcywgbG9hZGVyLCBjb3JlVHlwZXMpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIEtlcm5lbENsYXNzQnVpbGRlciBjbHMgPSBjbGFzc2VzW2ldOwogICAgICBoaWVyYXJjaHkubm9kZXNbY2xzLnRhcmdldF0gPQogICAgICAgICAgbmV3IENsYXNzSGllcmFyY2h5Tm9kZUJ1aWxkZXIoaGllcmFyY2h5LCBjbHMpLmJ1aWxkKCk7CiAgICB9CiAgICByZXR1cm4gaGllcmFyY2h5OwogIH0KfQoKY2xhc3MgQ2xhc3NIaWVyYXJjaHlOb2RlQnVpbGRlciB7CiAgZmluYWwgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGhpZXJhcmNoeTsKCiAgZmluYWwgS2VybmVsQ2xhc3NCdWlsZGVyIGNsczsKCiAgYm9vbCBoYXNOb1N1Y2hNZXRob2QgPSBmYWxzZTsKCiAgTGlzdDxEZWNsYXJhdGlvbj4gYWJzdHJhY3RNZW1iZXJzID0gbnVsbDsKCiAgQ2xhc3NIaWVyYXJjaHlOb2RlQnVpbGRlcih0aGlzLmhpZXJhcmNoeSwgdGhpcy5jbHMpOwoKICBLZXJuZWxDbGFzc0J1aWxkZXIgZ2V0IG9iamVjdENsYXNzID0+IGhpZXJhcmNoeS5vYmplY3RDbGFzczsKCiAgLy8vIFdoZW4gbWVyZ2luZyBgYUxpc3RgIGFuZCBgYkxpc3RgLCBbYV0gKGZyb20gYGFMaXN0YCkgYW5kIFtiXSAoZnJvbQogIC8vLyBgYkxpc3RgKSBlYWNoIGhhdmUgdGhlIHNhbWUgbmFtZS4KICAvLy8KICAvLy8gSWYgW21lcmdlS2luZF0gaXMgYE1lcmdlS2luZC5zdXBlcmNsYXNzYCwgW2FdIHNob3VsZCBvdmVycmlkZSBbYl0uCiAgLy8vCiAgLy8vIElmIFttZXJnZUtpbmRdIGlzIGBNZXJnZUtpbmQuaW50ZXJmYWNlc2AsIHdlIG5lZWQgdG8gcmVjb3JkIHRoZW0gYW5kCiAgLy8vIHNvbHZlIHRoZSBjb25mbGljdCBsYXRlci4KICAvLy8KICAvLy8gSWYgW21lcmdlS2luZF0gaXMgYE1lcmdlS2luZC5zdXBlcnR5cGVzYCwgW2FdIHNob3VsZCBpbXBsZW1lbnQgW2JdLCBhbmQKICAvLy8gW2JdIGlzIGltcGxpY2l0bHkgYWJzdHJhY3QuCiAgRGVjbGFyYXRpb24gaGFuZGxlTWVyZ2VDb25mbGljdChLZXJuZWxDbGFzc0J1aWxkZXIgY2xzLCBEZWNsYXJhdGlvbiBhLAogICAgICBEZWNsYXJhdGlvbiBiLCBNZXJnZUtpbmQgbWVyZ2VLaW5kKSB7CiAgICBpZiAoYSA9PSBiKSByZXR1cm4gYTsKICAgIGlmIChhLm5leHQgIT0gbnVsbCB8fCBiLm5leHQgIT0gbnVsbCkgewogICAgICAvLyBEb24ndCBjaGVjayBvdmVycmlkZXMgaW52b2x2aW5nIGR1cGxpY2F0ZWQgbWVtYmVycy4KICAgICAgcmV0dXJuIGE7CiAgICB9CiAgICBpZiAoaXNJbmhlcml0YW5jZUNvbmZsaWN0KGEsIGIpKSB7CiAgICAgIHJlcG9ydEluaGVyaXRhbmNlQ29uZmxpY3QoY2xzLCBhLCBiKTsKICAgIH0KICAgIERlY2xhcmF0aW9uIHJlc3VsdCA9IGE7CiAgICBpZiAobWVyZ2VLaW5kID09IE1lcmdlS2luZC5hY2Nlc3NvcnMpIHsKICAgIH0gZWxzZSBpZiAobWVyZ2VLaW5kID09IE1lcmdlS2luZC5pbnRlcmZhY2VzKSB7CiAgICAgIC8vIFRPRE8oYWhlKTogQ29tYmluZSB0aGUgc2lnbmF0dXJlcyBvZiBhIGFuZCBiLiAgU2VlIHRoZSBzZWN0aW9uIG5hbWVkCiAgICAgIC8vICJDb21iaW5lZCBNZW1iZXIgU2lnbmF0dXJlcyIgaW4gW0RhcnQgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UKICAgICAgLy8gU3BlY2lmaWNhdGlvbl0oCiAgICAgIC8vIC4uLy4uLy4uLy4uLy4uLy4uL2RvY3MvbGFuZ3VhZ2UvZGFydExhbmdTcGVjLnRleCNjb21iaW5lZE1lbWJlclNpZ25hdHVyZXMpLgogICAgfSBlbHNlIGlmIChhLnRhcmdldC5pc0Fic3RyYWN0KSB7CiAgICAgIGlmIChtZXJnZUtpbmQgPT0gTWVyZ2VLaW5kLnN1cGVyY2xhc3MgJiYgIWIudGFyZ2V0LmlzQWJzdHJhY3QpIHsKICAgICAgICAvLyBBbiBhYnN0cmFjdCBtZXRob2QgZG9lc24ndCBvdmVycmlkZSBhbiBpbXBsZW1lbnRpb24gaW5oZXJpdGVkIGZyb20gYQogICAgICAgIC8vIHN1cGVyY2xhc3MuCiAgICAgICAgcmVzdWx0ID0gYjsKICAgICAgfSBlbHNlIHsKICAgICAgICAoYWJzdHJhY3RNZW1iZXJzID8/PSA8RGVjbGFyYXRpb24+W10pLmFkZChhKTsKICAgICAgfQogICAgfQoKICAgIGlmIChtZXJnZUtpbmQgPT0gTWVyZ2VLaW5kLnN1cGVyY2xhc3MgJiYKICAgICAgICByZXN1bHQuZnVsbE5hbWVGb3JFcnJvcnMgPT0gbm9TdWNoTWV0aG9kTmFtZS5uYW1lICYmCiAgICAgICAgcmVzdWx0LnBhcmVudCAhPSBvYmplY3RDbGFzcykgewogICAgICBoYXNOb1N1Y2hNZXRob2QgPSB0cnVlOwogICAgfQoKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIHJlcG9ydEluaGVyaXRhbmNlQ29uZmxpY3QoCiAgICAgIEtlcm5lbENsYXNzQnVpbGRlciBjbHMsIERlY2xhcmF0aW9uIGEsIERlY2xhcmF0aW9uIGIpIHsKICAgIFN0cmluZyBuYW1lID0gYS5mdWxsTmFtZUZvckVycm9yczsKICAgIGlmIChhLnBhcmVudCAhPSBiLnBhcmVudCkgewogICAgICBpZiAoYS5wYXJlbnQgPT0gY2xzKSB7CiAgICAgICAgY2xzLmFkZFByb2JsZW0obWVzc2FnZURlY2xhcmVkTWVtYmVyQ29uZmxpY3RzV2l0aEluaGVyaXRlZE1lbWJlciwKICAgICAgICAgICAgYS5jaGFyT2Zmc2V0LCBuYW1lLmxlbmd0aCwKICAgICAgICAgICAgY29udGV4dDogPExvY2F0ZWRNZXNzYWdlPlsKICAgICAgICAgICAgICBtZXNzYWdlRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVyQ2F1c2UKICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbihiLmZpbGVVcmksIGIuY2hhck9mZnNldCwgbmFtZS5sZW5ndGgpCiAgICAgICAgICAgIF0pOwogICAgICB9IGVsc2UgewogICAgICAgIGNscy5hZGRQcm9ibGVtKG1lc3NhZ2VJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3QsIGNscy5jaGFyT2Zmc2V0LAogICAgICAgICAgICBjbHMuZnVsbE5hbWVGb3JFcnJvcnMubGVuZ3RoLAogICAgICAgICAgICBjb250ZXh0OiBpbmhlcml0ZWRDb25mbGljdENvbnRleHQoYSwgYikpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGEuaXNTdGF0aWMgIT0gYi5pc1N0YXRpYykgewogICAgICBEZWNsYXJhdGlvbiBzdGF0aWNNZW1iZXI7CiAgICAgIERlY2xhcmF0aW9uIGluc3RhbmNlTWVtYmVyOwogICAgICBpZiAoYS5pc1N0YXRpYykgewogICAgICAgIHN0YXRpY01lbWJlciA9IGE7CiAgICAgICAgaW5zdGFuY2VNZW1iZXIgPSBiOwogICAgICB9IGVsc2UgewogICAgICAgIHN0YXRpY01lbWJlciA9IGI7CiAgICAgICAgaW5zdGFuY2VNZW1iZXIgPSBhOwogICAgICB9CiAgICAgIGNscy5saWJyYXJ5LmFkZFByb2JsZW0obWVzc2FnZVN0YXRpY0FuZEluc3RhbmNlQ29uZmxpY3QsCiAgICAgICAgICBzdGF0aWNNZW1iZXIuY2hhck9mZnNldCwgbmFtZS5sZW5ndGgsIHN0YXRpY01lbWJlci5maWxlVXJpLAogICAgICAgICAgY29udGV4dDogPExvY2F0ZWRNZXNzYWdlPlsKICAgICAgICAgICAgbWVzc2FnZVN0YXRpY0FuZEluc3RhbmNlQ29uZmxpY3RDYXVzZS53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgICBpbnN0YW5jZU1lbWJlci5maWxlVXJpLCBpbnN0YW5jZU1lbWJlci5jaGFyT2Zmc2V0LCBuYW1lLmxlbmd0aCkKICAgICAgICAgIF0pOwogICAgfSBlbHNlIHsKICAgICAgLy8gVGhpcyBtZXNzYWdlIGNhbiBiZSByZXBvcnRlZCB0d2ljZSAod2hlbiBtZXJnaW5nIGxvY2FsTWVtYmVycyB3aXRoCiAgICAgIC8vIGNsYXNzU2V0dGVycywgb3IgbG9jYWxTZXR0ZXJzIHdpdGggY2xhc3NNZW1iZXJzKS4gQnkgZW5zdXJpbmcgdGhhdAogICAgICAvLyB3ZSBhbHdheXMgcmVwb3J0IHRoZSBvbmUgd2l0aCBoaWdoZXIgY2hhck9mZnNldCBhcyB0aGUgZHVwbGljYXRlLAogICAgICAvLyB0aGUgbWVzc2FnZSBkdXBsaWNhdGlvbiBsb2dpYyBlbnN1cmVzIHRoYXQgd2Ugb25seSByZXBvcnQgdGhpcwogICAgICAvLyBwcm9ibGVtIG9uY2UuCiAgICAgIERlY2xhcmF0aW9uIGV4aXN0aW5nOwogICAgICBEZWNsYXJhdGlvbiBkdXBsaWNhdGU7CiAgICAgIGFzc2VydChhLmZpbGVVcmkgPT0gYi5maWxlVXJpKTsKICAgICAgaWYgKGEuY2hhck9mZnNldCA8IGIuY2hhck9mZnNldCkgewogICAgICAgIGV4aXN0aW5nID0gYTsKICAgICAgICBkdXBsaWNhdGUgPSBiOwogICAgICB9IGVsc2UgewogICAgICAgIGV4aXN0aW5nID0gYjsKICAgICAgICBkdXBsaWNhdGUgPSBhOwogICAgICB9CiAgICAgIGNscy5saWJyYXJ5LmFkZFByb2JsZW0odGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb24ud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgIGR1cGxpY2F0ZS5jaGFyT2Zmc2V0LCBuYW1lLmxlbmd0aCwgZHVwbGljYXRlLmZpbGVVcmksCiAgICAgICAgICBjb250ZXh0OiA8TG9jYXRlZE1lc3NhZ2U+WwogICAgICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbkNhdXNlLndpdGhBcmd1bWVudHMobmFtZSkud2l0aExvY2F0aW9uKAogICAgICAgICAgICAgICAgZXhpc3RpbmcuZmlsZVVyaSwgZXhpc3RpbmcuY2hhck9mZnNldCwgbmFtZS5sZW5ndGgpCiAgICAgICAgICBdKTsKICAgIH0KICB9CgogIC8vLyBXaGVuIG1lcmdpbmcgYGFMaXN0YCBhbmQgYGJMaXN0YCwgW21lbWJlcl0gd2FzIG9ubHkgZm91bmQgaW4gYGFMaXN0YC4KICAvLy8KICAvLy8gSWYgW21lcmdlS2luZF0gaXMgYE1lcmdlS2luZC5zdXBlcmNsYXNzYCBbbWVtYmVyXSBpcyBkZWNsYXJlZCBpbiBjdXJyZW50CiAgLy8vIGNsYXNzLCBhbmQgaXNuJ3Qgb3ZlcnJpZGluZyBhIG1ldGhvZCBmcm9tIHRoZSBzdXBlcmNsYXNzLgogIC8vLwogIC8vLyBJZiBbbWVyZ2VLaW5kXSBpcyBgTWVyZ2VLaW5kLmludGVyZmFjZXNgLCBbbWVtYmVyXSBpcyBpZ25vcmVkIGZvciBub3cuCiAgLy8vCiAgLy8vIElmIFttZXJnZUtpbmRdIGlzIGBNZXJnZUtpbmQuc3VwZXJ0eXBlc2AsIFttZW1iZXJdIGlzbid0CiAgLy8vIGltcGxlbWVudGluZy9vdmVycmlkaW5nIGFueXRoaW5nLgogIHZvaWQgaGFuZGxlT25seUEoRGVjbGFyYXRpb24gbWVtYmVyLCBNZXJnZUtpbmQgbWVyZ2VLaW5kKSB7CiAgICBpZiAobWVyZ2VLaW5kID09IE1lcmdlS2luZC5zdXBlcmNsYXNzICYmIG1lbWJlci50YXJnZXQuaXNBYnN0cmFjdCkgewogICAgICAoYWJzdHJhY3RNZW1iZXJzID8/PSA8RGVjbGFyYXRpb24+W10pLmFkZChtZW1iZXIpOwogICAgfQogIH0KCiAgLy8vIFdoZW4gbWVyZ2luZyBgYUxpc3RgIGFuZCBgYkxpc3RgLCBbbWVtYmVyXSB3YXMgb25seSBmb3VuZCBpbiBgYkxpc3RgLgogIC8vLwogIC8vLyBJZiBbbWVyZ2VLaW5kXSBpcyBgTWVyZ2VLaW5kLnN1cGVyY2xhc3NgIFttZW1iZXJdIGlzIGJlaW5nIGluaGVyaXRlZCBmcm9tCiAgLy8vIGEgc3VwZXJjbGFzcy4KICAvLy8KICAvLy8gSWYgW21lcmdlS2luZF0gaXMgYE1lcmdlS2luZC5pbnRlcmZhY2VzYCwgW21lbWJlcl0gaXMgaWdub3JlZCBmb3Igbm93LgogIC8vLwogIC8vLyBJZiBbbWVyZ2VLaW5kXSBpcyBgTWVyZ2VLaW5kLnN1cGVydHlwZXNgLCBbbWVtYmVyXSBpcyBpbXBsaWNpdGx5CiAgLy8vIGFic3RyYWN0LCBhbmQgbm90IGltcGxlbWVudGVkLgogIHZvaWQgaGFuZGxlT25seUIoCiAgICAgIEtlcm5lbENsYXNzQnVpbGRlciBjbHMsIERlY2xhcmF0aW9uIG1lbWJlciwgTWVyZ2VLaW5kIG1lcmdlS2luZCkgewogICAgTWVtYmVyIHRhcmdldCA9IG1lbWJlci50YXJnZXQ7CiAgICBpZiAobWVyZ2VLaW5kID09IE1lcmdlS2luZC5zdXBlcnR5cGVzIHx8CiAgICAgICAgKG1lcmdlS2luZCA9PSBNZXJnZUtpbmQuc3VwZXJjbGFzcyAmJiB0YXJnZXQuaXNBYnN0cmFjdCkpIHsKICAgICAgaWYgKGlzTmFtZVZpc2libGVJbih0YXJnZXQubmFtZSwgY2xzLmxpYnJhcnkpKSB7CiAgICAgICAgKGFic3RyYWN0TWVtYmVycyA/Pz0gPERlY2xhcmF0aW9uPltdKS5hZGQobWVtYmVyKTsKICAgICAgfQogICAgfQogICAgaWYgKG1lbWJlci5wYXJlbnQgIT0gb2JqZWN0Q2xhc3MgJiYKICAgICAgICB0YXJnZXQubmFtZSA9PSBub1N1Y2hNZXRob2ROYW1lICYmCiAgICAgICAgIXRhcmdldC5pc0Fic3RyYWN0KSB7CiAgICAgIGhhc05vU3VjaE1ldGhvZCA9IHRydWU7CiAgICB9CiAgfQoKICBDbGFzc0hpZXJhcmNoeU5vZGUgYnVpbGQoKSB7CiAgICBpZiAoY2xzLmlzUGF0Y2gpIHsKICAgICAgLy8gVE9ETyhhaGUpOiBXaGF0IGFib3V0IHBhdGNoIGNsYXNzZXMuIEhhdmUgd2UgaW5qZWN0ZWQgcGF0Y2hlZCBtZW1iZXJzCiAgICAgIC8vIGludG8gdGhlIGNsYXNzLWJ1aWxkZXIncyBzY29wZT8KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBDbGFzc0hpZXJhcmNoeU5vZGUgc3VwZXJub2RlOwogICAgaWYgKG9iamVjdENsYXNzICE9IGNscykgewogICAgICBzdXBlcm5vZGUgPSBoaWVyYXJjaHkuZ2V0Tm9kZUZyb21UeXBlKGNscy5zdXBlcnR5cGUpOwogICAgICBpZiAoc3VwZXJub2RlID09IG51bGwpIHsKICAgICAgICBzdXBlcm5vZGUgPSBoaWVyYXJjaHkuZ2V0Tm9kZUZyb21DbGFzcyhvYmplY3RDbGFzcyk7CiAgICAgIH0KICAgICAgYXNzZXJ0KHN1cGVybm9kZSAhPSBudWxsKTsKICAgIH0KCiAgICBTY29wZSBzY29wZSA9IGNscy5zY29wZTsKICAgIGlmIChjbHMuaXNNaXhpbkFwcGxpY2F0aW9uKSB7CiAgICAgIERlY2xhcmF0aW9uIG1peGluID0gY2xzLm1peGVkSW5UeXBlLmRlY2xhcmF0aW9uOwogICAgICBpbmZlck1peGluQXBwbGljYXRpb24oKTsKICAgICAgd2hpbGUgKG1peGluLmlzTmFtZWRNaXhpbkFwcGxpY2F0aW9uKSB7CiAgICAgICAgS2VybmVsQ2xhc3NCdWlsZGVyIG5hbWVkID0gbWl4aW47CiAgICAgICAgbWl4aW4gPSBuYW1lZC5taXhlZEluVHlwZS5kZWNsYXJhdGlvbjsKICAgICAgfQogICAgICBpZiAobWl4aW4gaXMgS2VybmVsQ2xhc3NCdWlsZGVyKSB7CiAgICAgICAgc2NvcGUgPSBtaXhpbi5zY29wZS5jb21wdXRlTWl4aW5TY29wZSgpOwogICAgICB9CiAgICB9CgogICAgLy8vIE1lbWJlcnMgKGV4Y2x1ZGluZyBzZXR0ZXJzKSBkZWNsYXJlZCBpbiBbY2xzXS4KICAgIExpc3Q8RGVjbGFyYXRpb24+IGxvY2FsTWVtYmVycyA9CiAgICAgICAgbmV3IExpc3Q8RGVjbGFyYXRpb24+LmZyb20oc2NvcGUubG9jYWwudmFsdWVzKQogICAgICAgICAgLi5zb3J0KGNvbXBhcmVEZWNsYXJhdGlvbnMpOwoKICAgIC8vLyBTZXR0ZXJzIGRlY2xhcmVkIGluIFtjbHNdLgogICAgTGlzdDxEZWNsYXJhdGlvbj4gbG9jYWxTZXR0ZXJzID0KICAgICAgICBuZXcgTGlzdDxEZWNsYXJhdGlvbj4uZnJvbShzY29wZS5zZXR0ZXJzLnZhbHVlcykKICAgICAgICAgIC4uc29ydChjb21wYXJlRGVjbGFyYXRpb25zKTsKCiAgICAvLyBBZGQgaW1wbGllZCBzZXR0ZXJzIGZyb20gZmllbGRzIGluIFtsb2NhbE1lbWJlcnNdLgogICAgbG9jYWxTZXR0ZXJzID0gbWVyZ2VBY2Nlc3NvcnMoY2xzLCBsb2NhbE1lbWJlcnMsIGxvY2FsU2V0dGVycyk7CgogICAgLy8vIE1lbWJlcnMgKGV4Y2x1ZGluZyBzZXR0ZXJzKSBkZWNsYXJlZCBpbiBbY2xzXSBvciBpdHMgc3VwZXJjbGFzc2VzLiBUaGlzCiAgICAvLy8gaW5jbHVkZXMgc3RhdGljIG1ldGhvZHMgb2YgW2Nsc10sIGJ1dCBub3QgaXRzIHN1cGVyY2xhc3Nlcy4KICAgIExpc3Q8RGVjbGFyYXRpb24+IGNsYXNzTWVtYmVyczsKCiAgICAvLy8gU2V0dGVycyBkZWNsYXJlZCBpbiBbY2xzXSBvciBpdHMgc3VwZXJjbGFzc2VzLiBUaGlzIGluY2x1ZGVzIHN0YXRpYwogICAgLy8vIHNldHRlcnMgb2YgW2Nsc10sIGJ1dCBub3QgaXRzIHN1cGVyY2xhc3Nlcy4KICAgIExpc3Q8RGVjbGFyYXRpb24+IGNsYXNzU2V0dGVyczsKCiAgICAvLy8gTWVtYmVycyAoZXhjbHVkaW5nIHNldHRlcnMpIGluaGVyaXRlZCBmcm9tIGludGVyZmFjZXMuIFRoaXMgY29udGFpbnMgbm8gc3RhdGljCiAgICAvLy8gbWVtYmVycy4gSXMgbnVsbCBpZiBubyBpbnRlcmZhY2VzIGFyZSBpbXBsZW1lbnRlZCBieSB0aGlzIGNsYXNzIG9yIGl0cwogICAgLy8vIHN1cGVyY2xhc3Nlcy4KICAgIExpc3Q8RGVjbGFyYXRpb24+IGludGVyZmFjZU1lbWJlcnM7CgogICAgLy8vIFNldHRlcnMgaW5oZXJpdGVkIGZyb20gaW50ZXJmYWNlcy4gVGhpcyBjb250YWlucyBubyBzdGF0aWMgc2V0dGVycy4gSXMKICAgIC8vLyBudWxsIGlmIG5vIGludGVyZmFjZXMgYXJlIGltcGxlbWVudGVkIGJ5IHRoaXMgY2xhc3Mgb3IgaXRzCiAgICAvLy8gc3VwZXJjbGFzc2VzLgogICAgTGlzdDxEZWNsYXJhdGlvbj4gaW50ZXJmYWNlU2V0dGVyczsKCiAgICBMaXN0PEtlcm5lbFR5cGVCdWlsZGVyPiBzdXBlcmNsYXNzZXM7CgogICAgTGlzdDxLZXJuZWxUeXBlQnVpbGRlcj4gaW50ZXJmYWNlczsKCiAgICBpbnQgbWF4SW5oZXJpdGFuY2VQYXRoOwoKICAgIGlmIChzdXBlcm5vZGUgPT0gbnVsbCkgewogICAgICAvLyBUaGlzIHNob3VsZCBiZSBPYmplY3QuCiAgICAgIGNsYXNzTWVtYmVycyA9IGxvY2FsTWVtYmVyczsKICAgICAgY2xhc3NTZXR0ZXJzID0gbG9jYWxTZXR0ZXJzOwogICAgICBzdXBlcmNsYXNzZXMgPSBuZXcgTGlzdDxLZXJuZWxUeXBlQnVpbGRlcj4oMCk7CiAgICAgIGludGVyZmFjZXMgPSBuZXcgTGlzdDxLZXJuZWxUeXBlQnVpbGRlcj4oMCk7CiAgICAgIG1heEluaGVyaXRhbmNlUGF0aCA9IDA7CiAgICB9IGVsc2UgewogICAgICBtYXhJbmhlcml0YW5jZVBhdGggPSBzdXBlcm5vZGUubWF4SW5oZXJpdGFuY2VQYXRoICsgMTsKICAgICAgc3VwZXJjbGFzc2VzID0KICAgICAgICAgIG5ldyBMaXN0PEtlcm5lbFR5cGVCdWlsZGVyPihzdXBlcm5vZGUuc3VwZXJjbGFzc2VzLmxlbmd0aCArIDEpOwogICAgICBzdXBlcmNsYXNzZXMuc2V0UmFuZ2UoMCwgc3VwZXJjbGFzc2VzLmxlbmd0aCAtIDEsCiAgICAgICAgICBzdWJzdFN1cGVydHlwZXMoY2xzLnN1cGVydHlwZSwgc3VwZXJub2RlLnN1cGVyY2xhc3NlcykpOwogICAgICBzdXBlcmNsYXNzZXNbc3VwZXJjbGFzc2VzLmxlbmd0aCAtIDFdID0gY2xzLnN1cGVydHlwZTsKCiAgICAgIGNsYXNzTWVtYmVycyA9IG1lcmdlKAogICAgICAgICAgY2xzLCBsb2NhbE1lbWJlcnMsIHN1cGVybm9kZS5jbGFzc01lbWJlcnMsIE1lcmdlS2luZC5zdXBlcmNsYXNzKTsKICAgICAgY2xhc3NTZXR0ZXJzID0gbWVyZ2UoCiAgICAgICAgICBjbHMsIGxvY2FsU2V0dGVycywgc3VwZXJub2RlLmNsYXNzU2V0dGVycywgTWVyZ2VLaW5kLnN1cGVyY2xhc3MpOwoKICAgICAgLy8gQ2hlY2sgaWYgbG9jYWwgbWVtYmVycyBjb25mbGljdCB3aXRoIGluaGVyaXRlZCBzZXR0ZXJzLiBUaGlzIGNoZWNrIGhhcwogICAgICAvLyBhbHJlYWR5IGJlZW4gcGVyZm9ybWVkIGluIHRoZSBzdXBlcmNsYXNzLCBzbyB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgdGhlCiAgICAgIC8vIGxvY2FsIG1lbWJlcnMuCiAgICAgIG1lcmdlKGNscywgbG9jYWxNZW1iZXJzLCBjbGFzc1NldHRlcnMsIE1lcmdlS2luZC5hY2Nlc3NvcnMpOwoKICAgICAgLy8gQ2hlY2sgaWYgbG9jYWwgc2V0dGVycyBjb25mbGljdCB3aXRoIGluaGVyaXRlZCBtZW1iZXJzLiBBcyBhYm92ZSwgd2UKICAgICAgLy8gb25seSBuZWVkIHRvIGNoZWNrIHRoZSBsb2NhbCBzZXR0ZXJzLgogICAgICBtZXJnZShjbHMsIGxvY2FsU2V0dGVycywgY2xhc3NNZW1iZXJzLCBNZXJnZUtpbmQuYWNjZXNzb3JzKTsKCiAgICAgIExpc3Q8S2VybmVsVHlwZUJ1aWxkZXI+IGRpcmVjdEludGVyZmFjZXMgPSBjbHMuaW50ZXJmYWNlczsKICAgICAgaWYgKGNscy5pc01peGluQXBwbGljYXRpb24pIHsKICAgICAgICBpZiAoZGlyZWN0SW50ZXJmYWNlcyA9PSBudWxsKSB7CiAgICAgICAgICBkaXJlY3RJbnRlcmZhY2VzID0gPEtlcm5lbFR5cGVCdWlsZGVyPltjbHMubWl4ZWRJblR5cGVdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkaXJlY3RJbnRlcmZhY2VzID0gPEtlcm5lbFR5cGVCdWlsZGVyPltjbHMubWl4ZWRJblR5cGVdCiAgICAgICAgICAgIC4uYWRkQWxsKGRpcmVjdEludGVyZmFjZXMpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZGlyZWN0SW50ZXJmYWNlcyAhPSBudWxsKSB7CiAgICAgICAgTWVyZ2VSZXN1bHQgcmVzdWx0ID0gbWVyZ2VJbnRlcmZhY2VzKGNscywgc3VwZXJub2RlLCBkaXJlY3RJbnRlcmZhY2VzKTsKICAgICAgICBpbnRlcmZhY2VNZW1iZXJzID0gcmVzdWx0Lm1lcmdlZE1lbWJlcnM7CiAgICAgICAgaW50ZXJmYWNlU2V0dGVycyA9IHJlc3VsdC5tZXJnZWRTZXR0ZXJzOwogICAgICAgIGludGVyZmFjZXMgPSA8S2VybmVsVHlwZUJ1aWxkZXI+W107CiAgICAgICAgaWYgKHN1cGVybm9kZS5pbnRlcmZhY2VzICE9IG51bGwpIHsKICAgICAgICAgIExpc3Q8S2VybmVsVHlwZUJ1aWxkZXI+IHR5cGVzID0KICAgICAgICAgICAgICBzdWJzdFN1cGVydHlwZXMoY2xzLnN1cGVydHlwZSwgc3VwZXJub2RlLmludGVyZmFjZXMpOwogICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBhZGRJbnRlcmZhY2UoaW50ZXJmYWNlcywgc3VwZXJjbGFzc2VzLCB0eXBlc1tpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlyZWN0SW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgS2VybmVsVHlwZUJ1aWxkZXIgZGlyZWN0SW50ZXJmYWNlID0gZGlyZWN0SW50ZXJmYWNlc1tpXTsKICAgICAgICAgIGFkZEludGVyZmFjZShpbnRlcmZhY2VzLCBzdXBlcmNsYXNzZXMsIGRpcmVjdEludGVyZmFjZSk7CiAgICAgICAgICBDbGFzc0hpZXJhcmNoeU5vZGUgaW50ZXJmYWNlTm9kZSA9CiAgICAgICAgICAgICAgaGllcmFyY2h5LmdldE5vZGVGcm9tVHlwZShkaXJlY3RJbnRlcmZhY2UpOwogICAgICAgICAgaWYgKGludGVyZmFjZU5vZGUgIT0gbnVsbCkgewogICAgICAgICAgICBpZiAobWF4SW5oZXJpdGFuY2VQYXRoIDwgaW50ZXJmYWNlTm9kZS5tYXhJbmhlcml0YW5jZVBhdGggKyAxKSB7CiAgICAgICAgICAgICAgbWF4SW5oZXJpdGFuY2VQYXRoID0gaW50ZXJmYWNlTm9kZS5tYXhJbmhlcml0YW5jZVBhdGggKyAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIExpc3Q8S2VybmVsVHlwZUJ1aWxkZXI+IHR5cGVzID0KICAgICAgICAgICAgICAgIHN1YnN0U3VwZXJ0eXBlcyhkaXJlY3RJbnRlcmZhY2UsIGludGVyZmFjZU5vZGUuc3VwZXJjbGFzc2VzKTsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGFkZEludGVyZmFjZShpbnRlcmZhY2VzLCBzdXBlcmNsYXNzZXMsIHR5cGVzW2ldKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGludGVyZmFjZU5vZGUuaW50ZXJmYWNlcyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgTGlzdDxLZXJuZWxUeXBlQnVpbGRlcj4gdHlwZXMgPQogICAgICAgICAgICAgICAgICBzdWJzdFN1cGVydHlwZXMoZGlyZWN0SW50ZXJmYWNlLCBpbnRlcmZhY2VOb2RlLmludGVyZmFjZXMpOwogICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGFkZEludGVyZmFjZShpbnRlcmZhY2VzLCBzdXBlcmNsYXNzZXMsIHR5cGVzW2ldKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW50ZXJmYWNlTWVtYmVycyA9IHN1cGVybm9kZS5pbnRlcmZhY2VNZW1iZXJzOwogICAgICAgIGludGVyZmFjZVNldHRlcnMgPSBzdXBlcm5vZGUuaW50ZXJmYWNlU2V0dGVyczsKICAgICAgICBpbnRlcmZhY2VzID0gc3Vic3RTdXBlcnR5cGVzKGNscy5zdXBlcnR5cGUsIHN1cGVybm9kZS5pbnRlcmZhY2VzKTsKICAgICAgfQogICAgICBpZiAoaW50ZXJmYWNlTWVtYmVycyAhPSBudWxsKSB7CiAgICAgICAgaW50ZXJmYWNlTWVtYmVycyA9CiAgICAgICAgICAgIG1lcmdlKGNscywgY2xhc3NNZW1iZXJzLCBpbnRlcmZhY2VNZW1iZXJzLCBNZXJnZUtpbmQuc3VwZXJ0eXBlcyk7CgogICAgICAgIC8vIENoZWNrIGlmIGNsYXNzIHNldHRlcnMgY29uZmxpY3Qgd2l0aCBtZW1iZXJzIGluaGVyaXRlZCBmcm9tCiAgICAgICAgLy8gaW50ZXJmYWNlcy4KICAgICAgICBtZXJnZShjbHMsIGNsYXNzU2V0dGVycywgaW50ZXJmYWNlTWVtYmVycywgTWVyZ2VLaW5kLmFjY2Vzc29ycyk7CiAgICAgIH0KICAgICAgaWYgKGludGVyZmFjZVNldHRlcnMgIT0gbnVsbCkgewogICAgICAgIGludGVyZmFjZVNldHRlcnMgPQogICAgICAgICAgICBtZXJnZShjbHMsIGNsYXNzU2V0dGVycywgaW50ZXJmYWNlU2V0dGVycywgTWVyZ2VLaW5kLnN1cGVydHlwZXMpOwoKICAgICAgICAvLyBDaGVjayBpZiBjbGFzcyBtZW1iZXJzIGNvbmZsaWN0IHdpdGggc2V0dGVycyBpbmhlcml0ZWQgZnJvbQogICAgICAgIC8vIGludGVyZmFjZXMuCiAgICAgICAgbWVyZ2UoY2xzLCBjbGFzc01lbWJlcnMsIGludGVyZmFjZVNldHRlcnMsIE1lcmdlS2luZC5hY2Nlc3NvcnMpOwogICAgICB9CiAgICB9CiAgICBpZiAoYWJzdHJhY3RNZW1iZXJzICE9IG51bGwgJiYgIWNscy5pc0Fic3RyYWN0KSB7CiAgICAgIGlmICghaGFzTm9TdWNoTWV0aG9kKSB7CiAgICAgICAgcmVwb3J0TWlzc2luZ01lbWJlcnMoY2xzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbnN0YWxsTnNtSGFuZGxlcnMoY2xzKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBDbGFzc0hpZXJhcmNoeU5vZGUoCiAgICAgIGNscywKICAgICAgY2xhc3NNZW1iZXJzLAogICAgICBjbGFzc1NldHRlcnMsCiAgICAgIGludGVyZmFjZU1lbWJlcnMsCiAgICAgIGludGVyZmFjZVNldHRlcnMsCiAgICAgIHN1cGVyY2xhc3NlcywKICAgICAgaW50ZXJmYWNlcywKICAgICAgbWF4SW5oZXJpdGFuY2VQYXRoLAogICAgKTsKICB9CgogIExpc3Q8S2VybmVsVHlwZUJ1aWxkZXI+IHN1YnN0U3VwZXJ0eXBlcygKICAgICAgS2VybmVsTmFtZWRUeXBlQnVpbGRlciBzdXBlcnR5cGUsIExpc3Q8S2VybmVsVHlwZUJ1aWxkZXI+IHN1cGVydHlwZXMpIHsKICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gc3VwZXJ0eXBlLmRlY2xhcmF0aW9uOwogICAgaWYgKGRlY2xhcmF0aW9uIGlzISBLZXJuZWxDbGFzc0J1aWxkZXIpIHJldHVybiBzdXBlcnR5cGVzOwogICAgS2VybmVsQ2xhc3NCdWlsZGVyIGNscyA9IGRlY2xhcmF0aW9uOwogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPFR5cGVCdWlsZGVyLCBPYmplY3Q+PiB0eXBlVmFyaWFibGVzID0KICAgICAgICBjbHMudHlwZVZhcmlhYmxlczsKICAgIGlmICh0eXBlVmFyaWFibGVzID09IG51bGwpIHJldHVybiBzdXBlcnR5cGVzOwogICAgTWFwPFR5cGVWYXJpYWJsZUJ1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4sIFR5cGVCdWlsZGVyPiBzdWJzdGl0dXRpb24gPQogICAgICAgIDxUeXBlVmFyaWFibGVCdWlsZGVyPFR5cGVCdWlsZGVyLCBPYmplY3Q+LCBUeXBlQnVpbGRlcj57fTsKICAgIExpc3Q8S2VybmVsVHlwZUJ1aWxkZXI+IGFyZ3VtZW50cyA9CiAgICAgICAgc3VwZXJ0eXBlLmFyZ3VtZW50cyA/PyBjb21wdXRlRGVmYXVsdFR5cGVBcmd1bWVudHMoc3VwZXJ0eXBlKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVZhcmlhYmxlcy5sZW5ndGg7IGkrKykgewogICAgICBzdWJzdGl0dXRpb25bdHlwZVZhcmlhYmxlc1tpXV0gPSBhcmd1bWVudHNbaV07CiAgICB9CiAgICBMaXN0PEtlcm5lbFR5cGVCdWlsZGVyPiByZXN1bHQ7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1cGVydHlwZXMubGVuZ3RoOyBpKyspIHsKICAgICAgS2VybmVsVHlwZUJ1aWxkZXIgc3VwZXJ0eXBlID0gc3VwZXJ0eXBlc1tpXTsKICAgICAgS2VybmVsVHlwZUJ1aWxkZXIgc3Vic3RlZCA9IHN1cGVydHlwZS5zdWJzdChzdWJzdGl0dXRpb24pOwogICAgICBpZiAoc3VwZXJ0eXBlICE9IHN1YnN0ZWQpIHsKICAgICAgICByZXN1bHQgPz89IHN1cGVydHlwZXMudG9MaXN0KCk7CiAgICAgICAgcmVzdWx0W2ldID0gc3Vic3RlZDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdCA/PyBzdXBlcnR5cGVzOwogIH0KCiAgTGlzdDxLZXJuZWxUeXBlQnVpbGRlcj4gY29tcHV0ZURlZmF1bHRUeXBlQXJndW1lbnRzKEtlcm5lbFR5cGVCdWlsZGVyIHR5cGUpIHsKICAgIEtlcm5lbENsYXNzQnVpbGRlciBjbHMgPSB0eXBlLmRlY2xhcmF0aW9uOwogICAgTGlzdDxLZXJuZWxUeXBlQnVpbGRlcj4gcmVzdWx0ID0KICAgICAgICBuZXcgTGlzdDxLZXJuZWxUeXBlQnVpbGRlcj4oY2xzLnR5cGVWYXJpYWJsZXMubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgKytpKSB7CiAgICAgIHJlc3VsdFtpXSA9IGNscy50eXBlVmFyaWFibGVzW2ldLmRlZmF1bHRUeXBlOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEtlcm5lbFR5cGVCdWlsZGVyIGFkZEludGVyZmFjZShMaXN0PEtlcm5lbFR5cGVCdWlsZGVyPiBpbnRlcmZhY2VzLAogICAgICBMaXN0PEtlcm5lbFR5cGVCdWlsZGVyPiBzdXBlcmNsYXNzZXMsIEtlcm5lbFR5cGVCdWlsZGVyIHR5cGUpIHsKICAgIENsYXNzSGllcmFyY2h5Tm9kZSBub2RlID0gaGllcmFyY2h5LmdldE5vZGVGcm9tVHlwZSh0eXBlKTsKICAgIGlmIChub2RlID09IG51bGwpIHJldHVybiBudWxsOwogICAgaW50IGRlcHRoID0gbm9kZS5kZXB0aDsKICAgIGludCBteURlcHRoID0gc3VwZXJjbGFzc2VzLmxlbmd0aDsKICAgIGlmIChkZXB0aCA8IG15RGVwdGggJiYgc3VwZXJjbGFzc2VzW2RlcHRoXS5kZWNsYXJhdGlvbiA9PSBub2RlLmNscykgewogICAgICAvLyBUaGlzIGlzIGEgcG90ZW50aWFsIGNvbmZsaWN0LgogICAgICByZXR1cm4gc3VwZXJjbGFzc2VzW2RlcHRoXTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgewogICAgICAgIC8vIFRoaXMgaXMgYSBxdWFkcmF0aWMgYWxnb3JpdGhtLCBidXQgbm9ybWFsbHksIHRoZSBudW1iZXIgb2YKICAgICAgICAvLyBpbnRlcmZhY2VzIGlzIHJlYWxseSBzbWFsbC4KICAgICAgICBpZiAoaW50ZXJmYWNlc1tpXS5kZWNsYXJhdGlvbiA9PSB0eXBlLmRlY2xhcmF0aW9uKSB7CiAgICAgICAgICAvLyBUaGlzIGlzIGEgcG90ZW50aWFsIGNvbmZsaWN0LgogICAgICAgICAgcmV0dXJuIGludGVyZmFjZXNbaV07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpbnRlcmZhY2VzLmFkZCh0eXBlKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgTWVyZ2VSZXN1bHQgbWVyZ2VJbnRlcmZhY2VzKEtlcm5lbENsYXNzQnVpbGRlciBjbHMsCiAgICAgIENsYXNzSGllcmFyY2h5Tm9kZSBzdXBlcm5vZGUsIExpc3Q8S2VybmVsVHlwZUJ1aWxkZXI+IGludGVyZmFjZXMpIHsKICAgIExpc3Q8TGlzdDxEZWNsYXJhdGlvbj4+IG1lbWJlckxpc3RzID0KICAgICAgICBuZXcgTGlzdDxMaXN0PERlY2xhcmF0aW9uPj4oaW50ZXJmYWNlcy5sZW5ndGggKyAxKTsKICAgIExpc3Q8TGlzdDxEZWNsYXJhdGlvbj4+IHNldHRlckxpc3RzID0KICAgICAgICBuZXcgTGlzdDxMaXN0PERlY2xhcmF0aW9uPj4oaW50ZXJmYWNlcy5sZW5ndGggKyAxKTsKICAgIG1lbWJlckxpc3RzWzBdID0gc3VwZXJub2RlLmludGVyZmFjZU1lbWJlcnM7CiAgICBzZXR0ZXJMaXN0c1swXSA9IHN1cGVybm9kZS5pbnRlcmZhY2VTZXR0ZXJzOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIENsYXNzSGllcmFyY2h5Tm9kZSBpbnRlcmZhY2VOb2RlID0KICAgICAgICAgIGhpZXJhcmNoeS5nZXROb2RlRnJvbVR5cGUoaW50ZXJmYWNlc1tpXSk7CiAgICAgIGlmIChpbnRlcmZhY2VOb2RlID09IG51bGwpIHsKICAgICAgICBtZW1iZXJMaXN0c1tpICsgMV0gPSBudWxsOwogICAgICAgIHNldHRlckxpc3RzW2kgKyAxXSA9IG51bGw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbWVtYmVyTGlzdHNbaSArIDFdID0KICAgICAgICAgICAgaW50ZXJmYWNlTm9kZS5pbnRlcmZhY2VNZW1iZXJzID8/IGludGVyZmFjZU5vZGUuY2xhc3NNZW1iZXJzOwogICAgICAgIHNldHRlckxpc3RzW2kgKyAxXSA9CiAgICAgICAgICAgIGludGVyZmFjZU5vZGUuaW50ZXJmYWNlU2V0dGVycyA/PyBpbnRlcmZhY2VOb2RlLmNsYXNzU2V0dGVyczsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBNZXJnZVJlc3VsdCgKICAgICAgICBtZXJnZUxpc3RzKGNscywgbWVtYmVyTGlzdHMpLCBtZXJnZUxpc3RzKGNscywgc2V0dGVyTGlzdHMpKTsKICB9CgogIExpc3Q8RGVjbGFyYXRpb24+IG1lcmdlTGlzdHMoCiAgICAgIEtlcm5lbENsYXNzQnVpbGRlciBjbHMsIExpc3Q8TGlzdDxEZWNsYXJhdGlvbj4+IGlucHV0KSB7CiAgICAvLyBUaGlzIGlzIGEgay13YXkgbWVyZ2Ugc29ydCAod2hlcmUgayBpcyBgaW5wdXQubGVuZ3RoICsgMWApLiBXZSBtZXJnZSB0aGUKICAgIC8vIGxpc3RzIHBhaXJ3aXNlLCB3aGljaCByZWR1Y2VzIHRoZSBudW1iZXIgb2YgbGlzdHMgdG8gbWVyZ2UgYnkgaGFsZiBvbgogICAgLy8gZWFjaCBpdGVyYXRpb24uIENvbnNlcXVlbnRseSwgd2UgcGVyZm9ybSBPKGxvZyBrKSBtZXJnZXMuCiAgICB3aGlsZSAoaW5wdXQubGVuZ3RoID4gMSkgewogICAgICBMaXN0PExpc3Q8RGVjbGFyYXRpb24+PiBvdXRwdXQgPSA8TGlzdDxEZWNsYXJhdGlvbj4+W107CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoIC0gMTsgaSArPSAyKSB7CiAgICAgICAgTGlzdDxEZWNsYXJhdGlvbj4gZmlyc3QgPSBpbnB1dFtpXTsKICAgICAgICBMaXN0PERlY2xhcmF0aW9uPiBzZWNvbmQgPSBpbnB1dFtpICsgMV07CiAgICAgICAgaWYgKGZpcnN0ID09IG51bGwpIHsKICAgICAgICAgIG91dHB1dC5hZGQoc2Vjb25kKTsKICAgICAgICB9IGVsc2UgaWYgKHNlY29uZCA9PSBudWxsKSB7CiAgICAgICAgICBvdXRwdXQuYWRkKGZpcnN0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgb3V0cHV0LmFkZChtZXJnZShjbHMsIGZpcnN0LCBzZWNvbmQsIE1lcmdlS2luZC5pbnRlcmZhY2VzKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpbnB1dC5sZW5ndGguaXNPZGQpIHsKICAgICAgICBvdXRwdXQuYWRkKGlucHV0Lmxhc3QpOwogICAgICB9CiAgICAgIGlucHV0ID0gb3V0cHV0OwogICAgfQogICAgcmV0dXJuIGlucHV0LnNpbmdsZTsKICB9CgogIC8vLyBNZXJnZSBbYW5kIGNoZWNrXSBhY2Nlc3NvcnMuIFRoaXMgZW50YWlscyBjb3B5aW5nIG11dGFibGUgZmllbGRzIHRvCiAgLy8vIHNldHRlcnMgdG8gc2ltdWxhdGUgaW1wbGllZCBzZXR0ZXJzLCBhbmQgY2hlY2tpbmcgdGhhdCBzZXR0ZXJzIGRvbid0CiAgLy8vIG92ZXJyaWRlIHJlZ3VsYXIgbWV0aG9kcy4KICBMaXN0PERlY2xhcmF0aW9uPiBtZXJnZUFjY2Vzc29ycyhLZXJuZWxDbGFzc0J1aWxkZXIgY2xzLAogICAgICBMaXN0PERlY2xhcmF0aW9uPiBtZW1iZXJzLCBMaXN0PERlY2xhcmF0aW9uPiBzZXR0ZXJzKSB7CiAgICBmaW5hbCBMaXN0PERlY2xhcmF0aW9uPiBtZXJnZWRTZXR0ZXJzID0gbmV3IExpc3Q8RGVjbGFyYXRpb24+LmZpbGxlZCgKICAgICAgICBtZW1iZXJzLmxlbmd0aCArIHNldHRlcnMubGVuZ3RoLCBudWxsLAogICAgICAgIGdyb3dhYmxlOiB0cnVlKTsKICAgIGludCBzdG9yZUluZGV4ID0gMDsKICAgIGludCBpID0gMDsKICAgIGludCBqID0gMDsKICAgIHdoaWxlIChpIDwgbWVtYmVycy5sZW5ndGggJiYgaiA8IHNldHRlcnMubGVuZ3RoKSB7CiAgICAgIGZpbmFsIERlY2xhcmF0aW9uIG1lbWJlciA9IG1lbWJlcnNbaV07CiAgICAgIGZpbmFsIERlY2xhcmF0aW9uIHNldHRlciA9IHNldHRlcnNbal07CiAgICAgIGZpbmFsIGludCBjb21wYXJlID0gY29tcGFyZURlY2xhcmF0aW9ucyhtZW1iZXIsIHNldHRlcik7CiAgICAgIGlmIChjb21wYXJlID09IDApIHsKICAgICAgICBtZXJnZWRTZXR0ZXJzW3N0b3JlSW5kZXgrK10gPSBzZXR0ZXI7CiAgICAgICAgaSsrOwogICAgICAgIGorKzsKICAgICAgfSBlbHNlIGlmIChjb21wYXJlIDwgMCkgewogICAgICAgIGlmIChpbXBsaWVzU2V0dGVyKG1lbWJlcikpIHsKICAgICAgICAgIG1lcmdlZFNldHRlcnNbc3RvcmVJbmRleCsrXSA9IG1lbWJlcjsKICAgICAgICB9CiAgICAgICAgaSsrOwogICAgICB9IGVsc2UgewogICAgICAgIG1lcmdlZFNldHRlcnNbc3RvcmVJbmRleCsrXSA9IHNldHRlcnNbal07CiAgICAgICAgaisrOwogICAgICB9CiAgICB9CiAgICB3aGlsZSAoaSA8IG1lbWJlcnMubGVuZ3RoKSB7CiAgICAgIGZpbmFsIERlY2xhcmF0aW9uIG1lbWJlciA9IG1lbWJlcnNbaV07CiAgICAgIGlmIChpbXBsaWVzU2V0dGVyKG1lbWJlcikpIHsKICAgICAgICBtZXJnZWRTZXR0ZXJzW3N0b3JlSW5kZXgrK10gPSBtZW1iZXI7CiAgICAgIH0KICAgICAgaSsrOwogICAgfQogICAgd2hpbGUgKGogPCBzZXR0ZXJzLmxlbmd0aCkgewogICAgICBtZXJnZWRTZXR0ZXJzW3N0b3JlSW5kZXgrK10gPSBzZXR0ZXJzW2pdOwogICAgICBqKys7CiAgICB9CgogICAgaWYgKHN0b3JlSW5kZXggPT0gaikgewogICAgICByZXR1cm4gc2V0dGVyczsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBtZXJnZWRTZXR0ZXJzLi5sZW5ndGggPSBzdG9yZUluZGV4OwogICAgfQogIH0KCiAgdm9pZCByZXBvcnRNaXNzaW5nTWVtYmVycyhLZXJuZWxDbGFzc0J1aWxkZXIgY2xzKSB7CiAgICBNYXA8U3RyaW5nLCBMb2NhdGVkTWVzc2FnZT4gY29udGV4dE1hcCA9IDxTdHJpbmcsIExvY2F0ZWRNZXNzYWdlPnt9OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhYnN0cmFjdE1lbWJlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBhYnN0cmFjdE1lbWJlcnNbaV07CiAgICAgIE1lbWJlciB0YXJnZXQgPSBkZWNsYXJhdGlvbi50YXJnZXQ7CiAgICAgIGlmIChpc05hbWVWaXNpYmxlSW4odGFyZ2V0Lm5hbWUsIGNscy5saWJyYXJ5KSkgewogICAgICAgIFN0cmluZyBuYW1lID0gZGVjbGFyYXRpb24uZnVsbE5hbWVGb3JFcnJvcnM7CiAgICAgICAgU3RyaW5nIHBhcmVudE5hbWUgPSBkZWNsYXJhdGlvbi5wYXJlbnQuZnVsbE5hbWVGb3JFcnJvcnM7CiAgICAgICAgU3RyaW5nIGRpc3BsYXlOYW1lID0KICAgICAgICAgICAgZGVjbGFyYXRpb24uaXNTZXR0ZXIgPyAiJHBhcmVudE5hbWUuJG5hbWU9IiA6ICIkcGFyZW50TmFtZS4kbmFtZSI7CiAgICAgICAgY29udGV4dE1hcFtkaXNwbGF5TmFtZV0gPSB0ZW1wbGF0ZU1pc3NpbmdJbXBsZW1lbnRhdGlvbkNhdXNlCiAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGRpc3BsYXlOYW1lKQogICAgICAgICAgICAud2l0aExvY2F0aW9uKAogICAgICAgICAgICAgICAgZGVjbGFyYXRpb24uZmlsZVVyaSwgZGVjbGFyYXRpb24uY2hhck9mZnNldCwgbmFtZS5sZW5ndGgpOwogICAgICB9CiAgICB9CiAgICBpZiAoY29udGV4dE1hcC5pc0VtcHR5KSByZXR1cm47CiAgICBMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgTGlzdDxTdHJpbmc+LmZyb20oY29udGV4dE1hcC5rZXlzKS4uc29ydCgpOwogICAgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dCA9IDxMb2NhdGVkTWVzc2FnZT5bXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKICAgICAgY29udGV4dC5hZGQoY29udGV4dE1hcFtuYW1lc1tpXV0pOwogICAgfQogICAgY2xzLmFkZFByb2JsZW0oCiAgICAgICAgdGVtcGxhdGVNaXNzaW5nSW1wbGVtZW50YXRpb25Ob3RBYnN0cmFjdC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICBjbHMuZnVsbE5hbWVGb3JFcnJvcnMsIG5hbWVzKSwKICAgICAgICBjbHMuY2hhck9mZnNldCwKICAgICAgICBjbHMuZnVsbE5hbWVGb3JFcnJvcnMubGVuZ3RoLAogICAgICAgIGNvbnRleHQ6IGNvbnRleHQpOwogIH0KCiAgdm9pZCBpbnN0YWxsTnNtSGFuZGxlcnMoS2VybmVsQ2xhc3NCdWlsZGVyIGNscykgewogICAgLy8gVE9PRChhaGUpOiBJbXBsZW1lbnQgdGhpcy4KICB9CgogIExpc3Q8RGVjbGFyYXRpb24+IG1lcmdlKEtlcm5lbENsYXNzQnVpbGRlciBjbHMsIExpc3Q8RGVjbGFyYXRpb24+IGFMaXN0LAogICAgICBMaXN0PERlY2xhcmF0aW9uPiBiTGlzdCwgTWVyZ2VLaW5kIG1lcmdlS2luZCkgewogICAgZmluYWwgTGlzdDxEZWNsYXJhdGlvbj4gcmVzdWx0ID0gbmV3IExpc3Q8RGVjbGFyYXRpb24+LmZpbGxlZCgKICAgICAgICBhTGlzdC5sZW5ndGggKyBiTGlzdC5sZW5ndGgsIG51bGwsCiAgICAgICAgZ3Jvd2FibGU6IHRydWUpOwogICAgaW50IHN0b3JlSW5kZXggPSAwOwogICAgaW50IGkgPSAwOwogICAgaW50IGogPSAwOwogICAgd2hpbGUgKGkgPCBhTGlzdC5sZW5ndGggJiYgaiA8IGJMaXN0Lmxlbmd0aCkgewogICAgICBmaW5hbCBEZWNsYXJhdGlvbiBhID0gYUxpc3RbaV07CiAgICAgIGZpbmFsIERlY2xhcmF0aW9uIGIgPSBiTGlzdFtqXTsKICAgICAgaWYgKG1lcmdlS2luZCA9PSBNZXJnZUtpbmQuaW50ZXJmYWNlcyAmJiBhLmlzU3RhdGljKSB7CiAgICAgICAgaSsrOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChiLmlzU3RhdGljKSB7CiAgICAgICAgaisrOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZpbmFsIGludCBjb21wYXJlID0gY29tcGFyZURlY2xhcmF0aW9ucyhhLCBiKTsKICAgICAgaWYgKGNvbXBhcmUgPT0gMCkgewogICAgICAgIHJlc3VsdFtzdG9yZUluZGV4KytdID0gaGFuZGxlTWVyZ2VDb25mbGljdChjbHMsIGEsIGIsIG1lcmdlS2luZCk7CiAgICAgICAgaSsrOwogICAgICAgIGorKzsKICAgICAgfSBlbHNlIGlmIChjb21wYXJlIDwgMCkgewogICAgICAgIGhhbmRsZU9ubHlBKGEsIG1lcmdlS2luZCk7CiAgICAgICAgcmVzdWx0W3N0b3JlSW5kZXgrK10gPSBhOwogICAgICAgIGkrKzsKICAgICAgfSBlbHNlIHsKICAgICAgICBoYW5kbGVPbmx5QihjbHMsIGIsIG1lcmdlS2luZCk7CiAgICAgICAgcmVzdWx0W3N0b3JlSW5kZXgrK10gPSBiOwogICAgICAgIGorKzsKICAgICAgfQogICAgfQogICAgd2hpbGUgKGkgPCBhTGlzdC5sZW5ndGgpIHsKICAgICAgZmluYWwgRGVjbGFyYXRpb24gYSA9IGFMaXN0W2ldOwogICAgICBpZiAobWVyZ2VLaW5kICE9IE1lcmdlS2luZC5pbnRlcmZhY2VzIHx8ICFhLmlzU3RhdGljKSB7CiAgICAgICAgaGFuZGxlT25seUEoYSwgbWVyZ2VLaW5kKTsKICAgICAgICByZXN1bHRbc3RvcmVJbmRleCsrXSA9IGE7CiAgICAgIH0KICAgICAgaSsrOwogICAgfQogICAgd2hpbGUgKGogPCBiTGlzdC5sZW5ndGgpIHsKICAgICAgZmluYWwgRGVjbGFyYXRpb24gYiA9IGJMaXN0W2pdOwogICAgICBpZiAoIWIuaXNTdGF0aWMpIHsKICAgICAgICBoYW5kbGVPbmx5QihjbHMsIGIsIG1lcmdlS2luZCk7CiAgICAgICAgcmVzdWx0W3N0b3JlSW5kZXgrK10gPSBiOwogICAgICB9CiAgICAgIGorKzsKICAgIH0KICAgIGlmIChhTGlzdC5pc0VtcHR5ICYmIHN0b3JlSW5kZXggPT0gYkxpc3QubGVuZ3RoKSByZXR1cm4gYkxpc3Q7CiAgICBpZiAoYkxpc3QuaXNFbXB0eSAmJiBzdG9yZUluZGV4ID09IGFMaXN0Lmxlbmd0aCkgcmV0dXJuIGFMaXN0OwogICAgcmV0dXJuIHJlc3VsdC4ubGVuZ3RoID0gc3RvcmVJbmRleDsKICB9CgogIHZvaWQgaW5mZXJNaXhpbkFwcGxpY2F0aW9uKCkgewogICAgQ2xhc3Mga2VybmVsQ2xhc3MgPSBjbHMudGFyZ2V0OwogICAgU3VwZXJ0eXBlIGtlcm5lbE1peGVkSW5UeXBlID0ga2VybmVsQ2xhc3MubWl4ZWRJblR5cGU7CiAgICBpZiAoa2VybmVsTWl4ZWRJblR5cGUgPT0gbnVsbCkgcmV0dXJuOwogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9IGtlcm5lbE1peGVkSW5UeXBlLnR5cGVBcmd1bWVudHM7CiAgICBpZiAodHlwZUFyZ3VtZW50cy5pc0VtcHR5IHx8IHR5cGVBcmd1bWVudHMuZmlyc3QgaXMhIFVua25vd25UeXBlKSByZXR1cm47CiAgICBuZXcgQnVpbGRlck1peGluSW5mZXJyZXIoCiAgICAgICAgICAgIGNscywKICAgICAgICAgICAgaGllcmFyY2h5LmNvcmVUeXBlcywKICAgICAgICAgICAgbmV3IFR5cGVCdWlsZGVyQ29uc3RyYWludEdhdGhlcmVyKAogICAgICAgICAgICAgICAgaGllcmFyY2h5LCBrZXJuZWxNaXhlZEluVHlwZS5jbGFzc05vZGUudHlwZVBhcmFtZXRlcnMpKQogICAgICAgIC5pbmZlcihrZXJuZWxDbGFzcyk7CiAgICBMaXN0PEtlcm5lbFR5cGVCdWlsZGVyPiBpbmZlcnJlZEFyZ3VtZW50cyA9CiAgICAgICAgbmV3IExpc3Q8S2VybmVsVHlwZUJ1aWxkZXI+KHR5cGVBcmd1bWVudHMubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpbmZlcnJlZEFyZ3VtZW50c1tpXSA9CiAgICAgICAgICBoaWVyYXJjaHkubG9hZGVyLmNvbXB1dGVUeXBlQnVpbGRlcih0eXBlQXJndW1lbnRzW2ldKTsKICAgIH0KICAgIEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIgbWl4ZWRJblR5cGUgPSBjbHMubWl4ZWRJblR5cGU7CiAgICBtaXhlZEluVHlwZS5hcmd1bWVudHMgPSBpbmZlcnJlZEFyZ3VtZW50czsKICB9Cn0KCmNsYXNzIENsYXNzSGllcmFyY2h5Tm9kZSB7CiAgLy8vIFRoZSBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaGllcmFyY2h5IG5vZGUuCiAgZmluYWwgS2VybmVsQ2xhc3NCdWlsZGVyIGNsczsKCiAgLy8vIEFsbCB0aGUgbWVtYmVycyBvZiB0aGlzIGNsYXNzIGluY2x1ZGluZyBbY2xhc3NNZW1iZXJzXSBvZiBpdHMKICAvLy8gc3VwZXJjbGFzc2VzLiBUaGUgbWVtYmVycyBhcmUgc29ydGVkIGJ5IFtjb21wYXJlRGVjbGFyYXRpb25zXS4KICBmaW5hbCBMaXN0PERlY2xhcmF0aW9uPiBjbGFzc01lbWJlcnM7CgogIC8vLyBTaW1pbGFyIHRvIFtjbGFzc01lbWJlcnNdIGJ1dCBmb3Igc2V0dGVycy4KICBmaW5hbCBMaXN0PERlY2xhcmF0aW9uPiBjbGFzc1NldHRlcnM7CgogIC8vLyBBbGwgdGhlIGludGVyZmFjZSBtZW1iZXJzIG9mIHRoaXMgY2xhc3MgaW5jbHVkaW5nIFtpbnRlcmZhY2VNZW1iZXJzXSBvZgogIC8vLyBpdHMgc3VwZXJ0eXBlcy4gVGhlIG1lbWJlcnMgYXJlIHNvcnRlZCBieSBbY29tcGFyZURlY2xhcmF0aW9uc10uCiAgLy8vCiAgLy8vIEluIGFkZGl0aW9uIHRvIHRoZSBtZW1iZXJzIG9mIFtjbGFzc01lbWJlcnNdIHRoaXMgYWxzbyBjb250YWlucyBtZW1iZXJzCiAgLy8vIGZyb20gaW50ZXJmYWNlcy4KICAvLy8KICAvLy8gVGhpcyBtYXkgYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSBbY2xhc3NNZW1iZXJzXSBpcyB0aGUgaW50ZXJmYWNlIG1lbWJlcnMuCiAgZmluYWwgTGlzdDxEZWNsYXJhdGlvbj4gaW50ZXJmYWNlTWVtYmVyczsKCiAgLy8vIFNpbWlsYXIgdG8gW2ludGVyZmFjZU1lbWJlcnNdIGJ1dCBmb3Igc2V0dGVycy4KICAvLy8KICAvLy8gVGhpcyBtYXkgYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSBbY2xhc3NTZXR0ZXJzXSBpcyB0aGUgaW50ZXJmYWNlIHNldHRlcnMuCiAgZmluYWwgTGlzdDxEZWNsYXJhdGlvbj4gaW50ZXJmYWNlU2V0dGVyczsKCiAgLy8vIEFsbCBzdXBlcmNsYXNzZXMgb2YgW2Nsc10gZXhjbHVkaW5nIGl0c2VsZi4gVGhlIGNsYXNzZXMgYXJlIHNvcnRlZCBieQogIC8vLyBkZXB0aCBmcm9tIHRoZSByb290IChPYmplY3QpIGluIGFzY2VuZGluZyBvcmRlci4KICBmaW5hbCBMaXN0PEtlcm5lbFR5cGVCdWlsZGVyPiBzdXBlcmNsYXNzZXM7CgogIC8vLyBUaGUgbGlzdCBvZiBhbGwgY2xhc3NlcyBpbXBsZW1lbnRlZCBieSBbY2xzXSBhbmQgaXRzIHN1cGVydHlwZXMgZXhjbHVkaW5nCiAgLy8vIGFueSBjbGFzc2VzIGZyb20gW3N1cGVyY2xhc3Nlc10uCiAgZmluYWwgTGlzdDxLZXJuZWxUeXBlQnVpbGRlcj4gaW50ZXJmYWNlczsKCiAgLy8vIFRoZSBsb25nZXN0IGluaGVyaXRhbmNlIHBhdGggZnJvbSBbY2xzXSB0byBgT2JqZWN0YC4KICBmaW5hbCBpbnQgbWF4SW5oZXJpdGFuY2VQYXRoOwoKICBpbnQgZ2V0IGRlcHRoID0+IHN1cGVyY2xhc3Nlcy5sZW5ndGg7CgogIENsYXNzSGllcmFyY2h5Tm9kZSgKICAgICAgdGhpcy5jbHMsCiAgICAgIHRoaXMuY2xhc3NNZW1iZXJzLAogICAgICB0aGlzLmNsYXNzU2V0dGVycywKICAgICAgdGhpcy5pbnRlcmZhY2VNZW1iZXJzLAogICAgICB0aGlzLmludGVyZmFjZVNldHRlcnMsCiAgICAgIHRoaXMuc3VwZXJjbGFzc2VzLAogICAgICB0aGlzLmludGVyZmFjZXMsCiAgICAgIHRoaXMubWF4SW5oZXJpdGFuY2VQYXRoKTsKCiAgLy8vIFJldHVybnMgYSBsaXN0IG9mIGFsbCBzdXBlcnR5cGVzIG9mIFtjbHNdLCBpbmNsdWRpbmcgdGhpcyBub2RlLgogIExpc3Q8Q2xhc3NIaWVyYXJjaHlOb2RlPiBjb21wdXRlQWxsU3VwZXJOb2RlcygKICAgICAgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGhpZXJhcmNoeSkgewogICAgTGlzdDxDbGFzc0hpZXJhcmNoeU5vZGU+IHJlc3VsdCA9IG5ldyBMaXN0PENsYXNzSGllcmFyY2h5Tm9kZT4oCiAgICAgICAgMSArIHN1cGVyY2xhc3Nlcy5sZW5ndGggKyBpbnRlcmZhY2VzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1cGVyY2xhc3Nlcy5sZW5ndGg7IGkrKykgewogICAgICBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IHN1cGVyY2xhc3Nlc1tpXS5kZWNsYXJhdGlvbjsKICAgICAgaWYgKGRlY2xhcmF0aW9uIGlzIEtlcm5lbENsYXNzQnVpbGRlcikgewogICAgICAgIHJlc3VsdFtpXSA9IGhpZXJhcmNoeS5nZXROb2RlRnJvbUNsYXNzKGRlY2xhcmF0aW9uKTsKICAgICAgfQogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gaW50ZXJmYWNlc1tpXS5kZWNsYXJhdGlvbjsKICAgICAgaWYgKGRlY2xhcmF0aW9uIGlzIEtlcm5lbENsYXNzQnVpbGRlcikgewogICAgICAgIHJlc3VsdFtpICsgc3VwZXJjbGFzc2VzLmxlbmd0aF0gPQogICAgICAgICAgICBoaWVyYXJjaHkuZ2V0Tm9kZUZyb21DbGFzcyhkZWNsYXJhdGlvbik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQuLmxhc3QgPSB0aGlzOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKFtTdHJpbmdCdWZmZXIgc2JdKSB7CiAgICBzYiA/Pz0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2IKICAgICAgLi53cml0ZShjbHMuZnVsbE5hbWVGb3JFcnJvcnMpCiAgICAgIC4ud3JpdGVsbigiOiIpOwogICAgaWYgKG1heEluaGVyaXRhbmNlUGF0aCAhPSB0aGlzLmRlcHRoKSB7CiAgICAgIHNiCiAgICAgICAgLi53cml0ZSgiICBMb25nZXN0IHBhdGggdG8gT2JqZWN0OiAiKQogICAgICAgIC4ud3JpdGVsbihtYXhJbmhlcml0YW5jZVBhdGgpOwogICAgfQogICAgc2IuLndyaXRlbG4oIiAgc3VwZXJjbGFzc2VzOiIpOwogICAgaW50IGRlcHRoID0gMDsKICAgIGZvciAoS2VybmVsVHlwZUJ1aWxkZXIgc3VwZXJjbGFzcyBpbiBzdXBlcmNsYXNzZXMpIHsKICAgICAgc2Iud3JpdGUoIiAgIiAqIChkZXB0aCArIDIpKTsKICAgICAgaWYgKGRlcHRoICE9IDApIHNiLndyaXRlKCItPiAiKTsKICAgICAgc3VwZXJjbGFzcy5wcmludE9uKHNiKTsKICAgICAgc2Iud3JpdGVsbigpOwogICAgICBkZXB0aCsrOwogICAgfQogICAgaWYgKGludGVyZmFjZXMgIT0gbnVsbCkgewogICAgICBzYi53cml0ZSgiICBpbnRlcmZhY2VzOiIpOwogICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgICAgZm9yIChLZXJuZWxUeXBlQnVpbGRlciBpIGluIGludGVyZmFjZXMpIHsKICAgICAgICBpZiAoIWZpcnN0KSBzYi53cml0ZSgiLCIpOwogICAgICAgIHNiLndyaXRlKCIgIik7CiAgICAgICAgaS5wcmludE9uKHNiKTsKICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICB9CiAgICAgIHNiLndyaXRlbG4oKTsKICAgIH0KICAgIHByaW50TWVtYmVycyhjbGFzc01lbWJlcnMsIHNiLCAiY2xhc3NNZW1iZXJzIik7CiAgICBwcmludE1lbWJlcnMoY2xhc3NTZXR0ZXJzLCBzYiwgImNsYXNzU2V0dGVycyIpOwogICAgaWYgKGludGVyZmFjZU1lbWJlcnMgIT0gbnVsbCkgewogICAgICBwcmludE1lbWJlcnMoaW50ZXJmYWNlTWVtYmVycywgc2IsICJpbnRlcmZhY2VNZW1iZXJzIik7CiAgICB9CiAgICBpZiAoaW50ZXJmYWNlU2V0dGVycyAhPSBudWxsKSB7CiAgICAgIHByaW50TWVtYmVycyhpbnRlcmZhY2VTZXR0ZXJzLCBzYiwgImludGVyZmFjZVNldHRlcnMiKTsKICAgIH0KICAgIHJldHVybiAiJHNiIjsKICB9CgogIHZvaWQgcHJpbnRNZW1iZXJzKAogICAgICBMaXN0PERlY2xhcmF0aW9uPiBtZW1iZXJzLCBTdHJpbmdCdWZmZXIgc2IsIFN0cmluZyBoZWFkaW5nKSB7CiAgICBzYi53cml0ZSgiICAiKTsKICAgIHNiLndyaXRlKGhlYWRpbmcpOwogICAgc2Iud3JpdGVsbigiOiIpOwogICAgZm9yIChEZWNsYXJhdGlvbiBtZW1iZXIgaW4gbWVtYmVycykgewogICAgICBzYgogICAgICAgIC4ud3JpdGUoIiAgICAiKQogICAgICAgIC4ud3JpdGUobWVtYmVyLnBhcmVudC5mdWxsTmFtZUZvckVycm9ycykKICAgICAgICAuLndyaXRlKCIuIikKICAgICAgICAuLndyaXRlKG1lbWJlci5mdWxsTmFtZUZvckVycm9ycykKICAgICAgICAuLndyaXRlbG4oKTsKICAgIH0KICB9CgogIHN0YXRpYyBpbnQgY29tcGFyZU1heEluaGVyaXRhbmNlUGF0aCgKICAgICAgQ2xhc3NIaWVyYXJjaHlOb2RlIGEsIENsYXNzSGllcmFyY2h5Tm9kZSBiKSB7CiAgICByZXR1cm4gYi5tYXhJbmhlcml0YW5jZVBhdGguY29tcGFyZVRvKGEubWF4SW5oZXJpdGFuY2VQYXRoKTsKICB9Cn0KCmNsYXNzIE1lcmdlUmVzdWx0IHsKICBmaW5hbCBMaXN0PERlY2xhcmF0aW9uPiBtZXJnZWRNZW1iZXJzOwoKICBmaW5hbCBMaXN0PERlY2xhcmF0aW9uPiBtZXJnZWRTZXR0ZXJzOwoKICBNZXJnZVJlc3VsdCh0aGlzLm1lcmdlZE1lbWJlcnMsIHRoaXMubWVyZ2VkU2V0dGVycyk7Cn0KCmVudW0gTWVyZ2VLaW5kIHsKICAvLy8gTWVyZ2luZyBzdXBlcmNsYXNzIG1lbWJlcnMgd2l0aCB0aGUgY3VycmVudCBjbGFzcy4KICBzdXBlcmNsYXNzLAoKICAvLy8gTWVyZ2luZyB0d28gaW50ZXJmYWNlcy4KICBpbnRlcmZhY2VzLAoKICAvLy8gTWVyZ2luZyBjbGFzcyBtZW1iZXJzIHdpdGggaW50ZXJmYWNlIG1lbWJlcnMuCiAgc3VwZXJ0eXBlcywKCiAgLy8vIE1lcmdpbmcgbWVtYmVycyB3aXRoIGluaGVyaXRlZCBzZXR0ZXJzLCBvciBzZXR0ZXJzIHdpdGggaW5oZXJpdGVkCiAgLy8vIG1lbWJlcnMuCiAgYWNjZXNzb3JzLAp9CgpMaXN0PExvY2F0ZWRNZXNzYWdlPiBpbmhlcml0ZWRDb25mbGljdENvbnRleHQoRGVjbGFyYXRpb24gYSwgRGVjbGFyYXRpb24gYikgewogIHJldHVybiBpbmhlcml0ZWRDb25mbGljdENvbnRleHRLZXJuZWwoCiAgICAgIGEudGFyZ2V0LCBiLnRhcmdldCwgYS5mdWxsTmFtZUZvckVycm9ycy5sZW5ndGgpOwp9CgpMaXN0PExvY2F0ZWRNZXNzYWdlPiBpbmhlcml0ZWRDb25mbGljdENvbnRleHRLZXJuZWwoCiAgICBNZW1iZXIgYSwgTWVtYmVyIGIsIGludCBsZW5ndGgpIHsKICAvLyBUT0RPKGFoZSk6IERlbGV0ZSB0aGlzIG1ldGhvZCB3aGVuIGl0IGlzbid0IHVzZWQgYnkgW0ludGVyZmFjZVJlc29sdmVyXS4KICBpbnQgY29tcGFyZSA9ICIke2EuZmlsZVVyaX0iLmNvbXBhcmVUbygiJHtiLmZpbGVVcml9Iik7CiAgaWYgKGNvbXBhcmUgPT0gMCkgewogICAgY29tcGFyZSA9IGEuZmlsZU9mZnNldC5jb21wYXJlVG8oYi5maWxlT2Zmc2V0KTsKICB9CiAgTWVtYmVyIGZpcnN0OwogIE1lbWJlciBzZWNvbmQ7CiAgaWYgKGNvbXBhcmUgPCAwKSB7CiAgICBmaXJzdCA9IGE7CiAgICBzZWNvbmQgPSBiOwogIH0gZWxzZSB7CiAgICBmaXJzdCA9IGI7CiAgICBzZWNvbmQgPSBhOwogIH0KICByZXR1cm4gPExvY2F0ZWRNZXNzYWdlPlsKICAgIG1lc3NhZ2VJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3RDYXVzZTEud2l0aExvY2F0aW9uKAogICAgICAgIGZpcnN0LmZpbGVVcmksIGZpcnN0LmZpbGVPZmZzZXQsIGxlbmd0aCksCiAgICBtZXNzYWdlSW5oZXJpdGVkTWVtYmVyc0NvbmZsaWN0Q2F1c2UyLndpdGhMb2NhdGlvbigKICAgICAgICBzZWNvbmQuZmlsZVVyaSwgc2Vjb25kLmZpbGVPZmZzZXQsIGxlbmd0aCksCiAgXTsKfQoKY2xhc3MgQnVpbGRlck1peGluSW5mZXJyZXIgZXh0ZW5kcyBNaXhpbkluZmVycmVyIHsKICBmaW5hbCBLZXJuZWxDbGFzc0J1aWxkZXIgY2xzOwoKICBCdWlsZGVyTWl4aW5JbmZlcnJlcigKICAgICAgdGhpcy5jbHMsIENvcmVUeXBlcyBjb3JlVHlwZXMsIFR5cGVCdWlsZGVyQ29uc3RyYWludEdhdGhlcmVyIGdhdGhlcmVyKQogICAgICA6IHN1cGVyKGNvcmVUeXBlcywgZ2F0aGVyZXIpOwoKICBTdXBlcnR5cGUgYXNJbnN0YW50aWF0aW9uT2YoU3VwZXJ0eXBlIHR5cGUsIENsYXNzIHN1cGVyY2xhc3MpIHsKICAgIEludGVyZmFjZVR5cGUgaW50ZXJmYWNlVHlwZSA9CiAgICAgICAgZ2F0aGVyZXIuZ2V0VHlwZUFzSW5zdGFuY2VPZih0eXBlLmFzSW50ZXJmYWNlVHlwZSwgc3VwZXJjbGFzcyk7CiAgICBpZiAoaW50ZXJmYWNlVHlwZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBuZXcgU3VwZXJ0eXBlKGludGVyZmFjZVR5cGUuY2xhc3NOb2RlLCBpbnRlcmZhY2VUeXBlLnR5cGVBcmd1bWVudHMpOwogIH0KCiAgdm9pZCByZXBvcnRQcm9ibGVtKE1lc3NhZ2UgbWVzc2FnZSwgQ2xhc3Mga2VybmVsQ2xhc3MpIHsKICAgIGludCBsZW5ndGggPSBjbHMuaXNNaXhpbkFwcGxpY2F0aW9uID8gMSA6IGNscy5mdWxsTmFtZUZvckVycm9ycy5sZW5ndGg7CiAgICBjbHMuYWRkUHJvYmxlbShtZXNzYWdlLCBjbHMuY2hhck9mZnNldCwgbGVuZ3RoKTsKICB9Cn0KCmNsYXNzIFR5cGVCdWlsZGVyQ29uc3RyYWludEdhdGhlcmVyIGV4dGVuZHMgVHlwZUNvbnN0cmFpbnRHYXRoZXJlcgogICAgd2l0aCBTdGFuZGFyZEJvdW5kcyB7CiAgZmluYWwgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGhpZXJhcmNoeTsKCiAgVHlwZUJ1aWxkZXJDb25zdHJhaW50R2F0aGVyZXIoCiAgICAgIHRoaXMuaGllcmFyY2h5LCBJdGVyYWJsZTxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycykKICAgICAgOiBzdXBlci5zdWJjbGFzc2luZyh0eXBlUGFyYW1ldGVycyk7CgogIEBvdmVycmlkZQogIENsYXNzIGdldCBvYmplY3RDbGFzcyA9PiBoaWVyYXJjaHkub2JqZWN0S2VybmVsQ2xhc3M7CgogIEBvdmVycmlkZQogIENsYXNzIGdldCBmdW5jdGlvbkNsYXNzID0+IGhpZXJhcmNoeS5mdW5jdGlvbktlcm5lbENsYXNzOwoKICBAb3ZlcnJpZGUKICBDbGFzcyBnZXQgZnV0dXJlT3JDbGFzcyA9PiBoaWVyYXJjaHkuZnV0dXJlT3JLZXJuZWxDbGFzczsKCiAgQG92ZXJyaWRlCiAgQ2xhc3MgZ2V0IG51bGxDbGFzcyA9PiBoaWVyYXJjaHkubnVsbEtlcm5lbENsYXNzOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldCBudWxsVHlwZSA9PiBudWxsQ2xhc3MucmF3VHlwZTsKCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXQgb2JqZWN0VHlwZSA9PiBvYmplY3RDbGFzcy5yYXdUeXBlOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldCByYXdGdW5jdGlvblR5cGUgPT4gZnVuY3Rpb25DbGFzcy5yYXdUeXBlOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZExvd2VyQm91bmQoVHlwZUNvbnN0cmFpbnQgY29uc3RyYWludCwgRGFydFR5cGUgbG93ZXIpIHsKICAgIGNvbnN0cmFpbnQubG93ZXIgPSBnZXRTdGFuZGFyZFVwcGVyQm91bmQoY29uc3RyYWludC5sb3dlciwgbG93ZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRVcHBlckJvdW5kKFR5cGVDb25zdHJhaW50IGNvbnN0cmFpbnQsIERhcnRUeXBlIHVwcGVyKSB7CiAgICBjb25zdHJhaW50LnVwcGVyID0gZ2V0U3RhbmRhcmRMb3dlckJvdW5kKGNvbnN0cmFpbnQudXBwZXIsIHVwcGVyKTsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlciBnZXRJbnRlcmZhY2VNZW1iZXIoQ2xhc3MgY2xhc3NfLCBOYW1lIG5hbWUsIHtib29sIHNldHRlcjogZmFsc2V9KSB7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0VHlwZUFzSW5zdGFuY2VPZihJbnRlcmZhY2VUeXBlIHR5cGUsIENsYXNzIHN1cGVyY2xhc3MpIHsKICAgIHJldHVybiBoaWVyYXJjaHkuZ2V0S2VybmVsVHlwZUFzSW5zdGFuY2VPZih0eXBlLCBzdXBlcmNsYXNzKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZnV0dXJlVHlwZShEYXJ0VHlwZSB0eXBlKSB7CiAgICByZXR1cm4gbmV3IEludGVy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IGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UubWQgZmlsZS4KCmltcG9ydCAnZGFydDptYXRoJyBhcyBtYXRoOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBCb3R0b21UeXBlLAogICAgICAgIENsYXNzLAogICAgICAgIERhcnRUeXBlLAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEZ1bmN0aW9uVHlwZSwKICAgICAgICBJbnRlcmZhY2VUeXBlLAogICAgICAgIEludmFsaWRUeXBlLAogICAgICAgIE5hbWVkVHlwZSwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBWb2lkVHlwZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQnIHNob3cgU3Vic3RpdHV0aW9uOwoKaW1wb3J0ICd0eXBlX3NjaGVtYS5kYXJ0JyBzaG93IFVua25vd25UeXBlOwoKYWJzdHJhY3QgY2xhc3MgU3RhbmRhcmRCb3VuZHMgewogIENsYXNzIGdldCBmdW5jdGlvbkNsYXNzOwogIEludGVyZmFjZVR5cGUgZ2V0IG51bGxUeXBlOwogIEludGVyZmFjZVR5cGUgZ2V0IG9iamVjdFR5cGU7CiAgSW50ZXJmYWNlVHlwZSBnZXQgcmF3RnVuY3Rpb25UeXBlOwoKICBib29sIGlzU3VidHlwZU9mKERhcnRUeXBlIHN1YnR5cGUsIERhcnRUeXBlIHN1cGVydHlwZSk7CgogIEludGVyZmFjZVR5cGUgZ2V0TGVnYWN5TGVhc3RVcHBlckJvdW5kKAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUxLCBJbnRlcmZhY2VUeXBlIHR5cGUyKTsKCiAgLy8vIENvbXB1dGVzIHRoZSBzdGFuZGFyZCBsb3dlciBib3VuZCBvZiBbdHlwZTFdIGFuZCBbdHlwZTJdLgogIC8vLwogIC8vLyBTdGFuZGFyZCBsb3dlciBib3VuZCBpcyBhIGxvd2VyIGJvdW5kIGZ1bmN0aW9uIHRoYXQgaW1wb3NlcyBhbgogIC8vLyBvcmRlcmluZyBvbiB0aGUgdG9wIHR5cGVzIGB2b2lkYCwgYGR5bmFtaWNgLCBhbmQgYG9iamVjdGAuICBUaGlzIGZ1bmN0aW9uCiAgLy8vIGFkZGl0aW9uYWxseSBoYW5kbGVzIHRoZSB1bmtub3duIHR5cGUgdGhhdCBhcHBlYXJzIGR1cmluZyB0eXBlIGluZmVyZW5jZS4KICBEYXJ0VHlwZSBnZXRTdGFuZGFyZExvd2VyQm91bmQoRGFydFR5cGUgdHlwZTEsIERhcnRUeXBlIHR5cGUyKSB7CiAgICAvLyBGb3IgYWxsIHR5cGVzIFQsIFNMQihULFQpID0gVC4gIE5vdGUgdGhhdCB3ZSBkb24ndCB0ZXN0IGZvciBlcXVhbGl0eQogICAgLy8gYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIG1ha2UgdGhlIGFsZ29yaXRobSBxdWFkcmF0aWMuICBUaGlzIGlzIG9rCiAgICAvLyBiZWNhdXNlIHRoZSBjaGVjayBpcyBub3QgbmVlZGVkIGZvciBjb3JyZWN0bmVzczsgaXQncyBqdXN0IGEgc3BlZWQKICAgIC8vIG9wdGltaXphdGlvbi4KICAgIGlmIChpZGVudGljYWwodHlwZTEsIHR5cGUyKSkgewogICAgICByZXR1cm4gdHlwZTE7CiAgICB9CgogICAgLy8gRm9yIGFueSB0eXBlIFQsIFNMQig/LCBUKSA9IFNMQihULCA/KSA9IFQuCiAgICBpZiAodHlwZTEgaXMgVW5rbm93blR5cGUpIHsKICAgICAgcmV0dXJuIHR5cGUyOwogICAgfQogICAgaWYgKHR5cGUyIGlzIFVua25vd25UeXBlKSB7CiAgICAgIHJldHVybiB0eXBlMTsKICAgIH0KCiAgICAvLyBTTEIodm9pZCwgVCkgPSBTTEIoVCwgdm9pZCkgPSBULgogICAgaWYgKHR5cGUxIGlzIFZvaWRUeXBlKSB7CiAgICAgIHJldHVybiB0eXBlMjsKICAgIH0KICAgIGlmICh0eXBlMiBpcyBWb2lkVHlwZSkgewogICAgICByZXR1cm4gdHlwZTE7CiAgICB9CgogICAgLy8gU0xCKGR5bmFtaWMsIFQpID0gU0xCKFQsIGR5bmFtaWMpID0gVCBpZiBUIGlzIG5vdCB2b2lkLgogICAgaWYgKHR5cGUxIGlzIER5bmFtaWNUeXBlKSB7CiAgICAgIHJldHVybiB0eXBlMjsKICAgIH0KICAgIGlmICh0eXBlMiBpcyBEeW5hbWljVHlwZSkgewogICAgICByZXR1cm4gdHlwZTE7CiAgICB9CgogICAgLy8gU0xCKE9iamVjdCwgVCkgPSBTTEIoVCwgT2JqZWN0KSA9IFQgaWYgVCBpcyBub3Qgdm9pZCBvciBkeW5hbWljLgogICAgaWYgKHR5cGUxID09IG9iamVjdFR5cGUpIHsKICAgICAgcmV0dXJuIHR5cGUyOwogICAgfQogICAgaWYgKHR5cGUyID09IG9iamVjdFR5cGUpIHsKICAgICAgcmV0dXJuIHR5cGUxOwogICAgfQoKICAgIC8vIFNMQihib3R0b20sIFQpID0gU0xCKFQsIGJvdHRvbSkgPSBib3R0b20uCiAgICBpZiAodHlwZTEgaXMgQm90dG9tVHlwZSkgcmV0dXJuIHR5cGUxOwogICAgaWYgKHR5cGUyIGlzIEJvdHRvbVR5cGUpIHJldHVybiB0eXBlMjsKICAgIGlmICh0eXBlMSA9PSBudWxsVHlwZSkgcmV0dXJuIHR5cGUxOwogICAgaWYgKHR5cGUyID09IG51bGxUeXBlKSByZXR1cm4gdHlwZTI7CgogICAgLy8gRnVuY3Rpb24gdHlwZXMgaGF2ZSBzdHJ1Y3R1cmFsIGxvd2VyIGJvdW5kcy4KICAgIGlmICh0eXBlMSBpcyBGdW5jdGlvblR5cGUgJiYgdHlwZTIgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgIHJldHVybiBfZnVuY3Rpb25TdGFuZGFyZExvd2VyQm91bmQodHlwZTEsIHR5cGUyKTsKICAgIH0KCiAgICAvLyBPdGhlcndpc2UsIHRoZSBsb3dlciBib3VuZHMgIG9mIHR3byB0eXBlcyBpcyBvbmUgb2YgdGhlbSBpdCBpZiBpdCBpcyBhCiAgICAvLyBzdWJ0eXBlIG9mIHRoZSBvdGhlci4KICAgIGlmIChpc1N1YnR5cGVPZih0eXBlMSwgdHlwZTIpKSB7CiAgICAgIHJldHVybiB0eXBlMTsKICAgIH0KCiAgICBpZiAoaXNTdWJ0eXBlT2YodHlwZTIsIHR5cGUxKSkgewogICAgICByZXR1cm4gdHlwZTI7CiAgICB9CgogICAgLy8gTm8gc3VidHlwZSByZWxhdGlvbiwgc28gdGhlIGxvd2VyIGJvdW5kIGlzIGJvdHRvbS4KICAgIHJldHVybiBjb25zdCBCb3R0b21UeXBlKCk7CiAgfQoKICAvLy8gQ29tcHV0ZXMgdGhlIHN0YW5kYXJkIHVwcGVyIGJvdW5kIG9mIHR3byB0eXBlcy4KICAvLy8KICAvLy8gU3RhbmRhcmQgdXBwZXIgYm91bmQgaXMgYW4gdXBwZXIgYm91bmQgZnVuY3Rpb24gdGhhdCBpbXBvc2VzIGFuIG9yZGVyaW5nCiAgLy8vIG9uIHRoZSB0b3AgdHlwZXMgJ3ZvaWQnLCAnZHluYW1pYycsIGFuZCBgb2JqZWN0YC4gIFRoaXMgZnVuY3Rpb24KICAvLy8gYWRkaXRpb25hbGx5IGhhbmRsZXMgdGhlIHVua25vd24gdHlwZSB0aGF0IGFwcGVhcnMgZHVyaW5nIHR5cGUgaW5mZXJlbmNlLgogIERhcnRUeXBlIGdldFN0YW5kYXJkVXBwZXJCb3VuZChEYXJ0VHlwZSB0eXBlMSwgRGFydFR5cGUgdHlwZTIpIHsKICAgIC8vIEZvciBhbGwgdHlwZXMgVCwgU1VCKFQsVCkgPSBULiAgTm90ZSB0aGF0IHdlIGRvbid0IHRlc3QgZm9yIGVxdWFsaXR5CiAgICAvLyBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gbWFrZSB0aGUgYWxnb3JpdGhtIHF1YWRyYXRpYy4gIFRoaXMgaXMgb2sKICAgIC8vIGJlY2F1c2UgdGhlIGNoZWNrIGlzIG5vdCBuZWVkZWQgZm9yIGNvcnJlY3RuZXNzOyBpdCdzIGp1c3QgYSBzcGVlZAogICAgLy8gb3B0aW1pemF0aW9uLgogICAgaWYgKGlkZW50aWNhbCh0eXBlMSwgdHlwZTIpKSB7CiAgICAgIHJldHVybiB0eXBlMTsKICAgIH0KCiAgICAvLyBGb3IgYW55IHR5cGUgVCwgU1VCKD8sIFQpID0gU1VCKFQsID8pID0gVC4KICAgIGlmICh0eXBlMSBpcyBVbmtub3duVHlwZSkgewogICAgICByZXR1cm4gdHlwZTI7CiAgICB9CiAgICBpZiAodHlwZTIgaXMgVW5rbm93blR5cGUpIHsKICAgICAgcmV0dXJuIHR5cGUxOwogICAgfQoKICAgIC8vIFNVQih2b2lkLCBUKSA9IFNVQihULCB2b2lkKSA9IHZvaWQuCiAgICBpZiAodHlwZTEgaXMgVm9pZFR5cGUpIHsKICAgICAgcmV0dXJuIHR5cGUxOwogICAgfQogICAgaWYgKHR5cGUyIGlzIFZvaWRUeXBlKSB7CiAgICAgIHJldHVybiB0eXBlMjsKICAgIH0KCiAgICAvLyBTVUIoZHluYW1pYywgVCkgPSBTVUIoVCwgZHluYW1pYykgPSBkeW5hbWljIGlmIFQgaXMgbm90IHZvaWQuCiAgICBpZiAodHlwZTEgaXMgRHluYW1pY1R5cGUpIHsKICAgICAgcmV0dXJuIHR5cGUxOwogICAgfQogICAgaWYgKHR5cGUyIGlzIER5bmFtaWNUeXBlKSB7CiAgICAgIHJldHVybiB0eXBlMjsKICAgIH0KCiAgICAvLyBTVUIoT2JlY3QsIFQpID0gU1VCKFQsIE9iamVjdCkgPSBPYmplY3QgaWYgVCBpcyBub3Qgdm9pZCBvciBkeW5hbWljLgogICAgaWYgKHR5cGUxID09IG9iamVjdFR5cGUpIHsKICAgICAgcmV0dXJuIHR5cGUxOwogICAgfQogICAgaWYgKHR5cGUyID09IG9iamVjdFR5cGUpIHsKICAgICAgcmV0dXJuIHR5cGUyOwogICAgfQoKICAgIC8vIFNVQihib3R0b20sIFQpID0gU1VCKFQsIGJvdHRvbSkgPSBULgogICAgaWYgKHR5cGUxIGlzIEJvdHRvbVR5cGUpIHJldHVybiB0eXBlMjsKICAgIGlmICh0eXBlMiBpcyBCb3R0b21UeXBlKSByZXR1cm4gdHlwZTE7CiAgICBpZiAodHlwZTEgPT0gbnVsbFR5cGUpIHJldHVybiB0eXBlMjsKICAgIGlmICh0eXBlMiA9PSBudWxsVHlwZSkgcmV0dXJuIHR5cGUxOwoKICAgIGlmICh0eXBlMSBpcyBUeXBlUGFyYW1ldGVyVHlwZSB8fCB0eXBlMiBpcyBUeXBlUGFyYW1ldGVyVHlwZSkgewogICAgICByZXR1cm4gX3R5cGVQYXJhbWV0ZXJTdGFuZGFyZFVwcGVyQm91bmQodHlwZTEsIHR5cGUyKTsKICAgIH0KCiAgICAvLyBUaGUgc3RhbmRhcmQgdXBwZXIgYm91bmQgb2YgYSBmdW5jdGlvbiB0eXBlIGFuZCBhbiBpbnRlcmZhY2UgdHlwZSBUIGlzCiAgICAvLyB0aGUgc3RhbmRhcmQgdXBwZXIgYm91bmQgb2YgRnVuY3Rpb24gYW5kIFQuCiAgICBpZiAodHlwZTEgaXMgRnVuY3Rpb25UeXBlICYmIHR5cGUyIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgdHlwZTEgPSByYXdGdW5jdGlvblR5cGU7CiAgICB9CiAgICBpZiAodHlwZTIgaXMgRnVuY3Rpb25UeXBlICYmIHR5cGUxIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgdHlwZTIgPSByYXdGdW5jdGlvblR5cGU7CiAgICB9CgogICAgLy8gQXQgdGhpcyBwb2ludCB0eXBlMSBhbmQgdHlwZTIgc2hvdWxkIGJvdGggZWl0aGVyIGJlIGludGVyZmFjZSB0eXBlcyBvcgogICAgLy8gZnVuY3Rpb24gdHlwZXMuCiAgICBpZiAodHlwZTEgaXMgSW50ZXJmYWNlVHlwZSAmJiB0eXBlMiBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIHJldHVybiBfaW50ZXJmYWNlU3RhbmRhcmRVcHBlckJvdW5kKHR5cGUxLCB0eXBlMik7CiAgICB9CgogICAgaWYgKHR5cGUxIGlzIEZ1bmN0aW9uVHlwZSAmJiB0eXBlMiBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgcmV0dXJuIF9mdW5jdGlvblN0YW5kYXJkVXBwZXJCb3VuZCh0eXBlMSwgdHlwZTIpOwogICAgfQoKICAgIGlmICh0eXBlMSBpcyBJbnZhbGlkVHlwZSB8fCB0eXBlMiBpcyBJbnZhbGlkVHlwZSkgewogICAgICByZXR1cm4gY29uc3QgSW52YWxpZFR5cGUoKTsKICAgIH0KCiAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuLiBBcyBhIGRlZmVuc2l2ZSBtZWFzdXJlLCByZXR1cm4gdGhlIGR5bmFtaWMgdHlwZS4KICAgIGFzc2VydChmYWxzZSwgInR5cGUxID0gJHR5cGUxOyB0eXBlMiA9ICR0eXBlMiIpOwogICAgcmV0dXJuIGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgfQoKICAvLy8gQ29tcHV0ZSB0aGUgc3RhbmRhcmQgbG93ZXIgYm91bmQgb2YgZnVuY3Rpb24gdHlwZXMgW2ZdIGFuZCBbZ10uCiAgLy8vCiAgLy8vIFRoZSBzcGVjIHJ1bGVzIGZvciBTTEIgb24gZnVuY3Rpb24gdHlwZXMsIGluZm9ybWFsbHksIGFyZSBwcmV0dHkgc2ltcGxlOgogIC8vLwogIC8vLyAtIElmIGEgcGFyYW1ldGVyIGlzIHJlcXVpcmVkIGluIGJvdGgsIGl0IHN0YXlzIHJlcXVpcmVkLgogIC8vLwogIC8vLyAtIElmIGEgcG9zaXRpb25hbCBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwgb3IgbWlzc2luZyBpbiBvbmUsIGl0IGJlY29tZXMKICAvLy8gICBvcHRpb25hbC4gIChUaGlzIGlzIGJlY2F1c2Ugd2UncmUgdHJ5aW5nIHRvIGJ1aWxkIGEgZnVuY3Rpb24gdHlwZSB3aGljaAogIC8vLyAgIGlzIGEgc3VidHlwZSBvZiBib3RoIFtmXSBhbmQgW2ddLCBtZWFuaW5nIGl0IGFjY2VwdHMgYWxsIHBvc3NpYmxlIGlucHV0cwogIC8vLyAgIHRoYXQgW2ZdIGFuZCBbZ10gYWNjZXB0LikKICAvLy8KICAvLy8gLSBOYW1lZCBwYXJhbWV0ZXJzIGFyZSB1bmlvbmVkIHRvZ2V0aGVyLgogIC8vLwogIC8vLyAtIEZvciBhbnkgcGFyYW1ldGVyIHRoYXQgZXhpc3RzIGluIGJvdGggZnVuY3Rpb25zLCB1c2UgdGhlIFNVQiBvZiB0aGVtIGFzCiAgLy8vICAgdGhlIHJlc3VsdGluZyBwYXJhbWV0ZXIgdHlwZS4KICAvLy8KICAvLy8gLSBVc2UgdGhlIFNMQiBvZiB0aGVpciByZXR1cm4gdHlwZXMuCiAgRGFydFR5cGUgX2Z1bmN0aW9uU3RhbmRhcmRMb3dlckJvdW5kKEZ1bmN0aW9uVHlwZSBmLCBGdW5jdGlvblR5cGUgZykgewogICAgLy8gVE9ETyhybnlzdHJvbSxwYXVsYmVycnkpOiBSaWdodCBub3csIHRoaXMgYXNzdW1lcyBmIGFuZCBnIGRvIG5vdCBoYXZlIGFueQogICAgLy8gdHlwZSBwYXJhbWV0ZXJzLiBSZXZpc2l0IHRoYXQgaW4gdGhlIHByZXNlbmNlIG9mIGdlbmVyaWMgbWV0aG9kcy4KCiAgICAvLyBDYWxjdWxhdGUgdGhlIFNVQiBvZiBlYWNoIGNvcnJlc3BvbmRpbmcgcGFpciBvZiBwYXJhbWV0ZXJzLgogICAgaW50IHRvdGFsUG9zaXRpb25hbCA9CiAgICAgICAgbWF0aC5tYXgoZi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgsIGcucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKTsKICAgIHZhciBwb3NpdGlvbmFsUGFyYW1ldGVycyA9IG5ldyBMaXN0PERhcnRUeXBlPih0b3RhbFBvc2l0aW9uYWwpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbFBvc2l0aW9uYWw7IGkrKykgewogICAgICBpZiAoaSA8IGYucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgICAgdmFyIGZUeXBlID0gZi5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICAgICAgICBpZiAoaSA8IGcucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgICAgICB2YXIgZ1R5cGUgPSBnLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldOwogICAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnNbaV0gPSBnZXRTdGFuZGFyZFVwcGVyQm91bmQoZlR5cGUsIGdUeXBlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnNbaV0gPSBmVHlwZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnNbaV0gPSBnLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldOwogICAgICB9CiAgICB9CgogICAgLy8gUGFyYW1ldGVycyB0aGF0IGFyZSByZXF1aXJlZCBpbiBib3RoIGZ1bmN0aW9ucyBhcmUgcmVxdWlyZWQgaW4gdGhlCiAgICAvLyByZXN1bHQuICBQYXJhbWV0ZXJzIHRoYXQgYXJlIG9wdGlvbmFsIG9yIG1pc3NpbmcgaW4gZWl0aGVyIGVuZCB1cAogICAgLy8gb3B0aW9uYWwuCiAgICBpbnQgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA9CiAgICAgICAgbWF0aC5taW4oZi5yZXF1aXJlZFBhcmFtZXRlckNvdW50LCBnLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpOwogICAgYm9vbCBoYXNQb3NpdGlvbmFsID0gcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA8IHRvdGFsUG9zaXRpb25hbDsKCiAgICAvLyBVbmlvbiB0aGUgbmFtZWQgcGFyYW1ldGVycyB0b2dldGhlci4KICAgIExpc3Q8TmFtZWRUeXBlPiBuYW1lZFBhcmFtZXRlcnMgPSBbXTsKICAgIHsKICAgICAgaW50IGkgPSAwOwogICAgICBpbnQgaiA9IDA7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgaWYgKGkgPCBmLm5hbWVkUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgICAgIGlmIChqIDwgZy5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgICAgICAgIHZhciBmTmFtZSA9IGYubmFtZWRQYXJhbWV0ZXJzW2ldLm5hbWU7CiAgICAgICAgICAgIHZhciBnTmFtZSA9IGcubmFtZWRQYXJhbWV0ZXJzW2pdLm5hbWU7CiAgICAgICAgICAgIGludCBvcmRlciA9IGZOYW1lLmNvbXBhcmVUbyhnTmFtZSk7CiAgICAgICAgICAgIGlmIChvcmRlciA8IDApIHsKICAgICAgICAgICAgICBuYW1lZFBhcmFtZXRlcnMuYWRkKGYubmFtZWRQYXJhbWV0ZXJzW2krK10pOwogICAgICAgICAgICB9IGVsc2UgaWYgKG9yZGVyID4gMCkgewogICAgICAgICAgICAgIG5hbWVkUGFyYW1ldGVycy5hZGQoZy5uYW1lZFBhcmFtZXRlcnNbaisrXSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbmFtZWRQYXJhbWV0ZXJzLmFkZChuZXcgTmFtZWRUeXBlKAogICAgICAgICAgICAgICAgICBmTmFtZSwKICAgICAgICAgICAgICAgICAgZ2V0U3RhbmRhcmRVcHBlckJvdW5kKGYubmFtZWRQYXJhbWV0ZXJzW2krK10udHlwZSwKICAgICAgICAgICAgICAgICAgICAgIGcubmFtZWRQYXJhbWV0ZXJzW2orK10udHlwZSkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmFtZWRQYXJhbWV0ZXJzLmFkZEFsbChmLm5hbWVkUGFyYW1ldGVycy5za2lwKGkpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5hbWVkUGFyYW1ldGVycy5hZGRBbGwoZy5uYW1lZFBhcmFtZXRlcnMuc2tpcChqKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGJvb2wgaGFzTmFtZWQgPSBuYW1lZFBhcmFtZXRlcnMuaXNOb3RFbXB0eTsKCiAgICAvLyBFZGdlIGNhc2UuIERhcnQgZG9lcyBub3Qgc3VwcG9ydCBmdW5jdGlvbnMgd2l0aCBib3RoIG9wdGlvbmFsIHBvc2l0aW9uYWwKICAgIC8vIGFuZCBuYW1lZCBwYXJhbWV0ZXJzLiBJZiB3ZSB3b3VsZCBzeW50aGVzaXplIHRoYXQsIGdpdmUgdXAuCiAgICBpZiAoaGFzUG9zaXRpb25hbCAmJiBoYXNOYW1lZCkgcmV0dXJuIGNvbnN0IEJvdHRvbVR5cGUoKTsKCiAgICAvLyBDYWxjdWxhdGUgdGhlIFNMQiBvZiB0aGUgcmV0dXJuIHR5cGUuCiAgICBEYXJ0VHlwZSByZXR1cm5UeXBlID0gZ2V0U3RhbmRhcmRMb3dlckJvdW5kKGYucmV0dXJuVHlwZSwgZy5yZXR1cm5UeXBlKTsKICAgIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlKHBvc2l0aW9uYWxQYXJhbWV0ZXJzLCByZXR1cm5UeXBlLAogICAgICAgIG5hbWVkUGFyYW1ldGVyczogbmFtZWRQYXJhbWV0ZXJzLAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQpOwogIH0KCiAgLy8vIENvbXB1dGUgdGhlIHN0YW5kYXJkIHVwcGVyIGJvdW5kIG9mIGZ1bmN0aW9uIHR5cGVzIFtmXSBhbmQgW2ddLgogIC8vLwogIC8vLyBUaGUgcnVsZXMgZm9yIFNVQiBvbiBmdW5jdGlvbiB0eXBlcywgaW5mb3JtYWxseSwgYXJlIHByZXR0eSBzaW1wbGU6CiAgLy8vCiAgLy8vIC0gSWYgdGhlIGZ1bmN0aW9ucyBkb24ndCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiByZXF1aXJlZCBwYXJhbWV0ZXJzLAogIC8vLyAgIGFsd2F5cyByZXR1cm4gYEZ1bmN0aW9uYC4KICAvLy8KICAvLy8gLSBEaXNjYXJkIGFueSBvcHRpb25hbCBuYW1lZCBvciBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgdGhlIHR3byB0eXBlcyBkbyBub3QKICAvLy8gICBoYXZlIGluIGNvbW1vbi4KICAvLy8KICAvLy8gLSBDb21wdXRlIHRoZSBTTEIgb2YgZWFjaCBjb3JyZXNwb25kaW5nIHBhaXIgb2YgcGFyYW1ldGVyIHR5cGVzLCBhbmQgdGhlCiAgLy8vICAgU1VCIG9mIHRoZSByZXR1cm4gdHlwZXMuICBSZXR1cm4gYSBmdW5jdGlvbiB0eXBlIHdpdGggdGhvc2UgdHlwZXMuCiAgRGFydFR5cGUgX2Z1bmN0aW9uU3RhbmRhcmRVcHBlckJvdW5kKEZ1bmN0aW9uVHlwZSBmLCBGdW5jdGlvblR5cGUgZykgewogICAgLy8gVE9ETyhybnlzdHJvbSk6IFJpZ2h0IG5vdywgdGhpcyBhc3N1bWVzIGYgYW5kIGcgZG8gbm90IGhhdmUgYW55IHR5cGUKICAgIC8vIHBhcmFtZXRlcnMuIFJldmlzaXQgdGhhdCBpbiB0aGUgcHJlc2VuY2Ugb2YgZ2VuZXJpYyBtZXRob2RzLgoKICAgIC8vIElmIEYgYW5kIEcgZGlmZmVyIGluIHRoZWlyIG51bWJlciBvZiByZXF1aXJlZCBwYXJhbWV0ZXJzLCB0aGVuIHRoZQogICAgLy8gc3RhbmRhcmQgdXBwZXIgYm91bmQgb2YgRiBhbmQgRyBpcyBGdW5jdGlvbi4KICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogV2UgY291bGQgZG8gYmV0dGVyIGhlcmUsIGUuZy46CiAgICAvLyAgIFNVQigoW2ludF0pIC0+IHZvaWQsIChpbnQpIC0+IHZvaWQpID0gKGludCkgLT4gdm9pZAogICAgaWYgKGYucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCAhPSBnLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uQ2xhc3MucmF3VHlwZTsKICAgIH0KICAgIGludCByZXF1aXJlZFBhcmFtZXRlckNvdW50ID0gZi5yZXF1aXJlZFBhcmFtZXRlckNvdW50OwoKICAgIC8vIENhbGN1bGF0ZSB0aGUgU0xCIG9mIGVhY2ggY29ycmVzcG9uZGluZyBwYWlyIG9mIHBhcmFtZXRlcnMuCiAgICAvLyBJZ25vcmUgYW55IGV4dHJhIG9wdGlvbmFsIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBpZiBvbmUgaGFzIG1vcmUgdGhhbiB0aGUKICAgIC8vIG90aGVyLgogICAgaW50IHRvdGFsUG9zaXRpb25hbCA9CiAgICAgICAgbWF0aC5taW4oZi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgsIGcucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKTsKICAgIHZhciBwb3NpdGlvbmFsUGFyYW1ldGVycyA9IG5ldyBMaXN0PERhcnRUeXBlPih0b3RhbFBvc2l0aW9uYWwpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbFBvc2l0aW9uYWw7IGkrKykgewogICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyc1tpXSA9IGdldFN0YW5kYXJkTG93ZXJCb3VuZCgKICAgICAgICAgIGYucG9zaXRpb25hbFBhcmFtZXRlcnNbaV0sIGcucG9zaXRpb25hbFBhcmFtZXRlcnNbaV0pOwogICAgfQoKICAgIC8vIEludGVyc2VjdCB0aGUgbmFtZWQgcGFyYW1ldGVycy4KICAgIExpc3Q8TmFtZWRUeXBlPiBuYW1lZFBhcmFtZXRlcnMgPSBbXTsKICAgIHsKICAgICAgaW50IGkgPSAwOwogICAgICBpbnQgaiA9IDA7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgaWYgKGkgPCBmLm5hbWVkUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgICAgIGlmIChqIDwgZy5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgICAgICAgIHZhciBmTmFtZSA9IGYubmFtZWRQYXJhbWV0ZXJzW2ldLm5hbWU7CiAgICAgICAgICAgIHZhciBnTmFtZSA9IGcubmFtZWRQYXJhbWV0ZXJzW2pdLm5hbWU7CiAgICAgICAgICAgIGludCBvcmRlciA9IGZOYW1lLmNvbXBhcmVUbyhnTmFtZSk7CiAgICAgICAgICAgIGlmIChvcmRlciA8IDApIHsKICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgIH0gZWxzZSBpZiAob3JkZXIgPiAwKSB7CiAgICAgICAgICAgICAgaisrOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIG5hbWVkUGFyYW1ldGVycy5hZGQobmV3IE5hbWVkVHlwZSgKICAgICAgICAgICAgICAgICAgZk5hbWUsCiAgICAgICAgICAgICAgICAgIGdldFN0YW5kYXJkTG93ZXJCb3VuZChmLm5hbWVkUGFyYW1ldGVyc1tpKytdLnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICBnLm5hbWVkUGFyYW1ldGVyc1tqKytdLnR5cGUpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBDYWxjdWxhdGUgdGhlIFNVQiBvZiB0aGUgcmV0dXJuIHR5cGUuCiAgICBEYXJ0VHlwZSByZXR1cm5UeXBlID0gZ2V0U3RhbmRhcmRVcHBlckJvdW5kKGYucmV0dXJuVHlwZSwgZy5yZXR1cm5UeXBlKTsKICAgIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlKHBvc2l0aW9uYWxQYXJhbWV0ZXJzLCByZXR1cm5UeXBlLAogICAgICAgIG5hbWVkUGFyYW1ldGVyczogbmFtZWRQYXJhbWV0ZXJzLAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQpOwogIH0KCiAgRGFydFR5cGUgX2ludGVyZmFjZVN0YW5kYXJkVXBwZXJCb3VuZCgKICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlMSwgSW50ZXJmYWNlVHlwZSB0eXBlMikgewogICAgLy8gVGhpcyBjdXJyZW50bHkgZG9lcyBub3QgaW1wbGVtZW50IGEgdmVyeSBjb21wbGV0ZSBzdGFuZGFyZCB1cHBlciBib3VuZAogICAgLy8gYWxnb3JpdGhtLCBidXQgaGFuZGxlcyBhIGNvdXBsZSBvZiB0aGUgdmVyeSBjb21tb24gY2FzZXMgdGhhdCBhcmUKICAgIC8vIGNhdXNpbmcgcGFpbiBpbiByZWFsIGNvZGUuICBUaGUgY3VycmVudCBhbGdvcml0aG0gaXM6CiAgICAvLyAxLiBJZiBlaXRoZXIgb2YgdGhlIHR5cGVzIGlzIGEgc3VwZXJ0eXBlIG9mIHRoZSBvdGhlciwgcmV0dXJuIGl0LgogICAgLy8gICAgVGhpcyBpcyBpbiBmYWN0IHRoZSBiZXN0IHJlc3VsdCBpbiB0aGlzIGNhc2UuCiAgICAvLyAyLiBJZiB0aGUgdHdvIHR5cGVzIGhhdmUgdGhlIHNhbWUgY2xhc3MgZWxlbWVudCwgdGhlbiB0YWtlIHRoZQogICAgLy8gICAgcG9pbnR3aXNlIHN0YW5kYXJkIHVwcGVyIGJvdW5kIG9mIHRoZSB0eXBlIGFyZ3VtZW50cy4gIFRoaXMgaXMgYWdhaW4KICAgIC8vICAgIHRoZSBiZXN0IHJlc3VsdCwgZXhjZXB0IHRoYXQgdGhlIHJlY3Vyc2l2ZSBjYWxscyBtYXkgbm90IHJldHVybgogICAgLy8gICAgdGhlIHRydWUgc3RhbmRhcmQgdXBwZXIgYm91bmRzLiAgVGhlIHJlc3VsdCBpcyBndWFyYW50ZWVkIHRvIGJlIGEKICAgIC8vICAgIHdlbGwtZm9ybWVkIHR5cGUgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgaW5wdXQgdHlwZXMgd2VyZQogICAgLy8gICAgd2VsbC1mb3JtZWQgKGFuZCBhc3N1bWluZyB0aGF0IHRoZSByZWN1cnNpdmUgY2FsbHMgcmV0dXJuCiAgICAvLyAgICB3ZWxsLWZvcm1lZCB0eXBlcykuCiAgICAvLyAzLiBPdGhlcndpc2UgcmV0dXJuIHRoZSBzcGVjLWRlZmluZWQgc3RhbmRhcmQgdXBwZXIgYm91bmQuICBUaGlzIHdpbGwKICAgIC8vICAgIGJlIGFuIHVwcGVyIGJvdW5kLCBtaWdodCAob3IgbWlnaHQgbm90KSBiZSBsZWFzdCwgYW5kIG1pZ2h0CiAgICAvLyAgICAob3IgbWlnaHQgbm90KSBiZSBhIHdlbGwtZm9ybWVkIHR5cGUuCiAgICBpZiAoaXNTdWJ0eXBlT2YodHlwZTEsIHR5cGUyKSkgewogICAgICByZXR1cm4gdHlwZTI7CiAgICB9CiAgICBpZiAoaXNTdWJ0eXBlT2YodHlwZTIsIHR5cGUxKSkgewogICAgICByZXR1cm4gdHlwZTE7CiAgICB9CiAgICBpZiAodHlwZTEgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgIHR5cGUyIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICBpZGVudGljYWwodHlwZTEuY2xhc3NOb2RlLCB0eXBlMi5jbGFzc05vZGUpKSB7CiAgICAgIExpc3Q8RGFydFR5cGU+IHRBcmdzMSA9IHR5cGUxLnR5cGVBcmd1bWVudHM7CiAgICAgIExpc3Q8RGFydFR5cGU+IHRBcmdzMiA9IHR5cGUyLnR5cGVBcmd1bWVudHM7CgogICAgICBhc3NlcnQodEFyZ3MxLmxlbmd0aCA9PSB0QXJnczIubGVuZ3RoKTsKICAgICAgTGlzdDxEYXJ0VHlwZT4gdEFyZ3MgPSBuZXcgTGlzdCh0QXJnczEubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0QXJnczEubGVuZ3RoOyBpKyspIHsKICAgICAgICB0QXJnc1tpXSA9IGdldFN0YW5kYXJkVXBwZXJCb3VuZCh0QXJnczFbaV0sIHRBcmdzMltpXSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlKHR5cGUxLmNsYXNzTm9kZSwgdEFyZ3MpOwogICAgfQogICAgcmV0dXJuIGdldExlZ2FjeUxlYXN0VXBwZXJCb3VuZCh0eXBlMSwgdHlwZTIpOwogIH0KCiAgRGFydFR5cGUgX3R5cGVQYXJhbWV0ZXJTdGFuZGFyZFVwcGVyQm91bmQoRGFydFR5cGUgdHlwZTEsIERhcnRUeXBlIHR5cGUyKSB7CiAgICAvLyBUaGlzIGN1cnJlbnRseSBqdXN0IGltcGxlbWVudHMgYSBzaW1wbGUgc3RhbmRhcmQgdXBwZXIgYm91bmQgdG8KICAgIC8vIGhhbmRsZSBzb21lIGNvbW1vbiBjYXNlcy4gIEl0IGFsc28gYXZvaWRzIHNvbWUgdGVybWluYXRpb24gaXNzdWVzCiAgICAvLyB3aXRoIHRoZSBuYWl2ZSBzcGVjIGFsZ29yaXRobS4gIFRoZSBzdGFuZGFyZCB1cHBlciBib3VuZCBvZiB0d28gdHlwZXMKICAgIC8vIChhdCBsZWFzdCBvbmUgb2Ygd2hpY2ggaXMgYSB0eXBlIHBhcmFtZXRlcikgaXMgY29tcHV0ZWQgaGVyZSBhczoKICAgIC8vIDEuIElmIGVpdGhlciB0eXBlIGlzIGEgc3VwZXJ0eXBlIG9mIHRoZSBvdGhlciwgcmV0dXJuIGl0LgogICAgLy8gMi4gSWYgdGhlIGZpcnN0IHR5cGUgaXMgYSB0eXBlIHBhcmFtZXRlciwgcmVwbGFjZSBpdCB3aXRoIGl0cyBib3VuZCwKICAgIC8vICAgIHdpdGggcmVjdXJzaXZlIG9jY3VycmVuY2VzIG9mIGl0c2VsZiByZXBsYWNlZCB3aXRoIE9iamVjdC4KICAgIC8vICAgIFRoZSBzZWNvbmQgcGFydCBvZiB0aGlzIHNob3VsZCBlbnN1cmUgdGVybWluYXRpb24uICBJbmZvcm1hbGx5LAogICAgLy8gICAgZWFjaCB0eXBlIHZhcmlhYmxlIGluc3RhbnRpYXRpb24gaW4gb25lIG9mIHRoZSBhcmd1bWVudHMgdG8gdGhlCiAgICAvLyAgICBzdGFuZGFyZCB1cHBlciBib3VuZCBhbGdvcml0aG0gbm93IHN0cmljdGx5IHJlZHVjZXMgdGhlIG51bWJlcgogICAgLy8gICAgb2YgYm91bmQgdmFyaWFibGVzIGluIHNjb3BlIGluIHRoYXQgYXJndW1lbnQgcG9zaXRpb24uCiAgICAvLyAzLiBJZiB0aGUgc2Vjb25kIHR5cGUgaXMgYSB0eXBlIHBhcmFtZXRlciwgZG8gdGhlIHN5bW1ldHJpYyBvcGVyYXRpb24KICAgIC8vICAgIHRvICMyLgogICAgLy8KICAgIC8vIEl0J3Mgbm90IGltbWVkaWF0ZWx5IG9idmlvdXMgd2h5IHRoaXMgaXMgc3ltbWV0cmljIGluIHRoZSBjYXNlIHRoYXQgYm90aAogICAgLy8gb2YgdGhlbSBhcmUgdHlwZSBwYXJhbWV0ZXJzLiAgRm9yICMxLCBzeW1tZXRyeSBob2xkcyBzaW5jZSBzdWJ0eXBlCiAgICAvLyBpcyBhbnRpc3ltbWV0cmljLiAgRm9yICMyLCBpdCdzIGNsZWFybHkgbm90IHN5bW1ldHJpYyBpZiB1cHBlciBib3VuZHMgb2YKICAgIC8vIGJvdHRvbSBhcmUgYWxsb3dlZC4gIElnbm9yaW5nIHRoaXMgKGZvciB2YXJpb3VzIHJlYXNvbnMsIG5vdCBsZWFzdAogICAgLy8gb2Ygd2hpY2ggdGhhdCB0aGVyZSdzIG5vIHdheSB0byB3cml0ZSBpdCksIHRoZXJlJ3MgYW4gaW5mb3JtYWwKICAgIC8vIGFyZ3VtZW50ICh0aGF0IG1pZ2h0IGV2ZW4gYmUgcmlnaHQpIHRoYXQgeW91IHdpbGwgYWx3YXlzIGVpdGhlcgogICAgLy8gZW5kIHVwIGV4cGFuZGluZyBib3RoIG9mIHRoZW0gb3IgZWxzZSByZXR1cm5pbmcgdGhlIHNhbWUgcmVzdWx0IG5vIG1hdHRlcgogICAgLy8gd2hpY2ggb3JkZXIgeW91IGV4cGFuZCB0aGVtIGluLiAgQSBrZXkgb2JzZXJ2YXRpb24gaXMgdGhhdAogICAgLy8gaWRlbnRpY2FsKGV4cGFuZCh0eXBlMSksIHR5cGUyKSA9PiBzdWJ0eXBlKHR5cGUxLCB0eXBlMikKICAgIC8vIGFuZCBoZW5jZSB0aGUgY29udHJhLXBvc2l0aXZlLgogICAgLy8KICAgIC8vIFRPRE8obGVhZnApOiBUaGluayB0aGlzIHRocm91Z2ggYW5kIGZpZ3VyZSBvdXQgd2hhdCdzIHRoZSByaWdodAogICAgLy8gZGVmaW5pdGlvbi4gIEJlIGNhcmVmdWwgYWJvdXQgdGVybWluYXRpb24uCiAgICAvLwogICAgLy8gSSBzdXNwZWN0IGluIGdlbmVyYWwgYSByZWFzb25hYmxlIGFsZ29yaXRobSBpcyB0byBleHBhbmQgdGhlIGlubmVybW9zdAogICAgLy8gdHlwZSB2YXJpYWJsZSBmaXJzdC4gIEFsdGVybmF0aXZlbHksIHlvdSBjb3VsZCBwcm9iYWJseSBjaG9vc2UgdG8gdHJlYXQKICAgIC8vIGl0IGFzIGp1c3QgYW4gaW5zdGFuY2Ugb2YgdGhlIGludGVyZmFjZSB0eXBlIHVwcGVyIGJvdW5kIHByb2JsZW0sIHdpdGgKICAgIC8vIHRoZSAiaW5oZXJpdGFuY2UiIGNoYWluIGV4dGVuZGVkIGJ5IHRoZSBib3VuZHMgcGxhY2VkIG9uIHRoZSB2YXJpYWJsZXMuCiAgICBpZiAoaXNTdWJ0eXBlT2YodHlwZTEsIHR5cGUyKSkgewogICAgICByZXR1cm4gdHlwZTI7CiAgICB9CiAgICBpZiAoaXNTdWJ0eXBlT2YodHlwZTIsIHR5cGUxKSkgewogICAgICByZXR1cm4gdHlwZTE7CiAgICB9CiAgICBpZiAodHlwZTEgaXMgVHlwZVBhcmFtZXRlclR5cGUpIHsKICAgICAgLy8gVE9ETyhwYXVsYmVycnkpOiBBbmFseXplciBjb2xsYXBzZXMgc2ltcGxlIGJvdW5kcyBpbiBvbmUgc3RlcCwgaS5lLiBmb3IKICAgICAgLy8gQzxUIGV4dGVuZHMgVSwgVSBleHRlbmRzIExpc3Q+LCBUIGdldHMgcmVzb2x2ZWQgZGlyZWN0bHkgdG8gTGlzdC4gIERvCiAgICAgIC8vIHdlIG5lZWQgdG8gcmVwbGljYXRlIHRoYXQgYmVoYXZpb3I/CiAgICAgIHJldHVybiBnZXRTdGFuZGFyZFVwcGVyQm91bmQoCiAgICAgICAgICBTdWJzdGl0dXRpb24uZnJvbU1hcCh7dHlwZTEucGFyYW1ldGVyOiBvYmplY3RUeXBlfSkKICAgICAgICAgICAgICAuc3Vic3RpdHV0ZVR5cGUodHlwZTEucGFyYW1ldGVyLmJvdW5kKSwKICAgICAgICAgIHR5cGUyKTsKICAgIH0gZWxzZSBpZiAodHlwZTIgaXMgVHlwZVBhcmFtZXRlclR5cGUpIHsKICAgICAgcmV0dXJuIGdldFN0YW5kYXJkVXBwZXJCb3VuZCgKICAgICAgICAgIHR5cGUxLAogICAgICAgICAgU3Vic3RpdHV0aW9uLmZyb21NYXAoe3R5cGUyLnBhcmFtZXRlcjogb2JqZWN0VHlwZX0pCiAgICAgICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHR5cGUyLnBhcmFtZXRlci5ib3VuZCkpOwogICAgfSBlbHNlIHsKICAgICAgLy8gV2Ugc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gYXQgbGVhc3Qgb25lIG9mIHRoZSB0eXBlcyBpcyBhCiAgICAgIC8vIFR5cGVQYXJhbWV0ZXJUeXBlCiAgICAgIGFzc2VydChmYWxzZSk7CiAgICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgfQogIH0KfQqBxQBNTj8BHAEhCRQPEhUWFxUTGxIBPQEsASAbHiAlAToBKjEBQAZFUFBDTEpKFSMUBgEyIBQGIBQGASgdFAYdFAYBPyAUBiAUBgFIHxQGHxQGATErKykpATQ6OAYBTh0lFAYBJRQGATofBAE2Bk9HUENMSkoVIxQGATIgFAYgFAYBKx0UBh0UBgFFIBQGIBQGAUwfFAYfFAYBLCsrKSkBRD0GAU4zOx8GOx8GAU4XPDkGATo4BgE4IgYBTTUgBAFGBk8GPwZMUFEiBi8GUCYGK0lRSQFDGlBEMC8vMTFJESsKDz0IBgFKSREhRkMBLCoGEREVLC4zMzAdOyQ7FTEZRTYOEz8TDBE9EQoIBjABUEM+AS1NPio5BAFGBkoGTCIGURgGT0tJTEQBSjQ3PUAkBjsBQ1AOGlBEMDdBBgEnKgYRERUsLjMzMB0TJBMVMRlFNg4TEwwREQoIBgEtTT4qOQQBKTJOST1JOEZPSkxKRB5NRjAlFAYlFAYiIjczMwEuNjBACDgGMwQBTkdJTUhBTEVKSklBTREHUEpQSkZHUUJAJgdHMgdOT05PJRQGJRQGJlFPLSQ+NhItJBE+Nw1GGxUiBgQCAT9wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2Uvc3RhbmRhcmRfYm91bmRzLmRhcnREc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9pbXBsaWNpdF9maWVsZF90eXBlLmRhcnSD4i8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmltcGxpY2l0X3R5cGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdyBEYXJ0VHlwZSwgRGFydFR5cGVWaXNpdG9yLCBEYXJ0VHlwZVZpc2l0b3IxLCBWaXNpdG9yOwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgdW5zdXBwb3J0ZWQ7CgppbXBvcnQgJ2tlcm5lbF9idWlsZGVyLmRhcnQnIHNob3cgTWVtYmVyQnVpbGRlcjsKCmNsYXNzIEltcGxpY2l0RmllbGRUeXBlIGV4dGVuZHMgRGFydFR5cGUgewogIGZpbmFsIE1lbWJlckJ1aWxkZXIgbWVtYmVyOwogIGZpbmFsIFRva2VuIGluaXRpYWxpemVyVG9rZW47CgogIGNvbnN0IEltcGxpY2l0RmllbGRUeXBlKHRoaXMubWVtYmVyLCB0aGlzLmluaXRpYWxpemVyVG9rZW4pOwoKICBhY2NlcHQoRGFydFR5cGVWaXNpdG9yPE9iamVjdD4gdikgewogICAgdW5zdXBwb3J0ZWQoImFjY2VwdCIsIG1lbWJlci5jaGFyT2Zmc2V0LCBtZW1iZXIuZmlsZVVyaSk7CiAgfQoKICBhY2NlcHQxKERhcnRUeXBlVmlzaXRvcjE8T2JqZWN0LCBPYmplY3Q+IHYsIGFyZykgewogICAgdW5zdXBwb3J0ZWQoImFjY2VwdDEiLCBtZW1iZXIuY2hhck9mZnNldCwgbWVtYmVyLmZpbGVVcmkpOwogIH0KCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yPE9iamVjdD4gdikgewogICAgdW5zdXBwb3J0ZWQoInZpc2l0Q2hpbGRyZW4iLCBtZW1iZXIuY2hhck9mZnNldCwgbWVtYmVyLmZpbGVVcmkpOwogIH0KfQojAE5OPAEdASE/AS4BLAExASseIAE/ASY+BAE1PwQBJUUEAgE7cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9pbXBsaWNpdF9maWVsZF90eXBlLmRhcnRFc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfY2xhc3NfYnVpbGRlci5kYXJ0wAD77y8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmtlcm5lbF9jbGFzc19idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBBcmd1bWVudHMsCiAgICAgICAgQXNFeHByZXNzaW9uLAogICAgICAgIENsYXNzLAogICAgICAgIENvbnN0cnVjdG9yLAogICAgICAgIERhcnRUeXBlLAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEV4cHJlc3Npb24sCiAgICAgICAgRmllbGQsCiAgICAgICAgRnVuY3Rpb25Ob2RlLAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgSW52YWxpZFR5cGUsCiAgICAgICAgTGlzdExpdGVyYWwsCiAgICAgICAgTWVtYmVyLAogICAgICAgIE1ldGhvZEludm9jYXRpb24sCiAgICAgICAgTmFtZSwKICAgICAgICBQcm9jZWR1cmUsCiAgICAgICAgUHJvY2VkdXJlS2luZCwKICAgICAgICBSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciwKICAgICAgICBSZXR1cm5TdGF0ZW1lbnQsCiAgICAgICAgU3RhdGljR2V0LAogICAgICAgIFN1cGVydHlwZSwKICAgICAgICBUaGlzRXhwcmVzc2lvbiwKICAgICAgICBUeXBlUGFyYW1ldGVyLAogICAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlLAogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24sCiAgICAgICAgVm9pZFR5cGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IEZ1bmN0aW9uVHlwZSwgVHlwZVBhcmFtZXRlclR5cGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JyBzaG93IENsYXNzSGllcmFyY2h5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbG9uZS5kYXJ0JyBzaG93IENsb25lV2l0aG91dEJvZHk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgc2hvdyBDb3JlVHlwZXM7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3NyYy9ib3VuZHNfY2hlY2tzLmRhcnQnCiAgICBzaG93IFR5cGVBcmd1bWVudElzc3VlLCBmaW5kVHlwZUFyZ3VtZW50SXNzdWVzLCBnZXRHZW5lcmljVHlwZU5hbWU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JyBzaG93IFN1YnN0aXR1dGlvbiwgc3Vic3RpdHV0ZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQnIGFzIHR5cGVfYWxnZWJyYQogICAgc2hvdyBnZXRTdWJzdGl0dXRpb25NYXA7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydCcgc2hvdyBUeXBlRW52aXJvbm1lbnQ7CgppbXBvcnQgJy4uL2RpbGwvZGlsbF9tZW1iZXJfYnVpbGRlci5kYXJ0JyBzaG93IERpbGxNZW1iZXJCdWlsZGVyOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIExvY2F0ZWRNZXNzYWdlLAogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgbWVzc2FnZUdlbmVyaWNGdW5jdGlvblR5cGVVc2VkQXNBY3R1YWxUeXBlQXJndW1lbnQsCiAgICAgICAgbWVzc2FnZUltcGxlbWVudHNGdXR1cmVPciwKICAgICAgICBtZXNzYWdlUGF0Y2hDbGFzc09yaWdpbiwKICAgICAgICBtZXNzYWdlUGF0Y2hDbGFzc1R5cGVWYXJpYWJsZXNNaXNtYXRjaCwKICAgICAgICBtZXNzYWdlUGF0Y2hEZWNsYXJhdGlvbk1pc21hdGNoLAogICAgICAgIG1lc3NhZ2VQYXRjaERlY2xhcmF0aW9uT3JpZ2luLAogICAgICAgIG5vTGVuZ3RoLAogICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uVXNlLAogICAgICAgIHRlbXBsYXRlR2VuZXJpY0Z1bmN0aW9uVHlwZUluZmVycmVkQXNBY3R1YWxUeXBlQXJndW1lbnQsCiAgICAgICAgdGVtcGxhdGVJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9ycywKICAgICAgICB0ZW1wbGF0ZUlsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzQ2F1c2UsCiAgICAgICAgdGVtcGxhdGVJbXBsZW1lbnRzUmVwZWF0ZWQsCiAgICAgICAgdGVtcGxhdGVJbXBsZW1lbnRzU3VwZXJDbGFzcywKICAgICAgICB0ZW1wbGF0ZUltcGxpY2l0TWl4aW5PdmVycmlkZUNvbnRleHQsCiAgICAgICAgdGVtcGxhdGVJbmNvbXBhdGlibGVSZWRpcmVjdGVlRnVuY3Rpb25UeXBlLAogICAgICAgIHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50LAogICAgICAgIHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGUsCiAgICAgICAgdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZUluZmVycmVkLAogICAgICAgIHRlbXBsYXRlSW50ZXJmYWNlQ2hlY2tDb250ZXh0LAogICAgICAgIHRlbXBsYXRlTWl4aW5BcHBsaWNhdGlvbkluY29tcGF0aWJsZVN1cGVydHlwZSwKICAgICAgICB0ZW1wbGF0ZU5hbWVkTWl4aW5PdmVycmlkZUNvbnRleHQsCiAgICAgICAgdGVtcGxhdGVPdmVycmlkZGVuTWV0aG9kQ2F1c2UsCiAgICAgICAgdGVtcGxhdGVPdmVycmlkZUZld2VyTmFtZWRBcmd1bWVudHMsCiAgICAgICAgdGVtcGxhdGVPdmVycmlkZUZld2VyUG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRlTWlzbWF0Y2hOYW1lZFBhcmFtZXRlciwKICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRlTW9yZVJlcXVpcmVkQXJndW1lbnRzLAogICAgICAgIHRlbXBsYXRlT3ZlcnJpZGVUeXBlTWlzbWF0Y2hQYXJhbWV0ZXIsCiAgICAgICAgdGVtcGxhdGVPdmVycmlkZVR5cGVNaXNtYXRjaFJldHVyblR5cGUsCiAgICAgICAgdGVtcGxhdGVPdmVycmlkZVR5cGVWYXJpYWJsZXNNaXNtYXRjaCwKICAgICAgICB0ZW1wbGF0ZVJlZGlyZWN0aW5nRmFjdG9yeUluY29tcGF0aWJsZVR5cGVBcmd1bWVudCwKICAgICAgICB0ZW1wbGF0ZVJlZGlyZWN0aW9uVGFyZ2V0Tm90Rm91bmQsCiAgICAgICAgdGVtcGxhdGVUeXBlQXJndW1lbnRNaXNtYXRjaDsKCmltcG9ydCAnLi4vbmFtZXMuZGFydCcgc2hvdyBub1N1Y2hNZXRob2ROYW1lOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuZXhwZWN0ZWQsIHVuaGFuZGxlZCwgdW5pbXBsZW1lbnRlZDsKCmltcG9ydCAnLi4vc2NvcGUuZGFydCcgc2hvdyBBbWJpZ3VvdXNCdWlsZGVyOwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX3NjaGVtYS5kYXJ0JyBzaG93IFVua25vd25UeXBlOwoKaW1wb3J0ICdrZXJuZWxfYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIENsYXNzQnVpbGRlciwKICAgICAgICBDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXIsCiAgICAgICAgRGVjbGFyYXRpb24sCiAgICAgICAgS2VybmVsRnVuY3Rpb25CdWlsZGVyLAogICAgICAgIEtlcm5lbExpYnJhcnlCdWlsZGVyLAogICAgICAgIEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIsCiAgICAgICAgS2VybmVsUHJvY2VkdXJlQnVpbGRlciwKICAgICAgICBLZXJuZWxSZWRpcmVjdGluZ0ZhY3RvcnlCdWlsZGVyLAogICAgICAgIEtlcm5lbFR5cGVCdWlsZGVyLAogICAgICAgIEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXIsCiAgICAgICAgTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgTWVtYmVyQnVpbGRlciwKICAgICAgICBNZXRhZGF0YUJ1aWxkZXIsCiAgICAgICAgUHJvY2VkdXJlQnVpbGRlciwKICAgICAgICBTY29wZSwKICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyOwoKaW1wb3J0ICdyZWRpcmVjdGluZ19mYWN0b3J5X2JvZHkuZGFydCcKICAgIHNob3cgZ2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keSwgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keTsKCmltcG9ydCAna2VybmVsX3RhcmdldC5kYXJ0JyBzaG93IEtlcm5lbFRhcmdldDsKCmFic3RyYWN0IGNsYXNzIEtlcm5lbENsYXNzQnVpbGRlcgogICAgZXh0ZW5kcyBDbGFzc0J1aWxkZXI8S2VybmVsVHlwZUJ1aWxkZXIsIEludGVyZmFjZVR5cGU+IHsKICBLZXJuZWxDbGFzc0J1aWxkZXIgYWN0dWFsT3JpZ2luOwoKICBLZXJuZWxDbGFzc0J1aWxkZXIoCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywKICAgICAgS2VybmVsVHlwZUJ1aWxkZXIgc3VwZXJ0eXBlLAogICAgICBMaXN0PEtlcm5lbFR5cGVCdWlsZGVyPiBpbnRlcmZhY2VzLAogICAgICBTY29wZSBzY29wZSwKICAgICAgU2NvcGUgY29uc3RydWN0b3JzLAogICAgICBMaWJyYXJ5QnVpbGRlciBwYXJlbnQsCiAgICAgIGludCBjaGFyT2Zmc2V0KQogICAgICA6IHN1cGVyKG1ldGFkYXRhLCBtb2RpZmllcnMsIG5hbWUsIHR5cGVWYXJpYWJsZXMsIHN1cGVydHlwZSwgaW50ZXJmYWNlcywKICAgICAgICAgICAgc2NvcGUsIGNvbnN0cnVjdG9ycywgcGFyZW50LCBjaGFyT2Zmc2V0KTsKCiAgQ2xhc3MgZ2V0IGNsczsKCiAgQ2xhc3MgZ2V0IHRhcmdldCA9PiBjbHM7CgogIENsYXNzIGdldCBhY3R1YWxDbHM7CgogIEBvdmVycmlkZQogIEtlcm5lbENsYXNzQnVpbGRlciBnZXQgb3JpZ2luID0+IGFjdHVhbE9yaWdpbiA/PyB0aGlzOwoKICAvLy8gW2FyZ3VtZW50c10gaGF2ZSBhbHJlYWR5IGJlZW4gYnVpbHQuCiAgSW50ZXJmYWNlVHlwZSBidWlsZFR5cGVzV2l0aEJ1aWx0QXJndW1lbnRzKAogICAgICBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBMaXN0PERhcnRUeXBlPiBhcmd1bWVudHMpIHsKICAgIGFzc2VydChhcmd1bWVudHMgPT0gbnVsbCB8fCBjbHMudHlwZVBhcmFtZXRlcnMubGVuZ3RoID09IGFyZ3VtZW50cy5sZW5ndGgpOwogICAgcmV0dXJuIGFyZ3VtZW50cyA9PSBudWxsID8gY2xzLnJhd1R5cGUgOiBuZXcgSW50ZXJmYWNlVHlwZShjbHMsIGFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IHR5cGVWYXJpYWJsZXNDb3VudCA9PiB0eXBlVmFyaWFibGVzPy5sZW5ndGggPz8gMDsKCiAgTGlzdDxEYXJ0VHlwZT4gYnVpbGRUeXBlQXJndW1lbnRzKAogICAgICBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBMaXN0PEtlcm5lbFR5cGVCdWlsZGVyPiBhcmd1bWVudHMpIHsKICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCAmJiB0eXBlVmFyaWFibGVzID09IG51bGwpIHsKICAgICAgcmV0dXJuIDxEYXJ0VHlwZT5bXTsKICAgIH0KCiAgICBpZiAoYXJndW1lbnRzID09IG51bGwgJiYgdHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgIExpc3Q8RGFydFR5cGU+IHJlc3VsdCA9CiAgICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKHR5cGVWYXJpYWJsZXMubGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgcmVzdWx0W2ldID0gdHlwZVZhcmlhYmxlc1tpXS5kZWZhdWx0VHlwZS5idWlsZChsaWJyYXJ5KTsKICAgICAgfQogICAgICBpZiAobGlicmFyeSBpcyBLZXJuZWxMaWJyYXJ5QnVpbGRlcikgewogICAgICAgIGxpYnJhcnkuaW5mZXJyZWRUeXBlcy5hZGRBbGwocmVzdWx0KTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCAmJiBhcmd1bWVudHMubGVuZ3RoICE9ICh0eXBlVmFyaWFibGVzPy5sZW5ndGggPz8gMCkpIHsKICAgICAgLy8gVGhhdCBzaG91bGQgYmUgY2F1Z2h0IGFuZCByZXBvcnRlZCBhcyBhIGNvbXBpbGUtdGltZSBlcnJvciBlYXJsaWVyLgogICAgICByZXR1cm4gdW5oYW5kbGVkKAogICAgICAgICAgdGVtcGxhdGVUeXBlQXJndW1lbnRNaXNtYXRjaAogICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHR5cGVWYXJpYWJsZXMubGVuZ3RoKQogICAgICAgICAgICAgIC5tZXNzYWdlLAogICAgICAgICAgImJ1aWxkVHlwZUFyZ3VtZW50cyIsCiAgICAgICAgICAtMSwKICAgICAgICAgIG51bGwpOwogICAgfQoKICAgIC8vIGFyZ3VtZW50cy5sZW5ndGggPT0gdHlwZVZhcmlhYmxlcy5sZW5ndGgKICAgIExpc3Q8RGFydFR5cGU+IHJlc3VsdCA9CiAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZChhcmd1bWVudHMubGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSBhcmd1bWVudHNbaV0uYnVpbGQobGlicmFyeSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIElmIFthcmd1bWVudHNdIGFyZSBudWxsLCB0aGUgZGVmYXVsdCB0eXBlcyBmb3IgdGhlIHZhcmlhYmxlcyBhcmUgdXNlZC4KICBJbnRlcmZhY2VUeXBlIGJ1aWxkVHlwZSgKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgTGlzdDxLZXJuZWxUeXBlQnVpbGRlcj4gYXJndW1lbnRzKSB7CiAgICByZXR1cm4gYnVpbGRUeXBlc1dpdGhCdWlsdEFyZ3VtZW50cygKICAgICAgICBsaWJyYXJ5LCBidWlsZFR5cGVBcmd1bWVudHMobGlicmFyeSwgYXJndW1lbnRzKSk7CiAgfQoKICBTdXBlcnR5cGUgYnVpbGRTdXBlcnR5cGUoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIExpc3Q8S2VybmVsVHlwZUJ1aWxkZXI+IGFyZ3VtZW50cykgewogICAgQ2xhc3MgY2xzID0gaXNQYXRjaCA/IG9yaWdpbi50YXJnZXQgOiB0aGlzLmNsczsKICAgIHJldHVybiBuZXcgU3VwZXJ0eXBlKGNscywgYnVpbGRUeXBlQXJndW1lbnRzKGxpYnJhcnksIGFyZ3VtZW50cykpOwogIH0KCiAgU3VwZXJ0eXBlIGJ1aWxkTWl4ZWRJblR5cGUoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIExpc3Q8S2VybmVsVHlwZUJ1aWxkZXI+IGFyZ3VtZW50cykgewogICAgQ2xhc3MgY2xzID0gaXNQYXRjaCA/IG9yaWdpbi50YXJnZXQgOiB0aGlzLmNsczsKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICByZXR1cm4gbmV3IFN1cGVydHlwZShjbHMsIGJ1aWxkVHlwZUFyZ3VtZW50cyhsaWJyYXJ5LCBhcmd1bWVudHMpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgU3VwZXJ0eXBlKAogICAgICAgICAgY2xzLAogICAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCgKICAgICAgICAgICAgICBjbHMudHlwZVBhcmFtZXRlcnMubGVuZ3RoLCBjb25zdCBVbmtub3duVHlwZSgpLAogICAgICAgICAgICAgIGdyb3dhYmxlOiB0cnVlKSk7CiAgICB9CiAgfQoKICB2b2lkIGNoZWNrU3VwZXJ0eXBlcyhDb3JlVHlwZXMgY29yZVR5cGVzKSB7CiAgICAvLyBUaGlzIG1ldGhvZCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNsYXNzICh0aGF0J3MgYmVpbmcgYnVpbHQpIGl0cyBzdXBlcgogICAgLy8gY2xhc3MgYXBwZWFycyBib3RoIGluICdleHRlbmRzJyBhbmQgJ2ltcGxlbWVudHMnIGNsYXVzZXMgYW5kIHdoZXRoZXIgYW55CiAgICAvLyBpbnRlcmZhY2UgYXBwZWFycyBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgJ2ltcGxlbWVudHMnIGNsYXVzZS4KICAgIGlmIChpbnRlcmZhY2VzID09IG51bGwpIHJldHVybjsKCiAgICAvLyBFeHRyYWN0IHN1cGVyIGNsYXNzIChpZiBpdCBleGlzdHMpLgogICAgQ2xhc3NCdWlsZGVyIHN1cGVyQ2xhc3M7CiAgICBLZXJuZWxUeXBlQnVpbGRlciBzdXBlckNsYXNzVHlwZSA9IHN1cGVydHlwZTsKICAgIGlmIChzdXBlckNsYXNzVHlwZSBpcyBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyKSB7CiAgICAgIERlY2xhcmF0aW9uIGRlY2wgPSBzdXBlckNsYXNzVHlwZS5kZWNsYXJhdGlvbjsKICAgICAgaWYgKGRlY2wgaXMgQ2xhc3NCdWlsZGVyKSB7CiAgICAgICAgc3VwZXJDbGFzcyA9IGRlY2w7CiAgICAgIH0KICAgIH0KCiAgICAvLyBWYWxpZGF0ZSBpbnRlcmZhY2VzLgogICAgTWFwPENsYXNzQnVpbGRlciwgaW50PiBwcm9ibGVtczsKICAgIE1hcDxDbGFzc0J1aWxkZXIsIGludD4gcHJvYmxlbXNPZmZzZXRzOwogICAgU2V0PENsYXNzQnVpbGRlcj4gaW1wbGVtZW50ZWQgPSBuZXcgU2V0PENsYXNzQnVpbGRlcj4oKTsKICAgIGZvciAoS2VybmVsVHlwZUJ1aWxkZXIgdHlwZSBpbiBpbnRlcmZhY2VzKSB7CiAgICAgIGlmICh0eXBlIGlzIEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIpIHsKICAgICAgICBpbnQgY2hhck9mZnNldCA9IC0xOyAvLyBUT0RPKGFoZSk6IEdldCBvZmZzZXQgZnJvbSB0eXBlLgogICAgICAgIERlY2xhcmF0aW9uIGRlY2wgPSB0eXBlLmRlY2xhcmF0aW9uOwogICAgICAgIGlmIChkZWNsIGlzIENsYXNzQnVpbGRlcikgewogICAgICAgICAgQ2xhc3NCdWlsZGVyIGludGVyZmFjZSA9IGRlY2w7CiAgICAgICAgICBpZiAoc3VwZXJDbGFzcyA9PSBpbnRlcmZhY2UpIHsKICAgICAgICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgIHRlbXBsYXRlSW1wbGVtZW50c1N1cGVyQ2xhc3Mud2l0aEFyZ3VtZW50cyhpbnRlcmZhY2UubmFtZSksCiAgICAgICAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgbm9MZW5ndGgpOwogICAgICAgICAgfSBlbHNlIGlmIChpbXBsZW1lbnRlZC5jb250YWlucyhpbnRlcmZhY2UpKSB7CiAgICAgICAgICAgIC8vIEFnZ3JlZ2F0ZSByZXBldGl0aW9ucy4KICAgICAgICAgICAgcHJvYmxlbXMgPz89IG5ldyBNYXA8Q2xhc3NCdWlsZGVyLCBpbnQ+KCk7CiAgICAgICAgICAgIHByb2JsZW1zW2ludGVyZmFjZV0gPz89IDA7CiAgICAgICAgICAgIHByb2JsZW1zW2ludGVyZmFjZV0gKz0gMTsKCiAgICAgICAgICAgIHByb2JsZW1zT2Zmc2V0cyA/Pz0gbmV3IE1hcDxDbGFzc0J1aWxkZXIsIGludD4oKTsKICAgICAgICAgICAgcHJvYmxlbXNPZmZzZXRzW2ludGVyZmFjZV0gPz89IGNoYXJPZmZzZXQ7CiAgICAgICAgICB9IGVsc2UgaWYgKGludGVyZmFjZS50YXJnZXQgPT0gY29yZVR5cGVzLmZ1dHVyZU9yQ2xhc3MpIHsKICAgICAgICAgICAgYWRkUHJvYmxlbShtZXNzYWdlSW1wbGVtZW50c0Z1dHVyZU9yLCBjaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgaW50ZXJmYWNlLnRhcmdldC5uYW1lLmxlbmd0aCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbXBsZW1lbnRlZC5hZGQoaW50ZXJmYWNlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChwcm9ibGVtcyAhPSBudWxsKSB7CiAgICAgIHByb2JsZW1zLmZvckVhY2goKENsYXNzQnVpbGRlciBpbnRlcmZhY2UsIGludCByZXBldGl0aW9ucykgewogICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlSW1wbGVtZW50c1JlcGVhdGVkLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICBpbnRlcmZhY2UubmFtZSwgcmVwZXRpdGlvbnMpLAogICAgICAgICAgICBwcm9ibGVtc09mZnNldHNbaW50ZXJmYWNlXSwKICAgICAgICAgICAgbm9MZW5ndGgpOwogICAgICB9KTsKICAgIH0KICB9CgogIHZvaWQgY2hlY2tCb3VuZHNJblN1cGVydHlwZSgKICAgICAgU3VwZXJ0eXBlIHN1cGVydHlwZSwgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCkgewogICAgS2VybmVsTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IHRoaXMubGlicmFyeTsKCiAgICBMaXN0PFR5cGVBcmd1bWVudElzc3VlPiBpc3N1ZXMgPSBmaW5kVHlwZUFyZ3VtZW50SXNzdWVzKAogICAgICAgIG5ldyBJbnRlcmZhY2VUeXBlKHN1cGVydHlwZS5jbGFzc05vZGUsIHN1cGVydHlwZS50eXBlQXJndW1lbnRzKSwKICAgICAgICB0eXBlRW52aXJvbm1lbnQsCiAgICAgICAgYWxsb3dTdXBlckJvdW5kZWQ6IGZhbHNlKTsKICAgIGlmIChpc3N1ZXMgIT0gbnVsbCkgewogICAgICBmb3IgKFR5cGVBcmd1bWVudElzc3VlIGlzc3VlIGluIGlzc3VlcykgewogICAgICAgIE1lc3NhZ2UgbWVzc2FnZTsKICAgICAgICBEYXJ0VHlwZSBhcmd1bWVudCA9IGlzc3VlLmFyZ3VtZW50OwogICAgICAgIFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IGlzc3VlLnR5cGVQYXJhbWV0ZXI7CiAgICAgICAgYm9vbCBpbmZlcnJlZCA9IGxpYnJhcnkuaW5mZXJyZWRUeXBlcy5jb250YWlucyhhcmd1bWVudCk7CiAgICAgICAgaWYgKGFyZ3VtZW50IGlzIEZ1bmN0aW9uVHlwZSAmJiBhcmd1bWVudC50eXBlUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7CiAgICAgICAgICBpZiAoaW5mZXJyZWQpIHsKICAgICAgICAgICAgbWVzc2FnZSA9IHRlbXBsYXRlR2VuZXJpY0Z1bmN0aW9uVHlwZUluZmVycmVkQXNBY3R1YWxUeXBlQXJndW1lbnQKICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGFyZ3VtZW50KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlR2VuZXJpY0Z1bmN0aW9uVHlwZVVzZWRBc0FjdHVhbFR5cGVBcmd1bWVudDsKICAgICAgICAgIH0KICAgICAgICAgIHR5cGVQYXJhbWV0ZXIgPSBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoaW5mZXJyZWQpIHsKICAgICAgICAgICAgbWVzc2FnZSA9CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudEluU3VwZXJ0eXBlSW5mZXJyZWQud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgICBhcmd1bWVudCwKICAgICAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLmJvdW5kLAogICAgICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIubmFtZSwKICAgICAgICAgICAgICAgICAgICBnZXRHZW5lcmljVHlwZU5hbWUoaXNzdWUuZW5jbG9zaW5nVHlwZSksCiAgICAgICAgICAgICAgICAgICAgc3VwZXJ0eXBlLmNsYXNzTm9kZS5uYW1lLAogICAgICAgICAgICAgICAgICAgIG5hbWUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbWVzc2FnZSA9IHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGUud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgIGFyZ3VtZW50LAogICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5ib3VuZCwKICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIubmFtZSwKICAgICAgICAgICAgICAgIGdldEdlbmVyaWNUeXBlTmFtZShpc3N1ZS5lbmNsb3NpbmdUeXBlKSwKICAgICAgICAgICAgICAgIHN1cGVydHlwZS5jbGFzc05vZGUubmFtZSwKICAgICAgICAgICAgICAgIG5hbWUpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbGlicmFyeS5yZXBvcnRUeXBlQXJndW1lbnRJc3N1ZShtZXNzYWdlLCBjaGFyT2Zmc2V0LCB0eXBlUGFyYW1ldGVyKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBjaGVja0JvdW5kc0luT3V0bGluZShUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50KSB7CiAgICBLZXJuZWxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5ID0gdGhpcy5saWJyYXJ5OwoKICAgIC8vIENoZWNrIGluIGJvdW5kcyBvZiBvd24gdHlwZSB2YXJpYWJsZXMuCiAgICBmb3IgKFR5cGVQYXJhbWV0ZXIgcGFyYW1ldGVyIGluIGNscy50eXBlUGFyYW1ldGVycykgewogICAgICBMaXN0PFR5cGVBcmd1bWVudElzc3VlPiBpc3N1ZXMgPSBmaW5kVHlwZUFyZ3VtZW50SXNzdWVzKAogICAgICAgICAgcGFyYW1ldGVyLmJvdW5kLCB0eXBlRW52aXJvbm1lbnQsCiAgICAgICAgICBhbGxvd1N1cGVyQm91bmRlZDogZmFsc2UpOwogICAgICBpZiAoaXNzdWVzICE9IG51bGwpIHsKICAgICAgICBmb3IgKFR5cGVBcmd1bWVudElzc3VlIGlzc3VlIGluIGlzc3VlcykgewogICAgICAgICAgRGFydFR5cGUgYXJndW1lbnQgPSBpc3N1ZS5hcmd1bWVudDsKICAgICAgICAgIFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IGlzc3VlLnR5cGVQYXJhbWV0ZXI7CiAgICAgICAgICBpZiAobGlicmFyeS5pbmZlcnJlZFR5cGVzLmNvbnRhaW5zKGFyZ3VtZW50KSkgewogICAgICAgICAgICAvLyBJbmZlcmVuY2UgaW4gdHlwZSBleHByZXNzaW9ucyBpbiB0aGUgc3VwZXJ0eXBlcyBib2lscyBkb3duIHRvCiAgICAgICAgICAgIC8vIGluc3RhbnRpYXRlLXRvLWJvdW5kIHdoaWNoIHNob3VsZG4ndCBwcm9kdWNlIGFueXRoaW5nIHRoYXQgYnJlYWtzCiAgICAgICAgICAgIC8vIHRoZSBib3VuZHMgYWZ0ZXIgdGhlIG5vbi1zaW1wbGljaXR5IGNoZWNrcyBhcmUgZG9uZS4gIFNvLCBhbnkKICAgICAgICAgICAgLy8gdmlvbGF0aW9uIGhlcmUgaXMgdGhlIHJlc3VsdCBvZiBub24tc2ltcGxlIGJvdW5kcywgYW5kIHRoZSBlcnJvcgogICAgICAgICAgICAvLyBpcyByZXBvcnRlZCBlbHNld2hlcmUuCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQoKICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZTsKICAgICAgICAgIGlmIChhcmd1bWVudCBpcyBGdW5jdGlvblR5cGUgJiYgYXJndW1lbnQudHlwZVBhcmFtZXRlcnMubGVuZ3RoID4gMCkgewogICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZUdlbmVyaWNGdW5jdGlvblR5cGVVc2VkQXNBY3R1YWxUeXBlQXJndW1lbnQ7CiAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIgPSBudWxsOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbWVzc2FnZSA9IHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50LndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICBhcmd1bWVudCwKICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIuYm91bmQsCiAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLm5hbWUsCiAgICAgICAgICAgICAgICBnZXRHZW5lcmljVHlwZU5hbWUoaXNzdWUuZW5jbG9zaW5nVHlwZSkpOwogICAgICAgICAgfQoKICAgICAgICAgIGxpYnJhcnkucmVwb3J0VHlwZUFyZ3VtZW50SXNzdWUoCiAgICAgICAgICAgICAgbWVzc2FnZSwgcGFyYW1ldGVyLmZpbGVPZmZzZXQsIHR5cGVQYXJhbWV0ZXIpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIENoZWNrIGluIHN1cGVycy4KICAgIGlmIChjbHMuc3VwZXJ0eXBlICE9IG51bGwpIHsKICAgICAgY2hlY2tCb3VuZHNJblN1cGVydHlwZShjbHMuc3VwZXJ0eXBlLCB0eXBlRW52aXJvbm1lbnQpOwogICAgfQogICAgaWYgKGNscy5taXhlZEluVHlwZSAhPSBudWxsKSB7CiAgICAgIGNoZWNrQm91bmRzSW5TdXBlcnR5cGUoY2xzLm1peGVkSW5UeXBlLCB0eXBlRW52aXJvbm1lbnQpOwogICAgfQogICAgaWYgKGNscy5pbXBsZW1lbnRlZFR5cGVzICE9IG51bGwpIHsKICAgICAgZm9yIChTdXBlcnR5cGUgc3VwZXJ0eXBlIGluIGNscy5pbXBsZW1lbnRlZFR5cGVzKSB7CiAgICAgICAgY2hlY2tCb3VuZHNJblN1cGVydHlwZShzdXBlcnR5cGUsIHR5cGVFbnZpcm9ubWVudCk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBDaGVjayBpbiBtZW1iZXJzLgogICAgZm9yIChGaWVsZCBmaWVsZCBpbiBjbHMuZmllbGRzKSB7CiAgICAgIGxpYnJhcnkuY2hlY2tCb3VuZHNJbkZpZWxkKGZpZWxkLCB0eXBlRW52aXJvbm1lbnQpOwogICAgfQogICAgZm9yIChQcm9jZWR1cmUgcHJvY2VkdXJlIGluIGNscy5wcm9jZWR1cmVzKSB7CiAgICAgIGxpYnJhcnkuY2hlY2tCb3VuZHNJbkZ1bmN0aW9uTm9kZShwcm9jZWR1cmUuZnVuY3Rpb24sIHR5cGVFbnZpcm9ubWVudCk7CiAgICB9CiAgICBmb3IgKENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yIGluIGNscy5jb25zdHJ1Y3RvcnMpIHsKICAgICAgbGlicmFyeS5jaGVja0JvdW5kc0luRnVuY3Rpb25Ob2RlKGNvbnN0cnVjdG9yLmZ1bmN0aW9uLCB0eXBlRW52aXJvbm1lbnQpOwogICAgfQogICAgZm9yIChSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciByZWRpcmVjdGluZwogICAgICAgIGluIGNscy5yZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnMpIHsKICAgICAgbGlicmFyeS5jaGVja0JvdW5kc0luRnVuY3Rpb25Ob2RlUGFydHMoCiAgICAgICAgICB0eXBlRW52aXJvbm1lbnQsIHJlZGlyZWN0aW5nLmZpbGVPZmZzZXQsCiAgICAgICAgICB0eXBlUGFyYW1ldGVyczogcmVkaXJlY3RpbmcudHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyczogcmVkaXJlY3RpbmcucG9zaXRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgICBuYW1lZFBhcmFtZXRlcnM6IHJlZGlyZWN0aW5nLm5hbWVkUGFyYW1ldGVycyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgcmVzb2x2ZUNvbnN0cnVjdG9ycyhMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICBpbnQgY291bnQgPSBzdXBlci5yZXNvbHZlQ29uc3RydWN0b3JzKGxpYnJhcnkpOwogICAgaWYgKGNvdW50ICE9IDApIHsKICAgICAgTWFwPFN0cmluZywgTWVtYmVyQnVpbGRlcj4gY29uc3RydWN0b3JzID0gdGhpcy5jb25zdHJ1Y3RvcnMubG9jYWw7CiAgICAgIC8vIENvcHkga2V5cyB0byBhdm9pZCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBlcnJvci4KICAgICAgTGlzdDxTdHJpbmc+IG5hbWVzID0gY29uc3RydWN0b3JzLmtleXMudG9MaXN0KCk7CiAgICAgIGZvciAoU3RyaW5nIG5hbWUgaW4gbmFtZXMpIHsKICAgICAgICBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IGNvbnN0cnVjdG9yc1tuYW1lXTsKICAgICAgICBkbyB7CiAgICAgICAgICBpZiAoZGVjbGFyYXRpb24ucGFyZW50ICE9IHRoaXMpIHsKICAgICAgICAgICAgdW5leHBlY3RlZCgiJGZpbGVVcmkiLCAiJHtkZWNsYXJhdGlvbi5wYXJlbnQuZmlsZVVyaX0iLCBjaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgZmlsZVVyaSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaXMgS2VybmVsUmVkaXJlY3RpbmdGYWN0b3J5QnVpbGRlcikgewogICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBpbW1lZGlhdGUgcmVkaXJlY3Rpb24gdGFyZ2V0LCBub3QgdGhlIGVmZmVjdGl2ZS4KICAgICAgICAgICAgQ29uc3RydWN0b3JSZWZlcmVuY2VCdWlsZGVyIHJlZGlyZWN0aW9uVGFyZ2V0ID0KICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uLnJlZGlyZWN0aW9uVGFyZ2V0OwogICAgICAgICAgICBpZiAocmVkaXJlY3Rpb25UYXJnZXQgIT0gbnVsbCkgewogICAgICAgICAgICAgIERlY2xhcmF0aW9uIHRhcmdldEJ1aWxkZXIgPSByZWRpcmVjdGlvblRhcmdldC50YXJnZXQ7CiAgICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uLm5leHQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgLy8gT25seSB0aGUgZmlyc3Qgb25lICh0aGF0IGlzLCB0aGUgbGFzdCBvbiBpbiB0aGUgbGlua2VkIGxpc3QpCiAgICAgICAgICAgICAgICAvLyBpcyBhY3R1YWxseSBpbiB0aGUga2VybmVsIHRyZWUuIFRoaXMgY2FsbCBjcmVhdGVzIGEgU3RhdGljR2V0CiAgICAgICAgICAgICAgICAvLyB0byBbZGVjbGFyYXRpb24udGFyZ2V0XSBpbiBhIGZpZWxkIGBfcmVkaXJlY3RpbmcjYCB3aGljaCBpcwogICAgICAgICAgICAgICAgLy8gb25seSBsZWdhbCB0byBkbyB0byB0aGluZ3MgaW4gdGhlIGtlcm5lbCB0cmVlLgogICAgICAgICAgICAgICAgYWRkUmVkaXJlY3RpbmdDb25zdHJ1Y3RvcihkZWNsYXJhdGlvbiwgbGlicmFyeSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICh0YXJnZXRCdWlsZGVyIGlzIFByb2NlZHVyZUJ1aWxkZXIpIHsKICAgICAgICAgICAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPSBkZWNsYXJhdGlvbi50eXBlQXJndW1lbnRzOwogICAgICAgICAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAvLyBUT0RPKDMyMDQ5KSBJZiB0eXBlIGFyZ3VtZW50cyBhcmVuJ3Qgc3BlY2lmaWVkLCB0aGV5IHNob3VsZAogICAgICAgICAgICAgICAgICAvLyBiZSBpbmZlcnJlZC4gIEN1cnJlbnRseSwgdGhlIGluZmVyZW5jZSBpcyBub3QgcGVyZm9ybWVkLgogICAgICAgICAgICAgICAgICAvLyBUaGUgY29kZSBiZWxvdyBpcyBhIHdvcmthcm91bmQuCiAgICAgICAgICAgICAgICAgIHR5cGVBcmd1bWVudHMgPSBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKAogICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QnVpbGRlci50YXJnZXQuZW5jbG9zaW5nQ2xhc3MudHlwZVBhcmFtZXRlcnMubGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHluYW1pY1R5cGUoKSwKICAgICAgICAgICAgICAgICAgICAgIGdyb3dhYmxlOiB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uLnNldFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkoCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QnVpbGRlci50YXJnZXQsIHR5cGVBcmd1bWVudHMpOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0QnVpbGRlciBpcyBEaWxsTWVtYmVyQnVpbGRlcikgewogICAgICAgICAgICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9IGRlY2xhcmF0aW9uLnR5cGVBcmd1bWVudHM7CiAgICAgICAgICAgICAgICBpZiAodHlwZUFyZ3VtZW50cyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgIC8vIFRPRE8oMzIwNDkpIElmIHR5cGUgYXJndW1lbnRzIGFyZW4ndCBzcGVjaWZpZWQsIHRoZXkgc2hvdWxkCiAgICAgICAgICAgICAgICAgIC8vIGJlIGluZmVycmVkLiAgQ3VycmVudGx5LCB0aGUgaW5mZXJlbmNlIGlzIG5vdCBwZXJmb3JtZWQuCiAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb2RlIGJlbG93IGlzIGEgd29ya2Fyb3VuZC4KICAgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cyA9IG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQoCiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCdWlsZGVyLnRhcmdldC5lbmNsb3NpbmdDbGFzcy50eXBlUGFyYW1ldGVycy5sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEeW5hbWljVHlwZSgpLAogICAgICAgICAgICAgICAgICAgICAgZ3Jvd2FibGU6IHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGVjbGFyYXRpb24uc2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keSgKICAgICAgICAgICAgICAgICAgICB0YXJnZXRCdWlsZGVyLm1lbWJlciwgdHlwZUFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXRCdWlsZGVyIGlzIEFtYmlndW91c0J1aWxkZXIpIHsKICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uVXNlCiAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMocmVkaXJlY3Rpb25UYXJnZXQuZnVsbE5hbWVGb3JFcnJvcnMpOwogICAgICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uLmlzQ29uc3QpIHsKICAgICAgICAgICAgICAgICAgYWRkUHJvYmxlbShtZXNzYWdlLCBkZWNsYXJhdGlvbi5jaGFyT2Zmc2V0LCBub0xlbmd0aCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhZGRQcm9ibGVtKG1lc3NhZ2UsIGRlY2xhcmF0aW9uLmNoYXJPZmZzZXQsIG5vTGVuZ3RoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIENvcmVUeXBlcyBhcmVuJ3QgY29tcHV0ZWQgeWV0LCBhbmQgdGhpcyBpcyB0aGUgb3V0bGluZQogICAgICAgICAgICAgICAgLy8gcGhhc2UuIFNvIHdlIGNhbid0IGFuZCBzaG91bGRuJ3QgY3JlYXRlIGEgbWV0aG9kIGJvZHkuCiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbi5ib2R5ID0gbmV3IFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkudW5yZXNvbHZlZCgKICAgICAgICAgICAgICAgICAgICByZWRpcmVjdGlvblRhcmdldC5mdWxsTmFtZUZvckVycm9ycyk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHRlbXBsYXRlUmVkaXJlY3Rpb25UYXJnZXROb3RGb3VuZAogICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHJlZGlyZWN0aW9uVGFyZ2V0LmZ1bGxOYW1lRm9yRXJyb3JzKTsKICAgICAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbi5pc0NvbnN0KSB7CiAgICAgICAgICAgICAgICAgIGFkZFByb2JsZW0obWVzc2FnZSwgZGVjbGFyYXRpb24uY2hhck9mZnNldCwgbm9MZW5ndGgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYWRkUHJvYmxlbShtZXNzYWdlLCBkZWNsYXJhdGlvbi5jaGFyT2Zmc2V0LCBub0xlbmd0aCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBDb3JlVHlwZXMgYXJlbid0IGNvbXB1dGVkIHlldCwgYW5kIHRoaXMgaXMgdGhlIG91dGxpbmUKICAgICAgICAgICAgICAgIC8vIHBoYXNlLiBTbyB3ZSBjYW4ndCBhbmQgc2hvdWxkbid0IGNyZWF0ZSBhIG1ldGhvZCBib2R5LgogICAgICAgICAgICAgICAgZGVjbGFyYXRpb24uYm9keSA9IG5ldyBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5LnVucmVzb2x2ZWQoCiAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3Rpb25UYXJnZXQuZnVsbE5hbWVGb3JFcnJvcnMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbi5uZXh0OwogICAgICAgIH0gd2hpbGUgKGRlY2xhcmF0aW9uICE9IG51bGwpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gY291bnQ7CiAgfQoKICB2b2lkIGFkZFJlZGlyZWN0aW5nQ29uc3RydWN0b3IoCiAgICAgIEtlcm5lbFByb2NlZHVyZUJ1aWxkZXIgY29uc3RydWN0b3IsIEtlcm5lbExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgIC8vIEFkZCBhIG5ldyBzeW50aGV0aWMgZmllbGQgdG8gdGhpcyBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIGZhY3RvcnkKICAgIC8vIGNvbnN0cnVjdG9ycy4gVGhpcyBpcyB1c2VkIHRvIHN1cHBvcnQgcmVzb2x2aW5nIHN1Y2ggY29uc3RydWN0b3JzIGluCiAgICAvLyBzb3VyY2UgY29kZS4KICAgIC8vCiAgICAvLyBUaGUgc3ludGhldGljIGZpZWxkIGxvb2tzIGxpa2UgdGhpczoKICAgIC8vCiAgICAvLyAgICAgZmluYWwgX3JlZGlyZWN0aW5nIyA9IFtjMSwgLi4uLCBjbl07CiAgICAvLwogICAgLy8gV2hlcmUgZWFjaCBjMSAuLi4gY24gYXJlIGFuIGluc3RhbmNlIG9mIFtTdGF0aWNHZXRdIHdob3NlIHRhcmdldCBpcwogICAgLy8gW2NvbnN0cnVjdG9yLnRhcmdldF0uCiAgICAvLwogICAgLy8gVE9ETyhhaGUpOiBBZGQgYSBrZXJuZWwgbm9kZSB0byByZXByZXNlbnQgcmVkaXJlY3RpbmcgZmFjdG9yeSBib2RpZXMuCiAgICBEaWxsTWVtYmVyQnVpbGRlciBjb25zdHJ1Y3RvcnNGaWVsZCA9CiAgICAgICAgb3JpZ2luLnNjb3BlLmxvY2FsLnB1dElmQWJzZW50KCJfcmVkaXJlY3RpbmcjIiwgKCkgewogICAgICBMaXN0TGl0ZXJhbCBsaXRlcmFsID0gbmV3IExpc3RMaXRlcmFsKDxFeHByZXNzaW9uPltdKTsKICAgICAgTmFtZSBuYW1lID0gbmV3IE5hbWUoIl9yZWRpcmVjdGluZyMiLCBsaWJyYXJ5LmxpYnJhcnkpOwogICAgICBGaWVsZCBmaWVsZCA9IG5ldyBGaWVsZChuYW1lLAogICAgICAgICAgaXNTdGF0aWM6IHRydWUsIGluaXRpYWxpemVyOiBsaXRlcmFsLCBmaWxlVXJpOiBjbHMuZmlsZVVyaSkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBjbHMuZmlsZU9mZnNldDsKICAgICAgY2xzLmFkZE1lbWJlcihmaWVsZCk7CiAgICAgIHJldHVybiBuZXcgRGlsbE1lbWJlckJ1aWxkZXIoZmllbGQsIHRoaXMpOwogICAgfSk7CiAgICBGaWVsZCBmaWVsZCA9IGNvbnN0cnVjdG9yc0ZpZWxkLnRhcmdldDsKICAgIExpc3RMaXRlcmFsIGxpdGVyYWwgPSBmaWVsZC5pbml0aWFsaXplcjsKICAgIGxpdGVyYWwuZXhwcmVzc2lvbnMKICAgICAgICAuYWRkKG5ldyBTdGF0aWNHZXQoY29uc3RydWN0b3IudGFyZ2V0KS4ucGFyZW50ID0gbGl0ZXJhbCk7CiAgfQoKICB2b2lkIGhhbmRsZVNlZW5Db3ZhcmlhbnQoCiAgICAgIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSwKICAgICAgTWVtYmVyIGRlY2xhcmVkTWVtYmVyLAogICAgICBNZW1iZXIgaW50ZXJmYWNlTWVtYmVyLAogICAgICBib29sIGlzU2V0dGVyLAogICAgICBjYWxsYmFjayhNZW1iZXIgZGVjbGFyZWRNZW1iZXIsIE1lbWJlciBpbnRlcmZhY2VNZW1iZXIsIGJvb2wgaXNTZXR0ZXIpKSB7CiAgICAvLyBXaGVuIGEgcGFyYW1ldGVyIGlzIGNvdmFyaWFudCB3ZSBoYXZlIHRvIGNoZWNrIHRoYXQgd2UgYWxzbwogICAgLy8gb3ZlcnJpZGUgdGhlIHNhbWUgbWVtYmVyIGluIGFsbCBwYXJlbnRzLgogICAgZm9yIChTdXBlcnR5cGUgc3VwZXJ0eXBlIGluIGludGVyZmFjZU1lbWJlci5lbmNsb3NpbmdDbGFzcy5zdXBlcnMpIHsKICAgICAgTWVtYmVyIG0gPSBoaWVyYXJjaHkuZ2V0SW50ZXJmYWNlTWVtYmVyKAogICAgICAgICAgc3VwZXJ0eXBlLmNsYXNzTm9kZSwgaW50ZXJmYWNlTWVtYmVyLm5hbWUsCiAgICAgICAgICBzZXR0ZXI6IGlzU2V0dGVyKTsKICAgICAgaWYgKG0gIT0gbnVsbCkgewogICAgICAgIGNhbGxiYWNrKGRlY2xhcmVkTWVtYmVyLCBtLCBpc1NldHRlcik7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgY2hlY2tPdmVycmlkZSgKICAgICAgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5LAogICAgICBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LAogICAgICBNZW1iZXIgZGVjbGFyZWRNZW1iZXIsCiAgICAgIE1lbWJlciBpbnRlcmZhY2VNZW1iZXIsCiAgICAgIGJvb2wgaXNTZXR0ZXIsCiAgICAgIGNhbGxiYWNrKE1lbWJlciBkZWNsYXJlZE1lbWJlciwgTWVtYmVyIGludGVyZmFjZU1lbWJlciwgYm9vbCBpc1NldHRlciksCiAgICAgIHtib29sIGlzSW50ZXJmYWNlQ2hlY2sgPSBmYWxzZX0pIHsKICAgIGlmIChkZWNsYXJlZE1lbWJlciA9PSBpbnRlcmZhY2VNZW1iZXIpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGRlY2xhcmVkTWVtYmVyIGlzIENvbnN0cnVjdG9yIHx8IGludGVyZmFjZU1lbWJlciBpcyBDb25zdHJ1Y3RvcikgewogICAgICB1bmltcGxlbWVudGVkKAogICAgICAgICAgIkNvbnN0cnVjdG9yIGluIG92ZXJyaWRlIGNoZWNrLiIsIGRlY2xhcmVkTWVtYmVyLmZpbGVPZmZzZXQsIGZpbGVVcmkpOwogICAgfQogICAgaWYgKGRlY2xhcmVkTWVtYmVyIGlzIFByb2NlZHVyZSAmJiBpbnRlcmZhY2VNZW1iZXIgaXMgUHJvY2VkdXJlKSB7CiAgICAgIGlmIChkZWNsYXJlZE1lbWJlci5raW5kID09IFByb2NlZHVyZUtpbmQuTWV0aG9kICYmCiAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIua2luZCA9PSBQcm9jZWR1cmVLaW5kLk1ldGhvZCkgewogICAgICAgIGJvb2wgc2VlbkNvdmFyaWFudCA9IGNoZWNrTWV0aG9kT3ZlcnJpZGUoaGllcmFyY2h5LCB0eXBlRW52aXJvbm1lbnQsCiAgICAgICAgICAgIGRlY2xhcmVkTWVtYmVyLCBpbnRlcmZhY2VNZW1iZXIsIGlzSW50ZXJmYWNlQ2hlY2spOwogICAgICAgIGlmIChzZWVuQ292YXJpYW50KSB7CiAgICAgICAgICBoYW5kbGVTZWVuQ292YXJpYW50KAogICAgICAgICAgICAgIGhpZXJhcmNoeSwgZGVjbGFyZWRNZW1iZXIsIGludGVyZmFjZU1lbWJlciwgaXNTZXR0ZXIsIGNhbGxiYWNrKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGRlY2xhcmVkTWVtYmVyLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5HZXR0ZXIgJiYKICAgICAgICAgIGludGVyZmFjZU1lbWJlci5raW5kID09IFByb2NlZHVyZUtpbmQuR2V0dGVyKSB7CiAgICAgICAgY2hlY2tHZXR0ZXJPdmVycmlkZShoaWVyYXJjaHksIHR5cGVFbnZpcm9ubWVudCwgZGVjbGFyZWRNZW1iZXIsCiAgICAgICAgICAgIGludGVyZmFjZU1lbWJlciwgaXNJbnRlcmZhY2VDaGVjayk7CiAgICAgIH0KICAgICAgaWYgKGRlY2xhcmVkTWVtYmVyLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5TZXR0ZXIgJiYKICAgICAgICAgIGludGVyZmFjZU1lbWJlci5raW5kID09IFByb2NlZHVyZUtpbmQuU2V0dGVyKSB7CiAgICAgICAgYm9vbCBzZWVuQ292YXJpYW50ID0gY2hlY2tTZXR0ZXJPdmVycmlkZShoaWVyYXJjaHksIHR5cGVFbnZpcm9ubWVudCwKICAgICAgICAgICAgZGVjbGFyZWRNZW1iZXIsIGludGVyZmFjZU1lbWJlciwgaXNJbnRlcmZhY2VDaGVjayk7CiAgICAgICAgaWYgKHNlZW5Db3ZhcmlhbnQpIHsKICAgICAgICAgIGhhbmRsZVNlZW5Db3ZhcmlhbnQoCiAgICAgICAgICAgICAgaGllcmFyY2h5LCBkZWNsYXJlZE1lbWJlciwgaW50ZXJmYWNlTWVtYmVyLCBpc1NldHRlciwgY2FsbGJhY2spOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYm9vbCBkZWNsYXJlZE1lbWJlckhhc0dldHRlciA9IGRlY2xhcmVkTWVtYmVyIGlzIEZpZWxkIHx8CiAgICAgICAgICBkZWNsYXJlZE1lbWJlciBpcyBQcm9jZWR1cmUgJiYgZGVjbGFyZWRNZW1iZXIuaXNHZXR0ZXI7CiAgICAgIGJvb2wgaW50ZXJmYWNlTWVtYmVySGFzR2V0dGVyID0gaW50ZXJmYWNlTWVtYmVyIGlzIEZpZWxkIHx8CiAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIgaXMgUHJvY2VkdXJlICYmIGludGVyZmFjZU1lbWJlci5pc0dldHRlcjsKICAgICAgYm9vbCBkZWNsYXJlZE1lbWJlckhhc1NldHRlciA9IGRlY2xhcmVkTWVtYmVyIGlzIEZpZWxkIHx8CiAgICAgICAgICBkZWNsYXJlZE1lbWJlciBpcyBQcm9jZWR1cmUgJiYgZGVjbGFyZWRNZW1iZXIuaXNTZXR0ZXI7CiAgICAgIGJvb2wgaW50ZXJmYWNlTWVtYmVySGFzU2V0dGVyID0gaW50ZXJmYWNlTWVtYmVyIGlzIEZpZWxkIHx8CiAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIgaXMgUHJvY2VkdXJlICYmIGludGVyZmFjZU1lbWJlci5pc1NldHRlcjsKICAgICAgaWYgKGRlY2xhcmVkTWVtYmVySGFzR2V0dGVyICYmIGludGVyZmFjZU1lbWJlckhhc0dldHRlcikgewogICAgICAgIGNoZWNrR2V0dGVyT3ZlcnJpZGUoaGllcmFyY2h5LCB0eXBlRW52aXJvbm1lbnQsIGRlY2xhcmVkTWVtYmVyLAogICAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIsIGlzSW50ZXJmYWNlQ2hlY2spOwogICAgICB9IGVsc2UgaWYgKGRlY2xhcmVkTWVtYmVySGFzU2V0dGVyICYmIGludGVyZmFjZU1lbWJlckhhc1NldHRlcikgewogICAgICAgIGJvb2wgc2VlbkNvdmFyaWFudCA9IGNoZWNrU2V0dGVyT3ZlcnJpZGUoaGllcmFyY2h5LCB0eXBlRW52aXJvbm1lbnQsCiAgICAgICAgICAgIGRlY2xhcmVkTWVtYmVyLCBpbnRlcmZhY2VNZW1iZXIsIGlzSW50ZXJmYWNlQ2hlY2spOwogICAgICAgIGlmIChzZWVuQ292YXJpYW50KSB7CiAgICAgICAgICBoYW5kbGVTZWVuQ292YXJpYW50KAogICAgICAgICAgICAgIGhpZXJhcmNoeSwgZGVjbGFyZWRNZW1iZXIsIGludGVyZmFjZU1lbWJlciwgaXNTZXR0ZXIsIGNhbGxiYWNrKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8vIFRPRE8oYWhlKTogSGFuZGxlIG90aGVyIGNhc2VzOiBhY2Nlc3NvcnMsIG9wZXJhdG9ycywgYW5kIGZpZWxkcy4KICB9CgogIHZvaWQgY2hlY2tPdmVycmlkZXMoCiAgICAgIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSwgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCkgewogICAgdm9pZCBvdmVycmlkZVBhaXJDYWxsYmFjaygKICAgICAgICBNZW1iZXIgZGVjbGFyZWRNZW1iZXIsIE1lbWJlciBpbnRlcmZhY2VNZW1iZXIsIGJvb2wgaXNTZXR0ZXIpIHsKICAgICAgY2hlY2tPdmVycmlkZShoaWVyYXJjaHksIHR5cGVFbnZpcm9ubWVudCwgZGVjbGFyZWRNZW1iZXIsIGludGVyZmFjZU1lbWJlciwKICAgICAgICAgIGlzU2V0dGVyLCBvdmVycmlkZVBhaXJDYWxsYmFjayk7CiAgICB9CgogICAgaGllcmFyY2h5LmZvckVhY2hPdmVycmlkZVBhaXIoY2xzLCBvdmVycmlkZVBhaXJDYWxsYmFjayk7CiAgfQoKICB2b2lkIGNoZWNrQWJzdHJhY3RNZW1iZXJzKENvcmVUeXBlcyBjb3JlVHlwZXMsIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSwKICAgICAgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCkgewogICAgLy8gVE9ETyhhaGUpOiBNb3ZlIHRoaXMgdG8gW0NsYXNzSGllcmFyY2h5QnVpbGRlcl0uCiAgICBpZiAoaXNBYnN0cmFjdCkgewogICAgICAvLyBVbmltcGxlbWVudGVkIG1lbWJlcnMgYWxsb3dlZAogICAgICByZXR1cm47CiAgICB9CgogICAgYm9vbCBtdXN0SGF2ZUltcGxlbWVudGF0aW9uKE1lbWJlciBtZW1iZXIpIHsKICAgICAgLy8gUHVibGljIG1lbWJlcgogICAgICBpZiAoIW1lbWJlci5uYW1lLmlzUHJpdmF0ZSkgcmV0dXJuIHRydWU7CiAgICAgIC8vIFByaXZhdGUgbWVtYmVyIGluIGRpZmZlcmVudCBsaWJyYXJ5CiAgICAgIGlmIChtZW1iZXIuZW5jbG9zaW5nTGlicmFyeSAhPSBjbHMuZW5jbG9zaW5nTGlicmFyeSkgcmV0dXJuIGZhbHNlOwogICAgICAvLyBQcml2YXRlIG1lbWJlciBpbiBwYXRjaAogICAgICBpZiAobWVtYmVyLmZpbGVVcmkgIT0gbWVtYmVyLmVuY2xvc2luZ0NsYXNzLmZpbGVVcmkpIHJldHVybiBmYWxzZTsKICAgICAgLy8gUHJpdmF0ZSBtZW1iZXIgaW4gc2FtZSBsaWJyYXJ5CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHZvaWQgb3ZlcnJpZGVQYWlyQ2FsbGJhY2soCiAgICAgICAgTWVtYmVyIGRlY2xhcmVkTWVtYmVyLCBNZW1iZXIgaW50ZXJmYWNlTWVtYmVyLCBib29sIGlzU2V0dGVyKSB7CiAgICAgIGNoZWNrT3ZlcnJpZGUoaGllcmFyY2h5LCB0eXBlRW52aXJvbm1lbnQsIGRlY2xhcmVkTWVtYmVyLCBpbnRlcmZhY2VNZW1iZXIsCiAgICAgICAgICBpc1NldHRlciwgb3ZlcnJpZGVQYWlyQ2FsbGJhY2ssCiAgICAgICAgICBpc0ludGVyZmFjZUNoZWNrOiB0cnVlKTsKICAgIH0KCiAgICB2b2lkIGZpbmRNaXNzaW5nSW1wbGVtZW50YXRpb25zKHtib29sIHNldHRlcnN9KSB7CiAgICAgIExpc3Q8TWVtYmVyPiBkaXNwYXRjaFRhcmdldHMgPQogICAgICAgICAgaGllcmFyY2h5LmdldERpc3BhdGNoVGFyZ2V0cyhjbHMsIHNldHRlcnM6IHNldHRlcnMpOwogICAgICBpbnQgdGFyZ2V0SW5kZXggPSAwOwogICAgICBmb3IgKE1lbWJlciBpbnRlcmZhY2VNZW1iZXIKICAgICAgICAgIGluIGhpZXJhcmNoeS5nZXRJbnRlcmZhY2VNZW1iZXJzKGNscywgc2V0dGVyczogc2V0dGVycykpIHsKICAgICAgICBpZiAobXVzdEhhdmVJbXBsZW1lbnRhdGlvbihpbnRlcmZhY2VNZW1iZXIpKSB7CiAgICAgICAgICB3aGlsZSAodGFyZ2V0SW5kZXggPCBkaXNwYXRjaFRhcmdldHMubGVuZ3RoICYmCiAgICAgICAgICAgICAgQ2xhc3NIaWVyYXJjaHkuY29tcGFyZU1lbWJlcnMoCiAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaFRhcmdldHNbdGFyZ2V0SW5kZXhdLCBpbnRlcmZhY2VNZW1iZXIpIDwKICAgICAgICAgICAgICAgICAgMCkgewogICAgICAgICAgICB0YXJnZXRJbmRleCsrOwogICAgICAgICAgfQogICAgICAgICAgYm9vbCBmb3VuZFRhcmdldCA9IHRhcmdldEluZGV4IDwgZGlzcGF0Y2hUYXJnZXRzLmxlbmd0aCAmJgogICAgICAgICAgICAgIENsYXNzSGllcmFyY2h5LmNvbXBhcmVNZW1iZXJzKAogICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hUYXJnZXRzW3RhcmdldEluZGV4XSwgaW50ZXJmYWNlTWVtYmVyKSA8PQogICAgICAgICAgICAgICAgICAwOwogICAgICAgICAgaWYgKGZvdW5kVGFyZ2V0KSB7CiAgICAgICAgICAgIE1lbWJlciBkaXNwYXRjaFRhcmdldCA9IGRpc3BhdGNoVGFyZ2V0c1t0YXJnZXRJbmRleF07CiAgICAgICAgICAgIHdoaWxlIChkaXNwYXRjaFRhcmdldCBpcyBQcm9jZWR1cmUgJiYKICAgICAgICAgICAgICAgICFkaXNwYXRjaFRhcmdldC5pc0V4dGVybmFsICYmCiAgICAgICAgICAgICAgICBkaXNwYXRjaFRhcmdldC5mb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0ICE9IG51bGwpIHsKICAgICAgICAgICAgICBkaXNwYXRjaFRhcmdldCA9CiAgICAgICAgICAgICAgICAgIChkaXNwYXRjaFRhcmdldCBhcyBQcm9jZWR1cmUpLmZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKGludGVyZmFjZU1lbWJlciBpcyBQcm9jZWR1cmUgJiYKICAgICAgICAgICAgICAgICFpbnRlcmZhY2VNZW1iZXIuaXNFeHRlcm5hbCAmJgogICAgICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmZvcndhcmRpbmdTdHViSW50ZXJmYWNlVGFyZ2V0ICE9IG51bGwpIHsKICAgICAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIgPQogICAgICAgICAgICAgICAgICAoaW50ZXJmYWNlTWVtYmVyIGFzIFByb2NlZHVyZSkuZm9yd2FyZGluZ1N0dWJJbnRlcmZhY2VUYXJnZXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFoaWVyYXJjaHkuaXNTdWJ0eXBlT2YoZGlzcGF0Y2hUYXJnZXQuZW5jbG9zaW5nQ2xhc3MsCiAgICAgICAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIuZW5jbG9zaW5nQ2xhc3MpKSB7CiAgICAgICAgICAgICAgb3ZlcnJpZGVQYWlyQ2FsbGJhY2soZGlzcGF0Y2hUYXJnZXQsIGludGVyZmFjZU1lbWJlciwgc2V0dGVycyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBmaW5kTWlzc2luZ0ltcGxlbWVudGF0aW9ucyhzZXR0ZXJzOiBmYWxzZSk7CiAgICBmaW5kTWlzc2luZ0ltcGxlbWVudGF0aW9ucyhzZXR0ZXJzOiB0cnVlKTsKICB9CgogIGJvb2wgaGFzVXNlckRlZmluZWROb1N1Y2hNZXRob2QoCiAgICAgIENsYXNzIGtsYXNzLCBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHksIENsYXNzIG9iamVjdENsYXNzKSB7CiAgICBNZW1iZXIgbm9TdWNoTWV0aG9kID0gaGllcmFyY2h5LmdldERpc3BhdGNoVGFyZ2V0KGtsYXNzLCBub1N1Y2hNZXRob2ROYW1lKTsKICAgIHJldHVybiBub1N1Y2hNZXRob2QgIT0gbnVsbCAmJiBub1N1Y2hNZXRob2QuZW5jbG9zaW5nQ2xhc3MgIT0gb2JqZWN0Q2xhc3M7CiAgfQoKICB2b2lkIHRyYW5zZm9ybVByb2NlZHVyZVRvTm9TdWNoTWV0aG9kRm9yd2FyZGVyKAogICAgICBNZW1iZXIgbm9TdWNoTWV0aG9kSW50ZXJmYWNlLCBLZXJuZWxUYXJnZXQgdGFyZ2V0LCBQcm9jZWR1cmUgcHJvY2VkdXJlKSB7CiAgICBTdHJpbmcgcHJlZml4ID0KICAgICAgICBwcm9jZWR1cmUuaXNHZXR0ZXIgPyAnZ2V0OicgOiBwcm9jZWR1cmUuaXNTZXR0ZXIgPyAnc2V0OicgOiAnJzsKICAgIEV4cHJlc3Npb24gaW52b2NhdGlvbiA9IHRhcmdldC5iYWNrZW5kVGFyZ2V0Lmluc3RhbnRpYXRlSW52b2NhdGlvbigKICAgICAgICB0YXJnZXQubG9hZGVyLmNvcmVUeXBlcywKICAgICAgICBuZXcgVGhpc0V4cHJlc3Npb24oKSwKICAgICAgICBwcmVmaXggKyBwcm9jZWR1cmUubmFtZS5uYW1lLAogICAgICAgIG5ldyBBcmd1bWVudHMuZm9yd2FyZGVkKHByb2NlZHVyZS5mdW5jdGlvbiksCiAgICAgICAgcHJvY2VkdXJlLmZpbGVPZmZzZXQsCiAgICAgICAgLyppc1N1cGVyPSovIGZhbHNlKTsKICAgIEV4cHJlc3Npb24gcmVzdWx0ID0gbmV3IE1ldGhvZEludm9jYXRpb24obmV3IFRoaXNFeHByZXNzaW9uKCksCiAgICAgICAgbm9TdWNoTWV0aG9kTmFtZSwgbmV3IEFyZ3VtZW50cyhbaW52b2NhdGlvbl0pLCBub1N1Y2hNZXRob2RJbnRlcmZhY2UpCiAgICAgIC4uZmlsZU9mZnNldCA9IHByb2NlZHVyZS5maWxlT2Zmc2V0OwogICAgaWYgKHByb2NlZHVyZS5mdW5jdGlvbi5yZXR1cm5UeXBlIGlzISBWb2lkVHlwZSkgewogICAgICByZXN1bHQgPSBuZXcgQXNFeHByZXNzaW9uKHJlc3VsdCwgcHJvY2VkdXJlLmZ1bmN0aW9uLnJldHVyblR5cGUpCiAgICAgICAgLi5pc1R5cGVFcnJvciA9IHRydWUKICAgICAgICAuLmZpbGVPZmZzZXQgPSBwcm9jZWR1cmUuZmlsZU9mZnNldDsKICAgIH0KICAgIHByb2NlZHVyZS5mdW5jdGlvbi5ib2R5ID0gbmV3IFJldHVyblN0YXRlbWVudChyZXN1bHQpCiAgICAgIC4uZmlsZU9mZnNldCA9IHByb2NlZHVyZS5maWxlT2Zmc2V0OwogICAgcHJvY2VkdXJlLmZ1bmN0aW9uLmJvZHkucGFyZW50ID0gcHJvY2VkdXJlLmZ1bmN0aW9uOwoKICAgIHByb2NlZHVyZS5pc0Fic3RyYWN0ID0gZmFsc2U7CiAgICBwcm9jZWR1cmUuaXNOb1N1Y2hNZXRob2RGb3J3YXJkZXIgPSB0cnVlOwogICAgcHJvY2VkdXJlLmlzRm9yd2FyZGluZ1N0dWIgPSBmYWxzZTsKICAgIHByb2NlZHVyZS5pc0ZvcndhcmRpbmdTZW1pU3R1YiA9IGZhbHNlOwogIH0KCiAgdm9pZCBhZGROb1N1Y2hNZXRob2RGb3J3YXJkZXJGb3JQcm9jZWR1cmUoTWVtYmVyIG5vU3VjaE1ldGhvZCwKICAgICAgS2VybmVsVGFyZ2V0IHRhcmdldCwgUHJvY2VkdXJlIHByb2NlZHVyZSwgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5KSB7CiAgICBDbG9uZVdpdGhvdXRCb2R5IGNsb25lciA9IG5ldyBDbG9uZVdpdGhvdXRCb2R5KAogICAgICAgIHR5cGVTdWJzdGl0dXRpb246IHR5cGVfYWxnZWJyYS5nZXRTdWJzdGl0dXRpb25NYXAoCiAgICAgICAgICAgIGhpZXJhcmNoeS5nZXRDbGFzc0FzSW5zdGFuY2VPZihjbHMsIHByb2NlZHVyZS5lbmNsb3NpbmdDbGFzcykpLAogICAgICAgIGNsb25lQW5ub3RhdGlvbnM6IGZhbHNlKTsKICAgIFByb2NlZHVyZSBjbG9uZWQgPSBjbG9uZXIuY2xvbmUocHJvY2VkdXJlKS4uaXNFeHRlcm5hbCA9IGZhbHNlOwogICAgdHJhbnNmb3JtUHJvY2VkdXJlVG9Ob1N1Y2hNZXRob2RGb3J3YXJkZXIobm9TdWNoTWV0aG9kLCB0YXJnZXQsIGNsb25lZCk7CiAgICBjbHMucHJvY2VkdXJlcy5hZGQoY2xvbmVkKTsKICAgIGNsb25lZC5wYXJlbnQgPSBjbHM7CgogICAgS2VybmVsTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IHRoaXMubGlicmFyeTsKICAgIGxpYnJhcnkuZm9yd2FyZGVyc09yaWdpbnMuYWRkKGNsb25lZCk7CiAgICBsaWJyYXJ5LmZvcndhcmRlcnNPcmlnaW5zLmFkZChwcm9jZWR1cmUpOwogIH0KCiAgdm9pZCBhZGROb1N1Y2hNZXRob2RGb3J3YXJkZXJHZXR0ZXJGb3JGaWVsZChNZW1iZXIgbm9TdWNoTWV0aG9kLAogICAgICBLZXJuZWxUYXJnZXQgdGFyZ2V0LCBGaWVsZCBmaWVsZCwgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5KSB7CiAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21TdXBlcnR5cGUoCiAgICAgICAgaGllcmFyY2h5LmdldENsYXNzQXNJbnN0YW5jZU9mKGNscywgZmllbGQuZW5jbG9zaW5nQ2xhc3MpKTsKICAgIFByb2NlZHVyZSBnZXR0ZXIgPSBuZXcgUHJvY2VkdXJlKAogICAgICAgIGZpZWxkLm5hbWUsCiAgICAgICAgUHJvY2VkdXJlS2luZC5HZXR0ZXIsCiAgICAgICAgbmV3IEZ1bmN0aW9uTm9kZShudWxsLAogICAgICAgICAgICB0eXBlUGFyYW1ldGVyczogPFR5cGVQYXJhbWV0ZXI+W10sCiAgICAgICAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzOiA8VmFyaWFibGVEZWNsYXJhdGlvbj5bXSwKICAgICAgICAgICAgbmFtZWRQYXJhbWV0ZXJzOiA8VmFyaWFibGVEZWNsYXJhdGlvbj5bXSwKICAgICAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogMCwKICAgICAgICAgICAgcmV0dXJuVHlwZTogc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGZpZWxkLnR5cGUpKSwKICAgICAgICBmaWxlVXJpOiBmaWVsZC5maWxlVXJpKQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWVsZC5maWxlT2Zmc2V0OwogICAgdHJhbnNmb3JtUHJvY2VkdXJlVG9Ob1N1Y2hNZXRob2RGb3J3YXJkZXIobm9TdWNoTWV0aG9kLCB0YXJnZXQsIGdldHRlcik7CiAgICBjbHMucHJvY2VkdXJlcy5hZGQoZ2V0dGVyKTsKICAgIGdldHRlci5wYXJlbnQgPSBjbHM7CiAgfQoKICB2b2lkIGFkZE5vU3VjaE1ldGhvZEZvcndhcmRlclNldHRlckZvckZpZWxkKE1lbWJlciBub1N1Y2hNZXRob2QsCiAgICAgIEtlcm5lbFRhcmdldCB0YXJnZXQsIEZpZWxkIGZpZWxkLCBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHkpIHsKICAgIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbVN1cGVydHlwZSgKICAgICAgICBoaWVyYXJjaHkuZ2V0Q2xhc3NBc0luc3RhbmNlT2YoY2xzLCBmaWVsZC5lbmNsb3NpbmdDbGFzcykpOwogICAgUHJvY2VkdXJlIHNldHRlciA9IG5ldyBQcm9jZWR1cmUoCiAgICAgICAgZmllbGQubmFtZSwKICAgICAgICBQcm9jZWR1cmVLaW5kLlNldHRlciwKICAgICAgICBuZXcgRnVuY3Rpb25Ob2RlKG51bGwsCiAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzOiA8VHlwZVBhcmFtZXRlcj5bXSwKICAgICAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnM6IDxWYXJpYWJsZURlY2xhcmF0aW9uPlsKICAgICAgICAgICAgICBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbigidmFsdWUiLAogICAgICAgICAgICAgICAgICB0eXBlOiBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoZmllbGQudHlwZSkpCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIG5hbWVkUGFyYW1ldGVyczogPFZhcmlhYmxlRGVjbGFyYXRpb24+W10sCiAgICAgICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IDEsCiAgICAgICAgICAgIHJldHVyblR5cGU6IGNvbnN0IFZvaWRUeXBlKCkpLAogICAgICAgIGZpbGVVcmk6IGZpZWxkLmZpbGVVcmkpCiAgICAgIC4uZmlsZU9mZnNldCA9IGZpZWxkLmZpbGVPZmZzZXQ7CiAgICB0cmFuc2Zvcm1Qcm9jZWR1cmVUb05vU3VjaE1ldGhvZEZvcndhcmRlcihub1N1Y2hNZXRob2QsIHRhcmdldCwgc2V0dGVyKTsKICAgIGNscy5wcm9jZWR1cmVzLmFkZChzZXR0ZXIpOwogICAgc2V0dGVyLnBhcmVudCA9IGNsczsKICB9CgogIC8vLyBBZGRzIG5vU3VjaE1ldGhvZCBmb3J3YXJkaW5nIHN0dWJzIHRvIHRoaXMgY2xhc3MuIFJldHVybnMgYHRydWVgIGlmIHRoZQogIC8vLyBjbGFzcyB3YXMgbW9kaWZpZWQuCiAgYm9vbCBhZGROb1N1Y2hNZXRob2RGb3J3YXJkZXJzKAogICAgICBLZXJuZWxUYXJnZXQgdGFyZ2V0LCBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHkpIHsKICAgIGlmIChjbHMuaXNBYnN0cmFjdCkgcmV0dXJuIGZhbHNlOwoKICAgIFNldDxOYW1lPiBleGlzdGluZ0ZvcndhcmRlcnNOYW1lcyA9IG5ldyBTZXQ8TmFtZT4oKTsKICAgIFNldDxOYW1lPiBleGlzdGluZ1NldHRlckZvcndhcmRlcnNOYW1lcyA9IG5ldyBTZXQ8TmFtZT4oKTsKICAgIENsYXNzIGxlYXN0Q29uY3JldGVTdXBlcmNsYXNzID0gY2xzLnN1cGVyY2xhc3M7CiAgICB3aGlsZSAoCiAgICAgICAgbGVhc3RDb25jcmV0ZVN1cGVyY2xhc3MgIT0gbnVsbCAmJiBsZWFzdENvbmNyZXRlU3VwZXJjbGFzcy5pc0Fic3RyYWN0KSB7CiAgICAgIGxlYXN0Q29uY3JldGVTdXBlcmNsYXNzID0gbGVhc3RDb25jcmV0ZVN1cGVyY2xhc3Muc3VwZXJjbGFzczsKICAgIH0KICAgIGlmIChsZWFzdENvbmNyZXRlU3VwZXJjbGFzcyAhPSBudWxsKSB7CiAgICAgIGJvb2wgc3VwZXJIYXNVc2VyRGVmaW5lZE5vU3VjaE1ldGhvZCA9IGhhc1VzZXJEZWZpbmVkTm9TdWNoTWV0aG9kKAogICAgICAgICAgbGVhc3RDb25jcmV0ZVN1cGVyY2xhc3MsIGhpZXJhcmNoeSwgdGFyZ2V0Lm9iamVjdENsYXNzKTsKICAgICAgTGlzdDxNZW1iZXI+IGNvbmNyZXRlID0KICAgICAgICAgIGhpZXJhcmNoeS5nZXREaXNwYXRjaFRhcmdldHMobGVhc3RDb25jcmV0ZVN1cGVyY2xhc3MpOwogICAgICBmb3IgKE1lbWJlciBtZW1iZXIKICAgICAgICAgIGluIGhpZXJhcmNoeS5nZXRJbnRlcmZhY2VNZW1iZXJzKGxlYXN0Q29uY3JldGVTdXBlcmNsYXNzKSkgewogICAgICAgIGlmICgoc3VwZXJIYXNVc2VyRGVmaW5lZE5vU3VjaE1ldGhvZCB8fAogICAgICAgICAgICAgICAgbGVhc3RDb25jcmV0ZVN1cGVyY2xhc3MuZW5jbG9zaW5nTGlicmFyeS5jb21wYXJlVG8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXIuZW5jbG9zaW5nQ2xhc3MuZW5jbG9zaW5nTGlicmFyeSkgIT0KICAgICAgICAgICAgICAgICAgICAgICAgMCAmJgogICAgICAgICAgICAgICAgICAgIG1lbWJlci5uYW1lLmlzUHJpdmF0ZSkgJiYKICAgICAgICAgICAgQ2xhc3NIaWVyYXJjaHkuZmluZE1lbWJlckJ5TmFtZShjb25jcmV0ZSwgbWVtYmVyLm5hbWUpID09IG51bGwpIHsKICAgICAgICAgIGV4aXN0aW5nRm9yd2FyZGVyc05hbWVzLmFkZChtZW1iZXIubmFtZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBMaXN0PE1lbWJlcj4gY29uY3JldGVTZXR0ZXJzID0KICAgICAgICAgIGhpZXJhcmNoeS5nZXREaXNwYXRjaFRhcmdldHMobGVhc3RDb25jcmV0ZVN1cGVyY2xhc3MsIHNldHRlcnM6IHRydWUpOwogICAgICBmb3IgKE1lbWJlciBtZW1iZXIgaW4gaGllcmFyY2h5CiAgICAgICAgICAuZ2V0SW50ZXJmYWNlTWVtYmVycyhsZWFzdENvbmNyZXRlU3VwZXJjbGFzcywgc2V0dGVyczogdHJ1ZSkpIHsKICAgICAgICBpZiAoQ2xhc3NIaWVyYXJjaHkuZmluZE1lbWJlckJ5TmFtZShjb25jcmV0ZVNldHRlcnMsIG1lbWJlci5uYW1lKSA9PQogICAgICAgICAgICBudWxsKSB7CiAgICAgICAgICBleGlzdGluZ1NldHRlckZvcndhcmRlcnNOYW1lcy5hZGQobWVtYmVyLm5hbWUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIE1lbWJlciBub1N1Y2hNZXRob2QgPSBDbGFzc0hpZXJhcmNoeS5maW5kTWVtYmVyQnlOYW1lKAogICAgICAgIGhpZXJhcmNoeS5nZXRJbnRlcmZhY2VNZW1iZXJzKGNscyksIG5vU3VjaE1ldGhvZE5hbWUpOwoKICAgIExpc3Q8TWVtYmVyPiBjb25jcmV0ZSA9IGhpZXJhcmNoeS5nZXREaXNwYXRjaFRhcmdldHMoY2xzKTsKICAgIExpc3Q8TWVtYmVyPiBkZWNsYXJlZCA9IGhpZXJhcmNoeS5nZXREZWNsYXJlZE1lbWJlcnMoY2xzKTsKCiAgICBib29sIGNsc0hhc1VzZXJEZWZpbmVkTm9TdWNoTWV0aG9kID0KICAgICAgICBoYXNVc2VyRGVmaW5lZE5vU3VjaE1ldGhvZChjbHMsIGhpZXJhcmNoeSwgdGFyZ2V0Lm9iamVjdENsYXNzKTsKICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOwogICAgZm9yIChNZW1iZXIgbWVtYmVyIGluIGhpZXJhcmNoeS5nZXRJbnRlcmZhY2VNZW1iZXJzKGNscykpIHsKICAgICAgLy8gV2UgZ2VuZXJhdGUgYSBub1N1Y2hNZXRob2QgZm9yd2FyZGVyIGZvciBbbWVtYmVyXSBpbiBbY2xzXSBpZiB0aGUKICAgICAgLy8gZm9sbG93aW5nIHRocmVlIGNvbmRpdGlvbnMgYXJlIHNhdGlzZmllZCBzaW11bHRhbmVvdXNseToKICAgICAgLy8gMSkgVGhlcmUgaXMgYSB1c2VyLWRlZmluZWQgbm9TdWNoTWV0aG9kIGluIFtjbHNdIG9yIFttZW1iZXJdIGlzIHByaXZhdGUKICAgICAgLy8gICAgYW5kIHRoZSBlbmNsb3NpbmcgbGlicmFyeSBvZiBbbWVtYmVyXSBpcyBkaWZmZXJlbnQgZnJvbSB0aGF0IG9mCiAgICAgIC8vICAgIFtjbHNdLgogICAgICAvLyAyKSBUaGVyZSBpcyBubyBpbXBsZW1lbnRhdGlvbiBvZiBbbWVtYmVyXSBpbiBbY2xzXS4KICAgICAgLy8gMykgVGhlIHN1cGVyY2xhc3Mgb2YgW2Nsc10gaGFzIG5vIGZvcndhcmRlciBmb3IgW21lbWJlcl0uCiAgICAgIGlmIChtZW1iZXIgaXMgUHJvY2VkdXJlICYmCiAgICAgICAgICAoY2xzSGFzVXNlckRlZmluZWROb1N1Y2hNZXRob2QgfHwKICAgICAgICAgICAgICBjbHMuZW5jbG9zaW5nTGlicmFyeQogICAgICAgICAgICAgICAgICAgICAgICAgIC5jb21wYXJlVG8obWVtYmVyLmVuY2xvc2luZ0NsYXNzLmVuY2xvc2luZ0xpYnJhcnkpICE9CiAgICAgICAgICAgICAgICAgICAgICAwICYmCiAgICAgICAgICAgICAgICAgIG1lbWJlci5uYW1lLmlzUHJpdmF0ZSkgJiYKICAgICAgICAgIENsYXNzSGllcmFyY2h5LmZpbmRNZW1iZXJCeU5hbWUoY29uY3JldGUsIG1lbWJlci5uYW1lKSA9PSBudWxsICYmCiAgICAgICAgICAhZXhpc3RpbmdGb3J3YXJkZXJzTmFtZXMuY29udGFpbnMobWVtYmVyLm5hbWUpKSB7CiAgICAgICAgaWYgKENsYXNzSGllcmFyY2h5LmZpbmRNZW1iZXJCeU5hbWUoZGVjbGFyZWQsIG1lbWJlci5uYW1lKSAhPSBudWxsKSB7CiAgICAgICAgICB0cmFuc2Zvcm1Qcm9jZWR1cmVUb05vU3VjaE1ldGhvZEZvcndhcmRlcigKICAgICAgICAgICAgICBub1N1Y2hNZXRob2QsIHRhcmdldCwgbWVtYmVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYWRkTm9TdWNoTWV0aG9kRm9yd2FyZGVyRm9yUHJvY2VkdXJlKAogICAgICAgICAgICAgIG5vU3VjaE1ldGhvZCwgdGFyZ2V0LCBtZW1iZXIsIGhpZXJhcmNoeSk7CiAgICAgICAgfQogICAgICAgIGV4aXN0aW5nRm9yd2FyZGVyc05hbWVzLmFkZChtZW1iZXIubmFtZSk7CiAgICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIGlmIChtZW1iZXIgaXMgRmllbGQgJiYKICAgICAgICAgIENsYXNzSGllcmFyY2h5LmZpbmRNZW1iZXJCeU5hbWUoY29uY3JldGUsIG1lbWJlci5uYW1lKSA9PSBudWxsICYmCiAgICAgICAgICAhZXhpc3RpbmdGb3J3YXJkZXJzTmFtZXMuY29udGFpbnMobWVtYmVyLm5hbWUpKSB7CiAgICAgICAgYWRkTm9TdWNoTWV0aG9kRm9yd2FyZGVyR2V0dGVyRm9yRmllbGQoCiAgICAgICAgICAgIG5vU3VjaE1ldGhvZCwgdGFyZ2V0LCBtZW1iZXIsIGhpZXJhcmNoeSk7CiAgICAgICAgZXhpc3RpbmdGb3J3YXJkZXJzTmFtZXMuYWRkKG1lbWJlci5uYW1lKTsKICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIExpc3Q8TWVtYmVyPiBjb25jcmV0ZVNldHRlcnMgPQogICAgICAgIGhpZXJhcmNoeS5nZXREaXNwYXRjaFRhcmdldHMoY2xzLCBzZXR0ZXJzOiB0cnVlKTsKICAgIExpc3Q8TWVtYmVyPiBkZWNsYXJlZFNldHRlcnMgPQogICAgICAgIGhpZXJhcmNoeS5nZXREZWNsYXJlZE1lbWJlcnMoY2xzLCBzZXR0ZXJzOiB0cnVlKTsKICAgIGZvciAoTWVtYmVyIG1lbWJlciBpbiBoaWVyYXJjaHkuZ2V0SW50ZXJmYWNlTWVtYmVycyhjbHMsIHNldHRlcnM6IHRydWUpKSB7CiAgICAgIGlmIChtZW1iZXIgaXMgUHJvY2VkdXJlICYmCiAgICAgICAgICBDbGFzc0hpZXJhcmNoeS5maW5kTWVtYmVyQnlOYW1lKGNvbmNyZXRlU2V0dGVycywgbWVtYmVyLm5hbWUpID09CiAgICAgICAgICAgICAgbnVsbCAmJgogICAgICAgICAgIWV4aXN0aW5nU2V0dGVyRm9yd2FyZGVyc05hbWVzLmNvbnRhaW5zKG1lbWJlci5uYW1lKSkgewogICAgICAgIGlmIChDbGFzc0hpZXJhcmNoeS5maW5kTWVtYmVyQnlOYW1lKGRlY2xhcmVkU2V0dGVycywgbWVtYmVyLm5hbWUpICE9CiAgICAgICAgICAgIG51bGwpIHsKICAgICAgICAgIHRyYW5zZm9ybVByb2NlZHVyZVRvTm9TdWNoTWV0aG9kRm9yd2FyZGVyKAogICAgICAgICAgICAgIG5vU3VjaE1ldGhvZCwgdGFyZ2V0LCBtZW1iZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhZGROb1N1Y2hNZXRob2RGb3J3YXJkZXJGb3JQcm9jZWR1cmUoCiAgICAgICAgICAgICAgbm9TdWNoTWV0aG9kLCB0YXJnZXQsIG1lbWJlciwgaGllcmFyY2h5KTsKICAgICAgICB9CiAgICAgICAgZXhpc3RpbmdTZXR0ZXJGb3J3YXJkZXJzTmFtZXMuYWRkKG1lbWJlci5uYW1lKTsKICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAobWVtYmVyIGlzIEZpZWxkICYmCiAgICAgICAgICBDbGFzc0hpZXJhcmNoeS5maW5kTWVtYmVyQnlOYW1lKGNvbmNyZXRlU2V0dGVycywgbWVtYmVyLm5hbWUpID09CiAgICAgICAgICAgICAgbnVsbCAmJgogICAgICAgICAgIWV4aXN0aW5nU2V0dGVyRm9yd2FyZGVyc05hbWVzLmNvbnRhaW5zKG1lbWJlci5uYW1lKSkgewogICAgICAgIGFkZE5vU3VjaE1ldGhvZEZvcndhcmRlclNldHRlckZvckZpZWxkKAogICAgICAgICAgICBub1N1Y2hNZXRob2QsIHRhcmdldCwgbWVtYmVyLCBoaWVyYXJjaHkpOwogICAgICAgIGV4aXN0aW5nU2V0dGVyRm9yd2FyZGVyc05hbWVzLmFkZChtZW1iZXIubmFtZSk7CiAgICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gY2hhbmdlZDsKICB9CgogIFVyaSBfZ2V0TWVtYmVyVXJpKE1lbWJlciBtZW1iZXIpIHsKICAgIGlmIChtZW1iZXIgaXMgRmllbGQpIHJldHVybiBtZW1iZXIuZmlsZVVyaTsKICAgIGlmIChtZW1iZXIgaXMgUHJvY2VkdXJlKSByZXR1cm4gbWVtYmVyLmZpbGVVcmk7CiAgICAvLyBPdGhlciBtZW1iZXIgdHlwZXMgd29uJ3QgYmUgc2VlbiBiZWNhdXNlIGNvbnN0cnVjdG9ycyBkb24ndCBwYXJ0aWNpcGF0ZQogICAgLy8gaW4gb3ZlcnJpZGUgcmVsYXRpb25zaGlwcwogICAgcmV0dXJuIHVuaGFuZGxlZCgnJHttZW1iZXIucnVudGltZVR5cGV9JywgJ19nZXRNZW1iZXJVcmknLCAtMSwgbnVsbCk7CiAgfQoKICBTdWJzdGl0dXRpb24gX2NvbXB1dGVJbnRlcmZhY2VTdWJzdGl0dXRpb24oCiAgICAgIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSwKICAgICAgTWVtYmVyIGRlY2xhcmVkTWVtYmVyLAogICAgICBNZW1iZXIgaW50ZXJmYWNlTWVtYmVyLAogICAgICBGdW5jdGlvbk5vZGUgZGVjbGFyZWRGdW5jdGlvbiwKICAgICAgRnVuY3Rpb25Ob2RlIGludGVyZmFjZUZ1bmN0aW9uLAogICAgICBib29sIGlzSW50ZXJmYWNlQ2hlY2spIHsKICAgIFN1YnN0aXR1dGlvbiBpbnRlcmZhY2VTdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZW1wdHk7CiAgICBpZiAoaW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzLnR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgaW50ZXJmYWNlU3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21TdXBlcnR5cGUoCiAgICAgICAgICBoaWVyYXJjaHkuZ2V0Q2xhc3NBc0luc3RhbmNlT2YoY2xzLCBpbnRlcmZhY2VNZW1iZXIuZW5jbG9zaW5nQ2xhc3MpKTsKICAgIH0KICAgIGlmIChkZWNsYXJlZEZ1bmN0aW9uPy50eXBlUGFyYW1ldGVycz8ubGVuZ3RoICE9CiAgICAgICAgaW50ZXJmYWNlRnVuY3Rpb24/LnR5cGVQYXJhbWV0ZXJzPy5sZW5ndGgpIHsKICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVPdmVycmlkZVR5cGVWYXJpYWJsZXNNaXNtYXRjaC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICIke2RlY2xhcmVkTWVtYmVyLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiIKICAgICAgICAgICAgICAiJHtkZWNsYXJlZE1lbWJlci5uYW1lLm5hbWV9IiwKICAgICAgICAgICAgICAiJHtpbnRlcmZhY2VNZW1iZXIuZW5jbG9zaW5nQ2xhc3MubmFtZX0uIgogICAgICAgICAgICAgICIke2ludGVyZmFjZU1lbWJlci5uYW1lLm5hbWV9IiksCiAgICAgICAgICBkZWNsYXJlZE1lbWJlci5maWxlT2Zmc2V0LAogICAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgICBkZWNsYXJlZE1lbWJlci5maWxlVXJpLAogICAgICAgICAgY29udGV4dDogWwogICAgICAgICAgICAgICAgdGVtcGxhdGVPdmVycmlkZGVuTWV0aG9kQ2F1c2UKICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhpbnRlcmZhY2VNZW1iZXIubmFtZS5uYW1lKQogICAgICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oX2dldE1lbWJlclVyaShpbnRlcmZhY2VNZW1iZXIpLAogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIuZmlsZU9mZnNldCwgbm9MZW5ndGgpCiAgICAgICAgICAgICAgXSArCiAgICAgICAgICAgICAgaW5oZXJpdGVkQ29udGV4dChpc0ludGVyZmFjZUNoZWNrLCBkZWNsYXJlZE1lbWJlcikpOwogICAgfSBlbHNlIGlmICghbGlicmFyeS5sb2FkZXIudGFyZ2V0LmJhY2tlbmRUYXJnZXQubGVnYWN5TW9kZSAmJgogICAgICAgIGRlY2xhcmVkRnVuY3Rpb24/LnR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBzdWJzdGl0dXRpb25NYXAgPQogICAgICAgICAgPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlY2xhcmVkRnVuY3Rpb24udHlwZVBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgICBzdWJzdGl0dXRpb25NYXBbaW50ZXJmYWNlRnVuY3Rpb24udHlwZVBhcmFtZXRlcnNbaV1dID0KICAgICAgICAgICAgbmV3IFR5cGVQYXJhbWV0ZXJUeXBlKGRlY2xhcmVkRnVuY3Rpb24udHlwZVBhcmFtZXRlcnNbaV0pOwogICAgICB9CiAgICAgIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbU1hcChzdWJzdGl0dXRpb25NYXApOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlY2xhcmVkRnVuY3Rpb24udHlwZVBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgICBUeXBlUGFyYW1ldGVyIGRlY2xhcmVkUGFyYW1ldGVyID0gZGVjbGFyZWRGdW5jdGlvbi50eXBlUGFyYW1ldGVyc1tpXTsKICAgICAgICBUeXBlUGFyYW1ldGVyIGludGVyZmFjZVBhcmFtZXRlciA9IGludGVyZmFjZUZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzW2ldOwogICAgICAgIGlmICghaW50ZXJmYWNlUGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGwpIHsKICAgICAgICAgIERhcnRUeXBlIGRlY2xhcmVkQm91bmQgPSBkZWNsYXJlZFBhcmFtZXRlci5ib3VuZDsKICAgICAgICAgIERhcnRUeXBlIGludGVyZmFjZUJvdW5kID0gaW50ZXJmYWNlUGFyYW1ldGVyLmJvdW5kOwogICAgICAgICAgaWYgKGludGVyZmFjZVN1YnN0aXR1dGlvbiAhPSBudWxsKSB7CiAgICAgICAgICAgIGRlY2xhcmVkQm91bmQgPSBpbnRlcmZhY2VTdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoZGVjbGFyZWRCb3VuZCk7CiAgICAgICAgICAgIGludGVyZmFjZUJvdW5kID0KICAgICAgICAgICAgICAgIGludGVyZmFjZVN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShpbnRlcmZhY2VCb3VuZCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZGVjbGFyZWRCb3VuZCAhPSBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoaW50ZXJmYWNlQm91bmQpKSB7CiAgICAgICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgIHRlbXBsYXRlT3ZlcnJpZGVUeXBlVmFyaWFibGVzTWlzbWF0Y2gud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgICAiJHtkZWNsYXJlZE1lbWJlci5lbmNsb3NpbmdDbGFzcy5uYW1lfS4iCiAgICAgICAgICAgICAgICAgICAgIiR7ZGVjbGFyZWRNZW1iZXIubmFtZS5uYW1lfSIsCiAgICAgICAgICAgICAgICAgICAgIiR7aW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiIKICAgICAgICAgICAgICAgICAgICAiJHtpbnRlcmZhY2VNZW1iZXIubmFtZS5uYW1lfSIpLAogICAgICAgICAgICAgICAgZGVjbGFyZWRNZW1iZXIuZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgIG5vTGVuZ3RoLAogICAgICAgICAgICAgICAgZGVjbGFyZWRNZW1iZXIuZmlsZVVyaSwKICAgICAgICAgICAgICAgIGNvbnRleHQ6IFsKICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlT3ZlcnJpZGRlbk1ldGhvZENhdXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoaW50ZXJmYWNlTWVtYmVyLm5hbWUubmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKF9nZXRNZW1iZXJVcmkoaW50ZXJmYWNlTWVtYmVyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmZpbGVPZmZzZXQsIG5vTGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIF0gKwogICAgICAgICAgICAgICAgICAgIGluaGVyaXRlZENvbnRleHQoaXNJbnRlcmZhY2VDaGVjaywgZGVjbGFyZWRNZW1iZXIpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaW50ZXJmYWNlU3Vic3RpdHV0aW9uID0KICAgICAgICAgIFN1YnN0aXR1dGlvbi5jb21iaW5lKGludGVyZmFjZVN1YnN0aXR1dGlvbiwgc3Vic3RpdHV0aW9uKTsKICAgIH0KICAgIHJldHVybiBpbnRlcmZhY2VTdWJzdGl0dXRpb247CiAgfQoKICBTdWJzdGl0dXRpb24gX2NvbXB1dGVEZWNsYXJlZFN1YnN0aXR1dGlvbigKICAgICAgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5LCBNZW1iZXIgZGVjbGFyZWRNZW1iZXIpIHsKICAgIFN1YnN0aXR1dGlvbiBkZWNsYXJlZFN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5lbXB0eTsKICAgIGlmIChkZWNsYXJlZE1lbWJlci5lbmNsb3NpbmdDbGFzcy50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgIGRlY2xhcmVkU3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21TdXBlcnR5cGUoCiAgICAgICAgICBoaWVyYXJjaHkuZ2V0Q2xhc3NBc0luc3RhbmNlT2YoY2xzLCBkZWNsYXJlZE1lbWJlci5lbmNsb3NpbmdDbGFzcykpOwogICAgfQogICAgcmV0dXJuIGRlY2xhcmVkU3Vic3RpdHV0aW9uOwogIH0KCiAgYm9vbCBfY2hlY2tUeXBlcygKICAgICAgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwKICAgICAgU3Vic3RpdHV0aW9uIGludGVyZmFjZVN1YnN0aXR1dGlvbiwKICAgICAgU3Vic3RpdHV0aW9uIGRlY2xhcmVkU3Vic3RpdHV0aW9uLAogICAgICBNZW1iZXIgZGVjbGFyZWRNZW1iZXIsCiAgICAgIE1lbWJlciBpbnRlcmZhY2VNZW1iZXIsCiAgICAgIERhcnRUeXBlIGRlY2xhcmVkVHlwZSwKICAgICAgRGFydFR5cGUgaW50ZXJmYWNlVHlwZSwKICAgICAgYm9vbCBpc0NvdmFyaWFudCwKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsYXJlZFBhcmFtZXRlciwKICAgICAgYm9vbCBpc0ludGVyZmFjZUNoZWNrLAogICAgICB7Ym9vbCBhc0lmRGVjbGFyZWRQYXJhbWV0ZXIgPSBmYWxzZX0pIHsKICAgIGlmIChsaWJyYXJ5LmxvYWRlci50YXJnZXQuYmFja2VuZFRhcmdldC5sZWdhY3lNb2RlKSByZXR1cm4gZmFsc2U7CgogICAgaWYgKGludGVyZmFjZVN1YnN0aXR1dGlvbiAhPSBudWxsKSB7CiAgICAgIGludGVyZmFjZVR5cGUgPSBpbnRlcmZhY2VTdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoaW50ZXJmYWNlVHlwZSk7CiAgICB9CiAgICBpZiAoZGVjbGFyZWRTdWJzdGl0dXRpb24gIT0gbnVsbCkgewogICAgICBkZWNsYXJlZFR5cGUgPSBkZWNsYXJlZFN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShkZWNsYXJlZFR5cGUpOwogICAgfQoKICAgIGJvb2wgaW5QYXJhbWV0ZXIgPSBkZWNsYXJlZFBhcmFtZXRlciAhPSBudWxsIHx8IGFzSWZEZWNsYXJlZFBhcmFtZXRlcjsKICAgIERhcnRUeXBlIHN1YnR5cGUgPSBpblBhcmFtZXRlciA/IGludGVyZmFjZVR5cGUgOiBkZWNsYXJlZFR5cGU7CiAgICBEYXJ0VHlwZSBzdXBlcnR5cGUgPSBpblBhcmFtZXRlciA/IGRlY2xhcmVkVHlwZSA6IGludGVyZmFjZVR5cGU7CgogICAgaWYgKHR5cGVFbnZpcm9ubWVudC5pc1N1YnR5cGVPZihzdWJ0eXBlLCBzdXBlcnR5cGUpKSB7CiAgICAgIC8vIE5vIHByb2JsZW0tLXRoZSBwcm9wZXIgc3VidHlwaW5nIHJlbGF0aW9uIGlzIHNhdGlzZmllZC4KICAgIH0gZWxzZSBpZiAoaXNDb3ZhcmlhbnQgJiYgdHlwZUVudmlyb25tZW50LmlzU3VidHlwZU9mKHN1cGVydHlwZSwgc3VidHlwZSkpIHsKICAgICAgLy8gTm8gcHJvYmxlbS0tdGhlIG92ZXJyaWRpbmcgcGFyYW1ldGVyIGlzIG1hcmtlZCAiY292YXJpYW50IiBhbmQgaGFzCiAgICAgIC8vIGEgdHlwZSB3aGljaCBpcyBhIHN1YnR5cGUgb2YgdGhlIHBhcmFtZXRlciBpdCBvdmVycmlkZXMuCiAgICB9IGVsc2UgaWYgKHN1YnR5cGUgaXMgSW52YWxpZFR5cGUgfHwgc3VwZXJ0eXBlIGlzIEludmFsaWRUeXBlKSB7CiAgICAgIC8vIERvbid0IHJlcG9ydCBhIHByb2JsZW0gYXMgc29tZXRoaW5nIGVsc2UgaXMgd3JvbmcgdGhhdCBoYXMgYWxyZWFkeQogICAgICAvLyBiZWVuIHJlcG9ydGVkLgogICAgfSBlbHNlIHsKICAgICAgLy8gUmVwb3J0IGFuIGVycm9yLgogICAgICBTdHJpbmcgZGVjbGFyZWRNZW1iZXJOYW1lID0KICAgICAgICAgICcke2RlY2xhcmVkTWVtYmVyLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiR7ZGVjbGFyZWRNZW1iZXIubmFtZS5uYW1lfSc7CiAgICAgIFN0cmluZyBpbnRlcmZhY2VNZW1iZXJOYW1lID0KICAgICAgICAgICcke2ludGVyZmFjZU1lbWJlci5lbmNsb3NpbmdDbGFzcy5uYW1lfS4ke2ludGVyZmFjZU1lbWJlci5uYW1lLm5hbWV9JzsKICAgICAgTWVzc2FnZSBtZXNzYWdlOwogICAgICBpbnQgZmlsZU9mZnNldDsKICAgICAgaWYgKGRlY2xhcmVkUGFyYW1ldGVyID09IG51bGwpIHsKICAgICAgICBtZXNzYWdlID0gdGVtcGxhdGVPdmVycmlkZVR5cGVNaXNtYXRjaFJldHVyblR5cGUud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgZGVjbGFyZWRNZW1iZXJOYW1lLAogICAgICAgICAgICBkZWNsYXJlZFR5cGUsCiAgICAgICAgICAgIGludGVyZmFjZVR5cGUsCiAgICAgICAgICAgIGludGVyZmFjZU1lbWJlck5hbWUpOwogICAgICAgIGZpbGVPZmZzZXQgPSBkZWNsYXJlZE1lbWJlci5maWxlT2Zmc2V0OwogICAgICB9IGVsc2UgewogICAgICAgIG1lc3NhZ2UgPSB0ZW1wbGF0ZU92ZXJyaWRlVHlwZU1pc21hdGNoUGFyYW1ldGVyLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgIGRlY2xhcmVkUGFyYW1ldGVyLm5hbWUsCiAgICAgICAgICAgIGRlY2xhcmVkTWVtYmVyTmFtZSwKICAgICAgICAgICAgZGVjbGFyZWRUeXBlLAogICAgICAgICAgICBpbnRlcmZhY2VUeXBlLAogICAgICAgICAgICBpbnRlcmZhY2VNZW1iZXJOYW1lKTsKICAgICAgICBmaWxlT2Zmc2V0ID0gZGVjbGFyZWRQYXJhbWV0ZXIuZmlsZU9mZnNldDsKICAgICAgfQogICAgICBsaWJyYXJ5LmFkZFByb2JsZW0obWVzc2FnZSwgZmlsZU9mZnNldCwgbm9MZW5ndGgsIGRlY2xhcmVkTWVtYmVyLmZpbGVVcmksCiAgICAgICAgICBjb250ZXh0OiBbCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRkZW5NZXRob2RDYXVzZQogICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGludGVyZmFjZU1lbWJlci5uYW1lLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbihfZ2V0TWVtYmVyVXJpKGludGVyZmFjZU1lbWJlciksCiAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZU1lbWJlci5maWxlT2Zmc2V0LCBub0xlbmd0aCkKICAgICAgICAgICAgICBdICsKICAgICAgICAgICAgICBpbmhlcml0ZWRDb250ZXh0KGlzSW50ZXJmYWNlQ2hlY2ssIGRlY2xhcmVkTWVtYmVyKSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8vIFJldHVybnMgd2hldGhlciBhIGNvdmFyaWFudCBwYXJhbWV0ZXIgd2FzIHNlZW4gYW5kIG1vcmUgbWV0aG9kcyB0aHVzIGhhdmUKICAvLy8gdG8gYmUgY2hlY2tlZC4KICBib29sIGNoZWNrTWV0aG9kT3ZlcnJpZGUoCiAgICAgIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSwKICAgICAgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwKICAgICAgUHJvY2VkdXJlIGRlY2xhcmVkTWVtYmVyLAogICAgICBQcm9jZWR1cmUgaW50ZXJmYWNlTWVtYmVyLAogICAgICBib29sIGlzSW50ZXJmYWNlQ2hlY2spIHsKICAgIGFzc2VydChkZWNsYXJlZE1lbWJlci5raW5kID09IFByb2NlZHVyZUtpbmQuTWV0aG9kKTsKICAgIGFzc2VydChpbnRlcmZhY2VNZW1iZXIua2luZCA9PSBQcm9jZWR1cmVLaW5kLk1ldGhvZCk7CiAgICBib29sIHNlZW5Db3ZhcmlhbnQgPSBmYWxzZTsKICAgIEZ1bmN0aW9uTm9kZSBkZWNsYXJlZEZ1bmN0aW9uID0gZGVjbGFyZWRNZW1iZXIuZnVuY3Rpb247CiAgICBGdW5jdGlvbk5vZGUgaW50ZXJmYWNlRnVuY3Rpb24gPSBpbnRlcmZhY2VNZW1iZXIuZnVuY3Rpb247CgogICAgU3Vic3RpdHV0aW9uIGludGVyZmFjZVN1YnN0aXR1dGlvbiA9IF9jb21wdXRlSW50ZXJmYWNlU3Vic3RpdHV0aW9uKAogICAgICAgIGhpZXJhcmNoeSwKICAgICAgICBkZWNsYXJlZE1lbWJlciwKICAgICAgICBpbnRlcmZhY2VNZW1iZXIsCiAgICAgICAgZGVjbGFyZWRGdW5jdGlvbiwKICAgICAgICBpbnRlcmZhY2VGdW5jdGlvbiwKICAgICAgICBpc0ludGVyZmFjZUNoZWNrKTsKCiAgICBTdWJzdGl0dXRpb24gZGVjbGFyZWRTdWJzdGl0dXRpb24gPQogICAgICAgIF9jb21wdXRlRGVjbGFyZWRTdWJzdGl0dXRpb24oaGllcmFyY2h5LCBkZWNsYXJlZE1lbWJlcik7CgogICAgX2NoZWNrVHlwZXMoCiAgICAgICAgdHlwZUVudmlyb25tZW50LAogICAgICAgIGludGVyZmFjZVN1YnN0aXR1dGlvbiwKICAgICAgICBkZWNsYXJlZFN1YnN0aXR1dGlvbiwKICAgICAgICBkZWNsYXJlZE1lbWJlciwKICAgICAgICBpbnRlcmZhY2VNZW1iZXIsCiAgICAgICAgZGVjbGFyZWRGdW5jdGlvbi5yZXR1cm5UeXBlLAogICAgICAgIGludGVyZmFjZUZ1bmN0aW9uLnJldHVyblR5cGUsCiAgICAgICAgZmFsc2UsCiAgICAgICAgbnVsbCwKICAgICAgICBpc0ludGVyZmFjZUNoZWNrKTsKICAgIGlmIChkZWNsYXJlZEZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCA8CiAgICAgICAgaW50ZXJmYWNlRnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlT3ZlcnJpZGVGZXdlclBvc2l0aW9uYWxBcmd1bWVudHMud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAiJHtkZWNsYXJlZE1lbWJlci5lbmNsb3NpbmdDbGFzcy5uYW1lfS4iCiAgICAgICAgICAgICAgIiR7ZGVjbGFyZWRNZW1iZXIubmFtZS5uYW1lfSIsCiAgICAgICAgICAgICAgIiR7aW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiIKICAgICAgICAgICAgICAiJHtpbnRlcmZhY2VNZW1iZXIubmFtZS5uYW1lfSIpLAogICAgICAgICAgZGVjbGFyZWRNZW1iZXIuZmlsZU9mZnNldCwKICAgICAgICAgIG5vTGVuZ3RoLAogICAgICAgICAgZGVjbGFyZWRNZW1iZXIuZmlsZVVyaSwKICAgICAgICAgIGNvbnRleHQ6IFsKICAgICAgICAgICAgICAgIHRlbXBsYXRlT3ZlcnJpZGRlbk1ldGhvZENhdXNlCiAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoaW50ZXJmYWNlTWVtYmVyLm5hbWUubmFtZSkKICAgICAgICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKGludGVyZmFjZU1lbWJlci5maWxlVXJpLAogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIuZmlsZU9mZnNldCwgbm9MZW5ndGgpCiAgICAgICAgICAgICAgXSArCiAgICAgICAgICAgICAgaW5oZXJpdGVkQ29udGV4dChpc0ludGVyZmFjZUNoZWNrLCBkZWNsYXJlZE1lbWJlcikpOwogICAgfQogICAgaWYgKGludGVyZmFjZUZ1bmN0aW9uLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPAogICAgICAgIGRlY2xhcmVkRnVuY3Rpb24ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCkgewogICAgICBsaWJyYXJ5LmFkZFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRlTW9yZVJlcXVpcmVkQXJndW1lbnRzLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgIiR7ZGVjbGFyZWRNZW1iZXIuZW5jbG9zaW5nQ2xhc3MubmFtZX0uIgogICAgICAgICAgICAgICIke2RlY2xhcmVkTWVtYmVyLm5hbWUubmFtZX0iLAogICAgICAgICAgICAgICIke2ludGVyZmFjZU1lbWJlci5lbmNsb3NpbmdDbGFzcy5uYW1lfS4iCiAgICAgICAgICAgICAgIiR7aW50ZXJmYWNlTWVtYmVyLm5hbWUubmFtZX0iKSwKICAgICAgICAgIGRlY2xhcmVkTWVtYmVyLmZpbGVPZmZzZXQsCiAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgIGRlY2xhcmVkTWVtYmVyLmZpbGVVcmksCiAgICAgICAgICBjb250ZXh0OiBbCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRkZW5NZXRob2RDYXVzZQogICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGludGVyZmFjZU1lbWJlci5uYW1lLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbihpbnRlcmZhY2VNZW1iZXIuZmlsZVVyaSwKICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmZpbGVPZmZzZXQsIG5vTGVuZ3RoKQogICAgICAgICAgICAgIF0gKwogICAgICAgICAgICAgIGluaGVyaXRlZENvbnRleHQoaXNJbnRlcmZhY2VDaGVjaywgZGVjbGFyZWRNZW1iZXIpKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOwogICAgICAgIGkgPCBkZWNsYXJlZEZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCAmJgogICAgICAgICAgICBpIDwgaW50ZXJmYWNlRnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoOwogICAgICAgIGkrKykgewogICAgICB2YXIgZGVjbGFyZWRQYXJhbWV0ZXIgPSBkZWNsYXJlZEZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldOwogICAgICB2YXIgaW50ZXJmYWNlUGFyYW1ldGVyID0gaW50ZXJmYWNlRnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnNbaV07CiAgICAgIF9jaGVja1R5cGVzKAogICAgICAgICAgdHlwZUVudmlyb25tZW50LAogICAgICAgICAgaW50ZXJmYWNlU3Vic3RpdHV0aW9uLAogICAgICAgICAgZGVjbGFyZWRTdWJzdGl0dXRpb24sCiAgICAgICAgICBkZWNsYXJlZE1lbWJlciwKICAgICAgICAgIGludGVyZmFjZU1lbWJlciwKICAgICAgICAgIGRlY2xhcmVkUGFyYW1ldGVyLnR5cGUsCiAgICAgICAgICBpbnRlcmZhY2VGdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXS50eXBlLAogICAgICAgICAgZGVjbGFyZWRQYXJhbWV0ZXIuaXNDb3ZhcmlhbnQgfHwgaW50ZXJmYWNlUGFyYW1ldGVyLmlzQ292YXJpYW50LAogICAgICAgICAgZGVjbGFyZWRQYXJhbWV0ZXIsCiAgICAgICAgICBpc0ludGVyZmFjZUNoZWNrKTsKICAgICAgaWYgKGRlY2xhcmVkUGFyYW1ldGVyLmlzQ292YXJpYW50KSBzZWVuQ292YXJpYW50ID0gdHJ1ZTsKICAgIH0KICAgIGlmIChkZWNsYXJlZEZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycy5pc0VtcHR5ICYmCiAgICAgICAgaW50ZXJmYWNlRnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLmlzRW1wdHkpIHsKICAgICAgcmV0dXJuIHNlZW5Db3ZhcmlhbnQ7CiAgICB9CiAgICBpZiAoZGVjbGFyZWRGdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoIDwKICAgICAgICBpbnRlcmZhY2VGdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlT3ZlcnJpZGVGZXdlck5hbWVkQXJndW1lbnRzLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgIiR7ZGVjbGFyZWRNZW1iZXIuZW5jbG9zaW5nQ2xhc3MubmFtZX0uIgogICAgICAgICAgICAgICIke2RlY2xhcmVkTWVtYmVyLm5hbWUubmFtZX0iLAogICAgICAgICAgICAgICIke2ludGVyZmFjZU1lbWJlci5lbmNsb3NpbmdDbGFzcy5uYW1lfS4iCiAgICAgICAgICAgICAgIiR7aW50ZXJmYWNlTWVtYmVyLm5hbWUubmFtZX0iKSwKICAgICAgICAgIGRlY2xhcmVkTWVtYmVyLmZpbGVPZmZzZXQsCiAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgIGRlY2xhcmVkTWVtYmVyLmZpbGVVcmksCiAgICAgICAgICBjb250ZXh0OiBbCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRkZW5NZXRob2RDYXVzZQogICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGludGVyZmFjZU1lbWJlci5uYW1lLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbihpbnRlcmZhY2VNZW1iZXIuZmlsZVVyaSwKICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmZpbGVPZmZzZXQsIG5vTGVuZ3RoKQogICAgICAgICAgICAgIF0gKwogICAgICAgICAgICAgIGluaGVyaXRlZENvbnRleHQoaXNJbnRlcmZhY2VDaGVjaywgZGVjbGFyZWRNZW1iZXIpKTsKICAgIH0KICAgIGludCBjb21wYXJlTmFtZWRQYXJhbWV0ZXJzKFZhcmlhYmxlRGVjbGFyYXRpb24gcDAsIFZhcmlhYmxlRGVjbGFyYXRpb24gcDEpIHsKICAgICAgcmV0dXJuIHAwLm5hbWUuY29tcGFyZVRvKHAxLm5hbWUpOwogICAgfQoKICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gc29ydGVkRnJvbURlY2xhcmVkID0KICAgICAgICBuZXcgTGlzdC5mcm9tKGRlY2xhcmVkRnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzKQogICAgICAgICAgLi5zb3J0KGNvbXBhcmVOYW1lZFBhcmFtZXRlcnMpOwogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBzb3J0ZWRGcm9tSW50ZXJmYWNlID0KICAgICAgICBuZXcgTGlzdC5mcm9tKGludGVyZmFjZUZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycykKICAgICAgICAgIC4uc29ydChjb21wYXJlTmFtZWRQYXJhbWV0ZXJzKTsKICAgIEl0ZXJhdG9yPFZhcmlhYmxlRGVjbGFyYXRpb24+IGRlY2xhcmVkTmFtZWRQYXJhbWV0ZXJzID0KICAgICAgICBzb3J0ZWRGcm9tRGVjbGFyZWQuaXRlcmF0b3I7CiAgICBJdGVyYXRvcjxWYXJpYWJsZURlY2xhcmF0aW9uPiBpbnRlcmZhY2VOYW1lZFBhcmFtZXRlcnMgPQogICAgICAgIHNvcnRlZEZyb21JbnRlcmZhY2UuaXRlcmF0b3I7CiAgICBvdXRlcjoKICAgIHdoaWxlIChkZWNsYXJlZE5hbWVkUGFyYW1ldGVycy5tb3ZlTmV4dCgpICYmCiAgICAgICAgaW50ZXJmYWNlTmFtZWRQYXJhbWV0ZXJzLm1vdmVOZXh0KCkpIHsKICAgICAgd2hpbGUgKGRlY2xhcmVkTmFtZWRQYXJhbWV0ZXJzLmN1cnJlbnQubmFtZSAhPQogICAgICAgICAgaW50ZXJmYWNlTmFtZWRQYXJhbWV0ZXJzLmN1cnJlbnQubmFtZSkgewogICAgICAgIGlmICghZGVjbGFyZWROYW1lZFBhcmFtZXRlcnMubW92ZU5leHQoKSkgewogICAgICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgICAgIHRlbXBsYXRlT3ZlcnJpZGVNaXNtYXRjaE5hbWVkUGFyYW1ldGVyLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgICIke2RlY2xhcmVkTWVtYmVyLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiIKICAgICAgICAgICAgICAgICAgIiR7ZGVjbGFyZWRNZW1iZXIubmFtZS5uYW1lfSIsCiAgICAgICAgICAgICAgICAgIGludGVyZmFjZU5hbWVkUGFyYW1ldGVycy5jdXJyZW50Lm5hbWUsCiAgICAgICAgICAgICAgICAgICIke2ludGVyZmFjZU1lbWJlci5lbmNsb3NpbmdDbGFzcy5uYW1lfS4iCiAgICAgICAgICAgICAgICAgICIke2ludGVyZmFjZU1lbWJlci5uYW1lLm5hbWV9IiksCiAgICAgICAgICAgICAgZGVjbGFyZWRNZW1iZXIuZmlsZU9mZnNldCwKICAgICAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgICAgICBkZWNsYXJlZE1lbWJlci5maWxlVXJpLAogICAgICAgICAgICAgIGNvbnRleHQ6IFsKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRkZW5NZXRob2RDYXVzZQogICAgICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhpbnRlcmZhY2VNZW1iZXIubmFtZS5uYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKGludGVyZmFjZU1lbWJlci5maWxlVXJpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmZpbGVPZmZzZXQsIG5vTGVuZ3RoKQogICAgICAgICAgICAgICAgICBdICsKICAgICAgICAgICAgICAgICAgaW5oZXJpdGVkQ29udGV4dChpc0ludGVyZmFjZUNoZWNrLCBkZWNsYXJlZE1lbWJlcikpOwogICAgICAgICAgYnJlYWsgb3V0ZXI7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciBkZWNsYXJlZFBhcmFtZXRlciA9IGRlY2xhcmVkTmFtZWRQYXJhbWV0ZXJzLmN1cnJlbnQ7CiAgICAgIF9jaGVja1R5cGVzKAogICAgICAgICAgdHlwZUVudmlyb25tZW50LAogICAgICAgICAgaW50ZXJmYWNlU3Vic3RpdHV0aW9uLAogICAgICAgICAgZGVjbGFyZWRTdWJzdGl0dXRpb24sCiAgICAgICAgICBkZWNsYXJlZE1lbWJlciwKICAgICAgICAgIGludGVyZmFjZU1lbWJlciwKICAgICAgICAgIGRlY2xhcmVkUGFyYW1ldGVyLnR5cGUsCiAgICAgICAgICBpbnRlcmZhY2VOYW1lZFBhcmFtZXRlcnMuY3VycmVudC50eXBlLAogICAgICAgICAgZGVjbGFyZWRQYXJhbWV0ZXIuaXNDb3ZhcmlhbnQsCiAgICAgICAgICBkZWNsYXJlZFBhcmFtZXRlciwKICAgICAgICAgIGlzSW50ZXJmYWNlQ2hlY2spOwogICAgICBpZiAoZGVjbGFyZWRQYXJhbWV0ZXIuaXNDb3ZhcmlhbnQpIHNlZW5Db3ZhcmlhbnQgPSB0cnVlOwogICAgfQogICAgcmV0dXJuIHNlZW5Db3ZhcmlhbnQ7CiAgfQoKICB2b2lkIGNoZWNrR2V0dGVyT3ZlcnJpZGUoCiAgICAgIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSwKICAgICAgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwKICAgICAgTWVtYmVyIGRlY2xhcmVkTWVtYmVyLAogICAgICBNZW1iZXIgaW50ZXJmYWNlTWVtYmVyLAogICAgICBib29sIGlzSW50ZXJmYWNlQ2hlY2spIHsKICAgIFN1YnN0aXR1dGlvbiBpbnRlcmZhY2VTdWJzdGl0dXRpb24gPSBfY29tcHV0ZUludGVyZmFjZVN1YnN0aXR1dGlvbigKICAgICAgICBoaWVyYXJjaHksCiAgICAgICAgZGVjbGFyZWRNZW1iZXIsCiAgICAgICAgaW50ZXJmYWNlTWVtYmVyLAogICAgICAgIG51bGwsCiAgICAgICAgbnVsbCwKICAgICAgICBpc0ludGVyZmFjZUNoZWNrKTsKICAgIFN1YnN0aXR1dGlvbiBkZWNsYXJlZFN1YnN0aXR1dGlvbiA9CiAgICAgICAgX2NvbXB1dGVEZWNsYXJlZFN1YnN0aXR1dGlvbihoaWVyYXJjaHksIGRlY2xhcmVkTWVtYmVyKTsKICAgIHZhciBkZWNsYXJlZFR5cGUgPSBkZWNsYXJlZE1lbWJlci5nZXR0ZXJUeXBlOwogICAgdmFyIGludGVyZmFjZVR5cGUgPSBpbnRlcmZhY2VNZW1iZXIuZ2V0dGVyVHlwZTsKICAgIF9jaGVja1R5cGVzKAogICAgICAgIHR5cGVFbnZpcm9ubWVudCwKICAgICAgICBpbnRlcmZhY2VTdWJzdGl0dXRpb24sCiAgICAgICAgZGVjbGFyZWRTdWJzdGl0dXRpb24sCiAgICAgICAgZGVjbGFyZWRNZW1iZXIsCiAgICAgICAgaW50ZXJmYWNlTWVtYmVyLAogICAgICAgIGRlY2xhcmVkVHlwZSwKICAgICAgICBpbnRlcmZhY2VUeXBlLAogICAgICAgIGZhbHNlLAogICAgICAgIG51bGwsCiAgICAgICAgaXNJbnRlcmZhY2VDaGVjayk7CiAgfQoKICAvLy8gUmV0dXJucyB3aGV0aGVyIGEgY292YXJpYW50IHBhcmFtZXRlciB3YXMgc2VlbiBhbmQgbW9yZSBtZXRob2RzIHRodXMgaGF2ZQogIC8vLyB0byBiZSBjaGVja2VkLgogIGJvb2wgY2hlY2tTZXR0ZXJPdmVycmlkZSgKICAgICAgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5LAogICAgICBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LAogICAgICBNZW1iZXIgZGVjbGFyZWRNZW1iZXIsCiAgICAgIE1lbWJlciBpbnRlcmZhY2VNZW1iZXIsCiAgICAgIGJvb2wgaXNJbnRlcmZhY2VDaGVjaykgewogICAgU3Vic3RpdHV0aW9uIGludGVyZmFjZVN1YnN0aXR1dGlvbiA9IF9jb21wdXRlSW50ZXJmYWNlU3Vic3RpdHV0aW9uKAogICAgICAgIGhpZXJhcmNoeSwKICAgICAgICBkZWNsYXJlZE1lbWJlciwKICAgICAgICBpbnRlcmZhY2VNZW1iZXIsCiAgICAgICAgbnVsbCwKICAgICAgICBudWxsLAogICAgICAgIGlzSW50ZXJmYWNlQ2hlY2spOwogICAgU3Vic3RpdHV0aW9uIGRlY2xhcmVkU3Vic3RpdHV0aW9uID0KICAgICAgICBfY29tcHV0ZURlY2xhcmVkU3Vic3RpdHV0aW9uKGhpZXJhcmNoeSwgZGVjbGFyZWRNZW1iZXIpOwogICAgdmFyIGRlY2xhcmVkVHlwZSA9IGRlY2xhcmVkTWVtYmVyLnNldHRlclR5cGU7CiAgICB2YXIgaW50ZXJmYWNlVHlwZSA9IGludGVyZmFjZU1lbWJlci5zZXR0ZXJUeXBlOwogICAgdmFyIGRlY2xhcmVkUGFyYW1ldGVyID0KICAgICAgICBkZWNsYXJlZE1lbWJlci5mdW5jdGlvbj8ucG9zaXRpb25hbFBhcmFtZXRlcnM/LmVsZW1lbnRBdCgwKTsKICAgIGJvb2wgaXNDb3ZhcmlhbnQgPSBkZWNsYXJlZFBhcmFtZXRlcj8uaXNDb3ZhcmlhbnQgPz8gZmFsc2U7CiAgICBpZiAoZGVjbGFyZWRNZW1iZXIgaXMgRmllbGQpIGlzQ292YXJpYW50ID0gZGVjbGFyZWRNZW1iZXIuaXNDb3ZhcmlhbnQ7CiAgICBfY2hlY2tUeXBlcygKICAgICAgICB0eXBlRW52aXJvbm1lbnQsCiAgICAgICAgaW50ZXJmYWNlU3Vic3RpdHV0aW9uLAogICAgICAgIGRlY2xhcmVkU3Vic3RpdHV0aW9uLAogICAgICAgIGRlY2xhcmVkTWVtYmVyLAogICAgICAgIGludGVyZmFjZU1lbWJlciwKICAgICAgICBkZWNsYXJlZFR5cGUsCiAgICAgICAgaW50ZXJmYWNlVHlwZSwKICAgICAgICBpc0NvdmFyaWFudCwKICAgICAgICBkZWNsYXJlZFBhcmFtZXRlciwKICAgICAgICBpc0ludGVyZmFjZUNoZWNrLAogICAgICAgIGFzSWZEZWNsYXJlZFBhcmFtZXRlcjogdHJ1ZSk7CiAgICByZXR1cm4gaXNDb3ZhcmlhbnQ7CiAgfQoKICAvLyBFeHRyYSBjb250ZXh0IG9uIG92ZXJyaWRlIG1lc3NhZ2VzIHdoZW4gdGhlIG92ZXJyaWRpbmcgbWVtYmVyIGlzIGluaGVyaXRlZAogIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGluaGVyaXRlZENvbnRleHQoCiAgICAgIGJvb2wgaXNJbnRlcmZhY2VDaGVjaywgTWVtYmVyIGRlY2xhcmVkTWVtYmVyKSB7CiAgICBpZiAoZGVjbGFyZWRNZW1iZXIuZW5jbG9zaW5nQ2xhc3MgPT0gY2xzKSB7CiAgICAgIC8vIE9yZGluYXJ5IG92ZXJyaWRlCiAgICAgIHJldHVybiBjb25zdCBbXTsKICAgIH0KICAgIGlmIChpc0ludGVyZmFjZUNoZWNrKSB7CiAgICAgIC8vIEludGVyZmFjZSBjaGVjawogICAgICByZXR1cm4gWwogICAgICAgIHRlbXBsYXRlSW50ZXJmYWNlQ2hlY2tDb250ZXh0CiAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGNscy5uYW1lKQogICAgICAgICAgICAud2l0aExvY2F0aW9uKGNscy5maWxlVXJpLCBjbHMuZmlsZU9mZnNldCwgY2xzLm5hbWUubGVuZ3RoKQogICAgICBdOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGNscy5pc0Fub255bW91c01peGluKSB7CiAgICAgICAgLy8gSW1wbGljaXQgbWl4aW4gYXBwbGljYXRpb24gY2xhc3MKICAgICAgICBTdHJpbmcgYmFzZU5hbWUgPSBjbHMuc3VwZXJjbGFzcy5kZW1hbmdsZWROYW1lOwogICAgICAgIFN0cmluZyBtaXhpbk5hbWUgPSBjbHMubWl4ZWRJbkNsYXNzLm5hbWU7CiAgICAgICAgaW50IGNsYXNzTmFtZUxlbmd0aCA9IGNscy5uYW1lQXNNaXhpbkFwcGxpY2F0aW9uU3ViY2xhc3MubGVuZ3RoOwogICAgICAgIHJldHVybiBbCiAgICAgICAgICB0ZW1wbGF0ZUltcGxpY2l0TWl4aW5PdmVycmlkZUNvbnRleHQKICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhtaXhpbk5hbWUsIGJhc2VOYW1lKQogICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oY2xzLmZpbGVVcmksIGNscy5maWxlT2Zmc2V0LCBjbGFzc05hbWVMZW5ndGgpCiAgICAgICAgXTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBOYW1lZCBtaXhpbiBhcHBsaWNhdGlvbiBjbGFzcwogICAgICAgIHJldHVybiBbCiAgICAgICAgICB0ZW1wbGF0ZU5hbWVkTWl4aW5PdmVycmlkZUNvbnRleHQKICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhjbHMubmFtZSkKICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKGNscy5maWxlVXJpLCBjbHMuZmlsZU9mZnNldCwgY2xzLm5hbWUubGVuZ3RoKQogICAgICAgIF07CiAgICAgIH0KICAgIH0KICB9CgogIFN0cmluZyBnZXQgZnVsbE5hbWVGb3JFcnJvcnMgewogICAgcmV0dXJuIGlzTWl4aW5BcHBsaWNhdGlvbiAmJiAhaXNOYW1lZE1peGluQXBwbGljYXRpb24KICAgICAgICA/ICIke3N1cGVydHlwZS5mdWxsTmFtZUZvckVycm9yc30gd2l0aCAke21peGVkSW5UeXBlLmZ1bGxOYW1lRm9yRXJyb3JzfSIKICAgICAgICA6IG5hbWU7CiAgfQoKICB2b2lkIGNoZWNrTWl4aW5EZWNsYXJhdGlvbigpIHsKICAgIGFzc2VydChjbHMuaXNNaXhpbkRlY2xhcmF0aW9uKTsKICAgIGZvciAoRGVjbGFyYXRpb24gY29uc3RydWN0b3J5IGluIGNvbnN0cnVjdG9ycy5sb2NhbC52YWx1ZXMpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3RvcnkuaXNTeW50aGV0aWMgJiYKICAgICAgICAgIChjb25zdHJ1Y3RvcnkuaXNGYWN0b3J5IHx8IGNvbnN0cnVjdG9yeS5pc0NvbnN0cnVjdG9yKSkgewogICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnMKICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGZ1bGxOYW1lRm9yRXJyb3JzKSwKICAgICAgICAgICAgY2hhck9mZnNldCwKICAgICAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgICAgIGNvbnRleHQ6IFsKICAgICAgICAgICAgICB0ZW1wbGF0ZUlsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzQ2F1c2UKICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoZnVsbE5hbWVGb3JFcnJvcnMpCiAgICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcnkuZmlsZVVyaSwgY29uc3RydWN0b3J5LmNoYXJPZmZzZXQsIG5vTGVuZ3RoKQogICAgICAgICAgICBdKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBjaGVja01peGluQXBwbGljYXRpb24oQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5KSB7CiAgICAvLyBBIG1peGluIGRlY2xhcmF0aW9uIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYWxsCiAgICAvLyB0aGUgZGVjbGFyYXRpb24ncyBzdXBlcmNsYXNzIGNvbnN0cmFpbnRzLgogICAgSW50ZXJmYWNlVHlwZSBzdXBlcnR5cGUgPSBjbHMuc3VwZXJ0eXBlLmFzSW50ZXJmYWNlVHlwZTsKICAgIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbVN1cGVydHlwZShjbHMubWl4ZWRJblR5cGUpOwogICAgZm9yIChTdXBlcnR5cGUgY29uc3RyYWludCBpbiBjbHMubWl4ZWRJbkNsYXNzLnN1cGVyY2xhc3NDb25zdHJhaW50cygpKSB7CiAgICAgIEludGVyZmFjZVR5cGUgaW50ZXJmYWNlID0KICAgICAgICAgIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlU3VwZXJ0eXBlKGNvbnN0cmFpbnQpLmFzSW50ZXJmYWNlVHlwZTsKICAgICAgaWYgKGhpZXJhcmNoeS5nZXRUeXBlQXNJbnN0YW5jZU9mKHN1cGVydHlwZSwgaW50ZXJmYWNlLmNsYXNzTm9kZSkgIT0KICAgICAgICAgIGludGVyZmFjZSkgewogICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgICAgdGVtcGxhdGVNaXhpbkFwcGxpY2F0aW9uSW5jb21wYXRpYmxlU3VwZXJ0eXBlLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICBzdXBlcnR5cGUsIGludGVyZmFjZSwgY2xzLm1peGVkSW5UeXBlLmFzSW50ZXJmYWNlVHlwZSksCiAgICAgICAgICAgIGNscy5maWxlT2Zmc2V0LAogICAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgICAgY2xzLmZpbGVVcmkpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFwcGx5UGF0Y2goRGVjbGFyYXRpb24gcGF0Y2gpIHsKICAgIGlmIChwYXRjaCBpcyBLZXJuZWxDbGFzc0J1aWxkZXIpIHsKICAgICAgcGF0Y2guYWN0dWFsT3JpZ2luID0gdGhpczsKICAgICAgLy8gVE9ETyhhaGUpOiBDb21wbGFpbiBpZiBgcGF0Y2guc3VwZXJ0eXBlYCBpc24ndCBudWxsLgogICAgICBzY29wZS5sb2NhbC5mb3JFYWNoKChTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gbWVtYmVyKSB7CiAgICAgICAgRGVjbGFyYXRpb24gbWVtYmVyUGF0Y2ggPSBwYXRjaC5zY29wZS5sb2NhbFtuYW1lXTsKICAgICAgICBpZiAobWVtYmVyUGF0Y2ggIT0gbnVsbCkgewogICAgICAgICAgbWVtYmVyLmFwcGx5UGF0Y2gobWVtYmVyUGF0Y2gpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHNjb3BlLnNldHRlcnMuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIG1lbWJlcikgewogICAgICAgIERlY2xhcmF0aW9uIG1lbWJlclBhdGNoID0gcGF0Y2guc2NvcGUuc2V0dGVyc1tuYW1lXTsKICAgICAgICBpZiAobWVtYmVyUGF0Y2ggIT0gbnVsbCkgewogICAgICAgICAgbWVtYmVyLmFwcGx5UGF0Y2gobWVtYmVyUGF0Y2gpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGNvbnN0cnVjdG9ycy5sb2NhbC5mb3JFYWNoKChTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gbWVtYmVyKSB7CiAgICAgICAgRGVjbGFyYXRpb24gbWVtYmVyUGF0Y2ggPSBwYXRjaC5jb25zdHJ1Y3RvcnMubG9jYWxbbmFtZV07CiAgICAgICAgaWYgKG1lbWJlclBhdGNoICE9IG51bGwpIHsKICAgICAgICAgIG1lbWJlci5hcHBseVBhdGNoKG1lbWJlclBhdGNoKTsKICAgICAgICB9CiAgICAgIH0pOwoKICAgICAgaW50IG9yaWdpbkxlbmd0aCA9IHR5cGVWYXJpYWJsZXM/Lmxlbmd0aCA/PyAwOwogICAgICBpbnQgcGF0Y2hMZW5ndGggPSBwYXRjaC50eXBlVmFyaWFibGVzPy5sZW5ndGggPz8gMDsKICAgICAgaWYgKG9yaWdpbkxlbmd0aCAhPSBwYXRjaExlbmd0aCkgewogICAgICAgIHBhdGNoLmFkZFByb2JsZW0obWVzc2FnZVBhdGNoQ2xhc3NUeXBlVmFyaWFibGVzTWlzbWF0Y2gsCiAgICAgICAgICAgIHBhdGNoLmNoYXJPZmZzZXQsIG5vTGVuZ3RoLCBjb250ZXh0OiBbCiAgICAgICAgICBtZXNzYWdlUGF0Y2hDbGFzc09yaWdpbi53aXRoTG9jYXRpb24oZmlsZVVyaSwgY2hhck9mZnNldCwgbm9MZW5ndGgpCiAgICAgICAgXSk7CiAgICAgIH0gZWxzZSBpZiAodHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgICAgaW50IGNvdW50ID0gMDsKICAgICAgICBmb3IgKEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXIgdCBpbiBwYXRjaC50eXBlVmFyaWFibGVzKSB7CiAgICAgICAgICB0eXBlVmFyaWFibGVzW2NvdW50KytdLmFwcGx5UGF0Y2godCk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBsaWJyYXJ5LmFkZFByb2JsZW0obWVzc2FnZVBhdGNoRGVjbGFyYXRpb25NaXNtYXRjaCwgcGF0Y2guY2hhck9mZnNldCwKICAgICAgICAgIG5vTGVuZ3RoLCBwYXRjaC5maWxlVXJpLCBjb250ZXh0OiBbCiAgICAgICAgbWVzc2FnZVBhdGNoRGVjbGFyYXRpb25PcmlnaW4ud2l0aExvY2F0aW9uKAogICAgICAgICAgICBmaWxlVXJpLCBjaGFyT2Zmc2V0LCBub0xlbmd0aCkKICAgICAgXSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBEZWNsYXJhdGlvbiBmaW5kU3RhdGljQnVpbGRlcigKICAgICAgU3RyaW5nIG5hbWUsIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSwgTGlicmFyeUJ1aWxkZXIgYWNjZXNzaW5nTGlicmFyeSwKICAgICAge2Jvb2wgaXNTZXR0ZXI6IGZhbHNlfSkgewogICAgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBzdXBlci5maW5kU3RhdGljQnVpbGRlcigKICAgICAgICBuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpLCBhY2Nlc3NpbmdMaWJyYXJ5LAogICAgICAgIGlzU2V0dGVyOiBpc1NldHRlcik7CiAgICBpZiAoZGVjbGFyYXRpb24gPT0gbnVsbCAmJiBpc1BhdGNoKSB7CiAgICAgIHJldHVybiBvcmlnaW4uZmluZFN0YXRpY0J1aWxkZXIoCiAgICAgICAgICBuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpLCBhY2Nlc3NpbmdMaWJyYXJ5LAogICAgICAgICAgaXNTZXR0ZXI6IGlzU2V0dGVyKTsKICAgIH0KICAgIHJldHVybiBkZWNsYXJhdGlvbjsKICB9CgogIEBvdmVycmlkZQogIERlY2xhcmF0aW9uIGZpbmRDb25zdHJ1Y3Rvck9yRmFjdG9yeSgKICAgICAgU3RyaW5nIG5hbWUsIGludCBjaGFyT2Zmc2V0LCBVcmkgdXJpLCBMaWJyYXJ5QnVpbGRlciBhY2Nlc3NpbmdMaWJyYXJ5KSB7CiAgICBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9CiAgICAgICAgc3VwZXIuZmluZENvbnN0cnVjdG9yT3JGYWN0b3J5KG5hbWUsIGNoYXJPZmZzZXQsIHVyaSwgYWNjZXNzaW5nTGlicmFyeSk7CiAgICBpZiAoZGVjbGFyYXRpb24gPT0gbnVsbCAmJiBpc1BhdGNoKSB7CiAgICAgIHJldHVybiBvcmlnaW4uZmluZENvbnN0cnVjdG9yT3JGYWN0b3J5KAogICAgICAgICAgbmFtZSwgY2hhck9mZnNldCwgdXJpLCBhY2Nlc3NpbmdMaWJyYXJ5KTsKICAgIH0KICAgIHJldHVybiBkZWNsYXJhdGlvbjsKICB9CgogIC8vIENvbXB1dGVzIHRoZSBmdW5jdGlvbiB0eXBlIG9mIGEgZ2l2ZW4gcmVkaXJlY3Rpb24gdGFyZ2V0LiBSZXR1cm5zIFtudWxsXSBpZgogIC8vIHRoZSB0eXBlIG9mIHRoZSB0YXJnZXQgY291bGQgbm90IGJlIGNvbXB1dGVkLgogIEZ1bmN0aW9uVHlwZSBjb21wdXRlUmVkaXJlY3RlZVR5cGUoS2VybmVsUmVkaXJlY3RpbmdGYWN0b3J5QnVpbGRlciBmYWN0b3J5LAogICAgICBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50KSB7CiAgICBDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXIgcmVkaXJlY3Rpb25UYXJnZXQgPSBmYWN0b3J5LnJlZGlyZWN0aW9uVGFyZ2V0OwogICAgRnVuY3Rpb25Ob2RlIHRhcmdldDsKICAgIGlmIChyZWRpcmVjdGlvblRhcmdldC50YXJnZXQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBpZiAocmVkaXJlY3Rpb25UYXJnZXQudGFyZ2V0IGlzIEtlcm5lbEZ1bmN0aW9uQnVpbGRlcikgewogICAgICBLZXJuZWxGdW5jdGlvbkJ1aWxkZXIgdGFyZ2V0QnVpbGRlciA9IHJlZGlyZWN0aW9uVGFyZ2V0LnRhcmdldDsKICAgICAgdGFyZ2V0ID0gdGFyZ2V0QnVpbGRlci5mdW5jdGlvbjsKICAgIH0gZWxzZSBpZiAocmVkaXJlY3Rpb25UYXJnZXQudGFyZ2V0IGlzIERpbGxNZW1iZXJCdWlsZGVyICYmCiAgICAgICAgKHJlZGlyZWN0aW9uVGFyZ2V0LnRhcmdldC5pc0NvbnN0cnVjdG9yIHx8CiAgICAgICAgICAgIHJlZGlyZWN0aW9uVGFyZ2V0LnRhcmdldC5pc0ZhY3RvcnkpKSB7CiAgICAgIERpbGxNZW1iZXJCdWlsZGVyIHRhcmdldEJ1aWxkZXIgPSByZWRpcmVjdGlvblRhcmdldC50YXJnZXQ7CiAgICAgIC8vIEl0IHNlZW1zIHRoYXQgdGhlIFtyZWRpcmVjdGlvblRhcmdldC50YXJnZXRdIGlzIGFuIGluc3RhbmNlIG9mCiAgICAgIC8vIFtEaWxsTWVtYmVyQnVpbGRlcl0gd2hlbmV2ZXIgdGhlIHJlZGlyZWN0ZWUgaXMgYW4gaW1wbGljaXQgY29uc3RydWN0b3IsCiAgICAgIC8vIGUuZy4KICAgICAgLy8KICAgICAgLy8gICBjbGFzcyBBIHsKICAgICAgLy8gICAgIGZhY3RvcnkgQSgpID0gQjsKICAgICAgLy8gICB9CiAgICAgIC8vICAgY2xhc3MgQiBpbXBsZW1lbnRzIEEge30KICAgICAgLy8KICAgICAgdGFyZ2V0ID0gdGFyZ2V0QnVpbGRlci5tZW1iZXIuZnVuY3Rpb247CiAgICB9IGVsc2UgaWYgKHJlZGlyZWN0aW9uVGFyZ2V0LnRhcmdldCBpcyBBbWJpZ3VvdXNCdWlsZGVyKSB7CiAgICAgIC8vIE11bHRpcGxlIGRlZmluaXRpb25zIHdpdGggdGhlIHNhbWUgbmFtZTogQW4gZXJyb3IgaGFzIGFscmVhZHkgYmVlbgogICAgICAvLyBpc3N1ZWQuCiAgICAgIC8vIFRPRE8oaHR0cDovL2RhcnRidWcuY29tLzM1Mjk0KTogVW5mb3J0dW5hdGUgZXJyb3I7IHNlZSBhbHNvCiAgICAgIC8vIGh0dHBzOi8vZGFydC1yZXZpZXcuZ29vZ2xlc291cmNlLmNvbS9jL3Nkay8rLzg1MzkwLy4KICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgewogICAgICB1bmhhbmRsZWQoIiR7cmVkaXJlY3Rpb25UYXJnZXQudGFyZ2V0fSIsICJjb21wdXRlUmVkaXJlY3RlZVR5cGUiLAogICAgICAgICAgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICB9CgogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9CiAgICAgICAgZ2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keShmYWN0b3J5LnRhcmdldCkudHlwZUFyZ3VtZW50czsKICAgIEZ1bmN0aW9uVHlwZSB0YXJnZXRGdW5jdGlvblR5cGUgPSB0YXJnZXQuZnVuY3Rpb25UeXBlOwogICAgaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCAmJgogICAgICAgIHRhcmdldEZ1bmN0aW9uVHlwZS50eXBlUGFyYW1ldGVycy5sZW5ndGggIT0gdHlwZUFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlVHlwZUFyZ3VtZW50TWlzbWF0Y2gKICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyh0YXJnZXRGdW5jdGlvblR5cGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoKSwKICAgICAgICAgIHJlZGlyZWN0aW9uVGFyZ2V0LmNoYXJPZmZzZXQsCiAgICAgICAgICBub0xlbmd0aCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8vIENvbXB1dGUgdGhlIHN1YnN0aXR1dGlvbiBvZiB0aGUgdGFyZ2V0IGNsYXNzIHR5cGUgcGFyYW1ldGVycyBpZgogICAgLy8gW3JlZGlyZWN0aW9uVGFyZ2V0XSBoYXMgYW55IHR5cGUgYXJndW1lbnRzLgogICAgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbjsKICAgIGJvb2wgaGFzUHJvYmxlbSA9IGZhbHNlOwogICAgaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCAmJiB0eXBlQXJndW1lbnRzLmxlbmd0aCA+IDApIHsKICAgICAgc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21QYWlycygKICAgICAgICAgIHRhcmdldEZ1bmN0aW9uVHlwZS50eXBlUGFyYW1ldGVycywgdHlwZUFyZ3VtZW50cyk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFyZ2V0RnVuY3Rpb25UeXBlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gdGFyZ2V0RnVuY3Rpb25UeXBlLnR5cGVQYXJhbWV0ZXJzW2ldOwogICAgICAgIERhcnRUeXBlIHR5cGVQYXJhbWV0ZXJCb3VuZCA9CiAgICAgICAgICAgIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZSh0eXBlUGFyYW1ldGVyLmJvdW5kKTsKICAgICAgICBEYXJ0VHlwZSB0eXBlQXJndW1lbnQgPSB0eXBlQXJndW1lbnRzW2ldOwogICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIFt0eXBlQXJndW1lbnRdIHJlc3BlY3RzIHRoZSBib3VuZHMgb2YgW3R5cGVQYXJhbWV0ZXJdLgogICAgICAgIGlmICghdHlwZUVudmlyb25tZW50LmlzU3VidHlwZU9mKHR5cGVBcmd1bWVudCwgdHlwZVBhcmFtZXRlckJvdW5kKSkgewogICAgICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgICAgICB0ZW1wbGF0ZVJlZGlyZWN0aW5nRmFjdG9yeUluY29tcGF0aWJsZVR5cGVBcmd1bWVudC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICB0eXBlQXJndW1lbnQsIHR5cGVQYXJhbWV0ZXJCb3VuZCksCiAgICAgICAgICAgICAgcmVkaXJlY3Rpb25UYXJnZXQuY2hhck9mZnNldCwKICAgICAgICAgICAgICBub0xlbmd0aCk7CiAgICAgICAgICBoYXNQcm9ibGVtID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodHlwZUFyZ3VtZW50cyA9PSBudWxsICYmCiAgICAgICAgdGFyZ2V0RnVuY3Rpb25UeXBlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKICAgICAgLy8gVE9ETyhoaWxsZXJzdHJvbSk6IEluIHRoaXMgY2FzZSwgd2UgbmVlZCB0byBwZXJmb3JtIHR5cGUgaW5mZXJlbmNlIG9uCiAgICAgIC8vIHRoZSByZWRpcmVjdGVlIHRvIG9idGFpbiBhY3R1YWwgdHlwZSBhcmd1bWVudHMgd2hpY2ggd291bGQgYWxsb3cgdGhlCiAgICAgIC8vIGZvbGxvd2luZyBwcm9ncmFtIHRvIHR5cGUgY2hlY2s6CiAgICAgIC8vCiAgICAgIC8vICAgIGNsYXNzIEE8VD4gewogICAgICAvLyAgICAgICBmYWN0b3J5IEEoKSA9IEI7CiAgICAgIC8vICAgIH0KICAgICAgLy8gICAgY2xhc3MgQjxUPiBpbXBsZW1lbnRzIEE8VD4gewogICAgICAvLyAgICAgICBCKCk7CiAgICAgIC8vICAgIH0KICAgICAgLy8KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLy8gU3Vic3RpdHV0ZSBpZiBuZWNlc3NhcnkuCiAgICB0YXJnZXRGdW5jdGlvblR5cGUgPSBzdWJzdGl0dXRpb24gPT0gbnVsbAogICAgICAgID8gdGFyZ2V0RnVuY3Rpb25UeXBlCiAgICAgICAgOiAoc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKHRhcmdldEZ1bmN0aW9uVHlwZS53aXRob3V0VHlwZVBhcmFtZXRlcnMpCiAgICAgICAgICAgIGFzIEZ1bmN0aW9uVHlwZSk7CgogICAgcmV0dXJuIGhhc1Byb2JsZW0gPyBudWxsIDogdGFyZ2V0RnVuY3Rpb25UeXBlOwogIH0KCiAgU3RyaW5nIGNvbXB1dGVSZWRpcmVjdGVlTmFtZShDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXIgcmVkaXJlY3Rpb25UYXJnZXQpIHsKICAgIFN0cmluZyB0YXJnZXROYW1lID0gcmVkaXJlY3Rpb25UYXJnZXQuZnVsbE5hbWVGb3JFcnJvcnM7CiAgICBpZiAodGFyZ2V0TmFtZSA9PSAiIikgewogICAgICByZXR1cm4gcmVkaXJlY3Rpb25UYXJnZXQudGFyZ2V0LnBhcmVudC5mdWxsTmFtZUZvckVycm9yczsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0YXJnZXROYW1lOwogICAgfQogIH0KCiAgdm9pZCBjaGVja1JlZGlyZWN0aW5nRmFjdG9yeShLZXJuZWxSZWRpcmVjdGluZ0ZhY3RvcnlCdWlsZGVyIGZhY3RvcnksCiAgICAgIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQpIHsKICAgIC8vIFRoZSBmYWN0b3J5IHR5cGUgY2Fubm90IGNvbnRhaW4gYW55IHR5cGUgcGFyYW1ldGVycyBvdGhlciB0aGFuIHRob3NlIG9mCiAgICAvLyBpdHMgZW5jbG9zaW5nIGNsYXNzLCBiZWNhdXNlIGNvbnN0cnVjdG9ycyBjYW5ub3Qgc3BlY2lmeSB0eXBlIHBhcmFtZXRlcnMKICAgIC8vIG9mIHRoZWlyIG93bi4KICAgIEZ1bmN0aW9uVHlwZSBmYWN0b3J5VHlwZSA9CiAgICAgICAgZmFjdG9yeS5wcm9jZWR1cmUuZnVuY3Rpb24uZnVuY3Rpb25UeXBlLndpdGhvdXRUeXBlUGFyYW1ldGVyczsKICAgIEZ1bmN0aW9uVHlwZSByZWRpcmVjdGVlVHlwZSA9CiAgICAgICAgY29tcHV0ZVJlZGlyZWN0ZWVUeXBlKGZhY3RvcnksIHR5cGVFbnZpcm9ubWVudCk7CgogICAgLy8gVE9ETyhoaWxsZXJzdHJvbSk6IEl0IHdvdWxkIGJlIHByZWZlcmFibGUgdG8ga25vdyB3aGV0aGVyIGEgZmFpbHVyZQogICAgLy8gaGFwcGVuZWQgZHVyaW5nIFtfY29tcHV0ZVJlZGlyZWN0ZWVUeXBlXS4KICAgIGlmIChyZWRpcmVjdGVlVHlwZSA9PSBudWxsKSByZXR1cm47CgogICAgLy8gQ2hlY2sgd2hldGhlciBbcmVkaXJlY3RlZVR5cGVdIDw6IFtmYWN0b3J5VHlwZV0uCiAgICBpZiAoIXR5cGVFbnZpcm9ubWVudC5pc1N1YnR5cGVPZihyZWRpcmVjdGVlVHlwZSwgZmFjdG9yeVR5cGUpKSB7CiAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZUluY29tcGF0aWJsZVJlZGlyZWN0ZWVGdW5jdGlvblR5cGUud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICByZWRpcmVjdGVlVHlwZSwgZmFjdG9yeVR5cGUpLAogICAgICAgICAgZmFjdG9yeS5yZWRpcmVjdGlvblRhcmdldC5jaGFyT2Zmc2V0LAogICAgICAgICAgbm9MZW5ndGgpOwogICAgfQogIH0KCiAgdm9pZCBjaGVja1JlZGlyZWN0aW5nRmFjdG9yaWVzKFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQpIHsKICAgIE1hcDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+IGNvbnN0cnVjdG9ycyA9IHRoaXMuY29uc3RydWN0b3JzLmxvY2FsOwogICAgSXRlcmFibGU8U3RyaW5nPiBuYW1lcyA9IGNvbnN0cnVjdG9ycy5rZXlzOwogICAgZm9yIChTdHJpbmcgbmFtZSBpbiBuYW1lcykgewogICAgICBEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yc1tuYW1lXTsKICAgICAgZG8gewogICAgICAgIGlmIChjb25zdHJ1Y3RvciBpcyBLZXJuZWxSZWRpcmVjdGluZ0ZhY3RvcnlCdWlsZGVyKSB7CiAgICAgICAgICBjaGVja1JlZGlyZWN0aW5nRmFjdG9yeShjb25zdHJ1Y3RvciwgdHlwZUVudmlyb25tZW50KTsKICAgICAgICB9CiAgICAgICAgY29uc3RydWN0b3IgPSBjb25zdHJ1Y3Rvci5uZXh0OwogICAgICB9IHdoaWxlIChjb25zdHJ1Y3RvciAhPSBudWxsKTsKICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIGEgbWFwIHdoaWNoIG1hcHMgdGhlIHR5cGUgdmFyaWFibGVzIG9mIFtzdXBlcmNsYXNzXSB0byB0aGVpcgogIC8vLyByZXNwZWN0aXZlIHZhbHVlcyBhcyBkZWZpbmVkIGJ5IHRoZSBzdXBlcmNsYXNzIGNsYXVzZSBvZiB0aGlzIGNsYXNzIChhbmQKICAvLy8gaXRzIHN1cGVyY2xhc3NlcykuCiAgLy8vCiAgLy8vIEl0J3MgYXNzdW1lZCB0aGF0IFtzdXBlcmNsYXNzXSBpcyBhIHN1cGVyY2xhc3Mgb2YgdGhpcyBjbGFzcy4KICAvLy8KICAvLy8gRm9yIGV4YW1wbGUsIGdpdmVuOgogIC8vLwogIC8vLyAgICAgY2xhc3MgQm94PFQ+IHt9CiAgLy8vICAgICBjbGFzcyBCZWF0Qm94IGV4dGVuZHMgQm94PEJlYXQ+IHt9CiAgLy8vICAgICBjbGFzcyBCZWF0IHt9CiAgLy8vCiAgLy8vIFdlIGhhdmU6CiAgLy8vCiAgLy8vICAgICBbW0JlYXRCb3hdXS5nZXRTdWJzdGl0dXRpb25NYXAoW1tCb3hdXSkgLT4ge1tbQm94OjpUXV06IEJlYXRdXX0uCiAgLy8vCiAgLy8vIEl0J3MgYW4gZXJyb3IgaWYgW3N1cGVyY2xhc3NdIGlzbid0IGEgc3VwZXJjbGFzcy4KICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IGdldFN1YnN0aXR1dGlvbk1hcChDbGFzcyBzdXBlcmNsYXNzKSB7CiAgICBTdXBlcnR5cGUgc3VwZXJ0eXBlID0gdGFyZ2V0LnN1cGVydHlwZTsKICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gc3Vic3RpdHV0aW9uTWFwID0gPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwogICAgTGlzdDxEYXJ0VHlwZT4gYXJndW1lbnRzOwogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB2YXJpYWJsZXM7CiAgICBDbGFzcyBjbGFzc05vZGU7CgogICAgd2hpbGUgKGNsYXNzTm9kZSAhPSBzdXBlcmNsYXNzKSB7CiAgICAgIGNsYXNzTm9kZSA9IHN1cGVydHlwZS5jbGFzc05vZGU7CiAgICAgIGFyZ3VtZW50cyA9IHN1cGVydHlwZS50eXBlQXJndW1lbnRzOwogICAgICB2YXJpYWJsZXMgPSBjbGFzc05vZGUudHlwZVBhcmFtZXRlcnM7CiAgICAgIHN1cGVydHlwZSA9IGNsYXNzTm9kZS5zdXBlcnR5cGU7CiAgICAgIGlmICh2YXJpYWJsZXMuaXNOb3RFbXB0eSkgewogICAgICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gZGlyZWN0U3Vic3RpdHV0aW9uTWFwID0KICAgICAgICAgICAgPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBEYXJ0VHlwZSBhcmd1bWVudCA9CiAgICAgICAgICAgICAgaSA8IGFyZ3VtZW50cy5sZW5ndGggPyBhcmd1bWVudHNbaV0gOiBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgICAgICAgaWYgKHN1YnN0aXR1dGlvbk1hcCAhPSBudWxsKSB7CiAgICAgICAgICAgIC8vIFRPRE8oYWhlKTogSW52ZXN0aWdhdGUgaWYgcmVxdWlyaW5nIHRoZSBjYWxsZXIgdG8gdXNlCiAgICAgICAgICAgIC8vIGBzdWJzdGl0dXRlRGVlcGAgZnJvbSBgcGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnRgIGluc3RlYWQKICAgICAgICAgICAgLy8gb2YgYHN1YnN0aXR1dGVgIGlzIGZhc3Rlci4gSWYgc28sIHdlIGNhbiBzaW1wbHkgdGhpcyBjb2RlLgogICAgICAgICAgICBhcmd1bWVudCA9IHN1YnN0aXR1dGUoYXJndW1lbnQsIHN1YnN0aXR1dGlvbk1hcCk7CiAgICAgICAgICB9CiAgICAgICAgICBkaXJlY3RTdWJzdGl0dXRp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a2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfY2xhc3NfYnVpbGRlci5kYXJ0RHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2VudW1fYnVpbGRlci5kYXJ0shIvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5rZXJuZWxfZW51bV9idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBBcmd1bWVudHMsCiAgICAgICAgQ2xhc3MsCiAgICAgICAgQ29uc3RydWN0b3IsCiAgICAgICAgQ29uc3RydWN0b3JJbnZvY2F0aW9uLAogICAgICAgIERpcmVjdFByb3BlcnR5R2V0LAogICAgICAgIEV4cHJlc3Npb24sCiAgICAgICAgRmllbGQsCiAgICAgICAgRmllbGRJbml0aWFsaXplciwKICAgICAgICBJbnRMaXRlcmFsLAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgTGlzdExpdGVyYWwsCiAgICAgICAgUHJvY2VkdXJlS2luZCwKICAgICAgICBSZXR1cm5TdGF0ZW1lbnQsCiAgICAgICAgU3RhdGljR2V0LAogICAgICAgIFN0cmluZ0xpdGVyYWwsCiAgICAgICAgU3VwZXJJbml0aWFsaXplciwKICAgICAgICBUaGlzRXhwcmVzc2lvbiwKICAgICAgICBWYXJpYWJsZUdldDsKCmltcG9ydCAna2VybmVsX3NoYWRvd19hc3QuZGFydCcgc2hvdyBTaGFkb3dDbGFzczsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cKICAgICAgICBMb2NhdGVkTWVzc2FnZSwKICAgICAgICBtZXNzYWdlTm9Vbm5hbWVkQ29uc3RydWN0b3JJbk9iamVjdCwKICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbiwKICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbkNhdXNlLAogICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uU3ludGhldGljQ2F1c2UsCiAgICAgICAgdGVtcGxhdGVFbnVtQ29uc3RhbnRTYW1lTmFtZUFzRW5jbG9zaW5nOwoKaW1wb3J0ICcuLi9tb2RpZmllci5kYXJ0JwogICAgc2hvdwogICAgICAgIGNvbnN0TWFzaywKICAgICAgICBmaW5hbE1hc2ssCiAgICAgICAgaGFzSW5pdGlhbGl6ZXJNYXNrLAogICAgICAgIGluaXRpYWxpemluZ0Zvcm1hbE1hc2ssCiAgICAgICAgc3RhdGljTWFzazsKCmltcG9ydCAnLi4vc291cmNlL3NvdXJjZV9jbGFzc19idWlsZGVyLmRhcnQnIHNob3cgU291cmNlQ2xhc3NCdWlsZGVyOwoKaW1wb3J0ICdrZXJuZWxfYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIERlY2xhcmF0aW9uLAogICAgICAgIEVudW1CdWlsZGVyLAogICAgICAgIEVudW1Db25zdGFudEluZm8sCiAgICAgICAgRm9ybWFsUGFyYW1ldGVyQnVpbGRlciwKICAgICAgICBLZXJuZWxDbGFzc0J1aWxkZXIsCiAgICAgICAgS2VybmVsQ29uc3RydWN0b3JCdWlsZGVyLAogICAgICAgIEtlcm5lbEZpZWxkQnVpbGRlciwKICAgICAgICBLZXJuZWxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyLAogICAgICAgIEtlcm5lbExpYnJhcnlCdWlsZGVyLAogICAgICAgIEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIsCiAgICAgICAgS2VybmVsUHJvY2VkdXJlQnVpbGRlciwKICAgICAgICBLZXJuZWxUeXBlQnVpbGRlciwKICAgICAgICBMaWJyYXJ5QnVpbGRlciwKICAgICAgICBNZW1iZXJCdWlsZGVyLAogICAgICAgIE1ldGFkYXRhQnVpbGRlciwKICAgICAgICBTY29wZTsKCmltcG9ydCAnbWV0YWRhdGFfY29sbGVjdG9yLmRhcnQnOwoKY2xhc3MgS2VybmVsRW51bUJ1aWxkZXIgZXh0ZW5kcyBTb3VyY2VDbGFzc0J1aWxkZXIKICAgIGltcGxlbWVudHMgRW51bUJ1aWxkZXI8S2VybmVsVHlwZUJ1aWxkZXIsIEludGVyZmFjZVR5cGU+IHsKICBAb3ZlcnJpZGUKICBmaW5hbCBMaXN0PEVudW1Db25zdGFudEluZm8+IGVudW1Db25zdGFudEluZm9zOwoKICBmaW5hbCBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyIGludFR5cGU7CgogIGZpbmFsIEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIgc3RyaW5nVHlwZTsKCiAgZmluYWwgS2VybmVsTmFtZWRUeXBlQnVpbGRlciBvYmplY3RUeXBlOwoKICBmaW5hbCBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyIGxpc3RUeXBlOwoKICBLZXJuZWxFbnVtQnVpbGRlci5pbnRlcm5hbCgKICAgICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhLAogICAgICBTdHJpbmcgbmFtZSwKICAgICAgU2NvcGUgc2NvcGUsCiAgICAgIFNjb3BlIGNvbnN0cnVjdG9ycywKICAgICAgU2hhZG93Q2xhc3MgY2xzLAogICAgICB0aGlzLmVudW1Db25zdGFudEluZm9zLAogICAgICB0aGlzLmludFR5cGUsCiAgICAgIHRoaXMubGlzdFR5cGUsCiAgICAgIHRoaXMub2JqZWN0VHlwZSwKICAgICAgdGhpcy5zdHJpbmdUeXBlLAogICAgICBMaWJyYXJ5QnVpbGRlciBwYXJlbnQsCiAgICAgIGludCBzdGFydENoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhckVuZE9mZnNldCkKICAgICAgOiBzdXBlcihtZXRhZGF0YSwgMCwgbmFtZSwgbnVsbCwgbnVsbCwgbnVsbCwgc2NvcGUsIGNvbnN0cnVjdG9ycywgcGFyZW50LAogICAgICAgICAgICBudWxsLCBzdGFydENoYXJPZmZzZXQsIGNoYXJPZmZzZXQsIGNoYXJFbmRPZmZzZXQsCiAgICAgICAgICAgIGNsczogY2xzKTsKCiAgZmFjdG9yeSBLZXJuZWxFbnVtQnVpbGRlcigKICAgICAgTWV0YWRhdGFDb2xsZWN0b3IgbWV0YWRhdGFDb2xsZWN0b3IsCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIExpc3Q8RW51bUNvbnN0YW50SW5mbz4gZW51bUNvbnN0YW50SW5mb3MsCiAgICAgIEtlcm5lbExpYnJhcnlCdWlsZGVyIHBhcmVudCwKICAgICAgaW50IHN0YXJ0Q2hhck9mZnNldCwKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyRW5kT2Zmc2V0KSB7CiAgICBhc3NlcnQoZW51bUNvbnN0YW50SW5mb3MgPT0gbnVsbCB8fCBlbnVtQ29uc3RhbnRJbmZvcy5pc05vdEVtcHR5KTsKICAgIC8vIFRPRE8oYWhlKTogVGhlc2UgdHlwZXMgc2hvdWxkbid0IGJlIGxvb2tlZCB1cCBpbiBzY29wZSwgdGhleSBjb21lCiAgICAvLyBkaXJlY3RseSBmcm9tIGRhcnQ6Y29yZS4KICAgIEtlcm5lbFR5cGVCdWlsZGVyIGludFR5cGUgPSBuZXcgS2VybmVsTmFtZWRUeXBlQnVpbGRlcigiaW50IiwgbnVsbCk7CiAgICBLZXJuZWxUeXBlQnVpbGRlciBzdHJpbmdUeXBlID0gbmV3IEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIoIlN0cmluZyIsIG51bGwpOwogICAgS2VybmVsTmFtZWRUeXBlQnVpbGRlciBvYmplY3RUeXBlID0KICAgICAgICBuZXcgS2VybmVsTmFtZWRUeXBlQnVpbGRlcigiT2JqZWN0IiwgbnVsbCk7CiAgICBTaGFkb3dDbGFzcyBjbHMgPSBuZXcgU2hhZG93Q2xhc3MobmFtZTogbmFtZSk7CiAgICBNYXA8U3RyaW5nLCBNZW1iZXJCdWlsZGVyPiBtZW1iZXJzID0gPFN0cmluZywgTWVtYmVyQnVpbGRlcj57fTsKICAgIE1hcDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+IGNvbnN0cnVjdG9ycyA9IDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+e307CiAgICBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyIHNlbGZUeXBlID0gbmV3IEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIobmFtZSwgbnVsbCk7CiAgICBLZXJuZWxUeXBlQnVpbGRlciBsaXN0VHlwZSA9CiAgICAgICAgbmV3IEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIoIkxpc3QiLCA8S2VybmVsVHlwZUJ1aWxkZXI+W3NlbGZUeXBlXSk7CgogICAgLy8vIG1ldGFkYXRhIGNsYXNzIEUgewogICAgLy8vICAgZmluYWwgaW50IGluZGV4OwogICAgLy8vICAgZmluYWwgU3RyaW5nIF9uYW1lOwogICAgLy8vICAgY29uc3QgRSh0aGlzLmluZGV4LCB0aGlzLl9uYW1lKTsKICAgIC8vLyAgIHN0YXRpYyBjb25zdCBFIGlkMCA9IGNvbnN0IEUoMCwgJ0UuaWQwJyk7CiAgICAvLy8gICAuLi4KICAgIC8vLyAgIHN0YXRpYyBjb25zdCBFIGlkbi0xID0gY29uc3QgRShuIC0gMSwgJ0UuaWRuLTEnKTsKICAgIC8vLyAgIHN0YXRpYyBjb25zdCBMaXN0PEU+IHZhbHVlcyA9IGNvbnN0IDxFPltpZDAsIC4uLiwgaWRuLTFdOwogICAgLy8vICAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gX25hbWU7CiAgICAvLy8gfQoKICAgIG1lbWJlcnNbImluZGV4Il0gPSBuZXcgS2VybmVsRmllbGRCdWlsZGVyKG51bGwsIGludFR5cGUsICJpbmRleCIsCiAgICAgICAgZmluYWxNYXNrIHwgaGFzSW5pdGlhbGl6ZXJNYXNrLCBwYXJlbnQsIGNoYXJPZmZzZXQsIGNoYXJPZmZzZXQpOwogICAgbWVtYmVyc1siX25hbWUiXSA9IG5ldyBLZXJuZWxGaWVsZEJ1aWxkZXIobnVsbCwgc3RyaW5nVHlwZSwgIl9uYW1lIiwKICAgICAgICBmaW5hbE1hc2sgfCBoYXNJbml0aWFsaXplck1hc2ssIHBhcmVudCwgY2hhck9mZnNldCwgY2hhck9mZnNldCk7CiAgICBLZXJuZWxDb25zdHJ1Y3RvckJ1aWxkZXIgY29uc3RydWN0b3JCdWlsZGVyID0gbmV3IEtlcm5lbENvbnN0cnVjdG9yQnVpbGRlcigKICAgICAgICBudWxsLAogICAgICAgIGNvbnN0TWFzaywKICAgICAgICBudWxsLAogICAgICAgICIiLAogICAgICAgIG51bGwsCiAgICAgICAgPEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+WwogICAgICAgICAgbmV3IEtlcm5lbEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIobnVsbCwgaW5pdGlhbGl6aW5nRm9ybWFsTWFzaywKICAgICAgICAgICAgICBpbnRUeXBlLCAiaW5kZXgiLCBwYXJlbnQsIGNoYXJPZmZzZXQpLAogICAgICAgICAgbmV3IEtlcm5lbEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIobnVsbCwgaW5pdGlhbGl6aW5nRm9ybWFsTWFzaywKICAgICAgICAgICAgICBzdHJpbmdUeXBlLCAiX25hbWUiLCBwYXJlbnQsIGNoYXJPZmZzZXQpCiAgICAgICAgXSwKICAgICAgICBwYXJlbnQsCiAgICAgICAgY2hhck9mZnNldCwKICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgY2hhckVuZE9mZnNldCk7CiAgICBjb25zdHJ1Y3RvcnNbIiJdID0gY29uc3RydWN0b3JCdWlsZGVyOwogICAgS2VybmVsRmllbGRCdWlsZGVyIHZhbHVlc0J1aWxkZXIgPSBuZXcgS2VybmVsRmllbGRCdWlsZGVyKAogICAgICAgIG51bGwsCiAgICAgICAgbGlzdFR5cGUsCiAgICAgICAgInZhbHVlcyIsCiAgICAgICAgY29uc3RNYXNrIHwgc3RhdGljTWFzayB8IGhhc0luaXRpYWxpemVyTWFzaywKICAgICAgICBwYXJlbnQsCiAgICAgICAgY2hhck9mZnNldCwKICAgICAgICBjaGFyT2Zmc2V0KTsKICAgIG1lbWJlcnNbInZhbHVlcyJdID0gdmFsdWVzQnVpbGRlcjsKICAgIEtlcm5lbFByb2NlZHVyZUJ1aWxkZXIgdG9TdHJpbmdCdWlsZGVyID0gbmV3IEtlcm5lbFByb2NlZHVyZUJ1aWxkZXIoCiAgICAgICAgbnVsbCwKICAgICAgICAwLAogICAgICAgIHN0cmluZ1R5cGUsCiAgICAgICAgInRvU3RyaW5nIiwKICAgICAgICBudWxsLAogICAgICAgIG51bGwsCiAgICAgICAgUHJvY2VkdXJlS2luZC5NZXRob2QsCiAgICAgICAgcGFyZW50LAogICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgY2hhck9mZnNldCwKICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgIGNoYXJFbmRPZmZzZXQpOwogICAgbWVtYmVyc1sidG9TdHJpbmciXSA9IHRvU3RyaW5nQnVpbGRlcjsKICAgIFN0cmluZyBjbGFzc05hbWUgPSBuYW1lOwogICAgaWYgKGVudW1Db25zdGFudEluZm9zICE9IG51bGwpIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtQ29uc3RhbnRJbmZvcy5sZW5ndGg7IGkrKykgewogICAgICAgIEVudW1Db25zdGFudEluZm8gZW51bUNvbnN0YW50SW5mbyA9IGVudW1Db25zdGFudEluZm9zW2ldOwogICAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSA9IGVudW1Db25zdGFudEluZm8ubWV0YWRhdGE7CiAgICAgICAgU3RyaW5nIG5hbWUgPSBlbnVtQ29uc3RhbnRJbmZvLm5hbWU7CiAgICAgICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50ID0gZW51bUNvbnN0YW50SW5mby5kb2N1bWVudGF0aW9uQ29tbWVudDsKICAgICAgICBNZW1iZXJCdWlsZGVyIGV4aXN0aW5nID0gbWVtYmVyc1tuYW1lXTsKICAgICAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkgewogICAgICAgICAgLy8gVGhlIGV4aXN0aW5nIGRlY2xhcmF0aW9uIGlzIHN5bnRoZXRpYyBpZiBpdCBoYXMgdGhlIHNhbWUKICAgICAgICAgIC8vIGNoYXJPZmZzZXQgYXMgdGhlIGVuY2xvc2luZyBlbnVtLgogICAgICAgICAgYm9vbCBpc1N5bnRoZXRpYyA9IGV4aXN0aW5nLmNoYXJPZmZzZXQgPT0gY2hhck9mZnNldDsKICAgICAgICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQgPSBpc1N5bnRoZXRpYwogICAgICAgICAgICAgID8gPExvY2F0ZWRNZXNzYWdlPlsKICAgICAgICAgICAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25TeW50aGV0aWNDYXVzZQogICAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobmFtZSkKICAgICAgICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LmZpbGVVcmksIGNoYXJPZmZzZXQsIGNsYXNzTmFtZS5sZW5ndGgpCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgOiA8TG9jYXRlZE1lc3NhZ2U+WwogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbkNhdXNlCiAgICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhuYW1lKQogICAgICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuZmlsZVVyaSwgZXhpc3RpbmcuY2hhck9mZnNldCwgbmFtZS5sZW5ndGgpCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgcGFyZW50LmFkZFByb2JsZW0odGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb24ud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgICAgICBlbnVtQ29uc3RhbnRJbmZvLmNoYXJPZmZzZXQsIG5hbWUubGVuZ3RoLCBwYXJlbnQuZmlsZVVyaSwKICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICAgICAgICAgIGVudW1Db25zdGFudEluZm9zW2ldID0gbnVsbDsKICAgICAgICB9IGVsc2UgaWYgKG5hbWUgPT0gY2xhc3NOYW1lKSB7CiAgICAgICAgICBwYXJlbnQuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICB0ZW1wbGF0ZUVudW1Db25zdGFudFNhbWVOYW1lQXNFbmNsb3Npbmcud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgICAgICBlbnVtQ29uc3RhbnRJbmZvLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgbmFtZS5sZW5ndGgsCiAgICAgICAgICAgICAgcGFyZW50LmZpbGVVcmkpOwogICAgICAgIH0KICAgICAgICBLZXJuZWxGaWVsZEJ1aWxkZXIgZmllbGRCdWlsZGVyID0gbmV3IEtlcm5lbEZpZWxkQnVpbGRlcigKICAgICAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgICAgIHNlbGZUeXBlLAogICAgICAgICAgICBuYW1lLAogICAgICAgICAgICBjb25zdE1hc2sgfCBzdGF0aWNNYXNrIHwgaGFzSW5pdGlhbGl6ZXJNYXNrLAogICAgICAgICAgICBwYXJlbnQsCiAgICAgICAgICAgIGVudW1Db25zdGFudEluZm8uY2hhck9mZnNldCwKICAgICAgICAgICAgZW51bUNvbnN0YW50SW5mby5jaGFyT2Zmc2V0KTsKICAgICAgICBtZXRhZGF0YUNvbGxlY3Rvcj8uc2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQoCiAgICAgICAgICAgIGZpZWxkQnVpbGRlci50YXJnZXQsIGRvY3VtZW50YXRpb25Db21tZW50KTsKICAgICAgICBtZW1iZXJzW25hbWVdID0gZmllbGRCdWlsZGVyLi5uZXh0ID0gZXhpc3Rpbmc7CiAgICAgIH0KICAgIH0KICAgIGZpbmFsIGludCBzdGFydENoYXJPZmZzZXRDb21wdXRlZCA9CiAgICAgICAgbWV0YWRhdGEgPT0gbnVsbCA/IHN0YXJ0Q2hhck9mZnNldCA6IG1ldGFkYXRhLmZpcnN0LmNoYXJPZmZzZXQ7CiAgICBLZXJuZWxFbnVtQnVpbGRlciBlbnVtQnVpbGRlciA9IG5ldyBLZXJuZWxFbnVtQnVpbGRlci5pbnRlcm5hbCgKICAgICAgICBtZXRhZGF0YSwKICAgICAgICBuYW1lLAogICAgICAgIG5ldyBTY29wZShtZW1iZXJzLCBudWxsLCBwYXJlbnQuc2NvcGUsICJlbnVtICRuYW1lIiwKICAgICAgICAgICAgaXNNb2RpZmlhYmxlOiBmYWxzZSksCiAgICAgICAgbmV3IFNjb3BlKGNvbnN0cnVjdG9ycywgbnVsbCwgbnVsbCwgbmFtZSwgaXNNb2RpZmlhYmxlOiBmYWxzZSksCiAgICAgICAgY2xzLAogICAgICAgIGVudW1Db25zdGFudEluZm9zLAogICAgICAgIGludFR5cGUsCiAgICAgICAgbGlzdFR5cGUsCiAgICAgICAgb2JqZWN0VHlwZSwKICAgICAgICBzdHJpbmdUeXBlLAogICAgICAgIHBhcmVudCwKICAgICAgICBzdGFydENoYXJPZmZzZXRDb21wdXRlZCwKICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgIGNoYXJFbmRPZmZzZXQpOwogICAgdm9pZCBzZXRQYXJlbnQoU3RyaW5nIG5hbWUsIE1lbWJlckJ1aWxkZXIgYnVpbGRlcikgewogICAgICBkbyB7CiAgICAgICAgYnVpbGRlci5wYXJlbnQgPSBlbnVtQnVpbGRlcjsKICAgICAgICBidWlsZGVyID0gYnVpbGRlci5uZXh0OwogICAgICB9IHdoaWxlIChidWlsZGVyICE9IG51bGwpOwogICAgfQoKICAgIG1lbWJlcnMuZm9yRWFjaChzZXRQYXJlbnQpOwogICAgY29uc3RydWN0b3JzLmZvckVhY2goc2V0UGFyZW50KTsKICAgIHNlbGZUeXBlLmJpbmQoZW51bUJ1aWxkZXIpOwogICAgU2hhZG93Q2xhc3Muc2V0QnVpbGRlcihjbHMsIGVudW1CdWlsZGVyKTsKICAgIHJldHVybiBlbnVtQnVpbGRlcjsKICB9CgogIEtlcm5lbFR5cGVCdWlsZGVyIGdldCBtaXhlZEluVHlwZSA9PiBudWxsOwoKICBJbnRlcmZhY2VUeXBlIGJ1aWxkVHlwZSgKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgTGlzdDxLZXJuZWxUeXBlQnVpbGRlcj4gYXJndW1lbnRzKSB7CiAgICByZXR1cm4gY2xzLnJhd1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzcyBidWlsZChLZXJuZWxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5QnVpbGRlciwgTGlicmFyeUJ1aWxkZXIgY29yZUxpYnJhcnkpIHsKICAgIGNscy5pc0VudW0gPSB0cnVlOwogICAgaW50VHlwZS5yZXNvbHZlSW4oY29yZUxpYnJhcnkuc2NvcGUsIGNoYXJPZmZzZXQsIGZpbGVVcmksIGxpYnJhcnlCdWlsZGVyKTsKICAgIHN0cmluZ1R5cGUucmVzb2x2ZUluKAogICAgICAgIGNvcmVMaWJyYXJ5LnNjb3BlLCBjaGFyT2Zmc2V0LCBmaWxlVXJpLCBsaWJyYXJ5QnVpbGRlcik7CiAgICBvYmplY3RUeXBlLnJlc29sdmVJbigKICAgICAgICBjb3JlTGlicmFyeS5zY29wZSwgY2hhck9mZnNldCwgZmlsZVVyaSwgbGlicmFyeUJ1aWxkZXIpOwogICAgbGlzdFR5cGUucmVzb2x2ZUluKGNvcmVMaWJyYXJ5LnNjb3BlLCBjaGFyT2Zmc2V0LCBmaWxlVXJpLCBsaWJyYXJ5QnVpbGRlcik7CgogICAgS2VybmVsRmllbGRCdWlsZGVyIGluZGV4RmllbGRCdWlsZGVyID0gZmlyc3RNZW1iZXJOYW1lZCgiaW5kZXgiKTsKICAgIEZpZWxkIGluZGV4RmllbGQgPSBpbmRleEZpZWxkQnVpbGRlci5idWlsZChsaWJyYXJ5QnVpbGRlcik7CiAgICBLZXJuZWxGaWVsZEJ1aWxkZXIgbmFtZUZpZWxkQnVpbGRlciA9IGZpcnN0TWVtYmVyTmFtZWQoIl9uYW1lIik7CiAgICBGaWVsZCBuYW1lRmllbGQgPSBuYW1lRmllbGRCdWlsZGVyLmJ1aWxkKGxpYnJhcnlCdWlsZGVyKTsKICAgIEtlcm5lbFByb2NlZHVyZUJ1aWxkZXIgdG9TdHJpbmdCdWlsZGVyID0gZmlyc3RNZW1iZXJOYW1lZCgidG9TdHJpbmciKTsKICAgIHRvU3RyaW5nQnVpbGRlci5ib2R5ID0gbmV3IFJldHVyblN0YXRlbWVudCgKICAgICAgICBuZXcgRGlyZWN0UHJvcGVydHlHZXQobmV3IFRoaXNFeHByZXNzaW9uKCksIG5hbWVGaWVsZCkpOwogICAgTGlzdDxFeHByZXNzaW9uPiB2YWx1ZXMgPSA8RXhwcmVzc2lvbj5bXTsKICAgIGlmIChlbnVtQ29uc3RhbnRJbmZvcyAhPSBudWxsKSB7CiAgICAgIGZvciAoRW51bUNvbnN0YW50SW5mbyBlbnVtQ29uc3RhbnRJbmZvIGluIGVudW1Db25zdGFudEluZm9zKSB7CiAgICAgICAgaWYgKGVudW1Db25zdGFudEluZm8gIT0gbnVsbCkgewogICAgICAgICAgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBmaXJzdE1lbWJlck5hbWVkKGVudW1Db25zdGFudEluZm8ubmFtZSk7CiAgICAgICAgICBpZiAoZGVjbGFyYXRpb24uaXNGaWVsZCkgewogICAgICAgICAgICBLZXJuZWxGaWVsZEJ1aWxkZXIgZmllbGQgPSBkZWNsYXJhdGlvbjsKICAgICAgICAgICAgdmFsdWVzLmFkZChuZXcgU3RhdGljR2V0KGZpZWxkLmJ1aWxkKGxpYnJhcnlCdWlsZGVyKSkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgS2VybmVsRmllbGRCdWlsZGVyIHZhbHVlc0J1aWxkZXIgPSBmaXJzdE1lbWJlck5hbWVkKCJ2YWx1ZXMiKTsKICAgIHZhbHVlc0J1aWxkZXIuYnVpbGQobGlicmFyeUJ1aWxkZXIpOwogICAgdmFsdWVzQnVpbGRlci5pbml0aWFsaXplciA9CiAgICAgICAgbmV3IExpc3RMaXRlcmFsKHZhbHVlcywgdHlwZUFyZ3VtZW50OiBjbHMucmF3VHlwZSwgaXNDb25zdDogdHJ1ZSk7CiAgICBLZXJuZWxDb25zdHJ1Y3RvckJ1aWxkZXIgY29uc3RydWN0b3JCdWlsZGVyID0gY29uc3RydWN0b3JTY29wZUJ1aWxkZXJbIiJdOwogICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvckJ1aWxkZXIuYnVpbGQobGlicmFyeUJ1aWxkZXIpOwogICAgY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzLmluc2VydCgKICAgICAgICAwLAogICAgICAgIG5ldyBGaWVsZEluaXRpYWxpemVyKGluZGV4RmllbGQsCiAgICAgICAgICAgIG5ldyBWYXJpYWJsZUdldChjb25zdHJ1Y3Rvci5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyc1swXSkpCiAgICAgICAgICAuLnBhcmVudCA9IGNvbnN0cnVjdG9yKTsKICAgIGNvbnN0cnVjdG9yLmluaXRpYWxpemVycy5pbnNlcnQoCiAgICAgICAgMSwKICAgICAgICBuZXcgRmllbGRJbml0aWFsaXplcihuYW1lRmllbGQsCiAgICAgICAgICAgIG5ldyBWYXJpYWJsZUdldChjb25zdHJ1Y3Rvci5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyc1sxXSkpCiAgICAgICAgICAuLnBhcmVudCA9IGNvbnN0cnVjdG9yKTsKICAgIEtlcm5lbENsYXNzQnVpbGRlciBvYmplY3RDbGFzcyA9IG9iamVjdFR5cGUuZGVjbGFyYXRpb247CiAgICBNZW1iZXJCdWlsZGVyIHN1cGVyQ29uc3RydWN0b3IgPSBvYmplY3RDbGFzcy5maW5kQ29uc3RydWN0b3JPckZhY3RvcnkoCiAgICAgICAgIiIsIGNoYXJPZmZzZXQsIGZpbGVVcmksIGxpYnJhcnlCdWlsZGVyKTsKICAgIGlmIChzdXBlckNvbnN0cnVjdG9yID09IG51bGwgfHwgIXN1cGVyQ29uc3RydWN0b3IuaXNDb25zdHJ1Y3RvcikgewogICAgICAvLyBUT0RPKGFoZSk6IElkZWFsbHksIHdlIHdvdWxkIGFsc28gd2FudCB0byBjaGVjayB0aGF0IFtPYmplY3RdJ3MKICAgICAgLy8gdW5uYW1lZCBjb25zdHJ1Y3RvciByZXF1aXJlcyBubyBhcmd1bWVudHMuIEJ1dCB0aGF0IGluZm9ybWF0aW9uIGlzbid0CiAgICAgIC8vIGFsd2F5cyBhdmFpbGFibGUgYXQgdGhpcyBwb2ludCwgYW5kIGl0J3Mgbm90IHJlYWxseSBhIHNpdHVhdGlvbiB0aGF0CiAgICAgIC8vIGNhbiBoYXBwZW4gdW5sZXNzIHlvdSBzdGFydCBtb2RpZnlpbmcgdGhlIFNESyBzb3VyY2VzLgogICAgICBsaWJyYXJ5LmFkZFByb2JsZW0obWVzc2FnZU5vVW5uYW1lZENvbnN0cnVjdG9ySW5PYmplY3QsCiAgICAgICAgICBvYmplY3RDbGFzcy5jaGFyT2Zmc2V0LCBvYmplY3RDbGFzcy5uYW1lLmxlbmd0aCwgb2JqZWN0Q2xhc3MuZmlsZVVyaSk7CiAgICB9IGVsc2UgewogICAgICBjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnMuYWRkKAogICAgICAgICAgbmV3IFN1cGVySW5pdGlhbGl6ZXIoc3VwZXJDb25zdHJ1Y3Rvci50YXJnZXQsIG5ldyBBcmd1bWVudHMuZW1wdHkoKSkKICAgICAgICAgICAgLi5wYXJlbnQgPSBjb25zdHJ1Y3Rvcik7CiAgICB9CiAgICBpbnQgaW5kZXggPSAwOwogICAgaWYgKGVudW1Db25zdGFudEluZm9zICE9IG51bGwpIHsKICAgICAgZm9yIChFbnVtQ29uc3RhbnRJbmZvIGVudW1Db25zdGFudEluZm8gaW4gZW51bUNvbnN0YW50SW5mb3MpIHsKICAgICAgICBpZiAoZW51bUNvbnN0YW50SW5mbyAhPSBudWxsKSB7CiAgICAgICAgICBTdHJpbmcgY29uc3RhbnQgPSBlbnVtQ29uc3RhbnRJbmZvLm5hbWU7CiAgICAgICAgICBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IGZpcnN0TWVtYmVyTmFtZWQoY29uc3RhbnQpOwogICAgICAgICAgS2VybmVsRmllbGRCdWlsZGVyIGZpZWxkOwogICAgICAgICAgaWYgKGRlY2xhcmF0aW9uLmlzRmllbGQpIHsKICAgICAgICAgICAgZmllbGQgPSBkZWNsYXJhdGlvbjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgQXJndW1lbnRzIGFyZ3VtZW50cyA9IG5ldyBBcmd1bWVudHMoPEV4cHJlc3Npb24+WwogICAgICAgICAgICBuZXcgSW50TGl0ZXJhbChpbmRleCsrKSwKICAgICAgICAgICAgbmV3IFN0cmluZ0xpdGVyYWwoIiRuYW1lLiRjb25zdGFudCIpCiAgICAgICAgICBdKTsKICAgICAgICAgIGZpZWxkLmluaXRpYWxpemVyID0KICAgICAgICAgICAgICBuZXcgQ29uc3RydWN0b3JJbnZvY2F0aW9uKGNvbnN0cnVjdG9yLCBhcmd1bWVudHMsIGlzQ29uc3Q6IHRydWUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHN1cGVyLmJ1aWxkKGxpYnJhcnlCdWlsZGVyLCBjb3JlTGlicmFyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICBEZWNsYXJhdGlvbiBmaW5kQ29uc3RydWN0b3JPckZhY3RvcnkoCiAgICAgIFN0cmluZyBuYW1lLCBpbnQgY2hhck9mZnNldCwgVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgcmV0dXJuIG51bGw7CiAgfQp9CoFoAE5OPAEjASEJEw8VHxsUDxoUFxUXGRMXGhgVATIBHQkYLScsNTEBGgkTExwgFAFGAR0JFRUaIBwiHCYeICAbGBcZDwEiATM/DDIBKAErASsBKQEeJhMTGhceFBUXFx0bFhlQPhcBHSsmEzAjGxYbR0kgSU8oNDNESU4hSwEbGx4rNA48RCYKAUZJSUlQDhMODA4iSTVJNwsQFBQUGCs/DhISNRAUFSdJDgsUFA4OHhAUFBQYKx0lO0JELU0wIEYvQDUiPislSBIiNSslTBNPSCEnKB1LKxsfCkIWFhI5FCkqNDg3CAYoSEQSDj0iSA0bERIUFBAhFBg5CyYgIQYBICUgLhgEAS0BG0MYBAEMURdPGkEaQVABRkBFPkswQS4lRShNJTREDAoIBkMpIEtPSCULKUsjJQsoSyM9SzJHSU9OQD5RDSRPJQYTJUUoM0AkJSETFgw8JTEOHlAKCAY1BAEMKEYRBAIBO3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2VudW1fYnVpbGRlci5kYXJ0RXNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2ZpZWxkX2J1aWxkZXIuZGFydI8qLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEua2VybmVsX2ZpZWxkX2J1aWxkZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdyBDbGFzcywgRGFydFR5cGUsIER5bmFtaWNUeXBlLCBFeHByZXNzaW9uLCBGaWVsZCwgTmFtZSwgTnVsbExpdGVyYWw7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnIHNob3cgbWVzc2FnZUludGVybmFsUHJvYmxlbUFscmVhZHlJbml0aWFsaXplZDsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyBpbnRlcm5hbFByb2JsZW0sIHVuc3VwcG9ydGVkOwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX2luZmVyZW5jZV9lbmdpbmUuZGFydCcKICAgIHNob3cgSW5jbHVkZXNUeXBlUGFyYW1ldGVyc0NvdmFyaWFudGx5OwoKaW1wb3J0ICdrZXJuZWxfYm9keV9idWlsZGVyLmRhcnQnIHNob3cgS2VybmVsQm9keUJ1aWxkZXI7CgppbXBvcnQgJ2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgQ2xhc3NCdWlsZGVyLAogICAgICAgIERlY2xhcmF0aW9uLAogICAgICAgIEZpZWxkQnVpbGRlciwKICAgICAgICBJbXBsaWNpdEZpZWxkVHlwZSwKICAgICAgICBLZXJuZWxMaWJyYXJ5QnVpbGRlciwKICAgICAgICBLZXJuZWxUeXBlQnVpbGRlciwKICAgICAgICBNZXRhZGF0YUJ1aWxkZXI7CgppbXBvcnQgJ2tlcm5lbF9zaGFkb3dfYXN0LmRhcnQnIHNob3cgU2hhZG93RmllbGQ7CgpjbGFzcyBLZXJuZWxGaWVsZEJ1aWxkZXIgZXh0ZW5kcyBGaWVsZEJ1aWxkZXI8RXhwcmVzc2lvbj4gewogIGZpbmFsIFNoYWRvd0ZpZWxkIGZpZWxkOwogIGZpbmFsIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YTsKICBmaW5hbCBLZXJuZWxUeXBlQnVpbGRlciB0eXBlOwoKICBLZXJuZWxGaWVsZEJ1aWxkZXIodGhpcy5tZXRhZGF0YSwgdGhpcy50eXBlLCBTdHJpbmcgbmFtZSwgaW50IG1vZGlmaWVycywKICAgICAgRGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0LCBpbnQgY2hhck9mZnNldCwgaW50IGNoYXJFbmRPZmZzZXQpCiAgICAgIDogZmllbGQgPSBuZXcgU2hhZG93RmllbGQobnVsbCwgdHlwZSA9PSBudWxsLAogICAgICAgICAgICBmaWxlVXJpOiBjb21waWxhdGlvblVuaXQ/LmZpbGVVcmkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0CiAgICAgICAgICAuLmZpbGVFbmRPZmZzZXQgPSBjaGFyRW5kT2Zmc2V0LAogICAgICAgIHN1cGVyKG5hbWUsIG1vZGlmaWVycywgY29tcGlsYXRpb25Vbml0LCBjaGFyT2Zmc2V0KTsKCiAgdm9pZCBzZXQgaW5pdGlhbGl6ZXIoRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgaWYgKCFoYXNJbml0aWFsaXplciAmJiB2YWx1ZSBpcyEgTnVsbExpdGVyYWwgJiYgIWlzQ29uc3QgJiYgIWlzRmluYWwpIHsKICAgICAgaW50ZXJuYWxQcm9ibGVtKAogICAgICAgICAgbWVzc2FnZUludGVybmFsUHJvYmxlbUFscmVhZHlJbml0aWFsaXplZCwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICB9CiAgICBmaWVsZC5pbml0aWFsaXplciA9IHZhbHVlLi5wYXJlbnQgPSBmaWVsZDsKICB9CgogIGJvb2wgZ2V0IGlzRWxpZ2libGVGb3JJbmZlcmVuY2UgewogICAgcmV0dXJuICFsaWJyYXJ5LmxlZ2FjeU1vZGUgJiYKICAgICAgICB0eXBlID09IG51bGwgJiYKICAgICAgICAoaGFzSW5pdGlhbGl6ZXIgfHwgaXNJbnN0YW5jZU1lbWJlcik7CiAgfQoKICBGaWVsZCBidWlsZChLZXJuZWxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICBmaWVsZC5uYW1lID8/PSBuZXcgTmFtZShuYW1lLCBsaWJyYXJ5LnRhcmdldCk7CiAgICBpZiAodHlwZSAhPSBudWxsKSB7CiAgICAgIGZpZWxkLnR5cGUgPSB0eXBlLmJ1aWxkKGxpYnJhcnkpOwoKICAgICAgaWYgKCFpc0ZpbmFsICYmICFpc0NvbnN0KSB7CiAgICAgICAgSW5jbHVkZXNUeXBlUGFyYW1ldGVyc0NvdmFyaWFudGx5IG5lZWRzQ2hlY2tWaXNpdG9yOwogICAgICAgIGlmIChwYXJlbnQgaXMgQ2xhc3NCdWlsZGVyKSB7CiAgICAgICAgICBDbGFzcyBlbmNsb3NpbmdDbGFzcyA9IHBhcmVudC50YXJnZXQ7CiAgICAgICAgICBpZiAoZW5jbG9zaW5nQ2xhc3MudHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICAgICAgICBuZWVkc0NoZWNrVmlzaXRvciA9IG5ldyBJbmNsdWRlc1R5cGVQYXJhbWV0ZXJzQ292YXJpYW50bHkoCiAgICAgICAgICAgICAgICBlbmNsb3NpbmdDbGFzcy50eXBlUGFyYW1ldGVycyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChuZWVkc0NoZWNrVmlzaXRvciAhPSBudWxsKSB7CiAgICAgICAgICBpZiAoZmllbGQudHlwZS5hY2NlcHQobmVlZHNDaGVja1Zpc2l0b3IpKSB7CiAgICAgICAgICAgIGZpZWxkLmlzR2VuZXJpY0NvdmFyaWFudEltcGwgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYm9vbCBpc0luc3RhbmNlTWVtYmVyID0gIWlzU3RhdGljICYmICFpc1RvcExldmVsOwogICAgZmllbGQKICAgICAgLi5pc0NvdmFyaWFudCA9IGlzQ292YXJpYW50CiAgICAgIC4uaXNGaW5hbCA9IGlzRmluYWwKICAgICAgLi5pc0NvbnN0ID0gaXNDb25zdAogICAgICAuLmhhc0ltcGxpY2l0R2V0dGVyID0gaXNJbnN0YW5jZU1lbWJlcgogICAgICAuLmhhc0ltcGxpY2l0U2V0dGVyID0gaXNJbnN0YW5jZU1lbWJlciAmJiAhaXNDb25zdCAmJiAhaXNGaW5hbAogICAgICAuLmlzU3RhdGljID0gIWlzSW5zdGFuY2VNZW1iZXI7CiAgICBpZiAoaXNFbGlnaWJsZUZvckluZmVyZW5jZSAmJiAhaXNJbnN0YW5jZU1lbWJlcikgewogICAgICBsaWJyYXJ5LmxvYWRlci50eXBlSW5mZXJlbmNlRW5naW5lCiAgICAgICAgICAucmVjb3JkU3RhdGljRmllbGRJbmZlcmVuY2VDYW5kaWRhdGUoZmllbGQsIGxpYnJhcnkpOwogICAgfQogICAgcmV0dXJuIGZpZWxkOwogIH0KCiAgRmllbGQgZ2V0IHRhcmdldCA9PiBmaWVsZDsKCiAgdm9pZCBwcmVwYXJlVG9wTGV2ZWxJbmZlcmVuY2UoKSB7CiAgICBpZiAoIWlzRWxpZ2libGVGb3JJbmZlcmVuY2UpIHJldHVybjsKICAgIEtlcm5lbExpYnJhcnlCdWlsZGVyIGxpYnJhcnkgPSB0aGlzLmxpYnJhcnk7CiAgICB2YXIgdHlwZUluZmVycmVyID0gbGlicmFyeS5sb2FkZXIudHlwZUluZmVyZW5jZUVuZ2luZQogICAgICAgIC5jcmVhdGVUb3BMZXZlbFR5cGVJbmZlcnJlcigKICAgICAgICAgICAgZmllbGQuZW5jbG9zaW5nQ2xhc3M/LnRoaXNUeXBlLCBmaWVsZCwgbnVsbCk7CiAgICBpZiAoaGFzSW5pdGlhbGl6ZXIpIHsKICAgICAgaWYgKGZpZWxkLnR5cGUgaXMhIEltcGxpY2l0RmllbGRUeXBlKSB7CiAgICAgICAgdW5zdXBwb3J0ZWQoCiAgICAgICAgICAgICIkbmFtZSBoYXMgdW5leHBlY3RlZCB0eXBlICR7ZmllbGQudHlwZX0iLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgSW1wbGljaXRGaWVsZFR5cGUgdHlwZSA9IGZpZWxkLnR5cGU7CiAgICAgIGZpZWxkLnR5cGUgPSBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgICBpbml0aWFsaXplciA9IG5ldyBLZXJuZWxCb2R5QnVpbGRlci5mb3JGaWVsZCh0aGlzLCB0eXBlSW5mZXJyZXIpCiAgICAgICAgICAucGFyc2VGaWVsZEluaXRpYWxpemVyKHR5cGUuaW5pdGlhbGl6ZXJUb2tlbik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXQgYnVpbHRUeXBlID0+IGZpZWxkLnR5cGU7Cn0KdwBOTjwBJAEhTQFMAT0BNiwBOgEdCRYVFhseGxkBMgE8GyggAUtGNC8kKz0BK0wXSgYvBAEkIhguBAEuMxgoASI9JjA6RzAMCik2MQwKCAY2CiIaGi1FJjcpQAYSBAEdASQpMTolOhouFU0QCCsoRzkGBAEMKAIBPHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2ZpZWxkX2J1aWxkZXIuZGFydFBzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF9mb3JtYWxfcGFyYW1ldGVyX2J1aWxkZXIuZGFydIqGLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEua2VybmVsX2Zvcm1hbF9wYXJhbWV0ZXJfYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgVmFyaWFibGVEZWNsYXJhdGlvbjsKCmltcG9ydCAnLi4vbW9kaWZpZXIuZGFydCcgc2hvdyBmaW5hbE1hc2ssIGluaXRpYWxpemluZ0Zvcm1hbE1hc2s7CgppbXBvcnQgJ2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgQ2xhc3NCdWlsZGVyLAogICAgICAgIERlY2xhcmF0aW9uLAogICAgICAgIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIsCiAgICAgICAgS2VybmVsRmllbGRCdWlsZGVyLAogICAgICAgIEtlcm5lbExpYnJhcnlCdWlsZGVyLAogICAgICAgIEtlcm5lbFR5cGVCdWlsZGVyLAogICAgICAgIE1ldGFkYXRhQnVpbGRlciwKICAgICAgICBUeXBlQnVpbGRlcjsKCmltcG9ydCAna2VybmVsX3NoYWRvd19hc3QuZGFydCcgc2hvdyBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQ7CgpjbGFzcyBLZXJuZWxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyCiAgICBleHRlbmRzIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI8S2VybmVsVHlwZUJ1aWxkZXI+IHsKICBWYXJpYWJsZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uOwoKICBLZXJuZWxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyKAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIGludCBtb2RpZmllcnMsCiAgICAgIEtlcm5lbFR5cGVCdWlsZGVyIHR5cGUsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBLZXJuZWxMaWJyYXJ5QnVpbGRlciBjb21waWxhdGlvblVuaXQsCiAgICAgIGludCBjaGFyT2Zmc2V0KQogICAgICA6IHN1cGVyKG1ldGFkYXRhLCBtb2RpZmllcnMsIHR5cGUsIG5hbWUsIGNvbXBpbGF0aW9uVW5pdCwgY2hhck9mZnNldCk7CgogIFZhcmlhYmxlRGVjbGFyYXRpb24gZ2V0IHRhcmdldCA9PiBkZWNsYXJhdGlvbjsKCiAgVmFyaWFibGVEZWNsYXJhdGlvbiBidWlsZCgKICAgICAgS2VybmVsTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgaW50IGZ1bmN0aW9uTmVzdGluZ0xldmVsKSB7CiAgICBpZiAoZGVjbGFyYXRpb24gPT0gbnVsbCkgewogICAgICBkZWNsYXJhdGlvbiA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQobmFtZSwgZnVuY3Rpb25OZXN0aW5nTGV2ZWwsCiAgICAgICAgICB0eXBlOiB0eXBlPy5idWlsZChsaWJyYXJ5KSwKICAgICAgICAgIGlzRmluYWw6IGlzRmluYWwsCiAgICAgICAgICBpc0NvbnN0OiBpc0NvbnN0LAogICAgICAgICAgaXNGaWVsZEZvcm1hbDogaXNJbml0aWFsaXppbmdGb3JtYWwsCiAgICAgICAgICBpc0NvdmFyaWFudDogaXNDb3ZhcmlhbnQpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICAgIH0KICAgIHJldHVybiBkZWNsYXJhdGlvbjsKICB9CgogIEtlcm5lbEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgY2xvbmUoTGlzdDxUeXBlQnVpbGRlcj4gbmV3VHlwZXMpIHsKICAgIC8vIFRPRE8oZG1pdHJ5YXMpOiAgSXQncyBub3QgY2xlYXIgaG93IFttZXRhZGF0YV0gaXMgdXNlZCBjdXJyZW50bHksIGFuZAogICAgLy8gaG93IGl0IHNob3VsZCBiZSBjbG9uZWQuICBDb25zaWRlciBjbG9uaW5nIGl0IGluc3RlYWQgb2YgcmV1c2luZyBpdC4KICAgIHJldHVybiBuZXcgS2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlcigKICAgICAgICBtZXRhZGF0YSwgbW9kaWZpZXJzLCB0eXBlPy5jbG9uZShuZXdUeXBlcyksIG5hbWUsIHBhcmVudCwgY2hhck9mZnNldCkKICAgICAgLi5raW5kID0ga2luZDsKICB9CgogIEBvdmVycmlkZQogIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgZm9yRm9ybWFsUGFyYW1ldGVySW5pdGlhbGl6ZXJTY29wZSgpIHsKICAgIGFzc2VydChkZWNsYXJhdGlvbiAhPSBudWxsKTsKICAgIHJldHVybiAhaXNJbml0aWFsaXppbmdGb3JtYWwKICAgICAgICA/IHRoaXMKICAgICAgICA6IChuZXcgS2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlcigKICAgICAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgICAgIG1vZGlmaWVycyB8IGZpbmFsTWFzayB8IGluaXRpYWxpemluZ0Zvcm1hbE1hc2ssCiAgICAgICAgICAgIHR5cGUsCiAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgIGNoYXJPZmZzZXQpCiAgICAgICAgICAuLnBhcmVudCA9IHBhcmVudAogICAgICAgICAgLi5kZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uKTsKICB9CgogIHZvaWQgZmluYWxpemVJbml0aWFsaXppbmdGb3JtYWwoKSB7CiAgICBPYmplY3QgY2xzID0gcGFyZW50LnBhcmVudDsKICAgIGlmIChjbHMgaXMgQ2xhc3NCdWlsZGVyKSB7CiAgICAgIERlY2xhcmF0aW9uIGZpZWxkID0gY2xzLnNjb3BlLmxvb2t1cChuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgICAgaWYgKGZpZWxkIGlzIEtlcm5lbEZpZWxkQnVpbGRlcikgewogICAgICAgIHRhcmdldC50eXBlID0gZmllbGQudGFyZ2V0LnR5cGU7CiAgICAgIH0KICAgIH0KICB9Cn0KWABOTjwBLwE7AUIBHQkWFSAcHhsZFQFCASM4IwEgJhUeEywWTQExAR1AH1AmHBwvJCMGGAQBQ01MLU4VBAEMQCEhDy0WPBISEhgcKAQBJiAfRykpCAYEAgFHcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfZm9ybWFsX3BhcmFtZXRlcl9idWlsZGVyLmRhcnRNc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfZnVuY3Rpb25fdHlwZV9idWlsZGVyLmRhcnSPcC8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmtlcm5lbF9mdW5jdGlvbl90eXBlX2J1aWxkZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIERhcnRUeXBlLAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEZ1bmN0aW9uVHlwZSwKICAgICAgICBOYW1lZFR5cGUsCiAgICAgICAgU3VwZXJ0eXBlLAogICAgICAgIFR5cGVQYXJhbWV0ZXIsCiAgICAgICAgVHlwZWRlZlR5cGU7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnCiAgICBzaG93IExvY2F0ZWRNZXNzYWdlLCBtZXNzYWdlU3VwZXJ0eXBlSXNGdW5jdGlvbiwgbm9MZW5ndGg7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgdW5zdXBwb3J0ZWQ7CgppbXBvcnQgJ2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgRm9ybWFsUGFyYW1ldGVyQnVpbGRlciwKICAgICAgICBGdW5jdGlvblR5cGVCdWlsZGVyLAogICAgICAgIEtlcm5lbEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIsCiAgICAgICAgS2VybmVsVHlwZUJ1aWxkZXIsCiAgICAgICAgS2VybmVsVHlwZVZhcmlhYmxlQnVpbGRlciwKICAgICAgICBMaWJyYXJ5QnVpbGRlciwKICAgICAgICBUeXBlQnVpbGRlciwKICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyOwoKY2xhc3MgS2VybmVsRnVuY3Rpb25UeXBlQnVpbGRlciBleHRlbmRzIEZ1bmN0aW9uVHlwZUJ1aWxkZXIKICAgIGltcGxlbWVudHMgS2VybmVsVHlwZUJ1aWxkZXIgewogIEtlcm5lbEZ1bmN0aW9uVHlwZUJ1aWxkZXIoCiAgICAgIEtlcm5lbFR5cGVCdWlsZGVyIHJldHVyblR5cGUsCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywKICAgICAgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPFR5cGVCdWlsZGVyPj4gZm9ybWFscykKICAgICAgOiBzdXBlcihyZXR1cm5UeXBlLCB0eXBlVmFyaWFibGVzLCBmb3JtYWxzKTsKCiAgRnVuY3Rpb25UeXBlIGJ1aWxkKExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIFtUeXBlZGVmVHlwZSBvcmlnaW5dKSB7CiAgICBEYXJ0VHlwZSBidWlsdFJldHVyblR5cGUgPQogICAgICAgIHJldHVyblR5cGU/LmJ1aWxkKGxpYnJhcnkpID8/IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICBMaXN0PERhcnRUeXBlPiBwb3NpdGlvbmFsUGFyYW1ldGVycyA9IDxEYXJ0VHlwZT5bXTsKICAgIExpc3Q8TmFtZWRUeXBlPiBuYW1lZFBhcmFtZXRlcnM7CiAgICBpbnQgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA9IDA7CiAgICBpZiAoZm9ybWFscyAhPSBudWxsKSB7CiAgICAgIGZvciAoS2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgaW4gZm9ybWFscykgewogICAgICAgIERhcnRUeXBlIHR5cGUgPSBmb3JtYWwudHlwZT8uYnVpbGQobGlicmFyeSkgPz8gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgICAgICBpZiAoZm9ybWFsLmlzUG9zaXRpb25hbCkgewogICAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnMuYWRkKHR5cGUpOwogICAgICAgICAgaWYgKGZvcm1hbC5pc1JlcXVpcmVkKSByZXF1aXJlZFBhcmFtZXRlckNvdW50Kys7CiAgICAgICAgfSBlbHNlIGlmIChmb3JtYWwuaXNOYW1lZCkgewogICAgICAgICAgbmFtZWRQYXJhbWV0ZXJzID8/PSA8TmFtZWRUeXBlPltdOwogICAgICAgICAgbmFtZWRQYXJhbWV0ZXJzLmFkZChuZXcgTmFtZWRUeXBlKGZvcm1hbC5uYW1lLCB0eXBlKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChuYW1lZFBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICAgIG5hbWVkUGFyYW1ldGVycy5zb3J0KCk7CiAgICAgIH0KICAgIH0KICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnM7CiAgICBpZiAodHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgIHR5cGVQYXJhbWV0ZXJzID0gPFR5cGVQYXJhbWV0ZXI+W107CiAgICAgIGZvciAoS2VybmVsVHlwZVZhcmlhYmxlQnVpbGRlciB0IGluIHR5cGVWYXJpYWJsZXMpIHsKICAgICAgICB0eXBlUGFyYW1ldGVycy5hZGQodC5wYXJhbWV0ZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uVHlwZShwb3NpdGlvbmFsUGFyYW1ldGVycywgYnVpbHRSZXR1cm5UeXBlLAogICAgICAgIG5hbWVkUGFyYW1ldGVyczogbmFtZWRQYXJhbWV0ZXJzID8/IGNvbnN0IDxOYW1lZFR5cGU+W10sCiAgICAgICAgdHlwZVBhcmFtZXRlcnM6IHR5cGVQYXJhbWV0ZXJzID8/IGNvbnN0IDxUeXBlUGFyYW1ldGVyPltdLAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgdHlwZWRlZlR5cGU6IG9yaWdpbik7CiAgfQoKICBTdXBlcnR5cGUgYnVpbGRTdXBlcnR5cGUoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSkgewogICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgIG1lc3NhZ2VTdXBlcnR5cGVJc0Z1bmN0aW9uLCBjaGFyT2Zmc2V0LCBub0xlbmd0aCwgZmlsZVVyaSk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIFN1cGVydHlwZSBidWlsZE1peGVkSW5UeXBlKAogICAgICBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpIHsKICAgIHJldHVybiBidWlsZFN1cGVydHlwZShsaWJyYXJ5LCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICB9CgogIEBvdmVycmlkZQogIGJ1aWxkSW52YWxpZFR5cGUoTG9jYXRlZE1lc3NhZ2UgbWVzc2FnZSwge0xpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHR9KSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoImJ1aWxkSW52YWxpZFR5cGUiLCBtZXNzYWdlLmNoYXJPZmZzZXQsIG1lc3NhZ2UudXJpKTsKICB9CgogIEtlcm5lbEZ1bmN0aW9uVHlwZUJ1aWxkZXIgY2xvbmUoTGlzdDxUeXBlQnVpbGRlcj4gbmV3VHlwZXMpIHsKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gY2xvbmVkVHlwZVZhcmlhYmxlczsKICAgIGlmICh0eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgY2xvbmVkVHlwZVZhcmlhYmxlcyA9IG5ldyBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+KHR5cGVWYXJpYWJsZXMubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbG9uZWRUeXBlVmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY2xvbmVkVHlwZVZhcmlhYmxlc1tpXSA9IHR5cGVWYXJpYWJsZXNbaV0uY2xvbmUobmV3VHlwZXMpOwogICAgICB9CiAgICB9CiAgICBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+IGNsb25lZEZvcm1hbHM7CiAgICBpZiAoZm9ybWFscyAhPSBudWxsKSB7CiAgICAgIGNsb25lZEZvcm1hbHMgPSBuZXcgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPihmb3JtYWxzLmxlbmd0aCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xvbmVkRm9ybWFscy5sZW5ndGg7IGkrKykgewogICAgICAgIEtlcm5lbEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgZm9ybWFsID0gZm9ybWFsc1tpXTsKICAgICAgICBjbG9uZWRGb3JtYWxzW2ldID0gZm9ybWFsLmNsb25lKG5ld1R5cGVzKTsKICAgICAgfQogICAgfQogICAgS2VybmVsRnVuY3Rpb25UeXBlQnVpbGRlciBuZXdUeXBlID0gbmV3IEtlcm5lbEZ1bmN0aW9uVHlwZUJ1aWxkZXIoCiAgICAgICAgcmV0dXJuVHlwZT8uY2xvbmUobmV3VHlwZXMpLCBjbG9uZWRUeXBlVmFyaWFibGVzLCBjbG9uZWRGb3JtYWxzKTsKICAgIG5ld1R5cGVzLmFkZChuZXdUeXBlKTsKICAgIHJldHVybiBuZXdUeXBlOwogIH0KfQp0AE5OPAEsASEJEhUWExMXFQEdPwEsAR0JIB0mGyMYFR0BPCMdJC85MwFFHzs4JSQbPUwjKjslLUEKCCUgCAYoISo7KQgGQ0FDOB4EARw9GEQRBAEePTkEAQxNTQQBQDMhUT1DCAYwG0g3OjMIBkdKGxQEAgFEcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfZnVuY3Rpb25fdHlwZV9idWlsZGVyLmRhcnRMc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfaW52YWxpZF90eXBlX2J1aWxkZXIuZGFydIV2Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEua2VybmVsX2ludmFsaWRfdHlwZV9idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBEYXJ0VHlwZSwgSW52YWxpZFR5cGU7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnIHNob3cgTG9jYXRlZE1lc3NhZ2U7CgppbXBvcnQgJ2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93IEludmFsaWRUeXBlQnVpbGRlciwgS2VybmVsVHlwZUJ1aWxkZXIsIExpYnJhcnlCdWlsZGVyOwoKY2xhc3MgS2VybmVsSW52YWxpZFR5cGVCdWlsZGVyCiAgICBleHRlbmRzIEludmFsaWRUeXBlQnVpbGRlcjxLZXJuZWxUeXBlQnVpbGRlciwgRGFydFR5cGU+IHsKICBAb3ZlcnJpZGUKICBmaW5hbCBMb2NhdGVkTWVzc2FnZSBtZXNzYWdlOwoKICBmaW5hbCBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0OwoKICBmaW5hbCBib29sIHN1cHByZXNzTWVzc2FnZTsKCiAgS2VybmVsSW52YWxpZFR5cGVCdWlsZGVyKFN0cmluZyBuYW1lLCB0aGlzLm1lc3NhZ2UsCiAgICAgIHt0aGlzLmNvbnRleHQsIHRoaXMuc3VwcHJlc3NNZXNzYWdlOiBmYWxzZX0pCiAgICAgIDogc3VwZXIobmFtZSwgbWVzc2FnZS5jaGFyT2Zmc2V0LCBtZXNzYWdlLnVyaSk7CgogIEBvdmVycmlkZQogIEludmFsaWRUeXBlIGdldCB0YXJnZXQgPT4gY29uc3QgSW52YWxpZFR5cGUoKTsKCiAgRGFydFR5cGUgYnVpbGRUeXBlKAogICAgICBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBMaXN0PEtlcm5lbFR5cGVCdWlsZGVyPiBhcmd1bWVudHMpIHsKICAgIHJldHVybiBidWlsZFR5cGVzV2l0aEJ1aWx0QXJndW1lbnRzKGxpYnJhcnksIG51bGwpOwogIH0KCiAgLy8vIFtBcmd1bWVudHNdIGhhdmUgYWxyZWFkeSBiZWVuIGJ1aWx0LgogIERhcnRUeXBlIGJ1aWxkVHlwZXNXaXRoQnVpbHRBcmd1bWVudHMoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cykgewogICAgaWYgKCFzdXBwcmVzc01lc3NhZ2UpIHsKICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKG1lc3NhZ2UubWVzc2FnZU9iamVjdCwgbWVzc2FnZS5jaGFyT2Zmc2V0LAogICAgICAgICAgbWVzc2FnZS5sZW5ndGgsIG1lc3NhZ2UudXJpLAogICAgICAgICAgY29udGV4dDogY29udGV4dCk7CiAgICB9CiAgICByZXR1cm4gY29uc3QgSW52YWxpZFR5cGUoKTsKICB9Cn0KLwBOTjwBKwE9ATIBHUABHz4MIAEmAR4BNjM2AQwxARZDOAQBKyk6HEQnHQYgBAIBQ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2ludmFsaWRfdHlwZV9idWlsZGVyLmRhcnRRc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfbWl4aW5fYXBwbGljYXRpb25fYnVpbGRlci5kYXJ0h5kvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5rZXJuZWxfbWl4aW5fYXBwbGljYXRpb25fYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgSW50ZXJmYWNlVHlwZSwgU3VwZXJ0eXBlOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JyBzaG93IExvY2F0ZWRNZXNzYWdlOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuc3VwcG9ydGVkOwoKaW1wb3J0ICdrZXJuZWxfYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIEtlcm5lbFR5cGVCdWlsZGVyLAogICAgICAgIExpYnJhcnlCdWlsZGVyLAogICAgICAgIE1peGluQXBwbGljYXRpb25CdWlsZGVyLAogICAgICAgIFR5cGVCdWlsZGVyLAogICAgICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXI7CgpjbGFzcyBLZXJuZWxNaXhpbkFwcGxpY2F0aW9uQnVpbGRlcgogICAgZXh0ZW5kcyBNaXhpbkFwcGxpY2F0aW9uQnVpbGRlcjxLZXJuZWxUeXBlQnVpbGRlcj4KICAgIGltcGxlbWVudHMgS2VybmVsVHlwZUJ1aWxkZXIgewogIFN1cGVydHlwZSBidWlsdFR5cGU7CgogIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlczsKCiAgS2VybmVsTWl4aW5BcHBsaWNhdGlvbkJ1aWxkZXIoCiAgICAgIEtlcm5lbFR5cGVCdWlsZGVyIHN1cGVydHlwZSwgTGlzdDxLZXJuZWxUeXBlQnVpbGRlcj4gbWl4aW5zKQogICAgICA6IGFzc2VydChtaXhpbnMgIT0gbnVsbCksCiAgICAgICAgc3VwZXIoc3VwZXJ0eXBlLCBtaXhpbnMpOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGJ1aWxkKExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgIGludCBjaGFyT2Zmc2V0ID0gLTE7IC8vIFRPRE8oYWhlKTogUHJvdmlkZSB0aGVzZS4KICAgIFVyaSBmaWxlVXJpID0gbnVsbDsgLy8gVE9ETyhhaGUpOiBQcm92aWRlIHRoZXNlLgogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCJidWlsZCIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3VwZXJ0eXBlIGJ1aWxkU3VwZXJ0eXBlKAogICAgICBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiYnVpbGRTdXBlcnR5cGUiLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICB9CgogIEBvdmVycmlkZQogIFN1cGVydHlwZSBidWlsZE1peGVkSW5UeXBlKAogICAgICBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiYnVpbGRNaXhlZEluVHlwZSIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYnVpbGRJbnZhbGlkVHlwZShMb2NhdGVkTWVzc2FnZSBtZXNzYWdlLCB7TGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dH0pIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiYnVpbGRJbnZhbGlkVHlwZSIsIG1lc3NhZ2UuY2hhck9mZnNldCwgbWVzc2FnZS51cmkpOwogIH0KCiAgS2VybmVsTWl4aW5BcHBsaWNhdGlvbkJ1aWxkZXIgY2xvbmUoTGlzdDxUeXBlQnVpbGRlcj4gbmV3VHlwZXMpIHsKICAgIGludCBjaGFyT2Zmc2V0ID0gLTE7IC8vIFRPRE8oZG1pdHJ5YXMpOiBQcm92aWRlIHRoZXNlLgogICAgVXJpIGZpbGVVcmkgPSBudWxsOyAvLyBUT0RPKGRtaXRyeWFzKTogUHJvdmlkZSB0aGVzZS4KICAgIHJldHVybiB1bnN1cHBvcnRlZCgiY2xvbmUiLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICB9Cn0KQABOTjwBMAFAATIBLAEdCRsYIRUdASQ3IxcBKwEhQyAiAQwwNjU2BAEMHD0/BAEMHj1BBAEMTU0EAUQ7OjYEAgFIcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfbWl4aW5fYXBwbGljYXRpb25fYnVpbGRlci5kYXJ0SnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX25hbWVkX3R5cGVfYnVpbGRlci5kYXJ0kSkvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5rZXJuZWxfaW50ZXJmYWNlX3R5cGVfYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgRGFydFR5cGUsIFN1cGVydHlwZTsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcgc2hvdyBMb2NhdGVkTWVzc2FnZTsKCmltcG9ydCAnLi4vbWVzc2FnZXMuZGFydCcKICAgIHNob3cgbm9MZW5ndGgsIHRlbXBsYXRlU3VwZXJ0eXBlSXNJbGxlZ2FsLCB0ZW1wbGF0ZVN1cGVydHlwZUlzVHlwZVZhcmlhYmxlOwoKaW1wb3J0ICcuLi9zZXZlcml0eS5kYXJ0JyBzaG93IFNldmVyaXR5OwoKaW1wb3J0ICdrZXJuZWxfYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIEtlcm5lbENsYXNzQnVpbGRlciwKICAgICAgICBLZXJuZWxJbnZhbGlkVHlwZUJ1aWxkZXIsCiAgICAgICAgS2VybmVsVHlwZUJ1aWxkZXIsCiAgICAgICAgTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgTmFtZWRUeXBlQnVpbGRlciwKICAgICAgICBUeXBlQnVpbGRlciwKICAgICAgICBUeXBlRGVjbGFyYXRpb25CdWlsZGVyLAogICAgICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXIsCiAgICAgICAgZmxhdHRlbk5hbWU7CgpjbGFzcyBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyCiAgICBleHRlbmRzIE5hbWVkVHlwZUJ1aWxkZXI8S2VybmVsVHlwZUJ1aWxkZXIsIERhcnRUeXBlPgogICAgaW1wbGVtZW50cyBLZXJuZWxUeXBlQnVpbGRlciB7CiAgS2VybmVsTmFtZWRUeXBlQnVpbGRlcihPYmplY3QgbmFtZSwgTGlzdDxLZXJuZWxUeXBlQnVpbGRlcj4gYXJndW1lbnRzKQogICAgICA6IHN1cGVyKG5hbWUsIGFyZ3VtZW50cyk7CgogIEtlcm5lbEludmFsaWRUeXBlQnVpbGRlciBidWlsZEludmFsaWRUeXBlKExvY2F0ZWRNZXNzYWdlIG1lc3NhZ2UsCiAgICAgIHtMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0fSkgewogICAgLy8gVE9ETyhhaGUpOiBDb25zaWRlciBpZiBpdCBtYWtlcyBzZW5zZSB0byBwYXNzIGEgUXVhbGlmaWVkTmFtZSB0bwogICAgLy8gS2VybmVsSW52YWxpZFR5cGVCdWlsZGVyPwogICAgcmV0dXJuIG5ldyBLZXJuZWxJbnZhbGlkVHlwZUJ1aWxkZXIoCiAgICAgICAgZmxhdHRlbk5hbWUobmFtZSwgbWVzc2FnZS5jaGFyT2Zmc2V0LCBtZXNzYWdlLnVyaSksIG1lc3NhZ2UsCiAgICAgICAgY29udGV4dDogY29udGV4dCk7CiAgfQoKICBTdXBlcnR5cGUgaGFuZGxlSW52YWxpZFN1cGVydHlwZSgKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpKSB7CiAgICB2YXIgdGVtcGxhdGUgPSBkZWNsYXJhdGlvbi5pc1R5cGVWYXJpYWJsZQogICAgICAgID8gdGVtcGxhdGVTdXBlcnR5cGVJc1R5cGVWYXJpYWJsZQogICAgICAgIDogdGVtcGxhdGVTdXBlcnR5cGVJc0lsbGVnYWw7CiAgICBsaWJyYXJ5LmFkZFByb2JsZW0oCiAgICAgICAgdGVtcGxhdGUud2l0aEFyZ3VtZW50cyhmbGF0dGVuTmFtZShuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKSksCiAgICAgICAgY2hhck9mZnNldCwKICAgICAgICBub0xlbmd0aCwKICAgICAgICBmaWxlVXJpKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgRGFydFR5cGUgYnVpbGQoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgcmV0dXJuIGRlY2xhcmF0aW9uLmJ1aWxkVHlwZShsaWJyYXJ5LCBhcmd1bWVudHMpOwogIH0KCiAgU3VwZXJ0eXBlIGJ1aWxkU3VwZXJ0eXBlKAogICAgICBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpIHsKICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgZGVjbGFyYXRpb24gPSB0aGlzLmRlY2xhcmF0aW9uOwogICAgaWYgKGRlY2xhcmF0aW9uIGlzIEtlcm5lbENsYXNzQnVpbGRlcikgewogICAgICByZXR1cm4gZGVjbGFyYXRpb24uYnVpbGRTdXBlcnR5cGUobGlicmFyeSwgYXJndW1lbnRzKTsKICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24gaXMgS2VybmVsSW52YWxpZFR5cGVCdWlsZGVyKSB7CiAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgIGRlY2xhcmF0aW9uLm1lc3NhZ2UubWVzc2FnZU9iamVjdCwKICAgICAgICAgIGRlY2xhcmF0aW9uLm1lc3NhZ2UuY2hhck9mZnNldCwKICAgICAgICAgIGRlY2xhcmF0aW9uLm1lc3NhZ2UubGVuZ3RoLAogICAgICAgICAgZGVjbGFyYXRpb24ubWVzc2FnZS51cmksCiAgICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3IpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBoYW5kbGVJbnZhbGlkU3VwZXJ0eXBlKGxpYnJhcnksIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgfQogIH0KCiAgU3VwZXJ0eXBlIGJ1aWxkTWl4ZWRJblR5cGUoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSkgewogICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciBkZWNsYXJhdGlvbiA9IHRoaXMuZGVjbGFyYXRpb247CiAgICBpZiAoZGVjbGFyYXRpb24gaXMgS2VybmVsQ2xhc3NCdWlsZGVyKSB7CiAgICAgIHJldHVybiBkZWNsYXJhdGlvbi5idWlsZE1peGVkSW5UeXBlKGxpYnJhcnksIGFyZ3VtZW50cyk7CiAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIEtlcm5lbEludmFsaWRUeXBlQnVpbGRlcikgewogICAgICBsaWJyYXJ5LmFkZFByb2JsZW0oCiAgICAgICAgICBkZWNsYXJhdGlvbi5tZXNzYWdlLm1lc3NhZ2VPYmplY3QsCiAgICAgICAgICBkZWNsYXJhdGlvbi5tZXNzYWdlLmNoYXJPZmZzZXQsCiAgICAgICAgICBkZWNsYXJhdGlvbi5tZXNzYWdlLmxlbmd0aCwKICAgICAgICAgIGRlY2xhcmF0aW9uLm1lc3NhZ2UudXJpLAogICAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gaGFuZGxlSW52YWxpZFN1cGVydHlwZShsaWJyYXJ5LCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgIH0KICB9CgogIFR5cGVCdWlsZGVyIHN1YnN0KE1hcDxUeXBlVmFyaWFibGVCdWlsZGVyLCBUeXBlQnVpbGRlcj4gc3Vic3RpdHV0aW9uKSB7CiAgICBUeXBlQnVpbGRlciByZXN1bHQgPSBzdWJzdGl0dXRpb25bZGVjbGFyYXRpb25dOwogICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CiAgICAgIGFzc2VydChkZWNsYXJhdGlvbiBpcyBUeXBlVmFyaWFibGVCdWlsZGVyKTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgTGlzdDxLZXJuZWxUeXBlQnVpbGRlcj4gYXJndW1lbnRzOwogICAgICBpbnQgaSA9IDA7CiAgICAgIGZvciAoS2VybmVsVHlwZUJ1aWxkZXIgYXJndW1lbnQgaW4gdGhpcy5hcmd1bWVudHMpIHsKICAgICAgICBLZXJuZWxUeXBlQnVpbGRlciB0eXBlID0gYXJndW1lbnQuc3Vic3Qoc3Vic3RpdHV0aW9uKTsKICAgICAgICBpZiAodHlwZSAhPSBhcmd1bWVudCkgewogICAgICAgICAgYXJndW1lbnRzID8/PSB0aGlzLmFyZ3VtZW50cy50b0xpc3QoKTsKICAgICAgICAgIGFyZ3VtZW50c1tpXSA9IHR5cGU7CiAgICAgICAgfQogICAgICAgIGkrKzsKICAgICAgfQogICAgICBpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgICByZXR1cm4gbmV3IEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIobmFtZSwgYXJndW1lbnRzKS4uYmluZChkZWNsYXJhdGlvbik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KCiAgS2VybmVsTmFtZWRUeXBlQnVpbGRlciBjbG9uZShMaXN0PFR5cGVCdWlsZGVyPiBuZXdUeXBlcykgewogICAgTGlzdDxLZXJuZWxUeXBlQnVpbGRlcj4gY2xvbmVkQXJndW1lbnRzOwogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGNsb25lZEFyZ3VtZW50cyA9IG5ldyBMaXN0PEtlcm5lbFR5cGVCdWlsZGVyPihhcmd1bWVudHMubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbG9uZWRBcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICBjbG9uZWRBcmd1bWVudHNbaV0gPSBhcmd1bWVudHNbaV0uY2xvbmUobmV3VHlwZXMpOwogICAgICB9CiAgICB9CiAgICBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyIG5ld1R5cGUgPQogICAgICAgIG5ldyBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyKG5hbWUsIGNsb25lZEFyZ3VtZW50cyk7CiAgICBuZXdUeXBlcy5hZGQobmV3VHlwZSk7CiAgICByZXR1cm4gbmV3VHlwZTsKICB9Cn0KgIYATk48AS0BOwEyARpQASkBHQkcIhsYGhUgHRUBHTojSSABRChIISlFGwQBJD0uKiYYSBQSEhEEASs2BAEcPTstPToaLSomIyUTDUMGBAEePTstPzoaLSomIyUTDUMGBAFKNBoyFSQpETs/IDEfCg0IH08IBhEEAT0tHUc5OwgGJTsbFAQCAUFwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF9uYW1lZF90eXBlX2J1aWxkZXIuZGFydEZzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF9wcmVmaXhfYnVpbGRlci5kYXJ0g8UvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5rZXJuZWxfcHJlZml4X2J1aWxkZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IExpYnJhcnlEZXBlbmRlbmN5OwoKaW1wb3J0ICcuLi9idWlsZGVyL2J1aWxkZXIuZGFydCcgc2hvdyBMaWJyYXJ5QnVpbGRlciwgUHJlZml4QnVpbGRlcjsKCmltcG9ydCAnbG9hZF9saWJyYXJ5X2J1aWxkZXIuZGFydCcgc2hvdyBMb2FkTGlicmFyeUJ1aWxkZXI7CgpjbGFzcyBLZXJuZWxQcmVmaXhCdWlsZGVyIGV4dGVuZHMgUHJlZml4QnVpbGRlciB7CiAgZmluYWwgTGlicmFyeURlcGVuZGVuY3kgZGVwZW5kZW5jeTsKCiAgTG9hZExpYnJhcnlCdWlsZGVyIGxvYWRMaWJyYXJ5QnVpbGRlcjsKCiAgS2VybmVsUHJlZml4QnVpbGRlcihTdHJpbmcgbmFtZSwgYm9vbCBkZWZlcnJlZCwgTGlicmFyeUJ1aWxkZXIgcGFyZW50LAogICAgICB0aGlzLmRlcGVuZGVuY3ksIGludCBjaGFyT2Zmc2V0LCBpbnQgaW1wb3J0SW5kZXgpCiAgICAgIDogc3VwZXIobmFtZSwgZGVmZXJyZWQsIHBhcmVudCwgY2hhck9mZnNldCwgaW1wb3J0SW5kZXgpIHsKICAgIGlmIChkZWZlcnJlZCkgewogICAgICBsb2FkTGlicmFyeUJ1aWxkZXIgPQogICAgICAgICAgbmV3IExvYWRMaWJyYXJ5QnVpbGRlcihwYXJlbnQsIGRlcGVuZGVuY3ksIGNoYXJPZmZzZXQpOwogICAgICBhZGRUb0V4cG9ydFNjb3BlKCdsb2FkTGlicmFyeScsIGxvYWRMaWJyYXJ5QnVpbGRlciwgY2hhck9mZnNldCk7CiAgICB9CiAgfQp9Ch0ATk48ASUBOQFFATwBMiYBKQFJOEEUG0JHBgQCAT1wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF9wcmVmaXhfYnVpbGRlci5kYXJ0SXNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX3Byb2NlZHVyZV9idWlsZGVyLmRhcnTAAFoQLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEua2VybmVsX3Byb2NlZHVyZV9idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBBcmd1bWVudHMsCiAgICAgICAgQXN5bmNNYXJrZXIsCiAgICAgICAgQ2xhc3MsCiAgICAgICAgQ29uc3RydWN0b3IsCiAgICAgICAgQ29uc3RydWN0b3JJbnZvY2F0aW9uLAogICAgICAgIERhcnRUeXBlLAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEVtcHR5U3RhdGVtZW50LAogICAgICAgIEV4cHJlc3Npb24sCiAgICAgICAgRnVuY3Rpb25Ob2RlLAogICAgICAgIEluaXRpYWxpemVyLAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgTWVtYmVyLAogICAgICAgIE5hbWUsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFByb2NlZHVyZUtpbmQsCiAgICAgICAgUmVkaXJlY3RpbmdJbml0aWFsaXplciwKICAgICAgICBTdGF0ZW1lbnQsCiAgICAgICAgU3RhdGljSW52b2NhdGlvbiwKICAgICAgICBTdHJpbmdMaXRlcmFsLAogICAgICAgIFN1cGVySW5pdGlhbGl6ZXIsCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uLAogICAgICAgIFZvaWRUeXBlLAogICAgICAgIHNldFBhcmVudHM7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JyBzaG93IGNvbnRhaW5zVHlwZVZhcmlhYmxlLCBzdWJzdGl0dXRlOwoKaW1wb3J0ICcuLi9sb2FkZXIuZGFydCcgc2hvdyBMb2FkZXI7CgppbXBvcnQgJy4uL21lc3NhZ2VzLmRhcnQnCiAgICBzaG93CiAgICAgICAgTWVzc2FnZSwKICAgICAgICBtZXNzYWdlQ29uc3RGYWN0b3J5UmVkaXJlY3Rpb25Ub05vbkNvbnN0LAogICAgICAgIG1lc3NhZ2VNb3JlVGhhbk9uZVN1cGVyT3JUaGlzSW5pdGlhbGl6ZXIsCiAgICAgICAgbWVzc2FnZU5vbkluc3RhbmNlVHlwZVZhcmlhYmxlVXNlLAogICAgICAgIG1lc3NhZ2VQYXRjaERlY2xhcmF0aW9uTWlzbWF0Y2gsCiAgICAgICAgbWVzc2FnZVBhdGNoRGVjbGFyYXRpb25PcmlnaW4sCiAgICAgICAgbWVzc2FnZVBhdGNoTm9uRXh0ZXJuYWwsCiAgICAgICAgbWVzc2FnZVN1cGVySW5pdGlhbGl6ZXJOb3RMYXN0LAogICAgICAgIG1lc3NhZ2VUaGlzSW5pdGlhbGl6ZXJOb3RBbG9uZSwKICAgICAgICBub0xlbmd0aDsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyB1bmV4cGVjdGVkOwoKaW1wb3J0ICcuLi9zb3VyY2Uvc291cmNlX2xpYnJhcnlfYnVpbGRlci5kYXJ0JyBzaG93IFNvdXJjZUxpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX2luZmVyZW5jZV9lbmdpbmUuZGFydCcKICAgIHNob3cgSW5jbHVkZXNUeXBlUGFyYW1ldGVyc0NvdmFyaWFudGx5OwoKaW1wb3J0ICdrZXJuZWxfYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIENsYXNzQnVpbGRlciwKICAgICAgICBDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXIsCiAgICAgICAgRGVjbGFyYXRpb24sCiAgICAgICAgRm9ybWFsUGFyYW1ldGVyQnVpbGRlciwKICAgICAgICBLZXJuZWxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyLAogICAgICAgIEtlcm5lbExpYnJhcnlCdWlsZGVyLAogICAgICAgIEtlcm5lbFR5cGVCdWlsZGVyLAogICAgICAgIEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXIsCiAgICAgICAgTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgTWV0YWRhdGFCdWlsZGVyLAogICAgICAgIFByb2NlZHVyZUJ1aWxkZXIsCiAgICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlciwKICAgICAgICBpc1JlZGlyZWN0aW5nR2VuZXJhdGl2ZUNvbnN0cnVjdG9ySW1wbGVtZW50YXRpb247CgppbXBvcnQgJ2tlcm5lbF9zaGFkb3dfYXN0LmRhcnQnCiAgICBzaG93IFNoYWRvd1Byb2NlZHVyZSwgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50OwoKaW1wb3J0ICdyZWRpcmVjdGluZ19mYWN0b3J5X2JvZHkuZGFydCcgc2hvdyBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5OwoKaW1wb3J0ICdleHByZXNzaW9uX2dlbmVyYXRvcl9oZWxwZXIuZGFydCcgc2hvdyBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyOwoKYWJzdHJhY3QgY2xhc3MgS2VybmVsRnVuY3Rpb25CdWlsZGVyCiAgICBleHRlbmRzIFByb2NlZHVyZUJ1aWxkZXI8S2VybmVsVHlwZUJ1aWxkZXI+IHsKICBmaW5hbCBTdHJpbmcgbmF0aXZlTWV0aG9kTmFtZTsKCiAgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uOwoKICBTdGF0ZW1lbnQgYWN0dWFsQm9keTsKCiAgS2VybmVsRnVuY3Rpb25CdWlsZGVyKAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIGludCBtb2RpZmllcnMsCiAgICAgIEtlcm5lbFR5cGVCdWlsZGVyIHJldHVyblR5cGUsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMsCiAgICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscywKICAgICAgS2VybmVsTGlicmFyeUJ1aWxkZXIgY29tcGlsYXRpb25Vbml0LAogICAgICBpbnQgY2hhck9mZnNldCwKICAgICAgdGhpcy5uYXRpdmVNZXRob2ROYW1lKQogICAgICA6IHN1cGVyKG1ldGFkYXRhLCBtb2RpZmllcnMsIHJldHVyblR5cGUsIG5hbWUsIHR5cGVWYXJpYWJsZXMsIGZvcm1hbHMsCiAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdCwgY2hhck9mZnNldCk7CgogIEtlcm5lbEZ1bmN0aW9uQnVpbGRlciBnZXQgYWN0dWFsT3JpZ2luOwoKICB2b2lkIHNldCBib2R5KFN0YXRlbWVudCBuZXdCb2R5KSB7Ci8vICAgIGlmIChuZXdCb2R5ICE9IG51bGwpIHsKLy8gICAgICBpZiAoaXNBYnN0cmFjdCkgewovLyAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IElzIHRoaXMgY2hlY2sgbmVlZGVkPwovLyAgICAgICAgcmV0dXJuIGludGVybmFsUHJvYmxlbShtZXNzYWdlSW50ZXJuYWxQcm9ibGVtQm9keU9uQWJzdHJhY3RNZXRob2QsCi8vICAgICAgICAgICAgbmV3Qm9keS5maWxlT2Zmc2V0LCBmaWxlVXJpKTsKLy8gICAgICB9Ci8vICAgIH0KICAgIGFjdHVhbEJvZHkgPSBuZXdCb2R5OwogICAgaWYgKGZ1bmN0aW9uICE9IG51bGwpIHsKICAgICAgLy8gQSBmb3J3YXJkaW5nIHNlbWktc3R1YiBpcyBhIG1ldGhvZCB0aGF0IGlzIGFic3RyYWN0IGluIHRoZSBzb3VyY2UgY29kZSwKICAgICAgLy8gYnV0IHdoaWNoIG5lZWRzIHRvIGhhdmUgYSBmb3J3YXJkaW5nIHN0dWIgYm9keSBpbiBvcmRlciB0byBlbnN1cmUgdGhhdAogICAgICAvLyBjb3ZhcmlhbmNlIGNoZWNrcyBvY2N1ci4gIFdlIGRvbid0IHdhbnQgdG8gcmVwbGFjZSB0aGUgZm9yd2FyZGluZyBzdHViCiAgICAgIC8vIGJvZHkgd2l0aCBudWxsLgogICAgICB2YXIgcGFyZW50ID0gZnVuY3Rpb24ucGFyZW50OwogICAgICBpZiAoIShuZXdCb2R5ID09IG51bGwgJiYKICAgICAgICAgIHBhcmVudCBpcyBQcm9jZWR1cmUgJiYKICAgICAgICAgIHBhcmVudC5pc0ZvcndhcmRpbmdTZW1pU3R1YikpIHsKICAgICAgICBmdW5jdGlvbi5ib2R5ID0gbmV3Qm9keTsKICAgICAgICBuZXdCb2R5Py5wYXJlbnQgPSBmdW5jdGlvbjsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBzZXRSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KE1lbWJlciB0YXJnZXQsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIGlmIChhY3R1YWxCb2R5ICE9IG51bGwpIHsKICAgICAgdW5leHBlY3RlZCgibnVsbCIsICIke2FjdHVhbEJvZHkucnVudGltZVR5cGV9IiwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICB9CiAgICBhY3R1YWxCb2R5ID0gbmV3IFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkodGFyZ2V0LCB0eXBlQXJndW1lbnRzKTsKICAgIGZ1bmN0aW9uLmJvZHkgPSBhY3R1YWxCb2R5OwogICAgYWN0dWFsQm9keT8ucGFyZW50ID0gZnVuY3Rpb247CiAgICBpZiAoaXNQYXRjaCkgewogICAgICBhY3R1YWxPcmlnaW4uc2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keSh0YXJnZXQsIHR5cGVBcmd1bWVudHMpOwogICAgfQogIH0KCiAgU3RhdGVtZW50IGdldCBib2R5ID0+IGFjdHVhbEJvZHkgPz89IG5ldyBFbXB0eVN0YXRlbWVudCgpOwoKICBib29sIGdldCBpc05hdGl2ZSA9PiBuYXRpdmVNZXRob2ROYW1lICE9IG51bGw7CgogIEZ1bmN0aW9uTm9kZSBidWlsZEZ1bmN0aW9uKExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgIGFzc2VydChmdW5jdGlvbiA9PSBudWxsKTsKICAgIEZ1bmN0aW9uTm9kZSByZXN1bHQgPSBuZXcgRnVuY3Rpb25Ob2RlKGJvZHksIGFzeW5jTWFya2VyOiBhc3luY01vZGlmaWVyKTsKICAgIEluY2x1ZGVzVHlwZVBhcmFtZXRlcnNDb3ZhcmlhbnRseSBuZWVkc0NoZWNrVmlzaXRvcjsKICAgIGlmICghaXNDb25zdHJ1Y3RvciAmJiAhaXNGYWN0b3J5ICYmIHBhcmVudCBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgQ2xhc3MgZW5jbG9zaW5nQ2xhc3MgPSBwYXJlbnQudGFyZ2V0OwogICAgICBpZiAoZW5jbG9zaW5nQ2xhc3MudHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICAgIG5lZWRzQ2hlY2tWaXNpdG9yID0gbmV3IEluY2x1ZGVzVHlwZVBhcmFtZXRlcnNDb3ZhcmlhbnRseSgKICAgICAgICAgICAgZW5jbG9zaW5nQ2xhc3MudHlwZVBhcmFtZXRlcnMpOwogICAgICB9CiAgICB9CiAgICBpZiAodHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoS2VybmVsVHlwZVZhcmlhYmxlQnVpbGRlciB0IGluIHR5cGVWYXJpYWJsZXMpIHsKICAgICAgICBUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciA9IHQucGFyYW1ldGVyOwogICAgICAgIHJlc3VsdC50eXBlUGFyYW1ldGVycy5hZGQocGFyYW1ldGVyKTsKICAgICAgICBpZiAobmVlZHNDaGVja1Zpc2l0b3IgIT0gbnVsbCkgewogICAgICAgICAgaWYgKHBhcmFtZXRlci5ib3VuZC5hY2NlcHQobmVlZHNDaGVja1Zpc2l0b3IpKSB7CiAgICAgICAgICAgIHBhcmFtZXRlci5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgc2V0UGFyZW50cyhyZXN1bHQudHlwZVBhcmFtZXRlcnMsIHJlc3VsdCk7CiAgICB9CiAgICBpZiAoZm9ybWFscyAhPSBudWxsKSB7CiAgICAgIGZvciAoS2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgaW4gZm9ybWFscykgewogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyID0gZm9ybWFsLmJ1aWxkKGxpYnJhcnksIDApOwogICAgICAgIGlmIChuZWVkc0NoZWNrVmlzaXRvciAhPSBudWxsKSB7CiAgICAgICAgICBpZiAocGFyYW1ldGVyLnR5cGUuYWNjZXB0KG5lZWRzQ2hlY2tWaXNpdG9yKSkgewogICAgICAgICAgICBwYXJhbWV0ZXIuaXNHZW5lcmljQ292YXJpYW50SW1wbCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChmb3JtYWwuaXNOYW1lZCkgewogICAgICAgICAgcmVzdWx0Lm5hbWVkUGFyYW1ldGVycy5hZGQocGFyYW1ldGVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzdWx0LnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmFkZChwYXJhbWV0ZXIpOwogICAgICAgIH0KICAgICAgICBwYXJhbWV0ZXIucGFyZW50ID0gcmVzdWx0OwogICAgICAgIGlmIChmb3JtYWwuaXNSZXF1aXJlZCkgewogICAgICAgICAgcmVzdWx0LnJlcXVpcmVkUGFyYW1ldGVyQ291bnQrKzsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChpc1NldHRlciAmJiAoZm9ybWFscz8ubGVuZ3RoICE9IDEgfHwgZm9ybWFsc1swXS5pc09wdGlvbmFsKSkgewogICAgICAvLyBSZXBsYWNlIGlsbGVnYWwgcGFyYW1ldGVycyBieSBzaW5nbGUgZHVtbXkgcGFyYW1ldGVyLgogICAgICAvLyBEbyB0aGlzIGFmdGVyIGJ1aWxkaW5nIHRoZSBwYXJhbWV0ZXJzLCBzaW5jZSB0aGUgZGlldCBsaXN0ZW5lcgogICAgICAvLyBhc3N1bWVzIHRoYXQgcGFyYW1ldGVycyBhcmUgYnVpbHQsIGV2ZW4gaWYgaWxsZWdhbCBpbiBudW1iZXIuCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyID0KICAgICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQoIiNzeW50aGV0aWMiLCAwKTsKICAgICAgcmVzdWx0LnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmNsZWFyKCk7CiAgICAgIHJlc3VsdC5wb3NpdGlvbmFsUGFyYW1ldGVycy5hZGQocGFyYW1ldGVyKTsKICAgICAgcGFyYW1ldGVyLnBhcmVudCA9IHJlc3VsdDsKICAgICAgcmVzdWx0Lm5hbWVkUGFyYW1ldGVycy5jbGVhcigpOwogICAgICByZXN1bHQucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA9IDE7CiAgICB9CiAgICBpZiAocmV0dXJuVHlwZSAhPSBudWxsKSB7CiAgICAgIHJlc3VsdC5yZXR1cm5UeXBlID0gcmV0dXJuVHlwZS5idWlsZChsaWJyYXJ5KTsKICAgIH0KICAgIGlmICghaXNDb25zdHJ1Y3RvciAmJiAhaXNJbnN0YW5jZU1lbWJlciAmJiBwYXJlbnQgaXMgQ2xhc3NCdWlsZGVyKSB7CiAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPSBwYXJlbnQudGFyZ2V0LnR5cGVQYXJhbWV0ZXJzOwogICAgICBpZiAodHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gc3Vic3RpdHV0aW9uOwogICAgICAgIERhcnRUeXBlIHJlbW92ZVR5cGVWYXJpYWJsZXMoRGFydFR5cGUgdHlwZSkgewogICAgICAgICAgaWYgKHN1YnN0aXR1dGlvbiA9PSBudWxsKSB7CiAgICAgICAgICAgIHN1YnN0aXR1dGlvbiA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgICAgICAgICAgZm9yIChUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciBpbiB0eXBlUGFyYW1ldGVycykgewogICAgICAgICAgICAgIHN1YnN0aXR1dGlvbltwYXJhbWV0ZXJdID0gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgICAgIG1lc3NhZ2VOb25JbnN0YW5jZVR5cGVWYXJpYWJsZVVzZSwgY2hhck9mZnNldCwgbm9MZW5ndGgsIGZpbGVVcmkpOwogICAgICAgICAgcmV0dXJuIHN1YnN0aXR1dGUodHlwZSwgc3Vic3RpdHV0aW9uKTsKICAgICAgICB9CgogICAgICAgIFNldDxUeXBlUGFyYW1ldGVyPiBzZXQgPSB0eXBlUGFyYW1ldGVycy50b1NldCgpOwogICAgICAgIGZvciAoVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgaW4gcmVzdWx0LnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgICAgICBpZiAoY29udGFpbnNUeXBlVmFyaWFibGUocGFyYW1ldGVyLnR5cGUsIHNldCkpIHsKICAgICAgICAgICAgcGFyYW1ldGVyLnR5cGUgPSByZW1vdmVUeXBlVmFyaWFibGVzKHBhcmFtZXRlci50eXBlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciBpbiByZXN1bHQubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgICAgICBpZiAoY29udGFpbnNUeXBlVmFyaWFibGUocGFyYW1ldGVyLnR5cGUsIHNldCkpIHsKICAgICAgICAgICAgcGFyYW1ldGVyLnR5cGUgPSByZW1vdmVUeXBlVmFyaWFibGVzKHBhcmFtZXRlci50eXBlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGNvbnRhaW5zVHlwZVZhcmlhYmxlKHJlc3VsdC5yZXR1cm5UeXBlLCBzZXQpKSB7CiAgICAgICAgICByZXN1bHQucmV0dXJuVHlwZSA9IHJlbW92ZVR5cGVWYXJpYWJsZXMocmVzdWx0LnJldHVyblR5cGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGZ1bmN0aW9uID0gcmVzdWx0OwogIH0KCiAgTWVtYmVyIGJ1aWxkKFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnkpOwoKICB2b2lkIGJlY29tZU5hdGl2ZShMb2FkZXIgbG9hZGVyKSB7CiAgICBEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvciA9IGxvYWRlci5nZXROYXRpdmVBbm5vdGF0aW9uKCk7CiAgICBBcmd1bWVudHMgYXJndW1lbnRzID0KICAgICAgICBuZXcgQXJndW1lbnRzKDxFeHByZXNzaW9uPltuZXcgU3RyaW5nTGl0ZXJhbChuYXRpdmVNZXRob2ROYW1lKV0pOwogICAgRXhwcmVzc2lvbiBhbm5vdGF0aW9uOwogICAgaWYgKGNvbnN0cnVjdG9yLmlzQ29uc3RydWN0b3IpIHsKICAgICAgYW5ub3RhdGlvbiA9IG5ldyBDb25zdHJ1Y3Rvckludm9jYXRpb24oY29uc3RydWN0b3IudGFyZ2V0LCBhcmd1bWVudHMpCiAgICAgICAgLi5pc0NvbnN0ID0gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGFubm90YXRpb24gPSBuZXcgU3RhdGljSW52b2NhdGlvbihjb25zdHJ1Y3Rvci50YXJnZXQsIGFyZ3VtZW50cykKICAgICAgICAuLmlzQ29uc3QgPSB0cnVlOwogICAgfQogICAgdGFyZ2V0LmFkZEFubm90YXRpb24oYW5ub3RhdGlvbik7CiAgfQoKICBib29sIGNoZWNrUGF0Y2goS2VybmVsRnVuY3Rpb25CdWlsZGVyIHBhdGNoKSB7CiAgICBpZiAoIWlzRXh0ZXJuYWwpIHsKICAgICAgcGF0Y2gubGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgbWVzc2FnZVBhdGNoTm9uRXh0ZXJuYWwsIHBhdGNoLmNoYXJPZmZzZXQsIG5vTGVuZ3RoLCBwYXRjaC5maWxlVXJpLAogICAgICAgICAgY29udGV4dDogWwogICAgICAgICAgICBtZXNzYWdlUGF0Y2hEZWNsYXJhdGlvbk9yaWdpbi53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgICBmaWxlVXJpLCBjaGFyT2Zmc2V0LCBub0xlbmd0aCkKICAgICAgICAgIF0pOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHZvaWQgcmVwb3J0UGF0Y2hNaXNtYXRjaChEZWNsYXJhdGlvbiBwYXRjaCkgewogICAgbGlicmFyeS5hZGRQcm9ibGVtKG1lc3NhZ2VQYXRjaERlY2xhcmF0aW9uTWlzbWF0Y2gsIHBhdGNoLmNoYXJPZmZzZXQsCiAgICAgICAgbm9MZW5ndGgsIHBhdGNoLmZpbGVVcmksIGNvbnRleHQ6IFsKICAgICAgbWVzc2FnZVBhdGNoRGVjbGFyYXRpb25PcmlnaW4ud2l0aExvY2F0aW9uKGZpbGVVcmksIGNoYXJPZmZzZXQsIG5vTGVuZ3RoKQogICAgXSk7CiAgfQp9CgpjbGFzcyBLZXJuZWxQcm9jZWR1cmVCdWlsZGVyIGV4dGVuZHMgS2VybmVsRnVuY3Rpb25CdWlsZGVyIHsKICBmaW5hbCBTaGFkb3dQcm9jZWR1cmUgcHJvY2VkdXJlOwogIGZpbmFsIGludCBjaGFyT3BlblBhcmVuT2Zmc2V0OwoKICBBc3luY01hcmtlciBhY3R1YWxBc3luY01vZGlmaWVyID0gQXN5bmNNYXJrZXIuU3luYzsKCiAgQG92ZXJyaWRlCiAgS2VybmVsUHJvY2VkdXJlQnVpbGRlciBhY3R1YWxPcmlnaW47CgogIEtlcm5lbFByb2NlZHVyZUJ1aWxkZXIoCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgS2VybmVsVHlwZUJ1aWxkZXIgcmV0dXJuVHlwZSwKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywKICAgICAgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBmb3JtYWxzLAogICAgICBQcm9jZWR1cmVLaW5kIGtpbmQsCiAgICAgIEtlcm5lbExpYnJhcnlCdWlsZGVyIGNvbXBpbGF0aW9uVW5pdCwKICAgICAgaW50IHN0YXJ0Q2hhck9mZnNldCwKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIHRoaXMuY2hhck9wZW5QYXJlbk9mZnNldCwKICAgICAgaW50IGNoYXJFbmRPZmZzZXQsCiAgICAgIFtTdHJpbmcgbmF0aXZlTWV0aG9kTmFtZV0pCiAgICAgIDogcHJvY2VkdXJlID0gbmV3IFNoYWRvd1Byb2NlZHVyZShudWxsLCBraW5kLCBudWxsLCByZXR1cm5UeXBlID09IG51bGwsCiAgICAgICAgICAgIGZpbGVVcmk6IGNvbXBpbGF0aW9uVW5pdD8uZmlsZVVyaSkKICAgICAgICAgIC4uc3RhcnRGaWxlT2Zmc2V0ID0gc3RhcnRDaGFyT2Zmc2V0CiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0CiAgICAgICAgICAuLmZpbGVFbmRPZmZzZXQgPSBjaGFyRW5kT2Zmc2V0LAogICAgICAgIHN1cGVyKG1ldGFkYXRhLCBtb2RpZmllcnMsIHJldHVyblR5cGUsIG5hbWUsIHR5cGVWYXJpYWJsZXMsIGZvcm1hbHMsCiAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdCwgY2hhck9mZnNldCwgbmF0aXZlTWV0aG9kTmFtZSk7CgogIEBvdmVycmlkZQogIEtlcm5lbFByb2NlZHVyZUJ1aWxkZXIgZ2V0IG9yaWdpbiA9PiBhY3R1YWxPcmlnaW4gPz8gdGhpczsKCiAgUHJvY2VkdXJlS2luZCBnZXQga2luZCA9PiBwcm9jZWR1cmUua2luZDsKCiAgQXN5bmNNYXJrZXIgZ2V0IGFzeW5jTW9kaWZpZXIgPT4gYWN0dWFsQXN5bmNNb2RpZmllcjsKCiAgU3RhdGVtZW50IGdldCBib2R5IHsKICAgIGlmIChhY3R1YWxCb2R5ID09IG51bGwgJiYgIWlzQWJzdHJhY3QgJiYgIWlzRXh0ZXJuYWwpIHsKICAgICAgYWN0dWFsQm9keSA9IG5ldyBFbXB0eVN0YXRlbWVudCgpOwogICAgfQogICAgcmV0dXJuIGFjdHVhbEJvZHk7CiAgfQoKICB2b2lkIHNldCBhc3luY01vZGlmaWVyKEFzeW5jTWFya2VyIG5ld01vZGlmaWVyKSB7CiAgICBhY3R1YWxBc3luY01vZGlmaWVyID0gbmV3TW9kaWZpZXI7CiAgICBpZiAoZnVuY3Rpb24gIT0gbnVsbCkgewogICAgICAvLyBObyBwYXJlbnQsIGl0J3MgYW4gZW51bS4KICAgICAgZnVuY3Rpb24uYXN5bmNNYXJrZXIgPSBhY3R1YWxBc3luY01vZGlmaWVyOwogICAgICBmdW5jdGlvbi5kYXJ0QXN5bmNNYXJrZXIgPSBhY3R1YWxBc3luY01vZGlmaWVyOwogICAgfQogIH0KCiAgYm9vbCBnZXQgaXNFbGlnaWJsZUZvclRvcExldmVsSW5mZXJlbmNlIHsKICAgIGlmIChsaWJyYXJ5LmxlZ2FjeU1vZGUpIHJldHVybiBmYWxzZTsKICAgIGlmIChpc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgIGlmIChyZXR1cm5UeXBlID09IG51bGwpIHJldHVybiB0cnVlOwogICAgICBpZiAoZm9ybWFscyAhPSBudWxsKSB7CiAgICAgICAgZm9yICh2YXIgZm9ybWFsIGluIGZvcm1hbHMpIHsKICAgICAgICAgIGlmIChmb3JtYWwudHlwZSA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIFByb2NlZHVyZSBidWlsZChTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICAvLyBUT0RPKGFoZSk6IEkgdGhpbmsgd2UgbWF5IGNhbGwgdGhpcyB0d2ljZSBvbiBwYXJ0cy4gSW52ZXN0aWdhdGUuCiAgICBpZiAocHJvY2VkdXJlLm5hbWUgPT0gbnVsbCkgewogICAgICBwcm9jZWR1cmUuZnVuY3Rpb24gPSBidWlsZEZ1bmN0aW9uKGxpYnJhcnkpOwogICAgICBwcm9jZWR1cmUuZnVuY3Rpb24ucGFyZW50ID0gcHJvY2VkdXJlOwogICAgICBwcm9jZWR1cmUuZnVuY3Rpb24uZmlsZU9mZnNldCA9IGNoYXJPcGVuUGFyZW5PZmZzZXQ7CiAgICAgIHByb2NlZHVyZS5mdW5jdGlvbi5maWxlRW5kT2Zmc2V0ID0gcHJvY2VkdXJlLmZpbGVFbmRPZmZzZXQ7CiAgICAgIHByb2NlZHVyZS5pc0Fic3RyYWN0ID0gaXNBYnN0cmFjdDsKICAgICAgcHJvY2VkdXJlLmlzU3RhdGljID0gaXNTdGF0aWM7CiAgICAgIHByb2NlZHVyZS5pc0V4dGVybmFsID0gaXNFeHRlcm5hbDsKICAgICAgcHJvY2VkdXJlLmlzQ29uc3QgPSBpc0NvbnN0OwogICAgICBwcm9jZWR1cmUubmFtZSA9IG5ldyBOYW1lKG5hbWUsIGxpYnJhcnkudGFyZ2V0KTsKICAgIH0KICAgIGlmICghbGlicmFyeS5sb2FkZXIudGFyZ2V0LmxlZ2FjeU1vZGUgJiYKICAgICAgICAoaXNTZXR0ZXIgfHwgKGlzT3BlcmF0b3IgJiYgbmFtZSA9PSAnW109JykpICYmCiAgICAgICAgcmV0dXJuVHlwZSA9PSBudWxsKSB7CiAgICAgIHByb2NlZHVyZS5mdW5jdGlvbi5yZXR1cm5UeXBlID0gY29uc3QgVm9pZFR5cGUoKTsKICAgIH0KICAgIHJldHVybiBwcm9jZWR1cmU7CiAgfQoKICBQcm9jZWR1cmUgZ2V0IHRhcmdldCA9PiBvcmlnaW4ucHJvY2VkdXJlOwoKICBAb3ZlcnJpZGUKICBpbnQgZmluaXNoUGF0Y2goKSB7CiAgICBpZiAoIWlzUGF0Y2gpIHJldHVybiAwOwoKICAgIC8vIFRPRE8oYWhlKTogcmVzdG9yZSBmaWxlLW9mZnNldCBvbmNlIHdlIHRyYWNrIGJvdGggb3JpZ2luIGFuZCBwYXRjaCBmaWxlCiAgICAvLyBVUklzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzMxNTc5CiAgICBvcmlnaW4ucHJvY2VkdXJlLmZpbGVVcmkgPSBmaWxlVXJpOwogICAgb3JpZ2luLnByb2NlZHVyZS5zdGFydEZpbGVPZmZzZXQgPSBwcm9jZWR1cmUuc3RhcnRGaWxlT2Zmc2V0OwogICAgb3JpZ2luLnByb2NlZHVyZS5maWxlT2Zmc2V0ID0gcHJvY2VkdXJlLmZpbGVPZmZzZXQ7CiAgICBvcmlnaW4ucHJvY2VkdXJlLmZpbGVFbmRPZmZzZXQgPSBwcm9jZWR1cmUuZmlsZUVuZE9mZnNldDsKICAgIG9yaWdpbi5wcm9jZWR1cmUuYW5ub3RhdGlvbnMKICAgICAgICAuZm9yRWFjaCgobSkgPT4gbS5maWxlT2Zmc2V0ID0gcHJvY2VkdXJlLmZpbGVPZmZzZXQpOwoKICAgIG9yaWdpbi5wcm9jZWR1cmUuaXNBYnN0cmFjdCA9IHByb2NlZHVyZS5pc0Fic3RyYWN0OwogICAgb3JpZ2luLnByb2NlZHVyZS5pc0V4dGVybmFsID0gcHJvY2VkdXJlLmlzRXh0ZXJuYWw7CiAgICBvcmlnaW4ucHJvY2VkdXJlLmZ1bmN0aW9uID0gcHJvY2VkdXJlLmZ1bmN0aW9uOwogICAgb3JpZ2luLnByb2NlZHVyZS5mdW5jdGlvbi5wYXJlbnQgPSBvcmlnaW4ucHJvY2VkdXJlOwogICAgcmV0dXJuIDE7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlY29tZU5hdGl2ZShMb2FkZXIgbG9hZGVyKSB7CiAgICBwcm9jZWR1cmUuaXNFeHRlcm5hbCA9IHRydWU7CiAgICBzdXBlci5iZWNvbWVOYXRpdmUobG9hZGVyKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYXBwbHlQYXRjaChEZWNsYXJhdGlvbiBwYXRjaCkgewogICAgaWYgKHBhdGNoIGlzIEtlcm5lbFByb2NlZHVyZUJ1aWxkZXIpIHsKICAgICAgaWYgKGNoZWNrUGF0Y2gocGF0Y2gpKSB7CiAgICAgICAgcGF0Y2guYWN0dWFsT3JpZ2luID0gdGhpczsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmVwb3J0UGF0Y2hNaXNtYXRjaChwYXRjaCk7CiAgICB9CiAgfQp9CgovLyBUT0RPKGFoZSk6IE1vdmUgdGhpcyB0byBvd24gZmlsZT8KY2xhc3MgS2VybmVsQ29uc3RydWN0b3JCdWlsZGVyIGV4dGVuZHMgS2VybmVsRnVuY3Rpb25CdWlsZGVyIHsKICBmaW5hbCBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcjsKCiAgZmluYWwgaW50IGNoYXJPcGVuUGFyZW5PZmZzZXQ7CgogIGJvb2wgaGFzTW92ZWRTdXBlckluaXRpYWxpemVyID0gZmFsc2U7CgogIFN1cGVySW5pdGlhbGl6ZXIgc3VwZXJJbml0aWFsaXplcjsKCiAgUmVkaXJlY3RpbmdJbml0aWFsaXplciByZWRpcmVjdGluZ0luaXRpYWxpemVyOwoKICBAb3ZlcnJpZGUKICBLZXJuZWxDb25zdHJ1Y3RvckJ1aWxkZXIgYWN0dWFsT3JpZ2luOwoKICBLZXJuZWxDb25zdHJ1Y3RvckJ1aWxkZXIoCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgS2VybmVsVHlwZUJ1aWxkZXIgcmV0dXJuVHlwZSwKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywKICAgICAgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBmb3JtYWxzLAogICAgICBLZXJuZWxMaWJyYXJ5QnVpbGRlciBjb21waWxhdGlvblVuaXQsCiAgICAgIGludCBzdGFydENoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICB0aGlzLmNoYXJPcGVuUGFyZW5PZmZzZXQsCiAgICAgIGludCBjaGFyRW5kT2Zmc2V0LAogICAgICBbU3RyaW5nIG5hdGl2ZU1ldGhvZE5hbWVdKQogICAgICA6IGNvbnN0cnVjdG9yID0gbmV3IENvbnN0cnVjdG9yKG51bGwsIGZpbGVVcmk6IGNvbXBpbGF0aW9uVW5pdD8uZmlsZVVyaSkKICAgICAgICAgIC4uc3RhcnRGaWxlT2Zmc2V0ID0gc3RhcnRDaGFyT2Zmc2V0CiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0CiAgICAgICAgICAuLmZpbGVFbmRPZmZzZXQgPSBjaGFyRW5kT2Zmc2V0LAogICAgICAgIHN1cGVyKG1ldGFkYXRhLCBtb2RpZmllcnMsIHJldHVyblR5cGUsIG5hbWUsIHR5cGVWYXJpYWJsZXMsIGZvcm1hbHMsCiAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdCwgY2hhck9mZnNldCwgbmF0aXZlTWV0aG9kTmFtZSk7CgogIEBvdmVycmlkZQogIEtlcm5lbENvbnN0cnVjdG9yQnVpbGRlciBnZXQgb3JpZ2luID0+IGFjdHVhbE9yaWdpbiA/PyB0aGlzOwoKICBib29sIGdldCBpc0luc3RhbmNlTWVtYmVyID0+IGZhbHNlOwoKICBib29sIGdldCBpc0NvbnN0cnVjdG9yID0+IHRydWU7CgogIEFzeW5jTWFya2VyIGdldCBhc3luY01vZGlmaWVyID0+IEFzeW5jTWFya2VyLlN5bmM7CgogIFByb2NlZHVyZUtpbmQgZ2V0IGtpbmQgPT4gbnVsbDsKCiAgYm9vbCBnZXQgaXNSZWRpcmVjdGluZ0dlbmVyYXRpdmVDb25zdHJ1Y3RvciB7CiAgICByZXR1cm4gaXNSZWRpcmVjdGluZ0dlbmVyYXRpdmVDb25zdHJ1Y3RvckltcGxlbWVudGF0aW9uKGNvbnN0cnVjdG9yKTsKICB9CgogIGJvb2wgZ2V0IGlzRWxpZ2libGVGb3JUb3BMZXZlbEluZmVyZW5jZSB7CiAgICBpZiAobGlicmFyeS5sZWdhY3lNb2RlKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoZm9ybWFscyAhPSBudWxsKSB7CiAgICAgIGZvciAodmFyIGZvcm1hbCBpbiBmb3JtYWxzKSB7CiAgICAgICAgaWYgKGZvcm1hbC50eXBlID09IG51bGwgJiYgZm9ybWFsLmlzSW5pdGlhbGl6aW5nRm9ybWFsKSByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQ29uc3RydWN0b3IgYnVpbGQoU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgaWYgKGNvbnN0cnVjdG9yLm5hbWUgPT0gbnVsbCkgewogICAgICBjb25zdHJ1Y3Rvci5mdW5jdGlvbiA9IGJ1aWxkRnVuY3Rpb24obGlicmFyeSk7CiAgICAgIGNvbnN0cnVjdG9yLmZ1bmN0aW9uLnBhcmVudCA9IGNvbnN0cnVjdG9yOwogICAgICBjb25zdHJ1Y3Rvci5mdW5jdGlvbi5maWxlT2Zmc2V0ID0gY2hhck9wZW5QYXJlbk9mZnNldDsKICAgICAgY29uc3RydWN0b3IuZnVuY3Rpb24uZmlsZUVuZE9mZnNldCA9IGNvbnN0cnVjdG9yLmZpbGVFbmRPZmZzZXQ7CiAgICAgIGNvbnN0cnVjdG9yLmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzID0gY29uc3QgPFR5cGVQYXJhbWV0ZXI+W107CiAgICAgIGNvbnN0cnVjdG9yLmlzQ29uc3QgPSBpc0NvbnN0OwogICAgICBjb25zdHJ1Y3Rvci5pc0V4dGVybmFsID0gaXNFeHRlcm5hbDsKICAgICAgY29uc3RydWN0b3IubmFtZSA9IG5ldyBOYW1lKG5hbWUsIGxpYnJhcnkudGFyZ2V0KTsKICAgIH0KICAgIGlmIChpc0VsaWdpYmxlRm9yVG9wTGV2ZWxJbmZlcmVuY2UpIHsKICAgICAgZm9yIChLZXJuZWxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGZvcm1hbCBpbiBmb3JtYWxzKSB7CiAgICAgICAgaWYgKGZvcm1hbC50eXBlID09IG51bGwgJiYgZm9ybWFsLmlzSW5pdGlhbGl6aW5nRm9ybWFsKSB7CiAgICAgICAgICBmb3JtYWwuZGVjbGFyYXRpb24udHlwZSA9IG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxpYnJhcnkubG9hZGVyLnR5cGVJbmZlcmVuY2VFbmdpbmUudG9CZUluZmVycmVkW2NvbnN0cnVjdG9yXSA9IGxpYnJhcnk7CiAgICB9CiAgICByZXR1cm4gY29uc3RydWN0b3I7CiAgfQoKICBGdW5jdGlvbk5vZGUgYnVpbGRGdW5jdGlvbihMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24gwqc5LjMgdGhlIHJldHVybiB0eXBlIG9mIGEgY29uc3RydWN0b3IKICAgIC8vIGZ1bmN0aW9uIGlzIGl0cyBlbmNsb3NpbmcgY2xhc3MuCiAgICBGdW5jdGlvbk5vZGUgZnVuY3Rpb25Ob2RlID0gc3VwZXIuYnVpbGRGdW5jdGlvbihsaWJyYXJ5KTsKICAgIENsYXNzQnVpbGRlciBlbmNsb3NpbmdDbGFzcyA9IHBhcmVudDsKICAgIExpc3Q8RGFydFR5cGU+IHR5cGVQYXJhbWV0ZXJUeXBlcyA9IG5ldyBMaXN0PERhcnRUeXBlPigpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbmNsb3NpbmdDbGFzcy50YXJnZXQudHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gZW5jbG9zaW5nQ2xhc3MudGFyZ2V0LnR5cGVQYXJhbWV0ZXJzW2ldOwogICAgICB0eXBlUGFyYW1ldGVyVHlwZXMuYWRkKG5ldyBUeXBlUGFyYW1ldGVyVHlwZSh0eXBlUGFyYW1ldGVyKSk7CiAgICB9CiAgICBmdW5jdGlvbk5vZGUucmV0dXJuVHlwZSA9CiAgICAgICAgbmV3IEludGVyZmFjZVR5cGUoZW5jbG9zaW5nQ2xhc3MudGFyZ2V0LCB0eXBlUGFyYW1ldGVyVHlwZXMpOwogICAgcmV0dXJuIGZ1bmN0aW9uTm9kZTsKICB9CgogIENvbnN0cnVjdG9yIGdldCB0YXJnZXQgPT4gb3JpZ2luLmNvbnN0cnVjdG9yOwoKICB2b2lkIGluamVjdEludmFsaWRJbml0aWFsaXplcigKICAgICAgTWVzc2FnZSBtZXNzYWdlLCBpbnQgY2hhck9mZnNldCwgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIpIHsKICAgIExpc3Q8SW5pdGlhbGl6ZXI+IGluaXRpYWxpemVycyA9IGNvbnN0cnVjdG9yLmluaXRpYWxpemVyczsKICAgIEluaXRpYWxpemVyIGxhc3RJbml0aWFsaXplciA9IGluaXRpYWxpemVycy5yZW1vdmVMYXN0KCk7CiAgICBhc3NlcnQobGFzdEluaXRpYWxpemVyID09IHN1cGVySW5pdGlhbGl6ZXIgfHwKICAgICAgICBsYXN0SW5pdGlhbGl6ZXIgPT0gcmVkaXJlY3RpbmdJbml0aWFsaXplcik7CiAgICBJbml0aWFsaXplciBlcnJvciA9IGhlbHBlci5idWlsZEludmFsaWRJbml0aWFsaXplcigKICAgICAgICBoZWxwZXIuZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oCiAgICAgICAgICAgIGhlbHBlci5idWlsZFByb2JsZW0obWVzc2FnZSwgY2hhck9mZnNldCwgbm9MZW5ndGgpKSwKICAgICAgICBjaGFyT2Zmc2V0KTsKICAgIGluaXRpYWxpemVycy5hZGQoZXJyb3IuLnBhcmVudCA9IGNvbnN0cnVjdG9yKTsKICAgIGluaXRpYWxpemVycy5hZGQobGFzdEluaXRpYWxpemVyKTsKICB9CgogIHZvaWQgYWRkSW5pdGlhbGl6ZXIoCiAgICAgIEluaXRpYWxpemVyIGluaXRpYWxpemVyLCBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlcikgewogICAgTGlzdDxJbml0aWFsaXplcj4gaW5pdGlhbGl6ZXJzID0gY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzOwogICAgaWYgKGluaXRpYWxpemVyIGlzIFN1cGVySW5pdGlhbGl6ZXIpIHsKICAgICAgaWYgKHN1cGVySW5pdGlhbGl6ZXIgIT0gbnVsbCB8fCByZWRpcmVjdGluZ0luaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgICBpbmplY3RJbnZhbGlkSW5pdGlhbGl6ZXIobWVzc2FnZU1vcmVUaGFuT25lU3VwZXJPclRoaXNJbml0aWFsaXplciwKICAgICAgICAgICAgaW5pdGlhbGl6ZXIuZmlsZU9mZnNldCwgaGVscGVyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbml0aWFsaXplcnMuYWRkKGluaXRpYWxpemVyLi5wYXJlbnQgPSBjb25zdHJ1Y3Rvcik7CiAgICAgICAgc3VwZXJJbml0aWFsaXplciA9IGluaXRpYWxpemVyOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGluaXRpYWxpemVyIGlzIFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIpIHsKICAgICAgaWYgKHN1cGVySW5pdGlhbGl6ZXIgIT0gbnVsbCB8fCByZWRpcmVjdGluZ0luaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgICBpbmplY3RJbnZhbGlkSW5pdGlhbGl6ZXIobWVzc2FnZU1vcmVUaGFuT25lU3VwZXJPclRoaXNJbml0aWFsaXplciwKICAgICAgICAgICAgaW5pdGlhbGl6ZXIuZmlsZU9mZnNldCwgaGVscGVyKTsKICAgICAgfSBlbHNlIGlmIChjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnMuaXNOb3RFbXB0eSkgewogICAgICAgIEluaXRpYWxpemVyIGZpcnN0ID0gY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzLmZpcnN0OwogICAgICAgIEluaXRpYWxpemVyIGVycm9yID0gaGVscGVyLmJ1aWxkSW52YWxpZEluaXRpYWxpemVyKAogICAgICAgICAgICBoZWxwZXIuZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgICAgIG1lc3NhZ2VUaGlzSW5pdGlhbGl6ZXJOb3RBbG9uZSwgZmlyc3QuZmlsZU9mZnNldCwgbm9MZW5ndGgpKSwKICAgICAgICAgICAgZmlyc3QuZmlsZU9mZnNldCk7CiAgICAgICAgaW5pdGlhbGl6ZXJzLmFkZChlcnJvci4ucGFyZW50ID0gY29uc3RydWN0b3IpOwogICAgICB9IGVsc2UgewogICAgICAgIGluaXRpYWxpemVycy5hZGQoaW5pdGlhbGl6ZXIuLnBhcmVudCA9IGNvbnN0cnVjdG9yKTsKICAgICAgICByZWRpcmVjdGluZ0luaXRpYWxpemVyID0gaW5pdGlhbGl6ZXI7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocmVkaXJlY3RpbmdJbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgIGluamVjdEludmFsaWRJbml0aWFsaXplcigKICAgICAgICAgIG1lc3NhZ2VUaGlzSW5pdGlhbGl6ZXJOb3RBbG9uZSwgaW5pdGlhbGl6ZXIuZmlsZU9mZnNldCwgaGVscGVyKTsKICAgIH0gZWxzZSBpZiAoc3VwZXJJbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgIGluamVjdEludmFsaWRJbml0aWFsaXplcigKICAgICAgICAgIG1lc3NhZ2VTdXBlckluaXRpYWxpemVyTm90TGFzdCwgc3VwZXJJbml0aWFsaXplci5maWxlT2Zmc2V0LCBoZWxwZXIpOwogICAgfSBlbHNlIHsKICAgICAgaW5pdGlhbGl6ZXJzLmFkZChpbml0aWFsaXplci4ucGFyZW50ID0gY29uc3RydWN0b3IpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGZpbmlzaFBhdGNoKCkgewogICAgaWYgKCFpc1BhdGNoKSByZXR1cm4gMDsKCiAgICAvLyBUT0RPKGFoZSk6IHJlc3RvcmUgZmlsZS1vZmZzZXQgb25jZSB3ZSB0cmFjayBib3RoIG9yaWdpbiBhbmQgcGF0Y2ggZmlsZQogICAgLy8gVVJJcy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8zMTU3OQogICAgb3JpZ2luLmNvbnN0cnVjdG9yLmZpbGVVcmkgPSBmaWxlVXJpOwogICAgb3JpZ2luLmNvbnN0cnVjdG9yLnN0YXJ0RmlsZU9mZnNldCA9IGNvbnN0cnVjdG9yLnN0YXJ0RmlsZU9mZnNldDsKICAgIG9yaWdpbi5jb25zdHJ1Y3Rvci5maWxlT2Zmc2V0ID0gY29uc3RydWN0b3IuZmlsZU9mZnNldDsKICAgIG9yaWdpbi5jb25zdHJ1Y3Rvci5maWxlRW5kT2Zmc2V0ID0gY29uc3RydWN0b3IuZmlsZUVuZE9mZnNldDsKICAgIG9yaWdpbi5jb25zdHJ1Y3Rvci5hbm5vdGF0aW9ucwogICAgICAgIC5mb3JFYWNoKChtKSA9PiBtLmZpbGVPZmZzZXQgPSBjb25zdHJ1Y3Rvci5maWxlT2Zmc2V0KTsKCiAgICBvcmlnaW4uY29uc3RydWN0b3IuaXNFeHRlcm5hbCA9IGNvbnN0cnVjdG9yLmlzRXh0ZXJuYWw7CiAgICBvcmlnaW4uY29uc3RydWN0b3IuZnVuY3Rpb24gPSBjb25zdHJ1Y3Rvci5mdW5jdGlvbjsKICAgIG9yaWdpbi5jb25zdHJ1Y3Rvci5mdW5jdGlvbi5wYXJlbnQgPSBvcmlnaW4uY29uc3RydWN0b3I7CiAgICBvcmlnaW4uY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzID0gY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzOwogICAgc2V0UGFyZW50cyhvcmlnaW4uY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzLCBvcmlnaW4uY29uc3RydWN0b3IpOwogICAgcmV0dXJuIDE7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlY29tZU5hdGl2ZShMb2FkZXIgbG9hZGVyKSB7CiAgICBjb25zdHJ1Y3Rvci5pc0V4dGVybmFsID0gdHJ1ZTsKICAgIHN1cGVyLmJlY29tZU5hdGl2ZShsb2FkZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhcHBseVBhdGNoKERlY2xhcmF0aW9uIHBhdGNoKSB7CiAgICBpZiAocGF0Y2ggaXMgS2VybmVsQ29uc3RydWN0b3JCdWlsZGVyKSB7CiAgICAgIGlmIChjaGVja1BhdGNoKHBhdGNoKSkgewogICAgICAgIHBhdGNoLmFjdHVhbE9yaWdpbiA9IHRoaXM7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlcG9ydFBhdGNoTWlzbWF0Y2gocGF0Y2gpOwogICAgfQogIH0KfQoKY2xhc3MgS2VybmVsUmVkaXJlY3RpbmdGYWN0b3J5QnVpbGRlciBleHRlbmRzIEtlcm5lbFByb2NlZHVyZUJ1aWxkZXIgewogIGZpbmFsIENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlciByZWRpcmVjdGlvblRhcmdldDsKICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzOwoKICBLZXJuZWxSZWRpcmVjdGluZ0ZhY3RvcnlCdWlsZGVyKAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIGludCBtb2RpZmllcnMsCiAgICAgIEtlcm5lbFR5cGVCdWlsZGVyIHJldHVyblR5cGUsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMsCiAgICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscywKICAgICAgS2VybmVsTGlicmFyeUJ1aWxkZXIgY29tcGlsYXRpb25Vbml0LAogICAgICBpbnQgc3RhcnRDaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhck9mZnNldCwKICAgICAgaW50IGNoYXJPcGVuUGFyZW5PZmZzZXQsCiAgICAgIGludCBjaGFyRW5kT2Zmc2V0LAogICAgICBbU3RyaW5nIG5hdGl2ZU1ldGhvZE5hbWUsCiAgICAgIHRoaXMucmVkaXJlY3Rpb25UYXJnZXRdKQogICAgICA6IHN1cGVyKAogICAgICAgICAgICBtZXRhZGF0YSwKICAgICAgICAgICAgbW9kaWZpZXJzLAogICAgICAgICAgICByZXR1cm5UeXBlLAogICAgICAgICAgICBuYW1lLAogICAgICAgICAgICB0eXBlVmFyaWFibGVzLAogICAgICAgICAgICBmb3JtYWxzLAogICAgICAgICAgICBQcm9jZWR1cmVLaW5kLkZhY3RvcnksCiAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdCwKICAgICAgICAgICAgc3RhcnRDaGFyT2Zmc2V0LAogICAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgICBjaGFyT3BlblBhcmVuT2Zmc2V0LAogICAgICAgICAgICBjaGFyRW5kT2Zmc2V0LAogICAgICAgICAgICBuYXRpdmVNZXRob2ROYW1lKTsKCiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50IGdldCBib2R5ID0+IGFjdHVhbEJvZHk7CgogIEBvdmVycmlkZQogIHZvaWQgc2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keShNZW1iZXIgdGFyZ2V0LCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICBpZiAoYWN0dWFsQm9keSAhPSBudWxsKSB7CiAgICAgIHVuZXhwZWN0ZWQoIm51bGwiLCAiJHthY3R1YWxCb2R5LnJ1bnRpbWVUeXBlfSIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgfQoKICAgIC8vIEVuc3VyZSB0aGF0IGNvbnN0YW50IGZhY3RvcmllcyBvbmx5IGhhdmUgY29uc3RhbnQgdGFyZ2V0cy9ib2RpZXMuCiAgICBpZiAoaXNDb25zdCAmJiAhdGFyZ2V0LmlzQ29uc3QpIHsKICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKG1lc3NhZ2VDb25zdEZhY3RvcnlSZWRpcmVjdGlvblRvTm9uQ29uc3QsIGNoYXJPZmZzZXQsCiAgICAgICAgICBub0xlbmd0aCwgZmlsZVVyaSk7CiAgICB9CgogICAgYWN0dWFsQm9keSA9IG5ldyBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KHRhcmdldCwgdHlwZUFyZ3VtZW50cyk7CiAgICBmdW5jdGlvbi5ib2R5ID0gYWN0dWFsQm9keTsKICAgIGFjdHVhbEJvZHk/LnBhcmVudCA9IGZ1bmN0aW9uOwogICAgaWYgKGlzUGF0Y2gpIHsKICAgICAgaWYgKGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbiA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBzdWJzdGl0dXRpb25bZnVuY3Rpb24udHlwZVBhcmFtZXRlcnNbaV1dID0KICAgICAgICAgICAgICBuZXcgVHlwZVBhcmFtZXRlclR5cGUoYWN0dWFsT3JpZ2luLmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzW2ldKTsKICAgICAgICB9CiAgICAgICAgTGlzdDxEYXJ0VHlwZT4gbmV3VHlwZUFyZ3VtZW50cyA9CiAgICAgICAgICAgIG5ldyBMaXN0PERhcnRUeXBlPih0eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdUeXBlQXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBuZXdUeXBlQXJndW1lbnRzW2ldID0gc3Vic3RpdHV0ZSh0eXBlQXJndW1lbnRzW2ldLCBzdWJzdGl0dXRpb24pOwogICAgICAgIH0KICAgICAgICB0eXBlQXJndW1lbnRzID0gbmV3VHlwZUFyZ3VtZW50czsKICAgICAgfQogICAgICBhY3R1YWxPcmlnaW4uc2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keSh0YXJnZXQsIHR5cGVBcmd1bWVudHMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgUHJvY2VkdXJlIGJ1aWxkKFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgIFByb2NlZHVyZSByZXN1bHQgPSBzdXBlci5idWlsZChsaWJyYXJ5KTsK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ICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEeW5hbWljVHlwZSwKICAgICAgICBGdW5jdGlvblR5cGUsCiAgICAgICAgSW52YWxpZFR5cGUsCiAgICAgICAgTGlicmFyeSwKICAgICAgICBUeXBlUGFyYW1ldGVyLAogICAgICAgIFR5cGVkZWYsCiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQnCiAgICBzaG93IEZyZXNoVHlwZVBhcmFtZXRlcnMsIGdldEZyZXNoVHlwZVBhcmFtZXRlcnMsIHN1YnN0aXR1dGU7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnCiAgICBzaG93IG5vTGVuZ3RoLCB0ZW1wbGF0ZUN5Y2xpY1R5cGVkZWYsIHRlbXBsYXRlVHlwZUFyZ3VtZW50TWlzbWF0Y2g7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgdW5oYW5kbGVkOwoKaW1wb3J0ICdrZXJuZWxfYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIFR5cGVBbGlhc0J1aWxkZXIsCiAgICAgICAgS2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlciwKICAgICAgICBLZXJuZWxGdW5jdGlvblR5cGVCdWlsZGVyLAogICAgICAgIEtlcm5lbExpYnJhcnlCdWlsZGVyLAogICAgICAgIEtlcm5lbFR5cGVCdWlsZGVyLAogICAgICAgIEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXIsCiAgICAgICAgTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgTWV0YWRhdGFCdWlsZGVyLAogICAgICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXI7CgpmaW5hbCBJbnZhbGlkVHlwZSBjeWNsaWNUeXBlQWxpYXNNYXJrZXIgPSBuZXcgSW52YWxpZFR5cGUoKTsKCmNsYXNzIEtlcm5lbFR5cGVBbGlhc0J1aWxkZXIKICAgIGV4dGVuZHMgVHlwZUFsaWFzQnVpbGRlcjxLZXJuZWxUeXBlQnVpbGRlciwgRGFydFR5cGU+IHsKICBmaW5hbCBUeXBlZGVmIHRhcmdldDsKCiAgRGFydFR5cGUgdGhpc1R5cGU7CgogIEtlcm5lbFR5cGVBbGlhc0J1aWxkZXIoCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyPj4gbWV0YWRhdGEsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI8S2VybmVsVHlwZUJ1aWxkZXIsIERhcnRUeXBlPj4gdHlwZVZhcmlhYmxlcywKICAgICAgS2VybmVsRnVuY3Rpb25UeXBlQnVpbGRlciB0eXBlLAogICAgICBMaWJyYXJ5QnVpbGRlcjxLZXJuZWxUeXBlQnVpbGRlciwgTGlicmFyeT4gcGFyZW50LAogICAgICBpbnQgY2hhck9mZnNldCwKICAgICAgW1R5cGVkZWYgdGFyZ2V0XSkKICAgICAgOiB0YXJnZXQgPSB0YXJnZXQgPz8KICAgICAgICAgICAgKG5ldyBUeXBlZGVmKG5hbWUsIG51bGwsCiAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyczoKICAgICAgICAgICAgICAgICAgICBLZXJuZWxUeXBlVmFyaWFibGVCdWlsZGVyLmtlcm5lbFR5cGVQYXJhbWV0ZXJzRnJvbUJ1aWxkZXJzKAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlVmFyaWFibGVzKSwKICAgICAgICAgICAgICAgIGZpbGVVcmk6IHBhcmVudC50YXJnZXQuZmlsZVVyaSkKICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0KSwKICAgICAgICBzdXBlcihtZXRhZGF0YSwgbmFtZSwgdHlwZVZhcmlhYmxlcywgdHlwZSwgcGFyZW50LCBjaGFyT2Zmc2V0KTsKCiAgVHlwZWRlZiBidWlsZChLZXJuZWxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5QnVpbGRlcikgewogICAgdGFyZ2V0Li50eXBlID8/PSBidWlsZFRoaXNUeXBlKGxpYnJhcnlCdWlsZGVyKTsKCiAgICBLZXJuZWxUeXBlQnVpbGRlciB0eXBlID0gdGhpcy50eXBlOwogICAgaWYgKHR5cGUgaXMgS2VybmVsRnVuY3Rpb25UeXBlQnVpbGRlcikgewogICAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzID0KICAgICAgICAgIG5ldyBMaXN0PFR5cGVQYXJhbWV0ZXI+KHR5cGUudHlwZVZhcmlhYmxlcz8ubGVuZ3RoID8/IDApOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgS2VybmVsVHlwZVZhcmlhYmxlQnVpbGRlciB0eXBlVmFyaWFibGUgPSB0eXBlLnR5cGVWYXJpYWJsZXNbaV07CiAgICAgICAgdHlwZVBhcmFtZXRlcnNbaV0gPSB0eXBlVmFyaWFibGUucGFyYW1ldGVyOwogICAgICB9CiAgICAgIEZyZXNoVHlwZVBhcmFtZXRlcnMgZnJlc2hUeXBlUGFyYW1ldGVycyA9CiAgICAgICAgICBnZXRGcmVzaFR5cGVQYXJhbWV0ZXJzKHR5cGVQYXJhbWV0ZXJzKTsKICAgICAgdGFyZ2V0LnR5cGVQYXJhbWV0ZXJzT2ZGdW5jdGlvblR5cGUKICAgICAgICAgIC5hZGRBbGwoZnJlc2hUeXBlUGFyYW1ldGVycy5mcmVzaFR5cGVQYXJhbWV0ZXJzKTsKCiAgICAgIGlmICh0eXBlLmZvcm1hbHMgIT0gbnVsbCkgewogICAgICAgIGZvciAoS2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgaW4gdHlwZS5mb3JtYWxzKSB7CiAgICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA9IGZvcm1hbC5idWlsZChsaWJyYXJ5QnVpbGRlciwgMCk7CiAgICAgICAgICBwYXJhbWV0ZXIudHlwZSA9IGZyZXNoVHlwZVBhcmFtZXRlcnMuc3Vic3RpdHV0ZShwYXJhbWV0ZXIudHlwZSk7CiAgICAgICAgICBpZiAoZm9ybWFsLmlzTmFtZWQpIHsKICAgICAgICAgICAgdGFyZ2V0Lm5hbWVkUGFyYW1ldGVycy5hZGQocGFyYW1ldGVyKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRhcmdldC5wb3NpdGlvbmFsUGFyYW1ldGVycy5hZGQocGFyYW1ldGVyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodHlwZSAhPSBudWxsKSB7CiAgICAgIHVuaGFuZGxlZCgiJHt0eXBlLmZ1bGxOYW1lRm9yRXJyb3JzfSIsICJidWlsZCIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgfQoKICAgIHJldHVybiB0YXJnZXQ7CiAgfQoKICBEYXJ0VHlwZSBidWlsZFRoaXNUeXBlKExpYnJhcnlCdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyLCBMaWJyYXJ5PiBsaWJyYXJ5KSB7CiAgICBpZiAodGhpc1R5cGUgIT0gbnVsbCkgewogICAgICBpZiAoaWRlbnRpY2FsKHRoaXNUeXBlLCBjeWNsaWNUeXBlQWxpYXNNYXJrZXIpKSB7CiAgICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKHRlbXBsYXRlQ3ljbGljVHlwZWRlZi53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICBjaGFyT2Zmc2V0LCBub0xlbmd0aCwgZmlsZVVyaSk7CiAgICAgICAgcmV0dXJuIGNvbnN0IEludmFsaWRUeXBlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXNUeXBlOwogICAgfQogICAgLy8gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgZm9yIGFuIGFsaWFzICh0eXBlZGVmKSB0byByZWZlciB0byBpdHNlbGYuIFdlCiAgICAvLyBkZXRlY3QgY3ljbGVzIGJ5IGRldGVjdGluZyByZWN1cnNpdmUgY2FsbHMgdG8gdGhpcyBtZXRob2QgdXNpbmcgYW4KICAgIC8vIGluc3RhbmNlIG9mIEludmFsaWRUeXBlIHRoYXQgaXNuJ3QgaWRlbnRpY2FsIHRvIGBjb25zdCBJbnZhbGlkVHlwZSgpYC4KICAgIHRoaXNUeXBlID0gY3ljbGljVHlwZUFsaWFzTWFya2VyOwogICAgS2VybmVsVHlwZUJ1aWxkZXIgdHlwZSA9IHRoaXMudHlwZTsKICAgIGlmICh0eXBlIGlzIEtlcm5lbEZ1bmN0aW9uVHlwZUJ1aWxkZXIpIHsKICAgICAgRnVuY3Rpb25UeXBlIGJ1aWx0VHlwZSA9IHR5cGU/LmJ1aWxkKGxpYnJhcnksIHRhcmdldC50aGlzVHlwZSk7CiAgICAgIGlmIChidWlsdFR5cGUgIT0gbnVsbCkgewogICAgICAgIGlmICh0eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgICAgIGZvciAoS2VybmVsVHlwZVZhcmlhYmxlQnVpbGRlciB0diBpbiB0eXBlVmFyaWFibGVzKSB7CiAgICAgICAgICAgIC8vIEZvbGxvdyBib3VuZCBpbiBvcmRlciB0byBmaW5kIGFsbCBjeWNsZXMKICAgICAgICAgICAgdHYuYm91bmQ/LmJ1aWxkKGxpYnJhcnkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpc1R5cGUgPSBidWlsdFR5cGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHRoaXNUeXBlID0gY29uc3QgSW52YWxpZFR5cGUoKTsKICAgICAgfQogICAgfSBlbHNlIGlmICh0eXBlID09IG51bGwpIHsKICAgICAgcmV0dXJuIHRoaXNUeXBlID0gY29uc3QgSW52YWxpZFR5cGUoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB1bmhhbmRsZWQoCiAgICAgICAgICAiJHt0eXBlLmZ1bGxOYW1lRm9yRXJyb3JzfSIsICJidWlsZFRoaXNUeXBlIiwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICB9CiAgfQoKICAvLy8gW2FyZ3VtZW50c10gaGF2ZSBhbHJlYWR5IGJlZW4gYnVpbHQuCiAgRGFydFR5cGUgYnVpbGRUeXBlc1dpdGhCdWlsdEFyZ3VtZW50cygKICAgICAgTGlicmFyeUJ1aWxkZXI8S2VybmVsVHlwZUJ1aWxkZXIsIE9iamVjdD4gbGlicmFyeSwKICAgICAgTGlzdDxEYXJ0VHlwZT4gYXJndW1lbnRzKSB7CiAgICB2YXIgdGhpc1R5cGUgPSBidWlsZFRoaXNUeXBlKGxpYnJhcnkpOwogICAgaWYgKGNvbnN0IER5bmFtaWNUeXBlKCkgPT0gdGhpc1R5cGUpIHJldHVybiB0aGlzVHlwZTsKICAgIEZ1bmN0aW9uVHlwZSByZXN1bHQgPSB0aGlzVHlwZTsKICAgIGlmICh0YXJnZXQudHlwZVBhcmFtZXRlcnMuaXNFbXB0eSAmJiBhcmd1bWVudHMgPT0gbnVsbCkgcmV0dXJuIHJlc3VsdDsKICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gc3Vic3RpdHV0aW9uID0gPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YXJnZXQudHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgc3Vic3RpdHV0aW9uW3RhcmdldC50eXBlUGFyYW1ldGVyc1tpXV0gPSBhcmd1bWVudHNbaV07CiAgICB9CiAgICByZXR1cm4gc3Vic3RpdHV0ZShyZXN1bHQsIHN1YnN0aXR1dGlvbik7CiAgfQoKICBMaXN0PERhcnRUeXBlPiBidWlsZFR5cGVBcmd1bWVudHMoCiAgICAgIExpYnJhcnlCdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyLCBMaWJyYXJ5PiBsaWJyYXJ5LAogICAgICBMaXN0PEtlcm5lbFR5cGVCdWlsZGVyPiBhcmd1bWVudHMpIHsKICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCAmJiB0eXBlVmFyaWFibGVzID09IG51bGwpIHsKICAgICAgcmV0dXJuIDxEYXJ0VHlwZT5bXTsKICAgIH0KCiAgICBpZiAoYXJndW1lbnRzID09IG51bGwgJiYgdHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgIExpc3Q8RGFydFR5cGU+IHJlc3VsdCA9CiAgICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKHR5cGVWYXJpYWJsZXMubGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgcmVzdWx0W2ldID0gdHlwZVZhcmlhYmxlc1tpXS5kZWZhdWx0VHlwZS5idWlsZChsaWJyYXJ5KTsKICAgICAgfQogICAgICBpZiAobGlicmFyeSBpcyBLZXJuZWxMaWJyYXJ5QnVpbGRlcikgewogICAgICAgIGxpYnJhcnkuaW5mZXJyZWRUeXBlcy5hZGRBbGwocmVzdWx0KTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCAmJiBhcmd1bWVudHMubGVuZ3RoICE9ICh0eXBlVmFyaWFibGVzPy5sZW5ndGggPz8gMCkpIHsKICAgICAgLy8gVGhhdCBzaG91bGQgYmUgY2F1Z2h0IGFuZCByZXBvcnRlZCBhcyBhIGNvbXBpbGUtdGltZSBlcnJvciBlYXJsaWVyLgogICAgICByZXR1cm4gdW5oYW5kbGVkKAogICAgICAgICAgdGVtcGxhdGVUeXBlQXJndW1lbnRNaXNtYXRjaAogICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHR5cGVWYXJpYWJsZXMubGVuZ3RoKQogICAgICAgICAgICAgIC5tZXNzYWdlLAogICAgICAgICAgImJ1aWxkVHlwZUFyZ3VtZW50cyIsCiAgICAgICAgICAtMSwKICAgICAgICAgIG51bGwpOwogICAgfQoKICAgIC8vIGFyZ3VtZW50cy5sZW5ndGggPT0gdHlwZVZhcmlhYmxlcy5sZW5ndGgKICAgIExpc3Q8RGFydFR5cGU+IHJlc3VsdCA9CiAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZChhcmd1bWVudHMubGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSBhcmd1bWVudHNbaV0uYnVpbGQobGlicmFyeSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIElmIFthcmd1bWVudHNdIGFyZSBudWxsLCB0aGUgZGVmYXVsdCB0eXBlcyBmb3IgdGhlIHZhcmlhYmxlcyBhcmUgdXNlZC4KICBAb3ZlcnJpZGUKICBpbnQgZ2V0IHR5cGVWYXJpYWJsZXNDb3VudCA9PiB0eXBlVmFyaWFibGVzPy5sZW5ndGggPz8gMDsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgYnVpbGRUeXBlKExpYnJhcnlCdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyLCBPYmplY3Q+IGxpYnJhcnksCiAgICAgIExpc3Q8S2VybmVsVHlwZUJ1aWxkZXI+IGFyZ3VtZW50cykgewogICAgdmFyIHRoaXNUeXBlID0gYnVpbGRUaGlzVHlwZShsaWJyYXJ5KTsKICAgIGlmICh0aGlzVHlwZSBpcyBJbnZhbGlkVHlwZSkgcmV0dXJuIHRoaXNUeXBlOwogICAgRnVuY3Rpb25UeXBlIHJlc3VsdCA9IHRoaXNUeXBlOwogICAgaWYgKHRhcmdldC50eXBlUGFyYW1ldGVycy5pc0VtcHR5ICYmIGFyZ3VtZW50cyA9PSBudWxsKSByZXR1cm4gcmVzdWx0OwogICAgLy8gT3RoZXJ3aXNlLCBzdWJzdGl0dXRlLgogICAgcmV0dXJuIGJ1aWxkVHlwZXNXaXRoQnVpbHRBcmd1bWVudHMoCiAgICAgICAgbGlicmFyeSwgYnVpbGRUeXBlQXJndW1lbnRzKGxpYnJhcnksIGFyZ3VtZW50cykpOwogIH0KfQqAywBOTjwBMgEhCRIVFhURFxEdASpCAR1IASoBHQkaJiMeGyMYGR0BPQEdPBgBFQEaORNMJjkWGBslIFAoMCpIATc0ASgtK0Q4SDQIMDIqPAEiREtLIDMTOAwKCB9MBgETBAFPHDhGLCQIFwZQSk4mKC1GHyVAOCYMCiUPLwgfLQ0YTgYEASspOSIrOiRLTT09Bi0EASU6KzYbBgE2HlEwQQgtLggVBgFRTRgnMxggDhEGATAcSy4vBhMEAU0MPAEMSCsrMiRLHik6BAIBQXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX3R5cGVfYWxpYXNfYnVpbGRlci5kYXJ0RHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX3R5cGVfYnVpbGRlci5kYXJ0gwIvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5rZXJuZWxfdHlwZV9idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBEYXJ0VHlwZSwgTGlicmFyeSwgU3VwZXJ0eXBlOwoKaW1wb3J0ICdrZXJuZWxfYnVpbGRlci5kYXJ0JyBzaG93IExpYnJhcnlCdWlsZGVyLCBUeXBlQnVpbGRlcjsKCmFic3RyYWN0IGNsYXNzIEtlcm5lbFR5cGVCdWlsZGVyIGV4dGVuZHMgVHlwZUJ1aWxkZXIgewogIGNvbnN0IEtlcm5lbFR5cGVCdWlsZGVyKCk7CgogIERhcnRUeXBlIGJ1aWxkKExpYnJhcnlCdWlsZGVyPFR5cGVCdWlsZGVyLCBPYmplY3Q+IGxpYnJhcnkpOwoKICBTdXBlcnR5cGUgYnVpbGRTdXBlcnR5cGUoTGlicmFyeUJ1aWxkZXI8S2VybmVsVHlwZUJ1aWxkZXIsIExpYnJhcnk+IGxpYnJhcnksCiAgICAgIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSk7CgogIFN1cGVydHlwZSBidWlsZE1peGVkSW5UeXBlKExpYnJhcnlCdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyLCBMaWJyYXJ5PiBsaWJyYXJ5LAogICAgICBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpOwp9ChcATk48ASMBRAE/ATcdAT8BTyQBUSQCATtwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF90eXBlX2J1aWxkZXIuZGFydE1zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF90eXBlX3ZhcmlhYmxlX2J1aWxkZXIuZGFydJFqLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEua2VybmVsX3R5cGVfdmFyaWFibGVfYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93IERhcnRUeXBlLCBUeXBlUGFyYW1ldGVyLCBUeXBlUGFyYW1ldGVyVHlwZTsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcgc2hvdyB0ZW1wbGF0ZVR5cGVBcmd1bWVudHNPblR5cGVWYXJpYWJsZTsKCmltcG9ydCAna2VybmVsX2J1aWxkZXIuZGFydCcKICAgIHNob3cKICAgICAgICBLZXJuZWxDbGFzc0J1aWxkZXIsCiAgICAgICAgS2VybmVsTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgS2VybmVsTmFtZWRUeXBlQnVpbGRlciwKICAgICAgICBLZXJuZWxUeXBlQnVpbGRlciwKICAgICAgICBMaWJyYXJ5QnVpbGRlciwKICAgICAgICBUeXBlQnVpbGRlciwKICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyOwoKY2xhc3MgS2VybmVsVHlwZVZhcmlhYmxlQnVpbGRlcgogICAgZXh0ZW5kcyBUeXBlVmFyaWFibGVCdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyLCBEYXJ0VHlwZT4gewogIGZpbmFsIFR5cGVQYXJhbWV0ZXIgYWN0dWFsUGFyYW1ldGVyOwoKICBLZXJuZWxUeXBlVmFyaWFibGVCdWlsZGVyIGFjdHVhbE9yaWdpbjsKCiAgS2VybmVsVHlwZVZhcmlhYmxlQnVpbGRlcigKICAgICAgU3RyaW5nIG5hbWUsIEtlcm5lbExpYnJhcnlCdWlsZGVyIGNvbXBpbGF0aW9uVW5pdCwgaW50IGNoYXJPZmZzZXQsCiAgICAgIFtLZXJuZWxUeXBlQnVpbGRlciBib3VuZCwgVHlwZVBhcmFtZXRlciBhY3R1YWxdKQogICAgICAvLyBUT0RPKDMyMzc4KTogV2Ugd291bGQgbGlrZSB0byB1c2UgJz8/JyBoZXJlIGluc3RlYWQsIGJ1dCBpbiBjb25qdWN0aW9uCiAgICAgIC8vIHdpdGggJy4uJywgaXQgY3Jhc2hlcyBEYXJ0MkpTLgogICAgICA6IGFjdHVhbFBhcmFtZXRlciA9IGFjdHVhbCAhPSBudWxsCiAgICAgICAgICAgID8gKGFjdHVhbC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQpCiAgICAgICAgICAgIDogKG5ldyBUeXBlUGFyYW1ldGVyKG5hbWUsIG51bGwpLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldCksCiAgICAgICAgc3VwZXIobmFtZSwgYm91bmQsIGNvbXBpbGF0aW9uVW5pdCwgY2hhck9mZnNldCk7CgogIEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXIuZnJvbUtlcm5lbCgKICAgICAgVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIsIExpYnJhcnlCdWlsZGVyIGNvbXBpbGF0aW9uVW5pdCkKICAgICAgOiBhY3R1YWxQYXJhbWV0ZXIgPSBwYXJhbWV0ZXIsCiAgICAgICAgc3VwZXIocGFyYW1ldGVyLm5hbWUsIG51bGwsIGNvbXBpbGF0aW9uVW5pdCwgcGFyYW1ldGVyLmZpbGVPZmZzZXQpOwoKICBAb3ZlcnJpZGUKICBLZXJuZWxUeXBlVmFyaWFibGVCdWlsZGVyIGdldCBvcmlnaW4gPT4gYWN0dWFsT3JpZ2luID8/IHRoaXM7CgogIFR5cGVQYXJhbWV0ZXIgZ2V0IHBhcmFtZXRlciA9PiBvcmlnaW4uYWN0dWFsUGFyYW1ldGVyOwoKICBUeXBlUGFyYW1ldGVyIGdldCB0YXJnZXQgPT4gcGFyYW1ldGVyOwoKICBEYXJ0VHlwZSBidWlsZFR5cGUoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIExpc3Q8S2VybmVsVHlwZUJ1aWxkZXI+IGFyZ3VtZW50cykgewogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGludCBjaGFyT2Zmc2V0ID0gLTE7IC8vIFRPRE8oYWhlKTogUHJvdmlkZSB0aGVzZS4KICAgICAgVXJpIGZpbGVVcmkgPSBudWxsOyAvLyBUT0RPKGFoZSk6IFByb3ZpZGUgdGhlc2UuCiAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlVHlwZUFyZ3VtZW50c09uVHlwZVZhcmlhYmxlLndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgbmFtZS5sZW5ndGgsCiAgICAgICAgICBmaWxlVXJpKTsKICAgIH0KICAgIHJldHVybiBuZXcgVHlwZVBhcmFtZXRlclR5cGUocGFyYW1ldGVyKTsKICB9CgogIERhcnRUeXBlIGJ1aWxkVHlwZXNXaXRoQnVpbHRBcmd1bWVudHMoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cykgewogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGludCBjaGFyT2Zmc2V0ID0gLTE7IC8vIFRPRE8oYWhlKTogUHJvdmlkZSB0aGVzZS4KICAgICAgVXJpIGZpbGVVcmkgPSBudWxsOyAvLyBUT0RPKGFoZSk6IFByb3ZpZGUgdGhlc2UuCiAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlVHlwZUFyZ3VtZW50c09uVHlwZVZhcmlhYmxlLndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgbmFtZS5sZW5ndGgsCiAgICAgICAgICBmaWxlVXJpKTsKICAgIH0KICAgIHJldHVybiBidWlsZFR5cGUobGlicmFyeSwgbnVsbCk7CiAgfQoKICBLZXJuZWxUeXBlQnVpbGRlciBhc1R5cGVCdWlsZGVyKCkgewogICAgcmV0dXJuIG5ldyBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyKG5hbWUsIG51bGwpLi5iaW5kKHRoaXMpOwogIH0KCiAgdm9pZCBmaW5pc2goTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgS2VybmVsQ2xhc3NCdWlsZGVyIG9iamVjdCwKICAgICAgVHlwZUJ1aWxkZXIgZHluYW1pY1R5cGUpIHsKICAgIGlmIChpc1BhdGNoKSByZXR1cm47CiAgICBEYXJ0VHlwZSBvYmplY3RUeXBlID0gb2JqZWN0LmJ1aWxkVHlwZShsaWJyYXJ5LCBudWxsKTsKICAgIHBhcmFtZXRlci5ib3VuZCA/Pz0gYm91bmQ/LmJ1aWxkKGxpYnJhcnkpID8/IG9iamVjdFR5cGU7CiAgICAvLyBJZiBkZWZhdWx0VHlwZSBpcyBub3Qgc2V0LCBpbml0aWFsaXplIGl0IHRvIGR5bmFtaWMsIHVubGVzcyB0aGUgYm91bmQgaXMKICAgIC8vIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGFzIE9iamVjdCwgaW4gd2hpY2ggY2FzZSBkZWZhdWx0VHlwZSBzaG91bGQgYWxzbyBiZQogICAgLy8gT2JqZWN0LiBUaGlzIG1ha2VzIHN1cmUgaW5zdGFudGlhdGlvbiBvZiBnZW5lcmljIGZ1bmN0aW9uIHR5cGVzIHdpdGggYW4KICAgIC8vIGV4cGxpY2l0IE9iamVjdCBib3VuZCByZXN1bHRzIGluIE9iamVjdCBhcyB0aGUgaW5zdGFudGlhdGVkIHR5cGUuCiAgICBwYXJhbWV0ZXIuZGVmYXVsdFR5cGUgPz89IGRlZmF1bHRUeXBlPy5idWlsZChsaWJyYXJ5KSA/PwogICAgICAgIChib3VuZCAhPSBudWxsICYmIHBhcmFtZXRlci5ib3VuZCA9PSBvYmplY3RUeXBlCiAgICAgICAgICAgID8gb2JqZWN0VHlwZQogICAgICAgICAgICA6IGR5bmFtaWNUeXBlLmJ1aWxkKGxpYnJhcnkpKTsKICB9CgogIHZvaWQgYXBwbHlQYXRjaChjb3ZhcmlhbnQgS2VybmVsVHlwZVZhcmlhYmxlQnVpbGRlciBwYXRjaCkgewogICAgcGF0Y2guYWN0dWFsT3JpZ2luID0gdGhpczsKICB9CgogIEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXIgY2xvbmUoTGlzdDxUeXBlQnVpbGRlcj4gbmV3VHlwZXMpIHsKICAgIC8vIFRPRE8oZG1pdHJ5YXMpOiBGaWd1cmUgb3V0IGlmIHVzaW5nIFtjaGFyT2Zmc2V0XSBoZXJlIGlzIGEgZ29vZCBpZGVhLgogICAgLy8gQW4gYWx0ZXJuYXRpdmUgaXMgdG8gdXNlIHRoZSBvZmZzZXQgb2YgdGhlIG5vZGUgdGhlIGNsb25lZCB0eXBlIHZhcmlhYmxlCiAgICAvLyBpcyBkZWNsYXJlZCBvbi4KICAgIHJldHVybiBuZXcgS2VybmVsVHlwZVZhcmlhYmxlQnVpbGRlcigKICAgICAgICBuYW1lLCBwYXJlbnQsIGNoYXJPZmZzZXQsIGJvdW5kLmNsb25lKG5ld1R5cGVzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgcmV0dXJuIG90aGVyIGlzIEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXIgJiYgdGFyZ2V0ID09IG90aGVyLnRhcmdldDsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gdGFyZ2V0Lmhhc2hDb2RlOwoKICBzdGF0aWMgTGlzdDxUeXBlUGFyYW1ldGVyPiBrZXJuZWxUeXBlUGFyYW1ldGVyc0Zyb21CdWlsZGVycygKICAgICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiBidWlsZGVycykgewogICAgaWYgKGJ1aWxkZXJzID09IG51bGwpIHJldHVybiBudWxsOwogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiByZXN1bHQgPQogICAgICAgIG5ldyBMaXN0PFR5cGVQYXJhbWV0ZXI+LmZpbGxlZChidWlsZGVycy5sZW5ndGgsIG51bGwsIGdyb3dhYmxlOiB0cnVlKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVpbGRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0W2ldID0gYnVpbGRlcnNbaV0udGFyZ2V0OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KgIEATk48ASwBITUBRwEdCRweIBsYFR0BID8nASoBHUk3UCgpMEg5ASg/JUwBDEABOQEpARZDHTg3GkMWFxQGLQQBKTodODcaQxYXFAYlBAEmPwQBQSEZOz1QUE9JPTgZKwQBPx8EAUBNUBcqOgQBDCNJBAEMJwE/LCchTzAmBhMEAgFEcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfdHlwZV92YXJpYWJsZV9idWlsZGVyLmRhcnRIc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfdmFyaWFibGVfYnVpbGRlci5kYXJ0g3svLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5rZXJuZWxfdmFyaWFibGVfYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgVmFyaWFibGVEZWNsYXJhdGlvbjsKCmltcG9ydCAna2VybmVsX2J1aWxkZXIuZGFydCcgc2hvdyBEZWNsYXJhdGlvbjsKCmNsYXNzIEtlcm5lbFZhcmlhYmxlQnVpbGRlciBleHRlbmRzIERlY2xhcmF0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBEZWNsYXJhdGlvbiBwYXJlbnQ7CgogIEBvdmVycmlkZQogIGZpbmFsIFVyaSBmaWxlVXJpOwoKICBmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlOwoKICBLZXJuZWxWYXJpYWJsZUJ1aWxkZXIodGhpcy52YXJpYWJsZSwgdGhpcy5wYXJlbnQsIHRoaXMuZmlsZVVyaSk7CgogIEBvdmVycmlkZQogIGludCBnZXQgY2hhck9mZnNldCA9PiB2YXJpYWJsZS5maWxlT2Zmc2V0OwoKICBib29sIGdldCBpc0xvY2FsID0+IHRydWU7CgogIGJvb2wgZ2V0IGlzQ29uc3QgPT4gdmFyaWFibGUuaXNDb25zdDsKCiAgYm9vbCBnZXQgaXNGaW5hbCA9PiB2YXJpYWJsZS5pc0ZpbmFsOwoKICBWYXJpYWJsZURlY2xhcmF0aW9uIGdldCB0YXJnZXQgPT4gdmFyaWFibGU7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZnVsbE5hbWVGb3JFcnJvcnMgPT4gdmFyaWFibGUubmFtZSA/PyAiPHVubmFtZWQ+IjsKfQolAE5OPAEnATsBLwEyDBwBDBUBJgFDAQwtARwBKAEoAS4BDEACAT9wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF92YXJpYWJsZV9idWlsZGVyLmRhcnRFc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9sb2FkX2xpYnJhcnlfYnVpbGRlci5kYXJ0iCsvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBBcmd1bWVudHMsCiAgICAgICAgRGFydFR5cGUsCiAgICAgICAgRHluYW1pY1R5cGUsCiAgICAgICAgRnVuY3Rpb25Ob2RlLAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgTGlicmFyeURlcGVuZGVuY3ksCiAgICAgICAgTG9hZExpYnJhcnksCiAgICAgICAgTWVtYmVyLAogICAgICAgIE5hbWUsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFByb2NlZHVyZUtpbmQsCiAgICAgICAgUmV0dXJuU3RhdGVtZW50OwoKaW1wb3J0ICdrZXJuZWxfYnVpbGRlci5kYXJ0JyBzaG93IERlY2xhcmF0aW9uLCBLZXJuZWxMaWJyYXJ5QnVpbGRlcjsKCmltcG9ydCAnZm9yZXN0LmRhcnQnIHNob3cgRm9yZXN0OwoKLy8vIEJ1aWxkZXIgdG8gcmVwcmVzZW50IHRoZSBgZGVmZXJMaWJyYXJ5LmxvYWRMaWJyYXJ5YCBjYWxscyBhbmQgdGVhci1vZmZzLgpjbGFzcyBMb2FkTGlicmFyeUJ1aWxkZXIgZXh0ZW5kcyBEZWNsYXJhdGlvbiB7CiAgZmluYWwgS2VybmVsTGlicmFyeUJ1aWxkZXIgcGFyZW50OwoKICBmaW5hbCBMaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnREZXBlbmRlbmN5OwoKICAvLy8gT2Zmc2V0IG9mIHRoZSBpbXBvcnQgcHJlZml4LgogIGZpbmFsIGludCBjaGFyT2Zmc2V0OwoKICAvLy8gU3ludGhldGljIHN0YXRpYyBtZXRob2QgdG8gcmVwcmVzZW50IHRoZSB0ZWFyLW9mZiBvZiAnbG9hZExpYnJhcnknLiAgSWYKICAvLy8gbnVsbCwgbm8gdGVhci1vZmZzIHdlcmUgc2VlbiBpbiB0aGUgY29kZSBhbmQgbm8gbWV0aG9kIGlzIGdlbmVyYXRlZC4KICBNZW1iZXIgdGVhcm9mZjsKCiAgTG9hZExpYnJhcnlCdWlsZGVyKHRoaXMucGFyZW50LCB0aGlzLmltcG9ydERlcGVuZGVuY3ksIHRoaXMuY2hhck9mZnNldCk7CgogIFVyaSBnZXQgZmlsZVVyaSA9PiBwYXJlbnQuZmlsZVVyaTsKCiAgTG9hZExpYnJhcnkgY3JlYXRlTG9hZExpYnJhcnkoCiAgICAgIGludCBjaGFyT2Zmc2V0LCBGb3Jlc3QgZm9yZXN0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gZm9yZXN0LmxvYWRMaWJyYXJ5KGltcG9ydERlcGVuZGVuY3ksIGFyZ3VtZW50cykKICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICB9CgogIFByb2NlZHVyZSBjcmVhdGVUZWFyb2ZmTWV0aG9kKEZvcmVzdCBmb3Jlc3QpIHsKICAgIGlmICh0ZWFyb2ZmICE9IG51bGwpIHJldHVybiB0ZWFyb2ZmOwogICAgTG9hZExpYnJhcnkgZXhwcmVzc2lvbiA9IGNyZWF0ZUxvYWRMaWJyYXJ5KGNoYXJPZmZzZXQsIGZvcmVzdCwgbnVsbCk7CiAgICBTdHJpbmcgcHJlZml4ID0gZXhwcmVzc2lvbi5pbXBvcnQubmFtZTsKICAgIHRlYXJvZmYgPSBuZXcgUHJvY2VkdXJlKAogICAgICAgIG5ldyBOYW1lKCdfX2xvYWRMaWJyYXJ5XyRwcmVmaXgnLCBwYXJlbnQudGFyZ2V0KSwKICAgICAgICBQcm9jZWR1cmVLaW5kLk1ldGhvZCwKICAgICAgICBuZXcgRnVuY3Rpb25Ob2RlKG5ldyBSZXR1cm5TdGF0ZW1lbnQoZXhwcmVzc2lvbiksCiAgICAgICAgICAgIHJldHVyblR5cGU6IG5ldyBJbnRlcmZhY2VUeXBlKHBhcmVudC5sb2FkZXIuY29yZVR5cGVzLmZ1dHVyZUNsYXNzLAogICAgICAgICAgICAgICAgPERhcnRUeXBlPltjb25zdCBEeW5hbWljVHlwZSgpXSkpLAogICAgICAgIGZpbGVVcmk6IHBhcmVudC50YXJnZXQuZmlsZVVyaSwKICAgICAgICBpc1N0YXRpYzogdHJ1ZSkKICAgICAgLi5zdGFydEZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0CiAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgICByZXR1cm4gdGVhcm9mZjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZnVsbE5hbWVGb3JFcnJvcnMgPT4gJ2xvYWRMaWJyYXJ5JzsKfQpEAE5OPAEhCRMSFRYXGxUQDhMXGQFFASIBTS8lASwBIxgBTksSAUsBJQEhPDshBAExKUosHToeOk8zKBglIRQEAQwxAgE8cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9sb2FkX2xpYnJhcnlfYnVpbGRlci5kYXJ0P3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvdW5saW5rZWRfc2NvcGUuZGFydIRuLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAna2VybmVsX2J1aWxkZXIuZGFydCcgc2hvdyBEZWNsYXJhdGlvbiwgU2NvcGU7CgovLy8gU2NvcGUgdGhhdCByZXR1cm5zIGFuIFtVbmxpbmtlZERlY2xhcmF0aW9uXSBpZiBhIG5hbWUgY2FuJ3QgYmUgcmVzb2x2ZWQuCi8vLyBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYXMgdGhlIGBlbmNsb3NpbmdTY29wZWAgaW4gYEJvZHlCdWlsZGVyYCB0bwovLy8gY3JlYXRlIEFTVHMgd2l0aCBidWlsZGluZyBvdXRsaW5lcy4KY2xhc3MgVW5saW5rZWRTY29wZSBleHRlbmRzIFNjb3BlIHsKICBVbmxpbmtlZFNjb3BlKCkgOiBzdXBlci50b3AoaXNNb2RpZmlhYmxlOiBmYWxzZSk7CgogIERlY2xhcmF0aW9uIGxvb2t1cEluKFN0cmluZyBuYW1lLCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmksCiAgICAgIE1hcDxTdHJpbmcsIERlY2xhcmF0aW9uPiBtYXAsIGJvb2wgaXNJbnN0YW5jZVNjb3BlKSB7CiAgICByZXR1cm4gbmV3IFVubGlua2VkRGVjbGFyYXRpb24obmFtZSwgaXNJbnN0YW5jZVNjb3BlLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICB9Cn0KCmNsYXNzIFVubGlua2VkRGVjbGFyYXRpb24gZXh0ZW5kcyBEZWNsYXJhdGlvbiB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIGZpbmFsIGJvb2wgaXNJbnN0YW5jZVNjb3BlOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgY2hhck9mZnNldDsKCiAgQG92ZXJyaWRlCiAgZmluYWwgVXJpIGZpbGVVcmk7CgogIFVubGlua2VkRGVjbGFyYXRpb24oCiAgICAgIHRoaXMubmFtZSwgdGhpcy5pc0luc3RhbmNlU2NvcGUsIHRoaXMuY2hhck9mZnNldCwgdGhpcy5maWxlVXJpKTsKCiAgQG92ZXJyaWRlCiAgRGVjbGFyYXRpb24gZ2V0IHBhcmVudCA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGZ1bGxOYW1lRm9yRXJyb3JzID0+IG5hbWU7Cn0KKABOTjwBNgFNTCgkNAFBPFAEAgEwFQEeAQwYAQwVARdHAQwiAQwoAgE2cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC91bmxpbmtlZF9zY29wZS5kYXJ0OnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9yZXdyaXRlX3NldmVyaXR5LmRhcnSTPi8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3NldmVyaXR5LmRhcnQnIHNob3cgU2V2ZXJpdHk7CgppbXBvcnQgJ21lc3NhZ2VzLmRhcnQnIGFzIG1zZzsKClNldmVyaXR5IHJld3JpdGVTZXZlcml0eSgKICAgIFNldmVyaXR5IHNldmVyaXR5LCBtc2cuQ29kZTxPYmplY3Q+IGNvZGUsIFVyaSBmaWxlVXJpKSB7CiAgaWYgKHNldmVyaXR5ICE9IFNldmVyaXR5Lmlnbm9yZWQpIHsKICAgIHJldHVybiBzZXZlcml0eTsKICB9CgogIFN0cmluZyBwYXRoID0gZmlsZVVyaS5wYXRoOwogIFN0cmluZyBmYXN0YVBhdGggPSAiL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS8iOwogIGludCBpbmRleCA9IHBhdGguaW5kZXhPZihmYXN0YVBhdGgpOwogIGlmIChpbmRleCA9PSAtMSkgewogICAgZmFzdGFQYXRoID0gIi9wa2cvZnJvbnRfZW5kL3Rvb2wvX2Zhc3RhLyI7CiAgICBpbmRleCA9IHBhdGguaW5kZXhPZihmYXN0YVBhdGgpOwogICAgaWYgKGluZGV4ID09IC0xKSByZXR1cm4gc2V2ZXJpdHk7CiAgfQogIGlmIChjb2RlID09IG1zZy5jb2RlVXNlT2ZEZXByZWNhdGVkSWRlbnRpZmllcikgewogICAgLy8gVE9ETyhhaGUpOiBSZW1vdmUgdGhlIGV4Y2VwdGlvbnMgYmVsb3cuCiAgICAvLyBXZSBwbGFuIHRvIHJlbW92ZSBhbGwgdXNlcyBvZiBkZXByZWNhdGVkIGlkZW50aWZpZXJzIGZyb20gRmFzdGEuIFRoZQogICAgLy8gc3RyYXRlZ3kgaXMgdG8gcmVtb3ZlIGZpbGVzIGZyb20gdGhlIGxpc3QgYmVsb3cgb25lIGJ5IG9uZS4gVG8gZ2V0CiAgICAvLyBzdGFydGVkIG9uIGNsZWFuaW5nIHVwIGEgZ2l2ZW4gZmlsZSwgc2ltcGx5IHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0CiAgICAvLyBiZWxvdyBhbmQgY29tcGlsZSBGYXN0YSB3aXRoIGl0c2VsZiB0byBnZXQgYSBsaXN0IG9mIHJlbWFpbmluZyBjYWxsCiAgICAvLyBzaXRlcy4KICAgIHN3aXRjaCAocGF0aC5zdWJzdHJpbmcoZmFzdGFQYXRoLmxlbmd0aCArIGluZGV4KSkgewogICAgICBjYXNlICJjb21tYW5kX2xpbmUuZGFydCI6CiAgICAgIGNhc2UgImtlcm5lbC9ib2R5X2J1aWxkZXIuZGFydCI6CiAgICAgICAgcmV0dXJuIHNldmVyaXR5OwogICAgfQogIH0gZWxzZSBpZiAoY29kZSA9PSBtc2cuY29kZU1pc3NpbmdFeHBsaWNpdFR5cGVBcmd1bWVudHMpIHsKICAgIC8vIFRPRE8oYWhlKTogUmVtb3ZlIHRoZSBleGNlcHRpb25zIGJlbG93LgogICAgLy8gV2UncmUgbm90IHN1cmUgaWYgd2Ugd2FudCB0byByZXF1aXJlIHRoYXQgYWxsIHR5cGVzIGhhdmUgZXhwbGljaXQgdHlwZQogICAgLy8gYXJndW1lbnRzIGluIEZhc3RhLiBSZWdhcmRsZXMsIHRoZSBzdHJhdGVneSBpcyB0byByZW1vdmUgZmlsZXMgZnJvbSB0aGUKICAgIC8vIGxpc3QgYmVsb3cgb25lIGJ5IG9uZS4gVG8gZ2V0IHN0YXJ0ZWQgb24gY2xlYW5pbmcgdXAgYSBnaXZlbiBmaWxlLAogICAgLy8gc2ltcGx5IHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0IGJlbG93IGFuZCBjb21waWxlIEZhc3RhIHdpdGggaXRzZWxmIHRvCiAgICAvLyBnZXQgYSBsaXN0IG9mIHJlbWFpbmluZyBjYWxsIHNpdGVzLgogICAgc3dpdGNoIChwYXRoLnN1YnN0cmluZyhmYXN0YVBhdGgubGVuZ3RoICsgaW5kZXgpKSB7CiAgICAgIGNhc2UgImJ1aWxkZXIvYnVpbHRpbl90eXBlX2J1aWxkZXIuZGFydCI6CiAgICAgIGNhc2UgImJ1aWxkZXIvY2xhc3NfYnVpbGRlci5kYXJ0IjoKICAgICAgY2FzZSAiYnVpbGRlci9jb25zdHJ1Y3Rvcl9yZWZlcmVuY2VfYnVpbGRlci5kYXJ0IjoKICAgICAgY2FzZSAiYnVpbGRlci9keW5hbWljX3R5cGVfYnVpbGRlci5kYXJ0IjoKICAgICAgY2FzZSAiYnVpbGRlci9maWVsZF9idWlsZGVyLmRhcnQiOgogICAgICBjYXNlICJidWlsZGVyL2Zvcm1hbF9wYXJhbWV0ZXJfYnVpbGRlci5kYXJ0IjoKICAgICAgY2FzZSAiYnVpbGRlci9mdW5jdGlvbl90eXBlX2J1aWxkZXIuZGFydCI6CiAgICAgIGNhc2UgImJ1aWxkZXIvbGlicmFyeV9idWlsZGVyLmRhcnQiOgogICAgICBjYXNlICJidWlsZGVyL21lbWJlcl9idWlsZGVyLmRhcnQiOgogICAgICBjYXNlICJidWlsZGVyL21peGluX2FwcGxpY2F0aW9uX2J1aWxkZXIuZGFydCI6CiAgICAgIGNhc2UgImJ1aWxkZXIvbmFtZWRfdHlwZV9idWlsZGVyLmRhcnQiOgogICAgICBjYXNlICJidWlsZGVyL3ByZWZpeF9idWlsZGVyLmRhcnQiOgogICAgICBjYXNlICJidWlsZGVyL3Byb2NlZHVyZV9idWlsZGVyLmRhcnQiOgogICAgICBjYXNlICJidWlsZGVyL3R5cGVfYnVpbGRlci5kYXJ0IjoKICAgICAgY2FzZSAiYnVpbGRlci90eXBlX3ZhcmlhYmxlX2J1aWxkZXIuZGFydCI6CiAgICAgIGNhc2UgImJ1aWxkZXIvdW5yZXNvbHZlZF90eXBlLmRhcnQiOgogICAgICBjYXNlICJidWlsZGVyL3ZvaWRfdHlwZV9idWlsZGVyLmRhcnQiOgogICAgICBjYXNlICJidWlsZGVyX2dyYXBoLmRhcnQiOgogICAgICBjYXNlICJjb21waWxlcl9jb250ZXh0LmRhcnQiOgogICAgICBjYXNlICJkaWxsL2RpbGxfY2xhc3NfYnVpbGRlci5kYXJ0IjoKICAgICAgY2FzZSAiZGlsbC9kaWxsX2xpYnJhcnlfYnVpbGRlci5kYXJ0IjoKICAgICAgY2FzZSAiZGlsbC9kaWxsX2xvYWRlci5kYXJ0IjoKICAgICAgY2FzZSAiZGlsbC9kaWxsX3RhcmdldC5kYXJ0IjoKICAgICAgY2FzZSAiZW50cnlfcG9pbnRzLmRhcnQiOgogICAgICBjYXNlICJleHBvcnQuZGFydCI6CiAgICAgIGNhc2UgImZhc3RhX2NvZGVzLmRhcnQiOgogICAgICBjYXNlICJpbXBvcnQuZGFydCI6CiAgICAgIGNhc2UgImluY3JlbWVudGFsX2NvbXBpbGVyLmRhcnQiOgogICAgICBjYXNlICJrZXJuZWwvZXhwcmVzc2lvbl9nZW5lcmF0b3IuZGFydCI6CiAgICAgIGNhc2UgImtlcm5lbC9leHByZXNzaW9uX2dlbmVyYXRvcl9oZWxwZXIuZGFydCI6CiAgICAgIGNhc2UgImtlcm5lbC9mYW5nb3JuLmRhcnQiOgogICAgICBjYXNlICJrZXJuZWwvZm9yZXN0LmRhcnQiOgogICAgICBjYXNlICJrZXJuZWwva2VybmVsX2NsYXNzX2J1aWxkZXIuZGFydCI6CiAgICAgIGNhc2UgImtlcm5lbC9rZXJuZWxfZW51bV9idWlsZGVyLmRhcnQiOgogICAgICBjYXNlICJrZXJuZWwva2VybmVsX2V4cHJlc3Npb25fZ2VuZXJhdG9yLmRhcnQiOgogICAgICBjYXNlICJrZXJuZWwva2VybmVsX2V4cHJlc3Npb25fZ2VuZXJhdG9yX2ltcGwuZGFydCI6CiAgICAgIGNhc2UgImtlcm5lbC9rZXJuZWxfZmllbGRfYnVpbGRlci5kYXJ0IjoKICAgICAgY2FzZSAia2VybmVsL2tlcm5lbF9mb3JtYWxfcGFyYW1ldGVyX2J1aWxkZXIuZGFydCI6CiAgICAgIGNhc2UgImtlcm5lbC9rZXJuZWxfZnVuY3Rpb25fdHlwZV9idWlsZGVyLmRhcnQiOgogICAgICBjYXNlICJrZXJuZWwva2VybmVsX2ludmFsaWRfdHlwZV9idWlsZGVyLmRhcnQiOgogICAgICBjYXNlICJrZXJuZWwva2VybmVsX2xpYnJhcnlfYnVpbGRlci5kYXJ0IjoKICAgICAgY2FzZSAia2VybmVsL2tlcm5lbF9taXhpbl9hcHBsaWNhdGlvbl9idWlsZGVyLmRhcnQiOgogICAgICBjYXNlICJrZXJuZWwva2VybmVsX25hbWVkX3R5cGVfYnVpbGRlci5kYXJ0IjoKICAgICAgY2FzZSAia2VybmVsL2tlcm5lbF9wcmVmaXhfYnVpbGRlci5kYXJ0IjoKICAgICAgY2FzZSAia2VybmVsL2tlcm5lbF9wcm9jZWR1cmVfYnVpbGRlci5kYXJ0IjoKICAgICAgY2FzZSAia2VybmVsL2tlcm5lbF9zaGFkb3dfYXN0LmRhcnQiOgogICAgICBjYXNlICJrZXJuZWwva2VybmVsX3RhcmdldC5kYXJ0IjoKICAgICAgY2FzZSAia2VybmVsL2tlcm5lbF90eXBlX2J1aWxkZXIuZGFydCI6CiAgICAgIGNhc2UgImtlcm5lbC9rZXJuZWxfdHlwZV92YXJpYWJsZV9idWlsZGVyLmRhcnQiOgogICAgICBjYXNlICJrZXJuZWwvbG9hZF9saWJyYXJ5X2J1aWxkZXIuZGFydCI6CiAgICAgIGNhc2UgImtlcm5lbC9tZXRhZGF0YV9jb2xsZWN0b3IuZGFydCI6CiAgICAgIGNhc2UgImtlcm5lbC90eXBlX2FsZ29yaXRobXMuZGFydCI6CiAgICAgIGNhc2UgImtlcm5lbC92ZXJpZmllci5kYXJ0IjoKICAgICAgY2FzZSAibG9hZGVyLmRhcnQiOgogICAgICBjYXNlICJzY2FubmVyL2Vycm9yX3Rva2VuLmRhcnQiOgogICAgICBjYXNlICJzY2FubmVyL3JlY292ZXIuZGFydCI6CiAgICAgIGNhc2UgInNjb3BlLmRhcnQiOgogICAgICBjYXNlICJzb3VyY2UvZGlldF9saXN0ZW5lci5kYXJ0IjoKICAgICAgY2FzZSAic291cmNlL291dGxpbmVfYnVpbGRlci5kYXJ0IjoKICAgICAgY2FzZSAic291cmNlL3NvdXJjZV9jbGFzc19idWlsZGVyLmRhcnQiOgogICAgICBjYXNlICJzb3VyY2Uvc291cmNlX2xpYnJhcnlfYnVpbGRlci5kYXJ0IjoKICAgICAgY2FzZSAic291cmNlL3NvdXJjZV9sb2FkZXIuZGFydCI6CiAgICAgIGNhc2UgInNvdXJjZS9zdGFja19saXN0ZW5lci5kYXJ0IjoKICAgICAgY2FzZSAidGFyZ2V0X2ltcGxlbWVudGF0aW9uLmRhcnQiOgogICAgICBjYXNlICJ0eXBlX2luZmVyZW5jZS9pbnRlcmZhY2VfcmVzb2x2ZXIuZGFydCI6CiAgICAgIGNhc2UgInR5cGVfaW5mZXJlbmNlL3R5cGVfaW5mZXJlbmNlX2VuZ2luZS5kYXJ0IjoKICAgICAgY2FzZSAidHlwZV9pbmZlcmVuY2UvdHlwZV9pbmZlcnJlci5kYXJ0IjoKICAgICAgY2FzZSAidHlwZV9pbmZlcmVuY2UvdHlwZV9zY2hlbWEuZGFydCI6CiAgICAgIGNhc2UgInV0aWwvbGluay5kYXJ0IjoKICAgICAgY2FzZSAidXRpbC9saW5rX2ltcGxlbWVudGF0aW9uLmRhcnQiOgogICAgICAgIHJldHVybiBzZXZlcml0eTsKICAgIH0KICB9CiAgcmV0dXJuIFNldmVyaXR5LmVycm9yOwp9CncATk48ASYBHwEaPSYVBAEeNicVLyUmBDMvTEpLSw44ICcZBj0vTk9KTSs4MCk5MCk0MSsqNS4qLSgxKy0hJCstJCQgGh8aKC82IiEvLjY7Lzo3NjE7NDAzLCguNy8tKiMaJyMZKCovMSgpKTU4MC4dLBkGBBkCATFwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcmV3cml0ZV9zZXZlcml0eS5kYXJ0MHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS90YXJnZXQuZGFydIMuLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEudGFyZ2V0OwoKaW1wb3J0ICdkYXJ0OmFzeW5jJyBzaG93IEZ1dHVyZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgQ29tcG9uZW50OwoKaW1wb3J0ICd0aWNrZXIuZGFydCcgc2hvdyBUaWNrZXI7CgovLy8gQSBjb21waWxhdGlvbiB0YXJnZXQuCi8vLwovLy8gQSB0YXJnZXQgcmVhZHMgc291cmNlIGZpbGVzIHdpdGggW3JlYWRdLCBidWlsZHMgb3V0bGluZXMgd2hlbgovLy8gW2J1aWxkT3V0bGluZXNdIGlzIGNhbGxlZCBhbmQgYnVpbGRzIHRoZSBmdWxsIGNvbXBvbmVudCB3aGVuCi8vLyBbYnVpbGRDb21wb25lbnRdIGlzIGNhbGxlZC4KYWJzdHJhY3QgY2xhc3MgVGFyZ2V0IHsKICBmaW5hbCBUaWNrZXIgdGlja2VyOwoKICBUYXJnZXQodGhpcy50aWNrZXIpOwoKICAvLy8gQnVpbGQgYW5kIHJldHVybiBvdXRsaW5lcyBmb3IgYWxsIGxpYnJhcmllcy4KICBGdXR1cmU8Q29tcG9uZW50PiBidWlsZE91dGxpbmVzKCk7CgogIC8vLyBCdWlsZCBhbmQgcmV0dXJuIHRoZSBmdWxsIGNvbXBvbmVudCBmb3IgYWxsIGxpYnJhcmllcy4KICBGdXR1cmU8Q29tcG9uZW50PiBidWlsZENvbXBvbmVudCgpOwp9Ch4ATk48ARYBIQExASIBGgRCQSAYFwEXATMlAT0mAgEncGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3RhcmdldC5kYXJ0QXNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9kaWxsL2RpbGxfY2xhc3NfYnVpbGRlci5kYXJ0k3YvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5kaWxsX2NsYXNzX2J1aWxkZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdyBDbGFzcywgRGFydFR5cGUsIE1lbWJlciwgU3VwZXJ0eXBlLCBUeXBlUGFyYW1ldGVyOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuaW1wbGVtZW50ZWQ7CgppbXBvcnQgJy4uL2tlcm5lbC9rZXJuZWxfYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIEtlcm5lbENsYXNzQnVpbGRlciwKICAgICAgICBLZXJuZWxUeXBlQnVpbGRlciwKICAgICAgICBLZXJuZWxUeXBlVmFyaWFibGVCdWlsZGVyLAogICAgICAgIExpYnJhcnlCdWlsZGVyLAogICAgICAgIE1lbWJlckJ1aWxkZXIsCiAgICAgICAgU2NvcGUsCiAgICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlcjsKCmltcG9ydCAnLi4vbW9kaWZpZXIuZGFydCcgc2hvdyBhYnN0cmFjdE1hc2s7CgppbXBvcnQgJ2RpbGxfbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgRGlsbExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICdkaWxsX21lbWJlcl9idWlsZGVyLmRhcnQnIHNob3cgRGlsbE1lbWJlckJ1aWxkZXI7CgpjbGFzcyBEaWxsQ2xhc3NCdWlsZGVyIGV4dGVuZHMgS2VybmVsQ2xhc3NCdWlsZGVyIHsKICBmaW5hbCBDbGFzcyBjbHM7CgogIERpbGxDbGFzc0J1aWxkZXIoQ2xhc3MgY2xzLCBEaWxsTGlicmFyeUJ1aWxkZXIgcGFyZW50KQogICAgICA6IGNscyA9IGNscywKICAgICAgICBzdXBlcigKICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgY29tcHV0ZU1vZGlmaWVycyhjbHMpLAogICAgICAgICAgICBjbHMubmFtZSwKICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgbmV3IFNjb3BlKDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+e30sIDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+e30sCiAgICAgICAgICAgICAgICBwYXJlbnQuc2NvcGUsICJjbGFzcyAke2Nscy5uYW1lfSIsIGlzTW9kaWZpYWJsZTogZmFsc2UpLAogICAgICAgICAgICBuZXcgU2NvcGUoPFN0cmluZywgTWVtYmVyQnVpbGRlcj57fSwgbnVsbCwgbnVsbCwgY2xzLm5hbWUsCiAgICAgICAgICAgICAgICBpc01vZGlmaWFibGU6IGZhbHNlKSwKICAgICAgICAgICAgcGFyZW50LAogICAgICAgICAgICBjbHMuZmlsZU9mZnNldCk7CgogIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gZ2V0IHR5cGVWYXJpYWJsZXMgewogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzID0gc3VwZXIudHlwZVZhcmlhYmxlczsKICAgIGlmICh0eXBlVmFyaWFibGVzID09IG51bGwgJiYgY2xzLnR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgdHlwZVZhcmlhYmxlcyA9IHN1cGVyLnR5cGVWYXJpYWJsZXMgPQogICAgICAgICAgY29tcHV0ZVR5cGVWYXJpYWJsZUJ1aWxkZXJzKGxpYnJhcnksIGNscy50eXBlUGFyYW1ldGVycyk7CiAgICB9CiAgICByZXR1cm4gdHlwZVZhcmlhYmxlczsKICB9CgogIFVyaSBnZXQgZmlsZVVyaSA9PiBjbHMuZmlsZVVyaTsKCiAgS2VybmVsVHlwZUJ1aWxkZXIgZ2V0IHN1cGVydHlwZSB7CiAgICBLZXJuZWxUeXBlQnVpbGRlciBzdXBlcnR5cGUgPSBzdXBlci5zdXBlcnR5cGU7CiAgICBpZiAoc3VwZXJ0eXBlID09IG51bGwpIHsKICAgICAgU3VwZXJ0eXBlIHRhcmdldFN1cGVydHlwZSA9IGNscy5zdXBlcnR5cGU7CiAgICAgIGlmICh0YXJnZXRTdXBlcnR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIHN1cGVyLnN1cGVydHlwZSA9CiAgICAgICAgICBzdXBlcnR5cGUgPSBjb21wdXRlVHlwZUJ1aWxkZXIobGlicmFyeSwgdGFyZ2V0U3VwZXJ0eXBlKTsKICAgIH0KICAgIHJldHVybiBzdXBlcnR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzcyBnZXQgYWN0dWFsQ2xzID0+IGNsczsKCiAgdm9pZCBhZGRNZW1iZXIoTWVtYmVyIG1lbWJlcikgewogICAgRGlsbE1lbWJlckJ1aWxkZXIgYnVpbGRlciA9IG5ldyBEaWxsTWVtYmVyQnVpbGRlcihtZW1iZXIsIHRoaXMpOwogICAgU3RyaW5nIG5hbWUgPSBtZW1iZXIubmFtZS5uYW1lOwogICAgaWYgKGJ1aWxkZXIuaXNDb25zdHJ1Y3RvciB8fCBidWlsZGVyLmlzRmFjdG9yeSkgewogICAgICBjb25zdHJ1Y3RvclNjb3BlQnVpbGRlci5hZGRNZW1iZXIobmFtZSwgYnVpbGRlcik7CiAgICB9IGVsc2UgaWYgKGJ1aWxkZXIuaXNTZXR0ZXIpIHsKICAgICAgc2NvcGVCdWlsZGVyLmFkZFNldHRlcihuYW1lLCBidWlsZGVyKTsKICAgIH0gZWxzZSB7CiAgICAgIHNjb3BlQnVpbGRlci5hZGRNZW1iZXIobmFtZSwgYnVpbGRlcik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IHR5cGVWYXJpYWJsZXNDb3VudCA9PiBjbHMudHlwZVBhcmFtZXRlcnMubGVuZ3RoOwoKICBAb3ZlcnJpZGUKICBMaXN0PERhcnRUeXBlPiBidWlsZFR5cGVBcmd1bWVudHMoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIExpc3Q8S2VybmVsVHlwZUJ1aWxkZXI+IGFyZ3VtZW50cykgewogICAgLy8gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIFt0eXBlVmFyaWFibGVzXSBhcmVuJ3QgcmVzdG9yZWQgZnJvbSBbdGFyZ2V0XS4KICAgIC8vIFNvLCBpZiBbYXJndW1lbnRzXSBpcyBudWxsLCB0aGUgZGVmYXVsdCB0eXBlcyBzaG91bGQgYmUgcmV0cmlldmVkIGZyb20KICAgIC8vIFtjbHMudHlwZVBhcmFtZXRlcnNdLgogICAgaWYgKGFyZ3VtZW50cyA9PSBudWxsKSB7CiAgICAgIExpc3Q8RGFydFR5cGU+IHJlc3VsdCA9IG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQoCiAgICAgICAgICBjbHMudHlwZVBhcmFtZXRlcnMubGVuZ3RoLCBudWxsLAogICAgICAgICAgZ3Jvd2FibGU6IHRydWUpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7ICsraSkgewogICAgICAgIHJlc3VsdFtpXSA9IGNscy50eXBlUGFyYW1ldGVyc1tpXS5kZWZhdWx0VHlwZTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8vIFthcmd1bWVudHNdICE9IG51bGwKICAgIExpc3Q8RGFydFR5cGU+IHJlc3VsdCA9CiAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZChhcmd1bWVudHMubGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSBhcmd1bWVudHNbaV0uYnVpbGQobGlicmFyeSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNsYXNzIGlzIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgYSBtaXhpbiB0byBpdHMKICAvLy8gc3VwZXJjbGFzcy4KICBib29sIGdldCBpc01peGluQXBwbGljYXRpb24gPT4gY2xzLmlzTWl4aW5BcHBsaWNhdGlvbjsKCiAgS2VybmVsVHlwZUJ1aWxkZXIgZ2V0IG1peGVkSW5UeXBlIHsKICAgIHJldHVybiBjb21wdXRlVHlwZUJ1aWxkZXIobGlicmFyeSwgY2xzLm1peGVkSW5UeXBlKTsKICB9CgogIExpc3Q8S2VybmVsVHlwZUJ1aWxkZXI+IGdldCBpbnRlcmZhY2VzIHsKICAgIGlmIChjbHMuaW1wbGVtZW50ZWRUeXBlcy5pc0VtcHR5KSByZXR1cm4gbnVsbDsKICAgIGlmIChzdXBlci5pbnRlcmZhY2VzID09IG51bGwpIHsKICAgICAgTGlzdDxLZXJuZWxUeXBlQnVpbGRlcj4gcmVzdWx0ID0KICAgICAgICAgIG5ldyBMaXN0PEtlcm5lbFR5cGVCdWlsZGVyPihjbHMuaW1wbGVtZW50ZWRUeXBlcy5sZW5ndGgpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewogICAgICAgIHJlc3VsdFtpXSA9IGNvbXB1dGVUeXBlQnVpbGRlcihsaWJyYXJ5LCBjbHMuaW1wbGVtZW50ZWRUeXBlc1tpXSk7CiAgICAgIH0KICAgICAgc3VwZXIuaW50ZXJmYWNlcyA9IHJlc3VsdDsKICAgIH0KICAgIHJldHVybiBzdXBlci5pbnRlcmZhY2VzOwogIH0KCiAgdm9pZCBzZXQgbWl4ZWRJblR5cGUoS2VybmVsVHlwZUJ1aWxkZXIgbWl4aW4pIHsKICAgIHVuaW1wbGVtZW50ZWQoIm1peGVkSW5UeXBlPSIsIC0xLCBudWxsKTsKICB9Cn0KCmludCBjb21wdXRlTW9kaWZpZXJzKENsYXNzIGNscykgewogIHJldHVybiBjbHMuaXNBYnN0cmFjdCA/IGFic3RyYWN0TWFzayA6IDA7Cn0KCktlcm5lbFR5cGVCdWlsZGVyIGNvbXB1dGVUeXBlQnVpbGRlcigKICAgIERpbGxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBTdXBlcnR5cGUgc3VwZXJ0eXBlKSB7CiAgcmV0dXJuIHN1cGVydHlwZSA9PSBudWxsCiAgICAgID8gbnVsbAogICAgICA6IGxpYnJhcnkubG9hZGVyLmNvbXB1dGVUeXBlQnVpbGRlcihzdXBlcnR5cGUuYXNJbnRlcmZhY2VUeXBlKTsKfQoKTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiBjb21wdXRlVHlwZVZhcmlhYmxlQnVpbGRlcnMoCiAgICBEaWxsTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycykgewogIGlmICh0eXBlUGFyYW1ldGVycyA9PSBudWxsIHx8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDsKICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHJlc3VsdCA9CiAgICAgIG5ldyBMaXN0LmZpbGxlZCh0eXBlUGFyYW1ldGVycy5sZW5ndGgsIG51bGwpOwogIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7CiAgICByZXN1bHRbaV0gPQogICAgICAgIG5ldyBLZXJuZWxUeXBlVmFyaWFibGVCdWlsZGVyLmZyb21LZXJuZWwodHlwZVBhcmFtZXRlcnNbaV0sIGxpYnJhcnkpOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CoChAE5OPAEiASE8AS4BJwkcGyMYFw8dAS0BPAE6ATQTATkTDxIjFhISEkxJRyYUHQEwQ0IsRAYaBAEiASQzHTEwGEQGFgQBDB4BIkUkNjgjLQ0tBgQBDDsBDCVDT04dHTkrGzA3CBUGARscSy4vBhMEAUoSOQEmOQQBKzMkJ0QwSgghBh0EATItBAIBIiwCASY3Gw1GAgE3RkklNCwQTgQRAgE4cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2RpbGwvZGlsbF9jbGFzc19idWlsZGVyLmRhcnRGc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2RpbGwvZGlsbF90eXBlX2FsaWFzX2J1aWxkZXIuZGFydIhrLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuZGlsbF90eXBlZGVmX2J1aWxkZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IERhcnRUeXBlLCBMaWJyYXJ5LCBUeXBlZGVmOwoKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX2J1aWxkZXIuZGFydCcKICAgIHNob3cKICAgICAgICBLZXJuZWxUeXBlQWxpYXNCdWlsZGVyLAogICAgICAgIEtlcm5lbEZ1bmN0aW9uVHlwZUJ1aWxkZXIsCiAgICAgICAgS2VybmVsVHlwZUJ1aWxkZXIsCiAgICAgICAgTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgTWV0YWRhdGFCdWlsZGVyOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuaW1wbGVtZW50ZWQ7CgppbXBvcnQgJ2RpbGxfbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgRGlsbExpYnJhcnlCdWlsZGVyOwoKY2xhc3MgRGlsbFR5cGVBbGlhc0J1aWxkZXIgZXh0ZW5kcyBLZXJuZWxUeXBlQWxpYXNCdWlsZGVyIHsKICBEaWxsVHlwZUFsaWFzQnVpbGRlcihUeXBlZGVmIHR5cGVkZWYsIERpbGxMaWJyYXJ5QnVpbGRlciBwYXJlbnQpCiAgICAgIDogc3VwZXIobnVsbCwgdHlwZWRlZi5uYW1lLCBudWxsLCBudWxsLCBwYXJlbnQsIHR5cGVkZWYuZmlsZU9mZnNldCwKICAgICAgICAgICAgdHlwZWRlZik7CgogIExpc3Q8TWV0YWRhdGFCdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyPj4gZ2V0IG1ldGFkYXRhIHsKICAgIHJldHVybiB1bmltcGxlbWVudGVkKCJtZXRhZGF0YSIsIC0xLCBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgdHlwZVZhcmlhYmxlc0NvdW50ID0+IHRhcmdldC50eXBlUGFyYW1ldGVycy5sZW5ndGg7CgogIEBvdmVycmlkZQogIEtlcm5lbEZ1bmN0aW9uVHlwZUJ1aWxkZXIgZ2V0IHR5cGUgewogICAgcmV0dXJuIHVuaW1wbGVtZW50ZWQoInR5cGUiLCAtMSwgbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBidWlsZFRoaXNUeXBlKExpYnJhcnlCdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyLCBMaWJyYXJ5PiBsaWJyYXJ5KSB7CiAgICByZXR1cm4gdGhpc1R5cGUgPz89IHRhcmdldC50eXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxEYXJ0VHlwZT4gYnVpbGRUeXBlQXJndW1lbnRzKAogICAgICBMaWJyYXJ5QnVpbGRlcjxLZXJuZWxUeXBlQnVpbGRlciwgTGlicmFyeT4gbGlicmFyeSwKICAgICAgTGlzdDxLZXJuZWxUeXBlQnVpbGRlcj4gYXJndW1lbnRzKSB7CiAgICAvLyBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgW3R5cGVWYXJpYWJsZXNdIGFyZW4ndCByZXN0b3JlZCBmcm9tIFt0YXJnZXRdLgogICAgLy8gU28sIGlmIFthcmd1bWVudHNdIGlzIG51bGwsIHRoZSBkZWZhdWx0IHR5cGVzIHNob3VsZCBiZSByZXRyaWV2ZWQgZnJvbQogICAgLy8gW2Nscy50eXBlUGFyYW1ldGVyc10uCiAgICBpZiAoYXJndW1lbnRzID09IG51bGwpIHsKICAgICAgTGlzdDxEYXJ0VHlwZT4gcmVzdWx0ID0gbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCgKICAgICAgICAgIHRhcmdldC50eXBlUGFyYW1ldGVycy5sZW5ndGgsIG51bGwsCiAgICAgICAgICBncm93YWJsZTogdHJ1ZSk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgcmVzdWx0W2ldID0gdGFyZ2V0LnR5cGVQYXJhbWV0ZXJzW2ldLmRlZmF1bHRUeXBlOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgLy8gW2FyZ3VtZW50c10gIT0gbnVsbAogICAgTGlzdDxEYXJ0VHlwZT4gcmVzdWx0ID0KICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKGFyZ3VtZW50cy5sZW5ndGgsIG51bGwsIGdyb3dhYmxlOiB0cnVlKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgKytpKSB7CiAgICAgIHJlc3VsdFtpXSA9IGFyZ3VtZW50c1tpXS5idWlsZChsaWJyYXJ5KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CkYATk48ASQBQgEnCSAjGxgZAS4BPAE8Q0oWATowBAEMPgEMJywEAQxPJQQBDCU6K09OHR05LhswOggVBgEbHEsuLwYTBAIBPXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9kaWxsL2RpbGxfdHlwZV9hbGlhc19idWlsZGVyLmRhcnRGc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC90eXBlX2J1aWxkZXJfY29tcHV0ZXIuZGFydJGeLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEudHlwZV9idWlsZGVyX2NvbXB1dGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBCb3R0b21UeXBlLAogICAgICAgIENsYXNzLAogICAgICAgIERhcnRUeXBlLAogICAgICAgIERhcnRUeXBlVmlzaXRvciwKICAgICAgICBEeW5hbWljVHlwZSwKICAgICAgICBGdW5jdGlvblR5cGUsCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBJbnZhbGlkVHlwZSwKICAgICAgICBMaWJyYXJ5LAogICAgICAgIE5hbWVkVHlwZSwKICAgICAgICBUeXBlUGFyYW1ldGVyLAogICAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlLAogICAgICAgIFR5cGVkZWZUeXBlLAogICAgICAgIFZvaWRUeXBlOwoKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX2J1aWxkZXIuZGFydCcKICAgIHNob3cKICAgICAgICBEeW5hbWljVHlwZUJ1aWxkZXIsCiAgICAgICAgS2VybmVsQ2xhc3NCdWlsZGVyLAogICAgICAgIEtlcm5lbEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIsCiAgICAgICAgS2VybmVsRnVuY3Rpb25UeXBlQnVpbGRlciwKICAgICAgICBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyLAogICAgICAgIEtlcm5lbFR5cGVCdWlsZGVyLAogICAgICAgIEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXIsCiAgICAgICAgTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgVm9pZFR5cGVCdWlsZGVyOwoKaW1wb3J0ICcuLi9sb2FkZXIuZGFydCcgc2hvdyBMb2FkZXI7CgppbXBvcnQgJy4uL3BhcnNlci5kYXJ0JyBzaG93IEZvcm1hbFBhcmFtZXRlcktpbmQ7CgpjbGFzcyBUeXBlQnVpbGRlckNvbXB1dGVyIGltcGxlbWVudHMgRGFydFR5cGVWaXNpdG9yPEtlcm5lbFR5cGVCdWlsZGVyPiB7CiAgZmluYWwgTG9hZGVyPExpYnJhcnk+IGxvYWRlcjsKCiAgY29uc3QgVHlwZUJ1aWxkZXJDb21wdXRlcih0aGlzLmxvYWRlcik7CgogIEtlcm5lbFR5cGVCdWlsZGVyIGRlZmF1bHREYXJ0VHlwZShEYXJ0VHlwZSBub2RlKSB7CiAgICB0aHJvdyAiVW5zdXBwb3J0ZWQiOwogIH0KCiAgS2VybmVsVHlwZUJ1aWxkZXIgdmlzaXRJbnZhbGlkVHlwZShJbnZhbGlkVHlwZSBub2RlKSB7CiAgICB0aHJvdyAiTm90IGltcGxlbWVudGVkIjsKICB9CgogIEtlcm5lbFR5cGVCdWlsZGVyIHZpc2l0RHluYW1pY1R5cGUoRHluYW1pY1R5cGUgbm9kZSkgewogICAgcmV0dXJuIG5ldyBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyKCJkeW5hbWljIiwgbnVsbCkKICAgICAgLi5iaW5kKG5ldyBEeW5hbWljVHlwZUJ1aWxkZXI8S2VybmVsVHlwZUJ1aWxkZXIsIERhcnRUeXBlPigKICAgICAgICAgIGNvbnN0IER5bmFtaWNUeXBlKCksIGxvYWRlci5jb3JlTGlicmFyeSwgLTEpKTsKICB9CgogIEtlcm5lbFR5cGVCdWlsZGVyIHZpc2l0Vm9pZFR5cGUoVm9pZFR5cGUgbm9kZSkgewogICAgcmV0dXJuIG5ldyBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyKCJ2b2lkIiwgbnVsbCkKICAgICAgLi5iaW5kKG5ldyBWb2lkVHlwZUJ1aWxkZXI8S2VybmVsVHlwZUJ1aWxkZXIsIFZvaWRUeXBlPigKICAgICAgICAgIGNvbnN0IFZvaWRUeXBlKCksIGxvYWRlci5jb3JlTGlicmFyeSwgLTEpKTsKICB9CgogIEtlcm5lbFR5cGVCdWlsZGVyIHZpc2l0Qm90dG9tVHlwZShCb3R0b21UeXBlIG5vZGUpIHsKICAgIHRocm93ICJOb3QgaW1wbGVtZW50ZWQiOwogIH0KCiAgS2VybmVsVHlwZUJ1aWxkZXIgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgbm9kZSkgewogICAgS2VybmVsQ2xhc3NCdWlsZGVyIGNscyA9CiAgICAgICAgbG9hZGVyLmNvbXB1dGVDbGFzc0J1aWxkZXJGcm9tVGFyZ2V0Q2xhc3Mobm9kZS5jbGFzc05vZGUpOwogICAgTGlzdDxLZXJuZWxUeXBlQnVpbGRlcj4gYXJndW1lbnRzOwogICAgTGlzdDxEYXJ0VHlwZT4ga2VybmVsQXJndW1lbnRzID0gbm9kZS50eXBlQXJndW1lbnRzOwogICAgaWYgKGtlcm5lbEFyZ3VtZW50cy5pc05vdEVtcHR5KSB7CiAgICAgIGFyZ3VtZW50cyA9IG5ldyBMaXN0PEtlcm5lbFR5cGVCdWlsZGVyPihrZXJuZWxBcmd1bWVudHMubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXJuZWxBcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICBhcmd1bWVudHNbaV0gPSBrZXJuZWxBcmd1bWVudHNbaV0uYWNjZXB0KHRoaXMpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIoY2xzLm5hbWUsIGFyZ3VtZW50cykuLmJpbmQoY2xzKTsKICB9CgogIEBvdmVycmlkZQogIEtlcm5lbFR5cGVCdWlsZGVyIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBub2RlKSB7CiAgICBLZXJuZWxUeXBlQnVpbGRlciByZXR1cm5UeXBlID0gbm9kZS5yZXR1cm5UeXBlLmFjY2VwdCh0aGlzKTsKICAgIC8vIFdlIGNvdWxkIGNvbXB1dGUgdGhlIHR5cGUgdmFyaWFibGVzIGhlcmUuIEhvd2V2ZXIsIHRoZSBjdXJyZW50CiAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBbdmlzaXRUeXBlUGFyYW1ldGVyVHlwZV0gaXMgc3VmZmllbnQuCiAgICBMaXN0PEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMgPSBudWxsOwogICAgTGlzdDxEYXJ0VHlwZT4gcG9zaXRpb25hbFBhcmFtZXRlcnMgPSBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzOwogICAgTGlzdDxOYW1lZFR5cGU+IG5hbWVkUGFyYW1ldGVycyA9IG5vZGUubmFtZWRQYXJhbWV0ZXJzOwogICAgTGlzdDxLZXJuZWxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBmb3JtYWxzID0KICAgICAgICBuZXcgTGlzdDxLZXJuZWxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPigKICAgICAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoICsgbmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIEtlcm5lbFR5cGVCdWlsZGVyIHR5cGUgPSBwb3NpdGlvbmFsUGFyYW1ldGVyc1tpXS5hY2NlcHQodGhpcyk7CiAgICAgIEZvcm1hbFBhcmFtZXRlcktpbmQga2luZCA9IEZvcm1hbFBhcmFtZXRlcktpbmQubWFuZGF0b3J5OwogICAgICBpZiAoaSA+PSBub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpIHsKICAgICAgICBraW5kID0gRm9ybWFsUGFyYW1ldGVyS2luZC5vcHRpb25hbFBvc2l0aW9uYWw7CiAgICAgIH0KICAgICAgZm9ybWFsc1tpXSA9CiAgICAgICAgICBuZXcgS2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlcihudWxsLCAwLCB0eXBlLCBudWxsLCBudWxsLCAtMSkKICAgICAgICAgICAgLi5raW5kID0ga2luZDsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZWRQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIE5hbWVkVHlwZSBwYXJhbWV0ZXIgPSBuYW1lZFBhcmFtZXRlcnNbaV07CiAgICAgIEtlcm5lbFR5cGVCdWlsZGVyIHR5cGUgPSBwb3NpdGlvbmFsUGFyYW1ldGVyc1tpXS5hY2NlcHQodGhpcyk7CiAgICAgIGZvcm1hbHNbaSArIHBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aF0gPQogICAgICAgICAgbmV3IEtlcm5lbEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIoCiAgICAgICAgICAgICAgbnVsbCwgMCwgdHlwZSwgcGFyYW1ldGVyLm5hbWUsIG51bGwsIC0xKQogICAgICAgICAgICAuLmtpbmQgPSBGb3JtYWxQYXJhbWV0ZXJLaW5kLm9wdGlvbmFsTmFtZWQ7CiAgICB9CgogICAgcmV0dXJuIG5ldyBLZXJuZWxGdW5jdGlvblR5cGVCdWlsZGVyKHJldHVyblR5cGUsIHR5cGVWYXJpYWJsZXMsIGZvcm1hbHMpOwogIH0KCiAgS2VybmVsVHlwZUJ1aWxkZXIgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZShUeXBlUGFyYW1ldGVyVHlwZSBub2RlKSB7CiAgICBUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciA9IG5vZGUucGFyYW1ldGVyOwogICAgQ2xhc3Mga2VybmVsQ2xhc3MgPSBwYXJhbWV0ZXIucGFyZW50OwogICAgTGlicmFyeSBrZXJuZWxMaWJyYXJ5ID0ga2VybmVsQ2xhc3MuZW5jbG9zaW5nTGlicmFyeTsKICAgIExpYnJhcnlCdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyLCBMaWJyYXJ5PiBsaWJyYXJ5ID0KICAgICAgICBsb2FkZXIuYnVpbGRlcnNba2VybmVsTGlicmFyeS5pbXBvcnRVcmldOwogICAgcmV0dXJuIG5ldyBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyKHBhcmFtZXRlci5uYW1lLCBudWxsKQogICAgICAuLmJpbmQobmV3IEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXIuZnJvbUtlcm5lbChwYXJhbWV0ZXIsIGxpYnJhcnkpKTsKICB9CgogIEtlcm5lbFR5cGVCdWlsZGVyIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSkgewogICAgdGhyb3cgIk5vdCBpbXBsZW1lbnRlZCI7CiAgfQp9CoCDAE5OPAElASEJFA8SGRUWFxURExcbFRIBJwkcHCYjIBsjGBkBJQEyAUogASoBNRkEATkdBAE5N0I5BAEzND82BAE3HQQBPR1DJzkmRzk4CAZHBAEMO0FGPzpFPDEwQzxFQC43CBNKGwY3MEUxLDc4BgFOBAFFLio6OTI8TAQBOR0EAgE9cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC90eXBlX2J1aWxkZXJfY29tcHV0ZXIuZGFydDJzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvbW9kaWZpZXIuZGFydI0ELy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEubW9kaWZpZXI7CgppbXBvcnQgJ3Byb2JsZW1zLmRhcnQnIHNob3cgdW5oYW5kbGVkOwoKZW51bSBNb2RpZmllckVudW0gewogIEFic3RyYWN0LAogIENvbnN0LAogIENvdmFyaWFudCwKICBFeHRlcm5hbCwKICBGaW5hbCwKICBTdGF0aWMsCgogIC8vIE5vdCBhIHJlYWwgbW9kaWZpZXIuCiAgVmFyLAp9Cgpjb25zdCBpbnQgYWJzdHJhY3RNYXNrID0gMTsKCmNvbnN0IGludCBjb25zdE1hc2sgPSBhYnN0cmFjdE1hc2sgPDwgMTsKCmNvbnN0IGludCBjb3ZhcmlhbnRNYXNrID0gY29uc3RNYXNrIDw8IDE7Cgpjb25zdCBpbnQgZXh0ZXJuYWxNYXNrID0gY292YXJpYW50TWFzayA8PCAxOwoKY29uc3QgaW50IGZpbmFsTWFzayA9IGV4dGVybmFsTWFzayA8PCAxOwoKY29uc3QgaW50IHN0YXRpY01hc2sgPSBmaW5hbE1hc2sgPDwgMTsKCmNvbnN0IGludCBuYW1lZE1peGluQXBwbGljYXRpb25NYXNrID0gc3RhdGljTWFzayA8PCAxOwoKLy8vIE5vdCBhIG1vZGlmaWVyLCB1c2VkIGZvciBtaXhpbnMgZGVjbGFyZWQgZXhwbGljaXRseSBieSB1c2luZyB0aGUgYG1peGluYAovLy8ga2V5d29yZC4KY29uc3QgaW50IG1peGluRGVjbGFyYXRpb25NYXNrID0gbmFtZWRNaXhpbkFwcGxpY2F0aW9uTWFzayA8PCAxOwoKLy8vIE5vdCBhIG1vZGlmaWVyLCB1c2VkIGJ5IGZpZWxkcyB0byB0cmFjayBpZiB0aGV5IGhhdmUgYW4gaW5pdGlhbGl6ZXIuCmNvbnN0IGludCBoYXNJbml0aWFsaXplck1hc2sgPSBtaXhpbkRlY2xhcmF0aW9uTWFzayA8PCAxOwoKLy8vIE5vdCBhIG1vZGlmaWVyLCB1c2VkIGJ5IGZvcm1hbCBwYXJhbWV0ZXJzIHRvIHRyYWNrIGlmIHRoZXkgYXJlIGluaXRpYWxpemluZy4KY29uc3QgaW50IGluaXRpYWxpemluZ0Zvcm1hbE1hc2sgPSBoYXNJbml0aWFsaXplck1hc2sgPDwgMTsKCi8vLyBOb3QgYSBtb2RpZmllciwgdXNlZCBieSBjbGFzc2VzIHRvIHRyYWNrIGlmIHRoZSBjbGFzcyBoYXMgYSBjb25zdAovLy8gY29uc3RydWN0b3IuCmNvbnN0IGludCBoYXNDb25zdENvbnN0cnVjdG9yTWFzayA9IGluaXRpYWxpemluZ0Zvcm1hbE1hc2sgPDwgMTsKCi8vLyBOb3QgYSByZWFsIG1vZGlmaWVyLCBhbmQgYnkgc2V0dGluZyBpdCB0byB6ZXJvLCBpdCBpcyBhdXRvbWF0aWNhbGx5IGlnbm9yZWQKLy8vIGJ5IFtNb2RpZmllci52YWxpZGF0ZV0gYmVsb3cuCmNvbnN0IGludCB2YXJNYXNrID0gMDsKCmNvbnN0IE1vZGlmaWVyIEFic3RyYWN0ID0gY29uc3QgTW9kaWZpZXIoTW9kaWZpZXJFbnVtLkFic3RyYWN0LCBhYnN0cmFjdE1hc2spOwoKY29uc3QgTW9kaWZpZXIgQ29uc3QgPSBjb25zdCBNb2RpZmllcihNb2RpZmllckVudW0uQ29uc3QsIGNvbnN0TWFzayk7Cgpjb25zdCBNb2RpZmllciBDb3ZhcmlhbnQgPQogICAgY29uc3QgTW9kaWZpZXIoTW9kaWZpZXJFbnVtLkNvdmFyaWFudCwgY292YXJpYW50TWFzayk7Cgpjb25zdCBNb2RpZmllciBFeHRlcm5hbCA9IGNvbnN0IE1vZGlmaWVyKE1vZGlmaWVyRW51bS5FeHRlcm5hbCwgZXh0ZXJuYWxNYXNrKTsKCmNvbnN0IE1vZGlmaWVyIEZpbmFsID0gY29uc3QgTW9kaWZpZXIoTW9kaWZpZXJFbnVtLkZpbmFsLCBmaW5hbE1hc2spOwoKY29uc3QgTW9kaWZpZXIgU3RhdGljID0gY29uc3QgTW9kaWZpZXIoTW9kaWZpZXJFbnVtLlN0YXRpYywgc3RhdGljTWFzayk7CgovLy8gTm90IGEgcmVhbCBtb2RpZmllci4KY29uc3QgTW9kaWZpZXIgVmFyID0gY29uc3QgTW9kaWZpZXIoTW9kaWZpZXJFbnVtLlZhciwgdmFyTWFzayk7CgpjbGFzcyBNb2RpZmllciB7CiAgZmluYWwgTW9kaWZpZXJFbnVtIGtpbmQ7CgogIGZpbmFsIGludCBtYXNrOwoKICBjb25zdCBNb2RpZmllcih0aGlzLmtpbmQsIHRoaXMubWFzayk7CgogIGZhY3RvcnkgTW9kaWZpZXIuZnJvbVN0cmluZyhTdHJpbmcgc3RyaW5nKSB7CiAgICBpZiAoaWRlbnRpY2FsKCdhYnN0cmFjdCcsIHN0cmluZykpIHJldHVybiBBYnN0cmFjdDsKICAgIGlmIChpZGVudGljYWwoJ2NvbnN0Jywgc3RyaW5nKSkgcmV0dXJuIENvbnN0OwogICAgaWYgKGlkZW50aWNhbCgnY292YXJpYW50Jywgc3RyaW5nKSkgcmV0dXJuIENvdmFyaWFudDsKICAgIGlmIChpZGVudGljYWwoJ2V4dGVybmFsJywgc3RyaW5nKSkgcmV0dXJuIEV4dGVybmFsOwogICAgaWYgKGlkZW50aWNhbCgnZmluYWwnLCBzdHJpbmcpKSByZXR1cm4gRmluYWw7CiAgICBpZiAoaWRlbnRpY2FsKCdzdGF0aWMnLCBzdHJpbmcpKSByZXR1cm4gU3RhdGljOwogICAgaWYgKGlkZW50aWNhbCgndmFyJywgc3RyaW5nKSkgcmV0dXJuIFZhcjsKICAgIHJldHVybiB1bmhhbmRsZWQoc3RyaW5nLCAiTW9kaWZpZXIuZnJvbVN0cmluZyIsIC0xLCBudWxsKTsKICB9CgogIHRvU3RyaW5nKCkgPT4gIm1vZGlmaWVyKCR7JyRraW5kJy5zdWJzdHJpbmcoJ01vZGlmaWVyRW51bS4nLmxlbmd0aCl9KSI7CgogIHN0YXRpYyBpbnQgdmFsaWRhdGUoTGlzdDxNb2RpZmllcj4gbW9kaWZpZXJzLCB7Ym9vbCBpc0Fic3RyYWN0OiBmYWxzZX0pIHsKICAgIC8vIFRPRE8oYWhlKTogUmVuYW1lIHRoaXMgbWV0aG9kLCB2YWxpZGF0aW9uIGlzIG5vdyB0YWtlbiBjYXJlIG9mIGJ5IHRoZQogICAgLy8gcGFyc2VyLgogICAgaW50IHJlc3VsdCA9IGlzQWJzdHJhY3QgPyBhYnN0cmFjdE1hc2sgOiAwOwogICAgaWYgKG1vZGlmaWVycyA9PSBudWxsKSByZXR1cm4gcmVzdWx0OwogICAgZm9yIChNb2RpZmllciBtb2RpZmllciBpbiBtb2RpZmllcnMpIHsKICAgICAgcmVzdWx0IHw9IG1vZGlmaWVyLm1hc2s7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIGludCB2YWxpZGF0ZVZhckZpbmFsT3JDb25zdChTdHJpbmcgbGV4ZW1lKSB7CiAgICBpZiAobGV4ZW1lID09IG51bGwpIHJldHVybiAwOwogICAgaWYgKGlkZW50aWNhbCgnY29uc3QnLCBsZXhlbWUpKSByZXR1cm4gQ29uc3QubWFzazsKICAgIGlmIChpZGVudGljYWwoJ2ZpbmFsJywgbGV4ZW1lKSkgcmV0dXJuIEZpbmFsLm1hc2s7CiAgICBpZiAoaWRlbnRpY2FsKCd2YXInLCBsZXhlbWUpKSByZXR1cm4gVmFyLm1hc2s7CiAgICByZXR1cm4gdW5oYW5kbGVkKGxleGVtZSwgIk1vZGlmaWVyLnZhbGlkYXRlVmFyRmluYWxPckNvbnN0IiwgLTEsIG51bGwpOwogIH0KfQptAE5OPAEYAScBFAwJDQwJCgEaBwIBHAEpASoBLQEpAScBNwFNDUEBSToBUTwBRhFBAVAiFwFPAUYBGzsBTwFGAUkBGUABERsBEgEoAS84Mjo4MjQuPwQBSgFMTQ8wKisfBhMEATYiNzczTAQCASlwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvbW9kaWZpZXIuZGFydDhzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvYmFzZS9pbnN0cnVtZW50YXRpb24uZGFydIrGLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgRGFydFR5cGUsIE1lbWJlcjsKCi8vLyBDb252ZXJ0ICfihpInIHRvICctPicgYmVjYXVzZSAn4oaSJyBkb2Vzbid0IHNob3cgdXAgaW4gc29tZSB0ZXJtaW5hbHMuCi8vLyBSZW1vdmUgcHJlZml4ZXMgdGhhdCBhcmUgdXNlZCB2ZXJ5IG9mdGVuIGluIHRlc3RzLgpTdHJpbmcgX3Nob3J0ZW5JbnN0cnVtZW50YXRpb25TdHJpbmcoU3RyaW5nIHMpID0+IHMKICAgIC5yZXBsYWNlQWxsKCfihpInLCAnLT4nKQogICAgLnJlcGxhY2VBbGwoJ2RhcnQuY29yZTo6JywgJycpCiAgICAucmVwbGFjZUFsbCgnZGFydC5hc3luYzo6JywgJycpCiAgICAucmVwbGFjZUFsbCgndGVzdDo6JywgJycpOwoKLy8vIEludGVyZmFjZSBwcm92aWRpbmcgdGhlIGFiaWxpdHkgdG8gcmVjb3JkIHByb3BlcnR5L3ZhbHVlIHBhaXJzIGFzc29jaWF0ZWQKLy8vIHdpdGggc291cmNlIGZpbGUgbG9jYXRpb25zLiAgSW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0ZXN0aW5nLgphYnN0cmFjdCBjbGFzcyBJbnN0cnVtZW50YXRpb24gewogIC8vLyBSZWNvcmRzIGEgcHJvcGVydHkvdmFsdWUgcGFpciBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIFVSSSBhbmQgb2Zmc2V0LgogIHZvaWQgcmVjb3JkKFVyaSB1cmksIGludCBvZmZzZXQsIFN0cmluZyBwcm9wZXJ0eSwgSW5zdHJ1bWVudGF0aW9uVmFsdWUgdmFsdWUpOwp9CgovLy8gSW50ZXJmYWNlIGZvciB2YWx1ZXMgcmVjb3JkZWQgYnkgW0luc3RydW1lbnRhdGlvbl0uCmFic3RyYWN0IGNsYXNzIEluc3RydW1lbnRhdGlvblZhbHVlIHsKICBjb25zdCBJbnN0cnVtZW50YXRpb25WYWx1ZSgpOwoKICAvLy8gQ2hlY2tzIGlmIHRoZSBnaXZlbiBTdHJpbmcgaXMgYW4gYWNjdXJhdGUgZGVzY3JpcHRpb24gb2YgdGhpcyB2YWx1ZS4KICAvLy8KICAvLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdCBjaGVja3MgZm9yIGVxdWFsaXR5IHdpdGggdGhlIHJldHVybiB2YWx1ZQogIC8vLyBvZiBbdG9TdHJpbmddLCBob3dldmVyIGRlcml2ZWQgY2xhc3NlcyBtYXkgd2FudCBhIG1vcmUgc29waGlzdGljYXRlZAogIC8vLyBpbXBsZW1lbnRhdGlvbiAoZS5nLiB0byBhbGxvdyBhYmJyZXZpYXRpb25zIGluIHRoZSBkZXNjcmlwdGlvbikuCiAgLy8vCiAgLy8vIERlcml2ZWQgY2xhc3NlcyBzaG91bGQgZW5zdXJlIHRoYXQgdGhlIGludmFyaWFudCBob2xkczoKICAvLy8gYHRoaXMubWF0Y2hlcyh0aGlzLnRvU3RyaW5nKCkpYCBzaG91bGQgYWx3YXlzIHJldHVybiBgdHJ1ZWAuCiAgYm9vbCBtYXRjaGVzKFN0cmluZyBkZXNjcmlwdGlvbikgPT4gZGVzY3JpcHRpb24gPT0gdG9TdHJpbmcoKTsKfQoKLy8vIEluc3RhbmNlIG9mIFtJbnN0cnVtZW50YXRpb25WYWx1ZV0gZGVzY3JpYmluZyBhIFtNZW1iZXJdLgpjbGFzcyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvck1lbWJlciBleHRlbmRzIEluc3RydW1lbnRhdGlvblZhbHVlIHsKICBmaW5hbCBNZW1iZXIgbWVtYmVyOwoKICBJbnN0cnVtZW50YXRpb25WYWx1ZUZvck1lbWJlcih0aGlzLm1lbWJlcik7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IF9zaG9ydGVuSW5zdHJ1bWVudGF0aW9uU3RyaW5nKG1lbWJlci50b1N0cmluZygpKTsKfQoKLy8vIEluc3RhbmNlIG9mIFtJbnN0cnVtZW50YXRpb25WYWx1ZV0gZGVzY3JpYmluZyBhIFtEYXJ0VHlwZV0uCmNsYXNzIEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZSBleHRlbmRzIEluc3RydW1lbnRhdGlvblZhbHVlIHsKICBmaW5hbCBEYXJ0VHlwZSB0eXBlOwoKICBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGUodGhpcy50eXBlKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gX3Nob3J0ZW5JbnN0cnVtZW50YXRpb25TdHJpbmcodHlwZS50b1N0cmluZygpKTsKfQoKLy8vIEluc3RhbmNlIG9mIFtJbnN0cnVtZW50YXRpb25WYWx1ZV0gZGVzY3JpYmluZyBhIGxpc3Qgb2YgW0RhcnRUeXBlXXMuCmNsYXNzIEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZUFyZ3MgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25WYWx1ZSB7CiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gdHlwZXM7CgogIEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZUFyZ3ModGhpcy50eXBlcyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IHR5cGVzCiAgICAgIC5tYXAoKHR5cGUpID0+IG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGUodHlwZSkudG9TdHJpbmcoKSkKICAgICAgLmpvaW4oJywgJyk7Cn0KCi8vLyBJbnN0YW5jZSBvZiBbSW5zdHJ1bWVudGF0aW9uVmFsdWVdIHdoaWNoIG9ubHkgbWF0Y2hlcyB0aGUgZ2l2ZW4gbGl0ZXJhbAovLy8gc3RyaW5nLgpjbGFzcyBJbnN0cnVtZW50YXRpb25WYWx1ZUxpdGVyYWwgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25WYWx1ZSB7CiAgZmluYWwgU3RyaW5nIHZhbHVlOwoKICBjb25zdCBJbnN0cnVtZW50YXRpb25WYWx1ZUxpdGVyYWwodGhpcy52YWx1ZSk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IHZhbHVlOwp9ClAATk48ATgBRzc0GyMkHwFOQSFOUQIBOCYgAUsGUEtHBj5DQQIBPkMXAS4BDEkCAUBBFwEqAQxHAgFJRR4BLwEMHUcTAgFMDEEWATEBDB4CAS9wYWNrYWdlOmZyb250X2VuZC9zcmMvYmFzZS9pbnN0cnVtZW50YXRpb24uZGFydDBzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvZXhwb3J0LmRhcnSENy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmV4cG9ydDsKCmltcG9ydCAnYnVpbGRlci9idWlsZGVyLmRhcnQnIHNob3cgRGVjbGFyYXRpb24sIExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICdjb21iaW5hdG9yLmRhcnQnIHNob3cgQ29tYmluYXRvcjsKCmNsYXNzIEV4cG9ydCB7CiAgLy8vIFRoZSBsaWJyYXJ5IHRoYXQgaXMgZXhwb3J0aW5nIFtleHBvcnRlZF07CiAgZmluYWwgTGlicmFyeUJ1aWxkZXIgZXhwb3J0ZXI7CgogIC8vLyBUaGUgbGlicmFyeSBiZWluZyBleHBvcnRlZC4KICBmaW5hbCBMaWJyYXJ5QnVpbGRlciBleHBvcnRlZDsKCiAgZmluYWwgTGlzdDxDb21iaW5hdG9yPiBjb21iaW5hdG9yczsKCiAgZmluYWwgaW50IGNoYXJPZmZzZXQ7CgogIEV4cG9ydCh0aGlzLmV4cG9ydGVyLCB0aGlzLmV4cG9ydGVkLCB0aGlzLmNvbWJpbmF0b3JzLCB0aGlzLmNoYXJPZmZzZXQpOwoKICBVcmkgZ2V0IGZpbGVVcmkgPT4gZXhwb3J0ZXIuZmlsZVVyaTsKCiAgYm9vbCBhZGRUb0V4cG9ydFNjb3BlKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBtZW1iZXIpIHsKICAgIGlmIChjb21iaW5hdG9ycyAhPSBudWxsKSB7CiAgICAgIGZvciAoQ29tYmluYXRvciBjb21iaW5hdG9yIGluIGNvbWJpbmF0b3JzKSB7CiAgICAgICAgaWYgKGNvbWJpbmF0b3IuaXNTaG93ICYmICFjb21iaW5hdG9yLm5hbWVzLmNvbnRhaW5zKG5hbWUpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKGNvbWJpbmF0b3IuaXNIaWRlICYmIGNvbWJpbmF0b3IubmFtZXMuY29udGFpbnMobmFtZSkpIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGV4cG9ydGVyLmFkZFRvRXhwb3J0U2NvcGUobmFtZSwgbWVtYmVyLCBjaGFyT2Zmc2V0KTsKICB9Cn0KJQBOTjwBFgFAASoBDzAhASIhASYBGAFLAScBOx8zUVAIBkAEAgEncGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2V4cG9ydC5kYXJ0MHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9pbXBvcnQuZGFydIymLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuaW1wb3J0OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBMaWJyYXJ5RGVwZW5kZW5jeTsKCmltcG9ydCAnYnVpbGRlci9idWlsZGVyLmRhcnQnIHNob3cgRGVjbGFyYXRpb24sIExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICdrZXJuZWwva2VybmVsX2J1aWxkZXIuZGFydCcgc2hvdyB0b0tlcm5lbENvbWJpbmF0b3JzOwoKaW1wb3J0ICdrZXJuZWwva2VybmVsX3ByZWZpeF9idWlsZGVyLmRhcnQnIHNob3cgS2VybmVsUHJlZml4QnVpbGRlcjsKCmltcG9ydCAnY29tYmluYXRvci5kYXJ0JyBzaG93IENvbWJpbmF0b3I7CgppbXBvcnQgJ2NvbmZpZ3VyYXRpb24uZGFydCcgc2hvdyBDb25maWd1cmF0aW9uOwoKY2xhc3MgSW1wb3J0IHsKICAvLy8gVGhlIGxpYnJhcnkgdGhhdCBpcyBpbXBvcnRpbmcgW2ltcG9ydGVkXTsKICBmaW5hbCBMaWJyYXJ5QnVpbGRlciBpbXBvcnRlcjsKCiAgLy8vIFRoZSBsaWJyYXJ5IGJlaW5nIGltcG9ydGVkLgogIGZpbmFsIExpYnJhcnlCdWlsZGVyIGltcG9ydGVkOwoKICBmaW5hbCBLZXJuZWxQcmVmaXhCdWlsZGVyIHByZWZpeEJ1aWxkZXI7CgogIGZpbmFsIGJvb2wgZGVmZXJyZWQ7CgogIGZpbmFsIFN0cmluZyBwcmVmaXg7CgogIGZpbmFsIExpc3Q8Q29tYmluYXRvcj4gY29tYmluYXRvcnM7CgogIGZpbmFsIExpc3Q8Q29uZmlndXJhdGlvbj4gY29uZmlndXJhdGlvbnM7CgogIGZpbmFsIGludCBjaGFyT2Zmc2V0OwoKICBmaW5hbCBpbnQgcHJlZml4Q2hhck9mZnNldDsKCiAgLy8gVGhlIExpYnJhcnlCdWlsZGVyIGZvciB0aGUgaW1wb3J0ZWQgbGlicmFyeSAoJ2ltcG9ydGVkJykgbWF5IGJlIG51bGwgd2hlbgogIC8vIHRoaXMgZmllbGQgaXMgc2V0LgogIGZpbmFsIFN0cmluZyBuYXRpdmVJbXBvcnRQYXRoOwoKICBJbXBvcnQoCiAgICAgIHRoaXMuaW1wb3J0ZXIsCiAgICAgIHRoaXMuaW1wb3J0ZWQsCiAgICAgIHRoaXMuZGVmZXJyZWQsCiAgICAgIHRoaXMucHJlZml4LAogICAgICB0aGlzLmNvbWJpbmF0b3JzLAogICAgICB0aGlzLmNvbmZpZ3VyYXRpb25zLAogICAgICB0aGlzLmNoYXJPZmZzZXQsCiAgICAgIHRoaXMucHJlZml4Q2hhck9mZnNldCwKICAgICAgaW50IGltcG9ydEluZGV4LAogICAgICB7dGhpcy5uYXRpdmVJbXBvcnRQYXRofSkKICAgICAgOiBwcmVmaXhCdWlsZGVyID0gY3JlYXRlUHJlZml4QnVpbGRlcihwcmVmaXgsIGltcG9ydGVyLCBpbXBvcnRlZCwKICAgICAgICAgICAgY29tYmluYXRvcnMsIGRlZmVycmVkLCBjaGFyT2Zmc2V0LCBwcmVmaXhDaGFyT2Zmc2V0LCBpbXBvcnRJbmRleCk7CgogIFVyaSBnZXQgZmlsZVVyaSA9PiBpbXBvcnRlci5maWxlVXJpOwoKICB2b2lkIGZpbmFsaXplSW1wb3J0cyhMaWJyYXJ5QnVpbGRlciBpbXBvcnRlcikgewogICAgaWYgKG5hdGl2ZUltcG9ydFBhdGggIT0gbnVsbCkgcmV0dXJuOwogICAgdm9pZCBGdW5jdGlvbihTdHJpbmcsIERlY2xhcmF0aW9uKSBhZGQ7CiAgICBpZiAocHJlZml4QnVpbGRlciA9PSBudWxsKSB7CiAgICAgIGFkZCA9IChTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gbWVtYmVyKSB7CiAgICAgICAgaW1wb3J0ZXIuYWRkVG9TY29wZShuYW1lLCBtZW1iZXIsIGNoYXJPZmZzZXQsIHRydWUpOwogICAgICB9OwogICAgfSBlbHNlIHsKICAgICAgYWRkID0gKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBtZW1iZXIpIHsKICAgICAgICBwcmVmaXhCdWlsZGVyLmFkZFRvRXhwb3J0U2NvcGUobmFtZSwgbWVtYmVyLCBjaGFyT2Zmc2V0KTsKICAgICAgfTsKICAgIH0KICAgIGltcG9ydGVkLmV4cG9ydFNjb3BlLmZvckVhY2goKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBtZW1iZXIpIHsKICAgICAgaWYgKGNvbWJpbmF0b3JzICE9IG51bGwpIHsKICAgICAgICBmb3IgKENvbWJpbmF0b3IgY29tYmluYXRvciBpbiBjb21iaW5hdG9ycykgewogICAgICAgICAgaWYgKGNvbWJpbmF0b3IuaXNTaG93ICYmICFjb21iaW5hdG9yLm5hbWVzLmNvbnRhaW5zKG5hbWUpKSByZXR1cm47CiAgICAgICAgICBpZiAoY29tYmluYXRvci5pc0hpZGUgJiYgY29tYmluYXRvci5uYW1lcy5jb250YWlucyhuYW1lKSkgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgICBhZGQobmFtZSwgbWVtYmVyKTsKICAgIH0pOwogICAgaWYgKHByZWZpeEJ1aWxkZXIgIT0gbnVsbCkgewogICAgICBEZWNsYXJhdGlvbiBleGlzdGluZyA9CiAgICAgICAgICBpbXBvcnRlci5hZGRCdWlsZGVyKHByZWZpeCwgcHJlZml4QnVpbGRlciwgcHJlZml4Q2hhck9mZnNldCk7CiAgICAgIGlmIChleGlzdGluZyA9PSBwcmVmaXhCdWlsZGVyKSB7CiAgICAgICAgaW1wb3J0ZXIuYWRkVG9TY29wZShwcmVmaXgsIHByZWZpeEJ1aWxkZXIsIHByZWZpeENoYXJPZmZzZXQsIHRydWUpOwogICAgICB9CiAgICB9CiAgfQp9CgpLZXJuZWxQcmVmaXhCdWlsZGVyIGNyZWF0ZVByZWZpeEJ1aWxkZXIoCiAgICBTdHJpbmcgcHJlZml4LAogICAgTGlicmFyeUJ1aWxkZXIgaW1wb3J0ZXIsCiAgICBMaWJyYXJ5QnVpbGRlciBpbXBvcnRlZCwKICAgIExpc3Q8Q29tYmluYXRvcj4gY29tYmluYXRvcnMsCiAgICBib29sIGRlZmVycmVkLAogICAgaW50IGNoYXJPZmZzZXQsCiAgICBpbnQgcHJlZml4Q2hhck9mZnNldCwKICAgIGludCBpbXBvcnRJbmRleCkgewogIGlmIChwcmVmaXggPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgTGlicmFyeURlcGVuZGVuY3kgZGVwZW5kZW5jeSA9IG51bGw7CiAgaWYgKGRlZmVycmVkKSB7CiAgICBkZXBlbmRlbmN5ID0gbmV3IExpYnJhcnlEZXBlbmRlbmN5LmRlZmVycmVkSW1wb3J0KGltcG9ydGVkLnRhcmdldCwgcHJlZml4LAogICAgICAgIGNvbWJpbmF0b3JzOiB0b0tlcm5lbENvbWJpbmF0b3JzKGNvbWJpbmF0b3JzKSkKICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICB9CiAgcmV0dXJuIG5ldyBLZXJuZWxQcmVmaXhCdWlsZGVyKAogICAgICBwcmVmaXgsIGRlZmVycmVkLCBpbXBvcnRlciwgZGVwZW5kZW5jeSwgcHJlZml4Q2hhck9mZnNldCwgaW1wb3J0SW5kZXgpOwp9Cm8ATk48ARYBOQFAAT4BRQEqATABDzAhASIhASsBFwEXASYBLAEYAR4BTxghAQoVFRUTGBsXHRcfSE8BJwEyKiwhMD0JDTBCCQZFITVNTAoIGQghHUgnTAgGBAIBKRMdHSITFBoXIycSTzchBCJOAgEncGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2ltcG9ydC5kYXJ0PXNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvYm9keV9idWlsZGVyLmRhcnTAAvihLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuYm9keV9idWlsZGVyOwoKaW1wb3J0ICdkYXJ0OmNvcmUnIGhpZGUgTWFwRW50cnk7CgppbXBvcnQgJy4uL2NvbnN0YW50X2NvbnRleHQuZGFydCcgc2hvdyBDb25zdGFudENvbnRleHQ7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnIGFzIGZhc3RhOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JyBzaG93IExvY2F0ZWRNZXNzYWdlLCBNZXNzYWdlLCBub0xlbmd0aCwgVGVtcGxhdGU7CgppbXBvcnQgJy4uL21lc3NhZ2VzLmRhcnQnIGFzIG1lc3NhZ2VzIHNob3cgZ2V0TG9jYXRpb25Gcm9tVXJpOwoKaW1wb3J0ICcuLi9tb2RpZmllci5kYXJ0JyBzaG93IE1vZGlmaWVyLCBjb25zdE1hc2ssIGNvdmFyaWFudE1hc2ssIGZpbmFsTWFzazsKCmltcG9ydCAnLi4vbmFtZXMuZGFydCcKICAgIHNob3cgY2FsbE5hbWUsIGVtcHR5TmFtZSwgaW5kZXhHZXROYW1lLCBpbmRleFNldE5hbWUsIG1pbnVzTmFtZSwgcGx1c05hbWU7CgppbXBvcnQgJy4uL3BhcnNlci5kYXJ0JwogICAgc2hvdwogICAgICAgIEFzc2VydCwKICAgICAgICBQYXJzZXIsCiAgICAgICAgRm9ybWFsUGFyYW1ldGVyS2luZCwKICAgICAgICBJZGVudGlmaWVyQ29udGV4dCwKICAgICAgICBNZW1iZXJLaW5kLAogICAgICAgIGxlbmd0aEZvclRva2VuLAogICAgICAgIGxlbmd0aE9mU3BhbiwKICAgICAgICBvZmZzZXRGb3JUb2tlbiwKICAgICAgICBvcHRpb25hbDsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcKICAgIHNob3cgaW50ZXJuYWxQcm9ibGVtLCB1bmV4cGVjdGVkLCB1bmhhbmRsZWQsIHVuc3VwcG9ydGVkOwoKaW1wb3J0ICcuLi9xdW90ZS5kYXJ0JwogICAgc2hvdwogICAgICAgIFF1b3RlLAogICAgICAgIGFuYWx5emVRdW90ZSwKICAgICAgICB1bmVzY2FwZSwKICAgICAgICB1bmVzY2FwZUZpcnN0U3RyaW5nUGFydCwKICAgICAgICB1bmVzY2FwZUxhc3RTdHJpbmdQYXJ0LAogICAgICAgIHVuZXNjYXBlU3RyaW5nOwoKaW1wb3J0ICcuLi9zY2FubmVyLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJy4uL3NjYW5uZXIvdG9rZW4uZGFydCcKICAgIHNob3cgaXNCaW5hcnlPcGVyYXRvciwgaXNNaW51c09wZXJhdG9yLCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcjsKCmltcG9ydCAnLi4vc2NvcGUuZGFydCcgc2hvdyBQcm9ibGVtQnVpbGRlcjsKCmltcG9ydCAnLi4vc2V2ZXJpdHkuZGFydCcgc2hvdyBTZXZlcml0eTsKCmltcG9ydCAnLi4vc291cmNlL3Njb3BlX2xpc3RlbmVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgRml4ZWROdWxsYWJsZUxpc3QsCiAgICAgICAgR3Jvd2FibGVMaXN0LAogICAgICAgIEp1bXBUYXJnZXRLaW5kLAogICAgICAgIE51bGxWYWx1ZSwKICAgICAgICBQYXJzZXJSZWNvdmVyeSwKICAgICAgICBTY29wZUxpc3RlbmVyOwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX2luZmVycmVyLmRhcnQnIHNob3cgVHlwZUluZmVycmVyOwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX3Byb21vdGlvbi5kYXJ0JwogICAgc2hvdyBUeXBlUHJvbW90ZXIsIFR5cGVQcm9tb3Rpb25GYWN0LCBUeXBlUHJvbW90aW9uU2NvcGU7CgppbXBvcnQgJ2NvbGxlY3Rpb25zLmRhcnQnCiAgICBzaG93CiAgICAgICAgU3ByZWFkRWxlbWVudCwKICAgICAgICBTcHJlYWRNYXBFbnRyeSwKICAgICAgICBjb252ZXJ0VG9NYXBFbnRyeSwKICAgICAgICBpc0NvbnZlcnRpYmxlVG9NYXBFbnRyeTsKCmltcG9ydCAnY29uc3RuZXNzLmRhcnQnIHNob3cgQ29uc3RuZXNzOwoKaW1wb3J0ICdleHByZXNzaW9uX2dlbmVyYXRvci5kYXJ0JwogICAgc2hvdwogICAgICAgIERlbGF5ZWRBc3NpZ25tZW50LAogICAgICAgIERlbGF5ZWRQb3N0Zml4SW5jcmVtZW50LAogICAgICAgIEdlbmVyYXRvciwKICAgICAgICBJbmNvbXBsZXRlRXJyb3JHZW5lcmF0b3IsCiAgICAgICAgSW5jb21wbGV0ZVByb3BlcnR5QWNjZXNzR2VuZXJhdG9yLAogICAgICAgIEluY29tcGxldGVTZW5kR2VuZXJhdG9yLAogICAgICAgIEluZGV4ZWRBY2Nlc3NHZW5lcmF0b3IsCiAgICAgICAgTG9hZExpYnJhcnlHZW5lcmF0b3IsCiAgICAgICAgUGFyZW50aGVzaXplZEV4cHJlc3Npb25HZW5lcmF0b3IsCiAgICAgICAgUGFyc2VyRXJyb3JHZW5lcmF0b3IsCiAgICAgICAgUHJlZml4VXNlR2VuZXJhdG9yLAogICAgICAgIFJlYWRPbmx5QWNjZXNzR2VuZXJhdG9yLAogICAgICAgIFNlbmRBY2Nlc3NHZW5lcmF0b3IsCiAgICAgICAgU3RhdGljQWNjZXNzR2VuZXJhdG9yLAogICAgICAgIFN1cGVySW5kZXhlZEFjY2Vzc0dlbmVyYXRvciwKICAgICAgICBUaGlzQWNjZXNzR2VuZXJhdG9yLAogICAgICAgIFRoaXNQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvciwKICAgICAgICBUeXBlVXNlR2VuZXJhdG9yLAogICAgICAgIFVubGlua2VkR2VuZXJhdG9yLAogICAgICAgIFVucmVzb2x2ZWROYW1lR2VuZXJhdG9yLAogICAgICAgIFZhcmlhYmxlVXNlR2VuZXJhdG9yLAogICAgICAgIGJ1aWxkSXNOdWxsOwoKaW1wb3J0ICdleHByZXNzaW9uX2dlbmVyYXRvcl9oZWxwZXIuZGFydCcgc2hvdyBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyOwoKaW1wb3J0ICdmb3Jlc3QuZGFydCcgc2hvdyBGb3Jlc3Q7CgppbXBvcnQgJ2ltcGxpY2l0X3R5cGVfYXJndW1lbnQuZGFydCcgc2hvdyBJbXBsaWNpdFR5cGVBcmd1bWVudDsKCmltcG9ydCAna2VybmVsX3NoYWRvd19hc3QuZGFydCcgYXMgc2hhZG93CiAgICBzaG93IFN5bnRoZXRpY0V4cHJlc3Npb25KdWRnbWVudCwgU3ludGhldGljV3JhcHBlcjsKCmltcG9ydCAncmVkaXJlY3RpbmdfZmFjdG9yeV9ib2R5LmRhcnQnCiAgICBzaG93CiAgICAgICAgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keSwKICAgICAgICBSZWRpcmVjdGlvblRhcmdldCwKICAgICAgICBnZXRSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5LAogICAgICAgIGdldFJlZGlyZWN0aW9uVGFyZ2V0LAogICAgICAgIGlzUmVkaXJlY3RpbmdGYWN0b3J5OwoKaW1wb3J0ICd0eXBlX2FsZ29yaXRobXMuZGFydCcgc2hvdyBjYWxjdWxhdGVCb3VuZHM7CgppbXBvcnQgJ2tlcm5lbF9hcGkuZGFydCc7CgppbXBvcnQgJ2tlcm5lbF9hc3RfYXBpLmRhcnQnOwoKaW1wb3J0ICdrZXJuZWxfYnVpbGRlci5kYXJ0JzsKCi8vIFRPRE8oYWhlKTogUmVtb3ZlIHRoaXMgYW5kIGVuc3VyZSBhbGwgbm9kZXMgaGF2ZSBhIGxvY2F0aW9uLgpjb25zdCBub0xvY2F0aW9uID0gbnVsbDsKCi8vIFRPRE8oZGFucnViZWwpOiBSZW1vdmUgdGhpcyBvbmNlIGNvbnRyb2wgZmxvdyBhbmQgc3ByZWFkIGNvbGxlY3Rpb24gc3VwcG9ydAovLyBoYXMgYmVlbiBlbmFibGVkIGJ5IGRlZmF1bHQuCmNvbnN0IGludmFsaWRDb2xsZWN0aW9uRWxlbWVudCA9IGNvbnN0IE9iamVjdCgpOwoKYWJzdHJhY3QgY2xhc3MgQm9keUJ1aWxkZXIgZXh0ZW5kcyBTY29wZUxpc3RlbmVyPEp1bXBUYXJnZXQ+CiAgICBpbXBsZW1lbnRzIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgewogIC8vIFRPRE8oYWhlKTogUmVuYW1lIFtsaWJyYXJ5XSB0byAncGFydCcuCiAgQG92ZXJyaWRlCiAgZmluYWwgS2VybmVsTGlicmFyeUJ1aWxkZXIgbGlicmFyeTsKCiAgZmluYWwgTW9kaWZpZXJCdWlsZGVyIG1lbWJlcjsKCiAgZmluYWwgS2VybmVsQ2xhc3NCdWlsZGVyIGNsYXNzQnVpbGRlcjsKCiAgZmluYWwgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5OwoKICBAb3ZlcnJpZGUKICBmaW5hbCBDb3JlVHlwZXMgY29yZVR5cGVzOwoKICBmaW5hbCBib29sIGlzSW5zdGFuY2VNZW1iZXI7CgogIGZpbmFsIFNjb3BlIGVuY2xvc2luZ1Njb3BlOwoKICBmaW5hbCBib29sIGVuYWJsZU5hdGl2ZTsKCiAgZmluYWwgYm9vbCBzdHJpbmdFeHBlY3RlZEFmdGVyTmF0aXZlOwoKICAvLy8gV2hldGhlciB0byBpZ25vcmUgYW4gdW5yZXNvbHZlZCByZWZlcmVuY2UgdG8gYG1haW5gIHdpdGhpbiB0aGUgYm9keSBvZgogIC8vLyBgX2dldE1haW5DbG9zdXJlYCB3aGVuIGNvbXBpbGluZyB0aGUgY3VycmVudCBsaWJyYXJ5LgogIC8vLwogIC8vLyBUaGlzIGFzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQuIFRoZSBzdGFuZGFsb25lIFZNIGFuZCBmbHV0dGVyIGhhdmUKICAvLy8gc3BlY2lhbCBsb2dpYyB0byByZXNvbHZlIGBtYWluYCBpbiBgX2dldE1haW5DbG9zdXJlYCwgdGhpcyBmbGFnIGlzIHVzZWQgdG8KICAvLy8gaWdub3JlIHRoYXQgcmVmZXJlbmNlIHRvIGBtYWluYCwgYnV0IG9ubHkgb24gbGlicmFyaWVzIHdoZXJlIHdlIGV4cGVjdCB0bwogIC8vLyBzZWUgaXQgKHRvZGF5IHRoYXQgaXMgZGFydDpfYnVpbHRpbiBhbmQgZGFydDp1aSkuCiAgLy8vCiAgLy8gVE9ETyhhaGUsc2lnbXVuZCk6IHJlbW92ZSB3aGVuIHRoZSBWTSBnZXRzIHJpZCBvZiB0aGUgc3BlY2lhbCBydWxlLCBzZWUKICAvLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMjg5ODkuCiAgZmluYWwgYm9vbCBpZ25vcmVNYWluSW5HZXRNYWluQ2xvc3VyZTsKCiAgLy8gVE9ETyhhaGUpOiBDb25zaWRlciByZW5hbWluZyBbdXJpXSB0byAncGFydFVyaScuCiAgQG92ZXJyaWRlCiAgZmluYWwgVXJpIHVyaTsKCiAgZmluYWwgVHlwZUluZmVycmVyIF90eXBlSW5mZXJyZXI7CgogIEBvdmVycmlkZQogIGZpbmFsIFR5cGVQcm9tb3RlciB0eXBlUHJvbW90ZXI7CgogIEBvdmVycmlkZQogIGZpbmFsIGJvb2wgbGVnYWN5TW9kZTsKCiAgLy8vIE9ubHkgdXNlZCB3aGVuIFttZW1iZXJdIGlzIGEgY29uc3RydWN0b3IuIEl0IHRyYWNrcyBpZiBhbiBpbXBsaWNpdCBzdXBlcgogIC8vLyBpbml0aWFsaXplciBpcyBuZWVkZWQuCiAgLy8vCiAgLy8vIEFuIGltcGxpY2l0IHN1cGVyIGluaXRpYWxpemVyIGlzbid0IG5lZWRlZAogIC8vLwogIC8vLyAxLiBpZiB0aGUgY3VycmVudCBjbGFzcyBpcyBPYmplY3QsCiAgLy8vIDIuIGlmIHRoZXJlIGlzIGFuIGV4cGxpY2l0IHN1cGVyIGluaXRpYWxpemVyLAogIC8vLyAzLiBpZiB0aGVyZSBpcyBhIHJlZGlyZWN0aW5nICh0aGlzKSBpbml0aWFsaXplciwgb3IKICAvLy8gNC4gaWYgYSBjb21waWxlLXRpbWUgZXJyb3IgcHJldmVudGVkIHVzIGZyb20gZ2VuZXJhdGluZyBjb2RlIGZvciBhbgogIC8vLyAgICBpbml0aWFsaXplci4gVGhpcyBhdm9pZHMgY2FzY2FkaW5nIGVycm9ycy4KICBib29sIG5lZWRzSW1wbGljaXRTdXBlckluaXRpYWxpemVyOwoKICBTY29wZSBmb3JtYWxQYXJhbWV0ZXJTY29wZTsKCiAgLy8vIFRoaXMgaXMgc2V0IHRvIHRydWUgd2hlbiB3ZSBzdGFydCBwYXJzaW5nIGFuIGluaXRpYWxpemVyLiBXZSB1c2UgdGhpcyB0bwogIC8vLyBmaW5kIHRoZSBjb3JyZWN0IHNjb3BlIGZvciBpbml0aWFsaXplcnMgbGlrZSBpbiB0aGlzIGV4YW1wbGU6CiAgLy8vCiAgLy8vICAgICBjbGFzcyBDIHsKICAvLy8gICAgICAgZmluYWwgeDsKICAvLy8gICAgICAgQyh4KSA6IHggPSB4OwogIC8vLyAgICAgfQogIC8vLwogIC8vLyBXaGVuIHBhcnNpbmcgdGhpcyBpbml0aWFsaXplciBgeCA9IHhgLCBgeGAgbXVzdCBiZSByZXNvbHZlZCBpbiB0d28KICAvLy8gZGlmZmVyZW50IHNjb3Blcy4gVGhlIGZpcnN0IGB4YCBtdXN0IGJlIHJlc29sdmVkIGluIHRoZSBjbGFzcycgc2NvcGUsIHRoZQogIC8vLyBzZWNvbmQgaW4gdGhlIGZvcm1hbCBwYXJhbWV0ZXIgc2NvcGUuCiAgYm9vbCBpbkluaXRpYWxpemVyID0gZmFsc2U7CgogIGJvb2wgaW5GaWVsZEluaXRpYWxpemVyID0gZmFsc2U7CgogIGJvb2wgaW5DYXRjaENsYXVzZSA9IGZhbHNlOwoKICBib29sIGluQ2F0Y2hCbG9jayA9IGZhbHNlOwoKICBpbnQgZnVuY3Rpb25OZXN0aW5nTGV2ZWwgPSAwOwoKICAvLyBTZXQgd2hlbiBhIHNwcmVhZCBlbGVtZW50IGlzIGVuY291bnRlcmVkIGluIGEgY29sbGVjdGlvbiBzbyB0aGUgY29sbGVjdGlvbgogIC8vIG5lZWRzIHRvIGJlIGRlc3VnYXJlZCBhZnRlciB0eXBlIGluZmVyZW5jZS4KICBib29sIHRyYW5zZm9ybUNvbGxlY3Rpb25zID0gZmFsc2U7CgogIC8vIFNldCBieSB0eXBlIGluZmVyZW5jZSB3aGVuIGEgc2V0IGxpdGVyYWwgaXMgZW5jb3VudGVyZWQgdGhhdCBuZWVkcyB0byBiZQogIC8vIHRyYW5zZm9ybWVkIGJlY2F1c2UgdGhlIGJhY2tlbmQgdGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgc2V0IGxpdGVyYWxzLgogIGJvb2wgdHJhbnNmb3JtU2V0TGl0ZXJhbHMgPSBmYWxzZTsKCiAgU3RhdGVtZW50IHByb2JsZW1Jbkxvb3BPclN3aXRjaDsKCiAgU2NvcGUgc3dpdGNoU2NvcGU7CgogIENsb25lVmlzaXRvciBjbG9uZXI7CgogIENvbnN0YW50Q29udGV4dCBjb25zdGFudENvbnRleHQgPSBDb25zdGFudENvbnRleHQubm9uZTsKCiAgVW5yZXNvbHZlZFR5cGU8S2VybmVsVHlwZUJ1aWxkZXI+IGN1cnJlbnRMb2NhbFZhcmlhYmxlVHlwZTsKCiAgLy8gVXNpbmcgbm9uLW51bGwgdmFsdWUgdG8gaW5pdGlhbGl6ZSB0aGlzIGZpZWxkIGJhc2VkIG9uIHBlcmZvcm1hbmNlIGFkdmljZQogIC8vIGZyb20gVk0gZW5naW5lZXJzLiBUT0RPKGFoZSk6IERvZXMgdGhpcyBzdGlsbCBhcHBseT8KICBpbnQgY3VycmVudExvY2FsVmFyaWFibGVNb2RpZmllcnMgPSAtMTsKCiAgLy8vIElmIG5vbi1udWxsLCByZWNvcmRzIGluc3RhbmNlIGZpZWxkcyB3aGljaCBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZAogIC8vLyBhbmQgd2hlcmUgdGhhdCB3YXMuCiAgTWFwPFN0cmluZywgaW50PiBpbml0aWFsaXplZEZpZWxkczsKCiAgLy8vIExpc3Qgb2YgYnVpbHQgcmVkaXJlY3RpbmcgZmFjdG9yeSBpbnZvY2F0aW9ucy4gIFRoZSB0YXJnZXRzIG9mIHRoZQogIC8vLyBpbnZvY2F0aW9ucyBhcmUgdG8gYmUgcmVzb2x2ZWQgaW4gYSBzZXBhcmF0ZSBzdGVwLgogIGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gcmVkaXJlY3RpbmdGYWN0b3J5SW52b2NhdGlvbnMgPSA8RXhwcmVzc2lvbj5bXTsKCiAgLy8vIFZhcmlhYmxlcyB3aXRoIG1ldGFkYXRhLiAgVGhlaXIgdHlwZXMgbmVlZCB0byBiZSBpbmZlcnJlZCBsYXRlLCBmb3IKICAvLy8gZXhhbXBsZSwgaW4gW2ZpbmlzaEZ1bmN0aW9uXS4KICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlc1dpdGhNZXRhZGF0YTsKCiAgLy8vIE1vcmUgdGhhbiBvbmUgdmFyaWFibGUgZGVjbGFyZWQgaW4gYSBzaW5nbGUgc3RhdGVtZW50IHRoYXQgaGFzIG1ldGFkYXRhLgogIC8vLyBUaGVpciB0eXBlcyBuZWVkIHRvIGJlIGluZmVycmVkIGxhdGUsIGZvciBleGFtcGxlLCBpbiBbZmluaXNoRnVuY3Rpb25dLgogIExpc3Q8TGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPj4gbXVsdGlWYXJpYWJsZXNXaXRoTWV0YWRhdGE7CgogIEJvZHlCdWlsZGVyKAogICAgICB0aGlzLmxpYnJhcnksCiAgICAgIHRoaXMubWVtYmVyLAogICAgICB0aGlzLmVuY2xvc2luZ1Njb3BlLAogICAgICB0aGlzLmZvcm1hbFBhcmFtZXRlclNjb3BlLAogICAgICB0aGlzLmhpZXJhcmNoeSwKICAgICAgdGhpcy5jb3JlVHlwZXMsCiAgICAgIHRoaXMuY2xhc3NCdWlsZGVyLAogICAgICB0aGlzLmlzSW5zdGFuY2VNZW1iZXIsCiAgICAgIHRoaXMudXJpLAogICAgICB0aGlzLl90eXBlSW5mZXJyZXIpCiAgICAgIDogZW5hYmxlTmF0aXZlID0KICAgICAgICAgICAgbGlicmFyeS5sb2FkZXIudGFyZ2V0LmJhY2tlbmRUYXJnZXQuZW5hYmxlTmF0aXZlKGxpYnJhcnkudXJpKSwKICAgICAgICBzdHJpbmdFeHBlY3RlZEFmdGVyTmF0aXZlID0KICAgICAgICAgICAgbGlicmFyeS5sb2FkZXIudGFyZ2V0LmJhY2tlbmRUYXJnZXQubmF0aXZlRXh0ZW5zaW9uRXhwZWN0c1N0cmluZywKICAgICAgICBpZ25vcmVNYWluSW5HZXRNYWluQ2xvc3VyZSA9IGxpYnJhcnkudXJpLnNjaGVtZSA9PSAnZGFydCcgJiYKICAgICAgICAgICAgKGxpYnJhcnkudXJpLnBhdGggPT0gIl9idWlsdGluIiB8fCBsaWJyYXJ5LnVyaS5wYXRoID09ICJ1aSIpLAogICAgICAgIG5lZWRzSW1wbGljaXRTdXBlckluaXRpYWxpemVyID0KICAgICAgICAgICAgY29yZVR5cGVzPy5vYmplY3RDbGFzcyAhPSBjbGFzc0J1aWxkZXI/LmNscywKICAgICAgICB0eXBlUHJvbW90ZXIgPSBfdHlwZUluZmVycmVyPy50eXBlUHJvbW90ZXIsCiAgICAgICAgbGVnYWN5TW9kZSA9IGxpYnJhcnkubGVnYWN5TW9kZSwKICAgICAgICBzdXBlcihlbmNsb3NpbmdTY29wZSk7CgogIEJvZHlCdWlsZGVyLndpdGhQYXJlbnRzKEtlcm5lbEZpZWxkQnVpbGRlciBmaWVsZCwgS2VybmVsTGlicmFyeUJ1aWxkZXIgcGFydCwKICAgICAgS2VybmVsQ2xhc3NCdWlsZGVyIGNsYXNzQnVpbGRlciwgVHlwZUluZmVycmVyIHR5cGVJbmZlcnJlcikKICAgICAgOiB0aGlzKAogICAgICAgICAgICBwYXJ0LAogICAgICAgICAgICBmaWVsZCwKICAgICAgICAgICAgY2xhc3NCdWlsZGVyPy5zY29wZSA/PyBmaWVsZC5saWJyYXJ5LnNjb3BlLAogICAgICAgICAgICBudWxsLAogICAgICAgICAgICBwYXJ0LmxvYWRlci5oaWVyYXJjaHksCiAgICAgICAgICAgIHBhcnQubG9hZGVyLmNvcmVUeXBlcywKICAgICAgICAgICAgY2xhc3NCdWlsZGVyLAogICAgICAgICAgICBmaWVsZC5pc0luc3RhbmNlTWVtYmVyLAogICAgICAgICAgICBmaWVsZC5maWxlVXJpLAogICAgICAgICAgICB0eXBlSW5mZXJyZXIpOwoKICBCb2R5QnVpbGRlci5mb3JGaWVsZChLZXJuZWxGaWVsZEJ1aWxkZXIgZmllbGQsIFR5cGVJbmZlcnJlciB0eXBlSW5mZXJyZXIpCiAgICAgIDogdGhpcy53aXRoUGFyZW50cygKICAgICAgICAgICAgZmllbGQsCiAgICAgICAgICAgIGZpZWxkLnBhcmVudCBpcyBLZXJuZWxDbGFzc0J1aWxkZXIKICAgICAgICAgICAgICAgID8gZmllbGQucGFyZW50LnBhcmVudAogICAgICAgICAgICAgICAgOiBmaWVsZC5wYXJlbnQsCiAgICAgICAgICAgIGZpZWxkLnBhcmVudCBpcyBLZXJuZWxDbGFzc0J1aWxkZXIgPyBmaWVsZC5wYXJlbnQgOiBudWxsLAogICAgICAgICAgICB0eXBlSW5mZXJyZXIpOwoKICBib29sIGdldCBpbkNvbnN0cnVjdG9yIHsKICAgIHJldHVybiBmdW5jdGlvbk5lc3RpbmdMZXZlbCA9PSAwICYmIG1lbWJlciBpcyBLZXJuZWxDb25zdHJ1Y3RvckJ1aWxkZXI7CiAgfQoKICBib29sIGdldCBpc0luc3RhbmNlQ29udGV4dCB7CiAgICByZXR1cm4gaXNJbnN0YW5jZU1lbWJlciB8fCBtZW1iZXIgaXMgS2VybmVsQ29uc3RydWN0b3JCdWlsZGVyOwogIH0KCiAgVHlwZUVudmlyb25tZW50IGdldCB0eXBlRW52aXJvbm1lbnQgPT4gX3R5cGVJbmZlcnJlcj8udHlwZVNjaGVtYUVudmlyb25tZW50OwoKICBEYXJ0VHlwZSBnZXQgaW1wbGljaXRUeXBlQXJndW1lbnQgPT4KICAgICAgbGVnYWN5TW9kZSA/IGNvbnN0IER5bmFtaWNUeXBlKCkgOiBjb25zdCBJbXBsaWNpdFR5cGVBcmd1bWVudCgpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHB1c2goT2JqZWN0IG5vZGUpIHsKICAgIGlmIChub2RlIGlzIERhcnRUeXBlKSB7CiAgICAgIHVuaGFuZGxlZCgiRGFydFR5cGUiLCAicHVzaCIsIC0xLCB1cmkpOwogICAgfQogICAgaW5Jbml0aWFsaXplciA9IGZhbHNlOwogICAgc3VwZXIucHVzaChub2RlKTsKICB9CgogIEV4cHJlc3Npb24gcG9wRm9yVmFsdWUoKSA9PiB0b1ZhbHVlKHBvcCgpKTsKCiAgRXhwcmVzc2lvbiBwb3BGb3JFZmZlY3QoKSA9PiB0b0VmZmVjdChwb3AoKSk7CgogIEV4cHJlc3Npb24gcG9wRm9yVmFsdWVJZk5vdE51bGwoT2JqZWN0IHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IG51bGwgOiBwb3BGb3JWYWx1ZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiB0b1ZhbHVlKE9iamVjdCBub2RlKSB7CiAgICBpZiAobm9kZSBpcyBHZW5lcmF0b3IpIHsKICAgICAgcmV0dXJuIG5vZGUuYnVpbGRTaW1wbGVSZWFkKCk7CiAgICB9IGVsc2UgaWYgKG5vZGUgaXMgRXhwcmVzc2lvbikgewogICAgICByZXR1cm4gbm9kZTsKICAgIH0gZWxzZSBpZiAobm9kZSBpcyBTdXBlckluaXRpYWxpemVyKSB7CiAgICAgIHJldHVybiBidWlsZFByb2JsZW0oCiAgICAgICAgICBmYXN0YS5tZXNzYWdlU3VwZXJBc0V4cHJlc3Npb24sIG5vZGUuZmlsZU9mZnNldCwgbm9MZW5ndGgpOwogICAgfSBlbHNlIGlmIChub2RlIGlzIFByb2JsZW1CdWlsZGVyKSB7CiAgICAgIHJldHVybiBidWlsZFByb2JsZW0obm9kZS5tZXNzYWdlLCBub2RlLmNoYXJPZmZzZXQsIG5vTGVuZ3RoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB1bmhhbmRsZWQoIiR7bm9kZS5ydW50aW1lVHlwZX0iLCAidG9WYWx1ZSIsIC0xLCB1cmkpOwogICAgfQogIH0KCiAgRXhwcmVzc2lvbiB0b0VmZmVjdChPYmplY3Qgbm9kZSkgewogICAgaWYgKG5vZGUgaXMgR2VuZXJhdG9yKSByZXR1cm4gbm9kZS5idWlsZEZvckVmZmVjdCgpOwogICAgcmV0dXJuIHRvVmFsdWUobm9kZSk7CiAgfQoKICBMaXN0PEV4cHJlc3Npb24+IHBvcExpc3RGb3JWYWx1ZShpbnQgbikgewogICAgTGlzdDxFeHByZXNzaW9uPiBsaXN0ID0KICAgICAgICBuZXcgTGlzdDxFeHByZXNzaW9uPi5maWxsZWQobiwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IG4gLSAxOyBpID49IDA7IGktLSkgewogICAgICBsaXN0W2ldID0gcG9wRm9yVmFsdWUoKTsKICAgIH0KICAgIHJldHVybiBsaXN0OwogIH0KCiAgTGlzdDxFeHByZXNzaW9uPiBwb3BMaXN0Rm9yRWZmZWN0KGludCBuKSB7CiAgICBMaXN0PEV4cHJlc3Npb24+IGxpc3QgPQogICAgICAgIG5ldyBMaXN0PEV4cHJlc3Npb24+LmZpbGxlZChuLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBmb3IgKGludCBpID0gbiAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGxpc3RbaV0gPSBwb3BGb3JFZmZlY3QoKTsKICAgIH0KICAgIHJldHVybiBsaXN0OwogIH0KCiAgU3RhdGVtZW50IHBvcEJsb2NrKGludCBjb3VudCwgVG9rZW4gb3BlbkJyYWNlLCBUb2tlbiBjbG9zZUJyYWNlKSB7CiAgICByZXR1cm4gZm9yZXN0LmJsb2NrKAogICAgICAgIG9wZW5CcmFjZSwKICAgICAgICBjb25zdCBHcm93YWJsZUxpc3Q8U3RhdGVtZW50PigpLnBvcChzdGFjaywgY291bnQpID8/IDxTdGF0ZW1lbnQ+W10sCiAgICAgICAgY2xvc2VCcmFjZSk7CiAgfQoKICBTdGF0ZW1lbnQgcG9wU3RhdGVtZW50SWZOb3ROdWxsKE9iamVjdCB2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyBudWxsIDogcG9wU3RhdGVtZW50KCk7CiAgfQoKICBTdGF0ZW1lbnQgcG9wU3RhdGVtZW50KCkgPT4gZm9yZXN0LndyYXBWYXJpYWJsZXMocG9wKCkpOwoKICB2b2lkIGVudGVyU3dpdGNoU2NvcGUoKSB7CiAgICBwdXNoKHN3aXRjaFNjb3BlID8/IE51bGxWYWx1ZS5Td2l0Y2hTY29wZSk7CiAgICBzd2l0Y2hTY29wZSA9IHNjb3BlOwogIH0KCiAgdm9pZCBleGl0U3dpdGNoU2NvcGUoKSB7CiAgICBTY29wZSBvdXRlclN3aXRjaFNjb3BlID0gcG9wKCk7CiAgICBpZiAoc3dpdGNoU2NvcGUudW5jbGFpbWVkRm9yd2FyZERlY2xhcmF0aW9ucyAhPSBudWxsKSB7CiAgICAgIHN3aXRjaFNjb3BlLnVuY2xhaW1lZEZvcndhcmREZWNsYXJhdGlvbnMKICAgICAgICAgIC5mb3JFYWNoKChTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKICAgICAgICBpZiAob3V0ZXJTd2l0Y2hTY29wZSA9PSBudWxsKSB7CiAgICAgICAgICBKdW1wVGFyZ2V0IHRhcmdldCA9IGRlY2xhcmF0aW9uOwogICAgICAgICAgZm9yIChTdGF0ZW1lbnQgc3RhdGVtZW50IGluIHRhcmdldC51c2VycykgewogICAgICAgICAgICBzdGF0ZW1lbnQucGFyZW50LnJlcGxhY2VDaGlsZCgKICAgICAgICAgICAgICAgIHN0YXRlbWVudCwKICAgICAgICAgICAgICAgIHdyYXBJblByb2JsZW1TdGF0ZW1lbnQoc3RhdGVtZW50LAogICAgICAgICAgICAgICAgICAgIGZhc3RhLnRlbXBsYXRlTGFiZWxOb3RGb3VuZC53aXRoQXJndW1lbnRzKG5hbWUpKSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG91dGVyU3dpdGNoU2NvcGUuZm9yd2FyZERlY2xhcmVMYWJlbChuYW1lLCBkZWNsYXJhdGlvbik7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIHN3aXRjaFNjb3BlID0gb3V0ZXJTd2l0Y2hTY29wZTsKICB9CgogIHZvaWQgd3JhcFZhcmlhYmxlSW5pdGlhbGl6ZXJJbkVycm9yKAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLAogICAgICBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGUsCiAgICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQpIHsKICAgIFN0cmluZyBuYW1lID0gdmFyaWFibGUubmFtZTsKICAgIGludCBvZmZzZXQgPSB2YXJpYWJsZS5maWxlT2Zmc2V0OwogICAgTWVzc2FnZSBtZXNzYWdlID0gdGVtcGxhdGUud2l0aEFyZ3VtZW50cyhuYW1lKTsKICAgIGlmICh2YXJpYWJsZS5pbml0aWFsaXplciA9PSBudWxsKSB7CiAgICAgIHZhcmlhYmxlLmluaXRpYWxpemVyID0KICAgICAgICAgIGJ1aWxkUHJvYmxlbShtZXNzYWdlLCBvZmZzZXQsIG5hbWUubGVuZ3RoLCBjb250ZXh0OiBjb250ZXh0KQogICAgICAgICAgICAuLnBhcmVudCA9IHZhcmlhYmxlOwogICAgfSBlbHNlIHsKICAgICAgdmFyaWFibGUuaW5pdGlhbGl6ZXIgPSB3cmFwSW5Mb2NhdGVkUHJvYmxlbSgKICAgICAgICAgIHZhcmlhYmxlLmluaXRpYWxpemVyLCBtZXNzYWdlLndpdGhMb2NhdGlvbih1cmksIG9mZnNldCwgbmFtZS5sZW5ndGgpLAogICAgICAgICAgY29udGV4dDogY29udGV4dCkKICAgICAgICAuLnBhcmVudCA9IHZhcmlhYmxlOwogICAgfQogIH0KCiAgdm9pZCBkZWNsYXJlVmFyaWFibGUoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgU2NvcGUgc2NvcGUpIHsKICAgIFN0cmluZyBuYW1lID0gdmFyaWFibGUubmFtZTsKICAgIERlY2xhcmF0aW9uIGV4aXN0aW5nID0gc2NvcGUubG9jYWxbbmFtZV07CiAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkgewogICAgICAvLyBUaGlzIHJlcG9ydHMgYW4gZXJyb3IgZm9yIGR1cGxpY2F0ZWQgZGVjbGFyYXRpb25zIGluIHRoZSBzYW1lIHNjb3BlOgogICAgICAvLyBgeyB2YXIgeDsgdmFyIHg7IH1gCiAgICAgIHdyYXBWYXJpYWJsZUluaXRpYWxpemVySW5FcnJvcigKICAgICAgICAgIHZhcmlhYmxlLCBmYXN0YS50ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbiwgPExvY2F0ZWRNZXNzYWdlPlsKICAgICAgICBmYXN0YS50ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbkNhdXNlCiAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUpCiAgICAgICAgICAgIC53aXRoTG9jYXRpb24odXJpLCBleGlzdGluZy5jaGFyT2Zmc2V0LCBuYW1lLmxlbmd0aCkKICAgICAgXSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIExvY2F0ZWRNZXNzYWdlIGNvbnRleHQgPSBzY29wZS5kZWNsYXJlKAogICAgICAgIHZhcmlhYmxlLm5hbWUsCiAgICAgICAgbmV3IEtlcm5lbFZhcmlhYmxlQnVpbGRlcigKICAgICAgICAgICAgdmFyaWFibGUsIG1lbWJlciA/PyBjbGFzc0J1aWxkZXIgPz8gbGlicmFyeSwgdXJpKSwKICAgICAgICB1cmkpOwogICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgewogICAgICAvLyBUaGlzIGNhc2UgaXMgZGlmZmVyZW50IGZyb20gdGhlIGFib3ZlIGVycm9yLiBJbiB0aGlzIGNhc2UsIHRoZSBwcm9ibGVtCiAgICAgIC8vIGlzIHVzaW5nIGB4YCBiZWZvcmUgaXQncyBkZWNsYXJlZDogYHsgdmFyIHg7IHsgcHJpbnQoeCk7IHZhciB4OwogICAgICAvLyB9fWAuIEluIHRoaXMgY2FzZSwgd2Ugd2FudCB0d28gZXJyb3JzLCB0aGUgYHhgIGluIGBwcmludCh4KWAgYW5kIHRoZQogICAgICAvLyBzZWNvbmQgKG9yIGlubmVybW9zdCBkZWNsYXJhdGlvbikgb2YgYHhgLgogICAgICB3cmFwVmFyaWFibGVJbml0aWFsaXplckluRXJyb3IoCiAgICAgICAgICB2YXJpYWJsZSwKICAgICAgICAgIGZhc3RhLnRlbXBsYXRlRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZCwKICAgICAgICAgIDxMb2NhdGVkTWVzc2FnZT5bY29udGV4dF0pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgSnVtcFRhcmdldCBjcmVhdGVKdW1wVGFyZ2V0KEp1bXBUYXJnZXRLaW5kIGtpbmQsIGludCBjaGFyT2Zmc2V0KSB7CiAgICByZXR1cm4gbmV3IEp1bXBUYXJnZXQoa2luZCwgZnVuY3Rpb25OZXN0aW5nTGV2ZWwsIG1lbWJlciwgY2hhck9mZnNldCk7CiAgfQoKICB2b2lkIGluZmVyQW5ub3RhdGlvbnMoTGlzdDxFeHByZXNzaW9uPiBhbm5vdGF0aW9ucykgewogICAgaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKICAgICAgX3R5cGVJbmZlcnJlcj8uaW5mZXJNZXRhZGF0YSh0aGlzLCBhbm5vdGF0aW9ucyk7CiAgICAgIGxpYnJhcnkubG9hZGVyLnRyYW5zZm9ybUxpc3RQb3N0SW5mZXJlbmNlKAogICAgICAgICAgYW5ub3RhdGlvbnMsIHRyYW5zZm9ybVNldExpdGVyYWxzLCB0cmFuc2Zvcm1Db2xsZWN0aW9ucyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTWV0YWRhdGEoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luTWV0YWRhdGEiKTsKICAgIHN1cGVyLnB1c2goY29uc3RhbnRDb250ZXh0KTsKICAgIGNvbnN0YW50Q29udGV4dCA9IENvbnN0YW50Q29udGV4dC5pbmZlcnJlZDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTWV0YWRhdGEoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gcGVyaW9kQmVmb3JlTmFtZSwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIk1ldGFkYXRhIik7CiAgICBBcmd1bWVudHMgYXJndW1lbnRzID0gcG9wKCk7CiAgICBwdXNoUXVhbGlmaWVkUmVmZXJlbmNlKGJlZ2luVG9rZW4ubmV4dCwgcGVyaW9kQmVmb3JlTmFtZSk7CiAgICBpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgcHVzaChhcmd1bWVudHMpOwogICAgICBidWlsZENvbnN0cnVjdG9yUmVmZXJlbmNlSW52b2NhdGlvbigKICAgICAgICAgIGJlZ2luVG9rZW4ubmV4dCwgYmVnaW5Ub2tlbi5vZmZzZXQsIENvbnN0bmVzcy5leHBsaWNpdENvbnN0KTsKICAgICAgcHVzaChwb3BGb3JWYWx1ZSgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHBvcCgpOyAvLyBOYW1lIGxhc3QgaWRlbnRpZmllcgogICAgICBTdHJpbmcgbmFtZSA9IHBvcCgpOwogICAgICBwb3AoKTsgLy8gVHlwZSBhcmd1bWVudHMgKGlnbm9yZWQsIGFscmVhZHkgcmVwb3J0ZWQgYnkgcGFyc2VyKS4KICAgICAgT2JqZWN0IGV4cHJlc3Npb24gPSBwb3AoKTsKICAgICAgaWYgKGV4cHJlc3Npb24gaXMgSWRlbnRpZmllcikgewogICAgICAgIElkZW50aWZpZXIgaWRlbnRpZmllciA9IGV4cHJlc3Npb247CiAgICAgICAgZXhwcmVzc2lvbiA9IG5ldyBVbnJlc29sdmVkTmFtZUdlbmVyYXRvcigKICAgICAgICAgICAgdGhpcywKICAgICAgICAgICAgZGVwcmVjYXRlZF9leHRyYWN0VG9rZW4oaWRlbnRpZmllciksCiAgICAgICAgICAgIG5ldyBOYW1lKGlkZW50aWZpZXIubmFtZSwgbGlicmFyeS5saWJyYXJ5KSk7CiAgICAgIH0KICAgICAgaWYgKG5hbWU/LmlzTm90RW1wdHkgPz8gZmFsc2UpIHsKICAgICAgICBUb2tlbiBwZXJpb2QgPSBwZXJpb2RCZWZvcmVOYW1lID8/IGJlZ2luVG9rZW4ubmV4dC5uZXh0OwogICAgICAgIEdlbmVyYXRvciBnZW5lcmF0b3IgPSBleHByZXNzaW9uOwogICAgICAgIGV4cHJlc3Npb24gPSBnZW5lcmF0b3IuYnVpbGRQcm9wZXJ0eUFjY2VzcygKICAgICAgICAgICAgbmV3IEluY29tcGxldGVQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcigKICAgICAgICAgICAgICAgIHRoaXMsIHBlcmlvZC5uZXh0LCBuZXcgTmFtZShuYW1lLCBsaWJyYXJ5LmxpYnJhcnkpKSwKICAgICAgICAgICAgcGVyaW9kLm5leHQub2Zmc2V0LAogICAgICAgICAgICBmYWxzZSk7CiAgICAgIH0KCiAgICAgIENvbnN0YW50Q29udGV4dCBzYXZlZENvbnN0YW50Q29udGV4dCA9IHBvcCgpOwogICAgICBpZiAoZXhwcmVzc2lvbiBpcyEgU3RhdGljQWNjZXNzR2VuZXJhdG9yKSB7CiAgICAgICAgcHVzaCh3cmFwSW5Qcm9ibGVtKAogICAgICAgICAgICB0b1ZhbHVlKGV4cHJlc3Npb24pLCBmYXN0YS5tZXNzYWdlRXhwcmVzc2lvbk5vdE1ldGFkYXRhLCBub0xlbmd0aCkpOwogICAgICB9IGVsc2UgewogICAgICAgIHB1c2godG9WYWx1ZShleHByZXNzaW9uKSk7CiAgICAgIH0KICAgICAgY29uc3RhbnRDb250ZXh0ID0gc2F2ZWRDb25zdGFudENvbnRleHQ7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE1ldGFkYXRhU3RhcihpbnQgY291bnQpIHsKICAgIGRlYnVnRXZlbnQoIk1ldGFkYXRhU3RhciIpOwogICAgaWYgKGNvdW50ID09IDApIHsKICAgICAgcHVzaChOdWxsVmFsdWUuTWV0YWRhdGEpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChjb25zdCBHcm93YWJsZUxpc3Q8RXhwcmVzc2lvbj4oKS5wb3Aoc3RhY2ssIGNvdW50KSA/PwogICAgICAgICAgTnVsbFZhbHVlLk1ldGFkYXRhIC8qIElnbm9yZSBwYXJzZXIgcmVjb3ZlcnkgKi8pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRUb3BMZXZlbEZpZWxkcyhUb2tlbiBzdGF0aWNUb2tlbiwgVG9rZW4gY292YXJpYW50VG9rZW4sCiAgICAgIFRva2VuIHZhckZpbmFsT3JDb25zdCwgaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiVG9wTGV2ZWxGaWVsZHMiKTsKICAgIHB1c2goY291bnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGaWVsZHMoVG9rZW4gc3RhdGljVG9rZW4sIFRva2VuIGNvdmFyaWFudFRva2VuLCBUb2tlbiB2YXJGaW5hbE9yQ29uc3QsCiAgICAgIGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkZpZWxkcyIpOwogICAgcHVzaChjb3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZpbmlzaEZpZWxkcygpIHsKICAgIGRlYnVnRXZlbnQoImZpbmlzaEZpZWxkcyIpOwogICAgaW50IGNvdW50ID0gcG9wKCk7CiAgICBMaXN0PEtlcm5lbEZpZWxkQnVpbGRlcj4gZmllbGRzID0gPEtlcm5lbEZpZWxkQnVpbGRlcj5bXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBFeHByZXNzaW9uIGluaXRpYWxpemVyID0gcG9wKCk7CiAgICAgIElkZW50aWZpZXIgaWRlbnRpZmllciA9IHBvcCgpOwogICAgICBTdHJpbmcgbmFtZSA9IGlkZW50aWZpZXIubmFtZTsKICAgICAgRGVjbGFyYXRpb24gZGVjbGFyYXRpb247CiAgICAgIGlmIChjbGFzc0J1aWxkZXIgIT0gbnVsbCkgewogICAgICAgIGRlY2xhcmF0aW9uID0gY2xhc3NCdWlsZGVyW25hbWVdOwogICAgICB9IGVsc2UgewogICAgICAgIGRlY2xhcmF0aW9uID0gbGlicmFyeVtuYW1lXTsKICAgICAgfQogICAgICBLZXJuZWxGaWVsZEJ1aWxkZXIgZmllbGQ7CiAgICAgIGlmIChkZWNsYXJhdGlvbi5pc0ZpZWxkICYmIGRlY2xhcmF0aW9uLm5leHQgPT0gbnVsbCkgewogICAgICAgIGZpZWxkID0gZGVjbGFyYXRpb247CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZmllbGRzLmFkZChmaWVsZCk7CiAgICAgIGlmIChpbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgICAgaWYgKGZpZWxkLm5leHQgIT0gbnVsbCkgewogICAgICAgICAgLy8gRHVwbGljYXRlIGRlZmluaXRpb24uIFRoZSBmaWVsZCBtaWdodCBub3QgYmUgdGhlIGNvcnJlY3Qgb25lLAogICAgICAgICAgLy8gc28gd2Ugc2tpcCBpbmZlcmVuY2Ugb2YgdGhlIGluaXRpYWxpemVyLgogICAgICAgICAgLy8gRXJyb3IgcmVwb3J0aW5nIGFuZCByZWNvdmVyeSBpcyBoYW5kbGVkIGVsc2V3aGVyZS4KICAgICAgICB9IGVsc2UgewogICAgICAgICAgZmllbGQuaW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplcjsKICAgICAgICAgIF90eXBlSW5mZXJyZXI/LmluZmVyRmllbGRJbml0aWFsaXplcigKICAgICAgICAgICAgICB0aGlzLCBmaWVsZC5idWlsdFR5cGUsIGluaXRpYWxpemVyKTsKICAgICAgICAgIGxpYnJhcnkubG9hZGVyLnRyYW5zZm9ybVBvc3RJbmZlcmVuY2UoCiAgICAgICAgICAgICAgZmllbGQudGFyZ2V0LCB0cmFuc2Zvcm1TZXRMaXRlcmFscywgdHJhbnNmb3JtQ29sbGVjdGlvbnMpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgewogICAgICAvLyBUT0RPKGFoZSk6IFRoZSB0eXBlIHdlIGNvbXB1dGUgaGVyZSBtYXkgYmUgZGlmZmVyZW50IGZyb20gd2hhdCBpcwogICAgICAvLyBjb21wdXRlZCBpbiB0aGUgb3V0bGluZSBwaGFzZS4gV2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHRoZSBvdXRsaW5lCiAgICAgIC8vIHBoYXNlIGNvbXB1dGVzIHRoZSBzYW1lIHR5cGUuIFNlZQogICAgICAvLyBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9yZWdyZXNzL2lzc3VlXzMyMjAwLmRhcnQgZm9yIGFuIGV4YW1wbGUgd2hlcmUKICAgICAgLy8gbm90IGNhbGxpbmcgW2J1aWxkRGFydFR5cGVdIGxlYWRzIHRvIGEgbWlzc2luZyBjb21waWxlLXRpbWUKICAgICAgLy8gZXJyb3IuIEFsc28sIG5vdGljZSB0aGF0IHRoZSB0eXBlIG9mIHRoZSBwcm9ibGVtYXRpYyBmaWVsZCBpc24ndAogICAgICAvLyBgaW52YWxpZC10eXBlYC4KICAgICAgYnVpbGREYXJ0VHlwZShwb3AoKSk7IC8vIFR5cGUuCiAgICB9CiAgICBMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zID0gcG9wKCk7CiAgICBpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgewogICAgICBpbmZlckFubm90YXRpb25zKGFubm90YXRpb25zKTsKICAgICAgRmllbGQgZmllbGQgPSBmaWVsZHMuZmlyc3QudGFyZ2V0OwogICAgICAvLyBUaGUgZmlyc3QgKGFuZCBvZnRlbiBvbmx5IGZpZWxkKSB3aWxsIG5vdCBnZXQgYSBjbG9uZS4KICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgIGZpZWxkLmFkZEFubm90YXRpb24oYW5ub3RhdGlvbnNbaV0pOwogICAgICB9CiAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLy8gV2UgaGF2ZSB0byBjbG9uZSB0aGUgYW5ub3RhdGlvbnMgb24gdGhlIHJlbWFpbmluZyBmaWVsZHMuCiAgICAgICAgZmllbGQgPSBmaWVsZHNbaV0udGFyZ2V0OwogICAgICAgIGNsb25lciA/Pz0gbmV3IENsb25lVmlzaXRvcigpOwogICAgICAgIGZvciAoRXhwcmVzc2lvbiBhbm5vdGF0aW9uIGluIGFubm90YXRpb25zKSB7CiAgICAgICAgICBmaWVsZC5hZGRBbm5vdGF0aW9uKGNsb25lci5jbG9uZShhbm5vdGF0aW9uKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmVzb2x2ZVJlZGlyZWN0aW5nRmFjdG9yeVRhcmdldHMoKTsKICAgIGZpbmlzaFZhcmlhYmxlTWV0YWRhdGEoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTWVtYmVyKCkgewogICAgZGVidWdFdmVudCgiTWVtYmVyIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEJsb2NrRnVuY3Rpb25Cb2R5KGludCBjb3VudCwgVG9rZW4gb3BlbkJyYWNlLCBUb2tlbiBjbG9zZUJyYWNlKSB7CiAgICBkZWJ1Z0V2ZW50KCJCbG9ja0Z1bmN0aW9uQm9keSIpOwogICAgaWYgKG9wZW5CcmFjZSA9PSBudWxsKSB7CiAgICAgIGFzc2VydChjb3VudCA9PSAwKTsKICAgICAgcHVzaChOdWxsVmFsdWUuQmxvY2spOwogICAgfSBlbHNlIHsKICAgICAgU3RhdGVtZW50IGJsb2NrID0gcG9wQmxvY2soY291bnQsIG9wZW5CcmFjZSwgY2xvc2VCcmFjZSk7CiAgICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICAgIHB1c2goYmxvY2spOwogICAgfQogIH0KCiAgdm9pZCBwcmVwYXJlSW5pdGlhbGl6ZXJzKCkgewogICAgUHJvY2VkdXJlQnVpbGRlcjxUeXBlQnVpbGRlcj4gbWVtYmVyID0gdGhpcy5tZW1iZXI7CiAgICBzY29wZSA9IG1lbWJlci5jb21wdXRlRm9ybWFsUGFyYW1ldGVySW5pdGlhbGl6ZXJTY29wZShzY29wZSk7CiAgICBpZiAobWVtYmVyIGlzIEtlcm5lbENvbnN0cnVjdG9yQnVpbGRlcikgewogICAgICBpZiAobWVtYmVyLmZvcm1hbHMgIT0gbnVsbCkgewogICAgICAgIGZvciAoS2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgaW4gbWVtYmVyLmZvcm1hbHMpIHsKICAgICAgICAgIGlmIChmb3JtYWwuaXNJbml0aWFsaXppbmdGb3JtYWwpIHsKICAgICAgICAgICAgSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXI7CiAgICAgICAgICAgIGlmIChtZW1iZXIuaXNFeHRlcm5hbCkgewogICAgICAgICAgICAgIGluaXRpYWxpemVyID0gYnVpbGRJbnZhbGlkSW5pdGlhbGl6ZXIoCiAgICAgICAgICAgICAgICAgIGRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKGJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VFeHRlcm5hbENvbnN0cnVjdG9yV2l0aEZpZWxkSW5pdGlhbGl6ZXJzLAogICAgICAgICAgICAgICAgICAgICAgZm9ybWFsLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICBmb3JtYWwubmFtZS5sZW5ndGgpKSwKICAgICAgICAgICAgICAgICAgZm9ybWFsLmNoYXJPZmZzZXQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGluaXRpYWxpemVyID0gYnVpbGRGaWVsZEluaXRpYWxpemVyKAogICAgICAgICAgICAgICAgICB0cnVlLAogICAgICAgICAgICAgICAgICBmb3JtYWwubmFtZSwKICAgICAgICAgICAgICAgICAgZm9ybWFsLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgIGZvcm1hbC5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgICBuZXcgVmFyaWFibGVHZXQoZm9ybWFsLmRlY2xhcmF0aW9uKSwKICAgICAgICAgICAgICAgICAgZm9ybWFsVHlwZTogZm9ybWFsLmRlY2xhcmF0aW9uLnR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1lbWJlci5hZGRJbml0aWFsaXplcihpbml0aWFsaXplciwgdGhpcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vSW5pdGlhbGl6ZXJzKCkgewogICAgZGVidWdFdmVudCgiTm9Jbml0aWFsaXplcnMiKTsKICAgIGlmIChmdW5jdGlvbk5lc3RpbmdMZXZlbCA9PSAwKSB7CiAgICAgIHByZXBhcmVJbml0aWFsaXplcnMoKTsKICAgICAgc2NvcGUgPSBmb3JtYWxQYXJhbWV0ZXJTY29wZTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Jbml0aWFsaXplcnMoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luSW5pdGlhbGl6ZXJzIik7CiAgICBpZiAoZnVuY3Rpb25OZXN0aW5nTGV2ZWwgPT0gMCkgewogICAgICBwcmVwYXJlSW5pdGlhbGl6ZXJzKCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEluaXRpYWxpemVycyhpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJJbml0aWFsaXplcnMiKTsKICAgIGlmIChmdW5jdGlvbk5lc3RpbmdMZXZlbCA9PSAwKSB7CiAgICAgIHNjb3BlID0gZm9ybWFsUGFyYW1ldGVyU2NvcGU7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luSW5pdGlhbGl6ZXIoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luSW5pdGlhbGl6ZXIiKTsKICAgIGluSW5pdGlhbGl6ZXIgPSB0cnVlOwogICAgaW5GaWVsZEluaXRpYWxpemVyID0gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kSW5pdGlhbGl6ZXIoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZEluaXRpYWxpemVyIik7CiAgICBpbkZpZWxkSW5pdGlhbGl6ZXIgPSBmYWxzZTsKICAgIGFzc2VydCghaW5Jbml0aWFsaXplcik7CiAgICBmaW5hbCBtZW1iZXIgPSB0aGlzLm1lbWJlcjsKICAgIE9iamVjdCBub2RlID0gcG9wKCk7CiAgICBJbml0aWFsaXplciBpbml0aWFsaXplcjsKICAgIGlmIChub2RlIGlzIEluaXRpYWxpemVyKSB7CiAgICAgIGluaXRpYWxpemVyID0gbm9kZTsKICAgIH0gZWxzZSBpZiAobm9kZSBpcyBHZW5lcmF0b3IpIHsKICAgICAgaW5pdGlhbGl6ZXIgPSBub2RlLmJ1aWxkRmllbGRJbml0aWFsaXplcihpbml0aWFsaXplZEZpZWxkcyk7CiAgICB9IGVsc2UgaWYgKG5vZGUgaXMgQ29uc3RydWN0b3JJbnZvY2F0aW9uKSB7CiAgICAgIGluaXRpYWxpemVyID0gYnVpbGRTdXBlckluaXRpYWxpemVyKAogICAgICAgICAgZmFsc2UsIG5vZGUudGFyZ2V0LCBub2RlLmFyZ3VtZW50cywgdG9rZW4uY2hhck9mZnNldCk7CiAgICB9IGVsc2UgewogICAgICBFeHByZXNzaW9uIHZhbHVlID0gdG9WYWx1ZShub2RlKTsKICAgICAgaWYgKCFmb3Jlc3QuaXNUaHJvdyhub2RlKSkgewogICAgICAgIHZhbHVlID0KICAgICAgICAgICAgd3JhcEluUHJvYmxlbSh2YWx1ZSwgZmFzdGEubWVzc2FnZUV4cGVjdGVkQW5Jbml0aWFsaXplciwgbm9MZW5ndGgpOwogICAgICB9CiAgICAgIGluaXRpYWxpemVyID0gYnVpbGRJbnZhbGlkSW5pdGlhbGl6ZXIobm9kZSwgdG9rZW4uY2hhck9mZnNldCk7CiAgICB9CiAgICBfdHlwZUluZmVycmVyPy5pbmZlckluaXRpYWxpemVyKHRoaXMsIGluaXRpYWxpemVyKTsKICAgIGlmIChtZW1iZXIgaXMgS2VybmVsQ29uc3RydWN0b3JCdWlsZGVyICYmICFtZW1iZXIuaXNFeHRlcm5hbCkgewogICAgICBtZW1iZXIuYWRkSW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXIsIHRoaXMpOwogICAgfSBlbHNlIHsKICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgIGZhc3RhLnRlbXBsYXRlSW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3IKICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhtZW1iZXIubmFtZSksCiAgICAgICAgICB0b2tlbi5jaGFyT2Zmc2V0LAogICAgICAgICAgbWVtYmVyLm5hbWUubGVuZ3RoKTsKICAgIH0KICB9CgogIERhcnRUeXBlIF9jb21wdXRlUmV0dXJuVHlwZUNvbnRleHQoTWVtYmVyQnVpbGRlciBtZW1iZXIpIHsKICAgIGlmIChtZW1iZXIgaXMgS2VybmVsUHJvY2VkdXJlQnVpbGRlcikgewogICAgICByZXR1cm4gbWVtYmVyLnByb2NlZHVyZS5mdW5jdGlvbi5yZXR1cm5UeXBlOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KG1lbWJlciBpcyBLZXJuZWxDb25zdHJ1Y3RvckJ1aWxkZXIpOwogICAgICByZXR1cm4gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZmluaXNoRnVuY3Rpb24oTGlzdDxFeHByZXNzaW9uPiBhbm5vdGF0aW9ucywgRm9ybWFsUGFyYW1ldGVycyBmb3JtYWxzLAogICAgICBBc3luY01hcmtlciBhc3luY01vZGlmaWVyLCBTdGF0ZW1lbnQgYm9keSkgewogICAgZGVidWdFdmVudCgiZmluaXNoRnVuY3Rpb24iKTsKICAgIHR5cGVQcm9tb3Rlcj8uZmluaXNoZWQoKTsKCiAgICBLZXJuZWxGdW5jdGlvbkJ1aWxkZXIgYnVpbGRlciA9IG1lbWJlcjsKICAgIGlmIChmb3JtYWxzPy5wYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmb3JtYWxzLnBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBLZXJuZWxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIHBhcmFtZXRlciA9IGZvcm1hbHMucGFyYW1ldGVyc1tpXTsKICAgICAgICBFeHByZXNzaW9uIGluaXRpYWxpemVyID0gcGFyYW1ldGVyLnRhcmdldC5pbml0aWFsaXplcjsKICAgICAgICBpZiAocGFyYW1ldGVyLmlzT3B0aW9uYWwgfHwgaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiByZWFsUGFyYW1ldGVyID0gYnVpbGRlci5mb3JtYWxzW2ldLnRhcmdldDsKICAgICAgICAgIGlmIChwYXJhbWV0ZXIuaXNPcHRpb25hbCkgewogICAgICAgICAgICBpbml0aWFsaXplciA/Pz0gZm9yZXN0LmxpdGVyYWxOdWxsKAogICAgICAgICAgICAgICAgLy8gVE9ETyhhaGUpOiBTaG91bGQgc3RvcmU6IHJlYWxQYXJhbWV0ZXIuZmlsZU9mZnNldAogICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzMyMjg5CiAgICAgICAgICAgICAgICBudWxsKTsKICAgICAgICAgIH0KICAgICAgICAgIHJlYWxQYXJhbWV0ZXIuaW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplci4ucGFyZW50ID0gcmVhbFBhcmFtZXRlcjsKICAgICAgICAgIF90eXBlSW5mZXJyZXI/LmluZmVyUGFyYW1ldGVySW5pdGlhbGl6ZXIoCiAgICAgICAgICAgICAgdGhpcywgaW5pdGlhbGl6ZXIsIHJlYWxQYXJhbWV0ZXIudHlwZSk7CiAgICAgICAgICBsaWJyYXJ5LmxvYWRlci50cmFuc2Zvcm1Qb3N0SW5mZXJlbmNlKAogICAgICAgICAgICAgIHJlYWxQYXJhbWV0ZXIsIHRyYW5zZm9ybVNldExpdGVyYWxzLCB0cmFuc2Zvcm1Db2xsZWN0aW9ucyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgX3R5cGVJbmZlcnJlcj8uaW5mZXJGdW5jdGlvbkJvZHkoCiAgICAgICAgdGhpcywgX2NvbXB1dGVSZXR1cm5UeXBlQ29udGV4dChtZW1iZXIpLCBhc3luY01vZGlmaWVyLCBib2R5KTsKICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgbGlicmFyeS5sb2FkZXIudHJhbnNmb3JtUG9zdEluZmVyZW5jZSgKICAgICAgICAgIGJvZHksIHRyYW5zZm9ybVNldExpdGVyYWxzLCB0cmFuc2Zvcm1Db2xsZWN0aW9ucyk7CiAgICB9CgogICAgLy8gRm9yIGFzeW5jLCBhc3luYyosIGFuZCBzeW5jKiBmdW5jdGlvbnMgd2l0aCBkZWNsYXJlZCByZXR1cm4gdHlwZXMsIHdlCiAgICAvLyBuZWVkIHRvIGRldGVybWluZSB3aGV0aGVyIHRob3NlIHR5cGVzIGFyZSB2YWxpZC4KICAgIC8vIFRPRE8oaGlsbGVyc3Ryb20pOiBjdXJyZW50bHksIHdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciBbbGVnYWN5TW9kZV0gaXMKICAgIC8vIGVuYWJsZWQgZm9yIHR3byByZWFzb25zOgogICAgLy8gMSkgdGhlIFtpc1N1YnR5cGVPZl0gcHJlZGljYXRlIHByb2R1Y2VzIGZhbHNlLW5lZ2F0aXZlcyB3aGVuCiAgICAvLyBbbGVnYWN5TW9kZV0gaXMgZW5hYmxlZC4KICAgIC8vIDIpIHRoZSBtZW1iZXIgW3R5cGVFbnZpcm9ubWVudF0gbWlnaHQgYmUgbnVsbCB3aGVuIFtsZWdhY3lNb2RlXSBpcwogICAgLy8gZW5hYmxlZC4KICAgIC8vIFRoaXMgcGFydGljdWxhciBiZWhhdmlvdXIgY2FuIGJlIG9ic2VydmVkIHdoZW4gcnVubmluZyB0aGUgZmFzdGEgcGVyZgogICAgLy8gYmVuY2htYXJrcy4KICAgIGlmICghbGVnYWN5TW9kZSAmJiBidWlsZGVyLnJldHVyblR5cGUgIT0gbnVsbCkgewogICAgICBEYXJ0VHlwZSByZXR1cm5UeXBlID0gYnVpbGRlci5mdW5jdGlvbi5yZXR1cm5UeXBlOwogICAgICAvLyBXZSB1c2UgdGhlIHNhbWUgdHJpY2sgaW4gZWFjaCBjYXNlIGJlbG93LiBGb3IgZXhhbXBsZSB0byBkZWNpZGUgd2hldGhlcgogICAgICAvLyBGdXR1cmU8VD4gPDogW3JldHVyblR5cGVdIGZvciBldmVyeSBULCB3ZSByZWx5IG9uIEZ1dHVyZTxCb3Q+IGFuZAogICAgICAvLyB0cmFuc2l0aXZpdHkgb2YgdGhlIHN1YnR5cGluZyByZWxhdGlvbiBiZWNhdXNlIEZ1dHVyZTxCb3Q+IDw6IEZ1dHVyZTxUPgogICAgICAvLyBmb3IgZXZlcnkgVC4KCiAgICAgIC8vIFdlIHVzZSBbcHJvYmxlbSA9PSBudWxsXSB0byBzaWduYWwgc3VjY2Vzcy4KICAgICAgTWVzc2FnZSBwcm9ibGVtOwogICAgICBzd2l0Y2ggKGFzeW5jTW9kaWZpZXIpIHsKICAgICAgICBjYXNlIEFzeW5jTWFya2VyLkFzeW5jOgogICAgICAgICAgRGFydFR5cGUgZnV0dXJlQm90dG9tVHlwZSA9IGxpYnJhcnkubG9hZGVyLmZ1dHVyZU9mQm90dG9tOwogICAgICAgICAgaWYgKCF0eXBlRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoZnV0dXJlQm90dG9tVHlwZSwgcmV0dXJuVHlwZSkpIHsKICAgICAgICAgICAgcHJvYmxlbSA9IGZhc3RhLm1lc3NhZ2VJbGxlZ2FsQXN5bmNSZXR1cm5UeXBlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgQXN5bmNNYXJrZXIuQXN5bmNTdGFyOgogICAgICAgICAgRGFydFR5cGUgc3RyZWFtQm90dG9tVHlwZSA9IGxpYnJhcnkubG9hZGVyLnN0cmVhbU9mQm90dG9tOwogICAgICAgICAgaWYgKHJldHVyblR5cGUgaXMgVm9pZFR5cGUpIHsKICAgICAgICAgICAgcHJvYmxlbSA9IGZhc3RhLm1lc3NhZ2VJbGxlZ2FsQXN5bmNHZW5lcmF0b3JWb2lkUmV0dXJuVHlwZTsKICAgICAgICAgIH0gZWxzZSBpZiAoIXR5cGVFbnZpcm9ubWVudC5pc1N1YnR5cGVPZigKICAgICAgICAgICAgICBzdHJlYW1Cb3R0b21UeXBlLCByZXR1cm5UeXBlKSkgewogICAgICAgICAgICBwcm9ibGVtID0gZmFzdGEubWVzc2FnZUlsbGVnYWxBc3luY0dlbmVyYXRvclJldHVyblR5cGU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBBc3luY01hcmtlci5TeW5jU3RhcjoKICAgICAgICAgIERhcnRUeXBlIGl0ZXJhYmxlQm90dG9tVHlwZSA9IGxpYnJhcnkubG9hZGVyLml0ZXJhYmxlT2ZCb3R0b207CiAgICAgICAgICBpZiAocmV0dXJuVHlwZSBpcyBWb2lkVHlwZSkgewogICAgICAgICAgICBwcm9ibGVtID0gZmFzdGEubWVzc2FnZUlsbGVnYWxTeW5jR2VuZXJhdG9yVm9pZFJldHVyblR5cGU7CiAgICAgICAgICB9IGVsc2UgaWYgKCF0eXBlRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoCiAgICAgICAgICAgICAgaXRlcmFibGVCb3R0b21UeXBlLCByZXR1cm5UeXBlKSkgewogICAgICAgICAgICBwcm9ibGVtID0gZmFzdGEubWVzc2FnZUlsbGVnYWxTeW5jR2VuZXJhdG9yUmV0dXJuVHlwZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEFzeW5jTWFya2VyLlN5bmM6CiAgICAgICAgICBicmVhazsgLy8gc2tpcAogICAgICAgIGNhc2UgQXN5bmNNYXJrZXIuU3luY1lpZWxkaW5nOgogICAgICAgICAgdW5leHBlY3RlZCgiYXN5bmMsIGFzeW5jKiwgc3luYywgb3Igc3luYyoiLCAiJGFzeW5jTW9kaWZpZXIiLAogICAgICAgICAgICAgIG1lbWJlci5jaGFyT2Zmc2V0LCB1cmkpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICAgIGlmIChwcm9ibGVtICE9IG51bGwpIHsKICAgICAgICAvLyBUT0RPKGhpbGxlcnN0cm9tKTogb25jZSB0eXBlcyBnZXQgYW5ub3RhdGVkIHdpdGggbG9jYXRpb24KICAgICAgICAvLyBpbmZvcm1hdGlvbiwgd2UgY2FuIGltcHJvdmUgdGhlIHF1YWxpdHkgb2YgdGhlIGVycm9yIG1lc3NhZ2UgYnkKICAgICAgICAvLyB1c2luZyB0aGUgb2Zmc2V0IG9mIFtyZXR1cm5UeXBlXSAoYW5kIHRoZSBsZW5ndGggb2YgaXRzIG5hbWUpLgogICAgICAgIGFkZFByb2JsZW0ocHJvYmxlbSwgbWVtYmVyLmNoYXJPZmZzZXQsIG1lbWJlci5uYW1lLmxlbmd0aCk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoYnVpbGRlci5raW5kID09IFByb2NlZHVyZUtpbmQuU2V0dGVyKSB7CiAgICAgIGlmIChmb3JtYWxzPy5wYXJhbWV0ZXJzID09IG51bGwgfHwKICAgICAgICAgIGZvcm1hbHMucGFyYW1ldGVycy5sZW5ndGggIT0gMSB8fAogICAgICAgICAgZm9ybWFscy5wYXJhbWV0ZXJzLnNpbmdsZS5pc09wdGlvbmFsKSB7CiAgICAgICAgaW50IGNoYXJPZmZzZXQgPSBmb3JtYWxzPy5jaGFyT2Zmc2V0ID8/CiAgICAgICAgICAgIGJvZHk/LmZpbGVPZmZzZXQgPz8KICAgICAgICAgICAgYnVpbGRlci50YXJnZXQuZmlsZU9mZnNldDsKICAgICAgICBpZiAoYm9keSA9PSBudWxsKSB7CiAgICAgICAgICBib2R5ID0gbmV3IEVtcHR5U3RhdGVtZW50KCkuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0OwogICAgICAgIH0KICAgICAgICBpZiAoYnVpbGRlci5mb3JtYWxzICE9IG51bGwpIHsKICAgICAgICAgIC8vIElsbGVnYWwgcGFyYW1ldGVycyB3ZXJlIHJlbW92ZWQgYnkgdGhlIGZ1bmN0aW9uIGJ1aWxkZXIuCiAgICAgICAgICAvLyBBZGQgdGhlbSBhcyBsb2NhbCB2YXJpYWJsZSB0byBwdXQgdGhlbSBpbiBzY29wZSBvZiB0aGUgYm9keS4KICAgICAgICAgIExpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzID0gPFN0YXRlbWVudD5bXTsKICAgICAgICAgIGZvciAoS2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBwYXJhbWV0ZXIgaW4gYnVpbGRlci5mb3JtYWxzKSB7CiAgICAgICAgICAgIHN0YXRlbWVudHMuYWRkKHBhcmFtZXRlci50YXJnZXQpOwogICAgICAgICAgfQogICAgICAgICAgc3RhdGVtZW50cy5hZGQoYm9keSk7CiAgICAgICAgICBib2R5ID0gZm9yZXN0LmJsb2NrKG51bGwsIHN0YXRlbWVudHMsIG51bGwpLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICAgICAgICB9CiAgICAgICAgYm9keSA9IGZvcmVzdC5ibG9jaygKICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgPFN0YXRlbWVudD5bCiAgICAgICAgICAgICAgZm9yZXN0LmV4cHJlc3Npb25TdGF0ZW1lbnQoCiAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZXJyb3IgaXMgYWRkZWQgYWZ0ZXIgdHlwZSBpbmZlcmVuY2UgaXMgZG9uZSwgc28gd2UKICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgbmVlZCB0byB3cmFwIGVycm9ycyBpbiBTeW50aGV0aWNFeHByZXNzaW9uSnVkZ21lbnQuCiAgICAgICAgICAgICAgICAgIGRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKGJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VTZXR0ZXJXaXRoV3JvbmdOdW1iZXJPZkZvcm1hbHMsCiAgICAgICAgICAgICAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgbm9MZW5ndGgpKSwKICAgICAgICAgICAgICAgICAgbnVsbCksCiAgICAgICAgICAgICAgYm9keSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgbnVsbCkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgICAgIH0KICAgIH0KICAgIC8vIE5vLXN1Y2gtbWV0aG9kIGZvcndhcmRlcnMgZ2V0IHRoZWlyIGJvZGllcyBpbmplY3RlZCBkdXJpbmcgb3V0bGluZQogICAgLy8gYnVpbGRpbmcsIHNvIHdlIHNob3VsZCBza2lwIHRoZW0gaGVyZS4KICAgIGJvb2wgaXNOb1N1Y2hNZXRob2RGb3J3YXJkZXIgPSAoYnVpbGRlci5mdW5jdGlvbi5wYXJlbnQgaXMgUHJvY2VkdXJlICYmCiAgICAgICAgKGJ1aWxkZXIuZnVuY3Rpb24ucGFyZW50IGFzIFByb2NlZHVyZSkuaXNOb1N1Y2hNZXRob2RGb3J3YXJkZXIpOwogICAgaWYgKCFidWlsZGVyLmlzRXh0ZXJuYWwgJiYgIWlzTm9TdWNoTWV0aG9kRm9yd2FyZGVyKSB7CiAgICAgIGJ1aWxkZXIuYm9keSA9IGJvZHk7CiAgICB9IGVsc2UgewogICAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgICAgYnVpbGRlci5ib2R5ID0gbmV3IEJsb2NrKDxTdGF0ZW1lbnQ+WwogICAgICAgICAgbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnRKdWRnbWVudChkZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbigKICAgICAgICAgICAgICBidWlsZFByb2JsZW0oZmFzdGEubWVzc2FnZUV4dGVybmFsTWV0aG9kV2l0aEJvZHksIGJvZHkuZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgICAgbm9MZW5ndGgpKSkKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gYm9keS5maWxlT2Zmc2V0LAogICAgICAgICAgYm9keSwKICAgICAgICBdKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gYm9keS5maWxlT2Zmc2V0OwogICAgICB9CiAgICB9CiAgICBNZW1iZXIgdGFyZ2V0ID0gYnVpbGRlci50YXJnZXQ7CiAgICBpbmZlckFubm90YXRpb25zKGFubm90YXRpb25zKTsKICAgIGZvciAoRXhwcmVzc2lvbiBhbm5vdGF0aW9uIGluIGFubm90YXRpb25zID8/IGNvbnN0IFtdKSB7CiAgICAgIHRhcmdldC5hZGRBbm5vdGF0aW9uKGFubm90YXRpb24pOwogICAgfQogICAgaWYgKGJ1aWxkZXIgaXMgS2VybmVsQ29uc3RydWN0b3JCdWlsZGVyKSB7CiAgICAgIGZpbmlzaENvbnN0cnVjdG9yKGJ1aWxkZXIsIGFzeW5jTW9kaWZpZXIpOwogICAgfSBlbHNlIGlmIChidWlsZGVyIGlzIEtlcm5lbFByb2NlZHVyZUJ1aWxkZXIpIHsKICAgICAgYnVpbGRlci5hc3luY01vZGlmaWVyID0gYXN5bmNNb2RpZmllcjsKICAgIH0gZWxzZSB7CiAgICAgIHVuaGFuZGxlZCgiJHtidWlsZGVyLnJ1bnRpbWVUeXBlfSIsICJmaW5pc2hGdW5jdGlvbiIsIGJ1aWxkZXIuY2hhck9mZnNldCwKICAgICAgICAgIGJ1aWxkZXIuZmlsZVVyaSk7CiAgICB9CgogICAgcmVzb2x2ZVJlZGlyZWN0aW5nRmFjdG9yeVRhcmdldHMoKTsKICAgIGZpbmlzaFZhcmlhYmxlTWV0YWRhdGEoKTsKICB9CgogIHZvaWQgcmVzb2x2ZVJlZGlyZWN0aW5nRmFjdG9yeVRhcmdldHMoKSB7CiAgICBmb3IgKFN0YXRpY0ludm9jYXRpb24gaW52b2NhdGlvbiBpbiByZWRpcmVjdGluZ0ZhY3RvcnlJbnZvY2F0aW9ucykgewogICAgICAvLyBJZiB0aGUgaW52b2NhdGlvbiB3YXMgaW52YWxpZCwgaXQgb3IgaXRzIHBhcmVudCBoYXMgYWxyZWFkeSBiZWVuCiAgICAgIC8vIGRlc3VnYXJlZCBpbnRvIGFuIGV4Y2VwdGlvbiB0aHJvd2luZyBleHByZXNzaW9uLiAgVGhlcmUgaXMgbm90aGluZyB0bwogICAgICAvLyByZXNvbHZlIGFueW1vcmUuICBOb3RlIHRoYXQgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIGludm9jYXRpb24ncyBwYXJlbnQKICAgICAgLy8gd2FzIGludmFsaWQsIHR5cGUgaW5mZXJlbmNlIHdvbid0IHJlYWNoIHRoZSBpbnZvY2F0aW9uIG5vZGUgYW5kIHdvbid0CiAgICAgIC8vIHNldCBpdHMgaW5mZXJyZWRUeXBlIGZpZWxkLiAgSWYgdHlwZSBpbmZlcmVuY2UgaXMgZGlzYWJsZWQsIHJlYWNoIHRvCiAgICAgIC8vIHRoZSBvdXR0ZXJtb3N0IHBhcmVudCB0byBjaGVjayBpZiB0aGUgbm9kZSBpcyBhIGRlYWQgY29kZS4KICAgICAgaWYgKGludm9jYXRpb24ucGFyZW50ID09IG51bGwpIGNvbnRpbnVlOwogICAgICBpZiAoX3R5cGVJbmZlcnJlciAhPSBudWxsKSB7CiAgICAgICAgaWYgKGludm9jYXRpb24gaXMgRmFjdG9yeUNvbnN0cnVjdG9ySW52b2NhdGlvbkp1ZGdtZW50ICYmCiAgICAgICAgICAgIGludm9jYXRpb24uaW5mZXJyZWRUeXBlID09IG51bGwpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBUcmVlTm9kZSBwYXJlbnQgPSBpbnZvY2F0aW9uLnBhcmVudDsKICAgICAgICB3aGlsZSAocGFyZW50IGlzISBDb21wb25lbnQgJiYgcGFyZW50ICE9IG51bGwpIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSBjb250aW51ZTsKICAgICAgfQoKICAgICAgUHJvY2VkdXJlIGluaXRpYWxUYXJnZXQgPSBpbnZvY2F0aW9uLnRhcmdldDsKICAgICAgRXhwcmVzc2lvbiByZXBsYWNlbWVudE5vZGU7CgogICAgICBSZWRpcmVjdGlvblRhcmdldCByZWRpcmVjdGlvblRhcmdldCA9CiAgICAgICAgICBnZXRSZWRpcmVjdGlvblRhcmdldChpbml0aWFsVGFyZ2V0LCBsZWdhY3lNb2RlOiBsZWdhY3lNb2RlKTsKICAgICAgTWVtYmVyIHJlc29sdmVkVGFyZ2V0ID0gcmVkaXJlY3Rpb25UYXJnZXQ/LnRhcmdldDsKCiAgICAgIGlmIChyZXNvbHZlZFRhcmdldCA9PSBudWxsKSB7CiAgICAgICAgU3RyaW5nIG5hbWUgPSBjb25zdHJ1Y3Rvck5hbWVGb3JEaWFnbm9zdGljcyhpbml0aWFsVGFyZ2V0Lm5hbWUubmFtZSwKICAgICAgICAgICAgY2xhc3NOYW1lOiBpbml0aWFsVGFyZ2V0LmVuY2xvc2luZ0NsYXNzLm5hbWUpOwogICAgICAgIC8vIFRPRE8oZG1pdHJ5YXMpOiBSZXBvcnQgdGhpcyBlcnJvciBlYXJsaWVyLgogICAgICAgIHJlcGxhY2VtZW50Tm9kZSA9IGRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKGJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVDeWNsaWNSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnMKICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICBpbml0aWFsVGFyZ2V0LmZpbGVPZmZzZXQsCiAgICAgICAgICAgIG5hbWUubGVuZ3RoKSk7CiAgICAgIH0gZWxzZSBpZiAocmVzb2x2ZWRUYXJnZXQgaXMgQ29uc3RydWN0b3IgJiYKICAgICAgICAgIHJlc29sdmVkVGFyZ2V0LmVuY2xvc2luZ0NsYXNzLmlzQWJzdHJhY3QpIHsKICAgICAgICByZXBsYWNlbWVudE5vZGUgPSBldmFsdWF0ZUFyZ3VtZW50c0JlZm9yZSgKICAgICAgICAgICAgZm9yZXN0LmFyZ3VtZW50cyhpbnZvY2F0aW9uLmFyZ3VtZW50cy5wb3NpdGlvbmFsLCBudWxsLAogICAgICAgICAgICAgICAgdHlwZXM6IGludm9jYXRpb24uYXJndW1lbnRzLnR5cGVzLAogICAgICAgICAgICAgICAgbmFtZWQ6IGludm9jYXRpb24uYXJndW1lbnRzLm5hbWVkKSwKICAgICAgICAgICAgYnVpbGRBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVBYnN0cmFjdFJlZGlyZWN0ZWRDbGFzc0luc3RhbnRpYXRpb24KICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhyZXNvbHZlZFRhcmdldC5lbmNsb3NpbmdDbGFzcy5uYW1lKSwKICAgICAgICAgICAgICAgIHJlc29sdmVkVGFyZ2V0LmVuY2xvc2luZ0NsYXNzLm5hbWUsCiAgICAgICAgICAgICAgICBpbml0aWFsVGFyZ2V0LmZpbGVPZmZzZXQpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5IHJlZGlyZWN0aW5nRmFjdG9yeUJvZHkgPQogICAgICAgICAgICBnZXRSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KHJlc29sdmVkVGFyZ2V0KTsKICAgICAgICBpZiAocmVkaXJlY3RpbmdGYWN0b3J5Qm9keSAhPSBudWxsKSB7CiAgICAgICAgICAvLyBJZiB0aGUgcmVkaXJlY3Rpb24gdGFyZ2V0IGlzIGl0c2VsZiBhIHJlZGlyZWN0aW5nIGZhY3RvcnksIGl0IG1lYW5zCiAgICAgICAgICAvLyB0aGF0IGl0IGlzIHVucmVzb2x2ZWQuCiAgICAgICAgICBhc3NlcnQocmVkaXJlY3RpbmdGYWN0b3J5Qm9keS5pc1VucmVzb2x2ZWQpOwogICAgICAgICAgU3RyaW5nIGVycm9yTmFtZSA9IHJlZGlyZWN0aW5nRmFjdG9yeUJvZHkudW5yZXNvbHZlZE5hbWU7CgogICAgICAgICAgcmVwbGFjZW1lbnROb2RlID0gdGhyb3dOb1N1Y2hNZXRob2RFcnJvcigKICAgICAgICAgICAgICBmb3Jlc3QubGl0ZXJhbE51bGwobnVsbCkuLmZpbGVPZmZzZXQgPSBpbnZvY2F0aW9uLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgZXJyb3JOYW1lLAogICAgICAgICAgICAgIGZvcmVzdC5hcmd1bWVudHMoaW52b2NhdGlvbi5hcmd1bWVudHMucG9zaXRpb25hbCwgbnVsbCwKICAgICAgICAgICAgICAgICAgdHlwZXM6IGludm9jYXRpb24uYXJndW1lbnRzLnR5cGVzLAogICAgICAgICAgICAgICAgICBuYW1lZDogaW52b2NhdGlvbi5hcmd1bWVudHMubmFtZWQpLAogICAgICAgICAgICAgIGluaXRpYWxUYXJnZXQuZmlsZU9mZnNldCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKAogICAgICAgICAgICAgIGluaXRpYWxUYXJnZXQuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgaW52b2NhdGlvbi5hcmd1bWVudHMudHlwZXMpOwogICAgICAgICAgaW52b2NhdGlvbi5hcmd1bWVudHMudHlwZXMuY2xlYXIoKTsKICAgICAgICAgIGludm9jYXRpb24uYXJndW1lbnRzLnR5cGVzLmxlbmd0aCA9CiAgICAgICAgICAgICAgcmVkaXJlY3Rpb25UYXJnZXQudHlwZUFyZ3VtZW50cy5sZW5ndGg7CiAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludm9jYXRpb24uYXJndW1lbnRzLnR5cGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGludm9jYXRpb24uYXJndW1lbnRzLnR5cGVzW2ldID0KICAgICAgICAgICAgICAgIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShyZWRpcmVjdGlvblRhcmdldC50eXBlQXJndW1lbnRzW2ldKTsKICAgICAgICAgIH0KCiAgICAgICAgICByZXBsYWNlbWVudE5vZGUgPSBidWlsZFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgICAgICAgcmVzb2x2ZWRUYXJnZXQsCiAgICAgICAgICAgICAgZm9yZXN0LmFyZ3VtZW50cyhpbnZvY2F0aW9uLmFyZ3VtZW50cy5wb3NpdGlvbmFsLCBudWxsLAogICAgICAgICAgICAgICAgICB0eXBlczogaW52b2NhdGlvbi5hcmd1bWVudHMudHlwZXMsCiAgICAgICAgICAgICAgICAgIG5hbWVkOiBpbnZvY2F0aW9uLmFyZ3VtZW50cy5uYW1lZCksCiAgICAgICAgICAgICAgY29uc3RuZXNzOiBpbnZvY2F0aW9uLmlzQ29uc3QKICAgICAgICAgICAgICAgICAgPyBDb25zdG5lc3MuZXhwbGljaXRDb25zdAogICAgICAgICAgICAgICAgICA6IENvbnN0bmVzcy5leHBsaWNpdE5ldywKICAgICAgICAgICAgICBjaGFyT2Zmc2V0OiBpbnZvY2F0aW9uLmZpbGVPZmZzZXQpOwogICAgICAgICAgLy8gVE9ETyhkbWl0cnlhcyk6IEZpbmQgYSBiZXR0ZXIgd2F5IHRvIHVud3JhcAogICAgICAgICAgLy8gW1N5bnRoZXRpY0V4cHJlc3Npb25KdWRnbWVudF0gb3Igbm90IHRvIGJ1aWxkIGl0IGluIHRoZSBmaXJzdCBwbGFjZQogICAgICAgICAgLy8gd2hlbiBpdCdzIG5vdCBuZWVkZWQuCiAgICAgICAgICBpZiAocmVwbGFjZW1lbnROb2RlIGlzIHNoYWRvdy5TeW50aGV0aWNFeHByZXNzaW9uSnVkZ21lbnQpIHsKICAgICAgICAgICAgcmVwbGFjZW1lbnROb2RlID0gZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24ocmVwbGFjZW1lbnROb2RlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGludm9jYXRpb24ucmVwbGFjZVdpdGgocmVwbGFjZW1lbnROb2RlKTsKICAgIH0KICAgIHJlZGlyZWN0aW5nRmFjdG9yeUludm9jYXRpb25zLmNsZWFyKCk7CiAgfQoKICB2b2lkIGZpbmlzaFZhcmlhYmxlTWV0YWRhdGEoKSB7CiAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlc1dpdGhNZXRhZGF0YSA9CiAgICAgICAgdGhpcy52YXJpYWJsZXNXaXRoTWV0YWRhdGE7CiAgICB0aGlzLnZhcmlhYmxlc1dpdGhNZXRhZGF0YSA9IG51bGw7CiAgICBMaXN0PExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4+IG11bHRpVmFyaWFibGVzV2l0aE1ldGFkYXRhID0KICAgICAgICB0aGlzLm11bHRpVmFyaWFibGVzV2l0aE1ldGFkYXRhOwogICAgdGhpcy5tdWx0aVZhcmlhYmxlc1dpdGhNZXRhZGF0YSA9IG51bGw7CgogICAgaWYgKHZhcmlhYmxlc1dpdGhNZXRhZGF0YSAhPSBudWxsKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFyaWFibGVzV2l0aE1ldGFkYXRhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaW5mZXJBbm5vdGF0aW9ucyh2YXJpYWJsZXNXaXRoTWV0YWRhdGFbaV0uYW5ub3RhdGlvbnMpOwogICAgICB9CiAgICB9CiAgICBpZiAobXVsdGlWYXJpYWJsZXNXaXRoTWV0YWRhdGEgIT0gbnVsbCkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IG11bHRpVmFyaWFibGVzV2l0aE1ldGFkYXRhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXMgPSBtdWx0aVZhcmlhYmxlc1dpdGhNZXRhZGF0YVtpXTsKICAgICAgICBMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zID0gdmFyaWFibGVzLmZpcnN0LmFubm90YXRpb25zOwogICAgICAgIGluZmVyQW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOwogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgdmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBjbG9uZXIgPz89IG5ldyBDbG9uZVZpc2l0b3IoKTsKICAgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSB2YXJpYWJsZXNbaV07CiAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhcmlhYmxlLmFkZEFubm90YXRpb24oY2xvbmVyLmNsb25lKGFubm90YXRpb25zW2ldKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PEV4cHJlc3Npb24+IGZpbmlzaE1ldGFkYXRhKFRyZWVOb2RlIHBhcmVudCkgewogICAgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyA9IHBvcCgpOwogICAgaW5mZXJBbm5vdGF0aW9ucyhleHByZXNzaW9ucyk7CgogICAgLy8gVGhlIGludm9jYXRpb24gb2YgW3Jlc29sdmVSZWRpcmVjdGluZ0ZhY3RvcnlUYXJnZXRzXSBiZWxvdyBtYXkgY2hhbmdlIHRoZQogICAgLy8gcm9vdCBub2RlcyBvZiB0aGUgYW5ub3RhdGlvbiBleHByZXNzaW9ucy4gIFdlIG5lZWQgdG8gaGF2ZSBhIHBhcmVudCBvZgogICAgLy8gdGhlIGFubm90YXRpb24gbm9kZXMgYmVmb3JlIHRoZSByZXNvbHV0aW9uIGlzIHBlcmZvcm1lZCwgdG8gY29sbGVjdCBhbmQKICAgIC8vIHJldHVybiB0aGVtIGxhdGVyLiAgSWYgW3BhcmVudF0gaXMgbm90IHByb3ZpZGVkLCBbdGVtcG9yYXJ5UGFyZW50XSBpcwogICAgLy8gdXNlZC4KICAgIExpc3RMaXRlcmFsIHRlbXBvcmFyeVBhcmVudDsKCiAgICBpZiAocGFyZW50IGlzIENsYXNzKSB7CiAgICAgIGZvciAoRXhwcmVzc2lvbiBleHByZXNzaW9uIGluIGV4cHJlc3Npb25zKSB7CiAgICAgICAgcGFyZW50LmFkZEFubm90YXRpb24oZXhwcmVzc2lvbik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocGFyZW50IGlzIExpYnJhcnkpIHsKICAgICAgZm9yIChFeHByZXNzaW9uIGV4cHJlc3Npb24gaW4gZXhwcmVzc2lvbnMpIHsKICAgICAgICBwYXJlbnQuYWRkQW5ub3RhdGlvbihleHByZXNzaW9uKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChwYXJlbnQgaXMgTGlicmFyeURlcGVuZGVuY3kpIHsKICAgICAgZm9yIChFeHByZXNzaW9uIGV4cHJlc3Npb24gaW4gZXhwcmVzc2lvbnMpIHsKICAgICAgICBwYXJlbnQuYWRkQW5ub3RhdGlvbihleHByZXNzaW9uKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChwYXJlbnQgaXMgTGlicmFyeVBhcnQpIHsKICAgICAgZm9yIChFeHByZXNzaW9uIGV4cHJlc3Npb24gaW4gZXhwcmVzc2lvbnMpIHsKICAgICAgICBwYXJlbnQuYWRkQW5ub3RhdGlvbihleHByZXNzaW9uKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChwYXJlbnQgaXMgTWVtYmVyKSB7CiAgICAgIGZvciAoRXhwcmVzc2lvbiBleHByZXNzaW9uIGluIGV4cHJlc3Npb25zKSB7CiAgICAgICAgcGFyZW50LmFkZEFubm90YXRpb24oZXhwcmVzc2lvbik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocGFyZW50IGlzIFR5cGVkZWYpIHsKICAgICAgZm9yIChFeHByZXNzaW9uIGV4cHJlc3Npb24gaW4gZXhwcmVzc2lvbnMpIHsKICAgICAgICBwYXJlbnQuYWRkQW5ub3RhdGlvbihleHByZXNzaW9uKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChwYXJlbnQgaXMgVHlwZVBhcmFtZXRlcikgewogICAgICBmb3IgKEV4cHJlc3Npb24gZXhwcmVzc2lvbiBpbiBleHByZXNzaW9ucykgewogICAgICAgIHBhcmVudC5hZGRBbm5vdGF0aW9uKGV4cHJlc3Npb24pOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHBhcmVudCBpcyBWYXJpYWJsZURlY2xhcmF0aW9uKSB7CiAgICAgIGZvciAoRXhwcmVzc2lvbiBleHByZXNzaW9uIGluIGV4cHJlc3Npb25zKSB7CiAgICAgICAgcGFyZW50LmFkZEFubm90YXRpb24oZXhwcmVzc2lvbik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRlbXBvcmFyeVBhcmVudCA9IG5ldyBMaXN0TGl0ZXJhbChleHByZXNzaW9ucyk7CiAgICB9CiAgICByZXNvbHZlUmVkaXJlY3RpbmdGYWN0b3J5VGFyZ2V0cygpOwogICAgZmluaXNoVmFyaWFibGVNZXRhZGF0YSgpOwogICAgcmV0dXJuIHRlbXBvcmFyeVBhcmVudCAhPSBudWxsID8gdGVtcG9yYXJ5UGFyZW50LmV4cHJlc3Npb25zIDogZXhwcmVzc2lvbnM7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIHBhcnNlU2luZ2xlRXhwcmVzc2lvbigKICAgICAgUGFyc2VyIHBhcnNlciwgVG9rZW4gdG9rZW4sIEZ1bmN0aW9uTm9kZSBwYXJhbWV0ZXJzKSB7CiAgICBMaXN0PEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVQYXJhbWV0ZXJCdWlsZGVyczsKICAgIGZvciAoVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyIGluIHBhcmFtZXRlcnMudHlwZVBhcmFtZXRlcnMpIHsKICAgICAgdHlwZVBhcmFtZXRlckJ1aWxkZXJzID8/PSA8S2VybmVsVHlwZVZhcmlhYmxlQnVpbGRlcj5bXTsKICAgICAgdHlwZVBhcmFtZXRlckJ1aWxkZXJzLmFkZCgKICAgICAgICAgIG5ldyBLZXJuZWxUeXBlVmFyaWFibGVCdWlsZGVyLmZyb21LZXJuZWwodHlwZVBhcmFtZXRlciwgbGlicmFyeSkpOwogICAgfQogICAgZW50ZXJGdW5jdGlvblR5cGVTY29wZSh0eXBlUGFyYW1ldGVyQnVpbGRlcnMpOwoKICAgIExpc3Q8S2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscyA9CiAgICAgICAgcGFyYW1ldGVycy5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGggPT0gMAogICAgICAgICAgICA/IG51bGwKICAgICAgICAgICAgOiBuZXcgTGlzdDxLZXJuZWxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPigKICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGZvcm1hbCA9IHBhcmFtZXRlcnMucG9zaXRpb25hbFBhcmFtZXRlcnNbaV07CiAgICAgIGZvcm1hbHNbaV0gPSBuZXcgS2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlcigKICAgICAgICAgIG51bGwsIDAsIG51bGwsIGZvcm1hbC5uYW1lLCBsaWJyYXJ5LCBmb3JtYWwuZmlsZU9mZnNldCkKICAgICAgICAuLmRlY2xhcmF0aW9uID0gZm9ybWFsOwogICAgfQogICAgZW50ZXJMb2NhbFNjb3BlKAogICAgICAgIG51bGwsCiAgICAgICAgbmV3IEZvcm1hbFBhcmFtZXRlcnMoZm9ybWFscywgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBub0xlbmd0aCwgdXJpKQogICAgICAgICAgICAuY29tcHV0ZUZvcm1hbFBhcmFtZXRlclNjb3BlKHNjb3BlLCBtZW1iZXIsIHRoaXMpKTsKCiAgICB0b2tlbiA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24ocGFyc2VyLnN5bnRoZXRpY1ByZXZpb3VzVG9rZW4odG9rZW4pKTsKCiAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBwb3BGb3JWYWx1ZSgpOwogICAgVG9rZW4gZW9mID0gdG9rZW4ubmV4dDsKCiAgICBpZiAoIWVvZi5pc0VvZikgewogICAgICBleHByZXNzaW9uID0gd3JhcEluTG9jYXRlZFByb2JsZW0oCiAgICAgICAgICBleHByZXNzaW9uLAogICAgICAgICAgZmFzdGEubWVzc2FnZUV4cGVjdGVkT25lRXhwcmVzc2lvbgogICAgICAgICAgICAgIC53aXRoTG9jYXRpb24odXJpLCBlb2YuY2hhck9mZnNldCwgZW9mLmxlbmd0aCkpOwogICAgfQoKICAgIFJldHVybkp1ZGdtZW50IGZha2VSZXR1cm4gPSBuZXcgUmV0dXJuSnVkZ21lbnQobnVsbCwgZXhwcmVzc2lvbik7CgogICAgX3R5cGVJbmZlcnJlcj8uaW5mZXJGdW5jdGlvbkJvZHkoCiAgICAgICAgdGhpcywgY29uc3QgRHluYW1pY1R5cGUoKSwgQXN5bmNNYXJrZXIuU3luYywgZmFrZVJldHVybik7CgogICAgcmV0dXJuIGZha2VSZXR1cm4uZXhwcmVzc2lvbjsKICB9CgogIEV4cHJlc3Npb24gcGFyc2VGaWVsZEluaXRpYWxpemVyKFRva2VuIHRva2VuKSB7CiAgICBQYXJzZXIgcGFyc2VyID0gbmV3IFBhcnNlcih0aGlzKTsKICAgIHRva2VuID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbihwYXJzZXIuc3ludGhldGljUHJldmlvdXNUb2tlbih0b2tlbikpOwogICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcG9wRm9yVmFsdWUoKTsKICAgIGNoZWNrRW1wdHkodG9rZW4uY2hhck9mZnNldCk7CiAgICByZXR1cm4gZXhwcmVzc2lvbjsKICB9CgogIHZvaWQgZmluaXNoQ29uc3RydWN0b3IoCiAgICAgIEtlcm5lbENvbnN0cnVjdG9yQnVpbGRlciBidWlsZGVyLCBBc3luY01hcmtlciBhc3luY01vZGlmaWVyKSB7CiAgICAvLy8gUXVvdGVzIGJlbG93IGFyZSBmcm9tIFtEYXJ0IFByb2dyYW1taW5nIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIDR0aAogICAgLy8vIEVkaXRpb25dKAogICAgLy8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvZmlsZXMvRUNNQS1TVC9FQ01BLTQwOC5wZGYpLgogICAgYXNzZXJ0KGJ1aWxkZXIgPT0gbWVtYmVyKTsKICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gYnVpbGRlci5jb25zdHJ1Y3RvcjsKICAgIGlmIChhc3luY01vZGlmaWVyICE9IEFzeW5jTWFya2VyLlN5bmMpIHsKICAgICAgLy8gVE9ETyhhaGUpOiBDaGFuZ2UgdGhpcyB0byBhIG51bGwgY2hlY2suCiAgICAgIGludCBvZmZzZXQgPSBidWlsZGVyLmJvZHk/LmZpbGVPZmZzZXQgPz8gYnVpbGRlci5jaGFyT2Zmc2V0OwogICAgICBjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnMuYWRkKGJ1aWxkSW52YWxpZEluaXRpYWxpemVyKAogICAgICAgICAgZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oCiAgICAgICAgICAgICAgYnVpbGRQcm9ibGVtKGZhc3RhLm1lc3NhZ2VDb25zdHJ1Y3Rvck5vdFN5bmMsIG9mZnNldCwgbm9MZW5ndGgpKSwKICAgICAgICAgIG9mZnNldCkpOwogICAgfQogICAgaWYgKG5lZWRzSW1wbGljaXRTdXBlckluaXRpYWxpemVyKSB7CiAgICAgIC8vLyA+SWYgbm8gc3VwZXJpbml0aWFsaXplciBpcyBwcm92aWRlZCwgYW4gaW1wbGljaXQgc3VwZXJpbml0aWFsaXplcgogICAgICAvLy8gPm9mIHRoZSBmb3JtIHN1cGVyKCkgaXMgYWRkZWQgYXQgdGhlIGVuZCBvZiBr4oCZcyBpbml0aWFsaXplciBsaXN0LAogICAgICAvLy8gPnVubGVzcyB0aGUgZW5jbG9zaW5nIGNsYXNzIGlzIGNsYXNzIE9iamVjdC4KICAgICAgQ29uc3RydWN0b3Igc3VwZXJUYXJnZXQgPSBsb29rdXBDb25zdHJ1Y3RvcihlbXB0eU5hbWUsIGlzU3VwZXI6IHRydWUpOwogICAgICBJbml0aWFsaXplciBpbml0aWFsaXplcjsKICAgICAgQXJndW1lbnRzIGFyZ3VtZW50cyA9IGZvcmVzdC5hcmd1bWVudHNFbXB0eShub0xvY2F0aW9uKTsKICAgICAgaWYgKHN1cGVyVGFyZ2V0ID09IG51bGwgfHwKICAgICAgICAgIGNoZWNrQXJndW1lbnRzRm9yRnVuY3Rpb24oc3VwZXJUYXJnZXQuZnVuY3Rpb24sIGFyZ3VtZW50cywKICAgICAgICAgICAgICAgICAgYnVpbGRlci5jaGFyT2Zmc2V0LCBjb25zdCA8VHlwZVBhcmFtZXRlcj5bXSkgIT0KICAgICAgICAgICAgICBudWxsKSB7CiAgICAgICAgU3RyaW5nIHN1cGVyY2xhc3MgPSBjbGFzc0J1aWxkZXIuc3VwZXJ0eXBlLmZ1bGxOYW1lRm9yRXJyb3JzOwogICAgICAgIGludCBsZW5ndGggPSBjb25zdHJ1Y3Rvci5uYW1lLm5hbWUubGVuZ3RoOwogICAgICAgIGlmIChsZW5ndGggPT0gMCkgewogICAgICAgICAgbGVuZ3RoID0gKGNvbnN0cnVjdG9yLnBhcmVudCBhcyBDbGFzcykubmFtZS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGluaXRpYWxpemVyID0gYnVpbGRJbnZhbGlkSW5pdGlhbGl6ZXIoCiAgICAgICAgICAgIGRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKGJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgICAgIGZhc3RhLnRlbXBsYXRlU3VwZXJjbGFzc0hhc05vRGVmYXVsdENvbnN0cnVjdG9yCiAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoc3VwZXJjbGFzcyksCiAgICAgICAgICAgICAgICBidWlsZGVyLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICBsZW5ndGgpKSwKICAgICAgICAgICAgYnVpbGRlci5jaGFyT2Zmc2V0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbml0aWFsaXplciA9IGJ1aWxkU3VwZXJJbml0aWFsaXplcigKICAgICAgICAgICAgdHJ1ZSwgc3VwZXJUYXJnZXQsIGFyZ3VtZW50cywgYnVpbGRlci5jaGFyT2Zmc2V0KTsKICAgICAgfQogICAgICBjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnMuYWRkKGluaXRpYWxpemVyKTsKICAgIH0KICAgIHNldFBhcmVudHMoY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzLCBjb25zdHJ1Y3Rvcik7CiAgICBsaWJyYXJ5LmxvYWRlci50cmFuc2Zvcm1MaXN0UG9zdEluZmVyZW5jZSgKICAgICAgICBjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnMsIHRyYW5zZm9ybVNldExpdGVyYWxzLCB0cmFuc2Zvcm1Db2xsZWN0aW9ucyk7CiAgICBpZiAoY29uc3RydWN0b3IuZnVuY3Rpb24uYm9keSA9PSBudWxsKSB7CiAgICAgIC8vLyA+SWYgYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yIGMgaXMgbm90IGEgcmVkaXJlY3RpbmcgY29uc3RydWN0b3IKICAgICAgLy8vID5hbmQgbm8gYm9keSBpcyBwcm92aWRlZCwgdGhlbiBjIGltcGxpY2l0bHkgaGFzIGFuIGVtcHR5IGJvZHkge30uCiAgICAgIC8vLyBXZSB1c2UgYW4gZW1wdHkgc3RhdGVtZW50IGluc3RlYWQuCiAgICAgIGNvbnN0cnVjdG9yLmZ1bmN0aW9uLmJvZHkgPSBuZXcgRW1wdHlTdGF0ZW1lbnQoKTsKICAgICAgY29uc3RydWN0b3IuZnVuY3Rpb24uYm9keS5wYXJlbnQgPSBjb25zdHJ1Y3Rvci5mdW5jdGlvbjsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRXhwcmVzc2lvblN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiRXhwcmVzc2lvblN0YXRlbWVudCIpOwogICAgcHVzaChmb3Jlc3QuZXhwcmVzc2lvblN0YXRlbWVudChwb3BGb3JFZmZlY3QoKSwgdG9rZW4pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQXJndW1lbnRzKGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkFyZ3VtZW50cyIpOwogICAgTGlzdDxPYmplY3Q+IGFyZ3VtZW50cyA9IGNvdW50ID09IDAKICAgICAgICA/IDxPYmplY3Q+W10KICAgICAgICA6IGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PE9iamVjdD4oKS5wb3Aoc3RhY2ssIGNvdW50KTsKICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCkgewogICAgICBwdXNoKG5ldyBQYXJzZXJSZWNvdmVyeShiZWdpblRva2VuLmNoYXJPZmZzZXQpKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaW50IGZpcnN0TmFtZWRBcmd1bWVudEluZGV4ID0gYXJndW1lbnRzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIE9iamVjdCBub2RlID0gYXJndW1lbnRzW2ldOwogICAgICBpZiAobm9kZSBpcyBOYW1lZEV4cHJlc3Npb24pIHsKICAgICAgICBmaXJzdE5hbWVkQXJndW1lbnRJbmRleCA9CiAgICAgICAgICAgIGkgPCBmaXJzdE5hbWVkQXJndW1lbnRJbmRleCA/IGkgOiBmaXJzdE5hbWVkQXJndW1lbnRJbmRleDsKICAgICAgfSBlbHNlIHsKICAgICAgICBFeHByZXNzaW9uIGFyZ3VtZW50ID0gdG9WYWx1ZShub2RlKTsKICAgICAgICBhcmd1bWVudHNbaV0gPSBhcmd1bWVudDsKICAgICAgICBpZiAoaSA+IGZpcnN0TmFtZWRBcmd1bWVudEluZGV4KSB7CiAgICAgICAgICBhcmd1bWVudHNbaV0gPSBuZXcgTmFtZWRFeHByZXNzaW9uKAogICAgICAgICAgICAgICIjJGkiLAogICAgICAgICAgICAgIGJ1aWxkUHJvYmxlbShmYXN0YS5tZXNzYWdlRXhwZWN0ZWROYW1lZEFyZ3VtZW50LAogICAgICAgICAgICAgICAgICBmb3Jlc3QucmVhZE9mZnNldChhcmd1bWVudCksIG5vTGVuZ3RoKSkKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGZpcnN0TmFtZWRBcmd1bWVudEluZGV4IDwgYXJndW1lbnRzLmxlbmd0aCkgewogICAgICBMaXN0PEV4cHJlc3Npb24+IHBvc2l0aW9uYWwgPSBuZXcgTGlzdDxFeHByZXNzaW9uPi5mcm9tKAogICAgICAgICAgYXJndW1lbnRzLmdldFJhbmdlKDAsIGZpcnN0TmFtZWRBcmd1bWVudEluZGV4KSk7CiAgICAgIExpc3Q8TmFtZWRFeHByZXNzaW9uPiBuYW1lZCA9IG5ldyBMaXN0PE5hbWVkRXhwcmVzc2lvbj4uZnJvbSgKICAgICAgICAgIGFyZ3VtZW50cy5nZXRSYW5nZShmaXJzdE5hbWVkQXJndW1lbnRJbmRleCwgYXJndW1lbnRzLmxlbmd0aCkpOwogICAgICBwdXNoKGZvcmVzdC5hcmd1bWVudHMocG9zaXRpb25hbCwgYmVnaW5Ub2tlbiwgbmFtZWQ6IG5hbWVkKSk7CiAgICB9IGVsc2UgewogICAgICAvLyBUT0RPKGttaWxsaWtpbik6IEZpbmQgYSB3YXkgdG8gYXZvaWQgYWxsb2NhdGluZyBhIHNlY29uZCBsaXN0IGluIHRoZQogICAgICAvLyBjYXNlIHdoZXJlIHRoZXJlIHdlcmUgbm8gbmFtZWQgYXJndW1lbnRzLCB3aGljaCBpcyBhIGNvbW1vbiBvbmUuCiAgICAgIHB1c2goZm9yZXN0LmFyZ3VtZW50cyhuZXcgTGlzdDxFeHByZXNzaW9uPi5mcm9tKGFyZ3VtZW50cyksIGJlZ2luVG9rZW4pKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlUGFyZW50aGVzaXplZENvbmRpdGlvbihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiUGFyZW50aGVzaXplZENvbmRpdGlvbiIpOwogICAgcHVzaChmb3Jlc3QucGFyZW50aGVzaXplZENvbmRpdGlvbih0b2tlbiwgcG9wRm9yVmFsdWUoKSwgdG9rZW4uZW5kR3JvdXApKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlUGFyZW50aGVzaXplZEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIik7CiAgICBFeHByZXNzaW9uIHZhbHVlID0gcG9wRm9yVmFsdWUoKTsKICAgIGlmICh2YWx1ZSBpcyBTaGFkb3dMYXJnZUludExpdGVyYWwpIHsKICAgICAgLy8gV2UgbmVlZCB0byBrbm93IHRoYXQgdGhlIGV4cHJlc3Npb24gd2FzIHBhcmVudGhlc2l6ZWQgYmVjYXVzZSB3ZSB3aWxsCiAgICAgIC8vIHRyZWF0IC1uIGRpZmZlcmVudGx5IGZyb20gLShuKS4gIElmIHRoZSBleHByZXNzaW9uIG9jY3VycyBpbiBhIGRvdWJsZQogICAgICAvLyBjb250ZXh0LCAtbiBpcyBhIGRvdWJsZSBsaXRlcmFsIGFuZCAtKG4pIGlzIGFuIGFwcGxpY2F0aW9uIG9mIHVuYXJ5LSB0bwogICAgICAvLyBhbiBpbnRlZ2VyIGxpdGVyYWwuICBBbmQgaW4gYW55IG90aGVyIGNvbnRleHQsICctJyBpcyBwYXJ0IG9mIHRoZQogICAgICAvLyBzeW50YXggb2YgLW4sIGkuZS4sIC05MjIzMzcyMDM2ODU0Nzc1ODA4IGlzIE9LIGFuZCBpdCBpcyB0aGUgbWluaW11bQogICAgICAvLyA2NC1iaXQgaW50ZWdlciwgYW5kICctJyBpcyBhbiBhcHBsaWNhdGlvbiBvZiB1bmFyeS0gaW4gLShuKSwgaS5lLiwKICAgICAgLy8gLSg5MjIzMzcyMDM2ODU0Nzc1ODA4KSBpcyBhbiBlcnJvciBiZWNhdXNlIHRoZSBsaXRlcmFsIGRvZXMgbm90IGZpdCBpbgogICAgICAvLyA2NC1iaXRzLgogICAgICBwdXNoKHZhbHVlLi5pc1BhcmVudGhlc2l6ZWQgPSB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2gobmV3IFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uR2VuZXJhdG9yKHRoaXMsIHRva2VuLmVuZEdyb3VwLCB2YWx1ZSkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTZW5kKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJTZW5kIik7CiAgICBBcmd1bWVudHMgYXJndW1lbnRzID0gcG9wKCk7CiAgICBMaXN0PFVucmVzb2x2ZWRUeXBlPEtlcm5lbFR5cGVCdWlsZGVyPj4gdHlwZUFyZ3VtZW50cyA9IHBvcCgpOwogICAgT2JqZWN0IHJlY2VpdmVyID0gcG9wKCk7CiAgICBpZiAoYXJndW1lbnRzICE9IG51bGwgJiYgdHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGFzc2VydChmb3Jlc3QuYXJndW1lbnRzVHlwZUFyZ3VtZW50cyhhcmd1bWVudHMpLmlzRW1wdHkpOwogICAgICBmb3Jlc3QuYXJndW1lbnRzU2V0VHlwZUFyZ3VtZW50cygKICAgICAgICAgIGFyZ3VtZW50cywgYnVpbGREYXJ0VHlwZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRzKSk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQodHlwZUFyZ3VtZW50cyA9PSBudWxsKTsKICAgIH0KICAgIGlmIChyZWNlaXZlciBpcyBJZGVudGlmaWVyKSB7CiAgICAgIE5hbWUgbmFtZSA9IG5ldyBOYW1lKHJlY2VpdmVyLm5hbWUsIGxpYnJhcnkubGlicmFyeSk7CiAgICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCkgewogICAgICAgIHB1c2gobmV3IEluY29tcGxldGVQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcih0aGlzLCBiZWdpblRva2VuLCBuYW1lKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHVzaChuZXcgU2VuZEFjY2Vzc0dlbmVyYXRvcigKICAgICAgICAgICAgdGhpcywgYmVnaW5Ub2tlbiwgbmFtZSwgZm9yZXN0LmNhc3RBcmd1bWVudHMoYXJndW1lbnRzKSkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cyA9PSBudWxsKSB7CiAgICAgIHB1c2gocmVjZWl2ZXIpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChmaW5pc2hTZW5kKHJlY2VpdmVyLCBhcmd1bWVudHMsIGJlZ2luVG9rZW4uY2hhck9mZnNldCkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgZmluaXNoU2VuZChPYmplY3QgcmVjZWl2ZXIsIEFyZ3VtZW50cyBhcmd1bWVudHMsIGludCBjaGFyT2Zmc2V0KSB7CiAgICBpZiAocmVjZWl2ZXIgaXMgR2VuZXJhdG9yKSB7CiAgICAgIHJldHVybiByZWNlaXZlci5kb0ludm9jYXRpb24oY2hhck9mZnNldCwgYXJndW1lbnRzKTsKICAgIH0gZWxzZSBpZiAocmVjZWl2ZXIgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcmV0dXJuIG5ldyBQYXJzZXJFcnJvckdlbmVyYXRvcih0aGlzLCBudWxsLCBmYXN0YS5tZXNzYWdlU3ludGhldGljVG9rZW4pOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGJ1aWxkTWV0aG9kSW52b2NhdGlvbigKICAgICAgICAgIHRvVmFsdWUocmVjZWl2ZXIpLCBjYWxsTmFtZSwgYXJndW1lbnRzLCBjaGFyT2Zmc2V0LAogICAgICAgICAgaXNJbXBsaWNpdENhbGw6IHRydWUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkNhc2NhZGUoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luQ2FzY2FkZSIpOwogICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcG9wRm9yVmFsdWUoKTsKICAgIGlmIChleHByZXNzaW9uIGlzIENhc2NhZGVKdWRnbWVudCkgewogICAgICBwdXNoKGV4cHJlc3Npb24pOwogICAgICBwdXNoKG5ldyBWYXJpYWJsZVVzZUdlbmVyYXRvcih0aGlzLCB0b2tlbiwgZXhwcmVzc2lvbi52YXJpYWJsZSkpOwogICAgICBleHByZXNzaW9uLmV4dGVuZCgpOwogICAgfSBlbHNlIHsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQuZm9yVmFsdWUoCiAgICAgICAgICBleHByZXNzaW9uLCBmdW5jdGlvbk5lc3RpbmdMZXZlbCkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBleHByZXNzaW9uLmZpbGVPZmZzZXQ7CiAgICAgIHB1c2gobmV3IENhc2NhZGVKdWRnbWVudCh2YXJpYWJsZSkuLmZpbGVPZmZzZXQgPSBleHByZXNzaW9uLmZpbGVPZmZzZXQpOwogICAgICBwdXNoKG5ldyBWYXJpYWJsZVVzZUdlbmVyYXRvcih0aGlzLCB0b2tlbiwgdmFyaWFibGUpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ2FzY2FkZSgpIHsKICAgIGRlYnVnRXZlbnQoImVuZENhc2NhZGUiKTsKICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBvcEZvckVmZmVjdCgpOwogICAgQ2FzY2FkZUp1ZGdtZW50IGNhc2NhZGVSZWNlaXZlciA9IHBvcCgpOwogICAgY2FzY2FkZVJlY2VpdmVyLmZpbmFsaXplKGV4cHJlc3Npb24pOwogICAgcHVzaChjYXNjYWRlUmVjZWl2ZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkNhc2VFeHByZXNzaW9uKFRva2VuIGNhc2VLZXl3b3JkKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkNhc2VFeHByZXNzaW9uIik7CiAgICBzdXBlci5wdXNoKGNvbnN0YW50Q29udGV4dCk7CiAgICBjb25zdGFudENvbnRleHQgPSBDb25zdGFudENvbnRleHQuaW5mZXJyZWQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENhc2VFeHByZXNzaW9uKFRva2VuIGNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRDYXNlRXhwcmVzc2lvbiIpOwogICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcG9wRm9yVmFsdWUoKTsKICAgIGNvbnN0YW50Q29udGV4dCA9IHBvcCgpOwogICAgc3VwZXIucHVzaChleHByZXNzaW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5CaW5hcnlFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBpZiAob3B0aW9uYWwoIiYmIiwgdG9rZW4pIHx8IG9wdGlvbmFsKCJ8fCIsIHRva2VuKSkgewogICAgICBFeHByZXNzaW9uIGxocyA9IHBvcEZvclZhbHVlKCk7CiAgICAgIHR5cGVQcm9tb3Rlcj8uZW50ZXJMb2dpY2FsRXhwcmVzc2lvbihsaHMsIHRva2VuLnN0cmluZ1ZhbHVlKTsKICAgICAgcHVzaChsaHMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRCaW5hcnlFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJCaW5hcnlFeHByZXNzaW9uIik7CiAgICBpZiAob3B0aW9uYWwoIi4iLCB0b2tlbikgfHwgb3B0aW9uYWwoIi4uIiwgdG9rZW4pKSB7CiAgICAgIHJldHVybiBkb0RvdE9yQ2FzY2FkZUV4cHJlc3Npb24odG9rZW4pOwogICAgfQogICAgaWYgKG9wdGlvbmFsKCImJiIsIHRva2VuKSB8fCBvcHRpb25hbCgifHwiLCB0b2tlbikpIHsKICAgICAgcmV0dXJuIGRvTG9naWNhbEV4cHJlc3Npb24odG9rZW4pOwogICAgfQogICAgaWYgKG9wdGlvbmFsKCI/PyIsIHRva2VuKSkgcmV0dXJuIGRvSWZOdWxsKHRva2VuKTsKICAgIGlmIChvcHRpb25hbCgiPy4iLCB0b2tlbikpIHJldHVybiBkb0lmTm90TnVsbCh0b2tlbik7CiAgICBFeHByZXNzaW9uIGFyZ3VtZW50ID0gcG9wRm9yVmFsdWUoKTsKICAgIE9iamVjdCByZWNlaXZlciA9IHBvcCgpOwogICAgYm9vbCBpc1N1cGVyID0gZmFsc2U7CiAgICBpZiAocmVjZWl2ZXIgaXMgVGhpc0FjY2Vzc0dlbmVyYXRvciAmJiByZWNlaXZlci5pc1N1cGVyKSB7CiAgICAgIFRoaXNBY2Nlc3NHZW5lcmF0b3IgdGhpc0FjY2Vzc29yUmVjZWl2ZXIgPSByZWNlaXZlcjsKICAgICAgaXNTdXBlciA9IHRydWU7CiAgICAgIHJlY2VpdmVyID0gZm9yZXN0LnRoaXNFeHByZXNzaW9uKHRoaXNBY2Nlc3NvclJlY2VpdmVyLnRva2VuKTsKICAgIH0KICAgIHB1c2goYnVpbGRCaW5hcnlPcGVyYXRvcih0b1ZhbHVlKHJlY2VpdmVyKSwgdG9rZW4sIGFyZ3VtZW50LCBpc1N1cGVyKSk7CiAgfQoKICBFeHByZXNzaW9uIGJ1aWxkQmluYXJ5T3BlcmF0b3IoCiAgICAgIEV4cHJlc3Npb24gYSwgVG9rZW4gdG9rZW4sIEV4cHJlc3Npb24gYiwgYm9vbCBpc1N1cGVyKSB7CiAgICBib29sIG5lZ2F0ZSA9IGZhbHNlOwogICAgU3RyaW5nIG9wZXJhdG9yID0gdG9rZW4uc3RyaW5nVmFsdWU7CiAgICBpZiAoaWRlbnRpY2FsKCIhPSIsIG9wZXJhdG9yKSkgewogICAgICBvcGVyYXRvciA9ICI9PSI7CiAgICAgIG5lZ2F0ZSA9IHRydWU7CiAgICB9CiAgICBpZiAoIWlzQmluYXJ5T3BlcmF0b3Iob3BlcmF0b3IpICYmICFpc01pbnVzT3BlcmF0b3Iob3BlcmF0b3IpKSB7CiAgICAgIGlmIChpc1VzZXJEZWZpbmFibGVPcGVyYXRvcihvcGVyYXRvcikpIHsKICAgICAgICByZXR1cm4gYnVpbGRQcm9ibGVtKAogICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZU5vdEJpbmFyeU9wZXJhdG9yLndpdGhBcmd1bWVudHModG9rZW4pLAogICAgICAgICAgICB0b2tlbi5jaGFyT2Zmc2V0LAogICAgICAgICAgICB0b2tlbi5sZW5ndGgpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBidWlsZFByb2JsZW0oZmFzdGEudGVtcGxhdGVJbnZhbGlkT3BlcmF0b3Iud2l0aEFyZ3VtZW50cyh0b2tlbiksCiAgICAgICAgICAgIHRva2VuLmNoYXJPZmZzZXQsIHRva2VuLmxlbmd0aCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIEV4cHJlc3Npb24gcmVzdWx0ID0gYnVpbGRNZXRob2RJbnZvY2F0aW9uKGEsIG5ldyBOYW1lKG9wZXJhdG9yKSwKICAgICAgICAgIGZvcmVzdC5hcmd1bWVudHMoPEV4cHJlc3Npb24+W2JdLCBub0xvY2F0aW9uKSwgdG9rZW4uY2hhck9mZnNldCwKICAgICAgICAgIC8vIFRoaXMgKmNvdWxkKiBiZSBhIGNvbnN0YW50IGV4cHJlc3Npb24sIHdlIGNhbid0IGtub3cgd2l0aG91dAogICAgICAgICAgLy8gZXZhbHVhdGluZyBbYV0gYW5kIFtiXS4KICAgICAgICAgIGlzQ29uc3RhbnRFeHByZXNzaW9uOiAhaXNTdXBlciwKICAgICAgICAgIGlzU3VwZXI6IGlzU3VwZXIpOwogICAgICByZXR1cm4gbmVnYXRlID8gZm9yZXN0Lm5vdEV4cHJlc3Npb24ocmVzdWx0LCBudWxsLCB0cnVlKSA6IHJlc3VsdDsKICAgIH0KICB9CgogIHZvaWQgZG9Mb2dpY2FsRXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgRXhwcmVzc2lvbiBhcmd1bWVudCA9IHBvcEZvclZhbHVlKCk7CiAgICBFeHByZXNzaW9uIHJlY2VpdmVyID0gcG9wKCk7CiAgICBFeHByZXNzaW9uIGxvZ2ljYWxFeHByZXNzaW9uID0KICAgICAgICBmb3Jlc3QubG9naWNhbEV4cHJlc3Npb24ocmVjZWl2ZXIsIHRva2VuLCBhcmd1bWVudCk7CiAgICB0eXBlUHJvbW90ZXI/LmV4aXRMb2dpY2FsRXhwcmVzc2lvbihhcmd1bWVudCwgbG9naWNhbEV4cHJlc3Npb24pOwogICAgcHVzaChsb2dpY2FsRXhwcmVzc2lvbik7CiAgfQoKICAvLy8gSGFuZGxlIGBhID8/IGJgLgogIHZvaWQgZG9JZk51bGwoVG9rZW4gdG9rZW4pIHsKICAgIEV4cHJlc3Npb24gYiA9IHBvcEZvclZhbHVlKCk7CiAgICBFeHByZXNzaW9uIGEgPSBwb3BGb3JWYWx1ZSgpOwogICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKGEpOwogICAgcHVzaChuZXcgSWZOdWxsSnVkZ21lbnQoCiAgICAgICAgdmFyaWFibGUsCiAgICAgICAgZm9yZXN0LmNvbmRpdGlvbmFsRXhwcmVzc2lvbigKICAgICAgICAgICAgYnVpbGRJc051bGwobmV3IFZhcmlhYmxlR2V0KHZhcmlhYmxlKSwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCB0aGlzKSwKICAgICAgICAgICAgdG9rZW4sCiAgICAgICAgICAgIGIsCiAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgIG5ldyBWYXJpYWJsZUdldCh2YXJpYWJsZSkpKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbikpOwogIH0KCiAgLy8vIEhhbmRsZSBgYT8uYiguLi4pYC4KICB2b2lkIGRvSWZOb3ROdWxsKFRva2VuIHRva2VuKSB7CiAgICBPYmplY3Qgc2VuZCA9IHBvcCgpOwogICAgaWYgKHNlbmQgaXMgSW5jb21wbGV0ZVNlbmRHZW5lcmF0b3IpIHsKICAgICAgcHVzaChzZW5kLndpdGhSZWNlaXZlcihwb3AoKSwgdG9rZW4uY2hhck9mZnNldCwgaXNOdWxsQXdhcmU6IHRydWUpKTsKICAgIH0gZWxzZSB7CiAgICAgIHBvcCgpOwogICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICAgIHB1c2goYnVpbGRQcm9ibGVtKGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyLndpdGhBcmd1bWVudHModG9rZW4pLAogICAgICAgICAgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBsZW5ndGhGb3JUb2tlbih0b2tlbikpKTsKICAgIH0KICB9CgogIHZvaWQgZG9Eb3RPckNhc2NhZGVFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBPYmplY3Qgc2VuZCA9IHBvcCgpOwogICAgaWYgKHNlbmQgaXMgSW5jb21wbGV0ZVNlbmRHZW5lcmF0b3IpIHsKICAgICAgT2JqZWN0IHJlY2VpdmVyID0gb3B0aW9uYWwoIi4iLCB0b2tlbikgPyBwb3AoKSA6IHBvcEZvclZhbHVlKCk7CiAgICAgIHB1c2goc2VuZC53aXRoUmVjZWl2ZXIocmVjZWl2ZXIsIHRva2VuLmNoYXJPZmZzZXQpKTsKICAgIH0gZWxzZSB7CiAgICAgIHBvcCgpOwogICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICAgIHB1c2goYnVpbGRQcm9ibGVtKGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyLndpdGhBcmd1bWVudHModG9rZW4pLAogICAgICAgICAgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBsZW5ndGhGb3JUb2tlbih0b2tlbikpKTsKICAgIH0KICB9CgogIGJvb2wgYXJlQXJndW1lbnRzQ29tcGF0aWJsZShGdW5jdGlvbk5vZGUgZnVuY3Rpb24sIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIC8vIFRPRE8oYWhlKTogSW1wbGVtZW50IHRoaXMuCiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gdGhyb3dOb1N1Y2hNZXRob2RFcnJvcigKICAgICAgRXhwcmVzc2lvbiByZWNlaXZlciwgU3RyaW5nIG5hbWUsIEFyZ3VtZW50cyBhcmd1bWVudHMsIGludCBjaGFyT2Zmc2V0LAogICAgICB7TWVtYmVyIGNhbmRpZGF0ZSwKICAgICAgYm9vbCBpc1N1cGVyOiBmYWxzZSwKICAgICAgYm9vbCBpc0dldHRlcjogZmFsc2UsCiAgICAgIGJvb2wgaXNTZXR0ZXI6IGZhbHNlLAogICAgICBib29sIGlzU3RhdGljOiBmYWxzZSwKICAgICAgTG9jYXRlZE1lc3NhZ2UgbWVzc2FnZX0pIHsKICAgIGludCBsZW5ndGggPSBuYW1lLmxlbmd0aDsKICAgIGludCBwZXJpb2RJbmRleCA9IG5hbWUubGFzdEluZGV4T2YoIi4iKTsKICAgIGlmIChwZXJpb2RJbmRleCAhPSAtMSkgewogICAgICBsZW5ndGggLT0gcGVyaW9kSW5kZXggKyAxOwogICAgfQogICAgTmFtZSBrZXJuZWxOYW1lID0gbmV3IE5hbWUobmFtZSwgbGlicmFyeS5saWJyYXJ5KTsKICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQ7CiAgICBpZiAoY2FuZGlkYXRlICE9IG51bGwpIHsKICAgICAgVXJpIHVyaSA9IGNhbmRpZGF0ZS5sb2NhdGlvbi5maWxlOwogICAgICBpbnQgb2Zmc2V0ID0gY2FuZGlkYXRlLmZpbGVPZmZzZXQ7CiAgICAgIE1lc3NhZ2UgY29udGV4dE1lc3NhZ2U7CiAgICAgIGludCBsZW5ndGggPSBub0xlbmd0aDsKICAgICAgaWYgKG9mZnNldCA9PSAtMSAmJiBjYW5kaWRhdGUgaXMgQ29uc3RydWN0b3IpIHsKICAgICAgICBvZmZzZXQgPSBjYW5kaWRhdGUuZW5jbG9zaW5nQ2xhc3MuZmlsZU9mZnNldDsKICAgICAgICBjb250ZXh0TWVzc2FnZSA9IGZhc3RhLnRlbXBsYXRlQ2FuZGlkYXRlRm91bmRJc0RlZmF1bHRDb25zdHJ1Y3RvcgogICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhjYW5kaWRhdGUuZW5jbG9zaW5nQ2xhc3MubmFtZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGVuZ3RoID0gbmFtZS5sZW5ndGg7CiAgICAgICAgY29udGV4dE1lc3NhZ2UgPSBmYXN0YS5tZXNzYWdlQ2FuZGlkYXRlRm91bmQ7CiAgICAgIH0KICAgICAgY29udGV4dCA9IFtjb250ZXh0TWVzc2FnZS53aXRoTG9jYXRpb24odXJpLCBvZmZzZXQsIGxlbmd0aCldOwogICAgfQogICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewogICAgICBpZiAoaXNHZXR0ZXIpIHsKICAgICAgICBtZXNzYWdlID0gd2FyblVucmVzb2x2ZWRHZXQoa2VybmVsTmFtZSwgY2hhck9mZnNldCwKICAgICAgICAgICAgICAgIGlzU3VwZXI6IGlzU3VwZXIsIHJlcG9ydFdhcm5pbmc6IGZhbHNlLCBjb250ZXh0OiBjb250ZXh0KQogICAgICAgICAgICAud2l0aExvY2F0aW9uKHVyaSwgY2hhck9mZnNldCwgbGVuZ3RoKTsKICAgICAgfSBlbHNlIGlmIChpc1NldHRlcikgewogICAgICAgIG1lc3NhZ2UgPSB3YXJuVW5yZXNvbHZlZFNldChrZXJuZWxOYW1lLCBjaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgaXNTdXBlcjogaXNTdXBlciwgcmVwb3J0V2FybmluZzogZmFsc2UsIGNvbnRleHQ6IGNvbnRleHQpCiAgICAgICAgICAgIC53aXRoTG9jYXRpb24odXJpLCBjaGFyT2Zmc2V0LCBsZW5ndGgpOwogICAgICB9IGVsc2UgewogICAgICAgIG1lc3NhZ2UgPSB3YXJuVW5yZXNvbHZlZE1ldGhvZChrZXJuZWxOYW1lLCBjaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgaXNTdXBlcjogaXNTdXBlciwgcmVwb3J0V2FybmluZzogZmFsc2UsIGNvbnRleHQ6IGNvbnRleHQpCiAgICAgICAgICAgIC53aXRoTG9jYXRpb24odXJpLCBjaGFyT2Zmc2V0LCBsZW5ndGgpOwogICAgICB9CiAgICB9CiAgICBpZiAobGVnYWN5TW9kZSAmJiBjb25zdGFudENvbnRleHQgPT0gQ29uc3RhbnRDb250ZXh0Lm5vbmUpIHsKICAgICAgYWRkUHJvYmxlbShtZXNzYWdlLm1lc3NhZ2VPYmplY3QsIG1lc3NhZ2UuY2hhck9mZnNldCwgbWVzc2FnZS5sZW5ndGgsCiAgICAgICAgICB3YXNIYW5kbGVkOiB0cnVlLCBjb250ZXh0OiBjb250ZXh0KTsKICAgICAgcmV0dXJuIGZvcmVzdC50aHJvd0V4cHJlc3Npb24oCiAgICAgICAgICBudWxsLAogICAgICAgICAgbGlicmFyeS5sb2FkZXIuaW5zdGFudGlhdGVOb1N1Y2hNZXRob2RFcnJvcigKICAgICAgICAgICAgICByZWNlaXZlciwgbmFtZSwgZm9yZXN0LmNhc3RBcmd1bWVudHMoYXJndW1lbnRzKSwgY2hhck9mZnNldCwKICAgICAgICAgICAgICBpc01ldGhvZDogIWlzR2V0dGVyICYmICFpc1NldHRlciwKICAgICAgICAgICAgICBpc0dldHRlcjogaXNHZXR0ZXIsCiAgICAgICAgICAgICAgaXNTZXR0ZXI6IGlzU2V0dGVyLAogICAgICAgICAgICAgIGlzU3RhdGljOiBpc1N0YXRpYywKICAgICAgICAgICAgICBpc1RvcExldmVsOiAhaXNTdGF0aWMgJiYgIWlzU3VwZXIpKQogICAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgICB9CiAgICByZXR1cm4gZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oYnVpbGRQcm9ibGVtKAogICAgICAgIG1lc3NhZ2UubWVzc2FnZU9iamVjdCwgbWVzc2FnZS5jaGFyT2Zmc2V0LCBtZXNzYWdlLmxlbmd0aCwKICAgICAgICBjb250ZXh0OiBjb250ZXh0KSk7CiAgfQoKICBAb3ZlcnJpZGUKICBNZXNzYWdlIHdhcm5VbnJlc29sdmVkR2V0KE5hbWUgbmFtZSwgaW50IGNoYXJPZmZzZXQsCiAgICAgIHtib29sIGlzU3VwZXI6IGZhbHNlLAogICAgICBib29sIHJlcG9ydFdhcm5pbmc6IHRydWUsCiAgICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHR9KSB7CiAgICBNZXNzYWdlIG1lc3NhZ2UgPSBpc1N1cGVyCiAgICAgICAgPyBmYXN0YS50ZW1wbGF0ZVN1cGVyY2xhc3NIYXNOb0dldHRlci53aXRoQXJndW1lbnRzKG5hbWUubmFtZSkKICAgICAgICA6IGZhc3RhLnRlbXBsYXRlR2V0dGVyTm90Rm91bmQud2l0aEFyZ3VtZW50cyhuYW1lLm5hbWUpOwogICAgaWYgKHJlcG9ydFdhcm5pbmcpIHsKICAgICAgYWRkUHJvYmxlbUVycm9ySWZDb25zdChtZXNzYWdlLCBjaGFyT2Zmc2V0LCBuYW1lLm5hbWUubGVuZ3RoLAogICAgICAgICAgY29udGV4dDogY29udGV4dCk7CiAgICB9CiAgICByZXR1cm4gbWVzc2FnZTsKICB9CgogIEBvdmVycmlkZQogIE1lc3NhZ2Ugd2FyblVucmVzb2x2ZWRTZXQoTmFtZSBuYW1lLCBpbnQgY2hhck9mZnNldCwKICAgICAge2Jvb2wgaXNTdXBlcjogZmFsc2UsCiAgICAgIGJvb2wgcmVwb3J0V2FybmluZzogdHJ1ZSwKICAgICAgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dH0pIHsKICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGlzU3VwZXIKICAgICAgICA/IGZhc3RhLnRlbXBsYXRlU3VwZXJjbGFzc0hhc05vU2V0dGVyLndpdGhBcmd1bWVudHMobmFtZS5uYW1lKQogICAgICAgIDogZmFzdGEudGVtcGxhdGVTZXR0ZXJOb3RGb3VuZC53aXRoQXJndW1lbnRzKG5hbWUubmFtZSk7CiAgICBpZiAocmVwb3J0V2FybmluZykgewogICAgICBhZGRQcm9ibGVtRXJyb3JJZkNvbnN0KG1lc3NhZ2UsIGNoYXJPZmZzZXQsIG5hbWUubmFtZS5sZW5ndGgsCiAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICAgIH0KICAgIHJldHVybiBtZXNzYWdlOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVzc2FnZSB3YXJuVW5yZXNvbHZlZE1ldGhvZChOYW1lIG5hbWUsIGludCBjaGFyT2Zmc2V0LAogICAgICB7Ym9vbCBpc1N1cGVyOiBmYWxzZSwKICAgICAgYm9vbCByZXBvcnRXYXJuaW5nOiB0cnVlLAogICAgICBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0fSkgewogICAgU3RyaW5nIHBsYWluTmFtZSA9IG5hbWUubmFtZTsKICAgIGludCBkb3RJbmRleCA9IHBsYWluTmFtZS5sYXN0SW5kZXhPZigiLiIpOwogICAgaWYgKGRvdEluZGV4ICE9IC0xKSB7CiAgICAgIHBsYWluTmFtZSA9IHBsYWluTmFtZS5zdWJzdHJpbmcoZG90SW5kZXggKyAxKTsKICAgIH0KICAgIC8vIFRPRE8oYWhlKTogVGhpcyBpcyByYXRoZXIgYnJpdHRsZS4gV2Ugd291bGQgcHJvYmFibHkgYmUgYmV0dGVyIG9mZiB3aXRoCiAgICAvLyBtb3JlIHByZWNpc2UgbG9jYXRpb24gaW5mb3JtYXRpb24gaW4gdGhpcyBjYXNlLgogICAgaW50IGxlbmd0aCA9IHBsYWluTmFtZS5sZW5ndGg7CiAgICBpZiAocGxhaW5OYW1lLnN0YXJ0c1dpdGgoIlsiKSkgewogICAgICBsZW5ndGggPSAxOwogICAgfQogICAgTWVzc2FnZSBtZXNzYWdlID0gaXNTdXBlcgogICAgICAgID8gZmFzdGEudGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9NZXRob2Qud2l0aEFyZ3VtZW50cyhuYW1lLm5hbWUpCiAgICAgICAgOiBmYXN0YS50ZW1wbGF0ZU1ldGhvZE5vdEZvdW5kLndpdGhBcmd1bWVudHMobmFtZS5uYW1lKTsKICAgIGlmIChyZXBvcnRXYXJuaW5nKSB7CiAgICAgIGFkZFByb2JsZW1FcnJvcklmQ29uc3QobWVzc2FnZSwgY2hhck9mZnNldCwgbGVuZ3RoLCBjb250ZXh0OiBjb250ZXh0KTsKICAgIH0KICAgIHJldHVybiBtZXNzYWdlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3YXJuVHlwZUFyZ3VtZW50c01pc21hdGNoKFN0cmluZyBuYW1lLCBpbnQgZXhwZWN0ZWQsIGludCBjaGFyT2Zmc2V0KSB7CiAgICBhZGRQcm9ibGVtRXJyb3JJZkNvbnN0KAogICAgICAgIGZhc3RhLnRlbXBsYXRlVHlwZUFyZ3VtZW50TWlzbWF0Y2gud2l0aEFyZ3VtZW50cyhleHBlY3RlZCksCiAgICAgICAgY2hhck9mZnNldCwKICAgICAgICBuYW1lLmxlbmd0aCk7CiAgfQoKICBAb3ZlcnJpZGUKICBNZW1iZXIgbG9va3VwSW5zdGFuY2VNZW1iZXIoTmFtZSBuYW1lLAogICAgICB7Ym9vbCBpc1NldHRlcjogZmFsc2UsIGJvb2wgaXNTdXBlcjogZmFsc2V9KSB7CiAgICBDbGFzcyBjbHMgPSBjbGFzc0J1aWxkZXIuY2xzOwogICAgaWYgKGNsYXNzQnVpbGRlci5pc1BhdGNoKSB7CiAgICAgIGlmIChpc1N1cGVyKSB7CiAgICAgICAgLy8gVGhlIHN1cGVyIGNsYXNzIGlzIG9ubHkgY29ycmVjdGx5IGZvdW5kIHRocm91Z2ggdGhlIG9yaWdpbiBjbGFzcy4KICAgICAgICBjbHMgPSBjbGFzc0J1aWxkZXIub3JpZ2luLmNsczsKICAgICAgfSBlbHNlIHsKICAgICAgICBNZW1iZXIgbWVtYmVyID0KICAgICAgICAgICAgaGllcmFyY2h5LmdldEludGVyZmFjZU1lbWJlcihjbHMsIG5hbWUsIHNldHRlcjogaXNTZXR0ZXIpOwogICAgICAgIGlmIChtZW1iZXI/LnBhcmVudCA9PSBjbHMpIHsKICAgICAgICAgIC8vIE9ubHkgaWYgdGhlIG1lbWJlciBpcyBmb3VuZCBpbiB0aGUgcGF0Y2ggY2FuIHdlIHVzZSBpdC4KICAgICAgICAgIHJldHVybiBtZW1iZXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgbmVlZCB0byBrZWVwIHNlYXJjaGluZyBpbiB0aGUgb3JpZ2luIGNsYXNzLgogICAgICAgICAgY2xzID0gY2xhc3NCdWlsZGVyLm9yaWdpbi5jbHM7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKGlzU3VwZXIpIHsKICAgICAgY2xzID0gY2xzLnN1cGVyY2xhc3M7CiAgICAgIGlmIChjbHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICB9CiAgICBNZW1iZXIgdGFyZ2V0ID0gaXNTdXBlcgogICAgICAgID8gaGllcmFyY2h5LmdldERpc3BhdGNoVGFyZ2V0KGNscywgbmFtZSwgc2V0dGVyOiBpc1NldHRlcikKICAgICAgICA6IGhpZXJhcmNoeS5nZXRJbnRlcmZhY2VNZW1iZXIoY2xzLCBuYW1lLCBzZXR0ZXI6IGlzU2V0dGVyKTsKICAgIGlmIChpc1N1cGVyICYmIHRhcmdldCA9PSBudWxsKSB7CiAgICAgIGlmIChjbGFzc0J1aWxkZXIuY2xzLmlzTWl4aW5EZWNsYXJhdGlvbiB8fAogICAgICAgICAgKGxpYnJhcnkubG9hZGVyLnRhcmdldC5iYWNrZW5kVGFyZ2V0LmVuYWJsZVN1cGVyTWl4aW5zICYmCiAgICAgICAgICAgICAgY2xhc3NCdWlsZGVyLmlzQWJzdHJhY3QpKSB7CiAgICAgICAgdGFyZ2V0ID0gaGllcmFyY2h5LmdldEludGVyZmFjZU1lbWJlcihjbHMsIG5hbWUsIHNldHRlcjogaXNTZXR0ZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGFyZ2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RydWN0b3IgbG9va3VwQ29uc3RydWN0b3IoTmFtZSBuYW1lLCB7Ym9vbCBpc1N1cGVyfSkgewogICAgQ2xhc3MgY2xzID0gY2xhc3NCdWlsZGVyLmNsczsKICAgIGlmIChpc1N1cGVyKSB7CiAgICAgIGNscyA9IGNscy5zdXBlcmNsYXNzOwogICAgfQogICAgaWYgKGNscyAhPSBudWxsKSB7CiAgICAgIGZvciAoQ29uc3RydWN0b3IgY29uc3RydWN0b3IgaW4gY2xzLmNvbnN0cnVjdG9ycykgewogICAgICAgIGlmIChjb25zdHJ1Y3Rvci5uYW1lID09IG5hbWUpIHJldHVybiBjb25zdHJ1Y3RvcjsKICAgICAgfQogICAgfQoKICAgIC8vLyBQZXJmb3JtcyBhIHNpbWlsYXIgbG9va3VwIHRvIFtsb29rdXBDb25zdHJ1Y3Rvcl0sIGJ1dCB1c2luZyBhIHNsb3dlcgogICAgLy8vIGltcGxlbWVudGF0aW9uLgogICAgQ29uc3RydWN0b3IgbG9va3VwQ29uc3RydWN0b3JXaXRoUGF0Y2hlcyhOYW1lIG5hbWUsIGJvb2wgaXNTdXBlcikgewogICAgICBDbGFzc0J1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4gYnVpbGRlciA9IGNsYXNzQnVpbGRlci5vcmlnaW47CgogICAgICBDbGFzc0J1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4gZ2V0U3VwZXJjbGFzcygKICAgICAgICAgIENsYXNzQnVpbGRlcjxUeXBlQnVpbGRlciwgT2JqZWN0PiBidWlsZGVyKSB7CiAgICAgICAgLy8gVGhpcyB3YXkgb2YgY29tcHV0aW5nIHRoZSBzdXBlcmNsYXNzIGlzIHNsb3dlciB0aGFuIHVzaW5nIHRoZSBrZXJuZWwKICAgICAgICAvLyBvYmplY3RzIGRpcmVjdGx5LgogICAgICAgIE9iamVjdCBzdXBlcnR5cGUgPSBidWlsZGVyLnN1cGVydHlwZTsKICAgICAgICBpZiAoc3VwZXJ0eXBlIGlzIE5hbWVkVHlwZUJ1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4pIHsKICAgICAgICAgIE9iamVjdCBidWlsZGVyID0gc3VwZXJ0eXBlLmRlY2xhcmF0aW9uOwogICAgICAgICAgaWYgKGJ1aWxkZXIgaXMgQ2xhc3NCdWlsZGVyPFR5cGVCdWlsZGVyLCBPYmplY3Q+KSByZXR1cm4gYnVpbGRlcjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIGlmIChpc1N1cGVyKSB7CiAgICAgICAgYnVpbGRlciA9IGdldFN1cGVyY2xhc3MoYnVpbGRlcik/Lm9yaWdpbjsKICAgICAgfQogICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7CiAgICAgICAgQ2xhc3MgdGFyZ2V0ID0gYnVpbGRlci50YXJnZXQ7CiAgICAgICAgZm9yIChDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciBpbiB0YXJnZXQuY29uc3RydWN0b3JzKSB7CiAgICAgICAgICBpZiAoY29uc3RydWN0b3IubmFtZSA9PSBuYW1lKSByZXR1cm4gY29uc3RydWN0b3I7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHJldHVybiBsb29rdXBDb25zdHJ1Y3RvcldpdGhQYXRjaGVzKG5hbWUsIGlzU3VwZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dCBjb250ZXh0KSB7CiAgICBkZWJ1Z0V2ZW50KCJoYW5kbGVJZGVudGlmaWVyIik7CiAgICBTdHJpbmcgbmFtZSA9IHRva2VuLmxleGVtZTsKICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoImRlcHJlY2F0ZWQiKSAmJgogICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgcHJldmlvdXMgY2hlY2sgaXMgcmVkdW5kYW50LCBidXQgZmFzdGVyIGluIHRoZSBjb21tb24KICAgICAgICAvLyBjYXNlICh3aGVuIFtuYW1lXSBpc24ndCBkZXByZWNhdGVkKS4KICAgICAgICAobmFtZSA9PSAiZGVwcmVjYXRlZCIgfHwgbmFtZS5zdGFydHNXaXRoKCJkZXByZWNhdGVkXyIpKSkgewogICAgICBhZGRQcm9ibGVtKGZhc3RhLnRlbXBsYXRlVXNlT2ZEZXByZWNhdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBsZW5ndGhGb3JUb2tlbih0b2tlbikpOwogICAgfQogICAgaWYgKGNvbnRleHQuaXNTY29wZVJlZmVyZW5jZSkgewogICAgICBhc3NlcnQoIWluSW5pdGlhbGl6ZXIgfHwKICAgICAgICAgIHRoaXMuc2NvcGUgPT0gZW5jbG9zaW5nU2NvcGUgfHwKICAgICAgICAgIHRoaXMuc2NvcGUucGFyZW50ID09IGVuY2xvc2luZ1Njb3BlKTsKICAgICAgLy8gVGhpcyBkZWFscyB3aXRoIHRoaXMga2luZCBvZiBpbml0aWFsaXplcjogYEMoYSkgOiBhID0gYTtgCiAgICAgIFNjb3BlIHNjb3BlID0gaW5Jbml0aWFsaXplciA/IGVuY2xvc2luZ1Njb3BlIDogdGhpcy5zY29wZTsKICAgICAgcHVzaChzY29wZUxvb2t1cChzY29wZSwgbmFtZSwgdG9rZW4pKTsKICAgICAgcmV0dXJuOwogICAgfSBlbHNlIGlmIChjb250ZXh0LmluRGVjbGFyYXRpb24pIHsKICAgICAgaWYgKGNvbnRleHQgPT0gSWRlbnRpZmllckNvbnRleHQudG9wTGV2ZWxWYXJpYWJsZURlY2xhcmF0aW9uIHx8CiAgICAgICAgICBjb250ZXh0ID09IElkZW50aWZpZXJDb250ZXh0LmZpZWxkRGVjbGFyYXRpb24pIHsKICAgICAgICBjb25zdGFudENvbnRleHQgPSBtZW1iZXIuaXNDb25zdAogICAgICAgICAgICA/IENvbnN0YW50Q29udGV4dC5pbmZlcnJlZAogICAgICAgICAgICA6ICFtZW1iZXIuaXNTdGF0aWMgJiYKICAgICAgICAgICAgICAgICAgICBjbGFzc0J1aWxkZXIgIT0gbnVsbCAmJgogICAgICAgICAgICAgICAgICAgIGNsYXNzQnVpbGRlci5oYXNDb25zdENvbnN0cnVjdG9yCiAgICAgICAgICAgICAgICA/IENvbnN0YW50Q29udGV4dC5yZXF1aXJlZAogICAgICAgICAgICAgICAgOiBDb25zdGFudENvbnRleHQubm9uZTsKICAgICAgfQogICAgfSBlbHNlIGlmIChjb25zdGFudENvbnRleHQgIT0gQ29uc3RhbnRDb250ZXh0Lm5vbmUgJiYKICAgICAgICAhY29udGV4dC5hbGxvd2VkSW5Db25zdGFudEV4cHJlc3Npb24pIHsKICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgIGZhc3RhLm1lc3NhZ2VOb3RBQ29uc3RhbnRFeHByZXNzaW9uLCB0b2tlbi5jaGFyT2Zmc2V0LCB0b2tlbi5sZW5ndGgpOwogICAgfQogICAgaWYgKHRva2VuLmlzU3ludGhldGljKSB7CiAgICAgIHB1c2gobmV3IFBhcnNlclJlY292ZXJ5KG9mZnNldEZvclRva2VuKHRva2VuKSkpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChuZXcgSWRlbnRpZmllci5wcmVzZXJ2ZVRva2VuKHRva2VuKSk7CiAgICB9CiAgfQoKICAvLy8gTG9vayB1cCBbbmFtZV0gaW4gW3Njb3BlXSB1c2luZyBbdG9rZW5dIGFzIGxvY2F0aW9uIGluZm9ybWF0aW9uIChib3RoIHRvCiAgLy8vIHJlcG9ydCBwcm9ibGVtcyBhbmQgYXMgdGhlIGZpbGUgb2Zmc2V0IGluIHRoZSBnZW5lcmF0ZWQga2VybmVsIGNvZGUpLgogIC8vLyBbaXNRdWFsaWZpZWRdIHNob3VsZCBiZSB0cnVlIGlmIFtuYW1lXSBpcyBhIHF1YWxpZmllZCBhY2Nlc3MgKHdoaWNoCiAgLy8vIGltcGxpZXMgdGhhdCBpdCBzaG91bGRuJ3QgYmUgdHVybmVkIGludG8gYSBbVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yXQogIC8vLyBpZiB0aGUgbmFtZSBkb2Vzbid0IHJlc29sdmUgaW4gdGhlIHNjb3BlKS4KICBAb3ZlcnJpZGUKICBzY29wZUxvb2t1cChTY29wZSBzY29wZSwgU3RyaW5nIG5hbWUsIFRva2VuIHRva2VuLAogICAgICB7Ym9vbCBpc1F1YWxpZmllZDogZmFsc2UsIFByZWZpeEJ1aWxkZXIgcHJlZml4fSkgewogICAgaW50IGNoYXJPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICBpZiAodG9rZW4uaXNTeW50aGV0aWMpIHsKICAgICAgcmV0dXJuIG5ldyBQYXJzZXJFcnJvckdlbmVyYXRvcih0aGlzLCB0b2tlbiwgZmFzdGEubWVzc2FnZVN5bnRoZXRpY1Rva2VuKTsKICAgIH0KICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gc2NvcGUubG9va3VwKG5hbWUsIGNoYXJPZmZzZXQsIHVyaSk7CiAgICBpZiAoZGVjbGFyYXRpb24gaXMgVW5saW5rZWREZWNsYXJhdGlvbikgewogICAgICByZXR1cm4gbmV3IFVubGlua2VkR2VuZXJhdG9yKHRoaXMsIHRva2VuLCBkZWNsYXJhdGlvbik7CiAgICB9CiAgICBpZiAoZGVjbGFyYXRpb24gPT0gbnVsbCAmJgogICAgICAgIHByZWZpeCA9PSBudWxsICYmCiAgICAgICAgKGNsYXNzQnVpbGRlcj8uaXNQYXRjaCA/PyBmYWxzZSkpIHsKICAgICAgLy8gVGhlIHNjb3BlIG9mIGEgcGF0Y2hlZCBtZXRob2QgaW5jbHVkZXMgdGhlIG9yaWdpbiBjbGFzcy4KICAgICAgZGVjbGFyYXRpb24gPQogICAgICAgICAgY2xhc3NCdWlsZGVyLm9yaWdpbi5maW5kU3RhdGljQnVpbGRlcihuYW1lLCBjaGFyT2Zmc2V0LCB1cmksIGxpYnJhcnkpOwogICAgfQogICAgaWYgKGRlY2xhcmF0aW9uICE9IG51bGwgJiYKICAgICAgICBkZWNsYXJhdGlvbi5pc0luc3RhbmNlTWVtYmVyICYmCiAgICAgICAgaW5GaWVsZEluaXRpYWxpemVyICYmCiAgICAgICAgIWluSW5pdGlhbGl6ZXIpIHsKICAgICAgcmV0dXJuIG5ldyBJbmNvbXBsZXRlRXJyb3JHZW5lcmF0b3IodGhpcywgdG9rZW4sCiAgICAgICAgICBmYXN0YS50ZW1wbGF0ZVRoaXNBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXIud2l0aEFyZ3VtZW50cyhuYW1lKSk7CiAgICB9CiAgICBpZiAoZGVjbGFyYXRpb24gPT0gbnVsbCB8fAogICAgICAgICghaXNJbnN0YW5jZUNvbnRleHQgJiYgZGVjbGFyYXRpb24uaXNJbnN0YW5jZU1lbWJlcikpIHsKICAgICAgTmFtZSBuID0gbmV3IE5hbWUobmFtZSwgbGlicmFyeS5saWJyYXJ5KTsKICAgICAgaWYgKCFpc1F1YWxpZmllZCAmJiBpc0luc3RhbmNlQ29udGV4dCkgewogICAgICAgIGFzc2VydChkZWNsYXJhdGlvbiA9PSBudWxsKTsKICAgICAgICBpZiAoY29uc3RhbnRDb250ZXh0ICE9IENvbnN0YW50Q29udGV4dC5ub25lIHx8IG1lbWJlci5pc0ZpZWxkKSB7CiAgICAgICAgICByZXR1cm4gbmV3IFVucmVzb2x2ZWROYW1lR2VuZXJhdG9yKHRoaXMsIHRva2VuLCBuKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBUaGlzUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IodGhpcywgdG9rZW4sIG4sCiAgICAgICAgICAgIGxvb2t1cEluc3RhbmNlTWVtYmVyKG4pLCBsb29rdXBJbnN0YW5jZU1lbWJlcihuLCBpc1NldHRlcjogdHJ1ZSkpOwogICAgICB9IGVsc2UgaWYgKGlnbm9yZU1haW5JbkdldE1haW5DbG9zdXJlICYmCiAgICAgICAgICBuYW1lID09ICJtYWluIiAmJgogICAgICAgICAgbWVtYmVyPy5uYW1lID09ICJfZ2V0TWFpbkNsb3N1cmUiKSB7CiAgICAgICAgcmV0dXJuIGZvcmVzdC5saXRlcmFsTnVsbChudWxsKS4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG5ldyBVbnJlc29sdmVkTmFtZUdlbmVyYXRvcih0aGlzLCB0b2tlbiwgbik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24uaXNUeXBlRGVjbGFyYXRpb24pIHsKICAgICAgcmV0dXJuIG5ldyBUeXBlVXNlR2VuZXJhdG9yKHRoaXMsIHRva2VuLCBkZWNsYXJhdGlvbiwgbmFtZSk7CiAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uLmlzTG9jYWwpIHsKICAgICAgaWYgKGNvbnN0YW50Q29udGV4dCAhPSBDb25zdGFudENvbnRleHQubm9uZSAmJgogICAgICAgICAgIWRlY2xhcmF0aW9uLmlzQ29uc3QgJiYKICAgICAgICAgICFtZW1iZXIuaXNDb25zdHJ1Y3RvcikgewogICAgICAgIHJldHVybiBuZXcgSW5jb21wbGV0ZUVycm9yR2VuZXJhdG9yKAogICAgICAgICAgICB0aGlzLCB0b2tlbiwgZmFzdGEubWVzc2FnZU5vdEFDb25zdGFudEV4cHJlc3Npb24pOwogICAgICB9CiAgICAgIC8vIEFuIGluaXRpYWxpemluZyBmb3JtYWwgcGFyYW1ldGVyIG1pZ2h0IGJlIGZpbmFsIHdpdGhvdXQgaXRzCiAgICAgIC8vIFZhcmlhYmxlRGVjbGFyYXRpb24gYmVpbmcgZmluYWwuIFNlZQogICAgICAvLyBbUHJvY2VkdXJlQnVpbGRlci5jb21wdXRlRm9ybWFsUGFyYW1ldGVySW5pdGlhbGl6ZXJTY29wZV0uIElmIHRoYXQKICAgICAgLy8gd2Fzbid0IHRoZSBjYXNlLCB3ZSBjb3VsZCBhbHdheXMgdXNlIFtWYXJpYWJsZVVzZUdlbmVyYXRvcl0uCiAgICAgIGlmIChkZWNsYXJhdGlvbi5pc0ZpbmFsKSB7CiAgICAgICAgT2JqZWN0IGZhY3QgPSB0eXBlUHJvbW90ZXI/LmdldEZhY3RGb3JBY2Nlc3MoCiAgICAgICAgICAgIGRlY2xhcmF0aW9uLnRhcmdldCwgZnVuY3Rpb25OZXN0aW5nTGV2ZWwpOwogICAgICAgIE9iamVjdCBzY29wZSA9IHR5cGVQcm9tb3Rlcj8uY3VycmVudFNjb3BlOwogICAgICAgIHJldHVybiBuZXcgUmVhZE9ubHlBY2Nlc3NHZW5lcmF0b3IoCiAgICAgICAgICAgIHRoaXMsCiAgICAgICAgICAgIHRva2VuLAogICAgICAgICAgICBuZXcgVmFyaWFibGVHZXRKdWRnbWVudChkZWNsYXJhdGlvbi50YXJnZXQsIGZhY3QsIHNjb3BlKQogICAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQsCiAgICAgICAgICAgIG5hbWUpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBuZXcgVmFyaWFibGVVc2VHZW5lcmF0b3IodGhpcywgdG9rZW4sIGRlY2xhcmF0aW9uLnRhcmdldCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24uaXNJbnN0YW5jZU1lbWJlcikgewogICAgICBpZiAoY29uc3RhbnRDb250ZXh0ICE9IENvbnN0YW50Q29udGV4dC5ub25lICYmCiAgICAgICAgICAhaW5Jbml0aWFsaXplciAmJgogICAgICAgICAgLy8gVE9ETyhhaGUpOiBUaGlzIGlzIGEgaGFjayBiZWNhdXNlIEZhc3RhIHNldHMgdXAgdGhlIHNjb3BlCiAgICAgICAgICAvLyAidGhpcy5maWVsZCIgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gb2xkIHNlbWFudGljcy4gVW5kZXIgdGhlIG5ldwogICAgICAgICAgLy8gc2VtYW50aWNzLCBzdWNoIHBhcmFtZXRlcnMgaW50cm9kdWNlcyBhIG5ldyBwYXJhbWV0ZXIgd2l0aCB0aGF0CiAgICAgICAgICAvLyBuYW1lIHRoYXQgc2hvdWxkIGJlIHJlc29sdmVkIGhlcmUuCiAgICAgICAgICAhbWVtYmVyLmlzQ29uc3RydWN0b3IpIHsKICAgICAgICBhZGRQcm9ibGVtKAogICAgICAgICAgICBmYXN0YS5tZXNzYWdlTm90QUNvbnN0YW50RXhwcmVzc2lvbiwgY2hhck9mZnNldCwgdG9rZW4ubGVuZ3RoKTsKICAgICAgfQogICAgICBOYW1lIG4gPSBuZXcgTmFtZShuYW1lLCBsaWJyYXJ5LmxpYnJhcnkpOwogICAgICBNZW1iZXIgZ2V0dGVyOwogICAgICBNZW1iZXIgc2V0dGVyOwogICAgICBpZiAoZGVjbGFyYXRpb24gaXMgQWNjZXNzRXJyb3JCdWlsZGVyKSB7CiAgICAgICAgc2V0dGVyID0gZGVjbGFyYXRpb24ucGFyZW50LnRhcmdldDsKICAgICAgICBnZXR0ZXIgPSBsb29rdXBJbnN0YW5jZU1lbWJlcihuKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBnZXR0ZXIgPSBkZWNsYXJhdGlvbi50YXJnZXQ7CiAgICAgICAgc2V0dGVyID0gbG9va3VwSW5zdGFuY2VNZW1iZXIobiwgaXNTZXR0ZXI6IHRydWUpOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yKHRoaXMsIHRva2VuLCBuLCBnZXR0ZXIsIHNldHRlcik7CiAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uLmlzUmVndWxhck1ldGhvZCkgewogICAgICBhc3NlcnQoZGVjbGFyYXRpb24uaXNTdGF0aWMgfHwgZGVjbGFyYXRpb24uaXNUb3BMZXZlbCk7CiAgICAgIHJldHVybiBuZXcgU3RhdGljQWNjZXNzR2VuZXJhdG9yKHRoaXMsIHRva2VuLCBkZWNsYXJhdGlvbi50YXJnZXQsIG51bGwpOwogICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBQcmVmaXhCdWlsZGVyKSB7CiAgICAgIGFzc2VydChwcmVmaXggPT0gbnVsbCk7CiAgICAgIHJldHVybiBuZXcgUHJlZml4VXNlR2VuZXJhdG9yKHRoaXMsIHRva2VuLCBkZWNsYXJhdGlvbik7CiAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIExvYWRMaWJyYXJ5QnVpbGRlcikgewogICAgICByZXR1cm4gbmV3IExvYWRMaWJyYXJ5R2VuZXJhdG9yKHRoaXMsIHRva2VuLCBkZWNsYXJhdGlvbik7CiAgICB9IGVsc2UgewogICAgICBpZiAoZGVjbGFyYXRpb24uaGFzUHJvYmxlbSAmJiBkZWNsYXJhdGlvbiBpcyEgQWNjZXNzRXJyb3JCdWlsZGVyKQogICAgICAgIHJldHVybiBkZWNsYXJhdGlvbjsKICAgICAgRGVjbGFyYXRpb24gc2V0dGVyOwogICAgICBpZiAoZGVjbGFyYXRpb24uaXNTZXR0ZXIpIHsKICAgICAgICBzZXR0ZXIgPSBkZWNsYXJhdGlvbjsKICAgICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbi5pc0dldHRlcikgewogICAgICAgIHNldHRlciA9IHNjb3BlLmxvb2t1cFNldHRlcihuYW1lLCBjaGFyT2Zmc2V0LCB1cmkpOwogICAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uLmlzRmllbGQgJiYgIWRlY2xhcmF0aW9uLmlzRmluYWwpIHsKICAgICAgICBzZXR0ZXIgPSBkZWNsYXJhdGlvbjsKICAgICAgfQogICAgICBTdGF0aWNBY2Nlc3NHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IFN0YXRpY0FjY2Vzc0dlbmVyYXRvci5mcm9tQnVpbGRlcigKICAgICAgICAgIHRoaXMsIGRlY2xhcmF0aW9uLCB0b2tlbiwgc2V0dGVyKTsKICAgICAgaWYgKGNvbnN0YW50Q29udGV4dCAhPSBDb25zdGFudENvbnRleHQubm9uZSkgewogICAgICAgIE1lbWJlciByZWFkVGFyZ2V0ID0gZ2VuZXJhdG9yLnJlYWRUYXJnZXQ7CiAgICAgICAgaWYgKCEocmVhZFRhcmdldCBpcyBGaWVsZCAmJiByZWFkVGFyZ2V0LmlzQ29uc3QgfHwKICAgICAgICAgICAgLy8gU3RhdGljIHRlYXItb2ZmcyBhcmUgYWxzbyBjb21waWxlIHRpbWUgY29uc3RhbnRzLgogICAgICAgICAgICByZWFkVGFyZ2V0IGlzIFByb2NlZHVyZSkpIHsKICAgICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgICAgZmFzdGEubWVzc2FnZU5vdEFDb25zdGFudEV4cHJlc3Npb24sIGNoYXJPZmZzZXQsIHRva2VuLmxlbmd0aCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBnZW5lcmF0b3I7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVF1YWxpZmllZChUb2tlbiBwZXJpb2QpIHsKICAgIGRlYnVnRXZlbnQoIlF1YWxpZmllZCIpOwogICAgT2JqZWN0IG5vZGUgPSBwb3AoKTsKICAgIE9iamVjdCBxdWFsaWZpZXIgPSBwb3AoKTsKICAgIGlmIChxdWFsaWZpZXIgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHVzaChxdWFsaWZpZXIpOwogICAgfSBlbHNlIGlmIChub2RlIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIHB1c2gobm9kZSk7CiAgICB9IGVsc2UgewogICAgICBJZGVudGlmaWVyIGlkZW50aWZpZXIgPSBub2RlOwogICAgICBwdXNoKGlkZW50aWZpZXIud2l0aFF1YWxpZmllcihxdWFsaWZpZXIpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5MaXRlcmFsU3RyaW5nKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkxpdGVyYWxTdHJpbmciKTsKICAgIHB1c2godG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTdHJpbmdQYXJ0KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJTdHJpbmdQYXJ0Iik7CiAgICBwdXNoKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTGl0ZXJhbFN0cmluZyhpbnQgaW50ZXJwb2xhdGlvbkNvdW50LCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiZW5kTGl0ZXJhbFN0cmluZyIpOwogICAgaWYgKGludGVycG9sYXRpb25Db3VudCA9PSAwKSB7CiAgICAgIFRva2VuIHRva2VuID0gcG9wKCk7CiAgICAgIFN0cmluZyB2YWx1ZSA9IHVuZXNjYXBlU3RyaW5nKHRva2VuLmxleGVtZSwgdG9rZW4sIHRoaXMpOwogICAgICBwdXNoKGZvcmVzdC5saXRlcmFsU3RyaW5nKHZhbHVlLCB0b2tlbikpOwogICAgfSBlbHNlIHsKICAgICAgaW50IGNvdW50ID0gMSArIGludGVycG9sYXRpb25Db3VudCAqIDI7CiAgICAgIExpc3Q8T2JqZWN0PiBwYXJ0cyA9IGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PE9iamVjdD4oKS5wb3Aoc3RhY2ssIGNvdW50KTsKICAgICAgaWYgKHBhcnRzID09IG51bGwpIHsKICAgICAgICBwdXNoKG5ldyBQYXJzZXJSZWNvdmVyeShlbmRUb2tlbi5jaGFyT2Zmc2V0KSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIFRva2VuIGZpcnN0ID0gcGFydHMuZmlyc3Q7CiAgICAgIFRva2VuIGxhc3QgPSBwYXJ0cy5sYXN0OwogICAgICBRdW90ZSBxdW90ZSA9IGFuYWx5emVRdW90ZShmaXJzdC5sZXhlbWUpOwogICAgICBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zID0gPEV4cHJlc3Npb24+W107CiAgICAgIC8vIENvbnRhaW5zIG1vcmUgdGhhbiBqdXN0IFwnIG9yIFwiLgogICAgICBpZiAoZmlyc3QubGV4ZW1lLmxlbmd0aCA+IDEpIHsKICAgICAgICBTdHJpbmcgdmFsdWUgPQogICAgICAgICAgICB1bmVzY2FwZUZpcnN0U3RyaW5nUGFydChmaXJzdC5sZXhlbWUsIHF1b3RlLCBmaXJzdCwgdGhpcyk7CiAgICAgICAgaWYgKHZhbHVlLmlzTm90RW1wdHkpIHsKICAgICAgICAgIGV4cHJlc3Npb25zLmFkZChmb3Jlc3QubGl0ZXJhbFN0cmluZyh2YWx1ZSwgZmlyc3QpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHsKICAgICAgICBPYmplY3QgcGFydCA9IHBhcnRzW2ldOwogICAgICAgIGlmIChwYXJ0IGlzIFRva2VuKSB7CiAgICAgICAgICBpZiAocGFydC5sZXhlbWUubGVuZ3RoICE9IDApIHsKICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gdW5lc2NhcGUocGFydC5sZXhlbWUsIHF1b3RlLCBwYXJ0LCB0aGlzKTsKICAgICAgICAgICAgZXhwcmVzc2lvbnMuYWRkKGZvcmVzdC5saXRlcmFsU3RyaW5nKHZhbHVlLCBwYXJ0KSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGV4cHJlc3Npb25zLmFkZCh0b1ZhbHVlKHBhcnQpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gQ29udGFpbnMgbW9yZSB0aGFuIGp1c3QgXCcgb3IgXCIuCiAgICAgIGlmIChsYXN0LmxleGVtZS5sZW5ndGggPiAxKSB7CiAgICAgICAgU3RyaW5nIHZhbHVlID0gdW5lc2NhcGVMYXN0U3RyaW5nUGFydCgKICAgICAgICAgICAgbGFzdC5sZXhlbWUsIHF1b3RlLCBsYXN0LCBsYXN0LmlzU3ludGhldGljLCB0aGlzKTsKICAgICAgICBpZiAodmFsdWUuaXNOb3RFbXB0eSkgewogICAgICAgICAgZXhwcmVzc2lvbnMuYWRkKGZvcmVzdC5saXRlcmFsU3RyaW5nKHZhbHVlLCBsYXN0KSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHB1c2goZm9yZXN0LnN0cmluZ0NvbmNhdGVuYXRpb25FeHByZXNzaW9uKGV4cHJlc3Npb25zLCBlbmRUb2tlbikpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOYXRpdmVDbGF1c2UoVG9rZW4gbmF0aXZlVG9rZW4sIGJvb2wgaGFzTmFtZSkgewogICAgZGVidWdFdmVudCgiTmF0aXZlQ2xhdXNlIik7CiAgICBpZiAoaGFzTmFtZSkgewogICAgICBmb3Jlc3QuYXNMaXRlcmFsU3RyaW5nKHBvcCgpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU2NyaXB0KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJTY3JpcHQiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU3RyaW5nSnV4dGFwb3NpdGlvbihpbnQgbGl0ZXJhbENvdW50KSB7CiAgICBkZWJ1Z0V2ZW50KCJTdHJpbmdKdXh0YXBvc2l0aW9uIik7CiAgICBMaXN0PEV4cHJlc3Npb24+IHBhcnRzID0gcG9wTGlzdEZvclZhbHVlKGxpdGVyYWxDb3VudCk7CiAgICBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zOwogICAgLy8gRmxhdHRlbiBzdHJpbmcganV4dGFwb3NpdGlvbnMgb2Ygc3RyaW5nIGludGVycG9sYXRpb24uCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIEV4cHJlc3Npb24gcGFydCA9IHBhcnRzW2ldOwogICAgICBpZiAocGFydCBpcyBTdHJpbmdDb25jYXRlbmF0aW9uKSB7CiAgICAgICAgaWYgKGV4cHJlc3Npb25zID09IG51bGwpIHsKICAgICAgICAgIGV4cHJlc3Npb25zID0gcGFydHMuc3VibGlzdCgwLCBpKTsKICAgICAgICB9CiAgICAgICAgZm9yIChFeHByZXNzaW9uIGV4cHJlc3Npb24gaW4gcGFydC5leHByZXNzaW9ucykgewogICAgICAgICAgZXhwcmVzc2lvbnMuYWRkKGV4cHJlc3Npb24pOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoZXhwcmVzc2lvbnMgIT0gbnVsbCkgewogICAgICAgICAgZXhwcmVzc2lvbnMuYWRkKHBhcnQpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcHVzaChmb3Jlc3Quc3RyaW5nQ29uY2F0ZW5hdGlvbkV4cHJlc3Npb24oZXhwcmVzc2lvbnMgPz8gcGFydHMsIG51bGwpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTGl0ZXJhbEludChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTGl0ZXJhbEludCIpOwogICAgaW50IHZhbHVlID0gaW50LnRyeVBhcnNlKHRva2VuLmxleGVtZSk7CiAgICBpZiAobGVnYWN5TW9kZSkgewogICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewogICAgICAgIHB1c2godW5oYW5kbGVkKAogICAgICAgICAgICAnbGFyZ2UgaW50ZWdlcicsICdoYW5kbGVMaXRlcmFsSW50JywgdG9rZW4uY2hhck9mZnNldCwgdXJpKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHVzaChmb3Jlc3QubGl0ZXJhbEludCh2YWx1ZSwgdG9rZW4pKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBQb3N0cG9uZSBwYXJzaW5nIG9mIGxpdGVyYWxzIHJlc3VsdGluZyBpbiBhIG5lZ2F0aXZlIHZhbHVlCiAgICAvLyAoaGV4IGxpdGVyYWxzID49IDJeNjMpLiBUaGVzZSBhcmUgb25seSBhbGxvd2VkIHdoZW4gbm90IG5lZ2F0ZWQuCiAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA8IDApIHsKICAgICAgcHVzaChmb3Jlc3QubGl0ZXJhbExhcmdlSW50KHRva2VuLmxleGVtZSwgdG9rZW4pKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2goZm9yZXN0LmxpdGVyYWxJbnQodmFsdWUsIHRva2VuKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUVtcHR5RnVuY3Rpb25Cb2R5KFRva2VuIHNlbWljb2xvbikgewogICAgZGVidWdFdmVudCgiRXhwcmVzc2lvbkZ1bmN0aW9uQm9keSIpOwogICAgZW5kQmxvY2tGdW5jdGlvbkJvZHkoMCwgbnVsbCwgc2VtaWNvbG9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRXhwcmVzc2lvbkZ1bmN0aW9uQm9keShUb2tlbiBhcnJvd1Rva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiRXhwcmVzc2lvbkZ1bmN0aW9uQm9keSIpOwogICAgZW5kUmV0dXJuU3RhdGVtZW50KHRydWUsIGFycm93VG9rZW4ubmV4dCwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRSZXR1cm5TdGF0ZW1lbnQoCiAgICAgIGJvb2wgaGFzRXhwcmVzc2lvbiwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlJldHVyblN0YXRlbWVudCIpOwogICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gaGFzRXhwcmVzc2lvbiA/IHBvcEZvclZhbHVlKCkgOiBudWxsOwogICAgaWYgKGV4cHJlc3Npb24gIT0gbnVsbCAmJiBpbkNvbnN0cnVjdG9yKSB7CiAgICAgIHB1c2goYnVpbGRQcm9ibGVtU3RhdGVtZW50KAogICAgICAgICAgZmFzdGEubWVzc2FnZUNvbnN0cnVjdG9yV2l0aFJldHVyblR5cGUsIGJlZ2luVG9rZW4uY2hhck9mZnNldCkpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChmb3Jlc3QucmV0dXJuU3RhdGVtZW50KGJlZ2luVG9rZW4sIGV4cHJlc3Npb24sIGVuZFRva2VuKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luVGhlblN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPSBwb3BGb3JWYWx1ZSgpOwogICAgZW50ZXJUaGVuRm9yVHlwZVByb21vdGlvbihjb25kaXRpb24pOwogICAgcHVzaChjb25kaXRpb24pOwogICAgc3VwZXIuYmVnaW5UaGVuU3RhdGVtZW50KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVGhlblN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgdHlwZVByb21vdGVyPy5lbnRlckVsc2UoKTsKICAgIHN1cGVyLmVuZFRoZW5TdGF0ZW1lbnQodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRJZlN0YXRlbWVudChUb2tlbiBpZlRva2VuLCBUb2tlbiBlbHNlVG9rZW4pIHsKICAgIFN0YXRlbWVudCBlbHNlUGFydCA9IHBvcFN0YXRlbWVudElmTm90TnVsbChlbHNlVG9rZW4pOwogICAgU3RhdGVtZW50IHRoZW5QYXJ0ID0gcG9wU3RhdGVtZW50KCk7CiAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiA9IHBvcCgpOwogICAgdHlwZVByb21vdGVyPy5leGl0Q29uZGl0aW9uYWwoKTsKICAgIHB1c2goZm9yZXN0LmlmU3RhdGVtZW50KGlmVG9rZW4sIGNvbmRpdGlvbiwgdGhlblBhcnQsIGVsc2VUb2tlbiwgZWxzZVBhcnQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVmFyaWFibGVJbml0aWFsaXplcihUb2tlbiBhc3NpZ25tZW50T3BlcmF0b3IpIHsKICAgIGRlYnVnRXZlbnQoIlZhcmlhYmxlSW5pdGlhbGl6ZXIiKTsKICAgIGFzc2VydChhc3NpZ25tZW50T3BlcmF0b3Iuc3RyaW5nVmFsdWUgPT0gIj0iKTsKICAgIHB1c2hOZXdMb2NhbFZhcmlhYmxlKHBvcEZvclZhbHVlKCksIGVxdWFsc1Rva2VuOiBhc3NpZ25tZW50T3BlcmF0b3IpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb1ZhcmlhYmxlSW5pdGlhbGl6ZXIoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIk5vVmFyaWFibGVJbml0aWFsaXplciIpOwogICAgYm9vbCBpc0NvbnN0ID0gKGN1cnJlbnRMb2NhbFZhcmlhYmxlTW9kaWZpZXJzICYgY29uc3RNYXNrKSAhPSAwOwogICAgYm9vbCBpc0ZpbmFsID0gKGN1cnJlbnRMb2NhbFZhcmlhYmxlTW9kaWZpZXJzICYgZmluYWxNYXNrKSAhPSAwOwogICAgRXhwcmVzc2lvbiBpbml0aWFsaXplcjsKICAgIGlmICghb3B0aW9uYWwoImluIiwgdG9rZW4pKSB7CiAgICAgIC8vIEEgZm9yLWluIGxvb3AtdmFyaWFibGUgY2FuJ3QgaGF2ZSBhbiBpbml0aWFsaXplci4gU28gbGV0J3MgcmVtYWluCiAgICAgIC8vIHNpbGVudCBpZiB0aGUgbmV4dCB0b2tlbiBpcyBgaW5gLiBTaW5jZSBhIGZvci1pbiBsb29wIGNhbiBvbmx5IGhhdmUKICAgICAgLy8gb25lIHZhcmlhYmxlIGl0IG11c3QgYmUgZm9sbG93ZWQgYnkgYGluYC4KICAgICAgaWYgKGlzQ29uc3QpIHsKICAgICAgICBpbml0aWFsaXplciA9IGJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVDb25zdEZpZWxkV2l0aG91dEluaXRpYWxpemVyCiAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyh0b2tlbi5sZXhlbWUpLAogICAgICAgICAgICB0b2tlbi5jaGFyT2Zmc2V0LAogICAgICAgICAgICB0b2tlbi5sZW5ndGgpOwogICAgICB9IGVsc2UgaWYgKGlzRmluYWwpIHsKICAgICAgICBpbml0aWFsaXplciA9IGJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVGaW5hbEZpZWxkV2l0aG91dEluaXRpYWxpemVyCiAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyh0b2tlbi5sZXhlbWUpLAogICAgICAgICAgICB0b2tlbi5jaGFyT2Zmc2V0LAogICAgICAgICAgICB0b2tlbi5sZW5ndGgpOwogICAgICB9CiAgICB9CiAgICBwdXNoTmV3TG9jYWxWYXJpYWJsZShpbml0aWFsaXplcik7CiAgfQoKICB2b2lkIHB1c2hOZXdMb2NhbFZhcmlhYmxlKEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIsIHtUb2tlbiBlcXVhbHNUb2tlbn0pIHsKICAgIE9iamVjdCBub2RlID0gcG9wKCk7CiAgICBpZiAobm9kZSBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBwdXNoKG5vZGUpOwogICAgICByZXR1cm47CiAgICB9CiAgICBJZGVudGlmaWVyIGlkZW50aWZpZXIgPSBub2RlOwogICAgYXNzZXJ0KGN1cnJlbnRMb2NhbFZhcmlhYmxlTW9kaWZpZXJzICE9IC0xKTsKICAgIGJvb2wgaXNDb25zdCA9IChjdXJyZW50TG9jYWxWYXJpYWJsZU1vZGlmaWVycyAmIGNvbnN0TWFzaykgIT0gMDsKICAgIGJvb2wgaXNGaW5hbCA9IChjdXJyZW50TG9jYWxWYXJpYWJsZU1vZGlmaWVycyAmIGZpbmFsTWFzaykgIT0gMDsKICAgIGFzc2VydChpc0NvbnN0ID09IChjb25zdGFudENvbnRleHQgPT0gQ29uc3RhbnRDb250ZXh0LmluZmVycmVkKSk7CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudCgKICAgICAgICBpZGVudGlmaWVyLm5hbWUsIGZ1bmN0aW9uTmVzdGluZ0xldmVsLAogICAgICAgIGZvclN5bnRoZXRpY1Rva2VuOiBkZXByZWNhdGVkX2V4dHJhY3RUb2tlbihpZGVudGlmaWVyKS5pc1N5bnRoZXRpYywKICAgICAgICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsCiAgICAgICAgdHlwZTogYnVpbGREYXJ0VHlwZShjdXJyZW50TG9jYWxWYXJpYWJsZVR5cGUpLAogICAgICAgIGlzRmluYWw6IGlzRmluYWwsCiAgICAgICAgaXNDb25zdDogaXNDb25zdCkKICAgICAgLi5maWxlT2Zmc2V0ID0gaWRlbnRpZmllci5jaGFyT2Zmc2V0CiAgICAgIC4uZmlsZUVxdWFsc09mZnNldCA9IG9mZnNldEZvclRva2VuKGVxdWFsc1Rva2VuKTsKICAgIGxpYnJhcnkuY2hlY2tCb3VuZHNJblZhcmlhYmxlRGVjbGFyYXRpb24odmFyaWFibGUsIHR5cGVFbnZpcm9ubWVudCk7CiAgICBwdXNoKHZhcmlhYmxlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5GaWVsZEluaXRpYWxpemVyKFRva2VuIHRva2VuKSB7CiAgICBpbkZpZWxkSW5pdGlhbGl6ZXIgPSB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGaWVsZEluaXRpYWxpemVyKFRva2VuIGFzc2lnbm1lbnRPcGVyYXRvciwgVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkZpZWxkSW5pdGlhbGl6ZXIiKTsKICAgIGluRmllbGRJbml0aWFsaXplciA9IGZhbHNlOwogICAgYXNzZXJ0KGFzc2lnbm1lbnRPcGVyYXRvci5zdHJpbmdWYWx1ZSA9PSAiPSIpOwogICAgcHVzaChwb3BGb3JWYWx1ZSgpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9GaWVsZEluaXRpYWxpemVyKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb0ZpZWxkSW5pdGlhbGl6ZXIiKTsKICAgIGlmIChjb25zdGFudENvbnRleHQgPT0gQ29uc3RhbnRDb250ZXh0LmluZmVycmVkKSB7CiAgICAgIC8vIENyZWF0aW5nIGEgbnVsbCB2YWx1ZSB0byBwcmV2ZW50IHRoZSBEYXJ0IFZNIGZyb20gY3Jhc2hpbmcuCiAgICAgIHB1c2goZm9yZXN0LmxpdGVyYWxOdWxsKHRva2VuKSk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKE51bGxWYWx1ZS5GaWVsZEluaXRpYWxpemVyKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kSW5pdGlhbGl6ZWRJZGVudGlmaWVyKFRva2VuIG5hbWVUb2tlbikgewogICAgLy8gVE9ETyhhaGUpOiBVc2UgW0luaXRpYWxpemVkSWRlbnRpZmllcl0gaGVyZT8KICAgIGRlYnVnRXZlbnQoIkluaXRpYWxpemVkSWRlbnRpZmllciIpOwogICAgT2JqZWN0IG5vZGUgPSBwb3AoKTsKICAgIGlmIChub2RlIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIHB1c2gobm9kZSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSBub2RlOwogICAgdmFyaWFibGUuZmlsZU9mZnNldCA9IG5hbWVUb2tlbi5jaGFyT2Zmc2V0OwogICAgcHVzaCh2YXJpYWJsZSk7CiAgICBkZWNsYXJlVmFyaWFibGUodmFyaWFibGUsIHNjb3BlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5WYXJpYWJsZXNEZWNsYXJhdGlvbihUb2tlbiB0b2tlbiwgVG9rZW4gdmFyRmluYWxPckNvbnN0KSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpblZhcmlhYmxlc0RlY2xhcmF0aW9uIik7CiAgICBVbnJlc29sdmVkVHlwZTxLZXJuZWxUeXBlQnVpbGRlcj4gdHlwZSA9IHBvcCgpOwogICAgaW50IG1vZGlmaWVycyA9IE1vZGlmaWVyLnZhbGlkYXRlVmFyRmluYWxPckNvbnN0KHZhckZpbmFsT3JDb25zdD8ubGV4ZW1lKTsKICAgIHN1cGVyLnB1c2goY3VycmVudExvY2FsVmFyaWFibGVNb2RpZmllcnMpOwogICAgc3VwZXIucHVzaChjdXJyZW50TG9jYWxWYXJpYWJsZVR5cGUgPz8gTnVsbFZhbHVlLlR5cGUpOwogICAgY3VycmVudExvY2FsVmFyaWFibGVUeXBlID0gdHlwZTsKICAgIGN1cnJlbnRMb2NhbFZhcmlhYmxlTW9kaWZpZXJzID0gbW9kaWZpZXJzOwogICAgc3VwZXIucHVzaChjb25zdGFudENvbnRleHQpOwogICAgY29uc3RhbnRDb250ZXh0ID0gKChtb2RpZmllcnMgJiBjb25zdE1hc2spICE9IDApCiAgICAgICAgPyBDb25zdGFudENvbnRleHQuaW5mZXJyZWQKICAgICAgICA6IENvbnN0YW50Q29udGV4dC5ub25lOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRWYXJpYWJsZXNEZWNsYXJhdGlvbihpbnQgY291bnQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJWYXJpYWJsZXNEZWNsYXJhdGlvbiIpOwogICAgaWYgKGNvdW50ID09IDEpIHsKICAgICAgT2JqZWN0IG5vZGUgPSBwb3AoKTsKICAgICAgY29uc3RhbnRDb250ZXh0ID0gcG9wKCk7CiAgICAgIGN1cnJlbnRMb2NhbFZhcmlhYmxlVHlwZSA9IHBvcCgpOwogICAgICBjdXJyZW50TG9jYWxWYXJpYWJsZU1vZGlmaWVycyA9IHBvcCgpOwogICAgICBMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zID0gcG9wKCk7CiAgICAgIGlmIChub2RlIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgICAgcHVzaChub2RlKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IG5vZGU7CiAgICAgIGlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyaWFibGUuYWRkQW5ub3RhdGlvbihhbm5vdGF0aW9uc1tpXSk7CiAgICAgICAgfQogICAgICAgICh2YXJpYWJsZXNXaXRoTWV0YWRhdGEgPz89IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdKS5hZGQodmFyaWFibGUpOwogICAgICB9CiAgICAgIHB1c2godmFyaWFibGUpOwogICAgfSBlbHNlIHsKICAgICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXMgPQogICAgICAgICAgY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4oKS5wb3Aoc3RhY2ssIGNvdW50KTsKICAgICAgY29uc3RhbnRDb250ZXh0ID0gcG9wKCk7CiAgICAgIGN1cnJlbnRMb2NhbFZhcmlhYmxlVHlwZSA9IHBvcCgpOwogICAgICBjdXJyZW50TG9jYWxWYXJpYWJsZU1vZGlmaWVycyA9IHBvcCgpOwogICAgICBMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zID0gcG9wKCk7CiAgICAgIGlmICh2YXJpYWJsZXMgPT0gbnVsbCkgewogICAgICAgIHB1c2gobmV3IFBhcnNlclJlY292ZXJ5KG9mZnNldEZvclRva2VuKGVuZFRva2VuKSkpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgewogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gZmlyc3QgPSB2YXJpYWJsZXMuZmlyc3Q7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgZmlyc3QuYWRkQW5ub3RhdGlvbihhbm5vdGF0aW9uc1tpXSk7CiAgICAgICAgfQogICAgICAgIChtdWx0aVZhcmlhYmxlc1dpdGhNZXRhZGF0YSA/Pz0gPExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4+W10pCiAgICAgICAgICAgIC5hZGQodmFyaWFibGVzKTsKICAgICAgfQogICAgICBwdXNoKGZvcmVzdC52YXJpYWJsZXNEZWNsYXJhdGlvbih2YXJpYWJsZXMsIHVyaSkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRCbG9jayhpbnQgY291bnQsIFRva2VuIG9wZW5CcmFjZSwgVG9rZW4gY2xvc2VCcmFjZSkgewogICAgZGVidWdFdmVudCgiQmxvY2siKTsKICAgIFN0YXRlbWVudCBibG9jayA9IHBvcEJsb2NrKGNvdW50LCBvcGVuQnJhY2UsIGNsb3NlQnJhY2UpOwogICAgZXhpdExvY2FsU2NvcGUoKTsKICAgIHB1c2goYmxvY2spOwogIH0KCiAgdm9pZCBoYW5kbGVJbnZhbGlkVG9wTGV2ZWxCbG9jayhUb2tlbiB0b2tlbikgewogICAgLy8gVE9ETyhkYW5ydWJlbCk6IENvbnNpZGVyIGltcHJvdmVkIHJlY292ZXJ5IGJ5IGFkZGluZyB0aGlzIGJsb2NrCiAgICAvLyBhcyBwYXJ0IG9mIGEgc3ludGhldGljIHRvcCBsZXZlbCBmdW5jdGlvbi4KICAgIHBvcCgpOyAvLyBibG9jawogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVBc3NpZ25tZW50RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiQXNzaWdubWVudEV4cHJlc3Npb24iKTsKICAgIEV4cHJlc3Npb24gdmFsdWUgPSBwb3BGb3JWYWx1ZSgpOwogICAgT2JqZWN0IGdlbmVyYXRvciA9IHBvcCgpOwogICAgaWYgKGdlbmVyYXRvciBpcyEgR2VuZXJhdG9yKSB7CiAgICAgIHB1c2goYnVpbGRQcm9ibGVtKGZhc3RhLm1lc3NhZ2VOb3RBbkx2YWx1ZSwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLAogICAgICAgICAgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKSk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKG5ldyBEZWxheWVkQXNzaWdubWVudCgKICAgICAgICAgIHRoaXMsIHRva2VuLCBnZW5lcmF0b3IsIHZhbHVlLCB0b2tlbi5zdHJpbmdWYWx1ZSkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbnRlckxvb3AoaW50IGNoYXJPZmZzZXQpIHsKICAgIGlmIChwZWVrKCkgaXMgTGFiZWxUYXJnZXQpIHsKICAgICAgTGFiZWxUYXJnZXQgdGFyZ2V0ID0gcGVlaygpOwogICAgICBlbnRlckJyZWFrVGFyZ2V0KGNoYXJPZmZzZXQsIHRhcmdldC5icmVha1RhcmdldCk7CiAgICAgIGVudGVyQ29udGludWVUYXJnZXQoY2hhck9mZnNldCwgdGFyZ2V0LmNvbnRpbnVlVGFyZ2V0KTsKICAgIH0gZWxzZSB7CiAgICAgIGVudGVyQnJlYWtUYXJnZXQoY2hhck9mZnNldCk7CiAgICAgIGVudGVyQ29udGludWVUYXJnZXQoY2hhck9mZnNldCk7CiAgICB9CiAgfQoKICB2b2lkIGV4aXRMb29wT3JTd2l0Y2goU3RhdGVtZW50IHN0YXRlbWVudCkgewogICAgaWYgKHByb2JsZW1Jbkxvb3BPclN3aXRjaCAhPSBudWxsKSB7CiAgICAgIHB1c2gocHJvYmxlbUluTG9vcE9yU3dpdGNoKTsKICAgICAgcHJvYmxlbUluTG9vcE9yU3dpdGNoID0gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2goc3RhdGVtZW50KTsKICAgIH0KICB9CgogIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gYnVpbGRWYXJpYWJsZURlY2xhcmF0aW9ucyh2YXJpYWJsZU9yRXhwcmVzc2lvbikgewogICAgLy8gVE9ETyhhaGUpOiBUaGlzIGNhbiBiZSBzaW1wbGlmaWVkIG5vdyB0aGF0IHdlIGhhdmUgdGhlIGV2ZW50cwogICAgLy8gYGhhbmRsZUZvckluaXRpYWxpemVyLi4uYCBldmVudHMuCiAgICBpZiAodmFyaWFibGVPckV4cHJlc3Npb24gaXMgR2VuZXJhdG9yKSB7CiAgICAgIHZhcmlhYmxlT3JFeHByZXNzaW9uID0gdmFyaWFibGVPckV4cHJlc3Npb24uYnVpbGRGb3JFZmZlY3QoKTsKICAgIH0KICAgIGlmICh2YXJpYWJsZU9yRXhwcmVzc2lvbiBpcyBWYXJpYWJsZURlY2xhcmF0aW9uKSB7CiAgICAgIHJldHVybiA8VmFyaWFibGVEZWNsYXJhdGlvbj5bdmFyaWFibGVPckV4cHJlc3Npb25dOwogICAgfSBlbHNlIGlmICh2YXJpYWJsZU9yRXhwcmVzc2lvbiBpcyBFeHByZXNzaW9uKSB7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50LmZvckVmZmVjdCgKICAgICAgICAgIHZhcmlhYmxlT3JFeHByZXNzaW9uLCBmdW5jdGlvbk5lc3RpbmdMZXZlbCk7CiAgICAgIHJldHVybiA8VmFyaWFibGVEZWNsYXJhdGlvbj5bdmFyaWFibGVdOwogICAgfSBlbHNlIGlmICh2YXJpYWJsZU9yRXhwcmVzc2lvbiBpcyBFeHByZXNzaW9uU3RhdGVtZW50KSB7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50LmZvckVmZmVjdCgKICAgICAgICAgIHZhcmlhYmxlT3JFeHByZXNzaW9uLmV4cHJlc3Npb24sIGZ1bmN0aW9uTmVzdGluZ0xldmVsKTsKICAgICAgcmV0dXJuIDxWYXJpYWJsZURlY2xhcmF0aW9uPlt2YXJpYWJsZV07CiAgICB9IGVsc2UgaWYgKGZvcmVzdC5pc1ZhcmlhYmxlc0RlY2xhcmF0aW9uKHZhcmlhYmxlT3JFeHByZXNzaW9uKSkgewogICAgICByZXR1cm4gZm9yZXN0CiAgICAgICAgICAudmFyaWFibGVzRGVjbGFyYXRpb25FeHRyYWN0RGVjbGFyYXRpb25zKHZhcmlhYmxlT3JFeHByZXNzaW9uKTsKICAgIH0gZWxzZSBpZiAodmFyaWFibGVPckV4cHJlc3Npb24gaXMgTGlzdDxPYmplY3Q+KSB7CiAgICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gdmFyaWFibGVzID0gPFZhcmlhYmxlRGVjbGFyYXRpb24+W107CiAgICAgIGZvciAoT2JqZWN0IHYgaW4gdmFyaWFibGVPckV4cHJlc3Npb24pIHsKICAgICAgICB2YXJpYWJsZXMuYWRkQWxsKGJ1aWxkVmFyaWFibGVEZWNsYXJhdGlvbnModikpOwogICAgICB9CiAgICAgIHJldHVybiB2YXJpYWJsZXM7CiAgICB9IGVsc2UgaWYgKHZhcmlhYmxlT3JFeHByZXNzaW9uID09IG51bGwpIHsKICAgICAgcmV0dXJuIDxWYXJpYWJsZURlY2xhcmF0aW9uPltdOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUZvckluaXRpYWxpemVyRW1wdHlTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkZvckluaXRpYWxpemVyRW1wdHlTdGF0ZW1lbnQiKTsKICAgIHB1c2goTnVsbFZhbHVlLkV4cHJlc3Npb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVGb3JJbml0aWFsaXplckV4cHJlc3Npb25TdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkZvckluaXRpYWxpemVyRXhwcmVzc2lvblN0YXRlbWVudCIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVGb3JJbml0aWFsaXplckxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiRm9ySW5pdGlhbGl6ZXJMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24iKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRm9yTG9vcFBhcnRzKFRva2VuIGZvcktleXdvcmQsIFRva2VuIGxlZnRQYXJlbiwKICAgICAgVG9rZW4gbGVmdFNlcGFyYXRvciwgaW50IHVwZGF0ZUV4cHJlc3Npb25Db3VudCkgewogICAgcHVzaChmb3JLZXl3b3JkKTsKICAgIHB1c2gobGVmdFBhcmVuKTsKICAgIHB1c2gobGVmdFNlcGFyYXRvcik7CiAgICBwdXNoKHVwZGF0ZUV4cHJlc3Npb25Db3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZvckNvbnRyb2xGbG93KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJGb3JDb250cm9sRmxvdyIpOwogICAgdmFyIGVudHJ5ID0gcG9wKCk7CiAgICBpbnQgdXBkYXRlRXhwcmVzc2lvbkNvdW50ID0gcG9wKCk7CiAgICBwb3AoKTsgLy8gbGVmdCBzZXBhcmF0b3IKICAgIHBvcCgpOyAvLyBsZWZ0IHBhcmVudGhlc2lzCiAgICBUb2tlbiBmb3JUb2tlbiA9IHBvcCgpOwogICAgTGlzdDxFeHByZXNzaW9uPiB1cGRhdGVzID0gcG9wTGlzdEZvckVmZmVjdCh1cGRhdGVFeHByZXNzaW9uQ291bnQpOwogICAgU3RhdGVtZW50IGNvbmRpdGlvblN0YXRlbWVudCA9IHBvcFN0YXRlbWVudCgpOyAvLyBjb25kaXRpb24KICAgIE9iamVjdCB2YXJpYWJsZU9yRXhwcmVzc2lvbiA9IHBvcCgpOwogICAgZXhpdExvY2FsU2NvcGUoKTsKCiAgICBpZiAoIWxpYnJhcnkubG9hZGVyLnRhcmdldC5lbmFibGVDb250cm9sRmxvd0NvbGxlY3Rpb25zKSB7CiAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBSZXBvcnQgYSBtb3JlIHVzZXIgZnJpZW5kbHkgZXJyb3IgbWVzc2FnZQogICAgICAvLyB3aGVuIGFuIGV4cGVyaW1lbnQgaXMgbm90IGVuYWJsZWQKICAgICAgaGFuZGxlUmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIGZhc3RhLnRlbXBsYXRlVW5leHBlY3RlZFRva2VuLndpdGhBcmd1bWVudHMoZm9yVG9rZW4pLAogICAgICAgICAgZm9yVG9rZW4sCiAgICAgICAgICBmb3JUb2tlbik7CiAgICAgIHB1c2goaW52YWxpZENvbGxlY3Rpb25FbGVtZW50KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdHJhbnNmb3JtQ29sbGVjdGlvbnMgPSB0cnVlOwogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXMgPQogICAgICAgIGJ1aWxkVmFyaWFibGVEZWNsYXJhdGlvbnModmFyaWFibGVPckV4cHJlc3Npb24pOwogICAgRXhwcmVzc2lvbiBjb25kaXRpb247CiAgICBpZiAoZm9yZXN0LmlzRXhwcmVzc2lvblN0YXRlbWVudChjb25kaXRpb25TdGF0ZW1lbnQpKSB7CiAgICAgIGNvbmRpdGlvbiA9CiAgICAgICAgICBmb3Jlc3QuZ2V0RXhwcmVzc2lvbkZyb21FeHByZXNzaW9uU3RhdGVtZW50KGNvbmRpdGlvblN0YXRlbWVudCk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoZm9yZXN0LmlzRW1wdHlTdGF0ZW1lbnQoY29uZGl0aW9uU3RhdGVtZW50KSk7CiAgICB9CiAgICBpZiAoZW50cnkgaXMgTWFwRW50cnkpIHsKICAgICAgcHVzaChmb3Jlc3QuZm9yTWFwRW50cnkodmFyaWFibGVzLCBjb25kaXRpb24sIHVwZGF0ZXMsIGVudHJ5LCBmb3JUb2tlbikpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChmb3Jlc3QuZm9yRWxlbWVudCgKICAgICAgICAgIHZhcmlhYmxlcywgY29uZGl0aW9uLCB1cGRhdGVzLCB0b1ZhbHVlKGVudHJ5KSwgZm9yVG9rZW4pKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9yU3RhdGVtZW50KFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJGb3JTdGF0ZW1lbnQiKTsKICAgIFN0YXRlbWVudCBib2R5ID0gcG9wU3RhdGVtZW50KCk7CgogICAgaW50IHVwZGF0ZUV4cHJlc3Npb25Db3VudCA9IHBvcCgpOwogICAgVG9rZW4gbGVmdFNlcGFyYXRvciA9IHBvcCgpOwogICAgVG9rZW4gbGVmdFBhcmVuID0gcG9wKCk7CiAgICBUb2tlbiBmb3JLZXl3b3JkID0gcG9wKCk7CgogICAgTGlzdDxFeHByZXNzaW9uPiB1cGRhdGVzID0gcG9wTGlzdEZvckVmZmVjdCh1cGRhdGVFeHByZXNzaW9uQ291bnQpOwogICAgU3RhdGVtZW50IGNvbmRpdGlvblN0YXRlbWVudCA9IHBvcFN0YXRlbWVudCgpOwogICAgT2JqZWN0IHZhcmlhYmxlT3JFeHByZXNzaW9uID0gcG9wKCk7CiAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlcyA9CiAgICAgICAgYnVpbGRWYXJpYWJsZURlY2xhcmF0aW9ucyh2YXJpYWJsZU9yRXhwcmVzc2lvbik7CiAgICBleGl0TG9jYWxTY29wZSgpOwogICAgSnVtcFRhcmdldCBjb250aW51ZVRhcmdldCA9IGV4aXRDb250aW51ZVRhcmdldCgpOwogICAgSnVtcFRhcmdldCBicmVha1RhcmdldCA9IGV4aXRCcmVha1RhcmdldCgpOwogICAgaWYgKGNvbnRpbnVlVGFyZ2V0Lmhhc1VzZXJzKSB7CiAgICAgIGJvZHkgPSBmb3Jlc3Quc3ludGhldGljTGFiZWxlZFN0YXRlbWVudChib2R5KTsKICAgICAgY29udGludWVUYXJnZXQucmVzb2x2ZUNvbnRpbnVlcyhmb3Jlc3QsIGJvZHkpOwogICAgfQogICAgRXhwcmVzc2lvbiBjb25kaXRpb247CiAgICBpZiAoZm9yZXN0LmlzRXhwcmVzc2lvblN0YXRlbWVudChjb25kaXRpb25TdGF0ZW1lbnQpKSB7CiAgICAgIGNvbmRpdGlvbiA9CiAgICAgICAgICBmb3Jlc3QuZ2V0RXhwcmVzc2lvbkZyb21FeHByZXNzaW9uU3RhdGVtZW50KGNvbmRpdGlvblN0YXRlbWVudCk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoZm9yZXN0LmlzRW1wdHlTdGF0ZW1lbnQoY29uZGl0aW9uU3RhdGVtZW50KSk7CiAgICB9CiAgICBTdGF0ZW1lbnQgcmVzdWx0ID0gZm9yZXN0LmZvclN0YXRlbWVudCgKICAgICAgICBmb3JLZXl3b3JkLAogICAgICAgIGxlZnRQYXJlbiwKICAgICAgICB2YXJpYWJsZXMsCiAgICAgICAgbGVmdFNlcGFyYXRvciwKICAgICAgICBjb25kaXRpb24sCiAgICAgICAgY29uZGl0aW9uU3RhdGVtZW50LAogICAgICAgIHVwZGF0ZXMsCiAgICAgICAgbGVmdFBhcmVuLmVuZEdyb3VwLAogICAgICAgIGJvZHkpOwogICAgaWYgKGJyZWFrVGFyZ2V0Lmhhc1VzZXJzKSB7CiAgICAgIHJlc3VsdCA9IGZvcmVzdC5zeW50aGV0aWNMYWJlbGVkU3RhdGVtZW50KHJlc3VsdCk7CiAgICAgIGJyZWFrVGFyZ2V0LnJlc29sdmVCcmVha3MoZm9yZXN0LCByZXN1bHQpOwogICAgfQogICAgaWYgKHZhcmlhYmxlT3JFeHByZXNzaW9uIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIHByb2JsZW1Jbkxvb3BPclN3aXRjaCA/Pz0gYnVpbGRQcm9ibGVtU3RhdGVtZW50KAogICAgICAgICAgZmFzdGEubWVzc2FnZVN5bnRoZXRpY1Rva2VuLCB2YXJpYWJsZU9yRXhwcmVzc2lvbi5jaGFyT2Zmc2V0LAogICAgICAgICAgc3VwcHJlc3NNZXNzYWdlOiB0cnVlKTsKICAgIH0KICAgIGV4aXRMb29wT3JTd2l0Y2gocmVzdWx0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQXdhaXRFeHByZXNzaW9uKFRva2VuIGtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJBd2FpdEV4cHJlc3Npb24iKTsKICAgIHB1c2goZm9yZXN0LmF3YWl0RXhwcmVzc2lvbihwb3BGb3JWYWx1ZSgpLCBrZXl3b3JkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUFzeW5jTW9kaWZpZXIoVG9rZW4gYXN5bmNUb2tlbiwgVG9rZW4gc3RhclRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJBc3luY01vZGlmaWVyIik7CiAgICBwdXNoKGFzeW5jTWFya2VyRnJvbVRva2Vucyhhc3luY1Rva2VuLCBzdGFyVG9rZW4pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTGl0ZXJhbExpc3QoCiAgICAgIGludCBjb3VudCwgVG9rZW4gbGVmdEJyYWNrZXQsIFRva2VuIGNvbnN0S2V5d29yZCwgVG9rZW4gcmlnaHRCcmFja2V0KSB7CiAgICBkZWJ1Z0V2ZW50KCJMaXRlcmFsTGlzdCIpOwoKICAgIC8vIFRPRE8oZGFucnViZWwpOiBSZXBsYWNlIHRoaXMgd2l0aCBwb3BMaXN0Rm9yVmFsdWUKICAgIC8vIHdoZW4gY29udHJvbCBmbG93IGFuZCBzcHJlYWQgY29sbGVjdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgZGVmYXVsdAogICAgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyA9CiAgICAgICAgbmV3IExpc3Q8RXhwcmVzc2lvbj4uZmlsbGVkKGNvdW50LCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBmb3IgKGludCBpID0gY291bnQgLSAxOyBpID49IDA7IGktLSkgewogICAgICB2YXIgZWxlbSA9IHBvcCgpOwogICAgICBpZiAoZWxlbSAhPSBpbnZhbGlkQ29sbGVjdGlvbkVsZW1lbnQpIHsKICAgICAgICBleHByZXNzaW9uc1tpXSA9IHRvVmFsdWUoZWxlbSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZXhwcmVzc2lvbnMucmVtb3ZlQXQoaSk7CiAgICAgIH0KICAgIH0KCiAgICBMaXN0PFVucmVzb2x2ZWRUeXBlPEtlcm5lbFR5cGVCdWlsZGVyPj4gdHlwZUFyZ3VtZW50cyA9IHBvcCgpOwoKICAgIERhcnRUeXBlIHR5cGVBcmd1bWVudDsKICAgIGlmICh0eXBlQXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgaWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoID4gMSkgewogICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VMaXN0TGl0ZXJhbFRvb01hbnlUeXBlQXJndW1lbnRzLAogICAgICAgICAgICBvZmZzZXRGb3JUb2tlbihsZWZ0QnJhY2tldCksCiAgICAgICAgICAgIGxlbmd0aE9mU3BhbihsZWZ0QnJhY2tldCwgbGVmdEJyYWNrZXQuZW5kR3JvdXApKTsKICAgICAgICB0eXBlQXJndW1lbnQgPSBjb25zdCBJbnZhbGlkVHlwZSgpOwogICAgICB9IGVsc2UgewogICAgICAgIHR5cGVBcmd1bWVudCA9IGJ1aWxkRGFydFR5cGUodHlwZUFyZ3VtZW50cy5zaW5nbGUpOwogICAgICAgIGlmICghbGVnYWN5TW9kZSkgewogICAgICAgICAgdHlwZUFyZ3VtZW50ID0KICAgICAgICAgICAgICBpbnN0YW50aWF0ZVRvQm91bmRzKHR5cGVBcmd1bWVudCwgY29yZVR5cGVzLm9iamVjdENsYXNzKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHR5cGVBcmd1bWVudCA9IGltcGxpY2l0VHlwZUFyZ3VtZW50OwogICAgfQoKICAgIEV4cHJlc3Npb24gbm9kZSA9IGZvcmVzdC5saXRlcmFsTGlzdCgKICAgICAgICBjb25zdEtleXdvcmQsCiAgICAgICAgY29uc3RLZXl3b3JkICE9IG51bGwgfHwgY29uc3RhbnRDb250ZXh0ID09IENvbnN0YW50Q29udGV4dC5pbmZlcnJlZCwKICAgICAgICB0eXBlQXJndW1lbnQsCiAgICAgICAgdHlwZUFyZ3VtZW50cywKICAgICAgICBsZWZ0QnJhY2tldCwKICAgICAgICBleHByZXNzaW9ucywKICAgICAgICByaWdodEJyYWNrZXQpOwogICAgbGlicmFyeS5jaGVja0JvdW5kc0luTGlzdExpdGVyYWwobm9kZSwgdHlwZUVudmlyb25tZW50KTsKICAgIHB1c2gobm9kZSk7CiAgfQoKICB2b2lkIGJ1aWxkTGl0ZXJhbFNldChMaXN0PFVucmVzb2x2ZWRUeXBlPEtlcm5lbFR5cGVCdWlsZGVyPj4gdHlwZUFyZ3VtZW50cywKICAgICAgVG9rZW4gY29uc3RLZXl3b3JkLCBUb2tlbiBsZWZ0QnJhY2UsIExpc3Q8ZHluYW1pYz4gc2V0T3JNYXBFbnRyaWVzKSB7CiAgICBEYXJ0VHlwZSB0eXBlQXJndW1lbnQ7CiAgICBpZiAodHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIHR5cGVBcmd1bWVudCA9IGJ1aWxkRGFydFR5cGUodHlwZUFyZ3VtZW50cy5zaW5nbGUpOwogICAgICBpZiAoIWxpYnJhcnkubG9hZGVyLnRhcmdldC5sZWdhY3lNb2RlKSB7CiAgICAgICAgdHlwZUFyZ3VtZW50ID0gaW5zdGFudGlhdGVUb0JvdW5kcyh0eXBlQXJndW1lbnQsIGNvcmVUeXBlcy5vYmplY3RDbGFzcyk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHR5cGVBcmd1bWVudCA9IGltcGxpY2l0VHlwZUFyZ3VtZW50OwogICAgfQoKICAgIHZhciBleHByZXNzaW9ucyA9IDxFeHByZXNzaW9uPltdOwogICAgaWYgKHNldE9yTWFwRW50cmllcyAhPSBudWxsKSB7CiAgICAgIGZvciAodmFyIGVudHJ5IGluIHNldE9yTWFwRW50cmllcykgewogICAgICAgIGlmIChlbnRyeSBpcyBNYXBFbnRyeSkgewogICAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IHJlcG9ydCB0aGUgZXJyb3Igb24gdGhlIGNvbG9uCiAgICAgICAgICBhZGRQcm9ibGVtKGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnLCcpLAogICAgICAgICAgICAgIGVudHJ5LmZpbGVPZmZzZXQsIDEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogUmV2aXNlIG9uY2UgY29udHJvbCBmbG93IGFuZCBzcHJlYWQKICAgICAgICAgIC8vICBjb2xsZWN0aW9uIGVudHJpZXMgYXJlIHN1cHBvcnRlZC4KICAgICAgICAgIGV4cHJlc3Npb25zLmFkZChlbnRyeSBhcyBFeHByZXNzaW9uKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBFeHByZXNzaW9uIG5vZGUgPSBmb3Jlc3QubGl0ZXJhbFNldCgKICAgICAgICBjb25zdEtleXdvcmQsCiAgICAgICAgY29uc3RLZXl3b3JkICE9IG51bGwgfHwgY29uc3RhbnRDb250ZXh0ID09IENvbnN0YW50Q29udGV4dC5pbmZlcnJlZCwKICAgICAgICB0eXBlQXJndW1lbnQsCiAgICAgICAgdHlwZUFyZ3VtZW50cywKICAgICAgICBsZWZ0QnJhY2UsCiAgICAgICAgZXhwcmVzc2lvbnMsCiAgICAgICAgbGVmdEJyYWNlLmVuZEdyb3VwKTsKICAgIGxpYnJhcnkuY2hlY2tCb3VuZHNJblNldExpdGVyYWwobm9kZSwgdHlwZUVudmlyb25tZW50KTsKICAgIGlmICghbGlicmFyeS5sb2FkZXIudGFyZ2V0LmVuYWJsZVNldExpdGVyYWxzKSB7CiAgICAgIGludGVybmFsUHJvYmxlbSgKICAgICAgICAgIGZhc3RhLm1lc3NhZ2VTZXRMaXRlcmFsc05vdFN1cHBvcnRlZCwgbm9kZS5maWxlT2Zmc2V0LCB1cmkpOwogICAgICByZXR1cm47CiAgICB9CiAgICBwdXNoKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVMaXRlcmFsU2V0T3JNYXAoCiAgICBpbnQgY291bnQsCiAgICBUb2tlbiBsZWZ0QnJhY2UsCiAgICBUb2tlbiBjb25zdEtleXdvcmQsCiAgICBUb2tlbiByaWdodEJyYWNlLAogICAgLy8gVE9ETyhkYW5ydWJlbCk6IGhhc1NldEVudHJ5IHBhcmFtZXRlciBleGlzdHMgZm9yIHJlcGxpY2F0aW5nIGV4aXN0aW5nCiAgICAvLyBiZWhhdmlvciBhbmQgd2lsbCBiZSByZW1vdmVkIG9uY2UgdW5pZmllZCBjb2xsZWN0aW9uIGhhcyBiZWVuIGVuYWJsZWQKICAgIGJvb2wgaGFzU2V0RW50cnksCiAgKSB7CiAgICBkZWJ1Z0V2ZW50KCJMaXRlcmFsU2V0T3JNYXAiKTsKCiAgICB2YXIgc2V0T3JNYXBFbnRyaWVzID0gbmV3IExpc3Q8ZHluYW1pYz4uZmlsbGVkKGNvdW50LCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBmb3IgKGludCBpID0gY291bnQgLSAxOyBpID49IDA7IGktLSkgewogICAgICB2YXIgZWxlbSA9IHBvcCgpOwogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogUmV2aXNlIHRoaXMgdG8gaGFuZGxlIGNvbnRyb2wgZmxvdyBhbmQgc3ByZWFkCiAgICAgIGlmIChlbGVtID09IGludmFsaWRDb2xsZWN0aW9uRWxlbWVudCkgewogICAgICAgIHNldE9yTWFwRW50cmllcy5yZW1vdmVBdChpKTsKICAgICAgfSBlbHNlIGlmIChlbGVtIGlzIE1hcEVudHJ5KSB7CiAgICAgICAgc2V0T3JNYXBFbnRyaWVzW2ldID0gZWxlbTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzZXRPck1hcEVudHJpZXNbaV0gPSB0b1ZhbHVlKGVsZW0pOwogICAgICB9CiAgICB9CiAgICBMaXN0PFVucmVzb2x2ZWRUeXBlPEtlcm5lbFR5cGVCdWlsZGVyPj4gdHlwZUFyZ3VtZW50cyA9IHBvcCgpOwoKICAgIC8vIFJlcGxpY2F0ZSBleGlzdGluZyBiZWhhdmlvciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcGFyc2VyLgogICAgLy8gVGhpcyB3aWxsIGJlIHJlbW92ZWQgb25jZSB1bmlmaWVkIGNvbGxlY3Rpb25zIGlzIGltcGxlbWVudGVkLgoKICAgIC8vIERldGVybWluZSBpZiB0aGlzIGlzIGEgc2V0IG9yIG1hcCBiYXNlZCBvbiB0eXBlIGFyZ3MgYW5kIGNvbnRlbnQKICAgIC8vIFRPRE8oZGFucnViZWwpOiBTaW5jZSB0eXBlIHJlc29sdXRpb24gaXMgbmVlZGVkIHRvIGRpc2FtYmlndWF0ZQogICAgLy8gc2V0IG9yIG1hcCBpbiBzb21lIHNpdHVhdGlvbnMsIGNvbnNpZGVyIGFsd2F5cyBkZWZlcnJpbmcgZGV0ZXJtaW5hdGlvbgogICAgLy8gdW50aWwgdGhlIHR5cGUgcmVzb2x1dGlvbiBwaGFzZS4KICAgIGZpbmFsIHR5cGVBcmdDb3VudCA9IHR5cGVBcmd1bWVudHM/Lmxlbmd0aDsKICAgIGJvb2wgaXNTZXQgPSB0eXBlQXJnQ291bnQgPT0gMSA/IHRydWUgOiB0eXBlQXJnQ291bnQgIT0gbnVsbCA/IGZhbHNlIDogbnVsbDsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHNldE9yTWFwRW50cmllcy5sZW5ndGg7ICsraSkgewogICAgICBpZiAoc2V0T3JNYXBFbnRyaWVzW2ldIGlzISBNYXBFbnRyeSAmJgogICAgICAgICAgIWlzQ29udmVydGlibGVUb01hcEVudHJ5KHNldE9yTWFwRW50cmllc1tpXSkpIHsKICAgICAgICBoYXNTZXRFbnRyeSA9IHRydWU7CiAgICAgIH0KICAgIH0KCiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogSWYgdGhlIHR5cGUgYXJndW1lbnRzIGFyZSBub3Qga25vd24gKG51bGwpIHRoZW4KICAgIC8vIGRlZmVyIHNldC9tYXAgZGV0ZXJtaW5hdGlvbiB1bnRpbCBhZnRlciB0eXBlIHJlc29sdXRpb24gYXMgcGVyIHRoZQogICAgLy8gdW5pZmllZCBjb2xsZWN0aW9uIHNwZWM6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvbGFuZ3VhZ2UvcHVsbC8yMDAKICAgIC8vIHJhdGhlciB0aGFuIHRyeWluZyB0byBndWVzcyBhcyBkb25lIGJlbG93LgogICAgaXNTZXQgPz89IGhhc1NldEVudHJ5OwoKICAgIGlmIChpc1NldCkgewogICAgICBidWlsZExpdGVyYWxTZXQodHlwZUFyZ3VtZW50cywgY29uc3RLZXl3b3JkLCBsZWZ0QnJhY2UsIHNldE9yTWFwRW50cmllcyk7CiAgICB9IGVsc2UgewogICAgICBMaXN0PE1hcEVudHJ5PiBtYXBFbnRyaWVzID0gbmV3IExpc3Q8TWFwRW50cnk+KHNldE9yTWFwRW50cmllcy5sZW5ndGgpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNldE9yTWFwRW50cmllcy5sZW5ndGg7ICsraSkgewogICAgICAgIGlmIChzZXRPck1hcEVudHJpZXNbaV0gaXMgTWFwRW50cnkpIHsKICAgICAgICAgIG1hcEVudHJpZXNbaV0gPSBzZXRPck1hcEVudHJpZXNbaV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG1hcEVudHJpZXNbaV0gPSBjb252ZXJ0VG9NYXBFbnRyeShzZXRPck1hcEVudHJpZXNbaV0sIHRoaXMpOwogICAgICAgIH0KICAgICAgfQogICAgICBidWlsZExpdGVyYWxNYXAodHlwZUFyZ3VtZW50cywgY29uc3RLZXl3b3JkLCBsZWZ0QnJhY2UsIG1hcEVudHJpZXMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVMaXRlcmFsQm9vbChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTGl0ZXJhbEJvb2wiKTsKICAgIGJvb2wgdmFsdWUgPSBvcHRpb25hbCgidHJ1ZSIsIHRva2VuKTsKICAgIGFzc2VydCh2YWx1ZSB8fCBvcHRpb25hbCgiZmFsc2UiLCB0b2tlbikpOwogICAgcHVzaChmb3Jlc3QubGl0ZXJhbEJvb2wodmFsdWUsIHRva2VuKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUxpdGVyYWxEb3VibGUoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkxpdGVyYWxEb3VibGUiKTsKICAgIHB1c2goZm9yZXN0LmxpdGVyYWxEb3VibGUoZG91YmxlLnBhcnNlKHRva2VuLmxleGVtZSksIHRva2VuKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUxpdGVyYWxOdWxsKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJMaXRlcmFsTnVsbCIpOwogICAgcHVzaChmb3Jlc3QubGl0ZXJhbE51bGwodG9rZW4pKTsKICB9CgogIHZvaWQgYnVpbGRMaXRlcmFsTWFwKExpc3Q8VW5yZXNvbHZlZFR5cGU8S2VybmVsVHlwZUJ1aWxkZXI+PiB0eXBlQXJndW1lbnRzLAogICAgICBUb2tlbiBjb25zdEtleXdvcmQsIFRva2VuIGxlZnRCcmFjZSwgTGlzdDxNYXBFbnRyeT4gZW50cmllcykgewogICAgRGFydFR5cGUga2V5VHlwZTsKICAgIERhcnRUeXBlIHZhbHVlVHlwZTsKICAgIGlmICh0eXBlQXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgaWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoICE9IDIpIHsKICAgICAgICBrZXlUeXBlID0gY29uc3QgSW52YWxpZFR5cGUoKTsKICAgICAgICB2YWx1ZVR5cGUgPSBjb25zdCBJbnZhbGlkVHlwZSgpOwogICAgICB9IGVsc2UgewogICAgICAgIGtleVR5cGUgPSBidWlsZERhcnRUeXBlKHR5cGVBcmd1bWVudHNbMF0pOwogICAgICAgIHZhbHVlVHlwZSA9IGJ1aWxkRGFydFR5cGUodHlwZUFyZ3VtZW50c1sxXSk7CiAgICAgICAgaWYgKCFsZWdhY3lNb2RlKSB7CiAgICAgICAgICBrZXlUeXBlID0gaW5zdGFudGlhdGVUb0JvdW5kcyhrZXlUeXBlLCBjb3JlVHlwZXMub2JqZWN0Q2xhc3MpOwogICAgICAgICAgdmFsdWVUeXBlID0gaW5zdGFudGlhdGVUb0JvdW5kcyh2YWx1ZVR5cGUsIGNvcmVUeXBlcy5vYmplY3RDbGFzcyk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBEYXJ0VHlwZSBpbXBsaWNpdFR5cGVBcmd1bWVudCA9IHRoaXMuaW1wbGljaXRUeXBlQXJndW1lbnQ7CiAgICAgIGtleVR5cGUgPSBpbXBsaWNpdFR5cGVBcmd1bWVudDsKICAgICAgdmFsdWVUeXBlID0gaW1wbGljaXRUeXBlQXJndW1lbnQ7CiAgICB9CgogICAgRXhwcmVzc2lvbiBub2RlID0gZm9yZXN0LmxpdGVyYWxNYXAoCiAgICAgICAgY29uc3RLZXl3b3JkLAogICAgICAgIGNvbnN0S2V5d29yZCAhPSBudWxsIHx8IGNvbnN0YW50Q29udGV4dCA9PSBDb25zdGFudENvbnRleHQuaW5mZXJyZWQsCiAgICAgICAga2V5VHlwZSwKICAgICAgICB2YWx1ZVR5cGUsCiAgICAgICAgdHlwZUFyZ3VtZW50cywKICAgICAgICBsZWZ0QnJhY2UsCiAgICAgICAgZW50cmllcywKICAgICAgICBsZWZ0QnJhY2UuZW5kR3JvdXApOwogICAgbGlicmFyeS5jaGVja0JvdW5kc0luTWFwTGl0ZXJhbChub2RlLCB0eXBlRW52aXJvbm1lbnQpOwogICAgcHVzaChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTGl0ZXJhbE1hcEVudHJ5KFRva2VuIGNvbG9uLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiTGl0ZXJhbE1hcEVudHJ5Iik7CiAgICBFeHByZXNzaW9uIHZhbHVlID0gcG9wRm9yVmFsdWUoKTsKICAgIEV4cHJlc3Npb24ga2V5ID0gcG9wRm9yVmFsdWUoKTsKICAgIHB1c2goZm9yZXN0Lm1hcEVudHJ5KGtleSwgY29sb24sIHZhbHVlKSk7CiAgfQoKICBTdHJpbmcgc3ltYm9sUGFydFRvU3RyaW5nKG5hbWUpIHsKICAgIGlmIChuYW1lIGlzIElkZW50aWZpZXIpIHsKICAgICAgcmV0dXJuIG5hbWUubmFtZTsKICAgIH0gZWxzZSBpZiAobmFtZSBpcyBPcGVyYXRvcikgewogICAgICByZXR1cm4gbmFtZS5uYW1lOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHVuaGFuZGxlZCgiJHtuYW1lLnJ1bnRpbWVUeXBlfSIsICJzeW1ib2xQYXJ0VG9TdHJpbmciLCAtMSwgdXJpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTGl0ZXJhbFN5bWJvbChUb2tlbiBoYXNoVG9rZW4sIGludCBpZGVudGlmaWVyQ291bnQpIHsKICAgIGRlYnVnRXZlbnQoIkxpdGVyYWxTeW1ib2wiKTsKICAgIGlmIChpZGVudGlmaWVyQ291bnQgPT0gMSkgewogICAgICBPYmplY3QgcGFydCA9IHBvcCgpOwogICAgICBpZiAocGFydCBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICAgIHB1c2gobmV3IFBhcnNlckVycm9yR2VuZXJhdG9yKAogICAgICAgICAgICB0aGlzLCBoYXNoVG9rZW4sIGZhc3RhLm1lc3NhZ2VTeW50aGV0aWNUb2tlbikpOwogICAgICB9IGVsc2UgewogICAgICAgIHB1c2goZm9yZXN0LmxpdGVyYWxTeW1ib2xTaW5nbHVhcigKICAgICAgICAgICAgc3ltYm9sUGFydFRvU3RyaW5nKHBhcnQpLCBoYXNoVG9rZW4sIHBhcnQpKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgTGlzdDxJZGVudGlmaWVyPiBwYXJ0cyA9CiAgICAgICAgICBjb25zdCBGaXhlZE51bGxhYmxlTGlzdDxJZGVudGlmaWVyPigpLnBvcChzdGFjaywgaWRlbnRpZmllckNvdW50KTsKICAgICAgaWYgKHBhcnRzID09IG51bGwpIHsKICAgICAgICBwdXNoKG5ldyBQYXJzZXJFcnJvckdlbmVyYXRvcigKICAgICAgICAgICAgdGhpcywgaGFzaFRva2VuLCBmYXN0YS5tZXNzYWdlU3ludGhldGljVG9rZW4pKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgU3RyaW5nIHZhbHVlID0gc3ltYm9sUGFydFRvU3RyaW5nKHBhcnRzLmZpcnN0KTsKICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhbHVlICs9ICIuJHtzeW1ib2xQYXJ0VG9TdHJpbmcocGFydHNbaV0pfSI7CiAgICAgIH0KICAgICAgcHVzaChmb3Jlc3QubGl0ZXJhbFN5bWJvbE11bHRpcGxlKHZhbHVlLCBoYXNoVG9rZW4sIHBhcnRzKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vbk51bGxBc3NlcnRFeHByZXNzaW9uKFRva2VuIGJhbmcpIHsKICAgIHJlcG9ydE5vbk51bGxBc3NlcnRFeHByZXNzaW9uTm90RW5hYmxlZChiYW5nKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVHlwZShUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBxdWVzdGlvbk1hcmspIHsKICAgIC8vIFRPRE8oYWhlKTogVGhlIHNjb3BlIGlzIHdyb25nIGZvciByZXR1cm4gdHlwZXMgb2YgZ2VuZXJpYyBmdW5jdGlvbnMuCiAgICBkZWJ1Z0V2ZW50KCJUeXBlIik7CiAgICByZXBvcnRFcnJvcklmTnVsbGFibGVUeXBlKHF1ZXN0aW9uTWFyayk7CiAgICBMaXN0PFVucmVzb2x2ZWRUeXBlPEtlcm5lbFR5cGVCdWlsZGVyPj4gYXJndW1lbnRzID0gcG9wKCk7CiAgICBPYmplY3QgbmFtZSA9IHBvcCgpOwogICAgaWYgKG5hbWUgaXMgUXVhbGlmaWVkTmFtZSkgewogICAgICBRdWFsaWZpZWROYW1lIHF1YWxpZmllZCA9IG5hbWU7CiAgICAgIE9iamVjdCBwcmVmaXggPSBxdWFsaWZpZWQucXVhbGlmaWVyOwogICAgICBUb2tlbiBzdWZmaXggPSBkZXByZWNhdGVkX2V4dHJhY3RUb2tlbihxdWFsaWZpZWQpOwogICAgICBpZiAocHJlZml4IGlzIEdlbmVyYXRvcikgewogICAgICAgIG5hbWUgPSBwcmVmaXgucXVhbGlmaWVkTG9va3VwKHN1ZmZpeCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXROb2RlTmFtZShwcmVmaXgpOwogICAgICAgIFN0cmluZyBkaXNwbGF5TmFtZSA9IGRlYnVnTmFtZShuYW1lLCBzdWZmaXgubGV4ZW1lKTsKICAgICAgICBpbnQgb2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4oYmVnaW5Ub2tlbik7CiAgICAgICAgcHVzaChuZXcgVW5yZXNvbHZlZFR5cGU8S2VybmVsVHlwZUJ1aWxkZXI+KAogICAgICAgICAgICBuZXcgS2VybmVsTmFtZWRUeXBlQnVpbGRlcihuYW1lLCBudWxsKQogICAgICAgICAgICAgIC4uYmluZChuZXcgS2VybmVsSW52YWxpZFR5cGVCdWlsZGVyKAogICAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZU5vdEFUeXBlCiAgICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhkaXNwbGF5TmFtZSkKICAgICAgICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpLCBvZmZzZXQsIGxlbmd0aE9mU3BhbihiZWdpblRva2VuLCBzdWZmaXgpKSkpLAogICAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICAgIHVyaSkpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgS2VybmVsVHlwZUJ1aWxkZXIgcmVzdWx0OwogICAgaWYgKG5hbWUgaXMgR2VuZXJhdG9yKSB7CiAgICAgIHJlc3VsdCA9IG5hbWUuYnVpbGRUeXBlV2l0aFJlc29sdmVkQXJndW1lbnRzKGFyZ3VtZW50cyk7CiAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewogICAgICAgIHVuaGFuZGxlZCgibnVsbCIsICJyZXN1bHQiLCBiZWdpblRva2VuLmNoYXJPZmZzZXQsIHVyaSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobmFtZSBpcyBUeXBlQnVpbGRlcikgewogICAgICByZXN1bHQgPSBuYW1lLmJ1aWxkKGxpYnJhcnkpOwogICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKICAgICAgICB1bmhhbmRsZWQoIm51bGwiLCAicmVzdWx0IiwgYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0LCB1cmkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKG5hbWUgaXMgUHJvYmxlbUJ1aWxkZXIpIHsKICAgICAgLy8gVE9ETyhhaGUpOiBBcmd1bWVudHMgY291bGQgYmUgcGFzc2VkIGhlcmUuCiAgICAgIHJlc3VsdCA9IG5ldyBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyKG5hbWUubmFtZSwgbnVsbCkKICAgICAgICAuLmJpbmQobmV3IEtlcm5lbEludmFsaWRUeXBlQnVpbGRlcigKICAgICAgICAgICAgbmFtZS5uYW1lLAogICAgICAgICAgICBuYW1lLm1lc3NhZ2Uud2l0aExvY2F0aW9uKAogICAgICAgICAgICAgICAgbmFtZS5maWxlVXJpLCBuYW1lLmNoYXJPZmZzZXQsIG5hbWUubmFtZS5sZW5ndGgpKSk7CiAgICB9IGVsc2UgewogICAgICB1bmhhbmRsZWQoCiAgICAgICAgICAiJHtuYW1lLnJ1bnRpbWVUeXBlfSIsICJoYW5kbGVUeXBlIiwgYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0LCB1cmkpOwogICAgfQogICAgcHVzaChuZXcgVW5yZXNvbHZlZFR5cGU8S2VybmVsVHlwZUJ1aWxkZXI+KAogICAgICAgIHJlc3VsdCwgYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0LCB1cmkpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5GdW5jdGlvblR5cGUoVG9rZW4gYmVnaW5Ub2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5GdW5jdGlvblR5cGUiKTsKICB9CgogIHZvaWQgZW50ZXJGdW5jdGlvblR5cGVTY29wZShMaXN0PEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMpIHsKICAgIGRlYnVnRXZlbnQoImVudGVyRnVuY3Rpb25UeXBlU2NvcGUiKTsKICAgIGVudGVyTG9jYWxTY29wZShudWxsLAogICAgICAgIHNjb3BlLmNyZWF0ZU5lc3RlZFNjb3BlKCJmdW5jdGlvbi10eXBlIHNjb3BlIiwgaXNNb2RpZmlhYmxlOiB0cnVlKSk7CiAgICBpZiAodHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgIFNjb3BlQnVpbGRlciBzY29wZUJ1aWxkZXIgPSBuZXcgU2NvcGVCdWlsZGVyKHNjb3BlKTsKICAgICAgZm9yIChLZXJuZWxUeXBlVmFyaWFibGVCdWlsZGVyIGJ1aWxkZXIgaW4gdHlwZVZhcmlhYmxlcykgewogICAgICAgIFN0cmluZyBuYW1lID0gYnVpbGRlci5uYW1lOwogICAgICAgIEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXIgZXhpc3RpbmcgPSBzY29wZUJ1aWxkZXJbbmFtZV07CiAgICAgICAgaWYgKGV4aXN0aW5nID09IG51bGwpIHsKICAgICAgICAgIHNjb3BlQnVpbGRlci5hZGRNZW1iZXIobmFtZSwgYnVpbGRlcik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlcG9ydER1cGxpY2F0ZWREZWNsYXJhdGlvbihleGlzdGluZywgbmFtZSwgYnVpbGRlci5jaGFyT2Zmc2V0KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRnVuY3Rpb25UeXBlKFRva2VuIGZ1bmN0aW9uVG9rZW4sIFRva2VuIHF1ZXN0aW9uTWFyaykgewogICAgZGVidWdFdmVudCgiRnVuY3Rpb25UeXBlIik7CiAgICByZXBvcnRFcnJvcklmTnVsbGFibGVUeXBlKHF1ZXN0aW9uTWFyayk7CiAgICBGb3JtYWxQYXJhbWV0ZXJzIGZvcm1hbHMgPSBwb3AoKTsKICAgIFVucmVzb2x2ZWRUeXBlPEtlcm5lbFR5cGVCdWlsZGVyPiByZXR1cm5UeXBlID0gcG9wKCk7CiAgICBMaXN0PEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMgPSBwb3AoKTsKICAgIFVucmVzb2x2ZWRUeXBlPEtlcm5lbFR5cGVCdWlsZGVyPiB0eXBlID0KICAgICAgICBmb3JtYWxzLnRvRnVuY3Rpb25UeXBlKHJldHVyblR5cGUsIHR5cGVWYXJpYWJsZXMpOwogICAgZXhpdExvY2FsU2NvcGUoKTsKICAgIHB1c2godHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVZvaWRLZXl3b3JkKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJWb2lkS2V5d29yZCIpOwogICAgaW50IG9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIHB1c2gobmV3IFVucmVzb2x2ZWRUeXBlPEtlcm5lbFR5cGVCdWlsZGVyPigKICAgICAgICBuZXcgS2VybmVsTmFtZWRUeXBlQnVpbGRlcigidm9pZCIsIG51bGwpCiAgICAgICAgICAuLmJpbmQobmV3IFZvaWRUeXBlQnVpbGRlcjxLZXJuZWxUeXBlQnVpbGRlciwgVm9pZFR5cGU+KAogICAgICAgICAgICAgIGNvbnN0IFZvaWRUeXBlKCksIGxpYnJhcnksIG9mZnNldCkpLAogICAgICAgIG9mZnNldCwKICAgICAgICB1cmkpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQXNPcGVyYXRvcihUb2tlbiBvcGVyYXRvcikgewogICAgZGVidWdFdmVudCgiQXNPcGVyYXRvciIpOwogICAgRGFydFR5cGUgdHlwZSA9IGJ1aWxkRGFydFR5cGUocG9wKCkpOwogICAgbGlicmFyeS5jaGVja0JvdW5kc0luVHlwZSh0eXBlLCB0eXBlRW52aXJvbm1lbnQsIG9wZXJhdG9yLmNoYXJPZmZzZXQpOwogICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcG9wRm9yVmFsdWUoKTsKICAgIGlmICghbGlicmFyeS5sb2FkZXIudGFyZ2V0LmVuYWJsZUNvbnN0YW50VXBkYXRlMjAxOCAmJgogICAgICAgIGNvbnN0YW50Q29udGV4dCAhPSBDb25zdGFudENvbnRleHQubm9uZSkgewogICAgICBwdXNoKGRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKGJ1aWxkUHJvYmxlbSgKICAgICAgICAgIGZhc3RhLnRlbXBsYXRlTm90Q29uc3RhbnRFeHByZXNzaW9uLndpdGhBcmd1bWVudHMoJ0FzIGV4cHJlc3Npb24nKSwKICAgICAgICAgIG9wZXJhdG9yLmNoYXJPZmZzZXQsCiAgICAgICAgICBvcGVyYXRvci5sZW5ndGgpKSk7CiAgICB9IGVsc2UgewogICAgICBFeHByZXNzaW9uIG5vZGUgPSBmb3Jlc3QuYXNFeHByZXNzaW9uKGV4cHJlc3Npb24sIHR5cGUsIG9wZXJhdG9yKTsKICAgICAgcHVzaChub2RlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSXNPcGVyYXRvcihUb2tlbiBpc09wZXJhdG9yLCBUb2tlbiBub3QpIHsKICAgIGRlYnVnRXZlbnQoIklzT3BlcmF0b3IiKTsKICAgIERhcnRUeXBlIHR5cGUgPSBidWlsZERhcnRUeXBlKHBvcCgpKTsKICAgIEV4cHJlc3Npb24gb3BlcmFuZCA9IHBvcEZvclZhbHVlKCk7CiAgICBib29sIGlzSW52ZXJ0ZWQgPSBub3QgIT0gbnVsbDsKICAgIEV4cHJlc3Npb24gaXNFeHByZXNzaW9uID0KICAgICAgICBmb3Jlc3QuaXNFeHByZXNzaW9uKG9wZXJhbmQsIGlzT3BlcmF0b3IsIG5vdCwgdHlwZSk7CiAgICBsaWJyYXJ5LmNoZWNrQm91bmRzSW5UeXBlKHR5cGUsIHR5cGVFbnZpcm9ubWVudCwgaXNPcGVyYXRvci5jaGFyT2Zmc2V0KTsKICAgIGlmIChvcGVyYW5kIGlzIFZhcmlhYmxlR2V0KSB7CiAgICAgIHR5cGVQcm9tb3Rlcj8uaGFuZGxlSXNDaGVjayhpc0V4cHJlc3Npb24sIGlzSW52ZXJ0ZWQsIG9wZXJhbmQudmFyaWFibGUsCiAgICAgICAgICB0eXBlLCBmdW5jdGlvbk5lc3RpbmdMZXZlbCk7CiAgICB9CiAgICBpZiAoIWxpYnJhcnkubG9hZGVyLnRhcmdldC5lbmFibGVDb25zdGFudFVwZGF0ZTIwMTggJiYKICAgICAgICBjb25zdGFudENvbnRleHQgIT0gQ29uc3RhbnRDb250ZXh0Lm5vbmUpIHsKICAgICAgcHVzaChkZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihidWlsZFByb2JsZW0oCiAgICAgICAgICBmYXN0YS50ZW1wbGF0ZU5vdENvbnN0YW50RXhwcmVzc2lvbi53aXRoQXJndW1lbnRzKCdJcyBleHByZXNzaW9uJyksCiAgICAgICAgICBpc09wZXJhdG9yLmNoYXJPZmZzZXQsCiAgICAgICAgICBpc09wZXJhdG9yLmxlbmd0aCkpKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2goaXNFeHByZXNzaW9uKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Db25kaXRpb25hbEV4cHJlc3Npb24oVG9rZW4gcXVlc3Rpb24pIHsKICAgIEV4cHJlc3Npb24gY29uZGl0aW9uID0gcG9wRm9yVmFsdWUoKTsKICAgIHR5cGVQcm9tb3Rlcj8uZW50ZXJUaGVuKGNvbmRpdGlvbik7CiAgICBwdXNoKGNvbmRpdGlvbik7CiAgICBzdXBlci5iZWdpbkNvbmRpdGlvbmFsRXhwcmVzc2lvbihxdWVzdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNvbmRpdGlvbmFsRXhwcmVzc2lvbkNvbG9uKCkgewogICAgRXhwcmVzc2lvbiB0aGVuID0gcG9wRm9yVmFsdWUoKTsKICAgIHR5cGVQcm9tb3Rlcj8uZW50ZXJFbHNlKCk7CiAgICBwdXNoKHRoZW4pOwogICAgc3VwZXIuaGFuZGxlQ29uZGl0aW9uYWxFeHByZXNzaW9uQ29sb24oKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ29uZGl0aW9uYWxFeHByZXNzaW9uKFRva2VuIHF1ZXN0aW9uLCBUb2tlbiBjb2xvbikgewogICAgZGVidWdFdmVudCgiQ29uZGl0aW9uYWxFeHByZXNzaW9uIik7CiAgICBFeHByZXNzaW9uIGVsc2VFeHByZXNzaW9uID0gcG9wRm9yVmFsdWUoKTsKICAgIEV4cHJlc3Npb24gdGhlbkV4cHJlc3Npb24gPSBwb3AoKTsKICAgIEV4cHJlc3Npb24gY29uZGl0aW9uID0gcG9wKCk7CiAgICB0eXBlUHJvbW90ZXI/LmV4aXRDb25kaXRpb25hbCgpOwogICAgcHVzaChmb3Jlc3QuY29uZGl0aW9uYWxFeHByZXNzaW9uKAogICAgICAgIGNvbmRpdGlvbiwgcXVlc3Rpb24sIHRoZW5FeHByZXNzaW9uLCBjb2xvbiwgZWxzZUV4cHJlc3Npb24pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVGhyb3dFeHByZXNzaW9uKFRva2VuIHRocm93VG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJUaHJvd0V4cHJlc3Npb24iKTsKICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBvcEZvclZhbHVlKCk7CiAgICBpZiAoY29uc3RhbnRDb250ZXh0ICE9IENvbnN0YW50Q29udGV4dC5ub25lKSB7CiAgICAgIHB1c2goYnVpbGRQcm9ibGVtKAogICAgICAgICAgZmFzdGEudGVtcGxhdGVOb3RDb25zdGFudEV4cHJlc3Npb24ud2l0aEFyZ3VtZW50cygnVGhyb3cnKSwKICAgICAgICAgIHRocm93VG9rZW4ub2Zmc2V0LAogICAgICAgICAgdGhyb3dUb2tlbi5sZW5ndGgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2goZm9yZXN0LnRocm93RXhwcmVzc2lvbih0aHJvd1Rva2VuLCBleHByZXNzaW9uKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRm9ybWFsUGFyYW1ldGVyKFRva2VuIHRva2VuLCBNZW1iZXJLaW5kIGtpbmQsIFRva2VuIGNvdmFyaWFudFRva2VuLAogICAgICBUb2tlbiB2YXJGaW5hbE9yQ29uc3QpIHsKICAgIHB1c2goKGNvdmFyaWFudFRva2VuICE9IG51bGwgPyBjb3ZhcmlhbnRNYXNrIDogMCkgfAogICAgICAgIE1vZGlmaWVyLnZhbGlkYXRlVmFyRmluYWxPckNvbnN0KHZhckZpbmFsT3JDb25zdD8ubGV4ZW1lKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZvcm1hbFBhcmFtZXRlcihUb2tlbiB0aGlzS2V5d29yZCwgVG9rZW4gcGVyaW9kQWZ0ZXJUaGlzLAogICAgICBUb2tlbiBuYW1lVG9rZW4sIEZvcm1hbFBhcmFtZXRlcktpbmQga2luZCwgTWVtYmVyS2luZCBtZW1iZXJLaW5kKSB7CiAgICBkZWJ1Z0V2ZW50KCJGb3JtYWxQYXJhbWV0ZXIiKTsKICAgIGlmICh0aGlzS2V5d29yZCAhPSBudWxsKSB7CiAgICAgIGlmICghaW5Db25zdHJ1Y3RvcikgewogICAgICAgIGhhbmRsZVJlY292ZXJhYmxlRXJyb3IoZmFzdGEubWVzc2FnZUZpZWxkSW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3IsCiAgICAgICAgICAgIHRoaXNLZXl3b3JkLCB0aGlzS2V5d29yZCk7CiAgICAgICAgdGhpc0tleXdvcmQgPSBudWxsOwogICAgICB9CiAgICB9CiAgICBPYmplY3QgbmFtZU5vZGUgPSBwb3AoKTsKICAgIFVucmVzb2x2ZWRUeXBlPEtlcm5lbFR5cGVCdWlsZGVyPiB0eXBlID0gcG9wKCk7CiAgICBpZiAoZnVuY3Rpb25OZXN0aW5nTGV2ZWwgPT0gMCkgewogICAgICAvLyBUT0RPKGFoZSk6IFRoZSB0eXBlIHdlIGNvbXB1dGUgaGVyZSBtYXkgYmUgZGlmZmVyZW50IGZyb20gd2hhdCBpcwogICAgICAvLyBjb21wdXRlZCBpbiB0aGUgb3V0bGluZSBwaGFzZS4gV2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHRoZSBvdXRsaW5lCiAgICAgIC8vIHBoYXNlIGNvbXB1dGVzIHRoZSBzYW1lIHR5cGUuIFNlZQogICAgICAvLyBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9kZWZlcnJlZF90eXBlX2Fubm90YXRpb24uZGFydCBmb3IgYW4gZXhhbXBsZQogICAgICAvLyB3aGVyZSBub3QgY2FsbGluZyBbYnVpbGREYXJ0VHlwZV0gbGVhZHMgdG8gYSBtaXNzaW5nIGNvbXBpbGUtdGltZQogICAgICAvLyBlcnJvci4gQWxzbywgbm90aWNlIHRoYXQgdGhlIHR5cGUgb2YgdGhlIHByb2JsZW1hdGljIHBhcmFtZXRlciBpc24ndAogICAgICAvLyBgaW52YWxpZC10eXBlYC4KICAgICAgYnVpbGREYXJ0VHlwZSh0eXBlKTsKICAgIH0KICAgIGludCBtb2RpZmllcnMgPSBwb3AoKTsKICAgIGlmIChpbkNhdGNoQ2xhdXNlKSB7CiAgICAgIG1vZGlmaWVycyB8PSBmaW5hbE1hc2s7CiAgICB9CiAgICBMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zID0gcG9wKCk7CiAgICBpZiAobmFtZU5vZGUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHVzaChuYW1lTm9kZSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIElkZW50aWZpZXIgbmFtZSA9IG5hbWVOb2RlOwogICAgS2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBwYXJhbWV0ZXI7CiAgICBpZiAoIWluQ2F0Y2hDbGF1c2UgJiYKICAgICAgICBmdW5jdGlvbk5lc3RpbmdMZXZlbCA9PSAwICYmCiAgICAgICAgbWVtYmVyS2luZCAhPSBNZW1iZXJLaW5kLkdlbmVyYWxpemVkRnVuY3Rpb25UeXBlKSB7CiAgICAgIFByb2NlZHVyZUJ1aWxkZXI8VHlwZUJ1aWxkZXI+IG1lbWJlciA9IHRoaXMubWVtYmVyOwogICAgICBwYXJhbWV0ZXIgPSBtZW1iZXIuZ2V0Rm9ybWFsKG5hbWUubmFtZSk7CiAgICAgIGlmIChwYXJhbWV0ZXIgPT0gbnVsbCkgewogICAgICAgIHB1c2gobmV3IFBhcnNlclJlY292ZXJ5KG5hbWVUb2tlbi5jaGFyT2Zmc2V0KSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBwYXJhbWV0ZXIgPSBuZXcgS2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlcihudWxsLCBtb2RpZmllcnMsCiAgICAgICAgICB0eXBlPy5idWlsZGVyLCBuYW1lPy5uYW1lLCBsaWJyYXJ5LCBvZmZzZXRGb3JUb2tlbihuYW1lVG9rZW4pKTsKICAgIH0KICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPQogICAgICAgIHBhcmFtZXRlci5idWlsZChsaWJyYXJ5LCBmdW5jdGlvbk5lc3RpbmdMZXZlbCk7CiAgICBFeHByZXNzaW9uIGluaXRpYWxpemVyID0gbmFtZT8uaW5pdGlhbGl6ZXI7CiAgICBpZiAoaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICBpZiAobWVtYmVyIGlzIEtlcm5lbFJlZGlyZWN0aW5nRmFjdG9yeUJ1aWxkZXIpIHsKICAgICAgICBLZXJuZWxSZWRpcmVjdGluZ0ZhY3RvcnlCdWlsZGVyIGZhY3RvcnkgPSBtZW1iZXI7CiAgICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVEZWZhdWx0VmFsdWVJblJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yCiAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhmYWN0b3J5LnJlZGlyZWN0aW9uVGFyZ2V0LmZ1bGxOYW1lRm9yRXJyb3JzKSwKICAgICAgICAgICAgaW5pdGlhbGl6ZXIuZmlsZU9mZnNldCwKICAgICAgICAgICAgbm9MZW5ndGgpOwogICAgICB9IGVsc2UgewogICAgICAgIHZhcmlhYmxlLmluaXRpYWxpemVyID0gaW5pdGlhbGl6ZXIuLnBhcmVudCA9IHZhcmlhYmxlOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGtpbmQgIT0gRm9ybWFsUGFyYW1ldGVyS2luZC5tYW5kYXRvcnkpIHsKICAgICAgdmFyaWFibGUuaW5pdGlhbGl6ZXIgPz89IGZvcmVzdC5saXRlcmFsTnVsbChudWxsKS4ucGFyZW50ID0gdmFyaWFibGU7CiAgICB9CiAgICBpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgewogICAgICBpZiAoZnVuY3Rpb25OZXN0aW5nTGV2ZWwgPT0gMCkgewogICAgICAgIGluZmVyQW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOwogICAgICB9CiAgICAgIGZvciAoRXhwcmVzc2lvbiBhbm5vdGF0aW9uIGluIGFubm90YXRpb25zKSB7CiAgICAgICAgdmFyaWFibGUuYWRkQW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKICAgICAgfQogICAgfQogICAgcHVzaChwYXJhbWV0ZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRPcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMoCiAgICAgIGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIk9wdGlvbmFsRm9ybWFsUGFyYW1ldGVycyIpOwogICAgRm9ybWFsUGFyYW1ldGVyS2luZCBraW5kID0gb3B0aW9uYWwoInsiLCBiZWdpblRva2VuKQogICAgICAgID8gRm9ybWFsUGFyYW1ldGVyS2luZC5vcHRpb25hbE5hbWVkCiAgICAgICAgOiBGb3JtYWxQYXJhbWV0ZXJLaW5kLm9wdGlvbmFsUG9zaXRpb25hbDsKICAgIC8vIFdoZW4gcmVjb3ZlcmluZyBmcm9tIGFuIGVtcHR5IGxpc3Qgb2Ygb3B0aW9uYWwgYXJndW1lbnRzLCBjb3VudCBtYXkgYmUKICAgIC8vIDAuIEl0IG1pZ2h0IGJlIHNpbXBsZXIgaWYgdGhlIHBhcnNlciBkaWRuJ3QgY2FsbCB0aGlzIG1ldGhvZCBpbiB0aGF0CiAgICAvLyBjYXNlLCBob3dldmVyLCB0aGVuIFtiZWdpbk9wdGlvbmFsRm9ybWFsUGFyYW1ldGVyc10gd291bGRuJ3QgYWx3YXlzIGJlCiAgICAvLyBtYXRjaGVkIGJ5IHRoaXMgbWV0aG9kLgogICAgTGlzdDxLZXJuZWxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBwYXJhbWV0ZXJzID0KICAgICAgICBjb25zdCBGaXhlZE51bGxhYmxlTGlzdDxLZXJuZWxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPigpCiAgICAgICAgICAgIC5wb3Aoc3RhY2ssIGNvdW50KTsKICAgIGlmIChwYXJhbWV0ZXJzID09IG51bGwpIHsKICAgICAgcHVzaChuZXcgUGFyc2VyUmVjb3Zlcnkob2Zmc2V0Rm9yVG9rZW4oYmVnaW5Ub2tlbikpKTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoS2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBwYXJhbWV0ZXIgaW4gcGFyYW1ldGVycykgewogICAgICAgIHBhcmFtZXRlci5raW5kID0ga2luZDsKICAgICAgfQogICAgICBwdXNoKHBhcmFtZXRlcnMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXIoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luRnVuY3Rpb25UeXBlZEZvcm1hbFBhcmFtZXRlciIpOwogICAgZnVuY3Rpb25OZXN0aW5nTGV2ZWwrKzsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRnVuY3Rpb25UeXBlZEZvcm1hbFBhcmFtZXRlcihUb2tlbiBuYW1lVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXIiKTsKICAgIGlmIChpbkNhdGNoQ2xhdXNlIHx8IGZ1bmN0aW9uTmVzdGluZ0xldmVsICE9IDApIHsKICAgICAgZXhpdExvY2FsU2NvcGUoKTsKICAgIH0KICAgIEZvcm1hbFBhcmFtZXRlcnMgZm9ybWFscyA9IHBvcCgpOwogICAgVW5yZXNvbHZlZFR5cGU8S2VybmVsVHlwZUJ1aWxkZXI+IHJldHVyblR5cGUgPSBwb3AoKTsKICAgIExpc3Q8S2VybmVsVHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcyA9IHBvcCgpOwogICAgVW5yZXNvbHZlZFR5cGU8S2VybmVsVHlwZUJ1aWxkZXI+IHR5cGUgPQogICAgICAgIGZvcm1hbHMudG9GdW5jdGlvblR5cGUocmV0dXJuVHlwZSwgdHlwZVZhcmlhYmxlcyk7CiAgICBleGl0TG9jYWxTY29wZSgpOwogICAgcHVzaCh0eXBlKTsKICAgIGZ1bmN0aW9uTmVzdGluZ0xldmVsLS07CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRm9ybWFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlRXhwcmVzc2lvbigpIHsKICAgIHN1cGVyLnB1c2goY29uc3RhbnRDb250ZXh0KTsKICAgIGNvbnN0YW50Q29udGV4dCA9IENvbnN0YW50Q29udGV4dC5yZXF1aXJlZDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9ybWFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlRXhwcmVzc2lvbigpIHsKICAgIGRlYnVnRXZlbnQoIkZvcm1hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZUV4cHJlc3Npb24iKTsKICAgIE9iamVjdCBkZWZhdWx0VmFsdWVFeHByZXNzaW9uID0gcG9wKCk7CiAgICBjb25zdGFudENvbnRleHQgPSBwb3AoKTsKICAgIHB1c2goZGVmYXVsdFZhbHVlRXhwcmVzc2lvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVZhbHVlZEZvcm1hbFBhcmFtZXRlcihUb2tlbiBlcXVhbHMsIFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJWYWx1ZWRGb3JtYWxQYXJhbWV0ZXIiKTsKICAgIEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIgPSBwb3BGb3JWYWx1ZSgpOwogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIGlmIChuYW1lIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIHB1c2gobmFtZSk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKG5ldyBJbml0aWFsaXplZElkZW50aWZpZXIobmFtZSwgaW5pdGlhbGl6ZXIpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRm9ybWFsUGFyYW1ldGVyV2l0aG91dFZhbHVlKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJGb3JtYWxQYXJhbWV0ZXJXaXRob3V0VmFsdWUiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Gb3JtYWxQYXJhbWV0ZXJzKFRva2VuIHRva2VuLCBNZW1iZXJLaW5kIGtpbmQpIHsKICAgIHN1cGVyLnB1c2goY29uc3RhbnRDb250ZXh0KTsKICAgIGNvbnN0YW50Q29udGV4dCA9IENvbnN0YW50Q29udGV4dC5ub25lOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JtYWxQYXJhbWV0ZXJzKAogICAgICBpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuLCBNZW1iZXJLaW5kIGtpbmQpIHsKICAgIGRlYnVnRXZlbnQoIkZvcm1hbFBhcmFtZXRlcnMiKTsKICAgIExpc3Q8S2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gb3B0aW9uYWxzOwogICAgaW50IG9wdGlvbmFsc0NvdW50ID0gMDsKICAgIGlmIChjb3VudCA+IDAgJiYgcGVlaygpIGlzIExpc3Q8S2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4pIHsKICAgICAgb3B0aW9uYWxzID0gcG9wKCk7CiAgICAgIGNvdW50LS07CiAgICAgIG9wdGlvbmFsc0NvdW50ID0gb3B0aW9uYWxzLmxlbmd0aDsKICAgIH0KICAgIExpc3Q8S2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gcGFyYW1ldGVycyA9CiAgICAgICAgY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8S2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4oKQogICAgICAgICAgICAucG9wUGFkZGVkKHN0YWNrLCBjb3VudCwgb3B0aW9uYWxzQ291bnQpOwogICAgaWYgKG9wdGlvbmFscyAhPSBudWxsICYmIHBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICBwYXJhbWV0ZXJzLnNldFJhbmdlKGNvdW50LCBjb3VudCArIG9wdGlvbmFsc0NvdW50LCBvcHRpb25hbHMpOwogICAgfQogICAgYXNzZXJ0KHBhcmFtZXRlcnM/LmlzTm90RW1wdHkgPz8gdHJ1ZSk7CiAgICBGb3JtYWxQYXJhbWV0ZXJzIGZvcm1hbHMgPSBuZXcgRm9ybWFsUGFyYW1ldGVycyhwYXJhbWV0ZXJzLAogICAgICAgIG9mZnNldEZvclRva2VuKGJlZ2luVG9rZW4pLCBsZW5ndGhPZlNwYW4oYmVnaW5Ub2tlbiwgZW5kVG9rZW4pLCB1cmkpOwogICAgY29uc3RhbnRDb250ZXh0ID0gcG9wKCk7CiAgICBwdXNoKGZvcm1hbHMpOwogICAgaWYgKChpbkNhdGNoQ2xhdXNlIHx8IGZ1bmN0aW9uTmVzdGluZ0xldmVsICE9IDApICYmCiAgICAgICAga2luZCAhPSBNZW1iZXJLaW5kLkdlbmVyYWxpemVkRnVuY3Rpb25UeXBlKSB7CiAgICAgIGVudGVyTG9jYWxTY29wZSgKICAgICAgICAgIG51bGwsCiAgICAgICAgICBmb3JtYWxzLmNvbXB1dGVGb3JtYWxQYXJhbWV0ZXJTY29wZSgKICAgICAgICAgICAgICBzY29wZSwgbWVtYmVyID8/IGNsYXNzQnVpbGRlciA/PyBsaWJyYXJ5LCB0aGlzKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ2F0Y2hDbGF1c2UoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luQ2F0Y2hDbGF1c2UiKTsKICAgIGluQ2F0Y2hDbGF1c2UgPSB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDYXRjaENsYXVzZShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiQ2F0Y2hDbGF1c2UiKTsKICAgIGluQ2F0Y2hDbGF1c2UgPSBmYWxzZTsKICAgIHB1c2goaW5DYXRjaEJsb2NrKTsKICAgIGluQ2F0Y2hCbG9jayA9IHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNhdGNoQmxvY2soVG9rZW4gb25LZXl3b3JkLCBUb2tlbiBjYXRjaEtleXdvcmQsIFRva2VuIGNvbW1hKSB7CiAgICBkZWJ1Z0V2ZW50KCJDYXRjaEJsb2NrIik7CiAgICBTdGF0ZW1lbnQgYm9keSA9IHBvcCgpOwogICAgaW5DYXRjaEJsb2NrID0gcG9wKCk7CiAgICBpZiAoY2F0Y2hLZXl3b3JkICE9IG51bGwpIHsKICAgICAgZXhpdExvY2FsU2NvcGUoKTsKICAgIH0KICAgIEZvcm1hbFBhcmFtZXRlcnMgY2F0Y2hQYXJhbWV0ZXJzID0gcG9wSWZOb3ROdWxsKGNhdGNoS2V5d29yZCk7CiAgICBEYXJ0VHlwZSBleGNlcHRpb25UeXBlID0KICAgICAgICBidWlsZERhcnRUeXBlKHBvcElmTm90TnVsbChvbktleXdvcmQpKSA/PyBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgS2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBleGNlcHRpb247CiAgICBLZXJuZWxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIHN0YWNrVHJhY2U7CiAgICBMaXN0PFN0YXRlbWVudD4gY29tcGlsZVRpbWVFcnJvcnM7CiAgICBpZiAoY2F0Y2hQYXJhbWV0ZXJzPy5wYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgaW50IHBhcmFtZXRlckNvdW50ID0gY2F0Y2hQYXJhbWV0ZXJzLnBhcmFtZXRlcnMubGVuZ3RoOwogICAgICBpZiAocGFyYW1ldGVyQ291bnQgPiAwKSB7CiAgICAgICAgZXhjZXB0aW9uID0gY2F0Y2hQYXJhbWV0ZXJzLnBhcmFtZXRlcnNbMF07CiAgICAgICAgZXhjZXB0aW9uLmJ1aWxkKGxpYnJhcnksIGZ1bmN0aW9uTmVzdGluZ0xldmVsKS50eXBlID0gZXhjZXB0aW9uVHlwZTsKICAgICAgICBpZiAocGFyYW1ldGVyQ291bnQgPiAxKSB7CiAgICAgICAgICBzdGFja1RyYWNlID0gY2F0Y2hQYXJhbWV0ZXJzLnBhcmFtZXRlcnNbMV07CiAgICAgICAgICBzdGFja1RyYWNlLmJ1aWxkKGxpYnJhcnksIGZ1bmN0aW9uTmVzdGluZ0xldmVsKS50eXBlID0KICAgICAgICAgICAgICBjb3JlVHlwZXMuc3RhY2tUcmFjZUNsYXNzLnJhd1R5cGU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwYXJhbWV0ZXJDb3VudCA+IDIpIHsKICAgICAgICAvLyBJZiBwYXJhbWV0ZXJDb3VudCBpcyAwLCB0aGUgcGFyc2VyIHJlcG9ydGVkIGFuIGVycm9yIGFscmVhZHkuCiAgICAgICAgaWYgKHBhcmFtZXRlckNvdW50ICE9IDApIHsKICAgICAgICAgIGZvciAoaW50IGkgPSAyOyBpIDwgcGFyYW1ldGVyQ291bnQ7IGkrKykgewogICAgICAgICAgICBLZXJuZWxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIHBhcmFtZXRlciA9CiAgICAgICAgICAgICAgICBjYXRjaFBhcmFtZXRlcnMucGFyYW1ldGVyc1tpXTsKICAgICAgICAgICAgY29tcGlsZVRpbWVFcnJvcnMgPz89IDxTdGF0ZW1lbnQ+W107CiAgICAgICAgICAgIGNvbXBpbGVUaW1lRXJyb3JzLmFkZChidWlsZFByb2JsZW1TdGF0ZW1lbnQoCiAgICAgICAgICAgICAgICBmYXN0YS5tZXNzYWdlQ2F0Y2hTeW50YXhFeHRyYVBhcmFtZXRlcnMsIHBhcmFtZXRlci5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgbGVuZ3RoOiBwYXJhbWV0ZXIubmFtZS5sZW5ndGgpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHB1c2goZm9yZXN0LmNhdGNoQ2xhdXNlKAogICAgICAgIG9uS2V5d29yZCwKICAgICAgICBleGNlcHRpb25UeXBlLAogICAgICAgIGNhdGNoS2V5d29yZCwKICAgICAgICBleGNlcHRpb24/LnRhcmdldCwKICAgICAgICBzdGFja1RyYWNlPy50YXJnZXQsCiAgICAgICAgY29yZVR5cGVzLnN0YWNrVHJhY2VDbGFzcy5yYXdUeXBlLAogICAgICAgIGJvZHkpKTsKICAgIGlmIChjb21waWxlVGltZUVycm9ycyA9PSBudWxsKSB7CiAgICAgIHB1c2goTnVsbFZhbHVlLkJsb2NrKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2goZm9yZXN0LmJsb2NrKG51bGwsIGNvbXBpbGVUaW1lRXJyb3JzLCBudWxsKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFRyeVN0YXRlbWVudChpbnQgY2F0Y2hDb3VudCwgVG9rZW4gdHJ5S2V5d29yZCwgVG9rZW4gZmluYWxseUtleXdvcmQpIHsKICAgIFN0YXRlbWVudCBmaW5hbGx5QmxvY2sgPSBwb3BTdGF0ZW1lbnRJZk5vdE51bGwoZmluYWxseUtleXdvcmQpOwogICAgTGlzdDxDYXRjaD4gY2F0Y2hCbG9ja3M7CiAgICBMaXN0PFN0YXRlbWVudD4gY29tcGlsZVRpbWVFcnJvcnM7CiAgICBpZiAoY2F0Y2hDb3VudCAhPSAwKSB7CiAgICAgIExpc3Q8T2JqZWN0PiBjYXRjaEJsb2Nrc0FuZEVycm9ycyA9CiAgICAgICAgICBjb25zdCBGaXhlZE51bGxhYmxlTGlzdDxPYmplY3Q+KCkucG9wKHN0YWNrLCBjYXRjaENvdW50ICogMik7CiAgICAgIGNhdGNoQmxvY2tzID0gbmV3IExpc3Q8Q2F0Y2g+LmZpbGxlZChjYXRjaENvdW50LCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2F0Y2hDb3VudDsgaSsrKSB7CiAgICAgICAgY2F0Y2hCbG9ja3NbaV0gPSBjYXRjaEJsb2Nrc0FuZEVycm9yc1tpICogMl07CiAgICAgICAgU3RhdGVtZW50IGVycm9yID0gY2F0Y2hCbG9ja3NBbmRFcnJvcnNbaSAqIDIgKyAxXTsKICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkgewogICAgICAgICAgY29tcGlsZVRpbWVFcnJvcnMgPz89IDxTdGF0ZW1lbnQ+W107CiAgICAgICAgICBjb21waWxlVGltZUVycm9ycy5hZGQoZXJyb3IpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgU3RhdGVtZW50IHRyeUJsb2NrID0gcG9wU3RhdGVtZW50KCk7CiAgICBTdGF0ZW1lbnQgdHJ5U3RhdGVtZW50ID0gZm9yZXN0LnRyeVN0YXRlbWVudCgKICAgICAgICB0cnlLZXl3b3JkLCB0cnlCbG9jaywgY2F0Y2hCbG9ja3MsIGZpbmFsbHlLZXl3b3JkLCBmaW5hbGx5QmxvY2spOwogICAgaWYgKGNvbXBpbGVUaW1lRXJyb3JzICE9IG51bGwpIHsKICAgICAgY29tcGlsZVRpbWVFcnJvcnMuYWRkKHRyeVN0YXRlbWVudCk7CiAgICAgIHB1c2goZm9yZXN0LmJsb2NrKG51bGwsIGNvbXBpbGVUaW1lRXJyb3JzLCBudWxsKSk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKHRyeVN0YXRlbWVudCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUluZGV4ZWRFeHByZXNzaW9uKAogICAgICBUb2tlbiBvcGVuU3F1YXJlQnJhY2tldCwgVG9rZW4gY2xvc2VTcXVhcmVCcmFja2V0KSB7CiAgICBkZWJ1Z0V2ZW50KCJJbmRleGVkRXhwcmVzc2lvbiIpOwogICAgRXhwcmVzc2lvbiBpbmRleCA9IHBvcEZvclZhbHVlKCk7CiAgICBPYmplY3QgcmVjZWl2ZXIgPSBwb3AoKTsKICAgIGlmIChyZWNlaXZlciBpcyBUaGlzQWNjZXNzR2VuZXJhdG9yICYmIHJlY2VpdmVyLmlzU3VwZXIpIHsKICAgICAgcHVzaChuZXcgU3VwZXJJbmRleGVkQWNjZXNzR2VuZXJhdG9yKAogICAgICAgICAgdGhpcywKICAgICAgICAgIG9wZW5TcXVhcmVCcmFja2V0LAogICAgICAgICAgaW5kZXgsCiAgICAgICAgICBsb29rdXBJbnN0YW5jZU1lbWJlcihpbmRleEdldE5hbWUsIGlzU3VwZXI6IHRydWUpLAogICAgICAgICAgbG9va3VwSW5zdGFuY2VNZW1iZXIoaW5kZXhTZXROYW1lLCBpc1N1cGVyOiB0cnVlKSkpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChJbmRleGVkQWNjZXNzR2VuZXJhdG9yLm1ha2UoCiAgICAgICAgICB0aGlzLCBvcGVuU3F1YXJlQnJhY2tldCwgdG9WYWx1ZShyZWNlaXZlciksIGluZGV4LCBudWxsLCBudWxsKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVVuYXJ5UHJlZml4RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiVW5hcnlQcmVmaXhFeHByZXNzaW9uIik7CiAgICBPYmplY3QgcmVjZWl2ZXIgPSBwb3AoKTsKICAgIGlmIChvcHRpb25hbCgiISIsIHRva2VuKSkgewogICAgICBwdXNoKGZvcmVzdC5ub3RFeHByZXNzaW9uKHRvVmFsdWUocmVjZWl2ZXIpLCB0b2tlbiwgZmFsc2UpKTsKICAgIH0gZWxzZSB7CiAgICAgIFN0cmluZyBvcGVyYXRvciA9IHRva2VuLnN0cmluZ1ZhbHVlOwogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyVmFsdWU7CiAgICAgIGlmIChvcHRpb25hbCgiLSIsIHRva2VuKSkgewogICAgICAgIG9wZXJhdG9yID0gInVuYXJ5LSI7CiAgICAgIH0KICAgICAgYm9vbCBpc1N1cGVyID0gZmFsc2U7CiAgICAgIGlmIChyZWNlaXZlciBpcyBUaGlzQWNjZXNzR2VuZXJhdG9yICYmIHJlY2VpdmVyLmlzU3VwZXIpIHsKICAgICAgICBpc1N1cGVyID0gdHJ1ZTsKICAgICAgICByZWNlaXZlclZhbHVlID0gZm9yZXN0LnRoaXNFeHByZXNzaW9uKHJlY2VpdmVyLnRva2VuKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZWNlaXZlclZhbHVlID0gdG9WYWx1ZShyZWNlaXZlcik7CiAgICAgIH0KICAgICAgcHVzaChidWlsZE1ldGhvZEludm9jYXRpb24ocmVjZWl2ZXJWYWx1ZSwgbmV3IE5hbWUob3BlcmF0b3IpLAogICAgICAgICAgZm9yZXN0LmFyZ3VtZW50c0VtcHR5KG5vTG9jYXRpb24pLCB0b2tlbi5jaGFyT2Zmc2V0LAogICAgICAgICAgLy8gVGhpcyAqY291bGQqIGJlIGEgY29uc3RhbnQgZXhwcmVzc2lvbiwgd2UgY2FuJ3Qga25vdyB3aXRob3V0CiAgICAgICAgICAvLyBldmFsdWF0aW5nIFtyZWNlaXZlcl0uCiAgICAgICAgICBpc0NvbnN0YW50RXhwcmVzc2lvbjogIWlzU3VwZXIsCiAgICAgICAgICBpc1N1cGVyOiBpc1N1cGVyKSk7CiAgICB9CiAgfQoKICBOYW1lIGluY3JlbWVudE9wZXJhdG9yKFRva2VuIHRva2VuKSB7CiAgICBpZiAob3B0aW9uYWwoIisrIiwgdG9rZW4pKSByZXR1cm4gcGx1c05hbWU7CiAgICBpZiAob3B0aW9uYWwoIi0tIiwgdG9rZW4pKSByZXR1cm4gbWludXNOYW1lOwogICAgcmV0dXJuIHVuaGFuZGxlZCh0b2tlbi5sZXhlbWUsICJpbmNyZW1lbnRPcGVyYXRvciIsIHRva2VuLmNoYXJPZmZzZXQsIHVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVVuYXJ5UHJlZml4QXNzaWdubWVudEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlVuYXJ5UHJlZml4QXNzaWdubWVudEV4cHJlc3Npb24iKTsKICAgIE9iamVjdCBnZW5lcmF0b3IgPSBwb3AoKTsKICAgIGlmIChnZW5lcmF0b3IgaXMgR2VuZXJhdG9yKSB7CiAgICAgIHB1c2goZ2VuZXJhdG9yLmJ1aWxkUHJlZml4SW5jcmVtZW50KGluY3JlbWVudE9wZXJhdG9yKHRva2VuKSwKICAgICAgICAgIG9mZnNldDogdG9rZW4uY2hhck9mZnNldCkpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaCh3cmFwSW5Qcm9ibGVtKAogICAgICAgICAgdG9WYWx1ZShnZW5lcmF0b3IpLCBmYXN0YS5tZXNzYWdlTm90QW5MdmFsdWUsIG5vTGVuZ3RoKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVVuYXJ5UG9zdGZpeEFzc2lnbm1lbnRFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJVbmFyeVBvc3RmaXhBc3NpZ25tZW50RXhwcmVzc2lvbiIpOwogICAgT2JqZWN0IGdlbmVyYXRvciA9IHBvcCgpOwogICAgaWYgKGdlbmVyYXRvciBpcyBHZW5lcmF0b3IpIHsKICAgICAgcHVzaChuZXcgRGVsYXllZFBvc3RmaXhJbmNyZW1lbnQoCiAgICAgICAgICB0aGlzLCB0b2tlbiwgZ2VuZXJhdG9yLCBpbmNyZW1lbnRPcGVyYXRvcih0b2tlbiksIG51bGwpKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2god3JhcEluUHJvYmxlbSgKICAgICAgICAgIHRvVmFsdWUoZ2VuZXJhdG9yKSwgZmFzdGEubWVzc2FnZU5vdEFuTHZhbHVlLCBub0xlbmd0aCkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDb25zdHJ1Y3RvclJlZmVyZW5jZSgKICAgICAgVG9rZW4gc3RhcnQsIFRva2VuIHBlcmlvZEJlZm9yZU5hbWUsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJDb25zdHJ1Y3RvclJlZmVyZW5jZSIpOwogICAgcHVzaFF1YWxpZmllZFJlZmVyZW5jZShzdGFydCwgcGVyaW9kQmVmb3JlTmFtZSk7CiAgfQoKICAvLy8gQSBxdWFsaWZpZWQgcmVmZXJlbmNlIGlzIHNvbWV0aGluZyB0aGF0IG1hdGNoZXMgb25lIG9mOgogIC8vLwogIC8vLyAgICAgaWRlbnRpZmllcgogIC8vLyAgICAgaWRlbnRpZmllciB0eXBlQXJndW1lbnRzPyAnLicgaWRlbnRpZmllcgogIC8vLyAgICAgaWRlbnRpZmllciAnLicgaWRlbnRpZmllciB0eXBlQXJndW1lbnRzPyAnLicgaWRlbnRpZmllcgogIC8vLwogIC8vLyBUaGF0IGlzLCBvbmUgdG8gdGhyZWUgaWRlbnRpZmllcnMgc2VwYXJhdGVkIGJ5IHBlcmlvZHMgYW5kIG9wdGlvbmFsbHkgb25lCiAgLy8vIGxpc3Qgb2YgdHlwZSBhcmd1bWVudHMuCiAgLy8vCiAgLy8vIEEgcXVhbGlmaWVkIHJlZmVyZW5jZSBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgYm90aCBhIHJlZmVyZW5jZSB0bwogIC8vLyBjb21waWxlLXRpbWUgY29uc3RhbnQgdmFyaWFibGUgKG1ldGFkYXRhKSBvciBhIGNvbnN0cnVjdG9yIHJlZmVyZW5jZQogIC8vLyAodXNlZCBieSBtZXRhZGF0YSwgbmV3L2NvbnN0IGV4cHJlc3Npb24sIGFuZCByZWRpcmVjdGluZyBmYWN0b3JpZXMpLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgdGhlIHBhcnNlciB3aWxsIHJlcG9ydCBlcnJvcnMgaWYgbWV0YWRhdGEgaW5jbHVkZXMgdHlwZQogIC8vLyBhcmd1bWVudHMsIGJ1dCB3aWxsIG90aGVyIHByZXNlcnZlIHRoZW0gZm9yIGVycm9yIHJlY292ZXJ5LgogIC8vLwogIC8vLyBBIGNvbnN0cnVjdG9yIHJlZmVyZW5jZSBjYW4gY29udGFpbiB1cCB0byB0aHJlZSBpZGVudGlmaWVyczoKICAvLy8KICAvLy8gICAgIGEpIHR5cGUgdHlwZUFyZ3VtZW50cz8KICAvLy8gICAgIGIpIHR5cGUgdHlwZUFyZ3VtZW50cz8gJy4nIG5hbWUKICAvLy8gICAgIGMpIHByZWZpeCAnLicgdHlwZSB0eXBlQXJndW1lbnRzPwogIC8vLyAgICAgZCkgcHJlZml4ICcuJyB0eXBlIHR5cGVBcmd1bWVudHM/ICcuJyBuYW1lCiAgLy8vCiAgLy8vIFRoaXMgaXNuJ3QgYSBsZWdhbCBjb25zdHJ1Y3RvciByZWZlcmVuY2U6CiAgLy8vCiAgLy8vICAgICB0eXBlICcuJyBuYW1lIHR5cGVBcmd1bWVudHM/CiAgLy8vCiAgLy8vIEJ1dCB0aGUgcGFyc2VyIGNhbid0IHRlbGwgdGhpcyBmcm9tIHR5cGUgYykgYWJvdmUuCiAgLy8vCiAgLy8vIFRoaXMgbWV0aG9kIHBvcHMgMiAob3IgMyBpZiBgcGVyaW9kQmVmb3JlTmFtZSAhPSBudWxsYCkgdmFsdWVzIGZyb20gdGhlCiAgLy8vIHN0YWNrIGFuZCBwdXNoZXMgMyB2YWx1ZXM6IGEgZ2VuZXJhdG9yICh0aGUgdHlwZSBpbiBhIGNvbnN0cnVjdG9yCiAgLy8vIHJlZmVyZW5jZSwgb3IgYW4gZXhwcmVzc2lvbiBpbiBtZXRhZGF0YSksIGEgbGlzdCBvZiB0eXBlIGFyZ3VtZW50cywgYW5kIGEKICAvLy8gbmFtZS4KICB2b2lkIHB1c2hRdWFsaWZpZWRSZWZlcmVuY2UoVG9rZW4gc3RhcnQsIFRva2VuIHBlcmlvZEJlZm9yZU5hbWUpIHsKICAgIElkZW50aWZpZXIgc3VmZml4ID0gcG9wSWZOb3ROdWxsKHBlcmlvZEJlZm9yZU5hbWUpOwogICAgSWRlbnRpZmllciBpZGVudGlmaWVyOwogICAgTGlzdDxVbnJlc29sdmVkVHlwZTxLZXJuZWxUeXBlQnVpbGRlcj4+IHR5cGVBcmd1bWVudHMgPSBwb3AoKTsKICAgIE9iamVjdCB0eXBlID0gcG9wKCk7CiAgICBpZiAodHlwZSBpcyBRdWFsaWZpZWROYW1lKSB7CiAgICAgIGlkZW50aWZpZXIgPSB0eXBlOwogICAgICBRdWFsaWZpZWROYW1lIHF1YWxpZmllZCA9IHR5cGU7CiAgICAgIE9iamVjdCBxdWFsaWZpZXIgPSBxdWFsaWZpZWQucXVhbGlmaWVyOwogICAgICBpZiAocXVhbGlmaWVyIGlzIFR5cGVVc2VHZW5lcmF0b3IpIHsKICAgICAgICB0eXBlID0gcXVhbGlmaWVyOwogICAgICAgIGlmICh0eXBlQXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgICAgIC8vIFRPRE8oYWhlKTogUG9pbnQgdG8gdGhlIHR5cGUgYXJndW1lbnRzIGluc3RlYWQuCiAgICAgICAgICBhZGRQcm9ibGVtKGZhc3RhLm1lc3NhZ2VDb25zdHJ1Y3RvcldpdGhUeXBlQXJndW1lbnRzLAogICAgICAgICAgICAgIGlkZW50aWZpZXIuY2hhck9mZnNldCwgaWRlbnRpZmllci5uYW1lLmxlbmd0aCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHF1YWxpZmllciBpcyBHZW5lcmF0b3IpIHsKICAgICAgICB0eXBlID0gcXVhbGlmaWVyLnF1YWxpZmllZExvb2t1cChkZXByZWNhdGVkX2V4dHJhY3RUb2tlbihpZGVudGlmaWVyKSk7CiAgICAgICAgaWRlbnRpZmllciA9IG51bGw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdW5oYW5kbGVkKCIke3F1YWxpZmllci5ydW50aW1lVHlwZX0iLCAicHVzaFF1YWxpZmllZFJlZmVyZW5jZSIsCiAgICAgICAgICAgIHN0YXJ0LmNoYXJPZmZzZXQsIHVyaSk7CiAgICAgIH0KICAgIH0KICAgIFN0cmluZyBuYW1lOwogICAgaWYgKGlkZW50aWZpZXIgIT0gbnVsbCAmJiBzdWZmaXggIT0gbnVsbCkgewogICAgICBuYW1lID0gIiR7aWRlbnRpZmllci5uYW1lfS4ke3N1ZmZpeC5uYW1lfSI7CiAgICB9IGVsc2UgaWYgKGlkZW50aWZpZXIgIT0gbnVsbCkgewogICAgICBuYW1lID0gaWRlbnRpZmllci5uYW1lOwogICAgfSBlbHNlIGlmIChzdWZmaXggIT0gbnVsbCkgewogICAgICBuYW1lID0gc3VmZml4Lm5hbWU7CiAgICB9IGVsc2UgewogICAgICBuYW1lID0gIiI7CiAgICB9CiAgICBwdXNoKHR5cGUpOwogICAgcHVzaCh0eXBlQXJndW1lbnRzID8/IE51bGxWYWx1ZS5UeXBlQXJndW1lbnRzKTsKICAgIHB1c2gobmFtZSk7CiAgICBwdXNoKHN1ZmZpeCA/PyBpZGVudGlmaWVyID8/IE51bGxWYWx1ZS5JZGVudGlmaWVyKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRTdGF0aWNJbnZvY2F0aW9uKE1lbWJlciB0YXJnZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIHtDb25zdG5lc3MgY29uc3RuZXNzOiBDb25zdG5lc3MuaW1wbGljaXQsCiAgICAgIGludCBjaGFyT2Zmc2V0OiAtMSwKICAgICAgaW50IGNoYXJMZW5ndGg6IG5vTGVuZ3RofSkgewogICAgLy8gVGhlIGFyZ3VtZW50IGNoZWNrcyBmb3IgdGhlIGluaXRpYWwgdGFyZ2V0IG9mIHJlZGlyZWN0aW5nIGZhY3RvcmllcwogICAgLy8gaW52b2NhdGlvbnMgYXJlIHNraXBwZWQgaW4gRGFydCAxLgogICAgaWYgKCFsZWdhY3lNb2RlIHx8ICFpc1JlZGlyZWN0aW5nRmFjdG9yeSh0YXJnZXQpKSB7CiAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPSB0YXJnZXQuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnM7CiAgICAgIGlmICh0YXJnZXQgaXMgQ29uc3RydWN0b3IpIHsKICAgICAgICBhc3NlcnQoIXRhcmdldC5lbmNsb3NpbmdDbGFzcy5pc0Fic3RyYWN0KTsKICAgICAgICB0eXBlUGFyYW1ldGVycyA9IHRhcmdldC5lbmNsb3NpbmdDbGFzcy50eXBlUGFyYW1ldGVyczsKICAgICAgfQogICAgICBMb2NhdGVkTWVzc2FnZSBhcmdNZXNzYWdlID0gY2hlY2tBcmd1bWVudHNGb3JGdW5jdGlvbigKICAgICAgICAgIHRhcmdldC5mdW5jdGlvbiwgYXJndW1lbnRzLCBjaGFyT2Zmc2V0LCB0eXBlUGFyYW1ldGVycyk7CiAgICAgIGlmIChhcmdNZXNzYWdlICE9IG51bGwpIHsKICAgICAgICByZXR1cm4gd3JhcFN5bnRoZXRpY0V4cHJlc3Npb24oCiAgICAgICAgICAgIHRocm93Tm9TdWNoTWV0aG9kRXJyb3IoCiAgICAgICAgICAgICAgICBmb3Jlc3QubGl0ZXJhbE51bGwobnVsbCkuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgdGFyZ2V0Lm5hbWUubmFtZSwKICAgICAgICAgICAgICAgIGFyZ3VtZW50cywKICAgICAgICAgICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICBjYW5kaWRhdGU6IHRhcmdldCwKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGFyZ01lc3NhZ2UpLAogICAgICAgICAgICBjaGFyT2Zmc2V0KTsKICAgICAgfQogICAgfQoKICAgIGJvb2wgaXNDb25zdCA9IGNvbnN0bmVzcyA9PSBDb25zdG5lc3MuZXhwbGljaXRDb25zdDsKICAgIGlmICh0YXJnZXQgaXMgQ29uc3RydWN0b3IpIHsKICAgICAgaXNDb25zdCA9CiAgICAgICAgICBpc0NvbnN0IHx8IGNvbnN0YW50Q29udGV4dCAhPSBDb25zdGFudENvbnRleHQubm9uZSAmJiB0YXJnZXQuaXNDb25zdDsKICAgICAgaWYgKChpc0NvbnN0IHx8IGNvbnN0YW50Q29udGV4dCA9PSBDb25zdGFudENvbnRleHQuaW5mZXJyZWQpICYmCiAgICAgICAgICAhdGFyZ2V0LmlzQ29uc3QpIHsKICAgICAgICByZXR1cm4gd3JhcEludmFsaWRDb25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICAgICAgICAgIGRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKGJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VOb25Db25zdENvbnN0cnVjdG9yLCBjaGFyT2Zmc2V0LCBjaGFyTGVuZ3RoKSksCiAgICAgICAgICAgIHRhcmdldCwKICAgICAgICAgICAgYXJndW1lbnRzLAogICAgICAgICAgICBjaGFyT2Zmc2V0KTsKICAgICAgfQogICAgICBDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSA9IG5ldyBDb25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICAgICAgICB0YXJnZXQsIGZvcmVzdC5jYXN0QXJndW1lbnRzKGFyZ3VtZW50cyksCiAgICAgICAgICBpc0NvbnN0OiBpc0NvbnN0KQogICAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgICAgIGxpYnJhcnkuY2hlY2tCb3VuZHNJbkNvbnN0cnVjdG9ySW52b2NhdGlvbihub2RlLCB0eXBlRW52aXJvbm1lbnQpOwogICAgICByZXR1cm4gbm9kZTsKICAgIH0gZWxzZSB7CiAgICAgIFByb2NlZHVyZSBwcm9jZWR1cmUgPSB0YXJnZXQ7CiAgICAgIGlmIChwcm9jZWR1cmUuaXNGYWN0b3J5KSB7CiAgICAgICAgaXNDb25zdCA9IGlzQ29uc3QgfHwKICAgICAgICAgICAgY29uc3RhbnRDb250ZXh0ICE9IENvbnN0YW50Q29udGV4dC5ub25lICYmIHByb2NlZHVyZS5pc0NvbnN0OwogICAgICAgIGlmICgoaXNDb25zdCB8fCBjb25zdGFudENvbnRleHQgPT0gQ29uc3RhbnRDb250ZXh0LmluZmVycmVkKSAmJgogICAgICAgICAgICAhcHJvY2VkdXJlLmlzQ29uc3QpIHsKICAgICAgICAgIHJldHVybiB3cmFwSW52YWxpZENvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgICAgICAgICBkZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihidWlsZFByb2JsZW0oCiAgICAgICAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VOb25Db25zdEZhY3RvcnksIGNoYXJPZmZzZXQsIGNoYXJMZW5ndGgpKSwKICAgICAgICAgICAgICB0YXJnZXQsCiAgICAgICAgICAgICAgYXJndW1lbnRzLAogICAgICAgICAgICAgIGNoYXJPZmZzZXQpOwogICAgICAgIH0KICAgICAgICBTdGF0aWNJbnZvY2F0aW9uIG5vZGUgPSBGYWN0b3J5Q29uc3RydWN0b3JJbnZvY2F0aW9uSnVkZ21lbnQoCiAgICAgICAgICAgIHRhcmdldCwgZm9yZXN0LmNhc3RBcmd1bWVudHMoYXJndW1lbnRzKSwKICAgICAgICAgICAgaXNDb25zdDogaXNDb25zdCkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgICAgICAgbGlicmFyeS5jaGVja0JvdW5kc0luRmFjdG9yeUludm9jYXRpb24obm9kZSwgdHlwZUVudmlyb25tZW50KTsKICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBTdGF0aWNJbnZvY2F0aW9uIG5vZGUgPSBuZXcgU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgICAgdGFyZ2V0LCBmb3Jlc3QuY2FzdEFyZ3VtZW50cyhhcmd1bWVudHMpLAogICAgICAgICAgICBpc0NvbnN0OiBpc0NvbnN0KQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICAgICAgICBsaWJyYXJ5LmNoZWNrQm91bmRzSW5TdGF0aWNJbnZvY2F0aW9uKG5vZGUsIHR5cGVFbnZpcm9ubWVudCk7CiAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIExvY2F0ZWRNZXNzYWdlIGNoZWNrQXJndW1lbnRzRm9yRnVuY3Rpb24oRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uLAogICAgICBBcmd1bWVudHMgYXJndW1lbnRzLCBpbnQgb2Zmc2V0LCBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKSB7CiAgICBpZiAoZm9yZXN0LmFyZ3VtZW50c1Bvc2l0aW9uYWwoYXJndW1lbnRzKS5sZW5ndGggPAogICAgICAgIGZ1bmN0aW9uLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpIHsKICAgICAgcmV0dXJuIGZhc3RhLnRlbXBsYXRlVG9vRmV3QXJndW1lbnRzCiAgICAgICAgICAud2l0aEFyZ3VtZW50cyhmdW5jdGlvbi5yZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgICAgICAgIGZvcmVzdC5hcmd1bWVudHNQb3NpdGlvbmFsKGFyZ3VtZW50cykubGVuZ3RoKQogICAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIGFyZ3VtZW50cy5maWxlT2Zmc2V0LCBub0xlbmd0aCk7CiAgICB9CiAgICBpZiAoZm9yZXN0LmFyZ3VtZW50c1Bvc2l0aW9uYWwoYXJndW1lbnRzKS5sZW5ndGggPgogICAgICAgIGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgICByZXR1cm4gZmFzdGEudGVtcGxhdGVUb29NYW55QXJndW1lbnRzCiAgICAgICAgICAud2l0aEFyZ3VtZW50cyhmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgsCiAgICAgICAgICAgICAgZm9yZXN0LmFyZ3VtZW50c1Bvc2l0aW9uYWwoYXJndW1lbnRzKS5sZW5ndGgpCiAgICAgICAgICAud2l0aExvY2F0aW9uKHVyaSwgYXJndW1lbnRzLmZpbGVPZmZzZXQsIG5vTGVuZ3RoKTsKICAgIH0KICAgIExpc3Q8T2JqZWN0PiBuYW1lZCA9IGZvcmVzdC5hcmd1bWVudHNOYW1lZChhcmd1bWVudHMpOwogICAgaWYgKG5hbWVkLmlzTm90RW1wdHkpIHsKICAgICAgU2V0PFN0cmluZz4gbmFtZXMgPQogICAgICAgICAgbmV3IFNldC5mcm9tKGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycy5tYXAoKGEpID0+IGEubmFtZSkpOwogICAgICBmb3IgKE5hbWVkRXhwcmVzc2lvbiBhcmd1bWVudCBpbiBuYW1lZCkgewogICAgICAgIGlmICghbmFtZXMuY29udGFpbnMoYXJndW1lbnQubmFtZSkpIHsKICAgICAgICAgIHJldHVybiBmYXN0YS50ZW1wbGF0ZU5vU3VjaE5hbWVkUGFyYW1ldGVyCiAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoYXJndW1lbnQubmFtZSkKICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKHVyaSwgYXJndW1lbnQuZmlsZU9mZnNldCwgYXJndW1lbnQubmFtZS5sZW5ndGgpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIExpc3Q8RGFydFR5cGU+IHR5cGVzID0gZm9yZXN0LmFyZ3VtZW50c1R5cGVBcmd1bWVudHMoYXJndW1lbnRzKTsKICAgIGlmICh0eXBlUGFyYW1ldGVycy5sZW5ndGggIT0gdHlwZXMubGVuZ3RoKSB7CiAgICAgIGlmICh0eXBlcy5sZW5ndGggPT0gMCkgewogICAgICAgIC8vIEV4cGVjdGVkIGB0eXBlUGFyYW1ldGVycy5sZW5ndGhgIHR5cGUgYXJndW1lbnRzLCBidXQgbm9uZSBnaXZlbiwgc28KICAgICAgICAvLyB3ZSBmaWxsIGluIGR5bmFtaWMgaW4gbGVnYWN5IG1vZGUsIGFuZCB1c2UgdHlwZSBpbmZlcmVuY2Ugb3RoZXJ3aXNlLgogICAgICAgIGlmIChsZWdhY3lNb2RlKSB7CiAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHR5cGVzLmFkZChjb25zdCBEeW5hbWljVHlwZSgpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQSB3cm9uZyAobm9uLXplcm8pIGFtb3VudCBvZiB0eXBlIGFyZ3VtZW50cyBnaXZlbi4gVGhhdCdzIGFuIGVycm9yLgogICAgICAgIC8vIFRPRE8oamVuc2opOiBQb3NpdGlvbiBzaG91bGQgYmUgb24gdHlwZSBhcmd1bWVudHMgaW5zdGVhZC4KICAgICAgICByZXR1cm4gZmFzdGEudGVtcGxhdGVUeXBlQXJndW1lbnRNaXNtYXRjaAogICAgICAgICAgICAud2l0aEFyZ3VtZW50cyh0eXBlUGFyYW1ldGVycy5sZW5ndGgpCiAgICAgICAgICAgIC53aXRoTG9jYXRpb24odXJpLCBvZmZzZXQsIG5vTGVuZ3RoKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgTG9jYXRlZE1lc3NhZ2UgY2hlY2tBcmd1bWVudHNGb3JUeXBlKAogICAgICBGdW5jdGlvblR5cGUgZnVuY3Rpb24sIEFyZ3VtZW50cyBhcmd1bWVudHMsIGludCBvZmZzZXQpIHsKICAgIGlmIChmb3Jlc3QuYXJndW1lbnRzUG9zaXRpb25hbChhcmd1bWVudHMpLmxlbmd0aCA8CiAgICAgICAgZnVuY3Rpb24ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCkgewogICAgICByZXR1cm4gZmFzdGEudGVtcGxhdGVUb29GZXdBcmd1bWVudHMKICAgICAgICAgIC53aXRoQXJndW1lbnRzKGZ1bmN0aW9uLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgICAgICAgZm9yZXN0LmFyZ3VtZW50c1Bvc2l0aW9uYWwoYXJndW1lbnRzKS5sZW5ndGgpCiAgICAgICAgICAud2l0aExvY2F0aW9uKHVyaSwgYXJndW1lbnRzLmZpbGVPZmZzZXQsIG5vTGVuZ3RoKTsKICAgIH0KICAgIGlmIChmb3Jlc3QuYXJndW1lbnRzUG9zaXRpb25hbChhcmd1bWVudHMpLmxlbmd0aCA+CiAgICAgICAgZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgIHJldHVybiBmYXN0YS50ZW1wbGF0ZVRvb01hbnlBcmd1bWVudHMKICAgICAgICAgIC53aXRoQXJndW1lbnRzKGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCwKICAgICAgICAgICAgICBmb3Jlc3QuYXJndW1lbnRzUG9zaXRpb25hbChhcmd1bWVudHMpLmxlbmd0aCkKICAgICAgICAgIC53aXRoTG9jYXRpb24odXJpLCBhcmd1bWVudHMuZmlsZU9mZnNldCwgbm9MZW5ndGgpOwogICAgfQogICAgTGlzdDxPYmplY3Q+IG5hbWVkID0gZm9yZXN0LmFyZ3VtZW50c05hbWVkKGFyZ3VtZW50cyk7CiAgICBpZiAobmFtZWQuaXNOb3RFbXB0eSkgewogICAgICBTZXQ8U3RyaW5nPiBuYW1lcyA9CiAgICAgICAgICBuZXcgU2V0LmZyb20oZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLm1hcCgoYSkgPT4gYS5uYW1lKSk7CiAgICAgIGZvciAoTmFtZWRFeHByZXNzaW9uIGFyZ3VtZW50IGluIG5hbWVkKSB7CiAgICAgICAgaWYgKCFuYW1lcy5jb250YWlucyhhcmd1bWVudC5uYW1lKSkgewogICAgICAgICAgcmV0dXJuIGZhc3RhLnRlbXBsYXRlTm9TdWNoTmFtZWRQYXJhbWV0ZXIKICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhhcmd1bWVudC5uYW1lKQogICAgICAgICAgICAgIC53aXRoTG9jYXRpb24odXJpLCBhcmd1bWVudC5maWxlT2Zmc2V0LCBhcmd1bWVudC5uYW1lLmxlbmd0aCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBMaXN0PE9iamVjdD4gdHlwZXMgPSBmb3Jlc3QuYXJndW1lbnRzVHlwZUFyZ3VtZW50cyhhcmd1bWVudHMpOwogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyA9IGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzOwogICAgaWYgKHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCAhPSB0eXBlcy5sZW5ndGggJiYgdHlwZXMubGVuZ3RoICE9IDApIHsKICAgICAgLy8gQSB3cm9uZyAobm9uLXplcm8pIGFtb3VudCBvZiB0eXBlIGFyZ3VtZW50cyBnaXZlbi4gVGhhdCdzIGFuIGVycm9yLgogICAgICAvLyBUT0RPKGplbnNqKTogUG9zaXRpb24gc2hvdWxkIGJlIG9uIHR5cGUgYXJndW1lbnRzIGluc3RlYWQuCiAgICAgIHJldHVybiBmYXN0YS50ZW1wbGF0ZVR5cGVBcmd1bWVudE1pc21hdGNoCiAgICAgICAgICAud2l0aEFyZ3VtZW50cyh0eXBlUGFyYW1ldGVycy5sZW5ndGgpCiAgICAgICAgICAud2l0aExvY2F0aW9uKHVyaSwgb2Zmc2V0LCBub0xlbmd0aCk7CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTmV3RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5OZXdFeHByZXNzaW9uIik7CiAgICBzdXBlci5wdXNoKGNvbnN0YW50Q29udGV4dCk7CiAgICBpZiAoY29uc3RhbnRDb250ZXh0ICE9IENvbnN0YW50Q29udGV4dC5ub25lKSB7CiAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICBmYXN0YS50ZW1wbGF0ZU5vdENvbnN0YW50RXhwcmVzc2lvbi53aXRoQXJndW1lbnRzKCdOZXcgZXhwcmVzc2lvbicpLAogICAgICAgICAgdG9rZW4uY2hhck9mZnNldCwKICAgICAgICAgIHRva2VuLmxlbmd0aCk7CiAgICB9CiAgICBjb25zdGFudENvbnRleHQgPSBDb25zdGFudENvbnRleHQubm9uZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Db25zdEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luQ29uc3RFeHByZXNzaW9uIik7CiAgICBzdXBlci5wdXNoKGNvbnN0YW50Q29udGV4dCk7CiAgICBjb25zdGFudENvbnRleHQgPSBDb25zdGFudENvbnRleHQuaW5mZXJyZWQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ29uc3RMaXRlcmFsKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkNvbnN0TGl0ZXJhbCIpOwogICAgc3VwZXIucHVzaChjb25zdGFudENvbnRleHQpOwogICAgY29uc3RhbnRDb250ZXh0ID0gQ29uc3RhbnRDb250ZXh0LmluZmVycmVkOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkltcGxpY2l0Q3JlYXRpb25FeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkltcGxpY2l0Q3JlYXRpb25FeHByZXNzaW9uIik7CiAgICBzdXBlci5wdXNoKGNvbnN0YW50Q29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENvbnN0TGl0ZXJhbChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiZW5kQ29uc3RMaXRlcmFsIik7CiAgICBPYmplY3QgbGl0ZXJhbCA9IHBvcCgpOwogICAgY29uc3RhbnRDb250ZXh0ID0gcG9wKCk7CiAgICBwdXNoKGxpdGVyYWwpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmROZXdFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJOZXdFeHByZXNzaW9uIik7CiAgICBidWlsZENvbnN0cnVjdG9yUmVmZXJlbmNlSW52b2NhdGlvbigKICAgICAgICB0b2tlbi5uZXh0LCB0b2tlbi5vZmZzZXQsIENvbnN0bmVzcy5leHBsaWNpdE5ldyk7CiAgfQoKICB2b2lkIGJ1aWxkQ29uc3RydWN0b3JSZWZlcmVuY2VJbnZvY2F0aW9uKAogICAgICBUb2tlbiBuYW1lVG9rZW4sIGludCBvZmZzZXQsIENvbnN0bmVzcyBjb25zdG5lc3MpIHsKICAgIEFyZ3VtZW50cyBhcmd1bWVudHMgPSBwb3AoKTsKICAgIElkZW50aWZpZXIgbmFtZUxhc3RJZGVudGlmaWVyID0gcG9wKE51bGxWYWx1ZS5JZGVudGlmaWVyKTsKICAgIFRva2VuIG5hbWVMYXN0VG9rZW4gPQogICAgICAgIGRlcHJlY2F0ZWRfZXh0cmFjdFRva2VuKG5hbWVMYXN0SWRlbnRpZmllcikgPz8gbmFtZVRva2VuOwogICAgU3RyaW5nIG5hbWUgPSBwb3AoKTsKICAgIExpc3Q8VW5yZXNvbHZlZFR5cGU8S2VybmVsVHlwZUJ1aWxkZXI+PiB0eXBlQXJndW1lbnRzID0gcG9wKCk7CgogICAgT2JqZWN0IHR5cGUgPSBwb3AoKTsKCiAgICBDb25zdGFudENvbnRleHQgc2F2ZWRDb25zdGFudENvbnRleHQgPSBwb3AoKTsKICAgIGlmICh0eXBlIGlzIEdlbmVyYXRvcikgewogICAgICBwdXNoKHR5cGUuaW52b2tlQ29uc3RydWN0b3IoCiAgICAgICAgICB0eXBlQXJndW1lbnRzLCBuYW1lLCBhcmd1bWVudHMsIG5hbWVUb2tlbiwgbmFtZUxhc3RUb2tlbiwgY29uc3RuZXNzKSk7CiAgICB9IGVsc2UgaWYgKHR5cGUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHVzaChuZXcgUGFyc2VyRXJyb3JHZW5lcmF0b3IoCiAgICAgICAgICB0aGlzLCBuYW1lVG9rZW4sIGZhc3RhLm1lc3NhZ2VTeW50aGV0aWNUb2tlbikpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaCh3cmFwU3ludGhldGljRXhwcmVzc2lvbigKICAgICAgICAgIHRocm93Tm9TdWNoTWV0aG9kRXJyb3IoCiAgICAgICAgICAgICAgZm9yZXN0LmxpdGVyYWxOdWxsKG51bGwpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0LAogICAgICAgICAgICAgIGRlYnVnTmFtZShnZXROb2RlTmFtZSh0eXBlKSwgbmFtZSksCiAgICAgICAgICAgICAgYXJndW1lbnRzLAogICAgICAgICAgICAgIG5hbWVUb2tlbi5jaGFyT2Zmc2V0KSwKICAgICAgICAgIG9mZnNldCkpOwogICAgfQogICAgY29uc3RhbnRDb250ZXh0ID0gc2F2ZWRDb25zdGFudENvbnRleHQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEltcGxpY2l0Q3JlYXRpb25FeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJJbXBsaWNpdENyZWF0aW9uRXhwcmVzc2lvbiIpOwogICAgYnVpbGRDb25zdHJ1Y3RvclJlZmVyZW5jZUludm9jYXRpb24oCiAgICAgICAgdG9rZW4sIHRva2VuLm9mZnNldCwgQ29uc3RuZXNzLmltcGxpY2l0KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRDb25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4gdHlwZSwKICAgICAgVG9rZW4gbmFtZVRva2VuLAogICAgICBUb2tlbiBuYW1lTGFzdFRva2VuLAogICAgICBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICBTdHJpbmcgbmFtZSwKICAgICAgTGlzdDxVbnJlc29sdmVkVHlwZTxLZXJuZWxUeXBlQnVpbGRlcj4+IHR5cGVBcmd1bWVudHMsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBDb25zdG5lc3MgY29uc3RuZXNzKSB7CiAgICBpZiAoYXJndW1lbnRzID09IG51bGwpIHsKICAgICAgcmV0dXJuIGJ1aWxkUHJvYmxlbShmYXN0YS5tZXNzYWdlTWlzc2luZ0FyZ3VtZW50TGlzdCwKICAgICAgICAgIG5hbWVUb2tlbi5jaGFyT2Zmc2V0LCBuYW1lVG9rZW4ubGVuZ3RoKTsKICAgIH0KICAgIGlmIChuYW1lLmlzTm90RW1wdHkgJiYgYXJndW1lbnRzLnR5cGVzLmlzTm90RW1wdHkpIHsKICAgICAgLy8gVE9ETyhhaGUpOiBQb2ludCB0byB0aGUgdHlwZSBhcmd1bWVudHMgaW5zdGVhZC4KICAgICAgYWRkUHJvYmxlbShmYXN0YS5tZXNzYWdlQ29uc3RydWN0b3JXaXRoVHlwZUFyZ3VtZW50cywKICAgICAgICAgIG5hbWVUb2tlbi5jaGFyT2Zmc2V0LCBuYW1lVG9rZW4ubGVuZ3RoKTsKICAgIH0KCiAgICBpZiAodHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGFzc2VydChmb3Jlc3QuYXJndW1lbnRzVHlwZUFyZ3VtZW50cyhhcmd1bWVudHMpLmlzRW1wdHkpOwogICAgICBmb3Jlc3QuYXJndW1lbnRzU2V0VHlwZUFyZ3VtZW50cygKICAgICAgICAgIGFyZ3VtZW50cywgYnVpbGREYXJ0VHlwZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRzKSk7CiAgICB9CgogICAgU3RyaW5nIGVycm9yTmFtZTsKICAgIExvY2F0ZWRNZXNzYWdlIG1lc3NhZ2U7CiAgICBpZiAodHlwZSBpcyBDbGFzc0J1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4pIHsKICAgICAgaWYgKHR5cGUgaXMgRW51bUJ1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4pIHsKICAgICAgICByZXR1cm4gYnVpbGRQcm9ibGVtKGZhc3RhLm1lc3NhZ2VFbnVtSW5zdGFudGlhdGlvbiwKICAgICAgICAgICAgbmFtZVRva2VuLmNoYXJPZmZzZXQsIG5hbWVUb2tlbi5sZW5ndGgpOwogICAgICB9CiAgICAgIERlY2xhcmF0aW9uIGIgPQogICAgICAgICAgdHlwZS5maW5kQ29uc3RydWN0b3JPckZhY3RvcnkobmFtZSwgY2hhck9mZnNldCwgdXJpLCBsaWJyYXJ5KTsKICAgICAgTWVtYmVyIHRhcmdldCA9IGI/LnRhcmdldDsKICAgICAgaWYgKGIgPT0gbnVsbCkgewogICAgICAgIC8vIE5vdCBmb3VuZC4gUmVwb3J0ZWQgYmVsb3cuCiAgICAgIH0gZWxzZSBpZiAoYiBpcyBQcm9ibGVtQnVpbGRlcikgewogICAgICAgIG1lc3NhZ2UgPSBiLm1lc3NhZ2Uud2l0aExvY2F0aW9uKHVyaSwgY2hhck9mZnNldCwgbm9MZW5ndGgpOwogICAgICB9IGVsc2UgaWYgKGIuaXNDb25zdHJ1Y3RvcikgewogICAgICAgIGlmICh0eXBlLmlzQWJzdHJhY3QpIHsKICAgICAgICAgIHJldHVybiB3cmFwSW52YWxpZENvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgICAgICAgICBldmFsdWF0ZUFyZ3VtZW50c0JlZm9yZSgKICAgICAgICAgICAgICAgICAgYXJndW1lbnRzLAogICAgICAgICAgICAgICAgICBidWlsZEFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHModHlwZS5uYW1lKSwKICAgICAgICAgICAgICAgICAgICAgIHR5cGUubmFtZSwKICAgICAgICAgICAgICAgICAgICAgIG5hbWVUb2tlbi5jaGFyT2Zmc2V0KSksCiAgICAgICAgICAgICAgdGFyZ2V0LAogICAgICAgICAgICAgIGFyZ3VtZW50cywKICAgICAgICAgICAgICBjaGFyT2Zmc2V0KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRhcmdldCBpcyBDb25zdHJ1Y3RvciB8fAogICAgICAgICAgKHRhcmdldCBpcyBQcm9jZWR1cmUgJiYgdGFyZ2V0LmtpbmQgPT0gUHJvY2VkdXJlS2luZC5GYWN0b3J5KSkgewogICAgICAgIEV4cHJlc3Npb24gaW52b2NhdGlvbjsKCiAgICAgICAgaWYgKGxlZ2FjeU1vZGUgJiYgaXNSZWRpcmVjdGluZ0ZhY3RvcnkodGFyZ2V0KSkgewogICAgICAgICAgLy8gSW4gbGVnYWN5IG1vZGUgdGhlIGNoZWNrcyB0aGF0IGFyZSBkb25lIGluIFtidWlsZFN0YXRpY0ludm9jYXRpb25dCiAgICAgICAgICAvLyBvbiB0aGUgaW5pdGlhbCB0YXJnZXQgb2YgYSByZWRpcmVjdGluZyBmYWN0b3J5IGludm9jYXRpb24gc2hvdWxkCiAgICAgICAgICAvLyBiZSBza2lwcGVkLiBTbyB3ZSBidWlsZCB0aGUgaW52b2NhdGlvbiBub2RlcyBkaXJlY3RseSBoZXJlIHdpdGhvdXQKICAgICAgICAgIC8vIGRvaW5nIGFueSBjaGVja3MuCiAgICAgICAgICBpZiAodGFyZ2V0LmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzICE9IG51bGwgJiYKICAgICAgICAgICAgICB0YXJnZXQuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMubGVuZ3RoICE9CiAgICAgICAgICAgICAgICAgIGZvcmVzdC5hcmd1bWVudHNUeXBlQXJndW1lbnRzKGFyZ3VtZW50cykubGVuZ3RoKSB7CiAgICAgICAgICAgIGFyZ3VtZW50cyA9IGZvcmVzdC5hcmd1bWVudHMoCiAgICAgICAgICAgICAgICBmb3Jlc3QuYXJndW1lbnRzUG9zaXRpb25hbChhcmd1bWVudHMpLCBudWxsLAogICAgICAgICAgICAgICAgbmFtZWQ6IGZvcmVzdC5hcmd1bWVudHNOYW1lZChhcmd1bWVudHMpLAogICAgICAgICAgICAgICAgdHlwZXM6IG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQoCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwgY29uc3QgRHluYW1pY1R5cGUoKSwKICAgICAgICAgICAgICAgICAgICBncm93YWJsZTogdHJ1ZSkpOwogICAgICAgICAgfQogICAgICAgICAgaW52b2NhdGlvbiA9IG5ldyBGYWN0b3J5Q29uc3RydWN0b3JJbnZvY2F0aW9uSnVkZ21lbnQoCiAgICAgICAgICAgICAgdGFyZ2V0LCBmb3Jlc3QuY2FzdEFyZ3VtZW50cyhhcmd1bWVudHMpLAogICAgICAgICAgICAgIGlzQ29uc3Q6IGNvbnN0bmVzcyA9PSBDb25zdG5lc3MuZXhwbGljaXRDb25zdCkKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gbmFtZVRva2VuLmNoYXJPZmZzZXQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGludm9jYXRpb24gPSBidWlsZFN0YXRpY0ludm9jYXRpb24odGFyZ2V0LCBhcmd1bWVudHMsCiAgICAgICAgICAgICAgY29uc3RuZXNzOiBjb25zdG5lc3MsCiAgICAgICAgICAgICAgY2hhck9mZnNldDogbmFtZVRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgY2hhckxlbmd0aDogbmFtZVRva2VuLmxlbmd0aCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoaW52b2NhdGlvbiBpcyBTdGF0aWNJbnZvY2F0aW9uICYmIGlzUmVkaXJlY3RpbmdGYWN0b3J5KHRhcmdldCkpIHsKICAgICAgICAgIHJlZGlyZWN0aW5nRmFjdG9yeUludm9jYXRpb25zLmFkZChpbnZvY2F0aW9uKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBpbnZvY2F0aW9uOwogICAgICB9IGVsc2UgewogICAgICAgIGVycm9yTmFtZSA/Pz0gZGVidWdOYW1lKHR5cGUubmFtZSwgbmFtZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodHlwZSBpcyBJbnZhbGlkVHlwZUJ1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4pIHsKICAgICAgTG9jYXRlZE1lc3NhZ2UgbWVzc2FnZSA9IHR5cGUubWVzc2FnZTsKICAgICAgcmV0dXJuIGV2YWx1YXRlQXJndW1lbnRzQmVmb3JlKAogICAgICAgICAgYXJndW1lbnRzLAogICAgICAgICAgYnVpbGRQcm9ibGVtKG1lc3NhZ2UubWVzc2FnZU9iamVjdCwgbmFtZVRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgbmFtZVRva2VuLmxleGVtZS5sZW5ndGgpKTsKICAgIH0gZWxzZSB7CiAgICAgIGVycm9yTmFtZSA9IGRlYnVnTmFtZShnZXROb2RlTmFtZSh0eXBlKSwgbmFtZSk7CiAgICB9CiAgICBlcnJvck5hbWUgPz89IG5hbWU7CgogICAgcmV0dXJuIHdyYXBVbnJlc29sdmVkVGFyZ2V0SW52b2NhdGlvbigKICAgICAgICB0aHJvd05vU3VjaE1ldGhvZEVycm9yKAogICAgICAgICAgICBmb3Jlc3QubGl0ZXJhbE51bGwobnVsbCkuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0LAogICAgICAgICAgICBlcnJvck5hbWUsCiAgICAgICAgICAgIGFyZ3VtZW50cywKICAgICAgICAgICAgbmFtZUxhc3RUb2tlbi5jaGFyT2Zmc2V0LAogICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlKSwKICAgICAgICBhcmd1bWVudHMsCiAgICAgICAgYXJndW1lbnRzLmZpbGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDb25zdEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZENvbnN0RXhwcmVzc2lvbiIpOwogICAgYnVpbGRDb25zdHJ1Y3RvclJlZmVyZW5jZUludm9jYXRpb24oCiAgICAgICAgdG9rZW4ubmV4dCwgdG9rZW4ub2Zmc2V0LCBDb25zdG5lc3MuZXhwbGljaXRDb25zdCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luSWZDb250cm9sRmxvdyhUb2tlbiBpZlRva2VuKSB7CiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogY29uc2lkZXIgcmVtb3ZpbmcgdGhpcyB3aGVuIGNvbnRyb2wgZmxvdyBzdXBwb3J0IGlzIGFkZGVkCiAgICAvLyBpZiB0aGUgaWZUb2tlbiBpcyBub3QgbmVlZGVkIGZvciBlcnJvciByZXBvcnRpbmcKICAgIHB1c2goaWZUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luVGhlbkNvbnRyb2xGbG93KFRva2VuIHRva2VuKSB7CiAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiA9IHBvcEZvclZhbHVlKCk7CiAgICBlbnRlclRoZW5Gb3JUeXBlUHJvbW90aW9uKGNvbmRpdGlvbik7CiAgICBwdXNoKGNvbmRpdGlvbik7CiAgICBzdXBlci5iZWdpblRoZW5Db250cm9sRmxvdyh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUVsc2VDb250cm9sRmxvdyhUb2tlbiBlbHNlVG9rZW4pIHsKICAgIHR5cGVQcm9tb3Rlcj8uZW50ZXJFbHNlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZElmQ29udHJvbEZsb3coVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZElmQ29udHJvbEZsb3ciKTsKICAgIHZhciBlbnRyeSA9IHBvcCgpOwogICAgdmFyIGNvbmRpdGlvbiA9IHBvcCgpOyAvLyBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24KICAgIFRva2VuIGlmVG9rZW4gPSBwb3AoKTsKICAgIHR5cGVQcm9tb3Rlcj8uZW50ZXJFbHNlKCk7CiAgICB0eXBlUHJvbW90ZXI/LmV4aXRDb25kaXRpb25hbCgpOwogICAgaWYgKCFsaWJyYXJ5LmxvYWRlci50YXJnZXQuZW5hYmxlQ29udHJvbEZsb3dDb2xsZWN0aW9ucykgewogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogUmVwb3J0IGEgbW9yZSB1c2VyIGZyaWVuZGx5IGVycm9yIG1lc3NhZ2UKICAgICAgLy8gd2hlbiBhbiBleHBlcmltZW50IGlzIG5vdCBlbmFibGVkCiAgICAgIGhhbmRsZVJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBmYXN0YS50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbi53aXRoQXJndW1lbnRzKGlmVG9rZW4pLAogICAgICAgICAgaWZUb2tlbiwKICAgICAgICAgIGlmVG9rZW4pOwogICAgICBwdXNoKGludmFsaWRDb2xsZWN0aW9uRWxlbWVudCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRyYW5zZm9ybUNvbGxlY3Rpb25zID0gdHJ1ZTsKICAgIGlmIChlbnRyeSBpcyBNYXBFbnRyeSkgewogICAgICBwdXNoKGZvcmVzdC5pZk1hcEVudHJ5KHRvVmFsdWUoY29uZGl0aW9uKSwgZW50cnksIG51bGwsIGlmVG9rZW4pKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2goZm9yZXN0LmlmRWxlbWVudCh0b1ZhbHVlKGNvbmRpdGlvbiksIHRvVmFsdWUoZW50cnkpLCBudWxsLCBpZlRva2VuKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZElmRWxzZUNvbnRyb2xGbG93KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRJZkVsc2VDb250cm9sRmxvdyIpOwogICAgdmFyIGVsc2VFbnRyeSA9IHBvcCgpOyAvLyBlbHNlIGVudHJ5CiAgICB2YXIgdGhlbkVudHJ5ID0gcG9wKCk7IC8vIHRoZW4gZW50cnkKICAgIHZhciBjb25kaXRpb24gPSBwb3AoKTsgLy8gcGFyZW50aGVzaXplZCBleHByZXNzaW9uCiAgICBUb2tlbiBpZlRva2VuID0gcG9wKCk7CiAgICB0eXBlUHJvbW90ZXI/LmV4aXRDb25kaXRpb25hbCgpOwogICAgaWYgKCFsaWJyYXJ5LmxvYWRlci50YXJnZXQuZW5hYmxlQ29udHJvbEZsb3dDb2xsZWN0aW9ucykgewogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogUmVwb3J0IGEgbW9yZSB1c2VyIGZyaWVuZGx5IGVycm9yIG1lc3NhZ2UKICAgICAgLy8gd2hlbiBhbiBleHBlcmltZW50IGlzIG5vdCBlbmFibGVkCiAgICAgIGhhbmRsZVJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBmYXN0YS50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbi53aXRoQXJndW1lbnRzKGlmVG9rZW4pLAogICAgICAgICAgaWZUb2tlbiwKICAgICAgICAgIGlmVG9rZW4pOwogICAgICBwdXNoKGludmFsaWRDb2xsZWN0aW9uRWxlbWVudCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRyYW5zZm9ybUNvbGxlY3Rpb25zID0gdHJ1ZTsKICAgIGlmICh0aGVuRW50cnkgaXMgTWFwRW50cnkpIHsKICAgICAgaWYgKGVsc2VFbnRyeSBpcyBNYXBFbnRyeSkgewogICAgICAgIHB1c2goZm9yZXN0LmlmTWFwRW50cnkoCiAgICAgICAgICAgIHRvVmFsdWUoY29uZGl0aW9uKSwgdGhlbkVudHJ5LCBlbHNlRW50cnksIGlmVG9rZW4pKTsKICAgICAgfSBlbHNlIGlmIChlbHNlRW50cnkgaXMgU3ByZWFkRWxlbWVudCkgewogICAgICAgIHB1c2goZm9yZXN0LmlmTWFwRW50cnkoCiAgICAgICAgICAgIHRvVmFsdWUoY29uZGl0aW9uKSwKICAgICAgICAgICAgdGhlbkVudHJ5LAogICAgICAgICAgICBuZXcgU3ByZWFkTWFwRW50cnkoZWxzZUVudHJ5LmV4cHJlc3Npb24sIGVsc2VFbnRyeS5pc051bGxBd2FyZSksCiAgICAgICAgICAgIGlmVG9rZW4pKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbnQgb2Zmc2V0ID0gZWxzZUVudHJ5IGlzIEV4cHJlc3Npb24KICAgICAgICAgICAgPyBlbHNlRW50cnkuZmlsZU9mZnNldAogICAgICAgICAgICA6IG9mZnNldEZvclRva2VuKGlmVG9rZW4pOwogICAgICAgIHB1c2gobmV3IE1hcEVudHJ5KAogICAgICAgICAgICBkZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihidWlsZFByb2JsZW0oCiAgICAgICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQWZ0ZXJCdXRHb3Qud2l0aEFyZ3VtZW50cygnOicpLAogICAgICAgICAgICAgICAgb2Zmc2V0LAogICAgICAgICAgICAgICAgMSkpLAogICAgICAgICAgICBuZXcgTnVsbExpdGVyYWwoKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKGlmVG9rZW4pKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChlbHNlRW50cnkgaXMgTWFwRW50cnkpIHsKICAgICAgaWYgKHRoZW5FbnRyeSBpcyBTcHJlYWRFbGVtZW50KSB7CiAgICAgICAgcHVzaChmb3Jlc3QuaWZNYXBFbnRyeSgKICAgICAgICAgICAgdG9WYWx1ZShjb25kaXRpb24pLAogICAgICAgICAgICBuZXcgU3ByZWFkTWFwRW50cnkodGhlbkVudHJ5LmV4cHJlc3Npb24sIHRoZW5FbnRyeS5pc051bGxBd2FyZSksCiAgICAgICAgICAgIGVsc2VFbnRyeSwKICAgICAgICAgICAgaWZUb2tlbikpOwogICAgICB9IGVsc2UgewogICAgICAgIGludCBvZmZzZXQgPSB0aGVuRW50cnkgaXMgRXhwcmVzc2lvbgogICAgICAgICAgICA/IHRoZW5FbnRyeS5maWxlT2Zmc2V0CiAgICAgICAgICAgIDogb2Zmc2V0Rm9yVG9rZW4oaWZUb2tlbik7CiAgICAgICAgcHVzaChuZXcgTWFwRW50cnkoCiAgICAgICAgICAgIGRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKGJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgICAgIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRBZnRlckJ1dEdvdC53aXRoQXJndW1lbnRzKCc6JyksCiAgICAgICAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICAgICAgICAxKSksCiAgICAgICAgICAgIG5ldyBOdWxsTGl0ZXJhbCgpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4oaWZUb2tlbikpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBwdXNoKGZvcmVzdC5pZkVsZW1lbnQoCiAgICAgICAgICB0b1ZhbHVlKGNvbmRpdGlvbiksIHRvVmFsdWUodGhlbkVudHJ5KSwgdG9WYWx1ZShlbHNlRW50cnkpLCBpZlRva2VuKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVNwcmVhZEV4cHJlc3Npb24oVG9rZW4gc3ByZWFkVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlNwcmVhZEV4cHJlc3Npb24iKTsKICAgIHZhciBleHByZXNzaW9uID0gcG9wKCk7CiAgICBpZiAoIWxpYnJhcnkubG9hZGVyLnRhcmdldC5lbmFibGVTcHJlYWRDb2xsZWN0aW9ucykgewogICAgICBoYW5kbGVSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgZmFzdGEudGVtcGxhdGVVbmV4cGVjdGVkVG9rZW4ud2l0aEFyZ3VtZW50cyhzcHJlYWRUb2tlbiksCiAgICAgICAgICBzcHJlYWRUb2tlbiwKICAgICAgICAgIHNwcmVhZFRva2VuKTsKICAgICAgcHVzaChpbnZhbGlkQ29sbGVjdGlvbkVsZW1lbnQpOwogICAgICByZXR1cm47CiAgICB9CiAgICB0cmFuc2Zvcm1Db2xsZWN0aW9ucyA9IHRydWU7CiAgICBwdXNoKGZvcmVzdC5zcHJlYWRFbGVtZW50KHRvVmFsdWUoZXhwcmVzc2lvbiksIHNwcmVhZFRva2VuKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFR5cGVBcmd1bWVudHMoaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiVHlwZUFyZ3VtZW50cyIpOwogICAgcHVzaChjb25zdCBGaXhlZE51bGxhYmxlTGlzdDxVbnJlc29sdmVkVHlwZTxLZXJuZWxUeXBlQnVpbGRlcj4+KCkKICAgICAgICAgICAgLnBvcChzdGFjaywgY291bnQpID8/CiAgICAgICAgTnVsbFZhbHVlLlR5cGVBcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJbnZhbGlkVHlwZUFyZ3VtZW50cyhUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiSW52YWxpZFR5cGVBcmd1bWVudHMiKTsKICAgIHBvcChOdWxsVmFsdWUuVHlwZUFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVRoaXNFeHByZXNzaW9uKFRva2VuIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dCBjb250ZXh0KSB7CiAgICBkZWJ1Z0V2ZW50KCJUaGlzRXhwcmVzc2lvbiIpOwogICAgaWYgKGNvbnRleHQuaXNTY29wZVJlZmVyZW5jZSAmJiBpc0luc3RhbmNlQ29udGV4dCkgewogICAgICBwdXNoKG5ldyBUaGlzQWNjZXNzR2VuZXJhdG9yKAogICAgICAgICAgdGhpcywgdG9rZW4sIGluSW5pdGlhbGl6ZXIsIGluRmllbGRJbml0aWFsaXplcikpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChuZXcgSW5jb21wbGV0ZUVycm9yR2VuZXJhdG9yKAogICAgICAgICAgdGhpcywgdG9rZW4sIGZhc3RhLm1lc3NhZ2VUaGlzQXNJZGVudGlmaWVyKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVN1cGVyRXhwcmVzc2lvbihUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgZGVidWdFdmVudCgiU3VwZXJFeHByZXNzaW9uIik7CiAgICBpZiAoY29udGV4dC5pc1Njb3BlUmVmZXJlbmNlICYmIGlzSW5zdGFuY2VDb250ZXh0KSB7CiAgICAgIE1lbWJlciBtZW1iZXIgPSB0aGlzLm1lbWJlci50YXJnZXQ7CiAgICAgIG1lbWJlci50cmFuc2Zvcm1lckZsYWdzIHw9IFRyYW5zZm9ybWVyRmxhZy5zdXBlckNhbGxzOwogICAgICBwdXNoKG5ldyBUaGlzQWNjZXNzR2VuZXJhdG9yKAogICAgICAgICAgdGhpcywgdG9rZW4sIGluSW5pdGlhbGl6ZXIsIGluRmllbGRJbml0aWFsaXplciwKICAgICAgICAgIGlzU3VwZXI6IHRydWUpKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2gobmV3IEluY29tcGxldGVFcnJvckdlbmVyYXRvcigKICAgICAgICAgIHRoaXMsIHRva2VuLCBmYXN0YS5tZXNzYWdlU3VwZXJBc0lkZW50aWZpZXIpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTmFtZWRBcmd1bWVudChUb2tlbiBjb2xvbikgewogICAgZGVidWdFdmVudCgiTmFtZWRBcmd1bWVudCIpOwogICAgRXhwcmVzc2lvbiB2YWx1ZSA9IHBvcEZvclZhbHVlKCk7CiAgICBJZGVudGlmaWVyIGlkZW50aWZpZXIgPSBwb3AoKTsKICAgIHB1c2gobmV3IE5hbWVkRXhwcmVzc2lvbihpZGVudGlmaWVyLm5hbWUsIHZhbHVlKQogICAgICAuLmZpbGVPZmZzZXQgPSBpZGVudGlmaWVyLmNoYXJPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGdW5jdGlvbk5hbWUoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkZ1bmN0aW9uTmFtZSIpOwogICAgSWRlbnRpZmllciBuYW1lID0gcG9wKCk7CiAgICBUb2tlbiBuYW1lVG9rZW4gPSBkZXByZWNhdGVkX2V4dHJhY3RUb2tlbihuYW1lKTsKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50KAogICAgICAgIG5hbWUubmFtZSwgZnVuY3Rpb25OZXN0aW5nTGV2ZWwsCiAgICAgICAgZm9yU3ludGhldGljVG9rZW46IG5hbWVUb2tlbi5pc1N5bnRoZXRpYywKICAgICAgICBpc0ZpbmFsOiB0cnVlLAogICAgICAgIGlzTG9jYWxGdW5jdGlvbjogdHJ1ZSkKICAgICAgLi5maWxlT2Zmc2V0ID0gbmFtZS5jaGFyT2Zmc2V0OwogICAgLy8gVE9ETyhhaGUpOiBXaHkgYXJlIHdlIGxvb2tpbmcgdXAgaW4gbG9jYWwgc2NvcGUsIGJ1dCBkZWNsYXJpbmcgaW4gcGFyZW50CiAgICAvLyBzY29wZT8KICAgIERlY2xhcmF0aW9uIGV4aXN0aW5nID0gc2NvcGUubG9jYWxbbmFtZS5uYW1lXTsKICAgIGlmIChleGlzdGluZyAhPSBudWxsKSB7CiAgICAgIHJlcG9ydER1cGxpY2F0ZWREZWNsYXJhdGlvbihleGlzdGluZywgbmFtZS5uYW1lLCBuYW1lLmNoYXJPZmZzZXQpOwogICAgfQogICAgcHVzaChuZXcgRnVuY3Rpb25EZWNsYXJhdGlvbkp1ZGdtZW50KAogICAgICAgIHZhcmlhYmxlLAogICAgICAgIC8vIFRoZSBmdW5jdGlvbiBub2RlIGlzIGNyZWF0ZWQgbGF0ZXIuCiAgICAgICAgbnVsbCkKICAgICAgLi5maWxlT2Zmc2V0ID0gYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0KTsKICAgIGRlY2xhcmVWYXJpYWJsZSh2YXJpYWJsZSwgc2NvcGUucGFyZW50KTsKICB9CgogIHZvaWQgZW50ZXJGdW5jdGlvbigpIHsKICAgIGRlYnVnRXZlbnQoImVudGVyRnVuY3Rpb24iKTsKICAgIGZ1bmN0aW9uTmVzdGluZ0xldmVsKys7CiAgICBwdXNoKHN3aXRjaFNjb3BlID8/IE51bGxWYWx1ZS5Td2l0Y2hTY29wZSk7CiAgICBzd2l0Y2hTY29wZSA9IG51bGw7CiAgICBwdXNoKGluQ2F0Y2hCbG9jayk7CiAgICBpbkNhdGNoQmxvY2sgPSBmYWxzZTsKICB9CgogIHZvaWQgZXhpdEZ1bmN0aW9uKCkgewogICAgZGVidWdFdmVudCgiZXhpdEZ1bmN0aW9uIik7CiAgICBmdW5jdGlvbk5lc3RpbmdMZXZlbC0tOwogICAgaW5DYXRjaEJsb2NrID0gcG9wKCk7CiAgICBzd2l0Y2hTY29wZSA9IHBvcCgpOwogICAgTGlzdDxLZXJuZWxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzID0gcG9wKCk7CiAgICBleGl0TG9jYWxTY29wZSgpOwogICAgcHVzaCh0eXBlVmFyaWFibGVzID8/IE51bGxWYWx1ZS5UeXBlVmFyaWFibGVzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Mb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb24oVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luTG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uIik7CiAgICBlbnRlckZ1bmN0aW9uKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTmFtZWRGdW5jdGlvbkV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luTmFtZWRGdW5jdGlvbkV4cHJlc3Npb24iKTsKICAgIExpc3Q8S2VybmVsVHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcyA9IHBvcCgpOwogICAgLy8gQ3JlYXRlIGFuIGFkZGl0aW9uYWwgc2NvcGUgaW4gd2hpY2ggdGhlIG5hbWVkIGZ1bmN0aW9uIGV4cHJlc3Npb24gaXMKICAgIC8vIGRlY2xhcmVkLgogICAgZW50ZXJMb2NhbFNjb3BlKCJuYW1lZCBmdW5jdGlvbiIpOwogICAgcHVzaCh0eXBlVmFyaWFibGVzID8/IE51bGxWYWx1ZS5UeXBlVmFyaWFibGVzKTsKICAgIGVudGVyRnVuY3Rpb24oKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5GdW5jdGlvbkV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luRnVuY3Rpb25FeHByZXNzaW9uIik7CiAgICBlbnRlckZ1bmN0aW9uKCk7CiAgfQoKICB2b2lkIHB1c2hOYW1lZEZ1bmN0aW9uKFRva2VuIHRva2VuLCBib29sIGlzRnVuY3Rpb25FeHByZXNzaW9uKSB7CiAgICBTdGF0ZW1lbnQgYm9keSA9IHBvcFN0YXRlbWVudCgpOwogICAgQXN5bmNNYXJrZXIgYXN5bmNNb2RpZmllciA9IHBvcCgpOwogICAgZXhpdExvY2FsU2NvcGUoKTsKICAgIEZvcm1hbFBhcmFtZXRlcnMgZm9ybWFscyA9IHBvcCgpOwogICAgT2JqZWN0IGRlY2xhcmF0aW9uID0gcG9wKCk7CiAgICBVbnJlc29sdmVkVHlwZTxLZXJuZWxUeXBlQnVpbGRlcj4gcmV0dXJuVHlwZSA9IHBvcCgpOwogICAgYm9vbCBoYXNJbXBsaWNpdFJldHVyblR5cGUgPSByZXR1cm5UeXBlID09IG51bGw7CiAgICBleGl0RnVuY3Rpb24oKTsKICAgIExpc3Q8S2VybmVsVHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVBhcmFtZXRlcnMgPSBwb3AoKTsKICAgIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnM7CiAgICBpZiAoIWlzRnVuY3Rpb25FeHByZXNzaW9uKSB7CiAgICAgIGFubm90YXRpb25zID0gcG9wKCk7IC8vIE1ldGFkYXRhLgogICAgfQogICAgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uID0gZm9ybWFscy5idWlsZEZ1bmN0aW9uTm9kZShsaWJyYXJ5LCByZXR1cm5UeXBlLAogICAgICAgIHR5cGVQYXJhbWV0ZXJzLCBhc3luY01vZGlmaWVyLCBib2R5LCB0b2tlbi5jaGFyT2Zmc2V0KTsKCiAgICBpZiAoZGVjbGFyYXRpb24gaXMgRnVuY3Rpb25EZWNsYXJhdGlvbikgewogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gZGVjbGFyYXRpb24udmFyaWFibGU7CiAgICAgIGlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CiAgICAgICAgZm9yIChFeHByZXNzaW9uIGFubm90YXRpb24gaW4gYW5ub3RhdGlvbnMpIHsKICAgICAgICAgIHZhcmlhYmxlLmFkZEFubm90YXRpb24oYW5ub3RhdGlvbik7CiAgICAgICAgfQogICAgICB9CiAgICAgIEZ1bmN0aW9uRGVjbGFyYXRpb25KdWRnbWVudC5zZXRIYXNJbXBsaWNpdFJldHVyblR5cGUoCiAgICAgICAgICBkZWNsYXJhdGlvbiwgaGFzSW1wbGljaXRSZXR1cm5UeXBlKTsKCiAgICAgIHZhcmlhYmxlLnR5cGUgPSBmdW5jdGlvbi5mdW5jdGlvblR5cGU7CiAgICAgIGlmIChpc0Z1bmN0aW9uRXhwcmVzc2lvbikgewogICAgICAgIEV4cHJlc3Npb24gb2xkSW5pdGlhbGl6ZXIgPSB2YXJpYWJsZS5pbml0aWFsaXplcjsKICAgICAgICB2YXJpYWJsZS5pbml0aWFsaXplciA9IG5ldyBGdW5jdGlvbkV4cHJlc3Npb24oZnVuY3Rpb24pCiAgICAgICAgICAuLnBhcmVudCA9IHZhcmlhYmxlCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmb3JtYWxzLmNoYXJPZmZzZXQ7CiAgICAgICAgZXhpdExvY2FsU2NvcGUoKTsKICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBuZXcgTmFtZWRGdW5jdGlvbkV4cHJlc3Npb25KdWRnbWVudCh2YXJpYWJsZSk7CiAgICAgICAgaWYgKG9sZEluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgICAgIC8vIFRoaXMgbXVzdCBoYXZlIGJlZW4gYSBjb21waWxlLXRpbWUgZXJyb3IuCiAgICAgICAgICBFeHByZXNzaW9uIGVycm9yID0gZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24ob2xkSW5pdGlhbGl6ZXIpOwogICAgICAgICAgYXNzZXJ0KGlzRXJyb25lb3VzTm9kZShlcnJvcikpOwogICAgICAgICAgaW50IG9mZnNldCA9IGZvcmVzdC5yZWFkT2Zmc2V0KGV4cHJlc3Npb24pOwogICAgICAgICAgcHVzaCh3cmFwU3ludGhldGljRXhwcmVzc2lvbigKICAgICAgICAgICAgICBuZXcgTGV0KAogICAgICAgICAgICAgICAgICBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZShlcnJvcikuLmZpbGVPZmZzZXQgPSBvZmZzZXQsCiAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24pCiAgICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQsCiAgICAgICAgICAgICAgb2Zmc2V0KSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHB1c2goZXhwcmVzc2lvbik7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGRlY2xhcmF0aW9uLmZ1bmN0aW9uID0gZnVuY3Rpb247CiAgICAgICAgZnVuY3Rpb24ucGFyZW50ID0gZGVjbGFyYXRpb247CiAgICAgICAgaWYgKHZhcmlhYmxlLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgICAgIC8vIFRoaXMgbXVzdCBoYXZlIGJlZW4gYSBjb21waWxlLXRpbWUgZXJyb3IuCiAgICAgICAgICBhc3NlcnQoaXNFcnJvbmVvdXNOb2RlKHZhcmlhYmxlLmluaXRpYWxpemVyKSk7CgogICAgICAgICAgcHVzaChmb3Jlc3QuYmxvY2soCiAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgICA8U3RhdGVtZW50PlsKICAgICAgICAgICAgICAgIGZvcmVzdC5leHByZXNzaW9uU3RhdGVtZW50KHZhcmlhYmxlLmluaXRpYWxpemVyLCB0b2tlbiksCiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbgogICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgbnVsbCkKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZGVjbGFyYXRpb24uZmlsZU9mZnNldCk7CiAgICAgICAgICB2YXJpYWJsZS5pbml0aWFsaXplciA9IG51bGw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHB1c2goZGVjbGFyYXRpb24pOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHVuaGFuZGxlZCgiJHtkZWNsYXJhdGlvbi5ydW50aW1lVHlwZX0iLCAicHVzaE5hbWVkRnVuY3Rpb24iLAogICAgICAgICAgdG9rZW4uY2hhck9mZnNldCwgdXJpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTmFtZWRGdW5jdGlvbkV4cHJlc3Npb24oVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIk5hbWVkRnVuY3Rpb25FeHByZXNzaW9uIik7CiAgICBwdXNoTmFtZWRGdW5jdGlvbihlbmRUb2tlbiwgdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZExvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uIik7CiAgICBwdXNoTmFtZWRGdW5jdGlvbih0b2tlbiwgZmFsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGdW5jdGlvbkV4cHJlc3Npb24oVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkZ1bmN0aW9uRXhwcmVzc2lvbiIpOwogICAgU3RhdGVtZW50IGJvZHkgPSBwb3BTdGF0ZW1lbnQoKTsKICAgIEFzeW5jTWFya2VyIGFzeW5jTW9kaWZpZXIgPSBwb3AoKTsKICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICBGb3JtYWxQYXJhbWV0ZXJzIGZvcm1hbHMgPSBwb3AoKTsKICAgIGV4aXRGdW5jdGlvbigpOwogICAgTGlzdDxLZXJuZWxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlUGFyYW1ldGVycyA9IHBvcCgpOwogICAgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uID0gZm9ybWFscy5idWlsZEZ1bmN0aW9uTm9kZSgKICAgICAgICBsaWJyYXJ5LCBudWxsLCB0eXBlUGFyYW1ldGVycywgYXN5bmNNb2RpZmllciwgYm9keSwgdG9rZW4uY2hhck9mZnNldCkKICAgICAgLi5maWxlT2Zmc2V0ID0gYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0OwoKICAgIGlmIChsaWJyYXJ5LmxlZ2FjeU1vZGUgJiYgYXN5bmNNb2RpZmllciAhPSBBc3luY01hcmtlci5TeW5jKSB7CiAgICAgIERhcnRUeXBlIHJldHVyblR5cGU7CiAgICAgIHN3aXRjaCAoYXN5bmNNb2RpZmllcikgewogICAgICAgIGNhc2UgQXN5bmNNYXJrZXIuQXN5bmM6CiAgICAgICAgICByZXR1cm5UeXBlID0gY29yZVR5cGVzLmZ1dHVyZUNsYXNzLnJhd1R5cGU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEFzeW5jTWFya2VyLkFzeW5jU3RhcjoKICAgICAgICAgIHJldHVyblR5cGUgPSBjb3JlVHlwZXMuc3RyZWFtQ2xhc3MucmF3VHlwZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQXN5bmNNYXJrZXIuU3luY1N0YXI6CiAgICAgICAgICByZXR1cm5UeXBlID0gY29yZVR5cGVzLml0ZXJhYmxlQ2xhc3MucmF3VHlwZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm5UeXBlID0gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGZ1bmN0aW9uLnJldHVyblR5cGUgPSByZXR1cm5UeXBlOwogICAgfQogICAgaWYgKGNvbnN0YW50Q29udGV4dCAhPSBDb25zdGFudENvbnRleHQubm9uZSkgewogICAgICBwdXNoKGJ1aWxkUHJvYmxlbShmYXN0YS5tZXNzYWdlTm90QUNvbnN0YW50RXhwcmVzc2lvbiwgZm9ybWFscy5jaGFyT2Zmc2V0LAogICAgICAgICAgZm9ybWFscy5sZW5ndGgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2gobmV3IEZ1bmN0aW9uRXhwcmVzc2lvbihmdW5jdGlvbikKICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbihiZWdpblRva2VuKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZERvV2hpbGVTdGF0ZW1lbnQoCiAgICAgIFRva2VuIGRvS2V5d29yZCwgVG9rZW4gd2hpbGVLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiRG9XaGlsZVN0YXRlbWVudCIpOwogICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPSBwb3BGb3JWYWx1ZSgpOwogICAgU3RhdGVtZW50IGJvZHkgPSBwb3BTdGF0ZW1lbnQoKTsKICAgIEp1bXBUYXJnZXQgY29udGludWVUYXJnZXQgPSBleGl0Q29udGludWVUYXJnZXQoKTsKICAgIEp1bXBUYXJnZXQgYnJlYWtUYXJnZXQgPSBleGl0QnJlYWtUYXJnZXQoKTsKICAgIGlmIChjb250aW51ZVRhcmdldC5oYXNVc2VycykgewogICAgICBib2R5ID0gZm9yZXN0LnN5bnRoZXRpY0xhYmVsZWRTdGF0ZW1lbnQoYm9keSk7CiAgICAgIGNvbnRpbnVlVGFyZ2V0LnJlc29sdmVDb250aW51ZXMoZm9yZXN0LCBib2R5KTsKICAgIH0KICAgIFN0YXRlbWVudCByZXN1bHQgPQogICAgICAgIGZvcmVzdC5kb1N0YXRlbWVudChkb0tleXdvcmQsIGJvZHksIHdoaWxlS2V5d29yZCwgY29uZGl0aW9uLCBlbmRUb2tlbik7CiAgICBpZiAoYnJlYWtUYXJnZXQuaGFzVXNlcnMpIHsKICAgICAgcmVzdWx0ID0gZm9yZXN0LnN5bnRoZXRpY0xhYmVsZWRTdGF0ZW1lbnQocmVzdWx0KTsKICAgICAgYnJlYWtUYXJnZXQucmVzb2x2ZUJyZWFrcyhmb3Jlc3QsIHJlc3VsdCk7CiAgICB9CiAgICBleGl0TG9vcE9yU3dpdGNoKHJlc3VsdCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRm9ySW5FeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBlbnRlckxvY2FsU2NvcGUobnVsbCwgc2NvcGUucGFyZW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9ySW5FeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJGb3JJbkV4cHJlc3Npb24iKTsKICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBvcEZvclZhbHVlKCk7CiAgICBleGl0TG9jYWxTY29wZSgpOwogICAgcHVzaChleHByZXNzaW9uID8/IE51bGxWYWx1ZS5FeHByZXNzaW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRm9ySW5Mb29wUGFydHMoVG9rZW4gYXdhaXRUb2tlbiwgVG9rZW4gZm9yVG9rZW4sCiAgICAgIFRva2VuIGxlZnRQYXJlbnRoZXNpcywgVG9rZW4gaW5LZXl3b3JkKSB7CiAgICBwdXNoKGF3YWl0VG9rZW4gPz8gTnVsbFZhbHVlLkF3YWl0VG9rZW4pOwogICAgcHVzaChmb3JUb2tlbik7CiAgICBwdXNoKGluS2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZvckluQ29udHJvbEZsb3coVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkZvckluQ29udHJvbEZsb3ciKTsKICAgIHZhciBlbnRyeSA9IHBvcCgpOwogICAgVG9rZW4gaW5Ub2tlbiA9IHBvcCgpOwogICAgVG9rZW4gZm9yVG9rZW4gPSBwb3AoKTsKICAgIFRva2VuIGF3YWl0VG9rZW4gPSBwb3AoTnVsbFZhbHVlLkF3YWl0VG9rZW4pOwogICAgRXhwcmVzc2lvbiBpdGVyYWJsZSA9IHBvcEZvclZhbHVlKCk7CiAgICBPYmplY3QgbHZhbHVlID0gcG9wKCk7IC8vIGx2YWx1ZQogICAgZXhpdExvY2FsU2NvcGUoKTsKCiAgICBpZiAoIWxpYnJhcnkubG9hZGVyLnRhcmdldC5lbmFibGVDb250cm9sRmxvd0NvbGxlY3Rpb25zKSB7CiAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBSZXBvcnQgYSBtb3JlIHVzZXIgZnJpZW5kbHkgZXJyb3IgbWVzc2FnZQogICAgICAvLyB3aGVuIGFuIGV4cGVyaW1lbnQgaXMgbm90IGVuYWJsZWQKICAgICAgaGFuZGxlUmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIGZhc3RhLnRlbXBsYXRlVW5leHBlY3RlZFRva2VuLndpdGhBcmd1bWVudHMoZm9yVG9rZW4pLAogICAgICAgICAgZm9yVG9rZW4sCiAgICAgICAgICBmb3JUb2tlbik7CiAgICAgIHB1c2goaW52YWxpZENvbGxlY3Rpb25FbGVtZW50KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdHJhbnNmb3JtQ29sbGVjdGlvbnMgPSB0cnVlOwogICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IGJ1aWxkRm9ySW5WYXJpYWJsZShsdmFsdWUpOwogICAgRXhwcmVzc2lvbiBwcm9ibGVtID0gY2hlY2tGb3JJblZhcmlhYmxlKGx2YWx1ZSwgdmFyaWFibGUsIGZvclRva2VuKTsKICAgIFN0YXRlbWVudCBwcm9sb2d1ZSA9IGJ1aWxkRm9ySW5Cb2R5KGx2YWx1ZSwgdmFyaWFibGUsIGZvclRva2VuLCBpblRva2VuKTsKICAgIGlmIChlbnRyeSBpcyBNYXBFbnRyeSkgewogICAgICBwdXNoKGZvcmVzdC5mb3JJbk1hcEVudHJ5KAogICAgICAgICAgdmFyaWFibGUsIGl0ZXJhYmxlLCBwcm9sb2d1ZSwgZW50cnksIHByb2JsZW0sIGZvclRva2VuLAogICAgICAgICAgaXNBc3luYzogYXdhaXRUb2tlbiAhPSBudWxsKSk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKGZvcmVzdC5mb3JJbkVsZW1lbnQoCiAgICAgICAgICB2YXJpYWJsZSwgaXRlcmFibGUsIHByb2xvZ3VlLCB0b1ZhbHVlKGVudHJ5KSwgcHJvYmxlbSwgZm9yVG9rZW4sCiAgICAgICAgICBpc0FzeW5jOiBhd2FpdFRva2VuICE9IG51bGwpKTsKICAgIH0KICB9CgogIFZhcmlhYmxlRGVjbGFyYXRpb24gYnVpbGRGb3JJblZhcmlhYmxlKE9iamVjdCBsdmFsdWUpIHsKICAgIGlmIChsdmFsdWUgaXMgVmFyaWFibGVEZWNsYXJhdGlvbikgcmV0dXJuIGx2YWx1ZTsKICAgIHJldHVybiBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50LmZvclZhbHVlKG51bGwsIGZ1bmN0aW9uTmVzdGluZ0xldmVsKTsKICB9CgogIEV4cHJlc3Npb24gY2hlY2tGb3JJblZhcmlhYmxlKAogICAgICBPYmplY3QgbHZhbHVlLCBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBUb2tlbiBmb3JUb2tlbikgewogICAgaWYgKGx2YWx1ZSBpcyBWYXJpYWJsZURlY2xhcmF0aW9uKSB7CiAgICAgIGlmICh2YXJpYWJsZS5pc0NvbnN0KSB7CiAgICAgICAgcmV0dXJuIGJ1aWxkUHJvYmxlbShmYXN0YS5tZXNzYWdlRm9ySW5Mb29wV2l0aENvbnN0VmFyaWFibGUsCiAgICAgICAgICAgIHZhcmlhYmxlLmZpbGVPZmZzZXQsIHZhcmlhYmxlLm5hbWUubGVuZ3RoKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChsdmFsdWUgaXMhIEdlbmVyYXRvcikgewogICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBmb3Jlc3QuaXNWYXJpYWJsZXNEZWNsYXJhdGlvbihsdmFsdWUpCiAgICAgICAgICA/IGZhc3RhLm1lc3NhZ2VGb3JJbkxvb3BFeGFjdGx5T25lVmFyaWFibGUKICAgICAgICAgIDogZmFzdGEubWVzc2FnZUZvckluTG9vcE5vdEFzc2lnbmFibGU7CiAgICAgIFRva2VuIHRva2VuID0gZm9yVG9rZW4ubmV4dC5uZXh0OwogICAgICByZXR1cm4gYnVpbGRQcm9ibGVtKAogICAgICAgICAgbWVzc2FnZSwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBsZW5ndGhGb3JUb2tlbih0b2tlbikpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBTdGF0ZW1lbnQgYnVpbGRGb3JJbkJvZHkoT2JqZWN0IGx2YWx1ZSwgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwKICAgICAgVG9rZW4gZm9yVG9rZW4sIFRva2VuIGluS2V5d29yZCkgewogICAgaWYgKGx2YWx1ZSBpcyBWYXJpYWJsZURlY2xhcmF0aW9uKSByZXR1cm4gbnVsbDsKICAgIGlmIChsdmFsdWUgaXMgR2VuZXJhdG9yKSB7CiAgICAgIC8vLyBXZSBhcmUgaW4gdGhpcyBjYXNlLCB3aGVyZSBgbHZhbHVlYCBpc24ndCBhIFtWYXJpYWJsZURlY2xhcmF0aW9uXToKICAgICAgLy8vCiAgICAgIC8vLyAgICAgZm9yIChsdmFsdWUgaW4gZXhwcmVzc2lvbikgYm9keQogICAgICAvLy8KICAgICAgLy8vIFRoaXMgaXMgbm9ybWFsaXplZCB0bzoKICAgICAgLy8vCiAgICAgIC8vLyAgICAgZm9yIChmaW5hbCAjdCBpbiBleHByZXNzaW9uKSB7CiAgICAgIC8vLyAgICAgICBsdmFsdWUgPSAjdDsKICAgICAgLy8vICAgICAgIGJvZHk7CiAgICAgIC8vLyAgICAgfQogICAgICBUeXBlUHJvbW90aW9uRmFjdCBmYWN0ID0KICAgICAgICAgIHR5cGVQcm9tb3Rlcj8uZ2V0RmFjdEZvckFjY2Vzcyh2YXJpYWJsZSwgZnVuY3Rpb25OZXN0aW5nTGV2ZWwpOwogICAgICBUeXBlUHJvbW90aW9uU2NvcGUgc2NvcGUgPSB0eXBlUHJvbW90ZXI/LmN1cnJlbnRTY29wZTsKICAgICAgRXhwcmVzc2lvbiBzeW50aGV0aWNBc3NpZ25tZW50ID0gbHZhbHVlLmJ1aWxkQXNzaWdubWVudCgKICAgICAgICAgIG5ldyBWYXJpYWJsZUdldEp1ZGdtZW50KHZhcmlhYmxlLCBmYWN0LCBzY29wZSkKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gaW5LZXl3b3JkLm9mZnNldCwKICAgICAgICAgIHZvaWRDb250ZXh0OiB0cnVlKTsKICAgICAgaWYgKHN5bnRoZXRpY0Fzc2lnbm1lbnQgaXMgc2hhZG93LlN5bnRoZXRpY0V4cHJlc3Npb25KdWRnbWVudCkgewogICAgICAgIHN5bnRoZXRpY0Fzc2lnbm1lbnQgPSB3cmFwU3ludGhldGljRXhwcmVzc2lvbigKICAgICAgICAgICAgZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oc3ludGhldGljQXNzaWdubWVudCksCiAgICAgICAgICAgIG9mZnNldEZvclRva2VuKGx2YWx1ZS50b2tlbikpOwogICAgICB9CiAgICAgIHJldHVybiBmb3Jlc3QuZXhwcmVzc2lvblN0YXRlbWVudChzeW50aGV0aWNBc3NpZ25tZW50LCBudWxsKTsKICAgIH0KICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGZvcmVzdC5pc1ZhcmlhYmxlc0RlY2xhcmF0aW9uKGx2YWx1ZSkKICAgICAgICA/IGZhc3RhLm1lc3NhZ2VGb3JJbkxvb3BFeGFjdGx5T25lVmFyaWFibGUKICAgICAgICA6IGZhc3RhLm1lc3NhZ2VGb3JJbkxvb3BOb3RBc3NpZ25hYmxlOwogICAgVG9rZW4gdG9rZW4gPSBmb3JUb2tlbi5uZXh0Lm5leHQ7CiAgICBTdGF0ZW1lbnQgYm9keTsKICAgIGlmIChmb3Jlc3QuaXNWYXJpYWJsZXNEZWNsYXJhdGlvbihsdmFsdWUpKSB7CiAgICAgIGJvZHkgPSBmb3Jlc3QuYmxvY2soCiAgICAgICAgICBudWxsLAogICAgICAgICAgLy8gTmV3IGxpc3QgYmVjYXVzZSB0aGUgZGVjbGFyYXRpb25zIGFyZSBub3QgYSBncm93YWJsZSBsaXN0LgogICAgICAgICAgbmV3IExpc3Q8U3RhdGVtZW50Pi5mcm9tKAogICAgICAgICAgICAgIGZvcmVzdC52YXJpYWJsZXNEZWNsYXJhdGlvbkV4dHJhY3REZWNsYXJhdGlvbnMobHZhbHVlKSksCiAgICAgICAgICBudWxsKTsKICAgIH0gZWxzZSB7CiAgICAgIGJvZHkgPSBmb3Jlc3QuZXhwcmVzc2lvblN0YXRlbWVudChsdmFsdWUsIG51bGwpOwogICAgfQogICAgcmV0dXJuIGNvbWJpbmVTdGF0ZW1lbnRzKAogICAgICAgIGZvcmVzdC5leHByZXNzaW9uU3RhdGVtZW50KAogICAgICAgICAgICBidWlsZFByb2JsZW0obWVzc2FnZSwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBsZW5ndGhGb3JUb2tlbih0b2tlbikpLAogICAgICAgICAgICBudWxsKSwKICAgICAgICBib2R5KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9ySW4oVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkZvckluIik7CiAgICBTdGF0ZW1lbnQgYm9keSA9IHBvcFN0YXRlbWVudCgpOwoKICAgIFRva2VuIGluS2V5d29yZCA9IHBvcCgpOwogICAgVG9rZW4gZm9yVG9rZW4gPSBwb3AoKTsKICAgIFRva2VuIGF3YWl0VG9rZW4gPSBwb3AoTnVsbFZhbHVlLkF3YWl0VG9rZW4pOwoKICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBvcEZvclZhbHVlKCk7CiAgICBPYmplY3QgbHZhbHVlID0gcG9wKCk7CiAgICBleGl0TG9jYWxTY29wZSgpOwogICAgSnVtcFRhcmdldCBjb250aW51ZVRhcmdldCA9IGV4aXRDb250aW51ZVRhcmdldCgpOwogICAgSnVtcFRhcmdldCBicmVha1RhcmdldCA9IGV4aXRCcmVha1RhcmdldCgpOwogICAgaWYgKGNvbnRpbnVlVGFyZ2V0Lmhhc1VzZXJzKSB7CiAgICAgIGJvZHkgPSBmb3Jlc3Quc3ludGhldGljTGFiZWxlZFN0YXRlbWVudChib2R5KTsKICAgICAgY29udGludWVUYXJnZXQucmVzb2x2ZUNvbnRpbnVlcyhmb3Jlc3QsIGJvZHkpOwogICAgfQogICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IGJ1aWxkRm9ySW5WYXJpYWJsZShsdmFsdWUpOwogICAgRXhwcmVzc2lvbiBwcm9ibGVtID0gY2hlY2tGb3JJblZhcmlhYmxlKGx2YWx1ZSwgdmFyaWFibGUsIGZvclRva2VuKTsKICAgIFN0YXRlbWVudCBwcm9sb2d1ZSA9IGJ1aWxkRm9ySW5Cb2R5KGx2YWx1ZSwgdmFyaWFibGUsIGZvclRva2VuLCBpbktleXdvcmQpOwogICAgaWYgKHByb2xvZ3VlICE9IG51bGwpIHsKICAgICAgaWYgKHByb2xvZ3VlIGlzIEJsb2NrKSB7CiAgICAgICAgaWYgKGJvZHkgaXMgQmxvY2spIHsKICAgICAgICAgIGZvciAoU3RhdGVtZW50IHN0YXRlbWVudCBpbiBib2R5LnN0YXRlbWVudHMpIHsKICAgICAgICAgICAgcHJvbG9ndWUuYWRkU3RhdGVtZW50KHN0YXRlbWVudCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHByb2xvZ3VlLmFkZFN0YXRlbWVudChib2R5KTsKICAgICAgICB9CiAgICAgICAgYm9keSA9IHByb2xvZ3VlOwogICAgICB9IGVsc2UgewogICAgICAgIGJvZHkgPSBjb21iaW5lU3RhdGVtZW50cyhwcm9sb2d1ZSwgYm9keSk7CiAgICAgIH0KICAgIH0KICAgIFN0YXRlbWVudCByZXN1bHQgPSBuZXcgRm9ySW5TdGF0ZW1lbnQodmFyaWFibGUsIGV4cHJlc3Npb24sIGJvZHksCiAgICAgICAgaXNBc3luYzogYXdhaXRUb2tlbiAhPSBudWxsKQogICAgICAuLmZpbGVPZmZzZXQgPSBhd2FpdFRva2VuPy5jaGFyT2Zmc2V0ID8/IGZvclRva2VuLmNoYXJPZmZzZXQKICAgICAgLi5ib2R5T2Zmc2V0ID0gYm9keS5maWxlT2Zmc2V0OyAvLyBUT0RPKGFoZSk6IElzbid0IHRoaXMgcmVkdW5kYW50PwogICAgaWYgKGJyZWFrVGFyZ2V0Lmhhc1VzZXJzKSB7CiAgICAgIHJlc3VsdCA9IGZvcmVzdC5zeW50aGV0aWNMYWJlbGVkU3RhdGVtZW50KHJlc3VsdCk7CiAgICAgIGJyZWFrVGFyZ2V0LnJlc29sdmVCcmVha3MoZm9yZXN0LCByZXN1bHQpOwogICAgfQogICAgaWYgKHByb2JsZW0gIT0gbnVsbCkgewogICAgICByZXN1bHQgPQogICAgICAgICAgY29tYmluZVN0YXRlbWVudHMoZm9yZXN0LmV4cHJlc3Npb25TdGF0ZW1lbnQocHJvYmxlbSwgbnVsbCksIHJlc3VsdCk7CiAgICB9CiAgICBleGl0TG9vcE9yU3dpdGNoKHJlc3VsdCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUxhYmVsKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJMYWJlbCIpOwogICAgSWRlbnRpZmllciBpZGVudGlmaWVyID0gcG9wKCk7CiAgICBwdXNoKG5ldyBMYWJlbChpZGVudGlmaWVyLm5hbWUsIGlkZW50aWZpZXIuY2hhck9mZnNldCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkxhYmVsZWRTdGF0ZW1lbnQoVG9rZW4gdG9rZW4sIGludCBsYWJlbENvdW50KSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkxhYmVsZWRTdGF0ZW1lbnQiKTsKICAgIExpc3Q8TGFiZWw+IGxhYmVscyA9CiAgICAgICAgY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8TGFiZWw+KCkucG9wKHN0YWNrLCBsYWJlbENvdW50KTsKICAgIGVudGVyTG9jYWxTY29wZShudWxsLCBzY29wZS5jcmVhdGVOZXN0ZWRMYWJlbFNjb3BlKCkpOwogICAgTGFiZWxUYXJnZXQgdGFyZ2V0ID0KICAgICAgICBuZXcgTGFiZWxUYXJnZXQobWVtYmVyLCBmdW5jdGlvbk5lc3RpbmdMZXZlbCwgdG9rZW4uY2hhck9mZnNldCk7CiAgICBpZiAobGFiZWxzICE9IG51bGwpIHsKICAgICAgZm9yIChMYWJlbCBsYWJlbCBpbiBsYWJlbHMpIHsKICAgICAgICBzY29wZS5kZWNsYXJlTGFiZWwobGFiZWwubmFtZSwgdGFyZ2V0KTsKICAgICAgfQogICAgfQogICAgcHVzaCh0YXJnZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRMYWJlbGVkU3RhdGVtZW50KGludCBsYWJlbENvdW50KSB7CiAgICBkZWJ1Z0V2ZW50KCJMYWJlbGVkU3RhdGVtZW50Iik7CiAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gcG9wKCk7CiAgICBMYWJlbFRhcmdldCB0YXJnZXQgPSBwb3AoKTsKICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICBpZiAodGFyZ2V0LmJyZWFrVGFyZ2V0Lmhhc1VzZXJzIHx8IHRhcmdldC5jb250aW51ZVRhcmdldC5oYXNVc2VycykgewogICAgICBpZiAoZm9yZXN0LmlzVmFyaWFibGVzRGVjbGFyYXRpb24oc3RhdGVtZW50KSkgewogICAgICAgIGludGVybmFsUHJvYmxlbSgKICAgICAgICAgICAgZmFzdGEubWVzc2FnZUludGVybmFsUHJvYmxlbUxhYmVsVXNhZ2VJblZhcmlhYmxlc0RlY2xhcmF0aW9uLAogICAgICAgICAgICBzdGF0ZW1lbnQuZmlsZU9mZnNldCwKICAgICAgICAgICAgdXJpKTsKICAgICAgfQogICAgICBpZiAoc3RhdGVtZW50IGlzISBMYWJlbGVkU3RhdGVtZW50KSB7CiAgICAgICAgc3RhdGVtZW50ID0gZm9yZXN0LnN5bnRoZXRpY0xhYmVsZWRTdGF0ZW1lbnQoc3RhdGVtZW50KTsKICAgICAgfQogICAgICB0YXJnZXQuYnJlYWtUYXJnZXQucmVzb2x2ZUJyZWFrcyhmb3Jlc3QsIHN0YXRlbWVudCk7CiAgICAgIHRhcmdldC5jb250aW51ZVRhcmdldC5yZXNvbHZlQ29udGludWVzKGZvcmVzdCwgc3RhdGVtZW50KTsKICAgIH0KICAgIHB1c2goc3RhdGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kUmV0aHJvd1N0YXRlbWVudChUb2tlbiByZXRocm93VG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJSZXRocm93U3RhdGVtZW50Iik7CiAgICBpZiAoaW5DYXRjaEJsb2NrKSB7CiAgICAgIHB1c2goZm9yZXN0LnJldGhyb3dTdGF0ZW1lbnQocmV0aHJvd1Rva2VuLCBlbmRUb2tlbikpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChuZXcgRXhwcmVzc2lvblN0YXRlbWVudEp1ZGdtZW50KGJ1aWxkUHJvYmxlbSgKICAgICAgICAgIGZhc3RhLm1lc3NhZ2VSZXRocm93Tm90Q2F0Y2gsCiAgICAgICAgICBvZmZzZXRGb3JUb2tlbihyZXRocm93VG9rZW4pLAogICAgICAgICAgbGVuZ3RoRm9yVG9rZW4ocmV0aHJvd1Rva2VuKSkpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4ocmV0aHJvd1Rva2VuKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUZpbmFsbHlCbG9jayhUb2tlbiBmaW5hbGx5S2V5d29yZCkgewogICAgZGVidWdFdmVudCgiRmluYWxseUJsb2NrIik7CiAgICAvLyBEbyBub3RoaW5nLCBoYW5kbGVkIGJ5IFtlbmRUcnlTdGF0ZW1lbnRdLgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRXaGlsZVN0YXRlbWVudChUb2tlbiB3aGlsZUtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJXaGlsZVN0YXRlbWVudCIpOwogICAgU3RhdGVtZW50IGJvZHkgPSBwb3BTdGF0ZW1lbnQoKTsKICAgIEV4cHJlc3Npb24gY29uZGl0aW9uID0gcG9wRm9yVmFsdWUoKTsKICAgIEp1bXBUYXJnZXQgY29udGludWVUYXJnZXQgPSBleGl0Q29udGludWVUYXJnZXQoKTsKICAgIEp1bXBUYXJnZXQgYnJlYWtUYXJnZXQgPSBleGl0QnJlYWtUYXJnZXQoKTsKICAgIGlmIChjb250aW51ZVRhcmdldC5oYXNVc2VycykgewogICAgICBib2R5ID0gZm9yZXN0LnN5bnRoZXRpY0xhYmVsZWRTdGF0ZW1lbnQoYm9keSk7CiAgICAgIGNvbnRpbnVlVGFyZ2V0LnJlc29sdmVDb250aW51ZXMoZm9yZXN0LCBib2R5KTsKICAgIH0KICAgIFN0YXRlbWVudCByZXN1bHQgPSBmb3Jlc3Qud2hpbGVTdGF0ZW1lbnQod2hpbGVLZXl3b3JkLCBjb25kaXRpb24sIGJvZHkpOwogICAgaWYgKGJyZWFrVGFyZ2V0Lmhhc1VzZXJzKSB7CiAgICAgIHJlc3VsdCA9IGZvcmVzdC5zeW50aGV0aWNMYWJlbGVkU3RhdGVtZW50KHJlc3VsdCk7CiAgICAgIGJyZWFrVGFyZ2V0LnJlc29sdmVCcmVha3MoZm9yZXN0LCByZXN1bHQpOwogICAgfQogICAgZXhpdExvb3BPclN3aXRjaChyZXN1bHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVFbXB0eVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiRW1wdHlTdGF0ZW1lbnQiKTsKICAgIHB1c2goZm9yZXN0LmVtcHR5U3RhdGVtZW50KHRva2VuKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQXNzZXJ0KFRva2VuIGFzc2VydEtleXdvcmQsIEFzc2VydCBraW5kKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkFzc2VydCIpOwogICAgLy8gSWYgaW4gYW4gYXNzZXJ0IGluaXRpYWxpemVyLCBtYWtlIHN1cmUgW2luSW5pdGlhbGl6ZXJdIGlzIGZhbHNlIHNvIHdlCiAgICAvLyB1c2UgdGhlIGZvcm1hbCBwYXJhbWV0ZXIgc2NvcGUuIElmIHRoaXMgaXMgYW55IG90aGVyIGtpbmQgb2YgYXNzZXJ0LAogICAgLy8gaW5Jbml0aWFsaXplciBzaG91bGQgYmUgZmFsc2UgYW55d2F5LgogICAgaW5Jbml0aWFsaXplciA9IGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRBc3NlcnQoVG9rZW4gYXNzZXJ0S2V5d29yZCwgQXNzZXJ0IGtpbmQsIFRva2VuIGxlZnRQYXJlbnRoZXNpcywKICAgICAgVG9rZW4gY29tbWFUb2tlbiwgVG9rZW4gc2VtaWNvbG9uVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkFzc2VydCIpOwogICAgRXhwcmVzc2lvbiBtZXNzYWdlID0gcG9wRm9yVmFsdWVJZk5vdE51bGwoY29tbWFUb2tlbik7CiAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiA9IHBvcEZvclZhbHVlKCk7CgogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgQXNzZXJ0LlN0YXRlbWVudDoKICAgICAgICBwdXNoKGZvcmVzdC5hc3NlcnRTdGF0ZW1lbnQoYXNzZXJ0S2V5d29yZCwgbGVmdFBhcmVudGhlc2lzLCBjb25kaXRpb24sCiAgICAgICAgICAgIGNvbW1hVG9rZW4sIG1lc3NhZ2UsIHNlbWljb2xvblRva2VuKSk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIEFzc2VydC5FeHByZXNzaW9uOgogICAgICAgIC8vIFRoZSBwYXJzZXIgaGFzIGFscmVhZHkgcmVwb3J0ZWQgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IGFzc2VydAogICAgICAgIC8vIGNhbm5vdCBiZSB1c2VkIGluIGFuIGV4cHJlc3Npb24uCiAgICAgICAgcHVzaChidWlsZFByb2JsZW0oZmFzdGEubWVzc2FnZUFzc2VydEFzRXhwcmVzc2lvbiwgYXNzZXJ0S2V5d29yZC5vZmZzZXQsCiAgICAgICAgICAgIGFzc2VydEtleXdvcmQubGVuZ3RoKSk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIEFzc2VydC5Jbml0aWFsaXplcjoKICAgICAgICBwdXNoKGZvcmVzdC5hc3NlcnRJbml0aWFsaXplcigKICAgICAgICAgICAgYXNzZXJ0S2V5d29yZCwgbGVmdFBhcmVudGhlc2lzLCBjb25kaXRpb24sIGNvbW1hVG9rZW4sIG1lc3NhZ2UpKTsKICAgICAgICBicmVhazsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kWWllbGRTdGF0ZW1lbnQoVG9rZW4geWllbGRUb2tlbiwgVG9rZW4gc3RhclRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiWWllbGRTdGF0ZW1lbnQiKTsKICAgIHB1c2goZm9yZXN0LnlpZWxkU3RhdGVtZW50KHlpZWxkVG9rZW4sIHN0YXJUb2tlbiwgcG9wRm9yVmFsdWUoKSwgZW5kVG9rZW4pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Td2l0Y2hCbG9jayhUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5Td2l0Y2hCbG9jayIpOwogICAgZW50ZXJMb2NhbFNjb3BlKCJzd2l0Y2ggYmxvY2siKTsKICAgIGVudGVyU3dpdGNoU2NvcGUoKTsKICAgIGVudGVyQnJlYWtUYXJnZXQodG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luU3dpdGNoQ2FzZShpbnQgbGFiZWxDb3VudCwgaW50IGV4cHJlc3Npb25Db3VudCwgVG9rZW4gZmlyc3RUb2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5Td2l0Y2hDYXNlIik7CiAgICBpbnQgY291bnQgPSBsYWJlbENvdW50ICsgZXhwcmVzc2lvbkNvdW50OwogICAgTGlzdDxPYmplY3Q+IGxhYmVsc0FuZEV4cHJlc3Npb25zID0KICAgICAgICBjb25zdCBGaXhlZE51bGxhYmxlTGlzdDxPYmplY3Q+KCkucG9wKHN0YWNrLCBjb3VudCk7CiAgICBMaXN0PExhYmVsPiBsYWJlbHMgPSBsYWJlbENvdW50ID09IDAgPyBudWxsIDogbmV3IExpc3Q8TGFiZWw+KGxhYmVsQ291bnQpOwogICAgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyA9CiAgICAgICAgbmV3IExpc3Q8RXhwcmVzc2lvbj4uZmlsbGVkKGV4cHJlc3Npb25Db3VudCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgaW50IGxhYmVsSW5kZXggPSAwOwogICAgaW50IGV4cHJlc3Npb25JbmRleCA9IDA7CiAgICBpZiAobGFiZWxzQW5kRXhwcmVzc2lvbnMgIT0gbnVsbCkgewogICAgICBmb3IgKE9iamVjdCBsYWJlbE9yRXhwcmVzc2lvbiBpbiBsYWJlbHNBbmRFeHByZXNzaW9ucykgewogICAgICAgIGlmIChsYWJlbE9yRXhwcmVzc2lvbiBpcyBMYWJlbCkgewogICAgICAgICAgbGFiZWxzW2xhYmVsSW5kZXgrK10gPSBsYWJlbE9yRXhwcmVzc2lvbjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZXhwcmVzc2lvbnNbZXhwcmVzc2lvbkluZGV4KytdID0gbGFiZWxPckV4cHJlc3Npb247CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBhc3NlcnQoc2NvcGUgPT0gc3dpdGNoU2NvcGUpOwogICAgaWYgKGxhYmVscyAhPSBudWxsKSB7CiAgICAgIGZvciAoTGFiZWwgbGFiZWwgaW4gbGFiZWxzKSB7CiAgICAgICAgU3RyaW5nIGxhYmVsTmFtZSA9IGxhYmVsLm5hbWU7CiAgICAgICAgaWYgKHNjb3BlLmhhc0xvY2FsTGFiZWwobGFiZWxOYW1lKSkgewogICAgICAgICAgLy8gVE9ETyhhaGUpOiBTaG91bGQgdmFsaWRhdGUgdGhpcyBpcyBhIGdvdG8gdGFyZ2V0LgogICAgICAgICAgaWYgKCFzY29wZS5jbGFpbUxhYmVsKGxhYmVsTmFtZSkpIHsKICAgICAgICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgIGZhc3RhLnRlbXBsYXRlRHVwbGljYXRlTGFiZWxJblN3aXRjaFN0YXRlbWVudAogICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGxhYmVsTmFtZSksCiAgICAgICAgICAgICAgICBsYWJlbC5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgbGFiZWxOYW1lLmxlbmd0aCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNjb3BlLmRlY2xhcmVMYWJlbCgKICAgICAgICAgICAgICBsYWJlbE5hbWUsIGNyZWF0ZUdvdG9UYXJnZXQoZmlyc3RUb2tlbi5jaGFyT2Zmc2V0KSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBwdXNoKGV4cHJlc3Npb25zKTsKICAgIHB1c2gobGFiZWxzID8/IE51bGxWYWx1ZS5MYWJlbHMpOwogICAgZW50ZXJMb2NhbFNjb3BlKCJzd2l0Y2ggY2FzZSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRTd2l0Y2hDYXNlKAogICAgICBpbnQgbGFiZWxDb3VudCwKICAgICAgaW50IGV4cHJlc3Npb25Db3VudCwKICAgICAgVG9rZW4gZGVmYXVsdEtleXdvcmQsCiAgICAgIFRva2VuIGNvbG9uQWZ0ZXJEZWZhdWx0LAogICAgICBpbnQgc3RhdGVtZW50Q291bnQsCiAgICAgIFRva2VuIGZpcnN0VG9rZW4sCiAgICAgIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJTd2l0Y2hDYXNlIik7CiAgICAvLyBXZSBhbHdheXMgY3JlYXRlIGEgYmxvY2sgaGVyZSBzbyB0aGF0IHdlIGxhdGVyIGtub3cgdGhhdCB0aGVyZSdzIGFsd2F5cwogICAgLy8gb25lIHN5bnRoZXRpYyBibG9jayB3aGVuIHdlIGZpbmlzaCBjb21waWxpbmcgdGhlIHN3aXRjaCBzdGF0ZW1lbnQgYW5kCiAgICAvLyBjaGVjayB0aGlzIHN3aXRjaCBjYXNlIHRvIHNlZSBpZiBpdCBmYWxscyB0aHJvdWdoIHRvIHRoZSBuZXh0IGNhc2UuCiAgICBTdGF0ZW1lbnQgYmxvY2sgPSBwb3BCbG9jayhzdGF0ZW1lbnRDb3VudCwgZmlyc3RUb2tlbiwgbnVsbCk7CiAgICBleGl0TG9jYWxTY29wZSgpOwogICAgTGlzdDxMYWJlbD4gbGFiZWxzID0gcG9wKCk7CiAgICBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zID0gcG9wKCk7CiAgICBMaXN0PGludD4gZXhwcmVzc2lvbk9mZnNldHMgPSA8aW50PltdOwogICAgZm9yIChFeHByZXNzaW9uIGV4cHJlc3Npb24gaW4gZXhwcmVzc2lvbnMpIHsKICAgICAgZXhwcmVzc2lvbk9mZnNldHMuYWRkKGZvcmVzdC5yZWFkT2Zmc2V0KGV4cHJlc3Npb24pKTsKICAgIH0KICAgIHB1c2gobmV3IFN3aXRjaENhc2VKdWRnbWVudChleHByZXNzaW9ucywgZXhwcmVzc2lvbk9mZnNldHMsIGJsb2NrLAogICAgICAgIGlzRGVmYXVsdDogZGVmYXVsdEtleXdvcmQgIT0gbnVsbCkKICAgICAgLi5maWxlT2Zmc2V0ID0gZmlyc3RUb2tlbi5jaGFyT2Zmc2V0KTsKICAgIHB1c2gobGFiZWxzID8/IE51bGxWYWx1ZS5MYWJlbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRTd2l0Y2hTdGF0ZW1lbnQoVG9rZW4gc3dpdGNoS2V5d29yZCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlN3aXRjaFN0YXRlbWVudCIpOwoKICAgIExpc3Q8U3dpdGNoQ2FzZT4gY2FzZXMgPSBwb3AoKTsKICAgIEp1bXBUYXJnZXQgdGFyZ2V0ID0gZXhpdEJyZWFrVGFyZ2V0KCk7CiAgICBleGl0U3dpdGNoU2NvcGUoKTsKICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBwb3BGb3JWYWx1ZSgpOwogICAgU3RhdGVtZW50IHJlc3VsdCA9IG5ldyBTd2l0Y2hTdGF0ZW1lbnRKdWRnbWVudChleHByZXNzaW9uLCBjYXNlcykKICAgICAgLi5maWxlT2Zmc2V0ID0gc3dpdGNoS2V5d29yZC5jaGFyT2Zmc2V0OwogICAgaWYgKHRhcmdldC5oYXNVc2VycykgewogICAgICByZXN1bHQgPSBmb3Jlc3Quc3ludGhldGljTGFiZWxlZFN0YXRlbWVudChyZXN1bHQpOwogICAgICB0YXJnZXQucmVzb2x2ZUJyZWFrcyhmb3Jlc3QsIHJlc3VsdCk7CiAgICB9CiAgICBleGl0TG9vcE9yU3dpdGNoKHJlc3VsdCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFN3aXRjaEJsb2NrKGludCBjYXNlQ291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJTd2l0Y2hCbG9jayIpOwogICAgTGlzdDxTd2l0Y2hDYXNlPiBjYXNlcyA9CiAgICAgICAgbmV3IExpc3Q8U3dpdGNoQ2FzZT4uZmlsbGVkKGNhc2VDb3VudCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IGNhc2VDb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIExpc3Q8TGFiZWw+IGxhYmVscyA9IHBvcCgpOwogICAgICBTd2l0Y2hDYXNlIGN1cnJlbnQgPSBjYXNlc1tpXSA9IHBvcCgpOwogICAgICBpZiAobGFiZWxzICE9IG51bGwpIHsKICAgICAgICBmb3IgKExhYmVsIGxhYmVsIGluIGxhYmVscykgewogICAgICAgICAgSnVtcFRhcmdldCB0YXJnZXQgPSBzd2l0Y2hTY29wZS5sb29rdXBMYWJlbChsYWJlbC5uYW1lKTsKICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgewogICAgICAgICAgICB0YXJnZXQucmVzb2x2ZUdvdG9zKGZvcmVzdCwgY3VycmVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhc2VDb3VudCAtIDE7IGkrKykgewogICAgICBTd2l0Y2hDYXNlIGN1cnJlbnQgPSBjYXNlc1tpXTsKICAgICAgQmxvY2sgYmxvY2sgPSBjdXJyZW50LmJvZHk7CiAgICAgIC8vIFtibG9ja10gaXMgYSBzeW50aGV0aWMgYmxvY2sgdGhhdCBpcyBhZGRlZCB0byBoYW5kbGUgdmFyaWFibGUKICAgICAgLy8gZGVjbGFyYXRpb25zIGluIHRoZSBzd2l0Y2ggY2FzZS4KICAgICAgVHJlZU5vZGUgbGFzdE5vZGUgPQogICAgICAgICAgYmxvY2suc3RhdGVtZW50cy5pc0VtcHR5ID8gbnVsbCA6IGJsb2NrLnN0YXRlbWVudHMubGFzdDsKICAgICAgaWYgKGZvcmVzdC5pc0Jsb2NrKGxhc3ROb2RlKSkgewogICAgICAgIC8vIFRoaXMgaXMgYSBub24tc3ludGhldGljIGJsb2NrLgogICAgICAgIEJsb2NrIGJsb2NrID0gbGFzdE5vZGU7CiAgICAgICAgbGFzdE5vZGUgPSBibG9jay5zdGF0ZW1lbnRzLmlzRW1wdHkgPyBudWxsIDogYmxvY2suc3RhdGVtZW50cy5sYXN0OwogICAgICB9CiAgICAgIGlmIChsYXN0Tm9kZSBpcyBFeHByZXNzaW9uU3RhdGVtZW50KSB7CiAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSBsYXN0Tm9kZTsKICAgICAgICBsYXN0Tm9kZSA9IHN0YXRlbWVudC5leHByZXNzaW9uOwogICAgICB9CiAgICAgIGlmIChsYXN0Tm9kZSBpcyEgQnJlYWtTdGF0ZW1lbnQgJiYKICAgICAgICAgIGxhc3ROb2RlIGlzISBDb250aW51ZVN3aXRjaFN0YXRlbWVudCAmJgogICAgICAgICAgbGFzdE5vZGUgaXMhIFJldGhyb3cgJiYKICAgICAgICAgIGxhc3ROb2RlIGlzISBSZXR1cm5TdGF0ZW1lbnQgJiYKICAgICAgICAgICFmb3Jlc3QuaXNUaHJvdyhsYXN0Tm9kZSkpIHsKICAgICAgICBibG9jay5hZGRTdGF0ZW1lbnQoCiAgICAgICAgICAgIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KGJ1aWxkRmFsbFRocm91Z2hFcnJvcihjdXJyZW50LmZpbGVPZmZzZXQpKSk7CiAgICAgIH0KICAgIH0KCiAgICBwdXNoKGNhc2VzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ2FzZU1hdGNoKFRva2VuIGNhc2VLZXl3b3JkLCBUb2tlbiBjb2xvbikgewogICAgZGVidWdFdmVudCgiQ2FzZU1hdGNoIik7CiAgICAvLyBEbyBub3RoaW5nLiBIYW5kbGVkIGJ5IFtoYW5kbGVTd2l0Y2hDYXNlXS4KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQnJlYWtTdGF0ZW1lbnQoCiAgICAgIGJvb2wgaGFzVGFyZ2V0LCBUb2tlbiBicmVha0tleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJCcmVha1N0YXRlbWVudCIpOwogICAgSnVtcFRhcmdldCB0YXJnZXQgPSBicmVha1RhcmdldDsKICAgIElkZW50aWZpZXIgaWRlbnRpZmllcjsKICAgIFN0cmluZyBuYW1lOwogICAgaWYgKGhhc1RhcmdldCkgewogICAgICBpZGVudGlmaWVyID0gcG9wKCk7CiAgICAgIG5hbWUgPSBpZGVudGlmaWVyLm5hbWU7CiAgICAgIHRhcmdldCA9IHNjb3BlLmxvb2t1cExhYmVsKG5hbWUpOwogICAgfQogICAgaWYgKHRhcmdldCA9PSBudWxsICYmIG5hbWUgPT0gbnVsbCkgewogICAgICBwdXNoKHByb2JsZW1Jbkxvb3BPclN3aXRjaCA9IGJ1aWxkUHJvYmxlbVN0YXRlbWVudCgKICAgICAgICAgIGZhc3RhLm1lc3NhZ2VCcmVha091dHNpZGVPZkxvb3AsIGJyZWFrS2V5d29yZC5jaGFyT2Zmc2V0KSk7CiAgICB9IGVsc2UgaWYgKHRhcmdldCA9PSBudWxsIHx8CiAgICAgICAgdGFyZ2V0IGlzISBKdW1wVGFyZ2V0IHx8CiAgICAgICAgIXRhcmdldC5pc0JyZWFrVGFyZ2V0KSB7CiAgICAgIFRva2VuIGxhYmVsVG9rZW4gPSBicmVha0tleXdvcmQubmV4dDsKICAgICAgcHVzaChwcm9ibGVtSW5Mb29wT3JTd2l0Y2ggPSBidWlsZFByb2JsZW1TdGF0ZW1lbnQoCiAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUludmFsaWRCcmVha1RhcmdldC53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgbGFiZWxUb2tlbi5jaGFyT2Zmc2V0LAogICAgICAgICAgbGVuZ3RoOiBsYWJlbFRva2VuLmxlbmd0aCkpOwogICAgfSBlbHNlIGlmICh0YXJnZXQuZnVuY3Rpb25OZXN0aW5nTGV2ZWwgIT0gZnVuY3Rpb25OZXN0aW5nTGV2ZWwpIHsKICAgICAgcHVzaChidWlsZFByb2JsZW1UYXJnZXRPdXRzaWRlTG9jYWxGdW5jdGlvbihuYW1lLCBicmVha0tleXdvcmQpKTsKICAgIH0gZWxzZSB7CiAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPQogICAgICAgICAgZm9yZXN0LmJyZWFrU3RhdGVtZW50KGJyZWFrS2V5d29yZCwgaWRlbnRpZmllciwgZW5kVG9rZW4pOwogICAgICB0YXJnZXQuYWRkQnJlYWsoc3RhdGVtZW50KTsKICAgICAgcHVzaChzdGF0ZW1lbnQpOwogICAgfQogIH0KCiAgU3RhdGVtZW50IGJ1aWxkUHJvYmxlbVRhcmdldE91dHNpZGVMb2NhbEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBUb2tlbiBrZXl3b3JkKSB7CiAgICBTdGF0ZW1lbnQgcHJvYmxlbTsKICAgIGJvb2wgaXNCcmVhayA9IG9wdGlvbmFsKCJicmVhayIsIGtleXdvcmQpOwogICAgaWYgKG5hbWUgIT0gbnVsbCkgewogICAgICBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyk+IHRlbXBsYXRlID0gaXNCcmVhawogICAgICAgICAgPyBmYXN0YS50ZW1wbGF0ZUJyZWFrVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uCiAgICAgICAgICA6IGZhc3RhLnRlbXBsYXRlQ29udGludWVUYXJnZXRPdXRzaWRlRnVuY3Rpb247CiAgICAgIHByb2JsZW0gPSBidWlsZFByb2JsZW1TdGF0ZW1lbnQoCiAgICAgICAgICB0ZW1wbGF0ZS53aXRoQXJndW1lbnRzKG5hbWUpLCBvZmZzZXRGb3JUb2tlbihrZXl3b3JkKSwKICAgICAgICAgIGxlbmd0aDogbGVuZ3RoT2ZTcGFuKGtleXdvcmQsIGtleXdvcmQubmV4dCkpOwogICAgfSBlbHNlIHsKICAgICAgTWVzc2FnZSBtZXNzYWdlID0gaXNCcmVhawogICAgICAgICAgPyBmYXN0YS5tZXNzYWdlQW5vbnltb3VzQnJlYWtUYXJnZXRPdXRzaWRlRnVuY3Rpb24KICAgICAgICAgIDogZmFzdGEubWVzc2FnZUFub255bW91c0NvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uOwogICAgICBwcm9ibGVtID0gYnVpbGRQcm9ibGVtU3RhdGVtZW50KG1lc3NhZ2UsIG9mZnNldEZvclRva2VuKGtleXdvcmQpLAogICAgICAgICAgbGVuZ3RoOiBsZW5ndGhGb3JUb2tlbihrZXl3b3JkKSk7CiAgICB9CiAgICBwcm9ibGVtSW5Mb29wT3JTd2l0Y2ggPz89IHByb2JsZW07CiAgICByZXR1cm4gcHJvYmxlbTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ29udGludWVTdGF0ZW1lbnQoCiAgICAgIGJvb2wgaGFzVGFyZ2V0LCBUb2tlbiBjb250aW51ZUtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJDb250aW51ZVN0YXRlbWVudCIpOwogICAgSnVtcFRhcmdldCB0YXJnZXQgPSBjb250aW51ZVRhcmdldDsKICAgIElkZW50aWZpZXIgaWRlbnRpZmllcjsKICAgIFN0cmluZyBuYW1lOwogICAgaWYgKGhhc1RhcmdldCkgewogICAgICBpZGVudGlmaWVyID0gcG9wKCk7CiAgICAgIG5hbWUgPSBpZGVudGlmaWVyLm5hbWU7CiAgICAgIERlY2xhcmF0aW9uIG5hbWVkVGFyZ2V0ID0gc2NvcGUubG9va3VwTGFiZWwoaWRlbnRpZmllci5uYW1lKTsKICAgICAgaWYgKG5hbWVkVGFyZ2V0ICE9IG51bGwgJiYgbmFtZWRUYXJnZXQgaXMhIEp1bXBUYXJnZXQpIHsKICAgICAgICBUb2tlbiBsYWJlbFRva2VuID0gY29udGludWVLZXl3b3JkLm5leHQ7CiAgICAgICAgcHVzaChwcm9ibGVtSW5Mb29wT3JTd2l0Y2ggPSBidWlsZFByb2JsZW1TdGF0ZW1lbnQoCiAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VDb250aW51ZUxhYmVsTm90VGFyZ2V0LCBsYWJlbFRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgICAgIGxlbmd0aDogbGFiZWxUb2tlbi5sZW5ndGgpKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGFyZ2V0ID0gbmFtZWRUYXJnZXQ7CiAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgewogICAgICAgIGlmIChzd2l0Y2hTY29wZSA9PSBudWxsKSB7CiAgICAgICAgICBwdXNoKGJ1aWxkUHJvYmxlbVN0YXRlbWVudCgKICAgICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUxhYmVsTm90Rm91bmQud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgICAgICBjb250aW51ZUtleXdvcmQubmV4dC5jaGFyT2Zmc2V0KSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHN3aXRjaFNjb3BlLmZvcndhcmREZWNsYXJlTGFiZWwoCiAgICAgICAgICAgIGlkZW50aWZpZXIubmFtZSwgdGFyZ2V0ID0gY3JlYXRlR290b1RhcmdldChpZGVudGlmaWVyLmNoYXJPZmZzZXQpKTsKICAgICAgfQogICAgICBpZiAodGFyZ2V0LmlzR290b1RhcmdldCAmJgogICAgICAgICAgdGFyZ2V0LmZ1bmN0aW9uTmVzdGluZ0xldmVsID09IGZ1bmN0aW9uTmVzdGluZ0xldmVsKSB7CiAgICAgICAgQ29udGludWVTd2l0Y2hTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbmV3IENvbnRpbnVlU3dpdGNoSnVkZ21lbnQobnVsbCkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGNvbnRpbnVlS2V5d29yZC5jaGFyT2Zmc2V0OwogICAgICAgIHRhcmdldC5hZGRHb3RvKHN0YXRlbWVudCk7CiAgICAgICAgcHVzaChzdGF0ZW1lbnQpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgaWYgKHRhcmdldCA9PSBudWxsKSB7CiAgICAgIHB1c2gocHJvYmxlbUluTG9vcE9yU3dpdGNoID0gYnVpbGRQcm9ibGVtU3RhdGVtZW50KAogICAgICAgICAgZmFzdGEubWVzc2FnZUNvbnRpbnVlV2l0aG91dExhYmVsSW5DYXNlLCBjb250aW51ZUtleXdvcmQuY2hhck9mZnNldCwKICAgICAgICAgIGxlbmd0aDogY29udGludWVLZXl3b3JkLmxlbmd0aCkpOwogICAgfSBlbHNlIGlmICghdGFyZ2V0LmlzQ29udGludWVUYXJnZXQpIHsKICAgICAgVG9rZW4gbGFiZWxUb2tlbiA9IGNvbnRpbnVlS2V5d29yZC5uZXh0OwogICAgICBwdXNoKHByb2JsZW1Jbkxvb3BPclN3aXRjaCA9IGJ1aWxkUHJvYmxlbVN0YXRlbWVudCgKICAgICAgICAgIGZhc3RhLnRlbXBsYXRlSW52YWxpZENvbnRpbnVlVGFyZ2V0LndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICBsYWJlbFRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgICBsZW5ndGg6IGxhYmVsVG9rZW4ubGVuZ3RoKSk7CiAgICB9IGVsc2UgaWYgKHRhcmdldC5mdW5jdGlvbk5lc3RpbmdMZXZlbCAhPSBmdW5jdGlvbk5lc3RpbmdMZXZlbCkgewogICAgICBwdXNoKGJ1aWxkUHJvYmxlbVRhcmdldE91dHNpZGVMb2NhbEZ1bmN0aW9uKG5hbWUsIGNvbnRpbnVlS2V5d29yZCkpOwogICAgfSBlbHNlIHsKICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9CiAgICAgICAgICBmb3Jlc3QuY29udGludWVTdGF0ZW1lbnQoY29udGludWVLZXl3b3JkLCBpZGVudGlmaWVyLCBlbmRUb2tlbik7CiAgICAgIHRhcmdldC5hZGRDb250aW51ZShzdGF0ZW1lbnQpOwogICAgICBwdXNoKHN0YXRlbWVudCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luVHlwZVZhcmlhYmxlKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpblR5cGVWYXJpYWJsZSIpOwogICAgSWRlbnRpZmllciBuYW1lID0gcG9wKCk7CiAgICBMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zID0gcG9wKCk7CiAgICBLZXJuZWxUeXBlVmFyaWFibGVCdWlsZGVyIHZhcmlhYmxlID0gbmV3IEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXIoCiAgICAgICAgbmFtZS5uYW1lLCBsaWJyYXJ5LCBuYW1lLmNoYXJPZmZzZXQsIG51bGwpOwogICAgaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKICAgICAgaW5mZXJBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CiAgICAgIGZvciAoRXhwcmVzc2lvbiBhbm5vdGF0aW9uIGluIGFubm90YXRpb25zKSB7CiAgICAgICAgdmFyaWFibGUucGFyYW1ldGVyLmFkZEFubm90YXRpb24oYW5ub3RhdGlvbik7CiAgICAgIH0KICAgIH0KICAgIHB1c2godmFyaWFibGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVUeXBlVmFyaWFibGVzRGVmaW5lZChUb2tlbiB0b2tlbiwgaW50IGNvdW50KSB7CiAgICBkZWJ1Z0V2ZW50KCJoYW5kbGVUeXBlVmFyaWFibGVzRGVmaW5lZCIpOwogICAgYXNzZXJ0KGNvdW50ID4gMCk7CiAgICBMaXN0PEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMgPQogICAgICAgIGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXI+KCkucG9wKHN0YWNrLCBjb3VudCk7CiAgICBlbnRlckZ1bmN0aW9uVHlwZVNjb3BlKHR5cGVWYXJpYWJsZXMpOwogICAgcHVzaCh0eXBlVmFyaWFibGVzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVHlwZVZhcmlhYmxlKFRva2VuIHRva2VuLCBpbnQgaW5kZXgsIFRva2VuIGV4dGVuZHNPclN1cGVyKSB7CiAgICBkZWJ1Z0V2ZW50KCJUeXBlVmFyaWFibGUiKTsKICAgIFVucmVzb2x2ZWRUeXBlPEtlcm5lbFR5cGVCdWlsZGVyPiBib3VuZCA9IHBvcCgpOwogICAgLy8gUGVlayB0byBsZWF2ZSB0eXBlIHBhcmFtZXRlcnMgb24gdG9wIG9mIHN0YWNrLgogICAgTGlzdDxLZXJuZWxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzID0gcGVlaygpOwoKICAgIEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXIgdmFyaWFibGUgPSB0eXBlVmFyaWFibGVzW2luZGV4XTsKICAgIHZhcmlhYmxlLmJvdW5kID0gYm91bmQ/LmJ1aWxkZXI7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFR5cGVWYXJpYWJsZXMoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlR5cGVWYXJpYWJsZXMiKTsKICAgIC8vIFBlZWsgdG8gbGVhdmUgdHlwZSBwYXJhbWV0ZXJzIG9uIHRvcCBvZiBzdGFjay4KICAgIExpc3Q8S2VybmVsVHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcyA9IHBlZWsoKTsKCiAgICBpZiAoIWxlZ2FjeU1vZGUpIHsKICAgICAgTGlzdDxLZXJuZWxUeXBlQnVpbGRlcj4gY2FsY3VsYXRlZEJvdW5kcyA9IGNhbGN1bGF0ZUJvdW5kcygKICAgICAgICAgIHR5cGVWYXJpYWJsZXMsCiAgICAgICAgICBsaWJyYXJ5LmxvYWRlci50YXJnZXQuZHluYW1pY1R5cGUsCiAgICAgICAgICBsaWJyYXJ5LmxvYWRlci50YXJnZXQuYm90dG9tVHlwZSwKICAgICAgICAgIGxpYnJhcnkubG9hZGVyLnRhcmdldC5vYmplY3RDbGFzc0J1aWxkZXIpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVWYXJpYWJsZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICB0eXBlVmFyaWFibGVzW2ldLmRlZmF1bHRUeXBlID0gY2FsY3VsYXRlZEJvdW5kc1tpXTsKICAgICAgICB0eXBlVmFyaWFibGVzW2ldLmRlZmF1bHRUeXBlLnJlc29sdmVJbihzY29wZSwKICAgICAgICAgICAgdHlwZVZhcmlhYmxlc1tpXS5jaGFyT2Zmc2V0LCB0eXBlVmFyaWFibGVzW2ldLmZpbGVVcmksIGxpYnJhcnkpOwogICAgICAgIHR5cGVWYXJpYWJsZXNbaV0uZmluaXNoKAogICAgICAgICAgICBsaWJyYXJ5LAogICAgICAgICAgICBsaWJyYXJ5LmxvYWRlci50YXJnZXQub2JqZWN0Q2xhc3NCdWlsZGVyLAogICAgICAgICAgICBsaWJyYXJ5LmxvYWRlci50YXJnZXQuZHluYW1pY1R5cGUpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVWYXJpYWJsZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICB0eXBlVmFyaWFibGVzW2ldLmRlZmF1bHRUeXBlID0gbGlicmFyeS5sb2FkZXIudGFyZ2V0LmR5bmFtaWNUeXBlOwogICAgICAgIHR5cGVWYXJpYWJsZXNbaV0uZmluaXNoKAogICAgICAgICAgICBsaWJyYXJ5LAogICAgICAgICAgICBsaWJyYXJ5LmxvYWRlci50YXJnZXQub2JqZWN0Q2xhc3NCdWlsZGVyLAogICAgICAgICAgICBsaWJyYXJ5LmxvYWRlci50YXJnZXQuZHluYW1pY1R5cGUpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vVHlwZVZhcmlhYmxlcyhUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTm9UeXBlVmFyaWFibGVzIik7CiAgICBlbnRlckZ1bmN0aW9uVHlwZVNjb3BlKG51bGwpOwogICAgcHVzaChOdWxsVmFsdWUuVHlwZVZhcmlhYmxlcyk7CiAgfQoKICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVWYXJpYWJsZUJ1aWxkZXJzVG9LZXJuZWwoCiAgICAgIExpc3Q8S2VybmVsVHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlQnVpbGRlcnMpIHsKICAgIGlmICh0eXBlVmFyaWFibGVCdWlsZGVycyA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPSBuZXcgTGlzdDxUeXBlUGFyYW1ldGVyPi5maWxsZWQoCiAgICAgICAgdHlwZVZhcmlhYmxlQnVpbGRlcnMubGVuZ3RoLCBudWxsLAogICAgICAgIGdyb3dhYmxlOiB0cnVlKTsKICAgIGludCBpID0gMDsKICAgIGZvciAoS2VybmVsVHlwZVZhcmlhYmxlQnVpbGRlciBidWlsZGVyIGluIHR5cGVWYXJpYWJsZUJ1aWxkZXJzKSB7CiAgICAgIHR5cGVQYXJhbWV0ZXJzW2krK10gPSBidWlsZGVyLnRhcmdldDsKICAgIH0KICAgIHJldHVybiB0eXBlUGFyYW1ldGVyczsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW52YWxpZFN0YXRlbWVudChUb2tlbiB0b2tlbiwgTWVzc2FnZSBtZXNzYWdlKSB7CiAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gcG9wKCk7CiAgICBwdXNoKG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KGRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKAogICAgICAgIGJ1aWxkUHJvYmxlbShtZXNzYWdlLCBzdGF0ZW1lbnQuZmlsZU9mZnNldCwgbm9MZW5ndGgpKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZFByb2JsZW0oTWVzc2FnZSBtZXNzYWdlLCBpbnQgY2hhck9mZnNldCwgaW50IGxlbmd0aCwKICAgICAge0xpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQsIGJvb2wgc3VwcHJlc3NNZXNzYWdlOiBmYWxzZX0pIHsKICAgIGlmICghc3VwcHJlc3NNZXNzYWdlKSB7CiAgICAgIGFkZFByb2JsZW0obWVzc2FnZSwgY2hhck9mZnNldCwgbGVuZ3RoLAogICAgICAgICAgd2FzSGFuZGxlZDogdHJ1ZSwgY29udGV4dDogY29udGV4dCk7CiAgICB9CiAgICBTdHJpbmcgdGV4dCA9IGxpYnJhcnkubG9hZGVyLnRhcmdldC5jb250ZXh0CiAgICAgICAgLmZvcm1hdChtZXNzYWdlLndpdGhMb2NhdGlvbih1cmksIGNoYXJPZmZzZXQsIGxlbmd0aCksIFNldmVyaXR5LmVycm9yKTsKICAgIHJldHVybiB3cmFwU3ludGhldGljRXhwcmVzc2lvbigKICAgICAgICBuZXcgSW52YWxpZEV4cHJlc3Npb24odGV4dCkuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0LCBjaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gd3JhcEluUHJvYmxlbShFeHByZXNzaW9uIGV4cHJlc3Npb24sIE1lc3NhZ2UgbWVzc2FnZSwgaW50IGxlbmd0aCwKICAgICAge0xpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHR9KSB7CiAgICBpbnQgY2hhck9mZnNldCA9IGZvcmVzdC5yZWFkT2Zmc2V0KGV4cHJlc3Npb24pOwogICAgU2V2ZXJpdHkgc2V2ZXJpdHkgPSBtZXNzYWdlLmNvZGUuc2V2ZXJpdHk7CiAgICBpZiAoc2V2ZXJpdHkgPT0gU2V2ZXJpdHkuZXJyb3IgfHwKICAgICAgICBzZXZlcml0eSA9PSBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcgJiYgIWxlZ2FjeU1vZGUpIHsKICAgICAgcmV0dXJuIHdyYXBJbkxvY2F0ZWRQcm9ibGVtKAogICAgICAgICAgZXhwcmVzc2lvbiwgbWVzc2FnZS53aXRoTG9jYXRpb24odXJpLCBjaGFyT2Zmc2V0LCBsZW5ndGgpLAogICAgICAgICAgY29udGV4dDogY29udGV4dCk7CiAgICB9IGVsc2UgewogICAgICBhZGRQcm9ibGVtKG1lc3NhZ2UsIGNoYXJPZmZzZXQsIGxlbmd0aCwgY29udGV4dDogY29udGV4dCk7CiAgICAgIHJldHVybiBleHByZXNzaW9uOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiB3cmFwSW5Mb2NhdGVkUHJvYmxlbShFeHByZXNzaW9uIGV4cHJlc3Npb24sIExvY2F0ZWRNZXNzYWdlIG1lc3NhZ2UsCiAgICAgIHtMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0fSkgewogICAgLy8gVE9ETyhhc2tlc2MpOiBQcm9kdWNlIGV4cGxpY2l0IGVycm9yIGV4cHJlc3Npb24gd3JhcHBpbmcgdGhlIG9yaWdpbmFsLgogICAgLy8gU2VlIFtpc3N1ZSAyOTcxN10oaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzI5NzE3KQogICAgaW50IG9mZnNldCA9IGZvcmVzdC5yZWFkT2Zmc2V0KGV4cHJlc3Npb24pOwogICAgaWYgKG9mZnNldCA9PSAtMSkgewogICAgICBvZmZzZXQgPSBtZXNzYWdlLmNoYXJPZmZzZXQ7CiAgICB9CiAgICByZXR1cm4gbmV3IExldCgKICAgICAgICBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZSgKICAgICAgICAgICAgZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgICAgbWVzc2FnZS5tZXNzYWdlT2JqZWN0LCBtZXNzYWdlLmNoYXJPZmZzZXQsIG1lc3NhZ2UubGVuZ3RoLAogICAgICAgICAgICAgICAgY29udGV4dDogY29udGV4dCkpLAogICAgICAgICAgICB0eXBlOiBjb25zdCBCb3R0b21UeXBlKCkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQsCiAgICAgICAgZXhwcmVzc2lvbik7CiAgfQoKICBFeHByZXNzaW9uIGJ1aWxkRmFsbFRocm91Z2hFcnJvcihpbnQgY2hhck9mZnNldCkgewogICAgYWRkUHJvYmxlbShmYXN0YS5tZXNzYWdlU3dpdGNoQ2FzZUZhbGxUaHJvdWdoLCBjaGFyT2Zmc2V0LCBub0xlbmd0aCk7CgogICAgLy8gVE9ETyhhaGUpOiBUaGUgZm9sbG93aW5nIGRvZXNuJ3QgbWFrZSBzZW5zZSBmb3IgdGhlIEFuYWx5emVyLiBJdCBzaG91bGQKICAgIC8vIGJlIG1vdmVkIHRvIFtGb3Jlc3RdIG9yIGNvbmRpdGlvbmFsIG9uIGBmb3Jlc3QgaXMgRmFuZ29ybmAuCgogICAgLy8gVE9ETyhhaGUpOiBDb21wdXRlIGEgTG9jYXRlZE1lc3NhZ2UgYWJvdmUgaW5zdGVhZD8KICAgIExvY2F0aW9uIGxvY2F0aW9uID0gbWVzc2FnZXMuZ2V0TG9jYXRpb25Gcm9tVXJpKHVyaSwgY2hhck9mZnNldCk7CgogICAgcmV0dXJuIGZvcmVzdC50aHJvd0V4cHJlc3Npb24oCiAgICAgICAgbnVsbCwKICAgICAgICBidWlsZFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgICAgIGxpYnJhcnkubG9hZGVyLmNvcmVUeXBlcy5mYWxsVGhyb3VnaEVycm9yVXJsQW5kTGluZUNvbnN0cnVjdG9yLAogICAgICAgICAgICBmb3Jlc3QuYXJndW1lbnRzKDxFeHByZXNzaW9uPlsKICAgICAgICAgICAgICBmb3Jlc3QubGl0ZXJhbFN0cmluZygiJHtsb2NhdGlvbj8uZmlsZSA/PyB1cml9IiwgbnVsbCkKICAgICAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgZm9yZXN0LmxpdGVyYWxJbnQobG9jYXRpb24/LmxpbmUgPz8gMCwgbnVsbCkKICAgICAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQsCiAgICAgICAgICAgIF0sIG5vTG9jYXRpb24pLAogICAgICAgICAgICBjaGFyT2Zmc2V0OiBjaGFyT2Zmc2V0KSkKICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yKAogICAgICBNZXNzYWdlIG1lc3NhZ2UsIFN0cmluZyBjbGFzc05hbWUsCiAgICAgIFtpbnQgY2hhck9mZnNldCA9IC0xXSkgewogICAgYWRkUHJvYmxlbUVycm9ySWZDb25zdChtZXNzYWdlLCBjaGFyT2Zmc2V0LCBjbGFzc05hbWUubGVuZ3RoKTsKICAgIC8vIFRPRE8oYWhlKTogVGhlIGZvbGxvd2luZyBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gQW5hbHl6ZXIgQVNULgogICAgRGVjbGFyYXRpb24gY29uc3RydWN0b3IgPQogICAgICAgIGxpYnJhcnkubG9hZGVyLmdldEFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3IoKTsKICAgIEV4cHJlc3Npb24gaW52b2NhdGlvbiA9IGJ1aWxkU3RhdGljSW52b2NhdGlvbigKICAgICAgICBjb25zdHJ1Y3Rvci50YXJnZXQsCiAgICAgICAgZm9yZXN0LmFyZ3VtZW50cyg8RXhwcmVzc2lvbj5bCiAgICAgICAgICBmb3Jlc3QubGl0ZXJhbFN0cmluZyhjbGFzc05hbWUsIG51bGwpLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldAogICAgICAgIF0sIG5vTG9jYXRpb24pCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0LAogICAgICAgIGNoYXJPZmZzZXQ6IGNoYXJPZmZzZXQpOwogICAgaWYgKGludm9jYXRpb24gaXMgc2hhZG93LlN5bnRoZXRpY0V4cHJlc3Npb25KdWRnbWVudCkgewogICAgICBpbnZvY2F0aW9uID0gZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oaW52b2NhdGlvbik7CiAgICB9CiAgICByZXR1cm4gZm9yZXN0LnRocm93RXhwcmVzc2lvbihudWxsLCBpbnZvY2F0aW9uKS4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgfQoKICBTdGF0ZW1lbnQgYnVpbGRQcm9ibGVtU3RhdGVtZW50KE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsCiAgICAgIHtMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0LCBpbnQgbGVuZ3RoLCBib29sIHN1cHByZXNzTWVzc2FnZTogZmFsc2V9KSB7CiAgICBsZW5ndGggPz89IG5vTGVuZ3RoOwogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50SnVkZ21lbnQoYnVpbGRQcm9ibGVtKAogICAgICAgIG1lc3NhZ2UsIGNoYXJPZmZzZXQsIGxlbmd0aCwKICAgICAgICBjb250ZXh0OiBjb250ZXh0LCBzdXBwcmVzc01lc3NhZ2U6IHN1cHByZXNzTWVzc2FnZSkpOwogIH0KCiAgU3RhdGVtZW50IHdyYXBJblByb2JsZW1TdGF0ZW1lbnQoU3RhdGVtZW50IHN0YXRlbWVudCwgTWVzc2FnZSBtZXNzYWdlKSB7CiAgICAvLyBUT0RPKGFza2VzYyk6IFByb2R1Y2UgZXhwbGljaXQgZXJyb3Igc3RhdGVtZW50IHdyYXBwaW5nIHRoZSBvcmlnaW5hbC4KICAgIC8vIFNlZSBbaXNzdWUgMjk3MTddKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8yOTcxNykKICAgIHJldHVybiBidWlsZFByb2JsZW1TdGF0ZW1lbnQobWVzc2FnZSwgc3RhdGVtZW50LmZpbGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXIgYnVpbGRJbnZhbGlkSW5pdGlhbGl6ZXIoRXhwcmVzc2lvbiBleHByZXNzaW9uLAogICAgICBbaW50IGNoYXJPZmZzZXQgPSAtMV0pIHsKICAgIG5lZWRzSW1wbGljaXRTdXBlckluaXRpYWxpemVyID0gZmFsc2U7CiAgICByZXR1cm4gbmV3IFNoYWRvd0ludmFsaWRJbml0aWFsaXplcigKICAgICAgICBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZShleHByZXNzaW9uKSkKICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICB9CgogIEluaXRpYWxpemVyIGJ1aWxkSW52YWxpZFN1cGVySW5pdGlhbGl6ZXIoCiAgICAgIENvbnN0cnVjdG9yIHRhcmdldCwgQXJndW1lbnRzSnVkZ21lbnQgYXJndW1lbnRzLCBFeHByZXNzaW9uIGV4cHJlc3Npb24sCiAgICAgIFtpbnQgY2hhck9mZnNldCA9IC0xXSkgewogICAgbmVlZHNJbXBsaWNpdFN1cGVySW5pdGlhbGl6ZXIgPSBmYWxzZTsKICAgIHJldHVybiBuZXcgSW52YWxpZFN1cGVySW5pdGlhbGl6ZXJKdWRnbWVudCgKICAgICAgICB0YXJnZXQsIGFyZ3VtZW50cywgbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoZXhwcmVzc2lvbikpCiAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgfQoKICBJbml0aWFsaXplciBidWlsZER1cGxpY2F0ZWRJbml0aWFsaXplcihGaWVsZCBmaWVsZCwgRXhwcmVzc2lvbiB2YWx1ZSwKICAgICAgU3RyaW5nIG5hbWUsIGludCBvZmZzZXQsIGludCBwcmV2aW91c0luaXRpYWxpemVyT2Zmc2V0KSB7CiAgICByZXR1cm4gbmV3IFNoYWRvd0ludmFsaWRGaWVsZEluaXRpYWxpemVyKAogICAgICAgIGZpZWxkLAogICAgICAgIHZhbHVlLAogICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKGRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKAogICAgICAgICAgICBidWlsZFByb2JsZW0oCiAgICAgICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUZpbmFsSW5zdGFuY2VWYXJpYWJsZUFscmVhZHlJbml0aWFsaXplZAogICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICAgICAgb2Zmc2V0LAogICAgICAgICAgICAgICAgbm9MZW5ndGgpKSkpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICB9CgogIC8vLyBQYXJhbWV0ZXIgW2Zvcm1hbFR5cGVdIHNob3VsZCBvbmx5IGJlIHBhc3NlZCBpbiB0aGUgc3BlY2lhbCBjYXNlIG9mCiAgLy8vIGJ1aWxkaW5nIGEgZmllbGQgaW5pdGlhbGl6ZXIgYXMgYSBkZXN1Z2FyaW5nIG9mIGFuIGluaXRpYWxpemluZyBmb3JtYWwKICAvLy8gcGFyYW1ldGVyLiAgVGhlIHNwZWMgc2F5cyB0aGUgZm9sbG93aW5nOgogIC8vLwogIC8vLyAiSWYgYW4gZXhwbGljaXQgdHlwZSBpcyBhdHRhY2hlZCB0byB0aGUgaW5pdGlhbGl6aW5nIGZvcm1hbCwgdGhhdCBpcyBpdHMKICAvLy8gc3RhdGljIHR5cGUuICBPdGhlcndpc2UsIHRoZSB0eXBlIG9mIGFuIGluaXRpYWxpemluZyBmb3JtYWwgbmFtZWQgX2lkXyBpcwogIC8vLyBfVGlkXywgd2hlcmUgX1RpZF8gaXMgdGhlIHR5cGUgb2YgdGhlIGluc3RhbmNlIHZhcmlhYmxlIG5hbWVkIF9pZF8gaW4gdGhlCiAgLy8vIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjbGFzcy4gIEl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgdGhlIHN0YXRpYyB0eXBlIG9mCiAgLy8vIF9pZF8gaXMgbm90IGEgc3VidHlwZSBvZiBfVGlkXy4iCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXIgYnVpbGRGaWVsZEluaXRpYWxpemVyKGJvb2wgaXNTeW50aGV0aWMsIFN0cmluZyBuYW1lLAogICAgICBpbnQgZmllbGROYW1lT2Zmc2V0LCBpbnQgYXNzaWdubWVudE9mZnNldCwgRXhwcmVzc2lvbiBleHByZXNzaW9uLAogICAgICB7RGFydFR5cGUgZm9ybWFsVHlwZX0pIHsKICAgIERlY2xhcmF0aW9uIGJ1aWxkZXIgPQogICAgICAgIGNsYXNzQnVpbGRlci5zY29wZS5sb2NhbFtuYW1lXSA/PyBjbGFzc0J1aWxkZXIub3JpZ2luLnNjb3BlLmxvY2FsW25hbWVdOwogICAgaWYgKGJ1aWxkZXI/Lm5leHQgIT0gbnVsbCkgewogICAgICAvLyBEdXBsaWNhdGVkIG5hbWUsIGFscmVhZHkgcmVwb3J0ZWQuCiAgICAgIHJldHVybiBuZXcgTG9jYWxJbml0aWFsaXplcigKICAgICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKAogICAgICAgICAgICAgIGRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKGJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2Uud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgICAgICAgICAgZmllbGROYW1lT2Zmc2V0LAogICAgICAgICAgICAgICAgICBuYW1lLmxlbmd0aCkpCiAgICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWVsZE5hbWVPZmZzZXQpCiAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpZWxkTmFtZU9mZnNldCkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWVsZE5hbWVPZmZzZXQ7CiAgICB9IGVsc2UgaWYgKGJ1aWxkZXIgaXMgS2VybmVsRmllbGRCdWlsZGVyICYmIGJ1aWxkZXIuaXNJbnN0YW5jZU1lbWJlcikgewogICAgICBpbml0aWFsaXplZEZpZWxkcyA/Pz0gPFN0cmluZywgaW50Pnt9OwogICAgICBpZiAoaW5pdGlhbGl6ZWRGaWVsZHMuY29udGFpbnNLZXkobmFtZSkpIHsKICAgICAgICByZXR1cm4gYnVpbGREdXBsaWNhdGVkSW5pdGlhbGl6ZXIoYnVpbGRlci5maWVsZCwgZXhwcmVzc2lvbiwgbmFtZSwKICAgICAgICAgICAgYXNzaWdubWVudE9mZnNldCwgaW5pdGlhbGl6ZWRGaWVsZHNbbmFtZV0pOwogICAgICB9CiAgICAgIGluaXRpYWxpemVkRmllbGRzW25hbWVdID0gYXNzaWdubWVudE9mZnNldDsKICAgICAgaWYgKGJ1aWxkZXIuaXNGaW5hbCAmJiBidWlsZGVyLmhhc0luaXRpYWxpemVyKSB7CiAgICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWQKICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICBhc3NpZ25tZW50T2Zmc2V0LAogICAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgICAgY29udGV4dDogWwogICAgICAgICAgICAgIGZhc3RhLnRlbXBsYXRlRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkQ2F1c2UKICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobmFtZSkKICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIGJ1aWxkZXIuY2hhck9mZnNldCwgbmFtZS5sZW5ndGgpCiAgICAgICAgICAgIF0pOwogICAgICAgIERlY2xhcmF0aW9uIGNvbnN0cnVjdG9yID0KICAgICAgICAgICAgbGlicmFyeS5sb2FkZXIuZ2V0RHVwbGljYXRlZEZpZWxkSW5pdGlhbGl6ZXJFcnJvcigpOwogICAgICAgIEV4cHJlc3Npb24gaW52b2NhdGlvbiA9IGJ1aWxkU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgICAgY29uc3RydWN0b3IudGFyZ2V0LAogICAgICAgICAgICBmb3Jlc3QuYXJndW1lbnRzKDxFeHByZXNzaW9uPlsKICAgICAgICAgICAgICBmb3Jlc3QubGl0ZXJhbFN0cmluZyhuYW1lLCBudWxsKS4uZmlsZU9mZnNldCA9IGFzc2lnbm1lbnRPZmZzZXQKICAgICAgICAgICAgXSwgbm9Mb2NhdGlvbikKICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBhc3NpZ25tZW50T2Zmc2V0LAogICAgICAgICAgICBjaGFyT2Zmc2V0OiBhc3NpZ25tZW50T2Zmc2V0KTsKICAgICAgICBpZiAoaW52b2NhdGlvbiBpcyBzaGFkb3cuU3ludGhldGljRXhwcmVzc2lvbkp1ZGdtZW50KSB7CiAgICAgICAgICBpbnZvY2F0aW9uID0gZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oaW52b2NhdGlvbik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgU2hhZG93SW52YWxpZEZpZWxkSW5pdGlhbGl6ZXIoCiAgICAgICAgICAgIGJ1aWxkZXIuZmllbGQsCiAgICAgICAgICAgIGV4cHJlc3Npb24sCiAgICAgICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKAogICAgICAgICAgICAgICAgZm9yZXN0LnRocm93RXhwcmVzc2lvbihudWxsLCBpbnZvY2F0aW9uKQogICAgICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBhc3NpZ25tZW50T2Zmc2V0KSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGFzc2lnbm1lbnRPZmZzZXQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCFsZWdhY3lNb2RlICYmCiAgICAgICAgICAgIGZvcm1hbFR5cGUgIT0gbnVsbCAmJgogICAgICAgICAgICAhdHlwZUVudmlyb25tZW50LmlzU3VidHlwZU9mKGZvcm1hbFR5cGUsIGJ1aWxkZXIuZmllbGQudHlwZSkpIHsKICAgICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUluaXRpYWxpemluZ0Zvcm1hbFR5cGVNaXNtYXRjaAogICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhuYW1lLCBmb3JtYWxUeXBlLCBidWlsZGVyLmZpZWxkLnR5cGUpLAogICAgICAgICAgICAgIGFzc2lnbm1lbnRPZmZzZXQsCiAgICAgICAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgICAgICAgdXJpLAogICAgICAgICAgICAgIGNvbnRleHQ6IFsKICAgICAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VJbml0aWFsaXppbmdGb3JtYWxUeXBlTWlzbWF0Y2hGaWVsZAogICAgICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oYnVpbGRlci5maWxlVXJpLCBidWlsZGVyLmNoYXJPZmZzZXQsIG5vTGVuZ3RoKQogICAgICAgICAgICAgIF0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IFNoYWRvd0ZpZWxkSW5pdGlhbGl6ZXIoYnVpbGRlci5maWVsZCwgZXhwcmVzc2lvbikKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGFzc2lnbm1lbnRPZmZzZXQKICAgICAgICAgIC4uaXNTeW50aGV0aWMgPSBpc1N5bnRoZXRpYzsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGJ1aWxkSW52YWxpZEluaXRpYWxpemVyKAogICAgICAgICAgZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgIGZhc3RhLnRlbXBsYXRlSW5pdGlhbGl6ZXJGb3JTdGF0aWNGaWVsZC53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICAgIGZpZWxkTmFtZU9mZnNldCwKICAgICAgICAgICAgICBuYW1lLmxlbmd0aCkpLAogICAgICAgICAgZmllbGROYW1lT2Zmc2V0KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyIGJ1aWxkU3VwZXJJbml0aWFsaXplcigKICAgICAgYm9vbCBpc1N5bnRoZXRpYywgQ29uc3RydWN0b3IgY29uc3RydWN0b3IsIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIFtpbnQgY2hhck9mZnNldCA9IC0xXSkgewogICAgaWYgKG1lbWJlci5pc0NvbnN0ICYmICFjb25zdHJ1Y3Rvci5pc0NvbnN0KSB7CiAgICAgIHJldHVybiBidWlsZEludmFsaWRTdXBlckluaXRpYWxpemVyKAogICAgICAgICAgY29uc3RydWN0b3IsCiAgICAgICAgICBmb3Jlc3QuY2FzdEFyZ3VtZW50cyhhcmd1bWVudHMpLAogICAgICAgICAgZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VDb25zdENvbnN0cnVjdG9yV2l0aE5vbkNvbnN0U3VwZXIsCiAgICAgICAgICAgICAgY2hhck9mZnNldCwKICAgICAgICAgICAgICBjb25zdHJ1Y3Rvci5uYW1lLm5hbWUubGVuZ3RoKSksCiAgICAgICAgICBjaGFyT2Zmc2V0KTsKICAgIH0KICAgIG5lZWRzSW1wbGljaXRTdXBlckluaXRpYWxpemVyID0gZmFsc2U7CiAgICByZXR1cm4gbmV3IFN1cGVySW5pdGlhbGl6ZXJKdWRnbWVudCgKICAgICAgICBjb25zdHJ1Y3RvciwgZm9yZXN0LmNhc3RBcmd1bWVudHMoYXJndW1lbnRzKSkKICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldAogICAgICAuLmlzU3ludGhldGljID0gaXNTeW50aGV0aWM7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplciBidWlsZFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIoCiAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yLCBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICBbaW50IGNoYXJPZmZzZXQgPSAtMV0pIHsKICAgIGlmIChjbGFzc0J1aWxkZXIuY2hlY2tDb25zdHJ1Y3RvckN5Y2xpYygKICAgICAgICBtZW1iZXIubmFtZSwgY29uc3RydWN0b3IubmFtZS5uYW1lKSkgewogICAgICBpbnQgbGVuZ3RoID0gY29uc3RydWN0b3IubmFtZS5uYW1lLmxlbmd0aDsKICAgICAgaWYgKGxlbmd0aCA9PSAwKSBsZW5ndGggPSAidGhpcyIubGVuZ3RoOwogICAgICBhZGRQcm9ibGVtKGZhc3RhLm1lc3NhZ2VDb25zdHJ1Y3RvckN5Y2xpYywgY2hhck9mZnNldCwgbGVuZ3RoKTsKICAgICAgLy8gVE9ETyhhc2tlc2MpOiBQcm9kdWNlIGludmFsaWQgaW5pdGlhbGl6ZXIuCiAgICB9CiAgICBuZWVkc0ltcGxpY2l0U3VwZXJJbml0aWFsaXplciA9IGZhbHNlOwogICAgcmV0dXJuIG5ldyBSZWRpcmVjdGluZ0luaXRpYWxpemVySnVkZ21lbnQoCiAgICAgICAgY29uc3RydWN0b3IsIGZvcmVzdC5jYXN0QXJndW1lbnRzKGFyZ3VtZW50cykpCiAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU9wZXJhdG9yKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJPcGVyYXRvciIpOwogICAgcHVzaChuZXcgT3BlcmF0b3IodG9rZW4sIHRva2VuLmNoYXJPZmZzZXQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU3ltYm9sVm9pZChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiU3ltYm9sVm9pZCIpOwogICAgcHVzaChuZXcgSWRlbnRpZmllci5wcmVzZXJ2ZVRva2VuKHRva2VuKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRGdW5jdGlvbkJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGlmIChtZW1iZXIuaXNOYXRpdmUpIHsKICAgICAgcHVzaChOdWxsVmFsdWUuRnVuY3Rpb25Cb2R5KTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2goZm9yZXN0LmJsb2NrKAogICAgICAgICAgdG9rZW4sCiAgICAgICAgICA8U3RhdGVtZW50PlsKICAgICAgICAgICAgYnVpbGRQcm9ibGVtU3RhdGVtZW50KAogICAgICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEZ1bmN0aW9uQm9keS53aXRoQXJndW1lbnRzKHRva2VuKSwKICAgICAgICAgICAgICAgIHRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICBsZW5ndGg6IHRva2VuLmxlbmd0aCkKICAgICAgICAgIF0sCiAgICAgICAgICBudWxsKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBVbnJlc29sdmVkVHlwZTxLZXJuZWxUeXBlQnVpbGRlcj4gdmFsaWRhdGVUeXBlVXNlKAogICAgICBVbnJlc29sdmVkVHlwZTxLZXJuZWxUeXBlQnVpbGRlcj4gdW5yZXNvbHZlZCwKICAgICAgYm9vbCBub25JbnN0YW5jZUFjY2Vzc0lzRXJyb3IpIHsKICAgIEtlcm5lbFR5cGVCdWlsZGVyIGJ1aWxkZXIgPSB1bnJlc29sdmVkLmJ1aWxkZXI7CiAgICBpZiAoYnVpbGRlciBpcyBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyICYmCiAgICAgICAgYnVpbGRlci5kZWNsYXJhdGlvbi5pc1R5cGVWYXJpYWJsZSkgewogICAgICBUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSBidWlsZGVyLmRlY2xhcmF0aW9uLnRhcmdldDsKICAgICAgYm9vbCBpc0NvbnN0YW50ID0gY29uc3RhbnRDb250ZXh0ICE9IENvbnN0YW50Q29udGV4dC5ub25lOwogICAgICBMb2NhdGVkTWVzc2FnZSBtZXNzYWdlOwogICAgICBib29sIHN1cHByZXNzTWVzc2FnZSA9IGZhbHNlOwogICAgICBpZiAoIWlzSW5zdGFuY2VDb250ZXh0ICYmIHR5cGVQYXJhbWV0ZXIucGFyZW50IGlzIENsYXNzKSB7CiAgICAgICAgbWVzc2FnZSA9IGZhc3RhLm1lc3NhZ2VUeXBlVmFyaWFibGVJblN0YXRpY0NvbnRleHQud2l0aExvY2F0aW9uKAogICAgICAgICAgICB1bnJlc29sdmVkLmZpbGVVcmksCiAgICAgICAgICAgIHVucmVzb2x2ZWQuY2hhck9mZnNldCwKICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5uYW1lLmxlbmd0aCk7CiAgICAgICAgaWYgKCFub25JbnN0YW5jZUFjY2Vzc0lzRXJyb3IgJiYgIWlzQ29uc3RhbnQgJiYgbGVnYWN5TW9kZSkgewogICAgICAgICAgLy8gVGhpcyBpcyBhIHdhcm5pbmcgaW4gbGVnYWN5IG1vZGUuCiAgICAgICAgICBhZGRQcm9ibGVtKG1lc3NhZ2UubWVzc2FnZU9iamVjdCwgbWVzc2FnZS5jaGFyT2Zmc2V0LCBtZXNzYWdlLmxlbmd0aCk7CiAgICAgICAgICBzdXBwcmVzc01lc3NhZ2UgPSB0cnVlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjb25zdGFudENvbnRleHQgPT0gQ29uc3RhbnRDb250ZXh0LmluZmVycmVkKSB7CiAgICAgICAgbWVzc2FnZSA9IGZhc3RhLm1lc3NhZ2VUeXBlVmFyaWFibGVJbkNvbnN0YW50Q29udGV4dC53aXRoTG9jYXRpb24oCiAgICAgICAgICAgIHVucmVzb2x2ZWQuZmlsZVVyaSwKICAgICAgICAgICAgdW5yZXNvbHZlZC5jaGFyT2Zmc2V0LAogICAgICAgICAgICB0eXBlUGFyYW1ldGVyLm5hbWUubGVuZ3RoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdW5yZXNvbHZlZDsKICAgICAgfQogICAgICByZXR1cm4gbmV3IFVucmVzb2x2ZWRUeXBlPEtlcm5lbFR5cGVCdWlsZGVyPigKICAgICAgICAgIG5ldyBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyKHR5cGVQYXJhbWV0ZXIubmFtZSwgbnVsbCkKICAgICAgICAgICAgLi5iaW5kKG5ldyBLZXJuZWxJbnZhbGlkVHlwZUJ1aWxkZXIodHlwZVBhcmFtZXRlci5uYW1lLCBtZXNzYWdlLAogICAgICAgICAgICAgICAgc3VwcHJlc3NNZXNzYWdlOiBzdXBwcmVzc01lc3NhZ2UpKSwKICAgICAgICAgIHVucmVzb2x2ZWQuY2hhck9mZnNldCwKICAgICAgICAgIHVucmVzb2x2ZWQuZmlsZVVyaSk7CiAgICB9CiAgICByZXR1cm4gdW5yZXNvbHZlZDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZXZhbHVhdGVBcmd1bWVudHNCZWZvcmUoCiAgICAgIEFyZ3VtZW50cyBhcmd1bWVudHMsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogICAgaWYgKGFyZ3VtZW50cyA9PSBudWxsKSByZXR1cm4gZXhwcmVzc2lvbjsKICAgIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMgPQogICAgICAgIG5ldyBMaXN0PEV4cHJlc3Npb24+LmZyb20oZm9yZXN0LmFyZ3VtZW50c1Bvc2l0aW9uYWwoYXJndW1lbnRzKSk7CiAgICBmb3IgKE5hbWVkRXhwcmVzc2lvbiBuYW1lZCBpbiBmb3Jlc3QuYXJndW1lbnRzTmFtZWQoYXJndW1lbnRzKSkgewogICAgICBleHByZXNzaW9ucy5hZGQobmFtZWQudmFsdWUpOwogICAgfQogICAgZm9yIChFeHByZXNzaW9uIGFyZ3VtZW50IGluIGV4cHJlc3Npb25zLnJldmVyc2VkKSB7CiAgICAgIGV4cHJlc3Npb24gPSBuZXcgTGV0KAogICAgICAgICAgbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoYXJndW1lbnQsCiAgICAgICAgICAgICAgaXNGaW5hbDogdHJ1ZSwgdHlwZTogY29yZVR5cGVzLm9iamVjdENsYXNzLnJhd1R5cGUpLAogICAgICAgICAgZXhwcmVzc2lvbik7CiAgICB9CiAgICByZXR1cm4gZXhwcmVzc2lvbjsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNJZGVudGljYWwoTWVtYmVyIG1lbWJlcikgPT4gbWVtYmVyID09IGNvcmVUeXBlcy5pZGVudGljYWxQcm9jZWR1cmU7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRNZXRob2RJbnZvY2F0aW9uKAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLCBOYW1lIG5hbWUsIEFyZ3VtZW50cyBhcmd1bWVudHMsIGludCBvZmZzZXQsCiAgICAgIHtib29sIGlzQ29uc3RhbnRFeHByZXNzaW9uOiBmYWxzZSwKICAgICAgYm9vbCBpc051bGxBd2FyZTogZmFsc2UsCiAgICAgIGJvb2wgaXNJbXBsaWNpdENhbGw6IGZhbHNlLAogICAgICBib29sIGlzU3VwZXI6IGZhbHNlLAogICAgICBNZW1iZXIgaW50ZXJmYWNlVGFyZ2V0fSkgewogICAgaWYgKGNvbnN0YW50Q29udGV4dCAhPSBDb25zdGFudENvbnRleHQubm9uZSAmJiAhaXNDb25zdGFudEV4cHJlc3Npb24pIHsKICAgICAgcmV0dXJuIGJ1aWxkUHJvYmxlbSgKICAgICAgICAgIGZhc3RhLnRlbXBsYXRlTm90Q29uc3RhbnRFeHByZXNzaW9uCiAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoJ01ldGhvZCBpbnZvY2F0aW9uJyksCiAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICBuYW1lLm5hbWUubGVuZ3RoKTsKICAgIH0KICAgIGlmIChpc1N1cGVyKSB7CiAgICAgIC8vIFdlIGNhbiBpZ25vcmUgW2lzTnVsbEF3YXJlXSBvbiBzdXBlciBzZW5kcy4KICAgICAgYXNzZXJ0KGZvcmVzdC5pc1RoaXNFeHByZXNzaW9uKHJlY2VpdmVyKSk7CiAgICAgIE1lbWJlciB0YXJnZXQgPSBsb29rdXBJbnN0YW5jZU1lbWJlcihuYW1lLCBpc1N1cGVyOiB0cnVlKTsKCiAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCAodGFyZ2V0IGlzIFByb2NlZHVyZSAmJiAhdGFyZ2V0LmlzQWNjZXNzb3IpKSB7CiAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7CiAgICAgICAgICB3YXJuVW5yZXNvbHZlZE1ldGhvZChuYW1lLCBvZmZzZXQsIGlzU3VwZXI6IHRydWUpOwogICAgICAgIH0gZWxzZSBpZiAoIWFyZUFyZ3VtZW50c0NvbXBhdGlibGUodGFyZ2V0LmZ1bmN0aW9uLCBhcmd1bWVudHMpKSB7CiAgICAgICAgICB0YXJnZXQgPSBudWxsOwogICAgICAgICAgYWRkUHJvYmxlbUVycm9ySWZDb25zdCgKICAgICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZVN1cGVyY2xhc3NNZXRob2RBcmd1bWVudE1pc21hdGNoCiAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUubmFtZSksCiAgICAgICAgICAgICAgb2Zmc2V0LAogICAgICAgICAgICAgIG5hbWUubmFtZS5sZW5ndGgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IFN1cGVyTWV0aG9kSW52b2NhdGlvbkp1ZGdtZW50KAogICAgICAgICAgICBuYW1lLCBmb3Jlc3QuY2FzdEFyZ3VtZW50cyhhcmd1bWVudHMpLAogICAgICAgICAgICBpbnRlcmZhY2VUYXJnZXQ6IHRhcmdldCkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgfQoKICAgICAgcmVjZWl2ZXIgPSBuZXcgU3VwZXJQcm9wZXJ0eUdldEp1ZGdtZW50KG5hbWUsIGludGVyZmFjZVRhcmdldDogdGFyZ2V0KQogICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgTWV0aG9kSW52b2NhdGlvbiBub2RlID0gbmV3IE1ldGhvZEludm9jYXRpb25KdWRnbWVudCgKICAgICAgICAgIHJlY2VpdmVyLCBjYWxsTmFtZSwgZm9yZXN0LmNhc3RBcmd1bWVudHMoYXJndW1lbnRzKSwKICAgICAgICAgIGlzSW1wbGljaXRDYWxsOiB0cnVlKQogICAgICAgIC4uZmlsZU9mZnNldCA9IGZvcmVzdC5yZWFkT2Zmc2V0KGFyZ3VtZW50cyk7CiAgICAgIHJldHVybiBub2RlOwogICAgfQoKICAgIGlmIChpc051bGxBd2FyZSkgewogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUocmVjZWl2ZXIpOwogICAgICByZXR1cm4gbmV3IE51bGxBd2FyZU1ldGhvZEludm9jYXRpb25KdWRnbWVudCgKICAgICAgICAgIHZhcmlhYmxlLAogICAgICAgICAgZm9yZXN0LmNvbmRpdGlvbmFsRXhwcmVzc2lvbigKICAgICAgICAgICAgICBidWlsZElzTnVsbChuZXcgVmFyaWFibGVHZXQodmFyaWFibGUpLCBvZmZzZXQsIHRoaXMpLAogICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgZm9yZXN0LmxpdGVyYWxOdWxsKG51bGwpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0LAogICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgbmV3IE1ldGhvZEludm9jYXRpb24obmV3IFZhcmlhYmxlR2V0KHZhcmlhYmxlKSwgbmFtZSwKICAgICAgICAgICAgICAgICAgZm9yZXN0LmNhc3RBcmd1bWVudHMoYXJndW1lbnRzKSwgaW50ZXJmYWNlVGFyZ2V0KQogICAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0KQogICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgfSBlbHNlIHsKICAgICAgTWV0aG9kSW52b2NhdGlvbiBub2RlID0gbmV3IE1ldGhvZEludm9jYXRpb25KdWRnbWVudCgKICAgICAgICAgIHJlY2VpdmVyLCBuYW1lLCBmb3Jlc3QuY2FzdEFyZ3VtZW50cyhhcmd1bWVudHMpLAogICAgICAgICAgaXNJbXBsaWNpdENhbGw6IGlzSW1wbGljaXRDYWxsLCBpbnRlcmZhY2VUYXJnZXQ6IGludGVyZmFjZVRhcmdldCkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIHJldHVybiBub2RlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRQcm9ibGVtKE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgsCiAgICAgIHtib29sIHdhc0hhbmRsZWQ6IGZhbHNlLAogICAgICBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0LAogICAgICBTZXZlcml0eSBzZXZlcml0eX0pIHsKICAgIGxpYnJhcnkuYWRkUHJvYmxlbShtZXNzYWdlLCBjaGFyT2Zmc2V0LCBsZW5ndGgsIHVyaSwKICAgICAgICB3YXNIYW5kbGVkOiB3YXNIYW5kbGVkLCBjb250ZXh0OiBjb250ZXh0LCBzZXZlcml0eTogc2V2ZXJpdHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRQcm9ibGVtRXJyb3JJZkNvbnN0KE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgsCiAgICAgIHtib29sIHdhc0hhbmRsZWQ6IGZhbHNlLCBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0fSkgewogICAgLy8gVE9ETyhhc2tlc2MpOiBJbnN0ZWFkIG9mIGRlY2lkaW5nIG9uIHRoZSBzZXZlcml0eSwgdGhpcyBtZXRob2Qgc2hvdWxkCiAgICAvLyB0YWtlIHR3byBtZXNzYWdlczogb25lIHRvIHVzZSB3aGVuIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBpcwogICAgLy8gcmVxdWlyZWQgYW5kIG9uZSB0byB1c2Ugb3RoZXJ3aXNlLgogICAgU2V2ZXJpdHkgc2V2ZXJpdHkgPSBtZXNzYWdlLmNvZGUuc2V2ZXJpdHk7CiAgICBpZiAoY29uc3RhbnRDb250ZXh0ICE9IENvbnN0YW50Q29udGV4dC5ub25lKSB7CiAgICAgIHNldmVyaXR5ID0gU2V2ZXJpdHkuZXJyb3I7CiAgICB9CiAgICBhZGRQcm9ibGVtKG1lc3NhZ2UsIGNoYXJPZmZzZXQsIGxlbmd0aCwKICAgICAgICB3YXNIYW5kbGVkOiB3YXNIYW5kbGVkLCBjb250ZXh0OiBjb250ZXh0LCBzZXZlcml0eTogc2V2ZXJpdHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZXBvcnREdXBsaWNhdGVkRGVjbGFyYXRpb24oCiAgICAgIERlY2xhcmF0aW9uIGV4aXN0aW5nLCBTdHJpbmcgbmFtZSwgaW50IGNoYXJPZmZzZXQpIHsKICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQgPSBleGlzdGluZy5pc1N5bnRoZXRpYwogICAgICAgID8gbnVsbAogICAgICAgIDogPExvY2F0ZWRNZXNzYWdlPlsKICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25DYXVzZQogICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobmFtZSkKICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuZmlsZVVyaSwgZXhpc3RpbmcuY2hhck9mZnNldCwgbmFtZS5sZW5ndGgpCiAgICAgICAgICBdOwogICAgYWRkUHJvYmxlbShmYXN0YS50ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbi53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgIGNoYXJPZmZzZXQsIG5hbWUubGVuZ3RoLAogICAgICAgIGNvbnRleHQ6IGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBkZWJ1Z0V2ZW50KFN0cmluZyBuYW1lKSB7CiAgICAvLyBwcmludEV2ZW50KCdCb2R5QnVpbGRlcjogJG5hbWUnKTsKICB9CgogIEBvdmVycmlkZQogIFN0YXRpY0dldCBtYWtlU3RhdGljR2V0KE1lbWJlciByZWFkVGFyZ2V0LCBUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIG5ldyBTdGF0aWNHZXQocmVhZFRhcmdldCkuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIHdyYXBJbkRlZmVycmVkQ2hlY2soCiAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgS2VybmVsUHJlZml4QnVpbGRlciBwcmVmaXgsIGludCBjaGFyT2Zmc2V0KSB7CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGNoZWNrID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoCiAgICAgICAgZm9yZXN0LmNoZWNrTGlicmFyeUlzTG9hZGVkKHByZWZpeC5kZXBlbmRlbmN5KSkKICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICAgIHJldHVybiBuZXcgRGVmZXJyZWRDaGVja0p1ZGdtZW50KGNoZWNrLCBleHByZXNzaW9uKTsKICB9CgogIC8vLyBUT0RPKGFoZSk6IFRoaXMgbWV0aG9kIGlzIHRlbXBvcmFyaWx5IGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMuIE9uY2UgdHlwZQogIC8vLyBwcm9tb3Rpb24gaXMgaW5kZXBlbmRlbnQgb2Ygc2hhZG93IG5vZGVzLCByZW1vdmUgdGhpcyBtZXRob2QuCiAgdm9pZCBlbnRlclRoZW5Gb3JUeXBlUHJvbW90aW9uKEV4cHJlc3Npb24gY29uZGl0aW9uKTsKCiAgYm9vbCBpc0Vycm9uZW91c05vZGUoVHJlZU5vZGUgbm9kZSkgewogICAgcmV0dXJuIGxpYnJhcnkubG9hZGVyLmhhbmRsZWRFcnJvcnMuaXNOb3RFbXB0eSAmJgogICAgICAgIGZvcmVzdC5pc0Vycm9uZW91c05vZGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBidWlsZERhcnRUeXBlKFVucmVzb2x2ZWRUeXBlPEtlcm5lbFR5cGVCdWlsZGVyPiB1bnJlc29sdmVkVHlwZSwKICAgICAge2Jvb2wgbm9uSW5zdGFuY2VBY2Nlc3NJc0Vycm9yOiBmYWxzZX0pIHsKICAgIGlmICh1bnJlc29sdmVkVHlwZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiB2YWxpZGF0ZVR5cGVVc2UodW5yZXNvbHZlZFR5cGUsIG5vbkluc3RhbmNlQWNjZXNzSXNFcnJvcikKICAgICAgICAuYnVpbGRlcgogICAgICAgID8uYnVpbGQobGlicmFyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PERhcnRUeXBlPiBidWlsZERhcnRUeXBlQXJndW1lbnRzKAogICAgICBMaXN0PFVucmVzb2x2ZWRUeXBlPEtlcm5lbFR5cGVCdWlsZGVyPj4gdW5yZXNvbHZlZFR5cGVzKSB7CiAgICBpZiAodW5yZXNvbHZlZFR5cGVzID09IG51bGwpIHJldHVybiA8RGFydFR5cGU+W107CiAgICBMaXN0PERhcnRUeXBlPiB0eXBlcyA9CiAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCh1bnJlc29sdmVkVHlwZXMubGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHR5cGVzW2ldID0gYnVpbGREYXJ0VHlwZSh1bnJlc29sdmVkVHlwZXNbaV0pOwogICAgfQogICAgcmV0dXJuIHR5cGVzOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGNvbnN0cnVjdG9yTmFtZUZvckRpYWdub3N0aWNzKFN0cmluZyBuYW1lLAogICAgICB7U3RyaW5nIGNsYXNzTmFtZSwgYm9vbCBpc1N1cGVyOiBmYWxzZX0pIHsKICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCkgewogICAgICBDbGFzcyBjbHMgPSBjbGFzc0J1aWxkZXIuY2xzOwogICAgICBpZiAoaXNTdXBlcikgewogICAgICAgIGNscyA9IGNscy5zdXBlcmNsYXNzOwogICAgICAgIHdoaWxlIChjbHMuaXNNaXhpbkFwcGxpY2F0aW9uKSB7CiAgICAgICAgICBjbHMgPSBjbHMuc3VwZXJjbGFzczsKICAgICAgICB9CiAgICAgIH0KICAgICAgY2xhc3NOYW1lID0gY2xzLm5hbWU7CiAgICB9CiAgICByZXR1cm4gbmFtZS5pc0VtcHR5ID8gY2xhc3NOYW1lIDogIiRjbGFzc05hbWUuJG5hbWUiOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiB3cmFwU3ludGhldGljRXhwcmVzc2lvbihFeHByZXNzaW9uIGRlc3VnYXJlZCwgaW50IGNoYXJPZmZzZXQpIHsKICAgIGlmIChsZWdhY3lNb2RlKSByZXR1cm4gZGVzdWdhcmVkOwogICAgcmV0dXJuIHNoYWRvdy5TeW50aGV0aWNXcmFwcGVyLndyYXBTeW50aGV0aWNFeHByZXNzaW9uKGRlc3VnYXJlZCkKICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oRXhwcmVzc2lvbiBub2RlKSB7CiAgICBpZiAobGVnYWN5TW9kZSkgcmV0dXJuIG5vZGU7CiAgICBzaGFkb3cuU3ludGhldGljRXhwcmVzc2lvbkp1ZGdtZW50IHNoYWRvd05vZGUgPSBub2RlOwogICAgcmV0dXJuIHNoYWRvd05vZGUuZGVzdWdhcmVkOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiB3cmFwSW52YWxpZENvbnN0cnVjdG9ySW52b2NhdGlvbihFeHByZXNzaW9uIGRlc3VnYXJlZCwKICAgICAgTWVtYmVyIGNvbnN0cnVjdG9yLCBBcmd1bWVudHMgYXJndW1lbnRzLCBpbnQgY2hhck9mZnNldCkgewogICAgaWYgKGxlZ2FjeU1vZGUpIHJldHVybiBkZXN1Z2FyZWQ7CiAgICByZXR1cm4gc2hhZG93LlN5bnRoZXRpY1dyYXBwZXIud3JhcEludmFsaWRDb25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICAgICAgZGVzdWdhcmVkLCBjb25zdHJ1Y3RvciwgYXJndW1lbnRzKQogICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiB3cmFwSW52YWxpZFdyaXRlKAogICAgICBFeHByZXNzaW9uIGRlc3VnYXJlZCwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBpbnQgY2hhck9mZnNldCkgewogICAgaWYgKGxlZ2FjeU1vZGUpIHJldHVybiBkZXN1Z2FyZWQ7CiAgICByZXR1cm4gc2hhZG93LlN5bnRoZXRpY1dyYXBwZXIud3JhcEludmFsaWRXcml0ZShkZXN1Z2FyZWQsIGV4cHJlc3Npb24pCiAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIHdyYXBVbnJlc29sdmVkVGFyZ2V0SW52b2NhdGlvbigKICAgICAgRXhwcmVzc2lvbiBkZXN1Z2FyZWQsIEFyZ3VtZW50cyBhcmd1bWVudHMsIGludCBjaGFyT2Zmc2V0KSB7CiAgICBpZiAobGVnYWN5TW9kZSkgcmV0dXJuIGRlc3VnYXJlZDsKICAgIHJldHVybiBzaGFkb3cuU3ludGhldGljV3JhcHBlci53cmFwVW5yZXNvbHZlZFRhcmdldEludm9jYXRpb24oCiAgICAgICAgZGVzdWdhcmVkLCBhcmd1bWVudHMpCiAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIHdyYXBVbnJlc29sdmVkVmFyaWFibGVBc3NpZ25tZW50KAogICAgICBFeHByZXNzaW9uIGRlc3VnYXJlZCwgYm9vbCBpc0NvbXBvdW5kLCBFeHByZXNzaW9uIHJocywgaW50IGNoYXJPZmZzZXQpIHsKICAgIGlmIChsZWdhY3lNb2RlKSByZXR1cm4gZGVzdWdhcmVkOwogICAgcmV0dXJuIHNoYWRvdy5TeW50aGV0aWNXcmFwcGVyLndyYXBVbnJlc29sdmVkVmFyaWFibGVBc3NpZ25tZW50KAogICAgICAgIGRlc3VnYXJlZCwgaXNDb21wb3VuZCwgcmhzKQogICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0OwogIH0KfQoKY2xhc3MgT3BlcmF0b3IgewogIGZpbmFsIFRva2VuIHRva2VuOwogIFN0cmluZyBnZXQgbmFtZSA9PiB0b2tlbi5zdHJpbmdWYWx1ZTsKCiAgZmluYWwgaW50IGNoYXJPZmZzZXQ7CgogIE9wZXJhdG9yKHRoaXMudG9rZW4sIHRoaXMuY2hhck9mZnNldCk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJvcGVyYXRvcigkbmFtZSkiOwp9CgpjbGFzcyBKdW1wVGFyZ2V0IGV4dGVuZHMgRGVjbGFyYXRpb24gewogIGZpbmFsIExpc3Q8U3RhdGVtZW50PiB1c2VycyA9IDxTdGF0ZW1lbnQ+W107CgogIGZpbmFsIEp1bXBUYXJnZXRLaW5kIGtpbmQ7CgogIGZpbmFsIGludCBmdW5jdGlvbk5lc3RpbmdMZXZlbDsKCiAgQG92ZXJyaWRlCiAgZmluYWwgTWVtYmVyQnVpbGRlciBwYXJlbnQ7CgogIEBvdmVycmlkZQogIGZpbmFsIGludCBjaGFyT2Zmc2V0OwoKICBKdW1wVGFyZ2V0KAogICAgICB0aGlzLmtpbmQsIHRoaXMuZnVuY3Rpb25OZXN0aW5nTGV2ZWwsIHRoaXMucGFyZW50LCB0aGlzLmNoYXJPZmZzZXQpOwoKICBAb3ZlcnJpZGUKICBVcmkgZ2V0IGZpbGVVcmkgPT4gcGFyZW50LmZpbGVVcmk7CgogIGJvb2wgZ2V0IGlzQnJlYWtUYXJnZXQgPT4ga2luZCA9PSBKdW1wVGFyZ2V0S2luZC5CcmVhazsKCiAgYm9vbCBnZXQgaXNDb250aW51ZVRhcmdldCA9PiBraW5kID09IEp1bXBUYXJnZXRLaW5kLkNvbnRpbnVlOwoKICBib29sIGdldCBpc0dvdG9UYXJnZXQgPT4ga2luZCA9PSBKdW1wVGFyZ2V0S2luZC5Hb3RvOwoKICBib29sIGdldCBoYXNVc2VycyA9PiB1c2Vycy5pc05vdEVtcHR5OwoKICB2b2lkIGFkZEJyZWFrKFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKICAgIGFzc2VydChpc0JyZWFrVGFyZ2V0KTsKICAgIHVzZXJzLmFkZChzdGF0ZW1lbnQpOwogIH0KCiAgdm9pZCBhZGRDb250aW51ZShTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CiAgICBhc3NlcnQoaXNDb250aW51ZVRhcmdldCk7CiAgICB1c2Vycy5hZGQoc3RhdGVtZW50KTsKICB9CgogIHZvaWQgYWRkR290byhTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CiAgICBhc3NlcnQoaXNHb3RvVGFyZ2V0KTsKICAgIHVzZXJzLmFkZChzdGF0ZW1lbnQpOwogIH0KCiAgdm9pZCByZXNvbHZlQnJlYWtzKEZvcmVzdCBmb3Jlc3QsIFN0YXRlbWVudCB0YXJnZXQpIHsKICAgIGFzc2VydChpc0JyZWFrVGFyZ2V0KTsKICAgIGZvciAoQnJlYWtTdGF0ZW1lbnQgdXNlciBpbiB1c2VycykgewogICAgICB1c2VyLnRhcmdldCA9IHRhcmdldDsKICAgIH0KICAgIHVzZXJzLmNsZWFyKCk7CiAgfQoKICB2b2lkIHJlc29sdmVDb250aW51ZXMoRm9yZXN0IGZvcmVzdCwgU3RhdGVtZW50IHRhcmdldCkgewogICAgYXNzZXJ0KGlzQ29udGludWVUYXJnZXQpOwogICAgZm9yIChCcmVha1N0YXRlbWVudCB1c2VyIGluIHVzZXJzKSB7CiAgICAgIHVzZXIudGFyZ2V0ID0gdGFyZ2V0OwogICAgfQogICAgdXNlcnMuY2xlYXIoKTsKICB9CgogIHZvaWQgcmVzb2x2ZUdvdG9zKEZvcmVzdCBmb3Jlc3QsIFN3aXRjaENhc2UgdGFyZ2V0KSB7CiAgICBhc3NlcnQoaXNHb3RvVGFyZ2V0KTsKICAgIGZvciAoQ29udGludWVTd2l0Y2hTdGF0ZW1lbnQgdXNlciBpbiB1c2VycykgewogICAgICB1c2VyLnRhcmdldCA9IHRhcmdldDsKICAgIH0KICAgIHVzZXJzLmNsZWFyKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGZ1bGxOYW1lRm9yRXJyb3JzID0+ICI8anVtcC10YXJnZXQ+IjsKfQoKY2xhc3MgTGFiZWxUYXJnZXQgZXh0ZW5kcyBEZWNsYXJhdGlvbiBpbXBsZW1lbnRzIEp1bXBUYXJnZXQgewogIEBvdmVycmlkZQogIGZpbmFsIE1lbWJlckJ1aWxkZXIgcGFyZW50OwoKICBmaW5hbCBKdW1wVGFyZ2V0IGJyZWFrVGFyZ2V0OwoKICBmaW5hbCBKdW1wVGFyZ2V0IGNvbnRpbnVlVGFyZ2V0OwoKICBmaW5hbCBpbnQgZnVuY3Rpb25OZXN0aW5nTGV2ZWw7CgogIEBvdmVycmlkZQogIGZpbmFsIGludCBjaGFyT2Zmc2V0OwoKICBMYWJlbFRhcmdldCh0aGlzLnBhcmVudCwgdGhpcy5mdW5jdGlvbk5lc3RpbmdMZXZlbCwgdGhpcy5jaGFyT2Zmc2V0KQogICAgICA6IGJyZWFrVGFyZ2V0ID0gbmV3IEp1bXBUYXJnZXQoCiAgICAgICAgICAgIEp1bXBUYXJnZXRLaW5kLkJyZWFrLCBmdW5jdGlvbk5lc3RpbmdMZXZlbCwgcGFyZW50LCBjaGFyT2Zmc2V0KSwKICAgICAgICBjb250aW51ZVRhcmdldCA9IG5ldyBKdW1wVGFyZ2V0KAogICAgICAgICAgICBKdW1wVGFyZ2V0S2luZC5Db250aW51ZSwgZnVuY3Rpb25OZXN0aW5nTGV2ZWwsIHBhcmVudCwgY2hhck9mZnNldCk7CgogIEBvdmVycmlkZQogIFVyaSBnZXQgZmlsZVVyaSA9PiBwYXJlbnQuZmlsZVVyaTsKCiAgYm9vbCBnZXQgaGFzVXNlcnMgPT4gYnJlYWtUYXJnZXQuaGFzVXNlcnMgfHwgY29udGludWVUYXJnZXQuaGFzVXNlcnM7CgogIExpc3Q8U3RhdGVtZW50PiBnZXQgdXNlcnMgPT4gdW5zdXBwb3J0ZWQoInVzZXJzIiwgY2hhck9mZnNldCwgZmlsZVVyaSk7CgogIEp1bXBUYXJnZXRLaW5kIGdldCBraW5kID0+IHVuc3VwcG9ydGVkKCJraW5kIiwgY2hhck9mZnNldCwgZmlsZVVyaSk7CgogIGJvb2wgZ2V0IGlzQnJlYWtUYXJnZXQgPT4gdHJ1ZTsKCiAgYm9vbCBnZXQgaXNDb250aW51ZVRhcmdldCA9PiB0cnVlOwoKICBib29sIGdldCBpc0dvdG9UYXJnZXQgPT4gZmFsc2U7CgogIHZvaWQgYWRkQnJlYWsoU3RhdGVtZW50IHN0YXRlbWVudCkgewogICAgYnJlYWtUYXJnZXQuYWRkQnJlYWsoc3RhdGVtZW50KTsKICB9CgogIHZvaWQgYWRkQ29udGludWUoU3RhdGVtZW50IHN0YXRlbWVudCkgewogICAgY29udGludWVUYXJnZXQuYWRkQ29udGludWUoc3RhdGVtZW50KTsKICB9CgogIHZvaWQgYWRkR290byhTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CiAgICB1bnN1cHBvcnRlZCgiYWRkR290byIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogIH0KCiAgdm9pZCByZXNvbHZlQnJlYWtzKEZvcmVzdCBmb3Jlc3QsIFN0YXRlbWVudCB0YXJnZXQpIHsKICAgIGJyZWFrVGFyZ2V0LnJlc29sdmVCcmVha3MoZm9yZXN0LCB0YXJnZXQpOwogIH0KCiAgdm9pZCByZXNvbHZlQ29udGludWVzKEZvcmVzdCBmb3Jlc3QsIFN0YXRlbWVudCB0YXJnZXQpIHsKICAgIGNvbnRpbnVlVGFyZ2V0LnJlc29sdmVDb250aW51ZXMoZm9yZXN0LCB0YXJnZXQpOwogIH0KCiAgdm9pZCByZXNvbHZlR290b3MoRm9yZXN0IGZvcmVzdCwgU3dpdGNoQ2FzZSB0YXJnZXQpIHsKICAgIHVuc3VwcG9ydGVkKCJyZXNvbHZlR290b3MiLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZnVsbE5hbWVGb3JFcnJvcnMgPT4gIjxsYWJlbC10YXJnZXQ+IjsKfQoKY2xhc3MgRm9ybWFsUGFyYW1ldGVycyB7CiAgZmluYWwgTGlzdDxLZXJuZWxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBwYXJhbWV0ZXJzOwogIGZpbmFsIGludCBjaGFyT2Zmc2V0OwogIGZpbmFsIGludCBsZW5ndGg7CiAgZmluYWwgVXJpIHVyaTsKCiAgRm9ybWFsUGFyYW1ldGVycyh0aGlzLnBhcmFtZXRlcnMsIHRoaXMuY2hhck9mZnNldCwgdGhpcy5sZW5ndGgsIHRoaXMudXJpKSB7CiAgICBpZiAocGFyYW1ldGVycz8uaXNFbXB0eSA/PyBmYWxzZSkgewogICAgICB0aHJvdyAiRW1wdHkgcGFyYW1ldGVycyBzaG91bGQgYmUgbnVsbCI7CiAgICB9CiAgfQoKICBGdW5jdGlvbk5vZGUgYnVpbGRGdW5jdGlvbk5vZGUoCiAgICAgIEtlcm5lbExpYnJhcnlCdWlsZGVyIGxpYnJhcnksCiAgICAgIFVucmVzb2x2ZWRUeXBlPEtlcm5lbFR5cGVCdWlsZGVyPiByZXR1cm5UeXBlLAogICAgICBMaXN0PEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVQYXJhbWV0ZXJzLAogICAgICBBc3luY01hcmtlciBhc3luY01vZGlmaWVyLAogICAgICBTdGF0ZW1lbnQgYm9keSwKICAgICAgaW50IGZpbGVFbmRPZmZzZXQpIHsKICAgIEZ1bmN0aW9uVHlwZSB0eXBlID0KICAgICAgICB0b0Z1bmN0aW9uVHlwZShyZXR1cm5UeXBlLCB0eXBlUGFyYW1ldGVycykuYnVpbGRlci5idWlsZChsaWJyYXJ5KTsKICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gcG9zaXRpb25hbFBhcmFtZXRlcnMgPSA8VmFyaWFibGVEZWNsYXJhdGlvbj5bXTsKICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gbmFtZWRQYXJhbWV0ZXJzID0gPFZhcmlhYmxlRGVjbGFyYXRpb24+W107CiAgICBpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIGZvciAoS2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBwYXJhbWV0ZXIgaW4gcGFyYW1ldGVycykgewogICAgICAgIGlmIChwYXJhbWV0ZXIuaXNOYW1lZCkgewogICAgICAgICAgbmFtZWRQYXJhbWV0ZXJzLmFkZChwYXJhbWV0ZXIudGFyZ2V0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnMuYWRkKHBhcmFtZXRlci50YXJnZXQpOwogICAgICAgIH0KICAgICAgfQogICAgICBuYW1lZFBhcmFtZXRlcnMuc29ydCgoVmFyaWFibGVEZWNsYXJhdGlvbiBhLCBWYXJpYWJsZURlY2xhcmF0aW9uIGIpIHsKICAgICAgICByZXR1cm4gYS5uYW1lLmNvbXBhcmVUbyhiLm5hbWUpOwogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBuZXcgRnVuY3Rpb25Ob2RlSnVkZ21lbnQoYm9keSwKICAgICAgICB0eXBlUGFyYW1ldGVyczogdHlwZS50eXBlUGFyYW1ldGVycywKICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyczogcG9zaXRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzOiBuYW1lZFBhcmFtZXRlcnMsCiAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogdHlwZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgIHJldHVyblR5cGU6IHR5cGUucmV0dXJuVHlwZSwKICAgICAgICBhc3luY01hcmtlcjogYXN5bmNNb2RpZmllcikKICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldAogICAgICAuLmZpbGVFbmRPZmZzZXQgPSBmaWxlRW5kT2Zmc2V0OwogIH0KCiAgVW5yZXNvbHZlZFR5cGU8S2VybmVsVHlwZUJ1aWxkZXI+IHRvRnVuY3Rpb25UeXBlKAogICAgICBVbnJlc29sdmVkVHlwZTxLZXJuZWxUeXBlQnVpbGRlcj4gcmV0dXJuVHlwZSwKICAgICAgW0xpc3Q8S2VybmVsVHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVBhcmFtZXRlcnNdKSB7CiAgICByZXR1cm4gbmV3IFVucmVzb2x2ZWRUeXBlKAogICAgICAgIG5ldyBLZXJuZWxGdW5jdGlvblR5cGVCdWlsZGVyKAogICAgICAgICAgICByZXR1cm5UeXBlPy5idWlsZGVyLCB0eXBlUGFyYW1ldGVycywgcGFyYW1ldGVycyksCiAgICAgICAgY2hhck9mZnNldCwKICAgICAgICB1cmkpOwogIH0KCiAgU2NvcGUgY29tcHV0ZUZvcm1hbFBhcmFtZXRlclNjb3BlKAogICAgICBTY29wZSBwYXJlbnQsIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlcikgewogICAgaWYgKHBhcmFtZXRlcnMgPT0gbnVsbCkgcmV0dXJuIHBhcmVudDsKICAgIGFzc2VydChwYXJhbWV0ZXJzLmlzTm90RW1wdHkpOwogICAgTWFwPFN0cmluZywgRGVjbGFyYXRpb24+IGxvY2FsID0gPFN0cmluZywgRGVjbGFyYXRpb24+e307CgogICAgZm9yIChLZXJuZWxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIHBhcmFtZXRlciBpbiBwYXJhbWV0ZXJzKSB7CiAgICAgIERlY2xhcmF0aW9uIGV4aXN0aW5nID0gbG9jYWxbcGFyYW1ldGVyLm5hbWVdOwogICAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkgewogICAgICAgIGhlbHBlci5yZXBvcnREdXBsaWNhdGVkRGVjbGFyYXRpb24oCiAgICAgICAgICAgIGV4aXN0aW5nLCBwYXJhbWV0ZXIubmFtZSwgcGFyYW1ldGVyLmNoYXJPZmZzZXQpOwogICAgICB9IGVsc2UgewogICAgICAgIGxvY2FsW3BhcmFtZXRlci5uYW1lXSA9IHBhcmFtZXRlcjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBTY29wZShsb2NhbCwgbnVsbCwgcGFyZW50LCAiZm9ybWFscyIsIGlzTW9kaWZpYWJsZTogZmFsc2UpOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICJGb3JtYWxQYXJhbWV0ZXJzKCRwYXJhbWV0ZXJzLCAkY2hhck9mZnNldCwgJHVyaSkiOwogIH0KfQoKLy8vIFJldHVybnMgYSBibG9jayBsaWtlIHRoaXM6Ci8vLwovLy8gICAgIHsKLy8vICAgICAgIHN0YXRlbWVudDsKLy8vICAgICAgIGJvZHk7Ci8vLyAgICAgfQovLy8KLy8vIElmIFtib2R5XSBpcyBhIFtCbG9ja10sIGl0J3MgcmV0dXJuZWQgd2l0aCBbc3RhdGVtZW50XSBwcmVwZW5kZWQgdG8gaXQuCkJsb2NrIGNvbWJpbmVTdGF0ZW1lbnRzKFN0YXRlbWVudCBzdGF0ZW1lbnQsIFN0YXRlbWVudCBib2R5KSB7CiAgaWYgKGJvZHkgaXMgQmxvY2spIHsKICAgIGJvZHkuc3RhdGVtZW50cy5pbnNlcnQoMCwgc3RhdGVtZW50KTsKICAgIHN0YXRlbWVudC5wYXJlbnQgPSBib2R5OwogICAgcmV0dXJuIGJvZHk7CiAgfSBlbHNlIHsKICAgIHJldHVybiBuZXcgQmxvY2tKdWRnbWVudCg8U3RhdGVtZW50PltzdGF0ZW1lbnQsIGJvZHldKQogICAgICAuLmZpbGVPZmZzZXQgPSBzdGF0ZW1lbnQuZmlsZU9mZnNldDsKICB9Cn0KClN0cmluZyBkZWJ1Z05hbWUoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG5hbWUsIFtTdHJpbmcgcHJlZml4XSkgewogIFN0cmluZyByZXN1bHQgPSBuYW1lLmlzRW1wdHkgPyBjbGFzc05hbWUgOiAiJGNsYXNzTmFtZS4kbmFtZSI7CiAgcmV0dXJuIHByZWZpeCA9PSBudWxsID8gcmVzdWx0IDogIiRwcmVmaXgucmVzdWx0IjsKfQoKU3RyaW5nIGdldE5vZGVOYW1lKE9iamVjdCBub2RlKSB7CiAgaWYgKG5vZGUgaXMgSWRlbnRpZmllcikgewogICAgcmV0dXJuIG5vZGUubmFtZTsKICB9IGVsc2UgaWYgKG5vZGUgaXMgRGVjbGFyYXRpb24pIHsKICAgIHJldHVybiBub2RlLmZ1bGxOYW1lRm9yRXJyb3JzOwogIH0gZWxzZSBpZiAobm9kZSBpcyBUaGlzQWNjZXNzR2VuZXJhdG9yKSB7CiAgICByZXR1cm4gbm9kZS5pc1N1cGVyID8gInN1cGVyIiA6ICJ0aGlzIjsKICB9IGVsc2UgaWYgKG5vZGUgaXMgR2VuZXJhdG9yKSB7CiAgICByZXR1cm4gbm9kZS5wbGFpbk5hbWVGb3JSZWFkOwogIH0gZWxzZSBpZiAobm9kZSBpcyBRdWFsaWZpZWROYW1lKSB7CiAgICByZXR1cm4gZmxhdHRlbk5hbWUobm9kZSwgbm9kZS5jaGFyT2Zmc2V0LCBudWxsKTsKICB9IGVsc2UgewogICAgcmV0dXJuIHVuaGFuZGxlZCgiJHtub2RlLnJ1bnRpbWVUeXBlfSIsICJnZXROb2RlTmFtZSIsIC0xLCBudWxsKTsKICB9Cn0KCkFzeW5jTWFya2VyIGFzeW5jTWFya2VyRnJvbVRva2VucyhUb2tlbiBhc3luY1Rva2VuLCBUb2tlbiBzdGFyVG9rZW4pIHsKICBpZiAoYXN5bmNUb2tlbiA9PSBudWxsIHx8IGlkZW50aWNhbChhc3luY1Rva2VuLnN0cmluZ1ZhbHVlLCAic3luYyIpKSB7CiAgICBpZiAoc3RhclRva2VuID09IG51bGwpIHsKICAgICAgcmV0dXJuIEFzeW5jTWFya2VyLlN5bmM7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoaWRlbnRpY2FsKHN0YXJUb2tlbi5zdHJpbmdWYWx1ZSwgIioiKSk7CiAgICAgIHJldHVybiBBc3luY01hcmtlci5TeW5jU3Rh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bnNmb3JtX2NvbGxlY3Rpb25zLmRhcnTAAEYxLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEudHJhbnNmb3JtX2NvbGxlY3Rpb25zOwoKaW1wb3J0ICdkYXJ0OmNvcmUnIGhpZGUgTWFwRW50cnk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIEFyZ3VtZW50cywKICAgICAgICBBc0V4cHJlc3Npb24sCiAgICAgICAgQmxvY2ssCiAgICAgICAgQmxvY2tFeHByZXNzaW9uLAogICAgICAgIENsYXNzLAogICAgICAgIERhcnRUeXBlLAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEV4cHJlc3Npb24sCiAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudCwKICAgICAgICBGaWVsZCwKICAgICAgICBGb3JJblN0YXRlbWVudCwKICAgICAgICBGb3JTdGF0ZW1lbnQsCiAgICAgICAgSWZTdGF0ZW1lbnQsCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBMaXN0TGl0ZXJhbCwKICAgICAgICBNYXBFbnRyeSwKICAgICAgICBNYXBMaXRlcmFsLAogICAgICAgIE1ldGhvZEludm9jYXRpb24sCiAgICAgICAgTmFtZSwKICAgICAgICBOb3QsCiAgICAgICAgTnVsbExpdGVyYWwsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFByb3BlcnR5R2V0LAogICAgICAgIFNldExpdGVyYWwsCiAgICAgICAgU3RhdGVtZW50LAogICAgICAgIFN0YXRpY0ludm9jYXRpb24sCiAgICAgICAgdHJhbnNmb3JtTGlzdCwKICAgICAgICBUcmVlTm9kZSwKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uLAogICAgICAgIFZhcmlhYmxlR2V0OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIHNob3cgQ29yZVR5cGVzOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQnIHNob3cgVHlwZUVudmlyb25tZW50OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC92aXNpdG9yLmRhcnQnIHNob3cgVHJhbnNmb3JtZXI7CgppbXBvcnQgJ2NvbGxlY3Rpb25zLmRhcnQnCiAgICBzaG93CiAgICAgICAgQ29udHJvbEZsb3dFbGVtZW50LAogICAgICAgIENvbnRyb2xGbG93TWFwRW50cnksCiAgICAgICAgRm9yRWxlbWVudCwKICAgICAgICBGb3JJbkVsZW1lbnQsCiAgICAgICAgRm9ySW5NYXBFbnRyeSwKICAgICAgICBGb3JNYXBFbnRyeSwKICAgICAgICBJZkVsZW1lbnQsCiAgICAgICAgSWZNYXBFbnRyeSwKICAgICAgICBTcHJlYWRFbGVtZW50LAogICAgICAgIFNwcmVhZE1hcEVudHJ5OwoKaW1wb3J0ICcuLi9zb3VyY2Uvc291cmNlX2xvYWRlci5kYXJ0JyBzaG93IFNvdXJjZUxvYWRlcjsKCmltcG9ydCAncmVkaXJlY3RpbmdfZmFjdG9yeV9ib2R5LmRhcnQnIHNob3cgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keTsKCmNsYXNzIENvbGxlY3Rpb25UcmFuc2Zvcm1lciBleHRlbmRzIFRyYW5zZm9ybWVyIHsKICBmaW5hbCBDb3JlVHlwZXMgY29yZVR5cGVzOwogIGZpbmFsIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQ7CiAgZmluYWwgUHJvY2VkdXJlIGxpc3RBZGQ7CiAgZmluYWwgUHJvY2VkdXJlIHNldEZhY3Rvcnk7CiAgZmluYWwgUHJvY2VkdXJlIHNldEFkZDsKICBmaW5hbCBQcm9jZWR1cmUgb2JqZWN0RXF1YWxzOwogIGZpbmFsIFByb2NlZHVyZSBtYXBFbnRyaWVzOwogIGZpbmFsIFByb2NlZHVyZSBtYXBQdXQ7CiAgZmluYWwgQ2xhc3MgbWFwRW50cnlDbGFzczsKICBmaW5hbCBGaWVsZCBtYXBFbnRyeUtleTsKICBmaW5hbCBGaWVsZCBtYXBFbnRyeVZhbHVlOwoKICBzdGF0aWMgUHJvY2VkdXJlIF9maW5kU2V0RmFjdG9yeShDb3JlVHlwZXMgY29yZVR5cGVzKSB7CiAgICBQcm9jZWR1cmUgZmFjdG9yeSA9IGNvcmVUeXBlcy5pbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdTZXQnLCAnJyk7CiAgICBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5IGJvZHkgPSBmYWN0b3J5Py5mdW5jdGlvbj8uYm9keTsKICAgIHJldHVybiBib2R5Py50YXJnZXQ7CiAgfQoKICBDb2xsZWN0aW9uVHJhbnNmb3JtZXIoU291cmNlTG9hZGVyIGxvYWRlcikKICAgICAgOiBjb3JlVHlwZXMgPSBsb2FkZXIuY29yZVR5cGVzLAogICAgICAgIHR5cGVFbnZpcm9ubWVudCA9IGxvYWRlci50eXBlSW5mZXJlbmNlRW5naW5lLnR5cGVTY2hlbWFFbnZpcm9ubWVudCwKICAgICAgICBsaXN0QWRkID0gbG9hZGVyLmNvcmVUeXBlcy5pbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdMaXN0JywgJ2FkZCcpLAogICAgICAgIHNldEZhY3RvcnkgPSBfZmluZFNldEZhY3RvcnkobG9hZGVyLmNvcmVUeXBlcyksCiAgICAgICAgc2V0QWRkID0gbG9hZGVyLmNvcmVUeXBlcy5pbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdTZXQnLCAnYWRkJyksCiAgICAgICAgb2JqZWN0RXF1YWxzID0KICAgICAgICAgICAgbG9hZGVyLmNvcmVUeXBlcy5pbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdPYmplY3QnLCAnPT0nKSwKICAgICAgICBtYXBFbnRyaWVzID0KICAgICAgICAgICAgbG9hZGVyLmNvcmVUeXBlcy5pbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdNYXAnLCAnZ2V0OmVudHJpZXMnKSwKICAgICAgICBtYXBQdXQgPSBsb2FkZXIuY29yZVR5cGVzLmluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ01hcCcsICdbXT0nKSwKICAgICAgICBtYXBFbnRyeUNsYXNzID0KICAgICAgICAgICAgbG9hZGVyLmNvcmVUeXBlcy5pbmRleC5nZXRDbGFzcygnZGFydDpjb3JlJywgJ01hcEVudHJ5JyksCiAgICAgICAgbWFwRW50cnlLZXkgPQogICAgICAgICAgICBsb2FkZXIuY29yZVR5cGVzLmluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ01hcEVudHJ5JywgJ2tleScpLAogICAgICAgIG1hcEVudHJ5VmFsdWUgPQogICAgICAgICAgICBsb2FkZXIuY29yZVR5cGVzLmluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ01hcEVudHJ5JywgJ3ZhbHVlJyk7CgogIFRyZWVOb2RlIF90cmFuc2xhdGVMaXN0T3JTZXQoCiAgICAgIEV4cHJlc3Npb24gbm9kZSwgRGFydFR5cGUgZWxlbWVudFR5cGUsIExpc3Q8RXhwcmVzc2lvbj4gZWxlbWVudHMsCiAgICAgIHtib29sIGlzU2V0OiBmYWxzZX0pIHsKICAgIC8vIFRyYW5zbGF0ZSBlbGVtZW50cyBpbiBwbGFjZSB1cCB0byB0aGUgZmlyc3Qgbm9uLWV4cHJlc3Npb24sIGlmIGFueS4KICAgIGludCBpID0gMDsKICAgIGZvciAoOyBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKGVsZW1lbnRzW2ldIGlzIENvbnRyb2xGbG93RWxlbWVudCkgYnJlYWs7CiAgICAgIGVsZW1lbnRzW2ldID0gZWxlbWVudHNbaV0uYWNjZXB0KHRoaXMpLi5wYXJlbnQgPSBub2RlOwogICAgfQoKICAgIC8vIElmIHRoZXJlIHdlcmUgb25seSBleHByZXNzaW9ucywgd2UgYXJlIGRvbmUuCiAgICBpZiAoaSA9PSBlbGVtZW50cy5sZW5ndGgpIHJldHVybiBub2RlOwoKICAgIC8vIEJ1aWxkIGEgYmxvY2sgZXhwcmVzc2lvbiBhbmQgY3JlYXRlIGFuIGVtcHR5IGxpc3Qgb3Igc2V0LgogICAgVmFyaWFibGVEZWNsYXJhdGlvbiByZXN1bHQ7CiAgICBpZiAoaXNTZXQpIHsKICAgICAgLy8gVE9ETyhrbWlsbGlraW4pOiBXaGVuIGFsbCB0aGUgYmFjayBlbmRzIGhhbmRsZSBzZXQgbGl0ZXJhbHMgd2UgY2FuIHVzZQogICAgICAvLyBvbmUgaGVyZS4KICAgICAgcmVzdWx0ID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoCiAgICAgICAgICBuZXcgU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgICAgICBzZXRGYWN0b3J5LCBuZXcgQXJndW1lbnRzKFtdLCB0eXBlczogW2VsZW1lbnRUeXBlXSkpLAogICAgICAgICAgdHlwZTogbmV3IEludGVyZmFjZVR5cGUoY29yZVR5cGVzLnNldENsYXNzLCBbZWxlbWVudFR5cGVdKSwKICAgICAgICAgIGlzRmluYWw6IHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0ID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoCiAgICAgICAgICBuZXcgTGlzdExpdGVyYWwoW10sIHR5cGVBcmd1bWVudDogZWxlbWVudFR5cGUpLAogICAgICAgICAgdHlwZTogbmV3IEludGVyZmFjZVR5cGUoY29yZVR5cGVzLmxpc3RDbGFzcywgW2VsZW1lbnRUeXBlXSksCiAgICAgICAgICBpc0ZpbmFsOiB0cnVlKTsKICAgIH0KICAgIExpc3Q8U3RhdGVtZW50PiBib2R5ID0gW3Jlc3VsdF07CiAgICAvLyBBZGQgdGhlIGVsZW1lbnRzIHVwIHRvIHRoZSBmaXJzdCBub24tZXhwcmVzc2lvbi4KICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgKytqKSB7CiAgICAgIF9hZGRFeHByZXNzaW9uRWxlbWVudChlbGVtZW50c1tqXSwgaXNTZXQsIHJlc3VsdCwgYm9keSk7CiAgICB9CiAgICAvLyBUcmFuc2xhdGUgdGhlIGVsZW1lbnRzIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0IG5vbi1leHByZXNzaW9uLgogICAgZm9yICg7IGkgPCBlbGVtZW50cy5sZW5ndGg7ICsraSkgewogICAgICBfdHJhbnNsYXRlRWxlbWVudChlbGVtZW50c1tpXSwgZWxlbWVudFR5cGUsIGlzU2V0LCByZXN1bHQsIGJvZHkpOwogICAgfQoKICAgIHJldHVybiBuZXcgQmxvY2tFeHByZXNzaW9uKG5ldyBCbG9jayhib2R5KSwgbmV3IFZhcmlhYmxlR2V0KHJlc3VsdCkpOwogIH0KCiAgdm9pZCBfdHJhbnNsYXRlRWxlbWVudChFeHByZXNzaW9uIGVsZW1lbnQsIERhcnRUeXBlIGVsZW1lbnRUeXBlLCBib29sIGlzU2V0LAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlc3VsdCwgTGlzdDxTdGF0ZW1lbnQ+IGJvZHkpIHsKICAgIGlmIChlbGVtZW50IGlzIFNwcmVhZEVsZW1lbnQpIHsKICAgICAgX3RyYW5zbGF0ZVNwcmVhZEVsZW1lbnQoZWxlbWVudCwgZWxlbWVudFR5cGUsIGlzU2V0LCByZXN1bHQsIGJvZHkpOwogICAgfSBlbHNlIGlmIChlbGVtZW50IGlzIElmRWxlbWVudCkgewogICAgICBfdHJhbnNsYXRlSWZFbGVtZW50KGVsZW1lbnQsIGVsZW1lbnRUeXBlLCBpc1NldCwgcmVzdWx0LCBib2R5KTsKICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpcyBGb3JFbGVtZW50KSB7CiAgICAgIF90cmFuc2xhdGVGb3JFbGVtZW50KGVsZW1lbnQsIGVsZW1lbnRUeXBlLCBpc1NldCwgcmVzdWx0LCBib2R5KTsKICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpcyBGb3JJbkVsZW1lbnQpIHsKICAgICAgX3RyYW5zbGF0ZUZvckluRWxlbWVudChlbGVtZW50LCBlbGVtZW50VHlwZSwgaXNTZXQsIHJlc3VsdCwgYm9keSk7CiAgICB9IGVsc2UgewogICAgICBfYWRkRXhwcmVzc2lvbkVsZW1lbnQoZWxlbWVudC5hY2NlcHQodGhpcyksIGlzU2V0LCByZXN1bHQsIGJvZHkpOwogICAgfQogIH0KCiAgdm9pZCBfYWRkRXhwcmVzc2lvbkVsZW1lbnQoRXhwcmVzc2lvbiBlbGVtZW50LCBib29sIGlzU2V0LAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlc3VsdCwgTGlzdDxTdGF0ZW1lbnQ+IGJvZHkpIHsKICAgIGJvZHkuYWRkKG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KG5ldyBNZXRob2RJbnZvY2F0aW9uKAogICAgICAgIG5ldyBWYXJpYWJsZUdldChyZXN1bHQpLAogICAgICAgIG5ldyBOYW1lKCdhZGQnKSwKICAgICAgICBuZXcgQXJndW1lbnRzKFtlbGVtZW50XSksCiAgICAgICAgaXNTZXQgPyBzZXRBZGQgOiBsaXN0QWRkKSkpOwogIH0KCiAgdm9pZCBfdHJhbnNsYXRlSWZFbGVtZW50KElmRWxlbWVudCBlbGVtZW50LCBEYXJ0VHlwZSBlbGVtZW50VHlwZSwgYm9vbCBpc1NldCwKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiByZXN1bHQsIExpc3Q8U3RhdGVtZW50PiBib2R5KSB7CiAgICBMaXN0PFN0YXRlbWVudD4gdGhlblN0YXRlbWVudHMgPSBbXTsKICAgIF90cmFuc2xhdGVFbGVtZW50KGVsZW1lbnQudGhlbiwgZWxlbWVudFR5cGUsIGlzU2V0LCByZXN1bHQsIHRoZW5TdGF0ZW1lbnRzKTsKICAgIExpc3Q8U3RhdGVtZW50PiBlbHNlU3RhdGVtZW50czsKICAgIGlmIChlbGVtZW50Lm90aGVyd2lzZSAhPSBudWxsKSB7CiAgICAgIF90cmFuc2xhdGVFbGVtZW50KGVsZW1lbnQub3RoZXJ3aXNlLCBlbGVtZW50VHlwZSwgaXNTZXQsIHJlc3VsdCwKICAgICAgICAgIGVsc2VTdGF0ZW1lbnRzID0gPFN0YXRlbWVudD5bXSk7CiAgICB9CiAgICBTdGF0ZW1lbnQgdGhlbkJvZHkgPSB0aGVuU3RhdGVtZW50cy5sZW5ndGggPT0gMQogICAgICAgID8gdGhlblN0YXRlbWVudHMuZmlyc3QKICAgICAgICA6IG5ldyBCbG9jayh0aGVuU3RhdGVtZW50cyk7CiAgICBTdGF0ZW1lbnQgZWxzZUJvZHk7CiAgICBpZiAoZWxzZVN0YXRlbWVudHMgIT0gbnVsbCAmJiBlbHNlU3RhdGVtZW50cy5pc05vdEVtcHR5KSB7CiAgICAgIGVsc2VCb2R5ID0gZWxzZVN0YXRlbWVudHMubGVuZ3RoID09IDEKICAgICAgICAgID8gZWxzZVN0YXRlbWVudHMuZmlyc3QKICAgICAgICAgIDogbmV3IEJsb2NrKGVsc2VTdGF0ZW1lbnRzKTsKICAgIH0KICAgIGJvZHkuYWRkKG5ldyBJZlN0YXRlbWVudChlbGVtZW50LmNvbmRpdGlvbi5hY2NlcHQodGhpcyksIHRoZW5Cb2R5LCBlbHNlQm9keSkKICAgICAgLi5maWxlT2Zmc2V0ID0gZWxlbWVudC5maWxlT2Zmc2V0KTsKICB9CgogIHZvaWQgX3RyYW5zbGF0ZUZvckVsZW1lbnQoRm9yRWxlbWVudCBlbGVtZW50LCBEYXJ0VHlwZSBlbGVtZW50VHlwZSwKICAgICAgYm9vbCBpc1NldCwgVmFyaWFibGVEZWNsYXJhdGlvbiByZXN1bHQsIExpc3Q8U3RhdGVtZW50PiBib2R5KSB7CiAgICBMaXN0PFN0YXRlbWVudD4gc3RhdGVtZW50cyA9IDxTdGF0ZW1lbnQ+W107CiAgICBfdHJhbnNsYXRlRWxlbWVudChlbGVtZW50LmJvZHksIGVsZW1lbnRUeXBlLCBpc1NldCwgcmVzdWx0LCBzdGF0ZW1lbnRzKTsKICAgIFN0YXRlbWVudCBsb29wQm9keSA9CiAgICAgICAgc3RhdGVtZW50cy5sZW5ndGggPT0gMSA/IHN0YXRlbWVudHMuZmlyc3QgOiBuZXcgQmxvY2soc3RhdGVtZW50cyk7CiAgICBGb3JTdGF0ZW1lbnQgbG9vcCA9IG5ldyBGb3JTdGF0ZW1lbnQoZWxlbWVudC52YXJpYWJsZXMsCiAgICAgICAgZWxlbWVudC5jb25kaXRpb24/LmFjY2VwdCh0aGlzKSwgZWxlbWVudC51cGRhdGVzLCBsb29wQm9keSkKICAgICAgLi5maWxlT2Zmc2V0ID0gZWxlbWVudC5maWxlT2Zmc2V0OwogICAgdHJhbnNmb3JtTGlzdChsb29wLnZhcmlhYmxlcywgdGhpcywgbG9vcCk7CiAgICB0cmFuc2Zvcm1MaXN0KGxvb3AudXBkYXRlcywgdGhpcywgbG9vcCk7CiAgICBib2R5LmFkZChsb29wKTsKICB9CgogIHZvaWQgX3RyYW5zbGF0ZUZvckluRWxlbWVudChGb3JJbkVsZW1lbnQgZWxlbWVudCwgRGFydFR5cGUgZWxlbWVudFR5cGUsCiAgICAgIGJvb2wgaXNTZXQsIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVzdWx0LCBMaXN0PFN0YXRlbWVudD4gYm9keSkgewogICAgTGlzdDxTdGF0ZW1lbnQ+IHN0YXRlbWVudHM7CiAgICBTdGF0ZW1lbnQgcHJvbG9ndWUgPSBlbGVtZW50LnByb2xvZ3VlOwogICAgaWYgKHByb2xvZ3VlID09IG51bGwpIHsKICAgICAgc3RhdGVtZW50cyA9IDxTdGF0ZW1lbnQ+W107CiAgICB9IGVsc2UgewogICAgICBwcm9sb2d1ZSA9IHByb2xvZ3VlLmFjY2VwdCh0aGlzKTsKICAgICAgc3RhdGVtZW50cyA9CiAgICAgICAgICBwcm9sb2d1ZSBpcyBCbG9jayA/IHByb2xvZ3VlLnN0YXRlbWVudHMgOiA8U3RhdGVtZW50Pltwcm9sb2d1ZV07CiAgICB9CiAgICBfdHJhbnNsYXRlRWxlbWVudChlbGVtZW50LmJvZHksIGVsZW1lbnRUeXBlLCBpc1NldCwgcmVzdWx0LCBzdGF0ZW1lbnRzKTsKICAgIFN0YXRlbWVudCBsb29wQm9keSA9CiAgICAgICAgc3RhdGVtZW50cy5sZW5ndGggPT0gMSA/IHN0YXRlbWVudHMuZmlyc3QgOiBuZXcgQmxvY2soc3RhdGVtZW50cyk7CiAgICBpZiAoZWxlbWVudC5wcm9ibGVtICE9IG51bGwpIHsKICAgICAgYm9keS5hZGQobmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoZWxlbWVudC5wcm9ibGVtLmFjY2VwdCh0aGlzKSkpOwogICAgfQogICAgYm9keS5hZGQobmV3IEZvckluU3RhdGVtZW50KAogICAgICAgIGVsZW1lbnQudmFyaWFibGUsIGVsZW1lbnQuaXRlcmFibGUuYWNjZXB0KHRoaXMpLCBsb29wQm9keSwKICAgICAgICBpc0FzeW5jOiBlbGVtZW50LmlzQXN5bmMpCiAgICAgIC4uZmlsZU9mZnNldCA9IGVsZW1lbnQuZmlsZU9mZnNldCk7CiAgfQoKICB2b2lkIF90cmFuc2xhdGVTcHJlYWRFbGVtZW50KFNwcmVhZEVsZW1lbnQgZWxlbWVudCwgRGFydFR5cGUgZWxlbWVudFR5cGUsCiAgICAgIGJvb2wgaXNTZXQsIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVzdWx0LCBMaXN0PFN0YXRlbWVudD4gYm9keSkgewogICAgRXhwcmVzc2lvbiB2YWx1ZSA9IGVsZW1lbnQuZXhwcmVzc2lvbi5hY2NlcHQodGhpcyk7CiAgICAvLyBOdWxsLWF3YXJlIHNwcmVhZHMgcmVxdWlyZSB0ZXN0aW5nIHRoZSBzdWJleHByZXNzaW9uJ3MgdmFsdWUuCiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHRlbXA7CiAgICBpZiAoZWxlbWVudC5pc051bGxBd2FyZSkgewogICAgICB0ZW1wID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUodmFsdWUsCiAgICAgICAgICB0eXBlOiBjb25zdCBEeW5hbWljVHlwZSgpLCBpc0ZpbmFsOiB0cnVlKTsKICAgICAgYm9keS5hZGQodGVtcCk7CiAgICAgIHZhbHVlID0gbmV3IFZhcmlhYmxlR2V0KHRlbXApOwogICAgfQoKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gZWx0OwogICAgU3RhdGVtZW50IGxvb3BCb2R5OwogICAgaWYgKGVsZW1lbnQuZWxlbWVudFR5cGUgPT0gbnVsbCB8fAogICAgICAgICF0eXBlRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoZWxlbWVudC5lbGVtZW50VHlwZSwgZWxlbWVudFR5cGUpKSB7CiAgICAgIGVsdCA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKG51bGwsCiAgICAgICAgICB0eXBlOiBjb25zdCBEeW5hbWljVHlwZSgpLCBpc0ZpbmFsOiB0cnVlKTsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBjYXN0ZWRWYXIgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZSgKICAgICAgICAgIG5ldyBBc0V4cHJlc3Npb24obmV3IFZhcmlhYmxlR2V0KGVsdCksIGVsZW1lbnRUeXBlKQogICAgICAgICAgICAuLmlzVHlwZUVycm9yID0gdHJ1ZQogICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBlbGVtZW50LmV4cHJlc3Npb24uZmlsZU9mZnNldCwKICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlKTsKICAgICAgbG9vcEJvZHkgPSBuZXcgQmxvY2soPFN0YXRlbWVudD5bCiAgICAgICAgY2FzdGVkVmFyLAogICAgICAgIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KG5ldyBNZXRob2RJbnZvY2F0aW9uKAogICAgICAgICAgICBuZXcgVmFyaWFibGVHZXQocmVzdWx0KSwKICAgICAgICAgICAgbmV3IE5hbWUoJ2FkZCcpLAogICAgICAgICAgICBuZXcgQXJndW1lbnRzKFtuZXcgVmFyaWFibGVHZXQoY2FzdGVkVmFyKV0pLAogICAgICAgICAgICBpc1NldCA/IHNldEFkZCA6IGxpc3RBZGQpKQogICAgICBdKTsKICAgIH0gZWxzZSB7CiAgICAgIGVsdCA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKG51bGwsIHR5cGU6IGVsZW1lbnRUeXBlLCBpc0ZpbmFsOiB0cnVlKTsKICAgICAgbG9vcEJvZHkgPSBuZXcgRXhwcmVzc2lvblN0YXRlbWVudChuZXcgTWV0aG9kSW52b2NhdGlvbigKICAgICAgICAgIG5ldyBWYXJpYWJsZUdldChyZXN1bHQpLAogICAgICAgICAgbmV3IE5hbWUoJ2FkZCcpLAogICAgICAgICAgbmV3IEFyZ3VtZW50cyhbbmV3IFZhcmlhYmxlR2V0KGVsdCldKSwKICAgICAgICAgIGlzU2V0ID8gc2V0QWRkIDogbGlzdEFkZCkpOwogICAgfQogICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG5ldyBGb3JJblN0YXRlbWVudChlbHQsIHZhbHVlLCBsb29wQm9keSk7CgogICAgaWYgKGVsZW1lbnQuaXNOdWxsQXdhcmUpIHsKICAgICAgc3RhdGVtZW50ID0gbmV3IElmU3RhdGVtZW50KAogICAgICAgICAgbmV3IE5vdChuZXcgTWV0aG9kSW52b2NhdGlvbihuZXcgVmFyaWFibGVHZXQodGVtcCksIG5ldyBOYW1lKCc9PScpLAogICAgICAgICAgICAgIG5ldyBBcmd1bWVudHMoW25ldyBOdWxsTGl0ZXJhbCgpXSksIG9iamVjdEVxdWFscykpLAogICAgICAgICAgc3RhdGVtZW50LAogICAgICAgICAgbnVsbCk7CiAgICB9CiAgICBib2R5LmFkZChzdGF0ZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHJlZU5vZGUgdmlzaXRMaXN0TGl0ZXJhbChMaXN0TGl0ZXJhbCBub2RlKSB7CiAgICAvLyBDb25zdCBjb2xsZWN0aW9ucyBhcmUgaGFuZGxlZCBieSB0aGUgY29uc3RhbnQgZXZhbHVhdG9yLgogICAgaWYgKG5vZGUuaXNDb25zdCkgcmV0dXJuIG5vZGU7CgogICAgcmV0dXJuIF90cmFuc2xhdGVMaXN0T3JTZXQobm9kZSwgbm9kZS50eXBlQXJndW1lbnQsIG5vZGUuZXhwcmVzc2lvbnMsCiAgICAgICAgaXNTZXQ6IGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIFRyZWVOb2RlIHZpc2l0U2V0TGl0ZXJhbChTZXRMaXRlcmFsIG5vZGUpIHsKICAgIC8vIENvbnN0IGNvbGxlY3Rpb25zIGFyZSBoYW5kbGVkIGJ5IHRoZSBjb25zdGFudCBldmFsdWF0b3IuCiAgICBpZiAobm9kZS5pc0NvbnN0KSByZXR1cm4gbm9kZTsKCiAgICByZXR1cm4gX3RyYW5zbGF0ZUxpc3RPclNldChub2RlLCBub2RlLnR5cGVBcmd1bWVudCwgbm9kZS5leHByZXNzaW9ucywKICAgICAgICBpc1NldDogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUcmVlTm9kZSB2aXNpdE1hcExpdGVyYWwoTWFwTGl0ZXJhbCBub2RlKSB7CiAgICAvLyBDb25zdCBjb2xsZWN0aW9ucyBhcmUgaGFuZGxlZCBieSB0aGUgY29uc3RhbnQgZXZhbHVhdG9yLgogICAgaWYgKG5vZGUuaXNDb25zdCkgcmV0dXJuIG5vZGU7CgogICAgLy8gVHJhbnNsYXRlIGVudHJpZXMgaW4gcGxhY2UgdXAgdG8gdGhlIGZpcnN0IGNvbnRyb2wtZmxvdyBlbnRyeSwgaWYgYW55LgogICAgaW50IGkgPSAwOwogICAgZm9yICg7IGkgPCBub2RlLmVudHJpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKG5vZGUuZW50cmllc1tpXSBpcyBDb250cm9sRmxvd01hcEVudHJ5KSBicmVhazsKICAgICAgbm9kZS5lbnRyaWVzW2ldID0gbm9kZS5lbnRyaWVzW2ldLmFjY2VwdCh0aGlzKS4ucGFyZW50ID0gbm9kZTsKICAgIH0KCiAgICAvLyBJZiB0aGVyZSB3ZXJlIG5vIGNvbnRyb2wtZmxvdyBlbnRyaWVzIHdlIGFyZSBkb25lLgogICAgaWYgKGkgPT0gbm9kZS5lbnRyaWVzLmxlbmd0aCkgcmV0dXJuIG5vZGU7CgogICAgLy8gQnVpbGQgYSBibG9jayBleHByZXNzaW9uIGFuZCBjcmVhdGUgYW4gZW1wdHkgbWFwLgogICAgVmFyaWFibGVEZWNsYXJhdGlvbiByZXN1bHQgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZSgKICAgICAgICBuZXcgTWFwTGl0ZXJhbChbXSwga2V5VHlwZTogbm9kZS5rZXlUeXBlLCB2YWx1ZVR5cGU6IG5vZGUudmFsdWVUeXBlKSwKICAgICAgICB0eXBlOiBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgY29yZVR5cGVzLm1hcENsYXNzLCBbbm9kZS5rZXlUeXBlLCBub2RlLnZhbHVlVHlwZV0pLAogICAgICAgIGlzRmluYWw6IHRydWUpOwogICAgTGlzdDxTdGF0ZW1lbnQ+IGJvZHkgPSBbcmVzdWx0XTsKICAgIC8vIEFkZCBhbGwgdGhlIGVudHJpZXMgdXAgdG8gdGhlIGZpcnN0IGNvbnRyb2wtZmxvdyBlbnRyeS4KICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgKytqKSB7CiAgICAgIF9hZGROb3JtYWxFbnRyeShub2RlLmVudHJpZXNbal0sIHJlc3VsdCwgYm9keSk7CiAgICB9CiAgICBmb3IgKDsgaSA8IG5vZGUuZW50cmllcy5sZW5ndGg7ICsraSkgewogICAgICBfdHJhbnNsYXRlRW50cnkoCiAgICAgICAgICBub2RlLmVudHJpZXNbaV0sIG5vZGUua2V5VHlwZSwgbm9kZS52YWx1ZVR5cGUsIHJlc3VsdCwgYm9keSk7CiAgICB9CgogICAgcmV0dXJuIG5ldyBCbG9ja0V4cHJlc3Npb24obmV3IEJsb2NrKGJvZHkpLCBuZXcgVmFyaWFibGVHZXQocmVzdWx0KSk7CiAgfQoKICB2b2lkIF90cmFuc2xhdGVFbnRyeShNYXBFbnRyeSBlbnRyeSwgRGFydFR5cGUga2V5VHlwZSwgRGFydFR5cGUgdmFsdWVUeXBlLAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlc3VsdCwgTGlzdDxTdGF0ZW1lbnQ+IGJvZHkpIHsKICAgIGlmIChlbnRyeSBpcyBTcHJlYWRNYXBFbnRyeSkgewogICAgICBfdHJhbnNsYXRlU3ByZWFkRW50cnkoZW50cnksIGtleVR5cGUsIHZhbHVlVHlwZSwgcmVzdWx0LCBib2R5KTsKICAgIH0gZWxzZSBpZiAoZW50cnkgaXMgSWZNYXBFbnRyeSkgewogICAgICBfdHJhbnNsYXRlSWZFbnRyeShlbnRyeSwga2V5VHlwZSwgdmFsdWVUeXBlLCByZXN1bHQsIGJvZHkpOwogICAgfSBlbHNlIGlmIChlbnRyeSBpcyBGb3JNYXBFbnRyeSkgewogICAgICBfdHJhbnNsYXRlRm9yRW50cnkoZW50cnksIGtleVR5cGUsIHZhbHVlVHlwZSwgcmVzdWx0LCBib2R5KTsKICAgIH0gZWxzZSBpZiAoZW50cnkgaXMgRm9ySW5NYXBFbnRyeSkgewogICAgICBfdHJhbnNsYXRlRm9ySW5FbnRyeShlbnRyeSwga2V5VHlwZSwgdmFsdWVUeXBlLCByZXN1bHQsIGJvZHkpOwogICAgfSBlbHNlIHsKICAgICAgX2FkZE5vcm1hbEVudHJ5KGVudHJ5LmFjY2VwdCh0aGlzKSwgcmVzdWx0LCBib2R5KTsKICAgIH0KICB9CgogIHZvaWQgX2FkZE5vcm1hbEVudHJ5KAogICAgICBNYXBFbnRyeSBlbnRyeSwgVmFyaWFibGVEZWNsYXJhdGlvbiByZXN1bHQsIExpc3Q8U3RhdGVtZW50PiBib2R5KSB7CiAgICBib2R5LmFkZChuZXcgRXhwcmVzc2lvblN0YXRlbWVudChuZXcgTWV0aG9kSW52b2NhdGlvbigKICAgICAgICBuZXcgVmFyaWFibGVHZXQocmVzdWx0KSwKICAgICAgICBuZXcgTmFtZSgnW109JyksCiAgICAgICAgbmV3IEFyZ3VtZW50cyhbZW50cnkua2V5LCBlbnRyeS52YWx1ZV0pLAogICAgICAgIG1hcFB1dCkpKTsKICB9CgogIHZvaWQgX3RyYW5zbGF0ZUlmRW50cnkoSWZNYXBFbnRyeSBlbnRyeSwgRGFydFR5cGUga2V5VHlwZSwgRGFydFR5cGUgdmFsdWVUeXBlLAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlc3VsdCwgTGlzdDxTdGF0ZW1lbnQ+IGJvZHkpIHsKICAgIExpc3Q8U3RhdGVtZW50PiB0aGVuQm9keSA9IFtdOwogICAgX3RyYW5zbGF0ZUVudHJ5KGVudHJ5LnRoZW4sIGtleVR5cGUsIHZhbHVlVHlwZSwgcmVzdWx0LCB0aGVuQm9keSk7CiAgICBMaXN0PFN0YXRlbWVudD4gZWxzZUJvZHk7CiAgICBpZiAoZW50cnkub3RoZXJ3aXNlICE9IG51bGwpIHsKICAgICAgX3RyYW5zbGF0ZUVudHJ5KGVudHJ5Lm90aGVyd2lzZSwga2V5VHlwZSwgdmFsdWVUeXBlLCByZXN1bHQsCiAgICAgICAgICBlbHNlQm9keSA9IDxTdGF0ZW1lbnQ+W10pOwogICAgfQogICAgU3RhdGVtZW50IHRoZW5TdGF0ZW1lbnQgPQogICAgICAgIHRoZW5Cb2R5Lmxlbmd0aCA9PSAxID8gdGhlbkJvZHkuZmlyc3QgOiBuZXcgQmxvY2sodGhlbkJvZHkpOwogICAgU3RhdGVtZW50IGVsc2VTdGF0ZW1lbnQ7CiAgICBpZiAoZWxzZUJvZHkgIT0gbnVsbCAmJiBlbHNlQm9keS5pc05vdEVtcHR5KSB7CiAgICAgIGVsc2VTdGF0ZW1lbnQgPQogICAgICAgICAgZWxzZUJvZHkubGVuZ3RoID09IDEgPyBlbHNlQm9keS5maXJzdCA6IG5ldyBCbG9jayhlbHNlQm9keSk7CiAgICB9CiAgICBib2R5LmFkZChuZXcgSWZTdGF0ZW1lbnQoCiAgICAgICAgZW50cnkuY29uZGl0aW9uLmFjY2VwdCh0aGlzKSwgdGhlblN0YXRlbWVudCwgZWxzZVN0YXRlbWVudCkpOwogIH0KCiAgdm9pZCBfdHJhbnNsYXRlRm9yRW50cnkoRm9yTWFwRW50cnkgZW50cnksIERhcnRUeXBlIGtleVR5cGUsCiAgICAgIERhcnRUeXBlIHZhbHVlVHlwZSwgVmFyaWFibGVEZWNsYXJhdGlvbiByZXN1bHQsIExpc3Q8U3RhdGVtZW50PiBib2R5KSB7CiAgICBMaXN0PFN0YXRlbWVudD4gc3RhdGVtZW50cyA9IDxTdGF0ZW1lbnQ+W107CiAgICBfdHJhbnNsYXRlRW50cnkoZW50cnkuYm9keSwga2V5VHlwZSwgdmFsdWVUeXBlLCByZXN1bHQsIHN0YXRlbWVudHMpOwogICAgU3RhdGVtZW50IGxvb3BCb2R5ID0KICAgICAgICBzdGF0ZW1lbnRzLmxlbmd0aCA9PSAxID8gc3RhdGVtZW50cy5maXJzdCA6IG5ldyBCbG9jayhzdGF0ZW1lbnRzKTsKICAgIEZvclN0YXRlbWVudCBsb29wID0gbmV3IEZvclN0YXRlbWVudCgKICAgICAgICBlbnRyeS52YXJpYWJsZXMsIGVudHJ5LmNvbmRpdGlvbj8uYWNjZXB0KHRoaXMpLCBlbnRyeS51cGRhdGVzLCBsb29wQm9keSkKICAgICAgLi5maWxlT2Zmc2V0ID0gZW50cnkuZmlsZU9mZnNldDsKICAgIHRyYW5zZm9ybUxpc3QobG9vcC52YXJpYWJsZXMsIHRoaXMsIGxvb3ApOwogICAgdHJhbnNmb3JtTGlzdChsb29wLnVwZGF0ZXMsIHRoaXMsIGxvb3ApOwogICAgYm9keS5hZGQobG9vcCk7CiAgfQoKICB2b2lkIF90cmFuc2xhdGVGb3JJbkVudHJ5KEZvckluTWFwRW50cnkgZW50cnksIERhcnRUeXBlIGtleVR5cGUsCiAgICAgIERhcnRUeXBlIHZhbHVlVHlwZSwgVmFyaWFibGVEZWNsYXJhdGlvbiByZXN1bHQsIExpc3Q8U3RhdGVtZW50PiBib2R5KSB7CiAgICBMaXN0PFN0YXRlbWVudD4gc3RhdGVtZW50czsKICAgIFN0YXRlbWVudCBwcm9sb2d1ZSA9IGVudHJ5LnByb2xvZ3VlOwogICAgaWYgKHByb2xvZ3VlID09IG51bGwpIHsKICAgICAgc3RhdGVtZW50cyA9IDxTdGF0ZW1lbnQ+W107CiAgICB9IGVsc2UgewogICAgICBwcm9sb2d1ZSA9IHByb2xvZ3VlLmFjY2VwdCh0aGlzKTsKICAgICAgc3RhdGVtZW50cyA9CiAgICAgICAgICBwcm9sb2d1ZSBpcyBCbG9jayA/IHByb2xvZ3VlLnN0YXRlbWVudHMgOiA8U3RhdGVtZW50Pltwcm9sb2d1ZV07CiAgICB9CiAgICBfdHJhbnNsYXRlRW50cnkoZW50cnkuYm9keSwga2V5VHlwZSwgdmFsdWVUeXBlLCByZXN1bHQsIHN0YXRlbWVudHMpOwogICAgU3RhdGVtZW50IGxvb3BCb2R5ID0KICAgICAgICBzdGF0ZW1lbnRzLmxlbmd0aCA9PSAxID8gc3RhdGVtZW50cy5maXJzdCA6IG5ldyBCbG9jayhzdGF0ZW1lbnRzKTsKICAgIGlmIChlbnRyeS5wcm9ibGVtICE9IG51bGwpIHsKICAgICAgYm9keS5hZGQobmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoZW50cnkucHJvYmxlbS5hY2NlcHQodGhpcykpKTsKICAgIH0KICAgIGJvZHkuYWRkKG5ldyBGb3JJblN0YXRlbWVudCgKICAgICAgICBlbnRyeS52YXJpYWJsZSwgZW50cnkuaXRlcmFibGUuYWNjZXB0KHRoaXMpLCBsb29wQm9keSwKICAgICAgICBpc0FzeW5jOiBlbnRyeS5pc0FzeW5jKQogICAgICAuLmZpbGVPZmZzZXQgPSBlbnRyeS5maWxlT2Zmc2V0KTsKICB9CgogIHZvaWQgX3RyYW5zbGF0ZVNwcmVhZEVudHJ5KFNwcmVhZE1hcEVudHJ5IGVudHJ5LCBEYXJ0VHlwZSBrZXlUeXBlLAogICAgICBEYXJ0VHlwZSB2YWx1ZVR5cGUsIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVzdWx0LCBMaXN0PFN0YXRlbWVudD4gYm9keSkgewogICAgRXhwcmVzc2lvbiB2YWx1ZSA9IGVudHJ5LmV4cHJlc3Npb24uYWNjZXB0KHRoaXMpOwogICAgLy8gTnVsbC1hd2FyZSBzcHJlYWRzIHJlcXVpcmUgdGVzdGluZyB0aGUgc3ViZXhwcmVzc2lvbidzIHZhbHVlLgogICAgVmFyaWFibGVEZWNsYXJhdGlvbiB0ZW1wOwogICAgaWYgKGVudHJ5LmlzTnVsbEF3YXJlKSB7CiAgICAgIHRlbXAgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZSh2YWx1ZSwKICAgICAgICAgIHR5cGU6IGNvcmVUeXBlcy5tYXBDbGFzcy5yYXdUeXBlKTsKICAgICAgYm9keS5hZGQodGVtcCk7CiAgICAgIHZhbHVlID0gbmV3IFZhcmlhYmxlR2V0KHRlbXApOwogICAgfQoKICAgIERhcnRUeXBlIGVudHJ5VHlwZSA9CiAgICAgICAgbmV3IEludGVyZmFjZVR5cGUobWFwRW50cnlDbGFzcywgPERhcnRUeXBlPltrZXlUeXBlLCB2YWx1ZVR5cGVdKTsKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gZWx0OwogICAgU3RhdGVtZW50IGxvb3BCb2R5OwogICAgaWYgKGVudHJ5LmVudHJ5VHlwZSA9PSBudWxsIHx8CiAgICAgICAgIXR5cGVFbnZpcm9ubWVudC5pc1N1YnR5cGVPZihlbnRyeS5lbnRyeVR5cGUsIGVudHJ5VHlwZSkpIHsKICAgICAgZWx0ID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24obnVsbCwKICAgICAgICAgIHR5cGU6IG5ldyBJbnRlcmZhY2VUeXBlKG1hcEVudHJ5Q2xhc3MsCiAgICAgICAgICAgICAgPERhcnRUeXBlPltjb25zdCBEeW5hbWljVHlwZSgpLCBjb25zdCBEeW5hbWljVHlwZSgpXSksCiAgICAgICAgICBpc0ZpbmFsOiB0cnVlKTsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBrZXlWYXIgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZSgKICAgICAgICAgIG5ldyBBc0V4cHJlc3Npb24oCiAgICAgICAgICAgICAgbmV3IFByb3BlcnR5R2V0KAogICAgICAgICAgICAgICAgICBuZXcgVmFyaWFibGVHZXQoZWx0KSwgbmV3IE5hbWUoJ2tleScpLCBtYXBFbnRyeUtleSksCiAgICAgICAgICAgICAga2V5VHlwZSkKICAgICAgICAgICAgLi5pc1R5cGVFcnJvciA9IHRydWUKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZW50cnkuZXhwcmVzc2lvbi5maWxlT2Zmc2V0LAogICAgICAgICAgdHlwZToga2V5VHlwZSk7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFsdWVWYXIgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZSgKICAgICAgICAgIG5ldyBBc0V4cHJlc3Npb24oCiAgICAgICAgICAgICAgbmV3IFByb3BlcnR5R2V0KAogICAgICAgICAgICAgICAgICBuZXcgVmFyaWFibGVHZXQoZWx0KSwgbmV3IE5hbWUoJ3ZhbHVlJyksIG1hcEVudHJ5VmFsdWUpLAogICAgICAgICAgICAgIHZhbHVlVHlwZSkKICAgICAgICAgICAgLi5pc1R5cGVFcnJvciA9IHRydWUKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZW50cnkuZXhwcmVzc2lvbi5maWxlT2Zmc2V0LAogICAgICAgICAgdHlwZTogdmFsdWVUeXBlKTsKICAgICAgbG9vcEJvZHkgPSBuZXcgQmxvY2soPFN0YXRlbWVudD5bCiAgICAgICAga2V5VmFyLAogICAgICAgIHZhbHVlVmFyLAogICAgICAgIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KG5ldyBNZXRob2RJbnZvY2F0aW9uKAogICAgICAgICAgICBuZXcgVmFyaWFibGVHZXQocmVzdWx0KSwKICAgICAgICAgICAgbmV3IE5hbWUoJ1tdPScpLAogICAgICAgICAgICBuZXcgQXJndW1lbnRzKFtuZXcgVmFyaWFibGVHZXQoa2V5VmFyKSwgbmV3IFZhcmlhYmxlR2V0KHZhbHVlVmFyKV0pLAogICAgICAgICAgICBtYXBQdXQpKQogICAgICBdKTsKICAgIH0gZWxzZSB7CiAgICAgIGVsdCA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKG51bGwsIHR5cGU6IGVudHJ5VHlwZSwgaXNGaW5hbDogdHJ1ZSk7CiAgICAgIGxvb3BCb2R5ID0gbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQobmV3IE1ldGhvZEludm9jYXRpb24oCiAgICAgICAgICBuZXcgVmFyaWFibGVHZXQocmVzdWx0KSwKICAgICAgICAgIG5ldyBOYW1lKCdbXT0nKSwKICAgICAgICAgIG5ldyBBcmd1bWVudHMoWwogICAgICAgICAgICBuZXcgUHJvcGVydHlHZXQobmV3IFZhcmlhYmxlR2V0KGVsdCksIG5ldyBOYW1lKCdrZXknKSwgbWFwRW50cnlLZXkpLAogICAgICAgICAgICBuZXcgUHJvcGVydHlHZXQoCiAgICAgICAgICAgICAgICBuZXcgVmFyaWFibGVHZXQoZWx0KSwgbmV3IE5hbWUoJ3ZhbHVlJyksIG1hcEVudHJ5VmFsdWUpCiAgICAgICAgICBdKSwKICAgICAgICAgIG1hcFB1dCkpOwogICAgfQogICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG5ldyBGb3JJblN0YXRlbWVudCgKICAgICAgICBlbHQsIG5ldyBQcm9wZXJ0eUdldCh2YWx1ZSwgbmV3IE5hbWUoJ2VudHJpZXMnKSwgbWFwRW50cmllcyksIGxvb3BCb2R5KTsKCiAgICBpZiAoZW50cnkuaXNOdWxsQXdhcmUpIHsKICAgICAgc3RhdGVtZW50ID0gbmV3IElmU3RhdGVtZW50KAogICAgICAgICAgbmV3IE5vdChuZXcgTWV0aG9kSW52b2NhdGlvbihuZXcgVmFyaWFibGVHZXQodGVtcCksIG5ldyBOYW1lKCc9PScpLAogICAgICAgICAgICAgIG5ldyBBcmd1bWVudHMoW25ldyBOdWxsTGl0ZXJhbCgpXSksIG9iamVjdEVxdWFscykpLAogICAgICAgICAgc3RhdGVtZW50LAogICAgICAgICAgbnVsbCk7CiAgICB9CiAgICBib2R5LmFkZChzdGF0ZW1lbnQpOwogIH0KfQqB5ABOTjwBJQEiASEJExYPGQ8SFRQdDxgWFRcVEhQaDg0VExUUExoXEh0VATgBRAE3ARoJHB0UFhcVExQXGAE5AUQBMh0pGx4aIB4aHRsdATpLOxkEAS0mTFA4ThdLFVFOGEYWThhQASBIHUsPJzQ9BgE0KwFBIBFQEzEgREYaDTE6RxoGJTgiPwZGJ0gGAUoEAU86JEonRihHKkkNSAYEAT06OyEZIiUEAVA6KVEkJUcrBjQfJRg/LCEnBlEqBAFGRjBNGUs8RCkvLRQEAUpGICscIg0oE0sGTRlLI0cGIUMiKgQBTEY4RR4fNTUWJQYBHRgnSio1SD4hOh4oEzYlHTknCg1NPyMbMSYGRAEfI05CFREGGQQBDDBAIwFKFwQBDC5AIwFKFgQBDC5AIwFODys5RQYBOi8BOUNOIUEYJT8iNgYrF0gGAUoEAU06I0YmQidDKUUNOQYEARhKOyEZMRMEAVE6I0ceI0MlBh5FHTMWRwYeRgQBP04wSRlLKlEnLy0UBAFDTiApHCINKBNLBkkZSyFFBiE/ICgEAUVONkUeHTUtFiUGARlKHRgjRCoxRRpFHB9HFyE4GkccH0sZITgcKBASNiUdURUKDUs/IxsaUR1IDhQGLlEBHSNOQhURBhkEAgE9cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC90cmFuc2Zvcm1fY29sbGVjdGlvbnMuZGFydEdzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL3RyYW5zZm9ybV9zZXRfbGl0ZXJhbHMuZGFydJGzLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEudHJhbnNmb3JtX3NldF9saXRlcmFsczsKCmltcG9ydCAnZGFydDpjb3JlJyBoaWRlIE1hcEVudHJ5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBBcmd1bWVudHMsCiAgICAgICAgQ2xhc3MsCiAgICAgICAgQ29uc3RydWN0b3IsCiAgICAgICAgQ29uc3RydWN0b3JJbnZvY2F0aW9uLAogICAgICAgIERhcnRUeXBlLAogICAgICAgIEV4cHJlc3Npb24sCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBMZXQsCiAgICAgICAgTGlicmFyeSwKICAgICAgICBNYXBFbnRyeSwKICAgICAgICBNYXBMaXRlcmFsLAogICAgICAgIE1ldGhvZEludm9jYXRpb24sCiAgICAgICAgTmFtZSwKICAgICAgICBOdWxsTGl0ZXJhbCwKICAgICAgICBQcm9jZWR1cmUsCiAgICAgICAgU2V0TGl0ZXJhbCwKICAgICAgICBTdGF0aWNJbnZvY2F0aW9uLAogICAgICAgIFRyZWVOb2RlLAogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24sCiAgICAgICAgVmFyaWFibGVHZXQ7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgc2hvdyBDb3JlVHlwZXM7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3Zpc2l0b3IuZGFydCcgc2hvdyBUcmFuc2Zvcm1lcjsKCmltcG9ydCAnLi4vc291cmNlL3NvdXJjZV9sb2FkZXIuZGFydCcgc2hvdyBTb3VyY2VMb2FkZXI7CgppbXBvcnQgJ3JlZGlyZWN0aW5nX2ZhY3RvcnlfYm9keS5kYXJ0JyBzaG93IFJlZGlyZWN0aW5nRmFjdG9yeUJvZHk7CgovLyBUT0RPKGFza2VzYyk6IERlbGV0ZSB0aGlzIGNsYXNzIHdoZW4gYWxsIGJhY2tlbmRzIHN1cHBvcnQgc2V0IGxpdGVyYWxzLgpjbGFzcyBTZXRMaXRlcmFsVHJhbnNmb3JtZXIgZXh0ZW5kcyBUcmFuc2Zvcm1lciB7CiAgZmluYWwgQ29yZVR5cGVzIGNvcmVUeXBlczsKICBmaW5hbCBEYXJ0VHlwZSBudWxsVHlwZTsKICBmaW5hbCBQcm9jZWR1cmUgc2V0RmFjdG9yeTsKICBmaW5hbCBQcm9jZWR1cmUgYWRkTWV0aG9kOwogIGZpbmFsIENvbnN0cnVjdG9yIHVubW9kaWZpYWJsZVNldENvbnN0cnVjdG9yOwogIGZpbmFsIGJvb2wgdHJhbnNmb3JtQ29uc3Q7CgogIHN0YXRpYyBQcm9jZWR1cmUgX2ZpbmRTZXRGYWN0b3J5KENvcmVUeXBlcyBjb3JlVHlwZXMpIHsKICAgIFByb2NlZHVyZSBmYWN0b3J5ID0gY29yZVR5cGVzLmluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ1NldCcsICcnKTsKICAgIFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkgYm9keSA9IGZhY3Rvcnk/LmZ1bmN0aW9uPy5ib2R5OwogICAgcmV0dXJuIGJvZHk/LnRhcmdldDsKICB9CgogIHN0YXRpYyBQcm9jZWR1cmUgX2ZpbmRBZGRNZXRob2QoQ29yZVR5cGVzIGNvcmVUeXBlcykgewogICAgcmV0dXJuIGNvcmVUeXBlcy5pbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdTZXQnLCAnYWRkJyk7CiAgfQoKICBzdGF0aWMgQ29uc3RydWN0b3IgX2ZpbmRVbm1vZGlmaWFibGVTZXRDb25zdHJ1Y3RvcihTb3VyY2VMb2FkZXIgbG9hZGVyKSB7CiAgICAvLyBXZSBzaG91bGQgbm90IGdlbmVyYWxseSBkaWcgaW50byBsaWJyYXJpZXMgbGlrZSB0aGlzLCBhbmQgd2Ugc2hvdWxkCiAgICAvLyBhdm9pZCBkZXBlbmRlbmNpZXMgb24gbGlicmFyaWVzIG90aGVyIHRoYW4gdGhlIG9uZXMgaW5kZXhlZCBieQogICAgLy8gQ29yZVR5cGVzLiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHNvbHV0aW9uIHVudGlsIGFsbCBiYWNrZW5kcyBoYXZlCiAgICAvLyBpbXBsZW1lbnRlZCBzdXBwb3J0IGZvciBzZXQgbGl0ZXJhbHMuCiAgICBVcmkgY29sbGVjdGlvblVyaSA9IFVyaS5wYXJzZSgiZGFydDpjb2xsZWN0aW9uIik7CiAgICBMaWJyYXJ5IGNvbGxlY3Rpb25MaWJyYXJ5ID0gbG9hZGVyLmJ1aWxkZXJzW2NvbGxlY3Rpb25VcmldLnRhcmdldDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sbGVjdGlvbkxpYnJhcnkuY2xhc3Nlcy5sZW5ndGg7IGkrKykgewogICAgICBDbGFzcyBjbGFzc05vZGUgPSBjb2xsZWN0aW9uTGlicmFyeS5jbGFzc2VzW2ldOwogICAgICBpZiAoY2xhc3NOb2RlLm5hbWUgPT0gIl9Vbm1vZGlmaWFibGVTZXQiKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xsZWN0aW9uTGlicmFyeS5jbGFzc2VzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IGNsYXNzTm9kZS5jb25zdHJ1Y3RvcnNbal07CiAgICAgICAgICBpZiAoY29uc3RydWN0b3IubmFtZS5uYW1lLmlzRW1wdHkpIHsKICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBTZXRMaXRlcmFsVHJhbnNmb3JtZXIoU291cmNlTG9hZGVyIGxvYWRlciwge3RoaXMudHJhbnNmb3JtQ29uc3Q6IHRydWV9KQogICAgICA6IGNvcmVUeXBlcyA9IGxvYWRlci5jb3JlVHlwZXMsCiAgICAgICAgbnVsbFR5cGUgPSBuZXcgSW50ZXJmYWNlVHlwZShsb2FkZXIuY29yZVR5cGVzLm51bGxDbGFzcywgW10pLAogICAgICAgIHNldEZhY3RvcnkgPSBfZmluZFNldEZhY3RvcnkobG9hZGVyLmNvcmVUeXBlcyksCiAgICAgICAgYWRkTWV0aG9kID0gX2ZpbmRBZGRNZXRob2QobG9hZGVyLmNvcmVUeXBlcyksCiAgICAgICAgdW5tb2RpZmlhYmxlU2V0Q29uc3RydWN0b3IgPSBfZmluZFVubW9kaWZpYWJsZVNldENvbnN0cnVjdG9yKGxvYWRlcik7CgogIFRyZWVOb2RlIHZpc2l0U2V0TGl0ZXJhbChTZXRMaXRlcmFsIG5vZGUpIHsKICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgaWYgKCF0cmFuc2Zvcm1Db25zdCkgcmV0dXJuIG5vZGU7CiAgICAgIExpc3Q8TWFwRW50cnk+IGVudHJpZXMgPSBuZXcgTGlzdDxNYXBFbnRyeT4obm9kZS5leHByZXNzaW9ucy5sZW5ndGgpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGUuZXhwcmVzc2lvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAvLyBleHByZXNzaW9uX2k6IG51bGwKICAgICAgICBFeHByZXNzaW9uIGVudHJ5ID0gbm9kZS5leHByZXNzaW9uc1tpXS5hY2NlcHQodGhpcyk7CiAgICAgICAgZW50cmllc1tpXSA9IG5ldyBNYXBFbnRyeShlbnRyeSwgbmV3IE51bGxMaXRlcmFsKCkpOwogICAgICB9CiAgICAgIEV4cHJlc3Npb24gbWFwRXhwID0gbmV3IE1hcExpdGVyYWwoZW50cmllcywKICAgICAgICAgIGtleVR5cGU6IG5vZGUudHlwZUFyZ3VtZW50LCB2YWx1ZVR5cGU6IG51bGxUeXBlLCBpc0NvbnN0OiB0cnVlKTsKICAgICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvckludm9jYXRpb24odW5tb2RpZmlhYmxlU2V0Q29uc3RydWN0b3IsCiAgICAgICAgICBuZXcgQXJndW1lbnRzKFttYXBFeHBdLCB0eXBlczogW25vZGUudHlwZUFyZ3VtZW50XSksCiAgICAgICAgICBpc0NvbnN0OiB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE91dGVybW9zdCBkZWNsYXJhdGlvbiBvZiBsZXQgY2hhaW46IFNldDxFPiBzZXRWYXIgPSBuZXcgU2V0PEU+KCk7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gc2V0VmFyID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoCiAgICAgICAgICBuZXcgU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgICAgICBzZXRGYWN0b3J5LCBuZXcgQXJndW1lbnRzKFtdLCB0eXBlczogW25vZGUudHlwZUFyZ3VtZW50XSkpLAogICAgICAgICAgdHlwZTogbmV3IEludGVyZmFjZVR5cGUoY29yZVR5cGVzLnNldENsYXNzLCBbbm9kZS50eXBlQXJndW1lbnRdKSk7CiAgICAgIC8vIElubmVybW9zdCBib2R5IG9mIGxldCBjaGFpbjogc2V0VmFyCiAgICAgIEV4cHJlc3Npb24gc2V0RXhwID0gbmV3IFZhcmlhYmxlR2V0KHNldFZhcik7CiAgICAgIGZvciAoaW50IGkgPSBub2RlLmV4cHJlc3Npb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgLy8gbGV0IF8gPSBzZXRWYXIuYWRkKGV4cHJlc3Npb24pIGluIHJlc3QKICAgICAgICBFeHByZXNzaW9uIGVudHJ5ID0gbm9kZS5leHByZXNzaW9uc1tpXS5hY2NlcHQodGhpcyk7CiAgICAgICAgc2V0RXhwID0gbmV3IExldCgKICAgICAgICAgICAgbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUobmV3IE1ldGhvZEludm9jYXRpb24oCiAgICAgICAgICAgICAgICBuZXcgVmFyaWFibGVHZXQoc2V0VmFyKSwKICAgICAgICAgICAgICAgIG5ldyBOYW1lKCJhZGQiKSwKICAgICAgICAgICAgICAgIG5ldyBBcmd1bWVudHMoW2VudHJ5XSksCiAgICAgICAgICAgICAgICBhZGRNZXRob2QpKSwKICAgICAgICAgICAgc2V0RXhwKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IExldChzZXRWYXIsIHNldEV4cCk7CiAgICB9CiAgfQp9Cn0ATk48ASYBIgEhCRMPFR8SFBcNERIUGg4VExQaEh0VATgBNwE5AUQBSzIdGx4dMB0BOks7GQQBOUEEAUxLRkctNkdBNjJFPy8gDAoIBhEEAUomRjg2TgEuGChMOh49PQgyS0M/Gg1LRSBKTS0zPzI9GkMpISgdFQgmBgQCAT5wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL3RyYW5zZm9ybV9zZXRfbGl0ZXJhbHMuZGFydERzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvcGFyc2VyL2NsYXNzX21lbWJlcl9wYXJzZXIuZGFydIemLy8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEucGFyc2VyLmNsYXNzX21lbWJlcl9wYXJzZXI7CgppbXBvcnQgJy4uLy4uL3NjYW5uZXIvdG9rZW4uZGFydCcgc2hvdyBUb2tlbjsKCmltcG9ydCAnZXJyb3JfZGVsZWdhdGlvbl9saXN0ZW5lci5kYXJ0JyBzaG93IEVycm9yRGVsZWdhdGlvbkxpc3RlbmVyOwoKaW1wb3J0ICdsaXN0ZW5lci5kYXJ0JyBzaG93IExpc3RlbmVyOwoKaW1wb3J0ICdwYXJzZXIuZGFydCcgc2hvdyBQYXJzZXI7CgovLy8gUGFyc2VyIHNpbWlsYXIgdG8gW1RvcExldmVsUGFyc2VyXSBidXQgYWxzbyBwYXJzZXMgY2xhc3MgbWVtYmVycyAoZXhjbHVkaW5nCi8vLyB0aGVpciBib2RpZXMpLgpjbGFzcyBDbGFzc01lbWJlclBhcnNlciBleHRlbmRzIFBhcnNlciB7CiAgUGFyc2VyIHNraXBQYXJzZXI7CgogIENsYXNzTWVtYmVyUGFyc2VyKExpc3RlbmVyIGxpc3RlbmVyKSA6IHN1cGVyKGxpc3RlbmVyKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2VFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gc2tpcEV4cHJlc3Npb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2VJZGVudGlmaWVyRXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIHRva2VuLm5leHQ7CiAgfQoKICBUb2tlbiBza2lwRXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgLy8gVE9ETyhhc2tlc2MpOiBXZSBsaXN0ZW4gdG8gZXJyb3JzIG9jY3VycmluZyBkdXJpbmcgZXhwcmVzc2lvbiBwYXJzaW5nLAogICAgLy8gc2luY2UgdGhlIHBhcnNlciBtYXkgcmV3cml0ZSB0aGUgdG9rZW4gc3RyZWFtIHN1Y2ggdGhhdCB0aGUgZXJyb3IgaXMKICAgIC8vIG5vdCB0cmlnZ2VyZWQgZHVyaW5nIHRoZSBzZWNvbmQgcGFyc2UuCiAgICAvLyBXaGVuIHRoZSBwYXJzZXIgc3VwcG9ydHMgbm90IGRvaW5nIHRva2VuIHN0cmVhbSByZXdyaXRpbmcsIHVzZSB0aGF0CiAgICAvLyBmZWF0dXJlIHRvZ2V0aGVyIHdpdGggYSBuby1vcCBsaXN0ZW5lciBpbnN0ZWFkLgogICAgc2tpcFBhcnNlciA/Pz0gbmV3IFBhcnNlcihuZXcgRXJyb3JEZWxlZ2F0aW9uTGlzdGVuZXIobGlzdGVuZXIpKTsKICAgIHNraXBQYXJzZXIubWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zID0gbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zOwogICAgc2tpcFBhcnNlci5hc3luY1N0YXRlID0gYXN5bmNTdGF0ZTsKICAgIHNraXBQYXJzZXIubG9vcFN0YXRlID0gbG9vcFN0YXRlOwogICAgcmV0dXJuIHNraXBQYXJzZXIucGFyc2VFeHByZXNzaW9uKHRva2VuKTsKICB9CgogIC8vIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4gZm9yIHR3byByZWFzb25zOgogIC8vIDEuIEF2b2lkIGdlbmVyYXRpbmcgZXZlbnRzIGZvciBhcmd1bWVudHMuCiAgLy8gMi4gQXZvaWQgY2FsbGluZyBza2lwIGV4cHJlc3Npb24gZm9yIGVhY2ggYXJndW1lbnQgKHdoaWNoIGRvZXNuJ3Qgd29yaykuCiAgVG9rZW4gcGFyc2VBcmd1bWVudHNPcHQoVG9rZW4gdG9rZW4pID0+IHNraXBBcmd1bWVudHNPcHQodG9rZW4pOwoKICBUb2tlbiBwYXJzZUZ1bmN0aW9uQm9keShUb2tlbiB0b2tlbiwgYm9vbCBpc0V4cHJlc3Npb24sIGJvb2wgYWxsb3dBYnN0cmFjdCkgewogICAgcmV0dXJuIHNraXBGdW5jdGlvbkJvZHkodG9rZW4sIGlzRXhwcmVzc2lvbiwgYWxsb3dBYnN0cmFjdCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZUludmFsaWRCbG9jayhUb2tlbiB0b2tlbikgPT4gc2tpcEJsb2NrKHRva2VuKTsKfQo6AE5OPAEqAS4BRgEmASIBUBMpFQE6AQwnIgQBDDEXBAEmTkwuSzdGSigmLgQBMC9OQwFQQQQBDDwCATtwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL2NsYXNzX21lbWJlcl9wYXJzZXIuZGFydDBzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvcGFyc2VyLmRhcnSG7S8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UubWQgZmlsZS4KCmxpYnJhcnkgZmFzdGEucGFyc2VyOwoKaW1wb3J0ICcuLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJ3BhcnNlci9saXN0ZW5lci5kYXJ0JyBzaG93IExpc3RlbmVyOwoKaW1wb3J0ICdwYXJzZXIvcGFyc2VyLmRhcnQnIHNob3cgUGFyc2VyOwoKaW1wb3J0ICdwYXJzZXIvcGFyc2VyX2Vycm9yLmRhcnQnIHNob3cgUGFyc2VyRXJyb3I7CgppbXBvcnQgJ2Zhc3RhX2NvZGVzLmRhcnQnIHNob3cgTWVzc2FnZSwgbWVzc2FnZU5hdGl2ZUNsYXVzZVNob3VsZEJlQW5ub3RhdGlvbjsKCmV4cG9ydCAncGFyc2VyL2Fzc2VydC5kYXJ0JyBzaG93IEFzc2VydDsKCmV4cG9ydCAncGFyc2VyL2NsYXNzX21lbWJlcl9wYXJzZXIuZGFydCcgc2hvdyBDbGFzc01lbWJlclBhcnNlcjsKCmV4cG9ydCAncGFyc2VyL2Zvcm1hbF9wYXJhbWV0ZXJfa2luZC5kYXJ0JyBzaG93IEZvcm1hbFBhcmFtZXRlcktpbmQ7CgpleHBvcnQgJ3BhcnNlci9pZGVudGlmaWVyX2NvbnRleHQuZGFydCcgc2hvdyBJZGVudGlmaWVyQ29udGV4dDsKCmV4cG9ydCAncGFyc2VyL2xpc3RlbmVyLmRhcnQnIHNob3cgTGlzdGVuZXI7CgpleHBvcnQgJ3BhcnNlci9tZW1iZXJfa2luZC5kYXJ0JyBzaG93IE1lbWJlcktpbmQ7CgpleHBvcnQgJ3BhcnNlci9wYXJzZXIuZGFydCcgc2hvdyBQYXJzZXI7CgpleHBvcnQgJ3BhcnNlci9wYXJzZXJfZXJyb3IuZGFydCcgc2hvdyBQYXJzZXJFcnJvcjsKCmV4cG9ydCAncGFyc2VyL3RvcF9sZXZlbF9wYXJzZXIuZGFydCcgc2hvdyBUb3BMZXZlbFBhcnNlcjsKCmV4cG9ydCAncGFyc2VyL3V0aWwuZGFydCcKICAgIHNob3cgbGVuZ3RoRm9yVG9rZW4sIGxlbmd0aE9mU3Bhbiwgb2Zmc2V0Rm9yVG9rZW4sIG9wdGlvbmFsOwoKY2xhc3MgRXJyb3JDb2xsZWN0aW5nTGlzdGVuZXIgZXh0ZW5kcyBMaXN0ZW5lciB7CiAgZmluYWwgTGlzdDxQYXJzZXJFcnJvcj4gcmVjb3ZlcmFibGVFcnJvcnMgPSA8UGFyc2VyRXJyb3I+W107CgogIHZvaWQgaGFuZGxlUmVjb3ZlcmFibGVFcnJvcigKICAgICAgTWVzc2FnZSBtZXNzYWdlLCBUb2tlbiBzdGFydFRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgLy8vIFRPRE8oZGFucnViZWwpOiBJZ25vcmUgdGhpcyBlcnJvciB1bnRpbCB3ZSBkZXByZWNhdGUgYG5hdGl2ZWAgc3VwcG9ydC4KICAgIGlmIChtZXNzYWdlID09IG1lc3NhZ2VOYXRpdmVDbGF1c2VTaG91bGRCZUFubm90YXRpb24pIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgcmVjb3ZlcmFibGVFcnJvcnMKICAgICAgICAuYWRkKG5ldyBQYXJzZXJFcnJvci5mcm9tVG9rZW5zKHN0YXJ0VG9rZW4sIGVuZFRva2VuLCBtZXNzYWdlKSk7CiAgfQp9CgpMaXN0PFBhcnNlckVycm9yPiBwYXJzZShUb2tlbiB0b2tlbnMpIHsKICBFcnJvckNvbGxlY3RpbmdMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFcnJvckNvbGxlY3RpbmdMaXN0ZW5lcigpOwogIFBhcnNlciBwYXJzZXIgPSBuZXcgUGFyc2VyKGxpc3RlbmVyKTsKICBwYXJzZXIucGFyc2VVbml0KHRva2Vucyk7CiAgcmV0dXJuIGxpc3RlbmVyLnJlY292ZXJhYmxlRXJyb3JzOwp9CjsATU4/ARYBKwEtASkBNAFPASkBQQFFAUABLQEyASkBNAE7ARpBATE/AR87TzwOBhZJBAIBKEQoHCUCASdwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyLmRhcnRLc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL2ludGVyZmFjZV9yZXNvbHZlci5kYXJ0wAC91C8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UubWQgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQXJndW1lbnRzLAogICAgICAgIENsYXNzLAogICAgICAgIERhcnRUeXBlLAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEV4cHJlc3Npb24sCiAgICAgICAgRmllbGQsCiAgICAgICAgRnVuY3Rpb25Ob2RlLAogICAgICAgIEZ1bmN0aW9uVHlwZSwKICAgICAgICBJbnZhbGlkVHlwZSwKICAgICAgICBNZW1iZXIsCiAgICAgICAgTmFtZSwKICAgICAgICBOYW1lZEV4cHJlc3Npb24sCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFByb2NlZHVyZUtpbmQsCiAgICAgICAgUmV0dXJuU3RhdGVtZW50LAogICAgICAgIFN1cGVyTWV0aG9kSW52b2NhdGlvbiwKICAgICAgICBTdXBlclByb3BlcnR5R2V0LAogICAgICAgIFN1cGVyUHJvcGVydHlTZXQsCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uLAogICAgICAgIFZhcmlhYmxlR2V0LAogICAgICAgIFZvaWRUeXBlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCcgc2hvdyBDbGFzc0hpZXJhcmNoeTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdHJhbnNmb3JtYXRpb25zL2ZsYWdzLmRhcnQnIHNob3cgVHJhbnNmb3JtZXJGbGFnOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgc2hvdyBTdWJzdGl0dXRpb247CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3NyYy9oaWVyYXJjaHlfYmFzZWRfdHlwZV9lbnZpcm9ubWVudC5kYXJ0JwogICAgc2hvdyBIaWVyYXJjaHlCYXNlZFR5cGVFbnZpcm9ubWVudDsKCmltcG9ydCAnLi4vLi4vYmFzZS9pbnN0cnVtZW50YXRpb24uZGFydCcKICAgIHNob3cgSW5zdHJ1bWVudGF0aW9uLCBJbnN0cnVtZW50YXRpb25WYWx1ZUxpdGVyYWw7CgppbXBvcnQgJy4uL2J1aWxkZXIvYnVpbGRlci5kYXJ0JyBzaG93IExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX2xpYnJhcnlfYnVpbGRlci5kYXJ0JyBzaG93IEtlcm5lbExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX3NoYWRvd19hc3QuZGFydCcKICAgIHNob3cgU2hhZG93Q2xhc3MsIFNoYWRvd0ZpZWxkLCBTaGFkb3dQcm9jZWR1cmUsIFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudDsKCmltcG9ydCAnLi4vbWVzc2FnZXMuZGFydCcKICAgIHNob3cKICAgICAgICBub0xlbmd0aCwKICAgICAgICB0ZW1wbGF0ZUNhbnRJbmZlclR5cGVEdWVUb0NpcmN1bGFyaXR5LAogICAgICAgIHRlbXBsYXRlQ2FudEluZmVyVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzOwoKaW1wb3J0ICcuLi9uYW1lcy5kYXJ0JyBzaG93IGluZGV4U2V0TmFtZTsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyB1bmhhbmRsZWQ7CgppbXBvcnQgJ3R5cGVfaW5mZXJlbmNlX2VuZ2luZS5kYXJ0JwogICAgc2hvdwogICAgICAgIEZpZWxkSW5pdGlhbGl6ZXJJbmZlcmVuY2VOb2RlLAogICAgICAgIEluY2x1ZGVzVHlwZVBhcmFtZXRlcnNDb3ZhcmlhbnRseSwKICAgICAgICBJbmZlcmVuY2VOb2RlLAogICAgICAgIFR5cGVJbmZlcmVuY2VFbmdpbmU7CgppbXBvcnQgJ3R5cGVfaW5mZXJyZXIuZGFydCcgc2hvdyBnZXROYW1lZEZvcm1hbDsKCmltcG9ydCAndHlwZV9zY2hlbWFfZW52aXJvbm1lbnQuZGFydCcKICAgIHNob3cKICAgICAgICBnZXROYW1lZFBhcmFtZXRlclR5cGUsCiAgICAgICAgZ2V0UG9zaXRpb25hbFBhcmFtZXRlclR5cGUsCiAgICAgICAgc3Vic3RpdHV0ZVR5cGVQYXJhbXM7CgovLy8gQ29uY3JldGUgY2xhc3MgZGVyaXZlZCBmcm9tIFtJbmZlcmVuY2VOb2RlXSB0byByZXByZXNlbnQgdHlwZSBpbmZlcmVuY2Ugb2YKLy8vIGdldHRlcnMsIHNldHRlcnMsIGFuZCBmaWVsZHMgYmFzZWQgb24gaW5oZXJpdGFuY2UuCmNsYXNzIEFjY2Vzc29ySW5mZXJlbmNlTm9kZSBleHRlbmRzIEluZmVyZW5jZU5vZGUgewogIGZpbmFsIEludGVyZmFjZVJlc29sdmVyIF9pbnRlcmZhY2VSZXNvbHZlcjsKCiAgLy8vIFRoZSBtZXRob2Qgd2hvc2UgcmV0dXJuIHR5cGUgYW5kL29yIHBhcmFtZXRlciB0eXBlcyBzaG91bGQgYmUgaW5mZXJyZWQuCiAgZmluYWwgUHJvY2VkdXJlIF9kZWNsYXJlZE1ldGhvZDsKCiAgLy8vIEEgbGlzdCBjb250YWluaW5nIHRoZSBtZXRob2RzIG92ZXJyaWRkZW4gYnkgW19kZWNsYXJlZE1ldGhvZF0sIGlmIGFueS4KICBmaW5hbCBMaXN0PE1lbWJlcj4gX2NhbmRpZGF0ZXM7CgogIC8vLyBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG1ldGhvZCBpbiBbX2NhbmRpZGF0ZXNdIG92ZXJyaWRkZW4gYnkKICAvLy8gW19kZWNsYXJlZE1ldGhvZF0uCiAgZmluYWwgaW50IF9zdGFydDsKCiAgLy8vIFRoZSBwYXN0LXRoZS1lbmQgaW5kZXggb2YgdGhlIGxhc3QgbWV0aG9kIGluIFtfY2FuZGlkYXRlc10gb3ZlcnJpZGRlbiBieQogIC8vLyBbX2RlY2xhcmVkTWV0aG9kXS4KICBmaW5hbCBpbnQgX2VuZDsKCiAgZmluYWwgTGlicmFyeUJ1aWxkZXIgX2xpYnJhcnk7CgogIGZpbmFsIFVyaSBfZmlsZVVyaTsKCiAgQWNjZXNzb3JJbmZlcmVuY2VOb2RlKHRoaXMuX2ludGVyZmFjZVJlc29sdmVyLCB0aGlzLl9kZWNsYXJlZE1ldGhvZCwKICAgICAgdGhpcy5fY2FuZGlkYXRlcywgdGhpcy5fc3RhcnQsIHRoaXMuX2VuZCwgdGhpcy5fbGlicmFyeSwgdGhpcy5fZmlsZVVyaSk7CgogIFN0cmluZyBnZXQgX25hbWUgewogICAgaWYgKF9kZWNsYXJlZE1ldGhvZCBpcyEgU3ludGhldGljQWNjZXNzb3IgJiYgX2RlY2xhcmVkTWV0aG9kLmlzU2V0dGVyKSB7CiAgICAgIHJldHVybiBfZGVjbGFyZWRNZXRob2QuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnNbMF0ubmFtZTsKICAgIH0KICAgIHJldHVybiBfZGVjbGFyZWRNZXRob2QubmFtZS5uYW1lOwogIH0KCiAgaW50IGdldCBfb2Zmc2V0IHsKICAgIGlmIChfZGVjbGFyZWRNZXRob2QgaXMhIFN5bnRoZXRpY0FjY2Vzc29yICYmIF9kZWNsYXJlZE1ldGhvZC5pc1NldHRlcikgewogICAgICByZXR1cm4gX2RlY2xhcmVkTWV0aG9kLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzWzBdLmZpbGVPZmZzZXQ7CiAgICB9CiAgICByZXR1cm4gX2RlY2xhcmVkTWV0aG9kLmZpbGVPZmZzZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlc29sdmVJbnRlcm5hbCgpIHsKICAgIHZhciBkZWNsYXJlZE1ldGhvZCA9IF9kZWNsYXJlZE1ldGhvZDsKICAgIHZhciBraW5kID0gZGVjbGFyZWRNZXRob2Qua2luZDsKICAgIHZhciBvdmVycmlkZGVuVHlwZXMgPSBfY29tcHV0ZUFjY2Vzc29yT3ZlcnJpZGRlblR5cGVzKCk7CiAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CiAgICBpZiAoaXNDaXJjdWxhcikgewogICAgICBpbmZlcnJlZFR5cGUgPSBjb25zdCBJbnZhbGlkVHlwZSgpOwogICAgICBfbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVDYW50SW5mZXJUeXBlRHVlVG9DaXJjdWxhcml0eS53aXRoQXJndW1lbnRzKF9uYW1lKSwKICAgICAgICAgIF9vZmZzZXQsCiAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgIF9maWxlVXJpKTsKICAgIH0gZWxzZSB7CiAgICAgIGluZmVycmVkVHlwZSA9IF9pbnRlcmZhY2VSZXNvbHZlci5tYXRjaFR5cGVzKAogICAgICAgICAgb3ZlcnJpZGRlblR5cGVzLCBfbGlicmFyeSwgX25hbWUsIF9maWxlVXJpLCBfb2Zmc2V0KTsKICAgIH0KICAgIGlmIChkZWNsYXJlZE1ldGhvZCBpcyBTeW50aGV0aWNBY2Nlc3NvcikgewogICAgICBkZWNsYXJlZE1ldGhvZC5fZmllbGQudHlwZSA9IGluZmVycmVkVHlwZTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChraW5kID09IFByb2NlZHVyZUtpbmQuR2V0dGVyKSB7CiAgICAgICAgZGVjbGFyZWRNZXRob2QuZnVuY3Rpb24ucmV0dXJuVHlwZSA9IGluZmVycmVkVHlwZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkZWNsYXJlZE1ldGhvZC5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyc1swXS50eXBlID0gaW5mZXJyZWRUeXBlOwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gQ29tcHV0ZXMgdGhlIHR5cGVzIG9mIHRoZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIG92ZXJyaWRkZW4gYnkKICAvLy8gW19kZWNsYXJlZE1ldGhvZF0sIHdpdGggYXBwcm9wcmlhdGUgdHlwZSBwYXJhbWV0ZXIgc3Vic3RpdHV0aW9ucy4KICBMaXN0PERhcnRUeXBlPiBfY29tcHV0ZUFjY2Vzc29yT3ZlcnJpZGRlblR5cGVzKCkgewogICAgdmFyIG92ZXJyaWRkZW5UeXBlcyA9IDxEYXJ0VHlwZT5bXTsKICAgIGZvciAoaW50IGkgPSBfc3RhcnQ7IGkgPCBfZW5kOyBpKyspIHsKICAgICAgdmFyIGNhbmRpZGF0ZSA9IF9jYW5kaWRhdGVzW2ldOwogICAgICBQcm9jZWR1cmUgcmVzb2x2ZWRDYW5kaWRhdGU7CiAgICAgIGlmIChjYW5kaWRhdGUgaXMgRm9yd2FyZGluZ05vZGUpIHsKICAgICAgICByZXNvbHZlZENhbmRpZGF0ZSA9IGNhbmRpZGF0ZS5yZXNvbHZlKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzb2x2ZWRDYW5kaWRhdGUgPSBjYW5kaWRhdGU7CiAgICAgIH0KICAgICAgRGFydFR5cGUgb3ZlcnJpZGRlblR5cGU7CiAgICAgIGlmIChyZXNvbHZlZENhbmRpZGF0ZSBpcyBTeW50aGV0aWNBY2Nlc3NvcikgewogICAgICAgIHZhciBmaWVsZCA9IHJlc29sdmVkQ2FuZGlkYXRlLl9maWVsZDsKICAgICAgICBUeXBlSW5mZXJlbmNlRW5naW5lLnJlc29sdmVJbmZlcmVuY2VOb2RlKGZpZWxkKTsKICAgICAgICBvdmVycmlkZGVuVHlwZSA9IGZpZWxkLnR5cGU7CiAgICAgIH0gZWxzZSBpZiAocmVzb2x2ZWRDYW5kaWRhdGUuZnVuY3Rpb24gIT0gbnVsbCkgewogICAgICAgIHN3aXRjaCAocmVzb2x2ZWRDYW5kaWRhdGUua2luZCkgewogICAgICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLkdldHRlcjoKICAgICAgICAgICAgb3ZlcnJpZGRlblR5cGUgPSByZXNvbHZlZENhbmRpZGF0ZS5mdW5jdGlvbi5yZXR1cm5UeXBlOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5TZXR0ZXI6CiAgICAgICAgICAgIG92ZXJyaWRkZW5UeXBlID0KICAgICAgICAgICAgICAgIHJlc29sdmVkQ2FuZGlkYXRlLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzWzBdLnR5cGU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgLy8gSWxsZWdhbCBvdmVycmlkZSAoZXJyb3Igd2lsbCBiZSByZXBvcnRlZCBlbHNld2hlcmUpLiAgSnVzdCBza2lwCiAgICAgICAgICAgIC8vIHRoaXMgb3ZlcnJpZGUuCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlcmUgYXJlIGVycm9ycy4gIEp1c3Qgc2tpcCB0aGlzIG92ZXJyaWRlLgogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIG92ZXJyaWRkZW5UeXBlcy5hZGQoX2ludGVyZmFjZVJlc29sdmVyCiAgICAgICAgICAuX3N1YnN0aXR1dGlvbkZvcihyZXNvbHZlZENhbmRpZGF0ZSwgX2RlY2xhcmVkTWV0aG9kLmVuY2xvc2luZ0NsYXNzKQogICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKG92ZXJyaWRkZW5UeXBlKSk7CiAgICB9CiAgICByZXR1cm4gb3ZlcnJpZGRlblR5cGVzOwogIH0KfQoKLy8vIEEgW0ZvcndhcmRpbmdOb2RlXSByZXByZXNlbnRzIGEgbWV0aG9kLCBnZXR0ZXIsIG9yIHNldHRlciB3aXRoaW4gYSBjbGFzcydzCi8vLyBpbnRlcmZhY2UgdGhhdCBpcyBlaXRoZXIgaW1wbGVtZW50ZWQgaW4gdGhlIGNsYXNzIGRpcmVjdGx5IG9yIGluaGVyaXRlZCBmcm9tCi8vLyBhIHN1cGVyY2xhc3MuCi8vLwovLy8gVGhpcyBjbGFzcyBhbGxvd3MgdXMgdG8gZGVmZXIgdGhlIGRldGVybWluYXRpb24gb2YgZXhhY3RseSB3aGljaCBtZW1iZXIgaXMKLy8vIGluaGVyaXRlZCwgYXMgd2VsbCBhcyB0aGUgcHJvcGFnYXRpb24gb2YgY292YXJpYW5jZSBhbm5vdGF0aW9ucywgYW5kCi8vLyB0aGUgY3JlYXRpb24gb2YgZm9yd2FyZGluZyBzdHVicywgdW50aWwgdHlwZSBpbmZlcmVuY2UuCmNsYXNzIEZvcndhcmRpbmdOb2RlIGV4dGVuZHMgUHJvY2VkdXJlIHsKICAvLy8gVGhlIFtJbnRlcmZhY2VSZXNvbHZlcl0gdGhhdCBjcmVhdGVkIHRoaXMgW0ZvcndhcmRpbmdOb2RlXS4KICBmaW5hbCBJbnRlcmZhY2VSZXNvbHZlciBfaW50ZXJmYWNlUmVzb2x2ZXI7CgogIC8vLyBBIGxpc3QgY29udGFpbmluZyB0aGUgZGlyZWN0bHkgaW1wbGVtZW50ZWQgYW5kIGRpcmVjdGx5IGluaGVyaXRlZAogIC8vLyBwcm9jZWR1cmVzIG9mIHRoZSBjbGFzcyBpbiBxdWVzdGlvbi4KICAvLy8KICAvLy8gTm90ZSB0aGF0IG1hbnkgW0ZvcndhcmRpbmdOb2RlXXMgc2hhcmUgdGhlIHNhbWUgW19jYW5kaWRhdGVzXSBsaXN0OwogIC8vLyBjb25zdWx0IFtfc3RhcnRdIGFuZCBbX2VuZF0gdG8gc2VlIHdoaWNoIGVudHJpZXMgaW4gdGhpcyBsaXN0IGFyZSByZWxldmFudAogIC8vLyB0byB0aGlzIFtGb3J3YXJkaW5nTm9kZV0uCiAgZmluYWwgTGlzdDxNZW1iZXI+IF9jYW5kaWRhdGVzOwoKICAvLy8gSW5kZXggb2YgdGhlIGZpcnN0IGVudHJ5IGluIFtfY2FuZGlkYXRlc10gcmVsZXZhbnQgdG8gdGhpcwogIC8vLyBbRm9yd2FyZGluZ05vZGVdLgogIGZpbmFsIGludCBfc3RhcnQ7CgogIC8vLyBJbmRleCBqdXN0IGJleW9uZCB0aGUgbGFzdCBlbnRyeSBpbiBbX2NhbmRpZGF0ZXNdIHJlbGV2YW50IHRvIHRoaXMKICAvLy8gW0ZvcndhcmRpbmdOb2RlXS4KICBmaW5hbCBpbnQgX2VuZDsKCiAgLy8vIFRoZSBtZW1iZXIgdGhpcyBub2RlIHJlc29sdmVzIHRvIChpZiBpdCBoYXMgYmVlbiBjb21wdXRlZCk7IG90aGVyd2lzZQogIC8vLyBgbnVsbGAuCiAgTWVtYmVyIF9yZXNvbHV0aW9uOwoKICAvLy8gVGhlIHJlc3VsdCBvZiBmaW5hbGl6aW5nIHRoaXMgbm9kZSAoaWYgdGhlIG5vZGUgaGFzIGJlZW4gZmluYWxpemVkKTsKICAvLy8gb3RoZXJ3aXNlIGBudWxsYC4KICBNZW1iZXIgX2ZpbmFsUmVzb2x1dGlvbjsKCiAgLy8vIElmIHRoaXMgZm9yd2FyZGluZyBub2RlIHJlcHJlc2VudHMgYSBtZW1iZXIgdGhhdCBuZWVkcyB0eXBlIGluZmVyZW5jZSwgdGhlCiAgLy8vIGNvcnJlc3BvbmRpbmcgW0luZmVyZW5jZU5vZGVdOyBvdGhlcndpc2UgYG51bGxgLgogIEluZmVyZW5jZU5vZGUgX2luZmVyZW5jZU5vZGU7CgogIEZvcndhcmRpbmdOb2RlKHRoaXMuX2ludGVyZmFjZVJlc29sdmVyLCB0aGlzLl9pbmZlcmVuY2VOb2RlLCBDbGFzcyBjbGFzc18sCiAgICAgIE5hbWUgbmFtZSwgUHJvY2VkdXJlS2luZCBraW5kLCB0aGlzLl9jYW5kaWRhdGVzLCB0aGlzLl9zdGFydCwgdGhpcy5fZW5kKQogICAgICA6IHN1cGVyKG5hbWUsIGtpbmQsIG51bGwpIHsKICAgIHBhcmVudCA9IGNsYXNzXzsKICB9CgogIC8vLyBGaW5pc2hlcyBoYW5kbGluZyBvZiB0aGlzIG5vZGUgYnkgcHJvcGFnYXRpbmcgY292YXJpYW5jZSBhbmQgY3JlYXRpbmcKICAvLy8gZm9yd2FyZGluZyBzdHVicyBpZiBuZWNlc3NhcnkuCiAgUHJvY2VkdXJlIGZpbmFsaXplKCkgPT4gX2ZpbmFsUmVzb2x1dGlvbiA/Pz0gX2ZpbmFsaXplKCk7CgogIC8vLyBSZXR1cm5zIHRoZSBkZWNsYXJlZCBvciBpbmhlcml0ZWQgbWVtYmVyIHRoaXMgbm9kZSByZXNvbHZlcyB0by4KICAvLy8KICAvLy8gRG9lcyBub3QgY3JlYXRlIGZvcndhcmRpbmcgc3R1YnMuCiAgUHJvY2VkdXJlIHJlc29sdmUoKSA9PiBfcmVzb2x1dGlvbiA/Pz0gX3Jlc29sdmUoKTsKCiAgLy8vIFRhZyB0aGUgcGFyYW1ldGVycyBvZiBbaW50ZXJmYWNlTWVtYmVyXSB0aGF0IG5lZWQgdHlwZSBjaGVja3MKICAvLy8KICAvLy8gUGFyYW1ldGVycyBjYW4gbmVlZCB0eXBlIGNoZWNrcyBmb3IgY2FsbHMgY29taW5nIGZyb20gc3RhdGljYWxseSB0eXBlZAogIC8vLyBjYWxsIHNpdGVzLCBkdWUgdG8gY292YXJpYW50IGdlbmVyaWNzIGFuZCBvdmVycmlkZXMgd2l0aCBleHBsaWNpdAogIC8vLyBgY292YXJpYW50YCBwYXJhbWV0ZXJzLgogIC8vLwogIC8vLyBUYWcgcGFyYW1ldGVycyBvZiBbaW50ZXJmYWNlTWVtYmVyXSB0aGF0IG5lZWQgc3VjaCBjaGVja3Mgd2hlbiB0aGUgbWVtYmVyCiAgLy8vIG9jY3VycyBpbiBbZW5jbG9zaW5nQ2xhc3NdJ3MgaW50ZXJmYWNlLiAgSWYgcGFyYW1ldGVycyBuZWVkIGNoZWNrcyBidXQKICAvLy8gdGhleSB3b3VsZCBub3QgYmUgY2hlY2tlZCBpbiBhbiBpbmhlcml0ZWQgaW1wbGVtZW50YXRpb24sIGEgZm9yd2FyZGluZwogIC8vLyBzdHViIGlzIGludHJvZHVjZWQgYXMgYSBwbGFjZSB0byBwdXQgdGhlIGNoZWNrcy4KICBQcm9jZWR1cmUgX2NvbXB1dGVDb3ZhcmlhbmNlRml4ZXMoUHJvY2VkdXJlIGludGVyZmFjZU1lbWJlcikgewogICAgdmFyIHN1YnN0aXR1dGlvbiA9CiAgICAgICAgX2ludGVyZmFjZVJlc29sdmVyLl9zdWJzdGl0dXRpb25Gb3IoaW50ZXJmYWNlTWVtYmVyLCBlbmNsb3NpbmdDbGFzcyk7CiAgICAvLyBXZSBhbHdheXMgY3JlYXRlIGEgZm9yd2FyZGluZyBzdHViIHdoZW4gd2UndmUgaW5oZXJpdGVkIGEgbWVtYmVyIGZyb20gYW4KICAgIC8vIGludGVyZmFjZSBvdGhlciB0aGFuIHRoZSBmaXJzdCBvdmVycmlkZSBjYW5kaWRhdGUuICBUaGlzIGlzIHRvIHdvcmsKICAgIC8vIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgS2VybmVsIHR5cGUgY2hlY2tlciB3aGVyZSBpdCBjaG9vc2VzIHRoZSBmaXJzdAogICAgLy8gb3ZlcnJpZGUgY2FuZGlkYXRlLgogICAgLy8KICAgIC8vIFRPRE8oa21pbGxpa2luKTogRml4IHRoZSBLZXJuZWwgdHlwZSBjaGVja2VyIGFuZCBzdG9wIGNyZWF0aW5nIHRoZXNlCiAgICAvLyBleHRyYSBzdHVicy4KICAgIHZhciBzdHViID0gaW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzID09IGVuY2xvc2luZ0NsYXNzIHx8CiAgICAgICAgICAgIGludGVyZmFjZU1lbWJlciA9PSBfcmVzb2x2ZWRDYW5kaWRhdGUoX3N0YXJ0KQogICAgICAgID8gaW50ZXJmYWNlTWVtYmVyCiAgICAgICAgOiBfY3JlYXRlRm9yd2FyZGluZ1N0dWIoc3Vic3RpdHV0aW9uLCBpbnRlcmZhY2VNZW1iZXIpOwoKICAgIHZhciBpbnRlcmZhY2VGdW5jdGlvbiA9IGludGVyZmFjZU1lbWJlci5mdW5jdGlvbjsKICAgIHZhciBpbnRlcmZhY2VQb3NpdGlvbmFsUGFyYW1ldGVycyA9IGludGVyZmFjZUZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzOwogICAgdmFyIGludGVyZmFjZU5hbWVkUGFyYW1ldGVycyA9IGludGVyZmFjZUZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVyczsKICAgIHZhciBpbnRlcmZhY2VUeXBlUGFyYW1ldGVycyA9IGludGVyZmFjZUZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzOwoKICAgIHZvaWQgY3JlYXRlU3R1YklmTmVlZGVkKCkgewogICAgICBpZiAoc3R1YiAhPSBpbnRlcmZhY2VNZW1iZXIpIHJldHVybjsKICAgICAgaWYgKGludGVyZmFjZU1lbWJlci5lbmNsb3NpbmdDbGFzcyA9PSBlbmNsb3NpbmdDbGFzcykgcmV0dXJuOwogICAgICBzdHViID0gX2NyZWF0ZUZvcndhcmRpbmdTdHViKHN1YnN0aXR1dGlvbiwgaW50ZXJmYWNlTWVtYmVyKTsKICAgIH0KCiAgICBib29sIGlzSW1wbENyZWF0ZWQgPSBmYWxzZTsKICAgIHZvaWQgY3JlYXRlSW1wbElmTmVlZGVkKCkgewogICAgICBpZiAoaXNJbXBsQ3JlYXRlZCkgcmV0dXJuOwogICAgICBjcmVhdGVTdHViSWZOZWVkZWQoKTsKICAgICAgX2NyZWF0ZUZvcndhcmRpbmdJbXBsSWZOZWVkZWQoc3R1Yi5mdW5jdGlvbik7CiAgICAgIGlzSW1wbENyZWF0ZWQgPSB0cnVlOwogICAgfQoKICAgIEluY2x1ZGVzVHlwZVBhcmFtZXRlcnNDb3ZhcmlhbnRseSBuZWVkc0NoZWNrVmlzaXRvciA9CiAgICAgICAgZW5jbG9zaW5nQ2xhc3MudHlwZVBhcmFtZXRlcnMuaXNFbXB0eQogICAgICAgICAgICA/IG51bGwKICAgICAgICAgICAgOiBTaGFkb3dDbGFzcy5nZXRDbGFzc0luZmVyZW5jZUluZm8oZW5jbG9zaW5nQ2xhc3MpCiAgICAgICAgICAgICAgICAgICAgLm5lZWRzQ2hlY2tWaXNpdG9yID8/PQogICAgICAgICAgICAgICAgbmV3IEluY2x1ZGVzVHlwZVBhcmFtZXRlcnNDb3ZhcmlhbnRseSgKICAgICAgICAgICAgICAgICAgICBlbmNsb3NpbmdDbGFzcy50eXBlUGFyYW1ldGVycyk7CiAgICBib29sIG5lZWRzQ2hlY2soRGFydFR5cGUgdHlwZSkgPT4gbmVlZHNDaGVja1Zpc2l0b3IgPT0gbnVsbAogICAgICAgID8gZmFsc2UKICAgICAgICA6IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZSh0eXBlKS5hY2NlcHQobmVlZHNDaGVja1Zpc2l0b3IpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VQb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcGFyYW1ldGVyID0gaW50ZXJmYWNlUG9zaXRpb25hbFBhcmFtZXRlcnNbaV07CiAgICAgIHZhciBpc0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0KICAgICAgICAgIHBhcmFtZXRlci5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsIHx8IG5lZWRzQ2hlY2socGFyYW1ldGVyLnR5cGUpOwogICAgICB2YXIgaXNDb3ZhcmlhbnQgPSBwYXJhbWV0ZXIuaXNDb3ZhcmlhbnQ7CiAgICAgIHZhciBzdXBlclBhcmFtZXRlciA9IHBhcmFtZXRlcjsKICAgICAgZm9yIChpbnQgaiA9IF9zdGFydDsgaiA8IF9lbmQ7IGorKykgewogICAgICAgIHZhciBvdGhlck1lbWJlciA9IF9maW5hbGl6ZWRDYW5kaWRhdGUoaik7CiAgICAgICAgaWYgKG90aGVyTWVtYmVyIGlzIEZvcndhcmRpbmdOb2RlKSBjb250aW51ZTsKICAgICAgICB2YXIgb3RoZXJQb3NpdGlvbmFsUGFyYW1ldGVycyA9CiAgICAgICAgICAgIG90aGVyTWVtYmVyLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzOwogICAgICAgIGlmIChvdGhlclBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCA8PSBpKSBjb250aW51ZTsKICAgICAgICB2YXIgb3RoZXJQYXJhbWV0ZXIgPSBvdGhlclBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldOwogICAgICAgIGlmIChqID09IF9zdGFydCkgc3VwZXJQYXJhbWV0ZXIgPSBvdGhlclBhcmFtZXRlcjsKICAgICAgICBpZiAoaWRlbnRpY2FsKG90aGVyTWVtYmVyLCBpbnRlcmZhY2VNZW1iZXIpKSBjb250aW51ZTsKICAgICAgICBpZiAob3RoZXJQYXJhbWV0ZXIuaXNHZW5lcmljQ292YXJpYW50SW1wbCkgewogICAgICAgICAgaXNHZW5lcmljQ292YXJpYW50SW1wbCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChvdGhlclBhcmFtZXRlci5pc0NvdmFyaWFudCkgewogICAgICAgICAgaXNDb3ZhcmlhbnQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaXNHZW5lcmljQ292YXJpYW50SW1wbCkgewogICAgICAgIGlmICghc3VwZXJQYXJhbWV0ZXIuaXNHZW5lcmljQ292YXJpYW50SW1wbCkgewogICAgICAgICAgY3JlYXRlSW1wbElmTmVlZGVkKCk7CiAgICAgICAgfQogICAgICAgIGlmICghcGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGwpIHsKICAgICAgICAgIGNyZWF0ZVN0dWJJZk5lZWRlZCgpOwogICAgICAgICAgc3R1Yi5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXS5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGlzQ292YXJpYW50KSB7CiAgICAgICAgaWYgKCFzdXBlclBhcmFtZXRlci5pc0NvdmFyaWFudCkgewogICAgICAgICAgY3JlYXRlSW1wbElmTmVlZGVkKCk7CiAgICAgICAgfQogICAgICAgIGlmICghcGFyYW1ldGVyLmlzQ292YXJpYW50KSB7CiAgICAgICAgICBjcmVhdGVTdHViSWZOZWVkZWQoKTsKICAgICAgICAgIHN0dWIuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnNbaV0uaXNDb3ZhcmlhbnQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VOYW1lZFBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHBhcmFtZXRlciA9IGludGVyZmFjZU5hbWVkUGFyYW1ldGVyc1tpXTsKICAgICAgdmFyIGlzR2VuZXJpY0NvdmFyaWFudEltcGwgPQogICAgICAgICAgcGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGwgfHwgbmVlZHNDaGVjayhwYXJhbWV0ZXIudHlwZSk7CiAgICAgIHZhciBpc0NvdmFyaWFudCA9IHBhcmFtZXRlci5pc0NvdmFyaWFudDsKICAgICAgdmFyIHN1cGVyUGFyYW1ldGVyID0gcGFyYW1ldGVyOwogICAgICBmb3IgKGludCBqID0gX3N0YXJ0OyBqIDwgX2VuZDsgaisrKSB7CiAgICAgICAgdmFyIG90aGVyTWVtYmVyID0gX2ZpbmFsaXplZENhbmRpZGF0ZShqKTsKICAgICAgICBpZiAob3RoZXJNZW1iZXIgaXMgRm9yd2FyZGluZ05vZGUpIGNvbnRpbnVlOwogICAgICAgIHZhciBvdGhlclBhcmFtZXRlciA9CiAgICAgICAgICAgIGdldE5hbWVkRm9ybWFsKG90aGVyTWVtYmVyLmZ1bmN0aW9uLCBwYXJhbWV0ZXIubmFtZSk7CiAgICAgICAgaWYgKG90aGVyUGFyYW1ldGVyID09IG51bGwpIGNvbnRpbnVlOwogICAgICAgIGlmIChqID09IF9zdGFydCkgc3VwZXJQYXJhbWV0ZXIgPSBvdGhlclBhcmFtZXRlcjsKICAgICAgICBpZiAoaWRlbnRpY2FsKG90aGVyTWVtYmVyLCBpbnRlcmZhY2VNZW1iZXIpKSBjb250aW51ZTsKICAgICAgICBpZiAob3RoZXJQYXJhbWV0ZXIuaXNHZW5lcmljQ292YXJpYW50SW1wbCkgewogICAgICAgICAgaXNHZW5lcmljQ292YXJpYW50SW1wbCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChvdGhlclBhcmFtZXRlci5pc0NvdmFyaWFudCkgewogICAgICAgICAgaXNDb3ZhcmlhbnQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaXNHZW5lcmljQ292YXJpYW50SW1wbCkgewogICAgICAgIGlmICghc3VwZXJQYXJhbWV0ZXIuaXNHZW5lcmljQ292YXJpYW50SW1wbCkgewogICAgICAgICAgY3JlYXRlSW1wbElmTmVlZGVkKCk7CiAgICAgICAgfQogICAgICAgIGlmICghcGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGwpIHsKICAgICAgICAgIGNyZWF0ZVN0dWJJZk5lZWRlZCgpOwogICAgICAgICAgc3R1Yi5mdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnNbaV0uaXNHZW5lcmljQ292YXJpYW50SW1wbCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpc0NvdmFyaWFudCkgewogICAgICAgIGlmICghc3VwZXJQYXJhbWV0ZXIuaXNDb3ZhcmlhbnQpIHsKICAgICAgICAgIGNyZWF0ZUltcGxJZk5lZWRlZCgpOwogICAgICAgIH0KICAgICAgICBpZiAoIXBhcmFtZXRlci5pc0NvdmFyaWFudCkgewogICAgICAgICAgY3JlYXRlU3R1YklmTmVlZGVkKCk7CiAgICAgICAgICBzdHViLmZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVyc1tpXS5pc0NvdmFyaWFudCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZVR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciB0eXBlUGFyYW1ldGVyID0gaW50ZXJmYWNlVHlwZVBhcmFtZXRlcnNbaV07CiAgICAgIHZhciBpc0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0gdHlwZVBhcmFtZXRlci5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsOwogICAgICB2YXIgc3VwZXJUeXBlUGFyYW1ldGVyID0gdHlwZVBhcmFtZXRlcjsKICAgICAgZm9yIChpbnQgaiA9IF9zdGFydDsgaiA8IF9lbmQ7IGorKykgewogICAgICAgIHZhciBvdGhlck1lbWJlciA9IF9maW5hbGl6ZWRDYW5kaWRhdGUoaik7CiAgICAgICAgaWYgKG90aGVyTWVtYmVyIGlzIEZvcndhcmRpbmdOb2RlKSBjb250aW51ZTsKICAgICAgICB2YXIgb3RoZXJUeXBlUGFyYW1ldGVycyA9IG90aGVyTWVtYmVyLmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzOwogICAgICAgIGlmIChvdGhlclR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA8PSBpKSBjb250aW51ZTsKICAgICAgICB2YXIgb3RoZXJUeXBlUGFyYW1ldGVyID0gb3RoZXJUeXBlUGFyYW1ldGVyc1tpXTsKICAgICAgICBpZiAoaiA9PSBfc3RhcnQpIHN1cGVyVHlwZVBhcmFtZXRlciA9IG90aGVyVHlwZVBhcmFtZXRlcjsKICAgICAgICBpZiAoaWRlbnRpY2FsKG90aGVyTWVtYmVyLCBpbnRlcmZhY2VNZW1iZXIpKSBjb250aW51ZTsKICAgICAgICBpZiAob3RoZXJUeXBlUGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGwpIHsKICAgICAgICAgIGlzR2VuZXJpY0NvdmFyaWFudEltcGwgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaXNHZW5lcmljQ292YXJpYW50SW1wbCkgewogICAgICAgIGlmICghc3VwZXJUeXBlUGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGwpIHsKICAgICAgICAgIGNyZWF0ZUltcGxJZk5lZWRlZCgpOwogICAgICAgIH0KICAgICAgICBpZiAoIXR5cGVQYXJhbWV0ZXIuaXNHZW5lcmljQ292YXJpYW50SW1wbCkgewogICAgICAgICAgY3JlYXRlU3R1YklmTmVlZGVkKCk7CiAgICAgICAgICBzdHViLmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzW2ldLmlzR2VuZXJpY0NvdmFyaWFudEltcGwgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHN0dWI7CiAgfQoKICB2b2lkIF9jcmVhdGVGb3J3YXJkaW5nSW1wbElmTmVlZGVkKEZ1bmN0aW9uTm9kZSBmdW5jdGlvbikgewogICAgaWYgKGZ1bmN0aW9uLmJvZHkgIT0gbnVsbCkgewogICAgICAvLyBUaGVyZSBpcyBhbHJlYWR5IGFuIGltcGxlbWVudGF0aW9uOyBub3RoaW5nIGZ1cnRoZXIgbmVlZHMgdG8gYmUgZG9uZS4KICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gRmluZCB0aGUgY29uY3JldGUgaW1wbGVtZW50YXRpb24gaW4gdGhlIHN1cGVyY2xhc3M7IHRoaXMgaXMgd2hhdCB3ZSBuZWVkCiAgICAvLyB0byBmb3J3YXJkIHRvLiAgSWYgd2UgY2FuJ3QgZmluZCBvbmUsIHRoZW4gdGhlIG1ldGhvZCBpcyBmdWxseSBhYnN0cmFjdAogICAgLy8gYW5kIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuCiAgICB2YXIgc3VwZXJjbGFzcyA9IGVuY2xvc2luZ0NsYXNzLnN1cGVyY2xhc3M7CiAgICBpZiAoc3VwZXJjbGFzcyA9PSBudWxsKSByZXR1cm47CiAgICBQcm9jZWR1cmUgcHJvY2VkdXJlID0gZnVuY3Rpb24ucGFyZW50OwogICAgdmFyIHN1cGVyVGFyZ2V0ID0gX2ludGVyZmFjZVJlc29sdmVyLl90eXBlRW52aXJvbm1lbnQuaGllcmFyY2h5CiAgICAgICAgLmdldERpc3BhdGNoVGFyZ2V0KHN1cGVyY2xhc3MsIHByb2NlZHVyZS5uYW1lLAogICAgICAgICAgICBzZXR0ZXI6IGtpbmQgPT0gUHJvY2VkdXJlS2luZC5TZXR0ZXIpOwogICAgaWYgKHN1cGVyVGFyZ2V0ID09IG51bGwpIHJldHVybjsKICAgIGlmIChzdXBlclRhcmdldCBpcyBQcm9jZWR1cmUgJiYgc3VwZXJUYXJnZXQuaXNGb3J3YXJkaW5nU3R1YikgewogICAgICBzdXBlclRhcmdldCA9IF9nZXRGb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0KHN1cGVyVGFyZ2V0KTsKICAgIH0KICAgIHByb2NlZHVyZS5pc0Fic3RyYWN0ID0gZmFsc2U7CiAgICBpZiAoIXByb2NlZHVyZS5pc0ZvcndhcmRpbmdTdHViKSB7CiAgICAgIC8vIFRoaXMgcHJvY2VkdXJlIGV4aXN0cyBhYnN0cmFjdGx5IGluIHRoZSBzb3VyY2UgY29kZTsgd2UgbmVlZCB0byBtYWtlIGl0CiAgICAgIC8vIGNvbmNyZXRlIGFuZCBnaXZlIGl0IGEgYm9keSB0aGF0IGlzIGEgZm9yd2FyZGluZyBzdHViLiAgVGhpcyBzaXR1YXRpb24KICAgICAgLy8gaXMgY2FsbGVkIGEgImZvcndhcmRpbmcgc2VtaS1zdHViIi4KICAgICAgcHJvY2VkdXJlLmlzRm9yd2FyZGluZ1N0dWIgPSB0cnVlOwogICAgICBwcm9jZWR1cmUuaXNGb3J3YXJkaW5nU2VtaVN0dWIgPSB0cnVlOwogICAgICBfaW50ZXJmYWNlUmVzb2x2ZXIuX2luc3RydW1lbnRhdGlvbj8ucmVjb3JkKAogICAgICAgICAgcHJvY2VkdXJlLmZpbGVVcmksCiAgICAgICAgICBwcm9jZWR1cmUuZmlsZU9mZnNldCwKICAgICAgICAgICdmb3J3YXJkaW5nU3R1YicsCiAgICAgICAgICBuZXcgSW5zdHJ1bWVudGF0aW9uVmFsdWVMaXRlcmFsKCdzZW1pLXN0dWInKSk7CiAgICB9CiAgICB2YXIgcG9zaXRpb25hbEFyZ3VtZW50cyA9IGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzCiAgICAgICAgLm1hcDxFeHByZXNzaW9uPigocGFyYW1ldGVyKSA9PiBuZXcgVmFyaWFibGVHZXQocGFyYW1ldGVyKSkKICAgICAgICAudG9MaXN0KCk7CiAgICB2YXIgbmFtZWRBcmd1bWVudHMgPSBmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMKICAgICAgICAubWFwKChwYXJhbWV0ZXIpID0+CiAgICAgICAgICAgIG5ldyBOYW1lZEV4cHJlc3Npb24ocGFyYW1ldGVyLm5hbWUsIG5ldyBWYXJpYWJsZUdldChwYXJhbWV0ZXIpKSkKICAgICAgICAudG9MaXN0KCk7CiAgICB2YXIgdHlwZUFyZ3VtZW50cyA9IGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzCiAgICAgICAgLm1hcDxEYXJ0VHlwZT4oKHR5cGVQYXJhbWV0ZXIpID0+IG5ldyBUeXBlUGFyYW1ldGVyVHlwZSh0eXBlUGFyYW1ldGVyKSkKICAgICAgICAudG9MaXN0KCk7CiAgICB2YXIgYXJndW1lbnRzID0gbmV3IEFyZ3VtZW50cyhwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICAgIHR5cGVzOiB0eXBlQXJndW1lbnRzLCBuYW1lZDogbmFtZWRBcmd1bWVudHMpOwogICAgRXhwcmVzc2lvbiBzdXBlckNhbGw7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLk1ldGhvZDoKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLk9wZXJhdG9yOgogICAgICAgIHN1cGVyQ2FsbCA9IG5ldyBTdXBlck1ldGhvZEludm9jYXRpb24obmFtZSwgYXJndW1lbnRzLCBzdXBlclRhcmdldCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5HZXR0ZXI6CiAgICAgICAgc3VwZXJDYWxsID0gbmV3IFN1cGVyUHJvcGVydHlHZXQoCiAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgIHN1cGVyVGFyZ2V0IGlzIFN5bnRoZXRpY0FjY2Vzc29yCiAgICAgICAgICAgICAgICA/IHN1cGVyVGFyZ2V0Ll9maWVsZAogICAgICAgICAgICAgICAgOiBzdXBlclRhcmdldCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5TZXR0ZXI6CiAgICAgICAgc3VwZXJDYWxsID0gbmV3IFN1cGVyUHJvcGVydHlTZXQoCiAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgIHBvc2l0aW9uYWxBcmd1bWVudHNbMF0sCiAgICAgICAgICAgIHN1cGVyVGFyZ2V0IGlzIFN5bnRoZXRpY0FjY2Vzc29yCiAgICAgICAgICAgICAgICA/IHN1cGVyVGFyZ2V0Ll9maWVsZAogICAgICAgICAgICAgICAgOiBzdXBlclRhcmdldCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdW5oYW5kbGVkKCcka2luZCcsICdfY3JlYXRlRm9yd2FyZGluZ0ltcGxJZk5lZWRlZCcsIC0xLCBudWxsKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIGZ1bmN0aW9uLmJvZHkgPSBuZXcgUmV0dXJuU3RhdGVtZW50KHN1cGVyQ2FsbCkuLnBhcmVudCA9IGZ1bmN0aW9uOwogICAgcHJvY2VkdXJlLnRyYW5zZm9ybWVyRmxhZ3MgfD0gVHJhbnNmb3JtZXJGbGFnLnN1cGVyQ2FsbHM7CiAgICBwcm9jZWR1cmUuZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldCA9IHN1cGVyVGFyZ2V0OwogIH0KCiAgLy8vIENyZWF0ZXMgYSBmb3J3YXJkaW5nIHN0dWIgYmFzZWQgb24gdGhlIGdpdmVuIFt0YXJnZXRdLgogIFByb2NlZHVyZSBfY3JlYXRlRm9yd2FyZGluZ1N0dWIoU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiwgUHJvY2VkdXJlIHRhcmdldCkgewogICAgVmFyaWFibGVEZWNsYXJhdGlvbiBjb3B5UGFyYW1ldGVyKFZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyKSB7CiAgICAgIHJldHVybiBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbihwYXJhbWV0ZXIubmFtZSwKICAgICAgICAgIHR5cGU6IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShwYXJhbWV0ZXIudHlwZSksCiAgICAgICAgICBpc0NvdmFyaWFudDogcGFyYW1ldGVyLmlzQ292YXJpYW50KQogICAgICAgIC4uaXNHZW5lcmljQ292YXJpYW50SW1wbCA9IHBhcmFtZXRlci5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsOwogICAgfQoKICAgIHZhciB0YXJnZXRUeXBlUGFyYW1ldGVycyA9IHRhcmdldC5mdW5jdGlvbi50eXBlUGFyYW1ldGVyczsKICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnM7CiAgICBpZiAodGFyZ2V0VHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICB0eXBlUGFyYW1ldGVycyA9CiAgICAgICAgICBuZXcgTGlzdDxUeXBlUGFyYW1ldGVyPi5maWxsZWQodGFyZ2V0VHlwZVBhcmFtZXRlcnMubGVuZ3RoLCBudWxsKTsKICAgICAgdmFyIGFkZGl0aW9uYWxTdWJzdGl0dXRpb24gPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFyZ2V0VHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgdGFyZ2V0VHlwZVBhcmFtZXRlciA9IHRhcmdldFR5cGVQYXJhbWV0ZXJzW2ldOwogICAgICAgIHZhciB0eXBlUGFyYW1ldGVyID0gbmV3IFR5cGVQYXJhbWV0ZXIodGFyZ2V0VHlwZVBhcmFtZXRlci5uYW1lLCBudWxsKQogICAgICAgICAgLi5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0gdGFyZ2V0VHlwZVBhcmFtZXRlci5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsOwogICAgICAgIHR5cGVQYXJhbWV0ZXJzW2ldID0gdHlwZVBhcmFtZXRlcjsKICAgICAgICBhZGRpdGlvbmFsU3Vic3RpdHV0aW9uW3RhcmdldFR5cGVQYXJhbWV0ZXJdID0KICAgICAgICAgICAgbmV3IFR5cGVQYXJhbWV0ZXJUeXBlKHR5cGVQYXJhbWV0ZXIpOwogICAgICB9CiAgICAgIHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5jb21iaW5lKAogICAgICAgICAgc3Vic3RpdHV0aW9uLCBTdWJzdGl0dXRpb24uZnJvbU1hcChhZGRpdGlvbmFsU3Vic3RpdHV0aW9uKSk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICB0eXBlUGFyYW1ldGVyc1tpXS5ib3VuZCA9CiAgICAgICAgICAgIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZSh0YXJnZXRUeXBlUGFyYW1ldGVyc1tpXS5ib3VuZCk7CiAgICAgIH0KICAgIH0KICAgIHZhciBwb3NpdGlvbmFsUGFyYW1ldGVycyA9CiAgICAgICAgdGFyZ2V0LmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLm1hcChjb3B5UGFyYW1ldGVyKS50b0xpc3QoKTsKICAgIHZhciBuYW1lZFBhcmFtZXRlcnMgPQogICAgICAgIHRhcmdldC5mdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMubWFwKGNvcHlQYXJhbWV0ZXIpLnRvTGlzdCgpOwogICAgdmFyIGZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uTm9kZShudWxsLAogICAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzOiBwb3NpdGlvbmFsUGFyYW1ldGVycywKICAgICAgICBuYW1lZFBhcmFtZXRlcnM6IG5hbWVkUGFyYW1ldGVycywKICAgICAgICB0eXBlUGFyYW1ldGVyczogdHlwZVBhcmFtZXRlcnMsCiAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogdGFyZ2V0LmZ1bmN0aW9uLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgcmV0dXJuVHlwZTogc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKHRhcmdldC5mdW5jdGlvbi5yZXR1cm5UeXBlKSk7CiAgICBNZW1iZXIgZmluYWxUYXJnZXQ7CiAgICBpZiAodGFyZ2V0IGlzIFByb2NlZHVyZSAmJiB0YXJnZXQuaXNGb3J3YXJkaW5nU3R1YikgewogICAgICBmaW5hbFRhcmdldCA9IHRhcmdldC5mb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldDsKICAgIH0gZWxzZSBpZiAodGFyZ2V0IGlzIFN5bnRoZXRpY0FjY2Vzc29yKSB7CiAgICAgIGZpbmFsVGFyZ2V0ID0gdGFyZ2V0Ll9maWVsZDsKICAgIH0gZWxzZSB7CiAgICAgIGZpbmFsVGFyZ2V0ID0gdGFyZ2V0OwogICAgfQogICAgcmV0dXJuIG5ldyBQcm9jZWR1cmUobmFtZSwga2luZCwgZnVuY3Rpb24sCiAgICAgICAgaXNBYnN0cmFjdDogdHJ1ZSwKICAgICAgICBpc0ZvcndhcmRpbmdTdHViOiB0cnVlLAogICAgICAgIGZpbGVVcmk6IGVuY2xvc2luZ0NsYXNzLmZpbGVVcmksCiAgICAgICAgZm9yd2FyZGluZ1N0dWJJbnRlcmZhY2VUYXJnZXQ6IGZpbmFsVGFyZ2V0KQogICAgICAuLnN0YXJ0RmlsZU9mZnNldCA9IGVuY2xvc2luZ0NsYXNzLmZpbGVPZmZzZXQKICAgICAgLi5maWxlT2Zmc2V0ID0gZW5jbG9zaW5nQ2xhc3MuZmlsZU9mZnNldAogICAgICAuLnBhcmVudCA9IGVuY2xvc2luZ0NsYXNzOwogIH0KCiAgLy8vIENyZWF0ZXMgYSBmb3J3YXJkaW5nIHN0dWIgZm9yIHRoaXMgbm9kZSBpZiBuZWNlc3NhcnksIGFuZCBwcm9wYWdhdGVzCiAgLy8vIGNvdmFyaWFuY2UgaW5mb3JtYXRpb24uCiAgUHJvY2VkdXJlIF9maW5hbGl6ZSgpIHsKICAgIHJldHVybiBfY29tcHV0ZUNvdmFyaWFuY2VGaXhlcyhyZXNvbHZlKCkpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIFtpXXRoIGVsZW1lbnQgb2YgW19jYW5kaWRhdGVzXSwgZmluYWxpemluZyBpdCBpZiBuZWNlc3NhcnkuCiAgUHJvY2VkdXJlIF9maW5hbGl6ZWRDYW5kaWRhdGUoaW50IGkpIHsKICAgIFByb2NlZHVyZSBjYW5kaWRhdGUgPSBfY2FuZGlkYXRlc1tpXTsKICAgIHJldHVybiBjYW5kaWRhdGUgaXMgRm9yd2FyZGluZ05vZGUgJiYKICAgICAgICAgICAgX2ludGVyZmFjZVJlc29sdmVyLmlzVHlwZUluZmVyZW5jZVByZXBhcmVkCiAgICAgICAgPyBjYW5kaWRhdGUuZmluYWxpemUoKQogICAgICAgIDogY2FuZGlkYXRlOwogIH0KCiAgLy8vIERldGVybWluZXMgd2hpY2ggaW5oZXJpdGVkIG1lbWJlciB0aGlzIG5vZGUgcmVzb2x2ZXMgdG8sIGFuZCBhbHNvIHBlcmZvcm1zCiAgLy8vIHR5cGUgaW5mZXJlbmNlLgogIFByb2NlZHVyZSBfcmVzb2x2ZSgpIHsKICAgIFByb2NlZHVyZSBpbmhlcml0ZWRNZW1iZXIgPSBfY2FuZGlkYXRlc1tfc3RhcnRdOwogICAgYm9vbCBpc0RlY2xhcmVkSW5UaGlzQ2xhc3MgPQogICAgICAgIGlkZW50aWNhbChpbmhlcml0ZWRNZW1iZXIuZW5jbG9zaW5nQ2xhc3MsIGVuY2xvc2luZ0NsYXNzKTsKICAgIGlmIChpc0RlY2xhcmVkSW5UaGlzQ2xhc3MpIHsKICAgICAgaWYgKF9pbmZlcmVuY2VOb2RlICE9IG51bGwpIHsKICAgICAgICBfaW5mZXJlbmNlTm9kZS5yZXNvbHZlKCk7CiAgICAgICAgX2luZmVyZW5jZU5vZGUgPSBudWxsOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgaW5oZXJpdGFuY2UgY2FuZGlkYXRlcywgdGhlIGluaGVyaXRlZCBtZW1iZXIgaXMKICAgICAgLy8gdGhlIG1lbWJlciB3aG9zZSB0eXBlIGlzIGEgc3VidHlwZSBvZiBhbGwgdGhlIG90aGVycy4gIFdlIGNhbiBmaW5kIGl0CiAgICAgIC8vIGJ5IHR3byBwYXNzZXMgb3ZlciB0aGUgbGlzdCBvZiBtZW1iZXJzLiAgRm9yIHRoZSBmaXJzdCBwYXNzLCB3ZSBzdGVwCiAgICAgIC8vIHRocm91Z2ggdGhlIGNhbmRpZGF0ZXMsIHVwZGF0aW5nIGluaGVyaXRlZE1lbWJlciBlYWNoIHRpbWUgd2UgZmluZCBhCiAgICAgIC8vIG1lbWJlciB3aG9zZSB0eXBlIGlzIGEgc3VidHlwZSBvZiB0aGUgcHJldmlvdXMgaW5oZXJpdGVkTWVtYmVyLiAgQXMgd2UKICAgICAgLy8gZG8gdGhpcywgd2UgYWxzbyB3b3JrIG91dCB0aGUgbmVjZXNzYXJ5IHN1YnN0aXR1dGlvbiBmb3IgbWF0Y2hpbmcgdXAKICAgICAgLy8gdHlwZSBwYXJhbWV0ZXJzIGJldHdlZW4gdGhpcyBjbGFzcyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgc3VwZXJjbGFzcy4KICAgICAgLy8KICAgICAgLy8gU2luY2UgdGhlIHN1YnR5cGluZyByZWxhdGlvbiBpcyByZWZsZXhpdmUsIHdlIHdpbGwgZmF2b3IgdGhlIG1vc3QKICAgICAgLy8gcmVjZW50bHkgdmlzaXRlZCBjYW5kaWRhdGUgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHR5cGVzIGFyZSB0aGUgc2FtZS4KICAgICAgLy8gV2Ugd2FudCB0byBmYXZvciBlYXJsaWVyIGNhbmRpZGF0ZXMsIHNvIHdlIHZpc2l0IHRoZSBjYW5kaWRhdGUgbGlzdAogICAgICAvLyBiYWNrd2FyZHMuCiAgICAgIGluaGVyaXRlZE1lbWJlciA9IF9yZXNvbHZlZENhbmRpZGF0ZShfZW5kIC0gMSk7CiAgICAgIHZhciBpbmhlcml0ZWRNZW1iZXJTdWJzdGl0dXRpb24gPQogICAgICAgICAgX2ludGVyZmFjZVJlc29sdmVyLl9zdWJzdGl0dXRpb25Gb3IoaW5oZXJpdGVkTWVtYmVyLCBlbmNsb3NpbmdDbGFzcyk7CiAgICAgIHZhciBpbmhlcml0ZWRNZW1iZXJUeXBlID0gaW5oZXJpdGVkTWVtYmVyIGlzIEZvcndhcmRpbmdOb2RlCiAgICAgICAgICA/IGNvbnN0IER5bmFtaWNUeXBlKCkKICAgICAgICAgIDogaW5oZXJpdGVkTWVtYmVyU3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKAogICAgICAgICAgICAgIGtpbmQgPT0gUHJvY2VkdXJlS2luZC5TZXR0ZXIKICAgICAgICAgICAgICAgICAgPyBpbmhlcml0ZWRNZW1iZXIuc2V0dGVyVHlwZQogICAgICAgICAgICAgICAgICA6IGluaGVyaXRlZE1lbWJlci5nZXR0ZXJUeXBlKTsKICAgICAgZm9yIChpbnQgaSA9IF9lbmQgLSAyOyBpID49IF9zdGFydDsgaS0tKSB7CiAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IF9yZXNvbHZlZENhbmRpZGF0ZShpKTsKICAgICAgICB2YXIgc3Vic3RpdHV0aW9uID0KICAgICAgICAgICAgX2ludGVyZmFjZVJlc29sdmVyLl9zdWJzdGl0dXRpb25Gb3IoY2FuZGlkYXRlLCBlbmNsb3NpbmdDbGFzcyk7CiAgICAgICAgYm9vbCBpc0JldHRlcjsKICAgICAgICBEYXJ0VHlwZSB0eXBlOwogICAgICAgIGlmIChraW5kID09IFByb2NlZHVyZUtpbmQuU2V0dGVyKSB7CiAgICAgICAgICB0eXBlID0gY2FuZGlkYXRlIGlzIEZvcndhcmRpbmdOb2RlCiAgICAgICAgICAgICAgPyBjb25zdCBEeW5hbWljVHlwZSgpCiAgICAgICAgICAgICAgOiBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoY2FuZGlkYXRlLnNldHRlclR5cGUpOwogICAgICAgICAgLy8gU2V0dGVycyBhcmUgY29udHJhdmFyaWFudCBpbiB0aGVpciBzZXR0ZXIgdHlwZSwgc28gd2UgaGF2ZSB0bwogICAgICAgICAgLy8gcmV2ZXJzZSB0aGUgY2hlY2suCiAgICAgICAgICBpc0JldHRlciA9IF9pbnRlcmZhY2VSZXNvbHZlci5fdHlwZUVudmlyb25tZW50CiAgICAgICAgICAgICAgLmlzU3VidHlwZU9mKGluaGVyaXRlZE1lbWJlclR5cGUsIHR5cGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0eXBlID0gY2FuZGlkYXRlIGlzIEZvcndhcmRpbmdOb2RlCiAgICAgICAgICAgICAgPyBjb25zdCBEeW5hbWljVHlwZSgpCiAgICAgICAgICAgICAgOiBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoY2FuZGlkYXRlLmdldHRlclR5cGUpOwogICAgICAgICAgaXNCZXR0ZXIgPSBfaW50ZXJmYWNlUmVzb2x2ZXIuX3R5cGVFbnZpcm9ubWVudAogICAgICAgICAgICAgIC5pc1N1YnR5cGVPZih0eXBlLCBpbmhlcml0ZWRNZW1iZXJUeXBlKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzQmV0dGVyKSB7CiAgICAgICAgICBpbmhlcml0ZWRNZW1iZXIgPSBjYW5kaWRhdGU7CiAgICAgICAgICBpbmhlcml0ZWRNZW1iZXJTdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb247CiAgICAgICAgICBpbmhlcml0ZWRNZW1iZXJUeXBlID0gdHlwZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gRm9yIHRoZSBzZWNvbmQgcGFzcywgd2UgdmVyaWZ5IHRoYXQgaW5oZXJpdGVkTWVtYmVyIGlzIGEgc3VidHlwZSBvZiBhbGwKICAgICAgLy8gdGhlIG90aGVyIHBvdGVudGlhbGx5IGluaGVyaXRlZCBtZW1iZXJzLgogICAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IGltcGxlbWVudCB0aGlzLgogICAgfQogICAgcmV0dXJuIGluaGVyaXRlZE1lbWJlcjsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBbaV10aCBlbGVtZW50IG9mIFtfY2FuZGlkYXRlc10sIHJlc29sdmluZyBpdCBpZiBuZWNlc3NhcnkuCiAgUHJvY2VkdXJlIF9yZXNvbHZlZENhbmRpZGF0ZShpbnQgaSkgewogICAgUHJvY2VkdXJlIGNhbmRpZGF0ZSA9IF9jYW5kaWRhdGVzW2ldOwogICAgcmV0dXJuIGNhbmRpZGF0ZSBpcyBGb3J3YXJkaW5nTm9kZSAmJgogICAgICAgICAgICBfaW50ZXJmYWNlUmVzb2x2ZXIuaXNUeXBlSW5mZXJlbmNlUHJlcGFyZWQKICAgICAgICA/IGNhbmRpZGF0ZS5yZXNvbHZlKCkKICAgICAgICA6IGNhbmRpZGF0ZTsKICB9CgogIHN0YXRpYyB2b2lkIGNyZWF0ZUZvcndhcmRpbmdJbXBsSWZOZWVkZWRGb3JUZXN0aW5nKAogICAgICBGb3J3YXJkaW5nTm9kZSBub2RlLCBGdW5jdGlvbk5vZGUgZnVuY3Rpb24pIHsKICAgIG5vZGUuX2NyZWF0ZUZvcndhcmRpbmdJbXBsSWZOZWVkZWQoZnVuY3Rpb24pOwogIH0KCiAgLy8vIFB1YmxpYyBtZXRob2QgYWxsb3dpbmcgdGVzdHMgdG8gYWNjZXNzIFtfY3JlYXRlRm9yd2FyZGluZ1N0dWJdLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBpcyBzdGF0aWMgc28gdGhhdCBpdCBjYW4gYmUgZWFzaWx5IGVsaW1pbmF0ZWQgYnkgdHJlZSBzaGFraW5nCiAgLy8vIHdoZW4gbm90IG5lZWRlZC4KICBzdGF0aWMgUHJvY2VkdXJlIGNyZWF0ZUZvcndhcmRpbmdTdHViRm9yVGVzdGluZygKICAgICAgRm9yd2FyZGluZ05vZGUgbm9kZSwgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiwgUHJvY2VkdXJlIHRhcmdldCkgewogICAgcmV0dXJuIG5vZGUuX2NyZWF0ZUZvcndhcmRpbmdTdHViKHN1YnN0aXR1dGlvbiwgdGFyZ2V0KTsKICB9CgogIC8vLyBGb3IgdGVzdGluZzogZ2V0IHRoZSBsaXN0IG9mIGNhbmRpZGF0ZXMgcmVsZXZhbnQgdG8gYSBnaXZlbiBub2RlLgogIHN0YXRpYyBMaXN0PFByb2NlZHVyZT4gZ2V0Q2FuZGlkYXRlcyhGb3J3YXJkaW5nTm9kZSBub2RlKSB7CiAgICByZXR1cm4gbm9kZS5fY2FuZGlkYXRlcy5zdWJsaXN0KG5vZGUuX3N0YXJ0LCBub2RlLl9lbmQpOwogIH0KCiAgc3RhdGljIE1lbWJlciBfZ2V0Rm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldChQcm9jZWR1cmUgZm9yd2FyZGluZ1N0dWIpIHsKICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogd2hlbiBkYXJ0YnVnLmNvbS8zMTU2MiBpcyBmaXhlZCwgdGhpcyBzaG91bGQgYmVjb21lCiAgICAvLyBlYXNpZXIuCiAgICBSZXR1cm5TdGF0ZW1lbnQgYm9keSA9IGZvcndhcmRpbmdTdHViLmZ1bmN0aW9uLmJvZHk7CiAgICB2YXIgZXhwcmVzc2lvbiA9IGJvZHkuZXhwcmVzc2lvbjsKICAgIGlmIChleHByZXNzaW9uIGlzIFN1cGVyTWV0aG9kSW52b2NhdGlvbikgewogICAgICByZXR1cm4gZXhwcmVzc2lvbi5pbnRlcmZhY2VUYXJnZXQ7CiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24gaXMgU3VwZXJQcm9wZXJ0eVNldCkgewogICAgICByZXR1cm4gZXhwcmVzc2lvbi5pbnRlcmZhY2VUYXJnZXQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdW5oYW5kbGVkKCcke2V4cHJlc3Npb24ucnVudGltZVR5cGV9JywKICAgICAgICAgICdfZ2V0Rm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldCcsIC0xLCBudWxsKTsKICAgIH0KICB9Cn0KCi8vLyBBbiBbSW50ZXJmYWNlUmVzb2x2ZXJdIGtlZXBzIHRyYWNrIG9mIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gcmVzb2x2ZQovLy8gbWV0aG9kIGNhbGxzLCBnZXRzLCBhbmQgc2V0cyB3aXRoaW4gYSBjaHVuayBvZiBjb2RlIGJlaW5nIGNvbXBpbGVkLCB0bwovLy8gaW5mZXIgY292YXJpYW5jZSBhbm5vdGF0aW9ucywgYW5kIHRvIGNyZWF0ZSBmb3J3YXJ3ZGluZyBzdHVicyB3aGVuIG5lY2Vzc2FyeQovLy8gdG8gbWVldCBjb3ZhcmlhbmNlIHJlcXVpcmVtZW50cy4KY2xhc3MgSW50ZXJmYWNlUmVzb2x2ZXIgewogIGZpbmFsIFR5cGVJbmZlcmVuY2VFbmdpbmUgX3R5cGVJbmZlcmVuY2VFbmdpbmU7CgogIGZpbmFsIEhpZXJhcmNoeUJhc2VkVHlwZUVudmlyb25tZW50IF90eXBlRW52aXJvbm1lbnQ7CgogIGZpbmFsIEluc3RydW1lbnRhdGlvbiBfaW5zdHJ1bWVudGF0aW9uOwoKICBJbnRlcmZhY2VSZXNvbHZlcigKICAgICAgdGhpcy5fdHlwZUluZmVyZW5jZUVuZ2luZSwgdGhpcy5fdHlwZUVudmlyb25tZW50LCB0aGlzLl9pbnN0cnVtZW50YXRpb24pOwoKICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlICJwcmVwYXJlIiBwaGFzZSBvZiB0eXBlIGluZmVyZW5jZSBpcyBjb21wbGV0ZS4KICBib29sIGdldCBpc1R5cGVJbmZlcmVuY2VQcmVwYXJlZCA9PgogICAgICBfdHlwZUluZmVyZW5jZUVuZ2luZS5pc1R5cGVJbmZlcmVuY2VQcmVwYXJlZDsKCiAgLy8vIFJlcG9ydCBhbiBlcnJvciBpZiBhbGwgdHlwZXMgaW4gW3R5cGVzXSBhcmUgbm90IGVxdWFsIHVzaW5nIGA9PWAuCiAgLy8vCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGFuZCB0aGV5IGFyZSBhbGwgZXF1YWwsCiAgLy8vIG90aGVyd2lzZSB0aGUgdHlwZSBgZHluYW1pY2AuICBbbGlicmFyeV0sIFtuYW1lXSwgW2ZpbGVVcmldLCBhbmQKICAvLy8gW2NoYXJPZmZzZXRdIGFyZSB1c2VkIHRvIHJlcG9ydCB0aGUgZXJyb3IuCiAgRGFydFR5cGUgbWF0Y2hUeXBlcyhJdGVyYWJsZTxEYXJ0VHlwZT4gdHlwZXMsIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksCiAgICAgIFN0cmluZyBuYW1lLCBVcmkgZmlsZVVyaSwgaW50IGNoYXJPZmZzZXQpIHsKICAgIERhcnRUeXBlIGZpcnN0OwogICAgZm9yICh2YXIgdHlwZSBpbiB0eXBlcykgewogICAgICBpZiAoZmlyc3QgPT0gbnVsbCkgewogICAgICAgIGZpcnN0ID0gdHlwZTsKICAgICAgfSBlbHNlIGlmIChmaXJzdCAhPSB0eXBlKSB7CiAgICAgICAgLy8gVHlwZXMgZG9uJ3QgbWF0Y2guICBSZXBvcnQgYW4gZXJyb3IuCiAgICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgICB0ZW1wbGF0ZUNhbnRJbmZlclR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlcy53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgICAgZmlsZVVyaSk7CiAgICAgICAgcmV0dXJuIGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgIH0KICAgIH0KICAgIC8vIElmIHRoZXJlIGFyZSBubyBvdmVycmlkZGVuIHR5cGVzLCBpbmZlciBgZHluYW1pY2AuCiAgICByZXR1cm4gZmlyc3QgPz8gY29uc3QgRHluYW1pY1R5cGUoKTsKICB9CgogIC8vLyBDb21wdXRlcyB0aGUgdHlwZXMgb2YgdGhlIG1ldGhvZHMgb3ZlcnJpZGRlbiBieSBbbWV0aG9kXSBpbiBbY2xhc3NfXS4KICAvLy8KICAvLy8gVGhlIHR5cGVzIGhhdmUgdGhlIHR5cGUgcGFyYW1ldGVycyBvZiBbY2xhc3NfXSBzdWJzdGl0dXRlZCBhcHByb3ByaWF0ZWx5LgogIC8vLwogIC8vLyBbY2FuZGlkYXRlc10gaGFzIHRoZSBsaXN0IG9mIGluaGVyaXRlZCBpbnRlcmZhY2UgbWV0aG9kcyB3aXRoIHRoZSBzYW1lCiAgLy8vIG5hbWUgYXMgW21ldGhvZF0gYXMgYSBzdWJsaXN0IGZyb20gW3N0YXJ0XSBpbmNsdXNpdmUgdG8gW2VuZF0gZXhjbHVzaXZlLgogIExpc3Q8RnVuY3Rpb25UeXBlPiBfY29tcHV0ZU1ldGhvZE92ZXJyaWRkZW5UeXBlcyhDbGFzcyBjbGFzc18sCiAgICAgIFByb2NlZHVyZSBtZXRob2QsIExpc3Q8TWVtYmVyPiBjYW5kaWRhdGVzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIHZhciBvdmVycmlkZGVuVHlwZXMgPSA8RnVuY3Rpb25UeXBlPltdOwogICAgdmFyIGRlY2xhcmVkVHlwZVBhcmFtZXRlcnMgPSBtZXRob2QuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnM7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkgewogICAgICB2YXIgY2FuZGlkYXRlID0gY2FuZGlkYXRlc1tpXTsKICAgICAgaWYgKGNhbmRpZGF0ZSBpcyBTeW50aGV0aWNBY2Nlc3NvcikgewogICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGVyZSBhcmUgZXJyb3JzLiAgSnVzdCBza2lwIHRoaXMgb3ZlcnJpZGUuCiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdmFyIGNhbmRpZGF0ZUZ1bmN0aW9uID0gY2FuZGlkYXRlLmZ1bmN0aW9uOwogICAgICBpZiAoY2FuZGlkYXRlRnVuY3Rpb24gPT0gbnVsbCkgewogICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGVyZSBhcmUgZXJyb3JzLiAgSnVzdCBza2lwIHRoaXMgb3ZlcnJpZGUuCiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdmFyIHN1YnN0aXR1dGlvbiA9IF9zdWJzdGl0dXRpb25Gb3IoY2FuZGlkYXRlLCBjbGFzc18pOwogICAgICBGdW5jdGlvblR5cGUgb3ZlcnJpZGRlblR5cGUgPQogICAgICAgICAgc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGNhbmRpZGF0ZUZ1bmN0aW9uLmZ1bmN0aW9uVHlwZSk7CiAgICAgIHZhciBvdmVycmlkZGVuVHlwZVBhcmFtZXRlcnMgPSBvdmVycmlkZGVuVHlwZS50eXBlUGFyYW1ldGVyczsKICAgICAgaWYgKG92ZXJyaWRkZW5UeXBlUGFyYW1ldGVycy5sZW5ndGggIT0gZGVjbGFyZWRUeXBlUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgICAvLyBHZW5lcmljIGFyaXR5IG1pc21hdGNoLiAgRG9uJ3QgZG8gYW55IGluZmVyZW5jZSBmb3IgdGhpcyBtZXRob2QuCiAgICAgICAgLy8gVE9ETyhwYXVsYmVycnkpOiByZXBvcnQgYW4gZXJyb3IuCiAgICAgICAgb3ZlcnJpZGRlblR5cGVzLmNsZWFyKCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0gZWxzZSBpZiAob3ZlcnJpZGRlblR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgICB2YXIgc3Vic3RpdHV0aW9uTWFwID0gPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVjbGFyZWRUeXBlUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICAgICAgc3Vic3RpdHV0aW9uTWFwW292ZXJyaWRkZW5UeXBlUGFyYW1ldGVyc1tpXV0gPQogICAgICAgICAgICAgIG5ldyBUeXBlUGFyYW1ldGVyVHlwZShkZWNsYXJlZFR5cGVQYXJhbWV0ZXJzW2ldKTsKICAgICAgICB9CiAgICAgICAgb3ZlcnJpZGRlblR5cGUgPSBzdWJzdGl0dXRlVHlwZVBhcmFtcygKICAgICAgICAgICAgb3ZlcnJpZGRlblR5cGUsIHN1YnN0aXR1dGlvbk1hcCwgZGVjbGFyZWRUeXBlUGFyYW1ldGVycyk7CiAgICAgIH0KICAgICAgb3ZlcnJpZGRlblR5cGVzLmFkZChvdmVycmlkZGVuVHlwZSk7CiAgICB9CiAgICByZXR1cm4gb3ZlcnJpZGRlblR5cGVzOwogIH0KCiAgdm9pZCBpbmZlck1ldGhvZFR5cGUoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgQ2xhc3MgY2xhc3NfLCBQcm9jZWR1cmUgbWV0aG9kLAogICAgICBMaXN0PE1lbWJlcj4gY2FuZGlkYXRlcywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICB2YXIgb3ZlcnJpZGRlblR5cGVzID0KICAgICAgICBfY29tcHV0ZU1ldGhvZE92ZXJyaWRkZW5UeXBlcyhjbGFzc18sIG1ldGhvZCwgY2FuZGlkYXRlcywgc3RhcnQsIGVuZCk7CiAgICBpZiAoU2hhZG93UHJvY2VkdXJlLmhhc0ltcGxpY2l0UmV0dXJuVHlwZShtZXRob2QpICYmCiAgICAgICAgbWV0aG9kLm5hbWUgIT0gaW5kZXhTZXROYW1lKSB7CiAgICAgIG1ldGhvZC5mdW5jdGlvbi5yZXR1cm5UeXBlID0gbWF0Y2hUeXBlcygKICAgICAgICAgIG92ZXJyaWRkZW5UeXBlcy5tYXAoKHR5cGUpID0+IHR5cGUucmV0dXJuVHlwZSksCiAgICAgICAgICBsaWJyYXJ5LAogICAgICAgICAgbWV0aG9kLm5hbWUubmFtZSwKICAgICAgICAgIGNsYXNzXy5maWxlVXJpLAogICAgICAgICAgbWV0aG9kLmZpbGVPZmZzZXQpOwogICAgfQogICAgdmFyIHBvc2l0aW9uYWxQYXJhbWV0ZXJzID0gbWV0aG9kLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICBpZiAoVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50LmlzSW1wbGljaXRseVR5cGVkKAogICAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnNbaV0pKSB7CiAgICAgICAgLy8gTm90ZSB0aGF0IGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IHByZXNlbnQgaW4gdGhlIG92ZXJyaWRkZW4gbWV0aG9kLAogICAgICAgIC8vIGdldFBvc2l0aW9uYWxQYXJhbWV0ZXJUeXBlIHRyZWF0cyBpdCBhcyBkeW5hbWljLiAgVGhpcyBpcyBjb25zaXN0ZW50CiAgICAgICAgLy8gd2l0aCB0aGUgYmVoYXZpb3IgY2FsbGVkIGZvciBpbiB0aGUgaW5mb3JtYWwgdG9wIGxldmVsIHR5cGUgaW5mZXJlbmNlCiAgICAgICAgLy8gc3BlYywgd2hpY2ggc2F5czoKICAgICAgICAvLwogICAgICAgIC8vICAgICBJZiB0aGVyZSBpcyBubyBjb3JyZXNwb25kaW5nIHBhcmFtZXRlciBwb3NpdGlvbiBpbiB0aGUgb3ZlcnJpZGRlbgogICAgICAgIC8vICAgICBtZXRob2QgdG8gaW5mZXIgZnJvbSBhbmQgdGhlIHNpZ25hdHVyZXMgYXJlIGNvbXBhdGlibGUsIGl0IGlzCiAgICAgICAgLy8gICAgIHRyZWF0ZWQgYXMgZHluYW1pYyAoZS5nLiBvdmVycmlkaW5nIGEgb25lIHBhcmFtZXRlciBtZXRob2Qgd2l0aCBhCiAgICAgICAgLy8gICAgIG1ldGhvZCB0aGF0IHRha2VzIGEgc2Vjb25kIG9wdGlvbmFsIHBhcmFtZXRlcikuICBOb3RlOiBpZiB0aGVyZQogICAgICAgIC8vICAgICBpcyBubyBjb3JyZXNwb25kaW5nIHBhcmFtZXRlciBwb3NpdGlvbiBpbiB0aGUgb3ZlcnJpZGRlbiBtZXRob2QgdG8KICAgICAgICAvLyAgICAgaW5mZXIgZnJvbSBhbmQgdGhlIHNpZ25hdHVyZXMgYXJlIGluY29tcGF0aWJsZSAoZS5nLiBvdmVycmlkaW5nIGEKICAgICAgICAvLyAgICAgb25lIHBhcmFtZXRlciBtZXRob2Qgd2l0aCBhIG1ldGhvZCB0aGF0IHRha2VzIGEgc2Vjb25kCiAgICAgICAgLy8gICAgIG5vbi1vcHRpb25hbCBwYXJhbWV0ZXIpLCB0aGUgaW5mZXJlbmNlIHJlc3VsdCBpcyBub3QgZGVmaW5lZCBhbmQKICAgICAgICAvLyAgICAgdG9vbHMgYXJlIGZyZWUgdG8gZWl0aGVyIGVtaXQgYW4gZXJyb3IsIG9yIHRvIGRlZmVyIHRoZSBlcnJvciB0bwogICAgICAgIC8vICAgICBvdmVycmlkZSBjaGVja2luZy4KICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyc1tpXS50eXBlID0gbWF0Y2hUeXBlcygKICAgICAgICAgICAgb3ZlcnJpZGRlblR5cGVzLm1hcCgodHlwZSkgPT4gZ2V0UG9zaXRpb25hbFBhcmFtZXRlclR5cGUodHlwZSwgaSkpLAogICAgICAgICAgICBsaWJyYXJ5LAogICAgICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyc1tpXS5uYW1lLAogICAgICAgICAgICBjbGFzc18uZmlsZVVyaSwKICAgICAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnNbaV0uZmlsZU9mZnNldCk7CiAgICAgIH0KICAgIH0KICAgIHZhciBuYW1lZFBhcmFtZXRlcnMgPSBtZXRob2QuZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lZFBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudC5pc0ltcGxpY2l0bHlUeXBlZChuYW1lZFBhcmFtZXRlcnNbaV0pKSB7CiAgICAgICAgdmFyIG5hbWUgPSBuYW1lZFBhcmFtZXRlcnNbaV0ubmFtZTsKICAgICAgICBuYW1lZFBhcmFtZXRlcnNbaV0udHlwZSA9IG1hdGNoVHlwZXMoCiAgICAgICAgICAgIG92ZXJyaWRkZW5UeXBlcy5tYXAoKHR5cGUpID0+IGdldE5hbWVkUGFyYW1ldGVyVHlwZSh0eXBlLCBuYW1lKSksCiAgICAgICAgICAgIGxpYnJhcnksCiAgICAgICAgICAgIG5hbWVkUGFyYW1ldGVyc1tpXS5uYW1lLAogICAgICAgICAgICBjbGFzc18uZmlsZVVyaSwKICAgICAgICAgICAgbmFtZWRQYXJhbWV0ZXJzW2ldLmZpbGVPZmZzZXQpOwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gUG9wdWxhdGVzIFtnZXR0ZXJzXSBhbmQgW3NldHRlcnNdIHdpdGggdGhlIG1lbWJlcnMgb2YgdGhlIGdpdmVuIFtjbGFzc19dJ3MKICAvLy8gaW50ZXJmYWNlLgogIC8vLwogIC8vLyBbZ2V0dGVyc10gd2lsbCBjb250YWluIG1ldGhvZHMgYW5kIGdldHRlcnMsIFtzZXR0ZXJzXSB3aWxsIGNvbnRhaW4KICAvLy8gc2V0dGVycy4gIFNvbWUgbWVtYmVycyBjYW5ub3QgYmUgcmVzb2x2ZWQgaW1tZWRpYXRlbHkuICBGb3IgaW5zdGFuY2UsCiAgLy8vIHRvcC1sZXZlbCB0eXBlIGluZmVyZW5jZSBoYXMgbm90IHlldCBpbmZlcnJlZCBmaWVsZCB0eXBlcyBiYXNlZCBvbgogIC8vLyBpbml0aWFsaXplcnMgYW5kIHNvIHdlIGNhbm5vdCB5ZXQgZG8gb3ZlcnJpZGUgYmFzZWQgcmVzb2x1dGlvbiBvZiBnZXR0ZXJzCiAgLy8vIGFuZCBzZXR0ZXJzLiAgTWVtYmVycyBvZiB0aGUgY2xhc3MncyBpbnRlcmZhY2UgdGhhdCBuZWVkIHRvIGJlIHJlc29sdmVkCiAgLy8vIGxhdGVyIGFyZSByZXByZXNlbnRlZCBieSBhIFtGb3J3YXJkaW5nTm9kZV0gb2JqZWN0LgogIHZvaWQgY3JlYXRlQXBpTWVtYmVycyhDbGFzcyBjbGFzc18sIExpc3Q8TWVtYmVyPiBnZXR0ZXJzLAogICAgICBMaXN0PE1lbWJlcj4gc2V0dGVycywgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgdmFyIGNhbmRpZGF0ZXMgPSBDbGFzc0hpZXJhcmNoeS5tZXJnZVNvcnRlZExpc3RzKAogICAgICAgIGdldENhbmRpZGF0ZXMoY2xhc3NfLCBmYWxzZSksIGdldENhbmRpZGF0ZXMoY2xhc3NfLCB0cnVlKSk7CiAgICAvLyBOb3cgY3JlYXRlIGdldHRlciBhbmQgcGVyaGFwcyBzZXR0ZXIgZm9yd2FyZGluZyBub2RlcyBmb3IgZWFjaCB1bmlxdWUKICAgIC8vIG5hbWUuCiAgICBnZXR0ZXJzLmxlbmd0aCA9IGNhbmRpZGF0ZXMubGVuZ3RoOwogICAgc2V0dGVycy5sZW5ndGggPSBjYW5kaWRhdGVzLmxlbmd0aDsKICAgIGludCBnZXR0ZXJJbmRleCA9IDA7CiAgICBpbnQgc2V0dGVySW5kZXggPSAwOwogICAgLy8gVG8gZGV0ZWN0IGNvbmZsaWN0cyBiZXR3ZWVuIGluc3RhbmNlIG1lbWJlcnMgKHBvc3NpYmx5IGluaGVyaXRlZCBvbmVzKQogICAgLy8gYW5kIHN0YXRpYyBtZW1iZXJzLCB1c2UgYSBtYXAgZnJvbSBuYW1lcyB0byBsaXN0cyBvZiBtZW1iZXJzLiAgVGhlcmUgY2FuCiAgICAvLyBiZSBtb3JlIHRoYW4gb25lIHN0YXRpYyBtZW1iZXIgd2l0aCBhIGdpdmVuIG5hbWUsIGUuZy4sIGlmIHRoZXJlIGlzIGEKICAgIC8vIGdldHRlciBhbmQgYSBzZXR0ZXIuICBXZSB3aWxsIHJlcG9ydCBib3RoIGNvbmZsaWN0cy4KICAgIGZvckVhY2hBcGlNZW1iZXIoY2FuZGlkYXRlcywgKGludCBzdGFydCwgaW50IGVuZCwgTmFtZSBuYW1lKSB7CiAgICAgIFByb2NlZHVyZSBtZW1iZXIgPSBjYW5kaWRhdGVzW3N0YXJ0XTsKICAgICAgUHJvY2VkdXJlS2luZCBraW5kID0gX2tpbmRPZihtZW1iZXIpOwogICAgICBpZiAoa2luZCAhPSBQcm9jZWR1cmVLaW5kLkdldHRlciAmJiBraW5kICE9IFByb2NlZHVyZUtpbmQuU2V0dGVyKSB7CiAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0ICsgMTsgaSA8IGVuZDsgKytpKSB7CiAgICAgICAgICBpZiAoX2tpbmRPZihjYW5kaWRhdGVzW2ldKSAhPSBraW5kKSByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChtZW1iZXIuZW5jbG9zaW5nQ2xhc3MgPT0gY2xhc3NfICYmIF9yZXF1aXJlc1R5cGVJbmZlcmVuY2UobWVtYmVyKSkgewogICAgICAgICAgaW5mZXJNZXRob2RUeXBlKGxpYnJhcnksIGNsYXNzXywgbWVtYmVyLCBjYW5kaWRhdGVzLCBzdGFydCArIDEsIGVuZCk7CiAgICAgICAgfQogICAgICAgIHZhciBmb3J3YXJkaW5nTm9kZSA9IG5ldyBGb3J3YXJkaW5nTm9kZSgKICAgICAgICAgICAgdGhpcywgbnVsbCwgY2xhc3NfLCBuYW1lLCBraW5kLCBjYW5kaWRhdGVzLCBzdGFydCwgZW5kKTsKICAgICAgICBnZXR0ZXJzW2dldHRlckluZGV4KytdID0gZm9yd2FyZGluZ05vZGUuZmluYWxpemUoKTsKICAgICAgICBpZiAobGlicmFyeSBpcyBLZXJuZWxMaWJyYXJ5QnVpbGRlciAmJgogICAgICAgICAgICBmb3J3YXJkaW5nTm9kZS5maW5hbGl6ZSgpICE9IGZvcndhcmRpbmdOb2RlLnJlc29sdmUoKSkgewogICAgICAgICAgbGlicmFyeS5mb3J3YXJkZXJzT3JpZ2lucy5hZGQoZm9yd2FyZGluZ05vZGUuZmluYWxpemUoKSk7CiAgICAgICAgICBsaWJyYXJ5LmZvcndhcmRlcnNPcmlnaW5zLmFkZChmb3J3YXJkaW5nTm9kZS5yZXNvbHZlKCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIFByb2NlZHVyZSBkZWNsYXJlZEdldHRlcjsKICAgICAgaW50IGluaGVyaXRlZEdldHRlclN0YXJ0ID0gc3RhcnQ7CiAgICAgIGludCBnZXR0ZXJFbmQgPSBzdGFydDsKICAgICAgaWYgKGtpbmQgPT0gUHJvY2VkdXJlS2luZC5HZXR0ZXIpIHsKICAgICAgICBpZiAobWVtYmVyLmVuY2xvc2luZ0NsYXNzID09IGNsYXNzXykgewogICAgICAgICAgZGVjbGFyZWRHZXR0ZXIgPSBtZW1iZXI7CiAgICAgICAgICArK2luaGVyaXRlZEdldHRlclN0YXJ0OwogICAgICAgIH0KICAgICAgICB3aGlsZSAoKytnZXR0ZXJFbmQgPCBlbmQpIHsKICAgICAgICAgIFByb2NlZHVyZUtpbmQgY3VycmVudEtpbmQgPSBfa2luZE9mKGNhbmRpZGF0ZXNbZ2V0dGVyRW5kXSk7CiAgICAgICAgICBpZiAoY3VycmVudEtpbmQgPT0gUHJvY2VkdXJlS2luZC5TZXR0ZXIpIGJyZWFrOwogICAgICAgICAgaWYgKGN1cnJlbnRLaW5kICE9IFByb2NlZHVyZUtpbmQuR2V0dGVyKSByZXR1cm47CiAgICAgICAgfQogICAgICB9CgogICAgICBQcm9jZWR1cmUgZGVjbGFyZWRTZXR0ZXI7CiAgICAgIGludCBpbmhlcml0ZWRTZXR0ZXJTdGFydCA9IGdldHRlckVuZDsKICAgICAgaWYgKGdldHRlckVuZCA8IGVuZCkgewogICAgICAgIG1lbWJlciA9IGNhbmRpZGF0ZXNbZ2V0dGVyRW5kXTsKICAgICAgICBpZiAobWVtYmVyLmVuY2xvc2luZ0NsYXNzID09IGNsYXNzXykgewogICAgICAgICAgZGVjbGFyZWRTZXR0ZXIgPSBtZW1iZXI7CiAgICAgICAgICArK2luaGVyaXRlZFNldHRlclN0YXJ0OwogICAgICAgIH0KICAgICAgfQoKICAgICAgSW5mZXJlbmNlTm9kZSBnZXR0ZXJJbmZlcmVuY2VOb2RlOwogICAgICBpZiAoc3RhcnQgPCBnZXR0ZXJFbmQpIHsKICAgICAgICBpZiAoZGVjbGFyZWRHZXR0ZXIgIT0gbnVsbCkgewogICAgICAgICAgZ2V0dGVySW5mZXJlbmNlTm9kZSA9IF9jcmVhdGVJbmZlcmVuY2VOb2RlKAogICAgICAgICAgICAgIGNsYXNzXywKICAgICAgICAgICAgICBkZWNsYXJlZEdldHRlciwKICAgICAgICAgICAgICBjYW5kaWRhdGVzLAogICAgICAgICAgICAgIGluaGVyaXRlZEdldHRlclN0YXJ0LAogICAgICAgICAgICAgIGdldHRlckVuZCwKICAgICAgICAgICAgICBpbmhlcml0ZWRTZXR0ZXJTdGFydCwKICAgICAgICAgICAgICBlbmQsCiAgICAgICAgICAgICAgbGlicmFyeSwKICAgICAgICAgICAgICBjbGFzc18uZmlsZVVyaSk7CiAgICAgICAgfQogICAgICAgIC8vIEdldHRlcnMgbmVlZCB0byBiZSByZXNvbHZlZCBsYXRlciwgYXMgcGFydCBvZiB0eXBlIGluZmVyZW5jZSwgc28ganVzdAogICAgICAgIC8vIHNhdmUgdGhlIGZvcndhcmRpbmcgbm9kZSBmb3Igbm93LgogICAgICAgIC8vCiAgICAgICAgLy8gQ2hvb3NlIGEgcmVwcmVzZW50YXRpdmUgdG8gdXNlIGZvciBlcnJvciByZXBvcnRpbmcsIHN1Y2ggYXMgaWYgYQogICAgICAgIC8vIGNsYXNzIGluaGVyaXRzIHRoaXMgZ2V0dGVyIGFuZCB0cmllcyB0byBkZWNsYXJlIGEgbWV0aG9kIHdpdGggdGhlCiAgICAgICAgLy8gc2FtZSBuYW1lLgogICAgICAgIE1lbWJlciByZXByZXNlbnRhdGl2ZSA9IGNhbmRpZGF0ZXNbc3RhcnRdOwogICAgICAgIGdldHRlcnNbZ2V0dGVySW5kZXgrK10gPSBuZXcgRm9yd2FyZGluZ05vZGUodGhpcywgZ2V0dGVySW5mZXJlbmNlTm9kZSwKICAgICAgICAgICAgY2xhc3NfLCBuYW1lLCBQcm9jZWR1cmVLaW5kLkdldHRlciwgY2FuZGlkYXRlcywgc3RhcnQsIGdldHRlckVuZCkKICAgICAgICAgIC4uZmlsZVVyaSA9IHJlcHJlc2VudGF0aXZlLmZpbGVVcmkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IHJlcHJlc2VudGF0aXZlLmZpbGVPZmZzZXQKICAgICAgICAgIC4uZmlsZUVuZE9mZnNldCA9IHJlcHJlc2VudGF0aXZlLmZpbGVFbmRPZmZzZXQ7CiAgICAgIH0KICAgICAgaWYgKGdldHRlckVuZCA8IGVuZCkgewogICAgICAgIEluZmVyZW5jZU5vZGUgc2V0dGVySW5mZXJlbmNlTm9kZTsKICAgICAgICBpZiAoZGVjbGFyZWRTZXR0ZXIgIT0gbnVsbCkgewogICAgICAgICAgc2V0dGVySW5mZXJlbmNlTm9kZSA9IGRlY2xhcmVkU2V0dGVyIGlzIFN5bnRoZXRpY0FjY2Vzc29yCiAgICAgICAgICAgICAgPyBnZXR0ZXJJbmZlcmVuY2VOb2RlCiAgICAgICAgICAgICAgOiBfY3JlYXRlSW5mZXJlbmNlTm9kZSgKICAgICAgICAgICAgICAgICAgY2xhc3NfLAogICAgICAgICAgICAgICAgICBkZWNsYXJlZFNldHRlciwKICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlcywKICAgICAgICAgICAgICAgICAgaW5oZXJpdGVkU2V0dGVyU3RhcnQsCiAgICAgICAgICAgICAgICAgIGVuZCwKICAgICAgICAgICAgICAgICAgaW5oZXJpdGVkR2V0dGVyU3RhcnQsCiAgICAgICAgICAgICAgICAgIGdldHRlckVuZCwKICAgICAgICAgICAgICAgICAgbGlicmFyeSwKICAgICAgICAgICAgICAgICAgY2xhc3NfLmZpbGVVcmkpOwogICAgICAgIH0KICAgICAgICBNZW1iZXIgcmVwcmVzZW50YXRpdmUgPSBjYW5kaWRhdGVzW2dldHRlckVuZF07CiAgICAgICAgdmFyIGZvcndhcmRpbmdOb2RlID0gbmV3IEZvcndhcmRpbmdOb2RlKHRoaXMsIHNldHRlckluZmVyZW5jZU5vZGUsCiAgICAgICAgICAgIGNsYXNzXywgbmFtZSwgUHJvY2VkdXJlS2luZC5TZXR0ZXIsIGNhbmRpZGF0ZXMsIGdldHRlckVuZCwgZW5kKQogICAgICAgICAgLi5maWxlVXJpID0gcmVwcmVzZW50YXRpdmUuZmlsZVVyaQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gcmVwcmVzZW50YXRpdmUuZmlsZU9mZnNldAogICAgICAgICAgLi5maWxlRW5kT2Zmc2V0ID0gcmVwcmVzZW50YXRpdmUuZmlsZUVuZE9mZnNldDsKICAgICAgICAvLyBTZXR0ZXJzIG5lZWQgdG8gYmUgcmVzb2x2ZWQgbGF0ZXIsIGFzIHBhcnQgb2YgdHlwZSBpbmZlcmVuY2UsIHNvIGp1c3QKICAgICAgICAvLyBzYXZlIHRoZSBmb3J3YXJkaW5nIG5vZGUgZm9yIG5vdy4KICAgICAgICBzZXR0ZXJzW3NldHRlckluZGV4KytdID0gZm9yd2FyZGluZ05vZGU7CiAgICAgIH0KICAgIH0pOwogICAgZ2V0dGVycy5sZW5ndGggPSBnZXR0ZXJJbmRleDsKICAgIHNldHRlcnMubGVuZ3RoID0gc2V0dGVySW5kZXg7CiAgfQoKICB2b2lkIGZpbmFsaXplQ292YXJpYW5jZSgKICAgICAgQ2xhc3MgY2xhc3NfLCBMaXN0PE1lbWJlcj4gYXBpTWVtYmVycywgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcGlNZW1iZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBtZW1iZXIgPSBhcGlNZW1iZXJzW2ldOwogICAgICBNZW1iZXIgcmVzb2x1dGlvbjsKICAgICAgaWYgKG1lbWJlciBpcyBGb3J3YXJkaW5nTm9kZSkgewogICAgICAgIGFwaU1lbWJlcnNbaV0gPSByZXNvbHV0aW9uID0gbWVtYmVyLmZpbmFsaXplKCk7CiAgICAgICAgaWYgKGxpYnJhcnkgaXMgS2VybmVsTGlicmFyeUJ1aWxkZXIgJiYKICAgICAgICAgICAgbWVtYmVyLmZpbmFsaXplKCkgIT0gbWVtYmVyLnJlc29sdmUoKSkgewogICAgICAgICAgbGlicmFyeS5mb3J3YXJkZXJzT3JpZ2lucy5hZGQobWVtYmVyLmZpbmFsaXplKCkpOwogICAgICAgICAgbGlicmFyeS5mb3J3YXJkZXJzT3JpZ2lucy5hZGQobWVtYmVyLnJlc29sdmUoKSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHJlc29sdXRpb24gPSBtZW1iZXI7CiAgICAgIH0KICAgICAgaWYgKHJlc29sdXRpb24gaXMgUHJvY2VkdXJlICYmCiAgICAgICAgICByZXNvbHV0aW9uLmlzU3ludGhldGljRm9yd2FyZGVyICYmCiAgICAgICAgICBpZGVudGljYWwocmVzb2x1dGlvbi5lbmNsb3NpbmdDbGFzcywgY2xhc3NfKSkgewogICAgICAgIGNsYXNzXy5hZGRNZW1iZXIocmVzb2x1dGlvbik7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBHZXRzIGEgbGlzdCBvZiBtZW1iZXJzIGltcGxlbWVudGVkIG9yIHBvdGVudGlhbGx5IGluaGVyaXRlZCBieSBbY2xhc3NfXSwKICAvLy8gc29ydGVkIHNvIHRoYXQgbWVtYmVycyB3aXRoIHRoZSBzYW1lIG5hbWUgYXJlIGNvbnRpZ3VvdXMuCiAgLy8vCiAgLy8vIElmIFtzZXR0ZXJzXSBpcyBgdHJ1ZWAsIHNldHRlcnMgYXJlIHJlcG9ydGVkOyBvdGhlcndpc2UgZ2V0dGVycywgbWV0aG9kcywKICAvLy8gYW5kIG9wZXJhdG9ycyBhcmUgcmVwb3J0ZWQuCiAgTGlzdDxQcm9jZWR1cmU+IGdldENhbmRpZGF0ZXMoQ2xhc3MgY2xhc3NfLCBib29sIHNldHRlcnMpIHsKICAgIC8vIEZpcnN0IGNyZWF0ZSBhIGxpc3Qgb2YgY2FuZGlkYXRlcyBmb3IgaW5oZXJpdGFuY2UgYmFzZWQgb24gdGhlIG1lbWJlcnMKICAgIC8vIGRlY2xhcmVkIGRpcmVjdGx5IGluIHRoZSBjbGFzcy4KICAgIExpc3Q8UHJvY2VkdXJlPiBjYW5kaWRhdGVzID0gX3R5cGVFbnZpcm9ubWVudC5oaWVyYXJjaHkKICAgICAgICAuZ2V0RGVjbGFyZWRNZW1iZXJzKGNsYXNzXywgc2V0dGVyczogc2V0dGVycykKICAgICAgICAubWFwKChtZW1iZXIpID0+IG1ha2VDYW5kaWRhdGUobWVtYmVyLCBzZXR0ZXJzKSkKICAgICAgICAudG9MaXN0KCk7CiAgICAvLyBNZXJnZSBpbiBjYW5kaWRhdGVzIGZyb20gc3VwZXJjbGFzc2VzLgogICAgaWYgKGNsYXNzXy5zdXBlcmNsYXNzICE9IG51bGwpIHsKICAgICAgY2FuZGlkYXRlcyA9IF9tZXJnZUNhbmRpZGF0ZXMoY2FuZGlkYXRlcywgY2xhc3NfLnN1cGVyY2xhc3MsIHNldHRlcnMpOwogICAgfQogICAgZm9yICh2YXIgc3VwZXJ0eXBlIGluIGNsYXNzXy5pbXBsZW1lbnRlZFR5cGVzKSB7CiAgICAgIGNhbmRpZGF0ZXMgPSBfbWVyZ2VDYW5kaWRhdGVzKGNhbmRpZGF0ZXMsIHN1cGVydHlwZS5jbGFzc05vZGUsIHNldHRlcnMpOwogICAgfQogICAgcmV0dXJuIGNhbmRpZGF0ZXM7CiAgfQoKICAvLy8gQ3JlYXRlcyB0aGUgYXBwcm9wcmlhdGUgW0luZmVyZW5jZU5vZGVdIGZvciBpbmZlcnJpbmcgW3Byb2NlZHVyZV0gaW4gdGhlCiAgLy8vIGNvbnRleHQgb2YgW2NsYXNzX10uCiAgLy8vCiAgLy8vIFtjYW5kaWRhdGVzXSBhIGxpc3QgY29udGFpbmluZyB0aGUgcHJvY2VkdXJlcyBvdmVycmlkZGVuIGJ5IFtwcm9jZWR1cmVdLAogIC8vLyBpZiBhbnkuICBbc3RhcnRdIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgc3VjaCBwcm9jZWR1cmUsIGFuZCBbZW5kXSBpcwogIC8vLyB0aGUgcGFzdC10aGUtZW5kIGluZGV4IG9mIHRoZSBsYXN0IHN1Y2ggcHJvY2VkdXJlLgogIC8vLwogIC8vLyBGb3IgZ2V0dGVycyBhbmQgc2V0dGVycywgW2Nyb3NzU3RhcnRdIGFuZCBbY3Jvc3NFbmRdIGFyZSB0aGUgc3RhcnQgYW5kIGVuZAogIC8vLyBpbmRpY2VzIG9mIHRoZSBjb3JyZXNwb25kaW5nIG92ZXJyaWRkZW4gc2V0dGVycy9nZXR0ZXJzLCByZXNwZWN0aXZlbHkuCiAgSW5mZXJlbmNlTm9kZSBfY3JlYXRlSW5mZXJlbmNlTm9kZSgKICAgICAgQ2xhc3MgY2xhc3NfLAogICAgICBQcm9jZWR1cmUgcHJvY2VkdXJlLAogICAgICBMaXN0PE1lbWJlcj4gY2FuZGlkYXRlcywKICAgICAgaW50IHN0YXJ0LAogICAgICBpbnQgZW5kLAogICAgICBpbnQgY3Jvc3NTdGFydCwKICAgICAgaW50IGNyb3NzRW5kLAogICAgICBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LAogICAgICBVcmkgZmlsZVVyaSkgewogICAgSW5mZXJlbmNlTm9kZSBub2RlOwogICAgaWYgKHByb2NlZHVyZS5pc0FjY2Vzc29yICYmIF9yZXF1aXJlc1R5cGVJbmZlcmVuY2UocHJvY2VkdXJlKSkgewogICAgICBpZiAoc3RhcnQgPCBlbmQpIHsKICAgICAgICBub2RlID0gbmV3IEFjY2Vzc29ySW5mZXJlbmNlTm9kZSgKICAgICAgICAgICAgdGhpcywgcHJvY2VkdXJlLCBjYW5kaWRhdGVzLCBzdGFydCwgZW5kLCBsaWJyYXJ5LCBmaWxlVXJpKTsKICAgICAgfSBlbHNlIGlmIChjcm9zc1N0YXJ0IDwgY3Jvc3NFbmQpIHsKICAgICAgICBub2RlID0gbmV3IEFjY2Vzc29ySW5mZXJlbmNlTm9kZSh0aGlzLCBwcm9jZWR1cmUsIGNhbmRpZGF0ZXMsCiAgICAgICAgICAgIGNyb3NzU3RhcnQsIGNyb3NzRW5kLCBsaWJyYXJ5LCBmaWxlVXJpKTsKICAgICAgfSBlbHNlIGlmIChwcm9jZWR1cmUgaXMgU3ludGhldGljQWNjZXNzb3IgJiYKICAgICAgICAgIHByb2NlZHVyZS5fZmllbGQuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgIG5vZGUgPSBuZXcgRmllbGRJbml0aWFsaXplckluZmVyZW5jZU5vZGUoCiAgICAgICAgICAgIF90eXBlSW5mZXJlbmNlRW5naW5lLCBwcm9jZWR1cmUuX2ZpZWxkLCBsaWJyYXJ5KTsKICAgICAgfQoKICAgICAgaWYgKG5vZGUgIT0gbnVsbCAmJiBwcm9jZWR1cmUgaXMgU3ludGhldGljQWNjZXNzb3IpIHsKICAgICAgICBTaGFkb3dGaWVsZC5zZXRJbmZlcmVuY2VOb2RlKHByb2NlZHVyZS5fZmllbGQsIG5vZGUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIC8vLyBSZXRyaWV2ZXMgYSBsaXN0IG9mIHRoZSBpbnRlcmZhY2UgbWVtYmVycyBvZiB0aGUgZ2l2ZW4gW2NsYXNzX10uCiAgLy8vCiAgLy8vIElmIFtzZXR0ZXJzXSBpcyB0cnVlLCBzZXR0ZXJzIGFyZSByZXRyaWV2ZWQ7IG90aGVyd2lzZSBnZXR0ZXJzIGFuZCBtZXRob2RzCiAgLy8vIGFyZSByZXRyaWV2ZWQuCiAgTGlzdDxNZW1iZXI+IF9nZXRJbnRlcmZhY2VNZW1iZXJzKENsYXNzIGNsYXNzXywgYm9vbCBzZXR0ZXJzKSB7CiAgICAvLyBJZiBjbGFzc18gaXMgYmVpbmcgY29tcGlsZWQgZnJvbSBzb3VyY2UsIHJldHJpZXZlIGl0cyBmb3J3YXJkaW5nIG5vZGVzLgogICAgdmFyIGluZmVyZW5jZUluZm8gPSBTaGFkb3dDbGFzcy5nZXRDbGFzc0luZmVyZW5jZUluZm8oY2xhc3NfKTsKICAgIGlmIChpbmZlcmVuY2VJbmZvICE9IG51bGwpIHsKICAgICAgcmV0dXJuIHNldHRlcnMgPyBpbmZlcmVuY2VJbmZvLnNldHRlcnMgOiBpbmZlcmVuY2VJbmZvLmdldHRlcnNBbmRNZXRob2RzOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF90eXBlRW52aXJvbm1lbnQuaGllcmFyY2h5CiAgICAgICAgICAuZ2V0SW50ZXJmYWNlTWVtYmVycyhjbGFzc18sIHNldHRlcnM6IHNldHRlcnMpOwogICAgfQogIH0KCiAgLy8vIE1lcmdlcyB0b2dldGhlciB0aGUgbGlzdCBvZiBpbnRlcmZhY2UgaW5oZXJpdGFuY2UgY2FuZGlkYXRlcyBpbgogIC8vLyBbY2FuZGlkYXRlc10gd2l0aCBpbnRlcmZhY2UgaW5oZXJpdGFuY2UgY2FuZGlkYXRlcyBmcm9tIHN1cGVyY2xhc3MKICAvLy8gW2NsYXNzX10uCiAgLy8vCiAgLy8vIEFueSBjYW5kaWRhdGVzIGZyb20gW2NsYXNzX10gYXJlIGNvbnZlcnRlZCBpbnRvIGludGVyZmFjZSBpbmhlcml0YW5jZQogIC8vLyBjYW5kaWRhdGVzIHVzaW5nIFtfbWFrZUNhbmRpZGF0ZV0uCiAgTGlzdDxQcm9jZWR1cmU+IF9tZXJnZUNhbmRpZGF0ZXMoCiAgICAgIExpc3Q8UHJvY2VkdXJlPiBjYW5kaWRhdGVzLCBDbGFzcyBjbGFzc18sIGJvb2wgc2V0dGVycykgewogICAgTGlzdDxNZW1iZXI+IG1lbWJlcnMgPSBfZ2V0SW50ZXJmYWNlTWVtYmVycyhjbGFzc18sIHNldHRlcnMpOwogICAgaWYgKGNhbmRpZGF0ZXMuaXNFbXB0eSkgewogICAgICByZXR1cm4gbWVtYmVycy5tYXAoKG1lbWJlcikgPT4gbWFrZUNhbmRpZGF0ZShtZW1iZXIsIHNldHRlcnMpKS50b0xpc3QoKTsKICAgIH0KICAgIGlmIChtZW1iZXJzLmlzRW1wdHkpIHJldHVybiBjYW5kaWRhdGVzOwogICAgTGlzdDxQcm9jZWR1cmU+IHJlc3VsdCA9IDxQcm9jZWR1cmU+W10uLmxlbmd0aCA9CiAgICAgICAgY2FuZGlkYXRlcy5sZW5ndGggKyBtZW1iZXJzLmxlbmd0aDsKICAgIGludCBzdG9yZUluZGV4ID0gMDsKICAgIGludCBpID0gMCwgaiA9IDA7CiAgICB3aGlsZSAoaSA8IGNhbmRpZGF0ZXMubGVuZ3RoICYmIGogPCBtZW1iZXJzLmxlbmd0aCkgewogICAgICBQcm9jZWR1cmUgY2FuZGlkYXRlID0gY2FuZGlkYXRlc1tpXTsKICAgICAgTWVtYmVyIG1lbWJlciA9IG1lbWJlcnNbal07CiAgICAgIGludCBjb21wYXJlID0gQ2xhc3NIaWVyYXJjaHkuY29tcGFyZU1lbWJlcnMoY2FuZGlkYXRlLCBtZW1iZXIpOwogICAgICBpZiAoY29tcGFyZSA8PSAwKSB7CiAgICAgICAgcmVzdWx0W3N0b3JlSW5kZXgrK10gPSBjYW5kaWRhdGU7CiAgICAgICAgKytpOwogICAgICAgIC8vIElmIHRoZSBzYW1lIG1lbWJlciBvY2N1cnMgaW4gYm90aCBsaXN0cywgc2tpcCB0aGUgZHVwbGljYXRlLgogICAgICAgIGlmIChpZGVudGljYWwoY2FuZGlkYXRlLCBtZW1iZXIpKSArK2o7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0W3N0b3JlSW5kZXgrK10gPSBtYWtlQ2FuZGlkYXRlKG1lbWJlciwgc2V0dGVycyk7CiAgICAgICAgKytqOwogICAgICB9CiAgICB9CiAgICB3aGlsZSAoaSA8IGNhbmRpZGF0ZXMubGVuZ3RoKSB7CiAgICAgIHJlc3VsdFtzdG9yZUluZGV4KytdID0gY2FuZGlkYXRlc1tpKytdOwogICAgfQogICAgd2hpbGUgKGogPCBtZW1iZXJzLmxlbmd0aCkgewogICAgICByZXN1bHRbc3RvcmVJbmRleCsrXSA9IG1ha2VDYW5kaWRhdGUobWVtYmVyc1tqKytdLCBzZXR0ZXJzKTsKICAgIH0KICAgIHJlc3VsdC5sZW5ndGggPSBzdG9yZUluZGV4OwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBEZXRlcm1pbmVzIHRoZSBhcHByb3ByaWF0ZSBzdWJzdGl0dXRpb24gdG8gdHJhbnNsYXRlIHR5cGUgcGFyYW1ldGVycwogIC8vLyBtZW50aW9uZWQgaW4gdGhlIGdpdmVuIFtjYW5kaWRhdGVdIHRvIHR5cGUgcGFyYW1ldGVycyBvbiBbY2xhc3NfXS4KICBTdWJzdGl0dXRpb24gX3N1YnN0aXR1dGlvbkZvcihQcm9jZWR1cmUgY2FuZGlkYXRlLCBDbGFzcyBjbGFzc18pIHsKICAgIHJldHVybiBTdWJzdGl0dXRpb24uZnJvbUludGVyZmFjZVR5cGUoX3R5cGVFbnZpcm9ubWVudC5nZXRUeXBlQXNJbnN0YW5jZU9mKAogICAgICAgIGNsYXNzXy50aGlzVHlwZSwgY2FuZGlkYXRlLmVuY2xvc2luZ0NsYXNzKSk7CiAgfQoKICAvLy8gRXhlY3V0ZXMgW2NhbGxiYWNrXSBvbmNlIGZvciBlYWNoIHVuaXF1ZWx5IG5hbWVkIG1lbWJlciBvZiBbY2FuZGlkYXRlc10uCiAgLy8vCiAgLy8vIFRoZSBbc3RhcnRdIGFuZCBbZW5kXSB2YWx1ZXMgcGFzc2VkIHRvIFtjYWxsYmFja10gYXJlIHRoZSBzdGFydCBhbmQKICAvLy8gcGFzdC10aGUtZW5kIGluZGljZXMgaW50byBbY2FuZGlkYXRlc10gb2YgYSBncm91cCBvZiBtZW1iZXJzIGhhdmluZyB0aGUKICAvLy8gc2FtZSBuYW1lLiAgVGhlIFtuYW1lXSB2YWx1ZSBwYXNzZWQgdG8gW2NhbGxiYWNrXSBpcyB0aGUgY29tbW9uIG5hbWUuCiAgc3RhdGljIHZvaWQgZm9yRWFjaEFwaU1lbWJlcigKICAgICAgTGlzdDxNZW1iZXI+IGNhbmRpZGF0ZXMsIHZvaWQgY2FsbGJhY2soaW50IHN0YXJ0LCBpbnQgZW5kLCBOYW1lIG5hbWUpKSB7CiAgICBpbnQgaSA9IDA7CiAgICB3aGlsZSAoaSA8IGNhbmRpZGF0ZXMubGVuZ3RoKSB7CiAgICAgIHZhciBuYW1lID0gY2FuZGlkYXRlc1tpXS5uYW1lOwogICAgICBpbnQgaiA9IGkgKyAxOwogICAgICB3aGlsZSAoaiA8IGNhbmRpZGF0ZXMubGVuZ3RoICYmIGNhbmRpZGF0ZXNbal0ubmFtZSA9PSBuYW1lKSB7CiAgICAgICAgaisrOwogICAgICB9CiAgICAgIGNhbGxiYWNrKGksIGosIG5hbWUpOwogICAgICBpID0gajsKICAgIH0KICB9CgogIC8vLyBUcmFuc2Zvcm1zIFttZW1iZXJdIGludG8gYSBjYW5kaWRhdGUgZm9yIGludGVyZmFjZSBpbmhlcml0YW5jZS4KICAvLy8KICAvLy8gRmllbGRzIGFyZSB0cmFuc2Zvcm1lZCBpbnRvIGdldHRlcnMgYW5kIHNldHRlcnM7IG1ldGhvZHMgYXJlIHBhc3NlZAogIC8vLyB0aHJvdWdoIHVuY2hhbmdlZC4KICBzdGF0aWMgUHJvY2VkdXJlIG1ha2VDYW5kaWRhdGUoTWVtYmVyIG1lbWJlciwgYm9vbCBzZXR0ZXIpIHsKICAgIGlmIChtZW1iZXIgaXMgUHJvY2VkdXJlKSByZXR1cm4gbWVtYmVyOwogICAgaWYgKG1lbWJlciBpcyBGaWVsZCkgewogICAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IGRvbid0IHNldCB0aGUgdHlwZSBvciBjb3ZhcmlhbmNlIGFubm90YXRpb25zIGhlcmUsCiAgICAgIC8vIHNpbmNlIHRoZXkgbWlnaHQgbm90IGhhdmUgYmVlbiBpbmZlcnJlZCB5ZXQuICBJbnN0ZWFkLCBlbnN1cmUgdGhhdCB0aGlzCiAgICAgIC8vIGluZm9ybWF0aW9uIGlzIHByb3BhZ2F0ZWQgdG8gdGhlIGdldHRlci9zZXR0ZXIgZHVyaW5nIHR5cGUgaW5mZXJlbmNlLgogICAgICB2YXIgdHlwZSA9IG1lbWJlci50eXBlOwogICAgICB2YXIgaXNHZW5lcmljQ292YXJpYW50SW1wbCA9IG1lbWJlci5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsOwogICAgICB2YXIgaXNDb3ZhcmlhbnQgPSBtZW1iZXIuaXNDb3ZhcmlhbnQ7CiAgICAgIGlmIChzZXR0ZXIpIHsKICAgICAgICB2YXIgdmFsdWVQYXJhbSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKCdfJywgdHlwZTogdHlwZSkKICAgICAgICAgIC4uaXNHZW5lcmljQ292YXJpYW50SW1wbCA9IGlzR2VuZXJpY0NvdmFyaWFudEltcGwKICAgICAgICAgIC4uaXNDb3ZhcmlhbnQgPSBpc0NvdmFyaWFudDsKICAgICAgICB2YXIgZnVuY3Rpb24gPSBuZXcgRnVuY3Rpb25Ob2RlKG51bGwsCiAgICAgICAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzOiBbdmFsdWVQYXJhbV0sIHJldHVyblR5cGU6IGNvbnN0IFZvaWRUeXBlKCkpOwogICAgICAgIHJldHVybiBuZXcgU3ludGhldGljQWNjZXNzb3IoCiAgICAgICAgICAgIG1lbWJlci5uYW1lLCBQcm9jZWR1cmVLaW5kLlNldHRlciwgZnVuY3Rpb24sIG1lbWJlcikKICAgICAgICAgIC4ucGFyZW50ID0gbWVtYmVyLmVuY2xvc2luZ0NsYXNzOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBmdW5jdGlvbiA9IG5ldyBGdW5jdGlvbk5vZGUobnVsbCwgcmV0dXJuVHlwZTogdHlwZSk7CiAgICAgICAgcmV0dXJuIG5ldyBTeW50aGV0aWNBY2Nlc3NvcigKICAgICAgICAgICAgbWVtYmVyLm5hbWUsIFByb2NlZHVyZUtpbmQuR2V0dGVyLCBmdW5jdGlvbiwgbWVtYmVyKQogICAgICAgICAgLi5wYXJlbnQgPSBtZW1iZXIuZW5jbG9zaW5nQ2xhc3M7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB1bmhhbmRsZWQoJyR7bWVtYmVyLnJ1bnRpbWVUeXBlfScsICdtYWtlQ2FuZGlkYXRlJywgLTEsIG51bGwpOwogIH0KCiAgc3RhdGljIFByb2NlZHVyZUtpbmQgX2tpbmRPZihQcm9jZWR1cmUgcHJvY2VkdXJlKSA9PiBwcm9jZWR1cmUua2luZDsKCiAgLy8vIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gW3Byb2NlZHVyZV0gd2lsbCByZXF1aXJlIHR5cGUgaW5mZXJlbmNlLgogIHN0YXRpYyBib29sIF9yZXF1aXJlc1R5cGVJbmZlcmVuY2UoUHJvY2VkdXJlIHByb2NlZHVyZSkgewogICAgaWYgKHByb2NlZHVyZSBpcyBTeW50aGV0aWNBY2Nlc3NvcikgewogICAgICByZXR1cm4gU2hhZG93RmllbGQuaXNJbXBsaWNpdGx5VHlwZWQocHJvY2VkdXJlLl9maWVsZCk7CiAgICB9CiAgICBpZiAocHJvY2VkdXJlLmtpbmQgIT0gUHJvY2VkdXJlS2luZC5TZXR0ZXIgJiYKICAgICAgICBTaGFkb3dQcm9jZWR1cmUuaGFzSW1wbGljaXRSZXR1cm5UeXBlKHByb2NlZHVyZSkpIHsKICAgICAgLy8gSW5mZXJlbmNlIG9mIHRoZSByZXR1cm4gdHlwZSBvZiBgW109YCBpcyBoYW5kbGVkIHNlcGFyYXRlbHkgYnkKICAgICAgLy8gS2VybmVsUHJvY2VkdXJlQnVpbGRlci5idWlsZCwgc2luY2UgdGhlcmUgYXJlIG5vIGRlcGVuZGVuY2llcy4KICAgICAgaWYgKHByb2NlZHVyZS5raW5kICE9IFByb2NlZHVyZUtpbmQuT3BlcmF0b3IgfHwKICAgICAgICAgIHByb2NlZHVyZS5uYW1lLm5hbWUgIT0gJ1tdPScpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgdmFyIGZ1bmN0aW9uID0gcHJvY2VkdXJlLmZ1bmN0aW9uOwogICAgZm9yICh2YXIgcGFyYW1ldGVyIGluIGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgIGlmIChWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQuaXNJbXBsaWNpdGx5VHlwZWQocGFyYW1ldGVyKSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmb3IgKHZhciBwYXJhbWV0ZXIgaW4gZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgIGlmIChWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQuaXNJbXBsaWNpdGx5VHlwZWQocGFyYW1ldGVyKSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CgovLy8gQSBbU3ludGhldGljQWNjZXNzb3JdIHJlcHJlc2VudHMgdGhlIGdldHRlciBvciBzZXR0ZXIgaW1wbGllZCBieSBhIGZpZWxkLgpjbGFzcyBTeW50aGV0aWNBY2Nlc3NvciBleHRlbmRzIFByb2NlZHVyZSB7CiAgLy8vIFRoZSBmaWVsZCBhc3NvY2lhdGVkIHdpdGggdGhlIHN5bnRoZXRpYyBhY2Nlc3Nvci4KICBmaW5hbCBGaWVsZCBfZmllbGQ7CgogIFN5bnRoZXRpY0FjY2Vzc29yKAogICAgICBOYW1lIG5hbWUsIFByb2NlZHVyZUtpbmQga2luZCwgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uLCB0aGlzLl9maWVsZCkKICAgICAgOiBzdXBlcigKICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAga2luZCwKICAgICAgICAgICAga2luZCA9PSBQcm9jZWR1cmVLaW5kLlNldHRlcgogICAgICAgICAgICAgICAgPyBuZXcgU3ludGhldGljQWNjZXNzb3JGdW5jdGlvbk5vZGUuc2V0dGVyKF9maWVsZCkKICAgICAgICAgICAgICAgIDogbmV3IFN5bnRoZXRpY0FjY2Vzc29yRnVuY3Rpb25Ob2RlLmdldHRlcihfZmllbGQpLAogICAgICAgICAgICBmaWxlVXJpOiBfZmllbGQuZmlsZVVyaSkgewogICAgZmlsZU9mZnNldCA9IF9maWVsZC5maWxlT2Zmc2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0IGdldHRlclR5cGUgPT4gX2ZpZWxkLnR5cGU7CgogIHN0YXRpYyBnZXRGaWVsZChTeW50aGV0aWNBY2Nlc3NvciBhY2Nlc3NvcikgPT4gYWNjZXNzb3IuX2ZpZWxkOwp9CgovLy8gQSBbU3ludGhldGljQWNjZXNzb3JGdW5jdGlvbk5vZGVdIHJlcHJlc2VudHMgdGhlIFtGdW5jdGlvbk5vZGVdIHBhcnQgb2YgdGhlCi8vLyBnZXR0ZXIgb3Igc2V0dGVyIGltcGxpZWQgYnkgYSBmaWVsZC4KLy8vCi8vLyBGb3IgZ2V0dGVycywgW3JldHVyblR5cGVdIG1hcHMgdG8gdGhlIHVuZGVybHlpbmcgZmllbGQncyB0eXBlLCBzbyB0aGF0IGlmCi8vLyB0eXBlIGluZmVyZW5jZSBmaWxscyBpbiB0aGUgdHlwZSBvZiB0aGUgZmllbGQsIHRoZSBjaGFuZ2Ugd2lsbCBhdXRvbWF0aWNhbGx5Ci8vLyBiZSByZWZsZWN0ZWQgaW4gdGhlIHN5bnRoZXRpYyBnZXR0ZXIuCmNsYXNzIFN5bnRoZXRpY0FjY2Vzc29yRnVuY3Rpb25Ob2RlIGV4dGVuZHMgRnVuY3Rpb25Ob2RlIHsKICBmaW5hbCBGaWVsZCBfZmllbGQ7CgogIFN5bnRoZXRpY0FjY2Vzc29yRnVuY3Rpb25Ob2RlLmdldHRlcih0aGlzLl9maWVsZCkKICAgICAgOiBzdXBlcihuZXcgUmV0dXJuU3RhdGVtZW50KCkpOwoKICBTeW50aGV0aWNBY2Nlc3NvckZ1bmN0aW9uTm9kZS5zZXR0ZXIodGhpcy5fZmllbGQpCiAgICAgIDogc3VwZXIobmV3IFJldHVyblN0YXRlbWVudCgpLAogICAgICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyczogW25ldyBTeW50aGV0aWNTZXR0ZXJQYXJhbWV0ZXIoX2ZpZWxkKV0pOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXQgcmV0dXJuVHlwZSA9PgogICAgICBwb3NpdGlvbmFsUGFyYW1ldGVycy5pc0VtcHR5ID8gX2ZpZWxkLnR5cGUgOiBjb25zdCBWb2lkVHlwZSgpOwp9CgovLy8gQSBbU3ludGhldGljU2V0dGVyUGFyYW1ldGVyXSByZXByZXNlbnRzIHRoZSAidmFsdWUiIHBhcmFtZXRlciBvZiB0aGUgc2V0dGVyCi8vLyBpbXBsaWVkIGJ5IGEgZmllbGQuCi8vLwovLy8gVGhlIGdldHRlcnMgW2lzQ292YXJpYW50XSwgW2lzR2VuZXJpY0NvdmFyaWFudEltcGxdLAovLy8gW2lzR2VuZXJpY0NvdmFyaWFudEludGVyZmFjZV0sIGFuZCBbdHlwZV0gbWFwIHRvIHRoZSB1bmRlcmx5aW5nIGZpZWxkJ3MKLy8vIHByb3BlcnRpZXMsIHNvIHRoYXQgaWYgdGhlc2UgcHJvcGVydGllcyBhcmUgbW9kaWZpZWQgb24gdGhlIGZpZWxkLCB0aGUKLy8vIGNoYW5nZSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgcmVmbGVjdGVkIGluIHRoZSBzeW50aGV0aWMgc2V0dGVyLiAgU2ltaWxhcmx5LAovLy8gdGhlIHNldHRlcnMgW2lzQ292YXJpYW50XSwgW2lzR2VuZXJpY0NvdmFyaWFudEltcGxdLCBhbmQKLy8vIFtpc0dlbmVyaWNDb3ZhcmlhbnRJbnRlcmZhY2VdIHVwZGF0ZSB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0aWVzIG9uIHRoZQovLy8gZmllbGQsIHNvIHRoYXQgY292YXJpYW5jZSBwcm9wYWdhdGlvbiBsb2dpYyBjYW4gYWN0IHVuaWZvcm1seSBvbiBbUHJvY2VkdXJlXQovLy8gb2JqZWN0cyB3aXRob3V0IGhhdmluZyB0byBoYXZlIHNwZWNpYWwgY2FzZSBoYW5kbGluZyBmb3IgZmllbGRzLgpjbGFzcyBTeW50aGV0aWNTZXR0ZXJQYXJhbWV0ZXIgZXh0ZW5kcyBWYXJpYWJsZURlY2xhcmF0aW9uIHsKICBmaW5hbCBGaWVsZCBf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L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zb3VyY2UvZGlldF9saXN0ZW5lci5kYXJ0wAB2XS8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmRpZXRfbGlzdGVuZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIEFzeW5jTWFya2VyLAogICAgICAgIEV4cHJlc3Npb24sCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBMaWJyYXJ5LAogICAgICAgIExpYnJhcnlEZXBlbmRlbmN5LAogICAgICAgIExpYnJhcnlQYXJ0LAogICAgICAgIFRyZWVOb2RlLAogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb247CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JyBzaG93IENsYXNzSGllcmFyY2h5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIHNob3cgQ29yZVR5cGVzOwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJy4uL2J1aWxkZXIvYnVpbGRlci5kYXJ0JzsKCmltcG9ydCAnLi4vY29uc3RhbnRfY29udGV4dC5kYXJ0JyBzaG93IENvbnN0YW50Q29udGV4dDsKCmltcG9ydCAnLi4vY3Jhc2guZGFydCcgc2hvdyBDcmFzaDsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cKICAgICAgICBDb2RlLAogICAgICAgIExvY2F0ZWRNZXNzYWdlLAogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgbWVzc2FnZUV4cGVjdGVkQmxvY2tUb1NraXAsCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZDsKCmltcG9ydCAnLi4vaWdub3JlZF9wYXJzZXJfZXJyb3JzLmRhcnQnIHNob3cgaXNJZ25vcmVkUGFyc2VyRXJyb3I7CgppbXBvcnQgJy4uL2tlcm5lbC9rZXJuZWxfYm9keV9idWlsZGVyLmRhcnQnIHNob3cgS2VybmVsQm9keUJ1aWxkZXI7CgppbXBvcnQgJy4uL2tlcm5lbC9rZXJuZWxfYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIEtlcm5lbEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIsCiAgICAgICAgS2VybmVsRnVuY3Rpb25UeXBlQnVpbGRlciwKICAgICAgICBLZXJuZWxUeXBlQWxpYXNCdWlsZGVyLAogICAgICAgIEtlcm5lbFR5cGVCdWlsZGVyOwoKaW1wb3J0ICcuLi9wYXJzZXIuZGFydCcgc2hvdyBBc3NlcnQsIE1lbWJlcktpbmQsIFBhcnNlciwgb3B0aW9uYWw7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnCiAgICBzaG93IERlYnVnQWJvcnQsIGludGVybmFsUHJvYmxlbSwgdW5leHBlY3RlZCwgdW5oYW5kbGVkOwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX2luZmVyZW5jZV9lbmdpbmUuZGFydCcgc2hvdyBUeXBlSW5mZXJlbmNlRW5naW5lOwoKaW1wb3J0ICdzb3VyY2VfbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgU291cmNlTGlicmFyeUJ1aWxkZXI7CgppbXBvcnQgJ3N0YWNrX2xpc3RlbmVyLmRhcnQnCiAgICBzaG93IEZpeGVkTnVsbGFibGVMaXN0LCBOdWxsVmFsdWUsIFBhcnNlclJlY292ZXJ5LCBTdGFja0xpc3RlbmVyOwoKaW1wb3J0ICcuLi9xdW90ZS5kYXJ0JyBzaG93IHVuZXNjYXBlU3RyaW5nOwoKY2xhc3MgRGlldExpc3RlbmVyIGV4dGVuZHMgU3RhY2tMaXN0ZW5lciB7CiAgZmluYWwgU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeTsKCiAgZmluYWwgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5OwoKICBmaW5hbCBDb3JlVHlwZXMgY29yZVR5cGVzOwoKICBmaW5hbCBib29sIGVuYWJsZU5hdGl2ZTsKCiAgZmluYWwgYm9vbCBzdHJpbmdFeHBlY3RlZEFmdGVyTmF0aXZlOwoKICBmaW5hbCBUeXBlSW5mZXJlbmNlRW5naW5lIHR5cGVJbmZlcmVuY2VFbmdpbmU7CgogIGludCBpbXBvcnRFeHBvcnREaXJlY3RpdmVJbmRleCA9IDA7CiAgaW50IHBhcnREaXJlY3RpdmVJbmRleCA9IDA7CgogIENsYXNzQnVpbGRlciBjdXJyZW50Q2xhc3M7CgogIGJvb2wgY3VycmVudENsYXNzSXNQYXJzZXJSZWNvdmVyeSA9IGZhbHNlOwoKICAvLy8gRm9yIHRvcC1sZXZlbCBkZWNsYXJhdGlvbnMsIHRoaXMgaXMgdGhlIGxpYnJhcnkgc2NvcGUuIEZvciBjbGFzcyBtZW1iZXJzLAogIC8vLyB0aGlzIGlzIHRoZSBpbnN0YW5jZSBzY29wZSBvZiBbY3VycmVudENsYXNzXS4KICBTY29wZSBtZW1iZXJTY29wZTsKCiAgQG92ZXJyaWRlCiAgVXJpIHVyaTsKCiAgRGlldExpc3RlbmVyKFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnksIHRoaXMuaGllcmFyY2h5LCB0aGlzLmNvcmVUeXBlcywKICAgICAgdGhpcy50eXBlSW5mZXJlbmNlRW5naW5lKQogICAgICA6IGxpYnJhcnkgPSBsaWJyYXJ5LAogICAgICAgIHVyaSA9IGxpYnJhcnkuZmlsZVVyaSwKICAgICAgICBtZW1iZXJTY29wZSA9IGxpYnJhcnkuc2NvcGUsCiAgICAgICAgZW5hYmxlTmF0aXZlID0KICAgICAgICAgICAgbGlicmFyeS5sb2FkZXIudGFyZ2V0LmJhY2tlbmRUYXJnZXQuZW5hYmxlTmF0aXZlKGxpYnJhcnkudXJpKSwKICAgICAgICBzdHJpbmdFeHBlY3RlZEFmdGVyTmF0aXZlID0KICAgICAgICAgICAgbGlicmFyeS5sb2FkZXIudGFyZ2V0LmJhY2tlbmRUYXJnZXQubmF0aXZlRXh0ZW5zaW9uRXhwZWN0c1N0cmluZzsKCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRNZXRhZGF0YVN0YXIoaW50IGNvdW50KSB7CiAgICBkZWJ1Z0V2ZW50KCJNZXRhZGF0YVN0YXIiKTsKICAgIGlmIChjb3VudCA+IDApIHsKICAgICAgZGlzY2FyZChjb3VudCAtIDEpOwogICAgICBwdXNoKHBvcChOdWxsVmFsdWUuTWV0YWRhdGEpKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2goTnVsbFZhbHVlLk1ldGFkYXRhKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTWV0YWRhdGEoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gcGVyaW9kQmVmb3JlTmFtZSwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIk1ldGFkYXRhIik7CiAgICBkaXNjYXJkKHBlcmlvZEJlZm9yZU5hbWUgPT0gbnVsbCA/IDEgOiAyKTsKICAgIHB1c2goYmVnaW5Ub2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFBhcnRPZigKICAgICAgVG9rZW4gcGFydEtleXdvcmQsIFRva2VuIG9mS2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uLCBib29sIGhhc05hbWUpIHsKICAgIGRlYnVnRXZlbnQoIlBhcnRPZiIpOwogICAgaWYgKGhhc05hbWUpIGRpc2NhcmQoMSk7CiAgICBkaXNjYXJkKDEpOyAvLyBNZXRhZGF0YS4KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW52YWxpZFRvcExldmVsRGVjbGFyYXRpb24oVG9rZW4gYmVnaW5Ub2tlbikgewogICAgZGVidWdFdmVudCgiSW52YWxpZFRvcExldmVsRGVjbGFyYXRpb24iKTsKICAgIHBvcCgpOyAvLyBtZXRhZGF0YSBzdGFyCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb0FyZ3VtZW50cyIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb1R5cGVBcmd1bWVudHMoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIk5vVHlwZUFyZ3VtZW50cyIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0NvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb0NvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vVHlwZShUb2tlbiBsYXN0Q29uc3VtZWQpIHsKICAgIGRlYnVnRXZlbnQoIk5vVHlwZSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVUeXBlKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIHF1ZXN0aW9uTWFyaykgewogICAgZGVidWdFdmVudCgiVHlwZSIpOwogICAgZGlzY2FyZCgxKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVHlwZUxpc3QoaW50IGNvdW50KSB7CiAgICBkZWJ1Z0V2ZW50KCJUeXBlTGlzdCIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOYW1lZE1peGluQXBwbGljYXRpb25XaXRoQ2xhdXNlKFRva2VuIHdpdGhLZXl3b3JkKSB7CiAgICBkZWJ1Z0V2ZW50KCJOYW1lZE1peGluQXBwbGljYXRpb25XaXRoQ2xhdXNlIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNsYXNzV2l0aENsYXVzZShUb2tlbiB3aXRoS2V5d29yZCkgewogICAgZGVidWdFdmVudCgiQ2xhc3NXaXRoQ2xhdXNlIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNsYXNzTm9XaXRoQ2xhdXNlKCkgewogICAgZGVidWdFdmVudCgiQ2xhc3NOb1dpdGhDbGF1c2UiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVHlwZUFyZ3VtZW50cyhpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJUeXBlQXJndW1lbnRzIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRUeXBlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJJbnZhbGlkVHlwZUFyZ3VtZW50cyIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGaWVsZEluaXRpYWxpemVyKFRva2VuIGFzc2lnbm1lbnRPcGVyYXRvciwgVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkZpZWxkSW5pdGlhbGl6ZXIiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9GaWVsZEluaXRpYWxpemVyKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb0ZpZWxkSW5pdGlhbGl6ZXIiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9UeXBlVmFyaWFibGVzKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb1R5cGVWYXJpYWJsZXMiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9ybWFsUGFyYW1ldGVycygKICAgICAgaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbiwgTWVtYmVyS2luZCBraW5kKSB7CiAgICBkZWJ1Z0V2ZW50KCJGb3JtYWxQYXJhbWV0ZXJzIik7CiAgICBhc3NlcnQoY291bnQgPT0gMCk7IC8vIENvdW50IGlzIGFsd2F5cyAwIGFzIHRoZSBkaWV0IHBhcnNlciBza2lwcyBmb3JtYWxzLgogICAgaWYgKGtpbmQgIT0gTWVtYmVyS2luZC5HZW5lcmFsaXplZEZ1bmN0aW9uVHlwZSAmJgogICAgICAgIGlkZW50aWNhbChwZWVrKCksICItIikgJiYKICAgICAgICBpZGVudGljYWwoYmVnaW5Ub2tlbi5uZXh0LCBlbmRUb2tlbikpIHsKICAgICAgcG9wKCk7CiAgICAgIHB1c2goInVuYXJ5LSIpOwogICAgfQogICAgcHVzaChiZWdpblRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9Gb3JtYWxQYXJhbWV0ZXJzKFRva2VuIHRva2VuLCBNZW1iZXJLaW5kIGtpbmQpIHsKICAgIGRlYnVnRXZlbnQoIk5vRm9ybWFsUGFyYW1ldGVycyIpOwogICAgaWYgKGlkZW50aWNhbChwZWVrKCksICItIikpIHsKICAgICAgcG9wKCk7CiAgICAgIHB1c2goInVuYXJ5LSIpOwogICAgfQogICAgcHVzaCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZ1bmN0aW9uVHlwZShUb2tlbiBmdW5jdGlvblRva2VuLCBUb2tlbiBxdWVzdGlvbk1hcmspIHsKICAgIGRlYnVnRXZlbnQoIkZ1bmN0aW9uVHlwZSIpOwogICAgZGlzY2FyZCgxKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRnVuY3Rpb25UeXBlQWxpYXMoCiAgICAgIFRva2VuIHR5cGVkZWZLZXl3b3JkLCBUb2tlbiBlcXVhbHMsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJGdW5jdGlvblR5cGVBbGlhcyIpOwoKICAgIGlmIChlcXVhbHMgPT0gbnVsbCkgcG9wKCk7IC8vIGVuZFRva2VuCiAgICBPYmplY3QgbmFtZSA9IHBvcCgpOwogICAgVG9rZW4gbWV0YWRhdGEgPSBwb3AoKTsKICAgIGNoZWNrRW1wdHkodHlwZWRlZktleXdvcmQuY2hhck9mZnNldCk7CiAgICBpZiAobmFtZSBpcyBQYXJzZXJSZWNvdmVyeSkgcmV0dXJuOwoKICAgIERlY2xhcmF0aW9uIHR5cGVkZWZCdWlsZGVyID0gbG9va3VwQnVpbGRlcih0eXBlZGVmS2V5d29yZCwgbnVsbCwgbmFtZSk7CiAgICBwYXJzZU1ldGFkYXRhKHR5cGVkZWZCdWlsZGVyLCBtZXRhZGF0YSwgdHlwZWRlZkJ1aWxkZXIudGFyZ2V0KTsKICAgIGlmICh0eXBlZGVmQnVpbGRlciBpcyBLZXJuZWxUeXBlQWxpYXNCdWlsZGVyKSB7CiAgICAgIEtlcm5lbFR5cGVCdWlsZGVyIHR5cGUgPSB0eXBlZGVmQnVpbGRlci50eXBlOwogICAgICBpZiAodHlwZSBpcyBLZXJuZWxGdW5jdGlvblR5cGVCdWlsZGVyKSB7CiAgICAgICAgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPFR5cGVCdWlsZGVyPj4gZm9ybWFscyA9IHR5cGUuZm9ybWFsczsKICAgICAgICBpZiAoZm9ybWFscyAhPSBudWxsKSB7CiAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZvcm1hbHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgS2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgPSBmb3JtYWxzW2ldOwogICAgICAgICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEgPSBmb3JtYWwubWV0YWRhdGE7CiAgICAgICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsICYmIG1ldGFkYXRhLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAvLyBbcGFyc2VNZXRhZGF0YV0gaXMgdXNpbmcgW1BhcnNlci5wYXJzZU1ldGFkYXRhU3Rhcl0gdW5kZXIgdGhlCiAgICAgICAgICAgICAgLy8gaG9vZCwgc28gd2Ugb25seSBuZWVkIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGFubm90YXRpb24uCiAgICAgICAgICAgICAgVG9rZW4gbWV0YWRhdGFUb2tlbiA9IHRva2VuRm9yT2Zmc2V0KAogICAgICAgICAgICAgICAgICB0eXBlZGVmS2V5d29yZCwgZW5kVG9rZW4sIG1ldGFkYXRhWzBdLmNoYXJPZmZzZXQpOwogICAgICAgICAgICAgIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMgPQogICAgICAgICAgICAgICAgICBwYXJzZU1ldGFkYXRhKHR5cGVkZWZCdWlsZGVyLCBtZXRhZGF0YVRva2VuLCBudWxsKTsKICAgICAgICAgICAgICBpZiAoZm9ybWFsLmlzUG9zaXRpb25hbCkgewogICAgICAgICAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgPQogICAgICAgICAgICAgICAgICAgIHR5cGVkZWZCdWlsZGVyLnRhcmdldC5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICAgICAgICAgICAgICAgIGZvciAoRXhwcmVzc2lvbiBhbm5vdGF0aW9uIGluIGFubm90YXRpb25zKSB7CiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlci5hZGRBbm5vdGF0aW9uKGFubm90YXRpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb24gbmFtZWQKICAgICAgICAgICAgICAgICAgICBpbiB0eXBlZGVmQnVpbGRlci50YXJnZXQubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgICAgICAgIGlmIChuYW1lZC5uYW1lID09IGZvcm1hbC5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChFeHByZXNzaW9uIGFubm90YXRpb24gaW4gYW5ub3RhdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgIG5hbWVkLmFkZEFubm90YXRpb24oYW5ub3RhdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKHR5cGVkZWZCdWlsZGVyICE9IG51bGwpIHsKICAgICAgdW5oYW5kbGVkKCIke3R5cGVkZWZCdWlsZGVyLmZ1bGxOYW1lRm9yRXJyb3JzfSIsICJlbmRGdW5jdGlvblR5cGVBbGlhcyIsCiAgICAgICAgICB0eXBlZGVmS2V5d29yZC5jaGFyT2Zmc2V0LCB1cmkpOwogICAgfQoKICAgIGNoZWNrRW1wdHkodHlwZWRlZktleXdvcmQuY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZpZWxkcyhUb2tlbiBzdGF0aWNUb2tlbiwgVG9rZW4gY292YXJpYW50VG9rZW4sIFRva2VuIHZhckZpbmFsT3JDb25zdCwKICAgICAgaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiRmllbGRzIik7CiAgICBidWlsZEZpZWxkcyhjb3VudCwgYmVnaW5Ub2tlbiwgZmFsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVBc3luY01vZGlmaWVyKFRva2VuIGFzeW5jVG9rZW4sIFRva2VuIHN0YXJ0VG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkFzeW5jTW9kaWZpZXIiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVG9wTGV2ZWxNZXRob2QoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZ2V0T3JTZXQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJUb3BMZXZlbE1ldGhvZCIpOwogICAgVG9rZW4gYm9keVRva2VuID0gcG9wKCk7CiAgICBPYmplY3QgbmFtZSA9IHBvcCgpOwogICAgVG9rZW4gbWV0YWRhdGEgPSBwb3AoKTsKICAgIGNoZWNrRW1wdHkoYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0KTsKICAgIGlmIChuYW1lIGlzIFBhcnNlclJlY292ZXJ5KSByZXR1cm47CgogICAgZmluYWwgU3RhY2tMaXN0ZW5lciBsaXN0ZW5lciA9CiAgICAgICAgY3JlYXRlRnVuY3Rpb25MaXN0ZW5lcihsb29rdXBCdWlsZGVyKGJlZ2luVG9rZW4sIGdldE9yU2V0LCBuYW1lKSk7CiAgICBidWlsZEZ1bmN0aW9uQm9keShsaXN0ZW5lciwgYm9keVRva2VuLCBtZXRhZGF0YSwgTWVtYmVyS2luZC5Ub3BMZXZlbE1ldGhvZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vRnVuY3Rpb25Cb2R5KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb0Z1bmN0aW9uQm9keSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRUb3BMZXZlbEZpZWxkcyhUb2tlbiBzdGF0aWNUb2tlbiwgVG9rZW4gY292YXJpYW50VG9rZW4sCiAgICAgIFRva2VuIHZhckZpbmFsT3JDb25zdCwgaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiVG9wTGV2ZWxGaWVsZHMiKTsKICAgIGJ1aWxkRmllbGRzKGNvdW50LCBiZWdpblRva2VuLCB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVm9pZEtleXdvcmQoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlZvaWRLZXl3b3JkIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vSW5pdGlhbGl6ZXJzKCkgewogICAgZGVidWdFdmVudCgiTm9Jbml0aWFsaXplcnMiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kSW5pdGlhbGl6ZXJzKGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkluaXRpYWxpemVycyIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVRdWFsaWZpZWQoVG9rZW4gcGVyaW9kKSB7CiAgICBkZWJ1Z0V2ZW50KCJoYW5kbGVRdWFsaWZpZWQiKTsKICAgIE9iamVjdCBzdWZmaXggPSBwb3AoKTsKICAgIE9iamVjdCBwcmVmaXggPSBwb3AoKTsKICAgIGlmIChwcmVmaXggaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHVzaChwcmVmaXgpOwogICAgfSBlbHNlIGlmIChzdWZmaXggaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHVzaChzdWZmaXgpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KGlkZW50aWNhbChzdWZmaXgsIHBlcmlvZC5uZXh0LmxleGVtZSkpOwogICAgICBwdXNoKG5ldyBRdWFsaWZpZWROYW1lKHByZWZpeCwgcGVyaW9kLm5leHQpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTGlicmFyeU5hbWUoVG9rZW4gbGlicmFyeUtleXdvcmQsIFRva2VuIHNlbWljb2xvbikgewogICAgZGVidWdFdmVudCgiZW5kTGlicmFyeU5hbWUiKTsKICAgIHBvcCgpOyAvLyBuYW1lCgogICAgVG9rZW4gbWV0YWRhdGEgPSBwb3AoKTsKICAgIHBhcnNlTWV0YWRhdGEobGlicmFyeSwgbWV0YWRhdGEsIGxpYnJhcnkudGFyZ2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5MaXRlcmFsU3RyaW5nKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkxpdGVyYWxTdHJpbmciKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU3RyaW5nUGFydChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiU3RyaW5nUGFydCIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRMaXRlcmFsU3RyaW5nKGludCBpbnRlcnBvbGF0aW9uQ291bnQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRMaXRlcmFsU3RyaW5nIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5hdGl2ZUNsYXVzZShUb2tlbiBuYXRpdmVUb2tlbiwgYm9vbCBoYXNOYW1lKSB7CiAgICBkZWJ1Z0V2ZW50KCJOYXRpdmVDbGF1c2UiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU2NyaXB0KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJTY3JpcHQiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU3RyaW5nSnV4dGFwb3NpdGlvbihpbnQgbGl0ZXJhbENvdW50KSB7CiAgICBkZWJ1Z0V2ZW50KCJTdHJpbmdKdXh0YXBvc2l0aW9uIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZURvdHRlZE5hbWUoaW50IGNvdW50LCBUb2tlbiBmaXJzdElkZW50aWZpZXIpIHsKICAgIGRlYnVnRXZlbnQoIkRvdHRlZE5hbWUiKTsKICAgIGRpc2NhcmQoY291bnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDb25kaXRpb25hbFVyaShUb2tlbiBpZktleXdvcmQsIFRva2VuIGxlZnRQYXJlbiwgVG9rZW4gZXF1YWxTaWduKSB7CiAgICBkZWJ1Z0V2ZW50KCJDb25kaXRpb25hbFVyaSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDb25kaXRpb25hbFVyaXMoaW50IGNvdW50KSB7CiAgICBkZWJ1Z0V2ZW50KCJDb25kaXRpb25hbFVyaXMiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlT3BlcmF0b3JOYW1lKFRva2VuIG9wZXJhdG9yS2V5d29yZCwgVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIk9wZXJhdG9yTmFtZSIpOwogICAgcHVzaCh0b2tlbi5zdHJpbmdWYWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRPcGVyYXRvck5hbWUoVG9rZW4gb3BlcmF0b3JLZXl3b3JkLCBUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiSW52YWxpZE9wZXJhdG9yTmFtZSIpOwogICAgcHVzaCgnaW52YWxpZCcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJZGVudGlmaWVyTGlzdChpbnQgY291bnQpIHsKICAgIGRlYnVnRXZlbnQoIklkZW50aWZpZXJMaXN0Iik7CiAgICBkaXNjYXJkKGNvdW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kU2hvdyhUb2tlbiBzaG93S2V5d29yZCkgewogICAgZGVidWdFdmVudCgiU2hvdyIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRIaWRlKFRva2VuIGhpZGVLZXl3b3JkKSB7CiAgICBkZWJ1Z0V2ZW50KCJIaWRlIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENvbWJpbmF0b3JzKGludCBjb3VudCkgewogICAgZGVidWdFdmVudCgiQ29tYmluYXRvcnMiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW1wb3J0UHJlZml4KFRva2VuIGRlZmVycmVkS2V5d29yZCwgVG9rZW4gYXNLZXl3b3JkKSB7CiAgICBkZWJ1Z0V2ZW50KCJJbXBvcnRQcmVmaXgiKTsKICAgIHB1c2hJZk51bGwoYXNLZXl3b3JkLCBOdWxsVmFsdWUuUHJlZml4KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kSW1wb3J0KFRva2VuIGltcG9ydEtleXdvcmQsIFRva2VuIHNlbWljb2xvbikgewogICAgZGVidWdFdmVudCgiSW1wb3J0Iik7CiAgICBPYmplY3QgbmFtZSA9IHBvcChOdWxsVmFsdWUuUHJlZml4KTsKCiAgICBUb2tlbiBtZXRhZGF0YSA9IHBvcCgpOwogICAgY2hlY2tFbXB0eShpbXBvcnRLZXl3b3JkLmNoYXJPZmZzZXQpOwogICAgaWYgKG5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkpIHJldHVybjsKCiAgICAvLyBOYXRpdmUgaW1wb3J0cyBtdXN0IGJlIHNraXBwZWQgYmVjYXVzZSB0aGV5IGFyZW4ndCBhc3NpZ25lZCBjb3JyZXNwb25kaW5nCiAgICAvLyBMaWJyYXJ5RGVwZW5kZW5jeSBub2Rlcy4KICAgIFRva2VuIGltcG9ydFVyaVRva2VuID0gaW1wb3J0S2V5d29yZC5uZXh0OwogICAgU3RyaW5nIGltcG9ydFVyaSA9CiAgICAgICAgdW5lc2NhcGVTdHJpbmcoaW1wb3J0VXJpVG9rZW4ubGV4ZW1lLCBpbXBvcnRVcmlUb2tlbiwgdGhpcyk7CiAgICBpZiAoaW1wb3J0VXJpLnN0YXJ0c1dpdGgoImRhcnQtZXh0OiIpKSByZXR1cm47CgogICAgTGlicmFyeSBsaWJyYXJ5Tm9kZSA9IGxpYnJhcnkudGFyZ2V0OwogICAgTGlicmFyeURlcGVuZGVuY3kgZGVwZW5kZW5jeSA9CiAgICAgICAgbGlicmFyeU5vZGUuZGVwZW5kZW5jaWVzW2ltcG9ydEV4cG9ydERpcmVjdGl2ZUluZGV4KytdOwogICAgcGFyc2VNZXRhZGF0YShsaWJyYXJ5LCBtZXRhZGF0YSwgZGVwZW5kZW5jeSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVJlY292ZXJJbXBvcnQoVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBwb3AoTnVsbFZhbHVlLlByZWZpeCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEV4cG9ydChUb2tlbiBleHBvcnRLZXl3b3JkLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGRlYnVnRXZlbnQoIkV4cG9ydCIpOwoKICAgIFRva2VuIG1ldGFkYXRhID0gcG9wKCk7CiAgICBMaWJyYXJ5IGxpYnJhcnlOb2RlID0gbGlicmFyeS50YXJnZXQ7CiAgICBMaWJyYXJ5RGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0KICAgICAgICBsaWJyYXJ5Tm9kZS5kZXBlbmRlbmNpZXNbaW1wb3J0RXhwb3J0RGlyZWN0aXZlSW5kZXgrK107CiAgICBwYXJzZU1ldGFkYXRhKGxpYnJhcnksIG1ldGFkYXRhLCBkZXBlbmRlbmN5KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kUGFydChUb2tlbiBwYXJ0S2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJQYXJ0Iik7CgogICAgVG9rZW4gbWV0YWRhdGEgPSBwb3AoKTsKICAgIExpYnJhcnkgbGlicmFyeU5vZGUgPSBsaWJyYXJ5LnRhcmdldDsKICAgIExpYnJhcnlQYXJ0IHBhcnQgPSBsaWJyYXJ5Tm9kZS5wYXJ0c1twYXJ0RGlyZWN0aXZlSW5kZXgrK107CiAgICBwYXJzZU1ldGFkYXRhKGxpYnJhcnksIG1ldGFkYXRhLCBwYXJ0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5UeXBlVmFyaWFibGUoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luVHlwZVZhcmlhYmxlIik7CiAgICBkaXNjYXJkKDIpOyAvLyBOYW1lIGFuZCBtZXRhZGF0YS4KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVHlwZVZhcmlhYmxlKFRva2VuIHRva2VuLCBpbnQgaW5kZXgsIFRva2VuIGV4dGVuZHNPclN1cGVyKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRUeXBlVmFyaWFibGUiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVHlwZVZhcmlhYmxlcyhUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiVHlwZVZhcmlhYmxlcyIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDb25zdHJ1Y3RvclJlZmVyZW5jZSgKICAgICAgVG9rZW4gc3RhcnQsIFRva2VuIHBlcmlvZEJlZm9yZU5hbWUsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJDb25zdHJ1Y3RvclJlZmVyZW5jZSIpOwogICAgcG9wSWZOb3ROdWxsKHBlcmlvZEJlZm9yZU5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGYWN0b3J5TWV0aG9kKAogICAgICBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBmYWN0b3J5S2V5d29yZCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkZhY3RvcnlNZXRob2QiKTsKICAgIFRva2VuIGJvZHlUb2tlbiA9IHBvcCgpOwogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIFRva2VuIG1ldGFkYXRhID0gcG9wKCk7CiAgICBjaGVja0VtcHR5KGJlZ2luVG9rZW4uY2hhck9mZnNldCk7CiAgICBpZiAobmFtZSBpcyBQYXJzZXJSZWNvdmVyeSB8fCBjdXJyZW50Q2xhc3NJc1BhcnNlclJlY292ZXJ5KSByZXR1cm47CgogICAgUHJvY2VkdXJlQnVpbGRlciBidWlsZGVyID0gbG9va3VwQ29uc3RydWN0b3IoYmVnaW5Ub2tlbiwgbmFtZSk7CiAgICBpZiAoYm9keVRva2VuID09IG51bGwgfHwgb3B0aW9uYWwoIj0iLCBib2R5VG9rZW4uZW5kR3JvdXAubmV4dCkpIHsKICAgICAgcGFyc2VNZXRhZGF0YShidWlsZGVyLCBtZXRhZGF0YSwgYnVpbGRlci50YXJnZXQpOwogICAgICBidWlsZFJlZGlyZWN0aW5nRmFjdG9yeU1ldGhvZCgKICAgICAgICAgIGJvZHlUb2tlbiwgYnVpbGRlciwgTWVtYmVyS2luZC5GYWN0b3J5LCBtZXRhZGF0YSk7CiAgICB9IGVsc2UgewogICAgICBidWlsZEZ1bmN0aW9uQm9keShjcmVhdGVGdW5jdGlvbkxpc3RlbmVyKGJ1aWxkZXIpLCBib2R5VG9rZW4sIG1ldGFkYXRhLAogICAgICAgICAgTWVtYmVyS2luZC5GYWN0b3J5KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kUmVkaXJlY3RpbmdGYWN0b3J5Qm9keShUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiUmVkaXJlY3RpbmdGYWN0b3J5Qm9keSIpOwogICAgZGlzY2FyZCgxKTsgLy8gQ29uc3RydWN0b3JSZWZlcmVuY2UuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keShUb2tlbiBuYXRpdmVUb2tlbiwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJOYXRpdmVGdW5jdGlvbkJvZHkiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTmF0aXZlRnVuY3Rpb25Cb2R5SWdub3JlZChUb2tlbiBuYXRpdmVUb2tlbiwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJOYXRpdmVGdW5jdGlvbkJvZHlJZ25vcmVkIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keVNraXBwZWQoVG9rZW4gbmF0aXZlVG9rZW4sIFRva2VuIHNlbWljb2xvbikgewogICAgZGVidWdFdmVudCgiTmF0aXZlRnVuY3Rpb25Cb2R5U2tpcHBlZCIpOwogICAgaWYgKCFlbmFibGVOYXRpdmUpIHsKICAgICAgc3VwZXIuaGFuZGxlUmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIG1lc3NhZ2VFeHBlY3RlZEJsb2NrVG9Ta2lwLCBuYXRpdmVUb2tlbiwgbmF0aXZlVG9rZW4pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRNZXRob2QoCiAgICAgIFRva2VuIGdldE9yU2V0LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBiZWdpblBhcmFtLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiTWV0aG9kIik7CiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogQ29uc2lkZXIgcmVtb3ZpbmcgdGhlIGJlZ2luUGFyYW0gcGFyYW1ldGVyCiAgICAvLyBhbmQgdXNpbmcgYm9keVRva2VuLCBidXQgcHVzaGluZyBhIE51bGxWYWx1ZSBvbiB0aGUgc3RhY2sKICAgIC8vIGluIGhhbmRsZU5vRm9ybWFsUGFyYW1ldGVycyByYXRoZXIgdGhhbiB0aGUgc3VwcGxpZWQgdG9rZW4uCiAgICBwb3AoKTsgLy8gYm9keVRva2VuCiAgICBPYmplY3QgbmFtZSA9IHBvcCgpOwogICAgVG9rZW4gbWV0YWRhdGEgPSBwb3AoKTsKICAgIGNoZWNrRW1wdHkoYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0KTsKICAgIGlmIChuYW1lIGlzIFBhcnNlclJlY292ZXJ5IHx8IGN1cnJlbnRDbGFzc0lzUGFyc2VyUmVjb3ZlcnkpIHJldHVybjsKICAgIFByb2NlZHVyZUJ1aWxkZXIgYnVpbGRlcjsKICAgIGlmIChuYW1lIGlzIFF1YWxpZmllZE5hbWUgfHwKICAgICAgICAoZ2V0T3JTZXQgPT0gbnVsbCAmJiBuYW1lID09IGN1cnJlbnRDbGFzcy5uYW1lKSkgewogICAgICBidWlsZGVyID0gbG9va3VwQ29uc3RydWN0b3IoYmVnaW5Ub2tlbiwgbmFtZSk7CiAgICB9IGVsc2UgewogICAgICBidWlsZGVyID0gbG9va3VwQnVpbGRlcihiZWdpblRva2VuLCBnZXRPclNldCwgbmFtZSk7CiAgICB9CiAgICBidWlsZEZ1bmN0aW9uQm9keSgKICAgICAgICBjcmVhdGVGdW5jdGlvbkxpc3RlbmVyKGJ1aWxkZXIpLAogICAgICAgIGJlZ2luUGFyYW0sCiAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgYnVpbGRlci5pc1N0YXRpYwogICAgICAgICAgICA/IE1lbWJlcktpbmQuU3RhdGljTWV0aG9kCiAgICAgICAgICAgIDogTWVtYmVyS2luZC5Ob25TdGF0aWNNZXRob2QpOwogIH0KCiAgU3RhY2tMaXN0ZW5lciBjcmVhdGVMaXN0ZW5lcigKICAgICAgTW9kaWZpZXJCdWlsZGVyIGJ1aWxkZXIsIFNjb3BlIG1lbWJlclNjb3BlLCBib29sIGlzSW5zdGFuY2VNZW1iZXIsCiAgICAgIFtTY29wZSBmb3JtYWxQYXJhbWV0ZXJTY29wZV0pIHsKICAgIC8vIE5vdGU6IHdlIHNldCB0aGlzVHlwZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2UgYXJlIGJ1aWxkaW5nIGEgc3RhdGljCiAgICAvLyBtZW1iZXIsIHNpbmNlIHRoYXQgcHJvdmlkZXMgYmV0dGVyIGVycm9yIHJlY292ZXJ5LgogICAgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZSA9IGN1cnJlbnRDbGFzcz8udGFyZ2V0Py50aGlzVHlwZTsKICAgIHZhciB0eXBlSW5mZXJyZXIgPQogICAgICAgIHR5cGVJbmZlcmVuY2VFbmdpbmU/LmNyZWF0ZUxvY2FsVHlwZUluZmVycmVyKHVyaSwgdGhpc1R5cGUsIGxpYnJhcnkpOwogICAgQ29uc3RhbnRDb250ZXh0IGNvbnN0YW50Q29udGV4dCA9IGJ1aWxkZXIuaXNDb25zdHJ1Y3RvciAmJiBidWlsZGVyLmlzQ29uc3QKICAgICAgICA/IENvbnN0YW50Q29udGV4dC5pbmZlcnJlZAogICAgICAgIDogQ29uc3RhbnRDb250ZXh0Lm5vbmU7CiAgICByZXR1cm4gbmV3IEtlcm5lbEJvZHlCdWlsZGVyKAogICAgICAgIGxpYnJhcnksCiAgICAgICAgYnVpbGRlciwKICAgICAgICBtZW1iZXJTY29wZSwKICAgICAgICBmb3JtYWxQYXJhbWV0ZXJTY29wZSwKICAgICAgICBoaWVyYXJjaHksCiAgICAgICAgY29yZVR5cGVzLAogICAgICAgIGN1cnJlbnRDbGFzcywKICAgICAgICBpc0luc3RhbmNlTWVtYmVyLAogICAgICAgIHVyaSwKICAgICAgICB0eXBlSW5mZXJyZXIpCiAgICAgIC4uY29uc3RhbnRDb250ZXh0ID0gY29uc3RhbnRDb250ZXh0OwogIH0KCiAgU3RhY2tMaXN0ZW5lciBjcmVhdGVGdW5jdGlvbkxpc3RlbmVyKFByb2NlZHVyZUJ1aWxkZXIgYnVpbGRlcikgewogICAgZmluYWwgU2NvcGUgdHlwZVBhcmFtZXRlclNjb3BlID0KICAgICAgICBidWlsZGVyLmNvbXB1dGVUeXBlUGFyYW1ldGVyU2NvcGUobWVtYmVyU2NvcGUpOwogICAgZmluYWwgU2NvcGUgZm9ybWFsUGFyYW1ldGVyU2NvcGUgPQogICAgICAgIGJ1aWxkZXIuY29tcHV0ZUZvcm1hbFBhcmFtZXRlclNjb3BlKHR5cGVQYXJhbWV0ZXJTY29wZSk7CiAgICBhc3NlcnQodHlwZVBhcmFtZXRlclNjb3BlICE9IG51bGwpOwogICAgYXNzZXJ0KGZvcm1hbFBhcmFtZXRlclNjb3BlICE9IG51bGwpOwogICAgcmV0dXJuIGNyZWF0ZUxpc3RlbmVyKGJ1aWxkZXIsIHR5cGVQYXJhbWV0ZXJTY29wZSwgYnVpbGRlci5pc0luc3RhbmNlTWVtYmVyLAogICAgICAgIGZvcm1hbFBhcmFtZXRlclNjb3BlKTsKICB9CgogIHZvaWQgYnVpbGRSZWRpcmVjdGluZ0ZhY3RvcnlNZXRob2QoCiAgICAgIFRva2VuIHRva2VuLCBQcm9jZWR1cmVCdWlsZGVyIGJ1aWxkZXIsIE1lbWJlcktpbmQga2luZCwgVG9rZW4gbWV0YWRhdGEpIHsKICAgIGZpbmFsIFN0YWNrTGlzdGVuZXIgbGlzdGVuZXIgPSBjcmVhdGVGdW5jdGlvbkxpc3RlbmVyKGJ1aWxkZXIpOwogICAgdHJ5IHsKICAgICAgUGFyc2VyIHBhcnNlciA9IG5ldyBQYXJzZXIobGlzdGVuZXIpOwogICAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCkgewogICAgICAgIHBhcnNlci5wYXJzZU1ldGFkYXRhU3RhcihwYXJzZXIuc3ludGhldGljUHJldmlvdXNUb2tlbihtZXRhZGF0YSkpOwogICAgICAgIGxpc3RlbmVyLnBvcCgpOyAvLyBQb3BzIG1ldGFkYXRhIGNvbnN0YW50cy4KICAgICAgfQoKICAgICAgdG9rZW4gPSBwYXJzZXIucGFyc2VGb3JtYWxQYXJhbWV0ZXJzT3B0KAogICAgICAgICAgcGFyc2VyLnN5bnRoZXRpY1ByZXZpb3VzVG9rZW4odG9rZW4pLCBNZW1iZXJLaW5kLkZhY3RvcnkpOwogICAgICBsaXN0ZW5lci5wb3AoKTsgLy8gUG9wcyBmb3JtYWwgcGFyYW1ldGVycy4KICAgICAgbGlzdGVuZXIuY2hlY2tFbXB0eSh0b2tlbi5uZXh0LmNoYXJPZmZzZXQpOwogICAgfSBvbiBEZWJ1Z0Fib3J0IHsKICAgICAgcmV0aHJvdzsKICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgdGhyb3cgbmV3IENyYXNoKHVyaSwgdG9rZW4uY2hhck9mZnNldCwgZSwgcyk7CiAgICB9CiAgfQoKICB2b2lkIGJ1aWxkRmllbGRzKGludCBjb3VudCwgVG9rZW4gdG9rZW4sIGJvb2wgaXNUb3BMZXZlbCkgewogICAgTGlzdDxTdHJpbmc+IG5hbWVzID0gY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8U3RyaW5nPigpLnBvcChzdGFjaywgY291bnQpOwogICAgVG9rZW4gbWV0YWRhdGEgPSBwb3AoKTsKICAgIGNoZWNrRW1wdHkodG9rZW4uY2hhck9mZnNldCk7CiAgICBpZiAobmFtZXMgPT0gbnVsbCB8fCBjdXJyZW50Q2xhc3NJc1BhcnNlclJlY292ZXJ5KSByZXR1cm47CgogICAgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBsb29rdXBCdWlsZGVyKHRva2VuLCBudWxsLCBuYW1lcy5maXJzdCk7CiAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IGRvbid0IHJlLXBhcnNlIHRoZSBmaWVsZCBpZiB3ZSd2ZSBhbHJlYWR5IHBhcnNlZCBpdAogICAgLy8gZm9yIHR5cGUgaW5mZXJlbmNlLgogICAgcGFyc2VGaWVsZHMoCiAgICAgICAgY3JlYXRlTGlzdGVuZXIoZGVjbGFyYXRpb24sIG1lbWJlclNjb3BlLCBkZWNsYXJhdGlvbi5pc0luc3RhbmNlTWVtYmVyKSwKICAgICAgICB0b2tlbiwKICAgICAgICBtZXRhZGF0YSwKICAgICAgICBpc1RvcExldmVsKTsKICAgIGNoZWNrRW1wdHkodG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRNZW1iZXIoVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkludmFsaWRNZW1iZXIiKTsKICAgIHBvcCgpOyAvLyBtZXRhZGF0YSBzdGFyCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE1lbWJlcigpIHsKICAgIGRlYnVnRXZlbnQoIk1lbWJlciIpOwogICAgY2hlY2tFbXB0eSgtMSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEFzc2VydChUb2tlbiBhc3NlcnRLZXl3b3JkLCBBc3NlcnQga2luZCwgVG9rZW4gbGVmdFBhcmVudGhlc2lzLAogICAgICBUb2tlbiBjb21tYVRva2VuLCBUb2tlbiBzZW1pY29sb25Ub2tlbikgewogICAgZGVidWdFdmVudCgiQXNzZXJ0Iik7CiAgICAvLyBEbyBub3RoaW5nCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTWl4aW5EZWNsYXJhdGlvbihUb2tlbiBtaXhpbktleXdvcmQsIFRva2VuIG5hbWUpIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luTWl4aW5EZWNsYXJhdGlvbiIpOwogICAgcHVzaChtaXhpbktleXdvcmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkNsYXNzRGVjbGFyYXRpb24oVG9rZW4gYmVnaW4sIFRva2VuIGFic3RyYWN0VG9rZW4sIFRva2VuIG5hbWUpIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luQ2xhc3NEZWNsYXJhdGlvbiIpOwogICAgcHVzaChiZWdpbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ2xhc3NPck1peGluQm9keShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5DbGFzc09yTWl4aW5Cb2R5Iik7CiAgICBUb2tlbiBiZWdpblRva2VuID0gcG9wKCk7CiAgICBPYmplY3QgbmFtZSA9IHBvcCgpOwogICAgVG9rZW4gbWV0YWRhdGEgPSBwb3AoKTsKICAgIGFzc2VydChjdXJyZW50Q2xhc3MgPT0gbnVsbCk7CiAgICBhc3NlcnQobWVtYmVyU2NvcGUgPT0gbGlicmFyeS5zY29wZSk7CiAgICBpZiAobmFtZSBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBjdXJyZW50Q2xhc3NJc1BhcnNlclJlY292ZXJ5ID0gdHJ1ZTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIERlY2xhcmF0aW9uIGNsYXNzQnVpbGRlciA9IGxvb2t1cEJ1aWxkZXIoYmVnaW5Ub2tlbiwgbnVsbCwgbmFtZSk7CiAgICBwYXJzZU1ldGFkYXRhKGNsYXNzQnVpbGRlciwgbWV0YWRhdGEsIGNsYXNzQnVpbGRlci50YXJnZXQpOwoKICAgIGN1cnJlbnRDbGFzcyA9IGNsYXNzQnVpbGRlcjsKICAgIG1lbWJlclNjb3BlID0gY3VycmVudENsYXNzLnNjb3BlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDbGFzc09yTWl4aW5Cb2R5KGludCBtZW1iZXJDb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkNsYXNzT3JNaXhpbkJvZHkiKTsKICAgIGN1cnJlbnRDbGFzcyA9IG51bGw7CiAgICBjdXJyZW50Q2xhc3NJc1BhcnNlclJlY292ZXJ5ID0gZmFsc2U7CiAgICBtZW1iZXJTY29wZSA9IGxpYnJhcnkuc2NvcGU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENsYXNzRGVjbGFyYXRpb24oVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkNsYXNzRGVjbGFyYXRpb24iKTsKICAgIGNoZWNrRW1wdHkoYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTWl4aW5EZWNsYXJhdGlvbihUb2tlbiBtaXhpbktleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJNaXhpbkRlY2xhcmF0aW9uIik7CiAgICBjaGVja0VtcHR5KG1peGluS2V5d29yZC5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRW51bShUb2tlbiBlbnVtS2V5d29yZCwgVG9rZW4gbGVmdEJyYWNlLCBpbnQgY291bnQpIHsKICAgIGRlYnVnRXZlbnQoIkVudW0iKTsKICAgIExpc3Q8T2JqZWN0PiBtZXRhZGF0YUFuZFZhbHVlcyA9CiAgICAgICAgY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8T2JqZWN0PigpLnBvcChzdGFjaywgY291bnQgKiAyKTsKICAgIE9iamVjdCBuYW1lID0gcG9wKCk7CiAgICBUb2tlbiBtZXRhZGF0YSA9IHBvcCgpOwogICAgY2hlY2tFbXB0eShlbnVtS2V5d29yZC5jaGFyT2Zmc2V0KTsKICAgIGlmIChuYW1lIGlzIFBhcnNlclJlY292ZXJ5KSByZXR1cm47CgogICAgQ2xhc3NCdWlsZGVyIGVudW1CdWlsZGVyID0gbG9va3VwQnVpbGRlcihlbnVtS2V5d29yZCwgbnVsbCwgbmFtZSk7CiAgICBwYXJzZU1ldGFkYXRhKGVudW1CdWlsZGVyLCBtZXRhZGF0YSwgZW51bUJ1aWxkZXIudGFyZ2V0KTsKICAgIGlmIChtZXRhZGF0YUFuZFZhbHVlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0YWRhdGFBbmRWYWx1ZXMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICBUb2tlbiBtZXRhZGF0YSA9IG1ldGFkYXRhQW5kVmFsdWVzW2ldOwogICAgICAgIFN0cmluZyB2YWx1ZU5hbWUgPSBtZXRhZGF0YUFuZFZhbHVlc1tpICsgMV07CiAgICAgICAgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBlbnVtQnVpbGRlci5zY29wZS5sb2NhbFt2YWx1ZU5hbWVdOwogICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsKSB7CiAgICAgICAgICBwYXJzZU1ldGFkYXRhKGRlY2xhcmF0aW9uLCBtZXRhZGF0YSwgZGVjbGFyYXRpb24udGFyZ2V0KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBjaGVja0VtcHR5KGVudW1LZXl3b3JkLmNoYXJPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmROYW1lZE1peGluQXBwbGljYXRpb24oVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gY2xhc3NLZXl3b3JkLAogICAgICBUb2tlbiBlcXVhbHMsIFRva2VuIGltcGxlbWVudHNLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiTmFtZWRNaXhpbkFwcGxpY2F0aW9uIik7CgogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIFRva2VuIG1ldGFkYXRhID0gcG9wKCk7CiAgICBjaGVja0VtcHR5KGJlZ2luVG9rZW4uY2hhck9mZnNldCk7CiAgICBpZiAobmFtZSBpcyBQYXJzZXJSZWNvdmVyeSkgcmV0dXJuOwoKICAgIERlY2xhcmF0aW9uIGNsYXNzQnVpbGRlciA9IGxpYnJhcnkuc2NvcGVCdWlsZGVyW25hbWVdOwogICAgaWYgKGNsYXNzQnVpbGRlciAhPSBudWxsKSB7CiAgICAgIC8vIFRPRE8oYWhlKTogV2Ugc2hvdWxkbid0IGhhdmUgdG8gY2hlY2sgZm9yIG51bGwgaGVyZS4gVGhlIHByb2JsZW0gaXMKICAgICAgLy8gdGhhdCB3ZSBkb24ndCBjcmVhdGUgYSBuYW1lZCBtaXhpbiBhcHBsaWNhdGlvbiBpZiB0aGUgbWl4aW5zIG9yCiAgICAgIC8vIHN1cGVydHlwZSBhcmUgbWlzc2luZy4gQ291bGQgd2UgY3JlYXRlIGEgY2xhc3MgaW5zdGVhZD8gVGhlIG5lc3RlZAogICAgICAvLyBkZWNsYXJhdGlvbnMgd291bGRuJ3QgbWF0Y2ggdXAuCiAgICAgIHBhcnNlTWV0YWRhdGEoY2xhc3NCdWlsZGVyLCBtZXRhZGF0YSwgY2xhc3NCdWlsZGVyLnRhcmdldCk7CiAgICAgIGNoZWNrRW1wdHkoYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0KTsKICAgIH0KICB9CgogIEFzeW5jTWFya2VyIGdldEFzeW5jTWFya2VyKFN0YWNrTGlzdGVuZXIgbGlzdGVuZXIpID0+IGxpc3RlbmVyLnBvcCgpOwoKICAvLy8gSW52b2tlcyB0aGUgbGlzdGVuZXIncyBbZmluaXNoRnVuY3Rpb25dIG1ldGhvZC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIHNlcGFyYXRlIG1ldGhvZCBzbyB0aGF0IGl0IG1heSBiZSBvdmVycmlkZGVuIGJ5IGEgZGVyaXZlZCBjbGFzcwogIC8vLyBpZiBtb3JlIGNvbXB1dGF0aW9uIG11c3QgYmUgZG9uZSBiZWZvcmUgZmluaXNoaW5nIHRoZSBmdW5jdGlvbi4KICB2b2lkIGxpc3RlbmVyRmluaXNoRnVuY3Rpb24oCiAgICAgIFN0YWNrTGlzdGVuZXIgbGlzdGVuZXIsCiAgICAgIFRva2VuIHRva2VuLAogICAgICBUb2tlbiBtZXRhZGF0YSwKICAgICAgTWVtYmVyS2luZCBraW5kLAogICAgICBMaXN0IG1ldGFkYXRhQ29uc3RhbnRzLAogICAgICBkeW5hbWljIGZvcm1hbHMsCiAgICAgIEFzeW5jTWFya2VyIGFzeW5jTW9kaWZpZXIsCiAgICAgIGR5bmFtaWMgYm9keSkgewogICAgbGlzdGVuZXIuZmluaXNoRnVuY3Rpb24obWV0YWRhdGFDb25zdGFudHMsIGZvcm1hbHMsIGFzeW5jTW9kaWZpZXIsIGJvZHkpOwogIH0KCiAgLy8vIEludm9rZXMgdGhlIGxpc3RlbmVyJ3MgW2ZpbmlzaEZpZWxkc10gbWV0aG9kLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgc2VwYXJhdGUgbWV0aG9kIHNvIHRoYXQgaXQgbWF5IGJlIG92ZXJyaWRkZW4gYnkgYSBkZXJpdmVkIGNsYXNzCiAgLy8vIGlmIG1vcmUgY29tcHV0YXRpb24gbXVzdCBiZSBkb25lIGJlZm9yZSBmaW5pc2hpbmcgdGhlIGZ1bmN0aW9uLgogIHZvaWQgbGlzdGVuZXJGaW5pc2hGaWVsZHMoU3RhY2tMaXN0ZW5lciBsaXN0ZW5lciwgVG9rZW4gc3RhcnRUb2tlbiwKICAgICAgVG9rZW4gbWV0YWRhdGEsIGJvb2wgaXNUb3BMZXZlbCkgewogICAgbGlzdGVuZXIuZmluaXNoRmllbGRzKCk7CiAgfQoKICB2b2lkIGJ1aWxkRnVuY3Rpb25Cb2R5KFN0YWNrTGlzdGVuZXIgbGlzdGVuZXIsIFRva2VuIHN0YXJ0VG9rZW4sCiAgICAgIFRva2VuIG1ldGFkYXRhLCBNZW1iZXJLaW5kIGtpbmQpIHsKICAgIFRva2VuIHRva2VuID0gc3RhcnRUb2tlbjsKICAgIHRyeSB7CiAgICAgIFBhcnNlciBwYXJzZXIgPSBuZXcgUGFyc2VyKGxpc3RlbmVyKTsKICAgICAgTGlzdCBtZXRhZGF0YUNvbnN0YW50czsKICAgICAgaWYgKG1ldGFkYXRhICE9IG51bGwpIHsKICAgICAgICBwYXJzZXIucGFyc2VNZXRhZGF0YVN0YXIocGFyc2VyLnN5bnRoZXRpY1ByZXZpb3VzVG9rZW4obWV0YWRhdGEpKTsKICAgICAgICBtZXRhZGF0YUNvbnN0YW50cyA9IGxpc3RlbmVyLnBvcCgpOwogICAgICB9CiAgICAgIHRva2VuID0gcGFyc2VyLnBhcnNlRm9ybWFsUGFyYW1ldGVyc09wdCgKICAgICAgICAgIHBhcnNlci5zeW50aGV0aWNQcmV2aW91c1Rva2VuKHRva2VuKSwga2luZCk7CiAgICAgIHZhciBmb3JtYWxzID0gbGlzdGVuZXIucG9wKCk7CiAgICAgIGxpc3RlbmVyLmNoZWNrRW1wdHkodG9rZW4ubmV4dC5jaGFyT2Zmc2V0KTsKICAgICAgdG9rZW4gPSBwYXJzZXIucGFyc2VJbml0aWFsaXplcnNPcHQodG9rZW4pOwogICAgICB0b2tlbiA9IHBhcnNlci5wYXJzZUFzeW5jTW9kaWZpZXJPcHQodG9rZW4pOwogICAgICBBc3luY01hcmtlciBhc3luY01vZGlmaWVyID0gZ2V0QXN5bmNNYXJrZXIobGlzdGVuZXIpID8/IEFzeW5jTWFya2VyLlN5bmM7CiAgICAgIGJvb2wgaXNFeHByZXNzaW9uID0gZmFsc2U7CiAgICAgIGJvb2wgYWxsb3dBYnN0cmFjdCA9IGFzeW5jTW9kaWZpZXIgPT0gQXN5bmNNYXJrZXIuU3luYzsKICAgICAgcGFyc2VyLnBhcnNlRnVuY3Rpb25Cb2R5KHRva2VuLCBpc0V4cHJlc3Npb24sIGFsbG93QWJzdHJhY3QpOwogICAgICB2YXIgYm9keSA9IGxpc3RlbmVyLnBvcCgpOwogICAgICBsaXN0ZW5lci5jaGVja0VtcHR5KHRva2VuLmNoYXJPZmZzZXQpOwogICAgICBsaXN0ZW5lckZpbmlzaEZ1bmN0aW9uKGxpc3RlbmVyLCBzdGFydFRva2VuLCBtZXRhZGF0YSwga2luZCwKICAgICAgICAgIG1ldGFkYXRhQ29uc3RhbnRzLCBmb3JtYWxzLCBhc3luY01vZGlmaWVyLCBib2R5KTsKICAgIH0gb24gRGVidWdBYm9ydCB7CiAgICAgIHJldGhyb3c7CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIHRocm93IG5ldyBDcmFzaCh1cmksIHRva2VuLmNoYXJPZmZzZXQsIGUsIHMpOwogICAgfQogIH0KCiAgdm9pZCBwYXJzZUZpZWxkcyhTdGFja0xpc3RlbmVyIGxpc3RlbmVyLCBUb2tlbiBzdGFydFRva2VuLCBUb2tlbiBtZXRhZGF0YSwKICAgICAgYm9vbCBpc1RvcExldmVsKSB7CiAgICBUb2tlbiB0b2tlbiA9IHN0YXJ0VG9rZW47CiAgICBQYXJzZXIgcGFyc2VyID0gbmV3IFBhcnNlcihsaXN0ZW5lcik7CiAgICBpZiAoaXNUb3BMZXZlbCkgewogICAgICB0b2tlbiA9IHBhcnNlci5wYXJzZVRvcExldmVsTWVtYmVyKG1ldGFkYXRhID8/IHRva2VuKTsKICAgIH0gZWxzZSB7CiAgICAgIHRva2VuID0gcGFyc2VyLnBhcnNlQ2xhc3NPck1peGluTWVtYmVyKG1ldGFkYXRhID8/IHRva2VuKS5uZXh0OwogICAgfQogICAgbGlzdGVuZXJGaW5pc2hGaWVsZHMobGlzdGVuZXIsIHN0YXJ0VG9rZW4sIG1ldGFkYXRhLCBpc1RvcExldmVsKTsKICAgIGxpc3RlbmVyLmNoZWNrRW1wdHkodG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBEZWNsYXJhdGlvbiBsb29rdXBCdWlsZGVyKFRva2VuIHRva2VuLCBUb2tlbiBnZXRPclNldCwgU3RyaW5nIG5hbWUpIHsKICAgIC8vIFRPRE8oYWhlKTogQ2FuIEkgbW92ZSB0aGlzIHRvIFNjb3BlIG9yIFNjb3BlQnVpbGRlcj8KICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uOwogICAgaWYgKGN1cnJlbnRDbGFzcyAhPSBudWxsKSB7CiAgICAgIGlmICh1cmkgIT0gY3VycmVudENsYXNzLmZpbGVVcmkpIHsKICAgICAgICB1bmV4cGVjdGVkKCIkdXJpIiwgIiR7Y3VycmVudENsYXNzLmZpbGVVcml9IiwgY3VycmVudENsYXNzLmNoYXJPZmZzZXQsCiAgICAgICAgICAgIGN1cnJlbnRDbGFzcy5maWxlVXJpKTsKICAgICAgfQoKICAgICAgaWYgKGdldE9yU2V0ICE9IG51bGwgJiYgb3B0aW9uYWwoInNldCIsIGdldE9yU2V0KSkgewogICAgICAgIGRlY2xhcmF0aW9uID0gY3VycmVudENsYXNzLnNjb3BlLnNldHRlcnNbbmFtZV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVjbGFyYXRpb24gPSBjdXJyZW50Q2xhc3Muc2NvcGUubG9jYWxbbmFtZV07CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZ2V0T3JTZXQgIT0gbnVsbCAmJiBvcHRpb25hbCgic2V0IiwgZ2V0T3JTZXQpKSB7CiAgICAgIGRlY2xhcmF0aW9uID0gbGlicmFyeS5zY29wZS5zZXR0ZXJzW25hbWVdOwogICAgfSBlbHNlIHsKICAgICAgZGVjbGFyYXRpb24gPSBsaWJyYXJ5LnNjb3BlQnVpbGRlcltuYW1lXTsKICAgIH0KICAgIGRlY2xhcmF0aW9uID0gaGFuZGxlRHVwbGljYXRlZE5hbWUoZGVjbGFyYXRpb24sIHRva2VuKTsKICAgIGNoZWNrQnVpbGRlcih0b2tlbiwgZGVjbGFyYXRpb24sIG5hbWUpOwogICAgcmV0dXJuIGRlY2xhcmF0aW9uOwogIH0KCiAgRGVjbGFyYXRpb24gbG9va3VwQ29uc3RydWN0b3IoVG9rZW4gdG9rZW4sIE9iamVjdCBuYW1lT3JRdWFsaWZpZWQpIHsKICAgIGFzc2VydChjdXJyZW50Q2xhc3MgIT0gbnVsbCk7CiAgICBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbjsKICAgIFN0cmluZyBzdWZmaXg7CiAgICBpZiAobmFtZU9yUXVhbGlmaWVkIGlzIFF1YWxpZmllZE5hbWUpIHsKICAgICAgc3VmZml4ID0gbmFtZU9yUXVhbGlmaWVkLm5hbWU7CiAgICB9IGVsc2UgewogICAgICBzdWZmaXggPSBuYW1lT3JRdWFsaWZpZWQgPT0gY3VycmVudENsYXNzLm5hbWUgPyAiIiA6IG5hbWVPclF1YWxpZmllZDsKICAgIH0KICAgIGRlY2xhcmF0aW9uID0gY3VycmVudENsYXNzLmNvbnN0cnVjdG9ycy5sb2NhbFtzdWZmaXhdOwogICAgZGVjbGFyYXRpb24gPSBoYW5kbGVEdXBsaWNhdGVkTmFtZShkZWNsYXJhdGlvbiwgdG9rZW4pOwogICAgY2hlY2tCdWlsZGVyKHRva2VuLCBkZWNsYXJhdGlvbiwgbmFtZU9yUXVhbGlmaWVkKTsKICAgIHJldHVybiBkZWNsYXJhdGlvbjsKICB9CgogIERlY2xhcmF0aW9uIGhhbmRsZUR1cGxpY2F0ZWROYW1lKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBUb2tlbiB0b2tlbikgewogICAgaW50IG9mZnNldCA9IHRva2VuLmNoYXJPZmZzZXQ7CiAgICBpZiAoZGVjbGFyYXRpb24/Lm5leHQgPT0gbnVsbCkgewogICAgICByZXR1cm4gZGVjbGFyYXRpb247CiAgICB9IGVsc2UgewogICAgICBEZWNsYXJhdGlvbiBuZWFyZXN0RGVjbGFyYXRpb247CiAgICAgIGludCBtaW5EaXN0YW5jZSA9IC0xOwogICAgICBkbyB7CiAgICAgICAgLy8gT25seSBsb29rIGF0IGRlY2xhcmF0aW9ucyBmcm9tIHRoaXMgZmlsZSAocGFydCkuCiAgICAgICAgaWYgKHVyaSA9PSBkZWNsYXJhdGlvbi5maWxlVXJpKSB7CiAgICAgICAgICAvLyBbZGlzdGFuY2VdIHdpbGwgYWx3YXlzIGJlIG5vbi1uZWdhdGl2ZSBhcyB3ZSBlbnN1cmUgW3Rva2VuXSBpcwogICAgICAgICAgLy8gYWx3YXlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRlY2xhcmF0aW9uLiBUaGUgbWluaW11bSBkaXN0YW5jZQogICAgICAgICAgLy8gd2lsbCBvZnRlbiBiZSBsYXJnZXIgdGhhbiAwLCBmb3IgZXhhbXBsZSwgaW4gYSBjbGFzcyBkZWNsYXJhdGlvbgogICAgICAgICAgLy8gd2hlcmUgW3Rva2VuXSB3aWxsIHBvaW50IHRvIGBhYnN0cmFjdGAgb3IgYGNsYXNzYCwgYnV0IHRoZQogICAgICAgICAgLy8gZGVjbGFyYXRpb24ncyBvZmZzZXQgcG9pbnRzIHRvIHRoZSBuYW1lIG9mIHRoZSBjbGFzcy4KICAgICAgICAgIGludCBkaXN0YW5jZSA9IGRlY2xhcmF0aW9uLmNoYXJPZmZzZXQgLSBvZmZzZXQ7CiAgICAgICAgICBpZiAoZGlzdGFuY2UgPj0gMCkgewogICAgICAgICAgICBpZiAobWluRGlzdGFuY2UgPT0gLTEgfHwgZGlzdGFuY2UgPCBtaW5EaXN0YW5jZSkgewogICAgICAgICAgICAgIG1pbkRpc3RhbmNlID0gZGlzdGFuY2U7CiAgICAgICAgICAgICAgbmVhcmVzdERlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbi5uZXh0OwogICAgICB9IHdoaWxlIChkZWNsYXJhdGlvbiAhPSBudWxsKTsKICAgICAgcmV0dXJuIG5lYXJlc3REZWNsYXJhdGlvbjsKICAgIH0KICB9CgogIHZvaWQgY2hlY2tCdWlsZGVyKFRva2VuIHRva2VuLCBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgT2JqZWN0IG5hbWUpIHsKICAgIGlmIChkZWNsYXJhdGlvbiA9PSBudWxsKSB7CiAgICAgIGludGVybmFsUHJvYmxlbSh0ZW1wbGF0ZUludGVybmFsUHJvYmxlbU5vdEZvdW5kLndpdGhBcmd1bWVudHMoIiRuYW1lIiksCiAgICAgICAgICB0b2tlbi5jaGFyT2Zmc2V0LCB1cmkpOwogICAgfQogICAgaWYgKHVyaSAhPSBkZWNsYXJhdGlvbi5maWxlVXJpKSB7CiAgICAgIHVuZXhwZWN0ZWQoIiR1cmkiLCAiJHtkZWNsYXJhdGlvbi5maWxlVXJpfSIsIGRlY2xhcmF0aW9uLmNoYXJPZmZzZXQsCiAgICAgICAgICBkZWNsYXJhdGlvbi5maWxlVXJpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWRkUHJvYmxlbShNZXNzYWdlIG1lc3NhZ2UsIGludCBjaGFyT2Zmc2V0LCBpbnQgbGVuZ3RoLAogICAgICB7Ym9vbCB3YXNIYW5kbGVkOiBmYWxzZSwgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dH0pIHsKICAgIGxpYnJhcnkuYWRkUHJvYmxlbShtZXNzYWdlLCBjaGFyT2Zmc2V0LCBsZW5ndGgsIHVyaSwKICAgICAgICB3YXNIYW5kbGVkOiB3YXNIYW5kbGVkLCBjb250ZXh0OiBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZGVidWdFdmVudChTdHJpbmcgbmFtZSkgewogICAgLy8gcHJpbnRFdmVudCgnRGlldExpc3RlbmVyOiAkbmFtZScpOwogIH0KCiAgLy8vIElmIHRoZSBbbWV0YWRhdGFdIGlzIG5vdCBgbnVsbGAsIHJldHVybiB0aGUgcGFyc2VkIG1ldGFkYXRhIFtFeHByZXNzaW9uXXMuCiAgLy8vIE90aGVyd2lzZSwgcmV0dXJuIGBudWxsYC4KICBMaXN0PEV4cHJlc3Npb24+IHBhcnNlTWV0YWRhdGEoCiAgICAgIE1vZGlmaWVyQnVpbGRlciBidWlsZGVyLCBUb2tlbiBtZXRhZGF0YSwgVHJlZU5vZGUgcGFyZW50KSB7CiAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCkgewogICAgICB2YXIgbGlzdGVuZXIgPSBjcmVhdGVMaXN0ZW5lcihidWlsZGVyLCBtZW1iZXJTY29wZSwgZmFsc2UpOwogICAgICB2YXIgcGFyc2VyID0gbmV3IFBhcnNlcihsaXN0ZW5lcik7CiAgICAgIHBhcnNlci5wYXJzZU1ldGFkYXRhU3RhcihwYXJzZXIuc3ludGhldGljUHJldmlvdXNUb2tlbihtZXRhZGF0YSkpOwogICAgICByZXR1cm4gbGlzdGVuZXIuZmluaXNoTWV0YWRhdGEocGFyZW50KTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgLy8vIFJldHVybnMgW1Rva2VuXSBmb3VuZCBiZXR3ZWVuIFtzdGFydF0gKGluY2x1c2l2ZSkgYW5kIFtlbmRdCiAgLy8vIChub24taW5jbHVzaXZlKSB0aGF0IGhhcyBpdHMgW1Rva2VuLmNoYXJPZmZzZXRdIGVxdWFsIHRvIFtvZmZzZXRdLiAgSWYKICAvLy8gdGhlcmUgaXMgbm8gc3VjaCB0b2tlbiwgbnVsbCBpcyByZXR1cm5lZC4KICBUb2tlbiB0b2tlbkZvck9mZnNldChUb2tlbiBzdGFydCwgVG9rZW4gZW5kLCBpbnQgb2Zmc2V0KSB7CiAgICBpZiAob2Zmc2V0IDwgc3RhcnQuY2hhck9mZnNldCB8fCBvZmZzZXQgPj0gZW5kLmNoYXJPZmZzZXQpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB3aGlsZSAoc3RhcnQgIT0gZW5kKSB7CiAgICAgIGlmIChvZmZzZXQgPT0gc3RhcnQuY2hhck9mZnNldCkgewogICAgICAgIHJldHVybiBzdGFydDsKICAgICAgfQogICAgICBzdGFydCA9IHN0YXJ0Lm5leHQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vLyBSZXR1cm5zIGxpc3Qgb2YgW1Rva2VuXXMgZm91bmQgYmV0d2VlbiBbc3RhcnRdIChpbmNsdXNpdmUpIGFuZCBbZW5kXQogIC8vLyAobm9uLWluY2x1c2l2ZSkgdGhhdCBjb3JyZXNwb25kIHRvIFtvZmZzZXRzXS4gIElmIHRoZXJlJ3Mgbm8gdG9rZW4gYmV0d2VlbgogIC8vLyBbc3RhcnRdIGFuZCBbZW5kXSBmb3IgdGhlIGdpdmVuIG9mZnNldCwgdGhlIGNvcnJlc3BvbmRpbmcgaXRlbSBpbiB0aGUKICAvLy8gcmVzdWx0aW5nIGxpc3QgaXMgc2V0IHRvIG51bGwuICBbb2Zmc2V0c10gYXJlIGFzc3VtZWQgdG8gYmUgaW4gYXNjZW5kaW5nCiAgLy8vIG9y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YykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmRpZXRfcGFyc2VyOwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJy4uL3BhcnNlci5kYXJ0JyBzaG93IENsYXNzTWVtYmVyUGFyc2VyLCBMaXN0ZW5lciwgTWVtYmVyS2luZDsKCi8vIFRPRE8oYWhlKTogTW92ZSB0aGlzIHRvIHBhcnNlciBwYWNrYWdlLgpjbGFzcyBEaWV0UGFyc2VyIGV4dGVuZHMgQ2xhc3NNZW1iZXJQYXJzZXIgewogIERpZXRQYXJzZXIoTGlzdGVuZXIgbGlzdGVuZXIpIDogc3VwZXIobGlzdGVuZXIpOwoKICBUb2tlbiBwYXJzZUZvcm1hbFBhcmFtZXRlcnNSZXN0KFRva2VuIHRva2VuLCBNZW1iZXJLaW5kIGtpbmQpIHsKICAgIHJldHVybiBza2lwRm9ybWFsUGFyYW1ldGVyc1Jlc3QodG9rZW4sIGtpbmQpOwogIH0KfQoUAE5OPAEbAS4BRgErLTMBQjIEAgEzcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NvdXJjZS9kaWV0X3BhcnNlci5kYXJ0QHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zb3VyY2Uvb3V0bGluZV9idWlsZGVyLmRhcnTAAM/QLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEub3V0bGluZV9idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBEYXJ0VHlwZSwgTGlicmFyeSwgUHJvY2VkdXJlS2luZDsKCmltcG9ydCAnLi4vYnVpbGRlci9idWlsZGVyLmRhcnQnOwoKaW1wb3J0ICcuLi9jb21iaW5hdG9yLmRhcnQnIHNob3cgQ29tYmluYXRvcjsKCmltcG9ydCAnLi4vY29uZmlndXJhdGlvbi5kYXJ0JyBzaG93IENvbmZpZ3VyYXRpb247CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnCiAgICBzaG93CiAgICAgICAgQ29kZSwKICAgICAgICBMb2NhdGVkTWVzc2FnZSwKICAgICAgICBNZXNzYWdlLAogICAgICAgIG1lc3NhZ2VDb25zdENvbnN0cnVjdG9yV2l0aEJvZHksCiAgICAgICAgbWVzc2FnZUNvbnN0SW5zdGFuY2VGaWVsZCwKICAgICAgICBtZXNzYWdlQ29uc3RNZXRob2QsCiAgICAgICAgbWVzc2FnZUNvbnN0cnVjdG9yV2l0aFJldHVyblR5cGUsCiAgICAgICAgbWVzc2FnZUNvbnN0cnVjdG9yV2l0aFR5cGVQYXJhbWV0ZXJzLAogICAgICAgIG1lc3NhZ2VFeHBlY3RlZEJsb2NrVG9Ta2lwLAogICAgICAgIG1lc3NhZ2VJbnRlcnBvbGF0aW9uSW5VcmksCiAgICAgICAgbWVzc2FnZU9wZXJhdG9yV2l0aE9wdGlvbmFsRm9ybWFscywKICAgICAgICBtZXNzYWdlU3RhdGljQ29uc3RydWN0b3IsCiAgICAgICAgbWVzc2FnZVR5cGVkZWZOb3RGdW5jdGlvbiwKICAgICAgICB0ZW1wbGF0ZUN5Y2xlSW5UeXBlVmFyaWFibGVzLAogICAgICAgIHRlbXBsYXRlRGlyZWN0Q3ljbGVJblR5cGVWYXJpYWJsZXMsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZSwKICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lQ2F1c2UsCiAgICAgICAgdGVtcGxhdGVPcGVyYXRvck1pbnVzUGFyYW1ldGVyTWlzbWF0Y2gsCiAgICAgICAgdGVtcGxhdGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMCwKICAgICAgICB0ZW1wbGF0ZU9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gxLAogICAgICAgIHRlbXBsYXRlT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDI7CgppbXBvcnQgJy4uL2lnbm9yZWRfcGFyc2VyX2Vycm9ycy5kYXJ0JyBzaG93IGlzSWdub3JlZFBhcnNlckVycm9yOwoKLy8gVE9ETyhhaGUpOiBUaGUgb3V0bGluZSBpc24ndCBzdXBwb3NlZCB0byBpbXBvcnQga2VybmVsLXNwZWNpZmljIGJ1aWxkZXJzLgppbXBvcnQgJy4uL2tlcm5lbC9rZXJuZWxfYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIEtlcm5lbE1peGluQXBwbGljYXRpb25CdWlsZGVyLAogICAgICAgIEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIsCiAgICAgICAgS2VybmVsVHlwZUJ1aWxkZXI7CgppbXBvcnQgJy4uL21vZGlmaWVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgQ29uc3QsCiAgICAgICAgQ292YXJpYW50LAogICAgICAgIEV4dGVybmFsLAogICAgICAgIEZpbmFsLAogICAgICAgIE1vZGlmaWVyLAogICAgICAgIFN0YXRpYywKICAgICAgICBWYXIsCiAgICAgICAgYWJzdHJhY3RNYXNrLAogICAgICAgIGNvbnN0TWFzaywKICAgICAgICBjb3ZhcmlhbnRNYXNrLAogICAgICAgIGV4dGVybmFsTWFzaywKICAgICAgICBtaXhpbkRlY2xhcmF0aW9uTWFzaywKICAgICAgICBzdGF0aWNNYXNrOwoKaW1wb3J0ICcuLi9vcGVyYXRvci5kYXJ0JwogICAgc2hvdwogICAgICAgIE9wZXJhdG9yLAogICAgICAgIG9wZXJhdG9yRnJvbVN0cmluZywKICAgICAgICBvcGVyYXRvclRvU3RyaW5nLAogICAgICAgIG9wZXJhdG9yUmVxdWlyZWRBcmd1bWVudENvdW50OwoKaW1wb3J0ICcuLi9wYXJzZXIuZGFydCcKICAgIHNob3cKICAgICAgICBBc3NlcnQsCiAgICAgICAgRm9ybWFsUGFyYW1ldGVyS2luZCwKICAgICAgICBJZGVudGlmaWVyQ29udGV4dCwKICAgICAgICBsZW5ndGhPZlNwYW4sCiAgICAgICAgTWVtYmVyS2luZCwKICAgICAgICBvZmZzZXRGb3JUb2tlbiwKICAgICAgICBvcHRpb25hbDsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyB1bmhhbmRsZWQ7CgppbXBvcnQgJy4uL3F1b3RlLmRhcnQnIHNob3cgdW5lc2NhcGVTdHJpbmc7CgppbXBvcnQgJy4uL3NjYW5uZXIuZGFydCcgc2hvdyBUb2tlbjsKCmltcG9ydCAnc291cmNlX2xpYnJhcnlfYnVpbGRlci5kYXJ0JyBzaG93IEZpZWxkSW5mbywgU291cmNlTGlicmFyeUJ1aWxkZXI7CgppbXBvcnQgJ3N0YWNrX2xpc3RlbmVyLmRhcnQnCiAgICBzaG93IEZpeGVkTnVsbGFibGVMaXN0LCBOdWxsVmFsdWUsIFBhcnNlclJlY292ZXJ5LCBTdGFja0xpc3RlbmVyOwoKZW51bSBNZXRob2RCb2R5IHsKICBBYnN0cmFjdCwKICBSZWd1bGFyLAogIFJlZGlyZWN0aW5nRmFjdG9yeUJvZHksCn0KCmNsYXNzIE91dGxpbmVCdWlsZGVyIGV4dGVuZHMgU3RhY2tMaXN0ZW5lciB7CiAgZmluYWwgU291cmNlTGlicmFyeUJ1aWxkZXI8S2VybmVsVHlwZUJ1aWxkZXIsIExpYnJhcnk+IGxpYnJhcnk7CgogIGZpbmFsIGJvb2wgZW5hYmxlTmF0aXZlOwogIGZpbmFsIGJvb2wgc3RyaW5nRXhwZWN0ZWRBZnRlck5hdGl2ZTsKICBib29sIGluQ29uc3RydWN0b3IgPSBmYWxzZTsKICBib29sIGluQ29uc3RydWN0b3JOYW1lID0gZmFsc2U7CiAgaW50IGltcG9ydEluZGV4ID0gMDsKCiAgU3RyaW5nIG5hdGl2ZU1ldGhvZE5hbWU7CgogIE91dGxpbmVCdWlsZGVyKFNvdXJjZUxpYnJhcnlCdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyLCBMaWJyYXJ5PiBsaWJyYXJ5KQogICAgICA6IGxpYnJhcnkgPSBsaWJyYXJ5LAogICAgICAgIGVuYWJsZU5hdGl2ZSA9CiAgICAgICAgICAgIGxpYnJhcnkubG9hZGVyLnRhcmdldC5iYWNrZW5kVGFyZ2V0LmVuYWJsZU5hdGl2ZShsaWJyYXJ5LnVyaSksCiAgICAgICAgc3RyaW5nRXhwZWN0ZWRBZnRlck5hdGl2ZSA9CiAgICAgICAgICAgIGxpYnJhcnkubG9hZGVyLnRhcmdldC5iYWNrZW5kVGFyZ2V0Lm5hdGl2ZUV4dGVuc2lvbkV4cGVjdHNTdHJpbmc7CgogIEBvdmVycmlkZQogIFVyaSBnZXQgdXJpID0+IGxpYnJhcnkuZmlsZVVyaTsKCiAgaW50IHBvcENoYXJPZmZzZXQoKSA9PiBwb3AoKTsKCiAgTGlzdDxTdHJpbmc+IHBvcElkZW50aWZpZXJMaXN0KGludCBjb3VudCkgewogICAgaWYgKGNvdW50ID09IDApIHJldHVybiBudWxsOwogICAgTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgTGlzdDxTdHJpbmc+KGNvdW50KTsKICAgIGJvb2wgaXNQYXJzZXJSZWNvdmVyeSA9IGZhbHNlOwogICAgZm9yIChpbnQgaSA9IGNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgcG9wQ2hhck9mZnNldCgpOwogICAgICBPYmplY3QgaWRlbnRpZmllciA9IHBvcCgpOwogICAgICBpZiAoaWRlbnRpZmllciBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICAgIGlzUGFyc2VyUmVjb3ZlcnkgPSB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIGxpc3RbaV0gPSBpZGVudGlmaWVyOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaXNQYXJzZXJSZWNvdmVyeSA/IG51bGwgOiBsaXN0OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRNZXRhZGF0YShUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBwZXJpb2RCZWZvcmVOYW1lLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiTWV0YWRhdGEiKTsKICAgIExpc3QgYXJndW1lbnRzID0gcG9wKCk7CiAgICBwb3BJZk5vdE51bGwocGVyaW9kQmVmb3JlTmFtZSk7IC8vIGNoYXJPZmZzZXQuCiAgICBTdHJpbmcgcG9zdGZpeCA9IHBvcElmTm90TnVsbChwZXJpb2RCZWZvcmVOYW1lKTsKICAgIExpc3Q8VHlwZUJ1aWxkZXI+IHR5cGVBcmd1bWVudHMgPSBwb3AoKTsKICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCkgewogICAgICBwb3AoKTsgLy8gY2hhck9mZnNldAogICAgICBPYmplY3QgZXhwcmVzc2lvbiA9IHBvcCgpOwogICAgICBwdXNoKG5ldyBNZXRhZGF0YUJ1aWxkZXI8S2VybmVsVHlwZUJ1aWxkZXI+LmZyb21FeHByZXNzaW9uKAogICAgICAgICAgZXhwcmVzc2lvbiwgcG9zdGZpeCwgbGlicmFyeSwgYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0KSk7CiAgICB9IGVsc2UgewogICAgICBpbnQgY2hhck9mZnNldCA9IHBvcCgpOwogICAgICBPYmplY3QgdHlwZU5hbWUgPSBwb3AoKTsKICAgICAgaWYgKHR5cGVOYW1lIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgICAgcHVzaCh0eXBlTmFtZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHVzaChuZXcgTWV0YWRhdGFCdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyPi5mcm9tQ29uc3RydWN0b3IoCiAgICAgICAgICAgIGxpYnJhcnkuYWRkQ29uc3RydWN0b3JSZWZlcmVuY2UoCiAgICAgICAgICAgICAgICB0eXBlTmFtZSwgdHlwZUFyZ3VtZW50cywgcG9zdGZpeCwgY2hhck9mZnNldCksCiAgICAgICAgICAgIGFyZ3VtZW50cywKICAgICAgICAgICAgbGlicmFyeSwKICAgICAgICAgICAgYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0KSk7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTWV0YWRhdGFTdGFyKGludCBjb3VudCkgewogICAgZGVidWdFdmVudCgiTWV0YWRhdGFTdGFyIik7CiAgICBwdXNoKGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PE1ldGFkYXRhQnVpbGRlcjxLZXJuZWxUeXBlQnVpbGRlcj4+KCkKICAgICAgICAgICAgLnBvcChzdGFjaywgY291bnQpID8/CiAgICAgICAgTnVsbFZhbHVlLk1ldGFkYXRhKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW52YWxpZFRvcExldmVsRGVjbGFyYXRpb24oVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkludmFsaWRUb3BMZXZlbERlY2xhcmF0aW9uIik7CiAgICBwb3AoKTsgLy8gbWV0YWRhdGEgc3RhcgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRIaWRlKFRva2VuIGhpZGVLZXl3b3JkKSB7CiAgICBkZWJ1Z0V2ZW50KCJIaWRlIik7CiAgICBPYmplY3QgbmFtZXMgPSBwb3AoKTsKICAgIGlmIChuYW1lcyBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBwdXNoKG5hbWVzKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2gobmV3IENvbWJpbmF0b3IuaGlkZShuYW1lcywgaGlkZUtleXdvcmQuY2hhck9mZnNldCwgbGlicmFyeS5maWxlVXJpKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFNob3coVG9rZW4gc2hvd0tleXdvcmQpIHsKICAgIGRlYnVnRXZlbnQoIlNob3ciKTsKICAgIE9iamVjdCBuYW1lcyA9IHBvcCgpOwogICAgaWYgKG5hbWVzIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIHB1c2gobmFtZXMpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChuZXcgQ29tYmluYXRvci5zaG93KG5hbWVzLCBzaG93S2V5d29yZC5jaGFyT2Zmc2V0LCBsaWJyYXJ5LmZpbGVVcmkpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ29tYmluYXRvcnMoaW50IGNvdW50KSB7CiAgICBkZWJ1Z0V2ZW50KCJDb21iaW5hdG9ycyIpOwogICAgcHVzaChjb25zdCBGaXhlZE51bGxhYmxlTGlzdDxDb21iaW5hdG9yPigpLnBvcChzdGFjaywgY291bnQpID8/CiAgICAgICAgTnVsbFZhbHVlLkNvbWJpbmF0b3JzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRXhwb3J0KFRva2VuIGV4cG9ydEtleXdvcmQsIFRva2VuIHNlbWljb2xvbikgewogICAgZGVidWdFdmVudCgiRXhwb3J0Iik7CiAgICBMaXN0PENvbWJpbmF0b3I+IGNvbWJpbmF0b3JzID0gcG9wKCk7CiAgICBMaXN0PENvbmZpZ3VyYXRpb24+IGNvbmZpZ3VyYXRpb25zID0gcG9wKCk7CiAgICBpbnQgdXJpT2Zmc2V0ID0gcG9wQ2hhck9mZnNldCgpOwogICAgU3RyaW5nIHVyaSA9IHBvcCgpOwogICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI8S2VybmVsVHlwZUJ1aWxkZXI+PiBtZXRhZGF0YSA9IHBvcCgpOwogICAgbGlicmFyeS5hZGRFeHBvcnQobWV0YWRhdGEsIHVyaSwgY29uZmlndXJhdGlvbnMsIGNvbWJpbmF0b3JzLAogICAgICAgIGV4cG9ydEtleXdvcmQuY2hhck9mZnNldCwgdXJpT2Zmc2V0KTsKICAgIGNoZWNrRW1wdHkoZXhwb3J0S2V5d29yZC5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW1wb3J0UHJlZml4KFRva2VuIGRlZmVycmVkS2V5d29yZCwgVG9rZW4gYXNLZXl3b3JkKSB7CiAgICBkZWJ1Z0V2ZW50KCJJbXBvcnRQcmVmaXgiKTsKICAgIGlmIChhc0tleXdvcmQgPT0gbnVsbCkgewogICAgICAvLyBJZiBhc0tleXdvcmQgaXMgbnVsbCwgdGhlbiBubyBwcmVmaXggaGFzIGJlZW4gcHVzaGVkIG9uIHRoZSBzdGFjay4KICAgICAgLy8gUHVzaCBhIHBsYWNlaG9sZGVyIGluZGljYXRpbmcgdGhhdCB0aGVyZSBpcyBubyBwcmVmaXguCiAgICAgIHB1c2goTnVsbFZhbHVlLlByZWZpeCk7CiAgICAgIHB1c2goLTEpOwogICAgfQogICAgcHVzaChkZWZlcnJlZEtleXdvcmQgIT0gbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEltcG9ydChUb2tlbiBpbXBvcnRLZXl3b3JkLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGRlYnVnRXZlbnQoIkVuZEltcG9ydCIpOwogICAgTGlzdDxDb21iaW5hdG9yPiBjb21iaW5hdG9ycyA9IHBvcCgpOwogICAgYm9vbCBpc0RlZmVycmVkID0gcG9wKCk7CiAgICBpbnQgcHJlZml4T2Zmc2V0ID0gcG9wKCk7CiAgICBPYmplY3QgcHJlZml4ID0gcG9wKE51bGxWYWx1ZS5QcmVmaXgpOwogICAgTGlzdDxDb25maWd1cmF0aW9uPiBjb25maWd1cmF0aW9ucyA9IHBvcCgpOwogICAgaW50IHVyaU9mZnNldCA9IHBvcENoYXJPZmZzZXQoKTsKICAgIFN0cmluZyB1cmkgPSBwb3AoKTsgLy8gRm9yIGEgY29uZGl0aW9uYWwgaW1wb3J0LCB0aGlzIGlzIHRoZSBkZWZhdWx0IFVSSS4KICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyPj4gbWV0YWRhdGEgPSBwb3AoKTsKICAgIGNoZWNrRW1wdHkoaW1wb3J0S2V5d29yZC5jaGFyT2Zmc2V0KTsKICAgIGlmIChwcmVmaXggaXMgUGFyc2VyUmVjb3ZlcnkpIHJldHVybjsKICAgIGxpYnJhcnkuYWRkSW1wb3J0KAogICAgICAgIG1ldGFkYXRhLAogICAgICAgIHVyaSwKICAgICAgICBjb25maWd1cmF0aW9ucywKICAgICAgICBwcmVmaXgsCiAgICAgICAgY29tYmluYXRvcnMsCiAgICAgICAgaXNEZWZlcnJlZCwKICAgICAgICBpbXBvcnRLZXl3b3JkLmNoYXJPZmZzZXQsCiAgICAgICAgcHJlZml4T2Zmc2V0LAogICAgICAgIHVyaU9mZnNldCwKICAgICAgICBpbXBvcnRJbmRleCsrKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ29uZGl0aW9uYWxVcmlzKGludCBjb3VudCkgewogICAgZGVidWdFdmVudCgiRW5kQ29uZGl0aW9uYWxVcmlzIik7CiAgICBwdXNoKGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PENvbmZpZ3VyYXRpb24+KCkucG9wKHN0YWNrLCBjb3VudCkgPz8KICAgICAgICBOdWxsVmFsdWUuQ29uZGl0aW9uYWxVcmlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ29uZGl0aW9uYWxVcmkoVG9rZW4gaWZLZXl3b3JkLCBUb2tlbiBsZWZ0UGFyZW4sIFRva2VuIGVxdWFsU2lnbikgewogICAgZGVidWdFdmVudCgiRW5kQ29uZGl0aW9uYWxVcmkiKTsKICAgIGludCBjaGFyT2Zmc2V0ID0gcG9wQ2hhck9mZnNldCgpOwogICAgU3RyaW5nIHVyaSA9IHBvcCgpOwogICAgaWYgKGVxdWFsU2lnbiAhPSBudWxsKSBwb3BDaGFyT2Zmc2V0KCk7CiAgICBTdHJpbmcgY29uZGl0aW9uID0gcG9wSWZOb3ROdWxsKGVxdWFsU2lnbikgPz8gInRydWUiOwogICAgT2JqZWN0IGRvdHRlZE5hbWUgPSBwb3AoKTsKICAgIGlmIChkb3R0ZWROYW1lIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIHB1c2goZG90dGVkTmFtZSk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKG5ldyBDb25maWd1cmF0aW9uKGNoYXJPZmZzZXQsIGRvdHRlZE5hbWUsIGNvbmRpdGlvbiwgdXJpKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZURvdHRlZE5hbWUoaW50IGNvdW50LCBUb2tlbiBmaXJzdElkZW50aWZpZXIpIHsKICAgIGRlYnVnRXZlbnQoIkRvdHRlZE5hbWUiKTsKICAgIExpc3Q8U3RyaW5nPiBuYW1lcyA9IHBvcElkZW50aWZpZXJMaXN0KGNvdW50KTsKICAgIGlmIChuYW1lcyA9PSBudWxsKSB7CiAgICAgIHB1c2gobmV3IFBhcnNlclJlY292ZXJ5KGZpcnN0SWRlbnRpZmllci5jaGFyT2Zmc2V0KSk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKG5hbWVzLmpvaW4oJy4nKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVJlY292ZXJJbXBvcnQoVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJSZWNvdmVySW1wb3J0Iik7CiAgICBwb3AoKTsgLy8gY29tYmluYXRvcnMKICAgIHBvcChOdWxsVmFsdWUuRGVmZXJyZWQpOyAvLyBkZWZlcnJlZEtleXdvcmQKICAgIHBvcCgpOyAvLyBwcmVmaXhPZmZzZXQKICAgIHBvcChOdWxsVmFsdWUuUHJlZml4KTsgLy8gcHJlZml4CiAgICBwb3AoKTsgLy8gY29uZGl0aW9uYWxVcmlzCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFBhcnQoVG9rZW4gcGFydEtleXdvcmQsIFRva2VuIHNlbWljb2xvbikgewogICAgZGVidWdFdmVudCgiUGFydCIpOwogICAgaW50IGNoYXJPZmZzZXQgPSBwb3BDaGFyT2Zmc2V0KCk7CiAgICBTdHJpbmcgdXJpID0gcG9wKCk7CiAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcjxLZXJuZWxUeXBlQnVpbGRlcj4+IG1ldGFkYXRhID0gcG9wKCk7CiAgICBsaWJyYXJ5LmFkZFBhcnQobWV0YWRhdGEsIHVyaSwgY2hhck9mZnNldCk7CiAgICBjaGVja0VtcHR5KHBhcnRLZXl3b3JkLmNoYXJPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVPcGVyYXRvck5hbWUoVG9rZW4gb3BlcmF0b3JLZXl3b3JkLCBUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiT3BlcmF0b3JOYW1lIik7CiAgICBwdXNoKG9wZXJhdG9yRnJvbVN0cmluZyh0b2tlbi5zdHJpbmdWYWx1ZSkpOwogICAgcHVzaCh0b2tlbi5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW52YWxpZE9wZXJhdG9yTmFtZShUb2tlbiBvcGVyYXRvcktleXdvcmQsIFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJJbnZhbGlkT3BlcmF0b3JOYW1lIik7CiAgICBwdXNoKCdpbnZhbGlkJyk7CiAgICBwdXNoKHRva2VuLmNoYXJPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dCBjb250ZXh0KSB7CiAgICBpZiAoY29udGV4dCA9PSBJZGVudGlmaWVyQ29udGV4dC5lbnVtVmFsdWVEZWNsYXJhdGlvbikgewogICAgICBkZWJ1Z0V2ZW50KCJoYW5kbGVJZGVudGlmaWVyIik7CiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyPj4gbWV0YWRhdGEgPSBwb3AoKTsKICAgICAgaWYgKHRva2VuLmlzU3ludGhldGljKSB7CiAgICAgICAgcHVzaChuZXcgUGFyc2VyUmVjb3ZlcnkodG9rZW4uY2hhck9mZnNldCkpOwogICAgICB9IGVsc2UgewogICAgICAgIHB1c2gobmV3IEVudW1Db25zdGFudEluZm8obWV0YWRhdGEsIHRva2VuLmxleGVtZSwgdG9rZW4uY2hhck9mZnNldCwKICAgICAgICAgICAgZ2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQodG9rZW4pKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHN1cGVyLmhhbmRsZUlkZW50aWZpZXIodG9rZW4sIGNvbnRleHQpOwogICAgICBwdXNoKHRva2VuLmNoYXJPZmZzZXQpOwogICAgfQogICAgaWYgKGluQ29uc3RydWN0b3IgJiYgY29udGV4dCA9PSBJZGVudGlmaWVyQ29udGV4dC5tZXRob2REZWNsYXJhdGlvbikgewogICAgICBpbkNvbnN0cnVjdG9yTmFtZSA9IHRydWU7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vTmFtZShUb2tlbiB0b2tlbikgewogICAgc3VwZXIuaGFuZGxlTm9OYW1lKHRva2VuKTsKICAgIHB1c2godG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVN0cmluZ1BhcnQoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlN0cmluZ1BhcnQiKTsKICAgIC8vIElnbm9yZSBzdHJpbmcgcGFydHMgLSByZXBvcnQgZXJyb3IgbGF0ZXIuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZExpdGVyYWxTdHJpbmcoaW50IGludGVycG9sYXRpb25Db3VudCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZExpdGVyYWxTdHJpbmciKTsKICAgIGlmIChpbnRlcnBvbGF0aW9uQ291bnQgPT0gMCkgewogICAgICBUb2tlbiB0b2tlbiA9IHBvcCgpOwogICAgICBwdXNoKHVuZXNjYXBlU3RyaW5nKHRva2VuLmxleGVtZSwgdG9rZW4sIHRoaXMpKTsKICAgICAgcHVzaCh0b2tlbi5jaGFyT2Zmc2V0KTsKICAgIH0gZWxzZSB7CiAgICAgIFRva2VuIGJlZ2luVG9rZW4gPSBwb3AoKTsKICAgICAgaW50IGNoYXJPZmZzZXQgPSBiZWdpblRva2VuLmNoYXJPZmZzZXQ7CiAgICAgIHB1c2goIiR7U291cmNlTGlicmFyeUJ1aWxkZXIuTUFMRk9STUVEX1VSSV9TQ0hFTUV9OmJhZCR7Y2hhck9mZnNldH0iKTsKICAgICAgcHVzaChjaGFyT2Zmc2V0KTsKICAgICAgLy8gUG9pbnQgdG8gZG9sbGFyIHNpZ24KICAgICAgaW50IGludGVycG9sYXRpb25PZmZzZXQgPSBjaGFyT2Zmc2V0ICsgYmVnaW5Ub2tlbi5sZXhlbWUubGVuZ3RoOwogICAgICBhZGRQcm9ibGVtKG1lc3NhZ2VJbnRlcnBvbGF0aW9uSW5VcmksIGludGVycG9sYXRpb25PZmZzZXQsIDEpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOYXRpdmVDbGF1c2UoVG9rZW4gbmF0aXZlVG9rZW4sIGJvb2wgaGFzTmFtZSkgewogICAgZGVidWdFdmVudCgiTmF0aXZlQ2xhdXNlIik7CiAgICBpZiAoaGFzTmFtZSkgewogICAgICAvLyBQb3AgdGhlIG5hdGl2ZSBjbGF1c2Ugd2hpY2ggaW4gdGhpcyBjYXNlIGlzIGEgU3RyaW5nTGl0ZXJhbC4KICAgICAgcG9wKCk7IC8vIENoYXIgb2Zmc2V0LgogICAgICBPYmplY3QgbmFtZSA9IHBvcCgpOwogICAgICBpZiAobmFtZSBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICAgIG5hdGl2ZU1ldGhvZE5hbWUgPSAnJzsKICAgICAgfSBlbHNlIHsKICAgICAgICBuYXRpdmVNZXRob2ROYW1lID0gbmFtZTsgLy8gU3RyaW5nLgogICAgICB9CiAgICB9IGVsc2UgewogICAgICBuYXRpdmVNZXRob2ROYW1lID0gJyc7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVN0cmluZ0p1eHRhcG9zaXRpb24oaW50IGxpdGVyYWxDb3VudCkgewogICAgZGVidWdFdmVudCgiU3RyaW5nSnV4dGFwb3NpdGlvbiIpOwogICAgTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgTGlzdDxTdHJpbmc+KGxpdGVyYWxDb3VudCk7CiAgICBpbnQgY2hhck9mZnNldCA9IC0xOwogICAgZm9yIChpbnQgaSA9IGxpdGVyYWxDb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGNoYXJPZmZzZXQgPSBwb3AoKTsKICAgICAgbGlzdFtpXSA9IHBvcCgpOwogICAgfQogICAgcHVzaChsaXN0LmpvaW4oIiIpKTsKICAgIHB1c2goY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUlkZW50aWZpZXJMaXN0KGludCBjb3VudCkgewogICAgZGVidWdFdmVudCgiZW5kSWRlbnRpZmllckxpc3QiKTsKICAgIHB1c2gocG9wSWRlbnRpZmllckxpc3QoY291bnQpID8/CiAgICAgICAgKGNvdW50ID09IDAgPyBOdWxsVmFsdWUuSWRlbnRpZmllckxpc3QgOiBuZXcgUGFyc2VyUmVjb3ZlcnkoLTEpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVF1YWxpZmllZChUb2tlbiBwZXJpb2QpIHsKICAgIGRlYnVnRXZlbnQoImhhbmRsZVF1YWxpZmllZCIpOwogICAgaW50IHN1ZmZpeE9mZnNldCA9IHBvcCgpOwogICAgT2JqZWN0IHN1ZmZpeCA9IHBvcCgpOwogICAgaW50IG9mZnNldCA9IHBvcCgpOwogICAgT2JqZWN0IHByZWZpeCA9IHBvcCgpOwogICAgaWYgKHByZWZpeCBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBwdXNoKHByZWZpeCk7CiAgICB9IGVsc2UgaWYgKHN1ZmZpeCBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBwdXNoKHN1ZmZpeCk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoaWRlbnRpY2FsKHN1ZmZpeCwgcGVyaW9kLm5leHQubGV4ZW1lKSk7CiAgICAgIGFzc2VydChzdWZmaXhPZmZzZXQgPT0gcGVyaW9kLm5leHQuY2hhck9mZnNldCk7CiAgICAgIHB1c2gobmV3IFF1YWxpZmllZE5hbWUocHJlZml4LCBwZXJpb2QubmV4dCkpOwogICAgfQogICAgcHVzaChvZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRMaWJyYXJ5TmFtZShUb2tlbiBsaWJyYXJ5S2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRMaWJyYXJ5TmFtZSIpOwogICAgcG9wQ2hhck9mZnNldCgpOwogICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50ID0gZ2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQobGlicmFyeUtleXdvcmQpOwogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyPj4gbWV0YWRhdGEgPSBwb3AoKTsKICAgIGxpYnJhcnkuZG9jdW1lbnRhdGlvbkNvbW1lbnQgPSBkb2N1bWVudGF0aW9uQ29tbWVudDsKICAgIGlmIChuYW1lIGlzISBQYXJzZXJSZWNvdmVyeSkgewogICAgICBsaWJyYXJ5Lm5hbWUgPSBmbGF0dGVuTmFtZShuYW1lLCBvZmZzZXRGb3JUb2tlbihsaWJyYXJ5S2V5d29yZCksIHVyaSk7CiAgICB9CiAgICBsaWJyYXJ5Lm1ldGFkYXRhID0gbWV0YWRhdGE7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ2xhc3NPck5hbWVkTWl4aW5BcHBsaWNhdGlvbihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5DbGFzc09yTmFtZWRNaXhpbkFwcGxpY2F0aW9uIik7CiAgICBsaWJyYXJ5LmJlZ2luTmVzdGVkRGVjbGFyYXRpb24oImNsYXNzIG9yIG1peGluIGFwcGxpY2F0aW9uIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ2xhc3NEZWNsYXJhdGlvbihUb2tlbiBiZWdpbiwgVG9rZW4gYWJzdHJhY3RUb2tlbiwgVG9rZW4gbmFtZSkgewogICAgZGVidWdFdmVudCgiYmVnaW5OYW1lZE1peGluQXBwbGljYXRpb24iKTsKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcjxLZXJuZWxUeXBlQnVpbGRlciwgRGFydFR5cGU+PiB0eXBlVmFyaWFibGVzID0KICAgICAgICBwb3AoKTsKICAgIHB1c2godHlwZVZhcmlhYmxlcyA/PyBOdWxsVmFsdWUuVHlwZVZhcmlhYmxlcyk7CiAgICBsaWJyYXJ5LmN1cnJlbnREZWNsYXJhdGlvbgogICAgICAuLm5hbWUgPSBuYW1lLmxleGVtZQogICAgICAuLmNoYXJPZmZzZXQgPSBuYW1lLmNoYXJPZmZzZXQKICAgICAgLi50eXBlVmFyaWFibGVzID0gdHlwZVZhcmlhYmxlczsKICAgIHB1c2goYWJzdHJhY3RUb2tlbiAhPSBudWxsID8gYWJzdHJhY3RNYXNrIDogMCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTWl4aW5EZWNsYXJhdGlvbihUb2tlbiBtaXhpbktleXdvcmQsIFRva2VuIG5hbWUpIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luTWl4aW5EZWNsYXJhdGlvbiIpOwogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyLCBEYXJ0VHlwZT4+IHR5cGVWYXJpYWJsZXMgPQogICAgICAgIHBvcCgpOwogICAgcHVzaCh0eXBlVmFyaWFibGVzID8/IE51bGxWYWx1ZS5UeXBlVmFyaWFibGVzKTsKICAgIGxpYnJhcnkuY3VycmVudERlY2xhcmF0aW9uCiAgICAgIC4ubmFtZSA9IG5hbWUubGV4ZW1lCiAgICAgIC4uY2hhck9mZnNldCA9IG5hbWUuY2hhck9mZnNldAogICAgICAuLnR5cGVWYXJpYWJsZXMgPSB0eXBlVmFyaWFibGVzOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkNsYXNzT3JNaXhpbkJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luQ2xhc3NPck1peGluQm9keSIpOwogICAgLy8gUmVzb2x2ZSB1bnJlc29sdmVkIHR5cGVzIGZyb20gdGhlIGNsYXNzIGhlYWRlciAoaS5lLiwgc3VwZXJjbGFzcywgbWl4aW5zLAogICAgLy8gYW5kIGltcGxlbWVudGVkIHR5cGVzKSBiZWZvcmUgYWRkaW5nIG1lbWJlcnMgZnJvbSB0aGUgY2xhc3MgYm9keSB3aGljaAogICAgLy8gc2hvdWxkIG5vdCBzaGFkb3cgdGhlc2UgdW5yZXNvbHZlZCB0eXBlcy4KICAgIGxpYnJhcnkuY3VycmVudERlY2xhcmF0aW9uCiAgICAgICAgLnJlc29sdmVUeXBlcyhsaWJyYXJ5LmN1cnJlbnREZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzLCBsaWJyYXJ5KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5OYW1lZE1peGluQXBwbGljYXRpb24oCiAgICAgIFRva2VuIGJlZ2luLCBUb2tlbiBhYnN0cmFjdFRva2VuLCBUb2tlbiBuYW1lKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbk5hbWVkTWl4aW5BcHBsaWNhdGlvbiIpOwogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyLCBEYXJ0VHlwZT4+IHR5cGVWYXJpYWJsZXMgPQogICAgICAgIHBvcCgpOwogICAgcHVzaCh0eXBlVmFyaWFibGVzID8/IE51bGxWYWx1ZS5UeXBlVmFyaWFibGVzKTsKICAgIGxpYnJhcnkuY3VycmVudERlY2xhcmF0aW9uCiAgICAgIC4ubmFtZSA9IG5hbWUubGV4ZW1lCiAgICAgIC4uY2hhck9mZnNldCA9IG5hbWUuY2hhck9mZnNldAogICAgICAuLnR5cGVWYXJpYWJsZXMgPSB0eXBlVmFyaWFibGVzOwogICAgcHVzaChhYnN0cmFjdFRva2VuICE9IG51bGwgPyBhYnN0cmFjdE1hc2sgOiAwKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ2xhc3NPck1peGluSW1wbGVtZW50cygKICAgICAgVG9rZW4gaW1wbGVtZW50c0tleXdvcmQsIGludCBpbnRlcmZhY2VzQ291bnQpIHsKICAgIGRlYnVnRXZlbnQoIkNsYXNzT3JNaXhpbkltcGxlbWVudHMiKTsKICAgIHB1c2goY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8S2VybmVsTmFtZWRUeXBlQnVpbGRlcj4oKQogICAgICAgICAgICAucG9wKHN0YWNrLCBpbnRlcmZhY2VzQ291bnQpID8/CiAgICAgICAgTnVsbFZhbHVlLlR5cGVCdWlsZGVyTGlzdCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVJlY292ZXJDbGFzc0hlYWRlcigpIHsKICAgIGRlYnVnRXZlbnQoImhhbmRsZVJlY292ZXJDbGFzc0hlYWRlciIpOwogICAgcG9wKE51bGxWYWx1ZS5UeXBlQnVpbGRlckxpc3QpOyAvLyBJbnRlcmZhY2VzLgogICAgcG9wKCk7IC8vIFN1cGVydHlwZSBvZmZzZXQuCiAgICBwb3AoKTsgLy8gU3VwZXJ0eXBlLgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVSZWNvdmVyTWl4aW5IZWFkZXIoKSB7CiAgICBkZWJ1Z0V2ZW50KCJoYW5kbGVSZWNvdmVyTWl4aW5IZWFkZXIiKTsKICAgIHBvcChOdWxsVmFsdWUuVHlwZUJ1aWxkZXJMaXN0KTsgLy8gSW50ZXJmYWNlcy4KICAgIHBvcChOdWxsVmFsdWUuVHlwZUJ1aWxkZXJMaXN0KTsgLy8gU3VwZXJ0eXBlIGNvbnN0cmFpbnRzLgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDbGFzc0V4dGVuZHMoVG9rZW4gZXh0ZW5kc0tleXdvcmQpIHsKICAgIGRlYnVnRXZlbnQoImhhbmRsZUNsYXNzRXh0ZW5kcyIpOwogICAgcHVzaChleHRlbmRzS2V5d29yZD8uY2hhck9mZnNldCA/PyAtMSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU1peGluT24oVG9rZW4gb25LZXl3b3JkLCBpbnQgdHlwZUNvdW50KSB7CiAgICBkZWJ1Z0V2ZW50KCJoYW5kbGVNaXhpbk9uIik7CiAgICBwdXNoKGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXI+KCkKICAgICAgICAgICAgLnBvcChzdGFjaywgdHlwZUNvdW50KSA/PwogICAgICAgIG5ldyBQYXJzZXJSZWNvdmVyeShvZmZzZXRGb3JUb2tlbihvbktleXdvcmQpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENsYXNzRGVjbGFyYXRpb24oVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZENsYXNzRGVjbGFyYXRpb24iKTsKICAgIFN0cmluZyBkb2N1bWVudGF0aW9uQ29tbWVudCA9IGdldERvY3VtZW50YXRpb25Db21tZW50KGJlZ2luVG9rZW4pOwogICAgTGlzdDxUeXBlQnVpbGRlcj4gaW50ZXJmYWNlcyA9IHBvcChOdWxsVmFsdWUuVHlwZUJ1aWxkZXJMaXN0KTsKICAgIGludCBzdXBlcnR5cGVPZmZzZXQgPSBwb3AoKTsKICAgIFR5cGVCdWlsZGVyIHN1cGVydHlwZSA9IG51bGxJZlBhcnNlclJlY292ZXJ5KHBvcCgpKTsKICAgIGludCBtb2RpZmllcnMgPSBwb3AoKTsKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcjxLZXJuZWxUeXBlQnVpbGRlciwgRGFydFR5cGU+PiB0eXBlVmFyaWFibGVzID0KICAgICAgICBwb3AoKTsKICAgIGludCBjaGFyT2Zmc2V0ID0gcG9wKCk7CiAgICBPYmplY3QgbmFtZSA9IHBvcCgpOwogICAgaWYgKHR5cGVWYXJpYWJsZXMgIT0gbnVsbCAmJiBzdXBlcnR5cGUgaXMgTWl4aW5BcHBsaWNhdGlvbkJ1aWxkZXIpIHsKICAgICAgc3VwZXJ0eXBlLnR5cGVWYXJpYWJsZXMgPSB0eXBlVmFyaWFibGVzOwogICAgfQogICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI8S2VybmVsVHlwZUJ1aWxkZXI+PiBtZXRhZGF0YSA9IHBvcCgpOwogICAgY2hlY2tFbXB0eShiZWdpblRva2VuLmNoYXJPZmZzZXQpOwogICAgaWYgKG5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgbGlicmFyeS5lbmROZXN0ZWREZWNsYXJhdGlvbigiPHN5bnRheC1lcnJvcj4iKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZpbmFsIGludCBzdGFydENoYXJPZmZzZXQgPQogICAgICAgIG1ldGFkYXRhID09IG51bGwgPyBiZWdpblRva2VuLmNoYXJPZmZzZXQgOiBtZXRhZGF0YS5maXJzdC5jaGFyT2Zmc2V0OwoKICAgIGxpYnJhcnkuYWRkQ2xhc3MoCiAgICAgICAgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgbW9kaWZpZXJzLAogICAgICAgIG5hbWUsCiAgICAgICAgdHlwZVZhcmlhYmxlcywKICAgICAgICBzdXBlcnR5cGUsCiAgICAgICAgaW50ZXJmYWNlcywKICAgICAgICBzdGFydENoYXJPZmZzZXQsCiAgICAgICAgY2hhck9mZnNldCwKICAgICAgICBlbmRUb2tlbi5jaGFyT2Zmc2V0LAogICAgICAgIHN1cGVydHlwZU9mZnNldCk7CiAgfQoKICBPYmplY3QgbnVsbElmUGFyc2VyUmVjb3ZlcnkoT2JqZWN0IG5vZGUpIHsKICAgIHJldHVybiBub2RlIGlzIFBhcnNlclJlY292ZXJ5ID8gbnVsbCA6IG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE1peGluRGVjbGFyYXRpb24oVG9rZW4gbWl4aW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZE1peGluRGVjbGFyYXRpb24iKTsKICAgIFN0cmluZyBkb2N1bWVudGF0aW9uQ29tbWVudCA9IGdldERvY3VtZW50YXRpb25Db21tZW50KG1peGluVG9rZW4pOwogICAgTGlzdDxUeXBlQnVpbGRlcj4gaW50ZXJmYWNlcyA9IHBvcChOdWxsVmFsdWUuVHlwZUJ1aWxkZXJMaXN0KTsKICAgIExpc3Q8S2VybmVsVHlwZUJ1aWxkZXI+IHN1cGVydHlwZUNvbnN0cmFpbnRzID0gbnVsbElmUGFyc2VyUmVjb3ZlcnkocG9wKCkpOwogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyLCBEYXJ0VHlwZT4+IHR5cGVWYXJpYWJsZXMgPQogICAgICAgIHBvcChOdWxsVmFsdWUuVHlwZVZhcmlhYmxlcyk7CiAgICBpbnQgbmFtZU9mZnNldCA9IHBvcCgpOwogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyPj4gbWV0YWRhdGEgPSBwb3AoTnVsbFZhbHVlLk1ldGFkYXRhKTsKICAgIGNoZWNrRW1wdHkobWl4aW5Ub2tlbi5jaGFyT2Zmc2V0KTsKICAgIGlmIChuYW1lIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIGxpYnJhcnkuZW5kTmVzdGVkRGVjbGFyYXRpb24oIjxzeW50YXgtZXJyb3I+Iik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGludCBzdGFydE9mZnNldCA9CiAgICAgICAgbWV0YWRhdGEgPT0gbnVsbCA/IG1peGluVG9rZW4uY2hhck9mZnNldCA6IG1ldGFkYXRhLmZpcnN0LmNoYXJPZmZzZXQ7CiAgICBUeXBlQnVpbGRlciBzdXBlcnR5cGU7CiAgICBpZiAoc3VwZXJ0eXBlQ29uc3RyYWludHMgIT0gbnVsbCAmJiBzdXBlcnR5cGVDb25zdHJhaW50cy5pc05vdEVtcHR5KSB7CiAgICAgIGlmIChzdXBlcnR5cGVDb25zdHJhaW50cy5sZW5ndGggPT0gMSkgewogICAgICAgIHN1cGVydHlwZSA9IHN1cGVydHlwZUNvbnN0cmFpbnRzLmZpcnN0OwogICAgICB9IGVsc2UgewogICAgICAgIHN1cGVydHlwZSA9IG5ldyBLZXJuZWxNaXhpbkFwcGxpY2F0aW9uQnVpbGRlcigKICAgICAgICAgICAgc3VwZXJ0eXBlQ29uc3RyYWludHMuZmlyc3QsIHN1cGVydHlwZUNvbnN0cmFpbnRzLnNraXAoMSkudG9MaXN0KCkpOwogICAgICB9CiAgICB9CiAgICBsaWJyYXJ5LmFkZENsYXNzKAogICAgICAgIGRvY3VtZW50YXRpb25Db21tZW50LAogICAgICAgIG1ldGFkYXRhLAogICAgICAgIG1peGluRGVjbGFyYXRpb25NYXNrLAogICAgICAgIG5hbWUsCiAgICAgICAgdHlwZVZhcmlhYmxlcywKICAgICAgICBzdXBlcnR5cGUsCiAgICAgICAgaW50ZXJmYWNlcywKICAgICAgICBzdGFydE9mZnNldCwKICAgICAgICBuYW1lT2Zmc2V0LAogICAgICAgIGVuZFRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgLTEpOwogIH0KCiAgUHJvY2VkdXJlS2luZCBjb21wdXRlUHJvY2VkdXJlS2luZChUb2tlbiB0b2tlbikgewogICAgaWYgKHRva2VuID09IG51bGwpIHJldHVybiBQcm9jZWR1cmVLaW5kLk1ldGhvZDsKICAgIGlmIChvcHRpb25hbCgiZ2V0IiwgdG9rZW4pKSByZXR1cm4gUHJvY2VkdXJlS2luZC5HZXR0ZXI7CiAgICBpZiAob3B0aW9uYWwoInNldCIsIHRva2VuKSkgcmV0dXJuIFByb2NlZHVyZUtpbmQuU2V0dGVyOwogICAgcmV0dXJuIHVuaGFuZGxlZCgKICAgICAgICB0b2tlbi5sZXhlbWUsICJjb21wdXRlUHJvY2VkdXJlS2luZCIsIHRva2VuLmNoYXJPZmZzZXQsIHVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luVG9wTGV2ZWxNZXRob2QoVG9rZW4gbGFzdENvbnN1bWVkLCBUb2tlbiBleHRlcm5hbFRva2VuKSB7CiAgICBsaWJyYXJ5LmJlZ2luTmVzdGVkRGVjbGFyYXRpb24oIiNtZXRob2QiLCBoYXNNZW1iZXJzOiBmYWxzZSk7CiAgICBwdXNoKGV4dGVybmFsVG9rZW4gIT0gbnVsbCA/IGV4dGVybmFsTWFzayA6IDApOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRUb3BMZXZlbE1ldGhvZChUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBnZXRPclNldCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZFRvcExldmVsTWV0aG9kIik7CiAgICBNZXRob2RCb2R5IGtpbmQgPSBwb3AoKTsKICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscyA9IHBvcCgpOwogICAgaW50IGZvcm1hbHNPZmZzZXQgPSBwb3AoKTsKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcjxLZXJuZWxUeXBlQnVpbGRlciwgRGFydFR5cGU+PiB0eXBlVmFyaWFibGVzID0KICAgICAgICBwb3AoKTsKICAgIGludCBjaGFyT2Zmc2V0ID0gcG9wKCk7CiAgICBPYmplY3QgbmFtZSA9IHBvcCgpOwogICAgVHlwZUJ1aWxkZXIgcmV0dXJuVHlwZSA9IHBvcCgpOwogICAgYm9vbCBpc0Fic3RyYWN0ID0ga2luZCA9PSBNZXRob2RCb2R5LkFic3RyYWN0OwogICAgaWYgKGdldE9yU2V0ICE9IG51bGwgJiYgb3B0aW9uYWwoInNldCIsIGdldE9yU2V0KSkgewogICAgICBpZiAoZm9ybWFscyA9PSBudWxsIHx8IGZvcm1hbHMubGVuZ3RoICE9IDEpIHsKICAgICAgICAvLyBUaGlzIGlzbid0IGFic3RyYWN0IGFzIHdlJ2xsIGFkZCBhbiBlcnJvci1yZWNvdmVyeSBub2RlIGluCiAgICAgICAgLy8gW0JvZHlCdWlsZGVyLmZpbmlzaEZ1bmN0aW9uXS4KICAgICAgICBpc0Fic3RyYWN0ID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGludCBtb2RpZmllcnMgPSBwb3AoKTsKICAgIGlmIChpc0Fic3RyYWN0KSB7CiAgICAgIG1vZGlmaWVycyB8PSBhYnN0cmFjdE1hc2s7CiAgICB9CiAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcjxLZXJuZWxUeXBlQnVpbGRlcj4+IG1ldGFkYXRhID0gcG9wKCk7CiAgICBjaGVja0VtcHR5KGJlZ2luVG9rZW4uY2hhck9mZnNldCk7CiAgICBsaWJyYXJ5CiAgICAgICAgLmVuZE5lc3RlZERlY2xhcmF0aW9uKCIjbWV0aG9kIikKICAgICAgICAucmVzb2x2ZVR5cGVzKHR5cGVWYXJpYWJsZXMsIGxpYnJhcnkpOwogICAgaWYgKG5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkpIHJldHVybjsKICAgIGZpbmFsIGludCBzdGFydENoYXJPZmZzZXQgPQogICAgICAgIG1ldGFkYXRhID09IG51bGwgPyBiZWdpblRva2VuLmNoYXJPZmZzZXQgOiBtZXRhZGF0YS5maXJzdC5jaGFyT2Zmc2V0OwogICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50ID0gZ2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQoYmVnaW5Ub2tlbik7CiAgICBsaWJyYXJ5LmFkZFByb2NlZHVyZSgKICAgICAgICBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgICBtZXRhZGF0YSwKICAgICAgICBtb2RpZmllcnMsCiAgICAgICAgcmV0dXJuVHlwZSwKICAgICAgICBuYW1lLAogICAgICAgIHR5cGVWYXJpYWJsZXMsCiAgICAgICAgZm9ybWFscywKICAgICAgICBjb21wdXRlUHJvY2VkdXJlS2luZChnZXRPclNldCksCiAgICAgICAgc3RhcnRDaGFyT2Zmc2V0LAogICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgZm9ybWFsc09mZnNldCwKICAgICAgICBlbmRUb2tlbi5jaGFyT2Zmc2V0LAogICAgICAgIG5hdGl2ZU1ldGhvZE5hbWUsCiAgICAgICAgaXNUb3BMZXZlbDogdHJ1ZSk7CiAgICBuYXRpdmVNZXRob2ROYW1lID0gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTmF0aXZlRnVuY3Rpb25Cb2R5KFRva2VuIG5hdGl2ZVRva2VuLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGRlYnVnRXZlbnQoIk5hdGl2ZUZ1bmN0aW9uQm9keSIpOwogICAgaWYgKG5hdGl2ZU1ldGhvZE5hbWUgIT0gbnVsbCkgewogICAgICBwdXNoKE1ldGhvZEJvZHkuUmVndWxhcik7CiAgICB9IGVsc2UgewogICAgICBwdXNoKE1ldGhvZEJvZHkuQWJzdHJhY3QpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHlJZ25vcmVkKFRva2VuIG5hdGl2ZVRva2VuLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGRlYnVnRXZlbnQoIk5hdGl2ZUZ1bmN0aW9uQm9keUlnbm9yZWQiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTmF0aXZlRnVuY3Rpb25Cb2R5U2tpcHBlZChUb2tlbiBuYXRpdmVUb2tlbiwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBpZiAoIWVuYWJsZU5hdGl2ZSkgewogICAgICBzdXBlci5oYW5kbGVSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgbWVzc2FnZUV4cGVjdGVkQmxvY2tUb1NraXAsIG5hdGl2ZVRva2VuLCBuYXRpdmVUb2tlbik7CiAgICB9CiAgICBwdXNoKE1ldGhvZEJvZHkuUmVndWxhcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vRnVuY3Rpb25Cb2R5KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb0Z1bmN0aW9uQm9keSIpOwogICAgaWYgKG5hdGl2ZU1ldGhvZE5hbWUgIT0gbnVsbCkgewogICAgICBwdXNoKE1ldGhvZEJvZHkuUmVndWxhcik7CiAgICB9IGVsc2UgewogICAgICBwdXNoKE1ldGhvZEJvZHkuQWJzdHJhY3QpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVGdW5jdGlvbkJvZHlTa2lwcGVkKFRva2VuIHRva2VuLCBib29sIGlzRXhwcmVzc2lvbkJvZHkpIHsKICAgIGRlYnVnRXZlbnQoImhhbmRsZUZ1bmN0aW9uQm9keVNraXBwZWQiKTsKICAgIHB1c2goTWV0aG9kQm9keS5SZWd1bGFyKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5NZXRob2QoVG9rZW4gZXh0ZXJuYWxUb2tlbiwgVG9rZW4gc3RhdGljVG9rZW4sIFRva2VuIGNvdmFyaWFudFRva2VuLAogICAgICBUb2tlbiB2YXJGaW5hbE9yQ29uc3QsIFRva2VuIGdldE9yU2V0LCBUb2tlbiBuYW1lKSB7CiAgICBpbkNvbnN0cnVjdG9yID0KICAgICAgICBuYW1lPy5sZXhlbWUgPT0gbGlicmFyeS5jdXJyZW50RGVjbGFyYXRpb24ubmFtZSAmJiBnZXRPclNldCA9PSBudWxsOwogICAgTGlzdDxNb2RpZmllcj4gbW9kaWZpZXJzOwogICAgaWYgKGV4dGVybmFsVG9rZW4gIT0gbnVsbCkgewogICAgICBtb2RpZmllcnMgPz89IDxNb2RpZmllcj5bXTsKICAgICAgbW9kaWZpZXJzLmFkZChFeHRlcm5hbCk7CiAgICB9CiAgICBpZiAoc3RhdGljVG9rZW4gIT0gbnVsbCkgewogICAgICBpZiAoaW5Db25zdHJ1Y3RvcikgewogICAgICAgIGhhbmRsZVJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgIG1lc3NhZ2VTdGF0aWNDb25zdHJ1Y3Rvciwgc3RhdGljVG9rZW4sIHN0YXRpY1Rva2VuKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBtb2RpZmllcnMgPz89IDxNb2RpZmllcj5bXTsKICAgICAgICBtb2RpZmllcnMuYWRkKFN0YXRpYyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChjb3ZhcmlhbnRUb2tlbiAhPSBudWxsKSB7CiAgICAgIG1vZGlmaWVycyA/Pz0gPE1vZGlmaWVyPltdOwogICAgICBtb2RpZmllcnMuYWRkKENvdmFyaWFudCk7CiAgICB9CiAgICBpZiAodmFyRmluYWxPckNvbnN0ICE9IG51bGwpIHsKICAgICAgU3RyaW5nIGxleGVtZSA9IHZhckZpbmFsT3JDb25zdC5sZXhlbWU7CiAgICAgIGlmIChpZGVudGljYWwoJ3ZhcicsIGxleGVtZSkpIHsKICAgICAgICBtb2RpZmllcnMgPz89IDxNb2RpZmllcj5bXTsKICAgICAgICBtb2RpZmllcnMuYWRkKFZhcik7CiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCdmaW5hbCcsIGxleGVtZSkpIHsKICAgICAgICBtb2RpZmllcnMgPz89IDxNb2RpZmllcj5bXTsKICAgICAgICBtb2RpZmllcnMuYWRkKEZpbmFsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBtb2RpZmllcnMgPz89IDxNb2RpZmllcj5bXTsKICAgICAgICBtb2RpZmllcnMuYWRkKENvbnN0KTsKICAgICAgfQogICAgfQogICAgcHVzaCh2YXJGaW5hbE9yQ29uc3Q/LmNoYXJPZmZzZXQgPz8gLTEpOwogICAgcHVzaChtb2RpZmllcnMgPz8gTnVsbFZhbHVlLk1vZGlmaWVycyk7CiAgICBsaWJyYXJ5LmJlZ2luTmVzdGVkRGVjbGFyYXRpb24oIiNtZXRob2QiLCBoYXNNZW1iZXJzOiBmYWxzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE1ldGhvZCgKICAgICAgVG9rZW4gZ2V0T3JTZXQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGJlZ2luUGFyYW0sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJNZXRob2QiKTsKICAgIE1ldGhvZEJvZHkgYm9keUtpbmQgPSBwb3AoKTsKICAgIGlmIChib2R5S2luZCA9PSBNZXRob2RCb2R5LlJlZGlyZWN0aW5nRmFjdG9yeUJvZHkpIHsKICAgICAgLy8gVGhpcyB3aWxsIGNhdXNlIGFuIGVycm9yIGxhdGVyLgogICAgICBwb3AoKTsKICAgIH0KICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscyA9IHBvcCgpOwogICAgaW50IGZvcm1hbHNPZmZzZXQgPSBwb3AoKTsKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcjxLZXJuZWxUeXBlQnVpbGRlciwgRGFydFR5cGU+PiB0eXBlVmFyaWFibGVzID0KICAgICAgICBwb3AoKTsKICAgIGludCBjaGFyT2Zmc2V0ID0gcG9wKCk7CiAgICBPYmplY3QgbmFtZU9yT3BlcmF0b3IgPSBwb3AoKTsKICAgIGlmIChPcGVyYXRvci5zdWJ0cmFjdCA9PSBuYW1lT3JPcGVyYXRvciAmJiBmb3JtYWxzID09IG51bGwpIHsKICAgICAgbmFtZU9yT3BlcmF0b3IgPSBPcGVyYXRvci51bmFyeU1pbnVzOwogICAgfQogICAgT2JqZWN0IG5hbWU7CiAgICBQcm9jZWR1cmVLaW5kIGtpbmQ7CiAgICBpZiAobmFtZU9yT3BlcmF0b3IgaXMgT3BlcmF0b3IpIHsKICAgICAgbmFtZSA9IG9wZXJhdG9yVG9TdHJpbmcobmFtZU9yT3BlcmF0b3IpOwogICAgICBraW5kID0gUHJvY2VkdXJlS2luZC5PcGVyYXRvcjsKICAgICAgaW50IHJlcXVpcmVkQXJndW1lbnRDb3VudCA9IG9wZXJhdG9yUmVxdWlyZWRBcmd1bWVudENvdW50KG5hbWVPck9wZXJhdG9yKTsKICAgICAgaWYgKChmb3JtYWxzPy5sZW5ndGggPz8gMCkgIT0gcmVxdWlyZWRBcmd1bWVudENvdW50KSB7CiAgICAgICAgdmFyIHRlbXBsYXRlOwogICAgICAgIHN3aXRjaCAocmVxdWlyZWRBcmd1bWVudENvdW50KSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICBpZiAoT3BlcmF0b3Iuc3VidHJhY3QgPT0gbmFtZU9yT3BlcmF0b3IpIHsKICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlT3BlcmF0b3JNaW51c1BhcmFtZXRlck1pc21hdGNoOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMjsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdW5oYW5kbGVkKCIkcmVxdWlyZWRBcmd1bWVudENvdW50IiwgIm9wZXJhdG9yUmVxdWlyZWRBcmd1bWVudENvdW50IiwKICAgICAgICAgICAgICAgIGNoYXJPZmZzZXQsIHVyaSk7CiAgICAgICAgfQogICAgICAgIFN0cmluZyBzdHJpbmcgPSBuYW1lOwogICAgICAgIGFkZFByb2JsZW0odGVtcGxhdGUud2l0aEFyZ3VtZW50cyhuYW1lKSwgY2hhck9mZnNldCwgc3RyaW5nLmxlbmd0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGZvcm1hbHMgIT0gbnVsbCkgewogICAgICAgICAgZm9yIChGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGZvcm1hbCBpbiBmb3JtYWxzKSB7CiAgICAgICAgICAgIGlmICghZm9ybWFsLmlzUmVxdWlyZWQpIHsKICAgICAgICAgICAgICBhZGRQcm9ibGVtKG1lc3NhZ2VPcGVyYXRvcldpdGhPcHRpb25hbEZvcm1hbHMsIGZvcm1hbC5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgICBmb3JtYWwubmFtZS5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBuYW1lID0gbmFtZU9yT3BlcmF0b3I7CiAgICAgIGtpbmQgPSBjb21wdXRlUHJvY2VkdXJlS2luZChnZXRPclNldCk7CiAgICB9CiAgICBUeXBlQnVpbGRlciByZXR1cm5UeXBlID0gcG9wKCk7CiAgICBib29sIGlzQWJzdHJhY3QgPSBib2R5S2luZCA9PSBNZXRob2RCb2R5LkFic3RyYWN0OwogICAgaWYgKGdldE9yU2V0ICE9IG51bGwgJiYgb3B0aW9uYWwoInNldCIsIGdldE9yU2V0KSkgewogICAgICBpZiAoZm9ybWFscyA9PSBudWxsIHx8IGZvcm1hbHMubGVuZ3RoICE9IDEpIHsKICAgICAgICAvLyBUaGlzIGlzbid0IGFic3RyYWN0IGFzIHdlJ2xsIGFkZCBhbiBlcnJvci1yZWNvdmVyeSBub2RlIGluCiAgICAgICAgLy8gW0JvZHlCdWlsZGVyLmZpbmlzaEZ1bmN0aW9uXS4KICAgICAgICBpc0Fic3RyYWN0ID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGludCBtb2RpZmllcnMgPSBNb2RpZmllci52YWxpZGF0ZShwb3AoKSwgaXNBYnN0cmFjdDogaXNBYnN0cmFjdCk7CiAgICBpZiAoKG1vZGlmaWVycyAmIGV4dGVybmFsTWFzaykgIT0gMCkgewogICAgICBtb2RpZmllcnMgJj0gfmFic3RyYWN0TWFzazsKICAgIH0KICAgIGJvb2wgaXNDb25zdCA9IChtb2RpZmllcnMgJiBjb25zdE1hc2spICE9IDA7CiAgICBpbnQgdmFyRmluYWxPckNvbnN0T2Zmc2V0ID0gcG9wKCk7CiAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcjxLZXJuZWxUeXBlQnVpbGRlcj4+IG1ldGFkYXRhID0gcG9wKCk7CiAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQgPSBnZXREb2N1bWVudGF0aW9uQ29tbWVudChiZWdpblRva2VuKTsKICAgIGxpYnJhcnkKICAgICAgICAuZW5kTmVzdGVkRGVjbGFyYXRpb24oIiNtZXRob2QiKQogICAgICAgIC5yZXNvbHZlVHlwZXModHlwZVZhcmlhYmxlcywgbGlicmFyeSk7CiAgICBpZiAobmFtZSBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBuYXRpdmVNZXRob2ROYW1lID0gbnVsbDsKICAgICAgaW5Db25zdHJ1Y3RvciA9IGZhbHNlOwogICAgICByZXR1cm47CiAgICB9CiAgICBTdHJpbmcgY29uc3RydWN0b3JOYW1lID0KICAgICAgICBraW5kID09IFByb2NlZHVyZUtpbmQuR2V0dGVyIHx8IGtpbmQgPT0gUHJvY2VkdXJlS2luZC5TZXR0ZXIKICAgICAgICAgICAgPyBudWxsCiAgICAgICAgICAgIDogbGlicmFyeS5jb21wdXRlQW5kVmFsaWRhdGVDb25zdHJ1Y3Rvck5hbWUobmFtZSwgY2hhck9mZnNldCk7CiAgICBpZiAoY29uc3RydWN0b3JOYW1lICE9IG51bGwpIHsKICAgICAgaWYgKGlzQ29uc3QgJiYgYm9keUtpbmQgIT0gTWV0aG9kQm9keS5BYnN0cmFjdCkgewogICAgICAgIGFkZFByb2JsZW0obWVzc2FnZUNvbnN0Q29uc3RydWN0b3JXaXRoQm9keSwgdmFyRmluYWxPckNvbnN0T2Zmc2V0LCA1KTsKICAgICAgICBtb2RpZmllcnMgJj0gfmNvbnN0TWFzazsKICAgICAgfQogICAgICBpZiAocmV0dXJuVHlwZSAhPSBudWxsKSB7CiAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IFJlcG9ydCB0aGlzIGVycm9yIG9uIHRoZSByZXR1cm4gdHlwZQogICAgICAgIGhhbmRsZVJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgIG1lc3NhZ2VDb25zdHJ1Y3RvcldpdGhSZXR1cm5UeXBlLCBiZWdpblRva2VuLCBiZWdpblRva2VuKTsKICAgICAgICByZXR1cm5UeXBlID0gbnVsbDsKICAgICAgfQogICAgICBmaW5hbCBpbnQgc3RhcnRDaGFyT2Zmc2V0ID0KICAgICAgICAgIG1ldGFkYXRhID09IG51bGwgPyBiZWdpblRva2VuLmNoYXJPZmZzZXQgOiBtZXRhZGF0YS5maXJzdC5jaGFyT2Zmc2V0OwogICAgICBsaWJyYXJ5LmFkZENvbnN0cnVjdG9yKAogICAgICAgICAgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgICAgICBtZXRhZGF0YSwKICAgICAgICAgIG1vZGlmaWVycywKICAgICAgICAgIHJldHVyblR5cGUsCiAgICAgICAgICBuYW1lLAogICAgICAgICAgY29uc3RydWN0b3JOYW1lLAogICAgICAgICAgdHlwZVZhcmlhYmxlcywKICAgICAgICAgIGZvcm1hbHMsCiAgICAgICAgICBzdGFydENoYXJPZmZzZXQsCiAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgZm9ybWFsc09mZnNldCwKICAgICAgICAgIGVuZFRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgICBuYXRpdmVNZXRob2ROYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChpc0NvbnN0KSB7CiAgICAgICAgYWRkUHJvYmxlbShtZXNzYWdlQ29uc3RNZXRob2QsIHZhckZpbmFsT3JDb25zdE9mZnNldCwgNSk7CiAgICAgICAgbW9kaWZpZXJzICY9IH5jb25zdE1hc2s7CiAgICAgIH0KICAgICAgZmluYWwgaW50IHN0YXJ0Q2hhck9mZnNldCA9CiAgICAgICAgICBtZXRhZGF0YSA9PSBudWxsID8gYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0IDogbWV0YWRhdGEuZmlyc3QuY2hhck9mZnNldDsKICAgICAgbGlicmFyeS5hZGRQcm9jZWR1cmUoCiAgICAgICAgICBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgICAgIG1ldGFkYXRhLAogICAgICAgICAgbW9kaWZpZXJzLAogICAgICAgICAgcmV0dXJuVHlwZSwKICAgICAgICAgIG5hbWUsCiAgICAgICAgICB0eXBlVmFyaWFibGVzLAogICAgICAgICAgZm9ybWFscywKICAgICAgICAgIGtpbmQsCiAgICAgICAgICBzdGFydENoYXJPZmZzZXQsCiAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgZm9ybWFsc09mZnNldCwKICAgICAgICAgIGVuZFRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgICBuYXRpdmVNZXRob2ROYW1lLAogICAgICAgICAgaXNUb3BMZXZlbDogZmFsc2UpOwogICAgfQogICAgbmF0aXZlTWV0aG9kTmFtZSA9IG51bGw7CiAgICBpbkNvbnN0cnVjdG9yID0gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5hbWVkTWl4aW5BcHBsaWNhdGlvbldpdGhDbGF1c2UoVG9rZW4gd2l0aEtleXdvcmQpIHsKICAgIGRlYnVnRXZlbnQoIk5hbWVkTWl4aW5BcHBsaWNhdGlvbldpdGhDbGF1c2UiKTsKICAgIE9iamVjdCBtaXhpbnMgPSBwb3AoKTsKICAgIE9iamVjdCBzdXBlcnR5cGUgPSBwb3AoKTsKICAgIGlmIChtaXhpbnMgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHVzaChtaXhpbnMpOwogICAgfSBlbHNlIGlmIChzdXBlcnR5cGUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHVzaChzdXBlcnR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChsaWJyYXJ5LmFkZE1peGluQXBwbGljYXRpb24oCiAgICAgICAgICBzdXBlcnR5cGUsIG1peGlucywgd2l0aEtleXdvcmQuY2hhck9mZnNldCkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmROYW1lZE1peGluQXBwbGljYXRpb24oVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gY2xhc3NLZXl3b3JkLAogICAgICBUb2tlbiBlcXVhbHMsIFRva2VuIGltcGxlbWVudHNLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiZW5kTmFtZWRNaXhpbkFwcGxpY2F0aW9uIik7CiAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQgPSBnZXREb2N1bWVudGF0aW9uQ29tbWVudChiZWdpblRva2VuKTsKICAgIExpc3Q8VHlwZUJ1aWxkZXI+IGludGVyZmFjZXMgPSBwb3BJZk5vdE51bGwoaW1wbGVtZW50c0tleXdvcmQpOwogICAgT2JqZWN0IG1peGluQXBwbGljYXRpb24gPSBwb3AoKTsKICAgIGludCBtb2RpZmllcnMgPSBwb3AoKTsKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcjxLZXJuZWxUeXBlQnVpbGRlciwgRGFydFR5cGU+PiB0eXBlVmFyaWFibGVzID0KICAgICAgICBwb3AoKTsKICAgIGludCBjaGFyT2Zmc2V0ID0gcG9wKCk7CiAgICBPYmplY3QgbmFtZSA9IHBvcCgpOwogICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI8S2VybmVsVHlwZUJ1aWxkZXI+PiBtZXRhZGF0YSA9IHBvcCgpOwogICAgY2hlY2tFbXB0eShiZWdpblRva2VuLmNoYXJPZmZzZXQpOwogICAgaWYgKG5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkgfHwgbWl4aW5BcHBsaWNhdGlvbiBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBsaWJyYXJ5LmVuZE5lc3RlZERlY2xhcmF0aW9uKCI8c3ludGF4LWVycm9yPiIpOwogICAgICByZXR1cm47CiAgICB9CgogICAgaW50IHN0YXJ0Q2hhck9mZnNldCA9IGJlZ2luVG9rZW4uY2hhck9mZnNldDsKICAgIGludCBjaGFyRW5kT2Zmc2V0ID0gZW5kVG9rZW4uY2hhck9mZnNldDsKICAgIGxpYnJhcnkuYWRkTmFtZWRNaXhpbkFwcGxpY2F0aW9uKAogICAgICAgIGRvY3VtZW50YXRpb25Db21tZW50LAogICAgICAgIG1ldGFkYXRhLAogICAgICAgIG5hbWUsCiAgICAgICAgdHlwZVZhcmlhYmxlcywKICAgICAgICBtb2RpZmllcnMsCiAgICAgICAgbWl4aW5BcHBsaWNhdGlvbiwKICAgICAgICBpbnRlcmZhY2VzLAogICAgICAgIHN0YXJ0Q2hhck9mZnNldCwKICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgIGNoYXJFbmRPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRUeXBlQXJndW1lbnRzKGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlR5cGVBcmd1bWVudHMiKTsKICAgIHB1c2goY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8S2VybmVsVHlwZUJ1aWxkZXI+KCkucG9wKHN0YWNrLCBjb3VudCkgPz8KICAgICAgICBOdWxsVmFsdWUuVHlwZUFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRUeXBlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJJbnZhbGlkVHlwZUFyZ3VtZW50cyIpOwogICAgcG9wKE51bGxWYWx1ZS5UeXBlQXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU2NyaXB0KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJTY3JpcHQiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9uTnVsbEFzc2VydEV4cHJlc3Npb24oVG9rZW4gYmFuZykgewogICAgcmVwb3J0Tm9uTnVsbEFzc2VydEV4cHJlc3Npb25Ob3RFbmFibGVkKGJhbmcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVUeXBlKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIHF1ZXN0aW9uTWFyaykgewogICAgZGVidWdFdmVudCgiVHlwZSIpOwogICAgcmVwb3J0RXJyb3JJZk51bGxhYmxlVHlwZShxdWVzdGlvbk1hcmspOwogICAgTGlzdDxUeXBlQnVpbGRlcj4gYXJndW1lbnRzID0gcG9wKCk7CiAgICBpbnQgY2hhck9mZnNldCA9IHBvcCgpOwogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIGlmIChuYW1lIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIHB1c2gobmFtZSk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKGxpYnJhcnkuYWRkTmFtZWRUeXBlKG5hbWUsIGFyZ3VtZW50cywgY2hhck9mZnNldCkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRUeXBlTGlzdChpbnQgY291bnQpIHsKICAgIGRlYnVnRXZlbnQoIlR5cGVMaXN0Iik7CiAgICBwdXNoKGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXI+KCkucG9wKHN0YWNrLCBjb3VudCkgPz8KICAgICAgICBuZXcgUGFyc2VyUmVjb3ZlcnkoLTEpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9UeXBlVmFyaWFibGVzKFRva2VuIHRva2VuKSB7CiAgICBzdXBlci5oYW5kbGVOb1R5cGVWYXJpYWJsZXModG9rZW4pOwogICAgaW5Db25zdHJ1Y3Rvck5hbWUgPSBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVm9pZEtleXdvcmQoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlZvaWRLZXl3b3JkIik7CiAgICBwdXNoKGxpYnJhcnkuYWRkVm9pZFR5cGUodG9rZW4uY2hhck9mZnNldCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZvcm1hbFBhcmFtZXRlcihUb2tlbiB0b2tlbiwgTWVtYmVyS2luZCBraW5kLCBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwKICAgICAgVG9rZW4gdmFyRmluYWxPckNvbnN0KSB7CiAgICBwdXNoKChjb3ZhcmlhbnRUb2tlbiAhPSBudWxsID8gY292YXJpYW50TWFzayA6IDApIHwKICAgICAgICBNb2RpZmllci52YWxpZGF0ZVZhckZpbmFsT3JDb25zdCh2YXJGaW5hbE9yQ29uc3Q/LmxleGVtZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JtYWxQYXJhbWV0ZXIoVG9rZW4gdGhpc0tleXdvcmQsIFRva2VuIHBlcmlvZEFmdGVyVGhpcywKICAgICAgVG9rZW4gbmFtZVRva2VuLCBGb3JtYWxQYXJhbWV0ZXJLaW5kIGtpbmQsIE1lbWJlcktpbmQgbWVtYmVyS2luZCkgewogICAgZGVidWdFdmVudCgiRm9ybWFsUGFyYW1ldGVyIik7CiAgICBpbnQgY2hhck9mZnNldCA9IHBvcCgpOwogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIFR5cGVCdWlsZGVyIHR5cGUgPSBudWxsSWZQYXJzZXJSZWNvdmVyeShwb3AoKSk7CiAgICBpbnQgbW9kaWZpZXJzID0gcG9wKCk7CiAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcjxLZXJuZWxUeXBlQnVpbGRlcj4+IG1ldGFkYXRhID0gcG9wKCk7CiAgICBpZiAobmFtZSBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBwdXNoKG5hbWUpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChsaWJyYXJ5LmFkZEZvcm1hbFBhcmFtZXRlcigKICAgICAgICAgIG1ldGFkYXRhLCBtb2RpZmllcnMsIHR5cGUsIG5hbWUsIHRoaXNLZXl3b3JkICE9IG51bGwsIGNoYXJPZmZzZXQpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Gb3JtYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVFeHByZXNzaW9uKCkgewogICAgLy8gSWdub3JlZCBmb3Igbm93LgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JtYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVFeHByZXNzaW9uKCkgewogICAgZGVidWdFdmVudCgiRm9ybWFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlRXhwcmVzc2lvbiIpOwogICAgLy8gSWdub3JlZCBmb3Igbm93LgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVWYWx1ZWRGb3JtYWxQYXJhbWV0ZXIoVG9rZW4gZXF1YWxzLCBUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiVmFsdWVkRm9ybWFsUGFyYW1ldGVyIik7CiAgICAvLyBJZ25vcmVkIGZvciBub3cuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUZvcm1hbFBhcmFtZXRlcldpdGhvdXRWYWx1ZShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiRm9ybWFsUGFyYW1ldGVyV2l0aG91dFZhbHVlIik7CiAgICAvLyBJZ25vcmVkIGZvciBub3cuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE9wdGlvbmFsRm9ybWFsUGFyYW1ldGVycygKICAgICAgaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiT3B0aW9uYWxGb3JtYWxQYXJhbWV0ZXJzIik7CiAgICBGb3JtYWxQYXJhbWV0ZXJLaW5kIGtpbmQgPSBvcHRpb25hbCgieyIsIGJlZ2luVG9rZW4pCiAgICAgICAgPyBGb3JtYWxQYXJhbWV0ZXJLaW5kLm9wdGlvbmFsTmFtZWQKICAgICAgICA6IEZvcm1hbFBhcmFtZXRlcktpbmQub3B0aW9uYWxQb3NpdGlvbmFsOwogICAgLy8gV2hlbiByZWNvdmVyaW5nIGZyb20gYW4gZW1wdHkgbGlzdCBvZiBvcHRpb25hbCBhcmd1bWVudHMsIGNvdW50IG1heSBiZQogICAgLy8gMC4gSXQgbWlnaHQgYmUgc2ltcGxlciBpZiB0aGUgcGFyc2VyIGRpZG4ndCBjYWxsIHRoaXMgbWV0aG9kIGluIHRoYXQKICAgIC8vIGNhc2UsIGhvd2V2ZXIsIHRoZW4gW2JlZ2luT3B0aW9uYWxGb3JtYWxQYXJhbWV0ZXJzXSB3b3VsZG4ndCBhbHdheXMgYmUKICAgIC8vIG1hdGNoZWQgYnkgdGhpcyBtZXRob2QuCiAgICBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+IHBhcmFtZXRlcnMgPQogICAgICAgIGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+KCkucG9wKHN0YWNrLCBjb3VudCk7CiAgICBpZiAocGFyYW1ldGVycyA9PSBudWxsKSB7CiAgICAgIHB1c2gobmV3IFBhcnNlclJlY292ZXJ5KG9mZnNldEZvclRva2VuKGJlZ2luVG9rZW4pKSk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgcGFyYW1ldGVyIGluIHBhcmFtZXRlcnMpIHsKICAgICAgICBwYXJhbWV0ZXIua2luZCA9IGtpbmQ7CiAgICAgIH0KICAgICAgcHVzaChwYXJhbWV0ZXJzKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9ybWFsUGFyYW1ldGVycygKICAgICAgaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbiwgTWVtYmVyS2luZCBraW5kKSB7CiAgICBkZWJ1Z0V2ZW50KCJGb3JtYWxQYXJhbWV0ZXJzIik7CiAgICBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+IGZvcm1hbHM7CiAgICBpZiAoY291bnQgPT0gMSkgewogICAgICBPYmplY3QgbGFzdCA9IHBvcCgpOwogICAgICBpZiAobGFzdCBpcyBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+KSB7CiAgICAgICAgZm9ybWFscyA9IGxhc3Q7CiAgICAgIH0gZWxzZSBpZiAobGFzdCBpcyEgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgICBhc3NlcnQobGFzdCAhPSBudWxsKTsKICAgICAgICBmb3JtYWxzID0gbmV3IExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4oMSk7CiAgICAgICAgZm9ybWFsc1swXSA9IGxhc3Q7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY291bnQgPiAxKSB7CiAgICAgIE9iamVjdCBsYXN0ID0gcG9wKCk7CiAgICAgIGNvdW50LS07CiAgICAgIGlmIChsYXN0IGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgICAgZGlzY2FyZChjb3VudCk7CiAgICAgIH0gZWxzZSBpZiAobGFzdCBpcyBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+KSB7CiAgICAgICAgZm9ybWFscyA9IGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+KCkKICAgICAgICAgICAgLnBvcFBhZGRlZChzdGFjaywgY291bnQsIGxhc3QubGVuZ3RoKTsKICAgICAgICBpZiAoZm9ybWFscyAhPSBudWxsKSB7CiAgICAgICAgICBmb3JtYWxzLnNldFJhbmdlKGNvdW50LCBmb3JtYWxzLmxlbmd0aCwgbGFzdCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvcm1hbHMgPSBjb25zdCBGaXhlZE51bGxhYmxlTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPigpCiAgICAgICAgICAgIC5wb3BQYWRkZWQoc3RhY2ssIGNvdW50LCAxKTsKICAgICAgICBpZiAoZm9ybWFscyAhPSBudWxsKSB7CiAgICAgICAgICBmb3JtYWxzW2NvdW50XSA9IGxhc3Q7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoZm9ybWFscyAhPSBudWxsKSB7CiAgICAgIGFzc2VydChmb3JtYWxzLmlzTm90RW1wdHkpOwogICAgICBpZiAoZm9ybWFscy5sZW5ndGggPT0gMikgewogICAgICAgIC8vIFRoZSBuYW1lIG1heSBiZSBudWxsIGZvciBnZW5lcmFsaXplZCBmdW5jdGlvbiB0eXBlcy4KICAgICAgICBpZiAoZm9ybWFsc1swXS5uYW1lICE9IG51bGwgJiYgZm9ybWFsc1swXS5uYW1lID09IGZvcm1hbHNbMV0ubmFtZSkgewogICAgICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lLndpdGhBcmd1bWVudHMoZm9ybWFsc1sxXS5uYW1lKSwKICAgICAgICAgICAgICBmb3JtYWxzWzFdLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgZm9ybWFsc1sxXS5uYW1lLmxlbmd0aCwKICAgICAgICAgICAgICBjb250ZXh0OiBbCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lQ2F1c2UKICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhmb3JtYWxzWzFdLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgdXJpLCBmb3JtYWxzWzBdLmNoYXJPZmZzZXQsIGZvcm1hbHNbMF0ubmFtZS5sZW5ndGgpCiAgICAgICAgICAgICAgXSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGZvcm1hbHMubGVuZ3RoID4gMikgewogICAgICAgIE1hcDxTdHJpbmcsIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+IHNlZW5OYW1lcyA9CiAgICAgICAgICAgIDxTdHJpbmcsIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+e307CiAgICAgICAgZm9yIChGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGZvcm1hbCBpbiBmb3JtYWxzKSB7CiAgICAgICAgICBpZiAoZm9ybWFsLm5hbWUgPT0gbnVsbCkgY29udGludWU7CiAgICAgICAgICBpZiAoc2Vlbk5hbWVzLmNvbnRhaW5zS2V5KGZvcm1hbC5uYW1lKSkgewogICAgICAgICAgICBhZGRQcm9ibGVtKAogICAgICAgICAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZS53aXRoQXJndW1lbnRzKGZvcm1hbC5uYW1lKSwKICAgICAgICAgICAgICAgIGZvcm1hbC5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgZm9ybWFsLm5hbWUubGVuZ3RoLAogICAgICAgICAgICAgICAgY29udGV4dDogWwogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lQ2F1c2UKICAgICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGZvcm1hbC5uYW1lKQogICAgICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIHNlZW5OYW1lc1tmb3JtYWwubmFtZV0uY2hhck9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVuTmFtZXNbZm9ybWFsLm5hbWVdLm5hbWUubGVuZ3RoKQogICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZWVuTmFtZXNbZm9ybWFsLm5hbWVdID0gZm9ybWFsOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcHVzaChiZWdpblRva2VuLmNoYXJPZmZzZXQpOwogICAgcHVzaChmb3JtYWxzID8/IE51bGxWYWx1ZS5Gb3JtYWxQYXJhbWV0ZXJzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9Gb3JtYWxQYXJhbWV0ZXJzKFRva2VuIHRva2VuLCBNZW1iZXJLaW5kIGtpbmQpIHsKICAgIHB1c2godG9rZW4uY2hhck9mZnNldCk7CiAgICBzdXBlci5oYW5kbGVOb0Zvcm1hbFBhcmFtZXRlcnModG9rZW4sIGtpbmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRBc3NlcnQoVG9rZW4gYXNzZXJ0S2V5d29yZCwgQXNzZXJ0IGtpbmQsIFRva2VuIGxlZnRQYXJlbnRoZXNpcywKICAgICAgVG9rZW4gY29tbWFUb2tlbiwgVG9rZW4gc2VtaWNvbG9uVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkFzc2VydCIpOwogICAgLy8gRG8gbm90aGluZwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRFbnVtKFRva2VuIGVudW1LZXl3b3JkLCBUb2tlbiBsZWZ0QnJhY2UsIGludCBjb3VudCkgewogICAgZGVidWdFdmVudCgiRW51bSIpOwogICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50ID0gZ2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQoZW51bUtleXdvcmQpOwogICAgTGlzdDxFbnVtQ29uc3RhbnRJbmZvPiBlbnVtQ29uc3RhbnRJbmZvcyA9CiAgICAgICAgY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8RW51bUNvbnN0YW50SW5mbz4oKS5wb3Aoc3RhY2ssIGNvdW50KTsKICAgIGludCBjaGFyT2Zmc2V0ID0gcG9wKCk7IC8vIGlkZW50aWZpZXIgY2hhciBvZmZzZXQuCiAgICBpbnQgc3RhcnRDaGFyT2Zmc2V0ID0gZW51bUtleXdvcmQuY2hhck9mZnNldDsKICAgIE9iamVjdCBuYW1lID0gcG9wKCk7CiAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcjxLZXJuZWxUeXBlQnVpbGRlcj4+IG1ldGFkYXRhID0gcG9wKCk7CiAgICBjaGVja0VtcHR5KGVudW1LZXl3b3JkLmNoYXJPZmZzZXQpOwogICAgaWYgKG5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkpIHJldHVybjsKICAgIGxpYnJhcnkuYWRkRW51bShkb2N1bWVudGF0aW9uQ29tbWVudCwgbWV0YWRhdGEsIG5hbWUsIGVudW1Db25zdGFudEluZm9zLAogICAgICAgIHN0YXJ0Q2hhck9mZnNldCwgY2hhck9mZnNldCwgbGVmdEJyYWNlPy5lbmRHcm91cD8uY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRnVuY3Rpb25UeXBlQWxpYXMoVG9rZW4gdG9rZW4pIHsKICAgIGxpYnJhcnkuYmVnaW5OZXN0ZWREZWNsYXJhdGlvbigiI3R5cGVkZWYiLCBoYXNNZW1iZXJzOiBmYWxzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRnVuY3Rpb25UeXBlKFRva2VuIGJlZ2luVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luRnVuY3Rpb25UeXBlIik7CiAgICBsaWJyYXJ5LmJlZ2luTmVzdGVkRGVjbGFyYXRpb24oIiNmdW5jdGlvbl90eXBlIiwgaGFzTWVtYmVyczogZmFsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXIoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luRnVuY3Rpb25UeXBlZEZvcm1hbFBhcmFtZXRlciIpOwogICAgbGlicmFyeS5iZWdpbk5lc3RlZERlY2xhcmF0aW9uKCIjZnVuY3Rpb25fdHlwZSIsIGhhc01lbWJlcnM6IGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRnVuY3Rpb25UeXBlKFRva2VuIGZ1bmN0aW9uVG9rZW4sIFRva2VuIHF1ZXN0aW9uTWFyaykgewogICAgZGVidWdFdmVudCgiRnVuY3Rpb25UeXBlIik7CiAgICByZXBvcnRFcnJvcklmTnVsbGFibGVUeXBlKHF1ZXN0aW9uTWFyayk7CiAgICBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+IGZvcm1hbHMgPSBwb3AoKTsKICAgIHBvcCgpOyAvLyBmb3JtYWxzIG9mZnNldAogICAgVHlwZUJ1aWxkZXIgcmV0dXJuVHlwZSA9IHBvcCgpOwogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyLCBEYXJ0VHlwZT4+IHR5cGVWYXJpYWJsZXMgPQogICAgICAgIHBvcCgpOwogICAgcHVzaChsaWJyYXJ5LmFkZEZ1bmN0aW9uVHlwZSgKICAgICAgICByZXR1cm5UeXBlLCB0eXBlVmFyaWFibGVzLCBmb3JtYWxzLCBmdW5jdGlvblRva2VuLmNoYXJPZmZzZXQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRnVuY3Rpb25UeXBlZEZvcm1hbFBhcmFtZXRlcihUb2tlbiBuYW1lVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXIiKTsKICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscyA9IHBvcCgpOwogICAgaW50IGZvcm1hbHNPZmZzZXQgPSBwb3AoKTsKICAgIFR5cGVCdWlsZGVyIHJldHVyblR5cGUgPSBwb3AoKTsKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcjxLZXJuZWxUeXBlQnVpbGRlciwgRGFydFR5cGU+PiB0eXBlVmFyaWFibGVzID0KICAgICAgICBwb3AoKTsKICAgIHB1c2gobGlicmFyeS5hZGRGdW5jdGlvblR5cGUoCiAgICAgICAgcmV0dXJuVHlwZSwgdHlwZVZhcmlhYmxlcywgZm9ybWFscywgZm9ybWFsc09mZnNldCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGdW5jdGlvblR5cGVBbGlhcygKICAgICAgVG9rZW4gdHlwZWRlZktleXdvcmQsIFRva2VuIGVxdWFscywgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZEZ1bmN0aW9uVHlwZUFsaWFzIik7CiAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQgPSBnZXREb2N1bWVudGF0aW9uQ29tbWVudCh0eXBlZGVmS2V5d29yZCk7CiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI8S2VybmVsVHlwZUJ1aWxkZXIsIERhcnRUeXBlPj4gdHlwZVZhcmlhYmxlczsKICAgIE9iamVjdCBuYW1lOwogICAgaW50IGNoYXJPZmZzZXQ7CiAgICBGdW5jdGlvblR5cGVCdWlsZGVyIGZ1bmN0aW9uVHlwZTsKICAgIGlmIChlcXVhbHMgPT0gbnVsbCkgewogICAgICBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+IGZvcm1hbHMgPSBwb3AoKTsKICAgICAgcG9wKCk7IC8vIGZvcm1hbHMgb2Zmc2V0CiAgICAgIHR5cGVWYXJpYWJsZXMgPSBwb3AoKTsKICAgICAgY2hhck9mZnNldCA9IHBvcCgpOwogICAgICBuYW1lID0gcG9wKCk7CiAgICAgIFR5cGVCdWlsZGVyIHJldHVyblR5cGUgPSBwb3AoKTsKICAgICAgLy8gQ3JlYXRlIGEgbmVzdGVkIGRlY2xhcmF0aW9uIHRoYXQgaXMgZW5kZWQgYmVsb3cgYnkKICAgICAgLy8gYGxpYnJhcnkuYWRkRnVuY3Rpb25UeXBlYC4KICAgICAgaWYgKG5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgICBwb3AoKTsgLy8gTWV0YWRhdGEuCiAgICAgICAgbGlicmFyeS5lbmROZXN0ZWREZWNsYXJhdGlvbigiPHN5bnRheC1lcnJvcj4iKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGlicmFyeS5iZWdpbk5lc3RlZERlY2xhcmF0aW9uKCIjZnVuY3Rpb25fdHlwZSIsIGhhc01lbWJlcnM6IGZhbHNlKTsKICAgICAgZnVuY3Rpb25UeXBlID0KICAgICAgICAgIGxpYnJhcnkuYWRkRnVuY3Rpb25UeXBlKHJldHVyblR5cGUsIG51bGwsIGZvcm1hbHMsIGNoYXJPZmZzZXQpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIHR5cGUgPSBwb3AoKTsKICAgICAgdHlwZVZhcmlhYmxlcyA9IHBvcCgpOwogICAgICBjaGFyT2Zmc2V0ID0gcG9wKCk7CiAgICAgIG5hbWUgPSBwb3AoKTsKICAgICAgaWYgKG5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgICBwb3AoKTsgLy8gTWV0YWRhdGEuCiAgICAgICAgbGlicmFyeS5lbmROZXN0ZWREZWNsYXJhdGlvbigiPHN5bnRheC1lcnJvcj4iKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlQnVpbGRlcikgewogICAgICAgIC8vIFRPRE8oYWhlKTogV2UgbmVlZCB0byBzdGFydCBhIG5lc3RlZCBkZWNsYXJhdGlvbiB3aGVuIHBhcnNpbmcgdGhlCiAgICAgICAgLy8gZm9ybWFscyBhbmQgcmV0dXJuIHR5cGUgc28gd2UgY2FuIGNvcnJlY3RseSBiaW5kCiAgICAgICAgLy8gYHR5cGUudHlwZVZhcmlhYmxlc2AuIEEgdHlwZWRlZiBjYW4gaGF2ZSB0eXBlIHZhcmlhYmxlcywgYW5kIGEgbmV3CiAgICAgICAgLy8gZnVuY3Rpb24gdHlwZSBjYW4gYWxzbyBoYXZlIHR5cGUgdmFyaWFibGVzIChyZXByZXNlbnRpbmcgdGhlIHR5cGUgb2YKICAgICAgICAvLyBhIGdlbmVyaWMgZnVuY3Rpb24pLgogICAgICAgIGZ1bmN0aW9uVHlwZSA9IHR5cGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVE9ETyhhaGUpOiBJbXByb3ZlIHRoaXMgZXJyb3IgbWVzc2FnZS4KICAgICAgICBhZGRQcm9ibGVtKG1lc3NhZ2VUeXBlZGVmTm90RnVuY3Rpb24sIGVxdWFscy5jaGFyT2Zmc2V0LCBlcXVhbHMubGVuZ3RoKTsKICAgICAgfQogICAgfQogICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI8S2VybmVsVHlwZUJ1aWxkZXI+PiBtZXRhZGF0YSA9IHBvcCgpOwogICAgY2hlY2tFbXB0eSh0eXBlZGVmS2V5d29yZC5jaGFyT2Zmc2V0KTsKICAgIGxpYnJhcnkuYWRkRnVuY3Rpb25UeXBlQWxpYXMoZG9jdW1lbnRhdGlvbkNvbW1lbnQsIG1ldGFkYXRhLCBuYW1lLAogICAgICAgIHR5cGVWYXJpYWJsZXMsIGZ1bmN0aW9uVHlwZSwgY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFRvcExldmVsRmllbGRzKFRva2VuIHN0YXRpY1Rva2VuLCBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwKICAgICAgVG9rZW4gdmFyRmluYWxPckNvbnN0LCBpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRUb3BMZXZlbEZpZWxkcyIpOwogICAgTGlzdDxGaWVsZEluZm8+IGZpZWxkSW5mb3MgPSBwb3BGaWVsZEluZm9zKGNvdW50KTsKICAgIFR5cGVCdWlsZGVyIHR5cGUgPSBudWxsSWZQYXJzZXJSZWNvdmVyeShwb3AoKSk7CiAgICBpbnQgbW9kaWZpZXJzID0gKHN0YXRpY1Rva2VuICE9IG51bGwgPyBzdGF0aWNNYXNrIDogMCkgfAogICAgICAgIChjb3ZhcmlhbnRUb2tlbiAhPSBudWxsID8gY292YXJpYW50TWFzayA6IDApIHwKICAgICAgICBNb2RpZmllci52YWxpZGF0ZVZhckZpbmFsT3JDb25zdCh2YXJGaW5hbE9yQ29uc3Q/LmxleGVtZSk7CiAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcjxLZXJuZWxUeXBlQnVpbGRlcj4+IG1ldGFkYXRhID0gcG9wKCk7CiAgICBjaGVja0VtcHR5KGJlZ2luVG9rZW4uY2hhck9mZnNldCk7CiAgICBpZiAoZmllbGRJbmZvcyA9PSBudWxsKSByZXR1cm47CiAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQgPSBnZXREb2N1bWVudGF0aW9uQ29tbWVudChiZWdpblRva2VuKTsKICAgIGxpYnJhcnkuYWRkRmllbGRzKAogICAgICAgIGRvY3VtZW50YXRpb25Db21tZW50LCBtZXRhZGF0YSwgbW9kaWZpZXJzLCB0eXBlLCBmaWVsZEluZm9zKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRmllbGRzKFRva2VuIHN0YXRpY1Rva2VuLCBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwgVG9rZW4gdmFyRmluYWxPckNvbnN0LAogICAgICBpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJGaWVsZHMiKTsKICAgIExpc3Q8RmllbGRJbmZvPiBmaWVsZEluZm9zID0gcG9wRmllbGRJbmZvcyhjb3VudCk7CiAgICBUeXBlQnVpbGRlciB0eXBlID0gcG9wKCk7CiAgICBpbnQgbW9kaWZpZXJzID0gKHN0YXRpY1Rva2VuICE9IG51bGwgPyBzdGF0aWNNYXNrIDogMCkgfAogICAgICAgIChjb3ZhcmlhbnRUb2tlbiAhPSBudWxsID8gY292YXJpYW50TWFzayA6IDApIHwKICAgICAgICBNb2RpZmllci52YWxpZGF0ZVZhckZpbmFsT3JDb25zdCh2YXJGaW5hbE9yQ29uc3Q/LmxleGVtZSk7CiAgICBpZiAoc3RhdGljVG9rZW4gPT0gbnVsbCAmJiBtb2RpZmllcnMgJiBjb25zdE1hc2sgIT0gMCkgewogICAgICAvLyBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhbiBpbnN0YW5jZSB2YXJpYWJsZSBpcyBkZWNsYXJlZCB0byBiZQogICAgICAvLyBjb25zdGFudC4KICAgICAgYWRkUHJvYmxlbShtZXNzYWdlQ29uc3RJbnN0YW5jZUZpZWxkLCB2YXJGaW5hbE9yQ29uc3QuY2hhck9mZnNldCwKICAgICAgICAgIHZhckZpbmFsT3JDb25zdC5sZW5ndGgpOwogICAgICBtb2RpZmllcnMgJj0gfmNvbnN0TWFzazsKICAgIH0KICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyPj4gbWV0YWRhdGEgPSBwb3AoKTsKICAgIGlmIChmaWVsZEluZm9zID09IG51bGwpIHJldHVybjsKICAgIFN0cmluZyBkb2N1bWVudGF0aW9uQ29tbWVudCA9IGdldERvY3VtZW50YXRpb25Db21tZW50KGJlZ2luVG9rZW4pOwogICAgbGlicmFyeS5hZGRGaWVsZHMoCiAgICAgICAgZG9jdW1lbnRhdGlvbkNvbW1lbnQsIG1ldGFkYXRhLCBtb2RpZmllcnMsIHR5cGUsIGZpZWxkSW5mb3MpOwogIH0KCiAgTGlzdDxGaWVsZEluZm8+IHBvcEZpZWxkSW5mb3MoaW50IGNvdW50KSB7CiAgICBpZiAoY291bnQgPT0gMCkgcmV0dXJuIG51bGw7CiAgICBMaXN0PEZpZWxkSW5mbz4gZmllbGRJbmZvcyA9IG5ldyBMaXN0PEZpZWxkSW5mbz4oY291bnQpOwogICAgYm9vbCBpc1BhcnNlclJlY292ZXJ5ID0gZmFsc2U7CiAgICBmb3IgKGludCBpID0gY291bnQgLSAxOyBpICE9IC0xOyBpLS0pIHsKICAgICAgaW50IGNoYXJFbmRPZmZzZXQgPSBwb3AoKTsKICAgICAgVG9rZW4gYmVmb3JlTGFzdCA9IHBvcCgpOwogICAgICBUb2tlbiBpbml0aWFsaXplclRva2VuRm9ySW5mZXJlbmNlID0gcG9wKCk7CiAgICAgIGludCBjaGFyT2Zmc2V0ID0gcG9wKCk7CiAgICAgIE9iamVjdCBuYW1lID0gcG9wKE51bGxWYWx1ZS5JZGVudGlmaWVyKTsKICAgICAgaWYgKG5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgICBpc1BhcnNlclJlY292ZXJ5ID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmaWVsZEluZm9zW2ldID0gbmV3IEZpZWxkSW5mbyhuYW1lLCBjaGFyT2Zmc2V0LAogICAgICAgICAgICBpbml0aWFsaXplclRva2VuRm9ySW5mZXJlbmNlLCBiZWZvcmVMYXN0LCBjaGFyRW5kT2Zmc2V0KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGlzUGFyc2VyUmVjb3ZlcnkgPyBudWxsIDogZmllbGRJbmZvczsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5UeXBlVmFyaWFibGUoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luVHlwZVZhcmlhYmxlIik7CiAgICBpbnQgY2hhck9mZnNldCA9IHBvcCgpOwogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogdHlwZSB2YXJpYWJsZSBtZXRhZGF0YSBzaG91bGQgbm90IGJlIGlnbm9yZWQuICBTZWUKICAgIC8vIGRhcnRidWcuY29tLzI4OTgxLgogICAgLyogTGlzdDxNZXRhZGF0YUJ1aWxkZXI8S2VybmVsVHlwZUJ1aWxkZXI+PiBtZXRhZGF0YSA9ICovIHBvcCgpOwogICAgaWYgKG5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHVzaChuYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2gobGlicmFyeS5hZGRUeXBlVmFyaWFibGUobmFtZSwgbnVsbCwgY2hhck9mZnNldCkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVUeXBlVmFyaWFibGVzRGVmaW5lZChUb2tlbiB0b2tlbiwgaW50IGNvdW50KSB7CiAgICBkZWJ1Z0V2ZW50KCJUeXBlVmFyaWFibGVzRGVmaW5lZCIpOwogICAgYXNzZXJ0KGNvdW50ID4gMCk7CiAgICBwdXNoKGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PAogICAgICAgICAgICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlcjxLZXJuZWxUeXBlQnVpbGRlciwgRGFydFR5cGU+PigpCiAgICAgICAgICAgIC5wb3Aoc3RhY2ssIGNvdW50KSA/PwogICAgICAgIE51bGxWYWx1ZS5UeXBlVmFyaWFibGVzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVHlwZVZhcmlhYmxlKFRva2VuIHRva2VuLCBpbnQgaW5kZXgsIFRva2VuIGV4dGVuZHNPclN1cGVyKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRUeXBlVmFyaWFibGUiKTsKICAgIFR5cGVCdWlsZGVyIGJvdW5kID0gbnVsbElmUGFyc2VyUmVjb3ZlcnkocG9wKCkpOwogICAgLy8gUGVlayB0byBsZWF2ZSB0eXBlIHBhcmFtZXRlcnMgb24gdG9wIG9mIHN0YWNrLgogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyLCBEYXJ0VHlwZT4+IHR5cGVQYXJhbWV0ZXJzID0KICAgICAgICBwZWVrKCk7CiAgICBpZiAodHlwZVBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICB0eXBlUGFyYW1ldGVyc1tpbmRleF0uYm91bmQgPSBib3VuZDsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVHlwZVZhcmlhYmxlcyhUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiZW5kVHlwZVZhcmlhYmxlcyIpOwoKICAgIC8vIFBlZWsgdG8gbGVhdmUgdHlwZSBwYXJhbWV0ZXJzIG9uIHRvcCBvZiBzdGFjay4KICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcjxLZXJuZWxUeXBlQnVpbGRlciwgRGFydFR5cGU+PiB0eXBlUGFyYW1ldGVycyA9CiAgICAgICAgcGVlaygpOwoKICAgIE1hcDxTdHJpbmcsIFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXNCeU5hbWU7CiAgICBpZiAodHlwZVBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgYnVpbGRlciBpbiB0eXBlUGFyYW1ldGVycykgewogICAgICAgIGlmIChidWlsZGVyLmJvdW5kICE9IG51bGwpIHsKICAgICAgICAgIGlmICh0eXBlVmFyaWFibGVzQnlOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgdHlwZVZhcmlhYmxlc0J5TmFtZSA9IG5ldyBNYXA8U3RyaW5nLCBUeXBlVmFyaWFibGVCdWlsZGVyPigpOwogICAgICAgICAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgYnVpbGRlciBpbiB0eXBlUGFyYW1ldGVycykgewogICAgICAgICAgICAgIHR5cGVWYXJpYWJsZXNCeU5hbWVbYnVpbGRlci5uYW1lXSA9IGJ1aWxkZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICAvLyBGaW5kIGN5Y2xlOiBJZiB0aGVyZSdzIG5vIGN5Y2xlIHdlIGNhbiBhdCBtb3N0IHN0ZXAgdGhyb3VnaCBhbGwKICAgICAgICAgIC8vIGB0eXBlUGFyYW1ldGVyc2AgKGF0IHdoaWNoIHBvaW50IHRoZSBsYXN0IGJ1aWxkZXJzIGJvdW5kIHdpbGwgYmUKICAgICAgICAgIC8vIG51bGwpLgogICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBjeWNsZSB3aXRoIGBidWlsZGVyYCAnaW5zaWRlJyB0aGUgc3RlcHMgdG8gZ2V0IGJhY2sgdG8KICAgICAgICAgIC8vIGl0IHdpbGwgYWxzbyBiZSBib3VuZCBieSBgdHlwZVBhcmFtZXRlcnMubGVuZ3RoYC4KICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgY3ljbGUgd2l0aG91dCBgYnVpbGRlcmAgJ2luc2lkZScgd2Ugd2lsbCBqdXN0IGlnbm9yZSBpdAogICAgICAgICAgLy8gZm9yIG5vdy4gSXQgd2lsbCBiZSByZXBvcnRlZCB3aGVuIHByb2Nlc3Npbmcgb25lIG9mIHRoZSBgYnVpbGRlcmBzCiAgICAgICAgICAvLyB0aGF0IGlzIGluIGZhY3QgYGluc2lkZWAgdGhlIGN5Y2xlLiBUaGlzIG1hdGNoZXMgdGhlIGN5Y2xpYyBjbGFzcwogICAgICAgICAgLy8gaGllcmFyY2h5IGVycm9yLgogICAgICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlciBib3VuZCA9IGJ1aWxkZXI7CiAgICAgICAgICBmb3IgKGludCBzdGVwcyA9IDA7CiAgICAgICAgICAgICAgYm91bmQuYm91bmQgIT0gbnVsbCAmJiBzdGVwcyA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsKICAgICAgICAgICAgICArK3N0ZXBzKSB7CiAgICAgICAgICAgIGJvdW5kID0gdHlwZVZhcmlhYmxlc0J5TmFtZVtib3VuZC5ib3VuZC5uYW1lXTsKICAgICAgICAgICAgaWYgKGJvdW5kID09IG51bGwgfHwgYm91bmQgPT0gYnVpbGRlcikgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYm91bmQgPT0gYnVpbGRlciAmJiBib3VuZC5ib3VuZCAhPSBudWxsKSB7CiAgICAgICAgICAgIC8vIFdyaXRlIG91dCBjeWNsZS4KICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHZpYSA9IG5ldyBMaXN0PFN0cmluZz4oKTsKICAgICAgICAgICAgYm91bmQgPSB0eXBlVmFyaWFibGVzQnlOYW1lW2J1aWxkZXIuYm91bmQubmFtZV07CiAgICAgICAgICAgIHdoaWxlIChib3VuZCAhPSBidWlsZGVyKSB7CiAgICAgICAgICAgICAgdmlhLmFkZChib3VuZC5uYW1lKTsKICAgICAgICAgICAgICBib3VuZCA9IHR5cGVWYXJpYWJsZXNCeU5hbWVbYm91bmQuYm91bmQubmFtZV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gdmlhLmlzRW1wdHkKICAgICAgICAgICAgICAgID8gdGVtcGxhdGVEaXJlY3RDeWNsZUluVHlwZVZhcmlhYmxlcy53aXRoQXJndW1lbnRzKGJ1aWxkZXIubmFtZSkKICAgICAgICAgICAgICAgIDogdGVtcGxhdGVDeWNsZUluVHlwZVZhcmlhYmxlcy53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIubmFtZSwgdmlhLmpvaW4oIicsICciKSk7CiAgICAgICAgICAgIGFkZFByb2JsZW0obWVzc2FnZSwgYnVpbGRlci5jaGFyT2Zmc2V0LCBidWlsZGVyLm5hbWUubGVuZ3RoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAoaW5Db25zdHJ1Y3Rvck5hbWUpIHsKICAgICAgYWRkUHJvYmxlbShtZXNzYWdlQ29uc3RydWN0b3JXaXRoVHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICBvZmZzZXRGb3JUb2tlbihiZWdpblRva2VuKSwgbGVuZ3RoT2ZTcGFuKGJlZ2luVG9rZW4sIGVuZFRva2VuKSk7CiAgICAgIGluQ29uc3RydWN0b3JOYW1lID0gZmFsc2U7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFBhcnRPZigKICAgICAgVG9rZW4gcGFydEtleXdvcmQsIFRva2VuIG9mS2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uLCBib29sIGhhc05hbWUpIHsKICAgIGRlYnVnRXZlbnQoImVuZFBhcnRPZiIpOwogICAgaW50IGNoYXJPZmZzZXQgPSBwb3BDaGFyT2Zmc2V0KCk7CiAgICBPYmplY3QgY29udGFpbmluZ0xpYnJhcnkgPSBwb3AoKTsKICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyPj4gbWV0YWRhdGEgPSBwb3AoKTsKICAgIGlmIChoYXNOYW1lKSB7CiAgICAgIGxpYnJhcnkuYWRkUGFydE9mKG1ldGFkYXRhLAogICAgICAgICAgZmxhdHRlbk5hbWUoY29udGFpbmluZ0xpYnJhcnksIGNoYXJPZmZzZXQsIHVyaSksIG51bGwsIGNoYXJPZmZzZXQpOwogICAgfSBlbHNlIHsKICAgICAgbGlicmFyeS5hZGRQYXJ0T2YobWV0YWRhdGEsIG51bGwsIGNvbnRhaW5pbmdMaWJyYXJ5LCBjaGFyT2Zmc2V0KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ29uc3RydWN0b3JSZWZlcmVuY2UoCiAgICAgIFRva2VuIHN0YXJ0LCBUb2tlbiBwZXJpb2RCZWZvcmVOYW1lLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiQ29uc3RydWN0b3JSZWZlcmVuY2UiKTsKICAgIHBvcElmTm90TnVsbChwZXJpb2RCZWZvcmVOYW1lKTsgLy8gY2hhck9mZnNldC4KICAgIFN0cmluZyBzdWZmaXggPSBwb3BJZk5vdE51bGwocGVyaW9kQmVmb3JlTmFtZSk7CiAgICBMaXN0PFR5cGVCdWlsZGVyPiB0eXBlQXJndW1lbnRzID0gcG9wKCk7CiAgICBpbnQgY2hhck9mZnNldCA9IHBvcCgpOwogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIGlmIChuYW1lIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIHB1c2gobmFtZSk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKGxpYnJhcnkuYWRkQ29uc3RydWN0b3JSZWZlcmVuY2UoCiAgICAgICAgICBuYW1lLCB0eXBlQXJndW1lbnRzLCBzdWZmaXgsIGNoYXJPZmZzZXQpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5GYWN0b3J5TWV0aG9kKAogICAgICBUb2tlbiBsYXN0Q29uc3VtZWQsIFRva2VuIGV4dGVybmFsVG9rZW4sIFRva2VuIGNvbnN0VG9rZW4pIHsKICAgIGluQ29uc3RydWN0b3IgPSB0cnVlOwogICAgbGlicmFyeS5iZWdpbk5lc3RlZERlY2xhcmF0aW9uKCIjZmFjdG9yeV9tZXRob2QiLCBoYXNNZW1iZXJzOiBmYWxzZSk7CiAgICBwdXNoKChleHRlcm5hbFRva2VuICE9IG51bGwgPyBleHRlcm5hbE1hc2sgOiAwKSB8CiAgICAgICAgKGNvbnN0VG9rZW4gIT0gbnVsbCA/IGNvbnN0TWFzayA6IDApKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRmFjdG9yeU1ldGhvZCgKICAgICAgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZmFjdG9yeUtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJGYWN0b3J5TWV0aG9kIik7CiAgICBNZXRob2RCb2R5IGtpbmQgPSBwb3AoKTsKICAgIENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlciByZWRpcmVjdGlvblRhcmdldDsKICAgIGlmIChraW5kID09IE1ldGhvZEJvZHkuUmVkaXJlY3RpbmdGYWN0b3J5Qm9keSkgewogICAgICByZWRpcmVjdGlvblRhcmdldCA9IG51bGxJZlBhcnNlclJlY292ZXJ5KHBvcCgpKTsKICAgIH0KICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscyA9IHBvcCgpOwogICAgaW50IGZvcm1hbHNPZmZzZXQgPSBwb3AoKTsKICAgIHBvcCgpOyAvLyB0eXBlIHZhcmlhYmxlcwogICAgaW50IGNoYXJPZmZzZXQgPSBwb3AoKTsKICAgIE9iamVjdCBuYW1lID0gcG9wKCk7CiAgICBpbnQgbW9kaWZpZXJzID0gcG9wKCk7CiAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcjxLZXJuZWxUeXBlQnVpbGRlcj4+IG1ldGFkYXRhID0gcG9wKCk7CiAgICBpZiAobmFtZSBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBsaWJyYXJ5LmVuZE5lc3RlZERlY2xhcmF0aW9uKCI8c3ludGF4LWVycm9yPiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQgPSBnZXREb2N1bWVudGF0aW9uQ29tbWVudChiZWdpblRva2VuKTsKICAgIGxpYnJhcnkuYWRkRmFjdG9yeU1ldGhvZCgKICAgICAgICBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgICBtZXRhZGF0YSwKICAgICAgICBtb2RpZmllcnMsCiAgICAgICAgbmFtZSwKICAgICAgICBmb3JtYWxzLAogICAgICAgIHJlZGlyZWN0aW9uVGFyZ2V0LAogICAgICAgIGJlZ2luVG9rZW4uY2hhck9mZnNldCwKICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgIGZvcm1hbHNPZmZzZXQsCiAgICAgICAgZW5kVG9rZW4uY2hhck9mZnNldCwKICAgICAgICBuYXRpdmVNZXRob2ROYW1lKTsKICAgIG5hdGl2ZU1ldGhvZE5hbWUgPSBudWxsOwogICAgaW5Db25zdHJ1Y3RvciA9IGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5Iik7CiAgICBwdXNoKE1ldGhvZEJvZHkuUmVkaXJlY3RpbmdGYWN0b3J5Qm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZpZWxkSW5pdGlhbGl6ZXIoVG9rZW4gYXNzaWdubWVudE9wZXJhdG9yLCBUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiRmllbGRJbml0aWFsaXplciIpOwogICAgVG9rZW4gYmVmb3JlTGFzdCA9IGFzc2lnbm1lbnRPcGVyYXRvci5uZXh0OwogICAgVG9rZW4gbmV4dCA9IGJlZm9yZUxhc3QubmV4dDsKICAgIHdoaWxlIChuZXh0ICE9IHRva2VuICYmICFuZXh0LmlzRW9mKSB7CiAgICAgIC8vIFRvIGF2b2lkIHN0b3JpbmcgdGhlIHJlc3Qgb2YgdGhlIHRva2VuIHN0cmVhbSwgd2UgbmVlZCB0byBpZGVudGlmeSB0aGUKICAgICAgLy8gdG9rZW4gYmVmb3JlIFt0b2tlbl0uIFRoYXQgdG9rZW4gd2lsbCBiZSB0aGUgbGFzdCB0b2tlbiBvZiB0aGUKICAgICAgLy8gaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbiBhbmQgYnkgc2V0dGluZyBpdHMgdGFpbCB0byBFT0Ygd2Ugb25seSBzdG9yZQogICAgICAvLyB0aGUgdG9rZW5zIGZvciB0aGUgZXhwcmVzc2lvbi4KICAgICAgLy8gVE9ETyhhaGUpOiBNaWdodCBiZSBjbGVhcmVyIGlmIHRoaXMgc2VhcmNoIHdhcyBtb3ZlZCB0bwogICAgICAvLyBgbGlicmFyeS5hZGRGaWVsZHNgLgogICAgICAvLyBUT0RPKGFoZSk6IEkgZG9uJ3QgZXZlbiB0aGluayB0aGlzIGlzIG5lY2Vzc2FyeS4gW3Rva2VuXSBwb2ludHMgdG8gOwogICAgICAvLyBvciAsIGFuZCB3ZSBkb24ndCBvdGhlcndpc2Ugc3RvcmUgdG9rZW5zLgogICAgICBiZWZvcmVMYXN0ID0gbmV4dDsKICAgICAgbmV4dCA9IG5leHQubmV4dDsKICAgIH0KICAgIHB1c2goYXNzaWdubWVudE9wZXJhdG9yLm5leHQpOwogICAgcHVzaChiZWZvcmVMYXN0KTsKICAgIHB1c2godG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vRmllbGRJbml0aWFsaXplcihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTm9GaWVsZEluaXRpYWxpemVyIik7CiAgICBwdXNoKE51bGxWYWx1ZS5GaWVsZEluaXRpYWxpemVyKTsKICAgIHB1c2goTnVsbFZhbHVlLkZpZWxkSW5pdGlhbGl6ZXIpOwogICAgcHVzaCh0b2tlbi5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kSW5pdGlhbGl6ZXJzKGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkluaXRpYWxpemVycyIpOwogICAgLy8gSWdub3JlZCBmb3Igbm93LgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0luaXRpYWxpemVycygpIHsKICAgIGRlYnVnRXZlbnQoIk5vSW5pdGlhbGl6ZXJzIik7CiAgICAvLyBUaGlzIGlzIGEgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXIgYW5kIGl0J3MgaWdub3JlZCBmb3Igbm93LgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJbnZhbGlkTWVtYmVyKFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJJbnZhbGlkTWVtYmVyIik7CiAgICBwb3AoKTsgLy8gbWV0YWRhdGEgc3RhcgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRNZW1iZXIoKSB7CiAgICBkZWJ1Z0V2ZW50KCJNZW1iZXIiKTsKICAgIGFzc2VydChuYXRpdmVNZXRob2ROYW1lID09IG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDbGFzc1dpdGhDbGF1c2UoVG9rZW4gd2l0aEtleXdvcmQpIHsKICAgIGRlYnVnRXZlbnQoIkNsYXNzV2l0aENsYXVzZSIpOwoKICAgIE9iamVjdCBtaXhpbnMgPSBwb3AoKTsKICAgIGludCBleHRlbmRzT2Zmc2V0ID0gcG9wKCk7CiAgICBPYmplY3Qgc3VwZXJ0eXBlID0gcG9wKCk7CiAgICBpZiAoc3VwZXJ0eXBlIGlzIFBhcnNlclJlY292ZXJ5IHx8IG1peGlucyBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBwdXNoKG5ldyBQYXJzZXJSZWNvdmVyeSh3aXRoS2V5d29yZC5jaGFyT2Zmc2V0KSk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKGxpYnJhcnkuYWRkTWl4aW5BcHBsaWNhdGlvbigKICAgICAgICAgIHN1cGVydHlwZSwgbWl4aW5zLCB3aXRoS2V5d29yZC5jaGFyT2Zmc2V0KSk7CiAgICB9CiAgICBwdXNoKGV4dGVuZHNPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDbGFzc05vV2l0aENsYXVzZSgpIHsKICAgIGRlYnVnRXZlbnQoIkNsYXNzTm9XaXRoQ2xhdXNlIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNsYXNzSGVhZGVyKFRva2VuIGJlZ2luLCBUb2tlbiBjbGFzc0tleXdvcmQsIFRva2VuIG5hdGl2ZVRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJDbGFzc0hlYWRlciIpOwogICAgbmF0aXZlTWV0aG9kTmFtZSA9IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU1peGluSGVhZGVyKFRva2VuIG1peGluS2V5d29yZCkgewogICAgZGVidWdFdmVudCgiaGFuZGxlTWl4aW5IZWFkZXIiKTsKICAgIG5hdGl2ZU1ldGhvZE5hbWUgPSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDbGFzc09yTWl4aW5Cb2R5KGludCBtZW1iZXJDb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkNsYXNzT3JNaXhpbkJvZHkiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQXN5bmNNb2RpZmllcihUb2tlbiBhc3luY1Rva2VuLCBUb2tlbiBzdGFyVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkFzeW5jTW9kaWZpZXIiKTsKICB9CgogIHZvaWQgYWRkUHJvYmxlbShNZXNzYWdlIG1lc3NhZ2UsIGludCBjaGFyT2Zmc2V0LCBpbnQgbGVuZ3RoLAogICAgICB7Ym9vbCB3YXNIYW5kbGVkOiBmYWxzZSwgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dH0pIHsKICAgIGxpYnJhcnkuYWRkUHJvYmxlbShtZXNzYWdlLCBjaGFyT2Zmc2V0LCBsZW5ndGgsIHVyaSwKICAgICAgICB3YXNIYW5kbGVkOiB3YXNIYW5kbGVkLCBjb250ZXh0OiBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNJZ25vcmVkRXJyb3IoQ29kZSBjb2RlLCBUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIGlzSWdub3JlZFBhcnNlckVycm9yKGNvZGUsIHRva2VuKSB8fAogICAgICAgIHN1cGVyLmlzSWdub3JlZEVycm9yKGNvZGUsIHRva2VuKTsKICB9CgogIC8vLyBSZXR1cm4gdGhlIGRvY3VtZW50YXRpb24gY29tbWVudCBmb3IgdGhlIGVudGl0eSB0aGF0IHN0YXJ0cyBhdCB0aGUKICAvLy8gZ2l2ZW4gW3Rva2VuXSwgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vIHByZWNlZGluZyBkb2N1bWVudGF0aW9uIGNvbW1lbnQuCiAgc3RhdGljIFN0cmluZyBnZXREb2N1bWVudGF0aW9uQ29tbWVudChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gZG9jVG9rZW4gPSB0b2tlbi5wcmVjZWRpbmdDb21tZW50czsKICAgIGlmIChkb2NUb2tlbiA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGJvb2wgaW5TbGFzaCA9IGZhbHNlOwogICAgdmFyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHdoaWxlIChkb2NUb2tlbiAhPSBudWxsKSB7CiAgICAgIFN0cmluZyBsZXhlbWUgPSBkb2NUb2tlbi5sZXhlbWU7CiAgICAgIGlmIChsZXhlbWUuc3RhcnRzV2l0aCgnLyoqJykpIHsKICAgICAgICBpblNsYXNoID0gZmFsc2U7CiAgICAgICAgYnVmZmVyLmNsZWFyKCk7CiAgICAgICAgYnVmZmVyLndyaXRlKGxleGVtZSk7CiAgICAgIH0gZWxzZSBpZiAobGV4ZW1lLnN0YXJ0c1dpdGgoJy8vLycpKSB7CiAgICAgICAgaWYgKCFpblNsYXNoKSB7CiAgICAgICAgICBpblNsYXNoID0gdHJ1ZTsKICAgICAgICAgIGJ1ZmZlci5jbGVhcigpOwogICAgICAgIH0KICAgICAgICBpZiAoYnVmZmVyLmlzTm90RW1wdHkpIHsKICAgICAgICAgIGJ1ZmZlci53cml0ZWxuKCk7CiAgICAgICAgfQogICAgICAgIGJ1ZmZlci53cml0ZShsZXhlbWUpOwogICAgICB9CiAgICAgIGRvY1Rva2VuID0gZG9jVG9rZW4ubmV4dDsKICAgIH0KICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZGVidWdFdmVudChTdHJpbmcgbmFtZSkgewogICAgLy8gcHJpbnRFdmVudCgnT3V0bGluZUJ1aWxkZXI6ICRuYW1lJyk7CiAgfQp9CoaJAE5OPAEfAUgBIgEtATMBHQkOGBEpIxwqLiQjLCIjJiwpLjAsLCwBQgFNJwkn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YXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCmxpYnJhcnkgZmFzdGEuY29sbGVjdGlvbnM7CgppbXBvcnQgJ2RhcnQ6Y29yZScgaGlkZSBNYXBFbnRyeTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgRGFydFR5cGUsCiAgICAgICAgRXhwcmVzc2lvbiwKICAgICAgICBNYXBFbnRyeSwKICAgICAgICBOdWxsTGl0ZXJhbCwKICAgICAgICBTdGF0ZW1lbnQsCiAgICAgICAgVHJlZU5vZGUsCiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiwKICAgICAgICBzZXRQYXJlbnRzLAogICAgICAgIHRyYW5zZm9ybUxpc3QsCiAgICAgICAgdmlzaXRMaXN0OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQnIHNob3cgVHlwZUVudmlyb25tZW50OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC92aXNpdG9yLmRhcnQnCiAgICBzaG93CiAgICAgICAgRXhwcmVzc2lvblZpc2l0b3IsCiAgICAgICAgRXhwcmVzc2lvblZpc2l0b3IxLAogICAgICAgIFRyYW5zZm9ybWVyLAogICAgICAgIFRyZWVWaXNpdG9yLAogICAgICAgIFZpc2l0b3I7CgppbXBvcnQgJy4uL21lc3NhZ2VzLmRhcnQnCiAgICBzaG93IHRlbXBsYXRlRXhwZWN0ZWRBZnRlckJ1dEdvdCwgdGVtcGxhdGVFeHBlY3RlZEJ1dEdvdDsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyBnZXRGaWxlVXJpLCB1bnN1cHBvcnRlZDsKCmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2UvaW5mZXJlbmNlX2hlbHBlci5kYXJ0JyBzaG93IEluZmVyZW5jZUhlbHBlcjsKCi8vLyBNaXhpbiBmb3Igc3ByZWFkIGFuZCBjb250cm9sLWZsb3cgZWxlbWVudHMuCi8vLwovLy8gU3ByZWFkIGFuZCBjb250cm9sLWZsb3cgZWxlbWVudHMgYXJlIG5vdCB0cnVseSBleHByZXNzaW9ucyBhbmQgdGhleSBjYW5ub3QKLy8vIGFwcGVhciBpbiBhcmJpdHJhcnkgZXhwcmVzc2lvbiBjb250ZXh0cyBpbiB0aGUgS2VybmVsIHByb2dyYW0uICBUaGV5IGNhbgovLy8gb25seSBhcHBlYXIgYXMgZWxlbWVudHMgaW4gbGlzdCBvciBzZXQgbGl0ZXJhbHMuICBUaGV5IGFyZSB0cmFuc2xhdGVkIGludG8KLy8vIGEgbG93ZXItbGV2ZWwgcmVwcmVzZW50YXRpb24gYW5kIG5ldmVyIHNlcmlhbGl6ZWQgdG8gLmRpbGwgZmlsZXMuCm1peGluIENvbnRyb2xGbG93RWxlbWVudCBvbiBFeHByZXNzaW9uIHsKICAvLy8gU3ByZWFkIGFuZCBjb250b2wtZmxvdyBlbGVtZW50cyBhcmUgbm90IGV4cHJlc3Npb25zIGFuZCBkbyBub3QgaGF2ZSBhCiAgLy8vIHN0YXRpYyB0eXBlLgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoImdldFN0YXRpY1R5cGUiLCBmaWxlT2Zmc2V0LCBnZXRGaWxlVXJpKHRoaXMpKTsKICB9CgogIEBvdmVycmlkZQogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvcjxPYmplY3Q+IHYpID0+IHYuZGVmYXVsdEV4cHJlc3Npb24odGhpcyk7CgogIEBvdmVycmlkZQogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxPE9iamVjdCwgT2JqZWN0PiB2LCBhcmcpID0+CiAgICAgIHYuZGVmYXVsdEV4cHJlc3Npb24odGhpcywgYXJnKTsKfQoKLy8vIEEgc3ByZWFkIGVsZW1lbnQgaW4gYSBsaXN0IG9yIHNldCBsaXRlcmFsLgpjbGFzcyBTcHJlYWRFbGVtZW50IGV4dGVuZHMgRXhwcmVzc2lvbiB3aXRoIENvbnRyb2xGbG93RWxlbWVudCB7CiAgRXhwcmVzc2lvbiBleHByZXNzaW9uOwogIGJvb2wgaXNOdWxsQXdhcmU7CgogIC8vLyBUaGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCBbZXhwcmVzc2lvbl0gZXZhbHVhdGVzIHRvLgogIC8vLwogIC8vLyBJdCBpcyBzZXQgZHVyaW5nIHR5cGUgaW5mZXJlbmNlIGFuZCBpcyB1c2VkIHRvIGFkZCBhcHByb3ByaWF0ZSB0eXBlIGNhc3RzCiAgLy8vIGR1cmluZyB0aGUgZGVzdWdhcmluZy4KICBEYXJ0VHlwZSBlbGVtZW50VHlwZTsKCiAgU3ByZWFkRWxlbWVudCh0aGlzLmV4cHJlc3Npb24sIHRoaXMuaXNOdWxsQXdhcmUpIHsKICAgIGV4cHJlc3Npb24/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENoaWxkcmVuKFZpc2l0b3I8T2JqZWN0PiB2KSB7CiAgICBleHByZXNzaW9uPy5hY2NlcHQodik7CiAgfQoKICBAb3ZlcnJpZGUKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoZXhwcmVzc2lvbiAhPSBudWxsKSB7CiAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLmFjY2VwdCh2KTsKICAgICAgZXhwcmVzc2lvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBBbiAnaWYnIGVsZW1lbnQgaW4gYSBsaXN0IG9yIHNldCBsaXRlcmFsLgpjbGFzcyBJZkVsZW1lbnQgZXh0ZW5kcyBFeHByZXNzaW9uIHdpdGggQ29udHJvbEZsb3dFbGVtZW50IHsKICBFeHByZXNzaW9uIGNvbmRpdGlvbjsKICBFeHByZXNzaW9uIHRoZW47CiAgRXhwcmVzc2lvbiBvdGhlcndpc2U7CgogIElmRWxlbWVudCh0aGlzLmNvbmRpdGlvbiwgdGhpcy50aGVuLCB0aGlzLm90aGVyd2lzZSkgewogICAgY29uZGl0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgdGhlbj8ucGFyZW50ID0gdGhpczsKICAgIG90aGVyd2lzZT8ucGFyZW50ID0gdGhpczsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxPYmplY3Q+IHYpIHsKICAgIGNvbmRpdGlvbj8uYWNjZXB0KHYpOwogICAgdGhlbj8uYWNjZXB0KHYpOwogICAgb3RoZXJ3aXNlPy5hY2NlcHQodik7CiAgfQoKICBAb3ZlcnJpZGUKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoY29uZGl0aW9uICE9IG51bGwpIHsKICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uLmFjY2VwdCh2KTsKICAgICAgY29uZGl0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHRoZW4gIT0gbnVsbCkgewogICAgICB0aGVuID0gdGhlbi5hY2NlcHQodik7CiAgICAgIHRoZW4/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAob3RoZXJ3aXNlICE9IG51bGwpIHsKICAgICAgb3RoZXJ3aXNlID0gb3RoZXJ3aXNlLmFjY2VwdCh2KTsKICAgICAgb3RoZXJ3aXNlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEEgJ2ZvcicgZWxlbWVudCBpbiBhIGxpc3Qgb3Igc2V0IGxpdGVyYWwuCmNsYXNzIEZvckVsZW1lbnQgZXh0ZW5kcyBFeHByZXNzaW9uIHdpdGggQ29udHJvbEZsb3dFbGVtZW50IHsKICBmaW5hbCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlczsgLy8gTWF5IGJlIGVtcHR5LCBidXQgbm90IG51bGwuCiAgRXhwcmVzc2lvbiBjb25kaXRpb247IC8vIE1heSBiZSBudWxsLgogIGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gdXBkYXRlczsgLy8gTWF5IGJlIGVtcHR5LCBidXQgbm90IG51bGwuCiAgRXhwcmVzc2lvbiBib2R5OwoKICBGb3JFbGVtZW50KHRoaXMudmFyaWFibGVzLCB0aGlzLmNvbmRpdGlvbiwgdGhpcy51cGRhdGVzLCB0aGlzLmJvZHkpIHsKICAgIHNldFBhcmVudHModmFyaWFibGVzLCB0aGlzKTsKICAgIGNvbmRpdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIHNldFBhcmVudHModXBkYXRlcywgdGhpcyk7CiAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yPE9iamVjdD4gdikgewogICAgdmlzaXRMaXN0KHZhcmlhYmxlcywgdik7CiAgICBjb25kaXRpb24/LmFjY2VwdCh2KTsKICAgIHZpc2l0TGlzdCh1cGRhdGVzLCB2KTsKICAgIGJvZHk/LmFjY2VwdCh2KTsKICB9CgogIEBvdmVycmlkZQogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIHRyYW5zZm9ybUxpc3QodmFyaWFibGVzLCB2LCB0aGlzKTsKICAgIGlmIChjb25kaXRpb24gIT0gbnVsbCkgewogICAgICBjb25kaXRpb24gPSBjb25kaXRpb24uYWNjZXB0KHYpOwogICAgICBjb25kaXRpb24/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICB0cmFuc2Zvcm1MaXN0KHVwZGF0ZXMsIHYsIHRoaXMpOwogICAgaWYgKGJvZHkgIT0gbnVsbCkgewogICAgICBib2R5ID0gYm9keS5hY2NlcHQodik7CiAgICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gQSAnZm9yLWluJyBlbGVtZW50IGluIGEgbGlzdCBvciBzZXQgbGl0ZXJhbC4KY2xhc3MgRm9ySW5FbGVtZW50IGV4dGVuZHMgRXhwcmVzc2lvbiB3aXRoIENvbnRyb2xGbG93RWxlbWVudCB7CiAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZTsgLy8gSGFzIG5vIGluaXRpYWxpemVyLgogIEV4cHJlc3Npb24gaXRlcmFibGU7CiAgU3RhdGVtZW50IHByb2xvZ3VlOyAvLyBNYXkgYmUgbnVsbC4KICBFeHByZXNzaW9uIGJvZHk7CiAgRXhwcmVzc2lvbiBwcm9ibGVtOyAvLyBNYXkgYmUgbnVsbC4KICBib29sIGlzQXN5bmM7IC8vIFRydWUgaWYgdGhpcyBpcyBhbiAnYXdhaXQgZm9yJyBsb29wLgoKICBGb3JJbkVsZW1lbnQoCiAgICAgIHRoaXMudmFyaWFibGUsIHRoaXMuaXRlcmFibGUsIHRoaXMucHJvbG9ndWUsIHRoaXMuYm9keSwgdGhpcy5wcm9ibGVtLAogICAgICB7dGhpcy5pc0FzeW5jOiBmYWxzZX0pIHsKICAgIHZhcmlhYmxlPy5wYXJlbnQgPSB0aGlzOwogICAgaXRlcmFibGU/LnBhcmVudCA9IHRoaXM7CiAgICBwcm9sb2d1ZT8ucGFyZW50ID0gdGhpczsKICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgICBwcm9ibGVtPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yPE9iamVjdD4gdikgewogICAgdmFyaWFibGU/LmFjY2VwdCh2KTsKICAgIGl0ZXJhYmxlPy5hY2NlcHQodik7CiAgICBwcm9sb2d1ZT8uYWNjZXB0KHYpOwogICAgYm9keT8uYWNjZXB0KHYpOwogICAgcHJvYmxlbT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHZhcmlhYmxlICE9IG51bGwpIHsKICAgICAgdmFyaWFibGUgPSB2YXJpYWJsZS5hY2NlcHQodik7CiAgICAgIHZhcmlhYmxlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKGl0ZXJhYmxlICE9IG51bGwpIHsKICAgICAgaXRlcmFibGUgPSBpdGVyYWJsZS5hY2NlcHQodik7CiAgICAgIGl0ZXJhYmxlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHByb2xvZ3VlICE9IG51bGwpIHsKICAgICAgcHJvbG9ndWUgPSBwcm9sb2d1ZS5hY2NlcHQodik7CiAgICAgIHByb2xvZ3VlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKGJvZHkgIT0gbnVsbCkgewogICAgICBib2R5ID0gYm9keS5hY2NlcHQodik7CiAgICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAocHJvYmxlbSAhPSBudWxsKSB7CiAgICAgIHByb2JsZW0gPSBwcm9ibGVtLmFjY2VwdCh2KTsKICAgICAgcHJvYmxlbT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCm1peGluIENvbnRyb2xGbG93TWFwRW50cnkgaW1wbGVtZW50cyBNYXBFbnRyeSB7CiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBnZXQga2V5IHsKICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoJ0NvbnRyb2xGbG93TWFwRW50cnkua2V5IGdldHRlcicpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXQga2V5KEV4cHJlc3Npb24gZXhwcikgewogICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcignQ29udHJvbEZsb3dNYXBFbnRyeS5rZXkgc2V0dGVyJyk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGdldCB2YWx1ZSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCdDb250cm9sRmxvd01hcEVudHJ5LnZhbHVlIGdldHRlcicpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXQgdmFsdWUoRXhwcmVzc2lvbiBleHByKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCdDb250cm9sRmxvd01hcEVudHJ5LnZhbHVlIHNldHRlcicpOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KFRyZWVWaXNpdG9yPE9iamVjdD4gdikgPT4gdi5kZWZhdWx0VHJlZU5vZGUodGhpcyk7Cn0KCi8vLyBBIHNwcmVhZCBlbGVtZW50IGluIGEgbWFwIGxpdGVyYWwuCmNsYXNzIFNwcmVhZE1hcEVudHJ5IGV4dGVuZHMgVHJlZU5vZGUgd2l0aCBDb250cm9sRmxvd01hcEVudHJ5IHsKICBFeHByZXNzaW9uIGV4cHJlc3Npb247CiAgYm9vbCBpc051bGxBd2FyZTsKCiAgLy8vIFRoZSB0eXBlIG9mIHRoZSBtYXAgZW50cmllcyBvZiB0aGUgbWFwIHRoYXQgW2V4cHJlc3Npb25dIGV2YWx1YXRlcyB0by4KICAvLy8KICAvLy8gSXQgaXMgc2V0IGR1cmluZyB0eXBlIGluZmVyZW5jZSBhbmQgaXMgdXNlZCB0byBhZGQgYXBwcm9wcmlhdGUgdHlwZSBjYXN0cwogIC8vLyBkdXJpbmcgdGhlIGRlc3VnYXJpbmcuCiAgRGFydFR5cGUgZW50cnlUeXBlOwoKICBTcHJlYWRNYXBFbnRyeSh0aGlzLmV4cHJlc3Npb24sIHRoaXMuaXNOdWxsQXdhcmUpIHsKICAgIGV4cHJlc3Npb24/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENoaWxkcmVuKFZpc2l0b3I8T2JqZWN0PiB2KSB7CiAgICBleHByZXNzaW9uPy5hY2NlcHQodik7CiAgfQoKICBAb3ZlcnJpZGUKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoZXhwcmVzc2lvbiAhPSBudWxsKSB7CiAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLmFjY2VwdCh2KTsKICAgICAgZXhwcmVzc2lvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBBbiAnaWYnIGVsZW1lbnQgaW4gYSBtYXAgbGl0ZXJhbC4KY2xhc3MgSWZNYXBFbnRyeSBleHRlbmRzIFRyZWVOb2RlIHdpdGggQ29udHJvbEZsb3dNYXBFbnRyeSB7CiAgRXhwcmVzc2lvbiBjb25kaXRpb247CiAgTWFwRW50cnkgdGhlbjsKICBNYXBFbnRyeSBvdGhlcndpc2U7CgogIElmTWFwRW50cnkodGhpcy5jb25kaXRpb24sIHRoaXMudGhlbiwgdGhpcy5vdGhlcndpc2UpIHsKICAgIGNvbmRpdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIHRoZW4/LnBhcmVudCA9IHRoaXM7CiAgICBvdGhlcndpc2U/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENoaWxkcmVuKFZpc2l0b3I8T2JqZWN0PiB2KSB7CiAgICBjb25kaXRpb24/LmFjY2VwdCh2KTsKICAgIHRoZW4/LmFjY2VwdCh2KTsKICAgIG90aGVyd2lzZT8uYWNjZXB0KHYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGNvbmRpdGlvbiAhPSBudWxsKSB7CiAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbi5hY2NlcHQodik7CiAgICAgIGNvbmRpdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmICh0aGVuICE9IG51bGwpIHsKICAgICAgdGhlbiA9IHRoZW4uYWNjZXB0KHYpOwogICAgICB0aGVuPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKG90aGVyd2lzZSAhPSBudWxsKSB7CiAgICAgIG90aGVyd2lzZSA9IG90aGVyd2lzZS5hY2NlcHQodik7CiAgICAgIG90aGVyd2lzZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBBICdmb3InIGVsZW1lbnQgaW4gYSBtYXAgbGl0ZXJhbC4KY2xhc3MgRm9yTWFwRW50cnkgZXh0ZW5kcyBUcmVlTm9kZSB3aXRoIENvbnRyb2xGbG93TWFwRW50cnkgewogIGZpbmFsIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gdmFyaWFibGVzOyAvLyBNYXkgYmUgZW1wdHksIGJ1dCBub3QgbnVsbC4KICBFeHByZXNzaW9uIGNvbmRpdGlvbjsgLy8gTWF5IGJlIG51bGwuCiAgZmluYWwgTGlzdDxFeHByZXNzaW9uPiB1cGRhdGVzOyAvLyBNYXkgYmUgZW1wdHksIGJ1dCBub3QgbnVsbC4KICBNYXBFbnRyeSBib2R5OwoKICBGb3JNYXBFbnRyeSh0aGlzLnZhcmlhYmxlcywgdGhpcy5jb25kaXRpb24sIHRoaXMudXBkYXRlcywgdGhpcy5ib2R5KSB7CiAgICBzZXRQYXJlbnRzKHZhcmlhYmxlcywgdGhpcyk7CiAgICBjb25kaXRpb24/LnBhcmVudCA9IHRoaXM7CiAgICBzZXRQYXJlbnRzKHVwZGF0ZXMsIHRoaXMpOwogICAgYm9keT8ucGFyZW50ID0gdGhpczsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxPYmplY3Q+IHYpIHsKICAgIHZpc2l0TGlzdCh2YXJpYWJsZXMsIHYpOwogICAgY29uZGl0aW9uPy5hY2NlcHQodik7CiAgICB2aXNpdExpc3QodXBkYXRlcywgdik7CiAgICBib2R5Py5hY2NlcHQodik7CiAgfQoKICBAb3ZlcnJpZGUKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICB0cmFuc2Zvcm1MaXN0KHZhcmlhYmxlcywgdiwgdGhpcyk7CiAgICBpZiAoY29uZGl0aW9uICE9IG51bGwpIHsKICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uLmFjY2VwdCh2KTsKICAgICAgY29uZGl0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgdHJhbnNmb3JtTGlzdCh1cGRhdGVzLCB2LCB0aGlzKTsKICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgYm9keSA9IGJvZHkuYWNjZXB0KHYpOwogICAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEEgJ2Zvci1pbicgZWxlbWVudCBpbiBhIG1hcCBsaXRlcmFsLgpjbGFzcyBGb3JJbk1hcEVudHJ5IGV4dGVuZHMgVHJlZU5vZGUgd2l0aCBDb250cm9sRmxvd01hcEVudHJ5IHsKICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlOyAvLyBIYXMgbm8gaW5pdGlhbGl6ZXIuCiAgRXhwcmVzc2lvbiBpdGVyYWJsZTsKICBTdGF0ZW1lbnQgcHJvbG9ndWU7IC8vIE1heSBiZSBudWxsLgogIE1hcEVudHJ5IGJvZHk7CiAgRXhwcmVzc2lvbiBwcm9ibGVtOyAvLyBNYXkgYmUgbnVsbC4KICBib29sIGlzQXN5bmM7IC8vIFRydWUgaWYgdGhpcyBpcyBhbiAnYXdhaXQgZm9yJyBsb29wLgoKICBGb3JJbk1hcEVudHJ5KAogICAgICB0aGlzLnZhcmlhYmxlLCB0aGlzLml0ZXJhYmxlLCB0aGlzLnByb2xvZ3VlLCB0aGlzLmJvZHksIHRoaXMucHJvYmxlbSwKICAgICAge3RoaXMuaXNBc3luYzogZmFsc2V9KSB7CiAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIGl0ZXJhYmxlPy5wYXJlbnQgPSB0aGlzOwogICAgcHJvbG9ndWU/LnBhcmVudCA9IHRoaXM7CiAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogICAgcHJvYmxlbT8ucGFyZW50ID0gdGhpczsKICB9CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxPYmplY3Q+IHYpIHsKICAgIHZhcmlhYmxlPy5hY2NlcHQodik7CiAgICBpdGVyYWJsZT8uYWNjZXB0KHYpOwogICAgcHJvbG9ndWU/LmFjY2VwdCh2KTsKICAgIGJvZHk/LmFjY2VwdCh2KTsKICAgIHByb2JsZW0/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmICh2YXJpYWJsZSAhPSBudWxsKSB7CiAgICAgIHZhcmlhYmxlID0gdmFyaWFibGUuYWNjZXB0KHYpOwogICAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChpdGVyYWJsZSAhPSBudWxsKSB7CiAgICAgIGl0ZXJhYmxlID0gaXRlcmFibGUuYWNjZXB0KHYpOwogICAgICBpdGVyYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChwcm9sb2d1ZSAhPSBudWxsKSB7CiAgICAgIHByb2xvZ3VlID0gcHJvbG9ndWUuYWNjZXB0KHYpOwogICAgICBwcm9sb2d1ZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgYm9keSA9IGJvZHkuYWNjZXB0KHYpOwogICAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHByb2JsZW0gIT0gbnVsbCkgewogICAgICBwcm9ibGVtID0gcHJvYmxlbS5hY2NlcHQodik7CiAgICAgIHByb2JsZW0/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgpFeHByZXNzaW9uIGNvbnZlcnRUb0VsZW1lbnQoTWFwRW50cnkgZW50cnksIEluZmVyZW5jZUhlbHBlciBoZWxwZXIpIHsKICBpZiAoZW50cnkgaXMgU3ByZWFkTWFwRW50cnkpIHsKICAgIHJldHVybiBuZXcgU3ByZWFkRWxlbWVudChlbnRyeS5leHByZXNzaW9uLCBlbnRyeS5pc051bGxBd2FyZSkKICAgICAgLi5maWxlT2Zmc2V0ID0gZW50cnkuZXhwcmVzc2lvbi5maWxlT2Zmc2V0OwogIH0KICBpZiAoZW50cnkgaXMgSWZNYXBFbnRyeSkgewogICAgcmV0dXJuIG5ldyBJZkVsZW1lbnQoCiAgICAgICAgZW50cnkuY29uZGl0aW9uLAogICAgICAgIGNvbnZlcnRUb0VsZW1lbnQoZW50cnkudGhlbiwgaGVscGVyKSwKICAgICAgICBlbnRyeS5vdGhlcndpc2UgPT0gbnVsbAogICAgICAgICAgICA/IG51bGwKICAgICAgICAgICAgOiBjb252ZXJ0VG9FbGVtZW50KGVudHJ5Lm90aGVyd2lzZSwgaGVscGVyKSkKICAgICAgLi5maWxlT2Zmc2V0ID0gZW50cnkuZmlsZU9mZnNldDsKICB9CiAgaWYgKGVudHJ5IGlzIEZvck1hcEVudHJ5KSB7CiAgICByZXR1cm4gbmV3IEZvckVsZW1lbnQoZW50cnkudmFyaWFibGVzLCBlbnRyeS5jb25kaXRpb24sIGVudHJ5LnVwZGF0ZXMsCiAgICAgICAgY29udmVydFRvRWxlbWVudChlbnRyeS5ib2R5LCBoZWxwZXIpKQogICAgICAuLmZpbGVPZmZzZXQgPSBlbnRyeS5maWxlT2Zmc2V0OwogIH0KICBpZiAoZW50cnkgaXMgRm9ySW5NYXBFbnRyeSkgewogICAgcmV0dXJuIG5ldyBGb3JJbkVsZW1lbnQoZW50cnkudmFyaWFibGUsIGVudHJ5Lml0ZXJhYmxlLCBlbnRyeS5wcm9sb2d1ZSwKICAgICAgICBjb252ZXJ0VG9FbGVtZW50KGVudHJ5LmJvZHksIGhlbHBlciksIGVudHJ5LnByb2JsZW0sCiAgICAgICAgaXNBc3luYzogZW50cnkuaXNBc3luYykKICAgICAgLi5maWxlT2Zmc2V0ID0gZW50cnkuZmlsZU9mZnNldDsKICB9CiAgcmV0dXJuIGhlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihoZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgdGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCcsJyksCiAgICBlbnRyeS5maWxlT2Zmc2V0LAogICAgMSwKICApKTsKfQoKYm9vbCBpc0NvbnZlcnRpYmxlVG9NYXBFbnRyeShFeHByZXNzaW9uIGVsZW1lbnQpIHsKICBpZiAoZWxlbWVudCBpcyBTcHJlYWRFbGVtZW50KSByZXR1cm4gdHJ1ZTsKICBpZiAoZWxlbWVudCBpcyBJZkVsZW1lbnQpIHsKICAgIHJldHVybiBpc0NvbnZlcnRpYmxlVG9NYXBFbnRyeShlbGVtZW50LnRoZW4pICYmCiAgICAgICAgKGVsZW1lbnQub3RoZXJ3aXNlID09IG51bGwgfHwKICAgICAgICAgICAgaXNDb252ZXJ0aWJsZVRvTWFwRW50cnkoZWxlbWVudC5vdGhlcndpc2UpKTsKICB9CiAgaWYgKGVsZW1lbnQgaXMgRm9yRWxlbWVudCkgewogICAgcmV0dXJuIGlzQ29udmVydGlibGVUb01hcEVudHJ5KGVsZW1lbnQuYm9keSk7CiAgfQogIGlmIChlbGVtZW50IGlzIEZvckluRWxlbWVudCkgewogICAgcmV0dXJuIGlzQ29udmVydGlibGVUb01hcEVudHJ5KGVsZW1lbnQuYm9keSk7CiAgfQogIHJldHVybiBmYWxzZTsKfQoKTWFwRW50cnkgY29udmVydFRvTWFwRW50cnkoRXhwcmVzc2lvbiBlbGVtZW50LCBJbmZlcmVuY2VIZWxwZXIgaGVscGVyKSB7CiAgaWYgKGVsZW1lbnQgaXMgU3ByZWFkRWxlbWVudCkgewogICAgcmV0dXJuIG5ldyBTcHJlYWRNYXBFbnRyeShlbGVtZW50LmV4cHJlc3Npb24sIGVsZW1lbnQuaXNOdWxsQXdhcmUpCiAgICAgIC4uZmlsZU9mZnNldCA9IGVsZW1lbnQuZXhwcmVzc2lvbi5maWxlT2Zmc2V0OwogIH0KICBpZiAoZWxlbWVudCBpcyBJZkVsZW1lbnQpIHsKICAgIHJldHVybiBuZXcgSWZNYXBFbnRyeSgKICAgICAgICBlbGVtZW50LmNvbmRpdGlvbiwKICAgICAgICBjb252ZXJ0VG9NYXBFbnRyeShlbGVtZW50LnRoZW4sIGhlbHBlciksCiAgICAgICAgZWxlbWVudC5vdGhlcndpc2UgPT0gbnVsbAogICAgICAgICAgICA/IG51bGwKICAgICAgICAgICAgOiBjb252ZXJ0VG9NYXBFbnRyeShlbGVtZW50Lm90aGVyd2lzZSwgaGVscGVyKSkKICAgICAgLi5maWxlT2Zmc2V0ID0gZWxlbWVudC5maWxlT2Zmc2V0OwogIH0KICBpZiAoZWxlbWVudCBpcyBGb3JFbGVtZW50KSB7CiAgICByZXR1cm4gbmV3IEZvck1hcEVudHJ5KGVsZW1lbnQudmFyaWFibGVzLCBlbGVtZW50LmNvbmRpdGlvbiwKICAgICAgICBlbGVtZW50LnVwZGF0ZXMsIGNvbnZlcnRUb01hcEVudHJ5KGVsZW1lbnQuYm9keSwgaGVscGVyKSkKICAgICAgLi5maWxlT2Zmc2V0ID0gZWxlbWVudC5maWxlT2Zmc2V0OwogIH0KICBpZiAoZWxlbWVudCBpcyBGb3JJbkVsZW1lbnQpIHsKICAgIHJldHVybiBuZXcgRm9ySW5NYXBFbnRyeSgKICAgICAgICBlbGVtZW50LnZhcmlhYmxlLAogICAgICAgIGVsZW1lbnQuaXRlcmFibGUsCiAgICAgICAgZWxlbWVudC5wcm9sb2d1ZSwKICAgICAgICBjb252ZXJ0VG9NYXBFbnRyeShlbGVtZW50LmJvZHksIGhlbHBlciksCiAgICAgICAgZWxlbWVudC5wcm9ibGVtLAogICAgICAgIGlzQXN5bmM6IGVsZW1lbnQuaXNBc3luYykKICAgICAgLi5maWxlT2Zmc2V0ID0gZWxlbWVudC5maWxlT2Zmc2V0OwogIH0KICByZXR1cm4gbmV3IE1hcEVudHJ5KAogICAgICBoZWxwZXIuZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgICAgICB0ZW1wbGF0ZUV4cGVjdGVkQWZ0ZXJCdXRHb3Qud2l0aEFyZ3VtZW50cygnOicpLAogICAgICAgIGVsZW1lbnQuZmlsZU9mZnNldCwKICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogd2hhdCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBleHByZXNzaW9uPwogICAgICAgIDEsCiAgICAgICkpLAogICAgICBuZXcgTnVsbExpdGVyYWwoKSk7Cn0Kgd4ATk48GwEiASEJEhQSFRMSHRQXEwFEASUJGxwVFREBGj4BOAFHATAET01PRilMEwwyRwQBDEQBDDgmAgEvQRkUAVEGUB0YATUfBAEMJRsEAQwlHikhBgQCAS49GBMYATkeGR4EAQwlGhUaBAEMJR0nIAYYHRsGHScgBgQCAS4+TChBEwFIIR4fGQQBDCUdGhsVBAEMJScdJyAGJRgdGwYEAgExQDcXJhMmOAEQTB8dHR0ZHAQBJRkZGRUYBAElHCUfBhwlHwYcJR8GGB0bBhsjHgYEAgEwDBc+BAEMIj4EAQwZQAQBDCRABAEMPAIBJ0EZFAFNBlAdFgE2HwQBDCUbBAEMJR4pIQYEAgEmPRgRFgE6HhkeBAEMJRoVGgQBDCUdJyAGGB0bBh0nIAYEAgEmPkwoQREBSSEeHxkEAQwlHRobFQQBDCUnHScgBiUYHRsGBAIBKUA3FyYRJjgBEUwfHR0dGRwEASUZGRkVGAQBJRwlHwYcJR8GHCUfBhgdGwYbIx4GBAIBRiFCMgQdGhkuIBM5JwQeSy4nBCBMPSAnBEAvFgcGAgEzLR40JjkEHzIEITIEEAIBSSJHNAQeGxsxIhM8KQQfQUIpBCEeGhoaMRkiKQQXPTgcQQsKGgIBM3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvY29sbGVjdGlvbnMuZGFydElzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2UvaW5mZXJlbmNlX2hlbHBlci5kYXJ0hIYvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBBcmd1bWVudHMsIEV4cHJlc3Npb24sIEZ1bmN0aW9uVHlwZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JyBzaG93IENvcmVUeXBlczsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcgc2hvdyBMb2NhdGVkTWVzc2FnZSwgTWVzc2FnZTsKCmFic3RyYWN0IGNsYXNzIEluZmVyZW5jZUhlbHBlciB7CiAgQ29yZVR5cGVzIGdldCBjb3JlVHlwZXM7CgogIFVyaSBnZXQgdXJpOwoKICBzZXQgdHJhbnNmb3JtU2V0TGl0ZXJhbHMoYm9vbCB2YWx1ZSk7CgogIEV4cHJlc3Npb24gYnVpbGRQcm9ibGVtKE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgsCiAgICAgIHtMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0LCBib29sIHN1cHByZXNzTWVzc2FnZX0pOwoKICBMb2NhdGVkTWVzc2FnZSBjaGVja0FyZ3VtZW50c0ZvclR5cGUoCiAgICAgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvbiwgQXJndW1lbnRzIGFyZ3VtZW50cywgaW50IG9mZnNldCk7CgogIHZvaWQgYWRkUHJvYmxlbShNZXNzYWdlIG1lc3NhZ2UsIGludCBjaGFyT2Zmc2V0LCBpbnQgbGVuZ3RoLAogICAgICB7TGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dCwgYm9vbCB3YXNIYW5kbGVkfSk7CgogIEV4cHJlc3Npb24gd3JhcEluUHJvYmxlbShFeHByZXNzaW9uIGV4cHJlc3Npb24sIE1lc3NhZ2UgbWVzc2FnZSwgaW50IGxlbmd0aCwKICAgICAge0xpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHR9KTsKCiAgU3RyaW5nIGNvbnN0cnVjdG9yTmFtZUZvckRpYWdub3N0aWNzKFN0cmluZyBuYW1lLAogICAgICB7U3RyaW5nIGNsYXNzTmFtZSwgYm9vbCBpc1N1cGVyfSk7CgogIEV4cHJlc3Npb24gZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oRXhwcmVzc2lvbiBub2RlKTsKfQokAE5OPAFLATgBOwEhGwEPASgBRz0BKD8BPzgBTycBNCkBOgIBQHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS9pbmZlcmVuY2VfaGVscGVyLmRhcnROc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL3R5cGVfaW5mZXJlbmNlX2VuZ2luZS5kYXJ0qxcvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFLm1kIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIENvbnN0cnVjdG9yLAogICAgICAgIERhcnRUeXBlLAogICAgICAgIERhcnRUeXBlVmlzaXRvciwKICAgICAgICBEeW5hbWljVHlwZSwKICAgICAgICBGaWVsZCwKICAgICAgICBGdW5jdGlvblR5cGUsCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBJbnZhbGlkVHlwZSwKICAgICAgICBNZW1iZXIsCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBUeXBlZGVmVHlwZSwKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCcgc2hvdyBDbGFzc0hpZXJhcmNoeTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JyBzaG93IENvcmVUeXBlczsKCmltcG9ydCAnLi4vLi4vYmFzZS9pbnN0cnVtZW50YXRpb24uZGFydCcgc2hvdyBJbnN0cnVtZW50YXRpb247CgppbXBvcnQgJy4uL2tlcm5lbC9rZXJuZWxfYnVpbGRlci5kYXJ0JwogICAgc2hvdyBMaWJyYXJ5QnVpbGRlciwgS2VybmVsTGlicmFyeUJ1aWxkZXI7CgppbXBvcnQgJy4uL2tlcm5lbC9rZXJuZWxfc2hhZG93X2FzdC5kYXJ0JyBzaG93IFNoYWRvd0ZpZWxkLCBTaGFkb3dNZW1iZXI7CgppbXBvcnQgJy4uL21lc3NhZ2VzLmRhcnQnIHNob3cgbm9MZW5ndGgsIHRlbXBsYXRlQ2FudEluZmVyVHlwZUR1ZVRvQ2lyY3VsYXJpdHk7CgppbXBvcnQgJ3R5cGVfaW5mZXJyZXIuZGFydCcgc2hvdyBUeXBlSW5mZXJyZXIsIFR5cGVJbmZlcnJlckltcGw7CgppbXBvcnQgJ3R5cGVfc2NoZW1hX2Vudmlyb25tZW50LmRhcnQnIHNob3cgVHlwZVNjaGVtYUVudmlyb25tZW50OwoKLy8vIENvbmNyZXRlIGNsYXNzIGRlcml2ZWQgZnJvbSBbSW5mZXJlbmNlTm9kZV0gdG8gcmVwcmVzZW50IHR5cGUgaW5mZXJlbmNlIG9mIGEKLy8vIGZpZWxkIGJhc2VkIG9uIGl0cyBpbml0aWFsaXplci4KY2xhc3MgRmllbGRJbml0aWFsaXplckluZmVyZW5jZU5vZGUgZXh0ZW5kcyBJbmZlcmVuY2VOb2RlIHsKICBmaW5hbCBUeXBlSW5mZXJlbmNlRW5naW5lIF90eXBlSW5mZXJlbmNlRW5naW5lOwoKICAvLy8gVGhlIGZpZWxkIHdob3NlIHR5cGUgc2hvdWxkIGJlIGluZmVycmVkLgogIGZpbmFsIFNoYWRvd0ZpZWxkIGZpZWxkOwoKICBmaW5hbCBMaWJyYXJ5QnVpbGRlciBfbGlicmFyeTsKCiAgRmllbGRJbml0aWFsaXplckluZmVyZW5jZU5vZGUoCiAgICAgIHRoaXMuX3R5cGVJbmZlcmVuY2VFbmdpbmUsIHRoaXMuZmllbGQsIHRoaXMuX2xpYnJhcnkpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHJlc29sdmVJbnRlcm5hbCgpIHsKICAgIHZhciB0eXBlSW5mZXJyZXIgPSBfdHlwZUluZmVyZW5jZUVuZ2luZS5nZXRGaWVsZFR5cGVJbmZlcnJlcihmaWVsZCk7CiAgICAvLyBOb3RlOiBpbiB0aGUgZXZlbnQgdGhhdCB0aGVyZSBpcyBlcnJvbmVvdXMgY29kZSwgaXQncyBwb3NzaWJsZSBmb3IKICAgIC8vIHR5cGVJbmZlcnJlciB0byBiZSBudWxsLiAgSWYgdGhpcyBoYXBwZW5zLCBqdXN0IHNraXAgdHlwZSBpbmZlcmVuY2UgZm9yCiAgICAvLyB0aGlzIGZpZWxkLgogICAgaWYgKHR5cGVJbmZlcnJlciAhPSBudWxsKSB7CiAgICAgIHZhciBpbmZlcnJlZFR5cGUgPSB0eXBlSW5mZXJyZXIKICAgICAgICAgIC5pbmZlckRlY2xhcmF0aW9uVHlwZSh0eXBlSW5mZXJyZXIuaW5mZXJGaWVsZFRvcExldmVsKGZpZWxkKSk7CiAgICAgIGlmIChpc0NpcmN1bGFyKSB7CiAgICAgICAgLy8gUmVwb3J0IHRoZSBhcHByb3ByaWF0ZSBlcnJvci4KICAgICAgICBfbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgICB0ZW1wbGF0ZUNhbnRJbmZlclR5cGVEdWVUb0NpcmN1bGFyaXR5CiAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhmaWVsZC5uYW1lLm5hbWUpLAogICAgICAgICAgICBmaWVsZC5maWxlT2Zmc2V0LAogICAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgICAgZmllbGQuZmlsZVVyaSk7CiAgICAgICAgaW5mZXJyZWRUeXBlID0gY29uc3QgSW52YWxpZFR5cGUoKTsKICAgICAgfQogICAgICBmaWVsZC5zZXRJbmZlcnJlZFR5cGUoCiAgICAgICAgICBfdHlwZUluZmVyZW5jZUVuZ2luZSwgdHlwZUluZmVycmVyLnVyaSwgaW5mZXJyZWRUeXBlKTsKICAgICAgLy8gVE9ETyhwYXVsYmVycnkpOiBpZiB0eXBlICE9IG51bGwsIHRoZW4gY2hlY2sgdGhhdCB0aGUgdHlwZSBvZiB0aGUKICAgICAgLy8gaW5pdGlhbGl6ZXIgaXMgYXNzaWduYWJsZSB0byBpdC4KICAgIH0KICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogdGhlIGZvbGxvd2luZyBpcyBhIGhhY2sgc28gdGhhdCBvdXRsaW5lcyBkb24ndCBjb250YWluCiAgICAvLyBpbml0aWFsaXplcnMuICBCdXQgaXQgbWVhbnMgdGhhdCB3ZSByZWJ1aWxkIHRoZSBpbml0aWFsaXplcnMgd2hlbiBkb2luZwogICAgLy8gYSBmdWxsIGNvbXBpbGUuICBUaGVyZSBzaG91bGQgYmUgYSBiZXR0ZXIgd2F5LgogICAgZmllbGQuaW5pdGlhbGl6ZXIgPSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gZmllbGQudG9TdHJpbmcoKTsKfQoKLy8vIFZpc2l0b3IgdG8gY2hlY2sgd2hldGhlciBhIGdpdmVuIHR5cGUgbWVudGlvbnMgYW55IG9mIGEgY2xhc3MncyB0eXBlCi8vLyBwYXJhbWV0ZXJzIGluIGEgY292YXJpYW50IGZhc2hpb24uCmNsYXNzIEluY2x1ZGVzVHlwZVBhcmFtZXRlcnNDb3ZhcmlhbnRseSBleHRlbmRzIERhcnRUeXBlVmlzaXRvcjxib29sPiB7CiAgYm9vbCBpbkNvdmFyaWFudENvbnRleHQgPSB0cnVlOwoKICBmaW5hbCBMaXN0PFR5cGVQYXJhbWV0ZXI+IF90eXBlUGFyYW1ldGVyc1RvU2VhcmNoRm9yOwoKICBJbmNsdWRlc1R5cGVQYXJhbWV0ZXJzQ292YXJpYW50bHkodGhpcy5fdHlwZVBhcmFtZXRlcnNUb1NlYXJjaEZvcik7CgogIEBvdmVycmlkZQogIGJvb2wgZGVmYXVsdERhcnRUeXBlKERhcnRUeXBlIG5vZGUpID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBub2RlKSB7CiAgICBpZiAobm9kZS5yZXR1cm5UeXBlLmFjY2VwdCh0aGlzKSkgcmV0dXJuIHRydWU7CiAgICB0cnkgewogICAgICBpbkNvdmFyaWFudENvbnRleHQgPSAhaW5Db3ZhcmlhbnRDb250ZXh0OwogICAgICBmb3IgKHZhciBwYXJhbWV0ZXIgaW4gbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICAgIGlmIChwYXJhbWV0ZXIuYWNjZXB0KHRoaXMpKSByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBmb3IgKHZhciBwYXJhbWV0ZXIgaW4gbm9kZS5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgICBpZiAocGFyYW1ldGVyLnR5cGUuYWNjZXB0KHRoaXMpKSByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGZpbmFsbHkgewogICAgICBpbkNvdmFyaWFudENvbnRleHQgPSAhaW5Db3ZhcmlhbnRDb250ZXh0OwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBub2RlKSB7CiAgICBmb3IgKHZhciBhcmd1bWVudCBpbiBub2RlLnR5cGVBcmd1bWVudHMpIHsKICAgICAgaWYgKGFyZ3VtZW50LmFjY2VwdCh0aGlzKSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSkgewogICAgcmV0dXJuIG5vZGUudW5hbGlhcy5hY2NlcHQodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VHlwZVBhcmFtZXRlclR5cGUoVHlwZVBhcmFtZXRlclR5cGUgbm9kZSkgewogICAgcmV0dXJuIGluQ292YXJpYW50Q29udGV4dCAmJgogICAgICAgIF90eXBlUGFyYW1ldGVyc1RvU2VhcmNoRm9yLmNvbnRhaW5zKG5vZGUucGFyYW1ldGVyKTsKICB9Cn0KCi8vLyBCYXNlIGNsYXNzIGZvciB0cmFja2luZyBkZXBlbmRlbmNpZXMgZHVyaW5nIHRvcCBsZXZlbCB0eXBlIGluZmVyZW5jZS4KLy8vCi8vLyBGaWVsZHMsIGFjY2Vzc29ycywgYW5kIG1ldGhvZHMgY2FuIGhhdmUgdGhlaXIgdHlwZXMgaW5mZXJyZWQgaW4gYSB2YXJpZXR5IG9mCi8vLyB3YXlzOyB0aGVyZSB3aWxsIGEgZGVyaXZlZCBjbGFzcyBmb3IgZWFjaCBraW5kIG9mIGluZmVyZW5jZS4KYWJzdHJhY3QgY2xhc3MgSW5mZXJlbmNlTm9kZSB7CiAgLy8vIFRoZSBub2RlIGN1cnJlbnRseSBiZWluZyBldmFsdWF0ZWQsIG9yIGBudWxsYCBpZiBubyBub2RlIGlzIGJlaW5nCiAgLy8vIGV2YWx1YXRlZC4KICBzdGF0aWMgSW5mZXJlbmNlTm9kZSBfY3VycmVudE5vZGU7CgogIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHlwZSBpbmZlcmVuY2UgY29ycmVzcG9uZGluZyB0byB0aGlzIG5vZGUgaGFzIGJlZW4KICAvLy8gY29tcGxldGVkLgogIGJvb2wgX2lzUmVzb2x2ZWQgPSBmYWxzZTsKCiAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgbm9kZSBwYXJ0aWNpcGF0ZXMgaW4gYSBjaXJjdWxhcml0eS4KICBib29sIF9pc0NpcmN1bGFyID0gZmFsc2U7CgogIC8vLyBJZiB0aGlzIG5vZGUgaXMgY3VycmVudGx5IGJlaW5nIGV2YWx1YXRlZCwgYW5kIGl0cyBldmFsdWF0aW9uIGNhdXNlZCBhCiAgLy8vIHJlY3Vyc2l2ZSBjYWxsIHRvIGFub3RoZXIgbm9kZSdzIFtyZXNvbHZlXSBtZXRob2QsIGEgcG9pbnRlciB0byB0aGUgbGF0dGVyCiAgLy8vIG5vZGU7IG90aGVyd2lzZSBgbnVsbGAuCiAgSW5mZXJlbmNlTm9kZSBfbmV4dE5vZGU7CgogIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIG5vZGUgcGFydGljaXBhdGVzIGluIGEgY2lyY3VsYXJpdHkuCiAgLy8vCiAgLy8vIFRoaXMgbWF5IGJlIGNhbGxlZCBhdCB0aGUgZW5kIG9mIFtyZXNvbHZlSW50ZXJuYWxdIHRvIGNoZWNrIHdoZXRoZXIgYQogIC8vLyBjaXJjdWxhcml0eSB3YXMgZGV0ZWN0ZWQgZHVyaW5nIGV2YWx1YXRpb24uCiAgYm9vbCBnZXQgaXNDaXJjdWxhciA9PiBfaXNDaXJjdWxhcjsKCiAgLy8vIEV2YWx1YXRlcyB0aGlzIG5vZGUsIHByb3Blcmx5IGFjY291bnRpbmcgZm9yIGNpcmN1bGFyaXRpZXMuCiAgdm9pZCByZXNvbHZlKCkgewogICAgaWYgKF9pc1Jlc29sdmVkKSByZXR1cm47CiAgICBpZiAoX25leHROb2RlICE9IG51bGwgfHwgaWRlbnRpY2FsKF9jdXJyZW50Tm9kZSwgdGhpcykpIHsKICAgICAgLy8gQW4gYWNjZXNzb3IgZGVwZW5kcyBvbiBpdHNlbGYgKHBvc3NpYmx5IGJ5IHdheSBvZiBpbnRlcm1lZGlhdGUKICAgICAgLy8gYWNjZXNzb3JzKS4gIE1hcmsgYWxsIGFjY2Vzc29ycyBpbnZvbHZlZCBhcyBjaXJjdWxhci4KICAgICAgdmFyIG5vZGUgPSB0aGlzOwogICAgICBkbyB7CiAgICAgICAgbm9kZS5faXNDaXJjdWxhciA9IHRydWU7CiAgICAgICAgbm9kZS5faXNSZXNvbHZlZCA9IHRydWU7CiAgICAgICAgbm9kZSA9IG5vZGUuX25leHROb2RlOwogICAgICB9IHdoaWxlIChub2RlICE9IG51bGwpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIHByZXZpb3VzTm9kZSA9IF9jdXJyZW50Tm9kZTsKICAgICAgYXNzZXJ0KHByZXZpb3VzTm9kZT8uX25leHROb2RlID09IG51bGwpOwogICAgICBfY3VycmVudE5vZGUgPSB0aGlzOwogICAgICBwcmV2aW91c05vZGU/Ll9uZXh0Tm9kZSA9IHRoaXM7CiAgICAgIHJlc29sdmVJbnRlcm5hbCgpOwogICAgICBhc3NlcnQoaWRlbnRpY2FsKF9jdXJyZW50Tm9kZSwgdGhpcykpOwogICAgICBwcmV2aW91c05vZGU/Ll9uZXh0Tm9kZSA9IG51bGw7CiAgICAgIF9jdXJyZW50Tm9kZSA9IHByZXZpb3VzTm9kZTsKICAgICAgX2lzUmVzb2x2ZWQgPSB0cnVlOwogICAgfQogIH0KCiAgLy8vIEV2YWx1YXRlcyB0aGlzIG5vZGUsIHBvc3NpYmx5IGJ5IG1ha2luZyByZWN1cnNpdmUgY2FsbHMgdG8gdGhlIFtyZXNvbHZlXQogIC8vLyBtZXRob2Qgb2YgdGhpcyBub2RlIG9yIG90aGVyIG5vZGVzLgogIC8vLwogIC8vLyBDaXJjdWxhcml0eSBkZXRlY3Rpb24gaXMgaGFuZGxlZCBieSBbcmVzb2x2ZV0sIHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgogIC8vLyBPbmNlIHRoaXMgbWV0aG9kIGhhcyBtYWRlIGFsbCByZWN1cnNpdmUgY2FsbHMgdG8gW3Jlc29sdmVdLCBpdCBtYXkgdXNlCiAgLy8vIFtpc0NpcmN1bGFyXSB0byBkZXRlY3Qgd2hldGhlciBhIGNpcmN1bGFyaXR5IGhhcyBvY2N1cnJlZC4KICB2b2lkIHJlc29sdmVJbnRlcm5hbCgpOwp9CgovLy8gS2VlcHMgdHJhY2sgb2YgdGhlIGdsb2JhbCBzdGF0ZSBmb3IgdGhlIHR5cGUgaW5mZXJlbmNlIHRoYXQgb2NjdXJzIG91dHNpZGUKLy8vIG9mIG1ldGhvZCBib2RpZXMgYW5kIGluaXRpYWxpemVycy4KLy8vCi8vLyBUaGlzIGNsYXNzIGRlc2NyaWJlcyB0aGUgaW50ZXJmYWNlIGZvciB1c2UgYnkgY2xpZW50cyBvZiB0eXBlIGluZmVyZW5jZQovLy8gKGUuZy4gRGlldExpc3RlbmVyKS4gIERlcml2ZWQgY2xhc3NlcyBzaG91bGQgZGVyaXZlIGZyb20KLy8vIFtUeXBlSW5mZXJlbmNlRW5naW5lSW1wbF0uCmFic3RyYWN0IGNsYXNzIFR5cGVJbmZlcmVuY2VFbmdpbmUgewogIENsYXNzSGllcmFyY2h5IGNsYXNzSGllcmFyY2h5OwoKICBDb3JlVHlwZXMgY29yZVR5cGVzOwoKICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlICJwcmVwYXJlIiBwaGFzZSBvZiB0eXBlIGluZmVyZW5jZSBpcyBjb21wbGV0ZS4KICBib29sIGlzVHlwZUluZmVyZW5jZVByZXBhcmVkID0gZmFsc2U7CgogIFR5cGVTY2hlbWFFbnZpcm9ubWVudCB0eXBlU2NoZW1hRW52aXJvbm1lbnQ7CgogIGZpbmFsIHN0YXRpY0luZmVyZW5jZU5vZGVzID0gPEZpZWxkSW5pdGlhbGl6ZXJJbmZlcmVuY2VOb2RlPltdOwoKICAvLy8gQSBtYXAgY29udGFpbmluZyBjb25zdHJ1Y3RvcnMgd2l0aCBpbml0aWFsaXppbmcgZm9ybWFscyB3aG9zZSB0eXBlcwogIC8vLyBuZWVkIHRvIGJlIGluZmVycmVkLgogIC8vLwogIC8vLyBUaGlzIGlzIHJlcHJlc2VudGVkIGFzIGEgbWFwIGZyb20gYSBjb25zdHJ1Y3RvciB0byBpdHMgbGlicmFyeQogIC8vLyBidWlsZGVyIGJlY2F1c2UgdGhlIGJ1aWxkZXIgaXMgdXNlZCB0byByZXBvcnQgZXJyb3JzIGR1ZSB0byBjeWNsaWMKICAvLy8gaW5mZXJlbmNlIGRlcGVuZGVuY2llcy4KICBmaW5hbCBNYXA8Q29uc3RydWN0b3IsIExpYnJhcnlCdWlsZGVyPiB0b0JlSW5mZXJyZWQgPSB7fTsKCiAgLy8vIEEgbWFwIGNvbnRhaW5pbmcgY29uc3RydWN0b3JzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGluZmVycmVkLgogIC8vLwogIC8vLyBUaGlzIGlzIHVzZWQgdG8gZGV0ZWN0IGN5Y2xpYyBpbmZlcmVuY2UgZGVwZW5kZW5jaWVzLiAgSXQgaXMgcmVwcmVzZW50ZWQKICAvLy8gYXMgYSBtYXAgZnJvbSBhIGNvbnN0cnVjdG9yIHRvIGl0cyBsaWJyYXJ5IGJ1aWxkZXIgYmVjYXVzZSB0aGUgYnVpbGRlcgogIC8vLyBpcyB1c2VkIHRvIHJlcG9ydCBlcnJvcnMuCiAgZmluYWwgTWFwPENvbnN0cnVjdG9yLCBMaWJyYXJ5QnVpbGRlcj4gYmVpbmdJbmZlcnJlZCA9IHt9OwoKICBmaW5hbCBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uOwoKICBUeXBlSW5mZXJlbmNlRW5naW5lKHRoaXMuaW5zdHJ1bWVudGF0aW9uKTsKCiAgLy8vIENyZWF0ZXMgYSB0eXBlIGluZmVycmVyIGZvciB1c2UgaW5zaWRlIG9mIGEgbWV0aG9kIGJvZHkgZGVjbGFyZWQgaW4gYSBmaWxlCiAgLy8vIHdpdGggdGhlIGdpdmVuIFt1cmldLgogIFR5cGVJbmZlcnJlciBjcmVhdGVMb2NhbFR5cGVJbmZlcnJlcigKICAgICAgVXJpIHVyaSwgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZSwgS2VybmVsTGlicmFyeUJ1aWxkZXIgbGlicmFyeSk7CgogIC8vLyBDcmVhdGVzIGEgW1R5cGVJbmZlcnJlcl0gb2JqZWN0IHdoaWNoIGlzIHJlYWR5IHRvIHBlcmZvcm0gdHlwZSBpbmZlcmVuY2UKICAvLy8gb24gdGhlIGdpdmVuIFtmaWVsZF0uCiAgVHlwZUluZmVycmVyIGNyZWF0ZVRvcExldmVsVHlwZUluZmVycmVyKAogICAgICBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlLCBTaGFkb3dGaWVsZCBmaWVsZCwgS2VybmVsTGlicmFyeUJ1aWxkZXIgbGlicmFyeSk7CgogIC8vLyBSZXRyaWV2ZSB0aGUgW1R5cGVJbmZlcnJlcl0gZm9yIHRoZSBnaXZlbiBbZmllbGRdLCB3aGljaCB3YXMgY3JlYXRlZCBieQogIC8vLyBhIHByZXZpb3VzIGNhbGwgdG8gW2NyZWF0ZVRvcExldmVsVHlwZUluZmVycmVyXS4KICBUeXBlSW5mZXJyZXJJbXBsIGdldEZpZWxkVHlwZUluZmVycmVyKFNoYWRvd0ZpZWxkIGZpZWxkKTsKCiAgLy8vIFBlcmZvcm1zIHRoZSBzZWNvbmQgcGhhc2Ugb2YgdG9wIGxldmVsIGluaXRpYWxpemVyIGluZmVyZW5jZSwgd2hpY2ggaXMgdG8KICAvLy8gdmlzaXQgYWxsIGFjY2Vzc29ycyBhbmQgdG9wIGxldmVsIHZhcmlhYmxlcyB0aGF0IHdlcmUgcGFzc2VkIHRvCiAgLy8vIFtyZWNvcmRBY2Nlc3Nvcl0gaW4gdG9wb2xvZ2ljYWxseS1zb3J0ZWQgb3JkZXIgYW5kIGFzc2lnbiB0aGVpciB0eXBlcy4KICB2b2lkIGZpbmlzaFRvcExldmVsRmllbGRzKCkgewogICAgZm9yICh2YXIgbm9kZSBpbiBzdGF0aWNJbmZlcmVuY2VOb2RlcykgewogICAgICBub2RlLnJlc29sdmUoKTsKICAgIH0KICAgIHN0YXRpY0luZmVyZW5jZU5vZGVzLmNsZWFyKCk7CiAgfQoKICAvLy8gUGVyZm9ybXMgdGhlIHRoaXJkIHBoYXNlIG9mIHRvcCBsZXZlbCBpbmZlcmVuY2UsIHdoaWNoIGlzIHRvIHZpc2l0IGFsbAogIC8vLyBjb25zdHJ1Y3RvcnMgc3RpbGwgbmVlZGluZyBpbmZlcmVuY2UgYW5kIGluZmVyIHRoZSB0eXBlcyBvZiB0aGVpcgogIC8vLyBpbml0aWFsaXppbmcgZm9ybWFscyBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkcy4KICB2b2lkIGZpbmlzaFRvcExldmVsSW5pdGlhbGl6aW5nRm9ybWFscygpIHsKICAgIC8vIEZpZWxkIHR5cGVzIGhhdmUgYWxsIGJlZW4gaW5mZXJyZWQgc28gdGhlcmUgY2Fubm90IGJlIGEgY3ljbGljCiAgICAvLyBkZXBlbmRlbmN5LgogICAgZm9yIChDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciBpbiB0b0JlSW5mZXJyZWQua2V5cykgewogICAgICBmb3IgKHZhciBkZWNsYXJhdGlvbiBpbiBjb25zdHJ1Y3Rvci5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICAgIGluZmVySW5pdGlhbGl6aW5nRm9ybWFsKGRlY2xhcmF0aW9uLCBjb25zdHJ1Y3Rvcik7CiAgICAgIH0KICAgICAgZm9yICh2YXIgZGVjbGFyYXRpb24gaW4gY29uc3RydWN0b3IuZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgICAgaW5mZXJJbml0aWFsaXppbmdGb3JtYWwoZGVjbGFyYXRpb24sIGNvbnN0cnVjdG9yKTsKICAgICAgfQogICAgfQogICAgdG9CZUluZmVycmVkLmNsZWFyKCk7CiAgfQoKICB2b2lkIGluZmVySW5pdGlhbGl6aW5nRm9ybWFsKFZhcmlhYmxlRGVjbGFyYXRpb24gZm9ybWFsLCBDb25zdHJ1Y3RvciBwYXJlbnQpIHsKICAgIGlmIChmb3JtYWwudHlwZSA9PSBudWxsKSB7CiAgICAgIGZvciAoRmllbGQgZmllbGQgaW4gcGFyZW50LmVuY2xvc2luZ0NsYXNzLmZpZWxkcykgewogICAgICAgIGlmIChmaWVsZC5uYW1lLm5hbWUgPT0gZm9ybWFsLm5hbWUpIHsKICAgICAgICAgIFR5cGVJbmZlcmVuY2VFbmdpbmUucmVzb2x2ZUluZmVyZW5jZU5vZGUoZmllbGQpOwogICAgICAgICAgZm9ybWFsLnR5cGUgPSBmaWVsZC50eXBlOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBXZSBkaWQgbm90IGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGQsIHNvIHRoZSBwcm9ncmFtIGlzIGVycm9uZW91cy4KICAgICAgLy8gVGhlIGVycm9yIHNob3VsZCBoYXZlIGJlZW4gcmVwb3J0ZWQgZWxzZXdoZXJlIGFuZCB0eXBlIGluZmVyZW5jZQogICAgICAvLyBzaG91bGQgY29udGludWUgYnkgaW5mZXJyaW5nIGR5bmFtaWMuCiAgICAgIGZvcm1hbC50eXBlID0gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIH0KICB9CgogIC8vLyBHZXRzIHJlYWR5IHRvIGRvIHRvcCBsZXZlbCB0eXBlIGluZmVyZW5jZSBmb3IgdGhlIGNvbXBvbmVudCBoYXZpbmcgdGhlCiAgLy8vIGdpdmVuIFtoaWVyYXJjaHldLCB1c2luZyB0aGUgZ2l2ZW4gW2NvcmVUeXBlc10uCiAgdm9pZCBwcmVwYXJlVG9wTGV2ZWwoQ29yZVR5cGVzIGNvcmVUeXBlcywgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5KSB7CiAgICB0aGlzLmNvcmVUeXBlcyA9IGNvcmVUeXBlczsKICAgIHRoaXMuY2xhc3NIaWVyYXJjaHkgPSBoaWVyYXJjaHk7CiAgICB0aGlzLnR5cGVTY2hlbWFFbnZpcm9ubWVudCA9CiAgICAgICAgbmV3IFR5cGVTY2hlbWFFbnZpcm9ubWVudChjb3JlVHlwZXMsIGhpZXJhcmNoeSk7CiAgfQoKICAvLy8gUmVjb3JkcyB0aGF0IHRoZSBnaXZlbiBzdGF0aWMgW2ZpZWxkXSB3aWxsIG5lZWQgdG9wIGxldmVsIHR5cGUgaW5mZXJlbmNlLgogIHZvaWQgcmVjb3JkU3RhdGljRmllbGRJbmZlcmVuY2VDYW5kaWRhdGUoCiAgICAgIFNoYWRvd0ZpZWxkIGZpZWxkLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICB2YXIgbm9kZSA9IG5ldyBGaWVsZEluaXRpYWxpemVySW5mZXJlbmNlTm9kZSh0aGlzLCBmaWVsZCwgbGlicmFyeSk7CiAgICBTaGFkb3dGaWVsZC5zZXRJbmZlcmVuY2VOb2RlKGZpZWxkLCBub2RlKTsKICAgIHN0YXRpY0luZmVyZW5jZU5vZGVzLmFkZChub2RlKTsKICB9CgogIHN0YXRpYyB2b2lkIHJlc29sdmVJbmZlcmVuY2VOb2RlKE1lbWJlciBtZW1iZXIpIHsKICAgIGlmIChtZW1iZXIgaXMgU2hhZG93TWVtYmVyKSB7CiAgICAgIGlmIChtZW1iZXIuaW5mZXJlbmNlTm9kZSAhPSBudWxsKSB7CiAgICAgICAgbWVtYmVyLmluZmVyZW5jZU5vZGUucmVzb2x2ZSgpOwogICAgICAgIG1lbWJlci5pbmZlcmVuY2VOb2RlID0gbnVsbDsKICAgICAgfQogICAgfQogIH0KfQqBPABNTj8BIQkVEhkVDxYXFRAXGxUdAUIBOAE/AScvAUoBUAFBAUIBUSQ8MgEvGwEhASE9AQwbSUpPEyAmSRgpHTIxHhYcLAgdQUsqBk9PNh4EAQwpAgFJJ0giATgBRgEMMAEMLjMKMDkxCDQ2CBQQMAYEAQwwLy4GEgQBDCwmBAEMOCE9BAIBSgRRQR9IESUBTxEcAUEcAU1RHhsBQQZMMiYBQhMdPkg/FwshIR8eDScvGyYZLSYjGgYEAU8qBk5NQRoCAU8nBEw9HyUhARcBSygBLwFCAUobBkVJHjwBRgZPTSA9ASkBLQFRHChGAU8cK1ABTjc8AVBGTSAtFgYiBAFNSDotRhM5SzsIRjsIBhoEAVEfOi47JBIKCE9KLykGBAFNNkggJSE5BAFQLDNILyQEATQiKiglCAYEAgFFcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL3R5cGVfaW5mZXJlbmNlX2VuZ2luZS5kYXJ0RnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX2luZmVycmVyLmRhcnTAATy7Ly8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRS5tZCBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMga2VybmVsOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBBcmd1bWVudHMsCiAgICAgICAgQXNFeHByZXNzaW9uLAogICAgICAgIEFzeW5jTWFya2VyLAogICAgICAgIEJvdHRvbVR5cGUsCiAgICAgICAgQ2xhc3MsCiAgICAgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uLAogICAgICAgIENvbnN0cnVjdG9ySW52b2NhdGlvbiwKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEeW5hbWljVHlwZSwKICAgICAgICBFeHByZXNzaW9uLAogICAgICAgIEZpZWxkLAogICAgICAgIEZ1bmN0aW9uRXhwcmVzc2lvbiwKICAgICAgICBGdW5jdGlvbk5vZGUsCiAgICAgICAgRnVuY3Rpb25UeXBlLAogICAgICAgIEluc3RhbnRpYXRpb24sCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBJbnZhbGlkVHlwZSwKICAgICAgICBJbnZvY2F0aW9uRXhwcmVzc2lvbiwKICAgICAgICBMZXQsCiAgICAgICAgTGlzdExpdGVyYWwsCiAgICAgICAgTWFwTGl0ZXJhbCwKICAgICAgICBNZW1iZXIsCiAgICAgICAgTWV0aG9kSW52b2NhdGlvbiwKICAgICAgICBOYW1lLAogICAgICAgIE51bGxMaXRlcmFsLAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBQcm9jZWR1cmVLaW5kLAogICAgICAgIFByb3BlcnR5R2V0LAogICAgICAgIFByb3BlcnR5U2V0LAogICAgICAgIFJldHVyblN0YXRlbWVudCwKICAgICAgICBTZXRMaXRlcmFsLAogICAgICAgIFN0YXRlbWVudCwKICAgICAgICBTdGF0aWNHZXQsCiAgICAgICAgU3VwZXJNZXRob2RJbnZvY2F0aW9uLAogICAgICAgIFN1cGVyUHJvcGVydHlHZXQsCiAgICAgICAgU3VwZXJQcm9wZXJ0eVNldCwKICAgICAgICBTdXBlcnR5cGUsCiAgICAgICAgVGhpc0V4cHJlc3Npb24sCiAgICAgICAgVHJlZU5vZGUsCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uLAogICAgICAgIFZhcmlhYmxlR2V0LAogICAgICAgIFZvaWRUeXBlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCcgc2hvdyBDbGFzc0hpZXJhcmNoeTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JyBzaG93IENvcmVUeXBlczsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQnCiAgICBzaG93IGdldEZyZXNoVHlwZVBhcmFtZXRlcnMsIFN1YnN0aXR1dGlvbjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvc3JjL2JvdW5kc19jaGVja3MuZGFydCcgc2hvdyBjYWxjdWxhdGVCb3VuZHM7CgppbXBvcnQgJy4uLy4uL2Jhc2UvaW5zdHJ1bWVudGF0aW9uLmRhcnQnCiAgICBzaG93CiAgICAgICAgSW5zdHJ1bWVudGF0aW9uLAogICAgICAgIEluc3RydW1lbnRhdGlvblZhbHVlRm9yTWVtYmVyLAogICAgICAgIEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZSwKICAgICAgICBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGVBcmdzOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIExvY2F0ZWRNZXNzYWdlLAogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgVGVtcGxhdGUsCiAgICAgICAgbWVzc2FnZVJldHVybkZyb21Wb2lkRnVuY3Rpb24sCiAgICAgICAgbWVzc2FnZVJldHVybldpdGhvdXRFeHByZXNzaW9uLAogICAgICAgIG1lc3NhZ2VWb2lkRXhwcmVzc2lvbiwKICAgICAgICBub0xlbmd0aCwKICAgICAgICB0ZW1wbGF0ZUFyZ3VtZW50VHlwZU5vdEFzc2lnbmFibGUsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkTmFtZWRBcmd1bWVudCwKICAgICAgICB0ZW1wbGF0ZUltcGxpY2l0Q2FsbE9mTm9uTWV0aG9kLAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtTm9JbmZlcnJlZFR5cGVTdG9yZWQsCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1TdG9yaW5nTXVsdGlwbGVJbmZlcnJlZFR5cGVzLAogICAgICAgIHRlbXBsYXRlSW52YWxpZEFzc2lnbm1lbnQsCiAgICAgICAgdGVtcGxhdGVJbnZhbGlkQ2FzdEZ1bmN0aW9uRXhwciwKICAgICAgICB0ZW1wbGF0ZUludmFsaWRDYXN0TGl0ZXJhbExpc3QsCiAgICAgICAgdGVtcGxhdGVJbnZhbGlkQ2FzdExpdGVyYWxNYXAsCiAgICAgICAgdGVtcGxhdGVJbnZhbGlkQ2FzdExpdGVyYWxTZXQsCiAgICAgICAgdGVtcGxhdGVJbnZhbGlkQ2FzdExvY2FsRnVuY3Rpb24sCiAgICAgICAgdGVtcGxhdGVJbnZhbGlkQ2FzdE5ld0V4cHIsCiAgICAgICAgdGVtcGxhdGVJbnZhbGlkQ2FzdFN0YXRpY01ldGhvZCwKICAgICAgICB0ZW1wbGF0ZUludmFsaWRDYXN0VG9wTGV2ZWxGdW5jdGlvbiwKICAgICAgICB0ZW1wbGF0ZUludm9rZU5vbkZ1bmN0aW9uLAogICAgICAgIHRlbXBsYXRlTWl4aW5JbmZlcmVuY2VOb01hdGNoaW5nQ2xhc3MsCiAgICAgICAgdGVtcGxhdGVVbmRlZmluZWRHZXR0ZXIsCiAgICAgICAgdGVtcGxhdGVVbmRlZmluZWRNZXRob2QsCiAgICAgICAgdGVtcGxhdGVVbmRlZmluZWRTZXR0ZXI7CgppbXBvcnQgJy4uL2tlcm5lbC9rZXJuZWxfYnVpbGRlci5kYXJ0JyBzaG93IEtlcm5lbExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX2V4cHJlc3Npb25fZ2VuZXJhdG9yLmRhcnQnIHNob3cgYnVpbGRJc051bGw7CgppbXBvcnQgJy4uL2tlcm5lbC9rZXJuZWxfc2hhZG93X2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIEV4cHJlc3Npb25KdWRnbWVudCwKICAgICAgICBTaGFkb3dDbGFzcywKICAgICAgICBTaGFkb3dGaWVsZCwKICAgICAgICBTaGFkb3dUeXBlSW5mZXJlbmNlRW5naW5lLAogICAgICAgIFNoYWRvd1R5cGVJbmZlcnJlciwKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQsCiAgICAgICAgZ2V0RXhwbGljaXRUeXBlQXJndW1lbnRzLAogICAgICAgIGdldEluZmVycmVkVHlwZTsKCmltcG9ydCAnLi4va2VybmVsL3R5cGVfYWxnb3JpdGhtcy5kYXJ0JyBzaG93IGhhc0FueVR5cGVWYXJpYWJsZXM7CgppbXBvcnQgJy4uL25hbWVzLmRhcnQnIHNob3cgY2FsbE5hbWUsIHVuYXJ5TWludXNOYW1lOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IGludGVybmFsUHJvYmxlbSwgdW5leHBlY3RlZCwgdW5oYW5kbGVkOwoKaW1wb3J0ICdpbmZlcmVuY2VfaGVscGVyLmRhcnQnIHNob3cgSW5mZXJlbmNlSGVscGVyOwoKaW1wb3J0ICdpbnRlcmZhY2VfcmVzb2x2ZXIuZGFydCcgc2hvdyBGb3J3YXJkaW5nTm9kZSwgU3ludGhldGljQWNjZXNzb3I7CgppbXBvcnQgJ3R5cGVfY29uc3RyYWludF9nYXRoZXJlci5kYXJ0JyBzaG93IFR5cGVDb25zdHJhaW50R2F0aGVyZXI7CgppbXBvcnQgJ3R5cGVfaW5mZXJlbmNlX2VuZ2luZS5kYXJ0JwogICAgc2hvdyBJbmNsdWRlc1R5cGVQYXJhbWV0ZXJzQ292YXJpYW50bHksIFR5cGVJbmZlcmVuY2VFbmdpbmU7CgppbXBvcnQgJ3R5cGVfcHJvbW90aW9uLmRhcnQnIHNob3cgVHlwZVByb21vdGVyOwoKaW1wb3J0ICd0eXBlX3NjaGVtYS5kYXJ0JyBzaG93IGlzS25vd24sIFVua25vd25UeXBlOwoKaW1wb3J0ICd0eXBlX3NjaGVtYV9lbGltaW5hdGlvbi5kYXJ0JyBzaG93IGdyZWF0ZXN0Q2xvc3VyZTsKCmltcG9ydCAndHlwZV9zY2hlbWFfZW52aXJvbm1lbnQuZGFydCcKICAgIHNob3cKICAgICAgICBnZXROYW1lZFBhcmFtZXRlclR5cGUsCiAgICAgICAgZ2V0UG9zaXRpb25hbFBhcmFtZXRlclR5cGUsCiAgICAgICAgVHlwZVZhcmlhYmxlRWxpbWluYXRvciwKICAgICAgICBUeXBlU2NoZW1hRW52aXJvbm1lbnQ7CgovLy8gR2l2ZW4gYSBbRnVuY3Rpb25Ob2RlXSwgZ2V0cyB0aGUgbmFtZWQgcGFyYW1ldGVyIGlkZW50aWZpZWQgYnkgW25hbWVdLCBvcgovLy8gYG51bGxgIGlmIHRoZXJlIGlzIG5vIHBhcmFtZXRlciB3aXRoIHRoZSBnaXZlbiBuYW1lLgpWYXJpYWJsZURlY2xhcmF0aW9uIGdldE5hbWVkRm9ybWFsKEZ1bmN0aW9uTm9kZSBmdW5jdGlvbiwgU3RyaW5nIG5hbWUpIHsKICBmb3IgKHZhciBmb3JtYWwgaW4gZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICBpZiAoZm9ybWFsLm5hbWUgPT0gbmFtZSkgcmV0dXJuIGZvcm1hbDsKICB9CiAgcmV0dXJuIG51bGw7Cn0KCi8vLyBHaXZlbiBhIFtGdW5jdGlvbk5vZGVdLCBnZXRzIHRoZSBbaV10aCBwb3NpdGlvbmFsIGZvcm1hbCBwYXJhbWV0ZXIsIG9yCi8vLyBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gcGFyYW1ldGVyIHdpdGggdGhhdCBpbmRleC4KVmFyaWFibGVEZWNsYXJhdGlvbiBnZXRQb3NpdGlvbmFsRm9ybWFsKEZ1bmN0aW9uTm9kZSBmdW5jdGlvbiwgaW50IGkpIHsKICBpZiAoaSA8IGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgcmV0dXJuIGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldOwogIH0gZWxzZSB7CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCmJvb2wgaXNPdmVybG9hZGFibGVBcml0aG1ldGljT3BlcmF0b3IoU3RyaW5nIG5hbWUpIHsKICByZXR1cm4gaWRlbnRpY2FsKG5hbWUsICcrJykgfHwKICAgICAgaWRlbnRpY2FsKG5hbWUsICctJykgfHwKICAgICAgaWRlbnRpY2FsKG5hbWUsICcqJykgfHwKICAgICAgaWRlbnRpY2FsKG5hbWUsICclJyk7Cn0KCi8vLyBLZWVwcyB0cmFjayBvZiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5uZXJtb3N0IGZ1bmN0aW9uIG9yIGNsb3N1cmUgYmVpbmcKLy8vIGluZmVycmVkLgpjbGFzcyBDbG9zdXJlQ29udGV4dCB7CiAgZmluYWwgYm9vbCBpc0FzeW5jOwoKICBmaW5hbCBib29sIGlzR2VuZXJhdG9yOwoKICAvLy8gVGhlIHR5cGluZyBleHBlY3RhdGlvbiBmb3IgdGhlIHN1YmV4cHJlc3Npb24gb2YgYSBgcmV0dXJuYCBvciBgeWllbGRgCiAgLy8vIHN0YXRlbWVudCBpbnNpZGUgdGhlIGZ1bmN0aW9uLgogIC8vLwogIC8vLyBGb3Igbm9uLWdlbmVyYXRvciBhc3luYyBmdW5jdGlvbnMsIHRoaXMgd2lsbCBiZSBhICJGdXR1cmVPciIgdHlwZSAoc2luY2UKICAvLy8gaXQgaXMgcGVybWlzc2libGUgZm9yIHN1Y2ggYSBmdW5jdGlvbiB0byByZXR1cm4gZWl0aGVyIGEgZGlyZWN0IHZhbHVlIG9yCiAgLy8vIGEgZnV0dXJlKS4KICAvLy8KICAvLy8gRm9yIGdlbmVyYXRvciBmdW5jdGlvbnMgY29udGFpbmluZyBhIGB5aWVsZCpgIHN0YXRlbWVudCwgdGhlIGV4cGVjdGVkIHR5cGUKICAvLy8gZm9yIHRoZSBzdWJleHByZXNzaW9uIG9mIHRoZSBgeWllbGQqYCBzdGF0ZW1lbnQgaXMgdGhlIHJlc3VsdCBvZiB3cmFwcGluZwogIC8vLyB0aGlzIHR5cGluZyBleHBlY3RhdGlvbiBpbiBgU3RyZWFtYCBvciBgSXRlcmF0b3JgLCBhcyBhcHByb3ByaWF0ZS4KICBmaW5hbCBEYXJ0VHlwZSByZXR1cm5PcllpZWxkQ29udGV4dDsKCiAgZmluYWwgRGFydFR5cGUgZGVjbGFyZWRSZXR1cm5UeXBlOwoKICBmaW5hbCBib29sIF9uZWVkVG9JbmZlclJldHVyblR5cGU7CgogIC8vLyBUaGUgdHlwZSB0aGF0IGFjdHVhbGx5IGFwcGVhcmVkIGFzIHRoZSBzdWJleHByZXNzaW9uIG9mIGByZXR1cm5gIG9yCiAgLy8vIGB5aWVsZGAgc3RhdGVtZW50cyBpbnNpZGUgdGhlIGZ1bmN0aW9uLgogIC8vLwogIC8vLyBGb3Igbm9uLWdlbmVyYXRvciBhc3luYyBmdW5jdGlvbnMsIHRoaXMgaXMgdGhlICJ1bndyYXBwZWQiIHR5cGUgKGUuZy4gaWYKICAvLy8gdGhlIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIHJldHVybiBgRnV0dXJlPGludD5gLCB0aGlzIGlzIGBpbnRgKS4KICAvLy8KICAvLy8gRm9yIGdlbmVyYXRvciBmdW5jdGlvbnMgY29udGFpbmluZyBhIGB5aWVsZCpgIHN0YXRlbWVudCwgdGhlIHR5cGUgdGhhdAogIC8vLyBhcHBlYXJlZCBhcyB0aGUgc3ViZXhwcmVzc2lvbiBvZiB0aGUgYHlpZWxkKmAgc3RhdGVtZW50IHdhcyB0aGUgcmVzdWx0IG9mCiAgLy8vIHdyYXBwaW5nIHRoaXMgdHlwZSBpbiBgU3RyZWFtYCBvciBgSXRlcmF0b3JgLCBhcyBhcHByb3ByaWF0ZS4KICBEYXJ0VHlwZSBfaW5mZXJyZWRVbndyYXBwZWRSZXR1cm5PcllpZWxkVHlwZTsKCiAgLy8vIFdoZXRoZXIgdGhlIGZ1bmN0aW9uIGlzIGFuIGFycm93IGZ1bmN0aW9uLgogIGJvb2wgaXNBcnJvdzsKCiAgLy8vIEEgbGlzdCBvZiByZXR1cm4gc3RhdGVtZW50cyBpbiBmdW5jdGlvbnMgd2hvc2UgcmV0dXJuIHR5cGUgaXMgYmVpbmcKICAvLy8gaW5mZXJyZWQuCiAgLy8vCiAgLy8vIFRoZSByZXR1cm5zIGFyZSBjaGVja2VkIGZvciB2YWxpZGl0eSBhZnRlciB0aGUgcmV0dXJuIHR5cGUgaXMgaW5mZXJyZWQuCiAgTGlzdDxSZXR1cm5TdGF0ZW1lbnQ+IHJldHVyblN0YXRlbWVudHM7CgogIC8vLyBBIGxpc3Qgb2YgcmV0dXJuIGV4cHJlc3Npb24gdHlwZXMgaW4gZnVuY3Rpb25zIHdob3NlIHJldHVybiB0eXBlIGlzCiAgLy8vIGJlaW5nIGluZmVycmVkLgogIExpc3Q8RGFydFR5cGU+IHJldHVybkV4cHJlc3Npb25UeXBlczsKCiAgZmFjdG9yeSBDbG9zdXJlQ29udGV4dChUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyLCBBc3luY01hcmtlciBhc3luY01hcmtlciwKICAgICAgRGFydFR5cGUgcmV0dXJuQ29udGV4dCwgYm9vbCBuZWVkVG9JbmZlclJldHVyblR5cGUpIHsKICAgIGFzc2VydChyZXR1cm5Db250ZXh0ICE9IG51bGwpOwogICAgRGFydFR5cGUgZGVjbGFyZWRSZXR1cm5UeXBlID0KICAgICAgICBncmVhdGVzdENsb3N1cmUoaW5mZXJyZXIuY29yZVR5cGVzLCByZXR1cm5Db250ZXh0KTsKICAgIGJvb2wgaXNBc3luYyA9IGFzeW5jTWFya2VyID09IEFzeW5jTWFya2VyLkFzeW5jIHx8CiAgICAgICAgYXN5bmNNYXJrZXIgPT0gQXN5bmNNYXJrZXIuQXN5bmNTdGFyOwogICAgYm9vbCBpc0dlbmVyYXRvciA9IGFzeW5jTWFya2VyID09IEFzeW5jTWFya2VyLlN5bmNTdGFyIHx8CiAgICAgICAgYXN5bmNNYXJrZXIgPT0gQXN5bmNNYXJrZXIuQXN5bmNTdGFyOwogICAgaWYgKGlzR2VuZXJhdG9yKSB7CiAgICAgIGlmIChpc0FzeW5jKSB7CiAgICAgICAgcmV0dXJuQ29udGV4dCA9IGluZmVycmVyLmdldFR5cGVBcmd1bWVudE9mKAogICAgICAgICAgICByZXR1cm5Db250ZXh0LCBpbmZlcnJlci5jb3JlVHlwZXMuc3RyZWFtQ2xhc3MpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybkNvbnRleHQgPSBpbmZlcnJlci5nZXRUeXBlQXJndW1lbnRPZigKICAgICAgICAgICAgcmV0dXJuQ29udGV4dCwgaW5mZXJyZXIuY29yZVR5cGVzLml0ZXJhYmxlQ2xhc3MpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzQXN5bmMpIHsKICAgICAgcmV0dXJuQ29udGV4dCA9IGluZmVycmVyLndyYXBGdXR1cmVPclR5cGUoCiAgICAgICAgICBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQudW5mdXR1cmVUeXBlKHJldHVybkNvbnRleHQpKTsKICAgIH0KICAgIHJldHVybiBuZXcgQ2xvc3VyZUNvbnRleHQuXyhpc0FzeW5jLCBpc0dlbmVyYXRvciwgcmV0dXJuQ29udGV4dCwKICAgICAgICBkZWNsYXJlZFJldHVyblR5cGUsIG5lZWRUb0luZmVyUmV0dXJuVHlwZSk7CiAgfQoKICBDbG9zdXJlQ29udGV4dC5fKHRoaXMuaXNBc3luYywgdGhpcy5pc0dlbmVyYXRvciwgdGhpcy5yZXR1cm5PcllpZWxkQ29udGV4dCwKICAgICAgdGhpcy5kZWNsYXJlZFJldHVyblR5cGUsIHRoaXMuX25lZWRUb0luZmVyUmV0dXJuVHlwZSkgewogICAgaWYgKF9uZWVkVG9JbmZlclJldHVyblR5cGUpIHsKICAgICAgcmV0dXJuU3RhdGVtZW50cyA9IFtdOwogICAgICByZXR1cm5FeHByZXNzaW9uVHlwZXMgPSBbXTsKICAgIH0KICB9CgogIGJvb2wgY2hlY2tWYWxpZFJldHVybihUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyLCBEYXJ0VHlwZSByZXR1cm5UeXBlLAogICAgICBSZXR1cm5TdGF0ZW1lbnQgc3RhdGVtZW50LCBEYXJ0VHlwZSBleHByZXNzaW9uVHlwZSkgewogICAgLy8gVGhlIHJ1bGVzIGZvciB2YWxpZCByZXR1cm5zIGZvciBmdW5jdGlvbnMgd2l0aCByZXR1cm4gdHlwZSBUIGFuZCBwb3NzaWJseQogICAgLy8gYSByZXR1cm4gZXhwcmVzc2lvbiB3aXRoIHN0YXRpYyB0eXBlIFMuCiAgICB2YXIgZmxhdHRlbmVkUmV0dXJuVHlwZSA9IGlzQXN5bmMKICAgICAgICA/IGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC51bmZ1dHVyZVR5cGUocmV0dXJuVHlwZSkKICAgICAgICA6IHJldHVyblR5cGU7CiAgICBpZiAoc3RhdGVtZW50LmV4cHJlc3Npb24gPT0gbnVsbCkgewogICAgICAvLyBTeW5jOiByZXR1cm47IGlzIGEgdmFsaWQgcmV0dXJuIGlmIFQgaXMgdm9pZCwgZHluYW1pYywgb3IgTnVsbC4KICAgICAgLy8gQXN5bmM6IHJldHVybjsgaXMgYSB2YWxpZCByZXR1cm4gaWYgZmxhdHRlbihUKSBpcyB2b2lkLCBkeW5hbWljLCBvcgogICAgICAvLyBOdWxsLgogICAgICBpZiAoZmxhdHRlbmVkUmV0dXJuVHlwZSBpcyBWb2lkVHlwZSB8fAogICAgICAgICAgZmxhdHRlbmVkUmV0dXJuVHlwZSBpcyBEeW5hbWljVHlwZSB8fAogICAgICAgICAgZmxhdHRlbmVkUmV0dXJuVHlwZSA9PSBpbmZlcnJlci5jb3JlVHlwZXMubnVsbENsYXNzLnJhd1R5cGUpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA9IGluZmVycmVyLmhlbHBlci53cmFwSW5Qcm9ibGVtKAogICAgICAgICAgbmV3IE51bGxMaXRlcmFsKCkuLmZpbGVPZmZzZXQgPSBzdGF0ZW1lbnQuZmlsZU9mZnNldCwKICAgICAgICAgIG1lc3NhZ2VSZXR1cm5XaXRob3V0RXhwcmVzc2lvbiwKICAgICAgICAgIG5vTGVuZ3RoKQogICAgICAgIC4ucGFyZW50ID0gc3RhdGVtZW50OwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gQXJyb3cgZnVuY3Rpb25zIGFyZSB2YWxpZCBpZjoKICAgIC8vIFN5bmM6IFQgaXMgdm9pZCBvciByZXR1cm4gZXhwOyBpcyBhIHZhbGlkIGZvciBhIGJsb2NrLWJvZGllZCBmdW5jdGlvbi4KICAgIC8vIEFzeW5jOiBmbGF0dGVuKFQpIGlzIHZvaWQgb3IgcmV0dXJuIGV4cDsgaXMgdmFsaWQgZm9yIGEgYmxvY2stYm9kaWVkCiAgICAvLyBmdW5jdGlvbi4KICAgIGlmIChpc0Fycm93ICYmIGZsYXR0ZW5lZFJldHVyblR5cGUgaXMgVm9pZFR5cGUpIHJldHVybiB0cnVlOwoKICAgIC8vIFN5bmM6IGludmFsaWQgaWYgVCBpcyB2b2lkIGFuZCBTIGlzIG5vdCB2b2lkLCBkeW5hbWljLCBvciBOdWxsCiAgICAvLyBBc3luYzogaW52YWxpZCBpZiBUIGlzIHZvaWQgYW5kIGZsYXR0ZW4oUykgaXMgbm90IHZvaWQsIGR5bmFtaWMsIG9yIE51bGwuCiAgICB2YXIgZmxhdHRlbmVkRXhwcmVzc2lvblR5cGUgPSBpc0FzeW5jCiAgICAgICAgPyBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQudW5mdXR1cmVUeXBlKGV4cHJlc3Npb25UeXBlKQogICAgICAgIDogZXhwcmVzc2lvblR5cGU7CiAgICBpZiAocmV0dXJuVHlwZSBpcyBWb2lkVHlwZSAmJgogICAgICAgIGZsYXR0ZW5lZEV4cHJlc3Npb25UeXBlIGlzISBWb2lkVHlwZSAmJgogICAgICAgIGZsYXR0ZW5lZEV4cHJlc3Npb25UeXBlIGlzISBEeW5hbWljVHlwZSAmJgogICAgICAgIGZsYXR0ZW5lZEV4cHJlc3Npb25UeXBlICE9IGluZmVycmVyLmNvcmVUeXBlcy5udWxsQ2xhc3MucmF3VHlwZSkgewogICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA9IGluZmVycmVyLmhlbHBlci53cmFwSW5Qcm9ibGVtKAogICAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24sIG1lc3NhZ2VSZXR1cm5Gcm9tVm9pZEZ1bmN0aW9uLCBub0xlbmd0aCkKICAgICAgICAuLnBhcmVudCA9IHN0YXRlbWVudDsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIFN5bmM6IGludmFsaWQgaWYgUyBpcyB2b2lkIGFuZCBUIGlzIG5vdCB2b2lkLCBkeW5hbWljLCBvciBOdWxsLgogICAgLy8gQXN5bmM6IGludmFsaWQgaWYgZmxhdHRlbihTKSBpcyB2b2lkIGFuZCBmbGF0dGVuKFQpIGlzIG5vdCB2b2lkLCBkeW5hbWljLAogICAgLy8gb3IgTnVsbC4KICAgIGlmIChmbGF0dGVuZWRFeHByZXNzaW9uVHlwZSBpcyBWb2lkVHlwZSAmJgogICAgICAgIGZsYXR0ZW5lZFJldHVyblR5cGUgaXMhIFZvaWRUeXBlICYmCiAgICAgICAgZmxhdHRlbmVkUmV0dXJuVHlwZSBpcyEgRHluYW1pY1R5cGUgJiYKICAgICAgICBmbGF0dGVuZWRSZXR1cm5UeXBlICE9IGluZmVycmVyLmNvcmVUeXBlcy5udWxsQ2xhc3MucmF3VHlwZSkgewogICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA9IGluZmVycmVyLmhlbHBlcgogICAgICAgICAgLndyYXBJblByb2JsZW0oc3RhdGVtZW50LmV4cHJlc3Npb24sIG1lc3NhZ2VWb2lkRXhwcmVzc2lvbiwgbm9MZW5ndGgpCiAgICAgICAgICAgIC4ucGFyZW50ID0gc3RhdGVtZW50OwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gVGhlIGNhbGxlciB3aWxsIGNoZWNrIHRoYXQgdGhlIHJldHVybiBleHByZXNzaW9uIGlzIGFzc2lnbmFibGUgdG8gdGhlCiAgICAvLyByZXR1cm4gdHlwZS4KICAgIHJldHVybiB0cnVlOwogIH0KCiAgLy8vIFVwZGF0ZXMgdGhlIGluZmVycmVkIHJldHVybiB0eXBlIGJhc2VkIG9uIHRoZSBwcmVzZW5jZSBvZiBhIHJldHVybgogIC8vLyBzdGF0ZW1lbnQgcmV0dXJuaW5nIHRoZSBnaXZlbiBbdHlwZV0uCiAgdm9pZCBoYW5kbGVSZXR1cm4oVHlwZUluZmVycmVySW1wbCBpbmZlcnJlciwgUmV0dXJuU3RhdGVtZW50IHN0YXRlbWVudCwKICAgICAgRGFydFR5cGUgdHlwZSwgYm9vbCBpc0Fycm93KSB7CiAgICBpZiAoaXNHZW5lcmF0b3IpIHJldHVybjsKICAgIC8vIFRoZSBmaXJzdCByZXR1cm4gd2Ugc2VlIHRlbGxzIHVzIGlmIHdlIGhhdmUgYW4gYXJyb3cgZnVuY3Rpb24uCiAgICBpZiAodGhpcy5pc0Fycm93ID09IG51bGwpIHsKICAgICAgdGhpcy5pc0Fycm93ID0gaXNBcnJvdzsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydCh0aGlzLmlzQXJyb3cgPT0gaXNBcnJvdyk7CiAgICB9CgogICAgaWYgKF9uZWVkVG9JbmZlclJldHVyblR5cGUpIHsKICAgICAgLy8gQWRkIHRoZSByZXR1cm4gdG8gYSBsaXN0IHRvIGJlIGNoZWNrZWQgZm9yIHZhbGlkaXR5IGFmdGVyIHdlJ3ZlCiAgICAgIC8vIGluZmVycmVkIHRoZSByZXR1cm4gdHlwZS4KICAgICAgcmV0dXJuU3RhdGVtZW50cy5hZGQoc3RhdGVtZW50KTsKICAgICAgcmV0dXJuRXhwcmVzc2lvblR5cGVzLmFkZCh0eXBlKTsKCiAgICAgIC8vIFRoZSByZXR1cm4gZXhwcmVzc2lvbiBoYXMgdG8gYmUgYXNzaWduYWJsZSB0byB0aGUgcmV0dXJuIHR5cGUKICAgICAgLy8gZXhwZWN0YXRpb24gZnJvbSB0aGUgZG93bndhcmRzIGluZmVyZW5jZSBjb250ZXh0LgogICAgICBpZiAoc3RhdGVtZW50LmV4cHJlc3Npb24gIT0gbnVsbCAmJgogICAgICAgICAgaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZShyZXR1cm5PcllpZWxkQ29udGV4dCwgdHlwZSwKICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24sIHN0YXRlbWVudC5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgICBpc1JldHVybkZyb21Bc3luYzogaXNBc3luYywgaXNWb2lkQWxsb3dlZDogdHJ1ZSkgIT0KICAgICAgICAgICAgICBudWxsKSB7CiAgICAgICAgLy8gTm90IGFzc2lnbmFibGUsIHVzZSB0aGUgZXhwZWN0YXRpb24uCiAgICAgICAgdHlwZSA9IGdyZWF0ZXN0Q2xvc3VyZShpbmZlcnJlci5jb3JlVHlwZXMsIHJldHVybk9yWWllbGRDb250ZXh0KTsKICAgICAgfQogICAgICB2YXIgdW53cmFwcGVkVHlwZSA9IHR5cGU7CiAgICAgIGlmIChpc0FzeW5jKSB7CiAgICAgICAgdW53cmFwcGVkVHlwZSA9IGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC51bmZ1dHVyZVR5cGUodHlwZSk7CiAgICAgIH0KICAgICAgaWYgKF9pbmZlcnJlZFVud3JhcHBlZFJldHVybk9yWWllbGRUeXBlID09IG51bGwpIHsKICAgICAgICBfaW5mZXJyZWRVbndyYXBwZWRSZXR1cm5PcllpZWxkVHlwZSA9IHVud3JhcHBlZFR5cGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2luZmVycmVkVW53cmFwcGVkUmV0dXJuT3JZaWVsZFR5cGUgPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAgICAgLmdldFN0YW5kYXJkVXBwZXJCb3VuZCgKICAgICAgICAgICAgICAgIF9pbmZlcnJlZFVud3JhcHBlZFJldHVybk9yWWllbGRUeXBlLCB1bndyYXBwZWRUeXBlKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gSWYgd2UgYXJlIG5vdCBpbmZlcnJpbmcgYSB0eXBlIHdlIGNhbiBpbW1lZGlhdGVseSBjaGVjayB0aGF0IHRoZSByZXR1cm4KICAgIC8vIGlzIHZhbGlkLgogICAgaWYgKGNoZWNrVmFsaWRSZXR1cm4oaW5mZXJyZXIsIGRlY2xhcmVkUmV0dXJuVHlwZSwgc3RhdGVtZW50LCB0eXBlKSAmJgogICAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uICE9IG51bGwpIHsKICAgICAgaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZShyZXR1cm5PcllpZWxkQ29udGV4dCwgdHlwZSwKICAgICAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uLCBzdGF0ZW1lbnQuZmlsZU9mZnNldCwKICAgICAgICAgIGlzUmV0dXJuRnJvbUFzeW5jOiBpc0FzeW5jLCBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgIH0KICB9CgogIHZvaWQgaGFuZGxlWWllbGQoVHlwZUluZmVycmVySW1wbCBpbmZlcnJlciwgYm9vbCBpc1lpZWxkU3RhciwgRGFydFR5cGUgdHlwZSwKICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBpbnQgZmlsZU9mZnNldCkgewogICAgaWYgKCFpc0dlbmVyYXRvcikgcmV0dXJuOwogICAgdmFyIGV4cGVjdGVkVHlwZSA9IGlzWWllbGRTdGFyCiAgICAgICAgPyBfd3JhcEFzeW5jT3JHZW5lcmF0b3IoaW5mZXJyZXIsIHJldHVybk9yWWllbGRDb250ZXh0KQogICAgICAgIDogcmV0dXJuT3JZaWVsZENvbnRleHQ7CiAgICBpZiAoaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZShleHBlY3RlZFR5cGUsIHR5cGUsIGV4cHJlc3Npb24sIGZpbGVPZmZzZXQsCiAgICAgICAgICAgIGlzUmV0dXJuRnJvbUFzeW5jOiBpc0FzeW5jKSAhPQogICAgICAgIG51bGwpIHsKICAgICAgdHlwZSA9IGdyZWF0ZXN0Q2xvc3VyZShpbmZlcnJlci5jb3JlVHlwZXMsIGV4cGVjdGVkVHlwZSk7CiAgICB9CiAgICBpZiAoX25lZWRUb0luZmVyUmV0dXJuVHlwZSkgewogICAgICB2YXIgdW53cmFwcGVkVHlwZSA9IHR5cGU7CiAgICAgIGlmIChpc1lpZWxkU3RhcikgewogICAgICAgIHVud3JhcHBlZFR5cGUgPSBpbmZlcnJlci5nZXREZXJpdmVkVHlwZUFyZ3VtZW50T2YoCiAgICAgICAgICAgICAgICB0eXBlLAogICAgICAgICAgICAgICAgaXNBc3luYwogICAgICAgICAgICAgICAgICAgID8gaW5mZXJyZXIuY29yZVR5cGVzLnN0cmVhbUNsYXNzCiAgICAgICAgICAgICAgICAgICAgOiBpbmZlcnJlci5jb3JlVHlwZXMuaXRlcmFibGVDbGFzcykgPz8KICAgICAgICAgICAgdHlwZTsKICAgICAgfQogICAgICBpZiAoX2luZmVycmVkVW53cmFwcGVkUmV0dXJuT3JZaWVsZFR5cGUgPT0gbnVsbCkgewogICAgICAgIF9pbmZlcnJlZFVud3JhcHBlZFJldHVybk9yWWllbGRUeXBlID0gdW53cmFwcGVkVHlwZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfaW5mZXJyZWRVbndyYXBwZWRSZXR1cm5PcllpZWxkVHlwZSA9IGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudAogICAgICAgICAgICAuZ2V0U3RhbmRhcmRVcHBlckJvdW5kKAogICAgICAgICAgICAgICAgX2luZmVycmVkVW53cmFwcGVkUmV0dXJuT3JZaWVsZFR5cGUsIHVud3JhcHBlZFR5cGUpOwogICAgICB9CiAgICB9CiAgfQoKICBEYXJ0VHlwZSBpbmZlclJldHVyblR5cGUoVHlwZUluZmVycmVySW1wbCBpbmZlcnJlcikgewogICAgYXNzZXJ0KF9uZWVkVG9JbmZlclJldHVyblR5cGUpOwogICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlID0KICAgICAgICBpbmZlcnJlci5pbmZlclJldHVyblR5cGUoX2luZmVycmVkVW53cmFwcGVkUmV0dXJuT3JZaWVsZFR5cGUpOwogICAgaWYgKCFpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAuaXNTdWJ0eXBlT2YoaW5mZXJyZWRUeXBlLCByZXR1cm5PcllpZWxkQ29udGV4dCkpIHsKICAgICAgLy8gSWYgdGhlIGluZmVycmVkIHJldHVybiB0eXBlIGlzbid0IGEgc3VidHlwZSBvZiB0aGUgY29udGV4dCwgd2UgdXNlIHRoZQogICAgICAvLyBjb250ZXh0LgogICAgICBpbmZlcnJlZFR5cGUgPSBncmVhdGVzdENsb3N1cmUoaW5mZXJyZXIuY29yZVR5cGVzLCByZXR1cm5PcllpZWxkQ29udGV4dCk7CiAgICB9CgogICAgaW5mZXJyZWRUeXBlID0gX3dyYXBBc3luY09yR2VuZXJhdG9yKGluZmVycmVyLCBpbmZlcnJlZFR5cGUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXR1cm5TdGF0ZW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgIGNoZWNrVmFsaWRSZXR1cm4oaW5mZXJyZXIsIGluZmVycmVkVHlwZSwgcmV0dXJuU3RhdGVtZW50c1tpXSwKICAgICAgICAgIHJldHVybkV4cHJlc3Npb25UeXBlc1tpXSk7CiAgICB9CgogICAgcmV0dXJuIGluZmVycmVkVHlwZTsKICB9CgogIERhcnRUeXBlIF93cmFwQXN5bmNPckdlbmVyYXRvcihUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyLCBEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAoaXNHZW5lcmF0b3IpIHsKICAgICAgaWYgKGlzQXN5bmMpIHsKICAgICAgICByZXR1cm4gaW5mZXJyZXIud3JhcFR5cGUodHlwZSwgaW5mZXJyZXIuY29yZVR5cGVzLnN0cmVhbUNsYXNzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gaW5mZXJyZXIud3JhcFR5cGUodHlwZSwgaW5mZXJyZXIuY29yZVR5cGVzLml0ZXJhYmxlQ2xhc3MpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzQXN5bmMpIHsKICAgICAgcmV0dXJuIGluZmVycmVyLndyYXBGdXR1cmVUeXBlKHR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHR5cGU7CiAgICB9CiAgfQp9CgovLy8gRW51bSBkZW5vdGluZyB0aGUga2luZHMgb2YgY29udHJhdmFyaWFuY2UgY2hlY2sgdGhhdCBtaWdodCBuZWVkIHRvIGJlCi8vLyBpbnNlcnRlZCBmb3IgYSBtZXRob2QgY2FsbC4KZW51bSBNZXRob2RDb250cmF2YXJpYW5jZUNoZWNrS2luZCB7CiAgLy8vIE5vIGNvbnRyYXZhcmlhbmNlIGNoZWNrIGlzIG5lZWRlZC4KICBub25lLAoKICAvLy8gVGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBtZXRob2QgY2FsbCBuZWVkcyB0byBiZSBjaGVja2VkLgogIGNoZWNrTWV0aG9kUmV0dXJuLAoKICAvLy8gVGhlIG1ldGhvZCBjYWxsIG5lZWRzIHRvIGJlIGRlc3VnYXJlZCBpbnRvIGEgZ2V0dGVyIGNhbGwsIGZvbGxvd2VkIGJ5IGFuCiAgLy8vICJhcyIgY2hlY2ssIGZvbGxvd2VkIGJ5IGFuIGludm9jYXRpb24gb2YgdGhlIHJlc3VsdGluZyBmdW5jdGlvbiBvYmplY3QuCiAgY2hlY2tHZXR0ZXJSZXR1cm4sCn0KCi8vLyBLZWVwcyB0cmFjayBvZiB0aGUgbG9jYWwgc3RhdGUgZm9yIHRoZSB0eXBlIGluZmVyZW5jZSB0aGF0IG9jY3VycyBkdXJpbmcKLy8vIGNvbXBpbGF0aW9uIG9mIGEgc2luZ2xlIG1ldGhvZCBib2R5IG9yIHRvcCBsZXZlbCBpbml0aWFsaXplci4KLy8vCi8vLyBUaGlzIGNsYXNzIGRlc2NyaWJlcyB0aGUgaW50ZXJmYWNlIGZvciB1c2UgYnkgY2xpZW50cyBvZiB0eXBlIGluZmVyZW5jZQovLy8gKGUuZy4gQm9keUJ1aWxkZXIpLiAgRGVyaXZlZCBjbGFzc2VzIHNob3VsZCBkZXJpdmUgZnJvbSBbVHlwZUluZmVycmVySW1wbF0uCmFic3RyYWN0IGNsYXNzIFR5cGVJbmZlcnJlciB7CiAgZmluYWwgQ29yZVR5cGVzIGNvcmVUeXBlczsKCiAgVHlwZUluZmVycmVyLnByaXZhdGUodGhpcy5jb3JlVHlwZXMpOwoKICBmYWN0b3J5IFR5cGVJbmZlcnJlcigKICAgICAgU2hhZG93VHlwZUluZmVyZW5jZUVuZ2luZSBlbmdpbmUsCiAgICAgIFVyaSB1cmksCiAgICAgIGJvb2wgdG9wTGV2ZWwsCiAgICAgIEludGVyZmFjZVR5cGUgdGhpc1R5cGUsCiAgICAgIEtlcm5lbExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpID0gU2hhZG93VHlwZUluZmVycmVyLnByaXZhdGU7CgogIEtlcm5lbExpYnJhcnlCdWlsZGVyIGdldCBsaWJyYXJ5OwoKICAvLy8gR2V0cyB0aGUgW1R5cGVQcm9tb3Rlcl0gdGhhdCBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIHR5cGUgcHJvbW90aW9uIHdpdGhpbgogIC8vLyB0aGlzIG1ldGhvZCBib2R5IG9yIGluaXRpYWxpemVyLgogIFR5cGVQcm9tb3RlciBnZXQgdHlwZVByb21vdGVyOwoKICAvLy8gR2V0cyB0aGUgW1R5cGVTY2hlbWFFbnZpcm9ubWVudF0gYmVpbmcgdXNlZCBmb3IgdHlwZSBpbmZlcmVuY2UuCiAgVHlwZVNjaGVtYUVudmlyb25tZW50IGdldCB0eXBlU2NoZW1hRW52aXJvbm1lbnQ7CgogIC8vLyBUaGUgVVJJIG9mIHRoZSBjb2RlIGZvciB3aGljaCB0eXBlIGluZmVyZW5jZSBpcyBjdXJyZW50bHkgYmVpbmcKICAvLy8gcGVyZm9ybWVkLS10aGlzIGlzIHVzZWQgZm9yIHRlc3RpbmcuCiAgVXJpIGdldCB1cmk7CgogIC8vLyBQZXJmb3JtcyBmdWxsIHR5cGUgaW5mZXJlbmNlIG9uIHRoZSBnaXZlbiBmaWVsZCBpbml0aWFsaXplci4KICB2b2lkIGluZmVyRmllbGRJbml0aWFsaXplcihJbmZlcmVuY2VIZWxwZXIgaGVscGVyLCBEYXJ0VHlwZSBkZWNsYXJlZFR5cGUsCiAgICAgIGtlcm5lbC5FeHByZXNzaW9uIGluaXRpYWxpemVyKTsKCiAgLy8vIFBlcmZvcm1zIHR5cGUgaW5mZXJlbmNlIG9uIHRoZSBnaXZlbiBmdW5jdGlvbiBib2R5LgogIHZvaWQgaW5mZXJGdW5jdGlvbkJvZHkoSW5mZXJlbmNlSGVscGVyIGhlbHBlciwgRGFydFR5cGUgcmV0dXJuVHlwZSwKICAgICAgQXN5bmNNYXJrZXIgYXN5bmNNYXJrZXIsIFN0YXRlbWVudCBib2R5KTsKCiAgLy8vIFBlcmZvcm1zIHR5cGUgaW5mZXJlbmNlIG9uIHRoZSBnaXZlbiBjb25zdHJ1Y3RvciBpbml0aWFsaXplci4KICB2b2lkIGluZmVySW5pdGlhbGl6ZXIoSW5mZXJlbmNlSGVscGVyIGhlbHBlciwga2VybmVsLkluaXRpYWxpemVyIGluaXRpYWxpemVyKTsKCiAgLy8vIFBlcmZvcm1zIHR5cGUgaW5mZXJlbmNlIG9uIHRoZSBnaXZlbiBtZXRhZGF0YSBhbm5vdGF0aW9ucy4KICB2b2lkIGluZmVyTWV0YWRhdGEoCiAgICAgIEluZmVyZW5jZUhlbHBlciBoZWxwZXIsIExpc3Q8a2VybmVsLkV4cHJlc3Npb24+IGFubm90YXRpb25zKTsKCiAgLy8vIFBlcmZvcm1zIHR5cGUgaW5mZXJlbmNlIG9uIHRoZSBnaXZlbiBtZXRhZGF0YSBhbm5vdGF0aW9ucyBrZWVwaW5nIHRoZQogIC8vLyBleGlzdGluZyBoZWxwZXIgaWYgcG9zc2libGUuCiAgdm9pZCBpbmZlck1ldGFkYXRhS2VlcGluZ0hlbHBlcihMaXN0PGtlcm5lbC5FeHByZXNzaW9uPiBhbm5vdGF0aW9ucyk7CgogIC8vLyBQZXJmb3JtcyB0eXBlIGluZmVyZW5jZSBvbiB0aGUgZ2l2ZW4gZnVuY3Rpb24gcGFyYW1ldGVyIGluaXRpYWxpemVyCiAgLy8vIGV4cHJlc3Npb24uCiAgdm9pZCBpbmZlclBhcmFtZXRlckluaXRpYWxpemVyKEluZmVyZW5jZUhlbHBlciBoZWxwZXIsCiAgICAgIGtlcm5lbC5FeHByZXNzaW9uIGluaXRpYWxpemVyLCBEYXJ0VHlwZSBkZWNsYXJlZFR5cGUpOwp9CgovLy8gRGVyaXZlZCBjbGFzcyBjb250YWluaW5nIGdlbmVyaWMgaW1wbGVtZW50YXRpb25zIG9mIFtUeXBlSW5mZXJyZXJdLgovLy8KLy8vIFRoaXMgY2xhc3MgY29udGFpbnMgYXMgbXVjaCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdHlwZSBpbmZlcmVuY2UgYXMKLy8vIHBvc3NpYmxlIHdpdGhvdXQga25vd2luZyB0aGUgaWRlbnRpdHkgb2YgdGhlIHR5cGUgcGFyYW1ldGVycy4gIEl0IGRlZmVycyB0bwovLy8gYWJzdHJhY3QgbWV0aG9kcyBmb3IgZXZlcnl0aGluZyBlbHNlLgphYnN0cmFjdCBjbGFzcyBUeXBlSW5mZXJyZXJJbXBsIGV4dGVuZHMgVHlwZUluZmVycmVyIHsKICAvLy8gTWFya2VyIG9iamVjdCB0byBpbmRpY2F0ZSB0aGF0IGEgZnVuY3Rpb24gdGFrZXMgYW4gdW5rbm93biBudW1iZXIKICAvLy8gb2YgYXJndW1lbnRzLgogIHN0YXRpYyBmaW5hbCBGdW5jdGlvblR5cGUgdW5rbm93bkZ1bmN0aW9uID0KICAgICAgbmV3IEZ1bmN0aW9uVHlwZShjb25zdCBbXSwgY29uc3QgRHluYW1pY1R5cGUoKSk7CgogIGZpbmFsIFR5cGVJbmZlcmVuY2VFbmdpbmUgZW5naW5lOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBVcmkgdXJpOwoKICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbnN0cnVjdCB3ZSBhcmUgY3VycmVudGx5IHBlcmZvcm1pbmcgaW5mZXJlbmNlIGZvcgogIC8vLyBpcyBvdXRzaWRlIG9mIGEgbWV0aG9kIGJvZHksIGFuZCBoZW5jZSB0b3AgbGV2ZWwgdHlwZSBpbmZlcmVuY2UgcnVsZXMKICAvLy8gc2hvdWxkIGFwcGx5LgogIGZpbmFsIGJvb2wgaXNUb3BMZXZlbDsKCiAgZmluYWwgQ2xhc3NIaWVyYXJjaHkgY2xhc3NIaWVyYXJjaHk7CgogIGZpbmFsIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb247CgogIGZpbmFsIFR5cGVTY2hlbWFFbnZpcm9ubWVudCB0eXBlU2NoZW1hRW52aXJvbm1lbnQ7CgogIGZpbmFsIEludGVyZmFjZVR5cGUgdGhpc1R5cGU7CgogIEBvdmVycmlkZQogIGZpbmFsIEtlcm5lbExpYnJhcnlCdWlsZGVyIGxpYnJhcnk7CgogIGZpbmFsIE1hcDxUcmVlTm9kZSwgRGFydFR5cGU+IGluZmVycmVkVHlwZXNNYXAgPSA8VHJlZU5vZGUsIERhcnRUeXBlPnt9OwoKICBJbmZlcmVuY2VIZWxwZXIgaGVscGVyOwoKICAvLy8gQ29udGV4dCBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgY2xvc3VyZSwgb3IgYG51bGxgIGlmIHdlIGFyZSBub3QKICAvLy8gaW5zaWRlIGEgY2xvc3VyZS4KICBDbG9zdXJlQ29udGV4dCBjbG9zdXJlQ29udGV4dDsKCiAgLy8vIFRoZSBbU3Vic3RpdHV0aW9uXSBpbmZlcnJlZCBieSB0aGUgbGFzdCBbaW5mZXJJbnZvY2F0aW9uXSwgb3IgYG51bGxgIGlmCiAgLy8vIHRoZSBsYXN0IGludm9jYXRpb24gZGlkbid0IHJlcXVpcmUgYW55IGluZmVyZW5jZS4KICBTdWJzdGl0dXRpb24gbGFzdEluZmVycmVkU3Vic3RpdHV0aW9uOwoKICAvLy8gVGhlIFtGdW5jdGlvblR5cGVdIG9mIHRoZSBjYWxsZWUgaW4gdGhlIGxhc3QgW2luZmVySW52b2NhdGlvbl0sIG9yIGBudWxsYAogIC8vLyBpZiB0aGUgbGFzdCBpbnZvY2F0aW9uIGRpZG4ndCByZXF1aXJlIGFueSBpbmZlcmVuY2UuCiAgRnVuY3Rpb25UeXBlIGxhc3RDYWxsZWVUeXBlOwoKICBUeXBlSW5mZXJyZXJJbXBsLnByaXZhdGUoCiAgICAgIHRoaXMuZW5naW5lLCB0aGlzLnVyaSwgYm9vbCB0b3BMZXZlbCwgdGhpcy50aGlzVHlwZSwgdGhpcy5saWJyYXJ5KQogICAgICA6IGFzc2VydCgodG9wTGV2ZWwgJiYgbGlicmFyeSA9PSBudWxsKSB8fCAoIXRvcExldmVsICYmIGxpYnJhcnkgIT0gbnVsbCkpLAogICAgICAgIGNsYXNzSGllcmFyY2h5ID0gZW5naW5lLmNsYXNzSGllcmFyY2h5LAogICAgICAgIGluc3RydW1lbnRhdGlvbiA9IHRvcExldmVsID8gbnVsbCA6IGVuZ2luZS5pbnN0cnVtZW50YXRpb24sCiAgICAgICAgdHlwZVNjaGVtYUVudmlyb25tZW50ID0gZW5naW5lLnR5cGVTY2hlbWFFbnZpcm9ubWVudCwKICAgICAgICBpc1RvcExldmVsID0gdG9wTGV2ZWwsCiAgICAgICAgc3VwZXIucHJpdmF0ZShlbmdpbmUuY29yZVR5cGVzKTsKCiAgRGFydFR5cGUgc3RvcmVJbmZlcnJlZFR5cGUoVHJlZU5vZGUgbm9kZSwgRGFydFR5cGUgdHlwZSkgewogICAgaWYgKG5vZGUgaXMgRXhwcmVzc2lvbkp1ZGdtZW50KSB7CiAgICAgIHJldHVybiBub2RlLmluZmVycmVkVHlwZSA9IHR5cGU7CiAgICB9IGVsc2UgewogICAgICBpZiAoaW5mZXJyZWRUeXBlc01hcC5jb250YWluc0tleShub2RlKSkgewogICAgICAgIGludGVybmFsUHJvYmxlbSgKICAgICAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1TdG9yaW5nTXVsdGlwbGVJbmZlcnJlZFR5cGVzLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICBpbmZlcnJlZFR5cGVzTWFwW25vZGVdLCAiJHtub2RlLnJ1bnRpbWVUeXBlfSIpLAogICAgICAgICAgICBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgICAgIHVyaSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGluZmVycmVkVHlwZXNNYXBbbm9kZV0gPSB0eXBlOwogICAgfQogIH0KCiAgRGFydFR5cGUgcmVhZEluZmVycmVkVHlwZShUcmVlTm9kZSBub2RlKSB7CiAgICBpZiAoIWluZmVycmVkVHlwZXNNYXAuY29udGFpbnNLZXkobm9kZSkgJiYgIWlzVG9wTGV2ZWwpIHsKICAgICAgaW50ZXJuYWxQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Ob0luZmVycmVkVHlwZVN0b3JlZAogICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKCIke25vZGUucnVudGltZVR5cGV9IiksCiAgICAgICAgICBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgICB1cmkpOwogICAgfQogICAgcmV0dXJuIGluZmVycmVkVHlwZXNNYXBbbm9kZV07CiAgfQoKICAvLy8gR2V0cyB0aGUgdHlwZSBwcm9tb3RlciB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHByb21vdGUgdHlwZXMgZHVyaW5nCiAgLy8vIGluZmVyZW5jZS4KICBUeXBlUHJvbW90ZXIgZ2V0IHR5cGVQcm9tb3RlcjsKCiAgYm9vbCBpc0RvdWJsZUNvbnRleHQoRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIC8vIEEgY29udGV4dCBpcyBhIGRvdWJsZSBjb250ZXh0IGlmIGRvdWJsZSBpcyBhc3NpZ25hYmxlIHRvIGl0IGJ1dCBpbnQgaXMKICAgIC8vIG5vdC4gIFRoYXQgaXMgdGhlIHR5cGUgY29udGV4dCBpcyBhIGRvdWJsZSBjb250ZXh0IGlmIGl0IGlzOgogICAgLy8gICAqIGRvdWJsZQogICAgLy8gICAqIEZ1dHVyZU9yPFQ+IHdoZXJlIFQgaXMgYSBkb3VibGUgY29udGV4dAogICAgLy8KICAgIC8vIFdlIGNoZWNrIGRpcmVjdGx5LCByYXRoZXIgdGhhbiB1c2luZyBpc0Fzc2lnbmFibGUgYmVjYXVzZSBpdCdzIHNpbXBsZXIuCiAgICB3aGlsZSAodHlwZUNvbnRleHQgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgIHR5cGVDb250ZXh0LmNsYXNzTm9kZSA9PSBjb3JlVHlwZXMuZnV0dXJlT3JDbGFzcyAmJgogICAgICAgIHR5cGVDb250ZXh0LnR5cGVBcmd1bWVudHMuaXNOb3RFbXB0eSkgewogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUgPSB0eXBlQ29udGV4dDsKICAgICAgdHlwZUNvbnRleHQgPSB0eXBlLnR5cGVBcmd1bWVudHMuZmlyc3Q7CiAgICB9CiAgICByZXR1cm4gdHlwZUNvbnRleHQgPT0gY29yZVR5cGVzLmRvdWJsZUNsYXNzLnJhd1R5cGU7CiAgfQoKICBib29sIGlzQXNzaWduYWJsZShEYXJ0VHlwZSBleHBlY3RlZFR5cGUsIERhcnRUeXBlIGFjdHVhbFR5cGUpIHsKICAgIHJldHVybiB0eXBlU2NoZW1hRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoZXhwZWN0ZWRUeXBlLCBhY3R1YWxUeXBlKSB8fAogICAgICAgIHR5cGVTY2hlbWFFbnZpcm9ubWVudC5pc1N1YnR5cGVPZihhY3R1YWxUeXBlLCBleHBlY3RlZFR5cGUpOwogIH0KCiAgLy8vIENoZWNrcyB3aGV0aGVyIFthY3R1YWxUeXBlXSBjYW4gYmUgYXNzaWduZWQgdG8gdGhlIGdyZWF0ZXN0IGNsb3N1cmUgb2YKICAvLy8gW2V4cGVjdGVkVHlwZV0sIGFuZCBpbnNlcnRzIGFuIGltcGxpY2l0IGRvd25jYXN0IGlmIGFwcHJvcHJpYXRlLgogIEV4cHJlc3Npb24gZW5zdXJlQXNzaWduYWJsZShEYXJ0VHlwZSBleHBlY3RlZFR5cGUsIERhcnRUeXBlIGFjdHVhbFR5cGUsCiAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgaW50IGZpbGVPZmZzZXQsCiAgICAgIHtib29sIGlzUmV0dXJuRnJvbUFzeW5jOiBmYWxzZSwKICAgICAgYm9vbCBpc1ZvaWRBbGxvd2VkOiBmYWxzZSwKICAgICAgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSwgRGFydFR5cGUpPiB0ZW1wbGF0ZX0pIHsKICAgIGFzc2VydChleHBlY3RlZFR5cGUgIT0gbnVsbCk7CiAgICBleHBlY3RlZFR5cGUgPSBncmVhdGVzdENsb3N1cmUoY29yZVR5cGVzLCBleHBlY3RlZFR5cGUpOwoKICAgIERhcnRUeXBlIGluaXRpYWxFeHBlY3RlZFR5cGUgPSBleHBlY3RlZFR5cGU7CiAgICBpZiAoaXNSZXR1cm5Gcm9tQXN5bmMgJiYgIWlzQXNzaWduYWJsZShleHBlY3RlZFR5cGUsIGFjdHVhbFR5cGUpKSB7CiAgICAgIC8vIElmIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbiBpcyBhc3luYywgdGhlIGV4cGVjdGVkIHJldHVybiB0eXBlIGhhcyB0aGUKICAgICAgLy8gc2hhcGUgRnV0dXJlT3I8VD4uICBXZSBjaGVjayBib3RoIGJyYW5jaGVzIGZvciBGdXR1cmVPciBoZXJlOiBib3RoIFQKICAgICAgLy8gYW5kIEZ1dHVyZTxUPi4KICAgICAgRGFydFR5cGUgdW5mdXR1cmVkRXhwZWN0ZWRUeXBlID0KICAgICAgICAgIHR5cGVTY2hlbWFFbnZpcm9ubWVudC51bmZ1dHVyZVR5cGUoZXhwZWN0ZWRUeXBlKTsKICAgICAgRGFydFR5cGUgZnV0dXJlZEV4cGVjdGVkVHlwZSA9IHdyYXBGdXR1cmVUeXBlKHVuZnV0dXJlZEV4cGVjdGVkVHlwZSk7CiAgICAgIGlmIChpc0Fzc2lnbmFibGUodW5mdXR1cmVkRXhwZWN0ZWRUeXBlLCBhY3R1YWxUeXBlKSkgewogICAgICAgIGV4cGVjdGVkVHlwZSA9IHVuZnV0dXJlZEV4cGVjdGVkVHlwZTsKICAgICAgfSBlbHNlIGlmIChpc0Fzc2lnbmFibGUoZnV0dXJlZEV4cGVjdGVkVHlwZSwgYWN0dWFsVHlwZSkpIHsKICAgICAgICBleHBlY3RlZFR5cGUgPSBmdXR1cmVkRXhwZWN0ZWRUeXBlOwogICAgICB9CiAgICB9CgogICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBpbnNlcnQgYXNzaWduYWJpbGl0eSBjaGVja3Mgd2hlbiBkb2luZyB0b3AgbGV2ZWwgdHlwZQogICAgLy8gaW5mZXJlbmNlIHNpbmNlIHRvcCBsZXZlbCB0eXBlIGluZmVyZW5jZSBvbmx5IGNhcmVzIGFib3V0IHRoZSB0eXBlIHRoYXQKICAgIC8vIGlzIGluZmVycmVkICh0aGUga2VybmVsIGNvZGUgaXMgZGlzY2FyZGVkKS4KICAgIGlmIChpc1RvcExldmVsKSByZXR1cm4gbnVsbDsKCiAgICAvLyBJZiBhbiBpbnRlcmZhY2UgdHlwZSBpcyBiZWluZyBhc3NpZ25lZCB0byBhIGZ1bmN0aW9uIHR5cGUsIHNlZSBpZiB3ZQogICAgLy8gc2hvdWxkIHRlYXIgb2ZmIGAuY2FsbGAuCiAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IHVzZSByZXNvbHZlVHlwZVBhcmFtZXRlci4gIFNlZSBmaW5kSW50ZXJmYWNlTWVtYmVyLgogICAgaWYgKGFjdHVhbFR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICB2YXIgY2xhc3NOb2RlID0gKGFjdHVhbFR5cGUgYXMgSW50ZXJmYWNlVHlwZSkuY2xhc3NOb2RlOwogICAgICB2YXIgY2FsbE1lbWJlciA9IGNsYXNzSGllcmFyY2h5LmdldEludGVyZmFjZU1lbWJlcihjbGFzc05vZGUsIGNhbGxOYW1lKTsKICAgICAgaWYgKGNhbGxNZW1iZXIgaXMgUHJvY2VkdXJlICYmIGNhbGxNZW1iZXIua2luZCA9PSBQcm9jZWR1cmVLaW5kLk1ldGhvZCkgewogICAgICAgIGlmIChfc2hvdWxkVGVhck9mZkNhbGwoZXhwZWN0ZWRUeXBlLCBhY3R1YWxUeXBlKSkgewogICAgICAgICAgLy8gUmVwbGFjZSBleHByZXNzaW9uIHdpdGg6CiAgICAgICAgICAvLyBgbGV0IHQgPSBleHByZXNzaW9uIGluIHQgPT0gbnVsbCA/IG51bGwgOiB0LmNhbGxgCiAgICAgICAgICB2YXIgcGFyZW50ID0gZXhwcmVzc2lvbi5wYXJlbnQ7CiAgICAgICAgICB2YXIgdCA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKGV4cHJlc3Npb24sIHR5cGU6IGFjdHVhbFR5cGUpCiAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICAgICAgICB2YXIgbnVsbENoZWNrID0gYnVpbGRJc051bGwobmV3IFZhcmlhYmxlR2V0KHQpLCBmaWxlT2Zmc2V0LCBoZWxwZXIpOwogICAgICAgICAgdmFyIHRlYXJPZmYgPQogICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eUdldChuZXcgVmFyaWFibGVHZXQodCksIGNhbGxOYW1lLCBjYWxsTWVtYmVyKQogICAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgICAgICAgIGFjdHVhbFR5cGUgPSBnZXRDYWxsZWVUeXBlKGNhbGxNZW1iZXIsIGFjdHVhbFR5cGUpOwogICAgICAgICAgdmFyIGNvbmRpdGlvbmFsID0gbmV3IENvbmRpdGlvbmFsRXhwcmVzc2lvbihudWxsQ2hlY2ssCiAgICAgICAgICAgICAgbmV3IE51bGxMaXRlcmFsKCkuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0LCB0ZWFyT2ZmLCBhY3R1YWxUeXBlKTsKICAgICAgICAgIHZhciBsZXQgPSBuZXcgTGV0KHQsIGNvbmRpdGlvbmFsKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICAgICAgICBwYXJlbnQ/LnJlcGxhY2VDaGlsZChleHByZXNzaW9uLCBsZXQpOwogICAgICAgICAgZXhwcmVzc2lvbiA9IGxldDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAoYWN0dWFsVHlwZSBpcyBWb2lkVHlwZSAmJiAhaXNWb2lkQWxsb3dlZCkgewogICAgICAvLyBFcnJvcjogbm90IGFzc2lnbmFibGUuICBQZXJmb3JtIGVycm9yIHJlY292ZXJ5LgogICAgICBUcmVlTm9kZSBwYXJlbnQgPSBleHByZXNzaW9uLnBhcmVudDsKICAgICAgRXhwcmVzc2lvbiBlcnJvck5vZGUgPQogICAgICAgICAgaGVscGVyLndyYXBJblByb2JsZW0oZXhwcmVzc2lvbiwgbWVzc2FnZVZvaWRFeHByZXNzaW9uLCBub0xlbmd0aCk7CiAgICAgIHBhcmVudD8ucmVwbGFjZUNoaWxkKGV4cHJlc3Npb24sIGVycm9yTm9kZSk7CiAgICAgIHJldHVybiBlcnJvck5vZGU7CiAgICB9CgogICAgaWYgKGV4cGVjdGVkVHlwZSA9PSBudWxsIHx8CiAgICAgICAgdHlwZVNjaGVtYUVudmlyb25tZW50LmlzU3VidHlwZU9mKGFjdHVhbFR5cGUsIGV4cGVjdGVkVHlwZSkpIHsKICAgICAgLy8gVHlwZXMgYXJlIGNvbXBhdGlibGUuCiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGlmICghdHlwZVNjaGVtYUVudmlyb25tZW50LmlzU3VidHlwZU9mKGV4cGVjdGVkVHlwZSwgYWN0dWFsVHlwZSkpIHsKICAgICAgLy8gRXJyb3I6IG5vdCBhc3NpZ25hYmxlLiAgUGVyZm9ybSBlcnJvciByZWNvdmVyeS4KICAgICAgdmFyIHBhcmVudCA9IGV4cHJlc3Npb24ucGFyZW50OwogICAgICBFeHByZXNzaW9uIGVycm9yTm9kZSA9IG5ldyBBc0V4cHJlc3Npb24oCiAgICAgICAgICBleHByZXNzaW9uLAogICAgICAgICAgLy8gVE9ETyhhaGUpOiBUaGUgb3V0bGluZSBwaGFzZSBkb2Vzbid0IGNvcnJlY3RseSByZW1vdmUgaW52YWxpZAogICAgICAgICAgLy8gdXNlcyBvZiB0eXBlIHZhcmlhYmxlcywgZm9yIGV4YW1wbGUsIG9uIHN0YXRpYyBtZW1iZXJzLiBPbmNlCiAgICAgICAgICAvLyB0aGF0IGhhcyBiZWVuIGZpeGVkLCB3ZSBzaG91bGQgYWx3YXlzIGJlIGFibGUgdG8gdXNlCiAgICAgICAgICAvLyBbZXhwZWN0ZWRUeXBlXSBkaXJlY3RseSBoZXJlLgogICAgICAgICAgaGFzQW55VHlwZVZhcmlhYmxlcyhleHBlY3RlZFR5cGUpID8gY29uc3QgQm90dG9tVHlwZSgpIDogZXhwZWN0ZWRUeXBlKQogICAgICAgIC4uaXNUeXBlRXJyb3IgPSB0cnVlCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gZXhwcmVzc2lvbi5maWxlT2Zmc2V0OwogICAgICBpZiAoZXhwZWN0ZWRUeXBlIGlzISBJbnZhbGlkVHlwZSAmJiBhY3R1YWxUeXBlIGlzISBJbnZhbGlkVHlwZSkgewogICAgICAgIGVycm9yTm9kZSA9IGhlbHBlci53cmFwSW5Qcm9ibGVtKAogICAgICAgICAgICBlcnJvck5vZGUsCiAgICAgICAgICAgICh0ZW1wbGF0ZSA/PyB0ZW1wbGF0ZUludmFsaWRBc3NpZ25tZW50KQogICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoYWN0dWFsVHlwZSwgZXhwZWN0ZWRUeXBlKSwKICAgICAgICAgICAgbm9MZW5ndGgpOwogICAgICB9CiAgICAgIHBhcmVudD8ucmVwbGFjZUNoaWxkKGV4cHJlc3Npb24sIGVycm9yTm9kZSk7CiAgICAgIHJldHVybiBlcnJvck5vZGU7CiAgICB9IGVsc2UgewogICAgICB2YXIgdGVtcGxhdGUgPSBfZ2V0UHJlY2lzZVR5cGVFcnJvclRlbXBsYXRlKGV4cHJlc3Npb24pOwogICAgICBpZiAodGVtcGxhdGUgIT0gbnVsbCkgewogICAgICAgIC8vIFRoZSB0eXBlIG9mIHRoZSBleHByZXNzaW9uIGlzIGtub3duIHByZWNpc2VseSwgc28gYW4gaW1wbGljaXQKICAgICAgICAvLyBkb3duY2FzdCBpcyBndWFyYW50ZWVkIHRvIGZhaWwuICBJbnNlcnQgYSBjb21waWxlLXRpbWUgZXJyb3IuCiAgICAgICAgdmFyIHBhcmVudCA9IGV4cHJlc3Npb24ucGFyZW50OwogICAgICAgIHZhciBlcnJvck5vZGUgPSBoZWxwZXIud3JhcEluUHJvYmxlbShleHByZXNzaW9uLAogICAgICAgICAgICB0ZW1wbGF0ZS53aXRoQXJndW1lbnRzKGFjdHVhbFR5cGUsIGV4cGVjdGVkVHlwZSksIG5vTGVuZ3RoKTsKICAgICAgICBwYXJlbnQ/LnJlcGxhY2VDaGlsZChleHByZXNzaW9uLCBlcnJvck5vZGUpOwogICAgICAgIHJldHVybiBlcnJvck5vZGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gSW5zZXJ0IGFuIGltcGxpY2l0IGRvd25jYXN0LgogICAgICAgIHZhciBwYXJlbnQgPSBleHByZXNzaW9uLnBhcmVudDsKICAgICAgICB2YXIgdHlwZUNoZWNrID0gbmV3IEFzRXhwcmVzc2lvbihleHByZXNzaW9uLCBpbml0aWFsRXhwZWN0ZWRUeXBlKQogICAgICAgICAgLi5pc1R5cGVFcnJvciA9IHRydWUKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICAgICAgcGFyZW50Py5yZXBsYWNlQ2hpbGQoZXhwcmVzc2lvbiwgdHlwZUNoZWNrKTsKICAgICAgICByZXR1cm4gdHlwZUNoZWNrOwogICAgICB9CiAgICB9CiAgfQoKICBib29sIGlzTnVsbChEYXJ0VHlwZSB0eXBlKSB7CiAgICByZXR1cm4gdHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmIHR5cGUuY2xhc3NOb2RlID09IGNvcmVUeXBlcy5udWxsQ2xhc3M7CiAgfQoKICAvLy8gRmluZHMgYSBtZW1iZXIgb2YgW3JlY2VpdmVyVHlwZV0gY2FsbGVkIFtuYW1lXSwgYW5kIGlmIGl0IGlzIGZvdW5kLAogIC8vLyByZXBvcnRzIGl0IHRocm91Z2ggaW5zdHJ1bWVudGF0aW9uIHVzaW5nIFtmaWxlT2Zmc2V0XS4KICAvLy8KICAvLy8gRm9yIHRoZSBjYXNlIHdoZXJlIFtyZWNlaXZlclR5cGVdIGlzIGEgW0Z1bmN0aW9uVHlwZV0sIGFuZCB0aGUgbmFtZQogIC8vLyBpcyBgY2FsbGAsIHRoZSBzdHJpbmcgJ2NhbGwnIGlzIHJldHVybmVkIGFzIGEgc2VudGluZWwgb2JqZWN0LgogIC8vLwogIC8vLyBGb3IgdGhlIGNhc2Ugd2hlcmUgW3JlY2VpdmVyVHlwZV0gaXMgYGR5bmFtaWNgLCBhbmQgdGhlIG5hbWUgaXMgZGVjbGFyZWQKICAvLy8gaW4gT2JqZWN0LCB0aGUgbWVtYmVyIGZyb20gT2JqZWN0IGlzIHJldHVybmVkIHRob3VnaCB0aGUgY2FsbCBtYXkgbm90IGVuZAogIC8vLyB1cCB0YXJnZXRpbmcgaXQgaWYgdGhlIGFyZ3VtZW50cyBkbyBub3QgbWF0Y2ggKHRoZSBiYXNpYyBwcmluY2lwbGUgaXMgdGhhdAogIC8vLyB0aGUgT2JqZWN0IG1lbWJlciBpcyB1c2VkIGZvciBpbmZlcnJpbmcgdHlwZXMgb25seSBpZiBub1N1Y2hNZXRob2QgY2Fubm90CiAgLy8vIGJlIHRhcmdldGVkIGR1ZSB0bywgZS5nLiwgYW4gaW5jb3JyZWN0IGFyZ3VtZW50IGNvdW50KS4KICBPYmplY3QgZmluZEludGVyZmFjZU1lbWJlcihEYXJ0VHlwZSByZWNlaXZlclR5cGUsIE5hbWUgbmFtZSwgaW50IGZpbGVPZmZzZXQsCiAgICAgIHtUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZywgRGFydFR5cGUpPiBlcnJvclRlbXBsYXRlLAogICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24sCiAgICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIsCiAgICAgIGJvb2wgc2V0dGVyOiBmYWxzZSwKICAgICAgYm9vbCBpbnN0cnVtZW50ZWQ6IHRydWV9KSB7CiAgICBhc3NlcnQocmVjZWl2ZXJUeXBlICE9IG51bGwgJiYgaXNLbm93bihyZWNlaXZlclR5cGUpKTsKCiAgICByZWNlaXZlclR5cGUgPSByZXNvbHZlVHlwZVBhcmFtZXRlcihyZWNlaXZlclR5cGUpOwoKICAgIGlmIChyZWNlaXZlclR5cGUgaXMgRnVuY3Rpb25UeXBlICYmIG5hbWUubmFtZSA9PSAnY2FsbCcpIHsKICAgICAgcmV0dXJuICdjYWxsJzsKICAgIH0KCiAgICBDbGFzcyBjbGFzc05vZGUgPSByZWNlaXZlclR5cGUgaXMgSW50ZXJmYWNlVHlwZQogICAgICAgID8gcmVjZWl2ZXJUeXBlLmNsYXNzTm9kZQogICAgICAgIDogY29yZVR5cGVzLm9iamVjdENsYXNzOwogICAgTWVtYmVyIGludGVyZmFjZU1lbWJlciA9IF9nZXRJbnRlcmZhY2VNZW1iZXIoY2xhc3NOb2RlLCBuYW1lLCBzZXR0ZXIpOwogICAgaWYgKGluc3RydW1lbnRlZCAmJgogICAgICAgIHJlY2VpdmVyVHlwZSAhPSBjb25zdCBEeW5hbWljVHlwZSgpICYmCiAgICAgICAgaW50ZXJmYWNlTWVtYmVyICE9IG51bGwpIHsKICAgICAgaW5zdHJ1bWVudGF0aW9uPy5yZWNvcmQodXJpLCBmaWxlT2Zmc2V0LCAndGFyZ2V0JywKICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvck1lbWJlcihpbnRlcmZhY2VNZW1iZXIpKTsKICAgIH0KCiAgICBpZiAoIWlzVG9wTGV2ZWwgJiYKICAgICAgICBpbnRlcmZhY2VNZW1iZXIgPT0gbnVsbCAmJgogICAgICAgIHJlY2VpdmVyVHlwZSBpcyEgRHluYW1pY1R5cGUgJiYKICAgICAgICByZWNlaXZlclR5cGUgaXMhIEludmFsaWRUeXBlICYmCiAgICAgICAgIShyZWNlaXZlclR5cGUgPT0gY29yZVR5cGVzLmZ1bmN0aW9uQ2xhc3MucmF3VHlwZSAmJgogICAgICAgICAgICBuYW1lLm5hbWUgPT0gJ2NhbGwnKSAmJgogICAgICAgIGVycm9yVGVtcGxhdGUgIT0gbnVsbCkgewogICAgICBpbnQgbGVuZ3RoID0gbmFtZS5uYW1lLmxlbmd0aDsKICAgICAgaWYgKGlkZW50aWNhbChuYW1lLm5hbWUsIGNhbGxOYW1lLm5hbWUpIHx8CiAgICAgICAgICBpZGVudGljYWwobmFtZS5uYW1lLCB1bmFyeU1pbnVzTmFtZS5uYW1lKSkgewogICAgICAgIGxlbmd0aCA9IDE7CiAgICAgIH0KICAgICAgZXhwcmVzc2lvbi5wYXJlbnQucmVwbGFjZUNoaWxkKAogICAgICAgICAgZXhwcmVzc2lvbiwKICAgICAgICAgIGhlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihoZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgIGVycm9yVGVtcGxhdGUud2l0aEFyZ3VtZW50cyhuYW1lLm5hbWUsIHJlY2VpdmVyVHlwZSksCiAgICAgICAgICAgICAgZmlsZU9mZnNldCwKICAgICAgICAgICAgICBsZW5ndGgpKSk7CiAgICB9CiAgICByZXR1cm4gaW50ZXJmYWNlTWVtYmVyOwogIH0KCiAgLy8vIEZpbmRzIGEgbWVtYmVyIG9mIFtyZWNlaXZlclR5cGVdIGNhbGxlZCBbbmFtZV0gYW5kIHJlY29yZHMgaXQgaW4KICAvLy8gW21ldGhvZEludm9jYXRpb25dLgogIE9iamVjdCBmaW5kTWV0aG9kSW52b2NhdGlvbk1lbWJlcigKICAgICAgRGFydFR5cGUgcmVjZWl2ZXJUeXBlLCBJbnZvY2F0aW9uRXhwcmVzc2lvbiBtZXRob2RJbnZvY2F0aW9uLAogICAgICB7Ym9vbCBpbnN0cnVtZW50ZWQ6IHRydWV9KSB7CiAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IGNvdWxkIHdlIGFkZCBnZXR0ZXJzIHRvIEludm9jYXRpb25FeHByZXNzaW9uIHRvIG1ha2UKICAgIC8vIHRoZXNlIGlzLWNoZWNrcyB1bm5lY2Vzc2FyeT8KICAgIGlmIChtZXRob2RJbnZvY2F0aW9uIGlzIE1ldGhvZEludm9jYXRpb24pIHsKICAgICAgdmFyIGludGVyZmFjZU1lbWJlciA9IGZpbmRJbnRlcmZhY2VNZW1iZXIoCiAgICAgICAgICByZWNlaXZlclR5cGUsIG1ldGhvZEludm9jYXRpb24ubmFtZSwgbWV0aG9kSW52b2NhdGlvbi5maWxlT2Zmc2V0LAogICAgICAgICAgZXJyb3JUZW1wbGF0ZTogdGVtcGxhdGVVbmRlZmluZWRNZXRob2QsCiAgICAgICAgICBleHByZXNzaW9uOiBtZXRob2RJbnZvY2F0aW9uLAogICAgICAgICAgcmVjZWl2ZXI6IG1ldGhvZEludm9jYXRpb24ucmVjZWl2ZXIsCiAgICAgICAgICBpbnN0cnVtZW50ZWQ6IGluc3RydW1lbnRlZCk7CiAgICAgIGlmIChyZWNlaXZlclR5cGUgPT0gY29uc3QgRHluYW1pY1R5cGUoKSAmJiBpbnRlcmZhY2VNZW1iZXIgaXMgUHJvY2VkdXJlKSB7CiAgICAgICAgdmFyIGFyZ3VtZW50cyA9IG1ldGhvZEludm9jYXRpb24uYXJndW1lbnRzOwogICAgICAgIHZhciBzaWduYXR1cmUgPSBpbnRlcmZhY2VNZW1iZXIuZnVuY3Rpb247CiAgICAgICAgaWYgKGFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA8IHNpZ25hdHVyZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50IHx8CiAgICAgICAgICAgIGFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA+CiAgICAgICAgICAgICAgICBzaWduYXR1cmUucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgYXJndW1lbnQgaW4gYXJndW1lbnRzLm5hbWVkKSB7CiAgICAgICAgICBpZiAoIXNpZ25hdHVyZS5uYW1lZFBhcmFtZXRlcnMKICAgICAgICAgICAgICAuYW55KChkZWNsYXJhdGlvbikgPT4gZGVjbGFyYXRpb24ubmFtZSA9PSBhcmd1bWVudC5uYW1lKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGluc3RydW1lbnRlZCAmJiBpbnN0cnVtZW50YXRpb24gIT0gbnVsbCkgewogICAgICAgICAgaW5zdHJ1bWVudGF0aW9uLnJlY29yZCh1cmksIG1ldGhvZEludm9jYXRpb24uZmlsZU9mZnNldCwgJ3RhcmdldCcsCiAgICAgICAgICAgICAgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yTWVtYmVyKGludGVyZmFjZU1lbWJlcikpOwogICAgICAgIH0KICAgICAgICBtZXRob2RJbnZvY2F0aW9uLmludGVyZmFjZVRhcmdldCA9IGludGVyZmFjZU1lbWJlcjsKICAgICAgfSBlbHNlIGlmIChpbnRlcmZhY2VNZW1iZXIgaXMgTWVtYmVyKSB7CiAgICAgICAgbWV0aG9kSW52b2NhdGlvbi5pbnRlcmZhY2VUYXJnZXQgPSBpbnRlcmZhY2VNZW1iZXI7CiAgICAgIH0KICAgICAgcmV0dXJuIGludGVyZmFjZU1lbWJlcjsKICAgIH0gZWxzZSBpZiAobWV0aG9kSW52b2NhdGlvbiBpcyBTdXBlck1ldGhvZEludm9jYXRpb24pIHsKICAgICAgYXNzZXJ0KHJlY2VpdmVyVHlwZSAhPSBjb25zdCBEeW5hbWljVHlwZSgpKTsKICAgICAgdmFyIGludGVyZmFjZU1lbWJlciA9IGZpbmRJbnRlcmZhY2VNZW1iZXIoCiAgICAgICAgICByZWNlaXZlclR5cGUsIG1ldGhvZEludm9jYXRpb24ubmFtZSwgbWV0aG9kSW52b2NhdGlvbi5maWxlT2Zmc2V0LAogICAgICAgICAgaW5zdHJ1bWVudGVkOiBpbnN0cnVtZW50ZWQpOwogICAgICBpZiAoaW50ZXJmYWNlTWVtYmVyIGlzIE1lbWJlcikgewogICAgICAgIG1ldGhvZEludm9jYXRpb24uaW50ZXJmYWNlVGFyZ2V0ID0gaW50ZXJmYWNlTWVtYmVyOwogICAgICB9CiAgICAgIHJldHVybiBpbnRlcmZhY2VNZW1iZXI7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyB1bmhhbmRsZWQoIiR7bWV0aG9kSW52b2NhdGlvbi5ydW50aW1lVHlwZX0iLAogICAgICAgICAgImZpbmRNZXRob2RJbnZvY2F0aW9uTWVtYmVyIiwgbWV0aG9kSW52b2NhdGlvbi5maWxlT2Zmc2V0LCB1cmkpOwogICAgfQogIH0KCiAgLy8vIEZpbmRzIGEgbWVtYmVyIG9mIFtyZWNlaXZlclR5cGVdIGNhbGxlZCBbbmFtZV0sIGFuZCBpZiBpdCBpcyBmb3VuZCwKICAvLy8gcmVwb3J0cyBpdCB0aHJvdWdoIGluc3RydW1lbnRhdGlvbiBhbmQgcmVjb3JkcyBpdCBpbiBbcHJvcGVydHlHZXRdLgogIE9iamVjdCBmaW5kUHJvcGVydHlHZXRNZW1iZXIoRGFydFR5cGUgcmVjZWl2ZXJUeXBlLCBFeHByZXNzaW9uIHByb3BlcnR5R2V0LAogICAgICB7Ym9vbCBpbnN0cnVtZW50ZWQ6IHRydWV9KSB7CiAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IGNvdWxkIHdlIGFkZCBhIGNvbW1vbiBiYXNlIGNsYXNzIHRvIFByb3BlcnR5R2V0IGFuZAogICAgLy8gU3VwZXJQcm9wZXJ0eUdldCB0byBtYWtlIHRoZXNlIGlzLWNoZWNrcyB1bm5lY2Vzc2FyeT8KICAgIGlmIChwcm9wZXJ0eUdldCBpcyBQcm9wZXJ0eUdldCkgewogICAgICB2YXIgaW50ZXJmYWNlTWVtYmVyID0gZmluZEludGVyZmFjZU1lbWJlcigKICAgICAgICAgIHJlY2VpdmVyVHlwZSwgcHJvcGVydHlHZXQubmFtZSwgcHJvcGVydHlHZXQuZmlsZU9mZnNldCwKICAgICAgICAgIGVycm9yVGVtcGxhdGU6IHRlbXBsYXRlVW5kZWZpbmVkR2V0dGVyLAogICAgICAgICAgZXhwcmVzc2lvbjogcHJvcGVydHlHZXQsCiAgICAgICAgICByZWNlaXZlcjogcHJvcGVydHlHZXQucmVjZWl2ZXIsCiAgICAgICAgICBpbnN0cnVtZW50ZWQ6IGluc3RydW1lbnRlZCk7CiAgICAgIGlmIChpbnRlcmZhY2VNZW1iZXIgaXMgTWVtYmVyKSB7CiAgICAgICAgaWYgKGluc3RydW1lbnRlZCAmJgogICAgICAgICAgICBpbnN0cnVtZW50YXRpb24gIT0gbnVsbCAmJgogICAgICAgICAgICByZWNlaXZlclR5cGUgPT0gY29uc3QgRHluYW1pY1R5cGUoKSkgewogICAgICAgICAgaW5zdHJ1bWVudGF0aW9uLnJlY29yZCh1cmksIHByb3BlcnR5R2V0LmZpbGVPZmZzZXQsICd0YXJnZXQnLAogICAgICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvck1lbWJlcihpbnRlcmZhY2VNZW1iZXIpKTsKICAgICAgICB9CiAgICAgICAgcHJvcGVydHlHZXQuaW50ZXJmYWNlVGFyZ2V0ID0gaW50ZXJmYWNlTWVtYmVyOwogICAgICB9CiAgICAgIHJldHVybiBpbnRlcmZhY2VNZW1iZXI7CiAgICB9IGVsc2UgaWYgKHByb3BlcnR5R2V0IGlzIFN1cGVyUHJvcGVydHlHZXQpIHsKICAgICAgYXNzZXJ0KHJlY2VpdmVyVHlwZSAhPSBjb25zdCBEeW5hbWljVHlwZSgpKTsKICAgICAgdmFyIGludGVyZmFjZU1lbWJlciA9IGZpbmRJbnRlcmZhY2VNZW1iZXIoCiAgICAgICAgICByZWNlaXZlclR5cGUsIHByb3BlcnR5R2V0Lm5hbWUsIHByb3BlcnR5R2V0LmZpbGVPZmZzZXQsCiAgICAgICAgICBpbnN0cnVtZW50ZWQ6IGluc3RydW1lbnRlZCk7CiAgICAgIGlmIChpbnRlcmZhY2VNZW1iZXIgaXMgTWVtYmVyKSB7CiAgICAgICAgcHJvcGVydHlHZXQuaW50ZXJmYWNlVGFyZ2V0ID0gaW50ZXJmYWNlTWVtYmVyOwogICAgICB9CiAgICAgIHJldHVybiBpbnRlcmZhY2VNZW1iZXI7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdW5oYW5kbGVkKCIke3Byb3BlcnR5R2V0LnJ1bnRpbWVUeXBlfSIsICJmaW5kUHJvcGVydHlHZXRNZW1iZXIiLAogICAgICAgICAgcHJvcGVydHlHZXQuZmlsZU9mZnNldCwgdXJpKTsKICAgIH0KICB9CgogIC8vLyBGaW5kcyBhIG1lbWJlciBvZiBbcmVjZWl2ZXJUeXBlXSBjYWxsZWQgW25hbWVdLCBhbmQgaWYgaXQgaXMgZm91bmQsCiAgLy8vIHJlcG9ydHMgaXQgdGhyb3VnaCBpbnN0cnVtZW50YXRpb24gYW5kIHJlY29yZHMgaXQgaW4gW3Byb3BlcnR5U2V0XS4KICBPYmplY3QgZmluZFByb3BlcnR5U2V0TWVtYmVyKERhcnRUeXBlIHJlY2VpdmVyVHlwZSwgRXhwcmVzc2lvbiBwcm9wZXJ0eVNldCwKICAgICAge2Jvb2wgaW5zdHJ1bWVudGVkOiB0cnVlfSkgewogICAgaWYgKHByb3BlcnR5U2V0IGlzIFByb3BlcnR5U2V0KSB7CiAgICAgIHZhciBpbnRlcmZhY2VNZW1iZXIgPSBmaW5kSW50ZXJmYWNlTWVtYmVyKAogICAgICAgICAgcmVjZWl2ZXJUeXBlLCBwcm9wZXJ0eVNldC5uYW1lLCBwcm9wZXJ0eVNldC5maWxlT2Zmc2V0LAogICAgICAgICAgZXJyb3JUZW1wbGF0ZTogdGVtcGxhdGVVbmRlZmluZWRTZXR0ZXIsCiAgICAgICAgICBleHByZXNzaW9uOiBwcm9wZXJ0eVNldCwKICAgICAgICAgIHJlY2VpdmVyOiBwcm9wZXJ0eVNldC5yZWNlaXZlciwKICAgICAgICAgIHNldHRlcjogdHJ1ZSwKICAgICAgICAgIGluc3RydW1lbnRlZDogaW5zdHJ1bWVudGVkKTsKICAgICAgaWYgKGludGVyZmFjZU1lbWJlciBpcyBNZW1iZXIpIHsKICAgICAgICBpZiAoaW5zdHJ1bWVudGVkICYmCiAgICAgICAgICAgIGluc3RydW1lbnRhdGlvbiAhPSBudWxsICYmCiAgICAgICAgICAgIHJlY2VpdmVyVHlwZSA9PSBjb25zdCBEeW5hbWljVHlwZSgpKSB7CiAgICAgICAgICBpbnN0cnVtZW50YXRpb24ucmVjb3JkKHVyaSwgcHJvcGVydHlTZXQuZmlsZU9mZnNldCwgJ3RhcmdldCcsCiAgICAgICAgICAgICAgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yTWVtYmVyKGludGVyZmFjZU1lbWJlcikpOwogICAgICAgIH0KICAgICAgICBwcm9wZXJ0eVNldC5pbnRlcmZhY2VUYXJnZXQgPSBpbnRlcmZhY2VNZW1iZXI7CiAgICAgIH0KICAgICAgcmV0dXJuIGludGVyZmFjZU1lbWJlcjsKICAgIH0gZWxzZSBpZiAocHJvcGVydHlTZXQgaXMgU3VwZXJQcm9wZXJ0eVNldCkgewogICAgICBhc3NlcnQocmVjZWl2ZXJUeXBlICE9IGNvbnN0IER5bmFtaWNUeXBlKCkpOwogICAgICB2YXIgaW50ZXJmYWNlTWVtYmVyID0gZmluZEludGVyZmFjZU1lbWJlcigKICAgICAgICAgIHJlY2VpdmVyVHlwZSwgcHJvcGVydHlTZXQubmFtZSwgcHJvcGVydHlTZXQuZmlsZU9mZnNldCwKICAgICAgICAgIHNldHRlcjogdHJ1ZSwgaW5zdHJ1bWVudGVkOiBpbnN0cnVtZW50ZWQpOwogICAgICBpZiAoaW50ZXJmYWNlTWVtYmVyIGlzIE1lbWJlcikgewogICAgICAgIHByb3BlcnR5U2V0LmludGVyZmFjZVRhcmdldCA9IGludGVyZmFjZU1lbWJlcjsKICAgICAgfQogICAgICByZXR1cm4gaW50ZXJmYWNlTWVtYmVyOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgdW5oYW5kbGVkKCIke3Byb3BlcnR5U2V0LnJ1bnRpbWVUeXBlfSIsICJmaW5kUHJvcGVydHlTZXRNZW1iZXIiLAogICAgICAgICAgcHJvcGVydHlTZXQuZmlsZU9mZnNldCwgdXJpKTsKICAgIH0KICB9CgogIEZ1bmN0aW9uVHlwZSBnZXRDYWxsZWVGdW5jdGlvblR5cGUoRGFydFR5cGUgY2FsbGVlVHlwZSwgYm9vbCBmb2xsb3dDYWxsKSB7CiAgICBpZiAoY2FsbGVlVHlwZSBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgcmV0dXJuIGNhbGxlZVR5cGU7CiAgICB9IGVsc2UgaWYgKGZvbGxvd0NhbGwgJiYgY2FsbGVlVHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIHZhciBtZW1iZXIgPSBfZ2V0SW50ZXJmYWNlTWVtYmVyKGNhbGxlZVR5cGUuY2xhc3NOb2RlLCBjYWxsTmFtZSwgZmFsc2UpOwogICAgICB2YXIgY2FsbFR5cGUgPSBnZXRDYWxsZWVUeXBlKG1lbWJlciwgY2FsbGVlVHlwZSk7CiAgICAgIGlmIChjYWxsVHlwZSBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgICByZXR1cm4gY2FsbFR5cGU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB1bmtub3duRnVuY3Rpb247CiAgfQoKICBEYXJ0VHlwZSBnZXRDYWxsZWVUeXBlKE9iamVjdCBpbnRlcmZhY2VNZW1iZXIsIERhcnRUeXBlIHJlY2VpdmVyVHlwZSkgewogICAgaWYgKGlkZW50aWNhbChpbnRlcmZhY2VNZW1iZXIsICdjYWxsJykpIHsKICAgICAgcmV0dXJuIHJlY2VpdmVyVHlwZTsKICAgIH0gZWxzZSBpZiAoaW50ZXJmYWNlTWVtYmVyID09IG51bGwpIHsKICAgICAgcmV0dXJuIGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICB9IGVsc2UgaWYgKGludGVyZmFjZU1lbWJlciBpcyBNZW1iZXIpIHsKICAgICAgdmFyIG1lbWJlckNsYXNzID0gaW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzOwogICAgICBEYXJ0VHlwZSBjYWxsZWVUeXBlOwogICAgICBpZiAoaW50ZXJmYWNlTWVtYmVyIGlzIFByb2NlZHVyZSkgewogICAgICAgIGlmIChpbnRlcmZhY2VNZW1iZXIua2luZCA9PSBQcm9jZWR1cmVLaW5kLkdldHRlcikgewogICAgICAgICAgY2FsbGVlVHlwZSA9IGludGVyZmFjZU1lbWJlci5mdW5jdGlvbi5yZXR1cm5UeXBlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjYWxsZWVUeXBlID0gaW50ZXJmYWNlTWVtYmVyLmZ1bmN0aW9uLmZ1bmN0aW9uVHlwZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoaW50ZXJmYWNlTWVtYmVyIGlzIEZpZWxkKSB7CiAgICAgICAgY2FsbGVlVHlwZSA9IGludGVyZmFjZU1lbWJlci50eXBlOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IHVuaGFuZGxlZChpbnRlcmZhY2VNZW1iZXIucnVudGltZVR5cGUudG9TdHJpbmcoKSwgJ2dldENhbGxlZVR5cGUnLAogICAgICAgICAgICBudWxsLCBudWxsKTsKICAgICAgfQogICAgICBpZiAobWVtYmVyQ2xhc3MudHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICAgIHJlY2VpdmVyVHlwZSA9IHJlc29sdmVUeXBlUGFyYW1ldGVyKHJlY2VpdmVyVHlwZSk7CiAgICAgICAgaWYgKHJlY2VpdmVyVHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgICB2YXIgY2FzdGVkVHlwZSA9CiAgICAgICAgICAgICAgY2xhc3NIaWVyYXJjaHkuZ2V0VHlwZUFzSW5zdGFuY2VPZihyZWNlaXZlclR5cGUsIG1lbWJlckNsYXNzKTsKICAgICAgICAgIGNhbGxlZVR5cGUgPSBTdWJzdGl0dXRpb24uZnJvbUludGVyZmFjZVR5cGUoY2FzdGVkVHlwZSkKICAgICAgICAgICAgICAuc3Vic3RpdHV0ZVR5cGUoY2FsbGVlVHlwZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBjYWxsZWVUeXBlOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgdW5oYW5kbGVkKAogICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLnJ1bnRpbWVUeXBlLnRvU3RyaW5nKCksICdnZXRDYWxsZWVUeXBlJywgbnVsbCwgbnVsbCk7CiAgICB9CiAgfQoKICBEYXJ0VHlwZSBnZXREZXJpdmVkVHlwZUFyZ3VtZW50T2YoRGFydFR5cGUgdHlwZSwgQ2xhc3MgY2xhc3NfKSB7CiAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIHZhciB0eXBlQXNJbnN0YW5jZU9mQ2xhc3MgPQogICAgICAgICAgY2xhc3NIaWVyYXJjaHkuZ2V0VHlwZUFzSW5zdGFuY2VPZih0eXBlLCBjbGFzc18pOwogICAgICBpZiAodHlwZUFzSW5zdGFuY2VPZkNsYXNzICE9IG51bGwpIHsKICAgICAgICByZXR1cm4gdHlwZUFzSW5zdGFuY2VPZkNsYXNzLnR5cGVBcmd1bWVudHNbMF07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgLy8vIEdldHMgdGhlIGluaXRpYWxpemVyIGZvciB0aGUgZ2l2ZW4gW2ZpZWxkXSwgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vCiAgLy8vIGluaXRpYWxpemVyLgogIEV4cHJlc3Npb24gZ2V0RmllbGRJbml0aWFsaXplcihTaGFkb3dGaWVsZCBmaWVsZCk7CgogIC8vLyBJZiB0aGUgW21lbWJlcl0gaXMgYSBmb3J3YXJkaW5nIHN0dWIsIHJldHVybiB0aGUgdGFyZ2V0IGl0IGZvcndhcmRzIHRvLgogIC8vLyBPdGhlcndpc2UgcmV0dXJuIHRoZSBnaXZlbiBbbWVtYmVyXS4KICBNZW1iZXIgZ2V0UmVhbFRhcmdldChNZW1iZXIgbWVtYmVyKSB7CiAgICBpZiAobWVtYmVyIGlzIFByb2NlZHVyZSAmJiBtZW1iZXIuaXNGb3J3YXJkaW5nU3R1YikgewogICAgICByZXR1cm4gbWVtYmVyLmZvcndhcmRpbmdTdHViSW50ZXJmYWNlVGFyZ2V0OwogICAgfQogICAgcmV0dXJuIG1lbWJlcjsKICB9CgogIERhcnRUeXBlIGdldFNldHRlclR5cGUoT2JqZWN0IGludGVyZmFjZU1lbWJlciwgRGFydFR5cGUgcmVjZWl2ZXJUeXBlKSB7CiAgICBpZiAoaW50ZXJmYWNlTWVtYmVyIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICByZXR1cm4gaW50ZXJmYWNlTWVtYmVyOwogICAgfSBlbHNlIGlmIChpbnRlcmZhY2VNZW1iZXIgPT0gbnVsbCkgewogICAgICByZXR1cm4gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIH0gZWxzZSBpZiAoaW50ZXJmYWNlTWVtYmVyIGlzIE1lbWJlcikgewogICAgICB2YXIgbWVtYmVyQ2xhc3MgPSBpbnRlcmZhY2VNZW1iZXIuZW5jbG9zaW5nQ2xhc3M7CiAgICAgIERhcnRUeXBlIHNldHRlclR5cGU7CiAgICAgIGlmIChpbnRlcmZhY2VNZW1iZXIgaXMgUHJvY2VkdXJlKSB7CiAgICAgICAgYXNzZXJ0KGludGVyZmFjZU1lbWJlci5raW5kID09IFByb2NlZHVyZUtpbmQuU2V0dGVyKTsKICAgICAgICB2YXIgc2V0dGVyUGFyYW1ldGVycyA9IGludGVyZmFjZU1lbWJlci5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyczsKICAgICAgICBzZXR0ZXJUeXBlID0gc2V0dGVyUGFyYW1ldGVycy5sZW5ndGggPiAwCiAgICAgICAgICAgID8gc2V0dGVyUGFyYW1ldGVyc1swXS50eXBlCiAgICAgICAgICAgIDogY29uc3QgRHluYW1pY1R5cGUoKTsKICAgICAgfSBlbHNlIGlmIChpbnRlcmZhY2VNZW1iZXIgaXMgRmllbGQpIHsKICAgICAgICBzZXR0ZXJUeXBlID0gaW50ZXJmYWNlTWVtYmVyLnR5cGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgdW5oYW5kbGVkKGludGVyZmFjZU1lbWJlci5ydW50aW1lVHlwZS50b1N0cmluZygpLCAnZ2V0U2V0dGVyVHlwZScsCiAgICAgICAgICAgIG51bGwsIG51bGwpOwogICAgICB9CiAgICAgIGlmIChtZW1iZXJDbGFzcy50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgICAgcmVjZWl2ZXJUeXBlID0gcmVzb2x2ZVR5cGVQYXJhbWV0ZXIocmVjZWl2ZXJUeXBlKTsKICAgICAgICBpZiAocmVjZWl2ZXJUeXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICAgIHZhciBjYXN0ZWRUeXBlID0KICAgICAgICAgICAgICBjbGFzc0hpZXJhcmNoeS5nZXRUeXBlQXNJbnN0YW5jZU9mKHJlY2VpdmVyVHlwZSwgbWVtYmVyQ2xhc3MpOwogICAgICAgICAgc2V0dGVyVHlwZSA9IFN1YnN0aXR1dGlvbi5mcm9tSW50ZXJmYWNlVHlwZShjYXN0ZWRUeXBlKQogICAgICAgICAgICAgIC5zdWJzdGl0dXRlVHlwZShzZXR0ZXJUeXBlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHNldHRlclR5cGU7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyB1bmhhbmRsZWQoCiAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIucnVudGltZVR5cGUudG9TdHJpbmcoKSwgJ2dldFNldHRlclR5cGUnLCBudWxsLCBudWxsKTsKICAgIH0KICB9CgogIERhcnRUeXBlIGdldFR5cGVBcmd1bWVudE9mKERhcnRUeXBlIHR5cGUsIENsYXNzIGNsYXNzXykgewogICAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJiBpZGVudGljYWwodHlwZS5jbGFzc05vZGUsIGNsYXNzXykpIHsKICAgICAgcmV0dXJuIHR5cGUudHlwZUFyZ3VtZW50c1swXTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBjb25zdCBVbmtub3duVHlwZSgpOwogICAgfQogIH0KCiAgLy8vIEFkZHMgYW4gImFzIiBjaGVjayB0byBhIFtNZXRob2RJbnZvY2F0aW9uXSBpZiBuZWNlc3NhcnkgZHVlIHRvCiAgLy8vIGNvbnRyYXZhcmlhbmNlLgogIC8vLwogIC8vLyBUaGUgcmV0dXJuZWQgZXhwcmVzc2lvbiBpcyB0aGUgW0FzRXhwcmVzc2lvbl0sIGlmIG9uZSB3YXMgYWRkZWQ7IG90aGVyd2lzZQogIC8vLyBpdCBpcyB0aGUgW01ldGhvZEludm9jYXRpb25dLgogIEV4cHJlc3Npb24gaGFuZGxlSW52b2NhdGlvbkNvbnRyYXZhcmlhbmNlKAogICAgICBNZXRob2RDb250cmF2YXJpYW5jZUNoZWNrS2luZCBjaGVja0tpbmQsCiAgICAgIE1ldGhvZEludm9jYXRpb24gZGVzdWdhcmVkSW52b2NhdGlvbiwKICAgICAgQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uLAogICAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGUsCiAgICAgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUsCiAgICAgIGludCBmaWxlT2Zmc2V0KSB7CiAgICB2YXIgZXhwcmVzc2lvblRvUmVwbGFjZSA9IGRlc3VnYXJlZEludm9jYXRpb24gPz8gZXhwcmVzc2lvbjsKICAgIHN3aXRjaCAoY2hlY2tLaW5kKSB7CiAgICAgIGNhc2UgTWV0aG9kQ29udHJhdmFyaWFuY2VDaGVja0tpbmQuY2hlY2tNZXRob2RSZXR1cm46CiAgICAgICAgdmFyIHBhcmVudCA9IGV4cHJlc3Npb25Ub1JlcGxhY2UucGFyZW50OwogICAgICAgIHZhciByZXBsYWNlbWVudCA9IG5ldyBBc0V4cHJlc3Npb24oZXhwcmVzc2lvblRvUmVwbGFjZSwgaW5mZXJyZWRUeXBlKQogICAgICAgICAgLi5pc1R5cGVFcnJvciA9IHRydWUKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICAgICAgcGFyZW50LnJlcGxhY2VDaGlsZChleHByZXNzaW9uVG9SZXBsYWNlLCByZXBsYWNlbWVudCk7CiAgICAgICAgaWYgKGluc3RydW1lbnRhdGlvbiAhPSBudWxsKSB7CiAgICAgICAgICBpbnQgb2Zmc2V0ID0gYXJndW1lbnRzLmZpbGVPZmZzZXQgPT0gLTEKICAgICAgICAgICAgICA/IGV4cHJlc3Npb24uZmlsZU9mZnNldAogICAgICAgICAgICAgIDogYXJndW1lbnRzLmZpbGVPZmZzZXQ7CiAgICAgICAgICBpbnN0cnVtZW50YXRpb24ucmVjb3JkKHVyaSwgb2Zmc2V0LCAnY2hlY2tSZXR1cm4nLAogICAgICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGUoaW5mZXJyZWRUeXBlKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXBsYWNlbWVudDsKICAgICAgY2FzZSBNZXRob2RDb250cmF2YXJpYW5jZUNoZWNrS2luZC5jaGVja0dldHRlclJldHVybjoKICAgICAgICB2YXIgcGFyZW50ID0gZXhwcmVzc2lvblRvUmVwbGFjZS5wYXJlbnQ7CiAgICAgICAgdmFyIHByb3BlcnR5R2V0ID0gbmV3IFByb3BlcnR5R2V0KGRlc3VnYXJlZEludm9jYXRpb24ucmVjZWl2ZXIsCiAgICAgICAgICAgIGRlc3VnYXJlZEludm9jYXRpb24ubmFtZSwgZGVzdWdhcmVkSW52b2NhdGlvbi5pbnRlcmZhY2VUYXJnZXQpOwogICAgICAgIHZhciBhc0V4cHJlc3Npb24gPSBuZXcgQXNFeHByZXNzaW9uKHByb3BlcnR5R2V0LCBmdW5jdGlvblR5cGUpCiAgICAgICAgICAuLmlzVHlwZUVycm9yID0gdHJ1ZQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBuZXcgTWV0aG9kSW52b2NhdGlvbigKICAgICAgICAgICAgYXNFeHByZXNzaW9uLCBjYWxsTmFtZSwgZGVzdWdhcmVkSW52b2NhdGlvbi5hcmd1bWVudHMpOwogICAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQoZXhwcmVzc2lvblRvUmVwbGFjZSwgcmVwbGFjZW1lbnQpOwogICAgICAgIGlmIChpbnN0cnVtZW50YXRpb24gIT0gbnVsbCkgewogICAgICAgICAgaW50IG9mZnNldCA9IGFyZ3VtZW50cy5maWxlT2Zmc2V0ID09IC0xCiAgICAgICAgICAgICAgPyBleHByZXNzaW9uLmZpbGVPZmZzZXQKICAgICAgICAgICAgICA6IGFyZ3VtZW50cy5maWxlT2Zmc2V0OwogICAgICAgICAgaW5zdHJ1bWVudGF0aW9uLnJlY29yZCh1cmksIG9mZnNldCwgJ2NoZWNrR2V0dGVyUmV0dXJuJywKICAgICAgICAgICAgICBuZXcgSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JUeXBlKGZ1bmN0aW9uVHlwZSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7CiAgICAgIGNhc2UgTWV0aG9kQ29udHJhdmFyaWFuY2VDaGVja0tpbmQubm9uZToKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBleHByZXNzaW9uVG9SZXBsYWNlOwogIH0KCiAgLy8vIEFkZCBhbiAiYXMiIGNoZWNrIGlmIG5lY2Vzc2FyeSBkdWUgdG8gY29udHJhdmFyaWFuY2UuCiAgLy8vCiAgLy8vIFJldHVybnMgdGhlICJhcyIgY2hlY2sgaWYgaXQgd2FzIGFkZGVkOyBvdGhlcndpc2UgcmV0dXJucyB0aGUgb3JpZ2luYWwKICAvLy8gZXhwcmVzc2lvbi4KICBFeHByZXNzaW9uIGhhbmRsZVByb3BlcnR5R2V0Q29udHJhdmFyaWFuY2UoCiAgICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIsCiAgICAgIE9iamVjdCBpbnRlcmZhY2VNZW1iZXIsCiAgICAgIFByb3BlcnR5R2V0IGRlc3VnYXJlZEdldCwKICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uLAogICAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGUsCiAgICAgIGludCBmaWxlT2Zmc2V0KSB7CiAgICBib29sIGNoZWNrUmV0dXJuID0gZmFsc2U7CiAgICBpZiAocmVjZWl2ZXIgIT0gbnVsbCAmJgogICAgICAgIGludGVyZmFjZU1lbWJlciAhPSBudWxsICYmCiAgICAgICAgcmVjZWl2ZXIgaXMhIFRoaXNFeHByZXNzaW9uKSB7CiAgICAgIGlmIChpbnRlcmZhY2VNZW1iZXIgaXMgUHJvY2VkdXJlKSB7CiAgICAgICAgY2hlY2tSZXR1cm4gPSB0eXBlUGFyYW1ldGVyc09jY3VyTmVnYXRpdmVseSgKICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzLAogICAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIuZnVuY3Rpb24ucmV0dXJuVHlwZSk7CiAgICAgIH0gZWxzZSBpZiAoaW50ZXJmYWNlTWVtYmVyIGlzIEZpZWxkKSB7CiAgICAgICAgY2hlY2tSZXR1cm4gPSB0eXBlUGFyYW1ldGVyc09jY3VyTmVnYXRpdmVseSgKICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzLCBpbnRlcmZhY2VNZW1iZXIudHlwZSk7CiAgICAgIH0KICAgIH0KICAgIHZhciByZXBsYWNlZEV4cHJlc3Npb24gPSBkZXN1Z2FyZWRHZXQgPz8gZXhwcmVzc2lvbjsKICAgIGlmIChjaGVja1JldHVybikgewogICAgICB2YXIgZXhwcmVzc2lvblRvUmVwbGFjZSA9IHJlcGxhY2VkRXhwcmVzc2lvbjsKICAgICAgdmFyIHBhcmVudCA9IGV4cHJlc3Npb25Ub1JlcGxhY2UucGFyZW50OwogICAgICByZXBsYWNlZEV4cHJlc3Npb24gPSBuZXcgQXNFeHByZXNzaW9uKGV4cHJlc3Npb25Ub1JlcGxhY2UsIGluZmVycmVkVHlwZSkKICAgICAgICAuLmlzVHlwZUVycm9yID0gdHJ1ZQogICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQoZXhwcmVzc2lvblRvUmVwbGFjZSwgcmVwbGFjZWRFeHByZXNzaW9uKTsKICAgIH0KICAgIGlmIChpbnN0cnVtZW50YXRpb24gIT0gbnVsbCAmJiBjaGVja1JldHVybikgewogICAgICBpbnN0cnVtZW50YXRpb24ucmVjb3JkKHVyaSwgZXhwcmVzc2lvbi5maWxlT2Zmc2V0LCAnY2hlY2tSZXR1cm4nLAogICAgICAgICAgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZShpbmZlcnJlZFR5cGUpKTsKICAgIH0KICAgIHJldHVybiByZXBsYWNlZEV4cHJlc3Npb247CiAgfQoKICAvLy8gTW9kaWZpZXMgYSB0eXBlIGFzIGFwcHJvcHJpYXRlIHdoZW4gaW5mZXJyaW5nIGEgZGVjbGFyZWQgdmFyaWFibGUncyB0eXBlLgogIERhcnRUeXBlIGluZmVyRGVjbGFyYXRpb25UeXBlKERhcnRUeXBlIGluaXRpYWxpemVyVHlwZSkgewogICAgaWYgKGluaXRpYWxpemVyVHlwZSBpcyBCb3R0b21UeXBlIHx8CiAgICAgICAgKGluaXRpYWxpemVyVHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgICAgIGluaXRpYWxpemVyVHlwZS5jbGFzc05vZGUgPT0gY29yZVR5cGVzLm51bGxDbGFzcykpIHsKICAgICAgLy8gSWYgdGhlIGluaXRpYWxpemVyIHR5cGUgaXMgTnVsbCBvciBib3R0b20sIHRoZSBpbmZlcnJlZCB0eXBlIGlzCiAgICAgIC8vIGR5bmFtaWMuCiAgICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogdGhpcyBydWxlIGlzIGluaGVyaXRlZCBmcm9tIGFuYWx5emVyIGJlaGF2aW9yIGJ1dCBpcwogICAgICAvLyBub3Qgc3BlYydlZCBhbnl3aGVyZS4KICAgICAgcmV0dXJuIGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICB9CiAgICByZXR1cm4gaW5pdGlhbGl6ZXJUeXBlOwogIH0KCiAgLy8vIFBlcmZvcm1zIHR5cGUgaW5mZXJlbmNlIG9uIHRoZSBnaXZlbiBbZXhwcmVzc2lvbl0uCiAgLy8vCiAgLy8vIFt0eXBlQ29udGV4dF0gaXMgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24sIGJhc2VkIG9uIHN1cnJvdW5kaW5nCiAgLy8vIGNvZGUuICBbdHlwZU5lZWRlZF0gaW5kaWNhdGVzIHdoZXRoZXIgaXQgaXMgbmVjZXNzYXJ5IHRvIGNvbXB1dGUgdGhlCiAgLy8vIGFjdHVhbCB0eXBlIG9mIHRoZSBleHByZXNzaW9uLiAgSWYgW3R5cGVOZWVkZWRdIGlzIGB0cnVlYCwgdGhlIGFjdHVhbCB0eXBlCiAgLy8vIG9mIHRoZSBleHByZXNzaW9uIGlzIHJldHVybmVkOyBvdGhlcndpc2UgYG51bGxgIGlzIHJldHVybmVkLgogIC8vLwogIC8vLyBEZXJpdmVkIGNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHdpdGggbG9naWMgdGhhdCBkaXNwYXRjaGVzIG9uCiAgLy8vIHRoZSBleHByZXNzaW9uIHR5cGUgYW5kIGNhbGxzIHRoZSBhcHByb3ByaWF0ZSBzcGVjaWFsaXplZCAiaW5mZXIiIG1ldGhvZC4KICBEYXJ0VHlwZSBpbmZlckV4cHJlc3Npb24oCiAgICAgIGtlcm5lbC5FeHByZXNzaW9uIGV4cHJlc3Npb24sIERhcnRUeXBlIHR5cGVDb250ZXh0LCBib29sIHR5cGVOZWVkZWQsCiAgICAgIHtib29sIGlzVm9pZEFsbG93ZWR9KTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBpbmZlckZpZWxkSW5pdGlhbGl6ZXIoCiAgICBJbmZlcmVuY2VIZWxwZXIgaGVscGVyLAogICAgRGFydFR5cGUgY29udGV4dCwKICAgIGtlcm5lbC5FeHByZXNzaW9uIGluaXRpYWxpemVyLAogICkgewogICAgYXNzZXJ0KGNsb3N1cmVDb250ZXh0ID09IG51bGwpOwogICAgYXNzZXJ0KCFpc1RvcExldmVsKTsKICAgIHRoaXMuaGVscGVyID0gaGVscGVyOwogICAgdmFyIGFjdHVhbFR5cGUgPQogICAgICAgIGluZmVyRXhwcmVzc2lvbihpbml0aWFsaXplciwgY29udGV4dCwgdHJ1ZSwgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICBlbnN1cmVBc3NpZ25hYmxlKGNvbnRleHQsIGFjdHVhbFR5cGUsIGluaXRpYWxpemVyLCBpbml0aWFsaXplci5maWxlT2Zmc2V0LAogICAgICAgIGlzVm9pZEFsbG93ZWQ6IGNvbnRleHQgaXMgVm9pZFR5cGUpOwogICAgdGhpcy5oZWxwZXIgPSBudWxsOwogIH0KCiAgLy8vIFBlcmZvcm1zIHR5cGUgaW5mZXJlbmNlIG9uIHRoZSBnaXZlbiBbZmllbGRdJ3MgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbi4KICAvLy8KICAvLy8gRGVyaXZlZCBjbGFzc2VzIHNob3VsZCBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIHRoYXQgY2FsbHMKICAvLy8gW2luZmVyRXhwcmVzc2lvbl0gZm9yIHRoZSBnaXZlbiBbZmllbGRdJ3MgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbi4KICBEYXJ0VHlwZSBpbmZlckZpZWxkVG9wTGV2ZWwoU2hhZG93RmllbGQgZmllbGQpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGluZmVyRnVuY3Rpb25Cb2R5KEluZmVyZW5jZUhlbHBlciBoZWxwZXIsIERhcnRUeXBlIHJldHVyblR5cGUsCiAgICAgIEFzeW5jTWFya2VyIGFzeW5jTWFya2VyLCBTdGF0ZW1lbnQgYm9keSkgewogICAgYXNzZXJ0KGNsb3N1cmVDb250ZXh0ID09IG51bGwpOwogICAgdGhpcy5oZWxwZXIgPSBoZWxwZXI7CiAgICBjbG9zdXJlQ29udGV4dCA9IG5ldyBDbG9zdXJlQ29udGV4dCh0aGlzLCBhc3luY01hcmtlciwgcmV0dXJuVHlwZSwgZmFsc2UpOwogICAgaW5mZXJTdGF0ZW1lbnQoYm9keSk7CiAgICBjbG9zdXJlQ29udGV4dCA9IG51bGw7CiAgICB0aGlzLmhlbHBlciA9IG51bGw7CiAgfQoKICAvLy8gUGVyZm9ybXMgdGhlIHR5cGUgaW5mZXJlbmNlIHN0ZXBzIHRoYXQgYXJlIHNoYXJlZCBieSBhbGwga2luZHMgb2YKICAvLy8gaW52b2NhdGlvbnMgKGNvbnN0cnVjdG9ycywgaW5zdGFuY2UgbWV0aG9kcywgYW5kIHN0YXRpYyBtZXRob2RzKS4KICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGluZmVySW52b2NhdGlvbihEYXJ0VHlwZSB0eXBlQ29udGV4dCwgaW50IG9mZnNldCwKICAgICAgRnVuY3Rpb25UeXBlIGNhbGxlZVR5cGUsIERhcnRUeXBlIHJldHVyblR5cGUsIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIHtib29sIGlzT3ZlcmxvYWRlZEFyaXRobWV0aWNPcGVyYXRvcjogZmFsc2UsCiAgICAgIERhcnRUeXBlIHJlY2VpdmVyVHlwZSwKICAgICAgYm9vbCBza2lwVHlwZUFyZ3VtZW50SW5mZXJlbmNlOiBmYWxzZSwKICAgICAgYm9vbCBpc0NvbnN0OiBmYWxzZX0pIHsKICAgIGxhc3RJbmZlcnJlZFN1YnN0aXR1dGlvbiA9IG51bGw7CiAgICBsYXN0Q2FsbGVlVHlwZSA9IG51bGw7CiAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IGNhbGxlZVR5cGVQYXJhbWV0ZXJzID0gY2FsbGVlVHlwZS50eXBlUGFyYW1ldGVyczsKICAgIGlmIChjYWxsZWVUeXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCBvbmUgb2YgdGhlIGNhbGxlZSB0eXBlIHBhcmFtZXRlcnMgbWlnaHQgbWF0Y2ggYSB0eXBlCiAgICAgIC8vIHRoYXQgYWxyZWFkeSBleGlzdHMgYXMgcGFydCBvZiBpbmZlcmVuY2UgKGUuZy4gdGhlIHR5cGUgb2YgYW4KICAgICAgLy8gYXJndW1lbnQpLiAgVGhpcyBtaWdodCBoYXBwZW4sIGZvciBpbnN0YW5jZSwgaW4gdGhlIGNhc2Ugd2hlcmUgYQogICAgICAvLyBmdW5jdGlvbiBvciBtZXRob2QgbWFrZXMgYSByZWN1cnNpdmUgY2FsbCB0byBpdHNlbGYuICBUbyBhdm9pZCB0aGUKICAgICAgLy8gY2FsbGVlIHR5cGUgcGFyYW1ldGVycyBhY2NpZGVudGFsbHkgbWF0Y2hpbmcgYSB0eXBlIHRoYXQgYWxyZWFkeQogICAgICAvLyBleGlzdHMsIGFuZCBjcmVhdGluZyBpbnZhbGlkIGluZmVyZW5jZSByZXN1bHRzLCB3ZSBuZWVkIHRvIGNyZWF0ZSBmcmVzaAogICAgICAvLyB0eXBlIHBhcmFtZXRlcnMgZm9yIHRoZSBjYWxsZWUgKHNlZSBkYXJ0YnVnLmNvbS8zMTc1OSkuCiAgICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogaXMgaXQgcG9zc2libGUgdG8gZmluZCBhIG5hcnJvd2VyIHNldCBvZiBjaXJjdW1zdGFuY2VzCiAgICAgIC8vIGluIHdoaWNoIG1lIG11c3QgZG8gdGhpcywgdG8gYXZvaWQgYSBwZXJmb3JtYW5jZSByZWdyZXNzaW9uPwogICAgICB2YXIgZnJlc2ggPSBnZXRGcmVzaFR5cGVQYXJhbWV0ZXJzKGNhbGxlZVR5cGVQYXJhbWV0ZXJzKTsKICAgICAgY2FsbGVlVHlwZSA9IGZyZXNoLmFwcGx5VG9GdW5jdGlvblR5cGUoY2FsbGVlVHlwZSk7CiAgICAgIHJldHVyblR5cGUgPSBmcmVzaC5zdWJzdGl0dXRlKHJldHVyblR5cGUpOwogICAgICBjYWxsZWVUeXBlUGFyYW1ldGVycyA9IGZyZXNoLmZyZXNoVHlwZVBhcmFtZXRlcnM7CiAgICB9CiAgICBMaXN0PERhcnRUeXBlPiBleHBsaWNpdFR5cGVBcmd1bWVudHMgPSBnZXRFeHBsaWNpdFR5cGVBcmd1bWVudHMoYXJndW1lbnRzKTsKICAgIGJvb2wgaW5mZXJlbmNlTmVlZGVkID0gIXNraXBUeXBlQXJndW1lbnRJbmZlcmVuY2UgJiYKICAgICAgICBleHBsaWNpdFR5cGVBcmd1bWVudHMgPT0gbnVsbCAmJgogICAgICAgIGNhbGxlZVR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHk7CiAgICBib29sIHR5cGVDaGVja3NOZWVkZWQgPSAhaXNUb3BMZXZlbDsKICAgIExpc3Q8RGFydFR5cGU+IGluZmVycmVkVHlwZXM7CiAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uOwogICAgTGlzdDxEYXJ0VHlwZT4gZm9ybWFsVHlwZXM7CiAgICBMaXN0PERhcnRUeXBlPiBhY3R1YWxUeXBlczsKICAgIGlmIChpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCkgewogICAgICBmb3JtYWxUeXBlcyA9IFtdOwogICAgICBhY3R1YWxUeXBlcyA9IFtdOwogICAgfQogICAgaWYgKGluZmVyZW5jZU5lZWRlZCkgewogICAgICBpZiAoaXNDb25zdCAmJiB0eXBlQ29udGV4dCAhPSBudWxsKSB7CiAgICAgICAgdHlwZUNvbnRleHQgPQogICAgICAgICAgICBuZXcgVHlwZVZhcmlhYmxlRWxpbWluYXRvcihjb3JlVHlwZXMpLnN1YnN0aXR1dGVUeXBlKHR5cGVDb250ZXh0KTsKICAgICAgfQogICAgICBpbmZlcnJlZFR5cGVzID0gbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCgKICAgICAgICAgIGNhbGxlZVR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwgY29uc3QgVW5rbm93blR5cGUoKSk7CiAgICAgIHR5cGVTY2hlbWFFbnZpcm9ubWVudC5pbmZlckdlbmVyaWNGdW5jdGlvbk9yVHlwZShyZXR1cm5UeXBlLAogICAgICAgICAgY2FsbGVlVHlwZVBhcmFtZXRlcnMsIG51bGwsIG51bGwsIHR5cGVDb250ZXh0LCBpbmZlcnJlZFR5cGVzKTsKICAgICAgc3Vic3RpdHV0aW9uID0KICAgICAgICAgIFN1YnN0aXR1dGlvbi5mcm9tUGFpcnMoY2FsbGVlVHlwZVBhcmFtZXRlcnMsIGluZmVycmVkVHlwZXMpOwogICAgfSBlbHNlIGlmIChleHBsaWNpdFR5cGVBcmd1bWVudHMgIT0gbnVsbCAmJgogICAgICAgIGNhbGxlZVR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA9PSBleHBsaWNpdFR5cGVBcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgIHN1YnN0aXR1dGlvbiA9CiAgICAgICAgICBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKGNhbGxlZVR5cGVQYXJhbWV0ZXJzLCBleHBsaWNpdFR5cGVBcmd1bWVudHMpOwogICAgfSBlbHNlIGlmIChjYWxsZWVUeXBlUGFyYW1ldGVycy5sZW5ndGggIT0gMCkgewogICAgICBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKAogICAgICAgICAgY2FsbGVlVHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKAogICAgICAgICAgICAgIGNhbGxlZVR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwgY29uc3QgRHluYW1pY1R5cGUoKSkpOwogICAgfQogICAgLy8gVE9ETyhwYXVsYmVycnkpOiBpZiB3ZSBhcmUgZG9pbmcgdG9wIGxldmVsIGluZmVyZW5jZSBhbmQgdHlwZSBhcmd1bWVudHMKICAgIC8vIHdlcmUgb21pdHRlZCwgcmVwb3J0IGFuIGVycm9yLgogICAgaW50IGkgPSAwOwogICAgX2ZvckVhY2hBcmd1bWVudChhcmd1bWVudHMsIChuYW1lLCBleHByZXNzaW9uKSB7CiAgICAgIERhcnRUeXBlIGZvcm1hbFR5cGUgPSBuYW1lICE9IG51bGwKICAgICAgICAgID8gZ2V0TmFtZWRQYXJhbWV0ZXJUeXBlKGNhbGxlZVR5cGUsIG5hbWUpCiAgICAgICAgICA6IGdldFBvc2l0aW9uYWxQYXJhbWV0ZXJUeXBlKGNhbGxlZVR5cGUsIGkrKyk7CiAgICAgIERhcnRUeXBlIGluZmVycmVkRm9ybWFsVHlwZSA9IHN1YnN0aXR1dGlvbiAhPSBudWxsCiAgICAgICAgICA/IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShmb3JtYWxUeXBlKQogICAgICAgICAgOiBmb3JtYWxUeXBlOwogICAgICB2YXIgZXhwcmVzc2lvblR5cGUgPSBpbmZlckV4cHJlc3Npb24oCiAgICAgICAgICBleHByZXNzaW9uLAogICAgICAgICAgaW5mZXJyZWRGb3JtYWxUeXBlLAogICAgICAgICAgaW5mZXJlbmNlTmVlZGVkIHx8CiAgICAgICAgICAgICAgaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yIHx8CiAgICAgICAgICAgICAgdHlwZUNoZWNrc05lZWRlZCk7CiAgICAgIGlmIChpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCkgewogICAgICAgIGZvcm1hbFR5cGVzLmFkZChmb3JtYWxUeXBlKTsKICAgICAgICBhY3R1YWxUeXBlcy5hZGQoZXhwcmVzc2lvblR5cGUpOwogICAgICB9CiAgICAgIGlmIChpc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3IpIHsKICAgICAgICByZXR1cm5UeXBlID0gdHlwZVNjaGVtYUVudmlyb25tZW50LmdldFR5cGVPZk92ZXJsb2FkZWRBcml0aG1ldGljKAogICAgICAgICAgICByZWNlaXZlclR5cGUsIGV4cHJlc3Npb25UeXBlKTsKICAgICAgfQogICAgfSk7CgogICAgLy8gQ2hlY2sgZm9yIGFuZCByZW1vdmUgZHVwbGljYXRlZCBuYW1lZCBhcmd1bWVudHMuCiAgICB2YXIgbmFtZWQgPSBhcmd1bWVudHMubmFtZWQ7CiAgICBpZiAobmFtZWQubGVuZ3RoID09IDIpIHsKICAgICAgaWYgKG5hbWVkWzBdLm5hbWUgPT0gbmFtZWRbMV0ubmFtZSkgewogICAgICAgIHZhciBuYW1lID0gbmFtZWRbMV0ubmFtZTsKICAgICAgICB2YXIgZXJyb3IgPSBoZWxwZXIuZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkTmFtZWRBcmd1bWVudC53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICBuYW1lZFsxXS5maWxlT2Zmc2V0LAogICAgICAgICAgICBuYW1lLmxlbmd0aCkpOwogICAgICAgIGFyZ3VtZW50cy5uYW1lZCA9IFtuZXcga2VybmVsLk5hbWVkRXhwcmVzc2lvbihuYW1lZFsxXS5uYW1lLCBlcnJvcildOwogICAgICAgIGZvcm1hbFR5cGVzLnJlbW92ZUxhc3QoKTsKICAgICAgICBhY3R1YWxUeXBlcy5yZW1vdmVMYXN0KCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobmFtZWQubGVuZ3RoID4gMikgewogICAgICB2YXIgc2Vlbk5hbWVzID0gPFN0cmluZywga2VybmVsLk5hbWVkRXhwcmVzc2lvbj57fTsKICAgICAgdmFyIGhhc1Byb2JsZW0gPSBmYWxzZTsKICAgICAgdmFyIG5hbWVkVHlwZUluZGV4ID0gYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoOwogICAgICB2YXIgdW5pcXVlTmFtZWQgPSA8a2VybmVsLk5hbWVkRXhwcmVzc2lvbj5bXTsKICAgICAgZm9yICh2YXIgZXhwcmVzc2lvbiBpbiBuYW1lZCkgewogICAgICAgIHZhciBuYW1lID0gZXhwcmVzc2lvbi5uYW1lOwogICAgICAgIGlmIChzZWVuTmFtZXMuY29udGFpbnNLZXkobmFtZSkpIHsKICAgICAgICAgIGhhc1Byb2JsZW0gPSB0cnVlOwogICAgICAgICAgdmFyIHByZXZOYW1lZEV4cHJlc3Npb24gPSBzZWVuTmFtZXNbbmFtZV07CiAgICAgICAgICBwcmV2TmFtZWRFeHByZXNzaW9uLnZhbHVlID0gaGVscGVyLmRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKAogICAgICAgICAgICAgIGhlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZE5hbWVkQXJndW1lbnQud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgICBuYW1lLmxlbmd0aCkpCiAgICAgICAgICAgIC4ucGFyZW50ID0gcHJldk5hbWVkRXhwcmVzc2lvbjsKICAgICAgICAgIGZvcm1hbFR5cGVzLnJlbW92ZUF0KG5hbWVkVHlwZUluZGV4KTsKICAgICAgICAgIGFjdHVhbFR5cGVzLnJlbW92ZUF0KG5hbWVkVHlwZUluZGV4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2Vlbk5hbWVzW25hbWVdID0gZXhwcmVzc2lvbjsKICAgICAgICAgIHVuaXF1ZU5hbWVkLmFkZChleHByZXNzaW9uKTsKICAgICAgICAgIG5hbWVkVHlwZUluZGV4Kys7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChoYXNQcm9ibGVtKSB7CiAgICAgICAgYXJndW1lbnRzLm5hbWVkID0gdW5pcXVlTmFtZWQ7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoaW5mZXJlbmNlTmVlZGVkKSB7CiAgICAgIHR5cGVTY2hlbWFFbnZpcm9ubWVudC5pbmZlckdlbmVyaWNGdW5jdGlvbk9yVHlwZSgKICAgICAgICAgIHJldHVyblR5cGUsCiAgICAgICAgICBjYWxsZWVUeXBlUGFyYW1ldGVycywKICAgICAgICAgIGZvcm1hbFR5cGVzLAogICAgICAgICAgYWN0dWFsVHlwZXMsCiAgICAgICAgICB0eXBlQ29udGV4dCwKICAgICAgICAgIGluZmVycmVkVHlwZXMpOwogICAgICBzdWJzdGl0dXRpb24gPQogICAgICAgICAgU3Vic3RpdHV0aW9uLmZyb21QYWlycyhjYWxsZWVUeXBlUGFyYW1ldGVycywgaW5mZXJyZWRUeXBlcyk7CiAgICAgIGluc3RydW1lbnRhdGlvbj8ucmVjb3JkKHVyaSwgb2Zmc2V0LCAndHlwZUFyZ3MnLAogICAgICAgICAgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZUFyZ3MoaW5mZXJyZWRUeXBlcykpOwogICAgICBhcmd1bWVudHMudHlwZXMuY2xlYXIoKTsKICAgICAgYXJndW1lbnRzLnR5cGVzLmFkZEFsbChpbmZlcnJlZFR5cGVzKTsKICAgIH0KICAgIGlmICh0eXBlQ2hlY2tzTmVlZGVkICYmICFpZGVudGljYWwoY2FsbGVlVHlwZSwgdW5rbm93bkZ1bmN0aW9uKSkgewogICAgICBMb2NhdGVkTWVzc2FnZSBhcmdNZXNzYWdlID0KICAgICAgICAgIGhlbHBlci5jaGVja0FyZ3VtZW50c0ZvclR5cGUoY2FsbGVlVHlwZSwgYXJndW1lbnRzLCBvZmZzZXQpOwogICAgICBpZiAoYXJnTWVzc2FnZSAhPSBudWxsKSB7CiAgICAgICAgaGVscGVyLmFkZFByb2JsZW0oCiAgICAgICAgICAgIGFyZ01lc3NhZ2UubWVzc2FnZU9iamVjdCwgYXJnTWVzc2FnZS5jaGFyT2Zmc2V0LCBhcmdNZXNzYWdlLmxlbmd0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQXJndW1lbnQgY291bnRzIGFuZCBuYW1lcyBtYXRjaC4gQ29tcGFyZSB0eXBlcy4KICAgICAgICBpbnQgbnVtUG9zaXRpb25hbEFyZ3MgPSBhcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGg7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmb3JtYWxUeXBlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIGZvcm1hbFR5cGUgPSBmb3JtYWxUeXBlc1tpXTsKICAgICAgICAgIHZhciBleHBlY3RlZFR5cGUgPSBzdWJzdGl0dXRpb24gIT0gbnVsbAogICAgICAgICAgICAgID8gc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGZvcm1hbFR5cGUpCiAgICAgICAgICAgICAgOiBmb3JtYWxUeXBlOwogICAgICAgICAgdmFyIGFjdHVhbFR5cGUgPSBhY3R1YWxUeXBlc1tpXTsKICAgICAgICAgIHZhciBleHByZXNzaW9uID0gaSA8IG51bVBvc2l0aW9uYWxBcmdzCiAgICAgICAgICAgICAgPyBhcmd1bWVudHMucG9zaXRpb25hbFtpXQogICAgICAgICAgICAgIDogYXJndW1lbnRzLm5hbWVkW2kgLSBudW1Qb3NpdGlvbmFsQXJnc10udmFsdWU7CiAgICAgICAgICBlbnN1cmVBc3NpZ25hYmxlKAogICAgICAgICAgICAgIGV4cGVjdGVkVHlwZSwgYWN0dWFsVHlwZSwgZXhwcmVzc2lvbiwgZXhwcmVzc2lvbi5maWxlT2Zmc2V0LAogICAgICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IGV4cGVjdGVkVHlwZSBpcyBWb2lkVHlwZSwKICAgICAgICAgICAgICB0ZW1wbGF0ZTogdGVtcGxhdGVBcmd1bWVudFR5cGVOb3RBc3NpZ25hYmxlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIERhcnRUeXBlIGluZmVycmVkVHlwZTsKICAgIGxhc3RJbmZlcnJlZFN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbjsKICAgIGxhc3RDYWxsZWVUeXBlID0gY2FsbGVlVHlwZTsKICAgIGluZmVycmVkVHlwZSA9IHN1YnN0aXR1dGlvbiA9PSBudWxsCiAgICAgICAgPyByZXR1cm5UeXBlCiAgICAgICAgOiBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUocmV0dXJuVHlwZSk7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQobnVsbCwgaW5mZXJyZWRUeXBlKTsKICB9CgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgaW5mZXJMb2NhbEZ1bmN0aW9uKEZ1bmN0aW9uTm9kZSBmdW5jdGlvbiwKICAgICAgRGFydFR5cGUgdHlwZUNvbnRleHQsIGludCBmaWxlT2Zmc2V0LCBEYXJ0VHlwZSByZXR1cm5Db250ZXh0KSB7CiAgICBib29sIGhhc0ltcGxpY2l0UmV0dXJuVHlwZSA9IGZhbHNlOwogICAgaWYgKHJldHVybkNvbnRleHQgPT0gbnVsbCkgewogICAgICBoYXNJbXBsaWNpdFJldHVyblR5cGUgPSB0cnVlOwogICAgICByZXR1cm5Db250ZXh0ID0gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIH0KICAgIGlmICghaXNUb3BMZXZlbCkgewogICAgICB2YXIgcG9zaXRpb25hbFBhcmFtZXRlcnMgPSBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyczsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBwYXJhbWV0ZXIgPSBwb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICAgICAgICBpbmZlck1ldGFkYXRhS2VlcGluZ0hlbHBlcihwYXJhbWV0ZXIuYW5ub3RhdGlvbnMpOwogICAgICAgIGlmIChwYXJhbWV0ZXIuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgaW5mZXJFeHByZXNzaW9uKHBhcmFtZXRlci5pbml0aWFsaXplciwgcGFyYW1ldGVyLnR5cGUsICFpc1RvcExldmVsKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yICh2YXIgcGFyYW1ldGVyIGluIGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycykgewogICAgICAgIGluZmVyTWV0YWRhdGFLZWVwaW5nSGVscGVyKHBhcmFtZXRlci5hbm5vdGF0aW9ucyk7CiAgICAgICAgaW5mZXJFeHByZXNzaW9uKHBhcmFtZXRlci5pbml0aWFsaXplciwgcGFyYW1ldGVyLnR5cGUsICFpc1RvcExldmVsKTsKICAgICAgfQogICAgfQoKICAgIC8vIExldCBgPFQwLCAuLi4sIFRuPmAgYmUgdGhlIHNldCBvZiB0eXBlIHBhcmFtZXRlcnMgb2YgdGhlIGNsb3N1cmUgKHdpdGgKICAgIC8vIGBuYD0wIGlmIHRoZXJlIGFyZSBubyB0eXBlIHBhcmFtZXRlcnMpLgogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyA9IGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzOwoKICAgIC8vIExldCBgKFAwIHgwLCAuLi4sIFBtIHhtKWAgYmUgdGhlIHNldCBvZiBmb3JtYWwgcGFyYW1ldGVycyBvZiB0aGUgY2xvc3VyZQogICAgLy8gKGluY2x1ZGluZyByZXF1aXJlZCwgcG9zaXRpb25hbCBvcHRpb25hbCwgYW5kIG5hbWVkIG9wdGlvbmFsIHBhcmFtZXRlcnMpLgogICAgLy8gSWYgYW55IHR5cGUgYFBpYCBpcyBtaXNzaW5nLCBkZW5vdGUgaXQgYXMgYF9gLgogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBmb3JtYWxzID0gZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMudG9MaXN0KCkKICAgICAgLi5hZGRBbGwoZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzKTsKCiAgICAvLyBMZXQgYEJgIGRlbm90ZSB0aGUgY2xvc3VyZSBib2R5LiAgSWYgYEJgIGlzIGFuIGV4cHJlc3Npb24gZnVuY3Rpb24gYm9keQogICAgLy8gKGA9PiBlYCksIHRyZWF0IGl0IGFzIGVxdWl2YWxlbnQgdG8gYSBibG9jayBmdW5jdGlvbiBib2R5IGNvbnRhaW5pbmcgYQogICAgLy8gc2luZ2xlIGByZXR1cm5gIHN0YXRlbWVudCAoYHsgcmV0dXJuIGU7IH1gKS4KCiAgICAvLyBBdHRlbXB0IHRvIG1hdGNoIGBLYCBhcyBhIGZ1bmN0aW9uIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSBjbG9zdXJlICh0aGF0CiAgICAvLyBpcywgb25lIGhhdmluZyBuIHR5cGUgcGFyYW1ldGVycyBhbmQgYSBjb21wYXRpYmxlIHNldCBvZiBmb3JtYWwKICAgIC8vIHBhcmFtZXRlcnMpLiAgSWYgdGhlcmUgaXMgYSBzdWNjZXNzZnVsIG1hdGNoLCBsZXQgYDxTMCwgLi4uLCBTbj5gIGJlIHRoZQogICAgLy8gc2V0IG9mIG1hdGNoZWQgdHlwZSBwYXJhbWV0ZXJzIGFuZCBgKFEwLCAuLi4sIFFtKWAgYmUgdGhlIHNldCBvZiBtYXRjaGVkCiAgICAvLyBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgbGV0IGBOYCBiZSB0aGUgcmV0dXJuIHR5cGUuCiAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uOwogICAgTGlzdDxEYXJ0VHlwZT4gZm9ybWFsVHlwZXNGcm9tQ29udGV4dCA9CiAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZChmb3JtYWxzLmxlbmd0aCwgbnVsbCk7CiAgICBpZiAodHlwZUNvbnRleHQgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm9ybWFscy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChpIDwgZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgICAgICBmb3JtYWxUeXBlc0Zyb21Db250ZXh0W2ldID0KICAgICAgICAgICAgICBnZXRQb3NpdGlvbmFsUGFyYW1ldGVyVHlwZSh0eXBlQ29udGV4dCwgaSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZvcm1hbFR5cGVzRnJvbUNvbnRleHRbaV0gPQogICAgICAgICAgICAgIGdldE5hbWVkUGFyYW1ldGVyVHlwZSh0eXBlQ29udGV4dCwgZm9ybWFsc1tpXS5uYW1lKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuQ29udGV4dCA9IHR5cGVDb250ZXh0LnJldHVyblR5cGU7CgogICAgICAvLyBMZXQgYFtUL1NdYCBkZW5vdGUgdGhlIHR5cGUgc3Vic3RpdHV0aW9uIHdoZXJlIGVhY2ggYFNpYCBpcyByZXBsYWNlZAogICAgICAvLyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGBUaWAuCiAgICAgIHZhciBzdWJzdGl0dXRpb25NYXAgPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUNvbnRleHQudHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBzdWJzdGl0dXRpb25NYXBbdHlwZUNvbnRleHQudHlwZVBhcmFtZXRlcnNbaV1dID0KICAgICAgICAgICAgaSA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aAogICAgICAgICAgICAgICAgPyBuZXcgVHlwZVBhcmFtZXRlclR5cGUodHlwZVBhcmFtZXRlcnNbaV0pCiAgICAgICAgICAgICAgICA6IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgIH0KICAgICAgc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21NYXAoc3Vic3RpdHV0aW9uTWFwKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIElmIHRoZSBtYXRjaCBpcyBub3Qgc3VjY2Vzc2Z1bCBiZWNhdXNlICBgS2AgaXMgYF9gLCBsZXQgYWxsIGBTaWAsIGFsbAogICAgICAvLyBgUWlgLCBhbmQgYE5gIGFsbCBiZSBgX2AuCgogICAgICAvLyBJZiB0aGUgbWF0Y2ggaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIGFueSBvdGhlciByZWFzb24sIHRoaXMgd2lsbCByZXN1bHQKICAgICAgLy8gaW4gYSB0eXBlIGVycm9yLCBzbyB0aGUgaW1wbGVtZW50YXRpb24gaXMgZnJlZSB0byBjaG9vc2UgdGhlIGJlc3QKICAgICAgLy8gZXJyb3IgcmVjb3ZlcnkgcGF0aC4KICAgICAgc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmVtcHR5OwogICAgfQoKICAgIC8vIERlZmluZSBgUmlgIGFzIGZvbGxvd3M6IGlmIGBQaWAgaXMgbm90IGBfYCwgbGV0IGBSaWAgYmUgYFBpYC4KICAgIC8vIE90aGVyd2lzZSwgaWYgYFFpYCBpcyBub3QgYF9gLCBsZXQgYFJpYCBiZSB0aGUgZ3JlYXRlc3QgY2xvc3VyZSBvZgogICAgLy8gYFFpW1QvU11gIHdpdGggcmVzcGVjdCB0byBgP2AuICBPdGhlcndpc2UsIGxldCBgUmlgIGJlIGBkeW5hbWljYC4KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm9ybWFscy5sZW5ndGg7IGkrKykgewogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQgZm9ybWFsID0gZm9ybWFsc1tpXTsKICAgICAgaWYgKFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudC5pc0ltcGxpY2l0bHlUeXBlZChmb3JtYWwpKSB7CiAgICAgICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlOwogICAgICAgIGlmIChmb3JtYWxUeXBlc0Zyb21Db250ZXh0W2ldID09IGNvcmVUeXBlcy5udWxsQ2xhc3MucmF3VHlwZSkgewogICAgICAgICAgaW5mZXJyZWRUeXBlID0gY29yZVR5cGVzLm9iamVjdENsYXNzLnJhd1R5cGU7CiAgICAgICAgfSBlbHNlIGlmIChmb3JtYWxUeXBlc0Zyb21Db250ZXh0W2ldICE9IG51bGwpIHsKICAgICAgICAgIGluZmVycmVkVHlwZSA9IGdyZWF0ZXN0Q2xvc3VyZShjb3JlVHlwZXMsCiAgICAgICAgICAgICAgc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGZvcm1hbFR5cGVzRnJvbUNvbnRleHRbaV0pKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5mZXJyZWRUeXBlID0gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgICAgICB9CiAgICAgICAgaW5zdHJ1bWVudGF0aW9uPy5yZWNvcmQodXJpLCBmb3JtYWwuZmlsZU9mZnNldCwgJ3R5cGUnLAogICAgICAgICAgICBuZXcgSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JUeXBlKGluZmVycmVkVHlwZSkpOwogICAgICAgIGZvcm1hbC50eXBlID0gaW5mZXJyZWRUeXBlOwogICAgICB9CiAgICB9CgogICAgLy8gTGV0IGBOJ2AgYmUgYE5bVC9TXWAuICBUaGUgW0Nsb3N1cmVDb250ZXh0XSBjb25zdHJ1Y3RvciB3aWxsIGFkanVzdAogICAgLy8gYWNjb3JkaW5nbHkgaWYgdGhlIGNsb3N1cmUgaXMgZGVjbGFyZWQgd2l0aCBgYXN5bmNgLCBgYXN5bmMqYCwgb3IKICAgIC8vIGBzeW5jKmAuCiAgICByZXR1cm5Db250ZXh0ID0gc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKHJldHVybkNvbnRleHQpOwoKICAgIC8vIEFwcGx5IHR5cGUgaW5mZXJlbmNlIHRvIGBCYCBpbiByZXR1cm4gY29udGV4dCBgTuKAmWAsIHdpdGggYW55IHJlZmVyZW5jZXMKICAgIC8vIHRvIGB4aWAgaW4gYEJgIGhhdmluZyB0eXBlIGBQaWAuICBUaGlzIHByb2R1Y2VzIGBC4oCZYC4KICAgIGJvb2wgbmVlZFRvU2V0UmV0dXJuVHlwZSA9IGhhc0ltcGxpY2l0UmV0dXJuVHlwZTsKICAgIENsb3N1cmVDb250ZXh0IG9sZENsb3N1cmVDb250ZXh0ID0gdGhpcy5jbG9zdXJlQ29udGV4dDsKICAgIENsb3N1cmVDb250ZXh0IGNsb3N1cmVDb250ZXh0ID0gbmV3IENsb3N1cmVDb250ZXh0KAogICAgICAgIHRoaXMsIGZ1bmN0aW9uLmFzeW5jTWFya2VyLCByZXR1cm5Db250ZXh0LCBuZWVkVG9TZXRSZXR1cm5UeXBlKTsKICAgIHRoaXMuY2xvc3VyZUNvbnRleHQgPSBjbG9zdXJlQ29udGV4dDsKICAgIGluZmVyU3RhdGVtZW50KGZ1bmN0aW9uLmJvZHkpOwoKICAgIC8vIElmIHRoZSBjbG9zdXJlIGlzIGRlY2xhcmVkIHdpdGggYGFzeW5jKmAgb3IgYHN5bmMqYCwgbGV0IGBNYCBiZSB0aGUKICAgIC8vIGxlYXN0IHVwcGVyIGJvdW5kIG9mIHRoZSB0eXBlcyBvZiB0aGUgYHlpZWxkYCBleHByZXNzaW9ucyBpbiBgQuKAmWAsIG9yCiAgICAvLyBgdm9pZGAgaWYgYELigJlgIGNvbnRhaW5zIG5vIGB5aWVsZGAgZXhwcmVzc2lvbnMuICBPdGhlcndpc2UsIGxldCBgTWAgYmUKICAgIC8vIHRoZSBsZWFzdCB1cHBlciBib3VuZCBvZiB0aGUgdHlwZXMgb2YgdGhlIGByZXR1cm5gIGV4cHJlc3Npb25zIGluIGBC4oCZYCwKICAgIC8vIG9yIGB2b2lkYCBpZiBgQuKAmWAgY29udGFpbnMgbm8gYHJldHVybmAgZXhwcmVzc2lvbnMuCiAgICBEYXJ0VHlwZSBpbmZlcnJlZFJldHVyblR5cGU7CiAgICBpZiAobmVlZFRvU2V0UmV0dXJuVHlwZSkgewogICAgICBpbmZlcnJlZFJldHVyblR5cGUgPSBjbG9zdXJlQ29udGV4dC5pbmZlclJldHVyblR5cGUodGhpcyk7CiAgICB9CgogICAgLy8gVGhlbiB0aGUgcmVzdWx0IG9mIGluZmVyZW5jZSBpcyBgPFQwLCAuLi4sIFRuPihSMCB4MCwgLi4uLCBSbiB4bikgQmAgd2l0aAogICAgLy8gdHlwZSBgPFQwLCAuLi4sIFRuPihSMCwgLi4uLCBSbikgLT4gTeKAmWAgKHdpdGggc29tZSBvZiB0aGUgYFJpYCBhbmQgYHhpYAogICAgLy8gZGVub3RlZCBhcyBvcHRpb25hbCBvciBuYW1lZCBwYXJhbWV0ZXJzLCBpZiBhcHByb3ByaWF0ZSkuCiAgICBpZiAobmVlZFRvU2V0UmV0dXJuVHlwZSkgewogICAgICBpbnN0cnVtZW50YXRpb24/LnJlY29yZCh1cmksIGZpbGVPZmZzZXQsICdyZXR1cm5UeXBlJywKICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGUoaW5mZXJyZWRSZXR1cm5UeXBlKSk7CiAgICAgIGZ1bmN0aW9uLnJldHVyblR5cGUgPSBpbmZlcnJlZFJldHVyblR5cGU7CiAgICB9CiAgICB0aGlzLmNsb3N1cmVDb250ZXh0ID0gb2xkQ2xvc3VyZUNvbnRleHQ7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQobnVsbCwgZnVuY3Rpb24uZnVuY3Rpb25UeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaW5mZXJNZXRhZGF0YSgKICAgICAgSW5mZXJlbmNlSGVscGVyIGhlbHBlciwgTGlzdDxrZXJuZWwuRXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMpIHsKICAgIGlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CiAgICAgIHRoaXMuaGVscGVyID0gaGVscGVyOwogICAgICBpbmZlck1ldGFkYXRhS2VlcGluZ0hlbHBlcihhbm5vdGF0aW9ucyk7CiAgICAgIHRoaXMuaGVscGVyID0gbnVsbDsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaW5mZXJNZXRhZGF0YUtlZXBpbmdIZWxwZXIoTGlzdDxrZXJuZWwuRXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMpIHsKICAgIGlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CiAgICAgIC8vIFBsYWNlIGFubm90YXRpb25zIGluIGEgdGVtcG9yYXJ5IGxpc3QgbGl0ZXJhbCBzbyB0aGF0IHRoZXkgd2lsbCBoYXZlIGEKICAgICAgLy8gcGFyZW50LiAgVGhpcyBpcyBuZWNlc3NhcnkgaW4gY2FzZSBhbnkgb2YgdGhlIGFubm90YXRpb25zIG5lZWQgdG8gZ2V0CiAgICAgIC8vIHJlcGxhY2VkIGR1cmluZyB0eXBlIGluZmVyZW5jZS4KICAgICAgdmFyIHBhcmVudHMgPSBhbm5vdGF0aW9ucy5tYXAoKGUpID0+IGUucGFyZW50KS50b0xpc3QoKTsKICAgICAgbmV3IExpc3RMaXRlcmFsKGFubm90YXRpb25zKTsKICAgICAgZm9yICh2YXIgYW5ub3RhdGlvbiBpbiBhbm5vdGF0aW9ucykgewogICAgICAgIGluZmVyRXhwcmVzc2lvbihhbm5vdGF0aW9uLCBjb25zdCBVbmtub3duVHlwZSgpLCAhaXNUb3BMZXZlbCk7CiAgICAgIH0KICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9ucy5sZW5ndGg7ICsraSkgewogICAgICAgIGFubm90YXRpb25zW2ldLnBhcmVudCA9IHBhcmVudHNbaV07CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBQZXJmb3JtcyB0aGUgY29yZSB0eXBlIGluZmVyZW5jZSBhbGdvcml0aG0gZm9yIG1ldGhvZCBpbnZvY2F0aW9ucyAodGhpcwogIC8vLyBoYW5kbGVzIGJvdGggbnVsbC1hd2FyZSBhbmQgbm9uLW51bGwtYXdhcmUgbWV0aG9kIGludm9jYXRpb25zKS4KICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGluZmVyTWV0aG9kSW52b2NhdGlvbigKICAgICAga2VybmVsLkV4cHJlc3Npb24gZXhwcmVzc2lvbiwKICAgICAga2VybmVsLkV4cHJlc3Npb24gcmVjZWl2ZXIsCiAgICAgIGludCBmaWxlT2Zmc2V0LAogICAgICBib29sIGlzSW1wbGljaXRDYWxsLAogICAgICBEYXJ0VHlwZSB0eXBlQ29udGV4dCwKICAgICAge1ZhcmlhYmxlRGVjbGFyYXRpb24gcmVjZWl2ZXJWYXJpYWJsZSwKICAgICAgTWV0aG9kSW52b2NhdGlvbiBkZXN1Z2FyZWRJbnZvY2F0aW9uLAogICAgICBPYmplY3QgaW50ZXJmYWNlTWVtYmVyLAogICAgICBOYW1lIG1ldGhvZE5hbWUsCiAgICAgIEFyZ3VtZW50cyBhcmd1bWVudHN9KSB7CiAgICAvLyBGaXJzdCBpbmZlciB0aGUgcmVjZWl2ZXIgc28gd2UgY2FuIGxvb2sgdXAgdGhlIG1ldGhvZCB0aGF0IHdhcyBpbnZva2VkLgogICAgdmFyIHJlY2VpdmVyVHlwZSA9IHJlY2VpdmVyID09IG51bGwKICAgICAgICA/IHRoaXNUeXBlCiAgICAgICAgOiBpbmZlckV4cHJlc3Npb24ocmVjZWl2ZXIsIGNvbnN0IFVua25vd25UeXBlKCksIHRydWUpOwogICAgcmVjZWl2ZXJWYXJpYWJsZT8udHlwZSA9IHJlY2VpdmVyVHlwZTsKICAgIGlmIChkZXN1Z2FyZWRJbnZvY2F0aW9uICE9IG51bGwpIHsKICAgICAgaW50ZXJmYWNlTWVtYmVyID0KICAgICAgICAgIGZpbmRNZXRob2RJbnZvY2F0aW9uTWVtYmVyKHJlY2VpdmVyVHlwZSwgZGVzdWdhcmVkSW52b2NhdGlvbik7CiAgICAgIG1ldGhvZE5hbWUgPSBkZXN1Z2FyZWRJbnZvY2F0aW9uLm5hbWU7CiAgICAgIGFyZ3VtZW50cyA9IGRlc3VnYXJlZEludm9jYXRpb24uYXJndW1lbnRzOwogICAgfQogICAgYm9vbCBpc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3IgPSBpbnRlcmZhY2VNZW1iZXIgaXMgUHJvY2VkdXJlICYmCiAgICAgICAgdHlwZVNjaGVtYUVudmlyb25tZW50LmlzT3ZlcmxvYWRlZEFyaXRobWV0aWNPcGVyYXRvckFuZFR5cGUoCiAgICAgICAgICAgIGludGVyZmFjZU1lbWJlciwgcmVjZWl2ZXJUeXBlKTsKICAgIHZhciBjYWxsZWVUeXBlID0gZ2V0Q2FsbGVlVHlwZShpbnRlcmZhY2VNZW1iZXIsIHJlY2VpdmVyVHlwZSk7CiAgICB2YXIgZnVuY3Rpb25UeXBlID0gZ2V0Q2FsbGVlRnVuY3Rpb25UeXBlKGNhbGxlZVR5cGUsICFpc0ltcGxpY2l0Q2FsbCk7CgogICAgaWYgKGludGVyZmFjZU1lbWJlciAhPSBudWxsICYmCiAgICAgICAgY2FsbGVlVHlwZSBpcyEgRHluYW1pY1R5cGUgJiYKICAgICAgICBjYWxsZWVUeXBlICE9IGNvcmVUeXBlcy5mdW5jdGlvbkNsYXNzLnJhd1R5cGUgJiYKICAgICAgICBpZGVudGljYWwoZnVuY3Rpb25UeXBlLCB1bmtub3duRnVuY3Rpb24pKSB7CiAgICAgIHZhciBwYXJlbnQgPSBleHByZXNzaW9uLnBhcmVudDsKICAgICAga2VybmVsLkV4cHJlc3Npb24gZXJyb3IgPSBoZWxwZXIud3JhcEluUHJvYmxlbShleHByZXNzaW9uLAogICAgICAgICAgdGVtcGxhdGVJbnZva2VOb25GdW5jdGlvbi53aXRoQXJndW1lbnRzKG1ldGhvZE5hbWUubmFtZSksIG5vTGVuZ3RoKTsKICAgICAgcGFyZW50Py5yZXBsYWNlQ2hpbGQoZXhwcmVzc2lvbiwgZXJyb3IpOwogICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQobnVsbCwgY29uc3QgRHluYW1pY1R5cGUoKSk7CiAgICB9CiAgICB2YXIgY2hlY2tLaW5kID0gcHJlQ2hlY2tJbnZvY2F0aW9uQ29udHJhdmFyaWFuY2UocmVjZWl2ZXIsIHJlY2VpdmVyVHlwZSwKICAgICAgICBpbnRlcmZhY2VNZW1iZXIsIGRlc3VnYXJlZEludm9jYXRpb24sIGFyZ3VtZW50cywgZXhwcmVzc2lvbik7CiAgICB2YXIgaW5mZXJlbmNlUmVzdWx0ID0gaW5mZXJJbnZvY2F0aW9uKHR5cGVDb250ZXh0LCBmaWxlT2Zmc2V0LCBmdW5jdGlvblR5cGUsCiAgICAgICAgZnVuY3Rpb25UeXBlLnJldHVyblR5cGUsIGFyZ3VtZW50cywKICAgICAgICBpc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3I6IGlzT3ZlcmxvYWRlZEFyaXRobWV0aWNPcGVyYXRvciwKICAgICAgICByZWNlaXZlclR5cGU6IHJlY2VpdmVyVHlwZSk7CiAgICB2YXIgaW5mZXJyZWRUeXBlID0gaW5mZXJlbmNlUmVzdWx0LnR5cGU7CiAgICBpZiAobWV0aG9kTmFtZS5uYW1lID09ICc9PScpIHsKICAgICAgaW5mZXJyZWRUeXBlID0gY29yZVR5cGVzLmJvb2xDbGFzcy5yYXdUeXBlOwogICAgfQogICAgaGFuZGxlSW52b2NhdGlvbkNvbnRyYXZhcmlhbmNlKGNoZWNrS2luZCwgZGVzdWdhcmVkSW52b2NhdGlvbiwgYXJndW1lbnRzLAogICAgICAgIGV4cHJlc3Npb24sIGluZmVycmVkVHlwZSwgZnVuY3Rpb25UeXBlLCBmaWxlT2Zmc2V0KTsKICAgIGlmICghaWRlbnRpY2FsKGludGVyZmFjZU1lbWJlciwgJ2NhbGwnKSkgewogICAgICBpZiAoaXNJbXBsaWNpdENhbGwgJiYKICAgICAgICAgIGludGVyZmFjZU1lbWJlciAhPSBudWxsICYmCiAgICAgICAgICAhKGludGVyZmFjZU1lbWJlciBpcyBQcm9jZWR1cmUgJiYKICAgICAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIua2luZCA9PSBQcm9jZWR1cmVLaW5kLk1ldGhvZCkgJiYKICAgICAgICAgIHJlY2VpdmVyVHlwZSBpcyEgRHluYW1pY1R5cGUgJiYKICAgICAgICAgIHJlY2VpdmVyVHlwZSAhPSB0eXBlU2NoZW1hRW52aXJvbm1lbnQucmF3RnVuY3Rpb25UeXBlKSB7CiAgICAgICAgdmFyIHBhcmVudCA9IGV4cHJlc3Npb24ucGFyZW50OwogICAgICAgIHZhciBlcnJvck5vZGUgPSBoZWxwZXIud3JhcEluUHJvYmxlbSgKICAgICAgICAgICAgZXhwcmVzc2lvbiwKICAgICAgICAgICAgdGVtcGxhdGVJbXBsaWNpdENhbGxPZk5vbk1ldGhvZC53aXRoQXJndW1lbnRzKHJlY2VpdmVyVHlwZSksCiAgICAgICAgICAgIG5vTGVuZ3RoKTsKICAgICAgICBwYXJlbnQ/LnJlcGxhY2VDaGlsZChleHByZXNzaW9uLCBlcnJvck5vZGUpOwogICAgICB9CiAgICB9CgogICAgLy8gSWYgW2FyZ3VtZW50c10gd2VyZSBpbmZlcnJlZCwgY2hlY2sgdGhlbS4KICAgIC8vIFRPRE8oZG1pdHJ5YXMpOiBGaWd1cmUgb3V0IHdoeSBbbGlicmFyeV0gaXMgc29tZXRpbWVzIG51bGwuCiAgICBpZiAobGlicmFyeSAhPSBudWxsKSB7CiAgICAgIC8vIFthY3R1YWxSZWNlaXZlclR5cGVdLCBbaW50ZXJmYWNlVGFyZ2V0XSwgYW5kIFthY3R1YWxNZXRob2ROYW1lXSBiZWxvdwogICAgICAvLyBhcmUgZm9yIGEgd29ya2Fyb3VuZCBmb3IgdGhlIGNhc2VzIGxpa2UgdGhlIGZvbGxvd2luZzoKICAgICAgLy8KICAgICAgLy8gICAgIGNsYXNzIEMxIHsgdmFyIGYgPSBuZXcgQzIoKTsgfQogICAgICAvLyAgICAgY2xhc3MgQzIgeyBpbnQgY2FsbDxYIGV4dGVuZHMgbnVtPihYIHgpID0+IDQyOyB9CiAgICAgIC8vICAgICBtYWluKCkgeyBDMSBjID0gbmV3IEMxKCk7IGMuZigiZm9vYmFyIik7IH0KICAgICAgRGFydFR5cGUgYWN0dWFsUmVjZWl2ZXJUeXBlOwogICAgICBNZW1iZXIgaW50ZXJmYWNlVGFyZ2V0OwogICAgICBOYW1lIGFjdHVhbE1ldGhvZE5hbWU7CiAgICAgIGlmIChjYWxsZWVUeXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICBhY3R1YWxSZWNlaXZlclR5cGUgPSBjYWxsZWVUeXBlOwogICAgICAgIGludGVyZmFjZVRhcmdldCA9IG51bGw7CiAgICAgICAgYWN0dWFsTWV0aG9kTmFtZSA9IGNhbGxOYW1lOwogICAgICB9IGVsc2UgewogICAgICAgIGFjdHVhbFJlY2VpdmVyVHlwZSA9IHJlY2VpdmVyVHlwZTsKICAgICAgICBpbnRlcmZhY2VUYXJnZXQgPSBpbnRlcmZhY2VNZW1iZXIgaXMgTWVtYmVyID8gaW50ZXJmYWNlTWVtYmVyIDogbnVsbDsKICAgICAgICBhY3R1YWxNZXRob2ROYW1lID0gbWV0aG9kTmFtZTsKICAgICAgfQogICAgICBsaWJyYXJ5LmNoZWNrQm91bmRzSW5NZXRob2RJbnZvY2F0aW9uKAogICAgICAgICAgYWN0dWFsUmVjZWl2ZXJUeXBlLAogICAgICAgICAgdHlwZVNjaGVtYUVudmlyb25tZW50LAogICAgICAgICAgY2xhc3NIaWVyYXJjaHksCiAgICAgICAgICB0aGlzLAogICAgICAgICAgYWN0dWFsTWV0aG9kTmFtZSwKICAgICAgICAgIGludGVyZmFjZVRhcmdldCwKICAgICAgICAgIGFyZ3VtZW50cywKICAgICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgICBpbmZlcnJlZDogZ2V0RXhwbGljaXRUeXBlQXJndW1lbnRzKGFyZ3VtZW50cykgPT0gbnVsbCk7CiAgICB9CgogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KG51bGwsIGluZmVycmVkVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGluZmVyUGFyYW1ldGVySW5pdGlhbGl6ZXIoSW5mZXJlbmNlSGVscGVyIGhlbHBlciwKICAgICAga2VybmVsLkV4cHJlc3Npb24gaW5pdGlhbGl6ZXIsIERhcnRUeXBlIGRlY2xhcmVkVHlwZSkgewogICAgYXNzZXJ0KGNsb3N1cmVDb250ZXh0ID09IG51bGwpOwogICAgdGhpcy5oZWxwZXIgPSBoZWxwZXI7CiAgICBhc3NlcnQoZGVjbGFyZWRUeXBlICE9IG51bGwpOwogICAgdmFyIGFjdHVhbFR5cGUgPSBpbmZlckV4cHJlc3Npb24oaW5pdGlhbGl6ZXIsIGRlY2xhcmVkVHlwZSwgdHJ1ZSk7CiAgICBlbnN1cmVBc3NpZ25hYmxlKAogICAgICAgIGRlY2xhcmVkVHlwZSwgYWN0dWFsVHlwZSwgaW5pdGlhbGl6ZXIsIGluaXRpYWxpemVyLmZpbGVPZmZzZXQpOwogICAgdGhpcy5oZWxwZXIgPSBudWxsOwogIH0KCiAgLy8vIFBlcmZvcm1zIHRoZSBjb3JlIHR5cGUgaW5mZXJlbmNlIGFsZ29yaXRobSBmb3IgcHJvcGVydHkgZ2V0cyAodGhpcyBoYW5kbGVzCiAgLy8vIGJvdGggbnVsbC1hd2FyZSBhbmQgbm9uLW51bGwtYXdhcmUgcHJvcGVydHkgZ2V0cykuCiAgdm9pZCBpbmZlclByb3BlcnR5R2V0KEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgRXhwcmVzc2lvbiByZWNlaXZlciwKICAgICAgaW50IGZpbGVPZmZzZXQsIERhcnRUeXBlIHR5cGVDb250ZXh0LAogICAgICB7VmFyaWFibGVEZWNsYXJhdGlvbiByZWNlaXZlclZhcmlhYmxlLAogICAgICBQcm9wZXJ0eUdldCBkZXN1Z2FyZWRHZXQsCiAgICAgIE9iamVjdCBpbnRlcmZhY2VNZW1iZXIsCiAgICAgIE5hbWUgcHJvcGVydHlOYW1lfSkgewogICAgLy8gRmlyc3QgaW5mZXIgdGhlIHJlY2VpdmVyIHNvIHdlIGNhbiBsb29rIHVwIHRoZSBnZXR0ZXIgdGhhdCB3YXMgaW52b2tlZC4KICAgIERhcnRUeXBlIHJlY2VpdmVyVHlwZTsKICAgIGlmIChyZWNlaXZlciA9PSBudWxsKSB7CiAgICAgIHJlY2VpdmVyVHlwZSA9IHRoaXNUeXBlOwogICAgfSBlbHNlIHsKICAgICAgaW5mZXJFeHByZXNzaW9uKHJlY2VpdmVyLCBjb25zdCBVbmtub3duVHlwZSgpLCB0cnVlKTsKICAgICAgcmVjZWl2ZXJUeXBlID0gZ2V0SW5mZXJyZWRUeXBlKHJlY2VpdmVyLCB0aGlzKTsKICAgIH0KICAgIHJlY2VpdmVyVmFyaWFibGU/LnR5cGUgPSByZWNlaXZlclR5cGU7CiAgICBwcm9wZXJ0eU5hbWUgPz89IGRlc3VnYXJlZEdldC5uYW1lOwogICAgaWYgKGRlc3VnYXJlZEdldCAhPSBudWxsKSB7CiAgICAgIGludGVyZmFjZU1lbWJlciA9IGZpbmRJbnRlcmZhY2VNZW1iZXIoCiAgICAgICAgICByZWNlaXZlclR5cGUsIHByb3BlcnR5TmFtZSwgZmlsZU9mZnNldCwKICAgICAgICAgIGVycm9yVGVtcGxhdGU6IHRlbXBsYXRlVW5kZWZpbmVkR2V0dGVyLAogICAgICAgICAgZXhwcmVzc2lvbjogZXhwcmVzc2lvbiwKICAgICAgICAgIHJlY2VpdmVyOiByZWNlaXZlcik7CiAgICAgIGlmIChpbnRlcmZhY2VNZW1iZXIgaXMgTWVtYmVyKSB7CiAgICAgICAgaWYgKGluc3RydW1lbnRhdGlvbiAhPSBudWxsICYmIHJlY2VpdmVyVHlwZSA9PSBjb25zdCBEeW5hbWljVHlwZSgpKSB7CiAgICAgICAgICBpbnN0cnVtZW50YXRpb24ucmVjb3JkKHVyaSwgZGVzdWdhcmVkR2V0LmZpbGVPZmZzZXQsICd0YXJnZXQnLAogICAgICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvck1lbWJlcihpbnRlcmZhY2VNZW1iZXIpKTsKICAgICAgICB9CiAgICAgICAgZGVzdWdhcmVkR2V0LmludGVyZmFjZVRhcmdldCA9IGludGVyZmFjZU1lbWJlcjsKICAgICAgfQogICAgfQogICAgdmFyIGluZmVycmVkVHlwZSA9IGdldENhbGxlZVR5cGUoaW50ZXJmYWNlTWVtYmVyLCByZWNlaXZlclR5cGUpOwogICAgdmFyIHJlcGxhY2VkRXhwcmVzc2lvbiA9IGhhbmRsZVByb3BlcnR5R2V0Q29udHJhdmFyaWFuY2UocmVjZWl2ZXIsCiAgICAgICAgaW50ZXJmYWNlTWVtYmVyLCBkZXN1Z2FyZWRHZXQsIGV4cHJlc3Npb24sIGluZmVycmVkVHlwZSwgZmlsZU9mZnNldCk7CiAgICBpZiAoKGludGVyZmFjZU1lbWJlciBpcyBQcm9jZWR1cmUgJiYKICAgICAgICBpbnRlcmZhY2VNZW1iZXIua2luZCA9PSBQcm9jZWR1cmVLaW5kLk1ldGhvZCkpIHsKICAgICAgaW5mZXJyZWRUeXBlID0KICAgICAgICAgIGluc3RhbnRpYXRlVGVhck9mZihpbmZlcnJlZFR5cGUsIHR5cGVDb250ZXh0LCByZXBsYWNlZEV4cHJlc3Npb24pOwogICAgfQogICAgc3RvcmVJbmZlcnJlZFR5cGUoZXhwcmVzc2lvbiwgaW5mZXJyZWRUeXBlKTsKICB9CgogIC8vLyBNb2RpZmllcyBhIHR5cGUgYXMgYXBwcm9wcmlhdGUgd2hlbiBpbmZlcnJpbmcgYSBjbG9zdXJlIHJldHVybiB0eXBlLgogIERhcnRUeXBlIGluZmVyUmV0dXJuVHlwZShEYXJ0VHlwZSByZXR1cm5UeXBlKSB7CiAgICByZXR1cm4gcmV0dXJuVHlwZSA/PyB0eXBlU2NoZW1hRW52aXJvbm1lbnQubnVsbFR5cGU7CiAgfQoKICAvLy8gUGVyZm9ybXMgdHlwZSBpbmZlcmVuY2Ugb24gdGhlIGdpdmVuIFtzdGF0ZW1lbnRdLgogIC8vLwogIC8vLyBEZXJpdmVkIGNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHdpdGggbG9naWMgdGhhdCBkaXNwYXRjaGVzIG9uCiAgLy8vIHRoZSBzdGF0ZW1lbnQgdHlwZSBhbmQgY2FsbHMgdGhlIGFwcHJvcHJpYXRlIHNwZWNpYWxpemVkICJpbmZlciIgbWV0aG9kLgogIHZvaWQgaW5mZXJTdGF0ZW1lbnQoU3RhdGVtZW50IHN0YXRlbWVudCk7CgogIC8vLyBQZXJmb3JtcyB0aGUgdHlwZSBpbmZlcmVuY2Ugc3RlcHMgbmVjZXNzYXJ5IHRvIGluc3RhbnRpYXRlIGEgdGVhci1vZmYKICAvLy8gKGlmIG5lY2Vzc2FyeSkuCiAgRGFydFR5cGUgaW5zdGFudGlhdGVUZWFyT2ZmKAogICAgICBEYXJ0VHlwZSB0ZWFyb2ZmVHlwZSwgRGFydFR5cGUgY29udGV4dCwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgICBpZiAodGVhcm9mZlR5cGUgaXMgRnVuY3Rpb25UeXBlICYmCiAgICAgICAgY29udGV4dCBpcyBGdW5jdGlvblR5cGUgJiYKICAgICAgICBjb250ZXh0LnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHsKICAgICAgdmFyIHR5cGVQYXJhbWV0ZXJzID0gdGVhcm9mZlR5cGUudHlwZVBhcmFtZXRlcnM7CiAgICAgIGlmICh0eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgICAgdmFyIGluZmVycmVkVHlwZXMgPSBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKAogICAgICAgICAgICB0eXBlUGFyYW1ldGVycy5sZW5ndGgsIGNvbnN0IFVua25vd25UeXBlKCkpOwogICAgICAgIHZhciBpbnN0YW50aWF0ZWRUeXBlID0gdGVhcm9mZlR5cGUud2l0aG91dFR5cGVQYXJhbWV0ZXJzOwogICAgICAgIHR5cGVTY2hlbWFFbnZpcm9ubWVudC5pbmZlckdlbmVyaWNGdW5jdGlvbk9yVHlwZSgKICAgICAgICAgICAgaW5zdGFudGlhdGVkVHlwZSwgdHlwZVBhcmFtZXRlcnMsIFtdLCBbXSwgY29udGV4dCwgaW5mZXJyZWRUeXBlcyk7CiAgICAgICAgaWYgKCFpc1RvcExldmVsKSB7CiAgICAgICAgICB2YXIgcGFyZW50ID0gZXhwcmVzc2lvbi5wYXJlbnQ7CiAgICAgICAgICBwYXJlbnQucmVwbGFjZUNoaWxkKAogICAgICAgICAgICAgIGV4cHJlc3Npb24sCiAgICAgICAgICAgICAgbmV3IEluc3RhbnRpYXRpb24oZXhwcmVzc2lvbiwgaW5mZXJyZWRUeXBlcykKICAgICAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGV4cHJlc3Npb24uZmlsZU9mZnNldCk7CiAgICAgICAgfQogICAgICAgIHZhciBzdWJzdGl0dXRpb24gPQogICAgICAgICAgICBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKHR5cGVQYXJhbWV0ZXJzLCBpbmZlcnJlZFR5cGVzKTsKICAgICAgICByZXR1cm4gc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGluc3RhbnRpYXRlZFR5cGUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGVhcm9mZlR5cGU7CiAgfQoKICAvLy8gVHJ1ZSBpZiBbdHlwZV0gaGFzIG5lZ2F0aXZlIG9jY3VycmVuY2VzIG9mIGFueSBvZiBbY2xhc3NfXSdzIHR5cGUKICAvLy8gcGFyYW1ldGVycy4KICAvLy8KICAvLy8gQSBuZWdhdGl2ZSBvY2N1cnJlbmNlIG9mIGEgdHlwZSBwYXJhbWV0ZXIgaXMgb25lIHRoYXQgaXMgdG8gdGhlIGxlZnQgb2YKICAvLy8gYW4gb2RkIG51bWJlciBvZiBhcnJvd3MuICBGb3IgZXhhbXBsZSwgVCBvY2N1cnMgbmVnYXRpdmVseSBpbiBUIC0+IFQwLAogIC8vLyBUMCAtPiAoVCAtPiBUMSksIChUMCAtPiBUKSAtPiBUMSBidXQgbm90IGluIChUIC0+IFQwKSAtPiBUMS4KICBzdGF0aWMgYm9vbCB0eXBlUGFyYW1ldGVyc09jY3VyTmVnYXRpdmVseShDbGFzcyBjbGFzc18sIERhcnRUeXBlIHR5cGUpIHsKICAgIGlmIChjbGFzc18udHlwZVBhcmFtZXRlcnMuaXNFbXB0eSkgcmV0dXJuIGZhbHNlOwogICAgdmFyIGNoZWNrZXIgPSBuZXcgSW5jbHVkZXNUeXBlUGFyYW1ldGVyc0NvdmFyaWFudGx5KGNsYXNzXy50eXBlUGFyYW1ldGVycykKICAgICAgLi5pbkNvdmFyaWFudENvbnRleHQgPSBmYWxzZTsKICAgIHJldHVybiB0eXBlLmFjY2VwdChjaGVja2VyKTsKICB9CgogIC8vLyBEZXRlcm1pbmVzIHRoZSBkaXNwYXRjaCBjYXRlZ29yeSBvZiBhIFtNZXRob2RJbnZvY2F0aW9uXSBhbmQgcmV0dXJucyBhCiAgLy8vIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGFuICJhcyIgY2hlY2sgd2lsbCBuZWVkIHRvIGJlIGFkZGVkIGR1ZSB0bwogIC8vLyBjb250cmF2YXJpYW5jZS4KICBNZXRob2RDb250cmF2YXJpYW5jZUNoZWNrS2luZCBwcmVDaGVja0ludm9jYXRpb25Db250cmF2YXJpYW5jZSgKICAgICAgRXhwcmVzc2lvbiByZWNlaXZlciwKICAgICAgRGFydFR5cGUgcmVjZWl2ZXJUeXBlLAogICAgICBPYmplY3QgaW50ZXJmYWNlTWVtYmVyLAogICAgICBNZXRob2RJbnZvY2F0aW9uIGRlc3VnYXJlZEludm9jYXRpb24sCiAgICAgIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogICAgaWYgKGludGVyZmFjZU1lbWJlciBpcyBGaWVsZCB8fAogICAgICAgIGludGVyZmFjZU1lbWJlciBpcyBQcm9jZWR1cmUgJiYKICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5HZXR0ZXIpIHsKICAgICAgdmFyIGdldFR5cGUgPSBnZXRDYWxsZWVUeXBlKGludGVyZmFjZU1lbWJlciwgcmVjZWl2ZXJUeXBlKTsKICAgICAgaWYgKGdldFR5cGUgaXMgRHluYW1pY1R5cGUpIHsKICAgICAgICByZXR1cm4gTWV0aG9kQ29udHJhdmFyaWFuY2VDaGVja0tpbmQubm9uZTsKICAgICAgfQogICAgICBpZiAocmVjZWl2ZXIgIT0gbnVsbCAmJiByZWNlaXZlciBpcyEgVGhpc0V4cHJlc3Npb24pIHsKICAgICAgICBpZiAoKGludGVyZmFjZU1lbWJlciBpcyBGaWVsZCAmJgogICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnNPY2N1ck5lZ2F0aXZlbHkoCiAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzLCBpbnRlcmZhY2VNZW1iZXIudHlwZSkpIHx8CiAgICAgICAgICAgIChpbnRlcmZhY2VNZW1iZXIgaXMgUHJvY2VkdXJlICYmCiAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyc09jY3VyTmVnYXRpdmVseShpbnRlcmZhY2VNZW1iZXIuZW5jbG9zaW5nQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmZ1bmN0aW9uLnJldHVyblR5cGUpKSkgewogICAgICAgICAgcmV0dXJuIE1ldGhvZENvbnRyYXZhcmlhbmNlQ2hlY2tLaW5kLmNoZWNrR2V0dGVyUmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmIChyZWNlaXZlciAhPSBudWxsICYmCiAgICAgICAgcmVjZWl2ZXIgaXMhIFRoaXNFeHByZXNzaW9uICYmCiAgICAgICAgaW50ZXJmYWNlTWVtYmVyIGlzIFByb2NlZHVyZSAmJgogICAgICAgIHR5cGVQYXJhbWV0ZXJzT2NjdXJOZWdhdGl2ZWx5KGludGVyZmFjZU1lbWJlci5lbmNsb3NpbmdDbGFzcywKICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmZ1bmN0aW9uLnJldHVyblR5cGUpKSB7CiAgICAgIHJldHVybiBNZXRob2RDb250cmF2YXJpYW5jZUNoZWNrS2luZC5jaGVja01ldGhvZFJldHVybjsKICAgIH0KICAgIHJldHVybiBNZXRob2RDb250cmF2YXJpYW5jZUNoZWNrS2luZC5ub25lOwogIH0KCiAgLy8vIElmIHRoZSBnaXZlbiBbdHlwZV0gaXMgYSBbVHlwZVBhcmFtZXRlclR5cGVdLCByZXNvbHZlIGl0IHRvIGl0cyBib3VuZC4KICBEYXJ0VHlwZSByZXNvbHZlVHlwZVBhcmFtZXRlcihEYXJ0VHlwZSB0eXBlKSB7CiAgICBEYXJ0VHlwZSByZXNvbHZlT25lU3RlcChEYXJ0VHlwZSB0eXBlKSB7CiAgICAgIGlmICh0eXBlIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgICAgcmV0dXJuIHR5cGUuYm91bmQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgcmVzb2x2ZWQgPSByZXNvbHZlT25lU3RlcCh0eXBlKTsKICAgIGlmIChyZXNvbHZlZCA9PSBudWxsKSByZXR1cm4gdHlwZTsKCiAgICAvLyBEZXRlY3QgY2lyY3VsYXJpdGllcyB1c2luZyB0aGUgdG9ydG9pc2UtYW5kLWhhcmUgYWxnb3JpdGhtLgogICAgdHlwZSA9IHJlc29sdmVkOwogICAgRGFydFR5cGUgaGFyZSA9IHJlc29sdmVPbmVTdGVwKHR5cGUpOwogICAgaWYgKGhhcmUgPT0gbnVsbCkgcmV0dXJuIHR5cGU7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoaWRlbnRpY2FsKHR5cGUsIGhhcmUpKSB7CiAgICAgICAgLy8gV2UgZm91bmQgYSBjaXJjdWxhcml0eS4gIEdpdmUgdXAgYW5kIHJldHVybiBgZHluYW1pY2AuCiAgICAgICAgcmV0dXJuIGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgIH0KCiAgICAgIC8vIEhhcmUgdGFrZXMgdHdvIHN0ZXBzCiAgICAgIHZhciBzdGVwMSA9IHJlc29sdmVPbmVTdGVwKGhhcmUpOwogICAgICBpZiAoc3RlcDEgPT0gbnVsbCkgcmV0dXJuIGhhcmU7CiAgICAgIHZhciBzdGVwMiA9IHJlc29sdmVPbmVTdGVwKHN0ZXAxKTsKICAgICAgaWYgKHN0ZXAyID09IG51bGwpIHJldHVybiBoYXJlOwogICAgICBoYXJlID0gc3RlcDI7CgogICAgICAvLyBUb3J0b2lzZSB0YWtlcyBvbmUgc3RlcAogICAgICB0eXBlID0gcmVzb2x2ZU9uZVN0ZXAodHlwZSk7CiAgICB9CiAgfQoKICBEYXJ0VHlwZSB3cmFwRnV0dXJlT3JUeXBlKERhcnRUeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICBpZGVudGljYWwodHlwZS5jbGFzc05vZGUsIGNvcmVUeXBlcy5mdXR1cmVPckNsYXNzKSkgewogICAgICByZXR1cm4gdHlwZTsKICAgIH0KICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogSWYgW3R5cGVdIGlzIGEgc3VidHlwZSBvZiBgRnV0dXJlYCwgc2hvdWxkIHdlIGp1c3QKICAgIC8vIHJldHVybiBpdCB1bm1vZGlmaWVkPwogICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlKAogICAgICAgIGNvcmVUeXBlcy5mdXR1cmVPckNsYXNzLCA8RGFydFR5cGU+W3R5cGUgPz8gY29uc3QgRHluYW1pY1R5cGUoKV0pOwogIH0KCiAgRGFydFR5cGUgd3JhcEZ1dHVyZVR5cGUoRGFydFR5cGUgdHlwZSkgewogICAgdmFyIHR5cGVXaXRob3V0RnV0dXJlT3IgPSB0eXBlID8/IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgY29yZVR5cGVzLmZ1dHVyZUNsYXNzLCA8RGFydFR5cGU+W3R5cGVXaXRob3V0RnV0dXJlT3JdKTsKICB9CgogIERhcnRUeXBlIHdyYXBUeXBlKERhcnRUeXBlIHR5cGUsIENsYXNzIGNsYXNzXykgewogICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlKGNsYXNzXywgPERhcnRUeXBlPlt0eXBlID8/IGNvbnN0IER5bmFtaWNUeXBlKCldKTsKICB9CgogIHZvaWQgX2ZvckVhY2hBcmd1bWVudCgKICAgICAgQXJndW1lbnRzIGFyZ3VtZW50cywgdm9pZCBjYWxsYmFjayhTdHJpbmcgbmFtZSwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSkgewogICAgZm9yICh2YXIgZXhwcmVzc2lvbiBpbiBhcmd1bWVudHMucG9zaXRpb25hbCkgewogICAgICBjYWxsYmFjayhudWxsLCBleHByZXNzaW9uKTsKICAgIH0KICAgIGZvciAodmFyIG5hbWVkRXhwcmVzc2lvbiBpbiBhcmd1bWVudHMubmFtZWQpIHsKICAgICAgY2FsbGJhY2sobmFtZWRFeHByZXNzaW9uLm5hbWUsIG5hbWVkRXhwcmVzc2lvbi52YWx1ZSk7CiAgICB9CiAgfQoKICBNZW1iZXIgX2dldEludGVyZmFjZU1lbWJlcihDbGFzcyBjbGFzc18sIE5hbWUgbmFtZSwgYm9vbCBzZXR0ZXIpIHsKICAgIGlmIChjbGFzc18gaXMgU2hhZG93Q2xhc3MpIHsKICAgICAgdmFyIGNsYXNzSW5mZXJlbmNlSW5mbyA9IFNoYWRvd0NsYXNzLmdldENsYXNzSW5mZXJlbmNlSW5mbyhjbGFzc18pOwogICAgICBpZiAoY2xhc3NJbmZlcmVuY2VJbmZvICE9IG51bGwpIHsKICAgICAgICB2YXIgbWVtYmVyID0gQ2xhc3NIaWVyYXJjaHkuZmluZE1lbWJlckJ5TmFtZSgKICAgICAgICAgICAgc2V0dGVyCiAgICAgICAgICAgICAgICA/IGNsYXNzSW5mZXJlbmNlSW5mby5zZXR0ZXJzCiAgICAgICAgICAgICAgICA6IGNsYXNzSW5mZXJlbmNlSW5mby5nZXR0ZXJzQW5kTWV0aG9kcywKICAgICAgICAgICAgbmFtZSk7CiAgICAgICAgaWYgKG1lbWJlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgICBtZW1iZXIgPSBtZW1iZXIgaXMgRm9yd2FyZGluZ05vZGUgPyBtZW1iZXIucmVzb2x2ZSgpIDogbWVtYmVyOwogICAgICAgIG1lbWJlciA9IG1lbWJlciBpcyBTeW50aGV0aWNBY2Nlc3NvcgogICAgICAgICAgICA/IFN5bnRoZXRpY0FjY2Vzc29yLmdldEZpZWxkKG1lbWJlcikKICAgICAgICAgICAgOiBtZW1iZXI7CiAgICAgICAgVHlwZUluZmVyZW5jZUVuZ2luZS5yZXNvbHZlSW5mZXJlbmNlTm9kZShtZW1iZXIpOwogICAgICAgIHJldHVybiBtZW1iZXI7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBjbGFzc0hpZXJhcmNoeS5nZXRJbnRlcmZhY2VNZW1iZXIoY2xhc3NfLCBuYW1lLCBzZXR0ZXI6IHNldHRlcik7CiAgfQoKICAvLy8gRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gW2V4cHJlc3Npb25dJ3MgdHlwZSBpcyBwcmVjaXNlbHkga25vd24gYXQgY29tcGlsZQogIC8vLyB0aW1lLgogIC8vLwogIC8vLyBJZiBpdCBpcywgYW4gZXJyb3IgbWVzc2FnZSB0ZW1wbGF0ZSBpcyByZXR1cm5lZCwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgdGhlCiAgLy8vIGNhbGxlciB0byByZXBvcnQgYW4gaW52YWxpZCBjYXN0LiAgT3RoZXJ3aXNlLCBgbnVsbGAgaXMgcmV0dXJuZWQuCiAgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSwgRGFydFR5cGUpPiBfZ2V0UHJlY2lzZVR5cGVFcnJvclRlbXBsYXRlKAogICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKICAgIGlmIChleHByZXNzaW9uIGlzIExpc3RMaXRlcmFsKSB7CiAgICAgIHJldHVybiB0ZW1wbGF0ZUludmFsaWRDYXN0TGl0ZXJhbExpc3Q7CiAgICB9CiAgICBpZiAoZXhwcmVzc2lvbiBpcyBNYXBMaXRlcmFsKSB7CiAgICAgIHJldHVybiB0ZW1wbGF0ZUludmFsaWRDYXN0TGl0ZXJhbE1hcDsKICAgIH0KICAgIGlmIChleHByZXNzaW9uIGlzIFNldExpdGVyYWwpIHsKICAgICAgcmV0dXJuIHRlbXBsYXRlSW52YWxpZENhc3RMaXRlcmFsU2V0OwogICAgfQogICAgaWYgKGV4cHJlc3Npb24gaXMgRnVuY3Rpb25FeHByZXNzaW9uKSB7CiAgICAgIHJldHVybiB0ZW1wbGF0ZUludmFsaWRDYXN0RnVuY3Rpb25FeHByOwogICAgfQogICAgaWYgKGV4cHJlc3Npb24gaXMgQ29uc3RydWN0b3JJbnZvY2F0aW9uKSB7CiAgICAgIHJldHVybiB0ZW1wbGF0ZUludmFsaWRDYXN0TmV3RXhwcjsKICAgIH0KICAgIGlmIChleHByZXNzaW9uIGlzIFN0YXRpY0dldCkgewogICAgICB2YXIgdGFyZ2V0ID0gZXhwcmVzc2lvbi50YXJnZXQ7CiAgICAgIGlmICh0YXJnZXQgaXMgUHJvY2VkdXJlICYmIHRhcmdldC5raW5kID09IFByb2NlZHVyZUtpbmQuTWV0aG9kKSB7CiAgICAgICAgaWYgKHRhcmdldC5lbmNsb3NpbmdDbGFzcyAhPSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gdGVtcGxhdGVJbnZhbGlkQ2FzdFN0YXRpY01ldGhvZDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIHRlbXBsYXRlSW52YWxpZENhc3RUb3BMZXZlbEZ1bmN0aW9uOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChleHByZXNzaW9uIGlzIFZhcmlhYmxlR2V0KSB7CiAgICAgIHZhciB2YXJpYWJsZSA9IGV4cHJlc3Npb24udmFyaWFibGU7CiAgICAgIGlmICh2YXJpYWJsZSBpcyBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQgJiYKICAgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudC5pc0xvY2FsRnVuY3Rpb24odmFyaWFibGUpKSB7CiAgICAgICAgcmV0dXJuIHRlbXBsYXRlSW52YWxpZENhc3RMb2NhbEZ1bmN0aW9uOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGJvb2wgX3Nob3VsZFRlYXJPZmZDYWxsKERhcnRUeXBlIGV4cGVjdGVkVHlwZSwgRGFydFR5cGUgYWN0dWFsVHlwZSkgewogICAgaWYgKGV4cGVjdGVkVHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgZXhwZWN0ZWRUeXBlLmNsYXNzTm9kZSA9PSB0eXBlU2NoZW1hRW52aXJvbm1lbnQuZnV0dXJlT3JDbGFzcykgewogICAgICBleHBlY3RlZFR5cGUgPSAoZXhwZWN0ZWRUeXBlIGFzIEludGVyZmFjZVR5cGUpLnR5cGVBcmd1bWVudHNbMF07CiAgICB9CiAgICBpZiAoZXhwZWN0ZWRUeXBlIGlzIEZ1bmN0aW9uVHlwZSkgcmV0dXJuIHRydWU7CiAgICBpZiAoZXhwZWN0ZWRUeXBlID09IHR5cGVTY2hlbWFFbnZpcm9ubWVudC5yYXdGdW5jdGlvblR5cGUpIHsKICAgICAgaWYgKCF0eXBlU2NoZW1hRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoYWN0dWFsVHlwZSwgZXhwZWN0ZWRUeXBlKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBNaXhpbkluZmVycmVyIHsKICBmaW5hbCBDb3JlVHlwZXMgY29yZVR5cGVzOwogIGZpbmFsIFR5cGVDb25zdHJhaW50R2F0aGVyZXIgZ2F0aGVyZXI7CgogIE1peGluSW5mZXJyZXIodGhpcy5jb3JlVHlwZXMsIHRoaXMuZ2F0aGVyZXIpOwoKICBTdXBlcnR5cGUgYXNJbnN0YW50aWF0aW9uT2YoU3VwZXJ0eXBlIHR5cGUsIENsYXNzIHN1cGVyY2xhc3MpOwoKICB2b2lkIHJlcG9ydFByb2JsZW0oTWVzc2FnZSBtZXNzYWdlLCBDbGFzcyBjbHMpOwoKICB2b2lkIGdlbmVyYXRlQ29uc3RyYWludHMoCiAgICAgIENsYXNzIG1peGluQ2xhc3MsIFN1cGVydHlwZSBiYXNlVHlwZSwgU3VwZXJ0eXBlIG1peGluU3VwZXJ0eXBlKSB7CiAgICBpZiAobWl4aW5TdXBlcnR5cGUudHlwZUFyZ3VtZW50cy5pc0VtcHR5KSB7CiAgICAgIC8vIFRoZSBzdXBlcnR5cGUgY29uc3RyYWludCBpc24ndCBnZW5lcmljOyBpdCBkb2Vzbid0IGNvbnN0cmFpbiBhbnl0aGluZy4KICAgIH0gZWxzZSBpZiAobWl4aW5TdXBlcnR5cGUuY2xhc3NOb2RlLmlzQW5vbnltb3VzTWl4aW4pIHsKICAgICAgLy8gV2UgaGF2ZSBlaXRoZXIgYSBtaXhpbiBkZWNsYXJhdGlvbiBgbWl4aW4gTTxYMCwgLi4uLCBYbj4gb24gUzAsIFMxYCBvcgogICAgICAvLyBhIFZNLXN0eWxlIHN1cGVyIG1peGluIGBhYnN0cmFjdCBjbGFzcyBNPFgwLCAuLi4sIFhuPiBleHRlbmRzIFMwIHdpdGgKICAgICAgLy8gUzFgIHdoZXJlIFMwIGFuZCBTMSBhcmUgc3VwZXJjbGFzcyBjb25zdHJhaW50cyB0aGF0IHBvc3NpYmx5IGhhdmUgdHlwZQogICAgICAvLyBhcmd1bWVudHMuCiAgICAgIC8vCiAgICAgIC8vIEl0IGhhcyBiZWVuIGNvbXBpbGVkIGJ5IG5hbWluZyB0aGUgc3VwZXJjbGFzcyB0byBlaXRoZXI6CiAgICAgIC8vCiAgICAgIC8vIGFic3RyYWN0IGNsYXNzIFMwJlMxPC4uLj4gZXh0ZW5kcyBPYmplY3QgaW1wbGVtZW50cyBTMCwgUzEge30KICAgICAgLy8gYWJzdHJhY3QgY2xhc3MgTTxYMCwgLi4uLCBYbj4gZXh0ZW5kcyBTMCZTMTwuLi4+IC4uLgogICAgICAvLwogICAgICAvLyBmb3IgYSBtaXhpbiBkZWNsYXJhdGlvbiwgb3IgZWxzZToKICAgICAgLy8KICAgICAgLy8gYWJzdHJhY3QgY2xhc3MgUzAmUzE8Li4uPiA9IFMwIHdpdGggUzE7CiAgICAgIC8vIGFic3RyYWN0IGNsYXNzIE08WDAsIC4uLiwgWG4+IGV4dGVuZHMgUzAmUzE8Li4uPgogICAgICAvLwogICAgICAvLyBmb3IgYSBWTS1zdHlsZSBzdXBlciBtaXhpbi4gIFRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgUzAmUzEgYXJlIHRoZSBYMCwKICAgICAgLy8gLi4uLCBYbiB0aGF0IG9jY3VyZWQgZnJlZSBpbiBTMCBhbmQgUzEuICBUcmVhdCBTMCBhbmQgUzEgYXMgc2VwYXJhdGUKICAgICAgLy8gc3VwZXJ0eXBlIGNvbnN0cmFpbnRzIGJ5IHJlY3Vyc2l2ZWx5IGNhbGxpbmcgdGhpcyBhbGdvcml0aG0uCiAgICAgIC8vCiAgICAgIC8vIEluIHRoZSBEYXJ0IFZNIHRoZSBtaXhpbiBhcHBsaWNhdGlvbiBjbGFzc2VzIHRoZW1zZWx2ZXMgYXJlIGFsbAogICAgICAvLyBlbGltaW5hdGVkIGJ5IHRyYW5zbGF0aW5nIHRoZW0gdG8gbm9ybWFsIGNsYXNzZXMuICBJbiB0aGF0IGNhc2UsIHRoZQogICAgICAvLyBtaXhpbiBhcHBlYXJzIGFzIHRoZSBvbmx5IGludGVyZmFjZSBpbiB0aGUgaW50cm9kdWNlZCBjbGFzcy4gIFdlCiAgICAgIC8vIHN1cHBvcnQgdGhyZWUgZm9ybXMgZm9yIHRoZSBzdXBlcmNsYXNzIGNvbnN0cmFpbnRzOgogICAgICAvLwogICAgICAvLyBhYnN0cmFjdCBjbGFzcyBTMCZTMTwuLi4+IGV4dGVuZHMgT2JqZWN0IGltcGxlbWVudHMgUzAsIFMxIHt9CiAgICAgIC8vIGFic3RyYWN0IGNsYXNzIFMwJlMxPC4uLj4gPSBTMCB3aXRoIFMxOwogICAgICAvLyBhYnN0cmFjdCBjbGFzcyBTMCZTMTwuLi4+IGV4dGVuZHMgUzAgaW1wbGVtZW50cyBTMSB7fQogICAgICB2YXIgbWl4aW5TdXBlcmNsYXNzID0gbWl4aW5TdXBlcnR5cGUuY2xhc3NOb2RlOwogICAgICBpZiAobWl4aW5TdXBlcmNsYXNzLm1peGVkSW5UeXBlID09IG51bGwgJiYKICAgICAgICAgIG1peGluU3VwZXJjbGFzcy5pbXBsZW1lbnRlZFR5cGVzLmxlbmd0aCAhPSAxICYmCiAgICAgICAgICAobWl4aW5TdXBlcmNsYXNzLnN1cGVyY2xhc3MgIT0gY29yZVR5cGVzLm9iamVjdENsYXNzIHx8CiAgICAgICAgICAgICAgbWl4aW5TdXBlcmNsYXNzLmltcGxlbWVudGVkVHlwZXMubGVuZ3RoICE9IDIpKSB7CiAgICAgICAgdW5leHBlY3RlZCgKICAgICAgICAgICAgJ0NvbXBpbGVyLWdlbmVyYXRlZCBtaXhpbiBhcHBsaWNhdGlvbnMgaGF2ZSBhIG1peGluIG9yIGVsc2UgJwogICAgICAgICAgICAnaW1wbGVtZW50IGV4YWN0bHkgb25lIHR5cGUnLAogICAgICAgICAgICAnJG1peGluU3VwZXJjbGFzcyBpbXBsZW1lbnRzICcKICAgICAgICAgICAgJyR7bWl4aW5TdXBlcmNsYXNzLmltcGxlbWVudGVkVHlwZXMubGVuZ3RofSB0eXBlcycsCiAgICAgICAgICAgIG1peGluU3VwZXJjbGFzcy5maWxlT2Zmc2V0LAogICAgICAgICAgICBtaXhpblN1cGVyY2xhc3MuZmlsZVVyaSk7CiAgICAgIH0KICAgICAgdmFyIHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5mcm9tU3VwZXJ0eXBlKG1peGluU3VwZXJ0eXBlKTsKICAgICAgU3VwZXJ0eXBlIHMwLCBzMTsKICAgICAgaWYgKG1peGluU3VwZXJjbGFzcy5pbXBsZW1lbnRlZFR5cGVzLmxlbmd0aCA9PSAyKSB7CiAgICAgICAgczAgPSBtaXhpblN1cGVyY2xhc3MuaW1wbGVtZW50ZWRUeXBlc1swXTsKICAgICAgICBzMSA9IG1peGluU3VwZXJjbGFzcy5pbXBsZW1lbnRlZFR5cGVzWzFdOwogICAgICB9IGVsc2UgaWYgKG1peGluU3VwZXJjbGFzcy5pbXBsZW1lbnRlZFR5cGVzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgczAgPSBtaXhpblN1cGVyY2xhc3Muc3VwZXJ0eXBlOwogICAgICAgIHMxID0gbWl4aW5TdXBlcmNsYXNzLmltcGxlbWVudGVkVHlwZXMuZmlyc3Q7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgczAgPSBtaXhpblN1cGVyY2xhc3Muc3VwZXJ0eXBlOwogICAgICAgIHMxID0gbWl4aW5TdXBlcmNsYXNzLm1peGVkSW5UeXBlOwogICAgICB9CiAgICAgIHMwID0gc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVTdXBlcnR5cGUoczApOwogICAgICBzMSA9IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlU3VwZXJ0eXBlKHMxKTsKICAgICAgZ2VuZXJhdGVDb25zdHJhaW50cyhtaXhpbkNsYXNzLCBiYXNlVHlwZSwgczApOwogICAgICBnZW5lcmF0ZUNvbnN0cmFpbnRzKG1peGluQ2xhc3MsIGJhc2VUeXBlLCBzMSk7CiAgICB9IGVsc2UgewogICAgICAvLyBGaW5kIHRoZSB0eXBlIFUwIHdoaWNoIGlzIGJhc2VUeXBlIGFzIGFuIGluc3RhbmNlIG9mIG1peGluU3VwZXJ0eXBlJ3MKICAgICAgLy8gY2xhc3MuCiAgICAgIFN1cGVydHlwZSBzdXBlcnR5cGUgPQogICAgICAgICAgYXNJbnN0YW50aWF0aW9uT2YoYmFzZVR5cGUsIG1peGluU3VwZXJ0eXBlLmNsYXNzTm9kZSk7CiAgICAgIGlmIChzdXBlcnR5cGUgPT0gbnVsbCkgewogICAgICAgIHJlcG9ydFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlTWl4aW5JbmZlcmVuY2VOb01hdGNoaW5nQ2xhc3Mud2l0aEFyZ3VtZW50cyhtaXhpbkNsYXNzLm5hbWUsCiAgICAgICAgICAgICAgICBiYXNlVHlwZS5jbGFzc05vZGUubmFtZSwgbWl4aW5TdXBlcnR5cGUuYXNJbnRlcmZhY2VUeXBlKSwKICAgICAgICAgICAgbWl4aW5DbGFzcyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIEludGVyZmFjZVR5cGUgdTAgPSBTdWJzdGl0dXRpb24uZnJvbVN1cGVydHlwZShiYXNlVHlwZSkKICAgICAgICAgIC5zdWJzdGl0dXRlU3VwZXJ0eXBlKHN1cGVydHlwZSkKICAgICAgICAgIC5hc0ludGVyZmFjZVR5cGU7CiAgICAgIC8vIFdlIHdhbnQgdG8gc29sdmUgVTAgPSBTMCB3aGVyZSBTMCBpcyBtaXhpblN1cGVydHlwZSwgYnV0IHdlIG9ubHkgaGF2ZQogICAgICAvLyBhIHN1YnR5cGUgY29uc3RyYWludHMuICBTb2x2ZSBmb3IgZXF1YWxpdHkgYnkgc29sdmluZwogICAgICAvLyBib3RoIFUwIDw6IFMwIGFuZCBTMCA8OiBVMC4KICAgICAgSW50ZXJmYWNlVHlwZSBzMCA9IG1peGluU3VwZXJ0eXBlLmFzSW50ZXJmYWNlVHlwZTsKICAgICAgZ2F0aGVyZXIudHJ5U3VidHlwZU1hdGNoKHUwLCBzMCk7CiAgICAgIGdhdGhlcmVyLnRyeVN1YnR5cGVNYXRjaChzMCwgdTApOwogICAgfQogIH0KCiAgdm9pZCBpbmZlcihDbGFzcyBjbGFzc05vZGUpIHsKICAgIFN1cGVydHlwZSBtaXhlZEluVHlwZSA9IGNsYXNzTm9kZS5taXhlZEluVHlwZTsKICAgIGFzc2VydChtaXhlZEluVHlwZS50eXBlQXJndW1lbnRzLmV2ZXJ5KCh0KSA9PiB0ID09IGNvbnN0IFVua25vd25UeXBlKCkpKTsKICAgIC8vIE5vdGUgdGhhdCB3ZSBoYXZlIG5vIGFub255bW91cyBtaXhpbiBhcHBsaWNhdGlvbnMsIHRoZXkgaGF2ZSBhbGwKICAgIC8vIGJlZW4gbmFtZWQuICBOb3RlIGFsc28gdGhhdCBtaXhpbiBjb21wb3NpdGlvbiBoYXMgYmVlbiB0cmFuc2xhdGVkCiAgICAvLyBzbyB0aGF0IHdlIG9ubHkgaGF2ZSBtaXhpbiBhcHBsaWNhdGlvbnMgb2YgdGhlIGZvcm0gYFMgd2l0aCBNYC4KICAgIFN1cGVydHlwZSBiYXNlVHlwZSA9IGNsYXNzTm9kZS5zdXBlcnR5cGU7CiAgICBDbGFzcyBtaXhpbkNsYXNzID0gbWl4ZWRJblR5cGUuY2xhc3NOb2RlOwogICAgU3VwZXJ0eXBlIG1peGluU3VwZXJ0eXBlID0gbWl4aW5DbGFzcy5zdXBlcnR5cGU7CiAgICAvLyBHZW5lcmF0ZSBjb25zdHJhaW50cyBiYXNlZCBvbiB0aGUgbWl4aW4ncyBzdXBlcnR5cGUuCiAgICBnZW5lcmF0ZUNvbnN0cmFpbnRzKG1peGluQ2xhc3MsIGJhc2VUeXBlLCBtaXhpblN1cGVydHlwZSk7CiAgICAvLyBTb2x2ZSB0aGVtIHRvIGdldCBhIG1hcCBmcm9tIHR5cGUgcGFyYW1ldGVycyB0byB1cHBlciBhbmQgbG93ZXIKICAgIC8vIGJvdW5kcy4KICAgIHZhciByZXN1bHQgPSBnYXRoZXJlci5jb21wdXRlQ29uc3RyYWludHMoKTsKICAgIC8vIEdlbmVyYXRlIG5ldyB0eXBlIHBhcmFtZXRlcnMgd2l0aCB0aGUgc29sdXRpb24gYXMgYm91bmRzLgogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiBwYXJhbWV0ZXJzID0gbWl4aW5DbGFzcy50eXBlUGFyYW1ldGVycy5tYXAoKHApIHsKICAgICAgdmFyIGNvbnN0cmFpbnQgPSByZXN1bHRbcF07CiAgICAgIC8vIEJlY2F1c2Ugd2Ugc29sdmVkIGZvciBlcXVhbGl0eSwgYSB2YWxpZCBzb2x1dGlvbiBoYXMgYSBwYXJhbWV0ZXIKICAgICAgLy8gZWl0aGVyIHVuY29uc3RyYWluZWQgb3IgZWxzZSB3aXRoIGlkZW50aWNhbCB1cHBlciBhbmQgbG93ZXIgYm91bmRzLgogICAgICBpZiAoY29uc3RyYWludCAhPSBudWxsICYmIGNvbnN0cmFpbnQudXBwZXIgIT0gY29uc3RyYWludC5sb3dlcikgewogICAgICAgIHJlcG9ydFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlTWl4aW5JbmZlcmVuY2VOb01hdGNoaW5nQ2xhc3Mud2l0aEFyZ3VtZW50cyhtaXhpbkNsYXNzLm5hbWUsCiAgICAgICAgICAgICAgICBiYXNlVHlwZS5jbGFzc05vZGUubmFtZSwgbWl4aW5TdXBlcnR5cGUuYXNJbnRlcmZhY2VUeXBlKSwKICAgICAgICAgICAgbWl4aW5DbGFzcyk7CiAgICAgICAgcmV0dXJuIHA7CiAgICAgIH0KICAgICAgYXNzZXJ0KGNvbnN0cmFpbnQgPT0gbnVsbCB8fCBjb25zdHJhaW50LnVwcGVyID09IGNvbnN0cmFpbnQubG93ZXIpOwogICAgICBib29sIGV4YWN0ID0KICAgICAgICAgIGNvbnN0cmFpbnQgIT0gbnVsbCAmJiBjb25zdHJhaW50LnVwcGVyICE9IGNvbnN0IFVua25vd25UeXBlKCk7CiAgICAgIHJldHVybiBuZXcgVHlwZVBhcmFtZXRlcigKICAgICAgICAgIHAubmFtZSwgZXhhY3QgPyBjb25zdHJhaW50LnVwcGVyIDogcC5ib3VuZCwgcC5kZWZhdWx0VHlwZSk7CiAgICB9KS50b0xpc3QoKTsKICAgIC8vIEJvdW5kcyBtaWdodCBtZW50aW9uIHRoZSBtaXhpbiBjbGFzcydzIHR5cGUgcGFyYW1ldGVycyBzbyB3ZSBoYXZlIHRvCiAgICAvLyBzdWJzdGl0dXRlIHRoZW0gYmVmb3JlIGNhbGxpbmcgaW5zdGFudGlhdGUgdG8gYm91bmRzLgogICAgdmFyIHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5mcm9tUGFpcnMobWl4aW5DbGFzcy50eXBlUGFyYW1ldGVycywKICAgICAgICBwYXJhbWV0ZXJzLm1hcCgocCkgPT4gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlKHApKS50b0xpc3QoKSk7CiAgICBmb3IgKHZhciBwIGluIHBhcmFtZXRlcnMpIHsKICAgICAgcC5ib3VuZCA9IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShwLmJvdW5kKTsKICAgIH0KICAgIC8vIFVzZSBpbnN0YW50aWF0ZSB0byBib3VuZHMuCiAgICBMaXN0PERhcnRUeXBlPiBib3VuZHMgPSBjYWxjdWxhdGVCb3VuZHMocGFyYW1ldGVycywgY29yZVR5cGVzLm9iamVjdENsYXNzKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWl4ZWRJblR5cGUudHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgewogICAgICBtaXhlZEluVHlwZS50eXBlQXJndW1lbnRzW2ldID0gYm91bmRzW2ldOwogICAgfQogIH0KfQoKLy8vIFRoZSByZXN1bHQgb2Yg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cG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcgc2hvdyB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVN0YWNrTm90RW1wdHk7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgaW50ZXJuYWxQcm9ibGVtOwoKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX3NoYWRvd19hc3QuZGFydCcgc2hvdyBTaGFkb3dUeXBlUHJvbW90ZXI7CgppbXBvcnQgJ3R5cGVfc2NoZW1hX2Vudmlyb25tZW50LmRhcnQnIHNob3cgVHlwZVNjaGVtYUVudmlyb25tZW50OwoKLy8vIEtlZXBzIHRyYWNrIG9mIHRoZSBzdGF0ZSBuZWNlc3NhcnkgdG8gcGVyZm9ybSB0eXBlIHByb21vdGlvbi4KLy8vCi8vLyBUaGVvcnkgb2Ygb3BlcmF0aW9uOiBkdXJpbmcgcGFyc2luZywgdGhlIEJvZHlCdWlsZGVyIGNhbGxzIG1ldGhvZHMgaW4gdGhpcwovLy8gY2xhc3MgdG8gaW5mb3JtIGl0IG9mIHN5bnRhY3RpYyBjb25zdHJ1Y3RzIHRoYXQgYXJlIGVuY291bnRlcmVkLiAgVGhvc2UKLy8vIG1ldGhvZHMgbWFpbnRhaW4gYSBsaW5rZWQgbGlzdCBvZiBbVHlwZVByb21vdGlvbkZhY3RdIG9iamVjdHMgdHJhY2tpbmcgd2hhdAovLy8gaXMga25vd24gYWJvdXQgdGhlIHN0YXRlIG9mIGVhY2ggdmFyaWFibGUgYXQgdGhlIGN1cnJlbnQgcG9pbnQgaW4gdGhlIGNvZGUsCi8vLyBhcyB3ZWxsIGFzIGEgbGlua2VkIGxpc3Qgb2YgW1R5cGVQcm9tb3Rpb25TY29wZV0gb2JqZWN0cyB0cmFja2luZyB0aGUKLy8vIGNvbXBvbmVudCdzIG5lc3Rpbmcgc3RydWN0dXJlLiAgV2hlbmV2ZXIgYSB2YXJpYWJsZSBpcyByZWFkLCB0aGUgY3VycmVudAovLy8gW1R5cGVQcm9tb3Rpb25GYWN0XSBhbmQgW1R5cGVQcm9tb3Rpb25TY29wZV0gYXJlIHJlY29yZGVkIGZvciBsYXRlciB1c2UuCi8vLwovLy8gRHVyaW5nIHR5cGUgaW5mZXJlbmNlLCB0aGUgW1R5cGVJbmZlcnJlcl0gY2FsbHMgYmFjayBpbnRvIHRoaXMgY2xhc3MgdG8gYXNrCi8vLyB3aGV0aGVyIGVhY2ggdmFyaWFibGUgcmVhZCBpcyBhIHByb21vdGVkIHJlYWQuICBUaGlzIGlzIGRldGVybWluZWQgYnkKLy8vIGV4YW1pbmluZyB0aGUgW1R5cGVQcm9tb3Rpb25TY29wZV0gYW5kIFtUeXBlUHJvbW90aW9uRmFjdF0gb2JqZWN0cyB0aGF0IHdlcmUKLy8vIHJlY29yZGVkIGF0IHRoZSB0aW1lIHRoZSB2YXJpYWJsZSByZWFkIHdhcyBwYXJzZWQsIGFzIHdlbGwgYXMgb3RoZXIgc3RhdGUKLy8vIHRoYXQgbWF5IGhhdmUgYmVlbiB1cGRhdGVkIGxhdGVyIGR1cmluZyB0aGUgcGFyc2luZyBwcm9jZXNzLgovLy8KLy8vIFRoaXMgY2xhc3MgYWJzdHJhY3RzIGF3YXkgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIEFTVCB1c2luZwovLy8gZ2VuZXJpYyBwYXJhbWV0ZXJzLiAgRGVyaXZlZCBjbGFzc2VzIHNob3VsZCBzZXQgRSBhbmQgViB0byB0aGUgY2xhc3MgdGhleQovLy8gdXNlIHRvIHJlcHJlc2VudCBleHByZXNzaW9ucyBhbmQgdmFyaWFibGUgZGVjbGFyYXRpb25zLCByZXNwZWN0aXZlbHkuCmFic3RyYWN0IGNsYXNzIFR5cGVQcm9tb3RlciB7CiAgVHlwZVByb21vdGVyLnByaXZhdGUoKTsKCiAgZmFjdG9yeSBUeXBlUHJvbW90ZXIoVHlwZVNjaGVtYUVudmlyb25tZW50IHR5cGVTY2hlbWFFbnZpcm9ubWVudCkgPQogICAgICBTaGFkb3dUeXBlUHJvbW90ZXIucHJpdmF0ZTsKCiAgZmFjdG9yeSBUeXBlUHJvbW90ZXIuZGlzYWJsZWQoKSA9IFR5cGVQcm9tb3RlckRpc2FibGVkLnByaXZhdGU7CgogIC8vLyBSZXR1cm5zIHRoZSBjdXJyZW50IHR5cGUgcHJvbW90aW9uIHNjb3BlLgogIFR5cGVQcm9tb3Rpb25TY29wZSBnZXQgY3VycmVudFNjb3BlOwoKICAvLy8gQ29tcHV0ZXMgdGhlIHByb21vdGVkIHR5cGUgb2YgYSB2YXJpYWJsZSByZWFkIGhhdmluZyB0aGUgZ2l2ZW4gW2ZhY3RdIGFuZAogIC8vLyBbc2NvcGVdLiAgUmV0dXJucyBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gcHJvbW90aW9uLgogIC8vLwogIC8vLyBbbXV0YXRlZEluQ2xvc3VyZV0gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHZhcmlhYmxlIHdhcyBtdXRhdGVkIGluIGEgY2xvc3VyZQogIC8vLyBzb21ld2hlcmUgaW4gdGhlIG1ldGhvZC4KICBEYXJ0VHlwZSBjb21wdXRlUHJvbW90ZWRUeXBlKAogICAgICBUeXBlUHJvbW90aW9uRmFjdCBmYWN0LCBUeXBlUHJvbW90aW9uU2NvcGUgc2NvcGUsIGJvb2wgbXV0YXRlZEluQ2xvc3VyZSk7CgogIC8vLyBVcGRhdGVzIHRoZSBzdGF0ZSB0byByZWZsZWN0IHRoZSBmYWN0IHRoYXQgd2UgYXJlIGVudGVyaW5nIGFuICJlbHNlIgogIC8vLyBicmFuY2guCiAgdm9pZCBlbnRlckVsc2UoKTsKCiAgLy8vIFVwZGF0ZXMgdGhlIHN0YXRlIHRvIHJlZmxlY3QgdGhlIGZhY3QgdGhhdCB0aGUgTEhTIG9mIGFuICImJiIgb3IgInx8IgogIC8vLyBleHByZXNzaW9uIGhhcyBqdXN0IGJlZW4gcGFyc2VkLCBhbmQgd2UgYXJlIGVudGVyaW5nIHRoZSBSSFMuCiAgdm9pZCBlbnRlckxvZ2ljYWxFeHByZXNzaW9uKEV4cHJlc3Npb24gbGhzLCBTdHJpbmcgb3BlcmF0b3IpOwoKICAvLy8gVXBkYXRlcyB0aGUgc3RhdGUgdG8gcmVmbGVjdCB0aGUgZmFjdCB0aGF0IHRoZSAiY29uZGl0aW9uIiBwYXJ0IG9mIGFuICJpZiIKICAvLy8gc3RhdGVtZW50IG9yIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaGFzIGp1c3QgYmVlbiBwYXJzZWQsIGFuZCB3ZSBhcmUKICAvLy8gZW50ZXJpbmcgdGhlICJ0aGVuIiBicmFuY2guCiAgdm9pZCBlbnRlclRoZW4oRXhwcmVzc2lvbiBjb25kaXRpb24pOwoKICAvLy8gVXBkYXRlcyB0aGUgc3RhdGUgdG8gcmVmbGVjdCB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgZXhpdGVkIHRoZSAiZWxzZSIKICAvLy8gYnJhbmNoIG9mIGFuICJpZiIgc3RhdGVtZW50IG9yIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCiAgdm9pZCBleGl0Q29uZGl0aW9uYWwoKTsKCiAgLy8vIFVwZGF0ZXMgdGhlIHN0YXRlIHRvIHJlZmxlY3QgdGhlIGZhY3QgdGhhdCB3ZSBoYXZlIGV4aXRlZCB0aGUgUkhTIG9mIGFuCiAgLy8vICImJiIgb3IgInx8IiBleHByZXNzaW9uLgogIHZvaWQgZXhpdExvZ2ljYWxFeHByZXNzaW9uKEV4cHJlc3Npb24gcmhzLCBFeHByZXNzaW9uIGxvZ2ljYWxFeHByZXNzaW9uKTsKCiAgLy8vIFZlcmlmaWVzIHRoYXQgZW50ZXIvZXhpdCBjYWxscyB3ZXJlIHByb3Blcmx5IG5lc3RlZC4KICB2b2lkIGZpbmlzaGVkKCk7CgogIC8vLyBSZWNvcmRzIHRoYXQgdGhlIGdpdmVuIFt2YXJpYWJsZV0gd2FzIGFjY2Vzc2VkIGZvciByZWFkaW5nLCBhbmQgcmV0dXJucyBhCiAgLy8vIFtUeXBlUHJvbW90aW9uRmFjdF0gZGVzY3JpYmluZyB0aGUgdmFyaWFibGUncyBjdXJyZW50IHR5cGUgcHJvbW90aW9uCiAgLy8vIHN0YXRlLgogIC8vLwogIC8vLyBbZnVuY3Rpb25OZXN0aW5nTGV2ZWxdIHNob3VsZCBiZSB0aGUgY3VycmVudCBuZXN0aW5nIGxldmVsIG9mIGNsb3N1cmVzLgogIC8vLyBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YXJpYWJsZSB3YXMgYWNjZXNzZWQgaW4gYSBjbG9zdXJlLgogIFR5cGVQcm9tb3Rpb25GYWN0IGdldEZhY3RGb3JBY2Nlc3MoCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIGludCBmdW5jdGlvbk5lc3RpbmdMZXZlbCk7CgogIC8vLyBVcGRhdGVzIHRoZSBzdGF0ZSB0byByZWZsZWN0IHRoZSBmYWN0IHRoYXQgYW4gImlzIiBjaGVjayBvZiBhIGxvY2FsCiAgLy8vIHZhcmlhYmxlIHdhcyBqdXN0IHBhcnNlZC4KICB2b2lkIGhhbmRsZUlzQ2hlY2soRXhwcmVzc2lvbiBpc0V4cHJlc3Npb24sIGJvb2wgaXNJbnZlcnRlZCwKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgRGFydFR5cGUgdHlwZSwgaW50IGZ1bmN0aW9uTmVzdGluZ0xldmVsKTsKCiAgLy8vIFVwZGF0ZXMgdGhlIHN0YXRlIHRvIHJlZmxlY3QgdGhlIGZhY3QgdGhhdCB0aGUgZ2l2ZW4gW3ZhcmlhYmxlXSB3YXMKICAvLy8gbXV0YXRlZC4KICB2b2lkIG11dGF0ZVZhcmlhYmxlKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIGludCBmdW5jdGlvbk5lc3RpbmdMZXZlbCk7Cn0KCi8vLyBJbXBsZW1lbnRhdGlvbiBvZiBbVHlwZVByb21vdGVyXSB3aGljaCBkb2Vzbid0IGRvIGFueSB0eXBlIHByb21vdGlvbi4KLy8vCi8vLyBUaGlzIGlzIGludGVuZGVkIGZvciBwcm9maWxpbmcsIHRvIGVuc3VyZSB0aGF0IHR5cGUgaW5mZXJlbmNlIGFuZCB0eXBlCi8vLyBwcm9tb3Rpb24gZG8gbm90IHNsb3cgZG93biBjb21waWxhdGlvbiB0b28gbXVjaC4KY2xhc3MgVHlwZVByb21vdGVyRGlzYWJsZWQgZXh0ZW5kcyBUeXBlUHJvbW90ZXIgewogIFR5cGVQcm9tb3RlckRpc2FibGVkLnByaXZhdGUoKSA6IHN1cGVyLnByaXZhdGUoKTsKCiAgQG92ZXJyaWRlCiAgVHlwZVByb21vdGlvblNjb3BlIGdldCBjdXJyZW50U2NvcGUgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgY29tcHV0ZVByb21vdGVkVHlwZShUeXBlUHJvbW90aW9uRmFjdCBmYWN0LCBUeXBlUHJvbW90aW9uU2NvcGUgc2NvcGUsCiAgICAgICAgICBib29sIG11dGF0ZWRJbkNsb3N1cmUpID0+CiAgICAgIG51bGw7CgogIEBvdmVycmlkZQogIHZvaWQgZW50ZXJFbHNlKCkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbnRlckxvZ2ljYWxFeHByZXNzaW9uKEV4cHJlc3Npb24gbGhzLCBTdHJpbmcgb3BlcmF0b3IpIHt9CgogIEBvdmVycmlkZQogIHZvaWQgZW50ZXJUaGVuKEV4cHJlc3Npb24gY29uZGl0aW9uKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIGV4aXRDb25kaXRpb25hbCgpIHt9CgogIEBvdmVycmlkZQogIHZvaWQgZXhpdExvZ2ljYWxFeHByZXNzaW9uKEV4cHJlc3Npb24gcmhzLCBFeHByZXNzaW9uIGxvZ2ljYWxFeHByZXNzaW9uKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIGZpbmlzaGVkKCkge30KCiAgQG92ZXJyaWRlCiAgVHlwZVByb21vdGlvbkZhY3QgZ2V0RmFjdEZvckFjY2VzcygKICAgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIGludCBmdW5jdGlvbk5lc3RpbmdMZXZlbCkgPT4KICAgICAgbnVsbDsKCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJc0NoZWNrKEV4cHJlc3Npb24gaXNFeHByZXNzaW9uLCBib29sIGlzSW52ZXJ0ZWQsCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIERhcnRUeXBlIHR5cGUsIGludCBmdW5jdGlvbk5lc3RpbmdMZXZlbCkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCBtdXRhdGVWYXJpYWJsZShWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBpbnQgZnVuY3Rpb25OZXN0aW5nTGV2ZWwpIHt9Cn0KCi8vLyBEZXJpdmVkIGNsYXNzIGNvbnRhaW5pbmcgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbnMgb2YgW1R5cGVQcm9tb3Rlcl0uCi8vLwovLy8gVGhpcyBjbGFzcyBjb250YWlucyBhcyBtdWNoIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0eXBlIHByb21vdGlvbiBhcwovLy8gcG9zc2libGUgd2l0aG91dCBuZWVkaW5nIGFjY2VzcyB0byBwcml2YXRlIG1lbWJlcnMgb2Ygc2hhZG93IG9iamVjdHMuICBJdAovLy8gZGVmZXJzIHRvIGFic3RyYWN0IG1ldGhvZHMgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4KYWJzdHJhY3QgY2xhc3MgVHlwZVByb21vdGVySW1wbCBleHRlbmRzIFR5cGVQcm9tb3RlciB7CiAgZmluYWwgVHlwZVNjaGVtYUVudmlyb25tZW50IHR5cGVTY2hlbWFFbnZpcm9ubWVudDsKCiAgLy8vIFtUeXBlUHJvbW90aW9uRmFjdF0gcmVwcmVzZW50aW5nIHRoZSBpbml0aWFsIHN0YXRlIChubyBmYWN0cyBoYXZlIGJlZW4KICAvLy8gZGV0ZXJtaW5lZCB5ZXQpLgogIC8vLwogIC8vLyBBbGwgbGlua2VkIGxpc3RzIG9mIGZhY3RzIHRlcm1pbmF0ZSBpbiB0aGlzIG9iamVjdC4KICBmaW5hbCBfTnVsbEZhY3QgX251bGxGYWN0czsKCiAgLy8vIE1hcCBmcm9tIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHRvIHRoZSBtb3N0IHJlY2VudCBbVHlwZVByb21vdGlvbkZhY3RdCiAgLy8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFyaWFibGUuCiAgLy8vCiAgLy8vIFtUeXBlUHJvbW90aW9uRmFjdF1zIHRoYXQgYXJlIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IHZhcmlhYmxlIHNob3cgdXAgaW4KICAvLy8gdGhpcyBtYXAgdW5kZXIgdGhlIGtleSBgbnVsbGAuCiAgZmluYWwgX2ZhY3RDYWNoZSA9IDxWYXJpYWJsZURlY2xhcmF0aW9uLCBUeXBlUHJvbW90aW9uRmFjdD57fTsKCiAgLy8vIExpbmtlZCBsaXN0IG9mIFtUeXBlUHJvbW90aW9uRmFjdF1zIHRoYXQgd2FzIGN1cnJlbnQgYXQgdGhlIHRpbWUgdGhlCiAgLy8vIFtfZmFjdENhY2hlXSB3YXMgbGFzdCB1cGRhdGVkLgogIFR5cGVQcm9tb3Rpb25GYWN0IF9mYWN0Q2FjaGVTdGF0ZTsKCiAgLy8vIExpbmtlZCBsaXN0IG9mIFtUeXBlUHJvbW90aW9uRmFjdF1zIGRlc2NyaWJpbmcgd2hhdCBpcyBrbm93biB0byBiZSB0cnVlCiAgLy8vIGFmdGVyIGV4ZWN1dGlvbiBvZiB0aGUgZXhwcmVzc2lvbiBvciBzdGF0ZW1lbnQgdGhhdCB3YXMgbW9zdCByZWNlbnRseQogIC8vLyBwYXJzZWQuCiAgVHlwZVByb21vdGlvbkZhY3QgX2N1cnJlbnRGYWN0czsKCiAgLy8vIFRoZSBtb3N0IHJlY2VudGx5IHBhcnNlZCBleHByZXNzaW9uIHdob3NlIG91dGNvbWUgcG90ZW50aWFsbHkgYWZmZWN0cyB3aGF0CiAgLy8vIGlzIGtub3duIHRvIGJlIHRydWUgKGUuZy4gYW4gImlzIiBjaGVjayBvciBhIGxvZ2ljYWwgZXhwcmVzc2lvbikuICBNYXkgYmUKICAvLy8gYG51bGxgIGlmIG5vIHN1Y2ggZXhwcmVzc2lvbiBoYXMgYmVlbiBlbmNvdW50ZXJlZCB5ZXQuCiAgRXhwcmVzc2lvbiBfcHJvbW90aW9uRXhwcmVzc2lvbjsKCiAgLy8vIExpbmtlZCBsaXN0IG9mIFtUeXBlUHJvbW90aW9uRmFjdF1zIGRlc2NyaWJpbmcgd2hhdCBpcyBrbm93biB0byBiZSB0cnVlCiAgLy8vIGFmdGVyIGV4ZWN1dGlvbiBvZiBbX3Byb21vdGlvbkV4cHJlc3Npb25dLCBhc3N1bWluZyB0aGF0CiAgLy8vIFtfcHJvbW90aW9uRXhwcmVzc2lvbl0gZXZhbHVhdGVzIHRvIGB0cnVlYC4KICBUeXBlUHJvbW90aW9uRmFjdCBfdHJ1ZUZhY3RzRm9yUHJvbW90aW9uRXhwcmVzc2lvbjsKCiAgLy8vIExpbmtlZCBsaXN0IG9mIFtUeXBlUHJvbW90aW9uU2NvcGVdcyBkZXNjcmliaW5nIHRoZSBuZXN0aW5nIHN0cnVjdHVyZSB0aGF0CiAgLy8vIGNvbnRhaW5zIHRoZSBleHByZXNzb2luIG9yIHN0YXRlbWVudCB0aGF0IHdhcyBtb3N0IHJlY2VudGx5IHBhcnNlZC4KICBUeXBlUHJvbW90aW9uU2NvcGUgX2N1cnJlbnRTY29wZSA9IGNvbnN0IF9Ub3BMZXZlbFNjb3BlKCk7CgogIC8vLyBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBbVHlwZVByb21vdGlvbkZhY3RdIHRoYXQgd2FzIG1vc3QgcmVjZW50bHkKICAvLy8gY3JlYXRlZC4KICBpbnQgX2xhc3RGYWN0U2VxdWVuY2VOdW1iZXIgPSAwOwoKICBUeXBlUHJvbW90ZXJJbXBsLnByaXZhdGUoVHlwZVNjaGVtYUVudmlyb25tZW50IHR5cGVTY2hlbWFFbnZpcm9ubWVudCkKICAgICAgOiB0aGlzLl8odHlwZVNjaGVtYUVudmlyb25tZW50LCBuZXcgX051bGxGYWN0KCkpOwoKICBUeXBlUHJvbW90ZXJJbXBsLl8odGhpcy50eXBlU2NoZW1hRW52aXJvbm1lbnQsIF9OdWxsRmFjdCB0aGlzLl9udWxsRmFjdHMpCiAgICAgIDogX2ZhY3RDYWNoZVN0YXRlID0gX251bGxGYWN0cywKICAgICAgICBfY3VycmVudEZhY3RzID0gX251bGxGYWN0cywKICAgICAgICBzdXBlci5wcml2YXRlKCkgewogICAgX2ZhY3RDYWNoZVtudWxsXSA9IF9udWxsRmFjdHM7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlUHJvbW90aW9uU2NvcGUgZ2V0IGN1cnJlbnRTY29wZSA9PiBfY3VycmVudFNjb3BlOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBjb21wdXRlUHJvbW90ZWRUeXBlKAogICAgICBUeXBlUHJvbW90aW9uRmFjdCBmYWN0LCBUeXBlUHJvbW90aW9uU2NvcGUgc2NvcGUsIGJvb2wgbXV0YXRlZEluQ2xvc3VyZSkgewogICAgaWYgKG11dGF0ZWRJbkNsb3N1cmUpIHJldHVybiBudWxsOwogICAgcmV0dXJuIGZhY3Q/Ll9jb21wdXRlUHJvbW90ZWRUeXBlKHRoaXMsIHNjb3BlKTsKICB9CgogIC8vLyBGb3IgaW50ZXJuYWwgZGVidWdnaW5nIHVzZSwgb3B0aW9uYWxseSBwcmludHMgdGhlIGN1cnJlbnQgc3RhdGUgZm9sbG93ZWQKICAvLy8gYnkgdGhlIGV2ZW50IG5hbWUuICBVbmNvbW1lbnQgdGhlIGNhbGwgdG8gW19wcmludEV2ZW50XSB0byBzZWUgdGhlCiAgLy8vIHNlcXVlbmNlIG9mIGNhbGxzIGludG8gdGhlIHR5cGUgcHJvbW90ZXIgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHN0YXRlcy4KICB2b2lkIGRlYnVnRXZlbnQoU3RyaW5nIG5hbWUpIHsKICAgIC8vIF9wcmludEV2ZW50KG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbnRlckVsc2UoKSB7CiAgICBkZWJ1Z0V2ZW50KCdlbnRlckVsc2UnKTsKICAgIF9Db25kaXRpb25hbFNjb3BlIHNjb3BlID0gX2N1cnJlbnRTY29wZTsKICAgIC8vIFJlY29yZCB0aGUgY3VycmVudCBmYWN0IHN0YXRlIHNvIHRoYXQgb25jZSB3ZSBleGl0IHRoZSAiZWxzZSIgYnJhbmNoLCB3ZQogICAgLy8gY2FuIG1lcmdlIGZhY3RzIGZyb20gdGhlIHR3byBicmFuY2hlcy4KICAgIHNjb3BlLmFmdGVyVHJ1ZSA9IF9jdXJyZW50RmFjdHM7CiAgICAvLyBXaGlsZSBwcm9jZXNzaW5nIHRoZSAiZWxzZSIgYmxvY2ssIGFzc3VtZSB0aGUgY29uZGl0aW9uIHdhcyBmYWxzZS4KICAgIF9jdXJyZW50RmFjdHMgPSBzY29wZS5iZWZvcmVFbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbnRlckxvZ2ljYWxFeHByZXNzaW9uKEV4cHJlc3Npb24gbGhzLCBTdHJpbmcgb3BlcmF0b3IpIHsKICAgIGRlYnVnRXZlbnQoJ2VudGVyTG9naWNhbEV4cHJlc3Npb24nKTsKICAgIC8vIEZpZ3VyZSBvdXQgd2hhdCB0aGUgZmFjdHMgYXJlIGJhc2VkIG9uIHBvc3NpYmxlIExIUyBvdXRjb21lcy4KICAgIHZhciB0cnVlRmFjdHMgPSBfZmFjdHNXaGVuVHJ1ZShsaHMpOwogICAgdmFyIGZhbHNlRmFjdHMgPSBfZmFjdHNXaGVuRmFsc2UobGhzKTsKICAgIC8vIFJlY29yZCB0aGUgZmFjdCB0aGF0IHdlIGFyZSBlbnRlcmluZyBhIG5ldyBzY29wZSwgYW5kIHNhdmUgdGhlCiAgICAvLyBhcHByb3ByaWF0ZSBmYWN0cyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGV4cHJlc3Npb24gZ2V0cyBzaG9ydC1jdXQuCiAgICBib29sIGlzQW5kID0gaWRlbnRpY2FsKG9wZXJhdG9yLCAnJiYnKTsKICAgIF9jdXJyZW50U2NvcGUgPQogICAgICAgIG5ldyBfTG9naWNhbFNjb3BlKF9jdXJyZW50U2NvcGUsIGlzQW5kLCBpc0FuZCA/IGZhbHNlRmFjdHMgOiB0cnVlRmFjdHMpOwogICAgLy8gV2hpbGUgcHJvY2Vzc2luZyB0aGUgUkhTLCBhc3N1bWUgdGhlIGNvbmRpdGlvbiB3YXMgZmFsc2Ugb3IgdHJ1ZSwKICAgIC8vIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBsb2dpY2FsIGV4cHJlc3Npb24uCiAgICBfY3VycmVudEZhY3RzID0gaXNBbmQgPyB0cnVlRmFjdHMgOiBmYWxzZUZhY3RzOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbnRlclRoZW4oRXhwcmVzc2lvbiBjb25kaXRpb24pIHsKICAgIGRlYnVnRXZlbnQoJ2VudGVyVGhlbicpOwogICAgLy8gRmlndXJlIG91dCB3aGF0IHRoZSBmYWN0cyBhcmUgYmFzZWQgb24gcG9zc2libGUgY29uZGl0aW9uIG91dGNvbWVzLgogICAgdmFyIHRydWVGYWN0cyA9IF9mYWN0c1doZW5UcnVlKGNvbmRpdGlvbik7CiAgICB2YXIgZmFsc2VGYWN0cyA9IF9mYWN0c1doZW5GYWxzZShjb25kaXRpb24pOwogICAgLy8gUmVjb3JkIHRoZSBmYWN0IHRoYXQgd2UgYXJlIGVudGVyaW5nIGEgbmV3IHNjb3BlLCBhbmQgc2F2ZSB0aGUgImZhbHNlIgogICAgLy8gZmFjdHMgZm9yIHdoZW4gd2UgZW50ZXIgdGhlICJlbHNlIiBicmFuY2guCiAgICBfY3VycmVudFNjb3BlID0gbmV3IF9Db25kaXRpb25hbFNjb3BlKF9jdXJyZW50U2NvcGUsIGZhbHNlRmFjdHMpOwogICAgLy8gV2hpbGUgcHJvY2Vzc2luZyB0aGUgInRoZW4iIGJsb2NrLCBhc3N1bWUgdGhlIGNvbmRpdGlvbiB3YXMgdHJ1ZS4KICAgIF9jdXJyZW50RmFjdHMgPSB0cnVlRmFjdHM7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGV4aXRDb25kaXRpb25hbCgpIHsKICAgIGRlYnVnRXZlbnQoJ2V4aXRDb25kaXRpb25hbCcpOwogICAgX0NvbmRpdGlvbmFsU2NvcGUgc2NvcGUgPSBfY3VycmVudFNjb3BlOwogICAgX2N1cnJlbnRTY29wZSA9IF9jdXJyZW50U2NvcGUuX2VuY2xvc2luZzsKICAgIF9jdXJyZW50RmFjdHMgPSBfbWVyZ2VGYWN0cyhzY29wZS5hZnRlclRydWUsIF9jdXJyZW50RmFjdHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBleGl0TG9naWNhbEV4cHJlc3Npb24oRXhwcmVzc2lvbiByaHMsIEV4cHJlc3Npb24gbG9naWNhbEV4cHJlc3Npb24pIHsKICAgIGRlYnVnRXZlbnQoJ2V4aXRMb2dpY2FsRXhwcmVzc2lvbicpOwogICAgX0xvZ2ljYWxTY29wZSBzY29wZSA9IF9jdXJyZW50U2NvcGU7CiAgICBfY3VycmVudFNjb3BlID0gX2N1cnJlbnRTY29wZS5fZW5jbG9zaW5nOwogICAgaWYgKHNjb3BlLmlzQW5kKSB7CiAgICAgIF9yZWNvcmRQcm9tb3Rpb25FeHByZXNzaW9uKGxvZ2ljYWxFeHByZXNzaW9uLCBfZmFjdHNXaGVuVHJ1ZShyaHMpLAogICAgICAgICAgX21lcmdlRmFjdHMoc2NvcGUuc2hvcnRjdXRGYWN0cywgX2N1cnJlbnRGYWN0cykpOwogICAgfSBlbHNlIHsKICAgICAgX3JlY29yZFByb21vdGlvbkV4cHJlc3Npb24oCiAgICAgICAgICBsb2dpY2FsRXhwcmVzc2lvbiwKICAgICAgICAgIF9tZXJnZUZhY3RzKHNjb3BlLnNob3J0Y3V0RmFjdHMsIF9jdXJyZW50RmFjdHMpLAogICAgICAgICAgX2ZhY3RzV2hlbkZhbHNlKHJocykpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmaW5pc2hlZCgpIHsKICAgIGRlYnVnRXZlbnQoJ2ZpbmlzaGVkJyk7CiAgICBpZiAoX2N1cnJlbnRTY29wZSBpcyEgX1RvcExldmVsU2NvcGUpIHsKICAgICAgaW50ZXJuYWxQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1TdGFja05vdEVtcHR5LndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgIiRydW50aW1lVHlwZSIsICIkX2N1cnJlbnRTY29wZSIpLAogICAgICAgICAgLTEsCiAgICAgICAgICBudWxsKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFR5cGVQcm9tb3Rpb25GYWN0IGdldEZhY3RGb3JBY2Nlc3MoCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIGludCBmdW5jdGlvbk5lc3RpbmdMZXZlbCkgewogICAgZGVidWdFdmVudCgnZ2V0RmFjdEZvckFjY2VzcycpOwogICAgdmFyIGZhY3QgPSBfY29tcHV0ZUN1cnJlbnRGYWN0TWFwKClbdmFyaWFibGVdOwogICAgVHlwZVByb21vdGlvbkZhY3QuX3JlY29yZEFjY2Vzc2VkSW5TY29wZSgKICAgICAgICBmYWN0LCBfY3VycmVudFNjb3BlLCBmdW5jdGlvbk5lc3RpbmdMZXZlbCk7CiAgICByZXR1cm4gZmFjdDsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBuZXN0aW5nIGxldmVsIHRoYXQgd2FzIGluIGVmZmVjdCB3aGVuIFt2YXJpYWJsZV0gd2FzIGRlY2xhcmVkLgogIGludCBnZXRWYXJpYWJsZUZ1bmN0aW9uTmVzdGluZ0xldmVsKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUlzQ2hlY2soRXhwcmVzc2lvbiBpc0V4cHJlc3Npb24sIGJvb2wgaXNJbnZlcnRlZCwKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgRGFydFR5cGUgdHlwZSwgaW50IGZ1bmN0aW9uTmVzdGluZ0xldmVsKSB7CiAgICBkZWJ1Z0V2ZW50KCdoYW5kbGVJc0NoZWNrJyk7CiAgICBpZiAoIWlzUHJvbW90aW9uQ2FuZGlkYXRlKHZhcmlhYmxlKSkgcmV0dXJuOwogICAgdmFyIGlzQ2hlY2sgPSBuZXcgX0lzQ2hlY2soCiAgICAgICAgKytfbGFzdEZhY3RTZXF1ZW5jZU51bWJlciwKICAgICAgICB2YXJpYWJsZSwKICAgICAgICBfY3VycmVudEZhY3RzLAogICAgICAgIF9jb21wdXRlQ3VycmVudEZhY3RNYXAoKVt2YXJpYWJsZV0sCiAgICAgICAgZnVuY3Rpb25OZXN0aW5nTGV2ZWwsCiAgICAgICAgdHlwZSk7CiAgICBpZiAoIWlzSW52ZXJ0ZWQpIHsKICAgICAgX3JlY29yZFByb21vdGlvbkV4cHJlc3Npb24oaXNFeHByZXNzaW9uLCBpc0NoZWNrLCBfY3VycmVudEZhY3RzKTsKICAgIH0KICB9CgogIC8vLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIHZhcmlhYmxlIHNob3VsZCBiZSBjb25zaWRlcmVkIGZvciBwcm9tb3Rpb24KICAvLy8gYXQgYWxsLgogIC8vLwogIC8vLyBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIGluIGtlcm5lbCwgW1ZhcmlhYmxlRGVjbGFyYXRpb25dIG9iamVjdHMgYXJlCiAgLy8vIHNvbWV0aW1lcyB1c2VkIHRvIHJlcHJlc2VudCBsb2NhbCBmdW5jdGlvbnMsIHdoaWNoIGFyZSBub3Qgc3ViamVjdCB0bwogIC8vLyBwcm9tb3Rpb24uCiAgYm9vbCBpc1Byb21vdGlvbkNhbmRpZGF0ZShWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKTsKCiAgLy8vIFVwZGF0ZXMgdGhlIHN0YXRlIHRvIHJlZmxlY3QgdGhlIGZhY3QgdGhhdCB0aGUgZ2l2ZW4gW3ZhcmlhYmxlXSB3YXMKICAvLy8gbXV0YXRlZC4KICB2b2lkIG11dGF0ZVZhcmlhYmxlKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIGludCBmdW5jdGlvbk5lc3RpbmdMZXZlbCkgewogICAgZGVidWdFdmVudCgnbXV0YXRlVmFyaWFibGUnKTsKICAgIHZhciBmYWN0ID0gX2NvbXB1dGVDdXJyZW50RmFjdE1hcCgpW3ZhcmlhYmxlXTsKICAgIFR5cGVQcm9tb3Rpb25GYWN0Ll9yZWNvcmRNdXRhdGVkSW5TY29wZShmYWN0LCBfY3VycmVudFNjb3BlKTsKICAgIGlmIChnZXRWYXJpYWJsZUZ1bmN0aW9uTmVzdGluZ0xldmVsKHZhcmlhYmxlKSA8IGZ1bmN0aW9uTmVzdGluZ0xldmVsKSB7CiAgICAgIHNldFZhcmlhYmxlTXV0YXRlZEluQ2xvc3VyZSh2YXJpYWJsZSk7CiAgICB9CiAgICBzZXRWYXJpYWJsZU11dGF0ZWRBbnl3aGVyZSh2YXJpYWJsZSk7CiAgfQoKICAvLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIFthXSBhbmQgW2JdIHJlcHJlc2VudCB0aGUgc2FtZSBleHByZXNzaW9uLCBhZnRlcgogIC8vLyBkcm9wcGluZyByZWR1bmRhbnQgZW5jbG9zaW5nIHBhcmVudGhlc2VzLgogIGJvb2wgc2FtZUV4cHJlc3Npb25zKEV4cHJlc3Npb24gYSwgRXhwcmVzc2lvbiBiKTsKCiAgLy8vIFJlY29yZHMgdGhhdCB0aGUgZ2l2ZW4gdmFyaWFibGUgd2FzIG11dGF0ZWQgc29tZXdoZXJlIGluc2lkZSB0aGUgbWV0aG9kLgogIHZvaWQgc2V0VmFyaWFibGVNdXRhdGVkQW55d2hlcmUoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSk7CgogIC8vLyBSZWNvcmRzIHRoYXQgdGhlIGdpdmVuIHZhcmlhYmxlIHdhcyBtdXRhdGVkIGluc2lkZSBhIGNsb3N1cmUuCiAgdm9pZCBzZXRWYXJpYWJsZU11dGF0ZWRJbkNsb3N1cmUoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSk7CgogIC8vLyBJbmRpY2F0ZXMgd2hldGhlciBbc2V0VmFyaWFibGVNdXRhdGVkQW55d2hlcmVdIGhhcyBiZWVuIGNhbGxlZCBmb3IgdGhlCiAgLy8vIGdpdmVuIFt2YXJpYWJsZV0uCiAgYm9vbCB3YXNWYXJpYWJsZU11dGF0ZWRBbnl3aGVyZShWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKTsKCiAgLy8vIFJldHVybnMgYSBtYXAgZnJvbSB2YXJpYWJsZSBkZWNsYXJhdGlvbiB0byB0aGUgbW9zdCByZWNlbnQKICAvLy8gW1R5cGVQcm9tb3Rpb25GYWN0XSBhc3NvY2lhdGVkIHdpdGggdGhlIHZhcmlhYmxlLgogIE1hcDxWYXJpYWJsZURlY2xhcmF0aW9uLCBUeXBlUHJvbW90aW9uRmFjdD4gX2NvbXB1dGVDdXJyZW50RmFjdE1hcCgpIHsKICAgIC8vIFJvbGwgYmFjayBhbnkgbWFwIGVudHJpZXMgYXNzb2NpYXRlZCB3aXRoIGZhY3RzIHRoYXQgYXJlIG5vIGxvbmdlciBpbgogICAgLy8gZWZmZWN0LCBhbmQgc2V0IFtjb21tb25BbmNlc3Rvcl0gdG8gdGhlIGZhY3QgdGhhdCBpcyBhbiBhbmNlc3RvciBvZgogICAgLy8gdGhlIGN1cnJlbnQgc3RhdGUgYW5kIHRoZSBwcmV2aW91c2x5IGNhY2hlZCBzdGF0ZS4gIFRvIGRvIHRoaXMsIHdlIHNldCBhCiAgICAvLyB2YXJpYWJsZSBwb2ludGluZyB0byBbX2N1cnJlbnRGYWN0c10sIGFuZCB0aGVuIHdhbGsgYm90aCBpdCBhbmQKICAgIC8vIFtfZmFjdENhY2hlU3RhdGVdIGJhY2sgdG8gdGhlaXIgY29tbW9uIGFuY2VzdG9yLCB1cGRhdGluZyBbX2ZhY3RDYWNoZV0gYXMKICAgIC8vIHdlIGdvLgogICAgVHlwZVByb21vdGlvbkZhY3QgY29tbW9uQW5jZXN0b3IgPSBfY3VycmVudEZhY3RzOwogICAgd2hpbGUgKGNvbW1vbkFuY2VzdG9yLnNlcXVlbmNlTnVtYmVyICE9IF9mYWN0Q2FjaGVTdGF0ZS5zZXF1ZW5jZU51bWJlcikgewogICAgICBpZiAoY29tbW9uQW5jZXN0b3Iuc2VxdWVuY2VOdW1iZXIgPiBfZmFjdENhY2hlU3RhdGUuc2VxdWVuY2VOdW1iZXIpIHsKICAgICAgICAvLyBUaGUgY3VycmVudGx5IGNhY2hlZCBzdGF0ZSBpcyBvbGRlciB0aGFuIHRoZSBjb21tb24gYW5jZXN0b3IgZ3Vlc3MsCiAgICAgICAgLy8gc28gdGhlIGNvbW1vbiBhbmNlc3RvciBndWVzcyBuZWVkcyB0byBiZSB3YWxrZWQgYmFjay4KICAgICAgICBjb21tb25BbmNlc3RvciA9IGNvbW1vbkFuY2VzdG9yLnByZXZpb3VzOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRoZSBjb21tb24gYW5jZXN0b3IgZ3Vlc3MgaXMgb2xkZXIgdGhhbiB0aGUgY3VycmVudGx5IGNhY2hlZCBzdGF0ZSwKICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIHJvbGwgYmFjayB0aGUgbWFwIGVudHJ5IGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudGx5CiAgICAgICAgLy8gY2FjaGVkIHN0YXRlLgogICAgICAgIF9mYWN0Q2FjaGVbX2ZhY3RDYWNoZVN0YXRlLnZhcmlhYmxlXSA9CiAgICAgICAgICAgIF9mYWN0Q2FjaGVTdGF0ZS5wcmV2aW91c0ZvclZhcmlhYmxlOwogICAgICAgIF9mYWN0Q2FjaGVTdGF0ZSA9IF9mYWN0Q2FjaGVTdGF0ZS5wcmV2aW91czsKICAgICAgfQogICAgfQogICAgYXNzZXJ0KGlkZW50aWNhbChjb21tb25BbmNlc3RvciwgX2ZhY3RDYWNoZVN0YXRlKSk7CiAgICAvLyBSb2xsIGZvcndhcmQgYW55IG1hcCBlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aCBmYWN0cyB0aGF0IGFyZSBuZXdseSBpbgogICAgLy8gZWZmZWN0LiAgU2luY2UgbmV3ZXIgZmFjdHMgbGluayB0byBvbGRlciBvbmVzLCBpdCBpcyBlYXNpZXN0IHRvIGRvIHJvbGwKICAgIC8vIGZvcndhcmQgdGhlIG1vc3QgcmVjZW50IGZhY3RzIGZpcnN0LgogICAgZm9yIChUeXBlUHJvbW90aW9uRmFjdCBuZXdTdGF0ZSA9IF9jdXJyZW50RmFjdHM7CiAgICAgICAgIWlkZW50aWNhbChuZXdTdGF0ZSwgY29tbW9uQW5jZXN0b3IpOwogICAgICAgIG5ld1N0YXRlID0gbmV3U3RhdGUucHJldmlvdXMpIHsKICAgICAgdmFyIGN1cnJlbnRseUNhY2hlZCA9IF9mYWN0Q2FjaGVbbmV3U3RhdGUudmFyaWFibGVdOwogICAgICAvLyBOb3RlOiBTaW5jZSB3ZSByb2xsIGZvcndhcmQgdGhlIG1vc3QgcmVjZW50IGZhY3RzIGZpcnN0LCB3ZSBuZWVkIHRvIGJlCiAgICAgIC8vIGNhcmVmdWwgbm90IHdyaXRlIGFuIG9sZGVyIGZhY3Qgb3ZlciBhIG5ld2VyIG9uZS4KICAgICAgaWYgKGN1cnJlbnRseUNhY2hlZCA9PSBudWxsIHx8CiAgICAgICAgICBuZXdTdGF0ZS5zZXF1ZW5jZU51bWJlciA+IGN1cnJlbnRseUNhY2hlZC5zZXF1ZW5jZU51bWJlcikgewogICAgICAgIF9mYWN0Q2FjaGVbbmV3U3RhdGUudmFyaWFibGVdID0gbmV3U3RhdGU7CiAgICAgIH0KICAgIH0KICAgIF9mYWN0Q2FjaGVTdGF0ZSA9IF9jdXJyZW50RmFjdHM7CiAgICByZXR1cm4gX2ZhY3RDYWNoZTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBzZXQgb2YgZmFjdHMga25vd24gdG8gYmUgdHJ1ZSBhZnRlciB0aGUgZXhlY3V0aW9uIG9mIFtlXQogIC8vLyBhc3N1bWluZyBpdCBldmFsdWF0ZXMgdG8gYGZhbHNlYC4KICAvLy8KICAvLy8gW2VdIG11c3QgYmUgdGhlIG1vc3QgcmVzZW50bHkgcGFyc2VkIGV4cHJlc3Npb24gb3Igc3RhdGVtZW50LgogIFR5cGVQcm9tb3Rpb25GYWN0IF9mYWN0c1doZW5GYWxzZShFeHByZXNzaW9uIGUpIHsKICAgIC8vIFR5cGUgcHJvbW90aW9uIGN1cnJlbnRseSBvbmx5IG9jY3VycyB3aGVuIGFuICJpcyIgb3IgbG9naWNhbCBleHByZXNzaW9uCiAgICAvLyBldmFsdWF0ZXMgdG8gYHRydWVgLCBzbyBubyBzcGVjaWFsIGxvZ2ljIGlzIHJlcXVpcmVkOyB3ZSBqdXN0IHVzZQogICAgLy8gW19jdXJyZW50RmFjdHNdLgogICAgLy8KICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogZXhwZXJpbWVudCB3aXRoIHN1cHBvcnRpbmcgcHJvbW90aW9uIGluIGNhc2VzIGxpa2UKICAgIC8vIGBpZiAoeCBpcyEgVCkgeyAuLi4gfSBlbHNlIHsgLi4uYWNjZXNzIHguLi4gfWAKICAgIHJldHVybiBfY3VycmVudEZhY3RzOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHNldCBvZiBmYWN0cyBrbm93biB0byBiZSB0cnVlIGFmdGVyIHRoZSBleGVjdXRpb24gb2YgW2VdCiAgLy8vIGFzc3VtaW5nIGl0IGV2YWx1YXRlcyB0byBgdHJ1ZWAuCiAgLy8vCiAgLy8vIFtlXSBtdXN0IGJlIHRoZSBtb3N0IHJlc2VudGx5IHBhcnNlZCBleHByZXNzaW9uIG9yIHN0YXRlbWVudC4KICBUeXBlUHJvbW90aW9uRmFjdCBfZmFjdHNXaGVuVHJ1ZShFeHByZXNzaW9uIGUpID0+CiAgICAgIHNhbWVFeHByZXNzaW9ucyhfcHJvbW90aW9uRXhwcmVzc2lvbiwgZSkKICAgICAgICAgID8gX3RydWVGYWN0c0ZvclByb21vdGlvbkV4cHJlc3Npb24KICAgICAgICAgIDogX2N1cnJlbnRGYWN0czsKCiAgLy8vIFJldHVybnMgdGhlIHNldCBvZiBmYWN0cyBrbm93biB0byBiZSB0cnVlIGFmdGVyIHR3byBicmFuY2hlcyBvZiBleGVjdXRpb24KICAvLy8gcmVqb2luLgogIFR5cGVQcm9tb3Rpb25GYWN0IF9tZXJnZUZhY3RzKFR5cGVQcm9tb3Rpb25GYWN0IGEsIFR5cGVQcm9tb3Rpb25GYWN0IGIpIHsKICAgIC8vIFR5cGUgcHJvbW90aW9uIGN1cnJlbnRseSBkb2Vzbid0IHN1cHBvcnQgYW55IG1lY2hhbmlzbSBmb3IgZmFjdHMgdG8KICAgIC8vIGFjY3VtdWxhdGUgYWxvbmcgYSBzdHJhaWdodC1saW5lIGV4ZWN1dGlvbiBwYXRoICh0aGV5IGNhbiBvbmx5IGFjY3VtdWxhdGUKICAgIC8vIHdoZW4gZW50ZXJpbmcgYSBzY29wZSksIHNvIHdlIGNhbiBzaW1wbHkgZmluZCB0aGUgY29tbW9uIGFuY2VzdG9yIGZhY3QuCiAgICAvLwogICAgLy8gVE9ETyhwYXVsYmVycnkpOiBleHBlcmltZW50IHdpdGggc3VwcG9ydGluZyBwcm9tb3Rpb24gaW4gY2FzZXMgbGlrZToKICAgIC8vICAgICBpZiAoLi4uKSB7CiAgICAvLyAgICAgICBpZiAoeCBpcyEgVCkgcmV0dXJuOwogICAgLy8gICAgIH0gZWxzZSB7CiAgICAvLyAgICAgICBpZiAoeCBpcyEgVCkgcmV0dXJuOwogICAgLy8gICAgIH0KICAgIC8vICAgICAuLi5hY2Nlc3MgeC4uLgogICAgd2hpbGUgKGEuc2VxdWVuY2VOdW1iZXIgIT0gYi5zZXF1ZW5jZU51bWJlcikgewogICAgICBpZiAoYS5zZXF1ZW5jZU51bWJlciA+IGIuc2VxdWVuY2VOdW1iZXIpIHsKICAgICAgICBhID0gYS5wcmV2aW91czsKICAgICAgfSBlbHNlIHsKICAgICAgICBiID0gYi5wcmV2aW91czsKICAgICAgfQogICAgfQogICAgYXNzZXJ0KGlkZW50aWNhbChhLCBiKSk7CiAgICByZXR1cm4gYTsKICB9CgogIC8vLyBGb3IgaW50ZXJuYWwgZGVidWdnaW5nIHVzZSwgcHJpbnRzIHRoZSBjdXJyZW50IHN0YXRlIGZvbGxvd2VkIGJ5IHRoZSBldmVudAogIC8vLyBuYW1lLgogIHZvaWQgX3ByaW50RXZlbnQoU3RyaW5nIG5hbWUpIHsKICAgIEl0ZXJhYmxlPFR5cGVQcm9tb3Rpb25GYWN0PiBmYWN0Q2hhaW4oVHlwZVByb21vdGlvbkZhY3QgZmFjdCkgc3luYyogewogICAgICB3aGlsZSAoZmFjdCAhPSBudWxsKSB7CiAgICAgICAgeWllbGQgZmFjdDsKICAgICAgICBmYWN0ID0gZmFjdC5wcmV2aW91c0ZvclZhcmlhYmxlOwogICAgICB9CiAgICB9CgogICAgX2NvbXB1dGVDdXJyZW50RmFjdE1hcCgpLmZvckVhY2goKHZhcmlhYmxlLCBmYWN0KSB7CiAgICAgIGlmIChmYWN0ID09IG51bGwpIHJldHVybjsKICAgICAgcHJpbnQoJyAgJHt2YXJpYWJsZSA/PyAnKG51bGwpJ306ICR7ZmFjdENoYWluKGZhY3QpLmpvaW4oJyAtPiAnKX0nKTsKICAgIH0pOwogICAgaWYgKF9wcm9tb3Rpb25FeHByZXNzaW9uICE9IG51bGwpIHsKICAgICAgcHJpbnQoJyAgX3Byb21vdGlvbkV4cHJlc3Npb246ICRfcHJvbW90aW9uRXhwcmVzc2lvbicpOwogICAgICBpZiAoIWlkZW50aWNhbChfdHJ1ZUZhY3RzRm9yUHJvbW90aW9uRXhwcmVzc2lvbiwgX2N1cnJlbnRGYWN0cykpIHsKICAgICAgICBwcmludCgnICAgIGlmIHRydWU6ICRfdHJ1ZUZhY3RzRm9yUHJvbW90aW9uRXhwcmVzc2lvbicpOwogICAgICB9CiAgICB9CiAgICBwcmludChuYW1lKTsKICB9CgogIC8vLyBSZWNvcmRzIHRoYXQgYWZ0ZXIgdGhlIGV2YWx1YXRpb24gb2YgW2V4cHJlc3Npb25dLCB0aGUgZmFjdHMgd2lsbCBiZQogIC8vLyBbaWZUcnVlXSBvbiBhIGJyYW5jaCB3aGVyZSB0aGUgZXhwcmVzc2lvbiBldmFsdXRlZCB0byBgdHJ1ZWAsIGFuZAogIC8vLyBbaWZGYWxzZV0gb24gYSBicmFuY2ggd2hlcmUgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVkIHRvIGBmYWxzZWAgKG9yIHdoZXJlCiAgLy8vIHRoZSB0cnV0aCB2YWx1ZSBvZiB0aGUgZXhwcmVzaXNvbiBkb2Vzbid0IG1hdHRlcikuCiAgLy8vCiAgLy8vIFRPRE8ocGF1bGJlcnJ5KTogd2hlbiB3ZSBzdGFydCBoYW5kbGluZyBwcm9tb3Rpb24gaW4gImVsc2UiIGNsYXVzZXMsIHdlJ2xsCiAgLy8vIG5lZWQgdG8gc3BsaXQgW2lmRmFsc2VdIGludG8gdHdvIGNhc2VzLCBvbmUgZm9yIHdoZW4gdGhlIGV4cHJlc3Npb24KICAvLy8gZXZhbHVhdGVkIHRvIGBmYWxzZWAsIGFuZCBvbmUgd2hlcmUgdGhlIHRydXRoIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uCiAgLy8vIGRvZXNuJ3QgbWF0dGVyLgogIHZvaWQgX3JlY29yZFByb21vdGlvbkV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uLAogICAgICBUeXBlUHJvbW90aW9uRmFjdCBpZlRydWUsIFR5cGVQcm9tb3Rpb25GYWN0IGlmRmFsc2UpIHsKICAgIF9wcm9tb3Rpb25FeHByZXNzaW9uID0gZXhwcmVzc2lvbjsKICAgIF90cnVlRmFjdHNGb3JQcm9tb3Rpb25FeHByZXNzaW9uID0gaWZUcnVlOwogICAgX2N1cnJlbnRGYWN0cyA9IGlmRmFsc2U7CiAgfQp9CgovLy8gQSBzaW5nbGUgZmFjdCB3aGljaCBpcyBrbm93biB0byB0aGUgdHlwZSBwcm9tb3Rpb24gZW5naW5lIGFib3V0IHRoZSBzdGF0ZSBvZgovLy8gYSB2YXJpYWJsZSAob3IgYWJvdXQgdGhlIGZsb3cgY29udHJvbCBvZiB0aGUgY29tcG9uZW50KS4KLy8vCi8vLyBUaGUgdHlwZSBhcmd1bWVudCBWIHJlcHJlc2VudHMgaXMgdGhlIGNsYXNzIHdoaWNoIHJlcHJlc2VudHMgbG9jYWwgdmFyaWFibGUKLy8vIGRlY2xhcmF0aW9ucy4KLy8vCi8vLyBGYWN0cyBhcmUgbGlua2VkIHRvZ2V0aGVyIGludG8gbGlua2VkIGxpc3RzIHZpYSB0aGUgW3ByZXZpb3VzXSBwb2ludGVyIGludG8KLy8vIGEgZGF0YSBzdHJ1Y3R1cmUgY2FsbGVkIGEgImZhY3QgY2hhaW4iIChvciBzb21ldGltZXMgYSAiZmFjdCBzdGF0ZSIpLCB3aGljaAovLy8gcmVwcmVzZW50cyBhbGwgZmFjdHMgdGhhdCBhcmUga25vd24gdG8gaG9sZCBhdCBhIGNlcnRhaW4gcG9pbnQgaW4gdGhlCi8vLyBjb21wb25lbnQuCi8vLwovLy8gVGhlIGZhY3QgaXMgc2FpZCB0byAiYXBwbHkiIHRvIGEgZ2l2ZW4gcG9pbnQgaW4gdGhlIGV4ZWN1dGlvbiBvZiB0aGUKLy8vIGNvbXBvbmVudCBpZiB0aGUgZmFjdCBpcyBwYXJ0IG9mIHRoZSBjdXJyZW50IGZhY3Qgc3RhdGUgYXQgdGhlIHBvaW50IHRoZQovLy8gcGFyc2VyIHJlYWNoZXMgdGhhdCBwb2ludCBpbiB0aGUgY29tcG9uZW50LgovLy8KLy8vIE5vdGU6IGp1c3QgYmVjYXVzZSBhIGZhY3QgImFwcGxpZXMiIHRvIGEgZ2l2ZW4gcG9pbnQgaW4gdGhlIGV4ZWN1dGlvbiBvZgovLy8gdGhlIGNvbXBvbmVudCBkb2Vzbid0IG1lYW4gYSB0eXBlIHdpbGwgYmUgcHJvbW90ZWQtLWl0IHNpbXBseSBtZWFucyB0aGF0Ci8vLyB0aGUgZmFjdCB3YXMgZGVkdWNlZCBhdCBhIHByZXZpb3VzIHBvaW50IGluIHRoZSBzdHJhaWdodCBsaW5lIGV4ZWN1dGlvbiBvZgovLy8gdGhlIGNvZGUuICBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIGZhY3Qgd2lsbCBiZSBvdmVyc2hhZG93ZWQgYnkgYSBsYXRlcgovLy8gZmFjdCwgb3IgaXRzIGVmZmVjdCB3aWxsIGJlIGNhbmNlbGxlZCBieSBhIGxhdGVyIGFzc2lnbm1lbnQuICBUaGUgZmluYWwKLy8vIGRldGVtaW5hdGlvbiBvZiB3aGV0aGVyIHByb21vdGlvbiBvY2N1cnMgaXMgbGVmdCB0byBbX2NvbXB1dGVQcm9tb3RlZFR5cGVdLgphYnN0cmFjdCBjbGFzcyBUeXBlUHJvbW90aW9uRmFjdCB7CiAgLy8vIFRoZSB2YXJpYWJsZSB0aGlzIGZhY3QgcmVjb3JkcyBpbmZvcm1hdGlvbiBhYm91dCwgb3IgYG51bGxgIGlmIHRoaXMgZmFjdAogIC8vLyByZWNvcmRzIGluZm9ybWF0aW9uIGFib3V0IGdlbmVyYWwgZmxvdyBjb250cm9sLgogIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGU7CgogIC8vLyBUaGUgZmFjdCBjaGFpbiB0aGF0IHdhcyBpbiBlZmZlY3QgcHJpb3IgdG8gZXhlY3V0aW9uIG9mIHRoZSBzdGF0ZW1lbnQgb3IKICAvLy8gZXhwcmVzc2lvbiB0aGF0IGNhdXNlZCB0aGlzIGZhY3QgdG8gYmUgdHJ1ZS4KICBmaW5hbCBUeXBlUHJvbW90aW9uRmFjdCBwcmV2aW91czsKCiAgLy8vIEludGVnZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmFjdC4gIEVhY2ggdGltZSBhIGZhY3QgaXMgY3JlYXRlZCBpdCBpcwogIC8vLyBnaXZlbiBhIHNlcXVlbmNlIG51bWJlciBvbmUgZ3JlYXRlciB0aGFuIHRoZSBwcmV2aW91c2x5IGdlbmVyYXRlZCBmYWN0LgogIC8vLyBUaGlzIHNpbXBsaWZpZXMgdGhlIGFsZ29yaXRobSBmb3IgZmluZGluZyB0aGUgY29tbW9uIGFuY2VzdG9yIG9mIHR3bwogIC8vLyBmYWN0czsgd2UgcmVwZWF0ZWRseSB3YWxrIGJhY2t3YXJkIHRoZSBmYWN0IHdpdGggdGhlIGxhcmdlciBzZXF1ZW5jZQogIC8vLyBudW1iZXIgdW50aWwgdGhlIHNlcXVlbmNlIG51bWJlcnMgYXJlIHRoZSBzYW1lLgogIGZpbmFsIGludCBzZXF1ZW5jZU51bWJlcjsKCiAgLy8vIFRoZSBtb3N0IHJlY2VudCBmYWN0IGFwcGVhcmluZyBpbiB0aGUgZmFjdCBjaGFpbiBbcHJldmlvdXNdIHdob3NlCiAgLy8vIFt2YXJpYWJsZV0gbWF0Y2hlcyB0aGlzIG9uZSwgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vIHN1Y2ggZmFjdC4KICBmaW5hbCBUeXBlUHJvbW90aW9uRmFjdCBwcmV2aW91c0ZvclZhcmlhYmxlOwoKICAvLy8gVGhlIGZ1bmN0aW9uIG5lc3RpbmcgbGV2ZWwgb2YgdGhlIGV4cHJlc3Npb24gdGhhdCBsZWQgdG8gdGhpcyBmYWN0LgogIGZpbmFsIGludCBmdW5jdGlvbk5lc3RpbmdMZXZlbDsKCiAgLy8vIElmIHRoaXMgZmFjdCdzIHZhcmlhYmxlIHdhcyBtdXRhdGVkIHdpdGhpbiBhbnkgc2NvcGVzIHRoZQogIC8vLyBmYWN0IGFwcGxpZXMgdG8sIGEgc2V0IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNjb3Blcy4gIE90aGVyd2lzZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFRPRE8ocGF1bGJlcnJ5KTogdGhlIHNpemUgb2YgdGhpcyBzZXQgaXMgcHJvYmFibHkgdmVyeSBzbWFsbCBtb3N0IG9mIHRoZQogIC8vLyB0aW1lLiAgV291bGQgaXQgYmUgYmV0dGVyIHRvIHVzZSBhIGxpc3Q/CiAgU2V0PFR5cGVQcm9tb3Rpb25TY29wZT4gX211dGF0ZWRJblNjb3BlczsKCiAgLy8vIElmIHRoaXMgZmFjdCdzIHZhcmlhYmxlIHdhcyBhY2Nlc3NlZCBpbnNpZGUgYSBjbG9zdXJlIHdpdGhpbiBhbnkgc2NvcGVzCiAgLy8vIHRoZSBmYWN0IGFwcGxpZXMgdG8sIGEgc2V0IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNjb3Blcy4gIE90aGVyd2lzZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFRPRE8ocGF1bGJlcnJ5KTogdGhlIHNpemUgb2YgdGhpcyBzZXQgaXMgcHJvYmFibHkgdmVyeSBzbWFsbCBtb3N0IG9mIHRoZQogIC8vLyB0aW1lLiAgV291bGQgaXQgYmUgYmV0dGVyIHRvIHVzZSBhIGxpc3Q/CiAgU2V0PFR5cGVQcm9tb3Rpb25TY29wZT4gX2FjY2Vzc2VkSW5DbG9zdXJlSW5TY29wZXM7CgogIFR5cGVQcm9tb3Rpb25GYWN0KHRoaXMuc2VxdWVuY2VOdW1iZXIsIHRoaXMudmFyaWFibGUsIHRoaXMucHJldmlvdXMsCiAgICAgIHRoaXMucHJldmlvdXNGb3JWYXJpYWJsZSwgdGhpcy5mdW5jdGlvbk5lc3RpbmdMZXZlbCk7CgogIC8vLyBDb21wdXRlcyB0aGUgcHJvbW90ZWQgdHlwZSBmb3IgW3ZhcmlhYmxlXSBhdCBhIGxvY2F0aW9uIGluIHRoZSBjb2RlIHdoZXJlCiAgLy8vIHRoaXMgZmFjdCBhcHBsaWVzLgogIC8vLwogIC8vLyBTaG91bGQgbm90IGJlIGNhbGxlZCB1bnRpbCBhZnRlciBwYXJzaW5nIG9mIHRoZSBlbnRpcmUgbWV0aG9kIGlzIGNvbXBsZXRlLgogIERhcnRUeXBlIF9jb21wdXRlUHJvbW90ZWRUeXBlKAogICAgICBUeXBlUHJvbW90ZXJJbXBsIHByb21vdGVyLCBUeXBlUHJvbW90aW9uU2NvcGUgc2NvcGUpOwoKICAvLy8gUmVjb3JkcyB0aGUgZmFjdCB0aGF0IHRoZSB2YXJpYWJsZSByZWZlcmVuY2VkIGJ5IFtmYWN0XSB3YXMgYWNjZXNzZWQKICAvLy8gd2l0aGluIHRoZSBnaXZlbiBzY29wZSwgYXQgdGhlIGdpdmVuIGZ1bmN0aW9uIG5lc3RpbmcgbGV2ZWwuCiAgLy8vCiAgLy8vIElmIGBudWxsYCBpcyBwYXNzZWQgaW4gZm9yIFtmYWN0XSwgdGhlcmUgaXMgbm8gZWZmZWN0LgogIHN0YXRpYyB2b2lkIF9yZWNvcmRBY2Nlc3NlZEluU2NvcGUoVHlwZVByb21vdGlvbkZhY3QgZmFjdCwKICAgICAgVHlwZVByb21vdGlvblNjb3BlIHNjb3BlLCBpbnQgZnVuY3Rpb25OZXN0aW5nTGV2ZWwpIHsKICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogbWFrZSBzb21lIGludGVncmF0aW9uIHRlc3QgY2FzZXMgdGhhdCBleGVyY2lzZSB0aGUKICAgIC8vIGJlaGF2aW9ycyBvZiB0aGlzIGZ1bmN0aW9uLiAgSW4gcGFydGljdWxhciB2ZXJpZnkgdGhhdCBpdCdzIGNvcnJlY3QgdG8KICAgIC8vIHRlc3QgZnVuY3Rpb25OZXN0aW5nTGV2ZWwgYWdhaW5zdCBmYWN0LmZ1bmN0aW9uTmVzdGluZ0xldmVsIChhcyBvcHBvc2VkCiAgICAvLyB0byB0ZXN0aW5nIGl0IGFnYWluc3QgZ2V0VmFyaWFibGVGdW5jdGlvbk5lc3RpbmdMZXZlbCh2YXJpYWJsZSkpLgogICAgd2hpbGUgKGZhY3QgIT0gbnVsbCkgewogICAgICBpZiAoZnVuY3Rpb25OZXN0aW5nTGV2ZWwgPiBmYWN0LmZ1bmN0aW9uTmVzdGluZ0xldmVsKSB7CiAgICAgICAgZmFjdC5fYWNjZXNzZWRJbkNsb3N1cmVJblNjb3BlcyA/Pz0KICAgICAgICAgICAgbmV3IFNldDxUeXBlUHJvbW90aW9uU2NvcGU+LmlkZW50aXR5KCk7CiAgICAgICAgaWYgKCFmYWN0Ll9hY2Nlc3NlZEluQ2xvc3VyZUluU2NvcGVzLmFkZChzY29wZSkpIHJldHVybjsKICAgICAgfQogICAgICBmYWN0ID0gZmFjdC5wcmV2aW91c0ZvclZhcmlhYmxlOwogICAgfQogIH0KCiAgLy8vIFJlY29yZHMgdGhlIGZhY3QgdGhhdCB0aGUgdmFyaWFibGUgcmVmZXJlbmNlZCBieSBbZmFjdF0gd2FzIG11dGF0ZWQKICAvLy8gd2l0aGluIHRoZSBnaXZlbiBzY29wZS4KICAvLy8KICAvLy8gSWYgYG51bGxgIGlzIHBhc3NlZCBpbiBmb3IgW2ZhY3RdLCB0aGVyZSBpcyBubyBlZmZlY3QuCiAgc3RhdGljIHZvaWQgX3JlY29yZE11dGF0ZWRJblNjb3BlKAogICAgICBUeXBlUHJvbW90aW9uRmFjdCBmYWN0LCBUeXBlUHJvbW90aW9uU2NvcGUgc2NvcGUpIHsKICAgIHdoaWxlIChmYWN0ICE9IG51bGwpIHsKICAgICAgZmFjdC5fbXV0YXRlZEluU2NvcGVzID8/PSBuZXcgU2V0PFR5cGVQcm9tb3Rpb25TY29wZT4uaWRlbnRpdHkoKTsKICAgICAgaWYgKCFmYWN0Ll9tdXRhdGVkSW5TY29wZXMuYWRkKHNjb3BlKSkgcmV0dXJuOwogICAgICBmYWN0ID0gZmFjdC5wcmV2aW91c0ZvclZhcmlhYmxlOwogICAgfQogIH0KfQoKLy8vIFJlcHJlc2VudHMgYSBjb250aWd1b3VzIGJsb2NrIG9mIHByb2dyYW0gdGV4dCBpbiB3aGljaCB2YXJpYWJsZXMgbWF5IG9yIG1heQovLy8gbm90IGJlIHByb21vdGVkLiAgQWxzbyB1c2VkIGFzIGEgc3RhY2sgdG8ga2VlcCB0cmFjayBvZiBzdGF0ZSB3aGlsZSB0aGUKLy8vIG1ldGhvZCBpcyBiZWluZyBwYXJzZWQuCmNsYXNzIFR5cGVQcm9tb3Rpb25TY29wZSB7CiAgLy8vIFRoZSBuZXN0aW5nIGRlcHRoIG9mIHRoaXMgc2NvcGUuICBUaGUgb3V0ZXJtb3N0IHNjb3BlIChyZXByZXNlbnRpbmcgdGhlCiAgLy8vIHdob2xlIG1ldGhvZCBib2R5KSBoYXMgYSBkZXB0aCBvZiAwLgogIGZpbmFsIGludCBfZGVwdGg7CgogIC8vLyBUaGUgW1R5cGVQcm9tb3Rpb25TY29wZV0gcmVwcmVzZW50aW5nIHRoZSBzY29wZSBlbmNsb3NpbmcgdGhpcyBvbmUuCiAgZmluYWwgVHlwZVByb21vdGlvblNjb3BlIF9lbmNsb3Npbmc7CgogIFR5cGVQcm9tb3Rpb25TY29wZSh0aGlzLl9lbmNsb3NpbmcpIDogX2RlcHRoID0gX2VuY2xvc2luZy5fZGVwdGggKyAxOwoKICBjb25zdCBUeXBlUHJvbW90aW9uU2NvcGUuX3RvcExldmVsKCkKICAgICAgOiBfZW5jbG9zaW5nID0gbnVsbCwKICAgICAgICBfZGVwdGggPSAwOwoKICAvLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgc2NvcGUgY29tcGxldGVseSBlbmNsb3NlcyAob3IgaXMgdGhlIHNhbWUgYXMpCiAgLy8vIFtvdGhlcl0uCiAgYm9vbCBjb250YWluc1Njb3BlKFR5cGVQcm9tb3Rpb25TY29wZSBvdGhlcikgewogICAgaWYgKHRoaXMuX2RlcHRoID4gb3RoZXIuX2RlcHRoKSB7CiAgICAgIC8vIFdlIGNhbid0IHBvc3NpYmx5IGNvbnRhaW4gYSBzY29wZSBpZiB3ZSBhcmUgYXQgZ3JlYXRlciBuZXN0aW5nIGRlcHRoCiAgICAgIC8vIHRoYW4gaXQgaXMuCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHdoaWxlICh0aGlzLl9kZXB0aCA8IG90aGVyLl9kZXB0aCkgewogICAgICBvdGhlciA9IG90aGVyLl9lbmNsb3Npbmc7CiAgICB9CiAgICByZXR1cm4gaWRlbnRpY2FsKHRoaXMsIG90aGVyKTsKICB9Cn0KCi8vLyBbVHlwZVByb21vdGlvblNjb3BlXSByZXByZXNlbnRpbmcgdGhlICJ0aGVuIiBhbmQgImVsc2UiIGJvZGllcyBvZiBhbiAiaWYiCi8vLyBzdGF0ZW1lbnQgb3IgY29uZGl0aW9uYWwgZXhwcmVzc2lvbi4KY2xhc3MgX0NvbmRpdGlvbmFsU2NvcGUgZXh0ZW5kcyBUeXBlUHJvbW90aW9uU2NvcGUgewogIC8vLyBUaGUgZmFjdCBzdGF0ZSBpbiBlZmZlY3QgYXQgdGhlIHRvcCBvZiB0aGUgImVsc2UiIGJsb2NrLgogIGZpbmFsIFR5cGVQcm9tb3Rpb25GYWN0IGJlZm9yZUVsc2U7CgogIC8vLyBUaGUgZmFjdCBzdGF0ZSB3aGljaCB3YXMgaW4gZWZmZWN0IGF0IHRoZSBib3R0b20gb2YgdGhlICJ0aGVuIiBibG9jay4KICBUeXBlUHJvbW90aW9uRmFjdCBhZnRlclRydWU7CgogIF9Db25kaXRpb25hbFNjb3BlKFR5cGVQcm9tb3Rpb25TY29wZSBlbmNsb3NpbmcsIHRoaXMuYmVmb3JlRWxzZSkKICAgICAgOiBzdXBlcihlbmNsb3NpbmcpOwp9CgovLy8gW1R5cGVQcm9tb3Rpb25GYWN0XSByZXByZXNlbnRpbmcgYW4gImlzIiBjaGVjayB3aGljaCBzdWNjZWVkZWQuCmNsYXNzIF9Jc0NoZWNrIGV4dGVuZHMgVHlwZVByb21vdGlvbkZhY3QgewogIC8vLyBUaGUgdHlwZSBhcHBlYXJpbmcgb24gdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiAiaXMiLgogIGZpbmFsIERhcnRUeXBlIGNoZWNrZWRUeXBlOwoKICBfSXNDaGVjaygKICAgICAgaW50IHNlcXVlbmNlTnVtYmVyLAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLAogICAgICBUeXBlUHJvbW90aW9uRmFjdCBwcmV2aW91cywKICAgICAgVHlwZVByb21vdGlvbkZhY3QgcHJldmlvdXNGb3JWYXJpYWJsZSwKICAgICAgaW50IGZ1bmN0aW9uTmVzdGluZ0xldmVsLAogICAgICB0aGlzLmNoZWNrZWRUeXBlKQogICAgICA6IHN1cGVyKHNlcXVlbmNlTnVtYmVyLCB2YXJpYWJsZSwgcHJldmlvdXMsIHByZXZpb3VzRm9yVmFyaWFibGUsCiAgICAgICAgICAgIGZ1bmN0aW9uTmVzdGluZ0xldmVsKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ2lzQ2hlY2soJGNoZWNrZWRUeXBlKSc7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIF9jb21wdXRlUHJvbW90ZWRUeXBlKAogICAgICBUeXBlUHJvbW90ZXJJbXBsIHByb21vdGVyLCBUeXBlUHJvbW90aW9uU2NvcGUgc2NvcGUpIHsKICAgIHZhciBwcmV2aW91c1Byb21vdGVkVHlwZSA9CiAgICAgICAgcHJldmlvdXNGb3JWYXJpYWJsZT8uX2NvbXB1dGVQcm9tb3RlZFR5cGUocHJvbW90ZXIsIHNjb3BlKTsKCiAgICAvLyBJZiB0aGUgdmFyaWFibGUgd2FzIG11dGF0ZWQgc29tZXdoZXJlIGluIHRoZSBzY29wZSBvZiB0aGUgcG90ZW50aWFsCiAgICAvLyBwcm9tb3Rpb24sIHByb21vdGlvbiBkb2VzIG5vdCBvY2N1ci4KICAgIGlmIChfbXV0YXRlZEluU2NvcGVzICE9IG51bGwpIHsKICAgICAgZm9yICh2YXIgYXNzaWdubWVudFNjb3BlIGluIF9tdXRhdGVkSW5TY29wZXMpIHsKICAgICAgICBpZiAoYXNzaWdubWVudFNjb3BlLmNvbnRhaW5zU2NvcGUoc2NvcGUpKSB7CiAgICAgICAgICByZXR1cm4gcHJldmlvdXNQcm9tb3RlZFR5cGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gSWYgdGhlIHZhcmlhYmxlIHdhcyBtdXRhdGVkIGFueXdoZXJlLCBhbmQgaXQgd2FzIGFjY2Vzc2VkIGluc2lkZSBhCiAgICAvLyBjbG9zdXJlIHNvbWV3aGVyZSBpbiB0aGUgc2NvcGUgb2YgdGhlIHBvdGVudGlhbCBwcm9tb3Rpb24sIHByb21vdGlvbiBkb2VzCiAgICAvLyBub3Qgb2NjdXIuCiAgICBpZiAocHJvbW90ZXIud2FzVmFyaWFibGVNdXRhdGVkQW55d2hlcmUodmFyaWFibGUpICYmCiAgICAgICAgX2FjY2Vzc2VkSW5DbG9zdXJlSW5TY29wZXMgIT0gbnVsbCkgewogICAgICBmb3IgKHZhciBhY2Nlc3NTY29wZSBpbiBfYWNjZXNzZWRJbkNsb3N1cmVJblNjb3BlcykgewogICAgICAgIGlmIChhY2Nlc3NTY29wZS5jb250YWluc1Njb3BlKHNjb3BlKSkgewogICAgICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbW90ZWRUeXBlOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIFdoYXQgd2UgZG8gbm93IGRlcGVuZHMgb24gdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBwcmV2aW91cyB0eXBlIG9mCiAgICAvLyB0aGUgdmFyaWFibGUgYW5kIHRoZSB0eXBlIHdlIGFyZSBjaGVja2luZyBhZ2FpbnN0LgogICAgdmFyIHByZXZpb3VzVHlwZSA9IHByZXZpb3VzUHJvbW90ZWRUeXBlID8/IHZhcmlhYmxlLnR5cGU7CiAgICBpZiAocHJvbW90ZXIudHlwZVNjaGVtYUVudmlyb25tZW50LmlzU3VidHlwZU9mKGNoZWNrZWRUeXBlLCBwcmV2aW91c1R5cGUpKSB7CiAgICAgIC8vIFRoZSB0eXBlIHdlIGFyZSBjaGVja2luZyBhZ2FpbnN0IGlzIGEgc3VidHlwZSBvZiB0aGUgcHJldmlvdXMgdHlwZSBvZgogICAgICAvLyB0aGUgdmFyaWFibGUsIHNvIHRoaXMgaXMgYSByZWZpbmVtZW50OyB3ZSBjYW4gcHJvbW90ZS4KICAgICAgcmV0dXJuIGNoZWNrZWRUeXBlOwogICAgfSBlbHNlIGlmIChwcmV2aW91c1R5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGUgJiYKICAgICAgICBwcm9tb3Rlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAgICAgLmlzU3VidHlwZU9mKGNoZWNrZWRUeXBlLCBwcmV2aW91c1R5cGUuYm91bmQpKSB7CiAgICAgIC8vIFRoZSB0eXBlIHdlIGFyZSBjaGVja2luZyBhZ2FpbnN0IGlzIGEgc3VidHlwZSBvZiB0aGUgYm91bmQgb2YgdGhlCiAgICAgIC8vIHByZXZpb3VzIHR5cGUgb2YgdGhlIHZhcmlhYmxlOyB3ZSBjYW4gcHJvbW90ZSB0aGUgYm91bmQuCiAgICAgIHJldHVybiBuZXcgVHlwZVBhcmFtZXRlclR5cGUocHJldmlvdXNUeXBlLnBhcmFtZXRlciwgY2hlY2tlZFR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgLy8gVGhlIHR5cGVzIGFyZW4ndCBzdWZmaWNpZW50bHkgcmVsYXRlZDsgd2UgY2FuJ3QgcHJvbW90ZS4KICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbW90ZWRUeXBlOwogICAgfQogIH0KfQoKLy8vIFtUeXBlUHJvbW90aW9uU2NvcGVdIHJlcHJlc2VudGluZyB0aGUgUkhTIG9mIGEgbG9naWNhbCBleHByZXNzaW9uLgpjbGFzcyBfTG9naWNhbFNjb3BlIGV4dGVuZHMgVHlwZVByb21vdGlvblNjb3BlIHsKICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGxvZ2ljYWwgb3BlcmF0aW9uIGlzIGFuIGAmJmAgb3IgYW4gYHx8YC4KICBmaW5hbCBib29sIGlzQW5kOwoKICAvLy8gVGhlIGZhY3Qgc3RhdGUgaW4gZWZmZWN0IGlmIHRoZSBsb2dpY2FsIGV4cHJlc3Npb24gZ2V0cyBzaG9ydC1jdXQuCiAgZmluYWwgVHlwZVByb21vdGlvbkZhY3Qgc2hvcnRjdXRGYWN0czsKCiAgX0xvZ2ljYWxTY29wZShUeXBlUHJvbW90aW9uU2NvcGUgZW5jbG9zaW5nLCB0aGlzLmlzQW5kLCB0aGlzLnNob3J0Y3V0RmFjdHMpCiAgICAgIDogc3VwZXIoZW5jbG9zaW5nKTsKfQoKLy8vIEluc3RhbmNlIG9mIFtUeXBlUHJvbW90aW9uRmFjdF0gcmVwcmVzZW50aW5nIHRoZSBmYWN0cyB3aGljaCBhcmUga25vd24gb24KLy8vIGVudHJ5IHRvIHRoZSBtZXRob2QgKGkuZS4gbm90aGluZykuCmNsYXNzIF9OdWxsRmFjdCBleHRlbmRzIFR5cGVQcm9tb3Rpb25GYWN0IHsKICBfTnVsbEZhY3QoKSA6IHN1cGVyKDAsIG51bGwsIG51bGwsIG51bGwsIDApOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnbnVsbCc7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIF9jb21wdXRlUHJvbW90ZWRUeXBlKAogICAgICBUeXBlUHJvbW90ZXIgcHJvbW90ZXIsIFR5cGVQcm9tb3Rpb25TY29wZSBzY29wZSkgewogICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoJ1RyaWVkIHRvIGNyZWF0ZSBwcm9tb3RlZCB0eXBlIGZvciBubyB2YXJpYWJsZScpOwogIH0KfQoKLy8vIEluc3RhbmNlIG9mIFtUeXBlUHJvbW90aW9uU2NvcGVdIHJlcHJlc2VudGluZyB0aGUgZW50aXJlIG1ldGhvZCBib2R5LgpjbGFzcyBfVG9wTGV2ZWxTY29wZSBleHRlbmRzIFR5cGVQcm9tb3Rpb25TY29wZSB7CiAgY29uc3QgX1RvcExldmVsU2NvcGUoKSA6IHN1cGVyLl90b3BMZXZlbCgpOwp9CoLeAE1OPwEhRwFIATABQwFCAUIET0xQUEpNTQRQSlFOQQRNTkoeGgFGIgFCATAnAVA5BlEfIFABSw4UAUxEQAFRSyIoAUs9GgFOH0wBOxMBUEsNBk5LJj8BSiA/TgFKD08CAUoESzUyNAEMLwEMUSQMAQwWAQxCAQwqAQwcAQxOAQwVAQwmRQwBDD9QAQxRAgFIBEtONDc1AU0XBjoeAUskBlAlQQFLJSUBTkwOIwFRUD0jAU4/MjYBUUo9AUwPIwFIOAFMJiQaIwQBDDgBDCBRJzQEAU9JTSEaBAEMFR0tUC4lSiYEAQxBKkUpK0ZLLBRRSTQ0BAEMKR1LLzFOMkZJHwQBDBsjLS5BBAEMTSkpLhdJPA0iHTshBgQBDBQcLBc+MQ4RBgQBDCZAJDMuNBEEAVFFAQw/TyExICMSFyweDxdIBgQBTw4GSkwROwFKD1AiM0JMLQYqBAFKMDQBT0EBREIBTRhBAUE4SU1LUEdRDjZOTE9BMg9PTxkvMTQIBjhMTyw1Lig7UDslRjIIBiUXBAFLKAZENE9JGAdLNhoEAUsnBkQ0Ly0bAVAOTEtRTwdMFiIUIg0aMzEYDxgIBh0OBAFRDCJKHRQpCAYBOCBLCCg+SUEIBhEEAUtIUDkGUUpMFjk9Jy8dBAIBUT0EUBIEUFBKDwRJTTAETU1PS0xQI082JgFPMyQBTE5LSzYcAUhHLwFKIgFATQZPLywBTlEGTy82AUc8AVAZBlEhPAFLQwY9PTxLTk9JGz4sNEEIJwYEAUoeBj0lOhtINScGBAIBUEwcG04rFAFKJwFIAScbFAFMDzEmThUUBikgBiMEAgFOKTU/JgFMHwFDGgIBRCs5HgEMGiQiLSAYRyMBDDABDCE9H0QBSywkNjQnCggGAUpREjkuPDAnCggGAU86PlFPQBo0Jz1LQkkNQiMGBAIBRzFFFAFJKQFOGgIBTigsLwEMHwEMITlLBAIBSjIuAgE+cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL3R5cGVfcHJvbW90aW9uLmRhcnRQc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL3R5cGVfc2NoZW1hX2VsaW1pbmF0aW9uLmRhcnSUvC8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UubWQgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93IERhcnRUeXBlLCBEeW5hbWljVHlwZSwgRnVuY3Rpb25UeXBlLCBJbnRlcmZhY2VUeXBlLCBOYW1lZFR5cGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgc2hvdyBDb3JlVHlwZXM7CgppbXBvcnQgJ3R5cGVfc2NoZW1hLmRhcnQnIHNob3cgVHlwZVNjaGVtYVZpc2l0b3IsIFVua25vd25UeXBlOwoKLy8vIFJldHVybnMgdGhlIGdyZWF0ZXN0IGNsb3N1cmUgb2YgdGhlIGdpdmVuIHR5cGUgW3NjaGVtYV0gd2l0aCByZXNwZWN0IHRvIGA/YC4KLy8vCi8vLyBUaGUgZ3JlYXRlc3QgY2xvc3VyZSBvZiBhIHR5cGUgc2NoZW1hIGBQYCB3aXRoIHJlc3BlY3QgdG8gYD9gIGlzIGRlZmluZWQgYXMKLy8vIGBQYCB3aXRoIGV2ZXJ5IGNvdmFyaWFudCBvY2N1cnJlbmNlIG9mIGA/YCByZXBsYWNlZCB3aXRoIGBOdWxsYCwgYW5kIGV2ZXJ5Ci8vLyBjb250cmF2YXJpYW50IG9jY3VycmVuY2Ugb2YgYD9gIHJlcGxhY2VkIHdpdGggYE9iamVjdGAuCi8vLwovLy8gSWYgdGhlIHNjaGVtYSBjb250YWlucyBubyBpbnN0YW5jZXMgb2YgYD9gLCB0aGUgb3JpZ2luYWwgc2NoZW1hIG9iamVjdCBpcwovLy8gcmV0dXJuZWQgdG8gYXZvaWQgdW5uZWNlc3NhcnkgYWxsb2NhdGlvbi4KLy8vCi8vLyBOb3RlIHRoYXQgdGhlIGNsb3N1cmUgb2YgYSB0eXBlIHNjaGVtYSBpcyBhIHByb3BlciB0eXBlLgovLy8KLy8vIE5vdGUgdGhhdCB0aGUgZ3JlYXRlc3QgY2xvc3VyZSBvZiBhIHR5cGUgc2NoZW1hIGlzIGFsd2F5cyBhIHN1cGVydHlwZSBvZiBhbnkKLy8vIHR5cGUgd2hpY2ggbWF0Y2hlcyB0aGUgc2NoZW1hLgpEYXJ0VHlwZSBncmVhdGVzdENsb3N1cmUoQ29yZVR5cGVzIGNvcmVUeXBlcywgRGFydFR5cGUgc2NoZW1hKSA9PgogICAgX1R5cGVTY2hlbWFFbGltaW5hdGlvblZpc2l0b3IucnVuKGNvcmVUeXBlcywgZmFsc2UsIHNjaGVtYSk7CgovLy8gUmV0dXJucyB0aGUgbGVhc3QgY2xvc3VyZSBvZiB0aGUgZ2l2ZW4gdHlwZSBbc2NoZW1hXSB3aXRoIHJlc3BlY3QgdG8gYD9gLgovLy8KLy8vIFRoZSBsZWFzdCBjbG9zdXJlIG9mIGEgdHlwZSBzY2hlbWEgYFBgIHdpdGggcmVzcGVjdCB0byBgP2AgaXMgZGVmaW5lZCBhcwovLy8gYFBgIHdpdGggZXZlcnkgY292YXJpYW50IG9jY3VycmVuY2Ugb2YgYD9gIHJlcGxhY2VkIHdpdGggYE9iamVjdGAsIGFuZCBldmVyeQovLy8gY29udHJhdmFyaWFudCBvY2N1cnJlbmNlIG9mIGA/YCByZXBsYWNlZCB3aXRoIGBOdWxsYC4KLy8vCi8vLyBJZiB0aGUgc2NoZW1hIGNvbnRhaW5zIG5vIGluc3RhbmNlcyBvZiBgP2AsIHRoZSBvcmlnaW5hbCBzY2hlbWEgb2JqZWN0IGlzCi8vLyByZXR1cm5lZCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBhbGxvY2F0aW9uLgovLy8KLy8vIE5vdGUgdGhhdCB0aGUgY2xvc3VyZSBvZiBhIHR5cGUgc2NoZW1hIGlzIGEgcHJvcGVyIHR5cGUuCi8vLwovLy8gTm90ZSB0aGF0IHRoZSBsZWFzdCBjbG9zdXJlIG9mIGEgdHlwZSBzY2hlbWEgaXMgYWx3YXlzIGEgc3VidHlwZSBvZiBhbnkgdHlwZQovLy8gd2hpY2ggbWF0Y2hlcyB0aGUgc2NoZW1hLgpEYXJ0VHlwZSBsZWFzdENsb3N1cmUoQ29yZVR5cGVzIGNvcmVUeXBlcywgRGFydFR5cGUgc2NoZW1hKSA9PgogICAgX1R5cGVTY2hlbWFFbGltaW5hdGlvblZpc2l0b3IucnVuKGNvcmVUeXBlcywgdHJ1ZSwgc2NoZW1hKTsKCi8vLyBWaXNpdG9yIHRoYXQgY29tcHV0ZXMgbGVhc3QgYW5kIGdyZWF0ZXN0IGNsb3N1cmVzIG9mIGEgdHlwZSBzY2hlbWEuCi8vLwovLy8gRWFjaCB2aXNpdG9yIG1ldGhvZCByZXR1cm5zIGBudWxsYCBpZiB0aGVyZSBhcmUgbm8gYD9gcyBjb250YWluZWQgaW4gdGhlCi8vLyB0eXBlLCBvdGhlcndpc2UgaXQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIHN1YnN0aXR1dGluZyBgP2Agd2l0aCBgTnVsbGAgb3IKLy8vIGBPYmplY3RgLCBhcyBhcHByb3ByaWF0ZS4KY2xhc3MgX1R5cGVTY2hlbWFFbGltaW5hdGlvblZpc2l0b3IgZXh0ZW5kcyBUeXBlU2NoZW1hVmlzaXRvcjxEYXJ0VHlwZT4gewogIGZpbmFsIERhcnRUeXBlIG51bGxUeXBlOwoKICBib29sIGlzTGVhc3RDbG9zdXJlOwoKICBfVHlwZVNjaGVtYUVsaW1pbmF0aW9uVmlzaXRvcihDb3JlVHlwZXMgY29yZVR5cGVzLCB0aGlzLmlzTGVhc3RDbG9zdXJlKQogICAgICA6IG51bGxUeXBlID0gY29yZVR5cGVzLm51bGxDbGFzcy5yYXdUeXBlOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSkgewogICAgRGFydFR5cGUgbmV3UmV0dXJuVHlwZSA9IG5vZGUucmV0dXJuVHlwZS5hY2NlcHQodGhpcyk7CiAgICBpc0xlYXN0Q2xvc3VyZSA9ICFpc0xlYXN0Q2xvc3VyZTsKICAgIExpc3Q8RGFydFR5cGU+IG5ld1Bvc2l0aW9uYWxQYXJhbWV0ZXJzID0gbnVsbDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgICBEYXJ0VHlwZSBzdWJzdGl0dXRpb24gPSBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldLmFjY2VwdCh0aGlzKTsKICAgICAgaWYgKHN1YnN0aXR1dGlvbiAhPSBudWxsKSB7CiAgICAgICAgbmV3UG9zaXRpb25hbFBhcmFtZXRlcnMgPz89CiAgICAgICAgICAgIG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICAgICAgbmV3UG9zaXRpb25hbFBhcmFtZXRlcnNbaV0gPSBzdWJzdGl0dXRpb247CiAgICAgIH0KICAgIH0KICAgIExpc3Q8TmFtZWRUeXBlPiBuZXdOYW1lZFBhcmFtZXRlcnMgPSBudWxsOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLm5hbWVkUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgICBEYXJ0VHlwZSBzdWJzdGl0dXRpb24gPSBub2RlLm5hbWVkUGFyYW1ldGVyc1tpXS50eXBlLmFjY2VwdCh0aGlzKTsKICAgICAgaWYgKHN1YnN0aXR1dGlvbiAhPSBudWxsKSB7CiAgICAgICAgbmV3TmFtZWRQYXJhbWV0ZXJzID8/PSBub2RlLm5hbWVkUGFyYW1ldGVycy50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICAgICAgICBuZXdOYW1lZFBhcmFtZXRlcnNbaV0gPQogICAgICAgICAgICBuZXcgTmFtZWRUeXBlKG5vZGUubmFtZWRQYXJhbWV0ZXJzW2ldLm5hbWUsIHN1YnN0aXR1dGlvbik7CiAgICAgIH0KICAgIH0KICAgIGlzTGVhc3RDbG9zdXJlID0gIWlzTGVhc3RDbG9zdXJlOwogICAgRGFydFR5cGUgdHlwZWRlZlR5cGUgPSBub2RlLnR5cGVkZWZUeXBlPy5hY2NlcHQodGhpcyk7CiAgICBpZiAobmV3UmV0dXJuVHlwZSA9PSBudWxsICYmCiAgICAgICAgbmV3UG9zaXRpb25hbFBhcmFtZXRlcnMgPT0gbnVsbCAmJgogICAgICAgIG5ld05hbWVkUGFyYW1ldGVycyA9PSBudWxsICYmCiAgICAgICAgdHlwZWRlZlR5cGUgPT0gbnVsbCkgewogICAgICAvLyBObyB0eXBlcyBoYWQgdG8gYmUgc3Vic3RpdHV0ZWQuCiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvblR5cGUoCiAgICAgICAgICBuZXdQb3NpdGlvbmFsUGFyYW1ldGVycyA/PyBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgICAgbmV3UmV0dXJuVHlwZSA/PyBub2RlLnJldHVyblR5cGUsCiAgICAgICAgICBuYW1lZFBhcmFtZXRlcnM6IG5ld05hbWVkUGFyYW1ldGVycyA/PyBub2RlLm5hbWVkUGFyYW1ldGVycywKICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzOiBub2RlLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogbm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgICAgdHlwZWRlZlR5cGU6IHR5cGVkZWZUeXBlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIG5vZGUpIHsKICAgIExpc3Q8RGFydFR5cGU+IG5ld1R5cGVBcmd1bWVudHMgPSBudWxsOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgRGFydFR5cGUgc3Vic3RpdHV0aW9uID0gbm9kZS50eXBlQXJndW1lbnRzW2ldLmFjY2VwdCh0aGlzKTsKICAgICAgaWYgKHN1YnN0aXR1dGlvbiAhPSBudWxsKSB7CiAgICAgICAgbmV3VHlwZUFyZ3VtZW50cyA/Pz0gbm9kZS50eXBlQXJndW1lbnRzLnRvTGlzdChncm93YWJsZTogZmFsc2UpOwogICAgICAgIG5ld1R5cGVBcmd1bWVudHNbaV0gPSBzdWJzdGl0dXRpb247CiAgICAgIH0KICAgIH0KICAgIGlmIChuZXdUeXBlQXJndW1lbnRzID09IG51bGwpIHsKICAgICAgLy8gTm8gdHlwZSBhcmd1bWVudHMgbmVlZGVkIHRvIGJlIHN1YnN0aXR1dGVkLgogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZShub2RlLmNsYXNzTm9kZSwgbmV3VHlwZUFyZ3VtZW50cyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdFVua25vd25UeXBlKFVua25vd25UeXBlIG5vZGUpID0+CiAgICAgIGlzTGVhc3RDbG9zdXJlID8gbnVsbFR5cGUgOiBjb25zdCBEeW5hbWljVHlwZSgpOwoKICAvLy8gUnVucyBhbiBpbnN0YW5jZSBvZiB0aGUgdmlzaXRvciBvbiB0aGUgZ2l2ZW4gW3NjaGVtYV0gYW5kIHJldHVybnMgdGhlCiAgLy8vIHJlc3VsdGluZyB0eXBlLiAgSWYgdGhlIHNjaGVtYSBjb250YWlucyBubyBpbnN0YW5jZXMgb2YgYD9gLCB0aGUgb3JpZ2luYWwKICAvLy8gc2NoZW1hIG9iamVjdCBpcyByZXR1cm5lZCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBhbGxvY2F0aW9uLgogIHN0YXRpYyBEYXJ0VHlwZSBydW4oCiAgICAgIENvcmVUeXBlcyBjb3JlVHlwZXMsIGJvb2wgaXNMZWFzdENsb3N1cmUsIERhcnRUeXBlIHNjaGVtYSkgewogICAgdmFyIHZpc2l0b3IgPSBuZXcgX1R5cGVTY2hlbWFFbGltaW5hdGlvblZpc2l0b3IoY29yZVR5cGVzLCBpc0xlYXN0Q2xvc3VyZSk7CiAgICB2YXIgcmVzdWx0ID0gc2NoZW1hLmFjY2VwdCh2aXNpdG9yKTsKICAgIGFzc2VydCh2aXNpdG9yLmlzTGVhc3RDbG9zdXJlID09IGlzTGVhc3RDbG9zdXJlKTsKICAgIHJldHVybiByZXN1bHQgPz8gc2NoZW1hOwogIH0KfQqAhABNTj8BIUgBOAE/AVEEUE88BE4uBD0EUSNCQQFOBE1ROgROLgQ9BFEeP0ABSARNTR5KGwEXAUowAQwyOyYzQUkiJD8zCAYvPEkiTSBHCAYmOyErJh8pEw0fQCxHLz8lBgQBDDQsOkIiSSwIBiQ1Ew1CBgQBDDE3AUxQQRdDUCk2HQQCAUdwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2UvdHlwZV9zY2hlbWFfZWxpbWluYXRpb24uZGFydFBzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2UvdHlwZV9zY2hlbWFfZW52aXJvbm1lbnQuZGFydLx1Ly8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRS5tZCBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBDbGFzcywKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEeW5hbWljVHlwZSwKICAgICAgICBGdW5jdGlvblR5cGUsCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBOYW1lZFR5cGUsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFR5cGVQYXJhbWV0ZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JyBzaG93IENsYXNzSGllcmFyY2h5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIHNob3cgQ29yZVR5cGVzOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgc2hvdyBTdWJzdGl0dXRpb247CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3NyYy9oaWVyYXJjaHlfYmFzZWRfdHlwZV9lbnZpcm9ubWVudC5kYXJ0JwogICAgc2hvdyBIaWVyYXJjaHlCYXNlZFR5cGVFbnZpcm9ubWVudDsKCmltcG9ydCAnc3RhbmRhcmRfYm91bmRzLmRhcnQnIHNob3cgU3RhbmRhcmRCb3VuZHM7CgppbXBvcnQgJ3R5cGVfY29uc3RyYWludF9nYXRoZXJlci5kYXJ0JyBzaG93IFR5cGVDb25zdHJhaW50R2F0aGVyZXI7CgppbXBvcnQgJ3R5cGVfc2NoZW1hLmRhcnQnIHNob3cgVW5rbm93blR5cGUsIHR5cGVTY2hlbWFUb1N0cmluZywgaXNLbm93bjsKCmltcG9ydCAndHlwZV9zY2hlbWFfZWxpbWluYXRpb24uZGFydCcgc2hvdyBncmVhdGVzdENsb3N1cmUsIGxlYXN0Q2xvc3VyZTsKCi8vIFRPRE8ocGF1bGJlcnJ5KTogdHJ5IHRvIHB1c2ggdGhpcyBmdW5jdGlvbmFsaXR5IGludG8ga2VybmVsLgpGdW5jdGlvblR5cGUgc3Vic3RpdHV0ZVR5cGVQYXJhbXMoCiAgICBGdW5jdGlvblR5cGUgdHlwZSwKICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gc3Vic3RpdHV0aW9uTWFwLAogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiBuZXdUeXBlUGFyYW1ldGVycykgewogIHZhciBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbU1hcChzdWJzdGl0dXRpb25NYXApOwogIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlKAogICAgICB0eXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLm1hcChzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUpLnRvTGlzdCgpLAogICAgICBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUodHlwZS5yZXR1cm5UeXBlKSwKICAgICAgbmFtZWRQYXJhbWV0ZXJzOiB0eXBlLm5hbWVkUGFyYW1ldGVycwogICAgICAgICAgLm1hcCgobmFtZWQpID0+IG5ldyBOYW1lZFR5cGUoCiAgICAgICAgICAgICAgbmFtZWQubmFtZSwgc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKG5hbWVkLnR5cGUpKSkKICAgICAgICAgIC50b0xpc3QoKSwKICAgICAgdHlwZVBhcmFtZXRlcnM6IG5ld1R5cGVQYXJhbWV0ZXJzLAogICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiB0eXBlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgIHR5cGVkZWZUeXBlOiB0eXBlLnR5cGVkZWZUeXBlID09IG51bGwKICAgICAgICAgID8gbnVsbAogICAgICAgICAgOiBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUodHlwZS50eXBlZGVmVHlwZSkpOwp9CgovLy8gR2l2ZW4gYSBbRnVuY3Rpb25UeXBlXSwgZ2V0cyB0aGUgdHlwZSBvZiB0aGUgbmFtZWQgcGFyYW1ldGVyIHdpdGggdGhlIGdpdmVuCi8vLyBbbmFtZV0sIG9yIGBkeW5hbWljYCBpZiB0aGVyZSBpcyBubyBwYXJhbWV0ZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KRGFydFR5cGUgZ2V0TmFtZWRQYXJhbWV0ZXJUeXBlKEZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUsIFN0cmluZyBuYW1lKSB7CiAgcmV0dXJuIGZ1bmN0aW9uVHlwZS5nZXROYW1lZFBhcmFtZXRlcihuYW1lKSA/PyBjb25zdCBEeW5hbWljVHlwZSgpOwp9CgovLy8gR2l2ZW4gYSBbRnVuY3Rpb25UeXBlXSwgZ2V0cyB0aGUgdHlwZSBvZiB0aGUgW2lddGggcG9zaXRpb25hbCBwYXJhbWV0ZXIsIG9yCi8vLyBgZHluYW1pY2AgaWYgdGhlcmUgaXMgbm8gcGFyYW1ldGVyIHdpdGggdGhhdCBpbmRleC4KRGFydFR5cGUgZ2V0UG9zaXRpb25hbFBhcmFtZXRlclR5cGUoRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZSwgaW50IGkpIHsKICBpZiAoaSA8IGZ1bmN0aW9uVHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgIHJldHVybiBmdW5jdGlvblR5cGUucG9zaXRpb25hbFBhcmFtZXRlcnNbaV07CiAgfSBlbHNlIHsKICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogIH0KfQoKLy8vIEEgY29uc3RyYWludCBvbiBhIHR5cGUgcGFyYW1ldGVyIHRoYXQgd2UncmUgaW5mZXJyaW5nLgpjbGFzcyBUeXBlQ29uc3RyYWludCB7CiAgLy8vIFRoZSBsb3dlciBib3VuZCBvZiB0aGUgdHlwZSBiZWluZyBjb25zdHJhaW5lZC4gIFRoaXMgYm91bmQgbXVzdCBiZSBhCiAgLy8vIHN1YnR5cGUgb2YgdGhlIHR5cGUgYmVpbmcgY29uc3RyYWluZWQuCiAgRGFydFR5cGUgbG93ZXI7CgogIC8vLyBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIHR5cGUgYmVpbmcgY29uc3RyYWluZWQuICBUaGUgdHlwZSBiZWluZyBjb25zdHJhaW5lZAogIC8vLyBtdXN0IGJlIGEgc3VidHlwZSBvZiB0aGlzIGJvdW5kLgogIERhcnRUeXBlIHVwcGVyOwoKICBUeXBlQ29uc3RyYWludCgpCiAgICAgIDogbG93ZXIgPSBjb25zdCBVbmtub3duVHlwZSgpLAogICAgICAgIHVwcGVyID0gY29uc3QgVW5rbm93blR5cGUoKTsKCiAgVHlwZUNvbnN0cmFpbnQuXyh0aGlzLmxvd2VyLCB0aGlzLnVwcGVyKTsKCiAgVHlwZUNvbnN0cmFpbnQgY2xvbmUoKSA9PiBuZXcgVHlwZUNvbnN0cmFpbnQuXyhsb3dlciwgdXBwZXIpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PgogICAgICAnJHt0eXBlU2NoZW1hVG9TdHJpbmcobG93ZXIpfSA8OiA8dHlwZT4gPDogJHt0eXBlU2NoZW1hVG9TdHJpbmcodXBwZXIpfSc7Cn0KCmNsYXNzIFR5cGVTY2hlbWFFbnZpcm9ubWVudCBleHRlbmRzIEhpZXJhcmNoeUJhc2VkVHlwZUVudmlyb25tZW50CiAgICB3aXRoIFN0YW5kYXJkQm91bmRzIHsKICBUeXBlU2NoZW1hRW52aXJvbm1lbnQoQ29yZVR5cGVzIGNvcmVUeXBlcywgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5KQogICAgICA6IHN1cGVyKGNvcmVUeXBlcywgaGllcmFyY2h5KTsKCiAgQ2xhc3MgZ2V0IGZ1bmN0aW9uQ2xhc3MgPT4gY29yZVR5cGVzLmZ1bmN0aW9uQ2xhc3M7CgogIEludGVyZmFjZVR5cGUgZ2V0TGVnYWN5TGVhc3RVcHBlckJvdW5kKAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUxLCBJbnRlcmZhY2VUeXBlIHR5cGUyKSB7CiAgICByZXR1cm4gaGllcmFyY2h5LmdldExlZ2FjeUxlYXN0VXBwZXJCb3VuZCh0eXBlMSwgdHlwZTIpOwogIH0KCiAgLy8vIE1vZGlmeSB0aGUgZ2l2ZW4gW2NvbnN0cmFpbnRdJ3MgbG93ZXIgYm91bmQgdG8gaW5jbHVkZSBbbG93ZXJdLgogIHZvaWQgYWRkTG93ZXJCb3VuZChUeXBlQ29uc3RyYWludCBjb25zdHJhaW50LCBEYXJ0VHlwZSBsb3dlcikgewogICAgY29uc3RyYWludC5sb3dlciA9IGdldFN0YW5kYXJkVXBwZXJCb3VuZChjb25zdHJhaW50Lmxvd2VyLCBsb3dlcik7CiAgfQoKICAvLy8gTW9kaWZ5IHRoZSBnaXZlbiBbY29uc3RyYWludF0ncyB1cHBlciBib3VuZCB0byBpbmNsdWRlIFt1cHBlcl0uCiAgdm9pZCBhZGRVcHBlckJvdW5kKFR5cGVDb25zdHJhaW50IGNvbnN0cmFpbnQsIERhcnRUeXBlIHVwcGVyKSB7CiAgICBjb25zdHJhaW50LnVwcGVyID0gZ2V0U3RhbmRhcmRMb3dlckJvdW5kKGNvbnN0cmFpbnQudXBwZXIsIHVwcGVyKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldFR5cGVPZk92ZXJsb2FkZWRBcml0aG1ldGljKERhcnRUeXBlIHR5cGUxLCBEYXJ0VHlwZSB0eXBlMikgewogICAgLy8gVE9ETyhwYXVsYmVycnkpOiB0aGlzIG1hdGNoZXMgd2hhdCBpcyBkZWZpbmVkIGluIHRoZSBzcGVjLiAgSXQgd291bGQgYmUKICAgIC8vIG5pY2UgaWYgd2UgY291bGQgY2hhbmdlIGtlcm5lbCB0byBtYXRjaCB0aGUgc3BlYyBhbmQgbm90IGhhdmUgdG8KICAgIC8vIG92ZXJyaWRlLgogICAgaWYgKHR5cGUxID09IGludFR5cGUpIHsKICAgICAgaWYgKHR5cGUyID09IGludFR5cGUpIHJldHVybiB0eXBlMjsKICAgICAgaWYgKHR5cGUyID09IGRvdWJsZVR5cGUpIHJldHVybiB0eXBlMjsKICAgIH0KICAgIHJldHVybiBudW1UeXBlOwogIH0KCiAgLy8vIEluZmVycyBhIGdlbmVyaWMgdHlwZSwgZnVuY3Rpb24sIG1ldGhvZCwgb3IgbGlzdC9tYXAgbGl0ZXJhbAogIC8vLyBpbnN0YW50aWF0aW9uLCB1c2luZyB0aGUgZG93bndhcmQgY29udGV4dCB0eXBlIGFzIHdlbGwgYXMgdGhlIGFyZ3VtZW50CiAgLy8vIHR5cGVzIGlmIGF2YWlsYWJsZS4KICAvLy8KICAvLy8gRm9yIGV4YW1wbGUsIGdpdmVuIGEgZnVuY3Rpb24gdHlwZSB3aXRoIGdlbmVyaWMgdHlwZSBwYXJhbWV0ZXJzLCB0aGlzCiAgLy8vIGluZmVycyB0aGUgdHlwZSBwYXJhbWV0ZXJzIGZyb20gdGhlIGFjdHVhbCBhcmd1bWVudCB0eXBlcy4KICAvLy8KICAvLy8gQ29uY3JldGVseSwgZ2l2ZW4gYSBmdW5jdGlvbiB0eXBlIHdpdGggcGFyYW1ldGVyIHR5cGVzIFAwLCBQMSwgLi4uIFBuLAogIC8vLyByZXN1bHQgdHlwZSBSLCBhbmQgZ2VuZXJpYyB0eXBlIHBhcmFtZXRlcnMgVDAsIFQxLCAuLi4gVG0sIHVzZSB0aGUKICAvLy8gYXJndW1lbnQgdHlwZXMgQTAsIEExLCAuLi4gQW4gdG8gc29sdmUgZm9yIHRoZSB0eXBlIHBhcmFtZXRlcnMuCiAgLy8vCiAgLy8vIEZvciBlYWNoIHBhcmFtZXRlciBQaSwgd2Ugd2FudCB0byBlbnN1cmUgdGhhdCBBaSA8OiBQaS4gV2UgY2FuIGRvIHRoaXMgYnkKICAvLy8gcnVubmluZyB0aGUgc3VidHlwZSBhbGdvcml0aG0sIGFuZCB3aGVuIHdlIHJlYWNoIGEgdHlwZSBwYXJhbWV0ZXIgVGosCiAgLy8vIHJlY29yZGluZyB0aGUgbG93ZXIgb3IgdXBwZXIgYm91bmQgaXQgbXVzdCBzYXRpc2Z5LiBBdCB0aGUgZW5kLCBhbGwKICAvLy8gY29uc3RyYWludHMgY2FuIGJlIGNvbWJpbmVkIHRvIGRldGVybWluZSB0aGUgdHlwZS4KICAvLy8KICAvLy8gQWxsIGNvbnN0cmFpbnRzIG9uIGVhY2ggdHlwZSBwYXJhbWV0ZXIgVGogYXJlIHRyYWNrZWQsIGFzIHdlbGwgYXMgd2hlcmUKICAvLy8gdGhleSBvcmlnaW5hdGVkLCBzbyB3ZSBjYW4gaXNzdWUgYW4gZXJyb3IgbWVzc2FnZSB0cmFjaW5nIGJhY2sgdG8gdGhlCiAgLy8vIGFyZ3VtZW50IHZhbHVlcywgdHlwZSBwYXJhbWV0ZXIgImV4dGVuZHMiIGNsYXVzZSwgb3IgdGhlIHJldHVybiB0eXBlCiAgLy8vIGNvbnRleHQuCiAgLy8vCiAgLy8vIElmIG5vbi1udWxsIHZhbHVlcyBmb3IgW2Zvcm1hbFR5cGVzXSBhbmQgW2FjdHVhbFR5cGVzXSBhcmUgcHJvdmlkZWQsIHRoaXMKICAvLy8gaXMgdXB3YXJkcyBpbmZlcmVuY2UuICBPdGhlcndpc2UgaXQgaXMgZG93bndhcmQgaW5mZXJlbmNlLgogIHZvaWQgaW5mZXJHZW5lcmljRnVuY3Rpb25PclR5cGUoCiAgICAgIERhcnRUeXBlIGRlY2xhcmVkUmV0dXJuVHlwZSwKICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyc1RvSW5mZXIsCiAgICAgIExpc3Q8RGFydFR5cGU+IGZvcm1hbFR5cGVzLAogICAgICBMaXN0PERhcnRUeXBlPiBhY3R1YWxUeXBlcywKICAgICAgRGFydFR5cGUgcmV0dXJuQ29udGV4dFR5cGUsCiAgICAgIExpc3Q8RGFydFR5cGU+IGluZmVycmVkVHlwZXMsCiAgICAgIHtib29sIGlzQ29uc3Q6IGZhbHNlfSkgewogICAgaWYgKHR5cGVQYXJhbWV0ZXJzVG9JbmZlci5pc0VtcHR5KSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBDcmVhdGUgYSBUeXBlQ29uc3RyYWludEdhdGhlcmVyIHRoYXQgd2lsbCBhbGxvdyBjZXJ0YWluIHR5cGUgcGFyYW1ldGVycwogICAgLy8gdG8gYmUgaW5mZXJyZWQuIEl0IHdpbGwgb3B0aW1pc3RpY2FsbHkgYXNzdW1lIHRoZXNlIHR5cGUgcGFyYW1ldGVycyBjYW4KICAgIC8vIGJlIHN1YnR5cGVzIChvciBzdXBlcnR5cGVzKSBhcyBuZWNlc3NhcnksIGFuZCB0cmFjayB0aGUgY29uc3RyYWludHMgdGhhdAogICAgLy8gYXJlIGltcGxpZWQgYnkgdGhpcy4KICAgIHZhciBnYXRoZXJlciA9IG5ldyBUeXBlQ29uc3RyYWludEdhdGhlcmVyKHRoaXMsIHR5cGVQYXJhbWV0ZXJzVG9JbmZlcik7CgogICAgaWYgKCFpc0VtcHR5Q29udGV4dChyZXR1cm5Db250ZXh0VHlwZSkpIHsKICAgICAgaWYgKGlzQ29uc3QpIHsKICAgICAgICByZXR1cm5Db250ZXh0VHlwZSA9IG5ldyBUeXBlVmFyaWFibGVFbGltaW5hdG9yKGNvcmVUeXBlcykKICAgICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHJldHVybkNvbnRleHRUeXBlKTsKICAgICAgfQogICAgICBnYXRoZXJlci50cnlTdWJ0eXBlTWF0Y2goZGVjbGFyZWRSZXR1cm5UeXBlLCByZXR1cm5Db250ZXh0VHlwZSk7CiAgICB9CgogICAgaWYgKGZvcm1hbFR5cGVzICE9IG51bGwpIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmb3JtYWxUeXBlcy5sZW5ndGg7IGkrKykgewogICAgICAgIC8vIFRyeSB0byBwYXNzIGVhY2ggYXJndW1lbnQgdG8gZWFjaCBwYXJhbWV0ZXIsIHJlY29yZGluZyBhbnkgdHlwZQogICAgICAgIC8vIHBhcmFtZXRlciBib3VuZHMgdGhhdCB3ZXJlIGltcGxpZWQgYnkgdGhpcyBhc3NpZ25tZW50LgogICAgICAgIGdhdGhlcmVyLnRyeVN1YnR5cGVNYXRjaChhY3R1YWxUeXBlc1tpXSwgZm9ybWFsVHlwZXNbaV0pOwogICAgICB9CiAgICB9CgogICAgaW5mZXJUeXBlRnJvbUNvbnN0cmFpbnRzKAogICAgICAgIGdhdGhlcmVyLmNvbXB1dGVDb25zdHJhaW50cygpLCB0eXBlUGFyYW1ldGVyc1RvSW5mZXIsIGluZmVycmVkVHlwZXMsCiAgICAgICAgZG93bndhcmRzSW5mZXJQaGFzZTogZm9ybWFsVHlwZXMgPT0gbnVsbCk7CiAgfQoKICBib29sIGhhc09taXR0ZWRCb3VuZChUeXBlUGFyYW1ldGVyIHBhcmFtZXRlcikgewogICAgLy8gSWYgdGhlIGJvdW5kIHdhcyBvbWl0dGVkIGJ5IHRoZSBwcm9ncmFtbWVyLCB0aGUgS2VybmVsIHJlcHJlc2VudGF0aW9uIGZvcgogICAgLy8gdGhlIHBhcmFtZXRlciB3aWxsIGxvb2sgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nOgogICAgLy8KICAgIC8vICAgICBUIGV4dGVuZHMgT2JqZWN0ID0gZHluYW1pYwogICAgLy8KICAgIC8vIE5vdGUgdGhhdCBpdCdzIG5vdCBwb3NzaWJsZSB0byByZWNlaXZlIFtPYmplY3RdIGFzIFtUeXBlUGFyYW1ldGVyLmJvdW5kXQogICAgLy8gYW5kIGBkeW5hbWljYCBhcyBbVHlwZVBhcmFtZXRlci5kZWZhdWx0VHlwZV0gZnJvbSB0aGUgZnJvbnQgZW5kIGluIGFueQogICAgLy8gb3RoZXIgd2F5LgogICAgRGFydFR5cGUgYm91bmQgPSBwYXJhbWV0ZXIuYm91bmQ7CiAgICByZXR1cm4gYm91bmQgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgIGlkZW50aWNhbChib3VuZC5jbGFzc05vZGUsIGNvcmVUeXBlcy5vYmplY3RDbGFzcykgJiYKICAgICAgICBwYXJhbWV0ZXIuZGVmYXVsdFR5cGUgaXMgRHluYW1pY1R5cGU7CiAgfQoKICAvLy8gVXNlIHRoZSBnaXZlbiBbY29uc3RyYWludHNdIHRvIHN1YnN0aXR1dGUgZm9yIHR5cGUgdmFyaWFibGVzLgogIC8vLwogIC8vLyBbdHlwZVBhcmFtZXRlcnNUb0luZmVyXSBpcyB0aGUgc2V0IG9mIHR5cGUgcGFyYW1ldGVycyB0aGF0IHNob3VsZCBiZQogIC8vLyBzdWJzdGl0dXRlZCBmb3IuICBbaW5mZXJyZWRUeXBlc10gc2hvdWxkIGJlIGEgbGlzdCBvZiB0aGUgc2FtZSBsZW5ndGguCiAgLy8vCiAgLy8vIElmIFtkb3dud2FyZHNJbmZlclBoYXNlXSBpcyBgdHJ1ZWAsIHRoZW4gd2UgYXJlIGluIHRoZSBmaXJzdCBwYXNzIG9mCiAgLy8vIGluZmVyZW5jZSwgcHVzaGluZyBjb250ZXh0IHR5cGVzIGRvd24uICBUaGlzIG1lYW5zIHdlIGFyZSBhbGxvd2VkIHRvIHB1c2gKICAvLy8gZG93biBgP2AgdG8gcHJlY2lzZWx5IHJlcHJlc2VudCBhbiB1bmtub3duIHR5cGUuICBbaW5mZXJyZWRUeXBlc10gc2hvdWxkCiAgLy8vIGJlIGluaXRpYWxseSBwb3B1bGF0ZWQgd2l0aCBgP2AuICBUaGVzZSBgP2BzIHdpbGwgYmUgcmVwbGFjZWQsIGlmCiAgLy8vIGFwcHJvcHJpYXRlLCB3aXRoIHRoZSB0eXBlcyB0aGF0IHdlcmUgaW5mZXJyZWQgYnkgZG93bndhcmRzIGluZmVyZW5jZS4KICAvLy8KICAvLy8gSWYgW2Rvd253YXJkc0luZmVyUGhhc2VdIGlzIGBmYWxzZWAsIHRoZW4gd2UgYXJlIGluIHRoZSBzZWNvbmQgcGFzcyBvZgogIC8vLyBpbmZlcmVuY2UsIGFuZCBtdXN0IG5vdCBjb25jbHVkZSBgP2AgZm9yIGFueSB0eXBlIGZvcm1hbC4gIEluIHRoaXMgcGFzcywKICAvLy8gW2luZmVycmVkVHlwZXNdIHNob3VsZCBjb250YWluIHRoZSB2YWx1ZXMgZnJvbSB0aGUgZmlyc3QgcGFzcy4gIFRoZXkgd2lsbAogIC8vLyBiZSByZXBsYWNlZCB3aXRoIHRoZSBmaW5hbCBpbmZlcnJlZCB0eXBlcy4KICB2b2lkIGluZmVyVHlwZUZyb21Db25zdHJhaW50cyhNYXA8VHlwZVBhcmFtZXRlciwgVHlwZUNvbnN0cmFpbnQ+IGNvbnN0cmFpbnRzLAogICAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzVG9JbmZlciwgTGlzdDxEYXJ0VHlwZT4gaW5mZXJyZWRUeXBlcywKICAgICAge2Jvb2wgZG93bndhcmRzSW5mZXJQaGFzZTogZmFsc2V9KSB7CiAgICBMaXN0PERhcnRUeXBlPiB0eXBlc0Zyb21Eb3dud2FyZHNJbmZlcmVuY2UgPQogICAgICAgIGRvd253YXJkc0luZmVyUGhhc2UgPyBudWxsIDogaW5mZXJyZWRUeXBlcy50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzVG9JbmZlci5sZW5ndGg7IGkrKykgewogICAgICBUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbSA9IHR5cGVQYXJhbWV0ZXJzVG9JbmZlcltpXTsKCiAgICAgIHZhciB0eXBlUGFyYW1Cb3VuZCA9IHR5cGVQYXJhbS5ib3VuZDsKICAgICAgRGFydFR5cGUgZXh0ZW5kc0NvbnN0cmFpbnQ7CiAgICAgIGlmICghaGFzT21pdHRlZEJvdW5kKHR5cGVQYXJhbSkpIHsKICAgICAgICBleHRlbmRzQ29uc3RyYWludCA9CiAgICAgICAgICAgIFN1YnN0aXR1dGlvbi5mcm9tUGFpcnModHlwZVBhcmFtZXRlcnNUb0luZmVyLCBpbmZlcnJlZFR5cGVzKQogICAgICAgICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHR5cGVQYXJhbUJvdW5kKTsKICAgICAgfQoKICAgICAgdmFyIGNvbnN0cmFpbnQgPSBjb25zdHJhaW50c1t0eXBlUGFyYW1dOwogICAgICBpZiAoZG93bndhcmRzSW5mZXJQaGFzZSkgewogICAgICAgIGluZmVycmVkVHlwZXNbaV0gPQogICAgICAgICAgICBfaW5mZXJUeXBlUGFyYW1ldGVyRnJvbUNvbnRleHQoY29uc3RyYWludCwgZXh0ZW5kc0NvbnN0cmFpbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIGluZmVycmVkVHlwZXNbaV0gPSBfaW5mZXJUeXBlUGFyYW1ldGVyRnJvbUFsbCgKICAgICAgICAgICAgdHlwZXNGcm9tRG93bndhcmRzSW5mZXJlbmNlW2ldLCBjb25zdHJhaW50LCBleHRlbmRzQ29uc3RyYWludCk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBJZiB0aGUgZG93bndhcmRzIGluZmVyIHBoYXNlIGhhcyBmYWlsZWQsIHdlJ2xsIGNhdGNoIHRoaXMgaW4gdGhlIHVwd2FyZHMKICAgIC8vIHBoYXNlIGxhdGVyIG9uLgogICAgaWYgKGRvd253YXJkc0luZmVyUGhhc2UpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIENoZWNrIHRoZSBpbmZlcnJlZCB0eXBlcyBhZ2FpbnN0IGFsbCBvZiB0aGUgY29uc3RyYWludHMuCiAgICB2YXIga25vd25UeXBlcyA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnNUb0luZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgIFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtID0gdHlwZVBhcmFtZXRlcnNUb0luZmVyW2ldOwogICAgICB2YXIgY29uc3RyYWludCA9IGNvbnN0cmFpbnRzW3R5cGVQYXJhbV07CiAgICAgIHZhciB0eXBlUGFyYW1Cb3VuZCA9CiAgICAgICAgICBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKHR5cGVQYXJhbWV0ZXJzVG9JbmZlciwgaW5mZXJyZWRUeXBlcykKICAgICAgICAgICAgICAuc3Vic3RpdHV0ZVR5cGUodHlwZVBhcmFtLmJvdW5kKTsKCiAgICAgIHZhciBpbmZlcnJlZCA9IGluZmVycmVkVHlwZXNbaV07CiAgICAgIGJvb2wgc3VjY2VzcyA9IHR5cGVTYXRpc2ZpZXNDb25zdHJhaW50KGluZmVycmVkLCBjb25zdHJhaW50KTsKICAgICAgaWYgKHN1Y2Nlc3MgJiYgIWhhc09taXR0ZWRCb3VuZCh0eXBlUGFyYW0pKSB7CiAgICAgICAgLy8gSWYgZXZlcnl0aGluZyBlbHNlIHN1Y2NlZWRlZCwgY2hlY2sgdGhlIGBleHRlbmRzYCBjb25zdHJhaW50LgogICAgICAgIHZhciBleHRlbmRzQ29uc3RyYWludCA9IHR5cGVQYXJhbUJvdW5kOwogICAgICAgIHN1Y2Nlc3MgPSBpc1N1YnR5cGVPZihpbmZlcnJlZCwgZXh0ZW5kc0NvbnN0cmFpbnQpOwogICAgICB9CgogICAgICBpZiAoIXN1Y2Nlc3MpIHsKICAgICAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IHJlcG9ydCBlcnJvci4KCiAgICAgICAgLy8gSGV1cmlzdGljOiBldmVuIGlmIHdlIGZhaWxlZCwga2VlcCB0aGUgZXJyb25lb3VzIHR5cGUuCiAgICAgICAgLy8gSXQgc2hvdWxkIHNhdGlzZnkgYXQgbGVhc3Qgc29tZSBvZiB0aGUgY29uc3RyYWludHMgKGUuZy4gdGhlIHJldHVybgogICAgICAgIC8vIGNvbnRleHQpLiBJZiB3ZSBmYWxsIGJhY2sgdG8gaW5zdGFudGlhdGVUb0JvdW5kcywgd2UnbGwgdHlwaWNhbGx5IGdldAogICAgICAgIC8vIG1vcmUgZXJyb3JzIChlLmcuIGJlY2F1c2UgYGR5bmFtaWNgIGlzIHRoZSBtb3N0IGNvbW1vbiBib3VuZCkuCiAgICAgIH0KCiAgICAgIGlmIChpc0tub3duKGluZmVycmVkKSkgewogICAgICAgIGtub3duVHlwZXNbdHlwZVBhcmFtXSA9IGluZmVycmVkOwogICAgICB9CiAgICB9CgogICAgLy8gVE9ETyhwYXVsYmVycnkpOiByZXBvcnQgYW55IGVycm9ycyBmcm9tIGluc3RhbnRpYXRlVG9Cb3VuZHMuCiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzU3VidHlwZU9mKERhcnRUeXBlIHN1YnR5cGUsIERhcnRUeXBlIHN1cGVydHlwZSkgewogICAgaWYgKHN1YnR5cGUgaXMgVW5rbm93blR5cGUpIHJldHVybiB0cnVlOwogICAgaWYgKHN1YnR5cGUgPT0gTnVsbCAmJiBzdXBlcnR5cGUgaXMgVW5rbm93blR5cGUpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIHN1cGVyLmlzU3VidHlwZU9mKHN1YnR5cGUsIHN1cGVydHlwZSk7CiAgfQoKICBib29sIGlzRW1wdHlDb250ZXh0KERhcnRUeXBlIGNvbnRleHQpIHsKICAgIGlmIChjb250ZXh0IGlzIER5bmFtaWNUeXBlKSB7CiAgICAgIC8vIEFuYWx5emVyIHRyZWF0cyBhIHR5cGUgY29udGV4dCBvZiBgZHluYW1pY2AgYXMgZXF1aXZhbGVudCB0byBhbiBlbXB0eQogICAgICAvLyBjb250ZXh0LiAgVE9ETyhwYXVsYmVycnkpOiB0aGlzIGlzIG5vdCBzcGVjJ2VkIGFueXdoZXJlOyBkbyB3ZSBzdGlsbAogICAgICAvLyB3YW50IHRvIGRvIHRoaXM/CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGNvbnRleHQgPT0gbnVsbDsKICB9CgogIC8vLyBUcnVlIGlmIFttZW1iZXJdIGlzIGEgYmluYXJ5IG9wZXJhdG9yIHRoYXQgcmV0dXJucyBhbiBgaW50YCBpZiBib3RoCiAgLy8vIG9wZXJhbmRzIGFyZSBgaW50YCwgYW5kIG90aGVyd2lzZSByZXR1cm5zIGBkb3VibGVgLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgdGhpcyBiZWhhdmlvciBkZXBlbmRzIG9uIHRoZSByZWNlaXZlciB0eXBlLCBzbyB3ZSBjYW4gb25seSBtYWtlCiAgLy8vIHRoaXMgZGV0ZXJtaW5hdGlvbiBpZiB3ZSBrbm93IHRoZSB0eXBlIG9mIHRoZSByZWNlaXZlci4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNhc2Ugb2YgdHlwZS1iYXNlZCBvdmVybG9hZGluZywgd2hpY2ggaW4gRGFydCBpcyBvbmx5IHN1cHBvcnRlZAogIC8vLyBieSBnaXZpbmcgc3BlY2lhbCB0cmVhdG1lbnQgdG8gY2VydGFpbiBhcml0aG1ldGljIG9wZXJhdG9ycy4KICBib29sIGlzT3ZlcmxvYWRlZEFyaXRobWV0aWNPcGVyYXRvckFuZFR5cGUoCiAgICAgIFByb2NlZHVyZSBtZW1iZXIsIERhcnRUeXBlIHJlY2VpdmVyVHlwZSkgewogICAgLy8gVE9ETyhwYXVsYmVycnkpOiB0aGlzIG1hdGNoZXMgd2hhdCBpcyBkZWZpbmVkIGluIHRoZSBzcGVjLiAgSXQgd291bGQgYmUKICAgIC8vIG5pY2UgaWYgd2UgY291bGQgY2hhbmdlIGtlcm5lbCB0byBtYXRjaCB0aGUgc3BlYyBhbmQgbm90IGhhdmUgdG8KICAgIC8vIG92ZXJyaWRlLgogICAgaWYgKG1lbWJlci5uYW1lLm5hbWUgPT0gJ3JlbWFpbmRlcicpIHJldHVybiBmYWxzZTsKICAgIGlmICghKHJlY2VpdmVyVHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgaWRlbnRpY2FsKHJlY2VpdmVyVHlwZS5jbGFzc05vZGUsIGNvcmVUeXBlcy5pbnRDbGFzcykpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiBpc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3IobWVtYmVyKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNUb3AoRGFydFR5cGUgdCkgewogICAgaWYgKHQgaXMgVW5rbm93blR5cGUpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gc3VwZXIuaXNUb3AodCk7CiAgICB9CiAgfQoKICAvLy8gQ29tcHV0ZXMgdGhlIGNvbnN0cmFpbnQgc29sdXRpb24gZm9yIGEgdHlwZSB2YXJpYWJsZSBiYXNlZCBvbiBhIGdpdmVuIHNldAogIC8vLyBvZiBjb25zdHJhaW50cy4KICAvLy8KICAvLy8gSWYgW2dyb3VuZGVkXSBpcyBgdHJ1ZWAsIHRoZW4gdGhlIHJldHVybmVkIHR5cGUgaXMgZ3VhcmFudGVlZCB0byBiZSBhCiAgLy8vIGtub3duIHR5cGUgKGkuZS4gaXQgd2lsbCBub3QgY29udGFpbiBhbnkgaW5zdGFuY2VzIG9mIGA/YCkuCiAgRGFydFR5cGUgc29sdmVUeXBlQ29uc3RyYWludChUeXBlQ29uc3RyYWludCBjb25zdHJhaW50LAogICAgICB7Ym9vbCBncm91bmRlZDogZmFsc2V9KSB7CiAgICAvLyBQcmVmZXIgdGhlIGtub3duIGJvdW5kLCBpZiBhbnkuCiAgICBpZiAoaXNLbm93bihjb25zdHJhaW50Lmxvd2VyKSkgcmV0dXJuIGNvbnN0cmFpbnQubG93ZXI7CiAgICBpZiAoaXNLbm93bihjb25zdHJhaW50LnVwcGVyKSkgcmV0dXJuIGNvbnN0cmFpbnQudXBwZXI7CgogICAgLy8gT3RoZXJ3aXNlIHRha2Ugd2hhdGV2ZXIgYm91bmQgaGFzIHBhcnRpYWwgaW5mb3JtYXRpb24sIGUuZy4gYEl0ZXJhYmxlPD8+YAogICAgaWYgKGNvbnN0cmFpbnQubG93ZXIgaXMhIFVua25vd25UeXBlKSB7CiAgICAgIHJldHVybiBncm91bmRlZAogICAgICAgICAgPyBsZWFzdENsb3N1cmUoY29yZVR5cGVzLCBjb25zdHJhaW50Lmxvd2VyKQogICAgICAgICAgOiBjb25zdHJhaW50Lmxvd2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGdyb3VuZGVkCiAgICAgICAgICA/IGdyZWF0ZXN0Q2xvc3VyZShjb3JlVHlwZXMsIGNvbnN0cmFpbnQudXBwZXIpCiAgICAgICAgICA6IGNvbnN0cmFpbnQudXBwZXI7CiAgICB9CiAgfQoKICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBbdHlwZV0gc2F0aXNmaWVzIHRoZSBnaXZlbiB0eXBlIFtjb25zdHJhaW50XS4KICBib29sIHR5cGVTYXRpc2ZpZXNDb25zdHJhaW50KERhcnRUeXBlIHR5cGUsIFR5cGVDb25zdHJhaW50IGNvbnN0cmFpbnQpIHsKICAgIHJldHVybiBpc1N1YnR5cGVPZihjb25zdHJhaW50Lmxvd2VyLCB0eXBlKSAmJgogICAgICAgIGlzU3VidHlwZU9mKHR5cGUsIGNvbnN0cmFpbnQudXBwZXIpOwogIH0KCiAgRGFydFR5cGUgX2luZmVyVHlwZVBhcmFtZXRlckZyb21BbGwoRGFydFR5cGUgdHlwZUZyb21Db250ZXh0SW5mZXJlbmNlLAogICAgICBUeXBlQ29uc3RyYWludCBjb25zdHJhaW50LCBEYXJ0VHlwZSBleHRlbmRzQ29uc3RyYWludCkgewogICAgLy8gU2VlIGlmIHdlIGFscmVhZHkgZml4ZWQgdGhpcyB0eXBlIGZyb20gZG93bndhcmRzIGluZmVyZW5jZS4KICAgIC8vIElmIHNvLCB0aGVuIHdlIGFyZW4ndCBhbGxvd2VkIHRvIGNoYW5nZSBpdCBiYXNlZCBvbiBhcmd1bWVudCB0eXBlcy4KICAgIGlmIChpc0tub3duKHR5cGVGcm9tQ29udGV4dEluZmVyZW5jZSkpIHsKICAgICAgcmV0dXJuIHR5cGVGcm9tQ29udGV4dEluZmVyZW5jZTsKICAgIH0KCiAgICBpZiAoZXh0ZW5kc0NvbnN0cmFpbnQgIT0gbnVsbCkgewogICAgICBjb25zdHJhaW50ID0gY29uc3RyYWludC5jbG9uZSgpOwogICAgICBhZGRVcHBlckJvdW5kKGNvbnN0cmFpbnQsIGV4dGVuZHNDb25zdHJhaW50KTsKICAgIH0KCiAgICByZXR1cm4gc29sdmVUeXBlQ29uc3RyYWludChjb25zdHJhaW50LCBncm91bmRlZDogdHJ1ZSk7CiAgfQoKICBEYXJ0VHlwZSBfaW5mZXJUeXBlUGFyYW1ldGVyRnJvbUNvbnRleHQoCiAgICAgIFR5cGVDb25zdHJhaW50IGNvbnN0cmFpbnQsIERhcnRUeXBlIGV4dGVuZHNDb25zdHJhaW50KSB7CiAgICBEYXJ0VHlwZSB0ID0gc29sdmVUeXBlQ29uc3RyYWludChjb25zdHJhaW50KTsKICAgIGlmICghaXNLbm93bih0KSkgewogICAgICByZXR1cm4gdDsKICAgIH0KCiAgICAvLyBJZiB3ZSdyZSBhYm91dCB0byBtYWtlIG91ciBmaW5hbCBjaG9pY2UsIGFwcGx5IHRoZSBleHRlbmRzIGNsYXVzZS4KICAgIC8vIFRoaXMgZ2l2ZXMgdXMgYSBjaGFuY2UgdG8gcmVmaW5lIHRoZSBjaG9pY2UsIGluIGNhc2UgaXQgd291bGQgdmlvbGF0ZQogICAgLy8gdGhlIGBleHRlbmRzYCBjbGF1c2UuIEZvciBleGFtcGxlOgogICAgLy8KICAgIC8vICAgICBPYmplY3Qgb2JqID0gbWF0aC5taW4vKjxpbmZlciBPYmplY3QsIGVycm9yPiovKDEsIDIpOwogICAgLy8KICAgIC8vIElmIHdlIGNvbnNpZGVyIHRoZSBgVCBleHRlbmRzIG51bWAgd2UgY29uY2x1ZGUgYDxudW0+YCwgd2hpY2ggd29ya3MuCiAgICBpZiAoZXh0ZW5kc0NvbnN0cmFpbnQgIT0gbnVsbCkgewogICAgICBjb25zdHJhaW50ID0gY29uc3RyYWludC5jbG9uZSgpOwogICAgICBhZGRVcHBlckJvdW5kKGNvbnN0cmFpbnQsIGV4dGVuZHNDb25zdHJhaW50KTsKICAgICAgcmV0dXJuIHNvbHZlVHlwZUNvbnN0cmFpbnQoY29uc3RyYWludCk7CiAgICB9CiAgICByZXR1cm4gdDsKICB9Cn0KCmNsYXNzIFR5cGVWYXJpYWJsZUVsaW1pbmF0b3IgZXh0ZW5kcyBTdWJzdGl0dXRpb24gewogIGZpbmFsIENvcmVUeXBlcyBfY29yZVR5cGVzOwoKICBUeXBlVmFyaWFibGVFbGltaW5hdG9yKHRoaXMuX2NvcmVUeXBlcyk7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldFN1YnN0aXR1dGUoVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIsIGJvb2wgdXBwZXJCb3VuZCkgewogICAgcmV0dXJuIHVwcGVyQm91bmQKICAgICAgICA/IF9jb3JlVHlwZXMubnVsbENsYXNzLnJhd1R5cGUKICAgICAgICA6IF9jb3JlVHlwZXMub2JqZWN0Q2xhc3MucmF3VHlwZTsKICB9Cn0KgZwATU4/ASEJDxIVFhcTExcBQgE4AT0BQigBMwFEAUkBSgFAIxcyLTwbSzQsKUQVKTssETwCAVBHSUYCAVA4SDYxCyAEAgE7F0stEgFRJxIBEyUlASwBQAEXUAIBQhpHJQE2ASoyPQQBRkJHBAFGQkcEAQxLT0gRHCotBhQEAUNNGgZMQQZNSUYGUExKOQZOTEsPBlBBIyMxIiIiJB8pDgYBT09QHEwBLhVCMAhHBgEfNUtCQggGAR5NMwQBMlE5ByYHUE4SJiU9LgQBRAZLTQZLUE9ITQZNT1AxUE8rMUwBPToBLCIpHEkxCAEvIRtLDzdMCAYBUBcfDgYBQDI9Oi8bRzABJ0Q0STA8CAEWKgFCT1FKCAEfKggGAUQEAQw7LUIyBAEqIk9OGhMGHAQBSjoGUD4GUEMuMU9IETcrQhQGMwQBDBscEw0dBgQBUBYGTEI6ICc8PAFRLBY2Hg0WOR4GBAFLSzItBAFJP0NLLScGASUnNAYBPAQBKz8yFxAGAUpNKgdBB0wlJzQuBg4EAgE0HgErAQxFFicqBAIBR3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX3NjaGVtYV9lbnZpcm9ubWVudC5kYXJ0R3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvaW1wbGljaXRfdHlwZV9hcmd1bWVudC5kYXJ0hEMvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFLm1kIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmltcGxpY2l0X3R5cGVfYXJndW1lbnQ7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdyBEYXJ0VHlwZSwgRGFydFR5cGVWaXNpdG9yLCBEYXJ0VHlwZVZpc2l0b3IxLCBWaXNpdG9yOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuaGFuZGxlZDsKCi8vLyBNYXJrZXIgdHlwZSB1c2VkIGFzIHR5cGUgYXJndW1lbnQgb24gbGlzdCwgc2V0IGFuZCBtYXAgbGl0ZXJhbHMgd2hlbmV2ZXIKLy8vIHR5cGUgYXJndW1lbnRzIGFyZSBvbWl0dGVkIGluIHRoZSBzb3VyY2UuCi8vLwovLy8gQWxsIG9mIHRoZXNlIHR5cGVzIGFyZSByZXBsYWNlZCBieSB0aGUgdHlwZSBpbmZlcmVuY2UuIEl0IGlzIGFuIGludGVybmFsCi8vLyBlcnJvciBpZiBvbmUgc3Vydml2ZXMgdG8gdGhlIGZpbmFsIG91dHB1dC4KY2xhc3MgSW1wbGljaXRUeXBlQXJndW1lbnQgZXh0ZW5kcyBEYXJ0VHlwZSB7CiAgY29uc3QgSW1wbGljaXRUeXBlQXJndW1lbnQoKTsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KERhcnRUeXBlVmlzaXRvcjxPYmplY3Q+IHYpIHsKICAgIHVuaGFuZGxlZCgiJHJ1bnRpbWVUeXBlIiwgIiR7di5ydW50aW1lVHlwZX0iLCAtMSwgbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBhY2NlcHQxKERhcnRUeXBlVmlzaXRvcjE8T2JqZWN0LCBPYmplY3Q+IHYsIGFyZykgewogICAgdW5oYW5kbGVkKCIkcnVudGltZVR5cGUiLCAiJHt2LnJ1bnRpbWVUeXBlfSIsIC0xLCBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxPYmplY3Q+IHYpIHsKICAgIHVuaGFuZGxlZCgiJHJ1bnRpbWVUeXBlIiwgIiR7di5ydW50aW1lVHlwZX0iLCAtMSwgbnVsbCk7CiAgfQp9CiQATU4/ASYBIT8BKgFNLgRNLy4gAQwmPQQBDDU9BAEMJT0EAgE+cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9pbXBsaWNpdF90eXBlX2FyZ3VtZW50LmRhcnRMc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfZXhwcmVzc2lvbl9nZW5lcmF0b3IuZGFydMAAy94vLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cgQXJndW1lbnRzLCBFeHByZXNzaW9uLCBJbnZhbGlkRXhwcmVzc2lvbiwgTm9kZTsKCmltcG9ydCAnLi4vLi4vc2Nhbm5lci90b2tlbi5kYXJ0JyBzaG93IFRva2VuOwoKaW1wb3J0ICcuLi9jb25zdGFudF9jb250ZXh0LmRhcnQnIHNob3cgQ29uc3RhbnRDb250ZXh0OwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIExvY2F0ZWRNZXNzYWdlLAogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgbWVzc2FnZUNhbm5vdEFzc2lnblRvUGFyZW50aGVzaXplZEV4cHJlc3Npb24sCiAgICAgICAgbWVzc2FnZUNhbm5vdEFzc2lnblRvU3VwZXIsCiAgICAgICAgbWVzc2FnZUludmFsaWRVc2VPZk51bGxBd2FyZUFjY2VzcywKICAgICAgICBtZXNzYWdlTG9hZExpYnJhcnlUYWtlc05vQXJndW1lbnRzLAogICAgICAgIG1lc3NhZ2VOb3RBQ29uc3RhbnRFeHByZXNzaW9uLAogICAgICAgIG1lc3NhZ2VOb3RBbkx2YWx1ZSwKICAgICAgICBtZXNzYWdlU3VwZXJBc0V4cHJlc3Npb24sCiAgICAgICAgdGVtcGxhdGVDb25zdHJ1Y3Rvck5vdEZvdW5kLAogICAgICAgIHRlbXBsYXRlTm90Q29uc3RhbnRFeHByZXNzaW9uLAogICAgICAgIHRlbXBsYXRlU3VwZXJjbGFzc0hhc05vQ29uc3RydWN0b3IsCiAgICAgICAgdGVtcGxhdGVUaGlzT3JTdXBlckFjY2Vzc0luRmllbGRJbml0aWFsaXplcjsKCmltcG9ydCAnLi4vbWVzc2FnZXMuZGFydCcgc2hvdyBNZXNzYWdlLCBub0xlbmd0aDsKCmltcG9ydCAnLi4vbmFtZXMuZGFydCcgc2hvdyBjYWxsTmFtZSwgZXF1YWxzTmFtZSwgaW5kZXhHZXROYW1lLCBpbmRleFNldE5hbWU7CgppbXBvcnQgJy4uL3BhcnNlci5kYXJ0JyBzaG93IGxlbmd0aEZvclRva2VuLCBvZmZzZXRGb3JUb2tlbjsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyB1bmhhbmRsZWQsIHVuc3VwcG9ydGVkOwoKaW1wb3J0ICcuLi9zY29wZS5kYXJ0JyBzaG93IEFtYmlndW91c0J1aWxkZXI7CgppbXBvcnQgJ2JvZHlfYnVpbGRlci5kYXJ0JyBzaG93IG5vTG9jYXRpb247CgppbXBvcnQgJ2NvbnN0bmVzcy5kYXJ0JyBzaG93IENvbnN0bmVzczsKCmltcG9ydCAnZXhwcmVzc2lvbl9nZW5lcmF0b3IuZGFydCcKICAgIHNob3cKICAgICAgICBDb250ZXh0QXdhcmVHZW5lcmF0b3IsCiAgICAgICAgRGVmZXJyZWRBY2Nlc3NHZW5lcmF0b3IsCiAgICAgICAgRGVsYXllZEFzc2lnbm1lbnQsCiAgICAgICAgRGVsYXllZFBvc3RmaXhJbmNyZW1lbnQsCiAgICAgICAgRXJyb25lb3VzRXhwcmVzc2lvbkdlbmVyYXRvciwKICAgICAgICBFeHByZXNzaW9uR2VuZXJhdG9yLAogICAgICAgIEdlbmVyYXRvciwKICAgICAgICBJbmRleGVkQWNjZXNzR2VuZXJhdG9yLAogICAgICAgIExvYWRMaWJyYXJ5R2VuZXJhdG9yLAogICAgICAgIE51bGxBd2FyZVByb3BlcnR5QWNjZXNzR2VuZXJhdG9yLAogICAgICAgIFBhcnNlckVycm9yR2VuZXJhdG9yLAogICAgICAgIFByZWZpeFVzZUdlbmVyYXRvciwKICAgICAgICBQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvciwKICAgICAgICBSZWFkT25seUFjY2Vzc0dlbmVyYXRvciwKICAgICAgICBTdGF0aWNBY2Nlc3NHZW5lcmF0b3IsCiAgICAgICAgU3VwZXJJbmRleGVkQWNjZXNzR2VuZXJhdG9yLAogICAgICAgIFN1cGVyUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IsCiAgICAgICAgVGhpc0luZGV4ZWRBY2Nlc3NHZW5lcmF0b3IsCiAgICAgICAgVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yLAogICAgICAgIFR5cGVVc2VHZW5lcmF0b3IsCiAgICAgICAgVW5leHBlY3RlZFF1YWxpZmllZFVzZUdlbmVyYXRvciwKICAgICAgICBVbmxpbmtlZEdlbmVyYXRvciwKICAgICAgICBVbnJlc29sdmVkTmFtZUdlbmVyYXRvciwKICAgICAgICBWYXJpYWJsZVVzZUdlbmVyYXRvcjsKCmltcG9ydCAnZXhwcmVzc2lvbl9nZW5lcmF0b3JfaGVscGVyLmRhcnQnIHNob3cgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlcjsKCmltcG9ydCAnZm9yZXN0LmRhcnQnIHNob3cgRm9yZXN0OwoKaW1wb3J0ICdrZXJuZWxfYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIEtlcm5lbFR5cGVCdWlsZGVyLAogICAgICAgIExvYWRMaWJyYXJ5QnVpbGRlciwKICAgICAgICBQcmVmaXhCdWlsZGVyLAogICAgICAgIFVubGlua2VkRGVjbGFyYXRpb24sCiAgICAgICAgVW5yZXNvbHZlZFR5cGU7CgppbXBvcnQgJ2tlcm5lbF9hcGkuZGFydCcgc2hvdyBOYW1lU3lzdGVtLCBwcmludE5vZGVPbiwgcHJpbnRRdWFsaWZpZWROYW1lT247CgppbXBvcnQgJ2tlcm5lbF9hc3RfYXBpLmRhcnQnCiAgICBzaG93CiAgICAgICAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCwKICAgICAgICBDb25zdHJ1Y3RvciwKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBGaWVsZCwKICAgICAgICBJbml0aWFsaXplciwKICAgICAgICBMZXQsCiAgICAgICAgTG9hZExpYnJhcnlUZWFyT2ZmSnVkZ21lbnQsCiAgICAgICAgTWVtYmVyLAogICAgICAgIE1ldGhvZEludm9jYXRpb25KdWRnbWVudCwKICAgICAgICBOYW1lLAogICAgICAgIE51bGxBd2FyZVByb3BlcnR5R2V0SnVkZ21lbnQsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFByb3BlcnR5R2V0LAogICAgICAgIFByb3BlcnR5U2V0LAogICAgICAgIFN0YXRpY1NldCwKICAgICAgICBTdXBlck1ldGhvZEludm9jYXRpb24sCiAgICAgICAgU3VwZXJNZXRob2RJbnZvY2F0aW9uSnVkZ21lbnQsCiAgICAgICAgU3VwZXJQcm9wZXJ0eUdldEp1ZGdtZW50LAogICAgICAgIFN1cGVyUHJvcGVydHlTZXQsCiAgICAgICAgVHJlZU5vZGUsCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uLAogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudCwKICAgICAgICBWYXJpYWJsZUdldCwKICAgICAgICBWYXJpYWJsZUdldEp1ZGdtZW50LAogICAgICAgIFZhcmlhYmxlU2V0OwoKaW1wb3J0ICdrZXJuZWxfYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIERlY2xhcmF0aW9uLAogICAgICAgIEtlcm5lbENsYXNzQnVpbGRlciwKICAgICAgICBLZXJuZWxJbnZhbGlkVHlwZUJ1aWxkZXIsCiAgICAgICAgTG9hZExpYnJhcnlCdWlsZGVyLAogICAgICAgIFByZWZpeEJ1aWxkZXIsCiAgICAgICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlcjsKCmltcG9ydCAna2VybmVsX3NoYWRvd19hc3QuZGFydCcgYXMgc2hhZG93CiAgICBzaG93IFByb3BlcnR5QXNzaWdubWVudEp1ZGdtZW50LCBTeW50aGV0aWNXcmFwcGVyOwoKcGFydCAna2VybmVsX2V4cHJlc3Npb25fZ2VuZXJhdG9yX2ltcGwuZGFydCc7CgphYnN0cmFjdCBjbGFzcyBLZXJuZWxFeHByZXNzaW9uR2VuZXJhdG9yIGltcGxlbWVudHMgRXhwcmVzc2lvbkdlbmVyYXRvciB7CiAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBnZXQgaGVscGVyOwoKICBUb2tlbiBnZXQgdG9rZW47CgogIEZvcmVzdCBnZXQgZm9yZXN0OwoKICBTdHJpbmcgZ2V0IHBsYWluTmFtZUZvclJlYWQ7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRTaW1wbGVSZWFkKCkgewogICAgcmV0dXJuIF9maW5pc2goX21ha2VTaW1wbGVSZWFkKCksIG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZEFzc2lnbm1lbnQoRXhwcmVzc2lvbiB2YWx1ZSwge2Jvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgdmFyIGNvbXBsZXhBc3NpZ25tZW50ID0gc3RhcnRDb21wbGV4QXNzaWdubWVudCh2YWx1ZSk7CiAgICByZXR1cm4gX2ZpbmlzaChfbWFrZVNpbXBsZVdyaXRlKHZhbHVlLCB2b2lkQ29udGV4dCwgY29tcGxleEFzc2lnbm1lbnQpLAogICAgICAgIGNvbXBsZXhBc3NpZ25tZW50KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGROdWxsQXdhcmVBc3NpZ25tZW50KAogICAgICBFeHByZXNzaW9uIHZhbHVlLCBEYXJ0VHlwZSB0eXBlLCBpbnQgb2Zmc2V0LAogICAgICB7Ym9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICB2YXIgY29tcGxleEFzc2lnbm1lbnQgPSBzdGFydENvbXBsZXhBc3NpZ25tZW50KHZhbHVlKTsKICAgIGlmICh2b2lkQ29udGV4dCkgewogICAgICB2YXIgbnVsbEF3YXJlQ29tYmluZXIgPSBmb3Jlc3QuY29uZGl0aW9uYWxFeHByZXNzaW9uKAogICAgICAgICAgYnVpbGRJc051bGwoX21ha2VSZWFkKGNvbXBsZXhBc3NpZ25tZW50KSwgb2Zmc2V0LCBoZWxwZXIpLAogICAgICAgICAgbnVsbCwKICAgICAgICAgIF9tYWtlV3JpdGUodmFsdWUsIGZhbHNlLCBjb21wbGV4QXNzaWdubWVudCksCiAgICAgICAgICBudWxsLAogICAgICAgICAgZm9yZXN0LmxpdGVyYWxOdWxsKG51bGwpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0KQogICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY29tcGxleEFzc2lnbm1lbnQ/Lm51bGxBd2FyZUNvbWJpbmVyID0gbnVsbEF3YXJlQ29tYmluZXI7CiAgICAgIHJldHVybiBfZmluaXNoKG51bGxBd2FyZUNvbWJpbmVyLCBjb21wbGV4QXNzaWdubWVudCk7CiAgICB9CiAgICB2YXIgdG1wID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoX21ha2VSZWFkKGNvbXBsZXhBc3NpZ25tZW50KSk7CiAgICB2YXIgbnVsbEF3YXJlQ29tYmluZXIgPSBmb3Jlc3QuY29uZGl0aW9uYWxFeHByZXNzaW9uKAogICAgICAgIGJ1aWxkSXNOdWxsKG5ldyBWYXJpYWJsZUdldCh0bXApLCBvZmZzZXQsIGhlbHBlciksCiAgICAgICAgbnVsbCwKICAgICAgICBfbWFrZVdyaXRlKHZhbHVlLCBmYWxzZSwgY29tcGxleEFzc2lnbm1lbnQpLAogICAgICAgIG51bGwsCiAgICAgICAgbmV3IFZhcmlhYmxlR2V0KHRtcCkpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgIGNvbXBsZXhBc3NpZ25tZW50Py5udWxsQXdhcmVDb21iaW5lciA9IG51bGxBd2FyZUNvbWJpbmVyOwogICAgcmV0dXJuIF9maW5pc2gobWFrZUxldCh0bXAsIG51bGxBd2FyZUNvbWJpbmVyKSwgY29tcGxleEFzc2lnbm1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZENvbXBvdW5kQXNzaWdubWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLCBFeHByZXNzaW9uIHZhbHVlLAogICAgICB7aW50IG9mZnNldDogVHJlZU5vZGUubm9PZmZzZXQsCiAgICAgIGJvb2wgdm9pZENvbnRleHQ6IGZhbHNlLAogICAgICBQcm9jZWR1cmUgaW50ZXJmYWNlVGFyZ2V0LAogICAgICBib29sIGlzUHJlSW5jRGVjOiBmYWxzZSwKICAgICAgYm9vbCBpc1Bvc3RJbmNEZWM6IGZhbHNlfSkgewogICAgdmFyIGNvbXBsZXhBc3NpZ25tZW50ID0gc3RhcnRDb21wbGV4QXNzaWdubWVudCh2YWx1ZSk7CiAgICBjb21wbGV4QXNzaWdubWVudD8uaXNQcmVJbmNEZWMgPSBpc1ByZUluY0RlYzsKICAgIGNvbXBsZXhBc3NpZ25tZW50Py5pc1Bvc3RJbmNEZWMgPSBpc1Bvc3RJbmNEZWM7CiAgICB2YXIgY29tYmluZXIgPSBtYWtlQmluYXJ5KF9tYWtlUmVhZChjb21wbGV4QXNzaWdubWVudCksIGJpbmFyeU9wZXJhdG9yLAogICAgICAgIGludGVyZmFjZVRhcmdldCwgdmFsdWUsIGhlbHBlciwKICAgICAgICBvZmZzZXQ6IG9mZnNldCk7CiAgICBjb21wbGV4QXNzaWdubWVudD8uY29tYmluZXIgPSBjb21iaW5lcjsKICAgIHJldHVybiBfZmluaXNoKF9tYWtlV3JpdGUoY29tYmluZXIsIHZvaWRDb250ZXh0LCBjb21wbGV4QXNzaWdubWVudCksCiAgICAgICAgY29tcGxleEFzc2lnbm1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZFByZWZpeEluY3JlbWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLAogICAgICB7aW50IG9mZnNldDogVHJlZU5vZGUubm9PZmZzZXQsCiAgICAgIGJvb2wgdm9pZENvbnRleHQ6IGZhbHNlLAogICAgICBQcm9jZWR1cmUgaW50ZXJmYWNlVGFyZ2V0fSkgewogICAgcmV0dXJuIGJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KAogICAgICAgIGJpbmFyeU9wZXJhdG9yLCBmb3Jlc3QubGl0ZXJhbEludCgxLCBudWxsKS4uZmlsZU9mZnNldCA9IG9mZnNldCwKICAgICAgICBvZmZzZXQ6IG9mZnNldCwKICAgICAgICB2b2lkQ29udGV4dDogdm9pZENvbnRleHQsCiAgICAgICAgaW50ZXJmYWNlVGFyZ2V0OiBpbnRlcmZhY2VUYXJnZXQsCiAgICAgICAgaXNQcmVJbmNEZWM6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZFBvc3RmaXhJbmNyZW1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwKICAgICAge2ludCBvZmZzZXQ6IFRyZWVOb2RlLm5vT2Zmc2V0LAogICAgICBib29sIHZvaWRDb250ZXh0OiBmYWxzZSwKICAgICAgUHJvY2VkdXJlIGludGVyZmFjZVRhcmdldH0pIHsKICAgIGlmICh2b2lkQ29udGV4dCkgewogICAgICByZXR1cm4gYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoCiAgICAgICAgICBiaW5hcnlPcGVyYXRvciwgZm9yZXN0LmxpdGVyYWxJbnQoMSwgbnVsbCkuLmZpbGVPZmZzZXQgPSBvZmZzZXQsCiAgICAgICAgICBvZmZzZXQ6IG9mZnNldCwKICAgICAgICAgIHZvaWRDb250ZXh0OiB2b2lkQ29udGV4dCwKICAgICAgICAgIGludGVyZmFjZVRhcmdldDogaW50ZXJmYWNlVGFyZ2V0LAogICAgICAgICAgaXNQb3N0SW5jRGVjOiB0cnVlKTsKICAgIH0KICAgIHZhciByaHMgPSBmb3Jlc3QubGl0ZXJhbEludCgxLCBudWxsKS4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgIHZhciBjb21wbGV4QXNzaWdubWVudCA9IHN0YXJ0Q29tcGxleEFzc2lnbm1lbnQocmhzKTsKICAgIHZhciB2YWx1ZSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKF9tYWtlUmVhZChjb21wbGV4QXNzaWdubWVudCkpOwogICAgdmFsdWVBY2Nlc3MoKSA9PiBuZXcgVmFyaWFibGVHZXQodmFsdWUpOwogICAgdmFyIGNvbWJpbmVyID0gbWFrZUJpbmFyeSgKICAgICAgICB2YWx1ZUFjY2VzcygpLCBiaW5hcnlPcGVyYXRvciwgaW50ZXJmYWNlVGFyZ2V0LCByaHMsIGhlbHBlciwKICAgICAgICBvZmZzZXQ6IG9mZnNldCk7CiAgICBjb21wbGV4QXNzaWdubWVudD8uY29tYmluZXIgPSBjb21iaW5lcjsKICAgIGNvbXBsZXhBc3NpZ25tZW50Py5pc1Bvc3RJbmNEZWMgPSB0cnVlOwogICAgdmFyIGR1bW15ID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudC5mb3JWYWx1ZSgKICAgICAgICBfbWFrZVdyaXRlKGNvbWJpbmVyLCB0cnVlLCBjb21wbGV4QXNzaWdubWVudCksCiAgICAgICAgaGVscGVyLmZ1bmN0aW9uTmVzdGluZ0xldmVsKTsKICAgIHJldHVybiBfZmluaXNoKAogICAgICAgIG1ha2VMZXQodmFsdWUsIG1ha2VMZXQoZHVtbXksIHZhbHVlQWNjZXNzKCkpKSwgY29tcGxleEFzc2lnbm1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBtYWtlSW52YWxpZFJlYWQoKSB7CiAgICByZXR1cm4gaGVscGVyLndyYXBTeW50aGV0aWNFeHByZXNzaW9uKAogICAgICAgIGhlbHBlci50aHJvd05vU3VjaE1ldGhvZEVycm9yKAogICAgICAgICAgICBmb3Jlc3QubGl0ZXJhbE51bGwodG9rZW4pLAogICAgICAgICAgICBwbGFpbk5hbWVGb3JSZWFkLAogICAgICAgICAgICBmb3Jlc3QuYXJndW1lbnRzRW1wdHkobm9Mb2NhdGlvbiksCiAgICAgICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSwKICAgICAgICAgICAgaXNHZXR0ZXI6IHRydWUpLAogICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIG1ha2VJbnZhbGlkV3JpdGUoRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgcmV0dXJuIGhlbHBlci53cmFwU3ludGhldGljRXhwcmVzc2lvbigKICAgICAgICBoZWxwZXIudGhyb3dOb1N1Y2hNZXRob2RFcnJvcigKICAgICAgICAgICAgZm9yZXN0LmxpdGVyYWxOdWxsKHRva2VuKSwKICAgICAgICAgICAgcGxhaW5OYW1lRm9yUmVhZCwKICAgICAgICAgICAgZm9yZXN0LmFyZ3VtZW50cyg8RXhwcmVzc2lvbj5bdmFsdWVdLCBub0xvY2F0aW9uKSwKICAgICAgICAgICAgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLAogICAgICAgICAgICBpc1NldHRlcjogdHJ1ZSksCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pKTsKICB9CgogIEV4cHJlc3Npb24gX21ha2VTaW1wbGVSZWFkKCkgPT4gX21ha2VSZWFkKG51bGwpOwoKICBFeHByZXNzaW9uIF9tYWtlU2ltcGxlV3JpdGUoRXhwcmVzc2lvbiB2YWx1ZSwgYm9vbCB2b2lkQ29udGV4dCwKICAgICAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBjb21wbGV4QXNzaWdubWVudCkgewogICAgcmV0dXJuIF9tYWtlV3JpdGUodmFsdWUsIHZvaWRDb250ZXh0LCBjb21wbGV4QXNzaWdubWVudCk7CiAgfQoKICBFeHByZXNzaW9uIF9tYWtlUmVhZChDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICBFeHByZXNzaW9uIHJlYWQgPSBtYWtlSW52YWxpZFJlYWQoKTsKICAgIGlmIChjb21wbGV4QXNzaWdubWVudCAhPSBudWxsKSB7CiAgICAgIHJlYWQgPSBoZWxwZXIuZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24ocmVhZCk7CiAgICAgIGNvbXBsZXhBc3NpZ25tZW50LnJlYWQgPSByZWFkOwogICAgfQogICAgcmV0dXJuIHJlYWQ7CiAgfQoKICBFeHByZXNzaW9uIF9tYWtlV3JpdGUoRXhwcmVzc2lvbiB2YWx1ZSwgYm9vbCB2b2lkQ29udGV4dCwKICAgICAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBjb21wbGV4QXNzaWdubWVudCkgewogICAgRXhwcmVzc2lvbiB3cml0ZSA9IG1ha2VJbnZhbGlkV3JpdGUodmFsdWUpOwogICAgaWYgKGNvbXBsZXhBc3NpZ25tZW50ICE9IG51bGwpIHsKICAgICAgd3JpdGUgPSBoZWxwZXIuZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24od3JpdGUpOwogICAgICBjb21wbGV4QXNzaWdubWVudC53cml0ZSA9IHdyaXRlOwogICAgfQogICAgcmV0dXJuIHdyaXRlOwogIH0KCiAgRXhwcmVzc2lvbiBfZmluaXNoKAogICAgICBFeHByZXNzaW9uIGJvZHksIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIGlmICghaGVscGVyLmxlZ2FjeU1vZGUgJiYgY29tcGxleEFzc2lnbm1lbnQgIT0gbnVsbCkgewogICAgICBjb21wbGV4QXNzaWdubWVudC5kZXN1Z2FyZWQgPSBib2R5OwogICAgICByZXR1cm4gY29tcGxleEFzc2lnbm1lbnQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gYm9keTsKICAgIH0KICB9CgogIC8vLyBDcmVhdGVzIGEgZGF0YSBzdHJ1Y3R1cmUgZm9yIHRyYWNraW5nIHRoZSBkZXN1Z2FyaW5nIG9mIGEgY29tcGxleAogIC8vLyBhc3NpZ25tZW50IGV4cHJlc3Npb24gd2hvc2UgcmlnaHQgaGFuZCBzaWRlIGlzIFtyaHNdLgogIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgc3RhcnRDb21wbGV4QXNzaWdubWVudChFeHByZXNzaW9uIHJocykgPT4KICAgICAgc2hhZG93LlN5bnRoZXRpY1dyYXBwZXIud3JhcElsbGVnYWxBc3NpZ25tZW50KHJocyk7Cn0KCmFic3RyYWN0IGNsYXNzIEtlcm5lbEdlbmVyYXRvciA9IEdlbmVyYXRvciB3aXRoIEtlcm5lbEV4cHJlc3Npb25HZW5lcmF0b3I7CgpjbGFzcyBLZXJuZWxWYXJpYWJsZVVzZUdlbmVyYXRvciBleHRlbmRzIEtlcm5lbEdlbmVyYXRvcgogICAgd2l0aCBWYXJpYWJsZVVzZUdlbmVyYXRvciB7CiAgZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZTsKCiAgZmluYWwgRGFydFR5cGUgcHJvbW90ZWRUeXBlOwoKICBLZXJuZWxWYXJpYWJsZVVzZUdlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sCiAgICAgIHRoaXMudmFyaWFibGUsIHRoaXMucHJvbW90ZWRUeXBlKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IHBsYWluTmFtZUZvclJlYWQgPT4gdmFyaWFibGUubmFtZTsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZVJlYWQoQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBjb21wbGV4QXNzaWdubWVudCkgewogICAgdmFyIGZhY3QgPSBoZWxwZXIudHlwZVByb21vdGVyCiAgICAgICAgPy5nZXRGYWN0Rm9yQWNjZXNzKHZhcmlhYmxlLCBoZWxwZXIuZnVuY3Rpb25OZXN0aW5nTGV2ZWwpOwogICAgdmFyIHNjb3BlID0gaGVscGVyLnR5cGVQcm9tb3Rlcj8uY3VycmVudFNjb3BlOwogICAgdmFyIHJlYWQgPSBuZXcgVmFyaWFibGVHZXRKdWRnbWVudCh2YXJpYWJsZSwgZmFjdCwgc2NvcGUpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIGNvbXBsZXhBc3NpZ25tZW50Py5yZWFkID0gcmVhZDsKICAgIHJldHVybiByZWFkOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZVdyaXRlKEV4cHJlc3Npb24gdmFsdWUsIGJvb2wgdm9pZENvbnRleHQsCiAgICAgIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIGhlbHBlci50eXBlUHJvbW90ZXI/Lm11dGF0ZVZhcmlhYmxlKHZhcmlhYmxlLCBoZWxwZXIuZnVuY3Rpb25OZXN0aW5nTGV2ZWwpOwogICAgRXhwcmVzc2lvbiB3cml0ZTsKICAgIGlmICh2YXJpYWJsZS5pc0ZpbmFsIHx8IHZhcmlhYmxlLmlzQ29uc3QpIHsKICAgICAgd3JpdGUgPSBtYWtlSW52YWxpZFdyaXRlKHZhbHVlKTsKICAgICAgaWYgKGNvbXBsZXhBc3NpZ25tZW50ICE9IG51bGwpIHsKICAgICAgICB3cml0ZSA9IGhlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbih3cml0ZSk7CiAgICAgICAgY29tcGxleEFzc2lnbm1lbnQud3JpdGUgPSB3cml0ZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgd3JpdGUgPSBuZXcgVmFyaWFibGVTZXQodmFyaWFibGUsIHZhbHVlKQogICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgICAgY29tcGxleEFzc2lnbm1lbnQ/LndyaXRlID0gd3JpdGU7CiAgICB9CiAgICByZXR1cm4gd3JpdGU7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGRvSW52b2NhdGlvbihpbnQgb2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gaGVscGVyLmJ1aWxkTWV0aG9kSW52b2NhdGlvbihidWlsZFNpbXBsZVJlYWQoKSwgY2FsbE5hbWUsIGFyZ3VtZW50cywKICAgICAgICBhZGp1c3RGb3JJbXBsaWNpdENhbGwocGxhaW5OYW1lRm9yUmVhZCwgb2Zmc2V0KSwKICAgICAgICBpc0ltcGxpY2l0Q2FsbDogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IHN0YXJ0Q29tcGxleEFzc2lnbm1lbnQoRXhwcmVzc2lvbiByaHMpIHsKICAgIHJldHVybiBzaGFkb3cuU3ludGhldGljV3JhcHBlci53cmFwVmFyaWFibGVBc3NpZ25tZW50KHJocykKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgTmFtZVN5c3RlbSBzeW50aGV0aWNOYW1lcyA9IG5ldyBOYW1lU3lzdGVtKCk7CiAgICBzaW5rLndyaXRlKCIsIHZhcmlhYmxlOiAiKTsKICAgIHByaW50Tm9kZU9uKHZhcmlhYmxlLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogICAgc2luay53cml0ZSgiLCBwcm9tb3RlZFR5cGU6ICIpOwogICAgcHJpbnROb2RlT24ocHJvbW90ZWRUeXBlLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogIH0KfQoKY2xhc3MgS2VybmVsUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IgZXh0ZW5kcyBLZXJuZWxHZW5lcmF0b3IKICAgIHdpdGggUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IgewogIGZpbmFsIEV4cHJlc3Npb24gcmVjZWl2ZXI7CgogIGZpbmFsIE5hbWUgbmFtZTsKCiAgZmluYWwgTWVtYmVyIGdldHRlcjsKCiAgZmluYWwgTWVtYmVyIHNldHRlcjsKCiAgVmFyaWFibGVEZWNsYXJhdGlvbiBfcmVjZWl2ZXJWYXJpYWJsZTsKCiAgS2VybmVsUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IuaW50ZXJuYWwoRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsCiAgICAgIFRva2VuIHRva2VuLCB0aGlzLnJlY2VpdmVyLCB0aGlzLm5hbWUsIHRoaXMuZ2V0dGVyLCB0aGlzLnNldHRlcikKICAgICAgOiBzdXBlcihoZWxwZXIsIHRva2VuKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBwbGFpbk5hbWVGb3JSZWFkID0+IG5hbWUubmFtZTsKCiAgcmVjZWl2ZXJBY2Nlc3MoKSB7CiAgICBfcmVjZWl2ZXJWYXJpYWJsZSA/Pz0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUocmVjZWl2ZXIpOwogICAgcmV0dXJuIG5ldyBWYXJpYWJsZUdldChfcmVjZWl2ZXJWYXJpYWJsZSkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBkb0ludm9jYXRpb24oaW50IG9mZnNldCwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIGhlbHBlci5idWlsZE1ldGhvZEludm9jYXRpb24ocmVjZWl2ZXIsIG5hbWUsIGFyZ3VtZW50cywgb2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgc3RhcnRDb21wbGV4QXNzaWdubWVudChFeHByZXNzaW9uIHJocykgPT4KICAgICAgc2hhZG93LlN5bnRoZXRpY1dyYXBwZXIud3JhcFByb3BlcnR5QXNzaWdubWVudChyZWNlaXZlciwgcmhzKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgTmFtZVN5c3RlbSBzeW50aGV0aWNOYW1lcyA9IG5ldyBOYW1lU3lzdGVtKCk7CiAgICBzaW5rLndyaXRlKCIsIF9yZWNlaXZlclZhcmlhYmxlOiAiKTsKICAgIHByaW50Tm9kZU9uKF9yZWNlaXZlclZhcmlhYmxlLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogICAgc2luay53cml0ZSgiLCByZWNlaXZlcjogIik7CiAgICBwcmludE5vZGVPbihyZWNlaXZlciwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICAgIHNpbmsud3JpdGUoIiwgbmFtZTogIik7CiAgICBzaW5rLndyaXRlKG5hbWUubmFtZSk7CiAgICBzaW5rLndyaXRlKCIsIGdldHRlcjogIik7CiAgICBwcmludFF1YWxpZmllZE5hbWVPbihnZXR0ZXIsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgICBzaW5rLndyaXRlKCIsIHNldHRlcjogIik7CiAgICBwcmludFF1YWxpZmllZE5hbWVPbihzZXR0ZXIsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9tYWtlU2ltcGxlUmVhZCgpIHsKICAgIHJldHVybiBuZXcgUHJvcGVydHlHZXQocmVjZWl2ZXIsIG5hbWUsIGdldHRlcikKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZVNpbXBsZVdyaXRlKEV4cHJlc3Npb24gdmFsdWUsIGJvb2wgdm9pZENvbnRleHQsCiAgICAgIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIHZhciB3cml0ZSA9IG5ldyBQcm9wZXJ0eVNldChyZWNlaXZlciwgbmFtZSwgdmFsdWUsIHNldHRlcikKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogICAgY29tcGxleEFzc2lnbm1lbnQ/LndyaXRlID0gd3JpdGU7CiAgICByZXR1cm4gd3JpdGU7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9tYWtlUmVhZChDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICB2YXIgcmVhZCA9IG5ldyBQcm9wZXJ0eUdldChyZWNlaXZlckFjY2VzcygpLCBuYW1lLCBnZXR0ZXIpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIGNvbXBsZXhBc3NpZ25tZW50Py5yZWFkID0gcmVhZDsKICAgIHJldHVybiByZWFkOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZVdyaXRlKEV4cHJlc3Npb24gdmFsdWUsIGJvb2wgdm9pZENvbnRleHQsCiAgICAgIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIHZhciB3cml0ZSA9IG5ldyBQcm9wZXJ0eVNldChyZWNlaXZlckFjY2VzcygpLCBuYW1lLCB2YWx1ZSwgc2V0dGVyKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICBjb21wbGV4QXNzaWdubWVudD8ud3JpdGUgPSB3cml0ZTsKICAgIHJldHVybiB3cml0ZTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX2ZpbmlzaCgKICAgICAgRXhwcmVzc2lvbiBib2R5LCBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICByZXR1cm4gc3VwZXIuX2ZpbmlzaChtYWtlTGV0KF9yZWNlaXZlclZhcmlhYmxlLCBib2R5KSwgY29tcGxleEFzc2lnbm1lbnQpOwogIH0KfQoKY2xhc3MgS2VybmVsVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGV4dGVuZHMgS2VybmVsR2VuZXJhdG9yCiAgICB3aXRoIFRoaXNQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvciB7CiAgZmluYWwgTmFtZSBuYW1lOwoKICBmaW5hbCBNZW1iZXIgZ2V0dGVyOwoKICBmaW5hbCBNZW1iZXIgc2V0dGVyOwoKICBLZXJuZWxUaGlzUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IoRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsCiAgICAgIFRva2VuIHRva2VuLCB0aGlzLm5hbWUsIHRoaXMuZ2V0dGVyLCB0aGlzLnNldHRlcikKICAgICAgOiBzdXBlcihoZWxwZXIsIHRva2VuKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBwbGFpbk5hbWVGb3JSZWFkID0+IG5hbWUubmFtZTsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZVJlYWQoQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBjb21wbGV4QXNzaWdubWVudCkgewogICAgaWYgKGdldHRlciA9PSBudWxsKSB7CiAgICAgIGhlbHBlci53YXJuVW5yZXNvbHZlZEdldChuYW1lLCBvZmZzZXRGb3JUb2tlbih0b2tlbikpOwogICAgfQogICAgdmFyIHJlYWQgPSBuZXcgUHJvcGVydHlHZXQoZm9yZXN0LnRoaXNFeHByZXNzaW9uKHRva2VuKSwgbmFtZSwgZ2V0dGVyKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICBjb21wbGV4QXNzaWdubWVudD8ucmVhZCA9IHJlYWQ7CiAgICByZXR1cm4gcmVhZDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX21ha2VXcml0ZShFeHByZXNzaW9uIHZhbHVlLCBib29sIHZvaWRDb250ZXh0LAogICAgICBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICBpZiAoc2V0dGVyID09IG51bGwpIHsKICAgICAgaGVscGVyLndhcm5VbnJlc29sdmVkU2V0KG5hbWUsIG9mZnNldEZvclRva2VuKHRva2VuKSk7CiAgICB9CiAgICB2YXIgd3JpdGUgPQogICAgICAgIG5ldyBQcm9wZXJ0eVNldChmb3Jlc3QudGhpc0V4cHJlc3Npb24odG9rZW4pLCBuYW1lLCB2YWx1ZSwgc2V0dGVyKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogICAgY29tcGxleEFzc2lnbm1lbnQ/LndyaXRlID0gd3JpdGU7CiAgICByZXR1cm4gd3JpdGU7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGRvSW52b2NhdGlvbihpbnQgb2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICBNZW1iZXIgaW50ZXJmYWNlVGFyZ2V0ID0gZ2V0dGVyOwogICAgaWYgKGludGVyZmFjZVRhcmdldCA9PSBudWxsKSB7CiAgICAgIGhlbHBlci53YXJuVW5yZXNvbHZlZE1ldGhvZChuYW1lLCBvZmZzZXQpOwogICAgfQogICAgaWYgKGludGVyZmFjZVRhcmdldCBpcyBGaWVsZCkgewogICAgICAvLyBUT0RPKGFoZSk6IEluIHN0cm9uZyBtb2RlIHdlIHNob3VsZCBwcm9iYWJseSByZXdyaXRlIHRoaXMgdG8KICAgICAgLy8gYHRoaXMubmFtZS5jYWxsKGFyZ3VtZW50cylgLgogICAgICBpbnRlcmZhY2VUYXJnZXQgPSBudWxsOwogICAgfQogICAgcmV0dXJuIGhlbHBlci5idWlsZE1ldGhvZEludm9jYXRpb24oCiAgICAgICAgZm9yZXN0LnRoaXNFeHByZXNzaW9uKG51bGwpLCBuYW1lLCBhcmd1bWVudHMsIG9mZnNldCwKICAgICAgICBpbnRlcmZhY2VUYXJnZXQ6IGludGVyZmFjZVRhcmdldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IHN0YXJ0Q29tcGxleEFzc2lnbm1lbnQoRXhwcmVzc2lvbiByaHMpID0+CiAgICAgIHNoYWRvdy5TeW50aGV0aWNXcmFwcGVyLndyYXBQcm9wZXJ0eUFzc2lnbm1lbnQobnVsbCwgcmhzKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgTmFtZVN5c3RlbSBzeW50aGV0aWNOYW1lcyA9IG5ldyBOYW1lU3lzdGVtKCk7CiAgICBzaW5rLndyaXRlKCIsIG5hbWU6ICIpOwogICAgc2luay53cml0ZShuYW1lLm5hbWUpOwogICAgc2luay53cml0ZSgiLCBnZXR0ZXI6ICIpOwogICAgcHJpbnRRdWFsaWZpZWROYW1lT24oZ2V0dGVyLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogICAgc2luay53cml0ZSgiLCBzZXR0ZXI6ICIpOwogICAgcHJpbnRRdWFsaWZpZWROYW1lT24oc2V0dGVyLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogIH0KfQoKY2xhc3MgS2VybmVsTnVsbEF3YXJlUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IgZXh0ZW5kcyBLZXJuZWxHZW5lcmF0b3IKICAgIHdpdGggTnVsbEF3YXJlUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IgewogIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVjZWl2ZXI7CgogIGZpbmFsIEV4cHJlc3Npb24gcmVjZWl2ZXJFeHByZXNzaW9uOwoKICBmaW5hbCBOYW1lIG5hbWU7CgogIGZpbmFsIE1lbWJlciBnZXR0ZXI7CgogIGZpbmFsIE1lbWJlciBzZXR0ZXI7CgogIGZpbmFsIERhcnRUeXBlIHR5cGU7CgogIEtlcm5lbE51bGxBd2FyZVByb3BlcnR5QWNjZXNzR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgVG9rZW4gdG9rZW4sCiAgICAgIHRoaXMucmVjZWl2ZXJFeHByZXNzaW9uLAogICAgICB0aGlzLm5hbWUsCiAgICAgIHRoaXMuZ2V0dGVyLAogICAgICB0aGlzLnNldHRlciwKICAgICAgdGhpcy50eXBlKQogICAgICA6IHRoaXMucmVjZWl2ZXIgPSBtYWtlT3JSZXVzZVZhcmlhYmxlKHJlY2VpdmVyRXhwcmVzc2lvbiksCiAgICAgICAgc3VwZXIoaGVscGVyLCB0b2tlbik7CgogIEV4cHJlc3Npb24gcmVjZWl2ZXJBY2Nlc3MoKSA9PiBuZXcgVmFyaWFibGVHZXQocmVjZWl2ZXIpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IHBsYWluTmFtZUZvclJlYWQgPT4gbmFtZS5uYW1lOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9tYWtlUmVhZChDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICB2YXIgcmVhZCA9IG5ldyBQcm9wZXJ0eUdldChyZWNlaXZlckFjY2VzcygpLCBuYW1lLCBnZXR0ZXIpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIGNvbXBsZXhBc3NpZ25tZW50Py5yZWFkID0gcmVhZDsKICAgIHJldHVybiByZWFkOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZVdyaXRlKEV4cHJlc3Npb24gdmFsdWUsIGJvb2wgdm9pZENvbnRleHQsCiAgICAgIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIHZhciB3cml0ZSA9IG5ldyBQcm9wZXJ0eVNldChyZWNlaXZlckFjY2VzcygpLCBuYW1lLCB2YWx1ZSwgc2V0dGVyKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICBjb21wbGV4QXNzaWdubWVudD8ud3JpdGUgPSB3cml0ZTsKICAgIHJldHVybiB3cml0ZTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX2ZpbmlzaCgKICAgICAgRXhwcmVzc2lvbiBib2R5LCBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICB2YXIgb2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogICAgdmFyIG51bGxBd2FyZUd1YXJkID0gZm9yZXN0LmNvbmRpdGlvbmFsRXhwcmVzc2lvbigKICAgICAgICBidWlsZElzTnVsbChyZWNlaXZlckFjY2VzcygpLCBvZmZzZXQsIGhlbHBlciksCiAgICAgICAgbnVsbCwKICAgICAgICBmb3Jlc3QubGl0ZXJhbE51bGwobnVsbCkuLmZpbGVPZmZzZXQgPSBvZmZzZXQsCiAgICAgICAgbnVsbCwKICAgICAgICBib2R5KQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICBpZiAoY29tcGxleEFzc2lnbm1lbnQgIT0gbnVsbCkgewogICAgICBib2R5ID0gbWFrZUxldChyZWNlaXZlciwgbnVsbEF3YXJlR3VhcmQpOwogICAgICBpZiAoaGVscGVyLmxlZ2FjeU1vZGUpIHJldHVybiBib2R5OwogICAgICBzaGFkb3cuUHJvcGVydHlBc3NpZ25tZW50SnVkZ21lbnQga2VybmVsUHJvcGVydHlBc3NpZ24gPQogICAgICAgICAgY29tcGxleEFzc2lnbm1lbnQ7CiAgICAgIGtlcm5lbFByb3BlcnR5QXNzaWduLm51bGxBd2FyZUd1YXJkID0gbnVsbEF3YXJlR3VhcmQ7CiAgICAgIGtlcm5lbFByb3BlcnR5QXNzaWduLmRlc3VnYXJlZCA9IGJvZHk7CiAgICAgIHJldHVybiBrZXJuZWxQcm9wZXJ0eUFzc2lnbjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgTnVsbEF3YXJlUHJvcGVydHlHZXRKdWRnbWVudChyZWNlaXZlciwgbnVsbEF3YXJlR3VhcmQpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBkb0ludm9jYXRpb24oaW50IG9mZnNldCwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCJkb0ludm9jYXRpb24iLCBvZmZzZXQsIHVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IHN0YXJ0Q29tcGxleEFzc2lnbm1lbnQoRXhwcmVzc2lvbiByaHMpID0+CiAgICAgIHNoYWRvdy5TeW50aGV0aWNXcmFwcGVyLndyYXBQcm9wZXJ0eUFzc2lnbm1lbnQocmVjZWl2ZXJFeHByZXNzaW9uLCByaHMpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKSB7CiAgICBOYW1lU3lzdGVtIHN5bnRoZXRpY05hbWVzID0gbmV3IE5hbWVTeXN0ZW0oKTsKICAgIHNpbmsud3JpdGUoIiwgcmVjZWl2ZXI6ICIpOwogICAgcHJpbnROb2RlT24ocmVjZWl2ZXIsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgICBzaW5rLndyaXRlKCIsIHJlY2VpdmVyRXhwcmVzc2lvbjogIik7CiAgICBwcmludE5vZGVPbihyZWNlaXZlckV4cHJlc3Npb24sIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgICBzaW5rLndyaXRlKCIsIG5hbWU6ICIpOwogICAgc2luay53cml0ZShuYW1lLm5hbWUpOwogICAgc2luay53cml0ZSgiLCBnZXR0ZXI6ICIpOwogICAgcHJpbnRRdWFsaWZpZWROYW1lT24oZ2V0dGVyLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogICAgc2luay53cml0ZSgiLCBzZXR0ZXI6ICIpOwogICAgcHJpbnRRdWFsaWZpZWROYW1lT24oc2V0dGVyLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogICAgc2luay53cml0ZSgiLCB0eXBlOiAiKTsKICAgIHByaW50Tm9kZU9uKHR5cGUsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgfQp9CgpjbGFzcyBLZXJuZWxTdXBlclByb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGV4dGVuZHMgS2VybmVsR2VuZXJhdG9yCiAgICB3aXRoIFN1cGVyUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IgewogIGZpbmFsIE5hbWUgbmFtZTsKCiAgZmluYWwgTWVtYmVyIGdldHRlcjsKCiAgZmluYWwgTWVtYmVyIHNldHRlcjsKCiAgS2VybmVsU3VwZXJQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgVG9rZW4gdG9rZW4sIHRoaXMubmFtZSwgdGhpcy5nZXR0ZXIsIHRoaXMuc2V0dGVyKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IHBsYWluTmFtZUZvclJlYWQgPT4gbmFtZS5uYW1lOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9tYWtlUmVhZChDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICBpZiAoZ2V0dGVyID09IG51bGwpIHsKICAgICAgaGVscGVyLndhcm5VbnJlc29sdmVkR2V0KG5hbWUsIG9mZnNldEZvclRva2VuKHRva2VuKSwgaXNTdXBlcjogdHJ1ZSk7CiAgICB9CiAgICAvLyBUT0RPKGFoZSk6IFVzZSBbRGlyZWN0UHJvcGVydHlHZXRdIHdoZW4gcG9zc2libGUuCiAgICB2YXIgcmVhZCA9IG5ldyBTdXBlclByb3BlcnR5R2V0SnVkZ21lbnQobmFtZSwgaW50ZXJmYWNlVGFyZ2V0OiBnZXR0ZXIpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIGNvbXBsZXhBc3NpZ25tZW50Py5yZWFkID0gcmVhZDsKICAgIHJldHVybiByZWFkOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZVdyaXRlKEV4cHJlc3Npb24gdmFsdWUsIGJvb2wgdm9pZENvbnRleHQsCiAgICAgIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIGlmIChzZXR0ZXIgPT0gbnVsbCkgewogICAgICBoZWxwZXIud2FyblVucmVzb2x2ZWRTZXQobmFtZSwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBpc1N1cGVyOiB0cnVlKTsKICAgIH0KICAgIC8vIFRPRE8oYWhlKTogVXNlIFtEaXJlY3RQcm9wZXJ0eVNldF0gd2hlbiBwb3NzaWJsZS4KICAgIHZhciB3cml0ZSA9IG5ldyBTdXBlclByb3BlcnR5U2V0KG5hbWUsIHZhbHVlLCBzZXR0ZXIpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIGNvbXBsZXhBc3NpZ25tZW50Py53cml0ZSA9IHdyaXRlOwogICAgcmV0dXJuIHdyaXRlOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBkb0ludm9jYXRpb24oaW50IG9mZnNldCwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgaWYgKGhlbHBlci5jb25zdGFudENvbnRleHQgIT0gQ29uc3RhbnRDb250ZXh0Lm5vbmUpIHsKICAgICAgLy8gVE9ETyhicmlhbndpbGtlcnNvbikgRml4IHRoZSBsZW5ndGgKICAgICAgaGVscGVyLmFkZFByb2JsZW0obWVzc2FnZU5vdEFDb25zdGFudEV4cHJlc3Npb24sIG9mZnNldCwgMSk7CiAgICB9CiAgICBpZiAoZ2V0dGVyID09IG51bGwgfHwgaXNGaWVsZE9yR2V0dGVyKGdldHRlcikpIHsKICAgICAgcmV0dXJuIGhlbHBlci5idWlsZE1ldGhvZEludm9jYXRpb24oCiAgICAgICAgICBidWlsZFNpbXBsZVJlYWQoKSwgY2FsbE5hbWUsIGFyZ3VtZW50cywgb2Zmc2V0LAogICAgICAgICAgLy8gVGhpcyBpc24ndCBhIGNvbnN0YW50IGV4cHJlc3Npb24sIGJ1dCB3ZSBoYXZlIGNoZWNrZWQgaWYgYQogICAgICAgICAgLy8gY29uc3RhbnQgZXhwcmVzc2lvbiBlcnJvciBzaG91bGQgYmUgZW1pdHRlZCBhbHJlYWR5LgogICAgICAgICAgaXNDb25zdGFudEV4cHJlc3Npb246IHRydWUsCiAgICAgICAgICBpc0ltcGxpY2l0Q2FsbDogdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICAvLyBUT0RPKGFoZSk6IFRoaXMgY291bGQgYmUgc29tZXRoaW5nIGxpa2UgInN1cGVyLnByb3BlcnR5KC4uLikiIHdoZXJlCiAgICAgIC8vIHByb3BlcnR5IGlzIGEgc2V0dGVyLgogICAgICByZXR1cm4gdW5oYW5kbGVkKCIke2dldHRlci5ydW50aW1lVHlwZX0iLCAiZG9JbnZvY2F0aW9uIiwgb2Zmc2V0LCB1cmkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBzdGFydENvbXBsZXhBc3NpZ25tZW50KEV4cHJlc3Npb24gcmhzKSA9PgogICAgICBzaGFkb3cuU3ludGhldGljV3JhcHBlci53cmFwUHJvcGVydHlBc3NpZ25tZW50KG51bGwsIHJocywgaXNTdXBlcjogdHJ1ZSk7CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIE5hbWVTeXN0ZW0gc3ludGhldGljTmFtZXMgPSBuZXcgTmFtZVN5c3RlbSgpOwogICAgc2luay53cml0ZSgiLCBuYW1lOiAiKTsKICAgIHNpbmsud3JpdGUobmFtZS5uYW1lKTsKICAgIHNpbmsud3JpdGUoIiwgZ2V0dGVyOiAiKTsKICAgIHByaW50UXVhbGlmaWVkTmFtZU9uKGdldHRlciwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICAgIHNpbmsud3JpdGUoIiwgc2V0dGVyOiAiKTsKICAgIHByaW50UXVhbGlmaWVkTmFtZU9uKHNldHRlciwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICB9Cn0KCmNsYXNzIEtlcm5lbEluZGV4ZWRBY2Nlc3NHZW5lcmF0b3IgZXh0ZW5kcyBLZXJuZWxHZW5lcmF0b3IKICAgIHdpdGggSW5kZXhlZEFjY2Vzc0dlbmVyYXRvciB7CiAgZmluYWwgRXhwcmVzc2lvbiByZWNlaXZlcjsKCiAgZmluYWwgRXhwcmVzc2lvbiBpbmRleDsKCiAgZmluYWwgUHJvY2VkdXJlIGdldHRlcjsKCiAgZmluYWwgUHJvY2VkdXJlIHNldHRlcjsKCiAgVmFyaWFibGVEZWNsYXJhdGlvbiByZWNlaXZlclZhcmlhYmxlOwoKICBWYXJpYWJsZURlY2xhcmF0aW9uIGluZGV4VmFyaWFibGU7CgogIEtlcm5lbEluZGV4ZWRBY2Nlc3NHZW5lcmF0b3IuaW50ZXJuYWwoRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsCiAgICAgIFRva2VuIHRva2VuLCB0aGlzLnJlY2VpdmVyLCB0aGlzLmluZGV4LCB0aGlzLmdldHRlciwgdGhpcy5zZXR0ZXIpCiAgICAgIDogc3VwZXIoaGVscGVyLCB0b2tlbik7CgogIEV4cHJlc3Npb24gaW5kZXhBY2Nlc3MoKSB7CiAgICBpbmRleFZhcmlhYmxlID8/PSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZShpbmRleCk7CiAgICByZXR1cm4gbmV3IFZhcmlhYmxlR2V0KGluZGV4VmFyaWFibGUpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogIH0KCiAgRXhwcmVzc2lvbiByZWNlaXZlckFjY2VzcygpIHsKICAgIC8vIFdlIGNhbm5vdCByZXVzZSB0aGUgcmVjZWl2ZXIgaWYgaXQgaXMgYSB2YXJpYWJsZSBzaW5jZSBpdCBtaWdodCBiZQogICAgLy8gcmVhc3NpZ25lZCBpbiB0aGUgaW5kZXggZXhwcmVzc2lvbi4KICAgIHJlY2VpdmVyVmFyaWFibGUgPz89IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKHJlY2VpdmVyKTsKICAgIHJldHVybiBuZXcgVmFyaWFibGVHZXQocmVjZWl2ZXJWYXJpYWJsZSkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZVNpbXBsZVJlYWQoKSB7CiAgICB2YXIgcmVhZCA9IG5ldyBNZXRob2RJbnZvY2F0aW9uSnVkZ21lbnQocmVjZWl2ZXIsIGluZGV4R2V0TmFtZSwKICAgICAgICBmb3Jlc3QuY2FzdEFyZ3VtZW50cyhmb3Jlc3QuYXJndW1lbnRzKDxFeHByZXNzaW9uPltpbmRleF0sIHRva2VuKSksCiAgICAgICAgaW50ZXJmYWNlVGFyZ2V0OiBnZXR0ZXIpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIHJldHVybiByZWFkOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZVNpbXBsZVdyaXRlKEV4cHJlc3Npb24gdmFsdWUsIGJvb2wgdm9pZENvbnRleHQsCiAgICAgIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIGlmICghdm9pZENvbnRleHQpIHJldHVybiBfbWFrZVdyaXRlQW5kUmV0dXJuKHZhbHVlLCBjb21wbGV4QXNzaWdubWVudCk7CiAgICB2YXIgd3JpdGUgPSBuZXcgTWV0aG9kSW52b2NhdGlvbkp1ZGdtZW50KAogICAgICAgIHJlY2VpdmVyLAogICAgICAgIGluZGV4U2V0TmFtZSwKICAgICAgICBmb3Jlc3QKICAgICAgICAgICAgLmNhc3RBcmd1bWVudHMoZm9yZXN0LmFyZ3VtZW50cyg8RXhwcmVzc2lvbj5baW5kZXgsIHZhbHVlXSwgdG9rZW4pKSwKICAgICAgICBpbnRlcmZhY2VUYXJnZXQ6IHNldHRlcikKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogICAgY29tcGxleEFzc2lnbm1lbnQ/LndyaXRlID0gd3JpdGU7CiAgICByZXR1cm4gd3JpdGU7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9tYWtlUmVhZChDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICB2YXIgcmVhZCA9IG5ldyBNZXRob2RJbnZvY2F0aW9uSnVkZ21lbnQoCiAgICAgICAgcmVjZWl2ZXJBY2Nlc3MoKSwKICAgICAgICBpbmRleEdldE5hbWUsCiAgICAgICAgZm9yZXN0LmNhc3RBcmd1bWVudHMoCiAgICAgICAgICAgIGZvcmVzdC5hcmd1bWVudHMoPEV4cHJlc3Npb24+W2luZGV4QWNjZXNzKCldLCB0b2tlbikpLAogICAgICAgIGludGVyZmFjZVRhcmdldDogZ2V0dGVyKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICBjb21wbGV4QXNzaWdubWVudD8ucmVhZCA9IHJlYWQ7CiAgICByZXR1cm4gcmVhZDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX21ha2VXcml0ZShFeHByZXNzaW9uIHZhbHVlLCBib29sIHZvaWRDb250ZXh0LAogICAgICBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICBpZiAoIXZvaWRDb250ZXh0KSByZXR1cm4gX21ha2VXcml0ZUFuZFJldHVybih2YWx1ZSwgY29tcGxleEFzc2lnbm1lbnQpOwogICAgdmFyIHdyaXRlID0gbmV3IE1ldGhvZEludm9jYXRpb25KdWRnbWVudCgKICAgICAgICByZWNlaXZlckFjY2VzcygpLAogICAgICAgIGluZGV4U2V0TmFtZSwKICAgICAgICBmb3Jlc3QuY2FzdEFyZ3VtZW50cygKICAgICAgICAgICAgZm9yZXN0LmFyZ3VtZW50cyg8RXhwcmVzc2lvbj5baW5kZXhBY2Nlc3MoKSwgdmFsdWVdLCB0b2tlbikpLAogICAgICAgIGludGVyZmFjZVRhcmdldDogc2V0dGVyKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICBjb21wbGV4QXNzaWdubWVudD8ud3JpdGUgPSB3cml0ZTsKICAgIHJldHVybiB3cml0ZTsKICB9CgogIC8vIFRPRE8oZG1pdHJ5YXMpOiByZW1vdmUgdGhpcyBtZXRob2QgYWZ0ZXIgdGhlICJbXT0iIG9wZXJhdG9yIG9mIHRoZSBDb250ZXh0CiAgLy8gY2xhc3MgaXMgbWFkZSB0byByZXR1cm4gYSB2YWx1ZS4KICBFeHByZXNzaW9uIF9tYWtlV3JpdGVBbmRSZXR1cm4oCiAgICAgIEV4cHJlc3Npb24gdmFsdWUsIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIC8vIFRoZSBjYWxsIHRvIFtdPSBkb2VzIG5vdCByZXR1cm4gdGhlIHZhbHVlIGxpa2UgZGlyZWN0LXN0eWxlIGFzc2lnbm1lbnRzCiAgICAvLyBkby4gIFdlIG5lZWQgdG8gYmluZCB0aGUgdmFsdWUgaW4gYSBsZXQuCiAgICB2YXIgdmFsdWVWYXJpYWJsZSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKHZhbHVlKTsKICAgIHZhciB3cml0ZSA9IG5ldyBNZXRob2RJbnZvY2F0aW9uSnVkZ21lbnQoCiAgICAgICAgcmVjZWl2ZXJBY2Nlc3MoKSwKICAgICAgICBpbmRleFNldE5hbWUsCiAgICAgICAgZm9yZXN0LmNhc3RBcmd1bWVudHMoZm9yZXN0LmFyZ3VtZW50cygKICAgICAgICAgICAgPEV4cHJlc3Npb24+W2luZGV4QWNjZXNzKCksIG5ldyBWYXJpYWJsZUdldCh2YWx1ZVZhcmlhYmxlKV0sCiAgICAgICAgICAgIHRva2VuKSksCiAgICAgICAgaW50ZXJmYWNlVGFyZ2V0OiBzZXR0ZXIpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIGNvbXBsZXhBc3NpZ25tZW50Py53cml0ZSA9IHdyaXRlOwogICAgdmFyIGR1bW15ID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudC5mb3JWYWx1ZSgKICAgICAgICB3cml0ZSwgaGVscGVyLmZ1bmN0aW9uTmVzdGluZ0xldmVsKTsKICAgIHJldHVybiBtYWtlTGV0KAogICAgICAgIHZhbHVlVmFyaWFibGUsIG1ha2VMZXQoZHVtbXksIG5ldyBWYXJpYWJsZUdldCh2YWx1ZVZhcmlhYmxlKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfZmluaXNoKAogICAgICBFeHByZXNzaW9uIGJvZHksIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIGludCBvZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICByZXR1cm4gc3VwZXIuX2ZpbmlzaCgKICAgICAgICBtYWtlTGV0KAogICAgICAgICAgICByZWNlaXZlclZhcmlhYmxlLCBtYWtlTGV0KGluZGV4VmFyaWFibGUsIGJvZHkpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0KQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0LAogICAgICAgIGNvbXBsZXhBc3NpZ25tZW50KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZG9JbnZvY2F0aW9uKGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBoZWxwZXIuYnVpbGRNZXRob2RJbnZvY2F0aW9uKAogICAgICAgIGJ1aWxkU2ltcGxlUmVhZCgpLCBjYWxsTmFtZSwgYXJndW1lbnRzLCBmb3Jlc3QucmVhZE9mZnNldChhcmd1bWVudHMpLAogICAgICAgIGlzSW1wbGljaXRDYWxsOiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgc3RhcnRDb21wbGV4QXNzaWdubWVudChFeHByZXNzaW9uIHJocykgPT4KICAgICAgc2hhZG93LlN5bnRoZXRpY1dyYXBwZXIud3JhcEluZGV4QXNzaWdubWVudChyZWNlaXZlciwgaW5kZXgsIHJocyk7CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIE5hbWVTeXN0ZW0gc3ludGhldGljTmFtZXMgPSBuZXcgTmFtZVN5c3RlbSgpOwogICAgc2luay53cml0ZSgiLCByZWNlaXZlcjogIik7CiAgICBwcmludE5vZGVPbihyZWNlaXZlciwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICAgIHNpbmsud3JpdGUoIiwgaW5kZXg6ICIpOwogICAgcHJpbnROb2RlT24oaW5kZXgsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgICBzaW5rLndyaXRlKCIsIGdldHRlcjogIik7CiAgICBwcmludFF1YWxpZmllZE5hbWVPbihnZXR0ZXIsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgICBzaW5rLndyaXRlKCIsIHNldHRlcjogIik7CiAgICBwcmludFF1YWxpZmllZE5hbWVPbihzZXR0ZXIsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgICBzaW5rLndyaXRlKCIsIHJlY2VpdmVyVmFyaWFibGU6ICIpOwogICAgcHJpbnROb2RlT24ocmVjZWl2ZXJWYXJpYWJsZSwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICAgIHNpbmsud3JpdGUoIiwgaW5kZXhWYXJpYWJsZTogIik7CiAgICBwcmludE5vZGVPbihpbmRleFZhcmlhYmxlLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogIH0KfQoKY2xhc3MgS2VybmVsVGhpc0luZGV4ZWRBY2Nlc3NHZW5lcmF0b3IgZXh0ZW5kcyBLZXJuZWxHZW5lcmF0b3IKICAgIHdpdGggVGhpc0luZGV4ZWRBY2Nlc3NHZW5lcmF0b3IgewogIGZpbmFsIEV4cHJlc3Npb24gaW5kZXg7CgogIGZpbmFsIFByb2NlZHVyZSBnZXR0ZXI7CgogIGZpbmFsIFByb2NlZHVyZSBzZXR0ZXI7CgogIFZhcmlhYmxlRGVjbGFyYXRpb24gaW5kZXhWYXJpYWJsZTsKCiAgS2VybmVsVGhpc0luZGV4ZWRBY2Nlc3NHZW5lcmF0b3IoRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsCiAgICAgIFRva2VuIHRva2VuLCB0aGlzLmluZGV4LCB0aGlzLmdldHRlciwgdGhpcy5zZXR0ZXIpCiAgICAgIDogc3VwZXIoaGVscGVyLCB0b2tlbik7CgogIEV4cHJlc3Npb24gaW5kZXhBY2Nlc3MoKSB7CiAgICBpbmRleFZhcmlhYmxlID8/PSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZShpbmRleCk7CiAgICByZXR1cm4gbmV3IFZhcmlhYmxlR2V0KGluZGV4VmFyaWFibGUpOwogIH0KCiAgRXhwcmVzc2lvbiBfbWFrZVdyaXRlQW5kUmV0dXJuKAogICAgICBFeHByZXNzaW9uIHZhbHVlLCBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICB2YXIgdmFsdWVWYXJpYWJsZSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKHZhbHVlKTsKICAgIHZhciB3cml0ZSA9IG5ldyBNZXRob2RJbnZvY2F0aW9uSnVkZ21lbnQoCiAgICAgICAgZm9yZXN0LnRoaXNFeHByZXNzaW9uKHRva2VuKSwKICAgICAgICBpbmRleFNldE5hbWUsCiAgICAgICAgZm9yZXN0LmNhc3RBcmd1bWVudHMoZm9yZXN0LmFyZ3VtZW50cygKICAgICAgICAgICAgPEV4cHJlc3Npb24+W2luZGV4QWNjZXNzKCksIG5ldyBWYXJpYWJsZUdldCh2YWx1ZVZhcmlhYmxlKV0sCiAgICAgICAgICAgIHRva2VuKSksCiAgICAgICAgaW50ZXJmYWNlVGFyZ2V0OiBzZXR0ZXIpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIGNvbXBsZXhBc3NpZ25tZW50Py53cml0ZSA9IHdyaXRlOwogICAgdmFyIGR1bW15ID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUod3JpdGUpOwogICAgcmV0dXJuIG1ha2VMZXQoCiAgICAgICAgdmFsdWVWYXJpYWJsZSwgbWFrZUxldChkdW1teSwgbmV3IFZhcmlhYmxlR2V0KHZhbHVlVmFyaWFibGUpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9tYWtlU2ltcGxlUmVhZCgpIHsKICAgIHJldHVybiBuZXcgTWV0aG9kSW52b2NhdGlvbkp1ZGdtZW50KAogICAgICAgIGZvcmVzdC50aGlzRXhwcmVzc2lvbih0b2tlbiksCiAgICAgICAgaW5kZXhHZXROYW1lLAogICAgICAgIGZvcmVzdC5jYXN0QXJndW1lbnRzKGZvcmVzdC5hcmd1bWVudHMoPEV4cHJlc3Npb24+W2luZGV4XSwgdG9rZW4pKSwKICAgICAgICBpbnRlcmZhY2VUYXJnZXQ6IGdldHRlcikKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZVNpbXBsZVdyaXRlKEV4cHJlc3Npb24gdmFsdWUsIGJvb2wgdm9pZENvbnRleHQsCiAgICAgIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIGlmICghdm9pZENvbnRleHQpIHJldHVybiBfbWFrZVdyaXRlQW5kUmV0dXJuKHZhbHVlLCBjb21wbGV4QXNzaWdubWVudCk7CiAgICB2YXIgd3JpdGUgPSBuZXcgTWV0aG9kSW52b2NhdGlvbkp1ZGdtZW50KAogICAgICAgIGZvcmVzdC50aGlzRXhwcmVzc2lvbih0b2tlbiksCiAgICAgICAgaW5kZXhTZXROYW1lLAogICAgICAgIGZvcmVzdAogICAgICAgICAgICAuY2FzdEFyZ3VtZW50cyhmb3Jlc3QuYXJndW1lbnRzKDxFeHByZXNzaW9uPltpbmRleCwgdmFsdWVdLCB0b2tlbikpLAogICAgICAgIGludGVyZmFjZVRhcmdldDogc2V0dGVyKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICBjb21wbGV4QXNzaWdubWVudD8ud3JpdGUgPSB3cml0ZTsKICAgIHJldHVybiB3cml0ZTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX21ha2VSZWFkKENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIHZhciByZWFkID0gbmV3IE1ldGhvZEludm9jYXRpb25KdWRnbWVudCgKICAgICAgICBmb3Jlc3QudGhpc0V4cHJlc3Npb24odG9rZW4pLAogICAgICAgIGluZGV4R2V0TmFtZSwKICAgICAgICBmb3Jlc3QuY2FzdEFyZ3VtZW50cygKICAgICAgICAgICAgZm9yZXN0LmFyZ3VtZW50cyg8RXhwcmVzc2lvbj5baW5kZXhBY2Nlc3MoKV0sIHRva2VuKSksCiAgICAgICAgaW50ZXJmYWNlVGFyZ2V0OiBnZXR0ZXIpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIGNvbXBsZXhBc3NpZ25tZW50Py5yZWFkID0gcmVhZDsKICAgIHJldHVybiByZWFkOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZVdyaXRlKEV4cHJlc3Npb24gdmFsdWUsIGJvb2wgdm9pZENvbnRleHQsCiAgICAgIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIGlmICghdm9pZENvbnRleHQpIHJldHVybiBfbWFrZVdyaXRlQW5kUmV0dXJuKHZhbHVlLCBjb21wbGV4QXNzaWdubWVudCk7CiAgICB2YXIgd3JpdGUgPSBuZXcgTWV0aG9kSW52b2NhdGlvbkp1ZGdtZW50KAogICAgICAgIGZvcmVzdC50aGlzRXhwcmVzc2lvbih0b2tlbiksCiAgICAgICAgaW5kZXhTZXROYW1lLAogICAgICAgIGZvcmVzdC5jYXN0QXJndW1lbnRzKAogICAgICAgICAgICBmb3Jlc3QuYXJndW1lbnRzKDxFeHByZXNzaW9uPltpbmRleEFjY2VzcygpLCB2YWx1ZV0sIHRva2VuKSksCiAgICAgICAgaW50ZXJmYWNlVGFyZ2V0OiBzZXR0ZXIpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIGNvbXBsZXhBc3NpZ25tZW50Py53cml0ZSA9IHdyaXRlOwogICAgcmV0dXJuIHdyaXRlOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfZmluaXNoKAogICAgICBFeHByZXNzaW9uIGJvZHksIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIHJldHVybiBzdXBlci5fZmluaXNoKG1ha2VMZXQoaW5kZXhWYXJpYWJsZSwgYm9keSksIGNvbXBsZXhBc3NpZ25tZW50KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZG9JbnZvY2F0aW9uKGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBoZWxwZXIuYnVpbGRNZXRob2RJbnZvY2F0aW9uKAogICAgICAgIGJ1aWxkU2ltcGxlUmVhZCgpLCBjYWxsTmFtZSwgYXJndW1lbnRzLCBvZmZzZXQsCiAgICAgICAgaXNJbXBsaWNpdENhbGw6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBzdGFydENvbXBsZXhBc3NpZ25tZW50KEV4cHJlc3Npb24gcmhzKSA9PgogICAgICBzaGFkb3cuU3ludGhldGljV3JhcHBlci53cmFwSW5kZXhBc3NpZ25tZW50KG51bGwsIGluZGV4LCByaHMpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKSB7CiAgICBOYW1lU3lzdGVtIHN5bnRoZXRpY05hbWVzID0gbmV3IE5hbWVTeXN0ZW0oKTsKICAgIHNpbmsud3JpdGUoIiwgaW5kZXg6ICIpOwogICAgcHJpbnROb2RlT24oaW5kZXgsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgICBzaW5rLndyaXRlKCIsIGdldHRlcjogIik7CiAgICBwcmludFF1YWxpZmllZE5hbWVPbihnZXR0ZXIsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgICBzaW5rLndyaXRlKCIsIHNldHRlcjogIik7CiAgICBwcmludFF1YWxpZmllZE5hbWVPbihzZXR0ZXIsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgICBzaW5rLndyaXRlKCIsIGluZGV4VmFyaWFibGU6ICIpOwogICAgcHJpbnROb2RlT24oaW5kZXhWYXJpYWJsZSwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICB9Cn0KCmNsYXNzIEtlcm5lbFN1cGVySW5kZXhlZEFjY2Vzc0dlbmVyYXRvciBleHRlbmRzIEtlcm5lbEdlbmVyYXRvcgogICAgd2l0aCBTdXBlckluZGV4ZWRBY2Nlc3NHZW5lcmF0b3IgewogIGZpbmFsIEV4cHJlc3Npb24gaW5kZXg7CgogIGZpbmFsIE1lbWJlciBnZXR0ZXI7CgogIGZpbmFsIE1lbWJlciBzZXR0ZXI7CgogIFZhcmlhYmxlRGVjbGFyYXRpb24gaW5kZXhWYXJpYWJsZTsKCiAgS2VybmVsU3VwZXJJbmRleGVkQWNjZXNzR2VuZXJhdG9yKEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLAogICAgICBUb2tlbiB0b2tlbiwgdGhpcy5pbmRleCwgdGhpcy5nZXR0ZXIsIHRoaXMuc2V0dGVyKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4pOwoKICBFeHByZXNzaW9uIGluZGV4QWNjZXNzKCkgewogICAgaW5kZXhWYXJpYWJsZSA/Pz0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoaW5kZXgpOwogICAgcmV0dXJuIG5ldyBWYXJpYWJsZUdldChpbmRleFZhcmlhYmxlKTsKICB9CgogIEV4cHJlc3Npb24gX21ha2VXcml0ZUFuZFJldHVybigKICAgICAgRXhwcmVzc2lvbiB2YWx1ZSwgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBjb21wbGV4QXNzaWdubWVudCkgewogICAgdmFyIHZhbHVlVmFyaWFibGUgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZSh2YWx1ZSk7CiAgICBpZiAoc2V0dGVyID09IG51bGwpIHsKICAgICAgaGVscGVyLndhcm5VbnJlc29sdmVkTWV0aG9kKGluZGV4U2V0TmFtZSwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLAogICAgICAgICAgaXNTdXBlcjogdHJ1ZSk7CiAgICB9CiAgICB2YXIgd3JpdGUgPSBuZXcgU3VwZXJNZXRob2RJbnZvY2F0aW9uKAogICAgICAgIGluZGV4U2V0TmFtZSwKICAgICAgICBmb3Jlc3QuY2FzdEFyZ3VtZW50cyhmb3Jlc3QuYXJndW1lbnRzKAogICAgICAgICAgICA8RXhwcmVzc2lvbj5baW5kZXhBY2Nlc3MoKSwgbmV3IFZhcmlhYmxlR2V0KHZhbHVlVmFyaWFibGUpXSwKICAgICAgICAgICAgdG9rZW4pKSwKICAgICAgICBzZXR0ZXIpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIGNvbXBsZXhBc3NpZ25tZW50Py53cml0ZSA9IHdyaXRlOwogICAgdmFyIGR1bW15ID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUod3JpdGUpOwogICAgcmV0dXJuIG1ha2VMZXQoCiAgICAgICAgdmFsdWVWYXJpYWJsZSwgbWFrZUxldChkdW1teSwgbmV3IFZhcmlhYmxlR2V0KHZhbHVlVmFyaWFibGUpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9tYWtlU2ltcGxlUmVhZCgpIHsKICAgIGlmIChnZXR0ZXIgPT0gbnVsbCkgewogICAgICBoZWxwZXIud2FyblVucmVzb2x2ZWRNZXRob2QoaW5kZXhHZXROYW1lLCBvZmZzZXRGb3JUb2tlbih0b2tlbiksCiAgICAgICAgICBpc1N1cGVyOiB0cnVlKTsKICAgIH0KICAgIC8vIFRPRE8oYWhlKTogVXNlIFtEaXJlY3RNZXRob2RJbnZvY2F0aW9uXSB3aGVuIHBvc3NpYmxlLgogICAgcmV0dXJuIG5ldyBTdXBlck1ldGhvZEludm9jYXRpb25KdWRnbWVudChpbmRleEdldE5hbWUsCiAgICAgICAgZm9yZXN0LmNhc3RBcmd1bWVudHMoZm9yZXN0LmFyZ3VtZW50cyg8RXhwcmVzc2lvbj5baW5kZXhdLCB0b2tlbikpLAogICAgICAgIGludGVyZmFjZVRhcmdldDogZ2V0dGVyKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9tYWtlU2ltcGxlV3JpdGUoRXhwcmVzc2lvbiB2YWx1ZSwgYm9vbCB2b2lkQ29udGV4dCwKICAgICAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBjb21wbGV4QXNzaWdubWVudCkgewogICAgaWYgKCF2b2lkQ29udGV4dCkgcmV0dXJuIF9tYWtlV3JpdGVBbmRSZXR1cm4odmFsdWUsIGNvbXBsZXhBc3NpZ25tZW50KTsKICAgIGlmIChzZXR0ZXIgPT0gbnVsbCkgewogICAgICBoZWxwZXIud2FyblVucmVzb2x2ZWRNZXRob2QoaW5kZXhTZXROYW1lLCBvZmZzZXRGb3JUb2tlbih0b2tlbiksCiAgICAgICAgICBpc1N1cGVyOiB0cnVlKTsKICAgIH0KICAgIHZhciB3cml0ZSA9IG5ldyBTdXBlck1ldGhvZEludm9jYXRpb24oCiAgICAgICAgaW5kZXhTZXROYW1lLAogICAgICAgIGZvcmVzdAogICAgICAgICAgICAuY2FzdEFyZ3VtZW50cyhmb3Jlc3QuYXJndW1lbnRzKDxFeHByZXNzaW9uPltpbmRleCwgdmFsdWVdLCB0b2tlbikpLAogICAgICAgIHNldHRlcikKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogICAgY29tcGxleEFzc2lnbm1lbnQ/LndyaXRlID0gd3JpdGU7CiAgICByZXR1cm4gd3JpdGU7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9tYWtlUmVhZChDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICBpZiAoZ2V0dGVyID09IG51bGwpIHsKICAgICAgaGVscGVyLndhcm5VbnJlc29sdmVkTWV0aG9kKGluZGV4R2V0TmFtZSwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLAogICAgICAgICAgaXNTdXBlcjogdHJ1ZSk7CiAgICB9CiAgICB2YXIgcmVhZCA9IG5ldyBTdXBlck1ldGhvZEludm9jYXRpb24oCiAgICAgICAgaW5kZXhHZXROYW1lLAogICAgICAgIGZvcmVzdC5jYXN0QXJndW1lbnRzKAogICAgICAgICAgICBmb3Jlc3QuYXJndW1lbnRzKDxFeHByZXNzaW9uPltpbmRleEFjY2VzcygpXSwgdG9rZW4pKSwKICAgICAgICBnZXR0ZXIpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIGNvbXBsZXhBc3NpZ25tZW50Py5yZWFkID0gcmVhZDsKICAgIHJldHVybiByZWFkOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZVdyaXRlKEV4cHJlc3Npb24gdmFsdWUsIGJvb2wgdm9pZENvbnRleHQsCiAgICAgIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIGlmICghdm9pZENvbnRleHQpIHJldHVybiBfbWFrZVdyaXRlQW5kUmV0dXJuKHZhbHVlLCBjb21wbGV4QXNzaWdubWVudCk7CiAgICBpZiAoc2V0dGVyID09IG51bGwpIHsKICAgICAgaGVscGVyLndhcm5VbnJlc29sdmVkTWV0aG9kKGluZGV4U2V0TmFtZSwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLAogICAgICAgICAgaXNTdXBlcjogdHJ1ZSk7CiAgICB9CiAgICB2YXIgd3JpdGUgPSBuZXcgU3VwZXJNZXRob2RJbnZvY2F0aW9uKAogICAgICAgIGluZGV4U2V0TmFtZSwKICAgICAgICBmb3Jlc3QuY2FzdEFyZ3VtZW50cygKICAgICAgICAgICAgZm9yZXN0LmFyZ3VtZW50cyg8RXhwcmVzc2lvbj5baW5kZXhBY2Nlc3MoKSwgdmFsdWVdLCB0b2tlbikpLAogICAgICAgIHNldHRlcikKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogICAgY29tcGxleEFzc2lnbm1lbnQ/LndyaXRlID0gd3JpdGU7CiAgICByZXR1cm4gd3JpdGU7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9maW5pc2goCiAgICAgIEV4cHJlc3Npb24gYm9keSwgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBjb21wbGV4QXNzaWdubWVudCkgewogICAgcmV0dXJuIHN1cGVyLl9maW5pc2goCiAgICAgICAgbWFrZUxldChpbmRleFZhcmlhYmxlLCBib2R5KS4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKSwKICAgICAgICBjb21wbGV4QXNzaWdubWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGRvSW52b2NhdGlvbihpbnQgb2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gaGVscGVyLmJ1aWxkTWV0aG9kSW52b2NhdGlvbigKICAgICAgICBidWlsZFNpbXBsZVJlYWQoKSwgY2FsbE5hbWUsIGFyZ3VtZW50cywgb2Zmc2V0LAogICAgICAgIGlzSW1wbGljaXRDYWxsOiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgc3RhcnRDb21wbGV4QXNzaWdubWVudChFeHByZXNzaW9uIHJocykgPT4KICAgICAgc2hhZG93LlN5bnRoZXRpY1dyYXBwZXIud3JhcEluZGV4QXNzaWdubWVudChudWxsLCBpbmRleCwgcmhzLAogICAgICAgICAgaXNTdXBlcjogdHJ1ZSk7CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIE5hbWVTeXN0ZW0gc3ludGhldGljTmFtZXMgPSBuZXcgTmFtZVN5c3RlbSgpOwogICAgc2luay53cml0ZSgiLCBpbmRleDogIik7CiAgICBwcmludE5vZGVPbihpbmRleCwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICAgIHNpbmsud3JpdGUoIiwgZ2V0dGVyOiAiKTsKICAgIHByaW50UXVhbGlmaWVkTmFtZU9uKGdldHRlciwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICAgIHNpbmsud3JpdGUoIiwgc2V0dGVyOiAiKTsKICAgIHByaW50UXVhbGlmaWVkTmFtZU9uKHNldHRlciwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICAgIHNpbmsud3JpdGUoIiwgaW5kZXhWYXJpYWJsZTogIik7CiAgICBwcmludE5vZGVPbihpbmRleFZhcmlhYmxlLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogIH0KfQoKY2xhc3MgS2VybmVsU3RhdGljQWNjZXNzR2VuZXJhdG9yIGV4dGVuZHMgS2VybmVsR2VuZXJhdG9yCiAgICB3aXRoIFN0YXRpY0FjY2Vzc0dlbmVyYXRvciB7CiAgQG92ZXJyaWRlCiAgZmluYWwgTWVtYmVyIHJlYWRUYXJnZXQ7CgogIGZpbmFsIE1lbWJlciB3cml0ZVRhcmdldDsKCiAgS2VybmVsU3RhdGljQWNjZXNzR2VuZXJhdG9yKEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLCBUb2tlbiB0b2tlbiwKICAgICAgdGhpcy5yZWFkVGFyZ2V0LCB0aGlzLndyaXRlVGFyZ2V0KQogICAgICA6IGFzc2VydChyZWFkVGFyZ2V0ICE9IG51bGwgfHwgd3JpdGVUYXJnZXQgIT0gbnVsbCksCiAgICAgICAgc3VwZXIoaGVscGVyLCB0b2tlbik7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgcGxhaW5OYW1lRm9yUmVhZCA9PiAocmVhZFRhcmdldCA/PyB3cml0ZVRhcmdldCkubmFtZS5uYW1lOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9tYWtlUmVhZChDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICBFeHByZXNzaW9uIHJlYWQ7CiAgICBpZiAocmVhZFRhcmdldCA9PSBudWxsKSB7CiAgICAgIHJlYWQgPSBtYWtlSW52YWxpZFJlYWQoKTsKICAgICAgaWYgKGNvbXBsZXhBc3NpZ25tZW50ICE9IG51bGwpIHsKICAgICAgICByZWFkID0gaGVscGVyLmRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKHJlYWQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZWFkID0gaGVscGVyLm1ha2VTdGF0aWNHZXQocmVhZFRhcmdldCwgdG9rZW4pOwogICAgfQogICAgY29tcGxleEFzc2lnbm1lbnQ/LnJlYWQgPSByZWFkOwogICAgcmV0dXJuIHJlYWQ7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9tYWtlV3JpdGUoRXhwcmVzc2lvbiB2YWx1ZSwgYm9vbCB2b2lkQ29udGV4dCwKICAgICAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBjb21wbGV4QXNzaWdubWVudCkgewogICAgRXhwcmVzc2lvbiB3cml0ZTsKICAgIGlmICh3cml0ZVRhcmdldCA9PSBudWxsKSB7CiAgICAgIHdyaXRlID0gbWFrZUludmFsaWRXcml0ZSh2YWx1ZSk7CiAgICAgIGlmIChjb21wbGV4QXNzaWdubWVudCAhPSBudWxsKSB7CiAgICAgICAgd3JpdGUgPSBoZWxwZXIuZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24od3JpdGUpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB3cml0ZSA9IG5ldyBTdGF0aWNTZXQod3JpdGVUYXJnZXQsIHZhbHVlKTsKICAgIH0KICAgIGNvbXBsZXhBc3NpZ25tZW50Py53cml0ZSA9IHdyaXRlOwogICAgd3JpdGUuZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIHJldHVybiB3cml0ZTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZG9JbnZvY2F0aW9uKGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIGlmIChoZWxwZXIuY29uc3RhbnRDb250ZXh0ICE9IENvbnN0YW50Q29udGV4dC5ub25lICYmCiAgICAgICAgIWhlbHBlci5pc0lkZW50aWNhbChyZWFkVGFyZ2V0KSkgewogICAgICByZXR1cm4gaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlTm90Q29uc3RhbnRFeHByZXNzaW9uLndpdGhBcmd1bWVudHMoJ01ldGhvZCBpbnZvY2F0aW9uJyksCiAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICByZWFkVGFyZ2V0Py5uYW1lPy5uYW1lPy5sZW5ndGggPz8gMCk7CiAgICB9CiAgICBpZiAocmVhZFRhcmdldCA9PSBudWxsIHx8IGlzRmllbGRPckdldHRlcihyZWFkVGFyZ2V0KSkgewogICAgICByZXR1cm4gaGVscGVyLmJ1aWxkTWV0aG9kSW52b2NhdGlvbihidWlsZFNpbXBsZVJlYWQoKSwgY2FsbE5hbWUsCiAgICAgICAgICBhcmd1bWVudHMsIG9mZnNldCArIChyZWFkVGFyZ2V0Py5uYW1lPy5uYW1lPy5sZW5ndGggPz8gMCksCiAgICAgICAgICAvLyBUaGlzIGlzbid0IGEgY29uc3RhbnQgZXhwcmVzc2lvbiwgYnV0IHdlIGhhdmUgY2hlY2tlZCBpZiBhCiAgICAgICAgICAvLyBjb25zdGFudCBleHByZXNzaW9uIGVycm9yIHNob3VsZCBiZSBlbWl0dGVkIGFscmVhZHkuCiAgICAgICAgICBpc0NvbnN0YW50RXhwcmVzc2lvbjogdHJ1ZSwKICAgICAgICAgIGlzSW1wbGljaXRDYWxsOiB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBoZWxwZXIuYnVpbGRTdGF0aWNJbnZvY2F0aW9uKHJlYWRUYXJnZXQsIGFyZ3VtZW50cywKICAgICAgICAgIGNoYXJPZmZzZXQ6IG9mZnNldCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IHN0YXJ0Q29tcGxleEFzc2lnbm1lbnQoRXhwcmVzc2lvbiByaHMpID0+CiAgICAgIHNoYWRvdy5TeW50aGV0aWNXcmFwcGVyLndyYXBTdGF0aWNBc3NpZ25tZW50KHJocyk7CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIE5hbWVTeXN0ZW0gc3ludGhldGljTmFtZXMgPSBuZXcgTmFtZVN5c3RlbSgpOwogICAgc2luay53cml0ZSgiLCByZWFkVGFyZ2V0OiAiKTsKICAgIHByaW50UXVhbGlmaWVkTmFtZU9uKHJlYWRUYXJnZXQsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgICBzaW5rLndyaXRlKCIsIHdyaXRlVGFyZ2V0OiAiKTsKICAgIHByaW50UXVhbGlmaWVkTmFtZU9uKHdyaXRlVGFyZ2V0LCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogIH0KfQoKY2xhc3MgS2VybmVsTG9hZExpYnJhcnlHZW5lcmF0b3IgZXh0ZW5kcyBLZXJuZWxHZW5lcmF0b3IKICAgIHdpdGggTG9hZExpYnJhcnlHZW5lcmF0b3IgewogIGZpbmFsIExvYWRMaWJyYXJ5QnVpbGRlciBidWlsZGVyOwoKICBLZXJuZWxMb2FkTGlicmFyeUdlbmVyYXRvcigKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLCB0aGlzLmJ1aWxkZXIpCiAgICAgIDogc3VwZXIoaGVscGVyLCB0b2tlbik7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX21ha2VSZWFkKENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIGJ1aWxkZXIuaW1wb3J0RGVwZW5kZW5jeS50YXJnZXRMaWJyYXJ5OwogICAgdmFyIHJlYWQgPSBuZXcgTG9hZExpYnJhcnlUZWFyT2ZmSnVkZ21lbnQoCiAgICAgICAgYnVpbGRlci5pbXBvcnREZXBlbmRlbmN5LCBidWlsZGVyLmNyZWF0ZVRlYXJvZmZNZXRob2QoaGVscGVyLmZvcmVzdCkpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIGNvbXBsZXhBc3NpZ25tZW50Py5yZWFkID0gcmVhZDsKICAgIHJldHVybiByZWFkOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBkb0ludm9jYXRpb24oaW50IG9mZnNldCwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgaWYgKGZvcmVzdC5hcmd1bWVudHNQb3NpdGlvbmFsKGFyZ3VtZW50cykubGVuZ3RoID4gMCB8fAogICAgICAgIGZvcmVzdC5hcmd1bWVudHNOYW1lZChhcmd1bWVudHMpLmxlbmd0aCA+IDApIHsKICAgICAgaGVscGVyLmFkZFByb2JsZW1FcnJvcklmQ29uc3QoCiAgICAgICAgICBtZXNzYWdlTG9hZExpYnJhcnlUYWtlc05vQXJndW1lbnRzLCBvZmZzZXQsICdsb2FkTGlicmFyeScubGVuZ3RoKTsKICAgIH0KICAgIHJldHVybiBidWlsZGVyLmNyZWF0ZUxvYWRMaWJyYXJ5KG9mZnNldCwgZm9yZXN0LCBhcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgc2luay53cml0ZSgiLCBidWlsZGVyOiAiKTsKICAgIHNpbmsud3JpdGUoYnVpbGRlcik7CiAgfQp9CgpjbGFzcyBLZXJuZWxEZWZlcnJlZEFjY2Vzc0dlbmVyYXRvciBleHRlbmRzIEtlcm5lbEdlbmVyYXRvcgogICAgd2l0aCBEZWZlcnJlZEFjY2Vzc0dlbmVyYXRvciB7CiAgQG92ZXJyaWRlCiAgZmluYWwgS2VybmVsUHJlZml4VXNlR2VuZXJhdG9yIHByZWZpeEdlbmVyYXRvcjsKCiAgQG92ZXJyaWRlCiAgZmluYWwgS2VybmVsR2VuZXJhdG9yIHN1ZmZpeEdlbmVyYXRvcjsKCiAgS2VybmVsRGVmZXJyZWRBY2Nlc3NHZW5lcmF0b3IoRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLAogICAgICB0aGlzLnByZWZpeEdlbmVyYXRvciwgdGhpcy5zdWZmaXhHZW5lcmF0b3IpCiAgICAgIDogc3VwZXIoaGVscGVyLCB0b2tlbik7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX21ha2VTaW1wbGVSZWFkKCkgewogICAgcmV0dXJuIGhlbHBlci53cmFwSW5EZWZlcnJlZENoZWNrKHN1ZmZpeEdlbmVyYXRvci5fbWFrZVNpbXBsZVJlYWQoKSwKICAgICAgICBwcmVmaXhHZW5lcmF0b3IucHJlZml4LCB0b2tlbi5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX21ha2VSZWFkKENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIHJldHVybiBoZWxwZXIud3JhcEluRGVmZXJyZWRDaGVjaygKICAgICAgICBzdWZmaXhHZW5lcmF0b3IuX21ha2VSZWFkKGNvbXBsZXhBc3NpZ25tZW50KSwKICAgICAgICBwcmVmaXhHZW5lcmF0b3IucHJlZml4LAogICAgICAgIHRva2VuLmNoYXJPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZVdyaXRlKEV4cHJlc3Npb24gdmFsdWUsIGJvb2wgdm9pZENvbnRleHQsCiAgICAgIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIHJldHVybiBoZWxwZXIud3JhcEluRGVmZXJyZWRDaGVjaygKICAgICAgICBzdWZmaXhHZW5lcmF0b3IuX21ha2VXcml0ZSh2YWx1ZSwgdm9pZENvbnRleHQsIGNvbXBsZXhBc3NpZ25tZW50KSwKICAgICAgICBwcmVmaXhHZW5lcmF0b3IucHJlZml4LAogICAgICAgIHRva2VuLmNoYXJPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBzdGFydENvbXBsZXhBc3NpZ25tZW50KEV4cHJlc3Npb24gcmhzKSA9PgogICAgICBzaGFkb3cuU3ludGhldGljV3JhcHBlci53cmFwU3RhdGljQXNzaWdubWVudChyaHMpOwp9CgpjbGFzcyBLZXJuZWxUeXBlVXNlR2VuZXJhdG9yIGV4dGVuZHMgS2VybmVsUmVhZE9ubHlBY2Nlc3NHZW5lcmF0b3IKICAgIHdpdGggVHlwZVVzZUdlbmVyYXRvciB7CiAgQG92ZXJyaWRlCiAgZmluYWwgVHlwZURlY2xhcmF0aW9uQnVpbGRlciBkZWNsYXJhdGlvbjsKCiAgS2VybmVsVHlwZVVzZUdlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sCiAgICAgIHRoaXMuZGVjbGFyYXRpb24sIFN0cmluZyBwbGFpbk5hbWVGb3JSZWFkKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4sIG51bGwsIHBsYWluTmFtZUZvclJlYWQpOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGdldCBleHByZXNzaW9uIHsKICAgIGlmIChzdXBlci5leHByZXNzaW9uID09IG51bGwpIHsKICAgICAgaW50IG9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgICAgaWYgKGRlY2xhcmF0aW9uIGlzIEtlcm5lbEludmFsaWRUeXBlQnVpbGRlcikgewogICAgICAgIEtlcm5lbEludmFsaWRUeXBlQnVpbGRlciBkZWNsYXJhdGlvbiA9IHRoaXMuZGVjbGFyYXRpb247CiAgICAgICAgaGVscGVyLmFkZFByb2JsZW1FcnJvcklmQ29uc3QoCiAgICAgICAgICAgIGRlY2xhcmF0aW9uLm1lc3NhZ2UubWVzc2FnZU9iamVjdCwgb2Zmc2V0LCB0b2tlbi5sZW5ndGgpOwogICAgICAgIHN1cGVyLmV4cHJlc3Npb24gPSBoZWxwZXIud3JhcFN5bnRoZXRpY0V4cHJlc3Npb24oCiAgICAgICAgICAgIGZvcmVzdC50aHJvd0V4cHJlc3Npb24oCiAgICAgICAgICAgICAgICBudWxsLCBmb3Jlc3QubGl0ZXJhbFN0cmluZyhkZWNsYXJhdGlvbi5tZXNzYWdlLm1lc3NhZ2UsIHRva2VuKSkKICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQsCiAgICAgICAgICAgIG9mZnNldCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3VwZXIuZXhwcmVzc2lvbiA9IGZvcmVzdC5saXRlcmFsVHlwZSgKICAgICAgICAgICAgaGVscGVyLmJ1aWxkRGFydFR5cGUoCiAgICAgICAgICAgICAgICBuZXcgVW5yZXNvbHZlZFR5cGU8S2VybmVsVHlwZUJ1aWxkZXI+KAogICAgICAgICAgICAgICAgICAgIGJ1aWxkVHlwZVdpdGhSZXNvbHZlZEFyZ3VtZW50cyhudWxsKSwgb2Zmc2V0LCB1cmkpLAogICAgICAgICAgICAgICAgbm9uSW5zdGFuY2VBY2Nlc3NJc0Vycm9yOiB0cnVlKSwKICAgICAgICAgICAgdG9rZW4pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc3VwZXIuZXhwcmVzc2lvbjsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gbWFrZUludmFsaWRXcml0ZShFeHByZXNzaW9uIHZhbHVlKSB7CiAgICByZXR1cm4gaGVscGVyLndyYXBTeW50aGV0aWNFeHByZXNzaW9uKAogICAgICAgIGhlbHBlci50aHJvd05vU3VjaE1ldGhvZEVycm9yKAogICAgICAgICAgICBmb3Jlc3QubGl0ZXJhbE51bGwodG9rZW4pLAogICAgICAgICAgICBwbGFpbk5hbWVGb3JSZWFkLAogICAgICAgICAgICBmb3Jlc3QuYXJndW1lbnRzKDxFeHByZXNzaW9uPlt2YWx1ZV0sIG51bGwpCiAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gdmFsdWUuZmlsZU9mZnNldCwKICAgICAgICAgICAgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLAogICAgICAgICAgICBpc1NldHRlcjogdHJ1ZSksCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pKTsKICB9CgogIEBvdmVycmlkZQogIGJ1aWxkUHJvcGVydHlBY2Nlc3MoCiAgICAgIEluY29tcGxldGVTZW5kR2VuZXJhdG9yIHNlbmQsIGludCBvcGVyYXRvck9mZnNldCwgYm9vbCBpc051bGxBd2FyZSkgewogICAgLy8gYFNvbWVUeXBlPy50b1N0cmluZ2AgaXMgdGhlIHNhbWUgYXMgYFNvbWVUeXBlLnRvU3RyaW5nYCwgbm90CiAgICAvLyBgKFNvbWVUeXBlKS50b1N0cmluZ2AuCiAgICBpc051bGxBd2FyZSA9IGZhbHNlOwoKICAgIE5hbWUgbmFtZSA9IHNlbmQubmFtZTsKICAgIEFyZ3VtZW50cyBhcmd1bWVudHMgPSBzZW5kLmFyZ3VtZW50czsKCiAgICBpZiAoZGVjbGFyYXRpb24gaXMgS2VybmVsQ2xhc3NCdWlsZGVyKSB7CiAgICAgIEtlcm5lbENsYXNzQnVpbGRlciBkZWNsYXJhdGlvbiA9IHRoaXMuZGVjbGFyYXRpb247CiAgICAgIERlY2xhcmF0aW9uIG1lbWJlciA9IGRlY2xhcmF0aW9uLmZpbmRTdGF0aWNCdWlsZGVyKAogICAgICAgICAgbmFtZS5uYW1lLCBvZmZzZXRGb3JUb2tlbihzZW5kLnRva2VuKSwgdXJpLCBoZWxwZXIubGlicmFyeSk7CgogICAgICBHZW5lcmF0b3IgZ2VuZXJhdG9yOwogICAgICBpZiAobWVtYmVyID09IG51bGwpIHsKICAgICAgICAvLyBJZiB3ZSBmaW5kIGEgc2V0dGVyLCBbbWVtYmVyXSBpcyBhbiBbQWNjZXNzRXJyb3JCdWlsZGVyXSwgbm90IG51bGwuCiAgICAgICAgaWYgKHNlbmQgaXMgSW5jb21wbGV0ZVByb3BlcnR5QWNjZXNzR2VuZXJhdG9yKSB7CiAgICAgICAgICBnZW5lcmF0b3IgPSBuZXcgVW5yZXNvbHZlZE5hbWVHZW5lcmF0b3IoaGVscGVyLCBzZW5kLnRva2VuLCBuYW1lKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGhlbHBlci5idWlsZENvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgICAgICAgICBkZWNsYXJhdGlvbiwKICAgICAgICAgICAgICBzZW5kLnRva2VuLAogICAgICAgICAgICAgIHNlbmQudG9rZW4sCiAgICAgICAgICAgICAgYXJndW1lbnRzLAogICAgICAgICAgICAgIG5hbWUubmFtZSwKICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgIHRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgQ29uc3RuZXNzLmltcGxpY2l0KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobWVtYmVyIGlzIEFtYmlndW91c0J1aWxkZXIpIHsKICAgICAgICByZXR1cm4gaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgbWVtYmVyLm1lc3NhZ2UsIG1lbWJlci5jaGFyT2Zmc2V0LCBuYW1lLm5hbWUubGVuZ3RoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBEZWNsYXJhdGlvbiBzZXR0ZXI7CiAgICAgICAgaWYgKG1lbWJlci5pc1NldHRlcikgewogICAgICAgICAgc2V0dGVyID0gbWVtYmVyOwogICAgICAgIH0gZWxzZSBpZiAobWVtYmVyLmlzR2V0dGVyKSB7CiAgICAgICAgICBzZXR0ZXIgPSBkZWNsYXJhdGlvbi5maW5kU3RhdGljQnVpbGRlcigKICAgICAgICAgICAgICBuYW1lLm5hbWUsIG9mZnNldEZvclRva2VuKHRva2VuKSwgdXJpLCBoZWxwZXIubGlicmFyeSwKICAgICAgICAgICAgICBpc1NldHRlcjogdHJ1ZSk7CiAgICAgICAgfSBlbHNlIGlmIChtZW1iZXIuaXNGaWVsZCAmJiAhbWVtYmVyLmlzRmluYWwpIHsKICAgICAgICAgIHNldHRlciA9IG1lbWJlcjsKICAgICAgICB9CiAgICAgICAgZ2VuZXJhdG9yID0gbmV3IFN0YXRpY0FjY2Vzc0dlbmVyYXRvci5mcm9tQnVpbGRlcigKICAgICAgICAgICAgaGVscGVyLCBtZW1iZXIsIHNlbmQudG9rZW4sIHNldHRlcik7CiAgICAgIH0KCiAgICAgIHJldHVybiBhcmd1bWVudHMgPT0gbnVsbAogICAgICAgICAgPyBnZW5lcmF0b3IKICAgICAgICAgIDogZ2VuZXJhdG9yLmRvSW52b2NhdGlvbihvZmZzZXRGb3JUb2tlbihzZW5kLnRva2VuKSwgYXJndW1lbnRzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBzdXBlci5idWlsZFByb3BlcnR5QWNjZXNzKHNlbmQsIG9wZXJhdG9yT2Zmc2V0LCBpc051bGxBd2FyZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGRvSW52b2NhdGlvbihpbnQgb2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gaGVscGVyLmJ1aWxkQ29uc3RydWN0b3JJbnZvY2F0aW9uKGRlY2xhcmF0aW9uLCB0b2tlbiwgdG9rZW4sCiAgICAgICAgYXJndW1lbnRzLCAiIiwgbnVsbCwgdG9rZW4uY2hhck9mZnNldCwgQ29uc3RuZXNzLmltcGxpY2l0KTsKICB9Cn0KCmNsYXNzIEtlcm5lbFJlYWRPbmx5QWNjZXNzR2VuZXJhdG9yIGV4dGVuZHMgS2VybmVsR2VuZXJhdG9yCiAgICB3aXRoIFJlYWRPbmx5QWNjZXNzR2VuZXJhdG9yIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgcGxhaW5OYW1lRm9yUmVhZDsKCiAgRXhwcmVzc2lvbiBleHByZXNzaW9uOwoKICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhbHVlOwoKICBLZXJuZWxSZWFkT25seUFjY2Vzc0dlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sCiAgICAgIHRoaXMuZXhwcmVzc2lvbiwgdGhpcy5wbGFpbk5hbWVGb3JSZWFkKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4pOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9tYWtlU2ltcGxlUmVhZCgpID0+IGV4cHJlc3Npb247CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX21ha2VSZWFkKENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIHZhbHVlID8/PSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZShleHByZXNzaW9uKTsKICAgIHJldHVybiBuZXcgVmFyaWFibGVHZXQodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfZmluaXNoKAogICAgICAgICAgRXhwcmVzc2lvbiBib2R5LCBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSA9PgogICAgICBzdXBlci5fZmluaXNoKG1ha2VMZXQodmFsdWUsIGJvZHkpLCBjb21wbGV4QXNzaWdubWVudCk7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZG9JbnZvY2F0aW9uKGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBoZWxwZXIuYnVpbGRNZXRob2RJbnZvY2F0aW9uKGJ1aWxkU2ltcGxlUmVhZCgpLCBjYWxsTmFtZSwgYXJndW1lbnRzLAogICAgICAgIGFkanVzdEZvckltcGxpY2l0Q2FsbChwbGFpbk5hbWVGb3JSZWFkLCBvZmZzZXQpLAogICAgICAgIGlzSW1wbGljaXRDYWxsOiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIE5hbWVTeXN0ZW0gc3ludGhldGljTmFtZXMgPSBuZXcgTmFtZVN5c3RlbSgpOwogICAgc2luay53cml0ZSgiLCBleHByZXNzaW9uOiAiKTsKICAgIHByaW50Tm9kZU9uKGV4cHJlc3Npb24sIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgICBzaW5rLndyaXRlKCIsIHBsYWluTmFtZUZvclJlYWQ6ICIpOwogICAgc2luay53cml0ZShwbGFpbk5hbWVGb3JSZWFkKTsKICAgIHNpbmsud3JpdGUoIiwgdmFsdWU6ICIpOwogICAgcHJpbnROb2RlT24odmFsdWUsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgfQp9CgpjbGFzcyBLZXJuZWxVbnJlc29sdmVkTmFtZUdlbmVyYXRvciBleHRlbmRzIEtlcm5lbEdlbmVyYXRvcgogICAgd2l0aCBFcnJvbmVvdXNFeHByZXNzaW9uR2VuZXJhdG9yLCBVbnJlc29sdmVkTmFtZUdlbmVyYXRvciB7CiAgQG92ZXJyaWRlCiAgZmluYWwgTmFtZSBuYW1lOwoKICBLZXJuZWxVbnJlc29sdmVkTmFtZUdlbmVyYXRvcigKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLCB0aGlzLm5hbWUpCiAgICAgIDogc3VwZXIoaGVscGVyLCB0b2tlbik7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBfYnVpbGRVbnJlc29sdmVkVmFyaWFibGVBc3NpZ25tZW50KGZhbHNlLCB2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsIEV4cHJlc3Npb24gdmFsdWUsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwKICAgICAgYm9vbCB2b2lkQ29udGV4dDogZmFsc2UsCiAgICAgIFByb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXQsCiAgICAgIGJvb2wgaXNQcmVJbmNEZWM6IGZhbHNlLAogICAgICBib29sIGlzUG9zdEluY0RlYzogZmFsc2V9KSB7CiAgICByZXR1cm4gX2J1aWxkVW5yZXNvbHZlZFZhcmlhYmxlQXNzaWdubWVudCh0cnVlLCB2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkU2ltcGxlUmVhZCgpIHsKICAgIHJldHVybiBidWlsZEVycm9yKGZvcmVzdC5hcmd1bWVudHNFbXB0eSh0b2tlbiksIGlzR2V0dGVyOiB0cnVlKQogICAgICAuLmZpbGVPZmZzZXQgPSB0b2tlbi5jaGFyT2Zmc2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgc2luay53cml0ZSgiLCBuYW1lOiAiKTsKICAgIHNpbmsud3JpdGUobmFtZS5uYW1lKTsKICB9CgogIEV4cHJlc3Npb24gX2J1aWxkVW5yZXNvbHZlZFZhcmlhYmxlQXNzaWdubWVudCgKICAgICAgYm9vbCBpc0NvbXBvdW5kLCBFeHByZXNzaW9uIHZhbHVlKSB7CiAgICByZXR1cm4gaGVscGVyLndyYXBVbnJlc29sdmVkVmFyaWFibGVBc3NpZ25tZW50KAogICAgICAgIGhlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihidWlsZEVycm9yKAogICAgICAgICAgICBmb3Jlc3QuYXJndW1lbnRzKDxFeHByZXNzaW9uPlt2YWx1ZV0sIHRva2VuKSwKICAgICAgICAgICAgaXNTZXR0ZXI6IHRydWUpKSwKICAgICAgICBpc0NvbXBvdW5kLAogICAgICAgIHZhbHVlLAogICAgICAgIHRva2VuLmNoYXJPZmZzZXQpOwogIH0KfQoKY2xhc3MgS2VybmVsVW5saW5rZWRHZW5lcmF0b3IgZXh0ZW5kcyBLZXJuZWxHZW5lcmF0b3Igd2l0aCBVbmxpbmtlZEdlbmVyYXRvciB7CiAgQG92ZXJyaWRlCiAgZmluYWwgVW5saW5rZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbjsKCiAgZmluYWwgRXhwcmVzc2lvbiByZWNlaXZlcjsKCiAgZmluYWwgTmFtZSBuYW1lOwoKICBLZXJuZWxVbmxpbmtlZEdlbmVyYXRvcigKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLCB0aGlzLmRlY2xhcmF0aW9uKQogICAgICA6IG5hbWUgPSBuZXcgTmFtZShkZWNsYXJhdGlvbi5uYW1lLCBoZWxwZXIubGlicmFyeS50YXJnZXQpLAogICAgICAgIHJlY2VpdmVyID0gbmV3IEludmFsaWRFeHByZXNzaW9uKGRlY2xhcmF0aW9uLm5hbWUpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbiksCiAgICAgICAgc3VwZXIoaGVscGVyLCB0b2tlbik7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBuZXcgUHJvcGVydHlTZXQocmVjZWl2ZXIsIG5hbWUsIHZhbHVlKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkU2ltcGxlUmVhZCgpIHsKICAgIHJldHVybiBuZXcgUHJvcGVydHlHZXQocmVjZWl2ZXIsIG5hbWUpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBkb0ludm9jYXRpb24oaW50IG9mZnNldCwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCJkb0ludm9jYXRpb24iLCBvZmZzZXQsIHVyaSk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBLZXJuZWxDb250ZXh0QXdhcmVHZW5lcmF0b3IgZXh0ZW5kcyBLZXJuZWxHZW5lcmF0b3IKICAgIHdpdGggQ29udGV4dEF3YXJlR2VuZXJhdG9yIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBHZW5lcmF0b3IgZ2VuZXJhdG9yOwoKICBLZXJuZWxDb250ZXh0QXdhcmVHZW5lcmF0b3IoCiAgICAgIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLCBUb2tlbiB0b2tlbiwgdGhpcy5nZW5lcmF0b3IpCiAgICAgIDogc3VwZXIoaGVscGVyLCB0b2tlbik7Cn0KCmNsYXNzIEtlcm5lbERlbGF5ZWRBc3NpZ25tZW50IGV4dGVuZHMgS2VybmVsQ29udGV4dEF3YXJlR2VuZXJhdG9yCiAgICB3aXRoIERlbGF5ZWRBc3NpZ25tZW50IHsKICBAb3ZlcnJpZGUKICBmaW5hbCBFeHByZXNzaW9uIHZhbHVlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgYXNzaWdubWVudE9wZXJhdG9yOwoKICBLZXJuZWxEZWxheWVkQXNzaWdubWVudChFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sCiAgICAgIEdlbmVyYXRvciBnZW5lcmF0b3IsIHRoaXMudmFsdWUsIHRoaXMuYXNzaWdubWVudE9wZXJhdG9yKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4sIGdlbmVyYXRvcik7CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGUoIiwgdmFsdWU6ICIpOwogICAgcHJpbnROb2RlT24odmFsdWUsIHNpbmspOwogICAgc2luay53cml0ZSgiLCBhc3NpZ25tZW50T3BlcmF0b3I6ICIpOwogICAgc2luay53cml0ZShhc3NpZ25tZW50T3BlcmF0b3IpOwogIH0KfQoKY2xhc3MgS2VybmVsRGVsYXllZFBvc3RmaXhJbmNyZW1lbnQgZXh0ZW5kcyBLZXJuZWxDb250ZXh0QXdhcmVHZW5lcmF0b3IKICAgIHdpdGggRGVsYXllZFBvc3RmaXhJbmNyZW1lbnQgewogIEBvdmVycmlkZQogIGZpbmFsIE5hbWUgYmluYXJ5T3BlcmF0b3I7CgogIEBvdmVycmlkZQogIGZpbmFsIFByb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXQ7CgogIEtlcm5lbERlbGF5ZWRQb3N0Zml4SW5jcmVtZW50KEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLCBUb2tlbiB0b2tlbiwKICAgICAgR2VuZXJhdG9yIGdlbmVyYXRvciwgdGhpcy5iaW5hcnlPcGVyYXRvciwgdGhpcy5pbnRlcmZhY2VUYXJnZXQpCiAgICAgIDogc3VwZXIoaGVscGVyLCB0b2tlbiwgZ2VuZXJhdG9yKTsKfQoKY2xhc3MgS2VybmVsUHJlZml4VXNlR2VuZXJhdG9yIGV4dGVuZHMgS2VybmVsR2VuZXJhdG9yIHdpdGggUHJlZml4VXNlR2VuZXJhdG9yIHsKICBmaW5hbCBQcmVmaXhCdWlsZGVyIHByZWZpeDsKCiAgS2VybmVsUHJlZml4VXNlR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sIHRoaXMucHJlZml4KQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4pOwp9CgpjbGFzcyBLZXJuZWxVbmV4cGVjdGVkUXVhbGlmaWVkVXNlR2VuZXJhdG9yIGV4dGVuZHMgS2VybmVsR2VuZXJhdG9yCiAgICB3aXRoIFVuZXhwZWN0ZWRRdWFsaWZpZWRVc2VHZW5lcmF0b3IgewogIEBvdmVycmlkZQogIGZpbmFsIEtlcm5lbEdlbmVyYXRvciBwcmVmaXhHZW5lcmF0b3I7CgogIEBvdmVycmlkZQogIGZpbmFsIGJvb2wgaXNVbnJlc29sdmVkOwoKICBLZXJuZWxVbmV4cGVjdGVkUXVhbGlmaWVkVXNlR2VuZXJhdG9yKEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLAogICAgICBUb2tlbiB0b2tlbiwgdGhpcy5wcmVmaXhHZW5lcmF0b3IsIHRoaXMuaXNVbnJlc29sdmVkKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4pOwp9CgpjbGFzcyBLZXJuZWxQYXJzZXJFcnJvckdlbmVyYXRvciBleHRlbmRzIEtlcm5lbEdlbmVyYXRvcgogICAgd2l0aCBQYXJzZXJFcnJvckdlbmVyYXRvciB7CiAgQG92ZXJyaWRlCiAgZmluYWwgTWVzc2FnZSBtZXNzYWdlOwoKICBLZXJuZWxQYXJzZXJFcnJvckdlbmVyYXRvcigKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLCB0aGlzLm1lc3NhZ2UpCiAgICAgIDogc3VwZXIoaGVscGVyLCB0b2tlbik7Cn0KCkV4cHJlc3Npb24gbWFrZUxldChWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBFeHByZXNzaW9uIGJvZHkpIHsKICBpZiAodmFyaWFibGUgPT0gbnVsbCkgcmV0dXJuIGJvZHk7CiAgcmV0dXJuIG5ldyBMZXQodmFyaWFibGUsIGJvZHkpOwp9CgpFeHByZXNzaW9uIG1ha2VCaW5hcnkoRXhwcmVzc2lvbiBsZWZ0LCBOYW1lIG9wZXJhdG9yLCBQcm9jZWR1cmUgaW50ZXJmYWNlVGFyZ2V0LAogICAgRXhwcmVzc2lvbiByaWdodCwgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsCiAgICB7aW50IG9mZnNldDogVHJlZU5vZGUubm9PZmZzZXR9KSB7CiAgcmV0dXJuIG5ldyBNZXRob2RJbnZvY2F0aW9uSnVkZ21lbnQoCiAgICAgIGxlZnQsCiAgICAgIG9wZXJhdG9yLAogICAgICBoZWxwZXIuZm9yZXN0CiAgICAgICAgICAuY2FzdEFyZ3VtZW50cyhoZWxwZXIuZm9yZXN0LmFyZ3VtZW50cyg8RXhwcmVzc2lvbj5bcmlnaHRdLCBudWxsKSkKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0LAogICAgICBpbnRlcmZhY2VUYXJnZXQ6IGludGVyZmFjZVRhcmdldCkKICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKfQoKRXhwcmVzc2lvbiBidWlsZElzTnVsbCgKICAgIEV4cHJlc3Npb24gdmFsdWUsIGludCBvZmZzZXQsIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyKSB7CiAgcmV0dXJuIG1ha2VCaW5hcnkodmFsdWUsIGVxdWFsc05hbWUsIG51bGwsCiAgICAgIGhlbHBlci5mb3Jlc3QubGl0ZXJhbE51bGwobnVsbCkuLmZpbGVPZmZzZXQgPSBvZmZzZXQsIGhlbHBlciwKICAgICAgb2Zmc2V0OiBvZmZzZXQpOwp9CgpWYXJpYWJsZURlY2xhcmF0aW9uIG1ha2VPclJldXNlVmFyaWFibGUoRXhwcmVzc2lvbiB2YWx1ZSkgewogIC8vIFRPRE86IERldmlzZSBhIHdheSB0byByZW1lbWJlciBpZiBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHdhcyByZXVzZWQKICAvLyBvciBpcyBmcmVzaCAoaGVuY2UgbmVlZHMgYSBsZXQgYmluZGluZykuCiAgcmV0dXJuIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKHZhbHVlKTsKfQoKaW50IGFkanVzdEZvckltcGxpY2l0Q2FsbChTdHJpbmcgbmFtZSwgaW50IG9mZnNldCkgewogIC8vIE5vcm1hbGx5IHRoZSBvZmZzZXQgaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0b2tlbiwgYnV0IGluIHRoaXMgY2FzZSwKICAvLyBiZWNhdXNlIHdlIGluc2VydCBhICcuY2FsbCcsIHdlIHdhbnQgaXQgYXQgdGhlIGVuZCBpbnN0ZWFkLgogIHJldHVybiBvZmZzZXQgKyAobmFtZT8ubGVuZ3RoID8/IDApOwp9Cgpib29sIGlzRmllbGRPckdldHRlcihNZW1iZXIgbWVtYmVyKSB7CiAgcmV0dXJuIG1lbWJlciBpcyBGaWVsZCB8fCAobWVtYmVyIGlzIFByb2NlZHVyZSAmJiBtZW1iZXIuaXNHZXR0ZXIpOwp9CoZRAE5OPAEhOQEuATgBHQkYETYkLCwnHCIlJyw1ATIBTgE9ATcBLgEsASgBIwkfIRshJh0TIB4qHhwhIR8lJiQlGikbIR4BSgEiAR0JGxwXHRgBTQEdCSMVEg8VDSQQIg4mExUVEx8nIhoSFx0lFR0VAR0JFRwiHBcgASo3AS4BSigBEwEVAR8BDCEtBAEMTDtMHAQBDCczIzsXPEUQNxA5H0A8Bk46Ow41Dh4dPkgEAQxMJh8hHyM7MjRMKBksSRwEAQw3Jh8kJEkYIiocBAEMOCYfJBcmSxokLB8GPzlQLR9FGSwsOjcmFEsEAQwhKycnHi8jHSAEAQwyKycnHj8jHSAEATMBQjU+BAFGKSU2JQYRBAE8NTAlOCcGEgQBFkY7KiANEwYEAUg8RjoCAUsBOSAmAR8BTCgeAQwwAQxGI0MzPiwkEQQBDDw1UBYwJyc6KQgNLy4oBhIEAQw9UDkfBAEMRT8sBAEMIjIgQSRFBAIBPCMdARMBFwEXASkBS0ceAQwsARVGLiwEAQw9TAQBDEZFAQwiMilKIEEcGx5IHkgEAQwhMywEAQxCNT8sJhIEAQxGPywkEQQBDDw1RywmEgQBDBZGTwQCAUAnEwEXARcBRjgeAQwsAQxGGj0GSywkEQQBDDw1Gj0GEEswJhIEAQw9JSMxBiRGJh4GKT4rBAEMRkEBDCIyHBseSB5IBAIBRSwmAScBEwEXARcBFwEqKBMfERMTEUEeATwBDCwBDEY/LCQRBAEMPDVHLCYSBAEMFkYoNzcONw4OHSUwKj8dPC0jDUgfBgQBDD01BAEMRk8BDCIyIEEqSxwbHkgeSBw9BAIBQSgTARcBFwFHOB4BDCwBDEYaTAY5SywkEQQBDDw1GkwGOTosJhIEAQw9Oi1DBjUrOkhCJiENTR9OBgQBDEZQAQwiMhwbHkgeSAQCATsiHQEaARoBGgEoASUBSkgeAR0/TwQBIEorRS0sBAEMIURMISwRBAEMQjVMLhIWD1EhLCYSBAEMRi0aFh5DISwkEQQBDDw1TC4aFh5KISwmEgQBUCYiR08wQS4aFi9JFSEsJjotFEgEAQwWRigaEVEhHAQBDD0pTh8EAQxGSQEMIjIgQR0+HkgeSChJJUYEAgE/JhoBGgEaASUBRTkeAR0/KwQBIkdBLiYWL0kVISwmORRIBAEMISkmFkwhLAQBDEI1TC4mFg9RISwmEgQBDEYtJhYeQyEsJBEEAQw8NUwuJhYeSiEsJhIEAQwWRksEAQw9KTgfBAEMRkUBDCIyHT4eSB5IJUYEAgFAJxoBFwEXASUBRjkeAR0/KwQBIkdBGkcaBisWL0kVECwmORRIBAEMIRpHGgY+O0whLAQBDEI1TBpHGgYrFg9RECwmEgQBDEYaRxoGKhYeQxAsJBEEAQw8NUwaRxoGKxYeShAsJhIEAQwWRhpKHAQBDD0pOB8EAQxGRBoBDCIyHT4eSB5IJUYEAgE6IQwbARwBTSk7HgEMSAEMRhUeICc4CA02BiQRBAEMPDUWHycnOggNMQYmLhIEAQw9OisiTBIwBj1HRUhCJiENQR8GBAEMRjkBDCIyIkwjTQQCATkgJAEeQx4BDEYsL04sJBEEAQw9PDclTQZBBAEMIh8ZBAIBPCMMMgEMKQFPMh4BDCFJMwQBDEYnNiAbBAEMPDUnSyAbBAEMRjkCAUMcDCwBSDE2AQweJCo1QSdGOyRQJRUPLyI3SDEUCAYdBAEMMisnJx44LyMdIAQBDBdMRB4ZARsqAS05OkcBGxxPOU0RNBsaGhkZFCAjCi8kQg8cHxsmMkUfOBsKOzEIAR8WSw1LBgQBDD1IRAQCATwjDCEBGQEdAU8uHgEMLgEMRjwjBAEMFks+AQw9UDkfBAEMIjIiQygiHT4EAgE8QQwTASFAHgEMTD0EAQxMJh8hHyM8BAEMIUQnBAEMIhwbBAExKzQ2Oh4UDxsEAgFPDCkBHQETARtHQjswHgEMTDIsBAEMIVAEAQw9NQQCAUMhDB0BH0UeAgFCHQwaAQwdAUlAKQEMIh0eKiQEAgFIIwwdAQwjAU9GKQIBUR4BHEIeAgFEKwwpAQwbAUo8HgIBOSAMGQEeQx4CAUQlIgIBUTgnJwwQFE0jKBsCARhGLUQXAgE8SS4yAgE1SUEnAgEmRgIBQ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2V4cHJlc3Npb25fZ2VuZXJhdG9yLmRhcnRFc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9leHByZXNzaW9uX2dlbmVyYXRvci5kYXJ0wACgAS8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gQSBsaWJyYXJ5IHRvIGhlbHAgZ2VuZXJhdGUgZXhwcmVzc2lvbi4KbGlicmFyeSBmYXN0YS5leHByZXNzaW9uX2dlbmVyYXRvcjsKCmltcG9ydCAnLi4vLi4vc2Nhbm5lci90b2tlbi5kYXJ0JyBzaG93IFRva2VuOwoKaW1wb3J0ICcuLi9jb25zdGFudF9jb250ZXh0LmRhcnQnIHNob3cgQ29uc3RhbnRDb250ZXh0OwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIExvY2F0ZWRNZXNzYWdlLAogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgVGVtcGxhdGUsCiAgICAgICAgbWVzc2FnZUNhbnRVc2VQcmVmaXhBc0V4cHJlc3Npb24sCiAgICAgICAgbWVzc2FnZUNhbnRVc2VQcmVmaXhXaXRoTnVsbEF3YXJlLAogICAgICAgIG1lc3NhZ2VJbGxlZ2FsQXNzaWdubWVudFRvTm9uQXNzaWduYWJsZSwKICAgICAgICBtZXNzYWdlSW52YWxpZEluaXRpYWxpemVyLAogICAgICAgIG1lc3NhZ2VOb3RBQ29uc3RhbnRFeHByZXNzaW9uLAogICAgICAgIG5vTGVuZ3RoLAogICAgICAgIHRlbXBsYXRlQ2FudFVzZURlZmVycmVkUHJlZml4QXNDb25zdGFudCwKICAgICAgICB0ZW1wbGF0ZURlZmVycmVkVHlwZUFubm90YXRpb24sCiAgICAgICAgdGVtcGxhdGVNaXNzaW5nRXhwbGljaXRUeXBlQXJndW1lbnRzLAogICAgICAgIHRlbXBsYXRlTm90QVByZWZpeEluVHlwZUFubm90YXRpb24sCiAgICAgICAgdGVtcGxhdGVOb3RBVHlwZSwKICAgICAgICB0ZW1wbGF0ZVVucmVzb2x2ZWRQcmVmaXhJblR5cGVBbm5vdGF0aW9uOwoKaW1wb3J0ICcuLi9uYW1lcy5kYXJ0JwogICAgc2hvdwogICAgICAgIGFtcGVyc2FuZE5hbWUsCiAgICAgICAgYmFyTmFtZSwKICAgICAgICBjYXJldE5hbWUsCiAgICAgICAgZGl2aXNpb25OYW1lLAogICAgICAgIGxlZnRTaGlmdE5hbWUsCiAgICAgICAgbGVuZ3RoTmFtZSwKICAgICAgICBtaW51c05hbWUsCiAgICAgICAgbXVsdGlwbHlOYW1lLAogICAgICAgIG11c3RhY2hlTmFtZSwKICAgICAgICBwZXJjZW50TmFtZSwKICAgICAgICBwbHVzTmFtZSwKICAgICAgICByaWdodFNoaWZ0TmFtZSwKICAgICAgICB0cmlwbGVTaGlmdE5hbWU7CgppbXBvcnQgJy4uL3BhcnNlci5kYXJ0JyBzaG93IGxlbmd0aEZvclRva2VuLCBsZW5ndGhPZlNwYW4sIG9mZnNldEZvclRva2VuOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuaGFuZGxlZCwgdW5zdXBwb3J0ZWQ7CgppbXBvcnQgJ2NvbnN0bmVzcy5kYXJ0JyBzaG93IENvbnN0bmVzczsKCmltcG9ydCAnZXhwcmVzc2lvbl9nZW5lcmF0b3JfaGVscGVyLmRhcnQnIHNob3cgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlcjsKCmltcG9ydCAnZm9yZXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgRm9yZXN0LAogICAgICAgIExvYWRMaWJyYXJ5QnVpbGRlciwKICAgICAgICBQcmVmaXhCdWlsZGVyLAogICAgICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIsCiAgICAgICAgVW5saW5rZWREZWNsYXJhdGlvbjsKCmltcG9ydCAna2VybmVsX2FwaS5kYXJ0JyBzaG93IHByaW50UXVhbGlmaWVkTmFtZU9uOwoKaW1wb3J0ICdrZXJuZWxfYXN0X2FwaS5kYXJ0JwogICAgc2hvdwogICAgICAgIEFyZ3VtZW50cywKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEeW5hbWljVHlwZSwKICAgICAgICBFeHByZXNzaW9uLAogICAgICAgIEluaXRpYWxpemVyLAogICAgICAgIE1lbWJlciwKICAgICAgICBOYW1lLAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uOwoKaW1wb3J0ICdrZXJuZWxfYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIEFjY2Vzc0Vycm9yQnVpbGRlciwKICAgICAgICBEZWNsYXJhdGlvbiwKICAgICAgICBLZXJuZWxJbnZhbGlkVHlwZUJ1aWxkZXIsCiAgICAgICAgS2VybmVsTmFtZWRUeXBlQnVpbGRlciwKICAgICAgICBLZXJuZWxUeXBlQnVpbGRlciwKICAgICAgICBVbnJlc29sdmVkVHlwZTsKCmltcG9ydCAna2VybmVsX2V4cHJlc3Npb25fZ2VuZXJhdG9yLmRhcnQnCiAgICBzaG93IEluY29tcGxldGVTZW5kR2VuZXJhdG9yLCBTZW5kQWNjZXNzR2VuZXJhdG9yOwoKZXhwb3J0ICdrZXJuZWxfZXhwcmVzc2lvbl9nZW5lcmF0b3IuZGFydCcKICAgIHNob3cKICAgICAgICBJbmNvbXBsZXRlRXJyb3JHZW5lcmF0b3IsCiAgICAgICAgSW5jb21wbGV0ZVByb3BlcnR5QWNjZXNzR2VuZXJhdG9yLAogICAgICAgIEluY29tcGxldGVTZW5kR2VuZXJhdG9yLAogICAgICAgIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uR2VuZXJhdG9yLAogICAgICAgIFNlbmRBY2Nlc3NHZW5lcmF0b3IsCiAgICAgICAgVGhpc0FjY2Vzc0dlbmVyYXRvciwKICAgICAgICBidWlsZElzTnVsbDsKCmFic3RyYWN0IGNsYXNzIEV4cHJlc3Npb25HZW5lcmF0b3IgewogIC8vLyBCdWlsZHMgYSBbRXhwcmVzc2lvbl0gcmVwcmVzZW50aW5nIGEgcmVhZCBmcm9tIHRoZSBnZW5lcmF0b3IuCiAgRXhwcmVzc2lvbiBidWlsZFNpbXBsZVJlYWQoKTsKCiAgLy8vIEJ1aWxkcyBhIFtFeHByZXNzaW9uXSByZXByZXNlbnRpbmcgYW4gYXNzaWdubWVudCB3aXRoIHRoZSBnZW5lcmF0b3Igb24KICAvLy8gdGhlIExIUyBhbmQgW3ZhbHVlXSBvbiB0aGUgUkhTLgogIC8vLwogIC8vLyBUaGUgcmV0dXJuZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdGhlIGFzc2lnbmVkIHZhbHVlLCB1bmxlc3MKICAvLy8gW3ZvaWRDb250ZXh0XSBpcyB0cnVlLCBpbiB3aGljaCBjYXNlIGl0IG1heSBldmFsdWF0ZSB0byBhbnl0aGluZy4KICBFeHByZXNzaW9uIGJ1aWxkQXNzaWdubWVudChFeHByZXNzaW9uIHZhbHVlLCB7Ym9vbCB2b2lkQ29udGV4dH0pOwoKICAvLy8gUmV0dXJucyBhIFtFeHByZXNzaW9uXSByZXByZXNlbnRpbmcgYSBudWxsLWF3YXJlIGFzc2lnbm1lbnQgKGA/Pz1gKSB3aXRoCiAgLy8vIHRoZSBnZW5lcmF0b3Igb24gdGhlIExIUyBhbmQgW3ZhbHVlXSBvbiB0aGUgUkhTLgogIC8vLwogIC8vLyBUaGUgcmV0dXJuZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdGhlIGFzc2lnbmVkIHZhbHVlLCB1bmxlc3MKICAvLy8gW3ZvaWRDb250ZXh0XSBpcyB0cnVlLCBpbiB3aGljaCBjYXNlIGl0IG1heSBldmFsdWF0ZSB0byBhbnl0aGluZy4KICAvLy8KICAvLy8gW3R5cGVdIGlzIHRoZSBzdGF0aWMgdHlwZSBvZiB0aGUgUkhTLgogIEV4cHJlc3Npb24gYnVpbGROdWxsQXdhcmVBc3NpZ25tZW50KAogICAgICBFeHByZXNzaW9uIHZhbHVlLCBEYXJ0VHlwZSB0eXBlLCBpbnQgb2Zmc2V0LAogICAgICB7Ym9vbCB2b2lkQ29udGV4dH0pOwoKICAvLy8gUmV0dXJucyBhIFtFeHByZXNzaW9uXSByZXByZXNlbnRpbmcgYSBjb21wb3VuZCBhc3NpZ25tZW50IChlLmcuIGArPWApCiAgLy8vIHdpdGggdGhlIGdlbmVyYXRvciBvbiB0aGUgTEhTIGFuZCBbdmFsdWVdIG9uIHRoZSBSSFMuCiAgRXhwcmVzc2lvbiBidWlsZENvbXBvdW5kQXNzaWdubWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLCBFeHByZXNzaW9uIHZhbHVlLAogICAgICB7aW50IG9mZnNldCwKICAgICAgYm9vbCB2b2lkQ29udGV4dCwKICAgICAgUHJvY2VkdXJlIGludGVyZmFjZVRhcmdldCwKICAgICAgYm9vbCBpc1ByZUluY0RlYywKICAgICAgYm9vbCBpc1Bvc3RJbmNEZWN9KTsKCiAgLy8vIFJldHVybnMgYSBbRXhwcmVzc2lvbl0gcmVwcmVzZW50aW5nIGEgcHJlLWluY3JlbWVudCBvciBwcmUtZGVjcmVtZW50IG9mCiAgLy8vIHRoZSBnZW5lcmF0b3IuCiAgRXhwcmVzc2lvbiBidWlsZFByZWZpeEluY3JlbWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLAogICAgICB7aW50IG9mZnNldCwgYm9vbCB2b2lkQ29udGV4dCwgUHJvY2VkdXJlIGludGVyZmFjZVRhcmdldH0pOwoKICAvLy8gUmV0dXJucyBhIFtFeHByZXNzaW9uXSByZXByZXNlbnRpbmcgYSBwb3N0LWluY3JlbWVudCBvciBwb3N0LWRlY3JlbWVudCBvZgogIC8vLyB0aGUgZ2VuZXJhdG9yLgogIEV4cHJlc3Npb24gYnVpbGRQb3N0Zml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0LCBib29sIHZvaWRDb250ZXh0LCBQcm9jZWR1cmUgaW50ZXJmYWNlVGFyZ2V0fSk7CgogIC8vLyBSZXR1cm5zIGEgW0V4cHJlc3Npb25dIHJlcHJlc2VudGluZyBhIGNvbXBpbGUtdGltZSBlcnJvci4KICAvLy8KICAvLy8gQXQgcnVudGltZSwgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgogIEV4cHJlc3Npb24gbWFrZUludmFsaWRSZWFkKCk7CgogIC8vLyBSZXR1cm5zIGEgW0V4cHJlc3Npb25dIHJlcHJlc2VudGluZyBhIGNvbXBpbGUtdGltZSBlcnJvciB3cmFwcGluZwogIC8vLyBbdmFsdWVdLgogIC8vLwogIC8vLyBBdCBydW50aW1lLCBbdmFsdWVdIHdpbGwgYmUgZXZhbHVhdGVkIGJlZm9yZSB0aHJvd2luZyBhbiBleGNlcHRpb24uCiAgRXhwcmVzc2lvbiBtYWtlSW52YWxpZFdyaXRlKEV4cHJlc3Npb24gdmFsdWUpOwp9CgovLy8gQSBnZW5lcmF0b3IgcmVwcmVzZW50cyBhIHN1YmV4cHJlc3Npb24gZm9yIHdoaWNoIHdlIGNhbid0IHlldCBidWlsZCBhbgovLy8gZXhwcmVzc2lvbiBiZWNhdXNlIHdlIGRvbid0IHlldCBrbm93IHRoZSBjb250ZXh0IGluIHdoaWNoIGl0J3MgdXNlZC4KLy8vCi8vLyBPbmNlIHRoZSBjb250ZXh0IGlzIGtub3duLCBhIGdlbmVyYXRvciBjYW4gYmUgY29udmVydGVkIGludG8gYW4gZXhwcmVzc2lvbgovLy8gYnkgY2FsbGluZyBhIGBidWlsZGAgbWV0aG9kLgovLy8KLy8vIEZvciBleGFtcGxlLCB3aGVuIGJ1aWxkaW5nIGEga2VybmVsIHJlcHJlc2VudGF0aW9uIGZvciBgYVt4XSA9IGJgLCBhZnRlcgovLy8gcGFyc2luZyBgYVt4XWAgYnV0IGJlZm9yZSBwYXJzaW5nIGA9IGJgLCB3ZSBkb24ndCB5ZXQga25vdyB3aGV0aGVyIHRvCi8vLyBnZW5lcmF0ZSBhbiBpbnZvY2F0aW9uIG9mIGBvcGVyYXRvcltdYCBvciBgb3BlcmF0b3JbXT1gLCBzbyB3ZSBjcmVhdGUgYQovLy8gW0dlbmVyYXRvcl0gb2JqZWN0LiAgTGF0ZXIsIGFmdGVyIGA9IGJgIGlzIHBhcnNlZCwgW2J1aWxkQXNzaWdubWVudF0gd2lsbAovLy8gYmUgY2FsbGVkLgphYnN0cmFjdCBjbGFzcyBHZW5lcmF0b3IgaW1wbGVtZW50cyBFeHByZXNzaW9uR2VuZXJhdG9yIHsKICBmaW5hbCBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlcjsKCiAgZmluYWwgVG9rZW4gdG9rZW47CgogIEdlbmVyYXRvcih0aGlzLmhlbHBlciwgdGhpcy50b2tlbik7CgogIEZvcmVzdCBnZXQgZm9yZXN0ID0+IGhlbHBlci5mb3Jlc3Q7CgogIFN0cmluZyBnZXQgcGxhaW5OYW1lRm9yUmVhZDsKCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWU7CgogIFVyaSBnZXQgdXJpID0+IGhlbHBlci51cmk7CgogIFN0cmluZyBnZXQgcGxhaW5OYW1lRm9yV3JpdGUgPT4gcGxhaW5OYW1lRm9yUmVhZDsKCiAgYm9vbCBnZXQgaXNJbml0aWFsaXplciA9PiBmYWxzZTsKCiAgRXhwcmVzc2lvbiBidWlsZEZvckVmZmVjdCgpID0+IGJ1aWxkU2ltcGxlUmVhZCgpOwoKICBJbml0aWFsaXplciBidWlsZEZpZWxkSW5pdGlhbGl6ZXIoTWFwPFN0cmluZywgaW50PiBpbml0aWFsaXplZEZpZWxkcykgewogICAgaW50IG9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIHJldHVybiBoZWxwZXIuYnVpbGRJbnZhbGlkSW5pdGlhbGl6ZXIoCiAgICAgICAgaGVscGVyLmRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKGhlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgICAgIG1lc3NhZ2VJbnZhbGlkSW5pdGlhbGl6ZXIsIG9mZnNldCwgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKSksCiAgICAgICAgb2Zmc2V0KTsKICB9CgogIC8qIEV4cHJlc3Npb24gfCBHZW5lcmF0b3IgfCBJbml0aWFsaXplciAqLyBkb0ludm9jYXRpb24oCiAgICAgIGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpOwoKICAvKiBFeHByZXNzaW9uIHwgR2VuZXJhdG9yICovIGJ1aWxkUHJvcGVydHlBY2Nlc3MoCiAgICAgIEluY29tcGxldGVTZW5kR2VuZXJhdG9yIHNlbmQsIGludCBvcGVyYXRvck9mZnNldCwgYm9vbCBpc051bGxBd2FyZSkgewogICAgaWYgKHNlbmQgaXMgU2VuZEFjY2Vzc0dlbmVyYXRvcikgewogICAgICByZXR1cm4gaGVscGVyLmJ1aWxkTWV0aG9kSW52b2NhdGlvbigKICAgICAgICAgIGJ1aWxkU2ltcGxlUmVhZCgpLAogICAgICAgICAgc2VuZC5uYW1lLAogICAgICAgICAgc2VuZC5hcmd1bWVudHMgYXMgZHluYW1pYyAvKiBUT0RPKGFoZSk6IFJlbW92ZSB0aGlzIGNhc3QuICovLAogICAgICAgICAgb2Zmc2V0Rm9yVG9rZW4oc2VuZC50b2tlbiksCiAgICAgICAgICBpc051bGxBd2FyZTogaXNOdWxsQXdhcmUpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGhlbHBlci5jb25zdGFudENvbnRleHQgIT0gQ29uc3RhbnRDb250ZXh0Lm5vbmUgJiYKICAgICAgICAgIHNlbmQubmFtZSAhPSBsZW5ndGhOYW1lKSB7CiAgICAgICAgaGVscGVyLmFkZFByb2JsZW0oCiAgICAgICAgICAgIG1lc3NhZ2VOb3RBQ29uc3RhbnRFeHByZXNzaW9uLCBvZmZzZXRGb3JUb2tlbih0b2tlbiksIHRva2VuLmxlbmd0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIFByb3BlcnR5QWNjZXNzR2VuZXJhdG9yLm1ha2UoaGVscGVyLCBzZW5kLnRva2VuLCBidWlsZFNpbXBsZVJlYWQoKSwKICAgICAgICAgIHNlbmQubmFtZSwgbnVsbCwgbnVsbCwgaXNOdWxsQXdhcmUpOwogICAgfQogIH0KCiAgS2VybmVsVHlwZUJ1aWxkZXIgYnVpbGRUeXBlV2l0aFJlc29sdmVkQXJndW1lbnRzKAogICAgICBMaXN0PFVucmVzb2x2ZWRUeXBlPEtlcm5lbFR5cGVCdWlsZGVyPj4gYXJndW1lbnRzKSB7CiAgICBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyIHJlc3VsdCA9CiAgICAgICAgbmV3IEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIodG9rZW4ubGV4ZW1lLCBudWxsKTsKICAgIHJlc3VsdC5iaW5kKHJlc3VsdC5idWlsZEludmFsaWRUeXBlKHRlbXBsYXRlTm90QVR5cGUKICAgICAgICAud2l0aEFyZ3VtZW50cyh0b2tlbi5sZXhlbWUpCiAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIG9mZnNldEZvclRva2VuKHRva2VuKSwgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKSkpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8qIEV4cHJlc3Npb24gfCBHZW5lcmF0b3IgKi8gT2JqZWN0IHF1YWxpZmllZExvb2t1cChUb2tlbiBuYW1lKSB7CiAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRRdWFsaWZpZWRVc2VHZW5lcmF0b3IoaGVscGVyLCBuYW1lLCB0aGlzLCBmYWxzZSk7CiAgfQoKICBFeHByZXNzaW9uIGludm9rZUNvbnN0cnVjdG9yKAogICAgICBMaXN0PFVucmVzb2x2ZWRUeXBlPEtlcm5lbFR5cGVCdWlsZGVyPj4gdHlwZUFyZ3VtZW50cywKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIFRva2VuIG5hbWVUb2tlbiwKICAgICAgVG9rZW4gbmFtZUxhc3RUb2tlbiwKICAgICAgQ29uc3RuZXNzIGNvbnN0bmVzcykgewogICAgaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBhc3NlcnQoZm9yZXN0LmFyZ3VtZW50c1R5cGVBcmd1bWVudHMoYXJndW1lbnRzKS5pc0VtcHR5KTsKICAgICAgZm9yZXN0LmFyZ3VtZW50c1NldFR5cGVBcmd1bWVudHMoCiAgICAgICAgICBhcmd1bWVudHMsIGhlbHBlci5idWlsZERhcnRUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMpKTsKICAgIH0KICAgIHJldHVybiBoZWxwZXIud3JhcEludmFsaWRDb25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICAgICAgaGVscGVyLnRocm93Tm9TdWNoTWV0aG9kRXJyb3IoCiAgICAgICAgICAgIGZvcmVzdC5saXRlcmFsTnVsbCh0b2tlbiksCiAgICAgICAgICAgIGhlbHBlci5jb25zdHJ1Y3Rvck5hbWVGb3JEaWFnbm9zdGljcyhuYW1lLAogICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBwbGFpbk5hbWVGb3JSZWFkKSwKICAgICAgICAgICAgYXJndW1lbnRzLAogICAgICAgICAgICBuYW1lVG9rZW4uY2hhck9mZnNldCksCiAgICAgICAgbnVsbCwKICAgICAgICBhcmd1bWVudHMsCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pKTsKICB9CgogIGJvb2wgZ2V0IGlzVGhpc1Byb3BlcnR5QWNjZXNzID0+IGZhbHNlOwoKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGJ1ZmZlci53cml0ZShkZWJ1Z05hbWUpOwogICAgYnVmZmVyLndyaXRlKCIob2Zmc2V0OiAiKTsKICAgIGJ1ZmZlci53cml0ZSgiJHtvZmZzZXRGb3JUb2tlbih0b2tlbil9Iik7CiAgICBwcmludE9uKGJ1ZmZlcik7CiAgICBidWZmZXIud3JpdGUoIikiKTsKICAgIHJldHVybiAiJGJ1ZmZlciI7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBWYXJpYWJsZVVzZUdlbmVyYXRvciBpbXBsZW1lbnRzIEdlbmVyYXRvciB7CiAgZmFjdG9yeSBWYXJpYWJsZVVzZUdlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsCiAgICAgIFtEYXJ0VHlwZSBwcm9tb3RlZFR5cGVdKSB7CiAgICByZXR1cm4gaGVscGVyLmZvcmVzdAogICAgICAgIC52YXJpYWJsZVVzZUdlbmVyYXRvcihoZWxwZXIsIHRva2VuLCB2YXJpYWJsZSwgcHJvbW90ZWRUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZGVidWdOYW1lID0+ICJWYXJpYWJsZVVzZUdlbmVyYXRvciI7Cn0KCmFic3RyYWN0IGNsYXNzIFByb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGltcGxlbWVudHMgR2VuZXJhdG9yIHsKICBmYWN0b3J5IFByb3BlcnR5QWNjZXNzR2VuZXJhdG9yLmludGVybmFsKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgVG9rZW4gdG9rZW4sCiAgICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIsCiAgICAgIE5hbWUgbmFtZSwKICAgICAgTWVtYmVyIGdldHRlciwKICAgICAgTWVtYmVyIHNldHRlcikgewogICAgcmV0dXJuIGhlbHBlci5mb3Jlc3QKICAgICAgICAucHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IoaGVscGVyLCB0b2tlbiwgcmVjZWl2ZXIsIG5hbWUsIGdldHRlciwgc2V0dGVyKTsKICB9CgogIHN0YXRpYyBHZW5lcmF0b3IgbWFrZSgKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsCiAgICAgIFRva2VuIHRva2VuLAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLAogICAgICBOYW1lIG5hbWUsCiAgICAgIE1lbWJlciBnZXR0ZXIsCiAgICAgIE1lbWJlciBzZXR0ZXIsCiAgICAgIGJvb2wgaXNOdWxsQXdhcmUpIHsKICAgIGlmIChoZWxwZXIuZm9yZXN0LmlzVGhpc0V4cHJlc3Npb24ocmVjZWl2ZXIpKSB7CiAgICAgIGdldHRlciA/Pz0gaGVscGVyLmxvb2t1cEluc3RhbmNlTWVtYmVyKG5hbWUpOwogICAgICBzZXR0ZXIgPz89IGhlbHBlci5sb29rdXBJbnN0YW5jZU1lbWJlcihuYW1lLCBpc1NldHRlcjogdHJ1ZSk7CiAgICAgIHJldHVybiBuZXcgVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yKAogICAgICAgICAgaGVscGVyLCB0b2tlbiwgbmFtZSwgZ2V0dGVyLCBzZXR0ZXIpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGlzTnVsbEF3YXJlCiAgICAgICAgICA/IG5ldyBOdWxsQXdhcmVQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcigKICAgICAgICAgICAgICBoZWxwZXIsIHRva2VuLCByZWNlaXZlciwgbmFtZSwgZ2V0dGVyLCBzZXR0ZXIsIG51bGwpCiAgICAgICAgICA6IG5ldyBQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvci5pbnRlcm5hbCgKICAgICAgICAgICAgICBoZWxwZXIsIHRva2VuLCByZWNlaXZlciwgbmFtZSwgZ2V0dGVyLCBzZXR0ZXIpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIlByb3BlcnR5QWNjZXNzR2VuZXJhdG9yIjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNUaGlzUHJvcGVydHlBY2Nlc3MgPT4gZmFsc2U7Cn0KCi8vLyBTcGVjaWFsIGNhc2Ugb2YgW1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yXSB0byBhdm9pZCBjcmVhdGluZyBhbiBpbmRpcmVjdAovLy8gYWNjZXNzIHRvICd0aGlzJy4KYWJzdHJhY3QgY2xhc3MgVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGltcGxlbWVudHMgR2VuZXJhdG9yIHsKICBmYWN0b3J5IFRoaXNQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgVG9rZW4gdG9rZW4sIE5hbWUgbmFtZSwgTWVtYmVyIGdldHRlciwgTWVtYmVyIHNldHRlcikgewogICAgcmV0dXJuIGhlbHBlci5mb3Jlc3QKICAgICAgICAudGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yKGhlbHBlciwgdG9rZW4sIG5hbWUsIGdldHRlciwgc2V0dGVyKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZGVidWdOYW1lID0+ICJUaGlzUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IiOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1RoaXNQcm9wZXJ0eUFjY2VzcyA9PiB0cnVlOwp9CgphYnN0cmFjdCBjbGFzcyBOdWxsQXdhcmVQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvciBpbXBsZW1lbnRzIEdlbmVyYXRvciB7CiAgZmFjdG9yeSBOdWxsQXdhcmVQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcigKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsCiAgICAgIFRva2VuIHRva2VuLAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyRXhwcmVzc2lvbiwKICAgICAgTmFtZSBuYW1lLAogICAgICBNZW1iZXIgZ2V0dGVyLAogICAgICBNZW1iZXIgc2V0dGVyLAogICAgICBEYXJ0VHlwZSB0eXBlKSB7CiAgICByZXR1cm4gaGVscGVyLmZvcmVzdC5udWxsQXdhcmVQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcigKICAgICAgICBoZWxwZXIsIHRva2VuLCByZWNlaXZlckV4cHJlc3Npb24sIG5hbWUsIGdldHRlciwgc2V0dGVyLCB0eXBlKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZGVidWdOYW1lID0+ICJOdWxsQXdhcmVQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvciI7Cn0KCmFic3RyYWN0IGNsYXNzIFN1cGVyUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IgaW1wbGVtZW50cyBHZW5lcmF0b3IgewogIGZhY3RvcnkgU3VwZXJQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgVG9rZW4gdG9rZW4sIE5hbWUgbmFtZSwgTWVtYmVyIGdldHRlciwgTWVtYmVyIHNldHRlcikgewogICAgcmV0dXJuIGhlbHBlci5mb3Jlc3QKICAgICAgICAuc3VwZXJQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcihoZWxwZXIsIHRva2VuLCBuYW1lLCBnZXR0ZXIsIHNldHRlcik7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiU3VwZXJQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvciI7Cn0KCmFic3RyYWN0IGNsYXNzIEluZGV4ZWRBY2Nlc3NHZW5lcmF0b3IgaW1wbGVtZW50cyBHZW5lcmF0b3IgewogIGZhY3RvcnkgSW5kZXhlZEFjY2Vzc0dlbmVyYXRvci5pbnRlcm5hbCgKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsCiAgICAgIFRva2VuIHRva2VuLAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLAogICAgICBFeHByZXNzaW9uIGluZGV4LAogICAgICBQcm9jZWR1cmUgZ2V0dGVyLAogICAgICBQcm9jZWR1cmUgc2V0dGVyKSB7CiAgICByZXR1cm4gaGVscGVyLmZvcmVzdAogICAgICAgIC5pbmRleGVkQWNjZXNzR2VuZXJhdG9yKGhlbHBlciwgdG9rZW4sIHJlY2VpdmVyLCBpbmRleCwgZ2V0dGVyLCBzZXR0ZXIpOwogIH0KCiAgc3RhdGljIEdlbmVyYXRvciBtYWtlKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgVG9rZW4gdG9rZW4sCiAgICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIsCiAgICAgIEV4cHJlc3Npb24gaW5kZXgsCiAgICAgIFByb2NlZHVyZSBnZXR0ZXIsCiAgICAgIFByb2NlZHVyZSBzZXR0ZXIpIHsKICAgIGlmIChoZWxwZXIuZm9yZXN0LmlzVGhpc0V4cHJlc3Npb24ocmVjZWl2ZXIpKSB7CiAgICAgIHJldHVybiBuZXcgVGhpc0luZGV4ZWRBY2Nlc3NHZW5lcmF0b3IoCiAgICAgICAgICBoZWxwZXIsIHRva2VuLCBpbmRleCwgZ2V0dGVyLCBzZXR0ZXIpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBJbmRleGVkQWNjZXNzR2VuZXJhdG9yLmludGVybmFsKAogICAgICAgICAgaGVscGVyLCB0b2tlbiwgcmVjZWl2ZXIsIGluZGV4LCBnZXR0ZXIsIHNldHRlcik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IHBsYWluTmFtZUZvclJlYWQgPT4gIltdIjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBwbGFpbk5hbWVGb3JXcml0ZSA9PiAiW109IjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIkluZGV4ZWRBY2Nlc3NHZW5lcmF0b3IiOwp9CgovLy8gU3BlY2lhbCBjYXNlIG9mIFtJbmRleGVkQWNjZXNzR2VuZXJhdG9yXSB0byBhdm9pZCBjcmVhdGluZyBhbiBpbmRpcmVjdAovLy8gYWNjZXNzIHRvICd0aGlzJy4KYWJzdHJhY3QgY2xhc3MgVGhpc0luZGV4ZWRBY2Nlc3NHZW5lcmF0b3IgaW1wbGVtZW50cyBHZW5lcmF0b3IgewogIGZhY3RvcnkgVGhpc0luZGV4ZWRBY2Nlc3NHZW5lcmF0b3IoRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsCiAgICAgIFRva2VuIHRva2VuLCBFeHByZXNzaW9uIGluZGV4LCBQcm9jZWR1cmUgZ2V0dGVyLCBQcm9jZWR1cmUgc2V0dGVyKSB7CiAgICByZXR1cm4gaGVscGVyLmZvcmVzdAogICAgICAgIC50aGlzSW5kZXhlZEFjY2Vzc0dlbmVyYXRvcihoZWxwZXIsIHRva2VuLCBpbmRleCwgZ2V0dGVyLCBzZXR0ZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBwbGFpbk5hbWVGb3JSZWFkID0+ICJbXSI7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgcGxhaW5OYW1lRm9yV3JpdGUgPT4gIltdPSI7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZGVidWdOYW1lID0+ICJUaGlzSW5kZXhlZEFjY2Vzc0dlbmVyYXRvciI7Cn0KCmFic3RyYWN0IGNsYXNzIFN1cGVySW5kZXhlZEFjY2Vzc0dlbmVyYXRvciBpbXBsZW1lbnRzIEdlbmVyYXRvciB7CiAgZmFjdG9yeSBTdXBlckluZGV4ZWRBY2Nlc3NHZW5lcmF0b3IoRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsCiAgICAgIFRva2VuIHRva2VuLCBFeHByZXNzaW9uIGluZGV4LCBNZW1iZXIgZ2V0dGVyLCBNZW1iZXIgc2V0dGVyKSB7CiAgICByZXR1cm4gaGVscGVyLmZvcmVzdAogICAgICAgIC5zdXBlckluZGV4ZWRBY2Nlc3NHZW5lcmF0b3IoaGVscGVyLCB0b2tlbiwgaW5kZXgsIGdldHRlciwgc2V0dGVyKTsKICB9CgogIFN0cmluZyBnZXQgcGxhaW5OYW1lRm9yUmVhZCA9PiAiW10iOwoKICBTdHJpbmcgZ2V0IHBsYWluTmFtZUZvcldyaXRlID0+ICJbXT0iOwoKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiU3VwZXJJbmRleGVkQWNjZXNzR2VuZXJhdG9yIjsKfQoKYWJzdHJhY3QgY2xhc3MgU3RhdGljQWNjZXNzR2VuZXJhdG9yIGltcGxlbWVudHMgR2VuZXJhdG9yIHsKICBmYWN0b3J5IFN0YXRpY0FjY2Vzc0dlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sCiAgICAgIE1lbWJlciByZWFkVGFyZ2V0LCBNZW1iZXIgd3JpdGVUYXJnZXQpIHsKICAgIHJldHVybiBoZWxwZXIuZm9yZXN0CiAgICAgICAgLnN0YXRpY0FjY2Vzc0dlbmVyYXRvcihoZWxwZXIsIHRva2VuLCByZWFkVGFyZ2V0LCB3cml0ZVRhcmdldCk7CiAgfQoKICBmYWN0b3J5IFN0YXRpY0FjY2Vzc0dlbmVyYXRvci5mcm9tQnVpbGRlcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFRva2VuIHRva2VuLCBEZWNsYXJhdGlvbiBidWlsZGVyU2V0dGVyKSB7CiAgICBpZiAoZGVjbGFyYXRpb24gaXMgQWNjZXNzRXJyb3JCdWlsZGVyKSB7CiAgICAgIEFjY2Vzc0Vycm9yQnVpbGRlciBlcnJvciA9IGRlY2xhcmF0aW9uOwogICAgICBkZWNsYXJhdGlvbiA9IGVycm9yLmJ1aWxkZXI7CiAgICAgIC8vIFdlIHNob3VsZCBvbmx5IHNlZSBhbiBhY2Nlc3MgZXJyb3IgaGVyZSBpZiB3ZSd2ZSBsb29rZWQgdXAgYSBzZXR0ZXIKICAgICAgLy8gd2hlbiBub3QgZXhwbGljaXRseSBsb29raW5nIGZvciBhIHNldHRlci4KICAgICAgYXNzZXJ0KGRlY2xhcmF0aW9uLmlzU2V0dGVyKTsKICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24udGFyZ2V0ID09IG51bGwpIHsKICAgICAgcmV0dXJuIHVuaGFuZGxlZCgKICAgICAgICAgICIke2RlY2xhcmF0aW9uLnJ1bnRpbWVUeXBlfSIsCiAgICAgICAgICAiU3RhdGljQWNjZXNzR2VuZXJhdG9yLmZyb21CdWlsZGVyIiwKICAgICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSwKICAgICAgICAgIGhlbHBlci51cmkpOwogICAgfQogICAgTWVtYmVyIGdldHRlciA9IGRlY2xhcmF0aW9uLnRhcmdldC5oYXNHZXR0ZXIgPyBkZWNsYXJhdGlvbi50YXJnZXQgOiBudWxsOwogICAgTWVtYmVyIHNldHRlciA9IGRlY2xhcmF0aW9uLnRhcmdldC5oYXNTZXR0ZXIgPyBkZWNsYXJhdGlvbi50YXJnZXQgOiBudWxsOwogICAgaWYgKHNldHRlciA9PSBudWxsKSB7CiAgICAgIGlmIChidWlsZGVyU2V0dGVyPy50YXJnZXQ/Lmhhc1NldHRlciA/PyBmYWxzZSkgewogICAgICAgIHNldHRlciA9IGJ1aWxkZXJTZXR0ZXIudGFyZ2V0OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IFN0YXRpY0FjY2Vzc0dlbmVyYXRvcihoZWxwZXIsIHRva2VuLCBnZXR0ZXIsIHNldHRlcik7CiAgfQoKICBNZW1iZXIgZ2V0IHJlYWRUYXJnZXQ7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZGVidWdOYW1lID0+ICJTdGF0aWNBY2Nlc3NHZW5lcmF0b3IiOwp9CgphYnN0cmFjdCBjbGFzcyBMb2FkTGlicmFyeUdlbmVyYXRvciBpbXBsZW1lbnRzIEdlbmVyYXRvciB7CiAgZmFjdG9yeSBMb2FkTGlicmFyeUdlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sCiAgICAgIExvYWRMaWJyYXJ5QnVpbGRlciBidWlsZGVyKSB7CiAgICByZXR1cm4gaGVscGVyLmZvcmVzdC5sb2FkTGlicmFyeUdlbmVyYXRvcihoZWxwZXIsIHRva2VuLCBidWlsZGVyKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgcGxhaW5OYW1lRm9yUmVhZCA9PiAnbG9hZExpYnJhcnknOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiTG9hZExpYnJhcnlHZW5lcmF0b3IiOwp9CgphYnN0cmFjdCBjbGFzcyBEZWZlcnJlZEFjY2Vzc0dlbmVyYXRvciBpbXBsZW1lbnRzIEdlbmVyYXRvciB7CiAgZmFjdG9yeSBEZWZlcnJlZEFjY2Vzc0dlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sCiAgICAgIFByZWZpeFVzZUdlbmVyYXRvciBwcmVmaXhHZW5lcmF0b3IsIEdlbmVyYXRvciBzdWZmaXhHZW5lcmF0b3IpIHsKICAgIHJldHVybiBoZWxwZXIuZm9yZXN0LmRlZmVycmVkQWNjZXNzR2VuZXJhdG9yKAogICAgICAgIGhlbHBlciwgdG9rZW4sIHByZWZpeEdlbmVyYXRvciwgc3VmZml4R2VuZXJhdG9yKTsKICB9CgogIFByZWZpeFVzZUdlbmVyYXRvciBnZXQgcHJlZml4R2VuZXJhdG9yOwoKICBHZW5lcmF0b3IgZ2V0IHN1ZmZpeEdlbmVyYXRvcjsKCiAgQG92ZXJyaWRlCiAgYnVpbGRQcm9wZXJ0eUFjY2VzcygKICAgICAgSW5jb21wbGV0ZVNlbmRHZW5lcmF0b3Igc2VuZCwgaW50IG9wZXJhdG9yT2Zmc2V0LCBib29sIGlzTnVsbEF3YXJlKSB7CiAgICBPYmplY3QgcHJvcGVydHlBY2Nlc3MgPQogICAgICAgIHN1ZmZpeEdlbmVyYXRvci5idWlsZFByb3BlcnR5QWNjZXNzKHNlbmQsIG9wZXJhdG9yT2Zmc2V0LCBpc051bGxBd2FyZSk7CiAgICBpZiAocHJvcGVydHlBY2Nlc3MgaXMgR2VuZXJhdG9yKSB7CiAgICAgIHJldHVybiBuZXcgRGVmZXJyZWRBY2Nlc3NHZW5lcmF0b3IoCiAgICAgICAgICBoZWxwZXIsIHRva2VuLCBwcmVmaXhHZW5lcmF0b3IsIHByb3BlcnR5QWNjZXNzKTsKICAgIH0gZWxzZSB7CiAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHByb3BlcnR5QWNjZXNzOwogICAgICByZXR1cm4gaGVscGVyLndyYXBJbkRlZmVycmVkQ2hlY2soCiAgICAgICAgICBleHByZXNzaW9uLCBwcmVmaXhHZW5lcmF0b3IucHJlZml4LCB0b2tlbi5jaGFyT2Zmc2V0KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgcGxhaW5OYW1lRm9yUmVhZCB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoCiAgICAgICAgImRlZmVycmVkQWNjZXNzb3IucGxhaW5OYW1lRm9yUmVhZCIsIG9mZnNldEZvclRva2VuKHRva2VuKSwgdXJpKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZGVidWdOYW1lID0+ICJEZWZlcnJlZEFjY2Vzc0dlbmVyYXRvciI7CgogIEBvdmVycmlkZQogIEtlcm5lbFR5cGVCdWlsZGVyIGJ1aWxkVHlwZVdpdGhSZXNvbHZlZEFyZ3VtZW50cygKICAgICAgTGlzdDxVbnJlc29sdmVkVHlwZTxLZXJuZWxUeXBlQnVpbGRlcj4+IGFyZ3VtZW50cykgewogICAgU3RyaW5nIG5hbWUgPQogICAgICAgICIke3ByZWZpeEdlbmVyYXRvci5wbGFpbk5hbWVGb3JSZWFkfS4ke3N1ZmZpeEdlbmVyYXRvci5wbGFpbk5hbWVGb3JSZWFkfSI7CiAgICBLZXJuZWxUeXBlQnVpbGRlciB0eXBlID0KICAgICAgICBzdWZmaXhHZW5lcmF0b3IuYnVpbGRUeXBlV2l0aFJlc29sdmVkQXJndW1lbnRzKGFyZ3VtZW50cyk7CiAgICBMb2NhdGVkTWVzc2FnZSBtZXNzYWdlOwogICAgaWYgKHR5cGUgaXMgS2VybmVsTmFtZWRUeXBlQnVpbGRlciAmJgogICAgICAgIHR5cGUuZGVjbGFyYXRpb24gaXMgS2VybmVsSW52YWxpZFR5cGVCdWlsZGVyKSB7CiAgICAgIEtlcm5lbEludmFsaWRUeXBlQnVpbGRlciBkZWNsYXJhdGlvbiA9IHR5cGUuZGVjbGFyYXRpb247CiAgICAgIG1lc3NhZ2UgPSBkZWNsYXJhdGlvbi5tZXNzYWdlOwogICAgfSBlbHNlIHsKICAgICAgaW50IGNoYXJPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbihwcmVmaXhHZW5lcmF0b3IudG9rZW4pOwogICAgICBtZXNzYWdlID0gdGVtcGxhdGVEZWZlcnJlZFR5cGVBbm5vdGF0aW9uCiAgICAgICAgICAud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICBoZWxwZXIuYnVpbGREYXJ0VHlwZSgKICAgICAgICAgICAgICAgICAgbmV3IFVucmVzb2x2ZWRUeXBlPEtlcm5lbFR5cGVCdWlsZGVyPih0eXBlLCBjaGFyT2Zmc2V0LCB1cmkpKSwKICAgICAgICAgICAgICBwcmVmaXhHZW5lcmF0b3IucGxhaW5OYW1lRm9yUmVhZCkKICAgICAgICAgIC53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgdXJpLCBjaGFyT2Zmc2V0LCBsZW5ndGhPZlNwYW4ocHJlZml4R2VuZXJhdG9yLnRva2VuLCB0b2tlbikpOwogICAgfQogICAgS2VybmVsTmFtZWRUeXBlQnVpbGRlciByZXN1bHQgPSBuZXcgS2VybmVsTmFtZWRUeXBlQnVpbGRlcihuYW1lLCBudWxsKTsKICAgIHJlc3VsdC5iaW5kKHJlc3VsdC5idWlsZEludmFsaWRUeXBlKG1lc3NhZ2UpKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGRvSW52b2NhdGlvbihpbnQgb2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gaGVscGVyLndyYXBJbkRlZmVycmVkQ2hlY2soCiAgICAgICAgc3VmZml4R2VuZXJhdG9yLmRvSW52b2NhdGlvbihvZmZzZXQsIGFyZ3VtZW50cyksCiAgICAgICAgcHJlZml4R2VuZXJhdG9yLnByZWZpeCwKICAgICAgICB0b2tlbi5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gaW52b2tlQ29uc3RydWN0b3IoCiAgICAgIExpc3Q8VW5yZXNvbHZlZFR5cGU8S2VybmVsVHlwZUJ1aWxkZXI+PiB0eXBlQXJndW1lbnRzLAogICAgICBTdHJpbmcgbmFtZSwKICAgICAgQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAgVG9rZW4gbmFtZVRva2VuLAogICAgICBUb2tlbiBuYW1lTGFzdFRva2VuLAogICAgICBDb25zdG5lc3MgY29uc3RuZXNzKSB7CiAgICByZXR1cm4gaGVscGVyLndyYXBJbkRlZmVycmVkQ2hlY2soCiAgICAgICAgc3VmZml4R2VuZXJhdG9yLmludm9rZUNvbnN0cnVjdG9yKHR5cGVBcmd1bWVudHMsIG5hbWUsIGFyZ3VtZW50cywKICAgICAgICAgICAgbmFtZVRva2VuLCBuYW1lTGFzdFRva2VuLCBjb25zdG5lc3MpLAogICAgICAgIHByZWZpeEdlbmVyYXRvci5wcmVmaXgsCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4oc3VmZml4R2VuZXJhdG9yLnRva2VuKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlKCIsIHByZWZpeEdlbmVyYXRvcjogIik7CiAgICBzaW5rLndyaXRlKHByZWZpeEdlbmVyYXRvcik7CiAgICBzaW5rLndyaXRlKCIsIHN1ZmZpeEdlbmVyYXRvcjogIik7CiAgICBzaW5rLndyaXRlKHN1ZmZpeEdlbmVyYXRvcik7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBUeXBlVXNlR2VuZXJhdG9yIGltcGxlbWVudHMgR2VuZXJhdG9yIHsKICBmYWN0b3J5IFR5cGVVc2VHZW5lcmF0b3IoRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLAogICAgICBUeXBlRGVjbGFyYXRpb25CdWlsZGVyIGRlY2xhcmF0aW9uLCBTdHJpbmcgcGxhaW5OYW1lRm9yUmVhZCkgewogICAgcmV0dXJuIGhlbHBlci5mb3Jlc3QKICAgICAgICAudHlwZVVzZUdlbmVyYXRvcihoZWxwZXIsIHRva2VuLCBkZWNsYXJhdGlvbiwgcGxhaW5OYW1lRm9yUmVhZCk7CiAgfQoKICBUeXBlRGVjbGFyYXRpb25CdWlsZGVyIGdldCBkZWNsYXJhdGlvbjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIlR5cGVVc2VHZW5lcmF0b3IiOwoKICBAb3ZlcnJpZGUKICBLZXJuZWxUeXBlQnVpbGRlciBidWlsZFR5cGVXaXRoUmVzb2x2ZWRBcmd1bWVudHMoCiAgICAgIExpc3Q8VW5yZXNvbHZlZFR5cGU8S2VybmVsVHlwZUJ1aWxkZXI+PiBhcmd1bWVudHMpIHsKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBpbnQgZXhwZWN0ZWQgPSBkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzQ291bnQ7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICE9IGV4cGVjdGVkKSB7CiAgICAgICAgLy8gQnVpbGQgdGhlIHR5cGUgYXJndW1lbnRzIHRvIHJlcG9ydCBhbnkgZXJyb3JzIHRoZXkgbWF5IGhhdmUuCiAgICAgICAgaGVscGVyLmJ1aWxkRGFydFR5cGVBcmd1bWVudHMoYXJndW1lbnRzKTsKICAgICAgICBoZWxwZXIud2FyblR5cGVBcmd1bWVudHNNaXNtYXRjaCgKICAgICAgICAgICAgZGVjbGFyYXRpb24ubmFtZSwgZXhwZWN0ZWQsIG9mZnNldEZvclRva2VuKHRva2VuKSk7CiAgICAgICAgLy8gV2UgaWdub3JlIHRoZSBwcm92aWRlZCBhcmd1bWVudHMsIHdoaWNoIHdpbGwgaW4gdHVybiByZXR1cm4gdGhlCiAgICAgICAgLy8gcmF3IHR5cGUgYmVsb3cuCiAgICAgICAgLy8gVE9ETyhzaWdtdW5kKTogY2hhbmdlIHRvIHVzZSBhbiBJbnZhbGlkVHlwZSBhbmQgaW5jbHVkZSB0aGUgcmF3IHR5cGUKICAgICAgICAvLyBhcyBhIHJlY292ZXJ5IG5vZGUgb25jZSB0aGUgSVIgY2FuIHJlcHJlc2VudCBpdCAoSXNzdWUgIzI5ODQwKS4KICAgICAgICBhcmd1bWVudHMgPSBudWxsOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXNDb3VudCAhPSAwKSB7CiAgICAgIGhlbHBlci5hZGRQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVNaXNzaW5nRXhwbGljaXRUeXBlQXJndW1lbnRzCiAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlc0NvdW50KSwKICAgICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSwKICAgICAgICAgIGxlbmd0aEZvclRva2VuKHRva2VuKSk7CiAgICB9CgogICAgTGlzdDxLZXJuZWxUeXBlQnVpbGRlcj4gYXJndW1lbnRCdWlsZGVyczsKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBhcmd1bWVudEJ1aWxkZXJzID0gbmV3IExpc3Q8S2VybmVsVHlwZUJ1aWxkZXI+KGFyZ3VtZW50cy5sZW5ndGgpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50QnVpbGRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBhcmd1bWVudEJ1aWxkZXJzW2ldID0KICAgICAgICAgICAgaGVscGVyLnZhbGlkYXRlVHlwZVVzZShhcmd1bWVudHNbaV0sIGZhbHNlKS5idWlsZGVyOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIocGxhaW5OYW1lRm9yUmVhZCwgYXJndW1lbnRCdWlsZGVycykKICAgICAgLi5iaW5kKGRlY2xhcmF0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gaW52b2tlQ29uc3RydWN0b3IoCiAgICAgIExpc3Q8VW5yZXNvbHZlZFR5cGU8S2VybmVsVHlwZUJ1aWxkZXI+PiB0eXBlQXJndW1lbnRzLAogICAgICBTdHJpbmcgbmFtZSwKICAgICAgQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAgVG9rZW4gbmFtZVRva2VuLAogICAgICBUb2tlbiBuYW1lTGFzdFRva2VuLAogICAgICBDb25zdG5lc3MgY29uc3RuZXNzKSB7CiAgICByZXR1cm4gaGVscGVyLmJ1aWxkQ29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgICAgIGRlY2xhcmF0aW9uLAogICAgICAgIG5hbWVUb2tlbiwKICAgICAgICBuYW1lTGFzdFRva2VuLAogICAgICAgIGFyZ3VtZW50cywKICAgICAgICBuYW1lLAogICAgICAgIHR5cGVBcmd1bWVudHMsCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4obmFtZVRva2VuID8/IHRva2VuKSwKICAgICAgICBjb25zdG5lc3MpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgc2luay53cml0ZSgiLCBkZWNsYXJhdGlvbjogIik7CiAgICBzaW5rLndyaXRlKGRlY2xhcmF0aW9uKTsKICAgIHNpbmsud3JpdGUoIiwgcGxhaW5OYW1lRm9yUmVhZDogIik7CiAgICBzaW5rLndyaXRlKHBsYWluTmFtZUZvclJlYWQpOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgUmVhZE9ubHlBY2Nlc3NHZW5lcmF0b3IgaW1wbGVtZW50cyBHZW5lcmF0b3IgewogIGZhY3RvcnkgUmVhZE9ubHlBY2Nlc3NHZW5lcmF0b3IoRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLAogICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBwbGFpbk5hbWVGb3JSZWFkKSB7CiAgICByZXR1cm4gaGVscGVyLmZvcmVzdAogICAgICAgIC5yZWFkT25seUFjY2Vzc0dlbmVyYXRvcihoZWxwZXIsIHRva2VuLCBleHByZXNzaW9uLCBwbGFpbk5hbWVGb3JSZWFkKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZGVidWdOYW1lID0+ICJSZWFkT25seUFjY2Vzc0dlbmVyYXRvciI7Cn0KCmFic3RyYWN0IGNsYXNzIEVycm9uZW91c0V4cHJlc3Npb25HZW5lcmF0b3IgaW1wbGVtZW50cyBHZW5lcmF0b3IgewogIC8vLyBQYXNzIFthcmd1bWVudHNdIHRoYXQgbXVzdCBiZSBldmFsdWF0ZWQgYmVmb3JlIHRocm93aW5nIGFuIGVycm9yLiAgQXQKICAvLy8gbW9zdCBvbmUgb2YgW2lzR2V0dGVyXSBhbmQgW2lzU2V0dGVyXSBzaG91bGQgYmUgdHJ1ZSBhbmQgdGhleSdyZSBwYXNzZWQKICAvLy8gdG8gW0V4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIudGhyb3dOb1N1Y2hNZXRob2RFcnJvcl0gaWYgaXQgaXMgdXNlZC4KICBFeHByZXNzaW9uIGJ1aWxkRXJyb3IoQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAge2Jvb2wgaXNHZXR0ZXI6IGZhbHNlLCBib29sIGlzU2V0dGVyOiBmYWxzZSwgaW50IG9mZnNldH0pOwoKICBOYW1lIGdldCBuYW1lID0+IHVuc3VwcG9ydGVkKCJuYW1lIiwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCB1cmkpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IHBsYWluTmFtZUZvclJlYWQgPT4gbmFtZS5uYW1lOwoKICB3aXRoUmVjZWl2ZXIoT2JqZWN0IHJlY2VpdmVyLCBpbnQgb3BlcmF0b3JPZmZzZXQsIHtib29sIGlzTnVsbEF3YXJlfSkgPT4gdGhpczsKCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXIgYnVpbGRGaWVsZEluaXRpYWxpemVyKE1hcDxTdHJpbmcsIGludD4gaW5pdGlhbGl6ZWRGaWVsZHMpIHsKICAgIHJldHVybiBoZWxwZXIuYnVpbGRJbnZhbGlkSW5pdGlhbGl6ZXIoaGVscGVyLmRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKAogICAgICAgIGJ1aWxkRXJyb3IoZm9yZXN0LmFyZ3VtZW50c0VtcHR5KHRva2VuKSwgaXNTZXR0ZXI6IHRydWUpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBkb0ludm9jYXRpb24oaW50IG9mZnNldCwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIGJ1aWxkRXJyb3IoYXJndW1lbnRzLCBvZmZzZXQ6IG9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBidWlsZFByb3BlcnR5QWNjZXNzKAogICAgICBJbmNvbXBsZXRlU2VuZEdlbmVyYXRvciBzZW5kLCBpbnQgb3BlcmF0b3JPZmZzZXQsIGJvb2wgaXNOdWxsQXdhcmUpIHsKICAgIHJldHVybiBzZW5kLndpdGhSZWNlaXZlcihidWlsZFNpbXBsZVJlYWQoKSwgb3BlcmF0b3JPZmZzZXQsCiAgICAgICAgaXNOdWxsQXdhcmU6IGlzTnVsbEF3YXJlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBidWlsZEVycm9yKGZvcmVzdC5hcmd1bWVudHMoPEV4cHJlc3Npb24+W3ZhbHVlXSwgdG9rZW4pLAogICAgICAgIGlzU2V0dGVyOiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwgRXhwcmVzc2lvbiB2YWx1ZSwKICAgICAge2ludCBvZmZzZXQ6IC0xLAogICAgICBib29sIHZvaWRDb250ZXh0OiBmYWxzZSwKICAgICAgUHJvY2VkdXJlIGludGVyZmFjZVRhcmdldCwKICAgICAgYm9vbCBpc1ByZUluY0RlYzogZmFsc2UsCiAgICAgIGJvb2wgaXNQb3N0SW5jRGVjOiBmYWxzZX0pIHsKICAgIHJldHVybiBidWlsZEVycm9yKGZvcmVzdC5hcmd1bWVudHMoPEV4cHJlc3Npb24+W3ZhbHVlXSwgdG9rZW4pLAogICAgICAgIGlzR2V0dGVyOiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRQcmVmaXhJbmNyZW1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwKICAgICAge2ludCBvZmZzZXQ6IC0xLCBib29sIHZvaWRDb250ZXh0OiBmYWxzZSwgUHJvY2VkdXJlIGludGVyZmFjZVRhcmdldH0pIHsKICAgIHJldHVybiBidWlsZEVycm9yKAogICAgICAgIGZvcmVzdC5hcmd1bWVudHMoCiAgICAgICAgICAgIDxFeHByZXNzaW9uPltmb3Jlc3QubGl0ZXJhbEludCgxLCBudWxsKS4uZmlsZU9mZnNldCA9IG9mZnNldF0sCiAgICAgICAgICAgIHRva2VuKSwKICAgICAgICBpc0dldHRlcjogdHJ1ZSkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZFBvc3RmaXhJbmNyZW1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwKICAgICAge2ludCBvZmZzZXQ6IC0xLCBib29sIHZvaWRDb250ZXh0OiBmYWxzZSwgUHJvY2VkdXJlIGludGVyZmFjZVRhcmdldH0pIHsKICAgIHJldHVybiBidWlsZEVycm9yKAogICAgICAgIGZvcmVzdC5hcmd1bWVudHMoCiAgICAgICAgICAgIDxFeHByZXNzaW9uPltmb3Jlc3QubGl0ZXJhbEludCgxLCBudWxsKS4uZmlsZU9mZnNldCA9IG9mZnNldF0sCiAgICAgICAgICAgIHRva2VuKSwKICAgICAgICBpc0dldHRlcjogdHJ1ZSkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZE51bGxBd2FyZUFzc2lnbm1lbnQoCiAgICAgIEV4cHJlc3Npb24gdmFsdWUsIERhcnRUeXBlIHR5cGUsIGludCBvZmZzZXQsCiAgICAgIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBidWlsZEVycm9yKGZvcmVzdC5hcmd1bWVudHMoPEV4cHJlc3Npb24+W3ZhbHVlXSwgdG9rZW4pLAogICAgICAgIGlzU2V0dGVyOiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRTaW1wbGVSZWFkKCkgewogICAgcmV0dXJuIGJ1aWxkRXJyb3IoZm9yZXN0LmFyZ3VtZW50c0VtcHR5KHRva2VuKSwgaXNHZXR0ZXI6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBtYWtlSW52YWxpZFJlYWQoKSB7CiAgICByZXR1cm4gYnVpbGRFcnJvcihmb3Jlc3QuYXJndW1lbnRzRW1wdHkodG9rZW4pLCBpc0dldHRlcjogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIG1ha2VJbnZhbGlkV3JpdGUoRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgcmV0dXJuIGJ1aWxkRXJyb3IoZm9yZXN0LmFyZ3VtZW50cyg8RXhwcmVzc2lvbj5bdmFsdWVdLCB0b2tlbiksCiAgICAgICAgaXNTZXR0ZXI6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBpbnZva2VDb25zdHJ1Y3RvcigKICAgICAgTGlzdDxVbnJlc29sdmVkVHlwZTxLZXJuZWxUeXBlQnVpbGRlcj4+IHR5cGVBcmd1bWVudHMsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICBUb2tlbiBuYW1lVG9rZW4sCiAgICAgIFRva2VuIG5hbWVMYXN0VG9rZW4sCiAgICAgIENvbnN0bmVzcyBjb25zdG5lc3MpIHsKICAgIGlmICh0eXBlQXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgYXNzZXJ0KGZvcmVzdC5hcmd1bWVudHNUeXBlQXJndW1lbnRzKGFyZ3VtZW50cykuaXNFbXB0eSk7CiAgICAgIGZvcmVzdC5hcmd1bWVudHNTZXRUeXBlQXJndW1lbnRzKAogICAgICAgICAgYXJndW1lbnRzLCBoZWxwZXIuYnVpbGREYXJ0VHlwZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRzKSk7CiAgICB9CiAgICByZXR1cm4gaGVscGVyLndyYXBJbnZhbGlkQ29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgICAgIGhlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihidWlsZEVycm9yKGFyZ3VtZW50cykpLAogICAgICAgIG51bGwsCiAgICAgICAgYXJndW1lbnRzLAogICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBVbnJlc29sdmVkTmFtZUdlbmVyYXRvciBpbXBsZW1lbnRzIEVycm9uZW91c0V4cHJlc3Npb25HZW5lcmF0b3IgewogIGZhY3RvcnkgVW5yZXNvbHZlZE5hbWVHZW5lcmF0b3IoCiAgICAgIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLCBUb2tlbiB0b2tlbiwgTmFtZSBuYW1lKSB7CiAgICBpZiAobmFtZS5uYW1lLmlzRW1wdHkpIHsKICAgICAgdW5oYW5kbGVkKCJlbXB0eSIsICJuYW1lIiwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBoZWxwZXIudXJpKTsKICAgIH0KICAgIHJldHVybiBoZWxwZXIuZm9yZXN0LnVucmVzb2x2ZWROYW1lR2VuZXJhdG9yKGhlbHBlciwgdG9rZW4sIG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIlVucmVzb2x2ZWROYW1lR2VuZXJhdG9yIjsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBkb0ludm9jYXRpb24oaW50IGNoYXJPZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBoZWxwZXIud3JhcFVucmVzb2x2ZWRUYXJnZXRJbnZvY2F0aW9uKAogICAgICAgIGhlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbigKICAgICAgICAgICAgYnVpbGRFcnJvcihhcmd1bWVudHMsIG9mZnNldDogY2hhck9mZnNldCkpLAogICAgICAgIGFyZ3VtZW50cywKICAgICAgICBhcmd1bWVudHMuZmlsZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkRXJyb3IoQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAge2Jvb2wgaXNHZXR0ZXI6IGZhbHNlLCBib29sIGlzU2V0dGVyOiBmYWxzZSwgaW50IG9mZnNldH0pIHsKICAgIG9mZnNldCA/Pz0gb2Zmc2V0Rm9yVG9rZW4odGhpcy50b2tlbik7CiAgICByZXR1cm4gaGVscGVyLndyYXBTeW50aGV0aWNFeHByZXNzaW9uKAogICAgICAgIGhlbHBlci50aHJvd05vU3VjaE1ldGhvZEVycm9yKAogICAgICAgICAgICBmb3Jlc3QubGl0ZXJhbE51bGwobnVsbCkuLmZpbGVPZmZzZXQgPSBvZmZzZXQsCiAgICAgICAgICAgIHBsYWluTmFtZUZvclJlYWQsCiAgICAgICAgICAgIGFyZ3VtZW50cywKICAgICAgICAgICAgb2Zmc2V0LAogICAgICAgICAgICBpc0dldHRlcjogaXNHZXR0ZXIsCiAgICAgICAgICAgIGlzU2V0dGVyOiBpc1NldHRlciksCiAgICAgICAgb2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIC8qIEV4cHJlc3Npb24gfCBHZW5lcmF0b3IgKi8gT2JqZWN0IHF1YWxpZmllZExvb2t1cChUb2tlbiBuYW1lKSB7CiAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRRdWFsaWZpZWRVc2VHZW5lcmF0b3IoaGVscGVyLCBuYW1lLCB0aGlzLCB0cnVlKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIFVubGlua2VkR2VuZXJhdG9yIGltcGxlbWVudHMgR2VuZXJhdG9yIHsKICBmYWN0b3J5IFVubGlua2VkR2VuZXJhdG9yKEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLCBUb2tlbiB0b2tlbiwKICAgICAgVW5saW5rZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewogICAgcmV0dXJuIGhlbHBlci5mb3Jlc3QudW5saW5rZWRHZW5lcmF0b3IoaGVscGVyLCB0b2tlbiwgZGVjbGFyYXRpb24pOwogIH0KCiAgVW5saW5rZWREZWNsYXJhdGlvbiBnZXQgZGVjbGFyYXRpb247CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgcGxhaW5OYW1lRm9yUmVhZCA9PiBkZWNsYXJhdGlvbi5uYW1lOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiVW5saW5rZWRHZW5lcmF0b3IiOwoKICBAb3ZlcnJpZGUKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlKCIsIG5hbWU6ICIpOwogICAgc2luay53cml0ZShkZWNsYXJhdGlvbi5uYW1lKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIENvbnRleHRBd2FyZUdlbmVyYXRvciBpbXBsZW1lbnRzIEdlbmVyYXRvciB7CiAgR2VuZXJhdG9yIGdldCBnZW5lcmF0b3I7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgcGxhaW5OYW1lRm9yUmVhZCB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoInBsYWluTmFtZUZvclJlYWQiLCB0b2tlbi5jaGFyT2Zmc2V0LCBoZWxwZXIudXJpKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZG9JbnZvY2F0aW9uKGludCBjaGFyT2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gdW5oYW5kbGVkKCIke3J1bnRpbWVUeXBlfSIsICJkb0ludm9jYXRpb24iLCBjaGFyT2Zmc2V0LCB1cmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZEFzc2lnbm1lbnQoRXhwcmVzc2lvbiB2YWx1ZSwge2Jvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgcmV0dXJuIG1ha2VJbnZhbGlkV3JpdGUodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZE51bGxBd2FyZUFzc2lnbm1lbnQoCiAgICAgIEV4cHJlc3Npb24gdmFsdWUsIERhcnRUeXBlIHR5cGUsIGludCBvZmZzZXQsCiAgICAgIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBtYWtlSW52YWxpZFdyaXRlKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwgRXhwcmVzc2lvbiB2YWx1ZSwKICAgICAge2ludCBvZmZzZXQ6IC0xLAogICAgICBib29sIHZvaWRDb250ZXh0OiBmYWxzZSwKICAgICAgUHJvY2VkdXJlIGludGVyZmFjZVRhcmdldCwKICAgICAgYm9vbCBpc1ByZUluY0RlYzogZmFsc2UsCiAgICAgIGJvb2wgaXNQb3N0SW5jRGVjOiBmYWxzZX0pIHsKICAgIHJldHVybiBtYWtlSW52YWxpZFdyaXRlKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRQcmVmaXhJbmNyZW1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwKICAgICAge2ludCBvZmZzZXQ6IC0xLCBib29sIHZvaWRDb250ZXh0OiBmYWxzZSwgUHJvY2VkdXJlIGludGVyZmFjZVRhcmdldH0pIHsKICAgIHJldHVybiBtYWtlSW52YWxpZFdyaXRlKG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZFBvc3RmaXhJbmNyZW1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwKICAgICAge2ludCBvZmZzZXQ6IC0xLCBib29sIHZvaWRDb250ZXh0OiBmYWxzZSwgUHJvY2VkdXJlIGludGVyZmFjZVRhcmdldH0pIHsKICAgIHJldHVybiBtYWtlSW52YWxpZFdyaXRlKG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgbWFrZUludmFsaWRSZWFkKCkgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCJtYWtlSW52YWxpZFJlYWQiLCB0b2tlbi5jaGFyT2Zmc2V0LCBoZWxwZXIudXJpKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gbWFrZUludmFsaWRXcml0ZShFeHByZXNzaW9uIHZhbHVlKSB7CiAgICByZXR1cm4gaGVscGVyLmJ1aWxkUHJvYmxlbShtZXNzYWdlSWxsZWdhbEFzc2lnbm1lbnRUb05vbkFzc2lnbmFibGUsCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBsZW5ndGhGb3JUb2tlbih0b2tlbikpOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgRGVsYXllZEFzc2lnbm1lbnQgaW1wbGVtZW50cyBDb250ZXh0QXdhcmVHZW5lcmF0b3IgewogIGZhY3RvcnkgRGVsYXllZEFzc2lnbm1lbnQoRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLAogICAgICBHZW5lcmF0b3IgZ2VuZXJhdG9yLCBFeHByZXNzaW9uIHZhbHVlLCBTdHJpbmcgYXNzaWdubWVudE9wZXJhdG9yKSB7CiAgICByZXR1cm4gaGVscGVyLmZvcmVzdAogICAgICAgIC5kZWxheWVkQXNzaWdubWVudChoZWxwZXIsIHRva2VuLCBnZW5lcmF0b3IsIHZhbHVlLCBhc3NpZ25tZW50T3BlcmF0b3IpOwogIH0KCiAgRXhwcmVzc2lvbiBnZXQgdmFsdWU7CgogIFN0cmluZyBnZXQgYXNzaWdubWVudE9wZXJhdG9yOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiRGVsYXllZEFzc2lnbm1lbnQiOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkU2ltcGxlUmVhZCgpIHsKICAgIHJldHVybiBoYW5kbGVBc3NpZ25tZW50KGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRGb3JFZmZlY3QoKSB7CiAgICByZXR1cm4gaGFuZGxlQXNzaWdubWVudCh0cnVlKTsKICB9CgogIEV4cHJlc3Npb24gaGFuZGxlQXNzaWdubWVudChib29sIHZvaWRDb250ZXh0KSB7CiAgICBpZiAoaGVscGVyLmNvbnN0YW50Q29udGV4dCAhPSBDb25zdGFudENvbnRleHQubm9uZSkgewogICAgICByZXR1cm4gaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgICAgICAgIG1lc3NhZ2VOb3RBQ29uc3RhbnRFeHByZXNzaW9uLCBvZmZzZXRGb3JUb2tlbih0b2tlbiksIHRva2VuLmxlbmd0aCk7CiAgICB9CiAgICBpZiAoaWRlbnRpY2FsKCI9IiwgYXNzaWdubWVudE9wZXJhdG9yKSkgewogICAgICByZXR1cm4gZ2VuZXJhdG9yLmJ1aWxkQXNzaWdubWVudCh2YWx1ZSwgdm9pZENvbnRleHQ6IHZvaWRDb250ZXh0KTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCIrPSIsIGFzc2lnbm1lbnRPcGVyYXRvcikpIHsKICAgICAgcmV0dXJuIGdlbmVyYXRvci5idWlsZENvbXBvdW5kQXNzaWdubWVudChwbHVzTmFtZSwgdmFsdWUsCiAgICAgICAgICBvZmZzZXQ6IG9mZnNldEZvclRva2VuKHRva2VuKSwgdm9pZENvbnRleHQ6IHZvaWRDb250ZXh0KTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCItPSIsIGFzc2lnbm1lbnRPcGVyYXRvcikpIHsKICAgICAgcmV0dXJuIGdlbmVyYXRvci5idWlsZENvbXBvdW5kQXNzaWdubWVudChtaW51c05hbWUsIHZhbHVlLAogICAgICAgICAgb2Zmc2V0OiBvZmZzZXRGb3JUb2tlbih0b2tlbiksIHZvaWRDb250ZXh0OiB2b2lkQ29udGV4dCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgiKj0iLCBhc3NpZ25tZW50T3BlcmF0b3IpKSB7CiAgICAgIHJldHVybiBnZW5lcmF0b3IuYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQobXVsdGlwbHlOYW1lLCB2YWx1ZSwKICAgICAgICAgIG9mZnNldDogb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCB2b2lkQ29udGV4dDogdm9pZENvbnRleHQpOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwoIiU9IiwgYXNzaWdubWVudE9wZXJhdG9yKSkgewogICAgICByZXR1cm4gZ2VuZXJhdG9yLmJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KHBlcmNlbnROYW1lLCB2YWx1ZSwKICAgICAgICAgIG9mZnNldDogb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCB2b2lkQ29udGV4dDogdm9pZENvbnRleHQpOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwoIiY9IiwgYXNzaWdubWVudE9wZXJhdG9yKSkgewogICAgICByZXR1cm4gZ2VuZXJhdG9yLmJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KGFtcGVyc2FuZE5hbWUsIHZhbHVlLAogICAgICAgICAgb2Zmc2V0OiBvZmZzZXRGb3JUb2tlbih0b2tlbiksIHZvaWRDb250ZXh0OiB2b2lkQ29udGV4dCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgiLz0iLCBhc3NpZ25tZW50T3BlcmF0b3IpKSB7CiAgICAgIHJldHVybiBnZW5lcmF0b3IuYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoZGl2aXNpb25OYW1lLCB2YWx1ZSwKICAgICAgICAgIG9mZnNldDogb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCB2b2lkQ29udGV4dDogdm9pZENvbnRleHQpOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwoIjw8PSIsIGFzc2lnbm1lbnRPcGVyYXRvcikpIHsKICAgICAgcmV0dXJuIGdlbmVyYXRvci5idWlsZENvbXBvdW5kQXNzaWdubWVudChsZWZ0U2hpZnROYW1lLCB2YWx1ZSwKICAgICAgICAgIG9mZnNldDogb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCB2b2lkQ29udGV4dDogdm9pZENvbnRleHQpOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwoIj4+PSIsIGFzc2lnbm1lbnRPcGVyYXRvcikpIHsKICAgICAgcmV0dXJuIGdlbmVyYXRvci5idWlsZENvbXBvdW5kQXNzaWdubWVudChyaWdodFNoaWZ0TmFtZSwgdmFsdWUsCiAgICAgICAgICBvZmZzZXQ6IG9mZnNldEZvclRva2VuKHRva2VuKSwgdm9pZENvbnRleHQ6IHZvaWRDb250ZXh0KTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCI+Pj49IiwgYXNzaWdubWVudE9wZXJhdG9yKSkgewogICAgICByZXR1cm4gZ2VuZXJhdG9yLmJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KHRyaXBsZVNoaWZ0TmFtZSwgdmFsdWUsCiAgICAgICAgICBvZmZzZXQ6IG9mZnNldEZvclRva2VuKHRva2VuKSwgdm9pZENvbnRleHQ6IHZvaWRDb250ZXh0KTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCI/Pz0iLCBhc3NpZ25tZW50T3BlcmF0b3IpKSB7CiAgICAgIHJldHVybiBnZW5lcmF0b3IuYnVpbGROdWxsQXdhcmVBc3NpZ25tZW50KAogICAgICAgICAgdmFsdWUsIGNvbnN0IER5bmFtaWNUeXBlKCksIG9mZnNldEZvclRva2VuKHRva2VuKSwKICAgICAgICAgIHZvaWRDb250ZXh0OiB2b2lkQ29udGV4dCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgiXj0iLCBhc3NpZ25tZW50T3BlcmF0b3IpKSB7CiAgICAgIHJldHVybiBnZW5lcmF0b3IuYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoY2FyZXROYW1lLCB2YWx1ZSwKICAgICAgICAgIG9mZnNldDogb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCB2b2lkQ29udGV4dDogdm9pZENvbnRleHQpOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwoInw9IiwgYXNzaWdubWVudE9wZXJhdG9yKSkgewogICAgICByZXR1cm4gZ2VuZXJhdG9yLmJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KGJhck5hbWUsIHZhbHVlLAogICAgICAgICAgb2Zmc2V0OiBvZmZzZXRGb3JUb2tlbih0b2tlbiksIHZvaWRDb250ZXh0OiB2b2lkQ29udGV4dCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgifi89IiwgYXNzaWdubWVudE9wZXJhdG9yKSkgewogICAgICByZXR1cm4gZ2VuZXJhdG9yLmJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KG11c3RhY2hlTmFtZSwgdmFsdWUsCiAgICAgICAgICBvZmZzZXQ6IG9mZnNldEZvclRva2VuKHRva2VuKSwgdm9pZENvbnRleHQ6IHZvaWRDb250ZXh0KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB1bmhhbmRsZWQoCiAgICAgICAgICBhc3NpZ25tZW50T3BlcmF0b3IsICJoYW5kbGVBc3NpZ25tZW50IiwgdG9rZW4uY2hhck9mZnNldCwgaGVscGVyLnVyaSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplciBidWlsZEZpZWxkSW5pdGlhbGl6ZXIoTWFwPFN0cmluZywgaW50PiBpbml0aWFsaXplZEZpZWxkcykgewogICAgaWYgKCFpZGVudGljYWwoIj0iLCBhc3NpZ25tZW50T3BlcmF0b3IpIHx8CiAgICAgICAgIWdlbmVyYXRvci5pc1RoaXNQcm9wZXJ0eUFjY2VzcykgewogICAgICByZXR1cm4gZ2VuZXJhdG9yLmJ1aWxkRmllbGRJbml0aWFsaXplcihpbml0aWFsaXplZEZpZWxkcyk7CiAgICB9CiAgICByZXR1cm4gaGVscGVyLmJ1aWxkRmllbGRJbml0aWFsaXplcihmYWxzZSwgZ2VuZXJhdG9yLnBsYWluTmFtZUZvclJlYWQsCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4oZ2VuZXJhdG9yLnRva2VuKSwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCB2YWx1ZSk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBEZWxheWVkUG9zdGZpeEluY3JlbWVudCBpbXBsZW1lbnRzIENvbnRleHRBd2FyZUdlbmVyYXRvciB7CiAgZmFjdG9yeSBEZWxheWVkUG9zdGZpeEluY3JlbWVudChFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sCiAgICAgIEdlbmVyYXRvciBnZW5lcmF0b3IsIE5hbWUgYmluYXJ5T3BlcmF0b3IsIFByb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXQpIHsKICAgIHJldHVybiBoZWxwZXIuZm9yZXN0LmRlbGF5ZWRQb3N0Zml4SW5jcmVtZW50KAogICAgICAgIGhlbHBlciwgdG9rZW4sIGdlbmVyYXRvciwgYmluYXJ5T3BlcmF0b3IsIGludGVyZmFjZVRhcmdldCk7CiAgfQoKICBOYW1lIGdldCBiaW5hcnlPcGVyYXRvcjsKCiAgUHJvY2VkdXJlIGdldCBpbnRlcmZhY2VUYXJnZXQ7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZGVidWdOYW1lID0+ICJEZWxheWVkUG9zdGZpeEluY3JlbWVudCI7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRTaW1wbGVSZWFkKCkgewogICAgcmV0dXJuIGdlbmVyYXRvci5idWlsZFBvc3RmaXhJbmNyZW1lbnQoYmluYXJ5T3BlcmF0b3IsCiAgICAgICAgb2Zmc2V0OiBvZmZzZXRGb3JUb2tlbih0b2tlbiksCiAgICAgICAgdm9pZENvbnRleHQ6IGZhbHNlLAogICAgICAgIGludGVyZmFjZVRhcmdldDogaW50ZXJmYWNlVGFyZ2V0KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRGb3JFZmZlY3QoKSB7CiAgICByZXR1cm4gZ2VuZXJhdG9yLmJ1aWxkUG9zdGZpeEluY3JlbWVudChiaW5hcnlPcGVyYXRvciwKICAgICAgICBvZmZzZXQ6IG9mZnNldEZvclRva2VuKHRva2VuKSwKICAgICAgICB2b2lkQ29udGV4dDogdHJ1ZSwKICAgICAgICBpbnRlcmZhY2VUYXJnZXQ6IGludGVyZmFjZVRhcmdldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlKCIsIGJpbmFyeU9wZXJhdG9yOiAiKTsKICAgIHNpbmsud3JpdGUoYmluYXJ5T3BlcmF0b3IubmFtZSk7CiAgICBzaW5rLndyaXRlKCIsIGludGVyZmFjZVRhcmdldDogIik7CiAgICBwcmludFF1YWxpZmllZE5hbWVPbihpbnRlcmZhY2VUYXJnZXQsIHNpbmspOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgUHJlZml4VXNlR2VuZXJhdG9yIGltcGxlbWVudHMgR2VuZXJhdG9yIHsKICBmYWN0b3J5IFByZWZpeFVzZUdlbmVyYXRvcigKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLCBQcmVmaXhCdWlsZGVyIHByZWZpeCkgewogICAgcmV0dXJuIGhlbHBlci5mb3Jlc3QucHJlZml4VXNlR2VuZXJhdG9yKGhlbHBlciwgdG9rZW4sIHByZWZpeCk7CiAgfQoKICBQcmVmaXhCdWlsZGVyIGdldCBwcmVmaXg7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgcGxhaW5OYW1lRm9yUmVhZCA9PiBwcmVmaXgubmFtZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIlByZWZpeFVzZUdlbmVyYXRvciI7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRTaW1wbGVSZWFkKCkgPT4gbWFrZUludmFsaWRSZWFkKCk7CgogIEBvdmVycmlkZQogIC8qIEV4cHJlc3Npb24gfCBHZW5lcmF0b3IgKi8gT2JqZWN0IHF1YWxpZmllZExvb2t1cChUb2tlbiBuYW1lKSB7CiAgICBpZiAoaGVscGVyLmNvbnN0YW50Q29udGV4dCAhPSBDb25zdGFudENvbnRleHQubm9uZSAmJiBwcmVmaXguZGVmZXJyZWQpIHsKICAgICAgaGVscGVyLmFkZFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZUNhbnRVc2VEZWZlcnJlZFByZWZpeEFzQ29uc3RhbnQud2l0aEFyZ3VtZW50cyh0b2tlbiksCiAgICAgICAgICBvZmZzZXRGb3JUb2tlbih0b2tlbiksCiAgICAgICAgICBsZW5ndGhGb3JUb2tlbih0b2tlbikpOwogICAgfQogICAgT2JqZWN0IHJlc3VsdCA9IGhlbHBlci5zY29wZUxvb2t1cChwcmVmaXguZXhwb3J0U2NvcGUsIG5hbWUubGV4ZW1lLCBuYW1lLAogICAgICAgIGlzUXVhbGlmaWVkOiB0cnVlLCBwcmVmaXg6IHByZWZpeCk7CiAgICBpZiAocHJlZml4LmRlZmVycmVkKSB7CiAgICAgIGlmIChyZXN1bHQgaXMgR2VuZXJhdG9yKSB7CiAgICAgICAgaWYgKHJlc3VsdCBpcyEgTG9hZExpYnJhcnlHZW5lcmF0b3IpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBEZWZlcnJlZEFjY2Vzc0dlbmVyYXRvcihoZWxwZXIsIG5hbWUsIHRoaXMsIHJlc3VsdCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGhlbHBlci53cmFwSW5EZWZlcnJlZENoZWNrKHJlc3VsdCwgcHJlZml4LCBvZmZzZXRGb3JUb2tlbih0b2tlbikpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgLyogRXhwcmVzc2lvbiB8IEdlbmVyYXRvciB8IEluaXRpYWxpemVyICovIGRvSW52b2NhdGlvbigKICAgICAgaW50IG9mZnNldCwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIGhlbHBlci53cmFwSW5Mb2NhdGVkUHJvYmxlbSgKICAgICAgICBoZWxwZXIuZXZhbHVhdGVBcmd1bWVudHNCZWZvcmUoYXJndW1lbnRzLCBmb3Jlc3QubGl0ZXJhbE51bGwodG9rZW4pKSwKICAgICAgICBtZXNzYWdlQ2FudFVzZVByZWZpeEFzRXhwcmVzc2lvbi53aXRoTG9jYXRpb24oCiAgICAgICAgICAgIGhlbHBlci51cmksIG9mZnNldEZvclRva2VuKHRva2VuKSwgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKSk7CiAgfQoKICBAb3ZlcnJpZGUKICAvKiBFeHByZXNzaW9uIHwgR2VuZXJhdG9yICovIGJ1aWxkUHJvcGVydHlBY2Nlc3MoCiAgICAgIEluY29tcGxldGVTZW5kR2VuZXJhdG9yIHNlbmQsIGludCBvcGVyYXRvck9mZnNldCwgYm9vbCBpc051bGxBd2FyZSkgewogICAgaWYgKHNlbmQgaXMgSW5jb21wbGV0ZVNlbmRHZW5lcmF0b3IpIHsKICAgICAgYXNzZXJ0KHNlbmQubmFtZS5uYW1lID09IHNlbmQudG9rZW4ubGV4ZW1lLAogICAgICAgICAgIicke3NlbmQubmFtZS5uYW1lfScgIT0gJHtzZW5kLnRva2VuLmxleGVtZX0iKTsKICAgICAgT2JqZWN0IHJlc3VsdCA9IHF1YWxpZmllZExvb2t1cChzZW5kLnRva2VuKTsKICAgICAgaWYgKHNlbmQgaXMgU2VuZEFjY2Vzc0dlbmVyYXRvcikgewogICAgICAgIHJlc3VsdCA9IGhlbHBlci5maW5pc2hTZW5kKAogICAgICAgICAgICByZXN1bHQsCiAgICAgICAgICAgIHNlbmQuYXJndW1lbnRzIGFzIGR5bmFtaWMgLyogVE9ETyhhaGUpOiBSZW1vdmUgdGhpcyBjYXN0LiAqLywKICAgICAgICAgICAgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pKTsKICAgICAgfQogICAgICBpZiAoaXNOdWxsQXdhcmUpIHsKICAgICAgICByZXN1bHQgPSBoZWxwZXIud3JhcEluTG9jYXRlZFByb2JsZW0oCiAgICAgICAgICAgIGhlbHBlci50b1ZhbHVlKHJlc3VsdCksCiAgICAgICAgICAgIG1lc3NhZ2VDYW50VXNlUHJlZml4V2l0aE51bGxBd2FyZS53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgICBoZWxwZXIudXJpLCBvZmZzZXRGb3JUb2tlbih0b2tlbiksIGxlbmd0aEZvclRva2VuKHRva2VuKSkpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gYnVpbGRTaW1wbGVSZWFkKCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIG1ha2VJbnZhbGlkUmVhZCgpIHsKICAgIHJldHVybiBoZWxwZXIuYnVpbGRQcm9ibGVtKG1lc3NhZ2VDYW50VXNlUHJlZml4QXNFeHByZXNzaW9uLAogICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSwgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gbWFrZUludmFsaWRXcml0ZShFeHByZXNzaW9uIHZhbHVlKSA9PiBtYWtlSW52YWxpZFJlYWQoKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgc2luay53cml0ZSgiLCBwcmVmaXg6ICIpOwogICAgc2luay53cml0ZShwcmVmaXgubmFtZSk7CiAgICBzaW5rLndyaXRlKCIsIGRlZmVycmVkOiAiKTsKICAgIHNpbmsud3JpdGUocHJlZml4LmRlZmVycmVkKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIFVuZXhwZWN0ZWRRdWFsaWZpZWRVc2VHZW5lcmF0b3IgaW1wbGVtZW50cyBHZW5lcmF0b3IgewogIGZhY3RvcnkgVW5leHBlY3RlZFF1YWxpZmllZFVzZUdlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgVG9rZW4gdG9rZW4sIEdlbmVyYXRvciBwcmVmaXhHZW5lcmF0b3IsIGJvb2wgaXNVbnJlc29sdmVkKSB7CiAgICByZXR1cm4gaGVscGVyLmZvcmVzdC51bmV4cGVjdGVkUXVhbGlmaWVkVXNlR2VuZXJhdG9yKAogICAgICAgIGhlbHBlciwgdG9rZW4sIHByZWZpeEdlbmVyYXRvciwgaXNVbnJlc29sdmVkKTsKICB9CgogIEdlbmVyYXRvciBnZXQgcHJlZml4R2VuZXJhdG9yOwoKICBib29sIGdldCBpc1VucmVzb2x2ZWQ7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgcGxhaW5OYW1lRm9yUmVhZCB7CiAgICByZXR1cm4gIiR7cHJlZml4R2VuZXJhdG9yLnBsYWluTmFtZUZvclJlYWR9LiR7dG9rZW4ubGV4ZW1lfSI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiVW5leHBlY3RlZFF1YWxpZmllZFVzZUdlbmVyYXRvciI7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRTaW1wbGVSZWFkKCkgPT4gbWFrZUludmFsaWRSZWFkKCk7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZG9JbnZvY2F0aW9uKGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBoZWxwZXIud3JhcFN5bnRoZXRpY0V4cHJlc3Npb24oCiAgICAgICAgaGVscGVyLnRocm93Tm9TdWNoTWV0aG9kRXJyb3IoCiAgICAgICAgICAgIGZvcmVzdC5saXRlcmFsTnVsbChudWxsKS4uZmlsZU9mZnNldCA9IG9mZnNldCwKICAgICAgICAgICAgcGxhaW5OYW1lRm9yUmVhZCwKICAgICAgICAgICAgYXJndW1lbnRzLAogICAgICAgICAgICBvZmZzZXRGb3JUb2tlbih0b2tlbikpLAogICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBLZXJuZWxUeXBlQnVpbGRlciBidWlsZFR5cGVXaXRoUmVzb2x2ZWRBcmd1bWVudHMoCiAgICAgIExpc3Q8VW5yZXNvbHZlZFR5cGU8S2VybmVsVHlwZUJ1aWxkZXI+PiBhcmd1bWVudHMpIHsKICAgIFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nLCBTdHJpbmcpPiB0ZW1wbGF0ZSA9IGlzVW5yZXNvbHZlZAogICAgICAgID8gdGVtcGxhdGVVbnJlc29sdmVkUHJlZml4SW5UeXBlQW5ub3RhdGlvbgogICAgICAgIDogdGVtcGxhdGVOb3RBUHJlZml4SW5UeXBlQW5ub3RhdGlvbjsKICAgIEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIgcmVzdWx0ID0KICAgICAgICBuZXcgS2VybmVsTmFtZWRUeXBlQnVpbGRlcihwbGFpbk5hbWVGb3JSZWFkLCBudWxsKTsKICAgIHJlc3VsdC5iaW5kKHJlc3VsdC5idWlsZEludmFsaWRUeXBlKHRlbXBsYXRlCiAgICAgICAgLndpdGhBcmd1bWVudHMocHJlZml4R2VuZXJhdG9yLnRva2VuLmxleGVtZSwgdG9rZW4ubGV4ZW1lKQogICAgICAgIC53aXRoTG9jYXRpb24odXJpLCBvZmZzZXRGb3JUb2tlbihwcmVmaXhHZW5lcmF0b3IudG9rZW4pLAogICAgICAgICAgICBsZW5ndGhPZlNwYW4ocHJlZml4R2VuZXJhdG9yLnRva2VuLCB0b2tlbikpKSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgc2luay53cml0ZSgiLCBwcmVmaXhHZW5lcmF0b3I6ICIpOwogICAgcHJlZml4R2VuZXJhdG9yLnByaW50T24oc2luayk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBQYXJzZXJFcnJvckdlbmVyYXRvciBpbXBsZW1lbnRzIEdlbmVyYXRvciB7CiAgZmFjdG9yeSBQYXJzZXJFcnJvckdlbmVyYXRvcigKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLCBNZXNzYWdlIG1lc3NhZ2UpIHsKICAgIHJldHVybiBoZWxwZXIuZm9yZXN0LnBhcnNlckVycm9yR2VuZXJhdG9yKGhlbHBlciwgdG9rZW4sIG1lc3NhZ2UpOwogIH0KCiAgTWVzc2FnZSBnZXQgbWVzc2FnZSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IHBsYWluTmFtZUZvclJlYWQgPT4gIiNwYXJzZXItZXJyb3IiOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiUGFyc2VyRXJyb3JHZW5lcmF0b3IiOwoKICBAb3ZlcnJpZGUKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKSB7fQoKICBFeHByZXNzaW9uIGJ1aWxkUHJvYmxlbSgpIHsKICAgIHJldHVybiBoZWxwZXIuYnVpbGRQcm9ibGVtKG1lc3NhZ2UsIG9mZnNldEZvclRva2VuKHRva2VuKSwgbm9MZW5ndGgsCiAgICAgICAgc3VwcHJlc3NNZXNzYWdlOiB0cnVlKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRTaW1wbGVSZWFkKCkgPT4gYnVpbGRQcm9ibGVtKCk7CgogIEV4cHJlc3Npb24gYnVpbGRBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIHtib29sIHZvaWRDb250ZXh0fSkgewogICAgcmV0dXJuIGJ1aWxkUHJvYmxlbSgpOwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZE51bGxBd2FyZUFzc2lnbm1lbnQoCiAgICAgIEV4cHJlc3Npb24gdmFsdWUsIERhcnRUeXBlIHR5cGUsIGludCBvZmZzZXQsCiAgICAgIHtib29sIHZvaWRDb250ZXh0fSkgewogICAgcmV0dXJuIGJ1aWxkUHJvYmxlbSgpOwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZENvbXBvdW5kQXNzaWdubWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLCBFeHByZXNzaW9uIHZhbHVlLAogICAgICB7aW50IG9mZnNldCwKICAgICAgYm9vbCB2b2lkQ29udGV4dCwKICAgICAgUHJvY2VkdXJlIGludGVyZmFjZVRhcmdldCwKICAgICAgYm9vbCBpc1ByZUluY0RlYywKICAgICAgYm9vbCBpc1Bvc3RJbmNEZWN9KSB7CiAgICByZXR1cm4gYnVpbGRQcm9ibGVtKCk7CiAgfQoKICBFeHByZXNzaW9uIGJ1aWxkUHJlZml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0LCBib29sIHZvaWRDb250ZXh0LCBQcm9jZWR1cmUgaW50ZXJmYWNlVGFyZ2V0fSkgewogICAgcmV0dXJuIGJ1aWxkUHJvYmxlbSgpOwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZFBvc3RmaXhJbmNyZW1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwKICAgICAge2ludCBvZmZzZXQsIGJvb2wgdm9pZENvbnRleHQsIFByb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXR9KSB7CiAgICByZXR1cm4gYnVpbGRQcm9ibGVtKCk7CiAgfQoKICBFeHByZXNzaW9uIG1ha2VJbnZhbGlkUmVhZCgpID0+IGJ1aWxkUHJvYmxlbSgpOwoKICBFeHByZXNzaW9uIG1ha2VJbnZhbGlkV3JpdGUoRXhwcmVzc2lvbiB2YWx1ZSkgPT4gYnVpbGRQcm9ibGVtKCk7CgogIEluaXRpYWxpemVyIGJ1aWxkRmllbGRJbml0aWFsaXplcihNYXA8U3RyaW5nLCBpbnQ+IGluaXRpYWxpemVkRmllbGRzKSB7CiAgICByZXR1cm4gaGVscGVyLmJ1aWxkSW52YWxpZEluaXRpYWxpemVyKAogICAgICAgIGhlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihidWlsZFByb2JsZW0oKSkpOwogIH0KCiAgRXhwcmVzc2lvbiBkb0ludm9jYXRpb24oaW50IG9mZnNldCwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIGJ1aWxkUHJvYmxlbSgpOwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZFByb3BlcnR5QWNjZXNzKAogICAgICBJbmNvbXBsZXRlU2VuZEdlbmVyYXRvciBzZW5kLCBpbnQgb3BlcmF0b3JPZmZzZXQsIGJvb2wgaXNOdWxsQXdhcmUpIHsKICAgIHJldHVybiBidWlsZFByb2JsZW0oKTsKICB9CgogIEtlcm5lbFR5cGVCdWlsZGVyIGJ1aWxkVHlwZVdpdGhSZXNvbHZlZEFyZ3VtZW50cygKICAgICAgTGlzdDxVbnJlc29sdmVkVHlwZTxLZXJuZWxUeXBlQnVpbGRlcj4+IGFyZ3VtZW50cykgewogICAgS2VybmVsTmFtZWRUeXBlQnVpbGRlciByZXN1bHQgPQogICAgICAgIG5ldyBLZXJuZWxOYW1lZFR5cGVCdWlsZGVyKHRva2VuLmxleGVtZSwgbnVsbCk7CiAgICByZXN1bHQuYmluZChyZXN1bHQuYnVpbGRJbnZhbGlkVHlwZSgKICAgICAgICBtZXNzYWdlLndpdGhMb2NhdGlvbih1cmksIG9mZnNldEZvclRva2VuKHRva2VuKSwgbm9MZW5ndGgpKSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgRXhwcmVzc2lvbiBxdWFsaWZpZWRMb29rdXAoVG9rZW4gbmFtZSkgewogICAgcmV0dXJuIGJ1aWxkUHJvYmxlbSgpOwogIH0KCiAgRXhwcmVzc2lvbiBpbnZva2VDb25zdHJ1Y3RvcigKICAgICAgTGlzdDxVbnJlc29sdmVkVHlwZTxLZXJuZWxUeXBlQnVpbGRlcj4+IHR5cGVBcmd1bWVudHMsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICBUb2tlbiBuYW1lVG9rZW4sCiAgICAgIFRva2VuIG5hbWVMYXN0VG9rZW4sCiAgICAgIENvbnN0bmVzcyBjb25zdG5lc3MpIHsKICAgIHJldHVybiBidWlsZFByb2JsZW0oKTsKICB9Cn0KhPkATk48ASskAS4BOAEdCRgREiorMSMnEjEoLiwaMgEXCRcRExYXFBMWFhUSGBkBSwE3ASgBSgEVCRAcFyAdATQBHQkTEhUUFRAOEx0BHQkcFSIgGxgBKjcBKgkiKyEqHR0VASVEIAFNJgZGSEQBTzcGRkgGLCczGwFMPEwTGCEYGwFOFTdC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aG91bGQgYmUgbW92ZWQgdG8KLy8vIFtrZXJuZWxfZXhwcmVzc2lvbl9nZW5lcmF0b3IuZGFydF0gYW5kIHdlIGNhbiBldmVudHVhbGx5IGRlbGV0ZSB0aGlzIGZpbGUuCi8vLwovLy8gVGFrZSBhIGxvb2sgYXQgW1ZhcmlhYmxlVXNlR2VuZXJhdG9yXSBmb3IgYW4gZXhhbXBsZSBvZiBob3cgdGhlIGNvbW1vbgovLy8gc3VwZXJjbGFzcyBzaG91bGQgdXNlIHRoZSBmb3Jlc3QgQVBJIGluIGEgZmFjdG9yeSBtZXRob2QuCnBhcnQgb2YgJ2tlcm5lbF9leHByZXNzaW9uX2dlbmVyYXRvci5kYXJ0JzsKCmNsYXNzIFRoaXNBY2Nlc3NHZW5lcmF0b3IgZXh0ZW5kcyBLZXJuZWxHZW5lcmF0b3IgewogIGZpbmFsIGJvb2wgaXNJbml0aWFsaXplcjsKICBmaW5hbCBib29sIGluRmllbGRJbml0aWFsaXplcjsKCiAgZmluYWwgYm9vbCBpc1N1cGVyOwoKICBUaGlzQWNjZXNzR2VuZXJhdG9yKEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLCBUb2tlbiB0b2tlbiwKICAgICAgdGhpcy5pc0luaXRpYWxpemVyLCB0aGlzLmluRmllbGRJbml0aWFsaXplciwKICAgICAge3RoaXMuaXNTdXBlcjogZmFsc2V9KQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4pOwoKICBTdHJpbmcgZ2V0IHBsYWluTmFtZUZvclJlYWQgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCIke2lzU3VwZXIgPyAnc3VwZXInIDogJ3RoaXMnfS5wbGFpbk5hbWVGb3JSZWFkIiwKICAgICAgICBvZmZzZXRGb3JUb2tlbih0b2tlbiksIHVyaSk7CiAgfQoKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiVGhpc0FjY2Vzc0dlbmVyYXRvciI7CgogIEV4cHJlc3Npb24gYnVpbGRTaW1wbGVSZWFkKCkgewogICAgaWYgKCFpc1N1cGVyKSB7CiAgICAgIGlmIChpbkZpZWxkSW5pdGlhbGl6ZXIpIHsKICAgICAgICByZXR1cm4gYnVpbGRGaWVsZEluaXRpYWxpemVyRXJyb3IobnVsbCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGZvcmVzdC50aGlzRXhwcmVzc2lvbih0b2tlbik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBoZWxwZXIuYnVpbGRQcm9ibGVtKG1lc3NhZ2VTdXBlckFzRXhwcmVzc2lvbiwKICAgICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSwgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKTsKICAgIH0KICB9CgogIEV4cHJlc3Npb24gYnVpbGRGaWVsZEluaXRpYWxpemVyRXJyb3IoTWFwPFN0cmluZywgaW50PiBpbml0aWFsaXplZEZpZWxkcykgewogICAgU3RyaW5nIGtleXdvcmQgPSBpc1N1cGVyID8gInN1cGVyIiA6ICJ0aGlzIjsKICAgIHJldHVybiBoZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgICAgIHRlbXBsYXRlVGhpc09yU3VwZXJBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXIud2l0aEFyZ3VtZW50cyhrZXl3b3JkKSwKICAgICAgICBvZmZzZXRGb3JUb2tlbih0b2tlbiksCiAgICAgICAga2V5d29yZC5sZW5ndGgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXIgYnVpbGRGaWVsZEluaXRpYWxpemVyKE1hcDxTdHJpbmcsIGludD4gaW5pdGlhbGl6ZWRGaWVsZHMpIHsKICAgIEV4cHJlc3Npb24gZXJyb3IgPSBoZWxwZXIuZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oCiAgICAgICAgYnVpbGRGaWVsZEluaXRpYWxpemVyRXJyb3IoaW5pdGlhbGl6ZWRGaWVsZHMpKTsKICAgIHJldHVybiBoZWxwZXIuYnVpbGRJbnZhbGlkSW5pdGlhbGl6ZXIoZXJyb3IsIGVycm9yLmZpbGVPZmZzZXQpOwogIH0KCiAgYnVpbGRQcm9wZXJ0eUFjY2VzcygKICAgICAgSW5jb21wbGV0ZVNlbmRHZW5lcmF0b3Igc2VuZCwgaW50IG9wZXJhdG9yT2Zmc2V0LCBib29sIGlzTnVsbEF3YXJlKSB7CiAgICBOYW1lIG5hbWUgPSBzZW5kLm5hbWU7CiAgICBBcmd1bWVudHMgYXJndW1lbnRzID0gc2VuZC5hcmd1bWVudHM7CiAgICBpbnQgb2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4oc2VuZC50b2tlbik7CiAgICBpZiAoaXNJbml0aWFsaXplciAmJiBzZW5kIGlzIFNlbmRBY2Nlc3NHZW5lcmF0b3IpIHsKICAgICAgaWYgKGlzTnVsbEF3YXJlKSB7CiAgICAgICAgaGVscGVyLmFkZFByb2JsZW0oCiAgICAgICAgICAgIG1lc3NhZ2VJbnZhbGlkVXNlT2ZOdWxsQXdhcmVBY2Nlc3MsIG9wZXJhdG9yT2Zmc2V0LCAyKTsKICAgICAgfQogICAgICByZXR1cm4gYnVpbGRDb25zdHJ1Y3RvckluaXRpYWxpemVyKG9mZnNldCwgbmFtZSwgYXJndW1lbnRzKTsKICAgIH0KICAgIGlmIChpbkZpZWxkSW5pdGlhbGl6ZXIgJiYgIWlzSW5pdGlhbGl6ZXIpIHsKICAgICAgcmV0dXJuIGJ1aWxkRmllbGRJbml0aWFsaXplckVycm9yKG51bGwpOwogICAgfQogICAgTWVtYmVyIGdldHRlciA9IGhlbHBlci5sb29rdXBJbnN0YW5jZU1lbWJlcihuYW1lLCBpc1N1cGVyOiBpc1N1cGVyKTsKICAgIGlmIChzZW5kIGlzIFNlbmRBY2Nlc3NHZW5lcmF0b3IpIHsKICAgICAgLy8gTm90aWNlIHRoYXQgJ3RoaXMnIG9yICdzdXBlcicgY2FuJ3QgYmUgbnVsbC4gU28gd2UgY2FuIGlnbm9yZSB0aGUKICAgICAgLy8gdmFsdWUgb2YgW2lzTnVsbEF3YXJlXS4KICAgICAgaWYgKGdldHRlciA9PSBudWxsKSB7CiAgICAgICAgaGVscGVyLndhcm5VbnJlc29sdmVkTWV0aG9kKG5hbWUsIG9mZnNldEZvclRva2VuKHNlbmQudG9rZW4pLAogICAgICAgICAgICBpc1N1cGVyOiBpc1N1cGVyKTsKICAgICAgfQogICAgICByZXR1cm4gaGVscGVyLmJ1aWxkTWV0aG9kSW52b2NhdGlvbihmb3Jlc3QudGhpc0V4cHJlc3Npb24obnVsbCksIG5hbWUsCiAgICAgICAgICBzZW5kLmFyZ3VtZW50cywgb2Zmc2V0Rm9yVG9rZW4oc2VuZC50b2tlbiksCiAgICAgICAgICBpc1N1cGVyOiBpc1N1cGVyLCBpbnRlcmZhY2VUYXJnZXQ6IGdldHRlcik7CiAgICB9IGVsc2UgewogICAgICBNZW1iZXIgc2V0dGVyID0KICAgICAgICAgIGhlbHBlci5sb29rdXBJbnN0YW5jZU1lbWJlcihuYW1lLCBpc1N1cGVyOiBpc1N1cGVyLCBpc1NldHRlcjogdHJ1ZSk7CiAgICAgIGlmIChpc1N1cGVyKSB7CiAgICAgICAgcmV0dXJuIG5ldyBTdXBlclByb3BlcnR5QWNjZXNzR2VuZXJhdG9yKAogICAgICAgICAgICBoZWxwZXIsCiAgICAgICAgICAgIC8vIFRPRE8oYWhlKTogVGhpcyBpcyBub3QgdGhlICdzdXBlcicgdG9rZW4uCiAgICAgICAgICAgIHNlbmQudG9rZW4sCiAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgIGdldHRlciwKICAgICAgICAgICAgc2V0dGVyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbmV3IFRoaXNQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcigKICAgICAgICAgICAgaGVscGVyLAogICAgICAgICAgICAvLyBUT0RPKGFoZSk6IFRoaXMgaXMgbm90IHRoZSAndGhpcycgdG9rZW4uCiAgICAgICAgICAgIHNlbmQudG9rZW4sCiAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgIGdldHRlciwKICAgICAgICAgICAgc2V0dGVyKTsKICAgICAgfQogICAgfQogIH0KCiAgZG9JbnZvY2F0aW9uKGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIGlmIChpc0luaXRpYWxpemVyKSB7CiAgICAgIHJldHVybiBidWlsZENvbnN0cnVjdG9ySW5pdGlhbGl6ZXIob2Zmc2V0LCBuZXcgTmFtZSgiIiksIGFyZ3VtZW50cyk7CiAgICB9IGVsc2UgaWYgKGlzU3VwZXIpIHsKICAgICAgcmV0dXJuIGhlbHBlci5idWlsZFByb2JsZW0obWVzc2FnZVN1cGVyQXNFeHByZXNzaW9uLCBvZmZzZXQsIG5vTGVuZ3RoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBoZWxwZXIuYnVpbGRNZXRob2RJbnZvY2F0aW9uKAogICAgICAgICAgZm9yZXN0LnRoaXNFeHByZXNzaW9uKG51bGwpLCBjYWxsTmFtZSwgYXJndW1lbnRzLCBvZmZzZXQsCiAgICAgICAgICBpc0ltcGxpY2l0Q2FsbDogdHJ1ZSk7CiAgICB9CiAgfQoKICBJbml0aWFsaXplciBidWlsZENvbnN0cnVjdG9ySW5pdGlhbGl6ZXIoCiAgICAgIGludCBvZmZzZXQsIE5hbWUgbmFtZSwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBoZWxwZXIubG9va3VwQ29uc3RydWN0b3IobmFtZSwgaXNTdXBlcjogaXNTdXBlcik7CiAgICBMb2NhdGVkTWVzc2FnZSBtZXNzYWdlOwogICAgaWYgKGNvbnN0cnVjdG9yICE9IG51bGwpIHsKICAgICAgbWVzc2FnZSA9IGhlbHBlci5jaGVja0FyZ3VtZW50c0ZvckZ1bmN0aW9uKAogICAgICAgICAgY29uc3RydWN0b3IuZnVuY3Rpb24sIGFyZ3VtZW50cywgb2Zmc2V0LCA8VHlwZVBhcmFtZXRlcj5bXSk7CiAgICB9IGVsc2UgewogICAgICBTdHJpbmcgZnVsbE5hbWUgPQogICAgICAgICAgaGVscGVyLmNvbnN0cnVjdG9yTmFtZUZvckRpYWdub3N0aWNzKG5hbWUubmFtZSwgaXNTdXBlcjogaXNTdXBlcik7CiAgICAgIG1lc3NhZ2UgPSAoaXNTdXBlcgogICAgICAgICAgICAgID8gdGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9Db25zdHJ1Y3RvcgogICAgICAgICAgICAgIDogdGVtcGxhdGVDb25zdHJ1Y3Rvck5vdEZvdW5kKQogICAgICAgICAgLndpdGhBcmd1bWVudHMoZnVsbE5hbWUpCiAgICAgICAgICAud2l0aExvY2F0aW9uKHVyaSwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBsZW5ndGhGb3JUb2tlbih0b2tlbikpOwogICAgfQogICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewogICAgICByZXR1cm4gaGVscGVyLmJ1aWxkSW52YWxpZEluaXRpYWxpemVyKGhlbHBlci53cmFwU3ludGhldGljRXhwcmVzc2lvbigKICAgICAgICAgIGhlbHBlci50aHJvd05vU3VjaE1ldGhvZEVycm9yKAogICAgICAgICAgICAgIGZvcmVzdC5saXRlcmFsTnVsbChudWxsKS4uZmlsZU9mZnNldCA9IG9mZnNldCwKICAgICAgICAgICAgICBoZWxwZXIuY29uc3RydWN0b3JOYW1lRm9yRGlhZ25vc3RpY3MobmFtZS5uYW1lLCBpc1N1cGVyOiBpc1N1cGVyKSwKICAgICAgICAgICAgICBhcmd1bWVudHMsCiAgICAgICAgICAgICAgb2Zmc2V0LAogICAgICAgICAgICAgIGlzU3VwZXI6IGlzU3VwZXIsCiAgICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSksCiAgICAgICAgICBvZmZzZXQpKTsKICAgIH0gZWxzZSBpZiAoaXNTdXBlcikgewogICAgICByZXR1cm4gaGVscGVyLmJ1aWxkU3VwZXJJbml0aWFsaXplcigKICAgICAgICAgIGZhbHNlLCBjb25zdHJ1Y3RvciwgYXJndW1lbnRzLCBvZmZzZXQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGhlbHBlci5idWlsZFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIoY29uc3RydWN0b3IsIGFyZ3VtZW50cywgb2Zmc2V0KTsKICAgIH0KICB9CgogIEV4cHJlc3Npb24gYnVpbGRBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBidWlsZEFzc2lnbm1lbnRFcnJvcigpOwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZE51bGxBd2FyZUFzc2lnbm1lbnQoCiAgICAgIEV4cHJlc3Npb24gdmFsdWUsIERhcnRUeXBlIHR5cGUsIGludCBvZmZzZXQsCiAgICAgIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBidWlsZEFzc2lnbm1lbnRFcnJvcigpOwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZENvbXBvdW5kQXNzaWdubWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLCBFeHByZXNzaW9uIHZhbHVlLAogICAgICB7aW50IG9mZnNldDogVHJlZU5vZGUubm9PZmZzZXQsCiAgICAgIGJvb2wgdm9pZENvbnRleHQ6IGZhbHNlLAogICAgICBQcm9jZWR1cmUgaW50ZXJmYWNlVGFyZ2V0LAogICAgICBib29sIGlzUHJlSW5jRGVjOiBmYWxzZSwKICAgICAgYm9vbCBpc1Bvc3RJbmNEZWM6IGZhbHNlfSkgewogICAgcmV0dXJuIGJ1aWxkQXNzaWdubWVudEVycm9yKCk7CiAgfQoKICBFeHByZXNzaW9uIGJ1aWxkUHJlZml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwKICAgICAgYm9vbCB2b2lkQ29udGV4dDogZmFsc2UsCiAgICAgIFByb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXR9KSB7CiAgICByZXR1cm4gYnVpbGRBc3NpZ25tZW50RXJyb3IoKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRQb3N0Zml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwKICAgICAgYm9vbCB2b2lkQ29udGV4dDogZmFsc2UsCiAgICAgIFByb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXR9KSB7CiAgICByZXR1cm4gYnVpbGRBc3NpZ25tZW50RXJyb3IoKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRBc3NpZ25tZW50RXJyb3IoKSB7CiAgICByZXR1cm4gaGVscGVyLmRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKGhlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgaXNTdXBlciA/IG1lc3NhZ2VDYW5ub3RBc3NpZ25Ub1N1cGVyIDogbWVzc2FnZU5vdEFuTHZhbHVlLAogICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSwKICAgICAgICB0b2tlbi5sZW5ndGgpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGUoIiwgaXNJbml0aWFsaXplcjogIik7CiAgICBzaW5rLndyaXRlKGlzSW5pdGlhbGl6ZXIpOwogICAgc2luay53cml0ZSgiLCBpc1N1cGVyOiAiKTsKICAgIHNpbmsud3JpdGUoaXNTdXBlcik7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBJbmNvbXBsZXRlU2VuZEdlbmVyYXRvciBleHRlbmRzIEtlcm5lbEdlbmVyYXRvciB7CiAgZmluYWwgTmFtZSBuYW1lOwoKICBJbmNvbXBsZXRlU2VuZEdlbmVyYXRvcigKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLCB0aGlzLm5hbWUpCiAgICAgIDogc3VwZXIoaGVscGVyLCB0b2tlbik7CgogIHdpdGhSZWNlaXZlcihPYmplY3QgcmVjZWl2ZXIsIGludCBvcGVyYXRvck9mZnNldCwge2Jvb2wgaXNOdWxsQXdhcmV9KTsKCiAgQXJndW1lbnRzIGdldCBhcmd1bWVudHMgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgc2luay53cml0ZSgiLCBuYW1lOiAiKTsKICAgIHNpbmsud3JpdGUobmFtZS5uYW1lKTsKICB9Cn0KCmNsYXNzIEluY29tcGxldGVFcnJvckdlbmVyYXRvciBleHRlbmRzIEluY29tcGxldGVTZW5kR2VuZXJhdG9yCiAgICB3aXRoIEVycm9uZW91c0V4cHJlc3Npb25HZW5lcmF0b3IgewogIGZpbmFsIE1lc3NhZ2UgbWVzc2FnZTsKCiAgSW5jb21wbGV0ZUVycm9yR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sIHRoaXMubWVzc2FnZSkKICAgICAgOiBzdXBlcihoZWxwZXIsIHRva2VuLCBudWxsKTsKCiAgU3RyaW5nIGdldCBwbGFpbk5hbWVGb3JSZWFkID0+IHRva2VuLmxleGVtZTsKCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIkluY29tcGxldGVFcnJvckdlbmVyYXRvciI7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRFcnJvcihBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICB7Ym9vbCBpc0dldHRlcjogZmFsc2UsIGJvb2wgaXNTZXR0ZXI6IGZhbHNlLCBpbnQgb2Zmc2V0fSkgewogICAgaW50IGxlbmd0aCA9IG5vTGVuZ3RoOwogICAgaWYgKG9mZnNldCA9PSBudWxsKSB7CiAgICAgIG9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgICAgbGVuZ3RoID0gbGVuZ3RoRm9yVG9rZW4odG9rZW4pOwogICAgfQogICAgcmV0dXJuIGhlbHBlci5idWlsZFByb2JsZW0obWVzc2FnZSwgb2Zmc2V0LCBsZW5ndGgpOwogIH0KCiAgQG92ZXJyaWRlCiAgZG9JbnZvY2F0aW9uKGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpID0+IHRoaXM7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRTaW1wbGVSZWFkKCkgewogICAgcmV0dXJuIGJ1aWxkRXJyb3IoZm9yZXN0LmFyZ3VtZW50c0VtcHR5KHRva2VuKSwgaXNHZXR0ZXI6IHRydWUpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGUoIiwgbWVzc2FnZTogIik7CiAgICBzaW5rLndyaXRlKG1lc3NhZ2UuY29kZS5uYW1lKTsKICB9Cn0KCi8vIFRPRE8oYWhlKTogUmVuYW1lIHRvIFNlbmRHZW5lcmF0b3IuCmNsYXNzIFNlbmRBY2Nlc3NHZW5lcmF0b3IgZXh0ZW5kcyBJbmNvbXBsZXRlU2VuZEdlbmVyYXRvciB7CiAgQG92ZXJyaWRlCiAgZmluYWwgQXJndW1lbnRzIGFyZ3VtZW50czsKCiAgU2VuZEFjY2Vzc0dlbmVyYXRvcigKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLCBOYW1lIG5hbWUsIHRoaXMuYXJndW1lbnRzKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4sIG5hbWUpIHsKICAgIGFzc2VydChhcmd1bWVudHMgIT0gbnVsbCk7CiAgfQoKICBTdHJpbmcgZ2V0IHBsYWluTmFtZUZvclJlYWQgPT4gbmFtZS5uYW1lOwoKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiU2VuZEFjY2Vzc0dlbmVyYXRvciI7CgogIEV4cHJlc3Npb24gYnVpbGRTaW1wbGVSZWFkKCkgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCJidWlsZFNpbXBsZVJlYWQiLCBvZmZzZXRGb3JUb2tlbih0b2tlbiksIHVyaSk7CiAgfQoKICBFeHByZXNzaW9uIGJ1aWxkQXNzaWdubWVudChFeHByZXNzaW9uIHZhbHVlLCB7Ym9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoImJ1aWxkQXNzaWdubWVudCIsIG9mZnNldEZvclRva2VuKHRva2VuKSwgdXJpKTsKICB9CgogIHdpdGhSZWNlaXZlcihPYmplY3QgcmVjZWl2ZXIsIGludCBvcGVyYXRvck9mZnNldCwge2Jvb2wgaXNOdWxsQXdhcmU6IGZhbHNlfSkgewogICAgaWYgKHJlY2VpdmVyIGlzIEdlbmVyYXRvcikgewogICAgICByZXR1cm4gcmVjZWl2ZXIuYnVpbGRQcm9wZXJ0eUFjY2Vzcyh0aGlzLCBvcGVyYXRvck9mZnNldCwgaXNOdWxsQXdhcmUpOwogICAgfQogICAgcmV0dXJuIGhlbHBlci5idWlsZE1ldGhvZEludm9jYXRpb24oCiAgICAgICAgaGVscGVyLnRvVmFsdWUocmVjZWl2ZXIpLCBuYW1lLCBhcmd1bWVudHMsIG9mZnNldEZvclRva2VuKHRva2VuKSwKICAgICAgICBpc051bGxBd2FyZTogaXNOdWxsQXdhcmUpOwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZE51bGxBd2FyZUFzc2lnbm1lbnQoCiAgICAgIEV4cHJlc3Npb24gdmFsdWUsIERhcnRUeXBlIHR5cGUsIGludCBvZmZzZXQsCiAgICAgIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiYnVpbGROdWxsQXdhcmVBc3NpZ25tZW50Iiwgb2Zmc2V0LCB1cmkpOwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZENvbXBvdW5kQXNzaWdubWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLCBFeHByZXNzaW9uIHZhbHVlLAogICAgICB7aW50IG9mZnNldDogVHJlZU5vZGUubm9PZmZzZXQsCiAgICAgIGJvb2wgdm9pZENvbnRleHQ6IGZhbHNlLAogICAgICBQcm9jZWR1cmUgaW50ZXJmYWNlVGFyZ2V0LAogICAgICBib29sIGlzUHJlSW5jRGVjOiBmYWxzZSwKICAgICAgYm9vbCBpc1Bvc3RJbmNEZWM6IGZhbHNlfSkgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKAogICAgICAgICJidWlsZENvbXBvdW5kQXNzaWdubWVudCIsIG9mZnNldCA/PyBvZmZzZXRGb3JUb2tlbih0b2tlbiksIHVyaSk7CiAgfQoKICBFeHByZXNzaW9uIGJ1aWxkUHJlZml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwKICAgICAgYm9vbCB2b2lkQ29udGV4dDogZmFsc2UsCiAgICAgIFByb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXR9KSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoCiAgICAgICAgImJ1aWxkUHJlZml4SW5jcmVtZW50Iiwgb2Zmc2V0ID8/IG9mZnNldEZvclRva2VuKHRva2VuKSwgdXJpKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRQb3N0Zml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwKICAgICAgYm9vbCB2b2lkQ29udGV4dDogZmFsc2UsCiAgICAgIFByb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXR9KSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoCiAgICAgICAgImJ1aWxkUG9zdGZpeEluY3JlbWVudCIsIG9mZnNldCA/PyBvZmZzZXRGb3JUb2tlbih0b2tlbiksIHVyaSk7CiAgfQoKICBFeHByZXNzaW9uIGRvSW52b2NhdGlvbihpbnQgb2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoImRvSW52b2NhdGlvbiIsIG9mZnNldCwgdXJpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIHN1cGVyLnByaW50T24oc2luayk7CiAgICBzaW5rLndyaXRlKCIsIGFyZ3VtZW50czogIik7CiAgICB2YXIgbm9kZSA9IGFyZ3VtZW50czsKICAgIGlmIChub2RlIGlzIE5vZGUpIHsKICAgICAgcHJpbnROb2RlT24obm9kZSwgc2luayk7CiAgICB9IGVsc2UgewogICAgICBzaW5rLndyaXRlKG5vZGUpOwogICAgfQogIH0KfQoKY2xhc3MgSW5jb21wbGV0ZVByb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGV4dGVuZHMgSW5jb21wbGV0ZVNlbmRHZW5lcmF0b3IgewogIEluY29tcGxldGVQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcigKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLCBOYW1lIG5hbWUpCiAgICAgIDogc3VwZXIoaGVscGVyLCB0b2tlbiwgbmFtZSk7CgogIFN0cmluZyBnZXQgcGxhaW5OYW1lRm9yUmVhZCA9PiBuYW1lLm5hbWU7CgogIFN0cmluZyBnZXQgZGVidWdOYW1lID0+ICJJbmNvbXBsZXRlUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IiOwoKICBFeHByZXNzaW9uIGJ1aWxkU2ltcGxlUmVhZCgpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiYnVpbGRTaW1wbGVSZWFkIiwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCB1cmkpOwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZEFzc2lnbm1lbnQoRXhwcmVzc2lvbiB2YWx1ZSwge2Jvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCJidWlsZEFzc2lnbm1lbnQiLCBvZmZzZXRGb3JUb2tlbih0b2tlbiksIHVyaSk7CiAgfQoKICB3aXRoUmVjZWl2ZXIoT2JqZWN0IHJlY2VpdmVyLCBpbnQgb3BlcmF0b3JPZmZzZXQsIHtib29sIGlzTnVsbEF3YXJlOiBmYWxzZX0pIHsKICAgIGlmIChyZWNlaXZlciBpcyBHZW5lcmF0b3IpIHsKICAgICAgcmV0dXJuIHJlY2VpdmVyLmJ1aWxkUHJvcGVydHlBY2Nlc3ModGhpcywgb3BlcmF0b3JPZmZzZXQsIGlzTnVsbEF3YXJlKTsKICAgIH0KICAgIHJldHVybiBQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvci5tYWtlKAogICAgICAgIGhlbHBlciwgdG9rZW4sIGhlbHBlci50b1ZhbHVlKHJlY2VpdmVyKSwgbmFtZSwgbnVsbCwgbnVsbCwgaXNOdWxsQXdhcmUpOwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZE51bGxBd2FyZUFzc2lnbm1lbnQoCiAgICAgIEV4cHJlc3Npb24gdmFsdWUsIERhcnRUeXBlIHR5cGUsIGludCBvZmZzZXQsCiAgICAgIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiYnVpbGROdWxsQXdhcmVBc3NpZ25tZW50Iiwgb2Zmc2V0LCB1cmkpOwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZENvbXBvdW5kQXNzaWdubWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLCBFeHByZXNzaW9uIHZhbHVlLAogICAgICB7aW50IG9mZnNldDogVHJlZU5vZGUubm9PZmZzZXQsCiAgICAgIGJvb2wgdm9pZENvbnRleHQ6IGZhbHNlLAogICAgICBQcm9jZWR1cmUgaW50ZXJmYWNlVGFyZ2V0LAogICAgICBib29sIGlzUHJlSW5jRGVjOiBmYWxzZSwKICAgICAgYm9vbCBpc1Bvc3RJbmNEZWM6IGZhbHNlfSkgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKAogICAgICAgICJidWlsZENvbXBvdW5kQXNzaWdubWVudCIsIG9mZnNldCA/PyBvZmZzZXRGb3JUb2tlbih0b2tlbiksIHVyaSk7CiAgfQoKICBFeHByZXNzaW9uIGJ1aWxkUHJlZml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwKICAgICAgYm9vbCB2b2lkQ29udGV4dDogZmFsc2UsCiAgICAgIFByb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXR9KSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoCiAgICAgICAgImJ1aWxkUHJlZml4SW5jcmVtZW50Iiwgb2Zmc2V0ID8/IG9mZnNldEZvclRva2VuKHRva2VuKSwgdXJpKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRQb3N0Zml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwKICAgICAgYm9vbCB2b2lkQ29udGV4dDogZmFsc2UsCiAgICAgIFByb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXR9KSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoCiAgICAgICAgImJ1aWxkUG9zdGZpeEluY3JlbWVudCIsIG9mZnNldCA/PyBvZmZzZXRGb3JUb2tlbih0b2tlbiksIHVyaSk7CiAgfQoKICBFeHByZXNzaW9uIGRvSW52b2NhdGlvbihpbnQgb2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoImRvSW52b2NhdGlvbiIsIG9mZnNldCwgdXJpKTsKICB9Cn0KCmNsYXNzIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uR2VuZXJhdG9yIGV4dGVuZHMgS2VybmVsUmVhZE9ubHlBY2Nlc3NHZW5lcmF0b3IgewogIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sIEV4cHJlc3Npb24gZXhwcmVzc2lvbikKICAgICAgOiBzdXBlcihoZWxwZXIsIHRva2VuLCBleHByZXNzaW9uLCBudWxsKTsKCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uR2VuZXJhdG9yIjsKCiAgQG92ZXJyaWRlCiAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBzdGFydENvbXBsZXhBc3NpZ25tZW50KEV4cHJlc3Npb24gcmhzKSB7CiAgICByZXR1cm4gc2hhZG93LlN5bnRoZXRpY1dyYXBwZXIud3JhcElsbGVnYWxBc3NpZ25tZW50KHJocywKICAgICAgICBhc3NpZ25tZW50T2Zmc2V0OiBvZmZzZXRGb3JUb2tlbih0b2tlbikpOwogIH0KCiAgRXhwcmVzc2lvbiBtYWtlSW52YWxpZFdyaXRlKEV4cHJlc3Npb24gdmFsdWUpIHsKICAgIHJldHVybiBoZWxwZXIud3JhcEludmFsaWRXcml0ZSgKICAgICAgICBoZWxwZXIuZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgbWVzc2FnZUNhbm5vdEFzc2lnblRvUGFyZW50aGVzaXplZEV4cHJlc3Npb24sCiAgICAgICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSwKICAgICAgICAgICAgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKSksCiAgICAgICAgZXhwcmVzc2lvbiwKICAgICAgICBvZmZzZXRGb3JUb2tlbih0b2tlbikpOwogIH0KfQqBsABOTjwBTwQcLwRMTk8ESz4sATQcIQEWAUUzHR4BIEklBAExASEUIDEPLQgNOzkGBAFOMSBMHxkEAQxKOjhEBAEXTBsqLTgZG0QIQwYwLwZJJ0shHEYfCE02Ng0WTxUxFDkYEhQVDzAUOBgSFBUIBgQBMhlLGk4NK0QhBgQBKzRQHB8yRw0YTRkzLSNMBhtMKT1RGRYgIRQaKzINUQYEAUwjBAEnMyMjBAFMJh8hHyMjBAE3Jh8kIwQBOCYfJCMEASZCQx8YBAEMIiUfHxkEAgFBEwEbQB4BSQEjAQwiHBsEAgE/KBkBHEMkAS8BNgEMLUIbGiYmBjkEAQw5AQwhRCwEAQwiHyMEAgEnPAwdARdQJR8EASwBMQEhRwQBTEcEAVEhTgYpSiMEASczI0EEAUwmHyEfIxhKBAE3Jh8kGEcEATgmHyQYSAQBPTUEAQwiGSEaGB8NGAYEAgFKJUAkASwBPwEhRwQBTEcEAVEhTgYpUQQBJzMjQQQBTCYfIR8jGEoEATcmHyQYRwQBOCYfJBhIBAE9NQQCAU8kTDABPgEMRT4yBAEyJD86IyUUIAQCAUhwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF9leHByZXNzaW9uX2dlbmVyYXRvcl9pbXBsLmRhcnQ1c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2lkZW50aWZpZXJzLmRhcnSPRS8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnF1YWxpZmllZF9uYW1lOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBFeHByZXNzaW9uOwoKaW1wb3J0ICdwcm9ibGVtcy5kYXJ0JyBzaG93IHVuaGFuZGxlZCwgdW5zdXBwb3J0ZWQ7CgppbXBvcnQgJ3NjYW5uZXIuZGFydCcgc2hvdyBUb2tlbjsKCmNsYXNzIElkZW50aWZpZXIgewogIGZpbmFsIFN0cmluZyBuYW1lOwogIGZpbmFsIGludCBjaGFyT2Zmc2V0OwoKICBJZGVudGlmaWVyKFRva2VuIHRva2VuKQogICAgICA6IG5hbWUgPSB0b2tlbi5sZXhlbWUsCiAgICAgICAgY2hhck9mZnNldCA9IHRva2VuLmNoYXJPZmZzZXQ7CgogIElkZW50aWZpZXIuXyh0aGlzLm5hbWUsIHRoaXMuY2hhck9mZnNldCk7CgogIGZhY3RvcnkgSWRlbnRpZmllci5wcmVzZXJ2ZVRva2VuKFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gbmV3IF9Ub2tlbklkZW50aWZpZXIodG9rZW4pOwogIH0KCiAgRXhwcmVzc2lvbiBnZXQgaW5pdGlhbGl6ZXIgPT4gbnVsbDsKCiAgaW50IGdldCBlbmRDaGFyT2Zmc2V0ID0+IGNoYXJPZmZzZXQgKyBuYW1lLmxlbmd0aDsKCiAgUXVhbGlmaWVkTmFtZSB3aXRoUXVhbGlmaWVyKE9iamVjdCBxdWFsaWZpZXIpIHsKICAgIHJldHVybiBuZXcgUXVhbGlmaWVkTmFtZS5fKHF1YWxpZmllciwgbmFtZSwgY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiaWRlbnRpZmllcigkbmFtZSkiOwp9CgpjbGFzcyBfVG9rZW5JZGVudGlmaWVyIGltcGxlbWVudHMgSWRlbnRpZmllciB7CiAgZmluYWwgVG9rZW4gdG9rZW47CgogIF9Ub2tlbklkZW50aWZpZXIodGhpcy50b2tlbik7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgbmFtZSA9PiB0b2tlbi5sZXhlbWU7CgogIEBvdmVycmlkZQogIGludCBnZXQgY2hhck9mZnNldCA9PiB0b2tlbi5jaGFyT2Zmc2V0OwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGdldCBpbml0aWFsaXplciA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGVuZENoYXJPZmZzZXQgPT4gY2hhck9mZnNldCArIG5hbWUubGVuZ3RoOwoKICBAb3ZlcnJpZGUKICBRdWFsaWZpZWROYW1lIHdpdGhRdWFsaWZpZXIoT2JqZWN0IHF1YWxpZmllcikgewogICAgcmV0dXJuIG5ldyBfVG9rZW5RdWFsaWZpZWROYW1lKHF1YWxpZmllciwgdG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gInRva2VuLWlkZW50aWZpZXIoJG5hbWUpIjsKfQoKY2xhc3MgSW5pdGlhbGl6ZWRJZGVudGlmaWVyIGV4dGVuZHMgX1Rva2VuSWRlbnRpZmllciB7CiAgQG92ZXJyaWRlCiAgZmluYWwgRXhwcmVzc2lvbiBpbml0aWFsaXplcjsKCiAgSW5pdGlhbGl6ZWRJZGVudGlmaWVyKF9Ub2tlbklkZW50aWZpZXIgaWRlbnRpZmllciwgdGhpcy5pbml0aWFsaXplcikKICAgICAgOiBzdXBlcihpZGVudGlmaWVyLnRva2VuKTsKCiAgQG92ZXJyaWRlCiAgUXVhbGlmaWVkTmFtZSB3aXRoUXVhbGlmaWVyKE9iamVjdCBxdWFsaWZpZXIpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgid2l0aFF1YWxpZmllciIsIGNoYXJPZmZzZXQsIG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gImluaXRpYWxpemVkLWlkZW50aWZpZXIoJG5hbWUsICRpbml0aWFsaXplcikiOwp9CgpjbGFzcyBRdWFsaWZpZWROYW1lIGV4dGVuZHMgSWRlbnRpZmllciB7CiAgZmluYWwgT2JqZWN0IHF1YWxpZmllcjsKCiAgUXVhbGlmaWVkTmFtZSh0aGlzLnF1YWxpZmllciwgVG9rZW4gc3VmZml4KSA6IHN1cGVyKHN1ZmZpeCk7CgogIFF1YWxpZmllZE5hbWUuXyh0aGlzLnF1YWxpZmllciwgU3RyaW5nIG5hbWUsIGludCBjaGFyT2Zmc2V0KQogICAgICA6IHN1cGVyLl8obmFtZSwgY2hhck9mZnNldCk7CgogIEBvdmVycmlkZQogIFF1YWxpZmllZE5hbWUgd2l0aFF1YWxpZmllcihPYmplY3QgcXVhbGlmaWVyKSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoIndpdGhRdWFsaWZpZXIiLCBjaGFyT2Zmc2V0LCBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICJxdWFsaWZpZWQtbmFtZSgkcXVhbGlmaWVyLCAkbmFtZSkiOwp9CgpjbGFzcyBfVG9rZW5RdWFsaWZpZWROYW1lIGV4dGVuZHMgX1Rva2VuSWRlbnRpZmllciBpbXBsZW1lbnRzIFF1YWxpZmllZE5hbWUgewogIEBvdmVycmlkZQogIGZpbmFsIE9iamVjdCBxdWFsaWZpZXI7CgogIF9Ub2tlblF1YWxpZmllZE5hbWUodGhpcy5xdWFsaWZpZXIsIFRva2VuIHN1ZmZpeCkKICAgICAgOiBhc3NlcnQocXVhbGlmaWVyIGlzISBJZGVudGlmaWVyIHx8IHF1YWxpZmllciBpcyBfVG9rZW5JZGVudGlmaWVyKSwKICAgICAgICBzdXBlcihzdWZmaXgpOwoKICBAb3ZlcnJpZGUKICBRdWFsaWZpZWROYW1lIHdpdGhRdWFsaWZpZXIoT2JqZWN0IHF1YWxpZmllcikgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCJ3aXRoUXVhbGlmaWVyIiwgY2hhck9mZnNldCwgbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAidG9rZW4tcXVhbGlmaWVkLW5hbWUoJHF1YWxpZmllciwgJG5hbWUpIjsKfQoKdm9pZCBmbGF0dGVuUXVhbGlmaWVkTmFtZU9uKAogICAgUXVhbGlmaWVkTmFtZSBuYW1lLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpIHsKICBmaW5hbCBPYmplY3QgcXVhbGlmaWVyID0gbmFtZS5xdWFsaWZpZXI7CiAgaWYgKHF1YWxpZmllciBpcyBRdWFsaWZpZWROYW1lKSB7CiAgICBmbGF0dGVuUXVhbGlmaWVkTmFtZU9uKHF1YWxpZmllciwgYnVmZmVyLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICB9IGVsc2UgaWYgKHF1YWxpZmllciBpcyBJZGVudGlmaWVyKSB7CiAgICBidWZmZXIud3JpdGUocXVhbGlmaWVyLm5hbWUpOwogIH0gZWxzZSBpZiAocXVhbGlmaWVyIGlzIFN0cmluZykgewogICAgYnVmZmVyLndyaXRlKHF1YWxpZmllcik7CiAgfSBlbHNlIHsKICAgIHVuaGFuZGxlZCgiJHtxdWFsaWZpZXIucnVudGltZVR5cGV9IiwgImZsYXR0ZW5RdWFsaWZpZWROYW1lT24iLCBjaGFyT2Zmc2V0LAogICAgICAgIGZpbGVVcmkpOwogIH0KICBidWZmZXIud3JpdGUoIi4iKTsKICBidWZmZXIud3JpdGUobmFtZS5uYW1lKTsKfQoKU3RyaW5nIGZsYXR0ZW5OYW1lKE9iamVjdCBuYW1lLCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpIHsKICBpZiAobmFtZSBpcyBTdHJpbmcpIHsKICAgIHJldHVybiBuYW1lOwogIH0gZWxzZSBpZiAobmFtZSBpcyBRdWFsaWZpZWROYW1lKSB7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgZmxhdHRlblF1YWxpZmllZE5hbWVPbihuYW1lLCBidWZmZXIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgcmV0dXJuICIkYnVmZmVyIjsKICB9IGVsc2UgaWYgKG5hbWUgaXMgSWRlbnRpZmllcikgewogICAgcmV0dXJuIG5hbWUubmFtZTsKICB9IGVsc2UgewogICAgcmV0dXJuIHVuaGFuZGxlZCgiJHtuYW1lLnJ1bnRpbWVUeXBlfSIsICJmbGF0dGVuTmFtZSIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogIH0KfQoKVG9rZW4gZGVwcmVjYXRlZF9leHRyYWN0VG9rZW4oSWRlbnRpZmllciBpZGVudGlmaWVyKSB7CiAgX1Rva2VuSWRlbnRpZmllciB0b2tlbklkZW50aWZpZXIgPSBpZGVudGlmaWVyOwogIHJldHVybiB0b2tlbklkZW50aWZpZXI/LnRva2VuOwp9CoCXAE5OPAEeATIBNAEiARMVGAEaHScBLAEyKAQBJgE1ATI9BAEMLAIBLxUBIAEMIwEMKgEMJgEMNQEMMjYEAQwyAgE3DCABRyEBDDI7BAEMRgIBKRoBPwE/IwEMMjsEAQw8AgFODBoBNEsXAQwyOwQBDEICAR1MKyREKCIkHQtQEgQVGwIBPxgRJi4/FiMWC1EEAgE3MSECASxwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvaWRlbnRpZmllcnMuZGFydEZzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9idWlsdGluX3R5cGVfYnVpbGRlci5kYXJ0g0AvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5idWlsdGluX3R5cGVfYnVpbGRlcjsKCmltcG9ydCAnYnVpbGRlci5kYXJ0JyBzaG93IExpYnJhcnlCdWlsZGVyLCBUeXBlQnVpbGRlciwgVHlwZURlY2xhcmF0aW9uQnVpbGRlcjsKCmFic3RyYWN0IGNsYXNzIEJ1aWx0aW5UeXBlQnVpbGRlcjxUIGV4dGVuZHMgVHlwZUJ1aWxkZXIsIFI+CiAgICBleHRlbmRzIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXI8VCwgUj4gewogIGZpbmFsIFIgdHlwZTsKCiAgQnVpbHRpblR5cGVCdWlsZGVyKAogICAgICBTdHJpbmcgbmFtZSwgdGhpcy50eXBlLCBMaWJyYXJ5QnVpbGRlciBjb21waWxhdGlvblVuaXQsIGludCBjaGFyT2Zmc2V0KQogICAgICA6IHN1cGVyKG51bGwsIDAsIG5hbWUsIGNvbXBpbGF0aW9uVW5pdCwgY2hhck9mZnNldCk7CgogIFIgYnVpbGRUeXBlKExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIExpc3Q8VD4gYXJndW1lbnRzKSA9PiB0eXBlOwoKICBSIGJ1aWxkVHlwZXNXaXRoQnVpbHRBcmd1bWVudHMoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgTGlzdDxSPiBhcmd1bWVudHMpIHsKICAgIHJldHVybiB0eXBlOwogIH0KCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIkJ1aWx0aW5UeXBlQnVpbGRlciI7Cn0KGgBOTjwBJAFQATwrEAEWTjsBQgFOEQQBMAIBPXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2J1aWx0aW5fdHlwZV9idWlsZGVyLmRhcnQ/c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvY2xhc3NfYnVpbGRlci5kYXJ0lNYvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5jbGFzc19idWlsZGVyOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IGludGVybmFsUHJvYmxlbTsKCmltcG9ydCAnYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlciwKICAgICAgICBEZWNsYXJhdGlvbiwKICAgICAgICBMaWJyYXJ5QnVpbGRlciwKICAgICAgICBNZW1iZXJCdWlsZGVyLAogICAgICAgIE1ldGFkYXRhQnVpbGRlciwKICAgICAgICBTY29wZSwKICAgICAgICBTY29wZUJ1aWxkZXIsCiAgICAgICAgVHlwZUJ1aWxkZXIsCiAgICAgICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciwKICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdyBMb2NhdGVkTWVzc2FnZSwgTWVzc2FnZSwgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZEluOwoKYWJzdHJhY3QgY2xhc3MgQ2xhc3NCdWlsZGVyPFQgZXh0ZW5kcyBUeXBlQnVpbGRlciwgUj4KICAgIGV4dGVuZHMgVHlwZURlY2xhcmF0aW9uQnVpbGRlcjxULCBSPiB7CiAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzOwoKICBUIHN1cGVydHlwZTsKCiAgTGlzdDxUPiBpbnRlcmZhY2VzOwoKICBmaW5hbCBTY29wZSBzY29wZTsKCiAgZmluYWwgU2NvcGUgY29uc3RydWN0b3JzOwoKICBmaW5hbCBTY29wZUJ1aWxkZXIgc2NvcGVCdWlsZGVyOwoKICBmaW5hbCBTY29wZUJ1aWxkZXIgY29uc3RydWN0b3JTY29wZUJ1aWxkZXI7CgogIE1hcDxTdHJpbmcsIENvbnN0cnVjdG9yUmVkaXJlY3Rpb24+IHJlZGlyZWN0aW5nQ29uc3RydWN0b3JzOwoKICBDbGFzc0J1aWxkZXIoCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIHRoaXMudHlwZVZhcmlhYmxlcywKICAgICAgdGhpcy5zdXBlcnR5cGUsCiAgICAgIHRoaXMuaW50ZXJmYWNlcywKICAgICAgdGhpcy5zY29wZSwKICAgICAgdGhpcy5jb25zdHJ1Y3RvcnMsCiAgICAgIExpYnJhcnlCdWlsZGVyIHBhcmVudCwKICAgICAgaW50IGNoYXJPZmZzZXQpCiAgICAgIDogc2NvcGVCdWlsZGVyID0gbmV3IFNjb3BlQnVpbGRlcihzY29wZSksCiAgICAgICAgY29uc3RydWN0b3JTY29wZUJ1aWxkZXIgPSBuZXcgU2NvcGVCdWlsZGVyKGNvbnN0cnVjdG9ycyksCiAgICAgICAgc3VwZXIobWV0YWRhdGEsIG1vZGlmaWVycywgbmFtZSwgcGFyZW50LCBjaGFyT2Zmc2V0KTsKCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIkNsYXNzQnVpbGRlciI7CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBjbGFzcyBpcyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIGEgbWl4aW4gdG8gaXRzCiAgLy8vIHN1cGVyY2xhc3MuCiAgYm9vbCBnZXQgaXNNaXhpbkFwcGxpY2F0aW9uID0+IG1peGVkSW5UeXBlICE9IG51bGw7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTmFtZWRNaXhpbkFwcGxpY2F0aW9uIHsKICAgIHJldHVybiBpc01peGluQXBwbGljYXRpb24gJiYgc3VwZXIuaXNOYW1lZE1peGluQXBwbGljYXRpb247CiAgfQoKICBUIGdldCBtaXhlZEluVHlwZTsKCiAgdm9pZCBzZXQgbWl4ZWRJblR5cGUoVCBtaXhpbik7CgogIExpc3Q8Q29uc3RydWN0b3JSZWZlcmVuY2VCdWlsZGVyPiBnZXQgY29uc3RydWN0b3JSZWZlcmVuY2VzID0+IG51bGw7CgogIExpYnJhcnlCdWlsZGVyIGdldCBsaWJyYXJ5IHsKICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkgPSBwYXJlbnQ7CiAgICByZXR1cm4gbGlicmFyeS5wYXJ0T2ZMaWJyYXJ5ID8/IGxpYnJhcnk7CiAgfQoKICAvLy8gUmVnaXN0ZXJzIGEgY29uc3RydWN0b3IgcmVkaXJlY3Rpb24gZm9yIHRoaXMgY2xhc3MgYW5kIHJldHVybnMgdHJ1ZSBpZgogIC8vLyB0aGlzIHJlZGlyZWN0aW9uIGdpdmVzIHJpc2UgdG8gYSBjeWNsZSB0aGF0IGhhcyBub3QgYmVlbiByZXBvcnRlZCBiZWZvcmUuCiAgYm9vbCBjaGVja0NvbnN0cnVjdG9yQ3ljbGljKFN0cmluZyBzb3VyY2UsIFN0cmluZyB0YXJnZXQpIHsKICAgIENvbnN0cnVjdG9yUmVkaXJlY3Rpb24gcmVkaXJlY3QgPSBuZXcgQ29uc3RydWN0b3JSZWRpcmVjdGlvbih0YXJnZXQpOwogICAgcmVkaXJlY3RpbmdDb25zdHJ1Y3RvcnMgPz89IDxTdHJpbmcsIENvbnN0cnVjdG9yUmVkaXJlY3Rpb24+e307CiAgICByZWRpcmVjdGluZ0NvbnN0cnVjdG9yc1tzb3VyY2VdID0gcmVkaXJlY3Q7CiAgICB3aGlsZSAocmVkaXJlY3QgIT0gbnVsbCkgewogICAgICBpZiAocmVkaXJlY3QuY3ljbGVSZXBvcnRlZCkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAocmVkaXJlY3QudGFyZ2V0ID09IHNvdXJjZSkgewogICAgICAgIHJlZGlyZWN0LmN5Y2xlUmVwb3J0ZWQgPSB0cnVlOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHJlZGlyZWN0ID0gcmVkaXJlY3RpbmdDb25zdHJ1Y3RvcnNbcmVkaXJlY3QudGFyZ2V0XTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGludCByZXNvbHZlQ29uc3RydWN0b3JzKExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgIGlmIChjb25zdHJ1Y3RvclJlZmVyZW5jZXMgPT0gbnVsbCkgcmV0dXJuIDA7CiAgICBmb3IgKENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlciByZWYgaW4gY29uc3RydWN0b3JSZWZlcmVuY2VzKSB7CiAgICAgIHJlZi5yZXNvbHZlSW4oc2NvcGUsIGxpYnJhcnkpOwogICAgfQogICAgcmV0dXJuIGNvbnN0cnVjdG9yUmVmZXJlbmNlcy5sZW5ndGg7CiAgfQoKICAvLy8gVXNlZCB0byBsb29rdXAgYSBzdGF0aWMgbWVtYmVyIG9mIHRoaXMgY2xhc3MuCiAgRGVjbGFyYXRpb24gZmluZFN0YXRpY0J1aWxkZXIoCiAgICAgIFN0cmluZyBuYW1lLCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmksIExpYnJhcnlCdWlsZGVyIGFjY2Vzc2luZ0xpYnJhcnksCiAgICAgIHtib29sIGlzU2V0dGVyOiBmYWxzZX0pIHsKICAgIGlmIChhY2Nlc3NpbmdMaWJyYXJ5Lm9yaWdpbiAhPSBsaWJyYXJ5Lm9yaWdpbiAmJiBuYW1lLnN0YXJ0c1dpdGgoIl8iKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gaXNTZXR0ZXIKICAgICAgICA/IHNjb3BlLmxvb2t1cFNldHRlcihuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpLCBpc0luc3RhbmNlU2NvcGU6IGZhbHNlKQogICAgICAgIDogc2NvcGUubG9va3VwKG5hbWUsIGNoYXJPZmZzZXQsIGZpbGVVcmksIGlzSW5zdGFuY2VTY29wZTogZmFsc2UpOwogICAgcmV0dXJuIGRlY2xhcmF0aW9uOwogIH0KCiAgRGVjbGFyYXRpb24gZmluZENvbnN0cnVjdG9yT3JGYWN0b3J5KAogICAgICBTdHJpbmcgbmFtZSwgaW50IGNoYXJPZmZzZXQsIFVyaSB1cmksIExpYnJhcnlCdWlsZGVyIGFjY2Vzc2luZ0xpYnJhcnkpIHsKICAgIGlmIChhY2Nlc3NpbmdMaWJyYXJ5Lm9yaWdpbiAhPSBsaWJyYXJ5Lm9yaWdpbiAmJiBuYW1lLnN0YXJ0c1dpdGgoIl8iKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBjb25zdHJ1Y3RvcnMubG9va3VwKG5hbWUsIGNoYXJPZmZzZXQsIHVyaSk7CiAgfQoKICB2b2lkIGZvckVhY2godm9pZCBmKFN0cmluZyBuYW1lLCBNZW1iZXJCdWlsZGVyIGJ1aWxkZXIpKSB7CiAgICBzY29wZS5mb3JFYWNoKGYpOwogIH0KCiAgLy8vIERvbid0IHVzZSBmb3Igc2NvcGUgbG9va3VwLiBPbmx5IHVzZSB3aGVuIGFuIGVsZW1lbnQgaXMga25vd24gdG8gZXhpc3QKICAvLy8gKGFuZCBpc24ndCBhIHNldHRlcikuCiAgTWVtYmVyQnVpbGRlciBvcGVyYXRvciBbXShTdHJpbmcgbmFtZSkgewogICAgLy8gVE9ETyhhaGUpOiBSZW5hbWUgdGhpcyB0byBnZXRMb2NhbE1lbWJlci4KICAgIHJldHVybiBzY29wZS5sb2NhbFtuYW1lXSA/PwogICAgICAgIGludGVybmFsUHJvYmxlbSgKICAgICAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZEluLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICBuYW1lLCBmdWxsTmFtZUZvckVycm9ycyksCiAgICAgICAgICAgIC0xLAogICAgICAgICAgICBudWxsKTsKICB9CgogIHZvaWQgYWRkUHJvYmxlbShNZXNzYWdlIG1lc3NhZ2UsIGludCBjaGFyT2Zmc2V0LCBpbnQgbGVuZ3RoLAogICAgICB7Ym9vbCB3YXNIYW5kbGVkOiBmYWxzZSwgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dH0pIHsKICAgIGxpYnJhcnkuYWRkUHJvYmxlbShtZXNzYWdlLCBjaGFyT2Zmc2V0LCBsZW5ndGgsIGZpbGVVcmksCiAgICAgICAgd2FzSGFuZGxlZDogd2FzSGFuZGxlZCwgY29udGV4dDogY29udGV4dCk7CiAgfQoKICAvLy8gRmluZCB0aGUgZmlyc3QgbWVtYmVyIG9mIHRoaXMgY2xhc3Mgd2l0aCBbbmFtZV0uIFRoaXMgbWV0aG9kIGlzbid0CiAgLy8vIHN1aXRhYmxlIGZvciBzY29wZSBsb29rdXBzIGFzIGl0IHdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIG5hbWUgaXNuJ3QKICAvLy8gZGVjbGFyZWQuIFRoZSBbc2NvcGVdIHNob3VsZCBiZSB1c2VkIGZvciB0aGF0LiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvCiAgLy8vIGZpbmQgYSBtZW1iZXIgdGhhdCBpcyBrbm93biB0byBleGlzdCBhbmQgaXQgd2lsIHBpY2sgdGhlIGZpcnN0CiAgLy8vIGRlY2xhcmF0aW9uIGlmIHRoZSBuYW1lIGlzIGFtYmlndW91cy4KICAvLy8KICAvLy8gRm9yIGV4YW1wbGUsIHRoaXMgbWV0aG9kIGlzIGNvbnZlbmllbnQgZm9yIHVzZSB3aGVuIGJ1aWxkaW5nIHN5bnRoZXRpYwogIC8vLyBtZW1iZXJzLCBzdWNoIGFzIHRob3NlIG9mIGFuIGVudW0uCiAgTWVtYmVyQnVpbGRlciBmaXJzdE1lbWJlck5hbWVkKFN0cmluZyBuYW1lKSB7CiAgICBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IHRoaXNbbmFtZV07CiAgICB3aGlsZSAoZGVjbGFyYXRpb24ubmV4dCAhPSBudWxsKSB7CiAgICAgIGRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb24ubmV4dDsKICAgIH0KICAgIHJldHVybiBkZWNsYXJhdGlvbjsKICB9Cn0KCmNsYXNzIENvbnN0cnVjdG9yUmVkaXJlY3Rpb24gewogIFN0cmluZyB0YXJnZXQ7CiAgYm9vbCBjeWNsZVJlcG9ydGVkOwoKICBDb25zdHJ1Y3RvclJlZGlyZWN0aW9uKHRoaXMudGFyZ2V0KSA6IGN5Y2xlUmVwb3J0ZWQgPSBmYWxzZTsKfQqArQBOTjwBHQEwARYJJRUYFxkPFhUgHQEdRQE2KysBDwEWARUBHAEjAS4BPwEQJhUTGhYXEhkdFjBCPgEqAUoSNgEMJUAEARUBIQFHAR8lLQQBTVA+SkQwHzAnJxUIOwYSBAEMNDFFJQYpBAE0IVEgTRMGJ1BLGAQBKE9NEwY3BAE9FgQBTRwrMSAZPSoQEwQBP0A9MwQBSU1MRSwGTSkwKicmBhgEAgEfERYBPwIBNnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2NsYXNzX2J1aWxkZXIuZGFydE9zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9jb25zdHJ1Y3Rvcl9yZWZlcmVuY2VfYnVpbGRlci5kYXJ0iPsvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5jb25zdHJ1Y3Rvcl9yZWZlcmVuY2VfYnVpbGRlcjsKCmltcG9ydCAnLi4vbWVzc2FnZXMuZGFydCcgc2hvdyBub0xlbmd0aCwgdGVtcGxhdGVDb25zdHJ1Y3Rvck5vdEZvdW5kOwoKaW1wb3J0ICdidWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgQ2xhc3NCdWlsZGVyLAogICAgICAgIERlY2xhcmF0aW9uLAogICAgICAgIExpYnJhcnlCdWlsZGVyLAogICAgICAgIFByZWZpeEJ1aWxkZXIsCiAgICAgICAgUXVhbGlmaWVkTmFtZSwKICAgICAgICBTY29wZSwKICAgICAgICBUeXBlQnVpbGRlciwKICAgICAgICBmbGF0dGVuTmFtZTsKCmNsYXNzIENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlciB7CiAgZmluYWwgaW50IGNoYXJPZmZzZXQ7CgogIGZpbmFsIFVyaSBmaWxlVXJpOwoKICBmaW5hbCBPYmplY3QgbmFtZTsKCiAgZmluYWwgTGlzdDxUeXBlQnVpbGRlcj4gdHlwZUFyZ3VtZW50czsKCiAgLy8vIFRoaXMgaXMgdGhlIG5hbWUgb2YgYSBuYW1lZCBjb25zdHJ1Y3Rvci4gQXMgYGJhcmAgaW4gYG5ldyBGb288VD4uYmFyKClgLgogIGZpbmFsIFN0cmluZyBzdWZmaXg7CgogIERlY2xhcmF0aW9uIHRhcmdldDsKCiAgQ29uc3RydWN0b3JSZWZlcmVuY2VCdWlsZGVyKHRoaXMubmFtZSwgdGhpcy50eXBlQXJndW1lbnRzLCB0aGlzLnN1ZmZpeCwKICAgICAgRGVjbGFyYXRpb24gcGFyZW50LCB0aGlzLmNoYXJPZmZzZXQpCiAgICAgIDogZmlsZVVyaSA9IHBhcmVudC5maWxlVXJpOwoKICBTdHJpbmcgZ2V0IGZ1bGxOYW1lRm9yRXJyb3JzIHsKICAgIHJldHVybiAiJHtmbGF0dGVuTmFtZShuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKX0iCiAgICAgICAgIiR7c3VmZml4ID09IG51bGwgPyAnJyA6ICcuJHN1ZmZpeCd9IjsKICB9CgogIHZvaWQgcmVzb2x2ZUluKFNjb3BlIHNjb3BlLCBMaWJyYXJ5QnVpbGRlciBhY2Nlc3NpbmdMaWJyYXJ5KSB7CiAgICBmaW5hbCBuYW1lID0gdGhpcy5uYW1lOwogICAgRGVjbGFyYXRpb24gZGVjbGFyYXRpb247CiAgICBpZiAobmFtZSBpcyBRdWFsaWZpZWROYW1lKSB7CiAgICAgIFN0cmluZyBwcmVmaXggPSBuYW1lLnF1YWxpZmllcjsKICAgICAgU3RyaW5nIG1pZGRsZSA9IG5hbWUubmFtZTsKICAgICAgZGVjbGFyYXRpb24gPSBzY29wZS5sb29rdXAocHJlZml4LCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgICAgaWYgKGRlY2xhcmF0aW9uIGlzIFByZWZpeEJ1aWxkZXIpIHsKICAgICAgICBQcmVmaXhCdWlsZGVyIHByZWZpeCA9IGRlY2xhcmF0aW9uOwogICAgICAgIGRlY2xhcmF0aW9uID0gcHJlZml4Lmxvb2t1cChtaWRkbGUsIG5hbWUuY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24gaXMgQ2xhc3NCdWlsZGVyKSB7CiAgICAgICAgQ2xhc3NCdWlsZGVyIGNscyA9IGRlY2xhcmF0aW9uOwogICAgICAgIGRlY2xhcmF0aW9uID0gY2xzLmZpbmRDb25zdHJ1Y3Rvck9yRmFjdG9yeSgKICAgICAgICAgICAgbWlkZGxlLCBuYW1lLmNoYXJPZmZzZXQsIGZpbGVVcmksIGFjY2Vzc2luZ0xpYnJhcnkpOwogICAgICAgIGlmIChzdWZmaXggPT0gbnVsbCkgewogICAgICAgICAgdGFyZ2V0ID0gZGVjbGFyYXRpb247CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBkZWNsYXJhdGlvbiA9IHNjb3BlLmxvb2t1cChuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgIH0KICAgIGlmIChkZWNsYXJhdGlvbiBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgdGFyZ2V0ID0gZGVjbGFyYXRpb24uZmluZENvbnN0cnVjdG9yT3JGYWN0b3J5KAogICAgICAgICAgc3VmZml4ID8/ICIiLCBjaGFyT2Zmc2V0LCBmaWxlVXJpLCBhY2Nlc3NpbmdMaWJyYXJ5KTsKICAgIH0KICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgewogICAgICBhY2Nlc3NpbmdMaWJyYXJ5LmFkZFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZUNvbnN0cnVjdG9yTm90Rm91bmQud2l0aEFyZ3VtZW50cyhmdWxsTmFtZUZvckVycm9ycyksCiAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgICBmaWxlVXJpKTsKICAgIH0KICB9Cn0KTwBOTjwBLQFGARYJFhUYFxcPFRUBJBgBFQEVASkBTxcBFgFKKyIBITcvBAFBHB0hJiE/KixHMCg0QR4gEgoIDT0GJzVABhojSBYUFAYEAgFGcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvY29uc3RydWN0b3JfcmVmZXJlbmNlX2J1aWxkZXIuZGFydD1zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9kZWNsYXJhdGlvbi5kYXJ0iAcvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5kZWNsYXJhdGlvbjsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyB1bnN1cHBvcnRlZDsKCmFic3RyYWN0IGNsYXNzIERlY2xhcmF0aW9uIHsKICAvLy8gVXNlZCB3aGVuIG11bHRpcGxlIHRoaW5ncyB3aXRoIHRoZSBzYW1lIG5hbWUgYXJlIGRlY2xhcmVkIHdpdGhpbiB0aGUgc2FtZQogIC8vLyBwYXJlbnQuIE9ubHkgdXNlZCBmb3IgdG9wLWxldmVsIGFuZCBjbGFzcy1tZW1iZXIgZGVjbGFyYXRpb25zLCBub3QgZm9yCiAgLy8vIGJsb2NrIHNjb3Blcy4KICBEZWNsYXJhdGlvbiBuZXh0OwoKICBEZWNsYXJhdGlvbigpOwoKICBEZWNsYXJhdGlvbiBnZXQgcGFyZW50OwoKICBVcmkgZ2V0IGZpbGVVcmk7CgogIGludCBnZXQgY2hhck9mZnNldDsKCiAgZ2V0IHRhcmdldCA9PiB1bnN1cHBvcnRlZCgiJHtydW50aW1lVHlwZX0udGFyZ2V0IiwgY2hhck9mZnNldCwgZmlsZVVyaSk7CgogIERlY2xhcmF0aW9uIGdldCBvcmlnaW4gPT4gdGhpczsKCiAgU3RyaW5nIGdldCBmdWxsTmFtZUZvckVycm9yczsKCiAgYm9vbCBnZXQgaGFzUHJvYmxlbSA9PiBmYWxzZTsKCiAgYm9vbCBnZXQgaXNDb25zdCA9PiBmYWxzZTsKCiAgYm9vbCBnZXQgaXNDb25zdHJ1Y3RvciA9PiBmYWxzZTsKCiAgYm9vbCBnZXQgaXNGYWN0b3J5ID0+IGZhbHNlOwoKICBib29sIGdldCBpc0ZpZWxkID0+IGZhbHNlOwoKICBib29sIGdldCBpc0ZpbmFsID0+IGZhbHNlOwoKICBib29sIGdldCBpc0dldHRlciA9PiBmYWxzZTsKCiAgYm9vbCBnZXQgaXNJbnN0YW5jZU1lbWJlciA9PiBmYWxzZTsKCiAgYm9vbCBnZXQgaXNMb2NhbCA9PiBmYWxzZTsKCiAgYm9vbCBnZXQgaXNQYXRjaCA9PiB0aGlzICE9IG9yaWdpbjsKCiAgYm9vbCBnZXQgaXNSZWd1bGFyTWV0aG9kID0+IGZhbHNlOwoKICBib29sIGdldCBpc1NldHRlciA9PiBmYWxzZTsKCiAgYm9vbCBnZXQgaXNTdGF0aWMgPT4gZmFsc2U7CgogIGJvb2wgZ2V0IGlzU3ludGhldGljID0+IGZhbHNlOwoKICBib29sIGdldCBpc1RvcExldmVsID0+IGZhbHNlOwoKICBib29sIGdldCBpc1R5cGVEZWNsYXJhdGlvbiA9PiBmYWxzZTsKCiAgYm9vbCBnZXQgaXNUeXBlVmFyaWFibGUgPT4gZmFsc2U7CgogIGJvb2wgZ2V0IGlzTWl4aW5BcHBsaWNhdGlvbiA9PiBmYWxzZTsKCiAgYm9vbCBnZXQgaXNOYW1lZE1peGluQXBwbGljYXRpb24gPT4gZmFsc2U7CgogIGJvb2wgZ2V0IGlzQW5vbnltb3VzTWl4aW5BcHBsaWNhdGlvbiB7CiAgICByZXR1cm4gaXNNaXhpbkFwcGxpY2F0aW9uICYmICFpc05hbWVkTWl4aW5BcHBsaWNhdGlvbjsKICB9CgogIC8vLyBBcHBsaWVzIFtwYXRjaF0gdG8gdGhpcyBkZWNsYXJhdGlvbi4KICB2b2lkIGFwcGx5UGF0Y2goRGVjbGFyYXRpb24gcGF0Y2gpIHsKICAgIHVuc3VwcG9ydGVkKCIke3J1bnRpbWVUeXBlfS5hcHBseVBhdGNoIiwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhdGNoZXMgdGhhdCB3YXMgZmluaXNoZWQuCiAgaW50IGZpbmlzaFBhdGNoKCkgewogICAgaWYgKCFpc1BhdGNoKSByZXR1cm4gMDsKICAgIHVuc3VwcG9ydGVkKCIke3J1bnRpbWVUeXBlfS5maW5pc2hQYXRjaCIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgcmV0dXJuIDA7CiAgfQoKICAvLy8gUmVzb2x2ZSBjb25zdHJ1Y3RvcnMgKGxvb2t1cCBuYW1lcyBpbiBzY29wZSkgcmVjb3JkZWQgaW4gdGhpcyBidWlsZGVyIGFuZAogIC8vLyByZXR1cm4gdGhlIG51bWJlciBvZiBjb25zdHJ1Y3RvcnMgcmVzb2x2ZWQuCiAgaW50IHJlc29sdmVDb25zdHJ1Y3RvcnMoY292YXJpYW50IERlY2xhcmF0aW9uIHBhcmVudCkgPT4gMDsKfQpYAE5OPAEbASwBHVBNFBQBEQEaARMBFgFLASIBIAEgAR0BIwEfAR0BHQEeASYBHQEmASUBHgEeASEBIAEnASQBKAEtASk7BAErJ0MEATcWHEQOBAFQMj4CATRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9kZWNsYXJhdGlvbi5kYXJ0RnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL2R5bmFtaWNfdHlwZV9idWlsZGVyLmRhcnSCYi8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmR5bmFtaWNfdHlwZV9idWlsZGVyOwoKaW1wb3J0ICdidWlsZGVyLmRhcnQnIHNob3cgTGlicmFyeUJ1aWxkZXIsIFR5cGVCdWlsZGVyLCBCdWlsdGluVHlwZUJ1aWxkZXI7CgpjbGFzcyBEeW5hbWljVHlwZUJ1aWxkZXI8VCBleHRlbmRzIFR5cGVCdWlsZGVyLCBSPgogICAgZXh0ZW5kcyBCdWlsdGluVHlwZUJ1aWxkZXI8VCwgUj4gewogIER5bmFtaWNUeXBlQnVpbGRlcihSIHR5cGUsIExpYnJhcnlCdWlsZGVyIGNvbXBpbGF0aW9uVW5pdCwgaW50IGNoYXJPZmZzZXQpCiAgICAgIDogc3VwZXIoImR5bmFtaWMiLCB0eXBlLCBjb21waWxhdGlvblVuaXQsIGNoYXJPZmZzZXQpOwoKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiRHluYW1pY1R5cGVCdWlsZGVyIjsKfQoRAE5OPAEkAUwBMydNPQEwAgE9cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvZHluYW1pY190eXBlX2J1aWxkZXIuZGFydD5zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9lbnVtX2J1aWxkZXIuZGFydILTLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuZW51bV9idWlsZGVyOwoKaW1wb3J0ICdidWlsZGVyLmRhcnQnIHNob3cgQ2xhc3NCdWlsZGVyLCBNZXRhZGF0YUJ1aWxkZXIsIFR5cGVCdWlsZGVyOwoKYWJzdHJhY3QgY2xhc3MgRW51bUJ1aWxkZXI8VCBleHRlbmRzIFR5cGVCdWlsZGVyLCBSPgogICAgaW1wbGVtZW50cyBDbGFzc0J1aWxkZXI8VCwgUj4gewogIExpc3Q8RW51bUNvbnN0YW50SW5mbz4gZ2V0IGVudW1Db25zdGFudEluZm9zOwp9CgpjbGFzcyBFbnVtQ29uc3RhbnRJbmZvIHsKICBmaW5hbCBMaXN0PE1ldGFkYXRhQnVpbGRlcjxUeXBlQnVpbGRlcj4+IG1ldGFkYXRhOwogIGZpbmFsIFN0cmluZyBuYW1lOwogIGZpbmFsIGludCBjaGFyT2Zmc2V0OwogIGZpbmFsIFN0cmluZyBkb2N1bWVudGF0aW9uQ29tbWVudDsKICBjb25zdCBFbnVtQ29uc3RhbnRJbmZvKAogICAgICB0aGlzLm1ldGFkYXRhLCB0aGlzLm5hbWUsIHRoaXMuY2hhck9mZnNldCwgdGhpcy5kb2N1bWVudGF0aW9uQ29tbWVudCk7Cn0KFwBOTjwBHAFHATUkMAIBGTUVGCUaTQIBNXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2VudW1fYnVpbGRlci5kYXJ0P3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL2ZpZWxkX2J1aWxkZXIuZGFydIL4Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuZmllbGRfYnVpbGRlcjsKCmltcG9ydCAnYnVpbGRlci5kYXJ0JyBzaG93IExpYnJhcnlCdWlsZGVyLCBNZW1iZXJCdWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBEYXJ0VHlwZTsKCmFic3RyYWN0IGNsYXNzIEZpZWxkQnVpbGRlcjxUPiBleHRlbmRzIE1lbWJlckJ1aWxkZXIgewogIGZpbmFsIFN0cmluZyBuYW1lOwoKICBmaW5hbCBpbnQgbW9kaWZpZXJzOwoKICBGaWVsZEJ1aWxkZXIoCiAgICAgIHRoaXMubmFtZSwgdGhpcy5tb2RpZmllcnMsIExpYnJhcnlCdWlsZGVyIGNvbXBpbGF0aW9uVW5pdCwgaW50IGNoYXJPZmZzZXQpCiAgICAgIDogc3VwZXIoY29tcGlsYXRpb25Vbml0LCBjaGFyT2Zmc2V0KTsKCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIkZpZWxkQnVpbGRlciI7CgogIERhcnRUeXBlIGdldCBidWlsdFR5cGU7CgogIHZvaWQgc2V0IGluaXRpYWxpemVyKFQgdmFsdWUpOwoKICBib29sIGdldCBoYXNJbml0aWFsaXplcjsKCiAgYm9vbCBnZXQgaXNGaWVsZCA9PiB0cnVlOwp9Ch8ATk48AR0BOgEwATcVARcBEFEsASoBGgEhARsBHAIBNnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2ZpZWxkX2J1aWxkZXIuZGFydEpzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9mb3JtYWxfcGFyYW1ldGVyX2J1aWxkZXIuZGFydIX7Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuZm9ybWFsX3BhcmFtZXRlcl9idWlsZGVyOwoKaW1wb3J0ICcuLi9wYXJzZXIuZGFydCcgc2hvdyBGb3JtYWxQYXJhbWV0ZXJLaW5kOwoKaW1wb3J0ICcuLi9wYXJzZXIvZm9ybWFsX3BhcmFtZXRlcl9raW5kLmRhcnQnCiAgICBzaG93CiAgICAgICAgaXNNYW5kYXRvcnlGb3JtYWxQYXJhbWV0ZXJLaW5kLAogICAgICAgIGlzT3B0aW9uYWxOYW1lZEZvcm1hbFBhcmFtZXRlcktpbmQsCiAgICAgICAgaXNPcHRpb25hbFBvc2l0aW9uYWxGb3JtYWxQYXJhbWV0ZXJLaW5kOwoKaW1wb3J0ICdidWlsZGVyLmRhcnQnCiAgICBzaG93IExpYnJhcnlCdWlsZGVyLCBNZXRhZGF0YUJ1aWxkZXIsIE1vZGlmaWVyQnVpbGRlciwgVHlwZUJ1aWxkZXI7CgphYnN0cmFjdCBjbGFzcyBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPFQgZXh0ZW5kcyBUeXBlQnVpbGRlcj4KICAgIGV4dGVuZHMgTW9kaWZpZXJCdWlsZGVyIHsKICBmaW5hbCBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGE7CgogIGZpbmFsIGludCBtb2RpZmllcnM7CgogIGZpbmFsIFQgdHlwZTsKCiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIEZvcm1hbFBhcmFtZXRlcktpbmQga2luZCA9IEZvcm1hbFBhcmFtZXRlcktpbmQubWFuZGF0b3J5OwoKICBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyKHRoaXMubWV0YWRhdGEsIHRoaXMubW9kaWZpZXJzLCB0aGlzLnR5cGUsIHRoaXMubmFtZSwKICAgICAgTGlicmFyeUJ1aWxkZXIgY29tcGlsYXRpb25Vbml0LCBpbnQgY2hhck9mZnNldCkKICAgICAgOiBzdXBlcihjb21waWxhdGlvblVuaXQsIGNoYXJPZmZzZXQpOwoKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiRm9ybWFsUGFyYW1ldGVyQnVpbGRlciI7CgogIGJvb2wgZ2V0IGlzUmVxdWlyZWQgPT4gaXNNYW5kYXRvcnlGb3JtYWxQYXJhbWV0ZXJLaW5kKGtpbmQpOwoKICBib29sIGdldCBpc1Bvc2l0aW9uYWwgewogICAgcmV0dXJuIGlzT3B0aW9uYWxQb3NpdGlvbmFsRm9ybWFsUGFyYW1ldGVyS2luZChraW5kKSB8fAogICAgICAgIGlzTWFuZGF0b3J5Rm9ybWFsUGFyYW1ldGVyS2luZChraW5kKTsKICB9CgogIGJvb2wgZ2V0IGlzTmFtZWQgPT4gaXNPcHRpb25hbE5hbWVkRm9ybWFsUGFyYW1ldGVyS2luZChraW5kKTsKCiAgYm9vbCBnZXQgaXNPcHRpb25hbCA9PiAhaXNSZXF1aXJlZDsKCiAgYm9vbCBnZXQgaXNMb2NhbCA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGZ1bGxOYW1lRm9yRXJyb3JzID0+IG5hbWU7CgogIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgZm9yRm9ybWFsUGFyYW1ldGVySW5pdGlhbGl6ZXJTY29wZSgpOwp9CjcATk48ASgBMgEuCSgsMQEWSAE9HigBFwEQARUBPAFONiwBNAE/ARo8LgQBQAEmARwBDCgBPwIBQXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2Zvcm1hbF9wYXJhbWV0ZXJfYnVpbGRlci5kYXJ0R3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL2Z1bmN0aW9uX3R5cGVfYnVpbGRlci5kYXJ0hZ8vLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5mdW5jdGlvbl90eXBlX2J1aWxkZXI7CgppbXBvcnQgJ2J1aWxkZXIuZGFydCcgc2hvdyBMaWJyYXJ5QnVpbGRlciwgVHlwZUJ1aWxkZXIsIFR5cGVWYXJpYWJsZUJ1aWxkZXI7CgphYnN0cmFjdCBjbGFzcyBGdW5jdGlvblR5cGVCdWlsZGVyIGV4dGVuZHMgVHlwZUJ1aWxkZXIgewogIGZpbmFsIFR5cGVCdWlsZGVyIHJldHVyblR5cGU7CiAgZmluYWwgTGlzdCB0eXBlVmFyaWFibGVzOwogIGZpbmFsIExpc3QgZm9ybWFsczsKCiAgRnVuY3Rpb25UeXBlQnVpbGRlcih0aGlzLnJldHVyblR5cGUsIHRoaXMudHlwZVZhcmlhYmxlcywgdGhpcy5mb3JtYWxzKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+IG51bGw7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZGVidWdOYW1lID0+ICJGdW5jdGlvbiI7CgogIEBvdmVycmlkZQogIFN0cmluZ0J1ZmZlciBwcmludE9uKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKICAgIGlmICh0eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgYnVmZmVyLndyaXRlKCI8Iik7CiAgICAgIGJvb2wgaXNGaXJzdCA9IHRydWU7CiAgICAgIGZvciAoVHlwZVZhcmlhYmxlQnVpbGRlciB0IGluIHR5cGVWYXJpYWJsZXMpIHsKICAgICAgICBpZiAoIWlzRmlyc3QpIHsKICAgICAgICAgIGJ1ZmZlci53cml0ZSgiLCAiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBidWZmZXIud3JpdGUodC5uYW1lKTsKICAgICAgfQogICAgICBidWZmZXIud3JpdGUoIj4iKTsKICAgIH0KICAgIGJ1ZmZlci53cml0ZSgiKCIpOwogICAgaWYgKGZvcm1hbHMgIT0gbnVsbCkgewogICAgICBib29sIGlzRmlyc3QgPSB0cnVlOwogICAgICBmb3IgKGR5bmFtaWMgdCBpbiBmb3JtYWxzKSB7CiAgICAgICAgaWYgKCFpc0ZpcnN0KSB7CiAgICAgICAgICBidWZmZXIud3JpdGUoIiwgIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgYnVmZmVyLndyaXRlKHQ/LmZ1bGxOYW1lRm9yRXJyb3JzKTsKICAgICAgfQogICAgfQogICAgYnVmZmVyLndyaXRlKCIpIC0+ICIpOwogICAgYnVmZmVyLndyaXRlKHJldHVyblR5cGU/LmZ1bGxOYW1lRm9yRXJyb3JzKTsKICAgIHJldHVybiBidWZmZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBidWlsZChMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7fQp9CjoATk48ASUBTQE5IBwWAUoBDBsBDCYBDC4hGRs1GB4RGwoeCBkGFxsbIxgeERsKLAgGGzETBAEMIwIBPnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2Z1bmN0aW9uX3R5cGVfYnVpbGRlci5kYXJ0RnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL2ludmFsaWRfdHlwZV9idWlsZGVyLmRhcnSCpS8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmludmFsaWRfdHlwZV9idWlsZGVyOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JyBzaG93IExvY2F0ZWRNZXNzYWdlOwoKaW1wb3J0ICdidWlsZGVyLmRhcnQnIHNob3cgVHlwZUJ1aWxkZXIsIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXI7CgphYnN0cmFjdCBjbGFzcyBJbnZhbGlkVHlwZUJ1aWxkZXI8VCBleHRlbmRzIFR5cGVCdWlsZGVyLCBSPgogICAgZXh0ZW5kcyBUeXBlRGVjbGFyYXRpb25CdWlsZGVyPFQsIFI+IHsKICBJbnZhbGlkVHlwZUJ1aWxkZXIoU3RyaW5nIG5hbWUsIGludCBjaGFyT2Zmc2V0LCBbVXJpIGZpbGVVcmldKQogICAgICA6IHN1cGVyKG51bGwsIDAsIG5hbWUsIG51bGwsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwoKICBMb2NhdGVkTWVzc2FnZSBnZXQgbWVzc2FnZTsKCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIkludmFsaWRUeXBlQnVpbGRlciI7Cn0KFQBOTjwBJAEyAUABPCtBOQEeATACAT1wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9pbnZhbGlkX3R5cGVfYnVpbGRlci5kYXJ0QXNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL2xpYnJhcnlfYnVpbGRlci5kYXJ0n10vLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5saWJyYXJ5X2J1aWxkZXI7CgppbXBvcnQgJy4uL2NvbWJpbmF0b3IuZGFydCcgc2hvdyBDb21iaW5hdG9yOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IGludGVybmFsUHJvYmxlbSwgdW5zdXBwb3J0ZWQ7CgppbXBvcnQgJy4uL2V4cG9ydC5kYXJ0JyBzaG93IEV4cG9ydDsKCmltcG9ydCAnLi4vbG9hZGVyLmRhcnQnIHNob3cgTG9hZGVyOwoKaW1wb3J0ICcuLi9tZXNzYWdlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIEZvcm1hdHRlZE1lc3NhZ2UsCiAgICAgICAgTG9jYXRlZE1lc3NhZ2UsCiAgICAgICAgTWVzc2FnZSwKICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbUNvbnN0cnVjdG9yTm90Rm91bmQsCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZEluLAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtUHJpdmF0ZUNvbnN0cnVjdG9yQWNjZXNzOwoKaW1wb3J0ICcuLi9zZXZlcml0eS5kYXJ0JyBzaG93IFNldmVyaXR5OwoKaW1wb3J0ICdidWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgQ2xhc3NCdWlsZGVyLAogICAgICAgIERlY2xhcmF0aW9uLAogICAgICAgIE1vZGlmaWVyQnVpbGRlciwKICAgICAgICBOYW1lSXRlcmF0b3IsCiAgICAgICAgUHJlZml4QnVpbGRlciwKICAgICAgICBTY29wZSwKICAgICAgICBTY29wZUJ1aWxkZXIsCiAgICAgICAgVHlwZUJ1aWxkZXI7CgphYnN0cmFjdCBjbGFzcyBMaWJyYXJ5QnVpbGRlcjxUIGV4dGVuZHMgVHlwZUJ1aWxkZXIsIFI+CiAgICBleHRlbmRzIE1vZGlmaWVyQnVpbGRlciB7CiAgZmluYWwgU2NvcGUgc2NvcGU7CgogIGZpbmFsIFNjb3BlIGV4cG9ydFNjb3BlOwoKICBmaW5hbCBTY29wZUJ1aWxkZXIgc2NvcGVCdWlsZGVyOwoKICBmaW5hbCBTY29wZUJ1aWxkZXIgZXhwb3J0U2NvcGVCdWlsZGVyOwoKICBmaW5hbCBMaXN0PEV4cG9ydD4gZXhwb3J0ZXJzID0gPEV4cG9ydD5bXTsKCiAgTGlicmFyeUJ1aWxkZXIgcGFydE9mTGlicmFyeTsKCiAgYm9vbCBtYXlJbXBsZW1lbnRSZXN0cmljdGVkVHlwZXMgPSBmYWxzZTsKCiAgTGlicmFyeUJ1aWxkZXIoVXJpIGZpbGVVcmksIHRoaXMuc2NvcGUsIHRoaXMuZXhwb3J0U2NvcGUpCiAgICAgIDogc2NvcGVCdWlsZGVyID0gbmV3IFNjb3BlQnVpbGRlcihzY29wZSksCiAgICAgICAgZXhwb3J0U2NvcGVCdWlsZGVyID0gbmV3IFNjb3BlQnVpbGRlcihleHBvcnRTY29wZSksCiAgICAgICAgc3VwZXIobnVsbCwgLTEsIGZpbGVVcmkpOwoKICBib29sIGdldCBsZWdhY3lNb2RlID0+IGZhbHNlOwoKICBib29sIGdldCBpc1N5bnRoZXRpYyA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgRGVjbGFyYXRpb24gZ2V0IHBhcmVudCA9PiBudWxsOwoKICBib29sIGdldCBpc1BhcnQgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZGVidWdOYW1lID0+ICJMaWJyYXJ5QnVpbGRlciI7CgogIExvYWRlciBnZXQgbG9hZGVyOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IG1vZGlmaWVycyA9PiAwOwoKICBAb3ZlcnJpZGUKICBSIGdldCB0YXJnZXQ7CgogIFVyaSBnZXQgdXJpOwoKICBJdGVyYXRvcjxEZWNsYXJhdGlvbj4gZ2V0IGl0ZXJhdG9yIHsKICAgIHJldHVybiBMaWJyYXJ5TG9jYWxEZWNsYXJhdGlvbkl0ZXJhdG9yKHRoaXMpOwogIH0KCiAgTmFtZUl0ZXJhdG9yIGdldCBuYW1lSXRlcmF0b3IgewogICAgcmV0dXJuIG5ldyBMaWJyYXJ5TG9jYWxEZWNsYXJhdGlvbk5hbWVJdGVyYXRvcih0aGlzKTsKICB9CgogIERlY2xhcmF0aW9uIGFkZEJ1aWxkZXIoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBpbnQgY2hhck9mZnNldCk7CgogIHZvaWQgYWRkRXhwb3J0ZXIoCiAgICAgIExpYnJhcnlCdWlsZGVyIGV4cG9ydGVyLCBMaXN0PENvbWJpbmF0b3I+IGNvbWJpbmF0b3JzLCBpbnQgY2hhck9mZnNldCkgewogICAgZXhwb3J0ZXJzLmFkZChuZXcgRXhwb3J0KGV4cG9ydGVyLCB0aGlzLCBjb21iaW5hdG9ycywgY2hhck9mZnNldCkpOwogIH0KCiAgLy8vIEFkZCBhIHByb2JsZW0gd2l0aCBhIHNldmVyaXR5IGRldGVybWluZWQgYnkgdGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLgogIC8vLwogIC8vLyBJZiBbZmlsZVVyaV0gaXMgbnVsbCwgaXQgZGVmYXVsdHMgdG8gYHRoaXMuZmlsZVVyaWAuCiAgLy8vCiAgLy8vIFNlZSBgTG9hZGVyLmFkZE1lc3NhZ2VgIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUKICAvLy8gYXJndW1lbnRzIHBhc3NlZCB0byB0aGlzIG1ldGhvZC4KICBGb3JtYXR0ZWRNZXNzYWdlIGFkZFByb2JsZW0oCiAgICAgIE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgsIFVyaSBmaWxlVXJpLAogICAgICB7Ym9vbCB3YXNIYW5kbGVkOiBmYWxzZSwKICAgICAgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dCwKICAgICAgU2V2ZXJpdHkgc2V2ZXJpdHksCiAgICAgIGJvb2wgcHJvYmxlbU9uTGlicmFyeTogZmFsc2V9KSB7CiAgICBmaWxlVXJpID8/PSB0aGlzLmZpbGVVcmk7CgogICAgcmV0dXJuIGxvYWRlci5hZGRQcm9ibGVtKG1lc3NhZ2UsIGNoYXJPZmZzZXQsIGxlbmd0aCwgZmlsZVVyaSwKICAgICAgICB3YXNIYW5kbGVkOiB3YXNIYW5kbGVkLAogICAgICAgIGNvbnRleHQ6IGNvbnRleHQsCiAgICAgICAgc2V2ZXJpdHk6IHNldmVyaXR5LAogICAgICAgIHByb2JsZW1PbkxpYnJhcnk6IHRydWUpOwogIH0KCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZXhwb3J0IHNjb3BlIHdhcyBtb2RpZmllZC4KICBib29sIGFkZFRvRXhwb3J0U2NvcGUoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIG1lbWJlciwKICAgICAgW2ludCBjaGFyT2Zmc2V0ID0gLTFdKSB7CiAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJfIikpIHJldHVybiBmYWxzZTsKICAgIGlmIChtZW1iZXIgaXMgUHJlZml4QnVpbGRlcikgcmV0dXJuIGZhbHNlOwogICAgTWFwPFN0cmluZywgRGVjbGFyYXRpb24+IG1hcCA9CiAgICAgICAgbWVtYmVyLmlzU2V0dGVyID8gZXhwb3J0U2NvcGUuc2V0dGVycyA6IGV4cG9ydFNjb3BlLmxvY2FsOwogICAgRGVjbGFyYXRpb24gZXhpc3RpbmcgPSBtYXBbbmFtZV07CiAgICBpZiAoZXhpc3RpbmcgPT0gbWVtYmVyKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkgewogICAgICBEZWNsYXJhdGlvbiByZXN1bHQgPSBjb21wdXRlQW1iaWd1b3VzRGVjbGFyYXRpb24oCiAgICAgICAgICBuYW1lLCBleGlzdGluZywgbWVtYmVyLCBjaGFyT2Zmc2V0LAogICAgICAgICAgaXNFeHBvcnQ6IHRydWUpOwogICAgICBtYXBbbmFtZV0gPSByZXN1bHQ7CiAgICAgIHJldHVybiByZXN1bHQgIT0gZXhpc3Rpbmc7CiAgICB9IGVsc2UgewogICAgICBtYXBbbmFtZV0gPSBtZW1iZXI7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHZvaWQgYWRkVG9TY29wZSgKICAgICAgU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIG1lbWJlciwgaW50IGNoYXJPZmZzZXQsIGJvb2wgaXNJbXBvcnQpOwoKICBEZWNsYXJhdGlvbiBjb21wdXRlQW1iaWd1b3VzRGVjbGFyYXRpb24oCiAgICAgIFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgRGVjbGFyYXRpb24gb3RoZXIsIGludCBjaGFyT2Zmc2V0LAogICAgICB7Ym9vbCBpc0V4cG9ydDogZmFsc2UsIGJvb2wgaXNJbXBvcnQ6IGZhbHNlfSk7CgogIGludCBmaW5pc2hEZWZlcnJlZExvYWRUZWFyb2ZmcygpID0+IDA7CgogIGludCBmaW5pc2hGb3J3YXJkZXJzKCkgPT4gMDsKCiAgaW50IGZpbmlzaE5hdGl2ZU1ldGhvZHMoKSA9PiAwOwoKICBpbnQgZmluaXNoUGF0Y2hNZXRob2RzKCkgPT4gMDsKCiAgLy8vIExvb2tzIHVwIFtjb25zdHJ1Y3Rvck5hbWVdIGluIHRoZSBjbGFzcyBuYW1lZCBbY2xhc3NOYW1lXS4KICAvLy8KICAvLy8gVGhlIGNsYXNzIGlzIGxvb2tlZCB1cCBpbiB0aGlzIGxpYnJhcnkncyBleHBvcnQgc2NvcGUgdW5sZXNzCiAgLy8vIFtieXBhc3NMaWJyYXJ5UHJpdmFjeV0gaXMgdHJ1ZSwgaW4gd2hpY2ggY2FzZSBpdCBpcyBsb29rZWQgdXAgaW4gdGhlCiAgLy8vIGxpYnJhcnkgc2NvcGUgb2YgdGhpcyBsaWJyYXJ5LgogIC8vLwogIC8vLyBJdCBpcyBhbiBlcnJvciBpZiBubyBzdWNoIGNsYXNzIGlzIGZvdW5kLCBvciBpZiB0aGUgY2xhc3MgZG9lc24ndCBoYXZlIGEKICAvLy8gbWF0Y2hpbmcgY29uc3RydWN0b3IgKG9yIGZhY3RvcnkpLgogIC8vLwogIC8vLyBJZiBbY29uc3RydWN0b3JOYW1lXSBpcyBudWxsIG9yIHRoZSBlbXB0eSBzdHJpbmcsIGl0J3MgYXNzdW1lZCB0byBiZSBhbgogIC8vLyB1bm5hbWVkIGNvbnN0cnVjdG9yLiBpdCdzIGFuIGVycm9yIGlmIFtjb25zdHJ1Y3Rvck5hbWVdIHN0YXJ0cyB3aXRoCiAgLy8vIGAiXyJgLCBhbmQgW2J5cGFzc0xpYnJhcnlQcml2YWN5XSBpcyBmYWxzZS4KICBEZWNsYXJhdGlvbiBnZXRDb25zdHJ1Y3RvcihTdHJpbmcgY2xhc3NOYW1lLAogICAgICB7U3RyaW5nIGNvbnN0cnVjdG9yTmFtZSwgYm9vbCBieXBhc3NMaWJyYXJ5UHJpdmFjeTogZmFsc2V9KSB7CiAgICBjb25zdHJ1Y3Rvck5hbWUgPz89ICIiOwogICAgaWYgKGNvbnN0cnVjdG9yTmFtZS5zdGFydHNXaXRoKCJfIikgJiYgIWJ5cGFzc0xpYnJhcnlQcml2YWN5KSB7CiAgICAgIHJldHVybiBpbnRlcm5hbFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVByaXZhdGVDb25zdHJ1Y3RvckFjY2VzcwogICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGNvbnN0cnVjdG9yTmFtZSksCiAgICAgICAgICAtMSwKICAgICAgICAgIG51bGwpOwogICAgfQogICAgRGVjbGFyYXRpb24gY2xzID0gKGJ5cGFzc0xpYnJhcnlQcml2YWN5ID8gc2NvcGUgOiBleHBvcnRTY29wZSkKICAgICAgICAubG9va3VwKGNsYXNzTmFtZSwgLTEsIG51bGwpOwogICAgaWYgKGNscyBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgLy8gVE9ETyhhaGUpOiBUaGlzIGNvZGUgaXMgc2ltaWxhciB0byBjb2RlIGluIGBlbmROZXdFeHByZXNzaW9uYCBpbgogICAgICAvLyBgYm9keV9idWlsZGVyLmRhcnRgLCB0cnkgdG8gc2hhcmUgaXQuCiAgICAgIERlY2xhcmF0aW9uIGNvbnN0cnVjdG9yID0KICAgICAgICAgIGNscy5maW5kQ29uc3RydWN0b3JPckZhY3RvcnkoY29uc3RydWN0b3JOYW1lLCAtMSwgbnVsbCwgdGhpcyk7CiAgICAgIGlmIChjb25zdHJ1Y3RvciA9PSBudWxsKSB7CiAgICAgICAgLy8gRmFsbC10aHJvdWdoIHRvIGludGVybmFsIGVycm9yIGJlbG93LgogICAgICB9IGVsc2UgaWYgKGNvbnN0cnVjdG9yLmlzQ29uc3RydWN0b3IpIHsKICAgICAgICBpZiAoIWNscy5pc0Fic3RyYWN0KSB7CiAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3I7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNvbnN0cnVjdG9yLmlzRmFjdG9yeSkgewogICAgICAgIHJldHVybiBjb25zdHJ1Y3RvcjsKICAgICAgfQogICAgfQogICAgdGhyb3cgaW50ZXJuYWxQcm9ibGVtKAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtQ29uc3RydWN0b3JOb3RGb3VuZC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAiJGNsYXNzTmFtZS4kY29uc3RydWN0b3JOYW1lIiwgdXJpKSwKICAgICAgICAtMSwKICAgICAgICBudWxsKTsKICB9CgogIGludCBmaW5pc2hUeXBlVmFyaWFibGVzKENsYXNzQnVpbGRlciBvYmplY3QsIFR5cGVCdWlsZGVyIGR5bmFtaWNUeXBlKSA9PiAwOwoKICAvLy8gVGhpcyBtZXRob2QgaW5zdGFudGlhdGVzIHR5cGUgcGFyYW1ldGVycyB0byB0aGVpciBib3VuZHMgaW4gc29tZSBjYXNlcwogIC8vLyB3aGVyZSB0aGV5IHdlcmUgb21pdHRlZCBieSB0aGUgcHJvZ3JhbW1lciBhbmQgbm90IHByb3ZpZGVkIGJ5IHRoZSB0eXBlCiAgLy8vIGluZmVyZW5jZS4gIFRoZSBtZXRob2QgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IHR5cGUgdmFyaWFibGVzCiAgLy8vIHRoYXQgd2VyZSBpbnN0YW50aWF0ZWQgaW4gdGhpcyBsaWJyYXJ5LgogIGludCBjb21wdXRlRGVmYXVsdFR5cGVzKFR5cGVCdWlsZGVyIGR5bmFtaWNUeXBlLCBUeXBlQnVpbGRlciBib3R0b21UeXBlLAogICAgICBDbGFzc0J1aWxkZXIgb2JqZWN0Q2xhc3MpIHsKICAgIHJldHVybiAwOwogIH0KCiAgdm9pZCBiZWNvbWVDb3JlTGlicmFyeSgpIHsKICAgIGlmIChzY29wZS5sb2NhbFsiZHluYW1pYyJdID09IG51bGwpIHsKICAgICAgYWRkU3ludGhldGljRGVjbGFyYXRpb25PZkR5bmFtaWMoKTsKICAgIH0KICB9CgogIHZvaWQgYWRkU3ludGhldGljRGVjbGFyYXRpb25PZkR5bmFtaWMoKTsKCiAgLy8vIERvbid0IHVzZSBmb3Igc2NvcGUgbG9va3VwLiBPbmx5IHVzZSB3aGVuIGFuIGVsZW1lbnQgaXMga25vd24gdG8gZXhpc3QKICAvLy8gKGFuZCBub3QgYSBzZXR0ZXIpLgogIERlY2xhcmF0aW9uIG9wZXJhdG9yIFtdKFN0cmluZyBuYW1lKSB7CiAgICByZXR1cm4gc2NvcGUubG9jYWxbbmFtZV0gPz8KICAgICAgICBpbnRlcm5hbFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtTm90Rm91bmRJbi53aXRoQXJndW1lbnRzKG5hbWUsICIkZmlsZVVyaSIpLAogICAgICAgICAgICAtMSwKICAgICAgICAgICAgZmlsZVVyaSk7CiAgfQoKICBEZWNsYXJhdGlvbiBsb29rdXAoU3RyaW5nIG5hbWUsIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSkgewogICAgcmV0dXJuIHNjb3BlLmxvb2t1cChuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICB9CgogIC8vLyBJZiB0aGlzIGlzIGEgcGF0Y2ggbGlicmFyeSwgYXBwbHkgaXRzIHBhdGNoZXMgdG8gW29yaWdpbl0uCiAgdm9pZCBhcHBseVBhdGNoZXMoKSB7CiAgICBpZiAoIWlzUGF0Y2gpIHJldHVybjsKICAgIHVuc3VwcG9ydGVkKCIke3J1bnRpbWVUeXBlfS5hcHBseVBhdGNoZXMiLCAtMSwgZmlsZVVyaSk7CiAgfQoKICB2b2lkIHJlY29yZEFjY2VzcyhpbnQgY2hhck9mZnNldCwgaW50IGxlbmd0aCwgVXJpIGZpbGVVcmkpIHt9Cn0KCmNsYXNzIExpYnJhcnlMb2NhbERlY2xhcmF0aW9uSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxEZWNsYXJhdGlvbj4gewogIGZpbmFsIExpYnJhcnlCdWlsZGVyIGxpYnJhcnk7CiAgZmluYWwgSXRlcmF0b3I8RGVjbGFyYXRpb24+IGl0ZXJhdG9yOwoKICBMaWJyYXJ5TG9jYWxEZWNsYXJhdGlvbkl0ZXJhdG9yKHRoaXMubGlicmFyeSkKICAgICAgOiBpdGVyYXRvciA9IGxpYnJhcnkuc2NvcGUuaXRlcmF0b3I7CgogIERlY2xhcmF0aW9uIGdldCBjdXJyZW50ID0+IGl0ZXJhdG9yLmN1cnJlbnQ7CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICBpZiAoY3VycmVudC5wYXJlbnQgPT0gbGlicmFyeSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CgpjbGFzcyBMaWJyYXJ5TG9jYWxEZWNsYXJhdGlvbk5hbWVJdGVyYXRvciBpbXBsZW1lbnRzIE5hbWVJdGVyYXRvciB7CiAgZmluYWwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeTsKICBmaW5hbCBOYW1lSXRlcmF0b3IgaXRlcmF0b3I7CgogIExpYnJhcnlMb2NhbERlY2xhcmF0aW9uTmFtZUl0ZXJhdG9yKHRoaXMubGlicmFyeSkKICAgICAgOiBpdGVyYXRvciA9IGxpYnJhcnkuc2NvcGUubmFtZUl0ZXJhdG9yOwoKICBEZWNsYXJhdGlvbiBnZXQgY3VycmVudCA9PiBpdGVyYXRvci5jdXJyZW50OwoKICBTdHJpbmcgZ2V0IG5hbWUgPT4gaXRlcmF0b3IubmFtZTsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIHdoaWxlIChpdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgIGlmIChjdXJyZW50LnBhcmVudCA9PSBsaWJyYXJ5KSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9Cn0KgRQATk48AR8BLQE9ASUBJQEaCRoYETQrOQEpARYJFhUZFhcPFhUBOB4VARsBIwEpAS0BIAEsATwwPCIBIAEhAQwiARwBDCwBFQEMGgEMEAEPAScyBAEiOgQBUAEUT0gEAU8GOwY4Jx9AHyQZJx4BQyAaHCEEATU5HywvI0MmKhw4LhsaIQ0aBhEEARNHAStPNQEpAR8BIgEhAUEGQ0slBk8pBk5KMi9EHEQeOi8OEQZDJh9KLyBJITEuHx4KKhwIBhtCMQwPBAFOAU1NSy5LIg4EAR0qKgYEASsBTRopIBlPEBYEAUE0BAFBGBo9BAFAAgFJICgBMCsBLwEUIjIGEgQCAUQgHwE0LwEvASQBFCIyBhIEAgE4cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvbGlicmFyeV9idWlsZGVyLmRhcnRAc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvbWVtYmVyX2J1aWxkZXIuZGFydITDLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEubWVtYmVyX2J1aWxkZXI7CgppbXBvcnQgJ2J1aWxkZXIuZGFydCcKICAgIHNob3cgQ2xhc3NCdWlsZGVyLCBEZWNsYXJhdGlvbiwgTGlicmFyeUJ1aWxkZXIsIE1vZGlmaWVyQnVpbGRlcjsKCmFic3RyYWN0IGNsYXNzIE1lbWJlckJ1aWxkZXIgZXh0ZW5kcyBNb2RpZmllckJ1aWxkZXIgewogIC8vLyBGb3IgdG9wLWxldmVsIG1lbWJlcnMsIHRoZSBwYXJlbnQgaXMgc2V0IGNvcnJlY3RseSBkdXJpbmcKICAvLy8gY29uc3RydWN0aW9uLiBIb3dldmVyLCBmb3IgY2xhc3MgbWVtYmVycywgdGhlIHBhcmVudCBpcyBpbml0aWFsbHkgdGhlCiAgLy8vIGxpYnJhcnkgYW5kIHVwZGF0ZWQgbGF0ZXIuCiAgRGVjbGFyYXRpb24gcGFyZW50OwoKICBTdHJpbmcgZ2V0IG5hbWU7CgogIE1lbWJlckJ1aWxkZXIodGhpcy5wYXJlbnQsIGludCBjaGFyT2Zmc2V0KSA6IHN1cGVyKHBhcmVudCwgY2hhck9mZnNldCk7CgogIGJvb2wgZ2V0IGlzSW5zdGFuY2VNZW1iZXIgPT4gaXNDbGFzc01lbWJlciAmJiAhaXNTdGF0aWM7CgogIGJvb2wgZ2V0IGlzQ2xhc3NNZW1iZXIgPT4gcGFyZW50IGlzIENsYXNzQnVpbGRlcjsKCiAgYm9vbCBnZXQgaXNUb3BMZXZlbCA9PiAhaXNDbGFzc01lbWJlcjsKCiAgYm9vbCBnZXQgaXNOYXRpdmUgPT4gZmFsc2U7CgogIGJvb2wgZ2V0IGlzUmVkaXJlY3RpbmdHZW5lcmF0aXZlQ29uc3RydWN0b3IgPT4gZmFsc2U7CgogIExpYnJhcnlCdWlsZGVyIGdldCBsaWJyYXJ5IHsKICAgIGlmIChwYXJlbnQgaXMgTGlicmFyeUJ1aWxkZXIpIHsKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IHBhcmVudDsKICAgICAgcmV0dXJuIGxpYnJhcnkucGFydE9mTGlicmFyeSA/PyBsaWJyYXJ5OwogICAgfSBlbHNlIHsKICAgICAgQ2xhc3NCdWlsZGVyIGNscyA9IHBhcmVudDsKICAgICAgcmV0dXJuIGNscy5saWJyYXJ5OwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBmdWxsTmFtZUZvckVycm9ycyA9PiBuYW1lOwp9CiwATk48AR4BFkUBN0BMIRYBEwFKATsBNAEpAR4BOAEfJCcvDSEaBgQBDCgCATdwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9tZW1iZXJfYnVpbGRlci5kYXJ0QnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL21ldGFkYXRhX2J1aWxkZXIuZGFydIb0Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEubWV0YWRhdGFfYnVpbGRlcjsKCmltcG9ydCAnYnVpbGRlci5kYXJ0JyBzaG93IERlY2xhcmF0aW9uLCBUeXBlQnVpbGRlcjsKCmltcG9ydCAnY29uc3RydWN0b3JfcmVmZXJlbmNlX2J1aWxkZXIuZGFydCcgc2hvdyBDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXI7CgphYnN0cmFjdCBjbGFzcyBNZXRhZGF0YUJ1aWxkZXI8VCBleHRlbmRzIFR5cGVCdWlsZGVyPiB7CiAgZmluYWwgaW50IGNoYXJPZmZzZXQ7CgogIE1ldGFkYXRhQnVpbGRlcihEZWNsYXJhdGlvbiBwYXJlbnQsIHRoaXMuY2hhck9mZnNldCk7CgogIGZhY3RvcnkgTWV0YWRhdGFCdWlsZGVyLmZyb21Db25zdHJ1Y3RvcigKICAgICAgQ29uc3RydWN0b3JSZWZlcmVuY2VCdWlsZGVyIGNvbnN0cnVjdG9yUmVmZXJlbmNlLAogICAgICBMaXN0PE9iamVjdD4gYXJndW1lbnRzLAogICAgICBEZWNsYXJhdGlvbiBwYXJlbnQsCiAgICAgIGludCBjaGFyT2Zmc2V0KSB7CiAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yTWV0YWRhdGFCdWlsZGVyPFQ+KAogICAgICAgIGNvbnN0cnVjdG9yUmVmZXJlbmNlLCBhcmd1bWVudHMsIHBhcmVudCwgY2hhck9mZnNldCk7CiAgfQoKICBmYWN0b3J5IE1ldGFkYXRhQnVpbGRlci5mcm9tRXhwcmVzc2lvbigKICAgICAgT2JqZWN0IGV4cHJlc3Npb24sIFN0cmluZyBwb3N0Zml4LCBEZWNsYXJhdGlvbiBwYXJlbnQsIGludCBjaGFyT2Zmc2V0KSB7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25NZXRhZGF0YUJ1aWxkZXI8VD4oCiAgICAgICAgZXhwcmVzc2lvbiwgcG9zdGZpeCwgcGFyZW50LCBjaGFyT2Zmc2V0KTsKICB9Cn0KCmNsYXNzIENvbnN0cnVjdG9yTWV0YWRhdGFCdWlsZGVyPFQgZXh0ZW5kcyBUeXBlQnVpbGRlcj4KICAgIGV4dGVuZHMgTWV0YWRhdGFCdWlsZGVyPFQ+IHsKICBmaW5hbCBDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXIgY29uc3RydWN0b3JSZWZlcmVuY2U7CgogIGZpbmFsIExpc3Q8T2JqZWN0PiBhcmd1bWVudHM7CgogIENvbnN0cnVjdG9yTWV0YWRhdGFCdWlsZGVyKHRoaXMuY29uc3RydWN0b3JSZWZlcmVuY2UsIHRoaXMuYXJndW1lbnRzLAogICAgICBEZWNsYXJhdGlvbiBwYXJlbnQsIGludCBjaGFyT2Zmc2V0KQogICAgICA6IHN1cGVyKHBhcmVudCwgY2hhck9mZnNldCk7Cn0KCi8vLyBFeHByZXNzaW9uIG1ldGFkYXRhICh3aXRob3V0IGFyZ3VtZW50cykuCi8vLwovLy8gTWF0Y2hlcyB0aGlzIGdyYW1tYXIgcnVsZToKLy8vCi8vLyAgICAnQCcgcXVhbGlmaWVkICjigJgu4oCZIGlkZW50aWZpZXIpPwpjbGFzcyBFeHByZXNzaW9uTWV0YWRhdGFCdWlsZGVyPFQgZXh0ZW5kcyBUeXBlQnVpbGRlcj4KICAgIGV4dGVuZHMgTWV0YWRhdGFCdWlsZGVyPFQ+IHsKICBmaW5hbCBPYmplY3QgcXVhbGlmaWVkOwoKICBmaW5hbCBTdHJpbmcgaWRlbnRpZmllcjsKCiAgRXhwcmVzc2lvbk1ldGFkYXRhQnVpbGRlcigKICAgICAgdGhpcy5xdWFsaWZpZWQsIHRoaXMuaWRlbnRpZmllciwgRGVjbGFyYXRpb24gcGFyZW50LCBpbnQgY2hhck9mZnNldCkKICAgICAgOiBzdXBlcihwYXJlbnQsIGNoYXJPZmZzZXQpOwp9CjsATk48ASABNQFOATgYATgBKzgeGhguPgQBKk8tMgQCATghOgEgAUgqIwIBLQQfBCc3IRoBGwEdSyMCATlwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9tZXRhZGF0YV9idWlsZGVyLmRhcnRLc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvbWl4aW5fYXBwbGljYXRpb25fYnVpbGRlci5kYXJ0g50vLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5taXhpbl9hcHBsaWNhdGlvbl9idWlsZGVyOwoKaW1wb3J0ICdidWlsZGVyLmRhcnQnIHNob3cgVHlwZUJ1aWxkZXIsIFR5cGVWYXJpYWJsZUJ1aWxkZXI7CgphYnN0cmFjdCBjbGFzcyBNaXhpbkFwcGxpY2F0aW9uQnVpbGRlcjxUIGV4dGVuZHMgVHlwZUJ1aWxkZXI+CiAgICBleHRlbmRzIFR5cGVCdWlsZGVyIHsKICBmaW5hbCBUIHN1cGVydHlwZTsKICBmaW5hbCBMaXN0PFQ+IG1peGluczsKCiAgTWl4aW5BcHBsaWNhdGlvbkJ1aWxkZXIodGhpcy5zdXBlcnR5cGUsIHRoaXMubWl4aW5zKTsKCiAgdm9pZCBzZXQgdHlwZVZhcmlhYmxlcyhMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHZhcmlhYmxlcyk7CgogIFN0cmluZyBnZXQgbmFtZSA9PiBudWxsOwoKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiTWl4aW5BcHBsaWNhdGlvbkJ1aWxkZXIiOwoKICBTdHJpbmdCdWZmZXIgcHJpbnRPbihTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CiAgICBidWZmZXIud3JpdGUoc3VwZXJ0eXBlKTsKICAgIGJ1ZmZlci53cml0ZSgiIHdpdGggIik7CiAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgIGZvciAoVCB0IGluIG1peGlucykgewogICAgICBpZiAoIWZpcnN0KSBidWZmZXIud3JpdGUoIiwgIik7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgIHQucHJpbnRPbihidWZmZXIpOwogICAgfQogICAgcmV0dXJuIGJ1ZmZlcjsKICB9Cn0KIwBOTjwBKQE9AT4aFRgBOAE/ARsBNQEuHRwXGiYVGQYTBAIBQnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL21peGluX2FwcGxpY2F0aW9uX2J1aWxkZXIuZGFydEJzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9tb2RpZmllcl9idWlsZGVyLmRhcnSG/C8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLm1vZGlmaWVyX2J1aWxkZXI7CgppbXBvcnQgJy4uL21vZGlmaWVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgYWJzdHJhY3RNYXNrLAogICAgICAgIGNvbnN0TWFzaywKICAgICAgICBjb3ZhcmlhbnRNYXNrLAogICAgICAgIGV4dGVybmFsTWFzaywKICAgICAgICBmaW5hbE1hc2ssCiAgICAgICAgaGFzQ29uc3RDb25zdHJ1Y3Rvck1hc2ssCiAgICAgICAgaGFzSW5pdGlhbGl6ZXJNYXNrLAogICAgICAgIGluaXRpYWxpemluZ0Zvcm1hbE1hc2ssCiAgICAgICAgbmFtZWRNaXhpbkFwcGxpY2F0aW9uTWFzaywKICAgICAgICBzdGF0aWNNYXNrOwoKaW1wb3J0ICdidWlsZGVyLmRhcnQnIHNob3cgRGVjbGFyYXRpb247CgphYnN0cmFjdCBjbGFzcyBNb2RpZmllckJ1aWxkZXIgZXh0ZW5kcyBEZWNsYXJhdGlvbiB7CiAgRGVjbGFyYXRpb24gcGFyZW50OwoKICBmaW5hbCBpbnQgY2hhck9mZnNldDsKCiAgZmluYWwgVXJpIGZpbGVVcmk7CgogIE1vZGlmaWVyQnVpbGRlcih0aGlzLnBhcmVudCwgdGhpcy5jaGFyT2Zmc2V0LCBbVXJpIGZpbGVVcmldKQogICAgICA6IGZpbGVVcmkgPSBmaWxlVXJpID8/IHBhcmVudD8uZmlsZVVyaTsKCiAgaW50IGdldCBtb2RpZmllcnM7CgogIGJvb2wgZ2V0IGlzQWJzdHJhY3QgPT4gKG1vZGlmaWVycyAmIGFic3RyYWN0TWFzaykgIT0gMDsKCiAgYm9vbCBnZXQgaXNDb25zdCA9PiAobW9kaWZpZXJzICYgY29uc3RNYXNrKSAhPSAwOwoKICBib29sIGdldCBpc0NvdmFyaWFudCA9PiAobW9kaWZpZXJzICYgY292YXJpYW50TWFzaykgIT0gMDsKCiAgYm9vbCBnZXQgaXNFeHRlcm5hbCA9PiAobW9kaWZpZXJzICYgZXh0ZXJuYWxNYXNrKSAhPSAwOwoKICBib29sIGdldCBpc0ZpbmFsID0+IChtb2RpZmllcnMgJiBmaW5hbE1hc2spICE9IDA7CgogIGJvb2wgZ2V0IGlzU3RhdGljID0+IChtb2RpZmllcnMgJiBzdGF0aWNNYXNrKSAhPSAwOwoKICBib29sIGdldCBpc05hbWVkTWl4aW5BcHBsaWNhdGlvbiB7CiAgICByZXR1cm4gKG1vZGlmaWVycyAmIG5hbWVkTWl4aW5BcHBsaWNhdGlvbk1hc2spICE9IDA7CiAgfQoKICBib29sIGdldCBoYXNJbml0aWFsaXplciA9PiAobW9kaWZpZXJzICYgaGFzSW5pdGlhbGl6ZXJNYXNrKSAhPSAwOwoKICBib29sIGdldCBpc0luaXRpYWxpemluZ0Zvcm1hbCA9PiAobW9kaWZpZXJzICYgaW5pdGlhbGl6aW5nRm9ybWFsTWFzaykgIT0gMDsKCiAgYm9vbCBnZXQgaGFzQ29uc3RDb25zdHJ1Y3RvciA9PiAobW9kaWZpZXJzICYgaGFzQ29uc3RDb25zdHJ1Y3Rvck1hc2spICE9IDA7CgogIGJvb2wgZ2V0IGlzQ2xhc3NNZW1iZXIgPT4gZmFsc2U7CgogIFN0cmluZyBnZXQgbmFtZTsKCiAgYm9vbCBnZXQgaXNOYXRpdmUgPT4gZmFsc2U7CgogIFN0cmluZyBnZXQgZGVidWdOYW1lOwoKICBTdHJpbmdCdWZmZXIgcHJpbnRPbihTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CiAgICByZXR1cm4gYnVmZmVyLi53cml0ZShuYW1lID8/IGZ1bGxOYW1lRm9yRXJyb3JzKTsKICB9CgogIFN0cmluZyB0b1N0cmluZygpID0+ICIkZGVidWdOYW1lKCR7cHJpbnRPbihuZXcgU3RyaW5nQnVmZmVyKCkpfSkiOwp9CkcATk48ASABGgkWExcWEyEcICMUASgBNRYBGAEVAT8uARUBOgE0ATwBOgE0ATYBJTkEAUQBTgFOASMBEwEeARgBLjUEAUUCATlwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9tb2RpZmllcl9idWlsZGVyLmRhcnQ/c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvbmFtZV9pdGVyYXRvci5kYXJ0gXQvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5uYW1lX2l0ZXJhdG9yOwoKaW1wb3J0ICdidWlsZGVyLmRhcnQnIHNob3cgRGVjbGFyYXRpb247CgphYnN0cmFjdCBjbGFzcyBOYW1lSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxEZWNsYXJhdGlvbj4gewogIFN0cmluZyBnZXQgbmFtZTsKfQoNAE5OPAEdASgBPxMCATZwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9uYW1lX2l0ZXJhdG9yLmRhcnREc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvbmFtZWRfdHlwZV9idWlsZGVyLmRhcnSTgy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLm5hbWVkX3R5cGVfYnVpbGRlcjsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cKICAgICAgICBNZXNzYWdlLAogICAgICAgIFRlbXBsYXRlLAogICAgICAgIG5vTGVuZ3RoLAogICAgICAgIHRlbXBsYXRlTWlzc2luZ0V4cGxpY2l0VHlwZUFyZ3VtZW50cywKICAgICAgICBtZXNzYWdlTm90QVR5cGVDb250ZXh0LAogICAgICAgIExvY2F0ZWRNZXNzYWdlLAogICAgICAgIHRlbXBsYXRlTm90QVR5cGUsCiAgICAgICAgdGVtcGxhdGVUeXBlQXJndW1lbnRNaXNtYXRjaCwKICAgICAgICB0ZW1wbGF0ZVR5cGVBcmd1bWVudHNPblR5cGVWYXJpYWJsZSwKICAgICAgICB0ZW1wbGF0ZVR5cGVOb3RGb3VuZDsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyB1bmhhbmRsZWQ7CgppbXBvcnQgJ2J1aWxkZXIuZGFydCcKICAgIHNob3cKICAgICAgICBEZWNsYXJhdGlvbiwKICAgICAgICBJZGVudGlmaWVyLAogICAgICAgIEludmFsaWRUeXBlQnVpbGRlciwKICAgICAgICBMaWJyYXJ5QnVpbGRlciwKICAgICAgICBQcmVmaXhCdWlsZGVyLAogICAgICAgIFF1YWxpZmllZE5hbWUsCiAgICAgICAgU2NvcGUsCiAgICAgICAgVHlwZUJ1aWxkZXIsCiAgICAgICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciwKICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyLAogICAgICAgIGZsYXR0ZW5OYW1lOwoKYWJzdHJhY3QgY2xhc3MgTmFtZWRUeXBlQnVpbGRlcjxUIGV4dGVuZHMgVHlwZUJ1aWxkZXIsIFI+IGV4dGVuZHMgVHlwZUJ1aWxkZXIgewogIGZpbmFsIE9iamVjdCBuYW1lOwoKICBMaXN0PFQ+IGFyZ3VtZW50czsKCiAgQG92ZXJyaWRlCiAgVHlwZURlY2xhcmF0aW9uQnVpbGRlcjxULCBSPiBkZWNsYXJhdGlvbjsKCiAgTmFtZWRUeXBlQnVpbGRlcih0aGlzLm5hbWUsIHRoaXMuYXJndW1lbnRzKTsKCiAgQG92ZXJyaWRlCiAgSW52YWxpZFR5cGVCdWlsZGVyPFQsIFI+IGJ1aWxkSW52YWxpZFR5cGUoTG9jYXRlZE1lc3NhZ2UgbWVzc2FnZSwKICAgICAge0xpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHR9KTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBiaW5kKFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgZGVjbGFyYXRpb24pIHsKICAgIHRoaXMuZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbj8ub3JpZ2luOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZXNvbHZlSW4oCiAgICAgIFNjb3BlIHNjb3BlLCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmksIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgIGlmIChkZWNsYXJhdGlvbiAhPSBudWxsKSByZXR1cm47CiAgICBmaW5hbCBuYW1lID0gdGhpcy5uYW1lOwogICAgRGVjbGFyYXRpb24gbWVtYmVyOwogICAgaWYgKG5hbWUgaXMgUXVhbGlmaWVkTmFtZSkgewogICAgICBPYmplY3QgcXVhbGlmaWVyID0gbmFtZS5xdWFsaWZpZXI7CiAgICAgIFN0cmluZyBwcmVmaXhOYW1lID0gZmxhdHRlbk5hbWUocXVhbGlmaWVyLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgICAgRGVjbGFyYXRpb24gcHJlZml4ID0gc2NvcGUubG9va3VwKHByZWZpeE5hbWUsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgICBpZiAocHJlZml4IGlzIFByZWZpeEJ1aWxkZXIpIHsKICAgICAgICBtZW1iZXIgPSBwcmVmaXgubG9va3VwKG5hbWUubmFtZSwgbmFtZS5jaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChuYW1lIGlzIFN0cmluZykgewogICAgICBtZW1iZXIgPSBzY29wZS5sb29rdXAobmFtZSwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICB9IGVsc2UgewogICAgICB1bmhhbmRsZWQoIiR7bmFtZS5ydW50aW1lVHlwZX0iLCAicmVzb2x2ZUluIiwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICB9CiAgICBpZiAobWVtYmVyIGlzIFR5cGVWYXJpYWJsZUJ1aWxkZXIpIHsKICAgICAgZGVjbGFyYXRpb24gPSBtZW1iZXIub3JpZ2luOwogICAgICBpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgICBTdHJpbmcgdHlwZU5hbWU7CiAgICAgICAgaW50IHR5cGVOYW1lT2Zmc2V0OwogICAgICAgIGlmIChuYW1lIGlzIElkZW50aWZpZXIpIHsKICAgICAgICAgIHR5cGVOYW1lID0gbmFtZS5uYW1lOwogICAgICAgICAgdHlwZU5hbWVPZmZzZXQgPSBuYW1lLmNoYXJPZmZzZXQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHR5cGVOYW1lID0gbmFtZTsKICAgICAgICAgIHR5cGVOYW1lT2Zmc2V0ID0gY2hhck9mZnNldDsKICAgICAgICB9CiAgICAgICAgZGVjbGFyYXRpb24gPSBidWlsZEludmFsaWRUeXBlKHRlbXBsYXRlVHlwZUFyZ3VtZW50c09uVHlwZVZhcmlhYmxlCiAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHR5cGVOYW1lKQogICAgICAgICAgICAud2l0aExvY2F0aW9uKGZpbGVVcmksIHR5cGVOYW1lT2Zmc2V0LCB0eXBlTmFtZS5sZW5ndGgpKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9IGVsc2UgaWYgKG1lbWJlciBpcyBUeXBlRGVjbGFyYXRpb25CdWlsZGVyKSB7CiAgICAgIGRlY2xhcmF0aW9uID0gbWVtYmVyLm9yaWdpbjsKICAgICAgaWYgKGFyZ3VtZW50cyA9PSBudWxsICYmIGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXNDb3VudCAhPSAwKSB7CiAgICAgICAgU3RyaW5nIHR5cGVOYW1lOwogICAgICAgIGludCB0eXBlTmFtZU9mZnNldDsKICAgICAgICBpZiAobmFtZSBpcyBJZGVudGlmaWVyKSB7CiAgICAgICAgICB0eXBlTmFtZSA9IG5hbWUubmFtZTsKICAgICAgICAgIHR5cGVOYW1lT2Zmc2V0ID0gbmFtZS5jaGFyT2Zmc2V0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0eXBlTmFtZSA9IG5hbWU7CiAgICAgICAgICB0eXBlTmFtZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgICAgICAgfQogICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgICAgdGVtcGxhdGVNaXNzaW5nRXhwbGljaXRUeXBlQXJndW1lbnRzCiAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzQ291bnQpLAogICAgICAgICAgICB0eXBlTmFtZU9mZnNldCwKICAgICAgICAgICAgdHlwZU5hbWUubGVuZ3RoLAogICAgICAgICAgICBmaWxlVXJpKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGUgPQogICAgICAgIG1lbWJlciA9PSBudWxsID8gdGVtcGxhdGVUeXBlTm90Rm91bmQgOiB0ZW1wbGF0ZU5vdEFUeXBlOwogICAgU3RyaW5nIGZsYXROYW1lID0gZmxhdHRlbk5hbWUobmFtZSwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0OwogICAgaWYgKG1lbWJlciAhPSBudWxsKSB7CiAgICAgIGNvbnRleHQgPSA8TG9jYXRlZE1lc3NhZ2U+WwogICAgICAgIG1lc3NhZ2VOb3RBVHlwZUNvbnRleHQud2l0aExvY2F0aW9uKG1lbWJlci5maWxlVXJpLCBtZW1iZXIuY2hhck9mZnNldCwKICAgICAgICAgICAgbmFtZSBpcyBJZGVudGlmaWVyID8gbmFtZS5uYW1lLmxlbmd0aCA6ICIkbmFtZSIubGVuZ3RoKQogICAgICBdOwogICAgfQogICAgaW50IGxlbmd0aCA9CiAgICAgICAgbmFtZSBpcyBJZGVudGlmaWVyID8gbmFtZS5lbmRDaGFyT2Zmc2V0IC0gY2hhck9mZnNldCA6IGZsYXROYW1lLmxlbmd0aDsKICAgIGRlY2xhcmF0aW9uID0gYnVpbGRJbnZhbGlkVHlwZSgKICAgICAgICB0ZW1wbGF0ZQogICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhmbGF0TmFtZSkKICAgICAgICAgICAgLndpdGhMb2NhdGlvbihmaWxlVXJpLCBjaGFyT2Zmc2V0LCBsZW5ndGgpLAogICAgICAgIGNvbnRleHQ6IGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjaGVjayhpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpIHsKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCAmJgogICAgICAgIGFyZ3VtZW50cy5sZW5ndGggIT0gZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlc0NvdW50KSB7CiAgICAgIGRlY2xhcmF0aW9uID0gYnVpbGRJbnZhbGlkVHlwZSh0ZW1wbGF0ZVR5cGVBcmd1bWVudE1pc21hdGNoCiAgICAgICAgICAud2l0aEFyZ3VtZW50cyhkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzQ291bnQpCiAgICAgICAgICAud2l0aExvY2F0aW9uKGZpbGVVcmksIGNoYXJPZmZzZXQsIG5vTGVuZ3RoKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIG5vcm1hbGl6ZShpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpIHsKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCAmJgogICAgICAgIGFyZ3VtZW50cy5sZW5ndGggIT0gZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlc0NvdW50KSB7CiAgICAgIC8vIFthcmd1bWVudHNdIHdpbGwgYmUgbm9ybWFsaXplZCBsYXRlciBpZiB0aGV5IGFyZSBudWxsLgogICAgICBhcmd1bWVudHMgPSBudWxsOwogICAgfQogIH0KCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIk5hbWVkVHlwZUJ1aWxkZXIiOwoKICBTdHJpbmdCdWZmZXIgcHJpbnRPbihTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CiAgICBidWZmZXIud3JpdGUobmFtZSk7CiAgICBpZiAoYXJndW1lbnRzPy5pc0VtcHR5ID8/IHRydWUpIHJldHVybiBidWZmZXI7CiAgICBidWZmZXIud3JpdGUoIjwiKTsKICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgZm9yIChUIHQgaW4gYXJndW1lbnRzKSB7CiAgICAgIGlmICghZmlyc3QpIGJ1ZmZlci53cml0ZSgiLCAiKTsKICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgdC5wcmludE9uKGJ1ZmZlcik7CiAgICB9CiAgICBidWZmZXIud3JpdGUoIj4iKTsKICAgIHJldHVybiBidWZmZXI7CiAgfQp9CoCmAE5OPAEiAR0JERISLiAYGiYtHgEqARYJFRQcGBcXDxUgHRUBUBUBFQEMLAEvAQxEJwEMMiwEAQwSSiUcGCEpR0olRQghOA1KBikjHxkcIiAsERsnCkslRggOMyNGGRwiICwRGycKHDFAHB0WCA4GN0I+IhoiT0QJBhFQJBElOBsEAQwsHT5COTkGBAEMMB0+QBgGBAEuAS4YMxcXHSYVGQYXEwQCATtwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9uYW1lZF90eXBlX2J1aWxkZXIuZGFydEBzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9wcmVmaXhfYnVpbGRlci5kYXJ0hQAvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5wcmVmaXhfYnVpbGRlcjsKCmltcG9ydCAnYnVpbGRlci5kYXJ0JyBzaG93IERlY2xhcmF0aW9uLCBMaWJyYXJ5QnVpbGRlciwgU2NvcGU7CgpjbGFzcyBQcmVmaXhCdWlsZGVyIGV4dGVuZHMgRGVjbGFyYXRpb24gewogIGZpbmFsIFN0cmluZyBuYW1lOwoKICBmaW5hbCBTY29wZSBleHBvcnRTY29wZSA9IG5ldyBTY29wZS50b3AoKTsKCiAgZmluYWwgTGlicmFyeUJ1aWxkZXIgcGFyZW50OwoKICBmaW5hbCBib29sIGRlZmVycmVkOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgY2hhck9mZnNldDsKCiAgZmluYWwgaW50IGltcG9ydEluZGV4OwoKICBQcmVmaXhCdWlsZGVyKAogICAgICB0aGlzLm5hbWUsIHRoaXMuZGVmZXJyZWQsIHRoaXMucGFyZW50LCB0aGlzLmNoYXJPZmZzZXQsIHRoaXMuaW1wb3J0SW5kZXgpOwoKICBVcmkgZ2V0IGZpbGVVcmkgPT4gcGFyZW50LmZpbGVVcmk7CgogIERlY2xhcmF0aW9uIGxvb2t1cChTdHJpbmcgbmFtZSwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpKSB7CiAgICByZXR1cm4gZXhwb3J0U2NvcGUubG9va3VwKG5hbWUsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogIH0KCiAgdm9pZCBhZGRUb0V4cG9ydFNjb3BlKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBtZW1iZXIsIGludCBjaGFyT2Zmc2V0KSB7CiAgICBNYXA8U3RyaW5nLCBEZWNsYXJhdGlvbj4gbWFwID0KICAgICAgICBtZW1iZXIuaXNTZXR0ZXIgPyBleHBvcnRTY29wZS5zZXR0ZXJzIDogZXhwb3J0U2NvcGUubG9jYWw7CiAgICBEZWNsYXJhdGlvbiBleGlzdGluZyA9IG1hcFtuYW1lXTsKICAgIGlmIChleGlzdGluZyAhPSBudWxsKSB7CiAgICAgIG1hcFtuYW1lXSA9IHBhcmVudC5jb21wdXRlQW1iaWd1b3VzRGVjbGFyYXRpb24oCiAgICAgICAgICBuYW1lLCBleGlzdGluZywgbWVtYmVyLCBjaGFyT2Zmc2V0LAogICAgICAgICAgaXNFeHBvcnQ6IHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgbWFwW25hbWVdID0gbWVtYmVyOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBmdWxsTmFtZUZvckVycm9ycyA9PiBuYW1lOwp9CjEATk48AR4BPwEqFQEtAR8BFwEMGAEZARFRASUBQToEAUsjQyYcNi4bDRoGBAEMKAIBN3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL3ByZWZpeF9idWlsZGVyLmRhcnRDc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvcHJvY2VkdXJlX2J1aWxkZXIuZGFydJDkLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEucHJvY2VkdXJlX2J1aWxkZXI7CgovLyBOb3RlOiB3ZSdyZSBkZWxpYmVyYXRlbHkgdXNpbmcgQXN5bmNNYXJrZXIgYW5kIFByb2NlZHVyZUtpbmQgZnJvbSBrZXJuZWwKLy8gb3V0c2lkZSB0aGUga2VybmVsLXNwZWNpZmljIGJ1aWxkZXJzLiBUaGlzIGlzIHNpbXBsZXIgdGhhbiBjcmVhdGluZwovLyBhZGRpdGlvbmFsIGVudW1zLgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IEFzeW5jTWFya2VyLCBQcm9jZWR1cmVLaW5kOwoKaW1wb3J0ICdidWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgRGVjbGFyYXRpb24sCiAgICAgICAgRm9ybWFsUGFyYW1ldGVyQnVpbGRlciwKICAgICAgICBMaWJyYXJ5QnVpbGRlciwKICAgICAgICBNZW1iZXJCdWlsZGVyLAogICAgICAgIE1ldGFkYXRhQnVpbGRlciwKICAgICAgICBTY29wZSwKICAgICAgICBUeXBlQnVpbGRlciwKICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyOwoKYWJzdHJhY3QgY2xhc3MgUHJvY2VkdXJlQnVpbGRlcjxUIGV4dGVuZHMgVHlwZUJ1aWxkZXI+IGV4dGVuZHMgTWVtYmVyQnVpbGRlciB7CiAgZmluYWwgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhOwoKICBmaW5hbCBpbnQgbW9kaWZpZXJzOwoKICBmaW5hbCBUIHJldHVyblR5cGU7CgogIGZpbmFsIFN0cmluZyBuYW1lOwoKICBmaW5hbCBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXM7CgogIGZpbmFsIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFsczsKCiAgUHJvY2VkdXJlQnVpbGRlcigKICAgICAgdGhpcy5tZXRhZGF0YSwKICAgICAgdGhpcy5tb2RpZmllcnMsCiAgICAgIHRoaXMucmV0dXJuVHlwZSwKICAgICAgdGhpcy5uYW1lLAogICAgICB0aGlzLnR5cGVWYXJpYWJsZXMsCiAgICAgIHRoaXMuZm9ybWFscywKICAgICAgTGlicmFyeUJ1aWxkZXIgY29tcGlsYXRpb25Vbml0LAogICAgICBpbnQgY2hhck9mZnNldCkKICAgICAgOiBzdXBlcihjb21waWxhdGlvblVuaXQsIGNoYXJPZmZzZXQpOwoKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiUHJvY2VkdXJlQnVpbGRlciI7CgogIEFzeW5jTWFya2VyIGdldCBhc3luY01vZGlmaWVyOwoKICBQcm9jZWR1cmVLaW5kIGdldCBraW5kOwoKICBib29sIGdldCBpc0NvbnN0cnVjdG9yID0+IGZhbHNlOwoKICBib29sIGdldCBpc1JlZ3VsYXJNZXRob2QgPT4gaWRlbnRpY2FsKFByb2NlZHVyZUtpbmQuTWV0aG9kLCBraW5kKTsKCiAgYm9vbCBnZXQgaXNHZXR0ZXIgPT4gaWRlbnRpY2FsKFByb2NlZHVyZUtpbmQuR2V0dGVyLCBraW5kKTsKCiAgYm9vbCBnZXQgaXNTZXR0ZXIgPT4gaWRlbnRpY2FsKFByb2NlZHVyZUtpbmQuU2V0dGVyLCBraW5kKTsKCiAgYm9vbCBnZXQgaXNPcGVyYXRvciA9PiBpZGVudGljYWwoUHJvY2VkdXJlS2luZC5PcGVyYXRvciwga2luZCk7CgogIGJvb2wgZ2V0IGlzRmFjdG9yeSA9PiBpZGVudGljYWwoUHJvY2VkdXJlS2luZC5GYWN0b3J5LCBraW5kKTsKCiAgdm9pZCBzZXQgYm9keShjb3ZhcmlhbnQgc3RhdGVtZW50KTsKCiAgLy8vIFRoaXMgaXMgdGhlIGZvcm1hbCBwYXJhbWV0ZXIgc2NvcGUgYXMgc3BlY2lmaWVkIGluIHRoZSBEYXJ0IFByb2dyYW1taW5nCiAgLy8vIExhbmd1YWdlIFNwZWNpZmljdGlvbiwgNHRoIGVkLCBzZWN0aW9uIDkuMi4KICBTY29wZSBjb21wdXRlRm9ybWFsUGFyYW1ldGVyU2NvcGUoU2NvcGUgcGFyZW50KSB7CiAgICBpZiAoZm9ybWFscyA9PSBudWxsKSByZXR1cm4gcGFyZW50OwogICAgTWFwPFN0cmluZywgRGVjbGFyYXRpb24+IGxvY2FsID0gPFN0cmluZywgRGVjbGFyYXRpb24+e307CiAgICBmb3IgKEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgZm9ybWFsIGluIGZvcm1hbHMpIHsKICAgICAgaWYgKCFpc0NvbnN0cnVjdG9yIHx8ICFmb3JtYWwuaXNJbml0aWFsaXppbmdGb3JtYWwpIHsKICAgICAgICBsb2NhbFtmb3JtYWwubmFtZV0gPSBmb3JtYWw7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgU2NvcGUobG9jYWwsIG51bGwsIHBhcmVudCwgImZvcm1hbCBwYXJhbWV0ZXIiLAogICAgICAgIGlzTW9kaWZpYWJsZTogZmFsc2UpOwogIH0KCiAgU2NvcGUgY29tcHV0ZUZvcm1hbFBhcmFtZXRlckluaXRpYWxpemVyU2NvcGUoU2NvcGUgcGFyZW50KSB7CiAgICAvLyBGcm9tCiAgICAvLyBbZGFydExhbmdTcGVjLnRleF0oLi4vLi4vLi4vLi4vLi4vLi4vZG9jcy9sYW5ndWFnZS9kYXJ0TGFuZ1NwZWMudGV4KSBhdAogICAgLy8gcmV2aXNpb24gOTRiMjNkM2IxMjVlOWQyNDZlMDdhMmI0M2I2MTc0MDc1OWEwZGFjZToKICAgIC8vCiAgICAvLyBXaGVuIHRoZSBmb3JtYWwgcGFyYW1ldGVyIGxpc3Qgb2YgYSBub24tcmVkaXJlY3RpbmcgZ2VuZXJhdGl2ZQogICAgLy8gY29uc3RydWN0b3IgY29udGFpbnMgYW55IGluaXRpYWxpemluZyBmb3JtYWxzLCBhIG5ldyBzY29wZSBpcwogICAgLy8gaW50cm9kdWNlZCwgdGhlIF9mb3JtYWwgcGFyYW1ldGVyIGluaXRpYWxpemVyIHNjb3BlXywgd2hpY2ggaXMgdGhlCiAgICAvLyBjdXJyZW50IHNjb3BlIG9mIHRoZSBpbml0aWFsaXplciBsaXN0IG9mIHRoZSBjb25zdHJ1Y3RvciwgYW5kIHdoaWNoIGlzCiAgICAvLyBlbmNsb3NlZCBpbiB0aGUgc2NvcGUgd2hlcmUgdGhlIGNvbnN0cnVjdG9yIGlzIGRlY2xhcmVkLiAgRWFjaAogICAgLy8gaW5pdGlhbGl6aW5nIGZvcm1hbCBpbiB0aGUgZm9ybWFsIHBhcmFtZXRlciBsaXN0IGludHJvZHVjZXMgYSBmaW5hbAogICAgLy8gbG9jYWwgdmFyaWFibGUgaW50byB0aGUgZm9ybWFsIHBhcmFtZXRlciBpbml0aWFsaXplciBzY29wZSwgYnV0IG5vdCBpbnRvCiAgICAvLyB0aGUgZm9ybWFsIHBhcmFtZXRlciBzY29wZTsgZXZlcnkgb3RoZXIgZm9ybWFsIHBhcmFtZXRlciBpbnRyb2R1Y2VzIGEKICAgIC8vIGxvY2FsIHZhcmlhYmxlIGludG8gYm90aCB0aGUgZm9ybWFsIHBhcmFtZXRlciBzY29wZSBhbmQgdGhlIGZvcm1hbAogICAgLy8gcGFyYW1ldGVyIGluaXRpYWxpemVyIHNjb3BlLgoKICAgIGlmIChmb3JtYWxzID09IG51bGwpIHJldHVybiBwYXJlbnQ7CiAgICBNYXA8U3RyaW5nLCBEZWNsYXJhdGlvbj4gbG9jYWwgPSA8U3RyaW5nLCBEZWNsYXJhdGlvbj57fTsKICAgIGZvciAoRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgaW4gZm9ybWFscykgewogICAgICBsb2NhbFtmb3JtYWwubmFtZV0gPSBmb3JtYWwuZm9yRm9ybWFsUGFyYW1ldGVySW5pdGlhbGl6ZXJTY29wZSgpOwogICAgfQogICAgcmV0dXJuIG5ldyBTY29wZShsb2NhbCwgbnVsbCwgcGFyZW50LCAiZm9ybWFsIHBhcmFtZXRlciBpbml0aWFsaXplciIsCiAgICAgICAgaXNNb2RpZmlhYmxlOiBmYWxzZSk7CiAgfQoKICAvLy8gVGhpcyBzY29wZSBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gYW55IHNjb3BlIHNwZWNpZmllZCBpbiB0aGUgRGFydAogIC8vLyBQcm9ncmFtbWluZyBMYW5ndWFnZSBTcGVjaWZpY3Rpb24sIDR0aCBlZC4gSXQncyBhbiB1bnNwZWNpZmllZCBleHRlbnNpb24KICAvLy8gdG8gc3VwcG9ydCBnZW5lcmljIG1ldGhvZHMuCiAgU2NvcGUgY29tcHV0ZVR5cGVQYXJhbWV0ZXJTY29wZShTY29wZSBwYXJlbnQpIHsKICAgIGlmICh0eXBlVmFyaWFibGVzID09IG51bGwpIHJldHVybiBwYXJlbnQ7CiAgICBNYXA8U3RyaW5nLCBEZWNsYXJhdGlvbj4gbG9jYWwgPSA8U3RyaW5nLCBEZWNsYXJhdGlvbj57fTsKICAgIGZvciAoVHlwZVZhcmlhYmxlQnVpbGRlciB2YXJpYWJsZSBpbiB0eXBlVmFyaWFibGVzKSB7CiAgICAgIGxvY2FsW3ZhcmlhYmxlLm5hbWVdID0gdmFyaWFibGU7CiAgICB9CiAgICByZXR1cm4gbmV3IFNjb3BlKGxvY2FsLCBudWxsLCBwYXJlbnQsICJ0eXBlIHBhcmFtZXRlciIsCiAgICAgICAgaXNNb2RpZmlhYmxlOiBmYWxzZSk7CiAgfQoKICBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGdldEZvcm1hbChTdHJpbmcgbmFtZSkgewogICAgaWYgKGZvcm1hbHMgIT0gbnVsbCkgewogICAgICBmb3IgKEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgZm9ybWFsIGluIGZvcm1hbHMpIHsKICAgICAgICBpZiAoZm9ybWFsLm5hbWUgPT0gbmFtZSkgcmV0dXJuIGZvcm1hbDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQp9CoCBAE5OPAEhAUxHFUIBFgkVIBgXGQ8VHQFPKAEXARYBFQExAS4BFBUWFxEaFCYWLAEuASEBGgEjAUUBPgE+AUIBQAEmAU4yNCg+NTwlCAY+HgQBPwxPOgdGRUpORktQTUokASg+NUgGSh4EAUdPIjIuPjonBjweBAEyGzcwCAYRBAIBOnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL3Byb2NlZHVyZV9idWlsZGVyLmRhcnREc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvdHlwZV9hbGlhc19idWlsZGVyLmRhcnSD0S8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmZ1bmN0aW9uX3R5cGVfYWxpYXNfYnVpbGRlcjsKCmltcG9ydCAnYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIExpYnJhcnlCdWlsZGVyLAogICAgICAgIE1ldGFkYXRhQnVpbGRlciwKICAgICAgICBUeXBlQnVpbGRlciwKICAgICAgICBUeXBlRGVjbGFyYXRpb25CdWlsZGVyLAogICAgICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXI7CgphYnN0cmFjdCBjbGFzcyBUeXBlQWxpYXNCdWlsZGVyPFQgZXh0ZW5kcyBUeXBlQnVpbGRlciwgUj4KICAgIGV4dGVuZHMgVHlwZURlY2xhcmF0aW9uQnVpbGRlcjxULCBSPiB7CiAgZmluYWwgVCB0eXBlOwoKICBmaW5hbCBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI8VCwgUj4+IHR5cGVWYXJpYWJsZXM7CgogIFR5cGVBbGlhc0J1aWxkZXIoCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPFQ+PiBtZXRhZGF0YSwKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIHRoaXMudHlwZVZhcmlhYmxlcywKICAgICAgdGhpcy50eXBlLAogICAgICBMaWJyYXJ5QnVpbGRlcjxULCBPYmplY3Q+IHBhcmVudCwKICAgICAgaW50IGNoYXJPZmZzZXQpCiAgICAgIDogc3VwZXIobWV0YWRhdGEsIG51bGwsIG5hbWUsIHBhcmVudCwgY2hhck9mZnNldCk7CgogIFN0cmluZyBnZXQgZGVidWdOYW1lID0+ICJUeXBlQWxpYXNCdWlsZGVyIjsKCiAgTGlicmFyeUJ1aWxkZXI8VCwgT2JqZWN0PiBnZXQgcGFyZW50ID0+IHN1cGVyLnBhcmVudDsKCiAgaW50IGdldCB0eXBlVmFyaWFibGVzQ291bnQ7Cn0KJQBOTjwBKwEWCRgZFSAdATorEAE3ARQpExoRKBY5AS4BOAEeAgE7cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvdHlwZV9hbGlhc19idWlsZGVyLmRhcnQ+c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvdHlwZV9idWlsZGVyLmRhcnSGRS8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnR5cGVfYnVpbGRlcjsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcgc2hvdyBMb2NhdGVkTWVzc2FnZTsKCmltcG9ydCAnYnVpbGRlci5kYXJ0JwogICAgc2hvdyBMaWJyYXJ5QnVpbGRlciwgU2NvcGUsIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIsIFR5cGVWYXJpYWJsZUJ1aWxkZXI7CgphYnN0cmFjdCBjbGFzcyBUeXBlQnVpbGRlciB7CiAgY29uc3QgVHlwZUJ1aWxkZXIoKTsKCiAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciBnZXQgZGVjbGFyYXRpb24gPT4gbnVsbDsKCiAgdm9pZCByZXNvbHZlSW4oCiAgICAgIFNjb3BlIHNjb3BlLCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmksIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHt9CgogIC8vLyBTZWUgYFVucmVzb2x2ZWRUeXBlLmNoZWNrVHlwZWAuCiAgdm9pZCBjaGVjayhpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpIHt9CgogIC8vLyBTZWUgYFVucmVzb2x2ZWRUeXBlLm5vcm1hbGl6ZVR5cGVgLgogIHZvaWQgbm9ybWFsaXplKGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSkge30KCiAgdm9pZCBiaW5kKFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgYnVpbGRlcikge30KCiAgLy8vIE1heSByZXR1cm4gbnVsbCwgZm9yIGV4YW1wbGUsIGZvciBtaXhpbiBhcHBsaWNhdGlvbnMuCiAgT2JqZWN0IGdldCBuYW1lOwoKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZTsKCiAgU3RyaW5nQnVmZmVyIHByaW50T24oU3RyaW5nQnVmZmVyIGJ1ZmZlcik7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICIkZGVidWdOYW1lKCR7cHJpbnRPbihuZXcgU3RyaW5nQnVmZmVyKCkpfSkiOwoKICBUeXBlQnVpbGRlciBzdWJzdChNYXA8VHlwZVZhcmlhYmxlQnVpbGRlciwgVHlwZUJ1aWxkZXI+IHN1YnN0aXR1dGlvbikgPT4gdGhpczsKCiAgLy8vIENsb25lcyB0aGUgdHlwZSBidWlsZGVyIHJlY3Vyc2l2ZWx5IHdpdGhvdXQgYmluZGluZyB0aGUgc3VidGVybXMgdG8KICAvLy8gZXhpc3RpbmcgZGVjbGFyYXRpb24gb3IgdHlwZSB2YXJpYWJsZSBidWlsZGVycy4gIEFsbCBuZXdseSBidWlsdCB0eXBlcwogIC8vLyBhcmUgYWRkZWQgdG8gW25ld1R5cGVzXSwgc28gdGhhdCB0aGV5IGNhbiBiZSBhZGRlZCB0byBhIHByb3BlciBzY29wZSBhbmQKICAvLy8gcmVzb2x2ZWQgbGF0ZXIuCiAgVHlwZUJ1aWxkZXIgY2xvbmUoTGlzdDxUeXBlQnVpbGRlcj4gbmV3VHlwZXMpOwoKICBidWlsZChMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KTsKCiAgYnVpbGRJbnZhbGlkVHlwZShMb2NhdGVkTWVzc2FnZSBtZXNzYWdlLCB7TGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dH0pOwoKICBTdHJpbmcgZ2V0IGZ1bGxOYW1lRm9yRXJyb3JzID0+ICIke3ByaW50T24obmV3IFN0cmluZ0J1ZmZlcigpKX0iOwp9CjQATk48ARwBMgEWTQEdFwEyARJLASYtASoxAS8BPBMBGAEtAUUBUQFKTU8WMQEhAUwBRAIBNXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL3R5cGVfYnVpbGRlci5kYXJ0SnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL3R5cGVfZGVjbGFyYXRpb25fYnVpbGRlci5kYXJ0hGAvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS50eXBlX2RlY2xhcmF0aW9uX2J1aWxkZXI7CgppbXBvcnQgJ2J1aWxkZXIuZGFydCcKICAgIHNob3cKICAgICAgICBEZWNsYXJhdGlvbiwKICAgICAgICBMaWJyYXJ5QnVpbGRlciwKICAgICAgICBNZXRhZGF0YUJ1aWxkZXIsCiAgICAgICAgTW9kaWZpZXJCdWlsZGVyLAogICAgICAgIFR5cGVCdWlsZGVyOwoKYWJzdHJhY3QgY2xhc3MgVHlwZURlY2xhcmF0aW9uQnVpbGRlcjxUIGV4dGVuZHMgVHlwZUJ1aWxkZXIsIFI+CiAgICBleHRlbmRzIE1vZGlmaWVyQnVpbGRlciB7CiAgZmluYWwgTGlzdDxNZXRhZGF0YUJ1aWxkZXI8VD4+IG1ldGFkYXRhOwoKICBmaW5hbCBpbnQgbW9kaWZpZXJzOwoKICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgRGVjbGFyYXRpb24gcGFyZW50OwoKICBUeXBlRGVjbGFyYXRpb25CdWlsZGVyKAogICAgICB0aGlzLm1ldGFkYXRhLCB0aGlzLm1vZGlmaWVycywgdGhpcy5uYW1lLCB0aGlzLnBhcmVudCwgaW50IGNoYXJPZmZzZXQsCiAgICAgIFtVcmkgZmlsZVVyaV0pCiAgICAgIDogc3VwZXIocGFyZW50LCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKCiAgYm9vbCBnZXQgaXNUeXBlRGVjbGFyYXRpb24gPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBmdWxsTmFtZUZvckVycm9ycyA9PiBuYW1lOwoKICBpbnQgZ2V0IHR5cGVWYXJpYWJsZXNDb3VudCA9PiAwOwoKICBSIGJ1aWxkVHlwZShMaWJyYXJ5QnVpbGRlcjxULCBPYmplY3Q+IGxpYnJhcnksIExpc3Q8VD4gYXJndW1lbnRzKTsKCiAgLy8vIFthcmd1bWVudHNdIGhhdmUgYWxyZWFkeSBiZWVuIGJ1aWx0LgogIFIgYnVpbGRUeXBlc1dpdGhCdWlsdEFyZ3VtZW50cygKICAgICAgTGlicmFyeUJ1aWxkZXI8VCwgT2JqZWN0PiBsaWJyYXJ5LCBMaXN0PFI+IGFyZ3VtZW50cyk7Cn0KLABOTjwBKAEWCRUYGRkVAUAeKwEXARUBFgEaTRUsASYBDCgBIwFFASsiPQIBQXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL3R5cGVfZGVjbGFyYXRpb25fYnVpbGRlci5kYXJ0R3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL3R5cGVfdmFyaWFibGVfYnVpbGRlci5kYXJ0hBQvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS50eXBlX3ZhcmlhYmxlX2J1aWxkZXI7CgppbXBvcnQgJ2J1aWxkZXIuZGFydCcgc2hvdyBMaWJyYXJ5QnVpbGRlciwgVHlwZUJ1aWxkZXIsIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXI7CgphYnN0cmFjdCBjbGFzcyBUeXBlVmFyaWFibGVCdWlsZGVyPFQgZXh0ZW5kcyBUeXBlQnVpbGRlciwgUj4KICAgIGV4dGVuZHMgVHlwZURlY2xhcmF0aW9uQnVpbGRlcjxULCBSPiB7CiAgVCBib3VuZDsKCiAgVCBkZWZhdWx0VHlwZTsKCiAgVHlwZVZhcmlhYmxlQnVpbGRlcigKICAgICAgU3RyaW5nIG5hbWUsIHRoaXMuYm91bmQsIExpYnJhcnlCdWlsZGVyIGNvbXBpbGF0aW9uVW5pdCwgaW50IGNoYXJPZmZzZXQpCiAgICAgIDogc3VwZXIobnVsbCwgMCwgbmFtZSwgY29tcGlsYXRpb25Vbml0LCBjaGFyT2Zmc2V0KTsKCiAgYm9vbCBnZXQgaXNUeXBlVmFyaWFibGUgPT4gdHJ1ZTsKCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIlR5cGVWYXJpYWJsZUJ1aWxkZXIiOwoKICBTdHJpbmdCdWZmZXIgcHJpbnRPbihTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CiAgICBidWZmZXIud3JpdGUobmFtZSk7CiAgICBpZiAoYm91bmQgIT0gbnVsbCkgewogICAgICBidWZmZXIud3JpdGUoIiBleHRlbmRzICIpOwogICAgICBib3VuZC5wcmludE9uKGJ1ZmZlcik7CiAgICB9CiAgICByZXR1cm4gYnVmZmVyOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIiR7cHJpbnRPbihuZXcgU3RyaW5nQnVmZmVyKCkpfSI7CgogIFQgYXNUeXBlQnVpbGRlcigpOwoKICBUeXBlVmFyaWFibGVCdWlsZGVyIGNsb25lKExpc3Q8VHlwZUJ1aWxkZXI+IG5ld1R5cGVzKTsKfQonAE5OPAElAVABPSsLAREBF087ASMBMQEuGBkhHQYTBAE5ARUBOQIBPnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL3R5cGVfdmFyaWFibGVfYnVpbGRlci5kYXJ0QXNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL3VucmVzb2x2ZWRfdHlwZS5kYXJ0g9kvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS51bnJlc29sdmVkX3R5cGU7CgppbXBvcnQgJ2J1aWxkZXIuZGFydCcgc2hvdyBMaWJyYXJ5QnVpbGRlciwgU2NvcGUsIFR5cGVCdWlsZGVyOwoKLy8vIEEgd3JhcHBlciBhcm91bmQgYSB0eXBlIHRoYXQgaXMgeWV0IHRvIGJlIHJlc29sdmVkLgpjbGFzcyBVbnJlc29sdmVkVHlwZTxUIGV4dGVuZHMgVHlwZUJ1aWxkZXI+IHsKICBmaW5hbCBUIGJ1aWxkZXI7CiAgZmluYWwgaW50IGNoYXJPZmZzZXQ7CiAgZmluYWwgVXJpIGZpbGVVcmk7CgogIFVucmVzb2x2ZWRUeXBlKHRoaXMuYnVpbGRlciwgdGhpcy5jaGFyT2Zmc2V0LCB0aGlzLmZpbGVVcmkpOwoKICB2b2lkIHJlc29sdmVJbihTY29wZSBzY29wZSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgPT4KICAgICAgYnVpbGRlci5yZXNvbHZlSW4oc2NvcGUsIGNoYXJPZmZzZXQsIGZpbGVVcmksIGxpYnJhcnkpOwoKICAvLy8gUGVyZm9ybXMgY2hlY2tzIG9uIHRoZSB0eXBlIGFmdGVyIGl0J3MgcmVzb2x2ZWQuCiAgdm9pZCBjaGVja1R5cGUoKSA9PiBidWlsZGVyLmNoZWNrKGNoYXJPZmZzZXQsIGZpbGVVcmkpOwoKICAvLy8gTm9ybWFsaXplcyB0aGUgdHlwZSBhcmd1bWVudHMgaW4gYWNjb3JkYW5jZSB3aXRoIERhcnQgMSBzZW1hbnRpY3MuCiAgdm9pZCBub3JtYWxpemVUeXBlKCkgPT4gYnVpbGRlci5ub3JtYWxpemUoY2hhck9mZnNldCwgZmlsZVVyaSk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJVbnJlc29sdmVkVHlwZShAJGNoYXJPZmZzZXQsICRidWlsZGVyKSI7Cn0KHQBOTjwBHwE/ATguExgVAT8BOT4BNzoBSUIBQQIBOHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL3VucmVzb2x2ZWRfdHlwZS5kYXJ0Q3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL3ZvaWRfdHlwZV9idWlsZGVyLmRhcnSCUy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnZvaWRfdHlwZV9idWlsZGVyOwoKaW1wb3J0ICdidWlsZGVyLmRhcnQnIHNob3cgQnVpbHRpblR5cGVCdWlsZGVyLCBMaWJyYXJ5QnVpbGRlciwgVHlwZUJ1aWxkZXI7CgpjbGFzcyBWb2lkVHlwZUJ1aWxkZXI8VCBleHRlbmRzIFR5cGVCdWlsZGVyLCBSPgogICAgZXh0ZW5kcyBCdWlsdGluVHlwZUJ1aWxkZXI8VCwgUj4gewogIFZvaWRUeXBlQnVpbGRlcihSIHR5cGUsIExpYnJhcnlCdWlsZGVyIGNvbXBpbGF0aW9uVW5pdCwgaW50IGNoYXJPZmZzZXQpCiAgICAgIDogc3VwZXIoInZvaWQiLCB0eXBlLCBjb21waWxhdGlvblVuaXQsIGNoYXJPZmZzZXQpOwoKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiVm9pZFR5cGVCdWlsZGVyIjsKfQoRAE5OPAEhAUwBMCdKOgEtAgE6cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvdm9pZF90eXBlX2J1aWxkZXIuZGFydEJzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvc2Nhbm5lci9hYnN0cmFjdF9zY2FubmVyLmRhcnTAAJ7XLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuc2Nhbm5lci5hYnN0cmFjdF9zY2FubmVyOwoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nIHNob3cgTGlzdE1peGluOwoKaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDE2TGlzdCwgVWludDMyTGlzdDsKCmltcG9ydCAnLi4vLi4vc2Nhbm5lci90b2tlbi5kYXJ0JyBzaG93IEJlZ2luVG9rZW4sIFRva2VuLCBUb2tlblR5cGU7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnCiAgICBzaG93CiAgICAgICAgTWVzc2FnZSwKICAgICAgICBtZXNzYWdlRXhwZWN0ZWRIZXhEaWdpdCwKICAgICAgICBtZXNzYWdlTWlzc2luZ0V4cG9uZW50LAogICAgICAgIG1lc3NhZ2VVbmV4cGVjdGVkRG9sbGFySW5TdHJpbmcsCiAgICAgICAgbWVzc2FnZVVudGVybWluYXRlZENvbW1lbnQ7CgppbXBvcnQgJy4uL3NjYW5uZXIuZGFydCcKICAgIHNob3cgRXJyb3JUb2tlbiwgS2V5d29yZCwgU2Nhbm5lciwgYnVpbGRVbmV4cGVjdGVkQ2hhcmFjdGVyVG9rZW47CgppbXBvcnQgJ2Vycm9yX3Rva2VuLmRhcnQnCiAgICBzaG93IFVuc3VwcG9ydGVkT3BlcmF0b3IsIFVudGVybWluYXRlZFN0cmluZywgVW50ZXJtaW5hdGVkVG9rZW47CgppbXBvcnQgJ2tleXdvcmRfc3RhdGUuZGFydCcgc2hvdyBLZXl3b3JkU3RhdGU7CgppbXBvcnQgJ3Rva2VuLmRhcnQnIHNob3cgQ29tbWVudFRva2VuLCBEYXJ0RG9jVG9rZW47CgppbXBvcnQgJ3Rva2VuX2NvbnN0YW50cy5kYXJ0JzsKCmltcG9ydCAnY2hhcmFjdGVycy5kYXJ0JzsKCmFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2Nhbm5lciBpbXBsZW1lbnRzIFNjYW5uZXIgewogIC8qKgogICAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgY2hhcmFjdGVyIHNlcXVlbmNlcyBgJiY9YCBhbmQgYHx8PWAKICAgKiBzaG91bGQgYmUgdG9rZW5pemVkIGFzIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9ycwogICAqIFtBTVBFUlNBTkRfQU1QRVJTQU5EX0VRX1RPS0VOXSBhbmQgW0JBUl9CQVJfRVFfVE9LRU5dIHJlc3BlY3RpdmVseS4KICAgKiBTZWUgaXNzdWUgaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzMwMzQwCiAgICovCiAgc3RhdGljIGNvbnN0IGJvb2wgTEFaWV9BU1NJR05NRU5UX0VOQUJMRUQgPSBmYWxzZTsKCiAgZmluYWwgYm9vbCBpbmNsdWRlQ29tbWVudHM7CgogIC8vLyBFeHBlcmltZW50YWwgZmxhZyBmb3IgZW5hYmxpbmcgc2Nhbm5pbmcgb2YgYD4+PmAuCiAgLy8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL2xhbmd1YWdlL2lzc3Vlcy82MQogIC8vLyBhbmQgaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9sYW5ndWFnZS9pc3N1ZXMvNjAKICBib29sIGVuYWJsZUd0R3RHdCA9IGZhbHNlOwoKICAvLy8gRXhwZXJpbWVudGFsIGZsYWcgZm9yIGVuYWJsaW5nIHNjYW5uaW5nIG9mIGA+Pj49YC4KICAvLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvbGFuZ3VhZ2UvaXNzdWVzLzYxCiAgLy8vIGFuZCBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL2xhbmd1YWdlL2lzc3Vlcy82MAogIGJvb2wgZW5hYmxlR3RHdEd0RXEgPSBmYWxzZTsKCiAgLyoqCiAgICogVGhlIHN0cmluZyBvZmZzZXQgZm9yIHRoZSBuZXh0IHRva2VuIHRoYXQgd2lsbCBiZSBjcmVhdGVkLgogICAqCiAgICogTm90ZSB0aGF0IGluIHRoZSBbVXRmOEJ5dGVzU2Nhbm5lcl0sIFtzdHJpbmdPZmZzZXRdIGFuZCBbc2Nhbk9mZnNldF0gdmFsdWVzCiAgICogYXJlIGRpZmZlcmVudC4gT25lIHN0cmluZyBjaGFyYWN0ZXIgY2FuIGJlIGVuY29kZWQgdXNpbmcgbXVsdGlwbGUgVVRGLTgKICAgKiBieXRlcy4KICAgKi8KICBpbnQgdG9rZW5TdGFydCA9IC0xOwoKICAvKioKICAgKiBBIHBvaW50ZXIgdG8gdGhlIHRva2VuIHN0cmVhbSBjcmVhdGVkIGJ5IHRoaXMgc2Nhbm5lci4gVGhlIGZpcnN0IHRva2VuCiAgICogaXMgYSBzcGVjaWFsIHRva2VuIGFuZCBub3QgcGFydCBvZiB0aGUgc291cmNlIGZpbGUuIFRoaXMgaXMgYW4KICAgKiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgdG8gYXZvaWRzIHNwZWNpYWwgY2FzZXMgaW4gdGhlIHNjYW5uZXIuIFRoaXMgdG9rZW4KICAgKiBpcyBub3QgZXhwb3NlZCB0byBjbGllbnRzIG9mIHRoZSBzY2FubmVyLCB3aGljaCBhcmUgZXhwZWN0ZWQgdG8gaW52b2tlCiAgICogW2ZpcnN0VG9rZW5dIHRvIGFjY2VzcyB0aGUgdG9rZW4gc3RyZWFtLgogICAqLwogIGZpbmFsIFRva2VuIHRva2VucyA9IG5ldyBUb2tlbi5lb2YoLTEpOwoKICAvKioKICAgKiBBIHBvaW50ZXIgdG8gdGhlIGxhc3Qgc2Nhbm5lZCB0b2tlbi4KICAgKi8KICBUb2tlbiB0YWlsOwoKICAvKioKICAgKiBBIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBvZiBjb21tZW50IHRva2VucyBjcmVhdGVkIGJ5IHRoaXMgc2Nhbm5lcgogICAqIGJlZm9yZSB0aGV5IGFyZSBhc3NpZ25lZCB0byB0aGUgW1Rva2VuXSBwcmVjZWRpbmdDb21tZW50cyBmaWVsZAogICAqIG9mIGEgbm9uLWNvbW1lbnQgdG9rZW4uIEEgdmFsdWUgb2YgYG51bGxgIGluZGljYXRlcyBubyBjb21tZW50IHRva2Vucy4KICAgKi8KICBDb21tZW50VG9rZW4gY29tbWVudHM7CgogIC8qKgogICAqIEEgcG9pbnRlciB0byB0aGUgbGFzdCBzY2FubmVkIGNvbW1lbnQgdG9rZW4gb3IgYG51bGxgIGlmIG5vbmUuCiAgICovCiAgVG9rZW4gY29tbWVudHNUYWlsOwoKICBmaW5hbCBMaXN0PGludD4gbGluZVN0YXJ0czsKCiAgQWJzdHJhY3RTY2FubmVyKHRoaXMuaW5jbHVkZUNvbW1lbnRzLCB7aW50IG51bWJlck9mQnl0ZXNIaW50fSkKICAgICAgOiBsaW5lU3RhcnRzID0gbmV3IExpbmVTdGFydHMobnVtYmVyT2ZCeXRlc0hpbnQpIHsKICAgIHRoaXMudGFpbCA9IHRoaXMudG9rZW5zOwogIH0KCiAgLyoqCiAgICogQWR2YW5jZXMgYW5kIHJldHVybnMgdGhlIG5leHQgY2hhcmFjdGVyLgogICAqCiAgICogSWYgdGhlIG5leHQgY2hhcmFjdGVyIGlzIG5vbi1BU0NJSSwgdGhlbiB0aGUgcmV0dXJuZWQgdmFsdWUgZGVwZW5kcyBvbiB0aGUKICAgKiBzY2FubmVyIGltcGxlbWVudGF0aW9uLiBUaGUgW1V0ZjhCeXRlc1NjYW5uZXJdIHJldHVybnMgYSBVVEYtOCBieXRlLCB3aGlsZQogICAqIHRoZSBbU3RyaW5nU2Nhbm5lcl0gcmV0dXJucyBhIFVURi0xNiBjb2RlIHVuaXQuCiAgICoKICAgKiBUaGUgc2Nhbm5lciBlbnN1cmVzIHRoYXQgW2FkdmFuY2VdIGlzIG5vdCBpbnZva2VkIGFmdGVyIGl0IHJldHVybmVkIFskRU9GXS4KICAgKiBUaGlzIGFsbG93cyBpbXBsZW1lbnRhdGlvbnMgdG8gb21pdCBib3VuZCBjaGVja3MgaWYgdGhlIGRhdGEgc3RydWN0dXJlIGVuZHMKICAgKiB3aXRoICcwJy4KICAgKi8KICBpbnQgYWR2YW5jZSgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHVuaWNvZGUgY2hhcmFjdGVyLgogICAqCiAgICogSWYgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGlzIEFTQ0lJLCB0aGVuIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KICAgKgogICAqIFRoZSBbVXRmOEJ5dGVzU2Nhbm5lcl0gZGVjb2RlcyB0aGUgbmV4dCB1bmljb2RlIGNvZGUgcG9pbnQgc3RhcnRpbmcgYXQgdGhlCiAgICogY3VycmVudCBwb3NpdGlvbi4gTm90ZSB0aGF0IGV2ZXJ5IHVuaWNvZGUgY2hhcmFjdGVyIGlzIHJldHVybmVkIGFzIGEgc2luZ2xlCiAgICogY29kZSBwb2ludCwgdGhhdCBpcywgZm9yICdcdXsxZDExZX0nIGl0IHJldHVybnMgMTE5MDcwLCBhbmQgdGhlIGZvbGxvd2luZwogICAqIFthZHZhbmNlXSByZXR1cm5zIHRoZSBuZXh0IGNoYXJhY3Rlci4KICAgKgogICAqIFRoZSBbU3RyaW5nU2Nhbm5lcl0gcmV0dXJucyB0aGUgY3VycmVudCBjaGFyYWN0ZXIgdW5jaGFuZ2VkLCB3aGljaCBtaWdodAogICAqIGJlIGEgc3Vycm9nYXRlIGNoYXJhY3Rlci4gSW4gdGhlIGNhc2Ugb2YgJ1x1ezFkMTFlfScsIGl0IHJldHVybnMgdGhlIGZpcnN0CiAgICogY29kZSB1bml0IDU1MzQ4LCBhbmQgdGhlIGZvbGxvd2luZyBbYWR2YW5jZV0gcmV0dXJucyB0aGUgc2Vjb25kIGNvZGUgdW5pdAogICAqIDU2NjA2LgogICAqCiAgICogSW52b2tpbmcgW2N1cnJlbnRBc1VuaWNvZGVdIG11bHRpcGxlIHRpbWVzIGlzIHNhZmUsIGkuZS4sCiAgICogWzpjdXJyZW50QXNVbmljb2RlKG5leHQpID09IGN1cnJlbnRBc1VuaWNvZGUoY3VycmVudEFzVW5pY29kZShuZXh0KSk6XS4KICAgKi8KICBpbnQgY3VycmVudEFzVW5pY29kZShpbnQgbmV4dCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdCB0aGUgbmV4dCBwb3NpdGlvbi4gTGlrZSBpbiBbYWR2YW5jZV0sIHRoZQogICAqIFtVdGY4Qnl0ZXNTY2FubmVyXSByZXR1cm5zIGEgVVRGLTggYnl0ZSwgd2hpbGUgdGhlIFtTdHJpbmdTY2FubmVyXSByZXR1cm5zCiAgICogYSBVVEYtMTYgY29kZSB1bml0LgogICAqLwogIGludCBwZWVrKCk7CgogIC8qKgogICAqIE5vdGlmaWVzIHRoZSBzY2FubmVyIHRoYXQgdW5pY29kZSBjaGFyYWN0ZXJzIHdlcmUgZGV0ZWN0ZWQgaW4gZWl0aGVyIGEKICAgKiBjb21tZW50IG9yIGEgc3RyaW5nIGxpdGVyYWwgYmV0d2VlbiBbc3RhcnRTY2FuT2Zmc2V0XSBhbmQgdGhlIGN1cnJlbnQKICAgKiBzY2FuIG9mZnNldC4KICAgKi8KICB2b2lkIGhhbmRsZVVuaWNvZGUoaW50IHN0YXJ0U2Nhbk9mZnNldCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2NhbiBvZmZzZXQuCiAgICoKICAgKiBJbiB0aGUgW1V0ZjhCeXRlc1NjYW5uZXJdIHRoaXMgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBieXRlIGxpc3QsIGluIHRoZQogICAqIFtTdHJpbmdTY2FubmVyXSB0aGUgb2Zmc2V0IGluIHRoZSBzb3VyY2Ugc3RyaW5nLgogICAqLwogIGludCBnZXQgc2Nhbk9mZnNldDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgY3VycmVudCBzdHJpbmcgb2Zmc2V0LgogICAqCiAgICogSW4gdGhlIFtTdHJpbmdTY2FubmVyXSB0aGlzIGlzIGlkZW50aWNhbCB0byB0aGUgW3NjYW5PZmZzZXRdLiBJbiB0aGUKICAgKiBbVXRmOEJ5dGVzU2Nhbm5lcl0gaXQgaXMgY29tcHV0ZWQgYmFzZWQgb24gZW5jb3VudGVyZWQgVVRGLTggY2hhcmFjdGVycy4KICAgKi8KICBpbnQgZ2V0IHN0cmluZ09mZnNldDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZmlyc3QgdG9rZW4gc2Nhbm5lZCBieSB0aGlzIFtTY2FubmVyXS4KICAgKi8KICBUb2tlbiBmaXJzdFRva2VuKCkgPT4gdG9rZW5zLm5leHQ7CgogIC8qKgogICAqIE5vdGlmaWVzIHRoYXQgYSBuZXcgdG9rZW4gc3RhcnRzIGF0IGN1cnJlbnQgb2Zmc2V0LgogICAqLwogIHZvaWQgYmVnaW5Ub2tlbigpIHsKICAgIHRva2VuU3RhcnQgPSBzdHJpbmdPZmZzZXQ7CiAgfQoKICAvKioKICAgKiBBcHBlbmRzIGEgc3Vic3RyaW5nIGZyb20gdGhlIHNjYW4gb2Zmc2V0IFs6c3RhcnQ6XSB0byB0aGUgY3VycmVudAogICAqIFs6c2Nhbk9mZnNldDpdIHBsdXMgdGhlIFs6ZXh0cmFPZmZzZXQ6XS4gRm9yIGV4YW1wbGUsIGlmIHRoZSBjdXJyZW50CiAgICogc2Nhbk9mZnNldCBpcyAxMCwgdGhlbiBbOmFwcGVuZFN1YnN0cmluZ1Rva2VuKDUsIC0xKTpdIHdpbGwgYXBwZW5kIHRoZQogICAqIHN1YnN0cmluZyBzdHJpbmcgWzUsOSkuCiAgICoKICAgKiBOb3RlIHRoYXQgW2V4dHJhT2Zmc2V0XSBjYW4gb25seSBiZSB1c2VkIGlmIHRoZSBjb3ZlcmVkIGNoYXJhY3RlcihzKSBhcmUKICAgKiBrbm93biB0byBiZSBBU0NJSS4KICAgKi8KICB2b2lkIGFwcGVuZFN1YnN0cmluZ1Rva2VuKFRva2VuVHlwZSB0eXBlLCBpbnQgc3RhcnQsIGJvb2wgYXNjaWlPbmx5LAogICAgICBbaW50IGV4dHJhT2Zmc2V0XSk7CgogIC8qKgogICAqIEFwcGVuZHMgYSBzdWJzdHJpbmcgZnJvbSB0aGUgc2NhbiBvZmZzZXQgW3N0YXJ0XSB0byB0aGUgY3VycmVudAogICAqIFtzY2FuT2Zmc2V0XSBwbHVzIFtzeW50aGV0aWNDaGFyc10uIFRoZSBhZGRpdGlvbmFsIGNoYXIocykgd2lsbCBiZSBhZGRlZAogICAqIHRvIHRoZSB1bnRlcm1pbmF0ZWQgc3RyaW5nIGxpdGVyYWwncyBsZXhlbWUgYnV0IHRoZSByZXR1cm5lZAogICAqIHRva2VuJ3MgbGVuZ3RoIHdpbGwgKm5vdCogaW5jbHVkZSB0aG9zZSBhZGRpdGlvbmFsIGNoYXIocykKICAgKiBzbyBhcyB0byBiZSB0cnVlIHRvIHRoZSBvcmlnaW5hbCBzb3VyY2UuCiAgICovCiAgdm9pZCBhcHBlbmRTeW50aGV0aWNTdWJzdHJpbmdUb2tlbigKICAgICAgVG9rZW5UeXBlIHR5cGUsIGludCBzdGFydCwgYm9vbCBhc2NpaU9ubHksIFN0cmluZyBzeW50aGV0aWNDaGFycyk7CgogIC8qKiBEb2N1bWVudGF0aW9uIGluIHN1YmNsYXNzIFtBcnJheUJhc2VkU2Nhbm5lcl0uICovCiAgdm9pZCBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlIHR5cGUpOwoKICAvKiogRG9jdW1lbnRhdGlvbiBpbiBzdWJjbGFzcyBbQXJyYXlCYXNlZFNjYW5uZXJdLiAqLwogIGludCBzZWxlY3QoaW50IGNob2ljZSwgVG9rZW5UeXBlIHllcywgVG9rZW5UeXBlIG5vKTsKCiAgLyoqIERvY3VtZW50YXRpb24gaW4gc3ViY2xhc3MgW0FycmF5QmFzZWRTY2FubmVyXS4gKi8KICB2b2lkIGFwcGVuZEtleXdvcmRUb2tlbihLZXl3b3JkIGtleXdvcmQpOwoKICAvKiogRG9jdW1lbnRhdGlvbiBpbiBzdWJjbGFzcyBbQXJyYXlCYXNlZFNjYW5uZXJdLiAqLwogIHZvaWQgYXBwZW5kRW9mVG9rZW4oKTsKCiAgLyoqIERvY3VtZW50YXRpb24gaW4gc3ViY2xhc3MgW0FycmF5QmFzZWRTY2FubmVyXS4gKi8KICB2b2lkIGFwcGVuZFdoaXRlU3BhY2UoaW50IG5leHQpOwoKICAvKiogRG9jdW1lbnRhdGlvbiBpbiBzdWJjbGFzcyBbQXJyYXlCYXNlZFNjYW5uZXJdLiAqLwogIHZvaWQgbGluZUZlZWRJbk11bHRpbGluZSgpOwoKICAvKiogRG9jdW1lbnRhdGlvbiBpbiBzdWJjbGFzcyBbQXJyYXlCYXNlZFNjYW5uZXJdLiAqLwogIHZvaWQgYXBwZW5kQmVnaW5Hcm91cChUb2tlblR5cGUgdHlwZSk7CgogIC8qKiBEb2N1bWVudGF0aW9uIGluIHN1YmNsYXNzIFtBcnJheUJhc2VkU2Nhbm5lcl0uICovCiAgaW50IGFwcGVuZEVuZEdyb3VwKFRva2VuVHlwZSB0eXBlLCBpbnQgb3BlbktpbmQpOwoKICAvKiogRG9jdW1lbnRhdGlvbiBpbiBzdWJjbGFzcyBbQXJyYXlCYXNlZFNjYW5uZXJdLiAqLwogIHZvaWQgYXBwZW5kR3QoVG9rZW5UeXBlIHR5cGUpOwoKICAvKiogRG9jdW1lbnRhdGlvbiBpbiBzdWJjbGFzcyBbQXJyYXlCYXNlZFNjYW5uZXJdLiAqLwogIHZvaWQgYXBwZW5kR3RHdChUb2tlblR5cGUgdHlwZSk7CgogIC8vLyBBcHBlbmQgW3Rva2VuXSB0byB0aGUgdG9rZW4gc3RyZWFtLgogIHZvaWQgYXBwZW5kRXJyb3JUb2tlbihFcnJvclRva2VuIHRva2VuKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBjb21tZW50IGZyb20gdGhlIHNjYW4gb2Zmc2V0IFtzdGFydF0gdG8gdGhlIGN1cnJlbnQKICAgKiBbc2Nhbk9mZnNldF0gcGx1cyB0aGUgW2V4dHJhT2Zmc2V0XS4gRm9yIGV4YW1wbGUsIGlmIHRoZSBjdXJyZW50CiAgICogc2Nhbk9mZnNldCBpcyAxMCwgdGhlbiBbYXBwZW5kU3Vic3RyaW5nVG9rZW4oNSwgLTEpXSB3aWxsIGFwcGVuZCB0aGUKICAgKiBzdWJzdHJpbmcgc3RyaW5nIFs1LDkpLgogICAqCiAgICogTm90ZSB0aGF0IFtleHRyYU9mZnNldF0gY2FuIG9ubHkgYmUgdXNlZCBpZiB0aGUgY292ZXJlZCBjaGFyYWN0ZXIocykgYXJlCiAgICoga25vd24gdG8gYmUgQVNDSUkuCiAgICovCiAgQ29tbWVudFRva2VuIGNyZWF0ZUNvbW1lbnRUb2tlbihUb2tlblR5cGUgdHlwZSwgaW50IHN0YXJ0LCBib29sIGFzY2lpT25seSwKICAgICAgW2ludCBleHRyYU9mZnNldCA9IDBdKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBkYXJ0ZG9jIGZyb20gdGhlIHNjYW4gb2Zmc2V0IFtzdGFydF0gdG8gdGhlIGN1cnJlbnQKICAgKiBbc2Nhbk9mZnNldF0gcGx1cyB0aGUgW2V4dHJhT2Zmc2V0XS4gRm9yIGV4YW1wbGUsIGlmIHRoZSBjdXJyZW50CiAgICogc2Nhbk9mZnNldCBpcyAxMCwgdGhlbiBbYXBwZW5kU3Vic3RyaW5nVG9rZW4oNSwgLTEpXSB3aWxsIGFwcGVuZCB0aGUKICAgKiBzdWJzdHJpbmcgc3RyaW5nIFs1LDkpLgogICAqCiAgICogTm90ZSB0aGF0IFtleHRyYU9mZnNldF0gY2FuIG9ubHkgYmUgdXNlZCBpZiB0aGUgY292ZXJlZCBjaGFyYWN0ZXIocykgYXJlCiAgICoga25vd24gdG8gYmUgQVNDSUkuCiAgICovCiAgRGFydERvY1Rva2VuIGNyZWF0ZURhcnREb2NUb2tlbihUb2tlblR5cGUgdHlwZSwgaW50IHN0YXJ0LCBib29sIGFzY2lpT25seSwKICAgICAgW2ludCBleHRyYU9mZnNldCA9IDBdKTsKCiAgLyoqIERvY3VtZW50YXRpb24gaW4gc3ViY2xhc3MgW0FycmF5QmFzZWRTY2FubmVyXS4gKi8KICB2b2lkIGRpc2NhcmRPcGVuTHQoKTsKCiAgLyoqIERvY3VtZW50YXRpb24gaW4gc3ViY2xhc3MgW0FycmF5QmFzZWRTY2FubmVyXS4gKi8KICB2b2lkIGRpc2NhcmRJbnRlcnBvbGF0aW9uKCk7CgogIC8vLyBSZXR1cm4gdHJ1ZSB3aGVuIGF0IEVPRi4KICBib29sIGF0RW5kT2ZGaWxlKCk7CgogIFRva2VuIHRva2VuaXplKCkgewogICAgd2hpbGUgKCFhdEVuZE9mRmlsZSgpKSB7CiAgICAgIGludCBuZXh0ID0gYWR2YW5jZSgpOwogICAgICB3aGlsZSAoIWlkZW50aWNhbChuZXh0LCAkRU9GKSkgewogICAgICAgIG5leHQgPSBiaWdTd2l0Y2gobmV4dCk7CiAgICAgIH0KICAgICAgaWYgKGF0RW5kT2ZGaWxlKCkpIHsKICAgICAgICBhcHBlbmRFb2ZUb2tlbigpOwogICAgICB9IGVsc2UgewogICAgICAgIHVuZXhwZWN0ZWQoJEVPRik7CiAgICAgIH0KICAgIH0KCiAgICAvLyBBbHdheXMgcHJldGVuZCB0aGF0IHRoZXJlJ3MgYSBsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCiAgICBsaW5lU3RhcnRzLmFkZChzdHJpbmdPZmZzZXQgKyAxKTsKCiAgICByZXR1cm4gZmlyc3RUb2tlbigpOwogIH0KCiAgaW50IGJpZ1N3aXRjaChpbnQgbmV4dCkgewogICAgYmVnaW5Ub2tlbigpOwogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkU1BBQ0UpIHx8CiAgICAgICAgaWRlbnRpY2FsKG5leHQsICRUQUIpIHx8CiAgICAgICAgaWRlbnRpY2FsKG5leHQsICRMRikgfHwKICAgICAgICBpZGVudGljYWwobmV4dCwgJENSKSkgewogICAgICBhcHBlbmRXaGl0ZVNwYWNlKG5leHQpOwogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICAvLyBTZXF1ZW5jZXMgb2Ygc3BhY2VzIGFyZSBjb21tb24sIHNvIGFkdmFuY2UgdGhyb3VnaCB0aGVtIGZhc3QuCiAgICAgIHdoaWxlIChpZGVudGljYWwobmV4dCwgJFNQQUNFKSkgewogICAgICAgIC8vIFdlIGRvbid0IGludm9rZSBbOmFwcGVuZFdoaXRlU3BhY2UobmV4dCk6XSBoZXJlIGZvciBlZmZpY2llbmN5LAogICAgICAgIC8vIGFzc3VtaW5nIHRoYXQgaXQgZG9lcyBub3QgZG8gYW55dGhpbmcgZm9yIHNwYWNlIGNoYXJhY3RlcnMuCiAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgfQogICAgICByZXR1cm4gbmV4dDsKICAgIH0KCiAgICBpbnQgbmV4dExvd2VyID0gbmV4dCB8IDB4MjA7CgogICAgaWYgKCRhIDw9IG5leHRMb3dlciAmJiBuZXh0TG93ZXIgPD0gJHopIHsKICAgICAgaWYgKGlkZW50aWNhbCgkciwgbmV4dCkpIHsKICAgICAgICByZXR1cm4gdG9rZW5pemVSYXdTdHJpbmdLZXl3b3JkT3JJZGVudGlmaWVyKG5leHQpOwogICAgICB9CiAgICAgIHJldHVybiB0b2tlbml6ZUtleXdvcmRPcklkZW50aWZpZXIobmV4dCwgdHJ1ZSk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkQ0xPU0VfUEFSRU4pKSB7CiAgICAgIHJldHVybiBhcHBlbmRFbmRHcm91cChUb2tlblR5cGUuQ0xPU0VfUEFSRU4sIE9QRU5fUEFSRU5fVE9LRU4pOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJE9QRU5fUEFSRU4pKSB7CiAgICAgIGFwcGVuZEJlZ2luR3JvdXAoVG9rZW5UeXBlLk9QRU5fUEFSRU4pOwogICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJFNFTUlDT0xPTikpIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5TRU1JQ09MT04pOwogICAgICAvLyBUeXBlIHBhcmFtZXRlcnMgYW5kIGFyZ3VtZW50cyBjYW5ub3QgY29udGFpbiBzZW1pY29sb24uCiAgICAgIGRpc2NhcmRPcGVuTHQoKTsKICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRQRVJJT0QpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZURvdHNPck51bWJlcihuZXh0KTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRDT01NQSkpIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5DT01NQSk7CiAgICAgIHJldHVybiBhZHZhbmNlKCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkRVEpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZUVxdWFscyhuZXh0KTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRDTE9TRV9DVVJMWV9CUkFDS0VUKSkgewogICAgICByZXR1cm4gYXBwZW5kRW5kR3JvdXAoCiAgICAgICAgICBUb2tlblR5cGUuQ0xPU0VfQ1VSTFlfQlJBQ0tFVCwgT1BFTl9DVVJMWV9CUkFDS0VUX1RPS0VOKTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRTTEFTSCkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplU2xhc2hPckNvbW1lbnQobmV4dCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkT1BFTl9DVVJMWV9CUkFDS0VUKSkgewogICAgICBhcHBlbmRCZWdpbkdyb3VwKFRva2VuVHlwZS5PUEVOX0NVUkxZX0JSQUNLRVQpOwogICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJERRKSB8fCBpZGVudGljYWwobmV4dCwgJFNRKSkgewogICAgICByZXR1cm4gdG9rZW5pemVTdHJpbmcobmV4dCwgc2Nhbk9mZnNldCwgZmFsc2UpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJF8pKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZUtleXdvcmRPcklkZW50aWZpZXIobmV4dCwgdHJ1ZSk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkQ09MT04pKSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuQ09MT04pOwogICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJExUKSkgewogICAgICByZXR1cm4gdG9rZW5pemVMZXNzVGhhbihuZXh0KTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRHVCkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplR3JlYXRlclRoYW4obmV4dCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkQkFORykpIHsKICAgICAgcmV0dXJuIHRva2VuaXplRXhjbGFtYXRpb24obmV4dCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkT1BFTl9TUVVBUkVfQlJBQ0tFVCkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplT3BlblNxdWFyZUJyYWNrZXQobmV4dCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkQ0xPU0VfU1FVQVJFX0JSQUNLRVQpKSB7CiAgICAgIHJldHVybiBhcHBlbmRFbmRHcm91cCgKICAgICAgICAgIFRva2VuVHlwZS5DTE9TRV9TUVVBUkVfQlJBQ0tFVCwgT1BFTl9TUVVBUkVfQlJBQ0tFVF9UT0tFTik7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkQVQpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZUF0KG5leHQpOwogICAgfQoKICAgIGlmIChuZXh0ID49ICQxICYmIG5leHQgPD0gJDkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplTnVtYmVyKG5leHQpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJEFNUEVSU0FORCkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplQW1wZXJzYW5kKG5leHQpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJDApKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZUhleE9yTnVtYmVyKG5leHQpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJFFVRVNUSU9OKSkgewogICAgICByZXR1cm4gdG9rZW5pemVRdWVzdGlvbihuZXh0KTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRCQVIpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZUJhcihuZXh0KTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRQTFVTKSkgewogICAgICByZXR1cm4gdG9rZW5pemVQbHVzKG5leHQpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJCQpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZUtleXdvcmRPcklkZW50aWZpZXIobmV4dCwgdHJ1ZSk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkTUlOVVMpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZU1pbnVzKG5leHQpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJFNUQVIpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZU11bHRpcGx5KG5leHQpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJENBUkVUKSkgewogICAgICByZXR1cm4gdG9rZW5pemVDYXJldChuZXh0KTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRUSUxERSkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplVGlsZGUobmV4dCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkUEVSQ0VOVCkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplUGVyY2VudChuZXh0KTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRCQUNLUElORykpIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5CQUNLUElORyk7CiAgICAgIHJldHVybiBhZHZhbmNlKCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkQkFDS1NMQVNIKSkgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkJBQ0tTTEFTSCk7CiAgICAgIHJldHVybiBhZHZhbmNlKCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkSEFTSCkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplVGFnKG5leHQpOwogICAgfQoKICAgIGlmIChuZXh0IDwgMHgxZikgewogICAgICByZXR1cm4gdW5leHBlY3RlZChuZXh0KTsKICAgIH0KCiAgICBuZXh0ID0gY3VycmVudEFzVW5pY29kZShuZXh0KTsKCiAgICByZXR1cm4gdW5leHBlY3RlZChuZXh0KTsKICB9CgogIGludCB0b2tlbml6ZVRhZyhpbnQgbmV4dCkgewogICAgLy8gIyBvciAjIS4qW1xuXHJdCiAgICBpZiAoc2Nhbk9mZnNldCA9PSAwKSB7CiAgICAgIGlmIChpZGVudGljYWwocGVlaygpLCAkQkFORykpIHsKICAgICAgICBpbnQgc3RhcnQgPSBzY2FuT2Zmc2V0OwogICAgICAgIGJvb2wgYXNjaWlPbmx5ID0gdHJ1ZTsKICAgICAgICBkbyB7CiAgICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICAgICAgaWYgKG5leHQgPiAxMjcpIGFzY2lpT25seSA9IGZhbHNlOwogICAgICAgIH0gd2hpbGUgKCFpZGVudGljYWwobmV4dCwgJExGKSAmJgogICAgICAgICAgICAhaWRlbnRpY2FsKG5leHQsICRDUikgJiYKICAgICAgICAgICAgIWlkZW50aWNhbChuZXh0LCAkRU9GKSk7CiAgICAgICAgaWYgKCFhc2NpaU9ubHkpIGhhbmRsZVVuaWNvZGUoc3RhcnQpOwogICAgICAgIGFwcGVuZFN1YnN0cmluZ1Rva2VuKFRva2VuVHlwZS5TQ1JJUFRfVEFHLCBzdGFydCwgYXNjaWlPbmx5KTsKICAgICAgICByZXR1cm4gbmV4dDsKICAgICAgfQogICAgfQogICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5IQVNIKTsKICAgIHJldHVybiBhZHZhbmNlKCk7CiAgfQoKICBpbnQgdG9rZW5pemVUaWxkZShpbnQgbmV4dCkgewogICAgLy8gfiB+LyB+Lz0KICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRTTEFTSCkpIHsKICAgICAgcmV0dXJuIHNlbGVjdCgkRVEsIFRva2VuVHlwZS5USUxERV9TTEFTSF9FUSwgVG9rZW5UeXBlLlRJTERFX1NMQVNIKTsKICAgIH0gZWxzZSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuVElMREUpOwogICAgICByZXR1cm4gbmV4dDsKICAgIH0KICB9CgogIGludCB0b2tlbml6ZU9wZW5TcXVhcmVCcmFja2V0KGludCBuZXh0KSB7CiAgICAvLyBbIFtdIFtdPQogICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIGlmIChpZGVudGljYWwobmV4dCwgJENMT1NFX1NRVUFSRV9CUkFDS0VUKSkgewogICAgICByZXR1cm4gc2VsZWN0KCRFUSwgVG9rZW5UeXBlLklOREVYX0VRLCBUb2tlblR5cGUuSU5ERVgpOwogICAgfQogICAgYXBwZW5kQmVnaW5Hcm91cChUb2tlblR5cGUuT1BFTl9TUVVBUkVfQlJBQ0tFVCk7CiAgICByZXR1cm4gbmV4dDsKICB9CgogIGludCB0b2tlbml6ZUNhcmV0KGludCBuZXh0KSB7CiAgICAvLyBeIF49CiAgICByZXR1cm4gc2VsZWN0KCRFUSwgVG9rZW5UeXBlLkNBUkVUX0VRLCBUb2tlblR5cGUuQ0FSRVQpOwogIH0KCiAgaW50IHRva2VuaXplUXVlc3Rpb24oaW50IG5leHQpIHsKICAgIC8vID8gPy4gPz8gPz89CiAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkUVVFU1RJT04pKSB7CiAgICAgIHJldHVybiBzZWxlY3QoCiAgICAgICAgICAkRVEsIFRva2VuVHlwZS5RVUVTVElPTl9RVUVTVElPTl9FUSwgVG9rZW5UeXBlLlFVRVNUSU9OX1FVRVNUSU9OKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKG5leHQsICRQRVJJT0QpKSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuUVVFU1RJT05fUEVSSU9EKTsKICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgIH0gZWxzZSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuUVVFU1RJT04pOwogICAgICByZXR1cm4gbmV4dDsKICAgIH0KICB9CgogIGludCB0b2tlbml6ZUJhcihpbnQgbmV4dCkgewogICAgLy8gfCB8fCB8PSB8fD0KICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRCQVIpKSB7CiAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgIGlmIChMQVpZX0FTU0lHTk1FTlRfRU5BQkxFRCAmJiBpZGVudGljYWwobmV4dCwgJEVRKSkgewogICAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuQkFSX0JBUl9FUSk7CiAgICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgICAgfQogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkJBUl9CQVIpOwogICAgICByZXR1cm4gbmV4dDsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKG5leHQsICRFUSkpIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5CQVJfRVEpOwogICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgfSBlbHNlIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5CQVIpOwogICAgICByZXR1cm4gbmV4dDsKICAgIH0KICB9CgogIGludCB0b2tlbml6ZUFtcGVyc2FuZChpbnQgbmV4dCkgewogICAgLy8gJiYgJj0gJiAmJj0KICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRBTVBFUlNBTkQpKSB7CiAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgIGlmIChMQVpZX0FTU0lHTk1FTlRfRU5BQkxFRCAmJiBpZGVudGljYWwobmV4dCwgJEVRKSkgewogICAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuQU1QRVJTQU5EX0FNUEVSU0FORF9FUSk7CiAgICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgICAgfQogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkFNUEVSU0FORF9BTVBFUlNBTkQpOwogICAgICByZXR1cm4gbmV4dDsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKG5leHQsICRFUSkpIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5BTVBFUlNBTkRfRVEpOwogICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgfSBlbHNlIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5BTVBFUlNBTkQpOwogICAgICByZXR1cm4gbmV4dDsKICAgIH0KICB9CgogIGludCB0b2tlbml6ZVBlcmNlbnQoaW50IG5leHQpIHsKICAgIC8vICUgJT0KICAgIHJldHVybiBzZWxlY3QoJEVRLCBUb2tlblR5cGUuUEVSQ0VOVF9FUSwgVG9rZW5UeXBlLlBFUkNFTlQpOwogIH0KCiAgaW50IHRva2VuaXplTXVsdGlwbHkoaW50IG5leHQpIHsKICAgIC8vICogKj0KICAgIHJldHVybiBzZWxlY3QoJEVRLCBUb2tlblR5cGUuU1RBUl9FUSwgVG9rZW5UeXBlLlNUQVIpOwogIH0KCiAgaW50IHRva2VuaXplTWludXMoaW50IG5leHQpIHsKICAgIC8vIC0gLS0gLT0KICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRNSU5VUykpIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5NSU5VU19NSU5VUyk7CiAgICAgIHJldHVybiBhZHZhbmNlKCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbChuZXh0LCAkRVEpKSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuTUlOVVNfRVEpOwogICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgfSBlbHNlIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5NSU5VUyk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQogIH0KCiAgaW50IHRva2VuaXplUGx1cyhpbnQgbmV4dCkgewogICAgLy8gKyArKyArPQogICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIGlmIChpZGVudGljYWwoJFBMVVMsIG5leHQpKSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuUExVU19QTFVTKTsKICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCRFUSwgbmV4dCkpIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5QTFVTX0VRKTsKICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgIH0gZWxzZSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuUExVUyk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQogIH0KCiAgaW50IHRva2VuaXplRXhjbGFtYXRpb24oaW50IG5leHQpIHsKICAgIC8vICEgIT0KICAgIC8vICE9PSBpcyBrZXB0IGZvciB1c2VyLWZyaWVuZGx5IGVycm9yIHJlcG9ydGluZy4KCiAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkRVEpKSB7CiAgICAgIC8vd2FzIGByZXR1cm4gc2VsZWN0KCRFUSwgVG9rZW5UeXBlLkJBTkdfRVFfRVEsIFRva2VuVHlwZS5CQU5HX0VRKTtgCiAgICAgIGludCBuZXh0ID0gYWR2YW5jZSgpOwogICAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRFUSkpIHsKICAgICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkJBTkdfRVFfRVEpOwogICAgICAgIGFwcGVuZEVycm9yVG9rZW4obmV3IFVuc3VwcG9ydGVkT3BlcmF0b3IodGFpbCwgdG9rZW5TdGFydCkpOwogICAgICAgIHJldHVybiBhZHZhbmNlKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5CQU5HX0VRKTsKICAgICAgICByZXR1cm4gbmV4dDsKICAgICAgfQogICAgfQogICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5CQU5HKTsKICAgIHJldHVybiBuZXh0OwogIH0KCiAgaW50IHRva2VuaXplRXF1YWxzKGludCBuZXh0KSB7CiAgICAvLyA9ID09ID0+CiAgICAvLyA9PT0gaXMga2VwdCBmb3IgdXNlci1mcmllbmRseSBlcnJvciByZXBvcnRpbmcuCgogICAgLy8gVHlwZSBwYXJhbWV0ZXJzIGFuZCBhcmd1bWVudHMgY2Fubm90IGNvbnRhaW4gYW55IHRva2VuIHRoYXQKICAgIC8vIHN0YXJ0cyB3aXRoICc9Jy4KICAgIGRpc2NhcmRPcGVuTHQoKTsKCiAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkRVEpKSB7CiAgICAgIC8vIHdhcyBgcmV0dXJuIHNlbGVjdCgkRVEsIFRva2VuVHlwZS5FUV9FUV9FUSwgVG9rZW5UeXBlLkVRX0VRKTtgCiAgICAgIGludCBuZXh0ID0gYWR2YW5jZSgpOwogICAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRFUSkpIHsKICAgICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkVRX0VRX0VRKTsKICAgICAgICBhcHBlbmRFcnJvclRva2VuKG5ldyBVbnN1cHBvcnRlZE9wZXJhdG9yKHRhaWwsIHRva2VuU3RhcnQpKTsKICAgICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgICB9IGVsc2UgewogICAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuRVFfRVEpOwogICAgICAgIHJldHVybiBuZXh0OwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbChuZXh0LCAkR1QpKSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuRlVOQ1RJT04pOwogICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgfQogICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5FUSk7CiAgICByZXR1cm4gbmV4dDsKICB9CgogIGludCB0b2tlbml6ZUdyZWF0ZXJUaGFuKGludCBuZXh0KSB7CiAgICAvLyA+ID49ID4+ID4+PSA+Pj4gPj4+PQogICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIGlmIChpZGVudGljYWwoJEVRLCBuZXh0KSkgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkdUX0VRKTsKICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCRHVCwgbmV4dCkpIHsKICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgaWYgKGlkZW50aWNhbCgkRVEsIG5leHQpKSB7CiAgICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5HVF9HVF9FUSk7CiAgICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgICAgfSBlbHNlIGlmIChlbmFibGVHdEd0R3QgJiYgaWRlbnRpY2FsKCRHVCwgbmV4dCkpIHsKICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICAgIGlmIChlbmFibGVHdEd0R3RFcSAmJiBpZGVudGljYWwoJEVRLCBuZXh0KSkgewogICAgICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5HVF9HVF9HVF9FUSk7CiAgICAgICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgICAgIH0KICAgICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkdUX0dUX0dUKTsKICAgICAgICByZXR1cm4gbmV4dDsKICAgICAgfSBlbHNlIHsKICAgICAgICBhcHBlbmRHdEd0KFRva2VuVHlwZS5HVF9HVCk7CiAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGFwcGVuZEd0KFRva2VuVHlwZS5HVCk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQogIH0KCiAgaW50IHRva2VuaXplTGVzc1RoYW4oaW50IG5leHQpIHsKICAgIC8vIDwgPD0gPDwgPDw9CiAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgaWYgKGlkZW50aWNhbCgkRVEsIG5leHQpKSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuTFRfRVEpOwogICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwoJExULCBuZXh0KSkgewogICAgICByZXR1cm4gc2VsZWN0KCRFUSwgVG9rZW5UeXBlLkxUX0xUX0VRLCBUb2tlblR5cGUuTFRfTFQpOwogICAgfSBlbHNlIHsKICAgICAgYXBwZW5kQmVnaW5Hcm91cChUb2tlblR5cGUuTFQpOwogICAgICByZXR1cm4gbmV4dDsKICAgIH0KICB9CgogIGludCB0b2tlbml6ZU51bWJlcihpbnQgbmV4dCkgewogICAgaW50IHN0YXJ0ID0gc2Nhbk9mZnNldDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgIGlmICgkMCA8PSBuZXh0ICYmIG5leHQgPD0gJDkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwobmV4dCwgJGUpIHx8IGlkZW50aWNhbChuZXh0LCAkRSkpIHsKICAgICAgICByZXR1cm4gdG9rZW5pemVGcmFjdGlvblBhcnQobmV4dCwgc3RhcnQpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChpZGVudGljYWwobmV4dCwgJFBFUklPRCkpIHsKICAgICAgICAgIGludCBuZXh0bmV4dCA9IHBlZWsoKTsKICAgICAgICAgIGlmICgkMCA8PSBuZXh0bmV4dCAmJiBuZXh0bmV4dCA8PSAkOSkgewogICAgICAgICAgICByZXR1cm4gdG9rZW5pemVGcmFjdGlvblBhcnQoYWR2YW5jZSgpLCBzdGFydCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGFwcGVuZFN1YnN0cmluZ1Rva2VuKFRva2VuVHlwZS5JTlQsIHN0YXJ0LCB0cnVlKTsKICAgICAgICByZXR1cm4gbmV4dDsKICAgICAgfQogICAgfQogIH0KCiAgaW50IHRva2VuaXplSGV4T3JOdW1iZXIoaW50IG5leHQpIHsKICAgIGludCB4ID0gcGVlaygpOwogICAgaWYgKGlkZW50aWNhbCh4LCAkeCkgfHwgaWRlbnRpY2FsKHgsICRYKSkgewogICAgICByZXR1cm4gdG9rZW5pemVIZXgobmV4dCk7CiAgICB9CiAgICByZXR1cm4gdG9rZW5pemVOdW1iZXIobmV4dCk7CiAgfQoKICBpbnQgdG9rZW5pemVIZXgoaW50IG5leHQpIHsKICAgIGludCBzdGFydCA9IHNjYW5PZmZzZXQ7CiAgICBuZXh0ID0gYWR2YW5jZSgpOyAvLyBBZHZhbmNlIHBhc3QgdGhlICR4IG9yICRYLgogICAgYm9vbCBoYXNEaWdpdHMgPSBmYWxzZTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgIGlmICgoJDAgPD0gbmV4dCAmJiBuZXh0IDw9ICQ5KSB8fAogICAgICAgICAgKCRBIDw9IG5leHQgJiYgbmV4dCA8PSAkRikgfHwKICAgICAgICAgICgkYSA8PSBuZXh0ICYmIG5leHQgPD0gJGYpKSB7CiAgICAgICAgaGFzRGlnaXRzID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoIWhhc0RpZ2l0cykgewogICAgICAgICAgdW50ZXJtaW5hdGVkKG1lc3NhZ2VFeHBlY3RlZEhleERpZ2l0LCBzaG91bGRBZHZhbmNlOiBmYWxzZSk7CiAgICAgICAgICByZXR1cm4gbmV4dDsKICAgICAgICB9CiAgICAgICAgYXBwZW5kU3Vic3RyaW5nVG9rZW4oVG9rZW5UeXBlLkhFWEFERUNJTUFMLCBzdGFydCwgdHJ1ZSk7CiAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgIH0KICAgIH0KICB9CgogIGludCB0b2tlbml6ZURvdHNPck51bWJlcihpbnQgbmV4dCkgewogICAgaW50IHN0YXJ0ID0gc2Nhbk9mZnNldDsKICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICBpZiAoKCQwIDw9IG5leHQgJiYgbmV4dCA8PSAkOSkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplRnJhY3Rpb25QYXJ0KG5leHQsIHN0YXJ0KTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCRQRVJJT0QsIG5leHQpKSB7CiAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgIGlmIChpZGVudGljYWwobmV4dCwgJFBFUklPRCkpIHsKICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICAgIGlmIChpZGVudGljYWwobmV4dCwgJFFVRVNUSU9OKSkgewogICAgICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5QRVJJT0RfUEVSSU9EX1BFUklPRF9RVUVTVElPTik7CiAgICAgICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLlBFUklPRF9QRVJJT0RfUEVSSU9EKTsKICAgICAgICAgIHJldHVybiBuZXh0OwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLlBFUklPRF9QRVJJT0QpOwogICAgICAgIHJldHVybiBuZXh0OwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLlBFUklPRCk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQogIH0KCiAgaW50IHRva2VuaXplRnJhY3Rpb25QYXJ0KGludCBuZXh0LCBpbnQgc3RhcnQpIHsKICAgIGJvb2wgZG9uZSA9IGZhbHNlOwogICAgYm9vbCBoYXNEaWdpdCA9IGZhbHNlOwogICAgTE9PUDoKICAgIHdoaWxlICghZG9uZSkgewogICAgICBpZiAoJDAgPD0gbmV4dCAmJiBuZXh0IDw9ICQ5KSB7CiAgICAgICAgaGFzRGlnaXQgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgkZSwgbmV4dCkgfHwgaWRlbnRpY2FsKCRFLCBuZXh0KSkgewogICAgICAgIGhhc0RpZ2l0ID0gdHJ1ZTsKICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICAgIGlmIChpZGVudGljYWwobmV4dCwgJFBMVVMpIHx8IGlkZW50aWNhbChuZXh0LCAkTUlOVVMpKSB7CiAgICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICAgIH0KICAgICAgICBib29sIGhhc0V4cG9uZW50RGlnaXRzID0gZmFsc2U7CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgIGlmICgkMCA8PSBuZXh0ICYmIG5leHQgPD0gJDkpIHsKICAgICAgICAgICAgaGFzRXhwb25lbnREaWdpdHMgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFoYXNFeHBvbmVudERpZ2l0cykgewogICAgICAgICAgICAgIGFwcGVuZFN5bnRoZXRpY1N1YnN0cmluZ1Rva2VuKFRva2VuVHlwZS5ET1VCTEUsIHN0YXJ0LCB0cnVlLCAnMCcpOwogICAgICAgICAgICAgIGFwcGVuZEVycm9yVG9rZW4obmV3IFVudGVybWluYXRlZFRva2VuKAogICAgICAgICAgICAgICAgICBtZXNzYWdlTWlzc2luZ0V4cG9uZW50LCB0b2tlblN0YXJ0LCBzdHJpbmdPZmZzZXQpKTsKICAgICAgICAgICAgICByZXR1cm4gbmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgICAgfQoKICAgICAgICBkb25lID0gdHJ1ZTsKICAgICAgICBjb250aW51ZSBMT09QOwogICAgICB9IGVsc2UgewogICAgICAgIGRvbmUgPSB0cnVlOwogICAgICAgIGNvbnRpbnVlIExPT1A7CiAgICAgIH0KICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIH0KICAgIGlmICghaGFzRGlnaXQpIHsKICAgICAgLy8gUmVkdWNlIG9mZnNldCwgd2UgYWxyZWFkeSBhZHZhbmNlZCB0byB0aGUgdG9rZW4gcGFzdCB0aGUgcGVyaW9kLgogICAgICBhcHBlbmRTdWJzdHJpbmdUb2tlbihUb2tlblR5cGUuSU5ULCBzdGFydCwgdHJ1ZSwgLTEpOwoKICAgICAgLy8gVE9ETyhhaGUpOiBXcm9uZyBvZmZzZXQgZm9yIHRoZSBwZXJpb2QuIENhbm5vdCBjYWxsIGJlZ2luVG9rZW4gYmVjYXVzZQogICAgICAvLyB0aGUgc2Nhbm5lciBhbHJlYWR5IGFkdmFuY2VkIHBhc3QgdGhlIHBlcmlvZC4KICAgICAgaWYgKGlkZW50aWNhbCgkUEVSSU9ELCBuZXh0KSkgewogICAgICAgIHJldHVybiBzZWxlY3QoCiAgICAgICAgICAgICRQRVJJT0QsIFRva2VuVHlwZS5QRVJJT0RfUEVSSU9EX1BFUklPRCwgVG9rZW5UeXBlLlBFUklPRF9QRVJJT0QpOwogICAgICB9CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuUEVSSU9EKTsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CiAgICBhcHBlbmRTdWJzdHJpbmdUb2tlbihUb2tlblR5cGUuRE9VQkxFLCBzdGFydCwgdHJ1ZSk7CiAgICByZXR1cm4gbmV4dDsKICB9CgogIGludCB0b2tlbml6ZVNsYXNoT3JDb21tZW50KGludCBuZXh0KSB7CiAgICBpbnQgc3RhcnQgPSBzY2FuT2Zmc2V0OwogICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIGlmIChpZGVudGljYWwoJFNUQVIsIG5leHQpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZU11bHRpTGluZUNvbW1lbnQobmV4dCwgc3RhcnQpOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwoJFNMQVNILCBuZXh0KSkgewogICAgICByZXR1cm4gdG9rZW5pemVTaW5nbGVMaW5lQ29tbWVudChuZXh0LCBzdGFydCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgkRVEsIG5leHQpKSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuU0xBU0hfRVEpOwogICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgfSBlbHNlIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5TTEFTSCk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQogIH0KCiAgaW50IHRva2VuaXplU2luZ2xlTGluZUNvbW1lbnQoaW50IG5leHQsIGludCBzdGFydCkgewogICAgYm9vbCBhc2NpaU9ubHkgPSB0cnVlOwogICAgYm9vbCBkYXJ0ZG9jID0gaWRlbnRpY2FsKCRTTEFTSCwgcGVlaygpKTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgIGlmIChuZXh0ID4gMTI3KSBhc2NpaU9ubHkgPSBmYWxzZTsKICAgICAgaWYgKGlkZW50aWNhbCgkTEYsIG5leHQpIHx8CiAgICAgICAgICBpZGVudGljYWwoJENSLCBuZXh0KSB8fAogICAgICAgICAgaWRlbnRpY2FsKCRFT0YsIG5leHQpKSB7CiAgICAgICAgaWYgKCFhc2NpaU9ubHkpIGhhbmRsZVVuaWNvZGUoc3RhcnQpOwogICAgICAgIGlmIChkYXJ0ZG9jKSB7CiAgICAgICAgICBhcHBlbmREYXJ0RG9jKHN0YXJ0LCBUb2tlblR5cGUuU0lOR0xFX0xJTkVfQ09NTUVOVCwgYXNjaWlPbmx5KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXBwZW5kQ29tbWVudChzdGFydCwgVG9rZW5UeXBlLlNJTkdMRV9MSU5FX0NPTU1FTlQsIGFzY2lpT25seSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXh0OwogICAgICB9CiAgICB9CiAgfQoKICBpbnQgdG9rZW5pemVNdWx0aUxpbmVDb21tZW50KGludCBuZXh0LCBpbnQgc3RhcnQpIHsKICAgIGJvb2wgYXNjaWlPbmx5Q29tbWVudCA9IHRydWU7IC8vIFRyYWNrIGlmIHRoZSBlbnRpcmUgY29tbWVudCBpcyBBU0NJSS4KICAgIGJvb2wgYXNjaWlPbmx5TGluZXMgPSB0cnVlOyAvLyBUcmFjayBBU0NJSSBzaW5jZSB0aGUgbGFzdCBoYW5kbGVVbmljb2RlLgogICAgaW50IHVuaWNvZGVTdGFydCA9IHN0YXJ0OwogICAgaW50IG5lc3RpbmcgPSAxOwogICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIGJvb2wgZGFydGRvYyA9IGlkZW50aWNhbCgkU1RBUiwgbmV4dCk7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoaWRlbnRpY2FsKCRFT0YsIG5leHQpKSB7CiAgICAgICAgaWYgKCFhc2NpaU9ubHlMaW5lcykgaGFuZGxlVW5pY29kZSh1bmljb2RlU3RhcnQpOwogICAgICAgIHVudGVybWluYXRlZChtZXNzYWdlVW50ZXJtaW5hdGVkQ29tbWVudCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCRTVEFSLCBuZXh0KSkgewogICAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgICAgaWYgKGlkZW50aWNhbCgkU0xBU0gsIG5leHQpKSB7CiAgICAgICAgICAtLW5lc3Rpbmc7CiAgICAgICAgICBpZiAoMCA9PSBuZXN0aW5nKSB7CiAgICAgICAgICAgIGlmICghYXNjaWlPbmx5TGluZXMpIGhhbmRsZVVuaWNvZGUodW5pY29kZVN0YXJ0KTsKICAgICAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgICAgICAgaWYgKGRhcnRkb2MpIHsKICAgICAgICAgICAgICBhcHBlbmREYXJ0RG9jKAogICAgICAgICAgICAgICAgICBzdGFydCwgVG9rZW5UeXBlLk1VTFRJX0xJTkVfQ09NTUVOVCwgYXNjaWlPbmx5Q29tbWVudCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgYXBwZW5kQ29tbWVudCgKICAgICAgICAgICAgICAgICAgc3RhcnQsIFRva2VuVHlwZS5NVUxUSV9MSU5FX0NPTU1FTlQsIGFzY2lpT25seUNvbW1lbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCRTTEFTSCwgbmV4dCkpIHsKICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICAgIGlmIChpZGVudGljYWwoJFNUQVIsIG5leHQpKSB7CiAgICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICAgICAgKytuZXN0aW5nOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwobmV4dCwgJExGKSkgewogICAgICAgIGlmICghYXNjaWlPbmx5TGluZXMpIHsKICAgICAgICAgIC8vIFN5bmNocm9uaXplIHRoZSBzdHJpbmcgb2Zmc2V0IGluIHRoZSB1dGY4IHNjYW5uZXIuCiAgICAgICAgICBoYW5kbGVVbmljb2RlKHVuaWNvZGVTdGFydCk7CiAgICAgICAgICBhc2NpaU9ubHlMaW5lcyA9IHRydWU7CiAgICAgICAgICB1bmljb2RlU3RhcnQgPSBzY2FuT2Zmc2V0OwogICAgICAgIH0KICAgICAgICBsaW5lRmVlZEluTXVsdGlsaW5lKCk7CiAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAobmV4dCA+IDEyNykgewogICAgICAgICAgYXNjaWlPbmx5TGluZXMgPSBmYWxzZTsKICAgICAgICAgIGFzY2lpT25seUNvbW1lbnQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5leHQ7CiAgfQoKICB2b2lkIGFwcGVuZENvbW1lbnQoaW50IHN0YXJ0LCBUb2tlblR5cGUgdHlwZSwgYm9vbCBhc2NpaU9ubHkpIHsKICAgIGlmICghaW5jbHVkZUNvbW1lbnRzKSByZXR1cm47CiAgICBDb21tZW50VG9rZW4gbmV3Q29tbWVudCA9IGNyZWF0ZUNvbW1lbnRUb2tlbih0eXBlLCBzdGFydCwgYXNjaWlPbmx5KTsKICAgIF9hcHBlbmRUb0NvbW1lbnRTdHJlYW0obmV3Q29tbWVudCk7CiAgfQoKICB2b2lkIGFwcGVuZERhcnREb2MoaW50IHN0YXJ0LCBUb2tlblR5cGUgdHlwZSwgYm9vbCBhc2NpaU9ubHkpIHsKICAgIGlmICghaW5jbHVkZUNvbW1lbnRzKSByZXR1cm47CiAgICBUb2tlbiBuZXdDb21tZW50ID0gY3JlYXRlRGFydERvY1Rva2VuKHR5cGUsIHN0YXJ0LCBhc2NpaU9ubHkpOwogICAgX2FwcGVuZFRvQ29tbWVudFN0cmVhbShuZXdDb21tZW50KTsKICB9CgogIC8qKgogICAqIEFwcGVuZCB0aGUgZ2l2ZW4gdG9rZW4gdG8gdGhlIFt0YWlsXSBvZiB0aGUgY3VycmVudCBzdHJlYW0gb2YgdG9rZW5zLgogICAqLwogIHZvaWQgYXBwZW5kVG9rZW4oVG9rZW4gdG9rZW4pIHsKICAgIHRhaWwubmV4dCA9IHRva2VuOwogICAgdGFpbC5uZXh0LnByZXZpb3VzID0gdGFpbDsKICAgIHRhaWwgPSB0YWlsLm5leHQ7CiAgICBpZiAoY29tbWVudHMgIT0gbnVsbCAmJiBjb21tZW50cyA9PSB0b2tlbi5wcmVjZWRpbmdDb21tZW50cykgewogICAgICBjb21tZW50cyA9IG51bGw7CiAgICAgIGNvbW1lbnRzVGFpbCA9IG51bGw7CiAgICB9IGVsc2UgewogICAgICAvLyBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBjb25zdHJ1Y3QgdGhlIHRva2VuCiAgICAgIC8vIGJlaW5nIGFwcGVuZGVkIHdpdGggcHJlY2VkaW5nIGNvbW1lbnRzIGlmIGFueQogICAgICBhc3NlcnQoY29tbWVudHMgPT0gbnVsbCB8fCB0b2tlbi5pc1N5bnRoZXRpYyB8fCB0b2tlbiBpcyBFcnJvclRva2VuKTsKICAgIH0KICB9CgogIHZvaWQgX2FwcGVuZFRvQ29tbWVudFN0cmVhbShUb2tlbiBuZXdDb21tZW50KSB7CiAgICBpZiAoY29tbWVudHMgPT0gbnVsbCkgewogICAgICBjb21tZW50cyA9IG5ld0NvbW1lbnQ7CiAgICAgIGNvbW1lbnRzVGFpbCA9IGNvbW1lbnRzOwogICAgfSBlbHNlIHsKICAgICAgY29tbWVudHNUYWlsLm5leHQgPSBuZXdDb21tZW50OwogICAgICBjb21tZW50c1RhaWwubmV4dC5wcmV2aW91cyA9IGNvbW1lbnRzVGFpbDsKICAgICAgY29tbWVudHNUYWlsID0gY29tbWVudHNUYWlsLm5leHQ7CiAgICB9CiAgfQoKICBpbnQgdG9rZW5pemVSYXdTdHJpbmdLZXl3b3JkT3JJZGVudGlmaWVyKGludCBuZXh0KSB7CiAgICAvLyBbbmV4dF0gaXMgJHIuCiAgICBpbnQgbmV4dG5leHQgPSBwZWVrKCk7CiAgICBpZiAoaWRlbnRpY2FsKG5leHRuZXh0LCAkRFEpIHx8IGlkZW50aWNhbChuZXh0bmV4dCwgJFNRKSkgewogICAgICBpbnQgc3RhcnQgPSBzY2FuT2Zmc2V0OwogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICByZXR1cm4gdG9rZW5pemVTdHJpbmcobmV4dCwgc3RhcnQsIHRydWUpOwogICAgfQogICAgcmV0dXJuIHRva2VuaXplS2V5d29yZE9ySWRlbnRpZmllcihuZXh0LCB0cnVlKTsKICB9CgogIGludCB0b2tlbml6ZUtleXdvcmRPcklkZW50aWZpZXIoaW50IG5leHQsIGJvb2wgYWxsb3dEb2xsYXIpIHsKICAgIEtleXdvcmRTdGF0ZSBzdGF0ZSA9IEtleXdvcmRTdGF0ZS5LRVlXT1JEX1NUQVRFOwogICAgaW50IHN0YXJ0ID0gc2Nhbk9mZnNldDsKICAgIC8vIFdlIGFsbG93IGEgbGVhZGluZyBjYXBpdGFsIGNoYXJhY3Rlci4KICAgIGlmICgkQSA8PSBuZXh0ICYmIG5leHQgPD0gJFopIHsKICAgICAgc3RhdGUgPSBzdGF0ZS5uZXh0Q2FwaXRhbChuZXh0KTsKICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIH0gZWxzZSBpZiAoJGEgPD0gbmV4dCAmJiBuZXh0IDw9ICR6KSB7CiAgICAgIC8vIERvIHRoZSBmaXJzdCBuZXh0IGNhbGwgb3V0c2lkZSB0aGUgbG9vcCB0byBhdm9pZCBhbiBhZGRpdGlvbmFsIHRlc3QKICAgICAgLy8gYW5kIHRvIG1ha2UgdGhlIGxvb3AgbW9ub21vcnBoaWMuCiAgICAgIHN0YXRlID0gc3RhdGUubmV4dChuZXh0KTsKICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIH0KICAgIHdoaWxlIChzdGF0ZSAhPSBudWxsICYmICRhIDw9IG5leHQgJiYgbmV4dCA8PSAkeikgewogICAgICBzdGF0ZSA9IHN0YXRlLm5leHQobmV4dCk7CiAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICB9CiAgICBpZiAoc3RhdGUgPT0gbnVsbCB8fCBzdGF0ZS5rZXl3b3JkID09IG51bGwpIHsKICAgICAgcmV0dXJuIHRva2VuaXplSWRlbnRpZmllcihuZXh0LCBzdGFydCwgYWxsb3dEb2xsYXIpOwogICAgfQogICAgaWYgKCgkQSA8PSBuZXh0ICYmIG5leHQgPD0gJFopIHx8CiAgICAgICAgKCQwIDw9IG5leHQgJiYgbmV4dCA8PSAkOSkgfHwKICAgICAgICBpZGVudGljYWwobmV4dCwgJF8pIHx8CiAgICAgICAgaWRlbnRpY2FsKG5leHQsICQkKSkgewogICAgICByZXR1cm4gdG9rZW5pemVJZGVudGlmaWVyKG5leHQsIHN0YXJ0LCBhbGxvd0RvbGxhcik7CiAgICB9IGVsc2UgewogICAgICBhcHBlbmRLZXl3b3JkVG9rZW4oc3RhdGUua2V5d29yZCk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQogIH0KCiAgLyoqCiAgICogW2FsbG93RG9sbGFyXSBjYW4gZXhjbHVkZSAnJCcsIHdoaWNoIGlzIG5vdCBhbGxvd2VkIGFzIHBhcnQgb2YgYSBzdHJpbmcKICAgKiBpbnRlcnBvbGF0aW9uIGlkZW50aWZpZXIuCiAgICovCiAgaW50IHRva2VuaXplSWRlbnRpZmllcihpbnQgbmV4dCwgaW50IHN0YXJ0LCBib29sIGFsbG93RG9sbGFyKSB7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoKCRhIDw9IG5leHQgJiYgbmV4dCA8PSAkeikgfHwKICAgICAgICAgICgkQSA8PSBuZXh0ICYmIG5leHQgPD0gJFopIHx8CiAgICAgICAgICAoJDAgPD0gbmV4dCAmJiBuZXh0IDw9ICQ5KSB8fAogICAgICAgICAgaWRlbnRpY2FsKG5leHQsICRfKSB8fAogICAgICAgICAgKGlkZW50aWNhbChuZXh0LCAkJCkgJiYgYWxsb3dEb2xsYXIpKSB7CiAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBJZGVudGlmaWVyIGVuZHMgaGVyZS4KICAgICAgICBpZiAoc3RhcnQgPT0gc2Nhbk9mZnNldCkgewogICAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQobmV4dCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFwcGVuZFN1YnN0cmluZ1Rva2VuKFRva2VuVHlwZS5JREVOVElGSUVSLCBzdGFydCwgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV4dDsKICB9CgogIGludCB0b2tlbml6ZUF0KGludCBuZXh0KSB7CiAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkFUKTsKICAgIHJldHVybiBhZHZhbmNlKCk7CiAgfQoKICBpbnQgdG9rZW5pemVTdHJpbmcoaW50IG5leHQsIGludCBzdGFydCwgYm9vbCByYXcpIHsKICAgIGludCBxdW90ZUNoYXIgPSBuZXh0OwogICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIGlmIChpZGVudGljYWwocXVvdGVDaGFyLCBuZXh0KSkgewogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICBpZiAoaWRlbnRpY2FsKHF1b3RlQ2hhciwgbmV4dCkpIHsKICAgICAgICAvLyBNdWx0aWxpbmUgc3RyaW5nLgogICAgICAgIHJldHVybiB0b2tlbml6ZU11bHRpTGluZVN0cmluZyhxdW90ZUNoYXIsIHN0YXJ0LCByYXcpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEVtcHR5IHN0cmluZy4KICAgICAgICBhcHBlbmRTdWJzdHJpbmdUb2tlbihUb2tlblR5cGUuU1RSSU5HLCBzdGFydCwgdHJ1ZSk7CiAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgIH0KICAgIH0KICAgIGlmIChyYXcpIHsKICAgICAgcmV0dXJuIHRva2VuaXplU2luZ2xlTGluZVJhd1N0cmluZyhuZXh0LCBxdW90ZUNoYXIsIHN0YXJ0KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0b2tlbml6ZVNpbmdsZUxpbmVTdHJpbmcobmV4dCwgcXVvdGVDaGFyLCBzdGFydCk7CiAgICB9CiAgfQoKICAvKioKICAgKiBbbmV4dF0gaXMgdGhlIGZpcnN0IGNoYXJhY3RlciBhZnRlciB0aGUgcXVvdGUuCiAgICogW3F1b3RlU3RhcnRdIGlzIHRoZSBzY2FuT2Zmc2V0IG9mIHRoZSBxdW90ZS4KICAgKgogICAqIFRoZSB0b2tlbiBjb250YWlucyBhIHN1YnN0cmluZyBvZiB0aGUgc291cmNlIGZpbGUsIGluY2x1ZGluZyB0aGUKICAgKiBzdHJpbmcgcXVvdGVzLCBiYWNrc2xhc2hlcyBmb3IgZXNjYXBpbmcuIEZvciBpbnRlcnBvbGF0ZWQgc3RyaW5ncywKICAgKiB0aGUgcGFydHMgYmVmb3JlIGFuZCBhZnRlciBhcmUgc2VwYXJhdGUgdG9rZW5zLgogICAqCiAgICogICAiYSAkYiBjIgogICAqCiAgICogZ2l2ZXMgU3RyaW5nVG9rZW4oImEgJCksIFN0cmluZ1Rva2VuKGIpIGFuZCBTdHJpbmdUb2tlbiggYyIpLgogICAqLwogIGludCB0b2tlbml6ZVNpbmdsZUxpbmVTdHJpbmcoaW50IG5leHQsIGludCBxdW90ZUNoYXIsIGludCBxdW90ZVN0YXJ0KSB7CiAgICBpbnQgc3RhcnQgPSBxdW90ZVN0YXJ0OwogICAgYm9vbCBhc2NpaU9ubHkgPSB0cnVlOwogICAgd2hpbGUgKCFpZGVudGljYWwobmV4dCwgcXVvdGVDaGFyKSkgewogICAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRCQUNLU0xBU0gpKSB7CiAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwobmV4dCwgJCQpKSB7CiAgICAgICAgaWYgKCFhc2NpaU9ubHkpIGhhbmRsZVVuaWNvZGUoc3RhcnQpOwogICAgICAgIG5leHQgPSB0b2tlbml6ZVN0cmluZ0ludGVycG9sYXRpb24oc3RhcnQsIGFzY2lpT25seSk7CiAgICAgICAgc3RhcnQgPSBzY2FuT2Zmc2V0OwogICAgICAgIGFzY2lpT25seSA9IHRydWU7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKG5leHQgPD0gJENSICYmCiAgICAgICAgICAoaWRlbnRpY2FsKG5leHQsICRMRikgfHwKICAgICAgICAgICAgICBpZGVudGljYWwobmV4dCwgJENSKSB8fAogICAgICAgICAgICAgIGlkZW50aWNhbChuZXh0LCAkRU9GKSkpIHsKICAgICAgICBpZiAoIWFzY2lpT25seSkgaGFuZGxlVW5pY29kZShzdGFydCk7CiAgICAgICAgdW50ZXJtaW5hdGVkU3RyaW5nKHF1b3RlQ2hhciwgcXVvdGVTdGFydCwgc3RhcnQsCiAgICAgICAgICAgIGFzY2lpT25seTogYXNjaWlPbmx5LCBpc011bHRpTGluZTogZmFsc2UsIGlzUmF3OiBmYWxzZSk7CiAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgIH0KICAgICAgaWYgKG5leHQgPiAxMjcpIGFzY2lpT25seSA9IGZhbHNlOwogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgfQogICAgaWYgKCFhc2NpaU9ubHkpIGhhbmRsZVVuaWNvZGUoc3RhcnQpOwogICAgLy8gQWR2YW5jZSBwYXN0IHRoZSBxdW90ZSBjaGFyYWN0ZXIuCiAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgYXBwZW5kU3Vic3RyaW5nVG9rZW4oVG9rZW5UeXBlLlNUUklORywgc3RhcnQsIGFzY2lpT25seSk7CiAgICByZXR1cm4gbmV4dDsKICB9CgogIGludCB0b2tlbml6ZVN0cmluZ0ludGVycG9sYXRpb24oaW50IHN0YXJ0LCBib29sIGFzY2lpT25seSkgewogICAgYXBwZW5kU3Vic3RyaW5nVG9rZW4oVG9rZW5UeXBlLlNUUklORywgc3RhcnQsIGFzY2lpT25seSk7CiAgICBiZWdpblRva2VuKCk7IC8vICQgc3RhcnRzIGhlcmUuCiAgICBpbnQgbmV4dCA9IGFkdmFuY2UoKTsKICAgIGlmIChpZGVudGljYWwobmV4dCwgJE9QRU5fQ1VSTFlfQlJBQ0tFVCkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplSW50ZXJwb2xhdGVkRXhwcmVzc2lvbihuZXh0KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0b2tlbml6ZUludGVycG9sYXRlZElkZW50aWZpZXIobmV4dCk7CiAgICB9CiAgfQoKICBpbnQgdG9rZW5pemVJbnRlcnBvbGF0ZWRFeHByZXNzaW9uKGludCBuZXh0KSB7CiAgICBhcHBlbmRCZWdpbkdyb3VwKFRva2VuVHlwZS5TVFJJTkdfSU5URVJQT0xBVElPTl9FWFBSRVNTSU9OKTsKICAgIGJlZ2luVG9rZW4oKTsgLy8gVGhlIGV4cHJlc3Npb24gc3RhcnRzIGhlcmUuCiAgICBuZXh0ID0gYWR2YW5jZSgpOyAvLyBNb3ZlIHBhc3QgdGhlIGN1cmx5IGJyYWNrZXQuCiAgICB3aGlsZSAoIWlkZW50aWNhbChuZXh0LCAkRU9GKSAmJiAhaWRlbnRpY2FsKG5leHQsICRTVFgpKSB7CiAgICAgIG5leHQgPSBiaWdTd2l0Y2gobmV4dCk7CiAgICB9CiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRFT0YpKSB7CiAgICAgIGJlZ2luVG9rZW4oKTsKICAgICAgZGlzY2FyZEludGVycG9sYXRpb24oKTsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CiAgICBuZXh0ID0gYWR2YW5jZSgpOyAvLyBNb3ZlIHBhc3QgdGhlICRTVFguCiAgICBiZWdpblRva2VuKCk7IC8vIFRoZSBzdHJpbmcgaW50ZXJwb2xhdGlvbiBzdWZmaXggc3RhcnRzIGhlcmUuCiAgICByZXR1cm4gbmV4dDsKICB9CgogIGludCB0b2tlbml6ZUludGVycG9sYXRlZElkZW50aWZpZXIoaW50IG5leHQpIHsKICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuU1RSSU5HX0lOVEVSUE9MQVRJT05fSURFTlRJRklFUik7CgogICAgaWYgKCRhIDw9IG5leHQgJiYgbmV4dCA8PSAkeiB8fAogICAgICAgICRBIDw9IG5leHQgJiYgbmV4dCA8PSAkWiB8fAogICAgICAgIGlkZW50aWNhbChuZXh0LCAkXykpIHsKICAgICAgYmVnaW5Ub2tlbigpOyAvLyBUaGUgaWRlbnRpZmllciBzdGFydHMgaGVyZS4KICAgICAgbmV4dCA9IHRva2VuaXplS2V5d29yZE9ySWRlbnRpZmllcihuZXh0LCBmYWxzZSk7CiAgICB9IGVsc2UgewogICAgICBiZWdpblRva2VuKCk7IC8vIFRoZSBzeW50aGV0aWMgaWRlbnRpZmllciBzdGFydHMgaGVyZS4KICAgICAgYXBwZW5kU3ludGhldGljU3Vic3RyaW5nVG9rZW4oVG9rZW5UeXBlLklERU5USUZJRVIsIHNjYW5PZmZzZXQsIHRydWUsICcnKTsKICAgICAgdW50ZXJtaW5hdGVkKG1lc3NhZ2VVbmV4cGVjdGVkRG9sbGFySW5TdHJpbmcsIHNob3VsZEFkdmFuY2U6IGZhbHNlKTsKICAgIH0KICAgIGJlZ2luVG9rZW4oKTsgLy8gVGhlIHN0cmluZyBpbnRlcnBvbGF0aW9uIHN1ZmZpeCBzdGFydHMgaGVyZS4KICAgIHJldHVybiBuZXh0OwogIH0KCiAgaW50IHRva2VuaXplU2luZ2xlTGluZVJhd1N0cmluZyhpbnQgbmV4dCwgaW50IHF1b3RlQ2hhciwgaW50IHF1b3RlU3RhcnQpIHsKICAgIGJvb2wgYXNjaWlPbmx5ID0gdHJ1ZTsKICAgIHdoaWxlIChuZXh0ICE9ICRFT0YpIHsKICAgICAgaWYgKGlkZW50aWNhbChuZXh0LCBxdW90ZUNoYXIpKSB7CiAgICAgICAgaWYgKCFhc2NpaU9ubHkpIGhhbmRsZVVuaWNvZGUocXVvdGVTdGFydCk7CiAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgICBhcHBlbmRTdWJzdHJpbmdUb2tlbihUb2tlblR5cGUuU1RSSU5HLCBxdW90ZVN0YXJ0LCBhc2NpaU9ubHkpOwogICAgICAgIHJldHVybiBuZXh0OwogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbChuZXh0LCAkTEYpIHx8IGlkZW50aWNhbChuZXh0LCAkQ1IpKSB7CiAgICAgICAgaWYgKCFhc2NpaU9ubHkpIGhhbmRsZVVuaWNvZGUocXVvdGVTdGFydCk7CiAgICAgICAgdW50ZXJtaW5hdGVkU3RyaW5nKHF1b3RlQ2hhciwgcXVvdGVTdGFydCwgcXVvdGVTdGFydCwKICAgICAgICAgICAgYXNjaWlPbmx5OiBhc2NpaU9ubHksIGlzTXVsdGlMaW5lOiBmYWxzZSwgaXNSYXc6IHRydWUpOwogICAgICAgIHJldHVybiBuZXh0OwogICAgICB9IGVsc2UgaWYgKG5leHQgPiAxMjcpIHsKICAgICAgICBhc2NpaU9ubHkgPSBmYWxzZTsKICAgICAgfQogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgfQogICAgaWYgKCFhc2NpaU9ubHkpIGhhbmRsZVVuaWNvZGUocXVvdGVTdGFydCk7CiAgICB1bnRlcm1pbmF0ZWRTdHJpbmcocXVvdGVDaGFyLCBxdW90ZVN0YXJ0LCBxdW90ZVN0YXJ0LAogICAgICAgIGFzY2lpT25seTogYXNjaWlPbmx5LCBpc011bHRpTGluZTogZmFsc2UsIGlzUmF3OiB0cnVlKTsKICAgIHJldHVybiBuZXh0OwogIH0KCiAgaW50IHRva2VuaXplTXVsdGlMaW5lUmF3U3RyaW5nKGludCBxdW90ZUNoYXIsIGludCBxdW90ZVN0YXJ0KSB7CiAgICBib29sIGFzY2lpT25seVN0cmluZyA9IHRydWU7CiAgICBib29sIGFzY2lpT25seUxpbmUgPSB0cnVlOwogICAgaW50IHVuaWNvZGVTdGFydCA9IHF1b3RlU3RhcnQ7CiAgICBpbnQgbmV4dCA9IGFkdmFuY2UoKTsgLy8gQWR2YW5jZSBwYXN0IHRoZSAobGFzdCkgcXVvdGUgKG9mIHRocmVlKS4KICAgIG91dGVyOgogICAgd2hpbGUgKCFpZGVudGljYWwobmV4dCwgJEVPRikpIHsKICAgICAgd2hpbGUgKCFpZGVudGljYWwobmV4dCwgcXVvdGVDaGFyKSkgewogICAgICAgIGlmIChpZGVudGljYWwobmV4dCwgJExGKSkgewogICAgICAgICAgaWYgKCFhc2NpaU9ubHlMaW5lKSB7CiAgICAgICAgICAgIC8vIFN5bmNocm9uaXplIHRoZSBzdHJpbmcgb2Zmc2V0IGluIHRoZSB1dGY4IHNjYW5uZXIuCiAgICAgICAgICAgIGhhbmRsZVVuaWNvZGUodW5pY29kZVN0YXJ0KTsKICAgICAgICAgICAgYXNjaWlPbmx5TGluZSA9IHRydWU7CiAgICAgICAgICAgIHVuaWNvZGVTdGFydCA9IHNjYW5PZmZzZXQ7CiAgICAgICAgICB9CiAgICAgICAgICBsaW5lRmVlZEluTXVsdGlsaW5lKCk7CiAgICAgICAgfSBlbHNlIGlmIChuZXh0ID4gMTI3KSB7CiAgICAgICAgICBhc2NpaU9ubHlMaW5lID0gZmFsc2U7CiAgICAgICAgICBhc2NpaU9ubHlTdHJpbmcgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRFT0YpKSBicmVhayBvdXRlcjsKICAgICAgfQogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICBpZiAoaWRlbnRpY2FsKG5leHQsIHF1b3RlQ2hhcikpIHsKICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICAgIGlmIChpZGVudGljYWwobmV4dCwgcXVvdGVDaGFyKSkgewogICAgICAgICAgaWYgKCFhc2NpaU9ubHlMaW5lKSBoYW5kbGVVbmljb2RlKHVuaWNvZGVTdGFydCk7CiAgICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICAgICAgYXBwZW5kU3Vic3RyaW5nVG9rZW4oVG9rZW5UeXBlLlNUUklORywgcXVvdGVTdGFydCwgYXNjaWlPbmx5U3RyaW5nKTsKICAgICAgICAgIHJldHVybiBuZXh0OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKCFhc2NpaU9ubHlMaW5lKSBoYW5kbGVVbmljb2RlKHVuaWNvZGVTdGFydCk7CiAgICB1bnRlcm1pbmF0ZWRTdHJpbmcocXVvdGVDaGFyLCBxdW90ZVN0YXJ0LCBxdW90ZVN0YXJ0LAogICAgICAgIGFzY2lpT25seTogYXNjaWlPbmx5TGluZSwgaXNNdWx0aUxpbmU6IHRydWUsIGlzUmF3OiB0cnVlKTsKICAgIHJldHVybiBuZXh0OwogIH0KCiAgaW50IHRva2VuaXplTXVsdGlMaW5lU3RyaW5nKGludCBxdW90ZUNoYXIsIGludCBxdW90ZVN0YXJ0LCBib29sIHJhdykgewogICAgaWYgKHJhdykgcmV0dXJuIHRva2VuaXplTXVsdGlMaW5lUmF3U3RyaW5nKHF1b3RlQ2hhciwgcXVvdGVTdGFydCk7CiAgICBpbnQgc3RhcnQgPSBxdW90ZVN0YXJ0OwogICAgYm9vbCBhc2NpaU9ubHlTdHJpbmcgPSB0cnVlOwogICAgYm9vbCBhc2NpaU9ubHlMaW5lID0gdHJ1ZTsKICAgIGludCB1bmljb2RlU3RhcnQgPSBzdGFydDsKICAgIGludCBuZXh0ID0gYWR2YW5jZSgpOyAvLyBBZHZhbmNlIHBhc3QgdGhlIChsYXN0KSBxdW90ZSAob2YgdGhyZWUpLgogICAgd2hpbGUgKCFpZGVudGljYWwobmV4dCwgJEVPRikpIHsKICAgICAgaWYgKGlkZW50aWNhbChuZXh0LCAkJCkpIHsKICAgICAgICBpZiAoIWFzY2lpT25seUxpbmUpIGhhbmRsZVVuaWNvZGUodW5pY29kZVN0YXJ0KTsKICAgICAgICBuZXh0ID0gdG9rZW5pemVTdHJpbmdJbnRlcnBvbGF0aW9uKHN0YXJ0LCBhc2NpaU9ubHlTdHJpbmcpOwogICAgICAgIHN0YXJ0ID0gc2Nhbk9mZnNldDsKICAgICAgICB1bmljb2RlU3RhcnQgPSBzdGFydDsKICAgICAgICBhc2NpaU9ubHlTdHJpbmcgPSB0cnVlOyAvLyBBIG5ldyBzdHJpbmcgdG9rZW4gaXMgY3JlYXRlZCBmb3IgdGhlIHJlc3QuCiAgICAgICAgYXNjaWlPbmx5TGluZSA9IHRydWU7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGlkZW50aWNhbChuZXh0LCBxdW90ZUNoYXIpKSB7CiAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgICBpZiAoaWRlbnRpY2FsKG5leHQsIHF1b3RlQ2hhcikpIHsKICAgICAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgICAgICBpZiAoaWRlbnRpY2FsKG5leHQsIHF1b3RlQ2hhcikpIHsKICAgICAgICAgICAgaWYgKCFhc2NpaU9ubHlMaW5lKSBoYW5kbGVVbmljb2RlKHVuaWNvZGVTdGFydCk7CiAgICAgICAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgICAgICAgIGFwcGVuZFN1YnN0cmluZ1Rva2VuKFRva2VuVHlwZS5TVFJJTkcsIHN0YXJ0LCBhc2NpaU9ubHlTdHJpbmcpOwogICAgICAgICAgICByZXR1cm4gbmV4dDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGlkZW50aWNhbChuZXh0LCAkQkFDS1NMQVNIKSkgewogICAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgICAgaWYgKGlkZW50aWNhbChuZXh0LCAkRU9GKSkgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGlkZW50aWNhbChuZXh0LCAkTEYpKSB7CiAgICAgICAgaWYgKCFhc2NpaU9ubHlMaW5lKSB7CiAgICAgICAgICAvLyBTeW5jaHJvbml6ZSB0aGUgc3RyaW5nIG9mZnNldCBpbiB0aGUgdXRmOCBzY2FubmVyLgogICAgICAgICAgaGFuZGxlVW5pY29kZSh1bmljb2RlU3RhcnQpOwogICAgICAgICAgYXNjaWlPbmx5TGluZSA9IHRydWU7CiAgICAgICAgICB1bmljb2RlU3RhcnQgPSBzY2FuT2Zmc2V0OwogICAgICAgIH0KICAgICAgICBsaW5lRmVlZEluTXVsdGlsaW5lKCk7CiAgICAgIH0gZWxzZSBpZiAobmV4dCA+IDEyNykgewogICAgICAgIGFzY2lpT25seVN0cmluZyA9IGZhbHNlOwogICAgICAgIGFzY2lpT25seUxpbmUgPSBmYWxzZTsKICAgICAgfQogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgfQogICAgaWYgKCFhc2NpaU9ubHlMaW5lKSBoYW5kbGVVbmljb2RlKHVuaWNvZGVTdGFydCk7CiAgICB1bnRlcm1pbmF0ZWRTdHJpbmcocXVvdGVDaGFyLCBxdW90ZVN0YXJ0LCBzdGFydCwKICAgICAgICBhc2NpaU9ubHk6IGFzY2lpT25seVN0cmluZywgaXNNdWx0aUxpbmU6IHRydWUsIGlzUmF3OiBmYWxzZSk7CiAgICByZXR1cm4gbmV4dDsKICB9CgogIGludCB1bmV4cGVjdGVkKGludCBjaGFyYWN0ZXIpIHsKICAgIGFwcGVuZEVycm9yVG9rZW4oYnVpbGRVbmV4cGVjdGVkQ2hhcmFjdGVyVG9rZW4oY2hhcmFjdGVyLCB0b2tlblN0YXJ0KSk7CiAgICByZXR1cm4gYWR2YW5jZUFmdGVyRXJyb3IodHJ1ZSk7CiAgfQoKICBpbnQgdW50ZXJtaW5hdGVkKE1lc3NhZ2UgbWVzc2FnZSwge2Jvb2wgc2hvdWxkQWR2YW5jZTogdHJ1ZX0pIHsKICAgIGFwcGVuZEVycm9yVG9rZW4obmV3IFVudGVybWluYXRlZFRva2VuKG1lc3NhZ2UsIHRva2VuU3RhcnQsIHN0cmluZ09mZnNldCkpOwogICAgcmV0dXJuIGFkdmFuY2VBZnRlckVycm9yKHNob3VsZEFkdmFuY2UpOwogIH0KCiAgdm9pZCB1bnRlcm1pbmF0ZWRTdHJpbmcoaW50IHF1b3RlQ2hhciwgaW50IHF1b3RlU3RhcnQsIGludCBzdGFydCwKICAgICAge2Jvb2wgYXNjaWlPbmx5LCBib29sIGlzTXVsdGlMaW5lLCBib29sIGlzUmF3fSkgewogICAgU3RyaW5nIHN1ZmZpeCA9IG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcygKICAgICAgICBpc011bHRpTGluZSA/IFtxdW90ZUNoYXIsIHF1b3RlQ2hhciwgcXVvdGVDaGFyXSA6IFtxdW90ZUNoYXJdKTsKICAgIFN0cmluZyBwcmVmaXggPSBpc1JhdyA/ICdyJHN1ZmZpeCcgOiBzdWZmaXg7CgogICAgYXBwZW5kU3ludGhldGljU3Vic3RyaW5nVG9rZW4oVG9rZW5UeXBlLlNUUklORywgc3RhcnQsIGFzY2lpT25seSwgc3VmZml4KTsKICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBlcnJvciBpcyByZXBvcnRlZCBvbiBhIHZpc2libGUgdG9rZW4KICAgIGludCBlcnJvclN0YXJ0ID0gdG9rZW5TdGFydCA8IHN0cmluZ09mZnNldCA/IHRva2VuU3RhcnQgOiBxdW90ZVN0YXJ0OwogICAgYXBwZW5kRXJyb3JUb2tlbihuZXcgVW50ZXJtaW5hdGVkU3RyaW5nKHByZWZpeCwgZXJyb3JTdGFydCwgc3RyaW5nT2Zmc2V0KSk7CiAgfQoKICBpbnQgYWR2YW5jZUFmdGVyRXJyb3IoYm9vbCBzaG91bGRBZHZhbmNlKSB7CiAgICBpZiAoYXRFbmRPZkZpbGUoKSkgcmV0dXJuICRFT0Y7CiAgICBpZiAoc2hvdWxkQWR2YW5jZSkgewogICAgICByZXR1cm4gYWR2YW5jZSgpOyAvLyBFbnN1cmUgcHJvZ3Jlc3MuCiAgICB9IGVsc2UgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgfQp9CgpUb2tlblR5cGUgY2xvc2VCcmFjZUluZm9Gb3IoQmVnaW5Ub2tlbiBiZWdpbikgewogIHJldHVybiBjb25zdCB7CiAgICAnKCc6IFRva2VuVHlwZS5DTE9TRV9QQVJFTiwKICAgICdbJzogVG9rZW5UeXBlLkNMT1NFX1NRVUFSRV9CUkFDS0VULAogICAgJ3snOiBUb2tlblR5cGUuQ0xPU0VfQ1VSTFlfQlJBQ0tFVCwKICAgICc8JzogVG9rZW5UeXBlLkdULAogICAgcickeyc6IFRva2VuVHlwZS5DTE9TRV9DVVJMWV9CUkFDS0VULAogIH1bYmVnaW4ubGV4ZW1lXTsKfQoKY2xhc3MgTGluZVN0YXJ0cyBleHRlbmRzIE9iamVjdCB3aXRoIExpc3RNaXhpbjxpbnQ+IHsKICBMaXN0PGludD4gYXJyYXk7CiAgaW50IGFycmF5TGVuZ3RoID0gMDsKCiAgTGluZVN0YXJ0cyhpbnQgbnVtYmVyT2ZCeXRlc0hpbnQpIHsKICAgIC8vIExldCdzIGFzc3VtZSB0aGUgYXZlcmFnZSBEYXJ0IGZpbGUgaXMgMzAwIGJ5dGVzLgogICAgaWYgKG51bWJlck9mQnl0ZXNIaW50ID09IG51bGwpIG51bWJlck9mQnl0ZXNIaW50ID0gMzAwOwoKICAgIC8vIExldCdzIGFzc3VtZSB3ZSBoYXZlIG9uIGF2ZXJhZ2UgMjIgYnl0ZXMgcGVyIGxpbmUuCiAgICBmaW5hbCBpbnQgZXhwZWN0ZWROdW1iZXJPZkxpbmVzID0gMSArIChudW1iZXJPZkJ5dGVzSGludCB+LyAyMik7CgogICAgaWYgKG51bWJlck9mQnl0ZXNIaW50ID4gNjU1MzUpIHsKICAgICAgYXJyYXkgPSBuZXcgVWludDMyTGlzdChleHBlY3RlZE51bWJlck9mTGluZXMpOwogICAgfSBlbHNlIHsKICAgICAgYXJyYXkgPSBuZXcgVWludDE2TGlzdChleHBlY3RlZE51bWJlck9mTGluZXMpOwogICAgfQoKICAgIC8vIFRoZSBmaXJzdCBsaW5lIHN0YXJ0cyBhdCBjaGFyYWN0ZXIgb2Zmc2V0IDAuCiAgICBhZGQoMCk7CiAgfQoKICAvLyBJbXBsZW1lbnQgYWJzdHJhY3QgbWVtYmVycyB1c2VkIGJ5IFtMaXN0TWl4aW5dCgogIGludCBnZXQgbGVuZ3RoID0+IGFycmF5TGVuZ3RoOwoKICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBhc3NlcnQoaW5kZXggPCBhcnJheUxlbmd0aCk7CiAgICByZXR1cm4gYXJyYXlbaW5kZXhdOwogIH0KCiAgdm9pZCBzZXQgbGVuZ3RoKGludCBuZXdMZW5ndGgpIHsKICAgIGlmIChuZXdMZW5ndGggPiBhcnJheS5sZW5ndGgpIHsKICAgICAgZ3JvdyhuZXdMZW5ndGgpOwogICAgfQogICAgYXJyYXlMZW5ndGggPSBuZXdMZW5ndGg7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgaWYgKHZhbHVlID4gNjU1MzUgJiYgYXJyYXkgaXMhIFVpbnQzMkxpc3QpIHsKICAgICAgc3dpdGNoVG9VaW50MzIoYXJyYXkubGVuZ3RoKTsKICAgIH0KICAgIGFycmF5W2luZGV4XSA9IHZhbHVlOwogIH0KCiAgLy8gU3BlY2lhbGl6ZSBtZXRob2RzIGZyb20gW0xpc3RNaXhpbl0uCiAgdm9pZCBhZGQoaW50IHZhbHVlKSB7CiAgICBpZiAoYXJyYXlMZW5ndGggPj0gYXJyYXkubGVuZ3RoKSB7CiAgICAgIGdyb3coMCk7CiAgICB9CiAgICBpZiAodmFsdWUgPiA2NTUzNSAmJiBhcnJheSBpcyEgVWludDMyTGlzdCkgewogICAgICBzd2l0Y2hUb1VpbnQzMihhcnJheS5sZW5ndGgpOwogICAgfQogICAgYXJyYXlbYXJyYXlMZW5ndGgrK10gPSB2YWx1ZTsKICB9CgogIC8vIEhlbHBlciBtZXRob2RzLgoKICB2b2lkIGdyb3coaW50IG5ld0xlbmd0aE1pbmltdW0pIHsKICAgIGludCBuZXdMZW5ndGggPSBhcnJheS5sZW5ndGggKiAyOwogICAgaWYgKG5ld0xlbmd0aCA8IG5ld0xlbmd0aE1pbmltdW0pIG5ld0xlbmd0aCA9IG5ld0xlbmd0aE1pbmltdW07CgogICAgaWYgKGFycmF5IGlzIFVpbnQxNkxpc3QpIHsKICAgICAgZmluYWwgbmV3QXJyYXkgPSBuZXcgVWludDE2TGlzdChuZXdM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MjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29sbGVjdGlvbjsKCi8vLyBBYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiBhIGxpc3QuCi8vLwovLy8gYExpc3RCYXNlYCBjYW4gYmUgdXNlZCBhcyBhIGJhc2UgY2xhc3MgZm9yIGltcGxlbWVudGluZyB0aGUgYExpc3RgCi8vLyBpbnRlcmZhY2UuCi8vLwovLy8gQWxsIG9wZXJhdGlvbnMgYXJlIGRlZmluZWQgaW4gdGVybXMgb2YgYGxlbmd0aGAsIGBvcGVyYXRvcltdYCwKLy8vIGBvcGVyYXRvcltdPWAgYW5kIGBsZW5ndGg9YCwgd2hpY2ggbmVlZCB0byBiZSBpbXBsZW1lbnRlZC4KLy8vCi8vLyAqTk9USUNFKjogRm9yd2FyZGluZyBqdXN0IHRoZXNlIGZvdXIgb3BlcmF0aW9ucyB0byBhIG5vcm1hbCBncm93YWJsZSBbTGlzdF0KLy8vIChhcyBjcmVhdGVkIGJ5IGBuZXcgTGlzdCgpYCkgd2lsbCBnaXZlIHZlcnkgYmFkIHBlcmZvcm1hbmNlIGZvciBgYWRkYCBhbmQKLy8vIGBhZGRBbGxgIG9wZXJhdGlvbnMgb2YgYExpc3RCYXNlYC4gVGhlc2Ugb3BlcmF0aW9ucyBhcmUgaW1wbGVtZW50ZWQgYnkKLy8vIGluY3JlYXNpbmcgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBieSBvbmUgZm9yIGVhY2ggYGFkZGAgb3BlcmF0aW9uLCBhbmQKLy8vIHJlcGVhdGVkbHkgaW5jcmVhc2luZyB0aGUgbGVuZ3RoIG9mIGEgZ3Jvd2FibGUgbGlzdCBpcyBub3QgZWZmaWNpZW50LgovLy8gVG8gYXZvaWQgdGhpcywgZWl0aGVyIG92ZXJyaWRlICdhZGQnIGFuZCAnYWRkQWxsJyB0byBhbHNvIGZvcndhcmQgZGlyZWN0bHkKLy8vIHRvIHRoZSBncm93YWJsZSBsaXN0LCBvciwgcHJlZmVyYWJseSwgdXNlIGBEZWxlZ2F0aW5nTGlzdGAgZnJvbQovLy8gInBhY2thZ2U6Y29sbGVjdGlvbi93cmFwcGVycy5kYXJ0IiBpbnN0ZWFkLgphYnN0cmFjdCBjbGFzcyBMaXN0QmFzZTxFPiBleHRlbmRzIE9iamVjdCB3aXRoIExpc3RNaXhpbjxFPiB7CiAgLy8vIENvbnZlcnQgYSBgTGlzdGAgdG8gYSBzdHJpbmcgYXMgYFtlYWNoLCBlbGVtZW50LCBhcywgc3RyaW5nXWAuCiAgLy8vCiAgLy8vIEhhbmRsZXMgY2lyY3VsYXIgcmVmZXJlbmNlcyB3aGVyZSBjb252ZXJ0aW5nIG9uZSBvZiB0aGUgZWxlbWVudHMKICAvLy8gdG8gYSBzdHJpbmcgZW5kcyB1cCBjb252ZXJ0aW5nIFtsaXN0XSB0byBhIHN0cmluZyBhZ2Fpbi4KICBzdGF0aWMgU3RyaW5nIGxpc3RUb1N0cmluZyhMaXN0IGxpc3QpID0+CiAgICAgIEl0ZXJhYmxlQmFzZS5pdGVyYWJsZVRvRnVsbFN0cmluZyhsaXN0LCAnWycsICddJyk7Cn0KCi8vLyBCYXNlIGltcGxlbWVudGF0aW9uIG9mIGEgW0xpc3RdIGNsYXNzLgovLy8KLy8vIGBMaXN0TWl4aW5gIGNhbiBiZSB1c2VkIGFzIGEgbWl4aW4gdG8gbWFrZSBhIGNsYXNzIGltcGxlbWVudAovLy8gdGhlIGBMaXN0YCBpbnRlcmZhY2UuCi8vLwovLy8gVGhpcyBpbXBsZW1lbnRzIGFsbCByZWFkIG9wZXJhdGlvbnMgdXNpbmcgb25seSB0aGUgYGxlbmd0aGAgYW5kCi8vLyBgb3BlcmF0b3JbXWAgbWVtYmVycy4gSXQgaW1wbGVtZW50cyB3cml0ZSBvcGVyYXRpb25zIHVzaW5nIHRob3NlIGFuZAovLy8gYGxlbmd0aD1gIGFuZCBgb3BlcmF0b3JbXT1gCi8vLwovLy8gKk5PVElDRSo6IEZvcndhcmRpbmcganVzdCB0aGVzZSBmb3VyIG9wZXJhdGlvbnMgdG8gYSBub3JtYWwgZ3Jvd2FibGUgW0xpc3RdCi8vLyAoYXMgY3JlYXRlZCBieSBgbmV3IExpc3QoKWApIHdpbGwgZ2l2ZSB2ZXJ5IGJhZCBwZXJmb3JtYW5jZSBmb3IgYGFkZGAgYW5kCi8vLyBgYWRkQWxsYCBvcGVyYXRpb25zIG9mIGBMaXN0QmFzZWAuIFRoZXNlIG9wZXJhdGlvbnMgYXJlIGltcGxlbWVudGVkIGJ5Ci8vLyBpbmNyZWFzaW5nIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYnkgb25lIGZvciBlYWNoIGBhZGRgIG9wZXJhdGlvbiwgYW5kCi8vLyByZXBlYXRlZGx5IGluY3JlYXNpbmcgdGhlIGxlbmd0aCBvZiBhIGdyb3dhYmxlIGxpc3QgaXMgbm90IGVmZmljaWVudC4KLy8vIFRvIGF2b2lkIHRoaXMsIGVpdGhlciBvdmVycmlkZSAnYWRkJyBhbmQgJ2FkZEFsbCcgdG8gYWxzbyBmb3J3YXJkIGRpcmVjdGx5Ci8vLyB0byB0aGUgZ3Jvd2FibGUgbGlzdCwgb3IsIGlmIHBvc3NpYmxlLCB1c2UgYERlbGVnYXRpbmdMaXN0YCBmcm9tCi8vLyAicGFja2FnZTpjb2xsZWN0aW9uL3dyYXBwZXJzLmRhcnQiIGluc3RlYWQuCmFic3RyYWN0IGNsYXNzIExpc3RNaXhpbjxFPiBpbXBsZW1lbnRzIExpc3Q8RT4gewogIC8vIEl0ZXJhYmxlIGludGVyZmFjZS4KICAvLyBUT0RPKGxybik6IFdoZW4gd2UgZ2V0IGNvbXBvc2FibGUgbWl4aW5zLCByZXVzZSBJdGVyYWJsZU1peGluIGluc3RlYWQKICAvLyBvZiByZWRhY2xhdGluZyBldmVyeXRoaW5nLgogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciA9PiBMaXN0SXRlcmF0b3I8RT4odGhpcyk7CgogIEUgZWxlbWVudEF0KGludCBpbmRleCkgPT4gdGhpc1tpbmRleF07CgogIEl0ZXJhYmxlPEU+IGZvbGxvd2VkQnkoSXRlcmFibGU8RT4gb3RoZXIpID0+CiAgICAgIEZvbGxvd2VkQnlJdGVyYWJsZTxFPi5maXJzdEVmZmljaWVudCh0aGlzLCBvdGhlcik7CgogIHZvaWQgZm9yRWFjaCh2b2lkIGFjdGlvbihFIGVsZW1lbnQpKSB7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGFjdGlvbih0aGlzW2ldKTsKICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgfQogIH0KCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBsZW5ndGggPT0gMDsKCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiAhaXNFbXB0eTsKCiAgRSBnZXQgZmlyc3QgewogICAgaWYgKGxlbmd0aCA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIHJldHVybiB0aGlzWzBdOwogIH0KCiAgdm9pZCBzZXQgZmlyc3QoRSB2YWx1ZSkgewogICAgaWYgKGxlbmd0aCA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIHRoaXNbMF0gPSB2YWx1ZTsKICB9CgogIEUgZ2V0IGxhc3QgewogICAgaWYgKGxlbmd0aCA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIHJldHVybiB0aGlzW2xlbmd0aCAtIDFdOwogIH0KCiAgdm9pZCBzZXQgbGFzdChFIHZhbHVlKSB7CiAgICBpZiAobGVuZ3RoID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgdGhpc1tsZW5ndGggLSAxXSA9IHZhbHVlOwogIH0KCiAgRSBnZXQgc2luZ2xlIHsKICAgIGlmIChsZW5ndGggPT0gMCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICBpZiAobGVuZ3RoID4gMSkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgcmV0dXJuIHRoaXNbMF07CiAgfQoKICBib29sIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KSB7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0aGlzW2ldID09IGVsZW1lbnQpIHJldHVybiB0cnVlOwogICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBib29sIGV2ZXJ5KGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICghdGVzdCh0aGlzW2ldKSkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGJvb2wgYW55KGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0ZXN0KHRoaXNbaV0pKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgRSBmaXJzdFdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCB7RSBvckVsc2UoKX0pIHsKICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgRSBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHJldHVybiBlbGVtZW50OwogICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICB9CiAgICB9CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRSBsYXN0V2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIHtFIG9yRWxzZSgpfSkgewogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IGxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIEUgZWxlbWVudCA9IHRoaXNbaV07CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSByZXR1cm4gZWxlbWVudDsKICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgfQogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEUgc2luZ2xlV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIHtFIG9yRWxzZSgpfSkgewogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgRSBtYXRjaDsKICAgIGJvb2wgbWF0Y2hGb3VuZCA9IGZhbHNlOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBFIGVsZW1lbnQgPSB0aGlzW2ldOwogICAgICBpZiAodGVzdChlbGVtZW50KSkgewogICAgICAgIGlmIChtYXRjaEZvdW5kKSB7CiAgICAgICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgICAgICAgfQogICAgICAgIG1hdGNoRm91bmQgPSB0cnVlOwogICAgICAgIG1hdGNoID0gZWxlbWVudDsKICAgICAgfQogICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICB9CiAgICB9CiAgICBpZiAobWF0Y2hGb3VuZCkgcmV0dXJuIG1hdGNoOwogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIFN0cmluZyBqb2luKFtTdHJpbmcgc2VwYXJhdG9yID0gIiJdKSB7CiAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiAiIjsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBTdHJpbmdCdWZmZXIoKS4ud3JpdGVBbGwodGhpcywgc2VwYXJhdG9yKTsKICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9CgogIEl0ZXJhYmxlPEU+IHdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBXaGVyZUl0ZXJhYmxlPEU+KHRoaXMsIHRlc3QpOwoKICBJdGVyYWJsZTxUPiB3aGVyZVR5cGU8VD4oKSA9PiBXaGVyZVR5cGVJdGVyYWJsZTxUPih0aGlzKTsKCiAgSXRlcmFibGU8VD4gbWFwPFQ+KFQgZihFIGVsZW1lbnQpKSA9PiBNYXBwZWRMaXN0SXRlcmFibGU8RSwgVD4odGhpcywgZik7CgogIEl0ZXJhYmxlPFQ+IGV4cGFuZDxUPihJdGVyYWJsZTxUPiBmKEUgZWxlbWVudCkpID0+CiAgICAgIEV4cGFuZEl0ZXJhYmxlPEUsIFQ+KHRoaXMsIGYpOwoKICBFIHJlZHVjZShFIGNvbWJpbmUoRSBwcmV2aW91c1ZhbHVlLCBFIGVsZW1lbnQpKSB7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBpZiAobGVuZ3RoID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgRSB2YWx1ZSA9IHRoaXNbMF07CiAgICBmb3IgKGludCBpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgdGhpc1tpXSk7CiAgICAgIGlmIChsZW5ndGggIT0gdGhpcy5sZW5ndGgpIHsKICAgICAgICB0aHJvdyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CgogIFQgZm9sZDxUPihUIGluaXRpYWxWYWx1ZSwgVCBjb21iaW5lKFQgcHJldmlvdXNWYWx1ZSwgRSBlbGVtZW50KSkgewogICAgdmFyIHZhbHVlID0gaW5pdGlhbFZhbHVlOwogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICB2YWx1ZSA9IGNvbWJpbmUodmFsdWUsIHRoaXNbaV0pOwogICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBJdGVyYWJsZTxFPiBza2lwKGludCBjb3VudCkgPT4gU3ViTGlzdEl0ZXJhYmxlPEU+KHRoaXMsIGNvdW50LCBudWxsKTsKCiAgSXRlcmFibGU8RT4gc2tpcFdoaWxlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICByZXR1cm4gU2tpcFdoaWxlSXRlcmFibGU8RT4odGhpcywgdGVzdCk7CiAgfQoKICBJdGVyYWJsZTxFPiB0YWtlKGludCBjb3VudCkgPT4gU3ViTGlzdEl0ZXJhYmxlPEU+KHRoaXMsIDAsIGNvdW50KTsKCiAgSXRlcmFibGU8RT4gdGFrZVdoaWxlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICByZXR1cm4gVGFrZVdoaWxlSXRlcmFibGU8RT4odGhpcywgdGVzdCk7CiAgfQoKICBMaXN0PEU+IHRvTGlzdCh7Ym9vbCBncm93YWJsZSA9IHRydWV9KSB7CiAgICBMaXN0PEU+IHJlc3VsdDsKICAgIGlmIChncm93YWJsZSkgewogICAgICByZXN1bHQgPSA8RT5bXS4ubGVuZ3RoID0gbGVuZ3RoOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0ID0gTGlzdDxFPihsZW5ndGgpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICByZXN1bHRbaV0gPSB0aGlzW2ldOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIFNldDxFPiB0b1NldCgpIHsKICAgIFNldDxFPiByZXN1bHQgPSBTZXQ8RT4oKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0LmFkZCh0aGlzW2ldKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLyBMaXN0IGludGVyZmFjZS4KICB2b2lkIGFkZChFIGVsZW1lbnQpIHsKICAgIHRoaXNbdGhpcy5sZW5ndGgrK10gPSBlbGVtZW50OwogIH0KCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKICAgIGludCBpID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKEUgZWxlbWVudCBpbiBpdGVyYWJsZSkgewogICAgICBhc3NlcnQodGhpcy5sZW5ndGggPT0gaSB8fCAodGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpKSk7CiAgICAgIHRoaXMubGVuZ3RoID0gaSArIDE7CiAgICAgIHRoaXNbaV0gPSBlbGVtZW50OwogICAgICBpKys7CiAgICB9CiAgfQoKICBib29sIHJlbW92ZShPYmplY3QgZWxlbWVudCkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0aGlzW2ldID09IGVsZW1lbnQpIHsKICAgICAgICB0aGlzLl9jbG9zZUdhcChpLCBpICsgMSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vLyBSZW1vdmVzIGVsZW1lbnRzIGZyb20gdGhlIGxpc3Qgc3RhcnRpbmcgYXQgW3N0YXJ0XSB1cCB0byBidXQgbm90IGluY2x1ZGluZwogIC8vLyBbZW5kXS4gIEFyZ3VtZW50cyBhcmUgcHJlLXZhbGlkYXRlZC4KICB2b2lkIF9jbG9zZUdhcChpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGFzc2VydCgwIDw9IHN0YXJ0KTsKICAgIGFzc2VydChzdGFydCA8IGVuZCk7CiAgICBhc3NlcnQoZW5kIDw9IGxlbmd0aCk7CiAgICBpbnQgc2l6ZSA9IGVuZCAtIHN0YXJ0OwogICAgZm9yIChpbnQgaSA9IGVuZDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHRoaXNbaSAtIHNpemVdID0gdGhpc1tpXTsKICAgIH0KICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoIC0gc2l6ZTsKICB9CgogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIF9maWx0ZXIodGVzdCwgZmFsc2UpOwogIH0KCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgX2ZpbHRlcih0ZXN0LCB0cnVlKTsKICB9CgogIHZvaWQgX2ZpbHRlcihib29sIHRlc3QoRSBlbGVtZW50KSwgYm9vbCByZXRhaW5NYXRjaGluZykgewogICAgTGlzdDxFPiByZXRhaW5lZCA9IDxFPltdOwogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICB2YXIgZWxlbWVudCA9IHRoaXNbaV07CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpID09IHJldGFpbk1hdGNoaW5nKSB7CiAgICAgICAgcmV0YWluZWQuYWRkKGVsZW1lbnQpOwogICAgICB9CiAgICAgIGlmIChsZW5ndGggIT0gdGhpcy5sZW5ndGgpIHsKICAgICAgICB0aHJvdyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChyZXRhaW5lZC5sZW5ndGggIT0gdGhpcy5sZW5ndGgpIHsKICAgICAgdGhpcy5zZXRSYW5nZSgwLCByZXRhaW5lZC5sZW5ndGgsIHJldGFpbmVkKTsKICAgICAgdGhpcy5sZW5ndGggPSByZXRhaW5lZC5sZW5ndGg7CiAgICB9CiAgfQoKICB2b2lkIGNsZWFyKCkgewogICAgdGhpcy5sZW5ndGggPSAwOwogIH0KCiAgTGlzdDxSPiBjYXN0PFI+KCkgPT4gTGlzdC5jYXN0RnJvbTxFLCBSPih0aGlzKTsKICBFIHJlbW92ZUxhc3QoKSB7CiAgICBpZiAobGVuZ3RoID09IDApIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB9CiAgICBFIHJlc3VsdCA9IHRoaXNbbGVuZ3RoIC0gMV07CiAgICBsZW5ndGgtLTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIHNvcnQoW2ludCBjb21wYXJlKEUgYSwgRSBiKV0pIHsKICAgIFNvcnQuc29ydCh0aGlzLCBjb21wYXJlID8/IF9jb21wYXJlQW55KTsKICB9CgogIHN0YXRpYyBpbnQgX2NvbXBhcmVBbnkoYSwgYikgewogICAgLy8gSW4gc3Ryb25nIG1vZGUgQ29tcGFyYWJsZS5jb21wYXJlIHJlcXVpcmVzIGFuIGltcGxpY2l0IGNhc3QgdG8gZW5zdXJlCiAgICAvLyBgYWAgYW5kIGBiYCBhcmUgQ29tcGFyYWJsZS4KICAgIHJldHVybiBDb21wYXJhYmxlLmNvbXBhcmUoYSwgYik7CiAgfQoKICB2b2lkIHNodWZmbGUoW1JhbmRvbSByYW5kb21dKSB7CiAgICByYW5kb20gPz89IFJhbmRvbSgpOwogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgd2hpbGUgKGxlbmd0aCA+IDEpIHsKICAgICAgaW50IHBvcyA9IHJhbmRvbS5uZXh0SW50KGxlbmd0aCk7CiAgICAgIGxlbmd0aCAtPSAxOwogICAgICB2YXIgdG1wID0gdGhpc1tsZW5ndGhdOwogICAgICB0aGlzW2xlbmd0aF0gPSB0aGlzW3Bvc107CiAgICAgIHRoaXNbcG9zXSA9IHRtcDsKICAgIH0KICB9CgogIE1hcDxpbnQsIEU+IGFzTWFwKCkgewogICAgcmV0dXJuIExpc3RNYXBWaWV3PEU+KHRoaXMpOwogIH0KCiAgTGlzdDxFPiBvcGVyYXRvciArKExpc3Q8RT4gb3RoZXIpIHsKICAgIHZhciByZXN1bHQgPSA8RT5bXS4ubGVuZ3RoID0gKHRoaXMubGVuZ3RoICsgb3RoZXIubGVuZ3RoKTsKICAgIHJlc3VsdC5zZXRSYW5nZSgwLCB0aGlzLmxlbmd0aCwgdGhpcyk7CiAgICByZXN1bHQuc2V0UmFuZ2UodGhpcy5sZW5ndGgsIHJlc3VsdC5sZW5ndGgsIG90aGVyKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBMaXN0PEU+IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKICAgIGludCBsaXN0TGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBlbmQgPz89IGxpc3RMZW5ndGg7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBsaXN0TGVuZ3RoKTsKICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIExpc3Q8RT4gcmVzdWx0ID0gPEU+W10uLmxlbmd0aCA9IGxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0W2ldID0gdGhpc1tzdGFydCArIGldOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEl0ZXJhYmxlPEU+IGdldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgcmV0dXJuIFN1Ykxpc3RJdGVyYWJsZTxFPih0aGlzLCBzdGFydCwgZW5kKTsKICB9CgogIHZvaWQgcmVtb3ZlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICBpZiAoZW5kID4gc3RhcnQpIHsKICAgICAgX2Nsb3NlR2FwKHN0YXJ0LCBlbmQpOwogICAgfQogIH0KCiAgdm9pZCBmaWxsUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBbRSBmaWxsXSkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgdGhpc1tpXSA9IGZpbGw7CiAgICB9CiAgfQoKICB2b2lkIHNldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGU8RT4gaXRlcmFibGUsIFtpbnQgc2tpcENvdW50ID0gMF0pIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuOwogICAgUmFuZ2VFcnJvci5jaGVja05vdE5lZ2F0aXZlKHNraXBDb3VudCwgInNraXBDb3VudCIpOwoKICAgIExpc3Q8RT4gb3RoZXJMaXN0OwogICAgaW50IG90aGVyU3RhcnQ7CiAgICAvLyBUT0RPKGZsb2l0c2NoKTogTWFrZSB0aGlzIGFjY2VwdCBtb3JlLgogICAgaWYgKGl0ZXJhYmxlIGlzIExpc3Q8RT4pIHsKICAgICAgb3RoZXJMaXN0ID0gaXRlcmFibGU7CiAgICAgIG90aGVyU3RhcnQgPSBza2lwQ291bnQ7CiAgICB9IGVsc2UgewogICAgICBvdGhlckxpc3QgPSBpdGVyYWJsZS5za2lwKHNraXBDb3VudCkudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICAgIG90aGVyU3RhcnQgPSAwOwogICAgfQogICAgaWYgKG90aGVyU3RhcnQgKyBsZW5ndGggPiBvdGhlckxpc3QubGVuZ3RoKSB7CiAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLnRvb0ZldygpOwogICAgfQogICAgaWYgKG90aGVyU3RhcnQgPCBzdGFydCkgewogICAgICAvLyBDb3B5IGJhY2t3YXJkcyB0byBlbnN1cmUgY29ycmVjdCBjb3B5IGlmIFtmcm9tXSBpcyB0aGlzLgogICAgICBmb3IgKGludCBpID0gbGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICB0aGlzW3N0YXJ0ICsgaV0gPSBvdGhlckxpc3Rbb3RoZXJTdGFydCArIGldOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgdGhpc1tzdGFydCArIGldID0gb3RoZXJMaXN0W290aGVyU3RhcnQgKyBpXTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCByZXBsYWNlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZTxFPiBuZXdDb250ZW50cykgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgaWYgKG5ld0NvbnRlbnRzIGlzISBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZSkgewogICAgICBuZXdDb250ZW50cyA9IG5ld0NvbnRlbnRzLnRvTGlzdCgpOwogICAgfQogICAgaW50IHJlbW92ZUxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgaW50IGluc2VydExlbmd0aCA9IG5ld0NvbnRlbnRzLmxlbmd0aDsKICAgIGlmIChyZW1vdmVMZW5ndGggPj0gaW5zZXJ0TGVuZ3RoKSB7CiAgICAgIGludCBpbnNlcnRFbmQgPSBzdGFydCArIGluc2VydExlbmd0aDsKICAgICAgdGhpcy5zZXRSYW5nZShzdGFydCwgaW5zZXJ0RW5kLCBuZXdDb250ZW50cyk7CiAgICAgIGlmIChyZW1vdmVMZW5ndGggPiBpbnNlcnRMZW5ndGgpIHsKICAgICAgICBfY2xvc2VHYXAoaW5zZXJ0RW5kLCBlbmQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpbnQgZGVsdGEgPSBpbnNlcnRMZW5ndGggLSByZW1vdmVMZW5ndGg7CiAgICAgIGludCBuZXdMZW5ndGggPSB0aGlzLmxlbmd0aCArIGRlbHRhOwogICAgICBpbnQgaW5zZXJ0RW5kID0gc3RhcnQgKyBpbnNlcnRMZW5ndGg7IC8vIGFrYS4gZW5kICsgZGVsdGEuCiAgICAgIHRoaXMubGVuZ3RoID0gbmV3TGVuZ3RoOwogICAgICB0aGlzLnNldFJhbmdlKGluc2VydEVuZCwgbmV3TGVuZ3RoLCB0aGlzLCBlbmQpOwogICAgICB0aGlzLnNldFJhbmdlKHN0YXJ0LCBpbnNlcnRFbmQsIG5ld0NvbnRlbnRzKTsKICAgIH0KICB9CgogIGludCBpbmRleE9mKE9iamVjdCBlbGVtZW50LCBbaW50IHN0YXJ0ID0gMF0pIHsKICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMDsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKHRoaXNbaV0gPT0gZWxlbWVudCkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICBpbnQgaW5kZXhXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwgW2ludCBzdGFydCA9IDBdKSB7CiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDA7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0ZXN0KHRoaXNbaV0pKSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIGludCBsYXN0SW5kZXhPZihPYmplY3QgZWxlbWVudCwgW2ludCBzdGFydF0pIHsKICAgIGlmIChzdGFydCA9PSBudWxsIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSBzdGFydCA9IHRoaXMubGVuZ3RoIC0gMTsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA+PSAwOyBpLS0pIHsKICAgICAgaWYgKHRoaXNbaV0gPT0gZWxlbWVudCkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICBpbnQgbGFzdEluZGV4V2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIFtpbnQgc3RhcnRdKSB7CiAgICBpZiAoc3RhcnQgPT0gbnVsbCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgc3RhcnQgPSB0aGlzLmxlbmd0aCAtIDE7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGlmICh0ZXN0KHRoaXNbaV0pKSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIHZvaWQgaW5zZXJ0KGludCBpbmRleCwgRSBlbGVtZW50KSB7CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChpbmRleCwgImluZGV4Iik7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsdWVJbkludGVydmFsKGluZGV4LCAwLCBsZW5ndGgsICJpbmRleCIpOwogICAgaWYgKGluZGV4ID09IHRoaXMubGVuZ3RoKSB7CiAgICAgIGFkZChlbGVtZW50KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5sZW5ndGgrKzsKICAgIHNldFJhbmdlKGluZGV4ICsgMSwgdGhpcy5sZW5ndGgsIHRoaXMsIGluZGV4KTsKICAgIHRoaXNbaW5kZXhdID0gZWxlbWVudDsKICB9CgogIEUgcmVtb3ZlQXQoaW50IGluZGV4KSB7CiAgICBFIHJlc3VsdCA9IHRoaXNbaW5kZXhdOwogICAgX2Nsb3NlR2FwKGluZGV4LCBpbmRleCArIDEpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgaW5zZXJ0QWxsKGludCBpbmRleCwgSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWx1ZUluSW50ZXJ2YWwoaW5kZXgsIDAsIGxlbmd0aCwgImluZGV4Iik7CiAgICBpZiAoaXRlcmFibGUgaXMhIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlIHx8IGlkZW50aWNhbChpdGVyYWJsZSwgdGhpcykpIHsKICAgICAgaXRlcmFibGUgPSBpdGVyYWJsZS50b0xpc3QoKTsKICAgIH0KICAgIGludCBpbnNlcnRpb25MZW5ndGggPSBpdGVyYWJsZS5sZW5ndGg7CiAgICAvLyBUaGVyZSBtaWdodCBiZSBlcnJvcnMgYWZ0ZXIgdGhlIGxlbmd0aCBjaGFuZ2UsIGluIHdoaWNoIGNhc2UgdGhlIGxpc3QKICAgIC8vIHdpbGwgZW5kIHVwIGJlaW5nIG1vZGlmaWVkIGJ1dCB0aGUgb3BlcmF0aW9uIG5vdCBjb21wbGV0ZS4gVW5sZXNzIHdlCiAgICAvLyBhbHdheXMgZ28gdGhyb3VnaCBhICJ0b0xpc3QiIHdlIGNhbid0IHJlYWxseSBhdm9pZCB0aGF0LgogICAgdGhpcy5sZW5ndGggKz0gaW5zZXJ0aW9uTGVuZ3RoOwogICAgaWYgKGl0ZXJhYmxlLmxlbmd0aCAhPSBpbnNlcnRpb25MZW5ndGgpIHsKICAgICAgLy8gSWYgdGhlIGl0ZXJhYmxlJ3MgbGVuZ3RoIGlzIGxpbmtlZCB0byB0aGlzIGxpc3QncyBsZW5ndGggc29tZWhvdywKICAgICAgLy8gd2UgY2FuJ3QgaW5zZXJ0IG9uZSBpbiB0aGUgb3RoZXIuCiAgICAgIHRoaXMubGVuZ3RoIC09IGluc2VydGlvbkxlbmd0aDsKICAgICAgdGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKGl0ZXJhYmxlKTsKICAgIH0KICAgIHNldFJhbmdlKGluZGV4ICsgaW5zZXJ0aW9uTGVuZ3RoLCB0aGlzLmxlbmd0aCwgdGhpcywgaW5kZXgpOwogICAgc2V0QWxsKGluZGV4LCBpdGVyYWJsZSk7CiAgfQoKICB2b2lkIHNldEFsbChpbnQgaW5kZXgsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CiAgICBpZiAoaXRlcmFibGUgaXMgTGlzdCkgewogICAgICBzZXRSYW5nZShpbmRleCwgaW5kZXggKyBpdGVyYWJsZS5sZW5ndGgsIGl0ZXJhYmxlKTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoRSBlbGVtZW50IGluIGl0ZXJhYmxlKSB7CiAgICAgICAgdGhpc1tpbmRleCsrXSA9IGVsZW1lbnQ7CiAgICAgIH0KICAgIH0KICB9CgogIEl0ZXJhYmxlPEU+IGdldCByZXZlcnNlZCA9PiBSZXZlcnNlZExpc3RJdGVyYWJsZTxFPih0aGlzKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gSXRlcmFibGVCYXNlLml0ZXJhYmxlVG9GdWxsU3RyaW5nKHRoaXMsICdbJywgJ10nKTsKfQqCGABOTjwBGQEnBEcPBEM/BFBOS0tKT0QwPkUGRz8rOQIBKwRBGgRESSAEUE5LS0pPRTAxGUsgNQEpAS85ASkeJxcjMQgGBAEjASMBED0UBAEcPRUEAQ89HQQBGz0eBAERPToUBAEiHicrIzEIBhIEASUeJygjMQgGEQQBIx4nJiMxCAYSBAE1HicbKSMxCAYpLAQBNB4sGykjMQgGKSwEATYeDR0nGxsaMAobGQgjMQgGIiksBAEpIEUeBAFLATwBSwE1JQE0Hj0XJycjMQgGEgQBRR4eJycjMQgGEgQBSAEwLQQBRQEwLQQBKxQUJw0gBicbBhMEARMeJxsGEwQBFRgjBAEmGSJNGxkLBgQBICwgIhUIBhIEAVErJx4YGRscKSAGIQQBKxoEASsZBAE8Hh4nHS0fCCMxCAYqMyUGBAERFQQBMhMXLgYhDhMEASctBAEhTSMlBAEiGR4ZKBMeIBcGBAEYIQQBJj8rOBMEASoiGDgeLScjBhMEAS05MQQBKTkXHQYEATE5KBYGBAFROR4dOQEXFC4fHB4NRBYGMisGHkIuNQgNKTUIBgQBQzkzKgYkKygsNCkjCA0vK0EfNjQGBAExHjAoBg8EAToeMCMGDwQBMUgnKAYPBAE6SCcjBg8EASYwQCAUDgYTMxsEARocIRMEATRATSQGK01MQCQuSysmMwZBHQQBMRw6DSQhCAYEAT0BSgIBGWRhcnQ6Y29sbGVjdGlvbi9saXN0LmRhcnQnc2Rrcm9vdDovcGtnL2tlcm5lbC9saWIvdXRpbC9ncmFwaC5kYXJ0ipAvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFLm1kIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmdyYXBoOwoKYWJzdHJhY3QgY2xhc3MgR3JhcGg8VD4gewogIEl0ZXJhYmxlPFQ+IGdldCB2ZXJ0aWNlczsKCiAgSXRlcmFibGU8VD4gbmVpZ2hib3JzT2YoVCB2ZXJ0ZXgpOwp9CgovLy8gQ29tcHV0ZXMgdGhlIHN0cm9uZ2x5IGNvbm5lY3RlZCBjb21wb25lbnRzIG9mIFtncmFwaF0uCi8vLwovLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBbRGlqa3N0cmEncyBwYXRoLWJhc2VkIHN0cm9uZyBjb21wb25lbnQKLy8vIGFsZ29yaXRobV0KLy8vIChodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QYXRoLWJhc2VkX3N0cm9uZ19jb21wb25lbnRfYWxnb3JpdGhtI0Rlc2NyaXB0aW9uKS4KTGlzdDxMaXN0PFQ+PiBjb21wdXRlU3Ryb25nQ29tcG9uZW50czxUPihHcmFwaDxUPiBncmFwaCkgewogIExpc3Q8TGlzdDxUPj4gcmVzdWx0ID0gPExpc3Q8VD4+W107CiAgaW50IGNvdW50ID0gMDsKICBNYXA8VCwgaW50PiBwcmVvcmRlck51bWJlcnMgPSA8VCwgaW50Pnt9OwogIExpc3Q8VD4gdW5hc3NpZ25lZCA9IDxUPltdOwogIExpc3Q8VD4gY2FuZGlkYXRlcyA9IDxUPltdOwogIFNldDxUPiBhc3NpZ25lZCA9IG5ldyBTZXQ8VD4oKTsKCiAgdm9pZCByZWN1cnNpdmVseVNlYXJjaChUIHZlcnRleCkgewogICAgLy8gU3RlcCAxOiBTZXQgdGhlIHByZW9yZGVyIG51bWJlciBvZiBbdmVydGV4XSB0byBbY291bnRdLCBhbmQgaW5jcmVtZW50CiAgICAvLyBbY291bnRdLgogICAgcHJlb3JkZXJOdW1iZXJzW3ZlcnRleF0gPSBjb3VudCsrOwoKICAgIC8vIFN0ZXAgMjogUHVzaCBbdmVydGV4XSBvbnRvIFt1bmFzc2lnbmVkXSBhbmQgYWxzbyBvbnRvIFtjYW5kaWRhdGVzXS4KICAgIHVuYXNzaWduZWQuYWRkKHZlcnRleCk7CiAgICBjYW5kaWRhdGVzLmFkZCh2ZXJ0ZXgpOwoKICAgIC8vIFN0ZXAgMzogRm9yIGVhY2ggZWRnZSBmcm9tIFt2ZXJ0ZXhdIHRvIGEgbmVpZ2hib3JpbmcgdmVydGV4IFtuZWlnaGJvcl06CiAgICBmb3IgKFQgbmVpZ2hib3IgaW4gZ3JhcGgubmVpZ2hib3JzT2YodmVydGV4KSkgewogICAgICBpbnQgbmVpZ2hib3JQcmVvcmRlck51bWJlciA9IHByZW9yZGVyTnVtYmVyc1tuZWlnaGJvcl07CiAgICAgIGlmIChuZWlnaGJvclByZW9yZGVyTnVtYmVyID09IG51bGwpIHsKICAgICAgICAvLyBJZiB0aGUgcHJlb3JkZXIgbnVtYmVyIG9mIFtuZWlnaGJvcl0gaGFzIG5vdCB5ZXQgYmVlbiBhc3NpZ25lZCwKICAgICAgICAvLyByZWN1cnNpdmVseSBzZWFyY2ggW25laWdoYm9yXTsKICAgICAgICByZWN1cnNpdmVseVNlYXJjaChuZWlnaGJvcik7CiAgICAgIH0gZWxzZSBpZiAoIWFzc2lnbmVkLmNvbnRhaW5zKG5laWdoYm9yKSkgewogICAgICAgIC8vIE90aGVyd2lzZSwgaWYgW25laWdoYm9yXSBoYXMgbm90IHlldCBiZWVuIGFzc2lnbmVkIHRvIGEgc3Ryb25nbHkKICAgICAgICAvLyBjb25uZWN0ZWQgY29tcG9uZW50OgogICAgICAgIC8vCiAgICAgICAgLy8gKiBSZXBlYXRlZGx5IHBvcCB2ZXJ0aWNlcyBmcm9tIFtjYW5kaWRhdGVzXSB1bnRpbCB0aGUgdG9wIGVsZW1lbnQgb2YKICAgICAgICAvLyAgIFtjYW5kaWRhdGVzXSBoYXMgYSBwcmVvcmRlciBudW1iZXIgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZQogICAgICAgIC8vICAgcHJlb3JkZXIgbnVtYmVyIG9mIFtuZWlnaGJvcl0uCiAgICAgICAgd2hpbGUgKHByZW9yZGVyTnVtYmVyc1tjYW5kaWRhdGVzLmxhc3RdID4gbmVpZ2hib3JQcmVvcmRlck51bWJlcikgewogICAgICAgICAgY2FuZGlkYXRlcy5yZW1vdmVMYXN0KCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvLyBTdGVwIDQ6IElmIFt2ZXJ0ZXhdIGlzIHRoZSB0b3AgZWxlbWVudCBvZiBbY2FuZGlkYXRlc106CiAgICBpZiAoY2FuZGlkYXRlcy5sYXN0ID09IHZlcnRleCkgewogICAgICAvLyBQb3AgdmVydGljZXMgZnJvbSBbdW5hc3NpZ25lZF0gdW50aWwgW3ZlcnRleF0gaGFzIGJlZW4gcG9wcGVkLCBhbmQKICAgICAgLy8gYXNzaWduIHRoZSBwb3BwZWQgdmVydGljZXMgdG8gYSBuZXcgY29tcG9uZW50LgogICAgICBMaXN0PFQ+IGNvbXBvbmVudCA9IDxUPltdOwogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIFQgdG9wID0gdW5hc3NpZ25lZC5yZW1vdmVMYXN0KCk7CiAgICAgICAgY29tcG9uZW50LmFkZCh0b3ApOwogICAgICAgIGFzc2lnbmVkLmFkZCh0b3ApOwogICAgICAgIGlmICh0b3AgPT0gdmVydGV4KSBicmVhazsKICAgICAgfQogICAgICByZXN1bHQuYWRkKGNvbXBvbmVudCk7CgogICAgICAvLyBQb3AgW3ZlcnRleF0gZnJvbSBbY2FuZGlkYXRlc10uCiAgICAgIGNhbmRpZGF0ZXMucmVtb3ZlTGFzdCgpOwogICAgfQogIH0KCiAgZm9yIChUIHZlcnRleCBpbiBncmFwaC52ZXJ0aWNlcykgewogICAgaWYgKHByZW9yZGVyTnVtYmVyc1t2ZXJ0ZXhdID09IG51bGwpIHsKICAgICAgcmVjdXJzaXZlbHlTZWFyY2godmVydGV4KTsKICAgIH0KICB9CgogIHJldHVybiByZXN1bHQ7Cn0KUQBNTj8BFQEaHAElAgE7BEwPVzsmESweHiIBJU0QJwFLHBwBTzQ+LEsqJTFMIAtQSixMIwoIBj8lTDghFSkcGyIIHQEpHwYEASUrIQYEARECAR5wYWNrYWdlOmtlcm5lbC91dGlsL2dyYXBoLmRhcnQuc2Rrcm9vdDovcGtnL2tlcm5lbC9saWIvc3JjL2JvdW5kc19jaGVja3MuZGFydMAASlUvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBCb3R0b21UeXBlLAogICAgICAgIENsYXNzLAogICAgICAgIERhcnRUeXBlLAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEZ1bmN0aW9uVHlwZSwKICAgICAgICBJbnRlcmZhY2VUeXBlLAogICAgICAgIEludmFsaWRUeXBlLAogICAgICAgIE5hbWVkVHlwZSwKICAgICAgICBUeXBlUGFyYW1ldGVyLAogICAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlLAogICAgICAgIFR5cGVkZWZUeXBlLAogICAgICAgIFZvaWRUeXBlOwoKaW1wb3J0ICcuLi90eXBlX2FsZ2VicmEuZGFydCcgc2hvdyBTdWJzdGl0dXRpb24sIHN1YnN0aXR1dGU7CgppbXBvcnQgJy4uL3R5cGVfZW52aXJvbm1lbnQuZGFydCcgc2hvdyBUeXBlRW52aXJvbm1lbnQ7CgppbXBvcnQgJy4uL3V0aWwvZ3JhcGguZGFydCcgc2hvdyBHcmFwaCwgY29tcHV0ZVN0cm9uZ0NvbXBvbmVudHM7CgppbXBvcnQgJy4uL3Zpc2l0b3IuZGFydCcgc2hvdyBEYXJ0VHlwZVZpc2l0b3I7CgpjbGFzcyBUeXBlVmFyaWFibGVHcmFwaCBleHRlbmRzIEdyYXBoPGludD4gewogIExpc3Q8aW50PiB2ZXJ0aWNlczsKICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzOwogIExpc3Q8RGFydFR5cGU+IGJvdW5kczsKCiAgLy8gYGVkZ2VzW2ldYCBpcyB0aGUgbGlzdCBvZiBpbmRpY2VzIG9mIHR5cGUgdmFyaWFibGVzIHRoYXQgcmVmZXJlbmNlIHRoZSB0eXBlCiAgLy8gdmFyaWFibGUgd2l0aCB0aGUgaW5kZXggYGlgIGluIHRoZWlyIGJvdW5kcy4KICBMaXN0PExpc3Q8aW50Pj4gZWRnZXM7CgogIFR5cGVWYXJpYWJsZUdyYXBoKHRoaXMudHlwZVBhcmFtZXRlcnMsIHRoaXMuYm91bmRzKSB7CiAgICBhc3NlcnQodHlwZVBhcmFtZXRlcnMubGVuZ3RoID09IGJvdW5kcy5sZW5ndGgpOwoKICAgIHZlcnRpY2VzID0gbmV3IExpc3Q8aW50Pih0eXBlUGFyYW1ldGVycy5sZW5ndGgpOwogICAgTWFwPFR5cGVQYXJhbWV0ZXIsIGludD4gdHlwZVBhcmFtZXRlckluZGljZXMgPSA8VHlwZVBhcmFtZXRlciwgaW50Pnt9OwogICAgZWRnZXMgPSBuZXcgTGlzdDxMaXN0PGludD4+KHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlcnRpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZlcnRpY2VzW2ldID0gaTsKICAgICAgdHlwZVBhcmFtZXRlckluZGljZXNbdHlwZVBhcmFtZXRlcnNbaV1dID0gaTsKICAgICAgZWRnZXNbaV0gPSA8aW50PltdOwogICAgfQoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmVydGljZXMubGVuZ3RoOyBpKyspIHsKICAgICAgT2NjdXJyZW5jZUNvbGxlY3RvclZpc2l0b3IgY29sbGVjdG9yID0KICAgICAgICAgIG5ldyBPY2N1cnJlbmNlQ29sbGVjdG9yVmlzaXRvcih0eXBlUGFyYW1ldGVycy50b1NldCgpKTsKICAgICAgY29sbGVjdG9yLnZpc2l0KGJvdW5kc1tpXSk7CiAgICAgIGZvciAoVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyIGluIGNvbGxlY3Rvci5vY2N1cnJlZCkgewogICAgICAgIGVkZ2VzW3R5cGVQYXJhbWV0ZXJJbmRpY2VzW3R5cGVQYXJhbWV0ZXJdXS5hZGQoaSk7CiAgICAgIH0KICAgIH0KICB9CgogIEl0ZXJhYmxlPGludD4gbmVpZ2hib3JzT2YoaW50IGluZGV4KSB7CiAgICByZXR1cm4gZWRnZXNbaW5kZXhdOwogIH0KfQoKY2xhc3MgT2NjdXJyZW5jZUNvbGxlY3RvclZpc2l0b3IgZXh0ZW5kcyBEYXJ0VHlwZVZpc2l0b3IgewogIGZpbmFsIFNldDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyczsKICBTZXQ8VHlwZVBhcmFtZXRlcj4gb2NjdXJyZWQgPSBuZXcgU2V0PFR5cGVQYXJhbWV0ZXI+KCk7CgogIE9jY3VycmVuY2VDb2xsZWN0b3JWaXNpdG9yKHRoaXMudHlwZVBhcmFtZXRlcnMpOwoKICB2aXNpdChEYXJ0VHlwZSBub2RlKSA9PiBub2RlLmFjY2VwdCh0aGlzKTsKCiAgdmlzaXROYW1lZFR5cGUoTmFtZWRUeXBlIG5vZGUpIHsKICAgIG5vZGUudHlwZS5hY2NlcHQodGhpcyk7CiAgfQoKICB2aXNpdEludmFsaWRUeXBlKEludmFsaWRUeXBlIG5vZGUpOwogIHZpc2l0RHluYW1pY1R5cGUoRHluYW1pY1R5cGUgbm9kZSk7CiAgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSBub2RlKTsKCiAgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgbm9kZSkgewogICAgZm9yIChEYXJ0VHlwZSBhcmd1bWVudCBpbiBub2RlLnR5cGVBcmd1bWVudHMpIHsKICAgICAgYXJndW1lbnQuYWNjZXB0KHRoaXMpOwogICAgfQogIH0KCiAgdmlzaXRUeXBlZGVmVHlwZShUeXBlZGVmVHlwZSBub2RlKSB7CiAgICBmb3IgKERhcnRUeXBlIGFyZ3VtZW50IGluIG5vZGUudHlwZUFyZ3VtZW50cykgewogICAgICBhcmd1bWVudC5hY2NlcHQodGhpcyk7CiAgICB9CiAgfQoKICB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSkgewogICAgZm9yIChUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgaW4gbm9kZS50eXBlUGFyYW1ldGVycykgewogICAgICB0eXBlUGFyYW1ldGVyLmJvdW5kLmFjY2VwdCh0aGlzKTsKICAgICAgdHlwZVBhcmFtZXRlci5kZWZhdWx0VHlwZT8uYWNjZXB0KHRoaXMpOwogICAgfQogICAgZm9yIChEYXJ0VHlwZSBwYXJhbWV0ZXIgaW4gbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICBwYXJhbWV0ZXIuYWNjZXB0KHRoaXMpOwogICAgfQogICAgZm9yIChOYW1lZFR5cGUgbmFtZWRQYXJhbWV0ZXIgaW4gbm9kZS5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgbmFtZWRQYXJhbWV0ZXIudHlwZS5hY2NlcHQodGhpcyk7CiAgICB9CiAgICBub2RlLnJldHVyblR5cGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZShUeXBlUGFyYW1ldGVyVHlwZSBub2RlKSB7CiAgICBpZiAodHlwZVBhcmFtZXRlcnMuY29udGFpbnMobm9kZS5wYXJhbWV0ZXIpKSB7CiAgICAgIG9jY3VycmVkLmFkZChub2RlLnBhcmFtZXRlcik7CiAgICB9CiAgfQp9CgpEYXJ0VHlwZSBpbnN0YW50aWF0ZVRvQm91bmRzKERhcnRUeXBlIHR5cGUsIENsYXNzIG9iamVjdCkgewogIGlmICh0eXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgIGZvciAodmFyIHR5cGVBcmd1bWVudCBpbiB0eXBlLnR5cGVBcmd1bWVudHMpIHsKICAgICAgLy8gSWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBhcmd1bWVudHMgaXMgbm90IGR5bmFtaWMsIHdlIGFzc3VtZSB0aGF0IHRoZQogICAgICAvLyB0eXBlIGlzIG5vdCByYXcgYW5kIGRvZXMgbm90IG5lZWQgaW5zdGFudGlhdGlvbiBvZiBpdHMgdHlwZSBwYXJhbWV0ZXJzCiAgICAgIC8vIHRvIHRoZWlyIGJvdW5kcy4KICAgICAgaWYgKHR5cGVBcmd1bWVudCBpcyEgRHluYW1pY1R5cGUpIHsKICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlLmJ5UmVmZXJlbmNlKAogICAgICAgIHR5cGUuY2xhc3NOYW1lLCBjYWxjdWxhdGVCb3VuZHModHlwZS5jbGFzc05vZGUudHlwZVBhcmFtZXRlcnMsIG9iamVjdCkpOwogIH0KICBpZiAodHlwZSBpcyBUeXBlZGVmVHlwZSkgewogICAgZm9yICh2YXIgdHlwZUFyZ3VtZW50IGluIHR5cGUudHlwZUFyZ3VtZW50cykgewogICAgICBpZiAodHlwZUFyZ3VtZW50IGlzISBEeW5hbWljVHlwZSkgewogICAgICAgIHJldHVybiB0eXBlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IFR5cGVkZWZUeXBlLmJ5UmVmZXJlbmNlKHR5cGUudHlwZWRlZlJlZmVyZW5jZSwKICAgICAgICBjYWxjdWxhdGVCb3VuZHModHlwZS50eXBlZGVmTm9kZS50eXBlUGFyYW1ldGVycywgb2JqZWN0KSk7CiAgfQogIHJldHVybiB0eXBlOwp9CgovLy8gQ2FsY3VsYXRlcyBib3VuZHMgdG8gYmUgcHJvdmlkZWQgYXMgdHlwZSBhcmd1bWVudHMgaW4gcGxhY2Ugb2YgbWlzc2luZyB0eXBlCi8vLyBhcmd1bWVudHMgb24gcmF3IHR5cGVzIHdpdGggdGhlIGdpdmVuIHR5cGUgcGFyYW1ldGVycy4KLy8vCi8vLyBTZWUgdGhlIFtkZXNjcmlwdGlvbl0KLy8vIChodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9ibG9iL21hc3Rlci9kb2NzL2xhbmd1YWdlL2luZm9ybWFsL2luc3RhbnRpYXRlLXRvLWJvdW5kLm1kKQovLy8gb2YgdGhlIGFsZ29yaXRobSBmb3IgZGV0YWlscy4KTGlzdDxEYXJ0VHlwZT4gY2FsY3VsYXRlQm91bmRzKAogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycywgQ2xhc3Mgb2JqZWN0KSB7CiAgTGlzdDxEYXJ0VHlwZT4gYm91bmRzID0gbmV3IExpc3Q8RGFydFR5cGU+KHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCk7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgRGFydFR5cGUgYm91bmQgPSB0eXBlUGFyYW1ldGVyc1tpXS5ib3VuZDsKICAgIGlmIChib3VuZCA9PSBudWxsKSB7CiAgICAgIGJvdW5kID0gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIH0gZWxzZSBpZiAoYm91bmQgaXMgSW50ZXJmYWNlVHlwZSAmJiBib3VuZC5jbGFzc05vZGUgPT0gb2JqZWN0KSB7CiAgICAgIERhcnRUeXBlIGRlZmF1bHRUeXBlID0gdHlwZVBhcmFtZXRlcnNbaV0uZGVmYXVsdFR5cGU7CiAgICAgIGlmICghKGRlZmF1bHRUeXBlIGlzIEludGVyZmFjZVR5cGUgJiYgZGVmYXVsdFR5cGUuY2xhc3NOb2RlID09IG9iamVjdCkpIHsKICAgICAgICBib3VuZCA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgIH0KICAgIH0KICAgIGJvdW5kc1tpXSA9IGJvdW5kOwogIH0KCiAgVHlwZVZhcmlhYmxlR3JhcGggZ3JhcGggPSBuZXcgVHlwZVZhcmlhYmxlR3JhcGgodHlwZVBhcmFtZXRlcnMsIGJvdW5kcyk7CiAgTGlzdDxMaXN0PGludD4+IHN0cm9uZ2x5Q29ubmVjdGVkID0gY29tcHV0ZVN0cm9uZ0NvbXBvbmVudHMoZ3JhcGgpOwogIGZvciAoTGlzdDxpbnQ+IGNvbXBvbmVudCBpbiBzdHJvbmdseUNvbm5lY3RlZCkgewogICAgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiB1cHBlckJvdW5kcyA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gbG93ZXJCb3VuZHMgPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICBmb3IgKGludCB0eXBlUGFyYW1ldGVySW5kZXggaW4gY29tcG9uZW50KSB7CiAgICAgIHVwcGVyQm91bmRzW3R5cGVQYXJhbWV0ZXJzW3R5cGVQYXJhbWV0ZXJJbmRleF1dID0gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgICAgbG93ZXJCb3VuZHNbdHlwZVBhcmFtZXRlcnNbdHlwZVBhcmFtZXRlckluZGV4XV0gPSBjb25zdCBCb3R0b21UeXBlKCk7CiAgICB9CiAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uID0KICAgICAgICBTdWJzdGl0dXRpb24uZnJvbVVwcGVyQW5kTG93ZXJCb3VuZHModXBwZXJCb3VuZHMsIGxvd2VyQm91bmRzKTsKICAgIGZvciAoaW50IHR5cGVQYXJhbWV0ZXJJbmRleCBpbiBjb21wb25lbnQpIHsKICAgICAgYm91bmRzW3R5cGVQYXJhbWV0ZXJJbmRleF0gPQogICAgICAgICAgc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGJvdW5kc1t0eXBlUGFyYW1ldGVySW5kZXhdKTsKICAgIH0KICB9CgogIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gdXBwZXJCb3VuZHMgPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IGxvd2VyQm91bmRzID0gPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwogICAgdXBwZXJCb3VuZHNbdHlwZVBhcmFtZXRlcnNbaV1dID0gYm91bmRzW2ldOwogICAgbG93ZXJCb3VuZHNbdHlwZVBhcmFtZXRlcnNbaV1dID0gY29uc3QgQm90dG9tVHlwZSgpOwogICAgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiA9CiAgICAgICAgU3Vic3RpdHV0aW9uLmZyb21VcHBlckFuZExvd2VyQm91bmRzKHVwcGVyQm91bmRzLCBsb3dlckJvdW5kcyk7CiAgICBmb3IgKGludCBqID0gMDsgaiA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaisrKSB7CiAgICAgIGJvdW5kc1tqXSA9IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShib3VuZHNbal0pOwogICAgfQogIH0KCiAgcmV0dXJuIGJvdW5kczsKfQoKY2xhc3MgVHlwZUFyZ3VtZW50SXNzdWUgewogIC8vIFRoZSB0eXBlIGFyZ3VtZW50IHRoYXQgdmlvbGF0ZWQgdGhlIGJvdW5kLgogIGZpbmFsIERhcnRUeXBlIGFyZ3VtZW50OwoKICAvLyBUaGUgdHlwZSBwYXJhbWV0ZXIgd2l0aCB0aGUgYm91bmQgdGhhdCB3YXMgdmlvbGF0ZWQuCiAgZmluYWwgVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyOwoKICAvLyBUaGUgZW5jbG9zaW5nIHR5cGUgb2YgdGhlIGlzc3VlLCB0aGF0IGlzLCB0aGUgb25lIHdpdGggW3R5cGVQYXJhbWV0ZXJdLgogIGZpbmFsIERhcnRUeXBlIGVuY2xvc2luZ1R5cGU7CgogIFR5cGVBcmd1bWVudElzc3VlKHRoaXMuYXJndW1lbnQsIHRoaXMudHlwZVBhcmFtZXRlciwgdGhpcy5lbmNsb3NpbmdUeXBlKTsKfQoKLy8gVE9ETyhkbWl0cnlhcyk6ICBSZW1vdmUgW3R5cGVkZWZJbnN0YW50aWF0aW9uc10gd2hlbiB0eXBlIGFyZ3VtZW50cyBwYXNzZWQgdG8KLy8gdHlwZWRlZnMgYXJlIHByZXNlcnZlZCBpbiB0aGUgS2VybmVsIG91dHB1dC4KTGlzdDxUeXBlQXJndW1lbnRJc3N1ZT4gZmluZFR5cGVBcmd1bWVudElzc3VlcygKICAgIERhcnRUeXBlIHR5cGUsIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQsCiAgICB7Ym9vbCBhbGxvd1N1cGVyQm91bmRlZCA9IGZhbHNlfSkgewogIExpc3Q8VHlwZVBhcmFtZXRlcj4gdmFyaWFibGVzOwogIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50czsKICBMaXN0PFR5cGVBcmd1bWVudElzc3VlPiB0eXBlZGVmUmhzUmVzdWx0OwoKICBpZiAodHlwZSBpcyBGdW5jdGlvblR5cGUgJiYgdHlwZS50eXBlZGVmVHlwZSAhPSBudWxsKSB7CiAgICAvLyBbdHlwZV0gaXMgYSBmdW5jdGlvbiB0eXBlIHRoYXQgaXMgYW4gYXBwbGljYXRpb24gb2YgYSBwYXJhbWV0cml6ZWQKICAgIC8vIHR5cGVkZWYuICBXZSBuZWVkIHRvIGNoZWNrIGJvdGggdGhlIGwuaC5zLiBhbmQgdGhlIHIuaC5zLiBvZiB0aGUKICAgIC8vIGRlZmluaXRpb24gaW4gdGhhdCBjYXNlLiAgRm9yIGRldGFpbHMsIHNlZSBbbGlua10KICAgIC8vIChodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9ibG9iL21hc3Rlci9kb2NzL2xhbmd1YWdlL2luZm9ybWFsL3N1cGVyLWJvdW5kZWQtdHlwZXMubWQpLgogICAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZSA9IHR5cGU7CiAgICBGdW5jdGlvblR5cGUgY2xvbmVkID0gbmV3IEZ1bmN0aW9uVHlwZSgKICAgICAgICBmdW5jdGlvblR5cGUucG9zaXRpb25hbFBhcmFtZXRlcnMsIGZ1bmN0aW9uVHlwZS5yZXR1cm5UeXBlLAogICAgICAgIG5hbWVkUGFyYW1ldGVyczogZnVuY3Rpb25UeXBlLm5hbWVkUGFyYW1ldGVycywKICAgICAgICB0eXBlUGFyYW1ldGVyczogZnVuY3Rpb25UeXBlLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IGZ1bmN0aW9uVHlwZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgIHR5cGVkZWZUeXBlOiBudWxsKTsKICAgIHR5cGVkZWZSaHNSZXN1bHQgPSBmaW5kVHlwZUFyZ3VtZW50SXNzdWVzKGNsb25lZCwgdHlwZUVudmlyb25tZW50LAogICAgICAgIGFsbG93U3VwZXJCb3VuZGVkOiB0cnVlKTsKICAgIHR5cGUgPSBmdW5jdGlvblR5cGUudHlwZWRlZlR5cGU7CiAgfQoKICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICB2YXJpYWJsZXMgPSB0eXBlLmNsYXNzTm9kZS50eXBlUGFyYW1ldGVyczsKICAgIGFyZ3VtZW50cyA9IHR5cGUudHlwZUFyZ3VtZW50czsKICB9IGVsc2UgaWYgKHR5cGUgaXMgVHlwZWRlZlR5cGUpIHsKICAgIHZhcmlhYmxlcyA9IHR5cGUudHlwZWRlZk5vZGUudHlwZVBhcmFtZXRlcnM7CiAgICBhcmd1bWVudHMgPSB0eXBlLnR5cGVBcmd1bWVudHM7CiAgfSBlbHNlIGlmICh0eXBlIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgTGlzdDxUeXBlQXJndW1lbnRJc3N1ZT4gcmVzdWx0ID0gPFR5cGVBcmd1bWVudElzc3VlPltdOwogICAgZm9yIChUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciBpbiB0eXBlLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgIHJlc3VsdC5hZGRBbGwoZmluZFR5cGVBcmd1bWVudElzc3VlcyhwYXJhbWV0ZXIuYm91bmQsIHR5cGVFbnZpcm9ubWVudCwKICAgICAgICAgICAgICBhbGxvd1N1cGVyQm91bmRlZDogdHJ1ZSkgPz8KICAgICAgICAgIGNvbnN0IDxUeXBlQXJndW1lbnRJc3N1ZT5bXSk7CiAgICB9CiAgICBmb3IgKERhcnRUeXBlIGZvcm1hbCBpbiB0eXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgIHJlc3VsdC5hZGRBbGwoZmluZFR5cGVBcmd1bWVudElzc3Vlcyhmb3JtYWwsIHR5cGVFbnZpcm9ubWVudCwKICAgICAgICAgICAgICBhbGxvd1N1cGVyQm91bmRlZDogdHJ1ZSkgPz8KICAgICAgICAgIGNvbnN0IDxUeXBlQXJndW1lbnRJc3N1ZT5bXSk7CiAgICB9CiAgICBmb3IgKE5hbWVkVHlwZSBuYW1lZCBpbiB0eXBlLm5hbWVkUGFyYW1ldGVycykgewogICAgICByZXN1bHQuYWRkQWxsKGZpbmRUeXBlQXJndW1lbnRJc3N1ZXMobmFtZWQudHlwZSwgdHlwZUVudmlyb25tZW50LAogICAgICAgICAgICAgIGFsbG93U3VwZXJCb3VuZGVkOiB0cnVlKSA/PwogICAgICAgICAgY29uc3QgPFR5cGVBcmd1bWVudElzc3VlPltdKTsKICAgIH0KICAgIHJlc3VsdC5hZGRBbGwoZmluZFR5cGVBcmd1bWVudElzc3Vlcyh0eXBlLnJldHVyblR5cGUsIHR5cGVFbnZpcm9ubWVudCwKICAgICAgICAgICAgYWxsb3dTdXBlckJvdW5kZWQ6IHRydWUpID8/CiAgICAgICAgY29uc3QgPFR5cGVBcmd1bWVudElzc3VlPltdKTsKICAgIHJldHVybiByZXN1bHQuaXNFbXB0eSA/IG51bGwgOiByZXN1bHQ7CiAgfSBlbHNlIHsKICAgIHJldHVybiBudWxsOwogIH0KCiAgaWYgKHZhcmlhYmxlcyA9PSBudWxsKSByZXR1cm4gbnVsbDsKCiAgTGlzdDxUeXBlQXJndW1lbnRJc3N1ZT4gcmVzdWx0OwogIExpc3Q8VHlwZUFyZ3VtZW50SXNzdWU+IGFyZ3VtZW50c1Jlc3VsdDsKCiAgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBzdWJzdGl0dXRpb25NYXAgPQogICAgICBuZXcgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPi5mcm9tSXRlcmFibGVzKHZhcmlhYmxlcywgYXJndW1lbnRzKTsKICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7ICsraSkgewogICAgRGFydFR5cGUgYXJndW1lbnQgPSBhcmd1bWVudHNbaV07CiAgICBpZiAoYXJndW1lbnQgaXMgRnVuY3Rpb25UeXBlICYmIGFyZ3VtZW50LnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKICAgICAgLy8gR2VuZXJpYyBmdW5jdGlvbiB0eXBlcyBhcmVuJ3QgYWxsb3dlZCBhcyB0eXBlIGFyZ3VtZW50cyBlaXRoZXIuCiAgICAgIHJlc3VsdCA/Pz0gPFR5cGVBcmd1bWVudElzc3VlPltdOwogICAgICByZXN1bHQuYWRkKG5ldyBUeXBlQXJndW1lbnRJc3N1ZShhcmd1bWVudCwgdmFyaWFibGVzW2ldLCB0eXBlKSk7CiAgICB9IGVsc2UgaWYgKCF0eXBlRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoCiAgICAgICAgYXJndW1lbnQsIHN1YnN0aXR1dGUodmFyaWFibGVzW2ldLmJvdW5kLCBzdWJzdGl0dXRpb25NYXApKSkgewogICAgICByZXN1bHQgPz89IDxUeXBlQXJndW1lbnRJc3N1ZT5bXTsKICAgICAgcmVzdWx0LmFkZChuZXcgVHlwZUFyZ3VtZW50SXNzdWUoYXJndW1lbnQsIHZhcmlhYmxlc1tpXSwgdHlwZSkpOwogICAgfQoKICAgIExpc3Q8VHlwZUFyZ3VtZW50SXNzdWU+IGlzc3VlcyA9IGZpbmRUeXBlQXJndW1lbnRJc3N1ZXMoCiAgICAgICAgYXJndW1lbnQsIHR5cGVFbnZpcm9ubWVudCwKICAgICAgICBhbGxvd1N1cGVyQm91bmRlZDogdHJ1ZSk7CiAgICBpZiAoaXNzdWVzICE9IG51bGwpIHsKICAgICAgYXJndW1lbnRzUmVzdWx0ID8/PSA8VHlwZUFyZ3VtZW50SXNzdWU+W107CiAgICAgIGFyZ3VtZW50c1Jlc3VsdC5hZGRBbGwoaXNzdWVzKTsKICAgIH0KICB9CiAgaWYgKGFyZ3VtZW50c1Jlc3VsdCAhPSBudWxsKSB7CiAgICByZXN1bHQgPz89IDxUeXBlQXJndW1lbnRJc3N1ZT5bXTsKICAgIHJlc3VsdC5hZGRBbGwoYXJndW1lbnRzUmVzdWx0KTsKICB9CiAgaWYgKHR5cGVkZWZSaHNSZXN1bHQgIT0gbnVsbCkgewogICAgcmVzdWx0ID8/PSA8VHlwZUFyZ3VtZW50SXNzdWU+W107CiAgICByZXN1bHQuYWRkQWxsKHR5cGVkZWZSaHNSZXN1bHQpOwogIH0KCiAgLy8gW3R5cGVdIGlzIHJlZ3VsYXItYm91bmRlZC4KICBpZiAocmVzdWx0ID09IG51bGwpIHJldHVybiBudWxsOwogIGlmICghYWxsb3dTdXBlckJvdW5kZWQpIHJldHVybiByZXN1bHQ7CgogIHJlc3VsdCA9IG51bGw7CiAgdHlwZSA9IGNvbnZlcnRTdXBlckJvdW5kZWRUb1JlZ3VsYXJCb3VuZGVkKHR5cGVFbnZpcm9ubWVudCwgdHlwZSk7CiAgTGlzdDxEYXJ0VHlwZT4gYXJndW1lbnRzVG9SZXBvcnQgPSBhcmd1bWVudHMudG9MaXN0KCk7CiAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgdmFyaWFibGVzID0gdHlwZS5jbGFzc05vZGUudHlwZVBhcmFtZXRlcnM7CiAgICBhcmd1bWVudHMgPSB0eXBlLnR5cGVBcmd1bWVudHM7CiAgfSBlbHNlIGlmICh0eXBlIGlzIFR5cGVkZWZUeXBlKSB7CiAgICB2YXJpYWJsZXMgPSB0eXBlLnR5cGVkZWZOb2RlLnR5cGVQYXJhbWV0ZXJzOwogICAgYXJndW1lbnRzID0gdHlwZS50eXBlQXJndW1lbnRzOwogIH0KICBzdWJzdGl0dXRpb25NYXAgPQogICAgICBuZXcgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPi5mcm9tSXRlcmFibGVzKHZhcmlhYmxlcywgYXJndW1lbnRzKTsKICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7ICsraSkgewogICAgRGFydFR5cGUgYXJndW1lbnQgPSBhcmd1bWVudHNbaV07CiAgICBpZiAoYXJndW1lbnQgaXMgRnVuY3Rpb25UeXBlICYmIGFyZ3VtZW50LnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKICAgICAgLy8gR2VuZXJpYyBmdW5jdGlvbiB0eXBlcyBhcmVuJ3QgYWxsb3dlZCBhcyB0eXBlIGFyZ3VtZW50cyBlaXRoZXIuCiAgICAgIHJlc3VsdCA/Pz0gPFR5cGVBcmd1bWVudElzc3VlPltdOwogICAgICByZXN1bHQKICAgICAgICAgIC5hZGQobmV3IFR5cGVBcmd1bWVudElzc3VlKGFyZ3VtZW50c1RvUmVwb3J0W2ldLCB2YXJpYWJsZXNbaV0sIHR5cGUpKTsKICAgIH0gZWxzZSBpZiAoIXR5cGVFbnZpcm9ubWVudC5pc1N1YnR5cGVPZigKICAgICAgICBhcmd1bWVudCwgc3Vic3RpdHV0ZSh2YXJpYWJsZXNbaV0uYm91bmQsIHN1YnN0aXR1dGlvbk1hcCkpKSB7CiAgICAgIHJlc3VsdCA/Pz0gPFR5cGVBcmd1bWVudElzc3VlPltdOwogICAgICByZXN1bHQKICAgICAgICAgIC5hZGQobmV3IFR5cGVBcmd1bWVudElzc3VlKGFyZ3VtZW50c1RvUmVwb3J0W2ldLCB2YXJpYWJsZXNbaV0sIHR5cGUpKTsKICAgIH0KICB9CiAgaWYgKGFyZ3VtZW50c1Jlc3VsdCAhPSBudWxsKSB7CiAgICByZXN1bHQgPz89IDxUeXBlQXJndW1lbnRJc3N1ZT5bXTsKICAgIHJlc3VsdC5hZGRBbGwoYXJndW1lbnRzUmVzdWx0KTsKICB9CiAgaWYgKHR5cGVkZWZSaHNSZXN1bHQgIT0gbnVsbCkgewogICAgcmVzdWx0ID8/PSA8VHlwZUFyZ3VtZW50SXNzdWU+W107CiAgICByZXN1bHQuYWRkQWxsKHR5cGVkZWZSaHNSZXN1bHQpOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CgovLyBUT0RPKGRtaXRyeWFzKTogIFJlbW92ZSBbdHlwZWRlZkluc3RhbnRpYXRpb25zXSB3aGVuIHR5cGUgYXJndW1lbnRzIHBhc3NlZCB0bwovLyB0eXBlZGVmcyBhcmUgcHJlc2VydmVkIGluIHRoZSBLZXJuZWwgb3V0cHV0LgpMaXN0PFR5cGVBcmd1bWVudElzc3VlPiBmaW5kVHlwZUFyZ3VtZW50SXNzdWVzRm9ySW52b2NhdGlvbigKICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gcGFyYW1ldGVycywKICAgIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cywKICAgIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQsCiAgICB7TWFwPEZ1bmN0aW9uVHlwZSwgTGlzdDxEYXJ0VHlwZT4+IHR5cGVkZWZJbnN0YW50aWF0aW9uc30pIHsKICBhc3NlcnQoYXJndW1lbnRzLmxlbmd0aCA9PSBwYXJhbWV0ZXJzLmxlbmd0aCk7CiAgTGlzdDxUeXBlQXJndW1lbnRJc3N1ZT4gcmVzdWx0OwogIHZhciBzdWJzdGl0dXRpb25NYXAgPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKICAgIHN1YnN0aXR1dGlvbk1hcFtwYXJhbWV0ZXJzW2ldXSA9IGFyZ3VtZW50c1tpXTsKICB9CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKICAgIERhcnRUeXBlIGFyZ3VtZW50ID0gYXJndW1lbnRzW2ldOwogICAgaWYgKGFyZ3VtZW50IGlzIFR5cGVQYXJhbWV0ZXJUeXBlICYmIGFyZ3VtZW50LnByb21vdGVkQm91bmQgIT0gbnVsbCkgewogICAgICByZXN1bHQgPz89IDxUeXBlQXJndW1lbnRJc3N1ZT5bXTsKICAgICAgcmVzdWx0LmFkZChuZXcgVHlwZUFyZ3VtZW50SXNzdWUoYXJndW1lbnQsIHBhcmFtZXRlcnNbaV0sIG51bGwpKTsKICAgIH0gZWxzZSBpZiAoYXJndW1lbnQgaXMgRnVuY3Rpb25UeXBlICYmIGFyZ3VtZW50LnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKICAgICAgLy8gR2VuZXJpYyBmdW5jdGlvbiB0eXBlcyBhcmVuJ3QgYWxsb3dlZCBhcyB0eXBlIGFyZ3VtZW50cyBlaXRoZXIuCiAgICAgIHJlc3VsdCA/Pz0gPFR5cGVBcmd1bWVudElzc3VlPltdOwogICAgICByZXN1bHQuYWRkKG5ldyBUeXBlQXJndW1lbnRJc3N1ZShhcmd1bWVudCwgcGFyYW1ldGVyc1tpXSwgbnVsbCkpOwogICAgfSBlbHNlIGlmICghdHlwZUVudmlyb25tZW50LmlzU3VidHlwZU9mKAogICAgICAgIGFyZ3VtZW50LCBzdWJzdGl0dXRlKHBhcmFtZXRlcnNbaV0uYm91bmQsIHN1YnN0aXR1dGlvbk1hcCkpKSB7CiAgICAgIHJlc3VsdCA/Pz0gPFR5cGVBcmd1bWVudElzc3VlPltdOwogICAgICByZXN1bHQuYWRkKG5ldyBUeXBlQXJndW1lbnRJc3N1ZShhcmd1bWVudCwgcGFyYW1ldGVyc1tpXSwgbnVsbCkpOwogICAgfQoKICAgIExpc3Q8VHlwZUFyZ3VtZW50SXNzdWU+IGlzc3VlcyA9IGZpbmRUeXBlQXJndW1lbnRJc3N1ZXMoCiAgICAgICAgYXJndW1lbnQsIHR5cGVFbnZpcm9ubWVudCwKICAgICAgICBhbGxvd1N1cGVyQm91bmRlZDogdHJ1ZSk7CiAgICBpZiAoaXNzdWVzICE9IG51bGwpIHsKICAgICAgcmVzdWx0ID8/PSA8VHlwZUFyZ3VtZW50SXNzdWU+W107CiAgICAgIHJlc3VsdC5hZGRBbGwoaXNzdWVzKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlc3VsdDsKfQoKU3RyaW5nIGdldEdlbmVyaWNUeXBlTmFtZShEYXJ0VHlwZSB0eXBlKSB7CiAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgcmV0dXJuIHR5cGUuY2xhc3NOb2RlLm5hbWU7CiAgfSBlbHNlIGlmICh0eXBlIGlzIFR5cGVkZWZUeXBlKSB7CiAgICByZXR1cm4gdHlwZS50eXBlZGVmTm9kZS5uYW1lOwogIH0KICByZXR1cm4gdHlwZS50b1N0cmluZygpOwp9CgovLy8gUmVwbGFjZXMgYWxsIGNvdmFyaWFudCBvY2N1cnJlbmNlcyBvZiBgZHluYW1pY2AsIGBPYmplY3RgLCBhbmQgYHZvaWRgIHdpdGgKLy8vIFtCb3R0b21UeXBlXSBhbmQgYWxsIGNvbnRyYXZhcmlhbnQgb2NjdXJyZW5jZXMgb2YgYE51bGxgIGFuZCBbQm90dG9tVHlwZV0KLy8vIHdpdGggYE9iamVjdGAuCkRhcnRUeXBlIGNvbnZlcnRTdXBlckJvdW5kZWRUb1JlZ3VsYXJCb3VuZGVkKAogICAgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwgRGFydFR5cGUgdHlwZSwKICAgIHtib29sIGlzQ292YXJpYW50ID0gdHJ1ZX0pIHsKICBpZiAoKHR5cGUgaXMgRHluYW1pY1R5cGUgfHwKICAgICAgICAgIHR5cGUgaXMgVm9pZFR5cGUgfHwKICAgICAgICAgIGlzT2JqZWN0KHR5cGVFbnZpcm9ubWVudCwgdHlwZSkpICYmCiAgICAgIGlzQ292YXJpYW50KSB7CiAgICByZXR1cm4gY29uc3QgQm90dG9tVHlwZSgpOwogIH0gZWxzZSBpZiAoKHR5cGUgaXMgQm90dG9tVHlwZSB8fCBpc051bGwodHlwZUVudmlyb25tZW50LCB0eXBlKSkgJiYKICAgICAgIWlzQ292YXJpYW50KSB7CiAgICByZXR1cm4gdHlwZUVudmlyb25tZW50Lm9iamVjdFR5cGU7CiAgfSBlbHNlIGlmICh0eXBlIGlzIEludGVyZmFjZVR5cGUgJiYgdHlwZS5jbGFzc05vZGUudHlwZVBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgTGlzdDxEYXJ0VHlwZT4gcmVwbGFjZWRUeXBlQXJndW1lbnRzID0KICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4odHlwZS50eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcGxhY2VkVHlwZUFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICByZXBsYWNlZFR5cGVBcmd1bWVudHNbaV0gPSBjb252ZXJ0U3VwZXJCb3VuZGVkVG9SZWd1bGFyQm91bmRlZCgKICAgICAgICAgIHR5cGVFbnZpcm9ubWVudCwgdHlwZS50eXBlQXJndW1lbnRzW2ldLAogICAgICAgICAgaXNDb3ZhcmlhbnQ6IGlzQ292YXJpYW50KTsKICAgIH0KICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZSh0eXBlLmNsYXNzTm9kZSwgcmVwbGFjZWRUeXBlQXJndW1lbnRzKTsKICB9IGVsc2UgaWYgKHR5cGUgaXMgVHlwZWRlZlR5cGUgJiYgdHlwZS50eXBlZGVmTm9kZS50eXBlUGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICBMaXN0PERhcnRUeXBlPiByZXBsYWNlZFR5cGVBcmd1bWVudHMgPQogICAgICAgIG5ldyBMaXN0PERhcnRUeXBlPih0eXBlLnR5cGVBcmd1bWVudHMubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwbGFjZWRUeXBlQXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlcGxhY2VkVHlwZUFyZ3VtZW50c1tpXSA9IGNvbnZlcnRTdXBlckJvdW5kZWRUb1JlZ3VsYXJCb3VuZGVkKAogICAgICAgICAgdHlwZUVudmlyb25tZW50LCB0eXBlLnR5cGVBcmd1bWVudHNbaV0sCiAgICAgICAgICBpc0NvdmFyaWFudDogaXNDb3ZhcmlhbnQpOwogICAgfQogICAgcmV0dXJuIG5ldyBUeXBlZGVmVHlwZSh0eXBlLnR5cGVkZWZOb2RlLCByZXBsYWNlZFR5cGVBcmd1bWVudHMpOwogIH0gZWxzZSBpZiAodHlwZSBpcyBGdW5jdGlvblR5cGUpIHsKICAgIHZhciByZXBsYWNlZFJldHVyblR5cGUgPSBjb252ZXJ0U3VwZXJCb3VuZGVkVG9SZWd1bGFyQm91bmRlZCgKICAgICAgICB0eXBlRW52aXJvbm1lbnQsIHR5cGUucmV0dXJuVHlwZSwKICAgICAgICBpc0NvdmFyaWFudDogaXNDb3ZhcmlhbnQpOwogICAgdmFyIHJlcGxhY2VkUG9zaXRpb25hbFBhcmFtZXRlcnMgPQogICAgICAgIG5ldyBMaXN0PERhcnRUeXBlPih0eXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcGxhY2VkUG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgcmVwbGFjZWRQb3NpdGlvbmFsUGFyYW1ldGVyc1tpXSA9IGNvbnZlcnRTdXBlckJvdW5kZWRUb1JlZ3VsYXJCb3VuZGVkKAogICAgICAgICAgdHlwZUVudmlyb25tZW50LCB0eXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldLAogICAgICAgICAgaXNDb3ZhcmlhbnQ6ICFpc0NvdmFyaWFudCk7CiAgICB9CiAgICB2YXIgcmVwbGFjZWROYW1lZFBhcmFtZXRlcnMgPQogICAgICAgIG5ldyBMaXN0PE5hbWVkVHlwZT4odHlwZS5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwbGFjZWROYW1lZFBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgcmVwbGFjZWROYW1lZFBhcmFtZXRlcnNbaV0gPSBuZXcgTmFtZWRUeXBlKAogICAgICAgICAgdHlwZS5uYW1lZFBhcmFtZXRlcnNbaV0ubmFtZSwKICAgICAgICAgIGNvbnZlcnRTdXBlckJvdW5kZWRUb1JlZ3VsYXJCb3VuZGVkKAogICAgICAgICAgICAgIHR5cGVFbnZpcm9ubWVudCwgdHlwZS5uYW1lZFBhcmFtZXRlcnNbaV0udHlwZSwKICAgICAgICAgICAgICBpc0NvdmFyaWFudDogIWlzQ292YXJpYW50KSk7CiAgICB9CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uVHlwZShyZXBsYWNlZFBvc2l0aW9uYWxQYXJhbWV0ZXJzLCByZXBsYWNlZFJldHVyblR5cGUsCiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzOiByZXBsYWNlZE5hbWVkUGFyYW1ldGVycywKICAgICAgICB0eXBlUGFyYW1ldGVyczogdHlwZS50eXBlUGFyYW1ldGVycywKICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiB0eXBlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgdHlwZWRlZlR5cGU6IHR5cGUudHlwZWRlZlR5cGUpOwogIH0KICByZXR1cm4gdHlwZTsKfQoKYm9vbCBpc09iamVjdChUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LCBEYXJ0VHlwZSB0eXBlKSB7CiAgcmV0dXJuIHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICB0eXBlLmNsYXNzTm9kZSA9PSB0eXBlRW52aXJvbm1lbnQub2JqZWN0VHlwZS5jbGFzc05vZGU7Cn0KCmJvb2wgaXNOdWxsKFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQsIERhcnRUeXBlIHR5cGUpIHsKICByZXR1cm4gdHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgIHR5cGUuY2xhc3NOb2RlID09IHR5cGVFbnZpcm9ubWVudC5udWxsVHlwZS5jbGFzc05vZGU7Cn0KCi8vIFZhbHVlIHNldCBmb3IgdmFyaWFuY2Ugb2YgYSB0eXBlIHBhcmFtZXRlciBYIGluIGEgdHlwZSB0ZXJtIFQuCmNsYXNzIFZhcmlhbmNlIHsKICAvLyBVc2VkIHdoZW4gWCBkb2VzIG5vdCBvY2N1ciBmcmVlIGluIFQuCiAgc3RhdGljIGNvbnN0IGludCB1bnJlbGF0ZWQgPSAwOwoKICAvLyBVc2VkIHdoZW4gWCBvY2N1cnMgZnJlZSBpbiBULCBhbmQgVSA8OiBWIGltcGxpZXMgW1UvWF1UIDw6IFtWL1hdVC4KICBzdGF0aWMgY29uc3QgaW50IGNvdmFyaWFudCA9IDE7CgogIC8vIFVzZWQgd2hlbiBYIG9jY3VycyBmcmVlIGluIFQsIGFuZCBVIDw6IFYgaW1wbGllcyBbVi9YXVQgPDogW1UvWF1ULgogIHN0YXRpYyBjb25zdCBpbnQgY29udHJhdmFyaWFudCA9IDI7CgogIC8vIFVzZWQgd2hlbiB0aGVyZSBleGlzdHMgYSBwYWlyIFUgYW5kIFYgc3VjaCB0aGF0IFUgPDogViwgYnV0IFtVL1hdVCBhbmQKICAvLyBbVi9YXVQgYXJlIGluY29tcGFyYWJsZS4KICBzdGF0aWMgY29uc3QgaW50IGludmFyaWFudCA9IDM7CgogIC8vIFZhcmlhbmNlIHZhbHVlcyBmb3JtIGEgbGF0dGljZSB3aGVyZSBbdW5yZWxhdGVkXSBpcyB0aGUgdG9wLCBbaW52YXJpYW50XQogIC8vIGlzIHRoZSBib3R0b20sIGFuZCBbY292YXJpYW50XSBhbmQgW2NvbnRyYXZhcmlhbnRdIGFyZSBpbmNvbXBhcmFibGUuCiAgLy8gW21lZXRdIGNhbGN1bGF0ZXMgdGhlIG1lZXQgb2YgdHdvIGVsZW1lbnRzIG9mIHN1Y2ggbGF0dGljZS4gIEl0IGNhbiBiZQogIC8vIHVzZWQsIGZvciBleGFtcGxlLCB0byBjYWxjdWxhdGUgdGhlIHZhcmlhbmNlIG9mIGEgdHlwZWRlZiB0eXBlIHBhcmFtZXRlcgogIC8vIGlmIGl0J3MgZW5jb3VudGVyZWQgb24gdGhlIHIuaC5zLiBvZiB0aGUgdHlwZWRlZiBtdWx0aXBsZSB0aW1lcy4KICBzdGF0aWMgaW50IG1lZXQoaW50IGEsIGludCBiKSA9PiBhIHwgYjsKCiAgLy8gQ29tYmluZXMgdmFyaWFuY2VzIG9mIFggaW4gVCBhbmQgWSBpbiBTIGludG8gdmFyaWFuY2Ugb2YgWCBpbiBbWS9UXVMuCiAgLy8KICAvLyBDb25zaWRlciB0aGUgZm9sbG93aW5nIGV4YW1wbGVzOgogIC8vCiAgLy8gKiB2YXJpYW5jZSBvZiBYIGluIEZ1bmN0aW9uKFgpIGlzIFtjb250cmF2YXJpYW50XSwgdmFyaWFuY2Ugb2YgWSBpbiBMaXN0PFk+CiAgLy8gaXMgW2NvdmFyaWFudF0sIHNvIHZhcmlhbmNlIG9mIFggaW4gTGlzdDxGdW5jdGlvbihYKT4gaXMgW2NvbnRyYXZhcmlhbnRdOwogIC8vCiAgLy8gKiB2YXJpYW5jZSBvZiBYIGluIExpc3Q8WD4gaXMgW2NvdmFyaWFudF0sIHZhcmlhbmNlIG9mIFkgaW4gRnVuY3Rpb24oWSkgaXMKICAvLyBbY29udHJhdmFyaWFudF0sIHNvIHZhcmlhbmNlIG9mIFggaW4gRnVuY3Rpb24oTGlzdDxYPikgaXMgW2NvbnRyYXZhcmlhbnRdOwogIC8vCiAgLy8gKiB2YXJpYW5jZSBvZiBYIGluIEZ1bmN0aW9uKFgpIGlzIFtjb250cmF2YXJpYW50XSwgdmFyaWFuY2Ugb2YgWSBpbgogIC8vIEZ1bmN0aW9uKFkpIGlzIFtjb250cmF2YXJpYW50XSwgc28gdmFyaWFuY2Ugb2YgWCBpbiBGdW5jdGlvbihGdW5jdGlvbihYKSkKICAvLyBpcyBbY292YXJpYW50XTsKICAvLwogIC8vICogbGV0IHRoZSBmb2xsb3dpbmcgYmUgZGVjbGFyZWQ6CiAgLy8KICAvLyAgICAgdHlwZWRlZiBGPFo+ID0gRnVuY3Rpb24oKTsKICAvLwogIC8vIHRoZW4gdmFyaWFuY2Ugb2YgWCBpbiBGPFg+IGlzIFt1bnJlbGF0ZWRdLCB2YXJpYW5jZSBvZiBZIGluIExpc3Q8WT4gaXMKICAvLyBbY292YXJpYW50XSwgc28gdmFyaWFuY2Ugb2YgWCBpbiBMaXN0PEY8WD4+IGlzIFt1bnJlbGF0ZWRdOwogIC8vCiAgLy8gKiBsZXQgdGhlIGZvbGxvd2luZyBiZSBkZWNsYXJlZDoKICAvLwogIC8vICAgICB0eXBlZGVmIEc8Wj4gPSBaIEZ1bmN0aW9uKFopOwogIC8vCiAgLy8gdGhlbiB2YXJpYW5jZSBvZiBYIGluIExpc3Q8WD4gaXMgW2NvdmFyaWFudF0sIHZhcmlhbmNlIG9mIFkgaW4gRzxZPiBpcwogIC8vIFtpbnZhcmlhbnRdLCBzbyB2YXJpYW5jZSBvZiBgWGAgaW4gYEc8TGlzdDxYPj5gIGlzIFtpbnZhcmlhbnRdLgogIHN0YXRpYyBpbnQgY29tYmluZShpbnQgYSwgaW50IGIpIHsKICAgIGlmIChhID09IHVucmVsYXRlZCB8fCBiID09IHVucmVsYXRlZCkgcmV0dXJuIHVucmVsYXRlZDsKICAgIGlmIChhID09IGludmFyaWFudCB8fCBiID09IGludmFyaWFudCkgcmV0dXJuIGludmFyaWFudDsKICAgIHJldHVybiBhID09IGIgPyBjb3ZhcmlhbnQgOiBjb250cmF2YXJpYW50OwogIH0KfQqCAgBOTjwBFQkUDxIVFhcVExcbFRIBPQE4AUEBLwEtFiYZAVEyGQE4NAE1SzgwFzMaBgEwLUIiQDsIBgQBKRkEAgE7KzoBMwEtASMcBAEmJiABKzQdBgQBJzQdBgQBKT8oLwY8HgY9KAYiBAEzMyQGBAIBPB8zTVAaKhUIBipRBB0zKhUIBj5DBA8CAVA7BBpiIiA4RTQuGSNGPFAlCAYXBAFLRjNMTDBNTAYgSDAjQwYEATRMTDA5IEg2OgYEARECARowGwE6JQFNIAFMAgFRMDA0KCEcLAE6Skg5ZSYsRDc1RRxHIiUEAR8vJCQxJCU8O00qKAY5RCooBjRIKigGSygmKwsRBAEmASIrATFMLyZKSShHLUYoRwYBPSMiGjEmBgQhJiQEIiYlBAEgIykBEUU5Hy8kJDEkBBRMLyZKSSgNUS1GKA1RBgQhJiQEIiYlBBECAVEwPSQeJUExIjUvMwQvJksoSFFJKEgtRyhIBgE9IyIaKB0GBBECASsfICQiBBoCAU9OEy40IR4eLhUfRhYnTys3PUYyJQZFTys3PUYyJQZFJUIqIyc+RE05JgYiOj8yKC89KwZOMi09KAQPAgFAIj4CAT4iPAIBQhErIgFIIgFIJgFMHiIBTkpMTkYqAUsFJgVRTwVQUAVJTxUFJgUkBUxBBSYFJwVMRSU8PC8EAgElcGFja2FnZTprZXJuZWwvc3JjL2JvdW5kc19jaGVja3MuZGFydEBzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL3R5cGVfYWxnb3JpdGhtcy5kYXJ0wAB7Oy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UubWQgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQm90dG9tVHlwZSwKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEYXJ0VHlwZVZpc2l0b3IsCiAgICAgICAgRHluYW1pY1R5cGUsCiAgICAgICAgRnVuY3Rpb25UeXBlLAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgSW52YWxpZFR5cGUsCiAgICAgICAgTmFtZWRUeXBlLAogICAgICAgIFR5cGVQYXJhbWV0ZXIsCiAgICAgICAgVHlwZVBhcmFtZXRlclR5cGUsCiAgICAgICAgVHlwZWRlZlR5cGUsCiAgICAgICAgVm9pZFR5cGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JyBzaG93IGNvbnRhaW5zVHlwZVZhcmlhYmxlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC91dGlsL2dyYXBoLmRhcnQnIHNob3cgR3JhcGgsIGNvbXB1dGVTdHJvbmdDb21wb25lbnRzOwoKaW1wb3J0ICdrZXJuZWxfYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIENsYXNzQnVpbGRlciwKICAgICAgICBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyLAogICAgICAgIFR5cGVBbGlhc0J1aWxkZXIsCiAgICAgICAgRnVuY3Rpb25UeXBlQnVpbGRlciwKICAgICAgICBLZXJuZWxDbGFzc0J1aWxkZXIsCiAgICAgICAgS2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlciwKICAgICAgICBLZXJuZWxGdW5jdGlvblR5cGVCdWlsZGVyLAogICAgICAgIEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIsCiAgICAgICAgS2VybmVsVHlwZUJ1aWxkZXIsCiAgICAgICAgS2VybmVsVHlwZVZhcmlhYmxlQnVpbGRlciwKICAgICAgICBOYW1lZFR5cGVCdWlsZGVyLAogICAgICAgIFR5cGVCdWlsZGVyLAogICAgICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIsCiAgICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlcjsKCmltcG9ydCAnLi4vZGlsbC9kaWxsX2NsYXNzX2J1aWxkZXIuZGFydCcgc2hvdyBEaWxsQ2xhc3NCdWlsZGVyOwoKaW1wb3J0ICcuLi9kaWxsL2RpbGxfdHlwZV9hbGlhc19idWlsZGVyLmRhcnQnIHNob3cgRGlsbFR5cGVBbGlhc0J1aWxkZXI7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnCiAgICBzaG93CiAgICAgICAgTG9jYXRlZE1lc3NhZ2UsCiAgICAgICAgdGVtcGxhdGVCb3VuZElzc3VlVmlhQ3ljbGVOb25TaW1wbGljaXR5LAogICAgICAgIHRlbXBsYXRlQm91bmRJc3N1ZVZpYUxvb3BOb25TaW1wbGljaXR5LAogICAgICAgIHRlbXBsYXRlQm91bmRJc3N1ZVZpYVJhd1R5cGVXaXRoTm9uU2ltcGxlQm91bmRzLAogICAgICAgIHRlbXBsYXRlTm9uU2ltcGxlQm91bmRWaWFSZWZlcmVuY2UsCiAgICAgICAgdGVtcGxhdGVOb25TaW1wbGVCb3VuZFZpYVZhcmlhYmxlOwoKS2VybmVsVHlwZUJ1aWxkZXIgc3Vic3RpdHV0ZVJhbmdlKAogICAgS2VybmVsVHlwZUJ1aWxkZXIgdHlwZSwKICAgIE1hcDxUeXBlVmFyaWFibGVCdWlsZGVyLCBLZXJuZWxUeXBlQnVpbGRlcj4gdXBwZXJTdWJzdGl0dXRpb24sCiAgICBNYXA8VHlwZVZhcmlhYmxlQnVpbGRlciwgS2VybmVsVHlwZUJ1aWxkZXI+IGxvd2VyU3Vic3RpdHV0aW9uLAogICAge2Jvb2wgaXNDb3ZhcmlhbnQgPSB0cnVlfSkgewogIGlmICh0eXBlIGlzIEtlcm5lbE5hbWVkVHlwZUJ1aWxkZXIpIHsKICAgIGlmICh0eXBlLmRlY2xhcmF0aW9uIGlzIEtlcm5lbFR5cGVWYXJpYWJsZUJ1aWxkZXIpIHsKICAgICAgaWYgKGlzQ292YXJpYW50KSB7CiAgICAgICAgcmV0dXJuIHVwcGVyU3Vic3RpdHV0aW9uW3R5cGUuZGVjbGFyYXRpb25dID8/IHR5cGU7CiAgICAgIH0KICAgICAgcmV0dXJuIGxvd2VyU3Vic3RpdHV0aW9uW3R5cGUuZGVjbGFyYXRpb25dID8/IHR5cGU7CiAgICB9CiAgICBpZiAodHlwZS5hcmd1bWVudHMgPT0gbnVsbCB8fCB0eXBlLmFyZ3VtZW50cy5sZW5ndGggPT0gMCkgewogICAgICByZXR1cm4gdHlwZTsKICAgIH0KICAgIExpc3Q8VHlwZUJ1aWxkZXI+IGFyZ3VtZW50czsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZS5hcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgVHlwZUJ1aWxkZXIgc3Vic3RpdHV0ZWRBcmd1bWVudCA9IHN1YnN0aXR1dGVSYW5nZSgKICAgICAgICAgIHR5cGUuYXJndW1lbnRzW2ldLCB1cHBlclN1YnN0aXR1dGlvbiwgbG93ZXJTdWJzdGl0dXRpb24sCiAgICAgICAgICBpc0NvdmFyaWFudDogaXNDb3ZhcmlhbnQpOwogICAgICBpZiAoc3Vic3RpdHV0ZWRBcmd1bWVudCAhPSB0eXBlLmFyZ3VtZW50c1tpXSkgewogICAgICAgIGFyZ3VtZW50cyA/Pz0gdHlwZS5hcmd1bWVudHMudG9MaXN0KCk7CiAgICAgICAgYXJndW1lbnRzW2ldID0gc3Vic3RpdHV0ZWRBcmd1bWVudDsKICAgICAgfQogICAgfQogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIHJldHVybiBuZXcgS2VybmVsTmFtZWRUeXBlQnVpbGRlcih0eXBlLm5hbWUsIGFyZ3VtZW50cykKICAgICAgICAuLmJpbmQodHlwZS5kZWNsYXJhdGlvbik7CiAgICB9CiAgICByZXR1cm4gdHlwZTsKICB9CgogIGlmICh0eXBlIGlzIEtlcm5lbEZ1bmN0aW9uVHlwZUJ1aWxkZXIpIHsKICAgIExpc3Q8S2VybmVsVHlwZVZhcmlhYmxlQnVpbGRlcj4gdmFyaWFibGVzOwogICAgaWYgKHR5cGUudHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgIHZhcmlhYmxlcyA9CiAgICAgICAgICBuZXcgTGlzdDxLZXJuZWxUeXBlVmFyaWFibGVCdWlsZGVyPih0eXBlLnR5cGVWYXJpYWJsZXMubGVuZ3RoKTsKICAgIH0KICAgIExpc3Q8S2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFsczsKICAgIGlmICh0eXBlLmZvcm1hbHMgIT0gbnVsbCkgewogICAgICBmb3JtYWxzID0gbmV3IExpc3Q8S2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4odHlwZS5mb3JtYWxzLmxlbmd0aCk7CiAgICB9CiAgICBLZXJuZWxUeXBlQnVpbGRlciByZXR1cm5UeXBlOwogICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CgogICAgaWYgKHR5cGUudHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgS2VybmVsVHlwZVZhcmlhYmxlQnVpbGRlciB2YXJpYWJsZSA9IHR5cGUudHlwZVZhcmlhYmxlc1tpXTsKICAgICAgICBLZXJuZWxUeXBlQnVpbGRlciBib3VuZCA9IHN1YnN0aXR1dGVSYW5nZSgKICAgICAgICAgICAgdmFyaWFibGUuYm91bmQsIHVwcGVyU3Vic3RpdHV0aW9uLCBsb3dlclN1YnN0aXR1dGlvbiwKICAgICAgICAgICAgaXNDb3ZhcmlhbnQ6IGlzQ292YXJpYW50KTsKICAgICAgICBpZiAoYm91bmQgIT0gdmFyaWFibGUuYm91bmQpIHsKICAgICAgICAgIHZhcmlhYmxlc1tpXSA9IG5ldyBLZXJuZWxUeXBlVmFyaWFibGVCdWlsZGVyKAogICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWUsIHZhcmlhYmxlLnBhcmVudCwgdmFyaWFibGUuY2hhck9mZnNldCwgYm91bmQpOwogICAgICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhcmlhYmxlc1tpXSA9IHZhcmlhYmxlOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmICh0eXBlLmZvcm1hbHMgIT0gbnVsbCkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZvcm1hbHMubGVuZ3RoOyBpKyspIHsKICAgICAgICBLZXJuZWxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGZvcm1hbCA9IHR5cGUuZm9ybWFsc1tpXTsKICAgICAgICBLZXJuZWxUeXBlQnVpbGRlciBwYXJhbWV0ZXJUeXBlID0gc3Vic3RpdHV0ZVJhbmdlKAogICAgICAgICAgICBmb3JtYWwudHlwZSwgdXBwZXJTdWJzdGl0dXRpb24sIGxvd2VyU3Vic3RpdHV0aW9uLAogICAgICAgICAgICBpc0NvdmFyaWFudDogIWlzQ292YXJpYW50KTsKICAgICAgICBpZiAocGFyYW1ldGVyVHlwZSAhPSBmb3JtYWwudHlwZSkgewogICAgICAgICAgZm9ybWFsc1tpXSA9IG5ldyBLZXJuZWxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyKAogICAgICAgICAgICAgIGZvcm1hbC5tZXRhZGF0YSwKICAgICAgICAgICAgICBmb3JtYWwubW9kaWZpZXJzLAogICAgICAgICAgICAgIHBhcmFtZXRlclR5cGUsCiAgICAgICAgICAgICAgZm9ybWFsLm5hbWUsCiAgICAgICAgICAgICAgZm9ybWFsLnBhcmVudCwKICAgICAgICAgICAgICBmb3JtYWwuY2hhck9mZnNldCk7CiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZm9ybWFsc1tpXSA9IGZvcm1hbDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm5UeXBlID0gc3Vic3RpdHV0ZVJhbmdlKAogICAgICAgIHR5cGUucmV0dXJuVHlwZSwgdXBwZXJTdWJzdGl0dXRpb24sIGxvd2VyU3Vic3RpdHV0aW9uLAogICAgICAgIGlzQ292YXJpYW50OiB0cnVlKTsKICAgIGlmIChyZXR1cm5UeXBlICE9IHR5cGUucmV0dXJuVHlwZSkgewogICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgIH0KCiAgICBpZiAoY2hhbmdlZCkgewogICAgICByZXR1cm4gbmV3IEtlcm5lbEZ1bmN0aW9uVHlwZUJ1aWxkZXIocmV0dXJuVHlwZSwgdmFyaWFibGVzLCBmb3JtYWxzKTsKICAgIH0KCiAgICByZXR1cm4gdHlwZTsKICB9CiAgcmV0dXJuIHR5cGU7Cn0KCktlcm5lbFR5cGVCdWlsZGVyIHN1YnN0aXR1dGUoS2VybmVsVHlwZUJ1aWxkZXIgdHlwZSwKICAgIE1hcDxUeXBlVmFyaWFibGVCdWlsZGVyLCBLZXJuZWxUeXBlQnVpbGRlcj4gc3Vic3RpdHV0aW9uKSB7CiAgcmV0dXJuIHN1YnN0aXR1dGVSYW5nZSh0eXBlLCBzdWJzdGl0dXRpb24sIHN1YnN0aXR1dGlvbiwgaXNDb3ZhcmlhbnQ6IHRydWUpOwp9CgovLy8gQ2FsY3VsYXRlcyBib3VuZHMgdG8gYmUgcHJvdmlkZWQgYXMgdHlwZSBhcmd1bWVudHMgaW4gcGxhY2Ugb2YgbWlzc2luZyB0eXBlCi8vLyBhcmd1bWVudHMgb24gcmF3IHR5cGVzIHdpdGggdGhlIGdpdmVuIHR5cGUgcGFyYW1ldGVycy4KLy8vCi8vLyBTZWUgdGhlIFtkZXNjcmlwdGlvbl0KLy8vIChodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9ibG9iL21hc3Rlci9kb2NzL2xhbmd1YWdlL2luZm9ybWFsL2luc3RhbnRpYXRlLXRvLWJvdW5kLm1kKQovLy8gb2YgdGhlIGFsZ29yaXRobSBmb3IgZGV0YWlscy4KTGlzdDxLZXJuZWxUeXBlQnVpbGRlcj4gY2FsY3VsYXRlQm91bmRzKAogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB2YXJpYWJsZXMsCiAgICBLZXJuZWxUeXBlQnVpbGRlciBkeW5hbWljVHlwZSwKICAgIEtlcm5lbFR5cGVCdWlsZGVyIGJvdHRvbVR5cGUsCiAgICBLZXJuZWxDbGFzc0J1aWxkZXIgb2JqZWN0Q2xhc3MpIHsKICBMaXN0PEtlcm5lbFR5cGVCdWlsZGVyPiBib3VuZHMgPQogICAgICBuZXcgTGlzdDxLZXJuZWxUeXBlQnVpbGRlcj4odmFyaWFibGVzLmxlbmd0aCk7CgogIGZvciAoaW50IGkgPSAwOyBpIDwgdmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7CiAgICBib3VuZHNbaV0gPSB2YXJpYWJsZXNbaV0uYm91bmQgPz8gZHluYW1pY1R5cGU7CiAgfQoKICBUeXBlVmFyaWFibGVzR3JhcGggZ3JhcGggPSBuZXcgVHlwZVZhcmlhYmxlc0dyYXBoKHZhcmlhYmxlcywgYm91bmRzKTsKICBMaXN0PExpc3Q8aW50Pj4gc3Ryb25nbHlDb25uZWN0ZWQgPSBjb21wdXRlU3Ryb25nQ29tcG9uZW50cyhncmFwaCk7CiAgZm9yIChMaXN0PGludD4gY29tcG9uZW50IGluIHN0cm9uZ2x5Q29ubmVjdGVkKSB7CiAgICBNYXA8VHlwZVZhcmlhYmxlQnVpbGRlciwgS2VybmVsVHlwZUJ1aWxkZXI+IGR5bmFtaWNTdWJzdGl0dXRpb24gPQogICAgICAgIDxUeXBlVmFyaWFibGVCdWlsZGVyLCBLZXJuZWxUeXBlQnVpbGRlcj57fTsKICAgIE1hcDxUeXBlVmFyaWFibGVCdWlsZGVyLCBLZXJuZWxUeXBlQnVpbGRlcj4gbnVsbFN1YnN0aXR1dGlvbiA9CiAgICAgICAgPFR5cGVWYXJpYWJsZUJ1aWxkZXIsIEtlcm5lbFR5cGVCdWlsZGVyPnt9OwogICAgZm9yIChpbnQgdmFyaWFibGVJbmRleCBpbiBjb21wb25lbnQpIHsKICAgICAgZHluYW1pY1N1YnN0aXR1dGlvblt2YXJpYWJsZXNbdmFyaWFibGVJbmRleF1dID0gZHluYW1pY1R5cGU7CiAgICAgIG51bGxTdWJzdGl0dXRpb25bdmFyaWFibGVzW3ZhcmlhYmxlSW5kZXhdXSA9IGJvdHRvbVR5cGU7CiAgICB9CiAgICBmb3IgKGludCB2YXJpYWJsZUluZGV4IGluIGNvbXBvbmVudCkgewogICAgICBib3VuZHNbdmFyaWFibGVJbmRleF0gPSBzdWJzdGl0dXRlUmFuZ2UoCiAgICAgICAgICBib3VuZHNbdmFyaWFibGVJbmRleF0sIGR5bmFtaWNTdWJzdGl0dXRpb24sIG51bGxTdWJzdGl0dXRpb24sCiAgICAgICAgICBpc0NvdmFyaWFudDogdHJ1ZSk7CiAgICB9CiAgfQoKICBmb3IgKGludCBpID0gMDsgaSA8IHZhcmlhYmxlcy5sZW5ndGg7IGkrKykgewogICAgTWFwPFR5cGVWYXJpYWJsZUJ1aWxkZXIsIEtlcm5lbFR5cGVCdWlsZGVyPiBzdWJzdGl0dXRpb24gPQogICAgICAgIDxUeXBlVmFyaWFibGVCdWlsZGVyLCBLZXJuZWxUeXBlQnVpbGRlcj57fTsKICAgIE1hcDxUeXBlVmFyaWFibGVCdWlsZGVyLCBLZXJuZWxUeXBlQnVpbGRlcj4gbnVsbFN1YnN0aXR1dGlvbiA9CiAgICAgICAgPFR5cGVWYXJpYWJsZUJ1aWxkZXIsIEtlcm5lbFR5cGVCdWlsZGVyPnt9OwogICAgc3Vic3RpdHV0aW9uW3ZhcmlhYmxlc1tpXV0gPSBib3VuZHNbaV07CiAgICBudWxsU3Vic3RpdHV0aW9uW3ZhcmlhYmxlc1tpXV0gPSBib3R0b21UeXBlOwogICAgZm9yIChpbnQgaiA9IDA7IGogPCB2YXJpYWJsZXMubGVuZ3RoOyBqKyspIHsKICAgICAgYm91bmRzW2pdID0gc3Vic3RpdHV0ZVJhbmdlKGJvdW5kc1tqXSwgc3Vic3RpdHV0aW9uLCBudWxsU3Vic3RpdHV0aW9uLAogICAgICAgICAgaXNDb3ZhcmlhbnQ6IHRydWUpOwogICAgfQogIH0KCiAgcmV0dXJuIGJvdW5kczsKfQoKLy8vIEdyYXBoIG9mIG11dHVhbCBkZXBlbmRlbmNpZXMgb2YgdHlwZSB2YXJpYWJsZXMgZnJvbSB0aGUgc2FtZSBkZWNsYXJhdGlvbi4KLy8vIFR5cGUgdmFyaWFibGVzIGFyZSByZXByZXNlbnRlZCBieSB0aGVpciBpbmRpY2VzIGluIHRoZSBjb3JyZXNwb25kaW5nCi8vLyBkZWNsYXJhdGlvbi4KY2xhc3MgVHlwZVZhcmlhYmxlc0dyYXBoIGltcGxlbWVudHMgR3JhcGg8aW50PiB7CiAgTGlzdDxpbnQ+IHZlcnRpY2VzOwogIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdmFyaWFibGVzOwogIExpc3Q8VHlwZUJ1aWxkZXI+IGJvdW5kczsKCiAgLy8gYGVkZ2VzW2ldYCBpcyB0aGUgbGlzdCBvZiBpbmRpY2VzIG9mIHR5cGUgdmFyaWFibGVzIHRoYXQgcmVmZXJlbmNlIHRoZSB0eXBlCiAgLy8gdmFyaWFibGUgd2l0aCB0aGUgaW5kZXggYGlgIGluIHRoZWlyIGJvdW5kcy4KICBMaXN0PExpc3Q8aW50Pj4gZWRnZXM7CgogIFR5cGVWYXJpYWJsZXNHcmFwaCh0aGlzLnZhcmlhYmxlcywgdGhpcy5ib3VuZHMpIHsKICAgIGFzc2VydCh2YXJpYWJsZXMubGVuZ3RoID09IGJvdW5kcy5sZW5ndGgpOwoKICAgIHZlcnRpY2VzID0gbmV3IExpc3Q8aW50Pih2YXJpYWJsZXMubGVuZ3RoKTsKICAgIE1hcDxUeXBlVmFyaWFibGVCdWlsZGVyLCBpbnQ+IHZhcmlhYmxlSW5kaWNlcyA9CiAgICAgICAgPFR5cGVWYXJpYWJsZUJ1aWxkZXIsIGludD57fTsKICAgIGVkZ2VzID0gbmV3IExpc3Q8TGlzdDxpbnQ+Pih2YXJpYWJsZXMubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmVydGljZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmVydGljZXNbaV0gPSBpOwogICAgICB2YXJpYWJsZUluZGljZXNbdmFyaWFibGVzW2ldXSA9IGk7CiAgICAgIGVkZ2VzW2ldID0gPGludD5bXTsKICAgIH0KCiAgICB2b2lkIGNvbGxlY3RSZWZlcmVuY2VzRnJvbShpbnQgaW5kZXgsIFR5cGVCdWlsZGVyIHR5cGUpIHsKICAgICAgaWYgKHR5cGUgaXMgTmFtZWRUeXBlQnVpbGRlcikgewogICAgICAgIGlmICh0eXBlLmRlY2xhcmF0aW9uIGlzIFR5cGVWYXJpYWJsZUJ1aWxkZXIgJiYKICAgICAgICAgICAgdGhpcy52YXJpYWJsZXMuY29udGFpbnModHlwZS5kZWNsYXJhdGlvbikpIHsKICAgICAgICAgIGVkZ2VzW3ZhcmlhYmxlSW5kaWNlc1t0eXBlLmRlY2xhcmF0aW9uXV0uYWRkKGluZGV4KTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGUuYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgICAgIGZvciAoVHlwZUJ1aWxkZXIgYXJndW1lbnQgaW4gdHlwZS5hcmd1bWVudHMpIHsKICAgICAgICAgICAgY29sbGVjdFJlZmVyZW5jZXNGcm9tKGluZGV4LCBhcmd1bWVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlQnVpbGRlcikgewogICAgICAgIGlmICh0eXBlLnR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIHR5cGVWYXJpYWJsZSBpbiB0eXBlLnR5cGVWYXJpYWJsZXMpIHsKICAgICAgICAgICAgY29sbGVjdFJlZmVyZW5jZXNGcm9tKGluZGV4LCB0eXBlVmFyaWFibGUuYm91bmQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodHlwZS5mb3JtYWxzICE9IG51bGwpIHsKICAgICAgICAgIGZvciAoRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBwYXJhbWV0ZXIgaW4gdHlwZS5mb3JtYWxzKSB7CiAgICAgICAgICAgIGNvbGxlY3RSZWZlcmVuY2VzRnJvbShpbmRleCwgcGFyYW1ldGVyLnR5cGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb2xsZWN0UmVmZXJlbmNlc0Zyb20oaW5kZXgsIHR5cGUucmV0dXJuVHlwZSk7CiAgICAgIH0KICAgIH0KCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlcnRpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbGxlY3RSZWZlcmVuY2VzRnJvbShpLCBib3VuZHNbaV0pOwogICAgfQogIH0KCiAgLy8vIFJldHVybnMgaW5kaWNlcyBvZiB0eXBlIHZhcmlhYmxlcyB0aGF0IGRlcGVuZCBvbiB0aGUgdHlwZSB2YXJpYWJsZSB3aXRoCiAgLy8vIFtpbmRleF0uCiAgSXRlcmFibGU8aW50PiBuZWlnaGJvcnNPZihpbnQgaW5kZXgpIHsKICAgIHJldHVybiBlZGdlc1tpbmRleF07CiAgfQp9CgovLy8gRmluZHMgYWxsIHR5cGUgYnVpbGRlcnMgZm9yIFt2YXJpYWJsZV0gaW4gW3R5cGVdLgovLy8KLy8vIFJldHVybnMgbGlzdCBvZiB0aGUgZm91bmQgdHlwZSBidWlsZGVycy4KTGlzdDxOYW1lZFR5cGVCdWlsZGVyPFR5cGVCdWlsZGVyLCBPYmplY3Q+PiBmaW5kVmFyaWFibGVVc2VzSW5UeXBlKAogIFR5cGVWYXJpYWJsZUJ1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4gdmFyaWFibGUsCiAgVHlwZUJ1aWxkZXIgdHlwZSwKKSB7CiAgdmFyIHVzZXMgPSA8TmFtZWRUeXBlQnVpbGRlcjxUeXBlQnVpbGRlciwgT2JqZWN0Pj5bXTsKICBpZiAodHlwZSBpcyBOYW1lZFR5cGVCdWlsZGVyKSB7CiAgICBpZiAodHlwZS5kZWNsYXJhdGlvbiA9PSB2YXJpYWJsZSkgewogICAgICB1c2VzLmFkZCh0eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICh0eXBlLmFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgICAgZm9yIChUeXBlQnVpbGRlciBhcmd1bWVudCBpbiB0eXBlLmFyZ3VtZW50cykgewogICAgICAgICAgdXNlcy5hZGRBbGwoZmluZFZhcmlhYmxlVXNlc0luVHlwZSh2YXJpYWJsZSwgYXJndW1lbnQpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9IGVsc2UgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlQnVpbGRlcikgewogICAgdXNlcy5hZGRBbGwoZmluZFZhcmlhYmxlVXNlc0luVHlwZSh2YXJpYWJsZSwgdHlwZS5yZXR1cm5UeXBlKSk7CiAgICBpZiAodHlwZS50eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyPFR5cGVCdWlsZGVyLCBPYmplY3Q+IGRlcGVuZGVudFZhcmlhYmxlCiAgICAgICAgICBpbiB0eXBlLnR5cGVWYXJpYWJsZXMpIHsKICAgICAgICBpZiAoZGVwZW5kZW50VmFyaWFibGUuYm91bmQgIT0gbnVsbCkgewogICAgICAgICAgdXNlcy5hZGRBbGwoCiAgICAgICAgICAgICAgZmluZFZhcmlhYmxlVXNlc0luVHlwZSh2YXJpYWJsZSwgZGVwZW5kZW50VmFyaWFibGUuYm91bmQpKTsKICAgICAgICB9CiAgICAgICAgaWYgKGRlcGVuZGVudFZhcmlhYmxlLmRlZmF1bHRUeXBlICE9IG51bGwpIHsKICAgICAgICAgIHVzZXMuYWRkQWxsKAogICAgICAgICAgICAgIGZpbmRWYXJpYWJsZVVzZXNJblR5cGUodmFyaWFibGUsIGRlcGVuZGVudFZhcmlhYmxlLmRlZmF1bHRUeXBlKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAodHlwZS5mb3JtYWxzICE9IG51bGwpIHsKICAgICAgZm9yIChGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPFR5cGVCdWlsZGVyPiBmb3JtYWwgaW4gdHlwZS5mb3JtYWxzKSB7CiAgICAgICAgdXNlcy5hZGRBbGwoZmluZFZhcmlhYmxlVXNlc0luVHlwZSh2YXJpYWJsZSwgZm9ybWFsLnR5cGUpKTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gdXNlczsKfQoKLy8vIEZpbmRzIHRob3NlIG9mIFt2YXJpYWJsZXNdIHRoYXQgcmVmZXJlbmNlIG90aGVyIFt2YXJpYWJsZXNdIGluIHRoZWlyIGJvdW5kcy4KLy8vCi8vLyBSZXR1cm5zIGZsYXR0ZW5lZCBsaXN0IG9mIHBhaXJzLiAgVGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHBhaXIgaXMgdGhlIHR5cGUKLy8vIHZhcmlhYmxlIGJ1aWxkZXIgZnJvbSBbdmFyaWFibGVzXSB0aGF0IHJlZmVyZW5jZXMgb3RoZXIgW3ZhcmlhYmxlc10gaW4gaXRzCi8vLyBib3VuZC4gIFRoZSBzZWNvbmQgZWxlbWVudCBpbiB0aGUgcGFpciBpcyB0aGUgbGlzdCBvZiBmb3VuZCByZWZlcmVuY2VzCi8vLyByZXByZXNlbnRlZCBhcyB0eXBlIGJ1aWxkZXJzLgpMaXN0PE9iamVjdD4gZmluZEluYm91bmRSZWZlcmVuY2VzKAogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPFR5cGVCdWlsZGVyLCBPYmplY3Q+PiB2YXJpYWJsZXMpIHsKICB2YXIgdmFyaWFibGVzQW5kRGVwZW5kZW5jaWVzID0gPE9iamVjdD5bXTsKICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4gZGVwZW5kZW50IGluIHZhcmlhYmxlcykgewogICAgdmFyIGRlcGVuZGVuY2llcyA9IDxOYW1lZFR5cGVCdWlsZGVyPFR5cGVCdWlsZGVyLCBPYmplY3Q+PltdOwogICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyPFR5cGVCdWlsZGVyLCBPYmplY3Q+IGRlcGVuZGVuY2UgaW4gdmFyaWFibGVzKSB7CiAgICAgIExpc3Q8TmFtZWRUeXBlQnVpbGRlcjxUeXBlQnVpbGRlciwgT2JqZWN0Pj4gdXNlcyA9CiAgICAgICAgICBmaW5kVmFyaWFibGVVc2VzSW5UeXBlKGRlcGVuZGVuY2UsIGRlcGVuZGVudC5ib3VuZCk7CiAgICAgIGlmICh1c2VzLmxlbmd0aCAhPSAwKSB7CiAgICAgICAgZGVwZW5kZW5jaWVzLmFkZEFsbCh1c2VzKTsKICAgICAgfQogICAgfQogICAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggIT0gMCkgewogICAgICB2YXJpYWJsZXNBbmREZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVudCk7CiAgICAgIHZhcmlhYmxlc0FuZERlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jaWVzKTsKICAgIH0KICB9CiAgcmV0dXJuIHZhcmlhYmxlc0FuZERlcGVuZGVuY2llczsKfQoKLy8vIEZpbmRzIHJhdyBnZW5lcmljIHR5cGVzIGluIFt0eXBlXSB3aXRoIGluYm91bmQgcmVmZXJlbmNlcyBpbiB0eXBlIHZhcmlhYmxlcy4KLy8vCi8vLyBSZXR1cm5zIGZsYXR0ZW5lZCBsaXN0IG9mIHBhaXJzLiAgVGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHBhaXIgaXMgdGhlIGZvdW5kCi8vLyByYXcgZ2VuZXJpYyB0eXBlLiAgVGhlIHNlY29uZCBlbGVtZW50IGluIHRoZSBwYWlyIGlzIHRoZSBsaXN0IG9mIHR5cGUKLy8vIHZhcmlhYmxlcyBvZiB0aGF0IHR5cGUgd2l0aCBpbmJvdW5kIHJlZmVyZW5jZXMgaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQgaW4KLy8vIFtmaW5kSW5ib3VuZFJlZmVyZW5jZXNdLgpMaXN0PE9iamVjdD4gZmluZFJhd1R5cGVzV2l0aEluYm91bmRSZWZlcmVuY2VzKFR5cGVCdWlsZGVyIHR5cGUpIHsKICB2YXIgdHlwZXNBbmREZXBlbmRlbmNpZXMgPSA8T2JqZWN0PltdOwogIGlmICh0eXBlIGlzIE5hbWVkVHlwZUJ1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4pIHsKICAgIGlmICh0eXBlLmFyZ3VtZW50cyA9PSBudWxsKSB7CiAgICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4gZGVjbGFyYXRpb24gPQogICAgICAgICAgdHlwZS5kZWNsYXJhdGlvbjsKICAgICAgaWYgKGRlY2xhcmF0aW9uIGlzIERpbGxDbGFzc0J1aWxkZXIpIHsKICAgICAgICBib29sIGhhc0luYm91bmQgPSBmYWxzZTsKICAgICAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzID0gZGVjbGFyYXRpb24udGFyZ2V0LnR5cGVQYXJhbWV0ZXJzOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoICYmICFoYXNJbmJvdW5kOyArK2kpIHsKICAgICAgICAgIGlmIChjb250YWluc1R5cGVWYXJpYWJsZSgKICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyc1tpXS5ib3VuZCwgdHlwZVBhcmFtZXRlcnMudG9TZXQoKSkpIHsKICAgICAgICAgICAgaGFzSW5ib3VuZCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChoYXNJbmJvdW5kKSB7CiAgICAgICAgICB0eXBlc0FuZERlcGVuZGVuY2llcy5hZGQodHlwZSk7CiAgICAgICAgICB0eXBlc0FuZERlcGVuZGVuY2llcy5hZGQoY29uc3QgPE9iamVjdD5bXSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIERpbGxUeXBlQWxpYXNCdWlsZGVyKSB7CiAgICAgICAgYm9vbCBoYXNJbmJvdW5kID0gZmFsc2U7CiAgICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyA9IGRlY2xhcmF0aW9uLnRhcmdldC50eXBlUGFyYW1ldGVyczsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCAmJiAhaGFzSW5ib3VuZDsgKytpKSB7CiAgICAgICAgICBpZiAoY29udGFpbnNUeXBlVmFyaWFibGUoCiAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnNbaV0uYm91bmQsIHR5cGVQYXJhbWV0ZXJzLnRvU2V0KCkpKSB7CiAgICAgICAgICAgIGhhc0luYm91bmQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaGFzSW5ib3VuZCkgewogICAgICAgICAgdHlwZXNBbmREZXBlbmRlbmNpZXMuYWRkKHR5cGUpOwogICAgICAgICAgdHlwZXNBbmREZXBlbmRlbmNpZXMuYWRkKGNvbnN0IDxPYmplY3Q+W10pOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBDbGFzc0J1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4gJiYKICAgICAgICAgIGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICAgIExpc3Q8T2JqZWN0PiBkZXBlbmRlbmNpZXMgPQogICAgICAgICAgICBmaW5kSW5ib3VuZFJlZmVyZW5jZXMoZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlcyk7CiAgICAgICAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggIT0gMCkgewogICAgICAgICAgdHlwZXNBbmREZXBlbmRlbmNpZXMuYWRkKHR5cGUpOwogICAgICAgICAgdHlwZXNBbmREZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY2llcyk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIFR5cGVBbGlhc0J1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4pIHsKICAgICAgICBpZiAoZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgICAgICBMaXN0PE9iamVjdD4gZGVwZW5kZW5jaWVzID0KICAgICAgICAgICAgICBmaW5kSW5ib3VuZFJlZmVyZW5jZXMoZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlcyk7CiAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCAhPSAwKSB7CiAgICAgICAgICAgIHR5cGVzQW5kRGVwZW5kZW5jaWVzLmFkZCh0eXBlKTsKICAgICAgICAgICAgdHlwZXNBbmREZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY2llcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkZWNsYXJhdGlvbi50eXBlIGlzIEZ1bmN0aW9uVHlwZUJ1aWxkZXIpIHsKICAgICAgICAgIEZ1bmN0aW9uVHlwZUJ1aWxkZXIgdHlwZSA9IGRlY2xhcmF0aW9uLnR5cGU7CiAgICAgICAgICBpZiAodHlwZS50eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgICAgICAgTGlzdDxPYmplY3Q+IGRlcGVuZGVuY2llcyA9CiAgICAgICAgICAgICAgICBmaW5kSW5ib3VuZFJlZmVyZW5jZXModHlwZS50eXBlVmFyaWFibGVzKTsKICAgICAgICAgICAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggIT0gMCkgewogICAgICAgICAgICAgIHR5cGVzQW5kRGVwZW5kZW5jaWVzLmFkZCh0eXBlKTsKICAgICAgICAgICAgICB0eXBlc0FuZERlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZm9yIChUeXBlQnVpbGRlciBhcmd1bWVudCBpbiB0eXBlLmFyZ3VtZW50cykgewogICAgICAgIHR5cGVzQW5kRGVwZW5kZW5jaWVzCiAgICAgICAgICAgIC5hZGRBbGwoZmluZFJhd1R5cGVzV2l0aEluYm91bmRSZWZlcmVuY2VzKGFyZ3VtZW50KSk7CiAgICAgIH0KICAgIH0KICB9IGVsc2UgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlQnVpbGRlcikgewogICAgdHlwZXNBbmREZXBlbmRlbmNpZXMKICAgICAgICAuYWRkQWxsKGZpbmRSYXdUeXBlc1dpdGhJbmJvdW5kUmVmZXJlbmNlcyh0eXBlLnJldHVyblR5cGUpKTsKICAgIGlmICh0eXBlLnR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4gdmFyaWFibGUKICAgICAgICAgIGluIHR5cGUudHlwZVZhcmlhYmxlcykgewogICAgICAgIGlmICh2YXJpYWJsZS5ib3VuZCAhPSBudWxsKSB7CiAgICAgICAgICB0eXBlc0FuZERlcGVuZGVuY2llcwogICAgICAgICAgICAgIC5hZGRBbGwoZmluZFJhd1R5cGVzV2l0aEluYm91bmRSZWZlcmVuY2VzKHZhcmlhYmxlLmJvdW5kKSk7CiAgICAgICAgfQogICAgICAgIGlmICh2YXJpYWJsZS5kZWZhdWx0VHlwZSAhPSBudWxsKSB7CiAgICAgICAgICB0eXBlc0FuZERlcGVuZGVuY2llcwogICAgICAgICAgICAgIC5hZGRBbGwoZmluZFJhd1R5cGVzV2l0aEluYm91bmRSZWZlcmVuY2VzKHZhcmlhYmxlLmRlZmF1bHRUeXBlKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAodHlwZS5mb3JtYWxzICE9IG51bGwpIHsKICAgICAgZm9yIChGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPFR5cGVCdWlsZGVyPiBmb3JtYWwgaW4gdHlwZS5mb3JtYWxzKSB7CiAgICAgICAgdHlwZXNBbmREZXBlbmRlbmNpZXMKICAgICAgICAgICAgLmFkZEFsbChmaW5kUmF3VHlwZXNXaXRoSW5ib3VuZFJlZmVyZW5jZXMoZm9ybWFsLnR5cGUpKTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gdHlwZXNBbmREZXBlbmRlbmNpZXM7Cn0KCi8vLyBGaW5kcyBpc3N1ZXMgYnkgcmF3IGdlbmVyaWMgdHlwZXMgd2l0aCBpbmJvdW5kIHJlZmVyZW5jZXMgaW4gdHlwZSB2YXJpYWJsZXMuCi8vLwovLy8gUmV0dXJucyBmbGF0dGVuZWQgbGlzdCBvZiB0cmlwbGV0cy4gIFRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSB0cmlwbGV0IGlzIHRoZQovLy8gW1R5cGVEZWNsYXJhdGlvbkJ1aWxkZXJdIGZvciB0aGUgdHlwZSB2YXJpYWJsZSBmcm9tIFt2YXJpYWJsZXNdIHRoYXQgaGFzIHJhdwovLy8gZ2VuZXJpYyB0eXBlcyB3aXRoIGluYm91bmQgcmVmZXJlbmNlcyBpbiBpdHMgYm91bmQuICBUaGUgc2Vjb25kIGVsZW1lbnQgb2YKLy8vIHRoZSB0cmlwbGV0IGlzIHRoZSBlcnJvciBtZXNzYWdlLiAgVGhlIHRoaXJkIGVsZW1lbnQgaXMgdGhlIGNvbnRleHQuCkxpc3Q8T2JqZWN0PiBnZXRJbmJvdW5kUmVmZXJlbmNlSXNzdWVzKAogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPFR5cGVCdWlsZGVyLCBPYmplY3Q+PiB2YXJpYWJsZXMpIHsKICB2YXIgaXNzdWVzID0gPE9iamVjdD5bXTsKICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4gdmFyaWFibGUgaW4gdmFyaWFibGVzKSB7CiAgICBpZiAodmFyaWFibGUuYm91bmQgIT0gbnVsbCkgewogICAgICBMaXN0PE9iamVjdD4gcmF3VHlwZXNBbmRNdXR1YWxEZXBlbmRlbmNpZXMgPQogICAgICAgICAgZmluZFJhd1R5cGVzV2l0aEluYm91bmRSZWZlcmVuY2VzKHZhcmlhYmxlLmJvdW5kKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYXdUeXBlc0FuZE11dHVhbERlcGVuZGVuY2llcy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgIE5hbWVkVHlwZUJ1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4gdHlwZSA9CiAgICAgICAgICAgIHJhd1R5cGVzQW5kTXV0dWFsRGVwZW5kZW5jaWVzW2ldOwogICAgICAgIExpc3Q8T2JqZWN0PiB2YXJpYWJsZXNBbmREZXBlbmRlbmNpZXMgPQogICAgICAgICAgICByYXdUeXBlc0FuZE11dHVhbERlcGVuZGVuY2llc1tpICsgMV07CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB2YXJpYWJsZXNBbmREZXBlbmRlbmNpZXMubGVuZ3RoOyBqICs9IDIpIHsKICAgICAgICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4gZGVwZW5kZW50ID0KICAgICAgICAgICAgICB2YXJpYWJsZXNBbmREZXBlbmRlbmNpZXNbal07CiAgICAgICAgICBMaXN0PE5hbWVkVHlwZUJ1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4+IGRlcGVuZGVuY2llcyA9CiAgICAgICAgICAgICAgdmFyaWFibGVzQW5kRGVwZW5kZW5jaWVzW2ogKyAxXTsKICAgICAgICAgIGZvciAoTmFtZWRUeXBlQnVpbGRlcjxUeXBlQnVpbGRlciwgT2JqZWN0PiBkZXBlbmRlbmN5CiAgICAgICAgICAgICAgaW4gZGVwZW5kZW5jaWVzKSB7CiAgICAgICAgICAgIGlzc3Vlcy5hZGQodmFyaWFibGUpOwogICAgICAgICAgICBpc3N1ZXMuYWRkKHRlbXBsYXRlQm91bmRJc3N1ZVZpYVJhd1R5cGVXaXRoTm9uU2ltcGxlQm91bmRzCiAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyh0eXBlLmRlY2xhcmF0aW9uLm5hbWUpKTsKICAgICAgICAgICAgaXNzdWVzLmFkZCg8TG9jYXRlZE1lc3NhZ2U+WwogICAgICAgICAgICAgIHRlbXBsYXRlTm9uU2ltcGxlQm91bmRWaWFWYXJpYWJsZQogICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhkZXBlbmRlbmN5LmRlY2xhcmF0aW9uLm5hbWUpCiAgICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oZGVwZW5kZW50LmZpbGVVcmksIGRlcGVuZGVudC5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW50Lm5hbWUubGVuZ3RoKQogICAgICAgICAgICBdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHZhcmlhYmxlc0FuZERlcGVuZGVuY2llcy5sZW5ndGggPT0gMCkgewogICAgICAgICAgLy8gVGhlIGluYm91bmQgcmVmZXJlbmNlcyBhcmUgaW4gYSBjb21waWxlZCBkZWNsYXJhdGlvbiBpbiBhIC5kaWxsLgogICAgICAgICAgaXNzdWVzLmFkZCh2YXJpYWJsZSk7CiAgICAgICAgICBpc3N1ZXMuYWRkKHRlbXBsYXRlQm91bmRJc3N1ZVZpYVJhd1R5cGVXaXRoTm9uU2ltcGxlQm91bmRzCiAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHModHlwZS5kZWNsYXJhdGlvbi5uYW1lKSk7CiAgICAgICAgICBpc3N1ZXMuYWRkKGNvbnN0IDxMb2NhdGVkTWVzc2FnZT5bXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBpc3N1ZXM7Cn0KCi8vLyBGaW5kcyByYXcgdHlwZSBwYXRocyBzdGFydGluZyBmcm9tIHRob3NlIGluIFtzdGFydF0gYW5kIGVuZGluZyB3aXRoIFtlbmRdLgovLy8KLy8vIFJldHVybnMgbGlzdCBvZiBmb3VuZCBwYXRocy4gIEVhY2ggcGF0aCBpcyByZXByZXNlbnRlZCBhcyBhIGxpc3Qgb2YKLy8vIGFsdGVybmF0aW5nIGJ1aWxkZXJzIG9mIHRoZSByYXcgZ2VuZXJpYyB0eXBlcyBmcm9tIHRoZSBwYXRoIGFuZCBidWlsZGVycyBvZgovLy8gdHlwZSB2YXJpYWJsZXMgb2YgdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZyB0eXBlcyB0aGF0IGNvbnRhaW4gdGhlIHJlZmVyZW5jZQovLy8gdG8gdGhlIG5leHQgcmF3IGdlbmVyaWMgdHlwZSBpbiB0aGUgcGF0aC4gIFRoZSBsaXN0IGVuZHMgd2l0aCB0aGUgdHlwZQovLy8gYnVpbGRlciBmb3IgW2VuZF0uCi8vLwovLy8gVGhlIHJlYXNvbiBmb3IgcHV0dGluZyB0aGUgdHlwZSB2YXJpYWJsZXMgaW50byB0aGUgcGF0aHMgYXMgd2VsbCBhcyBmb3IKLy8vIHVzaW5nIHR5cGUgZm9yIFtzdGFydF0sIGFuZCBub3QgdGhlIGNvcnJlc3BvbmRpbmcgdHlwZSBkZWNsYXJhdGlvbiwKLy8vIGlzIGJldHRlciBlcnJvciByZXBvcnRpbmcuCkxpc3Q8TGlzdDxPYmplY3Q+PiBmaW5kUmF3VHlwZVBhdGhzVG9EZWNsYXJhdGlvbigKICAgIFR5cGVCdWlsZGVyIHN0YXJ0LCBUeXBlRGVjbGFyYXRpb25CdWlsZGVyPFR5cGVCdWlsZGVyLCBPYmplY3Q+IGVuZCwKICAgIFtTZXQ8VHlwZURlY2xhcmF0aW9uQnVpbGRlcjxUeXBlQnVpbGRlciwgT2JqZWN0Pj4gdmlzaXRlZF0pIHsKICB2aXNpdGVkID8/PSBuZXcgU2V0PFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4+LmlkZW50aXR5KCk7CiAgdmFyIHBhdGhzID0gPExpc3Q8T2JqZWN0Pj5bXTsKICBpZiAoc3RhcnQgaXMgTmFtZWRUeXBlQnVpbGRlcjxUeXBlQnVpbGRlciwgT2JqZWN0PikgewogICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlcjxUeXBlQnVpbGRlciwgT2JqZWN0PiBkZWNsYXJhdGlvbiA9IHN0YXJ0LmRlY2xhcmF0aW9uOwogICAgaWYgKHN0YXJ0LmFyZ3VtZW50cyA9PSBudWxsKSB7CiAgICAgIGlmIChzdGFydC5kZWNsYXJhdGlvbiA9PSBlbmQpIHsKICAgICAgICBwYXRocy5hZGQoPE9iamVjdD5bc3RhcnRdKTsKICAgICAgfSBlbHNlIGlmICh2aXNpdGVkLmFkZChzdGFydC5kZWNsYXJhdGlvbikpIHsKICAgICAgICBpZiAoZGVjbGFyYXRpb24gaXMgQ2xhc3NCdWlsZGVyPFR5cGVCdWlsZGVyLCBPYmplY3Q+ICYmCiAgICAgICAgICAgIGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyPFR5cGVCdWlsZGVyLCBPYmplY3Q+IHZhcmlhYmxlCiAgICAgICAgICAgICAgaW4gZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlcykgewogICAgICAgICAgICBpZiAodmFyaWFibGUuYm91bmQgIT0gbnVsbCkgewogICAgICAgICAgICAgIGZvciAoTGlzdDxPYmplY3Q+IHBhdGggaW4gZmluZFJhd1R5cGVQYXRoc1RvRGVjbGFyYXRpb24oCiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmJvdW5kLCBlbmQsIHZpc2l0ZWQpKSB7CiAgICAgICAgICAgICAgICBwYXRocy5hZGQoPE9iamVjdD5bc3RhcnQsIHZhcmlhYmxlXS4uYWRkQWxsKHBhdGgpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIFR5cGVBbGlhc0J1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4pIHsKICAgICAgICAgIGlmIChkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyPFR5cGVCdWlsZGVyLCBPYmplY3Q+IHZhcmlhYmxlCiAgICAgICAgICAgICAgICBpbiBkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzKSB7CiAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlLmJvdW5kICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGZvciAoTGlzdDxPYmplY3Q+IGRlcGVuZGVuY3lQYXRoCiAgICAgICAgICAgICAgICAgICAgaW4gZmluZFJhd1R5cGVQYXRoc1RvRGVjbGFyYXRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmJvdW5kLCBlbmQsIHZpc2l0ZWQpKSB7CiAgICAgICAgICAgICAgICAgIHBhdGhzLmFkZCg8T2JqZWN0PltzdGFydCwgdmFyaWFibGVdLi5hZGRBbGwoZGVwZW5kZW5jeVBhdGgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChkZWNsYXJhdGlvbi50eXBlIGlzIEZ1bmN0aW9uVHlwZUJ1aWxkZXIpIHsKICAgICAgICAgICAgRnVuY3Rpb25UeXBlQnVpbGRlciB0eXBlID0gZGVjbGFyYXRpb24udHlwZTsKICAgICAgICAgICAgaWYgKHR5cGUudHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyPFR5cGVCdWlsZGVyLCBPYmplY3Q+IHZhcmlhYmxlCiAgICAgICAgICAgICAgICAgIGluIHR5cGUudHlwZVZhcmlhYmxlcykgewogICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlLmJvdW5kICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgZm9yIChMaXN0PE9iamVjdD4gZGVwZW5kZW5jeVBhdGgKICAgICAgICAgICAgICAgICAgICAgIGluIGZpbmRSYXdUeXBlUGF0aHNUb0RlY2xhcmF0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmJvdW5kLCBlbmQsIHZpc2l0ZWQpKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0aHMKICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCg8T2JqZWN0PltzdGFydCwgdmFyaWFibGVdLi5hZGRBbGwoZGVwZW5kZW5jeVBhdGgpKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2aXNpdGVkLnJlbW92ZShzdGFydC5kZWNsYXJhdGlvbik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAoVHlwZUJ1aWxkZXIgYXJndW1lbnQgaW4gc3RhcnQuYXJndW1lbnRzKSB7CiAgICAgICAgcGF0aHMuYWRkQWxsKGZpbmRSYXdUeXBlUGF0aHNUb0RlY2xhcmF0aW9uKGFyZ3VtZW50LCBlbmQsIHZpc2l0ZWQpKTsKICAgICAgfQogICAgfQogIH0gZWxzZSBpZiAoc3RhcnQgaXMgRnVuY3Rpb25UeXBlQnVpbGRlcikgewogICAgcGF0aHMuYWRkQWxsKGZpbmRSYXdUeXBlUGF0aHNUb0RlY2xhcmF0aW9uKHN0YXJ0LnJldHVyblR5cGUsIGVuZCwgdmlzaXRlZCkpOwogICAgaWYgKHN0YXJ0LnR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4gdmFyaWFibGUKICAgICAgICAgIGluIHN0YXJ0LnR5cGVWYXJpYWJsZXMpIHsKICAgICAgICBpZiAodmFyaWFibGUuYm91bmQgIT0gbnVsbCkgewogICAgICAgICAgcGF0aHMuYWRkQWxsKAogICAgICAgICAgICAgIGZpbmRSYXdUeXBlUGF0aHNUb0RlY2xhcmF0aW9uKHZhcmlhYmxlLmJvdW5kLCBlbmQsIHZpc2l0ZWQpKTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhcmlhYmxlLmRlZmF1bHRUeXBlICE9IG51bGwpIHsKICAgICAgICAgIHBhdGhzLmFkZEFsbChmaW5kUmF3VHlwZVBhdGhzVG9EZWNsYXJhdGlvbigKICAgICAgICAgICAgICB2YXJpYWJsZS5kZWZhdWx0VHlwZSwgZW5kLCB2aXNpdGVkKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoc3RhcnQuZm9ybWFscyAhPSBudWxsKSB7CiAgICAgIGZvciAoRm9ybWFsUGFyYW1ldGVyQnVpbGRlcjxUeXBlQnVpbGRlcj4gZm9ybWFsIGluIHN0YXJ0LmZvcm1hbHMpIHsKICAgICAgICBwYXRocy5hZGRBbGwoZmluZFJhd1R5cGVQYXRoc1RvRGVjbGFyYXRpb24oZm9ybWFsLnR5cGUsIGVuZCwgdmlzaXRlZCkpOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBwYXRoczsKfQoKLy8vIEZpbmRzIHJhdyBnZW5lcmljIHR5cGUgY3ljbGVzIGVuZGluZyBhbmQgc3RhcnRpbmcgd2l0aCBbZGVjbGFyYXRpb25dLgovLy8KLy8vIFJldHVybnMgbGlzdCBvZiBmb3VuZCBjeWNsZXMuICBFYWNoIGN5Y2xlIGlzIHJlcHJlc2VudGVkIGFzIGEgbGlzdCBvZgovLy8gYWx0ZXJuYXRpbmcgcmF3IGdlbmVyaWMgdHlwZXMgZnJvbSB0aGUgY3ljbGUgYW5kIHR5cGUgdmFyaWFibGVzIG9mIHRoZQovLy8gaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHR5cGUgdGhhdCByZWZlcmVuY2UgdGhlIG5leHQgdHlwZSBpbiB0aGUgY3ljbGUuICBUaGUKLy8vIGN5Y2xlIHN0YXJ0cyB3aXRoIGEgdHlwZSB2YXJpYWJsZSBmcm9tIFtkZWNsYXJhdGlvbl0gYW5kIGVuZHMgd2l0aCBhIHR5cGUKLy8vIHRoYXQgaGFzIFtkZWNsYXJhdGlvbl0gYXMgaXRzIGRlY2xhcmF0aW9uLgovLy8KLy8vIFRoZSByZWFzb24gZm9yIHB1dHRpbmcgdGhlIHR5cGUgdmFyaWFibGVzIGludG8gdGhlIGN5Y2xlcyBpcyBiZXR0ZXIgZXJyb3IKLy8vIHJlcG9ydGluZy4KTGlzdDxMaXN0PE9iamVjdD4+IGZpbmRSYXdUeXBlQ3ljbGVzKAogICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlcjxUeXBlQnVpbGRlciwgT2JqZWN0PiBkZWNsYXJhdGlvbikgewogIHZhciBjeWNsZXMgPSA8TGlzdDxPYmplY3Q+PltdOwogIGlmIChkZWNsYXJhdGlvbiBpcyBDbGFzc0J1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4gJiYKICAgICAgZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4gdmFyaWFibGUKICAgICAgICBpbiBkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzKSB7CiAgICAgIGlmICh2YXJpYWJsZS5ib3VuZCAhPSBudWxsKSB7CiAgICAgICAgZm9yIChMaXN0PE9iamVjdD4gcGF0aAogICAgICAgICAgICBpbiBmaW5kUmF3VHlwZVBhdGhzVG9EZWNsYXJhdGlvbih2YXJpYWJsZS5ib3VuZCwgZGVjbGFyYXRpb24pKSB7CiAgICAgICAgICBjeWNsZXMuYWRkKDxPYmplY3Q+W3ZhcmlhYmxlXS4uYWRkQWxsKHBhdGgpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIFR5cGVBbGlhc0J1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4pIHsKICAgIGlmIChkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyPFR5cGVCdWlsZGVyLCBPYmplY3Q+IHZhcmlhYmxlCiAgICAgICAgICBpbiBkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzKSB7CiAgICAgICAgaWYgKHZhcmlhYmxlLmJvdW5kICE9IG51bGwpIHsKICAgICAgICAgIGZvciAoTGlzdDxPYmplY3Q+IGRlcGVuZGVuY3lQYXRoCiAgICAgICAgICAgICAgaW4gZmluZFJhd1R5cGVQYXRoc1RvRGVjbGFyYXRpb24odmFyaWFibGUuYm91bmQsIGRlY2xhcmF0aW9uKSkgewogICAgICAgICAgICBjeWNsZXMuYWRkKDxPYmplY3Q+W3ZhcmlhYmxlXS4uYWRkQWxsKGRlcGVuZGVuY3lQYXRoKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoZGVjbGFyYXRpb24udHlwZSBpcyBGdW5jdGlvblR5cGVCdWlsZGVyKSB7CiAgICAgIEZ1bmN0aW9uVHlwZUJ1aWxkZXIgdHlwZSA9IGRlY2xhcmF0aW9uLnR5cGU7CiAgICAgIGlmICh0eXBlLnR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICAgIGZvciAoVHlwZVZhcmlhYmxlQnVpbGRlcjxUeXBlQnVpbGRlciwgT2JqZWN0PiB2YXJpYWJsZQogICAgICAgICAgICBpbiB0eXBlLnR5cGVWYXJpYWJsZXMpIHsKICAgICAgICAgIGlmICh2YXJpYWJsZS5ib3VuZCAhPSBudWxsKSB7CiAgICAgICAgICAgIGZvciAoTGlzdDxPYmplY3Q+IGRlcGVuZGVuY3lQYXRoCiAgICAgICAgICAgICAgICBpbiBmaW5kUmF3VHlwZVBhdGhzVG9EZWNsYXJhdGlvbih2YXJpYWJsZS5ib3VuZCwgZGVjbGFyYXRpb24pKSB7CiAgICAgICAgICAgICAgY3ljbGVzLmFkZCg8T2JqZWN0Plt2YXJpYWJsZV0uLmFkZEFsbChkZXBlbmRlbmN5UGF0aCkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBjeWNsZXM7Cn0KCi8vLyBDb252ZXJ0cyByYXcgZ2VuZXJpYyB0eXBlIFtjeWNsZXNdIGZvciBbZGVjbGFyYXRpb25dIGludG8gcmVwb3J0YWJsZSBpc3N1ZXMuCi8vLwovLy8gVGhlIFtjeWNsZXNdIGFyZSBleHBlY3RlZCB0byBiZSBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBmb3IgdGhlIHJldHVybiB2YWx1ZQovLy8gb2YgW2ZpbmRSYXdUeXBlQ3ljbGVzXS4KLy8vCi8vLyBSZXR1cm5zIGZsYXR0ZW5lZCBsaXN0IG9mIHRyaXBsZXRzLiAgVGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHRyaXBsZXQgaXMgdGhlCi8vLyBbVHlwZURlY2xhcmF0aW9uQnVpbGRlcl0gZm9yIHRoZSB0eXBlIHZhcmlhYmxlIGZyb20gW3ZhcmlhYmxlc10gdGhhdCBoYXMgcmF3Ci8vLyBnZW5lcmljIHR5cGVzIHdpdGggaW5ib3VuZCByZWZlcmVuY2VzIGluIGl0cyBib3VuZC4gIFRoZSBzZWNvbmQgZWxlbWVudCBvZgovLy8gdGhlIHRyaXBsZXQgaXMgdGhlIGVycm9yIG1lc3NhZ2UuICBUaGUgdGhpcmQgZWxlbWVudCBpcyB0aGUgY29udGV4dC4KTGlzdDxPYmplY3Q+IGNvbnZlcnRSYXdUeXBlQ3ljbGVzSW50b0lzc3VlcygKICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4gZGVjbGFyYXRpb24sCiAgICBMaXN0PExpc3Q8T2JqZWN0Pj4gY3ljbGVzKSB7CiAgTGlzdDxPYmplY3Q+IGlzc3VlcyA9IDxPYmplY3Q+W107CiAgZm9yIChMaXN0PE9iamVjdD4gY3ljbGUgaW4gY3ljbGVzKSB7CiAgICBpZiAoY3ljbGUubGVuZ3RoID09IDIpIHsKICAgICAgLy8gTG9vcC4KICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlcjxUeXBlQnVpbGRlciwgT2JqZWN0PiB2YXJpYWJsZSA9IGN5Y2xlWzBdOwogICAgICBOYW1lZFR5cGVCdWlsZGVyPFR5cGVCdWlsZGVyLCBPYmplY3Q+IHR5cGUgPSBjeWNsZVsxXTsKICAgICAgaXNzdWVzLmFkZCh2YXJpYWJsZSk7CiAgICAgIGlzc3Vlcy5hZGQodGVtcGxhdGVCb3VuZElzc3VlVmlhTG9vcE5vblNpbXBsaWNpdHkKICAgICAgICAgIC53aXRoQXJndW1lbnRzKHR5cGUuZGVjbGFyYXRpb24ubmFtZSkpOwogICAgICBpc3N1ZXMuYWRkKG51bGwpOyAvLyBDb250ZXh0LgogICAgfSBlbHNlIHsKICAgICAgdmFyIGNvbnRleHQgPSA8TG9jYXRlZE1lc3NhZ2U+W107CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3ljbGUubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyPFR5cGVCdWlsZGVyLCBPYmplY3Q+IHZhcmlhYmxlID0gY3ljbGVbaV07CiAgICAgICAgTmFtZWRUeXBlQnVpbGRlcjxUeXBlQnVpbGRlciwgT2JqZWN0PiB0eXBlID0gY3ljbGVbaSArIDFdOwogICAgICAgIGNvbnRleHQuYWRkKHRlbXBsYXRlTm9uU2ltcGxlQm91bmRWaWFSZWZlcmVuY2UKICAgICAgICAgICAgLndpdGhBcmd1bWVudHModHlwZS5kZWNsYXJhdGlvbi5uYW1lKQogICAgICAgICAgICAud2l0aExvY2F0aW9uKAogICAgICAgICAgICAgICAgdmFyaWFibGUuZmlsZVVyaSwgdmFyaWFibGUuY2hhck9mZnNldCwgdmFyaWFibGUubmFtZS5sZW5ndGgpKTsKICAgICAgfQogICAgICBOYW1lZFR5cGVCdWlsZGVyPFR5cGVCdWlsZGVyLCBPYmplY3Q+IGZpcnN0RW5jb3VudGVyZWRUeXBlID0gY3ljbGVbMV07CgogICAgICBpc3N1ZXMuYWRkKGRlY2xhcmF0aW9uKTsKICAgICAgaXNzdWVzLmFkZCh0ZW1wbGF0ZUJvdW5kSXNzdWVWaWFDeWNsZU5vblNpbXBsaWNpdHkud2l0aEFyZ3VtZW50cygKICAgICAgICAgIGRlY2xhcmF0aW9uLm5hbWUsIGZpcnN0RW5jb3VudGVyZWRUeXBlLmRlY2xhcmF0aW9uLm5hbWUpKTsKICAgICAgaXNzdWVzLmFkZChjb250ZXh0KTsKICAgIH0KICB9CiAgcmV0dXJuIGlzc3VlczsKfQoKLy8vIEZpbmRzIG5vbi1zaW1wbGljaXR5IGlzc3VlcyBmb3IgdGhlIGdpdmVuIHNldCBvZiBbdmFyaWFibGVzXS4KLy8vCi8vLyBUaGUgaXNzdWVzIGFyZSB0aG9zZSBjYXVzZWQgYnkgcmF3IHR5cGVzIHdpdGggaW5ib3VuZCByZWZlcmVuY2VzIGluIHRoZQovLy8gYm91bmRzIG9mIHRoZWlyIHR5cGUgdmFyaWFibGVzLgovLy8KLy8vIFJldHVybnMgZmxhdHRlbmVkIGxpc3Qgb2YgdHJpcGxldHMsIGVhY2ggdHJpcGxldCByZXByZXNlbnRpbmcgYW4gaXNzdWUuICBUaGUKLy8vIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHRyaXBsZXQgaXMgdGhlIHR5cGUgZGVjbGFyYXRpb24gdGhhdCBoYXMgdGhlIGlzc3VlLgovLy8gVGhlIHNlY29uZCBlbGVtZW50IGluIHRoZSB0cmlwbGV0IGlzIHRoZSBlcnJvciBtZXNzYWdlLiAgVGhlIHRoaXJkIGVsZW1lbnQKLy8vIGluIHRoZSB0cmlwbGV0IGlzIHRoZSBjb250ZXh0LgpMaXN0PE9iamVjdD4gZ2V0Tm9uU2ltcGxpY2l0eUlzc3Vlc0ZvclR5cGVWYXJpYWJsZXMoCiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4+IHZhcmlhYmxlcykgewogIGlmICh2YXJpYWJsZXMgPT0gbnVsbCkgcmV0dXJuIDxPYmplY3Q+W107CiAgcmV0dXJuIGdldEluYm91bmRSZWZlcmVuY2VJc3N1ZXModmFyaWFibGVzKTsKfQoKLy8vIEZpbmRzIG5vbi1zaW1wbGljaXR5IGlzc3VlcyBmb3IgdGhlIGdpdmVuIFtkZWNsYXJhdGlvbl0uCi8vLwovLy8gVGhlIGlzc3VlcyBhcmUgdGhvc2UgY2F1c2VkIGJ5IHJhdyB0eXBlcyB3aXRoIGluYm91bmQgcmVmZXJlbmNlcyBpbiB0aGUKLy8vIGJvdW5kcyBvZiB0eXBlIHZhcmlhYmxlcyBmcm9tIFtkZWNsYXJhdGlvbl0gYW5kIGJ5IGN5Y2xlcyBvZiByYXcgdHlwZXMKLy8vIGNvbnRhaW5pbmcgW2RlY2xhcmF0aW9uXS4KLy8vCi8vLyBSZXR1cm5zIGZsYXR0ZW5lZCBsaXN0IG9mIHRyaXBsZXRzLCBlYWNoIHRyaXBsZXQgcmVwcmVzZW50aW5nIGFuIGlzc3VlLiAgVGhlCi8vLyBmaXJzdCBlbGVtZW50IGluIHRoZSB0cmlwbGV0IGlzIHRoZSB0eXBlIGRlY2xhcmF0aW9uIHRoYXQgaGFzIHRoZSBpc3N1ZS4KLy8vIFRoZSBzZWNvbmQgZWxlbWVudCBpbiB0aGUgdHJpcGxldCBpcyB0aGUgZXJyb3IgbWVzc2FnZS4gIFRoZSB0aGlyZCBlbGVtZW50Ci8vLyBpbiB0aGUgdHJpcGxldCBpcyB0aGUgY29udGV4dC4KTGlzdDxPYmplY3Q+IGdldE5vblNpbXBsaWNpdHlJc3N1ZXNGb3JEZWNsYXJhdGlvbigKICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4gZGVjbGFyYXRpb24sCiAgICB7Ym9vbCBwZXJmb3JtRXJyb3JSZWNvdmVyeTogdHJ1ZX0pIHsKICB2YXIgaXNzdWVzID0gPE9iamVjdD5bXTsKICBpZiAoZGVjbGFyYXRpb24gaXMgQ2xhc3NCdWlsZGVyPFR5cGVCdWlsZGVyLCBPYmplY3Q+ICYmCiAgICAgIGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgaXNzdWVzLmFkZEFsbChnZXRJbmJvdW5kUmVmZXJlbmNlSXNzdWVzKGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXMpKTsKICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIFR5cGVBbGlhc0J1aWxkZXI8VHlwZUJ1aWxkZXIsIE9iamVjdD4gJiYKICAgICAgZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICBpc3N1ZXMuYWRkQWxsKGdldEluYm91bmRSZWZlcmVuY2VJc3N1ZXMoZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlcykpOwogIH0KICBMaXN0PExpc3Q8T2JqZWN0Pj4gY3ljbGVzVG9SZXBvcnQgPSA8TGlzdDxPYmplY3Q+PltdOwogIGZvciAoTGlzdDxPYmplY3Q+IGN5Y2xlIGluIGZpbmRSYXdUeXBlQ3ljbGVzKGRlY2xhcmF0aW9uKSkgewogICAgLy8gVG8gYXZvaWQgcmVwb3J0aW5nIHRoZSBzYW1lIGVycm9yIGZvciBlYWNoIGVsZW1lbnQgb2YgdGhlIGN5Y2xlLCB3ZSBvbmx5CiAgICAvLyBkbyBzbyBpZiBpdCBjb21lcyB0aGUgZmlyc3QgaW4gdGhlIGxleGljb2dyYXBoaWNhbCBvcmRlci4gIE5vdGUgdGhhdAogICAgLy8gb25lLWVsZW1lbnQgY3ljbGVzIHNob3VsZG4ndCBiZSBjaGVja2VkLCBhcyB0aGV5IGFyZSBsb29wcy4KICAgIGlmIChjeWNsZS5sZW5ndGggPT0gMikgewogICAgICBjeWNsZXNUb1JlcG9ydC5hZGQoY3ljbGUpOwogICAgfSBlbHNlIHsKICAgICAgU3RyaW5nIGRlY2xhcmF0aW9uUGF0aEFuZE5hbWUgPQogICAgICAgICAgIiR7ZGVjbGFyYXRpb24uZmlsZVVyaX06JHtkZWNsYXJhdGlvbi5uYW1lfSI7CiAgICAgIFN0cmluZyBsZXhNaW5QYXRoQW5kTmFtZSA9IG51bGw7CiAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgY3ljbGUubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICBOYW1lZFR5cGVCdWlsZGVyPFR5cGVCdWlsZGVyLCBPYmplY3Q+IHR5cGUgPSBjeWNsZVtpXTsKICAgICAgICBTdHJpbmcgcGF0aEFuZE5hbWUgPQogICAgICAgICAgICAiJHt0eXBlLmRlY2xhcmF0aW9uLmZpbGVVcml9OiR7dHlwZS5kZWNsYXJhdGlvbi5uYW1lfSI7CiAgICAgICAgaWYgKGxleE1pblBhdGhBbmROYW1lID09IG51bGwgfHwKICAgICAgICAgICAgbGV4TWluUGF0aEFuZE5hbWUuY29tcGFyZVRvKHBhdGhBbmROYW1lKSA+IDApIHsKICAgICAgICAgIGxleE1pblBhdGhBbmROYW1lID0gcGF0aEFuZE5hbWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChkZWNsYXJhdGlvblBhdGhBbmROYW1lID09IGxleE1pblBhdGhBbmROYW1lKSB7CiAgICAgICAgY3ljbGVzVG9SZXBvcnQuYWRkKGN5Y2xlKTsKICAgICAgfQogICAgfQogIH0KICBMaXN0PE9iamVjdD4gcmF3VHlwZUN5Y2xlc0FzSXNzdWVzID0KICAgICAgY29udmVydFJhd1R5cGVDeWNsZXNJbnRvSXNzdWVzKGRlY2xhcmF0aW9uLCBjeWNsZXNUb1JlcG9ydCk7CiAgaXNzdWVzLmFkZEFsbChyYXdUeXBlQ3ljbGVzQXNJc3N1ZXMpOwoKICBpZiAocGVyZm9ybUVycm9yUmVjb3ZlcnkpIHsKICAgIGJyZWFrQ3ljbGVzKGN5Y2xlc1RvUmVwb3J0KTsKICB9CgogIHJldHVybiBpc3N1ZXM7Cn0KCi8vLyBCcmVhayByYXcgZ2VuZXJpYyB0eXBlIFtjeWNsZXNdIGFzIGVycm9yIHJlY292ZXJ5LgovLy8KLy8vIFRoZSBbY3ljbGVzXSBhcmUgZXhwZWN0ZWQgdG8gYmUgaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQgZm9yIHRoZSByZXR1cm4gdmFsdWUKLy8vIG9mIFtmaW5kUmF3VHlwZUN5Y2xlc10uCnZvaWQgYnJlYWtDeWNsZXMoTGlzdDxMaXN0PE9iamVjdD4+IGN5Y2xlcykgewogIGZvciAoTGlzdDxPYmplY3Q+IGN5Y2xlIGluIGN5Y2xlcykgewogICAgVHlwZVZhcmlhYmxlQnVpbGRlcjxUeXBlQnVpbGRlciwgT2JqZWN0PiB2YXJpYWJsZSA9IGN5Y2xlWzBdOwogICAgdmFyaWFibGUuYm91bmQgPSBudWxsOwogIH0KfQoKdm9pZCBmaW5kR2VuZXJpY0Z1bmN0aW9uVHlwZXMoVHlwZUJ1aWxkZXIgdHlwZSwge0xpc3Q8VHlwZUJ1aWxkZXI+IHJlc3VsdH0pIHsKICByZXN1bHQgPz89IDxUeXBlQnVpbGRlcj5bXTsKICBpZiAodHlwZSBpcyBGdW5jdGlvblR5cGVCdWlsZGVyKSB7CiAgICBpZiAodHlwZS50eXBlVmFyaWFibGVzICE9IG51bGwgJiYgdHlwZS50eXBlVmFyaWFibGVzLmxlbmd0aCA+IDApIHsKICAgICAgcmVzdWx0LmFkZCh0eXBlKTsKCiAgICAgIGZvciAoVHlwZVZhcmlhYmxlQnVpbGRlcjxUeXBlQnVpbGRlciwgT2JqZWN0PiB0eXBlVmFyaWFibGUKICAgICAgICAgIGluIHR5cGUudHlwZVZhcmlhYmxlcykgewogICAgICAgIGZpbmRHZW5lcmljRnVuY3Rpb25UeXBlcyh0eXBlVmFyaWFibGUuYm91bmQsIHJlc3VsdDogcmVzdWx0KTsKICAgICAgICBmaW5kR2VuZXJpY0Z1bmN0aW9uVHlwZXModHlwZVZhcmlhYmxlLmRlZmF1bHRUeXBlLCByZXN1bHQ6IHJlc3VsdCk7CiAgICAgIH0KICAgIH0KICAgIGZpbmRHZW5lcmljRnVuY3Rpb25UeXBlcyh0eXBlLnJldHVyblR5cGUsIHJlc3VsdDogcmVzdWx0KTsKICAgIGlmICh0eXBlLmZvcm1hbHMgIT0gbnVsbCkgewogICAgICBmb3IgKEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI8VHlwZUJ1aWxkZXI+IGZvcm1hbCBpbiB0eXBlLmZvcm1hbHMpIHsKICAgICAgICBmaW5kR2VuZXJpY0Z1bmN0aW9uVHlwZXMoZm9ybWFsLnR5cGUsIHJlc3VsdDogcmVzdWx0KTsKICAgICAgfQogICAgfQogIH0gZWxzZSBpZiAodHlwZSBpcyBOYW1lZFR5cGVCdWlsZGVyPFR5cGVCdWlsZGVyLCBPYmplY3Q+ICYmCiAgICAgIHR5cGUuYXJndW1lbnRzICE9IG51bGwpIHsKICAgIGZvciAoVHlwZUJ1aWxkZXIgYXJndW1lbnQgaW4gdHlwZS5hcmd1bWVudHMpIHsKICAgICAgZmluZEdlbmVyaWNGdW5jdGlvblR5cGVzKGFyZ3VtZW50LCByZXN1bHQ6IHJlc3VsdCk7CiAgICB9CiAgfQp9CgovLy8gUmV0dXJucyB0cnVlIGlmIFt0eXBlXSBjb250YWlucyBhbnkgdHlwZSB2YXJpYWJsZXMgd2hhdHNvZXZlci4gVGhpcyBzaG91bGQKLy8vIG9ubHkgYmUgdXNlZCBmb3Igd29ya2luZyBhcm91bmQgdHJhbnNpdGlvbmFsIGlzc3Vlcy4KLy8gVE9ETyhhaGUpOiBSZW1vdmUgdGhpcyBtZXRob2QuCmJvb2wgaGFzQW55VHlwZVZhcmlhYmxlcyhEYXJ0VHlwZSB0eXBlKSB7CiAgcmV0dXJuIHR5cGUuYWNjZXB0KGNvbnN0IFR5cGVWYXJpYWJsZVNlYXJjaCgpKTsKfQoKLy8vIERvbid0IHVzZSB0aGlzIGRpcmVjdGx5LCB1c2UgW2hhc0FueVR5cGVWYXJpYWJsZXNdIGluc3RlYWQuIEJ1dCBkb24ndCB1c2UKLy8vIHRoYXQgZWl0aGVyLgovLyBUT0RPKGFoZSk6IFJlbW92ZSB0aGlzIGNsYXNzLgpjbGFzcyBUeXBlVmFyaWFibGVTZWFyY2ggaW1wbGVtZW50cyBEYXJ0VHlwZVZpc2l0b3I8Ym9vbD4gewogIGNvbnN0IFR5cGVWYXJpYWJsZVNlYXJjaCgpOwoKICBib29sIGRlZmF1bHREYXJ0VHlwZShEYXJ0VHlwZSBub2RlKSA9PiB0aHJvdyAidW5zdXBwb3J0ZWQiOwoKICBib29sIGFueVR5cGVWYXJpYWJsZXMoTGlzdDxEYXJ0VHlwZT4gdHlwZXMpIHsKICAgIGZvciAoRGFydFR5cGUgdHlwZSBpbiB0eXBlcykgewogICAgICBpZiAodHlwZS5hY2NlcHQodGhpcykpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgYm9vbCB2aXNpdEludmFsaWRUeXBlKEludmFsaWRUeXBlIG5vZGUpID0+IGZhbHNlOwoKICBib29sIHZpc2l0RHluYW1pY1R5cGUoRHluYW1pY1R5cGUgbm9kZSkgPT4gZmFsc2U7CgogIGJvb2wgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSBub2RlKSA9PiBmYWxzZTsKCiAgYm9vbCB2aXNpdEJvdHRvbVR5cGUoQm90dG9tVHlwZSBub2RlKSA9PiBmYWxzZTsKCiAgYm9vbCB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBub2RlKSB7CiAgICByZXR1cm4gYW55VHlwZVZhcmlhYmxlcyhub2RlLnR5cGVBcmd1bWVudHMpOwogIH0KCiAgYm9vbCB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSkgewogICAgaWYgKGFueVR5cGVWYXJpYWJsZXMobm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycykpIHJldHVybiB0cnVlOwogICAgZm9yIChUeXBlUGFyYW1ldGVyIHZhcmlhYmxlIGluIG5vZGUudHlwZVBhcmFtZXRlcnMpIHsKICAgICAgaWYgKHZhcmlhYmxlLmJvdW5kLmFjY2VwdCh0aGlzKSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmb3IgKE5hbWVkVHlwZSB0eXBlIGluIG5vZGUubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgIGlmICh0eXBlLnR5cGUuYWNjZXB0KHRoaXMpKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGJvb2wgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZShUeXBlUGFyYW1ldGVyVHlwZSBub2RlKSA9PiB0cnVlOwoKICBib29sIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSkgewogICAgcmV0dXJuIGFueVR5cGVWYXJpYWJsZXMobm9kZS50eXBlQXJndW1lbnRzKTsKICB9Cn0Kg0gATU4/ASEJFBIZFRYXFRMXGxUSAUUBTQEdCRYgGh0cJiMgGyMaFSAdAUABSQEdCRgxMDksKwEjHENDISg5GTwIOgZAEwYhNjlDJTYvLAgGHT4iBhEEASsvJhJKBjAgTQYiGgEmM0QzQicnOEsaESMKCAYBIDE/Oz8oLDkfIB0bHSIaER8KCAYBIj8cKRYGARNMBgERBA8CATVATwIBUDsEGmIiKSkjIiYjNQEvMwQBSEYzRjRDNCtDPwYrL0geBgQBLz80QzQsMTFNHgYEARECAU5JETEWJxwBUTIZATQvATA0JjMwFykaBgE+Jjc5PwomOTQMCjAqST4MCiRDOgwKNwgGATArBgQBTg8pGQQCATYELUQ1FAQ4IigWDSQ3QwoIBixEJkYjLxdKCjUXUAoIBiBJRAgGBA8CAVEEUE9LIiRALUpCTTk/HiMIBiQvMgYEIwIBUQRRSk4dQyk3IkAcLSFQSSRCHwwKGio2CjghUEkkQh8MChoqNgpFLyQ+KCoyCkkxJkAqLDQMCjc3LCg7LC42DgwKCA01HUIIBiwZRSY9IyYfSgosH1AKCAYgSR1FCAYEHwIBUQRRUU9JKEAbSSIzPUo1LjAyRz8rRS9AISJHOCkwPkktEAwKNE4gRTYwCggGBBECAU8ESFBRSxcETEgfMkhCTyA4USMmJDNAMUEuKkczRBAODEszQzAsMTY5UBIQDgw5OS5FKy4zODsaURQSEA4MCisIDTZNCAYtUSc9JCYYTAosNjQKCAYhSlAIBgQQAgFKBEpLT04vBE4PJj8hOis7KCQfTTgKCAZFLT0qJitPRAwKCAYzMyg/JSgtUUYODAoIBgQRAgFRBFEcBFFRT0ktPSEkJx0PRD0cODIkDSgyRkM3MhtPCE0BH0hFGwYEEQIBQgRMJARRTU8jNUAsLwIBPQRMSx4EUU1PIzM9KRs6K0lFK0kEOD9QTEMdIQ0mOCcyPx1EKTwrCgg5IwgGBCdDKAEeIQQBEQIBNwRRHC4nQhsEAgFOHiVHGAFBI0ZMCAY/IEk/CAY+IDM6BgQCAU85IioyAgFOESE8HgE+ATAjKgYSBAE0ATQBLgEyATAxBAEuQjo0BjMvBhIEAT8BLDEEAgE3cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC90eXBlX2FsZ29yaXRobXMuZGFydD1zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvYmFzZS9yZXNvbHZlX3JlbGF0aXZlX3VyaS5kYXJ0g7wvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLyoqCiAqIFJlc29sdmUgdGhlIFtjb250YWluZWRVcmldIGFnYWluc3QgW2Jhc2VVcmldIHVzaW5nIERhcnQgcnVsZXMuCiAqCiAqIFRoaXMgZnVuY3Rpb24gYmVoYXZlcyBzaW1pbGFybHkgdG8gW1VyaS5yZXNvbHZlVXJpXSwgZXhjZXB0IHRoYXQgaXQgcHJvcGVybHkKICogaGFuZGxlcyBzaXR1YXRpb25zIGxpa2UgdGhlIGZvbGxvd2luZzoKICoKICogICAgIHJlc29sdmVSZWxhdGl2ZVVyaShkYXJ0OmNvcmUsIGJvb2wuZGFydCkgLT4gZGFydDpjb3JlL2Jvb2wuZGFydAogKiAgICAgcmVzb2x2ZVJlbGF0aXZlVXJpKHBhY2thZ2U6YS9iLmRhcnQsIC4uL2MuZGFydCkgLT4gcGFja2FnZTphL2MuZGFydAogKi8KVXJpIHJlc29sdmVSZWxhdGl2ZVVyaShVcmkgYmFzZVVyaSwgVXJpIGNvbnRhaW5lZFVyaSkgewogIGlmIChjb250YWluZWRVcmkuaXNBYnNvbHV0ZSkgewogICAgcmV0dXJuIGNvbnRhaW5lZFVyaTsKICB9CiAgU3RyaW5nIHNjaGVtZSA9IGJhc2VVcmkuc2NoZW1lOwogIC8vIGRhcnQ6Y29yZSA9PiBkYXJ0OmNvcmUvY29yZS5kYXJ0CiAgaWYgKHNjaGVtZSA9PSAnZGFydCcpIHsKICAgIFN0cmluZyBwYXJ0ID0gYmFzZVVyaS5wYXRoOwogICAgaWYgKHBhcnQuaW5kZXhPZignLycpIDwgMCkgewogICAgICBiYXNlVXJpID0gVXJpLnBhcnNlKCckc2NoZW1lOiRwYXJ0LyRwYXJ0LmRhcnQnKTsKICAgIH0KICB9CiAgcmV0dXJuIGJhc2VVcmkucmVzb2x2ZVVyaShjb250YWluZWRVcmkpOwp9Ch0ATk48AQRCA1AqA0dLBDghGQQiJhogITcGBCsCATRwYWNrYWdlOmZyb250X2VuZC9zcmMvYmFzZS9yZXNvbHZlX3JlbGF0aXZlX3VyaS5kYXJ0N3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9jb25maWd1cmF0aW9uLmRhcnSB0C8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmNvbmZpZ3VyYXRpb247CgpjbGFzcyBDb25maWd1cmF0aW9uIHsKICBmaW5hbCBpbnQgY2hhck9mZnNldDsKICBmaW5hbCBTdHJpbmcgZG90dGVkTmFtZTsKICBmaW5hbCBTdHJpbmcgY29uZGl0aW9uOwogIGZpbmFsIFN0cmluZyBpbXBvcnRVcmk7CiAgQ29uZmlndXJhdGlvbigKICAgICAgdGhpcy5jaGFyT2Zmc2V0LCB0aGlzLmRvdHRlZE5hbWUsIHRoaXMuY29uZGl0aW9uLCB0aGlzLmltcG9ydFVyaSk7Cn0KEABOTjwBHQEWGBsaGhFJAgEucGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2NvbmZpZ3VyYXRpb24uZGFydDBzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9oZWxwZXJzL3RyYWNlLmRhcnStmy8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi91dGlsL3V0aWwuZGFydCc7CgovLy8gRnVuY3Rpb24gc2lnbmF0dXJlIGZvciBbdHJhY2VdLgp0eXBlZGVmIHZvaWQgVHJhY2UoU3RyaW5nIG1lc3NhZ2UsCiAgICB7Ym9vbCBjb25kaXRpb24oU3RyaW5nIHN0YWNrVHJhY2UpLCBpbnQgbGltaXQsIGJvb2wgdGhyb3dPblByaW50fSk7CgovLy8gSGVscGVyIG1ldGhvZCBmb3IgcHJpbnRpbmcgc3RhY2sgdHJhY2VzIGZvciBkZWJ1Z2dpbmcuCi8vLwovLy8gW21lc3NhZ2VdIGlzIHByaW50ZWQgYXMgdGhlIGhlYWRlciBvZiB0aGUgc3RhY2sgdHJhY2UuCi8vLwovLy8gSWYgW2NvbmRpdGlvbl0gaXMgcHJvdmlkZWQsIHRoZSBzdGFjayB0cmFjZSBpcyBvbmx5IHByaW50ZWQgaWYgW2NvbmRpdGlvbl0KLy8vIHJldHVybnMgWzp0cnVlOl0gb24gdGhlIHN0YWNrIHRyYWNlIHRleHQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gZmlsdGVyIHRoZQovLy8gcHJpbnRlZCBzdGFjayB0cmFjZXMgYmFzZWQgb24gdGhlaXIgY29udGVudC4gRm9yIGluc3RhbmNlIG9ubHkgcHJpbnQgc3RhY2sKLy8vIHRyYWNlcyB0aGF0IGNvbnRhaW4gc3BlY2lmaWMgcGF0aHMuCi8vLwovLy8gSWYgW2xpbWl0XSBpcyBwcm92aWRlZCwgdGhlIHN0YWNrIHRyYWNlIGlzIGxpbWl0ZWQgdG8gW2xpbWl0XSBlbnRyaWVzLgovLy8KLy8vIElmIFt0aHJvd09uUHJpbnRdIGlzIGB0cnVlYCwgW21lc3NhZ2VdIHdpbGwgYmUgdGhyb3duIGFmdGVyIHRoZSBzdGFjayB0cmFjZQovLy8gaGFzIGJlZW4gcHJpbnRlZC4gVG9nZXRoZXIgd2l0aCBbY29uZGl0aW9uXSB0aGlzIGNhbiBiZSB1c2VkIHRvIGRpc2NvdmVyCi8vLyB1bmtub3duIGNhbGwtc2l0ZXMgaW4gdGVzdHMgYnkgZmlsdGVyaW5nIGtub3duIGNhbGwtc2l0ZXMgYW5kIHRocm93bmluZwovLy8gb3RoZXJ3aXNlLgpUcmFjZSBnZXQgdHJhY2UgewogIGVuYWJsZURlYnVnTW9kZSgpOwogIHJldHVybiBfdHJhY2U7Cn0KCnZvaWQgX3RyYWNlKFN0cmluZyBtZXNzYWdlLAogICAge2Jvb2wgY29uZGl0aW9uKFN0cmluZyBzdGFja1RyYWNlKSwgaW50IGxpbWl0LCBib29sIHRocm93T25QcmludDogZmFsc2V9KSB7CiAgdHJ5IHsKICAgIHRocm93ICcnOwogIH0gY2F0Y2ggKGUsIHMpIHsKICAgIFN0cmluZyBzdGFja1RyYWNlOwogICAgdHJ5IHsKICAgICAgc3RhY2tUcmFjZSA9IHByZXR0aWZ5U3RhY2tUcmFjZShzLAogICAgICAgICAgcmFuZ2VTdGFydDogMSwgcmFuZ2VFbmQ6IGxpbWl0LCBmaWxlUHJlZml4OiBzdGFja1RyYWNlRmlsZVByZWZpeCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHByaW50KGUpOwogICAgICBzdGFja1RyYWNlID0gJyRzJzsKICAgIH0KICAgIGlmIChjb25kaXRpb24gIT0gbnVsbCkgewogICAgICBpZiAoIWNvbmRpdGlvbihzdGFja1RyYWNlKSkgcmV0dXJuOwogICAgfQogICAgcHJpbnQoJyRtZXNzYWdlXG4kc3RhY2tUcmFjZScpOwogICAgaWYgKHRocm93T25QcmludCkgdGhyb3cgbWVzc2FnZTsKICB9Cn0KCi8vLyBDcmVhdGVzIGEgZnVuY3Rpb24gdG8gdXNlIGFzIGFuIGBjb25kaXRpb25gIGFyZ3VtZW50IGluIFt0cmFjZV0gdGhhdCBmaWx0ZXJzCi8vLyBzdGFjayB0cmFjZXMgdGhhdCBjb250YWlucyBhbnkgb2YgdGhlIFtleGNlcHRpb25zXS4KdHJhY2VFeGNlcHRpb25zKExpc3Q8U3RyaW5nPiBleGNlcHRpb25zKSB7CiAgcmV0dXJuIChTdHJpbmcgc3RhY2tUcmFjZSkgPT4gIWV4Y2VwdGlvbnMuYW55KHN0YWNrVHJhY2UuY29udGFpbnMpOwp9CgovLy8gRnVuY3Rpb24gc2lnbmF0dXJlIG9mIFt0cmFjZUFuZFJlcG9ydF0uCnR5cGVkZWYgdm9pZCBUcmFjZUFuZFJlcG9ydCgKICAgIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwgU3Bhbm5hYmxlIG5vZGUsIFN0cmluZyBtZXNzYWdlLAogICAge2Jvb2wgY29uZGl0aW9uKFN0cmluZyBzdGFja1RyYWNlKSwgaW50IGxpbWl0LCBib29sIHRocm93T25QcmludH0pOwoKLy8vIENhbGxzIFtyZXBvcnRIZXJlXSBhbmQgW3RyYWNlXSB3aXRoIHRoZSBzYW1lIG1lc3NhZ2UuClRyYWNlQW5kUmVwb3J0IGdldCB0cmFjZUFuZFJlcG9ydCB7CiAgZW5hYmxlRGVidWdNb2RlKCk7CiAgcmV0dXJuIF90cmFjZUFuZFJlcG9ydDsKfQoKLy8vIENhbGxzIFtyZXBvcnRIZXJlXSBhbmQgW3RyYWNlXSB3aXRoIHRoZSBzYW1lIG1lc3NhZ2UuClRyYWNlQW5kUmVwb3J0IGdldCByZXBvcnRBbmRUcmFjZSA9PiB0cmFjZUFuZFJlcG9ydDsKCi8vLyBJbXBsZW1lbnRhdGlvbiBvZiBbdHJhY2VBbmRSZXBvcnRdLgp2b2lkIF90cmFjZUFuZFJlcG9ydCgKICAgIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwgU3Bhbm5hYmxlIG5vZGUsIFN0cmluZyBtZXNzYWdlLAogICAge2Jvb2wgY29uZGl0aW9uKFN0cmluZyBzdGFja1RyYWNlKSwgaW50IGxpbWl0LCBib29sIHRocm93T25QcmludDogZmFsc2V9KSB7CiAgdHJhY2UobWVzc2FnZSwgbGltaXQ6IGxpbWl0LCB0aHJvd09uUHJpbnQ6IHRocm93T25QcmludCwKICAgICAgY29uZGl0aW9uOiAoU3RyaW5nIHN0YWNrVHJhY2UpIHsKICAgIGJvb2wgcmVzdWx0ID0gY29uZGl0aW9uICE9IG51bGwgPyBjb25kaXRpb24oc3RhY2tUcmFjZSkgOiB0cnVlOwogICAgaWYgKHJlc3VsdCkgewogICAgICByZXBvcnRIZXJlKHJlcG9ydGVyLCBub2RlLCBtZXNzYWdlKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfSk7Cn0KCi8vLyBSZXR1cm5zIHRoZSBbU3RhY2tUcmFjZUxpbmVzXSBmb3IgdGhlIGN1cnJlbnQgY2FsbCBzdGFjay4KLy8vCi8vLyBVc2UgW29mZnNldF0gdG8gZGlzY2FyZCB0aGUgZmlyc3QgW29mZnNldF0gY2FsbHMgb2YgdGhlIGNhbGwgc3RhY2suIERlZmF1bHRzCi8vLyB0byBgMWAsIHRoYXQgaXMsIGRpc2NhcmQgdGhlIGNhbGwgdG8gW3N0YWNrVHJhY2VdIGl0c2VsZi4gVXNlIFtsaW1pdF0gdG8KLy8vIGxpbWl0IHRoZSBsZW5ndGggb2YgdGhlIHN0YWNrIHRyYWNlIGxpbmVzLgpTdGFja1RyYWNlTGluZXMgc3RhY2tUcmFjZSh7aW50IG9mZnNldDogMSwgaW50IGxpbWl0OiBudWxsfSkgewogIGludCByYW5nZVN0YXJ0ID0gb2Zmc2V0OwogIGludCByYW5nZUVuZCA9IGxpbWl0ID09IG51bGwgPyBudWxsIDogcmFuZ2VTdGFydCArIGxpbWl0OwogIHRyeSB7CiAgICB0aHJvdyAnJzsKICB9IGNhdGNoIChfLCBzdGFja1RyYWNlKSB7CiAgICByZXR1cm4gbmV3IFN0YWNrVHJhY2VMaW5lcy5mcm9tVHJhY2Uoc3RhY2tUcmFjZSwKICAgICAgICByYW5nZVN0YXJ0OiBvZmZzZXQsCiAgICAgICAgcmFuZ2VFbmQ6IHJhbmdlRW5kLAogICAgICAgIGZpbGVQcmVmaXg6IHN0YWNrVHJhY2VGaWxlUHJlZml4KTsKICB9Cn0KCi8vLyBBIHN0YWNrIHRyYWNlIGFzIGEgc2VxdWVuY2Ugb2YgW1N0YWNrVHJhY2VMaW5lXXMuCmNsYXNzIFN0YWNrVHJhY2VMaW5lcyB7CiAgZmluYWwgTGlzdDxTdGFja1RyYWNlTGluZT4gbGluZXM7CiAgZmluYWwgaW50IG1heEZpbGVMZW5ndGg7CiAgZmluYWwgaW50IG1heExpbmVOb0xlbmd0aDsKICBmaW5hbCBpbnQgbWF4Q29sdW1uTm9MZW5ndGg7CgogIGZhY3RvcnkgU3RhY2tUcmFjZUxpbmVzLmZyb21UcmFjZShTdGFja1RyYWNlIHMsCiAgICAgIHtpbnQgcmFuZ2VTdGFydCwgaW50IHJhbmdlRW5kLCBTdHJpbmcgZmlsZVByZWZpeCwgU3RyaW5nIGxhbWJkYTogcic/J30pIHsKICAgIGZpbmFsIFJlZ0V4cCBpbmRleFBhdHRlcm4gPSBuZXcgUmVnRXhwKHInI1xkK1xzKicpOwogICAgaW50IGluZGV4ID0gLTE7CiAgICBpbnQgbWF4RmlsZUxlbmd0aCA9IDA7CiAgICBpbnQgbWF4TGluZU5vTGVuZ3RoID0gMDsKICAgIGludCBtYXhDb2x1bW5Ob0xlbmd0aCA9IDA7CgogICAgU3RyaW5nIHN0YWNrVHJhY2UgPSAnJHMnOwogICAgTGlzdDxTdGFja1RyYWNlTGluZT4gbGluZXMgPSA8U3RhY2tUcmFjZUxpbmU+W107CiAgICAvLyBQYXJzZSBlYWNoIGxpbmUgaW4gdGhlIHN0YWNrIHRyYWNlLiBUaGUgc3VwcG9ydGVkIGxpbmUgZm9ybWF0cyBmcm9tIHRoZQogICAgLy8gRGFydCBWTSBhcmU6CiAgICAvLyAgICAjbiAgICAgPG1ldGhvZC1uYW1lPiAoPHVyaT46PGxpbmUtbm8+Ojxjb2x1bW4tbm8+KQogICAgLy8gICAgI24gICAgIDxtZXRob2QtbmFtZT4gKDx1cmk+OjxsaW5lLW5vPikKICAgIC8vICAgICNuICAgICA8bWV0aG9kLW5hbWU+ICg8dXJpPikKICAgIC8vIGluIHdoaWNoICc8YW5vbnltb3VzIGNsb3N1cmU+JyBpcyB0aGUgbmFtZSB1c2VkIGZvciBhbiAodW5uYW1lZCkgZnVuY3Rpb24KICAgIC8vIGV4cHJlc3Npb24uIFRoZSBsYXN0IGNhc2UgaXMgdXNlZCBmb3IgYXN5bmMgYm9kaWVzLgogICAgZm9yIChTdHJpbmcgbGluZSBpbiBzdGFja1RyYWNlLnNwbGl0KCdcbicpKSB7CiAgICAgIHRyeSB7CiAgICAgICAgaW5kZXgrKzsKICAgICAgICBpZiAocmFuZ2VTdGFydCAhPSBudWxsICYmIGluZGV4IDwgcmFuZ2VTdGFydCkgY29udGludWU7CiAgICAgICAgaWYgKHJhbmdlRW5kICE9IG51bGwgJiYgaW5kZXggPiByYW5nZUVuZCkgYnJlYWs7CiAgICAgICAgaWYgKGxpbmUuaXNFbXB0eSkgY29udGludWU7CgogICAgICAgIC8vIFN0cmlwIGluZGV4LgogICAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2VGaXJzdChpbmRleFBhdHRlcm4sICcnKTsKICAgICAgICBpZiAobGluZSA9PSAnPGFzeW5jaHJvbm91cyBzdXNwZW5zaW9uPicpIHsKICAgICAgICAgIGxpbmVzLmFkZChuZXcgU3RhY2tUcmFjZUxpbmUoaW5kZXgsICcnLCAnJywgJycsIGxpbmUpKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgaW50IGxlZnRQYXJlblBvcyA9IGxpbmUuaW5kZXhPZignKCcpOwogICAgICAgIGludCByaWdodFBhcmVuUG9zID0gbGluZS5pbmRleE9mKCcpJywgbGVmdFBhcmVuUG9zKTsKICAgICAgICBpbnQgbGFzdENvbG9uID0gbGluZS5sYXN0SW5kZXhPZignOicsIHJpZ2h0UGFyZW5Qb3MpOwogICAgICAgIGludCBuZXh0VG9MYXN0Q29sb24gPSBsaW5lLmxhc3RJbmRleE9mKCc6JywgbGFzdENvbG9uIC0gMSk7CgogICAgICAgIFN0cmluZyBsaW5lTm87CiAgICAgICAgU3RyaW5nIGNvbHVtbk5vOwogICAgICAgIGlmIChuZXh0VG9MYXN0Q29sb24gIT0gLTEpIHsKICAgICAgICAgIGxpbmVObyA9IGxpbmUuc3Vic3RyaW5nKG5leHRUb0xhc3RDb2xvbiArIDEsIGxhc3RDb2xvbik7CiAgICAgICAgICBjb2x1bW5ObyA9IGxpbmUuc3Vic3RyaW5nKGxhc3RDb2xvbiArIDEsIHJpZ2h0UGFyZW5Qb3MpOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaW50LnBhcnNlKGNvbHVtbk5vKTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBpbnQucGFyc2UobGluZU5vKTsKICAgICAgICAgICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gewogICAgICAgICAgICAgIC8vIE9ubHkgbGluZSBudW1iZXIuCiAgICAgICAgICAgICAgbGluZU5vID0gY29sdW1uTm87CiAgICAgICAgICAgICAgY29sdW1uTm8gPSAnJzsKICAgICAgICAgICAgICBuZXh0VG9MYXN0Q29sb24gPSBsYXN0Q29sb247CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gb24gRm9ybWF0RXhjZXB0aW9uIHsKICAgICAgICAgICAgLy8gTm8gY29sdW1uIG51bWJlciBub3IgbGluZSBudW1iZXIuCiAgICAgICAgICAgIGxpbmVObyA9ICcnOwogICAgICAgICAgICBjb2x1bW5ObyA9ICcnOwogICAgICAgICAgICBuZXh0VG9MYXN0Q29sb24gPSByaWdodFBhcmVuUG9zOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsaW5lTm8gPSBsaW5lLnN1YnN0cmluZyhsYXN0Q29sb24gKyAxLCByaWdodFBhcmVuUG9zKTsKICAgICAgICAgIGNvbHVtbk5vID0gJyc7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBpbnQucGFyc2UobGluZU5vKTsKICAgICAgICAgICAgbmV4dFRvTGFzdENvbG9uID0gbGFzdENvbG9uOwogICAgICAgICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gewogICAgICAgICAgICAvLyBObyBjb2x1bW4gbnVtYmVyIG5vciBsaW5lIG51bWJlci4KICAgICAgICAgICAgbGluZU5vID0gY29sdW1uTm87CiAgICAgICAgICAgIGNvbHVtbk5vID0gJyc7CiAgICAgICAgICAgIG5leHRUb0xhc3RDb2xvbiA9IHJpZ2h0UGFyZW5Qb3M7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAobGluZU5vLmxlbmd0aCA+IG1heExpbmVOb0xlbmd0aCkgewogICAgICAgICAgbWF4TGluZU5vTGVuZ3RoID0gbGluZU5vLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgaWYgKGNvbHVtbk5vLmxlbmd0aCA+IG1heENvbHVtbk5vTGVuZ3RoKSB7CiAgICAgICAgICBtYXhDb2x1bW5Ob0xlbmd0aCA9IGNvbHVtbk5vLmxlbmd0aDsKICAgICAgICB9CgogICAgICAgIFN0cmluZyBmaWxlID0gbGluZS5zdWJzdHJpbmcobGVmdFBhcmVuUG9zICsgMSwgbmV4dFRvTGFzdENvbG9uKTsKICAgICAgICBpZiAoZmlsZVByZWZpeCAhPSBudWxsICYmIGZpbGUuc3RhcnRzV2l0aChmaWxlUHJlZml4KSkgewogICAgICAgICAgZmlsZSA9IGZpbGUuc3Vic3RyaW5nKGZpbGVQcmVmaXgubGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgaWYgKGZpbGUubGVuZ3RoID4gbWF4RmlsZUxlbmd0aCkgewogICAgICAgICAgbWF4RmlsZUxlbmd0aCA9IGZpbGUubGVuZ3RoOwogICAgICAgIH0KICAgICAgICBTdHJpbmcgbWV0aG9kID0gbGluZS5zdWJzdHJpbmcoMCwgbGVmdFBhcmVuUG9zIC0gMSk7CiAgICAgICAgaWYgKGxhbWJkYSAhPSBudWxsKSB7CiAgICAgICAgICBtZXRob2QgPSBtZXRob2QucmVwbGFjZUFsbCgnPGFub255bW91cyBjbG9zdXJlPicsIGxhbWJkYSk7CiAgICAgICAgfQogICAgICAgIGxpbmVzLmFkZChuZXcgU3RhY2tUcmFjZUxpbmUoaW5kZXgsIGZpbGUsIGxpbmVObywgY29sdW1uTm8sIG1ldGhvZCkpOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgdGhyb3cgJ0Vycm9yIHByZXR0aWZ5aW5nICIkbGluZSI6ICRlJzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBTdGFja1RyYWNlTGluZXMuZnJvbUxpbmVzKAogICAgICAgIGxpbmVzLCBtYXhGaWxlTGVuZ3RoLCBtYXhMaW5lTm9MZW5ndGgsIG1heENvbHVtbk5vTGVuZ3RoKTsKICB9CgogIFN0YWNrVHJhY2VMaW5lcy5mcm9tTGluZXModGhpcy5saW5lcywgdGhpcy5tYXhGaWxlTGVuZ3RoLAogICAgICB0aGlzLm1heExpbmVOb0xlbmd0aCwgdGhpcy5tYXhDb2x1bW5Ob0xlbmd0aCk7CgogIFN0YWNrVHJhY2VMaW5lcyBzdWJ0cmFjZShpbnQgb2Zmc2V0KSB7CiAgICByZXR1cm4gbmV3IFN0YWNrVHJhY2VMaW5lcy5mcm9tTGluZXMobGluZXMuc3VibGlzdChvZmZzZXQpLCBtYXhGaWxlTGVuZ3RoLAogICAgICAgIG1heExpbmVOb0xlbmd0aCwgbWF4Q29sdW1uTm9MZW5ndGgpOwogIH0KCiAgU3RyaW5nIHByZXR0aWZ5KHtib29sIHNob3dDb2x1bW5ObzogZmFsc2UsIGJvb2wgc2hvd0RvdHM6IHRydWV9KSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBib29sIGRvdHMgPSB0cnVlOwogICAgZm9yIChTdGFja1RyYWNlTGluZSBsaW5lIGluIGxpbmVzKSB7CiAgICAgIHNiLndyaXRlKCcgICcpOwogICAgICBsaW5lLnByaW50T24oc2IsCiAgICAgICAgICBmaWxlTGVuZ3RoOiBtYXhGaWxlTGVuZ3RoLAogICAgICAgICAgcGFkZGluZzogc2hvd0RvdHMgJiYgZG90cyA/ICcgLicgOiAnICcsCiAgICAgICAgICBsaW5lTm9MZW5ndGg6IG1heExpbmVOb0xlbmd0aCwKICAgICAgICAgIHNob3dDb2x1bW5Obzogc2hvd0NvbHVtbk5vLAogICAgICAgICAgY29sdW1uTm9MZW5ndGg6IG1heENvbHVtbk5vTGVuZ3RoKTsKCiAgICAgIGRvdHMgPSAhZG90czsKICAgIH0KICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuIHByZXR0aWZ5KCk7CiAgfQp9CgovLy8gQSBwYXJzZWQgbGluZSBmcm9tIGEgc3RhY2sgdHJhY2UuCmNsYXNzIFN0YWNrVHJhY2VMaW5lIHsKICBmaW5hbCBpbnQgaW5kZXg7CiAgZmluYWwgU3RyaW5nIGZpbGU7CiAgZmluYWwgU3RyaW5nIGxpbmVObzsKICBmaW5hbCBTdHJpbmcgY29sdW1uTm87CiAgZmluYWwgU3RyaW5nIG1ldGhvZDsKCiAgU3RhY2tUcmFjZUxpbmUoCiAgICAgIHRoaXMuaW5kZXgsIHRoaXMuZmlsZSwgdGhpcy5saW5lTm8sIHRoaXMuY29sdW1uTm8sIHRoaXMubWV0aG9kKTsKCiAgdm9pZCBwcmludE9uKFN0cmluZ0J1ZmZlciBzYiwKICAgICAge1N0cmluZyBwYWRkaW5nOiAnICcsCiAgICAgIGludCBmaWxlTGVuZ3RoLAogICAgICBpbnQgbGluZU5vTGVuZ3RoLAogICAgICBpbnQgY29sdW1uTm9MZW5ndGgsCiAgICAgIGJvb2wgc2hvd0NvbHVtbk5vOiBmYWxzZX0pIHsKICAgIFN0cmluZyBmaWxlVGV4dCA9ICcke2ZpbGV9ICc7CiAgICBpZiAoZmlsZUxlbmd0aCAhPSBudWxsKSB7CiAgICAgIGZpbGVUZXh0ID0gcGFkKGZpbGVUZXh0LCBmaWxlTGVuZ3RoLCBkb3RzOiBwYWRkaW5nKTsKICAgIH0KICAgIFN0cmluZyBsaW5lTm9UZXh0ID0gbGluZU5vOwogICAgaWYgKGxpbmVOb0xlbmd0aCAhPSBudWxsKSB7CiAgICAgIGxpbmVOb1RleHQgPSBwYWQobGluZU5vVGV4dCwgbGluZU5vTGVuZ3RoLCBwYWRMZWZ0OiB0cnVlKTsKICAgIH0KICAgIFN0cmluZyBjb2x1bW5Ob1RleHQgPSBzaG93Q29sdW1uTm8gPyAnJyA6IGNvbHVtbk5vOwogICAgaWYgKGNvbHVtbk5vTGVuZ3RoICE9IG51bGwpIHsKICAgICAgY29sdW1uTm9UZXh0ID0gJzoke3BhZChjb2x1bW5Ob1RleHQsIGNvbHVtbk5vTGVuZ3RoKX0nOwogICAgfQogICAgc2Iud3JpdGUoJyRmaWxlVGV4dCAkbGluZU5vVGV4dCRjb2x1bW5Ob1RleHQgJG1ldGhvZFxuJyk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIHJldHVybiAxMyAqIGluZGV4ICsKICAgICAgICAxNyAqIGZpbGUuaGFzaENvZGUgKwogICAgICAgIDE5ICogbGluZU5vLmhhc2hDb2RlICsKICAgICAgICAyMyAqIGNvbHVtbk5vLmhhc2hDb2RlICsKICAgICAgICAyOSAqIG1ldGhvZC5oYXNoQ29kZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgU3RhY2tUcmFjZUxpbmUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBpbmRleCA9PSBvdGhlci5pbmRleCAmJgogICAgICAgIGZpbGUgPT0gb3RoZXIuZmlsZSAmJgogICAgICAgIGxpbmVObyA9PSBvdGhlci5saW5lTm8gJiYKICAgICAgICBjb2x1bW5ObyA9PSBvdGhlci5jb2x1bW5ObyAmJgogICAgICAgIG1ldGhvZCA9PSBvdGhlci5tZXRob2Q7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiJG1ldGhvZCBAICRmaWxlIFskbGluZU5vOiRjb2x1bW5Ob10iOwp9CgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2UgdGhpcyBmb3JtYXQgZm9yIC0tdGhyb3ctb24tZXJyb3IuCi8vLyBDb252ZXJ0cyB0aGUgbm9ybWFsIFZNIHN0YWNrIHRyYWNlIGludG8gYSBtb3JlIGNvbXBhY3QgYW5kIHJlYWRhYmxlIGZvcm1hdC4KLy8vCi8vLyBUaGUgb3V0cHV0IGZvcm1hdCBpcyBgPGZpbGU+IC4gLiAuIDxsaW5lTm8+Ojxjb2x1bW5Obz4gPG1ldGhvZD5gIHdoZXJlCi8vLyBgPGZpbGU+YCBpcyBmaWxlIG5hbWUsIGA8bGluZU5vPmAgaXMgdGhlIGxpbmUgbnVtYmVyLCBgPGNvbHVtbk5vPmAgaXMgdGhlCi8vLyBjb2x1bW4gbnVtYmVyLCBhbmQgYDxtZXRob2Q+YCBpcyB0aGUgbWV0aG9kIG5hbWUuCi8vLwovLy8gSWYgW3JhbmdlU3RhcnRdIGFuZC9vciBbcmFuZ2VFbmRdIGFyZSBwcm92aWRlZCwgb25seSB0aGUgbGluZXMgd2l0aGluIHRoZQovLy8gcmFuZ2UgYXJlIGluY2x1ZGVkLgovLy8gSWYgW3Nob3dDb2x1bW5Ob10gaXMgYGZhbHNlYCwgdGhlIGA6PGNvbHVtbk5vPmAgcGFydCBpcyBvbWl0dGVkLgovLy8gSWYgW3Nob3dEb3RzXSBpcyBgdHJ1ZWAsIHRoZSBzcGFjZSBiZXR3ZWVuIGA8ZmlsZT5gIGFuZCBgPGxpbmVObz5gIGlzIHBhZGRlZAovLy8gd2l0aCBkb3RzIG9uIGV2ZXJ5IG90aGVyIGxpbmUuCi8vLyBJZiBbZmlsZVByZWZpeF0gaXMgcHJvdmlkZWQsIHRoZW4gZm9yICBldmVyeSBmaWxlIG5hbWUgdGhhdHMgc3RhcnRzIHdpdGgKLy8vIFtmaWxlUHJlZml4XSBvbmx5IHRoZSByZW1haW5kZXIgaXMgcHJpbnRlZC4KLy8vIElmIFtsYW1iZGFdIGlzIG5vbi1udWxsLCBhbm9ueW1vdXMgY2xvc3VyZXMgYXJlIHByaW50ZWQgYXMgW2xhbWJkYV0uClN0cmluZyBwcmV0dGlmeVN0YWNrVHJhY2UoU3RhY2tUcmFjZSBzdGFja1RyYWNlLAogICAge2ludCByYW5nZVN0YXJ0LAogICAgaW50IHJhbmdlRW5kLAogICAgYm9vbCBzaG93Q29sdW1uTm86IGZhbHNlLAogICAgYm9vbCBzaG93RG90czogdHJ1ZSwKICAgIFN0cmluZyBmaWxlUHJlZml4LAogICAgU3RyaW5nIGxhbWJkYTogcic/J30pIHsKICByZXR1cm4gbmV3IFN0YWNrVHJhY2VMaW5lcy5mcm9tVHJhY2Uoc3RhY2tUcmFjZSwKICAgICAgICAgIHJhbmdlU3RhcnQ6IHJhbmdlU3RhcnQsCiAgICAgICAgICByYW5nZUVuZDogcmFuZ2VFbmQsCiAgICAgICAgICBmaWxlUHJlZml4OiBmaWxlUHJlZml4LAogICAgICAgICAgbGFtYmRhOiBsYW1iZGEpCiAgICAgIC5wcmV0dGlmeShzaG93Q29sdW1uTm86IHNob3dDb2x1bW5Obywgc2hvd0RvdHM6IHNob3dEb3RzKTsKfQoKLy8vIFBhZHMgKG9yIHRydW5jYXRlcykgW3RleHRdIHRvIHRoZSBbaW50ZW5kZWRMZW5ndGhdLgovLy8KLy8vIElmIFtwYWRMZWZ0XSBpcyBbOnRydWU6XSB0aGUgdGV4dCBpcyBwYWRkaW5nIGluc2VydGVkIHRvIHRoZSBsZWZ0IG9mIFt0ZXh0XS4KLy8vIEEgcmVwZXRpdGlvbiBvZiB0aGUgW2RvdHNdIHRleHQgaXMgdXNlZCBmb3IgcGFkZGluZy4KU3RyaW5nIHBhZChTdHJpbmcgdGV4dCwgaW50IGludGVuZGVkTGVuZ3RoLAogICAge2Jvb2wgcGFkTGVmdDogZmFsc2UsIFN0cmluZyBkb3RzOiAnICd9KSB7CiAgaWYgKHRleHQubGVuZ3RoID09IGludGVuZGVkTGVuZ3RoKSByZXR1cm4gdGV4dDsKICBpZiAodGV4dC5sZW5ndGggPiBpbnRlbmRlZExlbmd0aCkgcmV0dXJuIHRleHQuc3Vic3RyaW5nKDAsIGludGVuZGVkTGVuZ3RoKTsKICBpZiAoZG90cyA9PSBudWxsIHx8IGRvdHMuaXNFbXB0eSkgZG90cyA9ICcgJzsKICBpbnQgZG90c0xlbmd0aCA9IGRvdHMubGVuZ3RoOwogIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICBpZiAoIXBhZExlZnQpIHsKICAgIHNiLndyaXRlKHRleHQpOwogIH0KICBmb3IgKGludCBpbmRleCA9IHRleHQubGVuZ3RoOyBpbmRleCA8IGludGVuZGVkTGVuZ3RoOyBpbmRleCsrKSB7CiAgICBpbnQgZG90c0luZGV4ID0gaW5kZXggJSBkb3RzTGVuZ3RoOwogICAgc2Iud3JpdGUoZG90cy5zdWJzdHJpbmcoZG90c0luZGV4LCBkb3RzSW5kZXggKyAxKSk7CiAgfQogIGlmIChwYWRMZWZ0KSB7CiAgICBzYi53cml0ZSh0ZXh0KTsKICB9CiAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Cn0KgV8ATk48ARkcASQjSAE7BDsET01PKARLBFBNTA8SFRECARxQCA4TFwopTRIQGQYdKgYkJQQCAVE4K0YCASwdQUgBOiQVGgIBOjUBKBZBUDsnRBIrBhMGAgE+BFFNLz8bPAgOHDUcHCsEAgE2GCQbHR8BMlA4FBsdHwEeNU8UPTEnUTsyDBFAOSQBGDQzQhQKAS49PkQBFxklQ0MQIRIhIyMhHSsOITEZGy0MEUEZEB8pITEfGy0MCgEvKwozLwoBSUE0CisnCj0eRQpOFC8IBipDBAE8NQEpTy0EAUUqFikWFyUyKSYuARQGGgQBDBYXBAIBJhcTFRcZFwESRwEgHBYYGiMiHjsGICBBBjgiPgY+BAEMFRgdHyEeBAEMHC0wIx4iJiAEAQw+AgE+UARLTjYEThhFUSNNMEkxFRIeGRccMyIeIhpBAgE4BFE5LC8yTjAgKBIUBEMoOAQRFAQYAgEncGFja2FnZTpjb21waWxlci9zcmMvaGVscGVycy90cmFjZS5kYXJ0O3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2hlbHBlcnMvZGVidWdfY29sbGVjdGlvbi5kYXJ0r7wvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKdHlwZWRlZiB2b2lkIERlYnVnQ2FsbGJhY2soU3RyaW5nIG1ldGhvZE5hbWUsIHZhciBhcmcxLCB2YXIgYXJnMik7CgpjbGFzcyBEZWJ1Z01hcDxLLCBWPiBpbXBsZW1lbnRzIE1hcDxLLCBWPiB7CiAgZmluYWwgTWFwPEssIFY+IHNvdXJjZU1hcDsKICBEZWJ1Z0NhbGxiYWNrIGluZGV4U2V0Q2FsbGJhY2s7CiAgRGVidWdDYWxsYmFjayBwdXRJZkFic2VudENhbGxiYWNrOwogIERlYnVnQ2FsbGJhY2sgcmVtb3ZlQ2FsbGJhY2s7CgogIERlYnVnTWFwKHRoaXMuc291cmNlTWFwLCB7RGVidWdDYWxsYmFjayBhZGRDYWxsYmFjaywgdGhpcy5yZW1vdmVDYWxsYmFja30pIHsKICAgIGlmIChhZGRDYWxsYmFjayAhPSBudWxsKSB7CiAgICAgIHRoaXMuYWRkQ2FsbGJhY2sgPSBhZGRDYWxsYmFjazsKICAgIH0KICB9CgogIHZvaWQgc2V0IGFkZENhbGxiYWNrKERlYnVnQ2FsbGJhY2sgdmFsdWUpIHsKICAgIGluZGV4U2V0Q2FsbGJhY2sgPSB2YWx1ZTsKICAgIHB1dElmQWJzZW50Q2FsbGJhY2sgPSB2YWx1ZTsKICB9CgogIEBvdmVycmlkZQogIE1hcDxSSywgUlY+IGNhc3Q8UkssIFJWPigpID0+IE1hcC5jYXN0RnJvbTxLLCBWLCBSSywgUlY+KHRoaXMpOwogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsKICAgIHJldHVybiBzb3VyY2VNYXAuY29udGFpbnNWYWx1ZSh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpID0+IHNvdXJjZU1hcC5jb250YWluc0tleShrZXkpOwoKICBAb3ZlcnJpZGUKICBWIG9wZXJhdG9yIFtdKE9iamVjdCBrZXkpID0+IHNvdXJjZU1hcFtrZXldOwoKICBAb3ZlcnJpZGUKICB2b2lkIG9wZXJhdG9yIFtdPShLIGtleSwgViB2YWx1ZSkgewogICAgaWYgKGluZGV4U2V0Q2FsbGJhY2sgIT0gbnVsbCkgewogICAgICBpbmRleFNldENhbGxiYWNrKCdbXT0nLCBrZXksIHZhbHVlKTsKICAgIH0KICAgIHNvdXJjZU1hcFtrZXldID0gdmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICBWIHB1dElmQWJzZW50KEsga2V5LCBWIGlmQWJzZW50KCkpIHsKICAgIHJldHVybiBzb3VyY2VNYXAucHV0SWZBYnNlbnQoa2V5LCAoKSB7CiAgICAgIFYgdiA9IGlmQWJzZW50KCk7CiAgICAgIGlmIChwdXRJZkFic2VudENhbGxiYWNrICE9IG51bGwpIHsKICAgICAgICBwdXRJZkFic2VudENhbGxiYWNrKCdwdXRJZkFic2VudCcsIGtleSwgdik7CiAgICAgIH0KICAgICAgcmV0dXJuIHY7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWRkQWxsKE1hcDxLLCBWPiBvdGhlcikgPT4gc291cmNlTWFwLmFkZEFsbChvdGhlcik7CgogIEBvdmVycmlkZQogIFYgcmVtb3ZlKE9iamVjdCBrZXkpIHsKICAgIGlmIChyZW1vdmVDYWxsYmFjayAhPSBudWxsKSB7CiAgICAgIHJlbW92ZUNhbGxiYWNrKCdyZW1vdmUnLCBrZXksIHNvdXJjZU1hcFtrZXldKTsKICAgIH0KICAgIHJldHVybiBzb3VyY2VNYXAucmVtb3ZlKGtleSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNsZWFyKCkgewogICAgaWYgKHJlbW92ZUNhbGxiYWNrICE9IG51bGwpIHsKICAgICAgcmVtb3ZlQ2FsbGJhY2soJ2NsZWFyJywgc291cmNlTWFwLCBudWxsKTsKICAgIH0KICAgIHNvdXJjZU1hcC5jbGVhcigpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihLIGtleSwgViB2YWx1ZSkpID0+IHNvdXJjZU1hcC5mb3JFYWNoKGYpOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxLPiBnZXQga2V5cyA9PiBzb3VyY2VNYXAua2V5czsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Vj4gZ2V0IHZhbHVlcyA9PiBzb3VyY2VNYXAudmFsdWVzOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxNYXBFbnRyeTxLLCBWPj4gZ2V0IGVudHJpZXMgPT4gc291cmNlTWFwLmVudHJpZXM7CgogIEBvdmVycmlkZQogIHZvaWQgYWRkRW50cmllcyhJdGVyYWJsZTxNYXBFbnRyeTxLLCBWPj4gZW50cmllcykgewogICAgc291cmNlTWFwLmFkZEVudHJpZXMoZW50cmllcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBNYXA8SzIsIFYyPiBtYXA8SzIsIFYyPihNYXBFbnRyeTxLMiwgVjI+IHRyYW5zZm9ybShLIGtleSwgViB2YWx1ZSkpID0+CiAgICAgIHNvdXJjZU1hcC5tYXAodHJhbnNmb3JtKTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsZW5ndGggPT4gc291cmNlTWFwLmxlbmd0aDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBzb3VyY2VNYXAuaXNFbXB0eTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBzb3VyY2VNYXAuaXNOb3RFbXB0eTsKCiAgQG92ZXJyaWRlCiAgViB1cGRhdGUoSyBrZXksIFYgdXBkYXRlKFYgdmFsdWUpLCB7ViBpZkFic2VudCgpfSkgPT4KICAgICAgc291cmNlTWFwLnVwZGF0ZShrZXksIHVwZGF0ZSwgaWZBYnNlbnQ6IGlmQWJzZW50KTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB1cGRhdGVBbGwoViB1cGRhdGUoSyBrZXksIFYgdmFsdWUpKSB7CiAgICBzb3VyY2VNYXAudXBkYXRlQWxsKHVwZGF0ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChLIGtleSwgViB2YWx1ZSkpIHsKICAgIHNvdXJjZU1hcC5yZW1vdmVXaGVyZSh0ZXN0KTsKICB9Cn0KCmNsYXNzIERlYnVnSXRlcmFibGU8RT4gaW1wbGVtZW50cyBJdGVyYWJsZTxFPiB7CiAgZmluYWwgSXRlcmFibGU8RT4gaXRlcmFibGU7CgogIERlYnVnSXRlcmFibGUodGhpcy5pdGVyYWJsZSk7CgogIEBvdmVycmlkZQogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciA9PiBpdGVyYWJsZS5pdGVyYXRvcjsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Uj4gY2FzdDxSPigpID0+IEl0ZXJhYmxlLmNhc3RGcm9tPEUsIFI+KHRoaXMpOwogIEBvdmVycmlkZQogIEl0ZXJhYmxlPFQ+IG1hcDxUPihUIGYoRSBlbGVtZW50KSkgPT4gaXRlcmFibGUubWFwKGYpOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxFPiB3aGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gaXRlcmFibGUud2hlcmUodGVzdCk7CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPFQ+IGV4cGFuZDxUPihJdGVyYWJsZTxUPiBmKEUgZWxlbWVudCkpID0+IGl0ZXJhYmxlLmV4cGFuZChmKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWlucyhPYmplY3QgZWxlbWVudCkgPT4gaXRlcmFibGUuY29udGFpbnMoZWxlbWVudCk7CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaCh2b2lkIGYoRSBlbGVtZW50KSkgPT4gaXRlcmFibGUuZm9yRWFjaChmKTsKCiAgQG92ZXJyaWRlCiAgRSByZWR1Y2UoRSBjb21iaW5lKEUgdmFsdWUsIEUgZWxlbWVudCkpID0+IGl0ZXJhYmxlLnJlZHVjZShjb21iaW5lKTsKCiAgQG92ZXJyaWRlCiAgVCBmb2xkPFQ+KFQgaW5pdGlhbFZhbHVlLCBUIGNvbWJpbmUoVCBwcmV2aW91c1ZhbHVlLCBFIGVsZW1lbnQpKSB7CiAgICByZXR1cm4gaXRlcmFibGUuZm9sZChpbml0aWFsVmFsdWUsIGNvbWJpbmUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBldmVyeShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gaXRlcmFibGUuZXZlcnkodGVzdCk7CgogIEBvdmVycmlkZQogIFN0cmluZyBqb2luKFtTdHJpbmcgc2VwYXJhdG9yID0gIiJdKSA9PiBpdGVyYWJsZS5qb2luKHNlcGFyYXRvcik7CgogIEBvdmVycmlkZQogIGJvb2wgYW55KGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBpdGVyYWJsZS5hbnkodGVzdCk7CgogIEBvdmVycmlkZQogIExpc3Q8RT4gdG9MaXN0KHtib29sIGdyb3dhYmxlOiB0cnVlfSkgewogICAgcmV0dXJuIGl0ZXJhYmxlLnRvTGlzdChncm93YWJsZTogZ3Jvd2FibGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU2V0PEU+IHRvU2V0KCkgPT4gaXRlcmFibGUudG9TZXQoKTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsZW5ndGggPT4gaXRlcmFibGUubGVuZ3RoOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0VtcHR5ID0+IGl0ZXJhYmxlLmlzRW1wdHk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gaXRlcmFibGUuaXNOb3RFbXB0eTsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8RT4gdGFrZShpbnQgbikgPT4gaXRlcmFibGUudGFrZShuKTsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8RT4gdGFrZVdoaWxlKGJvb2wgdGVzdChFIHZhbHVlKSkgPT4gaXRlcmFibGUudGFrZVdoaWxlKHRlc3QpOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxFPiBza2lwKGludCBuKSA9PiBpdGVyYWJsZS5za2lwKG4pOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxFPiBza2lwV2hpbGUoYm9vbCB0ZXN0KEUgdmFsdWUpKSA9PiBpdGVyYWJsZS5za2lwV2hpbGUodGVzdCk7CgogIEBvdmVycmlkZQogIEUgZ2V0IGZpcnN0ID0+IGl0ZXJhYmxlLmZpcnN0OwoKICBAb3ZlcnJpZGUKICBFIGdldCBsYXN0ID0+IGl0ZXJhYmxlLmxhc3Q7CgogIEBvdmVycmlkZQogIEUgZ2V0IHNpbmdsZSA9PiBpdGVyYWJsZS5zaW5nbGU7CgogIEBvdmVycmlkZQogIEUgZmlyc3RXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwge0Ugb3JFbHNlKCl9KSB7CiAgICByZXR1cm4gaXRlcmFibGUuZmlyc3RXaGVyZSh0ZXN0LCBvckVsc2U6IG9yRWxzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFIGxhc3RXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwge0Ugb3JFbHNlKCl9KSB7CiAgICByZXR1cm4gaXRlcmFibGUubGFzdFdoZXJlKHRlc3QsIG9yRWxzZTogb3JFbHNlKTsKICB9CgogIEBvdmVycmlkZQogIEUgc2luZ2xlV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIHtFIG9yRWxzZSgpfSkgPT4KICAgICAgaXRlcmFibGUuc2luZ2xlV2hlcmUodGVzdCwgb3JFbHNlOiBvckVsc2UpOwoKICBAb3ZlcnJpZGUKICBFIGVsZW1lbnRBdChpbnQgaW5kZXgpID0+IGl0ZXJhYmxlLmVsZW1lbnRBdChpbmRleCk7CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPEU+IGZvbGxvd2VkQnkoSXRlcmFibGU8RT4gb3RoZXIpID0+IGl0ZXJhYmxlLmZvbGxvd2VkQnkob3RoZXIpOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxUPiB3aGVyZVR5cGU8VD4oKSA9PiBpdGVyYWJsZS53aGVyZVR5cGU8VD4oKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gaXRlcmFibGUudG9TdHJpbmcoKTsKfQoKY2xhc3MgRGVidWdMaXN0PEU+IGV4dGVuZHMgRGVidWdJdGVyYWJsZTxFPiBpbXBsZW1lbnRzIExpc3Q8RT4gewogIERlYnVnQ2FsbGJhY2sgYWRkQ2FsbGJhY2s7CiAgRGVidWdDYWxsYmFjayBhZGRBbGxDYWxsYmFjazsKCiAgRGVidWdMaXN0KExpc3Q8RT4gbGlzdCwge3RoaXMuYWRkQ2FsbGJhY2ssIHRoaXMuYWRkQWxsQ2FsbGJhY2t9KQogICAgICA6IHN1cGVyKGxpc3QpOwoKICBMaXN0PEU+IGdldCBsaXN0ID0+IGl0ZXJhYmxlOwoKICBAb3ZlcnJpZGUKICBMaXN0PFI+IGNhc3Q8Uj4oKSA9PiBMaXN0LmNhc3RGcm9tPEUsIFI+KHRoaXMpOwogIEBvdmVycmlkZQogIExpc3Q8RT4gb3BlcmF0b3IgKyhMaXN0PEU+IG90aGVyKSA9PiBsaXN0ICsgb3RoZXI7CgogIEBvdmVycmlkZQogIEUgb3BlcmF0b3IgW10oaW50IGluZGV4KSA9PiBsaXN0W2luZGV4XTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBFIHZhbHVlKSB7CiAgICBsaXN0W2luZGV4XSA9IHZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXQgZmlyc3QoRSBlbGVtZW50KSB7CiAgICBsaXN0LmZpcnN0ID0gZWxlbWVudDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgc2V0IGxhc3QoRSBlbGVtZW50KSB7CiAgICBsaXN0Lmxhc3QgPSBlbGVtZW50OwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsZW5ndGggPT4gbGlzdC5sZW5ndGg7CgogIEBvdmVycmlkZQogIHZvaWQgc2V0IGxlbmd0aChpbnQgbmV3TGVuZ3RoKSB7CiAgICBsaXN0Lmxlbmd0aCA9IG5ld0xlbmd0aDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWRkKEUgdmFsdWUpIHsKICAgIGlmIChhZGRDYWxsYmFjayAhPSBudWxsKSB7CiAgICAgIGFkZENhbGxiYWNrKCdhZGQnLCB2YWx1ZSwgbnVsbCk7CiAgICB9CiAgICBsaXN0LmFkZCh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZEFsbChJdGVyYWJsZTxFPiBpdGVyYWJsZSkgewogICAgaWYgKGFkZEFsbENhbGxiYWNrICE9IG51bGwpIHsKICAgICAgYWRkQWxsQ2FsbGJhY2soJ2FkZEFsbCcsIGl0ZXJhYmxlLCBudWxsKTsKICAgIH0KICAgIGxpc3QuYWRkQWxsKGl0ZXJhYmxlKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPEU+IGdldCByZXZlcnNlZCA9PiBsaXN0LnJldmVyc2VkOwoKICBAb3ZlcnJpZGUKICB2b2lkIHNvcnQoW2ludCBjb21wYXJlKEUgYSwgRSBiKV0pID0+IGxpc3Quc29ydChjb21wYXJlKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBzaHVmZmxlKFtyYW5kb21dKSA9PiBsaXN0LnNodWZmbGUocmFuZG9tKTsKCiAgQG92ZXJyaWRlCiAgaW50IGluZGV4T2YoRSBlbGVtZW50LCBbaW50IHN0YXJ0ID0gMF0pID0+IGxpc3QuaW5kZXhPZihlbGVtZW50LCBzdGFydCk7CgogIEBvdmVycmlkZQogIGludCBpbmRleFdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCBbaW50IHN0YXJ0ID0gMF0pID0+CiAgICAgIGxpc3QuaW5kZXhXaGVyZSh0ZXN0LCBzdGFydCk7CgogIEBvdmVycmlkZQogIGludCBsYXN0SW5kZXhPZihFIGVsZW1lbnQsIFtpbnQgc3RhcnRdKSA9PiBsaXN0Lmxhc3RJbmRleE9mKGVsZW1lbnQsIHN0YXJ0KTsKCiAgQG92ZXJyaWRlCiAgaW50IGxhc3RJbmRleFdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCBbaW50IHN0YXJ0XSkgPT4KICAgICAgbGlzdC5sYXN0SW5kZXhXaGVyZSh0ZXN0LCBzdGFydCk7CgogIEBvdmVycmlkZQogIHZvaWQgY2xlYXIoKSA9PiBsaXN0LmNsZWFyKCk7CgogIEBvdmVycmlkZQogIHZvaWQgaW5zZXJ0KGludCBpbmRleCwgRSBlbGVtZW50KSA9PiBsaXN0Lmluc2VydChpbmRleCwgZWxlbWVudCk7CgogIEBvdmVycmlkZQogIHZvaWQgaW5zZXJ0QWxsKGludCBpbmRleCwgSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKICAgIGxpc3QuaW5zZXJ0QWxsKGluZGV4LCBpdGVyYWJsZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHNldEFsbChpbnQgaW5kZXgsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSA9PiBsaXN0LnNldEFsbChpbmRleCwgaXRlcmFibGUpOwoKICBAb3ZlcnJpZGUKICBib29sIHJlbW92ZShPYmplY3QgdmFsdWUpID0+IGxpc3QucmVtb3ZlKHZhbHVlKTsKCiAgQG92ZXJyaWRlCiAgRSByZW1vdmVBdChpbnQgaW5kZXgpID0+IGxpc3QucmVtb3ZlQXQoaW5kZXgpOwoKICBAb3ZlcnJpZGUKICBFIHJlbW92ZUxhc3QoKSA9PiBsaXN0LnJlbW92ZUxhc3QoKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gbGlzdC5yZW1vdmVXaGVyZSh0ZXN0KTsKCiAgQG92ZXJyaWRlCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gbGlzdC5yZXRhaW5XaGVyZSh0ZXN0KTsKCiAgQG92ZXJyaWRlCiAgTGlzdDxFPiBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKSA9PiBsaXN0LnN1Ymxpc3Qoc3RhcnQsIGVuZCk7CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPEU+IGdldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCkgPT4gbGlzdC5nZXRSYW5nZShzdGFydCwgZW5kKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlLCBbaW50IHNraXBDb3VudCA9IDBdKSB7CiAgICBsaXN0LnNldFJhbmdlKHN0YXJ0LCBlbmQsIGl0ZXJhYmxlLCBza2lwQ291bnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZW1vdmVSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIGxpc3QucmVtb3ZlUmFuZ2Uoc3RhcnQsIGVuZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZpbGxSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIFtFIGZpbGxWYWx1ZV0pIHsKICAgIGxpc3QuZmlsbFJhbmdlKHN0YXJ0LCBlbmQsIGZpbGxWYWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlcGxhY2VSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlPEU+IHJlcGxhY2VtZW50KSB7CiAgICBsaXN0LnJlcGxhY2VSYW5nZShzdGFydCwgZW5kLCByZXBsYWNlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBNYXA8aW50LCBFPiBhc01hcCgpID0+IGxpc3QuYXNNYXAoKTsKfQoKY2xhc3MgRGVidWdTZXQ8RT4gZXh0ZW5kcyBEZWJ1Z0l0ZXJhYmxlPEU+IGltcGxlbWVudHMgU2V0PEU+IHsKICBEZWJ1Z0NhbGxiYWNrIGFkZENhbGxiYWNrOwoKICBEZWJ1Z1NldChTZXQ8RT4gc2V0LCB7dGhpcy5hZGRDYWxsYmFja30pIDogc3VwZXIoc2V0KTsKCiAgU2V0PEU+IGdldCBzZXQgPT4gaXRlcmFibGU7CgogIEBvdmVycmlkZQogIFNldDxSPiBjYXN0PFI+KCkgPT4gU2V0LmNhc3RGcm9tPEUsIFI+KHRoaXMpOwogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnMoT2JqZWN0IHZhbHVlKSA9PiBzZXQuY29udGFpbnModmFsdWUpOwoKICBAb3ZlcnJpZGUKICBib29sIGFkZChFIHZhbHVlKSB7CiAgICBpZiAoYWRkQ2FsbGJhY2sgIT0gbnVsbCkgewogICAgICBhZGRDYWxsYmFjaygnYWRkJywgdmFsdWUsIG51bGwpOwogICAgfQogICAgcmV0dXJuIHNldC5hZGQodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gZWxlbWVudHMpIHsKICAgIGVsZW1lbnRzLmZvckVhY2goYWRkKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgcmVtb3ZlKE9iamVjdCB2YWx1ZSkgPT4gc2V0LnJlbW92ZSh2YWx1ZSk7CgogIEBvdmVycmlkZQogIEUgbG9va3VwKE9iamVjdCBvYmplY3QpID0+IHNldC5sb29rdXAob2JqZWN0KTsKCiAgQG92ZXJyaWRlCiAgdm9pZCByZW1vdmVBbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cykgPT4gc2V0LnJlbW92ZUFsbChlbGVtZW50cyk7CgogIEBvdmVycmlkZQogIHZvaWQgcmV0YWluQWxsKEl0ZXJhYmxlPE9iamVjdD4gZWxlbWVudHMpID0+IHNldC5yZXRhaW5BbGwoZWxlbWVudHMpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBzZXQucmVtb3ZlV2hlcmUodGVzdCk7CgogIEBvdmVycmlkZQogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpID0+IHNldC5yZXRhaW5XaGVyZSh0ZXN0KTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc0FsbChJdGVyYWJsZTxPYmplY3Q+IG90aGVyKSA9PiBzZXQuY29udGFpbnNBbGwob3RoZXIpOwoKICBAb3ZlcnJpZGUKICBTZXQ8RT4gaW50ZXJzZWN0aW9uKFNldDxPYmplY3Q+IG90aGVyKSA9PiBzZXQuaW50ZXJzZWN0aW9uKG90aGVyKTsKCiAgQG92ZXJyaWRlCiAgU2V0PEU+IHVuaW9uKFNldDxFPiBvdGhlcikgPT4gc2V0LnVuaW9uKG90aGVyKTsKCiAgQG92ZXJyaWRlCiAgU2V0PEU+IGRpZmZlcmVuY2UoU2V0PE9iamVjdD4gb3RoZXIpID0+IHNldC5kaWZmZXJlbmNlKG90aGVyKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBjbGVhcigpID0+IHNldC5jbGVhcigpOwoKICBAb3ZlcnJpZGUKICBTZXQ8RT4gdG9TZXQoKSA9PiBzZXQudG9TZXQoKTsKfQoKLy8vIFRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHJ1bnRpbWUgdHlwZSBvZiBbb2JqZWN0XSBpcyBub3QgaW4KLy8vIFtydW50aW1lVHlwZXNdLgovLy8KLy8vIFVzZSB0aGlzIHRvIGdyYWR1YWxseSBidWlsZCB0aGUgc2V0IG9mIGFjdHVhbCBydW50aW1lIHZhbHVlcyBvZiBbb2JqZWN0XQovLy8gYXQgdGhlIGNhbGwgc2l0ZSBieSBydW5uaW5nIHRlc3QgcHJvZ3JhbXMgYW5kIGFkZGluZyB0byBbcnVudGltZVR5cGVzXSB3aGVuCi8vLyBuZXcgdHlwZSBhcmUgZm91bmQuCnZvaWQgYXNzZXJ0VHlwZShTdHJpbmcgbmFtZSwgTGlzdDxTdHJpbmc+IHJ1bnRpbWVUeXBlcywgdmFyIG9iamVjdCwKICAgIHtib29sIHNob3dPYmplY3RzOiBmYWxzZX0pIHsKICBTdHJpbmcgcnVudGltZVR5cGUgPSAnJHtvYmplY3QucnVudGltZVR5cGV9JzsKICBpZiAocnVudGltZVR5cGVzICE9IG51bGwgJiYgcnVudGltZVR5cGVzLmNvbnRhaW5zKHJ1bnRpbWVUeXBlKSkgcmV0dXJuOwogIHRocm93ICckbmFtZTogJHJ1bnRpbWVUeXBlJwogICAgICAnJHtzaG93T2JqZWN0cyA/ICcgKCRvYmplY3QpJyA6ICcnfSc7Cn0KCi8vLyBDYWxsYmFjayBmb3IgdGhlIFthZGRDYWxsYmFja10gb2YgW0RlYnVnTWFwXSB0aGF0IHRocm93cyBhbiBleGNlcHRpb24gaWYKLy8vIHRoZSBydW50aW1lIHR5cGUgb2Yga2V5L3ZhbHVlIHBhaXJzIGFyZSBub3QgaW4gW3J1bnRpbWVUeXBlc10uCi8vLwovLy8gVXNlIHRoaXMgdG8gZ3JhZHVhbGx5IGJ1aWxkIHRoZSBzZXQgb2YgYWN0dWFsIHJ1bnRpbWUgdmFsdWVzIG9mIGtleS92YWx1ZQovLy8gcGFpcnMgb2YgYSBtYXAgYnkgcnVubmluZyB0ZXN0IHByb2dyYW1zIGFuZCBhZGRpbmcgdG8gW3J1bnRpbWVUeXBlc10gd2hlbgovLy8gbmV3IHR5cGUgYXJlIGZvdW5kLgpjbGFzcyBNYXBUeXBlQXNzZXJ0ZXIgewogIGZpbmFsIFN0cmluZyBuYW1lOwogIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gcnVudGltZVR5cGVzOwogIGZpbmFsIGJvb2wgc2hvd09iamVjdHM7CgogIGNvbnN0IE1hcFR5cGVBc3NlcnRlcih0aGlzLm5hbWUsIHRoaXMucnVudGltZVR5cGVzLAogICAgICB7Ym9vbCB0aGlzLnNob3dPYmplY3RzOiBmYWxzZX0pOwoKICB2b2lkIGNhbGwoU3RyaW5nIG1ldGhvZE5hbWUsIHZhciBrZXksIHZhciB2YWx1ZSkgewogICAgY2hlY2soa2V5LCB2YWx1ZSwgJyRtZXRob2ROYW1lOiAnKTsKICB9CgogIHZvaWQgY2hlY2sodmFyIGtleSwgdmFyIHZhbHVlLCBbU3RyaW5nIHRleHQgPSAnJ10pIHsKICAgIFN0cmluZyBrZXlUeXBlID0gJyR7a2V5LnJ1bnRpbWVUeXBlfSc7CiAgICBTdHJpbmcgdmFsdWVUeXBlID0gJyR7dmFsdWUucnVudGltZVR5cGV9JzsKICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXNUeXBlcyA9IHJ1bnRpbWVUeXBlc1trZXlUeXBlXTsKICAgIGlmICh2YWx1ZXNUeXBlcyAhPSBudWxsICYmIHZhbHVlc1R5cGVzLmNvbnRhaW5zKHZhbHVlVHlwZSkpIHJldHVybjsKICAgIHRocm93ICckbmFtZTogJHRleHQka2V5VHlwZSA9PiAkdmFsdWVUeXBlJwogICAgICAgICcke3Nob3dPYmplY3RzID8gJyAoJGtleSA9PiAkdmFsdWUpJyA6ICcnfSc7CiAgfQp9CgovLy8gQ2FsbGJhY2sgZm9yIHRoZSBbYWRkQ2FsbGJhY2tdIG9mIFtEZWJ1Z1NldF0gb3IgW0RlYnVnTGlzdF0gIHRoYXQgdGhyb3dzIGFuCi8vLyBleGNlcHRpb24gaWYgdGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGUgZWxlbWVudHMgYXJlIG5vdCBpbiBbcnVudGltZVR5cGVzXS4KLy8vCi8vLyBVc2UgdGhpcyB0byBncmFkdWFsbHkgYnVpbGQgdGhlIHNldCBvZiBhY3R1YWwgcnVudGltZSB2YWx1ZXMgb2YgdGhlIGVsZW1lbnRzCi8vLyBvZiBhIGNvbGxlY3Rpb24gYnkgcnVubmluZyB0ZXN0IHByb2dyYW1zIGFuZCBhZGRpbmcgdG8gW3J1bnRpbWVUeXBlc10gd2hlbgovLy8gbmV3IHR5cGUgYXJlIGZvdW5kLgpjbGFzcyBDb2xsZWN0aW9uVHlwZUFzc2VydGVyIHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBmaW5hbCBMaXN0PFN0cmluZz4gcnVudGltZVR5cGVzOwogIGZpbmFsIGJvb2wgc2hvd09iamVjdHM7CgogIGNvbnN0IENvbGxlY3Rpb25UeXBlQXNzZXJ0ZXIodGhpcy5uYW1lLCB0aGlzLnJ1bnRpbWVUeXBlcywKICAgICAge2Jvb2wgdGhpcy5zaG93T2JqZWN0czogZmFsc2V9KTsKCiAgdm9pZCBjYWxsKFN0cmluZyBtZXRob2ROYW1lLCB2YXIgZWxlbWVudCwgXykgewogICAgY2hlY2soZWxlbWVudCwgJyRtZXRob2ROYW1lOiAnKTsKICB9CgogIHZvaWQgY2hlY2sodmFyIGVsZW1lbnQsIFtTdHJpbmcgdGV4dCA9ICcnXSkgewogICAgU3RyaW5nIGVsZW1lbnRUeXBlID0gJyR7ZWxlbWVudC5ydW50aW1lVHlwZX0nOwogICAgaWYgKHJ1bnRpbWVUeXBlcy5jb250YWlucyhlbGVtZW50VHlwZSkpIHJldHVybjsKICAgIHRocm93ICckbmFtZTogJHRleHQkZWxlbWVudFR5cGUnCiAgICAgICAgJyR7c2hvd09iamVjdHMgPyAnICgkZWxlbWVudCknIDogJyd9JzsKICB9Cn0Kge8ATk48AUMBLB0iJSABTx8mBgQBLh4hBAEMQgwlKwQBDD4BDC8BDCYkKwYcBAEMJysYKTQIEAgEAQw7AQwZIjUGIgQBDBEiMAYXBAEMQAEMKgEMLgEMPQEMNiMEAQxJIAEMJgEMKQEMLwEMODkBDC0hBAEMMCEEAgEwHgEgAQwxAQw6DDkBDEMBDEkBDD8BDDoBDEcBDEUxBAEMPAEMRAEMOAEMKjAEAQwmAQwlAQwoAQwuAQwvAQxJAQwvAQxJAQwhAQwfAQwjAQw1NgQBDDQ1BAEMNzIBDDcBDEsBDDkBDCwCAUEdIAFDFQEgAQwyDDUBDCsBDCoZBAEMHhoEAQwdGQQBDCEBDCMdBAEMFh8nBhUEAQwmIjAGGwQBDC0BDDwBDDIBDEsBDDskAQxPAQw7KAEMIAEMRAEMNCUEAQxQAQwzAQwxAQwnAQxEAQxEAQxFAQxJAQxRNAQBDCkiBAEMNisEAQxDMAQBDCcCAT8dATkBHgEMMAw2AQwWHycGGwQBDCYbBAEMMgEMMQEMSAEMSAEMQwEMQwEMRgEMRQEMMgEMQQEMHwEMIQIBQhQETVAYRCEwSh4sAgFNQwROThgYFTAaATYnATUoBAE3Ky82SC81BAIBUE0EUU8YHxUjGgE9JwExJQQBMDM0JS8EAgEycGFja2FnZTpjb21waWxlci9zcmMvaGVscGVycy9kZWJ1Z19jb2xsZWN0aW9uLmRhcnQ4c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaGVscGVycy9leHBlbnNpdmVfbWFwLmRhcnSLwC8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgImRhcnQ6Y29sbGVjdGlvbiI7CgovLy8gVGhlIGV4cGVuc2l2ZSBtYXAgaXMgYSBkYXRhIHN0cnVjdHVyZSB1c2VmdWwgZm9yIHRyYWNraW5nIGRvd24KLy8vIGV4Y2Vzc2l2ZSBtZW1vcnkgdXNhZ2UgZHVlIHRvIGxhcmdlIG1hcHMuIEl0IGFjdHMgYXMgYW4gb3JkaW5hcnkKLy8vIGhhc2ggbWFwLCBidXQgaXQgdXNlcyAxMCB0aW1lcyBtb3JlIG1lbW9yeSAoYnkgZGVmYXVsdCkuCmNsYXNzIEV4cGVuc2l2ZU1hcDxLLCBWPiBleHRlbmRzIE1hcEJhc2U8SywgVj4gewogIGZpbmFsIExpc3QgX21hcHM7CgogIEV4cGVuc2l2ZU1hcChbaW50IGNvcGllcyA9IDEwXSkgOiBfbWFwcyA9IG5ldyBMaXN0KGNvcGllcykgewogICAgYXNzZXJ0KGNvcGllcyA+IDApOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbWFwcy5sZW5ndGg7IGkrKykgewogICAgICBfbWFwc1tpXSA9IG5ldyBNYXA8SywgVj4oKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgbGVuZ3RoID0+IF9tYXBzWzBdLmxlbmd0aDsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0VtcHR5ID0+IF9tYXBzWzBdLmlzRW1wdHk7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBfbWFwc1swXS5pc05vdEVtcHR5OwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxLPiBnZXQga2V5cyA9PiBfbWFwc1swXS5rZXlzOwogIEBvdmVycmlkZQogIEl0ZXJhYmxlPFY+IGdldCB2YWx1ZXMgPT4gX21hcHNbMF0udmFsdWVzOwoKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpID0+IF9tYXBzWzBdLmNvbnRhaW5zS2V5KGtleSk7CiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgPT4gX21hcHNbMF0uY29udGFpbnNWYWx1ZSh2YWx1ZSk7CgogIEBvdmVycmlkZQogIFYgb3BlcmF0b3IgW10oT2JqZWN0IGtleSkgPT4gX21hcHNbMF1ba2V5XTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoKHZvaWQgYWN0aW9uKEsga2V5LCBWIHZhbHVlKSkgewogICAgX21hcHNbMF0uZm9yRWFjaChhY3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBvcGVyYXRvciBbXT0oSyBrZXksIFYgdmFsdWUpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX21hcHMubGVuZ3RoOyBpKyspIHsKICAgICAgX21hcHNbaV1ba2V5XSA9IHZhbHVlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgViBwdXRJZkFic2VudChLIGtleSwgViBpZkFic2VudCgpKSB7CiAgICBpZiAoY29udGFpbnNLZXkoa2V5KSkgcmV0dXJuIHRoaXNba2V5XTsKICAgIFYgdmFsdWUgPSBpZkFic2VudCgpOwogICAgdGhpc1trZXldID0gdmFsdWU7CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZEFsbChNYXA8SywgVj4gb3RoZXIpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX21hcHMubGVuZ3RoOyBpKyspIHsKICAgICAgX21hcHNbaV0uYWRkQWxsKG90aGVyKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFYgcmVtb3ZlKE9iamVjdCBrZXkpIHsKICAgIFYgcmVzdWx0ID0gX21hcHNbMF0ucmVtb3ZlKGtleSk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8IF9tYXBzLmxlbmd0aDsgaSsrKSB7CiAgICAgIF9tYXBzW2ldLnJlbW92ZShrZXkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2xlYXIoKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IF9tYXBzLmxlbmd0aDsgaSsrKSB7CiAgICAgIF9tYXBzW2ldLmNsZWFyKCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBNYXA8S1IsIFZSPiBjYXN0PEtSLCBWUj4oKSA9PiBNYXAuY2FzdEZyb208SywgViwgS1IsIFZSPih0aGlzKTsKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxNYXBFbnRyeTxLLCBWPj4gZ2V0IGVudHJpZXMgPT4gX21hcHNbMF0uZW50cmllczsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRFbnRyaWVzKEl0ZXJhYmxlPE1hcEVudHJ5PEssIFY+PiBlbnRyaWVzKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IF9tYXBzLmxlbmd0aDsgaSsrKSB7CiAgICAgIF9tYXBzW2ldLmFkZEVudHJpZXMoZW50cmllcyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBNYXA8S1IsIFZSPiBtYXA8S1IsIFZSPihNYXBFbnRyeTxLUiwgVlI+IHRyYW5zZm9ybShLIGtleSwgViB2YWx1ZSkpID0+CiAgICAgIF9tYXBzWzBdLm1hcCh0cmFuc2Zvcm0pOwoKICBAb3ZlcnJpZGUKICBWIHVwZGF0ZShLIGtleSwgViB1cGRhdGUoViB2YWx1ZSksIHtWIGlmQWJzZW50KCl9KSB7CiAgICBWIHJlc3VsdDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX21hcHMubGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0ID0gX21hcHNbaV0udXBkYXRlKGtleSwgdXBkYXRlLCBpZkFic2VudDogaWZBYnNlbnQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdXBkYXRlQWxsKFYgdXBkYXRlKEsga2V5LCBWIHZhbHVlKSkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbWFwcy5sZW5ndGg7IGkrKykgewogICAgICBfbWFwc1tpXS51cGRhdGVBbGwodXBkYXRlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KEsga2V5LCBWIHZhbHVlKSkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbWFwcy5sZW5ndGg7IGkrKykgewogICAgICBfbWFwc1tpXS5yZW1vdmVXaGVyZSh0ZXN0KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICJleHBlbnNpdmUoJHtfbWFwc1swXX14JHtfbWFwcy5sZW5ndGh9KSI7Cn0KfgBOTjwBGgFDRT0xFAE/GC0iBgQBDCUMKAwuAQwpDC0BDD0MRQEMLgEMLh4EAQwmLR0GBAEMJywaFxIEAQwhLR4GBAEMGSUtHAYTBAEMES0YBgQBDEIMPAEMNi0kBgQBDEkfAQw3Di1BBhMEAQwtLSIGBAEMMC0iBgQBDEECAS9wYWNrYWdlOmNvbXBpbGVyL3NyYy9oZWxwZXJzL2V4cGVuc2l2ZV9tYXAuZGFydDhzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9oZWxwZXJzL2V4cGVuc2l2ZV9zZXQuZGFydI2fLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKCi8vLyBUaGUgZXhwZW5zaXZlIHNldCBpcyBhIGRhdGEgc3RydWN0dXJlIHVzZWZ1bCBmb3IgdHJhY2tpbmcgZG93bgovLy8gZXhjZXNzaXZlIG1lbW9yeSB1c2FnZSBkdWUgdG8gbGFyZ2Ugc2V0cy4gSXQgYWN0cyBhcyBhbiBvcmRpbmFyeQovLy8gaGFzaCBzZXQsIGJ1dCBpdCB1c2VzIDEwIHRpbWVzIG1vcmUgbWVtb3J5IChieSBkZWZhdWx0KS4KY2xhc3MgRXhwZW5zaXZlU2V0PEU+IGV4dGVuZHMgU2V0QmFzZTxFPiB7CiAgZmluYWwgTGlzdCBfc2V0czsKCiAgRXhwZW5zaXZlU2V0KFtpbnQgY29waWVzID0gMTBdKSA6IF9zZXRzID0gbmV3IExpc3QoY29waWVzKSB7CiAgICBhc3NlcnQoY29waWVzID4gMCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IF9zZXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIF9zZXRzW2ldID0gbmV3IFNldDxFPigpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsZW5ndGggPT4gX3NldHNbMF0ubGVuZ3RoOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX3NldHNbMF0uaXNFbXB0eTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc05vdEVtcHR5ID0+IF9zZXRzWzBdLmlzTm90RW1wdHk7CgogIEBvdmVycmlkZQogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciA9PiBfc2V0c1swXS5pdGVyYXRvcjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWlucyhPYmplY3Qgb2JqZWN0KSA9PiBfc2V0c1swXS5jb250YWlucyhvYmplY3QpOwogIEBvdmVycmlkZQogIEUgbG9va3VwKE9iamVjdCBvYmplY3QpID0+IF9zZXRzWzBdLmxvb2t1cChvYmplY3QpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2godm9pZCBhY3Rpb24oRSBlbGVtZW50KSkgewogICAgX3NldHNbMF0uZm9yRWFjaChhY3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBhZGQoRSBlbGVtZW50KSB7CiAgICBib29sIHJlc3VsdCA9IF9zZXRzWzBdLmFkZChlbGVtZW50KTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgX3NldHMubGVuZ3RoOyBpKyspIHsKICAgICAgX3NldHNbaV0uYWRkKGVsZW1lbnQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IG9iamVjdHMpIHsKICAgIGZvciAoRSBlYWNoIGluIG9iamVjdHMpIHsKICAgICAgYWRkKGVhY2gpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCByZW1vdmUoT2JqZWN0IG9iamVjdCkgewogICAgYm9vbCByZXN1bHQgPSBfc2V0c1swXS5yZW1vdmUob2JqZWN0KTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgX3NldHMubGVuZ3RoOyBpKyspIHsKICAgICAgX3NldHNbaV0ucmVtb3ZlKG9iamVjdCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjbGVhcigpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3NldHMubGVuZ3RoOyBpKyspIHsKICAgICAgX3NldHNbaV0uY2xlYXIoKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVtb3ZlQWxsKEl0ZXJhYmxlPE9iamVjdD4gb2JqZWN0c1RvUmVtb3ZlKSB7CiAgICBmb3IgKHZhciBlYWNoIGluIG9iamVjdHNUb1JlbW92ZSkgewogICAgICByZW1vdmUoZWFjaCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICByZW1vdmVBbGwodGhpcy50b0xpc3QoKS53aGVyZSgoZSkgPT4gdGVzdChlKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgcmVtb3ZlQWxsKHRvTGlzdCgpLndoZXJlKChlKSA9PiAhdGVzdChlKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc0FsbChJdGVyYWJsZTxPYmplY3Q+IG90aGVyKSB7CiAgICBmb3IgKE9iamVjdCBvYmplY3QgaW4gb3RoZXIpIHsKICAgICAgaWYgKCF0aGlzLmNvbnRhaW5zKG9iamVjdCkpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgU2V0IF9uZXdTZXQoKSA9PiBuZXcgRXhwZW5zaXZlU2V0KF9zZXRzLmxlbmd0aCk7CgogIEBvdmVycmlkZQogIFNldDxFPiBpbnRlcnNlY3Rpb24oU2V0PE9iamVjdD4gb3RoZXIpIHsKICAgIFNldDxFPiByZXN1bHQgPSBfbmV3U2V0KCk7CiAgICBpZiAob3RoZXIubGVuZ3RoIDwgdGhpcy5sZW5ndGgpIHsKICAgICAgZm9yICh2YXIgZWxlbWVudCBpbiBvdGhlcikgewogICAgICAgIGlmICh0aGlzLmNvbnRhaW5zKGVsZW1lbnQpKSByZXN1bHQuYWRkKGVsZW1lbnQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgICAgaWYgKG90aGVyLmNvbnRhaW5zKGVsZW1lbnQpKSByZXN1bHQuYWRkKGVsZW1lbnQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgU2V0PEU+IHVuaW9uKFNldDxFPiBvdGhlcikgewogICAgcmV0dXJuIF9uZXdTZXQoKS4uYWRkQWxsKHRoaXMpLi5hZGRBbGwob3RoZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgU2V0PEU+IGRpZmZlcmVuY2UoU2V0PE9iamVjdD4gb3RoZXIpIHsKICAgIFNldDxFPiByZXN1bHQgPSBfbmV3U2V0KCk7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICghb3RoZXIuY29udGFpbnMoZWxlbWVudCkpIHJlc3VsdC5hZGQoZWxlbWVudCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZXRhaW5BbGwoSXRlcmFibGUgb2JqZWN0c1RvUmV0YWluKSB7CiAgICBTZXQgcmV0YWluU2V0OwogICAgaWYgKG9iamVjdHNUb1JldGFpbiBpcyBTZXQpIHsKICAgICAgcmV0YWluU2V0ID0gb2JqZWN0c1RvUmV0YWluOwogICAgfSBlbHNlIHsKICAgICAgcmV0YWluU2V0ID0gb2JqZWN0c1RvUmV0YWluLnRvU2V0KCk7CiAgICB9CiAgICByZXRhaW5XaGVyZShyZXRhaW5TZXQuY29udGFpbnMpOwogIH0KCiAgQG92ZXJyaWRlCiAgU2V0PEU+IHRvU2V0KCkgewogICAgdmFyIHJlc3VsdCA9IG5ldyBFeHBlbnNpdmVTZXQ8RT4oX3NldHMubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3NldHMubGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0Ll9zZXRzW2ldID0gX3NldHNbaV0udG9TZXQoKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiZXhwZW5zaXZlKCR7X3NldHNbMF19eCR7X3NldHMubGVuZ3RofSkiOwp9CoCYAE5OPAEaAUNFPSsUAT8YLR8GBAEMJQwoDC4BDDEBDD0MNgEMKR4EAQwYKS0dBhMEAQwlHhEGBAEMHystHwYTBAEMES0YBgQBDDUoFAYEAQwrNAQBDCswBAEMLSMwBhEEATMBDCsfJiM5CA0gOggGEwQBDB8zBAEMKR8eOQYTBAEMLRMiIw0rBiUEAQwTNC0qBhMEAQxBAgEvcGFja2FnZTpjb21waWxlci9zcmMvaGVscGVycy9leHBlbnNpdmVfc2V0LmRhcnQwc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaGVscGVycy9zdGF0cy5kYXJ0wABcHS8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6YXN5bmMnIHNob3cgRXZlbnRTaW5rOwppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CmltcG9ydCAnZGFydDpjb252ZXJ0JzsKCmltcG9ydCAnLi4vLi4vY29tcGlsZXIuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbXBpbGVyLmRhcnQnIHNob3cgQ29tcGlsZXI7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnOwoKLy8gSGVscGVyIG1ldGhvZHMgZm9yIHN0YXRpc3RpY3MuCgovLy8gQ3VycmVudCBzdGF0cyBjb2xsZWN0b3IuIFVzZSBbZW5hYmxlU3RhdHNPdXRwdXRdIHRvIGVuYWJsZSByZWNvcmRpbmcgb2YKLy8vIHN0YXRzLgpTdGF0cyBnZXQgc3RhdHMgewogIGVuYWJsZURlYnVnTW9kZSgpOwogIGlmIChfc3RhdHMgPT0gbnVsbCkgewogICAgX3N0YXRzID0gY29uc3QgU3RhdHMoKTsKICB9CiAgcmV0dXJuIF9zdGF0czsKfQoKU3RhdHMgX3N0YXRzOwoKLy8vIEVuYWJsZSByZWNvcmRpbmcgb2Ygc3RhdHMuIFVzZSBbU3RhdHMuZHVtcFN0YXRzXSB0byBvdXRwdXQgdGhlIHJlY29yZCBzdGF0cy4KLy8vCi8vLyBQYXNzIHRoZSBbb3V0cHV0UHJvdmlkZXJdIG9mIFtDb21waWxlcl0gdG8gZ2VuZXJhdGUgc3RhdHMgaW50byBhIHNlcGFyYXRlCi8vLyBmaWxlIHVzaW5nIFtuYW1lXSBhbmQgW2V4dGVuc2lvbl0gZm9yIHRoZSBmaWxlbmFtZS4gSWYgb21pdHRlZCwgc3RhdHMgYXJlCi8vLyBwcmludGVkIG9uIHN0YW5kYXJkIG91dC4KLy8vCi8vLyBJZiBbeG1sXSBpcyBgdHJ1ZWAsIHN0YXRzIG91dHB1dCBpcyBmb3JtYXR0ZWQgYXMgWE1MIHdpdGggYSBkZWZhdWx0Ci8vLyBleHRlbnNpb24gb2YgJ3htbCcsIG90aGVyd2lzZSB0aGUgb3V0cHV0IGlzIGluZGVudGVkIHRleHQgd2l0aCBhIGRlZmF1bHQKLy8vIGV4dGVuc2lvbiBvZiAnbG9nJy4Kdm9pZCBlbmFibGVTdGF0c091dHB1dCgKICAgIHtDb21waWxlck91dHB1dFByb3ZpZGVyIG91dHB1dFByb3ZpZGVyLAogICAgYm9vbCB4bWw6IHRydWUsCiAgICBTdHJpbmcgbmFtZTogJ3N0YXRzJywKICAgIFN0cmluZyBleHRlbnNpb24sCiAgICBpbnQgZXhhbXBsZXM6IDEwfSkgewogIGlmIChfc3RhdHMgIT0gbnVsbCkgewogICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoJ1N0YXRzIGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLicpOwogIH0KICBlbmFibGVEZWJ1Z01vZGUoKTsKCiAgU3RhdHNPdXRwdXQgb3V0cHV0OwogIGlmIChvdXRwdXRQcm92aWRlciAhPSBudWxsKSB7CiAgICBpZiAoZXh0ZW5zaW9uID09IG51bGwpIHsKICAgICAgZXh0ZW5zaW9uID0geG1sID8gJ3htbCcgOiAnbG9nJzsKICAgIH0KICAgIG91dHB1dCA9IG5ldyBTaW5rT3V0cHV0KG91dHB1dFByb3ZpZGVyKG5hbWUsIGV4dGVuc2lvbikpOwogIH0gZWxzZSB7CiAgICBvdXRwdXQgPSBjb25zdCBEZWJ1Z091dHB1dCgpOwogIH0KICBTdGF0c1ByaW50ZXIgcHJpbnRlcjsKICBpZiAoeG1sKSB7CiAgICBwcmludGVyID0gbmV3IFhNTFByaW50ZXIob3V0cHV0OiBvdXRwdXQsIGV4YW1wbGVzOiBleGFtcGxlcyk7CiAgfSBlbHNlIHsKICAgIHByaW50ZXIgPSBuZXcgQ29uc29sZVByaW50ZXIob3V0cHV0OiBvdXRwdXQsIGV4YW1wbGVzOiBleGFtcGxlcyk7CiAgfQogIF9zdGF0cyA9IG5ldyBBY3RpdmVTdGF0cyhwcmludGVyKTsKfQoKLy8vIEludGVyZmFjZSBmb3IgZ2F0aGVyaW5nIGFuZCBkaXNwbGF5IG9mIHN0YXRpc3RpY2FsIGluZm9ybWF0aW9uLgovLy8gVGhpcyBjbGFzcyBzZXJ2ZXMgYXMgdGhlIG5vb3AgY29sbGVjdG9yLgpjbGFzcyBTdGF0cyB7CiAgY29uc3QgU3RhdHMoKTsKCiAgLy8vIFJlZ2lzdGVycyBba2V5XSwgW3ZhbHVlXSBwYWlyIGluIHRoZSBtYXAgW2lkXS4gSWYgW2Zyb21FeGlzdGluZ10gaXMKICAvLy8gbm9uLW51bGwgYW5kIFtrZXldIGFscmVhZHkgZXhpc3RzLCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIFtrZXldIHdpbGwKICAvLy8gYmUgdGhlIHJldHVybiB2YWx1ZSBvZiBbZnJvbUV4aXN0aW5nXSB3aGVuIGNhbGxlZCB3aXRoIHRoZSBleGlzdGluZyB2YWx1ZS4KICAvLy8KICAvLy8gVGhlIHJlY29yZGVkIGluZm9ybWF0aW9uIGlzIG5vdCBkdW1wZWQgYXV0b21hdGljYWxseS4KICB2b2lkIHJlY29yZE1hcChpZCwga2V5LCB2YWx1ZSwge2Zyb21FeGlzdGluZyh2YWx1ZSl9KSB7fQoKICAvLy8gUmV0dXJucyB0aGUgbWFwIFtpZF0gcmVjb3JkZWQgd2l0aCBbcmVjb3JkTWFwXS4KICBNYXAgZ2V0TWFwKGlkKSA9PiBjb25zdCB7fTsKCiAgLy8vIFJlZ2lzdGVycyBbZWxlbWVudF0gYXMgYW4gZWxlbWVudCBvZiB0aGUgbGlzdCBbaWRdLiBJZiBwcm92aWRlZCwgW2RhdGFdCiAgLy8vIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGF0YSBmb3IgW2VsZW1lbnRdLgogIC8vLwogIC8vLyBUaGUgcmVjb3JkZWQgaW5mb3JtYXRpb24gaXMgZHVtcGVkIGF1dG9tYXRpY2FsbHkgb24gY2FsbCB0byBbZHVtcFN0YXRzXS4KICAvLy8KICAvLy8gRXhhbXBsZToKICAvLy8gICBDYWxsaW5nIFtyZWNvcmRFbGVtZW50XSBsaWtlIHRoaXM6CiAgLy8vICAgICByZWNvcmRFbGVtZW50KCdmb28nLCAnYScsIGRhdGE6ICdmaXJzdC1hLWRhdGEnKTsKICAvLy8gICAgIHJlY29yZEVsZW1lbnQoJ2ZvbycsICdhJywgZGF0YTogJ3NlY29uZC1hLWRhdGEnKTsKICAvLy8gICAgIHJlY29yZEVsZW1lbnQoJ2ZvbycsICdiJyk7CiAgLy8vICAgICByZWNvcmRFbGVtZW50KCdiYXInLCAnYScsIGRhdGE6ICd0aGlyZC1hLWRhdGEnKTsKICAvLy8gICAgIHJlY29yZEVsZW1lbnQoJ2JhcicsICdjJyk7CiAgLy8vICAgd2lsbCByZXN1bHQgaW4gYSBkdW1wIGxpa2UgdGhpczoKICAvLy8gICAgIGZvbzogMgogIC8vLyAgICAgIHZhbHVlPWEgZGF0YT1zZWNvbmQtYS1kYXRhCiAgLy8vICAgICAgYgogIC8vLyAgICAgYmFyOiAyCiAgLy8vICAgICAgdmFsdWU9YSBkYXRhPXRoaXJkLWEtZGF0YQogIC8vLyAgICAgIGMKICAvLy8KICB2b2lkIHJlY29yZEVsZW1lbnQoaWQsIGVsZW1lbnQsIHtkYXRhfSkge30KCiAgLy8vIFJldHVybnMgdGhlIGxpc3QgW2lkXSByZWNvcmRlZCB3aXRoIFtyZWNvcmRFbGVtZW50XS4KICBJdGVyYWJsZSBnZXRMaXN0KFN0cmluZyBpZCkgPT4gY29uc3QgW107CgogIC8vLyBSZWdpc3RlcnMgW3ZhbHVlXSBhcyBhbiBvY2N1cnJlbmNlIG9mIFtpZF0uIElmIHBhc3NlZCwgW2V4YW1wbGVdIHByb3ZpZGVzCiAgLy8vIGFuIGV4YW1wbGUgZGF0YSBvZiB0aGUgb2NjdXJyZW5jZSBvZiBbdmFsdWVdLgogIC8vLwogIC8vLyBUaGUgcmVjb3JkZWQgaW5mb3JtYXRpb24gaXMgZHVtcGVkIGF1dG9tYXRpY2FsbHkgb24gY2FsbCB0byBbZHVtcFN0YXRzXS4KICAvLy8KICAvLy8gRXhhbXBsZToKICAvLy8gICBDYWxsaW5nIFtyZWNvcmRGcmVxdWVuY3ldIGxpa2UgdGhpczoKICAvLy8gICAgIHJlY29yZEZyZXF1ZW5jeSgnZm9vJywgJ2EnLCAnZmlyc3QtYS1kYXRhJyk7CiAgLy8vICAgICByZWNvcmRGcmVxdWVuY3koJ2ZvbycsICdhJywgJ3NlY29uZC1hLWRhdGEnKTsKICAvLy8gICAgIHJlY29yZEZyZXF1ZW5jeSgnYmFyJywgJ2InLCAnZmlyc3QtYi1kYXRhJyk7CiAgLy8vICAgICByZWNvcmRGcmVxdWVuY3koJ2ZvbycsICdjJyk7CiAgLy8vICAgICByZWNvcmRGcmVxdWVuY3koJ2JhcicsICdiJyk7CiAgLy8vICAgd2lsbCByZXN1bHQgaW4gYSBkdW1wIGxpa2UgdGhpczoKICAvLy8gICAgIGZvbzoKICAvLy8gICAgICBhOiAyCiAgLy8vICAgICAgIGZpcnN0LWEtZGF0YQogIC8vLyAgICAgICBzZWNvbmQtYS1kYXRhCiAgLy8vICAgICAgYzogMQogIC8vLyAgICAgYmFyOgogIC8vLyAgICAgIGI6IDIKICAvLy8gICAgICAgZmlyc3QtYi1kYXRhCiAgLy8vCiAgdm9pZCByZWNvcmRGcmVxdWVuY3koaWQsIHZhbHVlLCBbZXhhbXBsZV0pIHt9CgogIC8vLyBGb3IgZWFjaCBrZXkvdmFsdWUgcGFpciBpbiBbbWFwXSB0aGUgZWxlbWVudHMgaW4gdGhlIHZhbHVlIGFyZSByZWdpc3RlcmVkCiAgLy8vIGFzIGV4YW1wbGVzIG9mIG9jY3VycmVuY2VzIG9mIHRoZSBrZXkgaW4gW2lkXS4KICB2b2lkIHJlY29yZEZyZXF1ZW5jaWVzKGlkLCBNYXA8ZHluYW1pYywgSXRlcmFibGU+IG1hcCkge30KCiAgLy8vIFJldHVybnMgdGhlIGV4YW1wbGVzIGdpdmVuIGZvciB0aGUgb2NjdXJyZW5jZSBvZiBbdmFsdWVdIGZvciBbaWRdLgogIEl0ZXJhYmxlIHJlY29yZGVkRnJlcXVlbmNpZXMoaWQsIHZhbHVlKSA9PiBjb25zdCBbXTsKCiAgLy8vIEluY3JlYXNlcyB0aGUgY291bnRlciBbaWRdIGJ5IDEuIElmIHByb3ZpZGVkLCBbZXhhbXBsZV0gaXMgdXNlZCBhcyBhbgogIC8vLyBleGFtcGxlIG9mIHRoZSBjb3VudCBhbmQgW2RhdGFdIHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yCiAgLy8vIFtleGFtcGxlXS4KICAvLy8KICAvLy8gVGhlIHJlY29yZGVkIGluZm9ybWF0aW9uIGlzIGR1bXBlZCBhdXRvbWF0aWNhbGx5IG9uIGNhbGwgdG8gW2R1bXBTdGF0c10uCiAgLy8vCiAgLy8vIEV4YW1wbGU6CiAgLy8vICAgQ2FsbGluZyBbcmVjb3JkQ291bnRlcl0gbGlrZSB0aGlzOgogIC8vLyAgICAgcmVjb3JkQ291bnRlcignZm9vJywgJ2EnKTsKICAvLy8gICAgIHJlY29yZENvdW50ZXIoJ2ZvbycsICdhJyk7CiAgLy8vICAgICByZWNvcmRDb3VudGVyKCdmb28nLCAnYicpOwogIC8vLyAgICAgcmVjb3JkQ291bnRlcignYmFyJywgJ2MnLCAnZmlyc3QtYy1kYXRhJyk7CiAgLy8vICAgICByZWNvcmRDb3VudGVyKCdiYXInLCAnYycsICdzZWNvbmQtYy1kYXRhJyk7CiAgLy8vICAgICByZWNvcmRDb3VudGVyKCdiYXInLCAnZCcpOwogIC8vLyAgICAgcmVjb3JkQ291bnRlcignYmFyJywgJ2QnKTsKICAvLy8gICAgIHJlY29yZENvdW50ZXIoJ2JheicpOwogIC8vLyAgICAgcmVjb3JkQ291bnRlcignYmF6Jyk7CiAgLy8vICAgd2lsbCByZXN1bHQgaW4gYSBkdW1wIGxpa2UgdGhpczoKICAvLy8gICAgIGZvbzogMwogIC8vLyAgICAgIGNvdW50PTIgZXhhbXBsZT1hCiAgLy8vICAgICAgY291bnQ9MSBleGFtcGxlPWIKICAvLy8gICAgIGJhcjogNAogIC8vLyAgICAgIGNvdW50PTIgZXhhbXBsZXM9MgogIC8vLyAgICAgICBjOgogIC8vLyAgICAgICAgZmlyc3QtYy1kYXRhCiAgLy8vICAgICAgICBzZWNvbmQtYy1kYXRhCiAgLy8vICAgICAgIGQKICAvLy8gICAgIGJhejogMgogIC8vLwogIHZvaWQgcmVjb3JkQ291bnRlcihpZCwgW2V4YW1wbGUsIGRhdGFdKSB7fQoKICAvLy8gUmVjb3JkcyB0aGUgY3VycmVudCBzdGFjayB0cmFjZSB1bmRlciB0aGUga2V5IFtpZF0uIE9ubHkgZXZlcnkKICAvLy8gW3NhbXBsZUZyZXF1ZW5jeV0gY2FsbCB3aXRoIHRoZSBzYW1lIGlkIGlzIHJlY29yZGVkLCBhbmQgaWYgb21pdHRlZAogIC8vLyBbc3RhY2tUcmFjZVNhbXBsZUZyZXF1ZW5jeV0gaXMgdXNlZC4KICB2b2lkIHJlY29yZFRyYWNlKGlkLCB7aW50IHNhbXBsZUZyZXF1ZW5jeX0pIHt9CgogIC8vLyBUaGUgZGVmYXVsdCBzYW1wbGUgZnJlcXVlbmN5IHVzZWQgZm9yIHJlY29yZGluZyBzdGFjayB0cmFjZXMuCiAgaW50IGdldCBzdGFja1RyYWNlU2FtcGxlRnJlcXVlbmN5ID0+IDA7CgogIC8vLyBTZXQgdGhlIGRlZmF1bHQgc2FtcGxlIGZyZXF1ZW5jeSB1c2VkIGZvciByZWNvcmRpbmcgc3RhY2sgdHJhY2VzLgogIHZvaWQgc2V0IHN0YWNrVHJhY2VTYW1wbGVGcmVxdWVuY3koaW50IHZhbHVlKSB7fQoKICAvLy8gRHVtcHMgdGhlIHN0YXRzIGZvciB0aGUgcmVjb3JkZWQgZnJlcXVlbmNpZXMsIHNldHMsIGFuZCBjb3VudGVycy4gSWYKICAvLy8gcHJvdmlkZWQgW2JlZm9yZUNsb3NlXSBpcyBjYWxsZWQgYmVmb3JlIGNsb3NpbmcgdGhlIGR1bXAgb3V0cHV0LiBUaGlzCiAgLy8vIGNhbiBiZSB1c2VkIHRvIGluY2x1ZGUgY29ycmVsYXRpb25zIG9uIHRoZSBjb2xsZWN0ZWQgZGF0YSB0aHJvdWdoCiAgLy8vIFtkdW1wQ29ycmVsYXRpb25dLgogIHZvaWQgZHVtcFN0YXRzKHt2b2lkIGJlZm9yZUNsb3NlKCl9KSB7fQoKICAvLy8gUHJpbnRzIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBlbGVtZW50cyBvZiBbYV0gYW5kIFtiXS4KICAvLy8KICAvLy8gVGhyZWUgc2V0cyBhcmUgb3V0cHV0IHVzaW5nIFtpZEFdIGFuZCBbaWRCXSBhcyBsYWJlbHMgZm9yIHRoZSBlbGVtZW50cwogIC8vLyBbYV0gYW5kIFtiXToKICAvLy8KICAvLy8gICAnaWRBICYmIGlkQicgbGlzdHMgdGhlIGVsZW1lbnRzIGJvdGggaW4gW2FdIGFuZCBbYl0sCiAgLy8vICAgJyFpZEEgJiYgaWRCJyBsaXN0cyB0aGUgZWxlbWVudHMgbm90IGluIFthXSBidXQgaW4gW2JdLCBhbmQKICAvLy8gICAnaWRBICYmICFpZEInIGxpc3RzIHRoZSBlbGVtZW50cyBpbiBbYV0gYnV0IG5vdCBpbiBbYl0uCiAgLy8vCiAgLy8vIElmIFtkYXRhQV0gYW5kL29yIFtkYXRhQl0gYXJlIHByb3ZpZGVkLCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIHRoZQogIC8vLyBlbGVtZW50cyBhcmUgbG9va2VkIHVwIGluIFtkYXRhQV0gb3IgW2RhdGFCXSB1c2luZyBbZGF0YUFdIGFzIHRoZSBwcmltYXJ5CiAgLy8vIHNvdXJjZS4KICB2b2lkIGR1bXBDb3JyZWxhdGlvbihpZEEsIEl0ZXJhYmxlIGEsIGlkQiwgSXRlcmFibGUgYiwKICAgICAge01hcCBkYXRhQSwgTWFwIGRhdGFCfSkge30KfQoKLy8vIEludGVyZmFjZSBmb3IgcHJpbnRpbmcgb3V0cHV0IGRhdGEuCi8vLwovLy8gVGhpcyBjbGFzcyBzZXJ2ZXMgYXMgdGhlIGRpc2FibGVkIG91dHB1dC4KY2xhc3MgU3RhdHNPdXRwdXQgewogIGNvbnN0IFN0YXRzT3V0cHV0KCk7CgogIC8vLyBQcmludCBbdGV4dF0gYXMgb24gYSBzZXBhcmF0ZSBsaW5lLgogIHZvaWQgcHJpbnRsbihTdHJpbmcgdGV4dCkge30KfQoKLy8vIE91dHB1dCB0byB0aGUgW2RlYnVnUHJpbnRdIG1ldGhvZC4KY2xhc3MgRGVidWdPdXRwdXQgaW1wbGVtZW50cyBTdGF0c091dHB1dCB7CiAgY29uc3QgRGVidWdPdXRwdXQoKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludGxuKFN0cmluZyB0ZXh0KSA9PiBkZWJ1Z1ByaW50KHRleHQpOwp9CgovLy8gT3V0cHV0IHRvIGFuIFtFdmVudFNpbmtdLiBVc2VkIHRvIG91dHB1dCB0byBhIGZpbGUgdGhyb3VnaCB0aGUKLy8vIFtDb21waWxlck91dHB1dFByb3ZpZGVyXS4KY2xhc3MgU2lua091dHB1dCBpbXBsZW1lbnRzIFN0YXRzT3V0cHV0IHsKICBFdmVudFNpbms8U3RyaW5nPiBzaW5rOwoKICBTaW5rT3V0cHV0KHRoaXMuc2luayk7CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRsbihTdHJpbmcgdGV4dCkgewogICAgc2luay5hZGQodGV4dCk7CiAgICBzaW5rLmFkZCgnXG4nKTsKICB9Cn0KCi8vLyBJbnRlcmZhY2UgZm9yIHByaW50aW5nIHN0YXRzIGNvbGxlY3RlZCBpbiBbU3RhdHNdLgphYnN0cmFjdCBjbGFzcyBTdGF0c1ByaW50ZXIgewogIC8vLyBUaGUgbnVtYmVyIG9mIGV4YW1wbGVzIHByaW50ZXIuIElmIGBudWxsYCBhbGwgZXhhbXBsZXMgYXJlIHByaW50ZWQuCiAgaW50IGdldCBleGFtcGxlcyA9PiAwOwoKICAvLy8gU3RhcnQgYSBncm91cCBbaWRdLgogIHZvaWQgc3RhcnQoU3RyaW5nIGlkKSB7fQoKICAvLy8gQ3JlYXRlIGEgZ3JvdXAgW2lkXSB3aXRoIGNvbnRlbnQgY3JlYXRlZCBieSBbY3JlYXRlR3JvdXBDb250ZW50XS4KICB2b2lkIGdyb3VwKFN0cmluZyBpZCwgdm9pZCBjcmVhdGVHcm91cENvbnRlbnQoKSkgewogICAgc3RhcnQoaWQpOwogICAgY3JlYXRlR3JvdXBDb250ZW50KCk7CiAgICBlbmQoaWQpOwogIH0KCiAgLy8vIEVuZCBhIGdyb3VwIFtpZF0uCiAgdm9pZCBlbmQoU3RyaW5nIGlkKSB7fQoKICAvLy8gU3RhcnQgYSBzdGF0IGVudHJ5IGZvciBbaWRdIHdpdGggYWRkaXRpb25hbCBbZGF0YV0uCiAgdm9pZCBvcGVuKFN0cmluZyBpZCwKICAgICAgW01hcDxTdHJpbmcsIGR5bmFtaWM+IGRhdGEgPSBjb25zdCA8U3RyaW5nLCBkeW5hbWljPnt9XSkge30KCiAgLy8vIENyZWF0ZSBhIHN0YXQgZW50cnkgZm9yIFtpZF0gd2l0aCBhZGRpdGlvbmFsIFtkYXRhXSBhbmQgY29udGVudCBjcmVhdGVkIGJ5CiAgLy8vIFtjcmVhdGVDaGlsZENvbnRlbnRdLgogIHZvaWQgY2hpbGQoU3RyaW5nIGlkLAogICAgICBbTWFwPFN0cmluZywgZHluYW1pYz4gZGF0YSA9IGNvbnN0IDxTdHJpbmcsIGR5bmFtaWM+e30sCiAgICAgIHZvaWQgY3JlYXRlQ2hpbGRDb250ZW50KCldKSB7CiAgICBvcGVuKGlkLCBkYXRhKTsKICAgIGlmIChjcmVhdGVDaGlsZENvbnRlbnQgIT0gbnVsbCkgY3JlYXRlQ2hpbGRDb250ZW50KCk7CiAgICBjbG9zZShpZCk7CiAgfQoKICAvLy8gRW5kIGEgc3RhdCBlbnRyeSBmb3IgW2lkXS4KICB2b2lkIGNsb3NlKFN0cmluZyBpZCkge30KCiAgLy8vIFN0YXJ0cyBhIGdyb3VwIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCiAgdm9pZCBiZWdpbkV4dHJhKCkge30KCiAgLy8vIFN0YXJ0cyBhIGdyb3VwIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCiAgdm9pZCBlbmRFeHRyYSgpIHt9Cn0KCi8vLyBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBbQ29uc29sZVByaW50ZXJdIGFuZCBbWE1MUHJpbnRlcl0uCmFic3RyYWN0IGNsYXNzIEJhc2VQcmludGVyIGV4dGVuZHMgU3RhdHNQcmludGVyIHdpdGggSW5kZW50YXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIGludCBleGFtcGxlczsKICBmaW5hbCBTdGF0c091dHB1dCBvdXRwdXQ7CgogIEJhc2VQcmludGVyKHt0aGlzLm91dHB1dDogY29uc3QgRGVidWdPdXRwdXQoKSwgdGhpcy5leGFtcGxlczogMTB9KSB7CiAgICBpbmRlbnRhdGlvblVuaXQgPSAiICI7CiAgfQp9CgovLy8gW1N0YXRzUHJpbnRlcl0gdGhhdCBkaXNwbGF5cyBzdGF0cyBpbiBjb25zb2xlIGxpbmVzLgpjbGFzcyBDb25zb2xlUHJpbnRlciBleHRlbmRzIEJhc2VQcmludGVyIHsKICBpbnQgZXh0cmFMZXZlbCA9IDA7CgogIENvbnNvbGVQcmludGVyKHtTdGF0c091dHB1dCBvdXRwdXQ6IGNvbnN0IERlYnVnT3V0cHV0KCksIGludCBleGFtcGxlczogMTB9KQogICAgICA6IHN1cGVyKG91dHB1dDogb3V0cHV0LCBleGFtcGxlczogZXhhbXBsZXMpOwoKICBAb3ZlcnJpZGUKICB2b2lkIG9wZW4oU3RyaW5nIGlkLAogICAgICBbTWFwPFN0cmluZywgZHluYW1pYz4gZGF0YSA9IGNvbnN0IDxTdHJpbmcsIGR5bmFtaWM+e31dKSB7CiAgICBpZiAoZXh0cmFMZXZlbCA+IDApIHJldHVybjsKCiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZShpbmRlbnRhdGlvbik7CiAgICBTdHJpbmcgc3BhY2UgPSAnJzsKICAgIGlmIChkYXRhWyd0aXRsZSddICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJyR7ZGF0YVsndGl0bGUnXX06Jyk7CiAgICAgIHNwYWNlID0gJyAnOwogICAgICBkYXRhLnJlbW92ZSgndGl0bGUnKTsKICAgIH0gZWxzZSBpZiAoZGF0YVsnbmFtZSddICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJyR7ZGF0YVsnbmFtZSddfScpOwogICAgICBzcGFjZSA9ICcgJzsKICAgICAgZGF0YS5yZW1vdmUoJ25hbWUnKTsKICAgIH0KICAgIEl0ZXJhYmxlIG5vbk51bGxWYWx1ZXMgPSBkYXRhLnZhbHVlcy53aGVyZSgodikgPT4gdiAhPSBudWxsKTsKICAgIGlmIChub25OdWxsVmFsdWVzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHNiLndyaXRlKCckc3BhY2Uke25vbk51bGxWYWx1ZXMuZmlyc3R9Jyk7CiAgICB9IGVsc2UgewogICAgICBkYXRhLmZvckVhY2goKGtleSwgdmFsdWUpIHsKICAgICAgICBzYi53cml0ZSgnJHNwYWNlJGtleT0kdmFsdWUnKTsKICAgICAgICBzcGFjZSA9ICcgJzsKICAgICAgfSk7CiAgICB9CiAgICBvdXRwdXQucHJpbnRsbihzYi50b1N0cmluZygpKTsKICAgIGluZGVudE1vcmUoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2xvc2UoU3RyaW5nIGlkKSB7CiAgICBpZiAoZXh0cmFMZXZlbCA+IDApIHJldHVybjsKCiAgICBpbmRlbnRMZXNzKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRXh0cmEoKSB7CiAgICBpZiAoZXh0cmFMZXZlbCA9PSAwKSBvdXRwdXQucHJpbnRsbignJGluZGVudGF0aW9uLi4uJyk7CiAgICBleHRyYUxldmVsKys7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEV4dHJhKCkgewogICAgZXh0cmFMZXZlbC0tOwogIH0KfQoKLy8vIFtTdGF0c1ByaW50ZXJdIHRoYXQgZGlzcGxheXMgc3RhdHMgaW4gWE1MIGZvcm1hdC4KY2xhc3MgWE1MUHJpbnRlciBleHRlbmRzIEJhc2VQcmludGVyIHsKICBzdGF0aWMgY29uc3QgSHRtbEVzY2FwZSBlc2NhcGUgPSBjb25zdCBIdG1sRXNjYXBlKCk7CiAgYm9vbCBvcGVuZWQgPSBmYWxzZTsKCiAgWE1MUHJpbnRlcih7b3V0cHV0OiBjb25zdCBEZWJ1Z091dHB1dCgpLCBpbnQgZXhhbXBsZXM6IDEwfSkKICAgICAgOiBzdXBlcihvdXRwdXQ6IG91dHB1dCwgZXhhbXBsZXM6IGV4YW1wbGVzKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBzdGFydChTdHJpbmcgaWQpIHsKICAgIGlmICghb3BlbmVkKSB7CiAgICAgIG91dHB1dC5wcmludGxuKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PicpOwogICAgICBvcGVuZWQgPSB0cnVlOwogICAgfQogICAgb3BlbihpZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZChTdHJpbmcgaWQpIHsKICAgIGNsb3NlKGlkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgb3BlbihTdHJpbmcgaWQsCiAgICAgIFtNYXA8U3RyaW5nLCBkeW5hbWljPiBkYXRhID0gY29uc3QgPFN0cmluZywgZHluYW1pYz57fV0pIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKGluZGVudGF0aW9uKTsKICAgIHNiLndyaXRlKCc8JGlkJyk7CiAgICBkYXRhLmZvckVhY2goKGtleSwgdmFsdWUpIHsKICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgICBzYi53cml0ZSgnICRrZXk9IiR7ZXNjYXBlLmNvbnZlcnQoJyR2YWx1ZScpfSInKTsKICAgICAgfQogICAgfSk7CiAgICBzYi53cml0ZSgnPicpOwogICAgb3V0cHV0LnByaW50bG4oc2IudG9TdHJpbmcoKSk7CiAgICBpbmRlbnRNb3JlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNsb3NlKFN0cmluZyBpZCkgewogICAgaW5kZW50TGVzcygpOwogICAgb3V0cHV0LnByaW50bG4oJyR7aW5kZW50YXRpb259PC8kaWQ+Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRXh0cmEoKSB7CiAgICBvcGVuKCdleHRyYScpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRFeHRyYSgpIHsKICAgIGNsb3NlKCdleHRyYScpOwogIH0KfQoKLy8vIEEgbm9kZSBpbiBhIHN0YWNrIHRyYWNlIHRyZWUgdXNlZCB0byBzdG9yZSBhbmQgb3JnYW5pemUgc3RhY2sgdHJhY2VzIGJ5Ci8vLyBjb21tb24gcHJlZml4ZXMuCmNsYXNzIF9TdGFja1RyYWNlTm9kZSBpbXBsZW1lbnRzIENvbXBhcmFibGU8X1N0YWNrVHJhY2VOb2RlPiB7CiAgaW50IGNvdW50OwogIExpc3Q8U3RhY2tUcmFjZUxpbmU+IGNvbW1vblByZWZpeDsKICBMaXN0PF9TdGFja1RyYWNlTm9kZT4gc3VidHJhY2VzOwoKICBfU3RhY2tUcmFjZU5vZGUodGhpcy5jb21tb25QcmVmaXgsIHRoaXMuY291bnQsIHRoaXMuc3VidHJhY2VzKTsKCiAgX1N0YWNrVHJhY2VOb2RlLnJvb3QoKSA6IHRoaXMoW10sIDAsIFtdKTsKCiAgX1N0YWNrVHJhY2VOb2RlLmxlYWYoU3RhY2tUcmFjZUxpbmVzIHN0YWNrVHJhY2UpCiAgICAgIDogdGhpcyhzdGFja1RyYWNlLmxpbmVzLCAxLCBjb25zdCBbXSk7CgogIF9TdGFja1RyYWNlTm9kZS5ub2RlKExpc3Q8U3RhY2tUcmFjZUxpbmU+IGNvbW1vblByZWZpeCwgX1N0YWNrVHJhY2VOb2RlIGZpcnN0LAogICAgICBfU3RhY2tUcmFjZU5vZGUgc2Vjb25kKQogICAgICA6IHRoaXMoY29tbW9uUHJlZml4LCBmaXJzdC5jb3VudCArIHNlY29uZC5jb3VudCwgW2ZpcnN0LCBzZWNvbmRdKTsKCiAgdm9pZCBhZGQoU3RhY2tUcmFjZUxpbmVzIHN0YWNrVHJhY2UpIHsKICAgIGNvdW50Kys7CiAgICBpZiAoIXN0YWNrVHJhY2UubGluZXMuaXNFbXB0eSkgewogICAgICBhZGRTdWJ0cmFjZShzdGFja1RyYWNlKTsKICAgIH0KICB9CgogIHZvaWQgYWRkU3VidHJhY2UoU3RhY2tUcmFjZUxpbmVzIHN0YWNrVHJhY2UpIHsKICAgIExpc3Q8U3RhY2tUcmFjZUxpbmU+IGxpbmVzID0gc3RhY2tUcmFjZS5saW5lczsKICAgIGZvciAoX1N0YWNrVHJhY2VOb2RlIHN1YnRyYWNlIGluIHN1YnRyYWNlcykgewogICAgICBpbnQgY29tbW9uUHJlZml4TGVuZ3RoID0KICAgICAgICAgIGxvbmdlc3RDb21tb25QcmVmaXhMZW5ndGgoc3VidHJhY2UuY29tbW9uUHJlZml4LCBsaW5lcyk7CiAgICAgIGlmIChjb21tb25QcmVmaXhMZW5ndGggPiAwKSB7CiAgICAgICAgc3RhY2tUcmFjZSA9IHN0YWNrVHJhY2Uuc3VidHJhY2UoY29tbW9uUHJlZml4TGVuZ3RoKTsKICAgICAgICBpZiAoY29tbW9uUHJlZml4TGVuZ3RoID09IHN1YnRyYWNlLmNvbW1vblByZWZpeC5sZW5ndGgpIHsKICAgICAgICAgIHN1YnRyYWNlLmFkZChzdGFja1RyYWNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3VidHJhY2UuY29tbW9uUHJlZml4ID0KICAgICAgICAgICAgICBzdWJ0cmFjZS5jb21tb25QcmVmaXguc3VibGlzdChjb21tb25QcmVmaXhMZW5ndGgpOwogICAgICAgICAgc3VidHJhY2VzLnJlbW92ZShzdWJ0cmFjZSk7CiAgICAgICAgICBzdWJ0cmFjZXMuYWRkKG5ldyBfU3RhY2tUcmFjZU5vZGUubm9kZSgKICAgICAgICAgICAgICBsaW5lcy5zdWJsaXN0KDAsIGNvbW1vblByZWZpeExlbmd0aCksCiAgICAgICAgICAgICAgc3VidHJhY2UsCiAgICAgICAgICAgICAgbmV3IF9TdGFja1RyYWNlTm9kZS5sZWFmKHN0YWNrVHJhY2UpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgc3VidHJhY2VzLmFkZChuZXcgX1N0YWNrVHJhY2VOb2RlLmxlYWYoc3RhY2tUcmFjZSkpOwogIH0KCiAgdm9pZCBkdW1wVHJhY2VzKFN0YXRzUHJpbnRlciBwcmludGVyKSB7CiAgICBwcmludGVyLm9wZW4oJ3RyYWNlJywgeydjb3VudCc6IGNvdW50LCAnbGluZSc6IGNvbW1vblByZWZpeC5maXJzdH0pOwogICAgaWYgKGNvbW1vblByZWZpeC5sZW5ndGggPiAxKSB7CiAgICAgIGZvciAoU3RhY2tUcmFjZUxpbmUgbGluZSBpbiBjb21tb25QcmVmaXguc2tpcCgxKSkgewogICAgICAgIHByaW50ZXIuY2hpbGQoJ3RyYWNlJywgeydsaW5lJzogbGluZX0pOwogICAgICB9CiAgICB9CiAgICBkdW1wU3VidHJhY2VzKHByaW50ZXIpOwogICAgcHJpbnRlci5jbG9zZSgndHJhY2UnKTsKICB9CgogIHZvaWQgZHVtcFN1YnRyYWNlcyhTdGF0c1ByaW50ZXIgcHJpbnRlcikgewogICAgaWYgKCFzdWJ0cmFjZXMuaXNFbXB0eSkgewogICAgICBzdWJ0cmFjZXMuc29ydCgpOwogICAgICBmb3IgKF9TdGFja1RyYWNlTm9kZSBzdGVwIGluIHN1YnRyYWNlcykgewogICAgICAgIHN0ZXAuZHVtcFRyYWNlcyhwcmludGVyKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGNvbXBhcmVUbyhfU3RhY2tUcmFjZU5vZGUgb3RoZXIpIHsKICAgIC8vIFNvcnRzIGluIGRlY3JlYXNpbmcgY291bnQgb3JkZXIuCiAgICByZXR1cm4gb3RoZXIuY291bnQgLSBjb3VudDsKICB9CgogIHZvaWQgcHJpbnRPbihTdHJpbmdCdWZmZXIgc2IsIFN0cmluZyBpbmRlbnRhdGlvbikgewogICAgU3RyaW5nIGNvdW50VGV4dCA9ICckaW5kZW50YXRpb24kY291bnQgICc7CiAgICBzYi53cml0ZShjb3VudFRleHQpOwogICAgc2Iud3JpdGUoJ1xuJyk7CiAgICBpbmRlbnRhdGlvbiA9ICcnLnBhZExlZnQoY291bnRUZXh0Lmxlbmd0aCwgJyAnKTsKICAgIGlmIChjb21tb25QcmVmaXggIT0gbnVsbCkgewogICAgICBpbnQgaW5kZXggPSAwOwogICAgICBmb3IgKFN0YWNrVHJhY2VMaW5lIGxpbmUgaW4gY29tbW9uUHJlZml4KSB7CiAgICAgICAgc2Iud3JpdGUoaW5kZW50YXRpb24pOwogICAgICAgIGlmIChpbmRleCA+IDEpIHsKICAgICAgICAgIHNiLndyaXRlKCcuLi5cbicpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHNiLndyaXRlKGxpbmUpOwogICAgICAgIHNiLndyaXRlKCdcbicpOwogICAgICAgIGluZGV4Kys7CiAgICAgIH0KICAgIH0KICAgIHN1YnRyYWNlcy5zb3J0KCk7CiAgICBmb3IgKF9TdGFja1RyYWNlTm9kZSBzdWJ0cmFjZSBpbiBzdWJ0cmFjZXMpIHsKICAgICAgc3VidHJhY2UucHJpbnRPbihzYiwgaW5kZW50YXRpb24pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgcHJpbnRPbihzYiwgJycpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgpjbGFzcyBfU3RhY2tUcmFjZVRyZWUgZXh0ZW5kcyBfU3RhY2tUcmFjZU5vZGUgewogIGZpbmFsIGlkOwogIGludCB0b3RhbENvdW50ID0gMDsKICBmaW5hbCBpbnQgc2FtcGxlRnJlcXVlbmN5OwoKICBfU3RhY2tUcmFjZVRyZWUodGhpcy5pZCwgdGhpcy5zYW1wbGVGcmVxdWVuY3kpIDogc3VwZXIucm9vdCgpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGR1bXBUcmFjZXMoU3RhdHNQcmludGVyIHByaW50ZXIpIHsKICAgIHByaW50ZXIub3BlbigndHJhY2UnLCB7CiAgICAgICdpZCc6IGlkLAogICAgICAndG90YWxDb3VudCc6IHRvdGFsQ291bnQsCiAgICAgICdzYW1wbGVGcmVxdWVuY3knOiBzYW1wbGVGcmVxdWVuY3kKICAgIH0pOwogICAgZHVtcFN1YnRyYWNlcyhwcmludGVyKTsKICAgIHByaW50ZXIuY2xvc2UoJ3RyYWNlJyk7CiAgfQoKICB2b2lkIHNhbXBsZSgpIHsKICAgIGlmICh0b3RhbENvdW50KysgJSBzYW1wbGVGcmVxdWVuY3kgPT0gMCkgewogICAgICBhZGQoc3RhY2tUcmFjZShvZmZzZXQ6IDMpKTsKICAgIH0KICB9Cn0KCi8vLyBBY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgW1N0YXRzXS4KY2xhc3MgQWN0aXZlU3RhdHMgaW1wbGVtZW50cyBTdGF0cyB7CiAgZmluYWwgU3RhdHNQcmludGVyIHByaW50ZXI7CiAgTWFwPGR5bmFtaWMsIE1hcD4gbWFwcyA9IHt9OwogIE1hcDxkeW5hbWljLCBNYXA8ZHluYW1pYywgTGlzdD4+IGZyZXF1ZW5jeU1hcHMgPSB7fTsKICBNYXA8ZHluYW1pYywgTWFwPiBzZXRzTWFwID0ge307CiAgTWFwPGR5bmFtaWMsIE1hcDxkeW5hbWljLCBMaXN0Pj4gY291bnRlcnNNYXAgPQogICAgICA8ZHluYW1pYywgTWFwPGR5bmFtaWMsIExpc3Q+Pnt9OwogIE1hcDxkeW5hbWljLCBfU3RhY2tUcmFjZVRyZWU+IHRyYWNlTWFwID0ge307CiAgQG92ZXJyaWRlCiAgaW50IHN0YWNrVHJhY2VTYW1wbGVGcmVxdWVuY3kgPSAxOwoKICBBY3RpdmVTdGF0cyhTdGF0c1ByaW50ZXIgdGhpcy5wcmludGVyKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCByZWNvcmRNYXAoaWQsIGtleSwgdmFsdWUsIHtmcm9tRXhpc3RpbmcodmFsdWUpfSkgewogICAgTWFwIG1hcCA9IG1hcHMucHV0SWZBYnNlbnQoaWQsICgpID0+IHt9KTsKICAgIGlmIChmcm9tRXhpc3RpbmcgIT0gbnVsbCAmJiBtYXAuY29udGFpbnNLZXkoa2V5KSkgewogICAgICBtYXBba2V5XSA9IGZyb21FeGlzdGluZyhtYXBba2V5XSk7CiAgICB9IGVsc2UgewogICAgICBtYXBba2V5XSA9IHZhbHVlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgTWFwIGdldE1hcChrZXkpIHsKICAgIHJldHVybiBtYXBzW2tleV07CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlY29yZEZyZXF1ZW5jeShpZCwgdmFsdWUsIFtleGFtcGxlXSkgewogICAgTWFwPGR5bmFtaWMsIExpc3Q+IG1hcCA9IGZyZXF1ZW5jeU1hcHMucHV0SWZBYnNlbnQoaWQsICgpID0+IHt9KTsKICAgIG1hcC5wdXRJZkFic2VudCh2YWx1ZSwgKCkgPT4gW10pOwogICAgbWFwW3ZhbHVlXS5hZGQoZXhhbXBsZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlY29yZEZyZXF1ZW5jaWVzKGlkLCBNYXA8ZHluYW1pYywgSXRlcmFibGU+IGZyZXF1ZW5jeU1hcCkgewogICAgTWFwPGR5bmFtaWMsIExpc3Q+IG1hcCA9IGZyZXF1ZW5jeU1hcHMucHV0SWZBYnNlbnQoaWQsICgpID0+IHt9KTsKICAgIGZyZXF1ZW5jeU1hcC5mb3JFYWNoKCh2YWx1ZSwgZXhhbXBsZXMpIHsKICAgICAgbWFwLnB1dElmQWJzZW50KHZhbHVlLCAoKSA9PiBbXSk7CiAgICAgIG1hcFt2YWx1ZV0uYWRkQWxsKGV4YW1wbGVzKTsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGUgcmVjb3JkZWRGcmVxdWVuY2llcyhpZCwgdmFsdWUpIHsKICAgIE1hcDxkeW5hbWljLCBMaXN0PiBtYXAgPSBmcmVxdWVuY3lNYXBzW2lkXTsKICAgIGlmIChtYXAgPT0gbnVsbCkgcmV0dXJuIGNvbnN0IFtdOwogICAgTGlzdCBsaXN0ID0gbWFwW3ZhbHVlXTsKICAgIGlmIChsaXN0ID09IG51bGwpIHJldHVybiBjb25zdCBbXTsKICAgIHJldHVybiBsaXN0OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWNvcmRDb3VudGVyKGlkLCBbcmVhc29uLCBleGFtcGxlXSkgewogICAgTWFwPGR5bmFtaWMsIExpc3Q+IG1hcCA9IGNvdW50ZXJzTWFwLnB1dElmQWJzZW50KGlkLCAoKSA9PiB7fSk7CiAgICBtYXAucHV0SWZBYnNlbnQocmVhc29uLCAoKSA9PiBbXSkuYWRkKGV4YW1wbGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWNvcmRFbGVtZW50KGtleSwgZWxlbWVudCwge2RhdGF9KSB7CiAgICBzZXRzTWFwLnB1dElmQWJzZW50KGtleSwgKCkgPT4gbmV3IE1hcCgpKVtlbGVtZW50XSA9IGRhdGE7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlY29yZFRyYWNlKGtleSwge2ludCBzYW1wbGVGcmVxdWVuY3l9KSB7CiAgICBpZiAoc2FtcGxlRnJlcXVlbmN5ID09IG51bGwpIHsKICAgICAgc2FtcGxlRnJlcXVlbmN5ID0gc3RhY2tUcmFjZVNhbXBsZUZyZXF1ZW5jeTsKICAgIH0KICAgIHRyYWNlTWFwCiAgICAgICAgLnB1dElmQWJzZW50KGtleSwgKCkgPT4gbmV3IF9TdGFja1RyYWNlVHJlZShrZXksIHNhbXBsZUZyZXF1ZW5jeSkpCiAgICAgICAgLnNhbXBsZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGUgZ2V0TGlzdChTdHJpbmcga2V5KSB7CiAgICBNYXAgbWFwID0gc2V0c01hcFtrZXldOwogICAgaWYgKG1hcCA9PSBudWxsKSByZXR1cm4gY29uc3QgW107CiAgICByZXR1cm4gbWFwLmtleXM7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGR1bXBTdGF0cyh7dm9pZCBiZWZvcmVDbG9zZSgpfSkgewogICAgcHJpbnRlci5zdGFydCgnc3RhdHMnKTsKICAgIGR1bXBGcmVxdWVuY2llcygpOwogICAgZHVtcFNldHMoKTsKICAgIGR1bXBDb3VudGVycygpOwogICAgZHVtcFRyYWNlcygpOwogICAgaWYgKGJlZm9yZUNsb3NlICE9IG51bGwpIHsKICAgICAgYmVmb3JlQ2xvc2UoKTsKICAgIH0KICAgIHByaW50ZXIuZW5kKCdzdGF0cycpOwogIH0KCiAgdm9pZCBkdW1wU2V0cygpIHsKICAgIHByaW50ZXIuZ3JvdXAoJ3NldHMnLCAoKSB7CiAgICAgIHNldHNNYXAuZm9yRWFjaCgoaywgc2V0KSB7CiAgICAgICAgZHVtcEl0ZXJhYmxlKCdleGFtcGxlcycsICckaycsIHNldC5rZXlzLAogICAgICAgICAgICBsaW1pdDogcHJpbnRlci5leGFtcGxlcywgZGF0YU1hcDogc2V0KTsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIHZvaWQgZHVtcEZyZXF1ZW5jaWVzKCkgewogICAgcHJpbnRlci5ncm91cCgnZnJlcXVlbmNpZXMnLCAoKSB7CiAgICAgIGZyZXF1ZW5jeU1hcHMuZm9yRWFjaCgoa2V5LCBNYXA8ZHluYW1pYywgTGlzdD4gbWFwKSB7CiAgICAgICAgcHJpbnRlci5jaGlsZCgnZnJlcXVlbmN5Jywgeyd0aXRsZSc6ICcka2V5J30sICgpIHsKICAgICAgICAgIGR1bXBGcmVxdWVuY3kobWFwKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIHZvaWQgZHVtcEZyZXF1ZW5jeShNYXA8ZHluYW1pYywgSXRlcmFibGU+IG1hcCkgewogICAgTWFwIHNvcnRlZE1hcCA9IHRyeVNvcnRNYXAobWFwKTsKICAgIHNvcnRlZE1hcC5mb3JFYWNoKChrLCBsaXN0KSB7CiAgICAgIGR1bXBJdGVyYWJsZSgnZXhhbXBsZXMnLCAnJGsnLCBsaXN0LCBsaW1pdDogcHJpbnRlci5leGFtcGxlcyk7CiAgICB9KTsKICB9CgogIHZvaWQgZHVtcENvdW50ZXJzKCkgewogICAgcHJpbnRlci5ncm91cCgnY291bnRlcnMnLCAoKSB7CiAgICAgIGNvdW50ZXJzTWFwLmtleXMuZm9yRWFjaChkdW1wQ291bnRlcik7CiAgICB9KTsKICB9CgogIHZvaWQgZHVtcENvdW50ZXIoaWQpIHsKICAgIE1hcDxkeW5hbWljLCBMaXN0PiBtYXAgPSBjb3VudGVyc01hcFtpZF07CiAgICBib29sIGhhc0RhdGEoZXhhbXBsZSkgewogICAgICBpZiAobWFwID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgICAgTGlzdCBsaXN0ID0gbWFwW2V4YW1wbGVdOwogICAgICBpZiAobGlzdCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAgIHJldHVybiBsaXN0LmFueSgoZGF0YSkgPT4gZGF0YSAhPSBudWxsKTsKICAgIH0KCiAgICBpbnQgY291bnQgPSAwOwogICAgTWFwPGR5bmFtaWMsIGludD4gZnJlcXVlbmN5TWFwID0ge307CiAgICBtYXAuZm9yRWFjaCgodmFyIGNhdGVnb3J5LCBMaXN0IGV4YW1wbGVzKSB7CiAgICAgIGlmIChjYXRlZ29yeSAhPSBudWxsKSB7CiAgICAgICAgZnJlcXVlbmN5TWFwLnB1dElmQWJzZW50KGNhdGVnb3J5LCAoKSA9PiAwKTsKICAgICAgICBmcmVxdWVuY3lNYXBbY2F0ZWdvcnldICs9IGV4YW1wbGVzLmxlbmd0aDsKICAgICAgfQogICAgICBjb3VudCArPSBleGFtcGxlcy5sZW5ndGg7CiAgICB9KTsKICAgIE1hcDxpbnQsIFNldD4gcmVzdWx0ID0gc29ydE1hcChpbnZlcnNlTWFwKGZyZXF1ZW5jeU1hcCksIChhLCBiKSA9PiBiIC0gYSk7CiAgICBpbnQgZXhhbXBsZXNMaW1pdCA9IG51bGw7CiAgICBpZiAocHJpbnRlci5leGFtcGxlcyAhPSBudWxsICYmIHJlc3VsdC5sZW5ndGggPj0gcHJpbnRlci5leGFtcGxlcykgewogICAgICBleGFtcGxlc0xpbWl0ID0gMDsKICAgIH0KICAgIGludCBjb3VudGVyID0gMDsKICAgIGJvb2wgaGFzTW9yZSA9IGZhbHNlOwogICAgcHJpbnRlci5vcGVuKCdjb3VudGVyJywgeyd0aXRsZSc6ICckaWQnLCAnY291bnQnOiBjb3VudH0pOwogICAgcmVzdWx0LmZvckVhY2goKGludCBjb3VudCwgU2V0IGV4YW1wbGVzKSB7CiAgICAgIGlmIChjb3VudGVyID09IHByaW50ZXIuZXhhbXBsZXMpIHsKICAgICAgICBwcmludGVyLmJlZ2luRXh0cmEoKTsKICAgICAgICBoYXNNb3JlID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoZXhhbXBsZXMubGVuZ3RoID09IDEgJiYKICAgICAgICAgIChleGFtcGxlc0xpbWl0ID09IDAgfHwgIWhhc0RhdGEoZXhhbXBsZXMuZmlyc3QpKSkgewogICAgICAgIHByaW50ZXIuY2hpbGQoJ2V4YW1wbGVzJywgeydjb3VudCc6IGNvdW50LCAnZXhhbXBsZSc6IGV4YW1wbGVzLmZpcnN0fSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnRlci5jaGlsZCgnZXhhbXBsZXMnLCB7J2NvdW50JzogY291bnQsICdleGFtcGxlcyc6IGV4YW1wbGVzLmxlbmd0aH0sCiAgICAgICAgICAgICgpIHsKICAgICAgICAgIGV4YW1wbGVzLmZvckVhY2goKGV4YW1wbGUpIHsKICAgICAgICAgICAgZHVtcEl0ZXJhYmxlKCdleGFtcGxlcycsICckZXhhbXBsZScsIG1hcFtleGFtcGxlXSwKICAgICAgICAgICAgICAgIGxpbWl0OiBleGFtcGxlc0xpbWl0LCBpbmNsdWRlQ291bnQ6IGZhbHNlKTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGNvdW50ZXIrKzsKICAgIH0pOwogICAgaWYgKGhhc01vcmUpIHsKICAgICAgcHJpbnRlci5lbmRFeHRyYSgpOwogICAgfQogICAgcHJpbnRlci5jbG9zZSgnY291bnRlcicpOwogIH0KCiAgdm9pZCBkdW1wVHJhY2VzKCkgewogICAgcHJpbnRlci5ncm91cCgndHJhY2VzJywgKCkgewogICAgICB0cmFjZU1hcC5rZXlzLmZvckVhY2goZHVtcFRyYWNlKTsKICAgIH0pOwogIH0KCiAgdm9pZCBkdW1wVHJhY2Uoa2V5KSB7CiAgICBfU3RhY2tUcmFjZVRyZWUgdHJlZSA9IHRyYWNlTWFwW2tleV07CiAgICB0cmVlLmR1bXBUcmFjZXMocHJpbnRlcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGR1bXBDb3JyZWxhdGlvbihrZXlBLCBJdGVyYWJsZSBhLCBrZXlCLCBJdGVyYWJsZSBiLAogICAgICB7TWFwIGRhdGFBLCBNYXAgZGF0YUJ9KSB7CiAgICBwcmludGVyLmNoaWxkKCdjb3JyZWxhdGlvbnMnLCB7J3RpdGxlJzogJyRrZXlBIHZzICRrZXlCJ30sICgpIHsKICAgICAgTGlzdCBhQW5kQiA9IGEud2hlcmUoKGUpID0+IGUgIT0gbnVsbCAmJiBiLmNvbnRhaW5zKGUpKS50b0xpc3QoKTsKICAgICAgTGlzdCBhQW5kTm90QiA9IGEud2hlcmUoKGUpID0+IGUgIT0gbnVsbCAmJiAhYi5jb250YWlucyhlKSkudG9MaXN0KCk7CiAgICAgIExpc3Qgbm90QWFuZEIgPSBiLndoZXJlKChlKSA9PiBlICE9IG51bGwgJiYgIWEuY29udGFpbnMoZSkpLnRvTGlzdCgpOwogICAgICBkdW1wSXRlcmFibGUoJ2NvcnJlbGF0aW9uJywgJyRrZXlBICYmICRrZXlCJywgYUFuZEIsCiAgICAgICAgICBkYXRhTWFwOiBkYXRhQSwgbGltaXQ6IHByaW50ZXIuZXhhbXBsZXMpOwogICAgICBkdW1wSXRlcmFibGUoJ2NvcnJlbGF0aW9uJywgJyRrZXlBICYmICEka2V5QicsIGFBbmROb3RCLAogICAgICAgICAgZGF0YU1hcDogZGF0YUEsIGxpbWl0OiBwcmludGVyLmV4YW1wbGVzKTsKICAgICAgZHVtcEl0ZXJhYmxlKCdjb3JyZWxhdGlvbicsICchJGtleUEgJiYgJGtleUInLCBub3RBYW5kQiwKICAgICAgICAgIGRhdGFNYXA6IGRhdGFCLCBsaW1pdDogcHJpbnRlci5leGFtcGxlcyk7CiAgICB9KTsKICB9CgogIHZvaWQgZHVtcEl0ZXJhYmxlKFN0cmluZyB0YWcsIFN0cmluZyB0aXRsZSwgSXRlcmFibGUgaXRlcmFibGUsCiAgICAgIHtpbnQgbGltaXQsIE1hcCBkYXRhTWFwLCBib29sIGluY2x1ZGVDb3VudDogdHJ1ZX0pIHsKICAgIGlmIChsaW1pdCA9PSAwKSByZXR1cm47CgogICAgTWFwPFN0cmluZywgZHluYW1pYz4gY2hpbGREYXRhID0ge307CiAgICBJdGVyYWJsZSBub25OdWxsSXRlcmFibGUgPSBpdGVyYWJsZS53aGVyZSgoZSkgPT4gZSAhPSBudWxsKTsKICAgIGlmIChub25OdWxsSXRlcmFibGUuaXNFbXB0eSAmJiAhaW5jbHVkZUNvdW50KSB7CiAgICAgIGNoaWxkRGF0YVsnbmFtZSddID0gdGl0bGU7CiAgICB9IGVsc2UgewogICAgICBjaGlsZERhdGFbJ3RpdGxlJ10gPSB0aXRsZTsKICAgIH0KICAgIGlmIChpbmNsdWRlQ291bnQpIHsKICAgICAgY2hpbGREYXRhWydjb3VudCddID0gaXRlcmFibGUubGVuZ3RoOwogICAgfQogICAgcHJpbnRlci5jaGlsZCh0YWcsIGNoaWxkRGF0YSwgKCkgewogICAgICBib29sIGhhc01vcmUgPSBmYWxzZTsKICAgICAgaW50IGNvdW50ZXIgPSAwOwogICAgICBub25OdWxsSXRlcmFibGUuZm9yRWFjaCgoZWxlbWVudCkgewogICAgICAgIGlmIChjb3VudGVyID09IGxpbWl0KSB7CiAgICAgICAgICBwcmludGVyLmJlZ2luRXh0cmEoKTsKICAgICAgICAgIGhhc01vcmUgPSB0cnVlOwogICAgICAgIH0KICAgICAgICB2YXIgZGF0YSA9IGRhdGFNYXAgIT0gbnVsbCA/IGRhdGFNYXBbZWxlbWVudF0gOiBudWxsOwogICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKICAgICAgICAgIHByaW50ZXIuY2hpbGQoJ2V4YW1wbGUnLCB7J3ZhbHVlJzogZWxlbWVudCwgJ2RhdGEnOiBkYXRhfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHByaW50ZXIuY2hpbGQoJ2V4YW1wbGUnLCB7J3ZhbHVlJzogZWxlbWVudH0pOwogICAgICAgIH0KICAgICAgICBjb3VudGVyKys7CiAgICAgIH0pOwogICAgICBpZiAoaGFzTW9yZSkgewogICAgICAgIHByaW50ZXIuZW5kRXh0cmEoKTsKICAgICAgfQogICAgfSk7CiAgfQp9CgovLy8gUmV0dXJucyBhIG1hcCB0aGF0IGlzIGFuIGludmVyc2lvbiBvZiBbbWFwXSwgd2hlcmUgdGhlIGtleXMgYXJlIHRoZSB2YWx1ZXMKLy8vIG9mIFttYXBdIGFuZCB0aGUgdmFsdWVzIGFyZSB0aGUgc2V0IG9mIGtleXMgaW4gW21hcF0gdGhhdCBzaGFyZSB2YWx1ZXMuCi8vLwovLy8gSWYgW2VxdWFsc10gYW5kIFtoYXNoQ29kZV0gYXJlIHByb3ZpZGVkLCB0aGVzZSBhcmUgdXNlZCB0byBkZXRlcm1pbmUKLy8vIGVxdWFsaXR5IGFtb25nIHRoZSB2YWx1ZXMgb2YgW21hcF0uCi8vLwovLy8gSWYgW2lzVmFsaWRLZXldIGlzIHByb3ZpZGVkLCB0aGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdpdGggYSB2YWx1ZSBvZiBbbWFwXQovLy8gaXMgYSBwb3RlbnRpYWwga2V5IG9mIHRoZSBpbnZlcnNpb24gbWFwLgpNYXA8ViwgU2V0PEs+PiBpbnZlcnNlTWFwPEssIFY+KE1hcDxLLCBWPiBtYXAsCiAgICB7Ym9vbCBlcXVhbHMoViBrZXkxLCBWIGtleTIpLAogICAgaW50IGhhc2hDb2RlKFYga2V5KSwKICAgIGJvb2wgaXNWYWxpZEtleShWIHBvdGVudGlhbEtleSl9KSB7CiAgTWFwPFYsIFNldDxLPj4gcmVzdWx0ID0gbmV3IExpbmtlZEhhc2hNYXA8ViwgU2V0PEs+PigKICAgICAgZXF1YWxzOiBlcXVhbHMsIGhhc2hDb2RlOiBoYXNoQ29kZSwgaXNWYWxpZEtleTogaXNWYWxpZEtleSk7CiAgbWFwLmZvckVhY2goKGssIHYpIHsKICAgIGlmIChpc1ZhbGlkS2V5ID09IG51bGwgfHwgaXNWYWxpZEtleSh2KSkgewogICAgICByZXN1bHQucHV0SWZBYnNlbnQodiwgKCkgPT4gbmV3IFNldCgpKS5hZGQoayk7CiAgICB9CiAgfSk7CiAgcmV0dXJuIHJlc3VsdDsKfQoKLy8vIFJldHVybiBhIG5ldyBtYXAgaGV1cmlzdGljYWxseSBzb3J0ZWQgYnkgdGhlIGtleXMgb2YgW21hcF0uIElmIHRoZSBmaXJzdAovLy8ga2V5IG9mIFttYXBdIGlzIFtDb21wYXJhYmxlXSwgdGhlIGtleXMgYXJlIHNvcnRlZCB1c2luZyBbc29ydE1hcF0gdW5kZXIKLy8vIHRoZSBhc3N1bXB0aW9uIHRoYXQgYWxsIGtleXMgYXJlIFtDb21wYXJhYmxlXS4KLy8vIE90aGVyd2lzZSwgdGhlIGtleXMgYXJlIHNvcnRlZCBhcyBzdHJpbmcgdXNpbmcgdGhlaXIgYHRvU3RyaW5nYAovLy8gcmVwcmVzZW50YXRpb24uCk1hcDxLLCBWPiB0cnlTb3J0TWFwPEssIFY+KE1hcDxLLCBW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YXAgdGhhdCBrZWVwcyB0cmFjawovLy8gb2YgdGhlICdmaW5hbCcgc2l6ZSBvZiBtYXBzIGdyb3VwZWQgYnkgZGVzY3JpcHRpb24uIEl0IGFsbG93cwovLy8gZGV0ZXJtaW5pbmcgdGhlIGRpc3RyaWJ1dGlvbiBvZiBzaXplcyBmb3IgYSBzcGVjaWZpYyBhbGxvY2F0aW9uCi8vLyBzaXRlIGFuZCBpdCBjYW4gYmUgdXNlZCBsaWtlIHRoaXM6Ci8vLwovLy8gICAgTWFwPFN0cmluZywgaW50PiBtYXAgPSBuZXcgVHJhY2tNYXA8U3RyaW5nLCBpbnQ+KCJteS1tYXAiKTsKLy8vCi8vLyBBZnRlciBmaW5pc2hpbmcgdGhlIGNvbXBpbGF0b24sIHRoZSBoaXN0b2dyYW0gb2YgdHJhY2sgbWFwIHNpemVzCi8vLyBpcyBwcmludGVkIGJ1dCBvbmx5IHdoZW4gcnVubmluZyBpbiB2ZXJib3NlIG1vZGUuCmNsYXNzIFRyYWNrTWFwPEssIFY+IGltcGxlbWVudHMgTWFwPEssIFY+IHsKICBmaW5hbCBNYXA8SywgVj4gX21hcDsKICBmaW5hbCBMaXN0IF9jb3VudHM7CiAgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8aW50Pj4gX2NvdW50c01hcCA9IHt9OwoKICBUcmFja01hcC5faW50ZXJuYWwodGhpcy5fY291bnRzKSA6IF9tYXAgPSBuZXcgTWFwPEssIFY+KCk7CgogIGZhY3RvcnkgVHJhY2tNYXAoU3RyaW5nIGRlc2NyaXB0aW9uKSB7CiAgICBMaXN0IGNvdW50cyA9IF9jb3VudHNNYXAucHV0SWZBYnNlbnQoZGVzY3JpcHRpb24sICgpID0+IFswXSk7CiAgICBNYXAgcmVzdWx0ID0gbmV3IFRyYWNrTWFwPEssIFY+Ll9pbnRlcm5hbChjb3VudHMpOwogICAgY291bnRzWzBdKys7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIHZvaWQgcHJpbnRIaXN0b2dyYW0oKSB7CiAgICBfY291bnRzTWFwLmZvckVhY2goKGRlc2NyaXB0aW9uLCBjb3VudHMpIHsKICAgICAgcHJpbnQoJyRkZXNjcmlwdGlvbiAtLSAke2NvdW50cy5sZW5ndGh9IG1hcHMnKTsKCiAgICAgIC8vIENvdW50IHRoZSB0b3RhbCBudW1iZXIgb2YgbWFwcy4KICAgICAgaW50IHN1bSA9IDA7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgc3VtICs9IGNvdW50c1tpXTsKICAgICAgfQogICAgICBpbnQgaW5jcmVtZW50ID0gc3VtIH4vIDEwOwogICAgICBpbnQgdGFyZ2V0ID0gaW5jcmVtZW50OwogICAgICBpbnQgYWNjdW11bGF0ZWQgPSAwOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50cy5sZW5ndGg7IGkrKykgewogICAgICAgIGFjY3VtdWxhdGVkICs9IGNvdW50c1tpXTsKICAgICAgICBpZiAoYWNjdW11bGF0ZWQgPj0gdGFyZ2V0KSB7CiAgICAgICAgICBTdHJpbmcgcGVyY2VudCA9IChhY2N1bXVsYXRlZCAvIHN1bSAqIDEwMCkudG9TdHJpbmdBc0ZpeGVkKDEpOwogICAgICAgICAgcHJpbnQoJyAgLS0gJHBlcmNlbnQlOiBsZW5ndGggPD0gJGknKTsKICAgICAgICAgIHRhcmdldCArPSBpbmNyZW1lbnQ7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgbGVuZ3RoID0+IF9tYXAubGVuZ3RoOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX21hcC5pc0VtcHR5OwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gX21hcC5pc05vdEVtcHR5OwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxLPiBnZXQga2V5cyA9PiBfbWFwLmtleXM7CiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Vj4gZ2V0IHZhbHVlcyA9PiBfbWFwLnZhbHVlczsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc0tleShPYmplY3Qga2V5KSA9PiBfbWFwLmNvbnRhaW5zS2V5KGtleSk7CiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgPT4gX21hcC5jb250YWluc1ZhbHVlKHZhbHVlKTsKCiAgQG92ZXJyaWRlCiAgViBvcGVyYXRvciBbXShPYmplY3Qga2V5KSA9PiBfbWFwW2tleV07CiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gX21hcC50b1N0cmluZygpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2godm9pZCBhY3Rpb24oSyBrZXksIFYgdmFsdWUpKSB7CiAgICBfbWFwLmZvckVhY2goYWN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgb3BlcmF0b3IgW109KEsga2V5LCBWIHZhbHVlKSB7CiAgICBpZiAoIV9tYXAuY29udGFpbnNLZXkoa2V5KSkgewogICAgICBfbm90aWZ5TGVuZ3RoQ2hhbmdlZCgxKTsKICAgICAgX21hcFtrZXldID0gdmFsdWU7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBWIHB1dElmQWJzZW50KEsga2V5LCBWIGlmQWJzZW50KCkpIHsKICAgIGlmIChjb250YWluc0tleShrZXkpKSByZXR1cm4gdGhpc1trZXldOwogICAgViB2YWx1ZSA9IGlmQWJzZW50KCk7CiAgICB0aGlzW2tleV0gPSB2YWx1ZTsKICAgIHJldHVybiB2YWx1ZTsKICB9CgogIEBvdmVycmlkZQogIFYgcmVtb3ZlKE9iamVjdCBrZXkpIHsKICAgIGlmIChfbWFwLmNvbnRhaW5zS2V5KGtleSkpIHsKICAgICAgX25vdGlmeUxlbmd0aENoYW5nZWQoLTEpOwogICAgfQogICAgcmV0dXJuIF9tYXAucmVtb3ZlKGtleSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZEFsbChNYXA8SywgVj4gb3RoZXIpIHsKICAgIG90aGVyLmZvckVhY2goKGtleSwgdmFsdWUpID0+IHRoaXNba2V5XSA9IHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2xlYXIoKSB7CiAgICBfbm90aWZ5TGVuZ3RoQ2hhbmdlZCgtX21hcC5sZW5ndGgpOwogICAgX21hcC5jbGVhcigpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWFwPEtSLCBWUj4gY2FzdDxLUiwgVlI+KCkgPT4gX21hcC5jYXN0PEtSLCBWUj4oKTsKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxNYXBFbnRyeTxLLCBWPj4gZ2V0IGVudHJpZXMgPT4gX21hcC5lbnRyaWVzOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZEVudHJpZXMoSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IGVudHJpZXMpIHsKICAgIGZvciAodmFyIGVudHJ5IGluIGVudHJpZXMpIHRoaXNbZW50cnkua2V5XSA9IGVudHJ5LnZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgTWFwPEtSLCBWUj4gbWFwPEtSLCBWUj4oTWFwRW50cnk8S1IsIFZSPiB0cmFuc2Zvcm0oSyBrZXksIFYgdmFsdWUpKSA9PgogICAgICBfbWFwLm1hcCh0cmFuc2Zvcm0pOwoKICBAb3ZlcnJpZGUKICBWIHVwZGF0ZShLIGtleSwgViB1cGRhdGUoViB2YWx1ZSksIHtWIGlmQWJzZW50KCl9KSA9PgogICAgICBfbWFwLnVwZGF0ZShrZXksIHVwZGF0ZSwgaWZBYnNlbnQ6IGlmQWJzZW50KTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB1cGRhdGVBbGwoViB1cGRhdGUoSyBrZXksIFYgdmFsdWUpKSB7CiAgICBfbWFwLnVwZGF0ZUFsbCh1cGRhdGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoSyBrZXksIFYgdmFsdWUpKSB7CiAgICBpbnQgYmVmb3JlID0gX21hcC5sZW5ndGg7CiAgICBfbWFwLnJlbW92ZVdoZXJlKHRlc3QpOwogICAgX25vdGlmeUxlbmd0aENoYW5nZWQoX21hcC5sZW5ndGggLSBiZWZvcmUpOwogIH0KCiAgdm9pZCBfbm90aWZ5TGVuZ3RoQ2hhbmdlZChpbnQgZGVsdGEpIHsKICAgIGludCBvbGRMZW5ndGggPSBfbWFwLmxlbmd0aDsKICAgIGludCBuZXdMZW5ndGggPSBvbGRMZW5ndGggKyBkZWx0YTsKICAgIF9jb3VudHNbb2xkTGVuZ3RoXS0tOwogICAgaWYgKG5ld0xlbmd0aCA8IF9jb3VudHMubGVuZ3RoKSB7CiAgICAgIF9jb3VudHNbbmV3TGVuZ3RoXSsrOwogICAgfSBlbHNlIHsKICAgICAgX2NvdW50cy5hZGQoMSk7CiAgICAgIGFzc2VydChuZXdMZW5ndGggPT0gX2NvdW50cy5sZW5ndGggLSAxKTsKICAgIH0KICB9Cn0KgJwATk48AURCRCcEQwRFNiwYFjcBPQEpQjcREwQBIS82ASkTMBoIIR4bMCIlSTEfCggIBAEMIQwkDCoBDCUMKQEMOQxBAQwqDCgBDC4aBAEMJiIfGQYEAQwnLBoXEgQBDBkhIAYdBAEMITYEAQwRKBIEAQw1DDgBDDY+BAEMSRsBDDg0AQwtHAQBDDAeHDAEASkhJxomHA0WLwYEAgErcGFja2FnZTpjb21waWxlci9zcmMvaGVscGVycy90cmFja19tYXAuZGFydDhzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL2pzX2JhY2tlbmQuZGFydIHYLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkganNfYmFja2VuZDsKCmV4cG9ydCAnYmFja2VuZC5kYXJ0JzsKZXhwb3J0ICdjaGVja2VkX21vZGVfaGVscGVycy5kYXJ0JzsKZXhwb3J0ICdjb25zdGFudF9lbWl0dGVyLmRhcnQnOwpleHBvcnQgJ2NvbnN0YW50X2hhbmRsZXJfamF2YXNjcmlwdC5kYXJ0JzsKZXhwb3J0ICdjdXN0b21fZWxlbWVudHNfYW5hbHlzaXMuZGFydCc7CmV4cG9ydCAnbmFtZXIuZGFydCc7CmV4cG9ydCAnbm9fc3VjaF9tZXRob2RfcmVnaXN0cnkuZGFydCc7Cg8ATk48ARQBFyQgKygVJwEvcGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9qc19iYWNrZW5kLmRhcnQ5c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfYmFja2VuZC9uYXRpdmVfZGF0YS5kYXJ0wABz8C8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGpzX2JhY2tlbmQubmF0aXZlX2RhdGE7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JyBzaG93IEVsZW1lbnRFbnZpcm9ubWVudDsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9pci9hbm5vdGF0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi9rZXJuZWwvZWxlbWVudF9tYXAuZGFydCc7CmltcG9ydCAnLi4vbmF0aXZlL2JlaGF2aW9yLmRhcnQnIHNob3cgTmF0aXZlQmVoYXZpb3I7CmltcG9ydCAnLi4vc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JzsKCi8vLyBCYXNpYyBpbmZvcm1hdGlvbiBmb3IgbmF0aXZlIGNsYXNzZXMgYW5kIGpzLWludGVyb3AgbGlicmFyaWVzIGFuZCBjbGFzc2VzLgovLy8KLy8vIFRoaXMgaW5mb3JtYXRpb24gaXMgY29tcHV0ZWQgZHVyaW5nIGxvYWRpbmcgdXNpbmcgW05hdGl2ZUJhc2ljRGF0YUJ1aWxkZXJdLgphYnN0cmFjdCBjbGFzcyBOYXRpdmVCYXNpY0RhdGEgewogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbTmF0aXZlQmFzaWNEYXRhXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IE5hdGl2ZUJhc2ljRGF0YS5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgICAgICBEYXRhU291cmNlIHNvdXJjZSwgRWxlbWVudEVudmlyb25tZW50IGVsZW1lbnRFbnZpcm9ubWVudCkgPQogICAgICBOYXRpdmVCYXNpY0RhdGFJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZTsKCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbTmF0aXZlQmFzaWNEYXRhXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luayk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbY2xzXSBjb3JyZXNwb25kcyB0byBhIG5hdGl2ZSBKYXZhU2NyaXB0IGNsYXNzLgogIC8vLwogIC8vLyBBIGNsYXNzIGlzIG1hcmtlZCBhcyBuYXRpdmUgZWl0aGVyIHRocm91Z2ggdGhlIGBATmF0aXZlKC4uLilgIGFubm90YXRpb24KICAvLy8gYWxsb3dlZCBmb3IgaW50ZXJuYWwgbGlicmFyaWVzIG9yIHZpYSB0aGUgdHlwZWQgSmF2YVNjcmlwdEludGVyb3AKICAvLy8gbWVjaGFuaXNtIGFsbG93ZWQgZm9yIHVzZXIgbGlicmFyaWVzLgogIGJvb2wgaXNOYXRpdmVDbGFzcyhDbGFzc0VudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybnMgdGhlIGxpc3Qgb2Ygbm9uLWRpcmVjdGl2ZSBuYXRpdmUgdGFnIHdvcmRzIGZvciBbY2xzXS4KICBMaXN0PFN0cmluZz4gZ2V0TmF0aXZlVGFnc09mQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtjbHNdIGhhcyBhIGAhbm9ubGVhZmAgdGFnIHdvcmQuCiAgYm9vbCBoYXNOYXRpdmVUYWdzRm9yY2VkTm9uTGVhZihDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2VsZW1lbnRdIG9yIGFueSBvZiBpdHMgc3VwZXJjbGFzc2VzIGlzIG5hdGl2ZS4KICBib29sIGlzTmF0aXZlT3JFeHRlbmRzTmF0aXZlKENsYXNzRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYganMgaW50ZXJvcCBmZWF0dXJlcyBhcmUgdXNlZC4KICBib29sIGdldCBpc0pzSW50ZXJvcFVzZWQ7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbZWxlbWVudF0gaXMgYSBKc0ludGVyb3AgbGlicmFyeS4KICBib29sIGlzSnNJbnRlcm9wTGlicmFyeShMaWJyYXJ5RW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2VsZW1lbnRdIGlzIGEgSnNJbnRlcm9wIGNsYXNzLgogIGJvb2wgaXNKc0ludGVyb3BDbGFzcyhDbGFzc0VudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtlbGVtZW50XSBpcyBhIEpzSW50ZXJvcCBtZW1iZXIuCiAgYm9vbCBpc0pzSW50ZXJvcE1lbWJlcihNZW1iZXJFbnRpdHkgZWxlbWVudCk7Cn0KCi8vLyBBZGRpdGlvbmFsIGVsZW1lbnQgaW5mb3JtYXRpb24gZm9yIG5hdGl2ZSBjbGFzc2VzIGFuZCBtZXRob2RzIGFuZCBqcy1pbnRlcm9wCi8vLyBtZXRob2RzLgovLy8KLy8vIFRoaXMgaW5mb3JtYXRpb24gaXMgY29tcHV0ZWQgZHVyaW5nIHJlc29sdXRpb24gdXNpbmcgW05hdGl2ZURhdGFCdWlsZGVyXS4KYWJzdHJhY3QgY2xhc3MgTmF0aXZlRGF0YSBleHRlbmRzIE5hdGl2ZUJhc2ljRGF0YSB7CiAgLy8vIERlc2VyaWFsaXplcyBhIFtOYXRpdmVEYXRhXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IE5hdGl2ZURhdGEucmVhZEZyb21EYXRhU291cmNlKAogICAgICAgICAgRGF0YVNvdXJjZSBzb3VyY2UsIEVsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQpID0KICAgICAgTmF0aXZlRGF0YUltcGwucmVhZEZyb21EYXRhU291cmNlOwoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtOYXRpdmVEYXRhXSB0byBbc2lua10uCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luayk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbZWxlbWVudF0gY29ycmVzcG9uZHMgdG8gYSBuYXRpdmUgSmF2YVNjcmlwdCBtZW1iZXIuCiAgLy8vCiAgLy8vIEEgbWVtYmVyIGlzIG1hcmtlZCBhcyBuYXRpdmUgZWl0aGVyIHRocm91Z2ggdGhlIG5hdGl2ZSBtZWNoYW5pc20KICAvLy8gKGBATmF0aXZlKC4uLilgIG9yIHRoZSBgbmF0aXZlYCBwc2V1ZG8ga2V5d29yZCkgYWxsb3dlZCBmb3IgaW50ZXJuYWwKICAvLy8gbGlicmFyaWVzIG9yIHZpYSB0aGUgdHlwZWQgSmF2YVNjcmlwdEludGVyb3AgbWVjaGFuaXNtIGFsbG93ZWQgZm9yIHVzZXIKICAvLy8gbGlicmFyaWVzLgogIGJvb2wgaXNOYXRpdmVNZW1iZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyB0aGUgW05hdGl2ZUJlaGF2aW9yXSBmb3IgY2FsbGluZyB0aGUgbmF0aXZlIFttZXRob2RdLgogIE5hdGl2ZUJlaGF2aW9yIGdldE5hdGl2ZU1ldGhvZEJlaGF2aW9yKEZ1bmN0aW9uRW50aXR5IG1ldGhvZCk7CgogIC8vLyBSZXR1cm5zIHRoZSBbTmF0aXZlQmVoYXZpb3JdIGZvciByZWFkaW5nIGZyb20gdGhlIG5hdGl2ZSBbZmllbGRdLgogIE5hdGl2ZUJlaGF2aW9yIGdldE5hdGl2ZUZpZWxkTG9hZEJlaGF2aW9yKEZpZWxkRW50aXR5IGZpZWxkKTsKCiAgLy8vIFJldHVybnMgdGhlIFtOYXRpdmVCZWhhdmlvcl0gZm9yIHdyaXRpbmcgdG8gdGhlIG5hdGl2ZSBbZmllbGRdLgogIE5hdGl2ZUJlaGF2aW9yIGdldE5hdGl2ZUZpZWxkU3RvcmVCZWhhdmlvcihGaWVsZEVudGl0eSBmaWVsZCk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgbmFtZSBvZiBbZWxlbWVudF0gaXMgZml4ZWQgZm9yIHRoZSBnZW5lcmF0ZWQKICAvLy8gSmF2YVNjcmlwdC4KICBib29sIGhhc0ZpeGVkQmFja2VuZE5hbWUoTWVtYmVyRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gQ29tcHV0ZXMgdGhlIG5hbWUgZm9yIFtlbGVtZW50XSB0byB1c2UgaW4gdGhlIGdlbmVyYXRlZCBKYXZhU2NyaXB0LiBUaGlzCiAgLy8vIGlzIGVpdGhlciBnaXZlbiB0aHJvdWdoIGEgbmF0aXZlIGFubm90YXRpb24gb3IgYSBqcyBpbnRlcm9wIGFubm90YXRpb24uCiAgU3RyaW5nIGdldEZpeGVkQmFja2VuZE5hbWUoTWVtYmVyRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gQ29tcHV0ZXMgdGhlIG5hbWUgcHJlZml4IGZvciBbZWxlbWVudF0gdG8gdXNlIGluIHRoZSBnZW5lcmF0ZWQgSmF2YVNjcmlwdC4KICAvLy8KICAvLy8gRm9yIHN0YXRpYyBhbmQgdG9wLWxldmVsIG1lbWJlcnMgYW5kIGNvbnN0cnVjdG9ycyB0aGlzIGlzIGJhc2VkIG9uIHRoZQogIC8vLyBKYXZhU2NyaXB0IG5hbWVzIGZvciB0aGUgbGlicmFyeSBhbmQvb3IgdGhlIGVuY2xvc2luZyBjbGFzcy4KICBTdHJpbmcgZ2V0Rml4ZWRCYWNrZW5kTWV0aG9kUGF0aChGdW5jdGlvbkVudGl0eSBlbGVtZW50KTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0pzSW50ZXJvcE1lbWJlcihNZW1iZXJFbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZXR1cm5zIHRoZSBleHBsaWNpdCBqcyBpbnRlcm9wIG5hbWUgZm9yIGxpYnJhcnkgW2VsZW1lbnRdLgogIFN0cmluZyBnZXRKc0ludGVyb3BMaWJyYXJ5TmFtZShMaWJyYXJ5RW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2VsZW1lbnRdIGhhcyBhbiBgQEFub255bW91c2AgYW5ub3RhdGlvbi4KICBib29sIGlzQW5vbnltb3VzSnNJbnRlcm9wQ2xhc3MoQ2xhc3NFbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZXR1cm5zIHRoZSBleHBsaWNpdCBqcyBpbnRlcm9wIG5hbWUgZm9yIGNsYXNzIFtlbGVtZW50XS4KICBTdHJpbmcgZ2V0SnNJbnRlcm9wQ2xhc3NOYW1lKENsYXNzRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyB0aGUgZXhwbGljaXQganMgaW50ZXJvcCBuYW1lIGZvciBtZW1iZXIgW2VsZW1lbnRdLgogIFN0cmluZyBnZXRKc0ludGVyb3BNZW1iZXJOYW1lKE1lbWJlckVudGl0eSBlbGVtZW50KTsKCiAgLy8vIEFwcGx5IEpTJCBlc2NhcGluZyBzY2hlbWUgdG8gY29udmVydCBwb3NzaWJsZSBlc2NhcGVkIERhcnQgbmFtZXMgaW50bwogIC8vLyBKUyBuYW1lcy4KICBTdHJpbmcgY29tcHV0ZVVuZXNjYXBlZEpTSW50ZXJvcE5hbWUoU3RyaW5nIG5hbWUpOwp9CgphYnN0cmFjdCBjbGFzcyBOYXRpdmVCYXNpY0RhdGFCdWlsZGVyIHsKICAvLy8gU2V0cyB0aGUgbmF0aXZlIHRhZyBpbmZvIGZvciBbY2xzXS4KICAvLy8KICAvLy8gVGhlIHRhZyBpbmZvIHN0cmluZyBjb250YWlucyBjb21tYS1zZXBhcmF0ZWQgJ3dvcmRzJyB3aGljaCBhcmUgZWl0aGVyCiAgLy8vIGRpc3BhdGNoIHRhZ3MgKGhhdmluZyBKYXZhU2NyaXB0IGlkZW50aWZpZXIgc3ludGF4KSBhbmQgZGlyZWN0aXZlcyB0aGF0CiAgLy8vIGJlZ2luIHdpdGggYCFgLgogIHZvaWQgc2V0TmF0aXZlQ2xhc3NUYWdJbmZvKENsYXNzRW50aXR5IGNscywgU3RyaW5nIHRhZ0luZm8pOwoKICAvLy8gTWFya3MgW2VsZW1lbnRdIGFzIGFuIGV4cGxpY2l0IHBhcnQgb2YganMgaW50ZXJvcC4KICAvLy8KICAvLy8gSWYgW25hbWVdIGlzIHByb3ZpZGVkLCBpdCBzZXRzIHRoZSBleHBsaWNpdCBqcyBpbnRlcm9wIG5hbWUgZm9yIHRoZQogIC8vLyBsaWJyYXJ5IFtlbGVtZW50XSwgb3RoZXIgdGhlIGpzIGludGVyb3AgbmFtZSBpcyBleHBlY3RlZCB0byBiZSBjb21wdXRlZAogIC8vLyBsYXRlci4KICB2b2lkIG1hcmtBc0pzSW50ZXJvcExpYnJhcnkoTGlicmFyeUVudGl0eSBlbGVtZW50LCB7U3RyaW5nIG5hbWV9KTsKCiAgLy8vIE1hcmtzIFtlbGVtZW50XSBhcyBhbiBleHBsaWNpdCBwYXJ0IG9mIGpzIGludGVyb3AuCiAgLy8vCiAgLy8vIElmIFtuYW1lXSBpcyBwcm92aWRlZCwgaXQgc2V0cyB0aGUgZXhwbGljaXQganMgaW50ZXJvcCBuYW1lIGZvciB0aGUKICAvLy8gY2xhc3MgW2VsZW1lbnRdLCBvdGhlciB0aGUganMgaW50ZXJvcCBuYW1lIGlzIGV4cGVjdGVkIHRvIGJlIGNvbXB1dGVkCiAgLy8vIGxhdGVyLgogIHZvaWQgbWFya0FzSnNJbnRlcm9wQ2xhc3MoQ2xhc3NFbnRpdHkgZWxlbWVudCwKICAgICAge1N0cmluZyBuYW1lLCBib29sIGlzQW5vbnltb3VzOiBmYWxzZX0pOwoKICAvLy8gTWFya3MgW2VsZW1lbnRdIGFzIGFuIGV4cGxpY2l0IHBhcnQgb2YganMgaW50ZXJvcCBhbmQgc2V0cyB0aGUgZXhwbGljaXQganMKICAvLy8gaW50ZXJvcCBbbmFtZV0gZm9yIHRoZSBtZW1iZXIgW2VsZW1lbnRdLgogIHZvaWQgbWFya0FzSnNJbnRlcm9wTWVtYmVyKE1lbWJlckVudGl0eSBlbGVtZW50LCBTdHJpbmcgbmFtZSk7CgogIC8vLyBDcmVhdGVzIHRoZSBbTmF0aXZlQmFzaWNEYXRhXSBvYmplY3QgZm9yIHRoZSBkYXRhIGNvbGxlY3RlZCBpbiB0aGlzCiAgLy8vIGJ1aWxkZXIuCiAgTmF0aXZlQmFzaWNEYXRhIGNsb3NlKEVsZW1lbnRFbnZpcm9ubWVudCBlbnZpcm9ubWVudCk7Cn0KCmFic3RyYWN0IGNsYXNzIE5hdGl2ZURhdGFCdWlsZGVyIHsKICAvLy8gUmVnaXN0ZXJzIHRoZSBbYmVoYXZpb3JdIGZvciBjYWxsaW5nIHRoZSBuYXRpdmUgW21ldGhvZF0uCiAgdm9pZCBzZXROYXRpdmVNZXRob2RCZWhhdmlvcihGdW5jdGlvbkVudGl0eSBtZXRob2QsIE5hdGl2ZUJlaGF2aW9yIGJlaGF2aW9yKTsKCiAgLy8vIFJlZ2lzdGVycyB0aGUgW2JlaGF2aW9yXSBmb3IgcmVhZGluZyBmcm9tIHRoZSBuYXRpdmUgW2ZpZWxkXS4KICB2b2lkIHNldE5hdGl2ZUZpZWxkTG9hZEJlaGF2aW9yKEZpZWxkRW50aXR5IGZpZWxkLCBOYXRpdmVCZWhhdmlvciBiZWhhdmlvcik7CgogIC8vLyBSZWdpc3RlcnMgdGhlIFtiZWhhdmlvcl0gZm9yIHdyaXRpbmcgdG8gdGhlIG5hdGl2ZSBbZmllbGRdLgogIHZvaWQgc2V0TmF0aXZlRmllbGRTdG9yZUJlaGF2aW9yKEZpZWxkRW50aXR5IGZpZWxkLCBOYXRpdmVCZWhhdmlvciBiZWhhdmlvcik7CgogIC8vLyBTZXRzIHRoZSBuYXRpdmUgW25hbWVdIGZvciB0aGUgbWVtYmVyIFtlbGVtZW50XS4KICAvLy8KICAvLy8gVGhpcyBuYW1lIGlzIHVzZWQgZm9yIFtlbGVtZW50XSBpbiB0aGUgZ2VuZXJhdGVkIEphdmFTY3JpcHQuCiAgdm9pZCBzZXROYXRpdmVNZW1iZXJOYW1lKE1lbWJlckVudGl0eSBlbGVtZW50LCBTdHJpbmcgbmFtZSk7CgogIC8vLyBDbG9zZXMgdGhpcyBidWlsZGVyIGFuZCBjcmVhdGVzIHRoZSByZXN1bHRpbmcgW05hdGl2ZURhdGFdIG9iamVjdC4KICBOYXRpdmVEYXRhIGNsb3NlKCk7Cn0KCmNsYXNzIE5hdGl2ZUJhc2ljRGF0YUJ1aWxkZXJJbXBsIGltcGxlbWVudHMgTmF0aXZlQmFzaWNEYXRhQnVpbGRlciB7CiAgYm9vbCBfY2xvc2VkID0gZmFsc2U7CgogIC8vLyBUYWcgaW5mbyBmb3IgbmF0aXZlIEphdmFTY3JpcHQgY2xhc3NlcyBuYW1lcy4gU2VlCiAgLy8vIFtzZXROYXRpdmVDbGFzc1RhZ0luZm9dLgogIE1hcDxDbGFzc0VudGl0eSwgTmF0aXZlQ2xhc3NUYWc+IG5hdGl2ZUNsYXNzVGFnSW5mbyA9CiAgICAgIDxDbGFzc0VudGl0eSwgTmF0aXZlQ2xhc3NUYWc+e307CgogIC8vLyBUaGUgSmF2YVNjcmlwdCBsaWJyYXJpZXMgaW1wbGVtZW50ZWQgdmlhIHR5cGVkIEphdmFTY3JpcHQgaW50ZXJvcC4KICBNYXA8TGlicmFyeUVudGl0eSwgU3RyaW5nPiBqc0ludGVyb3BMaWJyYXJpZXMgPSA8TGlicmFyeUVudGl0eSwgU3RyaW5nPnt9OwoKICAvLy8gVGhlIEphdmFTY3JpcHQgY2xhc3NlcyBpbXBsZW1lbnRlZCB2aWEgdHlwZWQgSmF2YVNjcmlwdCBpbnRlcm9wLgogIE1hcDxDbGFzc0VudGl0eSwgU3RyaW5nPiBqc0ludGVyb3BDbGFzc2VzID0gPENsYXNzRW50aXR5LCBTdHJpbmc+e307CgogIC8vLyBKYXZhU2NyaXB0IGludGVyb3AgY2xhc3NlcyBhbm5vdGF0ZWQgd2l0aCBgQGFub255bW91c2AKICBTZXQ8Q2xhc3NFbnRpdHk+IGFub255bW91c0pzSW50ZXJvcENsYXNzZXMgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwoKICAvLy8gVGhlIEphdmFTY3JpcHQgbWVtYmVycyBpbXBsZW1lbnRlZCB2aWEgdHlwZWQgSmF2YVNjcmlwdCBpbnRlcm9wLgogIE1hcDxNZW1iZXJFbnRpdHksIFN0cmluZz4ganNJbnRlcm9wTWVtYmVycyA9IDxNZW1iZXJFbnRpdHksIFN0cmluZz57fTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXROYXRpdmVDbGFzc1RhZ0luZm8oQ2xhc3NFbnRpdHkgY2xzLCBTdHJpbmcgdGFnVGV4dCkgewogICAgYXNzZXJ0KAogICAgICAgICFfY2xvc2VkLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBjbHMsCiAgICAgICAgICAgICJOYXRpdmVCYXNpY0RhdGFCdWlsZGVyIGlzIGNsb3NlZC4gIgogICAgICAgICAgICAiVHJ5aW5nIHRvIG1hcmsgJGNscyBhcyBhIG5hdGl2ZSBjbGFzcy4iKSk7CgogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQXNzZXJ0IHRoYXQgdGhpcyBpcyBvbmx5IGNhbGxlZCBvbmNlLiBUaGUgbWVtb3J5CiAgICAvLyBjb21waWxlciBjb3BpZXMgcHJlLXByb2Nlc3NlZCBlbGVtZW50cyBpbnRvIGEgbmV3IGNvbXBpbGVyIHRocm91Z2gKICAgIC8vIFtDb21waWxlci5vbkxpYnJhcnlTY2FubmVkXSBhbmQgdGhlcmVieSBjYXVzZXMgbXVsdGlwbGUgY2FsbHMgdG8gdGhpcwogICAgLy8gbWV0aG9kLgogICAgYXNzZXJ0KAogICAgICAgIG5hdGl2ZUNsYXNzVGFnSW5mb1tjbHNdID09IG51bGwgfHwKICAgICAgICAgICAgbmF0aXZlQ2xhc3NUYWdJbmZvW2Nsc10udGV4dCA9PSB0YWdUZXh0LAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBjbHMsCiAgICAgICAgICAgICJOYXRpdmUgdGFnIGluZm8gc2V0IGluY29uc2lzdGVudGx5IG9uICRjbHM6ICIKICAgICAgICAgICAgIkV4aXN0aW5nIHRhZyBpbmZvICcke25hdGl2ZUNsYXNzVGFnSW5mb1tjbHNdfScsICIKICAgICAgICAgICAgIm5ldyB0YWcgaW5mbyAnJHRhZ1RleHQnLiIpKTsKICAgIG5hdGl2ZUNsYXNzVGFnSW5mb1tjbHNdID0gbmV3IE5hdGl2ZUNsYXNzVGFnKHRhZ1RleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBtYXJrQXNKc0ludGVyb3BMaWJyYXJ5KExpYnJhcnlFbnRpdHkgZWxlbWVudCwge1N0cmluZyBuYW1lfSkgewogICAgYXNzZXJ0KAogICAgICAgICFfY2xvc2VkLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAiTmF0aXZlQmFzaWNEYXRhQnVpbGRlciBpcyBjbG9zZWQuICIKICAgICAgICAgICAgIlRyeWluZyB0byBtYXJrICRlbGVtZW50IGFzIGEganMtaW50ZXJvcCBsaWJyYXJ5LiIpKTsKICAgIGpzSW50ZXJvcExpYnJhcmllc1tlbGVtZW50XSA9IG5hbWU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIG1hcmtBc0pzSW50ZXJvcENsYXNzKENsYXNzRW50aXR5IGVsZW1lbnQsCiAgICAgIHtTdHJpbmcgbmFtZSwgYm9vbCBpc0Fub255bW91czogZmFsc2V9KSB7CiAgICBhc3NlcnQoCiAgICAgICAgIV9jbG9zZWQsCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgICJOYXRpdmVCYXNpY0RhdGFCdWlsZGVyIGlzIGNsb3NlZC4gIgogICAgICAgICAgICAiVHJ5aW5nIHRvIG1hcmsgJGVsZW1lbnQgYXMgYSBqcy1pbnRlcm9wIGNsYXNzLiIpKTsKICAgIGpzSW50ZXJvcENsYXNzZXNbZWxlbWVudF0gPSBuYW1lOwogICAgaWYgKGlzQW5vbnltb3VzKSB7CiAgICAgIGFub255bW91c0pzSW50ZXJvcENsYXNzZXMuYWRkKGVsZW1lbnQpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBtYXJrQXNKc0ludGVyb3BNZW1iZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQsIFN0cmluZyBuYW1lKSB7CiAgICBhc3NlcnQoCiAgICAgICAgIV9jbG9zZWQsCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgICJOYXRpdmVCYXNpY0RhdGFCdWlsZGVyIGlzIGNsb3NlZC4gIgogICAgICAgICAgICAiVHJ5aW5nIHRvIG1hcmsgJGVsZW1lbnQgYXMgYSBqcy1pbnRlcm9wIG1lbWJlci4iKSk7CiAgICBqc0ludGVyb3BNZW1iZXJzW2VsZW1lbnRdID0gbmFtZTsKICB9CgogIEBvdmVycmlkZQogIE5hdGl2ZUJhc2ljRGF0YSBjbG9zZShFbGVtZW50RW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIF9jbG9zZWQgPSB0cnVlOwogICAgcmV0dXJuIG5ldyBOYXRpdmVCYXNpY0RhdGFJbXBsKAogICAgICAgIGVudmlyb25tZW50LAogICAgICAgIG5hdGl2ZUNsYXNzVGFnSW5mbywKICAgICAgICBqc0ludGVyb3BMaWJyYXJpZXMsCiAgICAgICAganNJbnRlcm9wQ2xhc3NlcywKICAgICAgICBhbm9ueW1vdXNKc0ludGVyb3BDbGFzc2VzLAogICAgICAgIGpzSW50ZXJvcE1lbWJlcnMpOwogIH0KCiAgdm9pZCByZW9wZW5Gb3JUZXN0aW5nKCkgewogICAgX2Nsb3NlZCA9IGZhbHNlOwogIH0KfQoKY2xhc3MgTmF0aXZlQmFzaWNEYXRhSW1wbCBpbXBsZW1lbnRzIE5hdGl2ZUJhc2ljRGF0YSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtOYXRpdmVCYXNpY0RhdGFdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnbmF0aXZlLWJhc2ljLWRhdGEnOwoKICBmaW5hbCBFbGVtZW50RW52aXJvbm1lbnQgX2VudjsKCiAgLy8vIFRhZyBpbmZvIGZvciBuYXRpdmUgSmF2YVNjcmlwdCBjbGFzc2VzIG5hbWVzLiBTZWUKICAvLy8gW3NldE5hdGl2ZUNsYXNzVGFnSW5mb10uCiAgZmluYWwgTWFwPENsYXNzRW50aXR5LCBOYXRpdmVDbGFzc1RhZz4gbmF0aXZlQ2xhc3NUYWdJbmZvOwoKICAvLy8gVGhlIEphdmFTY3JpcHQgbGlicmFyaWVzIGltcGxlbWVudGVkIHZpYSB0eXBlZCBKYXZhU2NyaXB0IGludGVyb3AuCiAgZmluYWwgTWFwPExpYnJhcnlFbnRpdHksIFN0cmluZz4ganNJbnRlcm9wTGlicmFyaWVzOwoKICAvLy8gVGhlIEphdmFTY3JpcHQgY2xhc3NlcyBpbXBsZW1lbnRlZCB2aWEgdHlwZWQgSmF2YVNjcmlwdCBpbnRlcm9wLgogIGZpbmFsIE1hcDxDbGFzc0VudGl0eSwgU3RyaW5nPiBqc0ludGVyb3BDbGFzc2VzOwoKICAvLy8gSmF2YVNjcmlwdCBpbnRlcm9wIGNsYXNzZXMgYW5ub3RhdGVkIHdpdGggYEBhbm9ueW1vdXNgCiAgZmluYWwgU2V0PENsYXNzRW50aXR5PiBhbm9ueW1vdXNKc0ludGVyb3BDbGFzc2VzOwoKICAvLy8gVGhlIEphdmFTY3JpcHQgbWVtYmVycyBpbXBsZW1lbnRlZCB2aWEgdHlwZWQgSmF2YVNjcmlwdCBpbnRlcm9wLgogIGZpbmFsIE1hcDxNZW1iZXJFbnRpdHksIFN0cmluZz4ganNJbnRlcm9wTWVtYmVyczsKCiAgTmF0aXZlQmFzaWNEYXRhSW1wbCgKICAgICAgdGhpcy5fZW52LAogICAgICB0aGlzLm5hdGl2ZUNsYXNzVGFnSW5mbywKICAgICAgdGhpcy5qc0ludGVyb3BMaWJyYXJpZXMsCiAgICAgIHRoaXMuanNJbnRlcm9wQ2xhc3NlcywKICAgICAgdGhpcy5hbm9ueW1vdXNKc0ludGVyb3BDbGFzc2VzLAogICAgICB0aGlzLmpzSW50ZXJvcE1lbWJlcnMpOwoKICBmYWN0b3J5IE5hdGl2ZUJhc2ljRGF0YUltcGwuZnJvbUlyKAogICAgICBLZXJuZWxUb0VsZW1lbnRNYXAgbWFwLCBJckFubm90YXRpb25EYXRhIGRhdGEpIHsKICAgIEVsZW1lbnRFbnZpcm9ubWVudCBlbnYgPSBtYXAuZWxlbWVudEVudmlyb25tZW50OwogICAgTWFwPENsYXNzRW50aXR5LCBOYXRpdmVDbGFzc1RhZz4gbmF0aXZlQ2xhc3NUYWdJbmZvID0ge307CiAgICBNYXA8TGlicmFyeUVudGl0eSwgU3RyaW5nPiBqc0ludGVyb3BMaWJyYXJpZXMgPSB7fTsKICAgIE1hcDxDbGFzc0VudGl0eSwgU3RyaW5nPiBqc0ludGVyb3BDbGFzc2VzID0ge307CiAgICBTZXQ8Q2xhc3NFbnRpdHk+IGFub255bW91c0pzSW50ZXJvcENsYXNzZXMgPSB7fTsKICAgIE1hcDxNZW1iZXJFbnRpdHksIFN0cmluZz4ganNJbnRlcm9wTWVtYmVycyA9IHt9OwoKICAgIGRhdGEuZm9yRWFjaE5hdGl2ZUNsYXNzKChpci5DbGFzcyBub2RlLCBTdHJpbmcgdGV4dCkgewogICAgICBuYXRpdmVDbGFzc1RhZ0luZm9bbWFwLmdldENsYXNzKG5vZGUpXSA9IG5ldyBOYXRpdmVDbGFzc1RhZyh0ZXh0KTsKICAgIH0pOwogICAgZGF0YS5mb3JFYWNoSnNJbnRlcm9wTGlicmFyeSgoaXIuTGlicmFyeSBub2RlLCBTdHJpbmcgbmFtZSkgewogICAgICBqc0ludGVyb3BMaWJyYXJpZXNbZW52Lmxvb2t1cExpYnJhcnkobm9kZS5pbXBvcnRVcmksIHJlcXVpcmVkOiB0cnVlKV0gPQogICAgICAgICAgbmFtZTsKICAgIH0pOwogICAgZGF0YS5mb3JFYWNoSnNJbnRlcm9wQ2xhc3MoKGlyLkNsYXNzIG5vZGUsIFN0cmluZyBuYW1lLAogICAgICAgIHtib29sIGlzQW5vbnltb3VzfSkgewogICAgICBDbGFzc0VudGl0eSBjbHMgPSBtYXAuZ2V0Q2xhc3Mobm9kZSk7CiAgICAgIGpzSW50ZXJvcENsYXNzZXNbY2xzXSA9IG5hbWU7CiAgICAgIGlmIChpc0Fub255bW91cykgewogICAgICAgIGFub255bW91c0pzSW50ZXJvcENsYXNzZXMuYWRkKGNscyk7CiAgICAgIH0KICAgIH0pOwogICAgZGF0YS5mb3JFYWNoSnNJbnRlcm9wTWVtYmVyKChpci5NZW1iZXIgbm9kZSwgU3RyaW5nIG5hbWUpIHsKICAgICAganNJbnRlcm9wTWVtYmVyc1ttYXAuZ2V0TWVtYmVyKG5vZGUpXSA9IG5hbWU7CiAgICB9KTsKCiAgICByZXR1cm4gbmV3IE5hdGl2ZUJhc2ljRGF0YUltcGwoZW52LCBuYXRpdmVDbGFzc1RhZ0luZm8sIGpzSW50ZXJvcExpYnJhcmllcywKICAgICAgICBqc0ludGVyb3BDbGFzc2VzLCBhbm9ueW1vdXNKc0ludGVyb3BDbGFzc2VzLCBqc0ludGVyb3BNZW1iZXJzKTsKICB9CgogIGZhY3RvcnkgTmF0aXZlQmFzaWNEYXRhSW1wbC5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgIERhdGFTb3VyY2Ugc291cmNlLCBFbGVtZW50RW52aXJvbm1lbnQgZWxlbWVudEVudmlyb25tZW50KSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIE1hcDxDbGFzc0VudGl0eSwgTmF0aXZlQ2xhc3NUYWc+IG5hdGl2ZUNsYXNzVGFnSW5mbyA9CiAgICAgICAgc291cmNlLnJlYWRDbGFzc01hcCgoKSB7CiAgICAgIExpc3Q8U3RyaW5nPiBuYW1lcyA9IHNvdXJjZS5yZWFkU3RyaW5ncygpOwogICAgICBib29sIGlzTm9uTGVhZiA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgICByZXR1cm4gbmV3IE5hdGl2ZUNsYXNzVGFnLmludGVybmFsKG5hbWVzLCBpc05vbkxlYWYpOwogICAgfSk7CiAgICBNYXA8TGlicmFyeUVudGl0eSwgU3RyaW5nPiBqc0ludGVyb3BMaWJyYXJpZXMgPQogICAgICAgIHNvdXJjZS5yZWFkTGlicmFyeU1hcChzb3VyY2UucmVhZFN0cmluZyk7CiAgICBNYXA8Q2xhc3NFbnRpdHksIFN0cmluZz4ganNJbnRlcm9wQ2xhc3NlcyA9CiAgICAgICAgc291cmNlLnJlYWRDbGFzc01hcChzb3VyY2UucmVhZFN0cmluZyk7CiAgICBTZXQ8Q2xhc3NFbnRpdHk+IGFub255bW91c0pzSW50ZXJvcENsYXNzZXMgPSBzb3VyY2UucmVhZENsYXNzZXMoKS50b1NldCgpOwogICAgTWFwPE1lbWJlckVudGl0eSwgU3RyaW5nPiBqc0ludGVyb3BNZW1iZXJzID0KICAgICAgICBzb3VyY2UucmVhZE1lbWJlck1hcChzb3VyY2UucmVhZFN0cmluZyk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IE5hdGl2ZUJhc2ljRGF0YUltcGwoCiAgICAgICAgZWxlbWVudEVudmlyb25tZW50LAogICAgICAgIG5hdGl2ZUNsYXNzVGFnSW5mbywKICAgICAgICBqc0ludGVyb3BMaWJyYXJpZXMsCiAgICAgICAganNJbnRlcm9wQ2xhc3NlcywKICAgICAgICBhbm9ueW1vdXNKc0ludGVyb3BDbGFzc2VzLAogICAgICAgIGpzSW50ZXJvcE1lbWJlcnMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUNsYXNzTWFwKG5hdGl2ZUNsYXNzVGFnSW5mbywgKE5hdGl2ZUNsYXNzVGFnIHRhZykgewogICAgICBzaW5rLndyaXRlU3RyaW5ncyh0YWcubmFtZXMpOwogICAgICBzaW5rLndyaXRlQm9vbCh0YWcuaXNOb25MZWFmKTsKICAgIH0pOwogICAgc2luay53cml0ZUxpYnJhcnlNYXAoanNJbnRlcm9wTGlicmFyaWVzLCBzaW5rLndyaXRlU3RyaW5nKTsKICAgIHNpbmsud3JpdGVDbGFzc01hcChqc0ludGVyb3BDbGFzc2VzLCBzaW5rLndyaXRlU3RyaW5nKTsKICAgIHNpbmsud3JpdGVDbGFzc2VzKGFub255bW91c0pzSW50ZXJvcENsYXNzZXMpOwogICAgc2luay53cml0ZU1lbWJlck1hcChqc0ludGVyb3BNZW1iZXJzLCBzaW5rLndyaXRlU3RyaW5nKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzTmF0aXZlQ2xhc3MoQ2xhc3NFbnRpdHkgZWxlbWVudCkgewogICAgaWYgKGlzSnNJbnRlcm9wQ2xhc3MoZWxlbWVudCkpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIG5hdGl2ZUNsYXNzVGFnSW5mby5jb250YWluc0tleShlbGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8U3RyaW5nPiBnZXROYXRpdmVUYWdzT2ZDbGFzcyhDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBuYXRpdmVDbGFzc1RhZ0luZm9bY2xzXS5uYW1lczsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaGFzTmF0aXZlVGFnc0ZvcmNlZE5vbkxlYWYoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gbmF0aXZlQ2xhc3NUYWdJbmZvW2Nsc10uaXNOb25MZWFmOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNKc0ludGVyb3BVc2VkID0+CiAgICAgIGpzSW50ZXJvcExpYnJhcmllcy5pc05vdEVtcHR5IHx8IGpzSW50ZXJvcENsYXNzZXMuaXNOb3RFbXB0eTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0pzSW50ZXJvcExpYnJhcnkoTGlicmFyeUVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4ganNJbnRlcm9wTGlicmFyaWVzLmNvbnRhaW5zS2V5KGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0pzSW50ZXJvcENsYXNzKENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBqc0ludGVyb3BDbGFzc2VzLmNvbnRhaW5zS2V5KGVsZW1lbnQpOwogIH0KCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtlbGVtZW50XSBpcyBleHBsaWNpdGx5IG1hcmtlZCBhcyBwYXJ0IG9mIEpzSW50ZXJvcC4KICBib29sIF9pc0pzSW50ZXJvcE1lbWJlcihNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIGpzSW50ZXJvcE1lbWJlcnMuY29udGFpbnNLZXkoZWxlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSnNJbnRlcm9wTWVtYmVyKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTaGFyZSB0aGlzIHdpdGggW05hdGl2ZURhdGFJbXBsLmlzSnNJbnRlcm9wTWVtYmVyXS4KICAgIGlmIChlbGVtZW50LmlzRnVuY3Rpb24gfHwKICAgICAgICBlbGVtZW50LmlzQ29uc3RydWN0b3IgfHwKICAgICAgICBlbGVtZW50LmlzR2V0dGVyIHx8CiAgICAgICAgZWxlbWVudC5pc1NldHRlcikgewogICAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiA9IGVsZW1lbnQ7CiAgICAgIGlmICghZnVuY3Rpb24uaXNFeHRlcm5hbCkgcmV0dXJuIGZhbHNlOwoKICAgICAgaWYgKF9pc0pzSW50ZXJvcE1lbWJlcihmdW5jdGlvbikpIHJldHVybiB0cnVlOwogICAgICBpZiAoZnVuY3Rpb24uZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCkgewogICAgICAgIHJldHVybiBpc0pzSW50ZXJvcENsYXNzKGZ1bmN0aW9uLmVuY2xvc2luZ0NsYXNzKTsKICAgICAgfQogICAgICBpZiAoZnVuY3Rpb24uaXNUb3BMZXZlbCkgewogICAgICAgIHJldHVybiBpc0pzSW50ZXJvcExpYnJhcnkoZnVuY3Rpb24ubGlicmFyeSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9pc0pzSW50ZXJvcE1lbWJlcihlbGVtZW50KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNOYXRpdmVPckV4dGVuZHNOYXRpdmUoQ2xhc3NFbnRpdHkgZWxlbWVudCkgewogICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgaWYgKGlzTmF0aXZlQ2xhc3MoZWxlbWVudCkgfHwgaXNKc0ludGVyb3BDbGFzcyhlbGVtZW50KSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBpc05hdGl2ZU9yRXh0ZW5kc05hdGl2ZShfZW52LmdldFN1cGVyQ2xhc3MoZWxlbWVudCkpOwogIH0KfQoKY2xhc3MgTmF0aXZlRGF0YUJ1aWxkZXJJbXBsIGltcGxlbWVudHMgTmF0aXZlRGF0YUJ1aWxkZXIgewogIGZpbmFsIE5hdGl2ZUJhc2ljRGF0YUltcGwgX25hdGl2ZUJhc2ljRGF0YTsKCiAgLy8vIFRoZSBKYXZhU2NyaXB0IG5hbWVzIGZvciBuYXRpdmUgSmF2YVNjcmlwdCBlbGVtZW50cyBpbXBsZW1lbnRlZC4KICBNYXA8TWVtYmVyRW50aXR5LCBTdHJpbmc+IG5hdGl2ZU1lbWJlck5hbWUgPSA8TWVtYmVyRW50aXR5LCBTdHJpbmc+e307CgogIC8vLyBDYWNoZSBmb3IgW05hdGl2ZUJlaGF2aW9yXXMgZm9yIGNhbGxpbmcgbmF0aXZlIG1ldGhvZHMuCiAgTWFwPEZ1bmN0aW9uRW50aXR5LCBOYXRpdmVCZWhhdmlvcj4gbmF0aXZlTWV0aG9kQmVoYXZpb3IgPQogICAgICA8RnVuY3Rpb25FbnRpdHksIE5hdGl2ZUJlaGF2aW9yPnt9OwoKICAvLy8gQ2FjaGUgZm9yIFtOYXRpdmVCZWhhdmlvcl1zIGZvciByZWFkaW5nIGZyb20gbmF0aXZlIGZpZWxkcy4KICBNYXA8TWVtYmVyRW50aXR5LCBOYXRpdmVCZWhhdmlvcj4gbmF0aXZlRmllbGRMb2FkQmVoYXZpb3IgPQogICAgICA8RmllbGRFbnRpdHksIE5hdGl2ZUJlaGF2aW9yPnt9OwoKICAvLy8gQ2FjaGUgZm9yIFtOYXRpdmVCZWhhdmlvcl1zIGZvciB3cml0aW5nIHRvIG5hdGl2ZSBmaWVsZHMuCiAgTWFwPE1lbWJlckVudGl0eSwgTmF0aXZlQmVoYXZpb3I+IG5hdGl2ZUZpZWxkU3RvcmVCZWhhdmlvciA9CiAgICAgIDxGaWVsZEVudGl0eSwgTmF0aXZlQmVoYXZpb3I+e307CgogIE5hdGl2ZURhdGFCdWlsZGVySW1wbCh0aGlzLl9uYXRpdmVCYXNpY0RhdGEpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHNldE5hdGl2ZU1lbWJlck5hbWUoTWVtYmVyRW50aXR5IGVsZW1lbnQsIFN0cmluZyBuYW1lKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBdm9pZCBzZXR0aW5nIHRoaXMgbW9yZSB0aGFuIG9uY2UuIFRoZSBlbnF1ZXVlcgogICAgLy8gbWlnaHQgZW5xdWV1ZSBbZWxlbWVudF0gc2V2ZXJhbCB0aW1lcyAoYmVmb3JlIHByb2Nlc3NpbmcgaXQpIGFuZCBjb21wdXRlcwogICAgLy8gbmFtZSBvbiBlYWNoIGNhbGwgdG8gYGludGVybmFsQWRkVG9Xb3JrTGlzdGAuCiAgICBhc3NlcnQoCiAgICAgICAgbmF0aXZlTWVtYmVyTmFtZVtlbGVtZW50XSA9PSBudWxsIHx8IG5hdGl2ZU1lbWJlck5hbWVbZWxlbWVudF0gPT0gbmFtZSwKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgZWxlbWVudCwKICAgICAgICAgICAgIk5hdGl2ZSBtZW1iZXIgbmFtZSBzZXQgaW5jb25zaXN0ZW50bHkgb24gJGVsZW1lbnQ6ICIKICAgICAgICAgICAgIkV4aXN0aW5nIG5hbWUgJyR7bmF0aXZlTWVtYmVyTmFtZVtlbGVtZW50XX0nLCAiCiAgICAgICAgICAgICJuZXcgbmFtZSAnJG5hbWUnLiIpKTsKICAgIG5hdGl2ZU1lbWJlck5hbWVbZWxlbWVudF0gPSBuYW1lOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXROYXRpdmVNZXRob2RCZWhhdmlvcihGdW5jdGlvbkVudGl0eSBtZXRob2QsIE5hdGl2ZUJlaGF2aW9yIGJlaGF2aW9yKSB7CiAgICBuYXRpdmVNZXRob2RCZWhhdmlvclttZXRob2RdID0gYmVoYXZpb3I7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHNldE5hdGl2ZUZpZWxkTG9hZEJlaGF2aW9yKEZpZWxkRW50aXR5IGZpZWxkLCBOYXRpdmVCZWhhdmlvciBiZWhhdmlvcikgewogICAgbmF0aXZlRmllbGRMb2FkQmVoYXZpb3JbZmllbGRdID0gYmVoYXZpb3I7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHNldE5hdGl2ZUZpZWxkU3RvcmVCZWhhdmlvcihGaWVsZEVudGl0eSBmaWVsZCwgTmF0aXZlQmVoYXZpb3IgYmVoYXZpb3IpIHsKICAgIG5hdGl2ZUZpZWxkU3RvcmVCZWhhdmlvcltmaWVsZF0gPSBiZWhhdmlvcjsKICB9CgogIEBvdmVycmlkZQogIE5hdGl2ZURhdGEgY2xvc2UoKSA9PiBuZXcgTmF0aXZlRGF0YUltcGwoX25hdGl2ZUJhc2ljRGF0YSwgbmF0aXZlTWVtYmVyTmFtZSwKICAgICAgbmF0aXZlTWV0aG9kQmVoYXZpb3IsIG5hdGl2ZUZpZWxkTG9hZEJlaGF2aW9yLCBuYXRpdmVGaWVsZFN0b3JlQmVoYXZpb3IpOwp9CgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgZmllbGRzIHRoYXQgb3ZlcmxhcCB3aXRoIFtOYXRpdmVCYXNpY0RhdGFdLCBsaWtlCi8vIFthbm9ueW1vdXNKc0ludGVyb3BDbGFzc2VzXS4KY2xhc3MgTmF0aXZlRGF0YUltcGwgaW1wbGVtZW50cyBOYXRpdmVEYXRhLCBOYXRpdmVCYXNpY0RhdGFJbXBsIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW05hdGl2ZURhdGFdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnbmF0aXZlLWRhdGEnOwoKICAvLy8gUHJlZml4IHVzZWQgdG8gZXNjYXBlIEpTIG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBEYXJ0IG5hbWVzCiAgLy8vIHdoZW4gdXNpbmcgSlNJbnRlcm9wLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgX2pzSW50ZXJvcEVzY2FwZVByZWZpeCA9IHInSlMkJzsKCiAgZmluYWwgTmF0aXZlQmFzaWNEYXRhSW1wbCBfbmF0aXZlQmFzaWNEYXRhOwoKICAvLy8gVGhlIEphdmFTY3JpcHQgbmFtZXMgZm9yIG5hdGl2ZSBKYXZhU2NyaXB0IGVsZW1lbnRzIGltcGxlbWVudGVkLgogIGZpbmFsIE1hcDxNZW1iZXJFbnRpdHksIFN0cmluZz4gbmF0aXZlTWVtYmVyTmFtZTsKCiAgLy8vIENhY2hlIGZvciBbTmF0aXZlQmVoYXZpb3JdcyBmb3IgY2FsbGluZyBuYXRpdmUgbWV0aG9kcy4KICBmaW5hbCBNYXA8RnVuY3Rpb25FbnRpdHksIE5hdGl2ZUJlaGF2aW9yPiBuYXRpdmVNZXRob2RCZWhhdmlvcjsKCiAgLy8vIENhY2hlIGZvciBbTmF0aXZlQmVoYXZpb3JdcyBmb3IgcmVhZGluZyBmcm9tIG5hdGl2ZSBmaWVsZHMuCiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwgTmF0aXZlQmVoYXZpb3I+IG5hdGl2ZUZpZWxkTG9hZEJlaGF2aW9yOwoKICAvLy8gQ2FjaGUgZm9yIFtOYXRpdmVCZWhhdmlvcl1zIGZvciB3cml0aW5nIHRvIG5hdGl2ZSBmaWVsZHMuCiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwgTmF0aXZlQmVoYXZpb3I+IG5hdGl2ZUZpZWxkU3RvcmVCZWhhdmlvcjsKCiAgTmF0aXZlRGF0YUltcGwoCiAgICAgIHRoaXMuX25hdGl2ZUJhc2ljRGF0YSwKICAgICAgdGhpcy5uYXRpdmVNZW1iZXJOYW1lLAogICAgICB0aGlzLm5hdGl2ZU1ldGhvZEJlaGF2aW9yLAogICAgICB0aGlzLm5hdGl2ZUZpZWxkTG9hZEJlaGF2aW9yLAogICAgICB0aGlzLm5hdGl2ZUZpZWxkU3RvcmVCZWhhdmlvcik7CgogIGZhY3RvcnkgTmF0aXZlRGF0YUltcGwuZnJvbUlyKEtlcm5lbFRvRWxlbWVudE1hcCBtYXAsIElyQW5ub3RhdGlvbkRhdGEgZGF0YSkgewogICAgTmF0aXZlQmFzaWNEYXRhSW1wbCBuYXRpdmVCYXNpY0RhdGEgPQogICAgICAgIG5ldyBOYXRpdmVCYXNpY0RhdGFJbXBsLmZyb21JcihtYXAsIGRhdGEpOwogICAgTWFwPE1lbWJlckVudGl0eSwgU3RyaW5nPiBuYXRpdmVNZW1iZXJOYW1lID0ge307CiAgICBNYXA8RnVuY3Rpb25FbnRpdHksIE5hdGl2ZUJlaGF2aW9yPiBuYXRpdmVNZXRob2RCZWhhdmlvciA9IHt9OwogICAgTWFwPE1lbWJlckVudGl0eSwgTmF0aXZlQmVoYXZpb3I+IG5hdGl2ZUZpZWxkTG9hZEJlaGF2aW9yID0ge307CiAgICBNYXA8TWVtYmVyRW50aXR5LCBOYXRpdmVCZWhhdmlvcj4gbmF0aXZlRmllbGRTdG9yZUJlaGF2aW9yID0ge307CgogICAgZGF0YS5mb3JFYWNoTmF0aXZlTWV0aG9kRGF0YSgoaXIuTWVtYmVyIG5vZGUsCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgSXRlcmFibGU8U3RyaW5nPiBjcmVhdGVzQW5ub3RhdGlvbnMsCiAgICAgICAgSXRlcmFibGU8U3RyaW5nPiByZXR1cm5zQW5ub3RhdGlvbnMpIHsKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IG1hcC5nZXRNZW1iZXIobm9kZSk7CiAgICAgIG5hdGl2ZU1lbWJlck5hbWVbbWVtYmVyXSA9IG5hbWU7CiAgICAgIGJvb2wgaXNKc0ludGVyb3AgPSBuYXRpdmVCYXNpY0RhdGEuaXNKc0ludGVyb3BNZW1iZXIobWVtYmVyKTsKICAgICAgbmF0aXZlTWV0aG9kQmVoYXZpb3JbbWVtYmVyXSA9IG1hcC5nZXROYXRpdmVCZWhhdmlvckZvck1ldGhvZCgKICAgICAgICAgIG5vZGUsIGNyZWF0ZXNBbm5vdGF0aW9ucywgcmV0dXJuc0Fubm90YXRpb25zLAogICAgICAgICAgaXNKc0ludGVyb3A6IGlzSnNJbnRlcm9wKTsKICAgIH0pOwoKICAgIGRhdGEuZm9yRWFjaE5hdGl2ZUZpZWxkRGF0YSgoaXIuTWVtYmVyIG5vZGUsCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgSXRlcmFibGU8U3RyaW5nPiBjcmVhdGVzQW5ub3RhdGlvbnMsCiAgICAgICAgSXRlcmFibGU8U3RyaW5nPiByZXR1cm5zQW5ub3RhdGlvbnMpIHsKICAgICAgRmllbGRFbnRpdHkgZmllbGQgPSBtYXAuZ2V0TWVtYmVyKG5vZGUpOwogICAgICBuYXRpdmVNZW1iZXJOYW1lW2ZpZWxkXSA9IG5hbWU7CiAgICAgIGJvb2wgaXNKc0ludGVyb3AgPSBuYXRpdmVCYXNpY0RhdGEuaXNKc0ludGVyb3BNZW1iZXIoZmllbGQpOwogICAgICBuYXRpdmVGaWVsZExvYWRCZWhhdmlvcltmaWVsZF0gPSBtYXAuZ2V0TmF0aXZlQmVoYXZpb3JGb3JGaWVsZExvYWQoCiAgICAgICAgICBub2RlLCBjcmVhdGVzQW5ub3RhdGlvbnMsIHJldHVybnNBbm5vdGF0aW9ucywKICAgICAgICAgIGlzSnNJbnRlcm9wOiBpc0pzSW50ZXJvcCk7CiAgICAgIG5hdGl2ZUZpZWxkU3RvcmVCZWhhdmlvcltmaWVsZF0gPQogICAgICAgICAgbWFwLmdldE5hdGl2ZUJlaGF2aW9yRm9yRmllbGRTdG9yZShub2RlKTsKICAgIH0pOwoKICAgIHJldHVybiBuZXcgTmF0aXZlRGF0YUltcGwoCiAgICAgICAgbmF0aXZlQmFzaWNEYXRhLAogICAgICAgIG5hdGl2ZU1lbWJlck5hbWUsCiAgICAgICAgbmF0aXZlTWV0aG9kQmVoYXZpb3IsCiAgICAgICAgbmF0aXZlRmllbGRMb2FkQmVoYXZpb3IsCiAgICAgICAgbmF0aXZlRmllbGRTdG9yZUJlaGF2aW9yKTsKICB9CgogIGZhY3RvcnkgTmF0aXZlRGF0YUltcGwucmVhZEZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwgRWxlbWVudEVudmlyb25tZW50IGVsZW1lbnRFbnZpcm9ubWVudCkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBOYXRpdmVCYXNpY0RhdGEgbmF0aXZlQmFzaWNEYXRhID0KICAgICAgICBuZXcgTmF0aXZlQmFzaWNEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UsIGVsZW1lbnRFbnZpcm9ubWVudCk7CiAgICBNYXA8TWVtYmVyRW50aXR5LCBTdHJpbmc+IG5hdGl2ZU1lbWJlck5hbWUgPQogICAgICAgIHNvdXJjZS5yZWFkTWVtYmVyTWFwKHNvdXJjZS5yZWFkU3RyaW5nKTsKICAgIE1hcDxGdW5jdGlvbkVudGl0eSwgTmF0aXZlQmVoYXZpb3I+IG5hdGl2ZU1ldGhvZEJlaGF2aW9yID0gc291cmNlCiAgICAgICAgLnJlYWRNZW1iZXJNYXAoKCkgPT4gbmV3IE5hdGl2ZUJlaGF2aW9yLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpKTsKICAgIE1hcDxNZW1iZXJFbnRpdHksIE5hdGl2ZUJlaGF2aW9yPiBuYXRpdmVGaWVsZExvYWRCZWhhdmlvciA9IHNvdXJjZQogICAgICAgIC5yZWFkTWVtYmVyTWFwKCgpID0+IG5ldyBOYXRpdmVCZWhhdmlvci5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKSk7CiAgICBNYXA8TWVtYmVyRW50aXR5LCBOYXRpdmVCZWhhdmlvcj4gbmF0aXZlRmllbGRTdG9yZUJlaGF2aW9yID0gc291cmNlCiAgICAgICAgLnJlYWRNZW1iZXJNYXAoKCkgPT4gbmV3IE5hdGl2ZUJlaGF2aW9yLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgTmF0aXZlRGF0YUltcGwoCiAgICAgICAgbmF0aXZlQmFzaWNEYXRhLAogICAgICAgIG5hdGl2ZU1lbWJlck5hbWUsCiAgICAgICAgbmF0aXZlTWV0aG9kQmVoYXZpb3IsCiAgICAgICAgbmF0aXZlRmllbGRMb2FkQmVoYXZpb3IsCiAgICAgICAgbmF0aXZlRmllbGRTdG9yZUJlaGF2aW9yKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIF9uYXRpdmVCYXNpY0RhdGEud3JpdGVUb0RhdGFTaW5rKHNpbmspOwoKICAgIHNpbmsud3JpdGVNZW1iZXJNYXAobmF0aXZlTWVtYmVyTmFtZSwgc2luay53cml0ZVN0cmluZyk7CgogICAgc2luay53cml0ZU1lbWJlck1hcChuYXRpdmVNZXRob2RCZWhhdmlvciwgKE5hdGl2ZUJlaGF2aW9yIGJlaGF2aW9yKSB7CiAgICAgIGJlaGF2aW9yLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIH0pOwoKICAgIHNpbmsud3JpdGVNZW1iZXJNYXAobmF0aXZlRmllbGRMb2FkQmVoYXZpb3IsIChOYXRpdmVCZWhhdmlvciBiZWhhdmlvcikgewogICAgICBiZWhhdmlvci53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICB9KTsKICAgIHNpbmsud3JpdGVNZW1iZXJNYXAobmF0aXZlRmllbGRTdG9yZUJlaGF2aW9yLCAoTmF0aXZlQmVoYXZpb3IgYmVoYXZpb3IpIHsKICAgICAgYmVoYXZpb3Iud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgfSk7CgogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIE1hcDxMaWJyYXJ5RW50aXR5LCBTdHJpbmc+IGdldCBqc0ludGVyb3BMaWJyYXJpZXMgPT4KICAgICAgX25hdGl2ZUJhc2ljRGF0YS5qc0ludGVyb3BMaWJyYXJpZXM7CgogIEBvdmVycmlkZQogIFNldDxDbGFzc0VudGl0eT4gZ2V0IGFub255bW91c0pzSW50ZXJvcENsYXNzZXMgPT4KICAgICAgX25hdGl2ZUJhc2ljRGF0YS5hbm9ueW1vdXNKc0ludGVyb3BDbGFzc2VzOwoKICBAb3ZlcnJpZGUKICBNYXA8Q2xhc3NFbnRpdHksIFN0cmluZz4gZ2V0IGpzSW50ZXJvcENsYXNzZXMgPT4KICAgICAgX25hdGl2ZUJhc2ljRGF0YS5qc0ludGVyb3BDbGFzc2VzOwoKICBAb3ZlcnJpZGUKICBNYXA8TWVtYmVyRW50aXR5LCBTdHJpbmc+IGdldCBqc0ludGVyb3BNZW1iZXJzID0+CiAgICAgIF9uYXRpdmVCYXNpY0RhdGEuanNJbnRlcm9wTWVtYmVyczsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0Fub255bW91c0pzSW50ZXJvcENsYXNzKENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBhbm9ueW1vdXNKc0ludGVyb3BDbGFzc2VzLmNvbnRhaW5zKGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc05hdGl2ZUNsYXNzKENsYXNzRW50aXR5IGVsZW1lbnQpID0+CiAgICAgIF9uYXRpdmVCYXNpY0RhdGEuaXNOYXRpdmVDbGFzcyhlbGVtZW50KTsKCiAgQG92ZXJyaWRlCiAgTGlzdDxTdHJpbmc+IGdldE5hdGl2ZVRhZ3NPZkNsYXNzKENsYXNzRW50aXR5IGNscykgPT4KICAgICAgX25hdGl2ZUJhc2ljRGF0YS5nZXROYXRpdmVUYWdzT2ZDbGFzcyhjbHMpOwoKICBAb3ZlcnJpZGUKICBib29sIGhhc05hdGl2ZVRhZ3NGb3JjZWROb25MZWFmKENsYXNzRW50aXR5IGNscykgPT4KICAgICAgX25hdGl2ZUJhc2ljRGF0YS5oYXNOYXRpdmVUYWdzRm9yY2VkTm9uTGVhZihjbHMpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0pzSW50ZXJvcFVzZWQgPT4gX25hdGl2ZUJhc2ljRGF0YS5pc0pzSW50ZXJvcFVzZWQ7CgogIEBvdmVycmlkZQogIGJvb2wgaXNKc0ludGVyb3BMaWJyYXJ5KExpYnJhcnlFbnRpdHkgZWxlbWVudCkgPT4KICAgICAgX25hdGl2ZUJhc2ljRGF0YS5pc0pzSW50ZXJvcExpYnJhcnkoZWxlbWVudCk7CgogIEBvdmVycmlkZQogIGJvb2wgaXNKc0ludGVyb3BDbGFzcyhDbGFzc0VudGl0eSBlbGVtZW50KSA9PgogICAgICBfbmF0aXZlQmFzaWNEYXRhLmlzSnNJbnRlcm9wQ2xhc3MoZWxlbWVudCk7CgogIEBvdmVycmlkZQogIGJvb2wgaXNOYXRpdmVPckV4dGVuZHNOYXRpdmUoQ2xhc3NFbnRpdHkgZWxlbWVudCkgPT4KICAgICAgX25hdGl2ZUJhc2ljRGF0YS5pc05hdGl2ZU9yRXh0ZW5kc05hdGl2ZShlbGVtZW50KTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldEpzSW50ZXJvcExpYnJhcnlOYW1lKExpYnJhcnlFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIGpzSW50ZXJvcExpYnJhcmllc1tlbGVtZW50XTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXRKc0ludGVyb3BDbGFzc05hbWUoQ2xhc3NFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIGpzSW50ZXJvcENsYXNzZXNbZWxlbWVudF07CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0SnNJbnRlcm9wTWVtYmVyTmFtZShNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIGpzSW50ZXJvcE1lbWJlcnNbZWxlbWVudF07CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIF9pc0pzSW50ZXJvcE1lbWJlcihNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIGpzSW50ZXJvcE1lbWJlcnMuY29udGFpbnNLZXkoZWxlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSnNJbnRlcm9wTWVtYmVyKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBpZiAoZWxlbWVudC5pc0Z1bmN0aW9uIHx8CiAgICAgICAgZWxlbWVudC5pc0NvbnN0cnVjdG9yIHx8CiAgICAgICAgZWxlbWVudC5pc0dldHRlciB8fAogICAgICAgIGVsZW1lbnQuaXNTZXR0ZXIpIHsKICAgICAgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24gPSBlbGVtZW50OwogICAgICBpZiAoIWZ1bmN0aW9uLmlzRXh0ZXJuYWwpIHJldHVybiBmYWxzZTsKCiAgICAgIGlmIChfaXNKc0ludGVyb3BNZW1iZXIoZnVuY3Rpb24pKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKGZ1bmN0aW9uLmVuY2xvc2luZ0NsYXNzICE9IG51bGwpIHsKICAgICAgICByZXR1cm4gaXNKc0ludGVyb3BDbGFzcyhmdW5jdGlvbi5lbmNsb3NpbmdDbGFzcyk7CiAgICAgIH0KICAgICAgaWYgKGZ1bmN0aW9uLmlzVG9wTGV2ZWwpIHsKICAgICAgICByZXR1cm4gaXNKc0ludGVyb3BMaWJyYXJ5KGZ1bmN0aW9uLmxpYnJhcnkpOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfaXNKc0ludGVyb3BNZW1iZXIoZWxlbWVudCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGhhc0ZpeGVkQmFja2VuZE5hbWUoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBpc0pzSW50ZXJvcE1lbWJlcihlbGVtZW50KSB8fCBuYXRpdmVNZW1iZXJOYW1lLmNvbnRhaW5zS2V5KGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldEZpeGVkQmFja2VuZE5hbWUoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIFN0cmluZyBuYW1lID0gbmF0aXZlTWVtYmVyTmFtZVtlbGVtZW50XTsKICAgIGlmIChuYW1lID09IG51bGwgJiYgaXNKc0ludGVyb3BNZW1iZXIoZWxlbWVudCkpIHsKICAgICAgLy8gSWYgYW4gZWxlbWVudCBpc0pzSW50ZXJvcCBidXQgX2lzSnNJbnRlcm9wIGlzIGZhbHNlIHRoYXQgbWVhbnMgaXQgaXMKICAgICAgLy8gY29uc2lkZXJlZCBpbnRlcm9wIGFzIHRoZSBwYXJlbnQgY2xhc3MgaXMgaW50ZXJvcC4KICAgICAgbmFtZSA9IGVsZW1lbnQuaXNDb25zdHJ1Y3RvcgogICAgICAgICAgPyBfanNDbGFzc05hbWVIZWxwZXIoZWxlbWVudC5lbmNsb3NpbmdDbGFzcykKICAgICAgICAgIDogX2pzTWVtYmVyTmFtZUhlbHBlcihlbGVtZW50KTsKICAgICAgbmF0aXZlTWVtYmVyTmFtZVtlbGVtZW50XSA9IG5hbWU7CiAgICB9CiAgICByZXR1cm4gbmFtZTsKICB9CgogIFN0cmluZyBfanNMaWJyYXJ5TmFtZUhlbHBlcihMaWJyYXJ5RW50aXR5IGVsZW1lbnQpIHsKICAgIFN0cmluZyBqc0ludGVyb3BOYW1lID0gZ2V0SnNJbnRlcm9wTGlicmFyeU5hbWUoZWxlbWVudCk7CiAgICBpZiAoanNJbnRlcm9wTmFtZSAhPSBudWxsICYmIGpzSW50ZXJvcE5hbWUuaXNOb3RFbXB0eSkgcmV0dXJuIGpzSW50ZXJvcE5hbWU7CiAgICByZXR1cm4gJ3NlbGYnOwogIH0KCiAgU3RyaW5nIF9qc0NsYXNzTmFtZUhlbHBlcihDbGFzc0VudGl0eSBlbGVtZW50KSB7CiAgICBTdHJpbmcganNJbnRlcm9wTmFtZSA9IGdldEpzSW50ZXJvcENsYXNzTmFtZShlbGVtZW50KTsKICAgIGlmIChqc0ludGVyb3BOYW1lICE9IG51bGwgJiYganNJbnRlcm9wTmFtZS5pc05vdEVtcHR5KSByZXR1cm4ganNJbnRlcm9wTmFtZTsKICAgIHJldHVybiBjb21wdXRlVW5lc2NhcGVkSlNJbnRlcm9wTmFtZShlbGVtZW50Lm5hbWUpOwogIH0KCiAgU3RyaW5nIF9qc01lbWJlck5hbWVIZWxwZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIFN0cmluZyBqc0ludGVyb3BOYW1lID0ganNJbnRlcm9wTWVtYmVyc1tlbGVtZW50XTsKICAgIGFzc2VydCgKICAgICAgICAhKGpzSW50ZXJvcE1lbWJlcnMuY29udGFpbnNLZXkoZWxlbWVudCkgJiYganNJbnRlcm9wTmFtZSA9PSBudWxsKSwKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgZWxlbWVudCwKICAgICAgICAgICAgJ01lbWJlciAkZWxlbWVudCBpcyBqcyBpbnRlcm9wIGJ1dCBqcyBpbnRlcm9wIG5hbWUgaGFzIG5vdCB5ZXQgJwogICAgICAgICAgICAnYmVlbiBjb21wdXRlZC4nKSk7CiAgICBpZiAoanNJbnRlcm9wTmFtZSAhPSBudWxsICYmIGpzSW50ZXJvcE5hbWUuaXNOb3RFbXB0eSkgewogICAgICByZXR1cm4ganNJbnRlcm9wTmFtZTsKICAgIH0KICAgIHJldHVybiBjb21wdXRlVW5lc2NhcGVkSlNJbnRlcm9wTmFtZShlbGVtZW50Lm5hbWUpOwogIH0KCiAgLy8vIFJldHVybnMgYSBKYXZhU2NyaXB0IHBhdGggc3BlY2lmeWluZyB0aGUgY29udGV4dCBpbiB3aGljaAogIC8vLyBbZWxlbWVudC5maXhlZEJhY2tlbmROYW1lXSBzaG91bGQgYmUgZXZhbHVhdGVkLiBPbmx5IGFwcGxpY2FibGUgZm9yCiAgLy8vIGVsZW1lbnRzIHVzaW5nIHR5cGVkIEphdmFTY3JpcHQgaW50ZXJvcC4KICAvLy8gRm9yIGV4YW1wbGU6IGZpeGVkQmFja2VuZFBhdGggZm9yIHRoZSBzdGF0aWMgbWV0aG9kIGNyZWF0ZU1hcCBpbiB0aGUKICAvLy8gTWFwIGNsYXNzIG9mIHRoZSBnb29nLm1hcCBKYXZhU2NyaXB0IGxpYnJhcnkgd291bGQgaGF2ZSBwYXRoCiAgLy8vICJnb29nLm1hcHMuTWFwIi4KICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0Rml4ZWRCYWNrZW5kTWV0aG9kUGF0aChGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICBpZiAoIWlzSnNJbnRlcm9wTWVtYmVyKGVsZW1lbnQpKSByZXR1cm4gbnVsbDsKICAgIGlmIChlbGVtZW50LmlzSW5zdGFuY2VNZW1iZXIpIHJldHVybiAndGhpcyc7CiAgICBpZiAoZWxlbWVudC5pc0NvbnN0cnVjdG9yKSB7CiAgICAgIHJldHVybiBfZml4ZWRCYWNrZW5kQ2xhc3NQYXRoKGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MpOwogICAgfQogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoX2pzTGlicmFyeU5hbWVIZWxwZXIoZWxlbWVudC5saWJyYXJ5KSk7CiAgICBpZiAoZWxlbWVudC5lbmNsb3NpbmdDbGFzcyAhPSBudWxsKSB7CiAgICAgIHNiLi53cml0ZSgnLicpLi53cml0ZShfanNDbGFzc05hbWVIZWxwZXIoZWxlbWVudC5lbmNsb3NpbmdDbGFzcykpOwogICAgfQogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQoKICBTdHJpbmcgX2ZpeGVkQmFja2VuZENsYXNzUGF0aChDbGFzc0VudGl0eSBlbGVtZW50KSB7CiAgICBpZiAoIWlzSnNJbnRlcm9wQ2xhc3MoZWxlbWVudCkpIHJldHVybiBudWxsOwogICAgcmV0dXJuIF9qc0xpYnJhcnlOYW1lSGVscGVyKGVsZW1lbnQubGlicmFyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzTmF0aXZlTWVtYmVyKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBpZiAoaXNKc0ludGVyb3BNZW1iZXIoZWxlbWVudCkpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIG5hdGl2ZU1lbWJlck5hbWUuY29udGFpbnNLZXkoZWxlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBOYXRpdmVCZWhhdmlvciBnZXROYXRpdmVNZXRob2RCZWhhdmlvcihGdW5jdGlvbkVudGl0eSBtZXRob2QpIHsKICAgIGFzc2VydCgKICAgICAgICBuYXRpdmVNZXRob2RCZWhhdmlvci5jb250YWluc0tleShtZXRob2QpLAogICAgICAgIGZhaWxlZEF0KG1ldGhvZCwKICAgICAgICAgICAgIk5vIG5hdGl2ZSBtZXRob2QgYmVoYXZpb3IgaGFzIGJlZW4gY29tcHV0ZWQgZm9yICRtZXRob2QuIikpOwogICAgcmV0dXJuIG5hdGl2ZU1ldGhvZEJlaGF2aW9yW21ldGhvZF07CiAgfQoKICBAb3ZlcnJpZGUKICBOYXRpdmVCZWhhdmlvciBnZXROYXRpdmVGaWVsZExvYWRCZWhhdmlvcihGaWVsZEVudGl0eSBmaWVsZCkgewogICAgYXNzZXJ0KAogICAgICAgIG5hdGl2ZUZpZWxkTG9hZEJlaGF2aW9yLmNvbnRhaW5zS2V5KGZpZWxkKSwKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgZmllbGQsCiAgICAgICAgICAgICJObyBuYXRpdmUgZmllbGQgbG9hZCBiZWhhdmlvciBoYXMgYmVlbiAiCiAgICAgICAgICAgICJjb21wdXRlZCBmb3IgJGZpZWxkLiIpKTsKICAgIHJldHVybiBuYXRpdmVGaWVsZExvYWRCZWhhdmlvcltmaWVsZF07CiAgfQoKICBAb3ZlcnJpZGUKICBOYXRpdmVCZWhhdmlvciBnZXROYXRpdmVGaWVsZFN0b3JlQmVoYXZpb3IoRmllbGRFbnRpdHkgZmllbGQpIHsKICAgIGFzc2VydCgKICAgICAgICBuYXRpdmVGaWVsZFN0b3JlQmVoYXZpb3IuY29udGFpbnNLZXkoZmllbGQpLAogICAgICAgIGZhaWxlZEF0KGZpZWxkLAogICAgICAgICAgICAiTm8gbmF0aXZlIGZpZWxkIHN0b3JlIGJlaGF2aW9yIGhhcyBiZWVuIGNvbXB1dGVkIGZvciAkZmllbGQuIikpOwogICAgcmV0dXJuIG5hdGl2ZUZpZWxkU3RvcmVCZWhhdmlvcltmaWVsZF07CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgY29tcHV0ZVVuZXNjYXBlZEpTSW50ZXJvcE5hbWUoU3RyaW5nIG5hbWUpIHsKICAgIHJldHVybiBuYW1lLnN0YXJ0c1dpdGgoX2pzSW50ZXJvcEVzY2FwZVByZWZpeCkKICAgICAgICA/IG5hbWUuc3Vic3RyaW5nKF9qc0ludGVyb3BFc2NhcGVQcmVmaXgubGVuZ3RoKQogICAgICAgIDogbmFtZTsKICB9CgogIEBvdmVycmlkZQogIE1hcDxDbGFzc0VudGl0eSwgTmF0aXZlQ2xhc3NUYWc+IGdldCBuYXRpdmVDbGFzc1RhZ0luZm8gPT4KICAgICAgX25hdGl2ZUJhc2ljRGF0YS5uYXRpdmVDbGFzc1RhZ0luZm87CgogIEBvdmVycmlkZQogIEVsZW1lbnRFbnZpcm9ubWVudCBnZXQgX2VudiA9PiBfbmF0aXZlQmFzaWNEYXRhLl9lbnY7Cn0KCmNsYXNzIE5hdGl2ZUNsYXNzVGFnIHsKICBmaW5hbCBMaXN0PFN0cmluZz4gbmFtZXM7CiAgZmluYWwgYm9vbCBpc05vbkxlYWY7CgogIGZhY3RvcnkgTmF0aXZlQ2xhc3NUYWcoU3RyaW5nIHRhZ1RleHQpIHsKICAgIExpc3Q8U3RyaW5nPiB0YWdzID0gdGFnVGV4dC5zcGxpdCgnLCcpOwogICAgTGlzdDxTdHJpbmc+IG5hbWVzID0gdGFncy53aGVyZSgocykgPT4gIXMuc3RhcnRzV2l0aCgnIScpKS50b0xpc3QoKTsKICAgIGJvb2wgaXNOb25MZWFmID0gdGFncy5jb250YWlucygnIW5vbmxlYWYnKTsKICAgIHJldHVybiBuZXcgTmF0aXZlQ2xhc3NUYWcuaW50ZXJuYWwobmFtZXMsIGlzTm9uTGVhZik7CiAgfQoKICBOYXRpdmVDbGFzc1RhZy5pbnRlcm5hbCh0aGlzLm5hbWVzLCB0aGlzLmlzTm9uTGVhZik7CgogIFN0cmluZyBnZXQgdGV4dCB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZShuYW1lcy5qb2luKCcsJykpOwogICAgaWYgKGlzTm9uTGVhZikgewogICAgICBpZiAobmFtZXMuaXNOb3RFbXB0eSkgewogICAgICAgIHNiLndyaXRlKCcsJyk7CiAgICAgIH0KICAgICAgc2Iud3JpdGUoJyFub25sZWFmJyk7CiAgICB9CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gSGFzaGluZy5saXN0SGFzaChuYW1lcywgaXNOb25MZWFmLmhhc2hDb2RlKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzISBOYXRpdmVDbGFzc1RhZykgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIGVxdWFsRWxlbWVudHMobmFtZXMsIG90aGVyLm5hbWVzKSAmJiBpc05vbkxlYWYgPT0gb3RoZXIuaXNOb25MZWFmOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gdGV4dDsKfQqDYgBOTjwBIAEoARk6JCElNi4cAU8EUCE9LkYuATMnAUgGT0gsKwFENgE5NAFINQE2HAE6MgE4LgE5MAIBUQ0ETjQ4KUYpAS4MJwFNBkdLThEtAURBAUhAAUZBAUkSMgFPTjQBUQZNQzwBDDABQjkBQjcBQDUBQTcBTBA1AgEoKgZMThY/ATkGSk4NRQE5BkpMDTEvAVEvQQFKDzkCASNAUAFETwFCUAE3BkM/AUkWAgFFGAE4HzgnAUlNAUdHAT1HAUdJAQxADBISETE4AU1KTQ8MKzUSETs/KjsEAQxGDBISFTFCKAQBDDEwDBISFTFAJhcuBgQBDEIMEhIVMUEmBAEMOhQkFRwcGiMbBAEcFQQCATdJHTEBIQE4Hz0BSTcBRzMBPTQBRzQBFxEfHx0mHgEmNzU+ODQ1NQE7SQhCThAIPB4sJBksCAhANAgBUEgEATJCFzohMSo8CDQyMDBPMTEVJBwcHBojGwQBDCgVQiQlCEA8Mj0TBAEMLDA0BAEMNyoEAQw1LgQBDB5EAQwzNAQBDC8yBAFNMjIEAQwxUB4hHBwpLgE1LToIITUIFA0qBgQBDDYnPxMGQQQCATsuAUdJAT49KgFCPicBQD8nATABDEBMUTUMUBIVQj0jJgQBDFEtBAEMUC8EAQxRMAQBDE9QAgFQIEJEHSsBQxw3AS4BRzQBPkIBQkMBQEQBEh0dISQmAVEqMzVDREUBMhUtLzEnREU4JQgBMRUtLy8mQ0o4JSg0CAEfGRoeISMEAS1CFyZMMTFGTUdNSE0VHxkaHiEjBAEMKBUsAT0BSiYIAU0mCE4mCAETBAEMNysBDDQyAQwzKQEMNCkBDDg4BAEMLS8BDDgyAQw2OAEMQAEMNDQBDDAyAQw3OQEMOigEAQw2JgQBDDgmBAEMMjIEAQwxHiEcHCkuATUtOgghNQgUDSoGBAEMM1AEAQw1LTZOPCM3KigGEQQBNz1REwQBMztROAQBNTYMSxIVTSA9HAY4BAFASi9LQxcMPTIxIT0GKjUqSQYaBAE3MTIEAQwuMTIEAQxCDDIZSikEAQxBDDQSEzYmKwQBDEIMNRhOLAQBDDYzOBAEAQw9KwEMOAIBFxwYASssSTA6BAE3ARQqHxUeFwgcBhoEAQxDAQwcLTBOBAEMHQIBMHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydCpzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9zc2Evc3NhLmRhcnSUSi8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IHNzYTsKCmltcG9ydCAnLi4vY29tbW9uL2NvZGVnZW4uZGFydCcgc2hvdyBDb2RlZ2VuV29ya0l0ZW0sIENvZGVnZW5SZWdpc3RyeTsKaW1wb3J0ICcuLi9jb21tb24vdGFza3MuZGFydCcgc2hvdyBDb21waWxlclRhc2ssIE1lYXN1cmVyOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnIHNob3cgTWVtYmVyRW50aXR5OwppbXBvcnQgJy4uL2luZmVycmVyL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2lvL3NvdXJjZV9pbmZvcm1hdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBhcyBqczsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2ZpZWxkX2FuYWx5c2lzLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvYmFja2VuZC5kYXJ0JyBzaG93IEphdmFTY3JpcHRCYWNrZW5kLCBGdW5jdGlvbkNvbXBpbGVyOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NhbGxfc3RydWN0dXJlLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3VzZS5kYXJ0JzsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKCmltcG9ydCAnY29kZWdlbi5kYXJ0JzsKaW1wb3J0ICdub2Rlcy5kYXJ0JzsKaW1wb3J0ICdvcHRpbWl6ZS5kYXJ0JzsKCmNsYXNzIFNzYUZ1bmN0aW9uQ29tcGlsZXIgaW1wbGVtZW50cyBGdW5jdGlvbkNvbXBpbGVyIHsKICBmaW5hbCBTc2FDb2RlR2VuZXJhdG9yVGFzayBnZW5lcmF0b3I7CiAgZmluYWwgU3NhQnVpbGRlclRhc2sgX2J1aWxkZXI7CiAgZmluYWwgU3NhT3B0aW1pemVyVGFzayBvcHRpbWl6ZXI7CiAgZmluYWwgSmF2YVNjcmlwdEJhY2tlbmQgYmFja2VuZDsKCiAgU3NhRnVuY3Rpb25Db21waWxlcihKYXZhU2NyaXB0QmFja2VuZCBiYWNrZW5kLCBNZWFzdXJlciBtZWFzdXJlciwKICAgICAgU291cmNlSW5mb3JtYXRpb25TdHJhdGVneSBzb3VyY2VJbmZvcm1hdGlvbkZhY3RvcnkpCiAgICAgIDogZ2VuZXJhdG9yID0gbmV3IFNzYUNvZGVHZW5lcmF0b3JUYXNrKGJhY2tlbmQsIHNvdXJjZUluZm9ybWF0aW9uRmFjdG9yeSksCiAgICAgICAgX2J1aWxkZXIgPSBuZXcgU3NhQnVpbGRlclRhc2soYmFja2VuZCwgc291cmNlSW5mb3JtYXRpb25GYWN0b3J5KSwKICAgICAgICBvcHRpbWl6ZXIgPSBuZXcgU3NhT3B0aW1pemVyVGFzayhiYWNrZW5kKSwKICAgICAgICBiYWNrZW5kID0gYmFja2VuZDsKCiAgQG92ZXJyaWRlCiAgdm9pZCBvbkNvZGVnZW5TdGFydCgpIHsKICAgIF9idWlsZGVyLm9uQ29kZWdlblN0YXJ0KCk7CiAgfQoKICAvLy8gR2VuZXJhdGVzIEphdmFTY3JpcHQgY29kZSBmb3IgYHdvcmsuZWxlbWVudGAuCiAgLy8vIFVzaW5nIHRoZSBzc2EgYnVpbGRlciwgb3B0aW1pemVyIGFuZCBjb2RlIGdlbmVyYXRvci4KICBAb3ZlcnJpZGUKICBqcy5GdW4gY29tcGlsZShDb2RlZ2VuV29ya0l0ZW0gd29yaywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBnbG9iYWxJbmZlcmVuY2VSZXN1bHRzKSB7CiAgICBIR3JhcGggZ3JhcGggPSBfYnVpbGRlci5idWlsZCh3b3JrLCBjbG9zZWRXb3JsZCwgZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cyk7CiAgICBpZiAoZ3JhcGggPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBvcHRpbWl6ZXIub3B0aW1pemUod29yaywgZ3JhcGgsIGNsb3NlZFdvcmxkLCBnbG9iYWxJbmZlcmVuY2VSZXN1bHRzKTsKICAgIE1lbWJlckVudGl0eSBlbGVtZW50ID0gd29yay5lbGVtZW50OwogICAganMuRXhwcmVzc2lvbiByZXN1bHQgPSBnZW5lcmF0b3IuZ2VuZXJhdGVDb2RlKHdvcmssIGdyYXBoLCBjbG9zZWRXb3JsZCk7CiAgICBpZiAoZ3JhcGgubmVlZHNBc3luY1Jld3JpdGUpIHsKICAgICAgU291cmNlSW5mb3JtYXRpb25CdWlsZGVyIHNvdXJjZUluZm9ybWF0aW9uQnVpbGRlciA9CiAgICAgICAgICBiYWNrZW5kLnNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kuY3JlYXRlQnVpbGRlckZvckNvbnRleHQoZWxlbWVudCk7CiAgICAgIHJlc3VsdCA9IGJhY2tlbmQucmV3cml0ZUFzeW5jKAogICAgICAgICAgY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMsCiAgICAgICAgICBjbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQsCiAgICAgICAgICB3b3JrLnJlZ2lzdHJ5LAogICAgICAgICAgZWxlbWVudCwKICAgICAgICAgIHJlc3VsdCwKICAgICAgICAgIGdyYXBoLmFzeW5jRWxlbWVudFR5cGUsCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRBc3luY0JvZHkoKSwKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEFzeW5jRXhpdCgpKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxDb21waWxlclRhc2s+IGdldCB0YXNrcyB7CiAgICByZXR1cm4gPENvbXBpbGVyVGFzaz5bX2J1aWxkZXIsIG9wdGltaXplciwgZ2VuZXJhdG9yXTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIFNzYUJ1aWxkZXIgewogIC8vLyBDcmVhdGVzIHRoZSBbSEdyYXBoXSBmb3IgW3dvcmtdIG9yIHJldHVybnMgYG51bGxgIGlmIG5vIGNvZGUgaXMgbmVlZGVkCiAgLy8vIGZvciBbd29ya10uCiAgSEdyYXBoIGJ1aWxkKENvZGVnZW5Xb3JrSXRlbSB3b3JrLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIGdsb2JhbEluZmVyZW5jZVJlc3VsdHMpOwp9CgpjbGFzcyBTc2FCdWlsZGVyVGFzayBleHRlbmRzIENvbXBpbGVyVGFzayB7CiAgZmluYWwgSmF2YVNjcmlwdEJhY2tlbmQgX2JhY2tlbmQ7CiAgZmluYWwgU291cmNlSW5mb3JtYXRpb25TdHJhdGVneSBfc291cmNlSW5mb3JtYXRpb25GYWN0b3J5OwogIFNzYUJ1aWxkZXIgX2J1aWxkZXI7CgogIFNzYUJ1aWxkZXJUYXNrKHRoaXMuX2JhY2tlbmQsIHRoaXMuX3NvdXJjZUluZm9ybWF0aW9uRmFjdG9yeSkKICAgICAgOiBzdXBlcihfYmFja2VuZC5jb21waWxlci5tZWFzdXJlcik7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgbmFtZSA9PiAnU1NBIGJ1aWxkZXInOwoKICB2b2lkIG9uQ29kZWdlblN0YXJ0KCkgewogICAgX2J1aWxkZXIgPSBfYmFja2VuZC5jb21waWxlci5iYWNrZW5kU3RyYXRlZ3kKICAgICAgICAuY3JlYXRlU3NhQnVpbGRlcih0aGlzLCBfYmFja2VuZCwgX3NvdXJjZUluZm9ybWF0aW9uRmFjdG9yeSk7CiAgfQoKICAvLy8gQ3JlYXRlcyB0aGUgW0hHcmFwaF0gZm9yIFt3b3JrXSBvciByZXR1cm5zIGBudWxsYCBpZiBubyBjb2RlIGlzIG5lZWRlZAogIC8vLyBmb3IgW3dvcmtdLgogIEhHcmFwaCBidWlsZChDb2RlZ2VuV29ya0l0ZW0gd29yaywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBnbG9iYWxJbmZlcmVuY2VSZXN1bHRzKSB7CiAgICByZXR1cm4gX2J1aWxkZXIuYnVpbGQod29yaywgY2xvc2VkV29ybGQsIGdsb2JhbEluZmVyZW5jZVJlc3VsdHMpOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgU3NhQnVpbGRlckZpZWxkTWl4aW4gewogIC8vLyBIYW5kbGUgZmllbGQgaW5pdGlhbGl6ZXIgb2YgW2VsZW1lbnRdLiBSZXR1cm5zIGB0cnVlYCBpZiBubyBjb2RlCiAgLy8vIGlzIG5lZWRlZCBmb3IgdGhlIGZpZWxkLgogIC8vLwogIC8vLyBJZiBbZWxlbWVudF0gaXMgYSBmaWVsZCB3aXRoIGEgY29uc3RhbnQgaW5pdGlhbGl6ZXIsIHRoZSB2YWx1ZSBpcwogIC8vLyByZWdpc3RlcmVkIHdpdGggdGhlIHdvcmxkIGltcGFjdC4gT3RoZXJ3aXNlIHRoZSBjeWNsaWMtdGhyb3cgaGVscGVyIGlzCiAgLy8vIHJlZ2lzdGVyZWQgZm9yIHRoZSBsYXp5IHZhbHVlIGNvbXB1dGF0aW9uLgogIC8vLwogIC8vLyBJZiB0aGUgZmllbGQgaXMgY29uc3RhbnQsIG5vIGNvZGUgaXMgbmVlZGVkIGZvciB0aGUgZmllbGQgYW5kIHRoZSBtZXRob2QKICAvLy8gcmV0dXJucyBgdHJ1ZWAuCiAgYm9vbCBoYW5kbGVDb25zdGFudEZpZWxkKE1lbWJlckVudGl0eSBlbGVtZW50LCBDb2RlZ2VuUmVnaXN0cnkgcmVnaXN0cnksCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgaWYgKGVsZW1lbnQuaXNGaWVsZCkgewogICAgICBGaWVsZEFuYWx5c2lzRGF0YSBmaWVsZERhdGEgPQogICAgICAgICAgY2xvc2VkV29ybGQuZmllbGRBbmFseXNpcy5nZXRGaWVsZERhdGEoZWxlbWVudCk7CiAgICAgIGlmIChmaWVsZERhdGEuaW5pdGlhbFZhbHVlICE9IG51bGwpIHsKICAgICAgICByZWdpc3RyeS53b3JsZEltcGFjdAogICAgICAgICAgICAucmVnaXN0ZXJDb25zdGFudFVzZShuZXcgQ29uc3RhbnRVc2UuaW5pdChmaWVsZERhdGEuaW5pdGlhbFZhbHVlKSk7CiAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBnZW5lcmF0ZSBjb2RlIGZvciBzdGF0aWMgb3IgdG9wLWxldmVsCiAgICAgICAgLy8gdmFyaWFibGVzLiBGb3IgaW5zdGFuY2UgdmFyaWFibGVzLCB3ZSBtYXkgbmVlZCB0byBnZW5lcmF0ZQogICAgICAgIC8vIHRoZSBjaGVja2VkIHNldHRlci4KICAgICAgICBpZiAoZWxlbWVudC5pc1N0YXRpYyB8fCBlbGVtZW50LmlzVG9wTGV2ZWwpIHsKICAgICAgICAgIC8vLyBObyBjb2RlIGlzIGNyZWF0ZWQgZm9yIHRoaXMgZmllbGQ6IEFsbCByZWZlcmVuY2VzIGlubGluZSB0aGUKICAgICAgICAgIC8vLyBjb25zdGFudCB2YWx1ZS4KICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChmaWVsZERhdGEuaXNMYXp5KSB7CiAgICAgICAgLy8gVGhlIGdlbmVyYXRlZCBpbml0aWFsaXplciBuZWVkcyBiZSB3cmFwcGVkIGluIHRoZSBjeWNsaWMtZXJyb3IKICAgICAgICAvLyBoZWxwZXIuCiAgICAgICAgcmVnaXN0cnkud29ybGRJbXBhY3QucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5zdGF0aWNJbnZva2UoCiAgICAgICAgICAgIGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmN5Y2xpY1Rocm93SGVscGVyLAogICAgICAgICAgICBDYWxsU3RydWN0dXJlLk9ORV9BUkcpKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KfQqAjgBOTjwBDQFHOzYhKB4sTiofKgEXFRgBOCghJCMBRDpRSjMbAQwaHwQBNDsMQTtOJEopTSM6TiUmKhkTEiI1NgYTBAEMJTsEAgEcTRI/OgIBLCQ9FwFAKwEMJAEaMUYEAU0SPztGBAIBJkcfBkhNMQZPFksiGyQ7LB1QQkYfNkseFwolShNLOiUIBhIEAgEhcGFja2FnZTpjb21waWxlci9zcmMvc3NhL3NzYS5kYXJ0OXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3VuaXZlcnNlL3dvcmxkX2J1aWxkZXIuZGFydKllLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgd29ybGRfYnVpbGRlcjsKCmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL25hbWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2lyL3N0YXRpY190eXBlLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydCcgc2hvdyBOYXRpdmVCYXNpY0RhdGE7CmltcG9ydCAnLi4vd29ybGQuZGFydCcgc2hvdyBXb3JsZCwgSkNsb3NlZFdvcmxkLCBPcGVuV29ybGQ7CmltcG9ydCAnc2VsZWN0b3IuZGFydCcgc2hvdyBTZWxlY3RvcjsKaW1wb3J0ICd1c2UuZGFydCcgc2hvdyBEeW5hbWljVXNlLCBTdGF0aWNVc2U7CgovLy8gVGhlIGNvbWJpbmVkIGNvbnN0cmFpbnRzIG9uIHJlY2VpdmVycyBhbGwgdGhlIGR5bmFtaWMgY2FsbCBzaXRlcyBvZiB0aGUgc2FtZQovLy8gc2VsZWN0b3IuCi8vLwovLy8gRm9yIGluc3RhbmNlIGZvciB0aGVzZSBjYWxscwovLy8KLy8vICAgICBjbGFzcyBBIHsKLy8vICAgICAgICBmb28oYSwgYikge30KLy8vICAgICB9Ci8vLyAgICAgY2xhc3MgQiB7Ci8vLyAgICAgICAgZm9vKGEsIGIpIHt9Ci8vLyAgICAgfQovLy8gICAgIGNsYXNzIEMgewovLy8gICAgICAgIGZvbyhhLCBiKSB7fQovLy8gICAgIH0KLy8vICAgICBuZXcgQSgpLmZvbyhhLCBiKTsKLy8vICAgICBuZXcgQigpLmZvbygwLCA0Mik7Ci8vLwovLy8gdGhlIHNlbGVjdG9yIGNvbnN0cmFpbnRzIGZvciBkeW5hbWljIGNhbGxzIHRvICdmb28nIHdpdGggdHdvIHBvc2l0aW9uYWwKLy8vIGFyZ3VtZW50cyBjb3VsZCBiZSAncmVjZWl2ZXIgb2YgZXhhY3QgaW5zdGFuY2UgYEFgIG9yIGBCYCcuCmFic3RyYWN0IGNsYXNzIFNlbGVjdG9yQ29uc3RyYWludHMgewogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbbmFtZV0gYXBwbGllcyB0byBbZWxlbWVudF0gdW5kZXIgdGhlc2UgY29uc3RyYWludHMKICAvLy8gZ2l2ZW4gdGhlIGNsb3NlZCBbd29ybGRdLgogIC8vLwogIC8vLyBDb25zaWRlciBmb3IgaW5zdGFuY2UgaW4gdGhpcyB3b3JsZDoKICAvLy8KICAvLy8gICAgIGNsYXNzIEEgewogIC8vLyAgICAgICAgZm9vKGEsIGIpIHt9CiAgLy8vICAgICB9CiAgLy8vICAgICBjbGFzcyBCIHsKICAvLy8gICAgICAgIGZvbyhhLCBiKSB7fQogIC8vLyAgICAgfQogIC8vLyAgICAgbmV3IEEoKS5mb28oYSwgYik7CiAgLy8vCiAgLy8vIElkZWFsbHkgdGhlIHNlbGVjdG9yIGNvbnN0cmFpbnRzIGZvciBjYWxscyBgZm9vYCB3aXRoIHR3byBwb3NpdGlvbmFsCiAgLy8vIGFyZ3VtZW50cyBhcHBseSB0byBgQS5mb29gIGJ1dCBgQi5mb29gLgogIGJvb2wgY2FuSGl0KE1lbWJlckVudGl0eSBlbGVtZW50LCBOYW1lIG5hbWUsIGNvdmFyaWFudCBXb3JsZCB3b3JsZCk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIHJlY2VpdmVycyBtYXRjaGluZyB0aGVzZSBjb25zdHJhaW50cwogIC8vLyBpbiB0aGUgY2xvc2VkIFt3b3JsZF0gaGF2ZSBubyBpbXBsZW1lbnRhdGlvbiBtYXRjaGluZyBbc2VsZWN0b3JdLgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2UgZm9yIHRoaXMgY29kZSBzbmlwcGV0CiAgLy8vCiAgLy8vICAgICBjbGFzcyBBIHt9CiAgLy8vICAgICBjbGFzcyBCIHsgZm9vKCkge30gfQogIC8vLyAgICAgbShiKSA9PiAoYiA/IG5ldyBBKCkgOiBuZXcgQigpKS5mb28oKTsKICAvLy8KICAvLy8gdGhlIHBvdGVudGlhbCByZWNlaXZlciBgbmV3IEEoKWAgaGFzIG5vIGltcGxlbWVudGF0aW9uIG9mIGBmb29gIGFuZCB0aHVzCiAgLy8vIG5lZWRzIHRvIGhhbmRsZSB0aGUgY2FsbCB0aHJvdWdoIGl0cyBgbm9TdWNoTWV0aG9kYCBoYW5kbGVyLgogIGJvb2wgbmVlZHNOb1N1Y2hNZXRob2RIYW5kbGluZyhTZWxlY3RvciBzZWxlY3RvciwgY292YXJpYW50IFdvcmxkIHdvcmxkKTsKfQoKLy8vIEEgbXV0YWJsZSBbU2VsZWN0b3JDb25zdHJhaW50c10gdXNlZCBpbiBbV29ybGRCdWlsZGVyXS4KYWJzdHJhY3QgY2xhc3MgVW5pdmVyc2VTZWxlY3RvckNvbnN0cmFpbnRzIGV4dGVuZHMgU2VsZWN0b3JDb25zdHJhaW50cyB7CiAgLy8vIEFkZHMgW2NvbnN0cmFpbnRdIHRvIHRoZXNlIHNlbGVjdG9yIGNvbnN0cmFpbnRzLiBSZXR1cm4gYHRydWVgIGlmIHRoZSBzZXQKICAvLy8gb2YgcG90ZW50aWFsIHJlY2VpdmVycyBleHBhbmRlZCBkdWUgdG8gdGhlIG5ldyBjb25zdHJhaW50LgogIGJvb2wgYWRkUmVjZWl2ZXJDb25zdHJhaW50KGNvdmFyaWFudCBPYmplY3QgY29uc3RyYWludCk7Cn0KCi8vLyBTdHJhdGVneSBmb3IgY29tcHV0aW5nIHRoZSBjb25zdHJhaW50cyBvbiBwb3RlbnRpYWwgcmVjZWl2ZXJzIG9mIGR5bmFtaWMKLy8vIGNhbGwgc2l0ZXMuCmFic3RyYWN0IGNsYXNzIFNlbGVjdG9yQ29uc3RyYWludHNTdHJhdGVneSB7CiAgLy8vIENyZWF0ZSBhIFtVbml2ZXJzZVNlbGVjdG9yQ29uc3RyYWludHNdIHRvIHJlcHJlc2VudCB0aGUgZ2xvYmFsIHJlY2VpdmVyCiAgLy8vIGNvbnN0cmFpbnRzIGZvciBkeW5hbWljIGNhbGwgc2l0ZXMgd2l0aCBbc2VsZWN0b3JdLgogIFVuaXZlcnNlU2VsZWN0b3JDb25zdHJhaW50cyBjcmVhdGVTZWxlY3RvckNvbnN0cmFpbnRzKAogICAgICBTZWxlY3RvciBzZWxlY3RvciwgT2JqZWN0IGluaXRpYWxDb25zdHJhaW50KTsKCiAgLy8vIFJldHVybnMgYHRydWVgICBpZiBbbWVtYmVyXSBpcyBhIHBvdGVudGlhbCB0YXJnZXQgb2YgW2R5bmFtaWNVc2VdLgogIGJvb2wgYXBwbGllZFVubmFtZWQoRHluYW1pY1VzZSBkeW5hbWljVXNlLCBNZW1iZXJFbnRpdHkgbWVtYmVyLCBXb3JsZCB3b3JsZCk7Cn0KCi8vLyBPcGVuIHdvcmxkIHN0cmF0ZWd5IHRoYXQgY29uc3RyYWlucyBpbnN0YW5jZSBtZW1iZXIgYWNjZXNzIHRvIHN1YnR5cGVzIG9mCi8vLyB0aGUgc3RhdGljIHR5cGUgb2YgdGhlIHJlY2VpdmVyLgovLy8KLy8vIFRoaXMgc3RyYXRlZ3kgaXMgdXNlZCBmb3IgRGFydCAyLgpjbGFzcyBTdHJvbmdNb2RlV29ybGRTdHJhdGVneSBpbXBsZW1lbnRzIFNlbGVjdG9yQ29uc3RyYWludHNTdHJhdGVneSB7CiAgY29uc3QgU3Ryb25nTW9kZVdvcmxkU3RyYXRlZ3koKTsKCiAgQG92ZXJyaWRlCiAgU3Ryb25nTW9kZVdvcmxkQ29uc3RyYWludHMgY3JlYXRlU2VsZWN0b3JDb25zdHJhaW50cygKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsIE9iamVjdCBpbml0aWFsQ29uc3RyYWludCkgewogICAgcmV0dXJuIG5ldyBTdHJvbmdNb2RlV29ybGRDb25zdHJhaW50cygpCiAgICAgIC4uYWRkUmVjZWl2ZXJDb25zdHJhaW50KGluaXRpYWxDb25zdHJhaW50KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgYXBwbGllZFVubmFtZWQoCiAgICAgIER5bmFtaWNVc2UgZHluYW1pY1VzZSwgTWVtYmVyRW50aXR5IG1lbWJlciwgY292YXJpYW50IE9wZW5Xb3JsZCB3b3JsZCkgewogICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBkeW5hbWljVXNlLnNlbGVjdG9yOwogICAgU3Ryb25nTW9kZUNvbnN0cmFpbnQgY29uc3RyYWludCA9IGR5bmFtaWNVc2UucmVjZWl2ZXJDb25zdHJhaW50OwogICAgcmV0dXJuIHNlbGVjdG9yLmFwcGxpZXNVbm5hbWVkKG1lbWJlcikgJiYKICAgICAgICAoY29uc3RyYWludCA9PSBudWxsIHx8CiAgICAgICAgICAgIGNvbnN0cmFpbnQuY2FuSGl0KG1lbWJlciwgc2VsZWN0b3IubWVtYmVyTmFtZSwgd29ybGQpKTsKICB9Cn0KCmNsYXNzIFN0cm9uZ01vZGVXb3JsZENvbnN0cmFpbnRzIGV4dGVuZHMgVW5pdmVyc2VTZWxlY3RvckNvbnN0cmFpbnRzIHsKICBib29sIGlzQWxsID0gZmFsc2U7CiAgU2V0PFN0cm9uZ01vZGVDb25zdHJhaW50PiBfY29uc3RyYWludHM7CgogIEBvdmVycmlkZQogIGJvb2wgY2FuSGl0KE1lbWJlckVudGl0eSBlbGVtZW50LCBOYW1lIG5hbWUsIFdvcmxkIHdvcmxkKSB7CiAgICBpZiAoaXNBbGwpIHJldHVybiB0cnVlOwogICAgaWYgKF9jb25zdHJhaW50cyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICBmb3IgKFN0cm9uZ01vZGVDb25zdHJhaW50IGNvbnN0cmFpbnQgaW4gX2NvbnN0cmFpbnRzKSB7CiAgICAgIGlmIChjb25zdHJhaW50LmNhbkhpdChlbGVtZW50LCBuYW1lLCB3b3JsZCkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBuZWVkc05vU3VjaE1ldGhvZEhhbmRsaW5nKFNlbGVjdG9yIHNlbGVjdG9yLCBXb3JsZCB3b3JsZCkgewogICAgaWYgKGlzQWxsKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKF9jb25zdHJhaW50cyAhPSBudWxsKSB7CiAgICAgIGZvciAoU3Ryb25nTW9kZUNvbnN0cmFpbnQgY29uc3RyYWludCBpbiBfY29uc3RyYWludHMpIHsKICAgICAgICBpZiAoY29uc3RyYWludC5uZWVkc05vU3VjaE1ldGhvZEhhbmRsaW5nKHNlbGVjdG9yLCB3b3JsZCkpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBhZGRSZWNlaXZlckNvbnN0cmFpbnQoU3Ryb25nTW9kZUNvbnN0cmFpbnQgY29uc3RyYWludCkgewogICAgaWYgKGlzQWxsKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoY29uc3RyYWludD8uY2xzID09IG51bGwpIHsKICAgICAgaXNBbGwgPSB0cnVlOwogICAgICBfY29uc3RyYWludHMgPSBudWxsOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9jb25zdHJhaW50cyA/Pz0gbmV3IFNldDxTdHJvbmdNb2RlQ29uc3RyYWludD4oKTsKICAgIHJldHVybiBfY29uc3RyYWludHMuYWRkKGNvbnN0cmFpbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgaWYgKGlzQWxsKSB7CiAgICAgIHJldHVybiAnPGFsbD4nOwogICAgfSBlbHNlIGlmIChfY29uc3RyYWludHMgIT0gbnVsbCkgewogICAgICByZXR1cm4gJzwke19jb25zdHJhaW50cy5tYXAoKGMpID0+IGMuY2xzKS5qb2luKCcsJyl9Pic7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJzxub25lPic7CiAgICB9CiAgfQp9CgpjbGFzcyBTdHJvbmdNb2RlQ29uc3RyYWludCB7CiAgZmluYWwgQ2xhc3NFbnRpdHkgY2xzOwogIGZpbmFsIENsYXNzUmVsYXRpb24gcmVsYXRpb247CgogIGZhY3RvcnkgU3Ryb25nTW9kZUNvbnN0cmFpbnQoQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIE5hdGl2ZUJhc2ljRGF0YSBuYXRpdmVCYXNpY0RhdGEsIENsYXNzRW50aXR5IGNscywKICAgICAgW0NsYXNzUmVsYXRpb24gcmVsYXRpb24gPSBDbGFzc1JlbGF0aW9uLnN1YnR5cGVdKSB7CiAgICBpZiAobmF0aXZlQmFzaWNEYXRhLmlzSnNJbnRlcm9wQ2xhc3MoY2xzKSkgewogICAgICAvLyBXZSBjYW4gbm90IHRlbGwganMtaW50ZXJvcCBjbGFzc2VzIGFwYXJ0LCBzbyB3ZSBqdXN0IGFzc3VtZSB0aGUKICAgICAgLy8gcmVjZWl2ZXIgY291bGQgYmUgYW55IGpzLWludGVyb3AgY2xhc3MuCiAgICAgIGNscyA9IGNvbW1vbkVsZW1lbnRzLmpzSmF2YVNjcmlwdE9iamVjdENsYXNzOwogICAgICByZWxhdGlvbiA9IENsYXNzUmVsYXRpb24uc3VidHlwZTsKICAgIH0KICAgIHJldHVybiBuZXcgU3Ryb25nTW9kZUNvbnN0cmFpbnQuaW50ZXJuYWwoY2xzLCByZWxhdGlvbik7CiAgfQoKICBjb25zdCBTdHJvbmdNb2RlQ29uc3RyYWludC5pbnRlcm5hbCh0aGlzLmNscywgdGhpcy5yZWxhdGlvbik7CgogIGJvb2wgbmVlZHNOb1N1Y2hNZXRob2RIYW5kbGluZyhTZWxlY3RvciBzZWxlY3RvciwgV29ybGQgd29ybGQpID0+IHRydWU7CgogIGJvb2wgY2FuSGl0KE1lbWJlckVudGl0eSBlbGVtZW50LCBOYW1lIG5hbWUsIE9wZW5Xb3JsZCB3b3JsZCkgewogICAgcmV0dXJuIHdvcmxkLmlzSW5oZXJpdGVkSW4oZWxlbWVudCwgY2xzLCByZWxhdGlvbik7CiAgfQoKICBib29sIGdldCBpc0V4YWN0ID0+IHJlbGF0aW9uID09IENsYXNzUmVsYXRpb24uZXhhY3Q7CgogIGJvb2wgZ2V0IGlzVGhpcyA9PiByZWxhdGlvbiA9PSBDbGFzc1JlbGF0aW9uLnRoaXNFeHByZXNzaW9uOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIG90aGVyIGlzIFN0cm9uZ01vZGVDb25zdHJhaW50ICYmCiAgICAgICAgY2xzID09IG90aGVyLmNscyAmJgogICAgICAgIHJlbGF0aW9uID09IG90aGVyLnJlbGF0aW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBjbHMuaGFzaENvZGUgKiAxMzsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1N0cm9uZ01vZGVDb25zdHJhaW50KCRjbHMsJHJlbGF0aW9uKSc7Cn0KCi8vLyBUaGUgW1dvcmxkQnVpbGRlcl0gaXMgYW4gYXV4aWxpYXJ5IGNsYXNzIHVzZWQgaW4gdGhlIHByb2Nlc3Mgb2YgY29tcHV0aW5nCi8vLyB0aGUgW0pDbG9zZWRXb3JsZF0uCi8vIFRPRE8oam9obm5pd2ludGhlcik6IE1vdmUgY29tbW9uIGltcGxlbWVudGF0aW9uIHRvIGEgW1dvcmxkQnVpbGRlckJhc2VdIHdoZW4KLy8gdW5pdmVyc2VzIGFuZCB3b3JsZHMgaGF2ZSBiZWVuIHVuaWZpZWQuCmFic3RyYWN0IGNsYXNzIFdvcmxkQnVpbGRlciB7CiAgLy8vIEFsbCBkaXJlY3RseSBpbnN0YW50aWF0ZWQgY2xhc3NlcywgdGhhdCBpcywgY2xhc3NlcyB3aXRoIGEgZ2VuZXJhdGl2ZQogIC8vLyBjb25zdHJ1Y3RvciB0aGF0IGhhcyBiZWVuIGNhbGxlZCBkaXJlY3RseSBhbmQgbm90IG9ubHkgdGhyb3VnaCBhCiAgLy8vIHN1cGVyLWNhbGwuCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogSW1wcm92ZSBzZW1hbnRpYyBwcmVjaXNpb24uCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGdldCBkaXJlY3RseUluc3RhbnRpYXRlZENsYXNzZXM7CgogIC8vLyBBbGwgdHlwZXMgdGhhdCBhcmUgY2hlY2tlZCBlaXRoZXIgdGhyb3VnaCBpcywgYXMgb3IgY2hlY2tlZCBtb2RlIGNoZWNrcy4KICBJdGVyYWJsZTxEYXJ0VHlwZT4gZ2V0IGlzQ2hlY2tzOwoKICAvLy8gQWxsIGRpcmVjdGx5IGluc3RhbnRpYXRlZCB0eXBlcywgdGhhdCBpcywgdGhlIHR5cGVzIG9mCiAgLy8vIFtkaXJlY3RseUluc3RhbnRpYXRlZENsYXNzZXNdLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEltcHJvdmUgc2VtYW50aWMgcHJlY2lzaW9uLgogIEl0ZXJhYmxlPEludGVyZmFjZVR5cGU+IGdldCBpbnN0YW50aWF0ZWRUeXBlczsKCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ2xlYW4gdXAgdGhlc2UgZ2V0dGVycy4KICAvLy8gTWV0aG9kcyBpbiBpbnN0YW50aWF0ZWQgY2xhc3NlcyB0aGF0IGFyZSBwb3RlbnRpYWxseSBjbG9zdXJpemVkLgogIEl0ZXJhYmxlPEZ1bmN0aW9uRW50aXR5PiBnZXQgY2xvc3VyaXplZE1lbWJlcnM7CgogIC8vLyBTdGF0aWMgb3IgdG9wIGxldmVsIG1ldGhvZHMgdGhhdCBhcmUgY2xvc3VyaXplZC4KICBJdGVyYWJsZTxGdW5jdGlvbkVudGl0eT4gZ2V0IGNsb3N1cml6ZWRTdGF0aWNzOwoKICAvLy8gTGl2ZSBnZW5lcmljIGluc3RhbmNlIG1ldGhvZHMuCiAgSXRlcmFibGU8RnVuY3Rpb25FbnRpdHk+IGdldCBnZW5lcmljSW5zdGFuY2VNZXRob2RzOwoKICAvLy8gTGl2ZSBnZW5lcmljIGxvY2FsIGZ1bmN0aW9ucy4KICBJdGVyYWJsZTxMb2NhbD4gZ2V0IGdlbmVyaWNMb2NhbEZ1bmN0aW9uczsKCiAgLy8vIExpdmUgZ2VuZXJpYyBtZXRob2RzLgogIEl0ZXJhYmxlPEZ1bmN0aW9uRW50aXR5PiBnZXQgZ2VuZXJpY01ldGhvZHM7CgogIC8vLyBMaXZlIHVzZXItZGVmaW5lZCAnbm9TdWNoTWV0aG9kJyBpbXBsZW1lbnRhdGlvbnMuCiAgSXRlcmFibGU8RnVuY3Rpb25FbnRpdHk+IGdldCB1c2VyTm9TdWNoTWV0aG9kczsKCiAgLy8vIFR5cGUgdmFyaWFibGVzIHVzZWQgYXMgdHlwZSBsaXRlcmFscy4KICBJdGVyYWJsZTxUeXBlVmFyaWFibGVUeXBlPiBnZXQgdHlwZVZhcmlhYmxlVHlwZUxpdGVyYWxzOwoKICAvLy8gQ2FsbCBbZl0gZm9yIGVhY2ggZ2VuZXJpYyBbZnVuY3Rpb25dIHdpdGggdGhlIHR5cGUgYXJndW1lbnRzIHBhc3NlZAogIC8vLyB0aHJvdWdoIHN0YXRpYyBjYWxscyB0byBbZnVuY3Rpb25dLgogIHZvaWQgZm9yRWFjaFN0YXRpY1R5cGVBcmd1bWVudCgKICAgICAgdm9pZCBmKEVudGl0eSBmdW5jdGlvbiwgU2V0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSk7CgogIC8vLyBDYWxsIFtmXSBmb3IgZWFjaCBnZW5lcmljIFtzZWxlY3Rvcl0gd2l0aCB0aGUgdHlwZSBhcmd1bWVudHMgcGFzc2VkCiAgLy8vIHRocm91Z2ggZHluYW1pYyBjYWxscyB0byBbc2VsZWN0b3JdLgogIHZvaWQgZm9yRWFjaER5bmFtaWNUeXBlQXJndW1lbnQoCiAgICAgIHZvaWQgZihTZWxlY3RvciBzZWxlY3RvciwgU2V0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSk7Cn0KCmFic3RyYWN0IGNsYXNzIFdvcmxkQnVpbGRlckJhc2UgewogIGZpbmFsIE1hcDxFbnRpdHksIFNldDxEYXJ0VHlwZT4+IF9zdGF0aWNUeXBlQXJndW1lbnREZXBlbmRlbmNpZXMgPQogICAgICA8RW50aXR5LCBTZXQ8RGFydFR5cGU+Pnt9OwoKICBmaW5hbCBNYXA8U2VsZWN0b3IsIFNldDxEYXJ0VHlwZT4+IF9keW5hbWljVHlwZUFyZ3VtZW50RGVwZW5kZW5jaWVzID0KICAgICAgPFNlbGVjdG9yLCBTZXQ8RGFydFR5cGU+Pnt9OwoKICAvLy8gU2V0IG9mIG1ldGhvZHMgaW4gaW5zdGFudGlhdGVkIGNsYXNzZXMgdGhhdCBhcmUgcG90ZW50aWFsbHkgY2xvc3VyaXplZC4KICBmaW5hbCBTZXQ8RnVuY3Rpb25FbnRpdHk+IGNsb3N1cml6ZWRNZW1iZXJzID0gbmV3IFNldDxGdW5jdGlvbkVudGl0eT4oKTsKCiAgLy8vIFNldCBvZiBzdGF0aWMgb3IgdG9wIGxldmVsIG1ldGhvZHMgdGhhdCBhcmUgY2xvc3VyaXplZC4KICBmaW5hbCBTZXQ8RnVuY3Rpb25FbnRpdHk+IGNsb3N1cml6ZWRTdGF0aWNzID0gbmV3IFNldDxGdW5jdGlvbkVudGl0eT4oKTsKCiAgZmluYWwgU2V0PFR5cGVWYXJpYWJsZVR5cGU+IHR5cGVWYXJpYWJsZVR5cGVMaXRlcmFscyA9CiAgICAgIG5ldyBTZXQ8VHlwZVZhcmlhYmxlVHlwZT4oKTsKCiAgdm9pZCBfcmVnaXN0ZXJTdGF0aWNUeXBlQXJndW1lbnREZXBlbmRlbmN5KAogICAgICBFbnRpdHkgZWxlbWVudCwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykgewogICAgX3N0YXRpY1R5cGVBcmd1bWVudERlcGVuZGVuY2llcy5wdXRJZkFic2VudCgKICAgICAgICBlbGVtZW50LCAoKSA9PiBuZXcgU2V0PERhcnRUeXBlPigpKQogICAgICAuLmFkZEFsbCh0eXBlQXJndW1lbnRzKTsKICB9CgogIHZvaWQgX3JlZ2lzdGVyRHluYW1pY1R5cGVBcmd1bWVudERlcGVuZGVuY3koCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICBfZHluYW1pY1R5cGVBcmd1bWVudERlcGVuZGVuY2llcy5wdXRJZkFic2VudCgKICAgICAgICBzZWxlY3RvciwgKCkgPT4gbmV3IFNldDxEYXJ0VHlwZT4oKSkKICAgICAgLi5hZGRBbGwodHlwZUFyZ3VtZW50cyk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyU3RhdGljSW52b2NhdGlvbihTdGF0aWNVc2Ugc3RhdGljVXNlKSB7CiAgICBpZiAoc3RhdGljVXNlLnR5cGVBcmd1bWVudHMgPT0gbnVsbCB8fCBzdGF0aWNVc2UudHlwZUFyZ3VtZW50cy5pc0VtcHR5KSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIF9yZWdpc3RlclN0YXRpY1R5cGVBcmd1bWVudERlcGVuZGVuY3koCiAgICAgICAgc3RhdGljVXNlLmVsZW1lbnQsIHN0YXRpY1VzZS50eXBlQXJndW1lbnRzKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJEeW5hbWljSW52b2NhdGlvbigKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIGlmICh0eXBlQXJndW1lbnRzLmlzRW1wdHkpIHJldHVybjsKICAgIF9yZWdpc3RlckR5bmFtaWNUeXBlQXJndW1lbnREZXBlbmRlbmN5KHNlbGVjdG9yLCB0eXBlQXJndW1lbnRzKTsKICB9CgogIHZvaWQgZm9yRWFjaFN0YXRpY1R5cGVBcmd1bWVudCgKICAgICAgdm9pZCBmKEVudGl0eSBmdW5jdGlvbiwgU2V0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSkgewogICAgX3N0YXRpY1R5cGVBcmd1bWVudERlcGVuZGVuY2llcy5mb3JFYWNoKGYpOwogIH0KCiAgdm9pZCBmb3JFYWNoRHluYW1pY1R5cGVBcmd1bWVudCgKICAgICAgdm9pZCBmKFNlbGVjdG9yIHNlbGVjdG9yLCBTZXQ8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpKSB7CiAgICBfZHluYW1pY1R5cGVBcmd1bWVudERlcGVuZGVuY2llcy5mb3JFYWNoKGYpOwogIH0KCiAgdm9pZCByZWdpc3RlclR5cGVWYXJpYWJsZVR5cGVMaXRlcmFsKFR5cGVWYXJpYWJsZVR5cGUgdHlwZVZhcmlhYmxlKSB7CiAgICB0eXBlVmFyaWFibGVUeXBlTGl0ZXJhbHMuYWRkKHR5cGVWYXJpYWJsZSk7CiAgfQp9CoFBAE5OPAEXASIkISEhPjwmLgFRDgQhBBIYChIYChIYChscBExAJUwgBisGFBoMFBoMHQZLLkcBUUgGKQYVHzEGT0NMAgE8SVBBOwIBTRAtTjo5NAFJUAIBTiUEJkcjAQw4NSwyBAEMF08tRS4fRAQCAUcWKgEMPhwsPDUVCAYSBAEMQxETBiA+RRcKCAYSBAEMQB0jFBsTBjYpBAEMFhEWJz4NFwYEAgEdGSABPjg6MUkxNCgGPQQBQAFKAUI4BAE3AT8BDCMtLBwkBAEMKQEMPwIBThhQKx5MRxI2OQFPIwE9JTYxATJHMgE3MgElNwEkLQEcLwE4MgEsOwFKKiI9AUorIz8CASJFIQFIIwFOSwE+SwE5IwEuNjEsHwQBLzkyLR8EATdODgYrNQQBIjknRQQBIj4wBAEjQDEEAUgwBAIBMHBhY2thZ2U6Y29tcGlsZXIvc3JjL3VuaXZlcnNlL3dvcmxkX2J1aWxkZXIuZGFydDFzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9lbGVtZW50cy9uYW1lcy5kYXJ0j5wvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmVsZW1lbnRzLm5hbWVzOwoKaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL2RhcnQyanMuZGFydCcgc2hvdyAkXzsKCmltcG9ydCAnZW50aXRpZXMuZGFydCcgc2hvdyBMaWJyYXJ5RW50aXR5OwoKLy8vIEEgW05hbWVdIHJlcHJlc2VudHMgdGhlIGFic3RyYWN0aW9uIG9mIGEgRGFydCBpZGVudGlmaWVyIHdoaWNoIHRha2VzIHByaXZhY3kKLy8vIGFuZCBzZXR0ZXIgaW50byBhY2NvdW50LgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUcnkgdG8gc2hhcmUgbG9naWMgd2l0aCBbU2VsZWN0b3JdLgphYnN0cmFjdCBjbGFzcyBOYW1lIHsKICAvLy8gQ3JlYXRlIGEgW05hbWVdIGZvciBhbiBpZGVudGlmaWVyIFt0ZXh0XS4gSWYgW3RleHRdIGJlZ2lucyB3aXRoICdfJyBhCiAgLy8vIHByaXZhdGUgbmFtZSB3aXRoIHJlc3BlY3QgdG8gW2xpYnJhcnldIGlzIGNyZWF0ZWQuIElmIFtpc1NldHRlcl0gaXMgYHRydWVgCiAgLy8vIHRoZSBjcmVhdGVkIG5hbWUgcmVwcmVzZW50cyB0aGUgc2V0dGVyIG5hbWUgJ3RleHQ9Jy4KICBmYWN0b3J5IE5hbWUoU3RyaW5nIHRleHQsIExpYnJhcnlFbnRpdHkgbGlicmFyeSwge2Jvb2wgaXNTZXR0ZXI6IGZhbHNlfSkgewogICAgaWYgKGlzUHJpdmF0ZU5hbWUodGV4dCkpIHsKICAgICAgcmV0dXJuIG5ldyBQcml2YXRlTmFtZSh0ZXh0LCBsaWJyYXJ5LCBpc1NldHRlcjogaXNTZXR0ZXIpOwogICAgfQogICAgcmV0dXJuIG5ldyBQdWJsaWNOYW1lKHRleHQsIGlzU2V0dGVyOiBpc1NldHRlcik7CiAgfQoKICAvLy8gVGhlIHRleHQgb2YgdGhlIG5hbWUgd2l0aG91dCBwcmVmaXhlZCBsaWJyYXJ5IG5hbWUgb3Igc3VmZml4ZWQgJz0nIGlmCiAgLy8vIGFwcGxpY2FibGUuCiAgU3RyaW5nIGdldCB0ZXh0OwoKICAvLy8gSXMgYHRydWVgIGlmIHRoaXMgbmFtZSByZXByZXNlbnRzIHRoZSBuYW1lIG9mIGEgc2V0dGVyLgogIGJvb2wgZ2V0IGlzU2V0dGVyOwoKICAvLy8gUmV0dXJucyB0aGUgZ2V0dGVyIG5hbWUgY29ycmVzcG9uZGluZyB0byB0aGlzIG5hbWUuIElmIHRoaXMgbmFtZSBpcyBhCiAgLy8vIHNldHRlciBuYW1lICd2PScgdGhlbiB0aGUgbmFtZSAndicgaXMgcmV0dXJuZWQsIG90aGVyd2lzZSB0aGUgbmFtZSBpdHNlbGYKICAvLy8gaXMgcmV0dXJuZWQuCiAgTmFtZSBnZXQgZ2V0dGVyOwoKICAvLy8gUmV0dXJucyB0aGUgc2VldGVyIG5hbWUgY29ycmVzcG9uZGluZyB0byB0aGlzIG5hbWUuIElmIHRoaXMgbmFtZSBpcyBhCiAgLy8vIGdldHRlciBuYW1lICd2JyB0aGVuIHRoZSBuYW1lICd2PScgaXMgcmV0dXJuZWQsIG90aGVyd3NpZSB0aGUgbmFtZSBpdHNlbGYKICAvLy8gaXMgcmV0dXJuZWQuCiAgTmFtZSBnZXQgc2V0dGVyOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50aXR5IG9mIHRoaXMgbmFtZSBpcyBhY2Nlc3NpYmxlIGZyb20gbGlicmFyeQogIC8vLyBbZWxlbWVudF0uCiAgYm9vbCBpc0FjY2Vzc2libGVGcm9tKExpYnJhcnlFbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIG5hbWUgaXMgcHJpdmF0ZS4KICBib29sIGdldCBpc1ByaXZhdGU7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIG5hbWUgaXMgdGhlIHNhbWUgYXMgW290aGVyXSBub3QgdGFraW5nIHRoZSBsaWJyYXJ5CiAgLy8vIHByaXZhY3kgaW50byBhY2NvdW50LgogIGJvb2wgaXNTaW1pbGFyVG8oTmFtZSBvdGhlcik7CiAgaW50IGdldCBzaW1pbGFySGFzaENvZGU7CgogIExpYnJhcnlFbnRpdHkgZ2V0IGxpYnJhcnk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCB3aGVuIFtzXSBpcyBwcml2YXRlIGlmIHVzZWQgYXMgYW4gaWRlbnRpZmllci4KICBzdGF0aWMgYm9vbCBpc1ByaXZhdGVOYW1lKFN0cmluZyBzKSA9PiAhcy5pc0VtcHR5ICYmIHMuY29kZVVuaXRBdCgwKSA9PSAkXzsKCiAgLy8vIFJldHVybnMgYHRydWVgIHdoZW4gW3NdIGlzIHB1YmxpYyBpZiB1c2VkIGFzIGFuIGlkZW50aWZpZXIuCiAgc3RhdGljIGJvb2wgaXNQdWJsaWNOYW1lKFN0cmluZyBzKSA9PiAhaXNQcml2YXRlTmFtZShzKTsKfQoKY2xhc3MgUHVibGljTmFtZSBpbXBsZW1lbnRzIE5hbWUgewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyB0ZXh0OwogIEBvdmVycmlkZQogIGZpbmFsIGJvb2wgaXNTZXR0ZXI7CgogIGNvbnN0IFB1YmxpY05hbWUodGhpcy50ZXh0LCB7dGhpcy5pc1NldHRlcjogZmFsc2V9KTsKCiAgQG92ZXJyaWRlCiAgTmFtZSBnZXQgZ2V0dGVyID0+IGlzU2V0dGVyID8gbmV3IFB1YmxpY05hbWUodGV4dCkgOiB0aGlzOwoKICBAb3ZlcnJpZGUKICBOYW1lIGdldCBzZXR0ZXIgPT4gaXNTZXR0ZXIgPyB0aGlzIDogbmV3IFB1YmxpY05hbWUodGV4dCwgaXNTZXR0ZXI6IHRydWUpOwoKICBAb3ZlcnJpZGUKICBib29sIGlzQWNjZXNzaWJsZUZyb20oTGlicmFyeUVudGl0eSBlbGVtZW50KSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1ByaXZhdGUgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gc2ltaWxhckhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMhIFB1YmxpY05hbWUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBpc1NpbWlsYXJUbyhvdGhlcik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzU2ltaWxhclRvKE5hbWUgb3RoZXIpID0+CiAgICAgIHRleHQgPT0gb3RoZXIudGV4dCAmJiBpc1NldHRlciA9PSBvdGhlci5pc1NldHRlcjsKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IHNpbWlsYXJIYXNoQ29kZSA9PiB0ZXh0Lmhhc2hDb2RlICsgMTEgKiBpc1NldHRlci5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgTGlicmFyeUVudGl0eSBnZXQgbGlicmFyeSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBpc1NldHRlciA/ICckdGV4dD0nIDogdGV4dDsKfQoKY2xhc3MgUHJpdmF0ZU5hbWUgZXh0ZW5kcyBQdWJsaWNOYW1lIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBMaWJyYXJ5RW50aXR5IGxpYnJhcnk7CgogIFByaXZhdGVOYW1lKFN0cmluZyB0ZXh0LCB0aGlzLmxpYnJhcnksIHtib29sIGlzU2V0dGVyOiBmYWxzZX0pCiAgICAgIDogc3VwZXIodGV4dCwgaXNTZXR0ZXI6IGlzU2V0dGVyKTsKCiAgQG92ZXJyaWRlCiAgTmFtZSBnZXQgZ2V0dGVyID0+IGlzU2V0dGVyID8gbmV3IFByaXZhdGVOYW1lKHRleHQsIGxpYnJhcnkpIDogdGhpczsKCiAgQG92ZXJyaWRlCiAgTmFtZSBnZXQgc2V0dGVyIHsKICAgIHJldHVybiBpc1NldHRlciA/IHRoaXMgOiBuZXcgUHJpdmF0ZU5hbWUodGV4dCwgbGlicmFyeSwgaXNTZXR0ZXI6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0FjY2Vzc2libGVGcm9tKExpYnJhcnlFbnRpdHkgZWxlbWVudCkgPT4gbGlicmFyeSA9PSBlbGVtZW50OwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1ByaXZhdGUgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBzdXBlci5oYXNoQ29kZSArIDEzICogbGlicmFyeS5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKG90aGVyIGlzISBQcml2YXRlTmFtZSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHN1cGVyID09IChvdGhlcikgJiYgbGlicmFyeSA9PSBvdGhlci5saWJyYXJ5OwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyR7bGlicmFyeS5uYW1lfSMke3N1cGVyLnRvU3RyaW5nKCl9JzsKfQqAiwBOTjwBIAFCASsBUR08FkxRO00fQQY1BAFMEhMBPhUBTFATEwFMUBMTAUoRMAEuFgFQHCAbAR0BQ04BQjsCASMMFQwXATcBDD0BDE0BDDgBDB8BDCcBDBwsHwQBDCI4DEUBDCUBDDMCAScMHwFBKQEMRwEMFE0EAQxGAQweAQw+AQwcLTkEAQw+AgEocGFja2FnZTpjb21waWxlci9zcmMvZWxlbWVudHMvbmFtZXMuZGFydDpzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy91bml2ZXJzZS9jYWxsX3N0cnVjdHVyZS5kYXJ0nlkvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmNhbGxfc3RydWN0dXJlOwoKaW1wb3J0ICcuLi9jb21tb24vbmFtZXMuZGFydCcgc2hvdyBOYW1lczsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JyBzaG93IFBhcmFtZXRlclN0cnVjdHVyZTsKaW1wb3J0ICcuLi9zZXJpYWxpemF0aW9uL3NlcmlhbGl6YXRpb24uZGFydCc7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnOwppbXBvcnQgJ3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3I7CgovLy8gVGhlIHN0cnVjdHVyZSBvZiB0aGUgYXJndW1lbnRzIGF0IGEgY2FsbC1zaXRlLgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTaG91bGQgdGhlc2UgYmUgY2FjaGVkPwovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTaG91bGQgaXNHZXR0ZXIvaXNTZXR0ZXIgYmUgcGFydCBvZiB0aGUgY2FsbCBzdHJ1Y3R1cmUKLy8gaW5zdGVhZCBvZiB0aGUgc2VsZWN0b3I/CmNsYXNzIENhbGxTdHJ1Y3R1cmUgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbQ2FsbFN0cnVjdHVyZV0gb2JqZWN0cyBpbiBhIGRlYnVnZ2luZwogIC8vLyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdjYWxsLXN0cnVjdHVyZSc7CgogIHN0YXRpYyBjb25zdCBDYWxsU3RydWN0dXJlIE5PX0FSR1MgPSBjb25zdCBDYWxsU3RydWN0dXJlLnVubmFtZWQoMCk7CiAgc3RhdGljIGNvbnN0IENhbGxTdHJ1Y3R1cmUgT05FX0FSRyA9IGNvbnN0IENhbGxTdHJ1Y3R1cmUudW5uYW1lZCgxKTsKICBzdGF0aWMgY29uc3QgQ2FsbFN0cnVjdHVyZSBUV09fQVJHUyA9IGNvbnN0IENhbGxTdHJ1Y3R1cmUudW5uYW1lZCgyKTsKICBzdGF0aWMgY29uc3QgQ2FsbFN0cnVjdHVyZSBUSFJFRV9BUkdTID0gY29uc3QgQ2FsbFN0cnVjdHVyZS51bm5hbWVkKDMpOwogIHN0YXRpYyBjb25zdCBDYWxsU3RydWN0dXJlIEZPVVJfQVJHUyA9IGNvbnN0IENhbGxTdHJ1Y3R1cmUudW5uYW1lZCg0KTsKCiAgLy8vIFRoZSBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMgb2YgdGhlIGNhbGwuCiAgZmluYWwgaW50IHR5cGVBcmd1bWVudENvdW50OwoKICAvLy8gVGhlIG51bWJlcnMgb2YgYXJndW1lbnRzIG9mIHRoZSBjYWxsLiBJbmNsdWRlcyBuYW1lZCBhcmd1bWVudHMuCiAgZmluYWwgaW50IGFyZ3VtZW50Q291bnQ7CgogIC8vLyBUaGUgbnVtYmVyIG9mIG5hbWVkIGFyZ3VtZW50cyBvZiB0aGUgY2FsbC4KICBpbnQgZ2V0IG5hbWVkQXJndW1lbnRDb3VudCA9PiAwOwoKICAvLy8gVGhlIG51bWJlciBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50IG9mIHRoZSBjYWxsLgogIGludCBnZXQgcG9zaXRpb25hbEFyZ3VtZW50Q291bnQgPT4gYXJndW1lbnRDb3VudDsKCiAgY29uc3QgQ2FsbFN0cnVjdHVyZS51bm5hbWVkKHRoaXMuYXJndW1lbnRDb3VudCwgW3RoaXMudHlwZUFyZ3VtZW50Q291bnQgPSAwXSk7CgogIGZhY3RvcnkgQ2FsbFN0cnVjdHVyZShpbnQgYXJndW1lbnRDb3VudCwKICAgICAgW0xpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cywgaW50IHR5cGVBcmd1bWVudENvdW50ID0gMF0pIHsKICAgIGlmIChuYW1lZEFyZ3VtZW50cyA9PSBudWxsIHx8IG5hbWVkQXJndW1lbnRzLmlzRW1wdHkpIHsKICAgICAgcmV0dXJuIG5ldyBDYWxsU3RydWN0dXJlLnVubmFtZWQoYXJndW1lbnRDb3VudCwgdHlwZUFyZ3VtZW50Q291bnQpOwogICAgfQogICAgcmV0dXJuIG5ldyBOYW1lZENhbGxTdHJ1Y3R1cmUoCiAgICAgICAgYXJndW1lbnRDb3VudCwgbmFtZWRBcmd1bWVudHMsIHR5cGVBcmd1bWVudENvdW50KTsKICB9CgogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbQ2FsbFN0cnVjdHVyZV0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBDYWxsU3RydWN0dXJlLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpbnQgYXJndW1lbnRDb3VudCA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHMgPSBzb3VyY2UucmVhZFN0cmluZ3MoKTsKICAgIGludCB0eXBlQXJndW1lbnRDb3VudCA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IENhbGxTdHJ1Y3R1cmUoYXJndW1lbnRDb3VudCwgbmFtZWRBcmd1bWVudHMsIHR5cGVBcmd1bWVudENvdW50KTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0NhbGxTdHJ1Y3R1cmVdIHRvIFtzaW5rXS4KICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlSW50KGFyZ3VtZW50Q291bnQpOwogICAgc2luay53cml0ZVN0cmluZ3MobmFtZWRBcmd1bWVudHMpOwogICAgc2luay53cml0ZUludCh0eXBlQXJndW1lbnRDb3VudCk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQ2FsbFN0cnVjdHVyZSB3aXRoVHlwZUFyZ3VtZW50Q291bnQoaW50IHR5cGVBcmd1bWVudENvdW50KSA9PgogICAgICBuZXcgQ2FsbFN0cnVjdHVyZShhcmd1bWVudENvdW50LCBuYW1lZEFyZ3VtZW50cywgdHlwZUFyZ3VtZW50Q291bnQpOwoKICAvLy8gYHRydWVgIGlmIHRoaXMgY2FsbCBoYXMgbmFtZWQgYXJndW1lbnRzLgogIGJvb2wgZ2V0IGlzTmFtZWQgPT4gZmFsc2U7CgogIC8vLyBgdHJ1ZWAgaWYgdGhpcyBjYWxsIGhhcyBubyBuYW1lZCBhcmd1bWVudHMuCiAgYm9vbCBnZXQgaXNVbm5hbWVkID0+IHRydWU7CgogIC8vLyBUaGUgbmFtZXMgb2YgdGhlIG5hbWVkIGFyZ3VtZW50cyBpbiBjYWxsLXNpdGUgb3JkZXIuCiAgTGlzdDxTdHJpbmc+IGdldCBuYW1lZEFyZ3VtZW50cyA9PiBjb25zdCA8U3RyaW5nPltdOwoKICAvLy8gVGhlIG5hbWVzIG9mIHRoZSBuYW1lZCBhcmd1bWVudHMgaW4gY2Fub25pY2FsaXplZCBvcmRlci4KICBMaXN0PFN0cmluZz4gZ2V0T3JkZXJlZE5hbWVkQXJndW1lbnRzKCkgPT4gY29uc3QgPFN0cmluZz5bXTsKCiAgQ2FsbFN0cnVjdHVyZSBnZXQgbm9uR2VuZXJpYyA9PiB0eXBlQXJndW1lbnRDb3VudCA9PSAwCiAgICAgID8gdGhpcwogICAgICA6IG5ldyBDYWxsU3RydWN0dXJlKGFyZ3VtZW50Q291bnQsIG5hbWVkQXJndW1lbnRzKTsKCiAgLy8vIFNob3J0IHRleHR1YWwgcmVwcmVzZW50YXRpb24gdXNlIGZvciB0ZXN0aW5nLgogIFN0cmluZyBnZXQgc2hvcnRUZXh0IHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCcoJyk7CiAgICBzYi53cml0ZShwb3NpdGlvbmFsQXJndW1lbnRDb3VudCk7CiAgICBpZiAobmFtZWRBcmd1bWVudENvdW50ID4gMCkgewogICAgICBzYi53cml0ZSgnLCcpOwogICAgICBzYi53cml0ZShnZXRPcmRlcmVkTmFtZWRBcmd1bWVudHMoKS5qb2luKCcsJykpOwogICAgfQogICAgc2Iud3JpdGUoJyknKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgLy8vIEEgZGVzY3JpcHRpb24gb2YgdGhlIGFyZ3VtZW50IHN0cnVjdHVyZS4KICBTdHJpbmcgc3RydWN0dXJlVG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnYXJpdHk9JGFyZ3VtZW50Q291bnQnKTsKICAgIGlmICh0eXBlQXJndW1lbnRDb3VudCAhPSAwKSB7CiAgICAgIHNiLndyaXRlKCcsIHR5cGVzPSR0eXBlQXJndW1lbnRDb3VudCcpOwogICAgfQogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnQ2FsbFN0cnVjdHVyZSgke3N0cnVjdHVyZVRvU3RyaW5nKCl9KSc7CgogIFNlbGVjdG9yIGdldCBjYWxsU2VsZWN0b3IgPT4gbmV3IFNlbGVjdG9yLmNhbGwoTmFtZXMuY2FsbCwgdGhpcyk7CgogIGJvb2wgbWF0Y2goQ2FsbFN0cnVjdHVyZSBvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIHRoaXMuYXJndW1lbnRDb3VudCA9PSBvdGhlci5hcmd1bWVudENvdW50ICYmCiAgICAgICAgdGhpcy5uYW1lZEFyZ3VtZW50Q291bnQgPT0gb3RoZXIubmFtZWRBcmd1bWVudENvdW50ICYmCiAgICAgICAgdGhpcy50eXBlQXJndW1lbnRDb3VudCA9PSBvdGhlci50eXBlQXJndW1lbnRDb3VudCAmJgogICAgICAgIHNhbWVOYW1lcyh0aGlzLm5hbWVkQXJndW1lbnRzLCBvdGhlci5uYW1lZEFyZ3VtZW50cyk7CiAgfQoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDYWNoZSBoYXNoIGNvZGU/CiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICByZXR1cm4gSGFzaGluZy5saXN0SGFzaCgKICAgICAgICBuYW1lZEFyZ3VtZW50cywKICAgICAgICBIYXNoaW5nLm9iamVjdEhhc2goYXJndW1lbnRDb3VudCwKICAgICAgICAgICAgSGFzaGluZy5vYmplY3RIYXNoKHR5cGVBcmd1bWVudENvdW50LCBuYW1lZEFyZ3VtZW50cy5sZW5ndGgpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMhIENhbGxTdHJ1Y3R1cmUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBtYXRjaChvdGhlcik7CiAgfQoKICBib29sIHNpZ25hdHVyZUFwcGxpZXMoUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlcnMpIHsKICAgIGludCByZXF1aXJlZFBhcmFtZXRlckNvdW50ID0gcGFyYW1ldGVycy5yZXF1aXJlZFBhcmFtZXRlcnM7CiAgICBpbnQgb3B0aW9uYWxQYXJhbWV0ZXJDb3VudCA9IHBhcmFtZXRlcnMub3B0aW9uYWxQYXJhbWV0ZXJzOwogICAgaW50IHBhcmFtZXRlckNvdW50ID0gcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCArIG9wdGlvbmFsUGFyYW1ldGVyQ291bnQ7CiAgICBpZiAoYXJndW1lbnRDb3VudCA+IHBhcmFtZXRlckNvdW50KSByZXR1cm4gZmFsc2U7CiAgICBpZiAocG9zaXRpb25hbEFyZ3VtZW50Q291bnQgPCByZXF1aXJlZFBhcmFtZXRlckNvdW50KSByZXR1cm4gZmFsc2U7CiAgICBpZiAodHlwZUFyZ3VtZW50Q291bnQgIT0gMCkgewogICAgICBpZiAodHlwZUFyZ3VtZW50Q291bnQgIT0gcGFyYW1ldGVycy50eXBlUGFyYW1ldGVycykgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGlmIChwYXJhbWV0ZXJzLm5hbWVkUGFyYW1ldGVycy5pc0VtcHR5KSB7CiAgICAgIC8vIFdlIGhhdmUgYWxyZWFkeSBjaGVja2VkIHRoYXQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgYXJlCiAgICAgIC8vIG5vdCBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzLiBUaGVyZWZvcmUgdGhlCiAgICAgIC8vIG51bWJlciBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50cyBhcmUgbm90IGdyZWF0ZXIgdGhhbiB0aGUKICAgICAgLy8gbnVtYmVyIG9mIHBhcmFtZXRlcnMuCiAgICAgIGFzc2VydChwb3NpdGlvbmFsQXJndW1lbnRDb3VudCA8PSBwYXJhbWV0ZXJDb3VudCk7CiAgICAgIHJldHVybiBuYW1lZEFyZ3VtZW50cy5pc0VtcHR5OwogICAgfSBlbHNlIHsKICAgICAgaWYgKHBvc2l0aW9uYWxBcmd1bWVudENvdW50ID4gcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCkgcmV0dXJuIGZhbHNlOwogICAgICBhc3NlcnQocG9zaXRpb25hbEFyZ3VtZW50Q291bnQgPT0gcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCk7CiAgICAgIGlmIChuYW1lZEFyZ3VtZW50Q291bnQgPiBvcHRpb25hbFBhcmFtZXRlckNvdW50KSByZXR1cm4gZmFsc2U7CgogICAgICBpbnQgbmFtZUluZGV4ID0gMDsKICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkUGFyYW1ldGVycyA9IHBhcmFtZXRlcnMubmFtZWRQYXJhbWV0ZXJzOwogICAgICBmb3IgKFN0cmluZyBuYW1lIGluIGdldE9yZGVyZWROYW1lZEFyZ3VtZW50cygpKSB7CiAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwogICAgICAgIC8vIE5vdGU6IHdlIHN0YXJ0IGF0IHRoZSBleGlzdGluZyBpbmRleCBiZWNhdXNlIGFyZ3VtZW50cyBhcmUgc29ydGVkLgogICAgICAgIHdoaWxlIChuYW1lSW5kZXggPCBuYW1lZFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgICAgICBpZiAobmFtZSA9PSBuYW1lZFBhcmFtZXRlcnNbbmFtZUluZGV4XSkgewogICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgbmFtZUluZGV4Kys7CiAgICAgICAgfQogICAgICAgIGlmICghZm91bmQpIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9CgogIHN0YXRpYyBib29sIHNhbWVOYW1lcyhMaXN0PFN0cmluZz4gZmlyc3QsIExpc3Q8U3RyaW5nPiBzZWNvbmQpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlyc3QubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGZpcnN0W2ldICE9IHNlY29uZFtpXSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQp9CgovLy8KY2xhc3MgTmFtZWRDYWxsU3RydWN0dXJlIGV4dGVuZHMgQ2FsbFN0cnVjdHVyZSB7CiAgQG92ZXJyaWRlCiAgZmluYWwgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzOwogIGZpbmFsIExpc3Q8U3RyaW5nPiBfb3JkZXJlZE5hbWVkQXJndW1lbnRzID0gPFN0cmluZz5bXTsKCiAgTmFtZWRDYWxsU3RydWN0dXJlKAogICAgICBpbnQgYXJndW1lbnRDb3VudCwgdGhpcy5uYW1lZEFyZ3VtZW50cywgaW50IHR5cGVBcmd1bWVudENvdW50KQogICAgICA6IHN1cGVyLnVubmFtZWQoYXJndW1lbnRDb3VudCwgdHlwZUFyZ3VtZW50Q291bnQpIHsKICAgIGFzc2VydChuYW1lZEFyZ3VtZW50cy5pc05vdEVtcHR5KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTmFtZWQgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNVbm5hbWVkID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IG5hbWVkQXJndW1lbnRDb3VudCA9PiBuYW1lZEFyZ3VtZW50cy5sZW5ndGg7CgogIEBvdmVycmlkZQogIGludCBnZXQgcG9zaXRpb25hbEFyZ3VtZW50Q291bnQgPT4gYXJndW1lbnRDb3VudCAtIG5hbWVkQXJndW1lbnRDb3VudDsKCiAgQG92ZXJyaWRlCiAgTGlzdDxTdHJpbmc+IGdldE9yZGVyZWROYW1lZEFyZ3VtZW50cygpIHsKICAgIGlmICghX29yZGVyZWROYW1lZEFyZ3VtZW50cy5pc0VtcHR5KSByZXR1cm4gX29yZGVyZWROYW1lZEFyZ3VtZW50czsKCiAgICBfb3JkZXJlZE5hbWVkQXJndW1lbnRzLmFkZEFsbChuYW1lZEFyZ3VtZW50cyk7CiAgICBfb3JkZXJlZE5hbWVkQXJndW1lbnRzLnNvcnQoKFN0cmluZyBmaXJzdCwgU3RyaW5nIHNlY29uZCkgewogICAgICByZXR1cm4gZmlyc3QuY29tcGFyZVRvKHNlY29uZCk7CiAgICB9KTsKICAgIHJldHVybiBfb3JkZXJlZE5hbWVkQXJndW1lbnRzOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHN0cnVjdHVyZVRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJ2FyaXR5PSRhcmd1bWVudENvdW50LCBuYW1lZD1bJHtuYW1lZEFyZ3VtZW50cy5qb2luKCcsICcpfV0nKTsKICAgIGlmICh0eXBlQXJndW1lbnRDb3VudCAhPSAwKSB7CiAgICAgIHNiLndyaXRlKCcsIHR5cGVzPSR0eXBlQXJndW1lbnRDb3VudCcpOwogICAgfQogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CoDqAE5OPAEgASo8LhwmATMwTxwWURMuAUdHSEpJATAfAUYbATEjATU0AVEBK0I8SgYjOwQBO0AXKjguFVAEATEoFSInJhMEAUBLAS8dATIeATs3AT8/ATkNOgE0GSoTJyIVNgYTGgQBLx8qJiIuBhoEAQxAAUQBJC04Pz0+BAErDBUdGCpMBAEMHC8ZBAE5QEBKNkgiSAYBLkJCQR85JQ1KQUUBGUE4HE41NBoTDBcKIggTBgQBQy0vBhEEAgEEMQwlOgEWRTonBAEMHAEMHwEMNwEMSQEMLEgBM0AmCCMEAQwfKkwiLgYaBAIBMXBhY2thZ2U6Y29tcGlsZXIvc3JjL3VuaXZlcnNlL2NhbGxfc3RydWN0dXJlLmRhcnQ8c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvY29uc3RhbnRzL2NvbnN0YW50X3N5c3RlbS5kYXJ0wAB0ei8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gQ29uc3RhbnQgc3lzdGVtIGZvbGxvd2luZyB0aGUgc2VtYW50aWNzIGZvciBEYXJ0IGNvZGUgdGhhdCBoYXMgYmVlbgovLy8gY29tcGlsZWQgdG8gSmF2YVNjcmlwdC4KbGlicmFyeSBkYXJ0MmpzLmNvbnN0YW50X3N5c3RlbTsKCmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgQ29tbW9uRWxlbWVudHM7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvb3BlcmF0b3JzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJ3ZhbHVlcy5kYXJ0JzsKCmZpbmFsIF9CSVRTMzIgPSBuZXcgQmlnSW50LmZyb20oMHhGRkZGRkZGRik7Cgpjb25zdCBhZGQgPSBjb25zdCBBZGRPcGVyYXRpb24oKTsKY29uc3QgYml0QW5kID0gY29uc3QgQml0QW5kT3BlcmF0aW9uKCk7CmNvbnN0IGJpdE5vdCA9IGNvbnN0IEJpdE5vdE9wZXJhdGlvbigpOwpjb25zdCBiaXRPciA9IGNvbnN0IEJpdE9yT3BlcmF0aW9uKCk7CmNvbnN0IGJpdFhvciA9IGNvbnN0IEJpdFhvck9wZXJhdGlvbigpOwpjb25zdCBib29sZWFuQW5kID0gY29uc3QgQm9vbGVhbkFuZE9wZXJhdGlvbigpOwpjb25zdCBib29sZWFuT3IgPSBjb25zdCBCb29sZWFuT3JPcGVyYXRpb24oKTsKY29uc3QgZGl2aWRlID0gY29uc3QgRGl2aWRlT3BlcmF0aW9uKCk7CmNvbnN0IGVxdWFsID0gY29uc3QgRXF1YWxzT3BlcmF0aW9uKCk7CmNvbnN0IGdyZWF0ZXJFcXVhbCA9IGNvbnN0IEdyZWF0ZXJFcXVhbE9wZXJhdGlvbigpOwpjb25zdCBncmVhdGVyID0gY29uc3QgR3JlYXRlck9wZXJhdGlvbigpOwpjb25zdCBpZGVudGl0eSA9IGNvbnN0IElkZW50aXR5T3BlcmF0aW9uKCk7CmNvbnN0IGlmTnVsbCA9IGNvbnN0IElmTnVsbE9wZXJhdGlvbigpOwpjb25zdCBsZXNzRXF1YWwgPSBjb25zdCBMZXNzRXF1YWxPcGVyYXRpb24oKTsKY29uc3QgbGVzcyA9IGNvbnN0IExlc3NPcGVyYXRpb24oKTsKY29uc3QgbW9kdWxvID0gY29uc3QgTW9kdWxvT3BlcmF0aW9uKCk7CmNvbnN0IG11bHRpcGx5ID0gY29uc3QgTXVsdGlwbHlPcGVyYXRpb24oKTsKY29uc3QgbmVnYXRlID0gY29uc3QgTmVnYXRlT3BlcmF0aW9uKCk7CmNvbnN0IG5vdCA9IGNvbnN0IE5vdE9wZXJhdGlvbigpOwpjb25zdCByZW1haW5kZXIgPSBjb25zdCBSZW1haW5kZXJPcGVyYXRpb24oKTsKY29uc3Qgc2hpZnRMZWZ0ID0gY29uc3QgU2hpZnRMZWZ0T3BlcmF0aW9uKCk7CmNvbnN0IHNoaWZ0UmlnaHQgPSBjb25zdCBTaGlmdFJpZ2h0T3BlcmF0aW9uKCk7CmNvbnN0IHN1YnRyYWN0ID0gY29uc3QgU3VidHJhY3RPcGVyYXRpb24oKTsKY29uc3QgdHJ1bmNhdGluZ0RpdmlkZSA9IGNvbnN0IFRydW5jYXRpbmdEaXZpZGVPcGVyYXRpb24oKTsKY29uc3QgY29kZVVuaXRBdCA9IGNvbnN0IENvZGVVbml0QXRPcGVyYXRpb24oKTsKY29uc3Qgcm91bmQgPSBjb25zdCBSb3VuZE9wZXJhdGlvbigpOwpjb25zdCBhYnMgPSBjb25zdCBVbmZvbGRlZFVuYXJ5T3BlcmF0aW9uKCdhYnMnKTsKCi8vLyBSZXR1cm5zIHRydWUgaWYgW3ZhbHVlXSB3aWxsIHR1cm4gaW50byBOYU4gb3IgaW5maW5pdHkKLy8vIGF0IHJ1bnRpbWUuCmJvb2wgX2ludGVnZXJCZWNvbWVzTmFuT3JJbmZpbml0eShCaWdJbnQgdmFsdWUpIHsKICBkb3VibGUgZG91YmxlVmFsdWUgPSB2YWx1ZS50b0RvdWJsZSgpOwogIHJldHVybiBkb3VibGVWYWx1ZS5pc05hTiB8fCBkb3VibGVWYWx1ZS5pc0luZmluaXRlOwp9CgpOdW1Db25zdGFudFZhbHVlIF9jb252ZXJ0VG9KYXZhU2NyaXB0Q29uc3RhbnQoTnVtQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogIGlmIChjb25zdGFudC5pc0ludCkgewogICAgSW50Q29uc3RhbnRWYWx1ZSBpbnRDb25zdGFudCA9IGNvbnN0YW50OwogICAgQmlnSW50IGludFZhbHVlID0gaW50Q29uc3RhbnQuaW50VmFsdWU7CiAgICBpZiAoX2ludGVnZXJCZWNvbWVzTmFuT3JJbmZpbml0eShpbnRWYWx1ZSkpIHsKICAgICAgcmV0dXJuIG5ldyBEb3VibGVDb25zdGFudFZhbHVlKGludFZhbHVlLnRvRG91YmxlKCkpOwogICAgfQogICAgLy8gSWYgdGhlIGludGVnZXIgbG9zZXMgcHJlY2lzaW9uIHdpdGggSmF2YVNjcmlwdCBudW1iZXJzLCB1c2UKICAgIC8vIHRoZSBmbG9vcmVkIHZlcnNpb24gSmF2YVNjcmlwdCB3aWxsIHVzZS4KICAgIEJpZ0ludCBmbG9vclZhbHVlID0gbmV3IEJpZ0ludC5mcm9tKGludFZhbHVlLnRvRG91YmxlKCkpOwogICAgaWYgKGZsb29yVmFsdWUgIT0gaW50VmFsdWUpIHsKICAgICAgcmV0dXJuIG5ldyBJbnRDb25zdGFudFZhbHVlKGZsb29yVmFsdWUpOwogICAgfQogIH0gZWxzZSBpZiAoY29uc3RhbnQuaXNEb3VibGUpIHsKICAgIERvdWJsZUNvbnN0YW50VmFsdWUgZG91YmxlUmVzdWx0ID0gY29uc3RhbnQ7CiAgICBkb3VibGUgZG91YmxlVmFsdWUgPSBkb3VibGVSZXN1bHQuZG91YmxlVmFsdWU7CiAgICBpZiAoIWRvdWJsZVZhbHVlLmlzSW5maW5pdGUgJiYKICAgICAgICAhZG91YmxlVmFsdWUuaXNOYU4gJiYKICAgICAgICAhY29uc3RhbnQuaXNNaW51c1plcm8pIHsKICAgICAgZG91YmxlIHRydW5jYXRlZCA9IGRvdWJsZVZhbHVlLnRydW5jYXRlVG9Eb3VibGUoKTsKICAgICAgaWYgKHRydW5jYXRlZCA9PSBkb3VibGVWYWx1ZSkgewogICAgICAgIHJldHVybiBuZXcgSW50Q29uc3RhbnRWYWx1ZShuZXcgQmlnSW50LmZyb20odHJ1bmNhdGVkKSk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGNvbnN0YW50Owp9CgpOdW1Db25zdGFudFZhbHVlIGNyZWF0ZUludChCaWdJbnQgaSkgPT4KICAgIF9jb252ZXJ0VG9KYXZhU2NyaXB0Q29uc3RhbnQobmV3IEludENvbnN0YW50VmFsdWUoaSkpOwpOdW1Db25zdGFudFZhbHVlIGNyZWF0ZUludEZyb21JbnQoaW50IGkpID0+IGNyZWF0ZUludChuZXcgQmlnSW50LmZyb20oaSkpOwpOdW1Db25zdGFudFZhbHVlIF9jcmVhdGVJbnQzMihCaWdJbnQgaSkgPT4gbmV3IEludENvbnN0YW50VmFsdWUoaSAmIF9CSVRTMzIpOwpOdW1Db25zdGFudFZhbHVlIGNyZWF0ZURvdWJsZShkb3VibGUgZCkgPT4KICAgIF9jb252ZXJ0VG9KYXZhU2NyaXB0Q29uc3RhbnQobmV3IERvdWJsZUNvbnN0YW50VmFsdWUoZCkpOwpTdHJpbmdDb25zdGFudFZhbHVlIGNyZWF0ZVN0cmluZyhTdHJpbmcgc3RyaW5nKSA9PgogICAgbmV3IFN0cmluZ0NvbnN0YW50VmFsdWUoc3RyaW5nKTsKQm9vbENvbnN0YW50VmFsdWUgY3JlYXRlQm9vbChib29sIHZhbHVlKSA9PiBuZXcgQm9vbENvbnN0YW50VmFsdWUodmFsdWUpOwpOdWxsQ29uc3RhbnRWYWx1ZSBjcmVhdGVOdWxsKCkgPT4gbmV3IE51bGxDb25zdGFudFZhbHVlKCk7Ckxpc3RDb25zdGFudFZhbHVlIGNyZWF0ZUxpc3QoSW50ZXJmYWNlVHlwZSB0eXBlLCBMaXN0PENvbnN0YW50VmFsdWU+IHZhbHVlcykgPT4KICAgIG5ldyBMaXN0Q29uc3RhbnRWYWx1ZSh0eXBlLCB2YWx1ZXMpOwoKQ29uc3RhbnRWYWx1ZSBjcmVhdGVUeXBlKENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLCBEYXJ0VHlwZSB0eXBlKSB7CiAgSW50ZXJmYWNlVHlwZSBpbnN0YW5jZVR5cGUgPSBjb21tb25FbGVtZW50cy50eXBlTGl0ZXJhbFR5cGU7CiAgcmV0dXJuIG5ldyBUeXBlQ29uc3RhbnRWYWx1ZSh0eXBlLCBpbnN0YW5jZVR5cGUpOwp9CgovLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBbY29uc3RhbnRdIGlzIGFuIGludGVnZXIgYXQgcnVudGltZS4KLy8vCi8vLyBJbnRlZ2VyIGNoZWNrcyByZXBvcnQgdHJ1ZSBmb3IgLTAuMCwgSU5GSU5JVFksIGFuZCAtSU5GSU5JVFkuICBBdAovLy8gcnVudGltZSBhbiAnWCBpcyBpbnQnIGNoZWNrIGlzIGltcGxlbWVudGVkIGFzOgovLy8KLy8vIHR5cGVvZihYKSA9PT0gIm51bWJlciIgJiYgTWF0aC5mbG9vcihYKSA9PT0gWAovLy8KLy8vIFdlIGNvbnNpc3RlbnRseSBtYXRjaCB0aGF0IHJ1bnRpbWUgc2VtYW50aWNzIGF0IGNvbXBpbGUgdGltZSBhcyB3ZWxsLgpib29sIGlzSW50KENvbnN0YW50VmFsdWUgY29uc3RhbnQpID0+CiAgICBjb25zdGFudC5pc0ludCB8fAogICAgY29uc3RhbnQuaXNNaW51c1plcm8gfHwKICAgIGNvbnN0YW50LmlzUG9zaXRpdmVJbmZpbml0eSB8fAogICAgY29uc3RhbnQuaXNOZWdhdGl2ZUluZmluaXR5OwoKLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgW2NvbnN0YW50XSBpcyBhIGRvdWJsZSBhdCBydW50aW1lLgpib29sIGlzRG91YmxlKENvbnN0YW50VmFsdWUgY29uc3RhbnQpID0+CiAgICBjb25zdGFudC5pc0RvdWJsZSAmJiAhY29uc3RhbnQuaXNNaW51c1plcm87CgovLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBbY29uc3RhbnRdIGlzIGEgc3RyaW5nIGF0IHJ1bnRpbWUuCmJvb2wgaXNTdHJpbmcoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgPT4gY29uc3RhbnQuaXNTdHJpbmc7CgovLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBbY29uc3RhbnRdIGlzIGEgYm9vbGVhbiBhdCBydW50aW1lLgpib29sIGlzQm9vbChDb25zdGFudFZhbHVlIGNvbnN0YW50KSA9PiBjb25zdGFudC5pc0Jvb2w7CgovLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBbY29uc3RhbnRdIGlzIG51bGwgYXQgcnVudGltZS4KYm9vbCBpc051bGwoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgPT4gY29uc3RhbnQuaXNOdWxsOwoKYm9vbCBpc1N1YnR5cGUoRGFydFR5cGVzIHR5cGVzLCBEYXJ0VHlwZSBzLCBEYXJ0VHlwZSB0KSB7CiAgLy8gQXQgcnVudGltZSwgYW4gaW50ZWdlciBpcyBib3RoIGFuIGludGVnZXIgYW5kIGEgZG91YmxlOiB0aGUKICAvLyBpbnRlZ2VyIHR5cGUgY2hlY2sgaXMgTWF0aC5mbG9vciwgd2hpY2ggd2lsbCByZXR1cm4gdHJ1ZSBvbmx5CiAgLy8gZm9yIHJlYWwgaW50ZWdlcnMsIGFuZCBvdXIgZG91YmxlIHR5cGUgY2hlY2sgaXMgJ3R5cGVvZiBudW1iZXInCiAgLy8gd2hpY2ggd2lsbCByZXR1cm4gdHJ1ZSBmb3IgYm90aCBpbnRlZ2VycyBhbmQgZG91Ymxlcy4KICBpZiAocyA9PSB0eXBlcy5jb21tb25FbGVtZW50cy5pbnRUeXBlICYmCiAgICAgIHQgPT0gdHlwZXMuY29tbW9uRWxlbWVudHMuZG91YmxlVHlwZSkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIHJldHVybiB0eXBlcy5pc1N1YnR5cGUocywgdCk7Cn0KClNldENvbnN0YW50VmFsdWUgY3JlYXRlU2V0KENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgSW50ZXJmYWNlVHlwZSBzb3VyY2VUeXBlLCBMaXN0PENvbnN0YW50VmFsdWU+IHZhbHVlcykgewogIEludGVyZmFjZVR5cGUgdHlwZSA9IGNvbW1vbkVsZW1lbnRzLmdldENvbnN0YW50U2V0VHlwZUZvcihzb3VyY2VUeXBlKTsKICBEYXJ0VHlwZSBlbGVtZW50VHlwZSA9IHR5cGUudHlwZUFyZ3VtZW50cy5maXJzdDsKICBJbnRlcmZhY2VUeXBlIG1hcFR5cGUgPQogICAgICBjb21tb25FbGVtZW50cy5tYXBUeXBlKGVsZW1lbnRUeXBlLCBjb21tb25FbGVtZW50cy5udWxsVHlwZSk7CiAgTGlzdDxOdWxsQ29uc3RhbnRWYWx1ZT4gbnVsbHMgPSBuZXcgTGlzdDxOdWxsQ29uc3RhbnRWYWx1ZT4uZmlsbGVkKAogICAgICB2YWx1ZXMubGVuZ3RoLCBjb25zdCBOdWxsQ29uc3RhbnRWYWx1ZSgpKTsKICBNYXBDb25zdGFudFZhbHVlIGVudHJpZXMgPSBjcmVhdGVNYXAoY29tbW9uRWxlbWVudHMsIG1hcFR5cGUsIHZhbHVlcywgbnVsbHMpOwogIHJldHVybiBuZXcgSmF2YVNjcmlwdFNldENvbnN0YW50KHR5cGUsIGVudHJpZXMpOwp9CgpNYXBDb25zdGFudFZhbHVlIGNyZWF0ZU1hcCgKICAgIENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgSW50ZXJmYWNlVHlwZSBzb3VyY2VUeXBlLAogICAgTGlzdDxDb25zdGFudFZhbHVlPiBrZXlzLAogICAgTGlzdDxDb25zdGFudFZhbHVlPiB2YWx1ZXMpIHsKICBib29sIG9ubHlTdHJpbmdLZXlzID0gdHJ1ZTsKICBDb25zdGFudFZhbHVlIHByb3RvVmFsdWUgPSBudWxsOwogIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAgZHluYW1pYyBrZXkgPSBrZXlzW2ldOwogICAgaWYgKGtleS5pc1N0cmluZykgewogICAgICBpZiAoa2V5LnN0cmluZ1ZhbHVlID09IEphdmFTY3JpcHRNYXBDb25zdGFudC5QUk9UT19QUk9QRVJUWSkgewogICAgICAgIHByb3RvVmFsdWUgPSB2YWx1ZXNbaV07CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIG9ubHlTdHJpbmdLZXlzID0gZmFsc2U7CiAgICAgIC8vIERvbid0IGhhbmRsZSBfX3Byb3RvX18gdmFsdWVzIHNwZWNpYWxseSBpbiB0aGUgZ2VuZXJhbCBtYXAgY2FzZS4KICAgICAgcHJvdG9WYWx1ZSA9IG51bGw7CiAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgYm9vbCBoYXNQcm90b0tleSA9IChwcm90b1ZhbHVlICE9IG51bGwpOwogIEludGVyZmFjZVR5cGUga2V5c1R5cGU7CiAgaWYgKHNvdXJjZVR5cGUudHJlYXRBc1JhdykgewogICAga2V5c1R5cGUgPSBjb21tb25FbGVtZW50cy5saXN0VHlwZSgpOwogIH0gZWxzZSB7CiAgICBrZXlzVHlwZSA9IGNvbW1vbkVsZW1lbnRzLmxpc3RUeXBlKHNvdXJjZVR5cGUudHlwZUFyZ3VtZW50cy5maXJzdCk7CiAgfQogIExpc3RDb25zdGFudFZhbHVlIGtleXNMaXN0ID0gbmV3IExpc3RDb25zdGFudFZhbHVlKGtleXNUeXBlLCBrZXlzKTsKICBJbnRlcmZhY2VUeXBlIHR5cGUgPSBjb21tb25FbGVtZW50cy5nZXRDb25zdGFudE1hcFR5cGVGb3Ioc291cmNlVHlwZSwKICAgICAgaGFzUHJvdG9LZXk6IGhhc1Byb3RvS2V5LCBvbmx5U3RyaW5nS2V5czogb25seVN0cmluZ0tleXMpOwogIHJldHVybiBuZXcgSmF2YVNjcmlwdE1hcENvbnN0YW50KAogICAgICB0eXBlLCBrZXlzTGlzdCwgdmFsdWVzLCBwcm90b1ZhbHVlLCBvbmx5U3RyaW5nS2V5cyk7Cn0KCkNvbnN0YW50VmFsdWUgY3JlYXRlU3ltYm9sKENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLCBTdHJpbmcgdGV4dCkgewogIEludGVyZmFjZVR5cGUgdHlwZSA9IGNvbW1vbkVsZW1lbnRzLnN5bWJvbEltcGxlbWVudGF0aW9uVHlwZTsKICBGaWVsZEVudGl0eSBmaWVsZCA9IGNvbW1vbkVsZW1lbnRzLnN5bWJvbEZpZWxkOwogIENvbnN0YW50VmFsdWUgYXJndW1lbnQgPSBjcmVhdGVTdHJpbmcodGV4dCk7CiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVXNlIHR5cGUgYXJndW1lbnRzIHdoZW4gYWxsIHVzZXMgbm8gbG9uZ2VyIGV4cGVjdAogIC8vIGEgW0ZpZWxkRWxlbWVudF0uCiAgdmFyIGZpZWxkcyA9IDxGaWVsZEVudGl0eSwgQ29uc3RhbnRWYWx1ZT57ZmllbGQ6IGFyZ3VtZW50fTsKICByZXR1cm4gbmV3IENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZSh0eXBlLCBmaWVsZHMpOwp9CgpVbmFyeU9wZXJhdGlvbiBsb29rdXBVbmFyeShVbmFyeU9wZXJhdG9yIG9wZXJhdG9yKSB7CiAgc3dpdGNoIChvcGVyYXRvci5raW5kKSB7CiAgICBjYXNlIFVuYXJ5T3BlcmF0b3JLaW5kLkNPTVBMRU1FTlQ6CiAgICAgIHJldHVybiBiaXROb3Q7CiAgICBjYXNlIFVuYXJ5T3BlcmF0b3JLaW5kLk5FR0FURToKICAgICAgcmV0dXJuIG5lZ2F0ZTsKICAgIGNhc2UgVW5hcnlPcGVyYXRvcktpbmQuTk9UOgogICAgICByZXR1cm4gbm90OwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIG51bGw7CiAgfQp9CgpCaW5hcnlPcGVyYXRpb24gbG9va3VwQmluYXJ5KEJpbmFyeU9wZXJhdG9yIG9wZXJhdG9yKSB7CiAgc3dpdGNoIChvcGVyYXRvci5raW5kKSB7CiAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5BREQ6CiAgICAgIHJldHVybiBhZGQ7CiAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5TVUI6CiAgICAgIHJldHVybiBzdWJ0cmFjdDsKICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLk1VTDoKICAgICAgcmV0dXJuIG11bHRpcGx5OwogICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuRElWOgogICAgICByZXR1cm4gZGl2aWRlOwogICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuTU9EOgogICAgICByZXR1cm4gbW9kdWxvOwogICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuSURJVjoKICAgICAgcmV0dXJuIHRydW5jYXRpbmdEaXZpZGU7CiAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5PUjoKICAgICAgcmV0dXJuIGJpdE9yOwogICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuQU5EOgogICAgICByZXR1cm4gYml0QW5kOwogICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuWE9SOgogICAgICByZXR1cm4gYml0WG9yOwogICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuTE9HSUNBTF9PUjoKICAgICAgcmV0dXJuIGJvb2xlYW5PcjsKICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkxPR0lDQUxfQU5EOgogICAgICByZXR1cm4gYm9vbGVhbkFuZDsKICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLlNITDoKICAgICAgcmV0dXJuIHNoaWZ0TGVmdDsKICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLlNIUjoKICAgICAgcmV0dXJuIHNoaWZ0UmlnaHQ7CiAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5MVDoKICAgICAgcmV0dXJuIGxlc3M7CiAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5MVEVROgogICAgICByZXR1cm4gbGVzc0VxdWFsOwogICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuR1Q6CiAgICAgIHJldHVybiBncmVhdGVyOwogICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuR1RFUToKICAgICAgcmV0dXJuIGdyZWF0ZXJFcXVhbDsKICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkVROgogICAgICByZXR1cm4gZXF1YWw7CiAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5JRl9OVUxMOgogICAgICByZXR1cm4gaWZOdWxsOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIG51bGw7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBPcGVyYXRpb24gewogIFN0cmluZyBnZXQgbmFtZTsKfQoKYWJzdHJhY3QgY2xhc3MgVW5hcnlPcGVyYXRpb24gZXh0ZW5kcyBPcGVyYXRpb24gewogIC8vLyBSZXR1cm5zIFs6bnVsbDpdIGlmIGl0IHdhcyB1bmFibGUgdG8gZm9sZCB0aGUgb3BlcmF0aW9uLgogIENvbnN0YW50VmFsdWUgZm9sZChDb25zdGFudFZhbHVlIGNvbnN0YW50KTsKfQoKYWJzdHJhY3QgY2xhc3MgQmluYXJ5T3BlcmF0aW9uIGV4dGVuZHMgT3BlcmF0aW9uIHsKICAvLy8gUmV0dXJucyBbOm51bGw6XSBpZiBpdCB3YXMgdW5hYmxlIHRvIGZvbGQgdGhlIG9wZXJhdGlvbi4KICBDb25zdGFudFZhbHVlIGZvbGQoQ29uc3RhbnRWYWx1ZSBsZWZ0LCBDb25zdGFudFZhbHVlIHJpZ2h0KTsKICBhcHBseShsZWZ0LCByaWdodCk7Cn0KCmNsYXNzIEJpdE5vdE9wZXJhdGlvbiBpbXBsZW1lbnRzIFVuYXJ5T3BlcmF0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZSA9ICd+JzsKCiAgY29uc3QgQml0Tm90T3BlcmF0aW9uKCk7CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZm9sZChDb25zdGFudFZhbHVlIGNvbnN0YW50KSB7CiAgICBpZiAoaXNJbnQoY29uc3RhbnQpKSB7CiAgICAgIC8vIEluIEphdmFTY3JpcHQgd2UgZG9uJ3QgY2hlY2sgZm9yIC0wIGFuZCB0cmVhdCBpdCBhcyBpZiBpdCB3YXMgemVyby4KICAgICAgaWYgKGNvbnN0YW50LmlzTWludXNaZXJvKSB7CiAgICAgICAgY29uc3RhbnQgPSBjcmVhdGVJbnQoQmlnSW50Lnplcm8pOwogICAgICB9CiAgICAgIEludENvbnN0YW50VmFsdWUgaW50Q29uc3RhbnQgPSBjb25zdGFudDsKICAgICAgLy8gV2UgY29udmVydCB0aGUgcmVzdWx0IG9mIGJpdC1vcGVyYXRpb25zIHRvIDMyIGJpdCB1bnNpZ25lZCBpbnRlZ2Vycy4KICAgICAgcmV0dXJuIF9jcmVhdGVJbnQzMih+aW50Q29uc3RhbnQuaW50VmFsdWUpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQp9CgpjbGFzcyBOZWdhdGVPcGVyYXRpb24gaW1wbGVtZW50cyBVbmFyeU9wZXJhdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAnbmVnYXRlJzsKCiAgY29uc3QgTmVnYXRlT3BlcmF0aW9uKCk7CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZm9sZChDb25zdGFudFZhbHVlIGNvbnN0YW50KSB7CiAgICBDb25zdGFudFZhbHVlIF9mb2xkKENvbnN0YW50VmFsdWUgY29uc3RhbnQpIHsKICAgICAgaWYgKGNvbnN0YW50LmlzSW50KSB7CiAgICAgICAgSW50Q29uc3RhbnRWYWx1ZSBpbnRDb25zdGFudCA9IGNvbnN0YW50OwogICAgICAgIHJldHVybiBjcmVhdGVJbnQoLWludENvbnN0YW50LmludFZhbHVlKTsKICAgICAgfQogICAgICBpZiAoY29uc3RhbnQuaXNEb3VibGUpIHsKICAgICAgICBEb3VibGVDb25zdGFudFZhbHVlIGRvdWJsZUNvbnN0YW50ID0gY29uc3RhbnQ7CiAgICAgICAgcmV0dXJuIGNyZWF0ZURvdWJsZSgtZG91YmxlQ29uc3RhbnQuZG91YmxlVmFsdWUpOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGlmIChjb25zdGFudC5pc0ludCkgewogICAgICBJbnRDb25zdGFudFZhbHVlIGludENvbnN0YW50ID0gY29uc3RhbnQ7CiAgICAgIGlmIChpbnRDb25zdGFudC5pbnRWYWx1ZSA9PSBCaWdJbnQuemVybykgewogICAgICAgIHJldHVybiBjcmVhdGVEb3VibGUoLTAuMCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfZm9sZChjb25zdGFudCk7CiAgfQp9CgpjbGFzcyBOb3RPcGVyYXRpb24gaW1wbGVtZW50cyBVbmFyeU9wZXJhdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAnISc7CgogIGNvbnN0IE5vdE9wZXJhdGlvbigpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGZvbGQoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgaWYgKGNvbnN0YW50LmlzQm9vbCkgewogICAgICBCb29sQ29uc3RhbnRWYWx1ZSBib29sQ29uc3RhbnQgPSBjb25zdGFudDsKICAgICAgcmV0dXJuIGNyZWF0ZUJvb2woIWJvb2xDb25zdGFudC5ib29sVmFsdWUpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQp9CgovLy8gT3BlcmF0aW9ucyB0aGF0IG9ubHkgd29yayBpZiBib3RoIGFyZ3VtZW50cyBhcmUgaW50ZWdlcnMuCmFic3RyYWN0IGNsYXNzIEJpbmFyeUJpdE9wZXJhdGlvbiBpbXBsZW1lbnRzIEJpbmFyeU9wZXJhdGlvbiB7CiAgY29uc3QgQmluYXJ5Qml0T3BlcmF0aW9uKCk7CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZm9sZChDb25zdGFudFZhbHVlIGxlZnQsIENvbnN0YW50VmFsdWUgcmlnaHQpIHsKICAgIENvbnN0YW50VmFsdWUgX2ZvbGQoQ29uc3RhbnRWYWx1ZSBsZWZ0LCBDb25zdGFudFZhbHVlIHJpZ2h0KSB7CiAgICAgIGlmIChsZWZ0LmlzSW50ICYmIHJpZ2h0LmlzSW50KSB7CiAgICAgICAgSW50Q29uc3RhbnRWYWx1ZSBsZWZ0SW50ID0gbGVmdDsKICAgICAgICBJbnRDb25zdGFudFZhbHVlIHJpZ2h0SW50ID0gcmlnaHQ7CiAgICAgICAgQmlnSW50IHJlc3VsdFZhbHVlID0gZm9sZEludHMobGVmdEludC5pbnRWYWx1ZSwgcmlnaHRJbnQuaW50VmFsdWUpOwogICAgICAgIGlmIChyZXN1bHRWYWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgICByZXR1cm4gY3JlYXRlSW50KHJlc3VsdFZhbHVlKTsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvLyBJbiBKYXZhU2NyaXB0IHdlIGRvbid0IGNoZWNrIGZvciAtMCBhbmQgdHJlYXQgaXQgYXMgaWYgaXQgd2FzIHplcm8uCiAgICBpZiAobGVmdC5pc01pbnVzWmVybykgewogICAgICBsZWZ0ID0gY3JlYXRlSW50KEJpZ0ludC56ZXJvKTsKICAgIH0KICAgIGlmIChyaWdodC5pc01pbnVzWmVybykgewogICAgICByaWdodCA9IGNyZWF0ZUludChCaWdJbnQuemVybyk7CiAgICB9CiAgICBJbnRDb25zdGFudFZhbHVlIHJlc3VsdCA9IF9mb2xkKGxlZnQsIHJpZ2h0KTsKICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewogICAgICAvLyBXZSBjb252ZXJ0IHRoZSByZXN1bHQgb2YgYml0LW9wZXJhdGlvbnMgdG8gMzIgYml0IHVuc2lnbmVkIGludGVnZXJzLgogICAgICByZXR1cm4gX2NyZWF0ZUludDMyKHJlc3VsdC5pbnRWYWx1ZSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQmlnSW50IGZvbGRJbnRzKEJpZ0ludCBsZWZ0LCBCaWdJbnQgcmlnaHQpOwp9CgpjbGFzcyBCaXRBbmRPcGVyYXRpb24gZXh0ZW5kcyBCaW5hcnlCaXRPcGVyYXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gJyYnOwoKICBjb25zdCBCaXRBbmRPcGVyYXRpb24oKTsKCiAgQG92ZXJyaWRlCiAgQmlnSW50IGZvbGRJbnRzKEJpZ0ludCBsZWZ0LCBCaWdJbnQgcmlnaHQpID0+IGxlZnQgJiByaWdodDsKCiAgQG92ZXJyaWRlCiAgYXBwbHkobGVmdCwgcmlnaHQpID0+IGxlZnQgJiByaWdodDsKfQoKY2xhc3MgQml0T3JPcGVyYXRpb24gZXh0ZW5kcyBCaW5hcnlCaXRPcGVyYXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gJ3wnOwoKICBjb25zdCBCaXRPck9wZXJhdGlvbigpOwoKICBAb3ZlcnJpZGUKICBCaWdJbnQgZm9sZEludHMoQmlnSW50IGxlZnQsIEJpZ0ludCByaWdodCkgPT4gbGVmdCB8IHJpZ2h0OwoKICBAb3ZlcnJpZGUKICBhcHBseShsZWZ0LCByaWdodCkgPT4gbGVmdCB8IHJpZ2h0Owp9CgpjbGFzcyBCaXRYb3JPcGVyYXRpb24gZXh0ZW5kcyBCaW5hcnlCaXRPcGVyYXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gJ14nOwoKICBjb25zdCBCaXRYb3JPcGVyYXRpb24oKTsKCiAgQG92ZXJyaWRlCiAgQmlnSW50IGZvbGRJbnRzKEJpZ0ludCBsZWZ0LCBCaWdJbnQgcmlnaHQpID0+IGxlZnQgXiByaWdodDsKCiAgQG92ZXJyaWRlCiAgYXBwbHkobGVmdCwgcmlnaHQpID0+IGxlZnQgXiByaWdodDsKfQoKY2xhc3MgU2hpZnRMZWZ0T3BlcmF0aW9uIGV4dGVuZHMgQmluYXJ5Qml0T3BlcmF0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZSA9ICc8PCc7CgogIGNvbnN0IFNoaWZ0TGVmdE9wZXJhdGlvbigpOwoKICBAb3ZlcnJpZGUKICBCaWdJbnQgZm9sZEludHMoQmlnSW50IGxlZnQsIEJpZ0ludCByaWdodCkgewogICAgLy8gVE9ETyhmbG9pdHNjaCk6IGZpbmQgYSBiZXR0ZXIgd2F5IHRvIGd1YXJkIGFnYWluc3QgZXhjZXNzaXZlIHNoaWZ0cyB0bwogICAgLy8gdGhlIGxlZnQuCiAgICBpZiAocmlnaHQgPiBuZXcgQmlnSW50LmZyb20oMTAwKSB8fCByaWdodCA8IEJpZ0ludC56ZXJvKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBsZWZ0IDw8IHJpZ2h0LnRvSW50KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBhcHBseShsZWZ0LCByaWdodCkgPT4gbGVmdCA8PCByaWdodDsKfQoKY2xhc3MgU2hpZnRSaWdodE9wZXJhdGlvbiBleHRlbmRzIEJpbmFyeUJpdE9wZXJhdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAnPj4nOwoKICBjb25zdCBTaGlmdFJpZ2h0T3BlcmF0aW9uKCk7CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZm9sZChDb25zdGFudFZhbHVlIGxlZnQsIENvbnN0YW50VmFsdWUgcmlnaHQpIHsKICAgIC8vIFRydW5jYXRlIHRoZSBpbnB1dCB2YWx1ZSB0byAzMiBiaXRzIGlmIG5lY2Vzc2FyeS4KICAgIGlmIChsZWZ0LmlzSW50KSB7CiAgICAgIEludENvbnN0YW50VmFsdWUgaW50Q29uc3RhbnQgPSBsZWZ0OwogICAgICBCaWdJbnQgdmFsdWUgPSBpbnRDb25zdGFudC5pbnRWYWx1ZTsKICAgICAgQmlnSW50IHRydW5jYXRlZFZhbHVlID0gdmFsdWUgJiBfQklUUzMyOwogICAgICBpZiAodmFsdWUgPCBCaWdJbnQuemVybykgewogICAgICAgIC8vIFNpZ24tZXh0ZW5kIGlmIHRoZSBpbnB1dCB3YXMgbmVnYXRpdmUuIFRoZSBjdXJyZW50IHNlbWFudGljcyBkb24ndAogICAgICAgIC8vIG1ha2UgbXVjaCBzZW5zZSwgc2luY2Ugd2Ugb25seSBsb29rIGF0IGJpdCAzMS4KICAgICAgICAvLyBUT0RPKGZsb2l0c2NoKTogd2Ugc2hvdWxkIHRyZWF0IHRoZSBpbnB1dCB0byByaWdodCBzaGlmdHMgYXMKICAgICAgICAvLyB1bnNpZ25lZC4KCiAgICAgICAgLy8gQSAzMiBiaXQgY29tcGxlbWVudC10d28gdmFsdWUgeCBjYW4gYmUgY29tcHV0ZWQgYnk6CiAgICAgICAgLy8gICAgeF91IC0gMl4zMiAod2hlcmUgeF91IGlzIGl0cyB1bnNpZ25lZCByZXByZXNlbnRhdGlvbikuCiAgICAgICAgLy8gRXhhbXBsZTogMHhGRkZGRkZGRiAtIDB4MTAwMDAwMDAwID0+IC0xLgogICAgICAgIC8vIFdlIHNpbXBseSBhbmQgd2l0aCB0aGUgc2lnbi1iaXQgYW5kIG11bHRpcGx5IGJ5IHR3by4gSWYgdGhlIHNpZ24tYml0CiAgICAgICAgLy8gd2FzIHNldCwgdGhlbiB0aGUgcmVzdWx0IGlzIDAuIE90aGVyd2lzZSBpdCB3aWxsIGJlY29tZSAyXjMyLgogICAgICAgIGZpbmFsIEJpZ0ludCBTSUdOX0JJVCA9IG5ldyBCaWdJbnQuZnJvbSgweDgwMDAwMDAwKTsKICAgICAgICB0cnVuY2F0ZWRWYWx1ZSAtPSBCaWdJbnQudHdvICogKHRydW5jYXRlZFZhbHVlICYgU0lHTl9CSVQpOwogICAgICB9CiAgICAgIGlmICh2YWx1ZSAhPSB0cnVuY2F0ZWRWYWx1ZSkgewogICAgICAgIGxlZnQgPSBjcmVhdGVJbnQodHJ1bmNhdGVkVmFsdWUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc3VwZXIuZm9sZChsZWZ0LCByaWdodCk7CiAgfQoKICBAb3ZlcnJpZGUKICBCaWdJbnQgZm9sZEludHMoQmlnSW50IGxlZnQsIEJpZ0ludCByaWdodCkgewogICAgaWYgKHJpZ2h0IDwgQmlnSW50Lnplcm8pIHJldHVybiBudWxsOwogICAgcmV0dXJuIGxlZnQgPj4gcmlnaHQudG9JbnQoKTsKICB9CgogIEBvdmVycmlkZQogIGFwcGx5KGxlZnQsIHJpZ2h0KSA9PiBsZWZ0ID4+IHJpZ2h0Owp9CgphYnN0cmFjdCBjbGFzcyBCaW5hcnlCb29sT3BlcmF0aW9uIGltcGxlbWVudHMgQmluYXJ5T3BlcmF0aW9uIHsKICBjb25zdCBCaW5hcnlCb29sT3BlcmF0aW9uKCk7CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZm9sZChDb25zdGFudFZhbHVlIGxlZnQsIENvbnN0YW50VmFsdWUgcmlnaHQpIHsKICAgIGlmIChsZWZ0LmlzQm9vbCAmJiByaWdodC5pc0Jvb2wpIHsKICAgICAgQm9vbENvbnN0YW50VmFsdWUgbGVmdEJvb2wgPSBsZWZ0OwogICAgICBCb29sQ29uc3RhbnRWYWx1ZSByaWdodEJvb2wgPSByaWdodDsKICAgICAgYm9vbCByZXN1bHRWYWx1ZSA9IGZvbGRCb29scyhsZWZ0Qm9vbC5ib29sVmFsdWUsIHJpZ2h0Qm9vbC5ib29sVmFsdWUpOwogICAgICByZXR1cm4gY3JlYXRlQm9vbChyZXN1bHRWYWx1ZSk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGJvb2wgZm9sZEJvb2xzKGJvb2wgbGVmdCwgYm9vbCByaWdodCk7Cn0KCmNsYXNzIEJvb2xlYW5BbmRPcGVyYXRpb24gZXh0ZW5kcyBCaW5hcnlCb29sT3BlcmF0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZSA9ICcmJic7CgogIGNvbnN0IEJvb2xlYW5BbmRPcGVyYXRpb24oKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBmb2xkQm9vbHMoYm9vbCBsZWZ0LCBib29sIHJpZ2h0KSA9PiBsZWZ0ICYmIHJpZ2h0OwoKICBAb3ZlcnJpZGUKICBhcHBseShsZWZ0LCByaWdodCkgPT4gbGVmdCAmJiByaWdodDsKfQoKY2xhc3MgQm9vbGVhbk9yT3BlcmF0aW9uIGV4dGVuZHMgQmluYXJ5Qm9vbE9wZXJhdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAnfHwnOwoKICBjb25zdCBCb29sZWFuT3JPcGVyYXRpb24oKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBmb2xkQm9vbHMoYm9vbCBsZWZ0LCBib29sIHJpZ2h0KSA9PiBsZWZ0IHx8IHJpZ2h0OwoKICBAb3ZlcnJpZGUKICBhcHBseShsZWZ0LCByaWdodCkgPT4gbGVmdCB8fCByaWdodDsKfQoKYWJzdHJhY3QgY2xhc3MgQXJpdGhtZXRpY051bU9wZXJhdGlvbiBpbXBsZW1lbnRzIEJpbmFyeU9wZXJhdGlvbiB7CiAgY29uc3QgQXJpdGhtZXRpY051bU9wZXJhdGlvbigpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGZvbGQoQ29uc3RhbnRWYWx1ZSBsZWZ0LCBDb25zdGFudFZhbHVlIHJpZ2h0KSB7CiAgICBDb25zdGFudFZhbHVlIF9mb2xkKENvbnN0YW50VmFsdWUgbGVmdCwgQ29uc3RhbnRWYWx1ZSByaWdodCkgewogICAgICBpZiAobGVmdC5pc051bSAmJiByaWdodC5pc051bSkgewogICAgICAgIE51bUNvbnN0YW50VmFsdWUgbGVmdE51bSA9IGxlZnQ7CiAgICAgICAgTnVtQ29uc3RhbnRWYWx1ZSByaWdodE51bSA9IHJpZ2h0OwogICAgICAgIHZhciBmb2xkZWRWYWx1ZTsKICAgICAgICBpZiAobGVmdC5pc0ludCAmJiByaWdodC5pc0ludCkgewogICAgICAgICAgSW50Q29uc3RhbnRWYWx1ZSBsZWZ0SW50ID0gbGVmdE51bTsKICAgICAgICAgIEludENvbnN0YW50VmFsdWUgcmlnaHRJbnQgPSByaWdodE51bTsKICAgICAgICAgIGZvbGRlZFZhbHVlID0gZm9sZEludHMobGVmdEludC5pbnRWYWx1ZSwgcmlnaHRJbnQuaW50VmFsdWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmb2xkZWRWYWx1ZSA9IGZvbGROdW1zKGxlZnROdW0uZG91YmxlVmFsdWUsIHJpZ2h0TnVtLmRvdWJsZVZhbHVlKTsKICAgICAgICB9CiAgICAgICAgLy8gQSBkaXZpc2lvbiBieSAwIG1lYW5zIHRoYXQgd2UgbWlnaHQgbm90IGhhdmUgYSBmb2xkZWQgdmFsdWUuCiAgICAgICAgaWYgKGZvbGRlZFZhbHVlID09IG51bGwpIHJldHVybiBudWxsOwogICAgICAgIGlmIChsZWZ0LmlzSW50ICYmIHJpZ2h0LmlzSW50ICYmICFpc0RpdmlkZSgpIHx8IGlzVHJ1bmNhdGluZ0RpdmlkZSgpKSB7CiAgICAgICAgICBhc3NlcnQoZm9sZGVkVmFsdWUgaXMgQmlnSW50KTsKICAgICAgICAgIHJldHVybiBjcmVhdGVJbnQoZm9sZGVkVmFsdWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gY3JlYXRlRG91YmxlKGZvbGRlZFZhbHVlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgQ29uc3RhbnRWYWx1ZSByZXN1bHQgPSBfZm9sZChsZWZ0LCByaWdodCk7CiAgICBpZiAocmVzdWx0ID09IG51bGwpIHJldHVybiByZXN1bHQ7CiAgICByZXR1cm4gX2NvbnZlcnRUb0phdmFTY3JpcHRDb25zdGFudChyZXN1bHQpOwogIH0KCiAgYm9vbCBpc0RpdmlkZSgpID0+IGZhbHNlOwogIGJvb2wgaXNUcnVuY2F0aW5nRGl2aWRlKCkgPT4gZmFsc2U7CiAgZm9sZEludHMoQmlnSW50IGxlZnQsIEJpZ0ludCByaWdodCk7CiAgZm9sZE51bXMobnVtIGxlZnQsIG51bSByaWdodCk7Cn0KCmNsYXNzIFN1YnRyYWN0T3BlcmF0aW9uIGV4dGVuZHMgQXJpdGhtZXRpY051bU9wZXJhdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAnLSc7CgogIGNvbnN0IFN1YnRyYWN0T3BlcmF0aW9uKCk7CgogIEBvdmVycmlkZQogIEJpZ0ludCBmb2xkSW50cyhCaWdJbnQgbGVmdCwgQmlnSW50IHJpZ2h0KSA9PiBsZWZ0IC0gcmlnaHQ7CgogIEBvdmVycmlkZQogIG51bSBmb2xkTnVtcyhudW0gbGVmdCwgbnVtIHJpZ2h0KSA9PiBsZWZ0IC0gcmlnaHQ7CgogIEBvdmVycmlkZQogIGFwcGx5KGxlZnQsIHJpZ2h0KSA9PiBsZWZ0IC0gcmlnaHQ7Cn0KCmNsYXNzIE11bHRpcGx5T3BlcmF0aW9uIGV4dGVuZHMgQXJpdGhtZXRpY051bU9wZXJhdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAnKic7CgogIGNvbnN0IE11bHRpcGx5T3BlcmF0aW9uKCk7CgogIEBvdmVycmlkZQogIEJpZ0ludCBmb2xkSW50cyhCaWdJbnQgbGVmdCwgQmlnSW50IHJpZ2h0KSA9PiBsZWZ0ICogcmlnaHQ7CgogIEBvdmVycmlkZQogIG51bSBmb2xkTnVtcyhudW0gbGVmdCwgbnVtIHJpZ2h0KSA9PiBsZWZ0ICogcmlnaHQ7CgogIEBvdmVycmlkZQogIGFwcGx5KGxlZnQsIHJpZ2h0KSA9PiBsZWZ0ICogcmlnaHQ7Cn0KCmNsYXNzIE1vZHVsb09wZXJhdGlvbiBleHRlbmRzIEFyaXRobWV0aWNOdW1PcGVyYXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gJyUnOwoKICBjb25zdCBNb2R1bG9PcGVyYXRpb24oKTsKCiAgQG92ZXJyaWRlCiAgQmlnSW50IGZvbGRJbnRzKEJpZ0ludCBsZWZ0LCBCaWdJbnQgcmlnaHQpIHsKICAgIGlmIChyaWdodCA9PSBCaWdJbnQuemVybykgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gbGVmdCAlIHJpZ2h0OwogIH0KCiAgQG92ZXJyaWRlCiAgbnVtIGZvbGROdW1zKG51bSBsZWZ0LCBudW0gcmlnaHQpID0+IGxlZnQgJSByaWdodDsKCiAgQG92ZXJyaWRlCiAgYXBwbHkobGVmdCwgcmlnaHQpID0+IGxlZnQgJSByaWdodDsKfQoKY2xhc3MgUmVtYWluZGVyT3BlcmF0aW9uIGV4dGVuZHMgQXJpdGhtZXRpY051bU9wZXJhdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAncmVtYWluZGVyJzsKCiAgY29uc3QgUmVtYWluZGVyT3BlcmF0aW9uKCk7CgogIEBvdmVycmlkZQogIEJpZ0ludCBmb2xkSW50cyhCaWdJbnQgbGVmdCwgQmlnSW50IHJpZ2h0KSB7CiAgICBpZiAocmlnaHQgPT0gQmlnSW50Lnplcm8pIHJldHVybiBudWxsOwogICAgcmV0dXJuIGxlZnQucmVtYWluZGVyKHJpZ2h0KTsKICB9CgogIEBvdmVycmlkZQogIG51bSBmb2xkTnVtcyhudW0gbGVmdCwgbnVtIHJpZ2h0KSA9PiBsZWZ0LnJlbWFpbmRlcihyaWdodCk7CgogIEBvdmVycmlkZQogIGFwcGx5KGxlZnQsIHJpZ2h0KSA9PiBsZWZ0LnJlbWFpbmRlcihyaWdodCk7Cn0KCmNsYXNzIFRydW5jYXRpbmdEaXZpZGVPcGVyYXRpb24gZXh0ZW5kcyBBcml0aG1ldGljTnVtT3BlcmF0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZSA9ICd+Lyc7CgogIGNvbnN0IFRydW5jYXRpbmdEaXZpZGVPcGVyYXRpb24oKTsKCiAgQG92ZXJyaWRlCiAgQmlnSW50IGZvbGRJbnRzKEJpZ0ludCBsZWZ0LCBCaWdJbnQgcmlnaHQpIHsKICAgIGlmIChyaWdodCA9PSBCaWdJbnQuemVybykgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gbGVmdCB+LyByaWdodDsKICB9CgogIEBvdmVycmlkZQogIEJpZ0ludCBmb2xkTnVtcyhudW0gbGVmdCwgbnVtIHJpZ2h0KSB7CiAgICBudW0gcmF0aW8gPSBsZWZ0IC8gcmlnaHQ7CiAgICBpZiAocmF0aW8uaXNOYU4gfHwgcmF0aW8uaXNJbmZpbml0ZSkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gbmV3IEJpZ0ludC5mcm9tKHJhdGlvLnRydW5jYXRlKCkudG9JbnQoKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBhcHBseShsZWZ0LCByaWdodCkgPT4gbGVmdCB+LyByaWdodDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1RydW5jYXRpbmdEaXZpZGUoKSA9PiB0cnVlOwp9CgpjbGFzcyBEaXZpZGVPcGVyYXRpb24gZXh0ZW5kcyBBcml0aG1ldGljTnVtT3BlcmF0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZSA9ICcvJzsKCiAgY29uc3QgRGl2aWRlT3BlcmF0aW9uKCk7CgogIEBvdmVycmlkZQogIGRvdWJsZSBmb2xkSW50cyhCaWdJbnQgbGVmdCwgQmlnSW50IHJpZ2h0KSA9PiBsZWZ0IC8gcmlnaHQ7CgogIEBvdmVycmlkZQogIG51bSBmb2xkTnVtcyhudW0gbGVmdCwgbnVtIHJpZ2h0KSA9PiBsZWZ0IC8gcmlnaHQ7CgogIEBvdmVycmlkZQogIGJvb2wgaXNEaXZpZGUoKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBhcHBseShsZWZ0LCByaWdodCkgPT4gbGVmdCAvIHJpZ2h0Owp9CgpjbGFzcyBBZGRPcGVyYXRpb24gaW1wbGVtZW50cyBCaW5hcnlPcGVyYXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gJysnOwoKICBjb25zdCBBZGRPcGVyYXRpb24oKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBmb2xkKENvbnN0YW50VmFsdWUgbGVmdCwgQ29uc3RhbnRWYWx1ZSByaWdodCkgewogICAgQ29uc3RhbnRWYWx1ZSBfZm9sZChDb25zdGFudFZhbHVlIGxlZnQsIENvbnN0YW50VmFsdWUgcmlnaHQpIHsKICAgICAgaWYgKGxlZnQuaXNJbnQgJiYgcmlnaHQuaXNJbnQpIHsKICAgICAgICBJbnRDb25zdGFudFZhbHVlIGxlZnRJbnQgPSBsZWZ0OwogICAgICAgIEludENvbnN0YW50VmFsdWUgcmlnaHRJbnQgPSByaWdodDsKICAgICAgICBCaWdJbnQgcmVzdWx0ID0gbGVmdEludC5pbnRWYWx1ZSArIHJpZ2h0SW50LmludFZhbHVlOwogICAgICAgIHJldHVybiBjcmVhdGVJbnQocmVzdWx0KTsKICAgICAgfSBlbHNlIGlmIChsZWZ0LmlzTnVtICYmIHJpZ2h0LmlzTnVtKSB7CiAgICAgICAgTnVtQ29uc3RhbnRWYWx1ZSBsZWZ0TnVtID0gbGVmdDsKICAgICAgICBOdW1Db25zdGFudFZhbHVlIHJpZ2h0TnVtID0gcmlnaHQ7CiAgICAgICAgZG91YmxlIHJlc3VsdCA9IGxlZnROdW0uZG91YmxlVmFsdWUgKyByaWdodE51bS5kb3VibGVWYWx1ZTsKICAgICAgICByZXR1cm4gY3JlYXRlRG91YmxlKHJlc3VsdCk7CiAgICAgIH0gZWxzZSBpZiAobGVmdC5pc1N0cmluZyAmJiByaWdodC5pc1N0cmluZykgewogICAgICAgIFN0cmluZ0NvbnN0YW50VmFsdWUgbGVmdFN0cmluZyA9IGxlZnQ7CiAgICAgICAgU3RyaW5nQ29uc3RhbnRWYWx1ZSByaWdodFN0cmluZyA9IHJpZ2h0OwogICAgICAgIFN0cmluZyByZXN1bHQgPSBsZWZ0U3RyaW5nLnN0cmluZ1ZhbHVlICsgcmlnaHRTdHJpbmcuc3RyaW5nVmFsdWU7CiAgICAgICAgcmV0dXJuIGNyZWF0ZVN0cmluZyhyZXN1bHQpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CgogICAgQ29uc3RhbnRWYWx1ZSByZXN1bHQgPSBfZm9sZChsZWZ0LCByaWdodCk7CiAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmlzTnVtKSB7CiAgICAgIHJldHVybiBfY29udmVydFRvSmF2YVNjcmlwdENvbnN0YW50KHJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgYXBwbHkobGVmdCwgcmlnaHQpID0+IGxlZnQgKyByaWdodDsKfQoKYWJzdHJhY3QgY2xhc3MgUmVsYXRpb25hbE51bU9wZXJhdGlvbiBpbXBsZW1lbnRzIEJpbmFyeU9wZXJhdGlvbiB7CiAgY29uc3QgUmVsYXRpb25hbE51bU9wZXJhdGlvbigpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGZvbGQoQ29uc3RhbnRWYWx1ZSBsZWZ0LCBDb25zdGFudFZhbHVlIHJpZ2h0KSB7CiAgICBpZiAoIWxlZnQuaXNOdW0gfHwgIXJpZ2h0LmlzTnVtKSByZXR1cm4gbnVsbDsKICAgIGJvb2wgZm9sZGVkVmFsdWU7CiAgICBpZiAobGVmdC5pc0ludCAmJiByaWdodC5pc0ludCkgewogICAgICBJbnRDb25zdGFudFZhbHVlIGxlZnRJbnQgPSBsZWZ0OwogICAgICBJbnRDb25zdGFudFZhbHVlIHJpZ2h0SW50ID0gcmlnaHQ7CiAgICAgIGZvbGRlZFZhbHVlID0gZm9sZEludHMobGVmdEludC5pbnRWYWx1ZSwgcmlnaHRJbnQuaW50VmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgTnVtQ29uc3RhbnRWYWx1ZSBsZWZ0TnVtID0gbGVmdDsKICAgICAgTnVtQ29uc3RhbnRWYWx1ZSByaWdodE51bSA9IHJpZ2h0OwogICAgICBmb2xkZWRWYWx1ZSA9IGZvbGROdW1zKGxlZnROdW0uZG91YmxlVmFsdWUsIHJpZ2h0TnVtLmRvdWJsZVZhbHVlKTsKICAgIH0KICAgIGFzc2VydChmb2xkZWRWYWx1ZSAhPSBudWxsKTsKICAgIHJldHVybiBjcmVhdGVCb29sKGZvbGRlZFZhbHVlKTsKICB9CgogIGJvb2wgZm9sZEludHMoQmlnSW50IGxlZnQsIEJpZ0ludCByaWdodCk7CiAgYm9vbCBmb2xkTnVtcyhudW0gbGVmdCwgbnVtIHJpZ2h0KTsKfQoKY2xhc3MgTGVzc09wZXJhdGlvbiBleHRlbmRzIFJlbGF0aW9uYWxOdW1PcGVyYXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gJzwnOwoKICBjb25zdCBMZXNzT3BlcmF0aW9uKCk7CgogIEBvdmVycmlkZQogIGJvb2wgZm9sZEludHMoQmlnSW50IGxlZnQsIEJpZ0ludCByaWdodCkgPT4gbGVmdCA8IHJpZ2h0OwoKICBAb3ZlcnJpZGUKICBib29sIGZvbGROdW1zKG51bSBsZWZ0LCBudW0gcmlnaHQpID0+IGxlZnQgPCByaWdodDsKCiAgQG92ZXJyaWRlCiAgYXBwbHkobGVmdCwgcmlnaHQpID0+IGxlZnQgPCByaWdodDsKfQoKY2xhc3MgTGVzc0VxdWFsT3BlcmF0aW9uIGV4dGVuZHMgUmVsYXRpb25hbE51bU9wZXJhdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAnPD0nOwoKICBjb25zdCBMZXNzRXF1YWxPcGVyYXRpb24oKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBmb2xkSW50cyhCaWdJbnQgbGVmdCwgQmlnSW50IHJpZ2h0KSA9PiBsZWZ0IDw9IHJpZ2h0OwoKICBAb3ZlcnJpZGUKICBib29sIGZvbGROdW1zKG51bSBsZWZ0LCBudW0gcmlnaHQpID0+IGxlZnQgPD0gcmlnaHQ7CgogIEBvdmVycmlkZQogIGFwcGx5KGxlZnQsIHJpZ2h0KSA9PiBsZWZ0IDw9IHJpZ2h0Owp9CgpjbGFzcyBHcmVhdGVyT3BlcmF0aW9uIGV4dGVuZHMgUmVsYXRpb25hbE51bU9wZXJhdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAnPic7CgogIGNvbnN0IEdyZWF0ZXJPcGVyYXRpb24oKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBmb2xkSW50cyhCaWdJbnQgbGVmdCwgQmlnSW50IHJpZ2h0KSA9PiBsZWZ0ID4gcmlnaHQ7CgogIEBvdmVycmlkZQogIGJvb2wgZm9sZE51bXMobnVtIGxlZnQsIG51bSByaWdodCkgPT4gbGVmdCA+IHJpZ2h0OwoKICBAb3ZlcnJpZGUKICBhcHBseShsZWZ0LCByaWdodCkgPT4gbGVmdCA+IHJpZ2h0Owp9CgpjbGFzcyBHcmVhdGVyRXF1YWxPcGVyYXRpb24gZXh0ZW5kcyBSZWxhdGlvbmFsTnVtT3BlcmF0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZSA9ICc+PSc7CgogIGNvbnN0IEdyZWF0ZXJFcXVhbE9wZXJhdGlvbigpOwoKICBAb3ZlcnJpZGUKICBib29sIGZvbGRJbnRzKEJpZ0ludCBsZWZ0LCBCaWdJbnQgcmlnaHQpID0+IGxlZnQgPj0gcmlnaHQ7CgogIEBvdmVycmlkZQogIGJvb2wgZm9sZE51bXMobnVtIGxlZnQsIG51bSByaWdodCkgPT4gbGVmdCA+PSByaWdodDsKCiAgQG92ZXJyaWRlCiAgYXBwbHkobGVmdCwgcmlnaHQpID0+IGxlZnQgPj0gcmlnaHQ7Cn0KCmNsYXNzIEVxdWFsc09wZXJhdGlvbiBpbXBsZW1lbnRzIEJpbmFyeU9wZXJhdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAnPT0nOwoKICBjb25zdCBFcXVhbHNPcGVyYXRpb24oKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBmb2xkKENvbnN0YW50VmFsdWUgbGVmdCwgQ29uc3RhbnRWYWx1ZSByaWdodCkgewogICAgLy8gTnVtYmVycyBuZWVkIHRvIGJlIHRyZWF0ZWQgc3BlY2lhbGx5IGJlY2F1c2U6IE5hTiAhPSBOYU4sIC0wLjAgPT0gMC4wLAogICAgLy8gYW5kIDEgPT0gMS4wLgogICAgaWYgKGxlZnQuaXNJbnQgJiYgcmlnaHQuaXNJbnQpIHsKICAgICAgSW50Q29uc3RhbnRWYWx1ZSBsZWZ0SW50ID0gbGVmdDsKICAgICAgSW50Q29uc3RhbnRWYWx1ZSByaWdodEludCA9IHJpZ2h0OwogICAgICBib29sIHJlc3VsdCA9IGxlZnRJbnQuaW50VmFsdWUgPT0gcmlnaHRJbnQuaW50VmFsdWU7CiAgICAgIHJldHVybiBjcmVhdGVCb29sKHJlc3VsdCk7CiAgICB9CgogICAgaWYgKGxlZnQuaXNOdW0gJiYgcmlnaHQuaXNOdW0pIHsKICAgICAgTnVtQ29uc3RhbnRWYWx1ZSBsZWZ0TnVtID0gbGVmdDsKICAgICAgTnVtQ29uc3RhbnRWYWx1ZSByaWdodE51bSA9IHJpZ2h0OwogICAgICBib29sIHJlc3VsdCA9IGxlZnROdW0uZG91YmxlVmFsdWUgPT0gcmlnaHROdW0uZG91YmxlVmFsdWU7CiAgICAgIHJldHVybiBjcmVhdGVCb29sKHJlc3VsdCk7CiAgICB9CgogICAgaWYgKGxlZnQuaXNDb25zdHJ1Y3RlZE9iamVjdCkgewogICAgICBpZiAocmlnaHQuaXNOdWxsKSB7CiAgICAgICAgcmV0dXJuIGNyZWF0ZUJvb2woZmFsc2UpOwogICAgICB9CiAgICAgIC8vIFVubGVzcyB3ZSBrbm93IHRoYXQgdGhlIHVzZXItZGVmaW5lZCBvYmplY3QgZG9lcyBub3QgaW1wbGVtZW50IHRoZQogICAgICAvLyBlcXVhbGl0eSBvcGVyYXRvciB3ZSBjYW5ub3QgZm9sZCBoZXJlLgogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICByZXR1cm4gY3JlYXRlQm9vbChsZWZ0ID09IHJpZ2h0KTsKICB9CgogIEBvdmVycmlkZQogIGFwcGx5KGxlZnQsIHJpZ2h0KSA9PiBsZWZ0ID09IHJpZ2h0Owp9CgpjbGFzcyBJZGVudGl0eU9wZXJhdGlvbiBpbXBsZW1lbnRzIEJpbmFyeU9wZXJhdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAnPT09JzsKCiAgY29uc3QgSWRlbnRpdHlPcGVyYXRpb24oKTsKCiAgQG92ZXJyaWRlCiAgQm9vbENvbnN0YW50VmFsdWUgZm9sZChDb25zdGFudFZhbHVlIGxlZnQsIENvbnN0YW50VmFsdWUgcmlnaHQpIHsKICAgIEJvb2xDb25zdGFudFZhbHVlIF9mb2xkKENvbnN0YW50VmFsdWUgbGVmdCwgQ29uc3RhbnRWYWx1ZSByaWdodCkgewogICAgICAvLyBJbiBvcmRlciB0byBwcmVzZXJ2ZSBydW50aW1lIHNlbWFudGljcyB3aGljaCBzYXlzIHRoYXQgTmFOICE9PSBOYU4KICAgICAgLy8gZG9uJ3QgY29uc3RhbnQgZm9sZCBOYU4gPT09IE5hTi4gT3RoZXJ3aXNlIHRoZSBvdXRwdXQgZGVwZW5kcyBvbgogICAgICAvLyBpbmxpbmVkIHZhcmlhYmxlcyBhbmQgb3RoZXIgb3B0aW1pemF0aW9ucy4KICAgICAgaWYgKGxlZnQuaXNOYU4gJiYgcmlnaHQuaXNOYU4pIHJldHVybiBuZXcgRmFsc2VDb25zdGFudFZhbHVlKCk7CiAgICAgIHJldHVybiBjcmVhdGVCb29sKGxlZnQgPT0gcmlnaHQpOwogICAgfQoKICAgIEJvb2xDb25zdGFudFZhbHVlIHJlc3VsdCA9IF9mb2xkKGxlZnQsIHJpZ2h0KTsKICAgIGlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuYm9vbFZhbHVlKSByZXR1cm4gcmVzdWx0OwogICAgLy8gSW4gSmF2YVNjcmlwdCAtMC4wID09PSAwIGFuZCBhbGwgZG91YmxlcyBhcmUgZXF1YWwgdG8gdGhlaXIgaW50ZWdlcgogICAgLy8gdmFsdWVzLiBGdXJ0aGVybW9yZSBOYU4gIT09IE5hTi4KICAgIGlmIChsZWZ0LmlzSW50ICYmIHJpZ2h0LmlzSW50KSB7CiAgICAgIEludENvbnN0YW50VmFsdWUgbGVmdEludCA9IGxlZnQ7CiAgICAgIEludENvbnN0YW50VmFsdWUgcmlnaHRJbnQgPSByaWdodDsKICAgICAgcmV0dXJuIG5ldyBCb29sQ29uc3RhbnRWYWx1ZShsZWZ0SW50LmludFZhbHVlID09IHJpZ2h0SW50LmludFZhbHVlKTsKICAgIH0KICAgIGlmIChsZWZ0LmlzTnVtICYmIHJpZ2h0LmlzTnVtKSB7CiAgICAgIE51bUNvbnN0YW50VmFsdWUgbGVmdE51bSA9IGxlZnQ7CiAgICAgIE51bUNvbnN0YW50VmFsdWUgcmlnaHROdW0gPSByaWdodDsKICAgICAgZG91YmxlIGxlZnREb3VibGUgPSBsZWZ0TnVtLmRvdWJsZVZhbHVlOwogICAgICBkb3VibGUgcmlnaHREb3VibGUgPSByaWdodE51bS5kb3VibGVWYWx1ZTsKICAgICAgcmV0dXJuIG5ldyBCb29sQ29uc3RhbnRWYWx1ZShsZWZ0RG91YmxlID09IHJpZ2h0RG91YmxlKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBhcHBseShsZWZ0LCByaWdodCkgPT4gaWRlbnRpY2FsKGxlZnQsIHJpZ2h0KTsKfQoKY2xhc3MgSWZOdWxsT3BlcmF0aW9uIGltcGxlbWVudHMgQmluYXJ5T3BlcmF0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZSA9ICc/Pyc7CgogIGNvbnN0IElmTnVsbE9wZXJhdGlvbigpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGZvbGQoQ29uc3RhbnRWYWx1ZSBsZWZ0LCBDb25zdGFudFZhbHVlIHJpZ2h0KSB7CiAgICBpZiAobGVmdC5pc051bGwpIHJldHVybiByaWdodDsKICAgIHJldHVybiBsZWZ0OwogIH0KCiAgQG92ZXJyaWRlCiAgYXBwbHkobGVmdCwgcmlnaHQpID0+IGxlZnQgPz8gcmlnaHQ7Cn0KCmNsYXNzIENvZGVVbml0QXRPcGVyYXRpb24gaW1wbGVtZW50cyBCaW5hcnlPcGVyYXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gJ2NoYXJDb2RlQXQnOwoKICBjb25zdCBDb2RlVW5pdEF0T3BlcmF0aW9uKCk7CgogIEBvdmVycmlkZQogIEludENvbnN0YW50VmFsdWUgZm9sZChDb25zdGFudFZhbHVlIGxlZnQsIENvbnN0YW50VmFsdWUgcmlnaHQpIHsKICAgIGlmIChsZWZ0LmlzU3RyaW5nICYmIHJpZ2h0LmlzSW50KSB7CiAgICAgIFN0cmluZ0NvbnN0YW50VmFsdWUgc3RyaW5nQ29uc3RhbnQgPSBsZWZ0OwogICAgICBJbnRDb25zdGFudFZhbHVlIGluZGV4Q29uc3RhbnQgPSByaWdodDsKICAgICAgU3RyaW5nIHN0cmluZyA9IHN0cmluZ0NvbnN0YW50LnN0cmluZ1ZhbHVlOwogICAgICBpbnQgaW5kZXggPSBpbmRleENvbnN0YW50LmludFZhbHVlLnRvSW50KCk7CiAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIG51bGw7CiAgICAgIGludCB2YWx1ZSA9IHN0cmluZy5jb2RlVW5pdEF0KGluZGV4KTsKICAgICAgcmV0dXJuIGNyZWF0ZUludEZyb21JbnQodmFsdWUpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBhcHBseShsZWZ0LCByaWdodCkgPT4gbGVmdC5jb2RlVW5pdEF0KHJpZ2h0KTsKfQoKY2xhc3MgUm91bmRPcGVyYXRpb24gaW1wbGVtZW50cyBVbmFyeU9wZXJhdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAncm91bmQnOwoKICBjb25zdCBSb3VuZE9wZXJhdGlvbigpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGZvbGQoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgLy8gQmUgY2FyZWZ1bCB0byByb3VuZCgpIG9ubHkgdmFsdWVzIHRoYXQgZG8gbm90IHRocm93IG9uIGVpdGhlciB0aGUgaG9zdCBvcgogICAgLy8gdGFyZ2V0IHBsYXRmb3JtLgogICAgQ29uc3RhbnRWYWx1ZSB0cnlUb1JvdW5kKGRvdWJsZSB2YWx1ZSkgewogICAgICAvLyBEdWUgdG8gZGlmZmVyZW5jZXMgYmV0d2VlbiBicm93c2Vycywgb25seSAncm91bmQnIGVhc3kgY2FzZXMuIEF2b2lkCiAgICAgIC8vIGNhc2VzIHdoZXJlIG51ZGdpbmcgdGhlIHZhbHVlIHVwIG9yIGRvd24gY2hhbmdlcyB0aGUgYW5zd2VyLgogICAgICAvLyAxMyBkaWdpdHMgaXMgc2FmZWx5IHdpdGhpbiB0aGUgfjE1IGRpZ2l0IHByZWNpc2lvbiBvZiBkb3VibGVzLgogICAgICBjb25zdCBzZXZlcmFsVUxQID0gMC4wMDAwMDAwMDAwMDAxOwogICAgICAvLyBVc2UgJ3JvdW5kVG9Eb3VibGUoKScgdG8gYXZvaWQgZXhjZXB0aW9ucyBvbiByb3VuZGluZyB0aGUgbnVkZ2VkIHZhbHVlLgogICAgICBkb3VibGUgcm91bmRlZCA9IHZhbHVlLnJvdW5kVG9Eb3VibGUoKTsKICAgICAgZG91YmxlIHJvdW5kZWQxID0gKHZhbHVlICogKDEuMCArIHNldmVyYWxVTFApKS5yb3VuZFRvRG91YmxlKCk7CiAgICAgIGRvdWJsZSByb3VuZGVkMiA9ICh2YWx1ZSAqICgxLjAgLSBzZXZlcmFsVUxQKSkucm91bmRUb0RvdWJsZSgpOwogICAgICBpZiAocm91bmRlZCAhPSByb3VuZGVkMSB8fCByb3VuZGVkICE9IHJvdW5kZWQyKSByZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuIF9jb252ZXJ0VG9KYXZhU2NyaXB0Q29uc3RhbnQoCiAgICAgICAgICBuZXcgSW50Q29uc3RhbnRWYWx1ZShuZXcgQmlnSW50LmZyb20odmFsdWUucm91bmQoKSkpKTsKICAgIH0KCiAgICBpZiAoY29uc3RhbnQuaXNJbnQpIHsKICAgICAgSW50Q29uc3RhbnRWYWx1ZSBpbnRDb25zdGFudCA9IGNvbnN0YW50OwogICAgICBkb3VibGUgdmFsdWUgPSBpbnRDb25zdGFudC5pbnRWYWx1ZS50b0RvdWJsZSgpOwogICAgICBpZiAodmFsdWUgPj0gLWRvdWJsZS5tYXhGaW5pdGUgJiYgdmFsdWUgPD0gZG91YmxlLm1heEZpbml0ZSkgewogICAgICAgIHJldHVybiB0cnlUb1JvdW5kKHZhbHVlKTsKICAgICAgfQogICAgfQogICAgaWYgKGNvbnN0YW50LmlzRG91YmxlKSB7CiAgICAgIERvdWJsZUNvbnN0YW50VmFsdWUgZG91YmxlQ29uc3RhbnQgPSBjb25zdGFudDsKICAgICAgZG91YmxlIHZhbHVlID0gZG91YmxlQ29uc3RhbnQuZG91YmxlVmFsdWU7CiAgICAgIC8vIE5hTiBhbmQgaW5maW5pdGllcyB3aWxsIHRocm93LgogICAgICBpZiAodmFsdWUuaXNOYU4pIHJldHVybiBudWxsOwogICAgICBpZiAodmFsdWUuaXNJbmZpbml0ZSkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiB0cnlUb1JvdW5kKHZhbHVlKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KfQoKY2xhc3MgVW5mb2xkZWRVbmFyeU9wZXJhdGlvbiBpbXBsZW1lbnRzIFVuYXJ5T3BlcmF0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgY29uc3QgVW5mb2xkZWRVbmFyeU9wZXJhdGlvbih0aGlzLm5hbWUpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGZvbGQoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgcmV0dXJuIG51bGw7CiAgfQp9CgpjbGFzcyBKYXZhU2NyaXB0U2V0Q29uc3RhbnQgZXh0ZW5kcyBTZXRDb25zdGFudFZhbHVlIHsKICBmaW5hbCBNYXBDb25zdGFudFZhbHVlIGVudHJpZXM7CgogIEphdmFTY3JpcHRTZXRDb25zdGFudChJbnRlcmZhY2VUeXBlIHR5cGUsIHRoaXMuZW50cmllcykKICAgICAgOiBzdXBlcih0eXBlLCBlbnRyaWVzLmtleXMpOwoKICBAb3ZlcnJpZGUKICBMaXN0PENvbnN0YW50VmFsdWU+IGdldERlcGVuZGVuY2llcygpID0+IFtlbnRyaWVzXTsKfQoKY2xhc3MgSmF2YVNjcmlwdE1hcENvbnN0YW50IGV4dGVuZHMgTWFwQ29uc3RhbnRWYWx1ZSB7CiAgLy8vIFRoZSBbUFJPVE9fUFJPUEVSVFldIG11c3Qgbm90IGJlIHVzZWQgYXMgbm9ybWFsIHByb3BlcnR5IGluIGFueSBKYXZhU2NyaXB0CiAgLy8vIG9iamVjdC4gSXQgd291bGQgY2hhbmdlIHRoZSBwcm90b3R5cGUgY2hhaW4uCiAgc3RhdGljIGNvbnN0IFN0cmluZyBQUk9UT19QUk9QRVJUWSA9ICJfX3Byb3RvX18iOwoKICAvLy8gVGhlIGRhcnQgY2xhc3MgaW1wbGVtZW50aW5nIGNvbnN0YW50IG1hcCBsaXRlcmFscy4KICBzdGF0aWMgY29uc3QgU3RyaW5nIERBUlRfQ0xBU1MgPSAiQ29uc3RhbnRNYXAiOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgREFSVF9TVFJJTkdfQ0xBU1MgPSAiQ29uc3RhbnRTdHJpbmdNYXAiOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgREFSVF9QUk9UT19DTEFTUyA9ICJDb25zdGFudFByb3RvTWFwIjsKICBzdGF0aWMgY29uc3QgU3RyaW5nIERBUlRfR0VORVJBTF9DTEFTUyA9ICJHZW5lcmFsQ29uc3RhbnRNYXAiOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgTEVOR1RIX05BTUUgPSAiX2xlbmd0aCI7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBKU19PQkpFQ1RfTkFNRSA9ICJfanNPYmplY3QiOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgS0VZU19OQU1FID0gIl9rZXlzIjsKICBzdGF0aWMgY29uc3QgU3RyaW5nIFBST1RPX1ZBTFVFID0gIl9wcm90b1ZhbHVlIjsKICBzdGF0aWMgY29uc3QgU3RyaW5nIEpTX0RBVEFfTkFNRSA9ICJfanNEYXRhIjsKCiAgZmluYWwgTGlzdENvbnN0YW50VmFsdWUga2V5TGlzdDsKICBmaW5hbCBDb25zdGFudFZhbHVlIHByb3RvVmFsdWU7CiAgZmluYWwgYm9vbCBvbmx5U3RyaW5nS2V5czsKCiAgSmF2YVNjcmlwdE1hcENvbnN0YW50KEludGVyZmFjZVR5cGUgdHlwZSwgTGlzdENvbnN0YW50VmFsdWUga2V5TGlzdCwKICAgICAgTGlzdDxDb25zdGFudFZhbHVlPiB2YWx1ZXMsIHRoaXMucHJvdG9WYWx1ZSwgdGhpcy5vbmx5U3RyaW5nS2V5cykKICAgICAgOiB0aGlzLmtleUxpc3QgPSBrZXlMaXN0LAogICAgICAgIHN1cGVyKHR5cGUsIGtleUxpc3QuZW50cmllcywgdmFsdWVzKTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc01hcCA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBMaXN0PENvbnN0YW50VmFsdWU+IGdldERlcGVuZGVu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Jy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2RlZmVycmVkX2xvYWQuZGFydCcgc2hvdyBPdXRwdXRVbml0OwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JzsKCmVudW0gQ29uc3RhbnRWYWx1ZUtpbmQgewogIEZVTkNUSU9OLAogIE5VTEwsCiAgSU5ULAogIERPVUJMRSwKICBCT09MLAogIFNUUklORywKICBMSVNULAogIFNFVCwKICBNQVAsCiAgQ09OU1RSVUNURUQsCiAgVFlQRSwKICBJTlRFUkNFUFRPUiwKICBTWU5USEVUSUMsCiAgSU5TVEFOVElBVElPTiwKICBERUZFUlJFRF9HTE9CQUwsCiAgTk9OX0NPTlNUQU5ULAp9CgphYnN0cmFjdCBjbGFzcyBDb25zdGFudFZhbHVlVmlzaXRvcjxSLCBBPiB7CiAgY29uc3QgQ29uc3RhbnRWYWx1ZVZpc2l0b3IoKTsKCiAgUiB2aXNpdEZ1bmN0aW9uKGNvdmFyaWFudCBGdW5jdGlvbkNvbnN0YW50VmFsdWUgY29uc3RhbnQsIGNvdmFyaWFudCBBIGFyZyk7CiAgUiB2aXNpdE51bGwoY292YXJpYW50IE51bGxDb25zdGFudFZhbHVlIGNvbnN0YW50LCBjb3ZhcmlhbnQgQSBhcmcpOwogIFIgdmlzaXRJbnQoY292YXJpYW50IEludENvbnN0YW50VmFsdWUgY29uc3RhbnQsIGNvdmFyaWFudCBBIGFyZyk7CiAgUiB2aXNpdERvdWJsZShjb3ZhcmlhbnQgRG91YmxlQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgY292YXJpYW50IEEgYXJnKTsKICBSIHZpc2l0Qm9vbChjb3ZhcmlhbnQgQm9vbENvbnN0YW50VmFsdWUgY29uc3RhbnQsIGNvdmFyaWFudCBBIGFyZyk7CiAgUiB2aXNpdFN0cmluZyhjb3ZhcmlhbnQgU3RyaW5nQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgY292YXJpYW50IEEgYXJnKTsKICBSIHZpc2l0TGlzdChjb3ZhcmlhbnQgTGlzdENvbnN0YW50VmFsdWUgY29uc3RhbnQsIGNvdmFyaWFudCBBIGFyZyk7CiAgUiB2aXNpdFNldChjb3ZhcmlhbnQgU2V0Q29uc3RhbnRWYWx1ZSBjb25zdGFudCwgY292YXJpYW50IEEgYXJnKTsKICBSIHZpc2l0TWFwKGNvdmFyaWFudCBNYXBDb25zdGFudFZhbHVlIGNvbnN0YW50LCBjb3ZhcmlhbnQgQSBhcmcpOwogIFIgdmlzaXRDb25zdHJ1Y3RlZCgKICAgICAgY292YXJpYW50IENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgY292YXJpYW50IEEgYXJnKTsKICBSIHZpc2l0VHlwZShjb3ZhcmlhbnQgVHlwZUNvbnN0YW50VmFsdWUgY29uc3RhbnQsIGNvdmFyaWFudCBBIGFyZyk7CiAgUiB2aXNpdEludGVyY2VwdG9yKAogICAgICBjb3ZhcmlhbnQgSW50ZXJjZXB0b3JDb25zdGFudFZhbHVlIGNvbnN0YW50LCBjb3ZhcmlhbnQgQSBhcmcpOwogIFIgdmlzaXRTeW50aGV0aWMoY292YXJpYW50IFN5bnRoZXRpY0NvbnN0YW50VmFsdWUgY29uc3RhbnQsIGNvdmFyaWFudCBBIGFyZyk7CiAgUiB2aXNpdERlZmVycmVkR2xvYmFsKAogICAgICBjb3ZhcmlhbnQgRGVmZXJyZWRHbG9iYWxDb25zdGFudFZhbHVlIGNvbnN0YW50LCBjb3ZhcmlhbnQgQSBhcmcpOwogIFIgdmlzaXROb25Db25zdGFudChjb3ZhcmlhbnQgTm9uQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgY292YXJpYW50IEEgYXJnKTsKICBSIHZpc2l0SW5zdGFudGlhdGlvbigKICAgICAgY292YXJpYW50IEluc3RhbnRpYXRpb25Db25zdGFudFZhbHVlIGNvbnN0YW50LCBjb3ZhcmlhbnQgQSBhcmcpOwp9CgphYnN0cmFjdCBjbGFzcyBDb25zdGFudFZhbHVlIHsKICBjb25zdCBDb25zdGFudFZhbHVlKCk7CgogIC8vLyBgdHJ1ZWAgaWYgdGhpcyBpcyBhIHZhbGlkIGNvbnN0YW50IHZhbHVlLgogIGJvb2wgZ2V0IGlzQ29uc3RhbnQgPT4gdHJ1ZTsKCiAgYm9vbCBnZXQgaXNOdWxsID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzQm9vbCA9PiBmYWxzZTsKICBib29sIGdldCBpc1RydWUgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNGYWxzZSA9PiBmYWxzZTsKICBib29sIGdldCBpc0ludCA9PiBmYWxzZTsKICBib29sIGdldCBpc0RvdWJsZSA9PiBmYWxzZTsKICBib29sIGdldCBpc051bSA9PiBmYWxzZTsKICBib29sIGdldCBpc1N0cmluZyA9PiBmYWxzZTsKICBib29sIGdldCBpc0xpc3QgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNTZXQgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNNYXAgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNDb25zdHJ1Y3RlZE9iamVjdCA9PiBmYWxzZTsKICBib29sIGdldCBpc0Z1bmN0aW9uID0+IGZhbHNlOwoKICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjb25zdGFudCBpcyBudWxsLCBhIGJvb2wsIGEgbnVtYmVyIG9yIGEgc3RyaW5nLgogIGJvb2wgZ2V0IGlzUHJpbWl0aXZlID0+IGZhbHNlOwoKICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjb25zdGFudCBpcyBhIGxpc3QsIGEgbWFwIG9yIGEgY29uc3RydWN0ZWQgb2JqZWN0LgogIGJvb2wgZ2V0IGlzT2JqZWN0ID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzVHlwZSA9PiBmYWxzZTsKICBib29sIGdldCBpc0ludGVyY2VwdG9yID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzRHVtbXkgPT4gZmFsc2U7CgogIGJvb2wgZ2V0IGlzTmFOID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzTWludXNaZXJvID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzWmVybyA9PiBmYWxzZTsKICBib29sIGdldCBpc09uZSA9PiBmYWxzZTsKICBib29sIGdldCBpc1Bvc2l0aXZlSW5maW5pdHkgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNOZWdhdGl2ZUluZmluaXR5ID0+IGZhbHNlOwoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZXBsYWNlIHdpdGggYSAndHlwZScgZ2V0dGVyLgogIERhcnRUeXBlIGdldFR5cGUoQ29tbW9uRWxlbWVudHMgdHlwZXMpOwoKICBMaXN0PENvbnN0YW50VmFsdWU+IGdldERlcGVuZGVuY2llcygpOwoKICBhY2NlcHQoQ29uc3RhbnRWYWx1ZVZpc2l0b3IgdmlzaXRvciwgYXJnKTsKCiAgLy8vIFRoZSB2YWx1ZSBvZiB0aGlzIGNvbnN0YW50IGluIERhcnQgc3ludGF4LCBpZiBwb3NzaWJsZS4KICAvLy8KICAvLy8gRm9yIFtDb25zdHJ1Y3RlZENvbnN0YW50VmFsdWVdcyB0aGVyZSBpcyBubyB3YXkgdG8gY3JlYXRlIGEgdmFsaWQgY29uc3QKICAvLy8gZXhwcmVzc2lvbiBmcm9tIHRoZSB2YWx1ZSBzbyB0aGUgdW5wYXJzZSBvZiB0aGVzZSBpcyBiZXN0IGVmZm9ydC4KICAvLy8KICAvLy8gRm9yIHRoZSBzeW50aGV0aWMgY29uc3RhbnRzLCBbRGVmZXJyZWRDb25zdGFudFZhbHVlXSwKICAvLy8gW0RlZmVycmVkR2xvYmFsQ29uc3RhbnRWYWx1ZV0sIFtTeW50aGV0aWNDb25zdGFudFZhbHVlXSwKICAvLy8gW0ludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZV0gdGhlIHVucGFyc2UgaXMgZGVzY3JpcHRpdmUgb25seS4KICBTdHJpbmcgdG9EYXJ0VGV4dCgpOwoKICAvLy8gUmV0dXJucyBhIHN0cnVjdHVyZWQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb25zdGFudCBzdWl0ZWQgZm9yIGRlYnVnZ2luZy4KICBTdHJpbmcgdG9TdHJ1Y3R1cmVkVGV4dCgpOwoKICBDb25zdGFudFZhbHVlS2luZCBnZXQga2luZDsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgYXNzZXJ0RGVidWdNb2RlKCJVc2UgQ29uc3RhbnRWYWx1ZS50b0RhcnRUZXh0KCkgb3IgIgogICAgICAgICJDb25zdGFudFZhbHVlLnRvU3RydWN0dXJlZFRleHQoKSAiCiAgICAgICAgImluc3RlYWQgb2YgQ29uc3RhbnRWYWx1ZS50b1N0cmluZygpLiIpOwogICAgcmV0dXJuIHRvU3RydWN0dXJlZFRleHQoKTsKICB9Cn0KCmNsYXNzIEZ1bmN0aW9uQ29uc3RhbnRWYWx1ZSBleHRlbmRzIENvbnN0YW50VmFsdWUgewogIGZpbmFsIEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQ7CiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU2hvdWxkIHRoZSB0eXBlIGJlIGRlcml2ZWQgZnJvbSBbZWxlbWVudF0uCiAgZmluYWwgRnVuY3Rpb25UeXBlIHR5cGU7CgogIEZ1bmN0aW9uQ29uc3RhbnRWYWx1ZSh0aGlzLmVsZW1lbnQsIHRoaXMudHlwZSk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRnVuY3Rpb24gPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PSh2YXIgb3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyEgRnVuY3Rpb25Db25zdGFudFZhbHVlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gaWRlbnRpY2FsKG90aGVyLmVsZW1lbnQsIGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxDb25zdGFudFZhbHVlPiBnZXREZXBlbmRlbmNpZXMoKSA9PiBjb25zdCA8Q29uc3RhbnRWYWx1ZT5bXTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25UeXBlIGdldFR5cGUoQ29tbW9uRWxlbWVudHMgdHlwZXMpID0+IHR5cGU7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gKDE3ICogZWxlbWVudC5oYXNoQ29kZSkgJiAweDdmZmZmZmZmOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRWYWx1ZVZpc2l0b3IgdmlzaXRvciwgYXJnKSA9PiB2aXNpdG9yLnZpc2l0RnVuY3Rpb24odGhpcywgYXJnKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZUtpbmQgZ2V0IGtpbmQgPT4gQ29uc3RhbnRWYWx1ZUtpbmQuRlVOQ1RJT047CgogIEBvdmVycmlkZQogIFN0cmluZyB0b0RhcnRUZXh0KCkgewogICAgaWYgKGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCkgewogICAgICByZXR1cm4gJyR7ZWxlbWVudC5lbmNsb3NpbmdDbGFzcy5uYW1lfS4ke2VsZW1lbnQubmFtZX0nOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICcke2VsZW1lbnQubmFtZX0nOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RydWN0dXJlZFRleHQoKSB7CiAgICByZXR1cm4gJ0Z1bmN0aW9uQ29uc3RhbnQoJHt0b0RhcnRUZXh0KCl9KSc7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBQcmltaXRpdmVDb25zdGFudFZhbHVlIGV4dGVuZHMgQ29uc3RhbnRWYWx1ZSB7CiAgY29uc3QgUHJpbWl0aXZlQ29uc3RhbnRWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1ByaW1pdGl2ZSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KHZhciBvdGhlcikgewogICAgLy8gTWFraW5nIHRoaXMgbWV0aG9kIGFic3RyYWN0IGRvZXMgbm90IGdpdmUgdXMgYW4gZXJyb3IuCiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignUHJpbWl0aXZlQ29uc3RhbnQuPT0nKTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ1ByaW1pdGl2ZUNvbnN0YW50Lmhhc2hDb2RlJyk7CgogIC8vIFByaW1pdGl2ZSBjb25zdGFudHMgZG9uJ3QgaGF2ZSBkZXBlbmRlbmNpZXMuCiAgQG92ZXJyaWRlCiAgTGlzdDxDb25zdGFudFZhbHVlPiBnZXREZXBlbmRlbmNpZXMoKSA9PiBjb25zdCA8Q29uc3RhbnRWYWx1ZT5bXTsKfQoKY2xhc3MgTnVsbENvbnN0YW50VmFsdWUgZXh0ZW5kcyBQcmltaXRpdmVDb25zdGFudFZhbHVlIHsKICAvLy8gVGhlIHZhbHVlIGEgRGFydCBudWxsIGlzIGNvbXBpbGVkIHRvIGluIEphdmFTY3JpcHQuCiAgc3RhdGljIGNvbnN0IFN0cmluZyBKc051bGwgPSAibnVsbCI7CgogIGNvbnN0IGZhY3RvcnkgTnVsbENvbnN0YW50VmFsdWUoKSA9IE51bGxDb25zdGFudFZhbHVlLl9pbnRlcm5hbDsKCiAgY29uc3QgTnVsbENvbnN0YW50VmFsdWUuX2ludGVybmFsKCk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTnVsbCA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRUeXBlKENvbW1vbkVsZW1lbnRzIHR5cGVzKSA9PiB0eXBlcy5udWxsVHlwZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgPT4gb3RoZXIgaXMgTnVsbENvbnN0YW50VmFsdWU7CgogIC8vIFRoZSBtYWdpYyBjb25zdGFudCBoYXMgbm8gbWVhbmluZy4gSXQgaXMganVzdCBhIHJhbmRvbSB2YWx1ZS4KICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IDc4NTk2NTgyNTsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50VmFsdWVWaXNpdG9yIHZpc2l0b3IsIGFyZykgPT4gdmlzaXRvci52aXNpdE51bGwodGhpcywgYXJnKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZUtpbmQgZ2V0IGtpbmQgPT4gQ29uc3RhbnRWYWx1ZUtpbmQuTlVMTDsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RydWN0dXJlZFRleHQoKSA9PiAnTnVsbENvbnN0YW50JzsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvRGFydFRleHQoKSA9PiAnbnVsbCc7Cn0KCmFic3RyYWN0IGNsYXNzIE51bUNvbnN0YW50VmFsdWUgZXh0ZW5kcyBQcmltaXRpdmVDb25zdGFudFZhbHVlIHsKICBkb3VibGUgZ2V0IGRvdWJsZVZhbHVlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc051bSA9PiB0cnVlOwoKICBjb25zdCBOdW1Db25zdGFudFZhbHVlKCk7Cn0KCmNsYXNzIEludENvbnN0YW50VmFsdWUgZXh0ZW5kcyBOdW1Db25zdGFudFZhbHVlIHsKICBmaW5hbCBCaWdJbnQgaW50VmFsdWU7CgogIC8vIENhY2hpbmcgSW50Q29uc3RhbnRWYWx1ZXMgcmVwcmVzZW50aW5nIC0yIHRocm91Z2ggMTAgc28gdGhhdCB3ZSBkb24ndCBoYXZlCiAgLy8gdG8gY3JlYXRlIG5ldyBvbmVzIGV2ZXJ5IHRpbWUgdGhvc2UgdmFsdWVzIGFyZSB1c2VkLgogIHN0YXRpYyBNYXA8QmlnSW50LCBJbnRDb25zdGFudFZhbHVlPiBfY2FjaGVkVmFsdWVzID0ge307CgogIEBvdmVycmlkZQogIGRvdWJsZSBnZXQgZG91YmxlVmFsdWUgPT4gaW50VmFsdWUudG9Eb3VibGUoKTsKCiAgZmFjdG9yeSBJbnRDb25zdGFudFZhbHVlKEJpZ0ludCB2YWx1ZSkgewogICAgdmFyIGV4aXN0aW5nID0gX2NhY2hlZFZhbHVlc1t2YWx1ZV07CiAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkgcmV0dXJuIGV4aXN0aW5nOwogICAgdmFyIGludENvbnN0YW50VmFsID0gbmV3IEludENvbnN0YW50VmFsdWUuX2ludGVybmFsKHZhbHVlKTsKICAgIHZhciBpbnRWYWx1ZSA9IHZhbHVlLnRvSW50KCk7CiAgICBpZiAoaW50VmFsdWUgPD0gLTIgJiYgaW50VmFsdWUgPj0gMTApIHsKICAgICAgX2NhY2hlZFZhbHVlc1t2YWx1ZV0gPSBpbnRDb25zdGFudFZhbDsKICAgIH0KICAgIHJldHVybiBpbnRDb25zdGFudFZhbDsKICB9CgogIGNvbnN0IEludENvbnN0YW50VmFsdWUuX2ludGVybmFsKHRoaXMuaW50VmFsdWUpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0ludCA9PiB0cnVlOwoKICBib29sIGlzVUludDMxKCkgPT4gaW50VmFsdWUudG9VbnNpZ25lZCgzMSkgPT0gaW50VmFsdWU7CgogIGJvb2wgaXNVSW50MzIoKSA9PiBpbnRWYWx1ZS50b1Vuc2lnbmVkKDMyKSA9PSBpbnRWYWx1ZTsKCiAgYm9vbCBpc1Bvc2l0aXZlKCkgPT4gaW50VmFsdWUgPj0gQmlnSW50Lnplcm87CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzWmVybyA9PiBpbnRWYWx1ZSA9PSBCaWdJbnQuemVybzsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNPbmUgPT4gaW50VmFsdWUgPT0gQmlnSW50Lm9uZTsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0VHlwZShDb21tb25FbGVtZW50cyB0eXBlcykgPT4gdHlwZXMuaW50VHlwZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PSh2YXIgb3RoZXIpIHsKICAgIC8vIEludHMgYW5kIGRvdWJsZXMgYXJlIHRyZWF0ZWQgYXMgc2VwYXJhdGUgY29uc3RhbnRzLgogICAgaWYgKG90aGVyIGlzISBJbnRDb25zdGFudFZhbHVlKSByZXR1cm4gZmFsc2U7CiAgICBJbnRDb25zdGFudFZhbHVlIG90aGVySW50ID0gb3RoZXI7CiAgICByZXR1cm4gaW50VmFsdWUgPT0gb3RoZXJJbnQuaW50VmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IGludFZhbHVlLmhhc2hDb2RlICYgSGFzaGluZy5TTUlfTUFTSzsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50VmFsdWVWaXNpdG9yIHZpc2l0b3IsIGFyZykgPT4gdmlzaXRvci52aXNpdEludCh0aGlzLCBhcmcpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlS2luZCBnZXQga2luZCA9PiBDb25zdGFudFZhbHVlS2luZC5JTlQ7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cnVjdHVyZWRUZXh0KCkgPT4gJ0ludENvbnN0YW50KCR7dG9EYXJ0VGV4dCgpfSknOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9EYXJ0VGV4dCgpID0+IGludFZhbHVlLnRvU3RyaW5nKCk7Cn0KCmNsYXNzIERvdWJsZUNvbnN0YW50VmFsdWUgZXh0ZW5kcyBOdW1Db25zdGFudFZhbHVlIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBkb3VibGUgZG91YmxlVmFsdWU7CgogIGZhY3RvcnkgRG91YmxlQ29uc3RhbnRWYWx1ZShkb3VibGUgdmFsdWUpIHsKICAgIGlmICh2YWx1ZS5pc05hTikgewogICAgICByZXR1cm4gY29uc3QgRG91YmxlQ29uc3RhbnRWYWx1ZS5faW50ZXJuYWwoZG91YmxlLm5hbik7CiAgICB9IGVsc2UgaWYgKHZhbHVlID09IGRvdWJsZS5pbmZpbml0eSkgewogICAgICByZXR1cm4gY29uc3QgRG91YmxlQ29uc3RhbnRWYWx1ZS5faW50ZXJuYWwoZG91YmxlLmluZmluaXR5KTsKICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gLWRvdWJsZS5pbmZpbml0eSkgewogICAgICByZXR1cm4gY29uc3QgRG91YmxlQ29uc3RhbnRWYWx1ZS5faW50ZXJuYWwoLWRvdWJsZS5pbmZpbml0eSk7CiAgICB9IGVsc2UgaWYgKHZhbHVlID09IDAuMCAmJiAhdmFsdWUuaXNOZWdhdGl2ZSkgewogICAgICByZXR1cm4gY29uc3QgRG91YmxlQ29uc3RhbnRWYWx1ZS5faW50ZXJuYWwoMC4wKTsKICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gMS4wKSB7CiAgICAgIHJldHVybiBjb25zdCBEb3VibGVDb25zdGFudFZhbHVlLl9pbnRlcm5hbCgxLjApOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBEb3VibGVDb25zdGFudFZhbHVlLl9pbnRlcm5hbCh2YWx1ZSk7CiAgICB9CiAgfQoKICBjb25zdCBEb3VibGVDb25zdGFudFZhbHVlLl9pbnRlcm5hbCh0aGlzLmRvdWJsZVZhbHVlKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNEb3VibGUgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOYU4gPT4gZG91YmxlVmFsdWUuaXNOYU47CgogIC8vIFdlIG5lZWQgdG8gY2hlY2sgZm9yIHRoZSBuZWdhdGl2ZSBzaWduIHNpbmNlIC0wLjAgPT0gMC4wLgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTWludXNaZXJvID0+IGRvdWJsZVZhbHVlID09IDAuMCAmJiBkb3VibGVWYWx1ZS5pc05lZ2F0aXZlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1plcm8gPT4gZG91YmxlVmFsdWUgPT0gMC4wOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc09uZSA9PiBkb3VibGVWYWx1ZSA9PSAxLjA7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUG9zaXRpdmVJbmZpbml0eSA9PiBkb3VibGVWYWx1ZSA9PSBkb3VibGUuaW5maW5pdHk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTmVnYXRpdmVJbmZpbml0eSA9PiBkb3VibGVWYWx1ZSA9PSAtZG91YmxlLmluZmluaXR5OwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRUeXBlKENvbW1vbkVsZW1lbnRzIHR5cGVzKSA9PiB0eXBlcy5kb3VibGVUeXBlOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KHZhciBvdGhlcikgewogICAgaWYgKG90aGVyIGlzISBEb3VibGVDb25zdGFudFZhbHVlKSByZXR1cm4gZmFsc2U7CiAgICBEb3VibGVDb25zdGFudFZhbHVlIG90aGVyRG91YmxlID0gb3RoZXI7CiAgICBkb3VibGUgb3RoZXJWYWx1ZSA9IG90aGVyRG91YmxlLmRvdWJsZVZhbHVlOwogICAgaWYgKGRvdWJsZVZhbHVlID09IDAuMCAmJiBvdGhlclZhbHVlID09IDAuMCkgewogICAgICByZXR1cm4gZG91YmxlVmFsdWUuaXNOZWdhdGl2ZSA9PSBvdGhlclZhbHVlLmlzTmVnYXRpdmU7CiAgICB9IGVsc2UgaWYgKGRvdWJsZVZhbHVlLmlzTmFOKSB7CiAgICAgIHJldHVybiBvdGhlclZhbHVlLmlzTmFOOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGRvdWJsZVZhbHVlID09IG90aGVyVmFsdWU7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IGRvdWJsZVZhbHVlLmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRWYWx1ZVZpc2l0b3IgdmlzaXRvciwgYXJnKSA9PiB2aXNpdG9yLnZpc2l0RG91YmxlKHRoaXMsIGFyZyk7CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWVLaW5kIGdldCBraW5kID0+IENvbnN0YW50VmFsdWVLaW5kLkRPVUJMRTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RydWN0dXJlZFRleHQoKSA9PiAnRG91YmxlQ29uc3RhbnQoJHt0b0RhcnRUZXh0KCl9KSc7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b0RhcnRUZXh0KCkgPT4gZG91YmxlVmFsdWUudG9TdHJpbmcoKTsKfQoKYWJzdHJhY3QgY2xhc3MgQm9vbENvbnN0YW50VmFsdWUgZXh0ZW5kcyBQcmltaXRpdmVDb25zdGFudFZhbHVlIHsKICBmYWN0b3J5IEJvb2xDb25zdGFudFZhbHVlKHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUgPyBuZXcgVHJ1ZUNvbnN0YW50VmFsdWUoKSA6IG5ldyBGYWxzZUNvbnN0YW50VmFsdWUoKTsKICB9CgogIGNvbnN0IEJvb2xDb25zdGFudFZhbHVlLl9pbnRlcm5hbCgpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0Jvb2wgPT4gdHJ1ZTsKCiAgYm9vbCBnZXQgYm9vbFZhbHVlOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRUeXBlKENvbW1vbkVsZW1lbnRzIHR5cGVzKSA9PiB0eXBlcy5ib29sVHlwZTsKCiAgQm9vbENvbnN0YW50VmFsdWUgbmVnYXRlKCk7CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudFZhbHVlVmlzaXRvciB2aXNpdG9yLCBhcmcpID0+IHZpc2l0b3IudmlzaXRCb29sKHRoaXMsIGFyZyk7CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWVLaW5kIGdldCBraW5kID0+IENvbnN0YW50VmFsdWVLaW5kLkJPT0w7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cnVjdHVyZWRUZXh0KCkgPT4gJ0Jvb2xDb25zdGFudCgke3RvRGFydFRleHQoKX0pJzsKfQoKY2xhc3MgVHJ1ZUNvbnN0YW50VmFsdWUgZXh0ZW5kcyBCb29sQ29uc3RhbnRWYWx1ZSB7CiAgZmFjdG9yeSBUcnVlQ29uc3RhbnRWYWx1ZSgpID0+IGNvbnN0IFRydWVDb25zdGFudFZhbHVlLl9pbnRlcm5hbCgpOwoKICBjb25zdCBUcnVlQ29uc3RhbnRWYWx1ZS5faW50ZXJuYWwoKSA6IHN1cGVyLl9pbnRlcm5hbCgpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1RydWUgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgYm9vbFZhbHVlID0+IHRydWU7CgogIEBvdmVycmlkZQogIEZhbHNlQ29uc3RhbnRWYWx1ZSBuZWdhdGUoKSA9PiBuZXcgRmFsc2VDb25zdGFudFZhbHVlKCk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0odmFyIG90aGVyKSA9PiBpZGVudGljYWwodGhpcywgb3RoZXIpOwoKICAvLyBUaGUgbWFnaWMgY29uc3RhbnQgaXMganVzdCBhIHJhbmRvbSB2YWx1ZS4gSXQgZG9lcyBub3QgaGF2ZSBhbnkKICAvLyBzaWduaWZpY2FuY2UuCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiA0OTk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b0RhcnRUZXh0KCkgPT4gYm9vbFZhbHVlLnRvU3RyaW5nKCk7Cn0KCmNsYXNzIEZhbHNlQ29uc3RhbnRWYWx1ZSBleHRlbmRzIEJvb2xDb25zdGFudFZhbHVlIHsKICBmYWN0b3J5IEZhbHNlQ29uc3RhbnRWYWx1ZSgpID0+IGNvbnN0IEZhbHNlQ29uc3RhbnRWYWx1ZS5faW50ZXJuYWwoKTsKCiAgY29uc3QgRmFsc2VDb25zdGFudFZhbHVlLl9pbnRlcm5hbCgpIDogc3VwZXIuX2ludGVybmFsKCk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRmFsc2UgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgYm9vbFZhbHVlID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBUcnVlQ29uc3RhbnRWYWx1ZSBuZWdhdGUoKSA9PiBuZXcgVHJ1ZUNvbnN0YW50VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PSh2YXIgb3RoZXIpID0+IGlkZW50aWNhbCh0aGlzLCBvdGhlcik7CgogIC8vIFRoZSBtYWdpYyBjb25zdGFudCBpcyBqdXN0IGEgcmFuZG9tIHZhbHVlLiBJdCBkb2VzIG5vdCBoYXZlIGFueQogIC8vIHNpZ25pZmljYW5jZS4KICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IDUzNjU1NTk3NTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvRGFydFRleHQoKSA9PiBib29sVmFsdWUudG9TdHJpbmcoKTsKfQoKY2xhc3MgU3RyaW5nQ29uc3RhbnRWYWx1ZSBleHRlbmRzIFByaW1pdGl2ZUNvbnN0YW50VmFsdWUgewogIGZpbmFsIFN0cmluZyBzdHJpbmdWYWx1ZTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IGhhc2hDb2RlOwoKICAvLyBUT0RPKGZsb2l0c2NoKTogY2FjaGUgU3RyaW5nQ29uc3RhbnRzLgogIFN0cmluZ0NvbnN0YW50VmFsdWUoU3RyaW5nIHZhbHVlKQogICAgICA6IHRoaXMuc3RyaW5nVmFsdWUgPSB2YWx1ZSwKICAgICAgICB0aGlzLmhhc2hDb2RlID0gdmFsdWUuaGFzaENvZGU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU3RyaW5nID0+IHRydWU7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldFR5cGUoQ29tbW9uRWxlbWVudHMgdHlwZXMpID0+IHR5cGVzLnN0cmluZ1R5cGU7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0odmFyIG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIFN0cmluZ0NvbnN0YW50VmFsdWUpIHJldHVybiBmYWxzZTsKICAgIFN0cmluZ0NvbnN0YW50VmFsdWUgb3RoZXJTdHJpbmcgPSBvdGhlcjsKICAgIHJldHVybiBoYXNoQ29kZSA9PSBvdGhlclN0cmluZy5oYXNoQ29kZSAmJgogICAgICAgIHN0cmluZ1ZhbHVlID09IG90aGVyU3RyaW5nLnN0cmluZ1ZhbHVlOwogIH0KCiAgU3RyaW5nIHRvRGFydFN0cmluZygpID0+IHN0cmluZ1ZhbHVlOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBzdHJpbmdWYWx1ZS5sZW5ndGg7CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudFZhbHVlVmlzaXRvciB2aXNpdG9yLCBhcmcpID0+IHZpc2l0b3IudmlzaXRTdHJpbmcodGhpcywgYXJnKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZUtpbmQgZ2V0IGtpbmQgPT4gQ29uc3RhbnRWYWx1ZUtpbmQuU1RSSU5HOwoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBFbnN1cmUgY29ycmVjdCBlc2NhcGluZy4KICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9EYXJ0VGV4dCgpID0+ICciJHtzdHJpbmdWYWx1ZX0iJzsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RydWN0dXJlZFRleHQoKSA9PiAnU3RyaW5nQ29uc3RhbnQoJHt0b0RhcnRUZXh0KCl9KSc7Cn0KCmFic3RyYWN0IGNsYXNzIE9iamVjdENvbnN0YW50VmFsdWUgZXh0ZW5kcyBDb25zdGFudFZhbHVlIHsKICBmaW5hbCBJbnRlcmZhY2VUeXBlIHR5cGU7CgogIE9iamVjdENvbnN0YW50VmFsdWUodGhpcy50eXBlKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNPYmplY3QgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0VHlwZShDb21tb25FbGVtZW50cyB0eXBlcykgPT4gdHlwZTsKCiAgdm9pZCBfdW5wYXJzZVR5cGVBcmd1bWVudHMoU3RyaW5nQnVmZmVyIHNiKSB7CiAgICBpZiAoIXR5cGUudHJlYXRBc1JhdykgewogICAgICBzYi53cml0ZSgnPCcpOwogICAgICBzYi53cml0ZSh0eXBlLnR5cGVBcmd1bWVudHMuam9pbignLCAnKSk7CiAgICAgIHNiLndyaXRlKCc+Jyk7CiAgICB9CiAgfQp9CgpjbGFzcyBUeXBlQ29uc3RhbnRWYWx1ZSBleHRlbmRzIE9iamVjdENvbnN0YW50VmFsdWUgewogIC8vLyBUaGUgdXNlciB0eXBlIHRoYXQgdGhpcyBjb25zdGFudCByZXByZXNlbnRzLgogIGZpbmFsIERhcnRUeXBlIHJlcHJlc2VudGVkVHlwZTsKCiAgVHlwZUNvbnN0YW50VmFsdWUodGhpcy5yZXByZXNlbnRlZFR5cGUsIEludGVyZmFjZVR5cGUgdHlwZSkgOiBzdXBlcih0eXBlKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNUeXBlID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIHJldHVybiBvdGhlciBpcyBUeXBlQ29uc3RhbnRWYWx1ZSAmJgogICAgICAgIHJlcHJlc2VudGVkVHlwZS51bmFsaWFzZWQgPT0gb3RoZXIucmVwcmVzZW50ZWRUeXBlLnVuYWxpYXNlZDsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gcmVwcmVzZW50ZWRUeXBlLnVuYWxpYXNlZC5oYXNoQ29kZSAqIDEzOwoKICBAb3ZlcnJpZGUKICBMaXN0PENvbnN0YW50VmFsdWU+IGdldERlcGVuZGVuY2llcygpID0+IGNvbnN0IDxDb25zdGFudFZhbHVlPltdOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRWYWx1ZVZpc2l0b3IgdmlzaXRvciwgYXJnKSA9PiB2aXNpdG9yLnZpc2l0VHlwZSh0aGlzLCBhcmcpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlS2luZCBnZXQga2luZCA9PiBDb25zdGFudFZhbHVlS2luZC5UWVBFOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9EYXJ0VGV4dCgpID0+ICckcmVwcmVzZW50ZWRUeXBlJzsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RydWN0dXJlZFRleHQoKSA9PiAnVHlwZUNvbnN0YW50KCR7cmVwcmVzZW50ZWRUeXBlfSknOwp9CgpjbGFzcyBMaXN0Q29uc3RhbnRWYWx1ZSBleHRlbmRzIE9iamVjdENvbnN0YW50VmFsdWUgewogIGZpbmFsIExpc3Q8Q29uc3RhbnRWYWx1ZT4gZW50cmllczsKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgaGFzaENvZGU7CgogIExpc3RDb25zdGFudFZhbHVlKEludGVyZmFjZVR5cGUgdHlwZSwgTGlzdDxDb25zdGFudFZhbHVlPiBlbnRyaWVzKQogICAgICA6IHRoaXMuZW50cmllcyA9IGVudHJpZXMsCiAgICAgICAgaGFzaENvZGUgPSBIYXNoaW5nLmxpc3RIYXNoKGVudHJpZXMsIEhhc2hpbmcub2JqZWN0SGFzaCh0eXBlKSksCiAgICAgICAgc3VwZXIodHlwZSk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTGlzdCA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KHZhciBvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzISBMaXN0Q29uc3RhbnRWYWx1ZSkgcmV0dXJuIGZhbHNlOwogICAgTGlzdENvbnN0YW50VmFsdWUgb3RoZXJMaXN0ID0gb3RoZXI7CiAgICBpZiAoaGFzaENvZGUgIT0gb3RoZXJMaXN0Lmhhc2hDb2RlKSByZXR1cm4gZmFsc2U7CiAgICBpZiAodHlwZSAhPSBvdGhlckxpc3QudHlwZSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKGVudHJpZXMubGVuZ3RoICE9IG90aGVyTGlzdC5lbnRyaWVzLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChlbnRyaWVzW2ldICE9IG90aGVyTGlzdC5lbnRyaWVzW2ldKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8Q29uc3RhbnRWYWx1ZT4gZ2V0RGVwZW5kZW5jaWVzKCkgPT4gZW50cmllczsKCiAgaW50IGdldCBsZW5ndGggPT4gZW50cmllcy5sZW5ndGg7CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudFZhbHVlVmlzaXRvciB2aXNpdG9yLCBhcmcpID0+IHZpc2l0b3IudmlzaXRMaXN0KHRoaXMsIGFyZyk7CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWVLaW5kIGdldCBraW5kID0+IENvbnN0YW50VmFsdWVLaW5kLkxJU1Q7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b0RhcnRUZXh0KCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgX3VucGFyc2VUeXBlQXJndW1lbnRzKHNiKTsKICAgIHNiLndyaXRlKCdbJyk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChpID4gMCkgc2Iud3JpdGUoJywnKTsKICAgICAgc2Iud3JpdGUoZW50cmllc1tpXS50b0RhcnRUZXh0KCkpOwogICAgfQogICAgc2Iud3JpdGUoJ10nKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RydWN0dXJlZFRleHQoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnTGlzdENvbnN0YW50KCcpOwogICAgX3VucGFyc2VUeXBlQXJndW1lbnRzKHNiKTsKICAgIHNiLndyaXRlKCdbJyk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChpID4gMCkgc2Iud3JpdGUoJywgJyk7CiAgICAgIHNiLndyaXRlKGVudHJpZXNbaV0udG9TdHJ1Y3R1cmVkVGV4dCgpKTsKICAgIH0KICAgIHNiLndyaXRlKCddKScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBTZXRDb25zdGFudFZhbHVlIGV4dGVuZHMgT2JqZWN0Q29uc3RhbnRWYWx1ZSB7CiAgZmluYWwgTGlzdDxDb25zdGFudFZhbHVlPiB2YWx1ZXM7CiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IGhhc2hDb2RlOwoKICBTZXRDb25zdGFudFZhbHVlKEludGVyZmFjZVR5cGUgdHlwZSwgTGlzdDxDb25zdGFudFZhbHVlPiB2YWx1ZXMpCiAgICAgIDogdmFsdWVzID0gdmFsdWVzLAogICAgICAgIGhhc2hDb2RlID0gSGFzaGluZy5saXN0SGFzaCh2YWx1ZXMsIEhhc2hpbmcub2JqZWN0SGFzaCh0eXBlKSksCiAgICAgICAgc3VwZXIodHlwZSk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU2V0ID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0odmFyIG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIFNldENvbnN0YW50VmFsdWUpIHJldHVybiBmYWxzZTsKICAgIFNldENvbnN0YW50VmFsdWUgb3RoZXJTZXQgPSBvdGhlcjsKICAgIGlmIChoYXNoQ29kZSAhPSBvdGhlclNldC5oYXNoQ29kZSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKHR5cGUgIT0gb3RoZXJTZXQudHlwZSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKGxlbmd0aCAhPSBvdGhlclNldC5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh2YWx1ZXNbaV0gIT0gb3RoZXJTZXQudmFsdWVzW2ldKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8Q29uc3RhbnRWYWx1ZT4gZ2V0RGVwZW5kZW5jaWVzKCkgPT4gdmFsdWVzOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiB2YWx1ZXMubGVuZ3RoOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRWYWx1ZVZpc2l0b3IgdmlzaXRvciwgYXJnKSA9PiB2aXNpdG9yLnZpc2l0U2V0KHRoaXMsIGFyZyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b0RhcnRUZXh0KCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgX3VucGFyc2VUeXBlQXJndW1lbnRzKHNiKTsKICAgIHNiLndyaXRlKCd7Jyk7CiAgICBzYi53cml0ZUFsbCh2YWx1ZXMubWFwKCh2KSA9PiB2LnRvRGFydFRleHQoKSksICcsJyk7CiAgICBzYi53cml0ZSgnfScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJ1Y3R1cmVkVGV4dCgpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCdTZXRDb25zdGFudCgnKTsKICAgIF91bnBhcnNlVHlwZUFyZ3VtZW50cyhzYik7CiAgICBzYi53cml0ZSgneycpOwogICAgc2Iud3JpdGVBbGwodmFsdWVzLm1hcCgodikgPT4gdi50b1N0cnVjdHVyZWRUZXh0KCkpLCAnLCAnKTsKICAgIHNiLndyaXRlKCd9KScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlS2luZCBnZXQga2luZCA9PiBDb25zdGFudFZhbHVlS2luZC5TRVQ7Cn0KCmFic3RyYWN0IGNsYXNzIE1hcENvbnN0YW50VmFsdWUgZXh0ZW5kcyBPYmplY3RDb25zdGFudFZhbHVlIHsKICBmaW5hbCBMaXN0PENvbnN0YW50VmFsdWU+IGtleXM7CiAgZmluYWwgTGlzdDxDb25zdGFudFZhbHVlPiB2YWx1ZXM7CiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IGhhc2hDb2RlOwogIE1hcDxDb25zdGFudFZhbHVlLCBDb25zdGFudFZhbHVlPiBfbG9va3VwTWFwOwoKICBNYXBDb25zdGFudFZhbHVlKAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUsIExpc3Q8Q29uc3RhbnRWYWx1ZT4ga2V5cywgTGlzdDxDb25zdGFudFZhbHVlPiB2YWx1ZXMpCiAgICAgIDogdGhpcy5rZXlzID0ga2V5cywKICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcywKICAgICAgICB0aGlzLmhhc2hDb2RlID0gSGFzaGluZy5saXN0SGFzaCgKICAgICAgICAgICAgdmFsdWVzLCBIYXNoaW5nLmxpc3RIYXNoKGtleXMsIEhhc2hpbmcub2JqZWN0SGFzaCh0eXBlKSkpLAogICAgICAgIHN1cGVyKHR5cGUpIHsKICAgIGFzc2VydChrZXlzLmxlbmd0aCA9PSB2YWx1ZXMubGVuZ3RoKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTWFwID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0odmFyIG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIE1hcENvbnN0YW50VmFsdWUpIHJldHVybiBmYWxzZTsKICAgIE1hcENvbnN0YW50VmFsdWUgb3RoZXJNYXAgPSBvdGhlcjsKICAgIGlmIChoYXNoQ29kZSAhPSBvdGhlck1hcC5oYXNoQ29kZSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKHR5cGUgIT0gb3RoZXIudHlwZSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKGxlbmd0aCAhPSBvdGhlci5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGtleXNbaV0gIT0gb3RoZXJNYXAua2V5c1tpXSkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAodmFsdWVzW2ldICE9IG90aGVyTWFwLnZhbHVlc1tpXSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PENvbnN0YW50VmFsdWU+IGdldERlcGVuZGVuY2llcygpIHsKICAgIExpc3Q8Q29uc3RhbnRWYWx1ZT4gcmVzdWx0ID0gPENvbnN0YW50VmFsdWU+W107CiAgICByZXN1bHQuYWRkQWxsKGtleXMpOwogICAgcmVzdWx0LmFkZEFsbCh2YWx1ZXMpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGludCBnZXQgbGVuZ3RoID0+IGtleXMubGVuZ3RoOwoKICBDb25zdGFudFZhbHVlIGxvb2t1cChDb25zdGFudFZhbHVlIGtleSkgewogICAgdmFyIGxvb2t1cE1hcCA9IF9sb29rdXBNYXAgPz89CiAgICAgICAgbmV3IE1hcDxDb25zdGFudFZhbHVlLCBDb25zdGFudFZhbHVlPi5mcm9tSXRlcmFibGVzKGtleXMsIHZhbHVlcyk7CiAgICByZXR1cm4gbG9va3VwTWFwW2tleV07CiAgfQoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRWYWx1ZVZpc2l0b3IgdmlzaXRvciwgYXJnKSA9PiB2aXNpdG9yLnZpc2l0TWFwKHRoaXMsIGFyZyk7CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWVLaW5kIGdldCBraW5kID0+IENvbnN0YW50VmFsdWVLaW5kLk1BUDsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvRGFydFRleHQoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBfdW5wYXJzZVR5cGVBcmd1bWVudHMoc2IpOwogICAgc2Iud3JpdGUoJ3snKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGkgPiAwKSBzYi53cml0ZSgnLCcpOwogICAgICBzYi53cml0ZShrZXlzW2ldLnRvRGFydFRleHQoKSk7CiAgICAgIHNiLndyaXRlKCc6Jyk7CiAgICAgIHNiLndyaXRlKHZhbHVlc1tpXS50b0RhcnRUZXh0KCkpOwogICAgfQogICAgc2Iud3JpdGUoJ30nKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RydWN0dXJlZFRleHQoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnTWFwQ29uc3RhbnQoJyk7CiAgICBfdW5wYXJzZVR5cGVBcmd1bWVudHMoc2IpOwogICAgc2Iud3JpdGUoJ3snKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGkgPiAwKSBzYi53cml0ZSgnLCAnKTsKICAgICAgc2Iud3JpdGUoa2V5c1tpXS50b1N0cnVjdHVyZWRUZXh0KCkpOwogICAgICBzYi53cml0ZSgnOiAnKTsKICAgICAgc2Iud3JpdGUodmFsdWVzW2ldLnRvU3RydWN0dXJlZFRleHQoKSk7CiAgICB9CiAgICBzYi53cml0ZSgnfSknKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQoKY2xhc3MgSW50ZXJjZXB0b3JDb25zdGFudFZhbHVlIGV4dGVuZHMgQ29uc3RhbnRWYWx1ZSB7CiAgLy8vIFRoZSBjbGFzcyBmb3Igd2hpY2ggdGhpcyBpbnRlcmNlcHRvciBob2xkcyB0aGUgbWV0aG9kcy4gIFRoZSBjb25zdGFudAogIC8vLyBpcyBhIGRpc3BhdGNoIHRhYmxlIGZvciB0aGlzIGNsYXNzLgogIGZpbmFsIENsYXNzRW50aXR5IGNsczsKCiAgSW50ZXJjZXB0b3JDb25zdGFudFZhbHVlKHRoaXMuY2xzKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNJbnRlcmNlcHRvciA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICByZXR1cm4gb3RoZXIgaXMgSW50ZXJjZXB0b3JDb25zdGFudFZhbHVlICYmIGNscyA9PSBvdGhlci5jbHM7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IGNscy5oYXNoQ29kZSAqIDQzOwoKICBAb3ZlcnJpZGUKICBMaXN0PENvbnN0YW50VmFsdWU+IGdldERlcGVuZGVuY2llcygpID0+IGNvbnN0IDxDb25zdGFudFZhbHVlPltdOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRWYWx1ZVZpc2l0b3IgdmlzaXRvciwgYXJnKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEludGVyY2VwdG9yKHRoaXMsIGFyZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRUeXBlKENvbW1vbkVsZW1lbnRzIHR5cGVzKSA9PiB0eXBlcy5keW5hbWljVHlwZTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZUtpbmQgZ2V0IGtpbmQgPT4gQ29uc3RhbnRWYWx1ZUtpbmQuSU5URVJDRVBUT1I7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b0RhcnRUZXh0KCkgewogICAgcmV0dXJuICdpbnRlcmNlcHRvcigkY2xzKSc7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJ1Y3R1cmVkVGV4dCgpIHsKICAgIHJldHVybiAnSW50ZXJjZXB0b3JDb25zdGFudCgke2Nscy5uYW1lfSknOwogIH0KfQoKY2xhc3MgU3ludGhldGljQ29uc3RhbnRWYWx1ZSBleHRlbmRzIENvbnN0YW50VmFsdWUgewogIGZpbmFsIHBheWxvYWQ7CiAgZmluYWwgdmFsdWVLaW5kOwoKICBTeW50aGV0aWNDb25zdGFudFZhbHVlKHRoaXMudmFsdWVLaW5kLCB0aGlzLnBheWxvYWQpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0R1bW15ID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIHJldHVybiBvdGhlciBpcyBTeW50aGV0aWNDb25zdGFudFZhbHVlICYmIHBheWxvYWQgPT0gb3RoZXIucGF5bG9hZDsKICB9CgogIEBvdmVycmlkZQogIGdldCBoYXNoQ29kZSA9PiBwYXlsb2FkLmhhc2hDb2RlICogMTcgKyB2YWx1ZUtpbmQuaGFzaENvZGU7CgogIEBvdmVycmlkZQogIExpc3Q8Q29uc3RhbnRWYWx1ZT4gZ2V0RGVwZW5kZW5jaWVzKCkgPT4gY29uc3QgPENvbnN0YW50VmFsdWU+W107CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudFZhbHVlVmlzaXRvciB2aXNpdG9yLCBhcmcpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0U3ludGhldGljKHRoaXMsIGFyZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRUeXBlKENvbW1vbkVsZW1lbnRzIHR5cGVzKSA9PiB0eXBlcy5keW5hbWljVHlwZTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZUtpbmQgZ2V0IGtpbmQgPT4gQ29uc3RhbnRWYWx1ZUtpbmQuU1lOVEhFVElDOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9EYXJ0VGV4dCgpID0+ICdzeW50aGV0aWMoJHZhbHVlS2luZCwgJHBheWxvYWQpJzsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RydWN0dXJlZFRleHQoKSA9PiAnU3ludGhldGljQ29uc3RhbnQoJHZhbHVlS2luZCwgJHBheWxvYWQpJzsKfQoKY2xhc3MgQ29uc3RydWN0ZWRDb25zdGFudFZhbHVlIGV4dGVuZHMgT2JqZWN0Q29uc3RhbnRWYWx1ZSB7CiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWFrZSBbZmllbGRzXSBwcml2YXRlIHRvIGF2b2lkIG1pc3VzZSBvZiB0aGUgbWFwCiAgLy8gb3JkZXJpbmcgYW5kIG11dGFiaWxpdHkuCiAgZmluYWwgTWFwPEZpZWxkRW50aXR5LCBDb25zdGFudFZhbHVlPiBmaWVsZHM7CiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IGhhc2hDb2RlOwoKICBDb25zdHJ1Y3RlZENvbnN0YW50VmFsdWUoCiAgICAgIEludGVyZmFjZVR5cGUgdHlwZSwgTWFwPEZpZWxkRW50aXR5LCBDb25zdGFudFZhbHVlPiBmaWVsZHMpCiAgICAgIDogdGhpcy5maWVsZHMgPSBmaWVsZHMsCiAgICAgICAgaGFzaENvZGUgPSBIYXNoaW5nLnVub3JkZXJlZE1hcEhhc2goZmllbGRzLCBIYXNoaW5nLm9iamVjdEhhc2godHlwZSkpLAogICAgICAgIHN1cGVyKHR5cGUpIHsKICAgIGFzc2VydCh0eXBlICE9IG51bGwpOwogICAgYXNzZXJ0KCFmaWVsZHMuY29udGFpbnNLZXkobnVsbCkpOwogICAgYXNzZXJ0KCFmaWVsZHMuY29udGFpbnNWYWx1ZShudWxsKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0NvbnN0cnVjdGVkT2JqZWN0ID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0odmFyIG90aGVyVmFyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyVmFyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXJWYXIgaXMhIENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZSkgcmV0dXJuIGZhbHNlOwogICAgQ29uc3RydWN0ZWRDb25zdGFudFZhbHVlIG90aGVyID0gb3RoZXJWYXI7CiAgICBpZiAoaGFzaENvZGUgIT0gb3RoZXIuaGFzaENvZGUpIHJldHVybiBmYWxzZTsKICAgIGlmICh0eXBlICE9IG90aGVyLnR5cGUpIHJldHVybiBmYWxzZTsKICAgIGlmIChmaWVsZHMubGVuZ3RoICE9IG90aGVyLmZpZWxkcy5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgIGZvciAoRmllbGRFbnRpdHkgZmllbGQgaW4gZmllbGRzLmtleXMpIHsKICAgICAgaWYgKGZpZWxkc1tmaWVsZF0gIT0gb3RoZXIuZmllbGRzW2ZpZWxkXSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PENvbnN0YW50VmFsdWU+IGdldERlcGVuZGVuY2llcygpID0+IGZpZWxkcy52YWx1ZXMudG9MaXN0KCk7CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudFZhbHVlVmlzaXRvciB2aXNpdG9yLCBhcmcpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0Q29uc3RydWN0ZWQodGhpcywgYXJnKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWVLaW5kIGdldCBraW5kID0+IENvbnN0YW50VmFsdWVLaW5kLkNPTlNUUlVDVEVEOwoKICBJdGVyYWJsZTxGaWVsZEVudGl0eT4gZ2V0IF9maWVsZHNTb3J0ZWRCeU5hbWUgewogICAgcmV0dXJuIGZpZWxkcy5rZXlzLnRvTGlzdCgpLi5zb3J0KChhLCBiKSA9PiBhLm5hbWUuY29tcGFyZVRvKGIubmFtZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvRGFydFRleHQoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSh0eXBlLmVsZW1lbnQubmFtZSk7CiAgICBfdW5wYXJzZVR5cGVBcmd1bWVudHMoc2IpOwogICAgc2Iud3JpdGUoJygnKTsKICAgIGludCBpID0gMDsKICAgIGZvciAoRmllbGRFbnRpdHkgZmllbGQgaW4gX2ZpZWxkc1NvcnRlZEJ5TmFtZSkgewogICAgICBDb25zdGFudFZhbHVlIHZhbHVlID0gZmllbGRzW2ZpZWxkXTsKICAgICAgaWYgKGkgPiAwKSBzYi53cml0ZSgnLCcpOwogICAgICBzYi53cml0ZShmaWVsZC5uYW1lKTsKICAgICAgc2Iud3JpdGUoJz0nKTsKICAgICAgc2Iud3JpdGUodmFsdWUudG9EYXJ0VGV4dCgpKTsKICAgICAgaSsrOwogICAgfQogICAgc2Iud3JpdGUoJyknKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RydWN0dXJlZFRleHQoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnQ29uc3RydWN0ZWRDb25zdGFudCgnKTsKICAgIHNiLndyaXRlKHR5cGUpOwogICAgc2Iud3JpdGUoJygnKTsKICAgIGludCBpID0gMDsKICAgIGZvciAoRmllbGRFbnRpdHkgZmllbGQgaW4gX2ZpZWxkc1NvcnRlZEJ5TmFtZSkgewogICAgICBDb25zdGFudFZhbHVlIHZhbHVlID0gZmllbGRzW2ZpZWxkXTsKICAgICAgaWYgKGkgPiAwKSBzYi53cml0ZSgnLCcpOwogICAgICBzYi53cml0ZShmaWVsZC5uYW1lKTsKICAgICAgc2Iud3JpdGUoJz0nKTsKICAgICAgc2Iud3JpdGUodmFsdWUudG9TdHJ1Y3R1cmVkVGV4dCgpKTsKICAgICAgaSsrOwogICAgfQogICAgc2Iud3JpdGUoJykpJyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCmNsYXNzIEluc3RhbnRpYXRpb25Db25zdGFudFZhbHVlIGV4dGVuZHMgQ29uc3RhbnRWYWx1ZSB7CiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKICBmaW5hbCBGdW5jdGlvbkNvbnN0YW50VmFsdWUgZnVuY3Rpb247CgogIEluc3RhbnRpYXRpb25Db25zdGFudFZhbHVlKHRoaXMudHlwZUFyZ3VtZW50cywgdGhpcy5mdW5jdGlvbik7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBvdGhlciBpcyBJbnN0YW50aWF0aW9uQ29uc3RhbnRWYWx1ZSAmJgogICAgICAgIGZ1bmN0aW9uID09IG90aGVyLmZ1bmN0aW9uICYmCiAgICAgICAgZXF1YWxFbGVtZW50cyh0eXBlQXJndW1lbnRzLCBvdGhlci50eXBlQXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgewogICAgcmV0dXJuIEhhc2hpbmcub2JqZWN0SGFzaChmdW5jdGlvbiwgSGFzaGluZy5saXN0SGFzaCh0eXBlQXJndW1lbnRzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PENvbnN0YW50VmFsdWU+IGdldERlcGVuZGVuY2llcygpID0+IDxDb25zdGFudFZhbHVlPltmdW5jdGlvbl07CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudFZhbHVlVmlzaXRvciB2aXNpdG9yLCBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRJbnN0YW50aWF0aW9uKHRoaXMsIGFyZyk7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldFR5cGUoQ29tbW9uRWxlbWVudHMgdHlwZXMpIHsKICAgIEZ1bmN0aW9uVHlwZSB0eXBlID0gZnVuY3Rpb24uZ2V0VHlwZSh0eXBlcyk7CiAgICByZXR1cm4gdHlwZS5pbnN0YW50aWF0ZSh0eXBlQXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWVLaW5kIGdldCBraW5kID0+IENvbnN0YW50VmFsdWVLaW5kLklOU1RBTlRJQVRJT047CgogIEBvdmVycmlkZQogIFN0cmluZyB0b0RhcnRUZXh0KCkgPT4KICAgICAgJzwke3R5cGVBcmd1bWVudHMuam9pbignLCAnKX0+KCR7ZnVuY3Rpb24udG9EYXJ0VGV4dCgpfSknOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJ1Y3R1cmVkVGV4dCgpIHsKICAgIHJldHVybiAnSW5zdGFudGlhdGlvbkNvbnN0YW50KCR0eXBlQXJndW1lbnRzLCcKICAgICAgICAnJHtmdW5jdGlvbi50b1N0cnVjdHVyZWRUZXh0KCl9KSc7CiAgfQp9CgovLy8gQSByZWZlcmVuY2UgdG8gYSBjb25zdGFudCBpbiBhbm90aGVyIG91dHB1dCB1bml0LgovLy8KLy8vIFVzZWQgZm9yIHJlZmVycmluZyB0byBkZWZlcnJlZCBjb25zdGFudHMgdGhhdCBhcHBlYXIgYXMgaW5pdGlhbGl6ZXJzIG9mCi8vLyBmaW5hbCAobm9uLWNvbnN0KSBnbG9iYWwgZmllbGRzLgovLy8KLy8gVE9ETyhzaWdtdW5kKTogdGhpcyBzaG91bGQgZXZlbnR1YWxseSBub3QgYmUgYSBjb25zdGFudCB2YWx1ZS4gSW4gcGFydGljdWxhciwKLy8gW0RlZmVycmVkQ29uc3RhbnRWYWx1ZV0gaXMgaW50cm9kdWNlZCBieSB0aGUgY29uc3RhbnQgZXZhbHVhdG9yIHdoZW4gaXQgZmlyc3QKLy8gc2VlcyBjb25zdGFudHMgdXNlZCBpbiB0aGUgcHJvZ3JhbS4gW0RlZmVycmVkR2xvYmFsQ29uc3RhbnRWYWx1ZV0gYXJlCi8vIGludHJvZHVjZWQgbGF0ZXIgYnkgdGhlIFNTQSBidWlsZGVyIGFuZCBzaG91bGQgYmUgcmVwcmVzZW50ZWQKLy8gd2l0aCBhIGRlZGljYXRlZCBKRW50aXR5IGluc3RlYWQuIFdlIGN1cnJlbnRseSBtb2RlbCB0aGVtIGFzIGEgcmVndWxhcgovLyBjb25zdGFudCB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgbWFjaGluZXJ5IHdlIGFscmVhZHkgaGF2ZSBpbiBwbGFjZSB0bwovLyBnZW5lcmF0ZSBkZWZlcnJlZCBjb25zdGFudHMgaW4gdGhlIGVtaXR0ZXIuCmNsYXNzIERlZmVycmVkR2xvYmFsQ29uc3RhbnRWYWx1ZSBleHRlbmRzIENvbnN0YW50VmFsdWUgewogIERlZmVycmVkR2xvYmFsQ29uc3RhbnRWYWx1ZSh0aGlzLnJlZmVyZW5jZWQsIHRoaXMudW5pdCk7CgogIGZpbmFsIENvbnN0YW50VmFsdWUgcmVmZXJlbmNlZDsKICBmaW5hbCBPdXRwdXRVbml0IHVuaXQ7CgogIGJvb2wgZ2V0IGlzUmVmZXJlbmNlID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIHJldHVybiBvdGhlciBpcyBEZWZlcnJlZEdsb2JhbENvbnN0YW50VmFsdWUgJiYKICAgICAgICByZWZlcmVuY2VkID09IG90aGVyLnJlZmVyZW5jZWQgJiYKICAgICAgICB1bml0ID09IG90aGVyLnVuaXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBnZXQgaGFzaENvZGUgPT4gKHJlZmVyZW5jZWQuaGFzaENvZGUgKiAxNyArIHVuaXQuaGFzaENvZGUpICYgMHgzZmZmZmZmZjsKCiAgQG92ZXJyaWRlCiAgTGlzdDxDb25zdGFudFZhbHVlPiBnZXREZXBlbmRlbmNpZXMoKSA9PiA8Q29uc3RhbnRWYWx1ZT5bcmVmZXJlbmNlZF07CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudFZhbHVlVmlzaXRvciB2aXNpdG9yLCBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXREZWZlcnJlZEdsb2JhbCh0aGlzLCBhcmcpOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRUeXBlKENvbW1vbkVsZW1lbnRzIHR5cGVzKSA9PiByZWZlcmVuY2VkLmdldFR5cGUodHlwZXMpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlS2luZCBnZXQga2luZCA9PiBDb25zdGFudFZhbHVlS2luZC5ERUZFUlJFRF9HTE9CQUw7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b0RhcnRUZXh0KCkgPT4gJ2RlZmVycmVkX2dsb2JhbCgke3JlZmVyZW5jZWQudG9EYXJ0VGV4dCgpfSknOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJ1Y3R1cmVkVGV4dCgpIHsKICAgIHJldHVybiAnRGVmZXJyZWRHbG9iYWxDb25zdGFudCgke3JlZmVyZW5jZWQudG9TdHJ1Y3R1cmVkVGV4dCgpfSknOwogIH0KfQoKLy8vIEEgY29uc3RhbnQgdmFsdWUgcmVzdWx0aW5nIGZyb20gYSBub24gY29uc3RhbnQgb3IgZXJyb25lb3VzIGNvbnN0YW50Ci8vLyBleHByZXNzaW9uLgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBFeHBhbmQgdGhpcyB0byBjb250YWluIHRoZSBlcnJvciBraW5kLgpjbGFzcyBOb25Db25zdGFudFZhbHVlIGV4dGVuZHMgQ29uc3RhbnRWYWx1ZSB7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNDb25zdGFudCA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50VmFsdWVWaXNpdG9yIHZpc2l0b3IsIGFyZykgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXROb25Db25zdGFudCh0aGlzLCBhcmcpOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxDb25zdGFudFZhbHVlPiBnZXREZXBlbmRlbmNpZXMoKSA9PiBjb25zdCA8Q29uc3RhbnRWYWx1ZT5bXTsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0VHlwZShDb21tb25FbGVtZW50cyB0eXBlcykgPT4gdHlwZXMuZHluYW1pY1R5cGU7CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWVLaW5kIGdldCBraW5kID0+IENvbnN0YW50VmFs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cGFydHMgb2YgdGhlIGNvbXBpbGVyLiBUaGlzIGhpZXJhcmNoeSBhYnN0cmFjdHMgZGV0YWlscwovLy8gbm90IGdlbmVyYWxseSBuZWVkZWQgb3IgcmVxdWlyZWQgZm9yIHRoZSBEYXJ0IHR5cGUgaGllcmFyY2h5LiBGb3IgaW5zdGFuY2UsCi8vLyB0aGUgaGllcmFyY2h5IGluICdyZXNvbHV0aW9uX3R5cGVzLmRhcnQnIGhhcyBwcm9wZXJ0aWVzIHN1cHBvcnRpbmcgbGF6eQovLy8gY29tcHV0YXRpb24gKGxpa2UgY29tcHV0ZUFsaWFzKSBhbmQgZGlzdGluY3Rpb25zIGJldHdlZW4gJ0ZvbycgYW5kCi8vLyAnRm9vPGR5bmFtaWM+JywgZmVhdHVyZXMgdGhhdCBhcmUgbm90IG5lZWRlZCBmb3IgY29kZSBnZW5lcmF0aW9uIGFuZCBub3QKLy8vIHN1cHBvcnRlZCBmcm9tIGtlcm5lbC4KLy8vCi8vLyBDdXJyZW50IG9ubHkgJ3Jlc29sdXRpb25fdHlwZXMuZGFydCcgaW1wbGVtZW50IHRoaXMgaGllcmFyY2h5IGJ1dCB3aGVuIHRoZQovLy8gY29tcGlsZXIgbW92ZXMgdG8gdXNlIFtFbnRpdHldIGluc3RlYWQgb2YgW0VsZW1lbnRdIHRoaXMgaGllcmFyY2h5IGNhbiBiZQovLy8gaW1wbGVtZW50ZWQgZGlyZWN0bHkgYnV0IG90aGVyIGVudGl0eSBzeXN0ZW1zLCBmb3IgaW5zdGFuY2UgYmFzZWQgZGlyZWN0bHkKLy8vIG9uIGtlcm5lbCBpciB3aXRob3V0IHRoZSBuZWVkIGZvciBbRWxlbWVudF0uCgphYnN0cmFjdCBjbGFzcyBEYXJ0VHlwZSB7CiAgY29uc3QgRGFydFR5cGUoKTsKCiAgLy8vIFJldHVybnMgdGhlIHVuYWxpYXNlZCB0eXBlIG9mIHRoaXMgdHlwZS4KICAvLy8KICAvLy8gVGhlIHVuYWxpYXNlZCB0eXBlIG9mIGEgdHlwZWRlZidkIHR5cGUgaXMgdGhlIHVuYWxpYXNlZCB0eXBlIHRvIHdoaWNoIGl0cwogIC8vLyBuYW1lIGlzIGJvdW5kLiBUaGUgdW5hbGlhc2VkIHZlcnNpb24gb2YgYW55IG90aGVyIHR5cGUgaXMgdGhlIHR5cGUgaXRzZWxmLgogIC8vLwogIC8vLyBGb3IgZXhhbXBsZSwgdGhlIHVuYWxpYXNlZCB0eXBlIG9mIGB0eXBlZGVmIEEgRnVuYzxBLEI+KEIgYilgIGlzIHRoZQogIC8vLyBmdW5jdGlvbiB0eXBlIGAoQikgLT4gQWAgYW5kIHRoZSB1bmFsaWFzZWQgdHlwZSBvZiBgRnVuYzxpbnQsU3RyaW5nPmAKICAvLy8gaXMgdGhlIGZ1bmN0aW9uIHR5cGUgYChTdHJpbmcpIC0+IGludGAuCiAgRGFydFR5cGUgZ2V0IHVuYWxpYXNlZCA9PiB0aGlzOwoKICAvLy8gSXMgYHRydWVgIGlmIHRoaXMgdHlwZSBoYXMgbm8gbm9uLWR5bmFtaWMgdHlwZSBhcmd1bWVudHMuCiAgYm9vbCBnZXQgdHJlYXRBc1JhdyA9PiB0cnVlOwoKICAvLy8gSXMgYHRydWVgIGlmIHRoaXMgdHlwZSBzaG91bGQgYmUgdHJlYXRlZCBhcyB0aGUgZHluYW1pYyB0eXBlLgogIGJvb2wgZ2V0IHRyZWF0QXNEeW5hbWljID0+IGZhbHNlOwoKICAvLy8gSXMgYHRydWVgIGlmIHRoaXMgdHlwZSBpcyB0aGUgZHluYW1pYyB0eXBlLgogIGJvb2wgZ2V0IGlzRHluYW1pYyA9PiBmYWxzZTsKCiAgLy8vIElzIGB0cnVlYCBpZiB0aGlzIHR5cGUgaXMgdGhlIHZvaWQgdHlwZS4KICBib29sIGdldCBpc1ZvaWQgPT4gZmFsc2U7CgogIC8vLyBJcyBgdHJ1ZWAgaWYgdGhpcyB0eXBlIGlzIGFuIGludGVyZmFjZSB0eXBlLgogIGJvb2wgZ2V0IGlzSW50ZXJmYWNlVHlwZSA9PiBmYWxzZTsKCiAgLy8vIElzIGB0cnVlYCBpZiB0aGlzIHR5cGUgaXMgYSB0eXBlZGVmLgogIGJvb2wgZ2V0IGlzVHlwZWRlZiA9PiBmYWxzZTsKCiAgLy8vIElzIGB0cnVlYCBpZiB0aGlzIHR5cGUgaXMgYSBmdW5jdGlvbiB0eXBlLgogIGJvb2wgZ2V0IGlzRnVuY3Rpb25UeXBlID0+IGZhbHNlOwoKICAvLy8gSXMgYHRydWVgIGlmIHRoaXMgdHlwZSBpcyBhIHR5cGUgdmFyaWFibGUuCiAgYm9vbCBnZXQgaXNUeXBlVmFyaWFibGUgPT4gZmFsc2U7CgogIC8vLyBJcyBgdHJ1ZWAgaWYgdGhpcyB0eXBlIGlzIGEgdHlwZSB2YXJpYWJsZSBkZWNsYXJlZCBvbiBhIGZ1bmN0aW9uIHR5cGUKICAvLy8KICAvLy8gRm9yIGluc3RhbmNlIGBUYCBpbgogIC8vLyAgICAgdm9pZCBGdW5jdGlvbjxUPihUIHQpCiAgYm9vbCBnZXQgaXNGdW5jdGlvblR5cGVWYXJpYWJsZSA9PiBmYWxzZTsKCiAgLy8vIElzIGB0cnVlYCBpZiB0aGlzIHR5cGUgaXMgYSBgRnV0dXJlT3JgIHR5cGUuCiAgYm9vbCBnZXQgaXNGdXR1cmVPciA9PiBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgdGhpcyB0eXBlIGNvbnRhaW5zIGEgdHlwZSB2YXJpYWJsZS4KICBib29sIGdldCBjb250YWluc1R5cGVWYXJpYWJsZXMgPT4gZmFsc2U7CgogIC8vLyBXaGV0aGVyIHRoaXMgdHlwZSBjb250YWlucyBhIGZyZWUgY2xhc3MgdHlwZSB2YXJpYWJsZSBvciBmdW5jdGlvbiB0eXBlCiAgLy8vIHZhcmlhYmxlLgogIC8vIFRPRE8oc3JhKTogUmV2aWV3IHVzZXMgb2YgW2NvbnRhaW5zVHlwZVZhcmlhYmxlc10gZm9yIHVwZGF0ZSB3aXRoCiAgLy8gW2NvbnRhaW5zRnJlZVR5cGVWYXJpYWJsZXNdLgogIGJvb2wgZ2V0IGNvbnRhaW5zRnJlZVR5cGVWYXJpYWJsZXMgPT4gX2NvbnRhaW5zRnJlZVR5cGVWYXJpYWJsZXMobnVsbCk7CgogIC8vLyBJcyBgdHJ1ZWAgaWYgdGhpcyB0eXBlIGlzIHRoZSAnT2JqZWN0JyB0eXBlIGRlZmluZWQgaW4gJ2RhcnQ6Y29yZScuCiAgYm9vbCBnZXQgaXNPYmplY3QgPT4gZmFsc2U7CgogIC8vLyBBcHBsaWVzIFtmXSB0byBlYWNoIG9jY3VyZW5jZSBvZiBhIFtUeXBlVmFyaWFibGVUeXBlXSB3aXRoaW4gdGhpcwogIC8vLyB0eXBlLiBUaGlzIGV4Y2x1ZGVzIGZ1bmN0aW9uIHR5cGUgdmFyaWFibGVzLCB3aGV0aGVyIGZyZWUgb3IgYm91bmQuCiAgdm9pZCBmb3JFYWNoVHlwZVZhcmlhYmxlKGYoVHlwZVZhcmlhYmxlVHlwZSB2YXJpYWJsZSkpIHt9CgogIC8vLyBQZXJmb3JtcyB0aGUgc3Vic3RpdHV0aW9uIGBbYXJndW1lbnRzW2ldL3BhcmFtZXRlcnNbaV1ddGhpc2AuCiAgLy8vCiAgLy8vIFRoZSBub3RhdGlvbiBpcyBrbm93biBmcm9tIHRoaXMgbGFtYmRhIGNhbGN1bHVzIHJ1bGU6CiAgLy8vCiAgLy8vICAgICAobGFtYmRhIHguZTApZTEgLT4gW2UxL3hdZTAuCiAgLy8vCiAgLy8vIFNlZSBbVHlwZVZhcmlhYmxlVHlwZV0gZm9yIGEgbW90aXZhdGlvbiBmb3IgdGhpcyBtZXRob2QuCiAgLy8vCiAgLy8vIEludmFyaWFudDogVGhlcmUgbXVzdCBiZSB0aGUgc2FtZSBudW1iZXIgb2YgW2FyZ3VtZW50c10gYW5kIFtwYXJhbWV0ZXJzXS4KICBEYXJ0VHlwZSBzdWJzdChMaXN0PERhcnRUeXBlPiBhcmd1bWVudHMsIExpc3Q8RGFydFR5cGU+IHBhcmFtZXRlcnMpOwoKICAvLy8gQ2FsbHMgdGhlIHZpc2l0IG1ldGhvZCBvbiBbdmlzaXRvcl0gY29ycmVzcG9uZGluZyB0byB0aGlzIHR5cGUuCiAgUiBhY2NlcHQ8UiwgQT4oRGFydFR5cGVWaXNpdG9yPFIsIEE+IHZpc2l0b3IsIEEgYXJndW1lbnQpOwoKICBib29sIF9lcXVhbHMoRGFydFR5cGUgb3RoZXIsIF9Bc3N1bXB0aW9ucyBhc3N1bXB0aW9ucyk7CgogIGJvb2wgX2NvbnRhaW5zRnJlZVR5cGVWYXJpYWJsZXMoTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4gYmluZGluZ3MpID0+IGZhbHNlOwp9CgovLy8gUGFpcnMgb2YgW0Z1bmN0aW9uVHlwZVZhcmlhYmxlXXMgdGhhdCBhcmUgY3VycmVudGx5IGFzc3VtZWQgdG8gYmUKLy8vIGVxdWl2YWxlbnQuCi8vLwovLy8gVGhpcyBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIGVxdWl2YWxlbmNlIHJlbGF0aW9uIG9uIHR5cGVzIGNvaW5kdWN0aXZlbHkuCmNsYXNzIF9Bc3N1bXB0aW9ucyB7CiAgTWFwPEZ1bmN0aW9uVHlwZVZhcmlhYmxlLCBTZXQ8RnVuY3Rpb25UeXBlVmFyaWFibGU+PiBfYXNzdW1wdGlvbk1hcCA9CiAgICAgIDxGdW5jdGlvblR5cGVWYXJpYWJsZSwgU2V0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPj57fTsKCiAgdm9pZCBfYWRkQXNzdW1wdGlvbihGdW5jdGlvblR5cGVWYXJpYWJsZSBhLCBGdW5jdGlvblR5cGVWYXJpYWJsZSBiKSB7CiAgICBfYXNzdW1wdGlvbk1hcAogICAgICAgIC5wdXRJZkFic2VudChhLCAoKSA9PiBuZXcgU2V0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPi5pZGVudGl0eSgpKQogICAgICAgIC5hZGQoYik7CiAgfQoKICAvLy8gQXNzdW1lIHRoYXQgW2FdIGFuZCBbYl0gYXJlIGVxdWl2YWxlbnQuCiAgdm9pZCBhc3N1bWUoRnVuY3Rpb25UeXBlVmFyaWFibGUgYSwgRnVuY3Rpb25UeXBlVmFyaWFibGUgYikgewogICAgX2FkZEFzc3VtcHRpb24oYSwgYik7CiAgICBfYWRkQXNzdW1wdGlvbihiLCBhKTsKICB9CgogIHZvaWQgX3JlbW92ZUFzc3VtcHRpb24oRnVuY3Rpb25UeXBlVmFyaWFibGUgYSwgRnVuY3Rpb25UeXBlVmFyaWFibGUgYikgewogICAgU2V0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPiBzZXQgPSBfYXNzdW1wdGlvbk1hcFthXTsKICAgIGlmIChzZXQgIT0gbnVsbCkgewogICAgICBzZXQucmVtb3ZlKGIpOwogICAgICBpZiAoc2V0LmlzRW1wdHkpIHsKICAgICAgICBfYXNzdW1wdGlvbk1hcC5yZW1vdmUoYSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBSZW1vdmUgdGhlIGFzc3VtcHRpb24gdGhhdCBbYV0gYW5kIFtiXSBhcmUgZXF1aXZhbGVudC4KICB2b2lkIGZvcmdldChGdW5jdGlvblR5cGVWYXJpYWJsZSBhLCBGdW5jdGlvblR5cGVWYXJpYWJsZSBiKSB7CiAgICBfcmVtb3ZlQXNzdW1wdGlvbihhLCBiKTsKICAgIF9yZW1vdmVBc3N1bXB0aW9uKGIsIGEpOwogIH0KCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFthXSBhbmQgW2JdIGFyZSBhc3N1bWVkIHRvIGJlIGVxdWl2YWxlbnQuCiAgYm9vbCBpc0Fzc3VtZWQoRnVuY3Rpb25UeXBlVmFyaWFibGUgYSwgRnVuY3Rpb25UeXBlVmFyaWFibGUgYikgewogICAgcmV0dXJuIF9hc3N1bXB0aW9uTWFwW2FdPy5jb250YWlucyhiKSA/PyBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCdfQXNzdW1wdGlvbnMoJyk7CiAgICBTdHJpbmcgY29tbWEgPSAnJzsKICAgIF9hc3N1bXB0aW9uTWFwCiAgICAgICAgLmZvckVhY2goKEZ1bmN0aW9uVHlwZVZhcmlhYmxlIGEsIFNldDxGdW5jdGlvblR5cGVWYXJpYWJsZT4gc2V0KSB7CiAgICAgIHNiLndyaXRlKCckY29tbWEkYSAoJHtpZGVudGl0eUhhc2hDb2RlKGEpfSktPicKICAgICAgICAgICd7JHtzZXQubWFwKChiKSA9PiAnJGIgKCR7aWRlbnRpdHlIYXNoQ29kZShiKX0pJykuam9pbignLCcpfX0nKTsKICAgICAgY29tbWEgPSAnLCc7CiAgICB9KTsKICAgIHNiLndyaXRlKCcpJyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCmNsYXNzIEludGVyZmFjZVR5cGUgZXh0ZW5kcyBEYXJ0VHlwZSB7CiAgZmluYWwgQ2xhc3NFbnRpdHkgZWxlbWVudDsKICBmaW5hbCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzOwoKICBJbnRlcmZhY2VUeXBlKHRoaXMuZWxlbWVudCwgdGhpcy50eXBlQXJndW1lbnRzKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNJbnRlcmZhY2VUeXBlID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzT2JqZWN0IHsKICAgIHJldHVybiBlbGVtZW50Lm5hbWUgPT0gJ09iamVjdCcgJiYKICAgICAgICBlbGVtZW50LmxpYnJhcnkuY2Fub25pY2FsVXJpID09IFVyaXMuZGFydF9jb3JlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgY29udGFpbnNUeXBlVmFyaWFibGVzID0+CiAgICAgIHR5cGVBcmd1bWVudHMuYW55KCh0eXBlKSA9PiB0eXBlLmNvbnRhaW5zVHlwZVZhcmlhYmxlcyk7CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaFR5cGVWYXJpYWJsZShmKFR5cGVWYXJpYWJsZVR5cGUgdmFyaWFibGUpKSB7CiAgICB0eXBlQXJndW1lbnRzLmZvckVhY2goKHR5cGUpID0+IHR5cGUuZm9yRWFjaFR5cGVWYXJpYWJsZShmKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIF9jb250YWluc0ZyZWVUeXBlVmFyaWFibGVzKExpc3Q8RnVuY3Rpb25UeXBlVmFyaWFibGU+IGJpbmRpbmdzKSB7CiAgICByZXR1cm4gdHlwZUFyZ3VtZW50cwogICAgICAgIC5hbnkoKHR5cGUpID0+IHR5cGUuX2NvbnRhaW5zRnJlZVR5cGVWYXJpYWJsZXMoYmluZGluZ3MpKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgc3Vic3QoTGlzdDxEYXJ0VHlwZT4gYXJndW1lbnRzLCBMaXN0PERhcnRUeXBlPiBwYXJhbWV0ZXJzKSB7CiAgICBpZiAodHlwZUFyZ3VtZW50cy5pc0VtcHR5KSB7CiAgICAgIC8vIFJldHVybiBmYXN0IG9uIG5vbi1nZW5lcmljIHR5cGVzLgogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGlmIChwYXJhbWV0ZXJzLmlzRW1wdHkpIHsKICAgICAgYXNzZXJ0KGFyZ3VtZW50cy5pc0VtcHR5KTsKICAgICAgLy8gUmV0dXJuIGZhc3Qgb24gZW1wdHkgc3Vic3RpdHV0aW9ucy4KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBMaXN0PERhcnRUeXBlPiBuZXdUeXBlQXJndW1lbnRzID0KICAgICAgICBfc3Vic3RUeXBlcyh0eXBlQXJndW1lbnRzLCBhcmd1bWVudHMsIHBhcmFtZXRlcnMpOwogICAgaWYgKCFpZGVudGljYWwodHlwZUFyZ3VtZW50cywgbmV3VHlwZUFyZ3VtZW50cykpIHsKICAgICAgLy8gQ3JlYXRlIGEgbmV3IHR5cGUgb25seSBpZiBuZWNlc3NhcnkuCiAgICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZShlbGVtZW50LCBuZXdUeXBlQXJndW1lbnRzKTsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgdHJlYXRBc1JhdyB7CiAgICBmb3IgKERhcnRUeXBlIHR5cGUgaW4gdHlwZUFyZ3VtZW50cykgewogICAgICBpZiAoIXR5cGUudHJlYXRBc0R5bmFtaWMpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgUiBhY2NlcHQ8UiwgQT4oRGFydFR5cGVWaXNpdG9yPFIsIEE+IHZpc2l0b3IsIEEgYXJndW1lbnQpID0+CiAgICAgIHZpc2l0b3IudmlzaXRJbnRlcmZhY2VUeXBlKHRoaXMsIGFyZ3VtZW50KTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICBpbnQgaGFzaCA9IGVsZW1lbnQuaGFzaENvZGU7CiAgICBmb3IgKERhcnRUeXBlIGFyZ3VtZW50IGluIHR5cGVBcmd1bWVudHMpIHsKICAgICAgaW50IGFyZ3VtZW50SGFzaCA9IGFyZ3VtZW50ICE9IG51bGwgPyBhcmd1bWVudC5oYXNoQ29kZSA6IDA7CiAgICAgIGhhc2ggPSAxNyAqIGhhc2ggKyAzICogYXJndW1lbnRIYXNoOwogICAgfQogICAgcmV0dXJuIGhhc2g7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIEludGVyZmFjZVR5cGUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBfZXF1YWxzSW50ZXJuYWwob3RoZXIsIG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBfZXF1YWxzKERhcnRUeXBlIG90aGVyLCBfQXNzdW1wdGlvbnMgYXNzdW1wdGlvbnMpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgSW50ZXJmYWNlVHlwZSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIF9lcXVhbHNJbnRlcm5hbChvdGhlciwgYXNzdW1wdGlvbnMpOwogIH0KCiAgYm9vbCBfZXF1YWxzSW50ZXJuYWwoSW50ZXJmYWNlVHlwZSBvdGhlciwgX0Fzc3VtcHRpb25zIGFzc3VtcHRpb25zKSB7CiAgICByZXR1cm4gaWRlbnRpY2FsKGVsZW1lbnQsIG90aGVyLmVsZW1lbnQpICYmCiAgICAgICAgX2VxdWFsVHlwZXModHlwZUFyZ3VtZW50cywgb3RoZXIudHlwZUFyZ3VtZW50cywgYXNzdW1wdGlvbnMpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoZWxlbWVudC5uYW1lKTsKICAgIGlmICh0eXBlQXJndW1lbnRzLmlzTm90RW1wdHkpIHsKICAgICAgc2Iud3JpdGUoJzwnKTsKICAgICAgYm9vbCBuZWVkc0NvbW1hID0gZmFsc2U7CiAgICAgIGZvciAoRGFydFR5cGUgdHlwZUFyZ3VtZW50IGluIHR5cGVBcmd1bWVudHMpIHsKICAgICAgICBpZiAobmVlZHNDb21tYSkgewogICAgICAgICAgc2Iud3JpdGUoJywnKTsKICAgICAgICB9CiAgICAgICAgc2Iud3JpdGUodHlwZUFyZ3VtZW50KTsKICAgICAgICBuZWVkc0NvbW1hID0gdHJ1ZTsKICAgICAgfQogICAgICBzYi53cml0ZSgnPicpOwogICAgfQogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgpjbGFzcyBUeXBlZGVmVHlwZSBleHRlbmRzIERhcnRUeXBlIHsKICBmaW5hbCBUeXBlZGVmRW50aXR5IGVsZW1lbnQ7CiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKICBAb3ZlcnJpZGUKICBmaW5hbCBGdW5jdGlvblR5cGUgdW5hbGlhc2VkOwoKICBUeXBlZGVmVHlwZSh0aGlzLmVsZW1lbnQsIHRoaXMudHlwZUFyZ3VtZW50cywgdGhpcy51bmFsaWFzZWQpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1R5cGVkZWYgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgY29udGFpbnNUeXBlVmFyaWFibGVzID0+CiAgICAgIHR5cGVBcmd1bWVudHMuYW55KCh0eXBlKSA9PiB0eXBlLmNvbnRhaW5zVHlwZVZhcmlhYmxlcyk7CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaFR5cGVWYXJpYWJsZShmKFR5cGVWYXJpYWJsZVR5cGUgdmFyaWFibGUpKSB7CiAgICB0eXBlQXJndW1lbnRzLmZvckVhY2goKHR5cGUpID0+IHR5cGUuZm9yRWFjaFR5cGVWYXJpYWJsZShmKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIF9jb250YWluc0ZyZWVUeXBlVmFyaWFibGVzKExpc3Q8RnVuY3Rpb25UeXBlVmFyaWFibGU+IGJpbmRpbmdzKSA9PgogICAgICB0eXBlQXJndW1lbnRzLmFueSgodHlwZSkgPT4gdHlwZS5fY29udGFpbnNGcmVlVHlwZVZhcmlhYmxlcyhiaW5kaW5ncykpOwoKICBAb3ZlcnJpZGUKICBUeXBlZGVmVHlwZSBzdWJzdChMaXN0PERhcnRUeXBlPiBhcmd1bWVudHMsIExpc3Q8RGFydFR5cGU+IHBhcmFtZXRlcnMpIHsKICAgIGlmICh0eXBlQXJndW1lbnRzLmlzRW1wdHkpIHsKICAgICAgLy8gUmV0dXJuIGZhc3Qgb24gbm9uLWdlbmVyaWMgdHlwZXMuCiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgaWYgKHBhcmFtZXRlcnMuaXNFbXB0eSkgewogICAgICBhc3NlcnQoYXJndW1lbnRzLmlzRW1wdHkpOwogICAgICAvLyBSZXR1cm4gZmFzdCBvbiBlbXB0eSBzdWJzdGl0dXRpb25zLgogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIExpc3Q8RGFydFR5cGU+IG5ld1R5cGVBcmd1bWVudHMgPQogICAgICAgIF9zdWJzdFR5cGVzKHR5cGVBcmd1bWVudHMsIGFyZ3VtZW50cywgcGFyYW1ldGVycyk7CiAgICBGdW5jdGlvblR5cGUgbmV3VW5hbGlhc2VkID0gdW5hbGlhc2VkLnN1YnN0KGFyZ3VtZW50cywgcGFyYW1ldGVycyk7CiAgICBpZiAoIWlkZW50aWNhbCh0eXBlQXJndW1lbnRzLCBuZXdUeXBlQXJndW1lbnRzKSB8fAogICAgICAgICFpZGVudGljYWwodW5hbGlhc2VkLCBuZXdVbmFsaWFzZWQpKSB7CiAgICAgIC8vIENyZWF0ZSBhIG5ldyB0eXBlIG9ubHkgaWYgbmVjZXNzYXJ5LgogICAgICByZXR1cm4gbmV3IFR5cGVkZWZUeXBlKGVsZW1lbnQsIG5ld1R5cGVBcmd1bWVudHMsIG5ld1VuYWxpYXNlZCk7CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IHRyZWF0QXNSYXcgewogICAgZm9yIChEYXJ0VHlwZSB0eXBlIGluIHR5cGVBcmd1bWVudHMpIHsKICAgICAgaWYgKCF0eXBlLnRyZWF0QXNEeW5hbWljKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIFIgYWNjZXB0PFIsIEE+KERhcnRUeXBlVmlzaXRvcjxSLCBBPiB2aXNpdG9yLCBBIGFyZ3VtZW50KSA9PgogICAgICB2aXNpdG9yLnZpc2l0VHlwZWRlZlR5cGUodGhpcywgYXJndW1lbnQpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIGludCBoYXNoID0gZWxlbWVudC5oYXNoQ29kZTsKICAgIGZvciAoRGFydFR5cGUgYXJndW1lbnQgaW4gdHlwZUFyZ3VtZW50cykgewogICAgICBpbnQgYXJndW1lbnRIYXNoID0gYXJndW1lbnQgIT0gbnVsbCA/IGFyZ3VtZW50Lmhhc2hDb2RlIDogMDsKICAgICAgaGFzaCA9IDE3ICogaGFzaCArIDMgKiBhcmd1bWVudEhhc2g7CiAgICB9CiAgICByZXR1cm4gaGFzaDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgVHlwZWRlZlR5cGUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBfZXF1YWxzSW50ZXJuYWwob3RoZXIsIG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBfZXF1YWxzKERhcnRUeXBlIG90aGVyLCBfQXNzdW1wdGlvbnMgYXNzdW1wdGlvbnMpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgVHlwZWRlZlR5cGUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBfZXF1YWxzSW50ZXJuYWwob3RoZXIsIGFzc3VtcHRpb25zKTsKICB9CgogIGJvb2wgX2VxdWFsc0ludGVybmFsKFR5cGVkZWZUeXBlIG90aGVyLCBfQXNzdW1wdGlvbnMgYXNzdW1wdGlvbnMpIHsKICAgIHJldHVybiBpZGVudGljYWwoZWxlbWVudCwgb3RoZXIuZWxlbWVudCkgJiYKICAgICAgICBfZXF1YWxUeXBlcyh0eXBlQXJndW1lbnRzLCBvdGhlci50eXBlQXJndW1lbnRzLCBhc3N1bXB0aW9ucyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZShlbGVtZW50Lm5hbWUpOwogICAgaWYgKHR5cGVBcmd1bWVudHMuaXNOb3RFbXB0eSkgewogICAgICBzYi53cml0ZSgnPCcpOwogICAgICBib29sIG5lZWRzQ29tbWEgPSBmYWxzZTsKICAgICAgZm9yIChEYXJ0VHlwZSB0eXBlQXJndW1lbnQgaW4gdHlwZUFyZ3VtZW50cykgewogICAgICAgIGlmIChuZWVkc0NvbW1hKSB7CiAgICAgICAgICBzYi53cml0ZSgnLCcpOwogICAgICAgIH0KICAgICAgICBzYi53cml0ZSh0eXBlQXJndW1lbnQpOwogICAgICAgIG5lZWRzQ29tbWEgPSB0cnVlOwogICAgICB9CiAgICAgIHNiLndyaXRlKCc+Jyk7CiAgICB9CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCmNsYXNzIFR5cGVWYXJpYWJsZVR5cGUgZXh0ZW5kcyBEYXJ0VHlwZSB7CiAgZmluYWwgVHlwZVZhcmlhYmxlRW50aXR5IGVsZW1lbnQ7CgogIFR5cGVWYXJpYWJsZVR5cGUodGhpcy5lbGVtZW50KTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNUeXBlVmFyaWFibGUgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgY29udGFpbnNUeXBlVmFyaWFibGVzID0+IHRydWU7CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaFR5cGVWYXJpYWJsZShmKFR5cGVWYXJpYWJsZVR5cGUgdmFyaWFibGUpKSB7CiAgICBmKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBfY29udGFpbnNGcmVlVHlwZVZhcmlhYmxlcyhMaXN0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPiBiaW5kaW5ncykgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgc3Vic3QoTGlzdDxEYXJ0VHlwZT4gYXJndW1lbnRzLCBMaXN0PERhcnRUeXBlPiBwYXJhbWV0ZXJzKSB7CiAgICBhc3NlcnQoYXJndW1lbnRzLmxlbmd0aCA9PSBwYXJhbWV0ZXJzLmxlbmd0aCk7CiAgICBpZiAocGFyYW1ldGVycy5pc0VtcHR5KSB7CiAgICAgIC8vIFJldHVybiBmYXN0IG9uIGVtcHR5IHN1YnN0aXR1dGlvbnMuCiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgaW50IGluZGV4ID0gcGFyYW1ldGVycy5pbmRleE9mKHRoaXMpOwogICAgaWYgKGluZGV4ICE9IC0xKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHNbaW5kZXhdOwogICAgfQogICAgLy8gVGhlIHR5cGUgdmFyaWFibGUgd2FzIG5vdCBzdWJzdGl0dXRlZC4KICAgIHJldHVybiB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgUiBhY2NlcHQ8UiwgQT4oRGFydFR5cGVWaXNpdG9yPFIsIEE+IHZpc2l0b3IsIEEgYXJndW1lbnQpID0+CiAgICAgIHZpc2l0b3IudmlzaXRUeXBlVmFyaWFibGVUeXBlKHRoaXMsIGFyZ3VtZW50KTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiAxNyAqIGVsZW1lbnQuaGFzaENvZGU7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyEgVHlwZVZhcmlhYmxlVHlwZSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIGlkZW50aWNhbChvdGhlci5lbGVtZW50LCBlbGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhEYXJ0VHlwZSBvdGhlciwgX0Fzc3VtcHRpb25zIGFzc3VtcHRpb25zKSB7CiAgICBpZiAob3RoZXIgaXMgVHlwZVZhcmlhYmxlVHlwZSkgewogICAgICByZXR1cm4gaWRlbnRpY2FsKG90aGVyLmVsZW1lbnQsIGVsZW1lbnQpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyR7ZWxlbWVudC50eXBlRGVjbGFyYXRpb24ubmFtZX0uJHtlbGVtZW50Lm5hbWV9JzsKfQoKLy8vIEEgdHlwZSB2YXJpYWJsZSBkZWNsYXJlZCBvbiBhIGZ1bmN0aW9uIHR5cGUuCi8vLwovLy8gRm9yIGluc3RhbmNlIGBUYCBpbgovLy8gICAgIHZvaWQgRnVuY3Rpb248VD4oVCB0KQovLy8KLy8vIFN1Y2ggYSB0eXBlIHZhcmlhYmxlIGlzIGRpZmZlcmVudCBmcm9tIGEgW1R5cGVWYXJpYWJsZVR5cGVdIGJlY2F1c2UgaXQKLy8vIGRvZXNuJ3QgaGF2ZSBhIHVuaXF1ZSBpZGVudGl0eTsgaXMgaXMgZXF1YWwgdG8gYW55IG90aGVyCi8vLyBbRnVuY3Rpb25UeXBlVmFyaWFibGVdIHVzZWQgc2ltaWxhcmx5IGluIGFub3RoZXIgc3RydWN0dXJhbGx5IGVxdWl2YWxlbnQKLy8vIGZ1bmN0aW9uIHR5cGUuCmNsYXNzIEZ1bmN0aW9uVHlwZVZhcmlhYmxlIGV4dGVuZHMgRGFydFR5cGUgewogIC8vLyBUaGUgaW5kZXggb2YgdGhpcyB0eXBlIHdpdGhpbiB0aGUgdHlwZSB2YXJpYWJsZXMgb2YgdGhlIGRlY2xhcmluZyBmdW5jdGlvbgogIC8vLyB0eXBlLgogIGZpbmFsIGludCBpbmRleDsKCiAgLy8vIFRoZSBib3VuZCBvZiB0aGlzIGZ1bmN0aW9uIHR5cGUgdmFyaWFibGUuCiAgRGFydFR5cGUgX2JvdW5kOwoKICBGdW5jdGlvblR5cGVWYXJpYWJsZSh0aGlzLmluZGV4KTsKCiAgRGFydFR5cGUgZ2V0IGJvdW5kIHsKICAgIGFzc2VydChfYm91bmQgIT0gbnVsbCwgIkJvdW5kIGhhc24ndCBiZWVuIHNldC4iKTsKICAgIHJldHVybiBfYm91bmQ7CiAgfQoKICB2b2lkIHNldCBib3VuZChEYXJ0VHlwZSB2YWx1ZSkgewogICAgYXNzZXJ0KF9ib3VuZCA9PSBudWxsLCAiQm91bmQgaGFzIGFscmVhZHkgYmVlbiBzZXQuIik7CiAgICBfYm91bmQgPSB2YWx1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRnVuY3Rpb25UeXBlVmFyaWFibGUgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBfY29udGFpbnNGcmVlVHlwZVZhcmlhYmxlcyhMaXN0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPiBiaW5kaW5ncykgewogICAgaWYgKGJpbmRpbmdzID09IG51bGwpIHJldHVybiB0cnVlOwogICAgaWYgKGJpbmRpbmdzLmluZGV4T2YodGhpcykgPj0gMCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBzdWJzdChMaXN0PERhcnRUeXBlPiBhcmd1bWVudHMsIExpc3Q8RGFydFR5cGU+IHBhcmFtZXRlcnMpIHsKICAgIGFzc2VydChhcmd1bWVudHMubGVuZ3RoID09IHBhcmFtZXRlcnMubGVuZ3RoKTsKICAgIGlmIChwYXJhbWV0ZXJzLmlzRW1wdHkpIHsKICAgICAgLy8gUmV0dXJuIGZhc3Qgb24gZW1wdHkgc3Vic3RpdHV0aW9ucy4KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBpbnQgaW5kZXggPSBwYXJhbWV0ZXJzLmluZGV4T2YodGhpcyk7CiAgICBpZiAoaW5kZXggIT0gLTEpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50c1tpbmRleF07CiAgICB9CiAgICAvLyBUaGUgZnVuY3Rpb24gdHlwZSB2YXJpYWJsZSB3YXMgbm90IHN1YnN0aXR1dGVkLgogICAgcmV0dXJuIHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IGluZGV4Lmhhc2hDb2RlICogMTk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgRnVuY3Rpb25UeXBlVmFyaWFibGUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhEYXJ0VHlwZSBvdGhlciwgX0Fzc3VtcHRpb25zIGFzc3VtcHRpb25zKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIEZ1bmN0aW9uVHlwZVZhcmlhYmxlKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoYXNzdW1wdGlvbnMgIT0gbnVsbCkgcmV0dXJuIGFzc3VtcHRpb25zLmlzQXNzdW1lZCh0aGlzLCBvdGhlcik7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBSIGFjY2VwdDxSLCBBPihEYXJ0VHlwZVZpc2l0b3I8UiwgQT4gdmlzaXRvciwgQSBhcmd1bWVudCkgPT4KICAgICAgdmlzaXRvci52aXNpdEZ1bmN0aW9uVHlwZVZhcmlhYmxlKHRoaXMsIGFyZ3VtZW50KTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyMke25ldyBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4NDEgKyBpbmRleCl9JzsKfQoKY2xhc3MgVm9pZFR5cGUgZXh0ZW5kcyBEYXJ0VHlwZSB7CiAgY29uc3QgVm9pZFR5cGUoKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNWb2lkID0+IHRydWU7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHN1YnN0KExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cywgTGlzdDxEYXJ0VHlwZT4gcGFyYW1ldGVycykgewogICAgLy8gYHZvaWRgIGNhbm5vdCBiZSBzdWJzdGl0dXRlZC4KICAgIHJldHVybiB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgUiBhY2NlcHQ8UiwgQT4oRGFydFR5cGVWaXNpdG9yPFIsIEE+IHZpc2l0b3IsIEEgYXJndW1lbnQpID0+CiAgICAgIHZpc2l0b3IudmlzaXRWb2lkVHlwZSh0aGlzLCBhcmd1bWVudCk7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gNjAwNzsKCiAgQG92ZXJyaWRlCiAgYm9vbCBfZXF1YWxzKERhcnRUeXBlIG90aGVyLCBfQXNzdW1wdGlvbnMgYXNzdW1wdGlvbnMpIHsKICAgIHJldHVybiBpZGVudGljYWwodGhpcywgb3RoZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ3ZvaWQnOwp9CgpjbGFzcyBEeW5hbWljVHlwZSBleHRlbmRzIERhcnRUeXBlIHsKICBjb25zdCBEeW5hbWljVHlwZSgpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0R5bmFtaWMgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgdHJlYXRBc0R5bmFtaWMgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgc3Vic3QoTGlzdDxEYXJ0VHlwZT4gYXJndW1lbnRzLCBMaXN0PERhcnRUeXBlPiBwYXJhbWV0ZXJzKSB7CiAgICAvLyBgZHluYW1pY2AgY2Fubm90IGJlIHN1YnN0aXR1dGVkLgogICAgcmV0dXJuIHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBSIGFjY2VwdDxSLCBBPihEYXJ0VHlwZVZpc2l0b3I8UiwgQT4gdmlzaXRvciwgQSBhcmd1bWVudCkgPT4KICAgICAgdmlzaXRvci52aXNpdER5bmFtaWNUeXBlKHRoaXMsIGFyZ3VtZW50KTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiA5MTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBfZXF1YWxzKERhcnRUeXBlIG90aGVyLCBfQXNzdW1wdGlvbnMgYXNzdW1wdGlvbnMpIHsKICAgIHJldHVybiBpZGVudGljYWwodGhpcywgb3RoZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ2R5bmFtaWMnOwp9CgpjbGFzcyBGdW5jdGlvblR5cGUgZXh0ZW5kcyBEYXJ0VHlwZSB7CiAgZmluYWwgRGFydFR5cGUgcmV0dXJuVHlwZTsKICBmaW5hbCBMaXN0PERhcnRUeXBlPiBwYXJhbWV0ZXJUeXBlczsKICBmaW5hbCBMaXN0PERhcnRUeXBlPiBvcHRpb25hbFBhcmFtZXRlclR5cGVzOwoKICAvLy8gVGhlIG5hbWVzIG9mIHRoZSBuYW1lZCBwYXJhbWV0ZXJzIG9yZGVyZWQgbGV4aWNvZ3JhcGhpY2FsbHkuCiAgZmluYWwgTGlzdDxTdHJpbmc+IG5hbWVkUGFyYW1ldGVyczsKCiAgLy8vIFRoZSB0eXBlcyBvZiB0aGUgbmFtZWQgcGFyYW1ldGVycyBpbiB0aGUgb3JkZXIgY29ycmVzcG9uZGluZyB0byB0aGUKICAvLy8gW25hbWVkUGFyYW1ldGVyc10uCiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gbmFtZWRQYXJhbWV0ZXJUeXBlczsKCiAgZmluYWwgTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4gdHlwZVZhcmlhYmxlczsKCiAgRnVuY3Rpb25UeXBlKAogICAgICB0aGlzLnJldHVyblR5cGUsCiAgICAgIHRoaXMucGFyYW1ldGVyVHlwZXMsCiAgICAgIHRoaXMub3B0aW9uYWxQYXJhbWV0ZXJUeXBlcywKICAgICAgdGhpcy5uYW1lZFBhcmFtZXRlcnMsCiAgICAgIHRoaXMubmFtZWRQYXJhbWV0ZXJUeXBlcywKICAgICAgdGhpcy50eXBlVmFyaWFibGVzKSB7CiAgICBhc3NlcnQocmV0dXJuVHlwZSAhPSBudWxsLCAiSW52YWxpZCByZXR1cm4gdHlwZSBpbiAkdGhpcy4iKTsKICAgIGFzc2VydCghcGFyYW1ldGVyVHlwZXMuY29udGFpbnMobnVsbCksICJJbnZhbGlkIHBhcmFtZXRlciB0eXBlcyBpbiAkdGhpcy4iKTsKICAgIGFzc2VydCghb3B0aW9uYWxQYXJhbWV0ZXJUeXBlcy5jb250YWlucyhudWxsKSwKICAgICAgICAiSW52YWxpZCBvcHRpb25hbCBwYXJhbWV0ZXIgdHlwZXMgaW4gJHRoaXMuIik7CiAgICBhc3NlcnQoCiAgICAgICAgIW5hbWVkUGFyYW1ldGVycy5jb250YWlucyhudWxsKSwgIkludmFsaWQgbmFtZWQgcGFyYW1ldGVycyBpbiAkdGhpcy4iKTsKICAgIGFzc2VydCghbmFtZWRQYXJhbWV0ZXJUeXBlcy5jb250YWlucyhudWxsKSwKICAgICAgICAiSW52YWxpZCBuYW1lZCBwYXJhbWV0ZXIgdHlwZXMgaW4gJHRoaXMuIik7CiAgICBhc3NlcnQoIXR5cGVWYXJpYWJsZXMuY29udGFpbnMobnVsbCksICJJbnZhbGlkIHR5cGUgdmFyaWFibGVzIGluICR0aGlzLiIpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgY29udGFpbnNUeXBlVmFyaWFibGVzIHsKICAgIHJldHVybiB0eXBlVmFyaWFibGVzLmFueSgodHlwZSkgPT4gdHlwZS5ib3VuZC5jb250YWluc1R5cGVWYXJpYWJsZXMpIHx8CiAgICAgICAgcmV0dXJuVHlwZS5jb250YWluc1R5cGVWYXJpYWJsZXMgfHwKICAgICAgICBwYXJhbWV0ZXJUeXBlcy5hbnkoKHR5cGUpID0+IHR5cGUuY29udGFpbnNUeXBlVmFyaWFibGVzKSB8fAogICAgICAgIG9wdGlvbmFsUGFyYW1ldGVyVHlwZXMuYW55KCh0eXBlKSA9PiB0eXBlLmNvbnRhaW5zVHlwZVZhcmlhYmxlcykgfHwKICAgICAgICBuYW1lZFBhcmFtZXRlclR5cGVzLmFueSgodHlwZSkgPT4gdHlwZS5jb250YWluc1R5cGVWYXJpYWJsZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoVHlwZVZhcmlhYmxlKGYoVHlwZVZhcmlhYmxlVHlwZSB2YXJpYWJsZSkpIHsKICAgIHR5cGVWYXJpYWJsZXMuZm9yRWFjaCgodHlwZSkgPT4gdHlwZS5ib3VuZC5mb3JFYWNoVHlwZVZhcmlhYmxlKGYpKTsKICAgIHJldHVyblR5cGUuZm9yRWFjaFR5cGVWYXJpYWJsZShmKTsKICAgIHBhcmFtZXRlclR5cGVzLmZvckVhY2goKHR5cGUpID0+IHR5cGUuZm9yRWFjaFR5cGVWYXJpYWJsZShmKSk7CiAgICBvcHRpb25hbFBhcmFtZXRlclR5cGVzLmZvckVhY2goKHR5cGUpID0+IHR5cGUuZm9yRWFjaFR5cGVWYXJpYWJsZShmKSk7CiAgICBuYW1lZFBhcmFtZXRlclR5cGVzLmZvckVhY2goKHR5cGUpID0+IHR5cGUuZm9yRWFjaFR5cGVWYXJpYWJsZShmKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIF9jb250YWluc0ZyZWVUeXBlVmFyaWFibGVzKExpc3Q8RnVuY3Rpb25UeXBlVmFyaWFibGU+IGJpbmRpbmdzKSB7CiAgICBpbnQgcmVzdG9yZTsKICAgIGlmICh0eXBlVmFyaWFibGVzLmlzTm90RW1wdHkpIHsKICAgICAgaWYgKGJpbmRpbmdzID09IG51bGwpIHsKICAgICAgICBiaW5kaW5ncyA9IDxGdW5jdGlvblR5cGVWYXJpYWJsZT5bXTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXN0b3JlID0gYmluZGluZ3MubGVuZ3RoOwogICAgICB9CiAgICAgIGJpbmRpbmdzLmFkZEFsbCh0eXBlVmFyaWFibGVzKTsKICAgIH0KCiAgICBib29sIGhhc0ZyZWUoRGFydFR5cGUgdHlwZSkgPT4gdHlwZS5fY29udGFpbnNGcmVlVHlwZVZhcmlhYmxlcyhiaW5kaW5ncyk7CgogICAgYm9vbCByZXN1bHQgPSBoYXNGcmVlKHJldHVyblR5cGUpIHx8CiAgICAgICAgdHlwZVZhcmlhYmxlcy5hbnkoKHR5cGUpID0+IGhhc0ZyZWUodHlwZS5ib3VuZCkpIHx8CiAgICAgICAgcGFyYW1ldGVyVHlwZXMuYW55KGhhc0ZyZWUpIHx8CiAgICAgICAgb3B0aW9uYWxQYXJhbWV0ZXJUeXBlcy5hbnkoaGFzRnJlZSkgfHwKICAgICAgICBuYW1lZFBhcmFtZXRlclR5cGVzLmFueShoYXNGcmVlKTsKCiAgICBpZiAocmVzdG9yZSAhPSBudWxsKSBiaW5kaW5ncy5sZW5ndGggPSByZXN0b3JlOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRnVuY3Rpb25UeXBlID0+IHRydWU7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHN1YnN0KExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cywgTGlzdDxEYXJ0VHlwZT4gcGFyYW1ldGVycykgewogICAgaWYgKHBhcmFtZXRlcnMuaXNFbXB0eSkgewogICAgICBhc3NlcnQoYXJndW1lbnRzLmlzRW1wdHkpOwogICAgICAvLyBSZXR1cm4gZmFzdCBvbiBlbXB0eSBzdWJzdGl0dXRpb25zLgogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIERhcnRUeXBlIG5ld1JldHVyblR5cGUgPSByZXR1cm5UeXBlLnN1YnN0KGFyZ3VtZW50cywgcGFyYW1ldGVycyk7CiAgICBib29sIGNoYW5nZWQgPSAhaWRlbnRpY2FsKG5ld1JldHVyblR5cGUsIHJldHVyblR5cGUpOwogICAgTGlzdDxEYXJ0VHlwZT4gbmV3UGFyYW1ldGVyVHlwZXMgPQogICAgICAgIF9zdWJzdFR5cGVzKHBhcmFtZXRlclR5cGVzLCBhcmd1bWVudHMsIHBhcmFtZXRlcnMpOwogICAgTGlzdDxEYXJ0VHlwZT4gbmV3T3B0aW9uYWxQYXJhbWV0ZXJUeXBlcyA9CiAgICAgICAgX3N1YnN0VHlwZXMob3B0aW9uYWxQYXJhbWV0ZXJUeXBlcywgYXJndW1lbnRzLCBwYXJhbWV0ZXJzKTsKICAgIExpc3Q8RGFydFR5cGU+IG5ld05hbWVkUGFyYW1ldGVyVHlwZXMgPQogICAgICAgIF9zdWJzdFR5cGVzKG5hbWVkUGFyYW1ldGVyVHlwZXMsIGFyZ3VtZW50cywgcGFyYW1ldGVycyk7CiAgICBpZiAoIWNoYW5nZWQgJiYKICAgICAgICAoIWlkZW50aWNhbChwYXJhbWV0ZXJUeXBlcywgbmV3UGFyYW1ldGVyVHlwZXMpIHx8CiAgICAgICAgICAgICFpZGVudGljYWwob3B0aW9uYWxQYXJhbWV0ZXJUeXBlcywgbmV3T3B0aW9uYWxQYXJhbWV0ZXJUeXBlcykgfHwKICAgICAgICAgICAgIWlkZW50aWNhbChuYW1lZFBhcmFtZXRlclR5cGVzLCBuZXdOYW1lZFBhcmFtZXRlclR5cGVzKSkpIHsKICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICB9CiAgICBMaXN0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPiBuZXdUeXBlVmFyaWFibGVzOwogICAgaWYgKHR5cGVWYXJpYWJsZXMuaXNOb3RFbXB0eSkgewogICAgICBpZiAocGFyYW1ldGVycyA9PSB0eXBlVmFyaWFibGVzKSB7CiAgICAgICAgbmV3VHlwZVZhcmlhYmxlcyA9IGNvbnN0IDxGdW5jdGlvblR5cGVWYXJpYWJsZT5bXTsKICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbnQgaW5kZXggPSAwOwogICAgICAgIGZvciAoRnVuY3Rpb25UeXBlVmFyaWFibGUgdHlwZVZhcmlhYmxlIGluIHR5cGVWYXJpYWJsZXMpIHsKICAgICAgICAgIERhcnRUeXBlIG5ld0JvdW5kID0gdHlwZVZhcmlhYmxlLmJvdW5kLnN1YnN0KGFyZ3VtZW50cywgcGFyYW1ldGVycyk7CiAgICAgICAgICBpZiAoIWlkZW50aWNhbCh0eXBlVmFyaWFibGUuYm91bmQsIG5ld0JvdW5kKSkgewogICAgICAgICAgICBuZXdUeXBlVmFyaWFibGVzID8/PSB0eXBlVmFyaWFibGVzLnN1Ymxpc3QoMCwgaW5kZXgpOwogICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5ld1R5cGVWYXJpYWJsZXM/LmFkZCh0eXBlVmFyaWFibGUpOwogICAgICAgICAgfQogICAgICAgICAgaW5kZXgrKzsKICAgICAgICB9CiAgICAgICAgbmV3VHlwZVZhcmlhYmxlcyA/Pz0gdHlwZVZhcmlhYmxlczsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbmV3VHlwZVZhcmlhYmxlcyA9IHR5cGVWYXJpYWJsZXM7CiAgICB9CiAgICBpZiAoY2hhbmdlZCkgewogICAgICAvLyBDcmVhdGUgYSBuZXcgdHlwZSBvbmx5IGlmIG5lY2Vzc2FyeS4KICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvblR5cGUoCiAgICAgICAgICBuZXdSZXR1cm5UeXBlLAogICAgICAgICAgbmV3UGFyYW1ldGVyVHlwZXMsCiAgICAgICAgICBuZXdPcHRpb25hbFBhcmFtZXRlclR5cGVzLAogICAgICAgICAgbmFtZWRQYXJhbWV0ZXJzLAogICAgICAgICAgbmV3TmFtZWRQYXJhbWV0ZXJUeXBlcywKICAgICAgICAgIG5ld1R5cGVWYXJpYWJsZXMpOwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQoKICBGdW5jdGlvblR5cGUgaW5zdGFudGlhdGUoTGlzdDxEYXJ0VHlwZT4gYXJndW1lbnRzKSB7CiAgICByZXR1cm4gc3Vic3QoYXJndW1lbnRzLCB0eXBlVmFyaWFibGVzKTsKICB9CgogIEBvdmVycmlkZQogIFIgYWNjZXB0PFIsIEE+KERhcnRUeXBlVmlzaXRvcjxSLCBBPiB2aXNpdG9yLCBBIGFyZ3VtZW50KSA9PgogICAgICB2aXNpdG9yLnZpc2l0RnVuY3Rpb25UeXBlKHRoaXMsIGFyZ3VtZW50KTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICBpbnQgaGFzaCA9IDMgKiByZXR1cm5UeXBlLmhhc2hDb2RlOwogICAgZm9yIChEYXJ0VHlwZSBwYXJhbWV0ZXIgaW4gcGFyYW1ldGVyVHlwZXMpIHsKICAgICAgaGFzaCA9IDE3ICogaGFzaCArIDUgKiBwYXJhbWV0ZXIuaGFzaENvZGU7CiAgICB9CiAgICBmb3IgKERhcnRUeXBlIHBhcmFtZXRlciBpbiBvcHRpb25hbFBhcmFtZXRlclR5cGVzKSB7CiAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyA3ICogcGFyYW1ldGVyLmhhc2hDb2RlOwogICAgfQogICAgZm9yIChTdHJpbmcgbmFtZSBpbiBuYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgaGFzaCA9IDIzICogaGFzaCArIDExICogbmFtZS5oYXNoQ29kZTsKICAgIH0KICAgIGZvciAoRGFydFR5cGUgcGFyYW1ldGVyIGluIG5hbWVkUGFyYW1ldGVyVHlwZXMpIHsKICAgICAgaGFzaCA9IDI5ICogaGFzaCArIDEzICogcGFyYW1ldGVyLmhhc2hDb2RlOwogICAgfQogICAgcmV0dXJuIGhhc2g7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIEZ1bmN0aW9uVHlwZSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIF9lcXVhbHNJbnRlcm5hbChvdGhlciwgbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIF9lcXVhbHMoRGFydFR5cGUgb3RoZXIsIF9Bc3N1bXB0aW9ucyBhc3N1bXB0aW9ucykgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzISBGdW5jdGlvblR5cGUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBfZXF1YWxzSW50ZXJuYWwob3RoZXIsIGFzc3VtcHRpb25zKTsKICB9CgogIGJvb2wgX2VxdWFsc0ludGVybmFsKEZ1bmN0aW9uVHlwZSBvdGhlciwgX0Fzc3VtcHRpb25zIGFzc3VtcHRpb25zKSB7CiAgICBpZiAodHlwZVZhcmlhYmxlcy5sZW5ndGggIT0gb3RoZXIudHlwZVZhcmlhYmxlcy5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgIGlmICh0eXBlVmFyaWFibGVzLmlzTm90RW1wdHkpIHsKICAgICAgYXNzdW1wdGlvbnMgPz89IG5ldyBfQXNzdW1wdGlvbnMoKTsKICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHR5cGVWYXJpYWJsZXMubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgYXNzdW1wdGlvbnMuYXNzdW1lKHR5cGVWYXJpYWJsZXNbaW5kZXhdLCBvdGhlci50eXBlVmFyaWFibGVzW2luZGV4XSk7CiAgICAgIH0KICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHR5cGVWYXJpYWJsZXMubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgaWYgKCF0eXBlVmFyaWFibGVzW2luZGV4XQogICAgICAgICAgICAuYm91bmQKICAgICAgICAgICAgLl9lcXVhbHMob3RoZXIudHlwZVZhcmlhYmxlc1tpbmRleF0uYm91bmQsIGFzc3VtcHRpb25zKSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYm9vbCByZXN1bHQgPSByZXR1cm5UeXBlLl9lcXVhbHMob3RoZXIucmV0dXJuVHlwZSwgYXNzdW1wdGlvbnMpICYmCiAgICAgICAgX2VxdWFsVHlwZXMocGFyYW1ldGVyVHlwZXMsIG90aGVyLnBhcmFtZXRlclR5cGVzLCBhc3N1bXB0aW9ucykgJiYKICAgICAgICBfZXF1YWxUeXBlcyhvcHRpb25hbFBhcmFtZXRlclR5cGVzLCBvdGhlci5vcHRpb25hbFBhcmFtZXRlclR5cGVzLAogICAgICAgICAgICBhc3N1bXB0aW9ucykgJiYKICAgICAgICBlcXVhbEVsZW1lbnRzKG5hbWVkUGFyYW1ldGVycywgb3RoZXIubmFtZWRQYXJhbWV0ZXJzKSAmJgogICAgICAgIF9lcXVhbFR5cGVzKAogICAgICAgICAgICBuYW1lZFBhcmFtZXRlclR5cGVzLCBvdGhlci5uYW1lZFBhcmFtZXRlclR5cGVzLCBhc3N1bXB0aW9ucyk7CiAgICBpZiAodHlwZVZhcmlhYmxlcy5pc05vdEVtcHR5KSB7CiAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCB0eXBlVmFyaWFibGVzLmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgIGFzc3VtcHRpb25zLmZvcmdldCh0eXBlVmFyaWFibGVzW2luZGV4XSwgb3RoZXIudHlwZVZhcmlhYmxlc1tpbmRleF0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUocmV0dXJuVHlwZSk7CiAgICBzYi53cml0ZSgnIEZ1bmN0aW9uJyk7CiAgICBpZiAodHlwZVZhcmlhYmxlcy5pc05vdEVtcHR5KSB7CiAgICAgIHNiLndyaXRlKCc8Jyk7CiAgICAgIGJvb2wgbmVlZHNDb21tYSA9IGZhbHNlOwogICAgICBmb3IgKEZ1bmN0aW9uVHlwZVZhcmlhYmxlIHR5cGVWYXJpYWJsZSBpbiB0eXBlVmFyaWFibGVzKSB7CiAgICAgICAgaWYgKG5lZWRzQ29tbWEpIHsKICAgICAgICAgIHNiLndyaXRlKCcsJyk7CiAgICAgICAgfQogICAgICAgIHNiLndyaXRlKHR5cGVWYXJpYWJsZSk7CiAgICAgICAgRGFydFR5cGUgYm91bmQgPSB0eXBlVmFyaWFibGUuYm91bmQ7CiAgICAgICAgaWYgKCFib3VuZC5pc09iamVjdCkgewogICAgICAgICAgc2Iud3JpdGUoJyBleHRlbmRzICcpOwogICAgICAgICAgc2Iud3JpdGUodHlwZVZhcmlhYmxlLmJvdW5kKTsKICAgICAgICB9CiAgICAgICAgbmVlZHNDb21tYSA9IHRydWU7CiAgICAgIH0KICAgICAgc2Iud3JpdGUoJz4nKTsKICAgIH0KICAgIHNiLndyaXRlKCcoJyk7CiAgICBib29sIG5lZWRzQ29tbWEgPSBmYWxzZTsKICAgIGZvciAoRGFydFR5cGUgcGFyYW1ldGVyVHlwZSBpbiBwYXJhbWV0ZXJUeXBlcykgewogICAgICBpZiAobmVlZHNDb21tYSkgewogICAgICAgIHNiLndyaXRlKCcsJyk7CiAgICAgIH0KICAgICAgc2Iud3JpdGUocGFyYW1ldGVyVHlwZSk7CiAgICAgIG5lZWRzQ29tbWEgPSB0cnVlOwogICAgfQogICAgaWYgKG9wdGlvbmFsUGFyYW1ldGVyVHlwZXMuaXNOb3RFbXB0eSkgewogICAgICBpZiAobmVlZHNDb21tYSkgewogICAgICAgIHNiLndyaXRlKCcsJyk7CiAgICAgIH0KICAgICAgc2Iud3JpdGUoJ1snKTsKICAgICAgYm9vbCBuZWVkc09wdGlvbmFsQ29tbWEgPSBmYWxzZTsKICAgICAgZm9yIChEYXJ0VHlwZSB0eXBlQXJndW1lbnQgaW4gb3B0aW9uYWxQYXJhbWV0ZXJUeXBlcykgewogICAgICAgIGlmIChuZWVkc09wdGlvbmFsQ29tbWEpIHsKICAgICAgICAgIHNiLndyaXRlKCcsJyk7CiAgICAgICAgfQogICAgICAgIHNiLndyaXRlKHR5cGVBcmd1bWVudCk7CiAgICAgICAgbmVlZHNPcHRpb25hbENvbW1hID0gdHJ1ZTsKICAgICAgfQogICAgICBzYi53cml0ZSgnXScpOwogICAgICBuZWVkc0NvbW1hID0gdHJ1ZTsKICAgIH0KICAgIGlmIChuYW1lZFBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICBpZiAobmVlZHNDb21tYSkgewogICAgICAgIHNiLndyaXRlKCcsJyk7CiAgICAgIH0KICAgICAgc2Iud3JpdGUoJ3snKTsKICAgICAgYm9vbCBuZWVkc05hbWVkQ29tbWEgPSBmYWxzZTsKICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG5hbWVkUGFyYW1ldGVycy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICBpZiAobmVlZHNOYW1lZENvbW1hKSB7CiAgICAgICAgICBzYi53cml0ZSgnLCcpOwogICAgICAgIH0KICAgICAgICBzYi53cml0ZShuYW1lZFBhcmFtZXRlclR5cGVzW2luZGV4XSk7CiAgICAgICAgc2Iud3JpdGUoJyAnKTsKICAgICAgICBzYi53cml0ZShuYW1lZFBhcmFtZXRlcnNbaW5kZXhdKTsKICAgICAgICBuZWVkc05hbWVkQ29tbWEgPSB0cnVlOwogICAgICB9CiAgICAgIHNiLndyaXRlKCd9Jyk7CiAgICB9CiAgICBzYi53cml0ZSgnKScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgpjbGFzcyBGdXR1cmVPclR5cGUgZXh0ZW5kcyBEYXJ0VHlwZSB7CiAgZmluYWwgRGFydFR5cGUgdHlwZUFyZ3VtZW50OwoKICBGdXR1cmVPclR5cGUodGhpcy50eXBlQXJndW1lbnQpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0Z1dHVyZU9yID0+IHRydWU7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHN1YnN0KExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cywgTGlzdDxEYXJ0VHlwZT4gcGFyYW1ldGVycykgewogICAgRGFydFR5cGUgbmV3VHlwZUFyZ3VtZW50ID0gdHlwZUFyZ3VtZW50LnN1YnN0KGFyZ3VtZW50cywgcGFyYW1ldGVycyk7CiAgICBpZiAoaWRlbnRpY2FsKHR5cGVBcmd1bWVudCwgbmV3VHlwZUFyZ3VtZW50KSkgcmV0dXJuIHRoaXM7CiAgICByZXR1cm4gbmV3IEZ1dHVyZU9yVHlwZShuZXdUeXBlQXJndW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgY29udGFpbnNUeXBlVmFyaWFibGVzID0+IHR5cGVBcmd1bWVudC5jb250YWluc1R5cGVWYXJpYWJsZXM7CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaFR5cGVWYXJpYWJsZShmKFR5cGVWYXJpYWJsZVR5cGUgdmFyaWFibGUpKSB7CiAgICB0eXBlQXJndW1lbnQuZm9yRWFjaFR5cGVWYXJpYWJsZShmKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgX2NvbnRhaW5zRnJlZVR5cGVWYXJpYWJsZXMoTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4gYmluZGluZ3MpID0+CiAgICAgIHR5cGVBcmd1bWVudC5fY29udGFpbnNGcmVlVHlwZVZhcmlhYmxlcyhiaW5kaW5ncyk7CgogIEBvdmVycmlkZQogIFIgYWNjZXB0PFIsIEE+KERhcnRUeXBlVmlzaXRvcjxSLCBBPiB2aXNpdG9yLCBBIGFyZ3VtZW50KSA9PgogICAgICB2aXNpdG9yLnZpc2l0RnV0dXJlT3JUeXBlKHRoaXMsIGFyZ3VtZW50KTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiB0eXBlQXJndW1lbnQuaGFzaENvZGUgKiAxMzsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzISBGdXR1cmVPclR5cGUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBfZXF1YWxzSW50ZXJuYWwob3RoZXIsIG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBfZXF1YWxzKERhcnRUeXBlIG90aGVyLCBfQXNzdW1wdGlvbnMgYXNzdW1wdGlvbnMpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgRnV0dXJlT3JUeXBlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gX2VxdWFsc0ludGVybmFsKG90aGVyLCBhc3N1bXB0aW9ucyk7CiAgfQoKICBib29sIF9lcXVhbHNJbnRlcm5hbChGdXR1cmVPclR5cGUgb3RoZXIsIF9Bc3N1bXB0aW9ucyBhc3N1bXB0aW9ucykgewogICAgcmV0dXJuIHR5cGVBcmd1bWVudC5fZXF1YWxzKG90aGVyLnR5cGVBcmd1bWVudCwgYXNzdW1wdGlvbnMpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJ0Z1dHVyZU9yJyk7CiAgICBzYi53cml0ZSgnPCcpOwogICAgc2Iud3JpdGUodHlwZUFyZ3VtZW50KTsKICAgIHNiLndyaXRlKCc+Jyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCi8vLyBIZWxwZXIgbWV0aG9kIGZvciBwZXJmb3JtaW5nIHN1YnN0aXR1dGlvbiBvZiBhIGxpc3Qgb2YgdHlwZXMuCi8vLwovLy8gSWYgbm8gdHlwZXMgYXJlIGNoYW5nZWQgYnkgdGhlIHN1YnN0aXR1dGlvbiwgdGhlIFt0eXBlc10gaXMgcmV0dXJuZWQKLy8vIGluc3RlYWQgb2YgYSBuZXdseSBjcmVhdGVkIGxpc3QuCkxpc3Q8RGFydFR5cGU+IF9zdWJzdFR5cGVzKAogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZXMsIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cywgTGlzdDxEYXJ0VHlwZT4gcGFyYW1ldGVycykgewogIGJvb2wgY2hhbmdlZCA9IGZhbHNlOwogIExpc3Q8RGFydFR5cGU+IHJlc3VsdCA9CiAgICAgIG5ldyBMaXN0PERhcnRUeXBlPi5nZW5lcmF0ZSh0eXBlcy5sZW5ndGgsIChpbnQgaW5kZXgpIHsKICAgIERhcnRUeXBlIHR5cGUgPSB0eXBlc1tpbmRleF07CiAgICBEYXJ0VHlwZSBhcmd1bWVudCA9IHR5cGUuc3Vic3QoYXJndW1lbnRzLCBwYXJhbWV0ZXJzKTsKICAgIGlmICghY2hhbmdlZCAmJiAhaWRlbnRpY2FsKGFyZ3VtZW50LCB0eXBlKSkgewogICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBhcmd1bWVudDsKICB9KTsKICAvLyBVc2UgdGhlIG5ldyBMaXN0IG9ubHkgaWYgbmVjZXNzYXJ5LgogIHJldHVybiBjaGFuZ2VkID8gcmVzdWx0IDogdHlwZXM7Cn0KCmJvb2wgX2VxdWFsVHlwZXMoTGlzdDxEYXJ0VHlwZT4gYSwgTGlzdDxEYXJ0VHlwZT4gYiwgX0Fzc3VtcHRpb25zIGFzc3VtcHRpb25zKSB7CiAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGEubGVuZ3RoOyBpbmRleCsrKSB7CiAgICBpZiAoIWFbaW5kZXhdLl9lcXVhbHMoYltpbmRleF0sIGFzc3VtcHRpb25zKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIHJldHVybiB0cnVlOwp9CgphYnN0cmFjdCBjbGFzcyBEYXJ0VHlwZVZpc2l0b3I8UiwgQT4gewogIGNvbnN0IERhcnRUeXBlVmlzaXRvcigpOwoKICBSIHZpc2l0KGNvdmFyaWFudCBEYXJ0VHlwZSB0eXBlLCBBIGFyZ3VtZW50KSA9PiB0eXBlLmFjY2VwdCh0aGlzLCBhcmd1bWVudCk7CgogIFIgdmlzaXRWb2lkVHlwZShjb3ZhcmlhbnQgVm9pZFR5cGUgdHlwZSwgQSBhcmd1bWVudCkgPT4gbnVsbDsKCiAgUiB2aXNpdFR5cGVWYXJpYWJsZVR5cGUoY292YXJpYW50IFR5cGVWYXJpYWJsZVR5cGUgdHlwZSwgQSBhcmd1bWVudCkgPT4gbnVsbDsKCiAgUiB2aXNpdEZ1bmN0aW9uVHlwZVZhcmlhYmxlKAogICAgICAgICAgY292YXJpYW50IEZ1bmN0aW9uVHlwZVZhcmlhYmxlIHR5cGUsIEEgYXJndW1lbnQpID0+CiAgICAgIG51bGw7CgogIFIgdmlzaXRGdW5jdGlvblR5cGUoY292YXJpYW50IEZ1bmN0aW9uVHlwZSB0eXBlLCBBIGFyZ3VtZW50KSA9PiBudWxsOwoKICBSIHZpc2l0SW50ZXJmYWNlVHlwZShjb3ZhcmlhbnQgSW50ZXJmYWNlVHlwZSB0eXBlLCBBIGFyZ3VtZW50KSA9PiBudWxsOwoKICBSIHZpc2l0VHlwZWRlZlR5cGUoY292YXJpYW50IFR5cGVkZWZUeXBlIHR5cGUsIEEgYXJndW1lbnQpID0+IG51bGw7CgogIFIgdmlzaXREeW5hbWljVHlwZShjb3ZhcmlhbnQgRHluYW1pY1R5cGUgdHlwZSwgQSBhcmd1bWVudCkgPT4gbnVsbDsKCiAgUiB2aXNpdEZ1dHVyZU9yVHlwZShjb3ZhcmlhbnQgRnV0dXJlT3JUeXBlIHR5cGUsIEEgYXJndW1lbnQpID0+IG51bGw7Cn0KCmFic3RyYWN0IGNsYXNzIEJhc2VEYXJ0VHlwZVZpc2l0b3I8UiwgQT4gZXh0ZW5kcyBEYXJ0VHlwZVZpc2l0b3I8UiwgQT4gewogIGNvbnN0IEJhc2VEYXJ0VHlwZVZpc2l0b3IoKTsKCiAgUiB2aXNpdFR5cGUoY292YXJpYW50IERhcnRUeXBlIHR5cGUsIEEgYXJndW1lbnQpOwoKICBAb3ZlcnJpZGUKICBSIHZpc2l0Vm9pZFR5cGUoY292YXJpYW50IFZvaWRUeXBlIHR5cGUsIEEgYXJndW1lbnQpID0+CiAgICAgIHZpc2l0VHlwZSh0eXBlLCBhcmd1bWVudCk7CgogIEBvdmVycmlkZQogIFIgdmlzaXRUeXBlVmFyaWFibGVUeXBlKGNvdmFyaWFudCBUeXBlVmFyaWFibGVUeXBlIHR5cGUsIEEgYXJndW1lbnQpID0+CiAgICAgIHZpc2l0VHlwZSh0eXBlLCBhcmd1bWVudCk7CgogIEBvdmVycmlkZQogIFIgdmlzaXRGdW5jdGlvblR5cGVWYXJpYWJsZSgKICAgICAgICAgIGNvdmFyaWFudCBGdW5jdGlvblR5cGVWYXJpYWJsZSB0eXBlLCBBIGFyZ3VtZW50KSA9PgogICAgICB2aXNpdFR5cGUodHlwZSwgYXJndW1lbnQpOwoKICBAb3ZlcnJpZGUKICBSIHZpc2l0RnVuY3Rpb25UeXBlKGNvdmFyaWFudCBGdW5jdGlvblR5cGUgdHlwZSwgQSBhcmd1bWVudCkgPT4KICAgICAgdmlzaXRUeXBlKHR5cGUsIGFyZ3VtZW50KTsKCiAgQG92ZXJyaWRlCiAgUiB2aXNpdEludGVyZmFjZVR5cGUoY292YXJpYW50IEludGVyZmFjZVR5cGUgdHlwZSwgQSBhcmd1bWVudCkgPT4KICAgICAgdmlzaXRUeXBlKHR5cGUsIGFyZ3VtZW50KTsKCiAgQG92ZXJyaWRlCiAgUiB2aXNpdER5bmFtaWNUeXBlKGNvdmFyaWFudCBEeW5hbWljVHlwZSB0eXBlLCBBIGFyZ3VtZW50KSA9PgogICAgICB2aXNpdFR5cGUodHlwZSwgYXJndW1lbnQpOwoKICBAb3ZlcnJpZGUKICBSIHZpc2l0RnV0dXJlT3JUeXBlKGNvdmFyaWFudCBGdXR1cmVPclR5cGUgdHlwZSwgQSBhcmd1bWVudCkgPT4KICAgICAgdmlzaXRUeXBlKHR5cGUsIGFyZ3VtZW50KTsKfQoKLy8vIEFic3RyYWN0IHZpc2l0b3IgZm9yIGRldGVybWluaW5nIHJlbGF0aW9ucyBiZXR3ZWVuIHR5cGVzLgphYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFR5cGVSZWxhdGlvbjxUIGV4dGVuZHMgRGFydFR5cGU+CiAgICBleHRlbmRzIEJhc2VEYXJ0VHlwZVZpc2l0b3I8Ym9vbCwgVD4gewogIENvbW1vbkVsZW1lbnRzIGdldCBjb21tb25FbGVtZW50czsKCiAgZmluYWwgX0Fzc3VtcHRpb25zIGFzc3VtcHRpb25zID0gbmV3IF9Bc3N1bXB0aW9ucygpOwoKICAvLy8gRW5zdXJlcyB0aGF0IHRoZSBzdXBlciBoaWVyYXJjaHkgb2YgW3R5cGVdIGlzIGNvbXB1dGVkLgogIHZvaWQgZW5zdXJlUmVzb2x2ZWQoSW50ZXJmYWNlVHlwZSB0eXBlKSB7fQoKICAvLy8gUmV0dXJucyB0aGUgdW5hbGlhc2VkIHZlcnNpb24gb2YgW3R5cGVdLgogIFQgZ2V0VW5hbGlhc2VkKFQgdHlwZSkgPT4gdHlwZS51bmFsaWFzZWQ7CgogIC8vLyBSZXR1cm5zIFt0eXBlXSBhcyBhbiBpbnN0YW5jZSBvZiBbY2xzXSwgb3IgYG51bGxgIGlmIFt0eXBlXSBpcyBub3Qgc3VidHlwZQogIC8vLyBpZiBbY2xzXS4KICBJbnRlcmZhY2VUeXBlIGFzSW5zdGFuY2VPZihJbnRlcmZhY2VUeXBlIHR5cGUsIENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBgY2FsbGAgbWV0aG9kIG9uIFt0eXBlXSwgb3IgYG51bGxgIGlmIHRoZSBjbGFzcwogIC8vLyBvZiBbdHlwZV0gZG9lcyBub3QgaGF2ZSBhIGBjYWxsYCBtZXRob2QuCiAgRnVuY3Rpb25UeXBlIGdldENhbGxUeXBlKEludGVyZmFjZVR5cGUgdHlwZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBkZWNsYXJlZCBib3VuZCBvZiBbZWxlbWVudF0uCiAgRGFydFR5cGUgZ2V0VHlwZVZhcmlhYmxlQm91bmQoVHlwZVZhcmlhYmxlRW50aXR5IGVsZW1lbnQpOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VHlwZShUIHQsIFQgcykgewogICAgdGhyb3cgJ2ludGVybmFsIGVycm9yOiB1bmtub3duIHR5cGUgJHt0fSc7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0Vm9pZFR5cGUoVm9pZFR5cGUgdCwgVCBzKSB7CiAgICBhc3NlcnQocyBpcyEgVm9pZFR5cGUpOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgYm9vbCBpbnZhbGlkVHlwZUFyZ3VtZW50cyhUIHQsIFQgcyk7CgogIGJvb2wgaW52YWxpZEZ1bmN0aW9uUmV0dXJuVHlwZXMoVCB0LCBUIHMpOwoKICBib29sIGludmFsaWRGdW5jdGlvblBhcmFtZXRlclR5cGVzKFQgdCwgVCBzKTsKCiAgYm9vbCBpbnZhbGlkVHlwZVZhcmlhYmxlQm91bmRzKFQgYm91bmQsIFQgcyk7CgogIGJvb2wgaW52YWxpZENhbGxhYmxlVHlwZShjb3ZhcmlhbnQgRGFydFR5cGUgY2FsbFR5cGUsIGNvdmFyaWFudCBEYXJ0VHlwZSBzKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSB0LCBjb3ZhcmlhbnQgRGFydFR5cGUgcykgewogICAgZW5zdXJlUmVzb2x2ZWQodCk7CgogICAgYm9vbCBjaGVja1R5cGVBcmd1bWVudHMoSW50ZXJmYWNlVHlwZSBpbnN0YW5jZSwgSW50ZXJmYWNlVHlwZSBvdGhlcikgewogICAgICBMaXN0PFQ+IHRUeXBlQXJncyA9IGluc3RhbmNlLnR5cGVBcmd1bWVudHM7CiAgICAgIExpc3Q8VD4gc1R5cGVBcmdzID0gb3RoZXIudHlwZUFyZ3VtZW50czsKICAgICAgYXNzZXJ0KHRUeXBlQXJncy5sZW5ndGggPT0gc1R5cGVBcmdzLmxlbmd0aCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdFR5cGVBcmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGludmFsaWRUeXBlQXJndW1lbnRzKHRUeXBlQXJnc1tpXSwgc1R5cGVBcmdzW2ldKSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBpZiAocyBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIEludGVyZmFjZVR5cGUgaW5zdGFuY2UgPSBhc0luc3RhbmNlT2YodCwgcy5lbGVtZW50KTsKICAgICAgaWYgKGluc3RhbmNlICE9IG51bGwgJiYgY2hlY2tUeXBlQXJndW1lbnRzKGluc3RhbmNlLCBzKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CgogICAgRnVuY3Rpb25UeXBlIGNhbGxUeXBlID0gZ2V0Q2FsbFR5cGUodCk7CiAgICBpZiAocyA9PSBjb21tb25FbGVtZW50cy5mdW5jdGlvblR5cGUgJiYgY2FsbFR5cGUgIT0gbnVsbCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSBpZiAocyBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgcmV0dXJuIGNhbGxUeXBlICE9IG51bGwgJiYgIWludmFsaWRDYWxsYWJsZVR5cGUoY2FsbFR5cGUsIHMpOwogICAgfQoKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIHQsIERhcnRUeXBlIHMpIHsKICAgIGlmIChzID09IGNvbW1vbkVsZW1lbnRzLmZ1bmN0aW9uVHlwZSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChzIGlzISBGdW5jdGlvblR5cGUpIHJldHVybiBmYWxzZTsKICAgIEZ1bmN0aW9uVHlwZSB0ZiA9IHQ7CiAgICBGdW5jdGlvblR5cGUgc2YgPSBzOwogICAgaW50IHR5cGVWYXJpYWJsZXNDb3VudCA9IGdldENvbW1vblR5cGVWYXJpYWJsZXNDb3VudCh0Ziwgc2YpOwogICAgaWYgKHR5cGVWYXJpYWJsZXNDb3VudCA9PSBudWxsKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVZhcmlhYmxlc0NvdW50OyBpKyspIHsKICAgICAgYXNzdW1wdGlvbnMuYXNzdW1lKHRmLnR5cGVWYXJpYWJsZXNbaV0sIHNmLnR5cGVWYXJpYWJsZXNbaV0pOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlVmFyaWFibGVzQ291bnQ7IGkrKykgewogICAgICBpZiAoIXRmLnR5cGVWYXJpYWJsZXNbaV0uYm91bmQKICAgICAgICAgIC5fZXF1YWxzKHNmLnR5cGVWYXJpYWJsZXNbaV0uYm91bmQsIGFzc3VtcHRpb25zKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKGludmFsaWRGdW5jdGlvblJldHVyblR5cGVzKHRmLnJldHVyblR5cGUsIHNmLnJldHVyblR5cGUpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBib29sIHJlc3VsdCA9IHZpc2l0RnVuY3Rpb25UeXBlSW50ZXJuYWwodGYsIHNmKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVZhcmlhYmxlc0NvdW50OyBpKyspIHsKICAgICAgYXNzdW1wdGlvbnMuZm9yZ2V0KHRmLnR5cGVWYXJpYWJsZXNbaV0sIHNmLnR5cGVWYXJpYWJsZXNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGludCBnZXRDb21tb25UeXBlVmFyaWFibGVzQ291bnQoRnVuY3Rpb25UeXBlIHQsIEZ1bmN0aW9uVHlwZSBzKSB7CiAgICBpZiAodC50eXBlVmFyaWFibGVzLmxlbmd0aCA9PSBzLnR5cGVWYXJpYWJsZXMubGVuZ3RoKSB7CiAgICAgIHJldHVybiB0LnR5cGVWYXJpYWJsZXMubGVuZ3RoOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBib29sIHZpc2l0RnVuY3Rpb25UeXBlSW50ZXJuYWwoRnVuY3Rpb25UeXBlIHRmLCBGdW5jdGlvblR5cGUgc2YpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJld3JpdGUgdGhlIGZ1bmN0aW9uIHN1YnR5cGluZyB0byBiZSBtb3JlIHJlYWRhYmxlCiAgICAvLyBidXQgc3RpbGwgYXMgZWZmaWNpZW50LgoKICAgIC8vIEZvciB0aGUgY29tbWVudHMgd2UgdXNlIHRoZSBmb2xsb3dpbmcgYWJicmV2aWF0aW9uczoKICAgIC8vICB4LnAgICAgIDogcGFyYW1ldGVyVHlwZXMgb24gWzp4Ol0sCiAgICAvLyAgeC5vICAgICA6IG9wdGlvbmFsUGFyYW1ldGVyVHlwZXMgb24gWzp4Ol0sIGFuZAogICAgLy8gIGxlbih4cykgOiBsZW5ndGggb2YgbGlzdCBbOnhzOl0uCgogICAgSXRlcmF0b3I8VD4gdHBzID0gdGYucGFyYW1ldGVyVHlwZXMuaXRlcmF0b3I7CiAgICBJdGVyYXRvcjxUPiBzcHMgPSBzZi5wYXJhbWV0ZXJUeXBlcy5pdGVyYXRvcjsKICAgIGJvb2wgc05vdEVtcHR5ID0gc3BzLm1vdmVOZXh0KCk7CiAgICBib29sIHROb3RFbXB0eSA9IHRwcy5tb3ZlTmV4dCgpOwogICAgdE5leHQoKSA9PiAodE5vdEVtcHR5ID0gdHBzLm1vdmVOZXh0KCkpOwogICAgc05leHQoKSA9PiAoc05vdEVtcHR5ID0gc3BzLm1vdmVOZXh0KCkpOwoKICAgIGJvb2wgaW5jb21wYXRpYmxlUGFyYW1ldGVycygpIHsKICAgICAgd2hpbGUgKHROb3RFbXB0eSAmJiBzTm90RW1wdHkpIHsKICAgICAgICBpZiAoaW52YWxpZEZ1bmN0aW9uUGFyYW1ldGVyVHlwZXModHBzLmN1cnJlbnQsIHNwcy5jdXJyZW50KSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHROZXh0KCk7CiAgICAgICAgc05leHQoKTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaWYgKGluY29tcGF0aWJsZVBhcmFtZXRlcnMoKSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKHROb3RFbXB0eSkgewogICAgICAvLyBXZSBtdXN0IGhhdmUgWzogbGVuKHQucCkgPD0gbGVuKHMucCkgOl0uCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICghc2YubmFtZWRQYXJhbWV0ZXJzLmlzRW1wdHkpIHsKICAgICAgLy8gV2UgbXVzdCBoYXZlIFs6IGxlbih0LnApID09IGxlbihzLnApIDpdLgogICAgICBpZiAoc05vdEVtcHR5KSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIC8vIFNpbmNlIG5hbWVkIHBhcmFtZXRlcnMgYXJlIGdsb2JhbGx5IG9yZGVyZWQgd2UgY2FuIGRldGVybWluZSB0aGUKICAgICAgLy8gc3Vic2V0IHJlbGF0aW9uIHdpdGggYSBsaW5lYXIgc2VhcmNoIGZvciBbOnNmLm5hbWVkUGFyYW1ldGVyczpdCiAgICAgIC8vIHdpdGhpbiBbOnRmLm5hbWVkUGFyYW1ldGVyczpdLgogICAgICBMaXN0PFN0cmluZz4gdE5hbWVzID0gdGYubmFtZWRQYXJhbWV0ZXJzOwogICAgICBMaXN0PFQ+IHRUeXBlcyA9IHRmLm5hbWVkUGFyYW1ldGVyVHlwZXM7CiAgICAgIExpc3Q8U3RyaW5nPiBzTmFtZXMgPSBzZi5uYW1lZFBhcmFtZXRlcnM7CiAgICAgIExpc3Q8VD4gc1R5cGVzID0gc2YubmFtZWRQYXJhbWV0ZXJUeXBlczsKICAgICAgaW50IHRJbmRleCA9IDA7CiAgICAgIGludCBzSW5kZXggPSAwOwogICAgICB3aGlsZSAodEluZGV4IDwgdE5hbWVzLmxlbmd0aCAmJiBzSW5kZXggPCBzTmFtZXMubGVuZ3RoKSB7CiAgICAgICAgaWYgKHROYW1lc1t0SW5kZXhdID09IHNOYW1lc1tzSW5kZXhdKSB7CiAgICAgICAgICBpZiAoaW52YWxpZEZ1bmN0aW9uUGFyYW1ldGVyVHlwZXModFR5cGVzW3RJbmRleF0sIHNUeXBlc1tzSW5kZXhdKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICBzSW5kZXgrKzsKICAgICAgICB9CiAgICAgICAgdEluZGV4Kys7CiAgICAgIH0KICAgICAgaWYgKHNJbmRleCA8IHNOYW1lcy5sZW5ndGgpIHsKICAgICAgICAvLyBXZSBkaWRuJ3QgZmluZCBhbGwgbmFtZXMuCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBDaGVjayB0aGUgcmVtYWluaW5nIFs6IHMucCA6XSBhZ2FpbnN0IFs6IHQubyA6XS4KICAgICAgdHBzID0gdGYub3B0aW9uYWxQYXJhbWV0ZXJUeXBlcy5pdGVyYXRvcjsKICAgICAgdE5leHQoKTsKICAgICAgaWYgKGluY29tcGF0aWJsZVBhcmFtZXRlcnMoKSkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoc05vdEVtcHR5KSB7CiAgICAgICAgLy8gV2UgbXVzdCBoYXZlIFs6IGxlbih0LnApICsgbGVuKHQubykgPj0gbGVuKHMucCkgOl0uCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGlmICghc2Yub3B0aW9uYWxQYXJhbWV0ZXJUeXBlcy5pc0VtcHR5KSB7CiAgICAgICAgLy8gQ2hlY2sgdGhlIHJlbWFpbmluZyBbOiBzLm8gOl0gYWdhaW5zdCB0aGUgcmVtYWluaW5nIFs6IHQubyA6XS4KICAgICAgICBzcHMgPSBzZi5vcHRpb25hbFBhcmFtZXRlclR5cGVzLml0ZXJhdG9yOwogICAgICAgIHNOZXh0KCk7CiAgICAgICAgaWYgKGluY29tcGF0aWJsZVBhcmFtZXRlcnMoKSkgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmIChzTm90RW1wdHkpIHsKICAgICAgICAgIC8vIFdlIGRpZG4ndCBmaW5kIGVub3VnaCBwYXJhbWV0ZXJzOgogICAgICAgICAgLy8gV2UgbXVzdCBoYXZlIFs6IGxlbih0LnApICsgbGVuKHQubykgPD0gbGVuKHMucCkgKyBsZW4ocy5vKSA6XS4KICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHNOb3RFbXB0eSkgewogICAgICAgICAgLy8gV2UgbXVzdCBoYXZlIFs6IGxlbih0LnApICsgbGVuKHQubykgPj0gbGVuKHMucCkgOl0uCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRUeXBlVmFyaWFibGVUeXBlKFR5cGVWYXJpYWJsZVR5cGUgdCwgVCBzKSB7CiAgICAvLyBJZGVudGl0eSBjaGVjayBpcyBoYW5kbGVkIGluIFtpc1N1YnR5cGVdLgogICAgRGFydFR5cGUgYm91bmQgPSBnZXRUeXBlVmFyaWFibGVCb3VuZCh0LmVsZW1lbnQpOwogICAgaWYgKGJvdW5kLmlzVHlwZVZhcmlhYmxlKSB7CiAgICAgIC8vIFRoZSBib3VuZCBpcyBwb3RlbnRpYWxseSBjeWNsaWMgc28gd2UgbmVlZCB0byBiZSBleHRyYSBjYXJlZnVsLgogICAgICBTZXQ8VHlwZVZhcmlhYmxlRW50aXR5PiBzZWVuVHlwZVZhcmlhYmxlcyA9IG5ldyBTZXQ8VHlwZVZhcmlhYmxlRW50aXR5PigpOwogICAgICBzZWVuVHlwZVZhcmlhYmxlcy5hZGQodC5lbGVtZW50KTsKICAgICAgd2hpbGUgKGJvdW5kLmlzVHlwZVZhcmlhYmxlKSB7CiAgICAgICAgVHlwZVZhcmlhYmxlVHlwZSB0eXBlVmFyaWFibGUgPSBib3VuZDsKICAgICAgICBpZiAoYm91bmQgPT0gcykgewogICAgICAgICAgLy8gW3RdIGV4dGVuZHMgW3NdLgogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChzZWVuVHlwZVZhcmlhYmxlcy5jb250YWlucyh0eXBlVmFyaWFibGUuZWxlbWVudCkpIHsKICAgICAgICAgIC8vIFdlIGhhdmUgYSBjeWNsZSBhbmQgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgYWxsIGJvdW5kcyBpbiB0aGUgY3ljbGUKICAgICAgICAgIC8vIGFnYWluc3QgW3NdIGFuZCBjYW4gdGhlcmVmb3JlIGNvbmNsdWRlIHRoYXQgW3RdIGlzIG5vdCBhIHN1YnR5cGUKICAgICAgICAgIC8vIG9mIFtzXS4KICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgc2VlblR5cGVWYXJpYWJsZXMuYWRkKHR5cGVWYXJpYWJsZS5lbGVtZW50KTsKICAgICAgICBib3VuZCA9IGdldFR5cGVWYXJpYWJsZUJvdW5kKHR5cGVWYXJpYWJsZS5lbGVtZW50KTsKICAgICAgfQogICAgfQogICAgaWYgKGludmFsaWRUeXBlVmFyaWFibGVCb3VuZHMoYm91bmQsIHMpKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRGdW5jdGlvblR5cGVWYXJpYWJsZShGdW5jdGlvblR5cGVWYXJpYWJsZSB0LCBEYXJ0VHlwZSBzKSB7CiAgICBpZiAoIXMuaXNGdW5jdGlvblR5cGVWYXJpYWJsZSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIGFzc3VtcHRpb25zLmlzQXNzdW1lZCh0LCBzKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIE1vcmVTcGVjaWZpY1Zpc2l0b3I8VCBleHRlbmRzIERhcnRUeXBlPgogICAgZXh0ZW5kcyBBYnN0cmFjdFR5cGVSZWxhdGlvbjxUPiB7CiAgYm9vbCBpc01vcmVTcGVjaWZpYyhUIHQsIFQgcykgewogICAgaWYgKGlkZW50aWNhbCh0LCBzKSB8fAogICAgICAgIHMudHJlYXRBc0R5bmFtaWMgfHwKICAgICAgICBzLmlzVm9pZCB8fAogICAgICAgIHMgPT0gY29tbW9uRWxlbWVudHMub2JqZWN0VHlwZSB8fAogICAgICAgIHQgPT0gY29tbW9uRWxlbWVudHMubnVsbFR5cGUpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAodC50cmVhdEFzRHluYW1pYykgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgdCA9IGdldFVuYWxpYXNlZCh0KTsKICAgIHMgPSBnZXRVbmFsaWFzZWQocyk7CgogICAgcmV0dXJuIHQuYWNjZXB0KHRoaXMsIHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpbnZhbGlkVHlwZUFyZ3VtZW50cyhUIHQsIFQgcykgewogICAgcmV0dXJuICFpc01vcmVTcGVjaWZpYyh0LCBzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaW52YWxpZEZ1bmN0aW9uUmV0dXJuVHlwZXMoVCB0LCBUIHMpIHsKICAgIGlmIChzLnRyZWF0QXNEeW5hbWljICYmIHQuaXNWb2lkKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiAhcy5pc1ZvaWQgJiYgIWlzTW9yZVNwZWNpZmljKHQsIHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpbnZhbGlkRnVuY3Rpb25QYXJhbWV0ZXJUeXBlcyhUIHQsIFQgcykgewogICAgcmV0dXJuICFpc01vcmVTcGVjaWZpYyh0LCBzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaW52YWxpZFR5cGVWYXJpYWJsZUJvdW5kcyhUIGJvdW5kLCBUIHMpIHsKICAgIHJldHVybiAhaXNNb3JlU3BlY2lmaWMoYm91bmQsIHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpbnZhbGlkQ2FsbGFibGVUeXBlKGNvdmFyaWFudCBEYXJ0VHlwZSBjYWxsVHlwZSwgY292YXJpYW50IERhcnRUeXBlIHMpIHsKICAgIHJldHVybiAhaXNNb3JlU3BlY2lmaWMoY2FsbFR5cGUsIHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEZ1dHVyZU9yVHlwZShGdXR1cmVPclR5cGUgdCwgY292YXJpYW50IERhcnRUeXBlIHMpIHsKICAgIHJldHVybiBmYWxzZTsKICB9Cn0KCi8vLyBUeXBlIHZpc2l0b3IgdGhhdCBkZXRlcm1pbmVzIHRoZSBzdWJ0eXBlIHJlbGF0aW9uIHR3byB0eXBlcy4KYWJzdHJhY3QgY2xhc3MgU3VidHlwZVZpc2l0b3I8VCBleHRlbmRzIERhcnRUeXBlPgogICAgZXh0ZW5kcyBNb3JlU3BlY2lmaWNWaXNpdG9yPFQ+IHsKICBib29sIGlzU3VidHlwZShEYXJ0VHlwZSB0LCBEYXJ0VHlwZSBzKSB7CiAgICBpZiAocy5pc0Z1dHVyZU9yKSB7CiAgICAgIEZ1dHVyZU9yVHlwZSBzRnV0dXJlT3IgPSBzOwogICAgICBpZiAoaXNTdWJ0eXBlKHQsIHNGdXR1cmVPci50eXBlQXJndW1lbnQpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0gZWxzZSBpZiAodC5pc0ludGVyZmFjZVR5cGUpIHsKICAgICAgICBJbnRlcmZhY2VUeXBlIHRJbnRlcmZhY2UgPSB0OwogICAgICAgIGlmICh0SW50ZXJmYWNlLmVsZW1lbnQgPT0gY29tbW9uRWxlbWVudHMuZnV0dXJlQ2xhc3MgJiYKICAgICAgICAgICAgaXNTdWJ0eXBlKAogICAgICAgICAgICAgICAgdEludGVyZmFjZS50eXBlQXJndW1lbnRzLnNpbmdsZSwgc0Z1dHVyZU9yLnR5cGVBcmd1bWVudCkpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGlzTW9yZVNwZWNpZmljKHQsIHMpOwogIH0KCiAgYm9vbCBpc0Fzc2lnbmFibGUoVCB0LCBUIHMpIHsKICAgIHJldHVybiBpc1N1YnR5cGUodCwgcykgfHwgaXNTdWJ0eXBlKHMsIHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpbnZhbGlkVHlwZUFyZ3VtZW50cyhUIHQsIFQgcykgewogICAgcmV0dXJuICFpc1N1YnR5cGUodCwgcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGludmFsaWRGdW5jdGlvblJldHVyblR5cGVzKFQgdCwgVCBzKSB7CiAgICByZXR1cm4gIWlzU3VidHlwZSh0LCBzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaW52YWxpZEZ1bmN0aW9uUGFyYW1ldGVyVHlwZXMoVCB0LCBUIHMpIHsKICAgIHJldHVybiAhaXNTdWJ0eXBlKHMsIHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpbnZhbGlkVHlwZVZhcmlhYmxlQm91bmRzKFQgYm91bmQsIFQgcykgewogICAgcmV0dXJuICFpc1N1YnR5cGUoYm91bmQsIHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpbnZhbGlkQ2FsbGFibGVUeXBlKGNvdmFyaWFudCBEYXJ0VHlwZSBjYWxsVHlwZSwgY292YXJpYW50IERhcnRUeXBlIHMpIHsKICAgIHJldHVybiAhaXNTdWJ0eXBlKGNhbGxUeXBlLCBzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRGdXR1cmVPclR5cGUoRnV0dXJlT3JUeXBlIHQsIGNvdmFyaWFudCBEYXJ0VHlwZSBzKSB7CiAgICBpZiAocy5pc0Z1dHVyZU9yKSB7CiAgICAgIEZ1dHVyZU9yVHlwZSBzRnV0dXJlT3IgPSBzOwogICAgICByZXR1cm4gaXNTdWJ0eXBlKHQudHlwZUFyZ3VtZW50LCBzRnV0dXJlT3IudHlwZUFyZ3VtZW50KTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9Cn0KCi8vLyBUeXBlIHZpc2l0b3IgdGhhdCBkZXRlcm1pbmVzIG9uZSB0eXBlIGNvdWxkIGEgc3VidHlwZSBvZiBhbm90aGVyIGdpdmVuIHRoZQovLy8gcmlnaHQgdHlwZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uIFRoZSBjb21wdXRhdGlvbiBpcyBhcHByb3hpbWF0ZSBhbmQgcmV0dXJucwovLy8gYGZhbHNlYCBvbmx5IGlmIHdlIGFyZSBzdXJlIG5vIHN1Y2ggc3Vic3RpdHV0aW9uIGV4aXN0cy4KYWJzdHJhY3QgY2xhc3MgUG90ZW50aWFsU3VidHlwZVZpc2l0b3I8VCBleHRlbmRzIERhcnRUeXBlPgogICAgZXh0ZW5kcyBTdWJ0eXBlVmlzaXRvcjxUPiB7CiAgYm9vbCBfYXNzdW1lSW5zdGFudGlhdGlvbnMgPSB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGlzU3VidHlwZShEYXJ0VHlwZSB0LCBEYXJ0VHlwZSBzKSB7CiAgICBpZiAodCBpcyBUeXBlVmFyaWFibGVUeXBlIHx8IHMgaXMgVHlwZVZhcmlhYmxlVHlwZSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmICgodCBpcyBGdW5jdGlvblR5cGVWYXJpYWJsZSB8fCBzIGlzIEZ1bmN0aW9uVHlwZVZhcmlhYmxlKSAmJgogICAgICAgIF9hc3N1bWVJbnN0YW50aWF0aW9ucykgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBzdXBlci5pc1N1YnR5cGUodCwgcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0Q29tbW9uVHlwZVZhcmlhYmxlc0NvdW50KEZ1bmN0aW9uVHlwZSB0LCBGdW5jdGlvblR5cGUgcykgewogICAgaWYgKHQudHlwZVZhcmlhYmxlcy5sZW5ndGggPT0gcy50eXBlVmFyaWFibGVzLmxlbmd0aCkgewogICAgICByZXR1cm4gdC50eXBlVmFyaWFibGVzLmxlbmd0aDsKICAgIH0KICAgIGlmIChfYXNzdW1lSW5zdGFudGlhdGlvbnMgJiYgcy50eXBlVmFyaWFibGVzLmxlbmd0aCA9PSAwKSB7CiAgICAgIHJldHVybiAwOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBib29sIGlzUG90ZW50aWFsU3VidHlwZShEYXJ0VHlwZSB0LCBEYXJ0VHlwZSBzLAogICAgICB7Ym9vbCBhc3N1bWVJbnN0YW50aWF0aW9uczogdHJ1ZX0pIHsKICAgIF9hc3N1bWVJbnN0YW50aWF0aW9ucyA9IGFzc3VtZUluc3RhbnRpYXRpb25zOwogICAgcmV0dXJuIGlzU3VidHlwZSh0LCBzKTsKICB9Cn0KCi8vLyBCYXNpYyBpbnRlcmZhY2UgZm9yIHRoZSBEYXJ0IHR5cGUgc3lzdGVtLgphYnN0cmFjdCBjbGFzcyBEYXJ0VHlwZXMgewogIC8vLyBUaGUgdHlwZXMgZGVmaW5lZCBpbiAnZGFydDpjb3JlJy4KICBDb21tb25FbGVtZW50cyBnZXQgY29tbW9uRWxlbWVudHM7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbdF0gaXMgYSBzdWJ0eXBlIG9mIFtzXS4KICBib29sIGlzU3VidHlwZShEYXJ0VHlwZSB0LCBEYXJ0VHlwZSBzKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFt0XSBpcyBhc3NpZ25hYmxlIHRvIFtzXS4KICBib29sIGlzQXNzaWduYWJsZShEYXJ0VHlwZSB0LCBEYXJ0VHlwZSBzKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFt0XSBtaWdodCBiZSBhIHN1YnR5cGUgb2YgW3NdIGZvciBzb21lIHZhbHVlcyBvZgogIC8vLyB0eXBlIHZhcmlhYmxlcyBpbiBbc10gYW5kIFt0XS4KICAvLy8KICAvLy8gSWYgW2Fzc3VtZUluc3RhbnRpYXRpb25zXSwgZ2VuZXJpYyBmdW5jdGlvbiB0eXBlcyBhcmUgYXNzdW1lZCB0byBiZQogIC8vLyBwb3RlbnRpYWxseSBpbnN0YW50aWF0ZWQuCiAgYm9vbCBpc1BvdGVudGlhbFN1YnR5cGUoRGFydFR5cGUgdCwgRGFydFR5cGUgcywKICAgICAge2Jvb2wgYXNzdW1lSW5zdGFudGlhdGlvbnM6IHRydWV9KTsKCiAgc3RhdGljIGNvbnN0IGludCBJU19TVUJUWVBFID0gMTsKICBzdGF0aWMgY29uc3QgaW50IE1BWUJFX1NVQlRZUEUgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgTk9UX1NVQlRZUEUgPSAtMTsKCiAgLy8vIFJldHVybnMgW0lTX1NVQlRZUEVdLCBbTUFZQkVfU1VCVFlQRV0sIG9yIFtOT1RfU1VCVFlQRV0gaWYgW3RdIGlzIGEKICAvLy8gKHBvdGVudGlhbCkgc3VidHlwZSBvZiBbc10KICBpbnQgY29tcHV0ZVN1YnR5cGVSZWxhdGlvbihEYXJ0VHlwZSB0LCBEYXJ0VHlwZSBzKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDb21wdXRlIHRoaXMgZGlyZWN0bHkgaW4gW2lzUG90ZW50aWFsU3VidHlwZV0uCiAgICBpZiAoaXNTdWJ0eXBlKHQsIHMpKSByZXR1cm4gSVNfU1VCVFlQRTsKICAgIHJldHVybiBpc1BvdGVudGlhbFN1YnR5cGUodCwgcykgPyBNQVlCRV9TVUJUWVBFIDogTk9UX1NVQlRZUEU7CiAgfQoKICAvLy8gUmV0dXJucyBbdHlwZV0gYXMgYW4gaW5zdGFuY2Ugb2YgW2Nsc10gb3IgYG51bGxgIGlmIFt0eXBlXSBpcyBub3QgYQogIC8vLyBzdWJ0eXBlIG9mIFtjbHNdLgogIC8vLwogIC8vLyBGb3IgZXhhbXBsZTogYGFzSW5zdGFuY2VPZihMaXN0PFN0cmluZz4sIEl0ZXJhYmxlKSA9IEl0ZXJhYmxlPFN0cmluZz5gLgogIEludGVyZmFjZVR5cGUgYXNJbnN0YW5jZU9mKEludGVyZmFjZVR5cGUgdHlwZSwgQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybiBbYmFzZV0gd2hlcmUgdGhlIHR5cGUgdmFyaWFibGUgb2YgYGNvbnRleHQuZWxlbWVudGAgYXJlIHJlcGxhY2VkCiAgLy8vIGJ5IHRoZSB0eXBlIGFyZ3VtZW50cyBvZiBbY29udGV4dF0uCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZQogIC8vLwogIC8vLyAgICAgc3Vic3RCeUNvbnRleHQoSXRlcmFibGU8TGlzdC5FPiwgTGlzdDxTdHJpbmc+KSA9IEl0ZXJhYmxlPFN0cmluZz4KICAvLy8KICBEYXJ0VHlwZSBzdWJzdEJ5Q29udGV4dChEYXJ0VHlwZSBiYXNlLCBJbnRlcmZhY2VUeXBlIGNvbnRleHQpOwoKICAvLy8gUmV0dXJucyB0aGUgJ3RoaXMgdHlwZScgb2YgW2Nsc10uIFRoYXQgaXMsIHRoZSBpbnN0YW50aWF0aW9uIG9mIFtjbHNdCiAgLy8vIHdoZXJlIHRoZSB0eXBlIGFyZ3VtZW50cyBhcmUgdGhlIHR5cGUgdmFyaWFibGVzIG9mIFtjbHNdLgogIEludGVyZmFjZVR5cGUgZ2V0VGhpc1R5cGUoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgdGhlIHN1cGVydHlwZSBvZiBbY2xzXSwgaS5lLiB0aGUgdHlwZSBpbiB0aGUgYGV4dGVuZHNgIGNsYXVzZSBvZgogIC8vLyBbY2xzXS4KICBJbnRlcmZhY2VUeXBlIGdldFN1cGVydHlwZShDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyBhbGwgc3VwZXJ0eXBlcyBvZiBbY2xzXS4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGlzIHNob3VsZCBpbmNsdWRlIGBGdW5jdGlvbmAgaWYgW2Nsc10gZGVjbGFyZXMKICAvLyBhIGBjYWxsYCBtZXRob2QuCiAgSXRlcmFibGU8SW50ZXJmYWNlVHlwZT4gZ2V0U3VwZXJ0eXBlcyhDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyBhbGwgdHlwZXMgZGlyZWN0bHkgaW1wbGVtZW50ZWQgYnkgW2Nsc10uCiAgSXRlcmFibGU8SW50ZXJmYWNlVHlwZT4gZ2V0SW50ZXJmYWNlcyhDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgYGNhbGxgIG1ldGhvZCBvbiBbdHlwZV0sIG9yIGBudWxsYCBpZiB0aGUgY2xhc3MKICAvLy8gb2YgW3R5cGVdIGRvZXMgbm90IGhhdmUgYSBgY2FsbGAgbWV0aG9kLgogIEZ1bmN0aW9uVHlwZSBnZXRDYWxsVHlwZShJbnRlcmZhY2VUeXBlIHR5cGUpOwoKICAvLy8gQ2hlY2tzIHRoZSB0eXBlIGFyZ3VtZW50cyBvZiBbdHlwZV0gYWdhaW5zdCB0aGUgdHlwZSB2YXJpYWJsZSBib3VuZHMKICAvLy8gZGVjbGFyZWQgb24gYHR5cGUuZWxlbWVudGAuIENhbGxzIFtjaGVja1R5cGVWYXJpYWJsZUJvdW5kXSBvbiBlYWNoIHR5cGUKICAvLy8gYXJndW1lbnQgYW5kIGJvdW5kLgogIHZvaWQgY2hlY2tUeXBlVmFyaWFibGVCb3VuZHM8VD4oCiAgICAgIFQgY29udGV4dCwKICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cywKICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZVZhcmlhYmxlcywKICAgICAgdm9pZCBjaGVja1R5cGVWYXJpYWJsZUJvdW5kKFQgY29udGV4dCwgRGFydFR5cGUgdHlwZUFyZ3VtZW50LAogICAgICAgICAgVHlwZVZhcmlhYmxlVHlwZSB0eXBlVmFyaWFibGUsIERhcnRUeXBlIGJvdW5kKSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbQ2xhc3NFbnRpdHldIHdoaWNoIGRlY2xhcmVzIHRoZSB0eXBlIHZhcmlhYmxlcyBvY2N1cnJpbmcgaW4KICAvLyBbdHlwZV0sIG9yIGBudWxsYCBpZiBbdHlwZV0gZG9lcyBub3QgY29udGFpbiBjbGFzcyB0eXBlIHZhcmlhYmxlcy4KICBzdGF0aWMgQ2xhc3NFbnRpdHkgZ2V0Q2xhc3NDb250ZXh0KERhcnRUeXBlIHR5cGUpIHsKICAgIENsYXNzRW50aXR5IGNvbnRleHRDbGFzczsKICAgIHR5cGUuZm9yRWFjaFR5cGVWYXJpYWJsZSgoVHlwZVZhcmlhYmxlVHlwZSB0eXBlVmFyaWFibGUpIHsKICAgICAgaWYgKHR5cGVWYXJpYWJsZS5lbGVtZW50LnR5cGVEZWNsYXJhdGlvbiBpcyEgQ2xhc3NFbnRpdHkpIHJldHVybjsKICAgICAgY29udGV4dENsYXNzID0gdHlwZVZhcmlhYmxlLmVsZW1lbnQudHlwZURlY2xhcmF0aW9uOwogICAgfSk7CiAgICAvLyBHRU5FUklDX01FVEhPRFM6IFdoZW4gZ2VuZXJpYyBtZXRob2Qgc3VwcG9ydCBpcyBjb21wbGV0ZSBlbm91Z2ggdG8KICAgIC8vIGluY2x1ZGUgYSBydW50aW1lIHZhbHVlIGZvciBtZXRob2QgdHlwZSB2YXJpYWJsZXMgdGhpcyBtdXN0IGJlIHVwZGF0ZWQuCiAgICAvLyBGb3IgZnVsbCBzdXBwb3J0IHRoZSBnbG9iYWwgYXNzdW1wdGlvbiB0aGF0IGFsbCB0eXBlIHZhcmlhYmxlcyBhcmUKICAgIC8vIGRlY2xhcmVkIGJ5IHRoZSBzYW1lIGVuY2xvc2luZyBjbGFzcyB3aWxsIG5vdCBob2xkOiBCb3RoIGFuIGVuY2xvc2luZwog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ZTpjb21waWxlci9zcmMvZWxlbWVudHMvdHlwZXMuZGFydDhzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9rZXJuZWwvZGFydDJqc190YXJnZXQuZGFydJb+Ly8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIFRPRE8oam9obm5pd2ludGhlcik6IEFkZCBhIHRlc3QgdGhhdCBlbnN1cmUgdGhhdCB0aGlzIGxpYnJhcnkgZG9lc24ndCBkZXBlbmQKLy8gb24gdGhlIGRhcnQyanMgaW50ZXJuYWxzLgpsaWJyYXJ5IGNvbXBpbGVyLnNyYy5rZXJuZWwuZGFydDJqc190YXJnZXQ7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90YXJnZXQvdGFyZ2V0cy5kYXJ0JzsKaW1wb3J0ICdpbnZvY2F0aW9uX21pcnJvcl9jb25zdGFudHMuZGFydCc7Cgpjb25zdCBJdGVyYWJsZTxTdHJpbmc+IF9hbGxvd2VkRGFydFNjaGVtZVBhdGhzID0gY29uc3QgPFN0cmluZz5bCiAgJ2FzeW5jJywKICAnaHRtbCcsCiAgJ2h0bWxfY29tbW9uJywKICAnaW5kZXhlZF9kYicsCiAgJ2pzJywKICAnanNfdXRpbCcsCiAgJ3N2ZycsCiAgJ19uYXRpdmVfdHlwZWRfZGF0YScsCiAgJ3dlYl9hdWRpbycsCiAgJ3dlYl9nbCcsCiAgJ3dlYl9zcWwnCl07Cgpib29sIG1heWJlRW5hYmxlTmF0aXZlKFVyaSB1cmkpIHsKICBib29sIGFsbG93ZWRUZXN0TGlicmFyeSgpIHsKICAgIFN0cmluZyBzY3JpcHROYW1lID0gdXJpLnBhdGg7CiAgICByZXR1cm4gc2NyaXB0TmFtZS5jb250YWlucygndGVzdHMvY29tcGlsZXIvZGFydDJqc19uYXRpdmUnKSB8fAogICAgICAgIHNjcmlwdE5hbWUuY29udGFpbnMoJ3Rlc3RzL2NvbXBpbGVyL2RhcnQyanNfZXh0cmEnKSB8fAogICAgICAgIHNjcmlwdE5hbWUuY29udGFpbnMoJ2dlbmVyYXRlZF90ZXN0cy9kYXJ0MmpzX25hdGl2ZS9uYXRpdmVfdGVzdCcpOwogIH0KCiAgYm9vbCBhbGxvd2VkRGFydExpYnJhcnkoKSB7CiAgICBpZiAodXJpLnNjaGVtZSAhPSAnZGFydCcpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBfYWxsb3dlZERhcnRTY2hlbWVQYXRocy5jb250YWlucyh1cmkucGF0aCk7CiAgfQoKICByZXR1cm4gYWxsb3dlZFRlc3RMaWJyYXJ5KCkgfHwgYWxsb3dlZERhcnRMaWJyYXJ5KCk7Cn0KCi8vLyBBIGtlcm5lbCBbVGFyZ2V0XSB0byBjb25maWd1cmUgdGhlIERhcnQgRnJvbnQgRW5kIGZvciBkYXJ0MmpzLgpjbGFzcyBEYXJ0MmpzVGFyZ2V0IGV4dGVuZHMgVGFyZ2V0IHsKICBmaW5hbCBUYXJnZXRGbGFncyBmbGFnczsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgRGFydDJqc1RhcmdldCh0aGlzLm5hbWUsIHRoaXMuZmxhZ3MpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBsZWdhY3lNb2RlID0+IGZsYWdzLmxlZ2FjeU1vZGU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGVuYWJsZU5vU3VjaE1ldGhvZEZvcndhcmRlcnMgPT4gIWZsYWdzLmxlZ2FjeU1vZGU7CgogIEBvdmVycmlkZQogIExpc3Q8U3RyaW5nPiBnZXQgZXh0cmFSZXF1aXJlZExpYnJhcmllcyA9PiBfcmVxdWlyZWRMaWJyYXJpZXNbbmFtZV07CgogIEBvdmVycmlkZQogIGJvb2wgbWF5RGVmaW5lUmVzdHJpY3RlZFR5cGUoVXJpIHVyaSkgPT4KICAgICAgdXJpLnNjaGVtZSA9PSAnZGFydCcgJiYKICAgICAgKHVyaS5wYXRoID09ICdjb3JlJyB8fCB1cmkucGF0aCA9PSAnX2ludGVyY2VwdG9ycycpOwoKICBAb3ZlcnJpZGUKICBib29sIGFsbG93UGxhdGZvcm1Qcml2YXRlTGlicmFyeUFjY2VzcyhVcmkgaW1wb3J0ZXIsIFVyaSBpbXBvcnRlZCkgPT4KICAgICAgc3VwZXIuYWxsb3dQbGF0Zm9ybVByaXZhdGVMaWJyYXJ5QWNjZXNzKGltcG9ydGVyLCBpbXBvcnRlZCkgfHwKICAgICAgbWF5YmVFbmFibGVOYXRpdmUoaW1wb3J0ZXIpOwoKICBAb3ZlcnJpZGUKICBib29sIGVuYWJsZU5hdGl2ZShVcmkgdXJpKSA9PiBtYXliZUVuYWJsZU5hdGl2ZSh1cmkpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBuYXRpdmVFeHRlbnNpb25FeHBlY3RzU3RyaW5nID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBlcnJvck9uVW5leGFjdFdlYkludExpdGVyYWxzID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IHN1cHBvcnRzU2V0TGl0ZXJhbHMgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBwZXJmb3JtTW9kdWxhclRyYW5zZm9ybWF0aW9uc09uTGlicmFyaWVzKAogICAgICBpci5Db21wb25lbnQgY29tcG9uZW50LAogICAgICBDb3JlVHlwZXMgY29yZVR5cGVzLAogICAgICBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHksCiAgICAgIExpc3Q8aXIuTGlicmFyeT4gbGlicmFyaWVzLAogICAgICBEaWFnbm9zdGljUmVwb3J0ZXIgZGlhZ25vc3RpY1JlcG9ydGVyLAogICAgICB7dm9pZCBsb2dnZXIoU3RyaW5nIG1zZyl9KSB7fQoKICBAb3ZlcnJpZGUKICBpci5FeHByZXNzaW9uIGluc3RhbnRpYXRlSW52b2NhdGlvbigKICAgICAgQ29yZVR5cGVzIGNvcmVUeXBlcywKICAgICAgaXIuRXhwcmVzc2lvbiByZWNlaXZlciwKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIGlyLkFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIGludCBvZmZzZXQsCiAgICAgIGJvb2wgaXNTdXBlcikgewogICAgaW50IGtpbmQ7CiAgICBpZiAobmFtZS5zdGFydHNXaXRoKCdnZXQ6JykpIHsKICAgICAga2luZCA9IGludm9jYXRpb25NaXJyb3JHZXR0ZXJLaW5kOwogICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoNCk7CiAgICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aCgnc2V0OicpKSB7CiAgICAgIGtpbmQgPSBpbnZvY2F0aW9uTWlycm9yU2V0dGVyS2luZDsKICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDQpOwogICAgfSBlbHNlIHsKICAgICAga2luZCA9IGludm9jYXRpb25NaXJyb3JNZXRob2RLaW5kOwogICAgfQogICAgcmV0dXJuIG5ldyBpci5TdGF0aWNJbnZvY2F0aW9uKAogICAgICAgIGNvcmVUeXBlcy5pbmRleAogICAgICAgICAgICAuZ2V0VG9wTGV2ZWxNZW1iZXIoJ2RhcnQ6Y29yZScsICdfY3JlYXRlSW52b2NhdGlvbk1pcnJvcicpLAogICAgICAgIG5ldyBpci5Bcmd1bWVudHMoPGlyLkV4cHJlc3Npb24+WwogICAgICAgICAgbmV3IGlyLlN0cmluZ0xpdGVyYWwobmFtZSkuLmZpbGVPZmZzZXQgPSBvZmZzZXQsCiAgICAgICAgICBuZXcgaXIuTGlzdExpdGVyYWwoCiAgICAgICAgICAgICAgYXJndW1lbnRzLnR5cGVzLm1hcCgodCkgPT4gbmV3IGlyLlR5cGVMaXRlcmFsKHQpKS50b0xpc3QoKSksCiAgICAgICAgICBuZXcgaXIuTGlzdExpdGVyYWwoYXJndW1lbnRzLnBvc2l0aW9uYWwpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0LAogICAgICAgICAgbmV3IGlyLk1hcExpdGVyYWwobmV3IExpc3Q8aXIuTWFwRW50cnk+LmZyb20oCiAgICAgICAgICAgICAgYXJndW1lbnRzLm5hbWVkLm1hcCgoaXIuTmFtZWRFeHByZXNzaW9uIGFyZykgewogICAgICAgICAgICByZXR1cm4gbmV3IGlyLk1hcEVudHJ5KAogICAgICAgICAgICAgICAgbmV3IGlyLlN0cmluZ0xpdGVyYWwoYXJnLm5hbWUpLi5maWxlT2Zmc2V0ID0gYXJnLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgICBhcmcudmFsdWUpCiAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gYXJnLmZpbGVPZmZzZXQ7CiAgICAgICAgICB9KSksIGtleVR5cGU6IGNvcmVUeXBlcy5zdHJpbmdDbGFzcy5yYXdUeXBlKQogICAgICAgICAgICAuLmlzQ29uc3QgPSAoYXJndW1lbnRzLm5hbWVkLmxlbmd0aCA9PSAwKQogICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBhcmd1bWVudHMuZmlsZU9mZnNldCwKICAgICAgICAgIG5ldyBpci5JbnRMaXRlcmFsKGtpbmQpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0LAogICAgICAgIF0pKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5FeHByZXNzaW9uIGluc3RhbnRpYXRlTm9TdWNoTWV0aG9kRXJyb3IoQ29yZVR5cGVzIGNvcmVUeXBlcywKICAgICAgaXIuRXhwcmVzc2lvbiByZWNlaXZlciwgU3RyaW5nIG5hbWUsIGlyLkFyZ3VtZW50cyBhcmd1bWVudHMsIGludCBvZmZzZXQsCiAgICAgIHtib29sIGlzTWV0aG9kOiBmYWxzZSwKICAgICAgYm9vbCBpc0dldHRlcjogZmFsc2UsCiAgICAgIGJvb2wgaXNTZXR0ZXI6IGZhbHNlLAogICAgICBib29sIGlzRmllbGQ6IGZhbHNlLAogICAgICBib29sIGlzTG9jYWxWYXJpYWJsZTogZmFsc2UsCiAgICAgIGJvb2wgaXNEeW5hbWljOiBmYWxzZSwKICAgICAgYm9vbCBpc1N1cGVyOiBmYWxzZSwKICAgICAgYm9vbCBpc1N0YXRpYzogZmFsc2UsCiAgICAgIGJvb2wgaXNDb25zdHJ1Y3RvcjogZmFsc2UsCiAgICAgIGJvb2wgaXNUb3BMZXZlbDogZmFsc2V9KSB7CiAgICAvLyBUT0RPKHNpZ211bmQpOiBpbXBsZW1lbnQ7CiAgICByZXR1cm4gbmV3IGlyLkludmFsaWRFeHByZXNzaW9uKG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRzQmFja2VuZCBjb25zdGFudHNCYWNrZW5kKENvcmVUeXBlcyBjb3JlVHlwZXMpID0+CiAgICAgIGNvbnN0IERhcnQyanNDb25zdGFudHNCYWNrZW5kKCk7Cn0KCi8vIFRPRE8oc2lnbXVuZCk6IHRoaXMgImV4dHJhUmVxdWlyZWRMaWJyYXJpZXMiIG5lZWRzIHRvIGJlIHJlbW92ZWQuLi4KLy8gY29tcGlsZS1wbGF0Zm9ybSBzaG91bGQganVzdCBzcGVjaWZ5IHdoaWNoIGxpYnJhcmllcyB0byBjb21waWxlIGluc3RlYWQuCmNvbnN0IF9yZXF1aXJlZExpYnJhcmllcyA9IGNvbnN0IDxTdHJpbmcsIExpc3Q8U3RyaW5nPj57CiAgJ2RhcnQyanMnOiBjb25zdCA8U3RyaW5nPlsKICAgICdkYXJ0Ol9jaHJvbWUnLAogICAgJ2RhcnQ6X2ZvcmVpZ25faGVscGVyJywKICAgICdkYXJ0Ol9pbnRlcmNlcHRvcnMnLAogICAgJ2RhcnQ6X2ludGVybmFsJywKICAgICdkYXJ0Ol9qc19lbWJlZGRlZF9uYW1lcycsCiAgICAnZGFydDpfanNfaGVscGVyJywKICAgICdkYXJ0Ol9qc19uYW1lcycsCiAgICAnZGFydDpfbmF0aXZlX3R5cGVkX2RhdGEnLAogICAgJ2RhcnQ6YXN5bmMnLAogICAgJ2RhcnQ6Y29sbGVjdGlvbicsCiAgICAnZGFydDpodG1sJywKICAgICdkYXJ0Omh0bWxfY29tbW9uJywKICAgICdkYXJ0OmluZGV4ZWRfZGInLAogICAgJ2RhcnQ6aW8nLAogICAgJ2RhcnQ6anMnLAogICAgJ2RhcnQ6anNfdXRpbCcsCiAgICAnZGFydDptaXJyb3JzJywKICAgICdkYXJ0OnN2ZycsCiAgICAnZGFydDp3ZWJfYXVkaW8nLAogICAgJ2RhcnQ6d2ViX2dsJywKICAgICdkYXJ0OndlYl9zcWwnLAogIF0sCiAgJ2RhcnQyanNfc2VydmVyJzogY29uc3QgPFN0cmluZz5bCiAgICAnZGFydDpfZm9yZWlnbl9oZWxwZXInLAogICAgJ2RhcnQ6X2ludGVyY2VwdG9ycycsCiAgICAnZGFydDpfaW50ZXJuYWwnLAogICAgJ2RhcnQ6X2pzX2VtYmVkZGVkX25hbWVzJywKICAgICdkYXJ0Ol9qc19oZWxwZXInLAogICAgJ2RhcnQ6X2pzX25hbWVzJywKICAgICdkYXJ0Ol9uYXRpdmVfdHlwZWRfZGF0YScsCiAgICAnZGFydDphc3luYycsCiAgICAnZGFydDpjb2xsZWN0aW9uJywKICAgICdkYXJ0OmlvJywKICAgICdkYXJ0OmpzJywKICAgICdkYXJ0OmpzX3V0aWwnLAogICAgJ2RhcnQ6bWlycm9ycycsCiAgXQp9OwoKY2xhc3MgRGFydDJqc0NvbnN0YW50c0JhY2tlbmQgZXh0ZW5kcyBDb25zdGFudHNCYWNrZW5kIHsKICBjb25zdCBEYXJ0MmpzQ29uc3RhbnRzQmFja2VuZCgpOwoKICBAb3ZlcnJpZGUKICBOdW1iZXJTZW1hbnRpY3MgZ2V0IG51bWJlclNlbWFudGljcyA9PiBOdW1iZXJTZW1hbnRpY3MuanM7Cn0KgM0ATk48AVAdLAEoKS4tKwFBCwoREAgNCRgPDAwDASIeIkM/SwQBHiw3BAE3AgFDJRsMFQEoAQwrAQw+AQxHAQwrHjsBDEhFIwEMOAEMMgEMMQEMKAEMMR4bICItJAEMJxseEx4SFg4jKSAqKSANKQYkGEgqOx5LSTg9JE0bLTc2MTgMHQQBDEJPHRwcGyMdGxwhISErBAEMPCcCAUdMOR0UHBoWHxcWHxIXERgXDw8UFBAWExQFJBwaFh8XFh8SFw8PFBQEAwE5IwEMPQIBL3BhY2thZ2U6Y29tcGlsZXIvc3JjL2tlcm5lbC9kYXJ0MmpzX3RhcmdldC5kYXJ0M3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2tlcm5lbC9rZWxlbWVudHMuZGFydJ0+Ly8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBFbnRpdHkgbW9kZWwgZm9yIGVsZW1lbnRzIGRlcml2ZWQgZnJvbSBLZXJuZWwgSVIuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9pbmRleGVkLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL25hbWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwoKY29uc3QgU3RyaW5nIGtFbGVtZW50UHJlZml4ID0gJ2s6JzsKCmNsYXNzIEtMaWJyYXJ5IGV4dGVuZHMgSW5kZXhlZExpYnJhcnkgewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lOwogIEBvdmVycmlkZQogIGZpbmFsIFVyaSBjYW5vbmljYWxVcmk7CgogIEtMaWJyYXJ5KHRoaXMubmFtZSwgdGhpcy5jYW5vbmljYWxVcmkpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJHtrRWxlbWVudFByZWZpeH1saWJyYXJ5KCRuYW1lKSc7Cn0KCmNsYXNzIEtDbGFzcyBleHRlbmRzIEluZGV4ZWRDbGFzcyB7CiAgQG92ZXJyaWRlCiAgZmluYWwgS0xpYnJhcnkgbGlicmFyeTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc0Fic3RyYWN0OwoKICBLQ2xhc3ModGhpcy5saWJyYXJ5LCB0aGlzLm5hbWUsIHt0aGlzLmlzQWJzdHJhY3R9KTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNDbG9zdXJlID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJHtrRWxlbWVudFByZWZpeH1jbGFzcygkbmFtZSknOwp9CgpjbGFzcyBLVHlwZWRlZiBleHRlbmRzIEluZGV4ZWRUeXBlZGVmIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBLTGlicmFyeSBsaWJyYXJ5OwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgS1R5cGVkZWYodGhpcy5saWJyYXJ5LCB0aGlzLm5hbWUpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJHtrRWxlbWVudFByZWZpeH10eXBlZGVmKCRuYW1lKSc7Cn0KCmFic3RyYWN0IGNsYXNzIEtNZW1iZXIgZXh0ZW5kcyBJbmRleGVkTWVtYmVyIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBLTGlicmFyeSBsaWJyYXJ5OwogIEBvdmVycmlkZQogIGZpbmFsIEtDbGFzcyBlbmNsb3NpbmdDbGFzczsKICBmaW5hbCBOYW1lIF9uYW1lOwogIGZpbmFsIGJvb2wgX2lzU3RhdGljOwoKICBLTWVtYmVyKHRoaXMubGlicmFyeSwgdGhpcy5lbmNsb3NpbmdDbGFzcywgdGhpcy5fbmFtZSwge2Jvb2wgaXNTdGF0aWM6IGZhbHNlfSkKICAgICAgOiBfaXNTdGF0aWMgPSBpc1N0YXRpYzsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+IF9uYW1lLnRleHQ7CgogIEBvdmVycmlkZQogIE5hbWUgZ2V0IG1lbWJlck5hbWUgPT4gX25hbWU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQXNzaWduYWJsZSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNDb25zdCA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNBYnN0cmFjdCA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNTZXR0ZXIgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzR2V0dGVyID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0Z1bmN0aW9uID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0ZpZWxkID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0NvbnN0cnVjdG9yID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0luc3RhbmNlTWVtYmVyID0+IGVuY2xvc2luZ0NsYXNzICE9IG51bGwgJiYgIV9pc1N0YXRpYzsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNTdGF0aWMgPT4gZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCAmJiBfaXNTdGF0aWM7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzVG9wTGV2ZWwgPT4gZW5jbG9zaW5nQ2xhc3MgPT0gbnVsbDsKCiAgU3RyaW5nIGdldCBfa2luZDsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyR7a0VsZW1lbnRQcmVmaXh9JF9raW5kJwogICAgICAnKCR7ZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCA/ICcke2VuY2xvc2luZ0NsYXNzLm5hbWV9LicgOiAnJ30kbmFtZSknOwp9CgphYnN0cmFjdCBjbGFzcyBLRnVuY3Rpb24gZXh0ZW5kcyBLTWVtYmVyCiAgICBpbXBsZW1lbnRzIEZ1bmN0aW9uRW50aXR5LCBJbmRleGVkRnVuY3Rpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmU7CiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc0V4dGVybmFsOwogIEBvdmVycmlkZQogIGZpbmFsIEFzeW5jTWFya2VyIGFzeW5jTWFya2VyOwoKICBLRnVuY3Rpb24oS0xpYnJhcnkgbGlicmFyeSwgS0NsYXNzIGVuY2xvc2luZ0NsYXNzLCBOYW1lIG5hbWUsCiAgICAgIHRoaXMucGFyYW1ldGVyU3RydWN0dXJlLCB0aGlzLmFzeW5jTWFya2VyLAogICAgICB7Ym9vbCBpc1N0YXRpYzogZmFsc2UsIHRoaXMuaXNFeHRlcm5hbDogZmFsc2V9KQogICAgICA6IHN1cGVyKGxpYnJhcnksIGVuY2xvc2luZ0NsYXNzLCBuYW1lLCBpc1N0YXRpYzogaXNTdGF0aWMpOwp9CgphYnN0cmFjdCBjbGFzcyBLQ29uc3RydWN0b3IgZXh0ZW5kcyBLRnVuY3Rpb24KICAgIGltcGxlbWVudHMgQ29uc3RydWN0b3JFbnRpdHksIEluZGV4ZWRDb25zdHJ1Y3RvciB7CiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc0NvbnN0OwoKICBLQ29uc3RydWN0b3IoCiAgICAgIEtDbGFzcyBlbmNsb3NpbmdDbGFzcywgTmFtZSBuYW1lLCBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlLAogICAgICB7Ym9vbCBpc0V4dGVybmFsLCB0aGlzLmlzQ29uc3R9KQogICAgICA6IHN1cGVyKGVuY2xvc2luZ0NsYXNzLmxpYnJhcnksIGVuY2xvc2luZ0NsYXNzLCBuYW1lLCBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgICAgICAgIEFzeW5jTWFya2VyLlNZTkMsCiAgICAgICAgICAgIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0NvbnN0cnVjdG9yID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzSW5zdGFuY2VNZW1iZXIgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU3RhdGljID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1RvcExldmVsID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0Zyb21FbnZpcm9ubWVudENvbnN0cnVjdG9yID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9raW5kID0+ICdjb25zdHJ1Y3Rvcic7Cn0KCmNsYXNzIEtHZW5lcmF0aXZlQ29uc3RydWN0b3IgZXh0ZW5kcyBLQ29uc3RydWN0b3IgewogIEtHZW5lcmF0aXZlQ29uc3RydWN0b3IoCiAgICAgIEtDbGFzcyBlbmNsb3NpbmdDbGFzcywgTmFtZSBuYW1lLCBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlLAogICAgICB7Ym9vbCBpc0V4dGVybmFsLCBib29sIGlzQ29uc3R9KQogICAgICA6IHN1cGVyKGVuY2xvc2luZ0NsYXNzLCBuYW1lLCBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgICAgICAgIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwsIGlzQ29uc3Q6IGlzQ29uc3QpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0ZhY3RvcnlDb25zdHJ1Y3RvciA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNHZW5lcmF0aXZlQ29uc3RydWN0b3IgPT4gdHJ1ZTsKfQoKY2xhc3MgS0ZhY3RvcnlDb25zdHJ1Y3RvciBleHRlbmRzIEtDb25zdHJ1Y3RvciB7CiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc0Zyb21FbnZpcm9ubWVudENvbnN0cnVjdG9yOwoKICBLRmFjdG9yeUNvbnN0cnVjdG9yKAogICAgICBLQ2xhc3MgZW5jbG9zaW5nQ2xhc3MsIE5hbWUgbmFtZSwgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAge2Jvb2wgaXNFeHRlcm5hbCwgYm9vbCBpc0NvbnN0LCB0aGlzLmlzRnJvbUVudmlyb25tZW50Q29uc3RydWN0b3J9KQogICAgICA6IHN1cGVyKGVuY2xvc2luZ0NsYXNzLCBuYW1lLCBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgICAgICAgIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwsIGlzQ29uc3Q6IGlzQ29uc3QpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0ZhY3RvcnlDb25zdHJ1Y3RvciA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0dlbmVyYXRpdmVDb25zdHJ1Y3RvciA9PiBmYWxzZTsKfQoKY2xhc3MgS01ldGhvZCBleHRlbmRzIEtGdW5jdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc0Fic3RyYWN0OwoKICBLTWV0aG9kKEtMaWJyYXJ5IGxpYnJhcnksIEtDbGFzcyBlbmNsb3NpbmdDbGFzcywgTmFtZSBuYW1lLAogICAgICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlLCBBc3luY01hcmtlciBhc3luY01hcmtlciwKICAgICAge2Jvb2wgaXNTdGF0aWMsIGJvb2wgaXNFeHRlcm5hbCwgdGhpcy5pc0Fic3RyYWN0fSkKICAgICAgOiBzdXBlcihsaWJyYXJ5LCBlbmNsb3NpbmdDbGFzcywgbmFtZSwgcGFyYW1ldGVyU3RydWN0dXJlLCBhc3luY01hcmtlciwKICAgICAgICAgICAgaXNTdGF0aWM6IGlzU3RhdGljLCBpc0V4dGVybmFsOiBpc0V4dGVybmFsKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNGdW5jdGlvbiA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9raW5kID0+ICdtZXRob2QnOwp9CgpjbGFzcyBLR2V0dGVyIGV4dGVuZHMgS0Z1bmN0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzQWJzdHJhY3Q7CgogIEtHZXR0ZXIoS0xpYnJhcnkgbGlicmFyeSwgS0NsYXNzIGVuY2xvc2luZ0NsYXNzLCBOYW1lIG5hbWUsCiAgICAgIEFzeW5jTWFya2VyIGFzeW5jTWFya2VyLAogICAgICB7Ym9vbCBpc1N0YXRpYywgYm9vbCBpc0V4dGVybmFsLCB0aGlzLmlzQWJzdHJhY3R9KQogICAgICA6IHN1cGVyKGxpYnJhcnksIGVuY2xvc2luZ0NsYXNzLCBuYW1lLCBjb25zdCBQYXJhbWV0ZXJTdHJ1Y3R1cmUuZ2V0dGVyKCksCiAgICAgICAgICAgIGFzeW5jTWFya2VyLAogICAgICAgICAgICBpc1N0YXRpYzogaXNTdGF0aWMsIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0dldHRlciA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9raW5kID0+ICdnZXR0ZXInOwp9CgpjbGFzcyBLU2V0dGVyIGV4dGVuZHMgS0Z1bmN0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzQWJzdHJhY3Q7CgogIEtTZXR0ZXIoS0xpYnJhcnkgbGlicmFyeSwgS0NsYXNzIGVuY2xvc2luZ0NsYXNzLCBOYW1lIG5hbWUsCiAgICAgIHtib29sIGlzU3RhdGljLCBib29sIGlzRXh0ZXJuYWwsIHRoaXMuaXNBYnN0cmFjdH0pCiAgICAgIDogc3VwZXIobGlicmFyeSwgZW5jbG9zaW5nQ2xhc3MsIG5hbWUsIGNvbnN0IFBhcmFtZXRlclN0cnVjdHVyZS5zZXR0ZXIoKSwKICAgICAgICAgICAgQXN5bmNNYXJrZXIuU1lOQywKICAgICAgICAgICAgaXNTdGF0aWM6IGlzU3RhdGljLCBpc0V4dGVybmFsOiBpc0V4dGVybmFsKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNBc3NpZ25hYmxlID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU2V0dGVyID0+IHRydWU7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX2tpbmQgPT4gJ3NldHRlcic7Cn0KCmNsYXNzIEtGaWVsZCBleHRlbmRzIEtNZW1iZXIgaW1wbGVtZW50cyBGaWVsZEVudGl0eSwgSW5kZXhlZEZpZWxkIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzQXNzaWduYWJsZTsKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzQ29uc3Q7CgogIEtGaWVsZChLTGlicmFyeSBsaWJyYXJ5LCBLQ2xhc3MgZW5jbG9zaW5nQ2xhc3MsIE5hbWUgbmFtZSwKICAgICAge2Jvb2wgaXNTdGF0aWMsIHRoaXMuaXNBc3NpZ25hYmxlLCB0aGlzLmlzQ29uc3R9KQogICAgICA6IHN1cGVyKGxpYnJhcnksIGVuY2xvc2luZ0NsYXNzLCBuYW1lLCBpc1N0YXRpYzogaXNTdGF0aWMpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0ZpZWxkID0+IHRydWU7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX2tpbmQgPT4gJ2ZpZWxkJzsKfQoKY2xhc3MgS1R5cGVWYXJpYWJsZSBleHRlbmRzIEluZGV4ZWRUeXBlVmFyaWFibGUgewogIEBvdmVycmlkZQogIGZpbmFsIEVudGl0eSB0eXBlRGVjbGFyYXRpb247CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IGluZGV4OwoKICBLVHlwZVZhcmlhYmxlKHRoaXMudHlwZURlY2xhcmF0aW9uLCB0aGlzLm5hbWUsIHRoaXMuaW5kZXgpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PgogICAgICAnJHtrRWxlbWVudFByZWZpeH10eXBlX3ZhcmlhYmxlKCR7dHlwZURlY2xhcmF0aW9uLm5hbWV9LiRuYW1lKSc7Cn0KCmNsYXNzIEtMb2NhbEZ1bmN0aW9uIGltcGxlbWVudHMgTG9jYWwgewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lOwogIGZpbmFsIE1lbWJlckVudGl0eSBtZW1iZXJDb250ZXh0OwogIGZpbmFsIEVudGl0eSBleGVjdXRhYmxlQ29udGV4dDsKICBmaW5hbCBpci5Ob2RlIG5vZGU7CiAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZTsKCiAgS0xvY2FsRnVuY3Rpb24oCiAgICAgIHRoaXMubmFtZSwgdGhpcy5tZW1iZXJDb250ZXh0LCB0aGlzLmV4ZWN1dGFibGVDb250ZXh0LCB0aGlzLm5vZGUpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJHtrRWxlbWVudFByZWZpeH1sb2NhbF9mdW5jdGlvbicKICAgICAgJygke21lbWJlckNvbnRleHQubmFtZX0uJHtuYW1lID8/ICc8YW5vbnltb3VzPid9KSc7Cn0KCmNsYXNzIEtMb2NhbFR5cGVWYXJpYWJsZSBpbXBsZW1lbnRzIFR5cGVWYXJpYWJsZUVudGl0eSB7CiAgQG92ZXJyaWRlCiAgZmluYWwgRW50aXR5IHR5cGVEZWNsYXJhdGlvbjsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgaW5kZXg7CiAgRGFydFR5cGUgYm91bmQ7CiAgRGFydFR5cGUgZGVmYXVsdFR5cGU7CgogIEtMb2NhbFR5cGVWYXJpYWJsZSh0aGlzLnR5cGVEZWNsYXJhdGlvbiwgdGhpcy5uYW1lLCB0aGlzLmluZGV4KTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4KICAgICAgJyR7a0VsZW1lbnRQcmVmaXh9bG9jYWxfdHlwZV92YXJpYWJsZSgke3R5cGVEZWNsYXJhdGlvbi5uYW1lfS4kbmFtZSknOwp9CoE4AE5OPAE2ASgkIyEhASQBKAwVDBoBKgEMOgIBJAwaAQwVDBkBNgEMHwEMOAIBKAwaAQwVASUBDDoCAS8MGgwfFBgBUR4BDCEBDCABDCIBDB0BDCABDB4BDB4BDCABDB0BDCMBDEUBDDwBDDEBFAEMMUsCASkxDC8MGQwhAUAxNkICAS43DBYBEE8nUB4lAQwiAQwmAQweAQwgAQwyAQwlAgE0Gk8nODcBDCoBDCwCATEMKwEXT0o4NwEMKQEMLQIBIgwZAT5GOU45AQwfAQwgAgEiDBkBPh85UBk5AQwdAQwgAgEiDBkBPjlQHjkBDCEBDB0BDCACAUQMGwwWAT04QgEMHAEMHwIBMgwgDBUMEwE+AQwXRwIBKAwVJCIWHQESSQEMOToCATkMIAwVDBMSGAFDAQwXTQIBKnBhY2thZ2U6Y29tcGlsZXIvc3JjL2tlcm5lbC9rZWxlbWVudHMuZGFydD5zZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9zZXJpYWxpemF0aW9uL3NlcmlhbGl6YXRpb24uZGFydMAAbvQvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2JpbmFyeS9hc3RfdG9fYmluYXJ5LmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2JpbmFyeS9hc3RfZnJvbV9iaW5hcnkuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvYmluYXJ5L2FzdF90b19iaW5hcnkuZGFydCcgYXMgaXI7CmltcG9ydCAnLi4vY2xvc3VyZS5kYXJ0JzsKaW1wb3J0ICcuLi9jb25zdGFudHMvY29uc3RhbnRfc3lzdGVtLmRhcnQnIGFzIGNvbnN0YW50X3N5c3RlbTsKaW1wb3J0ICcuLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJy4uL2RpYWdub3N0aWNzL3NvdXJjZV9zcGFuLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2luZGV4ZWQuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vaXIvY29uc3RhbnRzLmRhcnQnOwppbXBvcnQgJy4uL2lyL3N0YXRpY190eXBlX2Jhc2UuZGFydCc7CmltcG9ydCAnLi4vanNfbW9kZWwvY2xvc3VyZS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19tb2RlbC9sb2NhbHMuZGFydCc7CgpwYXJ0ICdhYnN0cmFjdF9zaW5rLmRhcnQnOwpwYXJ0ICdhYnN0cmFjdF9zb3VyY2UuZGFydCc7CnBhcnQgJ2JpbmFyeV9zaW5rLmRhcnQnOwpwYXJ0ICdiaW5hcnlfc291cmNlLmRhcnQnOwpwYXJ0ICdoZWxwZXJzLmRhcnQnOwpwYXJ0ICdtZW1iZXJfZGF0YS5kYXJ0JzsKcGFydCAnbWl4aW5zLmRhcnQnOwpwYXJ0ICdub2RlX2luZGV4ZXIuZGFydCc7CnBhcnQgJ29iamVjdF9zaW5rLmRhcnQnOwpwYXJ0ICdvYmplY3Rfc291cmNlLmRhcnQnOwoKLy8vIEludGVyZmFjZSBmb3Igc2VyaWFsaXphdGlvbi4KYWJzdHJhY3QgY2xhc3MgRGF0YVNpbmsgewogIC8vLyBUaGUgYW1vdW50IG9mIGRhdGEgd3JpdHRlbiB0byB0aGlzIGRhdGEgc2luay4KICAvLy8KICAvLy8gVGhlIHVuaXRzIGlzIGJhc2VkIG9uIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlIGZvciB0aGlzIGRhdGEgc2luay4KICBpbnQgZ2V0IGxlbmd0aDsKCiAgLy8vIEZsdXNoZXMgYW55IHBlbmRpbmcgZGF0YSBhbmQgY2xvc2VzIHRoaXMgZGF0YSBzaW5rLgogIC8vLwogIC8vLyBUaGUgZGF0YSBzaW5rIGNhbiBubyBsb25nZXIgYmUgd3JpdHRlbiB0byBhZnRlciBjbG9zaW5nLgogIHZvaWQgY2xvc2UoKTsKCiAgLy8vIFJlZ2lzdGVycyB0aGF0IHRoZSBzZWN0aW9uIFt0YWddIHN0YXJ0cy4KICAvLy8KICAvLy8gVGhpcyBpcyB1c2VkIGZvciBkZWJ1Z2dpbmcgdG8gdmVyaWZ5IHRoYXQgc2VjdGlvbnMgYXJlIGNvcnJlY3RseSBhbGlnbmVkCiAgLy8vIGJldHdlZW4gc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgogIHZvaWQgYmVnaW4oU3RyaW5nIHRhZyk7CgogIC8vLyBSZWdpc3RlcnMgdGhhdCB0aGUgc2VjdGlvbiBbdGFnXSBlbmRzLgogIC8vLwogIC8vLyBUaGlzIGlzIHVzZWQgZm9yIGRlYnVnZ2luZyB0byB2ZXJpZnkgdGhhdCBzZWN0aW9ucyBhcmUgY29ycmVjdGx5IGFsaWduZWQKICAvLy8gYmV0d2VlbiBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24uCiAgdm9pZCBlbmQoU3RyaW5nIHRhZyk7CgogIC8vLyBXcml0ZXMgYSByZWZlcmVuY2UgdG8gW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4gSWYgW3ZhbHVlXSBoYXMgbm90IHlldAogIC8vLyBiZWVuIHNlcmlhbGl6ZWQsIFtmXSBpcyBjYWxsZWQgdG8gc2VyaWFsaXplIHRoZSB2YWx1ZSBpdHNlbGYuCiAgdm9pZCB3cml0ZUNhY2hlZDxFPihFIHZhbHVlLCB2b2lkIGYoRSB2YWx1ZSkpOwoKICAvLy8gV3JpdGVzIHRoZSBwb3RlbnRpYWxseSBgbnVsbGAgW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4gSWYgW3ZhbHVlXSBpcwogIC8vLyBub24tbnVsbCBbZl0gaXMgY2FsbGVkIHRvIHdyaXRlIHRoZSBub24tbnVsbCB2YWx1ZSB0byB0aGUgZGF0YSBzaW5rLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNvdXJjZS5yZWFkVmFsdWVPck51bGxdLgogIHZvaWQgd3JpdGVWYWx1ZU9yTnVsbDxFPihFIHZhbHVlLCB2b2lkIGYoRSB2YWx1ZSkpOwoKICAvLy8gV3JpdGVzIHRoZSBbdmFsdWVzXSB0byB0aGlzIGRhdGEgc2luayBjYWxsaW5nIFtmXSB0byB3cml0ZSBlYWNoIHZhbHVlIHRvCiAgLy8vIHRoZSBkYXRhIHNpbmsuIElmIFthbGxvd051bGxdIGlzIGB0cnVlYCwgW3ZhbHVlc10gaXMgYWxsb3dlZCB0byBiZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRMaXN0XS4KICB2b2lkIHdyaXRlTGlzdDxFPihJdGVyYWJsZTxFPiB2YWx1ZXMsIHZvaWQgZihFIHZhbHVlKSwKICAgICAge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pOwoKICAvLy8gV3JpdGVzIHRoZSBib29sZWFuIFt2YWx1ZV0gdG8gdGhpcyBkYXRhIHNpbmsuCiAgdm9pZCB3cml0ZUJvb2woYm9vbCB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgdGhlIG5vbi1uZWdhdGl2ZSAzMCBiaXQgaW50ZWdlciBbdmFsdWVdIHRvIHRoaXMgZGF0YSBzaW5rLgogIHZvaWQgd3JpdGVJbnQoaW50IHZhbHVlKTsKCiAgLy8vIFdyaXRlcyB0aGUgcG90ZW50aWFsbHkgYG51bGxgIG5vbi1uZWdhdGl2ZSBbdmFsdWVdIHRvIHRoaXMgZGF0YSBzaW5rLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNvdXJjZS5yZWFkSW50T3JOdWxsXS4KICB2b2lkIHdyaXRlSW50T3JOdWxsKGludCB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgdGhlIHN0cmluZyBbdmFsdWVdIHRvIHRoaXMgZGF0YSBzaW5rLgogIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHZhbHVlKTsKCiAgLy8vIFdyaXRlcyB0aGUgcG90ZW50aWFsbHkgYG51bGxgIHN0cmluZyBbdmFsdWVdIHRvIHRoaXMgZGF0YSBzaW5rLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNvdXJjZS5yZWFkU3RyaW5nT3JOdWxsXS4KICB2b2lkIHdyaXRlU3RyaW5nT3JOdWxsKFN0cmluZyB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgdGhlIHN0cmluZyBbdmFsdWVzXSB0byB0aGlzIGRhdGEgc2luay4gSWYgW2FsbG93TnVsbF0gaXMgYHRydWVgLAogIC8vLyBbdmFsdWVzXSBpcyBhbGxvd2VkIHRvIGJlIGBudWxsYC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTb3VyY2UucmVhZFN0cmluZ3NdLgogIHZvaWQgd3JpdGVTdHJpbmdzKEl0ZXJhYmxlPFN0cmluZz4gdmFsdWVzLCB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSk7CgogIC8vLyBXcml0ZXMgdGhlIFttYXBdIGZyb20gc3RyaW5nIHRvIFtWXSB2YWx1ZXMgdG8gdGhpcyBkYXRhIHNpbmssIGNhbGxpbmcgW2ZdCiAgLy8vIHRvIHdyaXRlIGVhY2ggdmFsdWUgdG8gdGhlIGRhdGEgc2luay4gSWYgW2FsbG93TnVsbF0gaXMgYHRydWVgLCBbbWFwXSBpcwogIC8vLyBhbGxvd2VkIHRvIGJlIGBudWxsYC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTb3VyY2UucmVhZFN0cmluZ01hcF0uCiAgdm9pZCB3cml0ZVN0cmluZ01hcDxWPihNYXA8U3RyaW5nLCBWPiBtYXAsIHZvaWQgZihWIHZhbHVlKSwKICAgICAge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pOwoKICAvLy8gV3JpdGVzIHRoZSBlbnVtIHZhbHVlIFt2YWx1ZV0gdG8gdGhpcyBkYXRhIHNpbmsuCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ2hhbmdlIHRoZSBzaWduYXR1cmUgdG8KICAvLyBgdm9pZCB3cml0ZUVudW08RSBleHRlbmRzIEVudW08RT4+KEUgdmFsdWUpO2Agd2hlbiBhbiBpbnRlcmZhY2UgZm9yIGVudW1zCiAgLy8gaXMgYWRkZWQgdG8gdGhlIGxhbmd1YWdlLgogIHZvaWQgd3JpdGVFbnVtKGR5bmFtaWMgdmFsdWUpOwoKICAvLy8gV3JpdGVzIHRoZSBVUkkgW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4KICB2b2lkIHdyaXRlVXJpKFVyaSB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgYSByZWZlcmVuY2UgdG8gdGhlIGtlcm5lbCBsaWJyYXJ5IG5vZGUgW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4KICB2b2lkIHdyaXRlTGlicmFyeU5vZGUoaXIuTGlicmFyeSB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgYSByZWZlcmVuY2UgdG8gdGhlIGtlcm5lbCBjbGFzcyBub2RlIFt2YWx1ZV0gdG8gdGhpcyBkYXRhIHNpbmsuCiAgdm9pZCB3cml0ZUNsYXNzTm9kZShpci5DbGFzcyB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgYSByZWZlcmVuY2UgdG8gdGhlIGtlcm5lbCB0eXBlZGVmIG5vZGUgW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4KICB2b2lkIHdyaXRlVHlwZWRlZk5vZGUoaXIuVHlwZWRlZiB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgYSByZWZlcmVuY2UgdG8gdGhlIGtlcm5lbCBtZW1iZXIgbm9kZSBbdmFsdWVdIHRvIHRoaXMgZGF0YSBzaW5rLgogIHZvaWQgd3JpdGVNZW1iZXJOb2RlKGlyLk1lbWJlciB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgcmVmZXJlbmNlcyB0byB0aGUga2VybmVsIG1lbWJlciBub2RlIFt2YWx1ZXNdIHRvIHRoaXMgZGF0YSBzaW5rLgogIC8vLyBJZiBbYWxsb3dOdWxsXSBpcyBgdHJ1ZWAsIFt2YWx1ZXNdIGlzIGFsbG93ZWQgdG8gYmUgYG51bGxgLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNvdXJjZS5yZWFkTWVtYmVyTm9kZXNdLgogIHZvaWQgd3JpdGVNZW1iZXJOb2RlcyhJdGVyYWJsZTxpci5NZW1iZXI+IHZhbHVlcywge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pOwoKICAvLy8gV3JpdGVzIHRoZSBbbWFwXSBmcm9tIHJlZmVyZW5jZXMgdG8ga2VybmVsIG1lbWJlciBub2RlcyB0byBbVl0gdmFsdWVzIHRvCiAgLy8vIHRoaXMgZGF0YSBzaW5rLCBjYWxsaW5nIFtmXSB0byB3cml0ZSBlYWNoIHZhbHVlIHRvIHRoZSBkYXRhIHNpbmsuIElmCiAgLy8vIFthbGxvd051bGxdIGlzIGB0cnVlYCwgW21hcF0gaXMgYWxsb3dlZCB0byBiZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRNZW1iZXJOb2RlTWFwXS4KICB2b2lkIHdyaXRlTWVtYmVyTm9kZU1hcDxWPihNYXA8aXIuTWVtYmVyLCBWPiBtYXAsIHZvaWQgZihWIHZhbHVlKSwKICAgICAge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pOwoKICAvLy8gV3JpdGVzIGEga2VybmVsIG5hbWUgbm9kZSB0byB0aGlzIGRhdGEgc2luay4KICB2b2lkIHdyaXRlTmFtZShpci5OYW1lIHZhbHVlKTsKCiAgLy8vIFdyaXRlcyBhIGtlcm5lbCBsaWJyYXJ5IGRlcGVuZGVuY3kgbm9kZSBbdmFsdWVdIHRvIHRoaXMgZGF0YSBzaW5rLgogIHZvaWQgd3JpdGVMaWJyYXJ5RGVwZW5kZW5jeU5vZGUoaXIuTGlicmFyeURlcGVuZGVuY3kgdmFsdWUpOwoKICAvLy8gV3JpdGVzIGEgcG90ZW50aWFsbHkgYG51bGxgIGtlcm5lbCBsaWJyYXJ5IGRlcGVuZGVuY3kgbm9kZSBbdmFsdWVdIHRvCiAgLy8vIHRoaXMgZGF0YSBzaW5rLgogIHZvaWQgd3JpdGVMaWJyYXJ5RGVwZW5kZW5jeU5vZGVPck51bGwoaXIuTGlicmFyeURlcGVuZGVuY3kgdmFsdWUpOwoKICAvLy8gV3JpdGVzIGEgcmVmZXJlbmNlIHRvIHRoZSBrZXJuZWwgdHJlZSBub2RlIFt2YWx1ZV0gdG8gdGhpcyBkYXRhIHNpbmsuCiAgdm9pZCB3cml0ZVRyZWVOb2RlKGlyLlRyZWVOb2RlIHZhbHVlKTsKCiAgLy8vIFdyaXRlcyBhIHJlZmVyZW5jZSB0byB0aGUgcG90ZW50aWFsbHkgYG51bGxgIGtlcm5lbCB0cmVlIG5vZGUgW3ZhbHVlXQogIC8vLyB0byB0aGlzIGRhdGEgc2luay4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTb3VyY2UucmVhZFRyZWVOb2RlT3JOdWxsXS4KICB2b2lkIHdyaXRlVHJlZU5vZGVPck51bGwoaXIuVHJlZU5vZGUgdmFsdWUpOwoKICAvLy8gV3JpdGVzIHJlZmVyZW5jZXMgdG8gdGhlIGtlcm5lbCB0cmVlIG5vZGUgW3ZhbHVlc10gdG8gdGhpcyBkYXRhIHNpbmsuCiAgLy8vIElmIFthbGxvd051bGxdIGlzIGB0cnVlYCwgW3ZhbHVlc10gaXMgYWxsb3dlZCB0byBiZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRUcmVlTm9kZXNdLgogIHZvaWQgd3JpdGVUcmVlTm9kZXMoSXRlcmFibGU8aXIuVHJlZU5vZGU+IHZhbHVlcywge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pOwoKICAvLy8gV3JpdGVzIHRoZSBbbWFwXSBmcm9tIHJlZmVyZW5jZXMgdG8ga2VybmVsIHRyZWUgbm9kZXMgdG8gW1ZdIHZhbHVlcyB0bwogIC8vLyB0aGlzIGRhdGEgc2luaywgY2FsbGluZyBbZl0gdG8gd3JpdGUgZWFjaCB2YWx1ZSB0byB0aGUgZGF0YSBzaW5rLiBJZgogIC8vLyBbYWxsb3dOdWxsXSBpcyBgdHJ1ZWAsIFttYXBdIGlzIGFsbG93ZWQgdG8gYmUgYG51bGxgLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNvdXJjZS5yZWFkVHJlZU5vZGVNYXBdLgogIHZvaWQgd3JpdGVUcmVlTm9kZU1hcDxWPihNYXA8aXIuVHJlZU5vZGUsIFY+IG1hcCwgdm9pZCBmKFYgdmFsdWUpLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSk7CgogIC8vLyBXcml0ZXMgYSByZWZlcmVuY2UgdG8gdGhlIGtlcm5lbCB0eXBlIHBhcmFtZXRlciBub2RlIFt2YWx1ZV0gdG8gdGhpcyBkYXRhCiAgLy8vIHNpbmsuCiAgdm9pZCB3cml0ZVR5cGVQYXJhbWV0ZXJOb2RlKGlyLlR5cGVQYXJhbWV0ZXIgdmFsdWUpOwoKICAvLy8gV3JpdGVzIHJlZmVyZW5jZXMgdG8gdGhlIGtlcm5lbCB0eXBlIHBhcmFtZXRlciBub2RlIFt2YWx1ZXNdIHRvIHRoaXMgZGF0YQogIC8vLyBzaW5rLgogIC8vLyBJZiBbYWxsb3dOdWxsXSBpcyBgdHJ1ZWAsIFt2YWx1ZXNdIGlzIGFsbG93ZWQgdG8gYmUgYG51bGxgLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNvdXJjZS5yZWFkVHlwZVBhcmFtZXRlck5vZGVzXS4KICB2b2lkIHdyaXRlVHlwZVBhcmFtZXRlck5vZGVzKEl0ZXJhYmxlPGlyLlR5cGVQYXJhbWV0ZXI+IHZhbHVlcywKICAgICAge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pOwoKICAvLy8gV3JpdGVzIHRoZSB0eXBlIFt2YWx1ZV0gdG8gdGhpcyBkYXRhIHNpbmsuIElmIFthbGxvd051bGxdIGlzIGB0cnVlYCwKICAvLy8gW3ZhbHVlXSBpcyBhbGxvd2VkIHRvIGJlIGBudWxsYC4KICB2b2lkIHdyaXRlRGFydFR5cGUoRGFydFR5cGUgdmFsdWUsIHtib29sIGFsbG93TnVsbDogZmFsc2V9KTsKCiAgLy8vIFdyaXRlcyB0aGUgdHlwZSBbdmFsdWVzXSB0byB0aGlzIGRhdGEgc2luay4gSWYgW2FsbG93TnVsbF0gaXMgYHRydWVgLAogIC8vLyBbdmFsdWVzXSBpcyBhbGxvd2VkIHRvIGJlIGBudWxsYC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTb3VyY2UucmVhZERhcnRUeXBlc10uCiAgdm9pZCB3cml0ZURhcnRUeXBlcyhJdGVyYWJsZTxEYXJ0VHlwZT4gdmFsdWVzLCB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSk7CgogIC8vLyBXcml0ZXMgdGhlIGtlcm5lbCB0eXBlIG5vZGUgW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4gSWYgW2FsbG93TnVsbF0gaXMKICAvLy8gYHRydWVgLCBbdmFsdWVdIGlzIGFsbG93ZWQgdG8gYmUgYG51bGxgLgogIHZvaWQgd3JpdGVEYXJ0VHlwZU5vZGUoaXIuRGFydFR5cGUgdmFsdWUsIHtib29sIGFsbG93TnVsbDogZmFsc2V9KTsKCiAgLy8vIFdyaXRlcyB0aGUga2VybmVsIHR5cGUgbm9kZSBbdmFsdWVzXSB0byB0aGlzIGRhdGEgc2luay4gSWYgW2FsbG93TnVsbF0gaXMKICAvLy8gYHRydWVgLCBbdmFsdWVzXSBpcyBhbGxvd2VkIHRvIGJlIGBudWxsYC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTb3VyY2UucmVhZERhcnRUeXBlTm9kZXNdLgogIHZvaWQgd3JpdGVEYXJ0VHlwZU5vZGVzKEl0ZXJhYmxlPGlyLkRhcnRUeXBlPiB2YWx1ZXMsCiAgICAgIHtib29sIGFsbG93TnVsbDogZmFsc2V9KTsKCiAgLy8vIFdyaXRlcyB0aGUgc291cmNlIHNwYW4gW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4KICB2b2lkIHdyaXRlU291cmNlU3BhbihTb3VyY2VTcGFuIHZhbHVlKTsKCiAgLy8vIFdyaXRlcyBhIHJlZmVyZW5jZSB0byB0aGUgaW5kZXhlZCBsaWJyYXJ5IFt2YWx1ZV0gdG8gdGhpcyBkYXRhIHNpbmsuCiAgdm9pZCB3cml0ZUxpYnJhcnkoSW5kZXhlZExpYnJhcnkgdmFsdWUpOwoKICAvLy8gV3JpdGVzIGEgcmVmZXJlbmNlIHRvIHRoZSBwb3RlbnRpYWxseSBgbnVsbGAgaW5kZXhlZCBsaWJyYXJ5IFt2YWx1ZV0KICAvLy8gdG8gdGhpcyBkYXRhIHNpbmsuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRMaWJyYXJ5T3JOdWxsXS4KICB2b2lkIHdyaXRlTGlicmFyeU9yTnVsbChJbmRleGVkTGlicmFyeSB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgdGhlIFttYXBdIGZyb20gcmVmZXJlbmNlcyB0byBpbmRleGVkIGxpYnJhcmllcyB0byBbVl0gdmFsdWVzIHRvCiAgLy8vIHRoaXMgZGF0YSBzaW5rLCBjYWxsaW5nIFtmXSB0byB3cml0ZSBlYWNoIHZhbHVlIHRvIHRoZSBkYXRhIHNpbmsuIElmCiAgLy8vIFthbGxvd051bGxdIGlzIGB0cnVlYCwgW21hcF0gaXMgYWxsb3dlZCB0byBiZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRMaWJyYXJ5TWFwXS4KICB2b2lkIHdyaXRlTGlicmFyeU1hcDxWPihNYXA8TGlicmFyeUVudGl0eSwgVj4gbWFwLCB2b2lkIGYoViB2YWx1ZSksCiAgICAgIHtib29sIGFsbG93TnVsbDogZmFsc2V9KTsKCiAgLy8vIFdyaXRlcyBhIHJlZmVyZW5jZSB0byB0aGUgaW5kZXhlZCBjbGFzcyBbdmFsdWVdIHRvIHRoaXMgZGF0YSBzaW5rLgogIHZvaWQgd3JpdGVDbGFzcyhJbmRleGVkQ2xhc3MgdmFsdWUpOwoKICAvLy8gV3JpdGVzIGEgcmVmZXJlbmNlIHRvIHRoZSBwb3RlbnRpYWxseSBgbnVsbGAgaW5kZXhlZCBjbGFzcyBbdmFsdWVdCiAgLy8vIHRvIHRoaXMgZGF0YSBzaW5rLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNvdXJjZS5yZWFkQ2xhc3NPck51bGxdLgogIHZvaWQgd3JpdGVDbGFzc09yTnVsbChJbmRleGVkQ2xhc3MgdmFsdWUpOwoKICAvLy8gV3JpdGVzIHJlZmVyZW5jZXMgdG8gdGhlIGluZGV4ZWQgY2xhc3MgW3ZhbHVlc10gdG8gdGhpcyBkYXRhIHNpbmsuIElmCiAgLy8vIFthbGxvd051bGxdIGlzIGB0cnVlYCwgW3ZhbHVlc10gaXMgYWxsb3dlZCB0byBiZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRDbGFzc2VzXS4KICB2b2lkIHdyaXRlQ2xhc3NlcyhJdGVyYWJsZTxDbGFzc0VudGl0eT4gdmFsdWVzLCB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSk7CgogIC8vLyBXcml0ZXMgdGhlIFttYXBdIGZyb20gcmVmZXJlbmNlcyB0byBpbmRleGVkIGNsYXNzZXMgdG8gW1ZdIHZhbHVlcyB0byB0aGlzCiAgLy8vIGRhdGEgc2luaywgY2FsbGluZyBbZl0gdG8gd3JpdGUgZWFjaCB2YWx1ZSB0byB0aGUgZGF0YSBzaW5rLiBJZgogIC8vLyBbYWxsb3dOdWxsXSBpcyBgdHJ1ZWAsIFttYXBdIGlzIGFsbG93ZWQgdG8gYmUgYG51bGxgLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNvdXJjZS5yZWFkQ2xhc3NNYXBdLgogIHZvaWQgd3JpdGVDbGFzc01hcDxWPihNYXA8Q2xhc3NFbnRpdHksIFY+IG1hcCwgdm9pZCBmKFYgdmFsdWUpLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSk7CgogIC8vLyBXcml0ZXMgYSByZWZlcmVuY2UgdG8gdGhlIGluZGV4ZWQgdHlwZWRlZiBbdmFsdWVdIHRvIHRoaXMgZGF0YSBzaW5rLgogIHZvaWQgd3JpdGVUeXBlZGVmKEluZGV4ZWRUeXBlZGVmIHZhbHVlKTsKCiAgLy8vIFdyaXRlcyBhIHJlZmVyZW5jZSB0byB0aGUgaW5kZXhlZCBtZW1iZXIgW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4KICB2b2lkIHdyaXRlTWVtYmVyKEluZGV4ZWRNZW1iZXIgdmFsdWUpOwoKICAvLy8gV3JpdGVzIGEgcmVmZXJlbmNlIHRvIHRoZSBwb3RlbnRpYWxseSBgbnVsbGAgaW5kZXhlZCBtZW1iZXIgW3ZhbHVlXQogIC8vLyB0byB0aGlzIGRhdGEgc2luay4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTb3VyY2UucmVhZE1lbWJlck9yTnVsbF0uCiAgdm9pZCB3cml0ZU1lbWJlck9yTnVsbChJbmRleGVkTWVtYmVyIHZhbHVlKTsKCiAgLy8vIFdyaXRlcyByZWZlcmVuY2VzIHRvIHRoZSBpbmRleGVkIG1lbWJlciBbdmFsdWVzXSB0byB0aGlzIGRhdGEgc2luay4gSWYKICAvLy8gW2FsbG93TnVsbF0gaXMgYHRydWVgLCBbdmFsdWVzXSBpcyBhbGxvd2VkIHRvIGJlIGBudWxsYC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTb3VyY2UucmVhZE1lbWJlcnNdLgogIHZvaWQgd3JpdGVNZW1iZXJzKEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gdmFsdWVzLCB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSk7CgogIC8vLyBXcml0ZXMgdGhlIFttYXBdIGZyb20gcmVmZXJlbmNlcyB0byBpbmRleGVkIG1lbWJlcnMgdG8gW1ZdIHZhbHVlcyB0byB0aGlzCiAgLy8vIGRhdGEgc2luaywgY2FsbGluZyBbZl0gdG8gd3JpdGUgZWFjaCB2YWx1ZSB0byB0aGUgZGF0YSBzaW5rLiBJZgogIC8vLyBbYWxsb3dOdWxsXSBpcyBgdHJ1ZWAsIFttYXBdIGlzIGFsbG93ZWQgdG8gYmUgYG51bGxgLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNvdXJjZS5yZWFkTWVtYmVyTWFwXS4KICB2b2lkIHdyaXRlTWVtYmVyTWFwPFY+KE1hcDxNZW1iZXJFbnRpdHksIFY+IG1hcCwgdm9pZCBmKFYgdmFsdWUpLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSk7CgogIC8vLyBXcml0ZXMgYSByZWZlcmVuY2UgdG8gdGhlIGxvY2FsIFt2YWx1ZV0gdG8gdGhpcyBkYXRhIHNpbmsuCiAgdm9pZCB3cml0ZUxvY2FsKExvY2FsIGxvY2FsKTsKCiAgLy8vIFdyaXRlcyBhIHJlZmVyZW5jZSB0byB0aGUgcG90ZW50aWFsbHkgYG51bGxgIGxvY2FsIFt2YWx1ZV0KICAvLy8gdG8gdGhpcyBkYXRhIHNpbmsuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRMb2NhbE9yTnVsbF0uCiAgdm9pZCB3cml0ZUxvY2FsT3JOdWxsKExvY2FsIGxvY2FsKTsKCiAgLy8vIFdyaXRlcyByZWZlcmVuY2VzIHRvIHRoZSBsb2NhbCBbdmFsdWVzXSB0byB0aGlzIGRhdGEgc2luay4gSWYgW2FsbG93TnVsbF0KICAvLy8gaXMgYHRydWVgLCBbdmFsdWVzXSBpcyBhbGxvd2VkIHRvIGJlIGBudWxsYC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTb3VyY2UucmVhZExvY2Fsc10uCiAgdm9pZCB3cml0ZUxvY2FscyhJdGVyYWJsZTxMb2NhbD4gdmFsdWVzLCB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSk7CgogIC8vLyBXcml0ZXMgdGhlIFttYXBdIGZyb20gcmVmZXJlbmNlcyB0byBsb2NhbHMgdG8gW1ZdIHZhbHVlcyB0byB0aGlzIGRhdGEKICAvLy8gc2luaywgY2FsbGluZyBbZl0gdG8gd3JpdGUgZWFjaCB2YWx1ZSB0byB0aGUgZGF0YSBzaW5rLiBJZiBbYWxsb3dOdWxsXSBpcwogIC8vLyBgdHJ1ZWAsIFttYXBdIGlzIGFsbG93ZWQgdG8gYmUgYG51bGxgLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNvdXJjZS5yZWFkTG9jYWxNYXBdLgogIHZvaWQgd3JpdGVMb2NhbE1hcDxWPihNYXA8TG9jYWwsIFY+IG1hcCwgdm9pZCBmKFYgdmFsdWUpLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSk7CgogIC8vLyBXcml0ZXMgdGhlIGNvbnN0YW50IFt2YWx1ZV0gdG8gdGhpcyBkYXRhIHNpbmsuCiAgdm9pZCB3cml0ZUNvbnN0YW50KENvbnN0YW50VmFsdWUgdmFsdWUpOwoKICAvLy8gV3JpdGVzIHRoZSBwb3RlbnRpYWxseSBgbnVsbGAgY29uc3RhbnQgW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4KICB2b2lkIHdyaXRlQ29uc3RhbnRPck51bGwoQ29uc3RhbnRWYWx1ZSB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgY29uc3RhbnQgW3ZhbHVlc10gdG8gdGhpcyBkYXRhIHNpbmsuIElmIFthbGxvd051bGxdIGlzIGB0cnVlYCwKICAvLy8gW3ZhbHVlc10gaXMgYWxsb3dlZCB0byBiZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRDb25zdGFudHNdLgogIHZvaWQgd3JpdGVDb25zdGFudHMoSXRlcmFibGU8Q29uc3RhbnRWYWx1ZT4gdmFsdWVzLCB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSk7CgogIC8vLyBXcml0ZXMgdGhlIFttYXBdIGZyb20gY29uc3RhbnQgdmFsdWVzIHRvIFtWXSB2YWx1ZXMgdG8gdGhpcyBkYXRhIHNpbmssCiAgLy8vIGNhbGxpbmcgW2ZdIHRvIHdyaXRlIGVhY2ggdmFsdWUgdG8gdGhlIGRhdGEgc2luay4gSWYgW2FsbG93TnVsbF0gaXMKICAvLy8gYHRydWVgLCBbbWFwXSBpcyBhbGxvd2VkIHRvIGJlIGBudWxsYC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTb3VyY2UucmVhZENvbnN0YW50TWFwXS4KICB2b2lkIHdyaXRlQ29uc3RhbnRNYXA8Vj4oTWFwPENvbnN0YW50VmFsdWUsIFY+IG1hcCwgdm9pZCBmKFYgdmFsdWUpLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSk7CgogIC8vLyBXcml0ZXMgYSBkb3VibGUgdmFsdWUgdG8gdGhpcyBkYXRhIHNpbmsuCiAgdm9pZCB3cml0ZURvdWJsZVZhbHVlKGRvdWJsZSB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgYW4gaW50ZWdlciBvZiBhcmJpdHJhcnkgdmFsdWUgdG8gdGhpcyBkYXRhIHNpbmsuCiAgLy8vCiAgLy8vIFRoaXMgaXMgc2hvdWxkIG9ubHkgd2hlbiB0aGUgdmFsdWUgaXMgbm90IGtub3duIHRvIGJlIGEgbm9uLW5lZ2F0aXZlCiAgLy8vIDMwIGJpdCBpbnRlZ2VyLiBPdGhlcndpc2UgW3dyaXRlSW50XSBzaG91bGQgYmUgdXNlZC4KICB2b2lkIHdyaXRlSW50ZWdlclZhbHVlKGludCB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgdGhlIGltcG9ydCBbdmFsdWVdIHRvIHRoaXMgZGF0YSBzaW5rLgogIHZvaWQgd3JpdGVJbXBvcnQoSW1wb3J0RW50aXR5IHZhbHVlKTsKCiAgLy8vIFdyaXRlcyBpbXBvcnQgW3ZhbHVlc10gdG8gdGhpcyBkYXRhIHNpbmsuIElmIFthbGxvd051bGxdIGlzIGB0cnVlYCwKICAvLy8gW3ZhbHVlc10gaXMgYWxsb3dlZCB0byBiZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRJbXBvcnRzXS4KICB2b2lkIHdyaXRlSW1wb3J0cyhJdGVyYWJsZTxJbXBvcnRFbnRpdHk+IHZhbHVlcywge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pOwoKICAvLy8gV3JpdGVzIHRoZSBbbWFwXSBmcm9tIGltcG9ydHMgdG8gW1ZdIHZhbHVlcyB0byB0aGlzIGRhdGEgc2luaywKICAvLy8gY2FsbGluZyBbZl0gdG8gd3JpdGUgZWFjaCB2YWx1ZSB0byB0aGUgZGF0YSBzaW5rLiBJZiBbYWxsb3dOdWxsXSBpcwogIC8vLyBgdHJ1ZWAsIFttYXBdIGlzIGFsbG93ZWQgdG8gYmUgYG51bGxgLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNvdXJjZS5yZWFkSW1wb3J0TWFwXS4KICB2b2lkIHdyaXRlSW1wb3J0TWFwPFY+KE1hcDxJbXBvcnRFbnRpdHksIFY+IG1hcCwgdm9pZCBmKFYgdmFsdWUpLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSk7Cn0KCi8vLyBJbnRlcmZhY2UgZm9yIGRlc2VyaWFsaXphdGlvbi4KYWJzdHJhY3QgY2xhc3MgRGF0YVNvdXJjZSB7CiAgLy8vIFJlZ2lzdGVycyB0aGF0IHRoZSBzZWN0aW9uIFt0YWddIHN0YXJ0cy4KICAvLy8KICAvLy8gVGhpcyBpcyB1c2VkIGZvciBkZWJ1Z2dpbmcgdG8gdmVyaWZ5IHRoYXQgc2VjdGlvbnMgYXJlIGNvcnJlY3RseSBhbGlnbmVkCiAgLy8vIGJldHdlZW4gc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgogIHZvaWQgYmVnaW4oU3RyaW5nIHRhZyk7CgogIC8vLyBSZWdpc3RlcnMgdGhhdCB0aGUgc2VjdGlvbiBbdGFnXSBlbmRzLgogIC8vLwogIC8vLyBUaGlzIGlzIHVzZWQgZm9yIGRlYnVnZ2luZyB0byB2ZXJpZnkgdGhhdCBzZWN0aW9ucyBhcmUgY29ycmVjdGx5IGFsaWduZWQKICAvLy8gYmV0d2VlbiBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24uCiAgdm9pZCBlbmQoU3RyaW5nIHRhZyk7CgogIC8vLyBSZWdpc3RlcnMgYSBbQ29tcG9uZW50TG9va3VwXSBvYmplY3Qgd2l0aCB0aGlzIGRhdGEgc291cmNlIHRvIHN1cHBvcnQKICAvLy8gZGVzZXJpYWxpemF0aW9uIG9mIHJlZmVyZW5jZXMgdG8ga2VybmVsIG5vZGVzLgogIHZvaWQgcmVnaXN0ZXJDb21wb25lbnRMb29rdXAoQ29tcG9uZW50TG9va3VwIGNvbXBvbmVudExvb2t1cCk7CgogIC8vLyBSZWdpc3RlcnMgYW4gW0VudGl0eUxvb2t1cF0gb2JqZWN0IHdpdGggdGhpcyBkYXRhIHNvdXJjZSB0byBzdXBwb3J0CiAgLy8vIGRlc2VyaWFsaXphdGlvbiBvZiByZWZlcmVuY2VzIHRvIGluZGV4ZWQgZW50aXRpZXMuCiAgdm9pZCByZWdpc3RlckVudGl0eUxvb2t1cChFbnRpdHlMb29rdXAgZW50aXR5TG9va3VwKTsKCiAgLy8vIFJlZ2lzdGVycyBhIFtMb2NhbExvb2t1cF0gb2JqZWN0IHdpdGggdGhpcyBkYXRhIHNvdXJjZSB0byBzdXBwb3J0CiAgLy8vIGRlc2VyaWFsaXphdGlvbiBvZiByZWZlcmVuY2VzIHRvIGxvY2Fscy4KICB2b2lkIHJlZ2lzdGVyTG9jYWxMb29rdXAoTG9jYWxMb29rdXAgbG9jYWxMb29rdXApOwoKICAvLy8gUmVhZHMgYSByZWZlcmVuY2UgdG8gYW4gW0VdIHZhbHVlIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4gSWYgdGhlIHZhbHVlIGhhcwogIC8vLyBub3QgeWV0IGJlZW4gZGVzZXJpYWxpemVkLCBbZl0gaXMgY2FsbGVkIHRvIGRlc2VyaWFsaXplIHRoZSB2YWx1ZSBpdHNlbGYuCiAgRSByZWFkQ2FjaGVkPEU+KEUgZigpKTsKCiAgLy8vIFJlYWRzIGEgcG90ZW50aWFsbHkgYG51bGxgIFtFXSB2YWx1ZSBmcm9tIHRoaXMgZGF0YSBzb3VyY2UsIGNhbGxpbmcgW2ZdIHRvCiAgLy8vIHJlYWQgdGhlIG5vbi1udWxsIHZhbHVlIGZyb20gdGhlIGRhdGEgc291cmNlLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNpbmsud3JpdGVWYWx1ZU9yTnVsbF0uCiAgRSByZWFkVmFsdWVPck51bGw8RT4oRSBmKCkpOwoKICAvLy8gUmVhZHMgYSBsaXN0IG9mIFtFXSB2YWx1ZXMgZnJvbSB0aGlzIGRhdGEgc291cmNlLiBJZiBbZW1wdHlBc051bGxdIGlzCiAgLy8vIGB0cnVlYCwgYG51bGxgIGlzIHJldHVybmVkIGluc3RlYWQgb2YgYW4gZW1wdHkgbGlzdC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTaW5rLndyaXRlTGlzdF0uCiAgTGlzdDxFPiByZWFkTGlzdDxFPihFIGYoKSwge2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSk7CgogIC8vLyBSZWFkcyBhIGJvb2xlYW4gdmFsdWUgZnJvbSB0aGlzIGRhdGEgc291cmNlLgogIGJvb2wgcmVhZEJvb2woKTsKCiAgLy8vIFJlYWRzIGEgbm9uLW5lZ2F0aXZlIDMwIGJpdCBpbnRlZ2VyIHZhbHVlIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICBpbnQgcmVhZEludCgpOwoKICAvLy8gUmVhZHMgYSBwb3RlbnRpYWxseSBgbnVsbGAgbm9uLW5lZ2F0aXZlIGludGVnZXIgdmFsdWUgZnJvbSB0aGlzIGRhdGEKICAvLy8gc291cmNlLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNpbmsud3JpdGVJbnRPck51bGxdLgogIGludCByZWFkSW50T3JOdWxsKCk7CgogIC8vLyBSZWFkcyBhIHN0cmluZyB2YWx1ZSBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgU3RyaW5nIHJlYWRTdHJpbmcoKTsKCiAgLy8vIFJlYWRzIGEgcG90ZW50aWFsbHkgYG51bGxgIHN0cmluZyB2YWx1ZSBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU2luay53cml0ZVN0cmluZ09yTnVsbF0uCiAgU3RyaW5nIHJlYWRTdHJpbmdPck51bGwoKTsKCiAgLy8vIFJlYWRzIGEgbGlzdCBvZiBzdHJpbmcgdmFsdWVzIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4gSWYgW2VtcHR5QXNOdWxsXSBpcwogIC8vLyBgdHJ1ZWAsIGBudWxsYCBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFuIGVtcHR5IGxpc3QuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU2luay53cml0ZVN0cmluZ3NdLgogIExpc3Q8U3RyaW5nPiByZWFkU3RyaW5ncyh7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KTsKCiAgLy8vIFJlYWRzIGEgbWFwIGZyb20gc3RyaW5nIHZhbHVlcyB0byBbVl0gdmFsdWVzIGZyb20gdGhpcyBkYXRhIHNvdXJjZSwKICAvLy8gY2FsbGluZyBbZl0gdG8gcmVhZCBlYWNoIHZhbHVlIGZyb20gdGhlIGRhdGEgc291cmNlLiBJZiBbZW1wdHlBc051bGxdIGlzCiAgLy8vIGB0cnVlYCwgYG51bGxgIGlzIHJldHVybmVkIGluc3RlYWQgb2YgYW4gZW1wdHkgbWFwLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNpbmsud3JpdGVTdHJpbmdNYXBdLgogIE1hcDxTdHJpbmcsIFY+IHJlYWRTdHJpbmdNYXA8Vj4oViBmKCksIHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pOwoKICAvLy8gUmVhZHMgYW4gZW51bSB2YWx1ZSBmcm9tIHRoZSBsaXN0IG9mIGVudW0gW3ZhbHVlc10gZnJvbSB0aGlzIGRhdGEgc291cmNlLgogIC8vLwogIC8vLyBUaGUgW3ZhbHVlc10gYXJndW1lbnQgaXMgaW50ZW5kZWQgdG8gYmUgdGhlIHN0YXRpYyBgLnZhbHVlc2AgZmllbGQgb24KICAvLy8gZW51bSBjbGFzc2VzLCBmb3IgaW5zdGFuY2U6CiAgLy8vCiAgLy8vICAgIGVudW0gRm9vIHsgYmFyLCBiYXogfQogIC8vLyAgICAuLi4KICAvLy8gICAgRm9vIGZvbyA9IHNvdXJjZS5yZWFkRW51bShGb28udmFsdWVzKTsKICAvLy8KICBFIHJlYWRFbnVtPEU+KExpc3Q8RT4gdmFsdWVzKTsKCiAgLy8vIFJlYWRzIGEgVVJJIHZhbHVlIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICBVcmkgcmVhZFVyaSgpOwoKICAvLy8gUmVhZHMgYSByZWZlcmVuY2UgdG8gYSBrZXJuZWwgbGlicmFyeSBub2RlIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICBpci5MaWJyYXJ5IHJlYWRMaWJyYXJ5Tm9kZSgpOwoKICAvLy8gUmVhZHMgYSByZWZlcmVuY2UgdG8gYSBrZXJuZWwgY2xhc3Mgbm9kZSBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgaXIuQ2xhc3MgcmVhZENsYXNzTm9kZSgpOwoKICAvLy8gUmVhZHMgYSByZWZlcmVuY2UgdG8gYSBrZXJuZWwgY2xhc3Mgbm9kZSBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgaXIuVHlwZWRlZiByZWFkVHlwZWRlZk5vZGUoKTsKCiAgLy8vIFJlYWRzIGEgcmVmZXJlbmNlIHRvIGEga2VybmVsIG1lbWJlciBub2RlIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICBpci5NZW1iZXIgcmVhZE1lbWJlck5vZGUoKTsKCiAgLy8vIFJlYWRzIGEgbGlzdCBvZiByZWZlcmVuY2VzIHRvIGtlcm5lbCBtZW1iZXIgbm9kZXMgZnJvbSB0aGlzIGRhdGEgc291cmNlLgogIC8vLyBJZiBbZW1wdHlBc051bGxdIGlzIGB0cnVlYCwgYG51bGxgIGlzIHJldHVybmVkIGluc3RlYWQgb2YgYW4gZW1wdHkgbGlzdC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTaW5rLndyaXRlTWVtYmVyTm9kZXNdLgogIExpc3Q8aXIuTWVtYmVyPiByZWFkTWVtYmVyTm9kZXM8RSBleHRlbmRzIGlyLk1lbWJlcj4oCiAgICAgIHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pOwoKICAvLy8gUmVhZHMgYSBtYXAgZnJvbSBrZXJuZWwgbWVtYmVyIG5vZGVzIHRvIFtWXSB2YWx1ZXMgZnJvbSB0aGlzIGRhdGEgc291cmNlLAogIC8vLyBjYWxsaW5nIFtmXSB0byByZWFkIGVhY2ggdmFsdWUgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIElmIFtlbXB0eUFzTnVsbF0gaXMKICAvLy8gYHRydWVgLCBgbnVsbGAgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBlbXB0eSBtYXAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU2luay53cml0ZU1lbWJlck5vZGVNYXBdLgogIE1hcDxLLCBWPiByZWFkTWVtYmVyTm9kZU1hcDxLIGV4dGVuZHMgaXIuTWVtYmVyLCBWPihWIGYoKSwKICAgICAge2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSk7CgogIC8vLyBSZWFkcyBhIGtlcm5lbCBuYW1lIG5vZGUgZnJvbSB0aGlzIGRhdGEgc291cmNlLgogIGlyLk5hbWUgcmVhZE5hbWUoKTsKCiAgLy8vIFJlYWRzIGEga2VybmVsIGxpYnJhcnkgZGVwZW5kZW5jeSBub2RlIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICBpci5MaWJyYXJ5RGVwZW5kZW5jeSByZWFkTGlicmFyeURlcGVuZGVuY3lOb2RlKCk7CgogIC8vLyBSZWFkcyBhIHBvdGVudGlhbGx5IGBudWxsYCBrZXJuZWwgbGlicmFyeSBkZXBlbmRlbmN5IG5vZGUgZnJvbSB0aGlzIGRhdGEKICAvLy8gc291cmNlLgogIGlyLkxpYnJhcnlEZXBlbmRlbmN5IHJlYWRMaWJyYXJ5RGVwZW5kZW5jeU5vZGVPck51bGwoKTsKCiAgLy8vIFJlYWRzIGEgcmVmZXJlbmNlIHRvIGEga2VybmVsIHRyZWUgbm9kZSBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgaXIuVHJlZU5vZGUgcmVhZFRyZWVOb2RlKCk7CgogIC8vLyBSZWFkcyBhIHJlZmVyZW5jZSB0byBhIHBvdGVudGlhbGx5IGBudWxsYCBrZXJuZWwgdHJlZSBub2RlIGZyb20gdGhpcyBkYXRhCiAgLy8vIHNvdXJjZS4KICBpci5UcmVlTm9kZSByZWFkVHJlZU5vZGVPck51bGwoKTsKCiAgLy8vIFJlYWRzIGEgbGlzdCBvZiByZWZlcmVuY2VzIHRvIGtlcm5lbCB0cmVlIG5vZGVzIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICAvLy8gSWYgW2VtcHR5QXNOdWxsXSBpcyBgdHJ1ZWAsIGBudWxsYCBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFuIGVtcHR5IGxpc3QuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU2luay53cml0ZVRyZWVOb2Rlc10uCiAgTGlzdDxFPiByZWFkVHJlZU5vZGVzPEUgZXh0ZW5kcyBpci5UcmVlTm9kZT4oe2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSk7CgogIC8vLyBSZWFkcyBhIG1hcCBmcm9tIGtlcm5lbCB0cmVlIG5vZGVzIHRvIFtWXSB2YWx1ZXMgZnJvbSB0aGlzIGRhdGEgc291cmNlLAogIC8vLyBjYWxsaW5nIFtmXSB0byByZWFkIGVhY2ggdmFsdWUgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIElmIFtlbXB0eUFzTnVsbF0gaXMKICAvLy8gYHRydWVgLCBgbnVsbGAgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBlbXB0eSBtYXAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU2luay53cml0ZVRyZWVOb2RlTWFwXS4KICBNYXA8SywgVj4gcmVhZFRyZWVOb2RlTWFwPEsgZXh0ZW5kcyBpci5UcmVlTm9kZSwgVj4oViBmKCksCiAgICAgIHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pOwoKICAvLy8gUmVhZHMgYSByZWZlcmVuY2UgdG8gYSBrZXJuZWwgdHlwZSBwYXJhbWV0ZXIgbm9kZSBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgaXIuVHlwZVBhcmFtZXRlciByZWFkVHlwZVBhcmFtZXRlck5vZGUoKTsKCiAgLy8vIFJlYWRzIGEgbGlzdCBvZiByZWZlcmVuY2VzIHRvIGtlcm5lbCB0eXBlIHBhcmFtZXRlciBub2RlcyBmcm9tIHRoaXMgZGF0YQogIC8vLyBzb3VyY2UuIElmIFtlbXB0eUFzTnVsbF0gaXMgYHRydWVgLCBgbnVsbGAgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBlbXB0eQogIC8vLyBsaXN0LgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNpbmsud3JpdGVUeXBlUGFyYW1ldGVyTm9kZXNdLgogIExpc3Q8aXIuVHlwZVBhcmFtZXRlcj4gcmVhZFR5cGVQYXJhbWV0ZXJOb2Rlcyh7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KTsKCiAgLy8vIFJlYWRzIGEgdHlwZSBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuIElmIFthbGxvd051bGxdLCB0aGUgcmV0dXJuZWQgdHlwZSBpcwogIC8vLyBhbGxvd2VkIHRvIGJlIGBudWxsYC4KICBEYXJ0VHlwZSByZWFkRGFydFR5cGUoe2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pOwoKICAvLy8gUmVhZHMgYSBsaXN0IG9mIHR5cGVzIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4gSWYgW2VtcHR5QXNOdWxsXSBpcyBgdHJ1ZWAsCiAgLy8vIGBudWxsYCBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFuIGVtcHR5IGxpc3QuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU2luay53cml0ZURhcnRUeXBlc10uCiAgTGlzdDxEYXJ0VHlwZT4gcmVhZERhcnRUeXBlcyh7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KTsKCiAgLy8vIFJlYWRzIGEga2VybmVsIHR5cGUgbm9kZSBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuIElmIFthbGxvd051bGxdLCB0aGUKICAvLy8gcmV0dXJuZWQgdHlwZSBpcyBhbGxvd2VkIHRvIGJlIGBudWxsYC4KICBpci5EYXJ0VHlwZSByZWFkRGFydFR5cGVOb2RlKHtib29sIGFsbG93TnVsbDogZmFsc2V9KTsKCiAgLy8vIFJlYWRzIGEgbGlzdCBvZiBrZXJuZWwgdHlwZSBub2RlcyBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuIElmIFtlbXB0eUFzTnVsbF0KICAvLy8gaXMgYHRydWVgLCBgbnVsbGAgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBlbXB0eSBsaXN0LgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNpbmsud3JpdGVEYXJ0VHlwZU5vZGVzXS4KICBMaXN0PGlyLkRhcnRUeXBlPiByZWFkRGFydFR5cGVOb2Rlcyh7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KTsKCiAgLy8vIFJlYWRzIGEgc291cmNlIHNwYW4gZnJvbSB0aGlzIGRhdGEgc291cmNlLgogIFNvdXJjZVNwYW4gcmVhZFNvdXJjZVNwYW4oKTsKCiAgLy8vIFJlYWRzIGEgcmVmZXJlbmNlIHRvIGFuIGluZGV4ZWQgbGlicmFyeSBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgSW5kZXhlZExpYnJhcnkgcmVhZExpYnJhcnkoKTsKCiAgLy8vIFJlYWRzIGEgcmVmZXJlbmNlIHRvIGEgcG90ZW50aWFsbHkgYG51bGxgIGluZGV4ZWQgbGlicmFyeSBmcm9tIHRoaXMgZGF0YQogIC8vLyBzb3VyY2UuCiAgSW5kZXhlZExpYnJhcnkgcmVhZExpYnJhcnlPck51bGwoKTsKICBNYXA8SywgVj4gcmVhZExpYnJhcnlNYXA8SyBleHRlbmRzIExpYnJhcnlFbnRpdHksIFY+KFYgZigpLAogICAgICB7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KTsKCiAgLy8vIFJlYWRzIGEgcmVmZXJlbmNlIHRvIGFuIGluZGV4ZWQgY2xhc3MgZnJvbSB0aGlzIGRhdGEgc291cmNlLgogIEluZGV4ZWRDbGFzcyByZWFkQ2xhc3MoKTsKCiAgLy8vIFJlYWRzIGEgcmVmZXJlbmNlIHRvIGEgcG90ZW50aWFsbHkgYG51bGxgIGluZGV4ZWQgY2xhc3MgZnJvbSB0aGlzIGRhdGEKICAvLy8gc291cmNlLgogIEluZGV4ZWRDbGFzcyByZWFkQ2xhc3NPck51bGwoKTsKCiAgLy8vIFJlYWRzIGEgbGlzdCBvZiByZWZlcmVuY2VzIHRvIGluZGV4ZWQgY2xhc3NlcyBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgLy8vIElmIFtlbXB0eUFzTnVsbF0gaXMgYHRydWVgLCBgbnVsbGAgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBlbXB0eSBsaXN0LgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNpbmsud3JpdGVDbGFzc2VzXS4KICBMaXN0PEU+IHJlYWRDbGFzc2VzPEUgZXh0ZW5kcyBDbGFzc0VudGl0eT4oe2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSk7CgogIC8vLyBSZWFkcyBhIG1hcCBmcm9tIGluZGV4ZWQgY2xhc3NlcyB0byBbVl0gdmFsdWVzIGZyb20gdGhpcyBkYXRhIHNvdXJjZSwKICAvLy8gY2FsbGluZyBbZl0gdG8gcmVhZCBlYWNoIHZhbHVlIGZyb20gdGhlIGRhdGEgc291cmNlLiBJZiBbZW1wdHlBc051bGxdIGlzCiAgLy8vIGB0cnVlYCwgYG51bGxgIGlzIHJldHVybmVkIGluc3RlYWQgb2YgYW4gZW1wdHkgbWFwLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNpbmsud3JpdGVDbGFzc01hcF0uCiAgTWFwPEssIFY+IHJlYWRDbGFzc01hcDxLIGV4dGVuZHMgQ2xhc3NFbnRpdHksIFY+KFYgZigpLAogICAgICB7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KTsKCiAgLy8vIFJlYWRzIGEgcmVmZXJlbmNlIHRvIGFuIGluZGV4ZWQgdHlwZWRlZiBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgSW5kZXhlZFR5cGVkZWYgcmVhZFR5cGVkZWYoKTsKCiAgLy8vIFJlYWRzIGEgcmVmZXJlbmNlIHRvIGFuIGluZGV4ZWQgbWVtYmVyIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICBJbmRleGVkTWVtYmVyIHJlYWRNZW1iZXIoKTsKCiAgLy8vIFJlYWRzIGEgcmVmZXJlbmNlIHRvIGEgcG90ZW50aWFsbHkgYG51bGxgIGluZGV4ZWQgbWVtYmVyIGZyb20gdGhpcyBkYXRhCiAgLy8vIHNvdXJjZS4KICBJbmRleGVkTWVtYmVyIHJlYWRNZW1iZXJPck51bGwoKTsKCiAgLy8vIFJlYWRzIGEgbGlzdCBvZiByZWZlcmVuY2VzIHRvIGluZGV4ZWQgbWVtYmVycyBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgLy8vIElmIFtlbXB0eUFzTnVsbF0gaXMgYHRydWVgLCBgbnVsbGAgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBlbXB0eSBsaXN0LgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNpbmsud3JpdGVNZW1iZXJzXS4KICBMaXN0PEU+IHJlYWRNZW1iZXJzPEUgZXh0ZW5kcyBNZW1iZXJFbnRpdHk+KHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pOwoKICAvLy8gUmVhZHMgYSBtYXAgZnJvbSBpbmRleGVkIG1lbWJlcnMgdG8gW1ZdIHZhbHVlcyBmcm9tIHRoaXMgZGF0YSBzb3VyY2UsCiAgLy8vIGNhbGxpbmcgW2ZdIHRvIHJlYWQgZWFjaCB2YWx1ZSBmcm9tIHRoZSBkYXRhIHNvdXJjZS4gSWYgW2VtcHR5QXNOdWxsXSBpcwogIC8vLyBgdHJ1ZWAsIGBudWxsYCBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFuIGVtcHR5IG1hcC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTaW5rLndyaXRlTWVtYmVyTWFwXS4KICBNYXA8SywgVj4gcmVhZE1lbWJlck1hcDxLIGV4dGVuZHMgTWVtYmVyRW50aXR5LCBWPihWIGYoKSwKICAgICAge2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSk7CgogIC8vLyBSZWFkcyBhIHJlZmVyZW5jZSB0byBhIGxvY2FsIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICBMb2NhbCByZWFkTG9jYWwoKTsKCiAgLy8vIFJlYWRzIGEgcmVmZXJlbmNlIHRvIGEgcG90ZW50aWFsbHkgYG51bGxgIGxvY2FsIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICBMb2NhbCByZWFkTG9jYWxPck51bGwoKTsKCiAgLy8vIFJlYWRzIGEgbGlzdCBvZiByZWZlcmVuY2VzIHRvIGxvY2FscyBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuIElmCiAgLy8vIFtlbXB0eUFzTnVsbF0gaXMgYHRydWVgLCBgbnVsbGAgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBlbXB0eSBsaXN0LgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNpbmsud3JpdGVMb2NhbHNdLgogIExpc3Q8RT4gcmVhZExvY2FsczxFIGV4dGVuZHMgTG9jYWw+KHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pOwoKICAvLy8gUmVhZHMgYSBtYXAgZnJvbSBsb2NhbHMgdG8gW1ZdIHZhbHVlcyBmcm9tIHRoaXMgZGF0YSBzb3VyY2UsIGNhbGxpbmcgW2ZdCiAgLy8vIHRvIHJlYWQgZWFjaCB2YWx1ZSBmcm9tIHRoZSBkYXRhIHNvdXJjZS4gSWYgW2VtcHR5QXNOdWxsXSBpcyBgdHJ1ZWAsCiAgLy8vIGBudWxsYCBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFuIGVtcHR5IG1hcC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTaW5rLndyaXRlTG9jYWxNYXBdLgogIE1hcDxLLCBWPiByZWFkTG9jYWxNYXA8SyBleHRlbmRzIExvY2FsLCBWPihWIGYoKSwge2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSk7CgogIC8vLyBSZWFkcyBhIGNvbnN0YW50IHZhbHVlIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICBDb25zdGFudFZhbHVlIHJlYWRDb25zdGFudCgpOwoKICAvLy8gUmVhZHMgYSBwb3RlbnRpYWxseSBgbnVsbGAgY29uc3RhbnQgdmFsdWUgZnJvbSB0aGlzIGRhdGEgc291cmNlLgogIENvbnN0YW50VmFsdWUgcmVhZENvbnN0YW50T3JOdWxsKCk7CgogIC8vLyBSZWFkcyBhIGRvdWJsZSB2YWx1ZSBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgZG91YmxlIHJlYWREb3VibGVWYWx1ZSgpOwoKICAvLy8gUmVhZHMgYW4gaW50ZWdlciBvZiBhcmJpdHJhcnkgdmFsdWUgZnJvbSB0aGlzIGRhdGEgc291cmNlLgogIC8vLwogIC8vLyBUaGlzIGlzIHNob3VsZCBvbmx5IHdoZW4gdGhlIHZhbHVlIGlzIG5vdCBrbm93biB0byBiZSBhIG5vbi1uZWdhdGl2ZQogIC8vLyAzMCBiaXQgaW50ZWdlci4gT3RoZXJ3aXNlIFtyZWFkSW50XSBzaG91bGQgYmUgdXNlZC4KICBpbnQgcmVhZEludGVnZXJWYWx1ZSgpOwoKICAvLy8gUmVhZHMgYSBsaXN0IG9mIGNvbnN0YW50IHZhbHVlcyBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuIElmIFtlbXB0eUFzTnVsbF0gaXMKICAvLy8gYHRydWVgLCBgbnVsbGAgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBlbXB0eSBsaXN0LgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNpbmsud3JpdGVDb25zdGFudHNdLgogIExpc3Q8RT4gcmVhZENvbnN0YW50czxFIGV4dGVuZHMgQ29uc3RhbnRWYWx1ZT4oe2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSk7CgogIC8vLyBSZWFkcyBhIG1hcCBmcm9tIGNvbnN0YW50IHZhbHVlcyB0byBbVl0gdmFsdWVzIGZyb20gdGhpcyBkYXRhIHNvdXJjZSwKICAvLy8gY2FsbGluZyBbZl0gdG8gcmVhZCBlYWNoIHZhbHVlIGZyb20gdGhlIGRhdGEgc291cmNlLiBJZiBbZW1wdHlBc051bGxdIGlzCiAgLy8vIGB0cnVlYCwgYG51bGxgIGlzIHJldHVybmVkIGluc3RlYWQgb2YgYW4gZW1wdHkgbWFwLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNpbmsud3JpdGVDb25zdGFudE1hcF0uCiAgTWFwPEssIFY+IHJlYWRDb25zdGFudE1hcDxLIGV4dGVuZHMgQ29uc3RhbnRWYWx1ZSwgVj4oViBmKCksCiAgICAgIHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pOwoKICAvLy8gUmVhZHMgYSBpbXBvcnQgZnJvbSB0aGlzIGRhdGEgc291cmNlLgogIEltcG9ydEVudGl0eSByZWFkSW1wb3J0KCk7CgogIC8vLyBSZWFkcyBhIGxpc3Qgb2YgaW1wb3J0cyBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuIElmIFtlbXB0eUFzTnVsbF0gaXMKICAvLy8gYHRydWVgLCBgbnVsbGAgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBlbXB0eSBsaXN0LgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNpbmsud3JpdGVJbXBvcnRzXS4KICBMaXN0PEltcG9ydEVudGl0eT4gcmVhZEltcG9ydHMoe2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSk7CgogIC8vLyBSZWFkcyBhIG1hcCBmcm9tIGltcG9ydHMgdG8gW1ZdIHZhbHVlcyBmcm9tIHRoaXMgZGF0YSBzb3VyY2UsCiAgLy8vIGNhbGxpbmcgW2ZdIHRvIHJlYWQgZWFjaCB2YWx1ZSBmcm9tIHRoZSBkYXRhIHNvdXJjZS4gSWYgW2VtcHR5QXNOdWxsXSBpcwogIC8vLyBgdHJ1ZWAsIGBudWxsYCBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFuIGVtcHR5IG1hcC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTaW5rLndyaXRlSW1wb3J0TWFwXS4KICBNYXA8SW1wb3J0RW50aXR5LCBWPiByZWFkSW1wb3J0TWFwPFY+KFYgZigpLCB7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KTsKfQoKLy8vIEludGVyZmFjZSB1c2VkIGZvciBsb29raW5nIHVwIGVudGl0aWVzIGJ5IGluZGV4IGR1cmluZyBkZXNlcmlhbGl6YXRpb24uCmFic3RyYWN0IGNsYXNzIEVudGl0eUxvb2t1cCB7CiAgLy8vIFJldHVybnMgdGhlIGluZGV4ZWQgbGlicmFyeSBjb3JyZXNwb25kaW5nIHRvIFtpbmRleF0uCiAgSW5kZXhlZExpYnJhcnkgZ2V0TGlicmFyeUJ5SW5kZXgoaW50IGluZGV4KTsKCiAgLy8vIFJldHVybnMgdGhlIGluZGV4ZWQgY2xhc3MgY29ycmVzcG9uZGluZyB0byBbaW5kZXhdLgogIEluZGV4ZWRDbGFzcyBnZXRDbGFzc0J5SW5kZXgoaW50IGluZGV4KTsKCiAgLy8vIFJldHVybnMgdGhlIGluZGV4ZWQgdHlwZWRlZiBjb3JyZXNwb25kaW5nIHRvIFtpbmRleF0uCiAgSW5kZXhlZFR5cGVkZWYgZ2V0VHlwZWRlZkJ5SW5kZXgoaW50IGluZGV4KTsKCiAgLy8vIFJldHVybnMgdGhlIGluZGV4ZWQgbWVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gW2luZGV4XS4KICBJbmRleGVkTWVtYmVyIGdldE1lbWJlckJ5SW5kZXgoaW50IGluZGV4KTsKCiAgLy8vIFJldHVybnMgdGhlIGluZGV4ZWQgdHlwZSB2YXJpYWJsZSBjb3JyZXNwb25kaW5nIHRvIFtpbmRleF0uCiAgSW5kZXhlZFR5cGVWYXJpYWJsZSBnZXRUeXBlVmFyaWFibGVCeUluZGV4KGludCBpbmRleCk7Cn0KCi8vLyBJbnRlcmZhY2UgdXNlZCBmb3IgbG9va2luZyB1cCBsb2NhbHMgYnkgaW5kZXggZHVyaW5nIGRlc2VyaWFsaXphdGlvbi4KYWJzdHJhY3QgY2xhc3MgTG9jYWxMb29rdXAgewogIExvY2FsIGdldExvY2FsQnlJbmRleChNZW1iZXJFbnRpdHkgbWVtYmVyQ29udGV4dCwgaW50IGluZGV4KTsKfQqC0gBOTjwBFxooMzs5Gj8jKiQjIR8mIyIBGx0ZGxUZFBoZGwEhGjQGThIBOgY/EAEvBk8xGgEtBk8xGAFORDEBTUsGPCQ2AU9RBjwdOSABNB4BSBwBTAY8IiIBMyIBRgY8JSgBTigGPCBHAVBPHAY8Ij4gATcyTx8hATAcAU8rAU0nAU8rAU4pAU5CBjwkTgFPSzwGPCZFIAEzIQFJPwFMFkUBTCkBTBkGPCcvAUxCBjwiTgFNSzwGPCRFIAFQDDcBUAxCBjwrQiABSyc/AUwoBjwiSwFPL0YBUDAGPCY4IAE4KgFLKwFLGQY8JjEBTUs8BjwjRiABSScBSRkGPCQtAUw/BjwgTAFQRjwGPCFCIAFLKwFKKQFKGQY8JS8BTT8GPCBNAVBGPAY8IkQgAUEgAUEZBjwkJgFQMwY8H0UBTFAtBjwhPCABNSsBSDEBTCgGPCJQAU1KLQY8JEcgAS8nAT4GSzslATMoAUooBjwgTQFFSi0GPCJEIAIBIxwvBk8xGgEtBk8xGAFMNUEBSjk4AUgvNQFQUBoBUTQGPCMfAUw7BjwcOQEzEwFHEQFLDgY8IRcBMhcBRQY8JB0BTzsGPB83AUpPOgY8IUUBUAZMIgYfDTAGIQEvEQFIIAFGHAFGIAFHHgFPTwY8IzgiAVBPOgY8JT0iATYWAUQ0AU8OOgFFHgFQDiQBTU8GPCFLAU5POgY8Iz0iAU8sAU9RDAY8KkwBTxwyAU8zBjwhOwFKLTkBUD4GPCVCATEfAUUgAU8OJj4iAUMcAU0OIgFLTwY8H0kBTE86BjwgOiIBRSABRB4BTg4kAUtPBjwfSgFMTzoGPCE8IgE6FQFNGwFFTAY8HkIBT0syBjwgUAE0IAFHJgEyHAFBBks6GgFROwY8IU0BTE86BjwjPyIBLB0BSTsGPB89AURPOgY8IUsCAUwePC8BOisBPC8BOy0BQjkCAUodQAIBNXBhY2thZ2U6Y29tcGlsZXIvc3JjL3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0PnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3NlcmlhbGl6YXRpb24vYWJzdHJhY3Rfc2luay5kYXJ0uisvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiAnc2VyaWFsaXphdGlvbi5kYXJ0JzsKCi8vLyBCYXNlIGltcGxlbWVudGF0aW9uIG9mIFtEYXRhU2lua10gdXNpbmcgW0RhdGFTaW5rTWl4aW5dIHRvIGltcGxlbWVudAovLy8gY29udmVuaWVuY2UgbWV0aG9kcy4KYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REYXRhU2luayBleHRlbmRzIERhdGFTaW5rTWl4aW4gaW1wbGVtZW50cyBEYXRhU2luayB7CiAgLy8vIElmIGB0cnVlYCwgc2VyaWFsaXphdGlvbiBvZiBldmVyeSBkYXRhIGtpbmQgaXMgcHJlY2VkZWQgYnkgYSBbRGF0YUtpbmRdCiAgLy8vIHZhbHVlLgogIC8vLwogIC8vLyBUaGlzIGlzIHVzZWQgZm9yIGRlYnVnZ2luZyBkYXRhIGluY29uc2lzdGVuY2llcyBiZXR3ZWVuIHNlcmlhbGl6YXRpb24KICAvLy8gYW5kIGRlc2VyaWFsaXphdGlvbi4KICBmaW5hbCBib29sIHVzZURhdGFLaW5kczsKCiAgLy8vIFZpc2l0b3IgdXNlZCBmb3Igc2VyaWFsaXppbmcgW0RhcnRUeXBlXXMuCiAgRGFydFR5cGVXcml0ZXIgX2RhcnRUeXBlV3JpdGVyOwoKICAvLy8gVmlzaXRvciB1c2VkIGZvciBzZXJpYWxpemluZyBbaXIuRGFydFR5cGVdcy4KICBEYXJ0VHlwZU5vZGVXcml0ZXIgX2RhcnRUeXBlTm9kZVdyaXRlcjsKCiAgLy8vIFN0YWNrIG9mIHRhZ3MgdXNlZCB3aGVuIFt1c2VEYXRhS2luZHNdIGlzIGB0cnVlYCB0byBoZWxwIGRlYnVnZ2luZyBzZWN0aW9uCiAgLy8vIGluY29uc2lzdGVuY2llcyBiZXR3ZWVuIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbi4KICBMaXN0PFN0cmluZz4gX3RhZ3M7CgogIC8vLyBNYXAgb2YgW19NZW1iZXJEYXRhXSBvYmplY3QgZm9yIHNlcmlhbGl6ZWQga2VybmVsIG1lbWJlciBub2Rlcy4KICBNYXA8aXIuTWVtYmVyLCBfTWVtYmVyRGF0YT4gX21lbWJlckRhdGEgPSB7fTsKCiAgSW5kZXhlZFNpbms8U3RyaW5nPiBfc3RyaW5nSW5kZXg7CiAgSW5kZXhlZFNpbms8VXJpPiBfdXJpSW5kZXg7CiAgSW5kZXhlZFNpbms8aXIuTWVtYmVyPiBfbWVtYmVyTm9kZUluZGV4OwogIEluZGV4ZWRTaW5rPEltcG9ydEVudGl0eT4gX2ltcG9ydEluZGV4OwoKICBNYXA8VHlwZSwgSW5kZXhlZFNpbms+IF9nZW5lcmFsQ2FjaGVzID0ge307CgogIEFic3RyYWN0RGF0YVNpbmsoe3RoaXMudXNlRGF0YUtpbmRzOiBmYWxzZX0pIHsKICAgIF9kYXJ0VHlwZVdyaXRlciA9IG5ldyBEYXJ0VHlwZVdyaXRlcih0aGlzKTsKICAgIF9kYXJ0VHlwZU5vZGVXcml0ZXIgPSBuZXcgRGFydFR5cGVOb2RlV3JpdGVyKHRoaXMpOwogICAgX3N0cmluZ0luZGV4ID0gbmV3IEluZGV4ZWRTaW5rPFN0cmluZz4odGhpcyk7CiAgICBfdXJpSW5kZXggPSBuZXcgSW5kZXhlZFNpbms8VXJpPih0aGlzKTsKICAgIF9tZW1iZXJOb2RlSW5kZXggPSBuZXcgSW5kZXhlZFNpbms8aXIuTWVtYmVyPih0aGlzKTsKICAgIF9pbXBvcnRJbmRleCA9IG5ldyBJbmRleGVkU2luazxJbXBvcnRFbnRpdHk+KHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbihTdHJpbmcgdGFnKSB7CiAgICBpZiAodXNlRGF0YUtpbmRzKSB7CiAgICAgIF90YWdzID8/PSA8U3RyaW5nPltdOwogICAgICBfdGFncy5hZGQodGFnKTsKICAgICAgX2JlZ2luKHRhZyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZChPYmplY3QgdGFnKSB7CiAgICBpZiAodXNlRGF0YUtpbmRzKSB7CiAgICAgIF9lbmQodGFnKTsKCiAgICAgIFN0cmluZyBleGlzdGluZ1RhZyA9IF90YWdzLnJlbW92ZUxhc3QoKTsKICAgICAgYXNzZXJ0KGV4aXN0aW5nVGFnID09IHRhZywKICAgICAgICAgICJVbmV4cGVjdGVkIHRhZyBlbmQuIEV4cGVjdGVkICRleGlzdGluZ1RhZywgZm91bmQgJHRhZy4iKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVDYWNoZWQ8RT4oRSB2YWx1ZSwgdm9pZCBmKEUgdmFsdWUpKSB7CiAgICBJbmRleGVkU2luayBzaW5rID0gX2dlbmVyYWxDYWNoZXNbRV0gPz89IG5ldyBJbmRleGVkU2luazxFPih0aGlzKTsKICAgIHNpbmsud3JpdGUodmFsdWUsICh2KSA9PiBmKHYpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVTb3VyY2VTcGFuKFNvdXJjZVNwYW4gdmFsdWUpIHsKICAgIF93cml0ZURhdGFLaW5kKERhdGFLaW5kLnNvdXJjZVNwYW4pOwogICAgX3dyaXRlVXJpKHZhbHVlLnVyaSk7CiAgICBfd3JpdGVJbnRJbnRlcm5hbCh2YWx1ZS5iZWdpbik7CiAgICBfd3JpdGVJbnRJbnRlcm5hbCh2YWx1ZS5lbmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZURhcnRUeXBlKERhcnRUeXBlIHZhbHVlLCB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgX3dyaXRlRGF0YUtpbmQoRGF0YUtpbmQuZGFydFR5cGUpOwogICAgX3dyaXRlRGFydFR5cGUodmFsdWUsIFtdLCBhbGxvd051bGw6IGFsbG93TnVsbCk7CiAgfQoKICB2b2lkIF93cml0ZURhcnRUeXBlKAogICAgICBEYXJ0VHlwZSB2YWx1ZSwgTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4gZnVuY3Rpb25UeXBlVmFyaWFibGVzLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgaWYgKCFhbGxvd051bGwpIHsKICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiTWlzc2luZyBEYXJ0VHlwZSBpcyBub3QgYWxsb3dlZC4iKTsKICAgICAgfQogICAgICB3cml0ZUVudW0oRGFydFR5cGVLaW5kLm5vbmUpOwogICAgfSBlbHNlIHsKICAgICAgX2RhcnRUeXBlV3JpdGVyLnZpc2l0KHZhbHVlLCBmdW5jdGlvblR5cGVWYXJpYWJsZXMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZURhcnRUeXBlTm9kZShpci5EYXJ0VHlwZSB2YWx1ZSwge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIF93cml0ZURhdGFLaW5kKERhdGFLaW5kLmRhcnRUeXBlTm9kZSk7CiAgICBfd3JpdGVEYXJ0VHlwZU5vZGUodmFsdWUsIFtdLCBhbGxvd051bGw6IGFsbG93TnVsbCk7CiAgfQoKICB2b2lkIF93cml0ZURhcnRUeXBlTm9kZSgKICAgICAgaXIuRGFydFR5cGUgdmFsdWUsIExpc3Q8aXIuVHlwZVBhcmFtZXRlcj4gZnVuY3Rpb25UeXBlVmFyaWFibGVzLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgaWYgKCFhbGxvd051bGwpIHsKICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiTWlzc2luZyBpci5EYXJ0VHlwZSBub2RlIGlzIG5vdCBhbGxvd2VkLiIpOwogICAgICB9CiAgICAgIHdyaXRlRW51bShEYXJ0VHlwZU5vZGVLaW5kLm5vbmUpOwogICAgfSBlbHNlIHsKICAgICAgdmFsdWUuYWNjZXB0MShfZGFydFR5cGVOb2RlV3JpdGVyLCBmdW5jdGlvblR5cGVWYXJpYWJsZXMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZU1lbWJlck5vZGUoaXIuTWVtYmVyIHZhbHVlKSB7CiAgICBfd3JpdGVEYXRhS2luZChEYXRhS2luZC5tZW1iZXJOb2RlKTsKICAgIF93cml0ZU1lbWJlck5vZGUodmFsdWUpOwogIH0KCiAgdm9pZCBfd3JpdGVNZW1iZXJOb2RlKGlyLk1lbWJlciB2YWx1ZSkgewogICAgX21lbWJlck5vZGVJbmRleC53cml0ZSh2YWx1ZSwgX3dyaXRlTWVtYmVyTm9kZUludGVybmFsKTsKICB9CgogIHZvaWQgX3dyaXRlTWVtYmVyTm9kZUludGVybmFsKGlyLk1lbWJlciB2YWx1ZSkgewogICAgaXIuQ2xhc3MgY2xzID0gdmFsdWUuZW5jbG9zaW5nQ2xhc3M7CiAgICBpZiAoY2xzICE9IG51bGwpIHsKICAgICAgX3dyaXRlRW51bUludGVybmFsKE1lbWJlckNvbnRleHRLaW5kLmNscyk7CiAgICAgIF93cml0ZUNsYXNzTm9kZShjbHMpOwogICAgICBfd3JpdGVTdHJpbmcoX2NvbXB1dGVNZW1iZXJOYW1lKHZhbHVlKSk7CiAgICB9IGVsc2UgewogICAgICBfd3JpdGVFbnVtSW50ZXJuYWwoTWVtYmVyQ29udGV4dEtpbmQubGlicmFyeSk7CiAgICAgIF93cml0ZUxpYnJhcnlOb2RlKHZhbHVlLmVuY2xvc2luZ0xpYnJhcnkpOwogICAgICBfd3JpdGVTdHJpbmcoX2NvbXB1dGVNZW1iZXJOYW1lKHZhbHVlKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlQ2xhc3NOb2RlKGlyLkNsYXNzIHZhbHVlKSB7CiAgICBfd3JpdGVEYXRhS2luZChEYXRhS2luZC5jbGFzc05vZGUpOwogICAgX3dyaXRlQ2xhc3NOb2RlKHZhbHVlKTsKICB9CgogIHZvaWQgX3dyaXRlQ2xhc3NOb2RlKGlyLkNsYXNzIHZhbHVlKSB7CiAgICBfd3JpdGVMaWJyYXJ5Tm9kZSh2YWx1ZS5lbmNsb3NpbmdMaWJyYXJ5KTsKICAgIF93cml0ZVN0cmluZyh2YWx1ZS5uYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUeXBlZGVmTm9kZShpci5UeXBlZGVmIHZhbHVlKSB7CiAgICBfd3JpdGVEYXRhS2luZChEYXRhS2luZC50eXBlZGVmTm9kZSk7CiAgICBfd3JpdGVUeXBlZGVmTm9kZSh2YWx1ZSk7CiAgfQoKICB2b2lkIF93cml0ZVR5cGVkZWZOb2RlKGlyLlR5cGVkZWYgdmFsdWUpIHsKICAgIF93cml0ZUxpYnJhcnlOb2RlKHZhbHVlLmVuY2xvc2luZ0xpYnJhcnkpOwogICAgX3dyaXRlU3RyaW5nKHZhbHVlLm5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUxpYnJhcnlOb2RlKGlyLkxpYnJhcnkgdmFsdWUpIHsKICAgIF93cml0ZURhdGFLaW5kKERhdGFLaW5kLmxpYnJhcnlOb2RlKTsKICAgIF93cml0ZUxpYnJhcnlOb2RlKHZhbHVlKTsKICB9CgogIHZvaWQgX3dyaXRlTGlicmFyeU5vZGUoaXIuTGlicmFyeSB2YWx1ZSkgewogICAgX3dyaXRlVXJpKHZhbHVlLmltcG9ydFVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlRW51bShkeW5hbWljIHZhbHVlKSB7CiAgICBfd3JpdGVEYXRhS2luZChEYXRhS2luZC5lbnVtVmFsdWUpOwogICAgX3dyaXRlRW51bUludGVybmFsKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVCb29sKGJvb2wgdmFsdWUpIHsKICAgIGFzc2VydCh2YWx1ZSAhPSBudWxsKTsKICAgIF93cml0ZURhdGFLaW5kKERhdGFLaW5kLmJvb2wpOwogICAgX3dyaXRlQm9vbCh2YWx1ZSk7CiAgfQoKICB2b2lkIF93cml0ZUJvb2woYm9vbCB2YWx1ZSkgewogICAgX3dyaXRlSW50SW50ZXJuYWwodmFsdWUgPyAxIDogMCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVXJpKFVyaSB2YWx1ZSkgewogICAgYXNzZXJ0KHZhbHVlICE9IG51bGwpOwogICAgX3dyaXRlRGF0YUtpbmQoRGF0YUtpbmQudXJpKTsKICAgIF93cml0ZVVyaSh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyB2YWx1ZSkgewogICAgYXNzZXJ0KHZhbHVlICE9IG51bGwpOwogICAgX3dyaXRlRGF0YUtpbmQoRGF0YUtpbmQuc3RyaW5nKTsKICAgIF93cml0ZVN0cmluZyh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlSW50KGludCB2YWx1ZSkgewogICAgYXNzZXJ0KHZhbHVlICE9IG51bGwpOwogICAgYXNzZXJ0KHZhbHVlID49IDAgJiYgdmFsdWUgPj4gMzAgPT0gMCk7CiAgICBfd3JpdGVEYXRhS2luZChEYXRhS2luZC51aW50MzApOwogICAgX3dyaXRlSW50SW50ZXJuYWwodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRyZWVOb2RlKGlyLlRyZWVOb2RlIHZhbHVlKSB7CiAgICBfd3JpdGVEYXRhS2luZChEYXRhS2luZC50cmVlTm9kZSk7CiAgICBfd3JpdGVUcmVlTm9kZSh2YWx1ZSk7CiAgfQoKICB2b2lkIF93cml0ZVRyZWVOb2RlKGlyLlRyZWVOb2RlIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgaXMgaXIuQ2xhc3MpIHsKICAgICAgX3dyaXRlRW51bUludGVybmFsKF9UcmVlTm9kZUtpbmQuY2xzKTsKICAgICAgX3dyaXRlQ2xhc3NOb2RlKHZhbHVlKTsKICAgIH0gZWxzZSBpZiAodmFsdWUgaXMgaXIuTWVtYmVyKSB7CiAgICAgIF93cml0ZUVudW1JbnRlcm5hbChfVHJlZU5vZGVLaW5kLm1lbWJlcik7CiAgICAgIF93cml0ZU1lbWJlck5vZGUodmFsdWUpOwogICAgfSBlbHNlIGlmICh2YWx1ZSBpcyBpci5WYXJpYWJsZURlY2xhcmF0aW9uICYmCiAgICAgICAgdmFsdWUucGFyZW50IGlzIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24pIHsKICAgICAgX3dyaXRlRW51bUludGVybmFsKF9UcmVlTm9kZUtpbmQuZnVuY3Rpb25EZWNsYXJhdGlvblZhcmlhYmxlKTsKICAgICAgX3dyaXRlVHJlZU5vZGUodmFsdWUucGFyZW50KTsKICAgIH0gZWxzZSBpZiAodmFsdWUgaXMgaXIuRnVuY3Rpb25Ob2RlKSB7CiAgICAgIF93cml0ZUVudW1JbnRlcm5hbChfVHJlZU5vZGVLaW5kLmZ1bmN0aW9uTm9kZSk7CiAgICAgIF93cml0ZUZ1bmN0aW9uTm9kZSh2YWx1ZSk7CiAgICB9IGVsc2UgaWYgKHZhbHVlIGlzIGlyLlR5cGVQYXJhbWV0ZXIpIHsKICAgICAgX3dyaXRlRW51bUludGVybmFsKF9UcmVlTm9kZUtpbmQudHlwZVBhcmFtZXRlcik7CiAgICAgIF93cml0ZVR5cGVQYXJhbWV0ZXIodmFsdWUpOwogICAgfSBlbHNlIGlmICh2YWx1ZSBpcyBDb25zdGFudFJlZmVyZW5jZSkgewogICAgICBfd3JpdGVFbnVtSW50ZXJuYWwoX1RyZWVOb2RlS2luZC5jb25zdGFudCk7CiAgICAgIF93cml0ZVRyZWVOb2RlKHZhbHVlLmV4cHJlc3Npb24pOwogICAgICBfQ29uc3RhbnROb2RlSW5kZXhlclZpc2l0b3IgaW5kZXhlciA9IG5ldyBfQ29uc3RhbnROb2RlSW5kZXhlclZpc2l0b3IoKTsKICAgICAgdmFsdWUuZXhwcmVzc2lvbi5jb25zdGFudC5hY2NlcHQoaW5kZXhlcik7CiAgICAgIF93cml0ZUludEludGVybmFsKGluZGV4ZXIuZ2V0SW5kZXgodmFsdWUuY29uc3RhbnQpKTsKICAgIH0gZWxzZSB7CiAgICAgIF93cml0ZUVudW1JbnRlcm5hbChfVHJlZU5vZGVLaW5kLm5vZGUpOwogICAgICBpci5UcmVlTm9kZSBtZW1iZXIgPSB2YWx1ZTsKICAgICAgd2hpbGUgKG1lbWJlciBpcyEgaXIuTWVtYmVyKSB7CiAgICAgICAgaWYgKG1lbWJlciA9PSBudWxsKSB7CiAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiTm8gZW5jbG9zaW5nIG1lbWJlciBvZiBUcmVlTm9kZSAiCiAgICAgICAgICAgICAgIiR2YWx1ZSAoJHt2YWx1ZS5ydW50aW1lVHlwZX0pIik7CiAgICAgICAgfQogICAgICAgIG1lbWJlciA9IG1lbWJlci5wYXJlbnQ7CiAgICAgIH0KICAgICAgX3dyaXRlTWVtYmVyTm9kZShtZW1iZXIpOwogICAgICBfTWVtYmVyRGF0YSBtZW1iZXJEYXRhID0gX21lbWJlckRhdGFbbWVtYmVyXSA/Pz0gbmV3IF9NZW1iZXJEYXRhKG1lbWJlcik7CiAgICAgIGludCBpbmRleCA9IG1lbWJlckRhdGEuZ2V0SW5kZXhCeVRyZWVOb2RlKHZhbHVlKTsKICAgICAgYXNzZXJ0KAogICAgICAgICAgaW5kZXggIT0gbnVsbCwgIk5vIFRyZWVOb2RlIGluZGV4IGZvdW5kIGZvciAke3ZhbHVlLnJ1bnRpbWVUeXBlfS4iKTsKICAgICAgX3dyaXRlSW50SW50ZXJuYWwoaW5kZXgpOwogICAgfQogIH0KCiAgdm9pZCBfd3JpdGVGdW5jdGlvbk5vZGUoaXIuRnVuY3Rpb25Ob2RlIHZhbHVlKSB7CiAgICBpci5UcmVlTm9kZSBwYXJlbnQgPSB2YWx1ZS5wYXJlbnQ7CiAgICBpZiAocGFyZW50IGlzIGlyLlByb2NlZHVyZSkgewogICAgICBfd3JpdGVFbnVtSW50ZXJuYWwoX0Z1bmN0aW9uTm9kZUtpbmQucHJvY2VkdXJlKTsKICAgICAgX3dyaXRlTWVtYmVyTm9kZShwYXJlbnQpOwogICAgfSBlbHNlIGlmIChwYXJlbnQgaXMgaXIuQ29uc3RydWN0b3IpIHsKICAgICAgX3dyaXRlRW51bUludGVybmFsKF9GdW5jdGlvbk5vZGVLaW5kLmNvbnN0cnVjdG9yKTsKICAgICAgX3dyaXRlTWVtYmVyTm9kZShwYXJlbnQpOwogICAgfSBlbHNlIGlmIChwYXJlbnQgaXMgaXIuRnVuY3Rpb25FeHByZXNzaW9uKSB7CiAgICAgIF93cml0ZUVudW1JbnRlcm5hbChfRnVuY3Rpb25Ob2RlS2luZC5mdW5jdGlvbkV4cHJlc3Npb24pOwogICAgICBfd3JpdGVUcmVlTm9kZShwYXJlbnQpOwogICAgfSBlbHNlIGlmIChwYXJlbnQgaXMgaXIuRnVuY3Rpb25EZWNsYXJhdGlvbikgewogICAgICBfd3JpdGVFbnVtSW50ZXJuYWwoX0Z1bmN0aW9uTm9kZUtpbmQuZnVuY3Rpb25EZWNsYXJhdGlvbik7CiAgICAgIF93cml0ZVRyZWVOb2RlKHBhcmVudCk7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICJVbnN1cHBvcnRlZCBGdW5jdGlvbk5vZGUgcGFyZW50ICR7cGFyZW50LnJ1bnRpbWVUeXBlfSIpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVR5cGVQYXJhbWV0ZXJOb2RlKGlyLlR5cGVQYXJhbWV0ZXIgdmFsdWUpIHsKICAgIF93cml0ZURhdGFLaW5kKERhdGFLaW5kLnR5cGVQYXJhbWV0ZXJOb2RlKTsKICAgIF93cml0ZVR5cGVQYXJhbWV0ZXIodmFsdWUpOwogIH0KCiAgdm9pZCBfd3JpdGVUeXBlUGFyYW1ldGVyKGlyLlR5cGVQYXJhbWV0ZXIgdmFsdWUpIHsKICAgIGlyLlRyZWVOb2RlIHBhcmVudCA9IHZhbHVlLnBhcmVudDsKICAgIGlmIChwYXJlbnQgaXMgaXIuQ2xhc3MpIHsKICAgICAgX3dyaXRlRW51bUludGVybmFsKF9UeXBlUGFyYW1ldGVyS2luZC5jbHMpOwogICAgICBfd3JpdGVDbGFzc05vZGUocGFyZW50KTsKICAgICAgX3dyaXRlSW50SW50ZXJuYWwocGFyZW50LnR5cGVQYXJhbWV0ZXJzLmluZGV4T2YodmFsdWUpKTsKICAgIH0gZWxzZSBpZiAocGFyZW50IGlzIGlyLkZ1bmN0aW9uTm9kZSkgewogICAgICBfd3JpdGVFbnVtSW50ZXJuYWwoX1R5cGVQYXJhbWV0ZXJLaW5kLmZ1bmN0aW9uTm9kZSk7CiAgICAgIF93cml0ZUZ1bmN0aW9uTm9kZShwYXJlbnQpOwogICAgICBfd3JpdGVJbnRJbnRlcm5hbChwYXJlbnQudHlwZVBhcmFtZXRlcnMuaW5kZXhPZih2YWx1ZSkpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAiVW5zdXBwb3J0ZWQgVHlwZVBhcmFtZXRlciBwYXJlbnQgJHtwYXJlbnQucnVudGltZVR5cGV9Iik7CiAgICB9CiAgfQoKICB2b2lkIF93cml0ZURhdGFLaW5kKERhdGFLaW5kIGtpbmQpIHsKICAgIGlmICh1c2VEYXRhS2luZHMpIF93cml0ZUVudW1JbnRlcm5hbChraW5kKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVMaWJyYXJ5KEluZGV4ZWRMaWJyYXJ5IHZhbHVlKSB7CiAgICB3cml0ZUludCh2YWx1ZS5saWJyYXJ5SW5kZXgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUNsYXNzKEluZGV4ZWRDbGFzcyB2YWx1ZSkgewogICAgd3JpdGVJbnQodmFsdWUuY2xhc3NJbmRleCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVHlwZWRlZihJbmRleGVkVHlwZWRlZiB2YWx1ZSkgewogICAgd3JpdGVJbnQodmFsdWUudHlwZWRlZkluZGV4KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVNZW1iZXIoSW5kZXhlZE1lbWJlciB2YWx1ZSkgewogICAgd3JpdGVJbnQodmFsdWUubWVtYmVySW5kZXgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUxvY2FsKExvY2FsIGxvY2FsKSB7CiAgICBpZiAobG9jYWwgaXMgSkxvY2FsKSB7CiAgICAgIHdyaXRlRW51bShMb2NhbEtpbmQuakxvY2FsKTsKICAgICAgd3JpdGVNZW1iZXIobG9jYWwubWVtYmVyQ29udGV4dCk7CiAgICAgIHdyaXRlSW50KGxvY2FsLmxvY2FsSW5kZXgpOwogICAgfSBlbHNlIGlmIChsb2NhbCBpcyBUaGlzTG9jYWwpIHsKICAgICAgd3JpdGVFbnVtKExvY2FsS2luZC50aGlzTG9jYWwpOwogICAgICB3cml0ZUNsYXNzKGxvY2FsLmVuY2xvc2luZ0NsYXNzKTsKICAgIH0gZWxzZSBpZiAobG9jYWwgaXMgQm94TG9jYWwpIHsKICAgICAgd3JpdGVFbnVtKExvY2FsS2luZC5ib3hMb2NhbCk7CiAgICAgIHdyaXRlQ2xhc3MobG9jYWwuY29udGFpbmVyKTsKICAgIH0gZWxzZSBpZiAobG9jYWwgaXMgQW5vbnltb3VzQ2xvc3VyZUxvY2FsKSB7CiAgICAgIHdyaXRlRW51bShMb2NhbEtpbmQuYW5vbnltb3VzQ2xvc3VyZUxvY2FsKTsKICAgICAgd3JpdGVDbGFzcyhsb2NhbC5jbG9zdXJlQ2xhc3MpOwogICAgfSBlbHNlIGlmIChsb2NhbCBpcyBUeXBlVmFyaWFibGVMb2NhbCkgewogICAgICB3cml0ZUVudW0oTG9jYWxLaW5kLnR5cGVWYXJpYWJsZUxvY2FsKTsKICAgICAgd3JpdGVEYXJ0VHlwZShsb2NhbC50eXBlVmFyaWFibGUpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuc3VwcG9ydGVkIGxvY2FsICR7bG9jYWwucnVudGltZVR5cGV9Iik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlQ29uc3RhbnQoQ29uc3RhbnRWYWx1ZSB2YWx1ZSkgewogICAgX3dyaXRlRGF0YUtpbmQoRGF0YUtpbmQuY29uc3RhbnQpOwogICAgX3dyaXRlQ29uc3RhbnQodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZURvdWJsZVZhbHVlKGRvdWJsZSB2YWx1ZSkgewogICAgX3dyaXRlRGF0YUtpbmQoRGF0YUtpbmQuZG91YmxlKTsKICAgIF93cml0ZURvdWJsZVZhbHVlKHZhbHVlKTsKICB9CgogIHZvaWQgX3dyaXRlRG91YmxlVmFsdWUoZG91YmxlIHZhbHVlKSB7CiAgICBCeXRlRGF0YSBkYXRhID0gbmV3IEJ5dGVEYXRhKDgpOwogICAgZGF0YS5zZXRGbG9hdDY0KDAsIHZhbHVlKTsKICAgIHdyaXRlSW50KGRhdGEuZ2V0VWludDE2KDApKTsKICAgIHdyaXRlSW50KGRhdGEuZ2V0VWludDE2KDIpKTsKICAgIHdyaXRlSW50KGRhdGEuZ2V0VWludDE2KDQpKTsKICAgIHdyaXRlSW50KGRhdGEuZ2V0VWludDE2KDYpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVJbnRlZ2VyVmFsdWUoaW50IHZhbHVlKSB7CiAgICBfd3JpdGVEYXRhS2luZChEYXRhS2luZC5pbnQpOwogICAgX3dyaXRlQmlnSW50KG5ldyBCaWdJbnQuZnJvbSh2YWx1ZSkpOwogIH0KCiAgdm9pZCBfd3JpdGVCaWdJbnQoQmlnSW50IHZhbHVlKSB7CiAgICB3cml0ZVN0cmluZyh2YWx1ZS50b1N0cmluZygpKTsKICB9CgogIHZvaWQgX3dyaXRlQ29uc3RhbnQoQ29uc3RhbnRWYWx1ZSB2YWx1ZSkgewogICAgX3dyaXRlRW51bUludGVybmFsKHZhbHVlLmtpbmQpOwogICAgc3dpdGNoICh2YWx1ZS5raW5kKSB7CiAgICAgIGNhc2UgQ29uc3RhbnRWYWx1ZUtpbmQuQk9PTDoKICAgICAgICBCb29sQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IHZhbHVlOwogICAgICAgIHdyaXRlQm9vbChjb25zdGFudC5ib29sVmFsdWUpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENvbnN0YW50VmFsdWVLaW5kLklOVDoKICAgICAgICBJbnRDb25zdGFudFZhbHVlIGNvbnN0YW50ID0gdmFsdWU7CiAgICAgICAgX3dyaXRlQmlnSW50KGNvbnN0YW50LmludFZhbHVlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5ET1VCTEU6CiAgICAgICAgRG91YmxlQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IHZhbHVlOwogICAgICAgIF93cml0ZURvdWJsZVZhbHVlKGNvbnN0YW50LmRvdWJsZVZhbHVlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5TVFJJTkc6CiAgICAgICAgU3RyaW5nQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IHZhbHVlOwogICAgICAgIHdyaXRlU3RyaW5nKGNvbnN0YW50LnN0cmluZ1ZhbHVlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5OVUxMOgogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENvbnN0YW50VmFsdWVLaW5kLkZVTkNUSU9OOgogICAgICAgIEZ1bmN0aW9uQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IHZhbHVlOwogICAgICAgIEluZGV4ZWRGdW5jdGlvbiBmdW5jdGlvbiA9IGNvbnN0YW50LmVsZW1lbnQ7CiAgICAgICAgd3JpdGVNZW1iZXIoZnVuY3Rpb24pOwogICAgICAgIHdyaXRlRGFydFR5cGUoY29uc3RhbnQudHlwZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ29uc3RhbnRWYWx1ZUtpbmQuTElTVDoKICAgICAgICBMaXN0Q29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IHZhbHVlOwogICAgICAgIHdyaXRlRGFydFR5cGUoY29uc3RhbnQudHlwZSk7CiAgICAgICAgd3JpdGVDb25zdGFudHMoY29uc3RhbnQuZW50cmllcyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ29uc3RhbnRWYWx1ZUtpbmQuU0VUOgogICAgICAgIGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0U2V0Q29uc3RhbnQgY29uc3RhbnQgPSB2YWx1ZTsKICAgICAgICB3cml0ZURhcnRUeXBlKGNvbnN0YW50LnR5cGUpOwogICAgICAgIHdyaXRlQ29uc3RhbnQoY29uc3RhbnQuZW50cmllcyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ29uc3RhbnRWYWx1ZUtpbmQuTUFQOgogICAgICAgIGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0TWFwQ29uc3RhbnQgY29uc3RhbnQgPSB2YWx1ZTsKICAgICAgICB3cml0ZURhcnRUeXBlKGNvbnN0YW50LnR5cGUpOwogICAgICAgIHdyaXRlQ29uc3RhbnQoY29uc3RhbnQua2V5TGlzdCk7CiAgICAgICAgd3JpdGVDb25zdGFudHMoY29uc3RhbnQudmFsdWVzKTsKICAgICAgICB3cml0ZUNvbnN0YW50T3JOdWxsKGNvbnN0YW50LnByb3RvVmFsdWUpOwogICAgICAgIHdyaXRlQm9vbChjb25zdGFudC5vbmx5U3RyaW5nS2V5cyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ29uc3RhbnRWYWx1ZUtpbmQuQ09OU1RSVUNURUQ6CiAgICAgICAgQ29uc3RydWN0ZWRDb25zdGFudFZhbHVlIGNvbnN0YW50ID0gdmFsdWU7CiAgICAgICAgd3JpdGVEYXJ0VHlwZShjb25zdGFudC50eXBlKTsKICAgICAgICB3cml0ZU1lbWJlck1hcChjb25zdGFudC5maWVsZHMsIHdyaXRlQ29uc3RhbnQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENvbnN0YW50VmFsdWVLaW5kLlRZUEU6CiAgICAgICAgVHlwZUNvbnN0YW50VmFsdWUgY29uc3RhbnQgPSB2YWx1ZTsKICAgICAgICB3cml0ZURhcnRUeXBlKGNvbnN0YW50LnJlcHJlc2VudGVkVHlwZSk7CiAgICAgICAgd3JpdGVEYXJ0VHlwZShjb25zdGFudC50eXBlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5JTlNUQU5USUFUSU9OOgogICAgICAgIEluc3RhbnRpYXRpb25Db25zdGFudFZhbHVlIGNvbnN0YW50ID0gdmFsdWU7CiAgICAgICAgd3JpdGVEYXJ0VHlwZXMoY29uc3RhbnQudHlwZUFyZ3VtZW50cyk7CiAgICAgICAgd3JpdGVDb25zdGFudChjb25zdGFudC5mdW5jdGlvbik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ29uc3RhbnRWYWx1ZUtpbmQuTk9OX0NPTlNUQU5UOgogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENvbnN0YW50VmFsdWVLaW5kLkRFRkVSUkVEX0dMT0JBTDoKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5JTlRFUkNFUFRPUjoKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5TWU5USEVUSUM6CiAgICAgICAgLy8gVGhlc2UgYXJlIG9ubHkgY3JlYXRlZCBpbiB0aGUgU1NBIGdyYXBoIGJ1aWxkZXIuCiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAgICJVbnN1cHBvcnRlZCBjb25zdGFudCB2YWx1ZSBraW5kICR7dmFsdWUua2luZH0uIik7CiAgICB9CiAgfQoKICB2b2lkIF93cml0ZVN0cmluZyhTdHJpbmcgdmFsdWUpIHsKICAgIF9zdHJpbmdJbmRleC53cml0ZSh2YWx1ZSwgX3dyaXRlU3RyaW5nSW50ZXJuYWwpOwogIH0KCiAgdm9pZCBfd3JpdGVVcmkoVXJpIHZhbHVlKSB7CiAgICBfdXJpSW5kZXgud3JpdGUodmFsdWUsIF93cml0ZVVyaUludGVybmFsKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVJbXBvcnQoSW1wb3J0RW50aXR5IHZhbHVlKSB7CiAgICBfd3JpdGVEYXRhS2luZChEYXRhS2luZC5pbXBvcnQpOwogICAgX3dyaXRlSW1wb3J0KHZhbHVlKTsKICB9CgogIHZvaWQgX3dyaXRlSW1wb3J0KEltcG9ydEVudGl0eSB2YWx1ZSkgewogICAgX2ltcG9ydEluZGV4LndyaXRlKHZhbHVlLCBfd3JpdGVJbXBvcnRJbnRlcm5hbCk7CiAgfQoKICB2b2lkIF93cml0ZUltcG9ydEludGVybmFsKEltcG9ydEVudGl0eSB2YWx1ZSkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogRG8gd2UgbmVlZCB0byBzZXJpYWxpemUgbm9uLWRlZmVycmVkIGltcG9ydHM/CiAgICB3cml0ZVN0cmluZ09yTnVsbCh2YWx1ZS5uYW1lKTsKICAgIF93cml0ZVVyaSh2YWx1ZS51cmkpOwogICAgX3dyaXRlVXJpKHZhbHVlLmVuY2xvc2luZ0xpYnJhcnlVcmkpOwogICAgX3dyaXRlQm9vbCh2YWx1ZS5pc0RlZmVycmVkKTsKICB9CgogIC8vLyBBY3R1YWwgc2VyaWFsaXphdGlvbiBvZiBhIHNlY3Rpb24gYmVnaW4gdGFnLCBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzLgogIHZvaWQgX2JlZ2luKFN0cmluZyB0YWcpOwoKICAvLy8gQWN0dWFsIHNlcmlhbGl6YXRpb24gb2YgYSBzZWN0aW9uIGVuZCB0YWcsIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMuCiAgdm9pZCBfZW5kKFN0cmluZyB0YWcpOwoKICAvLy8gQWN0dWFsIHNlcmlhbGl6YXRpb24gb2YgYSBVUkkgdmFsdWUsIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMuCiAgdm9pZCBfd3JpdGVVcmlJbnRlcm5hbChVcmkgdmFsdWUpOwoKICAvLy8gQWN0dWFsIHNlcmlhbGl6YXRpb24gb2YgYSBTdHJpbmcgdmFsdWUsIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMuCiAgdm9pZCBfd3JpdGVTdHJpbmdJbnRlcm5hbChTdHJpbmcgdmFsdWUpOwoKICAvLy8gQWN0dWFsIHNlcmlhbGl6YXRpb24gb2YgYSBub24tbmVnYXRpdmUgaW50ZWdlciB2YWx1ZSwgaW1wbGVtZW50ZWQgYnkKICAvLy8gc3ViY2xhc3Nlcy4KICB2b2lkIF93cml0ZUludEludGVybmFsKGludCB2YWx1ZSk7CgogIC8vLyBBY3R1YWwgc2VyaWFsaXphdGlvbiBvZiBhbiBlbnVtIHZhbHVlLCBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzLgogIHZvaWQgX3dyaXRlRW51bUludGVybmFsKGR5bmFtaWMgdmFsdWUpOwp9CoHxAE5OPAEeAUkZTE4NBkwbGwEwIgEzKgFRQRYBRjABJB4rKgEuATEwODIsOTgEAQwbGBwWEwYEAQwZGBEBLyFFBgQBDDJHJAQBDCspGiQiBAEMQCc1BAEXSCEZGEgIJA07BgQBDEcrOQQBG0chGRhQCCgNQQYEAQwqKR0EASs9BAEzKRcxHC8NNTEvBgQBDCgoHAQBKS8eBAEMLCoeBAEtLx4EAQwsKh4EAS0gBAEMIigfBAEMHxsjFwQBICYEAQwdGyIWBAEMIxslGQQBDB0bLCUeBAEMKicbBAErHS0eJTAfMjJFJCs2ISw3Ii0yKE8xOw0uIiUeSDAKIAggUDgOTyAGBAEzJyI3ICs5IDJAHjNBHg0iRAYEAQw4MCAEATUnHjIfPyw7Ij8NIkUGBAEnMAQBDCwiBAEMKCAEAQwsIgQBDCohBAEMIRsjKCIlJigkJSMxMiYtLikNTAYEAQwsJxsEAQwoJR4EASklHyEhISEEAQwmIioEASQjBAEtJBojLCcPIispDyUuMQ8lLisPIw8nMDUfJg8jLCYqDyJAJikPIkAmKSkyLA8qMyY4DyMsMSYPLDUwKg8rDy4qKDwkPwYEASQ1BAEeLwQBDCklGQQBKjUEATJKIxoqIgQBThsBTBkBRiUBSSsBSxIlAUgqAgE1cGFja2FnZTpjb21waWxlci9zcmMvc2VyaWFsaXphdGlvbi9hYnN0cmFjdF9zaW5rLmRhcnRAc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvc2VyaWFsaXphdGlvbi9hYnN0cmFjdF9zb3VyY2UuZGFydMAAV2MvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiAnc2VyaWFsaXphdGlvbi5kYXJ0JzsKCi8vLyBCYXNlIGltcGxlbWVudGF0aW9uIG9mIFtEYXRhU291cmNlXSB1c2luZyBbRGF0YVNvdXJjZU1peGluXSB0byBpbXBsZW1lbnQKLy8vIGNvbnZlbmllbmNlIG1ldGhvZHMuCmFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGF0YVNvdXJjZSBleHRlbmRzIERhdGFTb3VyY2VNaXhpbgogICAgaW1wbGVtZW50cyBEYXRhU291cmNlIHsKICBmaW5hbCBib29sIHVzZURhdGFLaW5kczsKICBDb21wb25lbnRMb29rdXAgX2NvbXBvbmVudExvb2t1cDsKICBFbnRpdHlMb29rdXAgX2VudGl0eUxvb2t1cDsKICBMb2NhbExvb2t1cCBfbG9jYWxMb29rdXA7CgogIEluZGV4ZWRTb3VyY2U8U3RyaW5nPiBfc3RyaW5nSW5kZXg7CiAgSW5kZXhlZFNvdXJjZTxVcmk+IF91cmlJbmRleDsKICBJbmRleGVkU291cmNlPF9NZW1iZXJEYXRhPiBfbWVtYmVyTm9kZUluZGV4OwogIEluZGV4ZWRTb3VyY2U8SW1wb3J0RW50aXR5PiBfaW1wb3J0SW5kZXg7CgogIE1hcDxUeXBlLCBJbmRleGVkU291cmNlPiBfZ2VuZXJhbENhY2hlcyA9IHt9OwoKICBBYnN0cmFjdERhdGFTb3VyY2Uoe3RoaXMudXNlRGF0YUtpbmRzOiBmYWxzZX0pIHsKICAgIF9zdHJpbmdJbmRleCA9IG5ldyBJbmRleGVkU291cmNlPFN0cmluZz4odGhpcyk7CiAgICBfdXJpSW5kZXggPSBuZXcgSW5kZXhlZFNvdXJjZTxVcmk+KHRoaXMpOwogICAgX21lbWJlck5vZGVJbmRleCA9IG5ldyBJbmRleGVkU291cmNlPF9NZW1iZXJEYXRhPih0aGlzKTsKICAgIF9pbXBvcnRJbmRleCA9IG5ldyBJbmRleGVkU291cmNlPEltcG9ydEVudGl0eT4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luKFN0cmluZyB0YWcpIHsKICAgIGlmICh1c2VEYXRhS2luZHMpIF9iZWdpbih0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmQoU3RyaW5nIHRhZykgewogICAgaWYgKHVzZURhdGFLaW5kcykgX2VuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckNvbXBvbmVudExvb2t1cChDb21wb25lbnRMb29rdXAgY29tcG9uZW50TG9va3VwKSB7CiAgICBhc3NlcnQoX2NvbXBvbmVudExvb2t1cCA9PSBudWxsKTsKICAgIF9jb21wb25lbnRMb29rdXAgPSBjb21wb25lbnRMb29rdXA7CiAgfQoKICBDb21wb25lbnRMb29rdXAgZ2V0IGNvbXBvbmVudExvb2t1cCB7CiAgICBhc3NlcnQoX2NvbXBvbmVudExvb2t1cCAhPSBudWxsKTsKICAgIHJldHVybiBfY29tcG9uZW50TG9va3VwOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckVudGl0eUxvb2t1cChFbnRpdHlMb29rdXAgZW50aXR5TG9va3VwKSB7CiAgICBhc3NlcnQoX2VudGl0eUxvb2t1cCA9PSBudWxsKTsKICAgIF9lbnRpdHlMb29rdXAgPSBlbnRpdHlMb29rdXA7CiAgfQoKICBFbnRpdHlMb29rdXAgZ2V0IGVudGl0eUxvb2t1cCB7CiAgICBhc3NlcnQoX2VudGl0eUxvb2t1cCAhPSBudWxsKTsKICAgIHJldHVybiBfZW50aXR5TG9va3VwOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckxvY2FsTG9va3VwKExvY2FsTG9va3VwIGxvY2FsTG9va3VwKSB7CiAgICBhc3NlcnQoX2xvY2FsTG9va3VwID09IG51bGwpOwogICAgX2xvY2FsTG9va3VwID0gbG9jYWxMb29rdXA7CiAgfQoKICBMb2NhbExvb2t1cCBnZXQgbG9jYWxMb29rdXAgewogICAgYXNzZXJ0KF9sb2NhbExvb2t1cCAhPSBudWxsKTsKICAgIHJldHVybiBfbG9jYWxMb29rdXA7CiAgfQoKICBAb3ZlcnJpZGUKICBFIHJlYWRDYWNoZWQ8RT4oRSBmKCkpIHsKICAgIEluZGV4ZWRTb3VyY2Ugc291cmNlID0gX2dlbmVyYWxDYWNoZXNbRV0gPz89IG5ldyBJbmRleGVkU291cmNlPEU+KHRoaXMpOwogICAgcmV0dXJuIHNvdXJjZS5yZWFkKGYpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5kZXhlZExpYnJhcnkgcmVhZExpYnJhcnkoKSB7CiAgICByZXR1cm4gZ2V0SW5kZXhlZExpYnJhcnkocmVhZEludCgpKTsKICB9CgogIEBvdmVycmlkZQogIEluZGV4ZWRDbGFzcyByZWFkQ2xhc3MoKSB7CiAgICByZXR1cm4gZ2V0SW5kZXhlZENsYXNzKHJlYWRJbnQoKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbmRleGVkVHlwZWRlZiByZWFkVHlwZWRlZigpIHsKICAgIHJldHVybiBnZXRJbmRleGVkVHlwZWRlZihyZWFkSW50KCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5kZXhlZE1lbWJlciByZWFkTWVtYmVyKCkgewogICAgcmV0dXJuIGdldEluZGV4ZWRNZW1iZXIocmVhZEludCgpKTsKICB9CgogIEluZGV4ZWRMaWJyYXJ5IGdldEluZGV4ZWRMaWJyYXJ5KGludCBsaWJyYXJ5SW5kZXgpID0+CiAgICAgIGVudGl0eUxvb2t1cC5nZXRMaWJyYXJ5QnlJbmRleChsaWJyYXJ5SW5kZXgpOwoKICBJbmRleGVkQ2xhc3MgZ2V0SW5kZXhlZENsYXNzKGludCBjbGFzc0luZGV4KSA9PgogICAgICBlbnRpdHlMb29rdXAuZ2V0Q2xhc3NCeUluZGV4KGNsYXNzSW5kZXgpOwoKICBJbmRleGVkVHlwZWRlZiBnZXRJbmRleGVkVHlwZWRlZihpbnQgdHlwZWRlZkluZGV4KSA9PgogICAgICBlbnRpdHlMb29rdXAuZ2V0VHlwZWRlZkJ5SW5kZXgodHlwZWRlZkluZGV4KTsKCiAgSW5kZXhlZE1lbWJlciBnZXRJbmRleGVkTWVtYmVyKGludCBtZW1iZXJJbmRleCkgPT4KICAgICAgZW50aXR5TG9va3VwLmdldE1lbWJlckJ5SW5kZXgobWVtYmVySW5kZXgpOwoKICBJbmRleGVkVHlwZVZhcmlhYmxlIGdldEluZGV4ZWRUeXBlVmFyaWFibGUoaW50IHR5cGVWYXJpYWJsZUluZGV4KSA9PgogICAgICBlbnRpdHlMb29rdXAuZ2V0VHlwZVZhcmlhYmxlQnlJbmRleCh0eXBlVmFyaWFibGVJbmRleCk7CgogIExpc3Q8RGFydFR5cGU+IF9yZWFkRGFydFR5cGVzKAogICAgICBMaXN0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPiBmdW5jdGlvblR5cGVWYXJpYWJsZXMpIHsKICAgIGludCBjb3VudCA9IHJlYWRJbnQoKTsKICAgIExpc3Q8RGFydFR5cGU+IHR5cGVzID0gbmV3IExpc3Q8RGFydFR5cGU+KGNvdW50KTsKICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykgewogICAgICB0eXBlc1tpbmRleF0gPSBfcmVhZERhcnRUeXBlKGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICB9CiAgICByZXR1cm4gdHlwZXM7CiAgfQoKICBMaXN0PGlyLkRhcnRUeXBlPiBfcmVhZERhcnRUeXBlTm9kZXMoCiAgICAgIExpc3Q8aXIuVHlwZVBhcmFtZXRlcj4gZnVuY3Rpb25UeXBlVmFyaWFibGVzKSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlcyA9IG5ldyBMaXN0PGlyLkRhcnRUeXBlPihjb3VudCk7CiAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHsKICAgICAgdHlwZXNbaW5kZXhdID0gX3JlYWREYXJ0VHlwZU5vZGUoZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgIH0KICAgIHJldHVybiB0eXBlczsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZVNwYW4gcmVhZFNvdXJjZVNwYW4oKSB7CiAgICBfY2hlY2tEYXRhS2luZChEYXRhS2luZC5zb3VyY2VTcGFuKTsKICAgIFVyaSB1cmkgPSBfcmVhZFVyaSgpOwogICAgaW50IGJlZ2luID0gX3JlYWRJbnRJbnRlcm5hbCgpOwogICAgaW50IGVuZCA9IF9yZWFkSW50SW50ZXJuYWwoKTsKICAgIHJldHVybiBuZXcgU291cmNlU3Bhbih1cmksIGJlZ2luLCBlbmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgcmVhZERhcnRUeXBlKHtib29sIGFsbG93TnVsbDogZmFsc2V9KSB7CiAgICBfY2hlY2tEYXRhS2luZChEYXRhS2luZC5kYXJ0VHlwZSk7CiAgICBEYXJ0VHlwZSB0eXBlID0gX3JlYWREYXJ0VHlwZShbXSk7CiAgICBhc3NlcnQodHlwZSAhPSBudWxsIHx8IGFsbG93TnVsbCk7CiAgICByZXR1cm4gdHlwZTsKICB9CgogIERhcnRUeXBlIF9yZWFkRGFydFR5cGUoTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4gZnVuY3Rpb25UeXBlVmFyaWFibGVzKSB7CiAgICBEYXJ0VHlwZUtpbmQga2luZCA9IHJlYWRFbnVtKERhcnRUeXBlS2luZC52YWx1ZXMpOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgRGFydFR5cGVLaW5kLm5vbmU6CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIGNhc2UgRGFydFR5cGVLaW5kLnZvaWRUeXBlOgogICAgICAgIHJldHVybiBjb25zdCBWb2lkVHlwZSgpOwogICAgICBjYXNlIERhcnRUeXBlS2luZC50eXBlVmFyaWFibGU6CiAgICAgICAgcmV0dXJuIG5ldyBUeXBlVmFyaWFibGVUeXBlKGdldEluZGV4ZWRUeXBlVmFyaWFibGUocmVhZEludCgpKSk7CiAgICAgIGNhc2UgRGFydFR5cGVLaW5kLmZ1bmN0aW9uVHlwZVZhcmlhYmxlOgogICAgICAgIGludCBpbmRleCA9IHJlYWRJbnQoKTsKICAgICAgICBhc3NlcnQoMCA8PSBpbmRleCAmJiBpbmRleCA8IGZ1bmN0aW9uVHlwZVZhcmlhYmxlcy5sZW5ndGgpOwogICAgICAgIHJldHVybiBmdW5jdGlvblR5cGVWYXJpYWJsZXNbaW5kZXhdOwogICAgICBjYXNlIERhcnRUeXBlS2luZC5mdW5jdGlvblR5cGU6CiAgICAgICAgaW50IHR5cGVWYXJpYWJsZUNvdW50ID0gcmVhZEludCgpOwogICAgICAgIExpc3Q8RnVuY3Rpb25UeXBlVmFyaWFibGU+IHR5cGVWYXJpYWJsZXMgPQogICAgICAgICAgICBuZXcgTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4uZ2VuZXJhdGUodHlwZVZhcmlhYmxlQ291bnQsCiAgICAgICAgICAgICAgICAoaW50IGluZGV4KSA9PiBuZXcgRnVuY3Rpb25UeXBlVmFyaWFibGUoaW5kZXgpKTsKICAgICAgICBmdW5jdGlvblR5cGVWYXJpYWJsZXMgPQogICAgICAgICAgICBuZXcgTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4uZnJvbShmdW5jdGlvblR5cGVWYXJpYWJsZXMpCiAgICAgICAgICAgICAgLi5hZGRBbGwodHlwZVZhcmlhYmxlcyk7CiAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHR5cGVWYXJpYWJsZUNvdW50OyBpbmRleCsrKSB7CiAgICAgICAgICB0eXBlVmFyaWFibGVzW2luZGV4XS5ib3VuZCA9IF9yZWFkRGFydFR5cGUoZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgICAgICB9CiAgICAgICAgRGFydFR5cGUgcmV0dXJuVHlwZSA9IF9yZWFkRGFydFR5cGUoZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgICAgICBMaXN0PERhcnRUeXBlPiBwYXJhbWV0ZXJUeXBlcyA9IF9yZWFkRGFydFR5cGVzKGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICAgICAgTGlzdDxEYXJ0VHlwZT4gb3B0aW9uYWxQYXJhbWV0ZXJUeXBlcyA9CiAgICAgICAgICAgIF9yZWFkRGFydFR5cGVzKGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICAgICAgTGlzdDxEYXJ0VHlwZT4gbmFtZWRQYXJhbWV0ZXJUeXBlcyA9CiAgICAgICAgICAgIF9yZWFkRGFydFR5cGVzKGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkUGFyYW1ldGVycyA9CiAgICAgICAgICAgIG5ldyBMaXN0PFN0cmluZz4obmFtZWRQYXJhbWV0ZXJUeXBlcy5sZW5ndGgpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZWRQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBuYW1lZFBhcmFtZXRlcnNbaV0gPSByZWFkU3RyaW5nKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlKAogICAgICAgICAgICByZXR1cm5UeXBlLAogICAgICAgICAgICBwYXJhbWV0ZXJUeXBlcywKICAgICAgICAgICAgb3B0aW9uYWxQYXJhbWV0ZXJUeXBlcywKICAgICAgICAgICAgbmFtZWRQYXJhbWV0ZXJzLAogICAgICAgICAgICBuYW1lZFBhcmFtZXRlclR5cGVzLAogICAgICAgICAgICB0eXBlVmFyaWFibGVzKTsKCiAgICAgIGNhc2UgRGFydFR5cGVLaW5kLmludGVyZmFjZVR5cGU6CiAgICAgICAgSW5kZXhlZENsYXNzIGNscyA9IGdldEluZGV4ZWRDbGFzcyhyZWFkSW50KCkpOwogICAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPSBfcmVhZERhcnRUeXBlcyhmdW5jdGlvblR5cGVWYXJpYWJsZXMpOwogICAgICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZShjbHMsIHR5cGVBcmd1bWVudHMpOwogICAgICBjYXNlIERhcnRUeXBlS2luZC50eXBlZGVmOgogICAgICAgIEluZGV4ZWRUeXBlZGVmIHR5cGVkZWYgPSBnZXRJbmRleGVkVHlwZWRlZihyZWFkSW50KCkpOwogICAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPSBfcmVhZERhcnRUeXBlcyhmdW5jdGlvblR5cGVWYXJpYWJsZXMpOwogICAgICAgIERhcnRUeXBlIHVuYWxpYXNlZCA9IF9yZWFkRGFydFR5cGUoZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgICAgICByZXR1cm4gbmV3IFR5cGVkZWZUeXBlKHR5cGVkZWYsIHR5cGVBcmd1bWVudHMsIHVuYWxpYXNlZCk7CiAgICAgIGNhc2UgRGFydFR5cGVLaW5kLmR5bmFtaWNUeXBlOgogICAgICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgICBjYXNlIERhcnRUeXBlS2luZC5mdXR1cmVPcjoKICAgICAgICBEYXJ0VHlwZSB0eXBlQXJndW1lbnQgPSBfcmVhZERhcnRUeXBlKGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICAgICAgcmV0dXJuIG5ldyBGdXR1cmVPclR5cGUodHlwZUFyZ3VtZW50KTsKICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmV4cGVjdGVkIERhcnRUeXBlS2luZCAka2luZCIpOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgcmVhZERhcnRUeXBlTm9kZSh7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgX2NoZWNrRGF0YUtpbmQoRGF0YUtpbmQuZGFydFR5cGVOb2RlKTsKICAgIGlyLkRhcnRUeXBlIHR5cGUgPSBfcmVhZERhcnRUeXBlTm9kZShbXSk7CiAgICBhc3NlcnQodHlwZSAhPSBudWxsIHx8IGFsbG93TnVsbCk7CiAgICByZXR1cm4gdHlwZTsKICB9CgogIGlyLkRhcnRUeXBlIF9yZWFkRGFydFR5cGVOb2RlKExpc3Q8aXIuVHlwZVBhcmFtZXRlcj4gZnVuY3Rpb25UeXBlVmFyaWFibGVzKSB7CiAgICBEYXJ0VHlwZU5vZGVLaW5kIGtpbmQgPSByZWFkRW51bShEYXJ0VHlwZU5vZGVLaW5kLnZhbHVlcyk7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBEYXJ0VHlwZU5vZGVLaW5kLm5vbmU6CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIGNhc2UgRGFydFR5cGVOb2RlS2luZC52b2lkVHlwZToKICAgICAgICByZXR1cm4gY29uc3QgaXIuVm9pZFR5cGUoKTsKICAgICAgY2FzZSBEYXJ0VHlwZU5vZGVLaW5kLmludmFsaWRUeXBlOgogICAgICAgIHJldHVybiBjb25zdCBpci5JbnZhbGlkVHlwZSgpOwogICAgICBjYXNlIERhcnRUeXBlTm9kZUtpbmQuYm90dG9tVHlwZToKICAgICAgICByZXR1cm4gY29uc3QgaXIuQm90dG9tVHlwZSgpOwogICAgICBjYXNlIERhcnRUeXBlTm9kZUtpbmQuZG9lc05vdENvbXBsZXRlOgogICAgICAgIHJldHVybiBjb25zdCBEb2VzTm90Q29tcGxldGVUeXBlKCk7CiAgICAgIGNhc2UgRGFydFR5cGVOb2RlS2luZC50eXBlUGFyYW1ldGVyVHlwZToKICAgICAgICBpci5UeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSByZWFkVHlwZVBhcmFtZXRlck5vZGUoKTsKICAgICAgICBpci5EYXJ0VHlwZSBwcm9tb3RlZEJvdW5kID0gX3JlYWREYXJ0VHlwZU5vZGUoZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgICAgICByZXR1cm4gbmV3IGlyLlR5cGVQYXJhbWV0ZXJUeXBlKHR5cGVQYXJhbWV0ZXIsIHByb21vdGVkQm91bmQpOwogICAgICBjYXNlIERhcnRUeXBlTm9kZUtpbmQuZnVuY3Rpb25UeXBlVmFyaWFibGU6CiAgICAgICAgaW50IGluZGV4ID0gcmVhZEludCgpOwogICAgICAgIGFzc2VydCgwIDw9IGluZGV4ICYmIGluZGV4IDwgZnVuY3Rpb25UeXBlVmFyaWFibGVzLmxlbmd0aCk7CiAgICAgICAgaXIuRGFydFR5cGUgcHJvbW90ZWRCb3VuZCA9IF9yZWFkRGFydFR5cGVOb2RlKGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICAgICAgcmV0dXJuIG5ldyBpci5UeXBlUGFyYW1ldGVyVHlwZSgKICAgICAgICAgICAgZnVuY3Rpb25UeXBlVmFyaWFibGVzW2luZGV4XSwgcHJvbW90ZWRCb3VuZCk7CiAgICAgIGNhc2UgRGFydFR5cGVOb2RlS2luZC5mdW5jdGlvblR5cGU6CiAgICAgICAgYmVnaW4oZnVuY3Rpb25UeXBlTm9kZVRhZyk7CiAgICAgICAgaW50IHR5cGVQYXJhbWV0ZXJDb3VudCA9IHJlYWRJbnQoKTsKICAgICAgICBMaXN0PGlyLlR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzID0KICAgICAgICAgICAgbmV3IExpc3Q8aXIuVHlwZVBhcmFtZXRlcj4uZ2VuZXJhdGUoCiAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyQ291bnQsIChpbnQgaW5kZXgpID0+IG5ldyBpci5UeXBlUGFyYW1ldGVyKCkpOwogICAgICAgIGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyA9CiAgICAgICAgICAgIG5ldyBMaXN0PGlyLlR5cGVQYXJhbWV0ZXI+LmZyb20oZnVuY3Rpb25UeXBlVmFyaWFibGVzKQogICAgICAgICAgICAgIC4uYWRkQWxsKHR5cGVQYXJhbWV0ZXJzKTsKICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgdHlwZVBhcmFtZXRlckNvdW50OyBpbmRleCsrKSB7CiAgICAgICAgICB0eXBlUGFyYW1ldGVyc1tpbmRleF0ubmFtZSA9IHJlYWRTdHJpbmcoKTsKICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzW2luZGV4XS5ib3VuZCA9CiAgICAgICAgICAgICAgX3JlYWREYXJ0VHlwZU5vZGUoZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzW2luZGV4XS5kZWZhdWx0VHlwZSA9CiAgICAgICAgICAgICAgX3JlYWREYXJ0VHlwZU5vZGUoZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgICAgICB9CiAgICAgICAgaXIuRGFydFR5cGUgcmV0dXJuVHlwZSA9IF9yZWFkRGFydFR5cGVOb2RlKGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICAgICAgaW50IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPSByZWFkSW50KCk7CiAgICAgICAgTGlzdDxpci5EYXJ0VHlwZT4gcG9zaXRpb25hbFBhcmFtZXRlcnMgPQogICAgICAgICAgICBfcmVhZERhcnRUeXBlTm9kZXMoZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgICAgICBpbnQgbmFtZWRQYXJhbWV0ZXJDb3VudCA9IHJlYWRJbnQoKTsKICAgICAgICBMaXN0PGlyLk5hbWVkVHlwZT4gbmFtZWRQYXJhbWV0ZXJzID0KICAgICAgICAgICAgbmV3IExpc3Q8aXIuTmFtZWRUeXBlPihuYW1lZFBhcmFtZXRlckNvdW50KTsKICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbmFtZWRQYXJhbWV0ZXJDb3VudDsgaW5kZXgrKykgewogICAgICAgICAgU3RyaW5nIG5hbWUgPSByZWFkU3RyaW5nKCk7CiAgICAgICAgICBpci5EYXJ0VHlwZSB0eXBlID0gX3JlYWREYXJ0VHlwZU5vZGUoZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgICAgICAgIG5hbWVkUGFyYW1ldGVyc1tpbmRleF0gPSBuZXcgaXIuTmFtZWRUeXBlKG5hbWUsIHR5cGUpOwogICAgICAgIH0KICAgICAgICBpci5UeXBlZGVmVHlwZSB0eXBlZGVmVHlwZSA9IF9yZWFkRGFydFR5cGVOb2RlKGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICAgICAgZW5kKGZ1bmN0aW9uVHlwZU5vZGVUYWcpOwogICAgICAgIHJldHVybiBuZXcgaXIuRnVuY3Rpb25UeXBlKHBvc2l0aW9uYWxQYXJhbWV0ZXJzLCByZXR1cm5UeXBlLAogICAgICAgICAgICBuYW1lZFBhcmFtZXRlcnM6IG5hbWVkUGFyYW1ldGVycywKICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnM6IHR5cGVQYXJhbWV0ZXJzLAogICAgICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiByZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgICAgICB0eXBlZGVmVHlwZTogdHlwZWRlZlR5cGUpOwoKICAgICAgY2FzZSBEYXJ0VHlwZU5vZGVLaW5kLmludGVyZmFjZVR5cGU6CiAgICAgICAgaXIuQ2xhc3MgY2xzID0gcmVhZENsYXNzTm9kZSgpOwogICAgICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPQogICAgICAgICAgICBfcmVhZERhcnRUeXBlTm9kZXMoZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgICAgICByZXR1cm4gbmV3IGlyLkludGVyZmFjZVR5cGUoY2xzLCB0eXBlQXJndW1lbnRzKTsKICAgICAgY2FzZSBEYXJ0VHlwZU5vZGVLaW5kLnRoaXNJbnRlcmZhY2VUeXBlOgogICAgICAgIGlyLkNsYXNzIGNscyA9IHJlYWRDbGFzc05vZGUoKTsKICAgICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0KICAgICAgICAgICAgX3JlYWREYXJ0VHlwZU5vZGVzKGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICAgICAgcmV0dXJuIG5ldyBUaGlzSW50ZXJmYWNlVHlwZShjbHMsIHR5cGVBcmd1bWVudHMpOwogICAgICBjYXNlIERhcnRUeXBlTm9kZUtpbmQuZXhhY3RJbnRlcmZhY2VUeXBlOgogICAgICAgIGlyLkNsYXNzIGNscyA9IHJlYWRDbGFzc05vZGUoKTsKICAgICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0KICAgICAgICAgICAgX3JlYWREYXJ0VHlwZU5vZGVzKGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICAgICAgcmV0dXJuIG5ldyBFeGFjdEludGVyZmFjZVR5cGUoY2xzLCB0eXBlQXJndW1lbnRzKTsKICAgICAgY2FzZSBEYXJ0VHlwZU5vZGVLaW5kLnR5cGVkZWY6CiAgICAgICAgaXIuVHlwZWRlZiB0eXBlZGVmID0gcmVhZFR5cGVkZWZOb2RlKCk7CiAgICAgICAgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9CiAgICAgICAgICAgIF9yZWFkRGFydFR5cGVOb2RlcyhmdW5jdGlvblR5cGVWYXJpYWJsZXMpOwogICAgICAgIHJldHVybiBuZXcgaXIuVHlwZWRlZlR5cGUodHlwZWRlZiwgdHlwZUFyZ3VtZW50cyk7CiAgICAgIGNhc2UgRGFydFR5cGVOb2RlS2luZC5keW5hbWljVHlwZToKICAgICAgICByZXR1cm4gY29uc3QgaXIuRHluYW1pY1R5cGUoKTsKICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmV4cGVjdGVkIERhcnRUeXBlS2luZCAka2luZCIpOwogIH0KCiAgX01lbWJlckRhdGEgX3JlYWRNZW1iZXJEYXRhKCkgewogICAgcmV0dXJuIF9tZW1iZXJOb2RlSW5kZXgucmVhZChfcmVhZE1lbWJlckRhdGFJbnRlcm5hbCk7CiAgfQoKICBfTWVtYmVyRGF0YSBfcmVhZE1lbWJlckRhdGFJbnRlcm5hbCgpIHsKICAgIE1lbWJlckNvbnRleHRLaW5kIGtpbmQgPSBfcmVhZEVudW1JbnRlcm5hbChNZW1iZXJDb250ZXh0S2luZC52YWx1ZXMpOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgTWVtYmVyQ29udGV4dEtpbmQuY2xzOgogICAgICAgIF9DbGFzc0RhdGEgY2xzID0gX3JlYWRDbGFzc0RhdGEoKTsKICAgICAgICBTdHJpbmcgbmFtZSA9IF9yZWFkU3RyaW5nKCk7CiAgICAgICAgcmV0dXJuIGNscy5sb29rdXBNZW1iZXIobmFtZSk7CiAgICAgIGNhc2UgTWVtYmVyQ29udGV4dEtpbmQubGlicmFyeToKICAgICAgICBfTGlicmFyeURhdGEgbGlicmFyeSA9IF9yZWFkTGlicmFyeURhdGEoKTsKICAgICAgICBTdHJpbmcgbmFtZSA9IF9yZWFkU3RyaW5nKCk7CiAgICAgICAgcmV0dXJuIGxpYnJhcnkubG9va3VwTWVtYmVyKG5hbWUpOwogICAgfQogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuc3VwcG9ydGVkIF9NZW1iZXJLaW5kICRraW5kIik7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5NZW1iZXIgcmVhZE1lbWJlck5vZGUoKSB7CiAgICBfY2hlY2tEYXRhS2luZChEYXRhS2luZC5tZW1iZXJOb2RlKTsKICAgIHJldHVybiBfcmVhZE1lbWJlckRhdGEoKS5ub2RlOwogIH0KCiAgX0NsYXNzRGF0YSBfcmVhZENsYXNzRGF0YSgpIHsKICAgIF9MaWJyYXJ5RGF0YSBsaWJyYXJ5ID0gX3JlYWRMaWJyYXJ5RGF0YSgpOwogICAgU3RyaW5nIG5hbWUgPSBfcmVhZFN0cmluZygpOwogICAgcmV0dXJuIGxpYnJhcnkubG9va3VwQ2xhc3MobmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5DbGFzcyByZWFkQ2xhc3NOb2RlKCkgewogICAgX2NoZWNrRGF0YUtpbmQoRGF0YUtpbmQuY2xhc3NOb2RlKTsKICAgIHJldHVybiBfcmVhZENsYXNzRGF0YSgpLm5vZGU7CiAgfQoKICBpci5UeXBlZGVmIF9yZWFkVHlwZWRlZk5vZGUoKSB7CiAgICBfTGlicmFyeURhdGEgbGlicmFyeSA9IF9yZWFkTGlicmFyeURhdGEoKTsKICAgIFN0cmluZyBuYW1lID0gX3JlYWRTdHJpbmcoKTsKICAgIHJldHVybiBsaWJyYXJ5Lmxvb2t1cFR5cGVkZWYobmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5UeXBlZGVmIHJlYWRUeXBlZGVmTm9kZSgpIHsKICAgIF9jaGVja0RhdGFLaW5kKERhdGFLaW5kLnR5cGVkZWZOb2RlKTsKICAgIHJldHVybiBfcmVhZFR5cGVkZWZOb2RlKCk7CiAgfQoKICBfTGlicmFyeURhdGEgX3JlYWRMaWJyYXJ5RGF0YSgpIHsKICAgIFVyaSBjYW5vbmljYWxVcmkgPSBfcmVhZFVyaSgpOwogICAgcmV0dXJuIGNvbXBvbmVudExvb2t1cC5nZXRMaWJyYXJ5RGF0YUJ5VXJpKGNhbm9uaWNhbFVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5MaWJyYXJ5IHJlYWRMaWJyYXJ5Tm9kZSgpIHsKICAgIF9jaGVja0RhdGFLaW5kKERhdGFLaW5kLmxpYnJhcnlOb2RlKTsKICAgIHJldHVybiBfcmVhZExpYnJhcnlEYXRhKCkubm9kZTsKICB9CgogIEBvdmVycmlkZQogIEUgcmVhZEVudW08RT4oTGlzdDxFPiB2YWx1ZXMpIHsKICAgIF9jaGVja0RhdGFLaW5kKERhdGFLaW5kLmVudW1WYWx1ZSk7CiAgICByZXR1cm4gX3JlYWRFbnVtSW50ZXJuYWwodmFsdWVzKTsKICB9CgogIEBvdmVycmlkZQogIFVyaSByZWFkVXJpKCkgewogICAgX2NoZWNrRGF0YUtpbmQoRGF0YUtpbmQudXJpKTsKICAgIHJldHVybiBfcmVhZFVyaSgpOwogIH0KCiAgVXJpIF9yZWFkVXJpKCkgewogICAgcmV0dXJuIF91cmlJbmRleC5yZWFkKF9yZWFkVXJpSW50ZXJuYWwpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCByZWFkQm9vbCgpIHsKICAgIF9jaGVja0RhdGFLaW5kKERhdGFLaW5kLmJvb2wpOwogICAgcmV0dXJuIF9yZWFkQm9vbCgpOwogIH0KCiAgYm9vbCBfcmVhZEJvb2woKSB7CiAgICBpbnQgdmFsdWUgPSBfcmVhZEludEludGVybmFsKCk7CiAgICBhc3NlcnQodmFsdWUgPT0gMCB8fCB2YWx1ZSA9PSAxKTsKICAgIHJldHVybiB2YWx1ZSA9PSAxOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHJlYWRTdHJpbmcoKSB7CiAgICBfY2hlY2tEYXRhS2luZChEYXRhS2luZC5zdHJpbmcpOwogICAgcmV0dXJuIF9yZWFkU3RyaW5nKCk7CiAgfQoKICBTdHJpbmcgX3JlYWRTdHJpbmcoKSB7CiAgICByZXR1cm4gX3N0cmluZ0luZGV4LnJlYWQoX3JlYWRTdHJpbmdJbnRlcm5hbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgcmVhZEludCgpIHsKICAgIF9jaGVja0RhdGFLaW5kKERhdGFLaW5kLnVpbnQzMCk7CiAgICByZXR1cm4gX3JlYWRJbnRJbnRlcm5hbCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuVHJlZU5vZGUgcmVhZFRyZWVOb2RlKCkgewogICAgX2NoZWNrRGF0YUtpbmQoRGF0YUtpbmQudHJlZU5vZGUpOwogICAgcmV0dXJuIF9yZWFkVHJlZU5vZGUoKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgcmVhZENvbnN0YW50KCkgewogICAgX2NoZWNrRGF0YUtpbmQoRGF0YUtpbmQuY29uc3RhbnQpOwogICAgcmV0dXJuIF9yZWFkQ29uc3RhbnQoKTsKICB9CgogIEBvdmVycmlkZQogIGRvdWJsZSByZWFkRG91YmxlVmFsdWUoKSB7CiAgICBfY2hlY2tEYXRhS2luZChEYXRhS2luZC5kb3VibGUpOwogICAgcmV0dXJuIF9yZWFkRG91YmxlVmFsdWUoKTsKICB9CgogIGRvdWJsZSBfcmVhZERvdWJsZVZhbHVlKCkgewogICAgQnl0ZURhdGEgZGF0YSA9IG5ldyBCeXRlRGF0YSg4KTsKICAgIGRhdGEuc2V0VWludDE2KDAsIHJlYWRJbnQoKSk7CiAgICBkYXRhLnNldFVpbnQxNigyLCByZWFkSW50KCkpOwogICAgZGF0YS5zZXRVaW50MTYoNCwgcmVhZEludCgpKTsKICAgIGRhdGEuc2V0VWludDE2KDYsIHJlYWRJbnQoKSk7CiAgICByZXR1cm4gZGF0YS5nZXRGbG9hdDY0KDApOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHJlYWRJbnRlZ2VyVmFsdWUoKSB7CiAgICBfY2hlY2tEYXRhS2luZChEYXRhS2luZC5pbnQpOwogICAgcmV0dXJuIF9yZWFkQmlnSW50KCkudG9JbnQoKTsKICB9CgogIEJpZ0ludCBfcmVhZEJpZ0ludCgpIHsKICAgIHJldHVybiBCaWdJbnQucGFyc2UocmVhZFN0cmluZygpKTsKICB9CgogIENvbnN0YW50VmFsdWUgX3JlYWRDb25zdGFudCgpIHsKICAgIENvbnN0YW50VmFsdWVLaW5kIGtpbmQgPSBfcmVhZEVudW1JbnRlcm5hbChDb25zdGFudFZhbHVlS2luZC52YWx1ZXMpOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgQ29uc3RhbnRWYWx1ZUtpbmQuQk9PTDoKICAgICAgICBib29sIHZhbHVlID0gcmVhZEJvb2woKTsKICAgICAgICByZXR1cm4gbmV3IEJvb2xDb25zdGFudFZhbHVlKHZhbHVlKTsKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5JTlQ6CiAgICAgICAgQmlnSW50IHZhbHVlID0gX3JlYWRCaWdJbnQoKTsKICAgICAgICByZXR1cm4gbmV3IEludENvbnN0YW50VmFsdWUodmFsdWUpOwogICAgICBjYXNlIENvbnN0YW50VmFsdWVLaW5kLkRPVUJMRToKICAgICAgICBkb3VibGUgdmFsdWUgPSBfcmVhZERvdWJsZVZhbHVlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBEb3VibGVDb25zdGFudFZhbHVlKHZhbHVlKTsKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5TVFJJTkc6CiAgICAgICAgU3RyaW5nIHZhbHVlID0gcmVhZFN0cmluZygpOwogICAgICAgIHJldHVybiBuZXcgU3RyaW5nQ29uc3RhbnRWYWx1ZSh2YWx1ZSk7CiAgICAgIGNhc2UgQ29uc3RhbnRWYWx1ZUtpbmQuTlVMTDoKICAgICAgICByZXR1cm4gY29uc3QgTnVsbENvbnN0YW50VmFsdWUoKTsKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5GVU5DVElPTjoKICAgICAgICBJbmRleGVkRnVuY3Rpb24gZnVuY3Rpb24gPSByZWFkTWVtYmVyKCk7CiAgICAgICAgRGFydFR5cGUgdHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25Db25zdGFudFZhbHVlKGZ1bmN0aW9uLCB0eXBlKTsKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5MSVNUOgogICAgICAgIERhcnRUeXBlIHR5cGUgPSByZWFkRGFydFR5cGUoKTsKICAgICAgICBMaXN0PENvbnN0YW50VmFsdWU+IGVudHJpZXMgPSByZWFkQ29uc3RhbnRzKCk7CiAgICAgICAgcmV0dXJuIG5ldyBMaXN0Q29uc3RhbnRWYWx1ZSh0eXBlLCBlbnRyaWVzKTsKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5TRVQ6CiAgICAgICAgRGFydFR5cGUgdHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIE1hcENvbnN0YW50VmFsdWUgZW50cmllcyA9IHJlYWRDb25zdGFudCgpOwogICAgICAgIHJldHVybiBuZXcgY29uc3RhbnRfc3lzdGVtLkphdmFTY3JpcHRTZXRDb25zdGFudCh0eXBlLCBlbnRyaWVzKTsKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5NQVA6CiAgICAgICAgRGFydFR5cGUgdHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIExpc3RDb25zdGFudFZhbHVlIGtleUxpc3QgPSByZWFkQ29uc3RhbnQoKTsKICAgICAgICBMaXN0PENvbnN0YW50VmFsdWU+IHZhbHVlcyA9IHJlYWRDb25zdGFudHMoKTsKICAgICAgICBDb25zdGFudFZhbHVlIHByb3RvVmFsdWUgPSByZWFkQ29uc3RhbnRPck51bGwoKTsKICAgICAgICBib29sIG9ubHlTdHJpbmdLZXlzID0gcmVhZEJvb2woKTsKICAgICAgICByZXR1cm4gbmV3IGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0TWFwQ29uc3RhbnQoCiAgICAgICAgICAgIHR5cGUsIGtleUxpc3QsIHZhbHVlcywgcHJvdG9WYWx1ZSwgb25seVN0cmluZ0tleXMpOwogICAgICBjYXNlIENvbnN0YW50VmFsdWVLaW5kLkNPTlNUUlVDVEVEOgogICAgICAgIEludGVyZmFjZVR5cGUgdHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIE1hcDxGaWVsZEVudGl0eSwgQ29uc3RhbnRWYWx1ZT4gZmllbGRzID0KICAgICAgICAgICAgcmVhZE1lbWJlck1hcDxGaWVsZEVudGl0eSwgQ29uc3RhbnRWYWx1ZT4oKCkgPT4gcmVhZENvbnN0YW50KCkpOwogICAgICAgIHJldHVybiBuZXcgQ29uc3RydWN0ZWRDb25zdGFudFZhbHVlKHR5cGUsIGZpZWxkcyk7CiAgICAgIGNhc2UgQ29uc3RhbnRWYWx1ZUtpbmQuVFlQRToKICAgICAgICBEYXJ0VHlwZSByZXByZXNlbnRlZFR5cGUgPSByZWFkRGFydFR5cGUoKTsKICAgICAgICBEYXJ0VHlwZSB0eXBlID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBUeXBlQ29uc3RhbnRWYWx1ZShyZXByZXNlbnRlZFR5cGUsIHR5cGUpOwogICAgICBjYXNlIENvbnN0YW50VmFsdWVLaW5kLklOU1RBTlRJQVRJT046CiAgICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9IHJlYWREYXJ0VHlwZXMoKTsKICAgICAgICBDb25zdGFudFZhbHVlIGZ1bmN0aW9uID0gcmVhZENvbnN0YW50KCk7CiAgICAgICAgcmV0dXJuIG5ldyBJbnN0YW50aWF0aW9uQ29uc3RhbnRWYWx1ZSh0eXBlQXJndW1lbnRzLCBmdW5jdGlvbik7CiAgICAgIGNhc2UgQ29uc3RhbnRWYWx1ZUtpbmQuTk9OX0NPTlNUQU5UOgogICAgICAgIHJldHVybiBuZXcgTm9uQ29uc3RhbnRWYWx1ZSgpOwogICAgICBjYXNlIENvbnN0YW50VmFsdWVLaW5kLkRFRkVSUkVEX0dMT0JBTDoKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5JTlRFUkNFUFRPUjoKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5TWU5USEVUSUM6CiAgICAgICAgLy8gVGhlc2UgYXJlIG9ubHkgY3JlYXRlZCBpbiB0aGUgU1NBIGdyYXBoIGJ1aWxkZXIuCiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuc3VwcG9ydGVkIGNvbnN0YW50IHZhbHVlIGtpbmQgJHtraW5kfS4iKTsKICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmV4cGV4dGVkIGNvbnN0YW50IHZhbHVlIGtpbmQgJHtraW5kfS4iKTsKICB9CgogIGlyLlRyZWVOb2RlIF9yZWFkVHJlZU5vZGUoKSB7CiAgICBfVHJlZU5vZGVLaW5kIGtpbmQgPSBfcmVhZEVudW1JbnRlcm5hbChfVHJlZU5vZGVLaW5kLnZhbHVlcyk7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBfVHJlZU5vZGVLaW5kLmNsczoKICAgICAgICByZXR1cm4gX3JlYWRDbGFzc0RhdGEoKS5ub2RlOwogICAgICBjYXNlIF9UcmVlTm9kZUtpbmQubWVtYmVyOgogICAgICAgIHJldHVybiBfcmVhZE1lbWJlckRhdGEoKS5ub2RlOwogICAgICBjYXNlIF9UcmVlTm9kZUtpbmQuZnVuY3Rpb25EZWNsYXJhdGlvblZhcmlhYmxlOgogICAgICAgIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24gZnVuY3Rpb25EZWNsYXJhdGlvbiA9IF9yZWFkVHJlZU5vZGUoKTsKICAgICAgICByZXR1cm4gZnVuY3Rpb25EZWNsYXJhdGlvbi52YXJpYWJsZTsKICAgICAgY2FzZSBfVHJlZU5vZGVLaW5kLmZ1bmN0aW9uTm9kZToKICAgICAgICByZXR1cm4gX3JlYWRGdW5jdGlvbk5vZGUoKTsKICAgICAgY2FzZSBfVHJlZU5vZGVLaW5kLnR5cGVQYXJhbWV0ZXI6CiAgICAgICAgcmV0dXJuIF9yZWFkVHlwZVBhcmFtZXRlcigpOwogICAgICBjYXNlIF9UcmVlTm9kZUtpbmQuY29uc3RhbnQ6CiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3VwcG9ydCBzZXJpYWxpemF0aW9uIHdpdGhpbiBhIG1lbWJlciBjb250ZXh0CiAgICAgICAgLy8gYW5kIHVzZSB0aGlzIHRvIHRlbXBvcmFyaWx5IGNhY2hlIGNvbnN0YW50IG5vZGUgaW5kaWNlcy4KICAgICAgICBpci5Db25zdGFudEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IF9yZWFkVHJlZU5vZGUoKTsKICAgICAgICBfQ29uc3RhbnROb2RlSW5kZXhlclZpc2l0b3IgaW5kZXhlciA9IG5ldyBfQ29uc3RhbnROb2RlSW5kZXhlclZpc2l0b3IoKTsKICAgICAgICBleHByZXNzaW9uLmNvbnN0YW50LmFjY2VwdChpbmRleGVyKTsKICAgICAgICBpci5Db25zdGFudCBjb25zdGFudCA9IGluZGV4ZXIuZ2V0Q29uc3RhbnQoX3JlYWRJbnRJbnRlcm5hbCgpKTsKICAgICAgICByZXR1cm4gbmV3IENvbnN0YW50UmVmZXJlbmNlKGV4cHJlc3Npb24sIGNvbnN0YW50KTsKICAgICAgY2FzZSBfVHJlZU5vZGVLaW5kLm5vZGU6CiAgICAgICAgX01lbWJlckRhdGEgZGF0YSA9IF9yZWFkTWVtYmVyRGF0YSgpOwogICAgICAgIGludCBpbmRleCA9IF9yZWFkSW50SW50ZXJuYWwoKTsKICAgICAgICBpci5UcmVlTm9kZSB0cmVlTm9kZSA9IGRhdGEuZ2V0VHJlZU5vZGVCeUluZGV4KGluZGV4KTsKICAgICAgICBhc3NlcnQodHJlZU5vZGUgIT0gbnVsbCwKICAgICAgICAgICAgIk5vIFRyZWVOb2RlIGZvdW5kIGZvciBpbmRleCAkaW5kZXggaW4gJHtkYXRhLm5vZGV9LiRfZXJyb3JDb250ZXh0Iik7CiAgICAgICAgcmV0dXJuIHRyZWVOb2RlOwogICAgfQogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuZXhwZWN0ZWQgX1RyZWVOb2RlS2luZCAka2luZCIpOwogIH0KCiAgaXIuRnVuY3Rpb25Ob2RlIF9yZWFkRnVuY3Rpb25Ob2RlKCkgewogICAgX0Z1bmN0aW9uTm9kZUtpbmQga2luZCA9IF9yZWFkRW51bUludGVybmFsKF9GdW5jdGlvbk5vZGVLaW5kLnZhbHVlcyk7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBfRnVuY3Rpb25Ob2RlS2luZC5wcm9jZWR1cmU6CiAgICAgICAgaXIuUHJvY2VkdXJlIHByb2NlZHVyZSA9IF9yZWFkTWVtYmVyRGF0YSgpLm5vZGU7CiAgICAgICAgcmV0dXJuIHByb2NlZHVyZS5mdW5jdGlvbjsKICAgICAgY2FzZSBfRnVuY3Rpb25Ob2RlS2luZC5jb25zdHJ1Y3RvcjoKICAgICAgICBpci5Db25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IF9yZWFkTWVtYmVyRGF0YSgpLm5vZGU7CiAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLmZ1bmN0aW9uOwogICAgICBjYXNlIF9GdW5jdGlvbk5vZGVLaW5kLmZ1bmN0aW9uRXhwcmVzc2lvbjoKICAgICAgICBpci5GdW5jdGlvbkV4cHJlc3Npb24gZnVuY3Rpb25FeHByZXNzaW9uID0gX3JlYWRUcmVlTm9kZSgpOwogICAgICAgIHJldHVybiBmdW5jdGlvbkV4cHJlc3Npb24uZnVuY3Rpb247CiAgICAgIGNhc2UgX0Z1bmN0aW9uTm9kZUtpbmQuZnVuY3Rpb25EZWNsYXJhdGlvbjoKICAgICAgICBpci5GdW5jdGlvbkRlY2xhcmF0aW9uIGZ1bmN0aW9uRGVjbGFyYXRpb24gPSBfcmVhZFRyZWVOb2RlKCk7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uRGVjbGFyYXRpb24uZnVuY3Rpb247CiAgICB9CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5leHBlY3RlZCBfRnVuY3Rpb25Ob2RlS2luZCAka2luZCIpOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuVHlwZVBhcmFtZXRlciByZWFkVHlwZVBhcmFtZXRlck5vZGUoKSB7CiAgICBfY2hlY2tEYXRhS2luZChEYXRhS2luZC50eXBlUGFyYW1ldGVyTm9kZSk7CiAgICByZXR1cm4gX3JlYWRUeXBlUGFyYW1ldGVyKCk7CiAgfQoKICBpci5UeXBlUGFyYW1ldGVyIF9yZWFkVHlwZVBhcmFtZXRlcigpIHsKICAgIF9UeXBlUGFyYW1ldGVyS2luZCBraW5kID0gX3JlYWRFbnVtSW50ZXJuYWwoX1R5cGVQYXJhbWV0ZXJLaW5kLnZhbHVlcyk7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBfVHlwZVBhcmFtZXRlcktpbmQuY2xzOgogICAgICAgIGlyLkNsYXNzIGNscyA9IF9yZWFkQ2xhc3NEYXRhKCkubm9kZTsKICAgICAgICByZXR1cm4gY2xzLnR5cGVQYXJhbWV0ZXJzW19yZWFkSW50SW50ZXJuYWwoKV07CiAgICAgIGNhc2UgX1R5cGVQYXJhbWV0ZXJLaW5kLmZ1bmN0aW9uTm9kZToKICAgICAgICBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb25Ob2RlID0gX3JlYWRGdW5jdGlvbk5vZGUoKTsKICAgICAgICByZXR1cm4gZnVuY3Rpb25Ob2RlLnR5cGVQYXJhbWV0ZXJzW19yZWFkSW50SW50ZXJuYWwoKV07CiAgICB9CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5leHBlY3RlZCBfVHlwZVBhcmFtZXRlcktpbmQga2luZCAka2luZCIpOwogIH0KCiAgdm9pZCBfY2hlY2tEYXRhS2luZChEYXRhS2luZCBleHBlY3RlZEtpbmQpIHsKICAgIGlmICghdXNlRGF0YUtpbmRzKSByZXR1cm47CiAgICBEYXRhS2luZCBhY3R1YWxLaW5kID0gX3JlYWRFbnVtSW50ZXJuYWwoRGF0YUtpbmQudmFsdWVzKTsKICAgIGFzc2VydCgKICAgICAgICBhY3R1YWxLaW5kID09IGV4cGVjdGVkS2luZCwKICAgICAgICAiSW52YWxpZCBkYXRhIGtpbmQuICIKICAgICAgICAiRXhwZWN0ZWQgJGV4cGVjdGVkS2luZCwgZm91bmQgJGFjdHVhbEtpbmQuJF9lcnJvckNvbnRleHQiKTsKICB9CgogIEBvdmVycmlkZQogIExvY2FsIHJlYWRMb2NhbCgpIHsKICAgIExvY2FsS2luZCBraW5kID0gcmVhZEVudW0oTG9jYWxLaW5kLnZhbHVlcyk7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBMb2NhbEtpbmQuakxvY2FsOgogICAgICAgIE1lbWJlckVudGl0eSBtZW1iZXJDb250ZXh0ID0gcmVhZE1lbWJlcigpOwogICAgICAgIGludCBsb2NhbEluZGV4ID0gcmVhZEludCgpOwogICAgICAgIHJldHVybiBsb2NhbExvb2t1cC5nZXRMb2NhbEJ5SW5kZXgobWVtYmVyQ29udGV4dCwgbG9jYWxJbmRleCk7CiAgICAgIGNhc2UgTG9jYWxLaW5kLnRoaXNMb2NhbDoKICAgICAgICBDbGFzc0VudGl0eSBjbHMgPSByZWFkQ2xhc3MoKTsKICAgICAgICByZXR1cm4gbmV3IFRoaXNMb2NhbChjbHMpOwogICAgICBjYXNlIExvY2FsS2luZC5ib3hMb2NhbDoKICAgICAgICBDbGFzc0VudGl0eSBjbHMgPSByZWFkQ2xhc3MoKTsKICAgICAgICByZXR1cm4gbmV3IEJveExvY2FsKGNscyk7CiAgICAgIGNhc2UgTG9jYWxLaW5kLmFub255bW91c0Nsb3N1cmVMb2NhbDoKICAgICAgICBDbGFzc0VudGl0eSBjbHMgPSByZWFkQ2xhc3MoKTsKICAgICAgICByZXR1cm4gbmV3IEFub255bW91c0Nsb3N1cmVMb2NhbChjbHMpOwogICAgICBjYXNlIExvY2FsS2luZC50eXBlVmFyaWFibGVMb2NhbDoKICAgICAgICBUeXBlVmFyaWFibGVUeXBlIHR5cGVWYXJpYWJsZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIHJldHVybiBuZXcgVHlwZVZhcmlhYmxlTG9jYWwodHlwZVZhcmlhYmxlKTsKICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmV4cGVjdGVkIGxvY2FsIGtpbmQgJGtpbmQiKTsKICB9CgogIEBvdmVycmlkZQogIEltcG9ydEVudGl0eSByZWFkSW1wb3J0KCkgewogICAgX2NoZWNrRGF0YUtpbmQoRGF0YUtpbmQuaW1wb3J0KTsKICAgIHJldHVybiBfcmVhZEltcG9ydCgpOwogIH0KCiAgSW1wb3J0RW50aXR5IF9yZWFkSW1wb3J0KCkgewogICAgcmV0dXJuIF9pbXBvcnRJbmRleC5yZWFkKF9yZWFkSW1wb3J0SW50ZXJuYWwpOwogIH0KCiAgSW1wb3J0RW50aXR5IF9yZWFkSW1wb3J0SW50ZXJuYWwoKSB7CiAgICBTdHJpbmcgbmFtZSA9IHJlYWRTdHJpbmdPck51bGwoKTsKICAgIFVyaSB1cmkgPSBfcmVhZFVyaSgpOwogICAgVXJpIGVuY2xvc2luZ0xpYnJhcnlVcmkgPSBfcmVhZFVyaSgpOwogICAgYm9vbCBpc0RlZmVycmVkID0gX3JlYWRCb29sKCk7CiAgICByZXR1cm4gbmV3IEltcG9ydEVudGl0eShpc0RlZmVycmVkLCBuYW1lLCB1cmksIGVuY2xvc2luZ0xpYnJhcnlVcmkpOwogIH0KCiAgLy8vIEFjdHVhbCBkZXNlcmlhbGl6YXRpb24gb2YgYSBzZWN0aW9uIGJlZ2luIHRhZywgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy4KICB2b2lkIF9iZWdpbihTdHJpbmcgdGFnKTsKCiAgLy8vIEFjdHVhbCBkZXNlcmlhbGl6YXRpb24gb2YgYSBzZWN0aW9uIGVuZCB0YWcsIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMuCiAgdm9pZCBfZW5kKFN0cmluZyB0YWcpOwoKICAvLy8gQWN0dWFsIGRlc2VyaWFsaXphdGlvbiBvZiBhIHN0cmluZyB2YWx1ZSwgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy4KICBTdHJpbmcgX3JlYWRTdHJpbmdJbnRlcm5hbCgpOwoKICAvLy8gQWN0dWFsIGRlc2VyaWFsaXphdGlvbiBvZiBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHZhbHVlLCBpbXBsZW1lbnRlZCBieQogIC8vLyBzdWJjbGFzc2VzLgogIGludCBfcmVhZEludEludGVybmFsKCk7CgogIC8vLyBBY3R1YWwgZGVzZXJpYWxpemF0aW9uIG9mIGEgVVJJIHZhbHVlLCBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzLgogIFVyaSBfcmVhZFVyaUludGVybmFsKCk7CgogIC8vLyBBY3R1YWwgZGVzZXJpYWxpemF0aW9uIG9mIGFuIGVudW0gdmFsdWUgaW4gW3ZhbHVlc10sIGltcGxlbWVudGVkIGJ5CiAgLy8vIHN1YmNsYXNzZXMuCiAgRSBfcmVhZEVudW1JbnRlcm5hbDxFPihMaXN0PEU+IHZhbHVlcyk7CgogIC8vLyBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBkYXRhIHNvdXJjZQogIC8vLyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBpbiBjb25zaXN0ZW5jaWVzIGJldHdlZW4gc2VyaWFsaXphdGlvbiBhbmQKICAvLy8gZGVzZXJpYWxpemF0aW9uLgogIFN0cmluZyBnZXQgX2Vycm9yQ29udGV4dDsKfQqCjwBOTjwBHgFNGTocGyQeHAEmIC8sATABMzQuPToEAQwbIwQBDBkhBAEMQiYoBAEoJh0EAQw5IyIEASIjGgQBDDYiIAQBICIZBAEMG00bBAEMISkEAQwdJwQBDCEpBAEMHygEATg0ATIwATg0ATUyAUc+ASE6GzYyOwYSBAEoNhs8Mj8GEgQBDCApGiQiLAQBDDMnJycRBAFNNxQeFSIhJkguH0QtJiszR0EgRydCTQpETzAzLTMnOjstCiEYHCQdIRwBJzdONiE/TkNDJSQiRi8GQQQBDDorLicRBAFQPxQiFSYkKScoJi0sL0JORzIfRE4pOiokLDAxTCBDKEM1KDguOApLMDE3LS05RCZHQQpPIkUuLDwnASsoKjc5LygqNzowKCo3OyUwKjc7KScGQQQBIjsEASpKFCIrJScmMyUrBkEEAQwfKSMEASAvISYEAQwdKCIEASIvISgEAQwhKh8EASQjPgQBDCEqJAQBDCIoJgQBDBIiFwQBEy0EAQwUIxgEARUkJhcEAQwYJRoEARkzBAEMEiUfBAEMHyccBAEMISccBAEMHSUfBAEeJSIiIiIfBAEMGyIiBAEZJwQBIkoUIyEtIiYsJSsvJSUvIyonMSg6Iyg3NSIoM0kiKDQ2OSo6QCotMU07IzMoPSw4MUgrJy4qKDxQBksEASBCFB4mISc2Ri0nJCglI05EPFEtSDwfLig/IVIZBkIEAShKFCg5Iyo9JTFELDJGLQZGBAEMLTAhBAEqTBQjLjcsPEAGTAQBLx8+DCQeRQQBDBYxFB0zJEcgJyMfJyIsJy8oODQGPwQBDB4lGgQBHzMEAScmGiojSQQBUBsBThkBSyABTRIaAUgaAUoSKgFORhccAgE3cGFja2FnZTpjb21waWxlci9zcmMvc2VyaWFsaXphdGlvbi9hYnN0cmFjdF9zb3VyY2UuZGFydDxzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9zZXJpYWxpemF0aW9uL2JpbmFyeV9zaW5rLmRhcnSHey8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mICdzZXJpYWxpemF0aW9uLmRhcnQnOwoKLy8vIFtEYXRhU2lua10gdGhhdCB3cml0ZXMgZGF0YSBhcyBhIHNlcXVlbmNlIG9mIGJ5dGVzLgovLy8KLy8vIFRoaXMgZGF0YSBzaW5rIHdvcmtzIHRvZ2V0aGVyIHdpdGggW0JpbmFyeVNvdXJjZV0uCmNsYXNzIEJpbmFyeVNpbmsgZXh0ZW5kcyBBYnN0cmFjdERhdGFTaW5rIHsKICBmaW5hbCBTaW5rPExpc3Q8aW50Pj4gc2luazsKICBCdWZmZXJlZFNpbmsgX2J1ZmZlcmVkU2luazsKICBpbnQgX2xlbmd0aCA9IDA7CgogIEJpbmFyeVNpbmsodGhpcy5zaW5rLCB7Ym9vbCB1c2VEYXRhS2luZHM6IGZhbHNlfSkKICAgICAgOiBfYnVmZmVyZWRTaW5rID0gbmV3IEJ1ZmZlcmVkU2luayhzaW5rKSwKICAgICAgICBzdXBlcih1c2VEYXRhS2luZHM6IHVzZURhdGFLaW5kcyk7CgogIEBvdmVycmlkZQogIHZvaWQgX2JlZ2luKFN0cmluZyB0YWcpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFN1cHBvcnQgdGFncyBpbiBiaW5hcnkgc2VyaWFsaXphdGlvbj8KICB9CiAgQG92ZXJyaWRlCiAgdm9pZCBfZW5kKFN0cmluZyB0YWcpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFN1cHBvcnQgdGFncyBpbiBiaW5hcnkgc2VyaWFsaXphdGlvbj8KICB9CgogIEBvdmVycmlkZQogIHZvaWQgX3dyaXRlVXJpSW50ZXJuYWwoVXJpIHZhbHVlKSB7CiAgICBfd3JpdGVTdHJpbmcodmFsdWUudG9TdHJpbmcoKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF93cml0ZVN0cmluZ0ludGVybmFsKFN0cmluZyB2YWx1ZSkgewogICAgTGlzdDxpbnQ+IGJ5dGVzID0gdXRmOC5lbmNvZGUodmFsdWUpOwogICAgX3dyaXRlSW50SW50ZXJuYWwoYnl0ZXMubGVuZ3RoKTsKICAgIF9idWZmZXJlZFNpbmsuYWRkQnl0ZXMoYnl0ZXMpOwogICAgX2xlbmd0aCArPSBieXRlcy5sZW5ndGg7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF93cml0ZUludEludGVybmFsKGludCB2YWx1ZSkgewogICAgYXNzZXJ0KHZhbHVlID49IDAgJiYgdmFsdWUgPj4gMzAgPT0gMCk7CiAgICBpZiAodmFsdWUgPCAweDgwKSB7CiAgICAgIF9idWZmZXJlZFNpbmsuYWRkQnl0ZSh2YWx1ZSk7CiAgICAgIF9sZW5ndGggKz0gMTsKICAgIH0gZWxzZSBpZiAodmFsdWUgPCAweDQwMDApIHsKICAgICAgX2J1ZmZlcmVkU2luay5hZGRCeXRlMigodmFsdWUgPj4gOCkgfCAweDgwLCB2YWx1ZSAmIDB4RkYpOwogICAgICBfbGVuZ3RoICs9IDI7CiAgICB9IGVsc2UgewogICAgICBfYnVmZmVyZWRTaW5rLmFkZEJ5dGU0KCh2YWx1ZSA+PiAyNCkgfCAweEMwLCAodmFsdWUgPj4gMTYpICYgMHhGRiwKICAgICAgICAgICh2YWx1ZSA+PiA4KSAmIDB4RkYsIHZhbHVlICYgMHhGRik7CiAgICAgIF9sZW5ndGggKz0gNDsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgX3dyaXRlRW51bUludGVybmFsKGR5bmFtaWMgdmFsdWUpIHsKICAgIF93cml0ZUludEludGVybmFsKHZhbHVlLmluZGV4KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2xvc2UoKSB7CiAgICBfYnVmZmVyZWRTaW5rLmZsdXNoQW5kRGVzdHJveSgpOwogICAgX2J1ZmZlcmVkU2luayA9IG51bGw7CiAgICBzaW5rLmNsb3NlKCk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gdGhpcyBkYXRhIHNpbmsuCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsZW5ndGggPT4gX2xlbmd0aDsKfQpKAE5OPAEeATgENyweHhMBNDArAQwcQgQMGkIEAQwmJAQBDCwqJSMdBAEMJiwYJBQhQRQNSS4UBgQBDCskBAEMESUaEgQBPQwdAgEzcGFja2FnZTpjb21waWxlci9zcmMvc2VyaWFsaXphdGlvbi9iaW5hcnlfc2luay5kYXJ0PnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3NlcmlhbGl6YXRpb24vYmluYXJ5X3NvdXJjZS5kYXJ0hxkvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiAnc2VyaWFsaXphdGlvbi5kYXJ0JzsKCi8vLyBbRGF0YVNvdXJjZV0gdGhhdCByZWFkcyBkYXRhIGZyb20gYSBzZXF1ZW5jZSBvZiBieXRlcy4KLy8vCi8vLyBUaGlzIGRhdGEgc291cmNlIHdvcmtzIHRvZ2V0aGVyIHdpdGggW0JpbmFyeVNpbmtdLgpjbGFzcyBCaW5hcnlTb3VyY2VJbXBsIGV4dGVuZHMgQWJzdHJhY3REYXRhU291cmNlIHsKICBpbnQgX2J5dGVPZmZzZXQgPSAwOwogIGZpbmFsIExpc3Q8aW50PiBfYnl0ZXM7CgogIEJpbmFyeVNvdXJjZUltcGwodGhpcy5fYnl0ZXMsIHtib29sIHVzZURhdGFLaW5kczogZmFsc2V9KQogICAgICA6IHN1cGVyKHVzZURhdGFLaW5kczogdXNlRGF0YUtpbmRzKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBfYmVnaW4oU3RyaW5nIHRhZykge30KICBAb3ZlcnJpZGUKICB2b2lkIF9lbmQoU3RyaW5nIHRhZykge30KCiAgaW50IF9yZWFkQnl0ZSgpID0+IF9ieXRlc1tfYnl0ZU9mZnNldCsrXTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIF9yZWFkU3RyaW5nSW50ZXJuYWwoKSB7CiAgICBpbnQgbGVuZ3RoID0gX3JlYWRJbnRJbnRlcm5hbCgpOwogICAgTGlzdDxpbnQ+IGJ5dGVzID0gbmV3IFVpbnQ4TGlzdChsZW5ndGgpOwogICAgYnl0ZXMuc2V0UmFuZ2UoMCwgYnl0ZXMubGVuZ3RoLCBfYnl0ZXMsIF9ieXRlT2Zmc2V0KTsKICAgIF9ieXRlT2Zmc2V0ICs9IGJ5dGVzLmxlbmd0aDsKICAgIHJldHVybiB1dGY4LmRlY29kZShieXRlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgX3JlYWRJbnRJbnRlcm5hbCgpIHsKICAgIHZhciBieXRlID0gX3JlYWRCeXRlKCk7CiAgICBpZiAoYnl0ZSAmIDB4ODAgPT0gMCkgewogICAgICAvLyAweHh4eHh4eAogICAgICByZXR1cm4gYnl0ZTsKICAgIH0gZWxzZSBpZiAoYnl0ZSAmIDB4NDAgPT0gMCkgewogICAgICAvLyAxMHh4eHh4eAogICAgICByZXR1cm4gKChieXRlICYgMHgzRikgPDwgOCkgfCBfcmVhZEJ5dGUoKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIDExeHh4eHh4CiAgICAgIHJldHVybiAoKGJ5dGUgJiAweDNGKSA8PCAyNCkgfAogICAgICAgICAgKF9yZWFkQnl0ZSgpIDw8IDE2KSB8CiAgICAgICAgICAoX3JlYWRCeXRlKCkgPDwgOCkgfAogICAgICAgICAgX3JlYWRCeXRlKCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBVcmkgX3JlYWRVcmlJbnRlcm5hbCgpIHsKICAgIFN0cmluZyB0ZXh0ID0gX3JlYWRTdHJpbmcoKTsKICAgIHJldHVybiBVcmkucGFyc2UodGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFIF9yZWFkRW51bUludGVybmFsPEU+KExpc3Q8RT4gdmFsdWVzKSB7CiAgICBpbnQgaW5kZXggPSBfcmVhZEludEludGVybmFsKCk7CiAgICBhc3NlcnQoCiAgICAgICAgMCA8PSBpbmRleCAmJiBpbmRleCA8IHZhbHVlcy5sZW5ndGgsCiAgICAgICAgIkludmFsaWQgZGF0YSBraW5kIGluZGV4LiAiCiAgICAgICAgIkV4cGVjdGVkIG9uZSBvZiAkdmFsdWVzLCBmb3VuZCBpbmRleCAkaW5kZXguIik7CiAgICByZXR1cm4gdmFsdWVzW2luZGV4XTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX2Vycm9yQ29udGV4dCA9PiAnIE9mZnNldCAkX2J5dGVPZmZzZXQgaW4gJHtfYnl0ZXMubGVuZ3RofS4nOwp9CkcATk48AR4BOwQ3NBcaATwrAQwdDBsBLAEMISUtOiEfBAEMGxwcEhMjEjENEiUgHxcGBAEMGyEcBAEMKyQMLSQ5GgQBDEsCATVwYWNrYWdlOmNvbXBpbGVyL3NyYy9zZXJpYWxpemF0aW9uL2JpbmFyeV9zb3VyY2UuZGFydDhzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9zZXJpYWxpemF0aW9uL2hlbHBlcnMuZGFydKtYLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgJ3NlcmlhbGl6YXRpb24uZGFydCc7CgovLy8gRW51bSB2YWx1ZXMgdXNlZCBmb3IgaWRlbnRpZnlpbmcgZGlmZmVyZW50IGtpbmRzIG9mIHNlcmlhbGl6ZWQgZGF0YS4KLy8vCi8vLyBUaGlzIGlzIHVzZWQgdG8gZm9yIGRlYnVnZ2luZyBkYXRhIGluY29uc2lzdGVuY2llcyBiZXR3ZWVuIHNlcmlhbGl6YXRpb24KLy8vIGFuZCBkZXNlcmlhbGl6YXRpb24uCmVudW0gRGF0YUtpbmQgewogIGJvb2wsCiAgdWludDMwLAogIHN0cmluZywKICBlbnVtVmFsdWUsCiAgdXJpLAogIGxpYnJhcnlOb2RlLAogIGNsYXNzTm9kZSwKICB0eXBlZGVmTm9kZSwKICBtZW1iZXJOb2RlLAogIHRyZWVOb2RlLAogIHR5cGVQYXJhbWV0ZXJOb2RlLAogIGRhcnRUeXBlLAogIGRhcnRUeXBlTm9kZSwKICBzb3VyY2VTcGFuLAogIGNvbnN0YW50LAogIGltcG9ydCwKICBkb3VibGUsCiAgaW50LAp9CgovLy8gRW51bSB1c2VkIGZvciBpZGVudGlmeWluZyB0aGUgZW5jbG9zaW5nIGVudGl0eSBvZiBhIG1lbWJlciBpbiBzZXJpYWxpemF0aW9uLgplbnVtIE1lbWJlckNvbnRleHRLaW5kIHsgbGlicmFyeSwgY2xzIH0KCi8vLyBFbnVtIHVzZWQgZm9yIGlkZW50aWZ5aW5nIFtMb2NhbF0gc3ViY2xhc3NlcyBpbiBzZXJpYWxpemF0aW9uLgplbnVtIExvY2FsS2luZCB7CiAgakxvY2FsLAogIHRoaXNMb2NhbCwKICBib3hMb2NhbCwKICBhbm9ueW1vdXNDbG9zdXJlTG9jYWwsCiAgdHlwZVZhcmlhYmxlTG9jYWwsCn0KCi8vLyBFbnVtIHVzZWQgZm9yIGlkZW50aWZ5aW5nIFtpci5UcmVlTm9kZV0gc3ViY2xhc3NlcyBpbiBzZXJpYWxpemF0aW9uLgplbnVtIF9UcmVlTm9kZUtpbmQgewogIGNscywKICBtZW1iZXIsCiAgbm9kZSwKICBmdW5jdGlvbk5vZGUsCiAgdHlwZVBhcmFtZXRlciwKICBmdW5jdGlvbkRlY2xhcmF0aW9uVmFyaWFibGUsCiAgY29uc3RhbnQsCn0KCi8vLyBFbnVtIHVzZWQgZm9yIGlkZW50aWZ5aW5nIFtpci5GdW5jdGlvbk5vZGVdIGNvbnRleHQgaW4gc2VyaWFsaXphdGlvbi4KZW51bSBfRnVuY3Rpb25Ob2RlS2luZCB7CiAgcHJvY2VkdXJlLAogIGNvbnN0cnVjdG9yLAogIGZ1bmN0aW9uRXhwcmVzc2lvbiwKICBmdW5jdGlvbkRlY2xhcmF0aW9uLAp9CgovLy8gRW51bSB1c2VkIGZvciBpZGVudGlmeWluZyBbaXIuVHlwZVBhcmFtZXRlcl0gY29udGV4dCBpbiBzZXJpYWxpemF0aW9uLgplbnVtIF9UeXBlUGFyYW1ldGVyS2luZCB7CiAgY2xzLAogIGZ1bmN0aW9uTm9kZSwKfQoKLy8vIENsYXNzIHVzZWQgZm9yIGVuY29kaW5nIHRhZ3MgaW4gW09iamVjdFNpbmtdIGFuZCBbT2JqZWN0U291cmNlXS4KY2xhc3MgVGFnIHsKICBmaW5hbCBTdHJpbmcgdmFsdWU7CgogIFRhZyh0aGlzLnZhbHVlKTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiB2YWx1ZS5oYXNoQ29kZSAqIDEzOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIFRhZykgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHZhbHVlID09IG90aGVyLnZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1RhZygkdmFsdWUpJzsKfQoKLy8vIEVudW0gdXNlZCBmb3IgaWRlbnRpZnlpbmcgW0RhcnRUeXBlXSBzdWJjbGFzc2VzIGluIHNlcmlhbGl6YXRpb24uCmVudW0gRGFydFR5cGVLaW5kIHsKICBub25lLAogIHZvaWRUeXBlLAogIHR5cGVWYXJpYWJsZSwKICBmdW5jdGlvblR5cGVWYXJpYWJsZSwKICBmdW5jdGlvblR5cGUsCiAgaW50ZXJmYWNlVHlwZSwKICB0eXBlZGVmLAogIGR5bmFtaWNUeXBlLAogIGZ1dHVyZU9yLAp9CgovLy8gVmlzaXRvciB0aGF0IHNlcmlhbGl6ZXMgW0RhcnRUeXBlXSBvYmplY3QgdG9nZXRoZXIgd2l0aCBbQWJzdHJhY3REYXRhU2lua10uCmNsYXNzIERhcnRUeXBlV3JpdGVyCiAgICBpbXBsZW1lbnRzIERhcnRUeXBlVmlzaXRvcjx2b2lkLCBMaXN0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPj4gewogIGZpbmFsIEFic3RyYWN0RGF0YVNpbmsgX3Npbms7CgogIERhcnRUeXBlV3JpdGVyKHRoaXMuX3NpbmspOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0KGNvdmFyaWFudCBEYXJ0VHlwZSB0eXBlLAogICAgICAgICAgTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4gZnVuY3Rpb25UeXBlVmFyaWFibGVzKSA9PgogICAgICB0eXBlLmFjY2VwdCh0aGlzLCBmdW5jdGlvblR5cGVWYXJpYWJsZXMpOwoKICB2b2lkIHZpc2l0VHlwZXMoCiAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVzLCBMaXN0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPiBmdW5jdGlvblR5cGVWYXJpYWJsZXMpIHsKICAgIF9zaW5rLndyaXRlSW50KHR5cGVzLmxlbmd0aCk7CiAgICBmb3IgKERhcnRUeXBlIHR5cGUgaW4gdHlwZXMpIHsKICAgICAgX3NpbmsuX3dyaXRlRGFydFR5cGUodHlwZSwgZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRWb2lkVHlwZShjb3ZhcmlhbnQgVm9pZFR5cGUgdHlwZSwKICAgICAgTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4gZnVuY3Rpb25UeXBlVmFyaWFibGVzKSB7CiAgICBfc2luay53cml0ZUVudW0oRGFydFR5cGVLaW5kLnZvaWRUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlVmFyaWFibGVUeXBlKGNvdmFyaWFudCBUeXBlVmFyaWFibGVUeXBlIHR5cGUsCiAgICAgIExpc3Q8RnVuY3Rpb25UeXBlVmFyaWFibGU+IGZ1bmN0aW9uVHlwZVZhcmlhYmxlcykgewogICAgX3Npbmsud3JpdGVFbnVtKERhcnRUeXBlS2luZC50eXBlVmFyaWFibGUpOwogICAgSW5kZXhlZFR5cGVWYXJpYWJsZSB0eXBlVmFyaWFibGUgPSB0eXBlLmVsZW1lbnQ7CiAgICBfc2luay53cml0ZUludCh0eXBlVmFyaWFibGUudHlwZVZhcmlhYmxlSW5kZXgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZ1bmN0aW9uVHlwZVZhcmlhYmxlKGNvdmFyaWFudCBGdW5jdGlvblR5cGVWYXJpYWJsZSB0eXBlLAogICAgICBMaXN0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPiBmdW5jdGlvblR5cGVWYXJpYWJsZXMpIHsKICAgIGludCBpbmRleCA9IGZ1bmN0aW9uVHlwZVZhcmlhYmxlcy5pbmRleE9mKHR5cGUpOwogICAgaWYgKGluZGV4ID09IC0xKSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEF2b2lkIGZyZWUgdmFyaWFibGVzLgogICAgICBfc2luay5fd3JpdGVEYXJ0VHlwZShjb25zdCBEeW5hbWljVHlwZSgpLCBmdW5jdGlvblR5cGVWYXJpYWJsZXMpOwogICAgfSBlbHNlIHsKICAgICAgX3Npbmsud3JpdGVFbnVtKERhcnRUeXBlS2luZC5mdW5jdGlvblR5cGVWYXJpYWJsZSk7CiAgICAgIF9zaW5rLndyaXRlSW50KGluZGV4KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGdW5jdGlvblR5cGUoY292YXJpYW50IEZ1bmN0aW9uVHlwZSB0eXBlLAogICAgICBMaXN0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPiBmdW5jdGlvblR5cGVWYXJpYWJsZXMpIHsKICAgIF9zaW5rLndyaXRlRW51bShEYXJ0VHlwZUtpbmQuZnVuY3Rpb25UeXBlKTsKICAgIGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyA9CiAgICAgICAgbmV3IExpc3Q8RnVuY3Rpb25UeXBlVmFyaWFibGU+LmZyb20oZnVuY3Rpb25UeXBlVmFyaWFibGVzKQogICAgICAgICAgLi5hZGRBbGwodHlwZS50eXBlVmFyaWFibGVzKTsKICAgIF9zaW5rLndyaXRlSW50KHR5cGUudHlwZVZhcmlhYmxlcy5sZW5ndGgpOwogICAgZm9yIChGdW5jdGlvblR5cGVWYXJpYWJsZSB2YXJpYWJsZSBpbiB0eXBlLnR5cGVWYXJpYWJsZXMpIHsKICAgICAgX3NpbmsuX3dyaXRlRGFydFR5cGUodmFyaWFibGUuYm91bmQsIGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICB9CiAgICBfc2luay5fd3JpdGVEYXJ0VHlwZSh0eXBlLnJldHVyblR5cGUsIGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICB2aXNpdFR5cGVzKHR5cGUucGFyYW1ldGVyVHlwZXMsIGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICB2aXNpdFR5cGVzKHR5cGUub3B0aW9uYWxQYXJhbWV0ZXJUeXBlcywgZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgIHZpc2l0VHlwZXModHlwZS5uYW1lZFBhcmFtZXRlclR5cGVzLCBmdW5jdGlvblR5cGVWYXJpYWJsZXMpOwogICAgZm9yIChTdHJpbmcgbmFtZWRQYXJhbWV0ZXIgaW4gdHlwZS5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgX3Npbmsud3JpdGVTdHJpbmcobmFtZWRQYXJhbWV0ZXIpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludGVyZmFjZVR5cGUoY292YXJpYW50IEludGVyZmFjZVR5cGUgdHlwZSwKICAgICAgTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4gZnVuY3Rpb25UeXBlVmFyaWFibGVzKSB7CiAgICBfc2luay53cml0ZUVudW0oRGFydFR5cGVLaW5kLmludGVyZmFjZVR5cGUpOwogICAgX3Npbmsud3JpdGVDbGFzcyh0eXBlLmVsZW1lbnQpOwogICAgdmlzaXRUeXBlcyh0eXBlLnR5cGVBcmd1bWVudHMsIGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZWRlZlR5cGUoY292YXJpYW50IFR5cGVkZWZUeXBlIHR5cGUsCiAgICAgIExpc3Q8RnVuY3Rpb25UeXBlVmFyaWFibGU+IGZ1bmN0aW9uVHlwZVZhcmlhYmxlcykgewogICAgX3Npbmsud3JpdGVFbnVtKERhcnRUeXBlS2luZC50eXBlZGVmKTsKICAgIF9zaW5rLndyaXRlVHlwZWRlZih0eXBlLmVsZW1lbnQpOwogICAgdmlzaXRUeXBlcyh0eXBlLnR5cGVBcmd1bWVudHMsIGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICBfc2luay5fd3JpdGVEYXJ0VHlwZSh0eXBlLnVuYWxpYXNlZCwgZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREeW5hbWljVHlwZShjb3ZhcmlhbnQgRHluYW1pY1R5cGUgdHlwZSwKICAgICAgTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4gZnVuY3Rpb25UeXBlVmFyaWFibGVzKSB7CiAgICBfc2luay53cml0ZUVudW0oRGFydFR5cGVLaW5kLmR5bmFtaWNUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGdXR1cmVPclR5cGUoY292YXJpYW50IEZ1dHVyZU9yVHlwZSB0eXBlLAogICAgICBMaXN0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPiBmdW5jdGlvblR5cGVWYXJpYWJsZXMpIHsKICAgIF9zaW5rLndyaXRlRW51bShEYXJ0VHlwZUtpbmQuZnV0dXJlT3IpOwogICAgX3NpbmsuX3dyaXRlRGFydFR5cGUodHlwZS50eXBlQXJndW1lbnQsIGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgfQp9CgovLy8gRW51bSB1c2VkIGZvciBpZGVudGlmeWluZyBbaXIuRGFydFR5cGVdIHN1YmNsYXNzZXMgaW4gc2VyaWFsaXphdGlvbi4KZW51bSBEYXJ0VHlwZU5vZGVLaW5kIHsKICBub25lLAogIHZvaWRUeXBlLAogIHR5cGVQYXJhbWV0ZXJUeXBlLAogIGZ1bmN0aW9uVHlwZSwKICBmdW5jdGlvblR5cGVWYXJpYWJsZSwKICBpbnRlcmZhY2VUeXBlLAogIHR5cGVkZWYsCiAgZHluYW1pY1R5cGUsCiAgYm90dG9tVHlwZSwKICBpbnZhbGlkVHlwZSwKICB0aGlzSW50ZXJmYWNlVHlwZSwKICBleGFjdEludGVyZmFjZVR5cGUsCiAgZG9lc05vdENvbXBsZXRlLAp9Cgpjb25zdCBTdHJpbmcgZnVuY3Rpb25UeXBlTm9kZVRhZyA9ICdmdW5jdGlvbi10eXBlLW5vZGUnOwoKY2xhc3MgRGFydFR5cGVOb2RlV3JpdGVyCiAgICBleHRlbmRzIGlyLkRhcnRUeXBlVmlzaXRvcjE8dm9pZCwgTGlzdDxpci5UeXBlUGFyYW1ldGVyPj4gewogIGZpbmFsIEFic3RyYWN0RGF0YVNpbmsgX3Npbms7CgogIERhcnRUeXBlTm9kZVdyaXRlcih0aGlzLl9zaW5rKTsKCiAgdm9pZCB2aXNpdFR5cGVzKAogICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlcywgTGlzdDxpci5UeXBlUGFyYW1ldGVyPiBmdW5jdGlvblR5cGVWYXJpYWJsZXMpIHsKICAgIF9zaW5rLndyaXRlSW50KHR5cGVzLmxlbmd0aCk7CiAgICBmb3IgKGlyLkRhcnRUeXBlIHR5cGUgaW4gdHlwZXMpIHsKICAgICAgX3NpbmsuX3dyaXRlRGFydFR5cGVOb2RlKHR5cGUsIGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHREYXJ0VHlwZSgKICAgICAgaXIuRGFydFR5cGUgbm9kZSwgTGlzdDxpci5UeXBlUGFyYW1ldGVyPiBmdW5jdGlvblR5cGVWYXJpYWJsZXMpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJVbmV4cGVjdGVkIGlyLkRhcnRUeXBlICRub2RlICgke25vZGUucnVudGltZVR5cGV9KS4iKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnZhbGlkVHlwZSgKICAgICAgaXIuSW52YWxpZFR5cGUgbm9kZSwgTGlzdDxpci5UeXBlUGFyYW1ldGVyPiBmdW5jdGlvblR5cGVWYXJpYWJsZXMpIHsKICAgIF9zaW5rLndyaXRlRW51bShEYXJ0VHlwZU5vZGVLaW5kLmludmFsaWRUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREeW5hbWljVHlwZSgKICAgICAgaXIuRHluYW1pY1R5cGUgbm9kZSwgTGlzdDxpci5UeXBlUGFyYW1ldGVyPiBmdW5jdGlvblR5cGVWYXJpYWJsZXMpIHsKICAgIF9zaW5rLndyaXRlRW51bShEYXJ0VHlwZU5vZGVLaW5kLmR5bmFtaWNUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRWb2lkVHlwZSgKICAgICAgaXIuVm9pZFR5cGUgbm9kZSwgTGlzdDxpci5UeXBlUGFyYW1ldGVyPiBmdW5jdGlvblR5cGVWYXJpYWJsZXMpIHsKICAgIF9zaW5rLndyaXRlRW51bShEYXJ0VHlwZU5vZGVLaW5kLnZvaWRUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCb3R0b21UeXBlKAogICAgICBpci5Cb3R0b21UeXBlIG5vZGUsIExpc3Q8aXIuVHlwZVBhcmFtZXRlcj4gZnVuY3Rpb25UeXBlVmFyaWFibGVzKSB7CiAgICBpZiAobm9kZSA9PSBjb25zdCBEb2VzTm90Q29tcGxldGVUeXBlKCkpIHsKICAgICAgX3Npbmsud3JpdGVFbnVtKERhcnRUeXBlTm9kZUtpbmQuZG9lc05vdENvbXBsZXRlKTsKICAgIH0gZWxzZSB7CiAgICAgIF9zaW5rLndyaXRlRW51bShEYXJ0VHlwZU5vZGVLaW5kLmJvdHRvbVR5cGUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludGVyZmFjZVR5cGUoCiAgICAgIGlyLkludGVyZmFjZVR5cGUgbm9kZSwgTGlzdDxpci5UeXBlUGFyYW1ldGVyPiBmdW5jdGlvblR5cGVWYXJpYWJsZXMpIHsKICAgIGlmIChub2RlIGlzIFRoaXNJbnRlcmZhY2VUeXBlKSB7CiAgICAgIF9zaW5rLndyaXRlRW51bShEYXJ0VHlwZU5vZGVLaW5kLnRoaXNJbnRlcmZhY2VUeXBlKTsKICAgIH0gZWxzZSBpZiAobm9kZSBpcyBFeGFjdEludGVyZmFjZVR5cGUpIHsKICAgICAgX3Npbmsud3JpdGVFbnVtKERhcnRUeXBlTm9kZUtpbmQuZXhhY3RJbnRlcmZhY2VUeXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIF9zaW5rLndyaXRlRW51bShEYXJ0VHlwZU5vZGVLaW5kLmludGVyZmFjZVR5cGUpOwogICAgfQogICAgX3Npbmsud3JpdGVDbGFzc05vZGUobm9kZS5jbGFzc05vZGUpOwogICAgdmlzaXRUeXBlcyhub2RlLnR5cGVBcmd1bWVudHMsIGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RnVuY3Rpb25UeXBlKAogICAgICBpci5GdW5jdGlvblR5cGUgbm9kZSwgTGlzdDxpci5UeXBlUGFyYW1ldGVyPiBmdW5jdGlvblR5cGVWYXJpYWJsZXMpIHsKICAgIF9zaW5rLndyaXRlRW51bShEYXJ0VHlwZU5vZGVLaW5kLmZ1bmN0aW9uVHlwZSk7CiAgICBfc2luay5iZWdpbihmdW5jdGlvblR5cGVOb2RlVGFnKTsKICAgIGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyA9CiAgICAgICAgbmV3IExpc3Q8aXIuVHlwZVBhcmFtZXRlcj4uZnJvbShmdW5jdGlvblR5cGVWYXJpYWJsZXMpCiAgICAgICAgICAuLmFkZEFsbChub2RlLnR5cGVQYXJhbWV0ZXJzKTsKICAgIF9zaW5rLndyaXRlSW50KG5vZGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoKTsKICAgIGZvciAoaXIuVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIgaW4gbm9kZS50eXBlUGFyYW1ldGVycykgewogICAgICBfc2luay53cml0ZVN0cmluZyhwYXJhbWV0ZXIubmFtZSk7CiAgICAgIF9zaW5rLl93cml0ZURhcnRUeXBlTm9kZShwYXJhbWV0ZXIuYm91bmQsIGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICAgIF9zaW5rLl93cml0ZURhcnRUeXBlTm9kZShwYXJhbWV0ZXIuZGVmYXVsdFR5cGUsIGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICB9CiAgICBfc2luay5fd3JpdGVEYXJ0VHlwZU5vZGUobm9kZS5yZXR1cm5UeXBlLCBmdW5jdGlvblR5cGVWYXJpYWJsZXMpOwogICAgX3Npbmsud3JpdGVJbnQobm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50KTsKICAgIHZpc2l0VHlwZXMobm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycywgZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgIF9zaW5rLndyaXRlSW50KG5vZGUubmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCk7CiAgICBmb3IgKGlyLk5hbWVkVHlwZSBwYXJhbWV0ZXIgaW4gbm9kZS5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgX3Npbmsud3JpdGVTdHJpbmcocGFyYW1ldGVyLm5hbWUpOwogICAgICBfc2luay5fd3JpdGVEYXJ0VHlwZU5vZGUocGFyYW1ldGVyLnR5cGUsIGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICB9CiAgICBfc2luay5fd3JpdGVEYXJ0VHlwZU5vZGUobm9kZS50eXBlZGVmVHlwZSwgZnVuY3Rpb25UeXBlVmFyaWFibGVzLAogICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBfc2luay5lbmQoZnVuY3Rpb25UeXBlTm9kZVRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZVBhcmFtZXRlclR5cGUoCiAgICAgIGlyLlR5cGVQYXJhbWV0ZXJUeXBlIG5vZGUsIExpc3Q8aXIuVHlwZVBhcmFtZXRlcj4gZnVuY3Rpb25UeXBlVmFyaWFibGVzKSB7CiAgICBpbnQgaW5kZXggPSBmdW5jdGlvblR5cGVWYXJpYWJsZXMuaW5kZXhPZihub2RlLnBhcmFtZXRlcik7CiAgICBpZiAoaW5kZXggIT0gLTEpIHsKICAgICAgX3Npbmsud3JpdGVFbnVtKERhcnRUeXBlTm9kZUtpbmQuZnVuY3Rpb25UeXBlVmFyaWFibGUpOwogICAgICBfc2luay53cml0ZUludChpbmRleCk7CiAgICAgIF9zaW5rLl93cml0ZURhcnRUeXBlTm9kZShub2RlLnByb21vdGVkQm91bmQsIGZ1bmN0aW9uVHlwZVZhcmlhYmxlcywKICAgICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBfc2luay53cml0ZUVudW0oRGFydFR5cGVOb2RlS2luZC50eXBlUGFyYW1ldGVyVHlwZSk7CiAgICAgIF9zaW5rLndyaXRlVHlwZVBhcmFtZXRlck5vZGUobm9kZS5wYXJhbWV0ZXIpOwogICAgICBfc2luay5fd3JpdGVEYXJ0VHlwZU5vZGUobm9kZS5wcm9tb3RlZEJvdW5kLCBmdW5jdGlvblR5cGVWYXJpYWJsZXMsCiAgICAgICAgICBhbGxvd051bGw6IHRydWUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVkZWZUeXBlKAogICAgICBpci5UeXBlZGVmVHlwZSBub2RlLCBMaXN0PGlyLlR5cGVQYXJhbWV0ZXI+IGZ1bmN0aW9uVHlwZVZhcmlhYmxlcykgewogICAgX3Npbmsud3JpdGVFbnVtKERhcnRUeXBlTm9kZUtpbmQudHlwZWRlZik7CiAgICBfc2luay53cml0ZVR5cGVkZWZOb2RlKG5vZGUudHlwZWRlZk5vZGUpOwogICAgdmlzaXRUeXBlcyhub2RlLnR5cGVBcmd1bWVudHMsIGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgfQp9CgovLy8gRGF0YSBzaW5rIGhlbHBlciB0aGF0IGNhbm9uaWNhbGl6ZXMgW0VdIHZhbHVlcyB1c2luZyBpbmRpY2VzLgpjbGFzcyBJbmRleGVkU2luazxFPiB7CiAgZmluYWwgQWJzdHJhY3REYXRhU2luayBfc2luazsKICBmaW5hbCBNYXA8RSwgaW50PiBfY2FjaGUgPSB7fTsKCiAgSW5kZXhlZFNpbmsodGhpcy5fc2luayk7CgogIC8vLyBXcml0ZSBhIHJlZmVyZW5jZSB0byBbdmFsdWVdIHRvIHRoZSBkYXRhIHNpbmsuCiAgLy8vCiAgLy8vIElmIFt2YWx1ZV0gaGFzIG5vdCBiZWVuIGNhbm9uaWNhbGl6ZWQgeWV0LCBbd3JpdGVWYWx1ZV0gaXMgY2FsbGVkIHRvCiAgLy8vIHNlcmlhbGl6ZSB0aGUgW3ZhbHVlXSBpdHNlbGYuCiAgdm9pZCB3cml0ZShFIHZhbHVlLCB2b2lkIHdyaXRlVmFsdWUoRSB2YWx1ZSkpIHsKICAgIGludCBpbmRleCA9IF9jYWNoZVt2YWx1ZV07CiAgICBpZiAoaW5kZXggPT0gbnVsbCkgewogICAgICBpbmRleCA9IF9jYWNoZS5sZW5ndGg7CiAgICAgIF9jYWNoZVt2YWx1ZV0gPSBpbmRleDsKICAgICAgX3NpbmsuX3dyaXRlSW50SW50ZXJuYWwoaW5kZXgpOwogICAgICB3cml0ZVZhbHVlKHZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgIF9zaW5rLl93cml0ZUludEludGVybmFsKGluZGV4KTsKICAgIH0KICB9Cn0KCi8vLyBEYXRhIHNvdXJjZSBoZWxwZXIgcmVhZHMgY2Fub25pY2FsaXplZCBbRV0gdmFsdWVzIHRocm91Z2ggaW5kaWNlcy4KY2xhc3MgSW5kZXhlZFNvdXJjZTxFPiB7CiAgZmluYWwgQWJzdHJhY3REYXRhU291cmNlIF9zb3VyY2U7CiAgZmluYWwgTGlzdDxFPiBfY2FjaGUgPSBbXTsKCiAgSW5kZXhlZFNvdXJjZSh0aGlzLl9zb3VyY2UpOwoKICAvLy8gUmVhZHMgYSByZWZlcmVuY2UgdG8gYW4gW0VdIHZhbHVlIGZyb20gdGhlIGRhdGEgc291cmNlLgogIC8vLwogIC8vLyBJZiB0aGUgdmFsdWUgaGFzbid0IHlldCBiZWVuIHJlYWQsIFtyZWFkVmFsdWVdIGlzIGNhbGxlZCB0byBkZXNlcmlhbGl6ZQogIC8vLyB0aGUgdmFsdWUgaXRzZWxmLgogIEUgcmVhZChFIHJlYWRWYWx1ZSgpKSB7CiAgICBpbnQgaW5kZXggPSBfc291cmNlLl9yZWFkSW50SW50ZXJuYWwoKTsKICAgIGlmIChpbmRleCA+PSBfY2FjaGUubGVuZ3RoKSB7CiAgICAgIEUgdmFsdWUgPSByZWFkVmFsdWUoKTsKICAgICAgX2NhY2hlLmFkZCh2YWx1ZSk7CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfY2FjaGVbaW5kZXhdOwogICAgfQogIH0KfQqBfgBOTjwBHgFJBE0ZEAgKCg0HDw0PDgwVDBAODAoKBwIBUSgBQxEKDQwZFQIBSRUHCggQER8MAgFKGQ0PFhcCAUsaBxACAUUMFgETAQwrAQwcLSUhBAEMJgIBRhQIDBAYEBELDwwCAVAVQyABHgEMJj8wARNQIiM5BgQBDC46LAQBDD46MDU0BAEMRjo1FzRIDTodBgQBDDY6MBxDKC9AQwZCPERBOikGBAEMODoxJDsEAQw0OismO0EEAQw0Oi8EAQw2OixEBAIBSRgIDBUQGBELDw4PFRYTAgE5ARlAIAEiARNPIiY9BgQBDBhIIEAEAQwZSzMEAQwZSzMEAQwWSDAEAQwYSi85DTQGBAEMG00lOy08DTcGKjsEAQwaTDQmHD8pMD4pSE4GRjFCMTspRwZGGiQEAQwfUT8XPh1KHA07NEocBgQBDBlLLy47BAIBQhcgIQEbATUGSyQyHxkdHSYZDSYGBAIBRxkkHQEfAT4GThgaLCIdGRQNHAYEAgEvcGFja2FnZTpjb21waWxlci9zcmMvc2VyaWFsaXphdGlvbi9oZWxwZXJzLmRhcnQ8c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvc2VyaWFsaXphdGlvbi9tZW1iZXJfZGF0YS5kYXJ0lq8vLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiAnc2VyaWFsaXphdGlvbi5kYXJ0JzsKCi8vLyBIZWxwZXIgZm9yIGxvb2tpbmcgdXAgb2JqZWN0IGxpYnJhcnkgZGF0YSBmcm9tIGFuIFtpci5Db21wb25lbnRdIG5vZGUuCmNsYXNzIENvbXBvbmVudExvb2t1cCB7CiAgZmluYWwgaXIuQ29tcG9uZW50IF9jb21wb25lbnQ7CgogIC8vLyBDYWNoZSBvZiBbX0xpYnJhcnlEYXRhXSBmb3IgbGlicmFyaWVzIGluIFtfY29tcG9uZW50XS4KICBNYXA8VXJpLCBfTGlicmFyeURhdGE+IF9saWJyYXJ5TWFwOwoKICBDb21wb25lbnRMb29rdXAodGhpcy5fY29tcG9uZW50KTsKCiAgLy8vIFJldHVybnMgdGhlIFtfTGlicmFyeURhdGFdIG9iamVjdCBmb3IgdGhlIGxpYnJhcnkgd2l0aCB0aGUgW2Nhbm9uaWNhbFVyaV0uCiAgX0xpYnJhcnlEYXRhIGdldExpYnJhcnlEYXRhQnlVcmkoVXJpIGNhbm9uaWNhbFVyaSkgewogICAgaWYgKF9saWJyYXJ5TWFwID09IG51bGwpIHsKICAgICAgX2xpYnJhcnlNYXAgPSB7fTsKICAgICAgZm9yIChpci5MaWJyYXJ5IGxpYnJhcnkgaW4gX2NvbXBvbmVudC5saWJyYXJpZXMpIHsKICAgICAgICBfbGlicmFyeU1hcFtsaWJyYXJ5LmltcG9ydFVyaV0gPSBuZXcgX0xpYnJhcnlEYXRhKGxpYnJhcnkpOwogICAgICB9CiAgICB9CiAgICBfTGlicmFyeURhdGEgZGF0YSA9IF9saWJyYXJ5TWFwW2Nhbm9uaWNhbFVyaV07CiAgICBhc3NlcnQoZGF0YSAhPSBudWxsLCAiTm8gbGlicmFyeSBmb3VuZCBmb3IgJGNhbm9uaWNhbFVyaS4iKTsKICAgIHJldHVybiBkYXRhOwogIH0KfQoKLy8vIFJldHVybnMgYSBuYW1lIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIGEgbWVtYmVyIHdpdGhpbiBpdHMgZW5jbG9zaW5nIGxpYnJhcnkKLy8vIG9yIGNsYXNzLgpTdHJpbmcgX2NvbXB1dGVNZW1iZXJOYW1lKGlyLk1lbWJlciBtZW1iZXIpIHsKICBpZiAobWVtYmVyLm5hbWUuaXNQcml2YXRlICYmCiAgICAgIG1lbWJlci5uYW1lLmxpYnJhcnlOYW1lICE9IG1lbWJlci5lbmNsb3NpbmdMaWJyYXJ5LnJlZmVyZW5jZSkgewogICAgLy8gVE9ETygzMzczMik6IEhhbmRsZSBub1N1Y2hNZXRob2QgZm9yd2FyZGVycyBmb3IgcHJpdmF0ZSBtZW1iZXJzIGZyb20KICAgIC8vIG90aGVyIGxpYnJhcmllcy4KICAgIHJldHVybiBudWxsOwogIH0KICBTdHJpbmcgbmFtZSA9IG1lbWJlci5uYW1lLm5hbWU7CiAgaWYgKG1lbWJlciBpcyBpci5Db25zdHJ1Y3RvcikgewogICAgbmFtZSA9ICcuJG5hbWUnOwogIH0gZWxzZSBpZiAobWVtYmVyIGlzIGlyLlByb2NlZHVyZSkgewogICAgaWYgKG1lbWJlci5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuRmFjdG9yeSkgewogICAgICBuYW1lID0gJy4kbmFtZSc7CiAgICB9IGVsc2UgaWYgKG1lbWJlci5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuU2V0dGVyKSB7CiAgICAgIG5hbWUgKz0gIj0iOwogICAgfQogIH0KICByZXR1cm4gbmFtZTsKfQoKLy8vIEhlbHBlciBmb3IgbG9va2luZyB1cCBjbGFzc2VzIGFuZCBtZW1iZXJzIGZyb20gYW4gW2lyLkxpYnJhcnldIG5vZGUuCmNsYXNzIF9MaWJyYXJ5RGF0YSB7CiAgLy8vIFRoZSBbaXIuTGlicmFyeV0gdGhhdCBkZWZpbmVzIHRoZSBsaWJyYXJ5LgogIGZpbmFsIGlyLkxpYnJhcnkgbm9kZTsKCiAgLy8vIENhY2hlIG9mIFtfQ2xhc3NEYXRhXSBmb3IgY2xhc3NlcyBpbiB0aGlzIGxpYnJhcnkuCiAgTWFwPFN0cmluZywgX0NsYXNzRGF0YT4gX2NsYXNzZXM7CgogIC8vLyBDYWNoZSBvZiBbaXIuVHlwZWRlZl0gbm9kZXMgZm9yIHR5cGVkZWZzIGluIHRoaXMgbGlicmFyeS4KICBNYXA8U3RyaW5nLCBpci5UeXBlZGVmPiBfdHlwZWRlZnM7CgogIC8vLyBDYWNoZSBvZiBbX01lbWJlckRhdGFdIGZvciBtZW1iZXJzIGluIHRoaXMgbGlicmFyeS4KICBNYXA8U3RyaW5nLCBfTWVtYmVyRGF0YT4gX21lbWJlcnM7CgogIF9MaWJyYXJ5RGF0YSh0aGlzLm5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgW19DbGFzc0RhdGFdIGZvciB0aGUgY2xhc3MgW25hbWVdIGluIHRoaXMgbGlicmFyeS4KICBfQ2xhc3NEYXRhIGxvb2t1cENsYXNzKFN0cmluZyBuYW1lKSB7CiAgICBpZiAoX2NsYXNzZXMgPT0gbnVsbCkgewogICAgICBfY2xhc3NlcyA9IHt9OwogICAgICBmb3IgKGlyLkNsYXNzIGNscyBpbiBub2RlLmNsYXNzZXMpIHsKICAgICAgICBhc3NlcnQoIV9jbGFzc2VzLmNvbnRhaW5zS2V5KGNscy5uYW1lKSwKICAgICAgICAgICAgIkR1cGxpY2F0ZSBjbGFzcyAnJHtjbHMubmFtZX0nIGluICRfY2xhc3NlcyB0cnlpbmcgdG8gYWRkICRjbHMuIik7CiAgICAgICAgX2NsYXNzZXNbY2xzLm5hbWVdID0gbmV3IF9DbGFzc0RhdGEoY2xzKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIF9jbGFzc2VzW25hbWVdOwogIH0KCiAgaXIuVHlwZWRlZiBsb29rdXBUeXBlZGVmKFN0cmluZyBuYW1lKSB7CiAgICBpZiAoX3R5cGVkZWZzID09IG51bGwpIHsKICAgICAgX3R5cGVkZWZzID0ge307CiAgICAgIGZvciAoaXIuVHlwZWRlZiB0eXBlZGVmIGluIG5vZGUudHlwZWRlZnMpIHsKICAgICAgICBhc3NlcnQoCiAgICAgICAgICAgICFfdHlwZWRlZnMuY29udGFpbnNLZXkodHlwZWRlZi5uYW1lKSwKICAgICAgICAgICAgIkR1cGxpY2F0ZSB0eXBlZGVmICcke3R5cGVkZWYubmFtZX0nIGluICRfdHlwZWRlZnMgIgogICAgICAgICAgICAidHJ5aW5nIHRvIGFkZCAkdHlwZWRlZi4iKTsKICAgICAgICBfdHlwZWRlZnNbdHlwZWRlZi5uYW1lXSA9IHR5cGVkZWY7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfdHlwZWRlZnNbbmFtZV07CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgW19NZW1iZXJEYXRhXSBmb3IgdGhlIG1lbWJlciB1bmlxdWVseSBpZGVudGlmaWVkIGJ5IFtuYW1lXSBpbgogIC8vLyB0aGlzIGxpYnJhcnkuCiAgX01lbWJlckRhdGEgbG9va3VwTWVtYmVyKFN0cmluZyBuYW1lKSB7CiAgICBpZiAoX21lbWJlcnMgPT0gbnVsbCkgewogICAgICBfbWVtYmVycyA9IHt9OwogICAgICBmb3IgKGlyLk1lbWJlciBtZW1iZXIgaW4gbm9kZS5tZW1iZXJzKSB7CiAgICAgICAgU3RyaW5nIG5hbWUgPSBfY29tcHV0ZU1lbWJlck5hbWUobWVtYmVyKTsKICAgICAgICBpZiAobmFtZSA9PSBudWxsKSBjb250aW51ZTsKICAgICAgICBhc3NlcnQoIV9tZW1iZXJzLmNvbnRhaW5zS2V5KG5hbWUpLAogICAgICAgICAgICAiRHVwbGljYXRlIG1lbWJlciAnJG5hbWUnIGluICRfbWVtYmVycyB0cnlpbmcgdG8gYWRkICRtZW1iZXIuIik7CiAgICAgICAgX21lbWJlcnNbbmFtZV0gPSBuZXcgX01lbWJlckRhdGEobWVtYmVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIF9tZW1iZXJzW25hbWVdOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ19MaWJyYXJ5RGF0YSgkbm9kZSgke2lkZW50aXR5SGFzaENvZGUobm9kZSl9KSknOwp9CgovLy8gSGVscGVyIGZvciBsb29raW5nIHVwIG1lbWJlcnMgZnJvbSBhbiBbaXIuQ2xhc3NdIG5vZGUuCmNsYXNzIF9DbGFzc0RhdGEgewogIC8vLyBUaGUgW2lyLkNsYXNzXSB0aGF0IGRlZmluZXMgdGhlIGNsYXNzLgogIGZpbmFsIGlyLkNsYXNzIG5vZGU7CgogIC8vLyBDYWNoZSBvZiBbX01lbWJlckRhdGFdIGZvciBtZW1iZXJzIGluIHRoaXMgY2xhc3MuCiAgTWFwPFN0cmluZywgX01lbWJlckRhdGE+IF9tZW1iZXJzOwoKICBfQ2xhc3NEYXRhKHRoaXMubm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbX01lbWJlckRhdGFdIGZvciB0aGUgbWVtYmVyIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgW25hbWVdIGluCiAgLy8vIHRoaXMgY2xhc3MuCiAgX01lbWJlckRhdGEgbG9va3VwTWVtYmVyKFN0cmluZyBuYW1lKSB7CiAgICBpZiAoX21lbWJlcnMgPT0gbnVsbCkgewogICAgICBfbWVtYmVycyA9IHt9OwogICAgICBmb3IgKGlyLk1lbWJlciBtZW1iZXIgaW4gbm9kZS5tZW1iZXJzKSB7CiAgICAgICAgU3RyaW5nIG5hbWUgPSBfY29tcHV0ZU1lbWJlck5hbWUobWVtYmVyKTsKICAgICAgICBpZiAobmFtZSA9PSBudWxsKSBjb250aW51ZTsKICAgICAgICBhc3NlcnQoIV9tZW1iZXJzLmNvbnRhaW5zS2V5KG5hbWUpLAogICAgICAgICAgICAiRHVwbGljYXRlIG1lbWJlciAnJG5hbWUnIGluICRfbWVtYmVycyB0cnlpbmcgdG8gYWRkICRtZW1iZXIuIik7CiAgICAgICAgX21lbWJlcnNbbmFtZV0gPSBuZXcgX01lbWJlckRhdGEobWVtYmVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIF9tZW1iZXJzW25hbWVdOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ19DbGFzc0RhdGEoJG5vZGUoJHtpZGVudGl0eUhhc2hDb2RlKG5vZGUpfSkpJzsKfQoKLy8vIEhlbHBlciBmb3IgbG9va2luZyB1cCBjaGlsZCBbaXIuVHJlZU5vZGVdcyBvZiBhIFtpci5NZW1iZXJdIG5vZGUuCmNsYXNzIF9NZW1iZXJEYXRhIHsKICAvLy8gVGhlIFtpci5NZW1iZXJdIHRoYXQgZGVmaW5lcyB0aGUgbWVtYmVyLgogIGZpbmFsIGlyLk1lbWJlciBub2RlOwoKICAvLy8gQ2FjaGVkIGluZGV4IHRvIFtpci5UcmVlTm9kZV0gbWFwIHVzZWQgZm9yIGRlc2VyaWFsaXphdGlvbiBvZgogIC8vLyBbaXIuVHJlZU5vZGVdcy4KICBNYXA8aW50LCBpci5UcmVlTm9kZT4gX2luZGV4VG9Ob2RlTWFwOwoKICAvLy8gQ2FjaGVkIFtpci5UcmVlTm9kZV0gdG8gaW5kZXggbWFwIHVzZWQgZm9yIHNlcmlhbGl6YXRpb24gb2YKICAvLy8gW2lyLlRyZWVOb2RlXXMuCiAgTWFwPGlyLlRyZWVOb2RlLCBpbnQ+IF9ub2RlVG9JbmRleE1hcDsKCiAgX01lbWJlckRhdGEodGhpcy5ub2RlKTsKCiAgdm9pZCBfZW5zdXJlTWFwcygpIHsKICAgIGlmIChfaW5kZXhUb05vZGVNYXAgPT0gbnVsbCkgewogICAgICBfaW5kZXhUb05vZGVNYXAgPSB7fTsKICAgICAgX25vZGVUb0luZGV4TWFwID0ge307CiAgICAgIG5vZGUuYWNjZXB0KAogICAgICAgICAgbmV3IF9UcmVlTm9kZUluZGV4ZXJWaXNpdG9yKF9pbmRleFRvTm9kZU1hcCwgX25vZGVUb0luZGV4TWFwKSk7CiAgICB9CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgW2lyLlRyZWVOb2RlXSBjb3JyZXNwb25kaW5nIHRvIFtpbmRleF0gaW4gdGhpcyBtZW1iZXIuCiAgaXIuVHJlZU5vZGUgZ2V0VHJlZU5vZGVCeUluZGV4KGludCBpbmRleCkgewogICAgX2Vuc3VyZU1hcHMoKTsKICAgIGlyLlRyZWVOb2RlIHRyZWVOb2RlID0gX2luZGV4VG9Ob2RlTWFwW2luZGV4XTsKICAgIGFzc2VydCh0cmVlTm9kZSAhPSBudWxsLCAiTm8gVHJlZU5vZGUgZm91bmQgZm9yIGluZGV4ICRpbmRleCBpbiAkbm9kZS4iKTsKICAgIHJldHVybiB0cmVlTm9kZTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBpbmRleCBjb3JyZXNwb25kaW5nIHRvIFtpci5UcmVlTm9kZV0gaW4gdGhpcyBtZW1iZXIuCiAgaW50IGdldEluZGV4QnlUcmVlTm9kZShpci5UcmVlTm9kZSBub2RlKSB7CiAgICBfZW5zdXJlTWFwcygpOwogICAgaW50IGluZGV4ID0gX25vZGVUb0luZGV4TWFwW25vZGVdOwogICAgYXNzZXJ0KGluZGV4ICE9IG51bGwsICJObyBpbmRleCBmb3VuZCBmb3IgJHtub2RlLnJ1bnRpbWVUeXBlfS4iKTsKICAgIHJldHVybiBpbmRleDsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdfTWVtYmVyRGF0YSgkbm9kZSgke2lkZW50aXR5SGFzaENvZGUobm9kZSl9KSknOwp9CoC9AE5OPAEeAUsYIQE9JgEkAVE3Hxg5RAgGM0ERBAIBTg4uH0ZMGBEEIiIVJzMXORMGBA8CAUkVMRkBOSQBQCUBOiUBGwFFKBwVKzBPMggGGwQBKh0WMhAyQSgrCAYcBAFQFCocFS8yJCxNMggGGwQBDEkCATsTLRcBOCUBGQFQEiocFS8yJCxNMggGGwQBDEcCAUYULxgBRBYpAUIWKQEaARcjHBwTSgYEAUkuEzNOFQQBRy0TJ0YSBAEMSAIBM3BhY2thZ2U6Y29tcGlsZXIvc3JjL3NlcmlhbGl6YXRpb24vbWVtYmVyX2RhdGEuZGFydDdzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9zZXJpYWxpemF0aW9uL21peGlucy5kYXJ0wABE4C8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mICdzZXJpYWxpemF0aW9uLmRhcnQnOwoKLy8vIE1peGluIHRoYXQgaW1wbGVtZW50cyBhbGwgY29udmVuaWVuY2UgbWV0aG9kcyBvZiBbRGF0YVNvdXJjZV0uCmFic3RyYWN0IGNsYXNzIERhdGFTb3VyY2VNaXhpbiBpbXBsZW1lbnRzIERhdGFTb3VyY2UgewogIEBvdmVycmlkZQogIEUgcmVhZFZhbHVlT3JOdWxsPEU+KEUgZigpKSB7CiAgICBib29sIGhhc1ZhbHVlID0gcmVhZEJvb2woKTsKICAgIGlmIChoYXNWYWx1ZSkgewogICAgICByZXR1cm4gZigpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PEU+IHJlYWRMaXN0PEU+KEUgZigpLCB7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBpZiAoY291bnQgPT0gMCAmJiBlbXB0eUFzTnVsbCkgcmV0dXJuIG51bGw7CiAgICBMaXN0PEU+IGxpc3QgPSBuZXcgTGlzdDxFPihjb3VudCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgbGlzdFtpXSA9IGYoKTsKICAgIH0KICAgIHJldHVybiBsaXN0OwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHJlYWRJbnRPck51bGwoKSB7CiAgICBib29sIGhhc1ZhbHVlID0gcmVhZEJvb2woKTsKICAgIGlmIChoYXNWYWx1ZSkgewogICAgICByZXR1cm4gcmVhZEludCgpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgcmVhZFN0cmluZ09yTnVsbCgpIHsKICAgIGJvb2wgaGFzVmFsdWUgPSByZWFkQm9vbCgpOwogICAgaWYgKGhhc1ZhbHVlKSB7CiAgICAgIHJldHVybiByZWFkU3RyaW5nKCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8U3RyaW5nPiByZWFkU3RyaW5ncyh7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBpZiAoY291bnQgPT0gMCAmJiBlbXB0eUFzTnVsbCkgcmV0dXJuIG51bGw7CiAgICBMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBMaXN0PFN0cmluZz4oY291bnQpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIGxpc3RbaV0gPSByZWFkU3RyaW5nKCk7CiAgICB9CiAgICByZXR1cm4gbGlzdDsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8RGFydFR5cGU+IHJlYWREYXJ0VHlwZXMoe2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSkgewogICAgaW50IGNvdW50ID0gcmVhZEludCgpOwogICAgaWYgKGNvdW50ID09IDAgJiYgZW1wdHlBc051bGwpIHJldHVybiBudWxsOwogICAgTGlzdDxEYXJ0VHlwZT4gbGlzdCA9IG5ldyBMaXN0PERhcnRUeXBlPihjb3VudCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgbGlzdFtpXSA9IHJlYWREYXJ0VHlwZSgpOwogICAgfQogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PGlyLlR5cGVQYXJhbWV0ZXI+IHJlYWRUeXBlUGFyYW1ldGVyTm9kZXMoe2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSkgewogICAgaW50IGNvdW50ID0gcmVhZEludCgpOwogICAgaWYgKGNvdW50ID09IDAgJiYgZW1wdHlBc051bGwpIHJldHVybiBudWxsOwogICAgTGlzdDxpci5UeXBlUGFyYW1ldGVyPiBsaXN0ID0gbmV3IExpc3Q8aXIuVHlwZVBhcmFtZXRlcj4oY291bnQpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIGxpc3RbaV0gPSByZWFkVHlwZVBhcmFtZXRlck5vZGUoKTsKICAgIH0KICAgIHJldHVybiBsaXN0OwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxFPiByZWFkTWVtYmVyczxFIGV4dGVuZHMgTWVtYmVyRW50aXR5Pih7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBpZiAoY291bnQgPT0gMCAmJiBlbXB0eUFzTnVsbCkgcmV0dXJuIG51bGw7CiAgICBMaXN0PEU+IGxpc3QgPSBuZXcgTGlzdDxFPihjb3VudCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IHJlYWRNZW1iZXIoKTsKICAgICAgbGlzdFtpXSA9IG1lbWJlcjsKICAgIH0KICAgIHJldHVybiBsaXN0OwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxFPiByZWFkTWVtYmVyTm9kZXM8RSBleHRlbmRzIGlyLk1lbWJlcj4oe2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSkgewogICAgaW50IGNvdW50ID0gcmVhZEludCgpOwogICAgaWYgKGNvdW50ID09IDAgJiYgZW1wdHlBc051bGwpIHJldHVybiBudWxsOwogICAgTGlzdDxFPiBsaXN0ID0gbmV3IExpc3Q8RT4oY291bnQpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIGlyLk1lbWJlciB2YWx1ZSA9IHJlYWRNZW1iZXJOb2RlKCk7CiAgICAgIGxpc3RbaV0gPSB2YWx1ZTsKICAgIH0KICAgIHJldHVybiBsaXN0OwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxFPiByZWFkQ2xhc3NlczxFIGV4dGVuZHMgQ2xhc3NFbnRpdHk+KHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pIHsKICAgIGludCBjb3VudCA9IHJlYWRJbnQoKTsKICAgIGlmIChjb3VudCA9PSAwICYmIGVtcHR5QXNOdWxsKSByZXR1cm4gbnVsbDsKICAgIExpc3Q8RT4gbGlzdCA9IG5ldyBMaXN0PEU+KGNvdW50KTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBDbGFzc0VudGl0eSBjbHMgPSByZWFkQ2xhc3MoKTsKICAgICAgbGlzdFtpXSA9IGNsczsKICAgIH0KICAgIHJldHVybiBsaXN0OwogIH0KCiAgQG92ZXJyaWRlCiAgTWFwPEssIFY+IHJlYWRMaWJyYXJ5TWFwPEsgZXh0ZW5kcyBMaWJyYXJ5RW50aXR5LCBWPihWIGYoKSwKICAgICAge2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSkgewogICAgaW50IGNvdW50ID0gcmVhZEludCgpOwogICAgaWYgKGNvdW50ID09IDAgJiYgZW1wdHlBc051bGwpIHJldHVybiBudWxsOwogICAgTWFwPEssIFY+IG1hcCA9IHt9OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIExpYnJhcnlFbnRpdHkgbGlicmFyeSA9IHJlYWRMaWJyYXJ5KCk7CiAgICAgIFYgdmFsdWUgPSBmKCk7CiAgICAgIG1hcFtsaWJyYXJ5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG1hcDsKICB9CgogIEBvdmVycmlkZQogIE1hcDxLLCBWPiByZWFkQ2xhc3NNYXA8SyBleHRlbmRzIENsYXNzRW50aXR5LCBWPihWIGYoKSwKICAgICAge2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSkgewogICAgaW50IGNvdW50ID0gcmVhZEludCgpOwogICAgaWYgKGNvdW50ID09IDAgJiYgZW1wdHlBc051bGwpIHJldHVybiBudWxsOwogICAgTWFwPEssIFY+IG1hcCA9IHt9OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIENsYXNzRW50aXR5IGNscyA9IHJlYWRDbGFzcygpOwogICAgICBWIHZhbHVlID0gZigpOwogICAgICBtYXBbY2xzXSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG1hcDsKICB9CgogIEBvdmVycmlkZQogIE1hcDxLLCBWPiByZWFkTWVtYmVyTWFwPEsgZXh0ZW5kcyBNZW1iZXJFbnRpdHksIFY+KFYgZigpLAogICAgICB7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBpZiAoY291bnQgPT0gMCAmJiBlbXB0eUFzTnVsbCkgcmV0dXJuIG51bGw7CiAgICBNYXA8SywgVj4gbWFwID0ge307CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IHJlYWRNZW1iZXIoKTsKICAgICAgViB2YWx1ZSA9IGYoKTsKICAgICAgbWFwW21lbWJlcl0gPSB2YWx1ZTsKICAgIH0KICAgIHJldHVybiBtYXA7CiAgfQoKICBAb3ZlcnJpZGUKICBNYXA8SywgVj4gcmVhZE1lbWJlck5vZGVNYXA8SyBleHRlbmRzIGlyLk1lbWJlciwgVj4oViBmKCksCiAgICAgIHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pIHsKICAgIGludCBjb3VudCA9IHJlYWRJbnQoKTsKICAgIGlmIChjb3VudCA9PSAwICYmIGVtcHR5QXNOdWxsKSByZXR1cm4gbnVsbDsKICAgIE1hcDxLLCBWPiBtYXAgPSB7fTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBpci5NZW1iZXIgbm9kZSA9IHJlYWRNZW1iZXJOb2RlKCk7CiAgICAgIFYgdmFsdWUgPSBmKCk7CiAgICAgIG1hcFtub2RlXSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG1hcDsKICB9CgogIEBvdmVycmlkZQogIE1hcDxLLCBWPiByZWFkVHJlZU5vZGVNYXA8SyBleHRlbmRzIGlyLlRyZWVOb2RlLCBWPihWIGYoKSwKICAgICAge2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSkgewogICAgaW50IGNvdW50ID0gcmVhZEludCgpOwogICAgaWYgKGNvdW50ID09IDAgJiYgZW1wdHlBc051bGwpIHJldHVybiBudWxsOwogICAgTWFwPEssIFY+IG1hcCA9IHt9OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIGlyLlRyZWVOb2RlIG5vZGUgPSByZWFkVHJlZU5vZGUoKTsKICAgICAgViB2YWx1ZSA9IGYoKTsKICAgICAgbWFwW25vZGVdID0gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gbWFwOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxFPiByZWFkTG9jYWxzPEUgZXh0ZW5kcyBMb2NhbD4oe2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSkgewogICAgaW50IGNvdW50ID0gcmVhZEludCgpOwogICAgaWYgKGNvdW50ID09IDAgJiYgZW1wdHlBc051bGwpIHJldHVybiBudWxsOwogICAgTGlzdDxFPiBsaXN0ID0gbmV3IExpc3Q8RT4oY291bnQpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIExvY2FsIGxvY2FsID0gcmVhZExvY2FsKCk7CiAgICAgIGxpc3RbaV0gPSBsb2NhbDsKICAgIH0KICAgIHJldHVybiBsaXN0OwogIH0KCiAgQG92ZXJyaWRlCiAgTWFwPEssIFY+IHJlYWRMb2NhbE1hcDxLIGV4dGVuZHMgTG9jYWwsIFY+KFYgZigpLCB7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBpZiAoY291bnQgPT0gMCAmJiBlbXB0eUFzTnVsbCkgcmV0dXJuIG51bGw7CiAgICBNYXA8SywgVj4gbWFwID0ge307CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgTG9jYWwgbG9jYWwgPSByZWFkTG9jYWwoKTsKICAgICAgViB2YWx1ZSA9IGYoKTsKICAgICAgbWFwW2xvY2FsXSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG1hcDsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8RT4gcmVhZFRyZWVOb2RlczxFIGV4dGVuZHMgaXIuVHJlZU5vZGU+KHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pIHsKICAgIGludCBjb3VudCA9IHJlYWRJbnQoKTsKICAgIGlmIChjb3VudCA9PSAwICYmIGVtcHR5QXNOdWxsKSByZXR1cm4gbnVsbDsKICAgIExpc3Q8RT4gbGlzdCA9IG5ldyBMaXN0PEU+KGNvdW50KTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBpci5UcmVlTm9kZSBub2RlID0gcmVhZFRyZWVOb2RlKCk7CiAgICAgIGxpc3RbaV0gPSBub2RlOwogICAgfQogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICBAb3ZlcnJpZGUKICBNYXA8U3RyaW5nLCBWPiByZWFkU3RyaW5nTWFwPFY+KFYgZigpLCB7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBpZiAoY291bnQgPT0gMCAmJiBlbXB0eUFzTnVsbCkgcmV0dXJuIG51bGw7CiAgICBNYXA8U3RyaW5nLCBWPiBtYXAgPSB7fTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBTdHJpbmcga2V5ID0gcmVhZFN0cmluZygpOwogICAgICBWIHZhbHVlID0gZigpOwogICAgICBtYXBba2V5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG1hcDsKICB9CgogIEBvdmVycmlkZQogIEluZGV4ZWRDbGFzcyByZWFkQ2xhc3NPck51bGwoKSB7CiAgICBib29sIGhhc0NsYXNzID0gcmVhZEJvb2woKTsKICAgIGlmIChoYXNDbGFzcykgewogICAgICByZXR1cm4gcmVhZENsYXNzKCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIGlyLlRyZWVOb2RlIHJlYWRUcmVlTm9kZU9yTnVsbCgpIHsKICAgIGJvb2wgaGFzVmFsdWUgPSByZWFkQm9vbCgpOwogICAgaWYgKGhhc1ZhbHVlKSB7CiAgICAgIHJldHVybiByZWFkVHJlZU5vZGUoKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5kZXhlZE1lbWJlciByZWFkTWVtYmVyT3JOdWxsKCkgewogICAgYm9vbCBoYXNWYWx1ZSA9IHJlYWRCb29sKCk7CiAgICBpZiAoaGFzVmFsdWUpIHsKICAgICAgcmV0dXJuIHJlYWRNZW1iZXIoKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgTG9jYWwgcmVhZExvY2FsT3JOdWxsKCkgewogICAgYm9vbCBoYXNWYWx1ZSA9IHJlYWRCb29sKCk7CiAgICBpZiAoaGFzVmFsdWUpIHsKICAgICAgcmV0dXJuIHJlYWRMb2NhbCgpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHJlYWRDb25zdGFudE9yTnVsbCgpIHsKICAgIGJvb2wgaGFzQ2xhc3MgPSByZWFkQm9vbCgpOwogICAgaWYgKGhhc0NsYXNzKSB7CiAgICAgIHJldHVybiByZWFkQ29uc3RhbnQoKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxFPiByZWFkQ29uc3RhbnRzPEUgZXh0ZW5kcyBDb25zdGFudFZhbHVlPih7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBpZiAoY291bnQgPT0gMCAmJiBlbXB0eUFzTnVsbCkgcmV0dXJuIG51bGw7CiAgICBMaXN0PEU+IGxpc3QgPSBuZXcgTGlzdDxFPihjb3VudCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgQ29uc3RhbnRWYWx1ZSB2YWx1ZSA9IHJlYWRDb25zdGFudCgpOwogICAgICBsaXN0W2ldID0gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gbGlzdDsKICB9CgogIEBvdmVycmlkZQogIE1hcDxLLCBWPiByZWFkQ29uc3RhbnRNYXA8SyBleHRlbmRzIENvbnN0YW50VmFsdWUsIFY+KFYgZigpLAogICAgICB7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBpZiAoY291bnQgPT0gMCAmJiBlbXB0eUFzTnVsbCkgcmV0dXJuIG51bGw7CiAgICBNYXA8SywgVj4gbWFwID0ge307CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgQ29uc3RhbnRWYWx1ZSBrZXkgPSByZWFkQ29uc3RhbnQoKTsKICAgICAgViB2YWx1ZSA9IGYoKTsKICAgICAgbWFwW2tleV0gPSB2YWx1ZTsKICAgIH0KICAgIHJldHVybiBtYXA7CiAgfQoKICBAb3ZlcnJpZGUKICBJbmRleGVkTGlicmFyeSByZWFkTGlicmFyeU9yTnVsbCgpIHsKICAgIGJvb2wgaGFzVmFsdWUgPSByZWFkQm9vbCgpOwogICAgaWYgKGhhc1ZhbHVlKSB7CiAgICAgIHJldHVybiByZWFkTGlicmFyeSgpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PEltcG9ydEVudGl0eT4gcmVhZEltcG9ydHMoe2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSkgewogICAgaW50IGNvdW50ID0gcmVhZEludCgpOwogICAgaWYgKGNvdW50ID09IDAgJiYgZW1wdHlBc051bGwpIHJldHVybiBudWxsOwogICAgTGlzdDxJbXBvcnRFbnRpdHk+IGxpc3QgPSBuZXcgTGlzdDxJbXBvcnRFbnRpdHk+KGNvdW50KTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBsaXN0W2ldID0gcmVhZEltcG9ydCgpOwogICAgfQogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICBAb3ZlcnJpZGUKICBNYXA8SW1wb3J0RW50aXR5LCBWPiByZWFkSW1wb3J0TWFwPFY+KFYgZigpLCB7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBpZiAoY291bnQgPT0gMCAmJiBlbXB0eUFzTnVsbCkgcmV0dXJuIG51bGw7CiAgICBNYXA8SW1wb3J0RW50aXR5LCBWPiBtYXAgPSB7fTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBJbXBvcnRFbnRpdHkga2V5ID0gcmVhZEltcG9ydCgpOwogICAgICBWIHZhbHVlID0gZigpOwogICAgICBtYXBba2V5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG1hcDsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8aXIuRGFydFR5cGU+IHJlYWREYXJ0VHlwZU5vZGVzKHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pIHsKICAgIGludCBjb3VudCA9IHJlYWRJbnQoKTsKICAgIGlmIChjb3VudCA9PSAwICYmIGVtcHR5QXNOdWxsKSByZXR1cm4gbnVsbDsKICAgIExpc3Q8aXIuRGFydFR5cGU+IGxpc3QgPSBuZXcgTGlzdDxpci5EYXJ0VHlwZT4oY291bnQpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIGxpc3RbaV0gPSByZWFkRGFydFR5cGVOb2RlKCk7CiAgICB9CiAgICByZXR1cm4gbGlzdDsKICB9CgogIEBvdmVycmlkZQogIGlyLk5hbWUgcmVhZE5hbWUoKSB7CiAgICBTdHJpbmcgdGV4dCA9IHJlYWRTdHJpbmcoKTsKICAgIGlyLkxpYnJhcnkgbGlicmFyeSA9IHJlYWRWYWx1ZU9yTnVsbChyZWFkTGlicmFyeU5vZGUpOwogICAgcmV0dXJuIG5ldyBpci5OYW1lKHRleHQsIGxpYnJhcnkpOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuTGlicmFyeURlcGVuZGVuY3kgcmVhZExpYnJhcnlEZXBlbmRlbmN5Tm9kZSgpIHsKICAgIGlyLkxpYnJhcnkgbGlicmFyeSA9IHJlYWRMaWJyYXJ5Tm9kZSgpOwogICAgaW50IGluZGV4ID0gcmVhZEludCgpOwogICAgcmV0dXJuIGxpYnJhcnkuZGVwZW5kZW5jaWVzW2luZGV4XTsKICB9CgogIEBvdmVycmlkZQogIGlyLkxpYnJhcnlEZXBlbmRlbmN5IHJlYWRMaWJyYXJ5RGVwZW5kZW5jeU5vZGVPck51bGwoKSB7CiAgICByZXR1cm4gcmVhZFZhbHVlT3JOdWxsKHJlYWRMaWJyYXJ5RGVwZW5kZW5jeU5vZGUpOwogIH0KfQoKLy8vIE1peGluIHRoYXQgaW1wbGVtZW50cyBhbGwgY29udmVuaWVuY2UgbWV0aG9kcyBvZiBbRGF0YVNpbmtdLgphYnN0cmFjdCBjbGFzcyBEYXRhU2lua01peGluIGltcGxlbWVudHMgRGF0YVNpbmsgewogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVJbnRPck51bGwoaW50IHZhbHVlKSB7CiAgICB3cml0ZUJvb2wodmFsdWUgIT0gbnVsbCk7CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICB3cml0ZUludCh2YWx1ZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlU3RyaW5nT3JOdWxsKFN0cmluZyB2YWx1ZSkgewogICAgd3JpdGVCb29sKHZhbHVlICE9IG51bGwpOwogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgd3JpdGVTdHJpbmcodmFsdWUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUNsYXNzT3JOdWxsKEluZGV4ZWRDbGFzcyB2YWx1ZSkgewogICAgd3JpdGVCb29sKHZhbHVlICE9IG51bGwpOwogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgd3JpdGVDbGFzcyh2YWx1ZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlTG9jYWxPck51bGwoTG9jYWwgdmFsdWUpIHsKICAgIHdyaXRlQm9vbCh2YWx1ZSAhPSBudWxsKTsKICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlTG9jYWwodmFsdWUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUNsYXNzZXMoSXRlcmFibGU8Q2xhc3NFbnRpdHk+IHZhbHVlcywge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewogICAgICBhc3NlcnQoYWxsb3dOdWxsKTsKICAgICAgd3JpdGVJbnQoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUludCh2YWx1ZXMubGVuZ3RoKTsKICAgICAgZm9yIChJbmRleGVkQ2xhc3MgdmFsdWUgaW4gdmFsdWVzKSB7CiAgICAgICAgd3JpdGVDbGFzcyh2YWx1ZSk7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUcmVlTm9kZXMoSXRlcmFibGU8aXIuVHJlZU5vZGU+IHZhbHVlcywge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewogICAgICBhc3NlcnQoYWxsb3dOdWxsKTsKICAgICAgd3JpdGVJbnQoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUludCh2YWx1ZXMubGVuZ3RoKTsKICAgICAgZm9yIChpci5UcmVlTm9kZSB2YWx1ZSBpbiB2YWx1ZXMpIHsKICAgICAgICB3cml0ZVRyZWVOb2RlKHZhbHVlKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVN0cmluZ3MoSXRlcmFibGU8U3RyaW5nPiB2YWx1ZXMsIHtib29sIGFsbG93TnVsbDogZmFsc2V9KSB7CiAgICBpZiAodmFsdWVzID09IG51bGwpIHsKICAgICAgYXNzZXJ0KGFsbG93TnVsbCk7CiAgICAgIHdyaXRlSW50KDApOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVJbnQodmFsdWVzLmxlbmd0aCk7CiAgICAgIGZvciAoU3RyaW5nIHZhbHVlIGluIHZhbHVlcykgewogICAgICAgIHdyaXRlU3RyaW5nKHZhbHVlKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZU1lbWJlck5vZGVzKEl0ZXJhYmxlPGlyLk1lbWJlcj4gdmFsdWVzLCB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7CiAgICAgIGFzc2VydChhbGxvd051bGwpOwogICAgICB3cml0ZUludCgwKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlSW50KHZhbHVlcy5sZW5ndGgpOwogICAgICBmb3IgKGlyLk1lbWJlciB2YWx1ZSBpbiB2YWx1ZXMpIHsKICAgICAgICB3cml0ZU1lbWJlck5vZGUodmFsdWUpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlRGFydFR5cGVzKEl0ZXJhYmxlPERhcnRUeXBlPiB2YWx1ZXMsIHtib29sIGFsbG93TnVsbDogZmFsc2V9KSB7CiAgICBpZiAodmFsdWVzID09IG51bGwpIHsKICAgICAgYXNzZXJ0KGFsbG93TnVsbCk7CiAgICAgIHdyaXRlSW50KDApOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVJbnQodmFsdWVzLmxlbmd0aCk7CiAgICAgIGZvciAoRGFydFR5cGUgdmFsdWUgaW4gdmFsdWVzKSB7CiAgICAgICAgd3JpdGVEYXJ0VHlwZSh2YWx1ZSk7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVMaWJyYXJ5TWFwPFY+KE1hcDxMaWJyYXJ5RW50aXR5LCBWPiBtYXAsIHZvaWQgZihWIHZhbHVlKSwKICAgICAge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmIChtYXAgPT0gbnVsbCkgewogICAgICBhc3NlcnQoYWxsb3dOdWxsKTsKICAgICAgd3JpdGVJbnQoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUludChtYXAubGVuZ3RoKTsKICAgICAgbWFwLmZvckVhY2goKExpYnJhcnlFbnRpdHkgbGlicmFyeSwgViB2YWx1ZSkgewogICAgICAgIHdyaXRlTGlicmFyeShsaWJyYXJ5KTsKICAgICAgICBmKHZhbHVlKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlQ2xhc3NNYXA8Vj4oTWFwPENsYXNzRW50aXR5LCBWPiBtYXAsIHZvaWQgZihWIHZhbHVlKSwKICAgICAge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmIChtYXAgPT0gbnVsbCkgewogICAgICBhc3NlcnQoYWxsb3dOdWxsKTsKICAgICAgd3JpdGVJbnQoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUludChtYXAubGVuZ3RoKTsKICAgICAgbWFwLmZvckVhY2goKENsYXNzRW50aXR5IGNscywgViB2YWx1ZSkgewogICAgICAgIHdyaXRlQ2xhc3MoY2xzKTsKICAgICAgICBmKHZhbHVlKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlTWVtYmVyTWFwPFY+KE1hcDxNZW1iZXJFbnRpdHksIFY+IG1hcCwgdm9pZCBmKFYgdmFsdWUpLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgaWYgKG1hcCA9PSBudWxsKSB7CiAgICAgIGFzc2VydChhbGxvd051bGwpOwogICAgICB3cml0ZUludCgwKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlSW50KG1hcC5sZW5ndGgpOwogICAgICBtYXAuZm9yRWFjaCgoTWVtYmVyRW50aXR5IG1lbWJlciwgViB2YWx1ZSkgewogICAgICAgIHdyaXRlTWVtYmVyKG1lbWJlcik7CiAgICAgICAgZih2YWx1ZSk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVN0cmluZ01hcDxWPihNYXA8U3RyaW5nLCBWPiBtYXAsIHZvaWQgZihWIHZhbHVlKSwKICAgICAge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmIChtYXAgPT0gbnVsbCkgewogICAgICBhc3NlcnQoYWxsb3dOdWxsKTsKICAgICAgd3JpdGVJbnQoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUludChtYXAubGVuZ3RoKTsKICAgICAgbWFwLmZvckVhY2goKFN0cmluZyBrZXksIFYgdmFsdWUpIHsKICAgICAgICB3cml0ZVN0cmluZyhrZXkpOwogICAgICAgIGYodmFsdWUpOwogICAgICB9KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVMb2NhbHMoSXRlcmFibGU8TG9jYWw+IHZhbHVlcywge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewogICAgICBhc3NlcnQoYWxsb3dOdWxsKTsKICAgICAgd3JpdGVJbnQoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUludCh2YWx1ZXMubGVuZ3RoKTsKICAgICAgZm9yIChMb2NhbCB2YWx1ZSBpbiB2YWx1ZXMpIHsKICAgICAgICB3cml0ZUxvY2FsKHZhbHVlKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUxvY2FsTWFwPFY+KE1hcDxMb2NhbCwgVj4gbWFwLCB2b2lkIGYoViB2YWx1ZSksCiAgICAgIHtib29sIGFsbG93TnVsbDogZmFsc2V9KSB7CiAgICBpZiAobWFwID09IG51bGwpIHsKICAgICAgYXNzZXJ0KGFsbG93TnVsbCk7CiAgICAgIHdyaXRlSW50KDApOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVJbnQobWFwLmxlbmd0aCk7CiAgICAgIG1hcC5mb3JFYWNoKChMb2NhbCBrZXksIFYgdmFsdWUpIHsKICAgICAgICB3cml0ZUxvY2FsKGtleSk7CiAgICAgICAgZih2YWx1ZSk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZU1lbWJlck5vZGVNYXA8Vj4oTWFwPGlyLk1lbWJlciwgVj4gbWFwLCB2b2lkIGYoViB2YWx1ZSksCiAgICAgIHtib29sIGFsbG93TnVsbDogZmFsc2V9KSB7CiAgICBpZiAobWFwID09IG51bGwpIHsKICAgICAgYXNzZXJ0KGFsbG93TnVsbCk7CiAgICAgIHdyaXRlSW50KDApOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVJbnQobWFwLmxlbmd0aCk7CiAgICAgIG1hcC5mb3JFYWNoKChpci5NZW1iZXIga2V5LCBWIHZhbHVlKSB7CiAgICAgICAgd3JpdGVNZW1iZXJOb2RlKGtleSk7CiAgICAgICAgZih2YWx1ZSk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRyZWVOb2RlTWFwPFY+KE1hcDxpci5UcmVlTm9kZSwgVj4gbWFwLCB2b2lkIGYoViB2YWx1ZSksCiAgICAgIHtib29sIGFsbG93TnVsbDogZmFsc2V9KSB7CiAgICBpZiAobWFwID09IG51bGwpIHsKICAgICAgYXNzZXJ0KGFsbG93TnVsbCk7CiAgICAgIHdyaXRlSW50KDApOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVJbnQobWFwLmxlbmd0aCk7CiAgICAgIG1hcC5mb3JFYWNoKChpci5UcmVlTm9kZSBrZXksIFYgdmFsdWUpIHsKICAgICAgICB3cml0ZVRyZWVOb2RlKGtleSk7CiAgICAgICAgZih2YWx1ZSk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUxpc3Q8RT4oSXRlcmFibGU8RT4gdmFsdWVzLCB2b2lkIGYoRSB2YWx1ZSksCiAgICAgIHtib29sIGFsbG93TnVsbDogZmFsc2V9KSB7CiAgICBpZiAodmFsdWVzID09IG51bGwpIHsKICAgICAgYXNzZXJ0KGFsbG93TnVsbCk7CiAgICAgIHdyaXRlSW50KDApOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVJbnQodmFsdWVzLmxlbmd0aCk7CiAgICAgIHZhbHVlcy5mb3JFYWNoKGYpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRyZWVOb2RlT3JOdWxsKGlyLlRyZWVOb2RlIHZhbHVlKSB7CiAgICB3cml0ZUJvb2wodmFsdWUgIT0gbnVsbCk7CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICB3cml0ZVRyZWVOb2RlKHZhbHVlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVWYWx1ZU9yTnVsbDxFPihFIHZhbHVlLCB2b2lkIGYoRSB2YWx1ZSkpIHsKICAgIHdyaXRlQm9vbCh2YWx1ZSAhPSBudWxsKTsKICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIGYodmFsdWUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZU1lbWJlck9yTnVsbChJbmRleGVkTWVtYmVyIHZhbHVlKSB7CiAgICB3cml0ZUJvb2wodmFsdWUgIT0gbnVsbCk7CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICB3cml0ZU1lbWJlcih2YWx1ZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlTWVtYmVycyhJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IHZhbHVlcywge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewogICAgICBhc3NlcnQoYWxsb3dOdWxsKTsKICAgICAgd3JpdGVJbnQoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUludCh2YWx1ZXMubGVuZ3RoKTsKICAgICAgZm9yIChJbmRleGVkTWVtYmVyIHZhbHVlIGluIHZhbHVlcykgewogICAgICAgIHdyaXRlTWVtYmVyKHZhbHVlKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVR5cGVQYXJhbWV0ZXJOb2RlcyhJdGVyYWJsZTxpci5UeXBlUGFyYW1ldGVyPiB2YWx1ZXMsCiAgICAgIHtib29sIGFsbG93TnVsbDogZmFsc2V9KSB7CiAgICBpZiAodmFsdWVzID09IG51bGwpIHsKICAgICAgYXNzZXJ0KGFsbG93TnVsbCk7CiAgICAgIHdyaXRlSW50KDApOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVJbnQodmFsdWVzLmxlbmd0aCk7CiAgICAgIGZvciAoaXIuVHlwZVBhcmFtZXRlciB2YWx1ZSBpbiB2YWx1ZXMpIHsKICAgICAgICB3cml0ZVR5cGVQYXJhbWV0ZXJOb2RlKHZhbHVlKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUNvbnN0YW50T3JOdWxsKENvbnN0YW50VmFsdWUgdmFsdWUpIHsKICAgIHdyaXRlQm9vbCh2YWx1ZSAhPSBudWxsKTsKICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlQ29uc3RhbnQodmFsdWUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUNvbnN0YW50cyhJdGVyYWJsZTxDb25zdGFudFZhbHVlPiB2YWx1ZXMsIHtib29sIGFsbG93TnVsbDogZmFsc2V9KSB7CiAgICBpZiAodmFsdWVzID09IG51bGwpIHsKICAgICAgYXNzZXJ0KGFsbG93TnVsbCk7CiAgICAgIHdyaXRlSW50KDApOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVJbnQodmFsdWVzLmxlbmd0aCk7CiAgICAgIGZvciAoQ29uc3RhbnRWYWx1ZSB2YWx1ZSBpbiB2YWx1ZXMpIHsKICAgICAgICB3cml0ZUNvbnN0YW50KHZhbHVlKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUNvbnN0YW50TWFwPFY+KE1hcDxDb25zdGFudFZhbHVlLCBWPiBtYXAsIHZvaWQgZihWIHZhbHVlKSwKICAgICAge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmIChtYXAgPT0gbnVsbCkgewogICAgICBhc3NlcnQoYWxsb3dOdWxsKTsKICAgICAgd3JpdGVJbnQoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUludChtYXAubGVuZ3RoKTsKICAgICAgbWFwLmZvckVhY2goKENvbnN0YW50VmFsdWUga2V5LCBWIHZhbHVlKSB7CiAgICAgICAgd3JpdGVDb25zdGFudChrZXkpOwogICAgICAgIGYodmFsdWUpOwogICAgICB9KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVMaWJyYXJ5T3JOdWxsKEluZGV4ZWRMaWJyYXJ5IHZhbHVlKSB7CiAgICB3cml0ZUJvb2wodmFsdWUgIT0gbnVsbCk7CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICB3cml0ZUxpYnJhcnkodmFsdWUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUltcG9ydHMoSXRlcmFibGU8SW1wb3J0RW50aXR5PiB2YWx1ZXMsIHtib29sIGFsbG93TnVsbDogZmFsc2V9KSB7CiAgICBpZiAodmFsdWVzID09IG51bGwpIHsKICAgICAgYXNzZXJ0KGFsbG93TnVsbCk7CiAgICAgIHdyaXRlSW50KDApOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVJbnQodmFsdWVzLmxlbmd0aCk7CiAgICAgIGZvciAoSW1wb3J0RW50aXR5IHZhbHVlIGluIHZhbHVlcykgewogICAgICAgIHdyaXRlSW1wb3J0KHZhbHVlKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUltcG9ydE1hcDxWPihNYXA8SW1wb3J0RW50aXR5LCBWPiBtYXAsIHZvaWQgZihWIHZhbHVlKSwKICAgICAge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmIChtYXAgPT0gbnVsbCkgewogICAgICBhc3NlcnQoYWxsb3dOdWxsKTsKICAgICAgd3JpdGVJbnQoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUludChtYXAubGVuZ3RoKTsKICAgICAgbWFwLmZvckVhY2goKEltcG9ydEVudGl0eSBrZXksIFYgdmFsdWUpIHsKICAgICAgICB3cml0ZUltcG9ydChrZXkpOwogICAgICAgIGYodmFsdWUpOwogICAgICB9KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVEYXJ0VHlwZU5vZGVzKEl0ZXJhYmxlPGlyLkRhcnRUeXBlPiB2YWx1ZXMsCiAgICAgIHtib29sIGFsbG93TnVsbDogZmFsc2V9KSB7CiAgICBpZiAodmFsdWVzID09IG51bGwpIHsKICAgICAgYXNzZXJ0KGFsbG93TnVsbCk7CiAgICAgIHdyaXRlSW50KDApOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVJbnQodmFsdWVzLmxlbmd0aCk7CiAgICAgIGZvciAoaXIuRGFydFR5cGUgdmFsdWUgaW4gdmFsdWVzKSB7CiAgICAgICAgd3JpdGVEYXJ0VHlwZU5vZGUodmFsdWUpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlTmFtZShpci5OYW1lIHZhbHVlKSB7CiAgICB3cml0ZVN0cmluZyh2YWx1ZS5uYW1lKTsKICAgIHdyaXRlVmFsdWVPck51bGwodmFsdWUubGlicmFyeSwgd3JpdGVMaWJyYXJ5Tm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlTGlicmFyeURlcGVuZGVuY3lOb2RlKGlyLkxpYnJhcnlEZXBlbmRlbmN5IHZhbHVlKSB7CiAgICBpci5MaWJyYXJ5IGxpYnJhcnkgPSB2YWx1ZS5wYXJlbnQ7CiAgICB3cml0ZUxpYnJhcnlOb2RlKGxpYnJhcnkpOwogICAgd3JpdGVJbnQobGlicmFyeS5kZXBlbmRlbmNpZXMuaW5kZXhPZih2YWx1ZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUxpYnJhcnlEZXBlbmRlbmN5Tm9kZU9yTnVsbChpci5MaWJyYXJ5RGVwZW5kZW5jeSB2YWx1ZSkgewogICAgd3JpdGVWYWx1ZU9yTnVsbCh2YWx1ZSwgd3JpdGVMaWJyYXJ5RGVwZW5kZW5jeU5vZGUpOwogIH0KfQqC9ABOTjwBHgFDNwwgIBQSBhEEAQw6GzAnJhUGEQQBDBggFBgGEQQBDB4gFBsGEQQBDDgbMDEmHgYRBAEMPBswNSYgBhEEAQxNGzBFJikGEQQBDEsbMCcmKhgGEQQBDEwbMCcmKhcGEQQBDEobMCcmJRUGEQQBDD4jGzAYJi0VHAYQBAEMOiMbMBgmJRUYBhAEAQw8IxswGCYqFRsGEAQBDD0jGzAYJikVGQYQBAEMPSMbMBgmKRUZBhAEAQxDGzAnJiEXBhEEAQxRGzAYJiEVGgYQBAEMTBswJyYpFgYRBAEMRhswHSYhFRgGEAQBDCMgFBoGEQQBDCUgFB0GEQQBDCUgFBsGEQQBDBwgFBoGEQQBDCcgFB0GEQQBDE4bMCcmLBcGEQQBDD8jGzAYJioVGAYQBAEMJyAUHAYRBAEMPhswPSYeBhEEAQxMGzAjJicVGAYQBAEMQxswOyYkBhEEAQwXIDsnBAEMNSwbKAQBDDs3BAIBQTMMIx4ZFwYEAQwpHhkaBgQBDC4eGRkGBAEMJx4ZGQYEAQxNGhkTDR8rGwgGBAEMTxoZEw0fKh4IBgQBDEgaGRMNHyUcCAYEAQxPGhkTDR8oIAgGBAEMTBoZEw0fJx4IBgQBDEYhFxkTDRw1HxIKBgQBDEIhFxkTDRwvGRIKBgQBDEQhFxkTDRwzHRIKBgQBDD4hFxkTDRwqGhIKBgQBDEYaGRMNHyQbCAYEAQw8IRcZEw0cKRkSCgYEAQxFIRcZEw0cLR4SCgYEAQxFIRcZEw0cLxwSCgYEAQw5IRoZEw0fGQYEAQwwHhkcBgQBDDceGRAGBAEMMB4ZGgYEAQxOGhkTDR8sHAgGBAEMQiEaGRMNHy8nCAYEAQwyHhkcBgQBDFEaGRMNHyweCAYEAQxHIRcZEw0cMRwSCgYEAQwyHhkbBgQBDE4aGRMNHyscCAYEAQxEIRcZEw0cMBoSCgYEAQw4IRoZEw0fKiIIBgQBDCIdNwQBDEAnHzMEAQxGOQQCAS5wYWNrYWdlOmNvbXBpbGVyL3NyYy9zZXJpYWxpemF0aW9uL21peGlucy5kYXJ0PXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3NlcmlhbGl6YXRpb24vbm9kZV9pbmRleGVyLmRhcnSc0S8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mICdzZXJpYWxpemF0aW9uLmRhcnQnOwoKLy8vIFZpc2l0b3IgdGhhdCBhc2NyaWJlcyBhbiBpbmRleCB0byBhbGwgW2lyLlRyZWVOb2RlXXMgdGhhdCBwb3RlbnRpYWxseQovLy8gbmVlZGVkIGZvciBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24uCmNsYXNzIF9UcmVlTm9kZUluZGV4ZXJWaXNpdG9yIGV4dGVuZHMgaXIuVmlzaXRvcjx2b2lkPiB7CiAgaW50IF9jdXJyZW50SW5kZXggPSAwOwogIGZpbmFsIE1hcDxpbnQsIGlyLlRyZWVOb2RlPiBfaW5kZXhUb05vZGVNYXA7CiAgZmluYWwgTWFwPGlyLlRyZWVOb2RlLCBpbnQ+IF9ub2RlVG9JbmRleE1hcDsKCiAgX1RyZWVOb2RlSW5kZXhlclZpc2l0b3IodGhpcy5faW5kZXhUb05vZGVNYXAsIHRoaXMuX25vZGVUb0luZGV4TWFwKTsKCiAgdm9pZCByZWdpc3Rlck5vZGUoaXIuVHJlZU5vZGUgbm9kZSkgewogICAgX2luZGV4VG9Ob2RlTWFwW19jdXJyZW50SW5kZXhdID0gbm9kZTsKICAgIF9ub2RlVG9JbmRleE1hcFtub2RlXSA9IF9jdXJyZW50SW5kZXg7CiAgICBfY3VycmVudEluZGV4Kys7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRUcmVlTm9kZShpci5UcmVlTm9kZSBub2RlKSB7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKGlyLkZ1bmN0aW9uRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZWdpc3Rlck5vZGUobm9kZSk7CiAgICBzdXBlci52aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbihub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24gbm9kZSkgewogICAgcmVnaXN0ZXJOb2RlKG5vZGUpOwogICAgc3VwZXIudmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJsb2NrKGlyLkJsb2NrIG5vZGUpIHsKICAgIHJlZ2lzdGVyTm9kZShub2RlKTsKICAgIHN1cGVyLnZpc2l0QmxvY2sobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIGlmIChub2RlLnBhcmVudCBpcyEgaXIuRnVuY3Rpb25EZWNsYXJhdGlvbikgewogICAgICByZWdpc3Rlck5vZGUobm9kZSk7CiAgICB9CiAgICBzdXBlci52aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3dpdGNoU3RhdGVtZW50KGlyLlN3aXRjaFN0YXRlbWVudCBub2RlKSB7CiAgICByZWdpc3Rlck5vZGUobm9kZSk7CiAgICBzdXBlci52aXNpdFN3aXRjaFN0YXRlbWVudChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGb3JTdGF0ZW1lbnQoaXIuRm9yU3RhdGVtZW50IG5vZGUpIHsKICAgIHJlZ2lzdGVyTm9kZShub2RlKTsKICAgIHN1cGVyLnZpc2l0Rm9yU3RhdGVtZW50KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZvckluU3RhdGVtZW50KGlyLkZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIHJlZ2lzdGVyTm9kZShub2RlKTsKICAgIHN1cGVyLnZpc2l0Rm9ySW5TdGF0ZW1lbnQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0V2hpbGVTdGF0ZW1lbnQoaXIuV2hpbGVTdGF0ZW1lbnQgbm9kZSkgewogICAgcmVnaXN0ZXJOb2RlKG5vZGUpOwogICAgc3VwZXIudmlzaXRXaGlsZVN0YXRlbWVudChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREb1N0YXRlbWVudChpci5Eb1N0YXRlbWVudCBub2RlKSB7CiAgICByZWdpc3Rlck5vZGUobm9kZSk7CiAgICBzdXBlci52aXNpdERvU3RhdGVtZW50KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJyZWFrU3RhdGVtZW50KGlyLkJyZWFrU3RhdGVtZW50IG5vZGUpIHsKICAgIHJlZ2lzdGVyTm9kZShub2RlKTsKICAgIHN1cGVyLnZpc2l0QnJlYWtTdGF0ZW1lbnQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGlzdExpdGVyYWwoaXIuTGlzdExpdGVyYWwgbm9kZSkgewogICAgcmVnaXN0ZXJOb2RlKG5vZGUpOwogICAgc3VwZXIudmlzaXRMaXN0TGl0ZXJhbChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTZXRMaXRlcmFsKGlyLlNldExpdGVyYWwgbm9kZSkgewogICAgcmVnaXN0ZXJOb2RlKG5vZGUpOwogICAgc3VwZXIudmlzaXRTZXRMaXRlcmFsKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE1hcExpdGVyYWwoaXIuTWFwTGl0ZXJhbCBub2RlKSB7CiAgICByZWdpc3Rlck5vZGUobm9kZSk7CiAgICBzdXBlci52aXNpdE1hcExpdGVyYWwobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UHJvcGVydHlHZXQoaXIuUHJvcGVydHlHZXQgbm9kZSkgewogICAgcmVnaXN0ZXJOb2RlKG5vZGUpOwogICAgc3VwZXIudmlzaXRQcm9wZXJ0eUdldChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRQcm9wZXJ0eVNldChpci5Qcm9wZXJ0eVNldCBub2RlKSB7CiAgICByZWdpc3Rlck5vZGUobm9kZSk7CiAgICBzdXBlci52aXNpdFByb3BlcnR5U2V0KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE1ldGhvZEludm9jYXRpb24oaXIuTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICByZWdpc3Rlck5vZGUobm9kZSk7CiAgICBzdXBlci52aXNpdE1ldGhvZEludm9jYXRpb24obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RGlyZWN0UHJvcGVydHlHZXQoaXIuRGlyZWN0UHJvcGVydHlHZXQgbm9kZSkgewogICAgcmVnaXN0ZXJOb2RlKG5vZGUpOwogICAgc3VwZXIudmlzaXREaXJlY3RQcm9wZXJ0eUdldChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREaXJlY3RQcm9wZXJ0eVNldChpci5EaXJlY3RQcm9wZXJ0eVNldCBub2RlKSB7CiAgICByZWdpc3Rlck5vZGUobm9kZSk7CiAgICBzdXBlci52aXNpdERpcmVjdFByb3BlcnR5U2V0KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERpcmVjdE1ldGhvZEludm9jYXRpb24oaXIuRGlyZWN0TWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICByZWdpc3Rlck5vZGUobm9kZSk7CiAgICBzdXBlci52aXNpdERpcmVjdE1ldGhvZEludm9jYXRpb24obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RhdGljSW52b2NhdGlvbihpci5TdGF0aWNJbnZvY2F0aW9uIG5vZGUpIHsKICAgIHJlZ2lzdGVyTm9kZShub2RlKTsKICAgIHN1cGVyLnZpc2l0U3RhdGljSW52b2NhdGlvbihub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMYWJlbGVkU3RhdGVtZW50KGlyLkxhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgewogICAgcmVnaXN0ZXJOb2RlKG5vZGUpOwogICAgc3VwZXIudmlzaXRMYWJlbGVkU3RhdGVtZW50KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN3aXRjaENhc2UoaXIuU3dpdGNoQ2FzZSBub2RlKSB7CiAgICByZWdpc3Rlck5vZGUobm9kZSk7CiAgICBzdXBlci52aXNpdFN3aXRjaENhc2Uobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29udGludWVTd2l0Y2hTdGF0ZW1lbnQoaXIuQ29udGludWVTd2l0Y2hTdGF0ZW1lbnQgbm9kZSkgewogICAgcmVnaXN0ZXJOb2RlKG5vZGUpOwogICAgc3VwZXIudmlzaXRDb250aW51ZVN3aXRjaFN0YXRlbWVudChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oaXIuQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpIHsKICAgIHJlZ2lzdGVyTm9kZShub2RlKTsKICAgIHN1cGVyLnZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFZhcmlhYmxlR2V0KGlyLlZhcmlhYmxlR2V0IG5vZGUpIHsKICAgIHJlZ2lzdGVyTm9kZShub2RlKTsKICAgIHN1cGVyLnZpc2l0VmFyaWFibGVHZXQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW5zdGFudGlhdGlvbihpci5JbnN0YW50aWF0aW9uIG5vZGUpIHsKICAgIHJlZ2lzdGVyTm9kZShub2RlKTsKICAgIHN1cGVyLnZpc2l0SW5zdGFudGlhdGlvbihub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdXBlck1ldGhvZEludm9jYXRpb24oaXIuU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIHJlZ2lzdGVyTm9kZShub2RlKTsKICAgIHN1cGVyLnZpc2l0U3VwZXJNZXRob2RJbnZvY2F0aW9uKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN1cGVyUHJvcGVydHlHZXQoaXIuU3VwZXJQcm9wZXJ0eUdldCBub2RlKSB7CiAgICByZWdpc3Rlck5vZGUobm9kZSk7CiAgICBzdXBlci52aXNpdFN1cGVyUHJvcGVydHlHZXQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29uc3RhbnRFeHByZXNzaW9uKGlyLkNvbnN0YW50RXhwcmVzc2lvbiBub2RlKSB7CiAgICByZWdpc3Rlck5vZGUobm9kZSk7CiAgICBzdXBlci52aXNpdENvbnN0YW50RXhwcmVzc2lvbihub2RlKTsKICB9Cn0KCi8vLyBWaXNpdG9yIHRoYXQgYXNjcmliZXMgYW4gaW5kZXggdG8gYWxsIFtpci5Db25zdGFudF1zIHRoYXQgd2UgcG90ZW50aWFsbHkKLy8vIG5lZWQgdG8gcmVmZXJlbmNlIGZvciBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24uCi8vLwovLy8gQ3VycmVudGx5IHRoaXMgaXMgb25seSBsaXN0LCBtYXAsIGFuZCBzZXQgY29uc3RhbnRzLCB3aGljaCBhcmUgdXNlZCBhcwovLy8gYWxsb2NhdGlvbiBpZGVudGl0aWVzIGluIHRoZSBnbG9iYWwgaW5mZXJlbmNlLgpjbGFzcyBfQ29uc3RhbnROb2RlSW5kZXhlclZpc2l0b3IgaW1wbGVtZW50cyBpci5Db25zdGFudFZpc2l0b3I8dm9pZD4gewogIGludCBfY3VycmVudEluZGV4ID0gMDsKICBmaW5hbCBNYXA8aW50LCBpci5Db25zdGFudD4gX2luZGV4VG9Ob2RlTWFwID0ge307CiAgZmluYWwgTWFwPGlyLkNvbnN0YW50LCBpbnQ+IF9ub2RlVG9JbmRleE1hcCA9IHt9OwoKICB2b2lkIHJlZ2lzdGVyQ29uc3RhbnQoaXIuQ29uc3RhbnQgbm9kZSkgewogICAgX2luZGV4VG9Ob2RlTWFwW19jdXJyZW50SW5kZXhdID0gbm9kZTsKICAgIF9ub2RlVG9JbmRleE1hcFtub2RlXSA9IF9jdXJyZW50SW5kZXg7CiAgICBfY3VycmVudEluZGV4Kys7CiAgfQoKICBpbnQgZ2V0SW5kZXgoaXIuQ29uc3RhbnQgbm9kZSkgewogICAgYXNzZXJ0KF9ub2RlVG9JbmRleE1hcC5jb250YWluc0tleShub2RlKSwgIkNvbnN0YW50IHdpdGhvdXQgaW5kZXg6ICRub2RlIik7CiAgICByZXR1cm4gX25vZGVUb0luZGV4TWFwW25vZGVdOwogIH0KCiAgaXIuQ29uc3RhbnQgZ2V0Q29uc3RhbnQoaW50IGluZGV4KSB7CiAgICBhc3NlcnQoCiAgICAgICAgX2luZGV4VG9Ob2RlTWFwLmNvbnRhaW5zS2V5KGluZGV4KSwgIkluZGV4IHdpdGhvdXQgY29uc3RhbnQ6ICRpbmRleCIpOwogICAgcmV0dXJuIF9pbmRleFRvTm9kZU1hcFtpbmRleF07CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VW5ldmFsdWF0ZWRDb25zdGFudChpci5VbmV2YWx1YXRlZENvbnN0YW50IG5vZGUpIHt9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlTGl0ZXJhbENvbnN0YW50KGlyLlR5cGVMaXRlcmFsQ29uc3RhbnQgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFRlYXJPZmZDb25zdGFudChpci5UZWFyT2ZmQ29uc3RhbnQgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQoaXIuUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCBub2RlKSB7CiAgICBub2RlLnRlYXJPZmZDb25zdGFudC5hY2NlcHQodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW5zdGFuY2VDb25zdGFudChpci5JbnN0YW5jZUNvbnN0YW50IG5vZGUpIHsKICAgIG5vZGUuZmllbGRWYWx1ZXMuZm9yRWFjaCgoXywgaXIuQ29uc3RhbnQgdmFsdWUpIHsKICAgICAgdmFsdWUuYWNjZXB0KHRoaXMpOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U2V0Q29uc3RhbnQoaXIuU2V0Q29uc3RhbnQgbm9kZSkgewogICAgcmVnaXN0ZXJDb25zdGFudChub2RlKTsKICAgIGZvciAoaXIuQ29uc3RhbnQgZWxlbWVudCBpbiBub2RlLmVudHJpZXMpIHsKICAgICAgZWxlbWVudC5hY2NlcHQodGhpcyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGlzdENvbnN0YW50KGlyLkxpc3RDb25zdGFudCBub2RlKSB7CiAgICByZWdpc3RlckNvbnN0YW50KG5vZGUpOwogICAgZm9yIChpci5Db25zdGFudCBlbGVtZW50IGluIG5vZGUuZW50cmllcykgewogICAgICBlbGVtZW50LmFjY2VwdCh0aGlzKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRNYXBDb25zdGFudChpci5NYXBDb25zdGFudCBub2RlKSB7CiAgICByZWdpc3RlckNvbnN0YW50KG5vZGUpOwogICAgZm9yIChpci5Db25zdGFudE1hcEVudHJ5IGVudHJ5IGluIG5vZGUuZW50cmllcykgewogICAgICBlbnRyeS5rZXkuYWNjZXB0KHRoaXMpOwogICAgICBlbnRyeS52YWx1ZS5hY2NlcHQodGhpcyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3ltYm9sQ29uc3RhbnQoaXIuU3ltYm9sQ29uc3RhbnQgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN0cmluZ0NvbnN0YW50KGlyLlN0cmluZ0NvbnN0YW50IG5vZGUpIHt9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREb3VibGVDb25zdGFudChpci5Eb3VibGVDb25zdGFudCBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW50Q29uc3RhbnQoaXIuSW50Q29uc3RhbnQgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJvb2xDb25zdGFudChpci5Cb29sQ29uc3RhbnQgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE51bGxDb25zdGFudChpci5OdWxsQ29uc3RhbnQgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCBkZWZhdWx0Q29uc3RhbnQoaXIuQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAiVW5leHBlY3RlZCBjb25zdGFudDogJG5vZGUgKCR7bm9kZS5ydW50aW1lVHlwZX0pIik7CiAgfQp9CoEuAE5OPAEeAUoyORkvLwFHASgrKxUEAQwrHgQBDD0YKQQBDD8YKgQBDCMYHAQBDD8yGgYqBAEMNxgmBAEMMRgjBAEMNRglBAEMNRglBAEMLxgiBAEMNRglBAEMLxgiBAEMLRghBAEMLRghBAEMLxgiBAEMLxgiBAEMORgnBAEMOxgoBAEMOxgoBAEMRRgtBAEMORgnBAEMORgnBAEMLRghBAEMRxguBAEMQxgsBAEMLxgiBAEMMxgkBAEMQxgsBAEMORgnBAEMPRgpBAIBTT0ESzNIGTQ0ASwrKxUEASNQIgQBJwxPIwQBDEABDEABDDgBDFEnBAEMOTYaCAQBDC8cMBwGBAEMMRwwHAYEAQwvHDYeIAYEAQw2AQw2AQw2AQwwAQwyAQwyAQwrIj0EAgE0cGFja2FnZTpjb21waWxlci9zcmMvc2VyaWFsaXphdGlvbi9ub2RlX2luZGV4ZXIuZGFydDxzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9zZXJpYWxpemF0aW9uL29iamVjdF9zaW5rLmRhcnSFRi8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mICdzZXJpYWxpemF0aW9uLmRhcnQnOwoKLy8vIFtEYXRhU2lua10gdGhhdCB3cml0ZXMgdG8gYSBsaXN0IG9mIG9iamVjdHMsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi8vLyBpbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24uCi8vLwovLy8gVGhpcyBkYXRhIHNpbmsgd29ya3MgdG9nZXRoZXIgd2l0aCBbT2JqZWN0U291cmNlXS4KY2xhc3MgT2JqZWN0U2luayBleHRlbmRzIEFic3RyYWN0RGF0YVNpbmsgewogIExpc3Q8ZHluYW1pYz4gX2RhdGE7CgogIE9iamVjdFNpbmsodGhpcy5fZGF0YSwge2Jvb2wgdXNlRGF0YUtpbmRzfSkKICAgICAgOiBzdXBlcih1c2VEYXRhS2luZHM6IHVzZURhdGFLaW5kcyk7CgogIEBvdmVycmlkZQogIHZvaWQgX2JlZ2luKFN0cmluZyB0YWcpIHsKICAgIF9kYXRhLmFkZChuZXcgVGFnKCdiZWdpbjokdGFnJykpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfZW5kKFN0cmluZyB0YWcpIHsKICAgIF9kYXRhLmFkZChuZXcgVGFnKCdlbmQ6JHRhZycpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX3dyaXRlRW51bUludGVybmFsKGR5bmFtaWMgdmFsdWUpIHsKICAgIGFzc2VydCh2YWx1ZSAhPSBudWxsKTsKICAgIF9kYXRhLmFkZCh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF93cml0ZUludEludGVybmFsKGludCB2YWx1ZSkgewogICAgYXNzZXJ0KHZhbHVlICE9IG51bGwpOwogICAgX2RhdGEuYWRkKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX3dyaXRlU3RyaW5nSW50ZXJuYWwoU3RyaW5nIHZhbHVlKSB7CiAgICBhc3NlcnQodmFsdWUgIT0gbnVsbCk7CiAgICBfZGF0YS5hZGQodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfd3JpdGVVcmlJbnRlcm5hbChVcmkgdmFsdWUpIHsKICAgIGFzc2VydCh2YWx1ZSAhPSBudWxsKTsKICAgIF9kYXRhLmFkZCh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNsb3NlKCkgewogICAgX2RhdGEgPSBudWxsOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBvYmplY3RzIHdyaXR0ZW4gdG8gdGhpcyBkYXRhIHNpbmsuCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsZW5ndGggPT4gX2RhdGEubGVuZ3RoOwp9Cj0ATk48AR4BRj8ENywXAS4rAQwcJgQBDBokBAEMKxsWBAEMJhsWBAEMLBsWBAEMJhsWBAEMERIEAT8MIgIBM3BhY2thZ2U6Y29tcGlsZXIvc3JjL3NlcmlhbGl6YXRpb24vb2JqZWN0X3NpbmsuZGFydD5zZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9zZXJpYWxpemF0aW9uL29iamVjdF9zb3VyY2UuZGFydIeQLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgJ3NlcmlhbGl6YXRpb24uZGFydCc7CgovLy8gW0RhdGFTb3VyY2VdIHRoYXQgcmVhZCBmcm9tIGEgbGlzdCBvZiBvYmplY3RzLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwovLy8gaW5jb25zaXN0ZW5jaWVzIGJldHdlZW4gc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgovLy8KLy8vIFRoaXMgZGF0YSBzb3VyY2Ugd29ya3MgdG9nZXRoZXIgd2l0aCBbT2JqZWN0U2lua10uCmNsYXNzIE9iamVjdFNvdXJjZSBleHRlbmRzIEFic3RyYWN0RGF0YVNvdXJjZSB7CiAgaW50IF9pbmRleCA9IDA7CiAgZmluYWwgTGlzdDxkeW5hbWljPiBfZGF0YTsKCiAgT2JqZWN0U291cmNlKHRoaXMuX2RhdGEsIHtib29sIHVzZURhdGFLaW5kc30pCiAgICAgIDogc3VwZXIodXNlRGF0YUtpbmRzOiB1c2VEYXRhS2luZHMpOwoKICBUIF9yZWFkPFQ+KCkgewogICAgZHluYW1pYyB2YWx1ZSA9IF9kYXRhW19pbmRleCsrXTsKICAgIGFzc2VydCh2YWx1ZSBpcyBULCAiRXhwZWN0ZWQgJFQgdmFsdWUsIGZvdW5kICR2YWx1ZS4kX2Vycm9yQ29udGV4dCIpOwogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfYmVnaW4oU3RyaW5nIHRhZykgewogICAgVGFnIGV4cGVjdGVkVGFnID0gbmV3IFRhZygnYmVnaW46JHRhZycpOwogICAgVGFnIGFjdHVhbFRhZyA9IF9yZWFkKCk7CiAgICBhc3NlcnQoCiAgICAgICAgZXhwZWN0ZWRUYWcgPT0gYWN0dWFsVGFnLAogICAgICAgICJVbmV4cGVjdGVkIGJlZ2luIHRhZy4gIgogICAgICAgICJFeHBlY3RlZCAkZXhwZWN0ZWRUYWcsIGZvdW5kICRhY3R1YWxUYWcuJF9lcnJvckNvbnRleHQiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX2VuZChTdHJpbmcgdGFnKSB7CiAgICBUYWcgZXhwZWN0ZWRUYWcgPSBuZXcgVGFnKCdlbmQ6JHRhZycpOwogICAgVGFnIGFjdHVhbFRhZyA9IF9yZWFkKCk7CiAgICBhc3NlcnQoCiAgICAgICAgZXhwZWN0ZWRUYWcgPT0gYWN0dWFsVGFnLAogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcuICIKICAgICAgICAiRXhwZWN0ZWQgJGV4cGVjdGVkVGFnLCBmb3VuZCAkYWN0dWFsVGFnLiRfZXJyb3JDb250ZXh0Iik7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgX3JlYWRTdHJpbmdJbnRlcm5hbCgpID0+IF9yZWFkKCk7CgogIEBvdmVycmlkZQogIEUgX3JlYWRFbnVtSW50ZXJuYWw8RT4oTGlzdDxFPiB2YWx1ZXMpID0+IF9yZWFkKCk7CgogIEBvdmVycmlkZQogIFVyaSBfcmVhZFVyaUludGVybmFsKCkgPT4gX3JlYWQoKTsKCiAgQG92ZXJyaWRlCiAgaW50IF9yZWFkSW50SW50ZXJuYWwoKSA9PiBfcmVhZCgpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9lcnJvckNvbnRleHQgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgZm9yIChpbnQgaSA9IF9pbmRleCAtIDUwOyBpIDwgX2luZGV4ICsgMTA7IGkrKykgewogICAgICBpZiAoaSA+PSAwICYmIGkgPCBfZGF0YS5sZW5ndGgpIHsKICAgICAgICBpZiAoaSA9PSBfaW5kZXggLSAxKSB7CiAgICAgICAgICBzYi53cml0ZSgnXG4+ICcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzYi53cml0ZSgnXG4gICcpOwogICAgICAgIH0KICAgICAgICBzYi53cml0ZShpKTsKICAgICAgICBzYi53cml0ZSgnICcpOwogICAgICAgIHNiLndyaXRlKF9kYXRhW2ldKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CksATk48AR4BSD8ENzASHQEwKwERJUoSBAEMHC0dDCIhQwQBDBorHQwiH0MEAQwrAQw1AQwlAQwlAQwdKjYoHxwRHAoVFxwIBhoEAgE1cGFja2FnZTpjb21waWxlci9zcmMvc2VyaWFsaXphdGlvbi9vYmplY3Rfc291cmNlLmRhcnQvc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvdW5pdmVyc2UvdXNlLmRhcnTAAGyOLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBUaGlzIGxpYnJhcnkgZGVmaW5lcyBpbmRpdmlkdWFsIHdvcmxkIGltcGFjdHMuCi8vLwovLy8gV2UgY2FsbCB0aGVzZSBidWlsZGluZyBibG9ja3MgYHVzZXNgLiBFYWNoIGB1c2VgIGlzIGEgc2luZ2xlIGltcGFjdCBvZiB0aGUKLy8vIHdvcmxkLiBTb21lIGV4YW1wbGUgdXNlcyBhcmU6Ci8vLwovLy8gICogYW4gaW52b2NhdGlvbiBvZiBhIHRvcCBsZXZlbCBmdW5jdGlvbgovLy8gICogYSBjYWxsIHRvIHRoZSBgZm9vKClgIG1ldGhvZCBvbiBhbiB1bmtub3duIGNsYXNzLgovLy8gICogYW4gaW5zdGFudGlhdGlvbiBvZiBjbGFzcyBUCi8vLwovLy8gVGhlIGRpZmZlcmVudCBjb21waWxlciBzdGFnZXMgY29tYmluZSB0aGVzZSB1c2VzIGludG8gYFdvcmxkSW1wYWN0YCBvYmplY3RzLAovLy8gd2hpY2ggYXJlIGxhdGVyIHVzZWQgdG8gY29uc3RydWN0IGEgY2xvc2VkLXdvcmxkIHVuZGVyc3RhbmRpbmcgb2YgdGhlCi8vLyBwcm9ncmFtLgpsaWJyYXJ5IGRhcnQyanMudW5pdmVyc2UudXNlOwoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9qc19tb2RlbC9jbG9zdXJlLmRhcnQnOwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JyBzaG93IGVxdWFsRWxlbWVudHMsIEhhc2hpbmc7CmltcG9ydCAnY2FsbF9zdHJ1Y3R1cmUuZGFydCcgc2hvdyBDYWxsU3RydWN0dXJlOwppbXBvcnQgJ3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3I7CmltcG9ydCAnd29ybGRfYnVpbGRlci5kYXJ0JyBzaG93IFN0cm9uZ01vZGVDb25zdHJhaW50OwoKZW51bSBEeW5hbWljVXNlS2luZCB7CiAgSU5WT0tFLAogIEdFVCwKICBTRVQsCn0KCi8vLyBUaGUgdXNlIG9mIGEgZHluYW1pYyBwcm9wZXJ0eS4gW3NlbGVjdG9yXSBkZWZpbmVkIHRoZSBuYW1lIGFuZCBraW5kIG9mIHRoZQovLy8gcHJvcGVydHkgYW5kIFtyZWNlaXZlckNvbnN0cmFpbnRdIGRlZmluZXMgdGhlIGtub3duIGNvbnN0cmFpbnQgZm9yIHRoZQovLy8gb2JqZWN0IG9uIHdoaWNoIHRoZSBwcm9wZXJ0eSBpcyBhY2Nlc3NlZC4KY2xhc3MgRHluYW1pY1VzZSB7CiAgZmluYWwgU2VsZWN0b3Igc2VsZWN0b3I7CgogIER5bmFtaWNVc2UodGhpcy5zZWxlY3Rvcik7CgogIC8vLyBTaG9ydCB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIHVzZSBmb3IgdGVzdGluZy4KICBTdHJpbmcgZ2V0IHNob3J0VGV4dCB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBpZiAocmVjZWl2ZXJDb25zdHJhaW50ICE9IG51bGwpIHsKICAgICAgdmFyIGNvbnN0cmFpbnQgPSByZWNlaXZlckNvbnN0cmFpbnQ7CiAgICAgIGlmIChjb25zdHJhaW50IGlzIFN0cm9uZ01vZGVDb25zdHJhaW50KSB7CiAgICAgICAgaWYgKGNvbnN0cmFpbnQuaXNUaGlzKSB7CiAgICAgICAgICBzYi53cml0ZSgndGhpczonKTsKICAgICAgICB9IGVsc2UgaWYgKGNvbnN0cmFpbnQuaXNFeGFjdCkgewogICAgICAgICAgc2Iud3JpdGUoJ2V4YWN0OicpOwogICAgICAgIH0KICAgICAgICBzYi53cml0ZShjb25zdHJhaW50LmNscy5uYW1lKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzYi53cml0ZShjb25zdHJhaW50KTsKICAgICAgfQogICAgICBzYi53cml0ZSgnLicpOwogICAgfQogICAgc2Iud3JpdGUoc2VsZWN0b3IubmFtZSk7CiAgICBpZiAodHlwZUFyZ3VtZW50cyAhPSBudWxsICYmIHR5cGVBcmd1bWVudHMuaXNOb3RFbXB0eSkgewogICAgICBzYi53cml0ZSgnPCcpOwogICAgICBzYi53cml0ZSh0eXBlQXJndW1lbnRzLmpvaW4oJywnKSk7CiAgICAgIHNiLndyaXRlKCc+Jyk7CiAgICB9CiAgICBpZiAoc2VsZWN0b3IuaXNDYWxsKSB7CiAgICAgIHNiLndyaXRlKHNlbGVjdG9yLmNhbGxTdHJ1Y3R1cmUuc2hvcnRUZXh0KTsKICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaXNTZXR0ZXIpIHsKICAgICAgc2Iud3JpdGUoJz0nKTsKICAgIH0KICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgT2JqZWN0IGdldCByZWNlaXZlckNvbnN0cmFpbnQgPT4gbnVsbDsKCiAgRHluYW1pY1VzZUtpbmQgZ2V0IGtpbmQgewogICAgaWYgKHNlbGVjdG9yLmlzR2V0dGVyKSB7CiAgICAgIHJldHVybiBEeW5hbWljVXNlS2luZC5HRVQ7CiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmlzU2V0dGVyKSB7CiAgICAgIHJldHVybiBEeW5hbWljVXNlS2luZC5TRVQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gRHluYW1pY1VzZUtpbmQuSU5WT0tFOwogICAgfQogIH0KCiAgTGlzdDxEYXJ0VHlwZT4gZ2V0IHR5cGVBcmd1bWVudHMgPT4gY29uc3QgPERhcnRUeXBlPltdOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IEhhc2hpbmcubGlzdEhhc2goCiAgICAgIHR5cGVBcmd1bWVudHMsIEhhc2hpbmcub2JqZWN0c0hhc2goc2VsZWN0b3IsIHJlY2VpdmVyQ29uc3RyYWludCkpOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIER5bmFtaWNVc2UpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBzZWxlY3RvciA9PSBvdGhlci5zZWxlY3RvciAmJgogICAgICAgIHJlY2VpdmVyQ29uc3RyYWludCA9PSBvdGhlci5yZWNlaXZlckNvbnN0cmFpbnQgJiYKICAgICAgICBlcXVhbEVsZW1lbnRzKHR5cGVBcmd1bWVudHMsIG90aGVyLnR5cGVBcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyRzZWxlY3RvciwkcmVjZWl2ZXJDb25zdHJhaW50JzsKfQoKY2xhc3MgR2VuZXJpY0R5bmFtaWNVc2UgZXh0ZW5kcyBEeW5hbWljVXNlIHsKICBmaW5hbCBMaXN0PERhcnRUeXBlPiBfdHlwZUFyZ3VtZW50czsKCiAgR2VuZXJpY0R5bmFtaWNVc2UoU2VsZWN0b3Igc2VsZWN0b3IsIFt0aGlzLl90eXBlQXJndW1lbnRzXSkKICAgICAgOiBzdXBlcihzZWxlY3RvcikgewogICAgYXNzZXJ0KAogICAgICAgIHNlbGVjdG9yLmNhbGxTdHJ1Y3R1cmUudHlwZUFyZ3VtZW50Q291bnQgPT0KICAgICAgICAgICAgKF90eXBlQXJndW1lbnRzPy5sZW5ndGggPz8gMCksCiAgICAgICAgIlR5cGUgYXJndW1lbnQgY291bnQgbWlzbWF0Y2guIFNlbGVjdG9yIGhhcyAiCiAgICAgICAgIiR7c2VsZWN0b3IuY2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRDb3VudH0gYnV0ICIKICAgICAgICAiJHt0eXBlQXJndW1lbnRzPy5sZW5ndGggPz8gMH0gd2VyZSBwYXNzZWQuIik7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PERhcnRUeXBlPiBnZXQgdHlwZUFyZ3VtZW50cyA9PiBfdHlwZUFyZ3VtZW50cyA/PyBjb25zdCA8RGFydFR5cGU+W107Cn0KCi8vLyBBIGR5bmFtaWMgdXNlIHdpdGggYSByZWNlaXZlciBjb25zdHJhaW50LgovLy8KLy8vIFRoaXMgaXMgdXNlZCBpbiB0aGUgY29kZWdlbiBwaGFzZSB3aGVyZSByZWNlaXZlcnMgYXJlIGNvbnN0cmFpbmVkIHRvIGEKLy8vIHR5cGUgbWFzayBvciBzaW1pbGFyLgpjbGFzcyBDb25zdHJhaW5lZER5bmFtaWNVc2UgZXh0ZW5kcyBEeW5hbWljVXNlIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBPYmplY3QgcmVjZWl2ZXJDb25zdHJhaW50OwogIGZpbmFsIExpc3Q8RGFydFR5cGU+IF90eXBlQXJndW1lbnRzOwoKICBDb25zdHJhaW5lZER5bmFtaWNVc2UoCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLCB0aGlzLnJlY2VpdmVyQ29uc3RyYWludCwgdGhpcy5fdHlwZUFyZ3VtZW50cykKICAgICAgOiBzdXBlcihzZWxlY3RvcikgewogICAgYXNzZXJ0KAogICAgICAgIHNlbGVjdG9yLmNhbGxTdHJ1Y3R1cmUudHlwZUFyZ3VtZW50Q291bnQgPT0KICAgICAgICAgICAgKF90eXBlQXJndW1lbnRzPy5sZW5ndGggPz8gMCksCiAgICAgICAgIlR5cGUgYXJndW1lbnQgY291bnQgbWlzbWF0Y2guIFNlbGVjdG9yIGhhcyAiCiAgICAgICAgIiR7c2VsZWN0b3IuY2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRDb3VudH0gYnV0ICIKICAgICAgICAiJHtfdHlwZUFyZ3VtZW50cz8ubGVuZ3RoID8/IDB9IHdlcmUgcGFzc2VkLiIpOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxEYXJ0VHlwZT4gZ2V0IHR5cGVBcmd1bWVudHMgPT4gX3R5cGVBcmd1bWVudHMgPz8gY29uc3QgPERhcnRUeXBlPltdOwp9CgplbnVtIFN0YXRpY1VzZUtpbmQgewogIFNUQVRJQ19URUFSX09GRiwKICBTVVBFUl9URUFSX09GRiwKICBTVVBFUl9GSUVMRF9TRVQsCiAgRklFTERfR0VULAogIEZJRUxEX1NFVCwKICBDTE9TVVJFLAogIENMT1NVUkVfQ0FMTCwKICBDQUxMX01FVEhPRCwKICBDT05TVFJVQ1RPUl9JTlZPS0UsCiAgQ09OU1RfQ09OU1RSVUNUT1JfSU5WT0tFLAogIFJFRElSRUNUSU9OLAogIERJUkVDVF9JTlZPS0UsCiAgSU5MSU5JTkcsCiAgSU5WT0tFLAogIEdFVCwKICBTRVQsCiAgRklFTERfSU5JVCwKICBGSUVMRF9DT05TVEFOVF9JTklULAp9CgovLy8gU3RhdGljYWxseSBrbm93biB1c2Ugb2YgYW4gW0VudGl0eV0uCi8vIFRPRE8oam9obm5pd2ludGhlcik6IENyZWF0ZSBiYWNrZW5kLXNwZWNpZmljIGltcGxlbWVudGF0aW9ucyB3aXRoIGJldHRlcgovLyBpbnZhcmlhbnRzLgpjbGFzcyBTdGF0aWNVc2UgewogIGZpbmFsIEVudGl0eSBlbGVtZW50OwogIGZpbmFsIFN0YXRpY1VzZUtpbmQga2luZDsKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgaGFzaENvZGU7CiAgZmluYWwgSW50ZXJmYWNlVHlwZSB0eXBlOwogIGZpbmFsIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZTsKICBmaW5hbCBJbXBvcnRFbnRpdHkgZGVmZXJyZWRJbXBvcnQ7CiAgZmluYWwgQ29uc3RhbnRWYWx1ZSBjb25zdGFudDsKCiAgU3RhdGljVXNlLmludGVybmFsKEVudGl0eSBlbGVtZW50LCB0aGlzLmtpbmQsCiAgICAgIHt0aGlzLnR5cGUsCiAgICAgIHRoaXMuY2FsbFN0cnVjdHVyZSwKICAgICAgdGhpcy5kZWZlcnJlZEltcG9ydCwKICAgICAgdHlwZUFyZ3VtZW50c0hhc2g6IDAsCiAgICAgIHRoaXMuY29uc3RhbnR9KQogICAgICA6IHRoaXMuZWxlbWVudCA9IGVsZW1lbnQsCiAgICAgICAgdGhpcy5oYXNoQ29kZSA9IEhhc2hpbmcubGlzdEhhc2goWwogICAgICAgICAgZWxlbWVudCwKICAgICAgICAgIGtpbmQsCiAgICAgICAgICB0eXBlLAogICAgICAgICAgdHlwZUFyZ3VtZW50c0hhc2gsCiAgICAgICAgICBjYWxsU3RydWN0dXJlLAogICAgICAgICAgZGVmZXJyZWRJbXBvcnQsCiAgICAgICAgICBjb25zdGFudAogICAgICAgIF0pOwoKICAvLy8gU2hvcnQgdGV4dHVhbCByZXByZXNlbnRhdGlvbiB1c2UgZm9yIHRlc3RpbmcuCiAgU3RyaW5nIGdldCBzaG9ydFRleHQgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5GSUVMRF9TRVQ6CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5TVVBFUl9GSUVMRF9TRVQ6CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5TRVQ6CiAgICAgICAgc2Iud3JpdGUoJ3NldDonKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkZJRUxEX0lOSVQ6CiAgICAgICAgc2Iud3JpdGUoJ2luaXQ6Jyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5DTE9TVVJFOgogICAgICAgIHNiLndyaXRlKCdkZWY6Jyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICB9CiAgICBpZiAoZWxlbWVudCBpcyBNZW1iZXJFbnRpdHkpIHsKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IGVsZW1lbnQ7CiAgICAgIGlmIChtZW1iZXIuZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCkgewogICAgICAgIHNiLndyaXRlKG1lbWJlci5lbmNsb3NpbmdDbGFzcy5uYW1lKTsKICAgICAgICBzYi53cml0ZSgnLicpOwogICAgICB9CiAgICB9CiAgICBpZiAoZWxlbWVudC5uYW1lID09IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJzxhbm9ueW1vdXM+Jyk7CiAgICB9IGVsc2UgewogICAgICBzYi53cml0ZShlbGVtZW50Lm5hbWUpOwogICAgfQogICAgaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCAmJiB0eXBlQXJndW1lbnRzLmlzTm90RW1wdHkpIHsKICAgICAgc2Iud3JpdGUoJzwnKTsKICAgICAgc2Iud3JpdGUodHlwZUFyZ3VtZW50cy5qb2luKCcsJykpOwogICAgICBzYi53cml0ZSgnPicpOwogICAgfQogICAgaWYgKGNhbGxTdHJ1Y3R1cmUgIT0gbnVsbCkgewogICAgICBzYi53cml0ZSgnKCcpOwogICAgICBzYi53cml0ZShjYWxsU3RydWN0dXJlLnBvc2l0aW9uYWxBcmd1bWVudENvdW50KTsKICAgICAgaWYgKGNhbGxTdHJ1Y3R1cmUubmFtZWRBcmd1bWVudENvdW50ID4gMCkgewogICAgICAgIHNiLndyaXRlKCcsJyk7CiAgICAgICAgc2Iud3JpdGUoY2FsbFN0cnVjdHVyZS5nZXRPcmRlcmVkTmFtZWRBcmd1bWVudHMoKS5qb2luKCcsJykpOwogICAgICB9CiAgICAgIHNiLndyaXRlKCcpJyk7CiAgICB9CiAgICBpZiAoZGVmZXJyZWRJbXBvcnQgIT0gbnVsbCkgewogICAgICBzYi53cml0ZSgneycpOwogICAgICBzYi53cml0ZShkZWZlcnJlZEltcG9ydC5uYW1lKTsKICAgICAgc2Iud3JpdGUoJ30nKTsKICAgIH0KICAgIGlmIChjb25zdGFudCAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCc9Jyk7CiAgICAgIHNiLndyaXRlKGNvbnN0YW50LnRvU3RydWN0dXJlZFRleHQoKSk7CiAgICB9CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIExpc3Q8RGFydFR5cGU+IGdldCB0eXBlQXJndW1lbnRzID0+IG51bGw7CgogIC8vLyBJbnZvY2F0aW9uIG9mIGEgc3RhdGljIG9yIHRvcC1sZXZlbCBbZWxlbWVudF0gd2l0aCB0aGUgZ2l2ZW4KICAvLy8gW2NhbGxTdHJ1Y3R1cmVdLgogIGZhY3RvcnkgU3RhdGljVXNlLnN0YXRpY0ludm9rZSgKICAgICAgRnVuY3Rpb25FbnRpdHkgZWxlbWVudCwgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlLAogICAgICBbTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cywgSW1wb3J0RW50aXR5IGRlZmVycmVkSW1wb3J0XSkgewogICAgYXNzZXJ0KAogICAgICAgIGVsZW1lbnQuaXNTdGF0aWMgfHwgZWxlbWVudC5pc1RvcExldmVsLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAiU3RhdGljIGludm9rZSBlbGVtZW50ICRlbGVtZW50IG11c3QgYmUgYSB0b3AtbGV2ZWwgIgogICAgICAgICAgICAib3Igc3RhdGljIG1ldGhvZC4iKSk7CiAgICBhc3NlcnQoCiAgICAgICAgY2FsbFN0cnVjdHVyZSAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsCiAgICAgICAgICAgICJOb3QgQ2FsbFN0cnVjdHVyZSBmb3Igc3RhdGljIGludm9jYXRpb24gb2YgZWxlbWVudCAkZWxlbWVudC4iKSk7CgogICAgcmV0dXJuIG5ldyBHZW5lcmljU3RhdGljVXNlKGVsZW1lbnQsIFN0YXRpY1VzZUtpbmQuSU5WT0tFLCBjYWxsU3RydWN0dXJlLAogICAgICAgIHR5cGVBcmd1bWVudHMsIGRlZmVycmVkSW1wb3J0KTsKICB9CgogIC8vLyBDbG9zdXJpemF0aW9uIG9mIGEgc3RhdGljIG9yIHRvcC1sZXZlbCBmdW5jdGlvbiBbZWxlbWVudF0uCiAgZmFjdG9yeSBTdGF0aWNVc2Uuc3RhdGljVGVhck9mZihGdW5jdGlvbkVudGl0eSBlbGVtZW50LAogICAgICBbSW1wb3J0RW50aXR5IGRlZmVycmVkSW1wb3J0XSkgewogICAgYXNzZXJ0KAogICAgICAgIGVsZW1lbnQuaXNTdGF0aWMgfHwgZWxlbWVudC5pc1RvcExldmVsLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAiU3RhdGljIHRlYXItb2ZmIGVsZW1lbnQgJGVsZW1lbnQgbXVzdCBiZSBhIHRvcC1sZXZlbCAiCiAgICAgICAgICAgICJvciBzdGF0aWMgbWV0aG9kLiIpKTsKICAgIHJldHVybiBuZXcgU3RhdGljVXNlLmludGVybmFsKGVsZW1lbnQsIFN0YXRpY1VzZUtpbmQuU1RBVElDX1RFQVJfT0ZGLAogICAgICAgIGRlZmVycmVkSW1wb3J0OiBkZWZlcnJlZEltcG9ydCk7CiAgfQoKICAvLy8gUmVhZCBhY2Nlc3Mgb2YgYSBzdGF0aWMgb3IgdG9wLWxldmVsIGZpZWxkIG9yIGdldHRlciBbZWxlbWVudF0uCiAgZmFjdG9yeSBTdGF0aWNVc2Uuc3RhdGljR2V0KE1lbWJlckVudGl0eSBlbGVtZW50LAogICAgICBbSW1wb3J0RW50aXR5IGRlZmVycmVkSW1wb3J0XSkgewogICAgYXNzZXJ0KAogICAgICAgIGVsZW1lbnQuaXNTdGF0aWMgfHwgZWxlbWVudC5pc1RvcExldmVsLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAiU3RhdGljIGdldCBlbGVtZW50ICRlbGVtZW50IG11c3QgYmUgYSB0b3AtbGV2ZWwgIgogICAgICAgICAgICAib3Igc3RhdGljIG1ldGhvZC4iKSk7CiAgICBhc3NlcnQoCiAgICAgICAgZWxlbWVudC5pc0ZpZWxkIHx8IGVsZW1lbnQuaXNHZXR0ZXIsCiAgICAgICAgZmFpbGVkQXQoZWxlbWVudCwKICAgICAgICAgICAgIlN0YXRpYyBnZXQgZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGEgZmllbGQgb3IgYSBnZXR0ZXIuIikpOwogICAgcmV0dXJuIG5ldyBTdGF0aWNVc2UuaW50ZXJuYWwoZWxlbWVudCwgU3RhdGljVXNlS2luZC5HRVQsCiAgICAgICAgZGVmZXJyZWRJbXBvcnQ6IGRlZmVycmVkSW1wb3J0KTsKICB9CgogIC8vLyBXcml0ZSBhY2Nlc3Mgb2YgYSBzdGF0aWMgb3IgdG9wLWxldmVsIGZpZWxkIG9yIHNldHRlciBbZWxlbWVudF0uCiAgZmFjdG9yeSBTdGF0aWNVc2Uuc3RhdGljU2V0KE1lbWJlckVudGl0eSBlbGVtZW50LAogICAgICBbSW1wb3J0RW50aXR5IGRlZmVycmVkSW1wb3J0XSkgewogICAgYXNzZXJ0KAogICAgICAgIGVsZW1lbnQuaXNTdGF0aWMgfHwgZWxlbWVudC5pc1RvcExldmVsLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAiU3RhdGljIHNldCBlbGVtZW50ICRlbGVtZW50ICIKICAgICAgICAgICAgIm11c3QgYmUgYSB0b3AtbGV2ZWwgb3Igc3RhdGljIG1ldGhvZC4iKSk7CiAgICBhc3NlcnQoCiAgICAgICAgZWxlbWVudC5pc0ZpZWxkIHx8IGVsZW1lbnQuaXNTZXR0ZXIsCiAgICAgICAgZmFpbGVkQXQoZWxlbWVudCwKICAgICAgICAgICAgIlN0YXRpYyBzZXQgZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGEgZmllbGQgb3IgYSBzZXR0ZXIuIikpOwogICAgcmV0dXJuIG5ldyBTdGF0aWNVc2UuaW50ZXJuYWwoZWxlbWVudCwgU3RhdGljVXNlS2luZC5TRVQsCiAgICAgICAgZGVmZXJyZWRJbXBvcnQ6IGRlZmVycmVkSW1wb3J0KTsKICB9CgogIC8vLyBJbnZvY2F0aW9uIG9mIHRoZSBsYXp5IGluaXRpYWxpemVyIGZvciBhIHN0YXRpYyBvciB0b3AtbGV2ZWwgZmllbGQKICAvLy8gW2VsZW1lbnRdLgogIGZhY3RvcnkgU3RhdGljVXNlLnN0YXRpY0luaXQoRmllbGRFbnRpdHkgZWxlbWVudCkgewogICAgYXNzZXJ0KAogICAgICAgIGVsZW1lbnQuaXNTdGF0aWMgfHwgZWxlbWVudC5pc1RvcExldmVsLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAiU3RhdGljIGluaXQgZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGEgdG9wLWxldmVsICIKICAgICAgICAgICAgIm9yIHN0YXRpYyBtZXRob2QuIikpOwogICAgYXNzZXJ0KGVsZW1lbnQuaXNGaWVsZCwKICAgICAgICBmYWlsZWRBdChlbGVtZW50LCAiU3RhdGljIGluaXQgZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGEgZmllbGQuIikpOwogICAgcmV0dXJuIG5ldyBTdGF0aWNVc2UuaW50ZXJuYWwoZWxlbWVudCwgU3RhdGljVXNlS2luZC5GSUVMRF9JTklUKTsKICB9CgogIC8vLyBJbnZvY2F0aW9uIG9mIGEgc3VwZXIgbWV0aG9kIFtlbGVtZW50XSB3aXRoIHRoZSBnaXZlbiBbY2FsbFN0cnVjdHVyZV0uCiAgZmFjdG9yeSBTdGF0aWNVc2Uuc3VwZXJJbnZva2UoCiAgICAgIEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQsIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSwKICAgICAgW0xpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHNdKSB7CiAgICBhc3NlcnQoCiAgICAgICAgZWxlbWVudC5pc0luc3RhbmNlTWVtYmVyLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsCiAgICAgICAgICAgICJTdXBlciBpbnZva2UgZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGFuIGluc3RhbmNlIG1ldGhvZC4iKSk7CiAgICBhc3NlcnQoCiAgICAgICAgY2FsbFN0cnVjdHVyZSAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsCiAgICAgICAgICAgICJOb3QgQ2FsbFN0cnVjdHVyZSBmb3Igc3VwZXIgaW52b2NhdGlvbiBvZiBlbGVtZW50ICRlbGVtZW50LiIpKTsKICAgIHJldHVybiBuZXcgR2VuZXJpY1N0YXRpY1VzZSgKICAgICAgICBlbGVtZW50LCBTdGF0aWNVc2VLaW5kLklOVk9LRSwgY2FsbFN0cnVjdHVyZSwgdHlwZUFyZ3VtZW50cyk7CiAgfQoKICAvLy8gUmVhZCBhY2Nlc3Mgb2YgYSBzdXBlciBmaWVsZCBvciBnZXR0ZXIgW2VsZW1lbnRdLgogIGZhY3RvcnkgU3RhdGljVXNlLnN1cGVyR2V0KE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQoCiAgICAgICAgZWxlbWVudC5pc0luc3RhbmNlTWVtYmVyLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBlbGVtZW50LCAiU3VwZXIgZ2V0IGVsZW1lbnQgJGVsZW1lbnQgbXVzdCBiZSBhbiBpbnN0YW5jZSBtZXRob2QuIikpOwogICAgYXNzZXJ0KAogICAgICAgIGVsZW1lbnQuaXNGaWVsZCB8fCBlbGVtZW50LmlzR2V0dGVyLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsCiAgICAgICAgICAgICJTdXBlciBnZXQgZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGEgZmllbGQgb3IgYSBnZXR0ZXIuIikpOwogICAgcmV0dXJuIG5ldyBTdGF0aWNVc2UuaW50ZXJuYWwoZWxlbWVudCwgU3RhdGljVXNlS2luZC5HRVQpOwogIH0KCiAgLy8vIFdyaXRlIGFjY2VzcyBvZiBhIHN1cGVyIGZpZWxkIFtlbGVtZW50XS4KICBmYWN0b3J5IFN0YXRpY1VzZS5zdXBlckZpZWxkU2V0KEZpZWxkRW50aXR5IGVsZW1lbnQpIHsKICAgIGFzc2VydCgKICAgICAgICBlbGVtZW50LmlzSW5zdGFuY2VNZW1iZXIsCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIGVsZW1lbnQsICJTdXBlciBzZXQgZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGFuIGluc3RhbmNlIG1ldGhvZC4iKSk7CiAgICBhc3NlcnQoZWxlbWVudC5pc0ZpZWxkLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsICJTdXBlciBzZXQgZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGEgZmllbGQuIikpOwogICAgcmV0dXJuIG5ldyBTdGF0aWNVc2UuaW50ZXJuYWwoZWxlbWVudCwgU3RhdGljVXNlS2luZC5TVVBFUl9GSUVMRF9TRVQpOwogIH0KCiAgLy8vIFdyaXRlIGFjY2VzcyBvZiBhIHN1cGVyIHNldHRlciBbZWxlbWVudF0uCiAgZmFjdG9yeSBTdGF0aWNVc2Uuc3VwZXJTZXR0ZXJTZXQoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgewogICAgYXNzZXJ0KAogICAgICAgIGVsZW1lbnQuaXNJbnN0YW5jZU1lbWJlciwKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgZWxlbWVudCwgIlN1cGVyIHNldCBlbGVtZW50ICRlbGVtZW50IG11c3QgYmUgYW4gaW5zdGFuY2UgbWV0aG9kLiIpKTsKICAgIGFzc2VydChlbGVtZW50LmlzU2V0dGVyLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsICJTdXBlciBzZXQgZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGEgc2V0dGVyLiIpKTsKICAgIHJldHVybiBuZXcgU3RhdGljVXNlLmludGVybmFsKGVsZW1lbnQsIFN0YXRpY1VzZUtpbmQuU0VUKTsKICB9CgogIC8vLyBDbG9zdXJpemF0aW9uIG9mIGEgc3VwZXIgbWV0aG9kIFtlbGVtZW50XS4KICBmYWN0b3J5IFN0YXRpY1VzZS5zdXBlclRlYXJPZmYoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgewogICAgYXNzZXJ0KAogICAgICAgIGVsZW1lbnQuaXNJbnN0YW5jZU1lbWJlciAmJiBlbGVtZW50LmlzRnVuY3Rpb24sCiAgICAgICAgZmFpbGVkQXQoZWxlbWVudCwKICAgICAgICAgICAgIlN1cGVyIGludm9rZSBlbGVtZW50ICRlbGVtZW50IG11c3QgYmUgYW4gaW5zdGFuY2UgbWV0aG9kLiIpKTsKICAgIHJldHVybiBuZXcgU3RhdGljVXNlLmludGVybmFsKGVsZW1lbnQsIFN0YXRpY1VzZUtpbmQuU1VQRVJfVEVBUl9PRkYpOwogIH0KCiAgLy8vIEludm9jYXRpb24gb2YgYSBjb25zdHJ1Y3RvciBbZWxlbWVudF0gdGhyb3VnaCBhIHRoaXMgb3Igc3VwZXIKICAvLy8gY29uc3RydWN0b3IgY2FsbCB3aXRoIHRoZSBnaXZlbiBbY2FsbFN0cnVjdHVyZV0uCiAgZmFjdG9yeSBTdGF0aWNVc2Uuc3VwZXJDb25zdHJ1Y3Rvckludm9rZSgKICAgICAgQ29uc3RydWN0b3JFbnRpdHkgZWxlbWVudCwgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlKSB7CiAgICBhc3NlcnQoCiAgICAgICAgZWxlbWVudC5pc0dlbmVyYXRpdmVDb25zdHJ1Y3RvciwKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgZWxlbWVudCwKICAgICAgICAgICAgIkNvbnN0cnVjdG9yIGludm9rZSBlbGVtZW50ICRlbGVtZW50IG11c3QgYmUgYSAiCiAgICAgICAgICAgICJnZW5lcmF0aXZlIGNvbnN0cnVjdG9yLiIpKTsKICAgIGFzc2VydCgKICAgICAgICBjYWxsU3RydWN0dXJlICE9IG51bGwsCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgICJOb3QgQ2FsbFN0cnVjdHVyZSBmb3Igc3VwZXIgY29uc3RydWN0b3IgaW52b2NhdGlvbiBvZiBlbGVtZW50ICIKICAgICAgICAgICAgIiRlbGVtZW50LiIpKTsKICAgIHJldHVybiBuZXcgU3RhdGljVXNlLmludGVybmFsKGVsZW1lbnQsIFN0YXRpY1VzZUtpbmQuSU5WT0tFLAogICAgICAgIGNhbGxTdHJ1Y3R1cmU6IGNhbGxTdHJ1Y3R1cmUpOwogIH0KCiAgLy8vIEludm9jYXRpb24gb2YgYSBjb25zdHJ1Y3RvciAoYm9keSkgW2VsZW1lbnRdIHRocm91Z2ggYSB0aGlzIG9yIHN1cGVyCiAgLy8vIGNvbnN0cnVjdG9yIGNhbGwgd2l0aCB0aGUgZ2l2ZW4gW2NhbGxTdHJ1Y3R1cmVdLgogIGZhY3RvcnkgU3RhdGljVXNlLmNvbnN0cnVjdG9yQm9keUludm9rZSgKICAgICAgQ29uc3RydWN0b3JCb2R5RW50aXR5IGVsZW1lbnQsIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSkgewogICAgYXNzZXJ0KAogICAgICAgIGNhbGxTdHJ1Y3R1cmUgIT0gbnVsbCwKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgZWxlbWVudCwKICAgICAgICAgICAgIk5vdCBDYWxsU3RydWN0dXJlIGZvciBjb25zdHJ1Y3RvciBib2R5IGludm9jYXRpb24gb2YgZWxlbWVudCAiCiAgICAgICAgICAgICIkZWxlbWVudC4iKSk7CiAgICByZXR1cm4gbmV3IFN0YXRpY1VzZS5pbnRlcm5hbChlbGVtZW50LCBTdGF0aWNVc2VLaW5kLklOVk9LRSwKICAgICAgICBjYWxsU3RydWN0dXJlOiBjYWxsU3RydWN0dXJlKTsKICB9CgogIC8vLyBEaXJlY3QgaW52b2NhdGlvbiBvZiBhIGdlbmVyYXRvciAoYm9keSkgW2VsZW1lbnRdLCBhcyBhIHN0YXRpYyBjYWxsIG9yCiAgLy8vIHRocm91Z2ggYSB0aGlzIG9yIHN1cGVyIGNvbnN0cnVjdG9yIGNhbGwuCiAgZmFjdG9yeSBTdGF0aWNVc2UuZ2VuZXJhdG9yQm9keUludm9rZShGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gbmV3IFN0YXRpY1VzZS5pbnRlcm5hbChlbGVtZW50LCBTdGF0aWNVc2VLaW5kLklOVk9LRSwKICAgICAgICBjYWxsU3RydWN0dXJlOiBDYWxsU3RydWN0dXJlLk5PX0FSR1MpOwogIH0KCiAgLy8vIERpcmVjdCBpbnZvY2F0aW9uIG9mIGEgbWV0aG9kIFtlbGVtZW50XSB3aXRoIHRoZSBnaXZlbiBbY2FsbFN0cnVjdHVyZV0uCiAgZmFjdG9yeSBTdGF0aWNVc2UuZGlyZWN0SW52b2tlKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQsCiAgICAgIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykgewogICAgYXNzZXJ0KAogICAgICAgIGVsZW1lbnQuaXNJbnN0YW5jZU1lbWJlciwKICAgICAgICBmYWlsZWRBdChlbGVtZW50LAogICAgICAgICAgICAiRGlyZWN0IGludm9rZSBlbGVtZW50ICRlbGVtZW50IG11c3QgYmUgYW4gaW5zdGFuY2UgbWVtYmVyLiIpKTsKICAgIGFzc2VydChlbGVtZW50LmlzRnVuY3Rpb24sCiAgICAgICAgZmFpbGVkQXQoZWxlbWVudCwgIkRpcmVjdCBpbnZva2UgZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGEgbWV0aG9kLiIpKTsKICAgIHJldHVybiBuZXcgR2VuZXJpY1N0YXRpY1VzZSgKICAgICAgICBlbGVtZW50LCBTdGF0aWNVc2VLaW5kLkRJUkVDVF9JTlZPS0UsIGNhbGxTdHJ1Y3R1cmUsIHR5cGVBcmd1bWVudHMpOwogIH0KCiAgLy8vIERpcmVjdCByZWFkIGFjY2VzcyBvZiBhIGZpZWxkIG9yIGdldHRlciBbZWxlbWVudF0uCiAgZmFjdG9yeSBTdGF0aWNVc2UuZGlyZWN0R2V0KE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQoCiAgICAgICAgZWxlbWVudC5pc0luc3RhbmNlTWVtYmVyLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsCiAgICAgICAgICAgICJEaXJlY3QgZ2V0IGVsZW1lbnQgJGVsZW1lbnQgbXVzdCBiZSBhbiBpbnN0YW5jZSBtZW1iZXIuIikpOwogICAgYXNzZXJ0KAogICAgICAgIGVsZW1lbnQuaXNGaWVsZCB8fCBlbGVtZW50LmlzR2V0dGVyLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsCiAgICAgICAgICAgICJEaXJlY3QgZ2V0IGVsZW1lbnQgJGVsZW1lbnQgbXVzdCBiZSBhIGZpZWxkIG9yIGEgZ2V0dGVyLiIpKTsKICAgIHJldHVybiBuZXcgU3RhdGljVXNlLmludGVybmFsKGVsZW1lbnQsIFN0YXRpY1VzZUtpbmQuR0VUKTsKICB9CgogIC8vLyBEaXJlY3Qgd3JpdGUgYWNjZXNzIG9mIGEgZmllbGQgW2VsZW1lbnRdLgogIGZhY3RvcnkgU3RhdGljVXNlLmRpcmVjdFNldChGaWVsZEVudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQoCiAgICAgICAgZWxlbWVudC5pc0luc3RhbmNlTWVtYmVyLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsCiAgICAgICAgICAgICJEaXJlY3Qgc2V0IGVsZW1lbnQgJGVsZW1lbnQgbXVzdCBiZSBhbiBpbnN0YW5jZSBtZW1iZXIuIikpOwogICAgYXNzZXJ0KGVsZW1lbnQuaXNGaWVsZCwKICAgICAgICBmYWlsZWRBdChlbGVtZW50LCAiRGlyZWN0IHNldCBlbGVtZW50ICRlbGVtZW50IG11c3QgYmUgYSBmaWVsZC4iKSk7CiAgICByZXR1cm4gbmV3IFN0YXRpY1VzZS5pbnRlcm5hbChlbGVtZW50LCBTdGF0aWNVc2VLaW5kLlNFVCk7CiAgfQoKICAvLy8gQ29uc3RydWN0b3IgaW52b2NhdGlvbiBvZiBbZWxlbWVudF0gd2l0aCB0aGUgZ2l2ZW4gW2NhbGxTdHJ1Y3R1cmVdLgogIGZhY3RvcnkgU3RhdGljVXNlLmNvbnN0cnVjdG9ySW52b2tlKAogICAgICBDb25zdHJ1Y3RvckVudGl0eSBlbGVtZW50LCBDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUpIHsKICAgIGFzc2VydCgKICAgICAgICBlbGVtZW50LmlzQ29uc3RydWN0b3IsCiAgICAgICAgZmFpbGVkQXQoZWxlbWVudCwKICAgICAgICAgICAgIkNvbnN0cnVjdG9yIGludm9jYXRpb24gZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGEgY29uc3RydWN0b3IuIikpOwogICAgYXNzZXJ0KAogICAgICAgIGNhbGxTdHJ1Y3R1cmUgIT0gbnVsbCwKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgZWxlbWVudCwKICAgICAgICAgICAgIk5vdCBDYWxsU3RydWN0dXJlIGZvciBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIG9mIGVsZW1lbnQgIgogICAgICAgICAgICAiJGVsZW1lbnQuIikpOwogICAgcmV0dXJuIG5ldyBTdGF0aWNVc2UuaW50ZXJuYWwoZWxlbWVudCwgU3RhdGljVXNlS2luZC5JTlZPS0UsCiAgICAgICAgY2FsbFN0cnVjdHVyZTogY2FsbFN0cnVjdHVyZSk7CiAgfQoKICAvLy8gQ29uc3RydWN0b3IgaW52b2NhdGlvbiBvZiBbZWxlbWVudF0gd2l0aCB0aGUgZ2l2ZW4gW2NhbGxTdHJ1Y3R1cmVdIG9uCiAgLy8vIFt0eXBlXS4KICBmYWN0b3J5IFN0YXRpY1VzZS50eXBlZENvbnN0cnVjdG9ySW52b2tlKAogICAgICBDb25zdHJ1Y3RvckVudGl0eSBlbGVtZW50LAogICAgICBDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUsCiAgICAgIEludGVyZmFjZVR5cGUgdHlwZSwKICAgICAgSW1wb3J0RW50aXR5IGRlZmVycmVkSW1wb3J0KSB7CiAgICBhc3NlcnQodHlwZSAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsICJObyB0eXBlIHByb3ZpZGVkIGZvciBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uLiIpKTsKICAgIGFzc2VydCgKICAgICAgICBlbGVtZW50LmlzQ29uc3RydWN0b3IsCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgICJUeXBlZCBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIGVsZW1lbnQgJGVsZW1lbnQgIgogICAgICAgICAgICAibXVzdCBiZSBhIGNvbnN0cnVjdG9yLiIpKTsKICAgIHJldHVybiBuZXcgU3RhdGljVXNlLmludGVybmFsKGVsZW1lbnQsIFN0YXRpY1VzZUtpbmQuQ09OU1RSVUNUT1JfSU5WT0tFLAogICAgICAgIHR5cGU6IHR5cGUsCiAgICAgICAgY2FsbFN0cnVjdHVyZTogY2FsbFN0cnVjdHVyZSwKICAgICAgICBkZWZlcnJlZEltcG9ydDogZGVmZXJyZWRJbXBvcnQpOwogIH0KCiAgLy8vIENvbnN0YW50IGNvbnN0cnVjdG9yIGludm9jYXRpb24gb2YgW2VsZW1lbnRdIHdpdGggdGhlIGdpdmVuCiAgLy8vIFtjYWxsU3RydWN0dXJlXSBvbiBbdHlwZV0uCiAgZmFjdG9yeSBTdGF0aWNVc2UuY29uc3RDb25zdHJ1Y3Rvckludm9rZSgKICAgICAgQ29uc3RydWN0b3JFbnRpdHkgZWxlbWVudCwKICAgICAgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlLAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUsCiAgICAgIEltcG9ydEVudGl0eSBkZWZlcnJlZEltcG9ydCkgewogICAgYXNzZXJ0KHR5cGUgIT0gbnVsbCwKICAgICAgICBmYWlsZWRBdChlbGVtZW50LCAiTm8gdHlwZSBwcm92aWRlZCBmb3IgY29uc3RydWN0b3IgaW52b2NhdGlvbi4iKSk7CiAgICBhc3NlcnQoCiAgICAgICAgZWxlbWVudC5pc0NvbnN0cnVjdG9yLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAiQ29uc3QgY29uc3RydWN0b3IgaW52b2NhdGlvbiBlbGVtZW50ICRlbGVtZW50ICIKICAgICAgICAgICAgIm11c3QgYmUgYSBjb25zdHJ1Y3Rvci4iKSk7CiAgICByZXR1cm4gbmV3IFN0YXRpY1VzZS5pbnRlcm5hbCgKICAgICAgICBlbGVtZW50LCBTdGF0aWNVc2VLaW5kLkNPTlNUX0NPTlNUUlVDVE9SX0lOVk9LRSwKICAgICAgICB0eXBlOiB0eXBlLAogICAgICAgIGNhbGxTdHJ1Y3R1cmU6IGNhbGxTdHJ1Y3R1cmUsCiAgICAgICAgZGVmZXJyZWRJbXBvcnQ6IGRlZmVycmVkSW1wb3J0KTsKICB9CgogIC8vLyBDb25zdHJ1Y3RvciByZWRpcmVjdGlvbiB0byBbZWxlbWVudF0gb24gW3R5cGVdLgogIGZhY3RvcnkgU3RhdGljVXNlLmNvbnN0cnVjdG9yUmVkaXJlY3QoCiAgICAgIENvbnN0cnVjdG9yRW50aXR5IGVsZW1lbnQsIEludGVyZmFjZVR5cGUgdHlwZSkgewogICAgYXNzZXJ0KHR5cGUgIT0gbnVsbCwKICAgICAgICBmYWlsZWRBdChlbGVtZW50LCAiTm8gdHlwZSBwcm92aWRlZCBmb3IgY29uc3RydWN0b3IgcmVkaXJlY3Rpb24uIikpOwogICAgYXNzZXJ0KAogICAgICAgIGVsZW1lbnQuaXNDb25zdHJ1Y3RvciwKICAgICAgICBmYWlsZWRBdChlbGVtZW50LAogICAgICAgICAgICAiQ29uc3RydWN0b3IgcmVkaXJlY3Rpb24gZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGEgY29uc3RydWN0b3IuIikpOwogICAgcmV0dXJuIG5ldyBTdGF0aWNVc2UuaW50ZXJuYWwoZWxlbWVudCwgU3RhdGljVXNlS2luZC5SRURJUkVDVElPTiwKICAgICAgICB0eXBlOiB0eXBlKTsKICB9CgogIC8vLyBJbml0aWFsaXphdGlvbiBvZiBhbiBpbnN0YW5jZSBmaWVsZCBbZWxlbWVudF0uCiAgZmFjdG9yeSBTdGF0aWNVc2UuZmllbGRJbml0KEZpZWxkRW50aXR5IGVsZW1lbnQpIHsKICAgIGFzc2VydCgKICAgICAgICBlbGVtZW50LmlzSW5zdGFuY2VNZW1iZXIsCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIGVsZW1lbnQsICJGaWVsZCBpbml0IGVsZW1lbnQgJGVsZW1lbnQgbXVzdCBiZSBhbiBpbnN0YW5jZSBmaWVsZC4iKSk7CiAgICByZXR1cm4gbmV3IFN0YXRpY1VzZS5pbnRlcm5hbChlbGVtZW50LCBTdGF0aWNVc2VLaW5kLkZJRUxEX0lOSVQpOwogIH0KCiAgLy8vIENvbnN0YW50IGluaXRpYWxpemF0aW9uIG9mIGFuIGluc3RhbmNlIGZpZWxkIFtlbGVtZW50XS4KICBmYWN0b3J5IFN0YXRpY1VzZS5maWVsZENvbnN0YW50SW5pdCgKICAgICAgRmllbGRFbnRpdHkgZWxlbWVudCwgQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgYXNzZXJ0KAogICAgICAgIGVsZW1lbnQuaXNJbnN0YW5jZU1lbWJlciwKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgZWxlbWVudCwgIkZpZWxkIGluaXQgZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGFuIGluc3RhbmNlIGZpZWxkLiIpKTsKICAgIHJldHVybiBuZXcgU3RhdGljVXNlLmludGVybmFsKGVsZW1lbnQsIFN0YXRpY1VzZUtpbmQuRklFTERfQ09OU1RBTlRfSU5JVCwKICAgICAgICBjb25zdGFudDogY29uc3RhbnQpOwogIH0KCiAgLy8vIFJlYWQgYWNjZXNzIG9mIGFuIGluc3RhbmNlIGZpZWxkIG9yIGJveGVkIGZpZWxkIFtlbGVtZW50XS4KICBmYWN0b3J5IFN0YXRpY1VzZS5maWVsZEdldChGaWVsZEVudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQoCiAgICAgICAgZWxlbWVudC5pc0luc3RhbmNlTWVtYmVyIHx8IGVsZW1lbnQgaXMgSlJlY29yZEZpZWxkLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsCiAgICAgICAgICAgICJGaWVsZCBpbml0IGVsZW1lbnQgJGVsZW1lbnQgbXVzdCBiZSBhbiBpbnN0YW5jZSBvciBib3hlZCBmaWVsZC4iKSk7CiAgICByZXR1cm4gbmV3IFN0YXRpY1VzZS5pbnRlcm5hbChlbGVtZW50LCBTdGF0aWNVc2VLaW5kLkZJRUxEX0dFVCk7CiAgfQoKICAvLy8gV3JpdGUgYWNjZXNzIG9mIGFuIGluc3RhbmNlIGZpZWxkIG9yIGJveGVkIGZpZWxkIFtlbGVtZW50XS4KICBmYWN0b3J5IFN0YXRpY1VzZS5maWVsZFNldChGaWVsZEVudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQoCiAgICAgICAgZWxlbWVudC5pc0luc3RhbmNlTWVtYmVyIHx8IGVsZW1lbnQgaXMgSlJlY29yZEZpZWxkLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsCiAgICAgICAgICAgICJGaWVsZCBpbml0IGVsZW1lbnQgJGVsZW1lbnQgbXVzdCBiZSBhbiBpbnN0YW5jZSBvciBib3hlZCBmaWVsZC4iKSk7CiAgICByZXR1cm4gbmV3IFN0YXRpY1VzZS5pbnRlcm5hbChlbGVtZW50LCBTdGF0aWNVc2VLaW5kLkZJRUxEX1NFVCk7CiAgfQoKICAvLy8gUmVhZCBvZiBhIGxvY2FsIGZ1bmN0aW9uIFtlbGVtZW50XS4KICBmYWN0b3J5IFN0YXRpY1VzZS5jbG9zdXJlKExvY2FsIGVsZW1lbnQpIHsKICAgIHJldHVybiBuZXcgU3RhdGljVXNlLmludGVybmFsKGVsZW1lbnQsIFN0YXRpY1VzZUtpbmQuQ0xPU1VSRSk7CiAgfQoKICAvLy8gQW4gaW52b2NhdGlvbiBvZiBhIGxvY2FsIGZ1bmN0aW9uIFtlbGVtZW50XSB3aXRoIHRoZSBwcm92aWRlZAogIC8vLyBbY2FsbFN0cnVjdHVyZV0gYW5kIFt0eXBlQXJndW1lbnRzXS4KICBmYWN0b3J5IFN0YXRpY1VzZS5jbG9zdXJlQ2FsbChMb2NhbCBlbGVtZW50LCBDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUsCiAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIHJldHVybiBuZXcgR2VuZXJpY1N0YXRpY1VzZSgKICAgICAgICBlbGVtZW50LCBTdGF0aWNVc2VLaW5kLkNMT1NVUkVfQ0FMTCwgY2FsbFN0cnVjdHVyZSwgdHlwZUFyZ3VtZW50cyk7CiAgfQoKICAvLy8gUmVhZCBvZiBhIGNhbGwgW21ldGhvZF0gb24gYSBjbG9zdXJlQ2xhc3MuCiAgZmFjdG9yeSBTdGF0aWNVc2UuY2FsbE1ldGhvZChGdW5jdGlvbkVudGl0eSBtZXRob2QpIHsKICAgIHJldHVybiBuZXcgU3RhdGljVXNlLmludGVybmFsKG1ldGhvZCwgU3RhdGljVXNlS2luZC5DQUxMX01FVEhPRCk7CiAgfQoKICAvLy8gSW1wbGljaXQgbWV0aG9kL2NvbnN0cnVjdG9yIGludm9jYXRpb24gb2YgW2VsZW1lbnRdIGNyZWF0ZWQgYnkgdGhlCiAgLy8vIGJhY2tlbmQuCiAgZmFjdG9yeSBTdGF0aWNVc2UuaW1wbGljaXRJbnZva2UoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIG5ldyBTdGF0aWNVc2UuaW50ZXJuYWwoZWxlbWVudCwgU3RhdGljVXNlS2luZC5JTlZPS0UsCiAgICAgICAgY2FsbFN0cnVjdHVyZTogZWxlbWVudC5wYXJhbWV0ZXJTdHJ1Y3R1cmUuY2FsbFN0cnVjdHVyZSk7CiAgfQoKICAvLy8gSW5saW5pbmcgb2YgW2VsZW1lbnRdLgogIGZhY3RvcnkgU3RhdGljVXNlLmNvbnN0cnVjdG9ySW5saW5pbmcoCiAgICAgIENvbnN0cnVjdG9yRW50aXR5IGVsZW1lbnQsIEludGVyZmFjZVR5cGUgaW5zdGFuY2VUeXBlKSB7CiAgICByZXR1cm4gbmV3IFN0YXRpY1VzZS5pbnRlcm5hbChlbGVtZW50LCBTdGF0aWNVc2VLaW5kLklOTElOSU5HLAogICAgICAgIHR5cGU6IGluc3RhbmNlVHlwZSk7CiAgfQoKICAvLy8gSW5saW5pbmcgb2YgW2VsZW1lbnRdLgogIGZhY3RvcnkgU3RhdGljVXNlLm1ldGhvZElubGluaW5nKAogICAgICBGdW5jdGlvbkVudGl0eSBlbGVtZW50LCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IEdlbmVyaWNTdGF0aWNVc2UubWV0aG9kSW5saW5pbmcoZWxlbWVudCwgdHlwZUFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gb3RoZXIgaXMgU3RhdGljVXNlICYmCiAgICAgICAgZWxlbWVudCA9PSBvdGhlci5lbGVtZW50ICYmCiAgICAgICAga2luZCA9PSBvdGhlci5raW5kICYmCiAgICAgICAgdHlwZSA9PSBvdGhlci50eXBlICYmCiAgICAgICAgY2FsbFN0cnVjdHVyZSA9PSBvdGhlci5jYWxsU3RydWN0dXJlICYmCiAgICAgICAgZXF1YWxFbGVtZW50cyh0eXBlQXJndW1lbnRzLCBvdGhlci50eXBlQXJndW1lbnRzKSAmJgogICAgICAgIGRlZmVycmVkSW1wb3J0ID09IG90aGVyLmRlZmVycmVkSW1wb3J0ICYmCiAgICAgICAgY29uc3RhbnQgPT0gb3RoZXIuY29uc3RhbnQ7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PgogICAgICAnU3RhdGljVXNlKCRlbGVtZW50LCRraW5kLCR0eXBlLCR0eXBlQXJndW1lbnRzLCRjYWxsU3RydWN0dXJlKSc7Cn0KCmNsYXNzIEdlbmVyaWNTdGF0aWNVc2UgZXh0ZW5kcyBTdGF0aWNVc2UgewogIEBvdmVycmlkZQogIGZpbmFsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHM7CgogIEdlbmVyaWNTdGF0aWNVc2UoRW50aXR5IGVudGl0eSwgU3RhdGljVXNlS2luZCBraW5kLAogICAgICBDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUsIHRoaXMudHlwZUFyZ3VtZW50cywKICAgICAgW0ltcG9ydEVudGl0eSBkZWZlcnJlZEltcG9ydF0pCiAgICAgIDogc3VwZXIuaW50ZXJuYWwoZW50aXR5LCBraW5kLAogICAgICAgICAgICBjYWxsU3RydWN0dXJlOiBjYWxsU3RydWN0dXJlLAogICAgICAgICAgICBkZWZlcnJlZEltcG9ydDogZGVmZXJyZWRJbXBvcnQsCiAgICAgICAgICAgIHR5cGVBcmd1bWVudHNIYXNoOiBIYXNoaW5nLmxpc3RIYXNoKHR5cGVBcmd1bWVudHMpKSB7CiAgICBhc3NlcnQoCiAgICAgICAgKGNhbGxTdHJ1Y3R1cmU/LnR5cGVBcmd1bWVudENvdW50ID8/IDApID09ICh0eXBlQXJndW1lbnRzPy5sZW5ndGggPz8gMCksCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgICJUeXBlIGFyZ3VtZW50IGNvdW50IG1pc21hdGNoLiBDYWxsIHN0cnVjdHVyZSBoYXMgIgogICAgICAgICAgICAiJHtjYWxsU3RydWN0dXJlPy50eXBlQXJndW1lbnRDb3VudCA/PyAwfSBidXQgIgogICAgICAgICAgICAiJHt0eXBlQXJndW1lbnRzPy5sZW5ndGggPz8gMH0gd2VyZSBwYXNzZWQuIikpOwogIH0KCiAgR2VuZXJpY1N0YXRpY1VzZS5tZXRob2RJbmxpbmluZyhGdW5jdGlvbkVudGl0eSBlbnRpdHksIHRoaXMudHlwZUFyZ3VtZW50cykKICAgICAgOiBzdXBlci5pbnRlcm5hbChlbnRpdHksIFN0YXRpY1VzZUtpbmQuSU5MSU5JTkcsCiAgICAgICAgICAgIHR5cGVBcmd1bWVudHNIYXNoOiBIYXNoaW5nLmxpc3RIYXNoKHR5cGVBcmd1bWVudHMpKTsKfQoKZW51bSBUeXBlVXNlS2luZCB7CiAgSVNfQ0hFQ0ssCiAgQVNfQ0FTVCwKICBDQVRDSF9UWVBFLAogIFRZUEVfTElURVJBTCwKICBJTlNUQU5USUFUSU9OLAogIE5BVElWRV9JTlNUQU5USUFUSU9OLAogIENPTlNUX0lOU1RBTlRJQVRJT04sCiAgSU1QTElDSVRfQ0FTVCwKICBQQVJBTUVURVJfQ0hFQ0ssCiAgUlRJX1ZBTFVFLAogIFRZUEVfQVJHVU1FTlQsCn0KCi8vLyBVc2Ugb2YgYSBbRGFydFR5cGVdLgpjbGFzcyBUeXBlVXNlIHsKICBmaW5hbCBEYXJ0VHlwZSB0eXBlOwogIGZpbmFsIFR5cGVVc2VLaW5kIGtpbmQ7CiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IGhhc2hDb2RlOwogIGZpbmFsIEltcG9ydEVudGl0eSBkZWZlcnJlZEltcG9ydDsKCiAgVHlwZVVzZS5pbnRlcm5hbChEYXJ0VHlwZSB0eXBlLCBUeXBlVXNlS2luZCBraW5kLCBbdGhpcy5kZWZlcnJlZEltcG9ydF0pCiAgICAgIDogdGhpcy50eXBlID0gdHlwZSwKICAgICAgICB0aGlzLmtpbmQgPSBraW5kLAogICAgICAgIHRoaXMuaGFzaENvZGUgPSBIYXNoaW5nLm9iamVjdHNIYXNoKHR5cGUsIGtpbmQsIGRlZmVycmVkSW1wb3J0KTsKCiAgLy8vIFNob3J0IHRleHR1YWwgcmVwcmVzZW50YXRpb24gdXNlIGZvciB0ZXN0aW5nLgogIFN0cmluZyBnZXQgc2hvcnRUZXh0IHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIFR5cGVVc2VLaW5kLklTX0NIRUNLOgogICAgICAgIHNiLndyaXRlKCdpczonKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBUeXBlVXNlS2luZC5BU19DQVNUOgogICAgICAgIHNiLndyaXRlKCdhczonKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBUeXBlVXNlS2luZC5DQVRDSF9UWVBFOgogICAgICAgIHNiLndyaXRlKCdjYXRjaDonKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBUeXBlVXNlS2luZC5UWVBFX0xJVEVSQUw6CiAgICAgICAgc2Iud3JpdGUoJ2xpdDonKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBUeXBlVXNlS2luZC5JTlNUQU5USUFUSU9OOgogICAgICAgIHNiLndyaXRlKCdpbnN0OicpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFR5cGVVc2VLaW5kLkNPTlNUX0lOU1RBTlRJQVRJT046CiAgICAgICAgc2Iud3JpdGUoJ2NvbnN0OicpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFR5cGVVc2VLaW5kLk5BVElWRV9JTlNUQU5USUFUSU9OOgogICAgICAgIHNiLndyaXRlKCduYXRpdmU6Jyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuSU1QTElDSVRfQ0FTVDoKICAgICAgICBzYi53cml0ZSgnaW1wbDonKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBUeXBlVXNlS2luZC5QQVJBTUVURVJfQ0hFQ0s6CiAgICAgICAgc2Iud3JpdGUoJ3BhcmFtOicpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFR5cGVVc2VLaW5kLlJUSV9WQUxVRToKICAgICAgICBzYi53cml0ZSgncnRpOicpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFR5cGVVc2VLaW5kLlRZUEVfQVJHVU1FTlQ6CiAgICAgICAgc2Iud3JpdGUoJ3R5cGVBcmc6Jyk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBzYi53cml0ZSh0eXBlKTsKICAgIGlmIChkZWZlcnJlZEltcG9ydCAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCd7Jyk7CiAgICAgIHNiLndyaXRlKGRlZmVycmVkSW1wb3J0Lm5hbWUpOwogICAgICBzYi53cml0ZSgnfScpOwogICAgfQogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQoKICAvLy8gW3R5cGVdIHVzZWQgaW4gYW4gaXMgY2hlY2ssIGxpa2UgYGUgaXMgVGAgb3IgYGUgaXMhIFRgLgogIGZhY3RvcnkgVHlwZVVzZS5pc0NoZWNrKERhcnRUeXBlIHR5cGUpIHsKICAgIHJldHVybiBuZXcgVHlwZVVzZS5pbnRlcm5hbCh0eXBlLCBUeXBlVXNlS2luZC5JU19DSEVDSyk7CiAgfQoKICAvLy8gW3R5cGVdIHVzZWQgaW4gYW4gYXMgY2FzdCwgbGlrZSBgZSBhcyBUYC4KICBmYWN0b3J5IFR5cGVVc2UuYXNDYXN0KERhcnRUeXBlIHR5cGUpIHsKICAgIHJldHVybiBuZXcgVHlwZVVzZS5pbnRlcm5hbCh0eXBlLCBUeXBlVXNlS2luZC5BU19DQVNUKTsKICB9CgogIC8vLyBbdHlwZV0gdXNlZCBhcyBhIHBhcmFtZXRlciB0eXBlIG9yIGZpZWxkIHR5cGUgaW4gRGFydCAyLCBsaWtlIGBUYCBpbjoKICAvLy8KICAvLy8gICAgbWV0aG9kKFQgdCkge30KICAvLy8gICAgVCBmaWVsZDsKICAvLy8KICBmYWN0b3J5IFR5cGVVc2UucGFyYW1ldGVyQ2hlY2soRGFydFR5cGUgdHlwZSkgewogICAgcmV0dXJuIG5ldyBUeXBlVXNlLmludGVybmFsKHR5cGUsIFR5cGVVc2VLaW5kLlBBUkFNRVRFUl9DSEVDSyk7CiAgfQoKICAvLy8gW3R5cGVdIHVzZWQgaW4gYW4gaW1wbGljaXQgY2FzdCBpbiBEYXJ0IDIsIGxpa2UgYFRgIGluCiAgLy8vCiAgLy8vICAgIGR5bmFtaWMgZm9vID0gbmV3IE9iamVjdCgpOwogIC8vLyAgICBUIGJhciA9IGZvbzsgLy8gSW1wbGljaXRseSBgVCBiYXIgPSBmb28gYXMgVGAuCiAgLy8vCiAgZmFjdG9yeSBUeXBlVXNlLmltcGxpY2l0Q2FzdChEYXJ0VHlwZSB0eXBlKSB7CiAgICByZXR1cm4gbmV3IFR5cGVVc2UuaW50ZXJuYWwodHlwZSwgVHlwZVVzZUtpbmQuSU1QTElDSVRfQ0FTVCk7CiAgfQoKICAvLy8gW3R5cGVdIHVzZWQgaW4gYSBvbiB0eXBlIGNhdGNoIGNsYXVzZSwgbGlrZSBgdHJ5IHt9IG9uIFQgY2F0Y2ggKGUpIHt9YC4KICBmYWN0b3J5IFR5cGVVc2UuY2F0Y2hUeXBlKERhcnRUeXBlIHR5cGUpIHsKICAgIHJldHVybiBuZXcgVHlwZVVzZS5pbnRlcm5hbCh0eXBlLCBUeXBlVXNlS2luZC5DQVRDSF9UWVBFKTsKICB9CgogIC8vLyBbdHlwZV0gdXNlZCBhcyBhIHR5cGUgbGl0ZXJhbCwgbGlrZSBgZm9vKCkgPT4gVDtgLgogIGZhY3RvcnkgVHlwZVVzZS50eXBlTGl0ZXJhbChEYXJ0VHlwZSB0eXBlLCBJbXBvcnRFbnRpdHkgZGVmZXJyZWRJbXBvcnQpIHsKICAgIHJldHVybiBuZXcgVHlwZVVzZS5pbnRlcm5hbCh0eXBlLCBUeXBlVXNlS2luZC5UWVBFX0xJVEVSQUwsIGRlZmVycmVkSW1wb3J0KTsKICB9CgogIC8vLyBbdHlwZV0gdXNlZCBpbiBhbiBpbnN0YW50aWF0aW9uLCBsaWtlIGBuZXcgVCgpO2AuCiAgZmFjdG9yeSBUeXBlVXNlLmluc3RhbnRpYXRpb24oSW50ZXJmYWNlVHlwZSB0eXBlKSB7CiAgICByZXR1cm4gbmV3IFR5cGVVc2UuaW50ZXJuYWwodHlwZSwgVHlwZVVzZUtpbmQuSU5TVEFOVElBVElPTik7CiAgfQoKICAvLy8gW3R5cGVdIHVzZWQgaW4gYSBjb25zdGFudCBpbnN0YW50aWF0aW9uLCBsaWtlIGBjb25zdCBUKCk7YC4KICBmYWN0b3J5IFR5cGVVc2UuY29uc3RJbnN0YW50aWF0aW9uKAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUsIEltcG9ydEVudGl0eSBkZWZlcnJlZEltcG9ydCkgewogICAgcmV0dXJuIG5ldyBUeXBlVXNlLmludGVybmFsKAogICAgICAgIHR5cGUsIFR5cGVVc2VLaW5kLkNPTlNUX0lOU1RBTlRJQVRJT04sIGRlZmVycmVkSW1wb3J0KTsKICB9CgogIC8vLyBbdHlwZV0gdXNlZCBpbiBhIG5hdGl2ZSBpbnN0YW50aWF0aW9uLgogIGZhY3RvcnkgVHlwZVVzZS5uYXRpdmVJbnN0YW50aWF0aW9uKEludGVyZmFjZVR5cGUgdHlwZSkgewogICAgcmV0dXJuIG5ldyBUeXBlVXNlLmludGVybmFsKHR5cGUsIFR5cGVVc2VLaW5kLk5BVElWRV9JTlNUQU5USUFUSU9OKTsKICB9CgogIC8vLyBbdHlwZV0gdXNlZCBhcyBhIGRpcmVjdCBSVEkgdmFsdWUuCiAgZmFjdG9yeSBUeXBlVXNlLmNvbnN0VHlwZUxpdGVyYWwoRGFydFR5cGUgdHlwZSkgewogICAgcmV0dXJuIG5ldyBUeXBlVXNlLmludGVybmFsKHR5cGUsIFR5cGVVc2VLaW5kLlJUSV9WQUxVRSk7CiAgfQoKICAvLy8gW3R5cGVdIHVzZWQgaW4gYSBgaW5zdGFuY2VvZmAgY2hlY2suCiAgZmFjdG9yeSBUeXBlVXNlLmluc3RhbmNlQ29uc3RydWN0b3IoRGFydFR5cGUgdHlwZSkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyLHNyYSk6IFVzZSBhIHNlcGFyYXRlIHVzZSBraW5kIGlmIGNvbnN0cnVjdG9ycyBpcyBubwogICAgLy8gbG9uZ2VyIHVzZWQgZm9yIFJUSS4KICAgIHJldHVybiBuZXcgVHlwZVVzZS5pbnRlcm5hbCh0eXBlLCBUeXBlVXNlS2luZC5SVElfVkFMVUUpOwogIH0KCiAgLy8vIFt0eXBlXSB1c2VkIGRpcmVjdGx5IGFzIGEgdHlwZSBhcmd1bWVudC4KICAvLy8KICAvLy8gVGhlIGhhcHBlbnMgZHVyaW5nIG9wdGltaXphdGlvbiB3aGVyZSBhIHR5cGUgdmFyaWFibGUgY2FuIGJlIHJlcGxhY2VkIGJ5CiAgLy8vIGFuIGludmFyaWFibGUgdHlwZSBhcmd1bWVudCBkZXJpdmVkIGZyb20gYSBjb25zdGFudCByZWNlaXZlci4KICBmYWN0b3J5IFR5cGVVc2UudHlwZUFyZ3VtZW50KERhcnRUeXBlIHR5cGUpIHsKICAgIHJldHVybiBuZXcgVHlwZVVzZS5pbnRlcm5hbCh0eXBlLCBUeXBlVXNlS2luZC5UWVBFX0FSR1VNRU5UKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgVHlwZVVzZSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHR5cGUgPT0gb3RoZXIudHlwZSAmJiBraW5kID09IG90aGVyLmtpbmQ7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnVHlwZVVzZSgkdHlwZSwka2luZCknOwp9CgovLy8gVXNlIG9mIGEgW0NvbnN0YW50VmFsdWVdLgpjbGFzcyBDb25zdGFudFVzZSB7CiAgZmluYWwgQ29uc3RhbnRWYWx1ZSB2YWx1ZTsKCiAgQ29uc3RhbnRVc2UuXyh0aGlzLnZhbHVlKTsKCiAgLy8vIFNob3J0IHRleHR1YWwgcmVwcmVzZW50YXRpb24gdXNlIGZvciB0ZXN0aW5nLgogIFN0cmluZyBnZXQgc2hvcnRUZXh0IHsKICAgIHJldHVybiB2YWx1ZS50b0RhcnRUZXh0KCk7CiAgfQoKICAvLy8gQ29uc3RhbnQgdXNlZCBhcyB0aGUgaW5pdGlhbCB2YWx1ZSBvZiBhIGZpZWxkLgogIENvbnN0YW50VXNlLmluaXQoQ29uc3RhbnRWYWx1ZSB2YWx1ZSkg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cnQyanNfaW5mby5pbmZvOwoKLy8vIENvbW1vbiBpbnRlcmZhY2UgdG8gbWFueSBwaWVjZXMgb2YgaW5mb3JtYXRpb24gZ2VuZXJhdGVkIGJ5IHRoZSBkYXJ0MmpzCi8vLyBjb21waWxlciB0aGF0IGFyZSBkaXJlY3RseSBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCAoY29tcGlsYXRpb24gdW5pdCwKLy8vIGxpYnJhcnksIGNsYXNzLCBmdW5jdGlvbiwgb3IgZmllbGQpLgphYnN0cmFjdCBjbGFzcyBJbmZvIHsKICAvLy8gQW4gaWRlbnRpZmllciBmb3IgdGhlIGtpbmQgb2YgaW5mb3JtYXRpb24uCiAgSW5mb0tpbmQgZ2V0IGtpbmQ7CgogIC8vLyBOYW1lIG9mIHRoZSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluZm8uCiAgU3RyaW5nIG5hbWU7CgogIC8vLyBJZCB1c2VkIGJ5IHRoZSBjb21waWxlciB3aGVuIGluc3RydW1lbnRpbmcgY29kZSBmb3IgY29kZSBjb3ZlcmFnZS4KICAvLyBUT0RPKHNpZ211bmQpOiBJdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIHVzZSB0aGUgc2FtZSBpZCBmb3IKICAvLyBzZXJpYWxpemF0aW9uIGFuZCBmb3IgY292ZXJhZ2UuIENvdWxkIHdlIHVuaWZ5IHRoZW0/CiAgU3RyaW5nIGNvdmVyYWdlSWQ7CgogIC8vLyBCeXRlcyB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgY29kZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudC4KICBpbnQgc2l6ZTsKCiAgLy8vIEluZm8gb2YgdGhlIGVuY2xvc2luZyBlbGVtZW50LgogIEluZm8gcGFyZW50OwoKICBUIGFjY2VwdDxUPihJbmZvVmlzaXRvcjxUPiB2aXNpdG9yKTsKfQoKLy8vIENvbW1vbiBpbmZvcm1hdGlvbiB1c2VkIGZvciBtb3N0IGtpbmQgb2YgZWxlbWVudHMuCi8vIFRPRE8oc2lnbXVuZCk6IGFkZCBtb3JlOgovLyAgLSBpbnB1dFNpemU6IGJ5dGVzIHVzZWQgaW4gdGhlIERhcnQgc291cmNlIHByb2dyYW0KYWJzdHJhY3QgY2xhc3MgQmFzaWNJbmZvIGltcGxlbWVudHMgSW5mbyB7CiAgZmluYWwgSW5mb0tpbmQga2luZDsKCiAgU3RyaW5nIGNvdmVyYWdlSWQ7CiAgaW50IHNpemU7CiAgSW5mbyBwYXJlbnQ7CgogIFN0cmluZyBuYW1lOwoKICAvLy8gSWYgdXNpbmcgZGVmZXJyZWQgbGlicmFyaWVzLCB3aGVyZSB0aGUgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbmZvCiAgLy8vIGlzIGdlbmVyYXRlZC4KICBPdXRwdXRVbml0SW5mbyBvdXRwdXRVbml0OwoKICBCYXNpY0luZm8odGhpcy5raW5kLCB0aGlzLm5hbWUsIHRoaXMub3V0cHV0VW5pdCwgdGhpcy5zaXplLCB0aGlzLmNvdmVyYWdlSWQpOwoKICBCYXNpY0luZm8uaW50ZXJuYWwodGhpcy5raW5kKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyRraW5kICRuYW1lIFskc2l6ZV0nOwp9CgovLy8gSW5mbyBhc3NvY2lhdGVkIHdpdGggZWxlbWVudHMgY29udGFpbmluZyBleGVjdXRhYmxlIGNvZGUgKGxpa2UgZmllbGRzIGFuZAovLy8gbWV0aG9kcykKYWJzdHJhY3QgY2xhc3MgQ29kZUluZm8gaW1wbGVtZW50cyBJbmZvIHsKICAvLy8gSG93IGRvZXMgdGhpcyBmdW5jdGlvbiBvciBmaWVsZCBkZXBlbmQgb24gb3RoZXJzLgogIExpc3Q8RGVwZW5kZW5jeUluZm8+IHVzZXMgPSBbXTsKfQoKLy8vIFRoZSBlbnRpcmUgaW5mb3JtYXRpb24gcHJvZHVjZWQgd2hpbGUgY29tcGlsaW5nIGEgcHJvZ3JhbS4KY2xhc3MgQWxsSW5mbyB7CiAgLy8vIFN1bW1hcnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2dyYW0uCiAgUHJvZ3JhbUluZm8gcHJvZ3JhbTsKCiAgLy8vIEluZm9ybWF0aW9uIGFib3V0IGVhY2ggbGlicmFyeSBwcm9jZXNzZWQgYnkgdGhlIGNvbXBpbGVyLgogIExpc3Q8TGlicmFyeUluZm8+IGxpYnJhcmllcyA9IDxMaWJyYXJ5SW5mbz5bXTsKCiAgLy8vIEluZm9ybWF0aW9uIGFib3V0IGVhY2ggZnVuY3Rpb24gKGluY2x1ZGVzIG1ldGhvZHMgYW5kIGdldHRlcnMgaW4gYW55CiAgLy8vIGxpYnJhcnkpCiAgTGlzdDxGdW5jdGlvbkluZm8+IGZ1bmN0aW9ucyA9IDxGdW5jdGlvbkluZm8+W107CgogIC8vLyBJbmZvcm1hdGlvbiBhYm91dCB0eXBlIGRlZnMgaW4gdGhlIHByb2dyYW0uCiAgTGlzdDxUeXBlZGVmSW5mbz4gdHlwZWRlZnMgPSA8VHlwZWRlZkluZm8+W107CgogIC8vLyBJbmZvcm1hdGlvbiBhYm91dCBlYWNoIGNsYXNzIChpbiBhbnkgbGlicmFyeSkuCiAgTGlzdDxDbGFzc0luZm8+IGNsYXNzZXMgPSA8Q2xhc3NJbmZvPltdOwoKICAvLy8gSW5mb3JtYXRpb24gYWJvdXQgZmllbGRzIChpbiBhbnkgY2xhc3MpLgogIExpc3Q8RmllbGRJbmZvPiBmaWVsZHMgPSA8RmllbGRJbmZvPltdOwoKICAvLy8gSW5mb3JtYXRpb24gYWJvdXQgY29uc3RhbnRzIGFueXdoZXJlIGluIHRoZSBwcm9ncmFtLgogIC8vIFRPRE8oc2lnbXVuZCk6IGV4cGFuZCBkb2NzIGFib3V0IGNhbm9uaWNhbGl6YXRpb24uIFdlIGRvbid0IHB1dCB0aGVzZQogIC8vIGluc2lkZSBsaWJyYXJ5IGJlY2F1c2UgYSBzaW5nbGUgY29uc3RhbnQgY2FuIGJlIHVzZWQgaW4gbW9yZSB0aGFuIG9uZSBsaWIsCiAgLy8gYW5kIHdlJ2xsIGluY2x1ZGUgaXQgb25seSBvbmNlIGluIHRoZSBvdXRwdXQuCiAgTGlzdDxDb25zdGFudEluZm8+IGNvbnN0YW50cyA9IDxDb25zdGFudEluZm8+W107CgogIC8vLyBJbmZvcm1hdGlvbiBhYm91dCBjbG9zdXJlcyBhbnl3aGVyZSBpbiB0aGUgcHJvZ3JhbS4KICBMaXN0PENsb3N1cmVJbmZvPiBjbG9zdXJlcyA9IDxDbG9zdXJlSW5mbz5bXTsKCiAgLy8vIEluZm9ybWF0aW9uIGFib3V0IG91dHB1dCB1bml0cyAoc2hvdWxkIGJlIGp1c3Qgb25lIGVudHJ5IGlmIG5vdCB1c2luZwogIC8vLyBkZWZlcnJlZCBsb2FkaW5nKS4KICBMaXN0PE91dHB1dFVuaXRJbmZvPiBvdXRwdXRVbml0cyA9IDxPdXRwdXRVbml0SW5mbz5bXTsKCiAgLy8vIERldGFpbHMgYWJvdXQgYWxsIGRlZmVycmVkIGltcG9ydHMgYW5kIHdoYXQgZmlsZXMgd291bGQgYmUgbG9hZGVkIHdoZW4gdGhlCiAgLy8vIGltcG9ydCBpcyByZXNvbHZlZC4KICAvLyBUT0RPKHNpZ211bmQpOiB1c2UgYSBkaWZmZXJlbnQgZm9ybWF0IGZvciBkdW1wLWluZm8uIFRoaXMgY3VycmVudGx5IGVtaXRzCiAgLy8gdGhlIHNhbWUgbWFwIHRoYXQgaXMgY3JlYXRlZCBmb3IgdGhlIGAtLWRlZmVycmVkLW1hcGAgZmxhZy4KICBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBkeW5hbWljPj4gZGVmZXJyZWRGaWxlczsKCiAgLy8vIEEgbmV3IHJlcHJlc2VudGF0aW9uIG9mIGRlcGVuZGVuY2llcyBmcm9tIG9uZSBpbmZvIHRvIGFub3RoZXIuIEFuIGVudHJ5IGluCiAgLy8vIHRoaXMgbWFwIGluZGljYXRlcyB0aGF0IGFuIFtJbmZvXSBkZXBlbmRzIG9uIGFub3RoZXIgKGUuZy4gYSBmdW5jdGlvbgogIC8vLyBpbnZva2VzIGFub3RoZXIpLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBkYXRhIGluIHRoaXMgZmllbGQgbWlnaHQgbm90IGJlCiAgLy8vIGFjY3VyYXRlIHlldCAodGhpcyBpcyB3b3JrIGluIHByb2dyZXNzKS4KICBNYXA8SW5mbywgTGlzdDxJbmZvPj4gZGVwZW5kZW5jaWVzID0ge307CgogIC8vLyBNYWpvciB2ZXJzaW9uIGluZGljYXRpbmcgYnJlYWtpbmcgY2hhbmdlcyBpbiB0aGUgZm9ybWF0LiBBIG5ldyB2ZXJzaW9uCiAgLy8vIG1lYW5zIHRoYXQgYW4gb2xkIGRlc2VyaWFsaXphdGlvbiBhbGdvcml0aG0gd2lsbCBub3Qgd29yayB3aXRoIHRoZSBuZXcKICAvLy8gZm9ybWF0LgogIGZpbmFsIGludCB2ZXJzaW9uID0gNjsKCiAgLy8vIE1pbm9yIHZlcnNpb24gaW5kaWNhdGluZyBub24tYnJlYWtpbmcgY2hhbmdlcyBpbiB0aGUgZm9ybWF0LiBBIGNoYW5nZSBpbgogIC8vLyB0aGlzIHZlcnNpb24gbnVtYmVyIG1lYW5zIHRoYXQgdGhlIGpzb24gcGFyc2luZyBpbiB0aGlzIGxpYnJhcnkgZnJvbSBhCiAgLy8vIHByZXZpb3VzIHdpbGwgY29udGludWUgdG8gd29yayBhZnRlciB0aGUgY2hhbmdlLiBUaGlzIGlzIHR5cGljYWxseQogIC8vLyBpbmNyZWFzZWQgd2hlbiBhZGRpbmcgbmV3IGVudHJpZXMgdG8gdGhlIGZpbGUgZm9ybWF0LgogIC8vIE5vdGU6IHRoZSBkdW1wLWluZm8udmlld2VyIGFwcCB3YXMgd3JpdHRlbiB1c2luZyBhIGpzb24gcGFyc2VyIHZlcnNpb24gMy4yLgogIGZpbmFsIGludCBtaW5vclZlcnNpb24gPSAwOwoKICBBbGxJbmZvKCk7CgogIFQgYWNjZXB0PFQ+KEluZm9WaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRBbGwodGhpcyk7Cn0KCmNsYXNzIFByb2dyYW1JbmZvIHsKICBGdW5jdGlvbkluZm8gZW50cnlwb2ludDsKICBpbnQgc2l6ZTsKICBTdHJpbmcgZGFydDJqc1ZlcnNpb247CiAgRGF0ZVRpbWUgY29tcGlsYXRpb25Nb21lbnQ7CiAgRHVyYXRpb24gY29tcGlsYXRpb25EdXJhdGlvbjsKICBEdXJhdGlvbiB0b0pzb25EdXJhdGlvbjsKICBEdXJhdGlvbiBkdW1wSW5mb0R1cmF0aW9uOwoKICAvLy8gYHRydWVgIGlmIGBub1N1Y2hNZXRob2RgIGlzIHVzZWQuCiAgYm9vbCBub1N1Y2hNZXRob2RFbmFibGVkOwoKICAvLy8gYHRydWVgIGlmIGBPYmplY3QucnVudGltZVR5cGVgIGlzIHVzZWQuCiAgYm9vbCBpc1J1bnRpbWVUeXBlVXNlZDsKCiAgLy8vIGB0cnVlYCBpZiB0aGUgYGRhcnQ6aXNvbGF0ZWAgbGlicmFyeSBpcyBpbiB1c2UuCiAgYm9vbCBpc0lzb2xhdGVJblVzZTsKCiAgLy8vIGB0cnVlYCBpZiBgRnVuY3Rpb24uYXBwbHlgIGlzIHVzZWQuCiAgYm9vbCBpc0Z1bmN0aW9uQXBwbHlVc2VkOwoKICAvLy8gYHRydWVgIGlmIGBkYXJ0Om1pcnJvcnNgIGZlYXR1cmVzIGFyZSB1c2VkLgogIGJvb2wgaXNNaXJyb3JzVXNlZDsKCiAgYm9vbCBtaW5pZmllZDsKCiAgUHJvZ3JhbUluZm8oCiAgICAgIHt0aGlzLmVudHJ5cG9pbnQsCiAgICAgIHRoaXMuc2l6ZSwKICAgICAgdGhpcy5kYXJ0MmpzVmVyc2lvbiwKICAgICAgdGhpcy5jb21waWxhdGlvbk1vbWVudCwKICAgICAgdGhpcy5jb21waWxhdGlvbkR1cmF0aW9uLAogICAgICB0aGlzLnRvSnNvbkR1cmF0aW9uLAogICAgICB0aGlzLmR1bXBJbmZvRHVyYXRpb24sCiAgICAgIHRoaXMubm9TdWNoTWV0aG9kRW5hYmxlZCwKICAgICAgdGhpcy5pc1J1bnRpbWVUeXBlVXNlZCwKICAgICAgdGhpcy5pc0lzb2xhdGVJblVzZSwKICAgICAgdGhpcy5pc0Z1bmN0aW9uQXBwbHlVc2VkLAogICAgICB0aGlzLmlzTWlycm9yc1VzZWQsCiAgICAgIHRoaXMubWluaWZpZWR9KTsKCiAgVCBhY2NlcHQ8VD4oSW5mb1Zpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFByb2dyYW0odGhpcyk7Cn0KCi8vLyBJbmZvIGFzc29jaWF0ZWQgd2l0aCBhIGxpYnJhcnkgZWxlbWVudC4KY2xhc3MgTGlicmFyeUluZm8gZXh0ZW5kcyBCYXNpY0luZm8gewogIC8vLyBDYW5vbmljYWwgdXJpIHRoYXQgaWRlbnRpZmllcyB0aGUgbGlicmFyeS4KICBVcmkgdXJpOwoKICAvLy8gVG9wIGxldmVsIGZ1bmN0aW9ucyBkZWZpbmVkIHdpdGhpbiB0aGUgbGlicmFyeS4KICBMaXN0PEZ1bmN0aW9uSW5mbz4gdG9wTGV2ZWxGdW5jdGlvbnMgPSA8RnVuY3Rpb25JbmZvPltdOwoKICAvLy8gVG9wIGxldmVsIGZpZWxkcyBkZWZpbmVkIHdpdGhpbiB0aGUgbGlicmFyeS4KICBMaXN0PEZpZWxkSW5mbz4gdG9wTGV2ZWxWYXJpYWJsZXMgPSA8RmllbGRJbmZvPltdOwoKICAvLy8gQ2xhc3NlcyBkZWZpbmVkIHdpdGhpbiB0aGUgbGlicmFyeS4KICBMaXN0PENsYXNzSW5mbz4gY2xhc3NlcyA9IDxDbGFzc0luZm8+W107CgogIC8vLyBUeXBlZGVmcyBkZWZpbmVkIHdpdGhpbiB0aGUgbGlicmFyeS4KICBMaXN0PFR5cGVkZWZJbmZvPiB0eXBlZGVmcyA9IDxUeXBlZGVmSW5mbz5bXTsKCiAgLy8gVE9ETyhzaWdtdW5kKTogYWRkIGhlcmUgYSBsaXN0IG9mIHBhcnRzLiBUaGF0IGNhbiBoZWxwIHVzIGltcHJvdmUgaG93IHdlCiAgLy8gZW5jb2RlIHNvdXJjZS1zcGFuIGluZm9ybWF0aW9uIGluIG1ldHJpY3MgKHJhdGhlciB0aGFuIGluY2x1ZGUgdGhlIHVyaSBvbgogIC8vIGVhY2ggZnVuY3Rpb24sIGluY2x1ZGUgYW4gaW5kZXggaW50byB0aGlzIGxpc3QpLgoKICAvLy8gV2hldGhlciB0aGVyZSBpcyBhbnkgaW5mb3JtYXRpb24gcmVjb3JkZWQgZm9yIHRoaXMgbGlicmFyeS4KICBib29sIGdldCBpc0VtcHR5ID0+CiAgICAgIHRvcExldmVsRnVuY3Rpb25zLmlzRW1wdHkgJiYgdG9wTGV2ZWxWYXJpYWJsZXMuaXNFbXB0eSAmJiBjbGFzc2VzLmlzRW1wdHk7CgogIExpYnJhcnlJbmZvKFN0cmluZyBuYW1lLCB0aGlzLnVyaSwgT3V0cHV0VW5pdEluZm8gb3V0cHV0VW5pdCwgaW50IHNpemUpCiAgICAgIDogc3VwZXIoSW5mb0tpbmQubGlicmFyeSwgbmFtZSwgb3V0cHV0VW5pdCwgc2l6ZSwgbnVsbCk7CgogIExpYnJhcnlJbmZvLmludGVybmFsKCkgOiBzdXBlci5pbnRlcm5hbChJbmZvS2luZC5saWJyYXJ5KTsKCiAgVCBhY2NlcHQ8VD4oSW5mb1Zpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdExpYnJhcnkodGhpcyk7Cn0KCi8vLyBJbmZvcm1hdGlvbiBhYm91dCBhbiBvdXRwdXQgdW5pdC4gTm9ybWFsbHkgdGhlcmUgaXMganVzdCBvbmUgZm9yIHRoZSBlbnRpcmUKLy8vIHByb2dyYW0gdW5sZXNzIHRoZSBhcHBsaWNhdGlvbiB1c2VzIGRlZmVycmVkIGltcG9ydHMsIGluIHdoaWNoIGNhc2UgdGhlcmUKLy8vIHdvdWxkIGJlIGFuIGFkZGl0aW9uYWwgb3V0cHV0IHVuaXQgcGVyIGRlZmVycmVkIGNodW5rLgpjbGFzcyBPdXRwdXRVbml0SW5mbyBleHRlbmRzIEJhc2ljSW5mbyB7CiAgU3RyaW5nIGZpbGVuYW1lOwoKICAvLy8gVGhlIGRlZmVycmVkIGltcG9ydHMgdGhhdCB3aWxsIGxvYWQgdGhpcyBvdXRwdXQgdW5pdC4KICBMaXN0PFN0cmluZz4gaW1wb3J0cyA9IDxTdHJpbmc+W107CgogIE91dHB1dFVuaXRJbmZvKHRoaXMuZmlsZW5hbWUsIFN0cmluZyBuYW1lLCBpbnQgc2l6ZSkKICAgICAgOiBzdXBlcihJbmZvS2luZC5vdXRwdXRVbml0LCBuYW1lLCBudWxsLCBzaXplLCBudWxsKTsKCiAgT3V0cHV0VW5pdEluZm8uaW50ZXJuYWwoKSA6IHN1cGVyLmludGVybmFsKEluZm9LaW5kLm91dHB1dFVuaXQpOwoKICBUIGFjY2VwdDxUPihJbmZvVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0T3V0cHV0KHRoaXMpOwp9CgovLy8gSW5mb3JtYXRpb24gYWJvdXQgYSBjbGFzcyBlbGVtZW50LgpjbGFzcyBDbGFzc0luZm8gZXh0ZW5kcyBCYXNpY0luZm8gewogIC8vLyBXaGV0aGVyIHRoZSBjbGFzcyBpcyBhYnN0cmFjdC4KICBib29sIGlzQWJzdHJhY3Q7CgogIC8vIFRPRE8oc2lnbXVuZCk6IHNwbGl0IHN0YXRpYyB2cyBpbnN0YW5jZSB2cyBjbG9zdXJlcwogIC8vLyBGdW5jdGlvbnMgKHN0YXRpYyBvciBpbnN0YW5jZSkgZGVmaW5lZCBpbiB0aGUgY2xhc3MuCiAgTGlzdDxGdW5jdGlvbkluZm8+IGZ1bmN0aW9ucyA9IDxGdW5jdGlvbkluZm8+W107CgogIC8vLyBGaWVsZHMgZGVmaW5lZCBpbiB0aGUgY2xhc3MuCiAgLy8gVE9ETyhzaWdtdW5kKTogY3VycmVudGx5IGFwcGVhcnMgdG8gb25seSBiZSBwb3B1bGF0ZWQgd2l0aCBpbnN0YW5jZSBmaWVsZHMsCiAgLy8gYnV0IHRoaXMgc2hvdWxkIGJlIGZpeGVkLgogIExpc3Q8RmllbGRJbmZvPiBmaWVsZHMgPSA8RmllbGRJbmZvPltdOwoKICBDbGFzc0luZm8oCiAgICAgIHtTdHJpbmcgbmFtZSwgdGhpcy5pc0Fic3RyYWN0LCBPdXRwdXRVbml0SW5mbyBvdXRwdXRVbml0LCBpbnQgc2l6ZTogMH0pCiAgICAgIDogc3VwZXIoSW5mb0tpbmQuY2xhenosIG5hbWUsIG91dHB1dFVuaXQsIHNpemUsIG51bGwpOwoKICBDbGFzc0luZm8uaW50ZXJuYWwoKSA6IHN1cGVyLmludGVybmFsKEluZm9LaW5kLmNsYXp6KTsKCiAgVCBhY2NlcHQ8VD4oSW5mb1Zpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdENsYXNzKHRoaXMpOwp9CgovLy8gQSBjb2RlIHNwYW4gb2YgZ2VuZXJhdGVkIGNvZGUuIEEgW0NvZGVTcGFuXSBvYmplY3QgaXMgYXNzb2NpYXRlZCB3aXRoIGEKLy8vIHNpbmdsZSBbQmFzaWNJbmZvXS4gVGhlIG9mZnNldHMgaW4gdGhlIHNwYW4gY29ycmVzcG9uZHMgdG8gb2Zmc2V0cyBvbiB0aGUKLy8vIGZpbGUgb2YgW0Jhc2ljSW5mby5vdXRwdXRVbml0XS4KY2xhc3MgQ29kZVNwYW4gewogIC8vLyBTdGFydCBvZmZzZXQgaW4gdGhlIGdlbmVyYXRlZCBmaWxlLgogIGludCBzdGFydDsKCiAgLy8vIGVuZCBvZmZzZXQgaW4gdGhlIGdlbmVyYXRlZCBmaWxlLgogIGludCBlbmQ7CgogIC8vLyBUaGUgYWN0dWFsIGNvZGUgKG9wdGlvbmFsLCBibGFuayB3aGVuIHVzaW5nIGEgY29tcGFjdCByZXByZXNlbnRhdGlvbiBvZgogIC8vLyB0aGUgZW5jb2RpbmcpLgogIFN0cmluZyB0ZXh0OwoKICBDb2RlU3Bhbih7dGhpcy5zdGFydCwgdGhpcy5lbmQsIHRoaXMudGV4dH0pOwp9CgovLy8gSW5mb3JtYXRpb24gYWJvdXQgYSBjb25zdGFudCB2YWx1ZS4KLy8gVE9ETyhzaWdtdW5kKTogYWRkIGRlcGVuZGVuY3kgZGF0YSBmb3IgQ29uc3RhbnRJbmZvCmNsYXNzIENvbnN0YW50SW5mbyBleHRlbmRzIEJhc2ljSW5mbyB7CiAgLy8vIFRoZSBhY3R1YWwgZ2VuZXJhdGVkIGNvZGUgZm9yIHRoZSBjb25zdGFudC4KICBMaXN0PENvZGVTcGFuPiBjb2RlOwoKICAvLyBUT0RPKHNpZ211bmQpOiBBZGQgY292ZXJhZ2Ugc3VwcG9ydCB0byBjb25zdGFudHM/CiAgQ29uc3RhbnRJbmZvKHtpbnQgc2l6ZTogMCwgdGhpcy5jb2RlLCBPdXRwdXRVbml0SW5mbyBvdXRwdXRVbml0fSkKICAgICAgOiBzdXBlcihJbmZvS2luZC5jb25zdGFudCwgbnVsbCwgb3V0cHV0VW5pdCwgc2l6ZSwgbnVsbCk7CgogIENvbnN0YW50SW5mby5pbnRlcm5hbCgpIDogc3VwZXIuaW50ZXJuYWwoSW5mb0tpbmQuY29uc3RhbnQpOwoKICBUIGFjY2VwdDxUPihJbmZvVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0Q29uc3RhbnQodGhpcyk7Cn0KCi8vLyBJbmZvcm1hdGlvbiBhYm91dCBhIGZpZWxkIGVsZW1lbnQuCmNsYXNzIEZpZWxkSW5mbyBleHRlbmRzIEJhc2ljSW5mbyB3aXRoIENvZGVJbmZvIHsKICAvLy8gVGhlIHR5cGUgb2YgdGhlIGZpZWxkLgogIFN0cmluZyB0eXBlOwoKICAvLy8gVGhlIHR5cGUgaW5mZXJyZWQgYnkgZGFydDJqcydzIHdob2xlIHByb2dyYW0gYW5hbHlzaXMKICBTdHJpbmcgaW5mZXJyZWRUeXBlOwoKICAvLy8gTmVzdGVkIGNsb3N1cmVzIHNlZW4gaW4gdGhlIGZpZWxkIGluaXRpYWxpemVyLgogIExpc3Q8Q2xvc3VyZUluZm8+IGNsb3N1cmVzOwoKICAvLy8gVGhlIGFjdHVhbCBnZW5lcmF0ZWQgY29kZSBmb3IgdGhlIGZpZWxkLgogIExpc3Q8Q29kZVNwYW4+IGNvZGU7CgogIC8vLyBXaGV0aGVyIHRoaXMgY29ycmVzcG9uZHMgdG8gYSBjb25zdCBmaWVsZCBkZWNsYXJhdGlvbi4KICBib29sIGlzQ29uc3Q7CgogIC8vLyBXaGVuIFtpc0NvbnN0XSBpcyB0cnVlLCB0aGUgY29uc3RhbnQgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbi4KICBDb25zdGFudEluZm8gaW5pdGlhbGl6ZXI7CgogIEZpZWxkSW5mbygKICAgICAge1N0cmluZyBuYW1lLAogICAgICBTdHJpbmcgY292ZXJhZ2VJZCwKICAgICAgaW50IHNpemU6IDAsCiAgICAgIHRoaXMudHlwZSwKICAgICAgdGhpcy5pbmZlcnJlZFR5cGUsCiAgICAgIHRoaXMuY2xvc3VyZXMsCiAgICAgIHRoaXMuY29kZSwKICAgICAgT3V0cHV0VW5pdEluZm8gb3V0cHV0VW5pdCwKICAgICAgdGhpcy5pc0NvbnN0fSkKICAgICAgOiBzdXBlcihJbmZvS2luZC5maWVsZCwgbmFtZSwgb3V0cHV0VW5pdCwgc2l6ZSwgY292ZXJhZ2VJZCk7CgogIEZpZWxkSW5mby5pbnRlcm5hbCgpIDogc3VwZXIuaW50ZXJuYWwoSW5mb0tpbmQuZmllbGQpOwoKICBUIGFjY2VwdDxUPihJbmZvVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0RmllbGQodGhpcyk7Cn0KCi8vLyBJbmZvcm1hdGlvbiBhYm91dCBhIHR5cGVkZWYgZGVjbGFyYXRpb24uCmNsYXNzIFR5cGVkZWZJbmZvIGV4dGVuZHMgQmFzaWNJbmZvIHsKICAvLy8gVGhlIGRlY2xhcmVkIHR5cGUuCiAgU3RyaW5nIHR5cGU7CgogIFR5cGVkZWZJbmZvKFN0cmluZyBuYW1lLCB0aGlzLnR5cGUsIE91dHB1dFVuaXRJbmZvIG91dHB1dFVuaXQpCiAgICAgIDogc3VwZXIoSW5mb0tpbmQudHlwZWRlZiwgbmFtZSwgb3V0cHV0VW5pdCwgMCwgbnVsbCk7CgogIFR5cGVkZWZJbmZvLmludGVybmFsKCkgOiBzdXBlci5pbnRlcm5hbChJbmZvS2luZC50eXBlZGVmKTsKCiAgVCBhY2NlcHQ8VD4oSW5mb1Zpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFR5cGVkZWYodGhpcyk7Cn0KCi8vLyBJbmZvcm1hdGlvbiBhYm91dCBhIGZ1bmN0aW9uIG9yIG1ldGhvZC4KY2xhc3MgRnVuY3Rpb25JbmZvIGV4dGVuZHMgQmFzaWNJbmZvIHdpdGggQ29kZUluZm8gewogIHN0YXRpYyBjb25zdCBpbnQgVE9QX0xFVkVMX0ZVTkNUSU9OX0tJTkQgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgQ0xPU1VSRV9GVU5DVElPTl9LSU5EID0gMTsKICBzdGF0aWMgY29uc3QgaW50IE1FVEhPRF9GVU5DVElPTl9LSU5EID0gMjsKICBzdGF0aWMgY29uc3QgaW50IENPTlNUUlVDVE9SX0ZVTkNUSU9OX0tJTkQgPSAzOwoKICAvLy8gS2luZCBvZiBmdW5jdGlvbiAodG9wLWxldmVsIGZ1bmN0aW9uLCBjbG9zdXJlLCBtZXRob2QsIG9yIGNvbnN0cnVjdG9yKS4KICBpbnQgZnVuY3Rpb25LaW5kOwoKICAvLy8gTW9kaWZpZXJzIGFwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbi4KICBGdW5jdGlvbk1vZGlmaWVycyBtb2RpZmllcnM7CgogIC8vLyBOZXN0ZWQgY2xvc3VyZXMgdGhhdCBhcHBlYXIgd2l0aGluIHRoZSBib2R5IG9mIHRoaXMgZnVuY3Rpb24uCiAgTGlzdDxDbG9zdXJlSW5mbz4gY2xvc3VyZXM7CgogIC8vLyBUaGUgdHlwZSBvZiB0aGlzIGZ1bmN0aW9uLgogIFN0cmluZyB0eXBlOwoKICAvLy8gVGhlIGRlY2xhcmVkIHJldHVybiB0eXBlLgogIFN0cmluZyByZXR1cm5UeXBlOwoKICAvLy8gVGhlIGluZmVycmVkIHJldHVybiB0eXBlLgogIFN0cmluZyBpbmZlcnJlZFJldHVyblR5cGU7CgogIC8vLyBOYW1lIGFuZCB0eXBlIGluZm9ybWF0aW9uIGZvciBlYWNoIHBhcmFtZXRlci4KICBMaXN0PFBhcmFtZXRlckluZm8+IHBhcmFtZXRlcnM7CgogIC8vLyBTaWRlLWVmZmVjdHMuCiAgLy8gVE9ETyhzaWdtdW5kKTogc2VyaWFsaXplIG1vcmUgcHJlY2lzZWx5LCBub3QganVzdCBhIHN0cmluZyByZXByZXNlbnRhdGlvbi4KICBTdHJpbmcgc2lkZUVmZmVjdHM7CgogIC8vLyBIb3cgbWFueSBmdW5jdGlvbiBjYWxscyB3ZXJlIGlubGluZWQgaW50byB0aGlzIGZ1bmN0aW9uLgogIGludCBpbmxpbmVkQ291bnQ7CgogIC8vLyBUaGUgYWN0dWFsIGdlbmVyYXRlZCBjb2RlLgogIExpc3Q8Q29kZVNwYW4+IGNvZGU7CgogIEZ1bmN0aW9uSW5mbygKICAgICAge1N0cmluZyBuYW1lLAogICAgICBTdHJpbmcgY292ZXJhZ2VJZCwKICAgICAgT3V0cHV0VW5pdEluZm8gb3V0cHV0VW5pdCwKICAgICAgaW50IHNpemU6IDAsCiAgICAgIHRoaXMuZnVuY3Rpb25LaW5kLAogICAgICB0aGlzLm1vZGlmaWVycywKICAgICAgdGhpcy5jbG9zdXJlcywKICAgICAgdGhpcy50eXBlLAogICAgICB0aGlzLnJldHVyblR5cGUsCiAgICAgIHRoaXMuaW5mZXJyZWRSZXR1cm5UeXBlLAogICAgICB0aGlzLnBhcmFtZXRlcnMsCiAgICAgIHRoaXMuc2lkZUVmZmVjdHMsCiAgICAgIHRoaXMuaW5saW5lZENvdW50LAogICAgICB0aGlzLmNvZGV9KQogICAgICA6IHN1cGVyKEluZm9LaW5kLmZ1bmN0aW9uLCBuYW1lLCBvdXRwdXRVbml0LCBzaXplLCBjb3ZlcmFnZUlkKTsKCiAgRnVuY3Rpb25JbmZvLmludGVybmFsKCkgOiBzdXBlci5pbnRlcm5hbChJbmZvS2luZC5mdW5jdGlvbik7CgogIFQgYWNjZXB0PFQ+KEluZm9WaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRGdW5jdGlvbih0aGlzKTsKfQoKLy8vIEluZm9ybWF0aW9uIGFib3V0IGEgY2xvc3VyZSwgYWxzbyBrbm93biBhcyBhIGxvY2FsIGZ1bmN0aW9uLgpjbGFzcyBDbG9zdXJlSW5mbyBleHRlbmRzIEJhc2ljSW5mbyB7CiAgLy8vIFRoZSBmdW5jdGlvbiB0aGF0IGlzIHdyYXBwZWQgYnkgdGhpcyBjbG9zdXJlLgogIEZ1bmN0aW9uSW5mbyBmdW5jdGlvbjsKCiAgQ2xvc3VyZUluZm8oCiAgICAgIHtTdHJpbmcgbmFtZSwgT3V0cHV0VW5pdEluZm8gb3V0cHV0VW5pdCwgaW50IHNpemU6IDAsIHRoaXMuZnVuY3Rpb259KQogICAgICA6IHN1cGVyKEluZm9LaW5kLmNsb3N1cmUsIG5hbWUsIG91dHB1dFVuaXQsIHNpemUsIG51bGwpOwoKICBDbG9zdXJlSW5mby5pbnRlcm5hbCgpIDogc3VwZXIuaW50ZXJuYWwoSW5mb0tpbmQuY2xvc3VyZSk7CgogIFQgYWNjZXB0PFQ+KEluZm9WaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRDbG9zdXJlKHRoaXMpOwp9CgovLy8gSW5mb3JtYXRpb24gYWJvdXQgaG93IGEgZGVwZW5kZW5jeSBpcyB1c2VkLgpjbGFzcyBEZXBlbmRlbmN5SW5mbyB7CiAgLy8vIFRoZSBkZXBlbmRlbmN5LCBlaXRoZXIgYSBGdW5jdGlvbkluZm8gb3IgRmllbGRJbmZvLgogIGZpbmFsIEluZm8gdGFyZ2V0OwoKICAvLy8gRWl0aGVyIGEgc2VsZWN0b3IgbWFzayBpbmRpY2F0aW5nIGhvdyB0aGlzIGlzIHVzZWQsIG9yICdpbmxpbmVkJy4KICAvLyBUT0RPKHNpZ211bmQpOiBzcGxpdCBtYXNrIGludG8gYW4gZW51bSBvciBzb21ldGhpbmcgbW9yZSBwcmVjaXNlIHRvIHJlYWxseQogIC8vIGRlc2NyaWJlIHRoZSBkZXBlbmRlbmNpZXMgaW4gZGV0YWlsLgogIGZpbmFsIFN0cmluZyBtYXNrOwoKICBEZXBlbmRlbmN5SW5mbyh0aGlzLnRhcmdldCwgdGhpcy5tYXNrKTsKfQoKLy8vIE5hbWUgYW5kIHR5cGUgaW5mb3JtYXRpb24gYWJvdXQgYSBmdW5jdGlvbiBwYXJhbWV0ZXIuCmNsYXNzIFBhcmFtZXRlckluZm8gewogIGZpbmFsIFN0cmluZyBuYW1lOwogIGZpbmFsIFN0cmluZyB0eXBlOwogIGZpbmFsIFN0cmluZyBkZWNsYXJlZFR5cGU7CgogIFBhcmFtZXRlckluZm8odGhpcy5uYW1lLCB0aGlzLnR5cGUsIHRoaXMuZGVjbGFyZWRUeXBlKTsKfQoKLy8vIE1vZGlmaWVycyB0aGF0IG1heSBhcHBseSB0byBtZXRob2RzLgpjbGFzcyBGdW5jdGlvbk1vZGlmaWVycyB7CiAgZmluYWwgYm9vbCBpc1N0YXRpYzsKICBmaW5hbCBib29sIGlzQ29uc3Q7CiAgZmluYWwgYm9vbCBpc0ZhY3Rvcnk7CiAgZmluYWwgYm9vbCBpc0V4dGVybmFsOwoKICBGdW5jdGlvbk1vZGlmaWVycygKICAgICAge3RoaXMuaXNTdGF0aWM6IGZhbHNlLAogICAgICB0aGlzLmlzQ29uc3Q6IGZhbHNlLAogICAgICB0aGlzLmlzRmFjdG9yeTogZmFsc2UsCiAgICAgIHRoaXMuaXNFeHRlcm5hbDogZmFsc2V9KTsKfQoKLy8vIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgYGtpbmRgIGZpZWxkIGluIHRoZSBzZXJpYWxpemVkIGluZm9zLgplbnVtIEluZm9LaW5kIHsKICBsaWJyYXJ5LAogIGNsYXp6LAogIGZ1bmN0aW9uLAogIGZpZWxkLAogIGNvbnN0YW50LAogIG91dHB1dFVuaXQsCiAgdHlwZWRlZiwKICBjbG9zdXJlLAp9CgpTdHJpbmcga2luZFRvU3RyaW5nKEluZm9LaW5kIGtpbmQpIHsKICBzd2l0Y2ggKGtpbmQpIHsKICAgIGNhc2UgSW5mb0tpbmQubGlicmFyeToKICAgICAgcmV0dXJuICdsaWJyYXJ5JzsKICAgIGNhc2UgSW5mb0tpbmQuY2xheno6CiAgICAgIHJldHVybiAnY2xhc3MnOwogICAgY2FzZSBJbmZvS2luZC5mdW5jdGlvbjoKICAgICAgcmV0dXJuICdmdW5jdGlvbic7CiAgICBjYXNlIEluZm9LaW5kLmZpZWxkOgogICAgICByZXR1cm4gJ2ZpZWxkJzsKICAgIGNhc2UgSW5mb0tpbmQuY29uc3RhbnQ6CiAgICAgIHJldHVybiAnY29uc3RhbnQnOwogICAgY2FzZSBJbmZvS2luZC5vdXRwdXRVbml0OgogICAgICByZXR1cm4gJ291dHB1dFVuaXQnOwogICAgY2FzZSBJbmZvS2luZC50eXBlZGVmOgogICAgICByZXR1cm4gJ3R5cGVkZWYnOwogICAgY2FzZSBJbmZvS2luZC5jbG9zdXJlOgogICAgICByZXR1cm4gJ2Nsb3N1cmUnOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIG51bGw7CiAgfQp9CgpJbmZvS2luZCBraW5kRnJvbVN0cmluZyhTdHJpbmcga2luZCkgewogIHN3aXRjaCAoa2luZCkgewogICAgY2FzZSAnbGlicmFyeSc6CiAgICAgIHJldHVybiBJbmZvS2luZC5saWJyYXJ5OwogICAgY2FzZSAnY2xhc3MnOgogICAgICByZXR1cm4gSW5mb0tpbmQuY2xheno7CiAgICBjYXNlICdmdW5jdGlvbic6CiAgICAgIHJldHVybiBJbmZvS2luZC5mdW5jdGlvbjsKICAgIGNhc2UgJ2ZpZWxkJzoKICAgICAgcmV0dXJuIEluZm9LaW5kLmZpZWxkOwogICAgY2FzZSAnY29uc3RhbnQnOgogICAgICByZXR1cm4gSW5mb0tpbmQuY29uc3RhbnQ7CiAgICBjYXNlICdvdXRwdXRVbml0JzoKICAgICAgcmV0dXJuIEluZm9LaW5kLm91dHB1dFVuaXQ7CiAgICBjYXNlICd0eXBlZGVmJzoKICAgICAgcmV0dXJuIEluZm9LaW5kLnR5cGVkZWY7CiAgICBjYXNlICdjbG9zdXJlJzoKICAgICAgcmV0dXJuIEluZm9LaW5kLmNsb3N1cmU7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gbnVsbDsKICB9Cn0KCi8vLyBBIHNpbXBsZSB2aXNpdG9yIGZvciBpbmZvcm1hdGlvbiBwcm9kdWNlZCBieSB0aGUgZGFydDJqcyBjb21waWxlci4KYWJzdHJhY3QgY2xhc3MgSW5mb1Zpc2l0b3I8VD4gewogIFQgdmlzaXRBbGwoQWxsSW5mbyBpbmZvKTsKICBUIHZpc2l0UHJvZ3JhbShQcm9ncmFtSW5mbyBpbmZvKTsKICBUIHZpc2l0TGlicmFyeShMaWJyYXJ5SW5mbyBpbmZvKTsKICBUIHZpc2l0Q2xhc3MoQ2xhc3NJbmZvIGluZm8pOwogIFQgdmlzaXRGaWVsZChGaWVsZEluZm8gaW5mbyk7CiAgVCB2aXNpdENvbnN0YW50KENvbnN0YW50SW5mbyBpbmZvKTsKICBUIHZpc2l0RnVuY3Rpb24oRnVuY3Rpb25JbmZvIGluZm8pOwogIFQgdmlzaXRUeXBlZGVmKFR5cGVkZWZJbmZvIGluZm8pOwogIFQgdmlzaXRDbG9zdXJlKENsb3N1cmVJbmZvIGluZm8pOwogIFQgdmlzaXRPdXRwdXQoT3V0cHV0VW5pdEluZm8gaW5mbyk7Cn0KCi8vLyBBIHZpc2l0b3IgdGhhdCByZWN1cnNpdmVseSB3YWxrcyBlYWNoIHBvcnRpb24gb2YgdGhlIHByb2dyYW0uIEJlY2F1c2UgdGhlCi8vLyBpbmZvIHJlcHJlc2VudGF0aW9uIGlzIHJlZHVuZGFudCwgdGhpcyB2aXNpdG9yIG9ubHkgd2Fsa3MgdGhlIHN0cnVjdHVyZSBvZgovLy8gdGhlIHByb2dyYW0gYW5kIHNraXBzIHNvbWUgcmVkdW5kYW50IGxpbmtzLiBGb3IgZXhhbXBsZSwgZXZlbiB0aG91Z2gKLy8vIHZpc2l0QWxsIGNvbnRhaW5zIHJlZmVyZW5jZXMgdG8gZnVuY3Rpb25zLCB0aGlzIHZpc2l0b3Igb25seSByZWN1cnNlcyB0bwovLy8gdmlzaXQgbGlicmFyaWVzLCB0aGVuIGZyb20gZWFjaCBsaWJyYXJ5IHdlIHZpc2l0IGZ1bmN0aW9ucyBhbmQgY2xhc3NlcywgYW5kCi8vLyBzbyBvbi4KY2xhc3MgUmVjdXJzaXZlSW5mb1Zpc2l0b3IgZXh0ZW5kcyBJbmZvVmlzaXRvcjxOdWxsPiB7CiAgdmlzaXRBbGwoQWxsSW5mbyBpbmZvKSB7CiAgICAvLyBOb3RlOiB3ZSBkb24ndCB2aXNpdCBmdW5jdGlvbnMsIGZpZWxkcywgY2xhc3NlcywgYW5kIHR5cGVkZWZzIGJlY2F1c2UKICAgIC8vIHRoZXkgYXJlIHJlYWNoYWJsZSBmcm9tIHRoZSBsaWJyYXJ5IGluZm8uCiAgICBpbmZvLmxpYnJhcmllcy5mb3JFYWNoKHZpc2l0TGlicmFyeSk7CiAgICBpbmZvLmNvbnN0YW50cy5mb3JFYWNoKHZpc2l0Q29uc3RhbnQpOwogIH0KCiAgdmlzaXRQcm9ncmFtKFByb2dyYW1JbmZvIGluZm8pIHt9CgogIHZpc2l0TGlicmFyeShMaWJyYXJ5SW5mbyBpbmZvKSB7CiAgICBpbmZvLnRvcExldmVsRnVuY3Rpb25zLmZvckVhY2godmlzaXRGdW5jdGlvbik7CiAgICBpbmZvLnRvcExldmVsVmFyaWFibGVzLmZvckVhY2godmlzaXRGaWVsZCk7CiAgICBpbmZvLmNsYXNzZXMuZm9yRWFjaCh2aXNpdENsYXNzKTsKICAgIGluZm8udHlwZWRlZnMuZm9yRWFjaCh2aXNpdFR5cGVkZWYpOwogIH0KCiAgdmlzaXRDbGFzcyhDbGFzc0luZm8gaW5mbykgewogICAgaW5mby5mdW5jdGlvbnMuZm9yRWFjaCh2aXNpdEZ1bmN0aW9uKTsKICAgIGluZm8uZmllbGRzLmZvckVhY2godmlzaXRGaWVsZCk7CiAgfQoKICB2aXNpdEZpZWxkKEZpZWxkSW5mbyBpbmZvKSB7CiAgICBpbmZvLmNsb3N1cmVzLmZvckVhY2godmlzaXRDbG9zdXJlKTsKICB9CgogIHZpc2l0Q29uc3RhbnQoQ29uc3RhbnRJbmZvIGluZm8pIHt9CgogIHZpc2l0RnVuY3Rpb24oRnVuY3Rpb25JbmZvIGluZm8pIHsKICAgIGluZm8uY2xvc3VyZXMuZm9yRWFjaCh2aXNpdENsb3N1cmUpOwogIH0KCiAgdmlzaXRUeXBlZGVmKFR5cGVkZWZJbmZvIGluZm8pIHt9CiAgdmlzaXRPdXRwdXQoT3V0cHV0VW5pdEluZm8gaW5mbykge30KICB2aXNpdENsb3N1cmUoQ2xvc3VyZUluZm8gaW5mbykgewogICAgdmlzaXRGdW5jdGlvbihpbmZvLmZ1bmN0aW9uKTsKICB9Cn0KgicATk48AUMbAUxNKRYxFQE1DwFJRToVAUYMASUPAScCATccNysXARUMDwEPAU8UHQFQASEBLgIBTg0qOCICAT8QLRcBQDEBSw8zATIwATUrAS8qATtLUDMzATowAUwZOQFRGk9BMwFRTE0vKwFNTQ4ZAU9NSTxRHgENAUECARQbDBkeIBsdASgcAS4aATYXASocATIWAREBDxgRGx4gGx0gHhsgGhcBRQIBLCYxCwE2OwEzNQEqKwErMAFOTzYBQhZRAUo/AT0BRQIBUE47KRMBPCUBNzwBQwFEAgEnJCUTATk7MwEjUR8qAQ1OPQE5AUMCAUxOJBEqDQEoCwFOFQ8BLwIBKDcnMhcBN0RAAT8BRgIBJzIdDwE8FwE1HgEvFwE9EAFDHAENFBkTERkVESEVQwE5AUMCAS0mGQ8BQTwBPQFFAgEsNTAuLTIBThQBKh8BRB4BIQ8BIBUBIB0BNCIBFFAWAT8UASEXARAUGSETGRYVERcfFxgZEkYBPwFGAgFBJjQZAQ9MPwE9AUUCATAXOhUBSFAqFQEqAgE6FhUVHQE6AgEpGhcWGBkBFR0bHSACAUEQCwkMCQwOCwsCASUSGxgZFhwZGRYcGR4bGxgbGA0TBAIBJxIUHxIdFSASHRUgFyIUHxQfDRMEAgFHIBwkJCAgJiYkJCYCAU5PSU1QCzcbTTEqKwQBJAEjMzAmKQQBHyslBAEfKQQBJgElKQQBJCYjIgQCAR5wYWNrYWdlOmRhcnQyanNfaW5mby9pbmZvLmRhcnQ+c2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2RhcnQyanNfaW5mby9saWIvanNvbl9pbmZvX2NvZGVjLmRhcnTAAE7ZLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBDb252ZXJ0ZXJzIGFuZCBjb2RlY3MgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBKU09OIGFuZCBbSW5mb10gY2xhc3Nlcy4KCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwoKaW1wb3J0ICdwYWNrYWdlOmNvbGxlY3Rpb24vY29sbGVjdGlvbi5kYXJ0JzsKaW1wb3J0ICdzcmMvdXRpbC5kYXJ0JzsKaW1wb3J0ICdpbmZvLmRhcnQnOwoKTGlzdDxTdHJpbmc+IF90b1NvcnRlZFNlcmlhbGl6ZWRJZHMoCiAgICAgICAgSXRlcmFibGU8SW5mbz4gaW5mb3MsIElkIEZ1bmN0aW9uKEluZm8pIGdldElkKSA9PgogICAgaW5mb3MubWFwKChpKSA9PiBnZXRJZChpKS5zZXJpYWxpemVkSWQpLnRvTGlzdCgpLi5zb3J0KGNvbXBhcmVOYXR1cmFsKTsKCi8vIFRPRE8oc2lnbXVuZCk6IGFkZCB1bml0IHRlc3RzLgpjbGFzcyBKc29uVG9BbGxJbmZvQ29udmVydGVyIGV4dGVuZHMgQ29udmVydGVyPE1hcDxTdHJpbmcsIGR5bmFtaWM+LCBBbGxJbmZvPiB7CiAgLy8gVXNpbmcgYE1hc2hNYXBgIGhlcmUgYmVjYXVzZSBpdCdzIGZhc3RlciB0aGFuIHRoZSBkZWZhdWx0IGBMaW5rZWRIYXNoTWFwYC4KICBmaW5hbCBNYXA8U3RyaW5nLCBJbmZvPiByZWdpc3RyeSA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW5mbz4oKTsKCiAgQWxsSW5mbyBjb252ZXJ0KE1hcDxTdHJpbmcsIGR5bmFtaWM+IGpzb24pIHsKICAgIHJlZ2lzdHJ5LmNsZWFyKCk7CgogICAgdmFyIHJlc3VsdCA9IG5ldyBBbGxJbmZvKCk7CiAgICB2YXIgZWxlbWVudHMgPSBqc29uWydlbGVtZW50cyddOwogICAgLy8gVE9ETyhzcmF3bGlucyk6IFNpbmNlIG9ubHkgdGhlIE1hcCB2YWx1ZXMgYXJlIGJlaW5nIGV4dHJhY3RlZCBiZWxvdywKICAgIC8vIHJlcGxhY2UgYGFzYCB3aXRoIGBjYXN0YCB3aGVuIGBjYXN0YCBiZWNvbWVzIGF2YWlsYWJsZSBpbiBEYXJ0IDIuMDoKICAgIC8vCiAgICAvLyAgICAgLmFkZEFsbChlbGVtZW50c1snbGlicmFyeSddLnZhbHVlcy5jYXN0PE1hcD4oKS5tYXAocGFyc2VMaWJyYXJ5KSk7CiAgICByZXN1bHQubGlicmFyaWVzLmFkZEFsbCgKICAgICAgICAoZWxlbWVudHNbJ2xpYnJhcnknXSBhcyBNYXApLnZhbHVlcy5tYXAoKGwpID0+IHBhcnNlTGlicmFyeShsKSkpOwogICAgcmVzdWx0LmNsYXNzZXMKICAgICAgICAuYWRkQWxsKChlbGVtZW50c1snY2xhc3MnXSBhcyBNYXApLnZhbHVlcy5tYXAoKGMpID0+IHBhcnNlQ2xhc3MoYykpKTsKICAgIHJlc3VsdC5mdW5jdGlvbnMuYWRkQWxsKAogICAgICAgIChlbGVtZW50c1snZnVuY3Rpb24nXSBhcyBNYXApLnZhbHVlcy5tYXAoKGYpID0+IHBhcnNlRnVuY3Rpb24oZikpKTsKCiAgICAvLyBUT0RPKGhldCk6IFJldmVydCB0aGlzIHdoZW4gdGhlIGRhcnQyanMgd2l0aCB0aGUgbmV3IGNvZGVjIGlzIGluIHN0YWJsZQogICAgaWYgKGVsZW1lbnRzWydjbG9zdXJlJ10gIT0gbnVsbCkgewogICAgICByZXN1bHQuY2xvc3VyZXMuYWRkQWxsKAogICAgICAgICAgKGVsZW1lbnRzWydjbG9zdXJlJ10gYXMgTWFwKS52YWx1ZXMubWFwKChjKSA9PiBwYXJzZUNsb3N1cmUoYykpKTsKICAgIH0KICAgIHJlc3VsdC5maWVsZHMKICAgICAgICAuYWRkQWxsKChlbGVtZW50c1snZmllbGQnXSBhcyBNYXApLnZhbHVlcy5tYXAoKGYpID0+IHBhcnNlRmllbGQoZikpKTsKICAgIHJlc3VsdC50eXBlZGVmcy5hZGRBbGwoCiAgICAgICAgKGVsZW1lbnRzWyd0eXBlZGVmJ10gYXMgTWFwKS52YWx1ZXMubWFwKCh0KSA9PiBwYXJzZVR5cGVkZWYodCkpKTsKICAgIHJlc3VsdC5jb25zdGFudHMuYWRkQWxsKAogICAgICAgIChlbGVtZW50c1snY29uc3RhbnQnXSBhcyBNYXApLnZhbHVlcy5tYXAoKGMpID0+IHBhcnNlQ29uc3RhbnQoYykpKTsKCiAgICBqc29uWydob2xkaW5nJ10uZm9yRWFjaCgoaywgZGVwcykgewogICAgICBDb2RlSW5mbyBzcmMgPSByZWdpc3RyeVtrXTsKICAgICAgYXNzZXJ0KHNyYyAhPSBudWxsKTsKICAgICAgZm9yICh2YXIgZGVwIGluIGRlcHMpIHsKICAgICAgICB2YXIgdGFyZ2V0ID0gcmVnaXN0cnlbZGVwWydpZCddXTsKICAgICAgICBhc3NlcnQodGFyZ2V0ICE9IG51bGwpOwogICAgICAgIHNyYy51c2VzLmFkZChuZXcgRGVwZW5kZW5jeUluZm8odGFyZ2V0LCBkZXBbJ21hc2snXSkpOwogICAgICB9CiAgICB9KTsKCiAgICBqc29uWydkZXBlbmRlbmNpZXMnXT8uZm9yRWFjaCgoU3RyaW5nIGssIGRlcGVuZGVuY2llcykgewogICAgICBMaXN0PFN0cmluZz4gZGVwcyA9IGRlcGVuZGVuY2llczsKICAgICAgcmVzdWx0LmRlcGVuZGVuY2llc1tyZWdpc3RyeVtrXV0gPSBkZXBzLm1hcCgoZCkgPT4gcmVnaXN0cnlbZF0pLnRvTGlzdCgpOwogICAgfSk7CgogICAgcmVzdWx0Lm91dHB1dFVuaXRzCiAgICAgICAgLmFkZEFsbCgoanNvblsnb3V0cHV0VW5pdHMnXSBhcyBMaXN0KS5tYXAoKG8pID0+IHBhcnNlT3V0cHV0VW5pdChvKSkpOwoKICAgIHJlc3VsdC5wcm9ncmFtID0gcGFyc2VQcm9ncmFtKGpzb25bJ3Byb2dyYW0nXSk7CgogICAgaWYgKGpzb25bJ2RlZmVycmVkRmlsZXMnXSAhPSBudWxsKSB7CiAgICAgIGZpbmFsIGRlZmVycmVkRmlsZXNNYXAgPQogICAgICAgICAgKGpzb25bJ2RlZmVycmVkRmlsZXMnXSBhcyBNYXApLmNhc3Q8U3RyaW5nLCBNYXA8U3RyaW5nLCBkeW5hbWljPj4oKTsKICAgICAgZm9yIChmaW5hbCBsaWJyYXJ5IGluIGRlZmVycmVkRmlsZXNNYXAudmFsdWVzKSB7CiAgICAgICAgaWYgKGxpYnJhcnlbJ2ltcG9ydHMnXSAhPSBudWxsKSB7CiAgICAgICAgICAvLyBUaGUgaW1wb3J0TWFwIG5lZWRzIHRvIGJlIHR5cGVkIGFzIDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4sIGJ1dCB0aGUKICAgICAgICAgIC8vIGpzb24gcGFyc2VyIHByb2R1Y2VzIDxTdHJpbmcsIGR5bmFtaWM+LgogICAgICAgICAgZmluYWwgaW1wb3J0TWFwID0gbGlicmFyeVsnaW1wb3J0cyddIGFzIE1hcDxTdHJpbmcsIGR5bmFtaWM+OwogICAgICAgICAgaW1wb3J0TWFwLmZvckVhY2goKHByZWZpeCwgZmlsZXMpIHsKICAgICAgICAgICAgaW1wb3J0TWFwW3ByZWZpeF0gPSAoZmlsZXMgYXMgTGlzdDxkeW5hbWljPikuY2FzdDxTdHJpbmc+KCk7CiAgICAgICAgICB9KTsKICAgICAgICAgIGxpYnJhcnlbJ2ltcG9ydHMnXSA9IGltcG9ydE1hcC5jYXN0PFN0cmluZywgTGlzdDxTdHJpbmc+PigpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXN1bHQuZGVmZXJyZWRGaWxlcyA9IGRlZmVycmVkRmlsZXNNYXA7CiAgICB9CgogICAgLy8gdG9kbzogdmVyc2lvbiwgZXRjCiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgT3V0cHV0VW5pdEluZm8gcGFyc2VPdXRwdXRVbml0KE1hcCBqc29uKSB7CiAgICBPdXRwdXRVbml0SW5mbyByZXN1bHQgPSBwYXJzZUlkKGpzb25bJ2lkJ10pOwogICAgcmVzdWx0CiAgICAgIC4uZmlsZW5hbWUgPSBqc29uWydmaWxlbmFtZSddCiAgICAgIC4ubmFtZSA9IGpzb25bJ25hbWUnXQogICAgICAuLnNpemUgPSBqc29uWydzaXplJ107CiAgICByZXN1bHQuaW1wb3J0cwogICAgICAgIC5hZGRBbGwoKGpzb25bJ2ltcG9ydHMnXSBhcyBMaXN0KS5tYXAoKHMpID0+IHMgYXMgU3RyaW5nKSA/PyBjb25zdCBbXSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgTGlicmFyeUluZm8gcGFyc2VMaWJyYXJ5KE1hcCBqc29uKSB7CiAgICBMaWJyYXJ5SW5mbyByZXN1bHQgPSBwYXJzZUlkKGpzb25bJ2lkJ10pOwogICAgcmVzdWx0CiAgICAgIC4ubmFtZSA9IGpzb25bJ25hbWUnXQogICAgICAuLnVyaSA9IFVyaS5wYXJzZShqc29uWydjYW5vbmljYWxVcmknXSkKICAgICAgLi5vdXRwdXRVbml0ID0gcGFyc2VJZChqc29uWydvdXRwdXRVbml0J10pCiAgICAgIC4uc2l6ZSA9IGpzb25bJ3NpemUnXTsKICAgIGZvciAodmFyIGNoaWxkIGluIGpzb25bJ2NoaWxkcmVuJ10ubWFwKHBhcnNlSWQpKSB7CiAgICAgIGlmIChjaGlsZCBpcyBGdW5jdGlvbkluZm8pIHsKICAgICAgICByZXN1bHQudG9wTGV2ZWxGdW5jdGlvbnMuYWRkKGNoaWxkKTsKICAgICAgfSBlbHNlIGlmIChjaGlsZCBpcyBGaWVsZEluZm8pIHsKICAgICAgICByZXN1bHQudG9wTGV2ZWxWYXJpYWJsZXMuYWRkKGNoaWxkKTsKICAgICAgfSBlbHNlIGlmIChjaGlsZCBpcyBDbGFzc0luZm8pIHsKICAgICAgICByZXN1bHQuY2xhc3Nlcy5hZGQoY2hpbGQpOwogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydChjaGlsZCBpcyBUeXBlZGVmSW5mbyk7CiAgICAgICAgcmVzdWx0LnR5cGVkZWZzLmFkZChjaGlsZCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBDbGFzc0luZm8gcGFyc2VDbGFzcyhNYXAganNvbikgewogICAgQ2xhc3NJbmZvIHJlc3VsdCA9IHBhcnNlSWQoanNvblsnaWQnXSk7CiAgICByZXN1bHQKICAgICAgLi5uYW1lID0ganNvblsnbmFtZSddCiAgICAgIC4ucGFyZW50ID0gcGFyc2VJZChqc29uWydwYXJlbnQnXSkKICAgICAgLi5vdXRwdXRVbml0ID0gcGFyc2VJZChqc29uWydvdXRwdXRVbml0J10pCiAgICAgIC4uc2l6ZSA9IGpzb25bJ3NpemUnXQogICAgICAuLmlzQWJzdHJhY3QgPSBqc29uWydtb2RpZmllcnMnXVsnYWJzdHJhY3QnXSA9PSB0cnVlOwogICAgYXNzZXJ0KHJlc3VsdCBpcyBDbGFzc0luZm8pOwogICAgZm9yICh2YXIgY2hpbGQgaW4ganNvblsnY2hpbGRyZW4nXS5tYXAocGFyc2VJZCkpIHsKICAgICAgaWYgKGNoaWxkIGlzIEZ1bmN0aW9uSW5mbykgewogICAgICAgIHJlc3VsdC5mdW5jdGlvbnMuYWRkKGNoaWxkKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQoY2hpbGQgaXMgRmllbGRJbmZvKTsKICAgICAgICByZXN1bHQuZmllbGRzLmFkZChjaGlsZCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBGaWVsZEluZm8gcGFyc2VGaWVsZChNYXAganNvbikgewogICAgRmllbGRJbmZvIHJlc3VsdCA9IHBhcnNlSWQoanNvblsnaWQnXSk7CiAgICByZXR1cm4gcmVzdWx0CiAgICAgIC4ubmFtZSA9IGpzb25bJ25hbWUnXQogICAgICAuLnBhcmVudCA9IHBhcnNlSWQoanNvblsncGFyZW50J10pCiAgICAgIC4uY292ZXJhZ2VJZCA9IGpzb25bJ2NvdmVyYWdlSWQnXQogICAgICAuLm91dHB1dFVuaXQgPSBwYXJzZUlkKGpzb25bJ291dHB1dFVuaXQnXSkKICAgICAgLi5zaXplID0ganNvblsnc2l6ZSddCiAgICAgIC4udHlwZSA9IGpzb25bJ3R5cGUnXQogICAgICAuLmluZmVycmVkVHlwZSA9IGpzb25bJ2luZmVycmVkVHlwZSddCiAgICAgIC4uY29kZSA9IHBhcnNlQ29kZShqc29uWydjb2RlJ10pCiAgICAgIC4uaXNDb25zdCA9IGpzb25bJ2NvbnN0J10gPz8gZmFsc2UKICAgICAgLi5pbml0aWFsaXplciA9IHBhcnNlSWQoanNvblsnaW5pdGlhbGl6ZXInXSkKICAgICAgLi5jbG9zdXJlcyA9IChqc29uWydjaGlsZHJlbiddIGFzIExpc3QpCiAgICAgICAgICAubWFwPENsb3N1cmVJbmZvPigoYykgPT4gcGFyc2VJZChjKSkKICAgICAgICAgIC50b0xpc3QoKTsKICB9CgogIENvbnN0YW50SW5mbyBwYXJzZUNvbnN0YW50KE1hcCBqc29uKSB7CiAgICBDb25zdGFudEluZm8gcmVzdWx0ID0gcGFyc2VJZChqc29uWydpZCddKTsKICAgIHJldHVybiByZXN1bHQKICAgICAgLi5jb2RlID0gcGFyc2VDb2RlKGpzb25bJ2NvZGUnXSkKICAgICAgLi5zaXplID0ganNvblsnc2l6ZSddCiAgICAgIC4ub3V0cHV0VW5pdCA9IHBhcnNlSWQoanNvblsnb3V0cHV0VW5pdCddKTsKICB9CgogIFR5cGVkZWZJbmZvIHBhcnNlVHlwZWRlZihNYXAganNvbikgewogICAgVHlwZWRlZkluZm8gcmVzdWx0ID0gcGFyc2VJZChqc29uWydpZCddKTsKICAgIHJldHVybiByZXN1bHQKICAgICAgLi5uYW1lID0ganNvblsnbmFtZSddCiAgICAgIC4ucGFyZW50ID0gcGFyc2VJZChqc29uWydwYXJlbnQnXSkKICAgICAgLi50eXBlID0ganNvblsndHlwZSddCiAgICAgIC4uc2l6ZSA9IDA7CiAgfQoKICBQcm9ncmFtSW5mbyBwYXJzZVByb2dyYW0oTWFwIGpzb24pIHsKICAgIHZhciBwcm9ncmFtSW5mbyA9IG5ldyBQcm9ncmFtSW5mbygpCiAgICAgIC4uZW50cnlwb2ludCA9IHBhcnNlSWQoanNvblsnZW50cnlwb2ludCddKQogICAgICAuLnNpemUgPSBqc29uWydzaXplJ10KICAgICAgLi5jb21waWxhdGlvbk1vbWVudCA9IERhdGVUaW1lLnBhcnNlKGpzb25bJ2NvbXBpbGF0aW9uTW9tZW50J10pCiAgICAgIC4uZGFydDJqc1ZlcnNpb24gPSBqc29uWydkYXJ0MmpzVmVyc2lvbiddCiAgICAgIC4ubm9TdWNoTWV0aG9kRW5hYmxlZCA9IGpzb25bJ25vU3VjaE1ldGhvZEVuYWJsZWQnXQogICAgICAuLmlzUnVudGltZVR5cGVVc2VkID0ganNvblsnaXNSdW50aW1lVHlwZVVzZWQnXQogICAgICAuLmlzSXNvbGF0ZUluVXNlID0ganNvblsnaXNJc29sYXRlSW5Vc2UnXQogICAgICAuLmlzRnVuY3Rpb25BcHBseVVzZWQgPSBqc29uWydpc0Z1bmN0aW9uQXBwbHlVc2VkJ10KICAgICAgLi5pc01pcnJvcnNVc2VkID0ganNvblsnaXNNaXJyb3JzVXNlZCddCiAgICAgIC4ubWluaWZpZWQgPSBqc29uWydtaW5pZmllZCddOwoKICAgIC8vIFRPRE8oaGV0KTogUmV2ZXJ0IHRoaXMgd2hlbiB0aGUgZGFydDJqcyB3aXRoIHRoZSBuZXcgY29kZWMgaXMgaW4gc3RhYmxlCiAgICB2YXIgY29tcGlsYXRpb25EdXJhdGlvbiA9IGpzb25bJ2NvbXBpbGF0aW9uRHVyYXRpb24nXTsKICAgIGlmIChjb21waWxhdGlvbkR1cmF0aW9uIGlzIFN0cmluZykgewogICAgICBwcm9ncmFtSW5mby5jb21waWxhdGlvbkR1cmF0aW9uID0gX3BhcnNlRHVyYXRpb24oY29tcGlsYXRpb25EdXJhdGlvbik7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoY29tcGlsYXRpb25EdXJhdGlvbiBpcyBpbnQpOwogICAgICBwcm9ncmFtSW5mby5jb21waWxhdGlvbkR1cmF0aW9uID0KICAgICAgICAgIG5ldyBEdXJhdGlvbihtaWNyb3NlY29uZHM6IGNvbXBpbGF0aW9uRHVyYXRpb24pOwogICAgfQoKICAgIHZhciB0b0pzb25EdXJhdGlvbiA9IGpzb25bJ3RvSnNvbkR1cmF0aW9uJ107CiAgICBpZiAodG9Kc29uRHVyYXRpb24gaXMgU3RyaW5nKSB7CiAgICAgIHByb2dyYW1JbmZvLnRvSnNvbkR1cmF0aW9uID0gX3BhcnNlRHVyYXRpb24odG9Kc29uRHVyYXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KHRvSnNvbkR1cmF0aW9uIGlzIGludCk7CiAgICAgIHByb2dyYW1JbmZvLnRvSnNvbkR1cmF0aW9uID0gbmV3IER1cmF0aW9uKG1pY3Jvc2Vjb25kczogdG9Kc29uRHVyYXRpb24pOwogICAgfQoKICAgIHZhciBkdW1wSW5mb0R1cmF0aW9uID0ganNvblsnZHVtcEluZm9EdXJhdGlvbiddOwogICAgaWYgKGR1bXBJbmZvRHVyYXRpb24gaXMgU3RyaW5nKSB7CiAgICAgIHByb2dyYW1JbmZvLmR1bXBJbmZvRHVyYXRpb24gPSBfcGFyc2VEdXJhdGlvbihkdW1wSW5mb0R1cmF0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChkdW1wSW5mb0R1cmF0aW9uIGlzIGludCk7CiAgICAgIHByb2dyYW1JbmZvLmR1bXBJbmZvRHVyYXRpb24gPQogICAgICAgICAgbmV3IER1cmF0aW9uKG1pY3Jvc2Vjb25kczogZHVtcEluZm9EdXJhdGlvbik7CiAgICB9CgogICAgcmV0dXJuIHByb2dyYW1JbmZvOwogIH0KCiAgLy8vIFBhcnNlIGEgc3RyaW5nIGZvcm1hdHRlZCBhcyAiWFg6WVk6WlouWlpaWloiIGludG8gYSBbRHVyYXRpb25dLgogIER1cmF0aW9uIF9wYXJzZUR1cmF0aW9uKFN0cmluZyBkdXJhdGlvbikgewogICAgaWYgKCFkdXJhdGlvbi5jb250YWlucygnOicpKSB7CiAgICAgIHJldHVybiBuZXcgRHVyYXRpb24obWlsbGlzZWNvbmRzOiBpbnQucGFyc2UoZHVyYXRpb24pKTsKICAgIH0KICAgIHZhciBwYXJ0cyA9IGR1cmF0aW9uLnNwbGl0KCc6Jyk7CiAgICB2YXIgaG91cnMgPSBkb3VibGUucGFyc2UocGFydHNbMF0pOwogICAgdmFyIG1pbnV0ZXMgPSBkb3VibGUucGFyc2UocGFydHNbMV0pOwogICAgdmFyIHNlY29uZHMgPSBkb3VibGUucGFyc2UocGFydHNbMl0pOwogICAgY29uc3Qgc2Vjb25kc0luTWlsbGlzID0gMTAwMDsKICAgIGNvbnN0IG1pbnV0ZXNJbk1pbGxpcyA9IDYwICogc2Vjb25kc0luTWlsbGlzOwogICAgY29uc3QgaG91cnNJbk1pbGxpcyA9IDYwICogbWludXRlc0luTWlsbGlzOwogICAgdmFyIHRvdGFsTWlsbGlzID0gc2Vjb25kc0luTWlsbGlzICogc2Vjb25kcyArCiAgICAgICAgbWludXRlc0luTWlsbGlzICogbWludXRlcyArCiAgICAgICAgaG91cnNJbk1pbGxpcyAqIGhvdXJzOwogICAgcmV0dXJuIG5ldyBEdXJhdGlvbihtaWxsaXNlY29uZHM6IHRvdGFsTWlsbGlzLnJvdW5kKCkpOwogIH0KCiAgRnVuY3Rpb25JbmZvIHBhcnNlRnVuY3Rpb24oTWFwIGpzb24pIHsKICAgIEZ1bmN0aW9uSW5mbyByZXN1bHQgPSBwYXJzZUlkKGpzb25bJ2lkJ10pOwogICAgcmV0dXJuIHJlc3VsdAogICAgICAuLm5hbWUgPSBqc29uWyduYW1lJ10KICAgICAgLi5wYXJlbnQgPSBwYXJzZUlkKGpzb25bJ3BhcmVudCddKQogICAgICAuLmNvdmVyYWdlSWQgPSBqc29uWydjb3ZlcmFnZUlkJ10KICAgICAgLi5vdXRwdXRVbml0ID0gcGFyc2VJZChqc29uWydvdXRwdXRVbml0J10pCiAgICAgIC4uc2l6ZSA9IGpzb25bJ3NpemUnXQogICAgICAuLnR5cGUgPSBqc29uWyd0eXBlJ10KICAgICAgLi5yZXR1cm5UeXBlID0ganNvblsncmV0dXJuVHlwZSddCiAgICAgIC4uaW5mZXJyZWRSZXR1cm5UeXBlID0ganNvblsnaW5mZXJyZWRSZXR1cm5UeXBlJ10KICAgICAgLi5wYXJhbWV0ZXJzID0KICAgICAgICAgIChqc29uWydwYXJhbWV0ZXJzJ10gYXMgTGlzdCkubWFwKChwKSA9PiBwYXJzZVBhcmFtZXRlcihwKSkudG9MaXN0KCkKICAgICAgLi5jb2RlID0gcGFyc2VDb2RlKGpzb25bJ2NvZGUnXSkKICAgICAgLi5zaWRlRWZmZWN0cyA9IGpzb25bJ3NpZGVFZmZlY3RzJ10KICAgICAgLi5pbmxpbmVkQ291bnQgPSBqc29uWydpbmxpbmVkQ291bnQnXQogICAgICAuLm1vZGlmaWVycyA9CiAgICAgICAgICBwYXJzZU1vZGlmaWVycyhuZXcgTWFwPFN0cmluZywgYm9vbD4uZnJvbShqc29uWydtb2RpZmllcnMnXSkpCiAgICAgIC4uY2xvc3VyZXMgPSAoanNvblsnY2hpbGRyZW4nXSBhcyBMaXN0KQogICAgICAgICAgLm1hcDxDbG9zdXJlSW5mbz4oKGMpID0+IHBhcnNlSWQoYykpCiAgICAgICAgICAudG9MaXN0KCk7CiAgfQoKICBQYXJhbWV0ZXJJbmZvIHBhcnNlUGFyYW1ldGVyKE1hcCBqc29uKSA9PgogICAgICBuZXcgUGFyYW1ldGVySW5mbyhqc29uWyduYW1lJ10sIGpzb25bJ3R5cGUnXSwganNvblsnZGVjbGFyZWRUeXBlJ10pOwoKICBGdW5jdGlvbk1vZGlmaWVycyBwYXJzZU1vZGlmaWVycyhNYXA8U3RyaW5nLCBib29sPiBqc29uKSB7CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uTW9kaWZpZXJzKAogICAgICAgIGlzU3RhdGljOiBqc29uWydzdGF0aWMnXSA9PSB0cnVlLAogICAgICAgIGlzQ29uc3Q6IGpzb25bJ2NvbnN0J10gPT0gdHJ1ZSwKICAgICAgICBpc0ZhY3Rvcnk6IGpzb25bJ2ZhY3RvcnknXSA9PSB0cnVlLAogICAgICAgIGlzRXh0ZXJuYWw6IGpzb25bJ2V4dGVybmFsJ10gPT0gdHJ1ZSk7CiAgfQoKICBDbG9zdXJlSW5mbyBwYXJzZUNsb3N1cmUoTWFwIGpzb24pIHsKICAgIENsb3N1cmVJbmZvIHJlc3VsdCA9IHBhcnNlSWQoanNvblsnaWQnXSk7CiAgICByZXR1cm4gcmVzdWx0CiAgICAgIC4ubmFtZSA9IGpzb25bJ25hbWUnXQogICAgICAuLnBhcmVudCA9IHBhcnNlSWQoanNvblsncGFyZW50J10pCiAgICAgIC4ub3V0cHV0VW5pdCA9IHBhcnNlSWQoanNvblsnb3V0cHV0VW5pdCddKQogICAgICAuLnNpemUgPSBqc29uWydzaXplJ10KICAgICAgLi5mdW5jdGlvbiA9IHBhcnNlSWQoanNvblsnZnVuY3Rpb24nXSk7CiAgfQoKICBJbmZvIHBhcnNlSWQoaWQpIHsKICAgIFN0cmluZyBzZXJpYWxpemVkSWQgPSBpZDsKICAgIGlmIChzZXJpYWxpemVkSWQgPT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiByZWdpc3RyeS5wdXRJZkFic2VudChzZXJpYWxpemVkSWQsICgpIHsKICAgICAgaWYgKHNlcmlhbGl6ZWRJZC5zdGFydHNXaXRoKCdmdW5jdGlvbi8nKSkgewogICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25JbmZvLmludGVybmFsKCk7CiAgICAgIH0gZWxzZSBpZiAoc2VyaWFsaXplZElkLnN0YXJ0c1dpdGgoJ2Nsb3N1cmUvJykpIHsKICAgICAgICByZXR1cm4gbmV3IENsb3N1cmVJbmZvLmludGVybmFsKCk7CiAgICAgIH0gZWxzZSBpZiAoc2VyaWFsaXplZElkLnN0YXJ0c1dpdGgoJ2xpYnJhcnkvJykpIHsKICAgICAgICByZXR1cm4gbmV3IExpYnJhcnlJbmZvLmludGVybmFsKCk7CiAgICAgIH0gZWxzZSBpZiAoc2VyaWFsaXplZElkLnN0YXJ0c1dpdGgoJ2NsYXNzLycpKSB7CiAgICAgICAgcmV0dXJuIG5ldyBDbGFzc0luZm8uaW50ZXJuYWwoKTsKICAgICAgfSBlbHNlIGlmIChzZXJpYWxpemVkSWQuc3RhcnRzV2l0aCgnZmllbGQvJykpIHsKICAgICAgICByZXR1cm4gbmV3IEZpZWxkSW5mby5pbnRlcm5hbCgpOwogICAgICB9IGVsc2UgaWYgKHNlcmlhbGl6ZWRJZC5zdGFydHNXaXRoKCdjb25zdGFudC8nKSkgewogICAgICAgIHJldHVybiBuZXcgQ29uc3RhbnRJbmZvLmludGVybmFsKCk7CiAgICAgIH0gZWxzZSBpZiAoc2VyaWFsaXplZElkLnN0YXJ0c1dpdGgoJ3R5cGVkZWYvJykpIHsKICAgICAgICByZXR1cm4gbmV3IFR5cGVkZWZJbmZvLmludGVybmFsKCk7CiAgICAgIH0gZWxzZSBpZiAoc2VyaWFsaXplZElkLnN0YXJ0c1dpdGgoJ291dHB1dFVuaXQvJykpIHsKICAgICAgICByZXR1cm4gbmV3IE91dHB1dFVuaXRJbmZvLmludGVybmFsKCk7CiAgICAgIH0KICAgICAgYXNzZXJ0KGZhbHNlKTsKICAgIH0pOwogIH0KCiAgTGlzdDxDb2RlU3Bhbj4gcGFyc2VDb2RlKGR5bmFtaWMganNvbikgewogICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBmb3JtYXQgNS4xOgogICAgaWYgKGpzb24gaXMgU3RyaW5nKSB7CiAgICAgIHJldHVybiBbbmV3IENvZGVTcGFuKHN0YXJ0OiBudWxsLCBlbmQ6IG51bGwsIHRleHQ6IGpzb24pXTsKICAgIH0KCiAgICBpZiAoanNvbiBpcyBMaXN0KSB7CiAgICAgIHJldHVybiBqc29uLm1hcCgoZHluYW1pYyB2YWx1ZSkgewogICAgICAgIE1hcDxTdHJpbmcsIGR5bmFtaWM+IGpzb25Db2RlID0gdmFsdWU7CiAgICAgICAgcmV0dXJuIG5ldyBDb2RlU3BhbigKICAgICAgICAgICAgc3RhcnQ6IGpzb25Db2RlWydzdGFydCddLAogICAgICAgICAgICBlbmQ6IGpzb25Db2RlWydlbmQnXSwKICAgICAgICAgICAgdGV4dDoganNvbkNvZGVbJ3RleHQnXSk7CiAgICAgIH0pLnRvTGlzdCgpOwogICAgfQoKICAgIHJldHVybiBbXTsKICB9Cn0KCmNsYXNzIEFsbEluZm9Ub0pzb25Db252ZXJ0ZXIgZXh0ZW5kcyBDb252ZXJ0ZXI8QWxsSW5mbywgTWFwPgogICAgaW1wbGVtZW50cyBJbmZvVmlzaXRvcjxNYXA+IHsKICAvLy8gV2hldGhlciB0byBnZW5lcmF0ZSBqc29uIGNvbXBhdGlibGUgd2l0aCBmb3JtYXQgNS4xCiAgZmluYWwgYm9vbCBpc0JhY2t3YXJkQ29tcGF0aWJsZTsKICBmaW5hbCBNYXA8SW5mbywgSWQ+IGlkcyA9IG5ldyBIYXNoTWFwPEluZm8sIElkPigpOwogIGZpbmFsIFNldDxpbnQ+IHVzZWRJZHMgPSBuZXcgU2V0PGludD4oKTsKCiAgQWxsSW5mb1RvSnNvbkNvbnZlcnRlcih7dGhpcy5pc0JhY2t3YXJkQ29tcGF0aWJsZTogZmFsc2V9KTsKCiAgSWQgaWRGb3IoSW5mbyBpbmZvKSB7CiAgICB2YXIgc2VyaWFsaXplZElkID0gaWRzW2luZm9dOwogICAgaWYgKHNlcmlhbGl6ZWRJZCAhPSBudWxsKSByZXR1cm4gc2VyaWFsaXplZElkOwoKICAgIGFzc2VydCgKICAgICAgICBpbmZvIGlzIExpYnJhcnlJbmZvIHx8CiAgICAgICAgICAgIGluZm8gaXMgQ29uc3RhbnRJbmZvIHx8CiAgICAgICAgICAgIGluZm8gaXMgT3V0cHV0VW5pdEluZm8gfHwKICAgICAgICAgICAgaW5mby5wYXJlbnQgIT0gbnVsbCwKICAgICAgICAiJGluZm8iKTsKCiAgICBpbnQgaWQ7CiAgICBpZiAoaW5mbyBpcyBDb25zdGFudEluZm8pIHsKICAgICAgLy8gTm8gbmFtZSBhbmQgbm8gcGFyZW50LCBzbyBgbG9uZ05hbWVgIGlzbid0IGhlbHBmdWwKICAgICAgYXNzZXJ0KGluZm8ubmFtZSA9PSBudWxsKTsKICAgICAgYXNzZXJ0KGluZm8ucGFyZW50ID09IG51bGwpOwogICAgICBhc3NlcnQoaW5mby5jb2RlICE9IG51bGwpOwogICAgICAvLyBJbnN0ZWFkLCB1c2UgdGhlIGNvbnRlbnQgb2YgdGhlIGNvZGUuCiAgICAgIGlkID0gaW5mby5jb2RlLmZpcnN0LnRleHQuaGFzaENvZGU7CiAgICB9IGVsc2UgewogICAgICBpZCA9IGxvbmdOYW1lKGluZm8sIHVzZUxpYnJhcnlVcmk6IHRydWUsIGZvcklkOiB0cnVlKS5oYXNoQ29kZTsKICAgIH0KCiAgICB3aGlsZSAoIXVzZWRJZHMuYWRkKGlkKSkgewogICAgICBpZCsrOwogICAgfQogICAgc2VyaWFsaXplZElkID0gbmV3IElkKGluZm8ua2luZCwgJyRpZCcpOwogICAgcmV0dXJuIGlkc1tpbmZvXSA9IHNlcmlhbGl6ZWRJZDsKICB9CgogIE1hcCBjb252ZXJ0KEFsbEluZm8gaW5mbykgPT4gaW5mby5hY2NlcHQodGhpcyk7CgogIE1hcCBfdmlzaXRMaXN0KExpc3Q8SW5mbz4gaW5mb3MpIHsKICAgIC8vIFVzaW5nIFNwbGF5VHJlZSB0byBtYWludGFpbiBhIGNvbnNpc3RlbnQgb3JkZXIgb2Yga2V5cwogICAgdmFyIG1hcCA9IG5ldyBTcGxheVRyZWVNYXA8U3RyaW5nLCBNYXA+KGNvbXBhcmVOYXR1cmFsKTsKICAgIGZvciAodmFyIGluZm8gaW4gaW5mb3MpIHsKICAgICAgbWFwWycke2lkRm9yKGluZm8pLmlkfSddID0gaW5mby5hY2NlcHQodGhpcyk7CiAgICB9CiAgICByZXR1cm4gbWFwOwogIH0KCiAgTWFwIF92aXNpdEFsbEluZm9FbGVtZW50cyhBbGxJbmZvIGluZm8pIHsKICAgIHZhciBqc29uTGlicmFyaWVzID0gX3Zpc2l0TGlzdChpbmZvLmxpYnJhcmllcyk7CiAgICB2YXIganNvbkNsYXNzZXMgPSBfdmlzaXRMaXN0KGluZm8uY2xhc3Nlcyk7CiAgICB2YXIganNvbkZ1bmN0aW9ucyA9IF92aXNpdExpc3QoaW5mby5mdW5jdGlvbnMpOwogICAgdmFyIGpzb25UeXBlZGVmcyA9IF92aXNpdExpc3QoaW5mby50eXBlZGVmcyk7CiAgICB2YXIganNvbkZpZWxkcyA9IF92aXNpdExpc3QoaW5mby5maWVsZHMpOwogICAgdmFyIGpzb25Db25zdGFudHMgPSBfdmlzaXRMaXN0KGluZm8uY29uc3RhbnRzKTsKICAgIHZhciBqc29uQ2xvc3VyZXMgPSBfdmlzaXRMaXN0KGluZm8uY2xvc3VyZXMpOwogICAgcmV0dXJuIHsKICAgICAgJ2xpYnJhcnknOiBqc29uTGlicmFyaWVzLAogICAgICAnY2xhc3MnOiBqc29uQ2xhc3NlcywKICAgICAgJ2Z1bmN0aW9uJzoganNvbkZ1bmN0aW9ucywKICAgICAgJ3R5cGVkZWYnOiBqc29uVHlwZWRlZnMsCiAgICAgICdmaWVsZCc6IGpzb25GaWVsZHMsCiAgICAgICdjb25zdGFudCc6IGpzb25Db25zdGFudHMsCiAgICAgICdjbG9zdXJlJzoganNvbkNsb3N1cmVzLAogICAgfTsKICB9CgogIE1hcCBfdmlzaXREZXBlbmRlbmN5SW5mbyhEZXBlbmRlbmN5SW5mbyBpbmZvKSA9PgogICAgICB7J2lkJzogaWRGb3IoaW5mby50YXJnZXQpLnNlcmlhbGl6ZWRJZCwgJ21hc2snOiBpbmZvLm1hc2t9OwoKICBNYXAgX3Zpc2l0QWxsSW5mb0hvbGRpbmcoQWxsSW5mbyBhbGxJbmZvKSB7CiAgICB2YXIgbWFwID0gbmV3IFNwbGF5VHJlZU1hcDxTdHJpbmcsIExpc3Q+KGNvbXBhcmVOYXR1cmFsKTsKICAgIHZvaWQgaGVscGVyKENvZGVJbmZvIGluZm8pIHsKICAgICAgaWYgKGluZm8udXNlcy5pc0VtcHR5KSByZXR1cm47CiAgICAgIG1hcFtpZEZvcihpbmZvKS5zZXJpYWxpemVkSWRdID0gaW5mby51c2VzCiAgICAgICAgICAubWFwKF92aXNpdERlcGVuZGVuY3lJbmZvKQogICAgICAgICAgLnRvTGlzdCgpCiAgICAgICAgICAgIC4uc29ydCgoYSwgYikgPT4gYVsnaWQnXS5jb21wYXJlVG8oYlsnaWQnXSkpOwogICAgfQoKICAgIGFsbEluZm8uZnVuY3Rpb25zLmZvckVhY2goaGVscGVyKTsKICAgIGFsbEluZm8uZmllbGRzLmZvckVhY2goaGVscGVyKTsKICAgIHJldHVybiBtYXA7CiAgfQoKICBNYXAgX3Zpc2l0QWxsSW5mb0RlcGVuZGVuY2llcyhBbGxJbmZvIGFsbEluZm8pIHsKICAgIHZhciBtYXAgPSBuZXcgU3BsYXlUcmVlTWFwPFN0cmluZywgTGlzdD4oY29tcGFyZU5hdHVyYWwpOwogICAgYWxsSW5mby5kZXBlbmRlbmNpZXMuZm9yRWFjaCgoaywgdikgewogICAgICBtYXBbaWRGb3Ioaykuc2VyaWFsaXplZElkXSA9IF90b1NvcnRlZFNlcmlhbGl6ZWRJZHModiwgaWRGb3IpOwogICAgfSk7CiAgICByZXR1cm4gbWFwOwogIH0KCiAgTWFwIHZpc2l0QWxsKEFsbEluZm8gaW5mbykgewogICAgdmFyIGVsZW1lbnRzID0gX3Zpc2l0QWxsSW5mb0VsZW1lbnRzKGluZm8pOwogICAgdmFyIGpzb25Ib2xkaW5nID0gX3Zpc2l0QWxsSW5mb0hvbGRpbmcoaW5mbyk7CiAgICB2YXIganNvbkRlcGVuZGVuY2llcyA9IF92aXNpdEFsbEluZm9EZXBlbmRlbmNpZXMoaW5mbyk7CiAgICByZXR1cm4gewogICAgICAnZWxlbWVudHMnOiBlbGVtZW50cywKICAgICAgJ2hvbGRpbmcnOiBqc29uSG9sZGluZywKICAgICAgJ2RlcGVuZGVuY2llcyc6IGpzb25EZXBlbmRlbmNpZXMsCiAgICAgICdvdXRwdXRVbml0cyc6IGluZm8ub3V0cHV0VW5pdHMubWFwKCh1KSA9PiB1LmFjY2VwdCh0aGlzKSkudG9MaXN0KCksCiAgICAgICdkdW1wX3ZlcnNpb24nOiBpc0JhY2t3YXJkQ29tcGF0aWJsZSA/IDUgOiBpbmZvLnZlcnNpb24sCiAgICAgICdkZWZlcnJlZEZpbGVzJzogaW5mby5kZWZlcnJlZEZpbGVzLAogICAgICAnZHVtcF9taW5vcl92ZXJzaW9uJzogaXNCYWNrd2FyZENvbXBhdGlibGUgPyAxIDogaW5mby5taW5vclZlcnNpb24sCiAgICAgICdwcm9ncmFtJzogaW5mby5wcm9ncmFtLmFjY2VwdCh0aGlzKQogICAgfTsKICB9CgogIE1hcCB2aXNpdFByb2dyYW0oUHJvZ3JhbUluZm8gaW5mbykgewogICAgcmV0dXJuIHsKICAgICAgJ2VudHJ5cG9pbnQnOiBpZEZvcihpbmZvLmVudHJ5cG9pbnQpLnNlcmlhbGl6ZWRJZCwKICAgICAgJ3NpemUnOiBpbmZvLnNpemUsCiAgICAgICdkYXJ0MmpzVmVyc2lvbic6IGluZm8uZGFydDJqc1ZlcnNpb24sCiAgICAgICdjb21waWxhdGlvbk1vbWVudCc6ICcke2luZm8uY29tcGlsYXRpb25Nb21lbnR9JywKICAgICAgJ2NvbXBpbGF0aW9uRHVyYXRpb24nOiBpbmZvLmNvbXBpbGF0aW9uRHVyYXRpb24uaW5NaWNyb3NlY29uZHMsCiAgICAgICd0b0pzb25EdXJhdGlvbic6IGluZm8udG9Kc29uRHVyYXRpb24uaW5NaWNyb3NlY29uZHMsCiAgICAgICdkdW1wSW5mb0R1cmF0aW9uJzogaW5mby5kdW1wSW5mb0R1cmF0aW9uLmluTWljcm9zZWNvbmRzLAogICAgICAnbm9TdWNoTWV0aG9kRW5hYmxlZCc6IGluZm8ubm9TdWNoTWV0aG9kRW5hYmxlZCwKICAgICAgJ2lzUnVudGltZVR5cGVVc2VkJzogaW5mby5pc1J1bnRpbWVUeXBlVXNlZCwKICAgICAgJ2lzSXNvbGF0ZUluVXNlJzogaW5mby5pc0lzb2xhdGVJblVzZSwKICAgICAgJ2lzRnVuY3Rpb25BcHBseVVzZWQnOiBpbmZvLmlzRnVuY3Rpb25BcHBseVVzZWQsCiAgICAgICdpc01pcnJvcnNVc2VkJzogaW5mby5pc01pcnJvcnNVc2VkLAogICAgICAnbWluaWZpZWQnOiBpbmZvLm1pbmlmaWVkLAogICAgfTsKICB9CgogIE1hcCBfdmlzaXRCYXNpY0luZm8oQmFzaWNJbmZvIGluZm8pIHsKICAgIHZhciByZXMgPSB7CiAgICAgICdpZCc6IGlkRm9yKGluZm8pLnNlcmlhbGl6ZWRJZCwKICAgICAgJ2tpbmQnOiBraW5kVG9TdHJpbmcoaW5mby5raW5kKSwKICAgICAgJ25hbWUnOiBpbmZvLm5hbWUsCiAgICAgICdzaXplJzogaW5mby5zaXplLAogICAgfTsKICAgIC8vIFRPRE8oc2lnbXVuZCk6IE9taXQgdGhpcyBhbHNvIHdoZW4gb3V0cHV0VW5pdC5pZCA9PSAwIChtb3N0IGNvZGUgaXMgaW4KICAgIC8vIHRoZSBtYWluIG91dHB1dCB1bml0IGJ5IGRlZmF1bHQpLgogICAgaWYgKGluZm8ub3V0cHV0VW5pdCAhPSBudWxsKSB7CiAgICAgIHJlc1snb3V0cHV0VW5pdCddID0gaWRGb3IoaW5mby5vdXRwdXRVbml0KS5zZXJpYWxpemVkSWQ7CiAgICB9CiAgICBpZiAoaW5mby5jb3ZlcmFnZUlkICE9IG51bGwpIHJlc1snY292ZXJhZ2VJZCddID0gaW5mby5jb3ZlcmFnZUlkOwogICAgaWYgKGluZm8ucGFyZW50ICE9IG51bGwpIHJlc1sncGFyZW50J10gPSBpZEZvcihpbmZvLnBhcmVudCkuc2VyaWFsaXplZElkOwogICAgcmV0dXJuIHJlczsKICB9CgogIE1hcCB2aXNpdExpYnJhcnkoTGlicmFyeUluZm8gaW5mbykgewogICAgcmV0dXJuIF92aXNpdEJhc2ljSW5mbyhpbmZvKQogICAgICAuLmFkZEFsbCg8U3RyaW5nLCBPYmplY3Q+ewogICAgICAgICdjaGlsZHJlbic6IF90b1NvcnRlZFNlcmlhbGl6ZWRJZHMoCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICBpbmZvLnRvcExldmVsRnVuY3Rpb25zLAogICAgICAgICAgICAgIGluZm8udG9wTGV2ZWxWYXJpYWJsZXMsCiAgICAgICAgICAgICAgaW5mby5jbGFzc2VzLAogICAgICAgICAgICAgIGluZm8udHlwZWRlZnMKICAgICAgICAgICAgXS5leHBhbmQoKGkpID0+IGkpLAogICAgICAgICAgICBpZEZvciksCiAgICAgICAgJ2Nhbm9uaWNhbFVyaSc6ICcke2luZm8udXJpfScsCiAgICAgIH0pOwogIH0KCiAgTWFwIHZpc2l0Q2xhc3MoQ2xhc3NJbmZvIGluZm8pIHsKICAgIHJldHVybiBfdmlzaXRCYXNpY0luZm8oaW5mbykKICAgICAgLi5hZGRBbGwoPFN0cmluZywgT2JqZWN0PnsKICAgICAgICAvLyBUT0RPKHNpZ211bmQpOiBjaGFuZ2UgZm9ybWF0LCBpbmNsdWRlIG9ubHkgd2hlbiBhYnN0cmFjdCBpcyB0cnVlLgogICAgICAgICdtb2RpZmllcnMnOiB7J2Fic3RyYWN0JzogaW5mby5pc0Fic3RyYWN0fSwKICAgICAgICAnY2hpbGRyZW4nOiBfdG9Tb3J0ZWRTZXJpYWxpemVkSWRzKAogICAgICAgICAgICBbaW5mby5maWVsZHMsIGluZm8uZnVuY3Rpb25zXS5leHBhbmQoKGkpID0+IGkpLCBpZEZvcikKICAgICAgfSk7CiAgfQoKICBNYXAgdmlzaXRGaWVsZChGaWVsZEluZm8gaW5mbykgewogICAgdmFyIHJlc3VsdCA9IF92aXNpdEJhc2ljSW5mbyhpbmZvKQogICAgICAuLmFkZEFsbCg8U3RyaW5nLCBPYmplY3Q+ewogICAgICAgICdjaGlsZHJlbic6IF90b1NvcnRlZFNlcmlhbGl6ZWRJZHMoaW5mby5jbG9zdXJlcywgaWRGb3IpLAogICAgICAgICdpbmZlcnJlZFR5cGUnOiBpbmZvLmluZmVycmVkVHlwZSwKICAgICAgICAnY29kZSc6IF9zZXJpYWxpemVDb2RlKGluZm8uY29kZSksCiAgICAgICAgJ3R5cGUnOiBpbmZvLnR5cGUsCiAgICAgIH0pOwogICAgaWYgKGluZm8uaXNDb25zdCkgewogICAgICByZXN1bHRbJ2NvbnN0J10gPSB0cnVlOwogICAgICBpZiAoaW5mby5pbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgICAgcmVzdWx0Wydpbml0aWFsaXplciddID0gaWRGb3IoaW5mby5pbml0aWFsaXplcikuc2VyaWFsaXplZElkOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgTWFwIHZpc2l0Q29uc3RhbnQoQ29uc3RhbnRJbmZvIGluZm8pID0+IF92aXNpdEJhc2ljSW5mbyhpbmZvKQogICAgLi5hZGRBbGwoPFN0cmluZywgT2JqZWN0PnsnY29kZSc6IF9zZXJpYWxpemVDb2RlKGluZm8uY29kZSl9KTsKCiAgLy8gVE9ETyhzaWdtdW5kKTogZXhjbHVkZSBmYWxzZSB2YWx1ZXMgKHJlcXVpcmVzIGJ1bXBpbmcgdGhlIGZvcm1hdCB2ZXJzaW9uKToKICAvLyAgICAgdmFyIHJlcyA9IDxTdHJpbmcsIGJvb2w+e307CiAgLy8gICAgIGlmIChpc1N0YXRpYykgcmVzWydzdGF0aWMnXSA9IHRydWU7CiAgLy8gICAgIGlmIChpc0NvbnN0KSByZXNbJ2NvbnN0J10gPSB0cnVlOwogIC8vICAgICBpZiAoaXNGYWN0b3J5KSByZXNbJ2ZhY3RvcnknXSA9IHRydWU7CiAgLy8gICAgIGlmIChpc0V4dGVybmFsKSByZXNbJ2V4dGVybmFsJ10gPSB0cnVlOwogIC8vICAgICByZXR1cm4gcmVzOwogIE1hcCBfdmlzaXRGdW5jdGlvbk1vZGlmaWVycyhGdW5jdGlvbk1vZGlmaWVycyBtb2RzKSA9PiB7CiAgICAgICAgJ3N0YXRpYyc6IG1vZHMuaXNTdGF0aWMsCiAgICAgICAgJ2NvbnN0JzogbW9kcy5pc0NvbnN0LAogICAgICAgICdmYWN0b3J5JzogbW9kcy5pc0ZhY3RvcnksCiAgICAgICAgJ2V4dGVybmFsJzogbW9kcy5pc0V4dGVybmFsLAogICAgICB9OwoKICBNYXAgX3Zpc2l0UGFyYW1ldGVySW5mbyhQYXJhbWV0ZXJJbmZvIGluZm8pID0+CiAgICAgIHsnbmFtZSc6IGluZm8ubmFtZSwgJ3R5cGUnOiBpbmZvLnR5cGUsICdkZWNsYXJlZFR5cGUnOiBpbmZvLmRlY2xhcmVkVHlwZX07CgogIE1hcCB2aXNpdEZ1bmN0aW9uKEZ1bmN0aW9uSW5mbyBpbmZvKSB7CiAgICByZXR1cm4gX3Zpc2l0QmFzaWNJbmZvKGluZm8pCiAgICAgIC4uYWRkQWxsKDxTdHJpbmcsIE9iamVjdD57CiAgICAgICAgJ2NoaWxkcmVuJzogX3RvU29ydGVkU2VyaWFsaXplZElkcyhpbmZvLmNsb3N1cmVzLCBpZEZvciksCiAgICAgICAgJ21vZGlmaWVycyc6IF92aXNpdEZ1bmN0aW9uTW9kaWZpZXJzKGluZm8ubW9kaWZpZXJzKSwKICAgICAgICAncmV0dXJuVHlwZSc6IGluZm8ucmV0dXJuVHlwZSwKICAgICAgICAnaW5mZXJyZWRSZXR1cm5UeXBlJzogaW5mby5pbmZlcnJlZFJldHVyblR5cGUsCiAgICAgICAgJ3BhcmFtZXRlcnMnOgogICAgICAgICAgICBpbmZvLnBhcmFtZXRlcnMubWFwKChwKSA9PiBfdmlzaXRQYXJhbWV0ZXJJbmZvKHApKS50b0xpc3QoKSwKICAgICAgICAnc2lkZUVmZmVjdHMnOiBpbmZvLnNpZGVFZmZlY3RzLAogICAgICAgICdpbmxpbmVkQ291bnQnOiBpbmZvLmlubGluZWRDb3VudCwKICAgICAgICAnY29kZSc6IF9zZXJpYWxpemVDb2RlKGluZm8uY29kZSksCiAgICAgICAgJ3R5cGUnOiBpbmZvLnR5cGUsCiAgICAgICAgLy8gTm90ZTogdmVyc2lvbiAzLjIgb2YgZHVtcC1pbmZvIHNlcmlhbGl6ZXMgYHVzZXNgIGluIGEgc2VjdGlvbiBjYWxsZWQKICAgICAgICAvLyBgaG9sZGluZ2AgYXQgdGhlIHRvcC1sZXZlbC4KICAgICAgfSk7CiAgfQoKICBNYXAgdmlzaXRDbG9zdXJlKENsb3N1cmVJbmZvIGluZm8pIHsKICAgIHJldHVybiBfdmlzaXRCYXNpY0luZm8oaW5mbykKICAgICAgLi5hZGRBbGwoPFN0cmluZywgT2JqZWN0PnsnZnVuY3Rpb24nOiBpZEZvcihpbmZvLmZ1bmN0aW9uKS5zZXJpYWxpemVkSWR9KTsKICB9CgogIHZpc2l0VHlwZWRlZihUeXBlZGVmSW5mbyBpbmZvKSA9PiBfdmlzaXRCYXNpY0luZm8oaW5mbykuLlsndHlwZSddID0gaW5mby50eXBlOwoKICB2aXNpdE91dHB1dChPdXRwdXRVbml0SW5mbyBpbmZvKSA9PiBfdmlzaXRCYXNpY0luZm8oaW5mbykKICAgIC4uWydmaWxlbmFtZSddID0gaW5mby5maWxlbmFtZQogICAgLi5bJ2ltcG9ydHMnXSA9IGluZm8uaW1wb3J0czsKCiAgT2JqZWN0IF9zZXJpYWxpemVDb2RlKExpc3Q8Q29kZVNwYW4+IGNvZGUpIHsKICAgIGlmIChpc0JhY2t3YXJkQ29tcGF0aWJsZSkgewogICAgICByZXR1cm4gY29kZS5tYXAoKGMpID0+IGMudGV4dCkuam9pbignXG4nKTsKICAgIH0KICAgIHJldHVybiBjb2RlCiAgICAgICAgLm1hcDxPYmplY3Q+KChjKSA9PiB7CiAgICAgICAgICAgICAgJ3N0YXJ0JzogYy5zdGFydCwKICAgICAgICAgICAgICAnZW5kJzogYy5lbmQsCiAgICAgICAgICAgICAgJ3RleHQnOiBjLnRleHQsCiAgICAgICAgICAgIH0pCiAgICAgICAgLnRvTGlzdCgpOwogIH0KfQoKY2xhc3MgQWxsSW5mb0pzb25Db2RlYyBleHRlbmRzIENvZGVjPEFsbEluZm8sIE1hcD4gewogIGZpbmFsIENvbnZlcnRlcjxBbGxJbmZvLCBNYXA+IGVuY29kZXI7CiAgZmluYWwgQ29udmVydGVyPE1hcCwgQWxsSW5mbz4gZGVjb2RlciA9IG5ldyBKc29uVG9BbGxJbmZvQ29udmVydGVyKCk7CgogIEFsbEluZm9Kc29uQ29kZWMoe2Jvb2wgaXNCYWNrd2FyZENvbXBhdGlibGU6IGZhbHNlfSkKICAgICAgOiBlbmNvZGVyID0gbmV3IEFsbEluZm9Ub0pzb25Db252ZXJ0ZXIoCiAgICAgICAgICAgIGlzQmFja3dhcmRDb21wYXRpYmxlOiBpc0JhY2t3YXJkQ29tcGF0aWJsZSk7Cn0KCmNsYXNzIElkIHsKICBmaW5hbCBJbmZvS2luZCBraW5kOwogIGZpbmFsIFN0cmluZyBpZDsKCiAgSWQodGhpcy5raW5kLCB0aGlzLmlkKTsKCiAgU3RyaW5nIGdldCBzZXJpYWxpemVkSWQgPT4gJyR7a2luZFRvU3RyaW5nKGtpbmQpfS8kaWQnOwp9CoJZAE5OPAFKARoXAS0YFAElOkwBIlBQQgEvFgEgJUxLB04dShNOHUwBTyceTAYSThxKHUwBKCIbHiogPwgIAT0oUAgBF08BNAEpH083KlA1SC5JDkcKCC8GARoTBAEtMQskHB0TUBMEAScuCxwuMR03Iy0nLScjDyYkCAYTBAEjLAscKTEcPCE3IyUPJCIIBhMEASMsEhwpKDEcHCwnKTMuLxUEASkvEiccMgQBJy4SHCkcEgQBJygxHEYwOjYwOi4lAU87KU0NKig7BgExJEMNJU8GATUmRw0nJTgGARgEAUYtIz4GJSgqKiIyMDIkHzwEASkvEhwpKDEcHCg4FU4nKiwUSC4vFQQBLEsBPSIqKCwvBAEnLhIcKTEcLgQBFR4gEwYzMiw4KzgrNik2KTksOCs7LggVCAQBKzAaQQYBGCgvHSYiJRMGAQ8EAgE9IjojNSsBPgEYIjMBDB8kJiESAQwgPCEjIS8qDUYGAR8MBi0lBAEyASU+PR40BhAEASw0MDQyLjQyDSAcIR8bIR8HBAEzQgEuPiElMCUUOgYBJyQQBAEzPipFCBAEAR8wMjwNHB4oSz8rSisHBAEnDTkZLThGPEA3My03KyEHBAEoECYnGRkHTikjPwZGThAEASchISwOJiYcHCAUJwoEASMhIU00LEMKBAEjJyFCKysbChgeJkYIBhMEAUBDAVAlLSsvMRU7IR8jJQkBMVEBKSEhQj4nNxZJKSsrG1AnCgQBJyFRBAFRATwjIgEvIDEGEB4gHB4PEwQCATUpSAE3LjkCAQsXEwEaAToCASlwYWNrYWdlOmRhcnQyanNfaW5mby9qc29uX2luZm9fY29kZWMuZGFydENzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvZGFydDJqc19pbmZvL2xpYi9iaW5hcnlfc2VyaWFsaXphdGlvbi5kYXJ0ucQvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIEluZm8gc2VyaWFsaXphdGlvbiB0byBhIGJpbmFyeSBmb3JtLgovLy8KLy8vIFVubGlrZSB0aGUgSlNPTiBjb2RlYywgdGhpcyBzZXJpYWxpemF0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIHN0cmVhbWVkLgoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwoKaW1wb3J0ICdzcmMvYmluYXJ5L3NpbmsuZGFydCc7CmltcG9ydCAnc3JjL2JpbmFyeS9zb3VyY2UuZGFydCc7CmltcG9ydCAnaW5mby5kYXJ0JzsKCnZvaWQgZW5jb2RlKEFsbEluZm8gaW5mbywgU2luazxMaXN0PGludD4+IHNpbmspIHsKICBuZXcgQmluYXJ5UHJpbnRlcihuZXcgQmluYXJ5U2luayhzaW5rKSkudmlzaXRBbGwoaW5mbyk7Cn0KCkFsbEluZm8gZGVjb2RlKExpc3Q8aW50PiBkYXRhKSB7CiAgcmV0dXJuIG5ldyBCaW5hcnlSZWFkZXIobmV3IEJpbmFyeVNvdXJjZShkYXRhKSkucmVhZEFsbCgpOwp9CgpjbGFzcyBCaW5hcnlQcmludGVyIGltcGxlbWVudHMgSW5mb1Zpc2l0b3I8dm9pZD4gewogIGZpbmFsIEJpbmFyeVNpbmsgc2luazsKCiAgQmluYXJ5UHJpbnRlcih0aGlzLnNpbmspOwoKICB2b2lkIHdyaXRlRGF0ZShEYXRlVGltZSBkYXRlKSB7CiAgICBzaW5rLndyaXRlU3RyaW5nKGRhdGUudG9Jc284NjAxU3RyaW5nKCkpOwogIH0KCiAgdm9pZCB3cml0ZUR1cmF0aW9uKER1cmF0aW9uIGR1cmF0aW9uKSB7CiAgICBzaW5rLndyaXRlSW50KGR1cmF0aW9uLmluTWljcm9zZWNvbmRzKTsKICB9CgogIHZvaWQgd3JpdGVJbmZvV2l0aEtpbmQoSW5mbyBpbmZvKSB7CiAgICBzaW5rLndyaXRlRW51bShpbmZvLmtpbmQpOwogICAgaW5mby5hY2NlcHQodGhpcyk7CiAgfQoKICB2b2lkIHZpc2l0QWxsKEFsbEluZm8gaW5mbykgewogICAgc2luay53cml0ZUludChpbmZvLnZlcnNpb24pOwogICAgc2luay53cml0ZUludChpbmZvLm1pbm9yVmVyc2lvbik7CiAgICBzaW5rLndyaXRlTGlzdChpbmZvLmxpYnJhcmllcywgdmlzaXRMaWJyYXJ5KTsKICAgIC8vIFRPRE8oc2lnbXVuZCk6IHN5bnRoZXNpemUgdGhlIGZvbGxvd2luZyBsaXN0cyBpbnN0ZWFkIG9mIHNlcmlhbGl6aW5nIHRoZQogICAgLy8gdmFsdWVzIGFnYWluLgogICAgc2luay53cml0ZUxpc3QoaW5mby5jbGFzc2VzLCB2aXNpdENsYXNzKTsKICAgIHNpbmsud3JpdGVMaXN0KGluZm8uZnVuY3Rpb25zLCB2aXNpdEZ1bmN0aW9uKTsKICAgIHNpbmsud3JpdGVMaXN0KGluZm8udHlwZWRlZnMsIHZpc2l0VHlwZWRlZik7CiAgICBzaW5rLndyaXRlTGlzdChpbmZvLmZpZWxkcywgdmlzaXRGaWVsZCk7CiAgICBzaW5rLndyaXRlTGlzdChpbmZvLmNvbnN0YW50cywgdmlzaXRDb25zdGFudCk7CiAgICBzaW5rLndyaXRlTGlzdChpbmZvLmNsb3N1cmVzLCB2aXNpdENsb3N1cmUpOwoKICAgIHZvaWQgd3JpdGVEZXBlbmRlbmNpZXMoQ29kZUluZm8gaW5mbykgewogICAgICBzaW5rLndyaXRlTGlzdChpbmZvLnVzZXMsIF93cml0ZURlcGVuZGVuY3lJbmZvKTsKICAgIH0KCiAgICBpbmZvLmZpZWxkcy5mb3JFYWNoKHdyaXRlRGVwZW5kZW5jaWVzKTsKICAgIGluZm8uZnVuY3Rpb25zLmZvckVhY2god3JpdGVEZXBlbmRlbmNpZXMpOwoKICAgIHNpbmsud3JpdGVJbnQoaW5mby5kZXBlbmRlbmNpZXMubGVuZ3RoKTsKICAgIGluZm8uZGVwZW5kZW5jaWVzLmZvckVhY2goKEluZm8ga2V5LCBMaXN0PEluZm8+IHZhbHVlcykgewogICAgICB3cml0ZUluZm9XaXRoS2luZChrZXkpOwogICAgICBzaW5rLndyaXRlTGlzdCh2YWx1ZXMsIHdyaXRlSW5mb1dpdGhLaW5kKTsKICAgIH0pOwogICAgc2luay53cml0ZUxpc3QoaW5mby5vdXRwdXRVbml0cywgdmlzaXRPdXRwdXQpOwogICAgc2luay53cml0ZVN0cmluZyhqc29uRW5jb2RlKGluZm8uZGVmZXJyZWRGaWxlcykpOwogICAgdmlzaXRQcm9ncmFtKGluZm8ucHJvZ3JhbSk7CiAgICBzaW5rLmNsb3NlKCk7CiAgfQoKICB2b2lkIHZpc2l0UHJvZ3JhbShQcm9ncmFtSW5mbyBpbmZvKSB7CiAgICB2aXNpdEZ1bmN0aW9uKGluZm8uZW50cnlwb2ludCk7CiAgICBzaW5rLndyaXRlSW50KGluZm8uc2l6ZSk7CiAgICBzaW5rLndyaXRlU3RyaW5nT3JOdWxsKGluZm8uZGFydDJqc1ZlcnNpb24pOwogICAgd3JpdGVEYXRlKGluZm8uY29tcGlsYXRpb25Nb21lbnQpOwogICAgd3JpdGVEdXJhdGlvbihpbmZvLmNvbXBpbGF0aW9uRHVyYXRpb24pOwogICAgLy8gTm90ZTogd2UgZG9uJ3QgcmVjb3JkIHRoZSAndG9Kc29uRHVyYXRpb24nIGZpZWxkLiBDb25zaWRlciBkZWxldGluZyBpdD8KICAgIHdyaXRlRHVyYXRpb24oaW5mby5kdW1wSW5mb0R1cmF0aW9uKTsKICAgIHNpbmsud3JpdGVCb29sKGluZm8ubm9TdWNoTWV0aG9kRW5hYmxlZCk7CiAgICBzaW5rLndyaXRlQm9vbChpbmZvLmlzUnVudGltZVR5cGVVc2VkKTsKICAgIHNpbmsud3JpdGVCb29sKGluZm8uaXNJc29sYXRlSW5Vc2UpOwogICAgc2luay53cml0ZUJvb2woaW5mby5pc0Z1bmN0aW9uQXBwbHlVc2VkKTsKICAgIHNpbmsud3JpdGVCb29sKGluZm8uaXNNaXJyb3JzVXNlZCk7CiAgICBzaW5rLndyaXRlQm9vbChpbmZvLm1pbmlmaWVkKTsKICB9CgogIHZvaWQgX3Zpc2l0QmFzaWNJbmZvKEJhc2ljSW5mbyBpbmZvKSB7CiAgICBzaW5rLndyaXRlU3RyaW5nT3JOdWxsKGluZm8ubmFtZSk7CiAgICBzaW5rLndyaXRlSW50KGluZm8uc2l6ZSk7CiAgICBzaW5rLndyaXRlU3RyaW5nT3JOdWxsKGluZm8uY292ZXJhZ2VJZCk7CiAgICBfd3JpdGVPdXRwdXRPck51bGwoaW5mby5vdXRwdXRVbml0KTsKICAgIC8vIE5vdGU6IHBhcmVudC1wb2ludGVycyBhcmUgbm90IHNlcmlhbGl6ZWQsIHRoZXkgZ2V0IGRlZHVjZWQgZHVyaW5nIGRlc2VyaWFsaXphdGlvbi4KICB9CgogIHZvaWQgdmlzaXRMaWJyYXJ5KExpYnJhcnlJbmZvIGxpYnJhcnkpIHsKICAgIHNpbmsud3JpdGVDYWNoZWQobGlicmFyeSwgKExpYnJhcnlJbmZvIGluZm8pIHsKICAgICAgc2luay53cml0ZVVyaShpbmZvLnVyaSk7CiAgICAgIF92aXNpdEJhc2ljSW5mbyhpbmZvKTsKICAgICAgc2luay53cml0ZUxpc3QoaW5mby50b3BMZXZlbEZ1bmN0aW9ucywgdmlzaXRGdW5jdGlvbik7CiAgICAgIHNpbmsud3JpdGVMaXN0KGluZm8udG9wTGV2ZWxWYXJpYWJsZXMsIHZpc2l0RmllbGQpOwogICAgICBzaW5rLndyaXRlTGlzdChpbmZvLmNsYXNzZXMsIHZpc2l0Q2xhc3MpOwogICAgICBzaW5rLndyaXRlTGlzdChpbmZvLnR5cGVkZWZzLCB2aXNpdFR5cGVkZWYpOwogICAgfSk7CiAgfQoKICB2b2lkIHZpc2l0Q2xhc3MoQ2xhc3NJbmZvIGNscykgewogICAgc2luay53cml0ZUNhY2hlZChjbHMsIChDbGFzc0luZm8gaW5mbykgewogICAgICBfdmlzaXRCYXNpY0luZm8oaW5mbyk7CiAgICAgIHNpbmsud3JpdGVCb29sKGluZm8uaXNBYnN0cmFjdCk7CiAgICAgIHNpbmsud3JpdGVMaXN0KGluZm8uZmllbGRzLCB2aXNpdEZpZWxkKTsKICAgICAgc2luay53cml0ZUxpc3QoaW5mby5mdW5jdGlvbnMsIHZpc2l0RnVuY3Rpb24pOwogICAgfSk7CiAgfQoKICB2b2lkIHZpc2l0RmllbGQoRmllbGRJbmZvIGZpZWxkKSB7CiAgICBzaW5rLndyaXRlQ2FjaGVkKGZpZWxkLCAoRmllbGRJbmZvIGluZm8pIHsKICAgICAgX3Zpc2l0QmFzaWNJbmZvKGluZm8pOwogICAgICBzaW5rLndyaXRlTGlzdChpbmZvLmNsb3N1cmVzLCB2aXNpdENsb3N1cmUpOwogICAgICBzaW5rLndyaXRlU3RyaW5nKGluZm8uaW5mZXJyZWRUeXBlKTsKICAgICAgc2luay53cml0ZUxpc3QoaW5mby5jb2RlLCBfdmlzaXRDb2RlU3Bhbik7CiAgICAgIHNpbmsud3JpdGVTdHJpbmcoaW5mby50eXBlKTsKICAgICAgc2luay53cml0ZUJvb2woaW5mby5pc0NvbnN0KTsKICAgICAgaWYgKGluZm8uaXNDb25zdCkgewogICAgICAgIF93cml0ZUNvbnN0YW50T3JOdWxsKGluZm8uaW5pdGlhbGl6ZXIpOwogICAgICB9CiAgICB9KTsKICB9CgogIF92aXNpdENvZGVTcGFuKENvZGVTcGFuIGNvZGUpIHsKICAgIHNpbmsud3JpdGVJbnRPck51bGwoY29kZS5zdGFydCk7CiAgICBzaW5rLndyaXRlSW50T3JOdWxsKGNvZGUuZW5kKTsKICAgIHNpbmsud3JpdGVTdHJpbmdPck51bGwoY29kZS50ZXh0KTsKICB9CgogIHZvaWQgX3dyaXRlQ29uc3RhbnRPck51bGwoQ29uc3RhbnRJbmZvIGluZm8pIHsKICAgIHNpbmsud3JpdGVCb29sKGluZm8gIT0gbnVsbCk7CiAgICBpZiAoaW5mbyAhPSBudWxsKSB7CiAgICAgIHZpc2l0Q29uc3RhbnQoaW5mbyk7CiAgICB9CiAgfQoKICB2b2lkIHZpc2l0Q29uc3RhbnQoQ29uc3RhbnRJbmZvIGNvbnN0YW50KSB7CiAgICBzaW5rLndyaXRlQ2FjaGVkKGNvbnN0YW50LCAoQ29uc3RhbnRJbmZvIGluZm8pIHsKICAgICAgX3Zpc2l0QmFzaWNJbmZvKGluZm8pOwogICAgICBzaW5rLndyaXRlTGlzdChpbmZvLmNvZGUsIF92aXNpdENvZGVTcGFuKTsKICAgIH0pOwogIH0KCiAgdm9pZCBfdmlzaXRGdW5jdGlvbk1vZGlmaWVycyhGdW5jdGlvbk1vZGlmaWVycyBtb2RzKSB7CiAgICBpbnQgdmFsdWUgPSAwOwogICAgaWYgKG1vZHMuaXNTdGF0aWMpIHZhbHVlIHw9IF9zdGF0aWNNYXNrOwogICAgaWYgKG1vZHMuaXNDb25zdCkgdmFsdWUgfD0gX2NvbnN0TWFzazsKICAgIGlmIChtb2RzLmlzRmFjdG9yeSkgdmFsdWUgfD0gX2ZhY3RvcnlNYXNrOwogICAgaWYgKG1vZHMuaXNFeHRlcm5hbCkgdmFsdWUgfD0gX2V4dGVybmFsTWFzazsKICAgIHNpbmsud3JpdGVJbnQodmFsdWUpOwogIH0KCiAgdm9pZCBfdmlzaXRQYXJhbWV0ZXJJbmZvKFBhcmFtZXRlckluZm8gaW5mbykgewogICAgc2luay53cml0ZVN0cmluZyhpbmZvLm5hbWUpOwogICAgc2luay53cml0ZVN0cmluZyhpbmZvLnR5cGUpOwogICAgc2luay53cml0ZVN0cmluZyhpbmZvLmRlY2xhcmVkVHlwZSk7CiAgfQoKICB2b2lkIHZpc2l0RnVuY3Rpb24oRnVuY3Rpb25JbmZvIGZ1bmN0aW9uKSB7CiAgICBzaW5rLndyaXRlQ2FjaGVkKGZ1bmN0aW9uLCAoRnVuY3Rpb25JbmZvIGluZm8pIHsKICAgICAgX3Zpc2l0QmFzaWNJbmZvKGluZm8pOwogICAgICBzaW5rLndyaXRlTGlzdChpbmZvLmNsb3N1cmVzLCB2aXNpdENsb3N1cmUpOwogICAgICBfdmlzaXRGdW5jdGlvbk1vZGlmaWVycyhpbmZvLm1vZGlmaWVycyk7CiAgICAgIHNpbmsud3JpdGVTdHJpbmcoaW5mby5yZXR1cm5UeXBlKTsKICAgICAgc2luay53cml0ZVN0cmluZyhpbmZvLmluZmVycmVkUmV0dXJuVHlwZSk7CiAgICAgIHNpbmsud3JpdGVMaXN0KGluZm8ucGFyYW1ldGVycywgX3Zpc2l0UGFyYW1ldGVySW5mbyk7CiAgICAgIHNpbmsud3JpdGVTdHJpbmcoaW5mby5zaWRlRWZmZWN0cyk7CiAgICAgIHNpbmsud3JpdGVJbnRPck51bGwoaW5mby5pbmxpbmVkQ291bnQpOwogICAgICBzaW5rLndyaXRlTGlzdChpbmZvLmNvZGUsIF92aXNpdENvZGVTcGFuKTsKICAgICAgc2luay53cml0ZVN0cmluZyhpbmZvLnR5cGUpOwogICAgfSk7CiAgfQoKICB2b2lkIF93cml0ZURlcGVuZGVuY3lJbmZvKERlcGVuZGVuY3lJbmZvIGluZm8pIHsKICAgIHdyaXRlSW5mb1dpdGhLaW5kKGluZm8udGFyZ2V0KTsKICAgIHNpbmsud3JpdGVTdHJpbmdPck51bGwoaW5mby5tYXNrKTsKICB9CgogIHZvaWQgdmlzaXRDbG9zdXJlKENsb3N1cmVJbmZvIGNsb3N1cmUpIHsKICAgIHNpbmsud3JpdGVDYWNoZWQoY2xvc3VyZSwgKENsb3N1cmVJbmZvIGluZm8pIHsKICAgICAgX3Zpc2l0QmFzaWNJbmZvKGluZm8pOwogICAgICB2aXNpdEZ1bmN0aW9uKGluZm8uZnVuY3Rpb24pOwogICAgfSk7CiAgfQoKICB2b2lkIHZpc2l0VHlwZWRlZihUeXBlZGVmSW5mbyB0eXBlZGVmKSB7CiAgICBzaW5rLndyaXRlQ2FjaGVkKHR5cGVkZWYsIChUeXBlZGVmSW5mbyBpbmZvKSB7CiAgICAgIF92aXNpdEJhc2ljSW5mbyhpbmZvKTsKICAgICAgc2luay53cml0ZVN0cmluZyhpbmZvLnR5cGUpOwogICAgfSk7CiAgfQoKICB2b2lkIF93cml0ZU91dHB1dE9yTnVsbChPdXRwdXRVbml0SW5mbyBpbmZvKSB7CiAgICBzaW5rLndyaXRlQm9vbChpbmZvICE9IG51bGwpOwogICAgaWYgKGluZm8gIT0gbnVsbCkgewogICAgICB2aXNpdE91dHB1dChpbmZvKTsKICAgIH0KICB9CgogIHZvaWQgdmlzaXRPdXRwdXQoT3V0cHV0VW5pdEluZm8gb3V0cHV0KSB7CiAgICBzaW5rLndyaXRlQ2FjaGVkKG91dHB1dCwgKE91dHB1dFVuaXRJbmZvIGluZm8pIHsKICAgICAgX3Zpc2l0QmFzaWNJbmZvKGluZm8pOwogICAgICBzaW5rLndyaXRlU3RyaW5nT3JOdWxsKGluZm8uZmlsZW5hbWUpOwogICAgICBzaW5rLndyaXRlTGlzdChpbmZvLmltcG9ydHMsIHNpbmsud3JpdGVTdHJpbmcpOwogICAgfSk7CiAgfQp9CgpjbGFzcyBCaW5hcnlSZWFkZXIgewogIGZpbmFsIEJpbmFyeVNvdXJjZSBzb3VyY2U7CiAgQmluYXJ5UmVhZGVyKHRoaXMuc291cmNlKTsKCiAgRGF0ZVRpbWUgcmVhZERhdGUoKSB7CiAgICByZXR1cm4gRGF0ZVRpbWUucGFyc2Uoc291cmNlLnJlYWRTdHJpbmcoKSk7CiAgfQoKICBEdXJhdGlvbiByZWFkRHVyYXRpb24oKSB7CiAgICByZXR1cm4gbmV3IER1cmF0aW9uKG1pY3Jvc2Vjb25kczogc291cmNlLnJlYWRJbnQoKSk7CiAgfQoKICBJbmZvIHJlYWRJbmZvV2l0aEtpbmQoKSB7CiAgICBJbmZvS2luZCBraW5kID0gc291cmNlLnJlYWRFbnVtKEluZm9LaW5kLnZhbHVlcyk7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBJbmZvS2luZC5saWJyYXJ5OgogICAgICAgIHJldHVybiByZWFkTGlicmFyeSgpOwogICAgICBjYXNlIEluZm9LaW5kLmNsYXp6OgogICAgICAgIHJldHVybiByZWFkQ2xhc3MoKTsKICAgICAgY2FzZSBJbmZvS2luZC5mdW5jdGlvbjoKICAgICAgICByZXR1cm4gcmVhZEZ1bmN0aW9uKCk7CiAgICAgIGNhc2UgSW5mb0tpbmQuZmllbGQ6CiAgICAgICAgcmV0dXJuIHJlYWRGaWVsZCgpOwogICAgICBjYXNlIEluZm9LaW5kLmNvbnN0YW50OgogICAgICAgIHJldHVybiByZWFkQ29uc3RhbnQoKTsKICAgICAgY2FzZSBJbmZvS2luZC5vdXRwdXRVbml0OgogICAgICAgIHJldHVybiByZWFkT3V0cHV0KCk7CiAgICAgIGNhc2UgSW5mb0tpbmQudHlwZWRlZjoKICAgICAgICByZXR1cm4gcmVhZFR5cGVkZWYoKTsKICAgICAgY2FzZSBJbmZvS2luZC5jbG9zdXJlOgogICAgICAgIHJldHVybiByZWFkQ2xvc3VyZSgpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBBbGxJbmZvIHJlYWRBbGwoKSB7CiAgICB2YXIgaW5mbyA9IG5ldyBBbGxJbmZvKCk7CiAgICBpbnQgdmVyc2lvbiA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICBpbnQgbWlub3JWZXJzaW9uID0gc291cmNlLnJlYWRJbnQoKTsKICAgIGlmIChpbmZvLnZlcnNpb24gIT0gdmVyc2lvbiB8fCBpbmZvLm1pbm9yVmVyc2lvbiAhPSBtaW5vclZlcnNpb24pIHsKICAgICAgcHJpbnQoIndhcm5pbmc6IGRhdGEgd2FzIGVuY29kZWQgd2l0aCBmb3JtYXQgdmVyc2lvbiAiCiAgICAgICAgICAiJHZlcnNpb24uJG1pbm9yVmVyc2lvbiwgYnV0IGRlY29kZWQgd2l0aCAiCiAgICAgICAgICAiJHtpbmZvLnZlcnNpb259LiR7aW5mby5taW5vclZlcnNpb259Iik7CiAgICB9CiAgICBpbmZvLmxpYnJhcmllcyA9IHNvdXJjZS5yZWFkTGlzdChyZWFkTGlicmFyeSk7CiAgICBpbmZvLmNsYXNzZXMgPSBzb3VyY2UucmVhZExpc3QocmVhZENsYXNzKTsKICAgIGluZm8uZnVuY3Rpb25zID0gc291cmNlLnJlYWRMaXN0KHJlYWRGdW5jdGlvbik7CiAgICBpbmZvLnR5cGVkZWZzID0gc291cmNlLnJlYWRMaXN0KHJlYWRUeXBlZGVmKTsKICAgIGluZm8uZmllbGRzID0gc291cmNlLnJlYWRMaXN0KHJlYWRGaWVsZCk7CiAgICBpbmZvLmNvbnN0YW50cyA9IHNvdXJjZS5yZWFkTGlzdChyZWFkQ29uc3RhbnQpOwogICAgaW5mby5jbG9zdXJlcyA9IHNvdXJjZS5yZWFkTGlzdChyZWFkQ2xvc3VyZSk7CgogICAgdm9pZCByZWFkRGVwZW5kZW5jaWVzKENvZGVJbmZvIGluZm8pIHsKICAgICAgaW5mby51c2VzID0gc291cmNlLnJlYWRMaXN0KF9yZWFkRGVwZW5kZW5jeUluZm8pOwogICAgfQoKICAgIGluZm8uZmllbGRzLmZvckVhY2gocmVhZERlcGVuZGVuY2llcyk7CiAgICBpbmZvLmZ1bmN0aW9ucy5mb3JFYWNoKHJlYWREZXBlbmRlbmNpZXMpOwoKICAgIGludCBkZXBlbmRlbmNpZXNUb3RhbCA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICB3aGlsZSAoZGVwZW5kZW5jaWVzVG90YWwgPiAwKSB7CiAgICAgIEluZm8ga2V5ID0gcmVhZEluZm9XaXRoS2luZCgpOwogICAgICBMaXN0PEluZm8+IHZhbHVlcyA9IHNvdXJjZS5yZWFkTGlzdChyZWFkSW5mb1dpdGhLaW5kKTsKICAgICAgaW5mby5kZXBlbmRlbmNpZXNba2V5XSA9IHZhbHVlczsKICAgICAgZGVwZW5kZW5jaWVzVG90YWwtLTsKICAgIH0KCiAgICBpbmZvLm91dHB1dFVuaXRzID0gc291cmNlLnJlYWRMaXN0KHJlYWRPdXRwdXQpOwoKICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIGR5bmFtaWM+PiBtYXAgPQogICAgICAgIGpzb25EZWNvZGUoc291cmNlLnJlYWRTdHJpbmcoKSkuY2FzdDxTdHJpbmcsIE1hcDxTdHJpbmcsIGR5bmFtaWM+PigpOwogICAgZm9yIChmaW5hbCBsaWJyYXJ5IGluIG1hcC52YWx1ZXMpIHsKICAgICAgaWYgKGxpYnJhcnlbJ2ltcG9ydHMnXSAhPSBudWxsKSB7CiAgICAgICAgLy8gVGhlIGltcG9ydE1hcCBuZWVkcyB0byBiZSB0eXBlZCBhcyA8U3RyaW5nLCBMaXN0PFN0cmluZz4+LCBidXQgdGhlCiAgICAgICAgLy8ganNvbiBwYXJzZXIgcHJvZHVjZXMgPFN0cmluZywgZHluYW1pYz4uCiAgICAgICAgZmluYWwgaW1wb3J0TWFwID0gbGlicmFyeVsnaW1wb3J0cyddIGFzIE1hcDxTdHJpbmcsIGR5bmFtaWM+OwogICAgICAgIGltcG9ydE1hcC5mb3JFYWNoKChwcmVmaXgsIGZpbGVzKSB7CiAgICAgICAgICBpbXBvcnRNYXBbcHJlZml4XSA9IChmaWxlcyBhcyBMaXN0PGR5bmFtaWM+KS5jYXN0PFN0cmluZz4oKTsKICAgICAgICB9KTsKICAgICAgICBsaWJyYXJ5WydpbXBvcnRzJ10gPSBpbXBvcnRNYXAuY2FzdDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4oKTsKICAgICAgfQogICAgfQogICAgaW5mby5kZWZlcnJlZEZpbGVzID0gbWFwOwogICAgaW5mby5wcm9ncmFtID0gcmVhZFByb2dyYW0oKTsKICAgIHJldHVybiBpbmZvOwogIH0KCiAgUHJvZ3JhbUluZm8gcmVhZFByb2dyYW0oKSB7CiAgICB2YXIgaW5mbyA9IG5ldyBQcm9ncmFtSW5mbygpOwogICAgaW5mby5lbnRyeXBvaW50ID0gcmVhZEZ1bmN0aW9uKCk7CiAgICBpbmZvLnNpemUgPSBzb3VyY2UucmVhZEludCgpOwogICAgaW5mby5kYXJ0MmpzVmVyc2lvbiA9IHNvdXJjZS5yZWFkU3RyaW5nT3JOdWxsKCk7CiAgICBpbmZvLmNvbXBpbGF0aW9uTW9tZW50ID0gcmVhZERhdGUoKTsKICAgIGluZm8uY29tcGlsYXRpb25EdXJhdGlvbiA9IHJlYWREdXJhdGlvbigpOwogICAgaW5mby50b0pzb25EdXJhdGlvbiA9IG5ldyBEdXJhdGlvbihtaWNyb3NlY29uZHM6IDApOwogICAgaW5mby5kdW1wSW5mb0R1cmF0aW9uID0gcmVhZER1cmF0aW9uKCk7CiAgICBpbmZvLm5vU3VjaE1ldGhvZEVuYWJsZWQgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGluZm8uaXNSdW50aW1lVHlwZVVzZWQgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGluZm8uaXNJc29sYXRlSW5Vc2UgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGluZm8uaXNGdW5jdGlvbkFwcGx5VXNlZCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgaW5mby5pc01pcnJvcnNVc2VkID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBpbmZvLm1pbmlmaWVkID0gc291cmNlLnJlYWRCb29sKCk7CiAgICByZXR1cm4gaW5mbzsKICB9CgogIHZvaWQgX3JlYWRCYXNpY0luZm8oQmFzaWNJbmZvIGluZm8pIHsKICAgIGluZm8ubmFtZSA9IHNvdXJjZS5yZWFkU3RyaW5nT3JOdWxsKCk7CiAgICBpbmZvLnNpemUgPSBzb3VyY2UucmVhZEludCgpOwogICAgaW5mby5jb3ZlcmFnZUlkID0gc291cmNlLnJlYWRTdHJpbmdPck51bGwoKTsKICAgIGluZm8ub3V0cHV0VW5pdCA9IF9yZWFkT3V0cHV0T3JOdWxsKCk7CiAgICAvLyBOb3RlOiBwYXJlbnQgcG9pbnRlcnMgYXJlIGFkZGVkIHdoZW4gZGVzZXJpYWxpemluZyBwYXJlbnQgbm9kZXMuCiAgfQoKICBMaWJyYXJ5SW5mbyByZWFkTGlicmFyeSgpID0+IHNvdXJjZS5yZWFkQ2FjaGVkPExpYnJhcnlJbmZvPigoKSB7CiAgICAgICAgTGlicmFyeUluZm8gaW5mbyA9IG5ldyBMaWJyYXJ5SW5mby5pbnRlcm5hbCgpOwogICAgICAgIGluZm8udXJpID0gc291cmNlLnJlYWRVcmkoKTsKICAgICAgICBfcmVhZEJhc2ljSW5mbyhpbmZvKTsKICAgICAgICBpbmZvLnRvcExldmVsRnVuY3Rpb25zID0gc291cmNlLnJlYWRMaXN0KHJlYWRGdW5jdGlvbik7CiAgICAgICAgaW5mby50b3BMZXZlbFZhcmlhYmxlcyA9IHNvdXJjZS5yZWFkTGlzdChyZWFkRmllbGQpOwogICAgICAgIGluZm8uY2xhc3NlcyA9IHNvdXJjZS5yZWFkTGlzdChyZWFkQ2xhc3MpOwogICAgICAgIGluZm8udHlwZWRlZnMgPSBzb3VyY2UucmVhZExpc3QocmVhZFR5cGVkZWYpOwoKICAgICAgICBzZXRQYXJlbnQoQmFzaWNJbmZvIGNoaWxkKSA9PiBjaGlsZC5wYXJlbnQgPSBpbmZvOwogICAgICAgIGluZm8udG9wTGV2ZWxGdW5jdGlvbnMuZm9yRWFjaChzZXRQYXJlbnQpOwogICAgICAgIGluZm8udG9wTGV2ZWxWYXJpYWJsZXMuZm9yRWFjaChzZXRQYXJlbnQpOwogICAgICAgIGluZm8uY2xhc3Nlcy5mb3JFYWNoKHNldFBhcmVudCk7CiAgICAgICAgaW5mby50eXBlZGVmcy5mb3JFYWNoKHNldFBhcmVudCk7CiAgICAgICAgcmV0dXJuIGluZm87CiAgICAgIH0pOwoKICBDbGFzc0luZm8gcmVhZENsYXNzKCkgPT4gc291cmNlLnJlYWRDYWNoZWQ8Q2xhc3NJbmZvPigoKSB7CiAgICAgICAgQ2xhc3NJbmZvIGluZm8gPSBuZXcgQ2xhc3NJbmZvLmludGVybmFsKCk7CiAgICAgICAgX3JlYWRCYXNpY0luZm8oaW5mbyk7CiAgICAgICAgaW5mby5pc0Fic3RyYWN0ID0gc291cmNlLnJlYWRCb29sKCk7CiAgICAgICAgaW5mby5maWVsZHMgPSBzb3VyY2UucmVhZExpc3QocmVhZEZpZWxkKTsKICAgICAgICBpbmZvLmZ1bmN0aW9ucyA9IHNvdXJjZS5yZWFkTGlzdChyZWFkRnVuY3Rpb24pOwoKICAgICAgICBzZXRQYXJlbnQoQmFzaWNJbmZvIGNoaWxkKSA9PiBjaGlsZC5wYXJlbnQgPSBpbmZvOwogICAgICAgIGluZm8uZmllbGRzLmZvckVhY2goc2V0UGFyZW50KTsKICAgICAgICBpbmZvLmZ1bmN0aW9ucy5mb3JFYWNoKHNldFBhcmVudCk7CiAgICAgICAgcmV0dXJuIGluZm87CiAgICAgIH0pOwoKICBGaWVsZEluZm8gcmVhZEZpZWxkKCkgPT4gc291cmNlLnJlYWRDYWNoZWQ8RmllbGRJbmZvPigoKSB7CiAgICAgICAgRmllbGRJbmZvIGluZm8gPSBuZXcgRmllbGRJbmZvLmludGVybmFsKCk7CiAgICAgICAgX3JlYWRCYXNpY0luZm8oaW5mbyk7CiAgICAgICAgaW5mby5jbG9zdXJlcyA9IHNvdXJjZS5yZWFkTGlzdChyZWFkQ2xvc3VyZSk7CiAgICAgICAgaW5mby5pbmZlcnJlZFR5cGUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgICAgIGluZm8uY29kZSA9IHNvdXJjZS5yZWFkTGlzdChfcmVhZENvZGVTcGFuKTsKICAgICAgICBpbmZvLnR5cGUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgICAgIGluZm8uaXNDb25zdCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgICAgIGlmIChpbmZvLmlzQ29uc3QpIHsKICAgICAgICAgIGluZm8uaW5pdGlhbGl6ZXIgPSBfcmVhZENvbnN0YW50T3JOdWxsKCk7CiAgICAgICAgfQogICAgICAgIGluZm8uY2xvc3VyZXMuZm9yRWFjaCgoYykgPT4gYy5wYXJlbnQgPSBpbmZvKTsKICAgICAgICByZXR1cm4gaW5mbzsKICAgICAgfSk7CgogIENvZGVTcGFuIF9yZWFkQ29kZVNwYW4oKSB7CiAgICByZXR1cm4gbmV3IENvZGVTcGFuKCkKICAgICAgLi5zdGFydCA9IHNvdXJjZS5yZWFkSW50T3JOdWxsKCkKICAgICAgLi5lbmQgPSBzb3VyY2UucmVhZEludE9yTnVsbCgpCiAgICAgIC4udGV4dCA9IHNvdXJjZS5yZWFkU3RyaW5nT3JOdWxsKCk7CiAgfQoKICBDb25zdGFudEluZm8gX3JlYWRDb25zdGFudE9yTnVsbCgpIHsKICAgIGJvb2wgaGFzT3V0cHV0ID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBpZiAoaGFzT3V0cHV0KSByZXR1cm4gcmVhZENvbnN0YW50KCk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIENvbnN0YW50SW5mbyByZWFkQ29uc3RhbnQoKSA9PiBzb3VyY2UucmVhZENhY2hlZDxDb25zdGFudEluZm8+KCgpIHsKICAgICAgICBDb25zdGFudEluZm8gaW5mbyA9IG5ldyBDb25zdGFudEluZm8uaW50ZXJuYWwoKTsKICAgICAgICBfcmVhZEJhc2ljSW5mbyhpbmZvKTsKICAgICAgICBpbmZvLmNvZGUgPSBzb3VyY2UucmVhZExpc3QoX3JlYWRDb2RlU3Bhbik7CiAgICAgICAgcmV0dXJuIGluZm87CiAgICAgIH0pOwoKICBGdW5jdGlvbk1vZGlmaWVycyBfcmVhZEZ1bmN0aW9uTW9kaWZpZXJzKCkgewogICAgaW50IHZhbHVlID0gc291cmNlLnJlYWRJbnQoKTsKICAgIHJldHVybiBuZXcgRnVuY3Rpb25Nb2RpZmllcnMoCiAgICAgICAgaXNTdGF0aWM6IHZhbHVlICYgX3N0YXRpY01hc2sgIT0gMCwKICAgICAgICBpc0NvbnN0OiB2YWx1ZSAmIF9jb25zdE1hc2sgIT0gMCwKICAgICAgICBpc0ZhY3Rvcnk6IHZhbHVlICYgX2ZhY3RvcnlNYXNrICE9IDAsCiAgICAgICAgaXNFeHRlcm5hbDogdmFsdWUgJiBfZXh0ZXJuYWxNYXNrICE9IDApOwogIH0KCiAgUGFyYW1ldGVySW5mbyBfcmVhZFBhcmFtZXRlckluZm8oKSB7CiAgICByZXR1cm4gbmV3IFBhcmFtZXRlckluZm8oCiAgICAgICAgc291cmNlLnJlYWRTdHJpbmcoKSwgc291cmNlLnJlYWRTdHJpbmcoKSwgc291cmNlLnJlYWRTdHJpbmcoKSk7CiAgfQoKICBGdW5jdGlvbkluZm8gcmVhZEZ1bmN0aW9uKCkgPT4gc291cmNlLnJlYWRDYWNoZWQ8RnVuY3Rpb25JbmZvPigoKSB7CiAgICAgICAgRnVuY3Rpb25JbmZvIGluZm8gPSBuZXcgRnVuY3Rpb25JbmZvLmludGVybmFsKCk7CiAgICAgICAgX3JlYWRCYXNpY0luZm8oaW5mbyk7CiAgICAgICAgaW5mby5jbG9zdXJlcyA9IHNvdXJjZS5yZWFkTGlzdChyZWFkQ2xvc3VyZSk7CiAgICAgICAgaW5mby5tb2RpZmllcnMgPSBfcmVhZEZ1bmN0aW9uTW9kaWZpZXJzKCk7CiAgICAgICAgaW5mby5yZXR1cm5UeXBlID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgICAgICBpbmZvLmluZmVycmVkUmV0dXJuVHlwZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICAgICAgaW5mby5wYXJhbWV0ZXJzID0gc291cmNlLnJlYWRMaXN0KF9yZWFkUGFyYW1ldGVySW5mbyk7CiAgICAgICAgaW5mby5zaWRlRWZmZWN0cyA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICAgICAgaW5mby5pbmxpbmVkQ291bnQgPSBzb3VyY2UucmVhZEludE9yTnVsbCgpOwogICAgICAgIGluZm8uY29kZSA9IHNvdXJjZS5yZWFkTGlzdChfcmVhZENvZGVTcGFuKTsKICAgICAgICBpbmZvLnR5cGUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgICAgIGluZm8uY2xvc3VyZXMuZm9yRWFjaCgoYykgPT4gYy5wYXJlbnQgPSBpbmZvKTsKICAgICAgICByZXR1cm4gaW5mbzsKICAgICAgfSk7CgogIERlcGVuZGVuY3lJbmZvIF9yZWFkRGVwZW5kZW5jeUluZm8oKSA9PgogICAgICBuZXcgRGVwZW5kZW5jeUluZm8ocmVhZEluZm9XaXRoS2luZCgpLCBzb3VyY2UucmVhZFN0cmluZ09yTnVsbCgpKTsKCiAgQ2xvc3VyZUluZm8gcmVhZENsb3N1cmUoKSA9PiBzb3VyY2UucmVhZENhY2hlZDxDbG9zdXJlSW5mbz4oKCkgewogICAgICAgIENsb3N1cmVJbmZvIGluZm8gPSBuZXcgQ2xvc3VyZUluZm8uaW50ZXJuYWwoKTsKICAgICAgICBfcmVhZEJhc2ljSW5mbyhpbmZvKTsKICAgICAgICBpbmZvLmZ1bmN0aW9uID0gcmVhZEZ1bmN0aW9uKCk7CiAgICAgICAgaW5mby5mdW5jdGlvbi5wYXJlbnQgPSBpbmZvOwogICAgICAgIHJldHVybiBpbmZvOwogICAgICB9KTsKCiAgVHlwZWRlZkluZm8gcmVhZFR5cGVkZWYoKSA9PiBzb3VyY2UucmVhZENhY2hlZDxUeXBlZGVmSW5mbz4oKCkgewogICAgICAgIFR5cGVkZWZJbmZvIGluZm8gPSBuZXcgVHlwZWRlZkluZm8uaW50ZXJuYWwoKTsKICAgICAgICBfcmVhZEJhc2ljSW5mbyhpbmZvKTsKICAgICAgICBpbmZvLnR5cGUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgICB9KTsKCiAgT3V0cHV0VW5pdEluZm8gX3JlYWRPdXRwdXRPck51bGwoKSB7CiAgICBib29sIGhhc091dHB1dCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgaWYgKGhhc091dHB1dCkgcmV0dXJuIHJlYWRPdXRwdXQoKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgT3V0cHV0VW5pdEluZm8gcmVhZE91dHB1dCgpID0+IHNvdXJjZS5yZWFkQ2FjaGVkPE91dHB1dFVuaXRJbmZvPigoKSB7CiAgICAgICAgT3V0cHV0VW5pdEluZm8gaW5mbyA9IG5ldyBPdXRwdXRVbml0SW5mby5pbnRlcm5hbCgpOwogICAgICAgIF9yZWFkQmFzaWNJbmZvKGluZm8pOwogICAgICAgIGluZm8uZmlsZW5hbWUgPSBzb3VyY2UucmVhZFN0cmluZ09yTnVsbCgpOwogICAgICAgIGluZm8uaW1wb3J0cyA9IHNvdXJjZS5yZWFkTGlzdChzb3VyY2UucmVhZFN0cmluZyk7CiAgICAgICAgcmV0dXJuIGluZm87CiAgICAgIH0pOwp9Cgpjb25zdCBpbnQgX3N0YXRpY01hc2sgPSAxIDw8IDM7CmNvbnN0IGludCBfY29uc3RNYXNrID0gMSA8PCAyOwpjb25zdCBpbnQgX2ZhY3RvcnlNYXNrID0gMSA8PCAxOwpjb25zdCBpbnQgX2V4dGVybmFsTWFzayA9IDEgPDwgMDsKgcwATk48ASkESgEXAR8hFAEyOgIBIT0CATMZARwBIi4EASosBAEmHxcEASAhJjJQFS4zMS0zMQEsNwYBLC8BLT4eMQgzNiASBAEoJB4xJy1PKi4sKS4oIwQBKSceLSlaBAErMx8dPTowMwgEASMtHScvNQgEASUvHTMrMSMkGjAICAQBIiUjJwQBMSIYGwYEAS41HTEIBAE5Ey0rLzEaBAExISEpBAEuNR0zLykxPCouMSMIBAEzJCcEASszHSQIBAErMx0jCAQBMSIYGQYEASw1HS02CAQCARUdHQEYMAQBHDkEARw2FB0eGxweHxscHh8gHR0eHR4GEQQBFh4kKUg9NjMGMy80Mi40MgErOAYBKy4BLiQlPScbBgE0ASxOKChOM0YsRwxFCAYeIhEEAR4iJiI1KS85LDIwLTIsJxEEASgrIjErSAQBQzclHkA9MzYBOzMzKSoVCgE9Mx4tMjgBOygrFQoBPTMeNjE0KSocNAo3FQoBHRonJSoEAScoKhEEAUY5HjQVCgEvIiIsKi4xBAEnHkgEAUY5HjYzLzc/MDQ0KTcVCgEqSQFDNx4oJRUKAUM3HikKAScoKBEEAUg9HjM7FQoCASAfISIBLnBhY2thZ2U6ZGFydDJqc19pbmZvL2JpbmFyeV9zZXJpYWxpemF0aW9uLmRhcnQoc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanMvanMuZGFydJlZLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkganM7CgppbXBvcnQgJ3BhY2thZ2U6anNfYXN0L2pzX2FzdC5kYXJ0JzsKCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vZHVtcF9pbmZvLmRhcnQnIHNob3cgRHVtcEluZm9UYXNrOwppbXBvcnQgJy4uL2lvL2NvZGVfb3V0cHV0LmRhcnQnIHNob3cgQ29kZUJ1ZmZlcjsKaW1wb3J0ICdqc19zb3VyY2VfbWFwcGluZy5kYXJ0JzsKCmV4cG9ydCAncGFja2FnZTpqc19hc3QvanNfYXN0LmRhcnQnOwpleHBvcnQgJ2pzX2RlYnVnLmRhcnQnOwoKU3RyaW5nIHByZXR0eVByaW50KE5vZGUgbm9kZSwKICAgIHtib29sIGVuYWJsZU1pbmlmaWNhdGlvbjogZmFsc2UsCiAgICBib29sIGFsbG93VmFyaWFibGVNaW5pZmljYXRpb246IHRydWUsCiAgICBSZW5hbWVyIHJlbmFtZXJGb3JOYW1lczogSmF2YVNjcmlwdFByaW50aW5nT3B0aW9ucy5pZGVudGl0eVJlbmFtZXJ9KSB7CiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogRG8gd2UgbmVlZCBhbGwgdGhlIG9wdGlvbnMgaGVyZT8KICBKYXZhU2NyaXB0UHJpbnRpbmdPcHRpb25zIG9wdGlvbnMgPSBuZXcgSmF2YVNjcmlwdFByaW50aW5nT3B0aW9ucygKICAgICAgc2hvdWxkQ29tcHJlc3NPdXRwdXQ6IGVuYWJsZU1pbmlmaWNhdGlvbiwKICAgICAgbWluaWZ5TG9jYWxWYXJpYWJsZXM6IGFsbG93VmFyaWFibGVNaW5pZmljYXRpb24sCiAgICAgIHJlbmFtZXJGb3JOYW1lczogcmVuYW1lckZvck5hbWVzKTsKICBTaW1wbGVKYXZhU2NyaXB0UHJpbnRpbmdDb250ZXh0IGNvbnRleHQgPQogICAgICBuZXcgU2ltcGxlSmF2YVNjcmlwdFByaW50aW5nQ29udGV4dCgpOwogIFByaW50ZXIgcHJpbnRlciA9IG5ldyBQcmludGVyKG9wdGlvbnMsIGNvbnRleHQpOwogIHByaW50ZXIudmlzaXQobm9kZSk7CiAgcmV0dXJuIGNvbnRleHQuZ2V0VGV4dCgpOwp9CgpDb2RlQnVmZmVyIGNyZWF0ZUNvZGVCdWZmZXIoTm9kZSBub2RlLCBDb21waWxlck9wdGlvbnMgY29tcGlsZXJPcHRpb25zLAogICAgSmF2YVNjcmlwdFNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kgc291cmNlSW5mb3JtYXRpb25TdHJhdGVneSwKICAgIHtEdW1wSW5mb1Rhc2sgbW9uaXRvciwKICAgIGJvb2wgYWxsb3dWYXJpYWJsZU1pbmlmaWNhdGlvbjogdHJ1ZSwKICAgIFJlbmFtZXIgcmVuYW1lckZvck5hbWVzOiBKYXZhU2NyaXB0UHJpbnRpbmdPcHRpb25zLmlkZW50aXR5UmVuYW1lcn0pIHsKICBKYXZhU2NyaXB0UHJpbnRpbmdPcHRpb25zIG9wdGlvbnMgPSBuZXcgSmF2YVNjcmlwdFByaW50aW5nT3B0aW9ucygKICAgICAgc2hvdWxkQ29tcHJlc3NPdXRwdXQ6IGNvbXBpbGVyT3B0aW9ucy5lbmFibGVNaW5pZmljYXRpb24sCiAgICAgIG1pbmlmeUxvY2FsVmFyaWFibGVzOiBhbGxvd1ZhcmlhYmxlTWluaWZpY2F0aW9uLAogICAgICByZW5hbWVyRm9yTmFtZXM6IHJlbmFtZXJGb3JOYW1lcyk7CiAgQ29kZUJ1ZmZlciBvdXRCdWZmZXIgPSBuZXcgQ29kZUJ1ZmZlcigpOwogIFNvdXJjZUluZm9ybWF0aW9uUHJvY2Vzc29yIHNvdXJjZUluZm9ybWF0aW9uUHJvY2Vzc29yID0KICAgICAgc291cmNlSW5mb3JtYXRpb25TdHJhdGVneS5jcmVhdGVQcm9jZXNzb3IoCiAgICAgICAgICBuZXcgU291cmNlTWFwcGVyUHJvdmlkZXJJbXBsKG91dEJ1ZmZlciksCiAgICAgICAgICBjb25zdCBTb3VyY2VJbmZvcm1hdGlvblJlYWRlcigpKTsKICBEYXJ0MkpTSmF2YVNjcmlwdFByaW50aW5nQ29udGV4dCBjb250ZXh0ID0KICAgICAgbmV3IERhcnQySlNKYXZhU2NyaXB0UHJpbnRpbmdDb250ZXh0KAogICAgICAgICAgbW9uaXRvciwgb3V0QnVmZmVyLCBzb3VyY2VJbmZvcm1hdGlvblByb2Nlc3Nvcik7CiAgUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIob3B0aW9ucywgY29udGV4dCk7CiAgcHJpbnRlci52aXNpdChub2RlKTsKICBzb3VyY2VJbmZvcm1hdGlvblByb2Nlc3Nvci5wcm9jZXNzKG5vZGUsIG91dEJ1ZmZlcik7CiAgcmV0dXJuIG91dEJ1ZmZlcjsKfQoKY2xhc3MgRGFydDJKU0phdmFTY3JpcHRQcmludGluZ0NvbnRleHQgaW1wbGVtZW50cyBKYXZhU2NyaXB0UHJpbnRpbmdDb250ZXh0IHsKICBmaW5hbCBEdW1wSW5mb1Rhc2sgbW9uaXRvcjsKICBmaW5hbCBDb2RlQnVmZmVyIG91dEJ1ZmZlcjsKICBmaW5hbCBDb2RlUG9zaXRpb25MaXN0ZW5lciBjb2RlUG9zaXRpb25MaXN0ZW5lcjsKCiAgRGFydDJKU0phdmFTY3JpcHRQcmludGluZ0NvbnRleHQoCiAgICAgIHRoaXMubW9uaXRvciwgdGhpcy5vdXRCdWZmZXIsIHRoaXMuY29kZVBvc2l0aW9uTGlzdGVuZXIpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGVycm9yKFN0cmluZyBtZXNzYWdlKSB7CiAgICBmYWlsZWRBdChOT19MT0NBVElPTl9TUEFOTkFCTEUsIG1lc3NhZ2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbWl0KFN0cmluZyBzdHJpbmcpIHsKICAgIG1vbml0b3I/LmVtaXQoc3RyaW5nKTsKICAgIG91dEJ1ZmZlci5hZGQoc3RyaW5nKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW50ZXJOb2RlKE5vZGUgbm9kZSwgaW50IHN0YXJ0UG9zaXRpb24pIHsKICAgIG1vbml0b3I/LmVudGVyTm9kZShub2RlLCBzdGFydFBvc2l0aW9uKTsKICAgIGNvZGVQb3NpdGlvbkxpc3RlbmVyLm9uU3RhcnRQb3NpdGlvbihub2RlLCBzdGFydFBvc2l0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZXhpdE5vZGUoCiAgICAgIE5vZGUgbm9kZSwgaW50IHN0YXJ0UG9zaXRpb24sIGludCBlbmRQb3NpdGlvbiwgaW50IGNsb3NpbmdQb3NpdGlvbikgewogICAgbW9uaXRvcj8uZXhpdE5vZGUobm9kZSwgc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24sIGNsb3NpbmdQb3NpdGlvbik7CiAgICBjb2RlUG9zaXRpb25MaXN0ZW5lci5vblBvc2l0aW9ucygKICAgICAgICBub2RlLCBzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbiwgY2xvc2luZ1Bvc2l0aW9uKTsKICB9Cn0KCi8vLyBJbnRlcmZhY2UgZm9yIGFzdCBub2RlcyB0aGF0IGVuY2Fwc3VsYXRlIGFuIGFzdCB0aGF0IG5lZWRzIHRvIGJlCi8vLyB0cmF2ZXJzZWQgd2hlbiBjb3VudGluZyB0b2tlbnMuCmFic3RyYWN0IGNsYXNzIEFzdENvbnRhaW5lciBpbXBsZW1lbnRzIE5vZGUgewogIEl0ZXJhYmxlPE5vZGU+IGdldCBjb250YWluZWROb2RlczsKfQoKLy8vIEludGVyZmFjZSBmb3IgdGFza3MgaW4gdGhlIGNvbXBpbGVyIHRoYXQgbmVlZCB0byBmaW5hbGl6ZSB0b2tlbnMgYWZ0ZXIKLy8vIGNvdW50aW5nIHRoZW0uCmFic3RyYWN0IGNsYXNzIFRva2VuRmluYWxpemVyIHsKICB2b2lkIGZpbmFsaXplVG9rZW5zKCk7Cn0KCi8vLyBJbXBsZW1lbnRzIHJlZmVyZW5jZSBjb3VudGluZyBmb3IgaW5zdGFuY2VzIG9mIFtSZWZlcmVuY2VDb3VudGVkQXN0Tm9kZV0KY2xhc3MgVG9rZW5Db3VudGVyIGV4dGVuZHMgQmFzZVZpc2l0b3IgewogIEBvdmVycmlkZQogIHZpc2l0Tm9kZShOb2RlIG5vZGUpIHsKICAgIGlmIChub2RlIGlzIEFzdENvbnRhaW5lcikgewogICAgICBmb3IgKE5vZGUgZWxlbWVudCBpbiBub2RlLmNvbnRhaW5lZE5vZGVzKSB7CiAgICAgICAgZWxlbWVudC5hY2NlcHQodGhpcyk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobm9kZSBpcyBSZWZlcmVuY2VDb3VudGVkQXN0Tm9kZSkgewogICAgICBub2RlLm1hcmtTZWVuKHRoaXMpOwogICAgfSBlbHNlIHsKICAgICAgc3VwZXIudmlzaXROb2RlKG5vZGUpOwogICAgfQogIH0KCiAgdm9pZCBjb3VudFRva2VucyhOb2RlIG5vZGUpID0+IG5vZGUuYWNjZXB0KHRoaXMpOwp9CgphYnN0cmFjdCBjbGFzcyBSZWZlcmVuY2VDb3VudGVkQXN0Tm9kZSBpbXBsZW1lbnRzIE5vZGUgewogIG1hcmtTZWVuKFRva2VuQ291bnRlciB2aXNpdG9yKTsKfQoKLy8vIFJlcHJlc2VudHMgdGhlIExpdGVyYWxTdHJpbmcgcmVzdWx0aW5nIGZyb20gdW5wYXJzaW5nIFtleHByZXNzaW9uXS4gVGhlCi8vLyBhY3R1YWwgdW5wYXJzaW5nIGlzIGRvbmUgb24gZGVtYW5kIHdoZW4gcmVxdWVzdGluZyB0aGUgW3ZhbHVlXSBvZiB0aGlzCi8vLyBub2RlLgovLy8KLy8vIFRoaXMgaXMgdXNlZCB3aGVuIGdlbmVyYXRlZCBjb2RlIG5lZWRzIHRvIGJlIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nLAovLy8gZm9yIGV4YW1wbGUgYnkgdGhlIGxhenkgZW1pdHRlciBvciB3aGVuIGdlbmVyYXRpbmcgY29kZSBnZW5lcmF0b3JzLgpjbGFzcyBVbnBhcnNlZE5vZGUgZXh0ZW5kcyBEZWZlcnJlZFN0cmluZyBpbXBsZW1lbnRzIEFzdENvbnRhaW5lciB7CiAgZmluYWwgTm9kZSB0cmVlOwogIGZpbmFsIGJvb2wgX2VuYWJsZU1pbmlmaWNhdGlvbjsKICBmaW5hbCBib29sIF9wcm90ZWN0Rm9yRXZhbDsKICBMaXRlcmFsU3RyaW5nIF9jYWNoZWRMaXRlcmFsOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxOb2RlPiBnZXQgY29udGFpbmVkTm9kZXMgPT4gW3RyZWVdOwoKICAvLy8gQSBbanMuTGl0ZXJhbF0gdGhhdCByZXByZXNlbnRzIHRoZSBzdHJpbmcgcmVzdWx0IG9mIHVucGFyc2luZyBbYXN0XS4KICAvLy8KICAvLy8gV2hlbiBpdHMgc3RyaW5nIFt2YWx1ZV0gaXMgcmVxdWVzdGVkLCB0aGUgbm9kZSBwcmV0dHktcHJpbnRzIHRoZSBnaXZlbgogIC8vLyBbYXN0XSBhbmQsIGlmIFtwcm90ZWN0Rm9yRXZhbF0gaXMgdHJ1ZSwgd3JhcHMgdGhlIHJlc3VsdGluZyBzdHJpbmcgaW4KICAvLy8gcGFyZW50aGVzaXMuIFRoZSByZXN1bHQgaXMgYWxzbyBlc2NhcGVkLgogIFVucGFyc2VkTm9kZSh0aGlzLnRyZWUsIHRoaXMuX2VuYWJsZU1pbmlmaWNhdGlvbiwgdGhpcy5fcHJvdGVjdEZvckV2YWwpOwoKICBMaXRlcmFsU3RyaW5nIGdldCBfbGl0ZXJhbCB7CiAgICBpZiAoX2NhY2hlZExpdGVyYWwgPT0gbnVsbCkgewogICAgICBTdHJpbmcgdGV4dCA9IHByZXR0eVByaW50KHRyZWUsIGVuYWJsZU1pbmlmaWNhdGlvbjogX2VuYWJsZU1pbmlmaWNhdGlvbik7CiAgICAgIGlmIChfcHJvdGVjdEZvckV2YWwpIHsKICAgICAgICBpZiAodHJlZSBpcyBGdW4pIHRleHQgPSAnKCR0ZXh0KSc7CiAgICAgICAgaWYgKHRyZWUgaXMgTGl0ZXJhbEV4cHJlc3Npb24pIHsKICAgICAgICAgIExpdGVyYWxFeHByZXNzaW9uIGxpdGVyYWxFeHByZXNzaW9uID0gdHJlZTsKICAgICAgICAgIFN0cmluZyB0ZW1wbGF0ZSA9IGxpdGVyYWxFeHByZXNzaW9uLnRlbXBsYXRlOwogICAgICAgICAgaWYgKHRlbXBsYXRlLnN0YXJ0c1dpdGgoImZ1bmN0aW9uICIpIHx8IHRlbXBsYXRlLnN0YXJ0c1dpdGgoInsiKSkgewogICAgICAgICAgICB0ZXh0ID0gJygkdGV4dCknOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBfY2FjaGVkTGl0ZXJhbCA9IGpzLmVzY2FwZWRTdHJpbmcodGV4dCk7CiAgICB9CiAgICByZXR1cm4gX2NhY2hlZExpdGVyYWw7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IHZhbHVlID0+IF9saXRlcmFsLnZhbHVlOwp9CgovLy8gVHJ1ZSBpZiB0aGUgZ2l2ZW4gdGVtcGxhdGUgY29uc2lzdHMgb2YganVzdCBhIHBsYWNlaG9sZGVyLiBTdWNoIHRlbXBsYXRlcwovLy8gYXJlIHNvbWV0aW1lcyB1c2VkIHRvIG1hbnVhbGx5IHByb21vdGUgdGhlIHR5cGUgb2YgYW4gZXhwcmVzc2lvbi4KYm9vbCBpc0lkZW50aXR5VGVtcGxhdGUoVGVtcGxhdGUgdGVtcGxhdGUpIHsKICByZXR1cm4gdGVtcGxhdGUuYXN0IGlzIEludGVycG9sYXRlZEV4cHJlc3Npb247Cn0KCi8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbdGVtcGxhdGVdIHdpbGwgaW1tZWRpYXRlbHkgZ2l2ZSBhIFR5cGVFcnJvciBpZiB0aGUgZmlyc3QKLy8vIHBsYWNlaG9sZGVyIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC4KYm9vbCBpc051bGxHdWFyZE9uRmlyc3RBcmd1bWVudChUZW1wbGF0ZSB0ZW1wbGF0ZSkgewogIC8vIFdlIGxvb2sgZm9yIGEgdGVtcGxhdGUgb2YgdGhlIGZvcm0KICAvLwogIC8vICAgICAjLnNvbWV0aGluZwogIC8vICAgICAjLnNvbWV0aGluZygpCiAgLy8KICBOb2RlIG5vZGUgPSB0ZW1wbGF0ZS5hc3Q7CiAgaWYgKG5vZGUgaXMgQ2FsbCkgewogICAgQ2FsbCBjYWxsID0gbm9kZTsKICAgIG5vZGUgPSBjYWxsLnRhcmdldDsKICB9CiAgaWYgKG5vZGUgaXMgUHJvcGVydHlBY2Nlc3MpIHsKICAgIFByb3BlcnR5QWNjZXNzIGFjY2VzcyA9IG5vZGU7CiAgICBpZiAoYWNjZXNzLnJlY2VpdmVyIGlzIEludGVycG9sYXRlZEV4cHJlc3Npb24pIHsKICAgICAgSW50ZXJwb2xhdGVkRXhwcmVzc2lvbiBob2xlID0gYWNjZXNzLnJlY2VpdmVyOwogICAgICByZXR1cm4gaG9sZS5pc1Bvc2l0aW9uYWwgJiYgaG9sZS5uYW1lT3JQb3NpdGlvbiA9PSAwOwogICAgfQogIH0KICByZXR1cm4gZmFsc2U7Cn0KgMYATk48AQwBJQEZGi4xIQElGAEeJSpLO0UwNyksLTMXHAIBSEMbKktFQDcpKzoxMywtLDszFzcUAgFOHh4zASRAAQwfLgQBDB0bGwQBDDEtPwQBDBFMSiY8BAIBRSQuJQIBSxMgGQIBTSkMGSAyHggyGw0dBgQBNAIBOSICAUxLCgRKSEQTIh4gAQwvAUsGTUwvSwEfIlAdKyk2OE4eDAoILwYbBAEMJgIBTkYtMQIBUCo1KAUVFwUcFhYYBCAiNTU8BgQQAgEfcGFja2FnZTpjb21waWxlci9zcmMvanMvanMuZGFydDxzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL2ZpZWxkX2FuYWx5c2lzLmRhcnTAAFwaLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdHlfdXRpbHMuZGFydCc7CmltcG9ydCAnLi4vaXIvc2NvcGVfdmlzaXRvci5kYXJ0JzsKaW1wb3J0ICcuLi9qc19tb2RlbC9lbGVtZW50cy5kYXJ0JyBzaG93IEpGaWVsZDsKaW1wb3J0ICcuLi9qc19tb2RlbC9qc193b3JsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2tlcm5lbC9lbGVtZW50X21hcC5kYXJ0JzsKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX3N0cmF0ZWd5LmRhcnQnOwppbXBvcnQgJy4uL2tlcm5lbC9rZWxlbWVudHMuZGFydCcgc2hvdyBLQ2xhc3MsIEtGaWVsZCwgS0NvbnN0cnVjdG9yOwppbXBvcnQgJy4uL2tlcm5lbC9rZXJuZWxfd29ybGQuZGFydCc7CmltcG9ydCAnLi4vb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi9zZXJpYWxpemF0aW9uL3NlcmlhbGl6YXRpb24uZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvbWVtYmVyX3VzYWdlLmRhcnQnOwoKLy8vIEFsbG9jYXRvckFuYWx5c2lzCi8vLwovLy8gQW5hbHlzaXMgdG8gZGV0ZXJtaW5lIGZlYXR1cmVzIG9mIHRoZSBhbGxvY2F0b3IgZnVuY3Rpb25zLiBUaGUgYWxsb2NhdG9yCi8vLyBmdW5jdGlvbiB0YWtlcyBwYXJhbWV0ZXJzIGZvciBlYWNoIGZpZWxkIGluaXRpYWxpemVyIGFuZCBpbml0aWFsaXplcyB0aGUKLy8vIGZpZWxkcy4gIFBhcmFtZXRlcnMgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIGluaXRpYWxpemVyIGlzIGFsd2F5cyB0aGUgc2FtZQovLy8gY29uc3RhbnQgdmFsdWUuICBIb3cgdGhlIGFsbG9jYXRvciBpcyBlbWl0dGVkIHdpbGwgZGV0ZXJtaW5lIHdoYXQga2luZCBvZgovLy8gY29uc3RhbnRzIGNhbiBiZSBoYW5kbGVkLiAgVGhlIGluaXRpYWwgaW1wbGVtZW50YXRpb24gb25seSBwZXJtaXRzIGBudWxsYC4KCi8vIFRPRE8oc3JhKTogQW5hbHlzaXMgdG8gZGV0ZXJtaW5lIGZpZWxkIG9yZGVyLiBDdXJyZW50IGZpZWxkIG9yZGVyIGlzCi8vIGVzc2VudGlhbGx5IGRlY2xhcmF0aW9uIG9yZGVyLCBzdWJjbGFzcyBmaXJzdC4gV2UgY2FuIHJlb3JkZXIgZmllbGRzIHNvIHRoYXQKLy8gZmllbGRzIGluaXRpYWxpemVkIHdpdGggdGhlIHNhbWUgY29uc3RhbnQgYXJlIHRvZ2V0aGVyIHRvIGFsbG93IGNoYWluZWQKLy8gaW5pdGlhbGl6YXRpb24uIEZpZWxkcyBvZiBhIGNsYXNzIGFuZCBzdXBlcmNsYXNzIGNhbiBiZSByZW9yZGVyZWQgdG8gYWxsb3cKLy8gY2hhaW5pbmcsIGUuZy4KLy8KLy8gICAgIHRoaXMueCA9IHRoaXMueiA9IG51bGw7Ci8vCmNsYXNzIEtGaWVsZEFuYWx5c2lzIHsKICBmaW5hbCBLZXJuZWxUb0VsZW1lbnRNYXAgX2VsZW1lbnRNYXA7CgogIGZpbmFsIE1hcDxLQ2xhc3MsIENsYXNzRGF0YT4gX2NsYXNzRGF0YSA9IHt9OwogIGZpbmFsIE1hcDxLRmllbGQsIFN0YXRpY0ZpZWxkRGF0YT4gX3N0YXRpY0ZpZWxkRGF0YSA9IHt9OwoKICBLRmllbGRBbmFseXNpcyhLZXJuZWxGcm9udEVuZFN0cmF0ZWd5IGtlcm5lbFN0cmF0ZWd5KQogICAgICA6IF9lbGVtZW50TWFwID0ga2VybmVsU3RyYXRlZ3kuZWxlbWVudE1hcDsKCiAgLy8gUmVnaXN0ZXIgY2xhc3MgZHVyaW5nIHJlc29sdXRpb24uIFVzZSBzaW1wbGUgc3ludGFjdGljIGFuYWx5c2lzIHRvIGZpbmQKICAvLyBudWxsLWluaXRpYWxpemVkIGZpZWxkcy4KICB2b2lkIHJlZ2lzdGVySW5zdGFudGlhdGVkQ2xhc3MoS0NsYXNzIGNsYXNzXykgewogICAgaXIuQ2xhc3MgY2xhc3NOb2RlID0gX2VsZW1lbnRNYXAuZ2V0Q2xhc3NOb2RlKGNsYXNzXyk7CgogICAgTGlzdDxLQ29uc3RydWN0b3I+IGNvbnN0cnVjdG9ycyA9IFtdOwogICAgTWFwPEtGaWVsZCwgQWxsb2NhdG9yRGF0YT4gZmllbGREYXRhID0ge307CiAgICBmb3IgKGlyLkZpZWxkIGZpZWxkIGluIGNsYXNzTm9kZS5maWVsZHMpIHsKICAgICAgaWYgKCFmaWVsZC5pc0luc3RhbmNlTWVtYmVyKSBjb250aW51ZTsKCiAgICAgIEZpZWxkRW50aXR5IGZpZWxkRWxlbWVudCA9IF9lbGVtZW50TWFwLmdldEZpZWxkKGZpZWxkKTsKICAgICAgaXIuRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZmllbGQuaW5pdGlhbGl6ZXI7CiAgICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBfZWxlbWVudE1hcC5nZXRDb25zdGFudFZhbHVlKGV4cHJlc3Npb24sCiAgICAgICAgICByZXF1aXJlQ29uc3RhbnQ6IGZhbHNlLCBpbXBsaWNpdE51bGw6IHRydWUpOwogICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5pc0NvbnN0YW50KSB7CiAgICAgICAgZmllbGREYXRhW2ZpZWxkRWxlbWVudF0gPSBuZXcgQWxsb2NhdG9yRGF0YSh2YWx1ZSk7CiAgICAgIH0KICAgIH0KCiAgICBmb3IgKGlyLkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yIGluIGNsYXNzTm9kZS5jb25zdHJ1Y3RvcnMpIHsKICAgICAgS0NvbnN0cnVjdG9yIGNvbnN0cnVjdG9yRWxlbWVudCA9IF9lbGVtZW50TWFwLmdldENvbnN0cnVjdG9yKGNvbnN0cnVjdG9yKTsKICAgICAgY29uc3RydWN0b3JzLmFkZChjb25zdHJ1Y3RvckVsZW1lbnQpOwogICAgICBmb3IgKGlyLkluaXRpYWxpemVyIGluaXRpYWxpemVyIGluIGNvbnN0cnVjdG9yLmluaXRpYWxpemVycykgewogICAgICAgIGlmIChpbml0aWFsaXplciBpcyBpci5GaWVsZEluaXRpYWxpemVyKSB7CiAgICAgICAgICBBbGxvY2F0b3JEYXRhIGRhdGEgPQogICAgICAgICAgICAgIGZpZWxkRGF0YVtfZWxlbWVudE1hcC5nZXRGaWVsZChpbml0aWFsaXplci5maWVsZCldOwogICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgewogICAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTdXBwb3J0IGluaXRpYWxpemVycyB3aXRoIHNpZGUtZWZmZWN0cz8KCiAgICAgICAgICAgIC8vIFRoZSBmaWVsZCBoYXMgYSBub24tY29uc3RhbnQgaW5pdGlhbGl6ZXIuCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQoKICAgICAgICAgIEluaXRpYWxpemVyIGluaXRpYWxpemVyVmFsdWUgPSBjb25zdCBJbml0aWFsaXplci5jb21wbGV4KCk7CiAgICAgICAgICBpci5FeHByZXNzaW9uIHZhbHVlID0gaW5pdGlhbGl6ZXIudmFsdWU7CiAgICAgICAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50VmFsdWUgPSBfZWxlbWVudE1hcC5nZXRDb25zdGFudFZhbHVlKHZhbHVlLAogICAgICAgICAgICAgIHJlcXVpcmVDb25zdGFudDogZmFsc2UsIGltcGxpY2l0TnVsbDogdHJ1ZSk7CiAgICAgICAgICBpZiAoY29uc3RhbnRWYWx1ZSAhPSBudWxsICYmIGNvbnN0YW50VmFsdWUuaXNDb25zdGFudCkgewogICAgICAgICAgICBpbml0aWFsaXplclZhbHVlID0gbmV3IEluaXRpYWxpemVyLmRpcmVjdChjb25zdGFudFZhbHVlKTsKICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaXMgaXIuVmFyaWFibGVHZXQpIHsKICAgICAgICAgICAgaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgPSB2YWx1ZS52YXJpYWJsZTsKICAgICAgICAgICAgaW50IHBvc2l0aW9uID0KICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmluZGV4T2YocGFyYW1ldGVyKTsKICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IC0xKSB7CiAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID49IGNvbnN0cnVjdG9yLmZ1bmN0aW9uLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpIHsKICAgICAgICAgICAgICAgIGNvbnN0YW50VmFsdWUgPSBfZWxlbWVudE1hcC5nZXRDb25zdGFudFZhbHVlKAogICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlci5pbml0aWFsaXplciwKICAgICAgICAgICAgICAgICAgICByZXF1aXJlQ29uc3RhbnQ6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGltcGxpY2l0TnVsbDogdHJ1ZSk7CiAgICAgICAgICAgICAgICBpZiAoY29uc3RhbnRWYWx1ZSAhPSBudWxsICYmIGNvbnN0YW50VmFsdWUuaXNDb25zdGFudCkgewogICAgICAgICAgICAgICAgICBpbml0aWFsaXplclZhbHVlID0KICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbml0aWFsaXplci5wb3NpdGlvbmFsKHBvc2l0aW9uLCBjb25zdGFudFZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcG9zaXRpb24gPQogICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvci5mdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMuaW5kZXhPZihwYXJhbWV0ZXIpOwogICAgICAgICAgICAgIGlmIChwb3NpdGlvbiAhPSAtMSkgewogICAgICAgICAgICAgICAgY29uc3RhbnRWYWx1ZSA9IF9lbGVtZW50TWFwLmdldENvbnN0YW50VmFsdWUoCiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLmluaXRpYWxpemVyLAogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVDb25zdGFudDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgaW1wbGljaXROdWxsOiB0cnVlKTsKICAgICAgICAgICAgICAgIGlmIChjb25zdGFudFZhbHVlICE9IG51bGwgJiYgY29uc3RhbnRWYWx1ZS5pc0NvbnN0YW50KSB7CiAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVyVmFsdWUgPQogICAgICAgICAgICAgICAgICAgICAgbmV3IEluaXRpYWxpemVyLm5hbWVkKHBhcmFtZXRlci5uYW1lLCBjb25zdGFudFZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGRhdGEuaW5pdGlhbGl6ZXJzW2NvbnN0cnVjdG9yRWxlbWVudF0gPSBpbml0aWFsaXplclZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgX2NsYXNzRGF0YVtjbGFzc19dID0gbmV3IENsYXNzRGF0YShjb25zdHJ1Y3RvcnMsIGZpZWxkRGF0YSk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyU3RhdGljRmllbGQoS0ZpZWxkIGZpZWxkLCBJbml0aWFsaXplckNvbXBsZXhpdHkgY29tcGxleGl0eSkgewogICAgaXIuRmllbGQgbm9kZSA9IF9lbGVtZW50TWFwLmdldE1lbWJlck5vZGUoZmllbGQpOwogICAgaXIuRXhwcmVzc2lvbiBleHByZXNzaW9uID0gbm9kZS5pbml0aWFsaXplcjsKICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBfZWxlbWVudE1hcC5nZXRDb25zdGFudFZhbHVlKGV4cHJlc3Npb24sCiAgICAgICAgcmVxdWlyZUNvbnN0YW50OiBub2RlLmlzQ29uc3QsIGltcGxpY2l0TnVsbDogdHJ1ZSk7CiAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAhdmFsdWUuaXNDb25zdGFudCkgewogICAgICB2YWx1ZSA9IG51bGw7CiAgICB9CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgZXZhbHVhdGlvbiBvZiBjb25zdGFudCB3aGVuIFtjb21wbGV4aXR5XQogICAgLy8gaG9sZHMgdGhlIGNvbnN0YW50IGxpdGVyYWwgZnJvbSBDRkUuCiAgICBfc3RhdGljRmllbGREYXRhW2ZpZWxkXSA9IG5ldyBTdGF0aWNGaWVsZERhdGEodmFsdWUsIGNvbXBsZXhpdHkpOwogIH0KCiAgQWxsb2NhdG9yRGF0YSBnZXRBbGxvY2F0b3JEYXRhRm9yVGVzdGluZyhLRmllbGQgZmllbGQpIHsKICAgIHJldHVybiBfY2xhc3NEYXRhW2ZpZWxkLmVuY2xvc2luZ0NsYXNzXS5maWVsZERhdGFbZmllbGRdOwogIH0KCiAgU3RhdGljRmllbGREYXRhIGdldFN0YXRpY0ZpZWxkRGF0YUZvclRlc3RpbmcoS0ZpZWxkIGZpZWxkKSB7CiAgICByZXR1cm4gX3N0YXRpY0ZpZWxkRGF0YVtmaWVsZF07CiAgfQp9CgpjbGFzcyBDbGFzc0RhdGEgewogIGZpbmFsIExpc3Q8S0NvbnN0cnVjdG9yPiBjb25zdHJ1Y3RvcnM7CiAgZmluYWwgTWFwPEtGaWVsZCwgQWxsb2NhdG9yRGF0YT4gZmllbGREYXRhOwoKICBDbGFzc0RhdGEodGhpcy5jb25zdHJ1Y3RvcnMsIHRoaXMuZmllbGREYXRhKTsKfQoKY2xhc3MgU3RhdGljRmllbGREYXRhIHsKICBmaW5hbCBDb25zdGFudFZhbHVlIGluaXRpYWxWYWx1ZTsKICBmaW5hbCBJbml0aWFsaXplckNvbXBsZXhpdHkgY29tcGxleGl0eTsKCiAgU3RhdGljRmllbGREYXRhKHRoaXMuaW5pdGlhbFZhbHVlLCB0aGlzLmNvbXBsZXhpdHkpOwoKICBib29sIGdldCBoYXNEZXBlbmRlbmNpZXMgPT4gY29tcGxleGl0eSAhPSBudWxsICYmIGNvbXBsZXhpdHkuZmllbGRzICE9IG51bGw7Cn0KCmNsYXNzIEFsbG9jYXRvckRhdGEgewogIGZpbmFsIENvbnN0YW50VmFsdWUgaW5pdGlhbFZhbHVlOwogIGZpbmFsIE1hcDxLQ29uc3RydWN0b3IsIEluaXRpYWxpemVyPiBpbml0aWFsaXplcnMgPSB7fTsKCiAgQWxsb2NhdG9yRGF0YSh0aGlzLmluaXRpYWxWYWx1ZSk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+CiAgICAgICdBbGxvY2F0b3JEYXRhKGluaXRpYWxWYWx1ZT0ke2luaXRpYWxWYWx1ZT8udG9TdHJ1Y3R1cmVkVGV4dCgpfSwnCiAgICAgICdpbml0aWFsaXplcnM9JGluaXRpYWxpemVycyknOwp9CgplbnVtIEluaXRpYWxpemVyS2luZCB7CiAgZGlyZWN0LAogIHBvc2l0aW9uYWwsCiAgbmFtZWQsCiAgY29tcGxleCwKfQoKY2xhc3MgSW5pdGlhbGl6ZXIgewogIGZpbmFsIEluaXRpYWxpemVyS2luZCBraW5kOwogIGZpbmFsIGludCBpbmRleDsKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBmaW5hbCBDb25zdGFudFZhbHVlIHZhbHVlOwoKICBJbml0aWFsaXplci5kaXJlY3QodGhpcy52YWx1ZSkKICAgICAgOiBraW5kID0gSW5pdGlhbGl6ZXJLaW5kLmRpcmVjdCwKICAgICAgICBpbmRleCA9IG51bGwsCiAgICAgICAgbmFtZSA9IG51bGw7CgogIEluaXRpYWxpemVyLnBvc2l0aW9uYWwodGhpcy5pbmRleCwgdGhpcy52YWx1ZSkKICAgICAgOiBraW5kID0gSW5pdGlhbGl6ZXJLaW5kLnBvc2l0aW9uYWwsCiAgICAgICAgbmFtZSA9IG51bGw7CgogIEluaXRpYWxpemVyLm5hbWVkKHRoaXMubmFtZSwgdGhpcy52YWx1ZSkKICAgICAgOiBraW5kID0gSW5pdGlhbGl6ZXJLaW5kLm5hbWVkLAogICAgICAgIGluZGV4ID0gbnVsbDsKCiAgY29uc3QgSW5pdGlhbGl6ZXIuY29tcGxleCgpCiAgICAgIDoga2luZCA9IEluaXRpYWxpemVyS2luZC5jb21wbGV4LAogICAgICAgIGluZGV4ID0gbnVsbCwKICAgICAgICBuYW1lID0gbnVsbCwKICAgICAgICB2YWx1ZSA9IG51bGw7CgogIFN0cmluZyBnZXQgc2hvcnRUZXh0IHsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIEluaXRpYWxpemVyS2luZC5kaXJlY3Q6CiAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RydWN0dXJlZFRleHQoKTsKICAgICAgY2FzZSBJbml0aWFsaXplcktpbmQucG9zaXRpb25hbDoKICAgICAgICByZXR1cm4gJyRpbmRleDoke3ZhbHVlLnRvU3RydWN0dXJlZFRleHQoKX0nOwogICAgICBjYXNlIEluaXRpYWxpemVyS2luZC5uYW1lZDoKICAgICAgICByZXR1cm4gJyRuYW1lOiR7dmFsdWUudG9TdHJ1Y3R1cmVkVGV4dCgpfSc7CiAgICAgIGNhc2UgSW5pdGlhbGl6ZXJLaW5kLmNvbXBsZXg6CiAgICAgICAgcmV0dXJuICc/JzsKICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdVbmV4cGVjdGVkIGtpbmQgJGtpbmQnKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IHNob3J0VGV4dDsKfQoKY2xhc3MgSkZpZWxkQW5hbHlzaXMgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbSkZpZWxkQW5hbHlzaXNdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnZmllbGQtYW5hbHlzaXMnOwoKICAvLyAtLWNzcCBhbmQgLS1mYXN0LXN0YXJ0dXAgaGF2ZSBkaWZmZXJlbnQgY29uc3RyYWludHMgdG8gdGhlIGdlbmVyYXRlZCBjb2RlLgoKICBmaW5hbCBNYXA8RmllbGRFbnRpdHksIEZpZWxkQW5hbHlzaXNEYXRhPiBfZmllbGREYXRhOwoKICBKRmllbGRBbmFseXNpcy5fKHRoaXMuX2ZpZWxkRGF0YSk7CgogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbSkZpZWxkQW5hbHlzaXNdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgSkZpZWxkQW5hbHlzaXMucmVhZEZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgTWFwPEZpZWxkRW50aXR5LCBGaWVsZEFuYWx5c2lzRGF0YT4gZmllbGREYXRhID0gc291cmNlCiAgICAgICAgLnJlYWRNZW1iZXJNYXAoKCkgPT4gbmV3IEZpZWxkQW5hbHlzaXNEYXRhLmZyb21EYXRhU291cmNlKHNvdXJjZSkpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBKRmllbGRBbmFseXNpcy5fKGZpZWxkRGF0YSk7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtKRmllbGRBbmFseXNpc10gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVNZW1iZXJNYXAoCiAgICAgICAgX2ZpZWxkRGF0YSwgKEZpZWxkQW5hbHlzaXNEYXRhIGRhdGEpID0+IGRhdGEud3JpdGVUb0RhdGFTaW5rKHNpbmspKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBmYWN0b3J5IEpGaWVsZEFuYWx5c2lzLmZyb20oS0Nsb3NlZFdvcmxkSW1wbCBjbG9zZWRXb3JsZCwgSnNUb0Zyb250ZW5kTWFwIG1hcCwKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMpIHsKICAgIE1hcDxGaWVsZEVudGl0eSwgRmllbGRBbmFseXNpc0RhdGE+IGZpZWxkRGF0YSA9IHt9OwoKICAgIGJvb2wgY2FuQmVFbGlkZWQoRmllbGRFbnRpdHkgZmllbGQpIHsKICAgICAgcmV0dXJuICFjbG9zZWRXb3JsZC5hbm5vdGF0aW9uc0RhdGEuaGFzTm9FbGlzaW9uKGZpZWxkKSAmJgogICAgICAgICAgIWNsb3NlZFdvcmxkLm5hdGl2ZURhdGEuaXNOYXRpdmVNZW1iZXIoZmllbGQpOwogICAgfQoKICAgIGNsb3NlZFdvcmxkLmZpZWxkQW5hbHlzaXMuX2NsYXNzRGF0YQogICAgICAgIC5mb3JFYWNoKChDbGFzc0VudGl0eSBjbHMsIENsYXNzRGF0YSBjbGFzc0RhdGEpIHsKICAgICAgY2xhc3NEYXRhLmZpZWxkRGF0YS5mb3JFYWNoKChLRmllbGQga0ZpZWxkLCBBbGxvY2F0b3JEYXRhIGRhdGEpIHsKICAgICAgICBKRmllbGQgakZpZWxkID0gbWFwLnRvQmFja2VuZE1lbWJlcihrRmllbGQpOwogICAgICAgIGlmIChqRmllbGQgPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU2hvdWxkIGVsaWRlZCBzdGF0aWMgZmllbGRzIGJlIHJlbW92ZWQgZnJvbSB0aGUKICAgICAgICAvLyBKIG1vZGVsPyBTdGF0aWMgc2V0dGVycyBtaWdodCBzdGlsbCBhc3NpZ24gdG8gdGhlbS4KCiAgICAgICAgTWVtYmVyVXNhZ2UgbWVtYmVyVXNhZ2UgPSBjbG9zZWRXb3JsZC5saXZlTWVtYmVyVXNhZ2Vba0ZpZWxkXTsKICAgICAgICBpZiAoIW1lbWJlclVzYWdlLmhhc1JlYWQpIHsKICAgICAgICAgIGlmIChjYW5CZUVsaWRlZChrRmllbGQpKSB7CiAgICAgICAgICAgIGZpZWxkRGF0YVtqRmllbGRdID0gY29uc3QgRmllbGRBbmFseXNpc0RhdGEoaXNFbGlkZWQ6IHRydWUpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoZGF0YS5pbml0aWFsVmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICBDb25zdGFudFZhbHVlIGluaXRpYWxWYWx1ZTsKICAgICAgICAgICAgYm9vbCBpc1Rvb0NvbXBsZXggPSBmYWxzZTsKCiAgICAgICAgICAgIHZvaWQgaW5jbHVkZUluaXRpYWxWYWx1ZShDb25zdGFudFZhbHVlIHZhbHVlKSB7CiAgICAgICAgICAgICAgaWYgKGlzVG9vQ29tcGxleCkgcmV0dXJuOwogICAgICAgICAgICAgIGlmIChpbml0aWFsVmFsdWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbml0aWFsVmFsdWUgIT0gdmFsdWUpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSA9IG51bGw7CiAgICAgICAgICAgICAgICBpc1Rvb0NvbXBsZXggPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbWVtYmVyVXNhZ2UuaW5pdGlhbENvbnN0YW50cy5mb3JFYWNoKGluY2x1ZGVJbml0aWFsVmFsdWUpOwoKICAgICAgICAgICAgYm9vbCBpbkFsbENvbnN0cnVjdG9ycyA9IHRydWU7CiAgICAgICAgICAgIGZvciAoS0NvbnN0cnVjdG9yIGNvbnN0cnVjdG9yIGluIGNsYXNzRGF0YS5jb25zdHJ1Y3RvcnMpIHsKICAgICAgICAgICAgICBpZiAoaXNUb29Db21wbGV4KSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIE1lbWJlclVzYWdlIGNvbnN0cnVjdG9yVXNhZ2UgPQogICAgICAgICAgICAgICAgICBjbG9zZWRXb3JsZC5saXZlTWVtYmVyVXNhZ2VbY29uc3RydWN0b3JdOwogICAgICAgICAgICAgIGlmIChjb25zdHJ1Y3RvclVzYWdlID09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8vIFRoaXMgY29uc3RydWN0b3IgaXNuJ3QgY2FsbGVkLgogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIFBhcmFtZXRlclN0cnVjdHVyZSBpbnZva2VkUGFyYW1ldGVycyA9CiAgICAgICAgICAgICAgICAgIGNsb3NlZFdvcmxkLmFubm90YXRpb25zRGF0YS5oYXNOb0VsaXNpb24oY29uc3RydWN0b3IpCiAgICAgICAgICAgICAgICAgICAgICA/IGNvbnN0cnVjdG9yLnBhcmFtZXRlclN0cnVjdHVyZQogICAgICAgICAgICAgICAgICAgICAgOiBjb25zdHJ1Y3RvclVzYWdlLmludm9rZWRQYXJhbWV0ZXJzOwoKICAgICAgICAgICAgICBJbml0aWFsaXplciBpbml0aWFsaXplciA9IGRhdGEuaW5pdGlhbGl6ZXJzW2NvbnN0cnVjdG9yXTsKICAgICAgICAgICAgICBpZiAoaW5pdGlhbGl6ZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgaW5BbGxDb25zdHJ1Y3RvcnMgPSBmYWxzZTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3dpdGNoIChpbml0aWFsaXplci5raW5kKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgSW5pdGlhbGl6ZXJLaW5kLmRpcmVjdDoKICAgICAgICAgICAgICAgICAgICBpbmNsdWRlSW5pdGlhbFZhbHVlKGluaXRpYWxpemVyLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgY2FzZSBJbml0aWFsaXplcktpbmQucG9zaXRpb25hbDoKICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbGl6ZXIuaW5kZXggPj0KICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlZFBhcmFtZXRlcnMucG9zaXRpb25hbFBhcmFtZXRlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVJbml0aWFsVmFsdWUoaW5pdGlhbGl6ZXIudmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBpc1Rvb0NvbXBsZXggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgY2FzZSBJbml0aWFsaXplcktpbmQubmFtZWQ6CiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnZva2VkUGFyYW1ldGVycy5uYW1lZFBhcmFtZXRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zKGluaXRpYWxpemVyLm5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlSW5pdGlhbFZhbHVlKGluaXRpYWxpemVyLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgaXNUb29Db21wbGV4ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGNhc2UgSW5pdGlhbGl6ZXJLaW5kLmNvbXBsZXg6CiAgICAgICAgICAgICAgICAgICAgaXNUb29Db21wbGV4ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFpbkFsbENvbnN0cnVjdG9ycykgewogICAgICAgICAgICAgIGluY2x1ZGVJbml0aWFsVmFsdWUoZGF0YS5pbml0aWFsVmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaXNUb29Db21wbGV4ICYmIGluaXRpYWxWYWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgQ29uc3RhbnRWYWx1ZSB2YWx1ZSA9IG1hcC50b0JhY2tlbmRDb25zdGFudChpbml0aWFsVmFsdWUpOwogICAgICAgICAgICAgIGJvb2wgaXNFZmZlY3RpdmVseUNvbnN0YW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgYm9vbCBpc0luaXRpYWxpemVkSW5BbGxvY2F0b3IgPSBmYWxzZTsKICAgICAgICAgICAgICBhc3NlcnQodmFsdWUgIT0gbnVsbCk7CiAgICAgICAgICAgICAgaWYgKCFtZW1iZXJVc2FnZS5oYXNXcml0ZSAmJiBjYW5CZUVsaWRlZChrRmllbGQpKSB7CiAgICAgICAgICAgICAgICBpc0VmZmVjdGl2ZWx5Q29uc3RhbnQgPSB0cnVlOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaXNOdWxsIHx8CiAgICAgICAgICAgICAgICAgIHZhbHVlLmlzSW50IHx8CiAgICAgICAgICAgICAgICAgIHZhbHVlLmlzQm9vbCB8fAogICAgICAgICAgICAgICAgICB2YWx1ZS5pc1N0cmluZykgewogICAgICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyLHNyYSk6IFN1cHBvcnQgbm9uLXByaW1pdGl2ZSBjb25zdGFudHMgaW4KICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRvcnMgd2hlbiBpdCBkb2VzIGNhdXNlIGFsbG9jYXRvcnMgdG8gZGVvcHRpbWl6ZWQKICAgICAgICAgICAgICAgIC8vIGJlY2F1c2Ugb2YgZGVmZXJyZWQgbG9hZGluZy4KICAgICAgICAgICAgICAgIGlzSW5pdGlhbGl6ZWRJbkFsbG9jYXRvciA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGZpZWxkRGF0YVtqRmllbGRdID0gbmV3IEZpZWxkQW5hbHlzaXNEYXRhKAogICAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWU6IHZhbHVlLAogICAgICAgICAgICAgICAgICBpc0VmZmVjdGl2ZWx5RmluYWw6IGlzRWZmZWN0aXZlbHlDb25zdGFudCwKICAgICAgICAgICAgICAgICAgaXNFbGlkZWQ6IGlzRWZmZWN0aXZlbHlDb25zdGFudCwKICAgICAgICAgICAgICAgICAgaXNJbml0aWFsaXplZEluQWxsb2NhdG9yOiBpc0luaXRpYWxpemVkSW5BbGxvY2F0b3IpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwoKICAgIExpc3Q8S0ZpZWxkPiBpbmRlcGVuZGVudEZpZWxkcyA9IFtdOwogICAgTGlzdDxLRmllbGQ+IGRlcGVuZGVudEZpZWxkcyA9IFtdOwoKICAgIGNsb3NlZFdvcmxkLmxpdmVNZW1iZXJVc2FnZQogICAgICAgIC5mb3JFYWNoKChNZW1iZXJFbnRpdHkgbWVtYmVyLCBNZW1iZXJVc2FnZSBtZW1iZXJVc2FnZSkgewogICAgICBpZiAobWVtYmVyLmlzRmllbGQgJiYgIW1lbWJlci5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgICAgU3RhdGljRmllbGREYXRhIHN0YXRpY0ZpZWxkRGF0YSA9CiAgICAgICAgICAgIGNsb3NlZFdvcmxkLmZpZWxkQW5hbHlzaXMuX3N0YXRpY0ZpZWxkRGF0YVttZW1iZXJdOwogICAgICAgIGlmIChzdGF0aWNGaWVsZERhdGEuaGFzRGVwZW5kZW5jaWVzKSB7CiAgICAgICAgICBkZXBlbmRlbnRGaWVsZHMuYWRkKG1lbWJlcik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGluZGVwZW5kZW50RmllbGRzLmFkZChtZW1iZXIpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CgogICAgLy8gRmllbGRzIGFscmVhZHkgcHJvY2Vzc2VkLgogICAgU2V0PEtGaWVsZD4gcHJvY2Vzc2VkRmllbGRzID0ge307CgogICAgLy8gRmllbGRzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuIFVzZSBmb3IgZGV0ZWN0aW5nIGN5Y2xpYyBkZXBlbmRlbmNpZXMuCiAgICBTZXQ8S0ZpZWxkPiBjdXJyZW50RmllbGRzID0ge307CgogICAgLy8gSW5kZXggYXNjcmliZWQgdG8gZWFnZXIgZmllbGRzIHRoYXQgZGVwZW5kIG9uIG90aGVyIGZpZWxkcy4gVGhpcyBpcwogICAgLy8gdXNlZCB0byBzb3J0IHRoZSBmaWVsZCBpbiBlbWlzc2lvbiB0byBlbnN1cmUgdGhhdCB1c2VkIGZpZWxkcyBoYXZlIGJlZW4KICAgIC8vIGluaXRpYWxpemVkIHdoZW4gcmVhZC4KICAgIGludCBlYWdlckNyZWF0aW9uSW5kZXggPSAwOwoKICAgIC8vLyBDb21wdXRlcyB0aGUgW0ZpZWxkQW5hbHlzaXNEYXRhXSBmb3IgdGhlIEpGaWVsZCBjb3JyZXNwb25kaW5nIHRvCiAgICAvLy8gW2tGaWVsZF0uCiAgICAvLy8KICAgIC8vLyBJZiB0aGUgZGF0YSBpcyBjdXJyZW50bHkgYmVlbiBjb21wdXRlZCwgdGhhdCBpcywgW2tGaWVsZF0gaGFzIGEKICAgIC8vLyBjeWNsaWMgZGVwZW5kZW5jeSwgYG51bGxgIGlzIHJldHVybmVkLgogICAgRmllbGRBbmFseXNpc0RhdGEgcHJvY2Vzc0ZpZWxkKEtGaWVsZCBrRmllbGQpIHsKICAgICAgSkZpZWxkIGpGaWVsZCA9IG1hcC50b0JhY2tlbmRNZW1iZXIoa0ZpZWxkKTsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ2FuIHdlIGFzc2VydCB0aGF0IFtqRmllbGRdIGV4aXN0cz8KICAgICAgaWYgKGpGaWVsZCA9PSBudWxsKSByZXR1cm4gbnVsbDsKCiAgICAgIEZpZWxkQW5hbHlzaXNEYXRhIGRhdGEgPSBmaWVsZERhdGFbakZpZWxkXTsKICAgICAgaWYgKHByb2Nlc3NlZEZpZWxkcy5jb250YWlucyhrRmllbGQpKSB7CiAgICAgICAgLy8gV2Ugb25seSBzdG9yZSBkYXRhIGZvciBub24tdHJpdmlhbCBbRmllbGRBbmFseXNpc0RhdGFdLgogICAgICAgIHJldHVybiBkYXRhID8/IGNvbnN0IEZpZWxkQW5hbHlzaXNEYXRhKCk7CiAgICAgIH0KICAgICAgaWYgKGN1cnJlbnRGaWVsZHMuY29udGFpbnMoa0ZpZWxkKSkgewogICAgICAgIC8vIEN5Y2xpYyBkZXBlbmRlbmN5LgogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGN1cnJlbnRGaWVsZHMuYWRkKGtGaWVsZCk7CiAgICAgIE1lbWJlclVzYWdlIG1lbWJlclVzYWdlID0gY2xvc2VkV29ybGQubGl2ZU1lbWJlclVzYWdlW2tGaWVsZF07CiAgICAgIGlmICghbWVtYmVyVXNhZ2UuaGFzUmVhZCAmJiBjYW5CZUVsaWRlZChrRmllbGQpKSB7CiAgICAgICAgZGF0YSA9IGZpZWxkRGF0YVtqRmllbGRdID0gY29uc3QgRmllbGRBbmFseXNpc0RhdGEoaXNFbGlkZWQ6IHRydWUpOwogICAgICB9IGVsc2UgewogICAgICAgIGJvb2wgaXNFZmZlY3RpdmVseUZpbmFsID0gIW1lbWJlclVzYWdlLmhhc1dyaXRlOwogICAgICAgIFN0YXRpY0ZpZWxkRGF0YSBzdGF0aWNGaWVsZERhdGEgPQogICAgICAgICAgICBjbG9zZWRXb3JsZC5maWVsZEFuYWx5c2lzLl9zdGF0aWNGaWVsZERhdGFba0ZpZWxkXTsKICAgICAgICBDb25zdGFudFZhbHVlIHZhbHVlID0gbWFwCiAgICAgICAgICAgIC50b0JhY2tlbmRDb25zdGFudChzdGF0aWNGaWVsZERhdGEuaW5pdGlhbFZhbHVlLCBhbGxvd051bGw6IHRydWUpOwoKICAgICAgICAvLyBJZiB0aGUgZmllbGQgaXMgZWZmZWN0aXZlbHkgZmluYWwgd2l0aCBhIGNvbnN0YW50IGluaXRpYWxpemVyIHdlCiAgICAgICAgLy8gZWxpZGUgdGhlIGZpZWxkLCBpZiBhbGxvd2VkLCBiZWNhdXNlIGl0IGlzIGVmZmVjdGl2ZWx5IGNvbnN0YW50LgogICAgICAgIGJvb2wgaXNFbGlkZWQgPQogICAgICAgICAgICBpc0VmZmVjdGl2ZWx5RmluYWwgJiYgdmFsdWUgIT0gbnVsbCAmJiBjYW5CZUVsaWRlZChrRmllbGQpOwoKICAgICAgICBib29sIGlzRWFnZXI7CgogICAgICAgIC8vIElmIHRoZSBmaWVsZCBpcyBlYWdlciBhbmQgZGVwZW5kZW50IG9uIG90aGVyIGVhZ2VyIGZpZWxkcywKICAgICAgICAvLyBbZWFnZXJGaWVsZERlcGVuZGVuY2llc10gaG9sZHMgdGhlc2UgZmllbGRzIGFuZCBbY3JlYXRpb25JbmRleF0gaXMKICAgICAgICAvLyBnaXZlbiB0aGUgY3JlYXRpb24gb3JkZXIgaW5kZXggdXNlZCB0byBlbnN1cmUgdGhhdCBhbGwgZGVwZW5kZW5jaWVzCiAgICAgICAgLy8gaGF2ZSBiZWVuIGFzc2lnbmVkIHRoZWlyIHZhbHVlcyBiZWZvcmUgdGhpcyBmaWVsZCBpcyBpbml0aWFsaXplZC4KICAgICAgICAvLwogICAgICAgIC8vIFNpbmNlIHdlIG9ubHkgbmVlZCB0aGUgdmFsdWVzIG9mIFtlYWdlckZpZWxkRGVwZW5kZW5jaWVzXSBmb3IgdGVzdGluZwogICAgICAgIC8vIGFuZCBvbmx5IHRoZSBub24tZW1wdGluZXNzIGZvciBkZXRlcm1pbmluZyB0aGUgbmVlZCBmb3IgY3JlYXRpb24KICAgICAgICAvLyBvcmRlciBpbmRpY2VzLCBbZWFnZXJGaWVsZERlcGVuZGVuY2llc10gaXMgbm9uLW51bGwgaWYgdGhlIGZpZWxkIGhhcwogICAgICAgIC8vIGRlcGVuZGVuY2llcyBidXQgb25seSBob2xkIHRoZXNlIHdoZW4gW3JldGFpbkRhdGFGb3JUZXN0aW5nXSBpcwogICAgICAgIC8vIGB0cnVlYC4KICAgICAgICBMaXN0PEZpZWxkRW50aXR5PiBlYWdlckZpZWxkRGVwZW5kZW5jaWVzOwogICAgICAgIGludCBjcmVhdGlvbkluZGV4ID0gbnVsbDsKCiAgICAgICAgaWYgKGlzRWxpZGVkKSB7CiAgICAgICAgICAvLyBJZiB0aGUgZmllbGQgaXMgZWxpZGVkIGl0IG5lZWRzIG5vIGluaXRpYWxpemVyIGFuZCBpcyB0aGVyZWZvcmUKICAgICAgICAgIC8vIG5vdCBlYWdlci4KICAgICAgICAgIGlzRWFnZXIgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gSWYgdGhlIGZpZWxkIGhhcyBhIGNvbnN0YW50IGluaXRpYWxpemVyIHdlIGtub3cgaXQgY2FuIGJlCiAgICAgICAgICAvLyBpbml0aWFsaXplZCBlYWdlcmx5LgogICAgICAgICAgLy8KICAgICAgICAgIC8vIElkZWFsbHkgdGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgYXMKICAgICAgICAgIC8vIGBzdGF0aWNGaWVsZERhdGEuY29tcGxleGl0eS5pc0NvbnN0YW50YCBidXQgY3VycmVudGx5IHRoZSBjb25zdGFudAogICAgICAgICAgLy8gZXZhbHVhdG9yIGhhbmRsZXMgY2FzZXMgdGhhdCB0aGUgYW5hbHlzaXMgZG9lc24ndCwgc28gd2UgdXNlIHRoZQogICAgICAgICAgLy8gYmV0dGVyIHJlc3VsdC4KICAgICAgICAgIGlzRWFnZXIgPSB2YWx1ZSAhPSBudWxsOwogICAgICAgICAgaWYgKCFpc0VhZ2VyKSB7CiAgICAgICAgICAgIC8vIFRoZSBmaWVsZCBtaWdodCBiZSBlYWdlciBkZXBlbmRpbmcgb24gdGhlIGluaXRpYWxpemVyIGNvbXBsZXhpdHkKICAgICAgICAgICAgLy8gYW5kIGl0cyBkZXBlbmRlbmNpZXMuCiAgICAgICAgICAgIEluaXRpYWxpemVyQ29tcGxleGl0eSBjb21wbGV4aXR5ID0gc3RhdGljRmllbGREYXRhLmNvbXBsZXhpdHk7CiAgICAgICAgICAgIGlzRWFnZXIgPSBjb21wbGV4aXR5Py5pc0VhZ2VyID8/IGZhbHNlOwogICAgICAgICAgICBpZiAoaXNFYWdlciAmJiBjb21wbGV4aXR5LmZpZWxkcyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgZm9yIChpci5GaWVsZCBub2RlIGluIGNvbXBsZXhpdHkuZmllbGRzKSB7CiAgICAgICAgICAgICAgICBLRmllbGQgb3RoZXJGaWVsZCA9IGNsb3NlZFdvcmxkLmVsZW1lbnRNYXAuZ2V0RmllbGQobm9kZSk7CiAgICAgICAgICAgICAgICBGaWVsZEFuYWx5c2lzRGF0YSBvdGhlckRhdGEgPSBwcm9jZXNzRmllbGQob3RoZXJGaWVsZCk7CiAgICAgICAgICAgICAgICBpZiAob3RoZXJEYXRhID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgLy8gQ3ljbGljIGRlcGVuZGVuY3kgb24gW290aGVyRmllbGRdLgogICAgICAgICAgICAgICAgICBpc0VhZ2VyID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG90aGVyRGF0YS5pc0xhenkpIHsKICAgICAgICAgICAgICAgICAgLy8gW290aGVyRmllbGRdIG5lZWRzIGxhenkgaW5pdGlhbGl6YXRpb24uCiAgICAgICAgICAgICAgICAgIGlzRWFnZXIgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIW90aGVyRGF0YS5pc0VmZmVjdGl2ZWx5RmluYWwpIHsKICAgICAgICAgICAgICAgICAgLy8gW290aGVyRmllbGRdIG1pZ2h0IG5vdCBob2xkIGl0cyBpbml0aWFsIHZhbHVlIHdoZW4gdGhpcyBmaWVsZAogICAgICAgICAgICAgICAgICAvLyBpcyBhY2Nlc3NlZCB0aGUgZmlyc3QgdGltZSwgc28gd2UgbmVlZCB0byBpbml0aWFsaXplIHRoaXMKICAgICAgICAgICAgICAgICAgLy8gZmllbGQgbGF6aWx5LgogICAgICAgICAgICAgICAgICBpc0VhZ2VyID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFvdGhlckRhdGEuaXNFZmZlY3RpdmVseUNvbnN0YW50KSB7CiAgICAgICAgICAgICAgICAgIGVhZ2VyRmllbGREZXBlbmRlbmNpZXMgPz89IFtdOwogICAgICAgICAgICAgICAgICBpZiAocmV0YWluRGF0YUZvclRlc3RpbmcpIHsKICAgICAgICAgICAgICAgICAgICBlYWdlckZpZWxkRGVwZW5kZW5jaWVzLmFkZChtYXAudG9CYWNrZW5kTWVtYmVyKG90aGVyRmllbGQpKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIGlmIChpc0VhZ2VyICYmIGVhZ2VyRmllbGREZXBlbmRlbmNpZXMgIT0gbnVsbCkgewogICAgICAgICAgICBjcmVhdGlvbkluZGV4ID0gZWFnZXJDcmVhdGlvbkluZGV4Kys7CiAgICAgICAgICAgIGlmICghcmV0YWluRGF0YUZvclRlc3RpbmcpIHsKICAgICAgICAgICAgICBlYWdlckZpZWxkRGVwZW5kZW5jaWVzID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZWFnZXJGaWVsZERlcGVuZGVuY2llcyA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBkYXRhID0gZmllbGREYXRhW2pGaWVsZF0gPSBuZXcgRmllbGRBbmFseXNpc0RhdGEoCiAgICAgICAgICAgIGluaXRpYWxWYWx1ZTogdmFsdWUsCiAgICAgICAgICAgIGlzRWZmZWN0aXZlbHlGaW5hbDogaXNFZmZlY3RpdmVseUZpbmFsLAogICAgICAgICAgICBpc0VsaWRlZDogaXNFbGlkZWQsCiAgICAgICAgICAgIGlzRWFnZXI6IGlzRWFnZXIsCiAgICAgICAgICAgIGVhZ2VyQ3JlYXRpb25JbmRleDogY3JlYXRpb25JbmRleCwKICAgICAgICAgICAgZWFnZXJGaWVsZERlcGVuZGVuY2llc0ZvclRlc3Rpbmc6IGVhZ2VyRmllbGREZXBlbmRlbmNpZXMpOwogICAgICB9CgogICAgICBjdXJyZW50RmllbGRzLnJlbW92ZShrRmllbGQpOwogICAgICBwcm9jZXNzZWRGaWVsZHMuYWRkKGtGaWVsZCk7CiAgICAgIHJldHVybiBkYXRhOwogICAgfQoKICAgIC8vIFByb2Nlc3MgaW5kZXBlbmRlbnQgZmllbGRzIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIuIFRoZSBlbWl0dGVyIHNvcnRzCiAgICAvLyB0aGVzZSBsYXRlci4KICAgIGluZGVwZW5kZW50RmllbGRzLmZvckVhY2gocHJvY2Vzc0ZpZWxkKTsKCiAgICAvLyBQcm9jZXNzIGRlcGVuZGVudCBmaWVsZHMgaW4gZGVjbGFyYXRpb24gb3JkZXIgdG8gbWFrZSBhc2NyaWJlZCBjcmVhdGlvbgogICAgLy8gaW5kaWNlcyBzdGFibGUuIFRoZSBlbWl0dGVyIHVzZXMgdGhlIGNyZWF0aW9uIGluZGljZXMgZm9yIHNvcnRpbmcKICAgIC8vIGRlcGVuZGVudCBmaWVsZHMuCiAgICBkZXBlbmRlbnRGaWVsZHMuc29ydCgoS0ZpZWxkIGEsIEtGaWVsZCBiKSB7CiAgICAgIGludCByZXN1bHQgPQogICAgICAgICAgY29tcGFyZUxpYnJhcmllc1VyaXMoYS5saWJyYXJ5LmNhbm9uaWNhbFVyaSwgYi5saWJyYXJ5LmNhbm9uaWNhbFVyaSk7CiAgICAgIGlmIChyZXN1bHQgIT0gMCkgcmV0dXJuIHJlc3VsdDsKICAgICAgaXIuTG9jYXRpb24gYUxvY2F0aW9uID0gY2xvc2VkV29ybGQuZWxlbWVudE1hcC5nZXRNZW1iZXJOb2RlKGEpLmxvY2F0aW9uOwogICAgICBpci5Mb2NhdGlvbiBiTG9jYXRpb24gPSBjbG9zZWRXb3JsZC5lbGVtZW50TWFwLmdldE1lbWJlck5vZGUoYikubG9jYXRpb247CiAgICAgIHJlc3VsdCA9IGNvbXBhcmVTb3VyY2VVcmlzKGFMb2NhdGlvbi5maWxlLCBiTG9jYXRpb24uZmlsZSk7CiAgICAgIGlmIChyZXN1bHQgIT0gMCkgcmV0dXJuIHJlc3VsdDsKICAgICAgcmVzdWx0ID0gYUxvY2F0aW9uLmxpbmUuY29tcGFyZVRvKGJMb2NhdGlvbi5saW5lKTsKICAgICAgaWYgKHJlc3VsdCAhPSAwKSByZXR1cm4gcmVzdWx0OwogICAgICByZXR1cm4gYUxvY2F0aW9uLmNvbHVtbi5jb21wYXJlVG8oYkxvY2F0aW9uLmNvbHVtbik7CiAgICB9KTsKCiAgICBkZXBlbmRlbnRGaWVsZHMuZm9yRWFjaChwcm9jZXNzRmllbGQpOwoKICAgIHJldHVybiBuZXcgSkZpZWxkQW5hbHlzaXMuXyhmaWVsZERhdGEpOwogIH0KCiAgLy8gVE9ETyhzcmEpOiBBZGQgd2F5IHRvIGxldCBpbmplY3RlZCBmaWVsZHMgYmUgaW5pdGlhbGl6ZWQgdG8gYSBjb25zdGFudCBpbgogIC8vIGFsbG9jYXRvci4KCiAgRmllbGRBbmFseXNpc0RhdGEgZ2V0RmllbGREYXRhKEpGaWVsZCBmaWVsZCkgewogICAgcmV0dXJuIF9maWVsZERhdGFbZmllbGRdID8/IGNvbnN0IEZpZWxkQW5hbHlzaXNEYXRhKCk7CiAgfQp9CgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNZXJnZSB0aGlzIGludG8gW0ZpZWxkRGF0YV0uCmNsYXNzIEZpZWxkQW5hbHlzaXNEYXRhIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdmaWVsZC1hbmFseXNpcy1kYXRhJzsKCiAgZmluYWwgQ29uc3RhbnRWYWx1ZSBpbml0aWFsVmFsdWU7CiAgZmluYWwgYm9vbCBpc0luaXRpYWxpemVkSW5BbGxvY2F0b3I7CiAgZmluYWwgYm9vbCBpc0VmZmVjdGl2ZWx5RmluYWw7CiAgZmluYWwgYm9vbCBpc0VsaWRlZDsKCiAgLy8vIElmIGB0cnVlYCB0aGUgZmllbGQgaXMgbm90IGVmZmVjdGl2ZWx5IGNvbnN0YW50IGJ1dCB0aGUgaW5pdGlhbGl6ZXIgY2FuIGJlCiAgLy8vIGdlbmVyYXRlZCBlYWdlcmx5IHdpdGhvdXQgdGhlIG5lZWQgZm9yIGxhenkgaW5pdGlhbGl6YXRpb24gd3JhcHBlci4KICBmaW5hbCBib29sIGlzRWFnZXI7CgogIC8vLyBJbmRleCBhc2NyaWJlZCB0byBlYWdlciBmaWVsZHMgdGhhdCBkZXBlbmQgb24gb3RoZXIgZmllbGRzLiBUaGlzIGlzCiAgLy8vIHVzZWQgdG8gc29ydCB0aGUgZmllbGQgaW4gZW1pc3Npb24gdG8gZW5zdXJlIHRoYXQgdXNlZCBmaWVsZHMgaGF2ZSBiZWVuCiAgLy8vIGluaXRpYWxpemVkIHdoZW4gcmVhZC4KICBmaW5hbCBpbnQgZWFnZXJDcmVhdGlvbkluZGV4OwoKICBmaW5hbCBMaXN0PEZpZWxkRW50aXR5PiBlYWdlckZpZWxkRGVwZW5kZW5jaWVzRm9yVGVzdGluZzsKCiAgY29uc3QgRmllbGRBbmFseXNpc0RhdGEoCiAgICAgIHt0aGlzLmluaXRpYWxWYWx1ZSwKICAgICAgdGhpcy5pc0luaXRpYWxpemVkSW5BbGxvY2F0b3I6IGZhbHNlLAogICAgICB0aGlzLmlzRWZmZWN0aXZlbHlGaW5hbDogZmFsc2UsCiAgICAgIHRoaXMuaXNFbGlkZWQ6IGZhbHNlLAogICAgICB0aGlzLmlzRWFnZXI6IGZhbHNlLAogICAgICB0aGlzLmVhZ2VyQ3JlYXRpb25JbmRleDogbnVsbCwKICAgICAgdGhpcy5lYWdlckZpZWxkRGVwZW5kZW5jaWVzRm9yVGVzdGluZzogbnVsbH0pOwoKICBmYWN0b3J5IEZpZWxkQW5hbHlzaXNEYXRhLmZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKCiAgICBDb25zdGFudFZhbHVlIGluaXRpYWxWYWx1ZSA9IHNvdXJjZS5yZWFkQ29uc3RhbnRPck51bGwoKTsKICAgIGJvb2wgaXNJbml0aWFsaXplZEluQWxsb2NhdG9yID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBib29sIGlzRWZmZWN0aXZlbHlGaW5hbCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgYm9vbCBpc0VsaWRlZCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgYm9vbCBpc0VhZ2VyID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBpbnQgZWFnZXJDcmVhdGlvbkluZGV4ID0gc291cmNlLnJlYWRJbnRPck51bGwoKTsKICAgIExpc3Q8RmllbGRFbnRpdHk+IGVhZ2VyRmllbGREZXBlbmRlbmNpZXMgPQogICAgICAgIHNvdXJjZS5yZWFkTWVtYmVyczxGaWVsZEVudGl0eT4oZW1wdHlBc051bGw6IHRydWUpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBGaWVsZEFuYWx5c2lzRGF0YSgKICAgICAgICBpbml0aWFsVmFsdWU6IGluaXRpYWxWYWx1ZSwKICAgICAgICBpc0luaXRpYWxpemVkSW5BbGxvY2F0b3I6IGlzSW5pdGlhbGl6ZWRJbkFsbG9jYXRvciwKICAgICAgICBpc0VmZmVjdGl2ZWx5RmluYWw6IGlzRWZmZWN0aXZlbHlGaW5hbCwKICAgICAgICBpc0VsaWRlZDogaXNFbGlkZWQsCiAgICAgICAgaXNFYWdlcjogaXNFYWdlciwKICAgICAgICBlYWdlckNyZWF0aW9uSW5kZXg6IGVhZ2VyQ3JlYXRpb25JbmRleCwKICAgICAgICBlYWdlckZpZWxkRGVwZW5kZW5jaWVzRm9yVGVzdGluZzogZWFnZXJGaWVsZERlcGVuZGVuY2llcyk7CiAgfQoKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlQ29uc3RhbnRPck51bGwoaW5pdGlhbFZhbHVlKTsKICAgIHNpbmsud3JpdGVCb29sKGlzSW5pdGlhbGl6ZWRJbkFsbG9jYXRvcik7CiAgICBzaW5rLndyaXRlQm9vbChpc0VmZmVjdGl2ZWx5RmluYWwpOwogICAgc2luay53cml0ZUJvb2woaXNFbGlkZWQpOwogICAgc2luay53cml0ZUJvb2woaXNFYWdlcik7CiAgICBzaW5rLndyaXRlSW50T3JOdWxsKGVhZ2VyQ3JlYXRpb25JbmRleCk7CiAgICBzaW5rLndyaXRlTWVtYmVycyhlYWdlckZpZWxkRGVwZW5kZW5jaWVzRm9yVGVzdGluZywgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICAvLy8gSWYgYHRydWVgIHRoZSBpbml0aWFsaXplciBmb3IgdGhpcyBmaWVsZCByZXF1aXJlcyBhIGxhenkgaW5pdGlhbGl6YXRpb24KICAvLy8gd3JhcHBlci4KICBib29sIGdldCBpc0xhenkgPT4gaW5pdGlhbFZhbHVlID09IG51bGwgJiYgIWlzRWFnZXI7CgogIGJvb2wgZ2V0IGlzRWZmZWN0aXZlbHlDb25zdGFudCA9PgogICAgICBpc0VmZmVjdGl2ZWx5RmluYWwgJiYgaXNFbGlkZWQgJiYgaW5pdGlhbFZhbHVlICE9IG51bGw7CgogIENvbnN0YW50VmFsdWUgZ2V0IGNvbnN0YW50VmFsdWUgPT4gaXNFZmZlY3RpdmVseUZpbmFsID8gaW5pdGlhbFZhbHVlIDogbnVsbDsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4KICAgICAgJ0ZpZWxkQW5hbHlzaXNEYXRhKGluaXRpYWxWYWx1ZT0ke2luaXRpYWxWYWx1ZT8udG9TdHJ1Y3R1cmVkVGV4dCgpfSwnCiAgICAgICdpc0luaXRpYWxpemVkSW5BbGxvY2F0b3I9JGlzSW5pdGlhbGl6ZWRJbkFsbG9jYXRvciwnCiAgICAgICdpc0VmZmVjdGl2ZWx5RmluYWw9JGlzRWZmZWN0aXZlbHlGaW5hbCxpc0VsaWRlZD0kaXNFbGlkZWQsJwogICAgICAnaXNFYWdlcj0kaXNFYWdlcixlYWdlckNyZWF0aW9uSW5kZXg9JGVhZ2VyQ3JlYXRpb25JbmRleCwnCiAgICAgICdlYWdlckZpZWxkRGVwZW5kZW5jaWVzPSRlYWdlckZpZWxkRGVwZW5kZW5jaWVzRm9yVGVzdGluZyknOwp9CoJ7AE5OPAEoARkjJCgjMCwlKUUmGi4oARYETU1NTk8BSFBLThIDHwMXKAEwPAE4MQFNHjI7ASovLy0BPjRFNy88CAYBQVEsRTIfQh5MATkWDAFGM0w7Q0YwPxtOIk0+KywpSSVLEhAVGUskPissKUklTBIQDgxECggGQQQBTTYxQzwuFAZMLEYEATs+BAE/JAQCARIpLgEwAgEYJCoBNwFPAgEWJDoBJAEMF0glAgEXCg4JCwIBFB4TFR0BIScWFQExKxUBKyYWAR4oFhUWARkUIyknNSI0JBQGOQQBDCICARdIHS4BUAE4ASUBPC00FztMFSwEATIoFRlNEwQBUSE4ASpBOQYBKTpINR4SCgFQPwFHJCVJDBErKCcBPCgqJjIlJRAOAUcBK0ciFxABLTwuMhoQNUg3PAFIKSsXLC88GzMtQj4dKxYbLjs3Ph0rFhswKRsSEA4mNg45STI1JUIuKSEiJE9LMDEQOSc9M0cODAoKCAEpJwEgQjgqQC8nESkKCAgBISYBUCQBS08eIAFJEghILzQzQicBMi5DMggsHhUIIUU5TA85KkAiTwFMTBhIARYBRk5PTQtRTFBLEzIiARhNGBsRRyINMFBOHCMaUCVLNDg5S0gpOCMZEig9IxkSNVNPIyMZEjgxLlEUEhAODAE7MiktDhMrDAoBOiE0IB4vRwgBJCMTBgFMFC0BT0kZMBNQJlBQQiY5JjsIASsBLAQBTxABMTsEAgE1GjMBJCchFwFRShYBSk4dIAE8ARsaLCYcGyU1AUAXAT43MScmNS88FSIkPDAcGjBDBAEoFSwuKB4dLUoTBAFODzcBJD4BTwEMF0w8Q0FDAgEzcGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9maWVsZF9hbmFseXNpcy5kYXJ0NHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3V0aWwvc2lua19hZGFwdGVyLmRhcnSBK2ltcG9ydCAnLi4vLi4vY29tcGlsZXJfbmV3LmRhcnQnIGFzIGFwaTsKCmNsYXNzIEJpbmFyeU91dHB1dFNpbmtBZGFwdGVyIGltcGxlbWVudHMgU2luazxMaXN0PGludD4+IHsKICBhcGkuQmluYXJ5T3V0cHV0U2luayBvdXRwdXQ7CgogIEJpbmFyeU91dHB1dFNpbmtBZGFwdGVyKHRoaXMub3V0cHV0KTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGRhdGEpIHsKICAgIG91dHB1dC53cml0ZShkYXRhKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2xvc2UoKSB7CiAgICBvdXRwdXQuY2xvc2UoKTsKICB9Cn0KEwApATsfASgBDB0YBAEMERQEAgErcGFja2FnZTpjb21waWxlci9zcmMvdXRpbC9zaW5rX2FkYXB0ZXIuZGFydDZzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL2VucXVldWVyLmRhcnSmOy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuanMuZW5xdWV1ZTsKCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJyBzaG93IFF1ZXVlOwoKaW1wb3J0ICcuLi9jb21tb24vdGFza3MuZGFydCcgc2hvdyBDb21waWxlclRhc2s7CmltcG9ydCAnLi4vY29tbW9uL3dvcmsuZGFydCcgc2hvdyBXb3JrSXRlbTsKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgRWxlbWVudEVudmlyb25tZW50OwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2VucXVldWUuZGFydCc7CmltcG9ydCAnLi4vb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jb2RlZ2VuX3dvcmxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvbWVtYmVyX3VzYWdlLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3VzZS5kYXJ0JwogICAgc2hvdwogICAgICAgIENvbnN0YW50VXNlLAogICAgICAgIER5bmFtaWNVc2UsCiAgICAgICAgU3RhdGljVXNlLAogICAgICAgIFN0YXRpY1VzZUtpbmQsCiAgICAgICAgVHlwZVVzZSwKICAgICAgICBUeXBlVXNlS2luZDsKaW1wb3J0ICcuLi91bml2ZXJzZS93b3JsZF9pbXBhY3QuZGFydCcKICAgIHNob3cgSW1wYWN0VXNlQ2FzZSwgV29ybGRJbXBhY3QsIFdvcmxkSW1wYWN0VmlzaXRvcjsKaW1wb3J0ICcuLi91dGlsL2VudW1zZXQuZGFydCc7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnIHNob3cgU2V0bGV0OwoKLy8vIFtFbnF1ZXVlcl0gd2hpY2ggaXMgc3BlY2lmaWMgdG8gY29kZSBnZW5lcmF0aW9uLgpjbGFzcyBDb2RlZ2VuRW5xdWV1ZXIgZXh0ZW5kcyBFbnF1ZXVlckltcGwgewogIGZpbmFsIFN0cmluZyBuYW1lOwogIFNldDxDbGFzc0VudGl0eT4gX3JlY2VudENsYXNzZXMgPSBuZXcgU2V0bGV0PENsYXNzRW50aXR5PigpOwogIGJvb2wgX3JlY2VudENvbnN0YW50cyA9IGZhbHNlOwogIGZpbmFsIENvZGVnZW5Xb3JsZEJ1aWxkZXJJbXBsIF93b3JsZEJ1aWxkZXI7CiAgZmluYWwgV29ya0l0ZW1CdWlsZGVyIF93b3JrSXRlbUJ1aWxkZXI7CgogIEBvdmVycmlkZQogIGJvb2wgcXVldWVJc0Nsb3NlZCA9IGZhbHNlOwogIEBvdmVycmlkZQogIGZpbmFsIENvbXBpbGVyVGFzayB0YXNrOwogIEBvdmVycmlkZQogIGZpbmFsIEVucXVldWVyTGlzdGVuZXIgbGlzdGVuZXI7CiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwoKICBXb3JsZEltcGFjdFZpc2l0b3IgX2ltcGFjdFZpc2l0b3I7CgogIGZpbmFsIFF1ZXVlPFdvcmtJdGVtPiBfcXVldWUgPSBuZXcgUXVldWU8V29ya0l0ZW0+KCk7CgogIC8vLyBBbGwgZGVjbGFyYXRpb24gZWxlbWVudHMgdGhhdCBoYXZlIGJlZW4gcHJvY2Vzc2VkIGJ5IGNvZGVnZW4uCiAgZmluYWwgU2V0PE1lbWJlckVudGl0eT4gX3Byb2Nlc3NlZEVudGl0aWVzID0gbmV3IFNldDxNZW1iZXJFbnRpdHk+KCk7CgogIC8vIElmIG5vdCBgbnVsbGAgdGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgcXVldWUgaGFzIGJlZW4gZW1wdGllZC4gSXQgYWxsb3dzIGZvcgogIC8vIGFwcGx5aW5nIGFkZGl0aW9uYWwgaW1wYWN0cyBiZWZvcmUgcmUtZW1wdHlpbmcgdGhlIHF1ZXVlLgogIHZvaWQgRnVuY3Rpb24oKSBvbkVtcHR5Rm9yVGVzdGluZzsKCiAgc3RhdGljIGNvbnN0IEltcGFjdFVzZUNhc2UgSU1QQUNUX1VTRSA9CiAgICAgIGNvbnN0IEltcGFjdFVzZUNhc2UoJ0NvZGVnZW5FbnF1ZXVlcicpOwoKICBDb2RlZ2VuRW5xdWV1ZXIodGhpcy50YXNrLCB0aGlzLl9vcHRpb25zLCB0aGlzLl93b3JsZEJ1aWxkZXIsCiAgICAgIHRoaXMuX3dvcmtJdGVtQnVpbGRlciwgdGhpcy5saXN0ZW5lcikKICAgICAgOiB0aGlzLm5hbWUgPSAnY29kZWdlbiBlbnF1ZXVlcicgewogICAgX2ltcGFjdFZpc2l0b3IgPSBuZXcgRW5xdWV1ZXJJbXBsSW1wYWN0VmlzaXRvcih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIENvZGVnZW5Xb3JsZEJ1aWxkZXIgZ2V0IHdvcmxkQnVpbGRlciA9PiBfd29ybGRCdWlsZGVyOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBxdWV1ZUlzRW1wdHkgPT4gX3F1ZXVlLmlzRW1wdHk7CgogIEBvdmVycmlkZQogIHZvaWQgY2hlY2tRdWV1ZUlzRW1wdHkoKSB7CiAgICBpZiAoX3F1ZXVlLmlzTm90RW1wdHkpIHsKICAgICAgZmFpbGVkQXQoX3F1ZXVlLmZpcnN0LmVsZW1lbnQsICIkbmFtZSBxdWV1ZSBpcyBub3QgZW1wdHkuIik7CiAgICB9CiAgfQoKICAvLy8gUmV0dXJucyBbOnRydWU6XSBpZiB0aGlzIGVucXVldWVyIGlzIHRoZSByZXNvbHV0aW9uIGVucXVldWVyLgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUmVzb2x1dGlvblF1ZXVlID0+IGZhbHNlOwoKICAvLy8gQ3JlYXRlIGEgW1dvcmtJdGVtXSBmb3IgW2VudGl0eV0gYW5kIGFkZCBpdCB0byB0aGUgd29yayBsaXN0IGlmIGl0IGhhcyBub3QKICAvLy8gYWxyZWFkeSBiZWVuIHByb2Nlc3NlZC4KICB2b2lkIF9hZGRUb1dvcmtMaXN0KE1lbWJlckVudGl0eSBlbnRpdHkpIHsKICAgIGlmIChfcHJvY2Vzc2VkRW50aXRpZXMuY29udGFpbnMoZW50aXR5KSkgcmV0dXJuOwoKICAgIFdvcmtJdGVtIHdvcmtJdGVtID0gX3dvcmtJdGVtQnVpbGRlci5jcmVhdGVXb3JrSXRlbShlbnRpdHkpOwogICAgaWYgKHdvcmtJdGVtID09IG51bGwpIHJldHVybjsKCiAgICBpZiAocXVldWVJc0Nsb3NlZCkgewogICAgICBmYWlsZWRBdChlbnRpdHksICJDb2RlZ2VuIHdvcmsgbGlzdCBpcyBjbG9zZWQuIFRyeWluZyB0byBhZGQgJGVudGl0eSIpOwogICAgfQoKICAgIGFwcGx5SW1wYWN0KGxpc3RlbmVyLnJlZ2lzdGVyVXNlZEVsZW1lbnQoZW50aXR5KSk7CiAgICBfcXVldWUuYWRkKHdvcmtJdGVtKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYXBwbHlJbXBhY3QoV29ybGRJbXBhY3Qgd29ybGRJbXBhY3QsIHt2YXIgaW1wYWN0U291cmNlfSkgewogICAgaWYgKHdvcmxkSW1wYWN0LmlzRW1wdHkpIHJldHVybjsKICAgIGltcGFjdFN0cmF0ZWd5LnZpc2l0SW1wYWN0KAogICAgICAgIGltcGFjdFNvdXJjZSwgd29ybGRJbXBhY3QsIF9pbXBhY3RWaXNpdG9yLCBpbXBhY3RVc2UpOwogIH0KCiAgdm9pZCBfcmVnaXN0ZXJJbnN0YW50aWF0ZWRUeXBlKEludGVyZmFjZVR5cGUgdHlwZSwKICAgICAge2Jvb2wgbmF0aXZlVXNhZ2U6IGZhbHNlfSkgewogICAgdGFzay5tZWFzdXJlKCgpIHsKICAgICAgX3dvcmxkQnVpbGRlci5yZWdpc3RlclR5cGVJbnN0YW50aWF0aW9uKHR5cGUsIF9hcHBseUNsYXNzVXNlKTsKICAgICAgbGlzdGVuZXIucmVnaXN0ZXJJbnN0YW50aWF0ZWRUeXBlKHR5cGUsIG5hdGl2ZVVzYWdlOiBuYXRpdmVVc2FnZSk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY2hlY2tOb0VucXVldWVkSW52b2tlZEluc3RhbmNlTWV0aG9kcygKICAgICAgRWxlbWVudEVudmlyb25tZW50IGVsZW1lbnRFbnZpcm9ubWVudCkgewogICAgcmV0dXJuIGNoZWNrRW5xdWV1ZXJDb25zaXN0ZW5jeShlbGVtZW50RW52aXJvbm1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjaGVja0NsYXNzKENsYXNzRW50aXR5IGNscykgewogICAgX3dvcmxkQnVpbGRlci5wcm9jZXNzQ2xhc3NNZW1iZXJzKGNscywKICAgICAgICAoTWVtYmVyRW50aXR5IG1lbWJlciwgRW51bVNldDxNZW1iZXJVc2U+IHVzZVNldCkgewogICAgICBpZiAodXNlU2V0LmlzTm90RW1wdHkpIHsKICAgICAgICBmYWlsZWRBdChtZW1iZXIsCiAgICAgICAgICAgICdVbmVucXVldWVkIHVzZSBvZiAkbWVtYmVyOiAke3VzZVNldC5pdGVyYWJsZShNZW1iZXJVc2UudmFsdWVzKX0nKTsKICAgICAgfQogICAgfSwgZHJ5UnVuOiB0cnVlKTsKICB9CgogIC8vLyBDYWxsYmFjayBmb3IgYXBwbHlpbmcgdGhlIHVzZSBvZiBhIFtjbHNdLgogIHZvaWQgX2FwcGx5Q2xhc3NVc2UoQ2xhc3NFbnRpdHkgY2xzLCBFbnVtU2V0PENsYXNzVXNlPiB1c2VTZXQpIHsKICAgIGlmICh1c2VTZXQuY29udGFpbnMoQ2xhc3NVc2UuSU5TVEFOVElBVEVEKSkgewogICAgICBfcmVjZW50Q2xhc3Nlcy5hZGQoY2xzKTsKICAgICAgX3dvcmxkQnVpbGRlci5wcm9jZXNzQ2xhc3NNZW1iZXJzKGNscywgX2FwcGx5TWVtYmVyVXNlKTsKICAgICAgLy8gV2Ugb25seSB0ZWxsIHRoZSBiYWNrZW5kIG9uY2UgdGhhdCBbY2xzXSB3YXMgaW5zdGFudGlhdGVkLCBzbwogICAgICAvLyBhbnkgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgbXVzdCBiZSB0cmVhdGVkIGFzIGdsb2JhbAogICAgICAvLyBkZXBlbmRlbmNpZXMuCiAgICAgIGFwcGx5SW1wYWN0KGxpc3RlbmVyLnJlZ2lzdGVySW5zdGFudGlhdGVkQ2xhc3MoY2xzKSk7CiAgICB9CiAgICBpZiAodXNlU2V0LmNvbnRhaW5zKENsYXNzVXNlLklNUExFTUVOVEVEKSkgewogICAgICBhcHBseUltcGFjdChsaXN0ZW5lci5yZWdpc3RlckltcGxlbWVudGVkQ2xhc3MoY2xzKSk7CiAgICB9CiAgfQoKICAvLy8gQ2FsbGJhY2sgZm9yIGFwcGx5aW5nIHRoZSB1c2Ugb2YgYSBbbWVtYmVyXS4KICB2b2lkIF9hcHBseU1lbWJlclVzZShNZW1iZXJFbnRpdHkgbWVtYmVyLCBFbnVtU2V0PE1lbWJlclVzZT4gdXNlU2V0KSB7CiAgICBpZiAodXNlU2V0LmNvbnRhaW5zKE1lbWJlclVzZS5OT1JNQUwpKSB7CiAgICAgIF9hZGRUb1dvcmtMaXN0KG1lbWJlcik7CiAgICB9CiAgICBpZiAodXNlU2V0LmNvbnRhaW5zKE1lbWJlclVzZS5DTE9TVVJJWkVfSU5TVEFOQ0UpKSB7CiAgICAgIF9yZWdpc3RlckNsb3N1cml6ZWRNZW1iZXIobWVtYmVyKTsKICAgIH0KICAgIGlmICh1c2VTZXQuY29udGFpbnMoTWVtYmVyVXNlLkNMT1NVUklaRV9TVEFUSUMpKSB7CiAgICAgIGFwcGx5SW1wYWN0KGxpc3RlbmVyLnJlZ2lzdGVyR2V0T2ZTdGF0aWNGdW5jdGlvbigpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJvY2Vzc0R5bmFtaWNVc2UoRHluYW1pY1VzZSBkeW5hbWljVXNlKSB7CiAgICB0YXNrLm1lYXN1cmUoKCkgewogICAgICBfd29ybGRCdWlsZGVyLnJlZ2lzdGVyRHluYW1pY1VzZShkeW5hbWljVXNlLCBfYXBwbHlNZW1iZXJVc2UpOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHByb2Nlc3NTdGF0aWNVc2UoU3RhdGljVXNlIHN0YXRpY1VzZSkgewogICAgX3dvcmxkQnVpbGRlci5yZWdpc3RlclN0YXRpY1VzZShzdGF0aWNVc2UsIF9hcHBseU1lbWJlclVzZSk7CiAgICBzd2l0Y2ggKHN0YXRpY1VzZS5raW5kKSB7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5DT05TVFJVQ1RPUl9JTlZPS0U6CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5DT05TVF9DT05TVFJVQ1RPUl9JTlZPS0U6CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5SRURJUkVDVElPTjoKICAgICAgICBwcm9jZXNzVHlwZVVzZShuZXcgVHlwZVVzZS5pbnN0YW50aWF0aW9uKHN0YXRpY1VzZS50eXBlKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5JTkxJTklORzoKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTaG91bGQgdGhpcyBiZSB0cmFja2VkIHdpdGggX01lbWJlclVzYWdlID8KICAgICAgICBsaXN0ZW5lci5yZWdpc3RlclVzZWRFbGVtZW50KHN0YXRpY1VzZS5lbGVtZW50KTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBicmVhazsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJvY2Vzc1R5cGVVc2UoVHlwZVVzZSB0eXBlVXNlKSB7CiAgICBEYXJ0VHlwZSB0eXBlID0gdHlwZVVzZS50eXBlOwogICAgc3dpdGNoICh0eXBlVXNlLmtpbmQpIHsKICAgICAgY2FzZSBUeXBlVXNlS2luZC5JTlNUQU5USUFUSU9OOgogICAgICAgIF9yZWdpc3Rlckluc3RhbnRpYXRlZFR5cGUodHlwZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuTkFUSVZFX0lOU1RBTlRJQVRJT046CiAgICAgICAgX3JlZ2lzdGVySW5zdGFudGlhdGVkVHlwZSh0eXBlLCBuYXRpdmVVc2FnZTogdHJ1ZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuSVNfQ0hFQ0s6CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuQ0FUQ0hfVFlQRToKICAgICAgICBfcmVnaXN0ZXJJc0NoZWNrKHR5cGUpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFR5cGVVc2VLaW5kLkFTX0NBU1Q6CiAgICAgICAgaWYgKCFfb3B0aW9ucy5vbWl0QXNDYXN0cykgewogICAgICAgICAgX3JlZ2lzdGVySXNDaGVjayh0eXBlKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuSU1QTElDSVRfQ0FTVDoKICAgICAgICBpZiAoX29wdGlvbnMuaW1wbGljaXREb3duY2FzdENoZWNrUG9saWN5LmlzRW1pdHRlZCkgewogICAgICAgICAgX3JlZ2lzdGVySXNDaGVjayh0eXBlKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuUEFSQU1FVEVSX0NIRUNLOgogICAgICAgIGlmIChfb3B0aW9ucy5wYXJhbWV0ZXJDaGVja1BvbGljeS5pc0VtaXR0ZWQpIHsKICAgICAgICAgIF9yZWdpc3RlcklzQ2hlY2sodHlwZSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFR5cGVVc2VLaW5kLlRZUEVfTElURVJBTDoKICAgICAgICBpZiAodHlwZSBpcyBUeXBlVmFyaWFibGVUeXBlKSB7CiAgICAgICAgICBfd29ybGRCdWlsZGVyLnJlZ2lzdGVyVHlwZVZhcmlhYmxlVHlwZUxpdGVyYWwodHlwZSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFR5cGVVc2VLaW5kLlJUSV9WQUxVRToKICAgICAgICBfd29ybGRCdWlsZGVyLnJlZ2lzdGVyQ29uc3RUeXBlTGl0ZXJhbCh0eXBlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBUeXBlVXNlS2luZC5UWVBFX0FSR1VNRU5UOgogICAgICAgIF93b3JsZEJ1aWxkZXIucmVnaXN0ZXJUeXBlQXJndW1lbnQodHlwZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuQ09OU1RfSU5TVEFOVElBVElPTjoKICAgICAgICBmYWlsZWRBdChDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLCAiVW5leHBlY3RlZCB0eXBlIHVzZTogJHR5cGVVc2UuIik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHByb2Nlc3NDb25zdGFudFVzZShDb25zdGFudFVzZSBjb25zdGFudFVzZSkgewogICAgdGFzay5tZWFzdXJlKCgpIHsKICAgICAgaWYgKF93b3JsZEJ1aWxkZXIucmVnaXN0ZXJDb25zdGFudFVzZShjb25zdGFudFVzZSkpIHsKICAgICAgICBhcHBseUltcGFjdChsaXN0ZW5lci5yZWdpc3RlclVzZWRDb25zdGFudChjb25zdGFudFVzZS52YWx1ZSkpOwogICAgICAgIF9yZWNlbnRDb25zdGFudHMgPSB0cnVlOwogICAgICB9CiAgICB9KTsKICB9CgogIHZvaWQgX3JlZ2lzdGVySXNDaGVjayhEYXJ0VHlwZSB0eXBlKSB7CiAgICBfd29ybGRCdWlsZGVyLnJlZ2lzdGVySXNDaGVjayh0eXBlKTsKICB9CgogIHZvaWQgX3JlZ2lzdGVyQ2xvc3VyaXplZE1lbWJlcihGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQoZWxlbWVudC5pc0luc3RhbmNlTWVtYmVyKTsKICAgIGFwcGx5SW1wYWN0KGxpc3RlbmVyLnJlZ2lzdGVyQ2xvc3VyaXplZE1lbWJlcihlbGVtZW50KSk7CiAgICBfd29ybGRCdWlsZGVyLnJlZ2lzdGVyQ2xvc3VyaXplZE1lbWJlcihlbGVtZW50KTsKICB9CgogIHZvaWQgX2ZvckVhY2godm9pZCBmKFdvcmtJdGVtIHdvcmspKSB7CiAgICBkbyB7CiAgICAgIHdoaWxlIChfcXVldWUuaXNOb3RFbXB0eSkgewogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEZpbmQgYW4gb3B0aW1hbCBwcm9jZXNzIG9yZGVyLgogICAgICAgIFdvcmtJdGVtIHdvcmsgPSBfcXVldWUucmVtb3ZlTGFzdCgpOwogICAgICAgIGlmICghX3Byb2Nlc3NlZEVudGl0aWVzLmNvbnRhaW5zKHdvcmsuZWxlbWVudCkpIHsKICAgICAgICAgIGYod29yayk7CiAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZWdpc3RlciB0aGUgcHJvY2Vzc2VkIGVsZW1lbnQgaGVyZS4gVGhpcwogICAgICAgICAgLy8gaXMgY3VycmVudGx5IGEgc2lkZS1lZmZlY3Qgb2YgY2FsbGluZyBgd29yay5ydW5gLgogICAgICAgICAgX3Byb2Nlc3NlZEVudGl0aWVzLmFkZCh3b3JrLmVsZW1lbnQpOwogICAgICAgIH0KICAgICAgfQogICAgICBMaXN0PENsYXNzRW50aXR5PiByZWNlbnRzID0gX3JlY2VudENsYXNzZXMudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICAgIF9yZWNlbnRDbGFzc2VzLmNsZWFyKCk7CiAgICAgIF9yZWNlbnRDb25zdGFudHMgPSBmYWxzZTsKICAgICAgaWYgKCFfb25RdWV1ZUVtcHR5KHJlY2VudHMpKSBfcmVjZW50Q2xhc3Nlcy5hZGRBbGwocmVjZW50cyk7CiAgICB9IHdoaWxlICgKICAgICAgICBfcXVldWUuaXNOb3RFbXB0eSB8fCBfcmVjZW50Q2xhc3Nlcy5pc05vdEVtcHR5IHx8IF9yZWNlbnRDb25zdGFudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihXb3JrSXRlbSB3b3JrKSkgewogICAgX2ZvckVhY2goZik7CiAgICBpZiAob25FbXB0eUZvclRlc3RpbmcgIT0gbnVsbCkgewogICAgICBvbkVtcHR5Rm9yVGVzdGluZygpOwogICAgICBfZm9yRWFjaChmKTsKICAgIH0KICB9CgogIC8vLyBbX29uUXVldWVFbXB0eV0gaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBxdWV1ZSBpcyBkcmFpbmVkLiBbcmVjZW50Q2xhc3Nlc10KICAvLy8gY29udGFpbnMgdGhlIHNldCBvZiBhbGwgY2xhc3NlcyBzZWVuIGZvciB0aGUgZmlyc3QgdGltZSBzaW5jZQogIC8vLyBbX29uUXVldWVFbXB0eV0gd2FzIGNhbGxlZCBsYXN0LiBBIHJldHVybiB2YWx1ZSBvZiBbdHJ1ZV0gaW5kaWNhdGVzIHRoYXQKICAvLy8gdGhlIFtyZWNlbnRDbGFzc2VzXSBoYXZlIGJlZW4gcHJvY2Vzc2VkIGFuZCBtYXkgYmUgY2xlYXJlZC4gSWYgW2ZhbHNlXSBpcwogIC8vLyByZXR1cm5lZCwgW19vblF1ZXVlRW1wdHldIHdpbGwgYmUgY2FsbGVkIG9uY2UgdGhlIHF1ZXVlIGlzIGVtcHR5IGFnYWluIChvcgogIC8vLyBzdGlsbCBlbXB0eSkgYW5kIFtyZWNlbnRDbGFzc2VzXSB3aWxsIGJlIGEgc3VwZXJzZXQgb2YgdGhlIGN1cnJlbnQgdmFsdWUuCiAgYm9vbCBfb25RdWV1ZUVtcHR5KEl0ZXJhYmxlPENsYXNzRW50aXR5PiByZWNlbnRDbGFzc2VzKSB7CiAgICByZXR1cm4gbGlzdGVuZXIub25RdWV1ZUVtcHR5KHRoaXMsIHJlY2VudENsYXNzZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBsb2dTdW1tYXJ5KHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSkgewogICAgbG9nKCdDb21waWxlZCAke19wcm9jZXNzZWRFbnRpdGllcy5sZW5ndGh9IG1ldGhvZHMuJyk7CiAgICBsaXN0ZW5lci5sb2dTdW1tYXJ5KGxvZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnRW5xdWV1ZXIoJG5hbWUpJzsKCiAgQG92ZXJyaWRlCiAgSW1wYWN0VXNlQ2FzZSBnZXQgaW1wYWN0VXNlID0+IElNUEFDVF9VU0U7CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gZ2V0IHByb2Nlc3NlZEVudGl0aWVzID0+IF9wcm9jZXNzZWRFbnRpdGllczsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGdldCBwcm9jZXNzZWRDbGFzc2VzID0+CiAgICAgIF93b3JsZEJ1aWxkZXIuaW5zdGFudGlhdGVkQ2xhc3NlczsKfQqBNgBOTjwBHAElATEsGTokIRoaMSgeCRUUExcRFSc5HygBNS0VPyEvKgEMHgwbDCMiASUBOAFESAFRPyUBKi4BQCwpOgQBDDkBDCsBDB0dQwYEAUQMJwFRHi01AUEiARlOBgE3GgQBDEIlID8EATUjFkVJCAQBDC4vOQQBDCUrOx8ZUAgWBAEwQzIfP0c/FzwGMTsGBAEzSS0eBjkpBjc7BgQBDDIWRQgEAQwvQR4tMyZDDyNLOQ8PDwYEAQwpIhwmKQ8tPA8hIyAPICUiCg8mPiIKDyg3IgoPJSg/Cg8iNg8mMg8sTwYEAQw1FjxHIQgIBAEpKQQBOyY9NQQBKQkiPy06E0w/MAoISh4gQw5NBAEMKBElGxMGBAFPRE9QUVA8NwQBDC47HgQBDCoBDC0BDEYBDDApAgEtcGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9lbnF1ZXVlci5kYXJ0OHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3VuaXZlcnNlL21lbWJlcl91c2FnZS5kYXJ0wAB/7S8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6bWF0aCcgYXMgTWF0aDsKCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vanNfbW9kZWwvZWxlbWVudHMuZGFydCcgc2hvdyBKU2lnbmF0dXJlTWV0aG9kOwppbXBvcnQgJy4uL3V0aWwvZW51bXNldC5kYXJ0JzsKaW1wb3J0ICdjYWxsX3N0cnVjdHVyZS5kYXJ0JzsKCmFic3RyYWN0IGNsYXNzIEFic3RyYWN0VXNhZ2U8VD4gewogIGZpbmFsIEVudW1TZXQ8VD4gX3BlbmRpbmdVc2U7CgogIEFic3RyYWN0VXNhZ2UuY2xvbmVkKHRoaXMuX3BlbmRpbmdVc2UpOwoKICBBYnN0cmFjdFVzYWdlKCkgOiB0aGlzLl9wZW5kaW5nVXNlID0gbmV3IEVudW1TZXQ8VD4oKSB7CiAgICBfcGVuZGluZ1VzZS5hZGRBbGwoX29yaWdpbmFsVXNlKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSB1c2VzIG9mIFtlbnRpdHldIHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuCiAgRW51bVNldDxUPiBnZXQgYXBwbGllZFVzZSA9PiBfb3JpZ2luYWxVc2UubWludXMoX3BlbmRpbmdVc2UpOwoKICBFbnVtU2V0PFQ+IGdldCBfb3JpZ2luYWxVc2U7CgogIC8vLyBgdHJ1ZWAgaWYgdGhlIFthcHBsaWVkVXNlXSBpcyBub24tZW1wdHkuCiAgYm9vbCBnZXQgaGFzVXNlID0+IGFwcGxpZWRVc2UuaXNOb3RFbXB0eTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtvdGhlcl0gaGFzIHRoZSBzYW1lIG9yaWdpbmFsIGFuZCBwZW5kaW5nIHVzYWdlIGFzIHRoaXMuCiAgYm9vbCBoYXNTYW1lVXNhZ2UoQWJzdHJhY3RVc2FnZTxUPiBvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIF9vcmlnaW5hbFVzZS52YWx1ZSA9PSBvdGhlci5fb3JpZ2luYWxVc2UudmFsdWUgJiYKICAgICAgICBfcGVuZGluZ1VzZS52YWx1ZSA9PSBvdGhlci5fcGVuZGluZ1VzZS52YWx1ZTsKICB9Cn0KCi8vLyBSZWdpc3RyeSBmb3IgdGhlIG9ic2VydmVkIHVzZSBvZiBhIG1lbWJlciBbZW50aXR5XSBpbiB0aGUgb3BlbiB3b3JsZC4KYWJzdHJhY3QgY2xhc3MgTWVtYmVyVXNhZ2UgZXh0ZW5kcyBBYnN0cmFjdFVzYWdlPE1lbWJlclVzZT4gewogIGZpbmFsIE1lbWJlckVudGl0eSBlbnRpdHk7CgogIE1lbWJlclVzYWdlLmludGVybmFsKHRoaXMuZW50aXR5KSA6IHN1cGVyKCk7CgogIE1lbWJlclVzYWdlLmNsb25lZCh0aGlzLmVudGl0eSwgRW51bVNldDxNZW1iZXJVc2U+IHBlbmRpbmdVc2UpCiAgICAgIDogc3VwZXIuY2xvbmVkKHBlbmRpbmdVc2UpOwoKICBmYWN0b3J5IE1lbWJlclVzYWdlKE1lbWJlckVudGl0eSBtZW1iZXIsCiAgICAgIHtib29sIGlzTmF0aXZlOiBmYWxzZSwgYm9vbCB0cmFja1BhcmFtZXRlcnM6IGZhbHNlfSkgewogICAgaWYgKG1lbWJlci5pc0ZpZWxkKSB7CiAgICAgIGlmIChtZW1iZXIuaXNBc3NpZ25hYmxlKSB7CiAgICAgICAgcmV0dXJuIG5ldyBGaWVsZFVzYWdlKG1lbWJlciwgaXNOYXRpdmU6IGlzTmF0aXZlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbmV3IEZpbmFsRmllbGRVc2FnZShtZW1iZXIsIGlzTmF0aXZlOiBpc05hdGl2ZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobWVtYmVyLmlzR2V0dGVyKSB7CiAgICAgIHJldHVybiBuZXcgR2V0dGVyVXNhZ2UobWVtYmVyKTsKICAgIH0gZWxzZSBpZiAobWVtYmVyLmlzU2V0dGVyKSB7CiAgICAgIHJldHVybiBuZXcgU2V0dGVyVXNhZ2UobWVtYmVyKTsKICAgIH0gZWxzZSBpZiAobWVtYmVyLmlzQ29uc3RydWN0b3IpIHsKICAgICAgaWYgKHRyYWNrUGFyYW1ldGVycykgewogICAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVyVHJhY2tpbmdDb25zdHJ1Y3RvclVzYWdlKG1lbWJlcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3RvclVzYWdlKG1lbWJlcik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChtZW1iZXIuaXNGdW5jdGlvbiwgZmFpbGVkQXQobWVtYmVyLCAiVW5leHBlY3RlZCBtZW1iZXI6ICRtZW1iZXIiKSk7CiAgICAgIGlmICh0cmFja1BhcmFtZXRlcnMpIHsKICAgICAgICByZXR1cm4gbmV3IFBhcmFtZXRlclRyYWNraW5nRnVuY3Rpb25Vc2FnZShtZW1iZXIpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25Vc2FnZShtZW1iZXIpOwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gYHRydWVgIGlmIFtlbnRpdHldIGhhcyBiZWVuIGluaXRpYWxpemVkLgogIGJvb2wgZ2V0IGhhc0luaXQgPT4gdHJ1ZTsKCiAgSXRlcmFibGU8Q29uc3RhbnRWYWx1ZT4gZ2V0IGluaXRpYWxDb25zdGFudHMgPT4gbnVsbDsKCiAgLy8vIGB0cnVlYCBpZiBbZW50aXR5XSBoYXMgYmVlbiByZWFkIGFzIGEgdmFsdWUuIEZvciBhIGZpZWxkIHRoaXMgaXMgYSBub3JtYWwKICAvLy8gcmVhZCBhY2Nlc3MsIGZvciBhIGZ1bmN0aW9uIHRoaXMgaXMgYSBjbG9zdXJpemF0aW9uLgogIGJvb2wgZ2V0IGhhc1JlYWQgPT4gZmFsc2U7CgogIC8vLyBgdHJ1ZWAgaWYgYSB2YWx1ZSBoYXMgYmVlbiB3cml0dGVuIHRvIFtlbnRpdHldLgogIGJvb2wgZ2V0IGhhc1dyaXRlID0+IGZhbHNlOwoKICAvLy8gYHRydWVgIGlmIGFuIGludm9jYXRpb24gaGFzIGJlZW4gcGVyZm9ybWVkIG9uIHRoZSB2YWx1ZSBbZW50aXR5XS4gRm9yIGEKICAvLy8gZnVuY3Rpb24gdGhpcyBpcyBhIG5vcm1hbCBpbnZvY2F0aW9uLCBmb3IgYSBmaWVsZCB0aGlzIGlzIGEgcmVhZCBhY2Nlc3MKICAvLy8gZm9sbG93ZWQgYnkgYW4gaW52b2NhdGlvbiBvZiB0aGUgZnVuY3Rpb24tbGlrZSB2YWx1ZS4KICBib29sIGdldCBoYXNJbnZva2UgPT4gZmFsc2U7CgogIC8vLyBgdHJ1ZWAgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkIGluIGludm9jYXRpb25zIG9mIFtlbnRpdHldLgogIC8vLwogIC8vLyBGb3IgbWV0aG9kIG9yIGNvbnN0cnVjdG9ycyB3aXRoIG5vIG9wdGlvbmFsIGFyZ3VtZW50cyB0aGlzIGlzIHRoZSBzYW1lCiAgLy8vIGFzIFtoYXNJbnZva2VdIGJ1dCBmb3IgbWV0aG9kIG9yIGNvbnN0cnVjdG9ycyB3aXRoIG9wdGlvbmFsIGFyZ3VtZW50cyBzb21lCiAgLy8vIHBhcmFtZXRlcnMgbWF5IGhhdmUgYmVlbiBwcm92aWRlZCBpbiBhbnkgaW52b2NhdGlvbiBpbiB3aGljaCBjYXNlCiAgLy8vIFtpc0Z1bGx5SW52b2tlZF0gaXMgYGZhbHNlYC4KICBib29sIGdldCBpc0Z1bGx5SW52b2tlZCA9PiBoYXNJbnZva2U7CgogIC8vLyBSZXR1cm5zIHRoZSBbUGFyYW1ldGVyU3RydWN0dXJlXSBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYXJhbWV0ZXJzIHRoYXQgYXJlCiAgLy8vIHVzZWQgaW4gaW52b2NhdGlvbnMgb2YgW2VudGl0eV0uIEZvciBhIGZpZWxkLCBnZXR0ZXIgb3Igc2V0dGVyIHRoaXMgaXMKICAvLy8gYWx3YXlzIGBudWxsYC4KICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgZ2V0IGludm9rZWRQYXJhbWV0ZXJzID0+IG51bGw7CgogIC8vLyBgdHJ1ZWAgaWYgW2VudGl0eV0gaGFzIGZ1cnRoZXIgbm9ybWFsIHVzZS4gRm9yIGEgZmllbGQgdGhpcyBtZWFucyB0aGF0CiAgLy8vIGl0IGhhc24ndCBiZWVuIHJlYWQgZnJvbSBvciB3cml0dGVuIHRvLiBGb3IgYSBmdW5jdGlvbiB0aGlzIG1lYW5zIHRoYXQgaXQKICAvLy8gaGFzbid0IGJlZW4gaW52b2tlZCBvciwgd2hlbiBwYXJhbWV0ZXIgdXNhZ2UgaXMgdHJhY2tlZCwgdGhhdCBzb21lCiAgLy8vIHBhcmFtZXRlcnMgaGF2ZW4ndCBiZWVuIHByb3ZpZGVkIGluIGFueSBpbnZvY2F0aW9uLgogIGJvb2wgZ2V0IGhhc1BlbmRpbmdOb3JtYWxVc2UgPT4gX3BlbmRpbmdVc2UuY29udGFpbnMoTWVtYmVyVXNlLk5PUk1BTCk7CgogIC8vLyBgdHJ1ZWAgaWYgW2VudGl0eV0gaGFzbid0IGJlZW4gY2xvc3VyaXplZC4gVGhpcyBpcyBvbmx5IHVzZWQgZm9yCiAgLy8vIGZ1bmN0aW9ucy4KICBib29sIGdldCBoYXNQZW5kaW5nQ2xvc3VyaXphdGlvblVzZSA9PiBmYWxzZTsKCiAgLy8vIGB0cnVlYCBpZiBbZW50aXR5XSBoYXMgYmVlbiB1c2VkIGluIGFsbCB0aGUgd2F5cyBwb3NzaWJsZS4KICBib29sIGdldCBmdWxseVVzZWQ7CgogIC8vLyBSZWdpc3RlcnMgdGhlIFtlbnRpdHldIGhhcyBiZWVuIGluaXRpYWxpemVkIGFuZCByZXR1cm5zIHRoZSBuZXcKICAvLy8gW01lbWJlclVzZV1zIHRoYXQgaXQgY2F1c2VkLgogIC8vLwogIC8vLyBGb3IgYSBmaWVsZCB0aGlzIGlzIHRoZSBpbml0aWFsIHdyaXRlIGFjY2VzcywgZm9yIGEgZnVuY3Rpb24gdGhpcyBpcyBhCiAgLy8vIG5vLW9wLgogIEVudW1TZXQ8TWVtYmVyVXNlPiBpbml0KCkgPT4gTWVtYmVyVXNlcy5OT05FOwoKICAvLy8gUmVnaXN0ZXJzIHRoZSBbZW50aXR5XSBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIFtjb25zdGFudF0gYW5kIHJldHVybnMKICAvLy8gdGhlIG5ldyBbTWVtYmVyVXNlXXMgdGhhdCBpdCBjYXVzZWQuCiAgLy8vCiAgLy8vIEZvciBhIGZpZWxkIHRoaXMgaXMgdGhlIGluaXRpYWwgd3JpdGUgYWNjZXNzLCBmb3IgYSBmdW5jdGlvbiB0aGlzIGlzIGEKICAvLy8gbm8tb3AuCiAgRW51bVNldDxNZW1iZXJVc2U+IGNvbnN0YW50SW5pdChDb25zdGFudFZhbHVlIGNvbnN0YW50KSA9PiBNZW1iZXJVc2VzLk5PTkU7CgogIC8vLyBSZWdpc3RlcnMgYSByZWFkIG9mIHRoZSB2YWx1ZSBvZiBbZW50aXR5XSBhbmQgcmV0dXJucyB0aGUgbmV3IFtNZW1iZXJVc2VdcwogIC8vLyB0aGF0IGl0IGNhdXNlZC4KICAvLy8KICAvLy8gRm9yIGEgZmllbGQgdGhpcyBpcyBhIG5vcm1hbCByZWFkIGFjY2VzcywgZm9yIGEgZnVuY3Rpb24gdGhpcyBpcyBhCiAgLy8vIGNsb3N1cml6YXRpb24uCiAgRW51bVNldDxNZW1iZXJVc2U+IHJlYWQoKSA9PiBNZW1iZXJVc2VzLk5PTkU7CgogIC8vLyBSZWdpc3RlcnMgYSB3cml0ZSBvZiBhIHZhbHVlIHRvIFtlbnRpdHldIGFuZCByZXR1cm5zIHRoZSBuZXcgW01lbWJlclVzZV1zCiAgLy8vIHRoYXQgaXQgY2F1c2VkLgogIEVudW1TZXQ8TWVtYmVyVXNlPiB3cml0ZSgpID0+IE1lbWJlclVzZXMuTk9ORTsKCiAgLy8vIFJlZ2lzdGVycyBhbiBpbnZvY2F0aW9uIG9uIHRoZSB2YWx1ZSBvZiBbZW50aXR5XSBhbmQgcmV0dXJucyB0aGUgbmV3CiAgLy8vIFtNZW1iZXJVc2VdcyB0aGF0IGl0IGNhdXNlZC4KICAvLy8KICAvLy8gRm9yIGEgZnVuY3Rpb24gdGhpcyBpcyBhIG5vcm1hbCBpbnZvY2F0aW9uLCBmb3IgYSBmaWVsZCB0aGlzIGlzIGEgcmVhZAogIC8vLyBhY2Nlc3MgZm9sbG93ZWQgYnkgYW4gaW52b2NhdGlvbiBvZiB0aGUgZnVuY3Rpb24tbGlrZSB2YWx1ZS4KICBFbnVtU2V0PE1lbWJlclVzZT4gaW52b2tlKENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSkgPT4gTWVtYmVyVXNlcy5OT05FOwoKICAvLy8gUmVnaXN0ZXJzIGFsbCBwb3NzaWJsZSB1c2VzIG9mIFtlbnRpdHldIGFuZCByZXR1cm5zIHRoZSBuZXcgW01lbWJlclVzZV1zCiAgLy8vIHRoYXQgaXQgY2F1c2VkLgogIEVudW1TZXQ8TWVtYmVyVXNlPiBmdWxseVVzZSgpID0+IE1lbWJlclVzZXMuTk9ORTsKCiAgQG92ZXJyaWRlCiAgRW51bVNldDxNZW1iZXJVc2U+IGdldCBfb3JpZ2luYWxVc2UgPT4gTWVtYmVyVXNlcy5OT1JNQUxfT05MWTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBlbnRpdHkuaGFzaENvZGU7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgTWVtYmVyVXNhZ2UpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBlbnRpdHkgPT0gb3RoZXIuZW50aXR5OwogIH0KCiAgTWVtYmVyVXNhZ2UgY2xvbmUoKTsKCiAgYm9vbCBkYXRhRXF1YWxzKE1lbWJlclVzYWdlIG90aGVyKSB7CiAgICBhc3NlcnQoZW50aXR5ID09IG90aGVyLmVudGl0eSk7CiAgICByZXR1cm4gaGFzSW5pdCA9PSBvdGhlci5oYXNJbml0ICYmCiAgICAgICAgaGFzUmVhZCA9PSBvdGhlci5oYXNSZWFkICYmCiAgICAgICAgaGFzSW52b2tlID09IG90aGVyLmhhc0ludm9rZSAmJgogICAgICAgIGhhc1dyaXRlID09IG90aGVyLmhhc1dyaXRlICYmCiAgICAgICAgaGFzUGVuZGluZ0Nsb3N1cml6YXRpb25Vc2UgPT0gb3RoZXIuaGFzUGVuZGluZ0Nsb3N1cml6YXRpb25Vc2UgJiYKICAgICAgICBoYXNQZW5kaW5nTm9ybWFsVXNlID09IG90aGVyLmhhc1BlbmRpbmdOb3JtYWxVc2UgJiYKICAgICAgICBmdWxseVVzZWQgPT0gb3RoZXIuZnVsbHlVc2VkICYmCiAgICAgICAgaXNGdWxseUludm9rZWQgPT0gb3RoZXIuaXNGdWxseUludm9rZWQgJiYKICAgICAgICBfcGVuZGluZ1VzZSA9PSBvdGhlci5fcGVuZGluZ1VzZSAmJgogICAgICAgIGFwcGxpZWRVc2UgPT0gb3RoZXIuYXBwbGllZFVzZTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICckZW50aXR5OiR7YXBwbGllZFVzZS5pdGVyYWJsZShNZW1iZXJVc2UudmFsdWVzKX0nOwp9CgpjbGFzcyBGaWVsZFVzYWdlIGV4dGVuZHMgTWVtYmVyVXNhZ2UgewogIEBvdmVycmlkZQogIGJvb2wgaGFzSW5pdDsKICBAb3ZlcnJpZGUKICBib29sIGhhc1JlYWQ7CiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNXcml0ZTsKCiAgTGlzdDxDb25zdGFudFZhbHVlPiBfaW5pdGlhbENvbnN0YW50czsKCiAgRmllbGRVc2FnZS5jbG9uZWQoRmllbGRFbnRpdHkgZmllbGQsIEVudW1TZXQ8TWVtYmVyVXNlPiBwZW5kaW5nVXNlLAogICAgICB7dGhpcy5oYXNJbml0LCB0aGlzLmhhc1JlYWQsIHRoaXMuaGFzV3JpdGV9KQogICAgICA6IHN1cGVyLmNsb25lZChmaWVsZCwgcGVuZGluZ1VzZSk7CgogIEZpZWxkVXNhZ2UoRmllbGRFbnRpdHkgZmllbGQsIHtib29sIGlzTmF0aXZlOiBmYWxzZX0pCiAgICAgIDogaGFzSW5pdCA9IGZhbHNlLAogICAgICAgIGhhc1JlYWQgPSBmYWxzZSwKICAgICAgICBoYXNXcml0ZSA9IGZhbHNlLAogICAgICAgIHN1cGVyLmludGVybmFsKGZpZWxkKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUcmFjayBuYXRpdmUgZmllbGRzIHRocm91Z2ggbWVtYmVyIHVzYWdlLgogICAgaWYgKCFpc05hdGl2ZSkgewogICAgICBpbml0KCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxDb25zdGFudFZhbHVlPiBnZXQgaW5pdGlhbENvbnN0YW50cyA9PiBfaW5pdGlhbENvbnN0YW50cyA/PyBjb25zdCBbXTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaGFzUGVuZGluZ05vcm1hbFVzZSA9PiAhZnVsbHlVc2VkOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBmdWxseVVzZWQgPT4gaGFzSW5pdCAmJiBoYXNSZWFkICYmIGhhc1dyaXRlOwoKICBAb3ZlcnJpZGUKICBFbnVtU2V0PE1lbWJlclVzZT4gaW5pdCgpIHsKICAgIGlmIChoYXNJbml0KSB7CiAgICAgIHJldHVybiBNZW1iZXJVc2VzLk5PTkU7CiAgICB9CiAgICBoYXNJbml0ID0gdHJ1ZTsKICAgIEVudW1TZXQ8TWVtYmVyVXNlPiByZXN1bHQgPSBfcGVuZGluZ1VzZS5yZW1vdmVBbGwoTWVtYmVyVXNlcy5OT1JNQUxfT05MWSk7CiAgICBpZiAoIWZ1bGx5VXNlZCkgewogICAgICByZXN1bHQgPSByZXN1bHQudW5pb24oTWVtYmVyVXNlcy5QQVJUSUFMX1VTRV9PTkxZKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBFbnVtU2V0PE1lbWJlclVzZT4gY29uc3RhbnRJbml0KENvbnN0YW50VmFsdWUgY29uc3RhbnQpIHsKICAgIF9pbml0aWFsQ29uc3RhbnRzID8/PSBbXTsKICAgIF9pbml0aWFsQ29uc3RhbnRzLmFkZChjb25zdGFudCk7CiAgICByZXR1cm4gaW5pdCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgRW51bVNldDxNZW1iZXJVc2U+IHJlYWQoKSB7CiAgICBpZiAoaGFzUmVhZCkgewogICAgICByZXR1cm4gTWVtYmVyVXNlcy5OT05FOwogICAgfQogICAgaGFzUmVhZCA9IHRydWU7CiAgICBFbnVtU2V0PE1lbWJlclVzZT4gcmVzdWx0ID0gX3BlbmRpbmdVc2UucmVtb3ZlQWxsKE1lbWJlclVzZXMuTk9STUFMX09OTFkpOwogICAgaWYgKCFmdWxseVVzZWQpIHsKICAgICAgcmVzdWx0ID0gcmVzdWx0LnVuaW9uKE1lbWJlclVzZXMuUEFSVElBTF9VU0VfT05MWSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgRW51bVNldDxNZW1iZXJVc2U+IHdyaXRlKCkgewogICAgaWYgKGhhc1dyaXRlKSB7CiAgICAgIHJldHVybiBNZW1iZXJVc2VzLk5PTkU7CiAgICB9CiAgICBoYXNXcml0ZSA9IHRydWU7CiAgICBFbnVtU2V0PE1lbWJlclVzZT4gcmVzdWx0ID0gX3BlbmRpbmdVc2UucmVtb3ZlQWxsKE1lbWJlclVzZXMuTk9STUFMX09OTFkpOwogICAgaWYgKCFmdWxseVVzZWQpIHsKICAgICAgcmVzdWx0ID0gcmVzdWx0LnVuaW9uKE1lbWJlclVzZXMuUEFSVElBTF9VU0VfT05MWSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgRW51bVNldDxNZW1iZXJVc2U+IGludm9rZShDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUpID0+IHJlYWQoKTsKCiAgQG92ZXJyaWRlCiAgRW51bVNldDxNZW1iZXJVc2U+IGZ1bGx5VXNlKCkgewogICAgaWYgKGZ1bGx5VXNlZCkgewogICAgICByZXR1cm4gTWVtYmVyVXNlcy5OT05FOwogICAgfQogICAgaGFzSW5pdCA9IGhhc1JlYWQgPSBoYXNXcml0ZSA9IHRydWU7CiAgICByZXR1cm4gX3BlbmRpbmdVc2UucmVtb3ZlQWxsKE1lbWJlclVzZXMuTk9STUFMX09OTFkpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyVXNhZ2UgY2xvbmUoKSB7CiAgICByZXR1cm4gbmV3IEZpZWxkVXNhZ2UuY2xvbmVkKGVudGl0eSwgX3BlbmRpbmdVc2UuY2xvbmUoKSwKICAgICAgICBoYXNJbml0OiBoYXNJbml0LCBoYXNSZWFkOiBoYXNSZWFkLCBoYXNXcml0ZTogaGFzV3JpdGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0ZpZWxkVXNhZ2UoJGVudGl0eSxoYXNJbml0PSRoYXNJbml0LGhhc1JlYWQ9JGhhc1JlYWQsJwogICAgICAnaGFzV3JpdGU9JGhhc1dyaXRlLHBlbmRpbmdVc2U9JHtfcGVuZGluZ1VzZS5pdGVyYWJsZShNZW1iZXJVc2UudmFsdWVzKX0sJwogICAgICAnaW5pdGlhbENvbnN0YW50cz0ke2luaXRpYWxDb25zdGFudHMubWFwKChjKSA9PiBjLnRvU3RydWN0dXJlZFRleHQoKSl9KSc7Cn0KCmNsYXNzIEZpbmFsRmllbGRVc2FnZSBleHRlbmRzIE1lbWJlclVzYWdlIHsKICBAb3ZlcnJpZGUKICBib29sIGhhc0luaXQ7CiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNSZWFkOwoKICBMaXN0PENvbnN0YW50VmFsdWU+IF9pbml0aWFsQ29uc3RhbnRzOwoKICBGaW5hbEZpZWxkVXNhZ2UuY2xvbmVkKEZpZWxkRW50aXR5IGZpZWxkLCBFbnVtU2V0PE1lbWJlclVzZT4gcGVuZGluZ1VzZSwKICAgICAge3RoaXMuaGFzSW5pdCwgdGhpcy5oYXNSZWFkfSkKICAgICAgOiBzdXBlci5jbG9uZWQoZmllbGQsIHBlbmRpbmdVc2UpOwoKICBGaW5hbEZpZWxkVXNhZ2UoRmllbGRFbnRpdHkgZmllbGQsIHtib29sIGlzTmF0aXZlOiBmYWxzZX0pCiAgICAgIDogdGhpcy5oYXNJbml0ID0gZmFsc2UsCiAgICAgICAgdGhpcy5oYXNSZWFkID0gZmFsc2UsCiAgICAgICAgc3VwZXIuaW50ZXJuYWwoZmllbGQpIHsKICAgIGlmICghaXNOYXRpdmUpIHsKICAgICAgaW5pdCgpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Q29uc3RhbnRWYWx1ZT4gZ2V0IGluaXRpYWxDb25zdGFudHMgPT4gX2luaXRpYWxDb25zdGFudHMgPz8gY29uc3QgW107CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGhhc1BlbmRpbmdOb3JtYWxVc2UgPT4gIWZ1bGx5VXNlZDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgZnVsbHlVc2VkID0+IGhhc0luaXQgJiYgaGFzUmVhZDsKCiAgQG92ZXJyaWRlCiAgRW51bVNldDxNZW1iZXJVc2U+IGluaXQoKSB7CiAgICBpZiAoaGFzSW5pdCkgewogICAgICByZXR1cm4gTWVtYmVyVXNlcy5OT05FOwogICAgfQogICAgaGFzSW5pdCA9IHRydWU7CiAgICBFbnVtU2V0PE1lbWJlclVzZT4gcmVzdWx0ID0gX3BlbmRpbmdVc2UucmVtb3ZlQWxsKE1lbWJlclVzZXMuTk9STUFMX09OTFkpOwogICAgaWYgKCFmdWxseVVzZWQpIHsKICAgICAgcmVzdWx0ID0gcmVzdWx0LnVuaW9uKE1lbWJlclVzZXMuUEFSVElBTF9VU0VfT05MWSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgRW51bVNldDxNZW1iZXJVc2U+IGNvbnN0YW50SW5pdChDb25zdGFudFZhbHVlIGNvbnN0YW50KSB7CiAgICBfaW5pdGlhbENvbnN0YW50cyA/Pz0gW107CiAgICBfaW5pdGlhbENvbnN0YW50cy5hZGQoY29uc3RhbnQpOwogICAgcmV0dXJuIGluaXQoKTsKICB9CgogIEBvdmVycmlkZQogIEVudW1TZXQ8TWVtYmVyVXNlPiByZWFkKCkgewogICAgaWYgKGhhc1JlYWQpIHsKICAgICAgcmV0dXJuIE1lbWJlclVzZXMuTk9ORTsKICAgIH0KICAgIGhhc1JlYWQgPSB0cnVlOwogICAgRW51bVNldDxNZW1iZXJVc2U+IHJlc3VsdCA9IF9wZW5kaW5nVXNlLnJlbW92ZUFsbChNZW1iZXJVc2VzLk5PUk1BTF9PTkxZKTsKICAgIGlmICghZnVsbHlVc2VkKSB7CiAgICAgIHJlc3VsdCA9IHJlc3VsdC51bmlvbihNZW1iZXJVc2VzLlBBUlRJQUxfVVNFX09OTFkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIEVudW1TZXQ8TWVtYmVyVXNlPiBpbnZva2UoQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlKSA9PiByZWFkKCk7CgogIEBvdmVycmlkZQogIEVudW1TZXQ8TWVtYmVyVXNlPiBmdWxseVVzZSgpIHsKICAgIGlmIChmdWxseVVzZWQpIHsKICAgICAgcmV0dXJuIE1lbWJlclVzZXMuTk9ORTsKICAgIH0KICAgIGhhc0luaXQgPSBoYXNSZWFkID0gdHJ1ZTsKICAgIHJldHVybiBfcGVuZGluZ1VzZS5yZW1vdmVBbGwoTWVtYmVyVXNlcy5OT1JNQUxfT05MWSk7CiAgfQoKICBAb3ZlcnJpZGUKICBNZW1iZXJVc2FnZSBjbG9uZSgpIHsKICAgIHJldHVybiBuZXcgRmluYWxGaWVsZFVzYWdlLmNsb25lZChlbnRpdHksIF9wZW5kaW5nVXNlLmNsb25lKCksCiAgICAgICAgaGFzSW5pdDogaGFzSW5pdCwgaGFzUmVhZDogaGFzUmVhZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnRmluYWxGaWVsZFVzYWdlKCRlbnRpdHksaGFzSW5pdD0kaGFzSW5pdCwnCiAgICAgICdoYXNSZWFkPSRoYXNSZWFkLHBlbmRpbmdVc2U9JHtfcGVuZGluZ1VzZS5pdGVyYWJsZShNZW1iZXJVc2UudmFsdWVzKX0sJwogICAgICAnaW5pdGlhbENvbnN0YW50cz0ke2luaXRpYWxDb25zdGFudHMubWFwKChjKSA9PiBjLnRvU3RydWN0dXJlZFRleHQoKSl9KSc7Cn0KCmNsYXNzIEZ1bmN0aW9uVXNhZ2UgZXh0ZW5kcyBNZW1iZXJVc2FnZSB7CiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNJbnZva2U7CiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNSZWFkOwoKICBGdW5jdGlvblVzYWdlLmNsb25lZChGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwgRW51bVNldDxNZW1iZXJVc2U+IHBlbmRpbmdVc2UsCiAgICAgIHt0aGlzLmhhc0ludm9rZSwgdGhpcy5oYXNSZWFkfSkKICAgICAgOiBzdXBlci5jbG9uZWQoZnVuY3Rpb24sIHBlbmRpbmdVc2UpOwoKICBGdW5jdGlvblVzYWdlKEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uKQogICAgICA6IHRoaXMuaGFzSW52b2tlID0gZmFsc2UsCiAgICAgICAgdGhpcy5oYXNSZWFkID0gZmFsc2UsCiAgICAgICAgc3VwZXIuaW50ZXJuYWwoZnVuY3Rpb24pIHsKICAgIGlmIChmdW5jdGlvbiBpcyBKU2lnbmF0dXJlTWV0aG9kKSB7CiAgICAgIC8vIFdlIG1hcmsgc2lnbmF0dXJlIG1ldGhvZHMgYXMgImFsd2F5cyB1c2VkIiB0byBwcmV2ZW50IHRoZW0gZnJvbSBiZWluZwogICAgICAvLyBvcHRpbWl6ZWQgYXdheS4KICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWFrZSB0aGlzIGEgcGFydCBvZiB0aGUgcmVndWxhciBlbnF1ZXVlaW5nLgogICAgICBpbnZva2UoZnVuY3Rpb24ucGFyYW1ldGVyU3RydWN0dXJlLmNhbGxTdHJ1Y3R1cmUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGVudGl0eSA9PiBzdXBlci5lbnRpdHk7CgogIEBvdmVycmlkZQogIEVudW1TZXQ8TWVtYmVyVXNlPiBnZXQgX29yaWdpbmFsVXNlID0+CiAgICAgIGVudGl0eS5pc0luc3RhbmNlTWVtYmVyID8gTWVtYmVyVXNlcy5BTExfSU5TVEFOQ0UgOiBNZW1iZXJVc2VzLkFMTF9TVEFUSUM7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGhhc1BlbmRpbmdDbG9zdXJpemF0aW9uVXNlID0+IGVudGl0eS5pc0luc3RhbmNlTWVtYmVyCiAgICAgID8gX3BlbmRpbmdVc2UuY29udGFpbnMoTWVtYmVyVXNlLkNMT1NVUklaRV9JTlNUQU5DRSkKICAgICAgOiBfcGVuZGluZ1VzZS5jb250YWlucyhNZW1iZXJVc2UuQ0xPU1VSSVpFX1NUQVRJQyk7CgogIEBvdmVycmlkZQogIEVudW1TZXQ8TWVtYmVyVXNlPiByZWFkKCkgPT4gZnVsbHlVc2UoKTsKCiAgQG92ZXJyaWRlCiAgRW51bVNldDxNZW1iZXJVc2U+IGludm9rZShDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUpIHsKICAgIGlmIChoYXNJbnZva2UpIHsKICAgICAgcmV0dXJuIE1lbWJlclVzZXMuTk9ORTsKICAgIH0KICAgIGhhc0ludm9rZSA9IHRydWU7CiAgICByZXR1cm4gX3BlbmRpbmdVc2UKICAgICAgICAucmVtb3ZlQWxsKGhhc1JlYWQgPyBNZW1iZXJVc2VzLk5PTkUgOiBNZW1iZXJVc2VzLk5PUk1BTF9PTkxZKTsKICB9CgogIEBvdmVycmlkZQogIEVudW1TZXQ8TWVtYmVyVXNlPiBmdWxseVVzZSgpIHsKICAgIGlmIChoYXNJbnZva2UpIHsKICAgICAgaWYgKGhhc1JlYWQpIHsKICAgICAgICByZXR1cm4gTWVtYmVyVXNlcy5OT05FOwogICAgICB9CiAgICAgIGhhc1JlYWQgPSB0cnVlOwogICAgICByZXR1cm4gX3BlbmRpbmdVc2UucmVtb3ZlQWxsKGVudGl0eS5pc0luc3RhbmNlTWVtYmVyCiAgICAgICAgICA/IE1lbWJlclVzZXMuQ0xPU1VSSVpFX0lOU1RBTkNFX09OTFkKICAgICAgICAgIDogTWVtYmVyVXNlcy5DTE9TVVJJWkVfU1RBVElDX09OTFkpOwogICAgfSBlbHNlIGlmIChoYXNSZWFkKSB7CiAgICAgIGhhc0ludm9rZSA9IHRydWU7CiAgICAgIHJldHVybiBfcGVuZGluZ1VzZS5yZW1vdmVBbGwoTWVtYmVyVXNlcy5OT1JNQUxfT05MWSk7CiAgICB9IGVsc2UgewogICAgICBoYXNSZWFkID0gaGFzSW52b2tlID0gdHJ1ZTsKICAgICAgcmV0dXJuIF9wZW5kaW5nVXNlLnJlbW92ZUFsbChlbnRpdHkuaXNJbnN0YW5jZU1lbWJlcgogICAgICAgICAgPyBNZW1iZXJVc2VzLkFMTF9JTlNUQU5DRQogICAgICAgICAgOiBNZW1iZXJVc2VzLkFMTF9TVEFUSUMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgZnVsbHlVc2VkID0+IGhhc0ludm9rZSAmJiBoYXNSZWFkOwoKICBAb3ZlcnJpZGUKICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgZ2V0IGludm9rZWRQYXJhbWV0ZXJzID0+CiAgICAgIGhhc0ludm9rZSA/IGVudGl0eS5wYXJhbWV0ZXJTdHJ1Y3R1cmUgOiBudWxsOwoKICBAb3ZlcnJpZGUKICBNZW1iZXJVc2FnZSBjbG9uZSgpIHsKICAgIHJldHVybiBuZXcgRnVuY3Rpb25Vc2FnZS5jbG9uZWQoZW50aXR5LCBfcGVuZGluZ1VzZS5jbG9uZSgpLAogICAgICAgIGhhc0ludm9rZTogaGFzSW52b2tlLCBoYXNSZWFkOiBoYXNSZWFkKTsKICB9Cn0KCmNsYXNzIFBhcmFtZXRlclRyYWNraW5nRnVuY3Rpb25Vc2FnZSBleHRlbmRzIE1lbWJlclVzYWdlIHsKICBAb3ZlcnJpZGUKICBib29sIGhhc1JlYWQ7CgogIGZpbmFsIFBhcmFtZXRlclVzYWdlIF9wYXJhbWV0ZXJVc2FnZTsKCiAgUGFyYW1ldGVyVHJhY2tpbmdGdW5jdGlvblVzYWdlLmNsb25lZChGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwKICAgICAgdGhpcy5fcGFyYW1ldGVyVXNhZ2UsIEVudW1TZXQ8TWVtYmVyVXNlPiBwZW5kaW5nVXNlLAogICAgICB7dGhpcy5oYXNSZWFkfSkKICAgICAgOiBzdXBlci5jbG9uZWQoZnVuY3Rpb24sIHBlbmRpbmdVc2UpOwoKICBQYXJhbWV0ZXJUcmFja2luZ0Z1bmN0aW9uVXNhZ2UoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pCiAgICAgIDogaGFzUmVhZCA9IGZhbHNlLAogICAgICAgIF9wYXJhbWV0ZXJVc2FnZSA9IG5ldyBQYXJhbWV0ZXJVc2FnZShmdW5jdGlvbi5wYXJhbWV0ZXJTdHJ1Y3R1cmUpLAogICAgICAgIHN1cGVyLmludGVybmFsKGZ1bmN0aW9uKSB7CiAgICBpZiAoZnVuY3Rpb24gaXMgSlNpZ25hdHVyZU1ldGhvZCkgewogICAgICAvLyBXZSBtYXJrIHNpZ25hdHVyZSBtZXRob2RzIGFzICJhbHdheXMgdXNlZCIgdG8gcHJldmVudCB0aGVtIGZyb20gYmVpbmcKICAgICAgLy8gb3B0aW1pemVkIGF3YXkuCiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IE1ha2UgdGhpcyBhIHBhcnQgb2YgdGhlIHJlZ3VsYXIgZW5xdWV1ZWluZy4KICAgICAgaW52b2tlKENhbGxTdHJ1Y3R1cmUuTk9fQVJHUyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBoYXNJbnZva2UgPT4gX3BhcmFtZXRlclVzYWdlLmhhc0ludm9rZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaGFzUGVuZGluZ0Nsb3N1cml6YXRpb25Vc2UgPT4gZW50aXR5LmlzSW5zdGFuY2VNZW1iZXIKICAgICAgPyBfcGVuZGluZ1VzZS5jb250YWlucyhNZW1iZXJVc2UuQ0xPU1VSSVpFX0lOU1RBTkNFKQogICAgICA6IF9wZW5kaW5nVXNlLmNvbnRhaW5zKE1lbWJlclVzZS5DTE9TVVJJWkVfU1RBVElDKTsKCiAgQG92ZXJyaWRlCiAgRW51bVNldDxNZW1iZXJVc2U+IGdldCBfb3JpZ2luYWxVc2UgPT4KICAgICAgZW50aXR5LmlzSW5zdGFuY2VNZW1iZXIgPyBNZW1iZXJVc2VzLkFMTF9JTlNUQU5DRSA6IE1lbWJlclVzZXMuQUxMX1NUQVRJQzsKCiAgQG92ZXJyaWRlCiAgRW51bVNldDxNZW1iZXJVc2U+IHJlYWQoKSA9PiBmdWxseVVzZSgpOwoKICBAb3ZlcnJpZGUKICBFbnVtU2V0PE1lbWJlclVzZT4gaW52b2tlKENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSkgewogICAgaWYgKF9wYXJhbWV0ZXJVc2FnZS5pc0Z1bGx5VXNlZCkgewogICAgICByZXR1cm4gTWVtYmVyVXNlcy5OT05FOwogICAgfQogICAgYm9vbCBhbHJlYWR5SGFzSW52b2tlID0gaGFzSW52b2tlOwogICAgYm9vbCBoYXNQYXJ0aWFsQ2hhbmdlID0gX3BhcmFtZXRlclVzYWdlLmludm9rZShjYWxsU3RydWN0dXJlKTsKICAgIEVudW1TZXQ8TWVtYmVyVXNlPiByZXN1bHQ7CiAgICBpZiAoYWxyZWFkeUhhc0ludm9rZSkgewogICAgICByZXN1bHQgPSBNZW1iZXJVc2VzLk5PTkU7CiAgICB9IGVsc2UgewogICAgICByZXN1bHQgPSBfcGVuZGluZ1VzZQogICAgICAgICAgLnJlbW92ZUFsbChoYXNSZWFkID8gTWVtYmVyVXNlcy5OT05FIDogTWVtYmVyVXNlcy5OT1JNQUxfT05MWSk7CiAgICB9CiAgICByZXR1cm4gaGFzUGFydGlhbENoYW5nZQogICAgICAgID8gcmVzdWx0LnVuaW9uKE1lbWJlclVzZXMuUEFSVElBTF9VU0VfT05MWSkKICAgICAgICA6IHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIEVudW1TZXQ8TWVtYmVyVXNlPiBmdWxseVVzZSgpIHsKICAgIGJvb2wgYWxyZWFkeUhhc0ludm9rZSA9IGhhc0ludm9rZTsKICAgIF9wYXJhbWV0ZXJVc2FnZS5mdWxseVVzZSgpOwogICAgaWYgKGFscmVhZHlIYXNJbnZva2UpIHsKICAgICAgaWYgKGhhc1JlYWQpIHsKICAgICAgICByZXR1cm4gTWVtYmVyVXNlcy5OT05FOwogICAgICB9CiAgICAgIGhhc1JlYWQgPSB0cnVlOwogICAgICByZXR1cm4gX3BlbmRpbmdVc2UucmVtb3ZlQWxsKGVudGl0eS5pc0luc3RhbmNlTWVtYmVyCiAgICAgICAgICA/IE1lbWJlclVzZXMuQ0xPU1VSSVpFX0lOU1RBTkNFX09OTFkKICAgICAgICAgIDogTWVtYmVyVXNlcy5DTE9TVVJJWkVfU1RBVElDX09OTFkpOwogICAgfSBlbHNlIGlmIChoYXNSZWFkKSB7CiAgICAgIHJldHVybiBfcGVuZGluZ1VzZS5yZW1vdmVBbGwoTWVtYmVyVXNlcy5OT1JNQUxfT05MWSk7CiAgICB9IGVsc2UgewogICAgICBoYXNSZWFkID0gdHJ1ZTsKICAgICAgcmV0dXJuIF9wZW5kaW5nVXNlLnJlbW92ZUFsbChlbnRpdHkuaXNJbnN0YW5jZU1lbWJlcgogICAgICAgICAgPyBNZW1iZXJVc2VzLkFMTF9JTlNUQU5DRQogICAgICAgICAgOiBNZW1iZXJVc2VzLkFMTF9TVEFUSUMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaGFzUGVuZGluZ05vcm1hbFVzZSA9PiAhaXNGdWxseUludm9rZWQ7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRnVsbHlJbnZva2VkID0+IF9wYXJhbWV0ZXJVc2FnZS5pc0Z1bGx5VXNlZDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgZnVsbHlVc2VkID0+IGlzRnVsbHlJbnZva2VkICYmIGhhc1JlYWQ7CgogIEBvdmVycmlkZQogIFBhcmFtZXRlclN0cnVjdHVyZSBnZXQgaW52b2tlZFBhcmFtZXRlcnMgPT4gX3BhcmFtZXRlclVzYWdlLmludm9rZWRQYXJhbWV0ZXJzOwoKICBAb3ZlcnJpZGUKICBNZW1iZXJVc2FnZSBjbG9uZSgpIHsKICAgIHJldHVybiBuZXcgUGFyYW1ldGVyVHJhY2tpbmdGdW5jdGlvblVzYWdlLmNsb25lZCgKICAgICAgICBlbnRpdHksIF9wYXJhbWV0ZXJVc2FnZS5jbG9uZSgpLCBfcGVuZGluZ1VzZS5jbG9uZSgpLAogICAgICAgIGhhc1JlYWQ6IGhhc1JlYWQpOwogIH0KfQoKY2xhc3MgR2V0dGVyVXNhZ2UgZXh0ZW5kcyBNZW1iZXJVc2FnZSB7CiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNSZWFkOwoKICBHZXR0ZXJVc2FnZS5jbG9uZWQoRnVuY3Rpb25FbnRpdHkgZ2V0dGVyLCBFbnVtU2V0PE1lbWJlclVzZT4gcGVuZGluZ1VzZSwKICAgICAge3RoaXMuaGFzUmVhZH0pCiAgICAgIDogc3VwZXIuY2xvbmVkKGdldHRlciwgcGVuZGluZ1VzZSk7CgogIEdldHRlclVzYWdlKEZ1bmN0aW9uRW50aXR5IGdldHRlcikKICAgICAgOiBoYXNSZWFkID0gZmFsc2UsCiAgICAgICAgc3VwZXIuaW50ZXJuYWwoZ2V0dGVyKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgZnVsbHlVc2VkID0+IGhhc1JlYWQ7CgogIEBvdmVycmlkZQogIEVudW1TZXQ8TWVtYmVyVXNlPiByZWFkKCkgewogICAgaWYgKGhhc1JlYWQpIHsKICAgICAgcmV0dXJuIE1lbWJlclVzZXMuTk9ORTsKICAgIH0KICAgIGhhc1JlYWQgPSB0cnVlOwogICAgcmV0dXJuIF9wZW5kaW5nVXNlLnJlbW92ZUFsbChNZW1iZXJVc2VzLk5PUk1BTF9PTkxZKTsKICB9CgogIEBvdmVycmlkZQogIEVudW1TZXQ8TWVtYmVyVXNlPiBpbnZva2UoQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlKSA9PiByZWFkKCk7CgogIEBvdmVycmlkZQogIEVudW1TZXQ8TWVtYmVyVXNlPiBmdWxseVVzZSgpID0+IHJlYWQoKTsKCiAgQG92ZXJyaWRlCiAgTWVtYmVyVXNhZ2UgY2xvbmUoKSB7CiAgICByZXR1cm4gbmV3IEdldHRlclVzYWdlLmNsb25lZChlbnRpdHksIF9wZW5kaW5nVXNlLmNsb25lKCksCiAgICAgICAgaGFzUmVhZDogaGFzUmVhZCk7CiAgfQp9CgpjbGFzcyBTZXR0ZXJVc2FnZSBleHRlbmRzIE1lbWJlclVzYWdlIHsKICBAb3ZlcnJpZGUKICBib29sIGhhc1dyaXRlOwoKICBTZXR0ZXJVc2FnZS5jbG9uZWQoRnVuY3Rpb25FbnRpdHkgc2V0dGVyLCBFbnVtU2V0PE1lbWJlclVzZT4gcGVuZGluZ1VzZSwKICAgICAge3RoaXMuaGFzV3JpdGV9KQogICAgICA6IHN1cGVyLmNsb25lZChzZXR0ZXIsIHBlbmRpbmdVc2UpOwoKICBTZXR0ZXJVc2FnZShGdW5jdGlvbkVudGl0eSBzZXR0ZXIpCiAgICAgIDogaGFzV3JpdGUgPSBmYWxzZSwKICAgICAgICBzdXBlci5pbnRlcm5hbChzZXR0ZXIpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBmdWxseVVzZWQgPT4gaGFzV3JpdGU7CgogIEBvdmVycmlkZQogIEVudW1TZXQ8TWVtYmVyVXNlPiB3cml0ZSgpIHsKICAgIGlmIChoYXNXcml0ZSkgewogICAgICByZXR1cm4gTWVtYmVyVXNlcy5OT05FOwogICAgfQogICAgaGFzV3JpdGUgPSB0cnVlOwogICAgcmV0dXJuIF9wZW5kaW5nVXNlLnJlbW92ZUFsbChNZW1iZXJVc2VzLk5PUk1BTF9PTkxZKTsKICB9CgogIEBvdmVycmlkZQogIEVudW1TZXQ8TWVtYmVyVXNlPiBmdWxseVVzZSgpID0+IHdyaXRlKCk7CgogIEBvdmVycmlkZQogIE1lbWJlclVzYWdlIGNsb25lKCkgewogICAgcmV0dXJuIG5ldyBTZXR0ZXJVc2FnZS5jbG9uZWQoZW50aXR5LCBfcGVuZGluZ1VzZS5jbG9uZSgpLAogICAgICAgIGhhc1dyaXRlOiBoYXNXcml0ZSk7CiAgfQp9CgpjbGFzcyBDb25zdHJ1Y3RvclVzYWdlIGV4dGVuZHMgTWVtYmVyVXNhZ2UgewogIEBvdmVycmlkZQogIGJvb2wgaGFzSW52b2tlOwoKICBDb25zdHJ1Y3RvclVzYWdlLmNsb25lZCgKICAgICAgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IsIEVudW1TZXQ8TWVtYmVyVXNlPiBwZW5kaW5nVXNlLAogICAgICB7dGhpcy5oYXNJbnZva2V9KQogICAgICA6IHN1cGVyLmNsb25lZChjb25zdHJ1Y3RvciwgcGVuZGluZ1VzZSk7CgogIENvbnN0cnVjdG9yVXNhZ2UoQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IpCiAgICAgIDogaGFzSW52b2tlID0gZmFsc2UsCiAgICAgICAgc3VwZXIuaW50ZXJuYWwoY29uc3RydWN0b3IpOwoKICBAb3ZlcnJpZGUKICBDb25zdHJ1Y3RvckVudGl0eSBnZXQgZW50aXR5ID0+IHN1cGVyLmVudGl0eTsKCiAgQG92ZXJyaWRlCiAgRW51bVNldDxNZW1iZXJVc2U+IGdldCBfb3JpZ2luYWxVc2UgPT4gTWVtYmVyVXNlcy5OT1JNQUxfT05MWTsKCiAgQG92ZXJyaWRlCiAgRW51bVNldDxNZW1iZXJVc2U+IGludm9rZShDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUpIHsKICAgIGlmIChoYXNJbnZva2UpIHsKICAgICAgcmV0dXJuIE1lbWJlclVzZXMuTk9ORTsKICAgIH0KICAgIGhhc0ludm9rZSA9IHRydWU7CiAgICByZXR1cm4gX3BlbmRpbmdVc2UKICAgICAgICAucmVtb3ZlQWxsKGhhc1JlYWQgPyBNZW1iZXJVc2VzLk5PTkUgOiBNZW1iZXJVc2VzLk5PUk1BTF9PTkxZKTsKICB9CgogIEBvdmVycmlkZQogIEVudW1TZXQ8TWVtYmVyVXNlPiBmdWxseVVzZSgpID0+CiAgICAgIGludm9rZShlbnRpdHkucGFyYW1ldGVyU3RydWN0dXJlLmNhbGxTdHJ1Y3R1cmUpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBmdWxseVVzZWQgPT4gaGFzSW52b2tlOwoKICBAb3ZlcnJpZGUKICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgZ2V0IGludm9rZWRQYXJhbWV0ZXJzID0+CiAgICAgIGhhc0ludm9rZSA/IGVudGl0eS5wYXJhbWV0ZXJTdHJ1Y3R1cmUgOiBudWxsOwoKICBAb3ZlcnJpZGUKICBNZW1iZXJVc2FnZSBjbG9uZSgpIHsKICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3JVc2FnZS5jbG9uZWQoZW50aXR5LCBfcGVuZGluZ1VzZS5jbG9uZSgpLAogICAgICAgIGhhc0ludm9rZTogaGFzSW52b2tlKTsKICB9Cn0KCmNsYXNzIFBhcmFtZXRlclRyYWNraW5nQ29uc3RydWN0b3JVc2FnZSBleHRlbmRzIE1lbWJlclVzYWdlIHsKICBmaW5hbCBQYXJhbWV0ZXJVc2FnZSBfcGFyYW1ldGVyVXNhZ2U7CgogIFBhcmFtZXRlclRyYWNraW5nQ29uc3RydWN0b3JVc2FnZS5jbG9uZWQoQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IsCiAgICAgIHRoaXMuX3BhcmFtZXRlclVzYWdlLCBFbnVtU2V0PE1lbWJlclVzZT4gcGVuZGluZ1VzZSkKICAgICAgOiBzdXBlci5jbG9uZWQoY29uc3RydWN0b3IsIHBlbmRpbmdVc2UpOwoKICBQYXJhbWV0ZXJUcmFja2luZ0NvbnN0cnVjdG9yVXNhZ2UoQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IpCiAgICAgIDogX3BhcmFtZXRlclVzYWdlID0gbmV3IFBhcmFtZXRlclVzYWdlKGNvbnN0cnVjdG9yLnBhcmFtZXRlclN0cnVjdHVyZSksCiAgICAgICAgc3VwZXIuaW50ZXJuYWwoY29uc3RydWN0b3IpOwoKICBAb3ZlcnJpZGUKICBDb25zdHJ1Y3RvckVudGl0eSBnZXQgZW50aXR5ID0+IHN1cGVyLmVudGl0eTsKCiAgQG92ZXJyaWRlCiAgRW51bVNldDxNZW1iZXJVc2U+IGdldCBfb3JpZ2luYWxVc2UgPT4gTWVtYmVyVXNlcy5OT1JNQUxfT05MWTsKCiAgQG92ZXJyaWRlCiAgRW51bVNldDxNZW1iZXJVc2U+IGludm9rZShDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUpIHsKICAgIGlmIChpc0Z1bGx5SW52b2tlZCkgewogICAgICByZXR1cm4gTWVtYmVyVXNlcy5OT05FOwogICAgfQogICAgYm9vbCBhbHJlYWR5SGFzSW52b2tlID0gaGFzSW52b2tlOwogICAgYm9vbCBoYXNQYXJ0aWFsQ2hhbmdlID0gX3BhcmFtZXRlclVzYWdlLmludm9rZShjYWxsU3RydWN0dXJlKTsKICAgIEVudW1TZXQ8TWVtYmVyVXNlPiByZXN1bHQ7CiAgICBpZiAoYWxyZWFkeUhhc0ludm9rZSkgewogICAgICByZXN1bHQgPSBNZW1iZXJVc2VzLk5PTkU7CiAgICB9IGVsc2UgewogICAgICByZXN1bHQgPSBfcGVuZGluZ1VzZQogICAgICAgICAgLnJlbW92ZUFsbChoYXNSZWFkID8gTWVtYmVyVXNlcy5OT05FIDogTWVtYmVyVXNlcy5OT1JNQUxfT05MWSk7CiAgICB9CiAgICByZXR1cm4gaGFzUGFydGlhbENoYW5nZQogICAgICAgID8gcmVzdWx0LnVuaW9uKE1lbWJlclVzZXMuUEFSVElBTF9VU0VfT05MWSkKICAgICAgICA6IHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIEVudW1TZXQ8TWVtYmVyVXNlPiBmdWxseVVzZSgpID0+CiAgICAgIGludm9rZShlbnRpdHkucGFyYW1ldGVyU3RydWN0dXJlLmNhbGxTdHJ1Y3R1cmUpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBoYXNJbnZva2UgPT4gX3BhcmFtZXRlclVzYWdlLmhhc0ludm9rZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgZnVsbHlVc2VkID0+IF9wYXJhbWV0ZXJVc2FnZS5pc0Z1bGx5VXNlZDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaGFzUGVuZGluZ05vcm1hbFVzZSA9PiAhaXNGdWxseUludm9rZWQ7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRnVsbHlJbnZva2VkID0+IF9wYXJhbWV0ZXJVc2FnZS5pc0Z1bGx5VXNlZDsKCiAgQG92ZXJyaWRlCiAgUGFyYW1ldGVyU3RydWN0dXJlIGdldCBpbnZva2VkUGFyYW1ldGVycyA9PiBfcGFyYW1ldGVyVXNhZ2UuaW52b2tlZFBhcmFtZXRlcnM7CgogIEBvdmVycmlkZQogIE1lbWJlclVzYWdlIGNsb25lKCkgewogICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJUcmFja2luZ0NvbnN0cnVjdG9yVXNhZ2UuY2xvbmVkKAogICAgICAgIGVudGl0eSwgX3BhcmFtZXRlclVzYWdlLmNsb25lKCksIF9wZW5kaW5nVXNlLmNsb25lKCkpOwogIH0KfQoKLy8vIEVudW0gY2xhc3MgZm9yIHRoZSBwb3NzaWJsZSBraW5kIG9mIHVzZSBvZiBbTWVtYmVyRW50aXR5XSBvYmplY3RzLgplbnVtIE1lbWJlclVzZSB7CiAgLy8vIFJlYWQgb3Igd3JpdGUgb2YgYSBmaWVsZCwgb3IgaW52b2NhdGlvbiBvZiBhIG1ldGhvZC4KICBOT1JNQUwsCgogIC8vLyBUZWFyLW9mZiBvZiBhbiBpbnN0YW5jZSBtZXRob2QuCiAgQ0xPU1VSSVpFX0lOU1RBTkNFLAoKICAvLy8gVGVhci1vZmYgb2YgYSBzdGF0aWMgbWV0aG9kLgogIENMT1NVUklaRV9TVEFUSUMsCgogIC8vLyBJbnZvY2F0aW9uIHRoYXQgcHJvdmlkZXMgcHJldmlvdXNseSB1bnByb3ZpZGVkIG9wdGlvbmFsIHBhcmFtZXRlcnMuCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCB0byBjaGVjayB0aGF0IG5vIHBhcnRpYWwgdXNlIGlzIG1pc3NlZCBieSB0aGUgZW5xdWV1ZXIsIGFzCiAgLy8vIGFzc2VydGVkIHRocm91Z2ggdGhlIGBFbnF1ZXVlcnkuY2hlY2tFbnF1ZXVlckNvbnNpc3RlbmN5YCBtZXRob2QuCiAgUEFSVElBTF9VU0UsCn0KCi8vLyBDb21tb24gW0VudW1TZXRdcyB1c2VkIGZvciBbTWVtYmVyVXNlXS4KY2xhc3MgTWVtYmVyVXNlcyB7CiAgc3RhdGljIGNvbnN0IEVudW1TZXQ8TWVtYmVyVXNlPiBOT05FID0gY29uc3QgRW51bVNldDxNZW1iZXJVc2U+LmZpeGVkKDApOwogIHN0YXRpYyBjb25zdCBFbnVtU2V0PE1lbWJlclVzZT4gTk9STUFMX09OTFkgPQogICAgICBjb25zdCBFbnVtU2V0PE1lbWJlclVzZT4uZml4ZWQoMSk7CiAgc3RhdGljIGNvbnN0IEVudW1TZXQ8TWVtYmVyVXNlPiBDTE9TVVJJWkVfSU5TVEFOQ0VfT05MWSA9CiAgICAgIGNvbnN0IEVudW1TZXQ8TWVtYmVyVXNlPi5maXhlZCgyKTsKICBzdGF0aWMgY29uc3QgRW51bVNldDxNZW1iZXJVc2U+IENMT1NVUklaRV9TVEFUSUNfT05MWSA9CiAgICAgIGNvbnN0IEVudW1TZXQ8TWVtYmVyVXNlPi5maXhlZCg0KTsKICBzdGF0aWMgY29uc3QgRW51bVNldDxNZW1iZXJVc2U+IEFMTF9JTlNUQU5DRSA9CiAgICAgIGNvbnN0IEVudW1TZXQ8TWVtYmVyVXNlPi5maXhlZCgzKTsKICBzdGF0aWMgY29uc3QgRW51bVNldDxNZW1iZXJVc2U+IEFMTF9TVEFUSUMgPQogICAgICBjb25zdCBFbnVtU2V0PE1lbWJlclVzZT4uZml4ZWQoNSk7CiAgc3RhdGljIGNvbnN0IEVudW1TZXQ8TWVtYmVyVXNlPiBQQVJUSUFMX1VTRV9PTkxZID0KICAgICAgY29uc3QgRW51bVNldDxNZW1iZXJVc2U+LmZpeGVkKDgpOwp9Cgp0eXBlZGVmIHZvaWQgTWVtYmVyVXNlZENhbGxiYWNrKE1lbWJlckVudGl0eSBtZW1iZXIsIEVudW1TZXQ8TWVtYmVyVXNlPiB1c2VTZXQpOwoKLy8vIFJlZ2lzdHJ5IGZvciB0aGUgb2JzZXJ2ZWQgdXNlIG9mIGEgY2xhc3MgW2VudGl0eV0gaW4gdGhlIG9wZW4gd29ybGQuCi8vIFRPRE8oam9obm5pd2ludGhlcik6IE1lcmdlIHRoaXMgd2l0aCBbSW5zdGFudGlhdGlvbkluZm9dLgpjbGFzcyBDbGFzc1VzYWdlIGV4dGVuZHMgQWJzdHJhY3RVc2FnZTxDbGFzc1VzZT4gewogIGJvb2wgaXNJbnN0YW50aWF0ZWQgPSBmYWxzZTsKICBib29sIGlzSW1wbGVtZW50ZWQgPSBmYWxzZTsKCiAgZmluYWwgQ2xhc3NFbnRpdHkgY2xzOwoKICBDbGFzc1VzYWdlKHRoaXMuY2xzKSA6IHN1cGVyKCk7CgogIEVudW1TZXQ8Q2xhc3NVc2U+IGluc3RhbnRpYXRlKCkgewogICAgaWYgKGlzSW5zdGFudGlhdGVkKSB7CiAgICAgIHJldHVybiBDbGFzc1VzZXMuTk9ORTsKICAgIH0KICAgIGlzSW5zdGFudGlhdGVkID0gdHJ1ZTsKICAgIHJldHVybiBfcGVuZGluZ1VzZS5yZW1vdmVBbGwoQ2xhc3NVc2VzLklOU1RBTlRJQVRFRF9PTkxZKTsKICB9CgogIEVudW1TZXQ8Q2xhc3NVc2U+IGltcGxlbWVudCgpIHsKICAgIGlmIChpc0ltcGxlbWVudGVkKSB7CiAgICAgIHJldHVybiBDbGFzc1VzZXMuTk9ORTsKICAgIH0KICAgIGlzSW1wbGVtZW50ZWQgPSB0cnVlOwogICAgcmV0dXJuIF9wZW5kaW5nVXNlLnJlbW92ZUFsbChDbGFzc1VzZXMuSU1QTEVNRU5URURfT05MWSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFbnVtU2V0PENsYXNzVXNlPiBnZXQgX29yaWdpbmFsVXNlID0+IENsYXNzVXNlcy5BTEw7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICckY2xzOiR7YXBwbGllZFVzZS5pdGVyYWJsZShDbGFzc1VzZS52YWx1ZXMpfSc7Cn0KCi8vLyBFbnVtIGNsYXNzIGZvciB0aGUgcG9zc2libGUga2luZCBvZiB1c2Ugb2YgW0NsYXNzRW50aXR5XSBvYmplY3RzLgplbnVtIENsYXNzVXNlIHsgSU5TVEFOVElBVEVELCBJTVBMRU1FTlRFRCB9CgovLy8gQ29tbW9uIFtFbnVtU2V0XXMgdXNlZCBmb3IgW0NsYXNzVXNlXS4KY2xhc3MgQ2xhc3NVc2VzIHsKICBzdGF0aWMgY29uc3QgRW51bVNldDxDbGFzc1VzZT4gTk9ORSA9IGNvbnN0IEVudW1TZXQ8Q2xhc3NVc2U+LmZpeGVkKDApOwogIHN0YXRpYyBjb25zdCBFbnVtU2V0PENsYXNzVXNlPiBJTlNUQU5USUFURURfT05MWSA9CiAgICAgIGNvbnN0IEVudW1TZXQ8Q2xhc3NVc2U+LmZpeGVkKDEpOwogIHN0YXRpYyBjb25zdCBFbnVtU2V0PENsYXNzVXNlPiBJTVBMRU1FTlRFRF9PTkxZID0KICAgICAgY29uc3QgRW51bVNldDxDbGFzc1VzZT4uZml4ZWQoMik7CiAgc3RhdGljIGNvbnN0IEVudW1TZXQ8Q2xhc3NVc2U+IEFMTCA9IGNvbnN0IEVudW1TZXQ8Q2xhc3NVc2U+LmZpeGVkKDMpOwp9Cgp0eXBlZGVmIHZvaWQgQ2xhc3NVc2VkQ2FsbGJhY2soQ2xhc3NFbnRpdHkgY2xzLCBFbnVtU2V0PENsYXNzVXNlPiB1c2VTZXQpOwoKLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWVyZ2UgdGhpcyB3aXRoIFtNZW1iZXJVc2FnZV0uCmFic3RyYWN0IGNsYXNzIFN0YXRpY01lbWJlclVzYWdlIGV4dGVuZHMgQWJzdHJhY3RVc2FnZTxNZW1iZXJVc2U+CiAgICBpbXBsZW1lbnRzIE1lbWJlclVzYWdlIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBNZW1iZXJFbnRpdHkgZW50aXR5OwoKICBib29sIGhhc05vcm1hbFVzZTsKICBib29sIGdldCBoYXNDbG9zdXJpemF0aW9uID0+IGZhbHNlOwoKICBTdGF0aWNNZW1iZXJVc2FnZS5jbG9uZWQodGhpcy5lbnRpdHksIEVudW1TZXQ8TWVtYmVyVXNlPiBwZW5kaW5nVXNlLAogICAgICB7dGhpcy5oYXNOb3JtYWxVc2U6IGZhbHNlfSkKICAgICAgOiBzdXBlci5jbG9uZWQocGVuZGluZ1VzZSk7CgogIFN0YXRpY01lbWJlclVzYWdlLmludGVybmFsKHRoaXMuZW50aXR5KQogICAgICA6IHRoaXMuaGFzTm9ybWFsVXNlID0gZmFsc2UsCiAgICAgICAgc3VwZXIoKTsKCiAgRW51bVNldDxNZW1iZXJVc2U+IG5vcm1hbFVzZSgpIHsKICAgIGlmIChoYXNOb3JtYWxVc2UpIHsKICAgICAgcmV0dXJuIE1lbWJlclVzZXMuTk9ORTsKICAgIH0KICAgIGhhc05vcm1hbFVzZSA9IHRydWU7CiAgICByZXR1cm4gX3BlbmRpbmdVc2UucmVtb3ZlQWxsKE1lbWJlclVzZXMuTk9STUFMX09OTFkpOwogIH0KCiAgRW51bVNldDxNZW1iZXJVc2U+IHRlYXJPZmYoKTsKCiAgQG92ZXJyaWRlCiAgRW51bVNldDxNZW1iZXJVc2U+IGluaXQoKSA9PiBub3JtYWxVc2UoKTsKCiAgQG92ZXJyaWRlCiAgRW51bVNldDxNZW1iZXJVc2U+IGNvbnN0YW50SW5pdChDb25zdGFudFZhbHVlIGNvbnN0YW50KSA9PiBub3JtYWxVc2UoKTsKCiAgQG92ZXJyaWRlCiAgRW51bVNldDxNZW1iZXJVc2U+IHJlYWQoKSA9PiB0ZWFyT2ZmKCk7CgogIEBvdmVycmlkZQogIEVudW1TZXQ8TWVtYmVyVXNlPiB3cml0ZSgpID0+IG5vcm1hbFVzZSgpOwoKICBAb3ZlcnJpZGUKICBFbnVtU2V0PE1lbWJlclVzZT4gaW52b2tlKENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSkgPT4gbm9ybWFsVXNlKCk7CgogIEBvdmVycmlkZQogIEVudW1TZXQ8TWVtYmVyVXNlPiBmdWxseVVzZSgpID0+IG5vcm1hbFVzZSgpOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxDb25zdGFudFZhbHVlPiBnZXQgaW5pdGlhbENvbnN0YW50cyA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBoYXNQZW5kaW5nTm9ybWFsVXNlID0+IF9wZW5kaW5nVXNlLmNvbnRhaW5zKE1lbWJlclVzZS5OT1JNQUwpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0Z1bGx5SW52b2tlZCA9PiBoYXNJbnZva2U7CgogIEBvdmVycmlkZQogIEVudW1TZXQ8TWVtYmVyVXNlPiBnZXQgX29yaWdpbmFsVXNlID0+IE1lbWJlclVzZXMuTk9STUFMX09OTFk7CgogIEBvdmVycmlkZQogIGJvb2wgZGF0YUVxdWFscyhNZW1iZXJVc2FnZSBvdGhlcikgewogICAgYXNzZXJ0KGVudGl0eSA9PSBvdGhlci5lbnRpdHkpOwogICAgcmV0dXJuIGhhc0luaXQgPT0gb3RoZXIuaGFzSW5pdCAmJgogICAgICAgIGhhc1JlYWQgPT0gb3RoZXIuaGFzUmVhZCAmJgogICAgICAgIGhhc0ludm9rZSA9PSBvdGhlci5oYXNJbnZva2UgJiYKICAgICAgICBoYXNXcml0ZSA9PSBvdGhlci5oYXNXcml0ZSAmJgogICAgICAgIGhhc1BlbmRpbmdDbG9zdXJpemF0aW9uVXNlID09IG90aGVyLmhhc1BlbmRpbmdDbG9zdXJpemF0aW9uVXNlICYmCiAgICAgICAgaGFzUGVuZGluZ05vcm1hbFVzZSA9PSBvdGhlci5oYXNQZW5kaW5nTm9ybWFsVXNlICYmCiAgICAgICAgZnVsbHlVc2VkID09IG90aGVyLmZ1bGx5VXNlZCAmJgogICAgICAgIGlzRnVsbHlJbnZva2VkID09IG90aGVyLmlzRnVsbHlJbnZva2VkICYmCiAgICAgICAgX3BlbmRpbmdVc2UgPT0gb3RoZXIuX3BlbmRpbmdVc2UgJiYKICAgICAgICBhcHBsaWVkVXNlID09IG90aGVyLmFwcGxpZWRVc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJGVudGl0eToke2FwcGxpZWRVc2UuaXRlcmFibGUoTWVtYmVyVXNlLnZhbHVlcyl9JzsKfQoKY2xhc3MgR2VuZXJhbFN0YXRpY01lbWJlclVzYWdlIGV4dGVuZHMgU3RhdGljTWVtYmVyVXNhZ2UgewogIEdlbmVyYWxTdGF0aWNNZW1iZXJVc2FnZShNZW1iZXJFbnRpdHkgZW50aXR5KSA6IHN1cGVyLmludGVybmFsKGVudGl0eSk7CgogIEdlbmVyYWxTdGF0aWNNZW1iZXJVc2FnZS5jbG9uZWQoCiAgICAgIE1lbWJlckVudGl0eSBlbnRpdHksIEVudW1TZXQ8TWVtYmVyVXNlPiBwZW5kaW5nVXNlLAogICAgICB7Ym9vbCBoYXNOb3JtYWxVc2V9KQogICAgICA6IHN1cGVyLmNsb25lZChlbnRpdHksIHBlbmRpbmdVc2UsIGhhc05vcm1hbFVzZTogaGFzTm9ybWFsVXNlKTsKCiAgQG92ZXJyaWRlCiAgRW51bVNldDxNZW1iZXJVc2U+IHRlYXJPZmYoKSA9PiBub3JtYWxVc2UoKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaGFzSW5pdCA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBmdWxseVVzZWQgPT4gaGFzTm9ybWFsVXNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBoYXNJbnZva2UgPT4gaGFzTm9ybWFsVXNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBoYXNXcml0ZSA9PiBoYXNOb3JtYWxVc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGhhc1JlYWQgPT4gaGFzTm9ybWFsVXNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBoYXNQZW5kaW5nQ2xvc3VyaXphdGlvblVzZSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgUGFyYW1ldGVyU3RydWN0dXJlIGdldCBpbnZva2VkUGFyYW1ldGVycyA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBNZW1iZXJVc2FnZSBjbG9uZSgpIHsKICAgIHJldHVybiBuZXcgR2VuZXJhbFN0YXRpY01lbWJlclVzYWdlLmNsb25lZChlbnRpdHksIF9wZW5kaW5nVXNlLmNsb25lKCksCiAgICAgICAgaGFzTm9ybWFsVXNlOiBoYXNOb3JtYWxVc2UpOwogIH0KfQoKY2xhc3MgU3RhdGljRnVuY3Rpb25Vc2FnZSBleHRlbmRzIFN0YXRpY01lbWJlclVzYWdlIHsKICBAb3ZlcnJpZGUKICBib29sIGhhc0Nsb3N1cml6YXRpb247CgogIFN0YXRpY0Z1bmN0aW9uVXNhZ2UoRnVuY3Rpb25FbnRpdHkgZW50aXR5KQogICAgICA6IGhhc0Nsb3N1cml6YXRpb24gPSBmYWxzZSwKICAgICAgICBzdXBlci5pbnRlcm5hbChlbnRpdHkpOwoKICBTdGF0aWNGdW5jdGlvblVzYWdlLmNsb25lZCgKICAgICAgRnVuY3Rpb25FbnRpdHkgZW50aXR5LCBFbnVtU2V0PE1lbWJlclVzZT4gcGVuZGluZ1VzZSwKICAgICAge2Jvb2wgaGFzTm9ybWFsVXNlLCB0aGlzLmhhc0Nsb3N1cml6YXRpb259KQogICAgICA6IHN1cGVyLmNsb25lZChlbnRpdHksIHBlbmRpbmdVc2UsIGhhc05vcm1hbFVzZTogaGFzTm9ybWFsVXNlKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGVudGl0eSA9PiBzdXBlci5lbnRpdHk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGhhc0luaXQgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgRW51bVNldDxNZW1iZXJVc2U+IHRlYXJPZmYoKSB7CiAgICBpZiAoaGFzQ2xvc3VyaXphdGlvbikgewogICAgICByZXR1cm4gTWVtYmVyVXNlcy5OT05FOwogICAgfQogICAgaGFzTm9ybWFsVXNlID0gaGFzQ2xvc3VyaXphdGlvbiA9IHRydWU7CiAgICByZXR1cm4gX3BlbmRpbmdVc2UucmVtb3ZlQWxsKE1lbWJlclVzZXMuQUxMX1NUQVRJQyk7CiAgfQoKICBAb3ZlcnJpZGUKICBFbnVtU2V0PE1lbWJlclVzZT4gZ2V0IF9vcmlnaW5hbFVzZSA9PiBNZW1iZXJVc2VzLkFMTF9TVEFUSUM7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGhhc1BlbmRpbmdDbG9zdXJpemF0aW9uVXNlID0+CiAgICAgIF9wZW5kaW5nVXNlLmNvbnRhaW5zKE1lbWJlclVzZS5DTE9TVVJJWkVfU1RBVElDKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgZnVsbHlVc2VkID0+IGhhc05vcm1hbFVzZSAmJiBoYXNDbG9zdXJpemF0aW9uOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBoYXNJbnZva2UgPT4gaGFzTm9ybWFsVXNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBoYXNXcml0ZSA9PiBoYXNOb3JtYWxVc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGhhc1JlYWQgPT4gaGFzQ2xvc3VyaXphdGlvbjsKCiAgQG92ZXJyaWRlCiAgUGFyYW1ldGVyU3RydWN0dXJlIGdldCBpbnZva2VkUGFyYW1ldGVycyA9PgogICAgICBoYXNJbnZva2UgPyBlbnRpdHkucGFyYW1ldGVyU3RydWN0dXJlIDogbnVsbDsKCiAgQG92ZXJyaWRlCiAgTWVtYmVyVXNhZ2UgY2xvbmUoKSB7CiAgICByZXR1cm4gbmV3IFN0YXRpY0Z1bmN0aW9uVXNhZ2UuY2xvbmVkKGVudGl0eSwgX3BlbmRpbmdVc2UuY2xvbmUoKSwKICAgICAgICBoYXNOb3JtYWxVc2U6IGhhc05vcm1hbFVzZSwgaGFzQ2xvc3VyaXphdGlvbjogaGFzQ2xvc3VyaXphdGlvbik7CiAgfQp9CgovLy8gT2JqZWN0IHVzZWQgZm9yIHRyYWNraW5nIHBhcmFtZXRlciB1c2UgaW4gY29uc3RydWN0b3IgYW5kIG1ldGhvZAovLy8gaW52b2NhdGlvbnMuCmNsYXNzIFBhcmFtZXRlclVzYWdlIHsKICAvLy8gVGhlIG9yaWdpbmFsIHBhcmFtZXRlciBzdHJ1Y3R1cmUgb2YgdGhlIG1ldGhvZCBvciBjb25zdHJ1Y3Rvci4KICBmaW5hbCBQYXJhbWV0ZXJTdHJ1Y3R1cmUgX3BhcmFtZXRlclN0cnVjdHVyZTsKCiAgLy8vIGB0cnVlYCBpZiB0aGUgbWV0aG9kIG9yIGNvbnN0cnVjdG9yIGhhcyBhdCBsZWFzdCBvbmUgaW52b2NhdGlvbi4KICBib29sIF9oYXNJbnZva2U7CgogIC8vLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgKG9wdGlvbmFsKSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgcHJvdmlkZWQgaW4KICAvLy8gaW52b2NhdGlvbnMgb2YgdGhlIG1ldGhvZCBvciBjb25zdHJ1Y3Rvci4KICAvLy8KICAvLy8gSWYgYWxsIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBoYXZpbmcgYmVlbiBwcm92aWRlZCB0aGlzIGlzIHNldCB0byBgbnVsbGAuCiAgaW50IF9wcm92aWRlZFBvc2l0aW9uYWxQYXJhbWV0ZXJzOwoKICAvLy8gYHRydWVgIGlmIGFsbCB0eXBlIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHByb3ZpZGVkIGluIGF0IGxlYXN0IG9uZQogIC8vLyBpbnZvY2F0aW9uIG9mIHRoZSBtZXRob2Qgb3IgY29uc3RydWN0b3IuCiAgYm9vbCBfYXJlQWxsVHlwZVBhcmFtZXRlcnNQcm92aWRlZDsKCiAgLy8vIFRoZSBzZXQgb2YgbmFtZWQgcGFyYW1ldGVycyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIHByb3ZpZGVkIGluIGFueQogIC8vLyBpbnZvY2F0aW9uIG9mIHRoZSBtZXRob2Qgb3IgY29uc3RydWN0b3IuCiAgLy8vCiAgLy8vIElmIGFsbCBuYW1lZCBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBwcm92aWRlZCB0aGlzIGlzIHNldCB0byBgbnVsbGAuCiAgU2V0PFN0cmluZz4gX3VucHJvdmlkZWROYW1lZFBhcmFtZXRlcnM7CgogIFBhcmFtZXRlclVzYWdlKHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZSkgewogICAgX2hhc0ludm9rZSA9IGZhbHNlOwogICAgX2FyZUFsbFR5cGVQYXJhbWV0ZXJzUHJvdmlkZWQgPSBfcGFyYW1ldGVyU3RydWN0dXJlLnR5cGVQYXJhbWV0ZXJzID09IDA7CiAgICBfcHJvdmlkZWRQb3NpdGlvbmFsUGFyYW1ldGVycyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmUucG9zaXRpb25hbFBhcmFtZXRlcnMgPT0KICAgICAgICAgICAgX3BhcmFtZXRlclN0cnVjdHVyZS5yZXF1aXJlZFBhcmFtZXRlcnMKICAgICAgICA/IG51bGwKICAgICAgICA6IDA7CiAgICBpZiAoIV9wYXJhbWV0ZXJTdHJ1Y3R1cmUubmFtZWRQYXJhbWV0ZXJzLmlzRW1wdHkpIHsKICAgICAgX3VucHJvdmlkZWROYW1lZFBhcmFtZXRlcnMgPQogICAgICAgICAgbmV3IFNldDxTdHJpbmc+LmZyb20oX3BhcmFtZXRlclN0cnVjdHVyZS5uYW1lZFBhcmFtZXRlcnMpOwogICAgfQogIH0KCiAgUGFyYW1ldGVyVXNhZ2UuY2xvbmVkKHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZSwKICAgICAge2Jvb2wgaGFzSW52b2tlLAogICAgICBpbnQgcHJvdmlkZWRQb3NpdGlvbmFsUGFyYW1ldGVycywKICAgICAgYm9vbCBhcmVBbGxUeXBlUGFyYW1ldGVyc1Byb3ZpZGVkLAogICAgICBTZXQ8U3RyaW5nPiB1bnByb3ZpZGVkTmFtZWRQYXJhbWV0ZXJzfSkKICAgICAgOiBfaGFzSW52b2tlID0gaGFzSW52b2tlLAogICAgICAgIF9wcm92aWRlZFBvc2l0aW9uYWxQYXJhbWV0ZXJzID0gcHJvdmlkZWRQb3NpdGlvbmFsUGFyYW1ldGVycywKICAgICAgICBfYXJlQWxsVHlwZVBhcmFtZXRlcnNQcm92aWRlZCA9IGFyZUFsbFR5cGVQYXJhbWV0ZXJzUHJvdmlkZWQsCiAgICAgICAgX3VucHJvdmlkZWROYW1lZFBhcmFtZXRlcnMgPSB1bnByb3ZpZGVkTmFtZWRQYXJhbWV0ZXJzOwoKICBib29sIGludm9rZShDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUpIHsKICAgIGlmIChpc0Z1bGx5VXNlZCkgcmV0dXJuIGZhbHNlOwogICAgX2hhc0ludm9rZSA9IHRydWU7CiAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKICAgIGlmIChfcHJvdmlkZWRQb3NpdGlvbmFsUGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIGludCBuZXdQcm92aWRlZFBvc2l0aW9uYWxQYXJhbWV0ZXJzID0gTWF0aC5tYXgoCiAgICAgICAgICBfcHJvdmlkZWRQb3NpdGlvbmFsUGFyYW1ldGVycywgY2FsbFN0cnVjdHVyZS5wb3NpdGlvbmFsQXJndW1lbnRDb3VudCk7CiAgICAgIGNoYW5nZWQgfD0KICAgICAgICAgIG5ld1Byb3ZpZGVkUG9zaXRpb25hbFBhcmFtZXRlcnMgIT0gX3Byb3ZpZGVkUG9zaXRpb25hbFBhcmFtZXRlcnM7CiAgICAgIF9wcm92aWRlZFBvc2l0aW9uYWxQYXJhbWV0ZXJzID0gbmV3UHJvdmlkZWRQb3NpdGlvbmFsUGFyYW1ldGVyczsKICAgICAgaWYgKF9wcm92aWRlZFBvc2l0aW9uYWxQYXJhbWV0ZXJzID49CiAgICAgICAgICBfcGFyYW1ldGVyU3RydWN0dXJlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgICAgX3Byb3ZpZGVkUG9zaXRpb25hbFBhcmFtZXRlcnMgPSBudWxsOwogICAgICB9CiAgICB9CiAgICBpZiAoX3VucHJvdmlkZWROYW1lZFBhcmFtZXRlcnMgIT0gbnVsbCAmJgogICAgICAgIGNhbGxTdHJ1Y3R1cmUubmFtZWRBcmd1bWVudHMuaXNOb3RFbXB0eSkgewogICAgICBpbnQgX3Byb3ZpZGVkTmFtZWRQYXJhbWV0ZXJzQ291bnQgPSBfdW5wcm92aWRlZE5hbWVkUGFyYW1ldGVycy5sZW5ndGg7CiAgICAgIF91bnByb3ZpZGVkTmFtZWRQYXJhbWV0ZXJzLnJlbW92ZUFsbChjYWxsU3RydWN0dXJlLm5hbWVkQXJndW1lbnRzKTsKICAgICAgY2hhbmdlZCB8PQogICAgICAgICAgX3Byb3ZpZGVkTmFtZWRQYXJhbWV0ZXJzQ291bnQgIT0gX3VucHJvdmlkZWROYW1lZFBhcmFtZXRlcnMubGVuZ3RoOwogICAgICBpZiAoX3VucHJvdmlkZWROYW1lZFBhcmFtZXRlcnMuaXNFbXB0eSkgewogICAgICAgIF91bnByb3ZpZGVkTmFtZWRQYXJhbWV0ZXJzID0gbnVsbDsKICAgICAgfQogICAgfQogICAgaWYgKCFfYXJlQWxsVHlwZVBhcmFtZXRlcnNQcm92aWRlZCAmJiBjYWxsU3RydWN0dXJlLnR5cGVBcmd1bWVudENvdW50ID4gMCkgewogICAgICBfYXJlQWxsVHlwZVBhcmFtZXRlcnNQcm92aWRlZCA9IHRydWU7CiAgICAgIGNoYW5nZWQgPSB0cnVlOwogICAgfQogICAgcmV0dXJuIGNoYW5nZWQ7CiAgfQoKICBib29sIGdldCBoYXNJbnZva2UgPT4gX2hhc0ludm9rZTsKCiAgYm9vbCBnZXQgaXNGdWxseVVzZWQgPT4KICAgICAgX2hhc0ludm9rZSAmJgogICAgICBfcHJvdmlkZWRQb3NpdGlvbmFsUGFyYW1ldGVycyA9PSBudWxsICYmCiAgICAgIF91bnByb3ZpZGVkTmFtZWRQYXJhbWV0ZXJzID09IG51bGwgJiYKICAgICAgX2FyZUFsbFR5cGVQYXJhbWV0ZXJzUHJvdmlkZWQ7CgogIHZvaWQgZnVsbHlVc2UoKSB7CiAgICBfaGFzSW52b2tlID0gdHJ1ZTsKICAgIF9wcm92aWRlZFBvc2l0aW9uYWxQYXJhbWV0ZXJzID0gbnVsbDsKICAgIF91bnByb3ZpZGVkTmFtZWRQYXJhbWV0ZXJzID0gbnVsbDsKICAgIF9hcmVBbGxUeXBlUGFyYW1ldGVyc1Byb3ZpZGVkID0gdHJ1ZTsKICB9CgogIFBhcmFtZXRlclN0cnVjdHVyZSBnZXQgaW52b2tlZFBhcmFtZXRlcnMgewogICAgaWYgKCFfaGFzSW52b2tlKSByZXR1cm4gbnVsbDsKICAgIGlmIChpc0Z1bGx5VXNlZCkgcmV0dXJuIF9wYXJhbWV0ZXJTdHJ1Y3R1cmU7CiAgICByZXR1cm4gbmV3IFBhcmFtZXRlclN0cnVjdHVyZSgKICAgICAgICBfcGFyYW1ldGVyU3RydWN0dXJlLnJlcXVpcmVkUGFyYW1ldGVycywKICAgICAgICBfcHJvdmlkZWRQb3NpdGlvbmFsUGFyYW1ldGVycyA/PwogICAgICAgICAgICBfcGFyYW1ldGVyU3RydWN0dXJlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgIF91bnByb3ZpZGVkTmFtZWRQYXJhbWV0ZXJzID09IG51bGwKICAgICAgICAgICAgPyBfcGFyYW1ldGVyU3RydWN0dXJlLm5hbWVkUGFyYW1ldGVycwogICAgICAgICAgICA6IF9wYXJhbWV0ZXJTdHJ1Y3R1cmUubmFtZWRQYXJhbWV0ZXJzCiAgICAgICAgICAgICAgICAud2hlcmUoKG4pID0+ICFfdW5wcm92aWRlZE5hbWVkUGFyYW1ldGVycy5jb250YWlucyhuKSkKICAgICAgICAgICAgICAgIC50b0xpc3QoKSwKICAgICAgICBfYXJlQWxsVHlwZVBhcmFtZXRlcnNQcm92aWRlZCA/IF9wYXJhbWV0ZXJTdHJ1Y3R1cmUudHlwZVBhcmFtZXRlcnMgOiAwKTsKICB9CgogIFBhcmFtZXRlclVzYWdlIGNsb25lKCkgewogICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJVc2FnZS5jbG9uZWQoX3BhcmFtZXRlclN0cnVjdHVyZSwKICAgICAgICBoYXNJbnZva2U6IF9oYXNJbnZva2UsCiAgICAgICAgcHJvdmlkZWRQb3NpdGlvbmFsUGFyYW1ldGVyczogX3Byb3ZpZGVkUG9zaXRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgYXJlQWxsVHlwZVBhcmFtZXRlcnNQcm92aWRlZDogX2FyZUFsbFR5cGVQYXJhbWV0ZXJzUHJvdmlkZWQsCiAgICAgICAgdW5wcm92aWRlZE5hbWVkUGFyYW1ldGVyczogX3VucHJvdmlkZWROYW1lZFBhcmFtZXRlcnM/LnRvU2V0KCkpOwogIH0KfQqEXQBOTjwBHAEZIyQ6Hx4BIiABKgE6JgQBPkABHwEvLAFRLi09NgQCAUo+HQEvAUEiASs9GiE7D0AIIiYiJicdPg8tCA1RHTsPKggGBAEvHAE4AVA7HQE2HgFOTjwfAUgGTVFIIygBUE0VNAFNUEk6SgFHETABQRYBRiMGTQ0wAU4rBk0NTgFRFgZJFTABUBYxAUsjBk1DTQFPFjQBDEEBDCcBDBwtLSMEARcBJyQnJCgmSjwoMiwoBAEMSwIBJwwQDBAMEQEpAUYzKQE4GRkaIEYVDgYEAQxRAQwuAQw4AQweEx4GFE8WOgYTBAEMPB4lEwQBDB4THgYUTxY6BhMEAQwfFB4GFU8WOgYTBAEMRAEMIhUeBik6BAEMGD5BBAEMT1FQAgEsDBAMEAEpAUskKQE9Hh4gFQ4GBAEMUQEMLgEMLAEMHhMeBhRPFjoGEwQBDDweJRMEAQweEx4GFE8WOgYTBAEMRAEMIhUeBh46BAEMGEMtBAEMQ09QAgEqDBIMEAFPJiwBKSAeIyhPGUo5BgQBDC0BDClRAQxBOzoBDCsBDDsVHgYWF0gEAQwiFRUgCBY7Ly8aGDwNIjskJAYEAQwuAQwuNAEMGEExBAIBOwwQASgBQTsWLAE6GUsjKE8ZSiUGBAEMMwEMQTs6AQwpUQEMKwEMOyceBidDHxwgDRtKBhw0EgQBDCInIBwVIAgWOy8vGjwNFjskJAYEAQwzAQw6AQwzAQxRAQwYNj4bBAIBKAwQAUsWKgElGSABDCEBDB4THgYUOgQBDEQBDCsBDBg/GwQCASgMEQFLFyoBJRogAQwiAQwfFB4GFToEAQwsAQwYPx0EAgEtDBIBG0QYLwEyGyUBDDABDEEBDDsVHgYWF0gEAQwjNwEMIwEMLjQBDBhEHwQCAT4oAUo7LwFDTiUBDDABDEEBDDsaHgYnQx8cIA0bSgYcNBIEAQwjNwEMMwEMNQEMMwEMOgEMUQEMGDk/BAIBRxE7CgEmFgEjFAFKBk5IDwIBLBNMMCk8KTopMSkvKTUpAgFRAUk9Mx8eARkBIgEkGh0GGz8EASIZHQYaPgQBDDcBDEcCAUYsASsSSjUoNChJAgFLATdCHQwdARUmAUciIgEqIxEBIxgeBhk6BAEgAQwsAQxKAQwqAQwtAQxJAQwwAQw4AQxKAQwoAQxBAQwnJCckKCZKPCgyLCgEAQxLAgE7SgEjOhtGAQwvAQwcAQwmAQwmAQwlAQwkAQwwAQw0AQwYTCUEAgE2DBkBLSIgAR48MkYBDC0BDBwBDCEcHgYsOQQBDEABDCk4AQw6AQwmAQwlAQwoAQwuNAEMGEdJBAIBRREXRTABRxMBSTAGTyUBRy8mAUkvBkgqAS0YTVAzDw04I0UGBAEyFygpLiBGRkABLSMXGjE2URFMRys2LggGLjNNShFOMCsIBlEsFgYUBAEkARoULywlARQXKicqBAEtIjEjMCk2KzIyRxtRBAEbOh9FRUkEAgEvcGFja2FnZTpjb21waWxlci9zcmMvdW5pdmVyc2UvbWVtYmVyX3VzYWdlLmRhcnQvc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvdXRpbC9lbnVtc2V0LmRhcnSZ8C8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMudXRpbC5lbnVtc2V0OwoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOwoKLy8vIEEgc2V0IG9mIGVudW0gdmFsdWVzIGJhc2VkIG9uIGEgYml0IG1hc2sgb2YgdGhlIHNoaWZ0ZWQgZW51bSBpbmRpY2VzLgphYnN0cmFjdCBjbGFzcyBFbnVtU2V0PEU+IHsKICAvLy8gQ3JlYXRlcyBhbiBlbXB0eSBtdXRhYmxlIHNldC4KICBmYWN0b3J5IEVudW1TZXQoKSA9IF9FbnVtU2V0PEU+OwoKICAvLy8gQ3JlYXRlcyBhIG11dGFibGUgc2V0IGZyb20gdGhlIGJpdCBtYXNrIFt2YWx1ZV0uCiAgZmFjdG9yeSBFbnVtU2V0LmZyb21WYWx1ZShpbnQgdmFsdWUpID0gX0VudW1TZXQ8RT4uZnJvbVZhbHVlOwoKICAvLy8gQ3JlYXRlcyBhbiBpbW11dGFibGUgc2V0IGZyb20gdGhlIGJpdCBtYXNrIFt2YWx1ZV0uCiAgY29uc3QgZmFjdG9yeSBFbnVtU2V0LmZpeGVkKGludCB2YWx1ZSkgPSBfQ29uc3RFbnVtU2V0PEU+OwoKICAvLy8gQ3JlYXRlIGEgc2V0IGNvbnRhaW5pbmcgdGhlIFt2YWx1ZXNdLiBJZiBbZml4ZWRdIGlzIGB0cnVlYCB0aGUgc2V0IGlzCiAgLy8vIGltbXV0YWJsZS4KICBmYWN0b3J5IEVudW1TZXQuZnJvbVZhbHVlcyhJdGVyYWJsZTxFPiB2YWx1ZXMsIHtib29sIGZpeGVkOiBmYWxzZX0pIHsKICAgIGlmIChmaXhlZCkgewogICAgICByZXR1cm4gbmV3IF9Db25zdEVudW1TZXQ8RT4uZnJvbVZhbHVlcyh2YWx1ZXMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBfRW51bVNldDxFPi5mcm9tVmFsdWVzKHZhbHVlcyk7CiAgICB9CiAgfQoKICBjb25zdCBFbnVtU2V0Ll8oKTsKCiAgLy8vIFRoZSBiaXQgbWFzayBvZiB0aGUgc2hpZnRlZCBpbmRpY2VzIGZvciB0aGUgZW51bSB2YWx1ZXMgaW4gdGhpcyBzZXQuCiAgaW50IGdldCB2YWx1ZTsKCiAgLy8vIFNldHMgdGhlIGVudW0gdmFsdWVzIGluIHRoaXMgc2V0IHRocm91Z2ggYSBiaXQgbWFzayBvZiB0aGUgc2hpZnRlZCBlbnVtCiAgLy8vIHZhbHVlIGluZGljZXMuCiAgdm9pZCBzZXQgdmFsdWUoaW50IG1hc2spOwoKICAvLy8gQWRkcyBbZW51bVZhbHVlXSB0byB0aGlzIHNldC4KICB2b2lkIGFkZChFIGVudW1WYWx1ZSk7CgogIC8vLyBBZGRzIGFsbCBlbnVtIHZhbHVlcyBpbiBbc2V0XSB0byB0aGlzIHNldC4KICB2b2lkIGFkZEFsbChFbnVtU2V0PEU+IHNldCk7CgogIC8vLyBSZW1vdmVzIFtlbnVtVmFsdWVdIGZyb20gdGhpcyBzZXQuCiAgdm9pZCByZW1vdmUoRSBlbnVtVmFsdWUpOwoKICAvLy8gUmVtb3ZlcyBhbGwgZW51bSB2YWx1ZXMgaW4gW3NldF0gZnJvbSB0aGlzIHNldC4gVGhlIHNldCBvZiByZW1vdmVkIHZhbHVlcwogIC8vLyBpcyByZXR1cm5lZC4KICBFbnVtU2V0PEU+IHJlbW92ZUFsbChFbnVtU2V0PEU+IHNldCk7CgogIC8vLyBSZXR1cm5zIGEgbmV3IHNldCBjb250YWluaW5nIGFsbCB2YWx1ZXMgaW4gYm90aCB0aGlzIGFuZCB0aGUgW290aGVyXSBzZXQuCiAgRW51bVNldDxFPiBpbnRlcnNlY3Rpb24oRW51bVNldDxFPiBvdGhlcikgewogICAgcmV0dXJuIG5ldyBFbnVtU2V0LmZyb21WYWx1ZSh2YWx1ZSAmIG90aGVyLnZhbHVlKTsKICB9CgogIC8vLyBSZXR1cm5zIGEgbmV3IHNldCBjb250YWluaW5nIGFsbCB2YWx1ZXMgZWl0aGVyIGluIHRoaXMgc2V0IG9yIGluIHRoZQogIC8vLyBbb3RoZXJdIHNldC4KICBFbnVtU2V0PEU+IHVuaW9uKEVudW1TZXQ8RT4gb3RoZXIpIHsKICAgIHJldHVybiBuZXcgRW51bVNldC5mcm9tVmFsdWUodmFsdWUgfCBvdGhlci52YWx1ZSk7CiAgfQoKICAvLy8gUmV0dXJucyBhIG5ldyBzZXQgY29udGFpbmluZyBhbGwgdmFsdWVzIGluIHRoaXMgc2V0IHRoYXQgYXJlIG5vdCBpbiB0aGUKICAvLy8gW290aGVyXSBzZXQuCiAgRW51bVNldDxFPiBtaW51cyhFbnVtU2V0PEU+IG90aGVyKSB7CiAgICByZXR1cm4gbmV3IEVudW1TZXQuZnJvbVZhbHVlKHZhbHVlICYgfm90aGVyLnZhbHVlKTsKICB9CgogIC8vLyBDbGVhcnMgdGhpcyBzZXQuCiAgdm9pZCBjbGVhcigpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2VudW1WYWx1ZV0gaXMgaW4gdGhpcyBzZXQuCiAgYm9vbCBjb250YWlucyhFIGVudW1WYWx1ZSkgewogICAgcmV0dXJuICh2YWx1ZSAmICgxIDw8IChlbnVtVmFsdWUgYXMgZHluYW1pYykuaW5kZXgpKSAhPSAwOwogIH0KCiAgLy8vIFJldHVybnMgYW4gW0l0ZXJhYmxlXSBvZiB0aGUgdmFsdWVzIGlzIGluIHRoaXMgc2V0IHVzaW5nIFt2YWx1ZXNdIHRvCiAgLy8vIGNvbnZlcnQgdGhlIHN0b3JlZCBpbmRpY2VzIHRvIGVudW0gdmFsdWVzLgogIC8vLwogIC8vLyBUaGUgbWV0aG9kIGlzIHR5cGljYWxseSBjYWxsZWQgd2l0aCB0aGUgYHZhbHVlc2AgcHJvcGVydHkgb2YgdGhlIGVudW0KICAvLy8gY2xhc3MgYXMgYXJndW1lbnQ6CiAgLy8vCiAgLy8vICAgICBFbnVtU2V0PEVudW1DbGFzcz4gc2V0ID0gLi4uCiAgLy8vICAgICBJdGVyYWJsZTxFbnVtQ2xhc3M+IGl0ZXJhYmxlID0gc2V0Lml0ZXJhYmxlKEVudW1DbGFzcy52YWx1ZXMpOwogIC8vLwogIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKExpc3Q8RT4gdmFsdWVzKSB7CiAgICByZXR1cm4gbmV3IF9FbnVtU2V0SXRlcmFibGUodGhpcywgdmFsdWVzKTsKICB9CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGFuZCBbb3RoZXJdIGhhdmUgYW55IGVsZW1lbnRzIGluIGNvbW1vbi4KICBib29sIGludGVyc2VjdHMoRW51bVNldDxFPiBvdGhlcikgewogICAgcmV0dXJuICh2YWx1ZSAmIG90aGVyLnZhbHVlKSAhPSAwOwogIH0KCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHRoaXMgc2V0IGlzIGVtcHR5LgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gdmFsdWUgPT0gMDsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHRoaXMgc2V0IGlzIG5vdCBlbXB0eS4KICBib29sIGdldCBpc05vdEVtcHR5ID0+IHZhbHVlICE9IDA7CgogIC8vLyBSZXR1cm5zIGEgbmV3IG11dGFibGUgZW51bSBzZXQgdGhhdCBjb250YWlucyB0aGUgdmFsdWVzIG9mIHRoaXMgc2V0LgogIEVudW1TZXQ8RT4gY2xvbmUoKSA9PiBuZXcgRW51bVNldDxFPi5mcm9tVmFsdWUodmFsdWUpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHZhbHVlLmhhc2hDb2RlICogMTk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgRW51bVNldDxFPikgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHZhbHVlID09IG90aGVyLnZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgaWYgKHZhbHVlID09IDApIHJldHVybiAnMCc7CiAgICBpbnQgaW5kZXggPSB2YWx1ZS5iaXRMZW5ndGggLSAxOwogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgaW50IG1hc2sgPSAxIDw8IGluZGV4OwogICAgd2hpbGUgKGluZGV4ID49IDApIHsKICAgICAgc2Iud3JpdGUoKHZhbHVlICYgbWFzaykgIT0gMCA/ICcxJyA6ICcwJyk7CiAgICAgIGluZGV4LS07CiAgICAgIG1hc2sgPj49IDE7CiAgICB9CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCi8vLyBNdXRhYmxlIGltcGxlbWVudGF0aW9uIG9mIFtFbnVtU2V0XS4KY2xhc3MgX0VudW1TZXQ8RT4gZXh0ZW5kcyBFbnVtU2V0PEU+IHsKICBpbnQgX3ZhbHVlOwoKICBfRW51bVNldCgpIDogdGhpcy5mcm9tVmFsdWUoMCk7CgogIF9FbnVtU2V0LmZyb21WYWx1ZSh0aGlzLl92YWx1ZSkgOiBzdXBlci5fKCk7CgogIF9FbnVtU2V0LmZyb21WYWx1ZXMoSXRlcmFibGU8RT4gdmFsdWVzKQogICAgICA6IHRoaXMuX3ZhbHVlID0gMCwKICAgICAgICBzdXBlci5fKCkgewogICAgdmFsdWVzLmZvckVhY2goYWRkKTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgdmFsdWUgPT4gX3ZhbHVlOwoKICBAb3ZlcnJpZGUKICB2b2lkIHNldCB2YWx1ZShpbnQgbWFzaykgewogICAgX3ZhbHVlID0gbWFzazsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWRkKEUgZW51bVZhbHVlKSB7CiAgICBfdmFsdWUgfD0gMSA8PCAoZW51bVZhbHVlIGFzIGR5bmFtaWMpLmluZGV4OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRBbGwoRW51bVNldDxFPiBzZXQpIHsKICAgIF92YWx1ZSB8PSBzZXQudmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlbW92ZShFIGVudW1WYWx1ZSkgewogICAgX3ZhbHVlICY9IH4oMSA8PCAoZW51bVZhbHVlIGFzIGR5bmFtaWMpLmluZGV4KTsKICB9CgogIEBvdmVycmlkZQogIEVudW1TZXQ8RT4gcmVtb3ZlQWxsKEVudW1TZXQ8RT4gc2V0KSB7CiAgICBpbnQgcmVtb3ZlZCA9IF92YWx1ZSAmIHNldC52YWx1ZTsKICAgIF92YWx1ZSAmPSB+c2V0LnZhbHVlOwogICAgcmV0dXJuIG5ldyBFbnVtU2V0PEU+LmZyb21WYWx1ZShyZW1vdmVkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2xlYXIoKSB7CiAgICBfdmFsdWUgPSAwOwogIH0KfQoKLy8vIEltbXV0YWJsZSBpbXBsZW1lbnRhdGlvbiBvZiBbRW51bVNldF0uCmNsYXNzIF9Db25zdEVudW1TZXQ8RT4gZXh0ZW5kcyBFbnVtU2V0PEU+IHsKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgdmFsdWU7CgogIGNvbnN0IF9Db25zdEVudW1TZXQodGhpcy52YWx1ZSkgOiBzdXBlci5fKCk7CgogIGZhY3RvcnkgX0NvbnN0RW51bVNldC5mcm9tVmFsdWVzKEl0ZXJhYmxlPEU+IHZhbHVlcykgewogICAgaW50IHZhbHVlID0gMDsKICAgIHZvaWQgYWRkKEUgZW51bVZhbHVlKSB7CiAgICAgIGlmIChlbnVtVmFsdWUgIT0gbnVsbCkgewogICAgICAgIHZhbHVlIHw9IDEgPDwgKGVudW1WYWx1ZSBhcyBkeW5hbWljKS5pbmRleDsKICAgICAgfQogICAgfQoKICAgIHZhbHVlcy5mb3JFYWNoKGFkZCk7CiAgICByZXR1cm4gbmV3IF9Db25zdEVudW1TZXQodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXQgdmFsdWUoaW50IG1hc2spIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdFbnVtU2V0LnZhbHVlPScpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGQoRSBlbnVtVmFsdWUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdFbnVtU2V0LmFkZCcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRBbGwoRW51bVNldDxFPiBzZXQpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdFbnVtU2V0LmFkZEFsbCcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjbGVhcigpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdFbnVtU2V0LmNsZWFyJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlbW92ZShFIGVudW1WYWx1ZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ0VudW1TZXQucmVtb3ZlJyk7CiAgfQoKICBAb3ZlcnJpZGUKICBFbnVtU2V0PEU+IHJlbW92ZUFsbChFbnVtU2V0PEU+IHNldCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ0VudW1TZXQucmVtb3ZlQWxsJyk7CiAgfQp9CgpjbGFzcyBfRW51bVNldEl0ZXJhYmxlPEU+IGV4dGVuZHMgSXRlcmFibGVCYXNlPEU+IHsKICBmaW5hbCBFbnVtU2V0PEU+IF9lbnVtU2V0OwogIGZpbmFsIExpc3Q8RT4gX3ZhbHVlczsKCiAgX0VudW1TZXRJdGVyYWJsZSh0aGlzLl9lbnVtU2V0LCB0aGlzLl92YWx1ZXMpOwoKICBAb3ZlcnJpZGUKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3IgPT4gbmV3IF9FbnVtU2V0SXRlcmF0b3IoX2VudW1TZXQudmFsdWUsIF92YWx1ZXMpOwp9CgpjbGFzcyBfRW51bVNldEl0ZXJhdG9yPEU+IGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewogIGludCBfdmFsdWU7CiAgaW50IF9pbmRleDsKICBpbnQgX21hc2s7CiAgZmluYWwgTGlzdDxFPiBfdmFsdWVzOwogIEUgX2N1cnJlbnQ7CgogIF9FbnVtU2V0SXRlcmF0b3IodGhpcy5fdmFsdWUsIHRoaXMuX3ZhbHVlcyk7CgogIEBvdmVycmlkZQogIEUgZ2V0IGN1cnJlbnQgPT4gX2N1cnJlbnQ7CgogIEBvdmVycmlkZQogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBpZiAoX3ZhbHVlID09IDApIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIHsKICAgICAgaWYgKF9tYXNrID09IG51bGwpIHsKICAgICAgICBfaW5kZXggPSBfdmFsdWUuYml0TGVuZ3RoIC0gMTsKICAgICAgICBfbWFzayA9IDEgPDwgX2luZGV4OwogICAgICB9CiAgICAgIF9jdXJyZW50ID0gbnVsbDsKICAgICAgd2hpbGUgKF9pbmRleCA+PSAwKSB7CiAgICAgICAgaWYgKF9tYXNrICYgX3ZhbHVlICE9IDApIHsKICAgICAgICAgIF9jdXJyZW50ID0gX3ZhbHVlc1tfaW5kZXhdOwogICAgICAgIH0KICAgICAgICBfbWFzayA+Pj0gMTsKICAgICAgICBfaW5kZXgtLTsKICAgICAgICBpZiAoX2N1cnJlbnQgIT0gbnVsbCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBfY3VycmVudCAhPSBudWxsOwogICAgfQogIH0KfQqBFABOTjwBHgEaAUocJCMBN0ABOj0BTBFIETYNMQYEARUBSxEBThUcASQZATEfASkcAVATKAFQLjcEAUsTJzcEAU4TJzgEARcQATQfPwQBSzEGTBkGJ0kGKS8EAUYmJwQBKyIBLyUBSzkBDCsBDBwtLCEEAQwWICUqGxkxDxIGGgQCASknDgEiAS8BKhkUGQQBDBsBDB0TBAEMGjEEAQwgGQQBDB00BAEMKSYaLgQBDBEQBAIBKywMEwEvATkTHB80CAYBGSUEAQwdMgQBDBovBAEMIDIEAQwRMQQBDB0yBAEMKTUEAgE0HRkBMQEMTQIBMw4ODRkOAS8BDB0BDBQXFA0bJx0IFxwjJgoVEiARCggfBgQCASZwYWNrYWdlOmNvbXBpbGVyL3NyYy91dGlsL2VudW1zZXQuZGFydDVzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9jb21tb24vYmFja2VuZF9hcGkuZGFydIPeLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5iYWNrZW5kX2FwaTsKCmltcG9ydCAnLi4vY29tbW9uL3Jlc29sdXRpb24uZGFydCcgc2hvdyBSZXNvbHV0aW9uSW1wYWN0OwppbXBvcnQgJy4uL3VuaXZlcnNlL3dvcmxkX2ltcGFjdC5kYXJ0JyBzaG93IFdvcmxkSW1wYWN0OwoKLy8vIFRhcmdldC1zcGVjaWZpYyB0cmFuc2Zvcm1hdGlvbiBmb3IgcmVzb2x1dGlvbiB3b3JsZCBpbXBhY3RzLgovLy8KLy8vIFRoaXMgcHJvY2Vzc2VzIHRhcmdldC1hZ25vc3RpYyBbUmVzb2x1dGlvbkltcGFjdF1zIGFuZCBjcmVhdGVzIFtXb3JsZEltcGFjdF0KLy8vIGluIHdoaWNoIGJhY2tlbmQvdGFyZ2V0IHNwZWNpZmljIGltcGFjdCBkYXRhIGlzIGFkZGVkLCBmb3IgZXhhbXBsZTogaWYKLy8vIGNlcnRhaW4gZmVhdHVyZSBpcyB1c2VkIHRoYXQgcmVxdWlyZXMgc29tZSBoZWxwZXIgY29kZSBmcm9tIHRoZSBiYWNrZW5kCi8vLyBsaWJyYXJpZXMsIHRoaXMgd2lsbCBiZSBpbmNsdWRlZCBieSB0aGUgaW1wYWN0IHRyYW5zZm9ybWVyLgpjbGFzcyBJbXBhY3RUcmFuc2Zvcm1lciB7CiAgLy8vIFRyYW5zZm9ybSB0aGUgW1Jlc29sdXRpb25JbXBhY3RdIGludG8gYSBbV29ybGRJbXBhY3RdIGFkZGluZyB0aGUKICAvLy8gYmFja2VuZCBkZXBlbmRlbmNpZXMgZm9yIGZlYXR1cmVzIHVzZWQgaW4gW3dvcmxkSW1wYWN0XS4KICBXb3JsZEltcGFjdCB0cmFuc2Zvcm1SZXNvbHV0aW9uSW1wYWN0KFJlc29sdXRpb25JbXBhY3Qgd29ybGRJbXBhY3QpIHsKICAgIHJldHVybiB3b3JsZEltcGFjdDsKICB9Cn0KGABOTjwBHQE6OQFBBFFLTEAaRz9IGAQCASxwYWNrYWdlOmNvbXBpbGVyL3NyYy9jb21tb24vYmFja2VuZF9hcGkuZGFydDlzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL2Fubm90YXRpb25zLmRhcnSyPi8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGpzX2JhY2tlbmQuYmFja2VuZC5hbm5vdGF0aW9uczsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgS0NvbW1vbkVsZW1lbnRzLCBLRWxlbWVudEVudmlyb25tZW50OwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZGlhZ25vc3RpY3MvZGlhZ25vc3RpY19saXN0ZW5lci5kYXJ0JzsKaW1wb3J0ICcuLi9kaWFnbm9zdGljcy9tZXNzYWdlcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9pci9hbm5vdGF0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi9pci91dGlsLmRhcnQnOwppbXBvcnQgJy4uL2tlcm5lbC9kYXJ0MmpzX3RhcmdldC5kYXJ0JzsKaW1wb3J0ICcuLi9vcHRpb25zLmRhcnQnOwppbXBvcnQgJy4uL3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi91dGlsL2VudW1zZXQuZGFydCc7CgpjbGFzcyBQcmFnbWFBbm5vdGF0aW9uIHsKICBmaW5hbCBpbnQgX2luZGV4OwogIGZpbmFsIFN0cmluZyBuYW1lOwogIGZpbmFsIGJvb2wgZm9yRnVuY3Rpb25zT25seTsKICBmaW5hbCBib29sIGZvckZpZWxkc09ubHk7CiAgZmluYWwgYm9vbCBpbnRlcm5hbE9ubHk7CgogIGNvbnN0IFByYWdtYUFubm90YXRpb24odGhpcy5faW5kZXgsIHRoaXMubmFtZSwKICAgICAge3RoaXMuZm9yRnVuY3Rpb25zT25seTogZmFsc2UsCiAgICAgIHRoaXMuZm9yRmllbGRzT25seTogZmFsc2UsCiAgICAgIHRoaXMuaW50ZXJuYWxPbmx5OiBmYWxzZX0pOwoKICBpbnQgZ2V0IGluZGV4IHsKICAgIGFzc2VydChfaW5kZXggPT0gdmFsdWVzLmluZGV4T2YodGhpcykpOwogICAgcmV0dXJuIF9pbmRleDsKICB9CgogIC8vLyBUZWxscyB0aGUgb3B0aW1pemluZyBjb21waWxlciB0byBub3QgaW5saW5lIHRoZSBhbm5vdGF0ZWQgbWV0aG9kLgogIHN0YXRpYyBjb25zdCBQcmFnbWFBbm5vdGF0aW9uIG5vSW5saW5lID0KICAgICAgY29uc3QgUHJhZ21hQW5ub3RhdGlvbigwLCAnbm9JbmxpbmUnLCBmb3JGdW5jdGlvbnNPbmx5OiB0cnVlKTsKCiAgLy8vIFRlbGxzIHRoZSBvcHRpbWl6aW5nIGNvbXBpbGVyIHRvIGFsd2F5cyBpbmxpbmUgdGhlIGFubm90YXRlZCBtZXRob2QsIGlmCiAgLy8vIHBvc3NpYmxlLgogIHN0YXRpYyBjb25zdCBQcmFnbWFBbm5vdGF0aW9uIHRyeUlubGluZSA9CiAgICAgIGNvbnN0IFByYWdtYUFubm90YXRpb24oMSwgJ3RyeUlubGluZScsIGZvckZ1bmN0aW9uc09ubHk6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgUHJhZ21hQW5ub3RhdGlvbiBkaXNhYmxlRmluYWwgPSBjb25zdCBQcmFnbWFBbm5vdGF0aW9uKAogICAgICAyLCAnZGlzYWJsZUZpbmFsJywKICAgICAgZm9yRnVuY3Rpb25zT25seTogdHJ1ZSwgaW50ZXJuYWxPbmx5OiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFByYWdtYUFubm90YXRpb24gbm9FbGlzaW9uID0KICAgICAgY29uc3QgUHJhZ21hQW5ub3RhdGlvbigzLCAnbm9FbGlzaW9uJyk7CgogIC8vLyBUZWxscyB0aGUgb3B0aW1pemluZyBjb21waWxlciB0aGF0IHRoZSBhbm5vdGF0ZWQgbWV0aG9kIGNhbm5vdCB0aHJvdy4KICAvLy8gUmVxdWlyZXMgQHByYWdtYSgnZGFydDJqczpub0lubGluZScpIHRvIGZ1bmN0aW9uIGNvcnJlY3RseS4KICBzdGF0aWMgY29uc3QgUHJhZ21hQW5ub3RhdGlvbiBub1Rocm93cyA9IGNvbnN0IFByYWdtYUFubm90YXRpb24oNCwgJ25vVGhyb3dzJywKICAgICAgZm9yRnVuY3Rpb25zT25seTogdHJ1ZSwgaW50ZXJuYWxPbmx5OiB0cnVlKTsKCiAgLy8vIFRlbGxzIHRoZSBvcHRpbWl6aW5nIGNvbXBpbGVyIHRoYXQgdGhlIGFubm90YXRlZCBtZXRob2QgaGFzIG5vCiAgLy8vIHNpZGUtZWZmZWN0cy4gQWxsb2NhdGlvbnMgZG9uJ3QgY291bnQgYXMgc2lkZS1lZmZlY3RzLCBzaW5jZSB0aGV5IGNhbiBiZQogIC8vLyBkcm9wcGVkIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHNlbWFudGljcyBvZiB0aGUgcHJvZ3JhbS4KICAvLy8KICAvLy8gUmVxdWlyZXMgQHByYWdtYSgnZGFydDJqczpub0lubGluZScpIHRvIGZ1bmN0aW9uIGNvcnJlY3RseS4KICBzdGF0aWMgY29uc3QgUHJhZ21hQW5ub3RhdGlvbiBub1NpZGVFZmZlY3RzID0gY29uc3QgUHJhZ21hQW5ub3RhdGlvbigKICAgICAgNSwgJ25vU2lkZUVmZmVjdHMnLAogICAgICBmb3JGdW5jdGlvbnNPbmx5OiB0cnVlLCBpbnRlcm5hbE9ubHk6IHRydWUpOwoKICAvLy8gVXNlIHRoaXMgYXMgbWV0YWRhdGEgb24gbWV0aG9kIGRlY2xhcmF0aW9ucyB0byBkaXNhYmxlIGNsb3NlZCB3b3JsZAogIC8vLyBhc3N1bXB0aW9ucyBvbiBwYXJhbWV0ZXJzLCBlZmZlY3RpdmVseSBhc3N1bWluZyB0aGF0IHRoZSBydW50aW1lIGFyZ3VtZW50cwogIC8vLyBjb3VsZCBiZSBhbnkgdmFsdWUuIE5vdGUgdGhhdCB0aGUgY29uc3RyYWludHMgZHVlIHRvIHN0YXRpYyB0eXBlcyBzdGlsbAogIC8vLyBhcHBseS4KICBzdGF0aWMgY29uc3QgUHJhZ21hQW5ub3RhdGlvbiBhc3N1bWVEeW5hbWljID0gY29uc3QgUHJhZ21hQW5ub3RhdGlvbigKICAgICAgNiwgJ2Fzc3VtZUR5bmFtaWMnLAogICAgICBmb3JGdW5jdGlvbnNPbmx5OiB0cnVlLCBpbnRlcm5hbE9ubHk6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgTGlzdDxQcmFnbWFBbm5vdGF0aW9uPiB2YWx1ZXMgPSBbCiAgICBub0lubGluZSwKICAgIHRyeUlubGluZSwKICAgIGRpc2FibGVGaW5hbCwKICAgIG5vRWxpc2lvbiwKICAgIG5vVGhyb3dzLAogICAgbm9TaWRlRWZmZWN0cywKICAgIGFzc3VtZUR5bmFtaWMsCiAgXTsKfQoKTGlzdDxQcmFnbWFBbm5vdGF0aW9uRGF0YT4gY29tcHV0ZVByYWdtYUFubm90YXRpb25EYXRhKAogICAgS0NvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgS0VsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQsCiAgICBNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogIExpc3Q8UHJhZ21hQW5ub3RhdGlvbkRhdGE+IGFubm90YXRpb25zID0gW107CiAgZm9yIChDb25zdGFudFZhbHVlIGNvbnN0YW50VmFsdWUKICAgICAgaW4gZWxlbWVudEVudmlyb25tZW50LmdldE1lbWJlck1ldGFkYXRhKGVsZW1lbnQpKSB7CiAgICBpZiAoIWNvbnN0YW50VmFsdWUuaXNDb25zdHJ1Y3RlZE9iamVjdCkgY29udGludWU7CiAgICBDb25zdHJ1Y3RlZENvbnN0YW50VmFsdWUgdmFsdWUgPSBjb25zdGFudFZhbHVlOwogICAgQ2xhc3NFbnRpdHkgY2xzID0gdmFsdWUudHlwZS5lbGVtZW50OwogICAgYXNzZXJ0KGNscyAhPSBudWxsKTsgLy8gVW5yZXNvbHZlZCBjbGFzc2VzIG51bGwuCgogICAgaWYgKGNscyA9PSBjb21tb25FbGVtZW50cy5tZXRhTm9JbmxpbmVDbGFzcykgewogICAgICBhbm5vdGF0aW9ucy5hZGQoY29uc3QgUHJhZ21hQW5ub3RhdGlvbkRhdGEoJ25vSW5saW5lJykpOwogICAgfSBlbHNlIGlmIChjbHMgPT0gY29tbW9uRWxlbWVudHMubWV0YVRyeUlubGluZUNsYXNzKSB7CiAgICAgIGFubm90YXRpb25zLmFkZChjb25zdCBQcmFnbWFBbm5vdGF0aW9uRGF0YSgndHJ5SW5saW5lJykpOwogICAgfSBlbHNlIGlmIChjbHMgPT0gY29tbW9uRWxlbWVudHMucHJhZ21hQ2xhc3MpIHsKICAgICAgQ29uc3RhbnRWYWx1ZSBuYW1lVmFsdWUgPQogICAgICAgICAgdmFsdWUuZmllbGRzW2NvbW1vbkVsZW1lbnRzLnByYWdtYUNsYXNzTmFtZUZpZWxkXTsKICAgICAgaWYgKG5hbWVWYWx1ZSA9PSBudWxsIHx8ICFuYW1lVmFsdWUuaXNTdHJpbmcpIGNvbnRpbnVlOwogICAgICBTdHJpbmcgbmFtZSA9IChuYW1lVmFsdWUgYXMgU3RyaW5nQ29uc3RhbnRWYWx1ZSkuc3RyaW5nVmFsdWU7CiAgICAgIFN0cmluZyBwcmVmaXggPSAnZGFydDJqczonOwogICAgICBpZiAoIW5hbWUuc3RhcnRzV2l0aChwcmVmaXgpKSBjb250aW51ZTsKICAgICAgU3RyaW5nIHN1ZmZpeCA9IG5hbWUuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpOwoKICAgICAgQ29uc3RhbnRWYWx1ZSBvcHRpb25zVmFsdWUgPQogICAgICAgICAgdmFsdWUuZmllbGRzW2NvbW1vbkVsZW1lbnRzLnByYWdtYUNsYXNzT3B0aW9uc0ZpZWxkXTsKICAgICAgYW5ub3RhdGlvbnMuYWRkKAogICAgICAgICAgbmV3IFByYWdtYUFubm90YXRpb25EYXRhKHN1ZmZpeCwgaGFzT3B0aW9uczogIW9wdGlvbnNWYWx1ZS5pc051bGwpKTsKICAgIH0KICB9CiAgcmV0dXJuIGFubm90YXRpb25zOwp9CgpFbnVtU2V0PFByYWdtYUFubm90YXRpb24+IHByb2Nlc3NNZW1iZXJBbm5vdGF0aW9ucygKICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgRGlhZ25vc3RpY1JlcG9ydGVyIHJlcG9ydGVyLAogICAgaXIuTWVtYmVyIG1lbWJlciwKICAgIExpc3Q8UHJhZ21hQW5ub3RhdGlvbkRhdGE+IHByYWdtYUFubm90YXRpb25EYXRhKSB7CiAgRW51bVNldDxQcmFnbWFBbm5vdGF0aW9uPiB2YWx1ZXMgPSBuZXcgRW51bVNldDxQcmFnbWFBbm5vdGF0aW9uPigpOwoKICBVcmkgdXJpID0gbWVtYmVyLmVuY2xvc2luZ0xpYnJhcnkuaW1wb3J0VXJpOwogIGJvb2wgcGxhdGZvcm1Bbm5vdGF0aW9uc0FsbG93ZWQgPQogICAgICBvcHRpb25zLnRlc3RNb2RlIHx8IHVyaS5zY2hlbWUgPT0gJ2RhcnQnIHx8IG1heWJlRW5hYmxlTmF0aXZlKHVyaSk7CgogIGZvciAoUHJhZ21hQW5ub3RhdGlvbkRhdGEgZGF0YSBpbiBwcmFnbWFBbm5vdGF0aW9uRGF0YSkgewogICAgU3RyaW5nIG5hbWUgPSBkYXRhLm5hbWU7CiAgICBTdHJpbmcgc3VmZml4ID0gZGF0YS5zdWZmaXg7CiAgICBib29sIGZvdW5kID0gZmFsc2U7CiAgICBmb3IgKFByYWdtYUFubm90YXRpb24gYW5ub3RhdGlvbiBpbiBQcmFnbWFBbm5vdGF0aW9uLnZhbHVlcykgewogICAgICBpZiAoYW5ub3RhdGlvbi5uYW1lID09IHN1ZmZpeCkgewogICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICB2YWx1ZXMuYWRkKGFubm90YXRpb24pOwoKICAgICAgICBpZiAoZGF0YS5oYXNPcHRpb25zKSB7CiAgICAgICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICAgICAgY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUobWVtYmVyKSwKICAgICAgICAgICAgICBNZXNzYWdlS2luZC5HRU5FUklDLAogICAgICAgICAgICAgIHsndGV4dCc6ICJAcHJhZ21hKCckbmFtZScpIGFubm90YXRpb24gZG9lcyBub3QgdGFrZSBvcHRpb25zIn0pOwogICAgICAgIH0KICAgICAgICBpZiAoYW5ub3RhdGlvbi5mb3JGdW5jdGlvbnNPbmx5KSB7CiAgICAgICAgICBpZiAobWVtYmVyIGlzISBpci5Qcm9jZWR1cmUgJiYgbWVtYmVyIGlzISBpci5Db25zdHJ1Y3RvcikgewogICAgICAgICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICAgICAgICBjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZShtZW1iZXIpLCBNZXNzYWdlS2luZC5HRU5FUklDLCB7CiAgICAgICAgICAgICAgJ3RleHQnOiAiQHByYWdtYSgnJG5hbWUnKSBhbm5vdGF0aW9uIGlzIG9ubHkgc3VwcG9ydGVkICIKICAgICAgICAgICAgICAgICAgImZvciBtZXRob2RzIGFuZCBjb25zdHJ1Y3RvcnMuIgogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGFubm90YXRpb24uZm9yRmllbGRzT25seSkgewogICAgICAgICAgaWYgKG1lbWJlciBpcyEgaXIuRmllbGQpIHsKICAgICAgICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgICAgICAgICAgY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUobWVtYmVyKSwgTWVzc2FnZUtpbmQuR0VORVJJQywgewogICAgICAgICAgICAgICd0ZXh0JzogIkBwcmFnbWEoJyRuYW1lJykgYW5ub3RhdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCAiCiAgICAgICAgICAgICAgICAgICJmb3IgZmllbGRzLiIKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChhbm5vdGF0aW9uLmludGVybmFsT25seSAmJiAhcGxhdGZvcm1Bbm5vdGF0aW9uc0FsbG93ZWQpIHsKICAgICAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgICAgICBjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZShtZW1iZXIpLAogICAgICAgICAgICAgIE1lc3NhZ2VLaW5kLkdFTkVSSUMsCiAgICAgICAgICAgICAgeyd0ZXh0JzogIlVucmVjb2duaXplZCBkYXJ0MmpzIHByYWdtYSBAcHJhZ21hKCckbmFtZScpIn0pOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKCFmb3VuZCkgewogICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICBjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZShtZW1iZXIpLAogICAgICAgICAgTWVzc2FnZUtpbmQuR0VORVJJQywKICAgICAgICAgIHsndGV4dCc6ICJVbmtub3duIGRhcnQyanMgcHJhZ21hIEBwcmFnbWEoJyRuYW1lJykifSk7CiAgICB9CiAgfQoKICBpZiAodmFsdWVzLmNvbnRhaW5zKFByYWdtYUFubm90YXRpb24udHJ5SW5saW5lKSAmJgogICAgICB2YWx1ZXMuY29udGFpbnMoUHJhZ21hQW5ub3RhdGlvbi5ub0lubGluZSkpIHsKICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICBjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZShtZW1iZXIpLCBNZXNzYWdlS2luZC5HRU5FUklDLCB7CiAgICAgICd0ZXh0JzogIkBwcmFnbWEoJ2RhcnQyanM6dHJ5SW5saW5lJykgbXVzdCBub3QgYmUgdXNlZCB3aXRoICIKICAgICAgICAgICJAcHJhZ21hKCdkYXJ0MmpzOm5vSW5saW5lJykuIgogICAgfSk7CiAgICB2YWx1ZXMucmVtb3ZlKFByYWdtYUFubm90YXRpb24udHJ5SW5saW5lKTsKICB9CiAgaWYgKHZhbHVlcy5jb250YWlucyhQcmFnbWFBbm5vdGF0aW9uLm5vVGhyb3dzKSAmJgogICAgICAhdmFsdWVzLmNvbnRhaW5zKFByYWdtYUFubm90YXRpb24ubm9JbmxpbmUpKSB7CiAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKAogICAgICAgIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKG1lbWJlciksCiAgICAgICAgIkBwcmFnbWEoJ2RhcnQyanM6bm9UaHJvd3MnKSBzaG91bGQgYWx3YXlzIGJlIGNvbWJpbmVkIHdpdGggIgogICAgICAgICJAcHJhZ21hKCdkYXJ0MmpzOm5vSW5saW5lJykuIik7CiAgfQogIGlmICh2YWx1ZXMuY29udGFpbnMoUHJhZ21hQW5ub3RhdGlvbi5ub1NpZGVFZmZlY3RzKSAmJgogICAgICAhdmFsdWVzLmNvbnRhaW5zKFByYWdtYUFubm90YXRpb24ubm9JbmxpbmUpKSB7CiAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKAogICAgICAgIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKG1lbWJlciksCiAgICAgICAgIkBwcmFnbWEoJ2RhcnQyanM6bm9TaWRlRWZmZWN0cycpIHNob3VsZCBhbHdheXMgYmUgY29tYmluZWQgd2l0aCAiCiAgICAgICAgIkBwcmFnbWEoJ2RhcnQyanM6bm9JbmxpbmUnKS4iKTsKICB9CiAgcmV0dXJuIHZhbHVlczsKfQoKYWJzdHJhY3QgY2xhc3MgQW5ub3RhdGlvbnNEYXRhIHsKICAvLy8gRGVzZXJpYWxpemVzIGEgW0Fubm90YXRpb25zRGF0YV0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBBbm5vdGF0aW9uc0RhdGEucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSA9CiAgICAgIEFubm90YXRpb25zRGF0YUltcGwucmVhZEZyb21EYXRhU291cmNlOwoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtBbm5vdGF0aW9uc0RhdGFdIHRvIFtzaW5rXS4KICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFttZW1iZXJdIGhhcyBhbiBgQHByYWdtYSgnZGFydDJqczphc3N1bWVEeW5hbWljJylgIGFubm90YXRpb24uCiAgYm9vbCBoYXNBc3N1bWVEeW5hbWljKE1lbWJlckVudGl0eSBtZW1iZXIpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW21lbWJlcl0gaGFzIGEgYEBwcmFnbWEoJ2RhcnQyanM6bm9JbmxpbmUnKWAsIG9yCiAgLy8vIGBAcHJhZ21hKCdkYXJ0MmpzOm5vSW5saW5lJylgIGFubm90YXRpb24uCiAgYm9vbCBoYXNOb0lubGluZShNZW1iZXJFbnRpdHkgbWVtYmVyKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFttZW1iZXJdIGhhcyBhIGBAcHJhZ21hKCdkYXJ0MmpzOnRyeUlubGluZScpYCwgb3IKICAvLy8gYEBwcmFnbWEoJ2RhcnQyanM6dHJ5SW5saW5lJylgIGFubm90YXRpb24uCiAgYm9vbCBoYXNUcnlJbmxpbmUoTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbbWVtYmVyXSBoYXMgYSBgQHByYWdtYSgnZGFydDJqczpkaXNhYmxlRmluYWwnKWAKICAvLy8gYW5ub3RhdGlvbi4KICBib29sIGhhc0Rpc2FibGVGaW5hbChNZW1iZXJFbnRpdHkgbWVtYmVyKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFttZW1iZXJdIGhhcyBhIGBAcHJhZ21hKCdkYXJ0MmpzOm5vRWxpc2lvbicpYAogIC8vLyBhbm5vdGF0aW9uLgogIGJvb2wgaGFzTm9FbGlzaW9uKE1lbWJlckVudGl0eSBtZW1iZXIpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW21lbWJlcl0gaGFzIGEgYEBOb1Rocm93cygpYCBhbm5vdGF0aW9uLgogIGJvb2wgaGFzTm9UaHJvd3MoTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbbWVtYmVyXSBoYXMgYSBgQE5vU2lkZUVmZmVjdHMoKWAgYW5ub3RhdGlvbi4KICBib29sIGhhc05vU2lkZUVmZmVjdHMoTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIC8vLyBDYWxscyBbZl0gZm9yIGFsbCBmdW5jdGlvbnMgd2l0aCBhIGBAcHJhZ21hKCdkYXJ0MmpzOm5vSW5saW5lJylgLCBvcgogIC8vLyBgQHByYWdtYSgnZGFydDJqczpub0lubGluZScpYCBhbm5vdGF0aW9uLgogIHZvaWQgZm9yRWFjaE5vSW5saW5lKHZvaWQgZihGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikpOwoKICAvLy8gQ2FsbHMgW2ZdIGZvciBhbGwgZnVuY3Rpb25zIHdpdGggYSBgQHByYWdtYSgnZGFydDJqczp0cnlJbmxpbmUnKWAsIG9yCiAgLy8vIGBAcHJhZ21hKCdkYXJ0MmpzOnRyeUlubGluZScpYCBhbm5vdGF0aW9uLgogIHZvaWQgZm9yRWFjaFRyeUlubGluZSh2b2lkIGYoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pKTsKCiAgLy8vIENhbGxzIFtmXSBmb3IgYWxsIGZ1bmN0aW9ucyB3aXRoIGEgYEBwcmFnbWEoJ2RhcnQyanM6bm9UaHJvd3MnKWAKICAvLy8gYW5ub3RhdGlvbi4KICB2b2lkIGZvckVhY2hOb1Rocm93cyh2b2lkIGYoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pKTsKCiAgLy8vIENhbGxzIFtmXSBmb3IgYWxsIGZ1bmN0aW9ucyB3aXRoIGEgYEBwcmFnbWEoJ2RhcnQyanM6bm9TaWRlRWZmZWN0cycpYAogIC8vLyBhbm5vdGF0aW9uLgogIHZvaWQgZm9yRWFjaE5vU2lkZUVmZmVjdHModm9pZCBmKEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uKSk7Cn0KCmNsYXNzIEFubm90YXRpb25zRGF0YUltcGwgaW1wbGVtZW50cyBBbm5vdGF0aW9uc0RhdGEgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbQW5ub3RhdGlvbnNEYXRhXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2Fubm90YXRpb25zLWRhdGEnOwoKICBmaW5hbCBNYXA8TWVtYmVyRW50aXR5LCBFbnVtU2V0PFByYWdtYUFubm90YXRpb24+PiBwcmFnbWFBbm5vdGF0aW9uczsKCiAgQW5ub3RhdGlvbnNEYXRhSW1wbCh0aGlzLnByYWdtYUFubm90YXRpb25zKTsKCiAgZmFjdG9yeSBBbm5vdGF0aW9uc0RhdGFJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBNYXA8TWVtYmVyRW50aXR5LCBFbnVtU2V0PFByYWdtYUFubm90YXRpb24+PiBwcmFnbWFBbm5vdGF0aW9ucyA9CiAgICAgICAgc291cmNlLnJlYWRNZW1iZXJNYXAoKCkgPT4gbmV3IEVudW1TZXQuZnJvbVZhbHVlKHNvdXJjZS5yZWFkSW50KCkpKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgQW5ub3RhdGlvbnNEYXRhSW1wbChwcmFnbWFBbm5vdGF0aW9ucyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTWVtYmVyTWFwKHByYWdtYUFubm90YXRpb25zLCAoRW51bVNldDxQcmFnbWFBbm5vdGF0aW9uPiBzZXQpIHsKICAgICAgc2luay53cml0ZUludChzZXQudmFsdWUpOwogICAgfSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgYm9vbCBfaGFzUHJhZ21hKE1lbWJlckVudGl0eSBtZW1iZXIsIFByYWdtYUFubm90YXRpb24gYW5ub3RhdGlvbikgewogICAgRW51bVNldDxQcmFnbWFBbm5vdGF0aW9uPiBzZXQgPSBwcmFnbWFBbm5vdGF0aW9uc1ttZW1iZXJdOwogICAgcmV0dXJuIHNldCAhPSBudWxsICYmIHNldC5jb250YWlucyhhbm5vdGF0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaGFzQXNzdW1lRHluYW1pYyhNZW1iZXJFbnRpdHkgbWVtYmVyKSA9PgogICAgICBfaGFzUHJhZ21hKG1lbWJlciwgUHJhZ21hQW5ub3RhdGlvbi5hc3N1bWVEeW5hbWljKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNOb0lubGluZShNZW1iZXJFbnRpdHkgbWVtYmVyKSA9PgogICAgICBfaGFzUHJhZ21hKG1lbWJlciwgUHJhZ21hQW5ub3RhdGlvbi5ub0lubGluZSk7CgogIEBvdmVycmlkZQogIGJvb2wgaGFzVHJ5SW5saW5lKE1lbWJlckVudGl0eSBtZW1iZXIpID0+CiAgICAgIF9oYXNQcmFnbWEobWVtYmVyLCBQcmFnbWFBbm5vdGF0aW9uLnRyeUlubGluZSk7CgogIEBvdmVycmlkZQogIGJvb2wgaGFzRGlzYWJsZUZpbmFsKE1lbWJlckVudGl0eSBtZW1iZXIpID0+CiAgICAgIF9oYXNQcmFnbWEobWVtYmVyLCBQcmFnbWFBbm5vdGF0aW9uLmRpc2FibGVGaW5hbCk7CgogIEBvdmVycmlkZQogIGJvb2wgaGFzTm9FbGlzaW9uKE1lbWJlckVudGl0eSBtZW1iZXIpID0+CiAgICAgIF9oYXNQcmFnbWEobWVtYmVyLCBQcmFnbWFBbm5vdGF0aW9uLm5vRWxpc2lvbik7CgogIEBvdmVycmlkZQogIGJvb2wgaGFzTm9UaHJvd3MoTWVtYmVyRW50aXR5IG1lbWJlcikgPT4KICAgICAgX2hhc1ByYWdtYShtZW1iZXIsIFByYWdtYUFubm90YXRpb24ubm9UaHJvd3MpOwoKICBAb3ZlcnJpZGUKICBib29sIGhhc05vU2lkZUVmZmVjdHMoTWVtYmVyRW50aXR5IG1lbWJlcikgPT4KICAgICAgX2hhc1ByYWdtYShtZW1iZXIsIFByYWdtYUFubm90YXRpb24ubm9TaWRlRWZmZWN0cyk7CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaE5vSW5saW5lKHZvaWQgZihGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikpIHsKICAgIHByYWdtYUFubm90YXRpb25zCiAgICAgICAgLmZvckVhY2goKE1lbWJlckVudGl0eSBtZW1iZXIsIEVudW1TZXQ8UHJhZ21hQW5ub3RhdGlvbj4gc2V0KSB7CiAgICAgIGlmIChzZXQuY29udGFpbnMoUHJhZ21hQW5ub3RhdGlvbi5ub0lubGluZSkpIHsKICAgICAgICBmKG1lbWJlcik7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoVHJ5SW5saW5lKHZvaWQgZihGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikpIHsKICAgIHByYWdtYUFubm90YXRpb25zCiAgICAgICAgLmZvckVhY2goKE1lbWJlckVudGl0eSBtZW1iZXIsIEVudW1TZXQ8UHJhZ21hQW5ub3RhdGlvbj4gc2V0KSB7CiAgICAgIGlmIChzZXQuY29udGFpbnMoUHJhZ21hQW5ub3RhdGlvbi50cnlJbmxpbmUpKSB7CiAgICAgICAgZihtZW1iZXIpOwogICAgICB9CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaE5vVGhyb3dzKHZvaWQgZihGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikpIHsKICAgIHByYWdtYUFubm90YXRpb25zCiAgICAgICAgLmZvckVhY2goKE1lbWJlckVudGl0eSBtZW1iZXIsIEVudW1TZXQ8UHJhZ21hQW5ub3RhdGlvbj4gc2V0KSB7CiAgICAgIGlmIChzZXQuY29udGFpbnMoUHJhZ21hQW5ub3RhdGlvbi5ub1Rocm93cykpIHsKICAgICAgICBmKG1lbWJlcik7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoTm9TaWRlRWZmZWN0cyh2b2lkIGYoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pKSB7CiAgICBwcmFnbWFBbm5vdGF0aW9ucwogICAgICAgIC5mb3JFYWNoKChNZW1iZXJFbnRpdHkgbWVtYmVyLCBFbnVtU2V0PFByYWdtYUFubm90YXRpb24+IHNldCkgewogICAgICBpZiAoc2V0LmNvbnRhaW5zKFByYWdtYUFubm90YXRpb24ubm9TaWRlRWZmZWN0cykpIHsKICAgICAgICBmKG1lbWJlcik7CiAgICAgIH0KICAgIH0pOwogIH0KfQoKY2xhc3MgQW5ub3RhdGlvbnNEYXRhQnVpbGRlciB7CiAgTWFwPE1lbWJlckVudGl0eSwgRW51bVNldDxQcmFnbWFBbm5vdGF0aW9uPj4gcHJhZ21hQW5ub3RhdGlvbnMgPSB7fTsKCiAgdm9pZCByZWdpc3RlclByYWdtYUFubm90YXRpb25zKAogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyLCBFbnVtU2V0PFByYWdtYUFubm90YXRpb24+IGFubm90YXRpb25zKSB7CiAgICBpZiAoYW5ub3RhdGlvbnMuaXNOb3RFbXB0eSkgewogICAgICBwcmFnbWFBbm5vdGF0aW9uc1ttZW1iZXJdID0gYW5ub3RhdGlvbnM7CiAgICB9CiAgfQoKICBBbm5vdGF0aW9uc0RhdGEgY2xvc2UoKSB7CiAgICByZXR1cm4gbmV3IEFubm90YXRpb25zRGF0YUltcGwocHJhZ21hQW5ub3RhdGlvbnMpOwogIH0KfQqBdgBOTjwBKAEoARlMIzInJCEaKBouHwEZFBUfHBsBMSUhIgESLBMEAUgrRQFOECxGAUcZMwEsLgFMQlEzAUVPPQZCSBozAUpRTg1IGjMBMQ4PEg8OExMFAgE4JCwcLyM6NjQqNQEzPztANCA9PkQiLjUBI0AXTwYEFgIBNB0hFjdGAS8kSgE8HSEYQycWIAEfJzUjTgorRilORzIQDAooJSlORyAQDApGJzUjSQoPCAYSIzEfQAYEATU0IUZEKQgvBDQ1HC9GKQQ5NRwvSykEEQIBIT1CLgEzJwFXLgFJMCkBSjEqAUkSLQFGEioBQSkBRi4BSzA5AUwxOgFHEjkBTBI+AgE3SR0wAUgBLwFGF0VNFTcEAQwoFU0gCBMEAUY/NAQBDDA6AQwrNQEMLDYBDC85AQwsNgEMKzUBDDA6AQw6Fkg1EwgIBAEMOxZINhMICAQBDDoWSDUTCAgEAQw/Fkg6EwgIBAIBH0cBIkQiLwYEARw3BAIBMHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvYW5ub3RhdGlvbnMuZGFydDtzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL2JhY2tlbmRfdXNhZ2UuZGFydLpPLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9mcm9udGVuZF9zdHJhdGVneS5kYXJ0JzsKaW1wb3J0ICcuLi9pci9ydW50aW1lX3R5cGVfYW5hbHlzaXMuZGFydCc7CmltcG9ydCAnLi4vc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2ZlYXR1cmUuZGFydCc7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnIHNob3cgU2V0bGV0OwppbXBvcnQgJ2JhY2tlbmRfaW1wYWN0LmRhcnQnOwoKYWJzdHJhY3QgY2xhc3MgQmFja2VuZFVzYWdlIHsKICAvLy8gRGVzZXJpYWxpemVzIGEgW0JhY2tlbmRVc2FnZV0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBCYWNrZW5kVXNhZ2UucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSA9CiAgICAgIEJhY2tlbmRVc2FnZUltcGwucmVhZEZyb21EYXRhU291cmNlOwoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtCYWNrZW5kVXNhZ2VdIHRvIFtzaW5rXS4KICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKTsKCiAgYm9vbCBuZWVkVG9Jbml0aWFsaXplSXNvbGF0ZUFmZmluaXR5VGFnOwogIGJvb2wgbmVlZFRvSW5pdGlhbGl6ZURpc3BhdGNoUHJvcGVydHk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbZWxlbWVudF0gaXMgYSBmdW5jdGlvbiBjYWxsZWQgYnkgdGhlIGJhY2tlbmQuCiAgYm9vbCBpc0Z1bmN0aW9uVXNlZEJ5QmFja2VuZChGdW5jdGlvbkVudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtlbGVtZW50XSBpcyBhbiBpbnN0YW5jZSBmaWVsZCBvZiBhIGNsYXNzIGluc3RhbnRpYXRlZAogIC8vLyBieSB0aGUgYmFja2VuZC4KICBib29sIGlzRmllbGRVc2VkQnlCYWNrZW5kKEZpZWxkRW50aXR5IGVsZW1lbnQpOwoKICBJdGVyYWJsZTxGdW5jdGlvbkVudGl0eT4gZ2V0IGdsb2JhbEZ1bmN0aW9uRGVwZW5kZW5jaWVzOwoKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0IGdsb2JhbENsYXNzRGVwZW5kZW5jaWVzOwoKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0IGhlbHBlckNsYXNzZXNVc2VkOwoKICBJdGVyYWJsZTxSdW50aW1lVHlwZVVzZT4gZ2V0IHJ1bnRpbWVUeXBlVXNlczsKCiAgLy8vIGB0cnVlYCBpZiBhIGNvcmUtbGlicmFyeSBmdW5jdGlvbiByZXF1aXJlcyB0aGUgcHJlYW1ibGUgZmlsZSB0byBmdW5jdGlvbi4KICBib29sIGdldCByZXF1aXJlc1ByZWFtYmxlOwoKICAvLy8gYHRydWVgIG9mIGBPYmplY3QucnVudGltZVR5cGVgIGlzIHVzZWQuCiAgYm9vbCBnZXQgaXNSdW50aW1lVHlwZVVzZWQ7CgogIC8vLyBgdHJ1ZWAgaWYgYEZ1bmN0aW9uLmFwcGx5YCBpcyB1c2VkLgogIGJvb2wgZ2V0IGlzRnVuY3Rpb25BcHBseVVzZWQ7CgogIC8vLyBgdHJ1ZWAgaWYgJ2RhcnQ6bWlycm9ycycgZmVhdHVyZXMgYXJlIHVzZWQuCiAgYm9vbCBnZXQgaXNNaXJyb3JzVXNlZDsKCiAgLy8vIGB0cnVlYCBpZiBgbm9TdWNoTWV0aG9kYCBpcyB1c2VkLgogIGJvb2wgZ2V0IGlzTm9TdWNoTWV0aG9kVXNlZDsKfQoKYWJzdHJhY3QgY2xhc3MgQmFja2VuZFVzYWdlQnVpbGRlciB7CiAgLy8vIFRoZSBiYWNrZW5kIG11c3QgKmFsd2F5cyogY2FsbCB0aGlzIG1ldGhvZCB3aGVuIGVucXVldWluZyBhbiBmdW5jdGlvbgogIC8vLyBlbGVtZW50LiBDYWxscyBkb25lIGJ5IHRoZSBiYWNrZW5kIGFyZSBub3Qgc2VlbiBieSBnbG9iYWwKICAvLy8gb3B0aW1pemF0aW9ucywgc28gdGhleSB3b3VsZCBtYWtlIHRoZXNlIG9wdGltaXphdGlvbnMgdW5zb3VuZC4KICAvLy8gVGhlcmVmb3JlIHdlIG5lZWQgdG8gY29sbGVjdCB0aGUgbGlzdCBvZiBtZXRob2RzIHRoZSBiYWNrZW5kIG1heQogIC8vLyBjYWxsLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlcGxhY2UgdGhpcyB3aXRoIGEgbW9yZSBwcmVjaXNlIG1vZGVsbGluZzsgdHlwZQogIC8vIGluZmVyZW5jZSBvZiBwYXJhbWV0ZXJzIG9mIHRoZXNlIGZ1bmN0aW9ucyBpcyBkaXNhYmxlZC4KICB2b2lkIHJlZ2lzdGVyQmFja2VuZEZ1bmN0aW9uVXNlKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gVGhlIGJhY2tlbmQgbXVzdCAqYWx3YXlzKiBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gaW5zdGFudGlhdGluZyBhIGNsYXNzLgogIC8vLyBJbnN0YW50aWF0aW9ucyBkb25lIGJ5IHRoZSBiYWNrZW5kIGFyZSBub3Qgc2VlbiBieSBnbG9iYWwgb3B0aW1pemF0aW9ucywKICAvLy8gc28gdGhleSB3b3VsZCBtYWtlIHRoZXNlIG9wdGltaXphdGlvbnMgdW5zb3VuZC4gVGhlcmVmb3JlIHdlIG5lZWQgdG8KICAvLy8gY29sbGVjdCB0aGUgbGlzdCBvZiBjbGFzc2VzIHRoZSBiYWNrZW5kIG1heSBpbnN0YW50aWF0ZS4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZXBsYWNlIHRoaXMgd2l0aCBhIG1vcmUgcHJlY2lzZSBtb2RlbGxpbmc7IHR5cGUKICAvLyBpbmZlcmVuY2Ugb2YgdGhlIGluc3RhbmNlIGZpZWxkcyBvZiB0aGVzZSBjbGFzc2VzIGlzIGRpc2FibGVkLgogIHZvaWQgcmVnaXN0ZXJCYWNrZW5kQ2xhc3NVc2UoQ2xhc3NFbnRpdHkgZWxlbWVudCk7CgogIHZvaWQgcmVnaXN0ZXJHbG9iYWxGdW5jdGlvbkRlcGVuZGVuY3koRnVuY3Rpb25FbnRpdHkgZWxlbWVudCk7CiAgdm9pZCByZWdpc3Rlckdsb2JhbENsYXNzRGVwZW5kZW5jeShDbGFzc0VudGl0eSBlbGVtZW50KTsKCiAgLy8vIENvbGxlY3QgYmFja2VuZCB1c2UgZnJvbSBbYmFja2VuZEltcGFjdF0uCiAgdm9pZCBwcm9jZXNzQmFja2VuZEltcGFjdChCYWNrZW5kSW1wYWN0IGJhY2tlbmRJbXBhY3QpOwoKICB2b2lkIHJlZ2lzdGVyVXNlZE1lbWJlcihNZW1iZXJFbnRpdHkgbWVtYmVyKTsKCiAgLy8vIFJlZ2lzdGVyIHVzZSBvZiBgcnVudGltZVR5cGVgLgogIHZvaWQgcmVnaXN0ZXJSdW50aW1lVHlwZVVzZShSdW50aW1lVHlwZVVzZSBydW50aW1lVHlwZVVzZSk7CgogIC8vLyBgdHJ1ZWAgaWYgYEZ1bmN0aW9uLmFwcGx5YCBpcyB1c2VkLgogIGJvb2wgaXNGdW5jdGlvbkFwcGx5VXNlZDsKCiAgLy8vIGB0cnVlYCBpZiBgbm9TdWNoTWV0aG9kYCBpcyB1c2VkLgogIGJvb2wgaXNOb1N1Y2hNZXRob2RVc2VkOwoKICBCYWNrZW5kVXNhZ2UgY2xvc2UoKTsKfQoKY2xhc3MgQmFja2VuZFVzYWdlQnVpbGRlckltcGwgaW1wbGVtZW50cyBCYWNrZW5kVXNhZ2VCdWlsZGVyIHsKICBGcm9udGVuZFN0cmF0ZWd5IF9mcm9udGVuZFN0cmF0ZWd5OwogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSB0aGUgbmVlZCBmb3IgdGhlc2UuCiAgU2V0bGV0PEZ1bmN0aW9uRW50aXR5PiBfZ2xvYmFsRnVuY3Rpb25EZXBlbmRlbmNpZXM7CiAgU2V0bGV0PENsYXNzRW50aXR5PiBfZ2xvYmFsQ2xhc3NEZXBlbmRlbmNpZXM7CgogIC8vLyBMaXN0IG9mIG1ldGhvZHMgdGhhdCB0aGUgYmFja2VuZCBtYXkgdXNlLgogIGZpbmFsIFNldDxGdW5jdGlvbkVudGl0eT4gX2hlbHBlckZ1bmN0aW9uc1VzZWQgPSBuZXcgU2V0PEZ1bmN0aW9uRW50aXR5PigpOwoKICAvLy8gTGlzdCBvZiBjbGFzc2VzIHRoYXQgdGhlIGJhY2tlbmQgbWF5IHVzZS4KICBmaW5hbCBTZXQ8Q2xhc3NFbnRpdHk+IF9oZWxwZXJDbGFzc2VzVXNlZCA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CgogIGZpbmFsIFNldDxSdW50aW1lVHlwZVVzZT4gX3J1bnRpbWVUeXBlVXNlcyA9IG5ldyBTZXQ8UnVudGltZVR5cGVVc2U+KCk7CgogIGJvb2wgX25lZWRUb0luaXRpYWxpemVJc29sYXRlQWZmaW5pdHlUYWcgPSBmYWxzZTsKICBib29sIF9uZWVkVG9Jbml0aWFsaXplRGlzcGF0Y2hQcm9wZXJ0eSA9IGZhbHNlOwoKICAvLy8gYHRydWVgIGlmIGEgY29yZS1saWJyYXJ5IGZ1bmN0aW9uIHJlcXVpcmVzIHRoZSBwcmVhbWJsZSBmaWxlIHRvIGZ1bmN0aW9uLgogIGJvb2wgcmVxdWlyZXNQcmVhbWJsZSA9IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGlzRnVuY3Rpb25BcHBseVVzZWQgPSBmYWxzZTsKCiAgLy8vIGB0cnVlYCBpZiAnZGFydDptaXJyb3JzJyBmZWF0dXJlcyBhcmUgdXNlZC4KICBib29sIGlzTWlycm9yc1VzZWQgPSBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc05vU3VjaE1ldGhvZFVzZWQgPSBmYWxzZTsKCiAgQmFja2VuZFVzYWdlQnVpbGRlckltcGwodGhpcy5fZnJvbnRlbmRTdHJhdGVneSk7CgogIEtDb21tb25FbGVtZW50cyBnZXQgX2NvbW1vbkVsZW1lbnRzID0+IF9mcm9udGVuZFN0cmF0ZWd5LmNvbW1vbkVsZW1lbnRzOwoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyQmFja2VuZEZ1bmN0aW9uVXNlKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICAgIGFzc2VydChfaXNWYWxpZEJhY2tlbmRVc2UoZWxlbWVudCwgZWxlbWVudC5saWJyYXJ5KSwKICAgICAgICBmYWlsZWRBdChlbGVtZW50LCAiQmFja2VuZCB1c2Ugb2YgJGVsZW1lbnQgaXMgbm90IGFsbG93ZWQuIikpOwogICAgX2hlbHBlckZ1bmN0aW9uc1VzZWQuYWRkKGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckJhY2tlbmRDbGFzc1VzZShDbGFzc0VudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQoX2lzVmFsaWRCYWNrZW5kVXNlKGVsZW1lbnQsIGVsZW1lbnQubGlicmFyeSksCiAgICAgICAgZmFpbGVkQXQoZWxlbWVudCwgIkJhY2tlbmQgdXNlIG9mICRlbGVtZW50IGlzIG5vdCBhbGxvd2VkLiIpKTsKICAgIF9oZWxwZXJDbGFzc2VzVXNlZC5hZGQoZWxlbWVudCk7CiAgfQoKICBib29sIF9pc1ZhbGlkQmFja2VuZFVzZShFbnRpdHkgZWxlbWVudCwgTGlicmFyeUVudGl0eSBsaWJyYXJ5KSB7CiAgICBpZiAoX2lzVmFsaWRFbnRpdHkoZWxlbWVudCkpIHJldHVybiB0cnVlOwogICAgU291cmNlU3BhbiBzcGFuID0gX2Zyb250ZW5kU3RyYXRlZ3kuc3BhbkZyb21TcGFubmFibGUoZWxlbWVudCwgZWxlbWVudCk7CiAgICBpZiAobGlicmFyeS5jYW5vbmljYWxVcmkuc2NoZW1lID09ICdkYXJ0JyAmJgogICAgICAgIHNwYW4udXJpLnBhdGguY29udGFpbnMoJ19pbnRlcm5hbC9qc19ydW50aW1lL2xpYi8nKSkgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBXZSBzaG91bGQgYmUgbW9yZSBwcmVjaXNlIGFib3V0IHRoZXNlLgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIGJvb2wgX2lzVmFsaWRFbnRpdHkoRW50aXR5IGVsZW1lbnQpIHsKICAgIGlmIChlbGVtZW50IGlzIENvbnN0cnVjdG9yRW50aXR5ICYmCiAgICAgICAgKGVsZW1lbnQgPT0gX2NvbW1vbkVsZW1lbnRzLnN0cmVhbUl0ZXJhdG9yQ29uc3RydWN0b3IgfHwKICAgICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmlzU3ltYm9sQ29uc3RydWN0b3IoZWxlbWVudCkgfHwKICAgICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmlzU3ltYm9sVmFsaWRhdGVkQ29uc3RydWN0b3IoZWxlbWVudCkpKSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFRoZXNlIGFyZSB2YWxpZCBidXQgd2UgY291bGQgYmUgbW9yZSBwcmVjaXNlLgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSBpZiAoZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMuc3ltYm9sSW1wbGVtZW50YXRpb25DbGFzcyB8fAogICAgICAgIGVsZW1lbnQgPT0gX2NvbW1vbkVsZW1lbnRzLm9iamVjdE5vU3VjaE1ldGhvZCkgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGVzZSBhcmUgdmFsaWQgYnV0IHdlIGNvdWxkIGJlIG1vcmUgcHJlY2lzZS4KICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPT0gX2NvbW1vbkVsZW1lbnRzLmxpc3RDbGFzcyB8fAogICAgICAgIGVsZW1lbnQgPT0gX2NvbW1vbkVsZW1lbnRzLm1hcExpdGVyYWxDbGFzcyB8fAogICAgICAgIGVsZW1lbnQgPT0gX2NvbW1vbkVsZW1lbnRzLnNldExpdGVyYWxDbGFzcyB8fAogICAgICAgIGVsZW1lbnQgPT0gX2NvbW1vbkVsZW1lbnRzLnVubW9kaWZpYWJsZVNldENsYXNzIHx8CiAgICAgICAgZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMuZnVuY3Rpb25DbGFzcyB8fAogICAgICAgIGVsZW1lbnQgPT0gX2NvbW1vbkVsZW1lbnRzLnN0cmluZ0NsYXNzKSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEF2b2lkIHRoZXNlLgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIHZvaWQgX3Byb2Nlc3NCYWNrZW5kU3RhdGljVXNlKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQsCiAgICAgIHtib29sIGlzR2xvYmFsOiBmYWxzZX0pIHsKICAgIHJlZ2lzdGVyQmFja2VuZEZ1bmN0aW9uVXNlKGVsZW1lbnQpOwogICAgaWYgKGlzR2xvYmFsKSB7CiAgICAgIHJlZ2lzdGVyR2xvYmFsRnVuY3Rpb25EZXBlbmRlbmN5KGVsZW1lbnQpOwogICAgfQogIH0KCiAgdm9pZCBfcHJvY2Vzc0JhY2tlbmRJbnN0YW50aWF0aW9uKENsYXNzRW50aXR5IGNscywge2Jvb2wgaXNHbG9iYWw6IGZhbHNlfSkgewogICAgcmVnaXN0ZXJCYWNrZW5kQ2xhc3NVc2UoY2xzKTsKICAgIGlmIChpc0dsb2JhbCkgewogICAgICByZWdpc3Rlckdsb2JhbENsYXNzRGVwZW5kZW5jeShjbHMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcm9jZXNzQmFja2VuZEltcGFjdChCYWNrZW5kSW1wYWN0IGJhY2tlbmRJbXBhY3QpIHsKICAgIGZvciAoRnVuY3Rpb25FbnRpdHkgc3RhdGljVXNlIGluIGJhY2tlbmRJbXBhY3Quc3RhdGljVXNlcykgewogICAgICBhc3NlcnQoc3RhdGljVXNlICE9IG51bGwpOwogICAgICBfcHJvY2Vzc0JhY2tlbmRTdGF0aWNVc2Uoc3RhdGljVXNlKTsKICAgIH0KICAgIGZvciAoRnVuY3Rpb25FbnRpdHkgc3RhdGljVXNlIGluIGJhY2tlbmRJbXBhY3QuZ2xvYmFsVXNlcykgewogICAgICBhc3NlcnQoc3RhdGljVXNlICE9IG51bGwpOwogICAgICBfcHJvY2Vzc0JhY2tlbmRTdGF0aWNVc2Uoc3RhdGljVXNlLCBpc0dsb2JhbDogdHJ1ZSk7CiAgICB9CiAgICBmb3IgKEludGVyZmFjZVR5cGUgaW5zdGFudGlhdGVkVHlwZSBpbiBiYWNrZW5kSW1wYWN0Lmluc3RhbnRpYXRlZFR5cGVzKSB7CiAgICAgIHJlZ2lzdGVyQmFja2VuZENsYXNzVXNlKGluc3RhbnRpYXRlZFR5cGUuZWxlbWVudCk7CiAgICB9CiAgICBmb3IgKENsYXNzRW50aXR5IGNscyBpbiBiYWNrZW5kSW1wYWN0Lmluc3RhbnRpYXRlZENsYXNzZXMpIHsKICAgICAgX3Byb2Nlc3NCYWNrZW5kSW5zdGFudGlhdGlvbihjbHMpOwogICAgfQogICAgZm9yIChDbGFzc0VudGl0eSBjbHMgaW4gYmFja2VuZEltcGFjdC5nbG9iYWxDbGFzc2VzKSB7CiAgICAgIF9wcm9jZXNzQmFja2VuZEluc3RhbnRpYXRpb24oY2xzLCBpc0dsb2JhbDogdHJ1ZSk7CiAgICB9CiAgICBmb3IgKEJhY2tlbmRJbXBhY3Qgb3RoZXJJbXBhY3QgaW4gYmFja2VuZEltcGFjdC5vdGhlckltcGFjdHMpIHsKICAgICAgcHJvY2Vzc0JhY2tlbmRJbXBhY3Qob3RoZXJJbXBhY3QpOwogICAgfQogICAgZm9yIChCYWNrZW5kRmVhdHVyZSBmZWF0dXJlIGluIGJhY2tlbmRJbXBhY3QuZmVhdHVyZXMpIHsKICAgICAgc3dpdGNoIChmZWF0dXJlKSB7CiAgICAgICAgY2FzZSBCYWNrZW5kRmVhdHVyZS5uZWVkVG9Jbml0aWFsaXplRGlzcGF0Y2hQcm9wZXJ0eToKICAgICAgICAgIF9uZWVkVG9Jbml0aWFsaXplRGlzcGF0Y2hQcm9wZXJ0eSA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEJhY2tlbmRGZWF0dXJlLm5lZWRUb0luaXRpYWxpemVJc29sYXRlQWZmaW5pdHlUYWc6CiAgICAgICAgICBfbmVlZFRvSW5pdGlhbGl6ZUlzb2xhdGVBZmZpbml0eVRhZyA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclVzZWRNZW1iZXIoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgaWYgKG1lbWJlciA9PSBfY29tbW9uRWxlbWVudHMuZ2V0SXNvbGF0ZUFmZmluaXR5VGFnTWFya2VyKSB7CiAgICAgIF9uZWVkVG9Jbml0aWFsaXplSXNvbGF0ZUFmZmluaXR5VGFnID0gdHJ1ZTsKICAgIH0gZWxzZSBpZiAobWVtYmVyID09IF9jb21tb25FbGVtZW50cy5yZXF1aXJlc1ByZWFtYmxlTWFya2VyKSB7CiAgICAgIHJlcXVpcmVzUHJlYW1ibGUgPSB0cnVlOwogICAgfSBlbHNlIGlmIChfY29tbW9uRWxlbWVudHMuaXNGdW5jdGlvbkFwcGx5TWV0aG9kKG1lbWJlcikpIHsKICAgICAgaXNGdW5jdGlvbkFwcGx5VXNlZCA9IHRydWU7CiAgICB9IGVsc2UgaWYgKG1lbWJlci5saWJyYXJ5ID09IF9jb21tb25FbGVtZW50cy5taXJyb3JzTGlicmFyeSkgewogICAgICBpc01pcnJvcnNVc2VkID0gdHJ1ZTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJHbG9iYWxGdW5jdGlvbkRlcGVuZGVuY3koRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgewogICAgYXNzZXJ0KGVsZW1lbnQgIT0gbnVsbCk7CiAgICBpZiAoX2dsb2JhbEZ1bmN0aW9uRGVwZW5kZW5jaWVzID09IG51bGwpIHsKICAgICAgX2dsb2JhbEZ1bmN0aW9uRGVwZW5kZW5jaWVzID0gbmV3IFNldGxldDxGdW5jdGlvbkVudGl0eT4oKTsKICAgIH0KICAgIF9nbG9iYWxGdW5jdGlvbkRlcGVuZGVuY2llcy5hZGQoZWxlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyR2xvYmFsQ2xhc3NEZXBlbmRlbmN5KENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIGFzc2VydChlbGVtZW50ICE9IG51bGwpOwogICAgaWYgKF9nbG9iYWxDbGFzc0RlcGVuZGVuY2llcyA9PSBudWxsKSB7CiAgICAgIF9nbG9iYWxDbGFzc0RlcGVuZGVuY2llcyA9IG5ldyBTZXRsZXQ8Q2xhc3NFbnRpdHk+KCk7CiAgICB9CiAgICBfZ2xvYmFsQ2xhc3NEZXBlbmRlbmNpZXMuYWRkKGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclJ1bnRpbWVUeXBlVXNlKFJ1bnRpbWVUeXBlVXNlIHJ1bnRpbWVUeXBlVXNlKSB7CiAgICBfcnVudGltZVR5cGVVc2VzLmFkZChydW50aW1lVHlwZVVzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBCYWNrZW5kVXNhZ2UgY2xvc2UoKSB7CiAgICByZXR1cm4gbmV3IEJhY2tlbmRVc2FnZUltcGwoCiAgICAgICAgZ2xvYmFsRnVuY3Rpb25EZXBlbmRlbmNpZXM6IF9nbG9iYWxGdW5jdGlvbkRlcGVuZGVuY2llcywKICAgICAgICBnbG9iYWxDbGFzc0RlcGVuZGVuY2llczogX2dsb2JhbENsYXNzRGVwZW5kZW5jaWVzLAogICAgICAgIGhlbHBlckZ1bmN0aW9uc1VzZWQ6IF9oZWxwZXJGdW5jdGlvbnNVc2VkLAogICAgICAgIGhlbHBlckNsYXNzZXNVc2VkOiBfaGVscGVyQ2xhc3Nlc1VzZWQsCiAgICAgICAgbmVlZFRvSW5pdGlhbGl6ZUlzb2xhdGVBZmZpbml0eVRhZzogX25lZWRUb0luaXRpYWxpemVJc29sYXRlQWZmaW5pdHlUYWcsCiAgICAgICAgbmVlZFRvSW5pdGlhbGl6ZURpc3BhdGNoUHJvcGVydHk6IF9uZWVkVG9Jbml0aWFsaXplRGlzcGF0Y2hQcm9wZXJ0eSwKICAgICAgICByZXF1aXJlc1ByZWFtYmxlOiByZXF1aXJlc1ByZWFtYmxlLAogICAgICAgIHJ1bnRpbWVUeXBlVXNlczogX3J1bnRpbWVUeXBlVXNlcywKICAgICAgICBpc0Z1bmN0aW9uQXBwbHlVc2VkOiBpc0Z1bmN0aW9uQXBwbHlVc2VkLAogICAgICAgIGlzTWlycm9yc1VzZWQ6IGlzTWlycm9yc1VzZWQsCiAgICAgICAgaXNOb1N1Y2hNZXRob2RVc2VkOiBpc05vU3VjaE1ldGhvZFVzZWQpOwogIH0KfQoKY2xhc3MgQmFja2VuZFVzYWdlSW1wbCBpbXBsZW1lbnRzIEJhY2tlbmRVc2FnZSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtCYWNrZW5kVXNhZ2VdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnYmFja2VuZC11c2FnZSc7CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSB0aGUgbmVlZCBmb3IgdGhlc2UuCiAgZmluYWwgU2V0PEZ1bmN0aW9uRW50aXR5PiBfZ2xvYmFsRnVuY3Rpb25EZXBlbmRlbmNpZXM7CiAgZmluYWwgU2V0PENsYXNzRW50aXR5PiBfZ2xvYmFsQ2xhc3NEZXBlbmRlbmNpZXM7CgogIC8vLyBTZXQgb2YgZnVuY3Rpb25zIGNhbGxlZCBieSB0aGUgYmFja2VuZC4KICBmaW5hbCBTZXQ8RnVuY3Rpb25FbnRpdHk+IF9oZWxwZXJGdW5jdGlvbnNVc2VkOwoKICAvLy8gU2V0IG9mIGNsYXNzZXMgaW5zdGFudGlhdGVkIGJ5IHRoZSBiYWNrZW5kLgogIGZpbmFsIFNldDxDbGFzc0VudGl0eT4gX2hlbHBlckNsYXNzZXNVc2VkOwoKICBmaW5hbCBTZXQ8UnVudGltZVR5cGVVc2U+IF9ydW50aW1lVHlwZVVzZXM7CgogIEBvdmVycmlkZQogIGJvb2wgbmVlZFRvSW5pdGlhbGl6ZUlzb2xhdGVBZmZpbml0eVRhZzsKICBAb3ZlcnJpZGUKICBib29sIG5lZWRUb0luaXRpYWxpemVEaXNwYXRjaFByb3BlcnR5OwoKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIHJlcXVpcmVzUHJlYW1ibGU7CgogIEBvdmVycmlkZQogIGZpbmFsIGJvb2wgaXNGdW5jdGlvbkFwcGx5VXNlZDsKCiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc01pcnJvcnNVc2VkOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzTm9TdWNoTWV0aG9kVXNlZDsKCiAgQmFja2VuZFVzYWdlSW1wbCgKICAgICAge1NldDxGdW5jdGlvbkVudGl0eT4gZ2xvYmFsRnVuY3Rpb25EZXBlbmRlbmNpZXMsCiAgICAgIFNldDxDbGFzc0VudGl0eT4gZ2xvYmFsQ2xhc3NEZXBlbmRlbmNpZXMsCiAgICAgIFNldDxGdW5jdGlvbkVudGl0eT4gaGVscGVyRnVuY3Rpb25zVXNlZCwKICAgICAgU2V0PENsYXNzRW50aXR5PiBoZWxwZXJDbGFzc2VzVXNlZCwKICAgICAgdGhpcy5uZWVkVG9Jbml0aWFsaXplSXNvbGF0ZUFmZmluaXR5VGFnLAogICAgICB0aGlzLm5lZWRUb0luaXRpYWxpemVEaXNwYXRjaFByb3BlcnR5LAogICAgICB0aGlzLnJlcXVpcmVzUHJlYW1ibGUsCiAgICAgIFNldDxSdW50aW1lVHlwZVVzZT4gcnVudGltZVR5cGVVc2VzLAogICAgICB0aGlzLmlzRnVuY3Rpb25BcHBseVVzZWQsCiAgICAgIHRoaXMuaXNNaXJyb3JzVXNlZCwKICAgICAgdGhpcy5pc05vU3VjaE1ldGhvZFVzZWR9KQogICAgICA6IHRoaXMuX2dsb2JhbEZ1bmN0aW9uRGVwZW5kZW5jaWVzID0gZ2xvYmFsRnVuY3Rpb25EZXBlbmRlbmNpZXMsCiAgICAgICAgdGhpcy5fZ2xvYmFsQ2xhc3NEZXBlbmRlbmNpZXMgPSBnbG9iYWxDbGFzc0RlcGVuZGVuY2llcywKICAgICAgICB0aGlzLl9oZWxwZXJGdW5jdGlvbnNVc2VkID0gaGVscGVyRnVuY3Rpb25zVXNlZCwKICAgICAgICB0aGlzLl9oZWxwZXJDbGFzc2VzVXNlZCA9IGhlbHBlckNsYXNzZXNVc2VkLAogICAgICAgIHRoaXMuX3J1bnRpbWVUeXBlVXNlcyA9IHJ1bnRpbWVUeXBlVXNlczsKCiAgZmFjdG9yeSBCYWNrZW5kVXNhZ2VJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBTZXQ8RnVuY3Rpb25FbnRpdHk+IGdsb2JhbEZ1bmN0aW9uRGVwZW5kZW5jaWVzID0KICAgICAgICBzb3VyY2UucmVhZE1lbWJlcnM8RnVuY3Rpb25FbnRpdHk+KCkudG9TZXQoKTsKICAgIFNldDxDbGFzc0VudGl0eT4gZ2xvYmFsQ2xhc3NEZXBlbmRlbmNpZXMgPSBzb3VyY2UucmVhZENsYXNzZXMoKS50b1NldCgpOwogICAgU2V0PEZ1bmN0aW9uRW50aXR5PiBoZWxwZXJGdW5jdGlvbnNVc2VkID0KICAgICAgICBzb3VyY2UucmVhZE1lbWJlcnM8RnVuY3Rpb25FbnRpdHk+KCkudG9TZXQoKTsKICAgIFNldDxDbGFzc0VudGl0eT4gaGVscGVyQ2xhc3Nlc1VzZWQgPSBzb3VyY2UucmVhZENsYXNzZXMoKS50b1NldCgpOwogICAgU2V0PFJ1bnRpbWVUeXBlVXNlPiBydW50aW1lVHlwZVVzZXMgPSBzb3VyY2UucmVhZExpc3QoKCkgewogICAgICBSdW50aW1lVHlwZVVzZUtpbmQga2luZCA9IHNvdXJjZS5yZWFkRW51bShSdW50aW1lVHlwZVVzZUtpbmQudmFsdWVzKTsKICAgICAgRGFydFR5cGUgcmVjZWl2ZXJUeXBlID0gc291cmNlLnJlYWREYXJ0VHlwZSgpOwogICAgICBEYXJ0VHlwZSBhcmd1bWVudFR5cGUgPSBzb3VyY2UucmVhZERhcnRUeXBlKGFsbG93TnVsbDogdHJ1ZSk7CiAgICAgIHJldHVybiBuZXcgUnVudGltZVR5cGVVc2Uoa2luZCwgcmVjZWl2ZXJUeXBlLCBhcmd1bWVudFR5cGUpOwogICAgfSkudG9TZXQoKTsKICAgIGJvb2wgbmVlZFRvSW5pdGlhbGl6ZUlzb2xhdGVBZmZpbml0eVRhZyA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgYm9vbCBuZWVkVG9Jbml0aWFsaXplRGlzcGF0Y2hQcm9wZXJ0eSA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgYm9vbCByZXF1aXJlc1ByZWFtYmxlID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBib29sIGlzRnVuY3Rpb25BcHBseVVzZWQgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGJvb2wgaXNNaXJyb3JzVXNlZCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgYm9vbCBpc05vU3VjaE1ldGhvZFVzZWQgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgQmFja2VuZFVzYWdlSW1wbCgKICAgICAgICBnbG9iYWxGdW5jdGlvbkRlcGVuZGVuY2llczogZ2xvYmFsRnVuY3Rpb25EZXBlbmRlbmNpZXMsCiAgICAgICAgZ2xvYmFsQ2xhc3NEZXBlbmRlbmNpZXM6IGdsb2JhbENsYXNzRGVwZW5kZW5jaWVzLAogICAgICAgIGhlbHBlckZ1bmN0aW9uc1VzZWQ6IGhlbHBlckZ1bmN0aW9uc1VzZWQsCiAgICAgICAgaGVscGVyQ2xhc3Nlc1VzZWQ6IGhlbHBlckNsYXNzZXNVc2VkLAogICAgICAgIHJ1bnRpbWVUeXBlVXNlczogcnVudGltZVR5cGVVc2VzLAogICAgICAgIG5lZWRUb0luaXRpYWxpemVJc29sYXRlQWZmaW5pdHlUYWc6IG5lZWRUb0luaXRpYWxpemVJc29sYXRlQWZmaW5pdHlUYWcsCiAgICAgICAgbmVlZFRvSW5pdGlhbGl6ZURpc3BhdGNoUHJvcGVydHk6IG5lZWRUb0luaXRpYWxpemVEaXNwYXRjaFByb3BlcnR5LAogICAgICAgIHJlcXVpcmVzUHJlYW1ibGU6IHJlcXVpcmVzUHJlYW1ibGUsCiAgICAgICAgaXNGdW5jdGlvbkFwcGx5VXNlZDogaXNGdW5jdGlvbkFwcGx5VXNlZCwKICAgICAgICBpc01pcnJvcnNVc2VkOiBpc01pcnJvcnNVc2VkLAogICAgICAgIGlzTm9TdWNoTWV0aG9kVXNlZDogaXNOb1N1Y2hNZXRob2RVc2VkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVNZW1iZXJzKF9nbG9iYWxGdW5jdGlvbkRlcGVuZGVuY2llcyk7CiAgICBzaW5rLndyaXRlQ2xhc3NlcyhfZ2xvYmFsQ2xhc3NEZXBlbmRlbmNpZXMpOwogICAgc2luay53cml0ZU1lbWJlcnMoX2hlbHBlckZ1bmN0aW9uc1VzZWQpOwogICAgc2luay53cml0ZUNsYXNzZXMoX2hlbHBlckNsYXNzZXNVc2VkKTsKICAgIHNpbmsud3JpdGVMaXN0KHJ1bnRpbWVUeXBlVXNlcywgKFJ1bnRpbWVUeXBlVXNlIHJ1bnRpbWVUeXBlVXNlKSB7CiAgICAgIHNpbmsud3JpdGVFbnVtKHJ1bnRpbWVUeXBlVXNlLmtpbmQpOwogICAgICBzaW5rLndyaXRlRGFydFR5cGUocnVudGltZVR5cGVVc2UucmVjZWl2ZXJUeXBlKTsKICAgICAgc2luay53cml0ZURhcnRUeXBlKHJ1bnRpbWVUeXBlVXNlLmFyZ3VtZW50VHlwZSwgYWxsb3dOdWxsOiB0cnVlKTsKICAgIH0pOwogICAgc2luay53cml0ZUJvb2wobmVlZFRvSW5pdGlhbGl6ZUlzb2xhdGVBZmZpbml0eVRhZyk7CiAgICBzaW5rLndyaXRlQm9vbChuZWVkVG9Jbml0aWFsaXplRGlzcGF0Y2hQcm9wZXJ0eSk7CiAgICBzaW5rLndyaXRlQm9vbChyZXF1aXJlc1ByZWFtYmxlKTsKICAgIHNpbmsud3JpdGVCb29sKGlzRnVuY3Rpb25BcHBseVVzZWQpOwogICAgc2luay53cml0ZUJvb2woaXNNaXJyb3JzVXNlZCk7CiAgICBzaW5rLndyaXRlQm9vbChpc05vU3VjaE1ldGhvZFVzZWQpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNGdW5jdGlvblVzZWRCeUJhY2tlbmQoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIF9oZWxwZXJGdW5jdGlvbnNVc2VkLmNvbnRhaW5zKGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0ZpZWxkVXNlZEJ5QmFja2VuZChGaWVsZEVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gX2hlbHBlckNsYXNzZXNVc2VkLmNvbnRhaW5zKGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8RnVuY3Rpb25FbnRpdHk+IGdldCBnbG9iYWxGdW5jdGlvbkRlcGVuZGVuY2llcyA9PgogICAgICBfZ2xvYmFsRnVuY3Rpb25EZXBlbmRlbmNpZXMgPz8gY29uc3QgPEZ1bmN0aW9uRW50aXR5PltdOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0IGdsb2JhbENsYXNzRGVwZW5kZW5jaWVzID0+CiAgICAgIF9nbG9iYWxDbGFzc0RlcGVuZGVuY2llcyA/PyBjb25zdCA8Q2xhc3NFbnRpdHk+W107CgogIEl0ZXJhYmxlPEZ1bmN0aW9uRW50aXR5PiBnZXQgaGVscGVyRnVuY3Rpb25zVXNlZCA9PiBfaGVscGVyRnVuY3Rpb25zVXNlZDsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGdldCBoZWxwZXJDbGFzc2VzVXNlZCA9PiBfaGVscGVyQ2xhc3Nlc1VzZWQ7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUnVudGltZVR5cGVVc2VkID0+IF9ydW50aW1lVHlwZVVzZXMuaXNOb3RFbXB0eTsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8UnVudGltZVR5cGVVc2U+IGdldCBydW50aW1lVHlwZVVzZXMgPT4gX3J1bnRpbWVUeXBlVXNlczsKfQqBogBOTjwBGSIkISQrLiMoHgEeOj8rATAnASspAUc4AU8WMgE7ATUBLwEwAVAdAS4eASogATIaASgfAgElTEBFRwxLPTsBTU9LP0tENQFBOwEwOgEwASU+ASocASgbARgCAT8mNTYwATBOATBGAUoBNDIBUCEBDCQBMh4BDCMBMwFLAQw8OUcnBAEMNjlHJQQBQy5NMT9FEw0UBgQBKChBPEZME0c5TBM3NjY7NDIrEwYSBAE4ICkUMQYEAU8iFCoGBAEMO0EhKwZBITsGTjkGQSkGOzkGRCkGPRk+NBFANhEIBgQBDDFBMkMfQCJDHAYEAQxCHS9CBi4EAQw8HSw8BisEAQw/KgQBDBkhQTszL1FNLCsyJjEEAgExRh0tATU5MwEuMgEyLQEuAQwrDCkBDB8BDCIBDBwBDCEBFDcwLyovLR0rIBogR0E5NTEBQxc1Nk0uNkc/TDVEQxBBPy8yLDEVIUA6Mi4qUEwsMiYxBAEMKBU0MS0rRis3SAg4NiYpIygTBAEMOTMEAQwzQAQBDD0/AQw3OQFMAQxFAQw9AQxEAgEycGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9iYWNrZW5kX3VzYWdlLmRhcnQ+c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfYmFja2VuZC9pbnRlcmNlcHRvcl9kYXRhLmRhcnS8DS8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGpzX2JhY2tlbmQuaW50ZXJjZXB0b3JfZGF0YTsKCmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnIHNob3cgSWRlbnRpZmllcnM7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnCiAgICBzaG93IENvbW1vbkVsZW1lbnRzLCBLQ29tbW9uRWxlbWVudHMsIEtFbGVtZW50RW52aXJvbm1lbnQ7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIGFzIGpzQXN0OwppbXBvcnQgJy4uL3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9zZWxlY3Rvci5kYXJ0JzsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKaW1wb3J0ICduYW1lci5kYXJ0JzsKaW1wb3J0ICduYXRpdmVfZGF0YS5kYXJ0JzsKCmFic3RyYWN0IGNsYXNzIEludGVyY2VwdG9yRGF0YSB7CiAgLy8vIERlc2VyaWFsaXplcyBhIFtJbnRlcmNlcHRvckRhdGFdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgSW50ZXJjZXB0b3JEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgRGF0YVNvdXJjZSBzb3VyY2UsCiAgICAgIE5hdGl2ZURhdGEgbmF0aXZlRGF0YSwKICAgICAgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpID0gSW50ZXJjZXB0b3JEYXRhSW1wbC5yZWFkRnJvbURhdGFTb3VyY2U7CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0ludGVyY2VwdG9yRGF0YV0gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2Nsc10gaXMgYW4gaW50ZXJjZXB0ZWQgY2xhc3MuCiAgYm9vbCBpc0ludGVyY2VwdGVkQ2xhc3MoQ2xhc3NFbnRpdHkgZWxlbWVudCk7CgogIGJvb2wgaXNJbnRlcmNlcHRlZE1ldGhvZChNZW1iZXJFbnRpdHkgZWxlbWVudCk7CiAgYm9vbCBmaWVsZEhhc0ludGVyY2VwdGVkR2V0dGVyKEZpZWxkRW50aXR5IGVsZW1lbnQpOwogIGJvb2wgZmllbGRIYXNJbnRlcmNlcHRlZFNldHRlcihGaWVsZEVudGl0eSBlbGVtZW50KTsKICBib29sIGlzSW50ZXJjZXB0ZWROYW1lKFN0cmluZyBuYW1lKTsKICBib29sIGlzSW50ZXJjZXB0ZWRTZWxlY3RvcihTZWxlY3RvciBzZWxlY3Rvcik7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZmYgW3NlbGVjdG9yXSBtYXRjaGVzIGFuIGVsZW1lbnQgZGVmaW5lZCBpbiBhIGNsYXNzIG1peGVkCiAgLy8vIGludG8gYW4gaW50ZXJjZXB0ZWQgY2xhc3MuCiAgLy8vCiAgLy8vIFRoZXNlIHNlbGVjdG9ycyBhcmUgbm90IGVsaWdpYmxlIGZvciB0aGUgJ2R1bW15IGV4cGxpY2l0IHJlY2VpdmVyJwogIC8vLyBvcHRpbWl6YXRpb24uCiAgYm9vbCBpc0ludGVyY2VwdGVkTWl4aW5TZWxlY3RvcigKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgbWFzaywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKTsKCiAgLy8vIFNldCBvZiBjbGFzc2VzIHdob3NlIG1ldGhvZHMgYXJlIGludGVyY2VwdGVkLgogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBnZXQgaW50ZXJjZXB0ZWRDbGFzc2VzOwogIGJvb2wgaXNNaXhlZEludG9JbnRlcmNlcHRlZENsYXNzKENsYXNzRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyBhIHNldCBvZiBpbnRlcmNlcHRvciBjbGFzc2VzIHRoYXQgY29udGFpbiBhIG1lbWJlciBuYW1lZCBbbmFtZV0KICAvLy8KICAvLy8gUmV0dXJucyBhbiBlbXB0eSBzZXQgaWYgdGhlcmUgaXMgbm8gY2xhc3MuIERvIG5vdCBtb2RpZnkgdGhlIHJldHVybmVkIHNldC4KICBTZXQ8Q2xhc3NFbnRpdHk+IGdldEludGVyY2VwdGVkQ2xhc3Nlc09uKAogICAgICBTdHJpbmcgbmFtZSwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKTsKCiAgLy8vIFdoZXRoZXIgdGhlIGNvbXBpbGVyIGNhbiB1c2UgdGhlIG5hdGl2ZSBgaW5zdGFuY2VvZmAgY2hlY2sgdG8gdGVzdCBmb3IKICAvLy8gaW5zdGFuY2VzIG9mIFt0eXBlXS4gVGhpcyBpcyB0cnVlIGZvciB0eXBlcyB0aGF0IGFyZSBub3QgdXNlZCBhcyBtaXhpbnMgb3IKICAvLy8gaW50ZXJmYWNlcy4KICBib29sIG1heUdlbmVyYXRlSW5zdGFuY2VvZkNoZWNrKERhcnRUeXBlIHR5cGUsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCk7Cn0KCmFic3RyYWN0IGNsYXNzIEludGVyY2VwdG9yRGF0YUJ1aWxkZXIgewogIHZvaWQgYWRkSW50ZXJjZXB0b3JzKENsYXNzRW50aXR5IGNscyk7CiAgdm9pZCBhZGRJbnRlcmNlcHRvcnNGb3JOYXRpdmVDbGFzc01lbWJlcnMoQ2xhc3NFbnRpdHkgY2xzKTsKICBJbnRlcmNlcHRvckRhdGEgY2xvc2UoKTsKfQoKY2xhc3MgSW50ZXJjZXB0b3JEYXRhSW1wbCBpbXBsZW1lbnRzIEludGVyY2VwdG9yRGF0YSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtJbnRlcmNlcHRvckRhdGFdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnaW50ZXJjZXB0b3ItZGF0YSc7CgogIGZpbmFsIE5hdGl2ZUJhc2ljRGF0YSBfbmF0aXZlRGF0YTsKICBmaW5hbCBDb21tb25FbGVtZW50cyBfY29tbW9uRWxlbWVudHM7CgogIC8vLyBUaGUgbWVtYmVycyBvZiBpbnN0YW50aWF0ZWQgaW50ZXJjZXB0b3IgY2xhc3NlczogbWFwcyBhIG1lbWJlciBuYW1lIHRvIHRoZQogIC8vLyBsaXN0IG9mIG1lbWJlcnMgdGhhdCBoYXZlIHRoYXQgbmFtZS4gVGhpcyBtYXAgaXMgdXNlZCBieSB0aGUgY29kZWdlbiB0bwogIC8vLyBrbm93IHdoZXRoZXIgYSBzZW5kIG11c3QgYmUgaW50ZXJjZXB0ZWQgb3Igbm90LgogIGZpbmFsIE1hcDxTdHJpbmcsIFNldDxNZW1iZXJFbnRpdHk+PiBpbnRlcmNlcHRlZE1lbWJlcnM7CgogIEBvdmVycmlkZQogIGZpbmFsIFNldDxDbGFzc0VudGl0eT4gaW50ZXJjZXB0ZWRDbGFzc2VzOwoKICAvLy8gU2V0IG9mIGNsYXNzZXMgdXNlZCBhcyBtaXhpbnMgb24gaW50ZXJjZXB0ZWQgKG5hdGl2ZSBhbmQgcHJpbWl0aXZlKQogIC8vLyBjbGFzc2VzLiBNZXRob2RzIG9uIHRoZXNlIGNsYXNzZXMgbWlnaHQgYWxzbyBiZSBtaXhlZCBpbiB0byByZWd1bGFyIERhcnQKICAvLy8gKHVuaW50ZXJjZXB0ZWQpIGNsYXNzZXMuCiAgZmluYWwgU2V0PENsYXNzRW50aXR5PiBjbGFzc2VzTWl4ZWRJbnRvSW50ZXJjZXB0ZWRDbGFzc2VzOwoKICAvLy8gVGhlIG1lbWJlcnMgb2YgbWl4aW4gY2xhc3NlcyB0aGF0IGFyZSBtaXhlZCBpbnRvIGFuIGluc3RhbnRpYXRlZAogIC8vLyBpbnRlcmNlcHRvciBjbGFzcy4gIFRoaXMgaXMgYSBjYWNoZWQgc3Vic2V0IG9mIFtfaW50ZXJjZXB0ZWRFbGVtZW50c10uCiAgLy8vCiAgLy8vIE1peGluIG1ldGhvZHMgYXJlIG5vdCBzcGVjaWFsaXplZCBmb3IgdGhlIGNsYXNzIHRoZXkgYXJlIG1peGVkIGludG8uCiAgLy8vIE1ldGhvZHMgbWl4ZWQgaW50byBpbnRlcmNlcHRlZCBjbGFzc2VzIHRodXMgYWx3YXlzIG1ha2UgdXNlIG9mIHRoZQogIC8vLyBleHBsaWNpdCByZWNlaXZlciBhcmd1bWVudCwgZXZlbiB3aGVuIG1peGVkIGludG8gbm9uLWludGVyY2VwdG9yIGNsYXNzZXMuCiAgLy8vCiAgLy8vIFRoZXNlIG1lbWJlcnMgbXVzdCBiZSBpbnZva2VkIHdpdGggYSBjb3JyZWN0IGV4cGxpY2l0IHJlY2VpdmVyIGV2ZW4gd2hlbgogIC8vLyB0aGUgcmVjZWl2ZXIgaXMgbm90IGFuIGludGVyY2VwdGVkIGNsYXNzLgogIGZpbmFsIE1hcDxTdHJpbmcsIFNldDxNZW1iZXJFbnRpdHk+PiBfaW50ZXJjZXB0ZWRNaXhpbkVsZW1lbnRzID0KICAgICAgbmV3IE1hcDxTdHJpbmcsIFNldDxNZW1iZXJFbnRpdHk+PigpOwoKICBmaW5hbCBNYXA8U3RyaW5nLCBTZXQ8Q2xhc3NFbnRpdHk+PiBfaW50ZXJjZXB0ZWRDbGFzc2VzQ2FjaGUgPQogICAgICBuZXcgTWFwPFN0cmluZywgU2V0PENsYXNzRW50aXR5Pj4oKTsKCiAgZmluYWwgU2V0PENsYXNzRW50aXR5PiBfbm9DbGFzc2VzID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKCiAgSW50ZXJjZXB0b3JEYXRhSW1wbCgKICAgICAgdGhpcy5fbmF0aXZlRGF0YSwKICAgICAgdGhpcy5fY29tbW9uRWxlbWVudHMsCiAgICAgIHRoaXMuaW50ZXJjZXB0ZWRNZW1iZXJzLAogICAgICB0aGlzLmludGVyY2VwdGVkQ2xhc3NlcywKICAgICAgdGhpcy5jbGFzc2VzTWl4ZWRJbnRvSW50ZXJjZXB0ZWRDbGFzc2VzKTsKCiAgZmFjdG9yeSBJbnRlcmNlcHRvckRhdGFJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgRGF0YVNvdXJjZSBzb3VyY2UsIE5hdGl2ZURhdGEgbmF0aXZlRGF0YSwgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgaW50IGludGVyY2VwdGVkTWVtYmVyc0NvdW50ID0gc291cmNlLnJlYWRJbnQoKTsKICAgIE1hcDxTdHJpbmcsIFNldDxNZW1iZXJFbnRpdHk+PiBpbnRlcmNlcHRlZE1lbWJlcnMgPSB7fTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJjZXB0ZWRNZW1iZXJzQ291bnQ7IGkrKykgewogICAgICBTdHJpbmcgbmFtZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICAgIFNldDxNZW1iZXJFbnRpdHk+IG1lbWJlcnMgPSBzb3VyY2UucmVhZE1lbWJlcnMoKS50b1NldCgpOwogICAgICBpbnRlcmNlcHRlZE1lbWJlcnNbbmFtZV0gPSBtZW1iZXJzOwogICAgfQogICAgU2V0PENsYXNzRW50aXR5PiBpbnRlcmNlcHRlZENsYXNzZXMgPSBzb3VyY2UucmVhZENsYXNzZXMoKS50b1NldCgpOwogICAgU2V0PENsYXNzRW50aXR5PiBjbGFzc2VzTWl4ZWRJbnRvSW50ZXJjZXB0ZWRDbGFzc2VzID0KICAgICAgICBzb3VyY2UucmVhZENsYXNzZXMoKS50b1NldCgpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBJbnRlcmNlcHRvckRhdGFJbXBsKAogICAgICAgIG5hdGl2ZURhdGEsCiAgICAgICAgY29tbW9uRWxlbWVudHMsCiAgICAgICAgaW50ZXJjZXB0ZWRNZW1iZXJzLAogICAgICAgIGludGVyY2VwdGVkQ2xhc3NlcywKICAgICAgICBjbGFzc2VzTWl4ZWRJbnRvSW50ZXJjZXB0ZWRDbGFzc2VzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVJbnQoaW50ZXJjZXB0ZWRNZW1iZXJzLmxlbmd0aCk7CiAgICBpbnRlcmNlcHRlZE1lbWJlcnMuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIFNldDxNZW1iZXJFbnRpdHk+IG1lbWJlcnMpIHsKICAgICAgc2luay53cml0ZVN0cmluZyhuYW1lKTsKICAgICAgc2luay53cml0ZU1lbWJlcnMobWVtYmVycyk7CiAgICB9KTsKICAgIHNpbmsud3JpdGVDbGFzc2VzKGludGVyY2VwdGVkQ2xhc3Nlcyk7CiAgICBzaW5rLndyaXRlQ2xhc3NlcyhjbGFzc2VzTWl4ZWRJbnRvSW50ZXJjZXB0ZWRDbGFzc2VzKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSW50ZXJjZXB0ZWRNZXRob2QoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIGlmICghZWxlbWVudC5pc0luc3RhbmNlTWVtYmVyKSByZXR1cm4gZmFsc2U7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBdm9pZCB0aGlzIGhhY2suCiAgICBpZiAoZWxlbWVudCBpcyBDb25zdHJ1Y3RvckJvZHlFbnRpdHkpIHsKICAgICAgcmV0dXJuIF9uYXRpdmVEYXRhLmlzTmF0aXZlT3JFeHRlbmRzTmF0aXZlKGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MpOwogICAgfQogICAgcmV0dXJuIGludGVyY2VwdGVkTWVtYmVyc1tlbGVtZW50Lm5hbWVdICE9IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGZpZWxkSGFzSW50ZXJjZXB0ZWRHZXR0ZXIoRmllbGRFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIGludGVyY2VwdGVkTWVtYmVyc1tlbGVtZW50Lm5hbWVdICE9IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGZpZWxkSGFzSW50ZXJjZXB0ZWRTZXR0ZXIoRmllbGRFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIGludGVyY2VwdGVkTWVtYmVyc1tlbGVtZW50Lm5hbWVdICE9IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSW50ZXJjZXB0ZWROYW1lKFN0cmluZyBuYW1lKSB7CiAgICByZXR1cm4gaW50ZXJjZXB0ZWRNZW1iZXJzW25hbWVdICE9IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSW50ZXJjZXB0ZWRTZWxlY3RvcihTZWxlY3RvciBzZWxlY3RvcikgewogICAgcmV0dXJuIGludGVyY2VwdGVkTWVtYmVyc1tzZWxlY3Rvci5uYW1lXSAhPSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0ludGVyY2VwdGVkTWl4aW5TZWxlY3RvcigKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgbWFzaywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBTZXQ8TWVtYmVyRW50aXR5PiBlbGVtZW50cyA9CiAgICAgICAgX2ludGVyY2VwdGVkTWl4aW5FbGVtZW50cy5wdXRJZkFic2VudChzZWxlY3Rvci5uYW1lLCAoKSB7CiAgICAgIFNldDxNZW1iZXJFbnRpdHk+IGVsZW1lbnRzID0gaW50ZXJjZXB0ZWRNZW1iZXJzW3NlbGVjdG9yLm5hbWVdOwogICAgICBpZiAoZWxlbWVudHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiBlbGVtZW50cwogICAgICAgICAgLndoZXJlKChlbGVtZW50KSA9PiBjbGFzc2VzTWl4ZWRJbnRvSW50ZXJjZXB0ZWRDbGFzc2VzCiAgICAgICAgICAgICAgLmNvbnRhaW5zKGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MpKQogICAgICAgICAgLnRvU2V0KCk7CiAgICB9KTsKCiAgICBpZiAoZWxlbWVudHMgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgaWYgKGVsZW1lbnRzLmlzRW1wdHkpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBlbGVtZW50cy5hbnkoKGVsZW1lbnQpIHsKICAgICAgcmV0dXJuIHNlbGVjdG9yLmFwcGxpZXMoZWxlbWVudCkgJiYKICAgICAgICAgIChtYXNrID09IG51bGwgfHwKICAgICAgICAgICAgICBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgICAgICAgICAgIC5pc1RhcmdldGluZ01lbWJlcihtYXNrLCBlbGVtZW50LCBzZWxlY3Rvci5tZW1iZXJOYW1lKQogICAgICAgICAgICAgICAgICAuaXNQb3RlbnRpYWxseVRydWUpOwogICAgfSk7CiAgfQoKICAvLy8gVHJ1ZSBpZiB0aGUgZ2l2ZW4gY2xhc3MgaXMgYW4gaW50ZXJuYWwgY2xhc3MgdXNlZCBmb3IgdHlwZSBpbmZlcmVuY2UKICAvLy8gYW5kIG5ldmVyIGV4aXN0cyBhdCBydW50aW1lLgogIGJvb2wgX2lzQ29tcGlsZVRpbWVPbmx5Q2xhc3MoQ2xhc3NFbnRpdHkgY2xhc3NfKSB7CiAgICByZXR1cm4gY2xhc3NfID09IF9jb21tb25FbGVtZW50cy5qc1Bvc2l0aXZlSW50Q2xhc3MgfHwKICAgICAgICBjbGFzc18gPT0gX2NvbW1vbkVsZW1lbnRzLmpzVUludDMyQ2xhc3MgfHwKICAgICAgICBjbGFzc18gPT0gX2NvbW1vbkVsZW1lbnRzLmpzVUludDMxQ2xhc3MgfHwKICAgICAgICBjbGFzc18gPT0gX2NvbW1vbkVsZW1lbnRzLmpzRml4ZWRBcnJheUNsYXNzIHx8CiAgICAgICAgY2xhc3NfID09IF9jb21tb25FbGVtZW50cy5qc1VubW9kaWZpYWJsZUFycmF5Q2xhc3MgfHwKICAgICAgICBjbGFzc18gPT0gX2NvbW1vbkVsZW1lbnRzLmpzTXV0YWJsZUFycmF5Q2xhc3MgfHwKICAgICAgICBjbGFzc18gPT0gX2NvbW1vbkVsZW1lbnRzLmpzRXh0ZW5kYWJsZUFycmF5Q2xhc3M7CiAgfQoKICAvLy8gUmV0dXJucyBhIHNldCBvZiBpbnRlcmNlcHRvciBjbGFzc2VzIHRoYXQgY29udGFpbiBhIG1lbWJlciBuYW1lZCBbbmFtZV0KICAvLy8KICAvLy8gUmV0dXJucyBhbiBlbXB0eSBzZXQgaWYgdGhlcmUgaXMgbm8gY2xhc3MuIERvIG5vdCBtb2RpZnkgdGhlIHJldHVybmVkIHNldC4KICBAb3ZlcnJpZGUKICBTZXQ8Q2xhc3NFbnRpdHk+IGdldEludGVyY2VwdGVkQ2xhc3Nlc09uKAogICAgICBTdHJpbmcgbmFtZSwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBTZXQ8TWVtYmVyRW50aXR5PiBpbnRlcmNlcHRlZCA9IGludGVyY2VwdGVkTWVtYmVyc1tuYW1lXTsKICAgIGlmIChpbnRlcmNlcHRlZCA9PSBudWxsKSByZXR1cm4gX25vQ2xhc3NlczsKICAgIHJldHVybiBfaW50ZXJjZXB0ZWRDbGFzc2VzQ2FjaGUucHV0SWZBYnNlbnQobmFtZSwgKCkgewogICAgICAvLyBQb3B1bGF0ZSB0aGUgY2FjaGUgYnkgcnVubmluZyB0aHJvdWdoIGFsbCB0aGUgZWxlbWVudHMgYW5kCiAgICAgIC8vIGRldGVybWluZSBpZiB0aGUgZ2l2ZW4gc2VsZWN0b3IgYXBwbGllcyB0byB0aGVtLgogICAgICBTZXQ8Q2xhc3NFbnRpdHk+IHJlc3VsdCA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CiAgICAgIGZvciAoTWVtYmVyRW50aXR5IGVsZW1lbnQgaW4gaW50ZXJjZXB0ZWQpIHsKICAgICAgICBDbGFzc0VudGl0eSBjbGFzc0VsZW1lbnQgPSBlbGVtZW50LmVuY2xvc2luZ0NsYXNzOwogICAgICAgIGlmIChfaXNDb21waWxlVGltZU9ubHlDbGFzcyhjbGFzc0VsZW1lbnQpKSBjb250aW51ZTsKICAgICAgICBpZiAoX25hdGl2ZURhdGEuaXNOYXRpdmVPckV4dGVuZHNOYXRpdmUoY2xhc3NFbGVtZW50KSB8fAogICAgICAgICAgICBpbnRlcmNlcHRlZENsYXNzZXMuY29udGFpbnMoY2xhc3NFbGVtZW50KSkgewogICAgICAgICAgcmVzdWx0LmFkZChjbGFzc0VsZW1lbnQpOwogICAgICAgIH0KICAgICAgICBpZiAoY2xhc3Nlc01peGVkSW50b0ludGVyY2VwdGVkQ2xhc3Nlcy5jb250YWlucyhjbGFzc0VsZW1lbnQpKSB7CiAgICAgICAgICBTZXQ8Q2xhc3NFbnRpdHk+IG5hdGl2ZVN1YmNsYXNzZXMgPQogICAgICAgICAgICAgIG5hdGl2ZVN1YmNsYXNzZXNPZk1peGluKGNsYXNzRWxlbWVudCwgY2xvc2VkV29ybGQpOwogICAgICAgICAgaWYgKG5hdGl2ZVN1YmNsYXNzZXMgIT0gbnVsbCkgcmVzdWx0LmFkZEFsbChuYXRpdmVTdWJjbGFzc2VzKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0pOwogIH0KCiAgU2V0PENsYXNzRW50aXR5PiBuYXRpdmVTdWJjbGFzc2VzT2ZNaXhpbigKICAgICAgQ2xhc3NFbnRpdHkgbWl4aW4sIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IHVzZXMgPSBjbG9zZWRXb3JsZC5taXhpblVzZXNPZihtaXhpbik7CiAgICBTZXQ8Q2xhc3NFbnRpdHk+IHJlc3VsdCA9IG51bGw7CiAgICBmb3IgKENsYXNzRW50aXR5IHVzZSBpbiB1c2VzKSB7CiAgICAgIGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmZvckVhY2hTdHJpY3RTdWJjbGFzc09mKHVzZSwKICAgICAgICAgIChDbGFzc0VudGl0eSBzdWJjbGFzcykgewogICAgICAgIGlmIChfbmF0aXZlRGF0YS5pc05hdGl2ZU9yRXh0ZW5kc05hdGl2ZShzdWJjbGFzcykpIHsKICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKICAgICAgICAgIHJlc3VsdC5hZGQoc3ViY2xhc3MpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0ludGVyY2VwdGVkQ2xhc3MoQ2xhc3NFbnRpdHkgZWxlbWVudCkgewogICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgaWYgKF9uYXRpdmVEYXRhLmlzTmF0aXZlT3JFeHRlbmRzTmF0aXZlKGVsZW1lbnQpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChpbnRlcmNlcHRlZENsYXNzZXMuY29udGFpbnMoZWxlbWVudCkpIHJldHVybiB0cnVlOwogICAgaWYgKGNsYXNzZXNNaXhlZEludG9JbnRlcmNlcHRlZENsYXNzZXMuY29udGFpbnMoZWxlbWVudCkpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc01peGVkSW50b0ludGVyY2VwdGVkQ2xhc3MoQ2xhc3NFbnRpdHkgZWxlbWVudCkgPT4KICAgICAgY2xhc3Nlc01peGVkSW50b0ludGVyY2VwdGVkQ2xhc3Nlcy5jb250YWlucyhlbGVtZW50KTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBtYXlHZW5lcmF0ZUluc3RhbmNlb2ZDaGVjayhEYXJ0VHlwZSB0eXBlLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIC8vIFdlIGNhbiB1c2UgYW4gaW5zdGFuY2VvZiBjaGVjayBmb3IgcmF3IHR5cGVzIHRoYXQgaGF2ZSBubyBzdWJjbGFzcyB0aGF0CiAgICAvLyBpcyBtaXhlZC1pbiBvciBpbiBhbiBpbXBsZW1lbnRzIGNsYXVzZS4KCiAgICBpZiAoIXR5cGUudHJlYXRBc1JhdykgcmV0dXJuIGZhbHNlOwogICAgaWYgKHR5cGUuaXNGdXR1cmVPcikgcmV0dXJuIGZhbHNlOwogICAgSW50ZXJmYWNlVHlwZSBpbnRlcmZhY2VUeXBlID0gdHlwZTsKICAgIENsYXNzRW50aXR5IGNsYXNzRWxlbWVudCA9IGludGVyZmFjZVR5cGUuZWxlbWVudDsKICAgIGlmIChpc0ludGVyY2VwdGVkQ2xhc3MoY2xhc3NFbGVtZW50KSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5Lmhhc09ubHlTdWJjbGFzc2VzKGNsYXNzRWxlbWVudCk7CiAgfQp9CgpjbGFzcyBJbnRlcmNlcHRvckRhdGFCdWlsZGVySW1wbCBpbXBsZW1lbnRzIEludGVyY2VwdG9yRGF0YUJ1aWxkZXIgewogIGZpbmFsIE5hdGl2ZUJhc2ljRGF0YSBfbmF0aXZlRGF0YTsKICBmaW5hbCBLRWxlbWVudEVudmlyb25tZW50IF9lbGVtZW50RW52aXJvbm1lbnQ7CiAgZmluYWwgS0NvbW1vbkVsZW1lbnRzIF9jb21tb25FbGVtZW50czsKCiAgLy8vIFRoZSBtZW1iZXJzIG9mIGluc3RhbnRpYXRlZCBpbnRlcmNlcHRvciBjbGFzc2VzOiBtYXBzIGEgbWVtYmVyIG5hbWUgdG8gdGhlCiAgLy8vIGxpc3Qgb2YgbWVtYmVycyB0aGF0IGhhdmUgdGhhdCBuYW1lLiBUaGlzIG1hcCBpcyB1c2VkIGJ5IHRoZSBjb2RlZ2VuIHRvCiAgLy8vIGtub3cgd2hldGhlciBhIHNlbmQgbXVzdCBiZSBpbnRlcmNlcHRlZCBvciBub3QuCiAgZmluYWwgTWFwPFN0cmluZywgU2V0PE1lbWJlckVudGl0eT4+IF9pbnRlcmNlcHRlZEVsZW1lbnRzID0KICAgICAgPFN0cmluZywgU2V0PE1lbWJlckVudGl0eT4+e307CgogIC8vLyBTZXQgb2YgY2xhc3NlcyB3aG9zZSBtZXRob2RzIGFyZSBpbnRlcmNlcHRlZC4KICBmaW5hbCBTZXQ8Q2xhc3NFbnRpdHk+IF9pbnRlcmNlcHRlZENsYXNzZXMgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwoKICAvLy8gU2V0IG9mIGNsYXNzZXMgdXNlZCBhcyBtaXhpbnMgb24gaW50ZXJjZXB0ZWQgKG5hdGl2ZSBhbmQgcHJpbWl0aXZlKQogIC8vLyBjbGFzc2VzLiBNZXRob2RzIG9uIHRoZXNlIGNsYXNzZXMgbWlnaHQgYWxzbyBiZSBtaXhlZCBpbiB0byByZWd1bGFyIERhcnQKICAvLy8gKHVuaW50ZXJjZXB0ZWQpIGNsYXNzZXMuCiAgZmluYWwgU2V0PENsYXNzRW50aXR5PiBfY2xhc3Nlc01peGVkSW50b0ludGVyY2VwdGVkQ2xhc3NlcyA9CiAgICAgIG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CgogIEludGVyY2VwdG9yRGF0YUJ1aWxkZXJJbXBsKAogICAgICB0aGlzLl9uYXRpdmVEYXRhLCB0aGlzLl9lbGVtZW50RW52aXJvbm1lbnQsIHRoaXMuX2NvbW1vbkVsZW1lbnRzKTsKCiAgQG92ZXJyaWRlCiAgSW50ZXJjZXB0b3JEYXRhIGNsb3NlKCkgewogICAgcmV0dXJuIG5ldyBJbnRlcmNlcHRvckRhdGFJbXBsKAogICAgICAgIF9uYXRpdmVEYXRhLAogICAgICAgIF9jb21tb25FbGVtZW50cywKICAgICAgICBfaW50ZXJjZXB0ZWRFbGVtZW50cywKICAgICAgICBfaW50ZXJjZXB0ZWRDbGFzc2VzLAogICAgICAgIF9jbGFzc2VzTWl4ZWRJbnRvSW50ZXJjZXB0ZWRDbGFzc2VzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWRkSW50ZXJjZXB0b3JzRm9yTmF0aXZlQ2xhc3NNZW1iZXJzKENsYXNzRW50aXR5IGNscykgewogICAgX2VsZW1lbnRFbnZpcm9ubWVudC5mb3JFYWNoQ2xhc3NNZW1iZXIoY2xzLAogICAgICAgIChDbGFzc0VudGl0eSBjbHMsIE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgICAgaWYgKG1lbWJlci5uYW1lID09IElkZW50aWZpZXJzLmNhbGwpIHJldHVybjsKICAgICAgLy8gQWxsIG1ldGhvZHMgb24gW09iamVjdF0gYXJlIHNoYWRvd2VkIGJ5IFtJbnRlcmNlcHRvcl0uCiAgICAgIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKSByZXR1cm47CiAgICAgIFNldDxNZW1iZXJFbnRpdHk+IHNldCA9CiAgICAgICAgICBfaW50ZXJjZXB0ZWRFbGVtZW50c1ttZW1iZXIubmFtZV0gPz89IG5ldyBTZXQ8TWVtYmVyRW50aXR5PigpOwogICAgICBzZXQuYWRkKG1lbWJlcik7CiAgICB9KTsKCiAgICAvLyBXYWxrIHN1cGVyY2xhc3MgY2hhaW4gdG8gZmluZCBtaXhpbnMuCiAgICBfZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hNaXhpbihjbHMsIChDbGFzc0VudGl0eSBtaXhpbikgewogICAgICBfY2xhc3Nlc01peGVkSW50b0ludGVyY2VwdGVkQ2xhc3Nlcy5hZGQobWl4aW4pOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZEludGVyY2VwdG9ycyhDbGFzc0VudGl0eSBjbHMpIHsKICAgIGlmIChfaW50ZXJjZXB0ZWRDbGFzc2VzLmFkZChjbHMpKSB7CiAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaENsYXNzTWVtYmVyKGNscywKICAgICAgICAgIChDbGFzc0VudGl0eSBjbHMsIE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgICAgICAvLyBBbGwgbWV0aG9kcyBvbiBbT2JqZWN0XSBhcmUgc2hhZG93ZWQgYnkgW0ludGVyY2VwdG9yXS4KICAgICAgICBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5vYmplY3RDbGFzcykgcmV0dXJuOwogICAgICAgIFNldDxNZW1iZXJFbnRpdHk+IHNldCA9CiAgICAgICAgICAgIF9pbnRlcmNlcHRlZEVsZW1lbnRzW21lbWJlci5uYW1lXSA/Pz0gbmV3IFNldDxNZW1iZXJFbnRpdHk+KCk7CiAgICAgICAgc2V0LmFkZChtZW1iZXIpOwogICAgICB9KTsKICAgIH0KICAgIF9pbnRlcmNlcHRlZENsYXNzZXMuYWRkKF9jb21tb25FbGVtZW50cy5qc0ludGVyY2VwdG9yQ2xhc3MpOwogIH0KfQoKY2xhc3MgT25lU2hvdEludGVyY2VwdG9yRGF0YSB7CiAgZmluYWwgSW50ZXJjZXB0b3JEYXRhIF9pbnRlcmNlcHRvckRhdGE7CiAgZmluYWwgQ29tbW9uRWxlbWVudHMgX2NvbW1vbkVsZW1lbnRzOwoKICBPbmVTaG90SW50ZXJjZXB0b3JEYXRhKHRoaXMuX2ludGVyY2VwdG9yRGF0YSwgdGhpcy5fY29tbW9uRWxlbWVudHMpOwoKICAvLy8gQSBjb2xsZWN0aW9uIG9mIHNlbGVjdG9ycyB0aGF0IG11c3QgaGF2ZSBhIG9uZSBzaG90IGludGVyY2VwdG9yIGdlbmVyYXRlZC4KICBmaW5hbCBNYXA8anNBc3QuTmFtZSwgU2VsZWN0b3I+IF9vbmVTaG90SW50ZXJjZXB0b3JzID0KICAgICAgPGpzQXN0Lk5hbWUsIFNlbGVjdG9yPnt9OwoKICBTZWxlY3RvciBnZXRPbmVTaG90SW50ZXJjZXB0b3JTZWxlY3Rvcihqc0FzdC5OYW1lIG5hbWUpID0+CiAgICAgIF9vbmVTaG90SW50ZXJjZXB0b3JzW25hbWVdOwoKICBJdGVyYWJsZTxqc0FzdC5OYW1lPiBnZXQgb25lU2hvdEludGVyY2VwdG9yTmFtZXMgPT4KICAgICAgX29uZVNob3RJbnRlcmNlcHRvcnMua2V5cy50b0xpc3QoKS4uc29ydCgpOwoKICAvLy8gQSBtYXAgb2Ygc3BlY2lhbGl6ZWQgdmVyc2lvbnMgb2YgdGhlIFtnZXRJbnRlcmNlcHRvck1ldGhvZF0uCiAgLy8vCiAgLy8vIFNpbmNlIFtnZXRJbnRlcmNlcHRvck1ldGhvZF0gaXMgYSBob3QgbWV0aG9kIGF0IHJ1bnRpbWUsIHdlJ3JlIGFsd2F5cwogIC8vLyBzcGVjaWFsaXppbmcgaXQgYmFzZWQgb24gdGhlIGluY29taW5nIHR5cGUuIFRoZSBrZXlzIGluIHRoZSBtYXAgYXJlIHRoZQogIC8vLyBuYW1lcyBvZiB0aGVzZSBzcGVjaWFsaXplZCB2ZXJzaW9ucy4gTm90ZSB0aGF0IHRoZSBnZW5lcmljIHZlcnNpb24gdGhhdAogIC8vLyBjb250YWlucyBhbGwgcG9zc2libGUgdHlwZSBjaGVja3MgaXMgYWxzbyBzdG9yZWQgaW4gdGhpcyBtYXAuCiAgZmluYWwgTWFwPGpzQXN0Lk5hbWUsIFNldDxDbGFzc0VudGl0eT4+IF9zcGVjaWFsaXplZEdldEludGVyY2VwdG9ycyA9CiAgICAgIDxqc0FzdC5OYW1lLCBTZXQ8Q2xhc3NFbnRpdHk+Pnt9OwoKICBJdGVyYWJsZTxqc0FzdC5OYW1lPiBnZXQgc3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvck5hbWVzID0+CiAgICAgIF9zcGVjaWFsaXplZEdldEludGVyY2VwdG9ycy5rZXlzLnRvTGlzdCgpLi5zb3J0KCk7CgogIFNldDxDbGFzc0VudGl0eT4gZ2V0U3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvcnNGb3IoanNBc3QuTmFtZSBuYW1lKSA9PgogICAgICBfc3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvcnNbbmFtZV07CgogIGpzQXN0Lk5hbWUgcmVnaXN0ZXJPbmVTaG90SW50ZXJjZXB0b3IoCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLCBOYW1lciBuYW1lciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBTZXQ8Q2xhc3NFbnRpdHk+IGNsYXNzZXMgPQogICAgICAgIF9pbnRlcmNlcHRvckRhdGEuZ2V0SW50ZXJjZXB0ZWRDbGFzc2VzT24oc2VsZWN0b3IubmFtZSwgY2xvc2VkV29ybGQpOwogICAganNBc3QuTmFtZSBuYW1lID0gbmFtZXIubmFtZUZvckdldE9uZVNob3RJbnRlcmNlcHRvcihzZWxlY3RvciwgY2xhc3Nlcyk7CiAgICBpZiAoIV9vbmVTaG90SW50ZXJjZXB0b3JzLmNvbnRhaW5zS2V5KG5hbWUpKSB7CiAgICAgIHJlZ2lzdGVyU3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvcihjbGFzc2VzLCBuYW1lcik7CiAgICAgIF9vbmVTaG90SW50ZXJjZXB0b3JzW25hbWVdID0gc2VsZWN0b3I7CiAgICB9CiAgICByZXR1cm4gbmFtZTsKICB9CgogIHZvaWQgcmVnaXN0ZXJTcGVjaWFsaXplZEdldEludGVyY2VwdG9yKAogICAgICBTZXQ8Q2xhc3NFbnRpdHk+IGNsYXNzZXMsIE5hbWVyIG5hbWVyKSB7CiAgICBqc0FzdC5OYW1lIG5hbWUgPSBuYW1lci5uYW1lRm9yR2V0SW50ZXJjZXB0b3IoY2xhc3Nlcyk7CiAgICBpZiAoY2xhc3Nlcy5jb250YWlucyhfY29tbW9uRWxlbWVudHMuanNJbnRlcmNlcHRvckNsYXNzKSkgewogICAgICAvLyBXZSBjYW4ndCB1c2UgYSBzcGVjaWFsaXplZCBbZ2V0SW50ZXJjZXB0b3JNZXRob2RdLCBzbyB3ZSBtYWtlCiAgICAgIC8vIHN1cmUgd2UgZW1pdCB0aGUgb25lIHdpdGggYWxsIGNoZWNrcy4KICAgICAgX3NwZWNpYWxpemVkR2V0SW50ZXJjZXB0b3JzW25hbWVdID0gX2ludGVyY2VwdG9yRGF0YS5pbnRlcmNlcHRlZENsYXNzZXM7CiAgICB9IGVsc2UgewogICAgICBfc3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvcnNbbmFtZV0gPSBjbGFzc2VzOwogICAgfQogIH0KfQqBmgBOTjwBJQEwIT8kITEhLiQqFRsBIT0uGR1PATMnATcwATI3NycxAVAhBkkUI0gBNDA5AU4GUSwuAU1REkwCASgpPhsCATdJHTABJSgBUU42OwEMLQFKTx89AUdNBktJUAZPMEMsAUErAT4BFxgcHx8wATJRFzQ8OClAKgZIOiYVJBQYHBwtBAEMKBUuSh4iCCs7EwQBDDMxLSxKBjUEAQw4NQQBDDg1BAEMKC0EAQwyNgQBDCNJIUJGKRZBMRQIASgoJCobLkknCAQBSyM1OzMzNz45OgQBTgZRDCwvPjA7RDo4Mjs9QTkkCkkuQkkKCBUIBAEsNUEkJD4jPT8gCgoGEwQBDDEnQztLEgQBDDs8AQxNTy8BKCcoNjhHBAIBRSUxKQFRTjY+JQE0RwFKTx8/HgEeSQEMHCQVGR4dLgQBDD8wMTNANh5JFwgBLUA2CAQBDCooMjNCOCBLGQoGQQQCAR8qKAFHAVE5IAE9IgE2MgFDBkxOTkRIKAE9OQFIKQEpQh9OTTM5LQYRBAEqLzxARy9PDTMGBAIBNXBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvaW50ZXJjZXB0b3JfZGF0YS5kYXJ0RXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2JhY2tlbmQvbm9fc3VjaF9tZXRob2RfcmVnaXN0cnkuZGFydKuKLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JyBzaG93IENvbW1vbkVsZW1lbnRzOwppbXBvcnQgJy4uL2NvbW1vbi9uYW1lcy5kYXJ0JyBzaG93IElkZW50aWZpZXJzLCBTZWxlY3RvcnM7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwoKLy8vIFtOb1N1Y2hNZXRob2RSZWdpc3RyeV0gYW5kIFtOb1N1Y2hNZXRob2REYXRhXSBjYXRlZ29yaXplcyBgbm9TdWNoTWV0aG9kYAovLy8gaW1wbGVtZW50YXRpb25zLgovLy8KLy8vIElmIHVzZXIgY29kZSBpbmNsdWRlcyBgbm9TdWNoTWV0aG9kYCBpbXBsZW1lbnRhdGlvbnMsIHR5cGUgaW5mZXJlbmNlIGlzCi8vLyBoaW5kZXJlZCBiZWNhdXNlIChmb3IgaW5zdGFuY2UpIGFueSBzZWxlY3RvciB3aGVyZSB0aGUgdHlwZSBvZiB0aGUKLy8vIHJlY2VpdmVyIGlzIG5vdCBrbm93biBhbGwgaW1wbGVtZW50YXRpb25zIG9mIGBub1N1Y2hNZXRob2RgIG11c3QgYmUgdGFrZW4KLy8vIGludG8gYWNjb3VudCB3aGVuIGluZmVycmluZyB0aGUgcmV0dXJuIHR5cGUuCi8vLwovLy8gVGhlIHNpdHVhdGlvbiBjYW4gYmUgYW1lbGlvcmF0ZWQgd2l0aCBzb21lIGhldXJpc3RpY3MgZm9yIGRpc3JlZ2FyZGluZyBzb21lCi8vLyBgbm9TdWNoTWV0aG9kYCBpbXBsZW1lbnRhdGlvbnMgZHVyaW5nIHR5cGUgaW5mZXJlbmNlLiBXZSBjYW4gcGFydGl0aW9uCi8vLyBgbm9TdWNoTWV0aG9kYCBpbXBsZW1lbnRhdGlvbnMgaW50byA0IGNhdGVnb3JpZXMuCi8vLwovLy8gSW1wbGVtZW50YXRpb25zIGluIGNhdGVnb3J5IEEgYXJlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucwovLy8gYE9iamVjdC5ub1N1Y2hNZXRob2RgIGFuZCBgSW50ZXJjZXB0b3Iubm9TdWNoTWV0aG9kYC4KLy8vCi8vLyBJbXBsZW1lbnRhdGlvbnMgaW4gY2F0ZWdvcnkgQiBzeW50YWN0aWNhbGx5IGltbWVkaWF0ZWx5IHRocm93LCBmb3IgZXhhbXBsZToKLy8vCi8vLyAgICAgbm9TdWNoTWV0aG9kKHgpID0+IHRocm93ICdub3QgaW1wbGVtZW50ZWQnCi8vLwovLy8gSW1wbGVtZW50YXRpb25zIGluIGNhdGVnb3J5IEMgYXJlIG5vdCBhcHBsaWNhYmxlLCBmb3IgZXhhbXBsZToKLy8vCi8vLyAgICAgbm9TdWNoTWV0aG9kKCkgeyAvKiBtaXNzaW5nIHBhcmFtZXRlciAqLyB9Ci8vLyAgICAgbm9TdWNoTWV0aG9kKGEsIGIpIHsgLyogdG9vIG1hbnkgcGFyYW1ldGVycyAqLyB9Ci8vLwovLy8gSW1wbGVtZW50YXRpb25zIHRoYXQgZG8gbm90IGZhbGwgaW50byBjYXRlZ29yeSBBLCBCIG9yIEMgYXJlIGluIGNhdGVnb3J5IEQuCi8vLyBUaGV5IGFyZSB0aGUgb25seSBjYXRlZ29yeSBvZiBpbXBsZW1lbnRhdGlvbiB0aGF0IGFyZSBjb25zaWRlcmVkIGR1cmluZyB0eXBlCi8vLyBpbmZlcmVuY2UuCi8vLwovLy8gSW1wbGVtZW50YXRpb25zIHRoYXQgc3ludGFjdGljYWxseSBqdXN0IGZvcndhcmQgdG8gdGhlIHN1cGVyIGltcGxlbWVudGF0aW9uLAovLy8gZm9yIGV4YW1wbGU6Ci8vLwovLy8gICAgIG5vU3VjaE1ldGhvZCh4KSA9PiBzdXBlci5ub1N1Y2hNZXRob2QoeCk7Ci8vLwovLy8gYXJlIGluIHRoZSBzYW1lIGNhdGVnb3J5IGFzIHRoZSBzdXBlcmNsYXNzIGltcGxlbWVudGF0aW9uLiBUaGlzIGNvdmVycyBhCi8vLyBjb21tb24gY2FzZSwgd2hlcmUgdXNlcnMgaW1wbGVtZW50IGBub1N1Y2hNZXRob2RgIHdpdGggdGhlc2UgZHVtbXkKLy8vIGltcGxlbWVudGF0aW9ucyB0byBhdm9pZCB3YXJuaW5ncy4KCi8vLyBSZWdpc3RyeSBmb3IgY29sbGVjdGluZyBgbm9TdWNoTWV0aG9kYCBpbXBsZW1lbnRhdGlvbnMgYW5kIGNhdGVnb3JpemluZyB0aGVtCi8vLyBpbnRvIGNhdGVnb3JpZXMgYEFgLCBgQmAsIGBDYCwgYERgLgphYnN0cmFjdCBjbGFzcyBOb1N1Y2hNZXRob2RSZWdpc3RyeSB7CiAgLy8vIFJlZ2lzdGVyIFtub1N1Y2hNZXRob2RFbGVtZW50XS4KICB2b2lkIHJlZ2lzdGVyTm9TdWNoTWV0aG9kKEZ1bmN0aW9uRW50aXR5IG5vU3VjaE1ldGhvZEVsZW1lbnQpOwoKICAvLy8gQ2F0ZWdvcml6ZXMgdGhlIHJlZ2lzdGVyZWQgbWV0aG9kcy4KICB2b2lkIG9uUXVldWVFbXB0eSgpOwoKICAvLy8gYHRydWVgIGlmIGEgY2F0ZWdvcnkgYEJgIG1ldGhvZCBoYXMgYmVlbiBzZWVuIHNvIGZhci4KICBib29sIGdldCBoYXNUaHJvd2luZ05vU3VjaE1ldGhvZDsKCiAgLy8vIGB0cnVlYCBpZiBhIGNhdGVnb3J5IGBEYCBtZXRob2QgaGFzIGJlZW4gc2VlbiBzbyBmYXIuCiAgYm9vbCBnZXQgaGFzQ29tcGxleE5vU3VjaE1ldGhvZDsKCiAgLy8vIENsb3NlcyB0aGUgcmVnaXN0cnkgYW5kIHJldHVybnMgZGF0YSBvYmplY3QgdXNlZCBkdXJpbmcgdHlwZSBpbmZlcmVuY2UuCiAgTm9TdWNoTWV0aG9kRGF0YSBjbG9zZSgpOwp9CgpjbGFzcyBOb1N1Y2hNZXRob2RSZWdpc3RyeUltcGwgaW1wbGVtZW50cyBOb1N1Y2hNZXRob2RSZWdpc3RyeSB7CiAgLy8vIFRoZSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBmYWxsIGludG8gY2F0ZWdvcnkgQSwgZGVzY3JpYmVkIGFib3ZlLgogIGZpbmFsIFNldDxGdW5jdGlvbkVudGl0eT4gZGVmYXVsdEltcGxzID0gbmV3IFNldDxGdW5jdGlvbkVudGl0eT4oKTsKCiAgLy8vIFRoZSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBmYWxsIGludG8gY2F0ZWdvcnkgQiwgZGVzY3JpYmVkIGFib3ZlLgogIGZpbmFsIFNldDxGdW5jdGlvbkVudGl0eT4gdGhyb3dpbmdJbXBscyA9IG5ldyBTZXQ8RnVuY3Rpb25FbnRpdHk+KCk7CgogIC8vLyBUaGUgaW1wbGVtZW50YXRpb25zIHRoYXQgZmFsbCBpbnRvIGNhdGVnb3J5IEMsIGRlc2NyaWJlZCBhYm92ZS4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhpcyBjYXRlZ29yeSB3aGVuIERhcnQgMSBpcyBubyBsb25nZXIKICAvLyBzdXBwb3J0ZWQuCiAgZmluYWwgU2V0PEZ1bmN0aW9uRW50aXR5PiBub3RBcHBsaWNhYmxlSW1wbHMgPSBuZXcgU2V0PEZ1bmN0aW9uRW50aXR5PigpOwoKICAvLy8gVGhlIGltcGxlbWVudGF0aW9ucyB0aGF0IGZhbGwgaW50byBjYXRlZ29yeSBELCBkZXNjcmliZWQgYWJvdmUuCiAgZmluYWwgU2V0PEZ1bmN0aW9uRW50aXR5PiBvdGhlckltcGxzID0gbmV3IFNldDxGdW5jdGlvbkVudGl0eT4oKTsKCiAgLy8vIFRoZSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBjYXRlZ29yaXplZC4KICBmaW5hbCBTZXQ8RnVuY3Rpb25FbnRpdHk+IF91bmNhdGVnb3JpemVkSW1wbHMgPSBuZXcgU2V0PEZ1bmN0aW9uRW50aXR5PigpOwoKICAvLy8gVGhlIGltcGxlbWVudGF0aW9ucyB0aGF0IGEgZm9yd2FyZGluZyBzeW50YXggYXMgZGVmaW5lZCBieQogIC8vLyBbTm9TdWNoTWV0aG9kUmVzb2x2ZXIuaGFzRm9yd2FyZFN5bnRheF0uCiAgZmluYWwgU2V0PEZ1bmN0aW9uRW50aXR5PiBmb3J3YXJkaW5nU3ludGF4SW1wbHMgPSBuZXcgU2V0PEZ1bmN0aW9uRW50aXR5PigpOwoKICBmaW5hbCBDb21tb25FbGVtZW50cyBfY29tbW9uRWxlbWVudHM7CiAgZmluYWwgTm9TdWNoTWV0aG9kUmVzb2x2ZXIgX3Jlc29sdmVyOwoKICBOb1N1Y2hNZXRob2RSZWdpc3RyeUltcGwodGhpcy5fY29tbW9uRWxlbWVudHMsIHRoaXMuX3Jlc29sdmVyKTsKCiAgTm9TdWNoTWV0aG9kUmVzb2x2ZXIgZ2V0IGludGVybmFsUmVzb2x2ZXJGb3JUZXN0aW5nID0+IF9yZXNvbHZlcjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaGFzVGhyb3dpbmdOb1N1Y2hNZXRob2QgPT4gdGhyb3dpbmdJbXBscy5pc05vdEVtcHR5OwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGhhc0NvbXBsZXhOb1N1Y2hNZXRob2QgPT4gb3RoZXJJbXBscy5pc05vdEVtcHR5OwoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyTm9TdWNoTWV0aG9kKEZ1bmN0aW9uRW50aXR5IG5vU3VjaE1ldGhvZEVsZW1lbnQpIHsKICAgIF91bmNhdGVnb3JpemVkSW1wbHMuYWRkKG5vU3VjaE1ldGhvZEVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBvblF1ZXVlRW1wdHkoKSB7CiAgICBfdW5jYXRlZ29yaXplZEltcGxzLmZvckVhY2goX2NhdGVnb3JpemVJbXBsKTsKICAgIF91bmNhdGVnb3JpemVkSW1wbHMuY2xlYXIoKTsKICB9CgogIE5zbUNhdGVnb3J5IF9jYXRlZ29yaXplSW1wbChGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQoZWxlbWVudC5uYW1lID09IElkZW50aWZpZXJzLm5vU3VjaE1ldGhvZF8pOwogICAgYXNzZXJ0KCFlbGVtZW50LmlzQWJzdHJhY3QpOwogICAgaWYgKGRlZmF1bHRJbXBscy5jb250YWlucyhlbGVtZW50KSkgewogICAgICByZXR1cm4gTnNtQ2F0ZWdvcnkuREVGQVVMVDsKICAgIH0KICAgIGlmICh0aHJvd2luZ0ltcGxzLmNvbnRhaW5zKGVsZW1lbnQpKSB7CiAgICAgIHJldHVybiBOc21DYXRlZ29yeS5USFJPV0lORzsKICAgIH0KICAgIGlmIChvdGhlckltcGxzLmNvbnRhaW5zKGVsZW1lbnQpKSB7CiAgICAgIHJldHVybiBOc21DYXRlZ29yeS5PVEhFUjsKICAgIH0KICAgIGlmIChub3RBcHBsaWNhYmxlSW1wbHMuY29udGFpbnMoZWxlbWVudCkpIHsKICAgICAgcmV0dXJuIE5zbUNhdGVnb3J5Lk5PVF9BUFBMSUNBQkxFOwogICAgfQogICAgaWYgKCFTZWxlY3RvcnMubm9TdWNoTWV0aG9kXy5zaWduYXR1cmVBcHBsaWVzKGVsZW1lbnQpKSB7CiAgICAgIG5vdEFwcGxpY2FibGVJbXBscy5hZGQoZWxlbWVudCk7CiAgICAgIHJldHVybiBOc21DYXRlZ29yeS5OT1RfQVBQTElDQUJMRTsKICAgIH0KICAgIGlmIChfY29tbW9uRWxlbWVudHMuaXNEZWZhdWx0Tm9TdWNoTWV0aG9kSW1wbGVtZW50YXRpb24oZWxlbWVudCkpIHsKICAgICAgZGVmYXVsdEltcGxzLmFkZChlbGVtZW50KTsKICAgICAgcmV0dXJuIE5zbUNhdGVnb3J5LkRFRkFVTFQ7CiAgICB9IGVsc2UgaWYgKF9yZXNvbHZlci5oYXNGb3J3YXJkaW5nU3ludGF4KGVsZW1lbnQpKSB7CiAgICAgIGZvcndhcmRpbmdTeW50YXhJbXBscy5hZGQoZWxlbWVudCk7CiAgICAgIC8vIElmIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyAnbm9TdWNoTWV0aG9kKHgpID0+IHN1cGVyLm5vU3VjaE1ldGhvZCh4KTsnCiAgICAgIC8vIHRoZW4gaXQgaXMgaW4gdGhlIHNhbWUgY2F0ZWdvcnkgYXMgdGhlIHN1cGVyIGNhbGwuCiAgICAgIEZ1bmN0aW9uRW50aXR5IHN1cGVyQ2FsbCA9IF9yZXNvbHZlci5nZXRTdXBlck5vU3VjaE1ldGhvZChlbGVtZW50KTsKICAgICAgTnNtQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBfY2F0ZWdvcml6ZUltcGwoc3VwZXJDYWxsKTsKICAgICAgc3dpdGNoIChjYXRlZ29yeSkgewogICAgICAgIGNhc2UgTnNtQ2F0ZWdvcnkuREVGQVVMVDoKICAgICAgICAgIGRlZmF1bHRJbXBscy5hZGQoZWxlbWVudCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE5zbUNhdGVnb3J5LlRIUk9XSU5HOgogICAgICAgICAgdGhyb3dpbmdJbXBscy5hZGQoZWxlbWVudCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE5zbUNhdGVnb3J5Lk9USEVSOgogICAgICAgICAgb3RoZXJJbXBscy5hZGQoZWxlbWVudCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE5zbUNhdGVnb3J5Lk5PVF9BUFBMSUNBQkxFOgogICAgICAgICAgLy8gSWYgdGhlIHN1cGVyIG1ldGhvZCBpcyBub3QgYXBwbGljYWJsZSwgdGhlIGNhbGwgaXMgcmVkaXJlY3RlZCB0bwogICAgICAgICAgLy8gYE9iamVjdC5ub1N1Y2hNZXRob2RgLgogICAgICAgICAgZGVmYXVsdEltcGxzLmFkZChlbGVtZW50KTsKICAgICAgICAgIGNhdGVnb3J5ID0gTnNtQ2F0ZWdvcnkuREVGQVVMVDsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHJldHVybiBjYXRlZ29yeTsKICAgIH0gZWxzZSBpZiAoX3Jlc29sdmVyLmhhc1Rocm93aW5nU3ludGF4KGVsZW1lbnQpKSB7CiAgICAgIHRocm93aW5nSW1wbHMuYWRkKGVsZW1lbnQpOwogICAgICByZXR1cm4gTnNtQ2F0ZWdvcnkuVEhST1dJTkc7CiAgICB9IGVsc2UgewogICAgICBvdGhlckltcGxzLmFkZChlbGVtZW50KTsKICAgICAgcmV0dXJuIE5zbUNhdGVnb3J5Lk9USEVSOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgTm9TdWNoTWV0aG9kRGF0YSBjbG9zZSgpIHsKICAgIHJldHVybiBuZXcgTm9TdWNoTWV0aG9kRGF0YUltcGwoCiAgICAgICAgdGhyb3dpbmdJbXBscywgb3RoZXJJbXBscywgZm9yd2FyZGluZ1N5bnRheEltcGxzKTsKICB9Cn0KCi8vLyBEYXRhIG9iamVjdCB1c2VkIGR1cmluZyB0eXBlIGluZmVyZW5jZS4KLy8vCi8vLyBQb3N0IGluZmVyZW5jZSBjb2xsZWN0ZWQgY2F0ZWdvcnkgYERgIG1ldGhvZHMgYXJlIGludG8gc3ViY2F0ZWdvcmllcyBgRDFgCi8vLyBhbmQgYEQyYC4KYWJzdHJhY3QgY2xhc3MgTm9TdWNoTWV0aG9kRGF0YSB7CiAgLy8vIERlc2VyaWFsaXplcyBhIFtOb1N1Y2hNZXRob2REYXRhXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IE5vU3VjaE1ldGhvZERhdGEucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSA9CiAgICAgIE5vU3VjaE1ldGhvZERhdGFJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZTsKCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbTm9TdWNoTWV0aG9kRGF0YV0gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspOwoKICAvLy8gUmV0dXJucyBbdHJ1ZV0gaWYgdGhlIGdpdmVuIGVsZW1lbnQgaXMgYSBjb21wbGV4IFtub1N1Y2hNZXRob2RdCiAgLy8vIGltcGxlbWVudGF0aW9uLiBBbiBpbXBsZW1lbnRhdGlvbiBpcyBjb21wbGV4IGlmIGl0IGZhbGxzIGludG8KICAvLy8gY2F0ZWdvcnkgRCwgYXMgZGVzY3JpYmVkIGFib3ZlLgogIGJvb2wgaXNDb21wbGV4KEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gTm93IHRoYXQgdHlwZSBpbmZlcmVuY2UgaXMgY29tcGxldGUsIHNwbGl0IGNhdGVnb3J5IEQgaW50byB0d28KICAvLy8gc3ViY2F0ZWdvcmllczogRDEsIHRob3NlIHRoYXQgaGF2ZSBubyByZXR1cm4gdHlwZSwgYW5kIEQyLCB0aG9zZQogIC8vLyB0aGF0IGhhdmUgYSByZXR1cm4gdHlwZS4KICB2b2lkIGNhdGVnb3JpemVDb21wbGV4SW1wbGVtZW50YXRpb25zKEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMpOwoKICAvLy8gRW1pdHMgYSBkaWFnbm9zdGljIGFib3V0IG1ldGhvZHMgaW4gY2F0ZWdvcmllcyBgQmAsIGBEMWAgYW5kIGBEMmAuCiAgdm9pZCBlbWl0RGlhZ25vc3RpYyhEaWFnbm9zdGljUmVwb3J0ZXIgcmVwb3J0ZXIpOwp9CgpjbGFzcyBOb1N1Y2hNZXRob2REYXRhSW1wbCBpbXBsZW1lbnRzIE5vU3VjaE1ldGhvZERhdGEgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbTm9TdWNoTWV0aG9kRGF0YV0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICduby1zdWNoLW1ldGhvZC1kYXRhJzsKCiAgLy8vIFRoZSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBmYWxsIGludG8gY2F0ZWdvcnkgQiwgZGVzY3JpYmVkIGFib3ZlLgogIGZpbmFsIFNldDxGdW5jdGlvbkVudGl0eT4gdGhyb3dpbmdJbXBsczsKCiAgLy8vIFRoZSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBmYWxsIGludG8gY2F0ZWdvcnkgRCwgZGVzY3JpYmVkIGFib3ZlLgogIGZpbmFsIFNldDxGdW5jdGlvbkVudGl0eT4gb3RoZXJJbXBsczsKCiAgLy8vIFRoZSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBmYWxsIGludG8gY2F0ZWdvcnkgRDEKICBmaW5hbCBTZXQ8RnVuY3Rpb25FbnRpdHk+IGNvbXBsZXhOb1JldHVybkltcGxzID0gbmV3IFNldDxGdW5jdGlvbkVudGl0eT4oKTsKCiAgLy8vIFRoZSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBmYWxsIGludG8gY2F0ZWdvcnkgRDIKICBmaW5hbCBTZXQ8RnVuY3Rpb25FbnRpdHk+IGNvbXBsZXhSZXR1cm5pbmdJbXBscyA9IG5ldyBTZXQ8RnVuY3Rpb25FbnRpdHk+KCk7CgogIGZpbmFsIFNldDxGdW5jdGlvbkVudGl0eT4gZm9yd2FyZGluZ1N5bnRheEltcGxzOwoKICBOb1N1Y2hNZXRob2REYXRhSW1wbCgKICAgICAgdGhpcy50aHJvd2luZ0ltcGxzLCB0aGlzLm90aGVySW1wbHMsIHRoaXMuZm9yd2FyZGluZ1N5bnRheEltcGxzKTsKCiAgZmFjdG9yeSBOb1N1Y2hNZXRob2REYXRhSW1wbC5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgU2V0PEZ1bmN0aW9uRW50aXR5PiB0aHJvd2luZ0ltcGxzID0KICAgICAgICBzb3VyY2UucmVhZE1lbWJlcnM8RnVuY3Rpb25FbnRpdHk+KCkudG9TZXQoKTsKICAgIFNldDxGdW5jdGlvbkVudGl0eT4gb3RoZXJJbXBscyA9CiAgICAgICAgc291cmNlLnJlYWRNZW1iZXJzPEZ1bmN0aW9uRW50aXR5PigpLnRvU2V0KCk7CiAgICBTZXQ8RnVuY3Rpb25FbnRpdHk+IGZvcndhcmRpbmdTeW50YXhJbXBscyA9CiAgICAgICAgc291cmNlLnJlYWRNZW1iZXJzPEZ1bmN0aW9uRW50aXR5PigpLnRvU2V0KCk7CiAgICBMaXN0PEZ1bmN0aW9uRW50aXR5PiBjb21wbGV4Tm9SZXR1cm5JbXBscyA9CiAgICAgICAgc291cmNlLnJlYWRNZW1iZXJzPEZ1bmN0aW9uRW50aXR5PigpOwogICAgTGlzdDxGdW5jdGlvbkVudGl0eT4gY29tcGxleFJldHVybmluZ0ltcGxzID0KICAgICAgICBzb3VyY2UucmVhZE1lbWJlcnM8RnVuY3Rpb25FbnRpdHk+KCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IE5vU3VjaE1ldGhvZERhdGFJbXBsKAogICAgICAgIHRocm93aW5nSW1wbHMsIG90aGVySW1wbHMsIGZvcndhcmRpbmdTeW50YXhJbXBscykKICAgICAgLi5jb21wbGV4Tm9SZXR1cm5JbXBscy5hZGRBbGwoY29tcGxleE5vUmV0dXJuSW1wbHMpCiAgICAgIC4uY29tcGxleFJldHVybmluZ0ltcGxzLmFkZEFsbChjb21wbGV4UmV0dXJuaW5nSW1wbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZU1lbWJlcnModGhyb3dpbmdJbXBscyk7CiAgICBzaW5rLndyaXRlTWVtYmVycyhvdGhlckltcGxzKTsKICAgIHNpbmsud3JpdGVNZW1iZXJzKGZvcndhcmRpbmdTeW50YXhJbXBscyk7CiAgICBzaW5rLndyaXRlTWVtYmVycyhjb21wbGV4Tm9SZXR1cm5JbXBscyk7CiAgICBzaW5rLndyaXRlTWVtYmVycyhjb21wbGV4UmV0dXJuaW5nSW1wbHMpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2F0ZWdvcml6ZUNvbXBsZXhJbXBsZW1lbnRhdGlvbnMoR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cykgewogICAgb3RoZXJJbXBscy5mb3JFYWNoKChGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICAgIGlmIChyZXN1bHRzLnJlc3VsdE9mTWVtYmVyKGVsZW1lbnQpLnRocm93c0Fsd2F5cykgewogICAgICAgIGNvbXBsZXhOb1JldHVybkltcGxzLmFkZChlbGVtZW50KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb21wbGV4UmV0dXJuaW5nSW1wbHMuYWRkKGVsZW1lbnQpOwogICAgICB9CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW1pdERpYWdub3N0aWMoRGlhZ25vc3RpY1JlcG9ydGVyIHJlcG9ydGVyKSB7CiAgICB0aHJvd2luZ0ltcGxzLmZvckVhY2goKGUpIHsKICAgICAgaWYgKCFmb3J3YXJkaW5nU3ludGF4SW1wbHMuY29udGFpbnMoZSkpIHsKICAgICAgICByZXBvcnRlci5yZXBvcnRIaW50TWVzc2FnZShlLCBNZXNzYWdlS2luZC5ESVJFQ1RMWV9USFJPV0lOR19OU00pOwogICAgICB9CiAgICB9KTsKICAgIGNvbXBsZXhOb1JldHVybkltcGxzLmZvckVhY2goKGUpIHsKICAgICAgaWYgKCFmb3J3YXJkaW5nU3ludGF4SW1wbHMuY29udGFpbnMoZSkpIHsKICAgICAgICByZXBvcnRlci5yZXBvcnRIaW50TWVzc2FnZShlLCBNZXNzYWdlS2luZC5DT01QTEVYX1RIUk9XSU5HX05TTSk7CiAgICAgIH0KICAgIH0pOwogICAgY29tcGxleFJldHVybmluZ0ltcGxzLmZvckVhY2goKGUpIHsKICAgICAgaWYgKCFmb3J3YXJkaW5nU3ludGF4SW1wbHMuY29udGFpbnMoZSkpIHsKICAgICAgICByZXBvcnRlci5yZXBvcnRIaW50TWVzc2FnZShlLCBNZXNzYWdlS2luZC5DT01QTEVYX1JFVFVSTklOR19OU00pOwogICAgICB9CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNDb21wbGV4KEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICAgIGFzc2VydChlbGVtZW50Lm5hbWUgPT0gSWRlbnRpZmllcnMubm9TdWNoTWV0aG9kXyk7CiAgICByZXR1cm4gb3RoZXJJbXBscy5jb250YWlucyhlbGVtZW50KTsKICB9Cn0KCmVudW0gTnNtQ2F0ZWdvcnkgewogIERFRkFVTFQsCiAgVEhST1dJTkcsCiAgTk9UX0FQUExJQ0FCTEUsCiAgT1RIRVIsCn0KCi8vLyBJbnRlcmZhY2UgZm9yIGRldGVybWluaW5nIHRoZSBmb3JtIG9mIGEgYG5vU3VjaE1ldGhvZGAgaW1wbGVtZW50YXRpb24uCmFic3RyYWN0IGNsYXNzIE5vU3VjaE1ldGhvZFJlc29sdmVyIHsKICAvLy8gQ29tcHV0ZXMgd2hldGhlciBbbWV0aG9kXSBpcyBvZiB0aGUgZm9ybQogIC8vLwogIC8vLyAgICAgbm9TdWNoTWV0aG9kKGkpID0+IHN1cGVyLm5vU3VjaE1ldGhvZChpKTsKICAvLy8KICBib29sIGhhc0ZvcndhcmRpbmdTeW50YXgoY292YXJpYW50IEZ1bmN0aW9uRW50aXR5IG1ldGhvZCk7CgogIC8vLyBDb21wdXRlcyB3aGV0aGVyIFttZXRob2RdIGlzIG9mIHRoZSBmb3JtCiAgLy8vCiAgLy8vICAgICBub1N1Y2hNZXRob2QoaSkgPT4gdGhyb3cgbmV3IEVycm9yKCk7CiAgLy8vCiAgYm9vbCBoYXNUaHJvd2luZ1N5bnRheChjb3ZhcmlhbnQgRnVuY3Rpb25FbnRpdHkgbWV0aG9kKTsKCiAgLy8vIFJldHVybnMgdGhlIGBub1N1Y2hNZXRob2RgIHRoYXQgW21ldGhvZF0gb3ZlcnJpZGVzLgogIEZ1bmN0aW9uRW50aXR5IGdldFN1cGVyTm9TdWNoTWV0aG9kKGNvdmFyaWFudCBGdW5jdGlvbkVudGl0eSBtZXRob2QpOwp9CoE7AE5OPAEZNjskIS4BTRUETEdOMQRQSzYEQjoEUAQzBEMEMzkEUFEPBFERBDIETUcnAVEoJiZBASoXATwkATwjAU4cAgFBRkYBRkcBRkgQTAFGRAE+TQFBL08BKCgBQgFEAQxADDwBDEIyBAEMGDIhBAE4NyEqIgYrIwYoIAYwKQY+JykGSCEiOSpOPEo5GiIlESMmESAjESlOJCUqEQgXNyIjDR8gBgQBDB0lOwQCASwETg4iPkMvATQnAUZEJioBRUcfTQFJNAIBOUodMwFGKwFGKAE1TgE1TwEzARhIAUcXKDYlNjA2MC4xLhUlOjo9BAEMKBUmIy4tLhMEAQxOMjorDywICAQBDDUgMEoICCcwSQgIKDBKCAgEAQwrNykEAgETCwwSCQIBSyYvBjQGPQEvBjAGOwE6SAIBPHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvbm9fc3VjaF9tZXRob2RfcmVnaXN0cnkuZGFydDtzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXMuZGFydMABsFUvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBqc19iYWNrZW5kLnJ1bnRpbWVfdHlwZXM7CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24vbmFtZXMuZGFydCcgc2hvdyBJZGVudGlmaWVyczsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCcKICAgIHNob3cKICAgICAgICBDb21tb25FbGVtZW50cywKICAgICAgICBFbGVtZW50RW52aXJvbm1lbnQsCiAgICAgICAgSkNvbW1vbkVsZW1lbnRzLAogICAgICAgIEpFbGVtZW50RW52aXJvbm1lbnQ7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvbmFtZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vaXIvcnVudGltZV90eXBlX2FuYWx5c2lzLmRhcnQnOwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIGFzIGpzQXN0OwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIHNob3cganM7CmltcG9ydCAnLi4vanNfZW1pdHRlci9qc19lbWl0dGVyLmRhcnQnIHNob3cgRW1pdHRlcjsKaW1wb3J0ICcuLi9vcHRpb25zLmRhcnQnOwppbXBvcnQgJy4uL3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jbGFzc19oaWVyYXJjaHkuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY29kZWdlbl93b3JsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2ZlYXR1cmUuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvcmVzb2x1dGlvbl93b3JsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3dvcmxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vd29ybGQuZGFydCcgc2hvdyBKQ2xvc2VkV29ybGQsIEtDbG9zZWRXb3JsZDsKaW1wb3J0ICdiYWNrZW5kX3VzYWdlLmRhcnQnOwppbXBvcnQgJ25hbWVyLmRhcnQnOwppbXBvcnQgJ25hdGl2ZV9kYXRhLmRhcnQnOwoKLy8vIEZvciBlYWNoIGNsYXNzLCBzdG9yZXMgdGhlIHBvc3NpYmxlIGNsYXNzIHN1YnR5cGUgdGVzdHMgdGhhdCBjb3VsZCBzdWNjZWVkLgphYnN0cmFjdCBjbGFzcyBUeXBlQ2hlY2tzIHsKICAvLy8gR2V0IHRoZSBzZXQgb2YgY2hlY2tzIHJlcXVpcmVkIGZvciBjbGFzcyBbZWxlbWVudF0uCiAgQ2xhc3NDaGVja3Mgb3BlcmF0b3IgW10oQ2xhc3NFbnRpdHkgZWxlbWVudCk7CgogIC8vLyBHZXQgdGhlIGl0ZXJhYmxlIGZvciBhbGwgY2xhc3NlcyB0aGF0IG5lZWQgdHlwZSBjaGVja3MuCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGdldCBjbGFzc2VzOwp9Cgp0eXBlZGVmIGpzQXN0LkV4cHJlc3Npb24gT25WYXJpYWJsZUNhbGxiYWNrKFR5cGVWYXJpYWJsZVR5cGUgdmFyaWFibGUpOwp0eXBlZGVmIGJvb2wgU2hvdWxkRW5jb2RlVHlwZWRlZkNhbGxiYWNrKFR5cGVkZWZUeXBlIHZhcmlhYmxlKTsKCi8vLyBJbnRlcmZhY2UgZm9yIHRoZSBjbGFzc2VzIGFuZCBtZXRob2RzIHRoYXQgbmVlZCBydW50aW1lIHR5cGVzLgphYnN0cmFjdCBjbGFzcyBSdW50aW1lVHlwZXNOZWVkIHsKICAvLy8gRGVzZXJpYWxpemVzIGEgW1J1bnRpbWVUeXBlc05lZWRdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgUnVudGltZVR5cGVzTmVlZC5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgIERhdGFTb3VyY2Ugc291cmNlLCBFbGVtZW50RW52aXJvbm1lbnQgZWxlbWVudEVudmlyb25tZW50KSB7CiAgICBib29sIGlzVHJpdmlhbCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgaWYgKGlzVHJpdmlhbCkgewogICAgICByZXR1cm4gY29uc3QgVHJpdmlhbFJ1bnRpbWVUeXBlc05lZWQoKTsKICAgIH0KICAgIHJldHVybiBuZXcgUnVudGltZVR5cGVzTmVlZEltcGwucmVhZEZyb21EYXRhU291cmNlKAogICAgICAgIHNvdXJjZSwgZWxlbWVudEVudmlyb25tZW50KTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW1J1bnRpbWVUeXBlc05lZWRdIHRvIFtzaW5rXS4KICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtjbHNdIG5lZWRzIHR5cGUgYXJndW1lbnRzIGF0IHJ1bnRpbWUgdHlwZS4KICAvLy8KICAvLy8gVGhpcyBpcyBmb3IgaW5zdGFuY2UgdGhlIGNhc2UgZm9yIGdlbmVyaWMgY2xhc3NlcyB1c2VkIGluIGEgdHlwZSB0ZXN0OgogIC8vLwogIC8vLyAgIGNsYXNzIEM8VD4ge30KICAvLy8gICBtYWluKCkgewogIC8vLyAgICAgbmV3IEM8aW50PigpIGlzIEM8aW50PjsKICAvLy8gICAgIG5ldyBDPFN0cmluZz4oKSBpcyBDPFN0cmluZz47CiAgLy8vICAgfQogIC8vLwogIGJvb2wgY2xhc3NOZWVkc1R5cGVBcmd1bWVudHMoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFttZXRob2RdIG5lZWRzIHR5cGUgYXJndW1lbnRzIGF0IHJ1bnRpbWUgdHlwZS4KICAvLy8KICAvLy8gVGhpcyBpcyBmb3IgaW5zdGFuY2UgdGhlIGNhc2UgZm9yIGdlbmVyaWMgbWV0aG9kcyB0aGF0IHVzZSB0eXBlIHRlc3RzOgogIC8vLwogIC8vLyAgIG1ldGhvZDxUPihUIHQpID0+IHQgaXMgVDsKICAvLy8gICBtYWluKCkgewogIC8vLyAgICAgbWV0aG9kPGludD4oMCk7CiAgLy8vICAgICBtZXRob2Q8U3RyaW5nPignJyk7CiAgLy8vICAgfQogIC8vLwogIGJvb2wgbWV0aG9kTmVlZHNUeXBlQXJndW1lbnRzKEZ1bmN0aW9uRW50aXR5IG1ldGhvZCk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBhIHNpZ25hdHVyZSBpcyBuZWVkZWQgZm9yIFttZXRob2RdLgogIC8vLwogIC8vLyBBIHNpZ25hdHVyZSBpcyBhIHJ1bnRpbWUgbWV0aG9kIHR5cGUgZGVzY3JpcHRvciBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMKICAvLy8gYSBydW50aW1lIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0eXBlIG9mIHRoZSBtZXRob2QuCiAgLy8vCiAgLy8vIFRoaXMgaXMgZm9yIGluc3RhbmNlIG5lZWRlZCBmb3IgaW5zdGFuY2UgbWV0aG9kcyBvZiBnZW5lcmljIGNsYXNzZXMgdGhhdAogIC8vLyBhcmUgdG9ybiBvZmYgYW5kIHdob3NlIHR5cGUgdGhlcmVmb3JlIHBvdGVudGlhbGx5IGlzIHVzZWQgaW4gYSB0eXBlIHRlc3Q6CiAgLy8vCiAgLy8vICAgICBjbGFzcyBDPFQ+IHsKICAvLy8gICAgICAgbWV0aG9kKFQgdCkge30KICAvLy8gICAgIH0KICAvLy8gICAgIG1haW4oKSB7CiAgLy8vICAgICAgIG5ldyBDPGludD4oKS5tZXRob2QgaXMgdm9pZCBGdW5jdGlvbihpbnQpOwogIC8vLyAgICAgICBuZXcgQzxTdHJpbmc+KCkubWV0aG9kIGlzIHZvaWQgRnVuY3Rpb24oU3RyaW5nKTsKICAvLy8gICAgIH0KICAvLy8KICAvLy8gU2luY2UgdHlwZSBvZiB0aGUgbWV0aG9kIGRlcGVuZHMgb24gdGhlIHR5cGUgYXJndW1lbnQgb2YgaXRzIGVuY2xvc2luZwogIC8vLyBjbGFzcywgdGhlIHR5cGUgb2YgdGhlIG1ldGhvZCBpcyBhIEphdmFTY3JpcHQgZnVuY3Rpb24gbGlrZToKICAvLy8KICAvLy8gICAgc2lnbmF0dXJlOiBmdW5jdGlvbiAoVCkgewogIC8vLyAgICAgIHJldHVybiB7J2Z1bmMnOiB0cnVlLCBwYXJhbXM6IFtUXX07CiAgLy8vICAgIH0KICAvLy8KICBib29sIG1ldGhvZE5lZWRzU2lnbmF0dXJlKEZ1bmN0aW9uRW50aXR5IG1ldGhvZCk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBhIGR5bmFtaWMgY2FsbCBvZiBbc2VsZWN0b3JdIG5lZWRzIHRvIHBhc3MgdHlwZQogIC8vLyBhcmd1bWVudHMuCiAgYm9vbCBzZWxlY3Rvck5lZWRzVHlwZUFyZ3VtZW50cyhTZWxlY3RvciBzZWxlY3Rvcik7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBhIGdlbmVyaWMgaW5zdGFudGlhdGlvbiBvbiBhbiBleHByZXNzaW9uIG9mIHR5cGUKICAvLy8gW2Z1bmN0aW9uVHlwZV0gd2l0aCB0aGUgZ2l2ZW4gW3R5cGVBcmd1bWVudENvdW50XSBuZWVkcyB0byBwYXNzIHR5cGUKICAvLy8gYXJndW1lbnRzLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSBbZnVuY3Rpb25UeXBlXS4KICBib29sIGluc3RhbnRpYXRpb25OZWVkc1R5cGVBcmd1bWVudHMoCiAgICAgIERhcnRUeXBlIGZ1bmN0aW9uVHlwZSwgaW50IHR5cGVBcmd1bWVudENvdW50KTsKfQoKY2xhc3MgVHJpdmlhbFJ1bnRpbWVUeXBlc05lZWQgaW1wbGVtZW50cyBSdW50aW1lVHlwZXNOZWVkIHsKICBjb25zdCBUcml2aWFsUnVudGltZVR5cGVzTmVlZCgpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlQm9vbCh0cnVlKTsgLy8gSXMgdHJpdmlhbC4KICB9CgogIEBvdmVycmlkZQogIGJvb2wgY2xhc3NOZWVkc1R5cGVBcmd1bWVudHMoQ2xhc3NFbnRpdHkgY2xzKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIG1ldGhvZE5lZWRzU2lnbmF0dXJlKEZ1bmN0aW9uRW50aXR5IG1ldGhvZCkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBtZXRob2ROZWVkc1R5cGVBcmd1bWVudHMoRnVuY3Rpb25FbnRpdHkgbWV0aG9kKSA9PgogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBbGlnbiBoYW5kbGluZyBvZiB0eXBlIGFyZ3VtZW50cyBwYXNzZWQgdG8gZmFjdG9yeQogICAgICAvLyBjb25zdHJ1Y3RvcnMgd2l0aCB0eXBlIGFyZ3VtZW50cyBwYXNzZWQgdGhlIHJlZ3VsYXIgZ2VuZXJpYyBtZXRob2RzLgogICAgICAhKG1ldGhvZCBpcyBDb25zdHJ1Y3RvckVudGl0eSAmJiBtZXRob2QuaXNGYWN0b3J5Q29uc3RydWN0b3IpOwoKICBAb3ZlcnJpZGUKICBib29sIHNlbGVjdG9yTmVlZHNUeXBlQXJndW1lbnRzKFNlbGVjdG9yIHNlbGVjdG9yKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGluc3RhbnRpYXRpb25OZWVkc1R5cGVBcmd1bWVudHMoCiAgICAgIERhcnRUeXBlIGZ1bmN0aW9uVHlwZSwgaW50IHR5cGVBcmd1bWVudENvdW50KSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn0KCi8vLyBJbnRlcmZhY2UgZm9yIGNvbXB1dGluZyBjbGFzc2VzIGFuZCBtZXRob2RzIHRoYXQgbmVlZCBydW50aW1lIHR5cGVzLgphYnN0cmFjdCBjbGFzcyBSdW50aW1lVHlwZXNOZWVkQnVpbGRlciB7CiAgLy8vIFJlZ2lzdGVycyB0aGF0IFtjbHNdIHVzZXMgb25lIG9mIGl0cyB0eXBlIHZhcmlhYmxlcyBhcyBhIGxpdGVyYWwuCiAgdm9pZCByZWdpc3RlckNsYXNzVXNpbmdUeXBlVmFyaWFibGVMaXRlcmFsKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZWdpc3RlcnMgdGhhdCBbbWV0aG9kXSB1c2VzIG9uZSBvZiBpdHMgdHlwZSB2YXJpYWJsZXMgYXMgYSBsaXRlcmFsLgogIHZvaWQgcmVnaXN0ZXJNZXRob2RVc2luZ1R5cGVWYXJpYWJsZUxpdGVyYWwoRnVuY3Rpb25FbnRpdHkgbWV0aG9kKTsKCiAgLy8vIFJlZ2lzdGVycyB0aGF0IFtsb2NhbEZ1bmN0aW9uXSB1c2VzIG9uZSBvZiBpdHMgdHlwZSB2YXJpYWJsZXMgYXMgYQogIC8vLyBsaXRlcmFsLgogIHZvaWQgcmVnaXN0ZXJMb2NhbEZ1bmN0aW9uVXNpbmdUeXBlVmFyaWFibGVMaXRlcmFsKExvY2FsIGxvY2FsRnVuY3Rpb24pOwoKICAvLy8gUmVnaXN0ZXJzIHRoYXQgYSBnZW5lcmljIFtpbnN0YW50aWF0aW9uXSBpcyB1c2VkLgogIHZvaWQgcmVnaXN0ZXJHZW5lcmljSW5zdGFudGlhdGlvbihHZW5lcmljSW5zdGFudGlhdGlvbiBpbnN0YW50aWF0aW9uKTsKCiAgLy8vIENvbXB1dGVzIHRoZSBbUnVudGltZVR5cGVzTmVlZF0gZm9yIHRoZSBkYXRhIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGJ1aWxkZXIuCiAgUnVudGltZVR5cGVzTmVlZCBjb21wdXRlUnVudGltZVR5cGVzTmVlZCgKICAgICAgUmVzb2x1dGlvbldvcmxkQnVpbGRlciByZXNvbHV0aW9uV29ybGRCdWlsZGVyLAogICAgICBLQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsCiAgICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zKTsKfQoKY2xhc3MgVHJpdmlhbFJ1bnRpbWVUeXBlc05lZWRCdWlsZGVyIGltcGxlbWVudHMgUnVudGltZVR5cGVzTmVlZEJ1aWxkZXIgewogIGNvbnN0IFRyaXZpYWxSdW50aW1lVHlwZXNOZWVkQnVpbGRlcigpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyQ2xhc3NVc2luZ1R5cGVWYXJpYWJsZUxpdGVyYWwoQ2xhc3NFbnRpdHkgY2xzKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyTWV0aG9kVXNpbmdUeXBlVmFyaWFibGVMaXRlcmFsKEZ1bmN0aW9uRW50aXR5IG1ldGhvZCkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckxvY2FsRnVuY3Rpb25Vc2luZ1R5cGVWYXJpYWJsZUxpdGVyYWwoTG9jYWwgbG9jYWxGdW5jdGlvbikge30KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckdlbmVyaWNJbnN0YW50aWF0aW9uKEdlbmVyaWNJbnN0YW50aWF0aW9uIGluc3RhbnRpYXRpb24pIHt9CgogIEBvdmVycmlkZQogIFJ1bnRpbWVUeXBlc05lZWQgY29tcHV0ZVJ1bnRpbWVUeXBlc05lZWQoCiAgICAgIFJlc29sdXRpb25Xb3JsZEJ1aWxkZXIgcmVzb2x1dGlvbldvcmxkQnVpbGRlciwKICAgICAgS0Nsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucykgewogICAgcmV0dXJuIGNvbnN0IFRyaXZpYWxSdW50aW1lVHlwZXNOZWVkKCk7CiAgfQp9CgovLy8gSW50ZXJmYWNlIGZvciB0aGUgbmVlZGVkIHJ1bnRpbWUgdHlwZSBjaGVja3MuCmFic3RyYWN0IGNsYXNzIFJ1bnRpbWVUeXBlc0NoZWNrcyB7CiAgLy8vIFJldHVybnMgdGhlIHJlcXVpcmVkIHJ1bnRpbWUgdHlwZSBjaGVja3MuCiAgVHlwZUNoZWNrcyBnZXQgcmVxdWlyZWRDaGVja3M7CgogIC8vLyBSZXR1cm4gYWxsIGNsYXNzZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBpbiB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24sIGkuZS4sCiAgLy8vIGluIHRoZSByZXR1cm4gdHlwZSBvciB0aGUgYXJndW1lbnQgdHlwZXMuCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGdldFJlZmVyZW5jZWRDbGFzc2VzKEZ1bmN0aW9uVHlwZSB0eXBlKTsKCiAgLy8vIFJldHVybiBhbGwgY2xhc3NlcyBuZWVkZWQgZm9yIHJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbi4KICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0IHJlcXVpcmVkQ2xhc3NlczsKfQoKY2xhc3MgVHJpdmlhbFR5cGVzQ2hlY2tzIGltcGxlbWVudHMgUnVudGltZVR5cGVzQ2hlY2tzIHsKICBmaW5hbCBUeXBlQ2hlY2tzIF90eXBlQ2hlY2tzOwogIGZpbmFsIFNldDxDbGFzc0VudGl0eT4gX2FsbENsYXNzZXM7CgogIFRyaXZpYWxUeXBlc0NoZWNrcyh0aGlzLl90eXBlQ2hlY2tzKQogICAgICA6IF9hbGxDbGFzc2VzID0gX3R5cGVDaGVja3MuY2xhc3Nlcy50b1NldCgpOwoKICBAb3ZlcnJpZGUKICBUeXBlQ2hlY2tzIGdldCByZXF1aXJlZENoZWNrcyA9PiBfdHlwZUNoZWNrczsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGdldCByZXF1aXJlZENsYXNzZXMgPT4gX2FsbENsYXNzZXM7CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBnZXRSZWZlcmVuY2VkQ2xhc3NlcyhGdW5jdGlvblR5cGUgdHlwZSkgPT4gX2FsbENsYXNzZXM7Cn0KCi8vLyBJbnRlcmZhY2UgZm9yIGNvbXB1dGluZyB0aGUgbmVlZGVkIHJ1bnRpbWUgdHlwZSBjaGVja3MuCmFic3RyYWN0IGNsYXNzIFJ1bnRpbWVUeXBlc0NoZWNrc0J1aWxkZXIgewogIHZvaWQgcmVnaXN0ZXJUeXBlVmFyaWFibGVCb3VuZHNTdWJ0eXBlQ2hlY2soCiAgICAgIERhcnRUeXBlIHR5cGVBcmd1bWVudCwgRGFydFR5cGUgYm91bmQpOwoKICAvLy8gUmVnaXN0ZXJzIHRoYXQgYSBnZW5lcmljIFtpbnN0YW50aWF0aW9uXSBpcyB1c2VkLgogIHZvaWQgcmVnaXN0ZXJHZW5lcmljSW5zdGFudGlhdGlvbihHZW5lcmljSW5zdGFudGlhdGlvbiBpbnN0YW50aWF0aW9uKTsKCiAgLy8vIENvbXB1dGVzIHRoZSBbUnVudGltZVR5cGVzQ2hlY2tzXSBmb3IgdGhlIGRhdGEgaW4gdGhpcyBidWlsZGVyLgogIFJ1bnRpbWVUeXBlc0NoZWNrcyBjb21wdXRlUmVxdWlyZWRDaGVja3MoCiAgICAgIENvZGVnZW5Xb3JsZEJ1aWxkZXIgY29kZWdlbldvcmxkQnVpbGRlciwgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMpOwoKICBib29sIGdldCBydGlDaGVja3NCdWlsZGVyQ2xvc2VkOwp9CgpjbGFzcyBUcml2aWFsUnVudGltZVR5cGVzQ2hlY2tzQnVpbGRlciBpbXBsZW1lbnRzIFJ1bnRpbWVUeXBlc0NoZWNrc0J1aWxkZXIgewogIGZpbmFsIEpDbG9zZWRXb3JsZCBfY2xvc2VkV29ybGQ7CiAgZmluYWwgVHJpdmlhbFJ1bnRpbWVUeXBlc1N1YnN0aXR1dGlvbnMgX3N1YnN0aXR1dGlvbnM7CiAgQG92ZXJyaWRlCiAgYm9vbCBydGlDaGVja3NCdWlsZGVyQ2xvc2VkID0gZmFsc2U7CgogIFRyaXZpYWxSdW50aW1lVHlwZXNDaGVja3NCdWlsZGVyKHRoaXMuX2Nsb3NlZFdvcmxkLCB0aGlzLl9zdWJzdGl0dXRpb25zKTsKCiAgRWxlbWVudEVudmlyb25tZW50IGdldCBfZWxlbWVudEVudmlyb25tZW50ID0+IF9jbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQ7CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJUeXBlVmFyaWFibGVCb3VuZHNTdWJ0eXBlQ2hlY2soCiAgICAgIERhcnRUeXBlIHR5cGVBcmd1bWVudCwgRGFydFR5cGUgYm91bmQpIHt9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJHZW5lcmljSW5zdGFudGlhdGlvbihHZW5lcmljSW5zdGFudGlhdGlvbiBpbnN0YW50aWF0aW9uKSB7fQoKICBAb3ZlcnJpZGUKICBSdW50aW1lVHlwZXNDaGVja3MgY29tcHV0ZVJlcXVpcmVkQ2hlY2tzKAogICAgICBDb2RlZ2VuV29ybGRCdWlsZGVyIGNvZGVnZW5Xb3JsZEJ1aWxkZXIsIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zKSB7CiAgICBydGlDaGVja3NCdWlsZGVyQ2xvc2VkID0gdHJ1ZTsKCiAgICBNYXA8Q2xhc3NFbnRpdHksIENsYXNzVXNlPiBjbGFzc1VzZU1hcCA9IDxDbGFzc0VudGl0eSwgQ2xhc3NVc2U+e307CiAgICBmb3IgKENsYXNzRW50aXR5IGNscyBpbiBfY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkKICAgICAgICAuZ2V0Q2xhc3NTZXQoX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKQogICAgICAgIC5zdWJ0eXBlcygpKSB7CiAgICAgIENsYXNzVXNlIGNsYXNzVXNlID0gbmV3IENsYXNzVXNlKCkKICAgICAgICAuLmRpcmVjdEluc3RhbmNlID0gdHJ1ZQogICAgICAgIC4uY2hlY2tlZEluc3RhbmNlID0gdHJ1ZQogICAgICAgIC4udHlwZUFyZ3VtZW50ID0gdHJ1ZQogICAgICAgIC4uY2hlY2tlZFR5cGVBcmd1bWVudCA9IHRydWUKICAgICAgICAuLnR5cGVMaXRlcmFsID0gdHJ1ZQogICAgICAgIC4uZnVuY3Rpb25UeXBlID0gX2NvbXB1dGVGdW5jdGlvblR5cGUoX2VsZW1lbnRFbnZpcm9ubWVudCwgY2xzKTsKICAgICAgY2xhc3NVc2VNYXBbY2xzXSA9IGNsYXNzVXNlOwogICAgfQogICAgVHlwZUNoZWNrcyB0eXBlQ2hlY2tzID0gX3N1YnN0aXR1dGlvbnMuX3JlcXVpcmVkQ2hlY2tzID0KICAgICAgICBfc3Vic3RpdHV0aW9ucy5fY29tcHV0ZUNoZWNrcyhjbGFzc1VzZU1hcCk7CiAgICByZXR1cm4gbmV3IFRyaXZpYWxUeXBlc0NoZWNrcyh0eXBlQ2hlY2tzKTsKICB9CgogIFNldDxDbGFzc0VudGl0eT4gY29tcHV0ZUNoZWNrZWRDbGFzc2VzKAogICAgICBDb2RlZ2VuV29ybGRCdWlsZGVyIGNvZGVnZW5Xb3JsZEJ1aWxkZXIsIFNldDxEYXJ0VHlwZT4gaW1wbGljaXRJc0NoZWNrcykgewogICAgcmV0dXJuIF9jbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeQogICAgICAgIC5nZXRDbGFzc1NldChfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MpCiAgICAgICAgLnN1YnR5cGVzKCkKICAgICAgICAudG9TZXQoKTsKICB9CgogIFNldDxGdW5jdGlvblR5cGU+IGNvbXB1dGVDaGVja2VkRnVuY3Rpb25zKAogICAgICBDb2RlZ2VuV29ybGRCdWlsZGVyIGNvZGVnZW5Xb3JsZEJ1aWxkZXIsIFNldDxEYXJ0VHlwZT4gaW1wbGljaXRJc0NoZWNrcykgewogICAgcmV0dXJuIG5ldyBTZXQ8RnVuY3Rpb25UeXBlPigpOwogIH0KfQoKY2xhc3MgQ2xhc3NDb2xsZWN0b3IgZXh0ZW5kcyBBcmd1bWVudENvbGxlY3RvciB7CiAgZmluYWwgRWxlbWVudEVudmlyb25tZW50IF9lbGVtZW50RW52aXJvbm1lbnQ7CgogIENsYXNzQ29sbGVjdG9yKHRoaXMuX2VsZW1lbnRFbnZpcm9ubWVudCk7CgogIEBvdmVycmlkZQogIHZvaWQgYWRkQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICBpZiAoY2xhc3Nlcy5hZGQoY2xzKSkgewogICAgICBfZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hTdXBlcnR5cGUoY2xzLCAoSW50ZXJmYWNlVHlwZSB0eXBlKSB7CiAgICAgICAgY29sbGVjdCh0eXBlLCBpc1R5cGVBcmd1bWVudDogdHJ1ZSk7CiAgICAgIH0pOwogICAgfQogIH0KfQoKYWJzdHJhY3QgY2xhc3MgUnVudGltZVR5cGVzU3Vic3RpdHV0aW9uc01peGluCiAgICBpbXBsZW1lbnRzIFJ1bnRpbWVUeXBlc1N1YnN0aXR1dGlvbnMgewogIEpDbG9zZWRXb3JsZCBnZXQgX2Nsb3NlZFdvcmxkOwogIFR5cGVDaGVja3MgZ2V0IF9yZXF1aXJlZENoZWNrczsKCiAgSkVsZW1lbnRFbnZpcm9ubWVudCBnZXQgX2VsZW1lbnRFbnZpcm9ubWVudCA9PgogICAgICBfY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50OwogIERhcnRUeXBlcyBnZXQgX3R5cGVzID0+IF9jbG9zZWRXb3JsZC5kYXJ0VHlwZXM7CiAgUnVudGltZVR5cGVzTmVlZCBnZXQgX3J0aU5lZWQgPT4gX2Nsb3NlZFdvcmxkLnJ0aU5lZWQ7CgogIC8vLyBDb21wdXRlIHRoZSByZXF1aXJlZCB0eXBlIGNoZWNrcyBhbmQgc3Vic3RpdHV0aW9ucyBmb3IgdGhlIGdpdmVuCiAgLy8vIGluc3RhbnRpYXRlZCBhbmQgY2hlY2tlZCBjbGFzc2VzLgogIFR5cGVDaGVja3MgX2NvbXB1dGVDaGVja3MoTWFwPENsYXNzRW50aXR5LCBDbGFzc1VzZT4gY2xhc3NVc2VNYXApIHsKICAgIC8vIFJ1biB0aHJvdWdoIHRoZSBjb21iaW5hdGlvbiBvZiBpbnN0YW50aWF0ZWQgYW5kIGNoZWNrZWQKICAgIC8vIGFyZ3VtZW50cyBhbmQgcmVjb3JkIGFsbCBjb21iaW5hdGlvbiB3aGVyZSB0aGUgZWxlbWVudCBvZiBhIGNoZWNrZWQKICAgIC8vIGFyZ3VtZW50IGlzIGEgc3VwZXJjbGFzcyBvZiB0aGUgZWxlbWVudCBvZiBhbiBpbnN0YW50aWF0ZWQgdHlwZS4KICAgIFR5cGVDaGVja01hcHBpbmcgcmVzdWx0ID0gbmV3IFR5cGVDaGVja01hcHBpbmcoKTsKICAgIFNldDxDbGFzc0VudGl0eT4gaGFuZGxlZCA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CgogICAgLy8gRW1wdHkgdXNhZ2Ugb2JqZWN0IGZvciBjbGFzc2VzIHdpdGggbm8gZGlyZWN0IHJ0aSB1c2FnZS4KICAgIGZpbmFsIENsYXNzVXNlIGVtcHR5VXNlID0gbmV3IENsYXNzVXNlKCk7CgogICAgLy8vIENvbXB1dGUgdGhlICRpc1ggYW5kICRhc1ggZnVuY3Rpb25zIG5lZWQgZm9yIFtjbHNdLgogICAgQ2xhc3NDaGVja3MgY29tcHV0ZUNoZWNrcyhDbGFzc0VudGl0eSBjbHMpIHsKICAgICAgaWYgKCFoYW5kbGVkLmFkZChjbHMpKSByZXR1cm4gcmVzdWx0W2Nsc107CgogICAgICBDbGFzc1VzZSBjbGFzc1VzZSA9IGNsYXNzVXNlTWFwW2Nsc10gPz8gZW1wdHlVc2U7CiAgICAgIENsYXNzQ2hlY2tzIGNoZWNrcyA9IG5ldyBDbGFzc0NoZWNrcyhjbGFzc1VzZS5mdW5jdGlvblR5cGUpOwogICAgICByZXN1bHRbY2xzXSA9IGNoZWNrczsKCiAgICAgIC8vIEZpbmQgdGhlIHN1cGVyY2xhc3MgZnJvbSB3aGljaCBbY2xzXSBpbmhlcml0cyBjaGVja3MuCiAgICAgIENsYXNzRW50aXR5IHN1cGVyQ2xhc3MgPSBfZWxlbWVudEVudmlyb25tZW50LmdldFN1cGVyQ2xhc3MoY2xzLAogICAgICAgICAgc2tpcFVubmFtZWRNaXhpbkFwcGxpY2F0aW9uczogdHJ1ZSk7CiAgICAgIENsYXNzQ2hlY2tzIHN1cGVyQ2hlY2tzOwogICAgICBib29sIGV4dGVuZHNTdXBlckNsYXNzVHJpdmlhbGx5ID0gZmFsc2U7CiAgICAgIGlmIChzdXBlckNsYXNzICE9IG51bGwpIHsKICAgICAgICAvLyBDb21wdXRlIHRoZSBjaGVja3MgaW5oZXJpdGVkIGZyb20gW3N1cGVyQ2xhc3NdLgogICAgICAgIHN1cGVyQ2hlY2tzID0gY29tcHV0ZUNoZWNrcyhzdXBlckNsYXNzKTsKCiAgICAgICAgLy8gRG9lcyBbY2xzXSBleHRlbmQgW3N1cGVyQ2xhc3NdIHRyaXZpYWxseT8KICAgICAgICAvLwogICAgICAgIC8vIEZvciBpbnN0YW5jZToKICAgICAgICAvLwogICAgICAgIC8vICAgICBjbGFzcyBBPFQ+IHt9CiAgICAgICAgLy8gICAgIGNsYXNzIEI8Uz4gZXh0ZW5kcyBBPFM+IHt9CiAgICAgICAgLy8gICAgIGNsYXNzIEM8VSwgVj4gZXh0ZW5kcyBBPFU+IHt9CiAgICAgICAgLy8gICAgIGNsYXNzIEQgZXh0ZW5kcyBBPGludD4ge30KICAgICAgICAvLwogICAgICAgIC8vIGhlcmUgYEJgIGV4dGVuZHMgYEFgIHRyaXZpYWxseSwgYnV0IGBDYCBhbmQgYERgIGRvbid0LgogICAgICAgIGV4dGVuZHNTdXBlckNsYXNzVHJpdmlhbGx5ID0gaXNUcml2aWFsU3Vic3RpdHV0aW9uKGNscywgc3VwZXJDbGFzcyk7CiAgICAgIH0KCiAgICAgIGJvb2wgaXNOYXRpdmVDbGFzcyA9IF9jbG9zZWRXb3JsZC5uYXRpdmVEYXRhLmlzTmF0aXZlQ2xhc3MoY2xzKTsKICAgICAgaWYgKGNsYXNzVXNlLnR5cGVBcmd1bWVudCB8fAogICAgICAgICAgY2xhc3NVc2UudHlwZUxpdGVyYWwgfHwKICAgICAgICAgIChpc05hdGl2ZUNsYXNzICYmIGNsYXNzVXNlLmNoZWNrZWRJbnN0YW5jZSkpIHsKICAgICAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uID0gY29tcHV0ZVN1YnN0aXR1dGlvbihjbHMsIGNscyk7CiAgICAgICAgLy8gV2UgbmVlZCBbY2xzXSBhdCBydW50aW1lIC0gZXZlbiBpZiBbY2xzXSBpcyBub3QgaW5zdGFudGlhdGVkLiBFaXRoZXIKICAgICAgICAvLyBhcyBhIHR5cGUgYXJndW1lbnQsIGZvciBhIHR5cGUgbGl0ZXJhbCBvciBmb3IgYW4gaXMtdGVzdCBpZiBbY2xzXSBpcwogICAgICAgIC8vIG5hdGl2ZS4KICAgICAgICBjaGVja3MuYWRkKG5ldyBUeXBlQ2hlY2soY2xzLCBzdWJzdGl0dXRpb24sIG5lZWRzSXM6IGlzTmF0aXZlQ2xhc3MpKTsKICAgICAgfQoKICAgICAgLy8gQ29tcHV0ZSB0aGUgc2V0IG9mIGNsYXNzZXMgdGhhdCBbY2xzXSBpbmhlcml0ZWQgcHJvcGVydGllcyBmcm9tLgogICAgICAvLwogICAgICAvLyBUaGlzIHNldCByZWZsZWN0cyB0aGUgZW1pdHRlZCBjbGFzcyBoaWVyYXJjaHkgYW5kIHRoZXJlZm9yZSB1c2VzCiAgICAgIC8vIGBnZXRFZmZlY3RpdmVNaXhpbkNsYXNzYCB0byBmaW5kIHRoZSBpbmhlcml0ZWQgbWl4aW5zLgogICAgICBTZXQ8Q2xhc3NFbnRpdHk+IGluaGVyaXRlZENsYXNzZXMgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwogICAgICBDbGFzc0VudGl0eSBvdGhlciA9IGNsczsKICAgICAgd2hpbGUgKG90aGVyICE9IG51bGwpIHsKICAgICAgICBpbmhlcml0ZWRDbGFzc2VzLmFkZChvdGhlcik7CiAgICAgICAgaWYgKGNsYXNzVXNlLmluc3RhbmNlICYmCiAgICAgICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuaXNNaXhpbkFwcGxpY2F0aW9uKG90aGVyKSkgewogICAgICAgICAgLy8gV2UgZG9uJ3QgbWl4aW4gW290aGVyXSBpZiBbY2xzXSBpc24ndCBpbnN0YW50aWF0ZWQsIGRpcmVjdGx5IG9yCiAgICAgICAgICAvLyBpbmRpcmVjdGx5LgogICAgICAgICAgaW5oZXJpdGVkQ2xhc3NlcwogICAgICAgICAgICAgIC5hZGQoX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRFZmZlY3RpdmVNaXhpbkNsYXNzKG90aGVyKSk7CiAgICAgICAgfQogICAgICAgIG90aGVyID0gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRTdXBlckNsYXNzKG90aGVyKTsKICAgICAgfQoKICAgICAgLy8vIENvbXB1dGUgdGhlIG5lZWRlZCBjaGVjayBmb3IgW2Nsc10gYWdhaW5zdCB0aGUgY2xhc3Mgb2YgdGhlIHN1cGVyCiAgICAgIC8vLyBbdHlwZV0uCiAgICAgIHZvaWQgcHJvY2Vzc1N1cGVydHlwZShJbnRlcmZhY2VUeXBlIHR5cGUpIHsKICAgICAgICBDbGFzc0VudGl0eSBjaGVja2VkQ2xhc3MgPSB0eXBlLmVsZW1lbnQ7CiAgICAgICAgQ2xhc3NVc2UgY2hlY2tlZENsYXNzVXNlID0gY2xhc3NVc2VNYXBbY2hlY2tlZENsYXNzXSA/PyBlbXB0eVVzZTsKCiAgICAgICAgLy8gV2hlcmUgW2Nsc10gaW5oZXJpdHMgcHJvcGVydGllcyBmb3IgW2NoZWNrZWRDbGFzc10uCiAgICAgICAgYm9vbCBpbmhlcml0c0Zyb21DaGVja2VkQ2xhc3MgPSBpbmhlcml0ZWRDbGFzc2VzLmNvbnRhaW5zKGNoZWNrZWRDbGFzcyk7CgogICAgICAgIC8vIElmIFtjbHNdIGluaGVyaXRzIHByb3BlcnRpZXMgZnJvbSBbY2hlY2tlZENsYXNzXSBhbmQgW2NoZWNrZWRDbGFzc10KICAgICAgICAvLyBuZWVkcyB0eXBlIGFyZ3VtZW50cywgW2Nsc10gbXVzdCBwcm92aWRlIGEgc3Vic3RpdHV0aW9uIGZvcgogICAgICAgIC8vIFtjaGVja2VkQ2xhc3NdLgogICAgICAgIC8vCiAgICAgICAgLy8gRm9yIGluc3RhbmNlOgogICAgICAgIC8vCiAgICAgICAgLy8gICAgIGNsYXNzIE08VD4gewogICAgICAgIC8vICAgICAgICBtKCkgPT4gVDsKICAgICAgICAvLyAgICAgfQogICAgICAgIC8vICAgICBjbGFzcyBTIHt9CiAgICAgICAgLy8gICAgIGNsYXNzIEMgZXh0ZW5kcyBTIHdpdGggTTxpbnQ+IHt9CiAgICAgICAgLy8KICAgICAgICAvLyBIZXJlIGBDYCBuZWVkcyBhbiBgJGFzTWAgc3Vic3RpdHV0aW9uIGZ1bmN0aW9uIHRvIHByb3ZpZGUgdGhlIHZhbHVlCiAgICAgICAgLy8gb2YgYFRgIGluIGBNLm1gLgogICAgICAgIGJvb2wgbmVlZHNUeXBlQXJndW1lbnRzRm9yQ2hlY2tlZENsYXNzID0gaW5oZXJpdHNGcm9tQ2hlY2tlZENsYXNzICYmCiAgICAgICAgICAgIF9ydGlOZWVkLmNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKGNoZWNrZWRDbGFzcyk7CgogICAgICAgIC8vIFdoZXRoZXIgW2NoZWNrZWRDbGFzc10gaXMgdXNlZCBpbiBhbiBpbnN0YW5jZSB0ZXN0IG9yIHR5cGUgYXJndW1lbnQKICAgICAgICAvLyB0ZXN0LgogICAgICAgIC8vCiAgICAgICAgLy8gRm9yIGluc3RhbmNlOgogICAgICAgIC8vCiAgICAgICAgLy8gICAgY2xhc3MgQSB7fQogICAgICAgIC8vICAgIGNsYXNzIEIge30KICAgICAgICAvLyAgICB0ZXN0KG8pID0+IG8gaXMgQSB8fCBvIGlzIExpc3Q8Qj47CiAgICAgICAgLy8KICAgICAgICAvLyBIZXJlIGBBYCBpcyB1c2VkIGluIGFuIGluc3RhbmNlIHRlc3QgYW5kIGBCYCBpcyB1c2VkIGluIGEgdHlwZQogICAgICAgIC8vIGFyZ3VtZW50IHRlc3QuCiAgICAgICAgYm9vbCBpc0NoZWNrZWQgPSBjaGVja2VkQ2xhc3NVc2UuY2hlY2tlZFR5cGVBcmd1bWVudCB8fAogICAgICAgICAgICBjaGVja2VkQ2xhc3NVc2UuY2hlY2tlZEluc3RhbmNlOwoKICAgICAgICBpZiAoaXNDaGVja2VkIHx8IG5lZWRzVHlwZUFyZ3VtZW50c0ZvckNoZWNrZWRDbGFzcykgewogICAgICAgICAgLy8gV2UgbmVlZCBhbiAkaXNYIGFuZC9vciAkYXNYIHByb3BlcnR5IG9uIFtjbHNdIGZvciBbY2hlY2tlZENsYXNzXS4KCiAgICAgICAgICAvLyBXaGV0aGVyIGBjbHNgIGltcGxlbWVudHMgYGNoZWNrZWRDbGFzc2AgdHJpdmlhbGx5LgogICAgICAgICAgLy8KICAgICAgICAgIC8vIEZvciBpbnN0YW5jZToKICAgICAgICAgIC8vCiAgICAgICAgICAvLyAgICAgY2xhc3MgQTxUPiB7fQogICAgICAgICAgLy8gICAgIGNsYXNzIEI8Uz4gaW1wbGVtZW50cyBBPFM+IHt9CiAgICAgICAgICAvLyAgICAgY2xhc3MgQzxVLCBWPiBpbXBsZW1lbnRzIEE8VT4ge30KICAgICAgICAgIC8vICAgICBjbGFzcyBEIGltcGxlbWVudHMgQTxpbnQ+IHt9CiAgICAgICAgICAvLwogICAgICAgICAgLy8gaGVyZSBgQmAgaW1wbGVtZW50cyBgQWAgdHJpdmlhbGx5LCBidXQgYENgIGFuZCBgRGAgZG9uJ3QuCiAgICAgICAgICBib29sIGltcGxlbWVudHNDaGVja2VkVHJpdmlhbGx5ID0KICAgICAgICAgICAgICBpc1RyaXZpYWxTdWJzdGl0dXRpb24oY2xzLCBjaGVja2VkQ2xhc3MpOwoKICAgICAgICAgIC8vIFdoZXRoZXIgW2NoZWNrZWRDbGFzc10gaXMgZ2VuZXJpYy4KICAgICAgICAgIC8vCiAgICAgICAgICAvLyBDdXJyZW50bHkgW2lzVHJpdmlhbFN1YnN0aXR1dGlvbl0gcmVwb3J0cyB0aGF0IFtjbHNdIGltcGxlbWVudHMKICAgICAgICAgIC8vIFtjaGVja2VkQ2xhc3NdIHRyaXZpYWxseSBpZiBbY2hlY2tlZENsYXNzXSBpcyBub3QgZ2VuZXJpYy4gSW4gdGhpcwogICAgICAgICAgLy8gY2FzZSB0aGUgc3Vic3RpdHV0aW9uIGlzIG5vdCBvbmx5IHRyaXZpYWwgaXQgaXMgYWxzbyBub3QgbmVlZGVkLgogICAgICAgICAgYm9vbCBpc0NoZWNrZWRHZW5lcmljID0KICAgICAgICAgICAgICBfZWxlbWVudEVudmlyb25tZW50LmlzR2VuZXJpY0NsYXNzKGNoZWNrZWRDbGFzcyk7CgogICAgICAgICAgLy8gVGhlIGNoZWNrcyBmb3IgW2NoZWNrZWRDbGFzc10gaW5oZXJpdGVkIGZvciBbc3VwZXJDbGFzc10uCiAgICAgICAgICBUeXBlQ2hlY2sgY2hlY2tGcm9tU3VwZXJDbGFzcyA9CiAgICAgICAgICAgICAgc3VwZXJDaGVja3MgIT0gbnVsbCA/IHN1cGVyQ2hlY2tzW2NoZWNrZWRDbGFzc10gOiBudWxsOwoKICAgICAgICAgIC8vIFdoZXRoZXIgW2Nsc10gbmVlZCBhbiBleHBsaWNpdCAkaXNYIHByb3BlcnR5IGZvciBbY2hlY2tlZENsYXNzXS4KICAgICAgICAgIC8vCiAgICAgICAgICAvLyBJZiBbY2xzXSBpbmhlcml0cyBmcm9tIFtjaGVja2VkQ2xhc3NdIGl0IGFsc28gaW5oZXJpdHMgdGhlICRpc1gKICAgICAgICAgIC8vIHByb3BlcnR5IGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG9uIFtjaGVja2VkQ2xhc3NdLgogICAgICAgICAgYm9vbCBuZWVkc0lzID0gIWluaGVyaXRzRnJvbUNoZWNrZWRDbGFzcyAmJiBpc0NoZWNrZWQ7CgogICAgICAgICAgaWYgKGNoZWNrRnJvbVN1cGVyQ2xhc3MgIT0gbnVsbCkgewogICAgICAgICAgICAvLyBUaGUgc3VwZXJjbGFzcyBoYXMgYSBzdWJzdGl0dXRpb24gZnVuY3Rpb24gZm9yIFtjaGVja2VkQ2xhc3NdLgogICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBjYW4gcmV1c2UgdGhpcyBpdCBvZiBuZWVkIHRvIG92ZXJyaWRlIGl0LgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBUaGUgaW5oZXJpdGVkICRpc1ggcHJvcGVydHkgZG9lcyBfbm90XyBuZWVkIHRvIGJlIG92ZXJyaWRpbmcuCiAgICAgICAgICAgIGlmIChleHRlbmRzU3VwZXJDbGFzc1RyaXZpYWxseSkgewogICAgICAgICAgICAgIC8vIFtjbHNdIGltcGxlbWVudHMgW2NoZWNrZWRDbGFzc10gdGhlIHNhbWUgd2F5IGFzIFtzdXBlckNsYXNzXQogICAgICAgICAgICAgIC8vIHNvIHRoZSBpbmhlcml0ZWQgc3Vic3RpdHV0aW9uIGZ1bmN0aW9uIGFscmVhZHkgd29ya3MuCiAgICAgICAgICAgICAgY2hlY2tzLmFkZChuZXcgVHlwZUNoZWNrKGNoZWNrZWRDbGFzcywgbnVsbCwgbmVlZHNJczogZmFsc2UpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAvLyBbY2xzXSBpbXBsZW1lbnRzIFtjaGVja2VkQ2xhc3NdIGRpZmZlcmVudGx5IGZyb20gW3N1cGVyQ2xhc3NdCiAgICAgICAgICAgICAgLy8gc28gdGhlIGluaGVyaXRlZCBzdWJzdGl0dXRpb24gZnVuY3Rpb24gbmVlZHMgdG8gYmUgcmVwbGFjZWQuCiAgICAgICAgICAgICAgaWYgKGltcGxlbWVudHNDaGVja2VkVHJpdmlhbGx5KSB7CiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIGFuIGV4cGxpY2l0IHRyaXZpYWwgc3Vic3RpdHV0aW9uIGZ1bmN0aW9uIGZvcgogICAgICAgICAgICAgICAgLy8gW2NoZWNrZWRDbGFzc10gdGhhdCBvdmVycmlkZXMgdGhlIGluaGVyaXRlZCBmdW5jdGlvbi4KICAgICAgICAgICAgICAgIGNoZWNrcy5hZGQobmV3IFR5cGVDaGVjayhjaGVja2VkQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgaXNDaGVja2VkR2VuZXJpYyA/IGNvbnN0IFN1YnN0aXR1dGlvbi50cml2aWFsKCkgOiBudWxsLAogICAgICAgICAgICAgICAgICAgIG5lZWRzSXM6IGZhbHNlKSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgYSBub24tdHJpdmlhbCBzdWJzdGl0dXRpb24gZnVuY3Rpb24gZm9yCiAgICAgICAgICAgICAgICAvLyBbY2hlY2tlZENsYXNzXS4KICAgICAgICAgICAgICAgIGNoZWNrcy5hZGQobmV3IFR5cGVDaGVjaygKICAgICAgICAgICAgICAgICAgICBjaGVja2VkQ2xhc3MsIGNvbXB1dGVTdWJzdGl0dXRpb24oY2xzLCBjaGVja2VkQ2xhc3MpLAogICAgICAgICAgICAgICAgICAgIG5lZWRzSXM6IGZhbHNlKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBUaGUgc3VwZXJjbGFzcyBoYXMgbm8gc3Vic3RpdHV0aW9uIGZ1bmN0aW9uIGZvciBbY2hlY2tlZENsYXNzXS4KICAgICAgICAgICAgaWYgKGltcGxlbWVudHNDaGVja2VkVHJpdmlhbGx5KSB7CiAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgYWRkIGFuIGV4cGxpY2l0IHN1YnN0aXR1dGlvbiBmdW5jdGlvbiBmb3IKICAgICAgICAgICAgICAvLyBbY2hlY2tlZENsYXNzXSBiZWNhdXNlIHRoZSBzdWJzdGl0dXRpb24gaXMgdHJpdmlhbCBhbmQgZG9lc24ndAogICAgICAgICAgICAgIC8vIG5lZWQgdG8gb3ZlcnJpZGUgYW4gaW5oZXJpdGVkIGZ1bmN0aW9uLgogICAgICAgICAgICAgIGNoZWNrcy5hZGQobmV3IFR5cGVDaGVjayhjaGVja2VkQ2xhc3MsIG51bGwsIG5lZWRzSXM6IG5lZWRzSXMpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAvLyBXZSBuZWVkIGEgbm9uLXRyaXZpYWwgc3Vic3RpdHV0aW9uIGZ1bmN0aW9uIGZvcgogICAgICAgICAgICAgIC8vIFtjaGVja2VkQ2xhc3NdLgogICAgICAgICAgICAgIGNoZWNrcy5hZGQobmV3IFR5cGVDaGVjaygKICAgICAgICAgICAgICAgICAgY2hlY2tlZENsYXNzLCBjb21wdXRlU3Vic3RpdHV0aW9uKGNscywgY2hlY2tlZENsYXNzKSwKICAgICAgICAgICAgICAgICAgbmVlZHNJczogbmVlZHNJcykpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3IgKEludGVyZmFjZVR5cGUgdHlwZSBpbiBfdHlwZXMuZ2V0U3VwZXJ0eXBlcyhjbHMpKSB7CiAgICAgICAgcHJvY2Vzc1N1cGVydHlwZSh0eXBlKTsKICAgICAgfQogICAgICBGdW5jdGlvblR5cGUgY2FsbFR5cGUgPSBfdHlwZXMuZ2V0Q2FsbFR5cGUoX3R5cGVzLmdldFRoaXNUeXBlKGNscykpOwogICAgICBpZiAoY2FsbFR5cGUgIT0gbnVsbCkgewogICAgICAgIHByb2Nlc3NTdXBlcnR5cGUoX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmZ1bmN0aW9uVHlwZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGNoZWNrczsKICAgIH0KCiAgICBmb3IgKENsYXNzRW50aXR5IGNscyBpbiBjbGFzc1VzZU1hcC5rZXlzKSB7CiAgICAgIENsYXNzVXNlIGNsYXNzVXNlID0gY2xhc3NVc2VNYXBbY2xzXSA/PyBlbXB0eVVzZTsKICAgICAgaWYgKGNsYXNzVXNlLmRpcmVjdEluc3RhbmNlIHx8CiAgICAgICAgICBjbGFzc1VzZS50eXBlQXJndW1lbnQgfHwKICAgICAgICAgIGNsYXNzVXNlLnR5cGVMaXRlcmFsKSB7CiAgICAgICAgLy8gQWRkIGNoZWNrcyBvbmx5IGZvciBjbGFzc2VzIHRoYXQgYXJlIGxpdmUgZWl0aGVyIGFzIGluc3RhbnRpYXRlZAogICAgICAgIC8vIGNsYXNzZXMgb3IgdHlwZSBhcmd1bWVudHMgcGFzc2VkIGF0IHJ1bnRpbWUuCiAgICAgICAgY29tcHV0ZUNoZWNrcyhjbHMpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIFNldDxDbGFzc0VudGl0eT4gZ2V0Q2xhc3Nlc1VzZWRJblN1YnN0aXR1dGlvbnMoVHlwZUNoZWNrcyBjaGVja3MpIHsKICAgIFNldDxDbGFzc0VudGl0eT4gaW5zdGFudGlhdGVkID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKICAgIEFyZ3VtZW50Q29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBBcmd1bWVudENvbGxlY3RvcigpOwogICAgZm9yIChDbGFzc0VudGl0eSB0YXJnZXQgaW4gY2hlY2tzLmNsYXNzZXMpIHsKICAgICAgQ2xhc3NDaGVja3MgY2xhc3NDaGVja3MgPSBjaGVja3NbdGFyZ2V0XTsKICAgICAgZm9yIChUeXBlQ2hlY2sgY2hlY2sgaW4gY2xhc3NDaGVja3MuY2hlY2tzKSB7CiAgICAgICAgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiA9IGNoZWNrLnN1YnN0aXR1dGlvbjsKICAgICAgICBpZiAoc3Vic3RpdHV0aW9uICE9IG51bGwpIHsKICAgICAgICAgIGNvbGxlY3Rvci5jb2xsZWN0QWxsKHN1YnN0aXR1dGlvbi5hcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGluc3RhbnRpYXRlZC4uYWRkQWxsKGNvbGxlY3Rvci5jbGFzc2VzKTsKCiAgICAvLyBUT0RPKHNyYSk6IFRoaXMgY29tcHV0YXRpb24gbWlzc2VzIHN1YnN0aXR1dGlvbnMgZm9yIHJlYWRpbmcgdHlwZQogICAgLy8gcGFyYW1ldGVycy4KICB9CgogIC8vIFRPRE8oa2FybGtsb3NlKTogbWF5YmUgcHJlY29tcHV0ZSB0aGlzIHZhbHVlIGFuZCBzdG9yZSBpdCBpbiB0eXBlQ2hlY2tzPwogIEBvdmVycmlkZQogIGJvb2wgaXNUcml2aWFsU3Vic3RpdHV0aW9uKENsYXNzRW50aXR5IGNscywgQ2xhc3NFbnRpdHkgY2hlY2spIHsKICAgIGlmIChjbHMuaXNDbG9zdXJlKSB7CiAgICAgIC8vIFRPRE8oa2FybGtsb3NlKTogaGFuZGxlIGNsb3N1cmVzLgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyBJZiB0aGVyZSBhcmUgbm8gdHlwZSB2YXJpYWJsZXMsIHdlIGRvIG5vdCBuZWVkIGEgc3Vic3RpdHV0aW9uLgogICAgaWYgKCFfZWxlbWVudEVudmlyb25tZW50LmlzR2VuZXJpY0NsYXNzKGNoZWNrKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyBKUy1pbnRlcm9wIGNsYXNzZXMgbmVlZCBhbiBleHBsaWNpdCBzdWJzdGl0dXRpb24gdG8gbWFyayB0aGUgdHlwZQogICAgLy8gYXJndW1lbnRzIGFzIGBhbnlgIHR5cGUuCiAgICBpZiAoX2Nsb3NlZFdvcmxkLm5hdGl2ZURhdGEuaXNKc0ludGVyb3BDbGFzcyhjbHMpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBJZiB0aGUgdHlwZSBpcyB0aGUgc2FtZSwgd2UgZG8gbm90IG5lZWQgYSBzdWJzdGl0dXRpb24uCiAgICBpZiAoY2xzID09IGNoZWNrKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIEludGVyZmFjZVR5cGUgb3JpZ2luYWxUeXBlID0gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRUaGlzVHlwZShjbHMpOwogICAgSW50ZXJmYWNlVHlwZSB0eXBlID0gX3R5cGVzLmFzSW5zdGFuY2VPZihvcmlnaW5hbFR5cGUsIGNoZWNrKTsKICAgIC8vIFt0eXBlXSBpcyBub3QgYSBzdWJ0eXBlIG9mIFtjaGVja10uIHdlIGRvIG5vdCBnZW5lcmF0ZSBhIGNoZWNrIGFuZCBkbyBub3QKICAgIC8vIG5lZWQgYSBzdWJzdGl0dXRpb24uCiAgICBpZiAodHlwZSA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKCiAgICAvLyBSdW4gdGhyb3VnaCBib3RoIGxpc3RzIG9mIHR5cGUgdmFyaWFibGVzIGFuZCBjaGVjayBpZiB0aGUgdHlwZSB2YXJpYWJsZXMKICAgIC8vIGFyZSBpZGVudGljYWwgYXQgZWFjaCBwb3NpdGlvbi4gSWYgdGhleSBhcmUgbm90LCB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSBhCiAgICAvLyBzdWJzdGl0dXRpb24gZnVuY3Rpb24uCiAgICBMaXN0PERhcnRUeXBlPiB2YXJpYWJsZXMgPSBvcmlnaW5hbFR5cGUudHlwZUFyZ3VtZW50czsKICAgIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cyA9IHR5cGUudHlwZUFyZ3VtZW50czsKICAgIGlmICh2YXJpYWJsZXMubGVuZ3RoICE9IGFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHZhcmlhYmxlcy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgaWYgKHZhcmlhYmxlc1tpbmRleF0gIT0gYXJndW1lbnRzW2luZGV4XSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBTdWJzdGl0dXRpb24gZ2V0U3Vic3RpdHV0aW9uKENsYXNzRW50aXR5IGNscywgQ2xhc3NFbnRpdHkgb3RoZXIpIHsKICAgIC8vIExvb2sgZm9yIGEgcHJlY29tcHV0ZWQgY2hlY2suCiAgICBmb3IgKFR5cGVDaGVjayBjaGVjayBpbiBfcmVxdWlyZWRDaGVja3NbY2xzXS5jaGVja3MpIHsKICAgICAgaWYgKGNoZWNrLmNscyA9PSBvdGhlcikgewogICAgICAgIHJldHVybiBjaGVjay5zdWJzdGl0dXRpb247CiAgICAgIH0KICAgIH0KICAgIC8vIFRoZXJlIGlzIG5vIHByZWNvbXB1dGVkIGNoZWNrIGZvciB0aGlzIHBhaXIgKGJlY2F1c2UgdGhlIGNoZWNrIGlzIG5vdAogICAgLy8gZG9uZSBvbiB0eXBlIGFyZ3VtZW50cyBvbmx5LiAgQ29tcHV0ZSBhIG5ldyBzdWJzdGl0dXRpb24uCiAgICByZXR1cm4gY29tcHV0ZVN1YnN0aXR1dGlvbihjbHMsIG90aGVyKTsKICB9CgogIFN1YnN0aXR1dGlvbiBjb21wdXRlU3Vic3RpdHV0aW9uKENsYXNzRW50aXR5IGNscywgQ2xhc3NFbnRpdHkgY2hlY2ssCiAgICAgIHtib29sIGFsd2F5c0dlbmVyYXRlRnVuY3Rpb246IGZhbHNlfSkgewogICAgaWYgKGlzVHJpdmlhbFN1YnN0aXR1dGlvbihjbHMsIGNoZWNrKSkgcmV0dXJuIG51bGw7CgogICAgLy8gVW5uYW1lZCBtaXhpbiBhcHBsaWNhdGlvbiBjbGFzc2VzIGRvIG5vdCBuZWVkIHN1YnN0aXR1dGlvbnMsIGJlY2F1c2UgdGhleQogICAgLy8gYXJlIG5ldmVyIGluc3RhbnRpYXRlZCBhbmQgdGhlaXIgY2hlY2tzIGFyZSBvdmVyd3JpdHRlbiBieSB0aGUgY2xhc3MgdGhhdAogICAgLy8gdGhleSBhcmUgbWl4ZWQgaW50by4KICAgIEludGVyZmFjZVR5cGUgdHlwZSA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0VGhpc1R5cGUoY2xzKTsKICAgIEludGVyZmFjZVR5cGUgdGFyZ2V0ID0gX3R5cGVzLmFzSW5zdGFuY2VPZih0eXBlLCBjaGVjayk7CiAgICBMaXN0PERhcnRUeXBlPiB0eXBlVmFyaWFibGVzID0gdHlwZS50eXBlQXJndW1lbnRzOwogICAgaWYgKF9jbG9zZWRXb3JsZC5uYXRpdmVEYXRhLmlzSnNJbnRlcm9wQ2xhc3MoY2xzKSkgewogICAgICBpbnQgdHlwZUFyZ3VtZW50cyA9IHRhcmdldC50eXBlQXJndW1lbnRzLmxlbmd0aDsKICAgICAgLy8gR2VuZXJpYyBKUy1pbnRlcm9wIGNsYXNzIG5lZWQgYW4gZXhwbGljaXQgc3Vic3RpdHV0aW9uIHRvIG1hcmsKICAgICAgLy8gdGhlIHR5cGUgYXJndW1lbnRzIGFzIGBhbnlgIHR5cGUuCiAgICAgIHJldHVybiBuZXcgU3Vic3RpdHV0aW9uLmpzSW50ZXJvcCh0eXBlQXJndW1lbnRzKTsKICAgIH0gZWxzZSBpZiAodHlwZVZhcmlhYmxlcy5pc0VtcHR5ICYmICFhbHdheXNHZW5lcmF0ZUZ1bmN0aW9uKSB7CiAgICAgIHJldHVybiBuZXcgU3Vic3RpdHV0aW9uLmxpc3QodGFyZ2V0LnR5cGVBcmd1bWVudHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBTdWJzdGl0dXRpb24uZnVuY3Rpb24odGFyZ2V0LnR5cGVBcmd1bWVudHMsIHR5cGVWYXJpYWJsZXMpOwogICAgfQogIH0KfQoKY2xhc3MgVHJpdmlhbFJ1bnRpbWVUeXBlc1N1YnN0aXR1dGlvbnMgZXh0ZW5kcyBSdW50aW1lVHlwZXNTdWJzdGl0dXRpb25zTWl4aW4gewogIEBvdmVycmlkZQogIGZpbmFsIEpDbG9zZWRXb3JsZCBfY2xvc2VkV29ybGQ7CiAgQG92ZXJyaWRlCiAgVHlwZUNoZWNrcyBfcmVxdWlyZWRDaGVja3M7CgogIFRyaXZpYWxSdW50aW1lVHlwZXNTdWJzdGl0dXRpb25zKHRoaXMuX2Nsb3NlZFdvcmxkKTsKfQoKLy8vIEludGVyZmFjZSBmb3IgY29tcHV0aW5nIHN1YnN0aXR1dGlvbnMgbmVlZCBmb3IgcnVudGltZSB0eXBlIGNoZWNrcy4KYWJzdHJhY3QgY2xhc3MgUnVudGltZVR5cGVzU3Vic3RpdHV0aW9ucyB7CiAgYm9vbCBpc1RyaXZpYWxTdWJzdGl0dXRpb24oQ2xhc3NFbnRpdHkgY2xzLCBDbGFzc0VudGl0eSBjaGVjayk7CgogIFN1YnN0aXR1dGlvbiBnZXRTdWJzdGl0dXRpb24oQ2xhc3NFbnRpdHkgY2xzLCBDbGFzc0VudGl0eSBvdGhlcik7CgogIFNldDxDbGFzc0VudGl0eT4gZ2V0Q2xhc3Nlc1VzZWRJblN1YnN0aXR1dGlvbnMoVHlwZUNoZWNrcyBjaGVja3MpOwoKICBzdGF0aWMgYm9vbCBoYXNUeXBlQXJndW1lbnRzKERhcnRUeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgSW50ZXJmYWNlVHlwZSBpbnRlcmZhY2VUeXBlID0gdHlwZTsKICAgICAgcmV0dXJuICFpbnRlcmZhY2VUeXBlLnRyZWF0QXNSYXc7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBSdW50aW1lVHlwZXNFbmNvZGVyIHsKICBib29sIGlzU2ltcGxlRnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSB0eXBlKTsKCiAganNBc3QuRXhwcmVzc2lvbiBnZXRTaWduYXR1cmVFbmNvZGluZygKICAgICAgRW1pdHRlciBlbWl0dGVyLCBEYXJ0VHlwZSB0eXBlLCBqc0FzdC5FeHByZXNzaW9uIHRoaXNfKTsKCiAganNBc3QuRXhwcmVzc2lvbiBnZXRTdWJzdGl0dXRpb25SZXByZXNlbnRhdGlvbigKICAgICAgRW1pdHRlciBlbWl0dGVyLCBMaXN0PERhcnRUeXBlPiB0eXBlcywgT25WYXJpYWJsZUNhbGxiYWNrIG9uVmFyaWFibGUpOwogIGpzQXN0LkV4cHJlc3Npb24gZ2V0U3Vic3RpdHV0aW9uQ29kZSgKICAgICAgRW1pdHRlciBlbWl0dGVyLCBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uKTsKCiAgLy8vIFJldHVybnMgdGhlIEphdmFTY3JpcHQgdGVtcGxhdGUgdG8gZGV0ZXJtaW5lIGF0IHJ1bnRpbWUgaWYgYSB0eXBlIG9iamVjdAogIC8vLyBpcyBhIGZ1bmN0aW9uIHR5cGUuCiAganNBc3QuVGVtcGxhdGUgZ2V0IHRlbXBsYXRlRm9ySXNGdW5jdGlvblR5cGU7CgogIC8vLyBSZXR1cm5zIHRoZSBKYXZhU2NyaXB0IHRlbXBsYXRlIHRvIGRldGVybWluZSBhdCBydW50aW1lIGlmIGEgdHlwZSBvYmplY3QKICAvLy8gaXMgYSBGdXR1cmVPciB0eXBlLgogIGpzQXN0LlRlbXBsYXRlIGdldCB0ZW1wbGF0ZUZvcklzRnV0dXJlT3JUeXBlOwoKICAvLy8gUmV0dXJucyB0aGUgSmF2YVNjcmlwdCB0ZW1wbGF0ZSB0byBkZXRlcm1pbmUgYXQgcnVudGltZSBpZiBhIHR5cGUgb2JqZWN0CiAgLy8vIGlzIHRoZSB2b2lkIHR5cGUuCiAganNBc3QuVGVtcGxhdGUgZ2V0IHRlbXBsYXRlRm9ySXNWb2lkVHlwZTsKCiAgLy8vIFJldHVybnMgdGhlIEphdmFTY3JpcHQgdGVtcGxhdGUgdG8gZGV0ZXJtaW5lIGF0IHJ1bnRpbWUgaWYgYSB0eXBlIG9iamVjdAogIC8vLyBpcyB0aGUgZHluYW1pYyB0eXBlLgogIGpzQXN0LlRlbXBsYXRlIGdldCB0ZW1wbGF0ZUZvcklzRHluYW1pY1R5cGU7CgogIC8vLyBSZXR1cm5zIHRoZSBKYXZhU2NyaXB0IHRlbXBsYXRlIHRvIGRldGVybWluZSBhdCBydW50aW1lIGlmIGEgdHlwZSBvYmplY3QKICAvLy8gaXMgYSB0eXBlIGFyZ3VtZW50IG9mIGpzLWludGVyb3AgY2xhc3MuCiAganNBc3QuVGVtcGxhdGUgZ2V0IHRlbXBsYXRlRm9ySXNKc0ludGVyb3BUeXBlQXJndW1lbnQ7CgogIGpzQXN0Lk5hbWUgZ2V0IGdldEZ1bmN0aW9uVGhhdFJldHVybnNOdWxsTmFtZTsKCiAgLy8vIFJldHVybnMgYSBbanNBc3QuRXhwcmVzc2lvbl0gcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBbdHlwZV0uIFR5cGUgdmFyaWFibGVzCiAgLy8vIGFyZSByZXBsYWNlZCBieSB0aGUgW2pzQXN0LkV4cHJlc3Npb25dIHJldHVybmVkIGJ5IFtvblZhcmlhYmxlXS4KICBqc0FzdC5FeHByZXNzaW9uIGdldFR5cGVSZXByZXNlbnRhdGlvbigKICAgICAgRW1pdHRlciBlbWl0dGVyLCBEYXJ0VHlwZSB0eXBlLCBPblZhcmlhYmxlQ2FsbGJhY2sgb25WYXJpYWJsZSwKICAgICAgW1Nob3VsZEVuY29kZVR5cGVkZWZDYWxsYmFjayBzaG91bGRFbmNvZGVUeXBlZGVmXSk7CgogIFN0cmluZyBnZXRUeXBlUmVwcmVzZW50YXRpb25Gb3JUeXBlQ29uc3RhbnQoRGFydFR5cGUgdHlwZSk7Cn0KCi8vLyBDb21tb24gZnVuY3Rpb25hbGl0eSBmb3IgW19SdW50aW1lVHlwZXNOZWVkQnVpbGRlcl0gYW5kIFtfUnVudGltZVR5cGVzXS4KYWJzdHJhY3QgY2xhc3MgX1J1bnRpbWVUeXBlc0Jhc2UgewogIGZpbmFsIERhcnRUeXBlcyBfdHlwZXM7CgogIF9SdW50aW1lVHlwZXNCYXNlKHRoaXMuX3R5cGVzKTsKCiAgLy8vIENvbXB1dGUgdHlwZSBhcmd1bWVudHMgb2YgY2xhc3NlcyB0aGF0IHVzZSBvbmUgb2YgdGhlaXIgdHlwZSB2YXJpYWJsZXMgaW4KICAvLy8gaXMtY2hlY2tzIGFuZCBhZGQgdGhlIGlzLWNoZWNrcyB0aGF0IHRoZXkgaW1wbHkuCiAgLy8vCiAgLy8vIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIGlzLWNoZWNrcyBoYXZlIGJlZW4gcmVnaXN0ZXJlZC4KICAvLy8KICAvLy8gVE9ETyhrYXJsa2xvc2UpOiBtb3ZlIHRoZXNlIGNvbXB1dGF0aW9ucyBpbnRvIGEgZnVuY3Rpb24gcHJvZHVjaW5nIGFuCiAgLy8vIGltbXV0YWJsZSBkYXRhc3RydWN0dXJlLgogIHZvaWQgcmVnaXN0ZXJJbXBsaWNpdENoZWNrcygKICAgICAgU2V0PEludGVyZmFjZVR5cGU+IGluc3RhbnRpYXRlZFR5cGVzLAogICAgICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gY2xhc3Nlc1VzaW5nQ2hlY2tzLAogICAgICBTZXQ8RGFydFR5cGU+IGltcGxpY2l0SXNDaGVja3MpIHsKICAgIC8vIElmIHRoZXJlIGFyZSBubyBjbGFzc2VzIHRoYXQgdXNlIHRoZWlyIHZhcmlhYmxlcyBpbiBjaGVja3MsIHRoZXJlIGlzCiAgICAvLyBub3RoaW5nIHRvIGRvLgogICAgaWYgKGNsYXNzZXNVc2luZ0NoZWNrcy5pc0VtcHR5KSByZXR1cm47CiAgICAvLyBGaW5kIGFsbCBpbnN0YW50aWF0ZWQgdHlwZXMgdGhhdCBhcmUgYSBzdWJ0eXBlIG9mIGEgY2xhc3MgdGhhdCB1c2VzCiAgICAvLyBvbmUgb2YgaXRzIHR5cGUgYXJndW1lbnRzIGluIGFuIGlzLWNoZWNrIGFuZCBhZGQgdGhlIGFyZ3VtZW50cyB0byB0aGUKICAgIC8vIHNldCBvZiBpcy1jaGVja3MuCiAgICBmb3IgKEludGVyZmFjZVR5cGUgdHlwZSBpbiBpbnN0YW50aWF0ZWRUeXBlcykgewogICAgICBmb3IgKENsYXNzRW50aXR5IGNscyBpbiBjbGFzc2VzVXNpbmdDaGVja3MpIHsKICAgICAgICAvLyBXZSBuZWVkIHRoZSB0eXBlIGFzIGluc3RhbmNlIG9mIGl0cyBzdXBlcmNsYXNzIGFueXdheSwgc28gd2UganVzdAogICAgICAgIC8vIHRyeSB0byBjb21wdXRlIHRoZSBzdWJzdGl0dXRpb247IGlmIHRoZSByZXN1bHQgaXMgWzpudWxsOl0sIHRoZQogICAgICAgIC8vIGNsYXNzZXMgYXJlIG5vdCByZWxhdGVkLgogICAgICAgIEludGVyZmFjZVR5cGUgaW5zdGFuY2UgPSBfdHlwZXMuYXNJbnN0YW5jZU9mKHR5cGUsIGNscyk7CiAgICAgICAgaWYgKGluc3RhbmNlICE9IG51bGwpIHsKICAgICAgICAgIGZvciAoRGFydFR5cGUgYXJndW1lbnQgaW4gaW5zdGFuY2UudHlwZUFyZ3VtZW50cykgewogICAgICAgICAgICBpbXBsaWNpdElzQ2hlY2tzLmFkZChhcmd1bWVudC51bmFsaWFzZWQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQoKY2xhc3MgUnVudGltZVR5cGVzTmVlZEltcGwgaW1wbGVtZW50cyBSdW50aW1lVHlwZXNOZWVkIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW1J1bnRpbWVUeXBlc05lZWRdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAncnVudGltZS10eXBlcy1uZWVkJzsKCiAgZmluYWwgRWxlbWVudEVudmlyb25tZW50IF9lbGVtZW50RW52aXJvbm1lbnQ7CiAgZmluYWwgU2V0PENsYXNzRW50aXR5PiBjbGFzc2VzTmVlZGluZ1R5cGVBcmd1bWVudHM7CiAgZmluYWwgU2V0PEZ1bmN0aW9uRW50aXR5PiBtZXRob2RzTmVlZGluZ1NpZ25hdHVyZTsKICBmaW5hbCBTZXQ8RnVuY3Rpb25FbnRpdHk+IG1ldGhvZHNOZWVkaW5nVHlwZUFyZ3VtZW50czsKICBmaW5hbCBTZXQ8TG9jYWw+IGxvY2FsRnVuY3Rpb25zTmVlZGluZ1NpZ25hdHVyZTsKICBmaW5hbCBTZXQ8TG9jYWw+IGxvY2FsRnVuY3Rpb25zTmVlZGluZ1R5cGVBcmd1bWVudHM7CiAgZmluYWwgU2V0PFNlbGVjdG9yPiBzZWxlY3RvcnNOZWVkaW5nVHlwZUFyZ3VtZW50czsKICBmaW5hbCBTZXQ8aW50PiBpbnN0YW50aWF0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzOwoKICBSdW50aW1lVHlwZXNOZWVkSW1wbCgKICAgICAgdGhpcy5fZWxlbWVudEVudmlyb25tZW50LAogICAgICB0aGlzLmNsYXNzZXNOZWVkaW5nVHlwZUFyZ3VtZW50cywKICAgICAgdGhpcy5tZXRob2RzTmVlZGluZ1NpZ25hdHVyZSwKICAgICAgdGhpcy5tZXRob2RzTmVlZGluZ1R5cGVBcmd1bWVudHMsCiAgICAgIHRoaXMubG9jYWxGdW5jdGlvbnNOZWVkaW5nU2lnbmF0dXJlLAogICAgICB0aGlzLmxvY2FsRnVuY3Rpb25zTmVlZGluZ1R5cGVBcmd1bWVudHMsCiAgICAgIHRoaXMuc2VsZWN0b3JzTmVlZGluZ1R5cGVBcmd1bWVudHMsCiAgICAgIHRoaXMuaW5zdGFudGlhdGlvbnNOZWVkaW5nVHlwZUFyZ3VtZW50cyk7CgogIGZhY3RvcnkgUnVudGltZVR5cGVzTmVlZEltcGwucmVhZEZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwgRWxlbWVudEVudmlyb25tZW50IGVsZW1lbnRFbnZpcm9ubWVudCkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBTZXQ8Q2xhc3NFbnRpdHk+IGNsYXNzZXNOZWVkaW5nVHlwZUFyZ3VtZW50cyA9CiAgICAgICAgc291cmNlLnJlYWRDbGFzc2VzPENsYXNzRW50aXR5PigpLnRvU2V0KCk7CiAgICBTZXQ8RnVuY3Rpb25FbnRpdHk+IG1ldGhvZHNOZWVkaW5nU2lnbmF0dXJlID0KICAgICAgICBzb3VyY2UucmVhZE1lbWJlcnM8RnVuY3Rpb25FbnRpdHk+KCkudG9TZXQoKTsKICAgIFNldDxGdW5jdGlvbkVudGl0eT4gbWV0aG9kc05lZWRpbmdUeXBlQXJndW1lbnRzID0KICAgICAgICBzb3VyY2UucmVhZE1lbWJlcnM8RnVuY3Rpb25FbnRpdHk+KCkudG9TZXQoKTsKICAgIFNldDxTZWxlY3Rvcj4gc2VsZWN0b3JzTmVlZGluZ1R5cGVBcmd1bWVudHMgPQogICAgICAgIHNvdXJjZS5yZWFkTGlzdCgoKSA9PiBuZXcgU2VsZWN0b3IucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSkpLnRvU2V0KCk7CiAgICBTZXQ8aW50PiBpbnN0YW50aWF0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzID0KICAgICAgICBzb3VyY2UucmVhZExpc3Qoc291cmNlLnJlYWRJbnQpLnRvU2V0KCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IFJ1bnRpbWVUeXBlc05lZWRJbXBsKAogICAgICAgIGVsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgICBjbGFzc2VzTmVlZGluZ1R5cGVBcmd1bWVudHMsCiAgICAgICAgbWV0aG9kc05lZWRpbmdTaWduYXR1cmUsCiAgICAgICAgbWV0aG9kc05lZWRpbmdUeXBlQXJndW1lbnRzLAogICAgICAgIG51bGwsCiAgICAgICAgbnVsbCwKICAgICAgICBzZWxlY3RvcnNOZWVkaW5nVHlwZUFyZ3VtZW50cywKICAgICAgICBpbnN0YW50aWF0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVCb29sKGZhbHNlKTsgLy8gSXMgX25vdF8gdHJpdmlhbC4KICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVDbGFzc2VzKGNsYXNzZXNOZWVkaW5nVHlwZUFyZ3VtZW50cyk7CiAgICBzaW5rLndyaXRlTWVtYmVycyhtZXRob2RzTmVlZGluZ1NpZ25hdHVyZSk7CiAgICBzaW5rLndyaXRlTWVtYmVycyhtZXRob2RzTmVlZGluZ1R5cGVBcmd1bWVudHMpOwogICAgYXNzZXJ0KGxvY2FsRnVuY3Rpb25zTmVlZGluZ1NpZ25hdHVyZSA9PSBudWxsKTsKICAgIGFzc2VydChsb2NhbEZ1bmN0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzID09IG51bGwpOwogICAgc2luay53cml0ZUxpc3Qoc2VsZWN0b3JzTmVlZGluZ1R5cGVBcmd1bWVudHMsCiAgICAgICAgKFNlbGVjdG9yIHNlbGVjdG9yKSA9PiBzZWxlY3Rvci53cml0ZVRvRGF0YVNpbmsoc2luaykpOwogICAgc2luay53cml0ZUxpc3QoaW5zdGFudGlhdGlvbnNOZWVkaW5nVHlwZUFyZ3VtZW50cywgc2luay53cml0ZUludCk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgYm9vbCBjaGVja0NsYXNzKGNvdmFyaWFudCBDbGFzc0VudGl0eSBjbHMpID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgY2xhc3NOZWVkc1R5cGVBcmd1bWVudHMoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICBhc3NlcnQoY2hlY2tDbGFzcyhjbHMpKTsKICAgIGlmICghX2VsZW1lbnRFbnZpcm9ubWVudC5pc0dlbmVyaWNDbGFzcyhjbHMpKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gY2xhc3Nlc05lZWRpbmdUeXBlQXJndW1lbnRzLmNvbnRhaW5zKGNscyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG1ldGhvZE5lZWRzU2lnbmF0dXJlKEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uKSB7CiAgICByZXR1cm4gbWV0aG9kc05lZWRpbmdTaWduYXR1cmUuY29udGFpbnMoZnVuY3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBtZXRob2ROZWVkc1R5cGVBcmd1bWVudHMoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pIHsKICAgIHJldHVybiBtZXRob2RzTmVlZGluZ1R5cGVBcmd1bWVudHMuY29udGFpbnMoZnVuY3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBzZWxlY3Rvck5lZWRzVHlwZUFyZ3VtZW50cyhTZWxlY3RvciBzZWxlY3RvcikgewogICAgaWYgKHNlbGVjdG9yLmNhbGxTdHJ1Y3R1cmUudHlwZUFyZ3VtZW50Q291bnQgPT0gMCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHNlbGVjdG9yc05lZWRpbmdUeXBlQXJndW1lbnRzLmNvbnRhaW5zKHNlbGVjdG9yKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaW5zdGFudGlhdGlvbk5lZWRzVHlwZUFyZ3VtZW50cygKICAgICAgRGFydFR5cGUgZnVuY3Rpb25UeXBlLCBpbnQgdHlwZUFyZ3VtZW50Q291bnQpIHsKICAgIHJldHVybiBpbnN0YW50aWF0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzLmNvbnRhaW5zKHR5cGVBcmd1bWVudENvdW50KTsKICB9Cn0KCmNsYXNzIFR5cGVWYXJpYWJsZVRlc3RzIHsKICBMaXN0PFJ0aU5vZGU+IF9ub2RlcyA9IDxSdGlOb2RlPltdOwogIE1hcDxDbGFzc0VudGl0eSwgQ2xhc3NOb2RlPiBfY2xhc3NlcyA9IDxDbGFzc0VudGl0eSwgQ2xhc3NOb2RlPnt9OwogIE1hcDxFbnRpdHksIE1ldGhvZE5vZGU+IF9tZXRob2RzID0gPEVudGl0eSwgTWV0aG9kTm9kZT57fTsKICBNYXA8U2VsZWN0b3IsIFNldDxFbnRpdHk+PiBfYXBwbGllZFNlbGVjdG9yTWFwOwogIE1hcDxHZW5lcmljSW5zdGFudGlhdGlvbiwgU2V0PEVudGl0eT4+IF9pbnN0YW50aWF0aW9uTWFwOwoKICAvLy8gQWxsIGV4cGxpY2l0IGlzLXRlc3RzLgogIGZpbmFsIFNldDxEYXJ0VHlwZT4gZXhwbGljaXRJc0NoZWNrczsKCiAgLy8vIEFsbCBpbXBsaWNpdCBpcy10ZXN0cy4KICBmaW5hbCBTZXQ8RGFydFR5cGU+IGltcGxpY2l0SXNDaGVja3MgPSBuZXcgU2V0PERhcnRUeXBlPigpOwoKICBUeXBlVmFyaWFibGVUZXN0cygKICAgICAgRWxlbWVudEVudmlyb25tZW50IGVsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIERhcnRUeXBlcyB0eXBlcywKICAgICAgV29ybGRCdWlsZGVyIHdvcmxkQnVpbGRlciwKICAgICAgU2V0PEdlbmVyaWNJbnN0YW50aWF0aW9uPiBnZW5lcmljSW5zdGFudGlhdGlvbnMsCiAgICAgIHtib29sIGZvclJ0aU5lZWRzOiB0cnVlfSkKICAgICAgOiBleHBsaWNpdElzQ2hlY2tzID0gbmV3IFNldDxEYXJ0VHlwZT4uZnJvbSh3b3JsZEJ1aWxkZXIuaXNDaGVja3MpIHsKICAgIF9zZXR1cERlcGVuZGVuY2llcygKICAgICAgICBlbGVtZW50RW52aXJvbm1lbnQsIGNvbW1vbkVsZW1lbnRzLCB3b3JsZEJ1aWxkZXIsIGdlbmVyaWNJbnN0YW50aWF0aW9ucywKICAgICAgICBmb3JSdGlOZWVkczogZm9yUnRpTmVlZHMpOwogICAgX3Byb3BhZ2F0ZVRlc3RzKGNvbW1vbkVsZW1lbnRzLCBlbGVtZW50RW52aXJvbm1lbnQsIHdvcmxkQnVpbGRlcik7CiAgICBpZiAoZm9yUnRpTmVlZHMpIHsKICAgICAgX3Byb3BhZ2F0ZUxpdGVyYWxzKGVsZW1lbnRFbnZpcm9ubWVudCwgd29ybGRCdWlsZGVyKTsKICAgIH0KICAgIF9jb2xsZWN0UmVzdWx0cyhjb21tb25FbGVtZW50cywgZWxlbWVudEVudmlyb25tZW50LCB0eXBlcywgd29ybGRCdWlsZGVyLAogICAgICAgIGZvclJ0aU5lZWRzOiBmb3JSdGlOZWVkcyk7CiAgfQoKICAvLy8gQ2xhc3NlcyB3aG9zZSB0eXBlIHZhcmlhYmxlcyBhcmUgZXhwbGljaXRseSBvciBpbXBsaWNpdGx5IHVzZWQgaW4KICAvLy8gaXMtdGVzdHMuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZSBgQWAgYW5kIGBCYCBpbjoKICAvLy8KICAvLy8gICAgIGNsYXNzIEE8VD4gewogIC8vLyAgICAgICBtKG8pID0+IG8gaXMgVDsKICAvLy8gICAgIH0KICAvLy8gICAgIGNsYXNzIEI8Uz4gewogIC8vLyAgICAgICBtKG8pID0+IG5ldyBBPFM+KCkubShvKTsKICAvLy8gICAgIH0KICAvLy8gICAgIG1haW4oKSA9PiBuZXcgQjxpbnQ+KCkubSgwKTsKICAvLy8KICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0IGNsYXNzVGVzdHNGb3JUZXN0aW5nID0+CiAgICAgIF9jbGFzc2VzLnZhbHVlcy53aGVyZSgobikgPT4gbi5oYXNUZXN0KS5tYXAoKG4pID0+IG4uY2xzKS50b1NldCgpOwoKICAvLy8gQ2xhc3NlcyB0aGF0IGV4cGxpY2l0bHkgdXNlIHRoZWlyIHR5cGUgdmFyaWFibGVzIGluIGlzLXRlc3RzLgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2UgYEFgIGluOgogIC8vLwogIC8vLyAgICAgY2xhc3MgQTxUPiB7CiAgLy8vICAgICAgIG0obykgPT4gbyBpcyBUOwogIC8vLyAgICAgfQogIC8vLyAgICAgbWFpbigpID0+IG5ldyBBPGludD4oKS5tKDApOwogIC8vLwogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBnZXQgZGlyZWN0Q2xhc3NUZXN0c0ZvclRlc3RpbmcgPT4KICAgICAgX2NsYXNzZXMudmFsdWVzLndoZXJlKChuKSA9PiBuLmhhc0RpcmVjdFRlc3QpLm1hcCgobikgPT4gbi5jbHMpLnRvU2V0KCk7CgogIC8vLyBNZXRob2RzIHRoYXQgZXhwbGljaXRseSBvciBpbXBsaWNpdGx5IHVzZSB0aGVpciB0eXBlIHZhcmlhYmxlcyBpbgogIC8vLyBpcy10ZXN0cy4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlIGBtMWAgYW5kIGBtMmBpbjoKICAvLy8KICAvLy8gICAgIG0xPFQ+KG8pID0+IG8gaXMgVDsKICAvLy8gICAgIG0yPFM+KG8pID0+IG0xPFM+KG8pOwogIC8vLyAgICAgbWFpbigpID0+IG0yPGludD4oMCk7CiAgLy8vCiAgSXRlcmFibGU8RW50aXR5PiBnZXQgbWV0aG9kVGVzdHNGb3JUZXN0aW5nID0+CiAgICAgIF9tZXRob2RzLnZhbHVlcy53aGVyZSgobikgPT4gbi5oYXNUZXN0KS5tYXAoKG4pID0+IG4uZnVuY3Rpb24pLnRvU2V0KCk7CgogIC8vLyBNZXRob2RzIHRoYXQgZXhwbGljaXRseSB1c2UgdGhlaXIgdHlwZSB2YXJpYWJsZXMgaW4gaXMtdGVzdHMuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZSBgbWAgaW46CiAgLy8vCiAgLy8vICAgICBtPFQ+KG8pID0+IG8gaXMgVDsKICAvLy8gICAgIG1haW4oKSA9PiBtPGludD4oMCk7CiAgLy8vCiAgSXRlcmFibGU8RW50aXR5PiBnZXQgZGlyZWN0TWV0aG9kVGVzdHNGb3JUZXN0aW5nID0+IF9tZXRob2RzLnZhbHVlcwogICAgICAud2hlcmUoKG4pID0+IG4uaGFzRGlyZWN0VGVzdCkKICAgICAgLm1hcCgobikgPT4gbi5mdW5jdGlvbikKICAgICAgLnRvU2V0KCk7CgogIC8vLyBUaGUgZW50aXRpZXMgdGhhdCBuZWVkIHR5cGUgYXJndW1lbnRzIGF0IHJ1bnRpbWUgaWYgdGhlICdrZXkgZW50aXR5JyBuZWVkcwogIC8vLyB0eXBlIGFyZ3VtZW50cy4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlOgogIC8vLwogIC8vLyAgICAgY2xhc3MgQTxUPiB7CiAgLy8vICAgICAgIG0oKSA9PiBuZXcgQjxUPigpOwogIC8vLyAgICAgfQogIC8vLyAgICAgY2xhc3MgQjxUPiB7fQogIC8vLyAgICAgbWFpbigpID0+IG5ldyBBPFN0cmluZz4oKS5tKCkgaXMgQjxpbnQ+OwogIC8vLwogIC8vLyBIZXJlIGBBYCBuZWVkcyB0eXBlIGFyZ3VtZW50cyBhdCBydW50aW1lIGJlY2F1c2UgdGhlIGtleSBlbnRpdHkgYEJgIG5lZWRzCiAgLy8vIGl0IGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjaGVjayBhZ2FpbnN0IGBCPGludD5gLgogIC8vLwogIC8vLyBUaGlzIGNhbiBhbHNvIGludm9sdmUgZ2VuZXJpYyBtZXRob2RzOgogIC8vLwogIC8vLyAgICBjbGFzcyBBPFQ+IHt9CiAgLy8vICAgIG1ldGhvZDxUPigpID0+IG5ldyBBPFQ+KCk7CiAgLy8vICAgIG1haW4oKSA9PiBtZXRob2Q8aW50PigpIGlzIEE8aW50PigpOwogIC8vLwogIC8vLyBIZXJlIGBtZXRob2RgIG5lZWQgdHlwZSBhcmd1bWVudHMgYXQgcnVudGltZSBiZWNhdXNlIHRoZSBrZXkgZW50aXR5IGBBYAogIC8vLyBuZWVkcyBpdCBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUgY2hlY2sgYWdhaW5zdCBgQTxpbnQ+YC4KICAvLy8KICBJdGVyYWJsZTxFbnRpdHk+IGdldFR5cGVBcmd1bWVudERlcGVuZGVuY2llcyhFbnRpdHkgZW50aXR5KSB7CiAgICBJdGVyYWJsZTxSdGlOb2RlPiBkZXBlbmRlbmNpZXM7CiAgICBpZiAoZW50aXR5IGlzIENsYXNzRW50aXR5KSB7CiAgICAgIGRlcGVuZGVuY2llcyA9IF9jbGFzc2VzW2VudGl0eV0/LmRlcGVuZGVuY2llczsKICAgIH0gZWxzZSB7CiAgICAgIGRlcGVuZGVuY2llcyA9IF9tZXRob2RzW2VudGl0eV0/LmRlcGVuZGVuY2llczsKICAgIH0KICAgIGlmIChkZXBlbmRlbmNpZXMgPT0gbnVsbCkgcmV0dXJuIGNvbnN0IDxFbnRpdHk+W107CiAgICByZXR1cm4gZGVwZW5kZW5jaWVzLm1hcCgobikgPT4gbi5lbnRpdHkpLnRvU2V0KCk7CiAgfQoKICAvLy8gQ2FsbHMgW2ZdIGZvciBlYWNoIHNlbGVjdG9yIHRoYXQgYXBwbGllcyB0byBnZW5lcmljIFt0YXJnZXRzXS4KICB2b2lkIGZvckVhY2hBcHBsaWVkU2VsZWN0b3Iodm9pZCBmKFNlbGVjdG9yIHNlbGVjdG9yLCBTZXQ8RW50aXR5PiB0YXJnZXRzKSkgewogICAgX2FwcGxpZWRTZWxlY3Rvck1hcC5mb3JFYWNoKGYpOwogIH0KCiAgLy8vIENhbGxzIFtmXSBmb3IgZWFjaCBnZW5lcmljIGluc3RhbnRpYXRpb24gdGhhdCBhcHBsaWVzIHRvIGdlbmVyaWMKICAvLy8gY2xvc3VyaXplZCBbdGFyZ2V0c10uCiAgdm9pZCBmb3JFYWNoR2VuZXJpY0luc3RhbnRpYXRpb24oCiAgICAgIHZvaWQgZihHZW5lcmljSW5zdGFudGlhdGlvbiBpbnN0YW50aWF0aW9uLCBTZXQ8RW50aXR5PiB0YXJnZXRzKSkgewogICAgX2luc3RhbnRpYXRpb25NYXA/LmZvckVhY2goZik7CiAgfQoKICBDbGFzc05vZGUgX2dldENsYXNzTm9kZShDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBfY2xhc3Nlcy5wdXRJZkFic2VudChjbHMsICgpIHsKICAgICAgQ2xhc3NOb2RlIG5vZGUgPSBuZXcgQ2xhc3NOb2RlKGNscyk7CiAgICAgIF9ub2Rlcy5hZGQobm9kZSk7CiAgICAgIHJldHVybiBub2RlOwogICAgfSk7CiAgfQoKICBNZXRob2ROb2RlIF9nZXRNZXRob2ROb2RlKEVsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQsCiAgICAgIFdvcmxkQnVpbGRlciB3b3JsZEJ1aWxkZXIsIEVudGl0eSBmdW5jdGlvbikgewogICAgcmV0dXJuIF9tZXRob2RzLnB1dElmQWJzZW50KGZ1bmN0aW9uLCAoKSB7CiAgICAgIE1ldGhvZE5vZGUgbm9kZTsKICAgICAgaWYgKGZ1bmN0aW9uIGlzIEZ1bmN0aW9uRW50aXR5KSB7CiAgICAgICAgTmFtZSBpbnN0YW5jZU5hbWU7CiAgICAgICAgYm9vbCBpc0NhbGxUYXJnZXQ7CiAgICAgICAgYm9vbCBpc05vU3VjaE1ldGhvZDsKICAgICAgICBpZiAoZnVuY3Rpb24uaXNJbnN0YW5jZU1lbWJlcikgewogICAgICAgICAgaXNDYWxsVGFyZ2V0ID0gd29ybGRCdWlsZGVyLmNsb3N1cml6ZWRNZW1iZXJzLmNvbnRhaW5zKGZ1bmN0aW9uKTsKICAgICAgICAgIGluc3RhbmNlTmFtZSA9IGZ1bmN0aW9uLm1lbWJlck5hbWU7CiAgICAgICAgICBpc05vU3VjaE1ldGhvZCA9IGluc3RhbmNlTmFtZS50ZXh0ID09IElkZW50aWZpZXJzLm5vU3VjaE1ldGhvZF87CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlzQ2FsbFRhcmdldCA9IHdvcmxkQnVpbGRlci5jbG9zdXJpemVkU3RhdGljcy5jb250YWlucyhmdW5jdGlvbik7CiAgICAgICAgICBpc05vU3VjaE1ldGhvZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBub2RlID0gbmV3IE1ldGhvZE5vZGUoZnVuY3Rpb24sIGZ1bmN0aW9uLnBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAgICAgICAgaXNDYWxsVGFyZ2V0OiBpc0NhbGxUYXJnZXQsCiAgICAgICAgICAgIGluc3RhbmNlTmFtZTogaW5zdGFuY2VOYW1lLAogICAgICAgICAgICBpc05vU3VjaE1ldGhvZDogaXNOb1N1Y2hNZXRob2QpOwogICAgICB9IGVsc2UgewogICAgICAgIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUgPSBuZXcgUGFyYW1ldGVyU3RydWN0dXJlLmZyb21UeXBlKAogICAgICAgICAgICBlbGVtZW50RW52aXJvbm1lbnQuZ2V0TG9jYWxGdW5jdGlvblR5cGUoZnVuY3Rpb24pKTsKICAgICAgICBub2RlID0gbmV3IE1ldGhvZE5vZGUoZnVuY3Rpb24sIHBhcmFtZXRlclN0cnVjdHVyZSwgaXNDYWxsVGFyZ2V0OiB0cnVlKTsKICAgICAgfQogICAgICBfbm9kZXMuYWRkKG5vZGUpOwogICAgICByZXR1cm4gbm9kZTsKICAgIH0pOwogIH0KCiAgdm9pZCBfc2V0dXBEZXBlbmRlbmNpZXMoCiAgICAgIEVsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQsCiAgICAgIENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgICBXb3JsZEJ1aWxkZXIgd29ybGRCdWlsZGVyLAogICAgICBTZXQ8R2VuZXJpY0luc3RhbnRpYXRpb24+IGdlbmVyaWNJbnN0YW50aWF0aW9ucywKICAgICAge2Jvb2wgZm9yUnRpTmVlZHM6IHRydWV9KSB7CiAgICAvLy8gUmVnaXN0ZXIgdGhhdCBpZiBgbm9kZS5lbnRpdHlgIG5lZWRzIHR5cGUgYXJndW1lbnRzIHRoZW4gc28gZG8gZW50aXRpZXMKICAgIC8vLyB3aG9zZSB0eXBlIHZhcmlhYmxlcyBvY2N1ciBpbiBbdHlwZV0uCiAgICAvLy8KICAgIC8vLyBGb3IgaW5zdGFuY2UgaWYgYEFgIG5lZWRzIHR5cGUgYXJndW1lbnRzIHRoZW4gc28gZG9lcyBgQmAgaW46CiAgICAvLy8KICAgIC8vLyAgIGNsYXNzIEE8VD4ge30KICAgIC8vLyAgIGNsYXNzIEI8VD4geyBtKCkgPT4gbmV3IEE8VD4oKTsgfQogICAgLy8vCiAgICB2b2lkIHJlZ2lzdGVyRGVwZW5kZW5jaWVzKFJ0aU5vZGUgbm9kZSwgRGFydFR5cGUgdHlwZSkgewogICAgICB0eXBlLmZvckVhY2hUeXBlVmFyaWFibGUoKFR5cGVWYXJpYWJsZVR5cGUgdHlwZVZhcmlhYmxlKSB7CiAgICAgICAgRW50aXR5IHR5cGVEZWNsYXJhdGlvbiA9IHR5cGVWYXJpYWJsZS5lbGVtZW50LnR5cGVEZWNsYXJhdGlvbjsKICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uIGlzIENsYXNzRW50aXR5KSB7CiAgICAgICAgICBub2RlLmFkZERlcGVuZGVuY3koX2dldENsYXNzTm9kZSh0eXBlRGVjbGFyYXRpb24pKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbm9kZS5hZGREZXBlbmRlbmN5KF9nZXRNZXRob2ROb2RlKAogICAgICAgICAgICAgIGVsZW1lbnRFbnZpcm9ubWVudCwgd29ybGRCdWlsZGVyLCB0eXBlRGVjbGFyYXRpb24pKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIC8vIEFkZCB0aGUgcnRpIGRlcGVuZGVuY2llcyB0aGF0IGFyZSBpbXBsaWNpdCBpbiB0aGUgd2F5IHRoZSBiYWNrZW5kCiAgICAvLyBnZW5lcmF0ZXMgY29kZTogd2hlbiB3ZSBjcmVhdGUgYSBuZXcgW0xpc3RdLCB3ZSBhY3R1YWxseSBjcmVhdGUgYQogICAgLy8gW0pTQXJyYXldIGluIHRoZSBiYWNrZW5kIGFuZCB3ZSBuZWVkIHRvIGFkZCB0eXBlIGFyZ3VtZW50cyB0byB0aGUgY2FsbHMKICAgIC8vIG9mIHRoZSBsaXN0IGNvbnN0cnVjdG9yIHdoZW5ldmVyIHdlIGRldGVybWluZSB0aGF0IFtKU0FycmF5XSBuZWVkcyB0eXBlCiAgICAvLyBhcmd1bWVudHMuCiAgICAvLwogICAgLy8gVGhpcyBpcyBuZWVkIGZvciBpbnN0YW5jZSBmb3I6CiAgICAvLwogICAgLy8gICAgdmFyIGxpc3QgPSA8aW50PltdOwogICAgLy8gICAgdmFyIHNldCA9IGxpc3QudG9TZXQoKTsKICAgIC8vICAgIHNldCBpcyBTZXQ8U3RyaW5nPjsKICAgIC8vCiAgICAvLyBJdCBhbHNvIG9jY3VycyBmb3IgW01hcF0gdnMgW0pzTGlua2VkSGFzaE1hcF0gaW46CiAgICAvLwogICAgLy8gICAgdmFyIG1hcCA9IDxpbnQsIGRvdWJsZT57fTsKICAgIC8vICAgIHZhciBzZXQgPSBtYXAua2V5cy50b1NldCgpOwogICAgLy8gICAgc2V0IGlzIFNldDxTdHJpbmc+OwogICAgLy8KICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IE1ha2UgdGhpcyBkZXBlbmRlbmN5IHZpc2libGUgZnJvbSBjb2RlLCBwb3NzaWJseQogICAgLy8gdXNpbmcgZ2VuZXJpYyBtZXRob2RzLgogICAgaWYgKGNvbW1vbkVsZW1lbnRzLmpzQXJyYXlDbGFzcyAhPSBudWxsKSB7CiAgICAgIF9nZXRDbGFzc05vZGUoY29tbW9uRWxlbWVudHMuanNBcnJheUNsYXNzKQogICAgICAgICAgLmFkZERlcGVuZGVuY3koX2dldENsYXNzTm9kZShjb21tb25FbGVtZW50cy5saXN0Q2xhc3MpKTsKICAgIH0KICAgIGlmIChjb21tb25FbGVtZW50cy5zZXRMaXRlcmFsQ2xhc3MgIT0gbnVsbCkgewogICAgICBfZ2V0Q2xhc3NOb2RlKGNvbW1vbkVsZW1lbnRzLnNldExpdGVyYWxDbGFzcykKICAgICAgICAgIC5hZGREZXBlbmRlbmN5KF9nZXRDbGFzc05vZGUoY29tbW9uRWxlbWVudHMuc2V0Q2xhc3MpKTsKICAgIH0KICAgIGlmIChjb21tb25FbGVtZW50cy5tYXBMaXRlcmFsQ2xhc3MgIT0gbnVsbCkgewogICAgICBfZ2V0Q2xhc3NOb2RlKGNvbW1vbkVsZW1lbnRzLm1hcExpdGVyYWxDbGFzcykKICAgICAgICAgIC5hZGREZXBlbmRlbmN5KF9nZXRDbGFzc05vZGUoY29tbW9uRWxlbWVudHMubWFwQ2xhc3MpKTsKICAgIH0KCiAgICB2b2lkIHByb2Nlc3NDaGVja2VkVHlwZShEYXJ0VHlwZSB0eXBlKSB7CiAgICAgIGlmICh0eXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICAvLyBSZWdpc3RlciB0aGF0IGlmIFtjbHNdIG5lZWRzIHR5cGUgYXJndW1lbnRzIHRoZW4gc28gZG8gdGhlIGVudGl0aWVzCiAgICAgICAgLy8gdGhhdCBkZWNsYXJlIHR5cGUgdmFyaWFibGVzIG9jY3VycmluZyBpbiBbdHlwZV0uCiAgICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gdHlwZS5lbGVtZW50OwogICAgICAgIHJlZ2lzdGVyRGVwZW5kZW5jaWVzKF9nZXRDbGFzc05vZGUoY2xzKSwgdHlwZSk7CiAgICAgIH0KICAgICAgaWYgKHR5cGUgaXMgRnV0dXJlT3JUeXBlKSB7CiAgICAgICAgLy8gW3R5cGVdIGlzIGBGdXR1cmVPcjxYPmAuCgogICAgICAgIC8vIEZvciB0aGUgaW1wbGllZCBgaXMgRnV0dXJlPFg+YCB0ZXN0LCByZWdpc3RlciB0aGF0IGlmIGBGdXR1cmVgIG5lZWRzCiAgICAgICAgLy8gdHlwZSBhcmd1bWVudHMgdGhlbiBzbyBkbyB0aGUgZW50aXRpZXMgdGhhdCBkZWNsYXJlIHR5cGUgdmFyaWFibGVzCiAgICAgICAgLy8gb2NjdXJyaW5nIGluIGB0eXBlLnR5cGVBcmd1bWVudGAuCiAgICAgICAgcmVnaXN0ZXJEZXBlbmRlbmNpZXMoCiAgICAgICAgICAgIF9nZXRDbGFzc05vZGUoY29tbW9uRWxlbWVudHMuZnV0dXJlQ2xhc3MpLCB0eXBlLnR5cGVBcmd1bWVudCk7CiAgICAgICAgLy8gUHJvY2VzcyBgdHlwZS50eXBlQXJndW1lbnRgIGZvciB0aGUgaW1wbGllZCBgaXMgWGAgdGVzdC4KICAgICAgICBwcm9jZXNzQ2hlY2tlZFR5cGUodHlwZS50eXBlQXJndW1lbnQpOwogICAgICB9CiAgICB9CgogICAgd29ybGRCdWlsZGVyLmlzQ2hlY2tzLmZvckVhY2gocHJvY2Vzc0NoZWNrZWRUeXBlKTsKCiAgICB3b3JsZEJ1aWxkZXIuaW5zdGFudGlhdGVkVHlwZXMuZm9yRWFjaCgoSW50ZXJmYWNlVHlwZSB0eXBlKSB7CiAgICAgIC8vIFJlZ2lzdGVyIHRoYXQgaWYgW2Nsc10gbmVlZHMgdHlwZSBhcmd1bWVudHMgdGhlbiBzbyBkbyB0aGUgZW50aXRpZXMKICAgICAgLy8gdGhhdCBkZWNsYXJlIHR5cGUgdmFyaWFibGVzIG9jY3VycmluZyBpbiBbdHlwZV0uCiAgICAgIENsYXNzRW50aXR5IGNscyA9IHR5cGUuZWxlbWVudDsKICAgICAgcmVnaXN0ZXJEZXBlbmRlbmNpZXMoX2dldENsYXNzTm9kZShjbHMpLCB0eXBlKTsKICAgIH0pOwoKICAgIHdvcmxkQnVpbGRlci5mb3JFYWNoU3RhdGljVHlwZUFyZ3VtZW50KAogICAgICAgIChFbnRpdHkgZW50aXR5LCBJdGVyYWJsZTxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykgewogICAgICBmb3IgKERhcnRUeXBlIHR5cGUgaW4gdHlwZUFyZ3VtZW50cykgewogICAgICAgIC8vIFJlZ2lzdGVyIHRoYXQgaWYgW2VudGl0eV0gbmVlZHMgdHlwZSBhcmd1bWVudHMgdGhlbiBzbyBkbyB0aGUKICAgICAgICAvLyBlbnRpdGllcyB0aGF0IGRlY2xhcmUgdHlwZSB2YXJpYWJsZXMgb2NjdXJyaW5nIGluIFt0eXBlXS4KICAgICAgICByZWdpc3RlckRlcGVuZGVuY2llcygKICAgICAgICAgICAgX2dldE1ldGhvZE5vZGUoZWxlbWVudEVudmlyb25tZW50LCB3b3JsZEJ1aWxkZXIsIGVudGl0eSksIHR5cGUpOwogICAgICB9CiAgICB9KTsKCiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDYWNoZWQgaGVyZSBiZWNhdXNlIHRoZSB3b3JsZCBidWlsZGVycyBjb21wdXRlcwogICAgLy8gdGhpcyBsYXppbHkuIFRyYWNrIHRoaXMgc2V0IGRpcmVjdGx5IGluIHRoZSB3b3JsZCBidWlsZGVycyAuCiAgICBJdGVyYWJsZTxGdW5jdGlvbkVudGl0eT4gZ2VuZXJpY0luc3RhbmNlTWV0aG9kcyA9CiAgICAgICAgd29ybGRCdWlsZGVyLmdlbmVyaWNJbnN0YW5jZU1ldGhvZHM7CiAgICB3b3JsZEJ1aWxkZXIuZm9yRWFjaER5bmFtaWNUeXBlQXJndW1lbnQoCiAgICAgICAgKFNlbGVjdG9yIHNlbGVjdG9yLCBJdGVyYWJsZTxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykgewogICAgICB2b2lkIHByb2Nlc3NFbnRpdHkoRW50aXR5IGVudGl0eSkgewogICAgICAgIE1ldGhvZE5vZGUgbm9kZSA9CiAgICAgICAgICAgIF9nZXRNZXRob2ROb2RlKGVsZW1lbnRFbnZpcm9ubWVudCwgd29ybGRCdWlsZGVyLCBlbnRpdHkpOwogICAgICAgIGlmIChub2RlLnNlbGVjdG9yQXBwbGllcyhzZWxlY3RvcikpIHsKICAgICAgICAgIGZvciAoRGFydFR5cGUgdHlwZSBpbiB0eXBlQXJndW1lbnRzKSB7CiAgICAgICAgICAgIC8vIFJlZ2lzdGVyIHRoYXQgaWYgYG5vZGUuZW50aXR5YCBuZWVkcyB0eXBlIGFyZ3VtZW50cyB0aGVuIHNvIGRvCiAgICAgICAgICAgIC8vIHRoZSBlbnRpdGllcyB0aGF0IGRlY2xhcmUgdHlwZSB2YXJpYWJsZXMgb2NjdXJyaW5nIGluIFt0eXBlXS4KICAgICAgICAgICAgcmVnaXN0ZXJEZXBlbmRlbmNpZXMobm9kZSwgdHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBnZW5lcmljSW5zdGFuY2VNZXRob2RzLmZvckVhY2gocHJvY2Vzc0VudGl0eSk7CiAgICAgIHdvcmxkQnVpbGRlci5nZW5lcmljTG9jYWxGdW5jdGlvbnMuZm9yRWFjaChwcm9jZXNzRW50aXR5KTsKICAgICAgd29ybGRCdWlsZGVyLmNsb3N1cml6ZWRTdGF0aWNzLmZvckVhY2gocHJvY2Vzc0VudGl0eSk7CiAgICAgIHdvcmxkQnVpbGRlci51c2VyTm9TdWNoTWV0aG9kcy5mb3JFYWNoKHByb2Nlc3NFbnRpdHkpOwogICAgfSk7CgogICAgZm9yIChHZW5lcmljSW5zdGFudGlhdGlvbiBpbnN0YW50aWF0aW9uIGluIGdlbmVyaWNJbnN0YW50aWF0aW9ucykgewogICAgICB2b2lkIHByb2Nlc3NFbnRpdHkoRW50aXR5IGVudGl0eSkgewogICAgICAgIE1ldGhvZE5vZGUgbm9kZSA9CiAgICAgICAgICAgIF9nZXRNZXRob2ROb2RlKGVsZW1lbnRFbnZpcm9ubWVudCwgd29ybGRCdWlsZGVyLCBlbnRpdHkpOwogICAgICAgIGlmIChub2RlLnBhcmFtZXRlclN0cnVjdHVyZS50eXBlUGFyYW1ldGVycyA9PQogICAgICAgICAgICBpbnN0YW50aWF0aW9uLnR5cGVBcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICBpZiAoZm9yUnRpTmVlZHMpIHsKICAgICAgICAgICAgX2luc3RhbnRpYXRpb25NYXAgPz89IDxHZW5lcmljSW5zdGFudGlhdGlvbiwgU2V0PEVudGl0eT4+e307CiAgICAgICAgICAgIF9pbnN0YW50aWF0aW9uTWFwCiAgICAgICAgICAgICAgICAucHV0SWZBYnNlbnQoaW5zdGFudGlhdGlvbiwgKCkgPT4gbmV3IFNldDxFbnRpdHk+KCkpCiAgICAgICAgICAgICAgICAuYWRkKGVudGl0eSk7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKERhcnRUeXBlIHR5cGUgaW4gaW5zdGFudGlhdGlvbi50eXBlQXJndW1lbnRzKSB7CiAgICAgICAgICAgIC8vIFJlZ2lzdGVyIHRoYXQgaWYgYG5vZGUuZW50aXR5YCBuZWVkcyB0eXBlIGFyZ3VtZW50cyB0aGVuIHNvIGRvCiAgICAgICAgICAgIC8vIHRoZSBlbnRpdGllcyB0aGF0IGRlY2xhcmUgdHlwZSB2YXJpYWJsZXMgb2NjdXJyaW5nIGluIFt0eXBlXS4KICAgICAgICAgICAgcmVnaXN0ZXJEZXBlbmRlbmNpZXMobm9kZSwgdHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICB3b3JsZEJ1aWxkZXIuY2xvc3VyaXplZE1lbWJlcnMuZm9yRWFjaChwcm9jZXNzRW50aXR5KTsKICAgICAgd29ybGRCdWlsZGVyLmNsb3N1cml6ZWRTdGF0aWNzLmZvckVhY2gocHJvY2Vzc0VudGl0eSk7CiAgICAgIHdvcmxkQnVpbGRlci5nZW5lcmljTG9jYWxGdW5jdGlvbnMuZm9yRWFjaChwcm9jZXNzRW50aXR5KTsKICAgIH0KICB9CgogIHZvaWQgX3Byb3BhZ2F0ZVRlc3RzKENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgICBFbGVtZW50RW52aXJvbm1lbnQgZWxlbWVudEVudmlyb25tZW50LCBXb3JsZEJ1aWxkZXIgd29ybGRCdWlsZGVyKSB7CiAgICB2b2lkIHByb2Nlc3NUeXBlVmFyaWFibGVUeXBlKFR5cGVWYXJpYWJsZVR5cGUgdHlwZSwge2Jvb2wgZGlyZWN0OiB0cnVlfSkgewogICAgICBUeXBlVmFyaWFibGVFbnRpdHkgdmFyaWFibGUgPSB0eXBlLmVsZW1lbnQ7CiAgICAgIGlmICh2YXJpYWJsZS50eXBlRGVjbGFyYXRpb24gaXMgQ2xhc3NFbnRpdHkpIHsKICAgICAgICBfZ2V0Q2xhc3NOb2RlKHZhcmlhYmxlLnR5cGVEZWNsYXJhdGlvbikubWFya1Rlc3QoZGlyZWN0OiBkaXJlY3QpOwogICAgICB9IGVsc2UgewogICAgICAgIF9nZXRNZXRob2ROb2RlKAogICAgICAgICAgICAgICAgZWxlbWVudEVudmlyb25tZW50LCB3b3JsZEJ1aWxkZXIsIHZhcmlhYmxlLnR5cGVEZWNsYXJhdGlvbikKICAgICAgICAgICAgLm1hcmtUZXN0KGRpcmVjdDogZGlyZWN0KTsKICAgICAgfQogICAgfQoKICAgIHZvaWQgcHJvY2Vzc1R5cGUoRGFydFR5cGUgdHlwZSwge2Jvb2wgZGlyZWN0OiB0cnVlfSkgewogICAgICBpZiAodHlwZSBpcyBGdXR1cmVPclR5cGUpIHsKICAgICAgICBfZ2V0Q2xhc3NOb2RlKGNvbW1vbkVsZW1lbnRzLmZ1dHVyZUNsYXNzKS5tYXJrSW5kaXJlY3RUZXN0KCk7CiAgICAgICAgcHJvY2Vzc1R5cGUodHlwZS50eXBlQXJndW1lbnQsIGRpcmVjdDogZmFsc2UpOwogICAgICB9IGVsc2UgewogICAgICAgIHR5cGUuZm9yRWFjaFR5cGVWYXJpYWJsZSgoVHlwZVZhcmlhYmxlVHlwZSB0eXBlKSB7CiAgICAgICAgICBwcm9jZXNzVHlwZVZhcmlhYmxlVHlwZSh0eXBlLCBkaXJlY3Q6IGRpcmVjdCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KCiAgICB3b3JsZEJ1aWxkZXIuaXNDaGVja3MuZm9yRWFjaChwcm9jZXNzVHlwZSk7CiAgfQoKICB2b2lkIF9wcm9wYWdhdGVMaXRlcmFscygKICAgICAgRWxlbWVudEVudmlyb25tZW50IGVsZW1lbnRFbnZpcm9ubWVudCwgV29ybGRCdWlsZGVyIHdvcmxkQnVpbGRlcikgewogICAgd29ybGRCdWlsZGVyLnR5cGVWYXJpYWJsZVR5cGVMaXRlcmFscwogICAgICAgIC5mb3JFYWNoKChUeXBlVmFyaWFibGVUeXBlIHR5cGVWYXJpYWJsZVR5cGUpIHsKICAgICAgVHlwZVZhcmlhYmxlRW50aXR5IHZhcmlhYmxlID0gdHlwZVZhcmlhYmxlVHlwZS5lbGVtZW50OwogICAgICBpZiAodmFyaWFibGUudHlwZURlY2xhcmF0aW9uIGlzIENsYXNzRW50aXR5KSB7CiAgICAgICAgX2dldENsYXNzTm9kZSh2YXJpYWJsZS50eXBlRGVjbGFyYXRpb24pLm1hcmtEaXJlY3RMaXRlcmFsKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2dldE1ldGhvZE5vZGUoCiAgICAgICAgICAgICAgICBlbGVtZW50RW52aXJvbm1lbnQsIHdvcmxkQnVpbGRlciwgdmFyaWFibGUudHlwZURlY2xhcmF0aW9uKQogICAgICAgICAgICAubWFya0RpcmVjdExpdGVyYWwoKTsKICAgICAgfQogICAgfSk7CiAgfQoKICB2b2lkIF9jb2xsZWN0UmVzdWx0cygKICAgICAgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIEVsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQsCiAgICAgIERhcnRUeXBlcyB0eXBlcywKICAgICAgV29ybGRCdWlsZGVyIHdvcmxkQnVpbGRlciwKICAgICAge2Jvb2wgZm9yUnRpTmVlZHM6IHRydWV9KSB7CiAgICAvLy8gUmVnaXN0ZXIgdGhlIGltcGxpY2l0IGlzLXRlc3Qgb2YgW3R5cGVdLgogICAgLy8vCiAgICAvLy8gSWYgW3R5cGVdIGlzIG9mIHRoZSBmb3JtIGBGdXR1cmVPcjxYPmAsIGFsc28gcmVnaXN0ZXIgdGhlIGltcGxpY2l0CiAgICAvLy8gaXMtdGVzdHMgb2YgYEZ1dHVyZTxYPmAgYW5kIGBYYC4KICAgIHZvaWQgYWRkSW1wbGljaXRDaGVjayhEYXJ0VHlwZSB0eXBlKSB7CiAgICAgIGlmIChpbXBsaWNpdElzQ2hlY2tzLmFkZCh0eXBlKSkgewogICAgICAgIGlmICh0eXBlIGlzIEZ1dHVyZU9yVHlwZSkgewogICAgICAgICAgYWRkSW1wbGljaXRDaGVjayhjb21tb25FbGVtZW50cy5mdXR1cmVUeXBlKHR5cGUudHlwZUFyZ3VtZW50KSk7CiAgICAgICAgICBhZGRJbXBsaWNpdENoZWNrKHR5cGUudHlwZUFyZ3VtZW50KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICB2b2lkIGFkZEltcGxpY2l0Q2hlY2tzKEl0ZXJhYmxlPERhcnRUeXBlPiB0eXBlcykgewogICAgICB0eXBlcy5mb3JFYWNoKGFkZEltcGxpY2l0Q2hlY2spOwogICAgfQoKICAgIHdvcmxkQnVpbGRlci5pc0NoZWNrcy5mb3JFYWNoKChEYXJ0VHlwZSB0eXBlKSB7CiAgICAgIGlmICh0eXBlIGlzIEZ1dHVyZU9yVHlwZSkgewogICAgICAgIGFkZEltcGxpY2l0Q2hlY2soY29tbW9uRWxlbWVudHMuZnV0dXJlVHlwZSh0eXBlLnR5cGVBcmd1bWVudCkpOwogICAgICAgIGFkZEltcGxpY2l0Q2hlY2sodHlwZS50eXBlQXJndW1lbnQpOwogICAgICB9CiAgICB9KTsKCiAgICAvLyBDb21wdXRlIHR5cGUgYXJndW1lbnRzIG9mIGNsYXNzZXMgdGhhdCB1c2Ugb25lIG9mIHRoZWlyIHR5cGUgdmFyaWFibGVzIGluCiAgICAvLyBpcy1jaGVja3MgYW5kIGFkZCB0aGUgaXMtY2hlY2tzIHRoYXQgdGhleSBpbXBseS4KICAgIF9jbGFzc2VzLmZvckVhY2goKENsYXNzRW50aXR5IGNscywgQ2xhc3NOb2RlIG5vZGUpIHsKICAgICAgaWYgKCFub2RlLmhhc1Rlc3QpIHJldHVybjsKICAgICAgLy8gRmluZCBhbGwgaW5zdGFudGlhdGVkIHR5cGVzIHRoYXQgYXJlIGEgc3VidHlwZSBvZiBhIGNsYXNzIHRoYXQgdXNlcwogICAgICAvLyBvbmUgb2YgaXRzIHR5cGUgYXJndW1lbnRzIGluIGFuIGlzLWNoZWNrIGFuZCBhZGQgdGhlIGFyZ3VtZW50cyB0byB0aGUKICAgICAgLy8gc2V0IG9mIGlzLWNoZWNrcy4KICAgICAgZm9yIChJbnRlcmZhY2VUeXBlIHR5cGUgaW4gd29ybGRCdWlsZGVyLmluc3RhbnRpYXRlZFR5cGVzKSB7CiAgICAgICAgLy8gV2UgbmVlZCB0aGUgdHlwZSBhcyBpbnN0YW5jZSBvZiBpdHMgc3VwZXJjbGFzcyBhbnl3YXksIHNvIHdlIGp1c3QKICAgICAgICAvLyB0cnkgdG8gY29tcHV0ZSB0aGUgc3Vic3RpdHV0aW9uOyBpZiB0aGUgcmVzdWx0IGlzIFs6bnVsbDpdLCB0aGUKICAgICAgICAvLyBjbGFzc2VzIGFyZSBub3QgcmVsYXRlZC4KICAgICAgICBJbnRlcmZhY2VUeXBlIGluc3RhbmNlID0gdHlwZXMuYXNJbnN0YW5jZU9mKHR5cGUsIGNscyk7CiAgICAgICAgaWYgKGluc3RhbmNlICE9IG51bGwpIHsKICAgICAgICAgIGZvciAoRGFydFR5cGUgYXJndW1lbnQgaW4gaW5zdGFuY2UudHlwZUFyZ3VtZW50cykgewogICAgICAgICAgICBhZGRJbXBsaWNpdENoZWNrKGFyZ3VtZW50LnVuYWxpYXNlZCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKCiAgICB3b3JsZEJ1aWxkZXIuZm9yRWFjaFN0YXRpY1R5cGVBcmd1bWVudCgKICAgICAgICAoRW50aXR5IGZ1bmN0aW9uLCBJdGVyYWJsZTxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykgewogICAgICBpZiAoIV9nZXRNZXRob2ROb2RlKGVsZW1lbnRFbnZpcm9ubWVudCwgd29ybGRCdWlsZGVyLCBmdW5jdGlvbikuaGFzVGVzdCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBhZGRJbXBsaWNpdENoZWNrcyh0eXBlQXJndW1lbnRzKTsKICAgIH0pOwoKICAgIGlmIChmb3JSdGlOZWVkcykgewogICAgICBfYXBwbGllZFNlbGVjdG9yTWFwID0gPFNlbGVjdG9yLCBTZXQ8RW50aXR5Pj57fTsKICAgIH0KCiAgICB3b3JsZEJ1aWxkZXIuZm9yRWFjaER5bmFtaWNUeXBlQXJndW1lbnQoCiAgICAgICAgKFNlbGVjdG9yIHNlbGVjdG9yLCBJdGVyYWJsZTxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykgewogICAgICBmb3IgKE1ldGhvZE5vZGUgbm9kZSBpbiBfbWV0aG9kcy52YWx1ZXMpIHsKICAgICAgICBpZiAobm9kZS5zZWxlY3RvckFwcGxpZXMoc2VsZWN0b3IpKSB7CiAgICAgICAgICBpZiAoZm9yUnRpTmVlZHMpIHsKICAgICAgICAgICAgX2FwcGxpZWRTZWxlY3Rvck1hcAogICAgICAgICAgICAgICAgLnB1dElmQWJzZW50KHNlbGVjdG9yLCAoKSA9PiBuZXcgU2V0PEVudGl0eT4oKSkKICAgICAgICAgICAgICAgIC5hZGQobm9kZS5lbnRpdHkpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG5vZGUuaGFzVGVzdCkgewogICAgICAgICAgICBhZGRJbXBsaWNpdENoZWNrcyh0eXBlQXJndW1lbnRzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgU3RyaW5nIGR1bXAoe2Jvb2wgdmVyYm9zZTogZmFsc2V9KSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CgogICAgdm9pZCBhZGROb2RlKFJ0aU5vZGUgbm9kZSkgewogICAgICBpZiAobm9kZS5oYXNVc2UgfHwgbm9kZS5kZXBlbmRlbmNpZXMuaXNOb3RFbXB0eSB8fCB2ZXJib3NlKSB7CiAgICAgICAgc2Iud3JpdGUoJyAkbm9kZScpOwogICAgICAgIFN0cmluZyBjb21tYSA9ICcnOwogICAgICAgIGlmIChub2RlLl90ZXN0U3RhdGUgJiAxICE9IDApIHsKICAgICAgICAgIHNiLndyaXRlKCcgZGlyZWN0IHRlc3QnKTsKICAgICAgICAgIGNvbW1hID0gJywnOwogICAgICAgIH0KICAgICAgICBpZiAobm9kZS5fdGVzdFN0YXRlICYgMiAhPSAwKSB7CiAgICAgICAgICBzYi53cml0ZSgnJGNvbW1hIGluZGlyZWN0IHRlc3QnKTsKICAgICAgICAgIGNvbW1hID0gJywnOwogICAgICAgIH0KICAgICAgICBpZiAobm9kZS5fbGl0ZXJhbFN0YXRlICYgMSAhPSAwKSB7CiAgICAgICAgICBzYi53cml0ZSgnJGNvbW1hIGRpcmVjdCBsaXRlcmFsJyk7CiAgICAgICAgICBjb21tYSA9ICcsJzsKICAgICAgICB9CiAgICAgICAgaWYgKG5vZGUuX2xpdGVyYWxTdGF0ZSAmIDIgIT0gMCkgewogICAgICAgICAgc2Iud3JpdGUoJyRjb21tYSBpbmRpcmVjdCBsaXRlcmFsJyk7CiAgICAgICAgICBjb21tYSA9ICcsJzsKICAgICAgICB9CiAgICAgICAgaWYgKG5vZGUuZGVwZW5kZW5jaWVzLmlzTm90RW1wdHkgfHwgdmVyYm9zZSkgewogICAgICAgICAgc2Iud3JpdGVsbignOicpOwogICAgICAgICAgbm9kZS5kZXBlbmRlbmNpZXMuZm9yRWFjaCgobikgPT4gc2Iud3JpdGVsbignICAkbicpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2Iud3JpdGVsbigpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHZvaWQgYWRkVHlwZShEYXJ0VHlwZSB0eXBlKSB7CiAgICAgIHNiLndyaXRlbG4oJyAkdHlwZScpOwogICAgfQoKICAgIHNiLndyaXRlbG4oJ2NsYXNzZXM6Jyk7CiAgICBfY2xhc3Nlcy52YWx1ZXMuZm9yRWFjaChhZGROb2RlKTsKICAgIHNiLndyaXRlbG4oJ21ldGhvZHM6Jyk7CiAgICBfbWV0aG9kcy52YWx1ZXMuZm9yRWFjaChhZGROb2RlKTsKICAgIHNiLndyaXRlbG4oJ2V4cGxpY2l0IGlzLXRlc3RzOicpOwogICAgZXhwbGljaXRJc0NoZWNrcy5mb3JFYWNoKGFkZFR5cGUpOwogICAgc2Iud3JpdGVsbignaW1wbGljaXQgaXMtdGVzdHM6Jyk7CiAgICBpbXBsaWNpdElzQ2hlY2tzLmZvckVhY2goYWRkVHlwZSk7CgogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBSdGlOb2RlIHsKICBFbnRpdHkgZ2V0IGVudGl0eTsKICBTZXQ8UnRpTm9kZT4gX2RlcGVuZGVuY2llczsKICBpbnQgX3Rlc3RTdGF0ZSA9IDA7CiAgaW50IF9saXRlcmFsU3RhdGUgPSAwOwoKICBJdGVyYWJsZTxSdGlOb2RlPiBnZXQgZGVwZW5kZW5jaWVzID0+IF9kZXBlbmRlbmNpZXMgPz8gY29uc3QgPFJ0aU5vZGU+W107CgogIGJvb2wgZ2V0IGhhc0RpcmVjdFRlc3QgPT4gX3Rlc3RTdGF0ZSAmIDEgIT0gMDsKICBib29sIGdldCBoYXNJbmRpcmVjdFRlc3QgPT4gX3Rlc3RTdGF0ZSAmIDIgIT0gMDsKCiAgYm9vbCBnZXQgaGFzVGVzdCA9PiBfdGVzdFN0YXRlICE9IDA7CgogIGJvb2wgZ2V0IGhhc0RpcmVjdExpdGVyYWwgPT4gX2xpdGVyYWxTdGF0ZSAmIDEgIT0gMDsKICBib29sIGdldCBoYXNJbmRpcmVjdExpdGVyYWwgPT4gX2xpdGVyYWxTdGF0ZSAmIDIgIT0gMDsKCiAgYm9vbCBnZXQgaGFzTGl0ZXJhbCA9PiBfbGl0ZXJhbFN0YXRlICE9IDA7CgogIGJvb2wgZ2V0IGhhc1VzZSA9PiBoYXNUZXN0IHx8IGhhc0xpdGVyYWw7CgogIC8vLyBSZWdpc3RlciB0aGF0IGlmIFtlbnRpdHldIG5lZWRzIHR5cGUgYXJndW1lbnRzIHRoZW4gc28gZG9lcyBgbm9kZS5lbnRpdHlgLgogIGJvb2wgYWRkRGVwZW5kZW5jeShSdGlOb2RlIG5vZGUpIHsKICAgIGlmIChlbnRpdHkgPT0gbm9kZS5lbnRpdHkpIHsKICAgICAgLy8gU2tpcCB0cml2aWFsIGRlcGVuZGVuY2llczsgaWYgW2VudGl0eV0gbmVlZHMgdHlwZSBhcmd1bWVudHMgc28gZG9lcwogICAgICAvLyBbZW50aXR5XSEKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgX2RlcGVuZGVuY2llcyA/Pz0gbmV3IFNldDxSdGlOb2RlPigpOwogICAgcmV0dXJuIF9kZXBlbmRlbmNpZXMuYWRkKG5vZGUpOwogIH0KCiAgdm9pZCBtYXJrVGVzdCh7Ym9vbCBkaXJlY3R9KSB7CiAgICBzZXRUZXN0U3RhdGUoZGlyZWN0ID8gMSA6IDIpOwogIH0KCiAgdm9pZCBtYXJrRGlyZWN0VGVzdCgpIHsKICAgIHNldFRlc3RTdGF0ZSgxKTsKICB9CgogIHZvaWQgbWFya0luZGlyZWN0VGVzdCgpIHsKICAgIHNldFRlc3RTdGF0ZSgyKTsKICB9CgogIHZvaWQgc2V0VGVzdFN0YXRlKGludCB2YWx1ZSkgewogICAgaWYgKF90ZXN0U3RhdGUgIT0gdmFsdWUpIHsKICAgICAgaWYgKF90ZXN0U3RhdGUgPT0gMCkgewogICAgICAgIF90ZXN0U3RhdGUgfD0gdmFsdWU7CiAgICAgICAgaWYgKF9kZXBlbmRlbmNpZXMgIT0gbnVsbCkgewogICAgICAgICAgZm9yIChSdGlOb2RlIG5vZGUgaW4gX2RlcGVuZGVuY2llcykgewogICAgICAgICAgICBub2RlLm1hcmtJbmRpcmVjdFRlc3QoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX3Rlc3RTdGF0ZSA9IHZhbHVlOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIG1hcmtEaXJlY3RMaXRlcmFsKCkgewogICAgc2V0TGl0ZXJhbFN0YXRlKDEpOwogIH0KCiAgdm9pZCBtYXJrSW5kaXJlY3RMaXRlcmFsKCkgewogICAgc2V0TGl0ZXJhbFN0YXRlKDIpOwogIH0KCiAgdm9pZCBzZXRMaXRlcmFsU3RhdGUoaW50IHZhbHVlKSB7CiAgICBpZiAoX2xpdGVyYWxTdGF0ZSAhPSB2YWx1ZSkgewogICAgICBpZiAoX2xpdGVyYWxTdGF0ZSA9PSAwKSB7CiAgICAgICAgX2xpdGVyYWxTdGF0ZSB8PSB2YWx1ZTsKICAgICAgICBpZiAoX2RlcGVuZGVuY2llcyAhPSBudWxsKSB7CiAgICAgICAgICBmb3IgKFJ0aU5vZGUgbm9kZSBpbiBfZGVwZW5kZW5jaWVzKSB7CiAgICAgICAgICAgIG5vZGUubWFya0luZGlyZWN0TGl0ZXJhbCgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBfbGl0ZXJhbFN0YXRlID0gdmFsdWU7CiAgICAgIH0KICAgIH0KICB9CgogIFN0cmluZyBnZXQga2luZDsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoa2luZCk7CiAgICBzYi53cml0ZSgnOicpOwogICAgc2Iud3JpdGUoZW50aXR5KTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQoKY2xhc3MgQ2xhc3NOb2RlIGV4dGVuZHMgUnRpTm9kZSB7CiAgZmluYWwgQ2xhc3NFbnRpdHkgY2xzOwoKICBDbGFzc05vZGUodGhpcy5jbHMpOwoKICBAb3ZlcnJpZGUKICBFbnRpdHkgZ2V0IGVudGl0eSA9PiBjbHM7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQga2luZCA9PiAnY2xhc3MnOwp9CgpjbGFzcyBNZXRob2ROb2RlIGV4dGVuZHMgUnRpTm9kZSB7CiAgZmluYWwgRW50aXR5IGZ1bmN0aW9uOwogIGZpbmFsIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmU7CiAgZmluYWwgYm9vbCBpc0NhbGxUYXJnZXQ7CiAgZmluYWwgTmFtZSBpbnN0YW5jZU5hbWU7CiAgZmluYWwgYm9vbCBpc05vU3VjaE1ldGhvZDsKCiAgTWV0aG9kTm9kZSh0aGlzLmZ1bmN0aW9uLCB0aGlzLnBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAge3RoaXMuaXNDYWxsVGFyZ2V0LCB0aGlzLmluc3RhbmNlTmFtZSwgdGhpcy5pc05vU3VjaE1ldGhvZDogZmFsc2V9KTsKCiAgQG92ZXJyaWRlCiAgRW50aXR5IGdldCBlbnRpdHkgPT4gZnVuY3Rpb247CgogIGJvb2wgc2VsZWN0b3JBcHBsaWVzKFNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICBpZiAoaXNOb1N1Y2hNZXRob2QpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIChpc0NhbGxUYXJnZXQgJiYgc2VsZWN0b3IuaXNDbG9zdXJlQ2FsbCB8fAogICAgICAgICAgICBpbnN0YW5jZU5hbWUgPT0gc2VsZWN0b3IubWVtYmVyTmFtZSkgJiYKICAgICAgICBzZWxlY3Rvci5jYWxsU3RydWN0dXJlLnNpZ25hdHVyZUFwcGxpZXMocGFyYW1ldGVyU3RydWN0dXJlKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQga2luZCA9PiAnbWV0aG9kJzsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJ01ldGhvZE5vZGUoJyk7CiAgICBzYi53cml0ZSgnZnVuY3Rpb249JGZ1bmN0aW9uJyk7CiAgICBzYi53cml0ZSgnLHBhcmFtZXRlclN0cnVjdHVyZT0kcGFyYW1ldGVyU3RydWN0dXJlJyk7CiAgICBzYi53cml0ZSgnLGlzQ2FsbFRhcmdldD0kaXNDYWxsVGFyZ2V0Jyk7CiAgICBzYi53cml0ZSgnLGluc3RhbmNlTmFtZT0kaW5zdGFuY2VOYW1lJyk7CiAgICBzYi53cml0ZSgnKScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgpjbGFzcyBSdW50aW1lVHlwZXNOZWVkQnVpbGRlckltcGwgZXh0ZW5kcyBfUnVudGltZVR5cGVzQmFzZQogICAgaW1wbGVtZW50cyBSdW50aW1lVHlwZXNOZWVkQnVpbGRlciB7CiAgZmluYWwgRWxlbWVudEVudmlyb25tZW50IF9lbGVtZW50RW52aXJvbm1lbnQ7CgogIGZpbmFsIFNldDxDbGFzc0VudGl0eT4gY2xhc3Nlc1VzaW5nVHlwZVZhcmlhYmxlTGl0ZXJhbHMgPQogICAgICBuZXcgU2V0PENsYXNzRW50aXR5PigpOwoKICBmaW5hbCBTZXQ8RnVuY3Rpb25FbnRpdHk+IG1ldGhvZHNVc2luZ1R5cGVWYXJpYWJsZUxpdGVyYWxzID0KICAgICAgbmV3IFNldDxGdW5jdGlvbkVudGl0eT4oKTsKCiAgZmluYWwgU2V0PExvY2FsPiBsb2NhbEZ1bmN0aW9uc1VzaW5nVHlwZVZhcmlhYmxlTGl0ZXJhbHMgPSBuZXcgU2V0PExvY2FsPigpOwoKICBNYXA8U2VsZWN0b3IsIFNldDxFbnRpdHk+PiBzZWxlY3RvcnNOZWVkaW5nVHlwZUFyZ3VtZW50c0ZvclRlc3Rpbmc7CgogIE1hcDxHZW5lcmljSW5zdGFudGlhdGlvbiwgU2V0PEVudGl0eT4+CiAgICAgIGluc3RhbnRpYXRpb25zTmVlZGluZ1R5cGVBcmd1bWVudHNGb3JUZXN0aW5nOwoKICBmaW5hbCBTZXQ8R2VuZXJpY0luc3RhbnRpYXRpb24+IF9nZW5lcmljSW5zdGFudGlhdGlvbnMgPQogICAgICBuZXcgU2V0PEdlbmVyaWNJbnN0YW50aWF0aW9uPigpOwoKICBUeXBlVmFyaWFibGVUZXN0cyB0eXBlVmFyaWFibGVUZXN0c0ZvclRlc3Rpbmc7CgogIFJ1bnRpbWVUeXBlc05lZWRCdWlsZGVySW1wbCh0aGlzLl9lbGVtZW50RW52aXJvbm1lbnQsIERhcnRUeXBlcyB0eXBlcykKICAgICAgOiBzdXBlcih0eXBlcyk7CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJDbGFzc1VzaW5nVHlwZVZhcmlhYmxlTGl0ZXJhbChDbGFzc0VudGl0eSBjbHMpIHsKICAgIGNsYXNzZXNVc2luZ1R5cGVWYXJpYWJsZUxpdGVyYWxzLmFkZChjbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck1ldGhvZFVzaW5nVHlwZVZhcmlhYmxlTGl0ZXJhbChGdW5jdGlvbkVudGl0eSBtZXRob2QpIHsKICAgIG1ldGhvZHNVc2luZ1R5cGVWYXJpYWJsZUxpdGVyYWxzLmFkZChtZXRob2QpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckxvY2FsRnVuY3Rpb25Vc2luZ1R5cGVWYXJpYWJsZUxpdGVyYWwoTG9jYWwgbG9jYWxGdW5jdGlvbikgewogICAgbG9jYWxGdW5jdGlvbnNVc2luZ1R5cGVWYXJpYWJsZUxpdGVyYWxzLmFkZChsb2NhbEZ1bmN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJHZW5lcmljSW5zdGFudGlhdGlvbihHZW5lcmljSW5zdGFudGlhdGlvbiBpbnN0YW50aWF0aW9uKSB7CiAgICBfZ2VuZXJpY0luc3RhbnRpYXRpb25zLmFkZChpbnN0YW50aWF0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIFJ1bnRpbWVUeXBlc05lZWQgY29tcHV0ZVJ1bnRpbWVUeXBlc05lZWQoCiAgICAgIFJlc29sdXRpb25Xb3JsZEJ1aWxkZXIgcmVzb2x1dGlvbldvcmxkQnVpbGRlciwKICAgICAgS0Nsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucykgewogICAgVHlwZVZhcmlhYmxlVGVzdHMgdHlwZVZhcmlhYmxlVGVzdHMgPSBuZXcgVHlwZVZhcmlhYmxlVGVzdHMoCiAgICAgICAgY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50LAogICAgICAgIGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLAogICAgICAgIGNsb3NlZFdvcmxkLmRhcnRUeXBlcywKICAgICAgICByZXNvbHV0aW9uV29ybGRCdWlsZGVyLAogICAgICAgIF9nZW5lcmljSW5zdGFudGlhdGlvbnMpOwogICAgU2V0PENsYXNzRW50aXR5PiBjbGFzc2VzTmVlZGluZ1R5cGVBcmd1bWVudHMgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwogICAgU2V0PEZ1bmN0aW9uRW50aXR5PiBtZXRob2RzTmVlZGluZ1NpZ25hdHVyZSA9IG5ldyBTZXQ8RnVuY3Rpb25FbnRpdHk+KCk7CiAgICBTZXQ8RnVuY3Rpb25FbnRpdHk+IG1ldGhvZHNOZWVkaW5nVHlwZUFyZ3VtZW50cyA9IG5ldyBTZXQ8RnVuY3Rpb25FbnRpdHk+KCk7CiAgICBTZXQ8TG9jYWw+IGxvY2FsRnVuY3Rpb25zTmVlZGluZ1NpZ25hdHVyZSA9IG5ldyBTZXQ8TG9jYWw+KCk7CiAgICBTZXQ8TG9jYWw+IGxvY2FsRnVuY3Rpb25zTmVlZGluZ1R5cGVBcmd1bWVudHMgPSBuZXcgU2V0PExvY2FsPigpOwogICAgU2V0PEVudGl0eT4gcHJvY2Vzc2VkRW50aXRpZXMgPSBuZXcgU2V0PEVudGl0eT4oKTsKCiAgICAvLyBGaW5kIHRoZSBjbGFzc2VzIHRoYXQgbmVlZCB0eXBlIGFyZ3VtZW50cyBhdCBydW50aW1lLiBTdWNoCiAgICAvLyBjbGFzc2VzIGFyZToKICAgIC8vICgxKSB1c2VkIGluIGFuIGlzIGNoZWNrIHdpdGggdHlwZSB2YXJpYWJsZXMsCiAgICAvLyAoMikgZGVwZW5kZW5jaWVzIG9mIGNsYXNzZXMgaW4gKDEpLAogICAgLy8gKDMpIHN1YmNsYXNzZXMgb2YgKDIpIGFuZCAoMykuCiAgICB2b2lkIHBvdGVudGlhbGx5TmVlZFR5cGVBcmd1bWVudHMoRW50aXR5IGVudGl0eSkgewogICAgICAvLyBGdW5jdGlvbnMgd2l0aCB0eXBlIGFyZ3VtZW50cyBjYW4gaGF2ZSBkZXBlbmRlbmNpZXMgb2YgZWFjaCBvdGhlciAoaWYKICAgICAgLy8gdGhlIGZ1bmN0aW9ucyBjYWxsIGVhY2ggb3RoZXIpIHNvIHdlIGtlZXAgYSBzZXQgdG8gcHJldmVudCBpbmZpbml0ZWx5CiAgICAgIC8vIHJlY3Vyc2luZyBvdmVyIHRoZSBzYW1lIGVudGl0aWVzLgogICAgICBpZiAocHJvY2Vzc2VkRW50aXRpZXMuY29udGFpbnMoZW50aXR5KSkgcmV0dXJuOwoKICAgICAgcHJvY2Vzc2VkRW50aXRpZXMuYWRkKGVudGl0eSk7CiAgICAgIGlmIChlbnRpdHkgaXMgQ2xhc3NFbnRpdHkpIHsKICAgICAgICBDbGFzc0VudGl0eSBjbHMgPSBlbnRpdHk7CiAgICAgICAgaWYgKCFfZWxlbWVudEVudmlyb25tZW50LmlzR2VuZXJpY0NsYXNzKGNscykpIHJldHVybjsKICAgICAgICBpZiAoY2xhc3Nlc05lZWRpbmdUeXBlQXJndW1lbnRzLmNvbnRhaW5zKGNscykpIHJldHVybjsKICAgICAgICBjbGFzc2VzTmVlZGluZ1R5cGVBcmd1bWVudHMuYWRkKGNscyk7CgogICAgICAgIC8vIFRPRE8obmdlb2ZmcmF5KTogVGhpcyBzaG91bGQgdXNlIHN1YmNsYXNzZXMsIG5vdCBzdWJ0eXBlcy4KICAgICAgICBjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5mb3JFYWNoU3RyaWN0U3VidHlwZU9mKGNscywKICAgICAgICAgICAgKENsYXNzRW50aXR5IHN1YikgewogICAgICAgICAgcG90ZW50aWFsbHlOZWVkVHlwZUFyZ3VtZW50cyhzdWIpOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKGVudGl0eSBpcyBGdW5jdGlvbkVudGl0eSkgewogICAgICAgIG1ldGhvZHNOZWVkaW5nVHlwZUFyZ3VtZW50cy5hZGQoZW50aXR5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsb2NhbEZ1bmN0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzLmFkZChlbnRpdHkpOwogICAgICB9CgogICAgICBJdGVyYWJsZTxFbnRpdHk+IGRlcGVuZGVuY2llcyA9CiAgICAgICAgICB0eXBlVmFyaWFibGVUZXN0cy5nZXRUeXBlQXJndW1lbnREZXBlbmRlbmNpZXMoZW50aXR5KTsKICAgICAgZGVwZW5kZW5jaWVzLmZvckVhY2goKEVudGl0eSBvdGhlcikgewogICAgICAgIHBvdGVudGlhbGx5TmVlZFR5cGVBcmd1bWVudHMob3RoZXIpOwogICAgICB9KTsKICAgIH0KCiAgICBTZXQ8TG9jYWw+IGxvY2FsRnVuY3Rpb25zID0gcmVzb2x1dGlvbldvcmxkQnVpbGRlci5sb2NhbEZ1bmN0aW9ucy50b1NldCgpOwogICAgU2V0PEZ1bmN0aW9uRW50aXR5PiBjbG9zdXJpemVkTWVtYmVycyA9CiAgICAgICAgcmVzb2x1dGlvbldvcmxkQnVpbGRlci5jbG9zdXJpemVkTWVtYmVyc1dpdGhGcmVlVHlwZVZhcmlhYmxlcy50b1NldCgpOwoKICAgIC8vIENoZWNrIGxvY2FsIGZ1bmN0aW9ucyBhbmQgY2xvc3VyaXplZCBtZW1iZXJzLgogICAgdm9pZCBjaGVja0Nsb3N1cmVzKHtEYXJ0VHlwZSBwb3RlbnRpYWxTdWJ0eXBlT2Z9KSB7CiAgICAgIGJvb2wgY2hlY2tGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZSkgewogICAgICAgIENsYXNzRW50aXR5IGNvbnRleHRDbGFzcyA9IERhcnRUeXBlcy5nZXRDbGFzc0NvbnRleHQoZnVuY3Rpb25UeXBlKTsKICAgICAgICBpZiAoY29udGV4dENsYXNzICE9IG51bGwgJiYKICAgICAgICAgICAgKHBvdGVudGlhbFN1YnR5cGVPZiA9PSBudWxsIHx8CiAgICAgICAgICAgICAgICBjbG9zZWRXb3JsZC5kYXJ0VHlwZXMKICAgICAgICAgICAgICAgICAgICAuaXNQb3RlbnRpYWxTdWJ0eXBlKGZ1bmN0aW9uVHlwZSwgcG90ZW50aWFsU3VidHlwZU9mKSkpIHsKICAgICAgICAgIHBvdGVudGlhbGx5TmVlZFR5cGVBcmd1bWVudHMoY29udGV4dENsYXNzKTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIFNldDxMb2NhbD4gbG9jYWxGdW5jdGlvbnNUb1JlbW92ZTsKICAgICAgU2V0PEZ1bmN0aW9uRW50aXR5PiBjbG9zdXJpemVkTWVtYmVyc1RvUmVtb3ZlOwogICAgICBmb3IgKExvY2FsIGZ1bmN0aW9uIGluIGxvY2FsRnVuY3Rpb25zKSB7CiAgICAgICAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZSA9CiAgICAgICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0TG9jYWxGdW5jdGlvblR5cGUoZnVuY3Rpb24pOwogICAgICAgIGlmIChwb3RlbnRpYWxTdWJ0eXBlT2YgPT0gbnVsbCB8fAogICAgICAgICAgICBjbG9zZWRXb3JsZC5kYXJ0VHlwZXMKICAgICAgICAgICAgICAgIC5pc1BvdGVudGlhbFN1YnR5cGUoZnVuY3Rpb25UeXBlLCBwb3RlbnRpYWxTdWJ0eXBlT2YsCiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVXNlIHJlZ2lzdGVyIGdlbmVyaWMgaW5zdGFudGlhdGlvbnMKICAgICAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkLgogICAgICAgICAgICAgICAgICAgIGFzc3VtZUluc3RhbnRpYXRpb25zOiBfZ2VuZXJpY0luc3RhbnRpYXRpb25zLmlzTm90RW1wdHkpKSB7CiAgICAgICAgICBmdW5jdGlvblR5cGUuZm9yRWFjaFR5cGVWYXJpYWJsZSgoVHlwZVZhcmlhYmxlVHlwZSB0eXBlVmFyaWFibGUpIHsKICAgICAgICAgICAgRW50aXR5IHR5cGVEZWNsYXJhdGlvbiA9IHR5cGVWYXJpYWJsZS5lbGVtZW50LnR5cGVEZWNsYXJhdGlvbjsKICAgICAgICAgICAgaWYgKCFwcm9jZXNzZWRFbnRpdGllcy5jb250YWlucyh0eXBlRGVjbGFyYXRpb24pKSB7CiAgICAgICAgICAgICAgcG90ZW50aWFsbHlOZWVkVHlwZUFyZ3VtZW50cyh0eXBlRGVjbGFyYXRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIGxvY2FsRnVuY3Rpb25zTmVlZGluZ1NpZ25hdHVyZS5hZGQoZnVuY3Rpb24pOwogICAgICAgICAgbG9jYWxGdW5jdGlvbnNUb1JlbW92ZSA/Pz0gbmV3IFNldDxMb2NhbD4oKTsKICAgICAgICAgIGxvY2FsRnVuY3Rpb25zVG9SZW1vdmUuYWRkKGZ1bmN0aW9uKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yIChGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiBpbiBjbG9zdXJpemVkTWVtYmVycykgewogICAgICAgIGlmIChjaGVja0Z1bmN0aW9uVHlwZShfZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZShmdW5jdGlvbikpKSB7CiAgICAgICAgICBtZXRob2RzTmVlZGluZ1NpZ25hdHVyZS5hZGQoZnVuY3Rpb24pOwogICAgICAgICAgY2xvc3VyaXplZE1lbWJlcnNUb1JlbW92ZSA/Pz0gbmV3IFNldDxGdW5jdGlvbkVudGl0eT4oKTsKICAgICAgICAgIGNsb3N1cml6ZWRNZW1iZXJzVG9SZW1vdmUuYWRkKGZ1bmN0aW9uKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGxvY2FsRnVuY3Rpb25zVG9SZW1vdmUgIT0gbnVsbCkgewogICAgICAgIGxvY2FsRnVuY3Rpb25zLnJlbW92ZUFsbChsb2NhbEZ1bmN0aW9uc1RvUmVtb3ZlKTsKICAgICAgfQogICAgICBpZiAoY2xvc3VyaXplZE1lbWJlcnNUb1JlbW92ZSAhPSBudWxsKSB7CiAgICAgICAgY2xvc3VyaXplZE1lbWJlcnMucmVtb3ZlQWxsKGNsb3N1cml6ZWRNZW1iZXJzVG9SZW1vdmUpOwogICAgICB9CiAgICB9CgogICAgLy8gQ29tcHV0ZSB0aGUgc2V0IG9mIGFsbCBjbGFzc2VzIGFuZCBtZXRob2RzIHRoYXQgbmVlZCBydW50aW1lIHR5cGUKICAgIC8vIGluZm9ybWF0aW9uLgoKICAgIHZvaWQgcHJvY2Vzc0NoZWNrcyhTZXQ8RGFydFR5cGU+IGNoZWNrcykgewogICAgICBjaGVja3MuZm9yRWFjaCgoRGFydFR5cGUgdHlwZSkgewogICAgICAgIGlmICh0eXBlLmlzSW50ZXJmYWNlVHlwZSkgewogICAgICAgICAgSW50ZXJmYWNlVHlwZSBpdGYgPSB0eXBlOwogICAgICAgICAgaWYgKCFpdGYudHJlYXRBc1JhdykgewogICAgICAgICAgICBwb3RlbnRpYWxseU5lZWRUeXBlQXJndW1lbnRzKGl0Zi5lbGVtZW50KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdHlwZS5mb3JFYWNoVHlwZVZhcmlhYmxlKChUeXBlVmFyaWFibGVUeXBlIHR5cGVWYXJpYWJsZSkgewogICAgICAgICAgICAvLyBUaGlzIGhhbmRsZXMgY2hlY2tzIGFnYWluc3QgdHlwZSB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9uIHR5cGVzCiAgICAgICAgICAgIC8vIGNvbnRhaW5pbmcgdHlwZSB2YXJpYWJsZXMuCiAgICAgICAgICAgIEVudGl0eSB0eXBlRGVjbGFyYXRpb24gPSB0eXBlVmFyaWFibGUuZWxlbWVudC50eXBlRGVjbGFyYXRpb247CiAgICAgICAgICAgIHBvdGVudGlhbGx5TmVlZFR5cGVBcmd1bWVudHModHlwZURlY2xhcmF0aW9uKTsKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKHR5cGUuaXNGdW5jdGlvblR5cGUpIHsKICAgICAgICAgICAgY2hlY2tDbG9zdXJlcyhwb3RlbnRpYWxTdWJ0eXBlT2Y6IHR5cGUpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHR5cGUgaXMgRnV0dXJlT3JUeXBlKSB7CiAgICAgICAgICAgIHBvdGVudGlhbGx5TmVlZFR5cGVBcmd1bWVudHMoCiAgICAgICAgICAgICAgICBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5mdXR1cmVDbGFzcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgICBwcm9jZXNzQ2hlY2tzKHR5cGVWYXJpYWJsZVRlc3RzLmV4cGxpY2l0SXNDaGVja3MpOwogICAgcHJvY2Vzc0NoZWNrcyh0eXBlVmFyaWFibGVUZXN0cy5pbXBsaWNpdElzQ2hlY2tzKTsKCiAgICAvLyBBZGQgdGhlIGNsYXNzZXMsIG1ldGhvZHMgYW5kIGxvY2FsIGZ1bmN0aW9ucyB0aGF0IG5lZWQgdHlwZSBhcmd1bWVudHMKICAgIC8vIGJlY2F1c2UgdGhleSB1c2UgYSB0eXBlIHZhcmlhYmxlIGFzIGEgbGl0ZXJhbC4KICAgIGNsYXNzZXNVc2luZ1R5cGVWYXJpYWJsZUxpdGVyYWxzLmZvckVhY2gocG90ZW50aWFsbHlOZWVkVHlwZUFyZ3VtZW50cyk7CiAgICBtZXRob2RzVXNpbmdUeXBlVmFyaWFibGVMaXRlcmFscy5mb3JFYWNoKHBvdGVudGlhbGx5TmVlZFR5cGVBcmd1bWVudHMpOwogICAgbG9jYWxGdW5jdGlvbnNVc2luZ1R5cGVWYXJpYWJsZUxpdGVyYWxzCiAgICAgICAgLmZvckVhY2gocG90ZW50aWFsbHlOZWVkVHlwZUFyZ3VtZW50cyk7CgogICAgaWYgKHJlc29sdXRpb25Xb3JsZEJ1aWxkZXIuaXNNZW1iZXJVc2VkKAogICAgICAgIGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmludm9jYXRpb25UeXBlQXJndW1lbnRHZXR0ZXIpKSB7CiAgICAgIC8vIElmIGBJbnZvY2F0aW9uLnR5cGVBcmd1bWVudHNgIGlzIGxpdmUsIG1hcmsgYWxsIHVzZXItZGVmaW5lZAogICAgICAvLyBpbXBsZW1lbnRhdGlvbnMgb2YgYG5vU3VjaE1ldGhvZGAgYXMgbmVlZGluZyB0eXBlIGFyZ3VtZW50cy4KICAgICAgZm9yIChNZW1iZXJFbnRpdHkgbWVtYmVyIGluIHJlc29sdXRpb25Xb3JsZEJ1aWxkZXIudXNlck5vU3VjaE1ldGhvZHMpIHsKICAgICAgICBwb3RlbnRpYWxseU5lZWRUeXBlQXJndW1lbnRzKG1lbWJlcik7CiAgICAgIH0KICAgIH0KCiAgICBpZiAob3B0aW9ucy5wYXJhbWV0ZXJDaGVja1BvbGljeS5pc0VtaXR0ZWQpIHsKICAgICAgdm9pZCBjaGVja0Z1bmN0aW9uKEVudGl0eSBmdW5jdGlvbiwgRnVuY3Rpb25UeXBlIHR5cGUpIHsKICAgICAgICBmb3IgKEZ1bmN0aW9uVHlwZVZhcmlhYmxlIHR5cGVWYXJpYWJsZSBpbiB0eXBlLnR5cGVWYXJpYWJsZXMpIHsKICAgICAgICAgIERhcnRUeXBlIGJvdW5kID0gdHlwZVZhcmlhYmxlLmJvdW5kOwogICAgICAgICAgaWYgKCFib3VuZC5pc0R5bmFtaWMgJiYKICAgICAgICAgICAgICAhYm91bmQuaXNWb2lkICYmCiAgICAgICAgICAgICAgYm91bmQgIT0gY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMub2JqZWN0VHlwZSkgewogICAgICAgICAgICBwb3RlbnRpYWxseU5lZWRUeXBlQXJndW1lbnRzKGZ1bmN0aW9uKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3IgKEZ1bmN0aW9uRW50aXR5IG1ldGhvZCBpbiByZXNvbHV0aW9uV29ybGRCdWlsZGVyLmdlbmVyaWNNZXRob2RzKSB7CiAgICAgICAgY2hlY2tGdW5jdGlvbihtZXRob2QsIF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0RnVuY3Rpb25UeXBlKG1ldGhvZCkpOwogICAgICB9CgogICAgICBmb3IgKExvY2FsIGZ1bmN0aW9uIGluIHJlc29sdXRpb25Xb3JsZEJ1aWxkZXIuZ2VuZXJpY0xvY2FsRnVuY3Rpb25zKSB7CiAgICAgICAgY2hlY2tGdW5jdGlvbigKICAgICAgICAgICAgZnVuY3Rpb24sIF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0TG9jYWxGdW5jdGlvblR5cGUoZnVuY3Rpb24pKTsKICAgICAgfQogICAgfQoKICAgIEJhY2tlbmRVc2FnZSBiYWNrZW5kVXNhZ2UgPSBjbG9zZWRXb3JsZC5iYWNrZW5kVXNhZ2U7CiAgICBDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cyA9IGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzOwoKICAgIC8vLyBTZXQgdG8gYHRydWVgIGlmIHN1YmNsYXNzZXMgb2YgYE9iamVjdGAgbmVlZCBydW50aW1lVHlwZS4gVGhpcyBpcwogICAgLy8vIG9ubHkgdXNlZCB0byBzdG9wIHRoZSBjb21wdXRhdGlvbiBlYXJseS4KICAgIGJvb2wgbmVlZGVkT25BbGwgPSBmYWxzZTsKCiAgICAvLy8gU2V0IHRvIGB0cnVlYCBpZiBzdWJjbGFzc2VzIG9mIGBGdW5jdGlvbmAgbmVlZCBydW50aW1lVHlwZS4KICAgIGJvb2wgbmVlZGVkT25GdW5jdGlvbnMgPSBmYWxzZTsKCiAgICBTZXQ8Q2xhc3NFbnRpdHk+IGNsYXNzZXNEaXJlY3RseU5lZWRpbmdSdW50aW1lVHlwZSA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CgogICAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGltcGxpZWRDbGFzc2VzKERhcnRUeXBlIHR5cGUpIHsKICAgICAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICAgIHJldHVybiBbdHlwZS5lbGVtZW50XTsKICAgICAgfSBlbHNlIGlmICh0eXBlIGlzIER5bmFtaWNUeXBlKSB7CiAgICAgICAgcmV0dXJuIFtjb21tb25FbGVtZW50cy5vYmplY3RDbGFzc107CiAgICAgIH0gZWxzZSBpZiAodHlwZSBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBJbmNsdWRlIG9ubHkgcG90ZW50aWFsIGZ1bmN0aW9uIHR5cGUgc3VidHlwZXMuCiAgICAgICAgcmV0dXJuIFtjb21tb25FbGVtZW50cy5mdW5jdGlvbkNsYXNzXTsKICAgICAgfSBlbHNlIGlmICh0eXBlIGlzIFZvaWRUeXBlKSB7CiAgICAgICAgLy8gTm8gY2xhc3NlcyBpbXBsaWVkLgogICAgICB9IGVsc2UgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlVmFyaWFibGUpIHsKICAgICAgICByZXR1cm4gaW1wbGllZENsYXNzZXModHlwZS5ib3VuZCk7CiAgICAgIH0gZWxzZSBpZiAodHlwZSBpcyBGdXR1cmVPclR5cGUpIHsKICAgICAgICByZXR1cm4gW2NvbW1vbkVsZW1lbnRzLmZ1dHVyZUNsYXNzXQogICAgICAgICAgLi5hZGRBbGwoaW1wbGllZENsYXNzZXModHlwZS50eXBlQXJndW1lbnQpKTsKICAgICAgfSBlbHNlIGlmICh0eXBlIGlzIFR5cGVWYXJpYWJsZVR5cGUpIHsKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDYW4gd2UgZG8gYmV0dGVyPwogICAgICAgIHJldHVybiBpbXBsaWVkQ2xhc3NlcygKICAgICAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRUeXBlVmFyaWFibGVCb3VuZCh0eXBlLmVsZW1lbnQpKTsKICAgICAgfQogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignVW5leHBlY3RlZCB0eXBlICR0eXBlJyk7CiAgICB9CgogICAgdm9pZCBhZGRDbGFzcyhDbGFzc0VudGl0eSBjbHMpIHsKICAgICAgaWYgKGNscyAhPSBudWxsKSB7CiAgICAgICAgY2xhc3Nlc0RpcmVjdGx5TmVlZGluZ1J1bnRpbWVUeXBlLmFkZChjbHMpOwogICAgICB9CiAgICAgIGlmIChjbHMgPT0gY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MpIHsKICAgICAgICBuZWVkZWRPbkFsbCA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKGNscyA9PSBjb21tb25FbGVtZW50cy5mdW5jdGlvbkNsYXNzKSB7CiAgICAgICAgbmVlZGVkT25GdW5jdGlvbnMgPSB0cnVlOwogICAgICB9CiAgICB9CgogICAgZm9yIChSdW50aW1lVHlwZVVzZSBydW50aW1lVHlwZVVzZSBpbiBiYWNrZW5kVXNhZ2UucnVudGltZVR5cGVVc2VzKSB7CiAgICAgIHN3aXRjaCAocnVudGltZVR5cGVVc2Uua2luZCkgewogICAgICAgIGNhc2UgUnVudGltZVR5cGVVc2VLaW5kLnN0cmluZzoKICAgICAgICAgIGlmICghb3B0aW9ucy5sYXhSdW50aW1lVHlwZVRvU3RyaW5nKSB7CiAgICAgICAgICAgIGltcGxpZWRDbGFzc2VzKHJ1bnRpbWVUeXBlVXNlLnJlY2VpdmVyVHlwZSkuZm9yRWFjaChhZGRDbGFzcyk7CiAgICAgICAgICB9CgogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBSdW50aW1lVHlwZVVzZUtpbmQuZXF1YWxzOgogICAgICAgICAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IHJlY2VpdmVyQ2xhc3NlcyA9CiAgICAgICAgICAgICAgaW1wbGllZENsYXNzZXMocnVudGltZVR5cGVVc2UucmVjZWl2ZXJUeXBlKTsKICAgICAgICAgIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBhcmd1bWVudENsYXNzZXMgPQogICAgICAgICAgICAgIGltcGxpZWRDbGFzc2VzKHJ1bnRpbWVUeXBlVXNlLmFyZ3VtZW50VHlwZSk7CgogICAgICAgICAgZm9yIChDbGFzc0VudGl0eSByZWNlaXZlckNsYXNzIGluIHJlY2VpdmVyQ2xhc3NlcykgewogICAgICAgICAgICBmb3IgKENsYXNzRW50aXR5IGFyZ3VtZW50Q2xhc3MgaW4gYXJndW1lbnRDbGFzc2VzKSB7CiAgICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3BlY2lhbCBjYXNlIHVzZSBvZiBgdGhpcy5ydW50aW1lVHlwZWAuCiAgICAgICAgICAgICAgU3ViY2xhc3NSZXN1bHQgcmVzdWx0ID0gY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkKICAgICAgICAgICAgICAgICAgLmNvbW1vblN1YmNsYXNzZXMocmVjZWl2ZXJDbGFzcywgQ2xhc3NRdWVyeS5TVUJUWVBFLAogICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRDbGFzcywgQ2xhc3NRdWVyeS5TVUJUWVBFKTsKICAgICAgICAgICAgICBzd2l0Y2ggKHJlc3VsdC5raW5kKSB7CiAgICAgICAgICAgICAgICBjYXNlIFN1YmNsYXNzUmVzdWx0S2luZC5FTVBUWToKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFN1YmNsYXNzUmVzdWx0S2luZC5FWEFDVDE6CiAgICAgICAgICAgICAgICBjYXNlIFN1YmNsYXNzUmVzdWx0S2luZC5TVUJDTEFTUzE6CiAgICAgICAgICAgICAgICBjYXNlIFN1YmNsYXNzUmVzdWx0S2luZC5TVUJUWVBFMToKICAgICAgICAgICAgICAgICAgYWRkQ2xhc3MocmVjZWl2ZXJDbGFzcyk7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBTdWJjbGFzc1Jlc3VsdEtpbmQuRVhBQ1QyOgogICAgICAgICAgICAgICAgY2FzZSBTdWJjbGFzc1Jlc3VsdEtpbmQuU1VCQ0xBU1MyOgogICAgICAgICAgICAgICAgY2FzZSBTdWJjbGFzc1Jlc3VsdEtpbmQuU1VCVFlQRTI6CiAgICAgICAgICAgICAgICAgIGFkZENsYXNzKGFyZ3VtZW50Q2xhc3MpOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgU3ViY2xhc3NSZXN1bHRLaW5kLlNFVDoKICAgICAgICAgICAgICAgICAgZm9yIChDbGFzc0VudGl0eSBjbHMgaW4gcmVzdWx0LmNsYXNzZXMpIHsKICAgICAgICAgICAgICAgICAgICBhZGRDbGFzcyhjbHMpOwogICAgICAgICAgICAgICAgICAgIGlmIChuZWVkZWRPbkFsbCkgYnJlYWs7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFJ1bnRpbWVUeXBlVXNlS2luZC51bmtub3duOgogICAgICAgICAgaW1wbGllZENsYXNzZXMocnVudGltZVR5cGVVc2UucmVjZWl2ZXJUeXBlKS5mb3JFYWNoKGFkZENsYXNzKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChuZWVkZWRPbkFsbCkgYnJlYWs7CiAgICB9CiAgICBTZXQ8Q2xhc3NFbnRpdHk+IGFsbENsYXNzZXNOZWVkaW5nUnVudGltZVR5cGU7CiAgICBpZiAobmVlZGVkT25BbGwpIHsKICAgICAgbmVlZGVkT25GdW5jdGlvbnMgPSB0cnVlOwogICAgICBhbGxDbGFzc2VzTmVlZGluZ1J1bnRpbWVUeXBlID0gY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkKICAgICAgICAgIC5zdWJjbGFzc2VzT2YoY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MpCiAgICAgICAgICAudG9TZXQoKTsKICAgIH0gZWxzZSB7CiAgICAgIGFsbENsYXNzZXNOZWVkaW5nUnVudGltZVR5cGUgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTdXBwb3J0IHRoaXMgb3BlcmF0aW9uIGRpcmVjdGx5IGluCiAgICAgIC8vIFtDbG9zZWRXb3JsZF0gdXNpbmcgdGhlIFtDbGFzc1NldF1zLgogICAgICBmb3IgKENsYXNzRW50aXR5IGNscyBpbiBjbGFzc2VzRGlyZWN0bHlOZWVkaW5nUnVudGltZVR5cGUpIHsKICAgICAgICBpZiAoIWFsbENsYXNzZXNOZWVkaW5nUnVudGltZVR5cGUuY29udGFpbnMoY2xzKSkgewogICAgICAgICAgYWxsQ2xhc3Nlc05lZWRpbmdSdW50aW1lVHlwZQogICAgICAgICAgICAgIC5hZGRBbGwoY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuc3VidHlwZXNPZihjbHMpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGFsbENsYXNzZXNOZWVkaW5nUnVudGltZVR5cGUuZm9yRWFjaChwb3RlbnRpYWxseU5lZWRUeXBlQXJndW1lbnRzKTsKICAgIGlmIChuZWVkZWRPbkZ1bmN0aW9ucykgewogICAgICBmb3IgKExvY2FsIGZ1bmN0aW9uIGluIHJlc29sdXRpb25Xb3JsZEJ1aWxkZXIuZ2VuZXJpY0xvY2FsRnVuY3Rpb25zKSB7CiAgICAgICAgcG90ZW50aWFsbHlOZWVkVHlwZUFyZ3VtZW50cyhmdW5jdGlvbik7CiAgICAgIH0KICAgICAgZm9yIChMb2NhbCBmdW5jdGlvbiBpbiBsb2NhbEZ1bmN0aW9ucykgewogICAgICAgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUgPQogICAgICAgICAgICBfZWxlbWVudEVudmlyb25tZW50LmdldExvY2FsRnVuY3Rpb25UeXBlKGZ1bmN0aW9uKTsKICAgICAgICBmdW5jdGlvblR5cGUuZm9yRWFjaFR5cGVWYXJpYWJsZSgoVHlwZVZhcmlhYmxlVHlwZSB0eXBlVmFyaWFibGUpIHsKICAgICAgICAgIEVudGl0eSB0eXBlRGVjbGFyYXRpb24gPSB0eXBlVmFyaWFibGUuZWxlbWVudC50eXBlRGVjbGFyYXRpb247CiAgICAgICAgICBpZiAoIXByb2Nlc3NlZEVudGl0aWVzLmNvbnRhaW5zKHR5cGVEZWNsYXJhdGlvbikpIHsKICAgICAgICAgICAgcG90ZW50aWFsbHlOZWVkVHlwZUFyZ3VtZW50cyh0eXBlRGVjbGFyYXRpb24pOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGxvY2FsRnVuY3Rpb25zTmVlZGluZ1NpZ25hdHVyZS5hZGRBbGwobG9jYWxGdW5jdGlvbnMpOwogICAgICB9CiAgICAgIGZvciAoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24KICAgICAgICAgIGluIHJlc29sdXRpb25Xb3JsZEJ1aWxkZXIuY2xvc3VyaXplZE1lbWJlcnNXaXRoRnJlZVR5cGVWYXJpYWJsZXMpIHsKICAgICAgICBtZXRob2RzTmVlZGluZ1NpZ25hdHVyZS5hZGQoZnVuY3Rpb24pOwogICAgICAgIHBvdGVudGlhbGx5TmVlZFR5cGVBcmd1bWVudHMoZnVuY3Rpb24uZW5jbG9zaW5nQ2xhc3MpOwogICAgICB9CiAgICB9CgogICAgU2V0PFNlbGVjdG9yPiBzZWxlY3RvcnNOZWVkaW5nVHlwZUFyZ3VtZW50cyA9IG5ldyBTZXQ8U2VsZWN0b3I+KCk7CiAgICB0eXBlVmFyaWFibGVUZXN0cwogICAgICAgIC5mb3JFYWNoQXBwbGllZFNlbGVjdG9yKChTZWxlY3RvciBzZWxlY3RvciwgU2V0PEVudGl0eT4gdGFyZ2V0cykgewogICAgICBmb3IgKEVudGl0eSB0YXJnZXQgaW4gdGFyZ2V0cykgewogICAgICAgIGlmIChtZXRob2RzTmVlZGluZ1R5cGVBcmd1bWVudHMuY29udGFpbnModGFyZ2V0KSB8fAogICAgICAgICAgICBsb2NhbEZ1bmN0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzLmNvbnRhaW5zKHRhcmdldCkpIHsKICAgICAgICAgIHNlbGVjdG9yc05lZWRpbmdUeXBlQXJndW1lbnRzLmFkZChzZWxlY3Rvcik7CiAgICAgICAgICBpZiAocmV0YWluRGF0YUZvclRlc3RpbmcpIHsKICAgICAgICAgICAgc2VsZWN0b3JzTmVlZGluZ1R5cGVBcmd1bWVudHNGb3JUZXN0aW5nID8/PQogICAgICAgICAgICAgICAgPFNlbGVjdG9yLCBTZXQ8RW50aXR5Pj57fTsKICAgICAgICAgICAgc2VsZWN0b3JzTmVlZGluZ1R5cGVBcmd1bWVudHNGb3JUZXN0aW5nCiAgICAgICAgICAgICAgICAucHV0SWZBYnNlbnQoc2VsZWN0b3IsICgpID0+IG5ldyBTZXQ8RW50aXR5PigpKQogICAgICAgICAgICAgICAgLmFkZCh0YXJnZXQpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICBTZXQ8aW50PiBpbnN0YW50aWF0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzID0gbmV3IFNldDxpbnQ+KCk7CiAgICB0eXBlVmFyaWFibGVUZXN0cy5mb3JFYWNoR2VuZXJpY0luc3RhbnRpYXRpb24oCiAgICAgICAgKEdlbmVyaWNJbnN0YW50aWF0aW9uIGluc3RhbnRpYXRpb24sIFNldDxFbnRpdHk+IHRhcmdldHMpIHsKICAgICAgZm9yIChFbnRpdHkgdGFyZ2V0IGluIHRhcmdldHMpIHsKICAgICAgICBpZiAobWV0aG9kc05lZWRpbmdUeXBlQXJndW1lbnRzLmNvbnRhaW5zKHRhcmdldCkgfHwKICAgICAgICAgICAgbG9jYWxGdW5jdGlvbnNOZWVkaW5nVHlwZUFyZ3VtZW50cy5jb250YWlucyh0YXJnZXQpKSB7CiAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2UgdGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBpbnN0YW50aWF0ZWQKICAgICAgICAgIC8vIGV4cHJlc3Npb24uCiAgICAgICAgICBpbnN0YW50aWF0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzCiAgICAgICAgICAgICAgLmFkZChpbnN0YW50aWF0aW9uLnR5cGVBcmd1bWVudHMubGVuZ3RoKTsKICAgICAgICAgIGlmIChyZXRhaW5EYXRhRm9yVGVzdGluZykgewogICAgICAgICAgICBpbnN0YW50aWF0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzRm9yVGVzdGluZyA/Pz0KICAgICAgICAgICAgICAgIDxHZW5lcmljSW5zdGFudGlhdGlvbiwgU2V0PEVudGl0eT4+e307CiAgICAgICAgICAgIGluc3RhbnRpYXRpb25zTmVlZGluZ1R5cGVBcmd1bWVudHNGb3JUZXN0aW5nCiAgICAgICAgICAgICAgICAucHV0SWZBYnNlbnQoaW5zdGFudGlhdGlvbiwgKCkgPT4gbmV3IFNldDxFbnRpdHk+KCkpCiAgICAgICAgICAgICAgICAuYWRkKHRhcmdldCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKCiAgICBpZiAocmV0YWluRGF0YUZvclRlc3RpbmcpIHsKICAgICAgdHlwZVZhcmlhYmxlVGVzdHNGb3JUZXN0aW5nID0gdHlwZVZhcmlhYmxlVGVzdHM7CiAgICB9CgogICAgLypwcmludCh0eXBlVmFyaWFibGVUZXN0cy5kdW1wKCkpOwogICAgcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpOwogICAgcHJpbnQoJ2NsYXNzZXNOZWVkaW5nVHlwZUFyZ3VtZW50czonKTsKICAgIGNsYXNzZXNOZWVkaW5nVHlwZUFyZ3VtZW50cy5mb3JFYWNoKChlKSA9PiBwcmludCgnICAkZScpKTsKICAgIHByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTsKICAgIHByaW50KCdtZXRob2RzTmVlZGluZ1NpZ25hdHVyZTonKTsKICAgIG1ldGhvZHNOZWVkaW5nU2lnbmF0dXJlLmZvckVhY2goKGUpID0+IHByaW50KCcgICRlJykpOwogICAgcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpOwogICAgcHJpbnQoJ21ldGhvZHNOZWVkaW5nVHlwZUFyZ3VtZW50czonKTsKICAgIG1ldGhvZHNOZWVkaW5nVHlwZUFyZ3VtZW50cy5mb3JFYWNoKChlKSA9PiBwcmludCgnICAkZScpKTsKICAgIHByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTsKICAgIHByaW50KCdsb2NhbEZ1bmN0aW9uc05lZWRpbmdTaWduYXR1cmU6Jyk7CiAgICBsb2NhbEZ1bmN0aW9uc05lZWRpbmdTaWduYXR1cmUuZm9yRWFjaCgoZSkgPT4gcHJpbnQoJyAgJGUnKSk7CiAgICBwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7CiAgICBwcmludCgnbG9jYWxGdW5jdGlvbnNOZWVkaW5nVHlwZUFyZ3VtZW50czonKTsKICAgIGxvY2FsRnVuY3Rpb25zTmVlZGluZ1R5cGVBcmd1bWVudHMuZm9yRWFjaCgoZSkgPT4gcHJpbnQoJyAgJGUnKSk7CiAgICBwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7CiAgICBwcmludCgnc2VsZWN0b3JzTmVlZGluZ1R5cGVBcmd1bWVudHM6Jyk7CiAgICBzZWxlY3RvcnNOZWVkaW5nVHlwZUFyZ3VtZW50cy5mb3JFYWNoKChlKSA9PiBwcmludCgnICAkZScpKTsKICAgIHByaW50KCdpbnN0YW50aWF0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzOiAnCiAgICAgICAgJyRpbnN0YW50aWF0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzJyk7Ki8KCiAgICByZXR1cm4gbmV3IFJ1bnRpbWVUeXBlc05lZWRJbXBsKAogICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQsCiAgICAgICAgY2xhc3Nlc05lZWRpbmdUeXBlQXJndW1lbnRzLAogICAgICAgIG1ldGhvZHNOZWVkaW5nU2lnbmF0dXJlLAogICAgICAgIG1ldGhvZHNOZWVkaW5nVHlwZUFyZ3VtZW50cywKICAgICAgICBsb2NhbEZ1bmN0aW9uc05lZWRpbmdTaWduYXR1cmUsCiAgICAgICAgbG9jYWxGdW5jdGlvbnNOZWVkaW5nVHlwZUFyZ3VtZW50cywKICAgICAgICBzZWxlY3RvcnNOZWVkaW5nVHlwZUFyZ3VtZW50cywKICAgICAgICBpbnN0YW50aWF0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzKTsKICB9Cn0KCmNsYXNzIF9SdW50aW1lVHlwZXNDaGVja3MgaW1wbGVtZW50cyBSdW50aW1lVHlwZXNDaGVja3MgewogIGZpbmFsIFJ1bnRpbWVUeXBlc1N1YnN0aXR1dGlvbnMgX3N1YnN0aXR1dGlvbnM7CiAgQG92ZXJyaWRlCiAgZmluYWwgVHlwZUNoZWNrcyByZXF1aXJlZENoZWNrczsKICBmaW5hbCBJdGVyYWJsZTxDbGFzc0VudGl0eT4gX3R5cGVMaXRlcmFsczsKICBmaW5hbCBJdGVyYWJsZTxDbGFzc0VudGl0eT4gX3R5cGVBcmd1bWVudHM7CgogIF9SdW50aW1lVHlwZXNDaGVja3ModGhpcy5fc3Vic3RpdHV0aW9ucywgdGhpcy5yZXF1aXJlZENoZWNrcywKICAgICAgdGhpcy5fdHlwZUxpdGVyYWxzLCB0aGlzLl90eXBlQXJndW1lbnRzKTsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGdldCByZXF1aXJlZENsYXNzZXMgewogICAgU2V0PENsYXNzRW50aXR5PiByZXF1aXJlZCA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CiAgICByZXF1aXJlZC5hZGRBbGwoX3R5cGVBcmd1bWVudHMpOwogICAgcmVxdWlyZWQuYWRkQWxsKF90eXBlTGl0ZXJhbHMpOwogICAgcmVxdWlyZWQKICAgICAgICAuYWRkQWxsKF9zdWJzdGl0dXRpb25zLmdldENsYXNzZXNVc2VkSW5TdWJzdGl0dXRpb25zKHJlcXVpcmVkQ2hlY2tzKSk7CiAgICByZXR1cm4gcmVxdWlyZWQ7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0UmVmZXJlbmNlZENsYXNzZXMoRnVuY3Rpb25UeXBlIHR5cGUpIHsKICAgIEZ1bmN0aW9uQXJndW1lbnRDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IEZ1bmN0aW9uQXJndW1lbnRDb2xsZWN0b3IoKTsKICAgIGNvbGxlY3Rvci5jb2xsZWN0KHR5cGUpOwogICAgcmV0dXJuIGNvbGxlY3Rvci5jbGFzc2VzOwogIH0KfQoKY2xhc3MgUnVudGltZVR5cGVzSW1wbCBleHRlbmRzIF9SdW50aW1lVHlwZXNCYXNlCiAgICB3aXRoIFJ1bnRpbWVUeXBlc1N1YnN0aXR1dGlvbnNNaXhpbgogICAgaW1wbGVtZW50cyBSdW50aW1lVHlwZXNDaGVja3NCdWlsZGVyIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwoKICAvLyBUaGUgc2V0IG9mIHR5cGUgYXJndW1lbnRzIHRlc3RlZCBhZ2FpbnN0IHR5cGUgdmFyaWFibGUgYm91bmRzLgogIGZpbmFsIFNldDxEYXJ0VHlwZT4gY2hlY2tlZFR5cGVBcmd1bWVudHMgPSBuZXcgU2V0PERhcnRUeXBlPigpOwogIC8vIFRoZSBzZXQgb2YgdGVzdGVkIHR5cGUgdmFyaWFibGUgYm91bmRzLgogIGZpbmFsIFNldDxEYXJ0VHlwZT4gY2hlY2tlZEJvdW5kcyA9IG5ldyBTZXQ8RGFydFR5cGU+KCk7CgogIFR5cGVDaGVja3MgY2FjaGVkUmVxdWlyZWRDaGVja3M7CgogIEBvdmVycmlkZQogIGJvb2wgcnRpQ2hlY2tzQnVpbGRlckNsb3NlZCA9IGZhbHNlOwoKICBSdW50aW1lVHlwZXNJbXBsKHRoaXMuX2Nsb3NlZFdvcmxkKSA6IHN1cGVyKF9jbG9zZWRXb3JsZC5kYXJ0VHlwZXMpOwoKICBKQ29tbW9uRWxlbWVudHMgZ2V0IF9jb21tb25FbGVtZW50cyA9PiBfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHM7CiAgQG92ZXJyaWRlCiAgSkVsZW1lbnRFbnZpcm9ubWVudCBnZXQgX2VsZW1lbnRFbnZpcm9ubWVudCA9PgogICAgICBfY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50OwogIEBvdmVycmlkZQogIFJ1bnRpbWVUeXBlc05lZWQgZ2V0IF9ydGlOZWVkID0+IF9jbG9zZWRXb3JsZC5ydGlOZWVkOwoKICBAb3ZlcnJpZGUKICBUeXBlQ2hlY2tzIGdldCBfcmVxdWlyZWRDaGVja3MgPT4gY2FjaGVkUmVxdWlyZWRDaGVja3M7CgogIE1hcDxDbGFzc0VudGl0eSwgQ2xhc3NVc2U+IGNsYXNzVXNlTWFwRm9yVGVzdGluZzsKCiAgZmluYWwgU2V0PEdlbmVyaWNJbnN0YW50aWF0aW9uPiBfZ2VuZXJpY0luc3RhbnRpYXRpb25zID0KICAgICAgbmV3IFNldDxHZW5lcmljSW5zdGFudGlhdGlvbj4oKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclR5cGVWYXJpYWJsZUJvdW5kc1N1YnR5cGVDaGVjaygKICAgICAgRGFydFR5cGUgdHlwZUFyZ3VtZW50LCBEYXJ0VHlwZSBib3VuZCkgewogICAgY2hlY2tlZFR5cGVBcmd1bWVudHMuYWRkKHR5cGVBcmd1bWVudCk7CiAgICBjaGVja2VkQm91bmRzLmFkZChib3VuZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyR2VuZXJpY0luc3RhbnRpYXRpb24oR2VuZXJpY0luc3RhbnRpYXRpb24gaW5zdGFudGlhdGlvbikgewogICAgX2dlbmVyaWNJbnN0YW50aWF0aW9ucy5hZGQoaW5zdGFudGlhdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBSdW50aW1lVHlwZXNDaGVja3MgY29tcHV0ZVJlcXVpcmVkQ2hlY2tzKAogICAgICBDb2RlZ2VuV29ybGRCdWlsZGVyIGNvZGVnZW5Xb3JsZEJ1aWxkZXIsIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zKSB7CiAgICBUeXBlVmFyaWFibGVUZXN0cyB0eXBlVmFyaWFibGVUZXN0cyA9IG5ldyBUeXBlVmFyaWFibGVUZXN0cygKICAgICAgICBfZWxlbWVudEVudmlyb25tZW50LAogICAgICAgIF9jb21tb25FbGVtZW50cywKICAgICAgICBfdHlwZXMsCiAgICAgICAgY29kZWdlbldvcmxkQnVpbGRlciwKICAgICAgICBfZ2VuZXJpY0luc3RhbnRpYXRpb25zLAogICAgICAgIGZvclJ0aU5lZWRzOiBmYWxzZSk7CiAgICBTZXQ8RGFydFR5cGU+IGV4cGxpY2l0SXNDaGVja3MgPSB0eXBlVmFyaWFibGVUZXN0cy5leHBsaWNpdElzQ2hlY2tzOwogICAgU2V0PERhcnRUeXBlPiBpbXBsaWNpdElzQ2hlY2tzID0gdHlwZVZhcmlhYmxlVGVzdHMuaW1wbGljaXRJc0NoZWNrczsKCiAgICBNYXA8Q2xhc3NFbnRpdHksIENsYXNzVXNlPiBjbGFzc1VzZU1hcCA9IDxDbGFzc0VudGl0eSwgQ2xhc3NVc2U+e307CiAgICBpZiAocmV0YWluRGF0YUZvclRlc3RpbmcpIHsKICAgICAgY2xhc3NVc2VNYXBGb3JUZXN0aW5nID0gY2xhc3NVc2VNYXA7CiAgICB9CgogICAgU2V0PEZ1bmN0aW9uVHlwZT4gY2hlY2tlZEZ1bmN0aW9uVHlwZXMgPSBuZXcgU2V0PEZ1bmN0aW9uVHlwZT4oKTsKICAgIFNldDxDbGFzc0VudGl0eT4gdHlwZUxpdGVyYWxzID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKICAgIFNldDxDbGFzc0VudGl0eT4gdHlwZUFyZ3VtZW50cyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CgogICAgLy8gVGhlIFtsaXZlVHlwZVZpc2l0b3JdIGlzIHVzZWQgdG8gcmVnaXN0ZXIgY2xhc3MgdXNlIGluIHRoZSB0eXBlIG9mCiAgICAvLyBpbnN0YW50aWF0ZWQgb2JqZWN0cyBsaWtlIGBuZXcgVGAgYW5kIHRoZSBmdW5jdGlvbiB0eXBlcyBvZgogICAgLy8gdGVhciBvZmZzIGFuZCBjbG9zdXJlcy4KICAgIC8vCiAgICAvLyBBIHR5cGUgZm91bmQgaW4gYSBjb3ZhcmlhbnQgcG9zaXRpb24gb2Ygc3VjaCB0eXBlcyBpcyBjb25zaWRlcmVkIGxpdmUKICAgIC8vIHdoZXJlYXMgYSB0eXBlIGZvdW5kIGluIGEgY29udHJhdmFyaWFudCBwb3NpdGlvbiBvZiBzdWNoIHR5cGVzIGlzCiAgICAvLyBjb25zaWRlcmVkIHRlc3RlZC4KICAgIC8vCiAgICAvLyBGb3IgaW5zdGFuY2UKICAgIC8vCiAgICAvLyAgICBuZXcgQTxCIEZ1bmN0aW9uKEMpPigpOwogICAgLy8KICAgIC8vIG1ha2VzIEEgYW5kIEIgbGl2ZSBidXQgQyB0ZXN0ZWQuCiAgICBUeXBlVmlzaXRvciBsaXZlVHlwZVZpc2l0b3IgPQogICAgICAgIG5ldyBUeXBlVmlzaXRvcihvbkNsYXNzOiAoQ2xhc3NFbnRpdHkgY2xzLCB7VHlwZVZpc2l0b3JTdGF0ZSBzdGF0ZX0pIHsKICAgICAgQ2xhc3NVc2UgY2xhc3NVc2UgPSBjbGFzc1VzZU1hcC5wdXRJZkFic2VudChjbHMsICgpID0+IG5ldyBDbGFzc1VzZSgpKTsKICAgICAgc3dpdGNoIChzdGF0ZSkgewogICAgICAgIGNhc2UgVHlwZVZpc2l0b3JTdGF0ZS5jb3ZhcmlhbnRUeXBlQXJndW1lbnQ6CiAgICAgICAgICBjbGFzc1VzZS50eXBlQXJndW1lbnQgPSB0cnVlOwogICAgICAgICAgdHlwZUFyZ3VtZW50cy5hZGQoY2xzKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVHlwZVZpc2l0b3JTdGF0ZS5jb250cmF2YXJpYW50VHlwZUFyZ3VtZW50OgogICAgICAgICAgY2xhc3NVc2UudHlwZUFyZ3VtZW50ID0gdHJ1ZTsKICAgICAgICAgIGNsYXNzVXNlLmNoZWNrZWRUeXBlQXJndW1lbnQgPSB0cnVlOwogICAgICAgICAgdHlwZUFyZ3VtZW50cy5hZGQoY2xzKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVHlwZVZpc2l0b3JTdGF0ZS50eXBlTGl0ZXJhbDoKICAgICAgICAgIGNsYXNzVXNlLnR5cGVMaXRlcmFsID0gdHJ1ZTsKICAgICAgICAgIHR5cGVMaXRlcmFscy5hZGQoY2xzKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVHlwZVZpc2l0b3JTdGF0ZS5kaXJlY3Q6CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfSk7CgogICAgLy8gVGhlIFt0ZXN0ZWRUeXBlVmlzaXRvcl0gaXMgdXNlZCB0byByZWdpc3RlciBjbGFzcyB1c2UgaW4gdHlwZSB0ZXN0cyBsaWtlCiAgICAvLyBgbyBpcyBUYCBhbmQgYG8gYXMgVGAgKGJvdGggaW1wbGljaXQgYW5kIGV4cGxpY2l0KS4KICAgIC8vCiAgICAvLyBBIHR5cGUgZm91bmQgaW4gYSBjb3ZhcmlhbnQgcG9zaXRpb24gb2Ygc3VjaCB0eXBlcyBpcyBjb25zaWRlcmVkIHRlc3RlZAogICAgLy8gd2hlcmVhcyBhIHR5cGUgZm91bmQgaW4gYSBjb250cmF2YXJpYW50IHBvc2l0aW9uIG9mIHN1Y2ggdHlwZXMgaXMKICAgIC8vIGNvbnNpZGVyZWQgbGl2ZS4KICAgIC8vCiAgICAvLyBGb3IgaW5zdGFuY2UKICAgIC8vCiAgICAvLyAgICBvIGlzIEE8QiBGdW5jdGlvbihDKT47CiAgICAvLwogICAgLy8gbWFrZXMgQSBhbmQgQiB0ZXN0ZWQgYnV0IEMgbGl2ZS4KICAgIFR5cGVWaXNpdG9yIHRlc3RlZFR5cGVWaXNpdG9yID0KICAgICAgICBuZXcgVHlwZVZpc2l0b3Iob25DbGFzczogKENsYXNzRW50aXR5IGNscywge1R5cGVWaXNpdG9yU3RhdGUgc3RhdGV9KSB7CiAgICAgIENsYXNzVXNlIGNsYXNzVXNlID0gY2xhc3NVc2VNYXAucHV0SWZBYnNlbnQoY2xzLCAoKSA9PiBuZXcgQ2xhc3NVc2UoKSk7CiAgICAgIHN3aXRjaCAoc3RhdGUpIHsKICAgICAgICBjYXNlIFR5cGVWaXNpdG9yU3RhdGUuY292YXJpYW50VHlwZUFyZ3VtZW50OgogICAgICAgICAgY2xhc3NVc2UudHlwZUFyZ3VtZW50ID0gdHJ1ZTsKICAgICAgICAgIGNsYXNzVXNlLmNoZWNrZWRUeXBlQXJndW1lbnQgPSB0cnVlOwogICAgICAgICAgdHlwZUFyZ3VtZW50cy5hZGQoY2xzKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVHlwZVZpc2l0b3JTdGF0ZS5jb250cmF2YXJpYW50VHlwZUFyZ3VtZW50OgogICAgICAgICAgY2xhc3NVc2UudHlwZUFyZ3VtZW50ID0gdHJ1ZTsKICAgICAgICAgIHR5cGVBcmd1bWVudHMuYWRkKGNscyk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFR5cGVWaXNpdG9yU3RhdGUudHlwZUxpdGVyYWw6CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFR5cGVWaXNpdG9yU3RhdGUuZGlyZWN0OgogICAgICAgICAgY2xhc3NVc2UuY2hlY2tlZEluc3RhbmNlID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9KTsKCiAgICBjb2RlZ2VuV29ybGRCdWlsZGVyLmluc3RhbnRpYXRlZENsYXNzZXMuZm9yRWFjaCgoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICAgIENsYXNzVXNlIGNsYXNzVXNlID0gY2xhc3NVc2VNYXAucHV0SWZBYnNlbnQoY2xzLCAoKSA9PiBuZXcgQ2xhc3NVc2UoKSk7CiAgICAgIGNsYXNzVXNlLmluc3RhbmNlID0gdHJ1ZTsKICAgIH0pOwoKICAgIFNldDxDbGFzc0VudGl0eT4gdmlzaXRlZFN1cGVyQ2xhc3NlcyA9IHt9OwogICAgY29kZWdlbldvcmxkQnVpbGRlci5pbnN0YW50aWF0ZWRUeXBlcy5mb3JFYWNoKChJbnRlcmZhY2VUeXBlIHR5cGUpIHsKICAgICAgbGl2ZVR5cGVWaXNpdG9yLnZpc2l0VHlwZSh0eXBlLCBUeXBlVmlzaXRvclN0YXRlLmRpcmVjdCk7CiAgICAgIENsYXNzVXNlIGNsYXNzVXNlID0KICAgICAgICAgIGNsYXNzVXNlTWFwLnB1dElmQWJzZW50KHR5cGUuZWxlbWVudCwgKCkgPT4gbmV3IENsYXNzVXNlKCkpOwogICAgICBjbGFzc1VzZS5kaXJlY3RJbnN0YW5jZSA9IHRydWU7CiAgICAgIEZ1bmN0aW9uVHlwZSBjYWxsVHlwZSA9IF90eXBlcy5nZXRDYWxsVHlwZSh0eXBlKTsKICAgICAgaWYgKGNhbGxUeXBlICE9IG51bGwpIHsKICAgICAgICBsaXZlVHlwZVZpc2l0b3IudmlzaXRUeXBlKGNhbGxUeXBlLCBUeXBlVmlzaXRvclN0YXRlLmRpcmVjdCk7CiAgICAgIH0KCiAgICAgIC8vIFN1cGVyY2xhc3MgbWlnaHQgbWFrZSBjbGFzc2VzIGxpdmUgYXMgdHlwZSBhcmd1bWVudHMuIEZvciBpbnN0YW5jZQogICAgICAvLwogICAgICAvLyAgICBjbGFzcyBBIHt9CiAgICAgIC8vICAgIGNsYXNzIEI8VD4ge30KICAgICAgLy8gICAgY2xhc3MgQyBpbXBsZW1lbnRzIEI8QT4ge30KICAgICAgLy8gICAgbWFpbigpID0+IG5ldyBDKCk7CiAgICAgIC8vCiAgICAgIC8vIEhlcmUgYEFgIGlzIGxpdmUgYXMgYSB0eXBlIGFyZ3VtZW50IHRocm91Z2ggdGhlIGxpdmVuZXNzIG9mIGBDYC4KICAgICAgZm9yIChJbnRlcmZhY2VUeXBlIHN1cGVydHlwZQogICAgICAgICAgaW4gX2Nsb3NlZFdvcmxkLmRhcnRUeXBlcy5nZXRTdXBlcnR5cGVzKHR5cGUuZWxlbWVudCkpIHsKICAgICAgICBpZiAoc3VwZXJ0eXBlLnR5cGVBcmd1bWVudHMuaXNFbXB0eSAmJgogICAgICAgICAgICB2aXNpdGVkU3VwZXJDbGFzc2VzLmNvbnRhaW5zKHN1cGVydHlwZS5lbGVtZW50KSkgewogICAgICAgICAgLy8gSWYgW3N1cGVyY2xhc3NdIGlzIG5vdCBnZW5lcmljIHRoZW4gYSBzZWNvbmQgdmlzaXQgY2Fubm90IGFkZCBtb3JlCiAgICAgICAgICAvLyBpbmZvcm1hdGlvbiB0aGF0IHRoZSBmaXJzdC4gSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHZpc2l0aW5nIGBDYAogICAgICAgICAgLy8gdHdpY2UgY2FuIG9ubHkgcmVzdWx0IGluIGEgc2Vjb25kIHJlZ2lzdHJhdGlvbiBvZiBgQWAgYXMgbGl2ZQogICAgICAgICAgLy8gdHlwZSBhcmd1bWVudC4KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB2aXNpdGVkU3VwZXJDbGFzc2VzLmFkZChzdXBlcnR5cGUuZWxlbWVudCk7CiAgICAgICAgbGl2ZVR5cGVWaXNpdG9yLnZpc2l0VHlwZShzdXBlcnR5cGUsIFR5cGVWaXNpdG9yU3RhdGUuZGlyZWN0KTsKICAgICAgfQogICAgfSk7CgogICAgZm9yIChGdW5jdGlvbkVudGl0eSBlbGVtZW50CiAgICAgICAgaW4gY29kZWdlbldvcmxkQnVpbGRlci5zdGF0aWNGdW5jdGlvbnNOZWVkaW5nR2V0dGVyKSB7CiAgICAgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUgPSBfZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZShlbGVtZW50KTsKICAgICAgbGl2ZVR5cGVWaXNpdG9yLnZpc2l0VHlwZShmdW5jdGlvblR5cGUsIFR5cGVWaXNpdG9yU3RhdGUuZGlyZWN0KTsKICAgIH0KCiAgICBmb3IgKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQgaW4gY29kZWdlbldvcmxkQnVpbGRlci5jbG9zdXJpemVkTWVtYmVycykgewogICAgICBGdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlID0gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRGdW5jdGlvblR5cGUoZWxlbWVudCk7CiAgICAgIGxpdmVUeXBlVmlzaXRvci52aXNpdFR5cGUoZnVuY3Rpb25UeXBlLCBUeXBlVmlzaXRvclN0YXRlLmRpcmVjdCk7CiAgICB9CgogICAgdm9pZCBwcm9jZXNzTWV0aG9kVHlwZUFyZ3VtZW50cyhfLCBTZXQ8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgICAgZm9yIChEYXJ0VHlwZSB0eXBlQXJndW1lbnQgaW4gdHlwZUFyZ3VtZW50cykgewogICAgICAgIGxpdmVUeXBlVmlzaXRvci52aXNpdCgKICAgICAgICAgICAgdHlwZUFyZ3VtZW50LCBUeXBlVmlzaXRvclN0YXRlLmNvdmFyaWFudFR5cGVBcmd1bWVudCk7CiAgICAgIH0KICAgIH0KCiAgICBjb2RlZ2VuV29ybGRCdWlsZGVyLmZvckVhY2hTdGF0aWNUeXBlQXJndW1lbnQocHJvY2Vzc01ldGhvZFR5cGVBcmd1bWVudHMpOwogICAgY29kZWdlbldvcmxkQnVpbGRlci5mb3JFYWNoRHluYW1pY1R5cGVBcmd1bWVudChwcm9jZXNzTWV0aG9kVHlwZUFyZ3VtZW50cyk7CiAgICBjb2RlZ2VuV29ybGRCdWlsZGVyLmxpdmVUeXBlQXJndW1lbnRzLmZvckVhY2goKERhcnRUeXBlIHR5cGUpIHsKICAgICAgbGl2ZVR5cGVWaXNpdG9yLnZpc2l0VHlwZSh0eXBlLCBUeXBlVmlzaXRvclN0YXRlLmNvdmFyaWFudFR5cGVBcmd1bWVudCk7CiAgICB9KTsKICAgIGNvZGVnZW5Xb3JsZEJ1aWxkZXIuY29uc3RUeXBlTGl0ZXJhbHMuZm9yRWFjaCgoRGFydFR5cGUgdHlwZSkgewogICAgICBsaXZlVHlwZVZpc2l0b3IudmlzaXRUeXBlKHR5cGUsIFR5cGVWaXNpdG9yU3RhdGUudHlwZUxpdGVyYWwpOwogICAgfSk7CgogICAgYm9vbCBpc0Z1bmN0aW9uQ2hlY2tlZCA9IGZhbHNlOwoKICAgIHZvaWQgcHJvY2Vzc0NoZWNrZWRUeXBlKERhcnRUeXBlIHQpIHsKICAgICAgaWYgKHQgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgY2hlY2tlZEZ1bmN0aW9uVHlwZXMuYWRkKHQpOwogICAgICB9IGVsc2UgaWYgKHQgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICAgIGlzRnVuY3Rpb25DaGVja2VkID0KICAgICAgICAgICAgaXNGdW5jdGlvbkNoZWNrZWQgfHwgdC5lbGVtZW50ID09IF9jb21tb25FbGVtZW50cy5mdW5jdGlvbkNsYXNzOwogICAgICB9CiAgICAgIHRlc3RlZFR5cGVWaXNpdG9yLnZpc2l0VHlwZSh0LCBUeXBlVmlzaXRvclN0YXRlLmRpcmVjdCk7CiAgICB9CgogICAgZXhwbGljaXRJc0NoZWNrcy5mb3JFYWNoKHByb2Nlc3NDaGVja2VkVHlwZSk7CiAgICBpbXBsaWNpdElzQ2hlY2tzLmZvckVhY2gocHJvY2Vzc0NoZWNrZWRUeXBlKTsKCiAgICAvLyBBIGNsb3N1cmUgY2xhc3MgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb24gdHlwZSBvZiBpdHMgYGNhbGxgCiAgICAvLyBtZXRob2QgYW5kIG5lZWRzIGEgc2lnbmF0dXJlIGZ1bmN0aW9uIGZvciB0ZXN0aW5nIGl0cyBmdW5jdGlvbiB0eXBlCiAgICAvLyBhZ2FpbnN0IHR5cGVkZWZzIGFuZCBmdW5jdGlvbiB0eXBlcyB0aGF0IGFyZSB1c2VkIGluIGlzLWNoZWNrcy4gU2luY2UKICAgIC8vIGNsb3N1cmVzIGhhdmUgYSBzaWduYXR1cmUgbWV0aG9kIGlmZiB0aGV5IG5lZWQgaXQgYW5kIHNob3VsZCBoYXZlIGEKICAgIC8vIGZ1bmN0aW9uIHR5cGUgaWZmIHRoZXkgaGF2ZSBhIHNpZ25hdHVyZSwgd2UgcHJvY2VzcyBhbGwgY2xhc3Nlcy4KICAgIHZvaWQgcHJvY2Vzc0NsYXNzKENsYXNzRW50aXR5IGNscykgewogICAgICBDbGFzc0Z1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUgPQogICAgICAgICAgX2NvbXB1dGVGdW5jdGlvblR5cGUoX2VsZW1lbnRFbnZpcm9ubWVudCwgY2xzKTsKICAgICAgaWYgKGZ1bmN0aW9uVHlwZSAhPSBudWxsKSB7CiAgICAgICAgQ2xhc3NVc2UgY2xhc3NVc2UgPSBjbGFzc1VzZU1hcC5wdXRJZkFic2VudChjbHMsICgpID0+IG5ldyBDbGFzc1VzZSgpKTsKICAgICAgICBjbGFzc1VzZS5mdW5jdGlvblR5cGUgPSBmdW5jdGlvblR5cGU7CiAgICAgIH0KICAgIH0KCiAgICAvLyBDb2xsZWN0IGNsYXNzZXMgdGhhdCBhcmUgJ2xpdmUnIGVpdGhlciB0aHJvdWdoIGluc3RhbnRpYXRpb24gb3IgdXNlIGluCiAgICAvLyB0eXBlIGFyZ3VtZW50cy4KICAgIExpc3Q8Q2xhc3NFbnRpdHk+IGxpdmVDbGFzc2VzID0gPENsYXNzRW50aXR5PltdOwogICAgY2xhc3NVc2VNYXAuZm9yRWFjaCgoQ2xhc3NFbnRpdHkgY2xzLCBDbGFzc1VzZSBjbGFzc1VzZSkgewogICAgICBpZiAoY2xhc3NVc2UuaXNMaXZlKSB7CiAgICAgICAgbGl2ZUNsYXNzZXMuYWRkKGNscyk7CiAgICAgIH0KICAgIH0pOwogICAgbGl2ZUNsYXNzZXMuZm9yRWFjaChwcm9jZXNzQ2xhc3MpOwoKICAgIGlmIChvcHRpb25zLnBhcmFtZXRlckNoZWNrUG9saWN5LmlzRW1pdHRlZCkgewogICAgICBmb3IgKEZ1bmN0aW9uRW50aXR5IG1ldGhvZCBpbiBjb2RlZ2VuV29ybGRCdWlsZGVyLmdlbmVyaWNNZXRob2RzKSB7CiAgICAgICAgaWYgKF9ydGlOZWVkLm1ldGhvZE5lZWRzVHlwZUFyZ3VtZW50cyhtZXRob2QpKSB7CiAgICAgICAgICBmb3IgKFR5cGVWYXJpYWJsZVR5cGUgdHlwZVZhcmlhYmxlCiAgICAgICAgICAgICAgaW4gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRGdW5jdGlvblR5cGVWYXJpYWJsZXMobWV0aG9kKSkgewogICAgICAgICAgICBEYXJ0VHlwZSBib3VuZCA9CiAgICAgICAgICAgICAgICBfZWxlbWVudEVudmlyb25tZW50LmdldFR5cGVWYXJpYWJsZUJvdW5kKHR5cGVWYXJpYWJsZS5lbGVtZW50KTsKICAgICAgICAgICAgcHJvY2Vzc0NoZWNrZWRUeXBlKGJvdW5kKTsKICAgICAgICAgICAgbGl2ZVR5cGVWaXNpdG9yLnZpc2l0KAogICAgICAgICAgICAgICAgYm91bmQsIFR5cGVWaXNpdG9yU3RhdGUuY292YXJpYW50VHlwZUFyZ3VtZW50KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBjYWNoZWRSZXF1aXJlZENoZWNrcyA9IF9jb21wdXRlQ2hlY2tzKGNsYXNzVXNlTWFwKTsKICAgIHJ0aUNoZWNrc0J1aWxkZXJDbG9zZWQgPSB0cnVlOwogICAgcmV0dXJuIG5ldyBfUnVudGltZVR5cGVzQ2hlY2tzKAogICAgICAgIHRoaXMsIGNhY2hlZFJlcXVpcmVkQ2hlY2tzLCB0eXBlQXJndW1lbnRzLCB0eXBlTGl0ZXJhbHMpOwogIH0KfQoKLy8vIENvbXB1dGVzIHRoZSBmdW5jdGlvbiB0eXBlIG9mIFtjbHNdLCBpZiBhbnkuCi8vLwovLy8gSW4gRGFydCAxLCBhbnkgY2xhc3Mgd2l0aCBhIGBjYWxsYCBtZXRob2QgaGFzIGEgZnVuY3Rpb24gdHlwZSwgaW4gRGFydCAyCi8vLyBvbmx5IGNsb3N1cmUgY2xhc3NlcyBoYXZlIGEgZnVuY3Rpb24gdHlwZS4KQ2xhc3NGdW5jdGlvblR5cGUgX2NvbXB1dGVGdW5jdGlvblR5cGUoCiAgICBFbGVtZW50RW52aXJvbm1lbnQgZWxlbWVudEVudmlyb25tZW50LCBDbGFzc0VudGl0eSBjbHMpIHsKICBGdW5jdGlvbkVudGl0eSBzaWduYXR1cmVGdW5jdGlvbjsKICBpZiAoY2xzLmlzQ2xvc3VyZSkgewogICAgLy8gVXNlIHNpZ25hdHVyZSBmdW5jdGlvbiBpZiBhdmFpbGFibGUuCiAgICBzaWduYXR1cmVGdW5jdGlvbiA9CiAgICAgICAgZWxlbWVudEVudmlyb25tZW50Lmxvb2t1cExvY2FsQ2xhc3NNZW1iZXIoY2xzLCBJZGVudGlmaWVycy5zaWduYXR1cmUpOwogICAgaWYgKHNpZ25hdHVyZUZ1bmN0aW9uID09IG51bGwpIHsKICAgICAgLy8gSW4gRGFydCAyLCBhIGNsb3N1cmUgb25seSBuZWVkcyBpdHMgZnVuY3Rpb24gdHlwZSBpZiBpdCBoYXMgYQogICAgICAvLyBzaWduYXR1cmUgZnVuY3Rpb24uCiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0gZWxzZSB7CiAgICAvLyBPbmx5IGNsb3N1cmVzIGhhdmUgZnVuY3Rpb24gdHlwZSBpbiBEYXJ0IDIuCiAgICByZXR1cm4gbnVsbDsKICB9CiAgTWVtYmVyRW50aXR5IGNhbGwgPQogICAgICBlbGVtZW50RW52aXJvbm1lbnQubG9va3VwTG9jYWxDbGFzc01lbWJlcihjbHMsIElkZW50aWZpZXJzLmNhbGwpOwogIGlmIChjYWxsICE9IG51bGwgJiYgY2FsbC5pc0Z1bmN0aW9uKSB7CiAgICBGdW5jdGlvbkVudGl0eSBjYWxsRnVuY3Rpb24gPSBjYWxsOwogICAgRnVuY3Rpb25UeXBlIGNhbGxUeXBlID0gZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZShjYWxsRnVuY3Rpb24pOwogICAgcmV0dXJuIG5ldyBDbGFzc0Z1bmN0aW9uVHlwZShjYWxsRnVuY3Rpb24sIGNhbGxUeXBlLCBzaWduYXR1cmVGdW5jdGlvbik7CiAgfQogIHJldHVybiBudWxsOwp9CgpjbGFzcyBSdW50aW1lVHlwZXNFbmNvZGVySW1wbCBpbXBsZW1lbnRzIFJ1bnRpbWVUeXBlc0VuY29kZXIgewogIGZpbmFsIE5hbWVyIG5hbWVyOwogIGZpbmFsIEVsZW1lbnRFbnZpcm9ubWVudCBfZWxlbWVudEVudmlyb25tZW50OwogIGZpbmFsIENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzOwogIGZpbmFsIFR5cGVSZXByZXNlbnRhdGlvbkdlbmVyYXRvciBfcmVwcmVzZW50YXRpb25HZW5lcmF0b3I7CiAgZmluYWwgUnVudGltZVR5cGVzTmVlZCBfcnRpTmVlZDsKCiAgUnVudGltZVR5cGVzRW5jb2RlckltcGwodGhpcy5uYW1lciwgTmF0aXZlQmFzaWNEYXRhIG5hdGl2ZURhdGEsCiAgICAgIHRoaXMuX2VsZW1lbnRFbnZpcm9ubWVudCwgdGhpcy5jb21tb25FbGVtZW50cywgdGhpcy5fcnRpTmVlZCkKICAgICAgOiBfcmVwcmVzZW50YXRpb25HZW5lcmF0b3IgPQogICAgICAgICAgICBuZXcgVHlwZVJlcHJlc2VudGF0aW9uR2VuZXJhdG9yKG5hbWVyLCBuYXRpdmVEYXRhKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1NpbXBsZUZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgdHlwZSkgewogICAgaWYgKCF0eXBlLnJldHVyblR5cGUuaXNEeW5hbWljKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoIXR5cGUub3B0aW9uYWxQYXJhbWV0ZXJUeXBlcy5pc0VtcHR5KSByZXR1cm4gZmFsc2U7CiAgICBpZiAoIXR5cGUubmFtZWRQYXJhbWV0ZXJUeXBlcy5pc0VtcHR5KSByZXR1cm4gZmFsc2U7CiAgICBmb3IgKERhcnRUeXBlIHBhcmFtZXRlciBpbiB0eXBlLnBhcmFtZXRlclR5cGVzKSB7CiAgICAgIGlmICghcGFyYW1ldGVyLmlzRHluYW1pYykgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgSmF2YVNjcmlwdCB0ZW1wbGF0ZSB0byBkZXRlcm1pbmUgYXQgcnVudGltZSBpZiBhIHR5cGUgb2JqZWN0CiAgLy8vIGlzIGEgZnVuY3Rpb24gdHlwZS4KICBAb3ZlcnJpZGUKICBqc0FzdC5UZW1wbGF0ZSBnZXQgdGVtcGxhdGVGb3JJc0Z1bmN0aW9uVHlwZSB7CiAgICByZXR1cm4gX3JlcHJlc2VudGF0aW9uR2VuZXJhdG9yLnRlbXBsYXRlRm9ySXNGdW5jdGlvblR5cGU7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgSmF2YVNjcmlwdCB0ZW1wbGF0ZSB0byBkZXRlcm1pbmUgYXQgcnVudGltZSBpZiBhIHR5cGUgb2JqZWN0CiAgLy8vIGlzIGEgRnV0dXJlT3IgdHlwZS4KICBAb3ZlcnJpZGUKICBqc0FzdC5UZW1wbGF0ZSBnZXQgdGVtcGxhdGVGb3JJc0Z1dHVyZU9yVHlwZSB7CiAgICByZXR1cm4gX3JlcHJlc2VudGF0aW9uR2VuZXJhdG9yLnRlbXBsYXRlRm9ySXNGdXR1cmVPclR5cGU7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgSmF2YVNjcmlwdCB0ZW1wbGF0ZSB0byBkZXRlcm1pbmUgYXQgcnVudGltZSBpZiBhIHR5cGUgb2JqZWN0CiAgLy8vIGlzIHRoZSB2b2lkIHR5cGUuCiAgQG92ZXJyaWRlCiAganNBc3QuVGVtcGxhdGUgZ2V0IHRlbXBsYXRlRm9ySXNWb2lkVHlwZSB7CiAgICByZXR1cm4gX3JlcHJlc2VudGF0aW9uR2VuZXJhdG9yLnRlbXBsYXRlRm9ySXNWb2lkVHlwZTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBKYXZhU2NyaXB0IHRlbXBsYXRlIHRvIGRldGVybWluZSBhdCBydW50aW1lIGlmIGEgdHlwZSBvYmplY3QKICAvLy8gaXMgdGhlIGR5bmFtaWMgdHlwZS4KICBAb3ZlcnJpZGUKICBqc0FzdC5UZW1wbGF0ZSBnZXQgdGVtcGxhdGVGb3JJc0R5bmFtaWNUeXBlIHsKICAgIHJldHVybiBfcmVwcmVzZW50YXRpb25HZW5lcmF0b3IudGVtcGxhdGVGb3JJc0R5bmFtaWNUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuVGVtcGxhdGUgZ2V0IHRlbXBsYXRlRm9ySXNKc0ludGVyb3BUeXBlQXJndW1lbnQgewogICAgcmV0dXJuIF9yZXByZXNlbnRhdGlvbkdlbmVyYXRvci50ZW1wbGF0ZUZvcklzSnNJbnRlcm9wVHlwZUFyZ3VtZW50OwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiBnZXRUeXBlUmVwcmVzZW50YXRpb24oCiAgICAgIEVtaXR0ZXIgZW1pdHRlciwgRGFydFR5cGUgdHlwZSwgT25WYXJpYWJsZUNhbGxiYWNrIG9uVmFyaWFibGUsCiAgICAgIFtTaG91bGRFbmNvZGVUeXBlZGVmQ2FsbGJhY2sgc2hvdWxkRW5jb2RlVHlwZWRlZl0pIHsKICAgIHJldHVybiBfcmVwcmVzZW50YXRpb25HZW5lcmF0b3IuZ2V0VHlwZVJlcHJlc2VudGF0aW9uKAogICAgICAgIGVtaXR0ZXIsIHR5cGUsIG9uVmFyaWFibGUsIHNob3VsZEVuY29kZVR5cGVkZWYpOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiBnZXRTdWJzdGl0dXRpb25SZXByZXNlbnRhdGlvbigKICAgICAgRW1pdHRlciBlbWl0dGVyLCBMaXN0PERhcnRUeXBlPiB0eXBlcywgT25WYXJpYWJsZUNhbGxiYWNrIG9uVmFyaWFibGUpIHsKICAgIExpc3Q8anNBc3QuRXhwcmVzc2lvbj4gZWxlbWVudHMgPSB0eXBlcwogICAgICAgIC5tYXAoCiAgICAgICAgICAgIChEYXJ0VHlwZSB0eXBlKSA9PiBnZXRUeXBlUmVwcmVzZW50YXRpb24oZW1pdHRlciwgdHlwZSwgb25WYXJpYWJsZSkpCiAgICAgICAgLnRvTGlzdChncm93YWJsZTogZmFsc2UpOwogICAgcmV0dXJuIG5ldyBqc0FzdC5BcnJheUluaXRpYWxpemVyKGVsZW1lbnRzKTsKICB9CgogIFN0cmluZyBnZXRUeXBlVmFyaWFibGVOYW1lKFR5cGVWYXJpYWJsZVR5cGUgdHlwZSkgewogICAgU3RyaW5nIG5hbWUgPSB0eXBlLmVsZW1lbnQubmFtZTsKICAgIHJldHVybiBuYW1lLnJlcGxhY2VBbGwoJyMnLCAnXycpOwogIH0KCiAganNBc3QuRXhwcmVzc2lvbiBnZXRUeXBlRW5jb2RpbmcoRW1pdHRlciBlbWl0dGVyLCBEYXJ0VHlwZSB0eXBlLAogICAgICB7Ym9vbCBhbHdheXNHZW5lcmF0ZUZ1bmN0aW9uOiBmYWxzZX0pIHsKICAgIENsYXNzRW50aXR5IGNvbnRleHRDbGFzcyA9IERhcnRUeXBlcy5nZXRDbGFzc0NvbnRleHQodHlwZSk7CiAgICBqc0FzdC5FeHByZXNzaW9uIG9uVmFyaWFibGUoVHlwZVZhcmlhYmxlVHlwZSB2KSB7CiAgICAgIHJldHVybiBuZXcganNBc3QuVmFyaWFibGVVc2UoZ2V0VHlwZVZhcmlhYmxlTmFtZSh2KSk7CiAgICB9CgogICAganNBc3QuRXhwcmVzc2lvbiBlbmNvZGluZyA9CiAgICAgICAgZ2V0VHlwZVJlcHJlc2VudGF0aW9uKGVtaXR0ZXIsIHR5cGUsIG9uVmFyaWFibGUpOwogICAgaWYgKGNvbnRleHRDbGFzcyA9PSBudWxsICYmICFhbHdheXNHZW5lcmF0ZUZ1bmN0aW9uKSB7CiAgICAgIHJldHVybiBlbmNvZGluZzsKICAgIH0gZWxzZSB7CiAgICAgIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJzID0gY29uc3QgPFN0cmluZz5bXTsKICAgICAgaWYgKGNvbnRleHRDbGFzcyAhPSBudWxsKSB7CiAgICAgICAgcGFyYW1ldGVycyA9IF9lbGVtZW50RW52aXJvbm1lbnQKICAgICAgICAgICAgLmdldFRoaXNUeXBlKGNvbnRleHRDbGFzcykKICAgICAgICAgICAgLnR5cGVBcmd1bWVudHMKICAgICAgICAgICAgLm1hcCgoRGFydFR5cGUgX3R5cGUpIHsKICAgICAgICAgIFR5cGVWYXJpYWJsZVR5cGUgdHlwZSA9IF90eXBlOwogICAgICAgICAgcmV0dXJuIGdldFR5cGVWYXJpYWJsZU5hbWUodHlwZSk7CiAgICAgICAgfSkudG9MaXN0KCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGpzKCdmdW5jdGlvbigjKSB7IHJldHVybiAjIH0nLCBbcGFyYW1ldGVycywgZW5jb2RpbmddKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gZ2V0U2lnbmF0dXJlRW5jb2RpbmcoCiAgICAgIEVtaXR0ZXIgZW1pdHRlciwgRGFydFR5cGUgdHlwZSwganNBc3QuRXhwcmVzc2lvbiB0aGlzXykgewogICAgQ2xhc3NFbnRpdHkgY29udGV4dENsYXNzID0gRGFydFR5cGVzLmdldENsYXNzQ29udGV4dCh0eXBlKTsKICAgIGpzQXN0LkV4cHJlc3Npb24gZW5jb2RpbmcgPQogICAgICAgIGdldFR5cGVFbmNvZGluZyhlbWl0dGVyLCB0eXBlLCBhbHdheXNHZW5lcmF0ZUZ1bmN0aW9uOiB0cnVlKTsKICAgIGlmIChjb250ZXh0Q2xhc3MgIT0gbnVsbCAmJgogICAgICAgIC8vIFdlIG9ubHkgZ2VuZXJhdGUgZm9sZGluZyB1c2luZyAnY29tcHV0ZVNpZ25hdHVyZScgaWYgW2NvbnRleHRDbGFzc10KICAgICAgICAvLyBoYXMgcmVpZmllZCB0eXBlIGFyZ3VtZW50cy4gVGhlICdjb21wdXRlU2lnbmF0dXJlJyBmdW5jdGlvbiBtaWdodCBub3QKICAgICAgICAvLyBiZSBlbWl0dGVkIChpZiBpdCdzIG5vdCBuZWVkZWQgZWxzZXdoZXJlKSBhbmQgdGhlIGdlbmVyYXRlZCBzaWduYXR1cmUKICAgICAgICAvLyB3aWxsIGhhdmUgYHVuZGVmaW5lZGAgYXMgaXRzIHR5cGUgdmFyaWFibGVzIGluIGFueSBjYXNlLgogICAgICAgIC8vCiAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgc3BlY2lmaWNhbGx5IGZvciAtLWxheC1ydW50aW1lLXR5cGUtdG8tc3RyaW5nIHdoaWNoCiAgICAgICAgLy8gbWF5IHJlcXVpcmUgYSBzaWduYXR1cmUgb24gYSBtZXRob2QgdGhhdCB1c2VzIGNsYXNzIHR5cGUgdmFyaWFibGVzCiAgICAgICAgLy8gd2hpbGUgYXQgdGhlIHNhbWUgdGltZSBub3QgbmVlZGluZyB0eXBlIGFyZ3VtZW50cyBvbiB0aGUgY2xhc3MuCiAgICAgICAgX3J0aU5lZWQuY2xhc3NOZWVkc1R5cGVBcmd1bWVudHMoY29udGV4dENsYXNzKSkgewogICAgICBqc0FzdC5OYW1lIGNvbnRleHROYW1lID0gbmFtZXIuY2xhc3NOYW1lKGNvbnRleHRDbGFzcyk7CiAgICAgIHJldHVybiBqcygnZnVuY3Rpb24gKCkgeyByZXR1cm4gIygjLCAjLCAjKTsgfScsIFsKICAgICAgICBlbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGNvbW1vbkVsZW1lbnRzLmNvbXB1dGVTaWduYXR1cmUpLAogICAgICAgIGVuY29kaW5nLAogICAgICAgIHRoaXNfLAogICAgICAgIGpzLnF1b3RlTmFtZShjb250ZXh0TmFtZSkKICAgICAgXSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZW5jb2Rpbmc7CiAgICB9CiAgfQoKICAvLy8gQ29tcHV0ZSBhIEphdmFTY3JpcHQgZXhwcmVzc2lvbiB0aGF0IGRlc2NyaWJlcyB0aGUgbmVjZXNzYXJ5IHN1YnN0aXR1dGlvbgogIC8vLyBmb3IgdHlwZSBhcmd1bWVudHMgaW4gYSBzdWJ0eXBlIHRlc3QuCiAgLy8vCiAgLy8vIFRoZSByZXN1bHQgY2FuIGJlOgogIC8vLyAgMSkgYG51bGxgLCBpZiBubyBzdWJzdGl0dXRlZCBjaGVjayBpcyBuZWNlc3NhcnksIGJlY2F1c2UgdGhlIHR5cGUKICAvLy8gICAgIHZhcmlhYmxlcyBhcmUgdGhlIHNhbWUgb3IgdGhlcmUgYXJlIG5vIHR5cGUgdmFyaWFibGVzIGluIHRoZSBjbGFzcwogIC8vLyAgICAgdGhhdCBpcyBjaGVja2VkIGZvci4KICAvLy8gIDIpIEEgbGlzdCBleHByZXNzaW9uIGRlc2NyaWJpbmcgdGhlIHR5cGUgYXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gdGhlCiAgLy8vICAgICBzdWJ0eXBlIGNoZWNrLCBpZiB0aGUgdHlwZSBhcmd1bWVudHMgdG8gYmUgdXNlZCBpbiB0aGUgY2hlY2sgZG8gbm90CiAgLy8vICAgICBkZXBlbmQgb24gdGhlIHR5cGUgYXJndW1lbnRzIG9mIHRoZSBvYmplY3QuCiAgLy8vICAzKSBBIGZ1bmN0aW9uIG1hcHBpbmcgdGhlIHR5cGUgdmFyaWFibGVzIG9mIHRoZSBvYmplY3QgdG8gYmUgY2hlY2tlZCB0bwogIC8vLyAgICAgYSBsaXN0IGV4cHJlc3Npb24uCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiBnZXRTdWJzdGl0dXRpb25Db2RlKAogICAgICBFbWl0dGVyIGVtaXR0ZXIsIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24pIHsKICAgIGlmIChzdWJzdGl0dXRpb24uaXNUcml2aWFsKSB7CiAgICAgIHJldHVybiBuZXcganNBc3QuTGl0ZXJhbE51bGwoKTsKICAgIH0KCiAgICBpZiAoc3Vic3RpdHV0aW9uLmlzSnNJbnRlcm9wKSB7CiAgICAgIHJldHVybiBqcygKICAgICAgICAgICdmdW5jdGlvbigpIHsgcmV0dXJuICMgfScsCiAgICAgICAgICBfcmVwcmVzZW50YXRpb25HZW5lcmF0b3IKICAgICAgICAgICAgICAuZ2V0SnNJbnRlcm9wVHlwZUFyZ3VtZW50cyhzdWJzdGl0dXRpb24ubGVuZ3RoKSk7CiAgICB9CgogICAganNBc3QuRXhwcmVzc2lvbiBkZWNsYXJhdGlvbihUeXBlVmFyaWFibGVUeXBlIHZhcmlhYmxlKSB7CiAgICAgIHJldHVybiBuZXcganNBc3QuUGFyYW1ldGVyKGdldFZhcmlhYmxlTmFtZSh2YXJpYWJsZS5lbGVtZW50Lm5hbWUpKTsKICAgIH0KCiAgICBqc0FzdC5FeHByZXNzaW9uIHVzZShUeXBlVmFyaWFibGVUeXBlIHZhcmlhYmxlKSB7CiAgICAgIHJldHVybiBuZXcganNBc3QuVmFyaWFibGVVc2UoZ2V0VmFyaWFibGVOYW1lKHZhcmlhYmxlLmVsZW1lbnQubmFtZSkpOwogICAgfQoKICAgIGlmIChzdWJzdGl0dXRpb24uYXJndW1lbnRzLmV2ZXJ5KChEYXJ0VHlwZSB0eXBlKSA9PiB0eXBlLmlzRHluYW1pYykpIHsKICAgICAgcmV0dXJuIGVtaXR0ZXIuZ2VuZXJhdGVGdW5jdGlvblRoYXRSZXR1cm5zTnVsbCgpOwogICAgfSBlbHNlIHsKICAgICAganNBc3QuRXhwcmVzc2lvbiB2YWx1ZSA9CiAgICAgICAgICBnZXRTdWJzdGl0dXRpb25SZXByZXNlbnRhdGlvbihlbWl0dGVyLCBzdWJzdGl0dXRpb24uYXJndW1lbnRzLCB1c2UpOwogICAgICBpZiAoc3Vic3RpdHV0aW9uLmlzRnVuY3Rpb24pIHsKICAgICAgICBJdGVyYWJsZTxqc0FzdC5FeHByZXNzaW9uPiBmb3JtYWxzID0KICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUGFzcyBbZGVjbGFyYXRpb25dIGRpcmVjdGx5IHRvIGBtYXBgIHdoZW4KICAgICAgICAgICAgLy8gYHN1YnN0aXR1dGlvbi5wYXJhbWV0ZXJzYCBjYW4gbm8gbG9uZ2VyIGJlIGEKICAgICAgICAgICAgLy8gYExpc3Q8UmVzb2x1dGlvbkRhcnRUeXBlPmAuCiAgICAgICAgICAgIHN1YnN0aXR1dGlvbi5wYXJhbWV0ZXJzLm1hcCgodHlwZSkgPT4gZGVjbGFyYXRpb24odHlwZSkpOwogICAgICAgIHJldHVybiBqcygnZnVuY3Rpb24oIykgeyByZXR1cm4gIyB9JywgW2Zvcm1hbHMsIHZhbHVlXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGpzKCdmdW5jdGlvbigpIHsgcmV0dXJuICMgfScsIHZhbHVlKTsKICAgICAgfQogICAgfQogIH0KCiAgU3RyaW5nIGdldFZhcmlhYmxlTmFtZShTdHJpbmcgbmFtZSkgewogICAgLy8gS2VybmVsIHR5cGUgdmFyaWFibGUgbmFtZXMgZm9yIGFub255bW91cyBtaXhpbiBhcHBsaWNhdGlvbnMgaGF2ZSBuYW1lcwogICAgLy8gY2Fub25pY2FsaXplZCB0byBhIG5vbi1pZGVudGlmaWVkLCBlLmcuICcjVTAnLgogICAgbmFtZSA9IG5hbWUucmVwbGFjZUFsbCgnIycsICdfJyk7CiAgICByZXR1cm4gbmFtZXIuc2FmZVZhcmlhYmxlTmFtZShuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0Lk5hbWUgZ2V0IGdldEZ1bmN0aW9uVGhhdFJldHVybnNOdWxsTmFtZSA9PgogICAgICBuYW1lci5pbnRlcm5hbEdsb2JhbCgnZnVuY3Rpb25UaGF0UmV0dXJuc051bGwnKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldFR5cGVSZXByZXNlbnRhdGlvbkZvclR5cGVDb25zdGFudChEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZS5pc0R5bmFtaWMpIHJldHVybiAiZHluYW1pYyI7CiAgICBpZiAodHlwZSBpcyBUeXBlZGVmVHlwZSkgewogICAgICByZXR1cm4gbmFtZXIudW5pcXVlTmFtZUZvclR5cGVDb25zdGFudEVsZW1lbnQoCiAgICAgICAgICB0eXBlLmVsZW1lbnQubGlicmFyeSwgdHlwZS5lbGVtZW50KTsKICAgIH0KICAgIGlmICh0eXBlIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBZGQgbmFtaW5nIHNjaGVtZSBmb3IgZnVuY3Rpb24gdHlwZSBsaXRlcmFscy4KICAgICAgLy8gVGhlc2UgY3VycmVudGx5IG9ubHkgb2NjdXIgZnJvbSBrZXJuZWwuCiAgICAgIHJldHVybiAnKCktPic7CiAgICB9CiAgICBJbnRlcmZhY2VUeXBlIGludGVyZmFjZSA9IHR5cGU7CiAgICBTdHJpbmcgbmFtZSA9IG5hbWVyLnVuaXF1ZU5hbWVGb3JUeXBlQ29uc3RhbnRFbGVtZW50KAogICAgICAgIGludGVyZmFjZS5lbGVtZW50LmxpYnJhcnksIGludGVyZmFjZS5lbGVtZW50KTsKCiAgICAvLyBUeXBlIGNvbnN0YW50cyBjYW4gY3VycmVudGx5IG9ubHkgYmUgcmF3IHR5cGVzLCBzbyB0aGVyZSBpcyBubyBwb2ludAogICAgLy8gYWRkaW5nIGdyb3VuZC10ZXJtIHR5cGUgcGFyYW1ldGVycywgYXMgdGhleSB3b3VsZCBqdXN0IGJlICdkeW5hbWljJy4KICAgIC8vIFRPRE8oc3JhKTogU2luY2UgdGhlIHJlc3VsdCBzdHJpbmcgaXMgdXNlZCBvbmx5IGluIGNvbnN0cnVjdGluZyBjb25zdGFudAogICAgLy8gbmFtZXMsIGl0IHdvdWxkIHJlc3VsdCBpbiBtb3JlIHJlYWRhYmxlIG5hbWVzIGlmIHRoZSBmaW5hbCBzdHJpbmcgd2FzIGEKICAgIC8vIGxlZ2FsIEphdmFTY3JpcHQgaWRlbnRpZmllci4KICAgIGlmIChpbnRlcmZhY2UudHlwZUFyZ3VtZW50cy5pc0VtcHR5KSByZXR1cm4gbmFtZTsKICAgIFN0cmluZyBhcmd1bWVudHMgPQogICAgICAgIG5ldyBMaXN0LmZpbGxlZChpbnRlcmZhY2UudHlwZUFyZ3VtZW50cy5sZW5ndGgsICdkeW5hbWljJykuam9pbignLCAnKTsKICAgIHJldHVybiAnJG5hbWU8JGFyZ3VtZW50cz4nOwogIH0KfQoKY2xhc3MgVHlwZVJlcHJlc2VudGF0aW9uR2VuZXJhdG9yCiAgICBpbXBsZW1lbnRzIERhcnRUeXBlVmlzaXRvcjxqc0FzdC5FeHByZXNzaW9uLCBFbWl0dGVyPiB7CiAgZmluYWwgTmFtZXIgbmFtZXI7CiAgZmluYWwgTmF0aXZlQmFzaWNEYXRhIF9uYXRpdmVEYXRhOwoKICBPblZhcmlhYmxlQ2FsbGJhY2sgb25WYXJpYWJsZTsKICBTaG91bGRFbmNvZGVUeXBlZGVmQ2FsbGJhY2sgc2hvdWxkRW5jb2RlVHlwZWRlZjsKICBNYXA8VHlwZVZhcmlhYmxlVHlwZSwganNBc3QuRXhwcmVzc2lvbj4gdHlwZWRlZkJpbmRpbmdzOwogIExpc3Q8RnVuY3Rpb25UeXBlVmFyaWFibGU+IGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyA9IDxGdW5jdGlvblR5cGVWYXJpYWJsZT5bXTsKCiAgVHlwZVJlcHJlc2VudGF0aW9uR2VuZXJhdG9yKHRoaXMubmFtZXIsIHRoaXMuX25hdGl2ZURhdGEpOwoKICAvLy8gQ3JlYXRlcyBhIHR5cGUgcmVwcmVzZW50YXRpb24gZm9yIFt0eXBlXS4gW29uVmFyaWFibGVdIGlzIGNhbGxlZCB0bwogIC8vLyBwcm92aWRlIHRoZSB0eXBlIHJlcHJlc2VudGF0aW9uIGZvciB0eXBlIHZhcmlhYmxlcy4KICBqc0FzdC5FeHByZXNzaW9uIGdldFR5cGVSZXByZXNlbnRhdGlvbigKICAgICAgRW1pdHRlciBlbWl0dGVyLAogICAgICBEYXJ0VHlwZSB0eXBlLAogICAgICBPblZhcmlhYmxlQ2FsbGJhY2sgb25WYXJpYWJsZSwKICAgICAgU2hvdWxkRW5jb2RlVHlwZWRlZkNhbGxiYWNrIGVuY29kZVR5cGVkZWYpIHsKICAgIGFzc2VydCh0eXBlZGVmQmluZGluZ3MgPT0gbnVsbCk7CiAgICB0aGlzLm9uVmFyaWFibGUgPSBvblZhcmlhYmxlOwogICAgdGhpcy5zaG91bGRFbmNvZGVUeXBlZGVmID0KICAgICAgICAoZW5jb2RlVHlwZWRlZiAhPSBudWxsKSA/IGVuY29kZVR5cGVkZWYgOiAoVHlwZWRlZlR5cGUgdHlwZSkgPT4gZmFsc2U7CiAgICBqc0FzdC5FeHByZXNzaW9uIHJlcHJlc2VudGF0aW9uID0gdmlzaXQodHlwZSwgZW1pdHRlcik7CiAgICB0aGlzLm9uVmFyaWFibGUgPSBudWxsOwogICAgdGhpcy5zaG91bGRFbmNvZGVUeXBlZGVmID0gbnVsbDsKICAgIGFzc2VydChmdW5jdGlvblR5cGVWYXJpYWJsZXMuaXNFbXB0eSk7CiAgICByZXR1cm4gcmVwcmVzZW50YXRpb247CiAgfQoKICBqc0FzdC5FeHByZXNzaW9uIGdldEphdmFTY3JpcHRDbGFzc05hbWUoRW50aXR5IGVsZW1lbnQsIEVtaXR0ZXIgZW1pdHRlcikgewogICAgcmV0dXJuIGVtaXR0ZXIudHlwZUFjY2VzcyhlbGVtZW50KTsKICB9CgogIGpzQXN0LkV4cHJlc3Npb24gZ2V0RHluYW1pY1ZhbHVlKCkgPT4ganMoJ251bGwnKTsKCiAganNBc3QuRXhwcmVzc2lvbiBnZXRWb2lkVmFsdWUoKSA9PiBqcygnLTEnKTsKCiAganNBc3QuRXhwcmVzc2lvbiBnZXRKc0ludGVyb3BUeXBlQXJndW1lbnRWYWx1ZSgpID0+IGpzKCctMicpOwogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gdmlzaXQoRGFydFR5cGUgdHlwZSwgRW1pdHRlciBlbWl0dGVyKSA9PgogICAgICB0eXBlLmFjY2VwdCh0aGlzLCBlbWl0dGVyKTsKCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiB2aXNpdFR5cGVWYXJpYWJsZVR5cGUoCiAgICAgIFR5cGVWYXJpYWJsZVR5cGUgdHlwZSwgRW1pdHRlciBlbWl0dGVyKSB7CiAgICBpZiAodHlwZWRlZkJpbmRpbmdzICE9IG51bGwpIHsKICAgICAgYXNzZXJ0KHR5cGVkZWZCaW5kaW5nc1t0eXBlXSAhPSBudWxsKTsKICAgICAgcmV0dXJuIHR5cGVkZWZCaW5kaW5nc1t0eXBlXTsKICAgIH0KICAgIHJldHVybiBvblZhcmlhYmxlKHR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiB2aXNpdEZ1bmN0aW9uVHlwZVZhcmlhYmxlKAogICAgICBGdW5jdGlvblR5cGVWYXJpYWJsZSB0eXBlLCBFbWl0dGVyIGVtaXR0ZXIpIHsKICAgIGludCBwb3NpdGlvbiA9IGZ1bmN0aW9uVHlwZVZhcmlhYmxlcy5pbmRleE9mKHR5cGUpOwogICAgYXNzZXJ0KHBvc2l0aW9uID49IDApOwogICAgcmV0dXJuIGpzLm51bWJlcihmdW5jdGlvblR5cGVWYXJpYWJsZXMubGVuZ3RoIC0gcG9zaXRpb24gLSAxKTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gdmlzaXREeW5hbWljVHlwZShEeW5hbWljVHlwZSB0eXBlLCBFbWl0dGVyIGVtaXR0ZXIpIHsKICAgIHJldHVybiBnZXREeW5hbWljVmFsdWUoKTsKICB9CgogIGpzQXN0LkV4cHJlc3Npb24gZ2V0SnNJbnRlcm9wVHlwZUFyZ3VtZW50cyhpbnQgY291bnQsCiAgICAgIHtqc0FzdC5FeHByZXNzaW9uIG5hbWV9KSB7CiAgICBMaXN0PGpzQXN0LkV4cHJlc3Npb24+IGVsZW1lbnRzID0gPGpzQXN0LkV4cHJlc3Npb24+W107CiAgICBpZiAobmFtZSAhPSBudWxsKSB7CiAgICAgIGVsZW1lbnRzLmFkZChuYW1lKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBlbGVtZW50cy5hZGQoZ2V0SnNJbnRlcm9wVHlwZUFyZ3VtZW50VmFsdWUoKSk7CiAgICB9CiAgICByZXR1cm4gbmV3IGpzQXN0LkFycmF5SW5pdGlhbGl6ZXIoZWxlbWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSB0eXBlLCBFbWl0dGVyIGVtaXR0ZXIpIHsKICAgIGpzQXN0LkV4cHJlc3Npb24gbmFtZSA9IGdldEphdmFTY3JpcHRDbGFzc05hbWUodHlwZS5lbGVtZW50LCBlbWl0dGVyKTsKICAgIGpzQXN0LkV4cHJlc3Npb24gcmVzdWx0OwogICAgaWYgKHR5cGUudHlwZUFyZ3VtZW50cy5pc0VtcHR5KSB7CiAgICAgIHJlc3VsdCA9IG5hbWU7CiAgICB9IGVsc2UgewogICAgICAvLyBWaXNpdCBhbGwgdHlwZSBhcmd1bWVudHMuIFRoaXMgaXMgZG9uZSBldmVuIGZvciBqc2ludGVyb3AgY2xhc3NlcyB0bwogICAgICAvLyBlbmZvcmNlIHRoZSBpbnZhcmlhbnQgdGhhdCBbb25WYXJpYWJsZV0gaXMgY2FsbGVkIGZvciBlYWNoIHR5cGUKICAgICAgLy8gdmFyaWFibGUgaW4gdGhlIHR5cGUuCiAgICAgIHJlc3VsdCA9IHZpc2l0TGlzdCh0eXBlLnR5cGVBcmd1bWVudHMsIGVtaXR0ZXIsIGhlYWQ6IG5hbWUpOwogICAgICBpZiAoX25hdGl2ZURhdGEuaXNKc0ludGVyb3BDbGFzcyh0eXBlLmVsZW1lbnQpKSB7CiAgICAgICAgLy8gUmVwbGFjZSB0eXBlIGFyZ3VtZW50cyBvZiBnZW5lcmljIGpzaW50ZXJvcCBjbGFzc2VzIHdpdGggJ2FueScgdHlwZS4KICAgICAgICByZXN1bHQgPQogICAgICAgICAgICBnZXRKc0ludGVyb3BUeXBlQXJndW1lbnRzKHR5cGUudHlwZUFyZ3VtZW50cy5sZW5ndGgsIG5hbWU6IG5hbWUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAganNBc3QuRXhwcmVzc2lvbiB2aXNpdExpc3QoTGlzdDxEYXJ0VHlwZT4gdHlwZXMsIEVtaXR0ZXIgZW1pdHRlciwKICAgICAge2pzQXN0LkV4cHJlc3Npb24gaGVhZH0pIHsKICAgIExpc3Q8anNBc3QuRXhwcmVzc2lvbj4gZWxlbWVudHMgPSA8anNBc3QuRXhwcmVzc2lvbj5bXTsKICAgIGlmIChoZWFkICE9IG51bGwpIHsKICAgICAgZWxlbWVudHMuYWRkKGhlYWQpOwogICAgfQogICAgZm9yIChEYXJ0VHlwZSB0eXBlIGluIHR5cGVzKSB7CiAgICAgIGpzQXN0LkV4cHJlc3Npb24gZWxlbWVudCA9IHZpc2l0KHR5cGUsIGVtaXR0ZXIpOwogICAgICBpZiAoZWxlbWVudCBpcyBqc0FzdC5MaXRlcmFsTnVsbCkgewogICAgICAgIGVsZW1lbnRzLmFkZChuZXcganNBc3QuQXJyYXlIb2xlKCkpOwogICAgICB9IGVsc2UgewogICAgICAgIGVsZW1lbnRzLmFkZChlbGVtZW50KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBqc0FzdC5BcnJheUluaXRpYWxpemVyKGVsZW1lbnRzKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBKYXZhU2NyaXB0IHRlbXBsYXRlIHRvIGRldGVybWluZSBhdCBydW50aW1lIGlmIGEgdHlwZSBvYmplY3QKICAvLy8gaXMgYSBmdW5jdGlvbiB0eXBlLgogIGpzQXN0LlRlbXBsYXRlIGdldCB0ZW1wbGF0ZUZvcklzRnVuY3Rpb25UeXBlIHsKICAgIHJldHVybiBqc0FzdC5qcy5leHByZXNzaW9uVGVtcGxhdGVGb3IoIicke25hbWVyLmZ1bmN0aW9uVHlwZVRhZ30nIGluICMiKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBKYXZhU2NyaXB0IHRlbXBsYXRlIHRvIGRldGVybWluZSBhdCBydW50aW1lIGlmIGEgdHlwZSBvYmplY3QKICAvLy8gaXMgYSBGdXR1cmVPciB0eXBlLgogIGpzQXN0LlRlbXBsYXRlIGdldCB0ZW1wbGF0ZUZvcklzRnV0dXJlT3JUeXBlIHsKICAgIHJldHVybiBqc0FzdC5qcy5leHByZXNzaW9uVGVtcGxhdGVGb3IoIicke25hbWVyLmZ1dHVyZU9yVGFnfScgaW4gIyIpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIEphdmFTY3JpcHQgdGVtcGxhdGUgdG8gZGV0ZXJtaW5lIGF0IHJ1bnRpbWUgaWYgYSB0eXBlIG9iamVjdAogIC8vLyBpcyB0aGUgdm9pZCB0eXBlLgogIGpzQXN0LlRlbXBsYXRlIGdldCB0ZW1wbGF0ZUZvcklzVm9pZFR5cGUgewogICAgcmV0dXJuIGpzQXN0LmpzLmV4cHJlc3Npb25UZW1wbGF0ZUZvcigiIyA9PT0gLTEiKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBKYXZhU2NyaXB0IHRlbXBsYXRlIHRvIGRldGVybWluZSBhdCBydW50aW1lIGlmIGEgdHlwZSBvYmplY3QKICAvLy8gaXMgdGhlIGR5bmFtaWMgdHlwZS4KICBqc0FzdC5UZW1wbGF0ZSBnZXQgdGVtcGxhdGVGb3JJc0R5bmFtaWNUeXBlIHsKICAgIHJldHVybiBqc0FzdC5qcy5leHByZXNzaW9uVGVtcGxhdGVGb3IoIiMgPT0gbnVsbCIpOwogIH0KCiAganNBc3QuVGVtcGxhdGUgZ2V0IHRlbXBsYXRlRm9ySXNKc0ludGVyb3BUeXBlQXJndW1lbnQgewogICAgcmV0dXJuIGpzQXN0LmpzLmV4cHJlc3Npb25UZW1wbGF0ZUZvcigiIyA9PT0gLTIiKTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gdmlzaXRGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIHR5cGUsIEVtaXR0ZXIgZW1pdHRlcikgewogICAgTGlzdDxqc0FzdC5Qcm9wZXJ0eT4gcHJvcGVydGllcyA9IDxqc0FzdC5Qcm9wZXJ0eT5bXTsKCiAgICB2b2lkIGFkZFByb3BlcnR5KFN0cmluZyBuYW1lLCBqc0FzdC5FeHByZXNzaW9uIHZhbHVlKSB7CiAgICAgIHByb3BlcnRpZXMuYWRkKG5ldyBqc0FzdC5Qcm9wZXJ0eShqcy5zdHJpbmcobmFtZSksIHZhbHVlKSk7CiAgICB9CgogICAgLy8gVHlwZSByZXByZXNlbnRhdGlvbnMgZm9yIGZ1bmN0aW9ucyBoYXZlIGEgcHJvcGVydHkgd2hpY2ggaXMgYSB0YWcgbWFya2luZwogICAgLy8gdGhlbSBhcyBmdW5jdGlvbiB0eXBlcy4gVGhlIHZhbHVlIGlzIG5vdCB1c2VkLCBzbyAnMScgaXMganVzdCBhIGR1bW15LgogICAgYWRkUHJvcGVydHkobmFtZXIuZnVuY3Rpb25UeXBlVGFnLCBqcy5udW1iZXIoMSkpOwoKICAgIGlmICh0eXBlLnR5cGVWYXJpYWJsZXMuaXNOb3RFbXB0eSkgewogICAgICAvLyBHZW5lcmljIGZ1bmN0aW9uIHR5cGVzIGhhdmUgdHlwZSBwYXJhbWV0ZXJzIHdoaWNoIGFyZSByZWR1Y2VkIHRvIGRlCiAgICAgIC8vIEJydWlqbiBpbmRleGVzLgogICAgICBmb3IgKEZ1bmN0aW9uVHlwZVZhcmlhYmxlIHZhcmlhYmxlIGluIHR5cGUudHlwZVZhcmlhYmxlcy5yZXZlcnNlZCkgewogICAgICAgIGZ1bmN0aW9uVHlwZVZhcmlhYmxlcy5hZGQodmFyaWFibGUpOwogICAgICB9CiAgICAgIC8vIFRPRE8oc3JhKTogVGhpcyBlbWl0cyBgUC5PYmplY3RgIGZvciB0aGUgY29tbW9uIHVuYm91bmRlZCBjYXNlLiBXZQogICAgICAvLyBjb3VsZCByZXBsYWNlIHRoZSBPYmplY3QgYm91bmRzIHdpdGggYW4gYXJyYXkgaG9sZSBmb3IgYSBjb21wYWN0IGBbLCxdYAogICAgICAvLyByZXByZXNlbnRhdGlvbi4KICAgICAgYWRkUHJvcGVydHkobmFtZXIuZnVuY3Rpb25UeXBlR2VuZXJpY0JvdW5kc1RhZywKICAgICAgICAgIHZpc2l0TGlzdCh0eXBlLnR5cGVWYXJpYWJsZXMubWFwKCh2KSA9PiB2LmJvdW5kKS50b0xpc3QoKSwgZW1pdHRlcikpOwogICAgfQoKICAgIGlmICghdHlwZS5yZXR1cm5UeXBlLnRyZWF0QXNEeW5hbWljKSB7CiAgICAgIGFkZFByb3BlcnR5KAogICAgICAgICAgbmFtZXIuZnVuY3Rpb25UeXBlUmV0dXJuVHlwZVRhZywgdmlzaXQodHlwZS5yZXR1cm5UeXBlLCBlbWl0dGVyKSk7CiAgICB9CiAgICBpZiAoIXR5cGUucGFyYW1ldGVyVHlwZXMuaXNFbXB0eSkgewogICAgICBhZGRQcm9wZXJ0eShuYW1lci5mdW5jdGlvblR5cGVSZXF1aXJlZFBhcmFtZXRlcnNUYWcsCiAgICAgICAgICB2aXNpdExpc3QodHlwZS5wYXJhbWV0ZXJUeXBlcywgZW1pdHRlcikpOwogICAgfQogICAgaWYgKCF0eXBlLm9wdGlvbmFsUGFyYW1ldGVyVHlwZXMuaXNFbXB0eSkgewogICAgICBhZGRQcm9wZXJ0eShuYW1lci5mdW5jdGlvblR5cGVPcHRpb25hbFBhcmFtZXRlcnNUYWcsCiAgICAgICAgICB2aXNpdExpc3QodHlwZS5vcHRpb25hbFBhcmFtZXRlclR5cGVzLCBlbWl0dGVyKSk7CiAgICB9CiAgICBpZiAoIXR5cGUubmFtZWRQYXJhbWV0ZXJUeXBlcy5pc0VtcHR5KSB7CiAgICAgIExpc3Q8anNBc3QuUHJvcGVydHk+IG5hbWVkQXJndW1lbnRzID0gPGpzQXN0LlByb3BlcnR5PltdOwogICAgICBMaXN0PFN0cmluZz4gbmFtZXMgPSB0eXBlLm5hbWVkUGFyYW1ldGVyczsKICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZXMgPSB0eXBlLm5hbWVkUGFyYW1ldGVyVHlwZXM7CiAgICAgIGFzc2VydCh0eXBlcy5sZW5ndGggPT0gbmFtZXMubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHR5cGVzLmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgIGpzQXN0LkV4cHJlc3Npb24gbmFtZSA9IGpzLnN0cmluZyhuYW1lc1tpbmRleF0pOwogICAgICAgIG5hbWVkQXJndW1lbnRzCiAgICAgICAgICAgIC5hZGQobmV3IGpzQXN0LlByb3BlcnR5KG5hbWUsIHZpc2l0KHR5cGVzW2luZGV4XSwgZW1pdHRlcikpKTsKICAgICAgfQogICAgICBhZGRQcm9wZXJ0eShuYW1lci5mdW5jdGlvblR5cGVOYW1lZFBhcmFtZXRlcnNUYWcsCiAgICAgICAgICBuZXcganNBc3QuT2JqZWN0SW5pdGlhbGl6ZXIobmFtZWRBcmd1bWVudHMpKTsKICAgIH0KCiAgICAvLyBFeGl0IGdlbmVyaWMgZnVuY3Rpb24gc2NvcGUuCiAgICBpZiAodHlwZS50eXBlVmFyaWFibGVzLmlzTm90RW1wdHkpIHsKICAgICAgZnVuY3Rpb25UeXBlVmFyaWFibGVzLmxlbmd0aCAtPSB0eXBlLnR5cGVWYXJpYWJsZXMubGVuZ3RoOwogICAgfQoKICAgIHJldHVybiBuZXcganNBc3QuT2JqZWN0SW5pdGlhbGl6ZXIocHJvcGVydGllcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5FeHByZXNzaW9uIHZpc2l0Vm9pZFR5cGUoVm9pZFR5cGUgdHlwZSwgRW1pdHRlciBlbWl0dGVyKSB7CiAgICByZXR1cm4gZ2V0Vm9pZFZhbHVlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5FeHByZXNzaW9uIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgdHlwZSwgRW1pdHRlciBlbWl0dGVyKSB7CiAgICBib29sIHNob3VsZEVuY29kZSA9IHNob3VsZEVuY29kZVR5cGVkZWYodHlwZSk7CiAgICBEYXJ0VHlwZSB1bmFsaWFzZWRUeXBlID0gdHlwZS51bmFsaWFzZWQ7CgogICAgdmFyIG9sZEJpbmRpbmdzID0gdHlwZWRlZkJpbmRpbmdzOwogICAgaWYgKHR5cGVkZWZCaW5kaW5ncyA9PSBudWxsKSB7CiAgICAgIC8vIEZpcnN0IGxldmVsIHR5cGVkZWYgLSBjYXB0dXJlIGFyZ3VtZW50cyBmb3IgcmUtdXNlIHdpdGhpbiB0eXBlZGVmIGJvZHkuCiAgICAgIC8vCiAgICAgIC8vIFRoZSB0eXBlIGBNYXA8VCwgRm9vPFNldDxUPj4+YCBjb250YWlucyBvbmUgdHlwZSB2YXJpYWJsZSByZWZlcmVuY2VkCiAgICAgIC8vIHR3aWNlLCBzbyB0aGVyZSBhcmUgdHdvIGlucHV0cyBpbnRvIHRoZSBIVHlwZUluZm9FeHByZXNzaW9uCiAgICAgIC8vIGluc3RydWN0aW9uLgogICAgICAvLwogICAgICAvLyBJZiBGb28gaXMgYSB0eXBlZGVmLCBUIGNhbiBiZSByZXVzZWQsIGUuZy4KICAgICAgLy8KICAgICAgLy8gICAgIHR5cGVkZWYgRSBGb288RT4oRSBhLCBFIGIpOwogICAgICAvLwogICAgICAvLyBBcyB0aGUgdHlwZWRlZiBpcyBleHBhbmRlZCAodG8gKFNldDxUPiwgU2V0PFQ+KSA9PiBTZXQ8VD4pIGl0IHNob3VsZAogICAgICAvLyBub3QgY29uc3VtZSBhZGRpdGlvbmFsIHR5cGVzIGZyb20gdGhlIHRvLWxldmVsIGlucHV0LiAgV2UgcHJldmVudCB0aGlzCiAgICAgIC8vIGJ5IGNhcHR1cmluZyB0aGUgdHlwZXMgYW5kIHVzaW5nIHRoZSBjYXB0dXJlZCB0eXBlIGV4cHJlc3Npb25zIGluc2lkZQogICAgICAvLyB0aGUgdHlwZWRlZiBleHBhbnNpb24uCiAgICAgIC8vCiAgICAgIC8vIFRPRE8oc3JhKTogV2Ugc2hvdWxkIG1ha2UgdGhlIHR5cGUgc3ViZXhwcmVzc2lvbiBGb288Li4uPiBiZSBhIHNlY29uZAogICAgICAvLyBIVHlwZUluZm9FeHByZXNzaW9uLCB3aXRoIFNldDxUPiBhcyBpdHMgaW5wdXQgKGEgdGhpcmQKICAgICAgLy8gSFR5cGVJbmZvRXhwcmVzc2lvbikuIFRoaXMgd291bGQgc2hhcmUgYWxsIHRoZSBTZXQ8VD4gc3ViZXhwcmVzc2lvbnMKICAgICAgLy8gaW5zdGVhZCBvZiBkdXBsaWNhdGluZyB0aGVtLiBUaGlzIHdvdWxkIHJlcXVpcmUgSFR5cGVJbmZvRXhwcmVzc2lvbgogICAgICAvLyBpbnB1dHMgdG8gY29ycmVzcG9uZCB0byB0eXBlIHZhcmlhYmxlcyBBTkQgdHlwZWRlZnMuCiAgICAgIHR5cGVkZWZCaW5kaW5ncyA9IDxUeXBlVmFyaWFibGVUeXBlLCBqc0FzdC5FeHByZXNzaW9uPnt9OwogICAgICB0eXBlLmZvckVhY2hUeXBlVmFyaWFibGUoKFR5cGVWYXJpYWJsZVR5cGUgdmFyaWFibGUpIHsKICAgICAgICB0eXBlZGVmQmluZGluZ3NbdmFyaWFibGVdID0gb25WYXJpYWJsZSh2YXJpYWJsZSk7CiAgICAgIH0pOwogICAgfQoKICAgIGpzQXN0LkV4cHJlc3Npb24gZmluaXNoKGpzQXN0LkV4cHJlc3Npb24gcmVzdWx0KSB7CiAgICAgIHR5cGVkZWZCaW5kaW5ncyA9IG9sZEJpbmRpbmdzOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIGlmIChzaG91bGRFbmNvZGUpIHsKICAgICAganNBc3QuT2JqZWN0SW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSB2aXNpdCh1bmFsaWFzZWRUeXBlLCBlbWl0dGVyKTsKICAgICAgLy8gV2UgaGF2ZSB0byBlbmNvZGUgdGhlIGFsaWFzZWQgdHlwZS4KICAgICAganNBc3QuRXhwcmVzc2lvbiBuYW1lID0gZ2V0SmF2YVNjcmlwdENsYXNzTmFtZSh0eXBlLmVsZW1lbnQsIGVtaXR0ZXIpOwogICAgICBqc0FzdC5FeHByZXNzaW9uIGVuY29kZWRUeXBlZGVmID0gdHlwZS50cmVhdEFzUmF3CiAgICAgICAgICA/IG5hbWUKICAgICAgICAgIDogdmlzaXRMaXN0KHR5cGUudHlwZUFyZ3VtZW50cywgZW1pdHRlciwgaGVhZDogbmFtZSk7CgogICAgICAvLyBBZGQgaXQgdG8gdGhlIGZ1bmN0aW9uLXR5cGUgb2JqZWN0LgogICAgICBqc0FzdC5MaXRlcmFsU3RyaW5nIHRhZyA9IGpzLnN0cmluZyhuYW1lci50eXBlZGVmVGFnKTsKICAgICAgaW5pdGlhbGl6ZXIucHJvcGVydGllcy5hZGQobmV3IGpzQXN0LlByb3BlcnR5KHRhZywgZW5jb2RlZFR5cGVkZWYpKTsKICAgICAgcmV0dXJuIGZpbmlzaChpbml0aWFsaXplcik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmluaXNoKHZpc2l0KHVuYWxpYXNlZFR5cGUsIGVtaXR0ZXIpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gdmlzaXRGdXR1cmVPclR5cGUoRnV0dXJlT3JUeXBlIHR5cGUsIEVtaXR0ZXIgZW1pdHRlcikgewogICAgTGlzdDxqc0FzdC5Qcm9wZXJ0eT4gcHJvcGVydGllcyA9IDxqc0FzdC5Qcm9wZXJ0eT5bXTsKCiAgICB2b2lkIGFkZFByb3BlcnR5KFN0cmluZyBuYW1lLCBqc0FzdC5FeHByZXNzaW9uIHZhbHVlKSB7CiAgICAgIHByb3BlcnRpZXMuYWRkKG5ldyBqc0FzdC5Qcm9wZXJ0eShqcy5zdHJpbmcobmFtZSksIHZhbHVlKSk7CiAgICB9CgogICAgLy8gVHlwZSByZXByZXNlbnRhdGlvbnMgZm9yIEZ1dHVyZU9yIGhhdmUgYSBwcm9wZXJ0eSB3aGljaCBpcyBhIHRhZyBtYXJraW5nCiAgICAvLyB0aGVtIGFzIEZ1dHVyZU9yIHR5cGVzLiBUaGUgdmFsdWUgaXMgbm90IHVzZWQsIHNvICcxJyBpcyBqdXN0IGEgZHVtbXkuCiAgICBhZGRQcm9wZXJ0eShuYW1lci5mdXR1cmVPclRhZywganMubnVtYmVyKDEpKTsKICAgIGlmICghdHlwZS50eXBlQXJndW1lbnQudHJlYXRBc0R5bmFtaWMpIHsKICAgICAgYWRkUHJvcGVydHkobmFtZXIuZnV0dXJlT3JUeXBlVGFnLCB2aXNpdCh0eXBlLnR5cGVBcmd1bWVudCwgZW1pdHRlcikpOwogICAgfQoKICAgIHJldHVybiBuZXcganNBc3QuT2JqZWN0SW5pdGlhbGl6ZXIocHJvcGVydGllcyk7CiAgfQp9CgpjbGFzcyBUeXBlQ2hlY2tNYXBwaW5nIGltcGxlbWVudHMgVHlwZUNoZWNrcyB7CiAgZmluYWwgTWFwPENsYXNzRW50aXR5LCBDbGFzc0NoZWNrcz4gbWFwID0gbmV3IE1hcDxDbGFzc0VudGl0eSwgQ2xhc3NDaGVja3M+KCk7CgogIEBvdmVycmlkZQogIENsYXNzQ2hlY2tzIG9wZXJhdG9yIFtdKENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIENsYXNzQ2hlY2tzIHJlc3VsdCA9IG1hcFtlbGVtZW50XTsKICAgIHJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6IGNvbnN0IENsYXNzQ2hlY2tzLmVtcHR5KCk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShDbGFzc0VudGl0eSBlbGVtZW50LCBDbGFzc0NoZWNrcyBjaGVja3MpIHsKICAgIG1hcFtlbGVtZW50XSA9IGNoZWNrczsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBnZXQgY2xhc3NlcyA9PiBtYXAua2V5czsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgZm9yIChDbGFzc0VudGl0eSBob2xkZXIgaW4gY2xhc3NlcykgewogICAgICBmb3IgKFR5cGVDaGVjayBjaGVjayBpbiB0aGlzW2hvbGRlcl0uY2hlY2tzKSB7CiAgICAgICAgc2Iud3JpdGUoJyR7aG9sZGVyLm5hbWV9IDw6ICR7Y2hlY2suY2xzLm5hbWV9LCAnKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuICdbJHNiXSc7CiAgfQp9CgpjbGFzcyBBcmd1bWVudENvbGxlY3RvciBleHRlbmRzIERhcnRUeXBlVmlzaXRvcjxkeW5hbWljLCBib29sPiB7CiAgZmluYWwgU2V0PENsYXNzRW50aXR5PiBjbGFzc2VzID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKCiAgdm9pZCBhZGRDbGFzcyhDbGFzc0VudGl0eSBjbHMpIHsKICAgIGNsYXNzZXMuYWRkKGNscyk7CiAgfQoKICBjb2xsZWN0KERhcnRUeXBlIHR5cGUsIHtib29sIGlzVHlwZUFyZ3VtZW50OiBmYWxzZX0pIHsKICAgIHZpc2l0KHR5cGUsIGlzVHlwZUFyZ3VtZW50KTsKICB9CgogIC8vLyBDb2xsZWN0IGFsbCB0eXBlcyBpbiB0aGUgbGlzdCBhcyBpZiB0aGV5IHdlcmUgYXJndW1lbnRzIG9mIGFuCiAgLy8vIEludGVyZmFjZVR5cGUuCiAgY29sbGVjdEFsbChMaXN0PERhcnRUeXBlPiB0eXBlcywge2Jvb2wgaXNUeXBlQXJndW1lbnQ6IGZhbHNlfSkgewogICAgZm9yIChEYXJ0VHlwZSB0eXBlIGluIHR5cGVzKSB7CiAgICAgIHZpc2l0KHR5cGUsIHRydWUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRUeXBlZGVmVHlwZShUeXBlZGVmVHlwZSB0eXBlLCBib29sIGlzVHlwZUFyZ3VtZW50KSB7CiAgICBjb2xsZWN0KHR5cGUudW5hbGlhc2VkLCBpc1R5cGVBcmd1bWVudDogaXNUeXBlQXJndW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgdHlwZSwgYm9vbCBpc1R5cGVBcmd1bWVudCkgewogICAgaWYgKGlzVHlwZUFyZ3VtZW50KSBhZGRDbGFzcyh0eXBlLmVsZW1lbnQpOwogICAgY29sbGVjdEFsbCh0eXBlLnR5cGVBcmd1bWVudHMsIGlzVHlwZUFyZ3VtZW50OiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSB0eXBlLCBfKSB7CiAgICBjb2xsZWN0KHR5cGUucmV0dXJuVHlwZSwgaXNUeXBlQXJndW1lbnQ6IHRydWUpOwogICAgY29sbGVjdEFsbCh0eXBlLnBhcmFtZXRlclR5cGVzLCBpc1R5cGVBcmd1bWVudDogdHJ1ZSk7CiAgICBjb2xsZWN0QWxsKHR5cGUub3B0aW9uYWxQYXJhbWV0ZXJUeXBlcywgaXNUeXBlQXJndW1lbnQ6IHRydWUpOwogICAgY29sbGVjdEFsbCh0eXBlLm5hbWVkUGFyYW1ldGVyVHlwZXMsIGlzVHlwZUFyZ3VtZW50OiB0cnVlKTsKICB9Cn0KCmNsYXNzIEZ1bmN0aW9uQXJndW1lbnRDb2xsZWN0b3IgZXh0ZW5kcyBEYXJ0VHlwZVZpc2l0b3I8ZHluYW1pYywgYm9vbD4gewogIGZpbmFsIFNldDxDbGFzc0VudGl0eT4gY2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CgogIEZ1bmN0aW9uQXJndW1lbnRDb2xsZWN0b3IoKTsKCiAgY29sbGVjdChEYXJ0VHlwZSB0eXBlLCB7Ym9vbCBpbkZ1bmN0aW9uVHlwZTogZmFsc2V9KSB7CiAgICB2aXNpdCh0eXBlLCBpbkZ1bmN0aW9uVHlwZSk7CiAgfQoKICBjb2xsZWN0QWxsKEl0ZXJhYmxlPERhcnRUeXBlPiB0eXBlcywge2Jvb2wgaW5GdW5jdGlvblR5cGU6IGZhbHNlfSkgewogICAgZm9yIChEYXJ0VHlwZSB0eXBlIGluIHR5cGVzKSB7CiAgICAgIHZpc2l0KHR5cGUsIGluRnVuY3Rpb25UeXBlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgdHlwZSwgYm9vbCBpbkZ1bmN0aW9uVHlwZSkgewogICAgY29sbGVjdCh0eXBlLnVuYWxpYXNlZCwgaW5GdW5jdGlvblR5cGU6IGluRnVuY3Rpb25UeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIHR5cGUsIGJvb2wgaW5GdW5jdGlvblR5cGUpIHsKICAgIGlmIChpbkZ1bmN0aW9uVHlwZSkgewogICAgICBjbGFzc2VzLmFkZCh0eXBlLmVsZW1lbnQpOwogICAgfQogICAgY29sbGVjdEFsbCh0eXBlLnR5cGVBcmd1bWVudHMsIGluRnVuY3Rpb25UeXBlOiBpbkZ1bmN0aW9uVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgdHlwZSwgXykgewogICAgY29sbGVjdCh0eXBlLnJldHVyblR5cGUsIGluRnVuY3Rpb25UeXBlOiB0cnVlKTsKICAgIGNvbGxlY3RBbGwodHlwZS5wYXJhbWV0ZXJUeXBlcywgaW5GdW5jdGlvblR5cGU6IHRydWUpOwogICAgY29sbGVjdEFsbCh0eXBlLm9wdGlvbmFsUGFyYW1ldGVyVHlwZXMsIGluRnVuY3Rpb25UeXBlOiB0cnVlKTsKICAgIGNvbGxlY3RBbGwodHlwZS5uYW1lZFBhcmFtZXRlclR5cGVzLCBpbkZ1bmN0aW9uVHlwZTogdHJ1ZSk7CiAgICBjb2xsZWN0QWxsKHR5cGUudHlwZVZhcmlhYmxlcy5tYXAoKHR5cGUpID0+IHR5cGUuYm91bmQpLAogICAgICAgIGluRnVuY3Rpb25UeXBlOiB0cnVlKTsKICB9Cn0KCi8vLyBSZXByZXNlbnRhdGlvbiBvZiB0aGUgc3Vic3RpdHV0aW9uIG9mIHR5cGUgYXJndW1lbnRzIHdoZW4gZ29pbmcgZnJvbSB0aGUKLy8vIHR5cGUgb2YgYSBjbGFzcyB0byBvbmUgb2YgaXRzIHN1cGVydHlwZXMuCi8vLwovLy8gRm9yIGBjbGFzcyBCPFQ+IGV4dGVuZHMgQTxMaXN0PFQ+LCBpbnQ+YCwgdGhlIHN1YnN0aXR1dGlvbiBpcyB0aGUKLy8vIHJlcHJlc2VudGF0aW9uIG9mIGAoVCkgPT4gWzxMaXN0LCBUPiwgaW50XWAuIEZvciBtb3JlIGRldGFpbHMgb2YgdGhlCi8vLyByZXByZXNlbnRhdGlvbiBjb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIG9mIFtnZXRTdXBlcnR5cGVTdWJzdGl0dXRpb25dLgovL1RPRE8oZmxvaXRzY2gpOiBSZW1vdmUgc3VwcG9ydCBmb3Igbm9uLWZ1bmN0aW9uIHN1YnN0aXR1dGlvbnMuCmNsYXNzIFN1YnN0aXR1dGlvbiB7CiAgZmluYWwgYm9vbCBpc1RyaXZpYWw7CiAgZmluYWwgYm9vbCBpc0Z1bmN0aW9uOwogIGZpbmFsIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50czsKICBmaW5hbCBMaXN0PERhcnRUeXBlPiBwYXJhbWV0ZXJzOwogIGZpbmFsIGludCBsZW5ndGg7CgogIGNvbnN0IFN1YnN0aXR1dGlvbi50cml2aWFsKCkKICAgICAgOiBpc1RyaXZpYWwgPSB0cnVlLAogICAgICAgIGlzRnVuY3Rpb24gPSBmYWxzZSwKICAgICAgICBsZW5ndGggPSBudWxsLAogICAgICAgIGFyZ3VtZW50cyA9IGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgICBwYXJhbWV0ZXJzID0gY29uc3QgPERhcnRUeXBlPltdOwoKICBTdWJzdGl0dXRpb24ubGlzdCh0aGlzLmFyZ3VtZW50cykKICAgICAgOiBpc1RyaXZpYWwgPSBmYWxzZSwKICAgICAgICBpc0Z1bmN0aW9uID0gZmFsc2UsCiAgICAgICAgbGVuZ3RoID0gbnVsbCwKICAgICAgICBwYXJhbWV0ZXJzID0gY29uc3QgPERhcnRUeXBlPltdOwoKICBTdWJzdGl0dXRpb24uZnVuY3Rpb24odGhpcy5hcmd1bWVudHMsIHRoaXMucGFyYW1ldGVycykKICAgICAgOiBpc1RyaXZpYWwgPSBmYWxzZSwKICAgICAgICBpc0Z1bmN0aW9uID0gdHJ1ZSwKICAgICAgICBsZW5ndGggPSBudWxsOwoKICBTdWJzdGl0dXRpb24uanNJbnRlcm9wKHRoaXMubGVuZ3RoKQogICAgICA6IGlzVHJpdmlhbCA9IGZhbHNlLAogICAgICAgIGlzRnVuY3Rpb24gPSBmYWxzZSwKICAgICAgICBhcmd1bWVudHMgPSBjb25zdCA8RGFydFR5cGU+W10sCiAgICAgICAgcGFyYW1ldGVycyA9IGNvbnN0IDxEYXJ0VHlwZT5bXTsKCiAgYm9vbCBnZXQgaXNKc0ludGVyb3AgPT4gbGVuZ3RoICE9IG51bGw7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdTdWJzdGl0dXRpb24oaXNUcml2aWFsPSRpc1RyaXZpYWwsJwogICAgICAnaXNGdW5jdGlvbj0kaXNGdW5jdGlvbixpc0pzSW50ZXJvcD0kaXNKc0ludGVyb3AsYXJndW1lbnRzPSRhcmd1bWVudHMsJwogICAgICAncGFyYW1ldGVycz0kcGFyYW1ldGVycyxsZW5ndGg9JGxlbmd0aCknOwp9CgovLy8gQSBwYWlyIG9mIGEgY2xhc3MgdGhhdCB3ZSBuZWVkIGEgY2hlY2sgYWdhaW5zdCBhbmQgdGhlIHR5cGUgYXJndW1lbnQKLy8vIHN1YnN0aXR1dGlvbiBmb3IgdGhpcyBjaGVjay4KY2xhc3MgVHlwZUNoZWNrIHsKICBmaW5hbCBDbGFzc0VudGl0eSBjbHM7CiAgZmluYWwgYm9vbCBuZWVkc0lzOwogIGZpbmFsIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb247CiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IGhhc2hDb2RlID0gX25leHRIYXNoID0gKF9uZXh0SGFzaCArIDEwMDAwMykudG9VbnNpZ25lZCgzMCk7CiAgc3RhdGljIGludCBfbmV4dEhhc2ggPSAwOwoKICBUeXBlQ2hlY2sodGhpcy5jbHMsIHRoaXMuc3Vic3RpdHV0aW9uLCB7dGhpcy5uZWVkc0lzOiB0cnVlfSk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+CiAgICAgICdUeXBlQ2hlY2soY2xzPSRjbHMsbmVlZHNJcz0kbmVlZHNJcyxzdWJzdGl0dXRpb249JHN1YnN0aXR1dGlvbiknOwp9CgplbnVtIFR5cGVWaXNpdG9yU3RhdGUgewogIGRpcmVjdCwKICBjb3ZhcmlhbnRUeXBlQXJndW1lbnQsCiAgY29udHJhdmFyaWFudFR5cGVBcmd1bWVudCwKICB0eXBlTGl0ZXJhbCwKfQoKY2xhc3MgVHlwZVZpc2l0b3IgZXh0ZW5kcyBEYXJ0VHlwZVZpc2l0b3I8dm9pZCwgVHlwZVZpc2l0b3JTdGF0ZT4gewogIFNldDxGdW5jdGlvblR5cGVWYXJpYWJsZT4gX3Zpc2l0ZWRGdW5jdGlvblR5cGVWYXJpYWJsZXMgPQogICAgICBuZXcgU2V0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPigpOwoKICBmaW5hbCB2b2lkIEZ1bmN0aW9uKENsYXNzRW50aXR5IGVudGl0eSwge1R5cGVWaXNpdG9yU3RhdGUgc3RhdGV9KSBvbkNsYXNzOwogIGZpbmFsIHZvaWQgRnVuY3Rpb24oVHlwZVZhcmlhYmxlRW50aXR5IGVudGl0eSwge1R5cGVWaXNpdG9yU3RhdGUgc3RhdGV9KQogICAgICBvblR5cGVWYXJpYWJsZTsKICBmaW5hbCB2b2lkIEZ1bmN0aW9uKEZ1bmN0aW9uVHlwZSB0eXBlLCB7VHlwZVZpc2l0b3JTdGF0ZSBzdGF0ZX0pCiAgICAgIG9uRnVuY3Rpb25UeXBlOwoKICBUeXBlVmlzaXRvcih7dGhpcy5vbkNsYXNzLCB0aGlzLm9uVHlwZVZhcmlhYmxlLCB0aGlzLm9uRnVuY3Rpb25UeXBlfSk7CgogIHZpc2l0VHlwZShEYXJ0VHlwZSB0eXBlLCBUeXBlVmlzaXRvclN0YXRlIHN0YXRlKSA9PiB0eXBlLmFjY2VwdCh0aGlzLCBzdGF0ZSk7CgogIFR5cGVWaXNpdG9yU3RhdGUgY292YXJpYW50QXJndW1lbnQoVHlwZVZpc2l0b3JTdGF0ZSBzdGF0ZSkgewogICAgc3dpdGNoIChzdGF0ZSkgewogICAgICBjYXNlIFR5cGVWaXNpdG9yU3RhdGUuZGlyZWN0OgogICAgICAgIHJldHVybiBUeXBlVmlzaXRvclN0YXRlLmNvdmFyaWFudFR5cGVBcmd1bWVudDsKICAgICAgY2FzZSBUeXBlVmlzaXRvclN0YXRlLmNvdmFyaWFudFR5cGVBcmd1bWVudDoKICAgICAgICByZXR1cm4gVHlwZVZpc2l0b3JTdGF0ZS5jb3ZhcmlhbnRUeXBlQXJndW1lbnQ7CiAgICAgIGNhc2UgVHlwZVZpc2l0b3JTdGF0ZS5jb250cmF2YXJpYW50VHlwZUFyZ3VtZW50OgogICAgICAgIHJldHVybiBUeXBlVmlzaXRvclN0YXRlLmNvbnRyYXZhcmlhbnRUeXBlQXJndW1lbnQ7CiAgICAgIGNhc2UgVHlwZVZpc2l0b3JTdGF0ZS50eXBlTGl0ZXJhbDoKICAgICAgICByZXR1cm4gVHlwZVZpc2l0b3JTdGF0ZS50eXBlTGl0ZXJhbDsKICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmV4cGVjdGVkIFR5cGVWaXNpdG9yU3RhdGUgJHN0YXRlIik7CiAgfQoKICBUeXBlVmlzaXRvclN0YXRlIGNvbnRyYXZhcmlhbnRBcmd1bWVudChUeXBlVmlzaXRvclN0YXRlIHN0YXRlKSB7CiAgICBzd2l0Y2ggKHN0YXRlKSB7CiAgICAgIGNhc2UgVHlwZVZpc2l0b3JTdGF0ZS5kaXJlY3Q6CiAgICAgICAgcmV0dXJuIFR5cGVWaXNpdG9yU3RhdGUuY29udHJhdmFyaWFudFR5cGVBcmd1bWVudDsKICAgICAgY2FzZSBUeXBlVmlzaXRvclN0YXRlLmNvdmFyaWFudFR5cGVBcmd1bWVudDoKICAgICAgICByZXR1cm4gVHlwZVZpc2l0b3JTdGF0ZS5jb250cmF2YXJpYW50VHlwZUFyZ3VtZW50OwogICAgICBjYXNlIFR5cGVWaXNpdG9yU3RhdGUuY29udHJhdmFyaWFudFR5cGVBcmd1bWVudDoKICAgICAgICByZXR1cm4gVHlwZVZpc2l0b3JTdGF0ZS5jb3ZhcmlhbnRUeXBlQXJndW1lbnQ7CiAgICAgIGNhc2UgVHlwZVZpc2l0b3JTdGF0ZS50eXBlTGl0ZXJhbDoKICAgICAgICByZXR1cm4gVHlwZVZpc2l0b3JTdGF0ZS50eXBlTGl0ZXJhbDsKICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmV4cGVjdGVkIFR5cGVWaXNpdG9yU3RhdGUgJHN0YXRlIik7CiAgfQoKICB2aXNpdFR5cGVzKExpc3Q8RGFydFR5cGU+IHR5cGVzLCBUeXBlVmlzaXRvclN0YXRlIHN0YXRlKSB7CiAgICBmb3IgKERhcnRUeXBlIHR5cGUgaW4gdHlwZXMpIHsKICAgICAgdmlzaXRUeXBlKHR5cGUsIHN0YXRlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlVmFyaWFibGVUeXBlKFR5cGVWYXJpYWJsZVR5cGUgdHlwZSwgVHlwZVZpc2l0b3JTdGF0ZSBzdGF0ZSkgewogICAgaWYgKG9uVHlwZVZhcmlhYmxlICE9IG51bGwpIHsKICAgICAgb25UeXBlVmFyaWFibGUodHlwZS5lbGVtZW50LCBzdGF0ZTogc3RhdGUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgdHlwZSwgVHlwZVZpc2l0b3JTdGF0ZSBzdGF0ZSkgewogICAgaWYgKG9uQ2xhc3MgIT0gbnVsbCkgewogICAgICBvbkNsYXNzKHR5cGUuZWxlbWVudCwgc3RhdGU6IHN0YXRlKTsKICAgIH0KICAgIHZpc2l0VHlwZXModHlwZS50eXBlQXJndW1lbnRzLCBjb3ZhcmlhbnRBcmd1bWVudChzdGF0ZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIHR5cGUsIFR5cGVWaXNpdG9yU3RhdGUgc3RhdGUpIHsKICAgIGlmIChvbkZ1bmN0aW9uVHlwZSAhPSBudWxsKSB7CiAgICAgIG9uRnVuY3Rpb25UeXBlKHR5cGUsIHN0YXRlOiBzdGF0ZSk7CiAgICB9CiAgICAvLyBWaXNpdCBhbGwgbmVzdGVkIHR5cGVzIGFzIHR5cGUgYXJndW1lbnRzOyB0aGVzZSB0eXBlcyBhcmUgbm90IHJ1bnRpbWUKICAgIC8vIGluc3RhbmNlcyBidXQgcnVudGltZSB0eXBlIHJlcHJlc2VudGF0aW9ucy4KICAgIHZpc2l0VHlwZSh0eXBlLnJldHVyblR5cGUsIGNvdmFyaWFudEFyZ3VtZW50KHN0YXRlKSk7CiAgICB2aXNpdFR5cGVzKHR5cGUucGFyYW1ldGVyVHlwZXMsIGNvbnRyYXZhcmlhbnRBcmd1bWVudChzdGF0ZSkpOwogICAgdmlzaXRUeXBlcyh0eXBlLm9wdGlvbmFsUGFyYW1ldGVyVHlwZXMsIGNvbnRyYXZhcmlhbnRBcmd1bWVudChzdGF0ZSkpOwogICAgdmlzaXRUeXBlcyh0eXBlLm5hbWVkUGFyYW1ldGVyVHlwZXMsIGNvbnRyYXZhcmlhbnRBcmd1bWVudChzdGF0ZSkpOwogICAgX3Zpc2l0ZWRGdW5jdGlvblR5cGVWYXJpYWJsZXMucmVtb3ZlQWxsKHR5cGUudHlwZVZhcmlhYmxlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIHR5cGUsIFR5cGVWaXNpdG9yU3RhdGUgc3RhdGUpIHsKICAgIHZpc2l0VHlwZSh0eXBlLnVuYWxpYXNlZCwgc3RhdGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGdW5jdGlvblR5cGVWYXJpYWJsZShGdW5jdGlvblR5cGVWYXJpYWJsZSB0eXBlLCBUeXBlVmlzaXRvclN0YXRlIHN0YXRlKSB7CiAgICBpZiAoX3Zpc2l0ZWRGdW5jdGlvblR5cGVWYXJpYWJsZXMuYWRkKHR5cGUpKSB7CiAgICAgIHZpc2l0VHlwZSh0eXBlLmJvdW5kLCBzdGF0ZSk7CiAgICB9CiAgfQp9CgovLy8gW1R5cGVDaGVja11zIG5lZWQgZm9yIGEgc2luZ2xlIGNsYXNzLgpjbGFzcyBDbGFzc0NoZWNrcyB7CiAgZmluYWwgTWFwPENsYXNzRW50aXR5LCBUeXBlQ2hlY2s+IF9tYXA7CgogIGZpbmFsIENsYXNzRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZTsKCiAgQ2xhc3NDaGVja3ModGhpcy5mdW5jdGlvblR5cGUpIDogX21hcCA9IDxDbGFzc0VudGl0eSwgVHlwZUNoZWNrPnt9OwoKICBjb25zdCBDbGFzc0NoZWNrcy5lbXB0eSgpCiAgICAgIDogX21hcCA9IGNvbnN0IDxDbGFzc0VudGl0eSwgVHlwZUNoZWNrPnt9LAogICAgICAgIGZ1bmN0aW9uVHlwZSA9IG51bGw7CgogIHZvaWQgYWRkKFR5cGVDaGVjayBjaGVjaykgewogICAgX21hcFtjaGVjay5jbHNdID0gY2hlY2s7CiAgfQoKICBUeXBlQ2hlY2sgb3BlcmF0b3IgW10oQ2xhc3NFbnRpdHkgY2xzKSA9PiBfbWFwW2Nsc107CgogIEl0ZXJhYmxlPFR5cGVDaGVjaz4gZ2V0IGNoZWNrcyA9PiBfbWFwLnZhbHVlczsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICdDbGFzc0NoZWNrcygkY2hlY2tzKSc7CiAgfQp9CgovLy8gRGF0YSBuZWVkZWQgZm9yIGdlbmVyYXRpbmcgYSBzaWduYXR1cmUgZnVuY3Rpb24gZm9yIHRoZSBmdW5jdGlvbiB0eXBlIG9mCi8vLyBhIGNsYXNzLgpjbGFzcyBDbGFzc0Z1bmN0aW9uVHlwZSB7CiAgLy8vIFRoZSBgY2FsbGAgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIHRoZSBmdW5jdGlvbiB0eXBlLgogIGZpbmFsIEZ1bmN0aW9uRW50aXR5IGNhbGxGdW5jdGlvbjsKCiAgLy8vIFRoZSB0eXBlIG9mIHRoZSBgY2FsbGAgZnVuY3Rpb24uCiAgZmluYWwgRnVuY3Rpb25UeXBlIGNhbGxUeXBlOwoKICAvLy8gVGhlIHNpZ25hdHVyZSBmdW5jdGlvbiBmb3IgdGhlIGZ1bmN0aW9uIHR5cGUuCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCBmb3IgRGFydCAyLgogIGZpbmFsIEZ1bmN0aW9uRW50aXR5IHNpZ25hdHVyZUZ1bmN0aW9uOwoKICBDbGFzc0Z1bmN0aW9uVHlwZSh0aGlzLmNhbGxGdW5jdGlvbiwgdGhpcy5jYWxsVHlwZSwgdGhpcy5zaWduYXR1cmVGdW5jdGlvbik7Cn0KCi8vLyBSdW50aW1lIHR5cGUgdXNhZ2UgZm9yIGEgY2xhc3MuCmNsYXNzIENsYXNzVXNlIHsKICAvLy8gV2hldGhlciB0aGUgY2xhc3MgaXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbnN0YW50aWF0ZWQuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZSBgQWAgYW5kIGBCYCBpbjoKICAvLy8KICAvLy8gICAgIGNsYXNzIEEge30KICAvLy8gICAgIGNsYXNzIEIgZXh0ZW5kcyBBIHt9CiAgLy8vICAgICBtYWluKCkgPT4gbmV3IEIoKTsKICAvLy8KICBib29sIGluc3RhbmNlID0gZmFsc2U7CgogIC8vLyBXaGV0aGVyIHRoZSBjbGFzcyBpcyBkaXJlY3RseSBpbnN0YW50aWF0ZWQuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZSBgQmAgaW46CiAgLy8vCiAgLy8vICAgICBjbGFzcyBBIHt9CiAgLy8vICAgICBjbGFzcyBCIGV4dGVuZHMgQSB7fQogIC8vLyAgICAgbWFpbigpID0+IG5ldyBCKCk7CiAgLy8vCiAgYm9vbCBkaXJlY3RJbnN0YW5jZSA9IGZhbHNlOwoKICAvLy8gV2hldGhlciBvYmplY3RzIGFyZSBjaGVja2VkIHRvIGJlIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZSBgQWAgaW46CiAgLy8vCiAgLy8vICAgICBjbGFzcyBBIHt9CiAgLy8vICAgICBtYWluKCkgPT4gbnVsbCBpcyBBOwogIC8vLwogIGJvb2wgY2hlY2tlZEluc3RhbmNlID0gZmFsc2U7CgogIC8vLyBXaGV0aGVyIHRoZSBjbGFzcyBpcyBwYXNzZWQgYXMgYSB0eXBlIGFyZ3VtZW50IGF0IHJ1bnRpbWUuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZSBgQWAgaW46CiAgLy8vCiAgLy8vICAgICBjbGFzcyBBIHt9CiAgLy8vICAgICBtYWluKCkgPT4gbmV3IExpc3Q8QT4oKSBpcyBMaXN0PFN0cmluZz47CiAgLy8vCiAgYm9vbCB0eXBlQXJndW1lbnQgPSBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgdGhlIGNsYXNzIGlzIGNoZWNrZWQgYXMgYSB0eXBlIGFyZ3VtZW50IGF0IHJ1bnRpbWUuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZSBgQWAgaW46CiAgLy8vCiAgLy8vICAgICBjbGFzcyBBIHt9CiAgLy8vICAgICBtYWluKCkgPT4gbmV3IExpc3Q8U3RyaW5nPigpIGlzIExpc3Q8QT47CiAgLy8vCiAgYm9vbCBjaGVja2VkVHlwZUFyZ3VtZW50ID0gZmFsc2U7CgogIC8vLyBXaGV0aGVyIHRoZSBjbGFzcyBpcyB1c2VkIGluIGEgY29uc3RhbnQgdHlwZSBsaXRlcmFsLgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2UgYEFgOgogIC8vLwogIC8vLyAgICAgY2xhc3MgQSB7fQogIC8vLyAgICAgbWFpbigpID0+IEE7CiAgLy8vCiAgYm9vbCB0eXBlTGl0ZXJhbCA9IGZhbHNlOwoKICAvLy8gVGhlIGZ1bmN0aW9uIHR5cGUgb2YgdGhlIGNsYXNzLCBpZiBhbnkuCiAgLy8vCiAgLy8vIFRoaXMgaXMgb25seSBzZXQgaWYgdGhlIGZ1bmN0aW9uIHR5cGUgaXMgbmVlZGVkIGF0IHJ1bnRpbWUuIEZvciBpbnN0YW5jZSwKICAvLy8gaWYgbm8gZnVuY3Rpb24gdHlwZXMgYXJlIGNoZWNrZWQgYXQgcnVudGltZSB0aGVuIHRoZSBmdW5jdGlvbiB0eXBlIGlzbid0CiAgLy8vIG5lZWRlZC4KICAvLy8KICAvLy8gRnVydGhlcm1vcmUgb3B0aW1pemF0aW9uIG1pZ2h0IGFsc28gb21pdCBmdW5jdGlvbiB0eXBlIHRoYXQgYXJlIGtub3duIG5vdAogIC8vLyB0byBiZSB2YWxpZCBpbiBhbnkgc3VidHlwZSB0ZXN0LgogIENsYXNzRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZTsKCiAgLy8vIGB0cnVlYCBpZiB0aGUgY2xhc3MgaXMgJ2xpdmUnIGVpdGhlciB0aHJvdWdoIGluc3RhbnRpYXRpb24gb3IgdXNlIGluCiAgLy8vIHR5cGUgYXJndW1lbnRzLgogIGJvb2wgZ2V0IGlzTGl2ZSA9PiBkaXJlY3RJbnN0YW5jZSB8fCB0eXBlQXJndW1lbnQ7CgogIEBvdmVycmlkZQogIFN0cmlu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UTMkBgQCASoUKgEoAUYBHDEdAR4dBAE3ATEBDBYjBAIBTQ0aOiUBJx8BNAYfKgFPAgEkEUAGIwYVHx0GGQEyBhsGFR8dBh8BQAYbBhUfBiABQQYbBhUzBh0BQgYbBhUzBiQBPAYYBhUXBhwBLgZQTw4GUCciAUsWNQEMFioUIgYaKAYbKQYYJgYfLQYXIgYgJgYwBAIBMnBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvcnVudGltZV90eXBlcy5kYXJ0MXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL25hdGl2ZS9lbnF1ZXVlLmRhcnSsji8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JyBzaG93IENvbW1vbkVsZW1lbnRzLCBFbGVtZW50RW52aXJvbm1lbnQ7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9uYXRpdmVfZGF0YS5kYXJ0JyBzaG93IE5hdGl2ZURhdGE7CmltcG9ydCAnLi4vanNfZW1pdHRlci9qc19lbWl0dGVyLmRhcnQnIHNob3cgQ29kZUVtaXR0ZXJUYXNrLCBOYXRpdmVFbWl0dGVyOwppbXBvcnQgJy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvdXNlLmRhcnQnIHNob3cgVHlwZVVzZTsKaW1wb3J0ICcuLi91bml2ZXJzZS93b3JsZF9pbXBhY3QuZGFydCcKICAgIHNob3cgV29ybGRJbXBhY3QsIFdvcmxkSW1wYWN0QnVpbGRlciwgV29ybGRJbXBhY3RCdWlsZGVySW1wbDsKaW1wb3J0ICdiZWhhdmlvci5kYXJ0JzsKaW1wb3J0ICdyZXNvbHZlci5kYXJ0JyBzaG93IE5hdGl2ZUNsYXNzRmluZGVyOwoKLy8vIFRoaXMgY291bGQgYmUgYW4gYWJzdHJhY3QgY2xhc3MgYnV0IHdlIHVzZSBpdCBhcyBhIHN0dWIgZm9yIHRoZQovLy8gZGFydF9iYWNrZW5kLgpjbGFzcyBOYXRpdmVFbnF1ZXVlciB7CiAgLy8vIENhbGxlZCB3aGVuIGEgW3R5cGVdIGhhcyBiZWVuIGluc3RhbnRpYXRlZCBuYXRpdmVseS4KICB2b2lkIG9uSW5zdGFudGlhdGVkVHlwZShJbnRlcmZhY2VUeXBlIHR5cGUpIHt9CgogIC8vLyBJbml0aWFsIGVudHJ5IHBvaW50IHRvIG5hdGl2ZSBlbnF1ZXVlci4KICBXb3JsZEltcGFjdCBwcm9jZXNzTmF0aXZlQ2xhc3NlcyhJdGVyYWJsZTxVcmk+IGxpYnJhcmllcykgPT4KICAgICAgY29uc3QgV29ybGRJbXBhY3QoKTsKCiAgLy8vIFJlZ2lzdGVycyB0aGUgW25hdGl2ZUJlaGF2aW9yXS4gQWRkcyB0aGUgbGl2ZW5lc3Mgb2YgaXRzIGluc3RhbnRpYXRlZAogIC8vLyB0eXBlcyB0byB0aGUgd29ybGQuCiAgdm9pZCByZWdpc3Rlck5hdGl2ZUJlaGF2aW9yKAogICAgICBXb3JsZEltcGFjdEJ1aWxkZXIgaW1wYWN0QnVpbGRlciwgTmF0aXZlQmVoYXZpb3IgbmF0aXZlQmVoYXZpb3IsIGNhdXNlKSB7fQoKICAvLy8gUmV0dXJucyB3aGV0aGVyIG5hdGl2ZSBjbGFzc2VzIGFyZSBiZWluZyB1c2VkLgogIGJvb2wgZ2V0IGhhc0luc3RhbnRpYXRlZE5hdGl2ZUNsYXNzZXMgPT4gZmFsc2U7CgogIC8vLyBFbWl0cyBhIHN1bW1hcnkgaW5mb3JtYXRpb24gdXNpbmcgdGhlIFtsb2ddIGZ1bmN0aW9uLgogIHZvaWQgbG9nU3VtbWFyeSh2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkpIHt9Cn0KCmFic3RyYWN0IGNsYXNzIE5hdGl2ZUVucXVldWVyQmFzZSBpbXBsZW1lbnRzIE5hdGl2ZUVucXVldWVyIHsKICBmaW5hbCBTZXQ8Q2xhc3NFbnRpdHk+IF9yZWdpc3RlcmVkQ2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CiAgZmluYWwgU2V0PENsYXNzRW50aXR5PiBfdW51c2VkQ2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGhhc0luc3RhbnRpYXRlZE5hdGl2ZUNsYXNzZXMgPT4gIV9yZWdpc3RlcmVkQ2xhc3Nlcy5pc0VtcHR5OwoKICAvLy8gTG9nIG1lc3NhZ2UgcmVwb3J0ZWQgaWYgYWxsIG5hdGl2ZSB0eXBlcyBhcmUgdXNlZC4KICBTdHJpbmcgX2FsbFVzZWRNZXNzYWdlOwoKICBmaW5hbCBDb21waWxlck9wdGlvbnMgX29wdGlvbnM7CiAgZmluYWwgRWxlbWVudEVudmlyb25tZW50IF9lbGVtZW50RW52aXJvbm1lbnQ7CiAgZmluYWwgRGFydFR5cGVzIF9kYXJ0VHlwZXM7CiAgZmluYWwgQ29tbW9uRWxlbWVudHMgX2NvbW1vbkVsZW1lbnRzOwoKICAvLy8gU3ViY2xhc3NlcyBvZiBbTmF0aXZlRW5xdWV1ZXJCYXNlXSBhcmUgY29uc3RydWN0ZWQgYnkgdGhlIGJhY2tlbmQuCiAgTmF0aXZlRW5xdWV1ZXJCYXNlKHRoaXMuX29wdGlvbnMsIHRoaXMuX2VsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgdGhpcy5fY29tbW9uRWxlbWVudHMsIHRoaXMuX2RhcnRUeXBlcyk7CgogIGJvb2wgZ2V0IGVuYWJsZUxpdmVUeXBlQW5hbHlzaXMgPT4gX29wdGlvbnMuZW5hYmxlTmF0aXZlTGl2ZVR5cGVBbmFseXNpczsKCiAgQG92ZXJyaWRlCiAgdm9pZCBvbkluc3RhbnRpYXRlZFR5cGUoSW50ZXJmYWNlVHlwZSB0eXBlKSB7CiAgICBpZiAoX3VudXNlZENsYXNzZXMucmVtb3ZlKHR5cGUuZWxlbWVudCkpIHsKICAgICAgX3JlZ2lzdGVyZWRDbGFzc2VzLmFkZCh0eXBlLmVsZW1lbnQpOwogICAgfQogIH0KCiAgLy8vIFJlZ2lzdGVyIFtjbGFzc2VzXSBhcyBuYXRpdmVseSBpbnN0YW50aWF0ZWQgaW4gW2ltcGFjdEJ1aWxkZXJdLgogIHZvaWQgX3JlZ2lzdGVyVHlwZVVzZXMoCiAgICAgIFdvcmxkSW1wYWN0QnVpbGRlciBpbXBhY3RCdWlsZGVyLCBTZXQ8Q2xhc3NFbnRpdHk+IGNsYXNzZXMsIGNhdXNlKSB7CiAgICBmb3IgKENsYXNzRW50aXR5IGNscyBpbiBjbGFzc2VzKSB7CiAgICAgIGlmICghX3VudXNlZENsYXNzZXMuY29udGFpbnMoY2xzKSkgewogICAgICAgIC8vIE5vIG5lZWQgdG8gYWRkIFtjbGFzc0VsZW1lbnRdIHRvIFtpbXBhY3RCdWlsZGVyXTogaXQgaGFzIGFscmVhZHkgYmVlbgogICAgICAgIC8vIGluc3RhbnRpYXRlZCBhbmQgd2UgZG9uJ3QgdHJhY2sgb3JpZ2lucyBvZiBuYXRpdmUgaW5zdGFudGlhdGlvbnMKICAgICAgICAvLyBwcmVjaXNlbHkuCiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclR5cGVVc2UoCiAgICAgICAgICBuZXcgVHlwZVVzZS5uYXRpdmVJbnN0YW50aWF0aW9uKF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0UmF3VHlwZShjbHMpKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyTmF0aXZlQmVoYXZpb3IoCiAgICAgIFdvcmxkSW1wYWN0QnVpbGRlciBpbXBhY3RCdWlsZGVyLCBOYXRpdmVCZWhhdmlvciBuYXRpdmVCZWhhdmlvciwgY2F1c2UpIHsKICAgIF9wcm9jZXNzTmF0aXZlQmVoYXZpb3IoaW1wYWN0QnVpbGRlciwgbmF0aXZlQmVoYXZpb3IsIGNhdXNlKTsKICB9CgogIHZvaWQgX3Byb2Nlc3NOYXRpdmVCZWhhdmlvcigKICAgICAgV29ybGRJbXBhY3RCdWlsZGVyIGltcGFjdEJ1aWxkZXIsIE5hdGl2ZUJlaGF2aW9yIGJlaGF2aW9yLCBjYXVzZSkgewogICAgdm9pZCByZWdpc3Rlckluc3RhbnRpYXRpb24oSW50ZXJmYWNlVHlwZSB0eXBlKSB7CiAgICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJUeXBlVXNlKG5ldyBUeXBlVXNlLm5hdGl2ZUluc3RhbnRpYXRpb24odHlwZSkpOwogICAgfQoKICAgIGludCB1bnVzZWRCZWZvcmUgPSBfdW51c2VkQ2xhc3Nlcy5sZW5ndGg7CiAgICBTZXQ8Q2xhc3NFbnRpdHk+IG1hdGNoaW5nQ2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CiAgICBmb3IgKHZhciB0eXBlIGluIGJlaGF2aW9yLnR5cGVzSW5zdGFudGlhdGVkKSB7CiAgICAgIGlmICh0eXBlIGlzIFNwZWNpYWxUeXBlKSB7CiAgICAgICAgaWYgKHR5cGUgPT0gU3BlY2lhbFR5cGUuSnNPYmplY3QpIHsKICAgICAgICAgIHJlZ2lzdGVySW5zdGFudGlhdGlvbihfY29tbW9uRWxlbWVudHMub2JqZWN0VHlwZSk7CiAgICAgICAgfQogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICh0eXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICBpZiAodHlwZSA9PSBfY29tbW9uRWxlbWVudHMubnVtVHlwZSkgewogICAgICAgICAgcmVnaXN0ZXJJbnN0YW50aWF0aW9uKF9jb21tb25FbGVtZW50cy5kb3VibGVUeXBlKTsKICAgICAgICAgIHJlZ2lzdGVySW5zdGFudGlhdGlvbihfY29tbW9uRWxlbWVudHMuaW50VHlwZSk7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IF9jb21tb25FbGVtZW50cy5pbnRUeXBlIHx8CiAgICAgICAgICAgIHR5cGUgPT0gX2NvbW1vbkVsZW1lbnRzLmRvdWJsZVR5cGUgfHwKICAgICAgICAgICAgdHlwZSA9PSBfY29tbW9uRWxlbWVudHMuc3RyaW5nVHlwZSB8fAogICAgICAgICAgICB0eXBlID09IF9jb21tb25FbGVtZW50cy5udWxsVHlwZSB8fAogICAgICAgICAgICB0eXBlID09IF9jb21tb25FbGVtZW50cy5ib29sVHlwZSB8fAogICAgICAgICAgICBfZGFydFR5cGVzLmlzU3VidHlwZSh0eXBlLAogICAgICAgICAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRSYXdUeXBlKF9jb21tb25FbGVtZW50cy5qc0FycmF5Q2xhc3MpKSkgewogICAgICAgICAgcmVnaXN0ZXJJbnN0YW50aWF0aW9uKHR5cGUpOwogICAgICAgIH0KICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBJbXByb3ZlIHNwZWMgc3RyaW5nIHByZWNpc2lvbiB0byBoYW5kbGUgdHlwZQogICAgICAgIC8vIGFyZ3VtZW50cyBhbmQgaW1wbGVtZW50cyByZWxhdGlvbnMgdGhhdCBwcmVzZXJ2ZSBnZW5lcmljcy4gQ3VycmVudGx5CiAgICAgICAgLy8gd2UgY2Fubm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gYExpc3RgLCBgTGlzdDxkeW5hbWljPmAsIGFuZAogICAgICAgIC8vIGBMaXN0PGludD5gIGFuZCB0YWtlIGFsbCB0byBtZWFuIGBMaXN0PEU+YDsgaW4gZWZmZWN0IG5vdCBpbmNsdWRpbmcKICAgICAgICAvLyBhbnkgbmF0aXZlIHN1YmNsYXNzZXMgb2YgZ2VuZXJpYyBjbGFzc2VzLgogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcixzcmEpOiBGaW5kIGFuZCByZXBsYWNlIHVzZXMgb2YgYExpc3RgIHdpdGggdGhlCiAgICAgICAgLy8gYWN0dWFsIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgc3VjaCBhcyBgSlNBcnJheWAgZXQgYWwuCiAgICAgICAgbWF0Y2hpbmdDbGFzc2VzCiAgICAgICAgICAgIC5hZGRBbGwoX2ZpbmRVbnVzZWRDbGFzc2VzTWF0Y2hpbmcoKENsYXNzRW50aXR5IG5hdGl2ZUNsYXNzKSB7CiAgICAgICAgICBJbnRlcmZhY2VUeXBlIG5hdGl2ZVR5cGUgPQogICAgICAgICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0UmF3VHlwZShuYXRpdmVDbGFzcyk7CiAgICAgICAgICBJbnRlcmZhY2VUeXBlIHNwZWNUeXBlID0gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRSYXdUeXBlKHR5cGUuZWxlbWVudCk7CiAgICAgICAgICByZXR1cm4gX2RhcnRUeXBlcy5pc1N1YnR5cGUobmF0aXZlVHlwZSwgc3BlY1R5cGUpOwogICAgICAgIH0pKTsKICAgICAgfSBlbHNlIGlmICh0eXBlLmlzRHluYW1pYykgewogICAgICAgIG1hdGNoaW5nQ2xhc3Nlcy5hZGRBbGwoX3VudXNlZENsYXNzZXMpOwogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydCh0eXBlIGlzIFZvaWRUeXBlLCAnJHR5cGUgd2FzICR7dHlwZS5ydW50aW1lVHlwZX0nKTsKICAgICAgfQogICAgfQogICAgaWYgKG1hdGNoaW5nQ2xhc3Nlcy5pc05vdEVtcHR5ICYmIF9yZWdpc3RlcmVkQ2xhc3Nlcy5pc0VtcHR5KSB7CiAgICAgIG1hdGNoaW5nQ2xhc3Nlcy5hZGRBbGwoX29uRmlyc3ROYXRpdmVDbGFzcyhpbXBhY3RCdWlsZGVyKSk7CiAgICB9CiAgICBfcmVnaXN0ZXJUeXBlVXNlcyhpbXBhY3RCdWlsZGVyLCBtYXRjaGluZ0NsYXNzZXMsIGNhdXNlKTsKCiAgICAvLyBHaXZlIGFuIGluZm8gc28gdGhhdCBsaWJyYXJ5IGRldmVsb3BlcnMgY2FuIGNvbXBpbGUgd2l0aCAtdiB0byBmaW5kIHdoeQogICAgLy8gYWxsIHRoZSBuYXRpdmUgY2xhc3NlcyBhcmUgaW5jbHVkZWQuCiAgICBpZiAodW51c2VkQmVmb3JlID4gMCAmJiB1bnVzZWRCZWZvcmUgPT0gbWF0Y2hpbmdDbGFzc2VzLmxlbmd0aCkgewogICAgICBfYWxsVXNlZE1lc3NhZ2UgPz89ICdBbGwgbmF0aXZlIHR5cGVzIG1hcmtlZCBhcyB1c2VkIGR1ZSB0byAkY2F1c2UuJzsKICAgIH0KICB9CgogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBfZmluZFVudXNlZENsYXNzZXNNYXRjaGluZygKICAgICAgYm9vbCBwcmVkaWNhdGUoQ2xhc3NFbnRpdHkgY2xhc3NFbGVtZW50KSkgewogICAgcmV0dXJuIF91bnVzZWRDbGFzc2VzLndoZXJlKHByZWRpY2F0ZSk7CiAgfQoKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gX29uRmlyc3ROYXRpdmVDbGFzcyhXb3JsZEltcGFjdEJ1aWxkZXIgaW1wYWN0QnVpbGRlcikgewogICAgcmV0dXJuIF9maW5kTmF0aXZlRXhjZXB0aW9ucygpOwogIH0KCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IF9maW5kTmF0aXZlRXhjZXB0aW9ucygpIHsKICAgIHJldHVybiBfZmluZFVudXNlZENsYXNzZXNNYXRjaGluZygoQ2xhc3NFbnRpdHkgY2xhc3NFbGVtZW50KSB7CiAgICAgIC8vIFRPRE8oc3JhKTogQW5ub3RhdGUgZXhjZXB0aW9uIGNsYXNzZXMgaW4gZGFydDpodG1sLgogICAgICBTdHJpbmcgbmFtZSA9IGNsYXNzRWxlbWVudC5uYW1lOwogICAgICBpZiAobmFtZS5jb250YWlucygnRXhjZXB0aW9uJykpIHJldHVybiB0cnVlOwogICAgICBpZiAobmFtZS5jb250YWlucygnRXJyb3InKSkgcmV0dXJuIHRydWU7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBsb2dTdW1tYXJ5KHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSkgewogICAgaWYgKF9hbGxVc2VkTWVzc2FnZSAhPSBudWxsKSB7CiAgICAgIGxvZyhfYWxsVXNlZE1lc3NhZ2UpOwogICAgfQogIH0KfQoKY2xhc3MgTmF0aXZlUmVzb2x1dGlvbkVucXVldWVyIGV4dGVuZHMgTmF0aXZlRW5xdWV1ZXJCYXNlIHsKICBmaW5hbCBOYXRpdmVDbGFzc0ZpbmRlciBfbmF0aXZlQ2xhc3NGaW5kZXI7CgogIC8vLyBUaGUgc2V0IG9mIGFsbCBuYXRpdmUgY2xhc3Nlcy4gIEVhY2ggbmF0aXZlIGNsYXNzIGlzIGluIFtuYXRpdmVDbGFzc2VzXQogIC8vLyBhbmQgZXhhY3RseSBvbmUgb2YgW3VudXNlZENsYXNzZXNdIGFuZCBbcmVnaXN0ZXJlZENsYXNzZXNdLgogIGZpbmFsIFNldDxDbGFzc0VudGl0eT4gX25hdGl2ZUNsYXNzZXMgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwoKICBOYXRpdmVSZXNvbHV0aW9uRW5xdWV1ZXIoCiAgICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgICBFbGVtZW50RW52aXJvbm1lbnQgZWxlbWVudEVudmlyb25tZW50LAogICAgICBDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgICAgRGFydFR5cGVzIGRhcnRUeXBlcywKICAgICAgdGhpcy5fbmF0aXZlQ2xhc3NGaW5kZXIpCiAgICAgIDogc3VwZXIob3B0aW9ucywgZWxlbWVudEVudmlyb25tZW50LCBjb21tb25FbGVtZW50cywgZGFydFR5cGVzKTsKCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGdldCBuYXRpdmVDbGFzc2VzRm9yVGVzdGluZyA9PiBfbmF0aXZlQ2xhc3NlczsKCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGdldCByZWdpc3RlcmVkQ2xhc3Nlc0ZvclRlc3RpbmcgPT4gX3JlZ2lzdGVyZWRDbGFzc2VzOwoKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0IGxpdmVOYXRpdmVDbGFzc2VzID0+IF9yZWdpc3RlcmVkQ2xhc3NlczsKCiAgQG92ZXJyaWRlCiAgV29ybGRJbXBhY3QgcHJvY2Vzc05hdGl2ZUNsYXNzZXMoSXRlcmFibGU8VXJpPiBsaWJyYXJpZXMpIHsKICAgIFdvcmxkSW1wYWN0QnVpbGRlckltcGwgaW1wYWN0QnVpbGRlciA9IG5ldyBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsKCk7CiAgICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gbmF0aXZlQ2xhc3NlcyA9CiAgICAgICAgX25hdGl2ZUNsYXNzRmluZGVyLmNvbXB1dGVOYXRpdmVDbGFzc2VzKGxpYnJhcmllcyk7CiAgICBfbmF0aXZlQ2xhc3Nlcy5hZGRBbGwobmF0aXZlQ2xhc3Nlcyk7CiAgICBfdW51c2VkQ2xhc3Nlcy5hZGRBbGwobmF0aXZlQ2xhc3Nlcyk7CiAgICBpZiAoIWVuYWJsZUxpdmVUeXBlQW5hbHlzaXMpIHsKICAgICAgX3JlZ2lzdGVyVHlwZVVzZXMoaW1wYWN0QnVpbGRlciwgX25hdGl2ZUNsYXNzZXMsICdmb3JjZWQnKTsKICAgIH0KICAgIHJldHVybiBpbXBhY3RCdWlsZGVyOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBsb2dTdW1tYXJ5KHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSkgewogICAgc3VwZXIubG9nU3VtbWFyeShsb2cpOwogICAgbG9nKCdSZXNvbHZlZCAke19yZWdpc3RlcmVkQ2xhc3Nlcy5sZW5ndGh9IG5hdGl2ZSBlbGVtZW50cyB1c2VkLCAnCiAgICAgICAgJyR7X3VudXNlZENsYXNzZXMubGVuZ3RofSBuYXRpdmUgZWxlbWVudHMgZGVhZC4nKTsKICB9Cn0KCmNsYXNzIE5hdGl2ZUNvZGVnZW5FbnF1ZXVlciBleHRlbmRzIE5hdGl2ZUVucXVldWVyQmFzZSB7CiAgZmluYWwgQ29kZUVtaXR0ZXJUYXNrIF9lbWl0dGVyOwogIGZpbmFsIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBfbmF0aXZlQ2xhc3NlczsKICBmaW5hbCBOYXRpdmVEYXRhIF9uYXRpdmVEYXRhOwoKICBmaW5hbCBTZXQ8Q2xhc3NFbnRpdHk+IF9kb25lQWRkU3VidHlwZXMgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwoKICBOYXRpdmVDb2RlZ2VuRW5xdWV1ZXIoCiAgICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgICBFbGVtZW50RW52aXJvbm1lbnQgZWxlbWVudEVudmlyb25tZW50LAogICAgICBDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgICAgRGFydFR5cGVzIGRhcnRUeXBlcywKICAgICAgdGhpcy5fZW1pdHRlciwKICAgICAgdGhpcy5fbmF0aXZlQ2xhc3NlcywKICAgICAgdGhpcy5fbmF0aXZlRGF0YSkKICAgICAgOiBzdXBlcihvcHRpb25zLCBlbGVtZW50RW52aXJvbm1lbnQsIGNvbW1vbkVsZW1lbnRzLCBkYXJ0VHlwZXMpOwoKICBAb3ZlcnJpZGUKICBXb3JsZEltcGFjdCBwcm9jZXNzTmF0aXZlQ2xhc3NlcyhJdGVyYWJsZTxVcmk+IGxpYnJhcmllcykgewogICAgV29ybGRJbXBhY3RCdWlsZGVySW1wbCBpbXBhY3RCdWlsZGVyID0gbmV3IFdvcmxkSW1wYWN0QnVpbGRlckltcGwoKTsKICAgIF91bnVzZWRDbGFzc2VzLmFkZEFsbChfbmF0aXZlQ2xhc3Nlcyk7CgogICAgaWYgKCFlbmFibGVMaXZlVHlwZUFuYWx5c2lzKSB7CiAgICAgIF9yZWdpc3RlclR5cGVVc2VzKGltcGFjdEJ1aWxkZXIsIF9uYXRpdmVDbGFzc2VzLCAnZm9yY2VkJyk7CiAgICB9CgogICAgLy8gSEFDSyBIQUNLIC0gYWRkIGFsbCB0aGUgcmVzb2x2ZWQgY2xhc3Nlcy4KICAgIFNldDxDbGFzc0VudGl0eT4gbWF0Y2hpbmdDbGFzc2VzID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKICAgIGZvciAoQ2xhc3NFbnRpdHkgY2xhc3NFbGVtZW50IGluIF9uYXRpdmVDbGFzc2VzKSB7CiAgICAgIGlmIChfdW51c2VkQ2xhc3Nlcy5jb250YWlucyhjbGFzc0VsZW1lbnQpKSB7CiAgICAgICAgbWF0Y2hpbmdDbGFzc2VzLmFkZChjbGFzc0VsZW1lbnQpOwogICAgICB9CiAgICB9CiAgICBpZiAobWF0Y2hpbmdDbGFzc2VzLmlzTm90RW1wdHkgJiYgX3JlZ2lzdGVyZWRDbGFzc2VzLmlzRW1wdHkpIHsKICAgICAgbWF0Y2hpbmdDbGFzc2VzLmFkZEFsbChfb25GaXJzdE5hdGl2ZUNsYXNzKGltcGFjdEJ1aWxkZXIpKTsKICAgIH0KICAgIF9yZWdpc3RlclR5cGVVc2VzKGltcGFjdEJ1aWxkZXIsIG1hdGNoaW5nQ2xhc3NlcywgJ3dhcyByZXNvbHZlZCcpOwogICAgcmV0dXJuIGltcGFjdEJ1aWxkZXI7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF9yZWdpc3RlclR5cGVVc2VzKAogICAgICBXb3JsZEltcGFjdEJ1aWxkZXIgaW1wYWN0QnVpbGRlciwgU2V0PENsYXNzRW50aXR5PiBjbGFzc2VzLCBjYXVzZSkgewogICAgc3VwZXIuX3JlZ2lzdGVyVHlwZVVzZXMoaW1wYWN0QnVpbGRlciwgY2xhc3NlcywgY2F1c2UpOwoKICAgIGZvciAoQ2xhc3NFbnRpdHkgY2xhc3NFbGVtZW50IGluIGNsYXNzZXMpIHsKICAgICAgLy8gQWRkIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHRoaXMgY2xhc3MgaXMgYSBzdWJ0eXBlIG9mIGl0cyBzdXBlcnR5cGVzLiBUaGUKICAgICAgLy8gY29kZSBlbWl0dGVyIGFuZCB0aGUgc3NhIGJ1aWxkZXIgdXNlIHRoYXQgaW5mb3JtYXRpb24uCiAgICAgIF9hZGRTdWJ0eXBlcyhjbGFzc0VsZW1lbnQsIF9lbWl0dGVyLm5hdGl2ZUVtaXR0ZXIpOwogICAgfQogIH0KCiAgdm9pZCBfYWRkU3VidHlwZXMoQ2xhc3NFbnRpdHkgY2xzLCBOYXRpdmVFbWl0dGVyIGVtaXR0ZXIpIHsKICAgIGlmICghX25hdGl2ZURhdGEuaXNOYXRpdmVDbGFzcyhjbHMpKSByZXR1cm47CiAgICBpZiAoX2RvbmVBZGRTdWJ0eXBlcy5jb250YWlucyhjbHMpKSByZXR1cm47CiAgICBfZG9uZUFkZFN1YnR5cGVzLmFkZChjbHMpOwoKICAgIC8vIFdhbGsgdGhlIHN1cGVyY2xhc3MgY2hhaW4gc2luY2UgY2xhc3NlcyBvbiB0aGUgc3VwZXJjbGFzcyBjaGFpbiBtaWdodCBub3QKICAgIC8vIGJlIGluc3RhbnRpYXRlZCAoYWJzdHJhY3Qgb3Igc2ltcGx5IHVudXNlZCkuCiAgICBfYWRkU3VidHlwZXMoX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRTdXBlckNsYXNzKGNscyksIGVtaXR0ZXIpOwoKICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaFN1cGVydHlwZShjbHMsIChJbnRlcmZhY2VUeXBlIHR5cGUpIHsKICAgICAgTGlzdDxDbGFzc0VudGl0eT4gc3VidHlwZXMgPQogICAgICAgICAgZW1pdHRlci5zdWJ0eXBlc1t0eXBlLmVsZW1lbnRdID8/PSA8Q2xhc3NFbnRpdHk+W107CiAgICAgIHN1YnR5cGVzLmFkZChjbHMpOwogICAgfSk7CgogICAgLy8gU2tpcCB0aHJvdWdoIGFsbCB0aGUgbWl4aW4gYXBwbGljYXRpb25zIGluIHRoZSBzdXBlciBjbGFzcwogICAgLy8gY2hhaW4uIFRoYXQgd2F5LCB0aGUgZGlyZWN0IHN1YnR5cGVzIHNldCBvbmx5IGNvbnRhaW4gdGhlCiAgICAvLyBuYXRpdmVzIGNsYXNzZXMuCiAgICBDbGFzc0VudGl0eSBzdXBlcmNsYXNzID0gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRTdXBlckNsYXNzKGNscyk7CiAgICB3aGlsZSAoc3VwZXJjbGFzcyAhPSBudWxsICYmCiAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5pc01peGluQXBwbGljYXRpb24oc3VwZXJjbGFzcykpIHsKICAgICAgYXNzZXJ0KCFfbmF0aXZlRGF0YS5pc05hdGl2ZUNsYXNzKHN1cGVyY2xhc3MpKTsKICAgICAgc3VwZXJjbGFzcyA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0U3VwZXJDbGFzcyhzdXBlcmNsYXNzKTsKICAgIH0KCiAgICBMaXN0PENsYXNzRW50aXR5PiBkaXJlY3RTdWJ0eXBlcyA9CiAgICAgICAgZW1pdHRlci5kaXJlY3RTdWJ0eXBlc1tzdXBlcmNsYXNzXSA/Pz0gPENsYXNzRW50aXR5PltdOwogICAgZGlyZWN0U3VidHlwZXMuYWRkKGNscyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGxvZ1N1bW1hcnkodm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpKSB7CiAgICBzdXBlci5sb2dTdW1tYXJ5KGxvZyk7CiAgICBsb2coJ0NvbXBpbGVkICR7X3JlZ2lzdGVyZWRDbGFzc2VzLmxlbmd0aH0gbmF0aXZlIGNsYXNzZXMsICcKICAgICAgICAnJHtfdW51c2VkQ2xhc3Nlcy5sZW5ndGh9IG5hdGl2ZSBjbGFzc2VzIG9taXR0ZWQuJyk7CiAgfQp9CoEzAE5OPAFKJCE5TBosJ0IYLwFEEhc7MQEuPxsBTBofUQE1MgE8LwIBPkZCAQxIATkaASIwHigBST4uAUwBDDAvLAYEAUYaSycrUUwWEgglUQYEAQwfUEIEAR9KNUwGAS4/MyEsPQoSCCMvPTo2MjIwMCdRJwpNUEZPNU1CGEslO1E9DSMwD0MIBkRCBj4BTyxGTAYEATQyLAQBUCQEATJDPSczLxQIBAEMLiMcBgQCATwuAU5CQgEcHy0lGx9HAUcBTwFFAQw+SSo8KiojQgYaBAEMLhtHOwQCATkiLiABRAEZHy0lGxUbGEcBDD5JKwEjQgYBMT83MysIBkRCBkcaBAEMGks8ATBRQDoGBAE+MTAfAVE0QwFFIz4ZCAFCQRhFIT42QgYBJ0AdBAEMLhtBPQQCAShwYWNrYWdlOmNvbXBpbGVyL3NyYy9uYXRpdmUvZW5xdWV1ZS5kYXJ0MnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL25hdGl2ZS9yZXNvbHZlci5kYXJ0mTsvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCcgc2hvdyBLRWxlbWVudEVudmlyb25tZW50OwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vaXIvYW5ub3RhdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9uYXRpdmVfZGF0YS5kYXJ0JzsKCi8vLyBJbnRlcmZhY2UgZm9yIGNvbXB1dGluZyBuYXRpdmUgbWVtYmVycy4KYWJzdHJhY3QgY2xhc3MgTmF0aXZlTWVtYmVyUmVzb2x2ZXIgewogIC8vLyBDb21wdXRlcyB3aGV0aGVyIFtub2RlXSBpcyBuYXRpdmUgb3IgSnNJbnRlcm9wLgogIHZvaWQgcmVzb2x2ZU5hdGl2ZU1lbWJlcihpci5NZW1iZXIgbm9kZSwgSXJBbm5vdGF0aW9uRGF0YSBhbm5vdGF0aW9uRGF0YSk7Cn0KCi8vLyBEZXRlcm1pbmVzIGFsbCBuYXRpdmUgY2xhc3NlcyBpbiBhIHNldCBvZiBsaWJyYXJpZXMuCmFic3RyYWN0IGNsYXNzIE5hdGl2ZUNsYXNzRmluZGVyIHsKICAvLy8gUmV0dXJucyB0aGUgc2V0IG9mIGFsbCBuYXRpdmUgY2xhc3NlcyBkZWNsYXJlZCBpbiBbbGlicmFyaWVzXS4KICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gY29tcHV0ZU5hdGl2ZUNsYXNzZXMoSXRlcmFibGU8VXJpPiBsaWJyYXJpZXMpOwp9CgpjbGFzcyBCYXNlTmF0aXZlQ2xhc3NGaW5kZXIgaW1wbGVtZW50cyBOYXRpdmVDbGFzc0ZpbmRlciB7CiAgZmluYWwgS0VsZW1lbnRFbnZpcm9ubWVudCBfZWxlbWVudEVudmlyb25tZW50OwogIGZpbmFsIE5hdGl2ZUJhc2ljRGF0YSBfbmF0aXZlQmFzaWNEYXRhOwoKICBNYXA8U3RyaW5nLCBDbGFzc0VudGl0eT4gX3RhZ093bmVyID0gbmV3IE1hcDxTdHJpbmcsIENsYXNzRW50aXR5PigpOwoKICBCYXNlTmF0aXZlQ2xhc3NGaW5kZXIodGhpcy5fZWxlbWVudEVudmlyb25tZW50LCB0aGlzLl9uYXRpdmVCYXNpY0RhdGEpOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gY29tcHV0ZU5hdGl2ZUNsYXNzZXMoSXRlcmFibGU8VXJpPiBsaWJyYXJpZXMpIHsKICAgIFNldDxDbGFzc0VudGl0eT4gbmF0aXZlQ2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CiAgICBsaWJyYXJpZXMuZm9yRWFjaCgodXJpKSA9PiBfcHJvY2Vzc05hdGl2ZUNsYXNzZXNJbkxpYnJhcnkoCiAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5sb29rdXBMaWJyYXJ5KHVyaSksIG5hdGl2ZUNsYXNzZXMpKTsKICAgIF9wcm9jZXNzU3ViY2xhc3Nlc09mTmF0aXZlQ2xhc3NlcyhsaWJyYXJpZXMsIG5hdGl2ZUNsYXNzZXMpOwogICAgcmV0dXJuIG5hdGl2ZUNsYXNzZXM7CiAgfQoKICAvLy8gQWRkcyBhbGwgZGlyZWN0bHkgbmF0aXZlIGNsYXNzZXMgZGVjbGFyZWQgaW4gW2xpYnJhcnldIHRvIFtuYXRpdmVDbGFzc2VzXS4KICB2b2lkIF9wcm9jZXNzTmF0aXZlQ2xhc3Nlc0luTGlicmFyeSgKICAgICAgTGlicmFyeUVudGl0eSBsaWJyYXJ5LCBTZXQ8Q2xhc3NFbnRpdHk+IG5hdGl2ZUNsYXNzZXMpIHsKICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaENsYXNzKGxpYnJhcnksIChDbGFzc0VudGl0eSBjbHMpIHsKICAgICAgaWYgKF9uYXRpdmVCYXNpY0RhdGEuaXNOYXRpdmVDbGFzcyhjbHMpKSB7CiAgICAgICAgX3Byb2Nlc3NOYXRpdmVDbGFzcyhjbHMsIG5hdGl2ZUNsYXNzZXMpOwogICAgICB9CiAgICB9KTsKICB9CgogIC8vLyBBZGRzIFtjbHNdIHRvIFtuYXRpdmVDbGFzc2VzXSBhbmQgcGVyZm9ybXMgZnVydGhlciBwcm9jZXNzaW5nIG9mIFtjbHNdLAogIC8vLyBpZiBuZWNlc3NhcnkuCiAgdm9pZCBfcHJvY2Vzc05hdGl2ZUNsYXNzKAogICAgICBjb3ZhcmlhbnQgQ2xhc3NFbnRpdHkgY2xzLCBTZXQ8Q2xhc3NFbnRpdHk+IG5hdGl2ZUNsYXNzZXMpIHsKICAgIG5hdGl2ZUNsYXNzZXMuYWRkKGNscyk7CiAgICAvLyBKcyBJbnRlcm9wIGludGVyZmFjZXMgZG8gbm90IGhhdmUgdGFncy4KICAgIGlmIChfbmF0aXZlQmFzaWNEYXRhLmlzSnNJbnRlcm9wQ2xhc3MoY2xzKSkgcmV0dXJuOwogICAgLy8gU2luY2Ugd2UgbWFwIGZyb20gZGlzcGF0Y2ggdGFncyB0byBjbGFzc2VzLCBhIGRpc3BhdGNoIHRhZyBtdXN0IGJlIHVzZWQKICAgIC8vIG9uIG9ubHkgb25lIG5hdGl2ZSBjbGFzcy4KICAgIGZvciAoU3RyaW5nIHRhZyBpbiBfbmF0aXZlQmFzaWNEYXRhLmdldE5hdGl2ZVRhZ3NPZkNsYXNzKGNscykpIHsKICAgICAgQ2xhc3NFbnRpdHkgb3duZXIgPSBfdGFnT3duZXJbdGFnXTsKICAgICAgaWYgKG93bmVyICE9IG51bGwpIHsKICAgICAgICBpZiAob3duZXIgIT0gY2xzKSB7CiAgICAgICAgICBmYWlsZWRBdChjbHMsICJUYWcgJyR0YWcnIGFscmVhZHkgaW4gdXNlIGJ5ICcke293bmVyLm5hbWV9JyIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBfdGFnT3duZXJbdGFnXSA9IGNsczsKICAgICAgfQogICAgfQogIH0KCiAgLy8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHN1cGVyIGNsYXNzIG9mIFtjbHNdIG9yIGBudWxsYCBvZiBbY2xzXSBoYXMKICAvLy8gbm8gZXhwbGljaXQgc3VwZXJjbGFzcy4KICBTdHJpbmcgX2ZpbmRFeHRlbmRzTmFtZU9mQ2xhc3MoY292YXJpYW50IENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIF9lbGVtZW50RW52aXJvbm1lbnQKICAgICAgICAuZ2V0U3VwZXJDbGFzcyhjbHMsIHNraXBVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbnM6IHRydWUpCiAgICAgICAgPy5uYW1lOwogIH0KCiAgLy8vIEFkZHMgYWxsIHN1YmNsYXNzZXMgb2YgW25hdGl2ZUNsYXNzZXNdIGZvdW5kIGluIFtsaWJyYXJpZXNdIHRvCiAgLy8vIFtuYXRpdmVDbGFzc2VzXS4KICB2b2lkIF9wcm9jZXNzU3ViY2xhc3Nlc09mTmF0aXZlQ2xhc3NlcygKICAgICAgSXRlcmFibGU8VXJpPiBsaWJyYXJpZXMsIFNldDxDbGFzc0VudGl0eT4gbmF0aXZlQ2xhc3NlcykgewogICAgU2V0PENsYXNzRW50aXR5PiBuYXRpdmVDbGFzc2VzQW5kU3ViY2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CiAgICAvLyBDb2xsZWN0IHBvdGVudGlhbCBzdWJjbGFzc2VzLCBlLmcuCiAgICAvLwogICAgLy8gICAgIGNsYXNzIEIgZXh0ZW5kcyBmb28uQSB7fQogICAgLy8KICAgIC8vIFN0cmluZyAiQSIgaGFzIGEgcG90ZW50aWFsIHN1YmNsYXNzIEIuCgogICAgTWFwPFN0cmluZywgU2V0PENsYXNzRW50aXR5Pj4gcG90ZW50aWFsRXh0ZW5kcyA9CiAgICAgICAgPFN0cmluZywgU2V0PENsYXNzRW50aXR5Pj57fTsKCiAgICBsaWJyYXJpZXMuZm9yRWFjaCgoVXJpIHVyaSkgewogICAgICBMaWJyYXJ5RW50aXR5IGxpYnJhcnkgPSBfZWxlbWVudEVudmlyb25tZW50Lmxvb2t1cExpYnJhcnkodXJpKTsKICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5mb3JFYWNoQ2xhc3MobGlicmFyeSwgKENsYXNzRW50aXR5IGNscykgewogICAgICAgIFN0cmluZyBleHRlbmRzTmFtZSA9IF9maW5kRXh0ZW5kc05hbWVPZkNsYXNzKGNscyk7CiAgICAgICAgaWYgKGV4dGVuZHNOYW1lICE9IG51bGwpIHsKICAgICAgICAgIFNldDxDbGFzc0VudGl0eT4gcG90ZW50aWFsU3ViY2xhc3NlcyA9IHBvdGVudGlhbEV4dGVuZHMucHV0SWZBYnNlbnQoCiAgICAgICAgICAgICAgZXh0ZW5kc05hbWUsICgpID0+IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCkpOwogICAgICAgICAgcG90ZW50aWFsU3ViY2xhc3Nlcy5hZGQoY2xzKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CgogICAgLy8gUmVzb2x2ZSBhbGwgdGhlIG5hdGl2ZSBjbGFzc2VzIGFuZCBhbnkgY2xhc3NlcyB0aGF0IG1pZ2h0IGV4dGVuZCB0aGVtIGluCiAgICAvLyBbcG90ZW50aWFsRXh0ZW5kc10sIGFuZCB0aGVuIGNoZWNrIHRoYXQgdGhlIHByb3Blcmx5IHJlc29sdmVkIGNsYXNzIGlzIGluCiAgICAvLyBmYWN0IGEgc3ViY2xhc3Mgb2YgYSBuYXRpdmUgY2xhc3MuCgogICAgQ2xhc3NFbnRpdHkgbmF0aXZlU3VwZXJjbGFzc09mKENsYXNzRW50aXR5IGNscykgewogICAgICBpZiAoX25hdGl2ZUJhc2ljRGF0YS5pc05hdGl2ZUNsYXNzKGNscykpIHJldHVybiBjbHM7CiAgICAgIENsYXNzRW50aXR5IHN1cGVyY2xhc3MgPSBfZWxlbWVudEVudmlyb25tZW50LmdldFN1cGVyQ2xhc3MoY2xzKTsKICAgICAgaWYgKHN1cGVyY2xhc3MgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiBuYXRpdmVTdXBlcmNsYXNzT2Yoc3VwZXJjbGFzcyk7CiAgICB9CgogICAgdm9pZCB3YWxrUG90ZW50aWFsU3ViY2xhc3NlcyhDbGFzc0VudGl0eSBlbGVtZW50KSB7CiAgICAgIGlmIChuYXRpdmVDbGFzc2VzQW5kU3ViY2xhc3Nlcy5jb250YWlucyhlbGVtZW50KSkgcmV0dXJuOwogICAgICBDbGFzc0VudGl0eSBuYXRpdmVTdXBlcmNsYXNzID0gbmF0aXZlU3VwZXJjbGFzc09mKGVsZW1lbnQpOwogICAgICBpZiAobmF0aXZlU3VwZXJjbGFzcyAhPSBudWxsKSB7CiAgICAgICAgbmF0aXZlQ2xhc3Nlc0FuZFN1YmNsYXNzZXMuYWRkKGVsZW1lbnQpOwogICAgICAgIFNldDxDbGFzc0VudGl0eT4gcG90ZW50aWFsU3ViY2xhc3NlcyA9IHBvdGVudGlhbEV4dGVuZHNbZWxlbWVudC5uYW1lXTsKICAgICAgICBpZiAocG90ZW50aWFsU3ViY2xhc3NlcyAhPSBudWxsKSB7CiAgICAgICAgICBwb3RlbnRpYWxTdWJjbGFzc2VzLmZvckVhY2god2Fsa1BvdGVudGlhbFN1YmNsYXNzZXMpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIG5hdGl2ZUNsYXNzZXMuZm9yRWFjaCh3YWxrUG90ZW50aWFsU3ViY2xhc3Nlcyk7CiAgICBuYXRpdmVDbGFzc2VzLmFkZEFsbChuYXRpdmVDbGFzc2VzQW5kU3ViY2xhc3Nlcyk7CiAgfQp9CgovLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW3ZhbHVlXSBpcyBuYW1lZCBhbm5vdGF0aW9uIGJhc2VkIG9uIFthbm5vdGF0aW9uQ2xhc3NdLgpib29sIGlzQW5ub3RhdGlvbigKICAgIFNwYW5uYWJsZSBzcGFubmFibGUsIENvbnN0YW50VmFsdWUgdmFsdWUsIENsYXNzRW50aXR5IGFubm90YXRpb25DbGFzcykgewogIGlmICghdmFsdWUuaXNDb25zdHJ1Y3RlZE9iamVjdCkgcmV0dXJuIG51bGw7CiAgQ29uc3RydWN0ZWRDb25zdGFudFZhbHVlIGNvbnN0cnVjdGVkT2JqZWN0ID0gdmFsdWU7CiAgcmV0dXJuIGNvbnN0cnVjdGVkT2JqZWN0LnR5cGUuZWxlbWVudCA9PSBhbm5vdGF0aW9uQ2xhc3M7Cn0KCi8vLyBFeHRyYWN0cyB0aGUgbmFtZSBpZiBbdmFsdWVdIGlzIGEgbmFtZWQgYW5ub3RhdGlvbiBiYXNlZCBvbgovLy8gW2Fubm90YXRpb25DbGFzc10sIG90aGVyd2lzZSByZXR1cm5zIGBudWxsYC4KU3RyaW5nIHJlYWRBbm5vdGF0aW9uTmFtZSgKICAgIFNwYW5uYWJsZSBzcGFubmFibGUsIENvbnN0YW50VmFsdWUgdmFsdWUsIENsYXNzRW50aXR5IGFubm90YXRpb25DbGFzcywKICAgIHtTdHJpbmcgZGVmYXVsdFZhbHVlfSkgewogIGlmICghdmFsdWUuaXNDb25zdHJ1Y3RlZE9iamVjdCkgcmV0dXJuIG51bGw7CiAgQ29uc3RydWN0ZWRDb25zdGFudFZhbHVlIGNvbnN0cnVjdGVkT2JqZWN0ID0gdmFsdWU7CiAgaWYgKGNvbnN0cnVjdGVkT2JqZWN0LnR5cGUuZWxlbWVudCAhPSBhbm5vdGF0aW9uQ2xhc3MpIHJldHVybiBudWxsOwoKICBJdGVyYWJsZTxDb25zdGFudFZhbHVlPiBmaWVsZHMgPSBjb25zdHJ1Y3RlZE9iamVjdC5maWVsZHMudmFsdWVzOwogIC8vIFRPRE8oc3JhKTogQmV0dGVyIHZhbGlkYXRpb24gb2YgdGhlIGNvbnN0YW50LgogIGlmIChmaWVsZHMubGVuZ3RoICE9IDEpIHsKICAgIGZhaWxlZEF0KAogICAgICAgIHNwYW5uYWJsZSwgJ0Fubm90YXRpb25zIG5lZWRzIG9uZSBzdHJpbmc6ICR7dmFsdWUudG9TdHJ1Y3R1cmVkVGV4dCgpfScpOwogICAgcmV0dXJuIG51bGw7CiAgfSBlbHNlIGlmIChmaWVsZHMuc2luZ2xlIGlzIFN0cmluZ0NvbnN0YW50VmFsdWUpIHsKICAgIFN0cmluZ0NvbnN0YW50VmFsdWUgc3BlY1N0cmluZ0NvbnN0YW50ID0gZmllbGRzLnNpbmdsZTsKICAgIHJldHVybiBzcGVjU3RyaW5nQ29uc3RhbnQuc3RyaW5nVmFsdWU7CiAgfSBlbHNlIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCAmJiBmaWVsZHMuc2luZ2xlIGlzIE51bGxDb25zdGFudFZhbHVlKSB7CiAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwogIH0gZWxzZSB7CiAgICBmYWlsZWRBdCgKICAgICAgICBzcGFubmFibGUsICdBbm5vdGF0aW9ucyBuZWVkcyBvbmUgc3RyaW5nOiAke3ZhbHVlLnRvU3RydWN0dXJlZFRleHQoKX0nKTsKICAgIHJldHVybiBudWxsOwogIH0KfQqAqwBOTjwBKAEZOyMkISkBLCY2TQIBOSNFRwIBOzEqAUcBSgEMSD0/QUEaBAFRJz9CMTEICAQBThQcQxwvOE8hRSobHEkKDx4IBgQBSh4+H0AQBAFFFypBSioHJAcuATUmASJGRDsjTzooCgoIAVBRKgE2O0crLQYBOEBCJjFPK0AKCAYBNDYEAgFOE00vNjwCAUAxG0sdLzZGAUQzHA5RETU8K0sZCw5REQQCASlwYWNrYWdlOmNvbXBpbGVyL3NyYy9uYXRpdmUvcmVzb2x2ZXIuZGFydDtzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy91bml2ZXJzZS9jbGFzc19oaWVyYXJjaHkuZGFydMAAixcvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnIHNob3cgSW50ZXJmYWNlVHlwZTsKaW1wb3J0ICcuLi9zZXJpYWxpemF0aW9uL3NlcmlhbGl6YXRpb24uZGFydCc7CmltcG9ydCAnY2xhc3Nfc2V0LmRhcnQnOwoKLy8gVE9ETyhqb2hubml3aW50aGVyKTogTW92ZSBtb3JlIG1ldGhvZHMgZnJvbSBgSkNsb3NlZFdvcmxkYCB0bwovLyBgQ2xhc3NIaWVyYXJjaHlgLgphYnN0cmFjdCBjbGFzcyBDbGFzc0hpZXJhcmNoeSB7CiAgLy8vIERlc2VyaWFsaXplcyBhIFtDbGFzc0hpZXJhcmNoeV0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBDbGFzc0hpZXJhcmNoeS5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgICAgICBEYXRhU291cmNlIHNvdXJjZSwgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpID0KICAgICAgQ2xhc3NIaWVyYXJjaHlJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZTsKCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbQ2xhc3NIaWVyYXJjaHldIHRvIFtzaW5rXS4KICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtjbHNdIGlzIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluc3RhbnRpYXRlZC4KICBib29sIGlzSW5zdGFudGlhdGVkKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbY2xzXSBpcyBkaXJlY3RseSBpbnN0YW50aWF0ZWQuIFRoaXMgbWVhbnMgdGhhdCBhdAogIC8vLyBydW50aW1lIGluc3RhbmNlcyBvZiBleGFjdGx5IFtjbHNdIGFyZSBhc3N1bWVkIHRvIGV4aXN0LgogIGJvb2wgaXNEaXJlY3RseUluc3RhbnRpYXRlZChDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2Nsc10gaXMgYWJzdHJhY3RseSBpbnN0YW50aWF0ZWQuIFRoaXMgbWVhbnMgdGhhdCBhdAogIC8vLyBydW50aW1lIGluc3RhbmNlcyBvZiBbY2xzXSBvciB1bmtub3duIHN1YmNsYXNzZXMgb2YgW2Nsc10gYXJlIGFzc3VtZWQgdG8KICAvLy8gZXhpc3QuCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCB0byBtYXJrIG5hdGl2ZSBhbmQvb3IgcmVmbGVjdGFibGUgY2xhc3NlcyBhcyBpbnN0YW50aWF0ZWQuCiAgLy8vIEZvciBuYXRpdmUgY2xhc3NlcyB3ZSBkbyBub3Qga25vdyB0aGUgZXhhY3QgY2xhc3MgdGhhdCBpbnN0YW50aWF0ZXMgW2Nsc10KICAvLy8gc28gW2Nsc10gaGVyZSByZXByZXNlbnRzIHRoZSByb290IG9mIHRoZSBzdWJjbGFzc2VzLiBGb3IgcmVmbGVjdGFibGUKICAvLy8gY2xhc3NlcyB3ZSBuZWVkIGV2ZW50IGFic3RyYWN0IGNsYXNzZXMgdG8gYmUgJ2xpdmUnIGV2ZW4gdGhvdWdoIHRoZXkKICAvLy8gY2Fubm90IHRoZW1zZWx2ZXMgYmUgaW5zdGFudGlhdGVkLgogIGJvb2wgaXNBYnN0cmFjdGx5SW5zdGFudGlhdGVkKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbY2xzXSBpcyBlaXRoZXIgZGlyZWN0bHkgb3IgYWJzdHJhY3RseSBpbnN0YW50aWF0ZWQuCiAgLy8vCiAgLy8vIFNlZSBbaXNEaXJlY3RseUluc3RhbnRpYXRlZF0gYW5kIFtpc0Fic3RyYWN0bHlJbnN0YW50aWF0ZWRdLgogIGJvb2wgaXNFeHBsaWNpdGx5SW5zdGFudGlhdGVkKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbY2xzXSBpcyBpbmRpcmVjdGx5IGluc3RhbnRpYXRlZCwgdGhhdCBpcyB0aHJvdWdoIGEKICAvLy8gc3ViY2xhc3MuCiAgYm9vbCBpc0luZGlyZWN0bHlJbnN0YW50aWF0ZWQoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgW3hdIGlzIGEgKG5vbi1zdHJpY3QpIHN1YmNsYXNzIG9mIFt5XS4KICBib29sIGlzU3ViY2xhc3NPZihDbGFzc0VudGl0eSB4LCBDbGFzc0VudGl0eSB5KTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFt4XSBpcyBhIHN1YnR5cGUgb2YgW3ldLCB0aGF0IGlzLCBpZiBbeF0gaW1wbGVtZW50cyBhbgogIC8vLyBpbnN0YW5jZSBvZiBbeV0uCiAgYm9vbCBpc1N1YnR5cGVPZihDbGFzc0VudGl0eSB4LCBDbGFzc0VudGl0eSB5KTsKCiAgLy8vIFJldHVybnMgYW4gaXRlcmFibGUgb3ZlciB0aGUgZGlyZWN0bHkgaW5zdGFudGlhdGVkIGNsYXNzZXMgdGhhdCBleHRlbmQKICAvLy8gW2Nsc10gcG9zc2libHkgaW5jbHVkaW5nIFtjbHNdIGl0c2VsZiwgaWYgaXQgaXMgbGl2ZS4KICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gc3ViY2xhc3Nlc09mKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIGFuIGl0ZXJhYmxlIG92ZXIgdGhlIGRpcmVjdGx5IGluc3RhbnRpYXRlZCBjbGFzc2VzIHRoYXQgZXh0ZW5kCiAgLy8vIFtjbHNdIF9ub3RfIGluY2x1ZGluZyBbY2xzXSBpdHNlbGYuCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IHN0cmljdFN1YmNsYXNzZXNPZihDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGxpdmUgY2xhc3NlcyB0aGF0IGV4dGVuZCBbY2xzXSBfbm90XwogIC8vLyBpbmNsdWRpbmcgW2Nsc10gaXRzZWxmLgogIGludCBzdHJpY3RTdWJjbGFzc0NvdW50KENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBBcHBsaWVzIFtmXSB0byBlYWNoIGxpdmUgY2xhc3MgdGhhdCBleHRlbmQgW2Nsc10gX25vdF8gaW5jbHVkaW5nIFtjbHNdCiAgLy8vIGl0c2VsZi4KICB2b2lkIGZvckVhY2hTdHJpY3RTdWJjbGFzc09mKAogICAgICBDbGFzc0VudGl0eSBjbHMsIEl0ZXJhdGlvblN0ZXAgZihDbGFzc0VudGl0eSBjbHMpKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtwcmVkaWNhdGVdIGFwcGxpZXMgdG8gYW55IGxpdmUgY2xhc3MgdGhhdCBleHRlbmQgW2Nsc10KICAvLy8gX25vdF8gaW5jbHVkaW5nIFtjbHNdIGl0c2VsZi4KICBib29sIGFueVN0cmljdFN1YmNsYXNzT2YoQ2xhc3NFbnRpdHkgY2xzLCBib29sIHByZWRpY2F0ZShDbGFzc0VudGl0eSBjbHMpKTsKCiAgLy8vIFJldHVybnMgYW4gaXRlcmFibGUgb3ZlciB0aGUgZGlyZWN0bHkgaW5zdGFudGlhdGVkIHRoYXQgaW1wbGVtZW50IFtjbHNdCiAgLy8vIHBvc3NpYmx5IGluY2x1ZGluZyBbY2xzXSBpdHNlbGYsIGlmIGl0IGlzIGxpdmUuCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IHN1YnR5cGVzT2YoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYW4gaXRlcmFibGUgb3ZlciB0aGUgZGlyZWN0bHkgaW5zdGFudGlhdGVkIHRoYXQgaW1wbGVtZW50IFtjbHNdCiAgLy8vIF9ub3RfIGluY2x1ZGluZyBbY2xzXS4KICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gc3RyaWN0U3VidHlwZXNPZihDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGxpdmUgY2xhc3NlcyB0aGF0IGltcGxlbWVudCBbY2xzXSBfbm90XwogIC8vLyBpbmNsdWRpbmcgW2Nsc10gaXRzZWxmLgogIGludCBzdHJpY3RTdWJ0eXBlQ291bnQoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIEFwcGxpZXMgW2ZdIHRvIGVhY2ggbGl2ZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgW2Nsc10gX25vdF8gaW5jbHVkaW5nIFtjbHNdCiAgLy8vIGl0c2VsZi4KICB2b2lkIGZvckVhY2hTdHJpY3RTdWJ0eXBlT2YoCiAgICAgIENsYXNzRW50aXR5IGNscywgSXRlcmF0aW9uU3RlcCBmKENsYXNzRW50aXR5IGNscykpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW3ByZWRpY2F0ZV0gYXBwbGllcyB0byBhbnkgbGl2ZSBjbGFzcyB0aGF0IGltcGxlbWVudHMKICAvLy8gW2Nsc10gX25vdF8gaW5jbHVkaW5nIFtjbHNdIGl0c2VsZi4KICBib29sIGFueVN0cmljdFN1YnR5cGVPZihDbGFzc0VudGl0eSBjbHMsIGJvb2wgcHJlZGljYXRlKENsYXNzRW50aXR5IGNscykpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2FdIGFuZCBbYl0gaGF2ZSBhbnkga25vd24gY29tbW9uIHN1YnR5cGVzLgogIGJvb2wgaGF2ZUFueUNvbW1vblN1YnR5cGVzKENsYXNzRW50aXR5IGEsIENsYXNzRW50aXR5IGIpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGRpcmVjdGx5IGluc3RhbnRpYXRlZCBjbGFzcyBvdGhlciB0aGFuIFtjbHNdIGV4dGVuZHMKICAvLy8gW2Nsc10uCiAgYm9vbCBoYXNBbnlTdHJpY3RTdWJjbGFzcyhDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGRpcmVjdGx5IGluc3RhbnRpYXRlZCBjbGFzcyBvdGhlciB0aGFuIFtjbHNdCiAgLy8vIGltcGxlbWVudHMgW2Nsc10uCiAgYm9vbCBoYXNBbnlTdHJpY3RTdWJ0eXBlKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZGlyZWN0bHkgaW5zdGFudGlhdGVkIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgW2Nsc10KICAvLy8gZXh0ZW5kIGl0LgogIGJvb2wgaGFzT25seVN1YmNsYXNzZXMoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYSBbU3ViY2xhc3NSZXN1bHRdIGZvciB0aGUgc3ViY2xhc3NlcyB0aGF0IGFyZSBjb250YWluZWQgaW4KICAvLy8gdGhlIHN1YmNsYXNzL3N1YnR5cGUgc2V0cyBvZiBib3RoIFtjbHMxXSBhbmQgW2NsczJdLgogIC8vLwogIC8vLyBDbGFzc2VzIHRoYXQgYXJlIGltcGxpZWQgYnkgaW5jbHVkZWQgc3VwZXJjbGFzc2VzL3N1cGVydHlwZXMgYXJlIG5vdAogIC8vLyByZXR1cm5lZC4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlIGZvciB0aGlzIGhpZXJhcmNoeQogIC8vLwogIC8vLyAgICAgY2xhc3MgQSB7fQogIC8vLyAgICAgY2xhc3MgQiB7fQogIC8vLyAgICAgY2xhc3MgQyBpbXBsZW1lbnRzIEEsIEIge30KICAvLy8gICAgIGNsYXNzIEQgZXh0ZW5kcyBDIHt9CiAgLy8vCiAgLy8vIHRoZSBxdWVyeQogIC8vLwogIC8vLyAgICAgY29tbW9uU3ViY2xhc3NlcyhBLCBDbGFzc1F1ZXJ5LlNVQlRZUEUsIEIsIENsYXNzUXVlcnkuU1VCVFlQRSkKICAvLy8KICAvLy8gcmV0dXJuIHRoZSBzZXQge0N9IGJlY2F1c2UgW0RdIGlzIGltcGxpZWQgYnkgW0NdLgogIFN1YmNsYXNzUmVzdWx0IGNvbW1vblN1YmNsYXNzZXMoCiAgICAgIENsYXNzRW50aXR5IGNsczEsIENsYXNzUXVlcnkgcXVlcnkxLCBDbGFzc0VudGl0eSBjbHMyLCBDbGFzc1F1ZXJ5IHF1ZXJ5Mik7CgogIC8vLyBSZXR1cm5zIFtDbGFzc0hpZXJhcmNoeU5vZGVdIGZvciBbY2xzXSB1c2VkIHRvIG1vZGVsIHRoZSBjbGFzcyBoaWVyYXJjaGllcwogIC8vLyBvZiBrbm93biBjbGFzc2VzLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBpcyBvbmx5IHByb3ZpZGVkIGZvciB0ZXN0aW5nLiBGb3IgcXVlcmllcyBvbiBjbGFzc2VzLCB1c2UgdGhlCiAgLy8vIG1ldGhvZHMgZGVmaW5lZCBpbiBbSkNsb3NlZFdvcmxkXS4KICBDbGFzc0hpZXJhcmNoeU5vZGUgZ2V0Q2xhc3NIaWVyYXJjaHlOb2RlKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIFtDbGFzc1NldF0gZm9yIFtjbHNdIHVzZWQgdG8gbW9kZWwgdGhlIGV4dGVuZHMgYW5kIGltcGxlbWVudHMKICAvLy8gcmVsYXRpb25zIG9mIGtub3duIGNsYXNzZXMuCiAgLy8vCiAgLy8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgcHJvdmlkZWQgZm9yIHRlc3RpbmcuIEZvciBxdWVyaWVzIG9uIGNsYXNzZXMsIHVzZSB0aGUKICAvLy8gbWV0aG9kcyBkZWZpbmVkIGluIFtKQ2xvc2VkV29ybGRdLgogIENsYXNzU2V0IGdldENsYXNzU2V0KENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjbG9zZWQgd29ybGQuCiAgLy8vCiAgLy8vIElmIFtjbHNdIGlzIHByb3ZpZGVkLCB0aGUgZHVtcCB3aWxsIGNvbnRhaW4gb25seSBjbGFzc2VzIHJlbGF0ZWQgdG8gW2Nsc10uCiAgU3RyaW5nIGR1bXAoW0NsYXNzRW50aXR5IGNsc10pOwp9CgpjbGFzcyBDbGFzc0hpZXJhcmNoeUltcGwgaW1wbGVtZW50cyBDbGFzc0hpZXJhcmNoeSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtDbGFzc0hpZXJhcmNoeV0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdjbGFzcy1oaWVyYXJjaHknOwoKICBmaW5hbCBDb21tb25FbGVtZW50cyBfY29tbW9uRWxlbWVudHM7CiAgZmluYWwgTWFwPENsYXNzRW50aXR5LCBDbGFzc0hpZXJhcmNoeU5vZGU+IF9jbGFzc0hpZXJhcmNoeU5vZGVzOwogIGZpbmFsIE1hcDxDbGFzc0VudGl0eSwgQ2xhc3NTZXQ+IF9jbGFzc1NldHM7CgogIENsYXNzSGllcmFyY2h5SW1wbCgKICAgICAgdGhpcy5fY29tbW9uRWxlbWVudHMsIHRoaXMuX2NsYXNzSGllcmFyY2h5Tm9kZXMsIHRoaXMuX2NsYXNzU2V0cyk7CgogIGZhY3RvcnkgQ2xhc3NIaWVyYXJjaHlJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgRGF0YVNvdXJjZSBzb3VyY2UsIENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIE1hcDxDbGFzc0VudGl0eSwgQ2xhc3NIaWVyYXJjaHlOb2RlPiBjbGFzc0hpZXJhcmNoeU5vZGVzID0KICAgICAgICBuZXcgQ2xhc3NIaWVyYXJjaHlOb2Rlc01hcCgpOwogICAgaW50IGNsYXNzQ291bnQgPSBzb3VyY2UucmVhZEludCgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc0NvdW50OyBpKyspIHsKICAgICAgQ2xhc3NIaWVyYXJjaHlOb2RlIG5vZGUgPSBuZXcgQ2xhc3NIaWVyYXJjaHlOb2RlLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgICAgIHNvdXJjZSwgY2xhc3NIaWVyYXJjaHlOb2Rlcyk7CiAgICAgIGNsYXNzSGllcmFyY2h5Tm9kZXNbbm9kZS5jbHNdID0gbm9kZTsKICAgIH0KICAgIE1hcDxDbGFzc0VudGl0eSwgQ2xhc3NTZXQ+IGNsYXNzU2V0cyA9IHt9OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc0NvdW50OyBpKyspIHsKICAgICAgQ2xhc3NTZXQgY2xhc3NTZXQgPQogICAgICAgICAgbmV3IENsYXNzU2V0LnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UsIGNsYXNzSGllcmFyY2h5Tm9kZXMpOwogICAgICBjbGFzc1NldHNbY2xhc3NTZXQuY2xzXSA9IGNsYXNzU2V0OwogICAgfQoKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgQ2xhc3NIaWVyYXJjaHlJbXBsKAogICAgICAgIGNvbW1vbkVsZW1lbnRzLCBjbGFzc0hpZXJhcmNoeU5vZGVzLCBjbGFzc1NldHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUludChfY2xhc3NTZXRzLmxlbmd0aCk7CiAgICBDbGFzc0hpZXJhcmNoeU5vZGUgbm9kZSA9CiAgICAgICAgZ2V0Q2xhc3NIaWVyYXJjaHlOb2RlKF9jb21tb25FbGVtZW50cy5vYmplY3RDbGFzcyk7CiAgICBub2RlLmZvckVhY2hTdWJjbGFzcygoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICAgIGdldENsYXNzSGllcmFyY2h5Tm9kZShjbHMpLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIH0sIENsYXNzSGllcmFyY2h5Tm9kZS5BTEwpOwogICAgQ2xhc3NTZXQgc2V0ID0gZ2V0Q2xhc3NTZXQoX2NvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKTsKICAgIHNldC5mb3JFYWNoU3ViY2xhc3MoKENsYXNzRW50aXR5IGNscykgewogICAgICBnZXRDbGFzc1NldChjbHMpLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIH0sIENsYXNzSGllcmFyY2h5Tm9kZS5BTEwpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNJbnN0YW50aWF0ZWQoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICBDbGFzc0hpZXJhcmNoeU5vZGUgbm9kZSA9IF9jbGFzc0hpZXJhcmNoeU5vZGVzW2Nsc107CiAgICByZXR1cm4gbm9kZSAhPSBudWxsICYmIG5vZGUuaXNJbnN0YW50aWF0ZWQ7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzRGlyZWN0bHlJbnN0YW50aWF0ZWQoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICBDbGFzc0hpZXJhcmNoeU5vZGUgbm9kZSA9IF9jbGFzc0hpZXJhcmNoeU5vZGVzW2Nsc107CiAgICByZXR1cm4gbm9kZSAhPSBudWxsICYmIG5vZGUuaXNEaXJlY3RseUluc3RhbnRpYXRlZDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNBYnN0cmFjdGx5SW5zdGFudGlhdGVkKENsYXNzRW50aXR5IGNscykgewogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIG5vZGUgPSBfY2xhc3NIaWVyYXJjaHlOb2Rlc1tjbHNdOwogICAgcmV0dXJuIG5vZGUgIT0gbnVsbCAmJiBub2RlLmlzQWJzdHJhY3RseUluc3RhbnRpYXRlZDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNFeHBsaWNpdGx5SW5zdGFudGlhdGVkKENsYXNzRW50aXR5IGNscykgewogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIG5vZGUgPSBfY2xhc3NIaWVyYXJjaHlOb2Rlc1tjbHNdOwogICAgcmV0dXJuIG5vZGUgIT0gbnVsbCAmJiBub2RlLmlzRXhwbGljaXRseUluc3RhbnRpYXRlZDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNJbmRpcmVjdGx5SW5zdGFudGlhdGVkKENsYXNzRW50aXR5IGNscykgewogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIG5vZGUgPSBfY2xhc3NIaWVyYXJjaHlOb2Rlc1tjbHNdOwogICAgcmV0dXJuIG5vZGUgIT0gbnVsbCAmJiBub2RlLmlzSW5kaXJlY3RseUluc3RhbnRpYXRlZDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNTdWJ0eXBlT2YoQ2xhc3NFbnRpdHkgeCwgQ2xhc3NFbnRpdHkgeSkgewogICAgQ2xhc3NTZXQgY2xhc3NTZXQgPSBfY2xhc3NTZXRzW3ldOwogICAgYXNzZXJ0KAogICAgICAgIGNsYXNzU2V0ICE9IG51bGwsCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIHksCiAgICAgICAgICAgICJObyBDbGFzc1NldCBmb3IgJHkgKCR7eS5ydW50aW1lVHlwZX0pOiAiCiAgICAgICAgICAgICIke2R1bXAoeSl9IDogJHtfY2xhc3NTZXRzfSIpKTsKICAgIENsYXNzSGllcmFyY2h5Tm9kZSBjbGFzc0hpZXJhcmNoeU5vZGUgPSBfY2xhc3NIaWVyYXJjaHlOb2Rlc1t4XTsKICAgIGFzc2VydChjbGFzc0hpZXJhcmNoeU5vZGUgIT0gbnVsbCwKICAgICAgICBmYWlsZWRBdCh4LCAiTm8gQ2xhc3NIaWVyYXJjaHlOb2RlIGZvciAkeDogJHtkdW1wKHgpfSIpKTsKICAgIHJldHVybiBjbGFzc1NldC5oYXNTdWJ0eXBlKGNsYXNzSGllcmFyY2h5Tm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzU3ViY2xhc3NPZihDbGFzc0VudGl0eSB4LCBDbGFzc0VudGl0eSB5KSB7CiAgICByZXR1cm4gX2NsYXNzSGllcmFyY2h5Tm9kZXNbeV0uaGFzU3ViY2xhc3MoX2NsYXNzSGllcmFyY2h5Tm9kZXNbeF0pOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IHN1YmNsYXNzZXNPZihDbGFzc0VudGl0eSBjbHMpIHsKICAgIENsYXNzSGllcmFyY2h5Tm9kZSBoaWVyYXJjaHkgPSBfY2xhc3NIaWVyYXJjaHlOb2Rlc1tjbHNdOwogICAgaWYgKGhpZXJhcmNoeSA9PSBudWxsKSByZXR1cm4gY29uc3QgPENsYXNzRW50aXR5PltdOwogICAgcmV0dXJuIGhpZXJhcmNoeQogICAgICAgIC5zdWJjbGFzc2VzQnlNYXNrKENsYXNzSGllcmFyY2h5Tm9kZS5FWFBMSUNJVExZX0lOU1RBTlRJQVRFRCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gc3RyaWN0U3ViY2xhc3Nlc09mKENsYXNzRW50aXR5IGNscykgewogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIHN1YmNsYXNzZXMgPSBfY2xhc3NIaWVyYXJjaHlOb2Rlc1tjbHNdOwogICAgaWYgKHN1YmNsYXNzZXMgPT0gbnVsbCkgcmV0dXJuIGNvbnN0IDxDbGFzc0VudGl0eT5bXTsKICAgIHJldHVybiBzdWJjbGFzc2VzLnN1YmNsYXNzZXNCeU1hc2soCiAgICAgICAgQ2xhc3NIaWVyYXJjaHlOb2RlLkVYUExJQ0lUTFlfSU5TVEFOVElBVEVELAogICAgICAgIHN0cmljdDogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgc3RyaWN0U3ViY2xhc3NDb3VudChDbGFzc0VudGl0eSBjbHMpIHsKICAgIENsYXNzSGllcmFyY2h5Tm9kZSBzdWJjbGFzc2VzID0gX2NsYXNzSGllcmFyY2h5Tm9kZXNbY2xzXTsKICAgIGlmIChzdWJjbGFzc2VzID09IG51bGwpIHJldHVybiAwOwogICAgcmV0dXJuIHN1YmNsYXNzZXMuaW5zdGFudGlhdGVkU3ViY2xhc3NDb3VudDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaFN0cmljdFN1YmNsYXNzT2YoCiAgICAgIENsYXNzRW50aXR5IGNscywgSXRlcmF0aW9uU3RlcCBmKENsYXNzRW50aXR5IGNscykpIHsKICAgIENsYXNzSGllcmFyY2h5Tm9kZSBzdWJjbGFzc2VzID0gX2NsYXNzSGllcmFyY2h5Tm9kZXNbY2xzXTsKICAgIGlmIChzdWJjbGFzc2VzID09IG51bGwpIHJldHVybjsKICAgIHN1YmNsYXNzZXMuZm9yRWFjaFN1YmNsYXNzKGYsIENsYXNzSGllcmFyY2h5Tm9kZS5FWFBMSUNJVExZX0lOU1RBTlRJQVRFRCwKICAgICAgICBzdHJpY3Q6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBhbnlTdHJpY3RTdWJjbGFzc09mKENsYXNzRW50aXR5IGNscywgYm9vbCBwcmVkaWNhdGUoQ2xhc3NFbnRpdHkgY2xzKSkgewogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIHN1YmNsYXNzZXMgPSBfY2xhc3NIaWVyYXJjaHlOb2Rlc1tjbHNdOwogICAgaWYgKHN1YmNsYXNzZXMgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHN1YmNsYXNzZXMuYW55U3ViY2xhc3MoCiAgICAgICAgcHJlZGljYXRlLCBDbGFzc0hpZXJhcmNoeU5vZGUuRVhQTElDSVRMWV9JTlNUQU5USUFURUQsCiAgICAgICAgc3RyaWN0OiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBzdWJ0eXBlc09mKENsYXNzRW50aXR5IGNscykgewogICAgQ2xhc3NTZXQgY2xhc3NTZXQgPSBfY2xhc3NTZXRzW2Nsc107CiAgICBpZiAoY2xhc3NTZXQgPT0gbnVsbCkgewogICAgICByZXR1cm4gY29uc3QgPENsYXNzRW50aXR5PltdOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGNsYXNzU2V0CiAgICAgICAgICAuc3VidHlwZXNCeU1hc2soQ2xhc3NIaWVyYXJjaHlOb2RlLkVYUExJQ0lUTFlfSU5TVEFOVElBVEVEKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBzdHJpY3RTdWJ0eXBlc09mKENsYXNzRW50aXR5IGNscykgewogICAgQ2xhc3NTZXQgY2xhc3NTZXQgPSBfY2xhc3NTZXRzW2Nsc107CiAgICBpZiAoY2xhc3NTZXQgPT0gbnVsbCkgewogICAgICByZXR1cm4gY29uc3QgPENsYXNzRW50aXR5PltdOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGNsYXNzU2V0LnN1YnR5cGVzQnlNYXNrKENsYXNzSGllcmFyY2h5Tm9kZS5FWFBMSUNJVExZX0lOU1RBTlRJQVRFRCwKICAgICAgICAgIHN0cmljdDogdHJ1ZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgc3RyaWN0U3VidHlwZUNvdW50KENsYXNzRW50aXR5IGNscykgewogICAgQ2xhc3NTZXQgY2xhc3NTZXQgPSBfY2xhc3NTZXRzW2Nsc107CiAgICBpZiAoY2xhc3NTZXQgPT0gbnVsbCkgcmV0dXJuIDA7CiAgICByZXR1cm4gY2xhc3NTZXQuaW5zdGFudGlhdGVkU3VidHlwZUNvdW50OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoU3RyaWN0U3VidHlwZU9mKAogICAgICBDbGFzc0VudGl0eSBjbHMsIEl0ZXJhdGlvblN0ZXAgZihDbGFzc0VudGl0eSBjbHMpKSB7CiAgICBDbGFzc1NldCBjbGFzc1NldCA9IF9jbGFzc1NldHNbY2xzXTsKICAgIGlmIChjbGFzc1NldCA9PSBudWxsKSByZXR1cm47CiAgICBjbGFzc1NldC5mb3JFYWNoU3VidHlwZShmLCBDbGFzc0hpZXJhcmNoeU5vZGUuRVhQTElDSVRMWV9JTlNUQU5USUFURUQsCiAgICAgICAgc3RyaWN0OiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgYW55U3RyaWN0U3VidHlwZU9mKENsYXNzRW50aXR5IGNscywgYm9vbCBwcmVkaWNhdGUoQ2xhc3NFbnRpdHkgY2xzKSkgewogICAgQ2xhc3NTZXQgY2xhc3NTZXQgPSBfY2xhc3NTZXRzW2Nsc107CiAgICBpZiAoY2xhc3NTZXQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIGNsYXNzU2V0LmFueVN1YnR5cGUoCiAgICAgICAgcHJlZGljYXRlLCBDbGFzc0hpZXJhcmNoeU5vZGUuRVhQTElDSVRMWV9JTlNUQU5USUFURUQsCiAgICAgICAgc3RyaWN0OiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaGF2ZUFueUNvbW1vblN1YnR5cGVzKENsYXNzRW50aXR5IGEsIENsYXNzRW50aXR5IGIpIHsKICAgIENsYXNzU2V0IGNsYXNzU2V0QSA9IF9jbGFzc1NldHNbYV07CiAgICBDbGFzc1NldCBjbGFzc1NldEIgPSBfY2xhc3NTZXRzW2JdOwogICAgaWYgKGNsYXNzU2V0QSA9PSBudWxsIHx8IGNsYXNzU2V0QiA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBJbXBsZW1lbnQgYW4gb3B0aW1pemVkIHF1ZXJ5IG9uIFtDbGFzc1NldF0uCiAgICBTZXQ8Q2xhc3NFbnRpdHk+IHN1YnR5cGVzT2ZCID0gY2xhc3NTZXRCLnN1YnR5cGVzKCkudG9TZXQoKTsKICAgIGZvciAoQ2xhc3NFbnRpdHkgc3VidHlwZU9mQSBpbiBjbGFzc1NldEEuc3VidHlwZXMoKSkgewogICAgICBpZiAoc3VidHlwZXNPZkIuY29udGFpbnMoc3VidHlwZU9mQSkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNBbnlTdHJpY3RTdWJjbGFzcyhDbGFzc0VudGl0eSBjbHMpIHsKICAgIENsYXNzSGllcmFyY2h5Tm9kZSBzdWJjbGFzc2VzID0gX2NsYXNzSGllcmFyY2h5Tm9kZXNbY2xzXTsKICAgIGlmIChzdWJjbGFzc2VzID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBzdWJjbGFzc2VzLmlzSW5kaXJlY3RseUluc3RhbnRpYXRlZDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaGFzQW55U3RyaWN0U3VidHlwZShDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBzdHJpY3RTdWJ0eXBlQ291bnQoY2xzKSA+IDA7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGhhc09ubHlTdWJjbGFzc2VzKENsYXNzRW50aXR5IGNscykgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogbW92ZSB0aGlzIHRvIENsYXNzU2V0PwogICAgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MpIHJldHVybiB0cnVlOwogICAgQ2xhc3NTZXQgY2xhc3NTZXQgPSBfY2xhc3NTZXRzW2Nsc107CiAgICBpZiAoY2xhc3NTZXQgPT0gbnVsbCkgewogICAgICAvLyBWYWN1b3VzbHkgdHJ1ZS4KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gY2xhc3NTZXQuaGFzT25seUluc3RhbnRpYXRlZFN1YmNsYXNzZXM7CiAgfQoKICBAb3ZlcnJpZGUKICBTdWJjbGFzc1Jlc3VsdCBjb21tb25TdWJjbGFzc2VzKENsYXNzRW50aXR5IGNsczEsIENsYXNzUXVlcnkgcXVlcnkxLAogICAgICBDbGFzc0VudGl0eSBjbHMyLCBDbGFzc1F1ZXJ5IHF1ZXJ5MikgewogICAgaWYgKHF1ZXJ5MSA9PSBDbGFzc1F1ZXJ5LkVYQUNUICYmIHF1ZXJ5MiA9PSBDbGFzc1F1ZXJ5LkVYQUNUKSB7CiAgICAgIC8vIEV4YWN0IGNsYXNzZXMgW2NsczFdIGFuZCBbY2xzMl0gbXVzdCBiZSBpZGVudGljYWwgdG8gaGF2ZSBhbnkgY2xhc3NlcwogICAgICAvLyBpbiBjb21tb24uCiAgICAgIGlmIChjbHMxICE9IGNsczIpIHsKICAgICAgICByZXR1cm4gU3ViY2xhc3NSZXN1bHQuRU1QVFk7CiAgICAgIH0KICAgICAgcmV0dXJuIFN1YmNsYXNzUmVzdWx0LkVYQUNUMTsKICAgIH0gZWxzZSBpZiAocXVlcnkxID09IENsYXNzUXVlcnkuRVhBQ1QpIHsKICAgICAgaWYgKHF1ZXJ5MiA9PSBDbGFzc1F1ZXJ5LlNVQkNMQVNTKSB7CiAgICAgICAgLy8gRXhhY3QgW2NsczFdIG11c3QgYmUgYSBzdWJjbGFzcyBvZiBbY2xzMl0gdG8gaGF2ZSBhbnkgY2xhc3NlcyBpbgogICAgICAgIC8vIGNvbW1vbi4KICAgICAgICBpZiAoaXNTdWJjbGFzc09mKGNsczEsIGNsczIpKSB7CiAgICAgICAgICByZXR1cm4gU3ViY2xhc3NSZXN1bHQuRVhBQ1QxOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChxdWVyeTIgPT0gQ2xhc3NRdWVyeS5TVUJUWVBFKSB7CiAgICAgICAgLy8gRXhhY3QgW2NsczFdIG11c3QgYmUgYSBzdWJ0eXBlIG9mIFtjbHMyXSB0byBoYXZlIGFueSBjbGFzc2VzIGluCiAgICAgICAgLy8gY29tbW9uLgogICAgICAgIGlmIChpc1N1YnR5cGVPZihjbHMxLCBjbHMyKSkgewogICAgICAgICAgcmV0dXJuIFN1YmNsYXNzUmVzdWx0LkVYQUNUMTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIFN1YmNsYXNzUmVzdWx0LkVNUFRZOwogICAgfSBlbHNlIGlmIChxdWVyeTIgPT0gQ2xhc3NRdWVyeS5FWEFDVCkgewogICAgICBpZiAocXVlcnkxID09IENsYXNzUXVlcnkuU1VCQ0xBU1MpIHsKICAgICAgICAvLyBFeGFjdCBbY2xzMl0gbXVzdCBiZSBhIHN1YmNsYXNzIG9mIFtjbHMxXSB0byBoYXZlIGFueSBjbGFzc2VzIGluCiAgICAgICAgLy8gY29tbW9uLgogICAgICAgIGlmIChpc1N1YmNsYXNzT2YoY2xzMiwgY2xzMSkpIHsKICAgICAgICAgIHJldHVybiBTdWJjbGFzc1Jlc3VsdC5FWEFDVDI7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHF1ZXJ5MSA9PSBDbGFzc1F1ZXJ5LlNVQlRZUEUpIHsKICAgICAgICAvLyBFeGFjdCBbY2xzMl0gbXVzdCBiZSBhIHN1YnR5cGUgb2YgW2NsczFdIHRvIGhhdmUgYW55IGNsYXNzZXMgaW4KICAgICAgICAvLyBjb21tb24uCiAgICAgICAgaWYgKGlzU3VidHlwZU9mKGNsczIsIGNsczEpKSB7CiAgICAgICAgICByZXR1cm4gU3ViY2xhc3NSZXN1bHQuRVhBQ1QyOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gU3ViY2xhc3NSZXN1bHQuRU1QVFk7CiAgICB9IGVsc2UgaWYgKHF1ZXJ5MSA9PSBDbGFzc1F1ZXJ5LlNVQkNMQVNTICYmIHF1ZXJ5MiA9PSBDbGFzc1F1ZXJ5LlNVQkNMQVNTKSB7CiAgICAgIC8vIFtjbHMxXSBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgW2NsczJdIG9yIHZpY2UgdmVyc2EgdG8gaGF2ZSBhbnkgY2xhc3NlcwogICAgICAvLyBpbiBjb21tb24uCiAgICAgIGlmIChjbHMxID09IGNsczIgfHwgaXNTdWJjbGFzc09mKGNsczEsIGNsczIpKSB7CiAgICAgICAgLy8gVGhlIHN1YmNsYXNzZXMgb2YgW2NsczFdIGFyZSBjb250YWluZWQgd2l0aGluIHRoZSBzdWJjbGFzc2VzIG9mCiAgICAgICAgLy8gW2NsczJdLgogICAgICAgIHJldHVybiBTdWJjbGFzc1Jlc3VsdC5TVUJDTEFTUzE7CiAgICAgIH0gZWxzZSBpZiAoaXNTdWJjbGFzc09mKGNsczIsIGNsczEpKSB7CiAgICAgICAgLy8gVGhlIHN1YmNsYXNzZXMgb2YgW2NsczJdIGFyZSBjb250YWluZWQgd2l0aGluIHRoZSBzdWJjbGFzc2VzIG9mCiAgICAgICAgLy8gW2NsczFdLgogICAgICAgIHJldHVybiBTdWJjbGFzc1Jlc3VsdC5TVUJDTEFTUzI7CiAgICAgIH0KICAgICAgcmV0dXJuIFN1YmNsYXNzUmVzdWx0LkVNUFRZOwogICAgfSBlbHNlIGlmIChxdWVyeTEgPT0gQ2xhc3NRdWVyeS5TVUJDTEFTUykgewogICAgICBpZiAoaXNTdWJ0eXBlT2YoY2xzMSwgY2xzMikpIHsKICAgICAgICAvLyBUaGUgc3ViY2xhc3NlcyBvZiBbY2xzMV0gYXJlIGFsbCBzdWJ0eXBlcyBvZiBbY2xzMl0uCiAgICAgICAgcmV0dXJuIFN1YmNsYXNzUmVzdWx0LlNVQkNMQVNTMTsKICAgICAgfQogICAgICBpZiAoY2xzMSA9PSBfY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MpIHsKICAgICAgICAvLyBTaW5jZSBbY2xzMV0gaXMgYE9iamVjdGAgYWxsIHN1YnR5cGVzIG9mIFtjbHMyXSBhcmUgY29udGFpbmVkIHdpdGhpbgogICAgICAgIC8vIHRoZSBzdWJjbGFzc2VzIG9mIFtjbHMxXS4KICAgICAgICByZXR1cm4gU3ViY2xhc3NSZXN1bHQuU1VCVFlQRTI7CiAgICAgIH0KICAgICAgLy8gRmluZCBhbGwgdGhlIHJvb3Qgc3ViY2xhc3NlcyBvZiBbY2xzMV0gb2YgdGhhdCBpbXBsZW1lbnQgW2NsczJdLgogICAgICAvLwogICAgICAvLyBGb3IgdGhpcyBoaWVyYXJjaHk6CiAgICAgIC8vCiAgICAgIC8vICAgICBjbGFzcyBJIHt9CiAgICAgIC8vICAgICBjbGFzcyBBIHt9CiAgICAgIC8vICAgICBjbGFzcyBCIGV4dGVuZHMgQSBpbXBsZW1lbnRzIEkge30KICAgICAgLy8gICAgIGNsYXNzIEMgZXh0ZW5kcyBCIHt9CiAgICAgIC8vICAgICBjbGFzcyBEIGV4dGVuZHMgQSBpbXBsZW1lbnRzIEkge30KICAgICAgLy8KICAgICAgLy8gdGhlIGNvbW1vbiBzdWJjbGFzc2VzIG9mICJzdWJjbGFzcyBvZiBBIiBhbmQgInN1YnR5cGUgb2YgSSIgcmV0dXJucwogICAgICAvLyAic3ViY2xhc3NlcyBvZiB7QiwgRH0iLiBUaGUgaW5jbHVzaW9uIG9mIGNsYXNzIGBDYCBpcyBpbXBsaWVkIGJlY2F1c2UKICAgICAgLy8gaXQgaXMgYSBzdWJjbGFzcyBvZiBgQmAuCiAgICAgIExpc3Q8Q2xhc3NFbnRpdHk+IGNsYXNzZXMgPSA8Q2xhc3NFbnRpdHk+W107CiAgICAgIGZvckVhY2hTdHJpY3RTdWJjbGFzc09mKGNsczEsIChDbGFzc0VudGl0eSBzdWJjbGFzcykgewogICAgICAgIGlmIChpc1N1YnR5cGVPZihzdWJjbGFzcywgY2xzMikpIHsKICAgICAgICAgIGNsYXNzZXMuYWRkKHN1YmNsYXNzKTsKICAgICAgICAgIC8vIFNraXAgc3ViY2xhc3NlcyBvZiBbc3ViY2xhc3NdOyB0aGV5IGFsbCBpbXBsZW1lbnQgW2NsczJdIGJ5CiAgICAgICAgICAvLyBpbmhlcml0YW5jZSBhbmQgYXJlIGluY2x1ZGVkIGluIHRoZSBzdWJjbGFzc2VzIG9mIFtzdWJjbGFzc10uCiAgICAgICAgICByZXR1cm4gSXRlcmF0aW9uU3RlcC5TS0lQX1NVQkNMQVNTRVM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBJdGVyYXRpb25TdGVwLkNPTlRJTlVFOwogICAgICB9KTsKICAgICAgcmV0dXJuIG5ldyBTdWJjbGFzc1Jlc3VsdChjbGFzc2VzKTsKICAgIH0gZWxzZSBpZiAocXVlcnkyID09IENsYXNzUXVlcnkuU1VCQ0xBU1MpIHsKICAgICAgaWYgKGlzU3VidHlwZU9mKGNsczIsIGNsczEpKSB7CiAgICAgICAgLy8gVGhlIHN1YmNsYXNzZXMgb2YgW2NsczJdIGFyZSBhbGwgc3VidHlwZXMgb2YgW2NsczFdLgogICAgICAgIHJldHVybiBTdWJjbGFzc1Jlc3VsdC5TVUJDTEFTUzI7CiAgICAgIH0KICAgICAgaWYgKGNsczIgPT0gX2NvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKSB7CiAgICAgICAgLy8gU2luY2UgW2NsczJdIGlzIGBPYmplY3RgIGFsbCBzdWJ0eXBlcyBvZiBbY2xzMV0gYXJlIGNvbnRhaW5lZCB3aXRoaW4KICAgICAgICAvLyB0aGUgc3ViY2xhc3NlcyBvZiBbY2xzMl0uCiAgICAgICAgcmV0dXJuIFN1YmNsYXNzUmVzdWx0LlNVQlRZUEUxOwogICAgICB9CiAgICAgIC8vIEZpbmQgYWxsIHRoZSByb290IHN1YmNsYXNzZXMgb2YgW2NsczJdIG9mIHRoYXQgaW1wbGVtZW50IFtjbHMxXS4KICAgICAgTGlzdDxDbGFzc0VudGl0eT4gY2xhc3NlcyA9IDxDbGFzc0VudGl0eT5bXTsKICAgICAgZm9yRWFjaFN0cmljdFN1YmNsYXNzT2YoY2xzMiwgKENsYXNzRW50aXR5IHN1YmNsYXNzKSB7CiAgICAgICAgaWYgKGlzU3VidHlwZU9mKHN1YmNsYXNzLCBjbHMxKSkgewogICAgICAgICAgY2xhc3Nlcy5hZGQoc3ViY2xhc3MpOwogICAgICAgICAgLy8gU2tpcCBzdWJjbGFzc2VzIG9mIFtzdWJjbGFzc107IHRoZXkgYWxsIGltcGxlbWVudCBbY2xzMV0gYnkKICAgICAgICAgIC8vIGluaGVyaXRhbmNlIGFuZCBhcmUgaW5jbHVkZWQgaW4gdGhlIHN1YmNsYXNzZXMgb2YgW3N1YmNsYXNzXS4KICAgICAgICAgIHJldHVybiBJdGVyYXRpb25TdGVwLlNLSVBfU1VCQ0xBU1NFUzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIEl0ZXJhdGlvblN0ZXAuQ09OVElOVUU7CiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3IFN1YmNsYXNzUmVzdWx0KGNsYXNzZXMpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGNsczEgPT0gY2xzMiB8fCBpc1N1YnR5cGVPZihjbHMxLCBjbHMyKSkgewogICAgICAgIC8vIFRoZSBzdWJ0eXBlcyBvZiBbY2xzMV0gYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHN1YnR5cGVzIG9mIFtjbHMyXS4KICAgICAgICByZXR1cm4gU3ViY2xhc3NSZXN1bHQuU1VCVFlQRTE7CiAgICAgIH0gZWxzZSBpZiAoaXNTdWJ0eXBlT2YoY2xzMiwgY2xzMSkpIHsKICAgICAgICAvLyBUaGUgc3VidHlwZXMgb2YgW2NsczJdIGFyZSBjb250YWluZWQgd2l0aGluIHRoZSBzdWJ0eXBlcyBvZiBbY2xzMV0uCiAgICAgICAgcmV0dXJuIFN1YmNsYXNzUmVzdWx0LlNVQlRZUEUyOwogICAgICB9CiAgICAgIC8vIEZpbmQgYWxsIHRoZSByb290IHN1YmNsYXNzZXMgb2YgW2NsczFdIG9mIHRoYXQgaW1wbGVtZW50IFtjbHMyXS4KICAgICAgLy8KICAgICAgLy8gRm9yIHRoaXMgaGllcmFyY2h5OgogICAgICAvLwogICAgICAvLyAgICAgY2xhc3MgSSB7fQogICAgICAvLyAgICAgY2xhc3MgQSB7fQogICAgICAvLyAgICAgY2xhc3MgQiBleHRlbmRzIEEgaW1wbGVtZW50cyBJIHt9CiAgICAgIC8vICAgICBjbGFzcyBDIGV4dGVuZHMgQiB7fQogICAgICAvLyAgICAgY2xhc3MgRCBleHRlbmRzIEEgaW1wbGVtZW50cyBJIHt9CiAgICAgIC8vICAgICBjbGFzcyBFIGltcGxlbWVudHMgQiB7fQogICAgICAvLyAgICAgY2xhc3MgRiBleHRlbmRzIEUge30KICAgICAgLy8KICAgICAgLy8gdGhlIGNvbW1vbiBzdWJjbGFzc2VzIG9mICJzdWJ0eXBlIG9mIEEiIGFuZCAic3VidHlwZSBvZiBJIiByZXR1cm5zCiAgICAgIC8vICJzdWJjbGFzc2VzIG9mIHtCLCBELCBFfSIuIFRoZSBpbmNsdXNpb24gb2YgY2xhc3NlcyBgQ2AgYW5kIGBGYCBpcwogICAgICAvLyBpbXBsaWVkIGJlY2F1c2UgdGhleSBhcmUgc3ViY2xhc3NlcyBvZiBgQmAgYW5kIGBFYCwgcmVzcGVjdGl2ZWx5LgogICAgICBMaXN0PENsYXNzRW50aXR5PiBjbGFzc2VzID0gPENsYXNzRW50aXR5PltdOwogICAgICBmb3JFYWNoU3RyaWN0U3VidHlwZU9mKGNsczEsIChDbGFzc0VudGl0eSBzdWJjbGFzcykgewogICAgICAgIGlmIChpc1N1YnR5cGVPZihzdWJjbGFzcywgY2xzMikpIHsKICAgICAgICAgIGNsYXNzZXMuYWRkKHN1YmNsYXNzKTsKICAgICAgICAgIC8vIFNraXAgc3ViY2xhc3NlcyBvZiBbc3ViY2xhc3NdOyB0aGV5IGFsbCBpbXBsZW1lbnQgW2NsczJdIGJ5CiAgICAgICAgICAvLyBpbmhlcml0YW5jZSBhbmQgYXJlIGluY2x1ZGVkIGluIHRoZSBzdWJjbGFzc2VzIG9mIFtzdWJjbGFzc10uCiAgICAgICAgICByZXR1cm4gSXRlcmF0aW9uU3RlcC5TS0lQX1NVQkNMQVNTRVM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBJdGVyYXRpb25TdGVwLkNPTlRJTlVFOwogICAgICB9KTsKICAgICAgcmV0dXJuIG5ldyBTdWJjbGFzc1Jlc3VsdChjbGFzc2VzKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIENsYXNzSGllcmFyY2h5Tm9kZSBnZXRDbGFzc0hpZXJhcmNoeU5vZGUoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gX2NsYXNzSGllcmFyY2h5Tm9kZXNbY2xzXTsKICB9CgogIEBvdmVycmlkZQogIENsYXNzU2V0IGdldENsYXNzU2V0KENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIF9jbGFzc1NldHNbY2xzXTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBkdW1wKFtDbGFzc0VudGl0eSBjbHNdKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBpZiAoY2xzICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoIkNsYXNzZXMgaW4gdGhlIGNsb3NlZCB3b3JsZCByZWxhdGVkIHRvICRjbHM6XG4iKTsKICAgIH0gZWxzZSB7CiAgICAgIHNiLndyaXRlKCJJbnN0YW50aWF0ZWQgY2xhc3NlcyBpbiB0aGUgY2xvc2VkIHdvcmxkOlxuIik7CiAgICB9CiAgICBnZXRDbGFzc0hpZXJhcmNoeU5vZGUoX2NvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKQogICAgICAgIC5wcmludE9uKHNiLCAnICcsIGluc3RhbnRpYXRlZE9ubHk6IGNscyA9PSBudWxsLCB3aXRoUmVzcGVjdFRvOiBjbHMpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgpjbGFzcyBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgewogIC8vIFdlIGtlZXAgdHJhY2sgb2Ygc3VidHlwZSBhbmQgc3ViY2xhc3MgcmVsYXRpb25zaGlwcyBpbiBmb3VyCiAgLy8gZGlzdGluY3Qgc2V0cyB0byBtYWtlIGNsYXNzIGhpZXJhcmNoeSBhbmFseXNpcyBmYXN0ZXIuCiAgZmluYWwgTWFwPENsYXNzRW50aXR5LCBDbGFzc0hpZXJhcmNoeU5vZGU+IF9jbGFzc0hpZXJhcmNoeU5vZGVzID0KICAgICAgPENsYXNzRW50aXR5LCBDbGFzc0hpZXJhcmNoeU5vZGU+e307CiAgZmluYWwgTWFwPENsYXNzRW50aXR5LCBDbGFzc1NldD4gX2NsYXNzU2V0cyA9IDxDbGFzc0VudGl0eSwgQ2xhc3NTZXQ+e307CiAgZmluYWwgTWFwPENsYXNzRW50aXR5LCBTZXQ8Q2xhc3NFbnRpdHk+PiBtaXhpblVzZXMgPQogICAgICBuZXcgTWFwPENsYXNzRW50aXR5LCBTZXQ8Q2xhc3NFbnRpdHk+PigpOwoKICBmaW5hbCBDb21tb25FbGVtZW50cyBfY29tbW9uRWxlbWVudHM7CiAgZmluYWwgQ2xhc3NRdWVyaWVzIF9jbGFzc1F1ZXJpZXM7CgogIENsYXNzSGllcmFyY2h5QnVpbGRlcih0aGlzLl9jb21tb25FbGVtZW50cywgdGhpcy5fY2xhc3NRdWVyaWVzKTsKCiAgQ2xhc3NIaWVyYXJjaHkgY2xvc2UoKSB7CiAgICBhc3NlcnQoCiAgICAgICAgX2NsYXNzSGllcmFyY2h5Tm9kZXMubGVuZ3RoID09IF9jbGFzc1NldHMubGVuZ3RoLAogICAgICAgICJDbGFzc0hpZXJhcmNoeU5vZGUvQ2xhc3NTZXQgbWlzbWF0Y2g6ICIKICAgICAgICAiJHtfY2xhc3NIaWVyYXJjaHlOb2Rlc30gdnMgIgogICAgICAgICIke19jbGFzc1NldHN9Iik7CiAgICByZXR1cm4gbmV3IENsYXNzSGllcmFyY2h5SW1wbCgKICAgICAgICBfY29tbW9uRWxlbWVudHMsIF9jbGFzc0hpZXJhcmNoeU5vZGVzLCBfY2xhc3NTZXRzKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJDbGFzcyhDbGFzc0VudGl0eSBjbHMpIHsKICAgIF9lbnN1cmVDbGFzc1NldChfY2xhc3NRdWVyaWVzLmdldERlY2xhcmF0aW9uKGNscykpOwogIH0KCiAgQ2xhc3NIaWVyYXJjaHlOb2RlIF9lbnN1cmVDbGFzc0hpZXJhcmNoeU5vZGUoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gX2NsYXNzSGllcmFyY2h5Tm9kZXMucHV0SWZBYnNlbnQoY2xzLCAoKSB7CiAgICAgIENsYXNzSGllcmFyY2h5Tm9kZSBwYXJlbnROb2RlOwogICAgICBDbGFzc0VudGl0eSBzdXBlcmNsYXNzID0gX2NsYXNzUXVlcmllcy5nZXRTdXBlckNsYXNzKGNscyk7CiAgICAgIGlmIChzdXBlcmNsYXNzICE9IG51bGwpIHsKICAgICAgICBwYXJlbnROb2RlID0gX2Vuc3VyZUNsYXNzSGllcmFyY2h5Tm9kZShzdXBlcmNsYXNzKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IENsYXNzSGllcmFyY2h5Tm9kZSgKICAgICAgICAgIHBhcmVudE5vZGUsIGNscywgX2NsYXNzUXVlcmllcy5nZXRIaWVyYXJjaHlEZXB0aChjbHMpKTsKICAgIH0pOwogIH0KCiAgQ2xhc3NTZXQgX2Vuc3VyZUNsYXNzU2V0KENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIF9jbGFzc1NldHMucHV0SWZBYnNlbnQoY2xzLCAoKSB7CiAgICAgIENsYXNzSGllcmFyY2h5Tm9kZSBub2RlID0gX2Vuc3VyZUNsYXNzSGllcmFyY2h5Tm9kZShjbHMpOwogICAgICBDbGFzc1NldCBjbGFzc1NldCA9IG5ldyBDbGFzc1NldChub2RlKTsKCiAgICAgIGZvciAoSW50ZXJmYWNlVHlwZSB0eXBlIGluIF9jbGFzc1F1ZXJpZXMuZ2V0U3VwZXJ0eXBlcyhjbHMpKSB7CiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogT3B0aW1pemF0aW9uOiBBdm9pZCBhZGRpbmcgW2Nsc10gdG8KICAgICAgICAvLyBzdXBlcmNsYXNzZXMuCiAgICAgICAgQ2xhc3NTZXQgc3VidHlwZVNldCA9IF9lbnN1cmVDbGFzc1NldCh0eXBlLmVsZW1lbnQpOwogICAgICAgIHN1YnR5cGVTZXQuYWRkU3VidHlwZShub2RlKTsKICAgICAgfQoKICAgICAgQ2xhc3NFbnRpdHkgYXBwbGllZE1peGluID0gX2NsYXNzUXVlcmllcy5nZXRBcHBsaWVkTWl4aW4oY2xzKTsKICAgICAgd2hpbGUgKGFwcGxpZWRNaXhpbiAhPSBudWxsKSB7CiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVXNlIHRoZSBkYXRhIHN0b3JlZCBpbiBbQ2xhc3NTZXRdLgogICAgICAgIHJlZ2lzdGVyTWl4aW5Vc2UoY2xzLCBhcHBsaWVkTWl4aW4pOwogICAgICAgIENsYXNzU2V0IG1peGluU2V0ID0gX2Vuc3VyZUNsYXNzU2V0KGFwcGxpZWRNaXhpbik7CiAgICAgICAgbWl4aW5TZXQuYWRkTWl4aW5BcHBsaWNhdGlvbihub2RlKTsKCiAgICAgICAgLy8gSW4gY2FzZSBvZgogICAgICAgIC8vCiAgICAgICAgLy8gICAgY2xhc3MgQSB7fQogICAgICAgIC8vICAgIGNsYXNzIEIgPSBPYmplY3Qgd2l0aCBBOwogICAgICAgIC8vICAgIGNsYXNzIEMgPSBPYmplY3Qgd2l0aCBCOwogICAgICAgIC8vCiAgICAgICAgLy8gd2UgbmVlZCB0byByZWdpc3RlciB0aGF0IEMgbm90IG9ubHkgbWl4ZXMgaW4gQiBidXQgYWxzbyBBLgogICAgICAgIGFwcGxpZWRNaXhpbiA9IF9jbGFzc1F1ZXJpZXMuZ2V0QXBwbGllZE1peGluKGFwcGxpZWRNaXhpbik7CiAgICAgIH0KICAgICAgcmV0dXJuIGNsYXNzU2V0OwogICAgfSk7CiAgfQoKICB2b2lkIF91cGRhdGVTdXBlckNsYXNzSGllcmFyY2h5Tm9kZUZvckNsYXNzKENsYXNzSGllcmFyY2h5Tm9kZSBub2RlKSB7CiAgICAvLyBFbnN1cmUgdGhhdCBjbGFzc2VzIGltcGxpY2l0bHkgaW1wbGVtZW50aW5nIGBGdW5jdGlvbmAgYXJlIGluIGl0cwogICAgLy8gc3VidHlwZSBzZXQuCiAgICBDbGFzc0VudGl0eSBjbHMgPSBub2RlLmNsczsKICAgIGlmIChjbHMgIT0gX2NvbW1vbkVsZW1lbnRzLmZ1bmN0aW9uQ2xhc3MgJiYKICAgICAgICBfY2xhc3NRdWVyaWVzLmltcGxlbWVudHNGdW5jdGlvbihjbHMpKSB7CiAgICAgIENsYXNzU2V0IHN1YnR5cGVTZXQgPSBfZW5zdXJlQ2xhc3NTZXQoX2NvbW1vbkVsZW1lbnRzLmZ1bmN0aW9uQ2xhc3MpOwogICAgICBzdWJ0eXBlU2V0LmFkZFN1YnR5cGUobm9kZSk7CiAgICB9CiAgICBpZiAoIW5vZGUuaXNJbnN0YW50aWF0ZWQgJiYgbm9kZS5wYXJlbnROb2RlICE9IG51bGwpIHsKICAgICAgX3VwZGF0ZVN1cGVyQ2xhc3NIaWVyYXJjaHlOb2RlRm9yQ2xhc3Mobm9kZS5wYXJlbnROb2RlKTsKICAgIH0KICB9CgogIHZvaWQgdXBkYXRlQ2xhc3NIaWVyYXJjaHlOb2RlRm9yQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzLAogICAgICB7Ym9vbCBkaXJlY3RseUluc3RhbnRpYXRlZDogZmFsc2UsIGJvb2wgYWJzdHJhY3RseUluc3RhbnRpYXRlZDogZmFsc2V9KSB7CiAgICBDbGFzc0hpZXJhcmNoeU5vZGUgbm9kZSA9IF9lbnN1cmVDbGFzc1NldChjbHMpLm5vZGU7CiAgICBfdXBkYXRlU3VwZXJDbGFzc0hpZXJhcmNoeU5vZGVGb3JDbGFzcyhub2RlKTsKICAgIGlmIChkaXJlY3RseUluc3RhbnRpYXRlZCkgewogICAgICBub2RlLmlzRGlyZWN0bHlJbnN0YW50aWF0ZWQgPSB0cnVlOwogICAgfQogICAgaWYgKGFic3RyYWN0bHlJbnN0YW50aWF0ZWQpIHsKICAgICAgbm9kZS5pc0Fic3RyYWN0bHlJbnN0YW50aWF0ZWQgPSB0cnVlOwogICAgfQogIH0KCiAgdm9pZCByZWdpc3Rlck1peGluVXNlKENsYXNzRW50aXR5IG1peGluQXBwbGljYXRpb24sIENsYXNzRW50aXR5IG1peGluKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBZGQgbWFwIHJlc3RyaWN0ZWQgdG8gbGl2ZSBjbGFzc2VzLgogICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBwYXRjaCBjbGFzc2VzIGFzIG1peGluLgogICAgU2V0PENsYXNzRW50aXR5PiB1c2VycyA9CiAgICAgICAgbWl4aW5Vc2VzLnB1dElmQWJzZW50KG1peGluLCAoKSA9PiBuZXcgU2V0PENsYXNzRW50aXR5PigpKTsKICAgIHVzZXJzLmFkZChtaXhpbkFwcGxpY2F0aW9uKTsKICB9CgogIGJvb2wgX2lzU3VidHlwZU9mKENsYXNzRW50aXR5IHgsIENsYXNzRW50aXR5IHkpIHsKICAgIGFzc2VydChfY2xhc3NTZXRzLmNvbnRhaW5zS2V5KHgpLAogICAgICAgICJDbGFzc1NldCBmb3IgJHggaGFzIG5vdCBiZWVuIGNvbXB1dGVkIHlldC4iKTsKICAgIENsYXNzU2V0IGNsYXNzU2V0ID0gX2NsYXNzU2V0c1t5XTsKICAgIGFzc2VydChjbGFzc1NldCAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KHksICJObyBDbGFzc1NldCBmb3IgJHkgKCR7eS5ydW50aW1lVHlwZX0pOiAke19jbGFzc1NldHN9IikpOwogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIGNsYXNzSGllcmFyY2h5Tm9kZSA9IF9jbGFzc0hpZXJhcmNoeU5vZGVzW3hdOwogICAgYXNzZXJ0KGNsYXNzSGllcmFyY2h5Tm9kZSAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KHgsICJObyBDbGFzc0hpZXJhcmNoeU5vZGUgZm9yICR4IikpOwogICAgcmV0dXJuIGNsYXNzU2V0Lmhhc1N1YnR5cGUoY2xhc3NIaWVyYXJjaHlOb2RlKTsKICB9CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBhIGR5bmFtaWMgYWNjZXNzIG9uIGFuIGluc3RhbmNlIG9mIFtleGFjdENsYXNzXSBjYW4KICAvLy8gdGFyZ2V0IGEgbWVtYmVyIGRlY2xhcmVkIGluIFttZW1iZXJIb2xkaW5nQ2xhc3NdLgogIGJvb2wgaXNJbmhlcml0ZWRJbkV4YWN0Q2xhc3MoCiAgICAgIENsYXNzRW50aXR5IG1lbWJlckhvbGRpbmdDbGFzcywgQ2xhc3NFbnRpdHkgZXhhY3RDbGFzcykgewogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIGV4YWN0Q2xhc3NOb2RlID0gX2NsYXNzSGllcmFyY2h5Tm9kZXNbZXhhY3RDbGFzc107CiAgICBpZiAoIWV4YWN0Q2xhc3NOb2RlLmlzQWJzdHJhY3RseUluc3RhbnRpYXRlZCAmJgogICAgICAgICFleGFjdENsYXNzTm9kZS5pc0RpcmVjdGx5SW5zdGFudGlhdGVkKSB7CiAgICAgIC8vIE5vIGluc3RhbmNlcyBvZiBbdGhpc0NsYXNzXSBhcmUgbGl2ZS4KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgQ2xhc3NTZXQgbWVtYmVySG9sZGluZ0NsYXNzU2V0ID0gX2NsYXNzU2V0c1ttZW1iZXJIb2xkaW5nQ2xhc3NdOwogICAgaWYgKG1lbWJlckhvbGRpbmdDbGFzc1NldC5oYXNTdWJjbGFzcyhleGFjdENsYXNzTm9kZSkpIHsKICAgICAgLy8vIEEgbWVtYmVyIGZyb20gYSBzdXBlciBjbGFzcyBjYW4gYmUgYWNjZXNzZWQuCiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZm9yIChDbGFzc0hpZXJhcmNoeU5vZGUgbWl4aW5BcHBsaWNhdGlvbgogICAgICAgIGluIG1lbWJlckhvbGRpbmdDbGFzc1NldC5taXhpbkFwcGxpY2F0aW9uTm9kZXMpIHsKICAgICAgaWYgKG1peGluQXBwbGljYXRpb24uaGFzU3ViY2xhc3MoZXhhY3RDbGFzc05vZGUpKSB7CiAgICAgICAgLy8vIEEgbWVtYmVyIGZyb20gYSBtaXhlZCBpbiBjbGFzcyBjYW4gYmUgYWNjZXNzZWQuCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIE1hcDxDbGFzc0VudGl0eSwgX0luaGVyaXRlZEluVGhpc0NsYXNzQ2FjaGU+IF9pbmhlcml0ZWRJblRoaXNDbGFzc0NhY2hlTWFwID0KICAgICAge307CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBhIGB0aGlzYCBleHByZXNzaW9uIGluIFt0aGlzQ2xhc3NdIGNhbiB0YXJnZXQgYSBtZW1iZXIKICAvLy8gZGVjbGFyZWQgaW4gW21lbWJlckhvbGRpbmdDbGFzc10uCiAgYm9vbCBpc0luaGVyaXRlZEluVGhpc0NsYXNzKAogICAgICBDbGFzc0VudGl0eSBtZW1iZXJIb2xkaW5nQ2xhc3MsIENsYXNzRW50aXR5IHRoaXNDbGFzcykgewogICAgX0luaGVyaXRlZEluVGhpc0NsYXNzQ2FjaGUgY2FjaGUgPQogICAgICAgIF9pbmhlcml0ZWRJblRoaXNDbGFzc0NhY2hlTWFwW21lbWJlckhvbGRpbmdDbGFzc10gPz89CiAgICAgICAgICAgIG5ldyBfSW5oZXJpdGVkSW5UaGlzQ2xhc3NDYWNoZSgpOwogICAgcmV0dXJuIGNhY2hlLmlzSW5oZXJpdGVkSW5UaGlzQ2xhc3NPZih0aGlzLCBtZW1iZXJIb2xkaW5nQ2xhc3MsIHRoaXNDbGFzcyk7CiAgfQoKICBNYXA8Q2xhc3NFbnRpdHksIF9Jbmhlcml0ZWRJblN1YnR5cGVDYWNoZT4gX2luaGVyaXRlZEluU3VidHlwZUNhY2hlTWFwID0ge307CgogIGJvb2wgaXNJbmhlcml0ZWRJblN1YnR5cGVPZihDbGFzc0VudGl0eSB4LCBDbGFzc0VudGl0eSB5KSB7CiAgICBfSW5oZXJpdGVkSW5TdWJ0eXBlQ2FjaGUgY2FjaGUgPQogICAgICAgIF9pbmhlcml0ZWRJblN1YnR5cGVDYWNoZU1hcFt4XSA/Pz0gbmV3IF9Jbmhlcml0ZWRJblN1YnR5cGVDYWNoZSgpOwogICAgcmV0dXJuIGNhY2hlLmlzSW5oZXJpdGVkSW5TdWJ0eXBlT2YodGhpcywgeCwgeSk7CiAgfQp9CgovLy8gQ2FjaGUgdXNlZCBmb3IgY29tcHV0aW5nIHdoZW4gYSBtZW1iZXIgb2YgYSBnaXZlbiBjbGFzcywgdGhlIHNvLWNhbGxlZAovLy8gbWVtYmVyIGhvbGRpbmcgY2xhc3MsIGNhbiBiZSBpbmhlcml0ZWQgaW50byBhIGxpdmUgY2xhc3MuCmNsYXNzIF9Jbmhlcml0ZWRJblRoaXNDbGFzc0NhY2hlIHsKICAvLy8gU2V0IG9mIGNsYXNzZXMgdGhhdCBpbmhlcml0cyBtZW1iZXJzIGZyb20gdGhlIG1lbWJlciBob2xkaW5nIGNsYXNzLgogIFNldDxDbGFzc0VudGl0eT4gX2luaGVyaXRpbmdDbGFzc2VzOwoKICAvLy8gQ2FjaGUgZm9yIGxpdmVuZXNzIGNvbXB1dGF0aW9uIGZvciBhIGB0aGlzYCBleHByZXNzaW9ucyBvZiBhIGdpdmVuIGNsYXNzLgogIE1hcDxDbGFzc0VudGl0eSwgX0xpdmVTZXQ+IF9tYXA7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBtZW1iZXJzIG9mIFttZW1iZXJIb2xkaW5nQ2xhc3NdIGNhbiBiZSBpbmhlcml0ZWQgaW50bwogIC8vLyBhIGxpdmUgY2xhc3MgdGhhdCBjYW4gYmUgdGhlIHRhcmdldCBvZiBhIGB0aGlzYCBleHByZXNzaW9uIGluIFt0aGlzQ2xhc3NdLgogIGJvb2wgaXNJbmhlcml0ZWRJblRoaXNDbGFzc09mKENsYXNzSGllcmFyY2h5QnVpbGRlciBidWlsZGVyLAogICAgICBDbGFzc0VudGl0eSBtZW1iZXJIb2xkaW5nQ2xhc3MsIENsYXNzRW50aXR5IHRoaXNDbGFzcykgewogICAgX0xpdmVTZXQgc2V0OwogICAgaWYgKF9tYXAgPT0gbnVsbCkgewogICAgICBfbWFwID0ge307CiAgICB9IGVsc2UgewogICAgICBzZXQgPSBfbWFwW3RoaXNDbGFzc107CiAgICB9CiAgICBpZiAoc2V0ID09IG51bGwpIHsKICAgICAgc2V0ID0gX21hcFt0aGlzQ2xhc3NdID0gX2NvbXB1dGVJbmhlcml0aW5nSW5UaGlzQ2xhc3NTZXQoCiAgICAgICAgICBidWlsZGVyLCBtZW1iZXJIb2xkaW5nQ2xhc3MsIHRoaXNDbGFzcyk7CiAgICB9CiAgICByZXR1cm4gc2V0Lmhhc0xpdmVDbGFzcyhidWlsZGVyKTsKICB9CgogIF9MaXZlU2V0IF9jb21wdXRlSW5oZXJpdGluZ0luVGhpc0NsYXNzU2V0KENsYXNzSGllcmFyY2h5QnVpbGRlciBidWlsZGVyLAogICAgICBDbGFzc0VudGl0eSBtZW1iZXJIb2xkaW5nQ2xhc3MsIENsYXNzRW50aXR5IHRoaXNDbGFzcykgewogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIG1lbWJlckhvbGRpbmdDbGFzc05vZGUgPQogICAgICAgIGJ1aWxkZXIuX2NsYXNzSGllcmFyY2h5Tm9kZXNbbWVtYmVySG9sZGluZ0NsYXNzXTsKCiAgICBpZiAoX2luaGVyaXRpbmdDbGFzc2VzID09IG51bGwpIHsKICAgICAgX2luaGVyaXRpbmdDbGFzc2VzID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKICAgICAgX2luaGVyaXRpbmdDbGFzc2VzLmFkZEFsbChtZW1iZXJIb2xkaW5nQ2xhc3NOb2RlCiAgICAgICAgICAuc3ViY2xhc3Nlc0J5TWFzayhDbGFzc0hpZXJhcmNoeU5vZGUuQUxMLCBzdHJpY3Q6IGZhbHNlKSk7CiAgICAgIGZvciAoQ2xhc3NIaWVyYXJjaHlOb2RlIG1peGluQXBwbGljYXRpb24KICAgICAgICAgIGluIGJ1aWxkZXIuX2NsYXNzU2V0c1ttZW1iZXJIb2xkaW5nQ2xhc3NdLm1peGluQXBwbGljYXRpb25Ob2RlcykgewogICAgICAgIF9pbmhlcml0aW5nQ2xhc3Nlcy5hZGRBbGwobWl4aW5BcHBsaWNhdGlvbgogICAgICAgICAgICAuc3ViY2xhc3Nlc0J5TWFzayhDbGFzc0hpZXJhcmNoeU5vZGUuQUxMLCBzdHJpY3Q6IGZhbHNlKSk7CiAgICAgIH0KICAgIH0KCiAgICBTZXQ8Q2xhc3NFbnRpdHk+IHZhbGlkYXRpbmdTZXQgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwoKICAgIHZvaWQgcHJvY2Vzc0hpZXJhcmNoeShDbGFzc0hpZXJhcmNoeU5vZGUgbWl4ZXJOb2RlKSB7CiAgICAgIGZvciAoQ2xhc3NFbnRpdHkgaW5oZXJpdGluZ0NsYXNzIGluIF9pbmhlcml0aW5nQ2xhc3NlcykgewogICAgICAgIENsYXNzSGllcmFyY2h5Tm9kZSBpbmhlcml0aW5nQ2xhc3NOb2RlID0KICAgICAgICAgICAgYnVpbGRlci5fY2xhc3NIaWVyYXJjaHlOb2Rlc1tpbmhlcml0aW5nQ2xhc3NdOwogICAgICAgIGlmICghdmFsaWRhdGluZ1NldC5jb250YWlucyhtaXhlck5vZGUuY2xzKSAmJgogICAgICAgICAgICBpbmhlcml0aW5nQ2xhc3NOb2RlLmhhc1N1YmNsYXNzKG1peGVyTm9kZSkpIHsKICAgICAgICAgIC8vIElmIFttaXhlck5vZGUuY2xzXSBpcyBsaXZlIHRoZW4gYSBgdGhpc2AgZXhwcmVzc2lvbiBjYW4gdGFyZ2V0CiAgICAgICAgICAvLyBtZW1iZXJzIGluaGVyaXRlZCBmcm9tIFttZW1iZXJIb2xkaW5nQ2xhc3NdIGludG8gW2luaGVyaXRpbmdDbGFzc10uCiAgICAgICAgICB2YWxpZGF0aW5nU2V0LmFkZChtaXhlck5vZGUuY2xzKTsKICAgICAgICB9CiAgICAgICAgaWYgKG1peGVyTm9kZS5oYXNTdWJjbGFzcyhpbmhlcml0aW5nQ2xhc3NOb2RlKSkgewogICAgICAgICAgLy8gSWYgW2luaGVyaXRpbmdDbGFzc10gaXMgbGl2ZSB0aGVuIGEgYHRoaXNgIGV4cHJlc3Npb24gY2FuIHRhcmdldAogICAgICAgICAgLy8gbWVtYmVycyBpbmhlcml0ZWQgZnJvbSBbbWVtYmVySG9sZGluZ0NsYXNzXSBpbnRvIGBpbmhlcml0aW5nQ2xhc3NgCiAgICAgICAgICAvLyBpbnRvIGEgc3ViY2xhc3Mgb2YgW21peGVyTm9kZS5jbHNdLgogICAgICAgICAgdmFsaWRhdGluZ1NldC5hZGQoaW5oZXJpdGluZ0NsYXNzKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBDbGFzc1NldCB0aGlzQ2xhc3NTZXQgPSBidWlsZGVyLl9jbGFzc1NldHNbdGhpc0NsYXNzXTsKCiAgICBwcm9jZXNzSGllcmFyY2h5KHRoaXNDbGFzc1NldC5ub2RlKTsKCiAgICBmb3IgKENsYXNzSGllcmFyY2h5Tm9kZSBtaXhpbkFwcGxpY2F0aW9uCiAgICAgICAgaW4gdGhpc0NsYXNzU2V0Lm1peGluQXBwbGljYXRpb25Ob2RlcykgewogICAgICBwcm9jZXNzSGllcmFyY2h5KG1peGluQXBwbGljYXRpb24pOwogICAgfQoKICAgIHJldHVybiBuZXcgX0xpdmVTZXQodmFsaWRhdGluZ1NldCk7CiAgfQp9CgovLy8gQSBjYWNoZSBvYmplY3QgdXNlZCBmb3IgW0NsYXNzSGllcmFyY2h5QnVpbGRlci5pc0luaGVyaXRlZEluU3VidHlwZU9mXS4KY2xhc3MgX0luaGVyaXRlZEluU3VidHlwZUNhY2hlIHsKICBNYXA8Q2xhc3NFbnRpdHksIF9MaXZlU2V0PiBfbWFwOwoKICAvLy8gUmV0dXJucyB3aGV0aGVyIGEgbGl2ZSBjbGFzcyBjdXJyZW50bHkga25vd24gdG8gaW5oZXJpdCBmcm9tIFt4XSBhbmQKICAvLy8gaW1wbGVtZW50IFt5XS4KICBib29sIGlzSW5oZXJpdGVkSW5TdWJ0eXBlT2YoCiAgICAgIENsYXNzSGllcmFyY2h5QnVpbGRlciBidWlsZGVyLCBDbGFzc0VudGl0eSB4LCBDbGFzc0VudGl0eSB5KSB7CiAgICBfTGl2ZVNldCBzZXQ7CiAgICBpZiAoX21hcCA9PSBudWxsKSB7CiAgICAgIF9tYXAgPSB7fTsKICAgIH0gZWxzZSB7CiAgICAgIHNldCA9IF9tYXBbeV07CiAgICB9CiAgICBpZiAoc2V0ID09IG51bGwpIHsKICAgICAgc2V0ID0gX21hcFt5XSA9IF9jb21wdXRlSW5oZXJpdGluZ0luU3VidHlwZVNldChidWlsZGVyLCB4LCB5KTsKICAgIH0KICAgIHJldHVybiBzZXQuaGFzTGl2ZUNsYXNzKGJ1aWxkZXIpOwogIH0KCiAgLy8vIENyZWF0ZXMgYW4gW19MaXZlU2V0XSBvZiBjbGFzc2VzIHRoYXQgaW5oZXJpdCBtZW1iZXJzIG9mIGEgY2xhc3MgW3hdCiAgLy8vIHdoaWxlIGltcGxlbWVudGluZyBjbGFzcyBbeV0uCiAgX0xpdmVTZXQgX2NvbXB1dGVJbmhlcml0aW5nSW5TdWJ0eXBlU2V0KAogICAgICBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgYnVpbGRlciwgQ2xhc3NFbnRpdHkgeCwgQ2xhc3NFbnRpdHkgeSkgewogICAgQ2xhc3NTZXQgY2xhc3NTZXQgPSBidWlsZGVyLl9jbGFzc1NldHNbeF07CgogICAgYXNzZXJ0KAogICAgICAgIGNsYXNzU2V0ICE9IG51bGwsCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIHgsICJObyBDbGFzc1NldCBmb3IgJHggKCR7eC5ydW50aW1lVHlwZX0pOiAke2J1aWxkZXIuX2NsYXNzU2V0c30iKSk7CgogICAgU2V0PENsYXNzRW50aXR5PiBjbGFzc2VzID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKCiAgICBpZiAoYnVpbGRlci5faXNTdWJ0eXBlT2YoeCwgeSkpIHsKICAgICAgLy8gW3hdIGltcGxlbWVudHMgW3ldIGl0c2VsZiwgcG9zc2libGUgdGhyb3VnaCBzdXBlcnR5cGVzLgogICAgICBjbGFzc2VzLmFkZCh4KTsKICAgIH0KCiAgICAvLy8gQWRkIHN1YmNsYXNzZXMgb2YgW25vZGVdIHRoYXQgaW1wbGVtZW50IFt5XS4KICAgIHZvaWQgc3ViY2xhc3NJbXBsZW1lbnRzKENsYXNzSGllcmFyY2h5Tm9kZSBub2RlLCB7Ym9vbCBzdHJpY3R9KSB7CiAgICAgIG5vZGUuZm9yRWFjaFN1YmNsYXNzKChDbGFzc0VudGl0eSB6KSB7CiAgICAgICAgaWYgKGJ1aWxkZXIuX2lzU3VidHlwZU9mKHosIHkpKSB7CiAgICAgICAgICBjbGFzc2VzLmFkZCh6KTsKICAgICAgICB9CiAgICAgIH0sIENsYXNzSGllcmFyY2h5Tm9kZS5BTEwsIHN0cmljdDogc3RyaWN0KTsKICAgIH0KCiAgICAvLyBBIHN1YmNsYXNzZXMgb2YgW3hdIHRoYXQgaW1wbGVtZW50IFt5XS4KICAgIHN1YmNsYXNzSW1wbGVtZW50cyhjbGFzc1NldC5ub2RlLCBzdHJpY3Q6IHRydWUpOwoKICAgIGZvciAoQ2xhc3NIaWVyYXJjaHlOb2RlIG1peGluQXBwbGljYXRpb24KICAgICAgICBpbiBjbGFzc1NldC5taXhpbkFwcGxpY2F0aW9uTm9kZXMpIHsKICAgICAgLy8gQSBzdWJjbGFzcyBvZiBbbWl4aW5BcHBsaWNhdGlvbl0gaW1wbGVtZW50cyBbeV0uCiAgICAgIHN1YmNsYXNzSW1wbGVtZW50cyhtaXhpbkFwcGxpY2F0aW9uLCBzdHJpY3Q6IGZhbHNlKTsKICAgIH0KCiAgICByZXR1cm4gbmV3IF9MaXZlU2V0KGNsYXNzZXMpOwogIH0KfQoKLy8vIEEgc2V0IG9mIHBvdGVudGlhbGx5IGxpdmUgY2xhc3Nlcy4KLy8vCi8vLyBUaGUgc2V0IGlzIHVzZWQgW0NsYXNzSGllcmFyY2h5QnVpbGRlci5pc0luaGVyaXRlZEluU3VidHlwZU9mXSBhbmQKLy8vIFtDbGFzc0hpZXJhcmNoeUJ1aWxkZXIuaXNJbmhlcml0ZWRJblRoaXNDbGFzc09mXSB0byBkZXRlcm1pbmUKLy8vIHdoZW4gbWVtYmVycyBvZiBhIGNsYXNzIGlzIGxpdmUuCmNsYXNzIF9MaXZlU2V0IHsKICAvLy8gSWYgYHRydWVgIHRoZSBzZXQgb2YgY2xhc3NlcyBpcyBrbm93biB0byBjb250YWluIGEgbGl2ZSBjbGFzcy4gSW4gdGhpcwogIC8vLyBjYXNlIFtfY2xhc3Nlc10gaXMgYG51bGxgLiBJZiBgZmFsc2VgIHRoZSBzZXQgb2YgY2xhc3NlcyBpcyBlbXB0eSBhbmQKICAvLy8gdGhlcmVmb3JlIGtub3duIG5ldmVyIHRvIGNvbnRhaW4gbGl2ZSBjbGFzc2VzLiBJbiB0aGlzIGNhc2UgW19jbGFzc2VzXQogIC8vLyBpcyBgbnVsbGAuIElmIGBudWxsYCBbX2NsYXNzZXNdIGlzIGEgbm9uLWVtcHR5IHNldCBjb250YWluaW5nIGNsYXNzZXMKICAvLy8gdGhhdCBhcmUgbm90IHlldCBrbm93biB0byBiZSBsaXZlLgogIGJvb2wgX3Jlc3VsdDsKICBTZXQ8Q2xhc3NFbnRpdHk+IF9jbGFzc2VzOwoKICBfTGl2ZVNldChTZXQ8Q2xhc3NFbnRpdHk+IGNsYXNzZXMpCiAgICAgIDogX3Jlc3VsdCA9IGNsYXNzZXMuaXNFbXB0eSA/IGZhbHNlIDogbnVsbCwKICAgICAgICBfY2xhc3NlcyA9IGNsYXNzZXMuaXNOb3RFbXB0eSA/IGNsYXNzZXMgOiBudWxsOwoKICAvLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBzZXQgb2YgY2xhc3NlcyBpcyBjdXJyZW50bHkga25vd24gdG8gY29udGFpbiBhIGxpdmUKICAvLy8gY2xhc3Nlcy4KICAvLy8KICAvLy8gVGhlIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBjaGFuZ2VzIGR1cmluZyB0aGUgY2xvc2VkIHdvcmxkIGNvbXB1dGF0aW9uLgogIC8vLyBJbml0aWFsbHksIHdlIGhhdmVuJ3Qgc2VlbiBhbnkgbGl2ZSBjbGFzc2VzIHNvIHdlIHdpbGwgcmV0dXJuIGBmYWxzZWAgZXZlbgogIC8vLyBmb3IgYSBub24tZW1wdHkgc2V0IG9mIGNsYXNzZXMuIEFzIG1vcmUgY2xhc3NlcyBhcmUgbWFya2VkIGFzCiAgLy8vIGluc3RhbnRpYXRlZCwgZHVyaW5nIHRyZWUtc2hha2luZywgdGhlIHJlc3VsdCBtaWdodCBjaGFuZ2UgdG8gYHRydWVgIGlmCiAgLy8vIG9uZSBvZiB0aGUgW19jbGFzc2VzXSBoYXMgYmVlbiBtYXJrZWQgYXMgbGl2ZS4KICAvLy8KICAvLy8gVGhlIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBfaXNfIG1vbm90b25lLCB0aG91Z2g7IHdoZW4gd2UgaGF2ZSByZXR1cm5lZAogIC8vLyBgdHJ1ZWAgKGJlY2F1c2UgYXQgbGVhc3Qgb25lIGNsYXNzIGlzIGtub3duIHRvIGJlIGxpdmUpIHdlIHdpbGwgY29udGludWUKICAvLy8gdG8gcmV0dXJuIGB0cnVlYC4KICBib29sIGhhc0xpdmVDbGFzcyhDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgYnVpbGRlcikgewogICAgaWYgKF9yZXN1bHQgIT0gbnVsbCkgcmV0dXJuIF9yZXN1bHQ7CiAgICBmb3IgKENsYXNzRW50aXR5IGNscyBpbiBfY2xhc3NlcykgewogICAgICBpZiAoYnVpbGRlci5fY2xhc3NIaWVyYXJjaHlOb2Rlc1tjbHNdLmlzSW5zdGFudGlhdGVkKSB7CiAgICAgICAgLy8gV2Ugbm93IGtub3cgdGhpcyBzZXQgY29udGFpbnMgYSBsaXZlIGNsYXNzIGFuZCBkb25lIG5lZWQgdG8gcmVtZW1iZXIKICAgICAgICAvLyB0aGF0IHNldCBvZiBjbGFzc2VzIGFueW1vcmUuCiAgICAgICAgX3Jlc3VsdCA9IHRydWU7CiAgICAgICAgX2NsYXNzZXMgPSBudWxsOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBDbGFzc1F1ZXJpZXMgewogIC8vLyBSZXR1cm5zIHRoZSBkZWNsYXJhdGlvbiBvZiBbY2xzXS4KICBDbGFzc0VudGl0eSBnZXREZWNsYXJhdGlvbihjb3ZhcmlhbnQgQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgdGhlIGNsYXNzIG1peGVkIGludG8gW2Nsc10gaWYgYW55LgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlcGxhY2UgdGhpcyBieSBhIGBnZXRBcHBsaWVkTWl4aW5zYCBmdW5jdGlvbiB0aGF0CiAgLy8gcmV0dXJuIHRyYW5zaXRpdmVseSBtaXhlZCBpbiBjbGFzc2VzIGxpa2UgaW46CiAgLy8gICAgIGNsYXNzIEEge30KICAvLyAgICAgY2xhc3MgQiA9IE9iamVjdCB3aXRoIEE7CiAgLy8gICAgIGNsYXNzIEMgPSBPYmplY3Qgd2l0aCBCOwogIENsYXNzRW50aXR5IGdldEFwcGxpZWRNaXhpbihjb3ZhcmlhbnQgQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgdGhlIGhpZXJhcmNoeSBkZXB0aCBvZiBbY2xzXS4KICBpbnQgZ2V0SGllcmFyY2h5RGVwdGgoY292YXJpYW50IENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbY2xzXSBpbXBsZW1lbnRzIGBGdW5jdGlvbmAgZWl0aGVyIGV4cGxpY2l0bHkgb3IgdGhyb3VnaAogIC8vLyBhIGBjYWxsYCBtZXRob2QuCiAgYm9vbCBpbXBsZW1lbnRzRnVuY3Rpb24oY292YXJpYW50IENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIHRoZSBzdXBlcmNsYXNzIG9mIFtjbHNdIGlmIGFueS4KICBDbGFzc0VudGl0eSBnZXRTdXBlckNsYXNzKGNvdmFyaWFudCBDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyBhbGwgc3VwZXJ0eXBlcyBvZiBbY2xzXS4KICBJdGVyYWJsZTxJbnRlcmZhY2VUeXBlPiBnZXRTdXBlcnR5cGVzKGNvdmFyaWFudCBDbGFzc0VudGl0eSBjbHMpOwp9CgovLy8gRW51bSB2YWx1ZXMgZGVmaW5pbmcgc3Vic2V0IG9mIGNsYXNzZXMgaW5jbHVkZWQgaW4gcXVlcmllcy4KZW51bSBDbGFzc1F1ZXJ5IHsKICAvLy8gT25seSB0aGUgY2xhc3MgaXRzZWxmIGlzIGluY2x1ZGVkLgogIEVYQUNULAoKICAvLy8gVGhlIGNsYXNzIGFuZCBhbGwgc3ViY2xhc3NlcyAodHJhbnNpdGl2ZWx5KSBhcmUgaW5jbHVkZWQuCiAgU1VCQ0xBU1MsCgogIC8vLyBUaGUgY2xhc3MgYW5kIGFsbCBjbGFzc2VzIHRoYXQgaW1wbGVtZW50IG9yIHN1YmNsYXNzIGl0ICh0cmFuc2l0aXZlbHkpCiAgLy8vIGFyZSBpbmNsdWRlZC4KICBTVUJUWVBFLAp9CgovLy8gUmVzdWx0IGtpbmQgZm9yIFtDbGFzc0hpZXJhcmNoeS5jb21tb25TdWJjbGFzc2VzXS4KZW51bSBTdWJjbGFzc1Jlc3VsdEtpbmQgewogIC8vLyBObyBjb21tb24gc3ViY2xhc3Nlcy4KICBFTVBUWSwKCiAgLy8vIEV4YWN0bHkgdGhlIGZpcnN0IGNsYXNzIGluIGNvbW1vbi4KICBFWEFDVDEsCgogIC8vLyBFeGFjdGx5IHRoZSBzZWNvbmQgY2xhc3MgaW4gY29tbW9uLgogIEVYQUNUMiwKCiAgLy8vIFN1YmNsYXNzZXMgb2YgdGhlIGZpcnN0IGNsYXNzIGluIGNvbW1vbi4KICBTVUJDTEFTUzEsCgogIC8vLyBTdWJjbGFzc2VzIG9mIHRoZSBzZWNvbmQgY2xhc3MgaW4gY29tbW9uLgogIFNVQkNMQVNTMiwKCiAgLy8vIFN1YnR5cGVzIG9mIHRoZSBmaXJzdCBjbGFzcyBpbiBjb21tb24uCiAgU1VCVFlQRTEsCgogIC8vLyBTdWJ0eXBlcyBvZiB0aGUgc2Vjb25kIGNsYXNzIGluIGNvbW1vbi4KICBTVUJUWVBFMiwKCiAgLy8vIFN1YmNsYXNzZXMgb2YgYSBzZXQgb2YgY2xhc3NlcyBpbiBjb21tb24uCiAgU0VUCn0KCi8vLyBSZXN1bHQgY29tcHV0ZWQgaW4gW0NsYXNzSGllcmFyY2h5LmNvbW1vblN1YmNsYXNzZXNdLgpjbGFzcyBTdWJjbGFzc1Jlc3VsdCB7CiAgZmluYWwgU3ViY2xhc3NSZXN1bHRLaW5kIGtpbmQ7CiAgZmluYWwgTGlzdDxDbGFzc0VudGl0eT4gY2xhc3NlczsKCiAgU3ViY2xhc3NSZXN1bHQodGhpcy5jbGFzc2VzKSA6IGtpbmQgPSBTdWJjbGFzc1Jlc3VsdEtpbmQuU0VUOwoKICBjb25zdCBTdWJjbGFzc1Jlc3VsdC5pbnRlcm5hbCh0aGlzLmtpbmQpIDogY2xhc3NlcyA9IG51bGw7CgogIHN0YXRpYyBjb25zdCBTdWJjbGFzc1Jlc3VsdCBFTVBUWSA9CiAgICAgIGNvbnN0IFN1YmNsYXNzUmVzdWx0LmludGVybmFsKFN1YmNsYXNzUmVzdWx0S2luZC5FTVBUWSk7CiAgc3RhdGljIGNvbnN0IFN1YmNsYXNzUmVzdWx0IEVYQUNUMSA9CiAgICAgIGNvbnN0IFN1YmNsYXNzUmVzdWx0LmludGVybmFsKFN1YmNsYXNzUmVzdWx0S2luZC5FWEFDVDEpOwogIHN0YXRpYyBjb25zdCBTdWJjbGFzc1Jlc3VsdCBFWEFDVDIgPQogICAgICBjb25zdCBTdWJjbGFzc1Jlc3VsdC5pbnRlcm5hbChTdWJjbGFzc1Jlc3VsdEtpbmQuRVhBQ1QyKTsKICBzdGF0aWMgY29uc3QgU3ViY2xhc3NSZXN1bHQgU1VCQ0xBU1MxID0KICAgICAgY29uc3QgU3ViY2xhc3NSZXN1bHQuaW50ZXJuYWwoU3ViY2xhc3NSZXN1bHRLaW5kLlNVQkNMQVNT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dWU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICcuLi9jbG9zdXJlLmRhcnQnOwppbXBvcnQgJy4uL2NvbXBpbGVyLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvaW5mZXJyZWRfZGF0YS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19tb2RlbC9lbGVtZW50cy5kYXJ0JyBzaG93IEpDbG9zdXJlQ2FsbE1ldGhvZDsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JzsKaW1wb3J0ICdhYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydCc7CmltcG9ydCAnaW5mZXJyZXJfZW5naW5lLmRhcnQnOwppbXBvcnQgJ3R5cGVfZ3JhcGhfbm9kZXMuZGFydCc7CmltcG9ydCAndHlwZXMuZGFydCc7CgovLy8gQSB3b3JrIHF1ZXVlIGZvciB0aGUgaW5mZXJyZXIuIEl0IGZpbHRlcnMgb3V0IG5vZGVzIHRoYXQgYXJlIHRhZ2dlZCBhcwovLy8gW1R5cGVJbmZvcm1hdGlvbi5kb05vdEVucXVldWVdLCBhcyB3ZWxsIGFzIGVuc3VyZXMgdGhyb3VnaAovLy8gW1R5cGVJbmZvcm1hdGlvbi5pblF1ZXVlXSB0aGF0IGEgbm9kZSBpcyBpbiB0aGUgcXVldWUgb25seSBvbmNlIGF0Ci8vLyBhIHRpbWUuCmNsYXNzIFdvcmtRdWV1ZSB7CiAgZmluYWwgUXVldWU8VHlwZUluZm9ybWF0aW9uPiBxdWV1ZSA9IG5ldyBRdWV1ZTxUeXBlSW5mb3JtYXRpb24+KCk7CgogIHZvaWQgYWRkKFR5cGVJbmZvcm1hdGlvbiBlbGVtZW50KSB7CiAgICBpZiAoZWxlbWVudC5kb05vdEVucXVldWUpIHJldHVybjsKICAgIGlmIChlbGVtZW50LmluUXVldWUpIHJldHVybjsKICAgIHF1ZXVlLmFkZExhc3QoZWxlbWVudCk7CiAgICBlbGVtZW50LmluUXVldWUgPSB0cnVlOwogIH0KCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8VHlwZUluZm9ybWF0aW9uPiBhbGwpIHsKICAgIGFsbC5mb3JFYWNoKGFkZCk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gcmVtb3ZlKCkgewogICAgVHlwZUluZm9ybWF0aW9uIGVsZW1lbnQgPSBxdWV1ZS5yZW1vdmVGaXJzdCgpOwogICAgZWxlbWVudC5pblF1ZXVlID0gZmFsc2U7CiAgICByZXR1cm4gZWxlbWVudDsKICB9CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gcXVldWUuaXNFbXB0eTsKCiAgaW50IGdldCBsZW5ndGggPT4gcXVldWUubGVuZ3RoOwp9CgpjbGFzcyBUeXBlR3JhcGhJbmZlcnJlciBpbXBsZW1lbnRzIFR5cGVzSW5mZXJyZXIgewogIEluZmVycmVyRW5naW5lIGluZmVycmVyOwogIGZpbmFsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZDsKCiAgZmluYWwgQ29tcGlsZXIgX2NvbXBpbGVyOwogIGZpbmFsIEluZmVycmVkRGF0YUJ1aWxkZXIgX2luZmVycmVkRGF0YUJ1aWxkZXI7CgogIFR5cGVHcmFwaEluZmVycmVyKAogICAgICB0aGlzLl9jb21waWxlciwgdGhpcy5jbG9zZWRXb3JsZCwgdGhpcy5faW5mZXJyZWREYXRhQnVpbGRlcik7CgogIFN0cmluZyBnZXQgbmFtZSA9PiAnR3JhcGggaW5mZXJyZXInOwoKICBBYnN0cmFjdFZhbHVlRG9tYWluIGdldCBhYnN0cmFjdFZhbHVlRG9tYWluID0+CiAgICAgIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CgogIEBvdmVycmlkZQogIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIGFuYWx5emVNYWluKEZ1bmN0aW9uRW50aXR5IG1haW4pIHsKICAgIGluZmVycmVyID0gY3JlYXRlSW5mZXJyZXJFbmdpbmVGb3IobWFpbik7CiAgICBpbmZlcnJlci5ydW5PdmVyQWxsRWxlbWVudHMoKTsKICAgIHJldHVybiBidWlsZFJlc3VsdHMoKTsKICB9CgogIEluZmVycmVyRW5naW5lIGNyZWF0ZUluZmVycmVyRW5naW5lRm9yKEZ1bmN0aW9uRW50aXR5IG1haW4pIHsKICAgIHJldHVybiBuZXcgSW5mZXJyZXJFbmdpbmVJbXBsKAogICAgICAgIF9jb21waWxlci5vcHRpb25zLAogICAgICAgIF9jb21waWxlci5wcm9ncmVzcywKICAgICAgICBfY29tcGlsZXIucmVwb3J0ZXIsCiAgICAgICAgX2NvbXBpbGVyLm91dHB1dFByb3ZpZGVyLAogICAgICAgIGNsb3NlZFdvcmxkLAogICAgICAgIF9jb21waWxlci5iYWNrZW5kLm5vU3VjaE1ldGhvZFJlZ2lzdHJ5LAogICAgICAgIG1haW4sCiAgICAgICAgX2luZmVycmVkRGF0YUJ1aWxkZXIpOwogIH0KCiAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBnZXRDYWxsZXJzT2ZGb3JUZXN0aW5nKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gaW5mZXJyZXIuZ2V0Q2FsbGVyc09mRm9yVGVzdGluZyhlbGVtZW50KTsKICB9CgogIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIGJ1aWxkUmVzdWx0cygpIHsKICAgIGluZmVycmVyLmNsb3NlKCk7CgogICAgTWFwPE1lbWJlckVudGl0eSwgR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdD4gbWVtYmVyUmVzdWx0cyA9CiAgICAgICAgPE1lbWJlckVudGl0eSwgR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdD57fTsKICAgIE1hcDxMb2NhbCwgQWJzdHJhY3RWYWx1ZT4gcGFyYW1ldGVyUmVzdWx0cyA9IDxMb2NhbCwgQWJzdHJhY3RWYWx1ZT57fTsKCiAgICB2b2lkIGNyZWF0ZU1lbWJlclJlc3VsdHMoCiAgICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciwgTWVtYmVyVHlwZUluZm9ybWF0aW9uIHR5cGVJbmZvcm1hdGlvbikgewogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlRWxlbWVudERhdGEgZGF0YSA9CiAgICAgICAgICBpbmZlcnJlci5kYXRhT2ZNZW1iZXIobWVtYmVyKS5jb21wcmVzcygpOwogICAgICBib29sIGlzSnNJbnRlcm9wID0gY2xvc2VkV29ybGQubmF0aXZlRGF0YS5pc0pzSW50ZXJvcE1lbWJlcihtZW1iZXIpOwoKICAgICAgQWJzdHJhY3RWYWx1ZSByZXR1cm5UeXBlOwogICAgICBBYnN0cmFjdFZhbHVlIHR5cGU7CgogICAgICBpZiAoaXNKc0ludGVyb3ApIHsKICAgICAgICByZXR1cm5UeXBlID0gdHlwZSA9IGFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGU7CiAgICAgIH0gZWxzZSBpZiAobWVtYmVyIGlzIEZ1bmN0aW9uRW50aXR5KSB7CiAgICAgICAgcmV0dXJuVHlwZSA9IHR5cGVJbmZvcm1hdGlvbi50eXBlOwogICAgICAgIHR5cGUgPSBhYnN0cmFjdFZhbHVlRG9tYWluLmZ1bmN0aW9uVHlwZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm5UeXBlID0gYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZTsKICAgICAgICB0eXBlID0gdHlwZUluZm9ybWF0aW9uLnR5cGU7CiAgICAgIH0KCiAgICAgIGJvb2wgdGhyb3dzQWx3YXlzID0KICAgICAgICAgIC8vIEFsd2F5cyB0aHJvd3MgaWYgdGhlIHJldHVybiB0eXBlIHdhcyBpbmZlcnJlZCB0byBiZSBub24tbnVsbCBlbXB0eS4KICAgICAgICAgIHJldHVyblR5cGUgIT0gbnVsbCAmJgogICAgICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uaXNFbXB0eShyZXR1cm5UeXBlKS5pc0RlZmluaXRlbHlUcnVlOwoKICAgICAgYm9vbCBpc0NhbGxlZE9uY2UgPQogICAgICAgICAgdHlwZUluZm9ybWF0aW9uLmlzQ2FsbGVkT25jZSgpOyAvL2lzTWVtYmVyQ2FsbGVkT25jZShtZW1iZXIpOwoKICAgICAgbWVtYmVyUmVzdWx0c1ttZW1iZXJdID0gbmV3IEdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHRJbXBsKAogICAgICAgICAgZGF0YSwgcmV0dXJuVHlwZSwgdHlwZSwKICAgICAgICAgIHRocm93c0Fsd2F5czogdGhyb3dzQWx3YXlzLCBpc0NhbGxlZE9uY2U6IGlzQ2FsbGVkT25jZSk7CiAgICB9CgogICAgU2V0PEZpZWxkRW50aXR5PiBmcmVlVmFyaWFibGVzID0gbmV3IFNldDxGaWVsZEVudGl0eT4oKTsKICAgIGluZmVycmVyLnR5cGVzLmZvckVhY2hNZW1iZXJUeXBlKAogICAgICAgIChNZW1iZXJFbnRpdHkgbWVtYmVyLCBNZW1iZXJUeXBlSW5mb3JtYXRpb24gdHlwZUluZm9ybWF0aW9uKSB7CiAgICAgIGNyZWF0ZU1lbWJlclJlc3VsdHMobWVtYmVyLCB0eXBlSW5mb3JtYXRpb24pOwogICAgICBpZiAobWVtYmVyIGlzIEpDbG9zdXJlQ2FsbE1ldGhvZCkgewogICAgICAgIENsb3N1cmVSZXByZXNlbnRhdGlvbkluZm8gaW5mbyA9CiAgICAgICAgICAgIGNsb3NlZFdvcmxkLmNsb3N1cmVEYXRhTG9va3VwLmdldFNjb3BlSW5mbyhtZW1iZXIpOwogICAgICAgIGluZm8uZm9yRWFjaEZyZWVWYXJpYWJsZSgoTG9jYWwgZnJvbSwgRmllbGRFbnRpdHkgdG8pIHsKICAgICAgICAgIGZyZWVWYXJpYWJsZXMuYWRkKHRvKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfSk7CiAgICBmb3IgKEZpZWxkRW50aXR5IGZpZWxkIGluIGZyZWVWYXJpYWJsZXMpIHsKICAgICAgaWYgKCFtZW1iZXJSZXN1bHRzLmNvbnRhaW5zS2V5KGZpZWxkKSkgewogICAgICAgIE1lbWJlclR5cGVJbmZvcm1hdGlvbiB0eXBlSW5mb3JtYXRpb24gPQogICAgICAgICAgICBpbmZlcnJlci50eXBlcy5nZXRJbmZlcnJlZFR5cGVPZk1lbWJlcihmaWVsZCk7CiAgICAgICAgdHlwZUluZm9ybWF0aW9uLmNvbXB1dGVJc0NhbGxlZE9uY2UoKTsKICAgICAgICBjcmVhdGVNZW1iZXJSZXN1bHRzKGZpZWxkLCB0eXBlSW5mb3JtYXRpb24pOwogICAgICB9CiAgICB9CgogICAgaW5mZXJyZXIudHlwZXMuZm9yRWFjaFBhcmFtZXRlclR5cGUoCiAgICAgICAgKExvY2FsIHBhcmFtZXRlciwgUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uIHR5cGVJbmZvcm1hdGlvbikgewogICAgICBBYnN0cmFjdFZhbHVlIHR5cGUgPSB0eXBlSW5mb3JtYXRpb24udHlwZTsKICAgICAgcGFyYW1ldGVyUmVzdWx0c1twYXJhbWV0ZXJdID0gdHlwZTsKICAgIH0pOwoKICAgIE1hcDxpci5UcmVlTm9kZSwgQWJzdHJhY3RWYWx1ZT4gYWxsb2NhdGVkTGlzdHMgPQogICAgICAgIDxpci5UcmVlTm9kZSwgQWJzdHJhY3RWYWx1ZT57fTsKICAgIFNldDxpci5UcmVlTm9kZT4gY2hlY2tlZEZvckdyb3dhYmxlTGlzdHMgPSBuZXcgU2V0PGlyLlRyZWVOb2RlPigpOwogICAgaW5mZXJyZXIudHlwZXMuYWxsb2NhdGVkTGlzdHMKICAgICAgICAuZm9yRWFjaCgoaXIuVHJlZU5vZGUgbm9kZSwgTGlzdFR5cGVJbmZvcm1hdGlvbiB0eXBlSW5mb3JtYXRpb24pIHsKICAgICAgTGlzdFR5cGVJbmZvcm1hdGlvbiBpbmZvID0gaW5mZXJyZXIudHlwZXMuYWxsb2NhdGVkTGlzdHNbbm9kZV07CiAgICAgIGlmIChpbmZvLmNoZWNrc0dyb3dhYmxlKSB7CiAgICAgICAgY2hlY2tlZEZvckdyb3dhYmxlTGlzdHMuYWRkKG5vZGUpOwogICAgICB9CiAgICAgIGFsbG9jYXRlZExpc3RzW25vZGVdID0gdHlwZUluZm9ybWF0aW9uLnR5cGU7CiAgICB9KTsKCiAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzID0gbmV3IEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzSW1wbCgKICAgICAgICBjbG9zZWRXb3JsZCwKICAgICAgICBfaW5mZXJyZWREYXRhQnVpbGRlci5jbG9zZShjbG9zZWRXb3JsZCksCiAgICAgICAgbWVtYmVyUmVzdWx0cywKICAgICAgICBwYXJhbWV0ZXJSZXN1bHRzLAogICAgICAgIGNoZWNrZWRGb3JHcm93YWJsZUxpc3RzLAogICAgICAgIGluZmVycmVyLnJldHVybnNMaXN0RWxlbWVudFR5cGVTZXQsCiAgICAgICAgYWxsb2NhdGVkTGlzdHMpOwoKICAgIGluZmVycmVyLmNsZWFyKCk7CgogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQp9CoC1AE5OPAEdASUBKBobJCs8GCUfIBUBSz9HDBJFASYmIRwcBAEvFgQBHTMdFAQBJQEiAgEzGyIBHDIBFUQBJwExJwEMQC4jGwQBQCMbHBwiFTAOHwQBSDUEAS4WAUc7SwEeRiw0SwEgGgEZPS0rMQ82JQgBGlEgSAEaSAFHIkMGAT0mRzQqKUBAIQwICC8vMDsvNQgGASlGMSoIATUoRyJLRiErCDMIAU0VMRcaISwZARYBFAQCATZwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci90eXBlX2dyYXBoX2luZmVycmVyLmRhcnQ/c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaW5mZXJyZXIvdHlwZW1hc2tzL2NvbnN0YW50cy5kYXJ0kiUvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSB0eXBlcy5jb25zdGFudHM7CgppbXBvcnQgJy4uLy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi8uLi9jb25zdGFudHMvY29uc3RhbnRfc3lzdGVtLmRhcnQnIGFzIGNvbnN0YW50X3N5c3RlbTsKaW1wb3J0ICcuLi8uLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJy4uLy4uL2pzX2JhY2tlbmQvanNfYmFja2VuZC5kYXJ0JyBzaG93IFN5bnRoZXRpY0NvbnN0YW50S2luZDsKaW1wb3J0ICcuLi8uLi93b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKaW1wb3J0ICdtYXNrcy5kYXJ0JzsKCi8vLyBDb21wdXRlcyB0aGUgW1R5cGVNYXNrXSBmb3IgdGhlIGNvbnN0YW50IFt2YWx1ZV0uClR5cGVNYXNrIGNvbXB1dGVUeXBlTWFzayhKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsIENvbnN0YW50VmFsdWUgdmFsdWUpIHsKICByZXR1cm4gdmFsdWUuYWNjZXB0KGNvbnN0IENvbnN0YW50VmFsdWVUeXBlTWFza3MoKSwgY2xvc2VkV29ybGQpOwp9CgpjbGFzcyBDb25zdGFudFZhbHVlVHlwZU1hc2tzCiAgICBleHRlbmRzIENvbnN0YW50VmFsdWVWaXNpdG9yPFR5cGVNYXNrLCBKQ2xvc2VkV29ybGQ+IHsKICBjb25zdCBDb25zdGFudFZhbHVlVHlwZU1hc2tzKCk7CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIHZpc2l0Q29uc3RydWN0ZWQoCiAgICAgIENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBpZiAoY2xvc2VkV29ybGQuaW50ZXJjZXB0b3JEYXRhLmlzSW50ZXJjZXB0ZWRDbGFzcyhjb25zdGFudC50eXBlLmVsZW1lbnQpKSB7CiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLm5vbk51bGxUeXBlOwogICAgfQogICAgcmV0dXJuIG5ldyBUeXBlTWFzay5ub25OdWxsRXhhY3QoY29uc3RhbnQudHlwZS5lbGVtZW50LCBjbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayB2aXNpdERlZmVycmVkR2xvYmFsKAogICAgICBEZWZlcnJlZEdsb2JhbENvbnN0YW50VmFsdWUgY29uc3RhbnQsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGNvbnN0YW50LnJlZmVyZW5jZWQuYWNjZXB0KHRoaXMsIGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIHZpc2l0RG91YmxlKERvdWJsZUNvbnN0YW50VmFsdWUgY29uc3RhbnQsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgLy8gV2UgaGF2ZSB0byByZWNvZ25pemUgZG91YmxlIGNvbnN0YW50cyB0aGF0IGFyZSAnaXMgaW50Jy4KICAgIGlmIChjb25zdGFudF9zeXN0ZW0uaXNJbnQoY29uc3RhbnQpKSB7CiAgICAgIGlmIChjb25zdGFudC5pc01pbnVzWmVybykgewogICAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLnVpbnQzMVR5cGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXNzZXJ0KGNvbnN0YW50LmlzUG9zaXRpdmVJbmZpbml0eSB8fCBjb25zdGFudC5pc05lZ2F0aXZlSW5maW5pdHkpOwogICAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmludFR5cGU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmRvdWJsZVR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayB2aXNpdFN5bnRoZXRpYygKICAgICAgU3ludGhldGljQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBzd2l0Y2ggKGNvbnN0YW50LnZhbHVlS2luZCkgewogICAgICBjYXNlIFN5bnRoZXRpY0NvbnN0YW50S2luZC5EVU1NWV9JTlRFUkNFUFRPUjoKICAgICAgICByZXR1cm4gY29uc3RhbnQucGF5bG9hZDsKICAgICAgY2FzZSBTeW50aGV0aWNDb25zdGFudEtpbmQuRU1QVFlfVkFMVUU6CiAgICAgICAgcmV0dXJuIGNvbnN0YW50LnBheWxvYWQ7CiAgICAgIGNhc2UgU3ludGhldGljQ29uc3RhbnRLaW5kLlRZUEVWQVJJQUJMRV9SRUZFUkVOQ0U6CiAgICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uaW50VHlwZTsKICAgICAgY2FzZSBTeW50aGV0aWNDb25zdGFudEtpbmQuTkFNRToKICAgICAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5zdHJpbmdUeXBlOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IGZhaWxlZEF0KENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgICAgICJVbmV4cGVjdGVkIER1bW15Q29uc3RhbnRLaW5kOiAke2NvbnN0YW50LnRvU3RydWN0dXJlZFRleHQoKX0uIik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayB2aXNpdEJvb2woQm9vbENvbnN0YW50VmFsdWUgY29uc3RhbnQsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayB2aXNpdEZ1bmN0aW9uKAogICAgICBGdW5jdGlvbkNvbnN0YW50VmFsdWUgY29uc3RhbnQsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uZnVuY3Rpb25UeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgdmlzaXRJbnN0YW50aWF0aW9uKAogICAgICBJbnN0YW50aWF0aW9uQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5mdW5jdGlvblR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayB2aXNpdEludChJbnRDb25zdGFudFZhbHVlIGNvbnN0YW50LCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGlmIChjb25zdGFudC5pc1VJbnQzMSgpKSByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi51aW50MzFUeXBlOwogICAgaWYgKGNvbnN0YW50LmlzVUludDMyKCkpIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLnVpbnQzMlR5cGU7CiAgICBpZiAoY29uc3RhbnQuaXNQb3NpdGl2ZSgpKQogICAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5wb3NpdGl2ZUludFR5cGU7CiAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5pbnRUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgdmlzaXRJbnRlcmNlcHRvcigKICAgICAgSW50ZXJjZXB0b3JDb25zdGFudFZhbHVlIGNvbnN0YW50LCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLm5vbk51bGxUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgdmlzaXRMaXN0KExpc3RDb25zdGFudFZhbHVlIGNvbnN0YW50LCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmNvbnN0TGlzdFR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayB2aXNpdFNldChTZXRDb25zdGFudFZhbHVlIGNvbnN0YW50LCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmNvbnN0U2V0VHlwZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIHZpc2l0TWFwKE1hcENvbnN0YW50VmFsdWUgY29uc3RhbnQsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uY29uc3RNYXBUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgdmlzaXROdWxsKE51bGxDb25zdGFudFZhbHVlIGNvbnN0YW50LCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLm51bGxUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgdmlzaXROb25Db25zdGFudCgKICAgICAgTm9uQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5udWxsVHlwZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIHZpc2l0U3RyaW5nKFN0cmluZ0NvbnN0YW50VmFsdWUgY29uc3RhbnQsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uc3RyaW5nVHlwZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIHZpc2l0VHlwZShUeXBlQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi50eXBlVHlwZTsKICB9Cn0KgIsATk48ARkBHEImRi0VATZKRAIBHTsiAQwdRVE6BkoEAQwgSDoEAQxRQCsiOw9MOAgGNwQBDBtDIjQhLiE5OCc7DzJOBgQBDE01BAEMGkI5BAEMH0c5BAEMS1BQHz40BAEMHUU4BAEMTToEAQxLOQQBDEs5BAEMTTUEAQwdPTUEAQxRNwQBDE01BAIBNnBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL3R5cGVtYXNrcy9jb25zdGFudHMuZGFydDtzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pbmZlcnJlci9pbmZlcnJlcl9lbmdpbmUuZGFydMAA2cQvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CgppbXBvcnQgJy4uLy4uL2NvbXBpbGVyX25ldy5kYXJ0JzsKaW1wb3J0ICcuLi9jbG9zdXJlLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24vbmFtZXMuZGFydCc7CmltcG9ydCAnLi4vY29tcGlsZXIuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvbmFtZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9pbmZlcnJlZF9kYXRhLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbm9fc3VjaF9tZXRob2RfcmVnaXN0cnkuZGFydCc7CmltcG9ydCAnLi4vanNfbW9kZWwvZWxlbWVudF9tYXAuZGFydCc7CmltcG9ydCAnLi4vanNfbW9kZWwvanNfd29ybGQuZGFydCc7CmltcG9ydCAnLi4vanNfbW9kZWwvbG9jYWxzLmRhcnQnOwppbXBvcnQgJy4uL25hdGl2ZS9iZWhhdmlvci5kYXJ0JzsKaW1wb3J0ICcuLi9vcHRpb25zLmRhcnQnOwppbXBvcnQgJy4uL3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jYWxsX3N0cnVjdHVyZS5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9zZWxlY3Rvci5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9zaWRlX2VmZmVjdHMuZGFydCc7CmltcG9ydCAnLi4vd29ybGQuZGFydCc7CmltcG9ydCAnYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJ2J1aWxkZXJfa2VybmVsLmRhcnQnOwppbXBvcnQgJ2Nsb3N1cmVfdHJhY2VyLmRhcnQnOwppbXBvcnQgJ2RlYnVnLmRhcnQnIGFzIGRlYnVnOwppbXBvcnQgJ2xvY2Fsc19oYW5kbGVyLmRhcnQnOwppbXBvcnQgJ2xpc3RfdHJhY2VyLmRhcnQnOwppbXBvcnQgJ21hcF90cmFjZXIuZGFydCc7CmltcG9ydCAnc2V0X3RyYWNlci5kYXJ0JzsKaW1wb3J0ICd0eXBlX2dyYXBoX2R1bXAuZGFydCc7CmltcG9ydCAndHlwZV9ncmFwaF9pbmZlcnJlci5kYXJ0JzsKaW1wb3J0ICd0eXBlX2dyYXBoX25vZGVzLmRhcnQnOwppbXBvcnQgJ3R5cGVfc3lzdGVtLmRhcnQnOwppbXBvcnQgJ3R5cGVzLmRhcnQnOwoKLy8vIEFuIGluZmVyZW5jaW5nIGVuZ2luZSB0aGF0IGNvbXB1dGVzIGEgY2FsbCBncmFwaCBvZiBbVHlwZUluZm9ybWF0aW9uXSBub2RlcwovLy8gYnkgdmlzaXRpbmcgdGhlIEFTVCBvZiB0aGUgYXBwbGljYXRpb24sIGFuZCB0aGVuIGRvZXMgdGhlIGluZmVyZW5jaW5nIG9uIHRoZQovLy8gZ3JhcGguCmFic3RyYWN0IGNsYXNzIEluZmVycmVyRW5naW5lIHsKICAvLy8gQSBzZXQgb2Ygc2VsZWN0b3IgbmFtZXMgdGhhdCBbTGlzdF0gaW1wbGVtZW50cywgdGhhdCB3ZSBrbm93IHJldHVybiB0aGVpcgogIC8vLyBlbGVtZW50IHR5cGUuCiAgZmluYWwgU2V0PFNlbGVjdG9yPiByZXR1cm5zTGlzdEVsZW1lbnRUeXBlU2V0ID0KICAgICAgbmV3IFNldDxTZWxlY3Rvcj4uZnJvbSg8U2VsZWN0b3I+WwogICAgbmV3IFNlbGVjdG9yLmdldHRlcihjb25zdCBQdWJsaWNOYW1lKCdmaXJzdCcpKSwKICAgIG5ldyBTZWxlY3Rvci5nZXR0ZXIoY29uc3QgUHVibGljTmFtZSgnbGFzdCcpKSwKICAgIG5ldyBTZWxlY3Rvci5nZXR0ZXIoY29uc3QgUHVibGljTmFtZSgnc2luZ2xlJykpLAogICAgbmV3IFNlbGVjdG9yLmNhbGwoY29uc3QgUHVibGljTmFtZSgnc2luZ2xlV2hlcmUnKSwgQ2FsbFN0cnVjdHVyZS5PTkVfQVJHKSwKICAgIG5ldyBTZWxlY3Rvci5jYWxsKGNvbnN0IFB1YmxpY05hbWUoJ2VsZW1lbnRBdCcpLCBDYWxsU3RydWN0dXJlLk9ORV9BUkcpLAogICAgbmV3IFNlbGVjdG9yLmluZGV4KCksCiAgICBuZXcgU2VsZWN0b3IuY2FsbChjb25zdCBQdWJsaWNOYW1lKCdyZW1vdmVBdCcpLCBDYWxsU3RydWN0dXJlLk9ORV9BUkcpLAogICAgbmV3IFNlbGVjdG9yLmNhbGwoY29uc3QgUHVibGljTmFtZSgncmVtb3ZlTGFzdCcpLCBDYWxsU3RydWN0dXJlLk5PX0FSR1MpCiAgXSk7CgogIENvbXBpbGVyT3B0aW9ucyBnZXQgb3B0aW9uczsKCiAgLy8vIFRoZSBbSkNsb3NlZFdvcmxkXSBvbiB3aGljaCBpbmZlcmVuY2UgcmVhc29uaW5nIGlzIGJhc2VkLgogIEpDbG9zZWRXb3JsZCBnZXQgY2xvc2VkV29ybGQ7CiAgRGlhZ25vc3RpY1JlcG9ydGVyIGdldCByZXBvcnRlcjsKICBBYnN0cmFjdFZhbHVlRG9tYWluIGdldCBhYnN0cmFjdFZhbHVlRG9tYWluID0+CiAgICAgIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CiAgQ29tbW9uRWxlbWVudHMgZ2V0IGNvbW1vbkVsZW1lbnRzID0+IGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzOwoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGlzIHNob3VsZCBiZSBwYXJ0IG9mIFtDbG9zZWRXb3JsZF0gb3IKICAvLyBbQ2xvc3VyZVdvcmxkUmVmaW5lcl0uCiAgTm9TdWNoTWV0aG9kRGF0YSBnZXQgbm9TdWNoTWV0aG9kRGF0YSA9PiBjbG9zZWRXb3JsZC5ub1N1Y2hNZXRob2REYXRhOwoKICBUeXBlU3lzdGVtIGdldCB0eXBlczsKICBNYXA8aXIuVHJlZU5vZGUsIFR5cGVJbmZvcm1hdGlvbj4gZ2V0IGNvbmNyZXRlVHlwZXM7CiAgSW5mZXJyZWREYXRhQnVpbGRlciBnZXQgaW5mZXJyZWREYXRhQnVpbGRlcjsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IG1haW5FbGVtZW50OwoKICB2b2lkIHJ1bk92ZXJBbGxFbGVtZW50cygpOwoKICB2b2lkIGFuYWx5emUoTWVtYmVyRW50aXR5IG1lbWJlcik7CiAgdm9pZCBhbmFseXplTGlzdEFuZEVucXVldWUoTGlzdFR5cGVJbmZvcm1hdGlvbiBpbmZvKTsKICB2b2lkIGFuYWx5emVTZXRBbmRFbnF1ZXVlKFNldFR5cGVJbmZvcm1hdGlvbiBpbmZvKTsKICB2b2lkIGFuYWx5emVNYXBBbmRFbnF1ZXVlKE1hcFR5cGVJbmZvcm1hdGlvbiBpbmZvKTsKCiAgLy8vIE5vdGlmaWVzIHRvIHRoZSBpbmZlcnJlciB0aGF0IFthbmFseXplZEVsZW1lbnRdIGNhbiBoYXZlIHJldHVybiB0eXBlCiAgLy8vIFtuZXdUeXBlXS4gW2N1cnJlbnRUeXBlXSBpcyB0aGUgdHlwZSB0aGUgaW5mZXJlbmNlIGhhcyBjdXJyZW50bHkgZm91bmQuCiAgLy8vCiAgLy8vIFJldHVybnMgdGhlIG5ldyB0eXBlIGZvciBbYW5hbHl6ZWRFbGVtZW50XS4KICBUeXBlSW5mb3JtYXRpb24gYWRkUmV0dXJuVHlwZUZvck1ldGhvZCgKICAgICAgRnVuY3Rpb25FbnRpdHkgZWxlbWVudCwgVHlwZUluZm9ybWF0aW9uIHVudXNlZCwgVHlwZUluZm9ybWF0aW9uIG5ld1R5cGUpOwoKICAvLy8gQXBwbGllcyBbZl0gdG8gYWxsIGVsZW1lbnRzIGluIHRoZSB1bml2ZXJzZSB0aGF0IG1hdGNoIFtzZWxlY3Rvcl0gYW5kCiAgLy8vIFttYXNrXS4gSWYgW2ZdIHJldHVybnMgZmFsc2UsIGFib3J0cyB0aGUgaXRlcmF0aW9uLgogIHZvaWQgZm9yRWFjaEVsZW1lbnRNYXRjaGluZygKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgbWFzaywgYm9vbCBmKE1lbWJlckVudGl0eSBlbGVtZW50KSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbVHlwZUluZm9ybWF0aW9uXSBub2RlIGZvciB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIHBhcmFtZXRlci4KICAvLy8gSWYgdGhpcyBpcyBxdWVyaWVkIGJlZm9yZSBpdCBpcyBzZXQgYnkgW3NldERlZmF1bHRUeXBlT2ZQYXJhbWV0ZXJdLCBhCiAgLy8vIFtQbGFjZWhvbGRlclR5cGVJbmZvcm1hdGlvbl0gaXMgcmV0dXJuZWQsIHdoaWNoIHdpbGwgbGF0ZXIgYmUgcmVwbGFjZWQKICAvLy8gYnkgdGhlIGFjdHVhbCBub2RlIHdoZW4gW3NldERlZmF1bHRUeXBlT2ZQYXJhbWV0ZXJdIGlzIGNhbGxlZC4KICAvLy8KICAvLy8gSW52YXJpYW50OiBBZnRlciBncmFwaCBjb25zdHJ1Y3Rpb24sIG5vIFtQbGFjZWhvbGRlclR5cGVJbmZvcm1hdGlvbl0gbm9kZXMKICAvLy8gc2hvdWxkIGJlIHByZXNlbnQgYW5kIGEgZGVmYXVsdCB0eXBlIGZvciBlYWNoIHBhcmFtZXRlciBzaG91bGQgZXhpc3QuCiAgVHlwZUluZm9ybWF0aW9uIGdldERlZmF1bHRUeXBlT2ZQYXJhbWV0ZXIoTG9jYWwgcGFyYW1ldGVyKTsKCiAgLy8vIFRoaXMgaGVscGVyIGJyZWFrcyBhYnN0cmFjdGlvbnMgYnV0IGlzIGN1cnJlbnRseSByZXF1aXJlZCB0byB3b3JrIGFyb3VuZAogIC8vLyB0aGUgd3JvbmcgbW9kZWxpbmcgb2YgZGVmYXVsdCB2YWx1ZXMgb2Ygb3B0aW9uYWwgcGFyYW1ldGVycyBvZgogIC8vLyBzeW50aGV0aWMgY29uc3RydWN0b3JzLgogIC8vLwogIC8vLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgb25jZSBkZWZhdWx0IHZhbHVlcyBvZiBzeW50aGV0aWMgcGFyYW1ldGVycwogIC8vLyBhcmUgZml4ZWQuCiAgYm9vbCBoYXNBbHJlYWR5Q29tcHV0ZWRUeXBlT2ZQYXJhbWV0ZXJEZWZhdWx0KExvY2FsIHBhcmFtZXRlcik7CgogIC8vLyBTZXRzIHRoZSB0eXBlIG9mIGEgcGFyYW1ldGVyJ3MgZGVmYXVsdCB2YWx1ZSB0byBbdHlwZV0uIElmIHRoZSBnbG9iYWwKICAvLy8gbWFwcGluZyBpbiBbZGVmYXVsdFR5cGVPZlBhcmFtZXRlcl0gYWxyZWFkeSBjb250YWlucyBhIHR5cGUsIGl0IG11c3QgYmUKICAvLy8gYSBbUGxhY2Vob2xkZXJUeXBlSW5mb3JtYXRpb25dLCB3aGljaCB3aWxsIGJlIHJlcGxhY2VkLiBBbGwgaXRzIHVzZXMgYXJlCiAgLy8vIHVwZGF0ZWQuCiAgdm9pZCBzZXREZWZhdWx0VHlwZU9mUGFyYW1ldGVyKExvY2FsIHBhcmFtZXRlciwgVHlwZUluZm9ybWF0aW9uIHR5cGUsCiAgICAgIHtib29sIGlzSW5zdGFuY2VNZW1iZXJ9KTsKCiAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBnZXRDYWxsZXJzT2ZGb3JUZXN0aW5nKE1lbWJlckVudGl0eSBlbGVtZW50KTsKCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWFrZSB0aGlzIHByaXZhdGUgYWdhaW4uCiAgR2xvYmFsVHlwZUluZmVyZW5jZUVsZW1lbnREYXRhIGRhdGFPZk1lbWJlcihNZW1iZXJFbnRpdHkgZWxlbWVudCk7CgogIGJvb2wgY2hlY2tJZkV4cG9zZXNUaGlzKENvbnN0cnVjdG9yRW50aXR5IGVsZW1lbnQpOwoKICB2b2lkIHJlY29yZEV4cG9zZXNUaGlzKENvbnN0cnVjdG9yRW50aXR5IGVsZW1lbnQsIGJvb2wgZXhwb3Nlc1RoaXMpOwoKICAvLy8gUmVjb3JkcyB0aGF0IHRoZSByZXR1cm4gdHlwZSBbZWxlbWVudF0gaXMgb2YgdHlwZSBbdHlwZV0uCiAgdm9pZCByZWNvcmRSZXR1cm5UeXBlKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQsIFR5cGVJbmZvcm1hdGlvbiB0eXBlKTsKCiAgLy8vIFJlY29yZHMgdGhhdCBbZWxlbWVudF0gaXMgb2YgdHlwZSBbdHlwZV0uCiAgdm9pZCByZWNvcmRUeXBlT2ZGaWVsZChGaWVsZEVudGl0eSBlbGVtZW50LCBUeXBlSW5mb3JtYXRpb24gdHlwZSk7CgogIC8vLyBSZWdpc3RlcnMgYSBjYWxsIHRvIGF3YWl0IHdpdGggYW4gZXhwcmVzc2lvbiBvZiB0eXBlIFthcmd1bWVudFR5cGVdIGFzCiAgLy8vIGFyZ3VtZW50LgogIFR5cGVJbmZvcm1hdGlvbiByZWdpc3RlckF3YWl0KGlyLk5vZGUgbm9kZSwgVHlwZUluZm9ybWF0aW9uIGFyZ3VtZW50KTsKCiAgLy8vIFJlZ2lzdGVycyBhIGNhbGwgdG8geWllbGQgd2l0aCBhbiBleHByZXNzaW9uIG9mIHR5cGUgW2FyZ3VtZW50VHlwZV0gYXMKICAvLy8gYXJndW1lbnQuCiAgVHlwZUluZm9ybWF0aW9uIHJlZ2lzdGVyWWllbGQoaXIuTm9kZSBub2RlLCBUeXBlSW5mb3JtYXRpb24gYXJndW1lbnQpOwoKICAvLy8gUmVnaXN0ZXJzIHRoYXQgW2NhbGxlcl0gY2FsbHMgW2Nsb3N1cmVdIHdpdGggW2FyZ3VtZW50c10uCiAgLy8vCiAgLy8vIFtzaWRlRWZmZWN0c0J1aWxkZXJdIHdpbGwgYmUgdXBkYXRlZCB0byBpbmNvcnBvcmF0ZSB0aGUgcG90ZW50aWFsIGNhbGxlZXMnCiAgLy8vIHNpZGUgZWZmZWN0cy4KICAvLy8KICAvLy8gW2luTG9vcF0gdGVsbHMgd2hldGhlciB0aGUgY2FsbCBoYXBwZW5zIGluIGEgbG9vcC4KICBUeXBlSW5mb3JtYXRpb24gcmVnaXN0ZXJDYWxsZWRDbG9zdXJlKAogICAgICBpci5Ob2RlIG5vZGUsCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBBYnN0cmFjdFZhbHVlIG1hc2ssCiAgICAgIFR5cGVJbmZvcm1hdGlvbiBjbG9zdXJlLAogICAgICBNZW1iZXJFbnRpdHkgY2FsbGVyLAogICAgICBBcmd1bWVudHNUeXBlcyBhcmd1bWVudHMsCiAgICAgIFNpZGVFZmZlY3RzQnVpbGRlciBzaWRlRWZmZWN0c0J1aWxkZXIsCiAgICAgIHtib29sIGluTG9vcH0pOwoKICAvLy8gUmVnaXN0ZXJzIHRoYXQgW2NhbGxlcl0gY2FsbHMgW2NhbGxlZV0gYXQgbG9jYXRpb24gW25vZGVdLCB3aXRoCiAgLy8vIFtzZWxlY3Rvcl0sIGFuZCBbYXJndW1lbnRzXS4gTm90ZSB0aGF0IFtzZWxlY3Rvcl0gaXMgbnVsbCBmb3IgZm9yd2FyZGluZwogIC8vLyBjb25zdHJ1Y3RvcnMuCiAgLy8vCiAgLy8vIFtzaWRlRWZmZWN0c0J1aWxkZXJdIHdpbGwgYmUgdXBkYXRlZCB0byBpbmNvcnBvcmF0ZSBbY2FsbGVlXSdzIHNpZGUKICAvLy8gZWZmZWN0cy4KICAvLy8KICAvLy8gW2luTG9vcF0gdGVsbHMgd2hldGhlciB0aGUgY2FsbCBoYXBwZW5zIGluIGEgbG9vcC4KICBUeXBlSW5mb3JtYXRpb24gcmVnaXN0ZXJDYWxsZWRNZW1iZXIoCiAgICAgIE9iamVjdCBub2RlLAogICAgICBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrLAogICAgICBNZW1iZXJFbnRpdHkgY2FsbGVyLAogICAgICBNZW1iZXJFbnRpdHkgY2FsbGVlLAogICAgICBBcmd1bWVudHNUeXBlcyBhcmd1bWVudHMsCiAgICAgIFNpZGVFZmZlY3RzQnVpbGRlciBzaWRlRWZmZWN0c0J1aWxkZXIsCiAgICAgIGJvb2wgaW5Mb29wKTsKCiAgLy8vIFJlZ2lzdGVycyB0aGF0IFtjYWxsZXJdIGNhbGxzIFtzZWxlY3Rvcl0gd2l0aCBbcmVjZWl2ZXJUeXBlXSBhcyByZWNlaXZlciwKICAvLy8gYW5kIFthcmd1bWVudHNdLgogIC8vLwogIC8vLyBbc2lkZUVmZmVjdHNCdWlsZGVyXSB3aWxsIGJlIHVwZGF0ZWQgdG8gaW5jb3Jwb3JhdGUgdGhlIHBvdGVudGlhbCBjYWxsZWVzJwogIC8vLyBzaWRlIGVmZmVjdHMuCiAgLy8vCiAgLy8vIFtpbkxvb3BdIHRlbGxzIHdoZXRoZXIgdGhlIGNhbGwgaGFwcGVucyBpbiBhIGxvb3AuCiAgVHlwZUluZm9ybWF0aW9uIHJlZ2lzdGVyQ2FsbGVkU2VsZWN0b3IoCiAgICAgIENhbGxUeXBlIGNhbGxUeXBlLAogICAgICBpci5Ob2RlIG5vZGUsCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBBYnN0cmFjdFZhbHVlIG1hc2ssCiAgICAgIFR5cGVJbmZvcm1hdGlvbiByZWNlaXZlclR5cGUsCiAgICAgIE1lbWJlckVudGl0eSBjYWxsZXIsCiAgICAgIEFyZ3VtZW50c1R5cGVzIGFyZ3VtZW50cywKICAgICAgU2lkZUVmZmVjdHNCdWlsZGVyIHNpZGVFZmZlY3RzQnVpbGRlciwKICAgICAge2Jvb2wgaW5Mb29wLAogICAgICBib29sIGlzQ29uZGl0aW9uYWx9KTsKCiAgLy8vIFVwZGF0ZSB0aGUgYXNzaWdubWVudHMgdG8gcGFyYW1ldGVycyBpbiB0aGUgZ3JhcGguIFtyZW1vdmVdIHRlbGxzIHdoZXRoZXIKICAvLy8gYXNzaWdubWVudHMgbXVzdCBiZSBhZGRlZCBvciByZW1vdmVkLiBJZiBbaW5pdF0gaXMgZmFsc2UsIHBhcmFtZXRlcnMgYXJlCiAgLy8vIGFkZGVkIHRvIHRoZSB3b3JrIHF1ZXVlLgogIHZvaWQgdXBkYXRlUGFyYW1ldGVyQXNzaWdubWVudHMoVHlwZUluZm9ybWF0aW9uIGNhbGxlciwgTWVtYmVyRW50aXR5IGNhbGxlZSwKICAgICAgQXJndW1lbnRzVHlwZXMgYXJndW1lbnRzLCBTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSBtYXNrLAogICAgICB7Ym9vbCByZW1vdmUsIGJvb2wgYWRkVG9RdWV1ZTogdHJ1ZX0pOwoKICB2b2lkIHVwZGF0ZVNlbGVjdG9ySW5NZW1iZXIoTWVtYmVyRW50aXR5IG93bmVyLCBDYWxsVHlwZSBjYWxsVHlwZSwKICAgICAgaXIuTm9kZSBub2RlLCBTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSBtYXNrKTsKCiAgLy8vIFJldHVybnMgdGhlIHJldHVybiB0eXBlIG9mIFtlbGVtZW50XS4KICBUeXBlSW5mb3JtYXRpb24gcmV0dXJuVHlwZU9mTWVtYmVyKE1lbWJlckVudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgW2VsZW1lbnRdIHdoZW4gYmVpbmcgY2FsbGVkIHdpdGggW3NlbGVjdG9yXS4KICBUeXBlSW5mb3JtYXRpb24gdHlwZU9mTWVtYmVyV2l0aFNlbGVjdG9yKAogICAgICBNZW1iZXJFbnRpdHkgZWxlbWVudCwgU2VsZWN0b3Igc2VsZWN0b3IpOwoKICAvLy8gUmV0dXJucyB0aGUgdHlwZSBvZiBbZWxlbWVudF0uCiAgVHlwZUluZm9ybWF0aW9uIHR5cGVPZk1lbWJlcihNZW1iZXJFbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZXR1cm5zIHRoZSB0eXBlIG9mIFtlbGVtZW50XS4KICBUeXBlSW5mb3JtYXRpb24gdHlwZU9mUGFyYW1ldGVyKExvY2FsIGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyB0aGUgdHlwZSBmb3IgW25hdGl2ZUJlaGF2aW9yXS4gU2VlIGRvY3VtZW50YXRpb24gb24KICAvLy8gW05hdGl2ZUJlaGF2aW9yXS4KICBUeXBlSW5mb3JtYXRpb24gdHlwZU9mTmF0aXZlQmVoYXZpb3IoTmF0aXZlQmVoYXZpb3IgbmF0aXZlQmVoYXZpb3IpOwoKICBib29sIHJldHVybnNMaXN0RWxlbWVudFR5cGUoU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgbWFzayk7CgogIGJvb2wgcmV0dXJuc01hcFZhbHVlVHlwZShTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSBtYXNrKTsKCiAgdm9pZCBjbG9zZSgpOwoKICB2b2lkIGNsZWFyKCk7CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgZ2xvYmFsIG9wdGltaXphdGlvbnMgc3VjaCBhcyB0eXBlIGluZmVyZW5jaW5nIGNhbiBhcHBseSB0bwogIC8vLyB0aGUgZmllbGQgW2VsZW1lbnRdLgogIC8vLwogIC8vLyBPbmUgY2F0ZWdvcnkgb2YgZWxlbWVudHMgdGhhdCBkbyBub3QgYXBwbHkgaXMgcnVudGltZSBoZWxwZXJzIHRoYXQgdGhlCiAgLy8vIGJhY2tlbmQgY2FsbHMsIGJ1dCB0aGUgb3B0aW1pemF0aW9ucyBkb24ndCBzZWUgdGhvc2UgY2FsbHMuCiAgYm9vbCBjYW5GaWVsZEJlVXNlZEZvckdsb2JhbE9wdGltaXphdGlvbnMoRmllbGRFbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgZ2xvYmFsIG9wdGltaXphdGlvbnMgc3VjaCBhcyB0eXBlIGluZmVyZW5jaW5nIGNhbiBhcHBseSB0bwogIC8vLyB0aGUgcGFyYW1ldGVyIFtlbGVtZW50XS4KICAvLy8KICAvLy8gT25lIGNhdGVnb3J5IG9mIGVsZW1lbnRzIHRoYXQgZG8gbm90IGFwcGx5IGlzIHJ1bnRpbWUgaGVscGVycyB0aGF0IHRoZQogIC8vLyBiYWNrZW5kIGNhbGxzLCBidXQgdGhlIG9wdGltaXphdGlvbnMgZG9uJ3Qgc2VlIHRob3NlIGNhbGxzLgogIGJvb2wgY2FuRnVuY3Rpb25QYXJhbWV0ZXJzQmVVc2VkRm9yR2xvYmFsT3B0aW1pemF0aW9ucygKICAgICAgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgaW5mZXJlbmNlIG9mIHBhcmFtZXRlciB0eXBlcyBpcyBkaXNhYmxlZCBmb3IgW21lbWJlcl0uCiAgYm9vbCBhc3N1bWVEeW5hbWljKE1lbWJlckVudGl0eSBtZW1iZXIpOwp9CgpjbGFzcyBJbmZlcnJlckVuZ2luZUltcGwgZXh0ZW5kcyBJbmZlcnJlckVuZ2luZSB7CiAgZmluYWwgTWFwPExvY2FsLCBUeXBlSW5mb3JtYXRpb24+IGRlZmF1bHRUeXBlT2ZQYXJhbWV0ZXIgPQogICAgICBuZXcgTWFwPExvY2FsLCBUeXBlSW5mb3JtYXRpb24+KCk7CiAgZmluYWwgV29ya1F1ZXVlIHdvcmtRdWV1ZSA9IG5ldyBXb3JrUXVldWUoKTsKICBAb3ZlcnJpZGUKICBmaW5hbCBGdW5jdGlvbkVudGl0eSBtYWluRWxlbWVudDsKICBmaW5hbCBTZXQ8TWVtYmVyRW50aXR5PiBhbmFseXplZEVsZW1lbnRzID0gbmV3IFNldDxNZW1iZXJFbnRpdHk+KCk7CgogIC8vLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgd2UgYWxsb3cgYSBub2RlIGluIHRoZSBncmFwaCB0bwogIC8vLyBjaGFuZ2UgdHlwZXMuIElmIGEgbm9kZSByZWFjaGVzIHRoYXQgbGltaXQsIHdlIGdpdmUgdXAKICAvLy8gaW5mZXJlbmNpbmcgb24gaXQgYW5kIGdpdmUgaXQgdGhlIGR5bmFtaWMgdHlwZS4KICBmaW5hbCBpbnQgTUFYX0NIQU5HRV9DT1VOVCA9IDY7CgogIGludCBvdmVyYWxsUmVmaW5lQ291bnQgPSAwOwogIGludCBhZGRlZEluR3JhcGggPSAwOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBDb21waWxlck9wdGlvbnMgb3B0aW9uczsKICBmaW5hbCBQcm9ncmVzcyBwcm9ncmVzczsKICBAb3ZlcnJpZGUKICBmaW5hbCBEaWFnbm9zdGljUmVwb3J0ZXIgcmVwb3J0ZXI7CiAgZmluYWwgQ29tcGlsZXJPdXRwdXQgX2NvbXBpbGVyT3V0cHV0OwoKICBAb3ZlcnJpZGUKICBmaW5hbCBKc0Nsb3NlZFdvcmxkIGNsb3NlZFdvcmxkOwogIEBvdmVycmlkZQogIGZpbmFsIEluZmVycmVkRGF0YUJ1aWxkZXIgaW5mZXJyZWREYXRhQnVpbGRlcjsKCiAgQG92ZXJyaWRlCiAgZmluYWwgVHlwZVN5c3RlbSB0eXBlczsKICBAb3ZlcnJpZGUKICBmaW5hbCBNYXA8aXIuVHJlZU5vZGUsIFR5cGVJbmZvcm1hdGlvbj4gY29uY3JldGVUeXBlcyA9CiAgICAgIG5ldyBNYXA8aXIuVHJlZU5vZGUsIFR5cGVJbmZvcm1hdGlvbj4oKTsKCiAgZmluYWwgU2V0PENvbnN0cnVjdG9yRW50aXR5PiBnZW5lcmF0aXZlQ29uc3RydWN0b3JzRXhwb3NpbmdUaGlzID0KICAgICAgbmV3IFNldDxDb25zdHJ1Y3RvckVudGl0eT4oKTsKCiAgLy8vIERhdGEgY29tcHV0ZWQgaW50ZXJuYWxseSB3aXRoaW4gZWxlbWVudHMsIGxpa2UgdGhlIHR5cGUtbWFzayBvZiBhIHNlbmQgYQogIC8vLyBsaXN0IGFsbG9jYXRpb24sIG9yIGEgZm9yLWluIGxvb3AuCiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwgR2xvYmFsVHlwZUluZmVyZW5jZUVsZW1lbnREYXRhPiBfbWVtYmVyRGF0YSA9CiAgICAgIG5ldyBNYXA8TWVtYmVyRW50aXR5LCBHbG9iYWxUeXBlSW5mZXJlbmNlRWxlbWVudERhdGE+KCk7CgogIGZpbmFsIE5vU3VjaE1ldGhvZFJlZ2lzdHJ5IG5vU3VjaE1ldGhvZFJlZ2lzdHJ5OwoKICBJbmZlcnJlckVuZ2luZUltcGwoCiAgICAgIHRoaXMub3B0aW9ucywKICAgICAgdGhpcy5wcm9ncmVzcywKICAgICAgdGhpcy5yZXBvcnRlciwKICAgICAgdGhpcy5fY29tcGlsZXJPdXRwdXQsCiAgICAgIHRoaXMuY2xvc2VkV29ybGQsCiAgICAgIHRoaXMubm9TdWNoTWV0aG9kUmVnaXN0cnksCiAgICAgIHRoaXMubWFpbkVsZW1lbnQsCiAgICAgIHRoaXMuaW5mZXJyZWREYXRhQnVpbGRlcikKICAgICAgOiB0aGlzLnR5cGVzID0gbmV3IFR5cGVTeXN0ZW0oCiAgICAgICAgICAgIGNsb3NlZFdvcmxkLCBuZXcgS2VybmVsVHlwZVN5c3RlbVN0cmF0ZWd5KGNsb3NlZFdvcmxkKSk7CgogIEVsZW1lbnRFbnZpcm9ubWVudCBnZXQgX2VsZW1lbnRFbnZpcm9ubWVudCA9PiBjbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQ7CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaEVsZW1lbnRNYXRjaGluZygKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgbWFzaywgYm9vbCBmKE1lbWJlckVudGl0eSBlbGVtZW50KSkgewogICAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBlbGVtZW50cyA9IGNsb3NlZFdvcmxkLmxvY2F0ZU1lbWJlcnMoc2VsZWN0b3IsIG1hc2spOwogICAgZm9yIChNZW1iZXJFbnRpdHkgZSBpbiBlbGVtZW50cykgewogICAgICBpZiAoIWYoZSkpIHJldHVybjsKICAgIH0KICB9CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IE1ha2UgdGhpcyBwcml2YXRlIGFnYWluLgogIEBvdmVycmlkZQogIEdsb2JhbFR5cGVJbmZlcmVuY2VFbGVtZW50RGF0YSBkYXRhT2ZNZW1iZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQpID0+CiAgICAgIF9tZW1iZXJEYXRhW2VsZW1lbnRdID8/PSBuZXcgS2VybmVsR2xvYmFsVHlwZUluZmVyZW5jZUVsZW1lbnREYXRhKCk7CgogIC8vLyBVcGRhdGUgW3NpZGVFZmZlY3RzXSB3aXRoIHRoZSBzaWRlIGVmZmVjdHMgb2YgW2NhbGxlZV0gYmVpbmcKICAvLy8gY2FsbGVkIHdpdGggW3NlbGVjdG9yXS4KICB2b2lkIHVwZGF0ZVNpZGVFZmZlY3RzKFNpZGVFZmZlY3RzQnVpbGRlciBzaWRlRWZmZWN0c0J1aWxkZXIsCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLCBNZW1iZXJFbnRpdHkgY2FsbGVlKSB7CiAgICBpZiAoY2FsbGVlLmlzRmllbGQpIHsKICAgICAgaWYgKGNhbGxlZS5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgICAgaWYgKHNlbGVjdG9yLmlzU2V0dGVyKSB7CiAgICAgICAgICBzaWRlRWZmZWN0c0J1aWxkZXIuc2V0Q2hhbmdlc0luc3RhbmNlUHJvcGVydHkoKTsKICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmlzR2V0dGVyKSB7CiAgICAgICAgICBzaWRlRWZmZWN0c0J1aWxkZXIuc2V0RGVwZW5kc09uSW5zdGFuY2VQcm9wZXJ0eVN0b3JlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNpZGVFZmZlY3RzQnVpbGRlci5zZXRBbGxTaWRlRWZmZWN0c0FuZERlcGVuZHNPblNvbWV0aGluZygpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoc2VsZWN0b3IuaXNTZXR0ZXIpIHsKICAgICAgICAgIHNpZGVFZmZlY3RzQnVpbGRlci5zZXRDaGFuZ2VzU3RhdGljUHJvcGVydHkoKTsKICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmlzR2V0dGVyKSB7CiAgICAgICAgICBzaWRlRWZmZWN0c0J1aWxkZXIuc2V0RGVwZW5kc09uU3RhdGljUHJvcGVydHlTdG9yZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzaWRlRWZmZWN0c0J1aWxkZXIuc2V0QWxsU2lkZUVmZmVjdHNBbmREZXBlbmRzT25Tb21ldGhpbmcoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY2FsbGVlLmlzR2V0dGVyICYmICFzZWxlY3Rvci5pc0dldHRlcikgewogICAgICBzaWRlRWZmZWN0c0J1aWxkZXIuc2V0QWxsU2lkZUVmZmVjdHNBbmREZXBlbmRzT25Tb21ldGhpbmcoKTsKICAgIH0gZWxzZSB7CiAgICAgIHNpZGVFZmZlY3RzQnVpbGRlcgogICAgICAgICAgLmFkZElucHV0KGluZmVycmVkRGF0YUJ1aWxkZXIuZ2V0U2lkZUVmZmVjdHNCdWlsZGVyKGNhbGxlZSkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHR5cGVPZk5hdGl2ZUJlaGF2aW9yKE5hdGl2ZUJlaGF2aW9yIG5hdGl2ZUJlaGF2aW9yKSB7CiAgICBpZiAobmF0aXZlQmVoYXZpb3IgPT0gbnVsbCkgcmV0dXJuIHR5cGVzLmR5bmFtaWNUeXBlOwogICAgTGlzdCB0eXBlc1JldHVybmVkID0gbmF0aXZlQmVoYXZpb3IudHlwZXNSZXR1cm5lZDsKICAgIGlmICh0eXBlc1JldHVybmVkLmlzRW1wdHkpIHJldHVybiB0eXBlcy5keW5hbWljVHlwZTsKICAgIFR5cGVJbmZvcm1hdGlvbiByZXR1cm5UeXBlOwogICAgZm9yICh2YXIgdHlwZSBpbiB0eXBlc1JldHVybmVkKSB7CiAgICAgIFR5cGVJbmZvcm1hdGlvbiBtYXBwZWRUeXBlOwogICAgICBpZiAodHlwZSA9PSBTcGVjaWFsVHlwZS5Kc09iamVjdCkgewogICAgICAgIG1hcHBlZFR5cGUgPSB0eXBlcy5ub25OdWxsRXhhY3QoY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MpOwogICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gY29tbW9uRWxlbWVudHMuc3RyaW5nVHlwZSkgewogICAgICAgIG1hcHBlZFR5cGUgPSB0eXBlcy5zdHJpbmdUeXBlOwogICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gY29tbW9uRWxlbWVudHMuaW50VHlwZSkgewogICAgICAgIG1hcHBlZFR5cGUgPSB0eXBlcy5pbnRUeXBlOwogICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gY29tbW9uRWxlbWVudHMubnVtVHlwZSB8fAogICAgICAgICAgdHlwZSA9PSBjb21tb25FbGVtZW50cy5kb3VibGVUeXBlKSB7CiAgICAgICAgLy8gTm90ZTogdGhlIGJhY2tlbmQgZG91YmxlIGNsYXNzIGlzIHNwZWNpZmljYWxseSBmb3Igbm9uLWludGVnZXIKICAgICAgICAvLyBkb3VibGVzLCBhbmQgYSBuYXRpdmUgYmVoYXZpb3IgcmV0dXJuaW5nICdkb3VibGUnIGRvZXMgbm90IGd1YXJhbnRlZQogICAgICAgIC8vIGEgbm9uLWludGVnZXIgcmV0dXJuIHR5cGUsIHNvIHdlIHJldHVybiB0aGUgbnVtYmVyIHR5cGUgZm9yIHRob3NlLgogICAgICAgIG1hcHBlZFR5cGUgPSB0eXBlcy5udW1UeXBlOwogICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gY29tbW9uRWxlbWVudHMuYm9vbFR5cGUpIHsKICAgICAgICBtYXBwZWRUeXBlID0gdHlwZXMuYm9vbFR5cGU7CiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBjb21tb25FbGVtZW50cy5udWxsVHlwZSkgewogICAgICAgIG1hcHBlZFR5cGUgPSB0eXBlcy5udWxsVHlwZTsKICAgICAgfSBlbHNlIGlmICh0eXBlLmlzVm9pZCkgewogICAgICAgIG1hcHBlZFR5cGUgPSB0eXBlcy5udWxsVHlwZTsKICAgICAgfSBlbHNlIGlmICh0eXBlLmlzRHluYW1pYykgewogICAgICAgIHJldHVybiB0eXBlcy5keW5hbWljVHlwZTsKICAgICAgfSBlbHNlIGlmICh0eXBlLmlzSW50ZXJmYWNlVHlwZSkgewogICAgICAgIG1hcHBlZFR5cGUgPSB0eXBlcy5ub25OdWxsU3VidHlwZSh0eXBlLmVsZW1lbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIG1hcHBlZFR5cGUgPSB0eXBlcy5keW5hbWljVHlwZTsKICAgICAgfQogICAgICByZXR1cm5UeXBlID0gdHlwZXMuY29tcHV0ZUxVQihyZXR1cm5UeXBlLCBtYXBwZWRUeXBlKTsKICAgICAgaWYgKHJldHVyblR5cGUgPT0gdHlwZXMuZHluYW1pY1R5cGUpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJldHVyblR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHVwZGF0ZVNlbGVjdG9ySW5NZW1iZXIoTWVtYmVyRW50aXR5IG93bmVyLCBDYWxsVHlwZSBjYWxsVHlwZSwKICAgICAgaXIuTm9kZSBub2RlLCBTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSBtYXNrKSB7CiAgICBLZXJuZWxHbG9iYWxUeXBlSW5mZXJlbmNlRWxlbWVudERhdGEgZGF0YSA9IGRhdGFPZk1lbWJlcihvd25lcik7CiAgICBhc3NlcnQodmFsaWRDYWxsVHlwZShjYWxsVHlwZSwgbm9kZSkpOwogICAgc3dpdGNoIChjYWxsVHlwZSkgewogICAgICBjYXNlIENhbGxUeXBlLmFjY2VzczoKICAgICAgICBkYXRhLnNldFR5cGVNYXNrKG5vZGUsIG1hc2spOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENhbGxUeXBlLmZvckluOgogICAgICAgIGlmIChzZWxlY3RvciA9PSBTZWxlY3RvcnMuaXRlcmF0b3IpIHsKICAgICAgICAgIGRhdGEuc2V0SXRlcmF0b3JUeXBlTWFzayhub2RlLCBtYXNrKTsKICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09IFNlbGVjdG9ycy5jdXJyZW50KSB7CiAgICAgICAgICBkYXRhLnNldEN1cnJlbnRUeXBlTWFzayhub2RlLCBtYXNrKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXNzZXJ0KHNlbGVjdG9yID09IFNlbGVjdG9ycy5tb3ZlTmV4dCk7CiAgICAgICAgICBkYXRhLnNldE1vdmVOZXh0VHlwZU1hc2sobm9kZSwgbWFzayk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjaGVja0lmRXhwb3Nlc1RoaXMoQ29uc3RydWN0b3JFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIGdlbmVyYXRpdmVDb25zdHJ1Y3RvcnNFeHBvc2luZ1RoaXMuY29udGFpbnMoZWxlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlY29yZEV4cG9zZXNUaGlzKENvbnN0cnVjdG9yRW50aXR5IGVsZW1lbnQsIGJvb2wgZXhwb3Nlc1RoaXMpIHsKICAgIGlmIChleHBvc2VzVGhpcykgewogICAgICBnZW5lcmF0aXZlQ29uc3RydWN0b3JzRXhwb3NpbmdUaGlzLmFkZChlbGVtZW50KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgcmV0dXJuc0xpc3RFbGVtZW50VHlwZShTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSBtYXNrKSB7CiAgICByZXR1cm4gbWFzayAhPSBudWxsICYmCiAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5pc0NvbnRhaW5lcihtYXNrKSAmJgogICAgICAgIHJldHVybnNMaXN0RWxlbWVudFR5cGVTZXQuY29udGFpbnMoc2VsZWN0b3IpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCByZXR1cm5zTWFwVmFsdWVUeXBlKFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIG1hc2spIHsKICAgIHJldHVybiBtYXNrICE9IG51bGwgJiYgYWJzdHJhY3RWYWx1ZURvbWFpbi5pc01hcChtYXNrKSAmJiBzZWxlY3Rvci5pc0luZGV4OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhbmFseXplTGlzdEFuZEVucXVldWUoTGlzdFR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBpZiAoaW5mby5hbmFseXplZCkgcmV0dXJuOwogICAgaW5mby5hbmFseXplZCA9IHRydWU7CgogICAgTGlzdFRyYWNlclZpc2l0b3IgdHJhY2VyID0gbmV3IExpc3RUcmFjZXJWaXNpdG9yKGluZm8sIHRoaXMpOwogICAgYm9vbCBzdWNjZWVkZWQgPSB0cmFjZXIucnVuKCk7CiAgICBpZiAoIXN1Y2NlZWRlZCkgcmV0dXJuOwoKICAgIGluZm8uYmFpbGVkT3V0ID0gZmFsc2U7CiAgICBpbmZvLmVsZW1lbnRUeXBlLmluZmVycmVkID0gdHJ1ZTsKICAgIGlmIChhYnN0cmFjdFZhbHVlRG9tYWluLmlzU3BlY2lhbGl6YXRpb25PZigKICAgICAgICBpbmZvLm9yaWdpbmFsVHlwZSwgYWJzdHJhY3RWYWx1ZURvbWFpbi5maXhlZExpc3RUeXBlKSkgewogICAgICBpbmZvLmNoZWNrc0dyb3dhYmxlID0gdHJhY2VyLmNhbGxzR3Jvd2FibGVNZXRob2Q7CiAgICB9CiAgICB0cmFjZXIuYXNzaWdubWVudHMuZm9yRWFjaChpbmZvLmVsZW1lbnRUeXBlLmFkZEFzc2lnbm1lbnQpOwogICAgLy8gRW5xdWV1ZSB0aGUgbGlzdCBmb3IgbGF0ZXIgcmVmaW5lbWVudAogICAgd29ya1F1ZXVlLmFkZChpbmZvKTsKICAgIHdvcmtRdWV1ZS5hZGQoaW5mby5lbGVtZW50VHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFuYWx5emVTZXRBbmRFbnF1ZXVlKFNldFR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBpZiAoaW5mby5hbmFseXplZCkgcmV0dXJuOwogICAgaW5mby5hbmFseXplZCA9IHRydWU7CgogICAgU2V0VHJhY2VyVmlzaXRvciB0cmFjZXIgPSBuZXcgU2V0VHJhY2VyVmlzaXRvcihpbmZvLCB0aGlzKTsKICAgIGJvb2wgc3VjY2VlZGVkID0gdHJhY2VyLnJ1bigpOwogICAgaWYgKCFzdWNjZWVkZWQpIHJldHVybjsKCiAgICBpbmZvLmJhaWxlZE91dCA9IGZhbHNlOwogICAgaW5mby5lbGVtZW50VHlwZS5pbmZlcnJlZCA9IHRydWU7CgogICAgdHJhY2VyLmFzc2lnbm1lbnRzLmZvckVhY2goaW5mby5lbGVtZW50VHlwZS5hZGRBc3NpZ25tZW50KTsKICAgIC8vIEVucXVldWUgdGhlIHNldCBmb3IgbGF0ZXIgcmVmaW5lbWVudC4KICAgIHdvcmtRdWV1ZS5hZGQoaW5mbyk7CiAgICB3b3JrUXVldWUuYWRkKGluZm8uZWxlbWVudFR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhbmFseXplTWFwQW5kRW5xdWV1ZShNYXBUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgaWYgKGluZm8uYW5hbHl6ZWQpIHJldHVybjsKICAgIGluZm8uYW5hbHl6ZWQgPSB0cnVlOwogICAgTWFwVHJhY2VyVmlzaXRvciB0cmFjZXIgPSBuZXcgTWFwVHJhY2VyVmlzaXRvcihpbmZvLCB0aGlzKTsKCiAgICBib29sIHN1Y2NlZWRlZCA9IHRyYWNlci5ydW4oKTsKICAgIGlmICghc3VjY2VlZGVkKSByZXR1cm47CgogICAgaW5mby5iYWlsZWRPdXQgPSBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJhY2VyLmtleUFzc2lnbm1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgIFR5cGVJbmZvcm1hdGlvbiBuZXdUeXBlID0gaW5mby5hZGRFbnRyeUFzc2lnbm1lbnQoYWJzdHJhY3RWYWx1ZURvbWFpbiwKICAgICAgICAgIHRyYWNlci5rZXlBc3NpZ25tZW50c1tpXSwgdHJhY2VyLnZhbHVlQXNzaWdubWVudHNbaV0pOwogICAgICBpZiAobmV3VHlwZSAhPSBudWxsKSB3b3JrUXVldWUuYWRkKG5ld1R5cGUpOwogICAgfQogICAgZm9yIChUeXBlSW5mb3JtYXRpb24gbWFwIGluIHRyYWNlci5tYXBBc3NpZ25tZW50cykgewogICAgICB3b3JrUXVldWUuYWRkQWxsKGluZm8uYWRkTWFwQXNzaWdubWVudChhYnN0cmFjdFZhbHVlRG9tYWluLCBtYXApKTsKICAgIH0KCiAgICBpbmZvLm1hcmtBc0luZmVycmVkKCk7CiAgICB3b3JrUXVldWUuYWRkKGluZm8ua2V5VHlwZSk7CiAgICB3b3JrUXVldWUuYWRkKGluZm8udmFsdWVUeXBlKTsKICAgIHdvcmtRdWV1ZS5hZGRBbGwoaW5mby50eXBlSW5mb01hcC52YWx1ZXMpOwogICAgd29ya1F1ZXVlLmFkZChpbmZvKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcnVuT3ZlckFsbEVsZW1lbnRzKCkgewogICAgYW5hbHl6ZUFsbEVsZW1lbnRzKCk7CiAgICBUeXBlR3JhcGhEdW1wIGR1bXAgPQogICAgICAgIGRlYnVnLlBSSU5UX0dSQVBIID8gbmV3IFR5cGVHcmFwaER1bXAoX2NvbXBpbGVyT3V0cHV0LCB0aGlzKSA6IG51bGw7CgogICAgZHVtcD8uYmVmb3JlQW5hbHlzaXMoKTsKICAgIGJ1aWxkV29ya1F1ZXVlKCk7CiAgICByZWZpbmUoKTsKCiAgICAvLyBUcnkgdG8gaW5mZXIgZWxlbWVudCB0eXBlcyBvZiBsaXN0cyBhbmQgY29tcHV0ZSB0aGVpciBlc2NhcGUgaW5mb3JtYXRpb24uCiAgICB0eXBlcy5hbGxvY2F0ZWRMaXN0cy52YWx1ZXMuZm9yRWFjaCgoVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgICAgYW5hbHl6ZUxpc3RBbmRFbnF1ZXVlKGluZm8pOwogICAgfSk7CgogICAgLy8gVHJ5IHRvIGluZmVyIGVsZW1lbnQgdHlwZXMgb2Ygc2V0cyBhbmQgY29tcHV0ZSB0aGVpciBlc2NhcGUgaW5mb3JtYXRpb24uCiAgICB0eXBlcy5hbGxvY2F0ZWRTZXRzLnZhbHVlcy5mb3JFYWNoKChUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgICBhbmFseXplU2V0QW5kRW5xdWV1ZShpbmZvKTsKICAgIH0pOwoKICAgIC8vIFRyeSB0byBpbmZlciB0aGUga2V5IGFuZCB2YWx1ZSB0eXBlcyBmb3IgbWFwcyBhbmQgY29tcHV0ZSB0aGUgdmFsdWVzJwogICAgLy8gZXNjYXBlIGluZm9ybWF0aW9uLgogICAgdHlwZXMuYWxsb2NhdGVkTWFwcy52YWx1ZXMuZm9yRWFjaCgoVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgICAgYW5hbHl6ZU1hcEFuZEVucXVldWUoaW5mbyk7CiAgICB9KTsKCiAgICBTZXQ8RnVuY3Rpb25FbnRpdHk+IGJhaWxlZE91dE9uID0gbmV3IFNldDxGdW5jdGlvbkVudGl0eT4oKTsKCiAgICAvLyBUcmFjZSBjbG9zdXJlcyB0byBwb3RlbnRpYWxseSBpbmZlciBhcmd1bWVudCB0eXBlcy4KICAgIHR5cGVzLmFsbG9jYXRlZENsb3N1cmVzLmZvckVhY2goKGR5bmFtaWMgaW5mbykgewogICAgICB2b2lkIHRyYWNlKAogICAgICAgICAgSXRlcmFibGU8RnVuY3Rpb25FbnRpdHk+IGVsZW1lbnRzLCBDbG9zdXJlVHJhY2VyVmlzaXRvciB0cmFjZXIpIHsKICAgICAgICB0cmFjZXIucnVuKCk7CiAgICAgICAgaWYgKCF0cmFjZXIuY29udGludWVBbmFseXppbmcpIHsKICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICAgICAgICAgICAgaW5mZXJyZWREYXRhQnVpbGRlci5yZWdpc3Rlck1pZ2h0QmVQYXNzZWRUb0FwcGx5KGVsZW1lbnQpOwogICAgICAgICAgICBpZiAoZGVidWcuVkVSQk9TRSkgewogICAgICAgICAgICAgIHByaW50KCJ0cmFjZWQgY2xvc3VyZSAkZWxlbWVudCBhcyAke3RydWV9IChiYWlsKSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHR5cGVzLnN0cmF0ZWd5LmZvckVhY2hQYXJhbWV0ZXIoZWxlbWVudCwgKExvY2FsIHBhcmFtZXRlcikgewogICAgICAgICAgICAgIHR5cGVzCiAgICAgICAgICAgICAgICAgIC5nZXRJbmZlcnJlZFR5cGVPZlBhcmFtZXRlcihwYXJhbWV0ZXIpCiAgICAgICAgICAgICAgICAgIC5naXZlVXAodGhpcywgY2xlYXJBc3NpZ25tZW50czogZmFsc2UpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pOwogICAgICAgICAgYmFpbGVkT3V0T24uYWRkQWxsKGVsZW1lbnRzKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZWxlbWVudHMKICAgICAgICAgICAgLndoZXJlKChlKSA9PiAhYmFpbGVkT3V0T24uY29udGFpbnMoZSkpCiAgICAgICAgICAgIC5mb3JFYWNoKChGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICAgICAgICB0eXBlcy5zdHJhdGVneS5mb3JFYWNoUGFyYW1ldGVyKGVsZW1lbnQsIChMb2NhbCBwYXJhbWV0ZXIpIHsKICAgICAgICAgICAgUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uIGluZm8gPQogICAgICAgICAgICAgICAgdHlwZXMuZ2V0SW5mZXJyZWRUeXBlT2ZQYXJhbWV0ZXIocGFyYW1ldGVyKTsKICAgICAgICAgICAgaW5mby5tYXliZVJlc3VtZSgpOwogICAgICAgICAgICB3b3JrUXVldWUuYWRkKGluZm8pOwogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAodHJhY2VyLnRyYWNlZFR5cGUubWlnaHRCZVBhc3NlZFRvRnVuY3Rpb25BcHBseSkgewogICAgICAgICAgICBpbmZlcnJlZERhdGFCdWlsZGVyLnJlZ2lzdGVyTWlnaHRCZVBhc3NlZFRvQXBwbHkoZWxlbWVudCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZGVidWcuVkVSQk9TRSkgewogICAgICAgICAgICBwcmludCgidHJhY2VkIGNsb3N1cmUgJGVsZW1lbnQgYXMgIgogICAgICAgICAgICAgICAgIiR7aW5mZXJyZWREYXRhQnVpbGRlci5nZXRDdXJyZW50bHlLbm93bk1pZ2h0QmVQYXNzZWRUb0FwcGx5KGVsZW1lbnQpfSIpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICBpZiAoaW5mbyBpcyBDbG9zdXJlVHlwZUluZm9ybWF0aW9uKSB7CiAgICAgICAgSXRlcmFibGU8RnVuY3Rpb25FbnRpdHk+IGVsZW1lbnRzID0gW2luZm8uY2xvc3VyZV07CiAgICAgICAgdHJhY2UoZWxlbWVudHMsIG5ldyBDbG9zdXJlVHJhY2VyVmlzaXRvcihlbGVtZW50cywgaW5mbywgdGhpcykpOwogICAgICB9IGVsc2UgaWYgKGluZm8gaXMgQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24pIHsKICAgICAgICBpZiAoaW5mbyBpcyBTdGF0aWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbiAmJgogICAgICAgICAgICBpbmZvLnNlbGVjdG9yICE9IG51bGwgJiYKICAgICAgICAgICAgaW5mby5zZWxlY3Rvci5pc0NhbGwpIHsKICAgICAgICAgIC8vIFRoaXMgaXMgYSBjb25zdHJ1Y3RvciBjYWxsIHRvIGEgY2xhc3Mgd2l0aCBhIGNhbGwgbWV0aG9kLiBTbyB3ZQogICAgICAgICAgLy8gbmVlZCB0byB0cmFjZSB0aGUgY2FsbCBtZXRob2QgaGVyZS4KICAgICAgICAgIEZ1bmN0aW9uRW50aXR5IGNhbGxlZEVsZW1lbnQgPSBpbmZvLmNhbGxlZEVsZW1lbnQ7CiAgICAgICAgICBhc3NlcnQoY2FsbGVkRWxlbWVudCBpcyBDb25zdHJ1Y3RvckVudGl0eSAmJgogICAgICAgICAgICAgIGNhbGxlZEVsZW1lbnQuaXNHZW5lcmF0aXZlQ29uc3RydWN0b3IpOwogICAgICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gY2FsbGVkRWxlbWVudC5lbmNsb3NpbmdDbGFzczsKICAgICAgICAgIEZ1bmN0aW9uRW50aXR5IGNhbGxNZXRob2QgPSBsb29rdXBDYWxsTWV0aG9kKGNscyk7CiAgICAgICAgICBhc3NlcnQoY2FsbE1ldGhvZCAhPSBudWxsLCBmYWlsZWRBdChjbHMpKTsKICAgICAgICAgIEl0ZXJhYmxlPEZ1bmN0aW9uRW50aXR5PiBlbGVtZW50cyA9IFtjYWxsTWV0aG9kXTsKICAgICAgICAgIHRyYWNlKGVsZW1lbnRzLCBuZXcgQ2xvc3VyZVRyYWNlclZpc2l0b3IoZWxlbWVudHMsIGluZm8sIHRoaXMpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gV2Ugb25seSBhcmUgaW50ZXJlc3RlZCBpbiBmdW5jdGlvbnMgaGVyZSwgYXMgb3RoZXIgdGFyZ2V0cwogICAgICAgICAgLy8gb2YgdGhpcyBjbG9zdXJlIGNhbGwgYXJlIG5vdCBhIHJvb3QgdG8gdHJhY2UgYnV0IGFuIGludGVybWVkaWF0ZQogICAgICAgICAgLy8gZm9yIHNvbWUgb3RoZXIgZnVuY3Rpb24uCiAgICAgICAgICBJdGVyYWJsZTxGdW5jdGlvbkVudGl0eT4gZWxlbWVudHMgPSBuZXcgTGlzdDxGdW5jdGlvbkVudGl0eT4uZnJvbSgKICAgICAgICAgICAgICBpbmZvLmNhbGxlZXMud2hlcmUoKGUpID0+IGUuaXNGdW5jdGlvbikpOwogICAgICAgICAgdHJhY2UoZWxlbWVudHMsIG5ldyBDbG9zdXJlVHJhY2VyVmlzaXRvcihlbGVtZW50cywgaW5mbywgdGhpcykpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChpbmZvIGlzIE1lbWJlclR5cGVJbmZvcm1hdGlvbikgewogICAgICAgIHRyYWNlKDxGdW5jdGlvbkVudGl0eT5baW5mby5tZW1iZXJdLAogICAgICAgICAgICBuZXcgU3RhdGljVGVhck9mZkNsb3N1cmVUcmFjZXJWaXNpdG9yKGluZm8ubWVtYmVyLCBpbmZvLCB0aGlzKSk7CiAgICAgIH0gZWxzZSBpZiAoaW5mbyBpcyBQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24pIHsKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgTk9fTE9DQVRJT05fU1BBTk5BQkxFLCAnVW5leHBlY3RlZCBjbG9zdXJlIGFsbG9jYXRpb24gaW5mbyAkaW5mbycpOwogICAgICB9CiAgICB9KTsKCiAgICBkdW1wPy5iZWZvcmVUcmFjaW5nKCk7CgogICAgLy8gUmVzZXQgYWxsIG5vZGVzIHRoYXQgdXNlIGxpc3RzL21hcHMgdGhhdCBoYXZlIGJlZW4gaW5mZXJyZWQsIGFzIHdlbGwKICAgIC8vIGFzIG5vZGVzIHRoYXQgdXNlIGVsZW1lbnRzIGZldGNoZWQgZnJvbSB0aGVzZSBsaXN0cy9tYXBzLiBUaGUKICAgIC8vIHdvcmtzZXQgZm9yIGEgbmV3IHJ1biBvZiB0aGUgYW5hbHlzaXMgd2lsbCBiZSB0aGVzZSBub2Rlcy4KICAgIFNldDxUeXBlSW5mb3JtYXRpb24+IHNlZW5UeXBlcyA9IG5ldyBTZXQ8VHlwZUluZm9ybWF0aW9uPigpOwogICAgd2hpbGUgKCF3b3JrUXVldWUuaXNFbXB0eSkgewogICAgICBUeXBlSW5mb3JtYXRpb24gaW5mbyA9IHdvcmtRdWV1ZS5yZW1vdmUoKTsKICAgICAgaWYgKHNlZW5UeXBlcy5jb250YWlucyhpbmZvKSkgY29udGludWU7CiAgICAgIC8vIElmIHRoZSBub2RlIGNhbm5vdCBiZSByZXNldCwgd2UgZG8gbm90IG5lZWQgdG8gdXBkYXRlIGl0cyB1c2VycyBlaXRoZXIuCiAgICAgIGlmICghaW5mby5yZXNldCh0aGlzKSkgY29udGludWU7CiAgICAgIHNlZW5UeXBlcy5hZGQoaW5mbyk7CiAgICAgIHdvcmtRdWV1ZS5hZGRBbGwoaW5mby51c2Vycyk7CiAgICB9CgogICAgd29ya1F1ZXVlLmFkZEFsbChzZWVuVHlwZXMpOwogICAgcmVmaW5lKCk7CgogICAgaWYgKGRlYnVnLlBSSU5UX1NVTU1BUlkpIHsKICAgICAgdHlwZXMuYWxsb2NhdGVkTGlzdHMudmFsdWVzLmZvckVhY2goKF9pbmZvKSB7CiAgICAgICAgTGlzdFR5cGVJbmZvcm1hdGlvbiBpbmZvID0gX2luZm87CiAgICAgICAgcHJpbnQoJyR7aW5mby50eXBlfSAnCiAgICAgICAgICAgICdmb3IgJHthYnN0cmFjdFZhbHVlRG9tYWluLmdldEFsbG9jYXRpb25Ob2RlKGluZm8ub3JpZ2luYWxUeXBlKX0gJwogICAgICAgICAgICAnYXQgJHthYnN0cmFjdFZhbHVlRG9tYWluLmdldEFsbG9jYXRpb25FbGVtZW50KGluZm8ub3JpZ2luYWxUeXBlKX0nCiAgICAgICAgICAgICdhZnRlciAke2luZm8ucmVmaW5lQ291bnR9Jyk7CiAgICAgIH0pOwogICAgICB0eXBlcy5hbGxvY2F0ZWRTZXRzLnZhbHVlcy5mb3JFYWNoKChfaW5mbykgewogICAgICAgIFNldFR5cGVJbmZvcm1hdGlvbiBpbmZvID0gX2luZm87CiAgICAgICAgcHJpbnQoJyR7aW5mby50eXBlfSAnCiAgICAgICAgICAgICdmb3IgJHthYnN0cmFjdFZhbHVlRG9tYWluLmdldEFsbG9jYXRpb25Ob2RlKGluZm8ub3JpZ2luYWxUeXBlKX0gJwogICAgICAgICAgICAnYXQgJHthYnN0cmFjdFZhbHVlRG9tYWluLmdldEFsbG9jYXRpb25FbGVtZW50KGluZm8ub3JpZ2luYWxUeXBlKX0gJwogICAgICAgICAgICAnYWZ0ZXIgJHtpbmZvLnJlZmluZUNvdW50fScpOwogICAgICB9KTsKICAgICAgdHlwZXMuYWxsb2NhdGVkTWFwcy52YWx1ZXMuZm9yRWFjaCgoX2luZm8pIHsKICAgICAgICBNYXBUeXBlSW5mb3JtYXRpb24gaW5mbyA9IF9pbmZvOwogICAgICAgIHByaW50KCcke2luZm8udHlwZX0gJwogICAgICAgICAgICAnZm9yICR7YWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRBbGxvY2F0aW9uTm9kZShpbmZvLm9yaWdpbmFsVHlwZSl9ICcKICAgICAgICAgICAgJ2F0ICR7YWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRBbGxvY2F0aW9uRWxlbWVudChpbmZvLm9yaWdpbmFsVHlwZSl9JwogICAgICAgICAgICAnYWZ0ZXIgJHtpbmZvLnJlZmluZUNvdW50fScpOwogICAgICB9KTsKICAgICAgdHlwZXMuYWxsb2NhdGVkQ2xvc3VyZXMuZm9yRWFjaCgoVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgICAgICBpZiAoaW5mbyBpcyBFbGVtZW50VHlwZUluZm9ybWF0aW9uKSB7CiAgICAgICAgICBwcmludCgnJHtpbmZvLmdldEluZmVycmVkU2lnbmF0dXJlKHR5cGVzKX0gZm9yICcKICAgICAgICAgICAgICAnJHtpbmZvLmRlYnVnTmFtZX0nKTsKICAgICAgICB9IGVsc2UgaWYgKGluZm8gaXMgQ2xvc3VyZVR5cGVJbmZvcm1hdGlvbikgewogICAgICAgICAgcHJpbnQoJyR7aW5mby5nZXRJbmZlcnJlZFNpZ25hdHVyZSh0eXBlcyl9IGZvciAnCiAgICAgICAgICAgICAgJyR7aW5mby5kZWJ1Z05hbWV9Jyk7CiAgICAgICAgfSBlbHNlIGlmIChpbmZvIGlzIER5bmFtaWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbikgewogICAgICAgICAgaWYgKGluZm8uaGFzQ2xvc3VyZUNhbGxUYXJnZXRzKSB7CiAgICAgICAgICAgIHByaW50KCc8Q2xvc3VyZS5jYWxsPicpOwogICAgICAgICAgfQogICAgICAgICAgZm9yIChNZW1iZXJFbnRpdHkgdGFyZ2V0IGluIGluZm8uY29uY3JldGVUYXJnZXRzKSB7CiAgICAgICAgICAgIGlmICh0YXJnZXQgaXMgRnVuY3Rpb25FbnRpdHkpIHsKICAgICAgICAgICAgICBwcmludCgnJHt0eXBlcy5nZXRJbmZlcnJlZFNpZ25hdHVyZU9mTWV0aG9kKHRhcmdldCl9ICcKICAgICAgICAgICAgICAgICAgJ2ZvciAke3RhcmdldH0nKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBwcmludCgnJHt0eXBlcy5nZXRJbmZlcnJlZFR5cGVPZk1lbWJlcih0YXJnZXQpLnR5cGV9ICcKICAgICAgICAgICAgICAgICAgJ2ZvciAke3RhcmdldH0nKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoaW5mbyBpcyBTdGF0aWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbikgewogICAgICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gaW5mby5jYWxsZWRFbGVtZW50LmVuY2xvc2luZ0NsYXNzOwogICAgICAgICAgRnVuY3Rpb25FbnRpdHkgY2FsbE1ldGhvZCA9IGxvb2t1cENhbGxNZXRob2QoY2xzKTsKICAgICAgICAgIHByaW50KCcke3R5cGVzLmdldEluZmVycmVkU2lnbmF0dXJlT2ZNZXRob2QoY2FsbE1ldGhvZCl9IGZvciAke2Nsc30nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcHJpbnQoJyR7aW5mby50eXBlfSBmb3Igc29tZSB1bmtub3duIGtpbmQgb2YgY2xvc3VyZScpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGFuYWx5emVkRWxlbWVudHMuZm9yRWFjaCgoTWVtYmVyRW50aXR5IGVsZW0pIHsKICAgICAgICBUeXBlSW5mb3JtYXRpb24gdHlwZSA9IHR5cGVzLmdldEluZmVycmVkVHlwZU9mTWVtYmVyKGVsZW0pOwogICAgICAgIHByaW50KCcke2VsZW19IDo6ICR7dHlwZX0gZnJvbSAke3R5cGUuYXNzaWdubWVudHN9ICcpOwogICAgICB9KTsKICAgIH0KICAgIGR1bXA/LmFmdGVyQW5hbHlzaXMoKTsKCiAgICByZXBvcnRlci5sb2coJ0luZmVycmVkICRvdmVyYWxsUmVmaW5lQ291bnQgdHlwZXMuJyk7CgogICAgcHJvY2Vzc0xvb3BJbmZvcm1hdGlvbigpOwogIH0KCiAgLy8vIENhbGwgW2FuYWx5emVdIGZvciBhbGwgbGl2ZSBtZW1iZXJzLgogIHZvaWQgYW5hbHl6ZUFsbEVsZW1lbnRzKCkgewogICAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBwcm9jZXNzZWRNZW1iZXJzID0gY2xvc2VkV29ybGQucHJvY2Vzc2VkTWVtYmVycwogICAgICAgIC53aGVyZSgoTWVtYmVyRW50aXR5IG1lbWJlcikgPT4gIW1lbWJlci5pc0Fic3RyYWN0KTsKCiAgICBwcm9ncmVzcy5zdGFydFBoYXNlKCk7CiAgICBwcm9jZXNzZWRNZW1iZXJzLmZvckVhY2goKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgICAgcHJvZ3Jlc3Muc2hvd1Byb2dyZXNzKAogICAgICAgICAgJ0FkZGVkICcsIGFkZGVkSW5HcmFwaCwgJyBlbGVtZW50cyBpbiBpbmZlcmVuY2luZyBncmFwaC4nKTsKICAgICAgLy8gVGhpcyBhbHNvIGZvcmNlcyB0aGUgY3JlYXRpb24gb2YgdGhlIFtFbGVtZW50VHlwZUluZm9ybWF0aW9uXSB0byBlbnN1cmUKICAgICAgLy8gaXQgaXMgaW4gdGhlIGdyYXBoLgogICAgICB0eXBlcy53aXRoTWVtYmVyKG1lbWJlciwgKCkgPT4gYW5hbHl6ZShtZW1iZXIpKTsKICAgIH0pOwogICAgcmVwb3J0ZXIubG9nKCdBZGRlZCAkYWRkZWRJbkdyYXBoIGVsZW1lbnRzIGluIGluZmVyZW5jaW5nIGdyYXBoLicpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIGJvZHkgbm9kZSBmb3IgW21lbWJlcl0uCiAgaXIuTm9kZSBjb21wdXRlTWVtYmVyQm9keShNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24gPQogICAgICAgIGNsb3NlZFdvcmxkLmVsZW1lbnRNYXAuZ2V0TWVtYmVyRGVmaW5pdGlvbihtZW1iZXIpOwogICAgc3dpdGNoIChkZWZpbml0aW9uLmtpbmQpIHsKICAgICAgY2FzZSBNZW1iZXJLaW5kLnJlZ3VsYXI6CiAgICAgICAgaXIuTWVtYmVyIG5vZGUgPSBkZWZpbml0aW9uLm5vZGU7CiAgICAgICAgaWYgKG5vZGUgaXMgaXIuRmllbGQpIHsKICAgICAgICAgIHJldHVybiBnZXRGaWVsZEluaXRpYWxpemVyKGNsb3NlZFdvcmxkLmVsZW1lbnRNYXAsIG1lbWJlcik7CiAgICAgICAgfSBlbHNlIGlmIChub2RlIGlzIGlyLlByb2NlZHVyZSkgewogICAgICAgICAgcmV0dXJuIG5vZGUuZnVuY3Rpb247CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE1lbWJlcktpbmQuY29uc3RydWN0b3I6CiAgICAgICAgcmV0dXJuIGRlZmluaXRpb24ubm9kZTsKICAgICAgY2FzZSBNZW1iZXJLaW5kLmNvbnN0cnVjdG9yQm9keToKICAgICAgICBpci5NZW1iZXIgbm9kZSA9IGRlZmluaXRpb24ubm9kZTsKICAgICAgICBpZiAobm9kZSBpcyBpci5Db25zdHJ1Y3RvcikgewogICAgICAgICAgcmV0dXJuIG5vZGUuZnVuY3Rpb247CiAgICAgICAgfSBlbHNlIGlmIChub2RlIGlzIGlyLlByb2NlZHVyZSkgewogICAgICAgICAgcmV0dXJuIG5vZGUuZnVuY3Rpb247CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE1lbWJlcktpbmQuY2xvc3VyZUNhbGw6CiAgICAgICAgaXIuVHJlZU5vZGUgbm9kZSA9IGRlZmluaXRpb24ubm9kZTsKICAgICAgICBpZiAobm9kZSBpcyBpci5GdW5jdGlvbkRlY2xhcmF0aW9uKSB7CiAgICAgICAgICByZXR1cm4gbm9kZS5mdW5jdGlvbjsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaXMgaXIuRnVuY3Rpb25FeHByZXNzaW9uKSB7CiAgICAgICAgICByZXR1cm4gbm9kZS5mdW5jdGlvbjsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTWVtYmVyS2luZC5jbG9zdXJlRmllbGQ6CiAgICAgIGNhc2UgTWVtYmVyS2luZC5zaWduYXR1cmU6CiAgICAgIGNhc2UgTWVtYmVyS2luZC5nZW5lcmF0b3JCb2R5OgogICAgICAgIGJyZWFrOwogICAgfQogICAgZmFpbGVkQXQobWVtYmVyLCAnVW5leHBlY3RlZCBtZW1iZXIgZGVmaW5pdGlvbjogJGRlZmluaXRpb24uJyk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBgY2FsbGAgbWV0aG9kIG9uIFtjbHNdIG9yIHRoZSBgbm9TdWNoTWV0aG9kYCBpZiBbY2xzXSBkb2Vzbid0CiAgLy8vIGltcGxlbWVudCBgY2FsbGAuCiAgRnVuY3Rpb25FbnRpdHkgbG9va3VwQ2FsbE1ldGhvZChDbGFzc0VudGl0eSBjbHMpIHsKICAgIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uID0KICAgICAgICBfZWxlbWVudEVudmlyb25tZW50Lmxvb2t1cENsYXNzTWVtYmVyKGNscywgSWRlbnRpZmllcnMuY2FsbCk7CiAgICBpZiAoZnVuY3Rpb24gPT0gbnVsbCB8fCBmdW5jdGlvbi5pc0Fic3RyYWN0KSB7CiAgICAgIGZ1bmN0aW9uID0KICAgICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQubG9va3VwQ2xhc3NNZW1iZXIoY2xzLCBJZGVudGlmaWVycy5ub1N1Y2hNZXRob2RfKTsKICAgIH0KICAgIHJldHVybiBmdW5jdGlvbjsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYW5hbHl6ZShNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgaWYgKGFuYWx5emVkRWxlbWVudHMuY29udGFpbnMoZWxlbWVudCkpIHJldHVybjsKICAgIGFuYWx5emVkRWxlbWVudHMuYWRkKGVsZW1lbnQpOwoKICAgIGlyLk5vZGUgYm9keSA9IGNvbXB1dGVNZW1iZXJCb2R5KGVsZW1lbnQpOwoKICAgIFR5cGVJbmZvcm1hdGlvbiB0eXBlOwogICAgcmVwb3J0ZXIud2l0aEN1cnJlbnRFbGVtZW50KGVsZW1lbnQsICgpIHsKICAgICAgdHlwZSA9IGNvbXB1dGVNZW1iZXJUeXBlSW5mb3JtYXRpb24oZWxlbWVudCwgYm9keSk7CiAgICB9KTsKICAgIGFkZGVkSW5HcmFwaCsrOwoKICAgIGlmIChlbGVtZW50LmlzRmllbGQpIHsKICAgICAgRmllbGRFbnRpdHkgZmllbGQgPSBlbGVtZW50OwogICAgICBpZiAoIWZpZWxkLmlzQXNzaWduYWJsZSkgewogICAgICAgIC8vIElmIFtlbGVtZW50XSBpcyBmaW5hbCBhbmQgaGFzIGFuIGluaXRpYWxpemVyLCB3ZSByZWNvcmQKICAgICAgICAvLyB0aGUgaW5mZXJyZWQgdHlwZS4KICAgICAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgICAgICBpZiAodHlwZSBpcyEgTGlzdFR5cGVJbmZvcm1hdGlvbiAmJiB0eXBlIGlzISBNYXBUeXBlSW5mb3JtYXRpb24pIHsKICAgICAgICAgICAgLy8gRm9yIG5vbi1jb250YWluZXIgdHlwZXMsIHRoZSBjb25zdGFudCBoYW5kbGVyIGRvZXMKICAgICAgICAgICAgLy8gY29uc3RhbnQgZm9sZGluZyB0aGF0IGNvdWxkIGdpdmUgbW9yZSBwcmVjaXNlIHJlc3VsdHMuCiAgICAgICAgICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBnZXRGaWVsZENvbnN0YW50KGZpZWxkKTsKICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgICBpZiAodmFsdWUuaXNGdW5jdGlvbikgewogICAgICAgICAgICAgICAgRnVuY3Rpb25Db25zdGFudFZhbHVlIGZ1bmN0aW9uQ29uc3RhbnQgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uID0gZnVuY3Rpb25Db25zdGFudC5lbGVtZW50OwogICAgICAgICAgICAgICAgdHlwZSA9IHR5cGVzLmFsbG9jYXRlQ2xvc3VyZShmdW5jdGlvbik7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIEFsdGhvdWdoIHdlIG1pZ2h0IGZpbmQgYSBiZXR0ZXIgdHlwZSwgd2UgaGF2ZSB0byBrZWVwCiAgICAgICAgICAgICAgICAvLyB0aGUgb2xkIHR5cGUgYXJvdW5kIHRvIGVuc3VyZSB0aGF0IHdlIGdldCBhIGNvbXBsZXRlIHZpZXcKICAgICAgICAgICAgICAgIC8vIG9mIHRoZSB0eXBlIGdyYXBoIGFuZCBkbyBub3QgZHJvcCBhbnkgZmxvdyBlZGdlcy4KICAgICAgICAgICAgICAgIEFic3RyYWN0VmFsdWUgcmVmaW5lZFR5cGUgPQogICAgICAgICAgICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uY29tcHV0ZUFic3RyYWN0VmFsdWVGb3JDb25zdGFudCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB0eXBlID0gbmV3IE5hcnJvd1R5cGVJbmZvcm1hdGlvbigKICAgICAgICAgICAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLCB0eXBlLCByZWZpbmVkVHlwZSk7CiAgICAgICAgICAgICAgICB0eXBlcy5hbGxvY2F0ZWRUeXBlcy5hZGQodHlwZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZWNvcmRUeXBlT2ZGaWVsZChmaWVsZCwgdHlwZSk7CiAgICAgICAgfSBlbHNlIGlmICghZWxlbWVudC5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgICAgICByZWNvcmRUeXBlT2ZGaWVsZChmaWVsZCwgdHlwZXMubnVsbFR5cGUpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChib2R5ID09IG51bGwpIHsKICAgICAgICAvLyBPbmx5IHVwZGF0ZSB0eXBlcyBvZiBzdGF0aWMgZmllbGRzIGlmIHRoZXJlIGlzIG5vCiAgICAgICAgLy8gYXNzaWdubWVudC4gSW5zdGFuY2UgZmllbGRzIGFyZSBkZWFsdCB3aXRoIGluIHRoZSBjb25zdHJ1Y3Rvci4KICAgICAgICBpZiAoZWxlbWVudC5pc1N0YXRpYyB8fCBlbGVtZW50LmlzVG9wTGV2ZWwpIHsKICAgICAgICAgIHJlY29yZFR5cGVPZkZpZWxkKGZpZWxkLCB0eXBlKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVjb3JkVHlwZU9mRmllbGQoZmllbGQsIHR5cGUpOwogICAgICB9CiAgICAgIGlmICgoZWxlbWVudC5pc1N0YXRpYyB8fCBlbGVtZW50LmlzVG9wTGV2ZWwpICYmCiAgICAgICAgICBib2R5ICE9IG51bGwgJiYKICAgICAgICAgICFlbGVtZW50LmlzQ29uc3QpIHsKICAgICAgICBpZiAoaXNGaWVsZEluaXRpYWxpemVyUG90ZW50aWFsbHlOdWxsKGVsZW1lbnQsIGJvZHkpKSB7CiAgICAgICAgICByZWNvcmRUeXBlT2ZGaWVsZChmaWVsZCwgdHlwZXMubnVsbFR5cGUpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgRnVuY3Rpb25FbnRpdHkgbWV0aG9kID0gZWxlbWVudDsKICAgICAgcmVjb3JkUmV0dXJuVHlwZShtZXRob2QsIHR5cGUpOwogICAgfQogIH0KCiAgLy8vIFZpc2l0cyBbYm9keV0gdG8gY29tcHV0ZSB0aGUgW1R5cGVJbmZvcm1hdGlvbl0gbm9kZSBmb3IgW21lbWJlcl0uCiAgVHlwZUluZm9ybWF0aW9uIGNvbXB1dGVNZW1iZXJUeXBlSW5mb3JtYXRpb24oCiAgICAgIE1lbWJlckVudGl0eSBtZW1iZXIsIGlyLk5vZGUgYm9keSkgewogICAgS2VybmVsVHlwZUdyYXBoQnVpbGRlciB2aXNpdG9yID0gbmV3IEtlcm5lbFR5cGVHcmFwaEJ1aWxkZXIoCiAgICAgICAgb3B0aW9ucywKICAgICAgICBjbG9zZWRXb3JsZCwKICAgICAgICB0aGlzLAogICAgICAgIG1lbWJlciwKICAgICAgICBib2R5LAogICAgICAgIGNsb3NlZFdvcmxkLmdsb2JhbExvY2Fsc01hcC5nZXRMb2NhbHNNYXAobWVtYmVyKSwKICAgICAgICBjbG9zZWRXb3JsZC5lbGVtZW50TWFwLmdldFN0YXRpY1R5cGVQcm92aWRlcihtZW1iZXIpKTsKICAgIHJldHVybiB2aXNpdG9yLnJ1bigpOwogIH0KCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHRoZSBbaW5pdGlhbGl6ZXJdIG9mIHRoZSBub24tY29uc3Qgc3RhdGljIG9yIHRvcC1sZXZlbAogIC8vLyBbZmllbGRdIGlzIHBvdGVudGlhbGx5IGBudWxsYC4KICBib29sIGlzRmllbGRJbml0aWFsaXplclBvdGVudGlhbGx5TnVsbCgKICAgICAgRmllbGRFbnRpdHkgZmllbGQsIGlyLk5vZGUgaW5pdGlhbGl6ZXIpIHsKICAgIC8vIFRPRE8oMTM0MjkpOiBXZSBjb3VsZCBkbyBiZXR0ZXIgaGVyZSBieSB1c2luZyB0aGUKICAgIC8vIGNvbnN0YW50IGhhbmRsZXIgdG8gZmlndXJlIG91dCBpZiBpdCdzIGEgbGF6eSBmaWVsZCBvciBub3QuCiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBJbXBsZW1lbnQgdGhlIGFkLWhvYyBjaGVjayBpbiBhc3QgaW5mZXJyZXI/IFRoaXMKICAgIC8vIG1pbWlja3MgdGhhdCBhc3QgaW5mZXJyZXIgd2hpY2ggcmV0dXJuIGB0cnVlYCBmb3IgW2FzdC5TZW5kXSBhbmQKICAgIC8vIG5vbi1jb25zdCBbYXN0Lk5ld0V4cHJlc3Npb25dLgogICAgaWYgKGluaXRpYWxpemVyIGlzIGlyLk1ldGhvZEludm9jYXRpb24gfHwKICAgICAgICBpbml0aWFsaXplciBpcyBpci5Qcm9wZXJ0eUdldCB8fAogICAgICAgIGluaXRpYWxpemVyIGlzIGlyLlByb3BlcnR5U2V0IHx8CiAgICAgICAgaW5pdGlhbGl6ZXIgaXMgaXIuU3RhdGljSW52b2NhdGlvbiB8fAogICAgICAgIGluaXRpYWxpemVyIGlzIGlyLlN0YXRpY0dldCB8fAogICAgICAgIGluaXRpYWxpemVyIGlzIGlyLlN0YXRpY1NldCB8fAogICAgICAgIGluaXRpYWxpemVyIGlzIGlyLkxldCB8fAogICAgICAgIGluaXRpYWxpemVyIGlzIGlyLkNvbnN0cnVjdG9ySW52b2NhdGlvbiAmJiAhaW5pdGlhbGl6ZXIuaXNDb25zdCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBbQ29uc3RhbnRWYWx1ZV0gZm9yIHRoZSBpbml0aWFsIHZhbHVlIG9mIFtmaWVsZF0sIG9yCiAgLy8vIGBudWxsYCBpZiB0aGUgaW5pdGlhbGl6ZXIgaXMgbm90IGEgY29uc3RhbnQgdmFsdWUuCiAgQ29uc3RhbnRWYWx1ZSBnZXRGaWVsZENvbnN0YW50KEZpZWxkRW50aXR5IGZpZWxkKSB7CiAgICByZXR1cm4gY2xvc2VkV29ybGQuZmllbGRBbmFseXNpcy5nZXRGaWVsZERhdGEoZmllbGQpLmluaXRpYWxWYWx1ZTsKICB9CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbY2xzXSBoYXMgYSAnY2FsbCcgbWV0aG9kLgogIGJvb2wgaGFzQ2FsbFR5cGUoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gY2xvc2VkV29ybGQuZWxlbWVudE1hcC50eXBlcwogICAgICAgICAgICAuZ2V0Q2FsbFR5cGUoY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50LmdldFRoaXNUeXBlKGNscykpICE9CiAgICAgICAgbnVsbDsKICB9CgogIHZvaWQgcHJvY2Vzc0xvb3BJbmZvcm1hdGlvbigpIHsKICAgIHR5cGVzLmFsbG9jYXRlZENhbGxzLmZvckVhY2goKENhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgICAgaWYgKCFpbmZvLmluTG9vcCkgcmV0dXJuOwogICAgICAvLyBXZSBjYW4ndCBjb21wdXRlIHRoZSBjYWxsZWVzIG9mIGNsb3N1cmVzLCBubyBuZXcgaW5mb3JtYXRpb24gdG8gYWRkLgogICAgICBpZiAoaW5mbyBpcyBDbG9zdXJlQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24pIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKGluZm8gaXMgU3RhdGljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24pIHsKICAgICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0gaW5mby5jYWxsZWRFbGVtZW50OwogICAgICAgIGluZmVycmVkRGF0YUJ1aWxkZXIuYWRkRnVuY3Rpb25DYWxsZWRJbkxvb3AobWVtYmVyKTsKICAgICAgfSBlbHNlIGlmIChpbmZvLm1hc2sgIT0gbnVsbCAmJgogICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5jb250YWluc0FsbChpbmZvLm1hc2spLmlzRGVmaW5pdGVseUZhbHNlKSB7CiAgICAgICAgLy8gRm9yIGluc3RhbmNlIG1ldGhvZHMsIHdlIG9ubHkgcmVnaXN0ZXIgYSBzZWxlY3RvciBjYWxsZWQgaW4gYQogICAgICAgIC8vIGxvb3AgaWYgaXQgaXMgYSB0eXBlZCBzZWxlY3RvciwgdG8gYXZvaWQgbWFya2luZyB0b28gbWFueQogICAgICAgIC8vIG1ldGhvZHMgYXMgYmVpbmcgY2FsbGVkIGZyb20gd2l0aGluIGEgbG9vcC4gVGhpcyBjdXRzIGRvd24KICAgICAgICAvLyBvbiB0aGUgY29kZSBibG9hdC4KICAgICAgICBpbmZvLmNhbGxlZXMuZm9yRWFjaCgoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgICAgICAgIGluZmVycmVkRGF0YUJ1aWxkZXIuYWRkRnVuY3Rpb25DYWxsZWRJbkxvb3AoZWxlbWVudCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgdm9pZCByZWZpbmUoKSB7CiAgICBwcm9ncmVzcy5zdGFydFBoYXNlKCk7CiAgICB3aGlsZSAoIXdvcmtRdWV1ZS5pc0VtcHR5KSB7CiAgICAgIHByb2dyZXNzLnNob3dQcm9ncmVzcygnSW5mZXJyZWQgJywgb3ZlcmFsbFJlZmluZUNvdW50LCAnIHR5cGVzLicpOwogICAgICBUeXBlSW5mb3JtYXRpb24gaW5mbyA9IHdvcmtRdWV1ZS5yZW1vdmUoKTsKICAgICAgQWJzdHJhY3RWYWx1ZSBvbGRUeXBlID0gaW5mby50eXBlOwogICAgICBBYnN0cmFjdFZhbHVlIG5ld1R5cGUgPSBpbmZvLnJlZmluZSh0aGlzKTsKICAgICAgLy8gQ2hlY2sgdGhhdCByZWZpbmVtZW50IGhhcyBub3QgYWNjaWRlbnRhbGx5IGNoYW5nZWQgdGhlIHR5cGUuCiAgICAgIGFzc2VydChvbGRUeXBlID09IGluZm8udHlwZSk7CiAgICAgIGlmIChpbmZvLmFiYW5kb25JbmZlcmVuY2luZykgaW5mby5kb05vdEVucXVldWUgPSB0cnVlOwogICAgICBpZiAoKGluZm8udHlwZSA9IG5ld1R5cGUpICE9IG9sZFR5cGUpIHsKICAgICAgICBvdmVyYWxsUmVmaW5lQ291bnQrKzsKICAgICAgICBpbmZvLnJlZmluZUNvdW50Kys7CiAgICAgICAgaWYgKGluZm8ucmVmaW5lQ291bnQgPiBNQVhfQ0hBTkdFX0NPVU5UKSB7CiAgICAgICAgICBpZiAoZGVidWcuQU5PTUFMWV9XQVJOKSB7CiAgICAgICAgICAgIHByaW50KCJBTk9NQUxZIFdBUk5JTkc6IG1heCByZWZpbmVtZW50IHJlYWNoZWQgZm9yICRpbmZvIik7CiAgICAgICAgICB9CiAgICAgICAgICBpbmZvLmdpdmVVcCh0aGlzKTsKICAgICAgICAgIGluZm8udHlwZSA9IGluZm8ucmVmaW5lKHRoaXMpOwogICAgICAgICAgaW5mby5kb05vdEVucXVldWUgPSB0cnVlOwogICAgICAgIH0KICAgICAgICB3b3JrUXVldWUuYWRkQWxsKGluZm8udXNlcnMpOwogICAgICAgIGlmIChpbmZvLmhhc1N0YWJsZVR5cGUodGhpcykpIHsKICAgICAgICAgIGluZm8uc3RhYmlsaXplKHRoaXMpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBidWlsZFdvcmtRdWV1ZSgpIHsKICAgIHdvcmtRdWV1ZS5hZGRBbGwodHlwZXMub3JkZXJlZFR5cGVJbmZvcm1hdGlvbnMpOwogICAgd29ya1F1ZXVlLmFkZEFsbCh0eXBlcy5hbGxvY2F0ZWRUeXBlcyk7CiAgICB3b3JrUXVldWUuYWRkQWxsKHR5cGVzLmFsbG9jYXRlZENsb3N1cmVzKTsKICAgIHdvcmtRdWV1ZS5hZGRBbGwodHlwZXMuYWxsb2NhdGVkQ2FsbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB1cGRhdGVQYXJhbWV0ZXJBc3NpZ25tZW50cyhUeXBlSW5mb3JtYXRpb24gY2FsbGVyLCBNZW1iZXJFbnRpdHkgY2FsbGVlLAogICAgICBBcmd1bWVudHNUeXBlcyBhcmd1bWVudHMsIFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIG1hc2ssCiAgICAgIHtib29sIHJlbW92ZSwgYm9vbCBhZGRUb1F1ZXVlOiB0cnVlfSkgewogICAgaWYgKGNhbGxlZS5uYW1lID09IElkZW50aWZpZXJzLm5vU3VjaE1ldGhvZF8pIHJldHVybjsKICAgIGlmIChjYWxsZWUuaXNGaWVsZCkgewogICAgICBpZiAoc2VsZWN0b3IuaXNTZXR0ZXIpIHsKICAgICAgICBFbGVtZW50VHlwZUluZm9ybWF0aW9uIGluZm8gPSB0eXBlcy5nZXRJbmZlcnJlZFR5cGVPZk1lbWJlcihjYWxsZWUpOwogICAgICAgIGlmIChyZW1vdmUpIHsKICAgICAgICAgIGluZm8ucmVtb3ZlQXNzaWdubWVudChhcmd1bWVudHMucG9zaXRpb25hbFswXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGluZm8uYWRkQXNzaWdubWVudChhcmd1bWVudHMucG9zaXRpb25hbFswXSk7CiAgICAgICAgfQogICAgICAgIGlmIChhZGRUb1F1ZXVlKSB3b3JrUXVldWUuYWRkKGluZm8pOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGNhbGxlZS5pc0dldHRlcikgewogICAgICByZXR1cm47CiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yICE9IG51bGwgJiYgc2VsZWN0b3IuaXNHZXR0ZXIpIHsKICAgICAgLy8gV2UgYXJlIHRlYXJpbmcgYSBmdW5jdGlvbiBvZmYgYW5kIHRodXMgY3JlYXRlIGEgY2xvc3VyZS4KICAgICAgYXNzZXJ0KGNhbGxlZS5pc0Z1bmN0aW9uKTsKICAgICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGluZm8gPSB0eXBlcy5nZXRJbmZlcnJlZFR5cGVPZk1lbWJlcihjYWxsZWUpOwogICAgICBpZiAocmVtb3ZlKSB7CiAgICAgICAgaW5mby5jbG9zdXJpemVkQ291bnQtLTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbmZvLmNsb3N1cml6ZWRDb3VudCsrOwogICAgICAgIGlmIChjYWxsZWUuaXNTdGF0aWMgfHwgY2FsbGVlLmlzVG9wTGV2ZWwpIHsKICAgICAgICAgIHR5cGVzLmFsbG9jYXRlZENsb3N1cmVzLmFkZChpbmZvKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gV2UgYWRkIHRoZSBjYWxsLXNpdGUgdHlwZSBpbmZvcm1hdGlvbiBoZXJlIHNvIHRoYXQgd2UKICAgICAgICAgIC8vIGNhbiBiZW5lZml0IGZyb20gZnVydGhlciByZWZpbmVtZW50IG9mIHRoZSBzZWxlY3Rvci4KICAgICAgICAgIHR5cGVzLmFsbG9jYXRlZENsb3N1cmVzLmFkZChjYWxsZXIpOwogICAgICAgIH0KICAgICAgICB0eXBlcy5zdHJhdGVneS5mb3JFYWNoUGFyYW1ldGVyKGNhbGxlZSwgKExvY2FsIHBhcmFtZXRlcikgewogICAgICAgICAgUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uIGluZm8gPQogICAgICAgICAgICAgIHR5cGVzLmdldEluZmVycmVkVHlwZU9mUGFyYW1ldGVyKHBhcmFtZXRlcik7CiAgICAgICAgICBpbmZvLnRhZ0FzVGVhck9mZkNsb3N1cmVQYXJhbWV0ZXIodGhpcyk7CiAgICAgICAgICBpZiAoYWRkVG9RdWV1ZSkgd29ya1F1ZXVlLmFkZChpbmZvKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgRnVuY3Rpb25FbnRpdHkgbWV0aG9kID0gY2FsbGVlOwogICAgICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlID0gbWV0aG9kLnBhcmFtZXRlclN0cnVjdHVyZTsKICAgICAgaW50IHBhcmFtZXRlckluZGV4ID0gMDsKICAgICAgdHlwZXMuc3RyYXRlZ3kuZm9yRWFjaFBhcmFtZXRlcihjYWxsZWUsIChMb2NhbCBwYXJhbWV0ZXIpIHsKICAgICAgICBUeXBlSW5mb3JtYXRpb24gdHlwZTsKICAgICAgICBpZiAocGFyYW1ldGVySW5kZXggPCBwYXJhbWV0ZXJTdHJ1Y3R1cmUucmVxdWlyZWRQYXJhbWV0ZXJzKSB7CiAgICAgICAgICB0eXBlID0gYXJndW1lbnRzLnBvc2l0aW9uYWxbcGFyYW1ldGVySW5kZXhdOwogICAgICAgIH0gZWxzZSBpZiAocGFyYW1ldGVyU3RydWN0dXJlLm5hbWVkUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgICAgICB0eXBlID0gYXJndW1lbnRzLm5hbWVkW3BhcmFtZXRlci5uYW1lXTsKICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlckluZGV4IDwgYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoKSB7CiAgICAgICAgICB0eXBlID0gYXJndW1lbnRzLnBvc2l0aW9uYWxbcGFyYW1ldGVySW5kZXhdOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB0eXBlID0gZ2V0RGVmYXVsdFR5cGVPZlBhcmFtZXRlcihwYXJhbWV0ZXIpOwogICAgICAgIFR5cGVJbmZvcm1hdGlvbiBpbmZvID0gdHlwZXMuZ2V0SW5mZXJyZWRUeXBlT2ZQYXJhbWV0ZXIocGFyYW1ldGVyKTsKICAgICAgICBpZiAocmVtb3ZlKSB7CiAgICAgICAgICBpbmZvLnJlbW92ZUFzc2lnbm1lbnQodHlwZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGluZm8uYWRkQXNzaWdubWVudCh0eXBlKTsKICAgICAgICB9CiAgICAgICAgcGFyYW1ldGVySW5kZXgrKzsKICAgICAgICBpZiAoYWRkVG9RdWV1ZSkgd29ya1F1ZXVlLmFkZChpbmZvKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHNldERlZmF1bHRUeXBlT2ZQYXJhbWV0ZXIoTG9jYWwgcGFyYW1ldGVyLCBUeXBlSW5mb3JtYXRpb24gdHlwZSwKICAgICAge2Jvb2wgaXNJbnN0YW5jZU1lbWJlcn0pIHsKICAgIGFzc2VydCgKICAgICAgICB0eXBlICE9IG51bGwsIGZhaWxlZEF0KHBhcmFtZXRlciwgIk5vIGRlZmF1bHQgdHlwZSBmb3IgJHBhcmFtZXRlci4iKSk7CiAgICBUeXBlSW5mb3JtYXRpb24gZXhpc3RpbmcgPSBkZWZhdWx0VHlwZU9mUGFyYW1ldGVyW3BhcmFtZXRlcl07CiAgICBkZWZhdWx0VHlwZU9mUGFyYW1ldGVyW3BhcmFtZXRlcl0gPSB0eXBlOwogICAgVHlwZUluZm9ybWF0aW9uIGluZm8gPSB0eXBlcy5nZXRJbmZlcnJlZFR5cGVPZlBhcmFtZXRlcihwYXJhbWV0ZXIpOwogICAgaWYgKGV4aXN0aW5nICE9IG51bGwgJiYgZXhpc3RpbmcgaXMgUGxhY2Vob2xkZXJUeXBlSW5mb3JtYXRpb24pIHsKICAgICAgLy8gUmVwbGFjZSByZWZlcmVuY2VzIHRvIFtleGlzdGluZ10gdG8gdXNlIFt0eXBlXSBpbnN0ZWFkLgogICAgICBpZiAoaXNJbnN0YW5jZU1lbWJlcikgewogICAgICAgIFBhcmFtZXRlckFzc2lnbm1lbnRzIGFzc2lnbm1lbnRzID0gaW5mby5hc3NpZ25tZW50czsKICAgICAgICBhc3NpZ25tZW50cy5yZXBsYWNlKGV4aXN0aW5nLCB0eXBlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBMaXN0PFR5cGVJbmZvcm1hdGlvbj4gYXNzaWdubWVudHMgPSBpbmZvLmFzc2lnbm1lbnRzOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXNzaWdubWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGlmIChhc3NpZ25tZW50c1tpXSA9PSBleGlzdGluZykgewogICAgICAgICAgICBhc3NpZ25tZW50c1tpXSA9IHR5cGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIEFsc28gZm9yd2FyZCBhbGwgdXNlcnMuCiAgICAgIHR5cGUuYWRkVXNlcnNPZihleGlzdGluZyk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoZXhpc3RpbmcgPT0gbnVsbCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gZ2V0RGVmYXVsdFR5cGVPZlBhcmFtZXRlcihMb2NhbCBwYXJhbWV0ZXIpIHsKICAgIHJldHVybiBkZWZhdWx0VHlwZU9mUGFyYW1ldGVyLnB1dElmQWJzZW50KHBhcmFtZXRlciwgKCkgewogICAgICByZXR1cm4gbmV3IFBsYWNlaG9sZGVyVHlwZUluZm9ybWF0aW9uKAogICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbiwgdHlwZXMuY3VycmVudE1lbWJlcik7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaGFzQWxyZWFkeUNvbXB1dGVkVHlwZU9mUGFyYW1ldGVyRGVmYXVsdChMb2NhbCBwYXJhbWV0ZXIpIHsKICAgIFR5cGVJbmZvcm1hdGlvbiBzZWVuID0gZGVmYXVsdFR5cGVPZlBhcmFtZXRlcltwYXJhbWV0ZXJdOwogICAgcmV0dXJuIChzZWVuICE9IG51bGwgJiYgc2VlbiBpcyEgUGxhY2Vob2xkZXJUeXBlSW5mb3JtYXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHR5cGVPZlBhcmFtZXRlcihMb2NhbCBlbGVtZW50KSB7CiAgICByZXR1cm4gdHlwZXMuZ2V0SW5mZXJyZWRUeXBlT2ZQYXJhbWV0ZXIoZWxlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdHlwZU9mTWVtYmVyKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBpZiAoZWxlbWVudCBpcyBGdW5jdGlvbkVudGl0eSkgcmV0dXJuIHR5cGVzLmZ1bmN0aW9uVHlwZTsKICAgIHJldHVybiB0eXBlcy5nZXRJbmZlcnJlZFR5cGVPZk1lbWJlcihlbGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiByZXR1cm5UeXBlT2ZNZW1iZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIGlmIChlbGVtZW50IGlzISBGdW5jdGlvbkVudGl0eSkgcmV0dXJuIHR5cGVzLmR5bmFtaWNUeXBlOwogICAgcmV0dXJuIHR5cGVzLmdldEluZmVycmVkVHlwZU9mTWVtYmVyKGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWNvcmRUeXBlT2ZGaWVsZChGaWVsZEVudGl0eSBlbGVtZW50LCBUeXBlSW5mb3JtYXRpb24gdHlwZSkgewogICAgdHlwZXMuZ2V0SW5mZXJyZWRUeXBlT2ZNZW1iZXIoZWxlbWVudCkuYWRkQXNzaWdubWVudCh0eXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVjb3JkUmV0dXJuVHlwZShGdW5jdGlvbkVudGl0eSBlbGVtZW50LCBUeXBlSW5mb3JtYXRpb24gdHlwZSkgewogICAgVHlwZUluZm9ybWF0aW9uIGluZm8gPSB0eXBlcy5nZXRJbmZlcnJlZFR5cGVPZk1lbWJlcihlbGVtZW50KTsKICAgIGlmIChlbGVtZW50Lm5hbWUgPT0gJz09JykgewogICAgICAvLyBFdmVuIGlmIHguPT0gZG9lc24ndCByZXR1cm4gYSBib29sLCAneCA9PSBudWxsJyBldmFsdWF0ZXMgdG8gJ2ZhbHNlJy4KICAgICAgaW5mby5hZGRBc3NpZ25tZW50KHR5cGVzLmJvb2xUeXBlKTsKICAgIH0KICAgIC8vIFRPRE8obmdlb2ZmcmF5KTogQ2xlYW4gdXAuIFdlIGRvIHRoZXNlIGNoZWNrcyBiZWNhdXNlCiAgICAvLyBbU2ltcGxlVHlwZXNJbmZlcnJlcl0gZGVhbHMgd2l0aCB0d28gZGlmZmVyZW50IGluZmVycmVycy4KICAgIGlmICh0eXBlID09IG51bGwpIHJldHVybjsKICAgIGlmIChpbmZvLmFzc2lnbm1lbnRzLmlzRW1wdHkpIGluZm8uYWRkQXNzaWdubWVudCh0eXBlKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiBhZGRSZXR1cm5UeXBlRm9yTWV0aG9kKAogICAgICBGdW5jdGlvbkVudGl0eSBlbGVtZW50LCBUeXBlSW5mb3JtYXRpb24gdW51c2VkLCBUeXBlSW5mb3JtYXRpb24gbmV3VHlwZSkgewogICAgVHlwZUluZm9ybWF0aW9uIHR5cGUgPSB0eXBlcy5nZXRJbmZlcnJlZFR5cGVPZk1lbWJlcihlbGVtZW50KTsKICAgIC8vIFRPRE8obmdlb2ZmcmF5KTogQ2xlYW4gdXAuIFdlIGRvIHRoaXMgY2hlY2sgYmVjYXVzZQogICAgLy8gW1NpbXBsZVR5cGVzSW5mZXJyZXJdIGRlYWxzIHdpdGggdHdvIGRpZmZlcmVudCBpbmZlcnJlcnMuCiAgICBpZiAoZWxlbWVudCBpcyBDb25zdHJ1Y3RvckVudGl0eSAmJiBlbGVtZW50LmlzR2VuZXJhdGl2ZUNvbnN0cnVjdG9yKSB7CiAgICAgIHJldHVybiB0eXBlOwogICAgfQogICAgdHlwZS5hZGRBc3NpZ25tZW50KG5ld1R5cGUpOwogICAgcmV0dXJuIHR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gcmVnaXN0ZXJDYWxsZWRNZW1iZXIoCiAgICAgIE9iamVjdCBub2RlLAogICAgICBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrLAogICAgICBNZW1iZXJFbnRpdHkgY2FsbGVyLAogICAgICBNZW1iZXJFbnRpdHkgY2FsbGVlLAogICAgICBBcmd1bWVudHNUeXBlcyBhcmd1bWVudHMsCiAgICAgIFNpZGVFZmZlY3RzQnVpbGRlciBzaWRlRWZmZWN0c0J1aWxkZXIsCiAgICAgIGJvb2wgaW5Mb29wKSB7CiAgICBDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbiBpbmZvID0gbmV3IFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKAogICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4sCiAgICAgICAgdHlwZXMuY3VycmVudE1lbWJlciwKICAgICAgICBub2RlLAogICAgICAgIGNhbGxlciwKICAgICAgICBjYWxsZWUsCiAgICAgICAgc2VsZWN0b3IsCiAgICAgICAgbWFzaywKICAgICAgICBhcmd1bWVudHMsCiAgICAgICAgaW5Mb29wKTsKICAgIC8vIElmIHRoaXMgY2xhc3MgaGFzIGEgJ2NhbGwnIG1ldGhvZCB0aGVuIHdlIGhhdmUgZXNzZW50aWFsbHkgY3JlYXRlZCBhCiAgICAvLyBjbG9zdXJlIGhlcmUuIFJlZ2lzdGVyIGl0IGFzIHN1Y2ggc28gdGhhdCBpdCBpcyB0cmFjZWQuCiAgICAvLyBOb3RlOiB3ZSBleGNsdWRlIGZhY3RvcnkgY29uc3RydWN0b3JzIGJlY2F1c2UgdGhleSBkb24ndCBhbHdheXMgY3JlYXRlIGFuCiAgICAvLyBpbnN0YW5jZSBvZiB0aGUgdHlwZS4gVGhleSBhcmUgc3RhdGljIG1ldGhvZHMgdGhhdCBkZWxlZ2F0ZSB0byBzb21lIG90aGVyCiAgICAvLyBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yIHRvIGRvIHRoZSBhY3R1YWwgY3JlYXRpb24gb2YgdGhlIG9iamVjdC4KICAgIGlmIChzZWxlY3RvciAhPSBudWxsICYmCiAgICAgICAgc2VsZWN0b3IuaXNDYWxsICYmCiAgICAgICAgY2FsbGVlIGlzIENvbnN0cnVjdG9yRW50aXR5ICYmCiAgICAgICAgY2FsbGVlLmlzR2VuZXJhdGl2ZUNvbnN0cnVjdG9yKSB7CiAgICAgIENsYXNzRW50aXR5IGNscyA9IGNhbGxlZS5lbmNsb3NpbmdDbGFzczsKICAgICAgaWYgKGhhc0NhbGxUeXBlKGNscykpIHsKICAgICAgICB0eXBlcy5hbGxvY2F0ZWRDbG9zdXJlcy5hZGQoaW5mbyk7CiAgICAgIH0KICAgIH0KICAgIGluZm8uYWRkVG9HcmFwaCh0aGlzKTsKICAgIHR5cGVzLmFsbG9jYXRlZENhbGxzLmFkZChpbmZvKTsKICAgIHVwZGF0ZVNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzQnVpbGRlciwgc2VsZWN0b3IsIGNhbGxlZSk7CiAgICByZXR1cm4gaW5mbzsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiByZWdpc3RlckNhbGxlZFNlbGVjdG9yKAogICAgICBDYWxsVHlwZSBjYWxsVHlwZSwKICAgICAgaXIuTm9kZSBub2RlLAogICAgICBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrLAogICAgICBUeXBlSW5mb3JtYXRpb24gcmVjZWl2ZXJUeXBlLAogICAgICBNZW1iZXJFbnRpdHkgY2FsbGVyLAogICAgICBBcmd1bWVudHNUeXBlcyBhcmd1bWVudHMsCiAgICAgIFNpZGVFZmZlY3RzQnVpbGRlciBzaWRlRWZmZWN0c0J1aWxkZXIsCiAgICAgIHtib29sIGluTG9vcCwKICAgICAgYm9vbCBpc0NvbmRpdGlvbmFsfSkgewogICAgaWYgKHNlbGVjdG9yLmlzQ2xvc3VyZUNhbGwpIHsKICAgICAgcmV0dXJuIHJlZ2lzdGVyQ2FsbGVkQ2xvc3VyZShub2RlLCBzZWxlY3RvciwgbWFzaywgcmVjZWl2ZXJUeXBlLCBjYWxsZXIsCiAgICAgICAgICBhcmd1bWVudHMsIHNpZGVFZmZlY3RzQnVpbGRlciwKICAgICAgICAgIGluTG9vcDogaW5Mb29wKTsKICAgIH0KCiAgICBpZiAoY2xvc2VkV29ybGQuaW5jbHVkZXNDbG9zdXJlQ2FsbChzZWxlY3RvciwgbWFzaykpIHsKICAgICAgc2lkZUVmZmVjdHNCdWlsZGVyLnNldEFsbFNpZGVFZmZlY3RzQW5kRGVwZW5kc09uU29tZXRoaW5nKCk7CiAgICB9CiAgICBjbG9zZWRXb3JsZC5sb2NhdGVNZW1iZXJzKHNlbGVjdG9yLCBtYXNrKS5mb3JFYWNoKChjYWxsZWUpIHsKICAgICAgdXBkYXRlU2lkZUVmZmVjdHMoc2lkZUVmZmVjdHNCdWlsZGVyLCBzZWxlY3RvciwgY2FsbGVlKTsKICAgIH0pOwoKICAgIENhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8gPSBuZXcgRHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKAogICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4sCiAgICAgICAgdHlwZXMuY3VycmVudE1lbWJlciwKICAgICAgICBjYWxsVHlwZSwKICAgICAgICBub2RlLAogICAgICAgIGNhbGxlciwKICAgICAgICBzZWxlY3RvciwKICAgICAgICBtYXNrLAogICAgICAgIHJlY2VpdmVyVHlwZSwKICAgICAgICBhcmd1bWVudHMsCiAgICAgICAgaW5Mb29wLAogICAgICAgIGlzQ29uZGl0aW9uYWwpOwoKICAgIGluZm8uYWRkVG9HcmFwaCh0aGlzKTsKICAgIHR5cGVzLmFsbG9jYXRlZENhbGxzLmFkZChpbmZvKTsKICAgIHJldHVybiBpbmZvOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHJlZ2lzdGVyQXdhaXQoaXIuTm9kZSBub2RlLCBUeXBlSW5mb3JtYXRpb24gYXJndW1lbnQpIHsKICAgIEF3YWl0VHlwZUluZm9ybWF0aW9uIGluZm8gPSBuZXcgQXdhaXRUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbiwgdHlwZXMuY3VycmVudE1lbWJlciwgbm9kZSk7CiAgICBpbmZvLmFkZEFzc2lnbm1lbnQoYXJndW1lbnQpOwogICAgdHlwZXMuYWxsb2NhdGVkVHlwZXMuYWRkKGluZm8pOwogICAgcmV0dXJuIGluZm87CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gcmVnaXN0ZXJZaWVsZChpci5Ob2RlIG5vZGUsIFR5cGVJbmZvcm1hdGlvbiBhcmd1bWVudCkgewogICAgWWllbGRUeXBlSW5mb3JtYXRpb24gaW5mbyA9IG5ldyBZaWVsZFR5cGVJbmZvcm1hdGlvbigKICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLCB0eXBlcy5jdXJyZW50TWVtYmVyLCBub2RlKTsKICAgIGluZm8uYWRkQXNzaWdubWVudChhcmd1bWVudCk7CiAgICB0eXBlcy5hbGxvY2F0ZWRUeXBlcy5hZGQoaW5mbyk7CiAgICByZXR1cm4gaW5mbzsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiByZWdpc3RlckNhbGxlZENsb3N1cmUoCiAgICAgIGlyLk5vZGUgbm9kZSwKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgbWFzaywKICAgICAgVHlwZUluZm9ybWF0aW9uIGNsb3N1cmUsCiAgICAgIE1lbWJlckVudGl0eSBjYWxsZXIsCiAgICAgIEFyZ3VtZW50c1R5cGVzIGFyZ3VtZW50cywKICAgICAgU2lkZUVmZmVjdHNCdWlsZGVyIHNpZGVFZmZlY3RzQnVpbGRlciwKICAgICAge2Jvb2wgaW5Mb29wfSkgewogICAgc2lkZUVmZmVjdHNCdWlsZGVyLnNldEFsbFNpZGVFZmZlY3RzQW5kRGVwZW5kc09uU29tZXRoaW5nKCk7CiAgICBDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbiBpbmZvID0gbmV3IENsb3N1cmVDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbigKICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICAgIHR5cGVzLmN1cnJlbnRNZW1iZXIsCiAgICAgICAgbm9kZSwKICAgICAgICBjYWxsZXIsCiAgICAgICAgc2VsZWN0b3IsCiAgICAgICAgbWFzaywKICAgICAgICBjbG9zdXJlLAogICAgICAgIGFyZ3VtZW50cywKICAgICAgICBpbkxvb3ApOwogICAgaW5mby5hZGRUb0dyYXBoKHRoaXMpOwogICAgdHlwZXMuYWxsb2NhdGVkQ2FsbHMuYWRkKGluZm8pOwogICAgcmV0dXJuIGluZm87CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNsb3NlKCkgewogICAgZm9yIChNZW1iZXJUeXBlSW5mb3JtYXRpb24gdHlwZUluZm9ybWF0aW9uCiAgICAgICAgaW4gdHlwZXMubWVtYmVyVHlwZUluZm9ybWF0aW9ucy52YWx1ZXMpIHsKICAgICAgdHlwZUluZm9ybWF0aW9uLmNvbXB1dGVJc0NhbGxlZE9uY2UoKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2xlYXIoKSB7CiAgICBpZiAocmV0YWluRGF0YUZvclRlc3RpbmcpIHJldHVybjsKCiAgICB2b2lkIGNsZWFudXAoVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgICAgaW5mby5jbGVhbnVwKCk7CiAgICB9CgogICAgdHlwZXMuYWxsb2NhdGVkQ2FsbHMuZm9yRWFjaChjbGVhbnVwKTsKICAgIHR5cGVzLmFsbG9jYXRlZENhbGxzLmNsZWFyKCk7CgogICAgZGVmYXVsdFR5cGVPZlBhcmFtZXRlci5jbGVhcigpOwoKICAgIHR5cGVzLnBhcmFtZXRlclR5cGVJbmZvcm1hdGlvbnMudmFsdWVzLmZvckVhY2goY2xlYW51cCk7CiAgICB0eXBlcy5tZW1iZXJUeXBlSW5mb3JtYXRpb25zLnZhbHVlcy5mb3JFYWNoKGNsZWFudXApOwoKICAgIHR5cGVzLmFsbG9jYXRlZFR5cGVzLmZvckVhY2goY2xlYW51cCk7CiAgICB0eXBlcy5hbGxvY2F0ZWRUeXBlcy5jbGVhcigpOwoKICAgIHR5cGVzLmNvbmNyZXRlVHlwZXMuY2xlYXIoKTsKCiAgICB0eXBlcy5hbGxvY2F0ZWRDbG9zdXJlcy5mb3JFYWNoKGNsZWFudXApOwogICAgdHlwZXMuYWxsb2NhdGVkQ2xvc3VyZXMuY2xlYXIoKTsKCiAgICBhbmFseXplZEVsZW1lbnRzLmNsZWFyKCk7CiAgICBnZW5lcmF0aXZlQ29uc3RydWN0b3JzRXhwb3NpbmdUaGlzLmNsZWFyKCk7CgogICAgdHlwZXMuYWxsb2NhdGVkTWFwcy52YWx1ZXMuZm9yRWFjaChjbGVhbnVwKTsKICAgIHR5cGVzLmFsbG9jYXRlZFNldHMudmFsdWVzLmZvckVhY2goY2xlYW51cCk7CiAgICB0eXBlcy5hbGxvY2F0ZWRMaXN0cy52YWx1ZXMuZm9yRWFjaChjbGVhbnVwKTsKCiAgICBfbWVtYmVyRGF0YS5jbGVhcigpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBnZXRDYWxsZXJzT2ZGb3JUZXN0aW5nKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBNZW1iZXJUeXBlSW5mb3JtYXRpb24gaW5mbyA9IHR5cGVzLmdldEluZmVycmVkVHlwZU9mTWVtYmVyKGVsZW1lbnQpOwogICAgcmV0dXJuIGluZm8uY2FsbGVyc0ZvclRlc3Rpbmc7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdHlwZU9mTWVtYmVyV2l0aFNlbGVjdG9yKAogICAgICBNZW1iZXJFbnRpdHkgZWxlbWVudCwgU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgIGlmIChlbGVtZW50Lm5hbWUgPT0gSWRlbnRpZmllcnMubm9TdWNoTWV0aG9kXyAmJgogICAgICAgIHNlbGVjdG9yLm5hbWUgIT0gZWxlbWVudC5uYW1lKSB7CiAgICAgIC8vIEFuIGludm9jYXRpb24gY2FuIHJlc29sdmUgdG8gYSBbbm9TdWNoTWV0aG9kXSwgaW4gd2hpY2ggY2FzZQogICAgICAvLyB3ZSBnZXQgdGhlIHJldHVybiB0eXBlIG9mIFtub1N1Y2hNZXRob2RdLgogICAgICByZXR1cm4gcmV0dXJuVHlwZU9mTWVtYmVyKGVsZW1lbnQpOwogICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pc0dldHRlcikgewogICAgICBpZiAoZWxlbWVudC5pc0Z1bmN0aW9uKSB7CiAgICAgICAgLy8gW2Z1bmN0aW9uVHlwZV0gaXMgbnVsbCBpZiB0aGUgaW5mZXJyZXIgZGlkIG5vdCBydW4uCiAgICAgICAgcmV0dXJuIHR5cGVzLmZ1bmN0aW9uVHlwZSA9PSBudWxsCiAgICAgICAgICAgID8gdHlwZXMuZHluYW1pY1R5cGUKICAgICAgICAgICAgOiB0eXBlcy5mdW5jdGlvblR5cGU7CiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5pc0ZpZWxkKSB7CiAgICAgICAgcmV0dXJuIHR5cGVPZk1lbWJlcihlbGVtZW50KTsKICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmlzR2V0dGVyKSB7CiAgICAgICAgcmV0dXJuIHJldHVyblR5cGVPZk1lbWJlcihlbGVtZW50KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQoZmFsc2UsIGZhaWxlZEF0KGVsZW1lbnQsICJVbmV4cGVjdGVkIG1lbWJlciAkZWxlbWVudCIpKTsKICAgICAgICByZXR1cm4gdHlwZXMuZHluYW1pY1R5cGU7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZWxlbWVudC5pc0dldHRlciB8fCBlbGVtZW50LmlzRmllbGQpIHsKICAgICAgYXNzZXJ0KHNlbGVjdG9yLmlzQ2FsbCB8fCBzZWxlY3Rvci5pc1NldHRlcik7CiAgICAgIHJldHVybiB0eXBlcy5keW5hbWljVHlwZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiByZXR1cm5UeXBlT2ZNZW1iZXIoZWxlbWVudCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNhbkZpZWxkQmVVc2VkRm9yR2xvYmFsT3B0aW1pemF0aW9ucyhGaWVsZEVudGl0eSBlbGVtZW50KSB7CiAgICBpZiAoY2xvc2VkV29ybGQuYmFja2VuZFVzYWdlLmlzRmllbGRVc2VkQnlCYWNrZW5kKGVsZW1lbnQpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICgoZWxlbWVudC5pc1RvcExldmVsIHx8IGVsZW1lbnQuaXNTdGF0aWMpICYmICFlbGVtZW50LmlzQXNzaWduYWJsZSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjYW5GdW5jdGlvblBhcmFtZXRlcnNCZVVzZWRGb3JHbG9iYWxPcHRpbWl6YXRpb25zKAogICAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikgewogICAgcmV0dXJuICFjbG9zZWRXb3JsZC5iYWNrZW5kVXNhZ2UuaXNGdW5jdGlvblVzZWRCeUJhY2tlbmQoZnVuY3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBhc3N1bWVEeW5hbWljKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIHJldHVybiBjbG9zZWRXb3JsZC5hbm5vdGF0aW9uc0RhdGEuaGFzQXNzdW1lRHluYW1pYyhtZW1iZXIpOwogIH0KfQoKY2xhc3MgS2VybmVsVHlwZVN5c3RlbVN0cmF0ZWd5IGltcGxlbWVudHMgVHlwZVN5c3RlbVN0cmF0ZWd5IHsKICBmaW5hbCBKc0Nsb3NlZFdvcmxkIF9jbG9zZWRXb3JsZDsKCiAgS2VybmVsVHlwZVN5c3RlbVN0cmF0ZWd5KHRoaXMuX2Nsb3NlZFdvcmxkKTsKCiAgSkVsZW1lbnRFbnZpcm9ubWVudCBnZXQgX2VsZW1lbnRFbnZpcm9ubWVudCA9PgogICAgICBfY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50OwoKICBAb3ZlcnJpZGUKICBib29sIGNoZWNrQ2xhc3NFbnRpdHkoQ2xhc3NFbnRpdHkgY2xzKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGNoZWNrTWFwTm9kZShpci5Ob2RlIG5vZGUpID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgY2hlY2tTZXROb2RlKGlyLk5vZGUgbm9kZSkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjaGVja0xpc3ROb2RlKGlyLk5vZGUgbm9kZSkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjaGVja0xvb3BQaGlOb2RlKGlyLk5vZGUgbm9kZSkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjaGVja1BoaU5vZGUoaXIuTm9kZSBub2RlKSA9PgogICAgICBub2RlID09IG51bGwgfHwgbm9kZSBpcyBpci5UcnlDYXRjaCB8fCBub2RlIGlzIGlyLlRyeUZpbmFsbHk7CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaFBhcmFtZXRlcihGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwgdm9pZCBmKExvY2FsIHBhcmFtZXRlcikpIHsKICAgIGZvckVhY2hPcmRlcmVkUGFyYW1ldGVyQXNMb2NhbCgKICAgICAgICBfY2xvc2VkV29ybGQuZ2xvYmFsTG9jYWxzTWFwLCBfY2xvc2VkV29ybGQuZWxlbWVudE1hcCwgZnVuY3Rpb24sCiAgICAgICAgKExvY2FsIHBhcmFtZXRlciwge2Jvb2wgaXNFbGlkZWR9KSB7CiAgICAgIGYocGFyYW1ldGVyKTsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uIGNyZWF0ZVBhcmFtZXRlclR5cGVJbmZvcm1hdGlvbigKICAgICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICBjb3ZhcmlhbnQgSkxvY2FsIHBhcmFtZXRlciwKICAgICAgVHlwZVN5c3RlbSB0eXBlcykgewogICAgTWVtYmVyRW50aXR5IGNvbnRleHQgPSBwYXJhbWV0ZXIubWVtYmVyQ29udGV4dDsKICAgIEtlcm5lbFRvTG9jYWxzTWFwIGxvY2Fsc01hcCA9CiAgICAgICAgX2Nsb3NlZFdvcmxkLmdsb2JhbExvY2Fsc01hcC5nZXRMb2NhbHNNYXAoY29udGV4dCk7CiAgICBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb25Ob2RlID0KICAgICAgICBsb2NhbHNNYXAuZ2V0RnVuY3Rpb25Ob2RlRm9yUGFyYW1ldGVyKHBhcmFtZXRlcik7CiAgICBEYXJ0VHlwZSB0eXBlID0gbG9jYWxzTWFwLmdldExvY2FsVHlwZShfY2xvc2VkV29ybGQuZWxlbWVudE1hcCwgcGFyYW1ldGVyKTsKICAgIE1lbWJlckVudGl0eSBtZW1iZXI7CiAgICBib29sIGlzQ2xvc3VyZSA9IGZhbHNlOwogICAgaWYgKGZ1bmN0aW9uTm9kZS5wYXJlbnQgaXMgaXIuTWVtYmVyKSB7CiAgICAgIG1lbWJlciA9IF9jbG9zZWRXb3JsZC5lbGVtZW50TWFwLmdldE1lbWJlcihmdW5jdGlvbk5vZGUucGFyZW50KTsKICAgIH0gZWxzZSBpZiAoZnVuY3Rpb25Ob2RlLnBhcmVudCBpcyBpci5GdW5jdGlvbkV4cHJlc3Npb24gfHwKICAgICAgICBmdW5jdGlvbk5vZGUucGFyZW50IGlzIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24pIHsKICAgICAgQ2xvc3VyZVJlcHJlc2VudGF0aW9uSW5mbyBpbmZvID0KICAgICAgICAgIF9jbG9zZWRXb3JsZC5jbG9zdXJlRGF0YUxvb2t1cC5nZXRDbG9zdXJlSW5mbyhmdW5jdGlvbk5vZGUucGFyZW50KTsKICAgICAgbWVtYmVyID0gaW5mby5jYWxsTWV0aG9kOwogICAgICBpc0Nsb3N1cmUgPSB0cnVlOwogICAgfQogICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIG1lbWJlclR5cGVJbmZvcm1hdGlvbiA9CiAgICAgICAgdHlwZXMuZ2V0SW5mZXJyZWRUeXBlT2ZNZW1iZXIobWVtYmVyKTsKICAgIGlmIChpc0Nsb3N1cmUpIHsKICAgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24ubG9jYWxGdW5jdGlvbigKICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4sIG1lbWJlclR5cGVJbmZvcm1hdGlvbiwgcGFyYW1ldGVyLCB0eXBlLCBtZW1iZXIpOwogICAgfSBlbHNlIGlmIChtZW1iZXIuaXNJbnN0YW5jZU1lbWJlcikgewogICAgICByZXR1cm4gbmV3IFBhcmFtZXRlclR5cGVJbmZvcm1hdGlvbi5pbnN0YW5jZU1lbWJlcigKICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4sCiAgICAgICAgICBtZW1iZXJUeXBlSW5mb3JtYXRpb24sCiAgICAgICAgICBwYXJhbWV0ZXIsCiAgICAgICAgICB0eXBlLAogICAgICAgICAgbWVtYmVyLAogICAgICAgICAgbmV3IFBhcmFtZXRlckFzc2lnbm1lbnRzKCkpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24uc3RhdGljKAogICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbiwgbWVtYmVyVHlwZUluZm9ybWF0aW9uLCBwYXJhbWV0ZXIsIHR5cGUsIG1lbWJlcik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBNZW1iZXJUeXBlSW5mb3JtYXRpb24gY3JlYXRlTWVtYmVyVHlwZUluZm9ybWF0aW9uKAogICAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4sIE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIGlmIChtZW1iZXIuaXNGaWVsZCkgewogICAgICBGaWVsZEVudGl0eSBmaWVsZCA9IG1lbWJlcjsKICAgICAgRGFydFR5cGUgdHlwZSA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0RmllbGRUeXBlKGZpZWxkKTsKICAgICAgcmV0dXJuIG5ldyBGaWVsZFR5cGVJbmZvcm1hdGlvbihhYnN0cmFjdFZhbHVlRG9tYWluLCBmaWVsZCwgdHlwZSk7CiAgICB9IGVsc2UgaWYgKG1lbWJlci5pc0dldHRlcikgewogICAgICBGdW5jdGlvbkVudGl0eSBnZXR0ZXIgPSBtZW1iZXI7CiAgICAgIERhcnRUeXBlIHR5cGUgPSBfZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZShnZXR0ZXIpOwogICAgICByZXR1cm4gbmV3IEdldHRlclR5cGVJbmZvcm1hdGlvbihhYnN0cmFjdFZhbHVlRG9tYWluLCBnZXR0ZXIsIHR5cGUpOwogICAgfSBlbHNlIGlmIChtZW1iZXIuaXNTZXR0ZXIpIHsKICAgICAgRnVuY3Rpb25FbnRpdHkgc2V0dGVyID0gbWVtYmVyOwogICAgICByZXR1cm4gbmV3IFNldHRlclR5cGVJbmZvcm1hdGlvbihhYnN0cmFjdFZhbHVlRG9tYWluLCBzZXR0ZXIpOwogICAgfSBlbHNlIGlmIChtZW1iZXIuaXNGdW5jdGlvbikgewogICAgICBGdW5jdGlvbkVudGl0eSBtZXRob2QgPSBtZW1iZXI7CiAgICAgIERhcnRUeXBlIHR5cGUgPSBfZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZShtZXRob2QpOwogICAgICByZXR1cm4gbmV3IE1ldGhvZFR5cGVJbmZvcm1hdGlvbihhYnN0cmFjdFZhbHVlRG9tYWluLCBtZXRob2QsIHR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IgPSBtZW1iZXI7CiAgICAgIGlmIChjb25zdHJ1Y3Rvci5pc0ZhY3RvcnlDb25zdHJ1Y3RvcikgewogICAgICAgIERhcnRUeXBlIHR5cGUgPSBfZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZShjb25zdHJ1Y3Rvcik7CiAgICAgICAgcmV0dXJuIG5ldyBGYWN0b3J5Q29uc3RydWN0b3JUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4sIGNvbnN0cnVjdG9yLCB0eXBlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbmV3IEdlbmVyYXRpdmVDb25zdHJ1Y3RvclR5cGVJbmZvcm1hdGlvbigKICAgICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbiwgY29uc3RydWN0b3IpOwogICAgICB9CiAgICB9CiAgfQp9CgpjbGFzcyBLZXJuZWxHbG9iYWxUeXBlSW5mZXJlbmNlRWxlbWVudERhdGEKICAgIGltcGxlbWVudHMgR2xvYmFsVHlwZUluZmVyZW5jZUVsZW1lbnREYXRhIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0dsb2JhbFR5cGVJbmZlcmVuY2VFbGVtZW50RGF0YV0KICAvLy8gb2JqZWN0cyBpbiBhIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdnbG9iYWwtdHlwZS1pbmZlcmVuY2UtZWxlbWVudC1kYXRhJzsKCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVuYW1lIHRoaXMgdG9nZXRoZXIgd2l0aCBbdHlwZU9mU2VuZF0uCiAgTWFwPGlyLlRyZWVOb2RlLCBBYnN0cmFjdFZhbHVlPiBfc2VuZE1hcDsKCiAgTWFwPGlyLkZvckluU3RhdGVtZW50LCBBYnN0cmFjdFZhbHVlPiBfaXRlcmF0b3JNYXA7CiAgTWFwPGlyLkZvckluU3RhdGVtZW50LCBBYnN0cmFjdFZhbHVlPiBfY3VycmVudE1hcDsKICBNYXA8aXIuRm9ySW5TdGF0ZW1lbnQsIEFic3RyYWN0VmFsdWU+IF9tb3ZlTmV4dE1hcDsKCiAgS2VybmVsR2xvYmFsVHlwZUluZmVyZW5jZUVsZW1lbnREYXRhKCk7CgogIEtlcm5lbEdsb2JhbFR5cGVJbmZlcmVuY2VFbGVtZW50RGF0YS5pbnRlcm5hbCgKICAgICAgdGhpcy5fc2VuZE1hcCwgdGhpcy5faXRlcmF0b3JNYXAsIHRoaXMuX2N1cnJlbnRNYXAsIHRoaXMuX21vdmVOZXh0TWFwKTsKCiAgLy8vIERlc2VyaWFsaXplcyBhIFtHbG9iYWxUeXBlSW5mZXJlbmNlRWxlbWVudERhdGFdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgS2VybmVsR2xvYmFsVHlwZUluZmVyZW5jZUVsZW1lbnREYXRhLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgRGF0YVNvdXJjZSBzb3VyY2UsIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbikgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBNYXA8aXIuVHJlZU5vZGUsIEFic3RyYWN0VmFsdWU+IHNlbmRNYXAgPSBzb3VyY2UucmVhZFRyZWVOb2RlTWFwKAogICAgICAgICgpID0+IGFic3RyYWN0VmFsdWVEb21haW4ucmVhZEFic3RyYWN0VmFsdWVGcm9tRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgIGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIE1hcDxpci5Gb3JJblN0YXRlbWVudCwgQWJzdHJhY3RWYWx1ZT4gaXRlcmF0b3JNYXAgPSBzb3VyY2UucmVhZFRyZWVOb2RlTWFwKAogICAgICAgICgpID0+IGFic3RyYWN0VmFsdWVEb21haW4ucmVhZEFic3RyYWN0VmFsdWVGcm9tRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgIGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIE1hcDxpci5Gb3JJblN0YXRlbWVudCwgQWJzdHJhY3RWYWx1ZT4gY3VycmVudE1hcCA9IHNvdXJjZS5yZWFkVHJlZU5vZGVNYXAoCiAgICAgICAgKCkgPT4gYWJzdHJhY3RWYWx1ZURvbWFpbi5yZWFkQWJzdHJhY3RWYWx1ZUZyb21EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICAgZW1wdHlBc051bGw6IHRydWUpOwogICAgTWFwPGlyLkZvckluU3RhdGVtZW50LCBBYnN0cmFjdFZhbHVlPiBtb3ZlTmV4dE1hcCA9IHNvdXJjZS5yZWFkVHJlZU5vZGVNYXAoCiAgICAgICAgKCkgPT4gYWJzdHJhY3RWYWx1ZURvbWFpbi5yZWFkQWJzdHJhY3RWYWx1ZUZyb21EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICAgZW1wdHlBc051bGw6IHRydWUpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBLZXJuZWxHbG9iYWxUeXBlSW5mZXJlbmNlRWxlbWVudERhdGEuaW50ZXJuYWwoCiAgICAgICAgc2VuZE1hcCwgaXRlcmF0b3JNYXAsIGN1cnJlbnRNYXAsIG1vdmVOZXh0TWFwKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmssIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbikgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZVRyZWVOb2RlTWFwKAogICAgICAgIF9zZW5kTWFwLAogICAgICAgIChBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PgogICAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLndyaXRlQWJzdHJhY3RWYWx1ZVRvRGF0YVNpbmsoc2luaywgdmFsdWUpLAogICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlVHJlZU5vZGVNYXAoCiAgICAgICAgX2l0ZXJhdG9yTWFwLAogICAgICAgIChBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PgogICAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLndyaXRlQWJzdHJhY3RWYWx1ZVRvRGF0YVNpbmsoc2luaywgdmFsdWUpLAogICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlVHJlZU5vZGVNYXAoCiAgICAgICAgX2N1cnJlbnRNYXAsCiAgICAgICAgKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+CiAgICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4ud3JpdGVBYnN0cmFjdFZhbHVlVG9EYXRhU2luayhzaW5rLCB2YWx1ZSksCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVUcmVlTm9kZU1hcCgKICAgICAgICBfbW92ZU5leHRNYXAsCiAgICAgICAgKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+CiAgICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4ud3JpdGVBYnN0cmFjdFZhbHVlVG9EYXRhU2luayhzaW5rLCB2YWx1ZSksCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBHbG9iYWxUeXBlSW5mZXJlbmNlRWxlbWVudERhdGEgY29tcHJlc3MoKSB7CiAgICBpZiAoX3NlbmRNYXAgIT0gbnVsbCkgewogICAgICBfc2VuZE1hcC5yZW1vdmVXaGVyZShfbWFwc1RvTnVsbCk7CiAgICAgIGlmIChfc2VuZE1hcC5pc0VtcHR5KSB7CiAgICAgICAgX3NlbmRNYXAgPSBudWxsOwogICAgICB9CiAgICB9CiAgICBpZiAoX2l0ZXJhdG9yTWFwICE9IG51bGwpIHsKICAgICAgX2l0ZXJhdG9yTWFwLnJlbW92ZVdoZXJlKF9tYXBzVG9OdWxsKTsKICAgICAgaWYgKF9pdGVyYXRvck1hcC5pc0VtcHR5KSB7CiAgICAgICAgX2l0ZXJhdG9yTWFwID0gbnVsbDsKICAgICAgfQogICAgfQogICAgaWYgKF9jdXJyZW50TWFwICE9IG51bGwpIHsKICAgICAgX2N1cnJlbnRNYXAucmVtb3ZlV2hlcmUoX21hcHNUb051bGwpOwogICAgICBpZiAoX2N1cnJlbnRNYXAuaXNFbXB0eSkgewogICAgICAgIF9jdXJyZW50TWFwID0gbnVsbDsKICAgICAgfQogICAgfQogICAgaWYgKF9tb3ZlTmV4dE1hcCAhPSBudWxsKSB7CiAgICAgIF9tb3ZlTmV4dE1hcC5yZW1vdmVXaGVyZShfbWFwc1RvTnVsbCk7CiAgICAgIGlmIChfbW92ZU5leHRNYXAuaXNFbXB0eSkgewogICAgICAgIF9tb3ZlTmV4dE1hcCA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIGlmIChfc2VuZE1hcCA9PSBudWxsICYmCiAgICAgICAgX2l0ZXJhdG9yTWFwID09IG51bGwgJiYKICAgICAgICBfY3VycmVudE1hcCA9PSBudWxsICYmCiAgICAgICAgX21vdmVOZXh0TWFwID09IG51bGwpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdHlwZU9mU2VuZChpci5UcmVlTm9kZSBub2RlKSB7CiAgICBpZiAoX3NlbmRNYXAgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gX3NlbmRNYXBbbm9kZV07CiAgfQoKICB2b2lkIHNldEN1cnJlbnRUeXBlTWFzayhpci5Gb3JJblN0YXRlbWVudCBub2RlLCBBYnN0cmFjdFZhbHVlIG1hc2spIHsKICAgIF9jdXJyZW50TWFwID8/PSA8aXIuRm9ySW5TdGF0ZW1lbnQsIEFic3RyYWN0VmFsdWU+e307CiAgICBfY3VycmVudE1hcFtub2RlXSA9IG1hc2s7CiAgfQoKICB2b2lkIHNldE1vdmVOZXh0VHlwZU1hc2soaXIuRm9ySW5TdGF0ZW1lbnQgbm9kZSwgQWJzdHJhY3RWYWx1ZSBtYXNrKSB7CiAgICBfbW92ZU5leHRNYXAgPz89IDxpci5Gb3JJblN0YXRlbWVudCwgQWJzdHJhY3RWYWx1ZT57fTsKICAgIF9tb3ZlTmV4dE1hcFtub2RlXSA9IG1hc2s7CiAgfQoKICB2b2lkIHNldEl0ZXJhdG9yVHlwZU1hc2soaXIuRm9ySW5TdGF0ZW1lbnQgbm9kZSwgQWJzdHJhY3RWYWx1ZSBtYXNrKSB7CiAgICBfaXRlcmF0b3JNYXAgPz89IDxpci5Gb3JJblN0YXRlbWVudCwgQWJzdHJhY3RWYWx1ZT57fTsKICAgIF9pdGVyYXRvck1hcFtub2RlXSA9IG1hc2s7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkl0ZXJhdG9yQ3VycmVudChjb3ZhcmlhbnQgaXIuRm9ySW5TdGF0ZW1lbnQgbm9kZSkgewogICAgaWYgKF9jdXJyZW50TWFwID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIF9jdXJyZW50TWFwW25vZGVdOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZJdGVyYXRvck1vdmVOZXh0KGNvdmFyaWFudCBpci5Gb3JJblN0YXRlbWVudCBub2RlKSB7CiAgICBpZiAoX21vdmVOZXh0TWFwID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIF9tb3ZlTmV4dE1hcFtub2RlXTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdHlwZU9mSXRlcmF0b3IoY292YXJpYW50IGlyLkZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIGlmIChfaXRlcmF0b3JNYXAgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gX2l0ZXJhdG9yTWFwW25vZGVdOwogIH0KCiAgdm9pZCBzZXRUeXBlTWFzayhpci5UcmVlTm9kZSBub2RlLCBBYnN0cmFjdFZhbHVlIG1hc2spIHsKICAgIF9zZW5kTWFwID8/PSA8aXIuVHJlZU5vZGUsIEFic3RyYWN0VmFsdWU+e307CiAgICBfc2VuZE1hcFtub2RlXSA9IG1hc2s7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkdldHRlcihpci5UcmVlTm9kZSBub2RlKSB7CiAgICBpZiAoX3NlbmRNYXAgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gX3NlbmRNYXBbbm9kZV07CiAgfQp9Cgpib29sIF9tYXBzVG9OdWxsKGlyLlRyZWVOb2RlIG5vZGUsIEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IHZhbHVlID09IG51bGw7CoYnAE5OPAEoASIaGR8bIiMkISErNSckIiIaLiokKBglHh4eHhsaGh8jIBsVAVBRCyBQFDIpNDM1T00aTE0GAR8BQCAjMSdDAUIcSQEYNy8BIgEdASU4NjYBS04GMipQAUw6H0wBT0xNRQZRTD4BT0UeBk4RQgFMTk8PSCABRwEzRQE2AUcBQEcBMEUBTRBJ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bW1vbl9lbGVtZW50cy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JyBzaG93IERhcnRUeXBlLCBJbnRlcmZhY2VUeXBlOwppbXBvcnQgJy4uL3VuaXZlcnNlL2ZlYXR1cmUuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvdXNlLmRhcnQnIHNob3cgQ29uc3RhbnRVc2UsIER5bmFtaWNVc2UsIFN0YXRpY1VzZSwgVHlwZVVzZTsKaW1wb3J0ICcuLi91bml2ZXJzZS93b3JsZF9pbXBhY3QuZGFydCcKICAgIHNob3cgV29ybGRJbXBhY3QsIFdvcmxkSW1wYWN0QnVpbGRlckltcGwsIFdvcmxkSW1wYWN0VmlzaXRvcjsKaW1wb3J0ICcuLi91dGlsL2VudW1zZXQuZGFydCc7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnIHNob3cgUGFpciwgU2V0bGV0OwppbXBvcnQgJ3dvcmsuZGFydCcgc2hvdyBXb3JrSXRlbTsKCmNsYXNzIENvZGVnZW5JbXBhY3QgZXh0ZW5kcyBXb3JsZEltcGFjdCB7CiAgY29uc3QgQ29kZWdlbkltcGFjdCgpOwoKICBJdGVyYWJsZTxQYWlyPERhcnRUeXBlLCBEYXJ0VHlwZT4+IGdldCB0eXBlVmFyaWFibGVCb3VuZHNTdWJ0eXBlQ2hlY2tzIHsKICAgIHJldHVybiBjb25zdCA8UGFpcjxEYXJ0VHlwZSwgRGFydFR5cGU+PltdOwogIH0KCiAgSXRlcmFibGU8U3RyaW5nPiBnZXQgY29uc3RTeW1ib2xzID0+IGNvbnN0IDxTdHJpbmc+W107CgogIEl0ZXJhYmxlPFNldDxDbGFzc0VudGl0eT4+IGdldCBzcGVjaWFsaXplZEdldEludGVyY2VwdG9ycyB7CiAgICByZXR1cm4gY29uc3QgPFNldDxDbGFzc0VudGl0eT4+W107CiAgfQoKICBib29sIGdldCB1c2VzSW50ZXJjZXB0b3IgPT4gZmFsc2U7CgogIEl0ZXJhYmxlPEFzeW5jTWFya2VyPiBnZXQgYXN5bmNNYXJrZXJzID0+IGNvbnN0IDxBc3luY01hcmtlcj5bXTsKCiAgSXRlcmFibGU8R2VuZXJpY0luc3RhbnRpYXRpb24+IGdldCBnZW5lcmljSW5zdGFudGlhdGlvbnMgPT4KICAgICAgY29uc3QgPEdlbmVyaWNJbnN0YW50aWF0aW9uPltdOwp9CgpjbGFzcyBfQ29kZWdlbkltcGFjdCBleHRlbmRzIFdvcmxkSW1wYWN0QnVpbGRlckltcGwgaW1wbGVtZW50cyBDb2RlZ2VuSW1wYWN0IHsKICBTZXRsZXQ8UGFpcjxEYXJ0VHlwZSwgRGFydFR5cGU+PiBfdHlwZVZhcmlhYmxlQm91bmRzU3VidHlwZUNoZWNrczsKICBTZXRsZXQ8U3RyaW5nPiBfY29uc3RTeW1ib2xzOwogIExpc3Q8U2V0PENsYXNzRW50aXR5Pj4gX3NwZWNpYWxpemVkR2V0SW50ZXJjZXB0b3JzOwogIGJvb2wgX3VzZXNJbnRlcmNlcHRvciA9IGZhbHNlOwogIEVudW1TZXQ8QXN5bmNNYXJrZXI+IF9hc3luY01hcmtlcnM7CiAgU2V0PEdlbmVyaWNJbnN0YW50aWF0aW9uPiBfZ2VuZXJpY0luc3RhbnRpYXRpb25zOwoKICBfQ29kZWdlbkltcGFjdCgpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFwcGx5KFdvcmxkSW1wYWN0VmlzaXRvciB2aXNpdG9yKSB7CiAgICBzdGF0aWNVc2VzLmZvckVhY2godmlzaXRvci52aXNpdFN0YXRpY1VzZSk7CiAgICBkeW5hbWljVXNlcy5mb3JFYWNoKHZpc2l0b3IudmlzaXREeW5hbWljVXNlKTsKICAgIHR5cGVVc2VzLmZvckVhY2godmlzaXRvci52aXNpdFR5cGVVc2UpOwogIH0KCiAgdm9pZCByZWdpc3RlclR5cGVWYXJpYWJsZUJvdW5kc1N1YnR5cGVDaGVjaygKICAgICAgRGFydFR5cGUgc3VidHlwZSwgRGFydFR5cGUgc3VwZXJ0eXBlKSB7CiAgICBfdHlwZVZhcmlhYmxlQm91bmRzU3VidHlwZUNoZWNrcyA/Pz0gbmV3IFNldGxldDxQYWlyPERhcnRUeXBlLCBEYXJ0VHlwZT4+KCk7CiAgICBfdHlwZVZhcmlhYmxlQm91bmRzU3VidHlwZUNoZWNrcwogICAgICAgIC5hZGQobmV3IFBhaXI8RGFydFR5cGUsIERhcnRUeXBlPihzdWJ0eXBlLCBzdXBlcnR5cGUpKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPFBhaXI8RGFydFR5cGUsIERhcnRUeXBlPj4gZ2V0IHR5cGVWYXJpYWJsZUJvdW5kc1N1YnR5cGVDaGVja3MgewogICAgcmV0dXJuIF90eXBlVmFyaWFibGVCb3VuZHNTdWJ0eXBlQ2hlY2tzICE9IG51bGwKICAgICAgICA/IF90eXBlVmFyaWFibGVCb3VuZHNTdWJ0eXBlQ2hlY2tzCiAgICAgICAgOiBjb25zdCA8UGFpcjxEYXJ0VHlwZSwgRGFydFR5cGU+PltdOwogIH0KCiAgdm9pZCByZWdpc3RlckNvbnN0U3ltYm9sKFN0cmluZyBuYW1lKSB7CiAgICBfY29uc3RTeW1ib2xzID8/PSBuZXcgU2V0bGV0PFN0cmluZz4oKTsKICAgIF9jb25zdFN5bWJvbHMuYWRkKG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8U3RyaW5nPiBnZXQgY29uc3RTeW1ib2xzIHsKICAgIHJldHVybiBfY29uc3RTeW1ib2xzICE9IG51bGwgPyBfY29uc3RTeW1ib2xzIDogY29uc3QgPFN0cmluZz5bXTsKICB9CgogIHZvaWQgcmVnaXN0ZXJTcGVjaWFsaXplZEdldEludGVyY2VwdG9yKFNldDxDbGFzc0VudGl0eT4gY2xhc3NlcykgewogICAgX3NwZWNpYWxpemVkR2V0SW50ZXJjZXB0b3JzID8/PSA8U2V0PENsYXNzRW50aXR5Pj5bXTsKICAgIF9zcGVjaWFsaXplZEdldEludGVyY2VwdG9ycy5hZGQoY2xhc3Nlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxTZXQ8Q2xhc3NFbnRpdHk+PiBnZXQgc3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvcnMgewogICAgcmV0dXJuIF9zcGVjaWFsaXplZEdldEludGVyY2VwdG9ycyAhPSBudWxsCiAgICAgICAgPyBfc3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvcnMKICAgICAgICA6IGNvbnN0IDxTZXQ8Q2xhc3NFbnRpdHk+PltdOwogIH0KCiAgdm9pZCByZWdpc3RlclVzZUludGVyY2VwdG9yKCkgewogICAgX3VzZXNJbnRlcmNlcHRvciA9IHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCB1c2VzSW50ZXJjZXB0b3IgPT4gX3VzZXNJbnRlcmNlcHRvcjsKCiAgdm9pZCByZWdpc3RlckFzeW5jTWFya2VyKEFzeW5jTWFya2VyIGFzeW5jTWFya2VyKSB7CiAgICBfYXN5bmNNYXJrZXJzID8/PSBuZXcgRW51bVNldDxBc3luY01hcmtlcj4oKTsKICAgIF9hc3luY01hcmtlcnMuYWRkKGFzeW5jTWFya2VyKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPEFzeW5jTWFya2VyPiBnZXQgYXN5bmNNYXJrZXJzIHsKICAgIHJldHVybiBfYXN5bmNNYXJrZXJzICE9IG51bGwKICAgICAgICA/IF9hc3luY01hcmtlcnMuaXRlcmFibGUoQXN5bmNNYXJrZXIudmFsdWVzKQogICAgICAgIDogY29uc3QgPEFzeW5jTWFya2VyPltdOwogIH0KCiAgdm9pZCByZWdpc3RlckdlbmVyaWNJbnN0YW50aWF0aW9uKEdlbmVyaWNJbnN0YW50aWF0aW9uIGluc3RhbnRpYXRpb24pIHsKICAgIF9nZW5lcmljSW5zdGFudGlhdGlvbnMgPz89IG5ldyBTZXQ8R2VuZXJpY0luc3RhbnRpYXRpb24+KCk7CiAgICBfZ2VuZXJpY0luc3RhbnRpYXRpb25zLmFkZChpbnN0YW50aWF0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPEdlbmVyaWNJbnN0YW50aWF0aW9uPiBnZXQgZ2VuZXJpY0luc3RhbnRpYXRpb25zIHsKICAgIHJldHVybiBfZ2VuZXJpY0luc3RhbnRpYXRpb25zID8/IGNvbnN0IDxHZW5lcmljSW5zdGFudGlhdGlvbj5bXTsKICB9Cn0KCi8vIFRPRE8oam9obm5pd2ludGhlcik6IFNwbGl0IHRoaXMgY2xhc3MgaW50byBpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9uLgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNb3ZlIHRoaXMgaW1wbGVtZW50YXRpb24gdG8gdGhlIEpTIGJhY2tlbmQuCmNsYXNzIENvZGVnZW5SZWdpc3RyeSB7CiAgZmluYWwgRWxlbWVudEVudmlyb25tZW50IF9lbGVtZW50RW52aXJvbm1lbnQ7CiAgZmluYWwgTWVtYmVyRW50aXR5IGN1cnJlbnRFbGVtZW50OwogIGZpbmFsIF9Db2RlZ2VuSW1wYWN0IHdvcmxkSW1wYWN0OwoKICBDb2RlZ2VuUmVnaXN0cnkodGhpcy5fZWxlbWVudEVudmlyb25tZW50LCB0aGlzLmN1cnJlbnRFbGVtZW50KQogICAgICA6IHRoaXMud29ybGRJbXBhY3QgPSBuZXcgX0NvZGVnZW5JbXBhY3QoKTsKCiAgYm9vbCBnZXQgaXNGb3JSZXNvbHV0aW9uID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnQ29kZWdlblJlZ2lzdHJ5IGZvciAkY3VycmVudEVsZW1lbnQnOwoKICBAZGVwcmVjYXRlZAogIHZvaWQgcmVnaXN0ZXJJbnN0YW50aWF0ZWRDbGFzcyhDbGFzc0VudGl0eSBlbGVtZW50KSB7CiAgICByZWdpc3Rlckluc3RhbnRpYXRpb24oX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRSYXdUeXBlKGVsZW1lbnQpKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJTdGF0aWNVc2UoU3RhdGljVXNlIHN0YXRpY1VzZSkgewogICAgd29ybGRJbXBhY3QucmVnaXN0ZXJTdGF0aWNVc2Uoc3RhdGljVXNlKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJEeW5hbWljVXNlKER5bmFtaWNVc2UgZHluYW1pY1VzZSkgewogICAgd29ybGRJbXBhY3QucmVnaXN0ZXJEeW5hbWljVXNlKGR5bmFtaWNVc2UpOwogIH0KCiAgdm9pZCByZWdpc3RlclR5cGVVc2UoVHlwZVVzZSB0eXBlVXNlKSB7CiAgICB3b3JsZEltcGFjdC5yZWdpc3RlclR5cGVVc2UodHlwZVVzZSk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyQ29uc3RhbnRVc2UoQ29uc3RhbnRVc2UgY29uc3RhbnRVc2UpIHsKICAgIHdvcmxkSW1wYWN0LnJlZ2lzdGVyQ29uc3RhbnRVc2UoY29uc3RhbnRVc2UpOwogIH0KCiAgdm9pZCByZWdpc3RlclR5cGVWYXJpYWJsZUJvdW5kc1N1YnR5cGVDaGVjaygKICAgICAgRGFydFR5cGUgc3VidHlwZSwgRGFydFR5cGUgc3VwZXJ0eXBlKSB7CiAgICB3b3JsZEltcGFjdC5yZWdpc3RlclR5cGVWYXJpYWJsZUJvdW5kc1N1YnR5cGVDaGVjayhzdWJ0eXBlLCBzdXBlcnR5cGUpOwogIH0KCiAgdm9pZCByZWdpc3Rlckluc3RhbnRpYXRlZENsb3N1cmUoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgewogICAgd29ybGRJbXBhY3QucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5jYWxsTWV0aG9kKGVsZW1lbnQpKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJDb25zdFN5bWJvbChTdHJpbmcgbmFtZSkgewogICAgd29ybGRJbXBhY3QucmVnaXN0ZXJDb25zdFN5bWJvbChuYW1lKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJTcGVjaWFsaXplZEdldEludGVyY2VwdG9yKFNldDxDbGFzc0VudGl0eT4gY2xhc3NlcykgewogICAgd29ybGRJbXBhY3QucmVnaXN0ZXJTcGVjaWFsaXplZEdldEludGVyY2VwdG9yKGNsYXNzZXMpOwogIH0KCiAgdm9pZCByZWdpc3RlclVzZUludGVyY2VwdG9yKCkgewogICAgd29ybGRJbXBhY3QucmVnaXN0ZXJVc2VJbnRlcmNlcHRvcigpOwogIH0KCiAgdm9pZCByZWdpc3Rlckluc3RhbnRpYXRpb24oSW50ZXJmYWNlVHlwZSB0eXBlKSB7CiAgICByZWdpc3RlclR5cGVVc2UobmV3IFR5cGVVc2UuaW5zdGFudGlhdGlvbih0eXBlKSk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyQXN5bmNNYXJrZXIoQXN5bmNNYXJrZXIgYXN5bmNNYXJrZXIpIHsKICAgIHdvcmxkSW1wYWN0LnJlZ2lzdGVyQXN5bmNNYXJrZXIoYXN5bmNNYXJrZXIpOwogIH0KCiAgdm9pZCByZWdpc3RlckdlbmVyaWNJbnN0YW50aWF0aW9uKEdlbmVyaWNJbnN0YW50aWF0aW9uIGluc3RhbnRpYXRpb24pIHsKICAgIHdvcmxkSW1wYWN0LnJlZ2lzdGVyR2VuZXJpY0luc3RhbnRpYXRpb24oaW5zdGFudGlhdGlvbik7CiAgfQp9CgovLy8gW1dvcmtJdGVtXSB1c2VkIGV4Y2x1c2l2ZWx5IGJ5IHRoZSBbQ29kZWdlbkVucXVldWVyXS4KYWJzdHJhY3QgY2xhc3MgQ29kZWdlbldvcmtJdGVtIGV4dGVuZHMgV29ya0l0ZW0gewogIENvZGVnZW5SZWdpc3RyeSBnZXQgcmVnaXN0cnk7Cn0KgMUATk48ASABIiQ+I1AnQh8uIgEqGQFLLwQBOQE+JwQBJQFDAT4mAgFPRSA2ISY0ARQBDCswMiwEAS8uUSVABAEMSzQrLgQBKiwdBAEMJkUEAUU6LgQBDD4vJiYEASIdBAEMMAE2MiQEAQwrITUhBAFKQC8EAQw9RQQCAUxEGDAlJAFBMQElAQw+AQ44RAQBMC4EATMwBAEqKgQBNjIEAS8uTAQBPUYEASorBAFFPAQBIioEATM2BAE2MgQBSj0EAgE6MiACAShwYWNrYWdlOmNvbXBpbGVyL3NyYy9jb21tb24vY29kZWdlbi5kYXJ0NHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX21vZGVsL2VsZW1lbnRzLmRhcnTAAGYmLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5qc19tb2RlbC5lbGVtZW50czsKCmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnIHNob3cgTmFtZXM7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvaW5kZXhlZC5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9uYW1lcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9zZXJpYWxpemF0aW9uL3NlcmlhbGl6YXRpb24uZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY2xhc3Nfc2V0LmRhcnQnIHNob3cgQ2xhc3NIaWVyYXJjaHlOb2Rlc01hcEtleTsKaW1wb3J0ICdjbG9zdXJlLmRhcnQnOwoKY29uc3QgU3RyaW5nIGpzRWxlbWVudFByZWZpeCA9ICdqOic7CgpjbGFzcyBKTGlicmFyeSBleHRlbmRzIEluZGV4ZWRMaWJyYXJ5IHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0pMaWJyYXJ5XSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2xpYnJhcnknOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBAb3ZlcnJpZGUKICBmaW5hbCBVcmkgY2Fub25pY2FsVXJpOwoKICBKTGlicmFyeSh0aGlzLm5hbWUsIHRoaXMuY2Fub25pY2FsVXJpKTsKCiAgLy8vIERlc2VyaWFsaXplcyBhIFtKTGlicmFyeV0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBKTGlicmFyeS5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgU3RyaW5nIG5hbWUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgVXJpIGNhbm9uaWNhbFVyaSA9IHNvdXJjZS5yZWFkVXJpKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEpMaWJyYXJ5KG5hbWUsIGNhbm9uaWNhbFVyaSk7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtKTGlicmFyeV0gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVTdHJpbmcobmFtZSk7CiAgICBzaW5rLndyaXRlVXJpKGNhbm9uaWNhbFVyaSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyR7anNFbGVtZW50UHJlZml4fWxpYnJhcnkoJG5hbWUpJzsKfQoKLy8vIEVudW0gdXNlZCBmb3IgaWRlbnRpZnlpbmcgW0pDbGFzc10gc3ViY2xhc3NlcyBpbiBzZXJpYWxpemF0aW9uLgplbnVtIEpDbGFzc0tpbmQgeyBub2RlLCBjbG9zdXJlLCByZWNvcmQgfQoKY2xhc3MgSkNsYXNzIGV4dGVuZHMgSW5kZXhlZENsYXNzIHdpdGggQ2xhc3NIaWVyYXJjaHlOb2Rlc01hcEtleSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtKQ2xhc3NdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnY2xhc3MnOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBKTGlicmFyeSBsaWJyYXJ5OwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzQWJzdHJhY3Q7CgogIEpDbGFzcyh0aGlzLmxpYnJhcnksIHRoaXMubmFtZSwge3RoaXMuaXNBYnN0cmFjdH0pOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW0pDbGFzc10gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBKQ2xhc3MucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBKQ2xhc3NLaW5kIGtpbmQgPSBzb3VyY2UucmVhZEVudW0oSkNsYXNzS2luZC52YWx1ZXMpOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgSkNsYXNzS2luZC5ub2RlOgogICAgICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgICAgIEpMaWJyYXJ5IGxpYnJhcnkgPSBzb3VyY2UucmVhZExpYnJhcnkoKTsKICAgICAgICBTdHJpbmcgbmFtZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICAgICAgYm9vbCBpc0Fic3RyYWN0ID0gc291cmNlLnJlYWRCb29sKCk7CiAgICAgICAgc291cmNlLmVuZCh0YWcpOwogICAgICAgIHJldHVybiBuZXcgSkNsYXNzKGxpYnJhcnksIG5hbWUsIGlzQWJzdHJhY3Q6IGlzQWJzdHJhY3QpOwogICAgICBjYXNlIEpDbGFzc0tpbmQuY2xvc3VyZToKICAgICAgICByZXR1cm4gbmV3IEpDbG9zdXJlQ2xhc3MucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNhc2UgSkNsYXNzS2luZC5yZWNvcmQ6CiAgICAgICAgcmV0dXJuIG5ldyBKUmVjb3JkLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgfQogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuZXhwZWN0ZWQgQ2xhc3NLaW5kICRraW5kIik7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtKQ2xhc3NdIHRvIFtzaW5rXS4KICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShKQ2xhc3NLaW5kLm5vZGUpOwogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUxpYnJhcnkobGlicmFyeSk7CiAgICBzaW5rLndyaXRlU3RyaW5nKG5hbWUpOwogICAgc2luay53cml0ZUJvb2woaXNBYnN0cmFjdCk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNDbG9zdXJlID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJHtqc0VsZW1lbnRQcmVmaXh9Y2xhc3MoJG5hbWUpJzsKfQoKY2xhc3MgSlR5cGVkZWYgZXh0ZW5kcyBJbmRleGVkVHlwZWRlZiB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtKVHlwZWRlZl0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICd0eXBlZGVmJzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgSkxpYnJhcnkgbGlicmFyeTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIEpUeXBlZGVmKHRoaXMubGlicmFyeSwgdGhpcy5uYW1lKTsKCiAgLy8vIERlc2VyaWFsaXplcyBhIFtKVHlwZWRlZl0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBKVHlwZWRlZi5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgSkxpYnJhcnkgbGlicmFyeSA9IHNvdXJjZS5yZWFkTGlicmFyeSgpOwogICAgU3RyaW5nIG5hbWUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBKVHlwZWRlZihsaWJyYXJ5LCBuYW1lKTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0pUeXBlZGVmXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUxpYnJhcnkobGlicmFyeSk7CiAgICBzaW5rLndyaXRlU3RyaW5nKG5hbWUpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICcke2pzRWxlbWVudFByZWZpeH10eXBlZGVmKCRuYW1lKSc7Cn0KCi8vLyBFbnVtIHVzZWQgZm9yIGlkZW50aWZ5aW5nIFtKTWVtYmVyXSBzdWJjbGFzc2VzIGluIHNlcmlhbGl6YXRpb24uCmVudW0gSk1lbWJlcktpbmQgewogIGdlbmVyYXRpdmVDb25zdHJ1Y3RvciwKICBmYWN0b3J5Q29uc3RydWN0b3IsCiAgY29uc3RydWN0b3JCb2R5LAogIGZpZWxkLAogIGdldHRlciwKICBzZXR0ZXIsCiAgbWV0aG9kLAogIGNsb3N1cmVGaWVsZCwKICBjbG9zdXJlQ2FsbE1ldGhvZCwKICBnZW5lcmF0b3JCb2R5LAogIHNpZ25hdHVyZU1ldGhvZCwKICByZWNvcmRGaWVsZCwKfQoKYWJzdHJhY3QgY2xhc3MgSk1lbWJlciBleHRlbmRzIEluZGV4ZWRNZW1iZXIgewogIEBvdmVycmlkZQogIGZpbmFsIEpMaWJyYXJ5IGxpYnJhcnk7CiAgQG92ZXJyaWRlCiAgZmluYWwgSkNsYXNzIGVuY2xvc2luZ0NsYXNzOwogIGZpbmFsIE5hbWUgX25hbWU7CiAgZmluYWwgYm9vbCBfaXNTdGF0aWM7CgogIEpNZW1iZXIodGhpcy5saWJyYXJ5LCB0aGlzLmVuY2xvc2luZ0NsYXNzLCB0aGlzLl9uYW1lLCB7Ym9vbCBpc1N0YXRpYzogZmFsc2V9KQogICAgICA6IF9pc1N0YXRpYyA9IGlzU3RhdGljOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW0pNZW1iZXJdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgSk1lbWJlci5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIEpNZW1iZXJLaW5kIGtpbmQgPSBzb3VyY2UucmVhZEVudW0oSk1lbWJlcktpbmQudmFsdWVzKTsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIEpNZW1iZXJLaW5kLmdlbmVyYXRpdmVDb25zdHJ1Y3RvcjoKICAgICAgICByZXR1cm4gbmV3IEpHZW5lcmF0aXZlQ29uc3RydWN0b3IucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNhc2UgSk1lbWJlcktpbmQuZmFjdG9yeUNvbnN0cnVjdG9yOgogICAgICAgIHJldHVybiBuZXcgSkZhY3RvcnlDb25zdHJ1Y3Rvci5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgY2FzZSBKTWVtYmVyS2luZC5jb25zdHJ1Y3RvckJvZHk6CiAgICAgICAgcmV0dXJuIG5ldyBKQ29uc3RydWN0b3JCb2R5LnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBjYXNlIEpNZW1iZXJLaW5kLmZpZWxkOgogICAgICAgIHJldHVybiBuZXcgSkZpZWxkLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBjYXNlIEpNZW1iZXJLaW5kLmdldHRlcjoKICAgICAgICByZXR1cm4gbmV3IEpHZXR0ZXIucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNhc2UgSk1lbWJlcktpbmQuc2V0dGVyOgogICAgICAgIHJldHVybiBuZXcgSlNldHRlci5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgY2FzZSBKTWVtYmVyS2luZC5tZXRob2Q6CiAgICAgICAgcmV0dXJuIG5ldyBKTWV0aG9kLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBjYXNlIEpNZW1iZXJLaW5kLmNsb3N1cmVGaWVsZDoKICAgICAgICByZXR1cm4gbmV3IEpDbG9zdXJlRmllbGQucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNhc2UgSk1lbWJlcktpbmQuY2xvc3VyZUNhbGxNZXRob2Q6CiAgICAgICAgcmV0dXJuIG5ldyBKQ2xvc3VyZUNhbGxNZXRob2QucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNhc2UgSk1lbWJlcktpbmQuZ2VuZXJhdG9yQm9keToKICAgICAgICByZXR1cm4gbmV3IEpHZW5lcmF0b3JCb2R5LnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBjYXNlIEpNZW1iZXJLaW5kLnNpZ25hdHVyZU1ldGhvZDoKICAgICAgICByZXR1cm4gbmV3IEpTaWduYXR1cmVNZXRob2QucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNhc2UgSk1lbWJlcktpbmQucmVjb3JkRmllbGQ6CiAgICAgICAgcmV0dXJuIG5ldyBKUmVjb3JkRmllbGQucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICB9CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5leHBlY3RlZCBKTWVtYmVyS2luZCAka2luZCIpOwogIH0KCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbSk1lbWJlcl0gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IG5hbWUgPT4gX25hbWUudGV4dDsKCiAgQG92ZXJyaWRlCiAgTmFtZSBnZXQgbWVtYmVyTmFtZSA9PiBfbmFtZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNBc3NpZ25hYmxlID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0NvbnN0ID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0Fic3RyYWN0ID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1NldHRlciA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNHZXR0ZXIgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRnVuY3Rpb24gPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRmllbGQgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQ29uc3RydWN0b3IgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzSW5zdGFuY2VNZW1iZXIgPT4gZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCAmJiAhX2lzU3RhdGljOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1N0YXRpYyA9PiBlbmNsb3NpbmdDbGFzcyAhPSBudWxsICYmIF9pc1N0YXRpYzsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNUb3BMZXZlbCA9PiBlbmNsb3NpbmdDbGFzcyA9PSBudWxsOwoKICBTdHJpbmcgZ2V0IF9raW5kOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJHtqc0VsZW1lbnRQcmVmaXh9JF9raW5kJwogICAgICAnKCR7ZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCA/ICcke2VuY2xvc2luZ0NsYXNzLm5hbWV9LicgOiAnJ30kbmFtZSknOwp9CgphYnN0cmFjdCBjbGFzcyBKRnVuY3Rpb24gZXh0ZW5kcyBKTWVtYmVyCiAgICBpbXBsZW1lbnRzIEZ1bmN0aW9uRW50aXR5LCBJbmRleGVkRnVuY3Rpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmU7CiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc0V4dGVybmFsOwogIEBvdmVycmlkZQogIGZpbmFsIEFzeW5jTWFya2VyIGFzeW5jTWFya2VyOwoKICBKRnVuY3Rpb24oSkxpYnJhcnkgbGlicmFyeSwgSkNsYXNzIGVuY2xvc2luZ0NsYXNzLCBOYW1lIG5hbWUsCiAgICAgIHRoaXMucGFyYW1ldGVyU3RydWN0dXJlLCB0aGlzLmFzeW5jTWFya2VyLAogICAgICB7Ym9vbCBpc1N0YXRpYzogZmFsc2UsIHRoaXMuaXNFeHRlcm5hbDogZmFsc2V9KQogICAgICA6IHN1cGVyKGxpYnJhcnksIGVuY2xvc2luZ0NsYXNzLCBuYW1lLCBpc1N0YXRpYzogaXNTdGF0aWMpOwp9CgphYnN0cmFjdCBjbGFzcyBKQ29uc3RydWN0b3IgZXh0ZW5kcyBKRnVuY3Rpb24KICAgIGltcGxlbWVudHMgQ29uc3RydWN0b3JFbnRpdHksIEluZGV4ZWRDb25zdHJ1Y3RvciB7CiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc0NvbnN0OwoKICBKQ29uc3RydWN0b3IoCiAgICAgIEpDbGFzcyBlbmNsb3NpbmdDbGFzcywgTmFtZSBuYW1lLCBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlLAogICAgICB7Ym9vbCBpc0V4dGVybmFsLCB0aGlzLmlzQ29uc3R9KQogICAgICA6IHN1cGVyKGVuY2xvc2luZ0NsYXNzLmxpYnJhcnksIGVuY2xvc2luZ0NsYXNzLCBuYW1lLCBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgICAgICAgIEFzeW5jTWFya2VyLlNZTkMsCiAgICAgICAgICAgIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0NvbnN0cnVjdG9yID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzSW5zdGFuY2VNZW1iZXIgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU3RhdGljID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1RvcExldmVsID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0Zyb21FbnZpcm9ubWVudENvbnN0cnVjdG9yID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9raW5kID0+ICdjb25zdHJ1Y3Rvcic7Cn0KCmNsYXNzIEpHZW5lcmF0aXZlQ29uc3RydWN0b3IgZXh0ZW5kcyBKQ29uc3RydWN0b3IgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbSkdlbmVyYXRpdmVDb25zdHJ1Y3Rvcl0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdnZW5lcmF0aXZlLWNvbnN0cnVjdG9yJzsKCiAgSkdlbmVyYXRpdmVDb25zdHJ1Y3RvcigKICAgICAgSkNsYXNzIGVuY2xvc2luZ0NsYXNzLCBOYW1lIG5hbWUsIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgIHtib29sIGlzRXh0ZXJuYWwsIGJvb2wgaXNDb25zdH0pCiAgICAgIDogc3VwZXIoZW5jbG9zaW5nQ2xhc3MsIG5hbWUsIHBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAgICAgICAgaXNFeHRlcm5hbDogaXNFeHRlcm5hbCwgaXNDb25zdDogaXNDb25zdCk7CgogIGZhY3RvcnkgSkdlbmVyYXRpdmVDb25zdHJ1Y3Rvci5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgSkNsYXNzIGVuY2xvc2luZ0NsYXNzID0gc291cmNlLnJlYWRDbGFzcygpOwogICAgU3RyaW5nIG5hbWUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSA9CiAgICAgICAgbmV3IFBhcmFtZXRlclN0cnVjdHVyZS5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgIGJvb2wgaXNFeHRlcm5hbCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgYm9vbCBpc0NvbnN0ID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEpHZW5lcmF0aXZlQ29uc3RydWN0b3IoZW5jbG9zaW5nQ2xhc3MsCiAgICAgICAgbmV3IE5hbWUobmFtZSwgZW5jbG9zaW5nQ2xhc3MubGlicmFyeSksIHBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAgICBpc0V4dGVybmFsOiBpc0V4dGVybmFsLCBpc0NvbnN0OiBpc0NvbnN0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKEpNZW1iZXJLaW5kLmdlbmVyYXRpdmVDb25zdHJ1Y3Rvcik7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlQ2xhc3MoZW5jbG9zaW5nQ2xhc3MpOwogICAgc2luay53cml0ZVN0cmluZyhuYW1lKTsKICAgIHBhcmFtZXRlclN0cnVjdHVyZS53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLndyaXRlQm9vbChpc0V4dGVybmFsKTsKICAgIHNpbmsud3JpdGVCb29sKGlzQ29uc3QpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRmFjdG9yeUNvbnN0cnVjdG9yID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0dlbmVyYXRpdmVDb25zdHJ1Y3RvciA9PiB0cnVlOwp9CgpjbGFzcyBKRmFjdG9yeUNvbnN0cnVjdG9yIGV4dGVuZHMgSkNvbnN0cnVjdG9yIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0pGYWN0b3J5Q29uc3RydWN0b3JdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnZmFjdG9yeS1jb25zdHJ1Y3Rvcic7CgogIEBvdmVycmlkZQogIGZpbmFsIGJvb2wgaXNGcm9tRW52aXJvbm1lbnRDb25zdHJ1Y3RvcjsKCiAgSkZhY3RvcnlDb25zdHJ1Y3RvcigKICAgICAgSkNsYXNzIGVuY2xvc2luZ0NsYXNzLCBOYW1lIG5hbWUsIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgIHtib29sIGlzRXh0ZXJuYWwsIGJvb2wgaXNDb25zdCwgdGhpcy5pc0Zyb21FbnZpcm9ubWVudENvbnN0cnVjdG9yfSkKICAgICAgOiBzdXBlcihlbmNsb3NpbmdDbGFzcywgbmFtZSwgcGFyYW1ldGVyU3RydWN0dXJlLAogICAgICAgICAgICBpc0V4dGVybmFsOiBpc0V4dGVybmFsLCBpc0NvbnN0OiBpc0NvbnN0KTsKCiAgZmFjdG9yeSBKRmFjdG9yeUNvbnN0cnVjdG9yLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBKQ2xhc3MgZW5jbG9zaW5nQ2xhc3MgPSBzb3VyY2UucmVhZENsYXNzKCk7CiAgICBTdHJpbmcgbmFtZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlID0KICAgICAgICBuZXcgUGFyYW1ldGVyU3RydWN0dXJlLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgYm9vbCBpc0V4dGVybmFsID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBib29sIGlzQ29uc3QgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGJvb2wgaXNGcm9tRW52aXJvbm1lbnRDb25zdHJ1Y3RvciA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBKRmFjdG9yeUNvbnN0cnVjdG9yKGVuY2xvc2luZ0NsYXNzLAogICAgICAgIG5ldyBOYW1lKG5hbWUsIGVuY2xvc2luZ0NsYXNzLmxpYnJhcnkpLCBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgICAgaXNFeHRlcm5hbDogaXNFeHRlcm5hbCwKICAgICAgICBpc0NvbnN0OiBpc0NvbnN0LAogICAgICAgIGlzRnJvbUVudmlyb25tZW50Q29uc3RydWN0b3I6IGlzRnJvbUVudmlyb25tZW50Q29uc3RydWN0b3IpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oSk1lbWJlcktpbmQuZmFjdG9yeUNvbnN0cnVjdG9yKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVDbGFzcyhlbmNsb3NpbmdDbGFzcyk7CiAgICBzaW5rLndyaXRlU3RyaW5nKG5hbWUpOwogICAgcGFyYW1ldGVyU3RydWN0dXJlLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIHNpbmsud3JpdGVCb29sKGlzRXh0ZXJuYWwpOwogICAgc2luay53cml0ZUJvb2woaXNDb25zdCk7CiAgICBzaW5rLndyaXRlQm9vbChpc0Zyb21FbnZpcm9ubWVudENvbnN0cnVjdG9yKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0ZhY3RvcnlDb25zdHJ1Y3RvciA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0dlbmVyYXRpdmVDb25zdHJ1Y3RvciA9PiBmYWxzZTsKfQoKY2xhc3MgSkNvbnN0cnVjdG9yQm9keSBleHRlbmRzIEpGdW5jdGlvbiBpbXBsZW1lbnRzIENvbnN0cnVjdG9yQm9keUVudGl0eSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtKQ29uc3RydWN0b3JCb2R5XSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2NvbnN0cnVjdG9yLWJvZHknOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBKQ29uc3RydWN0b3IgY29uc3RydWN0b3I7CgogIEpDb25zdHJ1Y3RvckJvZHkodGhpcy5jb25zdHJ1Y3RvciwgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSkKICAgICAgOiBzdXBlcihjb25zdHJ1Y3Rvci5saWJyYXJ5LCBjb25zdHJ1Y3Rvci5lbmNsb3NpbmdDbGFzcywKICAgICAgICAgICAgY29uc3RydWN0b3IubWVtYmVyTmFtZSwgcGFyYW1ldGVyU3RydWN0dXJlLCBBc3luY01hcmtlci5TWU5DLAogICAgICAgICAgICBpc1N0YXRpYzogZmFsc2UsIGlzRXh0ZXJuYWw6IGZhbHNlKTsKCiAgZmFjdG9yeSBKQ29uc3RydWN0b3JCb2R5LnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBKQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBzb3VyY2UucmVhZE1lbWJlcigpOwogICAgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSA9CiAgICAgICAgbmV3IFBhcmFtZXRlclN0cnVjdHVyZS5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgSkNvbnN0cnVjdG9yQm9keShjb25zdHJ1Y3RvciwgcGFyYW1ldGVyU3RydWN0dXJlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKEpNZW1iZXJLaW5kLmNvbnN0cnVjdG9yQm9keSk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTWVtYmVyKGNvbnN0cnVjdG9yKTsKICAgIHBhcmFtZXRlclN0cnVjdHVyZS53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfa2luZCA9PiAnY29uc3RydWN0b3JfYm9keSc7Cn0KCmNsYXNzIEpNZXRob2QgZXh0ZW5kcyBKRnVuY3Rpb24gewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbSk1ldGhvZF0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdtZXRob2QnOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzQWJzdHJhY3Q7CgogIEpNZXRob2QoSkxpYnJhcnkgbGlicmFyeSwgSkNsYXNzIGVuY2xvc2luZ0NsYXNzLCBOYW1lIG5hbWUsCiAgICAgIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUsIEFzeW5jTWFya2VyIGFzeW5jTWFya2VyLAogICAgICB7Ym9vbCBpc1N0YXRpYywgYm9vbCBpc0V4dGVybmFsLCB0aGlzLmlzQWJzdHJhY3R9KQogICAgICA6IHN1cGVyKGxpYnJhcnksIGVuY2xvc2luZ0NsYXNzLCBuYW1lLCBwYXJhbWV0ZXJTdHJ1Y3R1cmUsIGFzeW5jTWFya2VyLAogICAgICAgICAgICBpc1N0YXRpYzogaXNTdGF0aWMsIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwpOwoKICBmYWN0b3J5IEpNZXRob2QucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIE1lbWJlckNvbnRleHRLaW5kIGtpbmQgPSBzb3VyY2UucmVhZEVudW0oTWVtYmVyQ29udGV4dEtpbmQudmFsdWVzKTsKICAgIEpMaWJyYXJ5IGxpYnJhcnk7CiAgICBKQ2xhc3MgZW5jbG9zaW5nQ2xhc3M7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBNZW1iZXJDb250ZXh0S2luZC5saWJyYXJ5OgogICAgICAgIGxpYnJhcnkgPSBzb3VyY2UucmVhZExpYnJhcnkoKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBNZW1iZXJDb250ZXh0S2luZC5jbHM6CiAgICAgICAgZW5jbG9zaW5nQ2xhc3MgPSBzb3VyY2UucmVhZENsYXNzKCk7CiAgICAgICAgbGlicmFyeSA9IGVuY2xvc2luZ0NsYXNzLmxpYnJhcnk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBTdHJpbmcgbmFtZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlID0KICAgICAgICBuZXcgUGFyYW1ldGVyU3RydWN0dXJlLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgQXN5bmNNYXJrZXIgYXN5bmNNYXJrZXIgPSBzb3VyY2UucmVhZEVudW0oQXN5bmNNYXJrZXIudmFsdWVzKTsKICAgIGJvb2wgaXNTdGF0aWMgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGJvb2wgaXNFeHRlcm5hbCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgYm9vbCBpc0Fic3RyYWN0ID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEpNZXRob2QobGlicmFyeSwgZW5jbG9zaW5nQ2xhc3MsIG5ldyBOYW1lKG5hbWUsIGxpYnJhcnkpLAogICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZSwgYXN5bmNNYXJrZXIsCiAgICAgICAgaXNTdGF0aWM6IGlzU3RhdGljLCBpc0V4dGVybmFsOiBpc0V4dGVybmFsLCBpc0Fic3RyYWN0OiBpc0Fic3RyYWN0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKEpNZW1iZXJLaW5kLm1ldGhvZCk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBpZiAoZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCkgewogICAgICBzaW5rLndyaXRlRW51bShNZW1iZXJDb250ZXh0S2luZC5jbHMpOwogICAgICBzaW5rLndyaXRlQ2xhc3MoZW5jbG9zaW5nQ2xhc3MpOwogICAgfSBlbHNlIHsKICAgICAgc2luay53cml0ZUVudW0oTWVtYmVyQ29udGV4dEtpbmQubGlicmFyeSk7CiAgICAgIHNpbmsud3JpdGVMaWJyYXJ5KGxpYnJhcnkpOwogICAgfQogICAgc2luay53cml0ZVN0cmluZyhuYW1lKTsKICAgIHBhcmFtZXRlclN0cnVjdHVyZS53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLndyaXRlRW51bShhc3luY01hcmtlcik7CiAgICBzaW5rLndyaXRlQm9vbChpc1N0YXRpYyk7CiAgICBzaW5rLndyaXRlQm9vbChpc0V4dGVybmFsKTsKICAgIHNpbmsud3JpdGVCb29sKGlzQWJzdHJhY3QpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRnVuY3Rpb24gPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfa2luZCA9PiAnbWV0aG9kJzsKfQoKY2xhc3MgSkdlbmVyYXRvckJvZHkgZXh0ZW5kcyBKRnVuY3Rpb24gewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbSkdlbmVyYXRvckJvZHldIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnZ2VuZXJhdG9yLWJvZHknOwoKICBmaW5hbCBKRnVuY3Rpb24gZnVuY3Rpb247CiAgZmluYWwgRGFydFR5cGUgZWxlbWVudFR5cGU7CiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IGhhc2hDb2RlOwoKICBKR2VuZXJhdG9yQm9keSh0aGlzLmZ1bmN0aW9uLCB0aGlzLmVsZW1lbnRUeXBlKQogICAgICA6IGhhc2hDb2RlID0gZnVuY3Rpb24uaGFzaENvZGUgKyAxLCAvLyBIYWNrIHN0YWJpbGl6ZSBzb3J0IG9yZGVyLgogICAgICAgIHN1cGVyKGZ1bmN0aW9uLmxpYnJhcnksIGZ1bmN0aW9uLmVuY2xvc2luZ0NsYXNzLCBmdW5jdGlvbi5tZW1iZXJOYW1lLAogICAgICAgICAgICBmdW5jdGlvbi5wYXJhbWV0ZXJTdHJ1Y3R1cmUsIGZ1bmN0aW9uLmFzeW5jTWFya2VyLAogICAgICAgICAgICBpc1N0YXRpYzogZnVuY3Rpb24uaXNTdGF0aWMsIGlzRXh0ZXJuYWw6IGZhbHNlKTsKCiAgZmFjdG9yeSBKR2VuZXJhdG9yQm9keS5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgSkZ1bmN0aW9uIGZ1bmN0aW9uID0gc291cmNlLnJlYWRNZW1iZXIoKTsKICAgIERhcnRUeXBlIGVsZW1lbnRUeXBlID0gc291cmNlLnJlYWREYXJ0VHlwZSgpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBKR2VuZXJhdG9yQm9keShmdW5jdGlvbiwgZWxlbWVudFR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oSk1lbWJlcktpbmQuZ2VuZXJhdG9yQm9keSk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTWVtYmVyKGZ1bmN0aW9uKTsKICAgIHNpbmsud3JpdGVEYXJ0VHlwZShlbGVtZW50VHlwZSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfa2luZCA9PiAnZ2VuZXJhdG9yX2JvZHknOwp9CgpjbGFzcyBKR2V0dGVyIGV4dGVuZHMgSkZ1bmN0aW9uIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0pHZXR0ZXJdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnZ2V0dGVyJzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc0Fic3RyYWN0OwoKICBKR2V0dGVyKEpMaWJyYXJ5IGxpYnJhcnksIEpDbGFzcyBlbmNsb3NpbmdDbGFzcywgTmFtZSBuYW1lLAogICAgICBBc3luY01hcmtlciBhc3luY01hcmtlciwKICAgICAge2Jvb2wgaXNTdGF0aWMsIGJvb2wgaXNFeHRlcm5hbCwgdGhpcy5pc0Fic3RyYWN0fSkKICAgICAgOiBzdXBlcihsaWJyYXJ5LCBlbmNsb3NpbmdDbGFzcywgbmFtZSwgY29uc3QgUGFyYW1ldGVyU3RydWN0dXJlLmdldHRlcigpLAogICAgICAgICAgICBhc3luY01hcmtlciwKICAgICAgICAgICAgaXNTdGF0aWM6IGlzU3RhdGljLCBpc0V4dGVybmFsOiBpc0V4dGVybmFsKTsKCiAgZmFjdG9yeSBKR2V0dGVyLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBNZW1iZXJDb250ZXh0S2luZCBraW5kID0gc291cmNlLnJlYWRFbnVtKE1lbWJlckNvbnRleHRLaW5kLnZhbHVlcyk7CiAgICBKTGlicmFyeSBsaWJyYXJ5OwogICAgSkNsYXNzIGVuY2xvc2luZ0NsYXNzOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgTWVtYmVyQ29udGV4dEtpbmQubGlicmFyeToKICAgICAgICBsaWJyYXJ5ID0gc291cmNlLnJlYWRMaWJyYXJ5KCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTWVtYmVyQ29udGV4dEtpbmQuY2xzOgogICAgICAgIGVuY2xvc2luZ0NsYXNzID0gc291cmNlLnJlYWRDbGFzcygpOwogICAgICAgIGxpYnJhcnkgPSBlbmNsb3NpbmdDbGFzcy5saWJyYXJ5OwogICAgICAgIGJyZWFrOwogICAgfQogICAgU3RyaW5nIG5hbWUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgQXN5bmNNYXJrZXIgYXN5bmNNYXJrZXIgPSBzb3VyY2UucmVhZEVudW0oQXN5bmNNYXJrZXIudmFsdWVzKTsKICAgIGJvb2wgaXNTdGF0aWMgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGJvb2wgaXNFeHRlcm5hbCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgYm9vbCBpc0Fic3RyYWN0ID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEpHZXR0ZXIoCiAgICAgICAgbGlicmFyeSwgZW5jbG9zaW5nQ2xhc3MsIG5ldyBOYW1lKG5hbWUsIGxpYnJhcnkpLCBhc3luY01hcmtlciwKICAgICAgICBpc1N0YXRpYzogaXNTdGF0aWMsIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwsIGlzQWJzdHJhY3Q6IGlzQWJzdHJhY3QpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oSk1lbWJlcktpbmQuZ2V0dGVyKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIGlmIChlbmNsb3NpbmdDbGFzcyAhPSBudWxsKSB7CiAgICAgIHNpbmsud3JpdGVFbnVtKE1lbWJlckNvbnRleHRLaW5kLmNscyk7CiAgICAgIHNpbmsud3JpdGVDbGFzcyhlbmNsb3NpbmdDbGFzcyk7CiAgICB9IGVsc2UgewogICAgICBzaW5rLndyaXRlRW51bShNZW1iZXJDb250ZXh0S2luZC5saWJyYXJ5KTsKICAgICAgc2luay53cml0ZUxpYnJhcnkobGlicmFyeSk7CiAgICB9CiAgICBzaW5rLndyaXRlU3RyaW5nKG5hbWUpOwogICAgc2luay53cml0ZUVudW0oYXN5bmNNYXJrZXIpOwogICAgc2luay53cml0ZUJvb2woaXNTdGF0aWMpOwogICAgc2luay53cml0ZUJvb2woaXNFeHRlcm5hbCk7CiAgICBzaW5rLndyaXRlQm9vbChpc0Fic3RyYWN0KTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0dldHRlciA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9raW5kID0+ICdnZXR0ZXInOwp9CgpjbGFzcyBKU2V0dGVyIGV4dGVuZHMgSkZ1bmN0aW9uIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0pTZXR0ZXJdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnc2V0dGVyJzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc0Fic3RyYWN0OwoKICBKU2V0dGVyKEpMaWJyYXJ5IGxpYnJhcnksIEpDbGFzcyBlbmNsb3NpbmdDbGFzcywgTmFtZSBuYW1lLAogICAgICB7Ym9vbCBpc1N0YXRpYywgYm9vbCBpc0V4dGVybmFsLCB0aGlzLmlzQWJzdHJhY3R9KQogICAgICA6IHN1cGVyKGxpYnJhcnksIGVuY2xvc2luZ0NsYXNzLCBuYW1lLCBjb25zdCBQYXJhbWV0ZXJTdHJ1Y3R1cmUuc2V0dGVyKCksCiAgICAgICAgICAgIEFzeW5jTWFya2VyLlNZTkMsCiAgICAgICAgICAgIGlzU3RhdGljOiBpc1N0YXRpYywgaXNFeHRlcm5hbDogaXNFeHRlcm5hbCk7CgogIGZhY3RvcnkgSlNldHRlci5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgTWVtYmVyQ29udGV4dEtpbmQga2luZCA9IHNvdXJjZS5yZWFkRW51bShNZW1iZXJDb250ZXh0S2luZC52YWx1ZXMpOwogICAgSkxpYnJhcnkgbGlicmFyeTsKICAgIEpDbGFzcyBlbmNsb3NpbmdDbGFzczsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIE1lbWJlckNvbnRleHRLaW5kLmxpYnJhcnk6CiAgICAgICAgbGlicmFyeSA9IHNvdXJjZS5yZWFkTGlicmFyeSgpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE1lbWJlckNvbnRleHRLaW5kLmNsczoKICAgICAgICBlbmNsb3NpbmdDbGFzcyA9IHNvdXJjZS5yZWFkQ2xhc3MoKTsKICAgICAgICBsaWJyYXJ5ID0gZW5jbG9zaW5nQ2xhc3MubGlicmFyeTsKICAgICAgICBicmVhazsKICAgIH0KICAgIFN0cmluZyBuYW1lID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgIGJvb2wgaXNTdGF0aWMgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGJvb2wgaXNFeHRlcm5hbCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgYm9vbCBpc0Fic3RyYWN0ID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEpTZXR0ZXIoCiAgICAgICAgbGlicmFyeSwgZW5jbG9zaW5nQ2xhc3MsIG5ldyBOYW1lKG5hbWUsIGxpYnJhcnksIGlzU2V0dGVyOiB0cnVlKSwKICAgICAgICBpc1N0YXRpYzogaXNTdGF0aWMsIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwsIGlzQWJzdHJhY3Q6IGlzQWJzdHJhY3QpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oSk1lbWJlcktpbmQuc2V0dGVyKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIGlmIChlbmNsb3NpbmdDbGFzcyAhPSBudWxsKSB7CiAgICAgIHNpbmsud3JpdGVFbnVtKE1lbWJlckNvbnRleHRLaW5kLmNscyk7CiAgICAgIHNpbmsud3JpdGVDbGFzcyhlbmNsb3NpbmdDbGFzcyk7CiAgICB9IGVsc2UgewogICAgICBzaW5rLndyaXRlRW51bShNZW1iZXJDb250ZXh0S2luZC5saWJyYXJ5KTsKICAgICAgc2luay53cml0ZUxpYnJhcnkobGlicmFyeSk7CiAgICB9CiAgICBzaW5rLndyaXRlU3RyaW5nKG5hbWUpOwogICAgc2luay53cml0ZUJvb2woaXNTdGF0aWMpOwogICAgc2luay53cml0ZUJvb2woaXNFeHRlcm5hbCk7CiAgICBzaW5rLndyaXRlQm9vbChpc0Fic3RyYWN0KTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0Fzc2lnbmFibGUgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNTZXR0ZXIgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfa2luZCA9PiAnc2V0dGVyJzsKfQoKY2xhc3MgSkZpZWxkIGV4dGVuZHMgSk1lbWJlciBpbXBsZW1lbnRzIEZpZWxkRW50aXR5LCBJbmRleGVkRmllbGQgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbSkZpZWxkXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2ZpZWxkJzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc0Fzc2lnbmFibGU7CiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc0NvbnN0OwoKICBKRmllbGQoSkxpYnJhcnkgbGlicmFyeSwgSkNsYXNzIGVuY2xvc2luZ0NsYXNzLCBOYW1lIG5hbWUsCiAgICAgIHtib29sIGlzU3RhdGljLCB0aGlzLmlzQXNzaWduYWJsZSwgdGhpcy5pc0NvbnN0fSkKICAgICAgOiBzdXBlcihsaWJyYXJ5LCBlbmNsb3NpbmdDbGFzcywgbmFtZSwgaXNTdGF0aWM6IGlzU3RhdGljKTsKCiAgZmFjdG9yeSBKRmllbGQucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIE1lbWJlckNvbnRleHRLaW5kIGtpbmQgPSBzb3VyY2UucmVhZEVudW0oTWVtYmVyQ29udGV4dEtpbmQudmFsdWVzKTsKICAgIEpMaWJyYXJ5IGxpYnJhcnk7CiAgICBKQ2xhc3MgZW5jbG9zaW5nQ2xhc3M7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBNZW1iZXJDb250ZXh0S2luZC5saWJyYXJ5OgogICAgICAgIGxpYnJhcnkgPSBzb3VyY2UucmVhZExpYnJhcnkoKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBNZW1iZXJDb250ZXh0S2luZC5jbHM6CiAgICAgICAgZW5jbG9zaW5nQ2xhc3MgPSBzb3VyY2UucmVhZENsYXNzKCk7CiAgICAgICAgbGlicmFyeSA9IGVuY2xvc2luZ0NsYXNzLmxpYnJhcnk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBTdHJpbmcgbmFtZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICBib29sIGlzU3RhdGljID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBib29sIGlzQXNzaWduYWJsZSA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgYm9vbCBpc0NvbnN0ID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEpGaWVsZChsaWJyYXJ5LCBlbmNsb3NpbmdDbGFzcywgbmV3IE5hbWUobmFtZSwgbGlicmFyeSksCiAgICAgICAgaXNTdGF0aWM6IGlzU3RhdGljLCBpc0Fzc2lnbmFibGU6IGlzQXNzaWduYWJsZSwgaXNDb25zdDogaXNDb25zdCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShKTWVtYmVyS2luZC5maWVsZCk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBpZiAoZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCkgewogICAgICBzaW5rLndyaXRlRW51bShNZW1iZXJDb250ZXh0S2luZC5jbHMpOwogICAgICBzaW5rLndyaXRlQ2xhc3MoZW5jbG9zaW5nQ2xhc3MpOwogICAgfSBlbHNlIHsKICAgICAgc2luay53cml0ZUVudW0oTWVtYmVyQ29udGV4dEtpbmQubGlicmFyeSk7CiAgICAgIHNpbmsud3JpdGVMaWJyYXJ5KGxpYnJhcnkpOwogICAgfQogICAgc2luay53cml0ZVN0cmluZyhuYW1lKTsKICAgIHNpbmsud3JpdGVCb29sKGlzU3RhdGljKTsKICAgIHNpbmsud3JpdGVCb29sKGlzQXNzaWduYWJsZSk7CiAgICBzaW5rLndyaXRlQm9vbChpc0NvbnN0KTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0ZpZWxkID0+IHRydWU7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX2tpbmQgPT4gJ2ZpZWxkJzsKfQoKY2xhc3MgSkNsb3N1cmVDYWxsTWV0aG9kIGV4dGVuZHMgSk1ldGhvZCB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtKQ2xvc3VyZUNhbGxNZXRob2RdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnY2xvc3VyZS1jYWxsLW1ldGhvZCc7CgogIEpDbG9zdXJlQ2FsbE1ldGhvZChDbGFzc0VudGl0eSBlbmNsb3NpbmdDbGFzcywKICAgICAgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSwgQXN5bmNNYXJrZXIgYXN5bmNNYXJrZXIpCiAgICAgIDogc3VwZXIoZW5jbG9zaW5nQ2xhc3MubGlicmFyeSwgZW5jbG9zaW5nQ2xhc3MsIE5hbWVzLmNhbGwsCiAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZSwgYXN5bmNNYXJrZXIsCiAgICAgICAgICAgIGlzU3RhdGljOiBmYWxzZSwgaXNFeHRlcm5hbDogZmFsc2UsIGlzQWJzdHJhY3Q6IGZhbHNlKTsKCiAgZmFjdG9yeSBKQ2xvc3VyZUNhbGxNZXRob2QucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIEpDbGFzcyBlbmNsb3NpbmdDbGFzcyA9IHNvdXJjZS5yZWFkQ2xhc3MoKTsKICAgIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUgPQogICAgICAgIG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmUucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBBc3luY01hcmtlciBhc3luY01hcmtlciA9IHNvdXJjZS5yZWFkRW51bShBc3luY01hcmtlci52YWx1ZXMpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBKQ2xvc3VyZUNhbGxNZXRob2QoCiAgICAgICAgZW5jbG9zaW5nQ2xhc3MsIHBhcmFtZXRlclN0cnVjdHVyZSwgYXN5bmNNYXJrZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oSk1lbWJlcktpbmQuY2xvc3VyZUNhbGxNZXRob2QpOwogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUNsYXNzKGVuY2xvc2luZ0NsYXNzKTsKICAgIHBhcmFtZXRlclN0cnVjdHVyZS53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLndyaXRlRW51bShhc3luY01hcmtlcik7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfa2luZCA9PiAnY2xvc3VyZV9jYWxsJzsKfQoKLy8vIEEgbWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgc2lnbmF0dXJlIG9mIHRoZSBEYXJ0IGNsb3N1cmUvdGVhcm9mZiB0aGF0IHRoaXMKLy8vIG1ldGhvZCdzIHBhcmVudCBjbGFzcyBpcyByZXByZXNlbnRpbmcuCmNsYXNzIEpTaWduYXR1cmVNZXRob2QgZXh0ZW5kcyBKTWV0aG9kIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0pTaWduYXR1cmVNZXRob2RdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnc2lnbmF0dXJlLW1ldGhvZCc7CgogIEpTaWduYXR1cmVNZXRob2QoQ2xhc3NFbnRpdHkgZW5jbG9zaW5nQ2xhc3MpCiAgICAgIDogc3VwZXIoZW5jbG9zaW5nQ2xhc3MubGlicmFyeSwgZW5jbG9zaW5nQ2xhc3MsIE5hbWVzLnNpZ25hdHVyZSwKICAgICAgICAgICAgY29uc3QgUGFyYW1ldGVyU3RydWN0dXJlKDAsIDAsIGNvbnN0IFtdLCAwKSwgQXN5bmNNYXJrZXIuU1lOQywKICAgICAgICAgICAgaXNTdGF0aWM6IGZhbHNlLCBpc0V4dGVybmFsOiBmYWxzZSwgaXNBYnN0cmFjdDogZmFsc2UpOwoKICBmYWN0b3J5IEpTaWduYXR1cmVNZXRob2QucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIEpDbGFzcyBjbHMgPSBzb3VyY2UucmVhZENsYXNzKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEpTaWduYXR1cmVNZXRob2QoY2xzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKEpNZW1iZXJLaW5kLnNpZ25hdHVyZU1ldGhvZCk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlQ2xhc3MoZW5jbG9zaW5nQ2xhc3MpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX2tpbmQgPT4gJ3NpZ25hdHVyZSc7Cn0KCi8vLyBFbnVtIHVzZWQgZm9yIGlkZW50aWZ5aW5nIFtKVHlwZVZhcmlhYmxlXSB2YXJpYW50cyBpbiBzZXJpYWxpemF0aW9uLgplbnVtIEpUeXBlVmFyaWFibGVLaW5kIHsgY2xzLCBtZW1iZXIsIHR5cGVkZWYsIGxvY2FsIH0KCmNsYXNzIEpUeXBlVmFyaWFibGUgZXh0ZW5kcyBJbmRleGVkVHlwZVZhcmlhYmxlIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0pUeXBlVmFyaWFibGVdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAndHlwZS12YXJpYWJsZSc7CgogIEBvdmVycmlkZQogIGZpbmFsIEVudGl0eSB0eXBlRGVjbGFyYXRpb247CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IGluZGV4OwoKICBKVHlwZVZhcmlhYmxlKHRoaXMudHlwZURlY2xhcmF0aW9uLCB0aGlzLm5hbWUsIHRoaXMuaW5kZXgpOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW0pUeXBlVmFyaWFibGVdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgSlR5cGVWYXJpYWJsZS5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgSlR5cGVWYXJpYWJsZUtpbmQga2luZCA9IHNvdXJjZS5yZWFkRW51bShKVHlwZVZhcmlhYmxlS2luZC52YWx1ZXMpOwogICAgRW50aXR5IHR5cGVEZWNsYXJhdGlvbjsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIEpUeXBlVmFyaWFibGVLaW5kLmNsczoKICAgICAgICB0eXBlRGVjbGFyYXRpb24gPSBzb3VyY2UucmVhZENsYXNzKCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSlR5cGVWYXJpYWJsZUtpbmQubWVtYmVyOgogICAgICAgIHR5cGVEZWNsYXJhdGlvbiA9IHNvdXJjZS5yZWFkTWVtYmVyKCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSlR5cGVWYXJpYWJsZUtpbmQudHlwZWRlZjoKICAgICAgICB0eXBlRGVjbGFyYXRpb24gPSBzb3VyY2UucmVhZFR5cGVkZWYoKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBKVHlwZVZhcmlhYmxlS2luZC5sb2NhbDoKICAgICAgICAvLyBUeXBlIHZhcmlhYmxlcyBkZWNsYXJlZCBieSBsb2NhbCBmdW5jdGlvbnMgZG9uJ3QgcG9pbnQgdG8gdGhlaXIKICAgICAgICAvLyBkZWNsYXJhdGlvbiwgc2luY2UgdGhlIGNvcnJlc3BvbmRpbmcgY2xvc3VyZSBjYWxsIG1ldGhvZHMgaXMgY3JlYXRlZAogICAgICAgIC8vIGFmdGVyIHRoZSB0eXBlIHZhcmlhYmxlLgogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEZpeCB0aGlzLgogICAgICAgIGJyZWFrOwogICAgfQogICAgU3RyaW5nIG5hbWUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgaW50IGluZGV4ID0gc291cmNlLnJlYWRJbnQoKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgSlR5cGVWYXJpYWJsZSh0eXBlRGVjbGFyYXRpb24sIG5hbWUsIGluZGV4KTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0pUeXBlVmFyaWFibGVdIHRvIFtzaW5rXS4KICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBpZiAodHlwZURlY2xhcmF0aW9uIGlzIEluZGV4ZWRDbGFzcykgewogICAgICBJbmRleGVkQ2xhc3MgY2xzID0gdHlwZURlY2xhcmF0aW9uOwogICAgICBzaW5rLndyaXRlRW51bShKVHlwZVZhcmlhYmxlS2luZC5jbHMpOwogICAgICBzaW5rLndyaXRlQ2xhc3MoY2xzKTsKICAgIH0gZWxzZSBpZiAodHlwZURlY2xhcmF0aW9uIGlzIEluZGV4ZWRNZW1iZXIpIHsKICAgICAgSW5kZXhlZE1lbWJlciBtZW1iZXIgPSB0eXBlRGVjbGFyYXRpb247CiAg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ZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLndvcmxkLmNsYXNzX3NldDsKCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJyBzaG93IEl0ZXJhYmxlQmFzZSwgTWFwQmFzZTsKCmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCcgc2hvdyBDbGFzc0VudGl0eTsKaW1wb3J0ICcuLi9lbGVtZW50cy9pbmRleGVkLmRhcnQnIHNob3cgSW5kZXhlZENsYXNzOwppbXBvcnQgJy4uL3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi91dGlsL2VudW1zZXQuZGFydCcgc2hvdyBFbnVtU2V0OwoKLy8vIEVudW0gZm9yIHRoZSBkaWZmZXJlbnQga2luZHMgb2YgaW5zdGFudGlhdGlvbiBvZiBhIGNsYXNzLgplbnVtIEluc3RhbnRpYXRpb24gewogIFVOSU5TVEFOVElBVEVELAogIERJUkVDVExZX0lOU1RBTlRJQVRFRCwKICBJTkRJUkVDVExZX0lOU1RBTlRJQVRFRCwKICBBQlNUUkFDVExZX0lOU1RBTlRJQVRFRCwKfQoKLy8vIE5vZGUgZm9yIFtjbHNdIGluIGEgdHJlZSBmb3JtaW5nIHRoZSBzdWJjbGFzcyByZWxhdGlvbiBvZiBbQ2xhc3NFbnRpdHldcy4KLy8vCi8vLyBUaGlzIGlzIHVzZWQgYnkgdGhlIFtDbG9zZWRXb3JsZF0gdG8gcGVyZm9ybSBxdWVyaWVzIG9uIHN1YmNsYXNzIGFuZCBzdWJ0eXBlCi8vLyByZWxhdGlvbnMuCi8vLwovLy8gRm9yIHRoaXMgY2xhc3MgaGllcmFyY2h5OgovLy8KLy8vICAgICBjbGFzcyBBIHt9Ci8vLyAgICAgY2xhc3MgQiBleHRlbmRzIEEge30KLy8vICAgICBjbGFzcyBDIGV4dGVuZHMgQSB7fQovLy8gICAgIGNsYXNzIEQgZXh0ZW5kcyBCIHt9Ci8vLyAgICAgY2xhc3MgRSBleHRlbmRzIEQge30KLy8vCi8vLyB0aGUgW0NsYXNzSGllcmFyY2h5Tm9kZV1zIGZvcm0gdGhpcyBzdWJjbGFzcyB0cmVlOgovLy8KLy8vICAgICAgIE9iamVjdAovLy8gICAgICAgICB8Ci8vLyAgICAgICAgIEEKLy8vICAgICAgICAvIFwKLy8vICAgICAgIEIgICBDCi8vLyAgICAgICB8Ci8vLyAgICAgICBECi8vLyAgICAgICB8Ci8vLyAgICAgICBFCi8vLwpjbGFzcyBDbGFzc0hpZXJhcmNoeU5vZGUgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbQ2xhc3NIaWVyYXJjaHlOb2RlXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2NsYXNzLWhpZXJhcmNoeS1ub2RlJzsKCiAgLy8vIEVudW0gc2V0IGZvciBzZWxlY3RpbmcgaW5zdGFudGlhdGVkIGNsYXNzZXMgaW4KICAvLy8gW0NsYXNzSGllcmFyY2h5Tm9kZS5zdWJjbGFzc2VzQnlNYXNrXSwKICAvLy8gW0NsYXNzSGllcmFyY2h5Tm9kZS5zdWJjbGFzc2VzQnlNYXNrXSBhbmQgW0NsYXNzU2V0LnN1YnR5cGVzQnlNYXNrXS4KICBzdGF0aWMgZmluYWwgRW51bVNldDxJbnN0YW50aWF0aW9uPiBJTlNUQU5USUFURUQgPQogICAgICBuZXcgRW51bVNldDxJbnN0YW50aWF0aW9uPi5mcm9tVmFsdWVzKGNvbnN0IDxJbnN0YW50aWF0aW9uPlsKICAgIEluc3RhbnRpYXRpb24uRElSRUNUTFlfSU5TVEFOVElBVEVELAogICAgSW5zdGFudGlhdGlvbi5JTkRJUkVDVExZX0lOU1RBTlRJQVRFRCwKICAgIEluc3RhbnRpYXRpb24uQUJTVFJBQ1RMWV9JTlNUQU5USUFURUQsCiAgXSwgZml4ZWQ6IHRydWUpOwoKICAvLy8gRW51bSBzZXQgZm9yIHNlbGVjdGluZyBkaXJlY3RseSBhbmQgYWJzdHJhY3RseSBpbnN0YW50aWF0ZWQgY2xhc3NlcyBpbgogIC8vLyBbQ2xhc3NIaWVyYXJjaHlOb2RlLnN1YmNsYXNzZXNCeU1hc2tdLAogIC8vLyBbQ2xhc3NIaWVyYXJjaHlOb2RlLnN1YmNsYXNzZXNCeU1hc2tdIGFuZCBbQ2xhc3NTZXQuc3VidHlwZXNCeU1hc2tdLgogIHN0YXRpYyBmaW5hbCBFbnVtU2V0PEluc3RhbnRpYXRpb24+IEVYUExJQ0lUTFlfSU5TVEFOVElBVEVEID0KICAgICAgbmV3IEVudW1TZXQ8SW5zdGFudGlhdGlvbj4uZnJvbVZhbHVlcyhjb25zdCA8SW5zdGFudGlhdGlvbj5bCiAgICBJbnN0YW50aWF0aW9uLkRJUkVDVExZX0lOU1RBTlRJQVRFRCwKICAgIEluc3RhbnRpYXRpb24uQUJTVFJBQ1RMWV9JTlNUQU5USUFURUQKICBdLCBmaXhlZDogdHJ1ZSk7CgogIC8vLyBFbnVtIHNldCBmb3Igc2VsZWN0aW5nIGFsbCBjbGFzc2VzIGluCiAgLy8vIFtDbGFzc0hpZXJhcmNoeU5vZGUuc3ViY2xhc3Nlc0J5TWFza10sCiAgLy8vIFtDbGFzc0hpZXJhcmNoeU5vZGUuc3ViY2xhc3Nlc0J5TWFza10gYW5kIFtDbGFzc1NldC5zdWJ0eXBlc0J5TWFza10uCiAgc3RhdGljIGZpbmFsIEVudW1TZXQ8SW5zdGFudGlhdGlvbj4gQUxMID0KICAgICAgbmV3IEVudW1TZXQ8SW5zdGFudGlhdGlvbj4uZnJvbVZhbHVlcyhJbnN0YW50aWF0aW9uLnZhbHVlcywgZml4ZWQ6IHRydWUpOwoKICAvLy8gQ3JlYXRlcyBhbiBlbnVtIHNldCBmb3Igc2VsZWN0aW5nIHRoZSByZXR1cm5lZCBjbGFzc2VzIGluCiAgLy8vIFtDbGFzc0hpZXJhcmNoeU5vZGUuc3ViY2xhc3Nlc0J5TWFza10sCiAgLy8vIFtDbGFzc0hpZXJhcmNoeU5vZGUuc3ViY2xhc3Nlc0J5TWFza10gYW5kIFtDbGFzc1NldC5zdWJ0eXBlc0J5TWFza10uCiAgc3RhdGljIEVudW1TZXQ8SW5zdGFudGlhdGlvbj4gY3JlYXRlTWFzaygKICAgICAge2Jvb2wgaW5jbHVkZURpcmVjdGx5SW5zdGFudGlhdGVkOiB0cnVlLAogICAgICBib29sIGluY2x1ZGVJbmRpcmVjdGx5SW5zdGFudGlhdGVkOiB0cnVlLAogICAgICBib29sIGluY2x1ZGVVbmluc3RhbnRpYXRlZDogdHJ1ZSwKICAgICAgYm9vbCBpbmNsdWRlQWJzdHJhY3RseUluc3RhbnRpYXRlZDogdHJ1ZX0pIHsKICAgIEVudW1TZXQ8SW5zdGFudGlhdGlvbj4gbWFzayA9IG5ldyBFbnVtU2V0PEluc3RhbnRpYXRpb24+KCk7CiAgICBpZiAoaW5jbHVkZURpcmVjdGx5SW5zdGFudGlhdGVkKSB7CiAgICAgIG1hc2suYWRkKEluc3RhbnRpYXRpb24uRElSRUNUTFlfSU5TVEFOVElBVEVEKTsKICAgIH0KICAgIGlmIChpbmNsdWRlSW5kaXJlY3RseUluc3RhbnRpYXRlZCkgewogICAgICBtYXNrLmFkZChJbnN0YW50aWF0aW9uLklORElSRUNUTFlfSU5TVEFOVElBVEVEKTsKICAgIH0KICAgIGlmIChpbmNsdWRlVW5pbnN0YW50aWF0ZWQpIHsKICAgICAgbWFzay5hZGQoSW5zdGFudGlhdGlvbi5VTklOU1RBTlRJQVRFRCk7CiAgICB9CiAgICBpZiAoaW5jbHVkZUFic3RyYWN0bHlJbnN0YW50aWF0ZWQpIHsKICAgICAgbWFzay5hZGQoSW5zdGFudGlhdGlvbi5BQlNUUkFDVExZX0lOU1RBTlRJQVRFRCk7CiAgICB9CiAgICByZXR1cm4gbWFzazsKICB9CgogIGZpbmFsIENsYXNzSGllcmFyY2h5Tm9kZSBwYXJlbnROb2RlOwogIGZpbmFsIEVudW1TZXQ8SW5zdGFudGlhdGlvbj4gX21hc2sgPSBuZXcgRW51bVNldDxJbnN0YW50aWF0aW9uPi5mcm9tVmFsdWVzKAogICAgICBjb25zdCA8SW5zdGFudGlhdGlvbj5bSW5zdGFudGlhdGlvbi5VTklOU1RBTlRJQVRFRF0pOwogIGZpbmFsIEluZGV4ZWRDbGFzcyBjbHM7CgogIGZpbmFsIGludCBoaWVyYXJjaHlEZXB0aDsKCiAgQ2xhc3NFbnRpdHkgX2xlYXN0VXBwZXJJbnN0YW50aWF0ZWRTdWJjbGFzczsKICBpbnQgX2luc3RhbnRpYXRlZFN1YmNsYXNzQ291bnQgPSAwOwoKICAvLy8gYHRydWVgIGlmIFtjbHNdIGhhcyBiZWVuIGRpcmVjdGx5IGluc3RhbnRpYXRlZC4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlIGBDYCBidXQgX25vdF8gYEJgIGluOgogIC8vLyAgIGNsYXNzIEIge30KICAvLy8gICBjbGFzcyBDIGV4dGVuZHMgQiB7fQogIC8vLyAgIG1haW4oKSA9PiBuZXcgQygpOwogIC8vLwogIGJvb2wgZ2V0IGlzRGlyZWN0bHlJbnN0YW50aWF0ZWQgPT4KICAgICAgX21hc2suY29udGFpbnMoSW5zdGFudGlhdGlvbi5ESVJFQ1RMWV9JTlNUQU5USUFURUQpOwoKICB2b2lkIHNldCBpc0RpcmVjdGx5SW5zdGFudGlhdGVkKGJvb2wgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSAhPSBpc0RpcmVjdGx5SW5zdGFudGlhdGVkKSB7CiAgICAgIF91cGRhdGVQYXJlbnRJbnN0YW50aWF0ZWRTdWJjbGFzc0NvdW50KAogICAgICAgICAgSW5zdGFudGlhdGlvbi5ESVJFQ1RMWV9JTlNUQU5USUFURUQsCiAgICAgICAgICBhZGQ6IHZhbHVlKTsKICAgIH0KICB9CgogIC8vLyBgdHJ1ZWAgaWYgW2Nsc10gaGFzIGJlZW4gYWJzdHJhY3RseSBpbnN0YW50aWF0ZWQuIFRoaXMgbWVhbnMgdGhhdCBhdAogIC8vLyBydW50aW1lIGluc3RhbmNlcyBvZiBbY2xzXSBvciB1bmtub3duIHN1YmNsYXNzZXMgb2YgW2Nsc10gYXJlIGFzc3VtZWQgdG8KICAvLy8gZXhpc3QuCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCB0byBtYXJrIG5hdGl2ZSBhbmQvb3IgcmVmbGVjdGFibGUgY2xhc3NlcyBhcyBpbnN0YW50aWF0ZWQuCiAgLy8vIEZvciBuYXRpdmUgY2xhc3NlcyB3ZSBkbyBub3Qga25vdyB0aGUgZXhhY3QgY2xhc3MgdGhhdCBpbnN0YW50aWF0ZXMgW2Nsc10KICAvLy8gc28gW2Nsc10gaGVyZSByZXByZXNlbnRzIHRoZSByb290IG9mIHRoZSBzdWJjbGFzc2VzLiBGb3IgcmVmbGVjdGFibGUKICAvLy8gY2xhc3NlcyB3ZSBuZWVkIGV2ZW50IGFic3RyYWN0IGNsYXNzZXMgdG8gYmUgJ2xpdmUnIGV2ZW4gdGhvdWdoIHRoZXkKICAvLy8gY2Fubm90IHRoZW1zZWx2ZXMgYmUgaW5zdGFudGlhdGVkLgogIGJvb2wgZ2V0IGlzQWJzdHJhY3RseUluc3RhbnRpYXRlZCA9PgogICAgICBfbWFzay5jb250YWlucyhJbnN0YW50aWF0aW9uLkFCU1RSQUNUTFlfSU5TVEFOVElBVEVEKTsKCiAgdm9pZCBzZXQgaXNBYnN0cmFjdGx5SW5zdGFudGlhdGVkKGJvb2wgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSAhPSBpc0Fic3RyYWN0bHlJbnN0YW50aWF0ZWQpIHsKICAgICAgX3VwZGF0ZVBhcmVudEluc3RhbnRpYXRlZFN1YmNsYXNzQ291bnQoCiAgICAgICAgICBJbnN0YW50aWF0aW9uLkFCU1RSQUNUTFlfSU5TVEFOVElBVEVELAogICAgICAgICAgYWRkOiB2YWx1ZSk7CiAgICB9CiAgfQoKICAvLy8gYHRydWVgIGlmIFtjbHNdIGlzIGVpdGhlciBkaXJlY3RseSBvciBhYnN0cmFjdGx5IGluc3RhbnRpYXRlZC4KICBib29sIGdldCBpc0V4cGxpY2l0bHlJbnN0YW50aWF0ZWQgPT4KICAgICAgaXNEaXJlY3RseUluc3RhbnRpYXRlZCB8fCBpc0Fic3RyYWN0bHlJbnN0YW50aWF0ZWQ7CgogIHZvaWQgX3VwZGF0ZVBhcmVudEluc3RhbnRpYXRlZFN1YmNsYXNzQ291bnQoSW5zdGFudGlhdGlvbiBpbnN0YW50aWF0aW9uLAogICAgICB7Ym9vbCBhZGR9KSB7CiAgICBDbGFzc0hpZXJhcmNoeU5vZGUgcGFyZW50ID0gcGFyZW50Tm9kZTsKICAgIGlmIChhZGQpIHsKICAgICAgX21hc2sucmVtb3ZlKEluc3RhbnRpYXRpb24uVU5JTlNUQU5USUFURUQpOwogICAgICBfbWFzay5hZGQoaW5zdGFudGlhdGlvbik7CiAgICAgIHdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewogICAgICAgIHBhcmVudC5fdXBkYXRlSW5zdGFudGlhdGVkU3ViY2xhc3NDb3VudCgxKTsKICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgX21hc2sucmVtb3ZlKGluc3RhbnRpYXRpb24pOwogICAgICBpZiAoX21hc2suaXNFbXB0eSkgewogICAgICAgIF9tYXNrLmFkZChJbnN0YW50aWF0aW9uLlVOSU5TVEFOVElBVEVEKTsKICAgICAgfQogICAgICB3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKICAgICAgICBwYXJlbnQuX3VwZGF0ZUluc3RhbnRpYXRlZFN1YmNsYXNzQ291bnQoLTEpOwogICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlOwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gYHRydWVgIGlmIFtjbHNdIGhhcyBiZWVuIGluc3RhbnRpYXRlZCB0aHJvdWdoIHN1YmNsYXNzZXMuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZSBgQWAgYW5kIGBCYCBidXQgX25vdF8gYENgIGluOgogIC8vLyAgIGNsYXNzIEEge30KICAvLy8gICBjbGFzcyBCIGV4dGVuZHMgQSB7fQogIC8vLyAgIGNsYXNzIEMgZXh0ZW5kcyBCIHt9CiAgLy8vICAgbWFpbigpID0+IFtuZXcgQigpLCBuZXcgQygpXTsKICAvLy8KICBib29sIGdldCBpc0luZGlyZWN0bHlJbnN0YW50aWF0ZWQgPT4gX2luc3RhbnRpYXRlZFN1YmNsYXNzQ291bnQgPiAwOwoKICAvLy8gVGhlIG51bWJlciBvZiBzdHJpY3Qgc3ViY2xhc3NlcyB0aGF0IGFyZSBkaXJlY3RseSBvciBpbmRpcmVjdGx5CiAgLy8vIGluc3RhbnRpYXRlZC4KICBpbnQgZ2V0IGluc3RhbnRpYXRlZFN1YmNsYXNzQ291bnQgPT4gX2luc3RhbnRpYXRlZFN1YmNsYXNzQ291bnQ7CgogIHZvaWQgX3VwZGF0ZUluc3RhbnRpYXRlZFN1YmNsYXNzQ291bnQoaW50IGNoYW5nZSkgewogICAgYm9vbCBiZWZvcmUgPSBpc0luZGlyZWN0bHlJbnN0YW50aWF0ZWQ7CiAgICBfaW5zdGFudGlhdGVkU3ViY2xhc3NDb3VudCArPSBjaGFuZ2U7CiAgICBib29sIGFmdGVyID0gaXNJbmRpcmVjdGx5SW5zdGFudGlhdGVkOwogICAgaWYgKGJlZm9yZSAhPSBhZnRlcikgewogICAgICBpZiAoYWZ0ZXIpIHsKICAgICAgICBfbWFzay5yZW1vdmUoSW5zdGFudGlhdGlvbi5VTklOU1RBTlRJQVRFRCk7CiAgICAgICAgX21hc2suYWRkKEluc3RhbnRpYXRpb24uSU5ESVJFQ1RMWV9JTlNUQU5USUFURUQpOwogICAgICB9IGVsc2UgewogICAgICAgIF9tYXNrLnJlbW92ZShJbnN0YW50aWF0aW9uLklORElSRUNUTFlfSU5TVEFOVElBVEVEKTsKICAgICAgICBpZiAoX21hc2suaXNFbXB0eSkgewogICAgICAgICAgX21hc2suYWRkKEluc3RhbnRpYXRpb24uVU5JTlNUQU5USUFURUQpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLy8vIFRoZSBub2RlcyBmb3IgdGhlIGRpcmVjdCBzdWJjbGFzc2VzIG9mIFtjbHNdLgogIExpc3Q8Q2xhc3NIaWVyYXJjaHlOb2RlPiBfZGlyZWN0U3ViY2xhc3NlcyA9IDxDbGFzc0hpZXJhcmNoeU5vZGU+W107CgogIENsYXNzSGllcmFyY2h5Tm9kZSh0aGlzLnBhcmVudE5vZGUsIHRoaXMuY2xzLCB0aGlzLmhpZXJhcmNoeURlcHRoKSB7CiAgICBpZiAocGFyZW50Tm9kZSAhPSBudWxsKSB7CiAgICAgIHBhcmVudE5vZGUuYWRkRGlyZWN0U3ViY2xhc3ModGhpcyk7CiAgICB9CiAgfQoKICAvLy8gRGVzZXJpYWxpemVzIGEgW0NsYXNzSGllcmFyY2h5Tm9kZV0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBDbGFzc0hpZXJhcmNoeU5vZGUucmVhZEZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwgTWFwPENsYXNzRW50aXR5LCBDbGFzc0hpZXJhcmNoeU5vZGU+IG5vZGVNYXApIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgSW5kZXhlZENsYXNzIGNscyA9IHNvdXJjZS5yZWFkQ2xhc3MoKTsKICAgIENsYXNzSGllcmFyY2h5Tm9kZSBwYXJlbnROb2RlOwogICAgSW5kZXhlZENsYXNzIHN1cGVyY2xhc3MgPSBzb3VyY2UucmVhZENsYXNzT3JOdWxsKCk7CiAgICBpZiAoc3VwZXJjbGFzcyAhPSBudWxsKSB7CiAgICAgIHBhcmVudE5vZGUgPSBub2RlTWFwW3N1cGVyY2xhc3NdOwogICAgICBhc3NlcnQocGFyZW50Tm9kZSAhPSBudWxsLAogICAgICAgICAgIk5vIENsYXNzSGllcmFyY2h5Tm9kZSBmb3Igc3VwZXJjbGFzcyAkc3VwZXJjbGFzcy4iKTsKICAgIH0KICAgIGludCBtYXNrVmFsdWUgPSBzb3VyY2UucmVhZEludCgpOwogICAgaW50IGhpZXJhcmNoeURlcHRoID0gc291cmNlLnJlYWRJbnQoKTsKICAgIGludCBpbnN0YW50aWF0ZWRTdWJjbGFzc0NvdW50ID0gc291cmNlLnJlYWRJbnQoKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgQ2xhc3NIaWVyYXJjaHlOb2RlKHBhcmVudE5vZGUsIGNscywgaGllcmFyY2h5RGVwdGgpCiAgICAgIC4uX2luc3RhbnRpYXRlZFN1YmNsYXNzQ291bnQgPSBpbnN0YW50aWF0ZWRTdWJjbGFzc0NvdW50CiAgICAgIC4uX21hc2sudmFsdWUgPSBtYXNrVmFsdWU7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtDbGFzc0hpZXJhcmNoeU5vZGVdIHRvIFtzaW5rXS4KICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlQ2xhc3MoY2xzKTsKICAgIHNpbmsud3JpdGVDbGFzc09yTnVsbChwYXJlbnROb2RlPy5jbHMpOwogICAgc2luay53cml0ZUludChfbWFzay52YWx1ZSk7CiAgICBzaW5rLndyaXRlSW50KGhpZXJhcmNoeURlcHRoKTsKICAgIHNpbmsud3JpdGVJbnQoX2luc3RhbnRpYXRlZFN1YmNsYXNzQ291bnQpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIC8vLyBBZGRzIFtzdWJjbGFzc10gYXMgYSBkaXJlY3Qgc3ViY2xhc3Mgb2YgW2Nsc10uCiAgdm9pZCBhZGREaXJlY3RTdWJjbGFzcyhDbGFzc0hpZXJhcmNoeU5vZGUgc3ViY2xhc3MpIHsKICAgIGFzc2VydCghX2RpcmVjdFN1YmNsYXNzZXMuY29udGFpbnMoc3ViY2xhc3MpKTsKICAgIF9kaXJlY3RTdWJjbGFzc2VzLmFkZChzdWJjbGFzcyk7CiAgfQoKICBJdGVyYWJsZTxDbGFzc0hpZXJhcmNoeU5vZGU+IGdldCBkaXJlY3RTdWJjbGFzc2VzID0+IF9kaXJlY3RTdWJjbGFzc2VzOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW290aGVyXSBpcyBjb250YWluZWQgaW4gdGhlIHN1YnRyZWUgb2YgdGhpcyBub2RlLgogIC8vLwogIC8vLyBUaGlzIG1lYW5zIHRoYXQgW290aGVyXSBpcyBhIHN1YmNsYXNzIG9mIFtjbHNdLgogIGJvb2wgY29udGFpbnMoQ2xhc3NIaWVyYXJjaHlOb2RlIG90aGVyKSB7CiAgICB3aGlsZSAob3RoZXIgIT0gbnVsbCkgewogICAgICBpZiAoY2xzID09IG90aGVyLmNscykgcmV0dXJuIHRydWU7CiAgICAgIGlmIChoaWVyYXJjaHlEZXB0aCA+PSBvdGhlci5oaWVyYXJjaHlEZXB0aCkgcmV0dXJuIGZhbHNlOwogICAgICBvdGhlciA9IG90aGVyLnBhcmVudE5vZGU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgYG90aGVyLmNsc2AgaXMgYSBzdWJjbGFzcyBvZiBbY2xzXS4KICBib29sIGhhc1N1YmNsYXNzKENsYXNzSGllcmFyY2h5Tm9kZSBvdGhlcikgewogICAgcmV0dXJuIGNvbnRhaW5zKG90aGVyKTsKICB9CgogIC8vLyBgdHJ1ZWAgaWYgW2Nsc10gaGFzIGJlZW4gZGlyZWN0bHksIGluZGlyZWN0bHksIG9yIGFic3RyYWN0bHkgaW5zdGFudGlhdGVkLgogIGJvb2wgZ2V0IGlzSW5zdGFudGlhdGVkID0+CiAgICAgIGlzRXhwbGljaXRseUluc3RhbnRpYXRlZCB8fCBpc0luZGlyZWN0bHlJbnN0YW50aWF0ZWQ7CgogIC8vLyBSZXR1cm5zIGFuIFtJdGVyYWJsZV0gb2YgdGhlIHN1YmNsYXNzZXMgb2YgW2Nsc10gcG9zc2libHkgaW5jbHVkaW5nIFtjbHNdLgogIC8vLwogIC8vLyBTdWJjbGFzc2VzIGFyZSBpbmNsdWRlZCBpZiB0aGVpciBpbnN0YW50aWF0aW9uIHByb3BlcnRpZXMgaW50ZXJzZWN0IHdpdGgKICAvLy8gdGhlaXIgY29ycmVzcG9uZGluZyBbSW5zdGFudGlhdGlvbl0gdmFsdWVzIGluIFttYXNrXS4gSWYgW3N0cmljdF0gaXMKICAvLy8gYHRydWVgLCBbY2xzXSBpdHNlbGYgaXMgX25vdF8gcmV0dXJuZWQuCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IHN1YmNsYXNzZXNCeU1hc2soRW51bVNldDxJbnN0YW50aWF0aW9uPiBtYXNrLAogICAgICB7Ym9vbCBzdHJpY3Q6IGZhbHNlfSkgewogICAgcmV0dXJuIG5ldyBDbGFzc0hpZXJhcmNoeU5vZGVJdGVyYWJsZSh0aGlzLCBtYXNrLCBpbmNsdWRlUm9vdDogIXN0cmljdCk7CiAgfQoKICAvLy8gQXBwbGllcyBbcHJlZGljYXRlXSB0byBlYWNoIHN1YmNsYXNzIG9mIFtjbHNdIG1hdGNoaW5nIHRoZSBjcml0ZXJpYQogIC8vLyBzcGVjaWZpZWQgYnkgW21hc2tdIGFuZCBbc3RyaWN0XS4gSWYgW3ByZWRpY2F0ZV0gcmV0dXJucyBgdHJ1ZWAgb24gYQogIC8vLyBjbGFzcywgdmlzaXRhdGlvbiBpcyBzdG9wcGVkIGltbWVkaWF0ZWx5IGFuZCB0aGUgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAuCiAgLy8vCiAgLy8vIFtwcmVkaWNhdGVdIGlzIGFwcGxpZWQgdG8gc3ViY2xhc3NlcyBpZiB0aGVpciBpbnN0YW50aWF0aW9uIHByb3BlcnRpZXMKICAvLy8gaW50ZXJzZWN0IHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyBbSW5zdGFudGlhdGlvbl0gdmFsdWVzIGluIFttYXNrXS4gSWYKICAvLy8gW3N0cmljdF0gaXMgYHRydWVgLCBbcHJlZGljYXRlXSBpcyBfbm90XyBjYWxsZWQgb24gW2Nsc10gaXRzZWxmLgogIGJvb2wgYW55U3ViY2xhc3MoYm9vbCBwcmVkaWNhdGUoQ2xhc3NFbnRpdHkgY2xzKSwgRW51bVNldDxJbnN0YW50aWF0aW9uPiBtYXNrLAogICAgICB7Ym9vbCBzdHJpY3Q6IGZhbHNlfSkgewogICAgSXRlcmF0aW9uU3RlcCB3cmFwcGVyKENsYXNzRW50aXR5IGNscykgewogICAgICByZXR1cm4gcHJlZGljYXRlKGNscykgPyBJdGVyYXRpb25TdGVwLlNUT1AgOiBJdGVyYXRpb25TdGVwLkNPTlRJTlVFOwogICAgfQoKICAgIHJldHVybiBmb3JFYWNoU3ViY2xhc3Mod3JhcHBlciwgbWFzaywgc3RyaWN0OiBzdHJpY3QpID09IEl0ZXJhdGlvblN0ZXAuU1RPUDsKICB9CgogIC8vLyBBcHBsaWVzIFtmXSB0byBlYWNoIHN1YmNsYXNzIG9mIFtjbHNdIG1hdGNoaW5nIHRoZSBjcml0ZXJpYSBzcGVjaWZpZWQgYnkKICAvLy8gW21hc2tdIGFuZCBbc3RyaWN0XS4KICAvLy8KICAvLy8gW2ZdIGlzIGEgYXBwbGllZCB0byBzdWJjbGFzc2VzIGlmIHRoZWlyIGluc3RhbnRpYXRpb24gcHJvcGVydGllcyBpbnRlcnNlY3QKICAvLy8gd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIFtJbnN0YW50aWF0aW9uXSB2YWx1ZXMgaW4gW21hc2tdLiBJZiBbc3RyaWN0XSBpcwogIC8vLyBgdHJ1ZWAsIFtmXSBpcyBfbm90XyBjYWxsZWQgb24gW2Nsc10gaXRzZWxmLgogIC8vLwogIC8vLyBUaGUgdmlzaXRhdGlvbiBvZiBzdWJjbGFzc2VzIGNhbiBiZSBjdXQgc2hvcnQgYnkgdGhlIHJldHVybiB2YWx1ZSBvZiBbZl0uCiAgLy8vIElmIFtGb3JFYWNoLlNUT1BdIGlzIHJldHVybmVkLCBubyBmdXJ0aGVyIGNsYXNzZXMgYXJlIHZpc2l0ZWQgYW5kIHRoZQogIC8vLyBmdW5jdGlvbiBzdG9wcyBpbW1lZGlhdGVseS4gSWYgW0ZvckVhY2guU0tJUF9TVUJDTEFTU0VTXSBpcyByZXR1cm5lZCwgdGhlCiAgLy8vIHN1YmNsYXNzZXMgb2YgdGhlIGxhc3QgdmlzaXRlZCBjbGFzcyBhcmUgc2tpcHBlZCwgYnV0IHZpc2l0YXRpb24KICAvLy8gY29udGludWVzLiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiBpcyBlaXRoZXIgW0ZvckVhY2guU1RPUF0sIGlmCiAgLy8vIHZpc2l0YXRpb24gd2FzIHN0b3BwZWQsIG9yIFtGb3JFYWNoLkNPTlRJTlVFXSBpZiB2aXNpdGF0aW9uIGNvbnRpbnVlZCB0bwogIC8vLyB0aGUgZW5kLgogIEl0ZXJhdGlvblN0ZXAgZm9yRWFjaFN1YmNsYXNzKEZvckVhY2hGdW5jdGlvbiBmLCBFbnVtU2V0PEluc3RhbnRpYXRpb24+IG1hc2ssCiAgICAgIHtib29sIHN0cmljdDogZmFsc2V9KSB7CiAgICBJdGVyYXRpb25TdGVwIG5leHRTdGVwOwogICAgaWYgKCFzdHJpY3QgJiYgbWFzay5pbnRlcnNlY3RzKF9tYXNrKSkgewogICAgICBuZXh0U3RlcCA9IGYoY2xzKTsKICAgIH0KICAgIC8vIEludGVycHJldCBgZm9yRWFjaCA9PSBudWxsYCBhcyBgZm9yRWFjaCA9PSBGb3JFYWNoLkNPTlRJTlVFYC4KICAgIG5leHRTdGVwID8/PSBJdGVyYXRpb25TdGVwLkNPTlRJTlVFOwoKICAgIGlmIChuZXh0U3RlcCA9PSBJdGVyYXRpb25TdGVwLkNPTlRJTlVFKSB7CiAgICAgIGlmIChtYXNrLmNvbnRhaW5zKEluc3RhbnRpYXRpb24uVU5JTlNUQU5USUFURUQpIHx8IGlzSW5zdGFudGlhdGVkKSB7CiAgICAgICAgZm9yIChDbGFzc0hpZXJhcmNoeU5vZGUgc3ViY2xhc3MgaW4gX2RpcmVjdFN1YmNsYXNzZXMpIHsKICAgICAgICAgIEl0ZXJhdGlvblN0ZXAgc3ViRm9yRWFjaCA9IHN1YmNsYXNzLmZvckVhY2hTdWJjbGFzcyhmLCBtYXNrKTsKICAgICAgICAgIGlmIChzdWJGb3JFYWNoID09IEl0ZXJhdGlvblN0ZXAuU1RPUCkgewogICAgICAgICAgICByZXR1cm4gc3ViRm9yRWFjaDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChuZXh0U3RlcCA9PSBJdGVyYXRpb25TdGVwLlNUT1ApIHsKICAgICAgcmV0dXJuIG5leHRTdGVwOwogICAgfQogICAgcmV0dXJuIEl0ZXJhdGlvblN0ZXAuQ09OVElOVUU7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgbW9zdCBzcGVjaWZpYyBzdWJjbGFzcyBvZiBbY2xzXSAoaW5jbHVkaW5nIFtjbHNdKSB0aGF0IGlzCiAgLy8vIGRpcmVjdGx5IGluc3RhbnRpYXRlZCBvciBhIHN1cGVyY2xhc3Mgb2YgYWxsIGRpcmVjdGx5IGluc3RhbnRpYXRlZAogIC8vLyBzdWJjbGFzc2VzLiBJZiBbY2xzXSBpcyBub3QgaW5zdGFudGlhdGVkLCBgbnVsbGAgaXMgcmV0dXJuZWQuCiAgQ2xhc3NFbnRpdHkgZ2V0THViT2ZJbnN0YW50aWF0ZWRTdWJjbGFzc2VzKCkgewogICAgaWYgKCFpc0luc3RhbnRpYXRlZCkgcmV0dXJuIG51bGw7CiAgICBpZiAoX2xlYXN0VXBwZXJJbnN0YW50aWF0ZWRTdWJjbGFzcyA9PSBudWxsKSB7CiAgICAgIF9sZWFzdFVwcGVySW5zdGFudGlhdGVkU3ViY2xhc3MgPQogICAgICAgICAgX2NvbXB1dGVMZWFzdFVwcGVySW5zdGFudGlhdGVkU3ViY2xhc3MoKTsKICAgIH0KICAgIHJldHVybiBfbGVhc3RVcHBlckluc3RhbnRpYXRlZFN1YmNsYXNzOwogIH0KCiAgQ2xhc3NFbnRpdHkgX2NvbXB1dGVMZWFzdFVwcGVySW5zdGFudGlhdGVkU3ViY2xhc3MoKSB7CiAgICBpZiAoaXNFeHBsaWNpdGx5SW5zdGFudGlhdGVkKSB7CiAgICAgIHJldHVybiBjbHM7CiAgICB9CiAgICBpZiAoIWlzSW5zdGFudGlhdGVkKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIHN1YmNsYXNzOwogICAgZm9yIChDbGFzc0hpZXJhcmNoeU5vZGUgbm9kZSBpbiBfZGlyZWN0U3ViY2xhc3NlcykgewogICAgICBpZiAobm9kZS5pc0luc3RhbnRpYXRlZCkgewogICAgICAgIGlmIChzdWJjbGFzcyA9PSBudWxsKSB7CiAgICAgICAgICBzdWJjbGFzcyA9IG5vZGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBjbHM7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoc3ViY2xhc3MgIT0gbnVsbCkgewogICAgICByZXR1cm4gc3ViY2xhc3MuZ2V0THViT2ZJbnN0YW50aWF0ZWRTdWJjbGFzc2VzKCk7CiAgICB9CiAgICByZXR1cm4gY2xzOwogIH0KCiAgdm9pZCBwcmludE9uKFN0cmluZ0J1ZmZlciBzYiwgU3RyaW5nIGluZGVudGF0aW9uLAogICAgICB7Ym9vbCBpbnN0YW50aWF0ZWRPbmx5OiBmYWxzZSwKICAgICAgYm9vbCBzb3J0ZWQ6IHRydWUsCiAgICAgIENsYXNzRW50aXR5IHdpdGhSZXNwZWN0VG99KSB7CiAgICBib29sIGlzUmVsYXRlZFRvKENsYXNzRW50aXR5IF9zdWJjbGFzcykgewogICAgICByZXR1cm4gdHJ1ZTsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3VwcG9ydCB0aGlzIGZvciBrZXJuZWwgYmFzZWQgZWxlbWVudHM6CiAgICAgIC8vIHJldHVybiBzdWJjbGFzcyA9PSB3aXRoUmVzcGVjdFRvIHx8CiAgICAgIC8vICAgIHN1YmNsYXNzLmltcGxlbWVudHNJbnRlcmZhY2Uod2l0aFJlc3BlY3RUbyk7CiAgICB9CgogICAgc2Iud3JpdGUoaW5kZW50YXRpb24pOwogICAgaWYgKGNscy5pc0Fic3RyYWN0KSB7CiAgICAgIHNiLndyaXRlKCdhYnN0cmFjdCAnKTsKICAgIH0KICAgIHNiLndyaXRlKCdjbGFzcyAke2Nscy5uYW1lfTonKTsKICAgIGlmIChpc0RpcmVjdGx5SW5zdGFudGlhdGVkKSB7CiAgICAgIHNiLndyaXRlKCcgZGlyZWN0bHknKTsKICAgIH0KICAgIGlmIChpc0luZGlyZWN0bHlJbnN0YW50aWF0ZWQpIHsKICAgICAgc2Iud3JpdGUoJyBpbmRpcmVjdGx5Jyk7CiAgICB9CiAgICBpZiAoaXNBYnN0cmFjdGx5SW5zdGFudGlhdGVkKSB7CiAgICAgIHNiLndyaXRlKCcgYWJzdHJhY3RseScpOwogICAgfQogICAgc2Iud3JpdGUoJyBbJyk7CiAgICBpZiAoX2RpcmVjdFN1YmNsYXNzZXMuaXNFbXB0eSkgewogICAgICBzYi53cml0ZSgnXScpOwogICAgfSBlbHNlIHsKICAgICAgZHluYW1pYyBzdWJjbGFzc2VzID0gX2RpcmVjdFN1YmNsYXNzZXM7CiAgICAgIGlmIChzb3J0ZWQpIHsKICAgICAgICBzdWJjbGFzc2VzID0gX2RpcmVjdFN1YmNsYXNzZXMudG9MaXN0KCkKICAgICAgICAgIC4uc29ydCgoYSwgYikgewogICAgICAgICAgICByZXR1cm4gYS5jbHMubmFtZS5jb21wYXJlVG8oYi5jbHMubmFtZSk7CiAgICAgICAgICB9KTsKICAgICAgfQogICAgICBib29sIG5lZWRzQ29tbWEgPSBmYWxzZTsKICAgICAgZm9yIChDbGFzc0hpZXJhcmNoeU5vZGUgY2hpbGQgaW4gc3ViY2xhc3NlcykgewogICAgICAgIGlmIChpbnN0YW50aWF0ZWRPbmx5ICYmICFjaGlsZC5pc0luc3RhbnRpYXRlZCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh3aXRoUmVzcGVjdFRvICE9IG51bGwgJiYKICAgICAgICAgICAgIWNoaWxkLmFueVN1YmNsYXNzKGlzUmVsYXRlZFRvLCBDbGFzc0hpZXJhcmNoeU5vZGUuQUxMKSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChuZWVkc0NvbW1hKSB7CiAgICAgICAgICBzYi53cml0ZSgnLFxuJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNiLndyaXRlKCdcbicpOwogICAgICAgIH0KICAgICAgICBjaGlsZC5wcmludE9uKHNiLCAnJGluZGVudGF0aW9uICAnLAogICAgICAgICAgICBpbnN0YW50aWF0ZWRPbmx5OiBpbnN0YW50aWF0ZWRPbmx5LAogICAgICAgICAgICBzb3J0ZWQ6IHNvcnRlZCwKICAgICAgICAgICAgd2l0aFJlc3BlY3RUbzogd2l0aFJlc3BlY3RUbyk7CiAgICAgICAgbmVlZHNDb21tYSA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKG5lZWRzQ29tbWEpIHsKICAgICAgICBzYi53cml0ZSgnXG4nKTsKICAgICAgICBzYi53cml0ZSgnJGluZGVudGF0aW9uXScpOwogICAgICB9IGVsc2UgewogICAgICAgIHNiLndyaXRlKCddJyk7CiAgICAgIH0KICAgIH0KICB9CgogIFN0cmluZyBkdW1wKAogICAgICB7U3RyaW5nIGluZGVudGF0aW9uOiAnJywKICAgICAgYm9vbCBpbnN0YW50aWF0ZWRPbmx5OiBmYWxzZSwKICAgICAgQ2xhc3NFbnRpdHkgd2l0aFJlc3BlY3RUb30pIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHByaW50T24oc2IsIGluZGVudGF0aW9uLAogICAgICAgIGluc3RhbnRpYXRlZE9ubHk6IGluc3RhbnRpYXRlZE9ubHksIHdpdGhSZXNwZWN0VG86IHdpdGhSZXNwZWN0VG8pOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBjbHMudG9TdHJpbmcoKTsKfQoKLy8vIE9iamVjdCBob2xkaW5nIHRoZSBzdWJjbGFzcyBhbmQgc3VidHlwZSByZWxhdGlvbiBmb3IgYSBzaW5nbGUKLy8vIFtDbGFzc0VudGl0eV0uCi8vLwovLy8gVGhlIHN1YmNsYXNzIHJlbGF0aW9uIGZvciBhIGNsYXNzIGBDYCBpcyBtb2RlbGxlZCB0aHJvdWdoIGEgcmVmZXJlbmNlIHRvCi8vLyB0aGUgW0NsYXNzSGllcmFyY2h5Tm9kZV0gZm9yIGBDYCBpbiB0aGUgZ2xvYmFsIFtDbGFzc0hpZXJhcmNoeU5vZGVdIHRyZWUKLy8vIGNvbXB1dGVkIGluIFtXb3JsZF0uCi8vLwovLy8gVGhlIHN1YnR5cGUgcmVsYXRpb24gZm9yIGEgY2xhc3MgYENgIGlzIG1vZGVsbGVkIHRocm91Z2ggYSBjb2xsZWN0aW9uIG9mCi8vLyBkaXNqb2ludCBbQ2xhc3NIaWVyYXJjaHlOb2RlXSBzdWJ0cmVlcy4gVGhlIHN1YmNsYXNzZXMgb2YgYENgLCBtb2RlbGxlZAovLy8gdGhyb3VnaCB0aGUgYWZvcmVtZW50aW9uZWQgW0NsYXNzSGllcmFyY2h5Tm9kZV0gcG9pbnRlciwgYXJlIGV4dGVuZGVkIHdpdGgKLy8vIHRoZSBzdWJ0eXBlcyB0aGF0IGRvIG5vdCBleHRlbmQgYENgIHRocm91Z2ggYSBsaXN0IG9mIGFkZGl0aW9uYWwKLy8vIFtDbGFzc0hpZXJhcmNoeU5vZGVdIG5vZGVzLiBUaGlzIGxpc3QgaXMgbm9ybWFsaXplZCB0byBjb250YWluIG9ubHkgdGhlCi8vLyBub2RlcyBmb3IgdGhlIHRvcG1vc3Qgc3VidHlwZXMgYW5kIGlzIGZ1cnRoZXJtb3JlIG9yZGVyZWQgaW4gaW5jcmVhc2luZwovLy8gaGllcmFyY2h5IGRlcHRoIG9yZGVyLgovLy8KLy8vIEZvciB0aGlzIGNsYXNzIGhpZXJhcmNoeToKLy8vCi8vLyAgICAgY2xhc3MgQSB7fQovLy8gICAgIGNsYXNzIEIgZXh0ZW5kcyBBIHt9Ci8vLyAgICAgY2xhc3MgQyBpbXBsZW1lbnRzIEIge30KLy8vICAgICBjbGFzcyBEIGltcGxlbWVudHMgQSB7fQovLy8gICAgIGNsYXNzIEUgZXh0ZW5kcyBEIHt9Ci8vLyAgICAgY2xhc3MgRiBpbXBsZW1lbnRzIEQge30KLy8vCi8vLyB0aGUgW0NsYXNzSGllcmFyY2h5Tm9kZV0gdHJlZSBpcwovLy8KLy8vICAgICAgIE9iamVjdAovLy8gICAgICAvIHwgIHwgXAovLy8gICAgIEEgIEMgIEQgIEYKLy8vICAgICB8ICAgICB8Ci8vLyAgICAgQiAgICAgRQovLy8KLy8vIGFuZCB0aGUgW0NsYXNzU2V0XSBmb3IgYEFgIGhvbGRzIHRoZXNlIFtDbGFzc0hpZXJhcmNoeU5vZGVdIG5vZGVzOgovLy8KLy8vICAgICAgQSAgLT4gIFtDLCBELCBGXQovLy8KLy8vIFRoZSBzdWJ0eXBlcyBgQmAgYW5kIGBFYCBhcmUgbm90IGRpcmVjdGx5IG1vZGVsZWQgYmVjYXVzZSB0aGV5IGFyZSBpbXBsaWVkCi8vLyBieSB0aGVpciBzdWJjbGFzcyByZWxhdGlvbiB0byBgQWAgYW5kIGBEYCwgcmVzcGVjdGl2ZWx5LiBUaGlzIGNhbiBiZSBzZWVuCi8vLyBpZiB3ZSBleHBhbmQgdGhlIHN1YmNsYXNzIHN1YnRyZWVzOgovLy8KLy8vICAgICAgQSAgLT4gIFtDLCBELCBGXQovLy8gICAgICB8ICAgICAgICAgIHwKLy8vICAgICAgQiAgICAgICAgICBFCi8vLwpjbGFzcyBDbGFzc1NldCB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtDbGFzc1NldF0gb2JqZWN0cyBpbiBhIGRlYnVnZ2luZwogIC8vLyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdjbGFzcy1zZXQnOwoKICBmaW5hbCBDbGFzc0hpZXJhcmNoeU5vZGUgbm9kZTsKICBDbGFzc0VudGl0eSBfbGVhc3RVcHBlckluc3RhbnRpYXRlZFN1YnR5cGU7CgogIC8vLyBBIGxpc3Qgb2YgdGhlIGNsYXNzIGhpZXJhcmNoeSBub2RlcyBmb3IgdGhlIHN1YnR5cGVzIHRoYXQgZGVjbGFyZSBhCiAgLy8vIHN1YnR5cGUgcmVsYXRpb25zaGlwIHRvIFtjbHNdIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2UKICAvLy8KICAvLy8gICAgIGNsYXNzIEEge30KICAvLy8gICAgIGNsYXNzIEIgZXh0ZW5kcyBBIHt9CiAgLy8vICAgICBjbGFzcyBDIGltcGxlbWVudHMgQiB7fQogIC8vLyAgICAgY2xhc3MgRCBpbXBsZW1lbnRzIEEge30KICAvLy8gICAgIGNsYXNzIEUgZXh0ZW5kcyBEIHt9CiAgLy8vCiAgLy8vIFRoZSBjbGFzcyBoaWVyYXJjaHkgbm9kZXMgZm9yIGNsYXNzZXMgYENgIGFuZCBgRGAgYXJlIGluIFtfc3VidHlwZXNdLiBgQ2AKICAvLy8gYmVjYXVzZSBpdCBpbXBsZW1lbnRzIGBBYCB0aHJvdWdoIGBCYCBhbmQgYERgIGJlY2F1c2UgaXQgaW1wbGVtZW50cyBgQWAKICAvLy8gZGlyZWN0bHkuIGBFYCBhbHNvIGltcGxlbWVudHMgYEFgIHRocm91Z2ggaXRzIGV4dGVuc2lvbiBvZiBgRGAgYW5kIGl0IGlzCiAgLy8vIHRoZXJlZm9yZSBpbmNsdWRlZCB0aHJvdWdoIHRoZSBjbGFzcyBoaWVyYXJjaHkgbm9kZSBmb3IgYERgLgogIC8vLwogIExpc3Q8Q2xhc3NIaWVyYXJjaHlOb2RlPiBfc3VidHlwZXM7CgogIC8vLyBBIGxpc3Qgb2YgdGhlIGNsYXNzIGhpZXJhcmNoeSBub2RlcyBmb3IgdGhlIGNsYXNzIHRoYXQgZGlyZWN0bHkgbWl4IGluCiAgLy8vIFtjbHNdLgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2UKICAvLy8KICAvLy8gICAgIGNsYXNzIEEge30KICAvLy8gICAgIGNsYXNzIEIgZXh0ZW5kcyBPYmplY3Qgd2l0aCBBIHt9CiAgLy8vICAgICBjbGFzcyBDID0gT2JqZWN0IHdpdGggQTsKICAvLy8gICAgIGNsYXNzIEQgZXh0ZW5kcyBCIHt9CiAgLy8vICAgICBjbGFzcyBFIGV4dGVuZHMgQyB7fQogIC8vLwogIC8vLyBUaGUgY2xhc3MgaGllcmFyY2h5IG5vZGVzIGZvciB0aGUgdW5uYW1lZCBtaXhpbiBhcHBsaWNhdGlvbiBgT2JqZWN0K0FgIGFuZAogIC8vLyB0aGUgbmFtZWQgbWl4aW4gYXBwbGljYXRpb24gYENgIGFyZSBpbiBbX21peGluQXBwbGljYXRpb25zXS4KICAvLy8KICBMaXN0PENsYXNzSGllcmFyY2h5Tm9kZT4gX21peGluQXBwbGljYXRpb25zOwoKICBDbGFzc1NldCh0aGlzLm5vZGUpOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW0NsYXNzU2V0XSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IENsYXNzU2V0LnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgRGF0YVNvdXJjZSBzb3VyY2UsIE1hcDxDbGFzc0VudGl0eSwgQ2xhc3NIaWVyYXJjaHlOb2RlPiBub2RlTWFwKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIENsYXNzSGllcmFyY2h5Tm9kZSBub2RlID0gbm9kZU1hcFtzb3VyY2UucmVhZENsYXNzKCldOwogICAgTGlzdDxDbGFzc0hpZXJhcmNoeU5vZGU+IHN1YnR5cGVzID0gc291cmNlLnJlYWRMaXN0KCgpIHsKICAgICAgcmV0dXJuIG5vZGVNYXBbc291cmNlLnJlYWRDbGFzcygpXTsKICAgIH0sIGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIExpc3Q8Q2xhc3NIaWVyYXJjaHlOb2RlPiBtaXhpbkFwcGxpY2F0aW9ucyA9IHNvdXJjZS5yZWFkTGlzdCgoKSB7CiAgICAgIHJldHVybiBub2RlTWFwW3NvdXJjZS5yZWFkQ2xhc3MoKV07CiAgICB9LCBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IENsYXNzU2V0KG5vZGUpCiAgICAgIC4uX3N1YnR5cGVzID0gc3VidHlwZXMKICAgICAgLi5fbWl4aW5BcHBsaWNhdGlvbnMgPSBtaXhpbkFwcGxpY2F0aW9uczsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0NsYXNzU2V0XSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUNsYXNzKG5vZGUuY2xzKTsKICAgIHNpbmsud3JpdGVMaXN0KF9zdWJ0eXBlcywgKENsYXNzSGllcmFyY2h5Tm9kZSBub2RlKSB7CiAgICAgIHNpbmsud3JpdGVDbGFzcyhub2RlLmNscyk7CiAgICB9LCBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZUxpc3QoX21peGluQXBwbGljYXRpb25zLCAoQ2xhc3NIaWVyYXJjaHlOb2RlIG5vZGUpIHsKICAgICAgc2luay53cml0ZUNsYXNzKG5vZGUuY2xzKTsKICAgIH0sIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQ2xhc3NFbnRpdHkgZ2V0IGNscyA9PiBub2RlLmNsczsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIGBvdGhlci5jbHNgIGlzIGEgc3ViY2xhc3Mgb2YgW2Nsc10uCiAgYm9vbCBoYXNTdWJjbGFzcyhDbGFzc0hpZXJhcmNoeU5vZGUgb3RoZXIpID0+IG5vZGUuaGFzU3ViY2xhc3Mob3RoZXIpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgYG90aGVyLmNsc2AgaXMgYSBzdWJ0eXBlIG9mIFtjbHNdLgogIGJvb2wgaGFzU3VidHlwZShDbGFzc0hpZXJhcmNoeU5vZGUgb3RoZXIpIHsKICAgIGlmIChoYXNTdWJjbGFzcyhvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKF9zdWJ0eXBlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoQ2xhc3NIaWVyYXJjaHlOb2RlIHN1YnR5cGVOb2RlIGluIF9zdWJ0eXBlcykgewogICAgICAgIGlmIChzdWJ0eXBlTm9kZS5oYXNTdWJjbGFzcyhvdGhlcikpIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRpcmVjdGx5IGluc3RhbnRpYXRlZCBzdWJ0eXBlcyBvZiBbY2xzXS4KICBpbnQgZ2V0IGluc3RhbnRpYXRlZFN1YnR5cGVDb3VudCB7CiAgICBpbnQgY291bnQgPSBub2RlLmluc3RhbnRpYXRlZFN1YmNsYXNzQ291bnQ7CiAgICBpZiAoX3N1YnR5cGVzICE9IG51bGwpIHsKICAgICAgZm9yIChDbGFzc0hpZXJhcmNoeU5vZGUgc3VidHlwZU5vZGUgaW4gX3N1YnR5cGVzKSB7CiAgICAgICAgaWYgKHN1YnR5cGVOb2RlLmlzRXhwbGljaXRseUluc3RhbnRpYXRlZCkgewogICAgICAgICAgY291bnQrKzsKICAgICAgICB9CiAgICAgICAgY291bnQgKz0gc3VidHlwZU5vZGUuaW5zdGFudGlhdGVkU3ViY2xhc3NDb3VudDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNvdW50OwogIH0KCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIGFsbCBpbnN0YW50aWF0ZWQgc3VidHlwZXMgb2YgW2Nsc10gYXJlIHN1YmNsYXNzZXMgb2YKICAvLy8gW2Nsc10uCiAgYm9vbCBnZXQgaGFzT25seUluc3RhbnRpYXRlZFN1YmNsYXNzZXMgewogICAgaWYgKF9zdWJ0eXBlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoQ2xhc3NIaWVyYXJjaHlOb2RlIHN1YnR5cGVOb2RlIGluIF9zdWJ0eXBlcykgewogICAgICAgIGlmIChzdWJ0eXBlTm9kZS5pc0luc3RhbnRpYXRlZCkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvLy8gUmV0dXJucyBhbiBbSXRlcmFibGVdIG9mIHRoZSBjbGFzc2VzIHRoYXQgaW1wbGVtZW50IFtjbHNdIGRpcmVjdGx5IG9yCiAgLy8vIHRocm91Z2ggc3VwZXJ0eXBlcy4KICAvLy8KICAvLy8gQSBjbGFzcyB0aGF0IGltcGxlbWVudHMgW2Nsc10gdGhyb3VnaCBpdHMgc3VwZXJjbGFzc2VzIGlzIG5vdCBpbmNsdWRlZCBpbgogIC8vLyB0aGUgaXRlcmFibGUuCiAgSXRlcmFibGU8Q2xhc3NIaWVyYXJjaHlOb2RlPiBnZXQgc3VidHlwZU5vZGVzIHsKICAgIHJldHVybiBfc3VidHlwZXMgPz8gY29uc3QgPENsYXNzSGllcmFyY2h5Tm9kZT5bXTsKICB9CgogIC8vLyBSZXR1cm5zIGFuIFtJdGVyYWJsZV0gb2YgdGhlIGNsYXNzZXMgdGhhdCBtaXggaW4gW2Nsc10gZGlyZWN0bHkuCiAgSXRlcmFibGU8Q2xhc3NIaWVyYXJjaHlOb2RlPiBnZXQgbWl4aW5BcHBsaWNhdGlvbk5vZGVzIHsKICAgIHJldHVybiBfbWl4aW5BcHBsaWNhdGlvbnMgPz8gY29uc3QgPENsYXNzSGllcmFyY2h5Tm9kZT5bXTsKICB9CgogIC8vLyBSZXR1cm5zIGFuIFtJdGVyYWJsZV0gb2YgdGhlIHN1YmNsYXNzZXMgb2YgW2Nsc10gcG9zc2libHkgaW5jbHVkaW5nIFtjbHNdLgogIC8vLwogIC8vLyBTdWJjbGFzc2VzIGFyZSBpbmNsdWRlZCBpZiB0aGVpciBpbnN0YW50aWF0aW9uIHByb3BlcnRpZXMgaW50ZXJzZWN0IHdpdGgKICAvLy8gdGhlaXIgY29ycmVzcG9uZGluZyBbSW5zdGFudGlhdGlvbl0gdmFsdWVzIGluIFttYXNrXS4gSWYgW3N0cmljdF0gaXMKICAvLy8gYHRydWVgLCBbY2xzXSBpdHNlbGYgaXMgX25vdF8gcmV0dXJuZWQuCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IHN1YmNsYXNzZXNCeU1hc2soRW51bVNldDxJbnN0YW50aWF0aW9uPiBtYXNrLAogICAgICB7Ym9vbCBzdHJpY3Q6IGZhbHNlfSkgewogICAgcmV0dXJuIG5vZGUuc3ViY2xhc3Nlc0J5TWFzayhtYXNrLCBzdHJpY3Q6IHN0cmljdCk7CiAgfQoKICAvLy8gUmV0dXJucyBhbiBbSXRlcmFibGVdIG9mIHRoZSBzdWJ0eXBlcyBvZiBbY2xzXSBwb3NzaWJseSBpbmNsdWRpbmcgW2Nsc10uCiAgLy8vCiAgLy8vIFRoZSBkaXJlY3RseSBpbnN0YW50aWF0ZWQsIGluZGlyZWN0bHkgaW5zdGFudGlhdGVkIGFuZCB1bmluc3RhbnRpYXRlZAogIC8vLyBzdWJ0eXBlcyBvZiBbY2xzXSBhcmUgcmV0dXJuZWQgaWYgW2luY2x1ZGVEaXJlY3RseUluc3RhbnRpYXRlZF0sCiAgLy8vIFtpbmNsdWRlSW5kaXJlY3RseUluc3RhbnRpYXRlZF0sIGFuZCBbaW5jbHVkZVVuaW5zdGFudGlhdGVkXSBhcmUgYHRydWVgLAogIC8vLyByZXNwZWN0aXZlbHkuIElmIFtzdHJpY3RdIGlzIGB0cnVlYCwgW2Nsc10gaXRzZWxmIGlzIF9ub3RfIHJldHVybmVkLgogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBzdWJ0eXBlcygKICAgICAge2Jvb2wgaW5jbHVkZURpcmVjdGx5SW5zdGFudGlhdGVkOiB0cnVlLAogICAgICBib29sIGluY2x1ZGVJbmRpcmVjdGx5SW5zdGFudGlhdGVkOiB0cnVlLAogICAgICBib29sIGluY2x1ZGVVbmluc3RhbnRpYXRlZDogdHJ1ZSwKICAgICAgYm9vbCBzdHJpY3Q6IGZhbHNlfSkgewogICAgRW51bVNldDxJbnN0YW50aWF0aW9uPiBtYXNrID0gQ2xhc3NIaWVyYXJjaHlOb2RlLmNyZWF0ZU1hc2soCiAgICAgICAgaW5jbHVkZURpcmVjdGx5SW5zdGFudGlhdGVkOiBpbmNsdWRlRGlyZWN0bHlJbnN0YW50aWF0ZWQsCiAgICAgICAgaW5jbHVkZUluZGlyZWN0bHlJbnN0YW50aWF0ZWQ6IGluY2x1ZGVJbmRpcmVjdGx5SW5zdGFudGlhdGVkLAogICAgICAgIGluY2x1ZGVVbmluc3RhbnRpYXRlZDogaW5jbHVkZVVuaW5zdGFudGlhdGVkKTsKICAgIHJldHVybiBzdWJ0eXBlc0J5TWFzayhtYXNrLCBzdHJpY3Q6IHN0cmljdCk7CiAgfQoKICAvLy8gUmV0dXJucyBhbiBbSXRlcmFibGVdIG9mIHRoZSBzdWJ0eXBlcyBvZiBbY2xzXSBwb3NzaWJseSBpbmNsdWRpbmcgW2Nsc10uCiAgLy8vCiAgLy8vIFN1YnR5cGVzIGFyZSBpbmNsdWRlZCBpZiB0aGVpciBpbnN0YW50aWF0aW9uIHByb3BlcnRpZXMgaW50ZXJzZWN0IHdpdGgKICAvLy8gdGhlaXIgY29ycmVzcG9uZGluZyBbSW5zdGFudGlhdGlvbl0gdmFsdWVzIGluIFttYXNrXS4gSWYgW3N0cmljdF0gaXMKICAvLy8gYHRydWVgLCBbY2xzXSBpdHNlbGYgaXMgX25vdF8gcmV0dXJuZWQuCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IHN1YnR5cGVzQnlNYXNrKEVudW1TZXQ8SW5zdGFudGlhdGlvbj4gbWFzaywKICAgICAge2Jvb2wgc3RyaWN0OiBmYWxzZX0pIHsKICAgIGlmIChfc3VidHlwZXMgPT0gbnVsbCkgewogICAgICByZXR1cm4gbm9kZS5zdWJjbGFzc2VzQnlNYXNrKG1hc2ssIHN0cmljdDogc3RyaWN0KTsKICAgIH0KCiAgICByZXR1cm4gbmV3IFN1YnR5cGVzSXRlcmFibGUuU3VidHlwZXNJdGVyYXRvcih0aGlzLCBtYXNrLAogICAgICAgIGluY2x1ZGVSb290OiAhc3RyaWN0KTsKICB9CgogIC8vLyBBcHBsaWVzIFtwcmVkaWNhdGVdIHRvIGVhY2ggc3ViY2xhc3Mgb2YgW2Nsc10gbWF0Y2hpbmcgdGhlIGNyaXRlcmlhCiAgLy8vIHNwZWNpZmllZCBieSBbbWFza10gYW5kIFtzdHJpY3RdLiBJZiBbcHJlZGljYXRlXSByZXR1cm5zIGB0cnVlYCBvbiBhCiAgLy8vIGNsYXNzLCB2aXNpdGF0aW9uIGlzIHN0b3BwZWQgaW1tZWRpYXRlbHkgYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5zIGB0cnVlYC4KICAvLy8KICAvLy8gW3ByZWRpY2F0ZV0gaXMgYXBwbGllZCB0byBzdWJjbGFzc2VzIGlmIHRoZWlyIGluc3RhbnRpYXRpb24gcHJvcGVydGllcwogIC8vLyBpbnRlcnNlY3Qgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIFtJbnN0YW50aWF0aW9uXSB2YWx1ZXMgaW4gW21hc2tdLiBJZgogIC8vLyBbc3RyaWN0XSBpcyBgdHJ1ZWAsIFtwcmVkaWNhdGVdIGlzIF9ub3RfIGNhbGxlZCBvbiBbY2xzXSBpdHNlbGYuCiAgYm9vbCBhbnlTdWJjbGFzcyhib29sIHByZWRpY2F0ZShDbGFzc0VudGl0eSBjbHMpLCBFbnVtU2V0PEluc3RhbnRpYXRpb24+IG1hc2ssCiAgICAgIHtib29sIHN0cmljdDogZmFsc2V9KSB7CiAgICByZXR1cm4gbm9kZS5hbnlTdWJjbGFzcyhwcmVkaWNhdGUsIG1hc2ssIHN0cmljdDogc3RyaWN0KTsKICB9CgogIC8vLyBBcHBsaWVzIFtmXSB0byBlYWNoIHN1YmNsYXNzIG9mIFtjbHNdIG1hdGNoaW5nIHRoZSBjcml0ZXJpYSBzcGVjaWZpZWQgYnkKICAvLy8gW21hc2tdIGFuZCBbc3RyaWN0XS4KICAvLy8KICAvLy8gW2ZdIGlzIGEgYXBwbGllZCB0byBzdWJjbGFzc2VzIGlmIHRoZWlyIGluc3RhbnRpYXRpb24gcHJvcGVydGllcyBpbnRlcnNlY3QKICAvLy8gd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIFtJbnN0YW50aWF0aW9uXSB2YWx1ZXMgaW4gW21hc2tdLiBJZiBbc3RyaWN0XSBpcwogIC8vLyBgdHJ1ZWAsIFtmXSBpcyBfbm90XyBjYWxsZWQgb24gW2Nsc10gaXRzZWxmLgogIC8vLwogIC8vLyBUaGUgdmlzaXRhdGlvbiBvZiBzdWJjbGFzc2VzIGNhbiBiZSBjdXQgc2hvcnQgYnkgdGhlIHJldHVybiB2YWx1ZSBvZiBbZl0uCiAgLy8vIElmIFtGb3JFYWNoLlNUT1BdIGlzIHJldHVybmVkLCBubyBmdXJ0aGVyIGNsYXNzZXMgYXJlIHZpc2l0ZWQgYW5kIHRoZQogIC8vLyBmdW5jdGlvbiBzdG9wcyBpbW1lZGlhdGVseS4gSWYgW0ZvckVhY2guU0tJUF9TVUJDTEFTU0VTXSBpcyByZXR1cm5lZCwgdGhlCiAgLy8vIHN1YmNsYXNzZXMgb2YgdGhlIGxhc3QgdmlzaXRlZCBjbGFzcyBhcmUgc2tpcHBlZCwgYnV0IHZpc2l0YXRpb24KICAvLy8gY29udGludWVzLiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiBpcyBlaXRoZXIgW0ZvckVhY2guU1RPUF0sIGlmCiAgLy8vIHZpc2l0YXRpb24gd2FzIHN0b3BwZWQsIG9yIFtGb3JFYWNoLkNPTlRJTlVFXSBpZiB2aXNpdGF0aW9uIGNvbnRpbnVlZCB0bwogIC8vLyB0aGUgZW5kLgogIEl0ZXJhdGlvblN0ZXAgZm9yRWFjaFN1YmNsYXNzKEZvckVhY2hGdW5jdGlvbiBmLCBFbnVtU2V0PEluc3RhbnRpYXRpb24+IG1hc2ssCiAgICAgIHtib29sIHN0cmljdDogZmFsc2V9KSB7CiAgICByZXR1cm4gbm9kZS5mb3JFYWNoU3ViY2xhc3MoZiwgbWFzaywgc3RyaWN0OiBzdHJpY3QpOwogIH0KCiAgLy8vIEFwcGxpZXMgW3ByZWRpY2F0ZV0gdG8gZWFjaCBzdWJ0eXBlIG9mIFtjbHNdIG1hdGNoaW5nIHRoZSBjcml0ZXJpYQogIC8vLyBzcGVjaWZpZWQgYnkgW21hc2tdIGFuZCBbc3RyaWN0XS4gSWYgW3ByZWRpY2F0ZV0gcmV0dXJucyBgdHJ1ZWAgb24gYQogIC8vLyBjbGFzcywgdmlzaXRhdGlvbiBpcyBzdG9wcGVkIGltbWVkaWF0ZWx5IGFuZCB0aGUgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAuCiAgLy8vCiAgLy8vIFtwcmVkaWNhdGVdIGlzIGFwcGxpZWQgdG8gc3VidHlwZXMgaWYgdGhlaXIgaW5zdGFudGlhdGlvbiBwcm9wZXJ0aWVzCiAgLy8vIGludGVyc2VjdCB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgW0luc3RhbnRpYXRpb25dIHZhbHVlcyBpbiBbbWFza10uIElmCiAgLy8vIFtzdHJpY3RdIGlzIGB0cnVlYCwgW3ByZWRpY2F0ZV0gaXMgX25vdF8gY2FsbGVkIG9uIFtjbHNdIGl0c2VsZi4KICBib29sIGFueVN1YnR5cGUoYm9vbCBwcmVkaWNhdGUoQ2xhc3NFbnRpdHkgY2xzKSwgRW51bVNldDxJbnN0YW50aWF0aW9uPiBtYXNrLAogICAgICB7Ym9vbCBzdHJpY3Q6IGZhbHNlfSkgewogICAgSXRlcmF0aW9uU3RlcCB3cmFwcGVyKENsYXNzRW50aXR5IGNscykgewogICAgICByZXR1cm4gcHJlZGljYXRlKGNscykgPyBJdGVyYXRpb25TdGVwLlNUT1AgOiBJdGVyYXRpb25TdGVwLkNPTlRJTlVFOwogICAgfQoKICAgIHJldHVybiBmb3JFYWNoU3VidHlwZSh3cmFwcGVyLCBtYXNrLCBzdHJpY3Q6IHN0cmljdCkgPT0gSXRlcmF0aW9uU3RlcC5TVE9QOwogIH0KCiAgLy8vIEFwcGxpZXMgW2ZdIHRvIGVhY2ggc3VidHlwZSBvZiBbY2xzXSBtYXRjaGluZyB0aGUgY3JpdGVyaWEgc3BlY2lmaWVkIGJ5CiAgLy8vIFttYXNrXSBhbmQgW3N0cmljdF0uCiAgLy8vCiAgLy8vIFtmXSBpcyBhIGFwcGxpZWQgdG8gc3VidHlwZXMgaWYgdGhlaXIgaW5zdGFudGlhdGlvbiBwcm9wZXJ0aWVzIGludGVyc2VjdAogIC8vLyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgW0luc3RhbnRpYXRpb25dIHZhbHVlcyBpbiBbbWFza10uIElmIFtzdHJpY3RdIGlzCiAgLy8vIGB0cnVlYCwgW2ZdIGlzIF9ub3RfIGNhbGxlZCBvbiBbY2xzXSBpdHNlbGYuCiAgLy8vCiAgLy8vIFRoZSB2aXNpdGF0aW9uIG9mIHN1YnR5cGVzIGNhbiBiZSBjdXQgc2hvcnQgYnkgdGhlIHJldHVybiB2YWx1ZSBvZiBbZl0uCiAgLy8vIElmIFtGb3JFYWNoLlNUT1BdIGlzIHJldHVybmVkLCBubyBmdXJ0aGVyIGNsYXNzZXMgYXJlIHZpc2l0ZWQgYW5kIHRoZQogIC8vLyBmdW5jdGlvbiBzdG9wcyBpbW1lZGlhdGVseS4gSWYgW0ZvckVhY2guU0tJUF9TVUJDTEFTU0VTXSBpcyByZXR1cm5lZCwgdGhlCiAgLy8vIHN1YmNsYXNzZXMgb2YgdGhlIGxhc3QgdmlzaXRlZCBjbGFzcyBhcmUgc2tpcHBlZCwgYnV0IHZpc2l0YXRpb24KICAvLy8gY29udGludWVzLiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiBpcyBlaXRoZXIgW0ZvckVhY2guU1RPUF0sIGlmCiAgLy8vIHZpc2l0YXRpb24gd2FzIHN0b3BwZWQsIG9yIFtGb3JFYWNoLkNPTlRJTlVFXSBpZiB2aXNpdGF0aW9uIGNvbnRpbnVlZCB0bwogIC8vLyB0aGUgZW5kLgogIEl0ZXJhdGlvblN0ZXAgZm9yRWFjaFN1YnR5cGUoRm9yRWFjaEZ1bmN0aW9uIGYsIEVudW1TZXQ8SW5zdGFudGlhdGlvbj4gbWFzaywKICAgICAge2Jvb2wgc3RyaWN0OiBmYWxzZX0pIHsKICAgIEl0ZXJhdGlvblN0ZXAgbmV4dFN0ZXAgPQogICAgICAgIG5vZGUuZm9yRWFjaFN1YmNsYXNzKGYsIG1hc2ssIHN0cmljdDogc3RyaWN0KSA/PyBJdGVyYXRpb25TdGVwLkNPTlRJTlVFOwogICAgaWYgKG5leHRTdGVwID09IEl0ZXJhdGlvblN0ZXAuQ09OVElOVUUgJiYgX3N1YnR5cGVzICE9IG51bGwpIHsKICAgICAgZm9yIChDbGFzc0hpZXJhcmNoeU5vZGUgc3ViY2xhc3MgaW4gX3N1YnR5cGVzKSB7CiAgICAgICAgSXRlcmF0aW9uU3RlcCBzdWJGb3JFYWNoID0gc3ViY2xhc3MuZm9yRWFjaFN1YmNsYXNzKGYsIG1hc2spOwogICAgICAgIGlmIChzdWJGb3JFYWNoID09IEl0ZXJhdGlvblN0ZXAuU1RPUCkgewogICAgICAgICAgcmV0dXJuIHN1YkZvckVhY2g7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBhc3NlcnQobmV4dFN0ZXAgIT0gSXRlcmF0aW9uU3RlcC5TS0lQX1NVQkNMQVNTRVMpOwogICAgcmV0dXJuIG5leHRTdGVwOwogIH0KCiAgLy8vIEFkZHMgW3N1YnR5cGVdIGFzIGEgc3VidHlwZSBvZiBbY2xzXS4KICB2b2lkIGFkZFN1YnR5cGUoQ2xhc3NIaWVyYXJjaHlOb2RlIHN1YnR5cGUpIHsKICAgIGlmIChub2RlLmNvbnRhaW5zKHN1YnR5cGUpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChfc3VidHlwZXMgPT0gbnVsbCkgewogICAgICBfc3VidHlwZXMgPSA8Q2xhc3NIaWVyYXJjaHlOb2RlPltzdWJ0eXBlXTsKICAgIH0gZWxzZSB7CiAgICAgIGludCBoaWVyYXJjaHlEZXB0aCA9IHN1YnR5cGUuaGllcmFyY2h5RGVwdGg7CiAgICAgIExpc3Q8Q2xhc3NIaWVyYXJjaHlOb2RlPiBuZXdTdWJ0eXBlcyA9IDxDbGFzc0hpZXJhcmNoeU5vZGU+W107CiAgICAgIGJvb2wgYWRkZWQgPSBmYWxzZTsKICAgICAgZm9yIChDbGFzc0hpZXJhcmNoeU5vZGUgb3RoZXJTdWJ0eXBlIGluIF9zdWJ0eXBlcykgewogICAgICAgIGludCBvdGhlckhpZXJhcmNoeURlcHRoID0gb3RoZXJTdWJ0eXBlLmhpZXJhcmNoeURlcHRoOwogICAgICAgIGlmIChoaWVyYXJjaHlEZXB0aCA9PSBvdGhlckhpZXJhcmNoeURlcHRoKSB7CiAgICAgICAgICBpZiAoc3VidHlwZSA9PSBvdGhlclN1YnR5cGUpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gW290aGVyU3VidHlwZV0gaXMgdW5yZWxhdGVkIHRvIFtzdWJ0eXBlXS4KICAgICAgICAgICAgbmV3U3VidHlwZXMuYWRkKG90aGVyU3VidHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChoaWVyYXJjaHlEZXB0aCA+IG90aGVyU3VidHlwZS5oaWVyYXJjaHlEZXB0aCkgewogICAgICAgICAgLy8gW290aGVyU3VidHlwZV0gY291bGQgYmUgYSBzdXBlcmNsYXNzIG9mIFtzdWJ0eXBlXS4KICAgICAgICAgIGlmIChvdGhlclN1YnR5cGUuY29udGFpbnMoc3VidHlwZSkpIHsKICAgICAgICAgICAgLy8gW3N1YnR5cGVdIGlzIGFscmVhZHkgaW4gdGhpcyBzZXQuCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIFtvdGhlclN1YnR5cGVdIGlzIHVucmVsYXRlZCB0byBbc3VidHlwZV0uCiAgICAgICAgICAgIG5ld1N1YnR5cGVzLmFkZChvdGhlclN1YnR5cGUpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoIWFkZGVkKSB7CiAgICAgICAgICAgIC8vIEluc2VydCBbc3VidHlwZV0gYmVmb3JlIG90aGVyIHN1YnR5cGVzIG9mIGhpZ2hlciBoaWVyYXJjaHkgZGVwdGguCiAgICAgICAgICAgIG5ld1N1YnR5cGVzLmFkZChzdWJ0eXBlKTsKICAgICAgICAgICAgYWRkZWQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgLy8gW3N1YnR5cGVdIGNvdWxkIGJlIGEgc3VwZXJjbGFzcyBvZiBbb3RoZXJTdWJ0eXBlXS4KICAgICAgICAgIGlmIChzdWJ0eXBlLmNvbnRhaW5zKG90aGVyU3VidHlwZSkpIHsKICAgICAgICAgICAgLy8gUmVwbGFjZSBbb3RoZXJTdWJ0eXBlXS4KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5ld1N1YnR5cGVzLmFkZChvdGhlclN1YnR5cGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIWFkZGVkKSB7CiAgICAgICAgbmV3U3VidHlwZXMuYWRkKHN1YnR5cGUpOwogICAgICB9CiAgICAgIF9zdWJ0eXBlcyA9IG5ld1N1YnR5cGVzOwogICAgfQogIH0KCiAgLy8vIEFkZHMgW21peGluQXBwbGljYXRpb25dIGFzIGEgY2xhc3MgdGhhdCBtaXhlcyBpbiBbY2xzXS4KICB2b2lkIGFkZE1peGluQXBwbGljYXRpb24oQ2xhc3NIaWVyYXJjaHlOb2RlIG1peGluQXBwbGljYXRpb24pIHsKICAgIGlmIChfbWl4aW5BcHBsaWNhdGlvbnMgPT0gbnVsbCkgewogICAgICBfbWl4aW5BcHBsaWNhdGlvbnMgPSA8Q2xhc3NIaWVyYXJjaHlOb2RlPlttaXhpbkFwcGxpY2F0aW9uXTsKICAgIH0gZWxzZSB7CiAgICAgIF9taXhpbkFwcGxpY2F0aW9ucy5hZGQobWl4aW5BcHBsaWNhdGlvbik7CiAgICB9CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgbW9zdCBzcGVjaWZpYyBzdWJ0eXBlIG9mIFtjbHNdIChpbmNsdWRpbmcgW2Nsc10pIHRoYXQgaXMKICAvLy8gZGlyZWN0bHkgaW5zdGFudGlhdGVkIG9yIGEgc3VwZXJjbGFzcyBvZiBhbGwgZGlyZWN0bHkgaW5zdGFudGlhdGVkCiAgLy8vIHN1YnR5cGVzLiBJZiBubyBzdWJ0eXBlcyBvZiBbY2xzXSBhcmUgaW5zdGFudGlhdGVkLCBgbnVsbGAgaXMgcmV0dXJuZWQuCiAgQ2xhc3NFbnRpdHkgZ2V0THViT2ZJbnN0YW50aWF0ZWRTdWJ0eXBlcygpIHsKICAgIGlmIChfbGVhc3RVcHBlckluc3RhbnRpYXRlZFN1YnR5cGUgPT0gbnVsbCkgewogICAgICBfbGVhc3RVcHBlckluc3RhbnRpYXRlZFN1YnR5cGUgPSBfY29tcHV0ZUxlYXN0VXBwZXJJbnN0YW50aWF0ZWRTdWJ0eXBlKCk7CiAgICB9CiAgICByZXR1cm4gX2xlYXN0VXBwZXJJbnN0YW50aWF0ZWRTdWJ0eXBlOwogIH0KCiAgQ2xhc3NFbnRpdHkgX2NvbXB1dGVMZWFzdFVwcGVySW5zdGFudGlhdGVkU3VidHlwZSgpIHsKICAgIGlmIChub2RlLmlzRXhwbGljaXRseUluc3RhbnRpYXRlZCkgewogICAgICByZXR1cm4gY2xzOwogICAgfQogICAgaWYgKF9zdWJ0eXBlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBub2RlLmdldEx1Yk9mSW5zdGFudGlhdGVkU3ViY2xhc3NlcygpOwogICAgfQogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIHN1YnR5cGU7CiAgICBpZiAobm9kZS5pc0luc3RhbnRpYXRlZCkgewogICAgICBzdWJ0eXBlID0gbm9kZTsKICAgIH0KICAgIGZvciAoQ2xhc3NIaWVyYXJjaHlOb2RlIHN1Ym5vZGUgaW4gX3N1YnR5cGVzKSB7CiAgICAgIGlmIChzdWJub2RlLmlzSW5zdGFudGlhdGVkKSB7CiAgICAgICAgaWYgKHN1YnR5cGUgPT0gbnVsbCkgewogICAgICAgICAgc3VidHlwZSA9IHN1Ym5vZGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBjbHM7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoc3VidHlwZSAhPSBudWxsKSB7CiAgICAgIHJldHVybiBzdWJ0eXBlLmdldEx1Yk9mSW5zdGFudGlhdGVkU3ViY2xhc3NlcygpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnW1xuJyk7CiAgICBub2RlLnByaW50T24oc2IsICcgICcpOwogICAgc2Iud3JpdGUoJ1xuJyk7CiAgICBpZiAoX3N1YnR5cGVzICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJyAgc3VidHlwZXM6XG4nKTsKICAgICAgZm9yIChDbGFzc0hpZXJhcmNoeU5vZGUgbm9kZSBpbiBfc3VidHlwZXMpIHsKICAgICAgICBub2RlLnByaW50T24oc2IsICcgICcpOwogICAgICAgIHNiLndyaXRlKCdcbicpOwogICAgICB9CiAgICB9CiAgICBpZiAoX21peGluQXBwbGljYXRpb25zICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJyAgbWl4aW4tYXBwbGljYXRpb25zOlxuJyk7CiAgICAgIGZvciAoQ2xhc3NIaWVyYXJjaHlOb2RlIG5vZGUgaW4gX21peGluQXBwbGljYXRpb25zKSB7CiAgICAgICAgbm9kZS5wcmludE9uKHNiLCAnICAnKTsKICAgICAgICBzYi53cml0ZSgnXG4nKTsKICAgICAgfQogICAgfQogICAgc2Iud3JpdGUoJ10nKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQoKLy8vIEl0ZXJhYmxlIGZvciBzdWJjbGFzc2VzIG9mIGEgW0NsYXNzSGllcmFyY2h5Tm9kZV0uCmNsYXNzIENsYXNzSGllcmFyY2h5Tm9kZUl0ZXJhYmxlIGV4dGVuZHMgSXRlcmFibGVCYXNlPENsYXNzRW50aXR5PiB7CiAgZmluYWwgQ2xhc3NIaWVyYXJjaHlOb2RlIHJvb3Q7CiAgZmluYWwgRW51bVNldDxJbnN0YW50aWF0aW9uPiBtYXNrOwogIGZpbmFsIGJvb2wgaW5jbHVkZVJvb3Q7CgogIENsYXNzSGllcmFyY2h5Tm9kZUl0ZXJhYmxlKHRoaXMucm9vdCwgdGhpcy5tYXNrLCB7dGhpcy5pbmNsdWRlUm9vdDogdHJ1ZX0pIHsKICAgIGlmIChyb290ID09IG51bGwpIHRocm93IG5ldyBTdGF0ZUVycm9yKCJObyByb290IGZvciBpdGVyYWJsZS4iKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhdG9yPENsYXNzRW50aXR5PiBnZXQgaXRlcmF0b3IgewogICAgcmV0dXJuIG5ldyBDbGFzc0hpZXJhcmNoeU5vZGVJdGVyYXRvcih0aGlzKTsKICB9Cn0KCi8vLyBJdGVyYXRvciBmb3Igc3ViY2xhc3NlcyBvZiBhIFtDbGFzc0hpZXJhcmNoeU5vZGVdLgovLy8KLy8vIENsYXNzZXMgYXJlIHJldHVybmVkIGluIHByZS1vcmRlciBERlMgZmFzaGlvbi4KY2xhc3MgQ2xhc3NIaWVyYXJjaHlOb2RlSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxDbGFzc0VudGl0eT4gewogIGZpbmFsIENsYXNzSGllcmFyY2h5Tm9kZUl0ZXJhYmxlIGl0ZXJhYmxlOwoKICAvLy8gVGhlIGNsYXNzIG5vZGUgaG9sZGluZyB0aGUgW2N1cnJlbnRdIGNsYXNzLgogIC8vLwogIC8vLyBUaGlzIGlzIGBudWxsYCBiZWZvcmUgdGhlIGZpcnN0IGNhbGwgdG8gW21vdmVOZXh0XSBhbmQgYXQgdGhlIGVuZCBvZgogIC8vLyBpdGVyYXRpb24sIGkuZS4gYWZ0ZXIgW21vdmVOZXh0XSBoYXMgcmV0dXJuZWQgYGZhbHNlYC4KICBDbGFzc0hpZXJhcmNoeU5vZGUgY3VycmVudE5vZGU7CgogIC8vLyBTdGFjayBvZiBwZW5kaW5nIGNsYXNzIG5vZGVzLgogIC8vLwogIC8vLyBUaGlzIGlzIGBudWxsYCBiZWZvcmUgdGhlIGZpcnN0IGNhbGwgdG8gW21vdmVOZXh0XS4KICBMaXN0PENsYXNzSGllcmFyY2h5Tm9kZT4gc3RhY2s7CgogIENsYXNzSGllcmFyY2h5Tm9kZUl0ZXJhdG9yKHRoaXMuaXRlcmFibGUpOwoKICBDbGFzc0hpZXJhcmNoeU5vZGUgZ2V0IHJvb3QgPT4gaXRlcmFibGUucm9vdDsKCiAgYm9vbCBnZXQgaW5jbHVkZVJvb3QgPT4gaXRlcmFibGUuaW5jbHVkZVJvb3Q7CgogIEVudW1TZXQ8SW5zdGFudGlhdGlvbj4gZ2V0IG1hc2sgPT4gaXRlcmFibGUubWFzazsKCiAgYm9vbCBnZXQgaW5jbHVkZVVuaW5zdGFudGlhdGVkIHsKICAgIHJldHVybiBtYXNrLmNvbnRhaW5zKEluc3RhbnRpYXRpb24uVU5JTlNUQU5USUFURUQpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGN1cnJlbnQgewogICAgcmV0dXJuIGN1cnJlbnROb2RlICE9IG51bGwgPyBjdXJyZW50Tm9kZS5jbHMgOiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmIChzdGFjayA9PSBudWxsKSB7CiAgICAgIC8vIEZpcnN0IGNhbGwgdG8gbW92ZU5leHQKICAgICAgc3RhY2sgPSBbcm9vdF07CiAgICAgIHJldHVybiBfZmluZE5leHQoKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIEluaXRpYWxpemVkIHN0YXRlLgogICAgICBpZiAoY3VycmVudE5vZGUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICByZXR1cm4gX2ZpbmROZXh0KCk7CiAgICB9CiAgfQoKICAvLy8gRmluZCB0aGUgbmV4dCBjbGFzcyB1c2luZyB0aGUgW3N0YWNrXS4KICBib29sIF9maW5kTmV4dCgpIHsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmIChzdGFjay5pc0VtcHR5KSB7CiAgICAgICAgLy8gTm8gbW9yZSBjbGFzc2VzLiBTZXQgW2N1cnJlbnROb2RlXSB0byBgbnVsbGAgdG8gc2lnbmFsIHRoZSBlbmQgb2YKICAgICAgICAvLyBpdGVyYXRpb24uCiAgICAgICAgY3VycmVudE5vZGUgPSBudWxsOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBjdXJyZW50Tm9kZSA9IHN0YWNrLnJlbW92ZUxhc3QoKTsKICAgICAgaWYgKCFpbmNsdWRlVW5pbnN0YW50aWF0ZWQgJiYgIWN1cnJlbnROb2RlLmlzSW5zdGFudGlhdGVkKSB7CiAgICAgICAgLy8gV2UncmUgb25seSBpdGVyYXRpbmcgaW5zdGFudGlhdGVkIGNsYXNzZXMgc28gdGhlcmUgaXMgbm8gdXNlIGluCiAgICAgICAgLy8gdmlzaXRpbmcgdGhlIGN1cnJlbnQgbm9kZSBhbmQgaXRzIHN1YnRyZWUuCiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgLy8gQWRkIGRpcmVjdCBzdWJjbGFzc2VzIGluIHJldmVyc2Ugb3JkZXIgc28gd2lsbCB2aXNpdCB0aGVtIGluIHRoZSBsaXN0CiAgICAgIC8vIG9yZGVyLgogICAgICBmb3IgKGludCBpID0gY3VycmVudE5vZGUuX2RpcmVjdFN1YmNsYXNzZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICBzdGFjay5hZGQoY3VycmVudE5vZGUuX2RpcmVjdFN1YmNsYXNzZXNbaV0pOwogICAgICB9CiAgICAgIGlmIChfaXNWYWxpZChjdXJyZW50Tm9kZSkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogIH0KCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHRoZSBjbGFzcyBvZiBbbm9kZV0gaXMgYSB2YWxpZCByZXN1bHQgZm9yIHRoaXMgaXRlcmF0b3IuCiAgYm9vbCBfaXNWYWxpZChDbGFzc0hpZXJhcmNoeU5vZGUgbm9kZSkgewogICAgaWYgKCFpbmNsdWRlUm9vdCAmJiBub2RlID09IHJvb3QpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBtYXNrLmludGVyc2VjdHMobm9kZS5fbWFzayk7CiAgfQp9CgovLy8gSXRlcmFibGUgZm9yIHRoZSBzdWJ0eXBlcyBpbiBhIFtDbGFzc1NldF0uCmNsYXNzIFN1YnR5cGVzSXRlcmFibGUgZXh0ZW5kcyBJdGVyYWJsZUJhc2U8Q2xhc3NFbnRpdHk+IHsKICBmaW5hbCBDbGFzc1NldCBzdWJ0eXBlU2V0OwogIGZpbmFsIEVudW1TZXQ8SW5zdGFudGlhdGlvbj4gbWFzazsKICBmaW5hbCBib29sIGluY2x1ZGVSb290OwoKICBTdWJ0eXBlc0l0ZXJhYmxlLlN1YnR5cGVzSXRlcmF0b3IodGhpcy5zdWJ0eXBlU2V0LCB0aGlzLm1hc2ssCiAgICAgIHt0aGlzLmluY2x1ZGVSb290OiB0cnVlfSk7CgogIEBvdmVycmlkZQogIEl0ZXJhdG9yPENsYXNzRW50aXR5PiBnZXQgaXRlcmF0b3IgPT4gbmV3IFN1YnR5cGVzSXRlcmF0b3IodGhpcyk7Cn0KCi8vLyBJdGVyYXRvciBmb3IgdGhlIHN1YnR5cGVzIGluIGEgW0NsYXNzU2V0XS4KY2xhc3MgU3VidHlwZXNJdGVyYXRvciBleHRlbmRzIEl0ZXJhdG9yPENsYXNzRW50aXR5PiB7CiAgZmluYWwgU3VidHlwZXNJdGVyYWJsZSBpdGVyYWJsZTsKICBJdGVyYXRvcjxDbGFzc0VudGl0eT4gZWxlbWVudHM7CiAgSXRlcmF0b3I8Q2xhc3NIaWVyYXJjaHlOb2RlPiBoaWVyYXJjaHlOb2RlczsKCiAgU3VidHlwZXNJdGVyYXRvcih0aGlzLml0ZXJhYmxlKTsKCiAgYm9vbCBnZXQgaW5jbHVkZVJvb3QgPT4gaXRlcmFibGUuaW5jbHVkZVJvb3Q7CgogIEVudW1TZXQ8SW5zdGFudGlhdGlvbj4gZ2V0IG1hc2sgPT4gaXRlcmFibGUubWFzazsKCiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGN1cnJlbnQgewogICAgaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKICAgICAgcmV0dXJuIGVsZW1lbnRzLmN1cnJlbnQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBpZiAoZWxlbWVudHMgPT0gbnVsbCAmJiBoaWVyYXJjaHlOb2RlcyA9PSBudWxsKSB7CiAgICAgIC8vIEluaXRpYWwgc3RhdGUuIEl0ZXJhdGUgdGhyb3VnaCBzdWJjbGFzc2VzLgogICAgICBlbGVtZW50cyA9IGl0ZXJhYmxlLnN1YnR5cGVTZXQubm9kZQogICAgICAgICAgLnN1YmNsYXNzZXNCeU1hc2sobWFzaywgc3RyaWN0OiAhaW5jbHVkZVJvb3QpCiAgICAgICAgICAuaXRlcmF0b3I7CiAgICB9CiAgICBpZiAoZWxlbWVudHMgIT0gbnVsbCAmJiBlbGVtZW50cy5tb3ZlTmV4dCgpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKGhpZXJhcmNoeU5vZGVzID09IG51bGwpIHsKICAgICAgLy8gU3RhcnQgaXRlcmF0aW5nIHRocm91Z2ggc3VidHlwZXMuCiAgICAgIGhpZXJhcmNoeU5vZGVzID0gaXRlcmFibGUuc3VidHlwZVNldC5fc3VidHlwZXMuaXRlcmF0b3I7CiAgICB9CiAgICB3aGlsZSAoaGllcmFyY2h5Tm9kZXMubW92ZU5leHQoKSkgewogICAgICBlbGVtZW50cyA9IGhpZXJhcmNoeU5vZGVzLmN1cnJlbnQuc3ViY2xhc3Nlc0J5TWFzayhtYXNrKS5pdGVyYXRvcjsKICAgICAgaWYgKGVsZW1lbnRzLm1vdmVOZXh0KCkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KfQoKLy8vIEVudW0gdmFsdWVzIHJldHVybmVkIGZyb20gdGhlIFtGb3JFYWNoRnVuY3Rpb25dIHByb3ZpZGVkIHRvIHRoZSBgZm9yRWFjaFhgCi8vLyBmdW5jdGlvbnMgb2YgW0NsYXNzSGllcmFyY2h5Tm9kZV0gYW5kIFtDbGFzc1NldF0uIFRoZSB2YWx1ZSBpcyB1c2VkIHRvCi8vLyBjb250cm9sIHRoZSBjb250aW51ZWQgaXRlcmF0aW9uLgplbnVtIEl0ZXJhdGlvblN0ZXAgewogIC8vLyBJdGVyYXRpb24gY29udGludWVzLgogIENPTlRJTlVFLAoKICAvLy8gSXRlcmF0aW9uIHN0b3BzIGltbWVkaWF0ZWx5LgogIFNUT1AsCgogIC8vLyBJdGVyYXRpb24gc2tpcHMgdGhlIHN1YmNsYXNzZXMgb2YgdGhlIGN1cnJlbnQgY2xhc3MuCiAgU0tJUF9TVUJDTEFTU0VTLAp9CgovLy8gVmlzaXRpbmcgZnVuY3Rpb24gdXNlZCBmb3IgdGhlIGBmb3JFYWNoWGAgZnVuY3Rpb25zIG9mIFtDbGFzc0hpZXJhcmNoeU5vZGVdCi8vLyBhbmQgW0NsYXNzU2V0XS4gVGhlIHJldHVybiB2YWx1ZSBjb250cm9scyB0aGUgY29udGludWVkIGl0ZXJhdGlvbi4gSWYgYG51bGxgCi8vLyBpcyByZXR1cm5lZCwgaXRlcmF0aW9uIGNvbnRpbnVlcyB0byB0aGUgZW5kLgp0eXBlZGVmIEl0ZXJhdGlvblN0ZXAgRm9yRWFjaEZ1bmN0aW9uKENsYXNzRW50aXR5IGNscyk7CgovLy8gU2luZ2xldG9uIG1hcCBpbXBsZW1lbnRlZCBhcyBhIGZpZWxkIG9uIHRoZSBrZXkuCmNsYXNzIENsYXNzSGllcmFyY2h5Tm9kZXNNYXAgZXh0ZW5kcyBNYXBCYXNlPENsYXNzRW50aXR5LCBDbGFzc0hpZXJhcmNoeU5vZGU+IHsKICBAb3ZlcnJpZGUKICBDbGFzc0hpZXJhcmNoeU5vZGUgb3BlcmF0b3IgW10oT2JqZWN0IGNscykgewogICAgLy8gVE9ETyhzcmEpOiBDaGFuZ2UgdGhlIGtleSB0eXBlIHRvIGBjb3ZhcmlhbnQgQ2xhc3NIaWVyYXJjaHlOb2Rlc01hcEtleWAuCiAgICBpZiAoY2xzIGlzIENsYXNzSGllcmFyY2h5Tm9kZXNNYXBLZXkpIHsKICAgICAgcmV0dXJuIGNscy5fY2xhc3NIaWVyYXJjaHlOb2RlOwogICAgfQogICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcignQ2xhc3NIaWVyYXJjaHlOb2Rlc01hcCBmb3IgJGNscycpOwogIH0KCiAgQG92ZXJyaWRlCiAgb3BlcmF0b3IgW109KE9iamVjdCBjbHMsIENsYXNzSGllcmFyY2h5Tm9kZSBub2RlKSB7CiAgICAvLyBUT0RPKHNyYSk6IENoYW5nZSB0aGUga2V5IHR5cGUgdG8gYGNvdmFyaWFudCBDbGFzc0hpZXJhcmNoeU5vZGVzTWFwS2V5YC4KICAgIGlmIChjbHMgaXMgQ2xhc3NIaWVyYXJjaHlOb2Rlc01hcEtleSkgewogICAgICBjbHMuX2NsYXNzSGllcmFyY2h5Tm9kZSA9IG5vZGU7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoJ0NsYXNzSGllcmFyY2h5Tm9kZXNNYXAgZm9yICRjbHMnKTsKICB9Cgog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Z2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgcmV3cml0ZV9hc3luYzsKCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKaW1wb3J0ICdkYXJ0Om1hdGgnIHNob3cgbWF4OwoKaW1wb3J0ICdwYWNrYWdlOmpzX3J1bnRpbWUvc2hhcmVkL2FzeW5jX2F3YWl0X2Vycm9yX2NvZGVzLmRhcnQnIGFzIGVycm9yX2NvZGVzOwoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vaW8vc291cmNlX2luZm9ybWF0aW9uLmRhcnQnIHNob3cgU291cmNlSW5mb3JtYXRpb247CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnIHNob3cgUGFpcjsKaW1wb3J0ICdqcy5kYXJ0JyBhcyBqczsKCi8vLyBSZXdyaXRlcyBhIFtqcy5GdW5dIHdpdGggYXN5bmMvc3luYyovYXN5bmMqIGZ1bmN0aW9ucyBhbmQgYXdhaXQgYW5kIHlpZWxkCi8vLyAod2l0aCBkYXJ0LWxpa2Ugc2VtYW50aWNzKSB0byBhbiBlcXVpdmFsZW50IGZ1bmN0aW9uIHdpdGhvdXQgdGhlc2UuCi8vLyBhd2FpdC1mb3IgaXMgbm90IGhhbmRsZWQgYW5kIG11c3QgYmUgcmV3cml0dGVuIGJlZm9yZS4gKEN1cnJlbnRseSBoYW5kbGVkCi8vLyBpbiBzc2EvYnVpbGRlci5kYXJ0KS4KLy8vCi8vLyBXaGVuIGdlbmVyYXRpbmcgdGhlIGlucHV0IHRvIHRoaXMsIHNwZWNpYWwgY2FyZSBtdXN0IGJlIHRha2VuIHRoYXQKLy8vIHBhcmFtZXRlcnMgdG8gc3luYyogZnVuY3Rpb25zIHRoYXQgYXJlIG11dGF0ZWQgaW4gdGhlIGJvZHkgbXVzdCBiZSBib3hlZC4KLy8vIChDdXJyZW50bHkgaGFuZGxlZCBpbiBjbG9zdXJlLmRhcnQpLgovLy8KLy8vIExvb2sgYXQgW3Jld3JpdGVGdW5jdGlvbl0sIFt2aXNpdERhcnRZaWVsZF0gYW5kIFt2aXNpdEF3YWl0XSBmb3IgbW9yZQovLy8gZXhwbGFuYXRpb24uCmFic3RyYWN0IGNsYXNzIEFzeW5jUmV3cml0ZXJCYXNlIGV4dGVuZHMganMuTm9kZVZpc2l0b3IgewogIC8vIExvY2FsIHZhcmlhYmxlcyBhcmUgaG9pc3RlZCB0byB0aGUgdG9wIG9mIHRoZSBmdW5jdGlvbiwgc28gdGhleSBhcmUKICAvLyBjb2xsZWN0ZWQgaGVyZS4KICBMaXN0PGpzLlZhcmlhYmxlRGVjbGFyYXRpb24+IGxvY2FsVmFyaWFibGVzID0gPGpzLlZhcmlhYmxlRGVjbGFyYXRpb24+W107CgogIE1hcDxqcy5Ob2RlLCBpbnQ+IGNvbnRpbnVlTGFiZWxzID0gbmV3IE1hcDxqcy5Ob2RlLCBpbnQ+KCk7CiAgTWFwPGpzLk5vZGUsIGludD4gYnJlYWtMYWJlbHMgPSBuZXcgTWFwPGpzLk5vZGUsIGludD4oKTsKCiAgLy8vIFRoZSBsYWJlbCBvZiBhIGZpbmFsbHkgcGFydC4KICBNYXA8anMuQmxvY2ssIGludD4gZmluYWxseUxhYmVscyA9IG5ldyBNYXA8anMuQmxvY2ssIGludD4oKTsKCiAgLy8vIFRoZSBsYWJlbCBvZiB0aGUgY2F0Y2ggaGFuZGxlciBvZiBhIFtqcy5UcnldIG9yIGEgW2pzLkZ1bl0gb3IgW2pzLkNhdGNoXS4KICAvLy8KICAvLy8gVGhlc2UgbWFyayB0aGUgcG9pbnRzIGFuIGVycm9yIGNhbiBiZSBjb25zdW1lZC4KICAvLy8KICAvLy8gLSBUaGUgaGFuZGxlciBvZiBhIFtqcy5GdW5dIGlzIHRoZSBvdXRlcm1vc3QgYW5kIHdpbGwgcmV0aHJvdyB0aGUgZXJyb3IuCiAgLy8vIC0gVGhlIGhhbmRsZXIgb2YgYSBbanMuVHJ5XSB3aWxsIHJ1biB0aGUgY2F0Y2ggaGFuZGxlci4KICAvLy8gLSBUaGUgaGFuZGxlciBvZiBhIFtqcy5DYXRjaF0gaXMgYSBzeW50aGV0aWMgaGFuZGxlciB0aGF0IGVuc3VyZXMgdGhlCiAgLy8vICAgcmlnaHQgZmluYWxseSBibG9ja3MgYXJlIHJ1biBpZiBhbiBlcnJvciBpcyB0aHJvd24gaW5zaWRlIGEKICAvLy8gICBjYXRjaC1oYW5kbGVyLgogIE1hcDxqcy5Ob2RlLCBpbnQ+IGhhbmRsZXJMYWJlbHMgPSBuZXcgTWFwPGpzLk5vZGUsIGludD4oKTsKCiAgaW50IGV4aXRMYWJlbDsKICBpbnQgcmV0aHJvd0xhYmVsOwoKICAvLy8gQSBzdGFjayBvZiBhbGwgKHN1cnJvdW5kaW5nKSBqdW1wIHRhcmdldHMuCiAgLy8vCiAgLy8vIEp1bXAgdGFyZ2V0cyBhcmU6CiAgLy8vCiAgLy8vICogVGhlIGZ1bmN0aW9uLCBzaWduYWxsaW5nIGEgcmV0dXJuIG9yIHVuY2F1Z2h0IHRocm93LgogIC8vLyAqIExvb3BzLgogIC8vLyAqIExhYmVsZWRTdGF0ZW1lbnRzIChhbHNvIHVzZWQgZm9yICdjb250aW51ZScgd2hlbiBhdHRhY2hlZCB0byBsb29wcykuCiAgLy8vICogVHJ5IHN0YXRlbWVudHMsIGZvciBjYXRjaCBhbmQgZmluYWxseSBoYW5kbGVycy4KICAvLy8gKiBDYXRjaCBoYW5kbGVycywgd2hlbiBpbnNpZGUgYSBjYXRjaC1wYXJ0IG9mIGEgdHJ5LCB0aGUgY2F0Y2gtaGFuZGxlciBpcwogIC8vLyAgIHVzZWQgdG8gYXNzb2NpYXRlIHdpdGggYSBzeW50aGV0aWMgaGFuZGxlciB0aGF0IHdpbGwgZW5zdXJlIHRoZSByaWdodAogIC8vLyAgIGZpbmFsbHkgYmxvY2tzIGFyZSB2aXNpdGVkLgogIC8vLwogIC8vLyBXaGVuIGp1bXBpbmcgdG8gYSB0YXJnZXQgaXQgaXMgbmVjZXNzYXJ5IHRvIHZpc2l0IGFsbCBmaW5hbGxpZXMgdGhhdAogIC8vLyBhcmUgb24gdGhlIHdheSB0byB0YXJnZXQgKGkuZS4gbW9yZSBuZXN0ZWQgdGhhbiB0aGUganVtcCB0YXJnZXQpLgogIExpc3Q8anMuTm9kZT4ganVtcFRhcmdldHMgPSA8anMuTm9kZT5bXTsKCiAgTGlzdDxpbnQ+IGNvbnRpbnVlU3RhY2sgPSA8aW50PltdOwogIExpc3Q8aW50PiBicmVha1N0YWNrID0gPGludD5bXTsKICBMaXN0PGludD4gcmV0dXJuU3RhY2sgPSA8aW50PltdOwoKICBMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiB2YXJpYWJsZVJlbmFtaW5ncyA9IDxQYWlyPFN0cmluZywgU3RyaW5nPj5bXTsKCiAgUHJlVHJhbnNsYXRpb25BbmFseXNpcyBhbmFseXNpczsKCiAgZmluYWwgRnVuY3Rpb24gc2FmZVZhcmlhYmxlTmFtZTsKCiAgLy8gQWxsIHRoZSA8eD5OYW1lIHZhcmlhYmxlcyBhcmUgbmFtZXMgb2YgSmF2YXNjcmlwdCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUKICAvLyB0cmFuc2Zvcm1lZCBjb2RlLgoKICAvLy8gQ29udGFpbnMgdGhlIHJlc3VsdCBvZiBhbiBhd2FpdGVkIGV4cHJlc3Npb24sIG9yIGEgY29uZGl0aW9uYWwgb3IKICAvLy8gbGF6eSBib29sZWFuIG9wZXJhdG9yLgogIC8vLwogIC8vLyBGb3IgZXhhbXBsZSBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaXMgcm91Z2hseSB0cmFuc2xhdGVkIGxpa2U6CiAgLy8vIFtbY29uZCA/IGEgOiBiXV0KICAvLy8KICAvLy8gQmVjb21lczoKICAvLy8KICAvLy8gd2hpbGUgdHJ1ZSB7IC8vIG91dGVyIHdoaWxlIGxvb3AKICAvLy8gICBzd2l0Y2ggKGdvdG8pIHsgLy8gU2ltdWxhdGVzIGdvdG8KICAvLy8gICAgIC4uLgogIC8vLyAgICAgICBnb3RvID0gW1tjb25kXV0gPyB0aGVuTGFiZWwgOiBlbHNlTGFiZWwKICAvLy8gICAgICAgYnJlYWs7CiAgLy8vICAgICBjYXNlIHRoZW5MYWJlbDoKICAvLy8gICAgICAgcmVzdWx0ID0gW1thXV07CiAgLy8vICAgICAgIGdvdG8gPSBqb2luTGFiZWw7CiAgLy8vICAgICBjYXNlIGVsc2VMYWJlbDoKICAvLy8gICAgICAgcmVzdWx0ID0gW1tiXV07CiAgLy8vICAgICBjYXNlIGpvaW5MYWJlbDoKICAvLy8gICAgICAgLy8gTm93IHRoZSByZXN1bHQgb2YgY29tcHV0aW5nIHRoZSBjb25kaXRpb24gaXMgaW4gcmVzdWx0LgogIC8vLyAgICAgLi4uLgogIC8vLyAgIH0KICAvLy8gfQogIC8vLwogIC8vLyBJdCBpcyBhIHBhcmFtZXRlciB0byB0aGUgW2JvZHldIGZ1bmN0aW9uLCBzbyB0aGF0IFthd2FpdFN0YXRlbWVudF0gY2FuCiAgLy8vIGNhbGwgW2JvZHldIHdpdGggdGhlIHJlc3VsdCBvZiBhbiBhd2FpdGVkIEZ1dHVyZS4KICBqcy5WYXJpYWJsZVVzZSBnZXQgcmVzdWx0ID0+IG5ldyBqcy5WYXJpYWJsZVVzZShyZXN1bHROYW1lKTsKICBTdHJpbmcgcmVzdWx0TmFtZTsKCiAgLy8vIEEgcGFyYW1ldGVyIHRvIHRoZSBbYm9keU5hbWVdIGZ1bmN0aW9uLiBJbmRpY2F0aW5nIGlmIHdlIGFyZSBpbiBzdWNjZXNzCiAgLy8vIG9yIGVycm9yIGNhc2UuCiAgU3RyaW5nIGVycm9yQ29kZU5hbWU7CgogIC8vLyBUaGUgaW5uZXIgZnVuY3Rpb24gdGhhdCBpcyBzY2hlZHVsZWQgdG8gZG8gZWFjaCBhd2FpdC95aWVsZCwKICAvLy8gYW5kIGNhbGxlZCB0byBkbyBhIG5ldyBpdGVyYXRpb24gZm9yIHN5bmMqLgogIGpzLk5hbWUgYm9keU5hbWU7CgogIC8vLyBVc2VkIHRvIHNpbXVsYXRlIGEgZ290by4KICAvLy8KICAvLy8gVG8gImdvdG8iIGEgbGFiZWwsIHRoZSBsYWJlbCBpcyBhc3NpZ25lZCB0byB0aGlzIHZhcmlhYmxlLCBhbmQgYnJlYWsgb3V0CiAgLy8vIG9mIHRoZSBzd2l0Y2ggdG8gdGFrZSBhbm90aGVyIGl0ZXJhdGlvbiBpbiB0aGUgd2hpbGUgbG9vcC4gU2VlIFthZGRHb3RvXQogIGpzLlZhcmlhYmxlVXNlIGdldCBnb3RvID0+IG5ldyBqcy5WYXJpYWJsZVVzZShnb3RvTmFtZSk7CiAgU3RyaW5nIGdvdG9OYW1lOwoKICAvLy8gVmFyaWFibGUgY29udGFpbmluZyB0aGUgbGFiZWwgb2YgdGhlIGN1cnJlbnQgZXJyb3IgaGFuZGxlci4KICBqcy5WYXJpYWJsZVVzZSBnZXQgaGFuZGxlciA9PiBuZXcganMuVmFyaWFibGVVc2UoaGFuZGxlck5hbWUpOwogIFN0cmluZyBoYW5kbGVyTmFtZTsKCiAgLy8vIFNldCB0byBgdHJ1ZWAgaWYgYW55IG9mIHRoZSBzd2l0Y2ggc3RhdGVtZW50IGxhYmVscyBpcyBhIGhhbmRsZXIuIEF0IHRoZQogIC8vLyBlbmQgb2YgcmV3cml0aW5nIHRoaXMgaXMgdXNlZCB0byBzZWUgaWYgYSBzaG9ydGVyIGZvcm0gb2YgZXJyb3IgaGFuZGxpbmcKICAvLy8gY2FuIGJlIHVzZWQuIFRoZSBzaG9ydGVyIGZvcm0gY291bGQgYmUgYSBjaGFuZ2UgaW4gdGhlIG1ldGhvZCBib2lsZXJwbGF0ZSwKICAvLy8gaW4gdGhlIHN0YXRlIG1hY2hpbmUgd3JhcHBlciwgb3Igbm90IGltcGxlbWVudGVkLiBbYWRkRXJyb3JFeGl0XSBjYW4gdGVzdAogIC8vLyB0aGlzIHRvIGVsaWRlIHRoZSBlcnJvciBleGl0IGhhbmRsZXIgd2hlbiB0aGVyZSBhcmUgbm8gb3RoZXIgaGFuZGxlcnMsIG9yCiAgLy8vIHNldCBpdCB0byBgdHJ1ZWAgaWYgdGhlcmUgaXMgbm8gc2hvcnRlciBmb3JtLgogIGJvb2wgaGFzSGFuZGxlckxhYmVscyA9IGZhbHNlOwoKICAvLy8gQSBzdGFjayBvZiBsYWJlbHMgb2YgZmluYWxseSBibG9ja3MgdG8gdmlzaXQsIGFuZCB0aGUgbGFiZWwgdG8gZ28gdG8gYWZ0ZXIKICAvLy8gdGhlIGxhc3QuCiAganMuVmFyaWFibGVVc2UgZ2V0IG5leHQgPT4gbmV3IGpzLlZhcmlhYmxlVXNlKG5leHROYW1lKTsKICBTdHJpbmcgbmV4dE5hbWU7CgogIC8vLyBUaGUgY3VycmVudCByZXR1cm5lZCB2YWx1ZSAoYSBmaW5hbGx5IGJsb2NrIG1heSBvdmVyd3JpdGUgaXQpLgogIGpzLlZhcmlhYmxlVXNlIGdldCByZXR1cm5WYWx1ZSA9PiBuZXcganMuVmFyaWFibGVVc2UocmV0dXJuVmFsdWVOYW1lKTsKICBTdHJpbmcgcmV0dXJuVmFsdWVOYW1lOwoKICAvLy8gU3RvcmVzIHRoZSBjdXJyZW50IGVycm9yIHdoZW4gd2UgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGhhbmRsaW5nIGFuIGVycm9yLgogIGpzLlZhcmlhYmxlVXNlIGdldCBjdXJyZW50RXJyb3IgPT4gbmV3IGpzLlZhcmlhYmxlVXNlKGN1cnJlbnRFcnJvck5hbWUpOwogIFN0cmluZyBjdXJyZW50RXJyb3JOYW1lOwoKICAvLy8gVGhlIGxhYmVsIG9mIHRoZSBvdXRlciBsb29wLgogIC8vLwogIC8vLyBVc2VkIGlmIHRoZXJlIGFyZSB1bnRyYW5zZm9ybWVkIGxvb3BzIGNvbnRhaW5pbmcgYnJlYWsgb3IgY29udGludWVzIHRvCiAgLy8vIHRhcmdldHMgb3V0c2lkZSB0aGUgbG9vcC4KICBTdHJpbmcgb3V0ZXJMYWJlbE5hbWU7CgogIC8vLyBJZiBqYXZhc2NyaXB0IGB0aGlzYCBpcyB1c2VkLCBpdCBpcyBhY2Nlc3NlZCB2aWEgdGhpcyB2YXJpYWJsZSwgaW4gdGhlCiAgLy8vIFtib2R5TmFtZV0gZnVuY3Rpb24uCiAganMuVmFyaWFibGVVc2UgZ2V0IHNlbGYgPT4gbmV3IGpzLlZhcmlhYmxlVXNlKHNlbGZOYW1lKTsKICBTdHJpbmcgc2VsZk5hbWU7CgogIC8vLyBUaGUgcmV3cml0dGVuIGNvZGUgY2FuIHRha2UgdHlwZSBhcmd1bWVudHMuIFRoZXNlIGFyZSBhZGRlZCBpZiBuZWVkZWQuCiAgTGlzdDxTdHJpbmc+IHR5cGVBcmd1bWVudE5hbWVzID0gPFN0cmluZz5bXTsKCiAgZmluYWwgRGlhZ25vc3RpY1JlcG9ydGVyIHJlcG9ydGVyOwogIC8vIEZvciBlcnJvciByZXBvcnRpbmcgb25seS4KICBTcGFubmFibGUgZ2V0IHNwYW5uYWJsZSB7CiAgICByZXR1cm4gKF9zcGFubmFibGUgPT0gbnVsbCkgPyBOT19MT0NBVElPTl9TUEFOTkFCTEUgOiBfc3Bhbm5hYmxlOwogIH0KCiAgU3Bhbm5hYmxlIF9zcGFubmFibGU7CgogIGludCBfY3VycmVudExhYmVsID0gMDsKCiAgLy8gVGhlIGhpZ2hlc3QgdGVtcG9yYXJ5IHZhcmlhYmxlIGluZGV4IGN1cnJlbnRseSBpbiB1c2UuCiAgaW50IGN1cnJlbnRUZW1wVmFySW5kZXggPSAwOwogIC8vIFRoZSBoaWdoZXN0IHRlbXBvcmFyeSB2YXJpYWJsZSBpbmRleCBldmVyIGluIHVzZSBpbiB0aGlzIGZ1bmN0aW9uLgogIGludCB0ZW1wVmFySGlnaFdhdGVyTWFyayA9IDA7CiAgTWFwPGludCwganMuRXhwcmVzc2lvbj4gdGVtcFZhck5hbWVzID0gbmV3IE1hcDxpbnQsIGpzLkV4cHJlc3Npb24+KCk7CgogIGJvb2wgZ2V0IGlzQXN5bmMgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNTeW5jU3RhciA9PiBmYWxzZTsKICBib29sIGdldCBpc0FzeW5jU3RhciA9PiBmYWxzZTsKCiAgQXN5bmNSZXdyaXRlckJhc2UoCiAgICAgIHRoaXMucmVwb3J0ZXIsIHRoaXMuX3NwYW5uYWJsZSwgdGhpcy5zYWZlVmFyaWFibGVOYW1lLCB0aGlzLmJvZHlOYW1lKTsKCiAgLy8vIEluaXRpYWxpemUgbmFtZXMgdXNlZCBieSB0aGUgc3ViQ2xhc3MuCiAgdm9pZCBpbml0aWFsaXplTmFtZXMoKTsKCiAgLy8vIE1haW4gZW50cnkgcG9pbnQuCiAgLy8vIFJld3JpdGVzIGEgc3luYyovYXN5bmMvYXN5bmMqIGZ1bmN0aW9uIHRvIGFuIGVxdWl2YWxlbnQgbm9ybWFsIGZ1bmN0aW9uLgogIC8vLwogIC8vLyBbc3Bhbm5hYmxlXSBjYW4gYmUgcGFzc2VkIHRvIGhhdmUgYSBsb2NhdGlvbiBmb3IgZXJyb3IgbWVzc2FnZXMuCiAganMuRnVuIHJld3JpdGUoanMuRnVuIG5vZGUsIFNvdXJjZUluZm9ybWF0aW9uIGJvZHlTb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgU291cmNlSW5mb3JtYXRpb24gZXhpdFNvdXJjZUluZm9ybWF0aW9uLAogICAgICBbU3Bhbm5hYmxlIHNwYW5uYWJsZV0pIHsKICAgIF9zcGFubmFibGUgPSBzcGFubmFibGU7CgogICAgYW5hbHlzaXMgPSBuZXcgUHJlVHJhbnNsYXRpb25BbmFseXNpcyh1bnN1cHBvcnRlZCk7CiAgICBhbmFseXNpcy5hbmFseXplKG5vZGUpOwoKICAgIC8vIFRvIGF2b2lkIG5hbWUgY29sbGlzaW9ucyB3aXRoIGV4aXN0aW5nIG5hbWVzLCB0aGUgZnJlc2ggbmFtZXMgYXJlCiAgICAvLyBnZW5lcmF0ZWQgYWZ0ZXIgdGhlIGFuYWx5c2lzLgogICAgcmVzdWx0TmFtZSA9IGZyZXNoTmFtZSgicmVzdWx0Iik7CiAgICBlcnJvckNvZGVOYW1lID0gZnJlc2hOYW1lKCJlcnJvckNvZGUiKTsKICAgIGdvdG9OYW1lID0gZnJlc2hOYW1lKCJnb3RvIik7CiAgICBoYW5kbGVyTmFtZSA9IGZyZXNoTmFtZSgiaGFuZGxlciIpOwogICAgbmV4dE5hbWUgPSBmcmVzaE5hbWUoIm5leHQiKTsKICAgIHJldHVyblZhbHVlTmFtZSA9IGZyZXNoTmFtZSgicmV0dXJuVmFsdWUiKTsKICAgIGN1cnJlbnRFcnJvck5hbWUgPSBmcmVzaE5hbWUoImN1cnJlbnRFcnJvciIpOwogICAgb3V0ZXJMYWJlbE5hbWUgPSBmcmVzaE5hbWUoIm91dGVyIik7CiAgICBzZWxmTmFtZSA9IGZyZXNoTmFtZSgic2VsZiIpOwogICAgLy8gSW5pdGlhbGl6ZSBuYW1lcyBzcGVjaWZpYyB0byB0aGUgc3ViY2xhc3MuCiAgICBpbml0aWFsaXplTmFtZXMoKTsKCiAgICByZXR1cm4gcmV3cml0ZUZ1bmN0aW9uKG5vZGUsIGJvZHlTb3VyY2VJbmZvcm1hdGlvbiwgZXhpdFNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIGpzLkV4cHJlc3Npb24gZ2V0IGN1cnJlbnRFcnJvckhhbmRsZXIgewogICAgcmV0dXJuIGpzLm51bWJlcihoYW5kbGVyTGFiZWxzWwogICAgICAgIGp1bXBUYXJnZXRzLmxhc3RXaGVyZSgobm9kZSkgPT4gaGFuZGxlckxhYmVsc1tub2RlXSAhPSBudWxsKV0pOwogIH0KCiAgaW50IGFsbG9jYXRlVGVtcFZhcigpIHsKICAgIGFzc2VydCh0ZW1wVmFySGlnaFdhdGVyTWFyayA+PSBjdXJyZW50VGVtcFZhckluZGV4KTsKICAgIGN1cnJlbnRUZW1wVmFySW5kZXgrKzsKICAgIHRlbXBWYXJIaWdoV2F0ZXJNYXJrID0gbWF4KGN1cnJlbnRUZW1wVmFySW5kZXgsIHRlbXBWYXJIaWdoV2F0ZXJNYXJrKTsKICAgIHJldHVybiBjdXJyZW50VGVtcFZhckluZGV4OwogIH0KCiAganMuVmFyaWFibGVVc2UgdXNlVGVtcFZhcihpbnQgaSkgewogICAgcmV0dXJuIHRlbXBWYXJOYW1lcy5wdXRJZkFic2VudCgKICAgICAgICBpLCAoKSA9PiBuZXcganMuVmFyaWFibGVVc2UoZnJlc2hOYW1lKCJ0ZW1wJGkiKSkpOwogIH0KCiAgLy8vIEdlbmVyYXRlcyBhIHZhcmlhYmxlIG5hbWUgd2l0aCBbc2FmZVZhcmlhYmxlTmFtZV0gYmFzZWQgb24gW29yaWdpbmFsTmFtZV0KICAvLy8gd2l0aCBhIHN1ZmZpeCB0byBndWFyYW50ZWUgaXQgZG9lcyBub3QgY29sbGlkZSB3aXRoIGFscmVhZHkgdXNlZCBuYW1lcy4KICBTdHJpbmcgZnJlc2hOYW1lKFN0cmluZyBvcmlnaW5hbE5hbWUpIHsKICAgIFN0cmluZyBzYWZlTmFtZSA9IHNhZmVWYXJpYWJsZU5hbWUob3JpZ2luYWxOYW1lKTsKICAgIFN0cmluZyByZXN1bHQgPSBzYWZlTmFtZTsKICAgIGludCBjb3VudGVyID0gMTsKICAgIHdoaWxlIChhbmFseXNpcy51c2VkTmFtZXMuY29udGFpbnMocmVzdWx0KSkgewogICAgICByZXN1bHQgPSAiJHNhZmVOYW1lJGNvdW50ZXIiOwogICAgICArK2NvdW50ZXI7CiAgICB9CiAgICBhbmFseXNpcy51c2VkTmFtZXMuYWRkKHJlc3VsdCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgTGlzdDxqcy5FeHByZXNzaW9uPiBwcm9jZXNzVHlwZUFyZ3VtZW50cyhMaXN0PGpzLkV4cHJlc3Npb24+IHR5cGVzKSB7CiAgICBpZiAodHlwZXMgPT0gbnVsbCkgewogICAgICBTdHJpbmcgbmFtZSA9IGZyZXNoTmFtZSgndHlwZScpOwogICAgICB0eXBlQXJndW1lbnROYW1lcy5hZGQobmFtZSk7CiAgICAgIHJldHVybiA8anMuRXhwcmVzc2lvbj5bbmV3IGpzLlZhcmlhYmxlVXNlKG5hbWUpXTsKICAgIH0KICAgIHJldHVybiB0eXBlczsKICB9CgogIC8vLyBBbGwgdGhlIHBpZWNlcyBhcmUgY29sbGVjdGVkIGluIHRoaXMgbWFwLCB0byBjcmVhdGUgYSBzd2l0Y2ggd2l0aCBhIGNhc2UKICAvLy8gZm9yIGVhY2ggbGFiZWwuCiAgLy8vCiAgLy8vIFRoZSBvcmRlciBpcyBpbXBvcnRhbnQsIHRoZXJlZm9yZSB0aGUgdHlwZSBpcyBleHBsaWNpdGx5IExpbmtlZEhhc2hNYXAuCiAgTGlua2VkSGFzaE1hcDxpbnQsIExpc3Q8anMuU3RhdGVtZW50Pj4gbGFiZWxsZWRQYXJ0cyA9CiAgICAgIG5ldyBMaW5rZWRIYXNoTWFwPGludCwgTGlzdDxqcy5TdGF0ZW1lbnQ+PigpOwoKICAvLy8gRGVzY3JpcHRpb24gb2YgZWFjaCBsYWJlbCBmb3IgcmVhZGFiaWxpdHkgb2YgdGhlIG5vbi1taW5pZmllZCBvdXRwdXQuCiAgTWFwPGludCwgU3RyaW5nPiBsYWJlbENvbW1lbnRzID0gbmV3IE1hcDxpbnQsIFN0cmluZz4oKTsKCiAgLy8vIFRydWUgaWYgdGhlIGZ1bmN0aW9uIGhhcyBhbnkgdHJ5IGJsb2NrcyBjb250YWluaW5nIGF3YWl0LgogIGJvb2wgaGFzVHJ5QmxvY2tzID0gZmFsc2U7CgogIC8vLyBUcnVlIGlmIHRoZSB0cmF2ZXJzaW9uIGN1cnJlbnRseSBpcyBpbnNpZGUgYSBsb29wIG9yIHN3aXRjaCBmb3Igd2hpY2gKICAvLy8gW3Nob3VsZFRyYW5zZm9ybV0gaXMgZmFsc2UuCiAgYm9vbCBpbnNpZGVVbnRyYW5zbGF0ZWRCcmVha2FibGUgPSBmYWxzZTsKCiAgLy8vIFRydWUgaWYgYSBsYWJlbCBpcyB1c2VkIHRvIGJyZWFrIHRvIGFuIG91dGVyIHN3aXRjaC1zdGF0ZW1lbnQuCiAgYm9vbCBoYXNKdW1wVGhvdWdoT3V0ZXJMYWJlbCA9IGZhbHNlOwoKICAvLy8gVHJ1ZSBpZiB0aGVyZSBpcyBhIGNhdGNoLWhhbmRsZXIgcHJvdGVjdGVkIGJ5IGEgZmluYWxseSB3aXRoIG5vIGVuY2xvc2luZwogIC8vLyBjYXRjaC1oYW5kbGVycy4KICBib29sIG5lZWRzUmV0aHJvdyA9IGZhbHNlOwoKICAvLy8gQnVmZmVyIGZvciBjb2xsZWN0aW5nIHRyYW5zbGF0ZWQgc3RhdGVtZW50cyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgc3dpdGNoCiAgLy8vIGNhc2UuCiAgTGlzdDxqcy5TdGF0ZW1lbnQ+IGN1cnJlbnRTdGF0ZW1lbnRCdWZmZXI7CgogIC8vIExhYmVscyB3aWxsIGJlY29tZSBjYXNlcyBpbiB0aGUgYmlnIHN3aXRjaCBleHByZXNzaW9uLCBhbmQgYGdvdG8gbGFiZWxgCiAgLy8gaXMgZXhwcmVzc2VkIGJ5IGFzc2lnbmluZyB0byB0aGUgc3dpdGNoIGtleSBbZ290b05hbWVdIGFuZCBicmVha2luZyBvdXQgb2YKICAvLyB0aGUgc3dpdGNoLgoKICBpbnQgbmV3TGFiZWwoW1N0cmluZyBjb21tZW50XSkgewogICAgaW50IHJlc3VsdCA9IF9jdXJyZW50TGFiZWw7CiAgICBfY3VycmVudExhYmVsKys7CiAgICBpZiAoY29tbWVudCAhPSBudWxsKSB7CiAgICAgIGxhYmVsQ29tbWVudHNbcmVzdWx0XSA9IGNvbW1lbnQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIEJlZ2lucyBvdXRwdXR0aW5nIHN0YXRlbWVudHMgdG8gYSBuZXcgYnVmZmVyIHdpdGggbGFiZWwgW2xhYmVsXS4KICAvLy8KICAvLy8gRWFjaCBidWZmZXIgZW5kcyB1cCBhcyBpdHMgb3duIGNhc2UgcGFydCBpbiB0aGUgYmlnIHN0YXRlLXN3aXRjaC4KICB2b2lkIGJlZ2luTGFiZWwoaW50IGxhYmVsKSB7CiAgICBhc3NlcnQoIWxhYmVsbGVkUGFydHMuY29udGFpbnNLZXkobGFiZWwpKTsKICAgIGN1cnJlbnRTdGF0ZW1lbnRCdWZmZXIgPSA8anMuU3RhdGVtZW50PltdOwogICAgbGFiZWxsZWRQYXJ0c1tsYWJlbF0gPSBjdXJyZW50U3RhdGVtZW50QnVmZmVyOwogICAgYWRkU3RhdGVtZW50KG5ldyBqcy5Db21tZW50KGxhYmVsQ29tbWVudHNbbGFiZWxdKSk7CiAgfQoKICAvLy8gUmV0dXJucyBhIHN0YXRlbWVudCBhc3NpZ25pbmcgdG8gdGhlIHZhcmlhYmxlIG5hbWVkIFtnb3RvTmFtZV0uCiAgLy8vIFRoaXMgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGEgYnJlYWsgZm9yIHRoZSBnb3RvIHRvIGJlIGV4ZWN1dGVkLiBVc2UKICAvLy8gW2dvdG9XaXRoQnJlYWtdIG9yIFthZGRHb3RvXSBmb3IgdGhpcy4KICBqcy5TdGF0ZW1lbnQgc2V0R290b1ZhcmlhYmxlKGludCBsYWJlbCwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIHJldHVybiBuZXcganMuRXhwcmVzc2lvblN0YXRlbWVudChqcy5qcygnIyA9ICMnLAogICAgICAgIFtnb3RvLCBqcy5udW1iZXIobGFiZWwpXSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgfQoKICAvLy8gUmV0dXJucyBhIGJsb2NrIHRoYXQgaGFzIGEgZ290byB0byBbbGFiZWxdIGluY2x1ZGluZyB0aGUgYnJlYWsuCiAgLy8vCiAgLy8vIEFsc28gaW5zZXJ0cyBhIGNvbW1lbnQgZGVzY3JpYmluZyB0aGUgbGFiZWwgaWYgYXZhaWxhYmxlLgogIGpzLkJsb2NrIGdvdG9BbmRCcmVhayhpbnQgbGFiZWwsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBMaXN0PGpzLlN0YXRlbWVudD4gc3RhdGVtZW50cyA9IDxqcy5TdGF0ZW1lbnQ+W107CiAgICBpZiAobGFiZWxDb21tZW50cy5jb250YWluc0tleShsYWJlbCkpIHsKICAgICAgc3RhdGVtZW50cy5hZGQobmV3IGpzLkNvbW1lbnQoImdvdG8gJHtsYWJlbENvbW1lbnRzW2xhYmVsXX0iKSk7CiAgICB9CiAgICBzdGF0ZW1lbnRzLmFkZChzZXRHb3RvVmFyaWFibGUobGFiZWwsIHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICBpZiAoaW5zaWRlVW50cmFuc2xhdGVkQnJlYWthYmxlKSB7CiAgICAgIGhhc0p1bXBUaG91Z2hPdXRlckxhYmVsID0gdHJ1ZTsKICAgICAgc3RhdGVtZW50cy5hZGQobmV3IGpzLkJyZWFrKG91dGVyTGFiZWxOYW1lKQogICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfSBlbHNlIHsKICAgICAgc3RhdGVtZW50cwogICAgICAgICAgLmFkZChuZXcganMuQnJlYWsobnVsbCkud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9CiAgICByZXR1cm4gbmV3IGpzLkJsb2NrKHN0YXRlbWVudHMpOwogIH0KCiAgLy8vIEFkZHMgYSBnb3RvIHRvIFtsYWJlbF0gaW5jbHVkaW5nIHRoZSBicmVhay4KICAvLy8KICAvLy8gQWxzbyBpbnNlcnRzIGEgY29tbWVudCBkZXNjcmliaW5nIHRoZSBsYWJlbCBpZiBhdmFpbGFibGUuCiAgdm9pZCBhZGRHb3RvKGludCBsYWJlbCwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIGlmIChsYWJlbENvbW1lbnRzLmNvbnRhaW5zS2V5KGxhYmVsKSkgewogICAgICBhZGRTdGF0ZW1lbnQobmV3IGpzLkNvbW1lbnQoImdvdG8gJHtsYWJlbENvbW1lbnRzW2xhYmVsXX0iKSk7CiAgICB9CiAgICBhZGRTdGF0ZW1lbnQoc2V0R290b1ZhcmlhYmxlKGxhYmVsLCBzb3VyY2VJbmZvcm1hdGlvbikpOwoKICAgIGFkZEJyZWFrKHNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIHZvaWQgYWRkU3RhdGVtZW50KGpzLlN0YXRlbWVudCBub2RlKSB7CiAgICBjdXJyZW50U3RhdGVtZW50QnVmZmVyLmFkZChub2RlKTsKICB9CgogIHZvaWQgYWRkRXhwcmVzc2lvblN0YXRlbWVudChqcy5FeHByZXNzaW9uIG5vZGUpIHsKICAgIGFkZFN0YXRlbWVudChuZXcganMuRXhwcmVzc2lvblN0YXRlbWVudChub2RlKSk7CiAgfQoKICAvLy8gVHJ1ZSBpZiB0aGVyZSBpcyBhbiBhd2FpdCBvciB5aWVsZCBpbiBbbm9kZV0gb3Igc29tZSBzdWJleHByZXNzaW9uLgogIGJvb2wgc2hvdWxkVHJhbnNmb3JtKGpzLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIGFuYWx5c2lzLmhhc0F3YWl0T3JZaWVsZC5jb250YWlucyhub2RlKTsKICB9CgogIHZvaWQgdW5zdXBwb3J0ZWQoanMuTm9kZSBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiTm9kZSAkbm9kZSBjYW5ub3QgYmUgdHJhbnNmb3JtZWQgYnkgdGhlIGF3YWl0LXN5bmMgdHJhbnNmb3JtZXIiKTsKICB9CgogIHZvaWQgdW5yZWFjaGFibGUoanMuTm9kZSBub2RlKSB7CiAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKHNwYW5uYWJsZSwgIkludGVybmFsIGVycm9yLCB0cnlpbmcgdG8gdmlzaXQgJG5vZGUiKTsKICB9CgogIHZpc2l0U3RhdGVtZW50KGpzLlN0YXRlbWVudCBub2RlKSB7CiAgICBub2RlLmFjY2VwdCh0aGlzKTsKICB9CgogIC8vLyBWaXNpdHMgW25vZGVdIHRvIGVuc3VyZSBpdHMgc2lkZWVmZmVjdHMgYXJlIHBlcmZvcm1lZCwgYnV0IHRocm93aW5nIGF3YXkKICAvLy8gdGhlIHJlc3VsdC4KICAvLy8KICAvLy8gSWYgdGhlIHJldHVybiB2YWx1ZSBvZiB2aXNpdGluZyBbbm9kZV0gaXMgYW4gZXhwcmVzc2lvbiBndWFyYW50ZWVkIHRvIGhhdmUKICAvLy8gbm8gc2lkZSBlZmZlY3QsIGl0IGlzIGRyb3BwZWQuCiAgdm9pZCB2aXNpdEV4cHJlc3Npb25JZ25vcmVSZXN1bHQoanMuRXhwcmVzc2lvbiBub2RlKSB7CiAgICAvLyBUT0RPKDI4NzYzKTogUmVtb3ZlIGA8ZHluYW1pYz5gIHdoZW4gaXNzdWUgMjg3NjMgaXMgZml4ZWQuCiAgICBqcy5FeHByZXNzaW9uIHJlc3VsdCA9IG5vZGUuYWNjZXB0PGR5bmFtaWM+KHRoaXMpOwogICAgaWYgKCEocmVzdWx0IGlzIGpzLkxpdGVyYWwgfHwgcmVzdWx0IGlzIGpzLlZhcmlhYmxlVXNlKSkgewogICAgICBhZGRFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7CiAgICB9CiAgfQoKICBqcy5FeHByZXNzaW9uIHZpc2l0RXhwcmVzc2lvbihqcy5FeHByZXNzaW9uIG5vZGUpIHsKICAgIC8vIFRPRE8oMjg3NjMpOiBSZW1vdmUgYDxkeW5hbWljPmAgd2hlbiBpc3N1ZSAyODc2MyBpcyBmaXhlZC4KICAgIHJldHVybiBub2RlLmFjY2VwdDxkeW5hbWljPih0aGlzKTsKICB9CgogIC8vLyBDYWxscyBbZm5dIHdpdGggdGhlIHZhbHVlIG9mIGV2YWx1YXRpbmcgW25vZGUxXSBhbmQgW25vZGUyXS4KICAvLy8KICAvLy8gQm90aCBub2RlcyBhcmUgZXZhbHVhdGVkIGluIG9yZGVyLgogIC8vLwogIC8vLyBJZiBub2RlMiBtdXN0IGJlIHRyYW5zZm9ybWVkIChzZWUgW3Nob3VsZFRyYW5zZm9ybV0pLCB0aGVuIHRoZSBldmFsdWF0aW9uCiAgLy8vIG9mIG5vZGUxIGlzIGFkZGVkIHRvIHRoZSBjdXJyZW50IHN0YXRlbWVudC1saXN0IGFuZCB0aGUgcmVzdWx0IGlzIHN0b3JlZAogIC8vLyBpbiBhIHRlbXBvcmFyeSB2YXJpYWJsZS4gVGhlIGV2YWx1YXRpb24gb2Ygbm9kZTIgaXMgdGhlbiBmcmVlIHRvIGVtaXQKICAvLy8gc3RhdGVtZW50cyB3aXRob3V0IGFmZmVjdGluZyB0aGUgcmVzdWx0IG9mIG5vZGUxLgogIC8vLwogIC8vLyBUaGlzIGlzIG5lY2Vzc2FyeSwgYmVjYXVzZSBhd2FpdCBvciB5aWVsZCBleHByZXNzaW9ucyBoYXZlIHRvIGVtaXQKICAvLy8gc3RhdGVtZW50cywgYW5kIHRoZXNlIHN0YXRlbWVudHMgY291bGQgYWZmZWN0IHRoZSB2YWx1ZSBvZiBub2RlMS4KICAvLy8KICAvLy8gRm9yIGV4YW1wbGU6CiAgLy8vCiAgLy8vIC0gX3N0b3JlSWZOZWNlc3Nhcnkoc29tZUxpdGVyYWwpIHJldHVybnMgc29tZUxpdGVyYWwuCiAgLy8vIC0gX3N0b3JlSWZOZWNlc3Nhcnkoc29tZVZhcmlhYmxlKQogIC8vLyAgIGluc2VydHM6IHZhciB0ZW1wWCA9IHNvbWVWYXJpYWJsZQogIC8vLyAgIHJldHVybnM6IHRlbXBYCiAgLy8vICAgd2hlcmUgdGVtcFggaXMgYSBmcmVzaCB0ZW1wb3JhcnkgdmFyaWFibGUuCiAganMuRXhwcmVzc2lvbiBfc3RvcmVJZk5lY2Vzc2FyeShqcy5FeHByZXNzaW9uIHJlc3VsdCkgewogICAgLy8gTm90ZSB0aGF0IFJlZ0V4ZXMsIGpzLkFycmF5SW5pdGlhbGl6ZXIgYW5kIGpzLk9iamVjdEluaXRpYWxpemVyIGFyZSBub3QKICAgIC8vIFtqcy5MaXRlcmFsXXMuCiAgICBpZiAocmVzdWx0IGlzIGpzLkxpdGVyYWwpIHJldHVybiByZXN1bHQ7CiAgICBpZiAocmVzdWx0IGlzIGpzLlZhcmlhYmxlVXNlKSB7CiAgICAgIGlmIChyZXN1bHQubmFtZSA9PSBzZWxmTmFtZSkgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBqcy5FeHByZXNzaW9uIHRlbXBWYXIgPSB1c2VUZW1wVmFyKGFsbG9jYXRlVGVtcFZhcigpKTsKICAgIGFkZFN0YXRlbWVudChqcy5qcy5zdGF0ZW1lbnQoJyMgPSAjOycsIFt0ZW1wVmFyLCByZXN1bHRdKSk7CiAgICByZXR1cm4gdGVtcFZhcjsKICB9CgogIC8vIFRPRE8oc2lndXJkbSk6IFRoaXMgaXMgb2Jzb2xldGUgLSBhbGwgY2FsbHMgdXNlIHN0b3JlOiBmYWxzZS4gUmVwbGFjZSB3aXRoCiAgLy8gdmlzaXRFeHByZXNzaW9uKG5vZGUpOwogIHdpdGhFeHByZXNzaW9uKGpzLkV4cHJlc3Npb24gbm9kZSwgZm4oanMuRXhwcmVzc2lvbiByZXN1bHQpLCB7Ym9vbCBzdG9yZX0pIHsKICAgIGludCBvbGRUZW1wVmFySW5kZXggPSBjdXJyZW50VGVtcFZhckluZGV4OwogICAganMuRXhwcmVzc2lvbiB2aXNpdGVkID0gdmlzaXRFeHByZXNzaW9uKG5vZGUpOwogICAgaWYgKHN0b3JlKSB7CiAgICAgIHZpc2l0ZWQgPSBfc3RvcmVJZk5lY2Vzc2FyeSh2aXNpdGVkKTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBmbih2aXNpdGVkKTsKICAgIGN1cnJlbnRUZW1wVmFySW5kZXggPSBvbGRUZW1wVmFySW5kZXg7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIENhbGxzIFtmbl0gd2l0aCB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgW25vZGVdLiBUYWtpbmcgc3BlY2lhbCBjYXJlIG9mCiAgLy8vIHByb3BlcnR5IGFjY2Vzc2VzLgogIC8vLwogIC8vLyBJZiBbc3RvcmVdIGlzIHRydWUgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIFtub2RlXSBpcyBzdG9yZWQgaW4gYQogIC8vLyB0ZW1wb3JhcnkuCiAgLy8vCiAgLy8vIFdlIGNhbm5vdCByZXdyaXRlIGA8cmVjZWl2ZXI+Lm0oKWAgdG86CiAgLy8vICAgICB0ZW1wID0gPHJlY2VpdmVyPi5tOwogIC8vLyAgICAgdGVtcCgpOwogIC8vLyBCZWNhdXNlIHRoaXMgbGVhdmVzIGB0aGlzYCB1bmJvdW5kIGluIHRoZSBjYWxsLiBCdXQgYmVjYXVzZSBvZiBkYXJ0CiAgLy8vIGV2YWx1YXRpb24gb3JkZXIgd2UgY2FuIHdyaXRlOgogIC8vLyAgICAgdGVtcCA9IDxyZWNlaXZlcj47CiAgLy8vICAgICB0ZW1wLm0oKTsKICB3aXRoQ2FsbFRhcmdldEV4cHJlc3Npb24oanMuRXhwcmVzc2lvbiBub2RlLCBmbihqcy5FeHByZXNzaW9uIHJlc3VsdCksCiAgICAgIHtib29sIHN0b3JlfSkgewogICAgaW50IG9sZFRlbXBWYXJJbmRleCA9IGN1cnJlbnRUZW1wVmFySW5kZXg7CiAgICBqcy5FeHByZXNzaW9uIHZpc2l0ZWQgPSB2aXNpdEV4cHJlc3Npb24obm9kZSk7CiAgICBqcy5FeHByZXNzaW9uIHNlbGVjdG9yOwogICAganMuRXhwcmVzc2lvbiBzdG9yZWRJZk5lZWRlZDsKICAgIGlmIChzdG9yZSkgewogICAgICBpZiAodmlzaXRlZCBpcyBqcy5Qcm9wZXJ0eUFjY2VzcykgewogICAgICAgIGpzLlByb3BlcnR5QWNjZXNzIHByb3BlcnR5QWNjZXNzID0gdmlzaXRlZDsKICAgICAgICBzZWxlY3RvciA9IHByb3BlcnR5QWNjZXNzLnNlbGVjdG9yOwogICAgICAgIHZpc2l0ZWQgPSBwcm9wZXJ0eUFjY2Vzcy5yZWNlaXZlcjsKICAgICAgfQogICAgICBzdG9yZWRJZk5lZWRlZCA9IF9zdG9yZUlmTmVjZXNzYXJ5KHZpc2l0ZWQpOwogICAgfSBlbHNlIHsKICAgICAgc3RvcmVkSWZOZWVkZWQgPSB2aXNpdGVkOwogICAgfQogICAganMuRXhwcmVzc2lvbiByZXN1bHQ7CiAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewogICAgICByZXN1bHQgPSBmbihzdG9yZWRJZk5lZWRlZCk7CiAgICB9IGVsc2UgewogICAgICByZXN1bHQgPSBmbihuZXcganMuUHJvcGVydHlBY2Nlc3Moc3RvcmVkSWZOZWVkZWQsIHNlbGVjdG9yKSk7CiAgICB9CiAgICBjdXJyZW50VGVtcFZhckluZGV4ID0gb2xkVGVtcFZhckluZGV4OwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBDYWxscyBbZm5dIHdpdGggdGhlIHZhbHVlIG9mIGV2YWx1YXRpbmcgW25vZGUxXSBhbmQgW25vZGUyXS4KICAvLy8KICAvLy8gSWYgYHNob3VsZFRyYW5zZm9ybShub2RlMilgIHRoZSBmaXJzdCBleHByZXNzaW9uIGlzIHN0b3JlZCBpbiBhIHRlbXBvcmFyeQogIC8vLyB2YXJpYWJsZS4KICAvLy8KICAvLy8gVGhpcyBpcyBiZWNhdXNlIG5vZGUxIG11c3QgYmUgZXZhbHVhdGVkIGJlZm9yZSB2aXNpdGluZyBub2RlMiwKICAvLy8gYmVjYXVzZSB0aGUgZXZhbHVhdGlvbiBvZiBhbiBhd2FpdCBvciB5aWVsZCBjYW5ub3QgYmUgZXhwcmVzc2VkIGFzCiAgLy8vIGFuIGV4cHJlc3Npb24sIHZpc2l0aW5nIG5vZGUyIGl0IHdpbGwgb3V0cHV0IHN0YXRlbWVudHMgdGhhdAogIC8vLyBtaWdodCBoYXZlIGFuIGluZmx1ZW5jZSBvbiB0aGUgdmFsdWUgb2Ygbm9kZTEuCiAgd2l0aEV4cHJlc3Npb24yKGpzLkV4cHJlc3Npb24gbm9kZTEsIGpzLkV4cHJlc3Npb24gbm9kZTIsCiAgICAgIGZuKGpzLkV4cHJlc3Npb24gcmVzdWx0MSwganMuRXhwcmVzc2lvbiByZXN1bHQyKSkgewogICAgaW50IG9sZFRlbXBWYXJJbmRleCA9IGN1cnJlbnRUZW1wVmFySW5kZXg7CiAgICBqcy5FeHByZXNzaW9uIHIxID0gdmlzaXRFeHByZXNzaW9uKG5vZGUxKTsKICAgIGlmIChzaG91bGRUcmFuc2Zvcm0obm9kZTIpKSB7CiAgICAgIHIxID0gX3N0b3JlSWZOZWNlc3NhcnkocjEpOwogICAgfQogICAganMuRXhwcmVzc2lvbiByMiA9IHZpc2l0RXhwcmVzc2lvbihub2RlMik7CiAgICB2YXIgcmVzdWx0ID0gZm4ocjEsIHIyKTsKICAgIGN1cnJlbnRUZW1wVmFySW5kZXggPSBvbGRUZW1wVmFySW5kZXg7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIENhbGxzIFtmbl0gd2l0aCB0aGUgdmFsdWUgb2YgZXZhbHVhdGluZyBhbGwgW25vZGVzXS4KICAvLy8KICAvLy8gQWxsIHJlc3VsdHMgYmVmb3JlIHRoZSBsYXN0IG5vZGUgd2hlcmUgYHNob3VsZFRyYW5zZm9ybShub2RlKWAgYXJlIHN0b3JlZAogIC8vLyBpbiB0ZW1wb3JhcnkgdmFyaWFibGVzLgogIC8vLwogIC8vLyBTZWUgbW9yZSBleHBsYW5hdGlvbiBvbiBbd2l0aEV4cHJlc3Npb24yXS4KICAvLy8KICAvLy8gSWYgYW55IG9mIHRoZSBub2RlcyBhcmUgbnVsbCwgdGhleSBhcmUgaWdub3JlZCwgYW5kIGEgbnVsbCBpcyBwYXNzZWQgdG8KICAvLy8gW2ZuXSBpbiB0aGF0IHBsYWNlLgogIHdpdGhFeHByZXNzaW9ucyhMaXN0PGpzLkV4cHJlc3Npb24+IG5vZGVzLCBmbihMaXN0PGpzLkV4cHJlc3Npb24+IHJlc3VsdHMpKSB7CiAgICBpbnQgb2xkVGVtcFZhckluZGV4ID0gY3VycmVudFRlbXBWYXJJbmRleDsKICAgIC8vIEZpbmQgbGFzdCBvY2N1cmVuY2Ugb2YgYSAndHJhbnNmb3JtJyBleHByZXNzaW9uIGluIFtub2Rlc10uCiAgICAvLyBBbGwgZXhwcmVzc2lvbnMgYmVmb3JlIHRoYXQgbXVzdCBiZSBzdG9yZWQgaW4gdGVtcC12YXJzLgogICAgaW50IGxhc3RUcmFuc2Zvcm1JbmRleCA9IDA7CiAgICBmb3IgKGludCBpID0gbm9kZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgaWYgKG5vZGVzW2ldID09IG51bGwpIGNvbnRpbnVlOwogICAgICBpZiAoc2hvdWxkVHJhbnNmb3JtKG5vZGVzW2ldKSkgewogICAgICAgIGxhc3RUcmFuc2Zvcm1JbmRleCA9IGk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIExpc3Q8anMuTm9kZT4gdmlzaXRlZCA9IG5vZGVzLnRha2UobGFzdFRyYW5zZm9ybUluZGV4KS5tYXAoKGpzLk5vZGUgbm9kZSkgewogICAgICByZXR1cm4gKG5vZGUgPT0gbnVsbCkgPyBudWxsIDogX3N0b3JlSWZOZWNlc3NhcnkodmlzaXRFeHByZXNzaW9uKG5vZGUpKTsKICAgIH0pLnRvTGlzdCgpOwogICAgdmlzaXRlZC5hZGRBbGwoCiAgICAgICAgbm9kZXMuc2tpcChsYXN0VHJhbnNmb3JtSW5kZXgpLm1hcDxqcy5FeHByZXNzaW9uPigoanMuTm9kZSBub2RlKSB7CiAgICAgIHJldHVybiAobm9kZSA9PSBudWxsKSA/IG51bGwgOiB2aXNpdEV4cHJlc3Npb24obm9kZSk7CiAgICB9KSk7CiAgICB2YXIgcmVzdWx0ID0gZm4odmlzaXRlZCk7CiAgICBjdXJyZW50VGVtcFZhckluZGV4ID0gb2xkVGVtcFZhckluZGV4OwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBFbWl0cyB0aGUgcmV0dXJuIGJsb2NrIHRoYXQgYWxsIHJldHVybnMganVtcCB0byAoYWZ0ZXIgZ29pbmcKICAvLy8gdGhyb3VnaCBhbGwgdGhlIGVuY2xvc2luZyBmaW5hbGx5IGJsb2NrcykuIFRoZSBqdW1wIHRvIGhlcmUgaXMgbWFkZSBpbgogIC8vLyBbdmlzaXRSZXR1cm5dLgogIHZvaWQgYWRkU3VjY2Vzc0V4aXQoU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pOwoKICAvLy8gRW1pdHMgdGhlIGJsb2NrIHRoYXQgY29udHJvbCBmbG93cyB0byBpZiBhbiBlcnJvciBoYXMgYmVlbiB0aHJvd24KICAvLy8gYnV0IG5vdCBjYXVnaHQuIChhZnRlciBnb2luZyB0aHJvdWdoIGFsbCB0aGUgZW5jbG9zaW5nIGZpbmFsbHkgYmxvY2tzKS4KICB2b2lkIGFkZEVycm9yRXhpdChTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbik7CgogIHZvaWQgYWRkRnVuY3Rpb25FeGl0cyhTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgYWRkU3VjY2Vzc0V4aXQoc291cmNlSW5mb3JtYXRpb24pOwogICAgYWRkRXJyb3JFeGl0KHNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSByZXdyaXR0ZW4gZnVuY3Rpb24uCiAganMuRnVuIGZpbmlzaEZ1bmN0aW9uKAogICAgICBMaXN0PGpzLlBhcmFtZXRlcj4gcGFyYW1ldGVycywKICAgICAgTGlzdDxqcy5QYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLAogICAgICBqcy5TdGF0ZW1lbnQgcmV3cml0dGVuQm9keSwKICAgICAganMuVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QgdmFyaWFibGVEZWNsYXJhdGlvbnMsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIGZ1bmN0aW9uU291cmNlSW5mb3JtYXRpb24sCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIGJvZHlTb3VyY2VJbmZvcm1hdGlvbik7CgogIEl0ZXJhYmxlPGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24+IHZhcmlhYmxlSW5pdGlhbGl6YXRpb25zKAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbik7CgogIC8vLyBSZXdyaXRlcyBhbiBhc3luYy9zeW5jKi9hc3luYyogZnVuY3Rpb24gdG8gYSBub3JtYWwgSmF2YXNjcmlwdCBmdW5jdGlvbi4KICAvLy8KICAvLy8gVGhlIGNvbnRyb2wgZmxvdyBpcyBmbGF0dGVuZWQgYnkgc2ltdWxhdGluZyAnZ290bycgdXNpbmcgYSBzd2l0Y2ggaW4gYQogIC8vLyBsb29wIGFuZCBhIHN0YXRlIHZhcmlhYmxlIFtnb3RvXSBpbnNpZGUgYSBuZXN0ZWQgZnVuY3Rpb24gW2JvZHldCiAgLy8vIHRoYXQgY2FuIGJlIGNhbGxlZCBiYWNrIGJ5IFthc3luY1N0YXJIZWxwZXJdL1thc3luY1N0YXJIZWxwZXJdL3RoZQogIC8vLyBbSXRlcmF0b3JdLgogIC8vLwogIC8vLyBMb2NhbCB2YXJpYWJsZXMgYXJlIGhvaXN0ZWQgb3V0c2lkZSB0aGUgaGVscGVyLgogIC8vLwogIC8vLyBBd2FpdHMgaW4gYXN5bmMvYXN5bmMqIGFyZSB0cmFuc2xhdGVkIHRvIGNvZGUgdGhhdCByZW1lbWJlcnMgdGhlIGN1cnJlbnQKICAvLy8gbG9jYXRpb24gKHNvIHRoZSBmdW5jdGlvbiBjYW4gcmVzdW1lIGZyb20gd2hlcmUgaXQgd2FzKSBmb2xsb3dlZCBieSBhCiAgLy8vIFthd2FpdFN0YXRlbWVudF0uIFRoZSBoZWxwZXIgc2V0cyB1cCB0aGUgd2FpdGluZyBmb3IgdGhlIGF3YWl0ZWQKICAvLy8gdmFsdWUgYW5kIHJldHVybnMgYSBmdXR1cmUgd2hpY2ggaXMgaW1tZWRpYXRlbHkgcmV0dXJuZWQgYnkgdGhlCiAgLy8vIFthd2FpdFN0YXRlbWVudF0uCiAgLy8vCiAgLy8vIFlpZWxkcyBpbiBzeW5jKi9hc3luYyogYXJlIHRyYW5zbGF0ZWQgdG8gYSBjYWxscyB0byBoZWxwZXIgZnVuY3Rpb25zLgogIC8vLyAoc2VlIFt2aXNpdFlpZWxkXSkKICAvLy8KICAvLy8gU2ltcGxpZmllZCBleGFtcGxlcyAobm90IHRoZSBleGFjdCB0cmFuc2xhdGlvbiwgYnV0IGludGVuZGVkIHRvIHNob3cgdGhlCiAgLy8vIGlkZWFzKToKICAvLy8KICAvLy8gZnVuY3Rpb24gKHgsIHksIHopIGFzeW5jIHsKICAvLy8gICB2YXIgcCA9IGF3YWl0IGZvbygpOwogIC8vLyAgIHJldHVybiBiYXIocCk7CiAgLy8vIH0KICAvLy8KICAvLy8gQmVjb21lcyAod2l0aG91dCBlcnJvciBoYW5kbGluZyk6CiAgLy8vCiAgLy8vIGZ1bmN0aW9uKHgsIHksIHopIHsKICAvLy8gICB2YXIgZ290byA9IDAsIHJldHVyblZhbHVlLCBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyKCksIHA7CiAgLy8vICAgZnVuY3Rpb24gYm9keShyZXN1bHQpIHsKICAvLy8gICAgIHdoaWxlICh0cnVlKSB7CiAgLy8vICAgICAgIHN3aXRjaCAoZ290bykgewogIC8vLyAgICAgICAgIGNhc2UgMDoKICAvLy8gICAgICAgICAgIGdvdG8gPSAxIC8vIFJlbWVtYmVyIHdoZXJlIHRvIGNvbnRpbnVlIHdoZW4gdGhlIGZ1dHVyZSBzdWNjZWVkcy4KICAvLy8gICAgICAgICAgIHJldHVybiB0aGVuSGVscGVyKGZvbygpLCBoZWxwZXIsIGNvbXBsZXRlcik7CiAgLy8vICAgICAgICAgY2FzZSAxOgogIC8vLyAgICAgICAgICAgcCA9IHJlc3VsdDsKICAvLy8gICAgICAgICAgIHJldHVyblZhbHVlID0gYmFyKHApOwogIC8vLyAgICAgICAgICAgZ290byA9IDI7CiAgLy8vICAgICAgICAgICBicmVhazsKICAvLy8gICAgICAgICBjYXNlIDI6CiAgLy8vICAgICAgICAgICByZXR1cm4gdGhlbkhlbHBlcihyZXR1cm5WYWx1ZSwgbnVsbCwgY29tcGxldGVyKQogIC8vLyAgICAgICB9CiAgLy8vICAgICB9CiAgLy8vICAgICByZXR1cm4gdGhlbkhlbHBlcihudWxsLCBoZWxwZXIsIGNvbXBsZXRlcik7CiAgLy8vICAgfQogIC8vLyB9CiAgLy8vCiAgLy8vIFRyeS9jYXRjaCBpcyBpbXBsZW1lbnRlZCBieSBtYWludGFpbmluZyBbaGFuZGxlcl0gdG8gY29udGFpbiB0aGUgbGFiZWwKICAvLy8gb2YgdGhlIGN1cnJlbnQgaGFuZGxlci4gSWYgW2JvZHldIHRocm93cywgdGhlIGNhbGxlciBzaG91bGQgY2F0Y2ggdGhlCiAgLy8vIGVycm9yIGFuZCByZWNhbGwgW2JvZHldIHdpdGggZmlyc3QgYXJndW1lbnQgW2Vycm9yX2NvZGVzLkVSUk9SXSBhbmQKICAvLy8gc2Vjb25kIGFyZ3VtZW50IHRoZSBlcnJvci4KICAvLy8KICAvLy8gQSBgZmluYWxseWAgY2xhdXNlIGlzIGNvbXBpbGVkIHNpbWlsYXIgdG8gbm9ybWFsIGNvZGUsIHdpdGggdGhlIGFkZGl0aW9uYWwKICAvLy8gY29tcGxleGl0eSB0aGF0IGBmaW5hbGx5YCBjbGF1c2VzIG5lZWQgdG8ga25vdyB3aGVyZSB0byBqdW1wIHRvIGFmdGVyIHRoZQogIC8vLyBjbGF1c2UgaXMgZG9uZS4gSW4gdGhlIHRyYW5zbGF0aW9uLCBlYWNoIGZsb3ctcGF0aCB0aGF0IGVudGVycyBhIGBmaW5hbGx5YAogIC8vLyBzZXRzIHVwIHRoZSB2YXJpYWJsZSBbbmV4dF0gd2l0aCBhIHN0YWNrIG9mIGZpbmFsbHktYmxvY2tzIGFuZCBhIGZpbmFsCiAgLy8vIGp1bXAtdGFyZ2V0IChleGl0LCBjYXRjaCwgLi4uKS4KICAvLy8KICAvLy8gZnVuY3Rpb24oeCwgeSwgeikgYXN5bmMgewogIC8vLyAgIHRyeSB7CiAgLy8vICAgICB0cnkgewogIC8vLyAgICAgICB0aHJvdyAiZXJyb3IiOwogIC8vLyAgICAgfSBmaW5hbGx5IHsKICAvLy8gICAgICAgZmluYWxpemUxKCk7CiAgLy8vICAgICB9CiAgLy8vICAgfSBjYXRjaCAoZSkgewogIC8vLyAgICAgaGFuZGxlKGUpOwogIC8vLyAgIH0gZmluYWxseSB7CiAgLy8vICAgICBmaW5hbGl6ZTIoKTsKICAvLy8gICB9CiAgLy8vIH0KICAvLy8KICAvLy8gVHJhbnNsYXRlcyBpbnRvIChiZXNpZGVzIHRoZSBmYWN0IHRoYXQgc3RydWN0dXJlcyBub3QgY29udGFpbmluZwogIC8vLyBhd2FpdC95aWVsZC95aWVsZCogYXJlIGxlZnQgaW50YWN0KToKICAvLy8KICAvLy8gZnVuY3Rpb24oeCwgeSwgeikgewogIC8vLyAgIHZhciBnb3RvID0gMDsKICAvLy8gICB2YXIgcmV0dXJuVmFsdWU7CiAgLy8vICAgdmFyIGNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXIoKTsKICAvLy8gICB2YXIgaGFuZGxlciA9IDg7IC8vIE91dHNpZGUgdHJ5LWJsb2NrcyBnbyB0byB0aGUgcmV0aHJvdyBsYWJlbC4KICAvLy8gICB2YXIgcDsKICAvLy8gICB2YXIgY3VycmVudEVycm9yOwogIC8vLyAgIC8vIFRoZSByZXN1bHQgY2FuIGJlIGVpdGhlciB0aGUgcmVzdWx0IG9mIGFuIGF3YWl0ZWQgZnV0dXJlLCBvciBhbgogIC8vLyAgIC8vIGVycm9yIGlmIHRoZSBmdXR1cmUgY29tcGxldGVkIHdpdGggYW4gZXJyb3IuCiAgLy8vICAgZnVuY3Rpb24gYm9keShlcnJvckNvZGUsIHJlc3VsdCkgewogIC8vLyAgICAgaWYgKGVycm9yQ29kZSA9PSAxKSB7CiAgLy8vICAgICAgIGN1cnJlbnRFcnJvciA9IHJlc3VsdDsKICAvLy8gICAgICAgZ290byA9IGhhbmRsZXI7CiAgLy8vICAgICB9CiAgLy8vICAgICB3aGlsZSAodHJ1ZSkgewogIC8vLyAgICAgICBzd2l0Y2ggKGdvdG8pIHsKICAvLy8gICAgICAgICBjYXNlIDA6CiAgLy8vICAgICAgICAgICBoYW5kbGVyID0gNDsgLy8gVGhlIG91dGVyIGNhdGNoLWhhbmRsZXIKICAvLy8gICAgICAgICAgIGhhbmRsZXIgPSAxOyAvLyBUaGUgaW5uZXIgKGltcGxpY2l0KSBjYXRjaC1oYW5kbGVyCiAgLy8vICAgICAgICAgICB0aHJvdyAiZXJyb3IiOwogIC8vLyAgICAgICAgICAgbmV4dCA9IFszXTsKICAvLy8gICAgICAgICAgIC8vIEFmdGVyIHRoZSBmaW5hbGx5ICgyKSBjb250aW51ZSBub3JtYWxseSBhZnRlciB0aGUgdHJ5LgogIC8vLyAgICAgICAgICAgZ290byA9IDI7CiAgLy8vICAgICAgICAgICBicmVhazsKICAvLy8gICAgICAgICBjYXNlIDE6IC8vIChpbXBsaWNpdCkgY2F0Y2ggaGFuZGxlciBmb3IgaW5uZXIgdHJ5LgogIC8vLyAgICAgICAgICAgbmV4dCA9IFszXTsgLy8gZGVzdGluYXRpb24gYWZ0ZXIgdGhlIGZpbmFsbHkuCiAgLy8vICAgICAgICAgICAvLyBmYWxsLXRob3VnaCB0byB0aGUgZmluYWxseSBoYW5kbGVyLgogIC8vLyAgICAgICAgIGNhc2UgMjogLy8gZmluYWxseSBmb3IgaW5uZXIgdHJ5CiAgLy8vICAgICAgICAgICBoYW5kbGVyID0gNDsgLy8gY2F0Y2gtaGFuZGxlciBmb3Igb3V0ZXIgdHJ5LgogIC8vLyAgICAgICAgICAgZmluYWxpemUxKCk7CiAgLy8vICAgICAgICAgICBnb3RvID0gbmV4dC5wb3AoKTsKICAvLy8gICAgICAgICAgIGJyZWFrOwogIC8vLyAgICAgICAgIGNhc2UgMzogLy8gZXhpdGluZyBpbm5lciB0cnkuCiAgLy8vICAgICAgICAgICBuZXh0ID0gWzZdOwogIC8vLyAgICAgICAgICAgZ290byA9IDU7IC8vIGZpbmFsbHkgaGFuZGxlciBmb3Igb3V0ZXIgdHJ5LgogIC8vLyAgICAgICAgICAgYnJlYWs7CiAgLy8vICAgICAgICAgY2FzZSA0OiAvLyBjYXRjaCBoYW5kbGVyIGZvciBvdXRlciB0cnkuCiAgLy8vICAgICAgICAgICBoYW5kbGVyID0gNTsgLy8gSWYgdGhlIGhhbmRsZXIgdGhyb3dzLCBkbyB0aGUgZmluYWxseSAuLgogIC8vLyAgICAgICAgICAgbmV4dCA9IFs4XSAvLyAuLi4gYW5kIHJldGhyb3cuCiAgLy8vICAgICAgICAgICBlID0gc3RvcmVkRXJyb3I7CiAgLy8vICAgICAgICAgICBoYW5kbGUoZSk7CiAgLy8vICAgICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gZmluYWxseS4KICAvLy8gICAgICAgICBjYXNlIDU6IC8vIGZpbmFsbHkgaGFuZGxlciBmb3Igb3V0ZXIgdHJ5LgogIC8vLyAgICAgICAgICAgaGFuZGxlciA9IG51bGw7CiAgLy8vICAgICAgICAgICBmaW5hbGl6ZTIoKTsKICAvLy8gICAgICAgICAgIGdvdG8gPSBuZXh0LnBvcCgpOwogIC8vLyAgICAgICAgICAgYnJlYWs7CiAgLy8vICAgICAgICAgY2FzZSA2OiAvLyBFeGl0aW5nIG91dGVyIHRyeS4KICAvLy8gICAgICAgICBjYXNlIDc6IC8vIHJldHVybgogIC8vLyAgICAgICAgICAgcmV0dXJuIHRoZW5IZWxwZXIocmV0dXJuVmFsdWUsIDAsIGNvbXBsZXRlcik7CiAgLy8vICAgICAgICAgY2FzZSA4OiAvLyBSZXRocm93CiAgLy8vICAgICAgICAgICByZXR1cm4gdGhlbkhlbHBlcihjdXJyZW50RXJyb3IsIDEsIGNvbXBsZXRlcik7CiAgLy8vICAgICAgIH0KICAvLy8gICAgIH0KICAvLy8gICAgIHJldHVybiB0aGVuSGVscGVyKG51bGwsIGhlbHBlciwgY29tcGxldGVyKTsKICAvLy8gICB9CiAgLy8vIH0KICAvLy8KICAvLy8gW2JvZHlTb3VyY2VJbmZvcm1hdGlvbl0gaXMgdXNlZCBvbiBjb2RlIGdlbmVyYXRlZCB0byBleGVjdXRlIHRoZSBmdW5jdGlvbgogIC8vLyBib2R5IGFuZCBbZXhpdFNvdXJjZUluZm9ybWF0aW9uXSBpcyB1c2VkIG9uIGNvZGUgZ2VuZXJhdGVkIHRvIGV4aXQgdGhlCiAgLy8vIGZ1bmN0aW9uLgogIGpzLkV4cHJlc3Npb24gcmV3cml0ZUZ1bmN0aW9uKAogICAgICBqcy5GdW4gbm9kZSwKICAgICAgU291cmNlSW5mb3JtYXRpb24gYm9keVNvdXJjZUluZm9ybWF0aW9uLAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBleGl0U291cmNlSW5mb3JtYXRpb24pIHsKICAgIGJlZ2luTGFiZWwobmV3TGFiZWwoIkZ1bmN0aW9uIHN0YXJ0IikpOwogICAgLy8gQXN5bmNTdGFyIG5lZWRzIGEgcmV0dXJuIGxhYmVsIGZvciBpdHMgaGFuZGxpbmcgb2YgY2FuY2VsbGF0aW9uLiBTZWUKICAgIC8vIFt2aXNpdERhcnRZaWVsZF0uCiAgICBleGl0TGFiZWwgPSAoYW5hbHlzaXMuaGFzRXhwbGljaXRSZXR1cm5zIHx8IGlzQXN5bmNTdGFyKQogICAgICAgID8gbmV3TGFiZWwoInJldHVybiIpCiAgICAgICAgOiBudWxsOwogICAgcmV0aHJvd0xhYmVsID0gbmV3TGFiZWwoInJldGhyb3ciKTsKICAgIGhhbmRsZXJMYWJlbHNbbm9kZV0gPSByZXRocm93TGFiZWw7CiAgICBqcy5TdGF0ZW1lbnQgYm9keSA9IG5vZGUuYm9keTsKICAgIGp1bXBUYXJnZXRzLmFkZChub2RlKTsKICAgIHZpc2l0U3RhdGVtZW50KGJvZHkpOwogICAganVtcFRhcmdldHMucmVtb3ZlTGFzdCgpOwogICAgYWRkRnVuY3Rpb25FeGl0cyhleGl0U291cmNlSW5mb3JtYXRpb24pOwoKICAgIExpc3Q8anMuU3dpdGNoQ2xhdXNlPiBjbGF1c2VzID0gbGFiZWxsZWRQYXJ0cy5rZXlzLm1hcCgobGFiZWwpIHsKICAgICAgcmV0dXJuIG5ldyBqcy5DYXNlKGpzLm51bWJlcihsYWJlbCksIG5ldyBqcy5CbG9jayhsYWJlbGxlZFBhcnRzW2xhYmVsXSkpOwogICAgfSkudG9MaXN0KCk7CiAgICBqcy5TdGF0ZW1lbnQgcmV3cml0dGVuQm9keSA9IG5ldyBqcy5Td2l0Y2goZ290bywgY2xhdXNlcykKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKGJvZHlTb3VyY2VJbmZvcm1hdGlvbik7CiAgICBpZiAoaGFzSnVtcFRob3VnaE91dGVyTGFiZWwpIHsKICAgICAgcmV3cml0dGVuQm9keSA9IG5ldyBqcy5MYWJlbGVkU3RhdGVtZW50KG91dGVyTGFiZWxOYW1lLCByZXdyaXR0ZW5Cb2R5KTsKICAgIH0KICAgIHJld3JpdHRlbkJvZHkgPSBqcy5qcwogICAgICAgIC5zdGF0ZW1lbnQoJ3doaWxlICh0cnVlKSB7I30nLCByZXdyaXR0ZW5Cb2R5KQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oYm9keVNvdXJjZUluZm9ybWF0aW9uKTsKICAgIExpc3Q8anMuVmFyaWFibGVJbml0aWFsaXphdGlvbj4gdmFyaWFibGVzID0gPGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24+W107CgogICAgdmFyaWFibGVzLmFkZCgKICAgICAgICBfbWFrZVZhcmlhYmxlSW5pdGlhbGl6ZXIoZ290bywganMubnVtYmVyKDApLCBib2R5U291cmNlSW5mb3JtYXRpb24pKTsKICAgIHZhcmlhYmxlcy5hZGRBbGwodmFyaWFibGVJbml0aWFsaXphdGlvbnMoYm9keVNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICBpZiAoaGFzSGFuZGxlckxhYmVscykgewogICAgICB2YXJpYWJsZXMuYWRkKF9tYWtlVmFyaWFibGVJbml0aWFsaXplcigKICAgICAgICAgIGhhbmRsZXIsIGpzLm51bWJlcihyZXRocm93TGFiZWwpLCBib2R5U291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgdmFyaWFibGVzLmFkZCgKICAgICAgICAgIF9tYWtlVmFyaWFibGVJbml0aWFsaXplcihjdXJyZW50RXJyb3IsIG51bGwsIGJvZHlTb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfQogICAgaWYgKGFuYWx5c2lzLmhhc0ZpbmFsbHkgfHwgKGlzQXN5bmNTdGFyICYmIGFuYWx5c2lzLmhhc1lpZWxkKSkgewogICAgICB2YXJpYWJsZXMuYWRkKF9tYWtlVmFyaWFibGVJbml0aWFsaXplcihuZXh0LAogICAgICAgICAgbmV3IGpzLkFycmF5SW5pdGlhbGl6ZXIoPGpzLkV4cHJlc3Npb24+W10pLCBib2R5U291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0KICAgIGlmIChhbmFseXNpcy5oYXNUaGlzICYmICFpc1N5bmNTdGFyKSB7CiAgICAgIC8vIFN5bmMqIGZ1bmN0aW9ucyBtdXN0IHJlbWVtYmVyIGB0aGlzYCBvbiB0aGUgbGV2ZWwgb2YgdGhlIG91dGVyCiAgICAgIC8vIGZ1bmN0aW9uLgogICAgICB2YXJpYWJsZXMuYWRkKAogICAgICAgICAgX21ha2VWYXJpYWJsZUluaXRpYWxpemVyKHNlbGYsIGpzLmpzKCd0aGlzJyksIGJvZHlTb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfQogICAgdmFyaWFibGVzLmFkZEFsbChsb2NhbFZhcmlhYmxlcy5tYXAoKGpzLlZhcmlhYmxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKICAgICAgcmV0dXJuIG5ldyBqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uKGRlY2xhcmF0aW9uLCBudWxsKTsKICAgIH0pKTsKICAgIHZhcmlhYmxlcy5hZGRBbGwobmV3IEl0ZXJhYmxlLmdlbmVyYXRlKAogICAgICAgIHRlbXBWYXJIaWdoV2F0ZXJNYXJrLAogICAgICAgIChpbnQgaSkgPT4gX21ha2VWYXJpYWJsZUluaXRpYWxpemVyKAogICAgICAgICAgICB1c2VUZW1wVmFyKGkgKyAxKS5uYW1lLCBudWxsLCBib2R5U291cmNlSW5mb3JtYXRpb24pKSk7CiAgICBqcy5WYXJpYWJsZURlY2xhcmF0aW9uTGlzdCB2YXJpYWJsZURlY2xhcmF0aW9ucyA9CiAgICAgICAgbmV3IGpzLlZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KHZhcmlhYmxlcyk7CgogICAgLy8gTmFtZXMgYXJlIGFscmVhZHkgc2FmZSB3aGVuIGFkZGVkLgogICAgTGlzdDxqcy5QYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzID0KICAgICAgICB0eXBlQXJndW1lbnROYW1lcy5tYXAoKG5hbWUpID0+IG5ldyBqcy5QYXJhbWV0ZXIobmFtZSkpLnRvTGlzdCgpOwogICAgcmV0dXJuIGZpbmlzaEZ1bmN0aW9uKG5vZGUucGFyYW1zLCB0eXBlUGFyYW1ldGVycywgcmV3cml0dGVuQm9keSwKICAgICAgICB2YXJpYWJsZURlY2xhcmF0aW9ucywgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbiwgYm9keVNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIGpzLkV4cHJlc3Npb24gdmlzaXRGdW4oanMuRnVuIG5vZGUpIHsKICAgIGlmIChub2RlLmFzeW5jTW9kaWZpZXIuaXNBc3luYyB8fCBub2RlLmFzeW5jTW9kaWZpZXIuaXNZaWVsZGluZykgewogICAgICAvLyBUaGUgdHJhbnNsYXRpb24gZG9lcyBub3QgaGFuZGxlIG5lc3RlZCBmdW5jdGlvbnMgdGhhdCBhcmUgZ2VuZXJhdG9ycwogICAgICAvLyBvciBhc3luY2hyb25vdXMuICBUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIG9ubHkgYmUgb25lcyB0aGF0IGFyZQogICAgICAvLyBpbnRyb2R1Y2VkIGJ5IEpTIGZvcmVpZ24gY29kZSBmcm9tIG91ciBvd24gbGlicmFyaWVzLgogICAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKAogICAgICAgICAgc3Bhbm5hYmxlLCAnTmVzdGVkIGZ1bmN0aW9uIGlzIGEgZ2VuZXJhdG9yIG9yIGFzeW5jaHJvbm91cy4nKTsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAganMuRXhwcmVzc2lvbiB2aXNpdEFjY2Vzcyhqcy5Qcm9wZXJ0eUFjY2VzcyBub2RlKSB7CiAgICByZXR1cm4gd2l0aEV4cHJlc3Npb24yKG5vZGUucmVjZWl2ZXIsIG5vZGUuc2VsZWN0b3IsCiAgICAgICAgKHJlY2VpdmVyLCBzZWxlY3RvcikgPT4ganMuanMoJyNbI10nLCBbcmVjZWl2ZXIsIHNlbGVjdG9yXSkpOwogIH0KCiAgQG92ZXJyaWRlCiAganMuRXhwcmVzc2lvbiB2aXNpdEFycmF5SG9sZShqcy5BcnJheUhvbGUgbm9kZSkgewogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBqcy5FeHByZXNzaW9uIHZpc2l0QXJyYXlJbml0aWFsaXplcihqcy5BcnJheUluaXRpYWxpemVyIG5vZGUpIHsKICAgIHJldHVybiB3aXRoRXhwcmVzc2lvbnMobm9kZS5lbGVtZW50cywgKGVsZW1lbnRzKSB7CiAgICAgIHJldHVybiBuZXcganMuQXJyYXlJbml0aWFsaXplcihlbGVtZW50cyk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIGpzLkV4cHJlc3Npb24gdmlzaXRBc3NpZ25tZW50KGpzLkFzc2lnbm1lbnQgbm9kZSkgewogICAgaWYgKCFzaG91bGRUcmFuc2Zvcm0obm9kZSkpIHsKICAgICAgcmV0dXJuIG5ldyBqcy5Bc3NpZ25tZW50LmNvbXBvdW5kKHZpc2l0RXhwcmVzc2lvbihub2RlLmxlZnRIYW5kU2lkZSksCiAgICAgICAgICBub2RlLm9wLCB2aXNpdEV4cHJlc3Npb24obm9kZS52YWx1ZSkpOwogICAgfQogICAganMuRXhwcmVzc2lvbiBsZWZ0SGFuZFNpZGUgPSBub2RlLmxlZnRIYW5kU2lkZTsKICAgIGlmIChsZWZ0SGFuZFNpZGUgaXMganMuVmFyaWFibGVVc2UpIHsKICAgICAgcmV0dXJuIHdpdGhFeHByZXNzaW9uKG5vZGUudmFsdWUsIChqcy5FeHByZXNzaW9uIHZhbHVlKSB7CiAgICAgICAgLy8gQSBub24tY29tcG91bmQgW2pzLkFzc2lnbm1lbnRdIGhhcyBgb3A9PW51bGxgLiBTbyBpdCB3b3JrcyBvdXQgdG8KICAgICAgICAvLyB1c2UgW2pzLkFzc2lnbm1lbnQuY29tcG91bmRdIGZvciBhbGwgY2FzZXMuCiAgICAgICAgLy8gVmlzaXQgdGhlIFtqcy5WYXJpYWJsZVVzZV0gdG8gZW5zdXJlIHJlbmFtaW5nIGlzIGRvbmUgY29ycmVjdGx5LgogICAgICAgIHJldHVybiBuZXcganMuQXNzaWdubWVudC5jb21wb3VuZCgKICAgICAgICAgICAgdmlzaXRFeHByZXNzaW9uKGxlZnRIYW5kU2lkZSksIG5vZGUub3AsIHZhbHVlKTsKICAgICAgfSwgc3RvcmU6IGZhbHNlKTsKICAgIH0gZWxzZSBpZiAobGVmdEhhbmRTaWRlIGlzIGpzLlByb3BlcnR5QWNjZXNzKSB7CiAgICAgIHJldHVybiB3aXRoRXhwcmVzc2lvbnMoCiAgICAgICAgICBbbGVmdEhhbmRTaWRlLnJlY2VpdmVyLCBsZWZ0SGFuZFNpZGUuc2VsZWN0b3IsIG5vZGUudmFsdWVdLAogICAgICAgICAgKGV2YWx1YXRlZCkgewogICAgICAgIHJldHVybiBuZXcganMuQXNzaWdubWVudC5jb21wb3VuZCgKICAgICAgICAgICAgbmV3IGpzLlByb3BlcnR5QWNjZXNzKGV2YWx1YXRlZFswXSwgZXZhbHVhdGVkWzFdKSwKICAgICAgICAgICAgbm9kZS5vcCwKICAgICAgICAgICAgZXZhbHVhdGVkWzJdKTsKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyAiVW5leHBlY3RlZCBhc3NpZ25tZW50IGxlZnQgaGFuZCBzaWRlICRsZWZ0SGFuZFNpZGUiOwogICAgfQogIH0KCiAganMuU3RhdGVtZW50IGF3YWl0U3RhdGVtZW50KAogICAgICBqcy5FeHByZXNzaW9uIHZhbHVlLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbik7CgogIC8vLyBBbiBhd2FpdCBpcyB0cmFuc2xhdGVkIHRvIGFuIFthd2FpdFN0YXRlbWVudF0uCiAgLy8vCiAgLy8vIFNlZSB0aGUgY29tbWVudHMgb2YgW3Jld3JpdGVGdW5jdGlvbl0gZm9yIGFuIGV4YW1wbGUuCiAgQG92ZXJyaWRlCiAganMuRXhwcmVzc2lvbiB2aXNpdEF3YWl0KGpzLkF3YWl0IG5vZGUpIHsKICAgIGFzc2VydChpc0FzeW5jIHx8IGlzQXN5bmNTdGFyKTsKICAgIGludCBhZnRlckF3YWl0ID0gbmV3TGFiZWwoInJldHVybmluZyBmcm9tIGF3YWl0LiIpOwogICAgd2l0aEV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uLCAoanMuRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgICBhZGRTdGF0ZW1lbnQoc2V0R290b1ZhcmlhYmxlKGFmdGVyQXdhaXQsIG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgYWRkU3RhdGVtZW50KGF3YWl0U3RhdGVtZW50KHZhbHVlLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9LCBzdG9yZTogZmFsc2UpOwogICAgYmVnaW5MYWJlbChhZnRlckF3YWl0KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gQ2hlY2tzIGlmIFtub2RlXSBpcyB0aGUgdmFyaWFibGUgbmFtZWQgW3Jlc3VsdE5hbWVdLgogIC8vLwogIC8vLyBbcmVzdWx0XSBpcyB1c2VkIHRvIGhvbGQgdGhlIHJlc3VsdCBvZiBhIHRyYW5zZm9ybWVkIGNvbXB1dGF0aW9uCiAgLy8vIGZvciBleGFtcGxlIHRoZSByZXN1bHQgb2YgYXdhaXRpbmcsIG9yIHRoZSByZXN1bHQgb2YgYSBjb25kaXRpb25hbCBvcgogIC8vLyBzaG9ydC1jaXJjdWl0aW5nIGV4cHJlc3Npb24uCiAgLy8vIElmIHRoZSBzdWJleHByZXNzaW9uIG9mIHNvbWUgdHJhbnNmb3JtZWQgbm9kZSBhbHJlYWR5IGlzIHRyYW5zZm9ybWVkIGFuZAogIC8vLyB2aXNpdGluZyBpdCByZXR1cm5zIFtyZXN1bHRdLCBpdCBpcyBub3QgcmVkdW5kYW50bHkgYXNzaWduZWQgdG8gaXRzZWxmCiAgLy8vIGFnYWluLgogIGJvb2wgaXNSZXN1bHQoanMuRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gbm9kZSBpcyBqcy5WYXJpYWJsZVVzZSAmJiBub2RlLm5hbWUgPT0gcmVzdWx0TmFtZTsKICB9CgogIEBvdmVycmlkZQogIGpzLkV4cHJlc3Npb24gdmlzaXRCaW5hcnkoanMuQmluYXJ5IG5vZGUpIHsKICAgIGlmIChzaG91bGRUcmFuc2Zvcm0obm9kZS5yaWdodCkgJiYgKG5vZGUub3AgPT0gInx8IiB8fCBub2RlLm9wID09ICImJiIpKSB7CiAgICAgIGludCB0aGVuTGFiZWwgPSBuZXdMYWJlbCgidGhlbiIpOwogICAgICBpbnQgam9pbkxhYmVsID0gbmV3TGFiZWwoImpvaW4iKTsKICAgICAgd2l0aEV4cHJlc3Npb24obm9kZS5sZWZ0LCAoanMuRXhwcmVzc2lvbiBsZWZ0KSB7CiAgICAgICAganMuU3RhdGVtZW50IGFzc2lnbkxlZnQgPSBpc1Jlc3VsdChsZWZ0KQogICAgICAgICAgICA/IG5ldyBqcy5CbG9jay5lbXB0eSgpCiAgICAgICAgICAgIDoganMuanMuc3RhdGVtZW50KCcjID0gIzsnLCBbcmVzdWx0LCBsZWZ0XSk7CiAgICAgICAgaWYgKG5vZGUub3AgPT0gIiYmIikgewogICAgICAgICAgYWRkU3RhdGVtZW50KGpzLmpzLnN0YXRlbWVudCgnaWYgKCMpIHsjfSBlbHNlICMnLCBbCiAgICAgICAgICAgIGxlZnQsCiAgICAgICAgICAgIGdvdG9BbmRCcmVhayh0aGVuTGFiZWwsIG5vZGUuc291cmNlSW5mb3JtYXRpb24pLAogICAgICAgICAgICBhc3NpZ25MZWZ0CiAgICAgICAgICBdKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFzc2VydChub2RlLm9wID09ICJ8fCIpOwogICAgICAgICAgYWRkU3RhdGVtZW50KGpzLmpzLnN0YXRlbWVudCgnaWYgKCMpIHsjfSBlbHNlICMnLCBbCiAgICAgICAgICAgIGxlZnQsCiAgICAgICAgICAgIGFzc2lnbkxlZnQsCiAgICAgICAgICAgIGdvdG9BbmRCcmVhayh0aGVuTGFiZWwsIG5vZGUuc291cmNlSW5mb3JtYXRpb24pCiAgICAgICAgICBdKSk7CiAgICAgICAgfQogICAgICB9LCBzdG9yZTogdHJ1ZSk7CiAgICAgIGFkZEdvdG8oam9pbkxhYmVsLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgYmVnaW5MYWJlbCh0aGVuTGFiZWwpOwogICAgICB3aXRoRXhwcmVzc2lvbihub2RlLnJpZ2h0LCAoanMuRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgICAgIGlmICghaXNSZXN1bHQodmFsdWUpKSB7CiAgICAgICAgICBhZGRTdGF0ZW1lbnQoanMuanMuc3RhdGVtZW50KCcjID0gIzsnLCBbcmVzdWx0LCB2YWx1ZV0pKTsKICAgICAgICB9CiAgICAgIH0sIHN0b3JlOiBmYWxzZSk7CiAgICAgIGJlZ2luTGFiZWwoam9pbkxhYmVsKTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICByZXR1cm4gd2l0aEV4cHJlc3Npb24yKG5vZGUubGVmdCwgbm9kZS5yaWdodCwKICAgICAgICAobGVmdCwgcmlnaHQpID0+IG5ldyBqcy5CaW5hcnkobm9kZS5vcCwgbGVmdCwgcmlnaHQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCbG9jayhqcy5CbG9jayBub2RlKSB7CiAgICBmb3IgKGpzLlN0YXRlbWVudCBzdGF0ZW1lbnQgaW4gbm9kZS5zdGF0ZW1lbnRzKSB7CiAgICAgIHZpc2l0U3RhdGVtZW50KHN0YXRlbWVudCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QnJlYWsoanMuQnJlYWsgbm9kZSkgewogICAganMuTm9kZSB0YXJnZXQgPSBhbmFseXNpcy50YXJnZXRzW25vZGVdOwogICAgaWYgKCFzaG91bGRUcmFuc2Zvcm0odGFyZ2V0KSkgewogICAgICBhZGRTdGF0ZW1lbnQobm9kZSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRyYW5zbGF0ZUp1bXAodGFyZ2V0LCBicmVha0xhYmVsc1t0YXJnZXRdLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIGpzLkV4cHJlc3Npb24gdmlzaXRDYWxsKGpzLkNhbGwgbm9kZSkgewogICAgYm9vbCBzdG9yZVRhcmdldCA9IG5vZGUuYXJndW1lbnRzLmFueShzaG91bGRUcmFuc2Zvcm0pOwogICAgcmV0dXJuIHdpdGhDYWxsVGFyZ2V0RXhwcmVzc2lvbihub2RlLnRhcmdldCwgKHRhcmdldCkgewogICAgICByZXR1cm4gd2l0aEV4cHJlc3Npb25zKG5vZGUuYXJndW1lbnRzLCAoTGlzdDxqcy5FeHByZXNzaW9uPiBhcmd1bWVudHMpIHsKICAgICAgICByZXR1cm4gbmV3IGpzLkNhbGwodGFyZ2V0LCBhcmd1bWVudHMpCiAgICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIH0pOwogICAgfSwgc3RvcmU6IHN0b3JlVGFyZ2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDYXNlKGpzLkNhc2Ugbm9kZSkgewogICAgcmV0dXJuIHVucmVhY2hhYmxlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENhdGNoKGpzLkNhdGNoIG5vZGUpIHsKICAgIHJldHVybiB1bnJlYWNoYWJsZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDb21tZW50KGpzLkNvbW1lbnQgbm9kZSkgewogICAgYWRkU3RhdGVtZW50KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAganMuRXhwcmVzc2lvbiB2aXNpdENvbmRpdGlvbmFsKGpzLkNvbmRpdGlvbmFsIG5vZGUpIHsKICAgIGlmICghc2hvdWxkVHJhbnNmb3JtKG5vZGUudGhlbikgJiYgIXNob3VsZFRyYW5zZm9ybShub2RlLm90aGVyd2lzZSkpIHsKICAgICAgcmV0dXJuIGpzLmpzKCcjID8gIyA6ICMnLCBbCiAgICAgICAgdmlzaXRFeHByZXNzaW9uKG5vZGUuY29uZGl0aW9uKSwKICAgICAgICB2aXNpdEV4cHJlc3Npb24obm9kZS50aGVuKSwKICAgICAgICB2aXNpdEV4cHJlc3Npb24obm9kZS5vdGhlcndpc2UpCiAgICAgIF0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0KICAgIGludCB0aGVuTGFiZWwgPSBuZXdMYWJlbCgidGhlbiIpOwogICAgaW50IGpvaW5MYWJlbCA9IG5ld0xhYmVsKCJqb2luIik7CiAgICBpbnQgZWxzZUxhYmVsID0gbmV3TGFiZWwoImVsc2UiKTsKICAgIHdpdGhFeHByZXNzaW9uKG5vZGUuY29uZGl0aW9uLCAoanMuRXhwcmVzc2lvbiBjb25kaXRpb24pIHsKICAgICAgYWRkU3RhdGVtZW50KGpzLmpzLnN0YXRlbWVudCgnIyA9ICMgPyAjIDogIzsnLAogICAgICAgICAgW2dvdG8sIGNvbmRpdGlvbiwganMubnVtYmVyKHRoZW5MYWJlbCksIGpzLm51bWJlcihlbHNlTGFiZWwpXSkpOwogICAgfSwgc3RvcmU6IGZhbHNlKTsKICAgIGFkZEJyZWFrKG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogICAgYmVnaW5MYWJlbCh0aGVuTGFiZWwpOwogICAgd2l0aEV4cHJlc3Npb24obm9kZS50aGVuLCAoanMuRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgICBpZiAoIWlzUmVzdWx0KHZhbHVlKSkgewogICAgICAgIGFkZFN0YXRlbWVudChqcy5qcy5zdGF0ZW1lbnQoJyMgPSAjOycsIFtyZXN1bHQsIHZhbHVlXSkpOwogICAgICB9CiAgICB9LCBzdG9yZTogZmFsc2UpOwogICAgYWRkR290byhqb2luTGFiZWwsIG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogICAgYmVnaW5MYWJlbChlbHNlTGFiZWwpOwogICAgd2l0aEV4cHJlc3Npb24obm9kZS5vdGhlcndpc2UsIChqcy5FeHByZXNzaW9uIHZhbHVlKSB7CiAgICAgIGlmICghaXNSZXN1bHQodmFsdWUpKSB7CiAgICAgICAgYWRkU3RhdGVtZW50KGpzLmpzLnN0YXRlbWVudCgnIyA9ICM7JywgW3Jlc3VsdCwgdmFsdWVdKSk7CiAgICAgIH0KICAgIH0sIHN0b3JlOiBmYWxzZSk7CiAgICBiZWdpbkxhYmVsKGpvaW5MYWJlbCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbnRpbnVlKGpzLkNvbnRpbnVlIG5vZGUpIHsKICAgIGpzLk5vZGUgdGFyZ2V0ID0gYW5hbHlzaXMudGFyZ2V0c1tub2RlXTsKICAgIGlmICghc2hvdWxkVHJhbnNmb3JtKHRhcmdldCkpIHsKICAgICAgYWRkU3RhdGVtZW50KG5vZGUpOwogICAgICByZXR1cm47CiAgICB9CiAgICB0cmFuc2xhdGVKdW1wKHRhcmdldCwgY29udGludWVMYWJlbHNbdGFyZ2V0XSwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICAvLy8gRW1pdHMgYSBicmVhayBzdGF0ZW1lbnQgdGhhdCBleGl0cyB0aGUgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuCiAgdm9pZCBhZGRCcmVhayhTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgaWYgKGluc2lkZVVudHJhbnNsYXRlZEJyZWFrYWJsZSkgewogICAgICBoYXNKdW1wVGhvdWdoT3V0ZXJMYWJlbCA9IHRydWU7CiAgICAgIGFkZFN0YXRlbWVudChuZXcganMuQnJlYWsob3V0ZXJMYWJlbE5hbWUpCiAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9IGVsc2UgewogICAgICBhZGRTdGF0ZW1lbnQobmV3IGpzLkJyZWFrKG51bGwpLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfQogIH0KCiAgLy8vIENvbW1vbiBjb2RlIGZvciBoYW5kbGluZyBicmVhaywgY29udGludWUsIHJldHVybi4KICAvLy8KICAvLy8gSXQgaXMgbmVjZXNzYXJ5IHRvIHJ1biBhbGwgbmVzdGluZyBmaW5hbGx5LWhhbmRsZXJzIGJldHdlZW4gdGhlIGp1bXAgYW5kCiAgLy8vIHRoZSB0YXJnZXQuIEZvciB0aGF0IFtuZXh0XSBpcyB1c2VkIGFzIGEgc3RhY2sgb2YgcGxhY2VzIHRvIGdvLgogIC8vLwogIC8vLyBTZWUgYWxzbyBbcmV3cml0ZUZ1bmN0aW9uXS4KICB2b2lkIHRyYW5zbGF0ZUp1bXAoCiAgICAgIGpzLk5vZGUgdGFyZ2V0LCBpbnQgdGFyZ2V0TGFiZWwsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICAvLyBDb21wdXRlIGEgc3RhY2sgb2YgYWxsIHRoZSAnZmluYWxseScgbm9kZXMgdGhhdCBtdXN0IGJlIHZpc2l0ZWQgYmVmb3JlCiAgICAvLyB0aGUganVtcC4KICAgIC8vIFRoZSBib3R0b20gb2YgdGhlIHN0YWNrIGlzIHRoZSBsYWJlbCB3aGVyZSB0aGUganVtcCBnb2VzIHRvLgogICAgTGlzdDxpbnQ+IGp1bXBTdGFjayA9IDxpbnQ+W107CiAgICBmb3IgKGpzLk5vZGUgbm9kZSBpbiBqdW1wVGFyZ2V0cy5yZXZlcnNlZCkgewogICAgICBpZiAoZmluYWxseUxhYmVsc1tub2RlXSAhPSBudWxsKSB7CiAgICAgICAganVtcFN0YWNrLmFkZChmaW5hbGx5TGFiZWxzW25vZGVdKTsKICAgICAgfSBlbHNlIGlmIChub2RlID09IHRhcmdldCkgewogICAgICAgIGp1bXBTdGFjay5hZGQodGFyZ2V0TGFiZWwpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIC8vIElnbm9yZSBvdGhlciBub2Rlcy4KICAgIH0KICAgIGp1bXBTdGFjayA9IGp1bXBTdGFjay5yZXZlcnNlZC50b0xpc3QoKTsKICAgIC8vIEFzIHRoZSBwcm9ncmFtIGp1bXBzIGRpcmVjdGx5IHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrLCBpdCBpcyB0YWtlbiBvZmYKICAgIC8vIG5vdy4KICAgIGludCBmaXJzdFRhcmdldCA9IGp1bXBTdGFjay5yZW1vdmVMYXN0KCk7CiAgICBpZiAoanVtcFN0YWNrLmlzTm90RW1wdHkpIHsKICAgICAganMuRXhwcmVzc2lvbiBqc0p1bXBTdGFjayA9IG5ldyBqcy5BcnJheUluaXRpYWxpemVyKAogICAgICAgICAganVtcFN0YWNrLm1hcCgoaW50IGxhYmVsKSA9PiBqcy5udW1iZXIobGFiZWwpKS50b0xpc3QoKSk7CiAgICAgIGFkZFN0YXRlbWVudChuZXcganMuRXhwcmVzc2lvblN0YXRlbWVudChqcy5qcygiIyA9ICMiLAogICAgICAgICAgW25leHQsIGpzSnVtcFN0YWNrXSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKSkpOwogICAgfQogICAgYWRkR290byhmaXJzdFRhcmdldCwgc291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERlZmF1bHQoanMuRGVmYXVsdCBub2RlKSA9PiB1bnJlYWNoYWJsZShub2RlKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERvKGpzLkRvIG5vZGUpIHsKICAgIGlmICghc2hvdWxkVHJhbnNmb3JtKG5vZGUpKSB7CiAgICAgIGJvb2wgb2xkSW5zaWRlVW50cmFuc2xhdGVkQnJlYWthYmxlID0gaW5zaWRlVW50cmFuc2xhdGVkQnJlYWthYmxlOwogICAgICBpbnNpZGVVbnRyYW5zbGF0ZWRCcmVha2FibGUgPSB0cnVlOwogICAgICBhZGRTdGF0ZW1lbnQoanMuanMuc3RhdGVtZW50KCdkbyB7I30gd2hpbGUgKCMpJywKICAgICAgICAgIFt0cmFuc2xhdGVUb1N0YXRlbWVudChub2RlLmJvZHkpLCB2aXNpdEV4cHJlc3Npb24obm9kZS5jb25kaXRpb24pXSkpOwogICAgICBpbnNpZGVVbnRyYW5zbGF0ZWRCcmVha2FibGUgPSBvbGRJbnNpZGVVbnRyYW5zbGF0ZWRCcmVha2FibGU7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGludCBzdGFydExhYmVsID0gbmV3TGFiZWwoImRvIGJvZHkiKTsKCiAgICBpbnQgY29udGludWVMYWJlbCA9IG5ld0xhYmVsKCJkbyBjb25kaXRpb24iKTsKICAgIGNvbnRpbnVlTGFiZWxzW25vZGVdID0gY29udGludWVMYWJlbDsKCiAgICBpbnQgYWZ0ZXJMYWJlbCA9IG5ld0xhYmVsKCJhZnRlciBkbyIpOwogICAgYnJlYWtMYWJlbHNbbm9kZV0gPSBhZnRlckxhYmVsOwoKICAgIGJlZ2luTGFiZWwoc3RhcnRMYWJlbCk7CgogICAganVtcFRhcmdldHMuYWRkKG5vZGUpOwogICAgdmlzaXRTdGF0ZW1lbnQobm9kZS5ib2R5KTsKICAgIGp1bXBUYXJnZXRzLnJlbW92ZUxhc3QoKTsKCiAgICBiZWdpbkxhYmVsKGNvbnRpbnVlTGFiZWwpOwogICAgd2l0aEV4cHJlc3Npb24obm9kZS5jb25kaXRpb24sIChqcy5FeHByZXNzaW9uIGNvbmRpdGlvbikgewogICAgICBhZGRTdGF0ZW1lbnQoanMuanMuc3RhdGVtZW50KCdpZiAoIykgIycsCiAgICAgICAgICBbY29uZGl0aW9uLCBnb3RvQW5kQnJlYWsoc3RhcnRMYWJlbCwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbildKSk7CiAgICB9LCBzdG9yZTogZmFsc2UpOwogICAgYmVnaW5MYWJlbChhZnRlckxhYmVsKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRFbXB0eVN0YXRlbWVudChqcy5FbXB0eVN0YXRlbWVudCBub2RlKSB7CiAgICBhZGRTdGF0ZW1lbnQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChqcy5FeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpIHsKICAgIHZpc2l0RXhwcmVzc2lvbklnbm9yZVJlc3VsdChub2RlLmV4cHJlc3Npb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZvcihqcy5Gb3Igbm9kZSkgewogICAgaWYgKCFzaG91bGRUcmFuc2Zvcm0obm9kZSkpIHsKICAgICAgYm9vbCBvbGRJbnNpZGVVbnRyYW5zbGF0ZWQgPSBpbnNpZGVVbnRyYW5zbGF0ZWRCcmVha2FibGU7CiAgICAgIGluc2lkZVVudHJhbnNsYXRlZEJyZWFrYWJsZSA9IHRydWU7CiAgICAgIC8vIE5vdGUgdGhhdCBub2RlLmluaXQsIG5vZGUuY29uZGl0aW9uLCBub2RlLnVwZGF0ZSBhbGwgY2FuIGJlIG51bGwsIGJ1dAogICAgICAvLyB3aXRoRXhwcmVzc2lvbnMgaGFuZGxlcyB0aGF0LgogICAgICB3aXRoRXhwcmVzc2lvbnMoW25vZGUuaW5pdCwgbm9kZS5jb25kaXRpb24sIG5vZGUudXBkYXRlXSwKICAgICAgICAgIChMaXN0PGpzLkV4cHJlc3Npb24+IHRyYW5zZm9ybWVkKSB7CiAgICAgICAgYWRkU3RhdGVtZW50KG5ldyBqcy5Gb3IodHJhbnNmb3JtZWRbMF0sIHRyYW5zZm9ybWVkWzFdLCB0cmFuc2Zvcm1lZFsyXSwKICAgICAgICAgICAgdHJhbnNsYXRlVG9TdGF0ZW1lbnQobm9kZS5ib2R5KSkpOwogICAgICB9KTsKICAgICAgaW5zaWRlVW50cmFuc2xhdGVkQnJlYWthYmxlID0gb2xkSW5zaWRlVW50cmFuc2xhdGVkOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKG5vZGUuaW5pdCAhPSBudWxsKSB7CiAgICAgIHZpc2l0RXhwcmVzc2lvbklnbm9yZVJlc3VsdChub2RlLmluaXQpOwogICAgfQogICAgaW50IHN0YXJ0TGFiZWwgPSBuZXdMYWJlbCgiZm9yIGNvbmRpdGlvbiIpOwogICAgLy8gSWYgdGhlcmUgaXMgbm8gdXBkYXRlLCBjb250aW51aW5nIHRoZSBsb29wIGlzIHRoZSBzYW1lIGFzIGdvaW5nIHRvIHRoZQogICAgLy8gc3RhcnQuCiAgICBpbnQgY29udGludWVMYWJlbCA9CiAgICAgICAgKG5vZGUudXBkYXRlID09IG51bGwpID8gc3RhcnRMYWJlbCA6IG5ld0xhYmVsKCJmb3IgdXBkYXRlIik7CiAgICBjb250aW51ZUxhYmVsc1tub2RlXSA9IGNvbnRpbnVlTGFiZWw7CiAgICBpbnQgYWZ0ZXJMYWJlbCA9IG5ld0xhYmVsKCJhZnRlciBmb3IiKTsKICAgIGJyZWFrTGFiZWxzW25vZGVdID0gYWZ0ZXJMYWJlbDsKICAgIGJlZ2luTGFiZWwoc3RhcnRMYWJlbCk7CiAgICBqcy5FeHByZXNzaW9uIGNvbmRpdGlvbiA9IG5vZGUuY29uZGl0aW9uOwogICAgaWYgKGNvbmRpdGlvbiA9PSBudWxsIHx8CiAgICAgICAgKGNvbmRpdGlvbiBpcyBqcy5MaXRlcmFsQm9vbCAmJiBjb25kaXRpb24udmFsdWUgPT0gdHJ1ZSkpIHsKICAgICAgYWRkU3RhdGVtZW50KG5ldyBqcy5Db21tZW50KCJ0cml2aWFsIGNvbmRpdGlvbiIpKTsKICAgIH0gZWxzZSB7CiAgICAgIHdpdGhFeHByZXNzaW9uKGNvbmRpdGlvbiwgKGpzLkV4cHJlc3Npb24gY29uZGl0aW9uKSB7CiAgICAgICAgYWRkU3RhdGVtZW50KG5ldyBqcy5JZi5ub0Vsc2UobmV3IGpzLlByZWZpeCgiISIsIGNvbmRpdGlvbiksCiAgICAgICAgICAgIGdvdG9BbmRCcmVhayhhZnRlckxhYmVsLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uKSkpOwogICAgICB9LCBzdG9yZTogZmFsc2UpOwogICAgfQogICAganVtcFRhcmdldHMuYWRkKG5vZGUpOwogICAgdmlzaXRTdGF0ZW1lbnQobm9kZS5ib2R5KTsKICAgIGp1bXBUYXJnZXRzLnJlbW92ZUxhc3QoKTsKICAgIGlmIChub2RlLnVwZGF0ZSAhPSBudWxsKSB7CiAgICAgIGJlZ2luTGFiZWwoY29udGludWVMYWJlbCk7CiAgICAgIHZpc2l0RXhwcmVzc2lvbklnbm9yZVJlc3VsdChub2RlLnVwZGF0ZSk7CiAgICB9CiAgICBhZGRHb3RvKHN0YXJ0TGFiZWwsIG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogICAgYmVnaW5MYWJlbChhZnRlckxhYmVsKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGb3JJbihqcy5Gb3JJbiBub2RlKSB7CiAgICAvLyBUaGUgZGFydCBvdXRwdXQgY3VycmVudGx5IG5ldmVyIHVzZXMgZm9yLWluIGxvb3BzLgogICAgdGhyb3cgIkphdmFzY3JpcHQgZm9yLWluIG5vdCBpbXBsZW1lbnRlZCB5ZXQgaW4gdGhlIGF3YWl0IHRyYW5zZm9ybWF0aW9uIjsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKGpzLkZ1bmN0aW9uRGVjbGFyYXRpb24gbm9kZSkgewogICAgdW5zdXBwb3J0ZWQobm9kZSk7CiAgfQoKICBMaXN0PGpzLlN0YXRlbWVudD4gdHJhbnNsYXRlVG9TdGF0ZW1lbnRTZXF1ZW5jZShqcy5TdGF0ZW1lbnQgbm9kZSkgewogICAgYXNzZXJ0KCFzaG91bGRUcmFuc2Zvcm0obm9kZSkpOwogICAgTGlzdDxqcy5TdGF0ZW1lbnQ+IG9sZEJ1ZmZlciA9IGN1cnJlbnRTdGF0ZW1lbnRCdWZmZXI7CiAgICBjdXJyZW50U3RhdGVtZW50QnVmZmVyID0gPGpzLlN0YXRlbWVudD5bXTsKICAgIExpc3Q8anMuU3RhdGVtZW50PiByZXN1bHRCdWZmZXIgPSBjdXJyZW50U3RhdGVtZW50QnVmZmVyOwogICAgdmlzaXRTdGF0ZW1lbnQobm9kZSk7CiAgICBjdXJyZW50U3RhdGVtZW50QnVmZmVyID0gb2xkQnVmZmVyOwogICAgcmV0dXJuIHJlc3VsdEJ1ZmZlcjsKICB9CgogIGpzLlN0YXRlbWVudCB0cmFuc2xhdGVUb1N0YXRlbWVudChqcy5TdGF0ZW1lbnQgbm9kZSkgewogICAgTGlzdDxqcy5TdGF0ZW1lbnQ+IHN0YXRlbWVudHMgPSB0cmFuc2xhdGVUb1N0YXRlbWVudFNlcXVlbmNlKG5vZGUpOwogICAgaWYgKHN0YXRlbWVudHMubGVuZ3RoID09IDEpIHJldHVybiBzdGF0ZW1lbnRzLnNpbmdsZTsKICAgIHJldHVybiBuZXcganMuQmxvY2soc3RhdGVtZW50cyk7CiAgfQoKICBqcy5CbG9jayB0cmFuc2xhdGVUb0Jsb2NrKGpzLlN0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gbmV3IGpzLkJsb2NrKHRyYW5zbGF0ZVRvU3RhdGVtZW50U2VxdWVuY2Uobm9kZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdElmKGpzLklmIG5vZGUpIHsKICAgIGlmICghc2hvdWxkVHJhbnNmb3JtKG5vZGUudGhlbikgJiYgIXNob3VsZFRyYW5zZm9ybShub2RlLm90aGVyd2lzZSkpIHsKICAgICAgd2l0aEV4cHJlc3Npb24obm9kZS5jb25kaXRpb24sIChqcy5FeHByZXNzaW9uIGNvbmRpdGlvbikgewogICAgICAgIGpzLlN0YXRlbWVudCB0cmFuc2xhdGVkVGhlbiA9IHRyYW5zbGF0ZVRvU3RhdGVtZW50KG5vZGUudGhlbik7CiAgICAgICAganMuU3RhdGVtZW50IHRyYW5zbGF0ZWRFbHNlID0gdHJhbnNsYXRlVG9TdGF0ZW1lbnQobm9kZS5vdGhlcndpc2UpOwogICAgICAgIGFkZFN0YXRlbWVudChuZXcganMuSWYoY29uZGl0aW9uLCB0cmFuc2xhdGVkVGhlbiwgdHJhbnNsYXRlZEVsc2UpKTsKICAgICAgfSwgc3RvcmU6IGZhbHNlKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaW50IHRoZW5MYWJlbCA9IG5ld0xhYmVsKCJ0aGVuIik7CiAgICBpbnQgam9pbkxhYmVsID0gbmV3TGFiZWwoImpvaW4iKTsKICAgIGludCBlbHNlTGFiZWwgPQogICAgICAgIChub2RlLm90aGVyd2lzZSBpcyBqcy5FbXB0eVN0YXRlbWVudCkgPyBqb2luTGFiZWwgOiBuZXdMYWJlbCgiZWxzZSIpOwoKICAgIHdpdGhFeHByZXNzaW9uKG5vZGUuY29uZGl0aW9uLCAoanMuRXhwcmVzc2lvbiBjb25kaXRpb24pIHsKICAgICAgYWRkRXhwcmVzc2lvblN0YXRlbWVudChuZXcganMuQXNzaWdubWVudCgKICAgICAgICAgIGdvdG8sCiAgICAgICAgICBuZXcganMuQ29uZGl0aW9uYWwoCiAgICAgICAgICAgICAgY29uZGl0aW9uLCBqcy5udW1iZXIodGhlbkxhYmVsKSwganMubnVtYmVyKGVsc2VMYWJlbCkpKSk7CiAgICB9LCBzdG9yZTogZmFsc2UpOwogICAgYWRkQnJlYWsobm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICBiZWdpbkxhYmVsKHRoZW5MYWJlbCk7CiAgICB2aXNpdFN0YXRlbWVudChub2RlLnRoZW4pOwogICAgaWYgKG5vZGUub3RoZXJ3aXNlIGlzISBqcy5FbXB0eVN0YXRlbWVudCkgewogICAgICBhZGRHb3RvKGpvaW5MYWJlbCwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIGJlZ2luTGFiZWwoZWxzZUxhYmVsKTsKICAgICAgdmlzaXRTdGF0ZW1lbnQobm9kZS5vdGhlcndpc2UpOwogICAgfQogICAgYmVnaW5MYWJlbChqb2luTGFiZWwpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRJbnRlcnBvbGF0ZWRFeHByZXNzaW9uKGpzLkludGVycG9sYXRlZEV4cHJlc3Npb24gbm9kZSkgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRJbnRlcnBvbGF0ZWREZWNsYXJhdGlvbihqcy5JbnRlcnBvbGF0ZWREZWNsYXJhdGlvbiBub2RlKSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEludGVycG9sYXRlZExpdGVyYWwoanMuSW50ZXJwb2xhdGVkTGl0ZXJhbCBub2RlKSA9PiB1bnN1cHBvcnRlZChub2RlKTsKCiAgQG92ZXJyaWRlCiAgdmlzaXRJbnRlcnBvbGF0ZWRQYXJhbWV0ZXIoanMuSW50ZXJwb2xhdGVkUGFyYW1ldGVyIG5vZGUpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0SW50ZXJwb2xhdGVkU2VsZWN0b3IoanMuSW50ZXJwb2xhdGVkU2VsZWN0b3Igbm9kZSkgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRJbnRlcnBvbGF0ZWRTdGF0ZW1lbnQoanMuSW50ZXJwb2xhdGVkU3RhdGVtZW50IG5vZGUpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMYWJlbGVkU3RhdGVtZW50KGpzLkxhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgewogICAgaWYgKCFzaG91bGRUcmFuc2Zvcm0obm9kZSkpIHsKICAgICAgYWRkU3RhdGVtZW50KAogICAgICAgICAgbmV3IGpzLkxhYmVsZWRTdGF0ZW1lbnQobm9kZS5sYWJlbCwgdHJhbnNsYXRlVG9TdGF0ZW1lbnQobm9kZS5ib2R5KSkpOwogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBgY29udGludWUgbGFiZWxgIGlzIHJlYWxseSBjb250aW51aW5nIHRoZSBuZXN0ZWQgbG9vcC4KICAgIC8vIFRoaXMgaXMgc2V0IHVwIGluIFtQcmVUcmFuc2xhdGlvbkFuYWx5c2lzLnZpc2l0Q29udGludWVdLgogICAgLy8gSGVyZSB3ZSBvbmx5IG5lZWQgYSBicmVha0xhYmVsOgogICAgaW50IGJyZWFrTGFiZWwgPSBuZXdMYWJlbCgiYnJlYWsgJHtub2RlLmxhYmVsfSIpOwogICAgYnJlYWtMYWJlbHNbbm9kZV0gPSBicmVha0xhYmVsOwoKICAgIGp1bXBUYXJnZXRzLmFkZChub2RlKTsKICAgIHZpc2l0U3RhdGVtZW50KG5vZGUuYm9keSk7CiAgICBqdW1wVGFyZ2V0cy5yZW1vdmVMYXN0KCk7CiAgICBiZWdpbkxhYmVsKGJyZWFrTGFiZWwpOwogIH0KCiAgQG92ZXJyaWRlCiAganMuRXhwcmVzc2lvbiB2aXNpdExpdGVyYWxCb29sKGpzLkxpdGVyYWxCb29sIG5vZGUpID0+IG5vZGU7CgogIEBvdmVycmlkZQogIHZpc2l0TGl0ZXJhbEV4cHJlc3Npb24oanMuTGl0ZXJhbEV4cHJlc3Npb24gbm9kZSkgPT4gdW5zdXBwb3J0ZWQobm9kZSk7CgogIEBvdmVycmlkZQogIGpzLkV4cHJlc3Npb24gdmlzaXRMaXRlcmFsTnVsbChqcy5MaXRlcmFsTnVsbCBub2RlKSA9PiBub2RlOwoKICBAb3ZlcnJpZGUKICBqcy5FeHByZXNzaW9uIHZpc2l0TGl0ZXJhbE51bWJlcihqcy5MaXRlcmFsTnVtYmVyIG5vZGUpID0+IG5vZGU7CgogIEBvdmVycmlkZQogIHZpc2l0TGl0ZXJhbFN0YXRlbWVudChqcy5MaXRlcmFsU3RhdGVtZW50IG5vZGUpID0+IHVuc3VwcG9ydGVkKG5vZGUpOwoKICBAb3ZlcnJpZGUKICBqcy5FeHByZXNzaW9uIHZpc2l0TGl0ZXJhbFN0cmluZyhqcy5MaXRlcmFsU3RyaW5nIG5vZGUpID0+IG5vZGU7CgogIEBvdmVycmlkZQogIGpzLkV4cHJlc3Npb24gdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKGpzLlN0cmluZ0NvbmNhdGVuYXRpb24gbm9kZSkgPT4gbm9kZTsKCiAgQG92ZXJyaWRlCiAganMuTmFtZSB2aXNpdE5hbWUoanMuTmFtZSBub2RlKSA9PiBub2RlOwoKICBAb3ZlcnJpZGUKICBqcy5QYXJlbnRoZXNlcyB2aXNpdFBhcmVudGhlc2VzKGpzLlBhcmVudGhlc2VzIG5vZGUpIHsKICAgIHVuc3VwcG9ydGVkKG5vZGUpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdE5hbWVkRnVuY3Rpb24oanMuTmFtZWRGdW5jdGlvbiBub2RlKSB7CiAgICB1bnN1cHBvcnRlZChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIGpzLkV4cHJlc3Npb24gdmlzaXREZWZlcnJlZEV4cHJlc3Npb24oanMuRGVmZXJyZWRFeHByZXNzaW9uIG5vZGUpID0+IG5vZGU7CgogIEBvdmVycmlkZQogIGpzLkV4cHJlc3Npb24gdmlzaXREZWZlcnJlZE51bWJlcihqcy5EZWZlcnJlZE51bWJlciBub2RlKSA9PiBub2RlOwoKICBAb3ZlcnJpZGUKICBqcy5FeHByZXNzaW9uIHZpc2l0RGVmZXJyZWRTdHJpbmcoanMuRGVmZXJyZWRTdHJpbmcgbm9kZSkgPT4gbm9kZTsKCiAgQG92ZXJyaWRlCiAganMuRXhwcmVzc2lvbiB2aXNpdE5ldyhqcy5OZXcgbm9kZSkgewogICAgYm9vbCBzdG9yZVRhcmdldCA9IG5vZGUuYXJndW1lbnRzLmFueShzaG91bGRUcmFuc2Zvcm0pOwogICAgcmV0dXJuIHdpdGhDYWxsVGFyZ2V0RXhwcmVzc2lvbihub2RlLnRhcmdldCwgKHRhcmdldCkgewogICAgICByZXR1cm4gd2l0aEV4cHJlc3Npb25zKG5vZGUuYXJndW1lbnRzLCAoTGlzdDxqcy5FeHByZXNzaW9uPiBhcmd1bWVudHMpIHsKICAgICAgICByZXR1cm4gbmV3IGpzLk5ldyh0YXJnZXQsIGFyZ3VtZW50cyk7CiAgICAgIH0pOwogICAgfSwgc3RvcmU6IHN0b3JlVGFyZ2V0KTsKICB9CgogIEBvdmVycmlkZQogIGpzLkV4cHJlc3Npb24gdmlzaXRPYmplY3RJbml0aWFsaXplcihqcy5PYmplY3RJbml0aWFsaXplciBub2RlKSB7CiAgICByZXR1cm4gd2l0aEV4cHJlc3Npb25zKAogICAgICAgIG5vZGUucHJvcGVydGllcy5tYXAoKGpzLlByb3BlcnR5IHByb3BlcnR5KSA9PiBwcm9wZXJ0eS52YWx1ZSkudG9MaXN0KCksCiAgICAgICAgKExpc3Q8anMuTm9kZT4gdmFsdWVzKSB7CiAgICAgIExpc3Q8anMuUHJvcGVydHk+IHByb3BlcnRpZXMgPSBuZXcgTGlzdC5nZW5lcmF0ZSh2YWx1ZXMubGVuZ3RoLCAoaW50IGkpIHsKICAgICAgICByZXR1cm4gbmV3IGpzLlByb3BlcnR5KG5vZGUucHJvcGVydGllc1tpXS5uYW1lLCB2YWx1ZXNbaV0pOwogICAgICB9KTsKICAgICAgcmV0dXJuIG5ldyBqcy5PYmplY3RJbml0aWFsaXplcihwcm9wZXJ0aWVzKTsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRQYXJhbWV0ZXIoanMuUGFyYW1ldGVyIG5vZGUpID0+IHVucmVhY2hhYmxlKG5vZGUpOwoKICBAb3ZlcnJpZGUKICBqcy5FeHByZXNzaW9uIHZpc2l0UG9zdGZpeChqcy5Qb3N0Zml4IG5vZGUpIHsKICAgIGlmIChub2RlLm9wID09ICIrKyIgfHwgbm9kZS5vcCA9PSAiLS0iKSB7CiAgICAgIGpzLkV4cHJlc3Npb24gYXJndW1lbnQgPSBub2RlLmFyZ3VtZW50OwogICAgICBpZiAoYXJndW1lbnQgaXMganMuVmFyaWFibGVVc2UpIHsKICAgICAgICByZXR1cm4gbmV3IGpzLlBvc3RmaXgobm9kZS5vcCwgdmlzaXRFeHByZXNzaW9uKGFyZ3VtZW50KSk7CiAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnQgaXMganMuUHJvcGVydHlBY2Nlc3MpIHsKICAgICAgICByZXR1cm4gd2l0aEV4cHJlc3Npb24yKGFyZ3VtZW50LnJlY2VpdmVyLCBhcmd1bWVudC5zZWxlY3RvciwKICAgICAgICAgICAgKHJlY2VpdmVyLCBzZWxlY3RvcikgewogICAgICAgICAgcmV0dXJuIG5ldyBqcy5Qb3N0Zml4KAogICAgICAgICAgICAgIG5vZGUub3AsIG5ldyBqcy5Qcm9wZXJ0eUFjY2VzcyhyZWNlaXZlciwgc2VsZWN0b3IpKTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyAiVW5leHBlY3RlZCBwb3N0Zml4ICR7bm9kZS5vcH0gIgogICAgICAgICAgICAib3BlcmF0b3IgYXJndW1lbnQgJHtub2RlLmFyZ3VtZW50fSI7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB3aXRoRXhwcmVzc2lvbihub2RlLmFyZ3VtZW50LAogICAgICAgIChqcy5FeHByZXNzaW9uIGFyZ3VtZW50KSA9PiBuZXcganMuUG9zdGZpeChub2RlLm9wLCBhcmd1bWVudCksCiAgICAgICAgc3RvcmU6IGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIGpzLkV4cHJlc3Npb24gdmlzaXRQcmVmaXgoanMuUHJlZml4IG5vZGUpIHsKICAgIGlmIChub2RlLm9wID09ICIrKyIgfHwgbm9kZS5vcCA9PSAiLS0iKSB7CiAgICAgIGpzLkV4cHJlc3Npb24gYXJndW1lbnQgPSBub2RlLmFyZ3VtZW50OwogICAgICBpZiAoYXJndW1lbnQgaXMganMuVmFyaWFibGVVc2UpIHsKICAgICAgICByZXR1cm4gbmV3IGpzLlByZWZpeChub2RlLm9wLCB2aXNpdEV4cHJlc3Npb24oYXJndW1lbnQpKTsKICAgICAgfSBlbHNlIGlmIChhcmd1bWVudCBpcyBqcy5Qcm9wZXJ0eUFjY2VzcykgewogICAgICAgIHJldHVybiB3aXRoRXhwcmVzc2lvbjIoYXJndW1lbnQucmVjZWl2ZXIsIGFyZ3VtZW50LnNlbGVjdG9yLAogICAgICAgICAgICAocmVjZWl2ZXIsIHNlbGVjdG9yKSB7CiAgICAgICAgICByZXR1cm4gbmV3IGpzLlByZWZpeCgKICAgICAgICAgICAgICBub2RlLm9wLCBuZXcganMuUHJvcGVydHlBY2Nlc3MocmVjZWl2ZXIsIHNlbGVjdG9yKSk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgIlVuZXhwZWN0ZWQgcHJlZml4ICR7bm9kZS5vcH0gb3BlcmF0b3IgIgogICAgICAgICAgICAiYXJndW1lbnQgJHtub2RlLmFyZ3VtZW50fSI7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB3aXRoRXhwcmVzc2lvbihub2RlLmFyZ3VtZW50LAogICAgICAgIChqcy5FeHByZXNzaW9uIGFyZ3VtZW50KSA9PiBuZXcganMuUHJlZml4KG5vZGUub3AsIGFyZ3VtZW50KSwKICAgICAgICBzdG9yZTogZmFsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRQcm9ncmFtKGpzLlByb2dyYW0gbm9kZSkgPT4gdW5zdXBwb3J0ZWQobm9kZSk7CgogIEBvdmVycmlkZQogIGpzLlByb3BlcnR5IHZpc2l0UHJvcGVydHkoanMuUHJvcGVydHkgbm9kZSkgewogICAgcmV0dXJuIHdpdGhFeHByZXNzaW9uKAogICAgICAgIG5vZGUudmFsdWUsIChqcy5FeHByZXNzaW9uIHZhbHVlKSA9PiBuZXcganMuUHJvcGVydHkobm9kZS5uYW1lLCB2YWx1ZSksCiAgICAgICAgc3RvcmU6IGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIGpzLkV4cHJlc3Npb24gdmlzaXRSZWdFeHBMaXRlcmFsKGpzLlJlZ0V4cExpdGVyYWwgbm9kZSkgPT4gbm9kZTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFJldHVybihqcy5SZXR1cm4gbm9kZSkgewogICAganMuTm9kZSB0YXJnZXQgPSBhbmFseXNpcy50YXJnZXRzW25vZGVdOwogICAgaWYgKG5vZGUudmFsdWUgIT0gbnVsbCkgewogICAgICBpZiAoaXNTeW5jU3RhciB8fCBpc0FzeW5jU3RhcikgewogICAgICAgIC8vIEV2ZW4gdGhvdWdoIGByZXR1cm4gZXhwcjtgIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBkYXJ0IHN5bmMqIGFuZAogICAgICAgIC8vIGFzeW5jKiAgY29kZSwgdGhlIGJhY2tlbmQgc29tZXRpbWVzIGdlbmVyYXRlcyBjb2RlIGxpa2UgdGhpcywgYnV0CiAgICAgICAgLy8gb25seSB3aGVuIGl0IGlzIGtub3duIHRoYXQgdGhlICdleHByJyB0aHJvd3MsIGFuZCB0aGUgcmV0dXJuIGlzIGp1c3QKICAgICAgICAvLyB0byB0ZWxsIHRoZSBKYXZhU2NyaXB0IFZNIHRoYXQgdGhlIGNvZGUgd29uJ3QgY29udGludWUgaGVyZS4KICAgICAgICAvLyBJdCBpcyB0aGVyZWZvcmUgaW50ZXJwcmV0ZWQgYXMgYGV4cHI7IHJldHVybjtgCiAgICAgICAgdmlzaXRFeHByZXNzaW9uSWdub3JlUmVzdWx0KG5vZGUudmFsdWUpOwogICAgICB9IGVsc2UgewogICAgICAgIHdpdGhFeHByZXNzaW9uKG5vZGUudmFsdWUsIChqcy5FeHByZXNzaW9uIHZhbHVlKSB7CiAgICAgICAgICBhZGRTdGF0ZW1lbnQoanMuanMKICAgICAgICAgICAgICAuc3RhdGVtZW50KCIjID0gIzsiLCBbcmV0dXJuVmFsdWUsIHZhbHVlXSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKAogICAgICAgICAgICAgICAgICBub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICAgICAgfSwgc3RvcmU6IGZhbHNlKTsKICAgICAgfQogICAgfQogICAgdHJhbnNsYXRlSnVtcCh0YXJnZXQsIGV4aXRMYWJlbCwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3dpdGNoKGpzLlN3aXRjaCBub2RlKSB7CiAgICBpZiAoIW5vZGUuY2FzZXMuYW55KHNob3VsZFRyYW5zZm9ybSkpIHsKICAgICAgLy8gSWYgb25seSB0aGUga2V5IGhhcyBhbiBhd2FpdCwgdHJhbnNsYXRpb24gY2FuIGJlIHNpbXBsaWZpZWQuCiAgICAgIGJvb2wgb2xkSW5zaWRlVW50cmFuc2xhdGVkID0gaW5zaWRlVW50cmFuc2xhdGVkQnJlYWthYmxlOwogICAgICBpbnNpZGVVbnRyYW5zbGF0ZWRCcmVha2FibGUgPSB0cnVlOwogICAgICB3aXRoRXhwcmVzc2lvbihub2RlLmtleSwgKGpzLkV4cHJlc3Npb24ga2V5KSB7CiAgICAgICAgTGlzdDxqcy5Td2l0Y2hDbGF1c2U+IGNhc2VzID0gbm9kZS5jYXNlcy5tYXAoKGpzLlN3aXRjaENsYXVzZSBjbGF1c2UpIHsKICAgICAgICAgIGlmIChjbGF1c2UgaXMganMuQ2FzZSkgewogICAgICAgICAgICByZXR1cm4gbmV3IGpzLkNhc2UoCiAgICAgICAgICAgICAgICBjbGF1c2UuZXhwcmVzc2lvbiwgdHJhbnNsYXRlVG9CbG9jayhjbGF1c2UuYm9keSkpOwogICAgICAgICAgfSBlbHNlIGlmIChjbGF1c2UgaXMganMuRGVmYXVsdCkgewogICAgICAgICAgICByZXR1cm4gbmV3IGpzLkRlZmF1bHQodHJhbnNsYXRlVG9CbG9jayhjbGF1c2UuYm9keSkpOwogICAgICAgICAgfQogICAgICAgIH0pLnRvTGlzdCgpOwogICAgICAgIGFkZFN0YXRlbWVudChuZXcganMuU3dpdGNoKGtleSwgY2FzZXMpKTsKICAgICAgfSwgc3RvcmU6IGZhbHNlKTsKICAgICAgaW5zaWRlVW50cmFuc2xhdGVkQnJlYWthYmxlID0gb2xkSW5zaWRlVW50cmFuc2xhdGVkOwogICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgYmVmb3JlID0gbmV3TGFiZWwoInN3aXRjaCIpOwogICAgaW50IGFmdGVyID0gbmV3TGFiZWwoImFmdGVyIHN3aXRjaCIpOwogICAgYnJlYWtMYWJlbHNbbm9kZV0gPSBhZnRlcjsKCiAgICBiZWdpbkxhYmVsKGJlZm9yZSk7CiAgICBMaXN0PGludD4gbGFiZWxzID0gbmV3IExpc3Q8aW50Pihub2RlLmNhc2VzLmxlbmd0aCk7CgogICAgYm9vbCBhbnlDYXNlRXhwcmVzc2lvblRyYW5zZm9ybWVkID0gbm9kZS5jYXNlcy5hbnkoCiAgICAgICAgKGpzLlN3aXRjaENsYXVzZSB4KSA9PiB4IGlzIGpzLkNhc2UgJiYgc2hvdWxkVHJhbnNmb3JtKHguZXhwcmVzc2lvbikpOwogICAgaWYgKGFueUNhc2VFeHByZXNzaW9uVHJhbnNmb3JtZWQpIHsKICAgICAgaW50IGRlZmF1bHRJbmRleCA9IG51bGw7IC8vIE51bGwgbWVhbnMgbm8gZGVmYXVsdCB3YXMgZm91bmQuCiAgICAgIC8vIElmIHRoZXJlIGlzIGFuIGF3YWl0IGluIG9uZSBvZiB0aGUga2V5cywgYSBjaGFpbiBvZiBpZnMgaGFzIHRvIGJlIHVzZWQuCgogICAgICB3aXRoRXhwcmVzc2lvbihub2RlLmtleSwgKGpzLkV4cHJlc3Npb24ga2V5KSB7CiAgICAgICAgaW50IGkgPSAwOwogICAgICAgIGZvciAoanMuU3dpdGNoQ2xhdXNlIGNsYXVzZSBpbiBub2RlLmNhc2VzKSB7CiAgICAgICAgICBpZiAoY2xhdXNlIGlzIGpzLkRlZmF1bHQpIHsKICAgICAgICAgICAgLy8gVGhlIGdvdG8gZm9yIHRoZSBkZWZhdWx0IGNhc2UgaXMgYWRkZWQgYWZ0ZXIgYWxsIG5vbi1kZWZhdWx0CiAgICAgICAgICAgIC8vIGNsYXVzZXMgaGF2ZSBiZWVuIGhhbmRsZWQuCiAgICAgICAgICAgIGRlZmF1bHRJbmRleCA9IGk7CiAgICAgICAgICAgIGxhYmVsc1tpXSA9IG5ld0xhYmVsKCJkZWZhdWx0Iik7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfSBlbHNlIGlmIChjbGF1c2UgaXMganMuQ2FzZSkgewogICAgICAgICAgICBsYWJlbHNbaV0gPSBuZXdMYWJlbCgiY2FzZSIpOwogICAgICAgICAgICB3aXRoRXhwcmVzc2lvbihjbGF1c2UuZXhwcmVzc2lvbiwgKGV4cHJlc3Npb24pIHsKICAgICAgICAgICAgICBhZGRTdGF0ZW1lbnQobmV3IGpzLklmLm5vRWxzZSgKICAgICAgICAgICAgICAgICAgbmV3IGpzLkJpbmFyeSgiPT09Iiwga2V5LCBleHByZXNzaW9uKSwKICAgICAgICAgICAgICAgICAgZ290b0FuZEJyZWFrKGxhYmVsc1tpXSwgY2xhdXNlLnNvdXJjZUluZm9ybWF0aW9uKSkpOwogICAgICAgICAgICB9LCBzdG9yZTogZmFsc2UpOwogICAgICAgICAgfQogICAgICAgICAgaSsrOwogICAgICAgIH0KICAgICAgfSwgc3RvcmU6IHRydWUpOwoKICAgICAgaWYgKGRlZmF1bHRJbmRleCA9PSBudWxsKSB7CiAgICAgICAgYWRkR290byhhZnRlciwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWRkR290byhsYWJlbHNbZGVmYXVsdEluZGV4XSwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGJvb2wgaGFzRGVmYXVsdCA9IGZhbHNlOwogICAgICBpbnQgaSA9IDA7CiAgICAgIExpc3Q8anMuU3dpdGNoQ2xhdXNlPiBjbGF1c2VzID0gPGpzLlN3aXRjaENsYXVzZT5bXTsKICAgICAgZm9yIChqcy5Td2l0Y2hDbGF1c2UgY2xhdXNlIGluIG5vZGUuY2FzZXMpIHsKICAgICAgICBpZiAoY2xhdXNlIGlzIGpzLkNhc2UpIHsKICAgICAgICAgIGxhYmVsc1tpXSA9IG5ld0xhYmVsKCJjYXNlIik7CiAgICAgICAgICBjbGF1c2VzLmFkZChuZXcganMuQ2FzZSh2aXNpdEV4cHJlc3Npb24oY2xhdXNlLmV4cHJlc3Npb24pLAogICAgICAgICAgICAgIGdvdG9BbmRCcmVhayhsYWJlbHNbaV0sIGNsYXVzZS5zb3VyY2VJbmZvcm1hdGlvbikpKTsKICAgICAgICB9IGVsc2UgaWYgKGNsYXVzZSBpcyBqcy5EZWZhdWx0KSB7CiAgICAgICAgICBsYWJlbHNbaV0gPSBuZXdMYWJlbCgiZGVmYXVsdCIpOwogICAgICAgICAgY2xhdXNlcy5hZGQobmV3IGpzLkRlZmF1bHQoCiAgICAgICAgICAgICAgZ290b0FuZEJyZWFrKGxhYmVsc1tpXSwgY2xhdXNlLnNvdXJjZUluZm9ybWF0aW9uKSkpOwogICAgICAgICAgaGFzRGVmYXVsdCA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlcG9ydGVyLmludGVybmFsRXJyb3Ioc3Bhbm5hYmxlLCAiVW5rbm93biBjbGF1c2UgdHlwZSAkY2xhdXNlIik7CiAgICAgICAgfQogICAgICAgIGkrKzsKICAgICAgfQogICAgICBpZiAoIWhhc0RlZmF1bHQpIHsKICAgICAgICBjbGF1c2VzCiAgICAgICAgICAgIC5hZGQobmV3IGpzLkRlZmF1bHQoZ290b0FuZEJyZWFrKGFmdGVyLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uKSkpOwogICAgICB9CiAgICAgIHdpdGhFeHByZXNzaW9uKG5vZGUua2V5LCAoanMuRXhwcmVzc2lvbiBrZXkpIHsKICAgICAgICBhZGRTdGF0ZW1lbnQobmV3IGpzLlN3aXRjaChrZXksIGNsYXVzZXMpKTsKICAgICAgfSwgc3RvcmU6IGZhbHNlKTsKCiAgICAgIGFkZEJyZWFrKG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogICAgfQoKICAgIGp1bXBUYXJnZXRzLmFkZChub2RlKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGJlZ2luTGFiZWwobGFiZWxzW2ldKTsKICAgICAgdmlzaXRTdGF0ZW1lbnQobm9kZS5jYXNlc1tpXS5ib2R5KTsKICAgIH0KICAgIGJlZ2luTGFiZWwoYWZ0ZXIpOwogICAganVtcFRhcmdldHMucmVtb3ZlTGFzdCgpOwogIH0KCiAgQG92ZXJyaWRlCiAganMuRXhwcmVzc2lvbiB2aXNpdFRoaXMoanMuVGhpcyBub2RlKSB7CiAgICByZXR1cm4gc2VsZjsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUaHJvdyhqcy5UaHJvdyBub2RlKSB7CiAgICB3aXRoRXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb24sIChqcy5FeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKICAgICAgYWRkU3RhdGVtZW50KG5ldyBqcy5UaHJvdyhleHByZXNzaW9uKQogICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9LCBzdG9yZTogZmFsc2UpOwogIH0KCiAgc2V0RXJyb3JIYW5kbGVyKFtpbnQgZXJyb3JIYW5kbGVyXSkgewogICAgaGFzSGFuZGxlckxhYmVscyA9IHRydWU7IC8vIFRPRE8oc3JhKTogQWRkIHNob3J0IGZvcm0gZXJyb3IgaGFuZGxlci4KICAgIGpzLkV4cHJlc3Npb24gbGFiZWwgPQogICAgICAgIChlcnJvckhhbmRsZXIgPT0gbnVsbCkgPyBjdXJyZW50RXJyb3JIYW5kbGVyIDoganMubnVtYmVyKGVycm9ySGFuZGxlcik7CiAgICBhZGRTdGF0ZW1lbnQoanMuanMuc3RhdGVtZW50KCcjID0gIzsnLCBbaGFuZGxlciwgbGFiZWxdKSk7CiAgfQoKICBMaXN0PGludD4gX2ZpbmFsbGllc1VwVG9BbmRFbmNsb3NpbmdIYW5kbGVyKCkgewogICAgTGlzdDxpbnQ+IHJlc3VsdCA9IDxpbnQ+W107CiAgICBmb3IgKGludCBpID0ganVtcFRhcmdldHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAganMuTm9kZSBub2RlID0ganVtcFRhcmdldHNbaV07CiAgICAgIGludCBoYW5kbGVyTGFiZWwgPSBoYW5kbGVyTGFiZWxzW25vZGVdOwogICAgICBpZiAoaGFuZGxlckxhYmVsICE9IG51bGwpIHsKICAgICAgICByZXN1bHQuYWRkKGhhbmRsZXJMYWJlbCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaW50IGZpbmFsbHlMYWJlbCA9IGZpbmFsbHlMYWJlbHNbbm9kZV07CiAgICAgIGlmIChmaW5hbGx5TGFiZWwgIT0gbnVsbCkgewogICAgICAgIHJlc3VsdC5hZGQoZmluYWxseUxhYmVsKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdC5yZXZlcnNlZC50b0xpc3QoKTsKICB9CgogIC8vLyBTZWUgdGhlIGNvbW1lbnRzIG9mIFtyZXdyaXRlRnVuY3Rpb25dIGZvciBtb3JlIGV4cGxhbmF0aW9uLgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUcnkoanMuVHJ5IG5vZGUpIHsKICAgIGlmICghc2hvdWxkVHJhbnNmb3JtKG5vZGUpKSB7CiAgICAgIGpzLkJsb2NrIGJvZHkgPSB0cmFuc2xhdGVUb0Jsb2NrKG5vZGUuYm9keSk7CiAgICAgIGpzLkNhdGNoIGNhdGNoUGFydCA9IChub2RlLmNhdGNoUGFydCA9PSBudWxsKQogICAgICAgICAgPyBudWxsCiAgICAgICAgICA6IG5ldyBqcy5DYXRjaChub2RlLmNhdGNoUGFydC5kZWNsYXJhdGlvbiwKICAgICAgICAgICAgICB0cmFuc2xhdGVUb0Jsb2NrKG5vZGUuY2F0Y2hQYXJ0LmJvZHkpKTsKICAgICAganMuQmxvY2sgZmluYWxseVBhcnQgPSAobm9kZS5maW5hbGx5UGFydCA9PSBudWxsKQogICAgICAgICAgPyBudWxsCiAgICAgICAgICA6IHRyYW5zbGF0ZVRvQmxvY2sobm9kZS5maW5hbGx5UGFydCk7CiAgICAgIGFkZFN0YXRlbWVudChuZXcganMuVHJ5KGJvZHksIGNhdGNoUGFydCwgZmluYWxseVBhcnQpKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGhhc1RyeUJsb2NrcyA9IHRydWU7CiAgICBpbnQgdW5jYXVnaHRMYWJlbCA9IG5ld0xhYmVsKCJ1bmNhdWdodCIpOwogICAgaW50IGhhbmRsZXJMYWJlbCA9CiAgICAgICAgKG5vZGUuY2F0Y2hQYXJ0ID09IG51bGwpID8gdW5jYXVnaHRMYWJlbCA6IG5ld0xhYmVsKCJjYXRjaCIpOwoKICAgIGludCBmaW5hbGx5TGFiZWwgPSBuZXdMYWJlbCgiZmluYWxseSIpOwogICAgaW50IGFmdGVyRmluYWxseUxhYmVsID0gbmV3TGFiZWwoImFmdGVyIGZpbmFsbHkiKTsKICAgIGlmIChub2RlLmZpbmFsbHlQYXJ0ICE9IG51bGwpIHsKICAgICAgZmluYWxseUxhYmVsc1tub2RlLmZpbmFsbHlQYXJ0XSA9IGZpbmFsbHlMYWJlbDsKICAgICAganVtcFRhcmdldHMuYWRkKG5vZGUuZmluYWxseVBhcnQpOwogICAgfQoKICAgIGhhbmRsZXJMYWJlbHNbbm9kZV0gPSBoYW5kbGVyTGFiZWw7CiAgICBqdW1wVGFyZ2V0cy5hZGQobm9kZSk7CgogICAgLy8gU2V0IHRoZSBlcnJvciBoYW5kbGVyIGhlcmUuIEl0IG11c3QgYmUgY2xlYXJlZCBvbiBldmVyeSBwYXRoIG91dDsKICAgIC8vIG5vcm1hbCBhbmQgZXJyb3IgZXhpdC4KICAgIHNldEVycm9ySGFuZGxlcigpOwoKICAgIHZpc2l0U3RhdGVtZW50KG5vZGUuYm9keSk7CgogICAganMuTm9kZSBsYXN0ID0ganVtcFRhcmdldHMucmVtb3ZlTGFzdCgpOwogICAgYXNzZXJ0KGxhc3QgPT0gbm9kZSk7CgogICAgaWYgKG5vZGUuZmluYWxseVBhcnQgPT0gbnVsbCkgewogICAgICBzZXRFcnJvckhhbmRsZXIoKTsKICAgICAgYWRkR290byhhZnRlckZpbmFsbHlMYWJlbCwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9IGVsc2UgewogICAgICAvLyBUaGUgaGFuZGxlciBpcyByZXNldCBhcyB0aGUgZmlyc3QgdGhpbmcgaW4gdGhlIGZpbmFsbHkgYmxvY2suCiAgICAgIGFkZFN0YXRlbWVudCgKICAgICAgICAgIGpzLmpzLnN0YXRlbWVudCgiIy5wdXNoKCMpOyIsIFtuZXh0LCBqcy5udW1iZXIoYWZ0ZXJGaW5hbGx5TGFiZWwpXSkpOwogICAgICBhZGRHb3RvKGZpbmFsbHlMYWJlbCwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CgogICAgaWYgKG5vZGUuY2F0Y2hQYXJ0ICE9IG51bGwpIHsKICAgICAgYmVnaW5MYWJlbChoYW5kbGVyTGFiZWwpOwogICAgICAvLyBbdW5jYXVnaHRMYWJlbF0gaXMgdGhlIGhhbmRsZXIgZm9yIHRoZSBjb2RlIGluIHRoZSBjYXRjaC1wYXJ0LgogICAgICAvLyBJdCBlbnN1cmVzIHRoYXQgW25leHROYW1lXSBpcyBzZXQgdXAgdG8gcnVuIHRoZSByaWdodCBmaW5hbGx5IGJsb2Nrcy4KICAgICAgaGFuZGxlckxhYmVsc1tub2RlLmNhdGNoUGFydF0gPSB1bmNhdWdodExhYmVsOwogICAgICBqdW1wVGFyZ2V0cy5hZGQobm9kZS5jYXRjaFBhcnQpOwogICAgICBzZXRFcnJvckhhbmRsZXIoKTsKICAgICAgLy8gVGhlIGNhdGNoIGRlY2xhcmF0aW9uIG5hbWUgY2FuIHNoYWRvdyBvdXRlciB2YXJpYWJsZXMsIHNvIGEgZnJlc2ggbmFtZQogICAgICAvLyBpcyBuZWVkZWQgdG8gYXZvaWQgY29sbGlzaW9ucy4gIFNlZSBFY21hIDI2MiwgM3JkIGVkaXRpb24sCiAgICAgIC8vIHNlY3Rpb24gMTIuMTQuCiAgICAgIFN0cmluZyBlcnJvclJlbmFtZSA9IGZyZXNoTmFtZShub2RlLmNhdGNoUGFydC5kZWNsYXJhdGlvbi5uYW1lKTsKICAgICAgbG9jYWxWYXJpYWJsZXMuYWRkKG5ldyBqcy5WYXJpYWJsZURlY2xhcmF0aW9uKGVycm9yUmVuYW1lKSk7CiAgICAgIHZhcmlhYmxlUmVuYW1pbmdzCiAgICAgICAgICAuYWRkKG5ldyBQYWlyKG5vZGUuY2F0Y2hQYXJ0LmRlY2xhcmF0aW9uLm5hbWUsIGVycm9yUmVuYW1lKSk7CiAgICAgIGFkZFN0YXRlbWVudChqcy5qcy5zdGF0ZW1lbnQoIiMgPSAjOyIsIFtlcnJvclJlbmFtZSwgY3VycmVudEVycm9yXSkpOwogICAgICB2aXNpdFN0YXRlbWVudChub2RlLmNhdGNoUGFydC5ib2R5KTsKICAgICAgdmFyaWFibGVSZW5hbWluZ3MucmVtb3ZlTGFzdCgpOwogICAgICBpZiAobm9kZS5maW5hbGx5UGFydCAhPSBudWxsKSB7CiAgICAgICAgLy8gVGhlIGVycm9yIGhhcyBiZWVuIGNhdWdodCwgc28gYWZ0ZXIgdGhlIGZpbmFsbHksIGNvbnRpbnVlIGFmdGVyIHRoZQogICAgICAgIC8vIHRyeS4KICAgICAgICBhZGRTdGF0ZW1lbnQoanMuanMKICAgICAgICAgICAgLnN0YXRlbWVudCgiIy5wdXNoKCMpOyIsIFtuZXh0LCBqcy5udW1iZXIoYWZ0ZXJGaW5hbGx5TGFiZWwpXSkpOwogICAgICAgIGFkZEdvdG8oZmluYWxseUxhYmVsLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhZGRHb3RvKGFmdGVyRmluYWxseUxhYmVsLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgfQogICAgICBqcy5Ob2RlIGxhc3QgPSBqdW1wVGFyZ2V0cy5yZW1vdmVMYXN0KCk7CiAgICAgIGFzc2VydChsYXN0ID09IG5vZGUuY2F0Y2hQYXJ0KTsKICAgIH0KCiAgICAvLyBUaGUgInVuY2F1Z2h0Ii1oYW5kbGVyIHRlbGxzIHRoZSBmaW5hbGx5LWJsb2NrIHRvIGNvbnRpbnVlIHdpdGgKICAgIC8vIHRoZSBlbmNsb3NpbmcgZmluYWxseS1ibG9ja3MgdW50aWwgdGhlIGN1cnJlbnQgY2F0Y2gtaGFuZGxlci4KICAgIGJlZ2luTGFiZWwodW5jYXVnaHRMYWJlbCk7CgogICAgTGlzdDxpbnQ+IGVuY2xvc2luZ0ZpbmFsbGllcyA9IF9maW5hbGxpZXNVcFRvQW5kRW5jbG9zaW5nSGFuZGxlcigpOwoKICAgIGludCBuZXh0TGFiZWwgPSBlbmNsb3NpbmdGaW5hbGxpZXMucmVtb3ZlTGFzdCgpOwogICAgaWYgKGVuY2xvc2luZ0ZpbmFsbGllcy5pc05vdEVtcHR5KSB7CiAgICAgIC8vIFtlbmNsb3NpbmdGaW5hbGxpZXNdIGNhbiBiZSBlbXB0eSBpZiB0aGVyZSBpcyBubyBzdXJyb3VuZGluZyBmaW5hbGx5CiAgICAgIC8vIGJsb2Nrcy4gVGhlbiBbbmV4dExhYmVsXSB3aWxsIGJlIFtyZXRocm93TGFiZWxdLgogICAgICBhZGRTdGF0ZW1lbnQoanMuanMuc3RhdGVtZW50KCIjID0gIzsiLCBbCiAgICAgICAgbmV4dCwKICAgICAgICBuZXcganMuQXJyYXlJbml0aWFsaXplcihlbmNsb3NpbmdGaW5hbGxpZXMubWFwKGpzLm51bWJlcikudG9MaXN0KCkpCiAgICAgIF0pKTsKICAgIH0KICAgIGlmIChub2RlLmZpbmFsbHlQYXJ0ID09IG51bGwpIHsKICAgICAgLy8gVGhlIGZpbmFsbHktYmxvY2sgYmVsb25naW5nIHRvIFtub2RlXSB3aWxsIGJlIHZpc2l0ZWQgYmVjYXVzZSBvZgogICAgICAvLyBmYWxsdGhyb3VnaC4gSWYgaXQgZG9lcyBub3QgZXhpc3QsIGFkZCBhbiBleHBsaWNpdCBnb3RvLgogICAgICBhZGRHb3RvKG5leHRMYWJlbCwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CiAgICBpZiAobm9kZS5maW5hbGx5UGFydCAhPSBudWxsKSB7CiAgICAgIGpzLk5vZGUgbGFzdCA9IGp1bXBUYXJnZXRzLnJlbW92ZUxhc3QoKTsKICAgICAgYXNzZXJ0KGxhc3QgPT0gbm9kZS5maW5hbGx5UGFydCk7CgogICAgICBiZWdpbkxhYmVsKGZpbmFsbHlMYWJlbCk7CiAgICAgIHNldEVycm9ySGFuZGxlcigpOwogICAgICB2aXNpdFN0YXRlbWVudChub2RlLmZpbmFsbHlQYXJ0KTsKICAgICAgYWRkU3RhdGVtZW50KG5ldyBqcy5Db21tZW50KCIvLyBnb3RvIHRoZSBuZXh0IGZpbmFsbHkgaGFuZGxlciIpKTsKICAgICAgYWRkU3RhdGVtZW50KGpzLmpzLnN0YXRlbWVudCgiIyA9ICMucG9wKCk7IiwgW2dvdG8sIG5leHRdKSk7CiAgICAgIGFkZEJyZWFrKG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogICAgfQogICAgYmVnaW5MYWJlbChhZnRlckZpbmFsbHlMYWJlbCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oanMuVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICB1bnJlYWNoYWJsZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIGpzLkV4cHJlc3Npb24gdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChqcy5WYXJpYWJsZURlY2xhcmF0aW9uTGlzdCBub2RlKSB7CiAgICBmb3IgKGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24gaW5pdGlhbGl6YXRpb24gaW4gbm9kZS5kZWNsYXJhdGlvbnMpIHsKICAgICAganMuVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IGluaXRpYWxpemF0aW9uLmRlY2xhcmF0aW9uOwogICAgICBsb2NhbFZhcmlhYmxlcy5hZGQoZGVjbGFyYXRpb24pOwogICAgICBpZiAoaW5pdGlhbGl6YXRpb24udmFsdWUgIT0gbnVsbCkgewogICAgICAgIHdpdGhFeHByZXNzaW9uKGluaXRpYWxpemF0aW9uLnZhbHVlLCAoanMuRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgICAgICAgYWRkRXhwcmVzc2lvblN0YXRlbWVudCgKICAgICAgICAgICAgICBuZXcganMuQXNzaWdubWVudChuZXcganMuVmFyaWFibGVVc2UoZGVjbGFyYXRpb24ubmFtZSksIHZhbHVlKSk7CiAgICAgICAgfSwgc3RvcmU6IGZhbHNlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGpzLm51bWJlcigwKTsgLy8gRHVtbXkgZXhwcmVzc2lvbi4KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRWYXJpYWJsZUluaXRpYWxpemF0aW9uKGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24gbm9kZSkgewogICAgdW5yZWFjaGFibGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBqcy5FeHByZXNzaW9uIHZpc2l0VmFyaWFibGVVc2UoanMuVmFyaWFibGVVc2Ugbm9kZSkgewogICAgUGFpcjxTdHJpbmcsIFN0cmluZz4gcmVuYW1pbmcgPSB2YXJpYWJsZVJlbmFtaW5ncy5sYXN0V2hlcmUoCiAgICAgICAgKFBhaXIgcmVuYW1pbmcpID0+IHJlbmFtaW5nLmEgPT0gbm9kZS5uYW1lLAogICAgICAgIG9yRWxzZTogKCkgPT4gbnVsbCk7CiAgICBpZiAocmVuYW1pbmcgPT0gbnVsbCkgcmV0dXJuIG5vZGU7CiAgICByZXR1cm4gbmV3IGpzLlZhcmlhYmxlVXNlKHJlbmFtaW5nLmIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFdoaWxlKGpzLldoaWxlIG5vZGUpIHsKICAgIGlmICghc2hvdWxkVHJhbnNmb3JtKG5vZGUpKSB7CiAgICAgIGJvb2wgb2xkSW5zaWRlVW50cmFuc2xhdGVkID0gaW5zaWRlVW50cmFuc2xhdGVkQnJlYWthYmxlOwogICAgICBpbnNpZGVVbnRyYW5zbGF0ZWRCcmVha2FibGUgPSB0cnVlOwogICAgICB3aXRoRXhwcmVzc2lvbihub2RlLmNvbmRpdGlvbiwgKGpzLkV4cHJlc3Npb24gY29uZGl0aW9uKSB7CiAgICAgICAgYWRkU3RhdGVtZW50KG5ldyBqcy5XaGlsZShjb25kaXRpb24sIHRyYW5zbGF0ZVRvU3RhdGVtZW50KG5vZGUuYm9keSkpKTsKICAgICAgfSwgc3RvcmU6IGZhbHNlKTsKICAgICAgaW5zaWRlVW50cmFuc2xhdGVkQnJlYWthYmxlID0gb2xkSW5zaWRlVW50cmFuc2xhdGVkOwogICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgY29udGludWVMYWJlbCA9IG5ld0xhYmVsKCJ3aGlsZSBjb25kaXRpb24iKTsKICAgIGNvbnRpbnVlTGFiZWxzW25vZGVdID0gY29udGludWVMYWJlbDsKICAgIGJlZ2luTGFiZWwoY29udGludWVMYWJlbCk7CgogICAgaW50IGFmdGVyTGFiZWwgPSBuZXdMYWJlbCgiYWZ0ZXIgd2hpbGUiKTsKICAgIGJyZWFrTGFiZWxzW25vZGVdID0gYWZ0ZXJMYWJlbDsKICAgIGpzLkV4cHJlc3Npb24gY29uZGl0aW9uID0gbm9kZS5jb25kaXRpb247CiAgICAvLyBJZiB0aGUgY29uZGl0aW9uIGlzIGB0cnVlYCwgYSB0ZXN0IGlzIG5vdCBuZWVkZWQuCiAgICBpZiAoIShjb25kaXRpb24gaXMganMuTGl0ZXJhbEJvb2wgJiYgY29uZGl0aW9uLnZhbHVlID09IHRydWUpKSB7CiAgICAgIHdpdGhFeHByZXNzaW9uKG5vZGUuY29uZGl0aW9uLCAoanMuRXhwcmVzc2lvbiBjb25kaXRpb24pIHsKICAgICAgICBhZGRTdGF0ZW1lbnQobmV3IGpzLklmLm5vRWxzZShuZXcganMuUHJlZml4KCIhIiwgY29uZGl0aW9uKSwKICAgICAgICAgICAgZ290b0FuZEJyZWFrKGFmdGVyTGFiZWwsIG5vZGUuc291cmNlSW5mb3JtYXRpb24pKSk7CiAgICAgIH0sIHN0b3JlOiBmYWxzZSk7CiAgICB9CiAgICBqdW1wVGFyZ2V0cy5hZGQobm9kZSk7CiAgICB2aXNpdFN0YXRlbWVudChub2RlLmJvZHkpOwogICAganVtcFRhcmdldHMucmVtb3ZlTGFzdCgpOwogICAgYWRkR290byhjb250aW51ZUxhYmVsLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGJlZ2luTGFiZWwoYWZ0ZXJMYWJlbCk7CiAgfQoKICBhZGRZaWVsZChqcy5EYXJ0WWllbGQgbm9kZSwganMuRXhwcmVzc2lvbiBleHByZXNzaW9uLAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbik7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREYXJ0WWllbGQoanMuRGFydFlpZWxkIG5vZGUpIHsKICAgIGFzc2VydChpc1N5bmNTdGFyIHx8IGlzQXN5bmNTdGFyKTsKICAgIGludCBsYWJlbCA9IG5ld0xhYmVsKCJhZnRlciB5aWVsZCIpOwogICAgLy8gRG9uJ3QgZG8gYSBicmVhayBoZXJlIGZvciB0aGUgZ290bywgYnV0IGluc3RlYWQgYSByZXR1cm4gaW4gZWl0aGVyCiAgICAvLyBhZGRTeW5ZaWVsZCBvciBhZGRBc3luY1lpZWxkLgogICAgd2l0aEV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uLCAoanMuRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgICAgIGFkZFN0YXRlbWVudChzZXRHb3RvVmFyaWFibGUobGFiZWwsIG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgYWRkWWllbGQobm9kZSwgZXhwcmVzc2lvbiwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9LCBzdG9yZTogZmFsc2UpOwogICAgYmVnaW5MYWJlbChsYWJlbCk7CiAgfQp9Cgpqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uIF9tYWtlVmFyaWFibGVJbml0aWFsaXplcihkeW5hbWljIHZhcmlhYmxlLAogICAganMuRXhwcmVzc2lvbiBpbml0VmFsdWUsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAganMuVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbjsKICBpZiAodmFyaWFibGUgaXMganMuVmFyaWFibGVVc2UpIHsKICAgIGRlY2xhcmF0aW9uID0gbmV3IGpzLlZhcmlhYmxlRGVjbGFyYXRpb24odmFyaWFibGUubmFtZSk7CiAgfSBlbHNlIGlmICh2YXJpYWJsZSBpcyBTdHJpbmcpIHsKICAgIGRlY2xhcmF0aW9uID0gbmV3IGpzLlZhcmlhYmxlRGVjbGFyYXRpb24odmFyaWFibGUpOwogIH0gZWxzZSB7CiAgICBhc3NlcnQodmFyaWFibGUgaXMganMuVmFyaWFibGVEZWNsYXJhdGlvbik7CiAgICBkZWNsYXJhdGlvbiA9IHZhcmlhYmxlOwogIH0KICByZXR1cm4gbmV3IGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24oZGVjbGFyYXRpb24sIGluaXRWYWx1ZSkKICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7Cn0KCmNsYXNzIEFzeW5jUmV3cml0ZXIgZXh0ZW5kcyBBc3luY1Jld3JpdGVyQmFzZSB7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNBc3luYyA9PiB0cnVlOwoKICAvLy8gVGhlIENvbXBsZXRlciB0aGF0IHdpbGwgZmluaXNoIGFuIGFzeW5jIGZ1bmN0aW9uLgogIC8vLwogIC8vLyBOb3QgdXNlZCBmb3Igc3luYyogb3IgYXN5bmMqIGZ1bmN0aW9ucy4KICBTdHJpbmcgY29tcGxldGVyTmFtZTsKICBqcy5WYXJpYWJsZVVzZSBnZXQgY29tcGxldGVyID0+IG5ldyBqcy5WYXJpYWJsZVVzZShjb21wbGV0ZXJOYW1lKTsKCiAgLy8vIFRoZSBmdW5jdGlvbiBjYWxsZWQgYnkgYW4gYXN5bmMgZnVuY3Rpb24gdG8gaW5pdGlhdGUgYXN5bmNocm9ub3VzCiAgLy8vIGV4ZWN1dGlvbiBvZiB0aGUgYm9keS4gIFRoaXMgaXMgY2FsbGVkIHdpdGg6CiAgLy8vCiAgLy8vIC0gVGhlIGJvZHkgZnVuY3Rpb24gW2JvZHlOYW1lXS4KICAvLy8gLSB0aGUgY29tcGxldGVyIG9iamVjdCBbY29tcGxldGVyXS4KICAvLy8KICAvLy8gSXQgcmV0dXJucyB0aGUgY29tcGxldGVyJ3MgZnV0dXJlLiBQYXNzaW5nIHRoZSBjb21wbGV0ZXIgYW5kIHJldHVybmluZyBpdHMKICAvLy8gZnV0dXJlIGlzIGEgY29udmVuaWVuY2UgdG8gYWxsb3cgYm90aCB0aGUgaW5pdGlhdGlvbiBhbmQgZmV0Y2hpbmcgdGhlCiAgLy8vIGZ1dHVyZSB0byBiZSBjb21wYWN0bHkgZW5jb2RlZCBpbiBhIHJldHVybiBzdGF0ZW1lbnQncyBleHByZXNzaW9uLgogIGZpbmFsIGpzLkV4cHJlc3Npb24gYXN5bmNTdGFydDsKCiAgLy8vIEZ1bmN0aW9uIGNhbGxlZCBieSB0aGUgYXN5bmMgZnVuY3Rpb24gdG8gc2ltdWxhdGUgYW4gYGF3YWl0YAogIC8vLyBleHByZXNzaW9uLiBJdCBpcyBjYWxsZWQgd2l0aDoKICAvLy8KICAvLy8gLSBUaGUgdmFsdWUgdG8gYXdhaXQKICAvLy8gLSBUaGUgYm9keSBmdW5jdGlvbiBbYm9keU5hbWVdCiAgZmluYWwganMuRXhwcmVzc2lvbiBhc3luY0F3YWl0OwoKICAvLy8gRnVuY3Rpb24gY2FsbGVkIGJ5IHRoZSBhc3luYyBmdW5jdGlvbiB0byBzaW11bGF0ZSBhIHJldHVybi4KICAvLy8gSXQgaXMgY2FsbGVkIHdpdGg6CiAgLy8vCiAgLy8vIC0gVGhlIHZhbHVlIHRvIHJldHVybgogIC8vLyAtIFRoZSBjb21wbGV0ZXIgb2JqZWN0IFtjb21wbGV0ZXJdCiAgZmluYWwganMuRXhwcmVzc2lvbiBhc3luY1JldHVybjsKCiAgLy8vIEZ1bmN0aW9uIGNhbGxlZCBieSB0aGUgYXN5bmMgZnVuY3Rpb24gdG8gc2ltdWxhdGUgYSByZXRocm93LgogIC8vLyBJdCBpcyBjYWxsZWQgd2l0aDoKICAvLy8KICAvLy8gLSBUaGUgdmFsdWUgY29udGFpbmluZyB0aGUgZXhjZXB0aW9uIGFuZCBzdGFjawogIC8vLyAtIFRoZSBjb21wbGV0ZXIgb2JqZWN0IFtjb21wbGV0ZXJdCiAgZmluYWwganMuRXhwcmVzc2lvbiBhc3luY1JldGhyb3c7CgogIC8vLyBDb25zdHJ1Y3RvciB1c2VkIHRvIGluaXRpYWxpemUgdGhlIFtjb21wbGV0ZXJdIHZhcmlhYmxlLgogIC8vLwogIC8vLyBTcGVjaWZpYyB0byBhc3luYyBtZXRob2RzLgogIGZpbmFsIGpzLkV4cHJlc3Npb24gY29tcGxldGVyRmFjdG9yeTsKICBMaXN0PGpzLkV4cHJlc3Npb24+IGNvbXBsZXRlckZhY3RvcnlUeXBlQXJndW1lbnRzOwoKICBmaW5hbCBqcy5FeHByZXNzaW9uIHdyYXBCb2R5OwoKICBBc3luY1Jld3JpdGVyKERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwgU3Bhbm5hYmxlIHNwYW5uYWJsZSwKICAgICAge3RoaXMuYXN5bmNTdGFydCwKICAgICAgdGhpcy5hc3luY0F3YWl0LAogICAgICB0aGlzLmFzeW5jUmV0dXJuLAogICAgICB0aGlzLmFzeW5jUmV0aHJvdywKICAgICAgdGhpcy5jb21wbGV0ZXJGYWN0b3J5LAogICAgICB0aGlzLmNvbXBsZXRlckZhY3RvcnlUeXBlQXJndW1lbnRzLAogICAgICB0aGlzLndyYXBCb2R5LAogICAgICBTdHJpbmcgc2FmZVZhcmlhYmxlTmFtZShTdHJpbmcgcHJvcG9zZWROYW1lKSwKICAgICAganMuTmFtZSBib2R5TmFtZX0pCiAgICAgIDogc3VwZXIocmVwb3J0ZXIsIHNwYW5uYWJsZSwgc2FmZVZhcmlhYmxlTmFtZSwgYm9keU5hbWUpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZFlpZWxkKGpzLkRhcnRZaWVsZCBub2RlLCBqcy5FeHByZXNzaW9uIGV4cHJlc3Npb24sCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKHNwYW5uYWJsZSwgIllpZWxkIGluIG5vbi1nZW5lcmF0aW5nIGFzeW5jIGZ1bmN0aW9uIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZEVycm9yRXhpdChTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgaWYgKCFoYXNIYW5kbGVyTGFiZWxzKSByZXR1cm47IC8vIHJldGhyb3cgaGFuZGxlZCBpbiBtZXRob2QgYm9pbGVycGxhdGUuCiAgICBiZWdpbkxhYmVsKHJldGhyb3dMYWJlbCk7CiAgICBqcy5FeHByZXNzaW9uIHRoZW5IZWxwZXJDYWxsID0ganMuanMoCiAgICAgICAgIiN0aGVuSGVscGVyKCNjdXJyZW50RXJyb3IsICNjb21wbGV0ZXIpIiwgewogICAgICAidGhlbkhlbHBlciI6IGFzeW5jUmV0aHJvdywKICAgICAgImN1cnJlbnRFcnJvciI6IGN1cnJlbnRFcnJvciwKICAgICAgImNvbXBsZXRlciI6IGNvbXBsZXRlcgogICAgfSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGFkZFN0YXRlbWVudCgKICAgICAgICBuZXcganMuUmV0dXJuKHRoZW5IZWxwZXJDYWxsKS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICB9CgogIC8vLyBSZXR1cm5pbmcgZnJvbSBhbiBhc3luYyBtZXRob2QgY2FsbHMgW2FzeW5jU3RhckhlbHBlcl0gd2l0aCB0aGUgcmVzdWx0LgogIC8vLyAodGhlIHJlc3VsdCBtaWdodCBoYXZlIGJlZW4gc3RvcmVkIGluIFtyZXR1cm5WYWx1ZV0gYnkgc29tZSBmaW5hbGx5CiAgLy8vIGJsb2NrKS4KICBAb3ZlcnJpZGUKICB2b2lkIGFkZFN1Y2Nlc3NFeGl0KFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBpZiAoYW5hbHlzaXMuaGFzRXhwbGljaXRSZXR1cm5zKSB7CiAgICAgIGJlZ2luTGFiZWwoZXhpdExhYmVsKTsKICAgIH0gZWxzZSB7CiAgICAgIGFkZFN0YXRlbWVudChuZXcganMuQ29tbWVudCgiaW1wbGljaXQgcmV0dXJuIikpOwogICAgfQoKICAgIGpzLkV4cHJlc3Npb24gcnVudGltZUhlbHBlckNhbGwgPQogICAgICAgIGpzLmpzKCIjcnVudGltZUhlbHBlcigjcmV0dXJuVmFsdWUsICNjb21wbGV0ZXIpIiwgewogICAgICAicnVudGltZUhlbHBlciI6IGFzeW5jUmV0dXJuLAogICAgICAicmV0dXJuVmFsdWUiOgogICAgICAgICAgYW5hbHlzaXMuaGFzRXhwbGljaXRSZXR1cm5zID8gcmV0dXJuVmFsdWUgOiBuZXcganMuTGl0ZXJhbE51bGwoKSwKICAgICAgImNvbXBsZXRlciI6IGNvbXBsZXRlcgogICAgfSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGFkZFN0YXRlbWVudChuZXcganMuUmV0dXJuKHJ1bnRpbWVIZWxwZXJDYWxsKQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24+IHZhcmlhYmxlSW5pdGlhbGl6YXRpb25zKAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgTGlzdDxqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uPiB2YXJpYWJsZXMgPSA8anMuVmFyaWFibGVJbml0aWFsaXphdGlvbj5bXTsKICAgIHZhcmlhYmxlcy5hZGQoX21ha2VWYXJpYWJsZUluaXRpYWxpemVyKAogICAgICAgIGNvbXBsZXRlciwKICAgICAgICBqcy5qcygnIygjKScsIFsKICAgICAgICAgIGNvbXBsZXRlckZhY3RvcnksCiAgICAgICAgICBjb21wbGV0ZXJGYWN0b3J5VHlwZUFyZ3VtZW50cwogICAgICAgIF0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbiksCiAgICAgICAgc291cmNlSW5mb3JtYXRpb24pKTsKICAgIGlmIChhbmFseXNpcy5oYXNFeHBsaWNpdFJldHVybnMpIHsKICAgICAgdmFyaWFibGVzCiAgICAgICAgICAuYWRkKF9tYWtlVmFyaWFibGVJbml0aWFsaXplcihyZXR1cm5WYWx1ZSwgbnVsbCwgc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0KICAgIHJldHVybiB2YXJpYWJsZXM7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGluaXRpYWxpemVOYW1lcygpIHsKICAgIGNvbXBsZXRlck5hbWUgPSBmcmVzaE5hbWUoImNvbXBsZXRlciIpOwogICAgY29tcGxldGVyRmFjdG9yeVR5cGVBcmd1bWVudHMgPQogICAgICAgIHByb2Nlc3NUeXBlQXJndW1lbnRzKGNvbXBsZXRlckZhY3RvcnlUeXBlQXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIGpzLlN0YXRlbWVudCBhd2FpdFN0YXRlbWVudCgKICAgICAganMuRXhwcmVzc2lvbiB2YWx1ZSwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIGpzLkV4cHJlc3Npb24gYXN5bmNIZWxwZXJDYWxsID0ganMuanMoIiNhc3luY0hlbHBlcigjdmFsdWUsICNib2R5TmFtZSkiLCB7CiAgICAgICJhc3luY0hlbHBlciI6IGFzeW5jQXdhaXQsCiAgICAgICJ2YWx1ZSI6IHZhbHVlLAogICAgICAiYm9keU5hbWUiOiBib2R5TmFtZSwKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7CiAgICByZXR1cm4gbmV3IGpzLlJldHVybihhc3luY0hlbHBlckNhbGwpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBqcy5GdW4gZmluaXNoRnVuY3Rpb24oCiAgICAgIExpc3Q8anMuUGFyYW1ldGVyPiBwYXJhbWV0ZXJzLAogICAgICBMaXN0PGpzLlBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMsCiAgICAgIGpzLlN0YXRlbWVudCByZXdyaXR0ZW5Cb2R5LAogICAgICBqcy5WYXJpYWJsZURlY2xhcmF0aW9uTGlzdCB2YXJpYWJsZURlY2xhcmF0aW9ucywKICAgICAgU291cmNlSW5mb3JtYXRpb24gZnVuY3Rpb25Tb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgU291cmNlSW5mb3JtYXRpb24gYm9keVNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBqcy5FeHByZXNzaW9uIGFzeW5jUmV0aHJvd0NhbGwgPQogICAgICAgIGpzLmpzKCIjYXN5bmNSZXRocm93KCNyZXN1bHQsICNjb21wbGV0ZXIpIiwgewogICAgICAicmVzdWx0IjogcmVzdWx0TmFtZSwKICAgICAgImFzeW5jUmV0aHJvdyI6IGFzeW5jUmV0aHJvdywKICAgICAgImNvbXBsZXRlciI6IGNvbXBsZXRlciwKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihib2R5U291cmNlSW5mb3JtYXRpb24pOwogICAganMuUmV0dXJuIHJldHVybkFzeW5jUmV0aHJvdyA9IG5ldyBqcy5SZXR1cm4oYXN5bmNSZXRocm93Q2FsbCkKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKGJvZHlTb3VyY2VJbmZvcm1hdGlvbik7CiAgICBqcy5TdGF0ZW1lbnQgZXJyb3JDaGVjayA9IGpzLmpzLnN0YXRlbWVudCgiIiIKICAgICAgaWYgKCNlcnJvckNvZGUgPT09ICNFUlJPUikgewogICAgICAgIGlmICgjaGFzSGFuZGxlckxhYmVscykgewogICAgICAgICAgICAjY3VycmVudEVycm9yID0gI3Jlc3VsdDsKICAgICAgICAgICAgI2dvdG8gPSAjaGFuZGxlcjsKICAgICAgICB9IGVsc2UKICAgICAgICAgICAgI3JldHVybkFzeW5jUmV0aHJvdzsKICAgICAgfSIiIiwgewogICAgICAiZXJyb3JDb2RlIjogZXJyb3JDb2RlTmFtZSwKICAgICAgIkVSUk9SIjoganMubnVtYmVyKGVycm9yX2NvZGVzLkVSUk9SKSwKICAgICAgImhhc0hhbmRsZXJMYWJlbHMiOiBoYXNIYW5kbGVyTGFiZWxzLAogICAgICAiY3VycmVudEVycm9yIjogY3VycmVudEVycm9yLAogICAgICAicmVzdWx0IjogcmVzdWx0TmFtZSwKICAgICAgImdvdG8iOiBnb3RvLAogICAgICAiaGFuZGxlciI6IGhhbmRsZXIsCiAgICAgICJyZXR1cm5Bc3luY1JldGhyb3ciOiByZXR1cm5Bc3luY1JldGhyb3csCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oYm9keVNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLkZ1biBpbm5lckZ1bmN0aW9uID0ganMuanMoIiIiCiAgICAgIGZ1bmN0aW9uICgjZXJyb3JDb2RlLCAjcmVzdWx0KSB7CiAgICAgICAgI2Vycm9yQ2hlY2s7CiAgICAgICAgI3Jld3JpdHRlbkJvZHk7CiAgICAgIH0iIiIsIHsKICAgICAgImVycm9yQ29kZSI6IGVycm9yQ29kZU5hbWUsCiAgICAgICJyZXN1bHQiOiByZXN1bHROYW1lLAogICAgICAiZXJyb3JDaGVjayI6IGVycm9yQ2hlY2ssCiAgICAgICJyZXdyaXR0ZW5Cb2R5IjogcmV3cml0dGVuQm9keSwKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihmdW5jdGlvblNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLkV4cHJlc3Npb24gYXN5bmNTdGFydENhbGwgPSBqcy5qcygiI2FzeW5jU3RhcnQoI2JvZHlOYW1lLCAjY29tcGxldGVyKSIsIHsKICAgICAgImFzeW5jU3RhcnQiOiBhc3luY1N0YXJ0LAogICAgICAiYm9keU5hbWUiOiBib2R5TmFtZSwKICAgICAgImNvbXBsZXRlciI6IGNvbXBsZXRlciwKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihib2R5U291cmNlSW5mb3JtYXRpb24pOwogICAganMuUmV0dXJuIHJldHVybkFzeW5jU3RhcnQgPSBuZXcganMuUmV0dXJuKGFzeW5jU3RhcnRDYWxsKQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oYm9keVNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLkV4cHJlc3Npb24gd3JhcEJvZHlDYWxsID0ganMuanMoIiN3cmFwQm9keSgjaW5uZXJGdW5jdGlvbikiLCB7CiAgICAgICJ3cmFwQm9keSI6IHdyYXBCb2R5LAogICAgICAiaW5uZXJGdW5jdGlvbiI6IGlubmVyRnVuY3Rpb24sCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oYm9keVNvdXJjZUluZm9ybWF0aW9uKTsKICAgIHJldHVybiBqcy5qcygiIiIKICAgICAgICBmdW5jdGlvbiAoI3BhcmFtZXRlcnMsICN0eXBlUGFyYW1ldGVycykgewogICAgICAgICAgI3ZhcmlhYmxlRGVjbGFyYXRpb25zOwogICAgICAgICAgdmFyICNib2R5TmFtZSA9ICN3cmFwQm9keUNhbGw7CiAgICAgICAgICAjcmV0dXJuQXN5bmNTdGFydDsKICAgICAgICB9IiIiLCB7CiAgICAgICJwYXJhbWV0ZXJzIjogcGFyYW1ldGVycywKICAgICAgInR5cGVQYXJhbWV0ZXJzIjogdHlwZVBhcmFtZXRlcnMsCiAgICAgICJ2YXJpYWJsZURlY2xhcmF0aW9ucyI6IHZhcmlhYmxlRGVjbGFyYXRpb25zLAogICAgICAiYm9keU5hbWUiOiBib2R5TmFtZSwKICAgICAgIndyYXBCb2R5Q2FsbCI6IHdyYXBCb2R5Q2FsbCwKICAgICAgInJldHVybkFzeW5jU3RhcnQiOiByZXR1cm5Bc3luY1N0YXJ0LAogICAgfSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKGZ1bmN0aW9uU291cmNlSW5mb3JtYXRpb24pOwogIH0KfQoKY2xhc3MgU3luY1N0YXJSZXdyaXRlciBleHRlbmRzIEFzeW5jUmV3cml0ZXJCYXNlIHsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1N5bmNTdGFyID0+IHRydWU7CgogIC8vLyBDb25zdHJ1Y3RvciBjcmVhdGluZyB0aGUgSXRlcmFibGUgZm9yIGEgc3luYyogbWV0aG9kLiBDYWxsZWQgd2l0aAogIC8vLyBbYm9keU5hbWVdLgogIGZpbmFsIGpzLkV4cHJlc3Npb24gaXRlcmFibGVGYWN0b3J5OwogIExpc3Q8anMuRXhwcmVzc2lvbj4gaXRlcmFibGVGYWN0b3J5VHlwZUFyZ3VtZW50czsKCiAgLy8vIEEgSlMgRXhwcmVzc2lvbiB0aGF0IGNyZWF0ZXMgYSBtYXJrZXIgc2hvd2luZyB0aGF0IGl0ZXJhdGlvbiBpcyBvdmVyLgogIC8vLwogIC8vLyBDYWxsZWQgd2l0aG91dCBhcmd1bWVudHMuCiAgZmluYWwganMuRXhwcmVzc2lvbiBlbmRPZkl0ZXJhdGlvbjsKCiAgLy8vIEEgSlMgRXhwcmVzc2lvbiB0aGF0IGNyZWF0ZXMgYSBtYXJrZXIgaW5kaWNhdGlvbiBhICd5aWVsZConIHN0YXRlbWVudC4KICAvLy8KICAvLy8gQ2FsbGVkIHdpdGggdGhlIHN0cmVhbSB0byB5aWVsZCBmcm9tLgogIGZpbmFsIGpzLkV4cHJlc3Npb24geWllbGRTdGFyRXhwcmVzc2lvbjsKCiAgLy8vIFVzZWQgYnkgc3luYyogZnVuY3Rpb25zIHRvIHRocm93IGV4ZXB0aW9ucy4KICBmaW5hbCBqcy5FeHByZXNzaW9uIHVuY2F1Z2h0RXJyb3JFeHByZXNzaW9uOwoKICBTeW5jU3RhclJld3JpdGVyKERpYWdub3N0aWNSZXBvcnRlciBkaWFnbm9zdGljTGlzdGVuZXIsIHNwYW5uYWJsZSwKICAgICAge3RoaXMuZW5kT2ZJdGVyYXRpb24sCiAgICAgIHRoaXMuaXRlcmFibGVGYWN0b3J5LAogICAgICB0aGlzLml0ZXJhYmxlRmFjdG9yeVR5cGVBcmd1bWVudHMsCiAgICAgIHRoaXMueWllbGRTdGFyRXhwcmVzc2lvbiwKICAgICAgdGhpcy51bmNhdWdodEVycm9yRXhwcmVzc2lvbiwKICAgICAgU3RyaW5nIHNhZmVWYXJpYWJsZU5hbWUoU3RyaW5nIHByb3Bvc2VkTmFtZSksCiAgICAgIGpzLk5hbWUgYm9keU5hbWV9KQogICAgICA6IHN1cGVyKGRpYWdub3N0aWNMaXN0ZW5lciwgc3Bhbm5hYmxlLCBzYWZlVmFyaWFibGVOYW1lLCBib2R5TmFtZSk7CgogIC8vLyBUcmFuc2xhdGVzIGEgeWllbGQveWllbGQqIGluIGFuIHN5bmMqLgogIC8vLwogIC8vLyBgeWllbGRgIGluIGEgc3luYyogZnVuY3Rpb24ganVzdCByZXR1cm5zIFt2YWx1ZV0uCiAgLy8vIGB5aWVsZCpgIHdyYXBzIFt2YWx1ZV0gaW4gYSBbeWllbGRTdGFyRXhwcmVzc2lvbl0gYW5kIHJldHVybnMgaXQuCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRZaWVsZChqcy5EYXJ0WWllbGQgbm9kZSwganMuRXhwcmVzc2lvbiBleHByZXNzaW9uLAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgaWYgKG5vZGUuaGFzU3RhcikgewogICAgICBhZGRTdGF0ZW1lbnQobmV3IGpzLlJldHVybihuZXcganMuQ2FsbCh5aWVsZFN0YXJFeHByZXNzaW9uLCBbZXhwcmVzc2lvbl0pCiAgICAgICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpCiAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9IGVsc2UgewogICAgICBhZGRTdGF0ZW1lbnQoCiAgICAgICAgICBuZXcganMuUmV0dXJuKGV4cHJlc3Npb24pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAganMuRnVuIGZpbmlzaEZ1bmN0aW9uKAogICAgICBMaXN0PGpzLlBhcmFtZXRlcj4gcGFyYW1ldGVycywKICAgICAgTGlzdDxqcy5QYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLAogICAgICBqcy5TdGF0ZW1lbnQgcmV3cml0dGVuQm9keSwKICAgICAganMuVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QgdmFyaWFibGVEZWNsYXJhdGlvbnMsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIGZ1bmN0aW9uU291cmNlSW5mb3JtYXRpb24sCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIGJvZHlTb3VyY2VJbmZvcm1hdGlvbikgewogICAgLy8gRWFjaCBpdGVyYXRvciBpbnZvY2F0aW9uIG9uIHRoZSBpdGVyYWJsZSBzaG91bGQgd29yayBvbiBpdHMgb3duIGNvcHkgb2YKICAgIC8vIHRoZSBwYXJhbWV0ZXJzLgogICAgLy8gVE9ETyhzaWd1cmRtKTogV2Ugb25seSBuZWVkIHRvIGRvIHRoaXMgY29weWluZyBmb3IgcGFyYW1ldGVycyB0aGF0IGFyZQogICAgLy8gbXV0YXRlZC4KICAgIExpc3Q8anMuVmFyaWFibGVJbml0aWFsaXphdGlvbj4gZGVjbGFyYXRpb25zID0KICAgICAgICA8anMuVmFyaWFibGVJbml0aWFsaXphdGlvbj5bXTsKICAgIExpc3Q8anMuUGFyYW1ldGVyPiByZW5hbWVkUGFyYW1ldGVycyA9IDxqcy5QYXJhbWV0ZXI+W107CiAgICBmb3IgKGpzLlBhcmFtZXRlciBwYXJhbWV0ZXIgaW4gcGFyYW1ldGVycykgewogICAgICBTdHJpbmcgbmFtZSA9IHBhcmFtZXRlci5uYW1lOwogICAgICBTdHJpbmcgcmVuYW1lZE5hbWUgPSBmcmVzaE5hbWUobmFtZSk7CiAgICAgIHJlbmFtZWRQYXJhbWV0ZXJzLmFkZChuZXcganMuUGFyYW1ldGVyKHJlbmFtZWROYW1lKSk7CiAgICAgIGRlY2xhcmF0aW9ucy5hZGQobmV3IGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24oCiAgICAgICAgICBuZXcganMuVmFyaWFibGVEZWNsYXJhdGlvbihuYW1lKSwgbmV3IGpzLlZhcmlhYmxlVXNlKHJlbmFtZWROYW1lKSkpOwogICAgfQogICAganMuVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QgY29weVBhcmFtZXRlcnMgPQogICAgICAgIG5ldyBqcy5WYXJpYWJsZURlY2xhcmF0aW9uTGlzdChkZWNsYXJhdGlvbnMpOwoKICAgIGpzLkV4cHJlc3Npb24gc2V0Q3VycmVudEVycm9yID0ganMuanMoIiNjdXJyZW50RXJyb3IgPSAjcmVzdWx0IiwgewogICAgICAicmVzdWx0IjogcmVzdWx0TmFtZSwKICAgICAgImN1cnJlbnRFcnJvciI6IGN1cnJlbnRFcnJvck5hbWUsCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oYm9keVNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLkV4cHJlc3Npb24gc2V0R290byA9IGpzLmpzKCIjZ290byA9ICNoYW5kbGVyIiwgewogICAgICAiZ290byI6IGdvdG8sCiAgICAgICJoYW5kbGVyIjogaGFuZGxlciwKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihib2R5U291cmNlSW5mb3JtYXRpb24pOwogICAganMuU3RhdGVtZW50IGNoZWNrRXJyb3JDb2RlID0ganMuanMuc3RhdGVtZW50KCIiIgogICAgICAgICAgaWYgKCNlcnJvckNvZGUgPT09ICNFUlJPUikgewogICAgICAgICAgICAgICNzZXRDdXJyZW50RXJyb3I7CiAgICAgICAgICAgICAgI3NldEdvdG87CiAgICAgICAgICB9IiIiLCB7CiAgICAgICJlcnJvckNvZGUiOiBlcnJvckNvZGVOYW1lLAogICAgICAiRVJST1IiOiBqcy5udW1iZXIoZXJyb3JfY29kZXMuRVJST1IpLAogICAgICAic2V0Q3VycmVudEVycm9yIjogc2V0Q3VycmVudEVycm9yLAogICAgICAic2V0R290byI6IHNldEdvdG8sCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oYm9keVNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLk5hbWVkRnVuY3Rpb24gaW5uZXJJbm5lckZ1bmN0aW9uID0ganMuanMoIiIiCiAgICAgICAgICBmdW5jdGlvbiAjYm9keSgjZXJyb3JDb2RlLCAjcmVzdWx0KSB7CiAgICAgICAgICAgICNjaGVja0Vycm9yQ29kZTsKICAgICAgICAgICAgI2hlbHBlckJvZHk7CiAgICAgICAgICB9IiIiLCB7CiAgICAgICJoZWxwZXJCb2R5IjogcmV3cml0dGVuQm9keSwKICAgICAgImVycm9yQ29kZSI6IGVycm9yQ29kZU5hbWUsCiAgICAgICJib2R5IjogYm9keU5hbWUsCiAgICAgICJyZXN1bHQiOiByZXN1bHROYW1lLAogICAgICAiY2hlY2tFcnJvckNvZGUiOiBjaGVja0Vycm9yQ29kZSwKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihmdW5jdGlvblNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLlJldHVybiByZXR1cm5Jbm5lcklubmVyRnVuY3Rpb24gPSBuZXcganMuUmV0dXJuKGlubmVySW5uZXJGdW5jdGlvbikKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKGJvZHlTb3VyY2VJbmZvcm1hdGlvbik7CiAgICBqcy5GdW4gaW5uZXJGdW5jdGlvbiA9IGpzLmpzKCIiIgogICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoI2hhc1BhcmFtZXRlcnMpIHsKICAgICAgICAgICAgICAjY29weVBhcmFtZXRlcnM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgI3ZhckRlY2w7CiAgICAgICAgICAgICNyZXR1cm5Jbm5lcklubmVyRnVuY3Rpb247CiAgICAgICAgICB9IiIiLCB7CiAgICAgICJoYXNQYXJhbWV0ZXJzIjogcGFyYW1ldGVycy5pc05vdEVtcHR5LAogICAgICAiY29weVBhcmFtZXRlcnMiOiBjb3B5UGFyYW1ldGVycywKICAgICAgInZhckRlY2wiOiB2YXJpYWJsZURlY2xhcmF0aW9ucywKICAgICAgInJldHVybklubmVySW5uZXJGdW5jdGlvbiI6IHJldHVybklubmVySW5uZXJGdW5jdGlvbiwKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihmdW5jdGlvblNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLkV4cHJlc3Npb24gY2FsbEl0ZXJhYmxlRmFjdG9yeSA9CiAgICAgICAganMuanMoIiNpdGVyYWJsZUZhY3RvcnkoI2lubmVyRnVuY3Rpb24sICN0eXBlKSIsIHsKICAgICAgIml0ZXJhYmxlRmFjdG9yeSI6IGl0ZXJhYmxlRmFjdG9yeSwKICAgICAgInR5cGUiOiBpdGVyYWJsZUZhY3RvcnlUeXBlQXJndW1lbnRzLAogICAgICAiaW5uZXJGdW5jdGlvbiI6IGlubmVyRnVuY3Rpb24sCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oYm9keVNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLlN0YXRlbWVudCByZXR1cm5DYWxsSXRlcmFibGVGYWN0b3J5ID0gbmV3IGpzLlJldHVybihjYWxsSXRlcmFibGVGYWN0b3J5KQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oYm9keVNvdXJjZUluZm9ybWF0aW9uKTsKICAgIHJldHVybiBqcy5qcygiIiIKICAgICAgICAgIGZ1bmN0aW9uICgjcmVuYW1lZFBhcmFtZXRlcnMsICN0eXBlUGFyYW1ldGVycykgewogICAgICAgICAgICBpZiAoI25lZWRzVGhpcykKICAgICAgICAgICAgICB2YXIgI3NlbGYgPSB0aGlzOwogICAgICAgICAgICAjcmV0dXJuQ2FsbEl0ZXJhYmxlRmFjdG9yeTsKICAgICAgICAgIH0KICAgICAgICAgICIiIiwgewogICAgICAicmVuYW1lZFBhcmFtZXRlcnMiOiByZW5hbWVkUGFyYW1ldGVycywKICAgICAgInR5cGVQYXJhbWV0ZXJzIjogdHlwZVBhcmFtZXRlcnMsCiAgICAgICJuZWVkc1RoaXMiOiBhbmFseXNpcy5oYXNUaGlzLAogICAgICAic2VsZiI6IHNlbGZOYW1lLAogICAgICAicmV0dXJuQ2FsbEl0ZXJhYmxlRmFjdG9yeSI6IHJldHVybkNhbGxJdGVyYWJsZUZhY3RvcnksCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oZnVuY3Rpb25Tb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZEVycm9yRXhpdChTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgaGFzSGFuZGxlckxhYmVscyA9IHRydWU7IC8vIFRPRE8oc3JhKTogQWRkIHNob3J0IGZvcm0gZXJyb3IgaGFuZGxlci4KICAgIGJlZ2luTGFiZWwocmV0aHJvd0xhYmVsKTsKICAgIGpzLkV4cHJlc3Npb24gdW5jYXVnaHRFcnJvckV4cHJlc3Npb25DYWxsID0ganMuanMoJyMoIyknLCBbCiAgICAgIHVuY2F1Z2h0RXJyb3JFeHByZXNzaW9uLAogICAgICBjdXJyZW50RXJyb3IKICAgIF0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBhZGRTdGF0ZW1lbnQobmV3IGpzLlJldHVybih1bmNhdWdodEVycm9yRXhwcmVzc2lvbkNhbGwpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgLy8vIFJldHVybmluZyBmcm9tIGEgc3luYyogZnVuY3Rpb24gcmV0dXJucyBhbiBbZW5kT2ZJdGVyYXRpb25dIG1hcmtlci4KICBAb3ZlcnJpZGUKICB2b2lkIGFkZFN1Y2Nlc3NFeGl0KFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBpZiAoYW5hbHlzaXMuaGFzRXhwbGljaXRSZXR1cm5zKSB7CiAgICAgIGJlZ2luTGFiZWwoZXhpdExhYmVsKTsKICAgIH0gZWxzZSB7CiAgICAgIGFkZFN0YXRlbWVudChuZXcganMuQ29tbWVudCgiaW1wbGljaXQgcmV0dXJuIikpOwogICAgfQogICAganMuRXhwcmVzc2lvbiBlbmRPZkl0ZXJhdGlvbkNhbGwgPQogICAgICAgIGpzLmpzKCcjKCknLCBbZW5kT2ZJdGVyYXRpb25dKS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pOwogICAgYWRkU3RhdGVtZW50KG5ldyBqcy5SZXR1cm4oZW5kT2ZJdGVyYXRpb25DYWxsKQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24+IHZhcmlhYmxlSW5pdGlhbGl6YXRpb25zKAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgTGlzdDxqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uPiB2YXJpYWJsZXMgPSA8anMuVmFyaWFibGVJbml0aWFsaXphdGlvbj5bXTsKICAgIHJldHVybiB2YXJpYWJsZXM7CiAgfQoKICBAb3ZlcnJpZGUKICBqcy5TdGF0ZW1lbnQgYXdhaXRTdGF0ZW1lbnQoCiAgICAgIGpzLkV4cHJlc3Npb24gdmFsdWUsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICB0aHJvdyByZXBvcnRlci5pbnRlcm5hbEVycm9yKAogICAgICAgIHNwYW5uYWJsZSwgIlN5bmMqIGZ1bmN0aW9ucyBjYW5ub3QgY29udGFpbiBhd2FpdCBzdGF0ZW1lbnRzLiIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBpbml0aWFsaXplTmFtZXMoKSB7CiAgICBpdGVyYWJsZUZhY3RvcnlUeXBlQXJndW1lbnRzID0KICAgICAgICBwcm9jZXNzVHlwZUFyZ3VtZW50cyhpdGVyYWJsZUZhY3RvcnlUeXBlQXJndW1lbnRzKTsKICB9Cn0KCmNsYXNzIEFzeW5jU3RhclJld3JpdGVyIGV4dGVuZHMgQXN5bmNSZXdyaXRlckJhc2UgewogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQXN5bmNTdGFyID0+IHRydWU7CgogIC8vLyBUaGUgc3RhY2sgb2YgbGFiZWxzIG9mIGZpbmFsbHkgYmxvY2tzIHRvIGFzc2lnbiB0byBbbmV4dF0gaWYgdGhlCiAgLy8vIGFzeW5jKiBbU3RyZWFtU3Vic2NyaXB0aW9uXSB3YXMgY2FuY2VsZWQgZHVyaW5nIGEgeWllbGQuCiAganMuVmFyaWFibGVVc2UgZ2V0IG5leHRXaGVuQ2FuY2VsZWQgewogICAgcmV0dXJuIG5ldyBqcy5WYXJpYWJsZVVzZShuZXh0V2hlbkNhbmNlbGVkTmFtZSk7CiAgfQoKICBTdHJpbmcgbmV4dFdoZW5DYW5jZWxlZE5hbWU7CgogIC8vLyBUaGUgU3RyZWFtQ29udHJvbGxlciB0aGF0IGNvbnRyb2xzIGFuIGFzeW5jKiBmdW5jdGlvbi4KICBTdHJpbmcgY29udHJvbGxlck5hbWU7CiAganMuVmFyaWFibGVVc2UgZ2V0IGNvbnRyb2xsZXIgPT4gbmV3IGpzLlZhcmlhYmxlVXNlKGNvbnRyb2xsZXJOYW1lKTsKCiAgLy8vIFRoZSBmdW5jdGlvbiBjYWxsZWQgYnkgYW4gYXN5bmMqIGZ1bmN0aW9uIHRvIHNpbXVsYXRlIGFuIGF3YWl0LCB5aWVsZCBvcgogIC8vLyB5aWVsZCouCiAgLy8vCiAgLy8vIEZvciBhbiBhd2FpdC95aWVsZC95aWVsZCogaXQgaXMgY2FsbGVkIHdpdGg6CiAgLy8vCiAgLy8vIC0gVGhlIHZhbHVlIHRvIGF3YWl0L3lpZWxkRXhwcmVzc2lvbih2YWx1ZSB0byB5aWVsZCkvCiAgLy8vIHlpZWxkU3RhckV4cHJlc3Npb24oc3RyZWFtIHRvIHlpZWxkKQogIC8vLyAtIFRoZSBib2R5IGZ1bmN0aW9uIFtib2R5TmFtZV0KICAvLy8gLSBUaGUgY29udHJvbGxlciBvYmplY3QgW2NvbnRyb2xsZXJOYW1lXQogIC8vLwogIC8vLyBGb3IgYSByZXR1cm4gaXQgaXMgY2FsbGVkIHdpdGg6CiAgLy8vCiAgLy8vIC0gbnVsbAogIC8vLyAtIG51bGwKICAvLy8gLSBUaGUgW2NvbnRyb2xsZXJOYW1lXQogIC8vLyAtIG51bGwuCiAgZmluYWwganMuRXhwcmVzc2lvbiBhc3luY1N0YXJIZWxwZXI7CgogIC8vLyBDb25zdHJ1Y3RvciB1c2VkIHRvIGluaXRpYWxpemUgdGhlIFtjb250cm9sbGVyTmFtZV0gdmFyaWFibGUuCiAgLy8vCiAgLy8vIFNwZWNpZmljIHRvIGFzeW5jKiBtZXRob2RzLgogIGZpbmFsIGpzLkV4cHJlc3Npb24gbmV3Q29udHJvbGxlcjsKICBMaXN0PGpzLkV4cHJlc3Npb24+IG5ld0NvbnRyb2xsZXJUeXBlQXJndW1lbnRzOwoKICAvLy8gVXNlZCB0byBnZXQgdGhlIGBTdHJlYW1gIG91dCBvZiB0aGUgW2NvbnRyb2xsZXJOYW1lXSB2YXJpYWJsZS4KICBmaW5hbCBqcy5FeHByZXNzaW9uIHN0cmVhbU9mQ29udHJvbGxlcjsKCiAgLy8vIEEgSlMgRXhwcmVzc2lvbiB0aGF0IGNyZWF0ZXMgYSBtYXJrZXIgaW5kaWNhdGluZyBhICd5aWVsZCcgc3RhdGVtZW50LgogIC8vLwogIC8vLyBDYWxsZWQgd2l0aCB0aGUgdmFsdWUgdG8geWllbGQuCiAgZmluYWwganMuRXhwcmVzc2lvbiB5aWVsZEV4cHJlc3Npb247CgogIC8vLyBBIEpTIEV4cHJlc3Npb24gdGhhdCBjcmVhdGVzIGEgbWFya2VyIGluZGljYXRpb24gYSAneWllbGQqJyBzdGF0ZW1lbnQuCiAgLy8vCiAgLy8vIENhbGxlZCB3aXRoIHRoZSBzdHJlYW0gdG8geWllbGQgZnJvbS4KICBmaW5hbCBqcy5FeHByZXNzaW9uIHlpZWxkU3RhckV4cHJlc3Npb247CgogIGZpbmFsIGpzLkV4cHJlc3Npb24gd3JhcEJvZHk7CgogIEFzeW5jU3RhclJld3JpdGVyKERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwgU3Bhbm5hYmxlIHNwYW5uYWJsZSwKICAgICAge3RoaXMuYXN5bmNTdGFySGVscGVyLAogICAgICB0aGlzLnN0cmVhbU9mQ29udHJvbGxlciwKICAgICAgdGhpcy5uZXdDb250cm9sbGVyLAogICAgICB0aGlzLm5ld0NvbnRyb2xsZXJUeXBlQXJndW1lbnRzLAogICAgICB0aGlzLnlpZWxkRXhwcmVzc2lvbiwKICAgICAgdGhpcy55aWVsZFN0YXJFeHByZXNzaW9uLAogICAgICB0aGlzLndyYXBCb2R5LAogICAgICBTdHJpbmcgc2FmZVZhcmlhYmxlTmFtZShTdHJpbmcgcHJvcG9zZWROYW1lKSwKICAgICAganMuTmFtZSBib2R5TmFtZX0pCiAgICAgIDogc3VwZXIocmVwb3J0ZXIsIHNwYW5uYWJsZSwgc2FmZVZhcmlhYmxlTmFtZSwgYm9keU5hbWUpOwoKICAvLy8gVHJhbnNsYXRlcyBhIHlpZWxkL3lpZWxkKiBpbiBhbiBhc3luYyogZnVuY3Rpb24uCiAgLy8vCiAgLy8vIHlpZWxkL3lpZWxkKiBpbiBhbiBhc3luYyogZnVuY3Rpb24gaXMgdHJhbnNsYXRlZCBtdWNoIGxpa2UgdGhlIGBhd2FpdGAgaXMKICAvLy8gdHJhbnNsYXRlZCBpbiBbdmlzaXRBd2FpdF0sIG9ubHkgdGhlIG9iamVjdCBpcyB3cmFwcGVkIGluIGEKICAvLy8gW3lpZWxkRXhwcmVzc2lvbl0vW3lpZWxkU3RhckV4cHJlc3Npb25dIHRvIGxldCBbYXN5bmNTdGFySGVscGVyXQogIC8vLyBkaXN0aW5ndWlzaCB0aGVtLgogIC8vLyBBbHNvIFtuZXh0V2hlbkNhbmNlbGVkXSBpcyBzZXQgdXAgdG8gY29udGFpbiB0aGUgZmluYWxseSBibG9ja3MgdGhhdAogIC8vLyBtdXN0IGJlIHJ1biBpbiBjYXNlIHRoZSBzdHJlYW0gd2FzIGNhbmNlbGVkLgogIEBvdmVycmlkZQogIHZvaWQgYWRkWWllbGQoanMuRGFydFlpZWxkIG5vZGUsIGpzLkV4cHJlc3Npb24gZXhwcmVzc2lvbiwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIC8vIEZpbmQgYWxsIHRoZSBmaW5hbGx5IGJsb2NrcyB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgaWYgdGhlIHN0cmVhbSBpcwogICAgLy8gY2FuY2VsZWQgZHVyaW5nIHRoZSB5aWVsZC4KICAgIC8vIEF0IHRoZSBib3R0b20gb2YgdGhlIHN0YWNrIGlzIHRoZSByZXR1cm4gbGFiZWwuCiAgICBMaXN0PGludD4gZW5jbG9zaW5nRmluYWxseUxhYmVscyA9IDxpbnQ+W2V4aXRMYWJlbF07CiAgICBlbmNsb3NpbmdGaW5hbGx5TGFiZWxzLmFkZEFsbChqdW1wVGFyZ2V0cwogICAgICAgIC53aGVyZSgoanMuTm9kZSBub2RlKSA9PiBmaW5hbGx5TGFiZWxzW25vZGVdICE9IG51bGwpCiAgICAgICAgLm1hcCgoanMuTm9kZSBub2RlKSA9PiBmaW5hbGx5TGFiZWxzW25vZGVdKSk7CiAgICBhZGRTdGF0ZW1lbnQoanMuanMuc3RhdGVtZW50KCIjID0gIzsiLCBbCiAgICAgIG5leHRXaGVuQ2FuY2VsZWQsCiAgICAgIG5ldyBqcy5BcnJheUluaXRpYWxpemVyKGVuY2xvc2luZ0ZpbmFsbHlMYWJlbHMubWFwKGpzLm51bWJlcikudG9MaXN0KCkpCiAgICBdKS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICAgIGpzLkV4cHJlc3Npb24geWllbGRFeHByZXNzaW9uQ2FsbCA9IGpzLmpzKCIjeWllbGRFeHByZXNzaW9uKCNleHByZXNzaW9uKSIsIHsKICAgICAgInlpZWxkRXhwcmVzc2lvbiI6IG5vZGUuaGFzU3RhciA/IHlpZWxkU3RhckV4cHJlc3Npb24gOiB5aWVsZEV4cHJlc3Npb24sCiAgICAgICJleHByZXNzaW9uIjogZXhwcmVzc2lvbiwKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBqcy5FeHByZXNzaW9uIGFzeW5jU3RhckhlbHBlckNhbGwgPSBqcwogICAgICAgIC5qcygiI2FzeW5jU3RhckhlbHBlcigjeWllbGRFeHByZXNzaW9uQ2FsbCwgI2JvZHlOYW1lLCAjY29udHJvbGxlcikiLCB7CiAgICAgICJhc3luY1N0YXJIZWxwZXIiOiBhc3luY1N0YXJIZWxwZXIsCiAgICAgICJ5aWVsZEV4cHJlc3Npb25DYWxsIjogeWllbGRFeHByZXNzaW9uQ2FsbCwKICAgICAgImJvZHlOYW1lIjogYm9keU5hbWUsCiAgICAgICJjb250cm9sbGVyIjogY29udHJvbGxlck5hbWUsCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pOwogICAgYWRkU3RhdGVtZW50KG5ldyBqcy5SZXR1cm4oYXN5bmNTdGFySGVscGVyQ2FsbCkKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBqcy5GdW4gZmluaXNoRnVuY3Rpb24oCiAgICAgIExpc3Q8anMuUGFyYW1ldGVyPiBwYXJhbWV0ZXJzLAogICAgICBMaXN0PGpzLlBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMsCiAgICAgIGpzLlN0YXRlbWVudCByZXdyaXR0ZW5Cb2R5LAogICAgICBqcy5WYXJpYWJsZURlY2xhcmF0aW9uTGlzdCB2YXJpYWJsZURlY2xhcmF0aW9ucywKICAgICAgU291cmNlSW5mb3JtYXRpb24gZnVuY3Rpb25Tb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgU291cmNlSW5mb3JtYXRpb24gYm9keVNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBqcy5FeHByZXNzaW9uIHVwZGF0ZU5leHQgPSBqcy5qcygiI25leHQgPSAjbmV4dFdoZW5DYW5jZWxlZCIsIHsKICAgICAgIm5leHQiOiBuZXh0LAogICAgICAibmV4dFdoZW5DYW5jZWxlZCI6IG5leHRXaGVuQ2FuY2VsZWQsCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oYm9keVNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLkV4cHJlc3Npb24gY2FsbFBvcCA9IGpzLmpzKCIjbmV4dC5wb3AoKSIsIHsKICAgICAgIm5leHQiOiBuZXh0LAogICAgfSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKGJvZHlTb3VyY2VJbmZvcm1hdGlvbik7CiAgICBqcy5FeHByZXNzaW9uIGdvdG9DYW5jZWxsZWQgPSBqcy5qcygiI2dvdG8gPSAjY2FsbFBvcCIsIHsKICAgICAgImdvdG8iOiBnb3RvLAogICAgICAiY2FsbFBvcCI6IGNhbGxQb3AsCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oYm9keVNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLkV4cHJlc3Npb24gdXBkYXRlRXJyb3IgPSBqcy5qcygiI2N1cnJlbnRFcnJvciA9ICNyZXN1bHQiLCB7CiAgICAgICJjdXJyZW50RXJyb3IiOiBjdXJyZW50RXJyb3IsCiAgICAgICJyZXN1bHQiOiByZXN1bHROYW1lLAogICAgfSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKGJvZHlTb3VyY2VJbmZvcm1hdGlvbik7CiAgICBqcy5FeHByZXNzaW9uIGdvdG9FcnJvciA9IGpzLmpzKCIjZ290byA9ICNoYW5kbGVyIiwgewogICAgICAiZ290byI6IGdvdG8sCiAgICAgICJoYW5kbGVyIjogaGFuZGxlciwKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihib2R5U291cmNlSW5mb3JtYXRpb24pOwogICAganMuU3RhdGVtZW50IGJyZWFrU3RhdGVtZW50ID0KICAgICAgICBuZXcganMuQnJlYWsobnVsbCkud2l0aFNvdXJjZUluZm9ybWF0aW9uKGJvZHlTb3VyY2VJbmZvcm1hdGlvbik7CiAgICBqcy5TdGF0ZW1lbnQgc3dpdGNoQ2FzZSA9IGpzLmpzLnN0YXRlbWVudCgiIiIKICAgICAgICBzd2l0Y2ggKCNlcnJvckNvZGUpIHsKICAgICAgICAgIGNhc2UgI1NUUkVBTV9XQVNfQ0FOQ0VMRUQ6CiAgICAgICAgICAgICN1cGRhdGVOZXh0OwogICAgICAgICAgICAjZ290b0NhbmNlbGxlZDsKICAgICAgICAgICAgI2JyZWFrOwogICAgICAgICAgY2FzZSAjRVJST1I6CiAgICAgICAgICAgICN1cGRhdGVFcnJvcjsKICAgICAgICAgICAgI2dvdG9FcnJvcjsKICAgICAgICB9IiIiLCB7CiAgICAgICJlcnJvckNvZGUiOiBlcnJvckNvZGVOYW1lLAogICAgICAiU1RSRUFNX1dBU19DQU5DRUxFRCI6IGpzLm51bWJlcihlcnJvcl9jb2Rlcy5TVFJFQU1fV0FTX0NBTkNFTEVEKSwKICAgICAgInVwZGF0ZU5leHQiOiB1cGRhdGVOZXh0LAogICAgICAiZ290b0NhbmNlbGxlZCI6IGdvdG9DYW5jZWxsZWQsCiAgICAgICJicmVhayI6IGJyZWFrU3RhdGVtZW50LAogICAgICAiRVJST1IiOiBqcy5udW1iZXIoZXJyb3JfY29kZXMuRVJST1IpLAogICAgICAidXBkYXRlRXJyb3IiOiB1cGRhdGVFcnJvciwKICAgICAgImdvdG9FcnJvciI6IGdvdG9FcnJvciwKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihib2R5U291cmNlSW5mb3JtYXRpb24pOwogICAganMuU3RhdGVtZW50IGlmRXJyb3IgPSBqcy5qcy5zdGF0ZW1lbnQoIiIiCiAgICAgICAgaWYgKCNlcnJvckNvZGUgPT09ICNFUlJPUikgewogICAgICAgICAgI3VwZGF0ZUVycm9yOwogICAgICAgICAgI2dvdG9FcnJvcjsKICAgICAgICB9IiIiLCB7CiAgICAgICJlcnJvckNvZGUiOiBlcnJvckNvZGVOYW1lLAogICAgICAiRVJST1IiOiBqcy5udW1iZXIoZXJyb3JfY29kZXMuRVJST1IpLAogICAgICAidXBkYXRlRXJyb3IiOiB1cGRhdGVFcnJvciwKICAgICAgImdvdG9FcnJvciI6IGdvdG9FcnJvciwKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihib2R5U291cmNlSW5mb3JtYXRpb24pOwogICAganMuU3RhdGVtZW50IGlmSGFzWWllbGQgPSBqcy5qcy5zdGF0ZW1lbnQoIiIiCiAgICAgICAgaWYgKCNoYXNZaWVsZCkgewogICAgICAgICAgI3N3aXRjaENhc2UKICAgICAgICB9IGVsc2UgewogICAgICAgICAgI2lmRXJyb3I7CiAgICAgICAgfQogICAgIiIiLCB7CiAgICAgICJoYXNZaWVsZCI6IGFuYWx5c2lzLmhhc1lpZWxkLAogICAgICAic3dpdGNoQ2FzZSI6IHN3aXRjaENhc2UsCiAgICAgICJpZkVycm9yIjogaWZFcnJvciwKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihib2R5U291cmNlSW5mb3JtYXRpb24pOwogICAganMuRnVuIGlubmVyRnVuY3Rpb24gPSBqcy5qcygiIiIKICAgICAgICBmdW5jdGlvbiAoI2Vycm9yQ29kZSwgI3Jlc3VsdCkgewogICAgICAgICAgI2lmSGFzWWllbGQ7CiAgICAgICAgICAjcmV3cml0dGVuQm9keTsKICAgICAgICB9IiIiLCB7CiAgICAgICJlcnJvckNvZGUiOiBlcnJvckNvZGVOYW1lLAogICAgICAicmVzdWx0IjogcmVzdWx0TmFtZSwKICAgICAgImlmSGFzWWllbGQiOiBpZkhhc1lpZWxkLAogICAgICAicmV3cml0dGVuQm9keSI6IHJld3JpdHRlbkJvZHksCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oZnVuY3Rpb25Tb3VyY2VJbmZvcm1hdGlvbik7CiAgICBqcy5FeHByZXNzaW9uIHdyYXBCb2R5Q2FsbCA9IGpzLmpzKCIjd3JhcEJvZHkoI2lubmVyRnVuY3Rpb24pIiwgewogICAgICAid3JhcEJvZHkiOiB3cmFwQm9keSwKICAgICAgImlubmVyRnVuY3Rpb24iOiBpbm5lckZ1bmN0aW9uLAogICAgfSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKGJvZHlTb3VyY2VJbmZvcm1hdGlvbik7CiAgICBqcy5TdGF0ZW1lbnQgZGVjbGFyZUJvZHlOYW1lID0KICAgICAgICBqcy5qcy5zdGF0ZW1lbnQoInZhciAjYm9keU5hbWUgPSAjd3JhcEJvZHlDYWxsOyIsIHsKICAgICAgImJvZHlOYW1lIjogYm9keU5hbWUsCiAgICAgICJ3cmFwQm9keUNhbGwiOiB3cmFwQm9keUNhbGwsCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oYm9keVNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLkV4cHJlc3Npb24gc3RyZWFtT2ZDb250cm9sbGVyQ2FsbCA9CiAgICAgICAganMuanMoIiNzdHJlYW1PZkNvbnRyb2xsZXIoI2NvbnRyb2xsZXIpIiwgewogICAgICAic3RyZWFtT2ZDb250cm9sbGVyIjogc3RyZWFtT2ZDb250cm9sbGVyLAogICAgICAiY29udHJvbGxlciI6IGNvbnRyb2xsZXJOYW1lLAogICAgfSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKGJvZHlTb3VyY2VJbmZvcm1hdGlvbik7CiAgICBqcy5SZXR1cm4gcmV0dXJuU3RyZWFtT2ZDb250cm9sbGVyQ2FsbCA9CiAgICAgICAgbmV3IGpzLlJldHVybihzdHJlYW1PZkNvbnRyb2xsZXJDYWxsKQogICAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKGJvZHlTb3VyY2VJbmZvcm1hdGlvbik7CiAgICByZXR1cm4ganMuanMoIiIiCiAgICAgICAgZnVuY3Rpb24gKCNwYXJhbWV0ZXJzLCAjdHlwZVBhcmFtZXRlcnMpIHsKICAgICAgICAgICNkZWNsYXJlQm9keU5hbWU7CiAgICAgICAgICAjdmFyaWFibGVEZWNsYXJhdGlvbnM7CiAgICAgICAgICAjcmV0dXJuU3RyZWFtT2ZDb250cm9sbGVyQ2FsbDsKICAgICAgICB9IiIiLCB7CiAgICAgICJwYXJhbWV0ZXJzIjogcGFyYW1ldGVycywKICAgICAgInR5cGVQYXJhbWV0ZXJzIjogdHlwZVBhcmFtZXRlcnMsCiAgICAgICJkZWNsYXJlQm9keU5hbWUiOiBkZWNsYXJlQm9keU5hbWUsCiAgICAgICJ2YXJpYWJsZURlY2xhcmF0aW9ucyI6IHZhcmlhYmxlRGVjbGFyYXRpb25zLAogICAgICAicmV0dXJuU3RyZWFtT2ZDb250cm9sbGVyQ2FsbCI6IHJldHVyblN0cmVhbU9mQ29udHJvbGxlckNhbGwsCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oZnVuY3Rpb25Tb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZEVycm9yRXhpdChTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgaGFzSGFuZGxlckxhYmVscyA9IHRydWU7CiAgICBiZWdpbkxhYmVsKHJldGhyb3dMYWJlbCk7CiAgICBqcy5FeHByZXNzaW9uIGFzeW5jSGVscGVyQ2FsbCA9CiAgICAgICAganMuanMoIiNhc3luY0hlbHBlcigjY3VycmVudEVycm9yLCAjZXJyb3JDb2RlLCAjY29udHJvbGxlcikiLCB7CiAgICAgICJhc3luY0hlbHBlciI6IGFzeW5jU3RhckhlbHBlciwKICAgICAgImVycm9yQ29kZSI6IGpzLm51bWJlcihlcnJvcl9jb2Rlcy5FUlJPUiksCiAgICAgICJjdXJyZW50RXJyb3IiOiBjdXJyZW50RXJyb3IsCiAgICAgICJjb250cm9sbGVyIjogY29udHJvbGxlck5hbWUKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBhZGRTdGF0ZW1lbnQobmV3IGpzLlJldHVybihhc3luY0hlbHBlckNhbGwpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgLy8vIFJldHVybmluZyBmcm9tIGFuIGFzeW5jKiBmdW5jdGlvbiBjYWxscyB0aGUgW3N0cmVhbUhlbHBlcl0gd2l0aCBhbgogIC8vLyBbZW5kT2ZJdGVyYXRpb25dIG1hcmtlci4KICBAb3ZlcnJpZGUKICB2b2lkIGFkZFN1Y2Nlc3NFeGl0KFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBiZWdpbkxhYmVsKGV4aXRMYWJlbCk7CgogICAganMuRXhwcmVzc2lvbiBzdHJlYW1IZWxwZXJDYWxsID0KICAgICAgICBqcy5qcygiI3N0cmVhbUhlbHBlcihudWxsLCAjc3VjY2Vzc0NvZGUsICNjb250cm9sbGVyKSIsIHsKICAgICAgInN0cmVhbUhlbHBlciI6IGFzeW5jU3RhckhlbHBlciwKICAgICAgInN1Y2Nlc3NDb2RlIjoganMubnVtYmVyKGVycm9yX2NvZGVzLlNVQ0NFU1MpLAogICAgICAiY29udHJvbGxlciI6IGNvbnRyb2xsZXJOYW1lCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pOwogICAgYWRkU3RhdGVtZW50KG5ldyBqcy5SZXR1cm4oc3RyZWFtSGVscGVyQ2FsbCkKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uPiB2YXJpYWJsZUluaXRpYWxpemF0aW9ucygKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIExpc3Q8anMuVmFyaWFibGVJbml0aWFsaXphdGlvbj4gdmFyaWFibGVzID0gPGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24+W107CiAgICB2YXJpYWJsZXMuYWRkKF9tYWtlVmFyaWFibGVJbml0aWFsaXplcigKICAgICAgICBjb250cm9sbGVyLAogICAgICAgIGpzLmpzKCcjKCMsICMpJywgWwogICAgICAgICAgbmV3Q29udHJvbGxlciwKICAgICAgICAgIGJvZHlOYW1lLAogICAgICAgICAgbmV3Q29udHJvbGxlclR5cGVBcmd1bWVudHMKICAgICAgICBdKS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pLAogICAgICAgIHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICBpZiAoYW5hbHlzaXMuaGFzWWllbGQpIHsKICAgICAgdmFyaWFibGVzLmFkZCgKICAgICAgICAgIF9tYWtlVmFyaWFibGVJbml0aWFsaXplcihuZXh0V2hlbkNhbmNlbGVkLCBudWxsLCBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfQogICAgcmV0dXJuIHZhcmlhYmxlczsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaW5pdGlhbGl6ZU5hbWVzKCkgewogICAgY29udHJvbGxlck5hbWUgPSBmcmVzaE5hbWUoImNvbnRyb2xsZXIiKTsKICAgIG5leHRXaGVuQ2FuY2VsZWROYW1lID0gZnJlc2hOYW1lKCJuZXh0V2hlbkNhbmNlbGVkIik7CiAgICBuZXdDb250cm9sbGVyVHlwZUFyZ3VtZW50cyA9CiAgICAgICAgcHJvY2Vzc1R5cGVBcmd1bWVudHMobmV3Q29udHJvbGxlclR5cGVBcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAganMuU3RhdGVtZW50IGF3YWl0U3RhdGVtZW50KAogICAgICBqcy5FeHByZXNzaW9uIHZhbHVlLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAganMuRXhwcmVzc2lvbiBhc3luY0hlbHBlckNhbGwgPQogICAgICAgIGpzLmpzKCIjYXN5bmNIZWxwZXIoI3ZhbHVlLCAjYm9keU5hbWUsICNjb250cm9sbGVyKSIsIHsKICAgICAgImFzeW5jSGVscGVyIjogYXN5bmNTdGFySGVscGVyLAogICAgICAidmFsdWUiOiB2YWx1ZSwKICAgICAgImJvZHlOYW1lIjogYm9keU5hbWUsCiAgICAgICJjb250cm9sbGVyIjogY29udHJvbGxlck5hbWUKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7CiAgICByZXR1cm4gbmV3IGpzLlJldHVybihhc3luY0hlbHBlckNhbGwpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7CiAgfQp9CgovLy8gRmluZHMgb3V0Ci8vLwovLy8gLSB3aGljaCBleHByZXNzaW9ucyBoYXZlIHlpZWxkIG9yIGF3YWl0IG5lc3RlZCBpbiB0aGVtLgovLy8gLSB0YXJnZXRzIG9mIGp1bXBzCi8vLyAtIGEgc2V0IG9mIHVzZWQgbmFtZXMuCi8vLyAtIGlmIGFueSBbVGhpc10tZXhwcmVzc2lvbnMgYXJlIHVzZWQuCmNsYXNzIFByZVRyYW5zbGF0aW9uQW5hbHlzaXMgZXh0ZW5kcyBqcy5Ob2RlVmlzaXRvcjxib29sPiB7CiAgU2V0PGpzLk5vZGU+IGhhc0F3YWl0T3JZaWVsZCA9IG5ldyBTZXQ8anMuTm9kZT4oKTsKCiAgTWFwPGpzLk5vZGUsIGpzLk5vZGU+IHRhcmdldHMgPSBuZXcgTWFwPGpzLk5vZGUsIGpzLk5vZGU+KCk7CiAgTGlzdDxqcy5Ob2RlPiBsb29wc0FuZFN3aXRjaGVzID0gPGpzLk5vZGU+W107CiAgTGlzdDxqcy5MYWJlbGVkU3RhdGVtZW50PiBsYWJlbGxlZFN0YXRlbWVudHMgPSA8anMuTGFiZWxlZFN0YXRlbWVudD5bXTsKICBTZXQ8U3RyaW5nPiB1c2VkTmFtZXMgPSBuZXcgU2V0PFN0cmluZz4oKTsKCiAgYm9vbCBoYXNFeHBsaWNpdFJldHVybnMgPSBmYWxzZTsKCiAgYm9vbCBoYXNUaGlzID0gZmFsc2U7CgogIGJvb2wgaGFzWWllbGQgPSBmYWxzZTsKCiAgYm9vbCBoYXNGaW5hbGx5ID0gZmFsc2U7CgogIC8vIFRoZSBmdW5jdGlvbiBjdXJyZW50bHkgYmVpbmcgYW5hbHl6ZWQuCiAganMuRnVuIGN1cnJlbnRGdW5jdGlvbjsKCiAgLy8gRm9yIGVycm9yIG1lc3NhZ2VzLgogIGZpbmFsIEZ1bmN0aW9uIHVuc3VwcG9ydGVkOwoKICBQcmVUcmFuc2xhdGlvbkFuYWx5c2lzKHZvaWQgdGhpcy51bnN1cHBvcnRlZChqcy5Ob2RlIG5vZGUpKTsKCiAgYm9vbCB2aXNpdChqcy5Ob2RlIG5vZGUpIHsKICAgIGJvb2wgY29udGFpbnNBd2FpdCA9IG5vZGUuYWNjZXB0KHRoaXMpOwogICAgaWYgKGNvbnRhaW5zQXdhaXQpIHsKICAgICAgaGFzQXdhaXRPcllpZWxkLmFkZChub2RlKTsKICAgIH0KICAgIHJldHVybiBjb250YWluc0F3YWl0OwogIH0KCiAgYW5hbHl6ZShqcy5GdW4gbm9kZSkgewogICAgY3VycmVudEZ1bmN0aW9uID0gbm9kZTsKICAgIG5vZGUucGFyYW1zLmZvckVhY2godmlzaXQpOwogICAgdmlzaXQobm9kZS5ib2R5KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRBY2Nlc3MoanMuUHJvcGVydHlBY2Nlc3Mgbm9kZSkgewogICAgYm9vbCByZWNlaXZlciA9IHZpc2l0KG5vZGUucmVjZWl2ZXIpOwogICAgYm9vbCBzZWxlY3RvciA9IHZpc2l0KG5vZGUuc2VsZWN0b3IpOwogICAgcmV0dXJuIHJlY2VpdmVyIHx8IHNlbGVjdG9yOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEFycmF5SG9sZShqcy5BcnJheUhvbGUgbm9kZSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEFycmF5SW5pdGlhbGl6ZXIoanMuQXJyYXlJbml0aWFsaXplciBub2RlKSB7CiAgICBib29sIGNvbnRhaW5zQXdhaXQgPSBmYWxzZTsKICAgIGZvciAoanMuRXhwcmVzc2lvbiBlbGVtZW50IGluIG5vZGUuZWxlbWVudHMpIHsKICAgICAgaWYgKHZpc2l0KGVsZW1lbnQpKSBjb250YWluc0F3YWl0ID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBjb250YWluc0F3YWl0OwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEFzc2lnbm1lbnQoanMuQXNzaWdubWVudCBub2RlKSB7CiAgICBib29sIGxlZnRIYW5kU2lkZSA9IHZpc2l0KG5vZGUubGVmdEhhbmRTaWRlKTsKICAgIGJvb2wgdmFsdWUgPSAobm9kZS52YWx1ZSA9PSBudWxsKSA/IGZhbHNlIDogdmlzaXQobm9kZS52YWx1ZSk7CiAgICByZXR1cm4gbGVmdEhhbmRTaWRlIHx8IHZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEF3YWl0KGpzLkF3YWl0IG5vZGUpIHsKICAgIHZpc2l0KG5vZGUuZXhwcmVzc2lvbik7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRCaW5hcnkoanMuQmluYXJ5IG5vZGUpIHsKICAgIGJvb2wgbGVmdCA9IHZpc2l0KG5vZGUubGVmdCk7CiAgICBib29sIHJpZ2h0ID0gdmlzaXQobm9kZS5yaWdodCk7CiAgICByZXR1cm4gbGVmdCB8fCByaWdodDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRCbG9jayhqcy5CbG9jayBub2RlKSB7CiAgICBib29sIGNvbnRhaW5zQXdhaXQgPSBmYWxzZTsKICAgIGZvciAoanMuU3RhdGVtZW50IHN0YXRlbWVudCBpbiBub2RlLnN0YXRlbWVudHMpIHsKICAgICAgaWYgKHZpc2l0KHN0YXRlbWVudCkpIGNvbnRhaW5zQXdhaXQgPSB0cnVlOwogICAgfQogICAgcmV0dXJuIGNvbnRhaW5zQXdhaXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0QnJlYWsoanMuQnJlYWsgbm9kZSkgewogICAgaWYgKG5vZGUudGFyZ2V0TGFiZWwgIT0gbnVsbCkgewogICAgICB0YXJnZXRzW25vZGVdID0KICAgICAgICAgIGxhYmVsbGVkU3RhdGVtZW50cy5sYXN0V2hlcmUoKGpzLkxhYmVsZWRTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CiAgICAgICAgcmV0dXJuIHN0YXRlbWVudC5sYWJlbCA9PSBub2RlLnRhcmdldExhYmVsOwogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIHRhcmdldHNbbm9kZV0gPSBsb29wc0FuZFN3aXRjaGVzLmxhc3Q7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0Q2FsbChqcy5DYWxsIG5vZGUpIHsKICAgIGJvb2wgY29udGFpbnNBd2FpdCA9IHZpc2l0KG5vZGUudGFyZ2V0KTsKICAgIGZvciAoanMuRXhwcmVzc2lvbiBhcmd1bWVudCBpbiBub2RlLmFyZ3VtZW50cykgewogICAgICBpZiAodmlzaXQoYXJndW1lbnQpKSBjb250YWluc0F3YWl0ID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBjb250YWluc0F3YWl0OwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdENhc2UoanMuQ2FzZSBub2RlKSB7CiAgICBib29sIGV4cHJlc3Npb24gPSB2aXNpdChub2RlLmV4cHJlc3Npb24pOwogICAgYm9vbCBib2R5ID0gdmlzaXQobm9kZS5ib2R5KTsKICAgIHJldHVybiBleHByZXNzaW9uIHx8IGJvZHk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0Q2F0Y2goanMuQ2F0Y2ggbm9kZSkgewogICAgYm9vbCBkZWNsYXJhdGlvbiA9IHZpc2l0KG5vZGUuZGVjbGFyYXRpb24pOwogICAgYm9vbCBib2R5ID0gdmlzaXQobm9kZS5ib2R5KTsKICAgIHJldHVybiBkZWNsYXJhdGlvbiB8fCBib2R5OwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdENvbW1lbnQoanMuQ29tbWVudCBub2RlKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0Q29uZGl0aW9uYWwoanMuQ29uZGl0aW9uYWwgbm9kZSkgewogICAgYm9vbCBjb25kaXRpb24gPSB2aXNpdChub2RlLmNvbmRpdGlvbik7CiAgICBib29sIHRoZW4gPSB2aXNpdChub2RlLnRoZW4pOwogICAgYm9vbCBvdGhlcndpc2UgPSB2aXNpdChub2RlLm90aGVyd2lzZSk7CiAgICByZXR1cm4gY29uZGl0aW9uIHx8IHRoZW4gfHwgb3RoZXJ3aXNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdENvbnRpbnVlKGpzLkNvbnRpbnVlIG5vZGUpIHsKICAgIGlmIChub2RlLnRhcmdldExhYmVsICE9IG51bGwpIHsKICAgICAganMuTGFiZWxlZFN0YXRlbWVudCB0YXJnZXRMYWJlbCA9IGxhYmVsbGVkU3RhdGVtZW50cy5sYXN0V2hlcmUoCiAgICAgICAgICAoanMuTGFiZWxlZFN0YXRlbWVudCBzdG0pID0+IHN0bS5sYWJlbCA9PSBub2RlLnRhcmdldExhYmVsKTsKICAgICAganMuTG9vcCB0YXJnZXRTdGF0ZW1lbnQgPSB0YXJnZXRMYWJlbC5ib2R5OwogICAgICB0YXJnZXRzW25vZGVdID0gdGFyZ2V0U3RhdGVtZW50OwogICAgfSBlbHNlIHsKICAgICAgdGFyZ2V0c1tub2RlXSA9CiAgICAgICAgICBsb29wc0FuZFN3aXRjaGVzLmxhc3RXaGVyZSgoanMuTm9kZSBub2RlKSA9PiBub2RlIGlzISBqcy5Td2l0Y2gpOwogICAgfQogICAgYXNzZXJ0KCgpIHsKICAgICAganMuTm9kZSB0YXJnZXQgPSB0YXJnZXRzW25vZGVdOwogICAgICByZXR1cm4gdGFyZ2V0IGlzIGpzLkxvb3AgfHwKICAgICAgICAgICh0YXJnZXQgaXMganMuTGFiZWxlZFN0YXRlbWVudCAmJiB0YXJnZXQuYm9keSBpcyBqcy5Mb29wKTsKICAgIH0oKSk7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RGVmYXVsdChqcy5EZWZhdWx0IG5vZGUpIHsKICAgIHJldHVybiB2aXNpdChub2RlLmJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdERvKGpzLkRvIG5vZGUpIHsKICAgIGxvb3BzQW5kU3dpdGNoZXMuYWRkKG5vZGUpOwogICAgYm9vbCBib2R5ID0gdmlzaXQobm9kZS5ib2R5KTsKICAgIGJvb2wgY29uZGl0aW9uID0gdmlzaXQobm9kZS5jb25kaXRpb24pOwogICAgbG9vcHNBbmRTd2l0Y2hlcy5yZW1vdmVMYXN0KCk7CiAgICByZXR1cm4gYm9keSB8fCBjb25kaXRpb247CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RW1wdHlTdGF0ZW1lbnQoanMuRW1wdHlTdGF0ZW1lbnQgbm9kZSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoanMuRXhwcmVzc2lvblN0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gdmlzaXQobm9kZS5leHByZXNzaW9uKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRGb3IoanMuRm9yIG5vZGUpIHsKICAgIGJvb2wgaW5pdCA9IChub2RlLmluaXQgPT0gbnVsbCkgPyBmYWxzZSA6IHZpc2l0KG5vZGUuaW5pdCk7CiAgICBib29sIGNvbmRpdGlvbiA9IChub2RlLmNvbmRpdGlvbiA9PSBudWxsKSA/IGZhbHNlIDogdmlzaXQobm9kZS5jb25kaXRpb24pOwogICAgYm9vbCB1cGRhdGUgPSAobm9kZS51cGRhdGUgPT0gbnVsbCkgPyBmYWxzZSA6IHZpc2l0KG5vZGUudXBkYXRlKTsKICAgIGxvb3BzQW5kU3dpdGNoZXMuYWRkKG5vZGUpOwogICAgYm9vbCBib2R5ID0gdmlzaXQobm9kZS5ib2R5KTsKICAgIGxvb3BzQW5kU3dpdGNoZXMucmVtb3ZlTGFzdCgpOwogICAgcmV0dXJuIGluaXQgfHwgY29uZGl0aW9uIHx8IHVwZGF0ZSB8fCBib2R5OwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEZvckluKGpzLkZvckluIG5vZGUpIHsKICAgIGJvb2wgb2JqZWN0ID0gdmlzaXQobm9kZS5vYmplY3QpOwogICAgbG9vcHNBbmRTd2l0Y2hlcy5hZGQobm9kZSk7CiAgICBib29sIGJvZHkgPSB2aXNpdChub2RlLmJvZHkpOwogICAgbG9vcHNBbmRTd2l0Y2hlcy5yZW1vdmVMYXN0KCk7CiAgICByZXR1cm4gb2JqZWN0IHx8IGJvZHk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RnVuKGpzLkZ1biBub2RlKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihqcy5GdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJZihqcy5JZiBub2RlKSB7CiAgICBib29sIGNvbmRpdGlvbiA9IHZpc2l0KG5vZGUuY29uZGl0aW9uKTsKICAgIGJvb2wgdGhlbiA9IHZpc2l0KG5vZGUudGhlbik7CiAgICBib29sIG90aGVyd2lzZSA9IHZpc2l0KG5vZGUub3RoZXJ3aXNlKTsKICAgIHJldHVybiBjb25kaXRpb24gfHwgdGhlbiB8fCBvdGhlcndpc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0SW50ZXJwb2xhdGVkRXhwcmVzc2lvbihqcy5JbnRlcnBvbGF0ZWRFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJbnRlcnBvbGF0ZWREZWNsYXJhdGlvbihqcy5JbnRlcnBvbGF0ZWREZWNsYXJhdGlvbiBub2RlKSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0SW50ZXJwb2xhdGVkTGl0ZXJhbChqcy5JbnRlcnBvbGF0ZWRMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJbnRlcnBvbGF0ZWRQYXJhbWV0ZXIoanMuSW50ZXJwb2xhdGVkUGFyYW1ldGVyIG5vZGUpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJbnRlcnBvbGF0ZWRTZWxlY3Rvcihqcy5JbnRlcnBvbGF0ZWRTZWxlY3RvciBub2RlKSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0SW50ZXJwb2xhdGVkU3RhdGVtZW50KGpzLkludGVycG9sYXRlZFN0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0TGFiZWxlZFN0YXRlbWVudChqcy5MYWJlbGVkU3RhdGVtZW50IG5vZGUpIHsKICAgIHVzZWROYW1lcy5hZGQobm9kZS5sYWJlbCk7CiAgICBsYWJlbGxlZFN0YXRlbWVudHMuYWRkKG5vZGUpOwogICAgYm9vbCBjb250YWluc0F3YWl0ID0gdmlzaXQobm9kZS5ib2R5KTsKICAgIGxhYmVsbGVkU3RhdGVtZW50cy5yZW1vdmVMYXN0KCk7CiAgICByZXR1cm4gY29udGFpbnNBd2FpdDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXREZWZlcnJlZEV4cHJlc3Npb24oanMuRGVmZXJyZWRFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXREZWZlcnJlZE51bWJlcihqcy5EZWZlcnJlZE51bWJlciBub2RlKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RGVmZXJyZWRTdHJpbmcoanMuRGVmZXJyZWRTdHJpbmcgbm9kZSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdExpdGVyYWxCb29sKGpzLkxpdGVyYWxCb29sIG5vZGUpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRMaXRlcmFsRXhwcmVzc2lvbihqcy5MaXRlcmFsRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0TGl0ZXJhbE51bGwoanMuTGl0ZXJhbE51bGwgbm9kZSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdExpdGVyYWxOdW1iZXIoanMuTGl0ZXJhbE51bWJlciBub2RlKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0TGl0ZXJhbFN0YXRlbWVudChqcy5MaXRlcmFsU3RhdGVtZW50IG5vZGUpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRMaXRlcmFsU3RyaW5nKGpzLkxpdGVyYWxTdHJpbmcgbm9kZSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oanMuU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0TmFtZShqcy5OYW1lIG5vZGUpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRQYXJlbnRoZXNlcyhqcy5QYXJlbnRoZXNlcyBub2RlKSB7CiAgICByZXR1cm4gdmlzaXQobm9kZS5lbmNsb3NlZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0TmFtZWRGdW5jdGlvbihqcy5OYW1lZEZ1bmN0aW9uIG5vZGUpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXROZXcoanMuTmV3IG5vZGUpIHsKICAgIHJldHVybiB2aXNpdENhbGwobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0T2JqZWN0SW5pdGlhbGl6ZXIoanMuT2JqZWN0SW5pdGlhbGl6ZXIgbm9kZSkgewogICAgYm9vbCBjb250YWluc0F3YWl0ID0gZmFsc2U7CiAgICBmb3IgKGpzLlByb3BlcnR5IHByb3BlcnR5IGluIG5vZGUucHJvcGVydGllcykgewogICAgICBpZiAodmlzaXQocHJvcGVydHkpKSBjb250YWluc0F3YWl0ID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBjb250YWluc0F3YWl0OwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFBhcmFtZXRlcihqcy5QYXJhbWV0ZXIgbm9kZSkgewogICAgdXNlZE5hbWVzLmFkZChub2RlLm5hbWUpOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFBvc3RmaXgoanMuUG9zdGZpeCBub2RlKSB7CiAgICByZXR1cm4gdmlzaXQobm9kZS5hcmd1bWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0UHJlZml4KGpzLlByZWZpeCBub2RlKSB7CiAgICByZXR1cm4gdmlzaXQobm9kZS5hcmd1bWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0UHJvZ3JhbShqcy5Qcm9ncmFtIG5vZGUpIHsKICAgIHRocm93ICJVbmV4cGVjdGVkIjsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRQcm9wZXJ0eShqcy5Qcm9wZXJ0eSBub2RlKSB7CiAgICByZXR1cm4gdmlzaXQobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0UmVnRXhwTGl0ZXJhbChqcy5SZWdFeHBMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRSZXR1cm4oanMuUmV0dXJuIG5vZGUpIHsKICAgIGhhc0V4cGxpY2l0UmV0dXJucyA9IHRydWU7CiAgICB0YXJnZXRzW25vZGVdID0gY3VycmVudEZ1bmN0aW9uOwogICAgaWYgKG5vZGUudmFsdWUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHZpc2l0KG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFN3aXRjaChqcy5Td2l0Y2ggbm9kZSkgewogICAgbG9vcHNBbmRTd2l0Y2hlcy5hZGQobm9kZSk7CiAgICAvLyBJZiB0aGUga2V5IGhhcyBhbiBgYXdhaXRgIGV4cHJlc3Npb24sIGRvIG5vdCB0cmFuc2Zvcm0gdGhlCiAgICAvLyBib2R5IG9mIHRoZSBzd2l0Y2guCiAgICB2aXNpdChub2RlLmtleSk7CiAgICBib29sIHJlc3VsdCA9IGZhbHNlOwogICAgZm9yIChqcy5Td2l0Y2hDbGF1c2UgY2xhdXNlIGluIG5vZGUuY2FzZXMpIHsKICAgICAgaWYgKHZpc2l0KGNsYXVzZSkpIHJlc3VsdCA9IHRydWU7CiAgICB9CiAgICBsb29wc0FuZFN3aXRjaGVzLnJlbW92ZUxhc3QoKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VGhpcyhqcy5UaGlzIG5vZGUpIHsKICAgIGhhc1RoaXMgPSB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFRocm93KGpzLlRocm93IG5vZGUpIHsKICAgIHJldHVybiB2aXNpdChub2RlLmV4cHJlc3Npb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFRyeShqcy5Ucnkgbm9kZSkgewogICAgYm9vbCBib2R5ID0gdmlzaXQobm9kZS5ib2R5KTsKICAgIGJvb2wgY2F0Y2hQYXJ0ID0gKG5vZGUuY2F0Y2hQYXJ0ID09IG51bGwpID8gZmFsc2UgOiB2aXNpdChub2RlLmNhdGNoUGFydCk7CiAgICBib29sIGZpbmFsbHlQYXJ0ID0KICAgICAgICAobm9kZS5maW5hbGx5UGFydCA9PSBudWxsKSA/IGZhbHNlIDogdmlzaXQobm9kZS5maW5hbGx5UGFydCk7CiAgICBpZiAoZmluYWxseVBhcnQgIT0gbnVsbCkgaGFzRmluYWxseSA9IHRydWU7CiAgICByZXR1cm4gYm9keSB8fCBjYXRjaFBhcnQgfHwgZmluYWxseVBhcnQ7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihqcy5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIHVzZWROYW1lcy5hZGQobm9kZS5uYW1lKTsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChqcy5WYXJpYWJsZURlY2xhcmF0aW9uTGlzdCBub2RlKSB7CiAgICBib29sIHJlc3VsdCA9IGZhbHNlOwogICAgZm9yIChqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uIGluaXQgaW4gbm9kZS5kZWNsYXJhdGlvbnMpIHsKICAgICAgaWYgKHZpc2l0KGluaXQpKSByZXN1bHQgPSB0cnVlOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRWYXJpYWJsZUluaXRpYWxpemF0aW9uKGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24gbm9kZSkgewogICAgcmV0dXJuIHZpc2l0QXNzaWdubWVudChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRWYXJpYWJsZVVzZShqcy5WYXJpYWJsZVVzZSBub2RlKSB7CiAgICB1c2VkTmFtZXMuYWRkKG5vZGUubmFtZSk7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0V2hpbGUoanMuV2hpbGUgbm9kZSkgewogICAgbG9vcHNBbmRTd2l0Y2hlcy5hZGQobm9kZSk7CiAgICBib29sIGNvbmRpdGlvbiA9IHZpc2l0KG5vZGUuY29uZGl0aW9uKTsKICAgIGJvb2wgYm9keSA9IHZpc2l0KG5vZGUuYm9keSk7CiAgICBsb29wc0FuZFN3aXRjaGVzLnJlbW92ZUxhc3QoKTsKICAgIHJldHVybiBjb25kaXRpb24gfHwgYm9keTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXREYXJ0WWllbGQoanMuRGFydFlpZWxkIG5vZGUpIHsKICAgIGhhc1lpZWxkID0gdHJ1ZTsKICAgIHZpc2l0KG5vZGUuZXhwcmVzc2lvbik7CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn0KizUATk48ARcBGh0BUAEZPyYYAU5IThoER04pBEoROkkVTAE+OwEjPwFQBjYGTz5MRBc9AREUATEGGAY9D004UE4kBktIKwElIiMBSwEjASMBTRcBSB0GRxcGDwYnKg40ExocHhocGkcPCggGTTg/FQFOFRgBQzIUAR8GT087EwFCQRYBT09RUFA0IQFREDsTAUVJGgFQ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HhIEAQwjICwiIx4EAQwrFRwRBAIBKnBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzL3Jld3JpdGVfYXN5bmMuZGFydDhzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19lbWl0dGVyL2pzX2VtaXR0ZXIuZGFydIKJLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5qc19lbWl0dGVyOwoKZXhwb3J0ICdjbGFzc19zdHViX2dlbmVyYXRvci5kYXJ0JzsKZXhwb3J0ICdjb2RlX2VtaXR0ZXJfdGFzay5kYXJ0JzsKZXhwb3J0ICdpbnN0YW50aWF0aW9uX3N0dWJfZ2VuZXJhdG9yLmRhcnQnOwpleHBvcnQgJ2ludGVyY2VwdG9yX3N0dWJfZ2VuZXJhdG9yLmRhcnQnOwpleHBvcnQgJ21haW5fY2FsbF9zdHViX2dlbmVyYXRvci5kYXJ0JzsKZXhwb3J0ICdtZXRhZGF0YV9jb2xsZWN0b3IuZGFydCc7CmV4cG9ydCAnbmF0aXZlX2VtaXR0ZXIuZGFydCc7CmV4cG9ydCAnbmF0aXZlX2dlbmVyYXRvci5kYXJ0JzsKZXhwb3J0ICdwYXJhbWV0ZXJfc3R1Yl9nZW5lcmF0b3IuZGFydCc7CmV4cG9ydCAncnVudGltZV90eXBlX2dlbmVyYXRvci5kYXJ0JzsKZXhwb3J0ICd0eXBlX3Rlc3RfcmVnaXN0cnkuZGFydCc7ChMATk48ARwBJCEsKigiHiAoJiIBL3BhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvanNfZW1pdHRlci5kYXJ0NHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2VtaXR0ZXIvc29ydGVyLmRhcnSESy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuanNfZW1pdHRlci5zb3J0ZXI7CgppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwoKLy8vIFNvcnRpbmcgc3RyYXRlZ3kgZm9yIGxpYnJhcmllcywgY2xhc3NlcyBhbmQgbWVtYmVycy4KYWJzdHJhY3QgY2xhc3MgU29ydGVyIHsKICAvLy8gUmV0dXJucyBhIHNvcnRlZCBsaXN0IG9mIFtsaWJyYXJpZXNdLgogIEl0ZXJhYmxlPExpYnJhcnlFbnRpdHk+IHNvcnRMaWJyYXJpZXMoSXRlcmFibGU8TGlicmFyeUVudGl0eT4gbGlicmFyaWVzKTsKCiAgLy8vIFJldHVybnMgYSBzb3J0ZWQgbGlzdCBvZiBbY2xhc3Nlc10uCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IHNvcnRDbGFzc2VzKEl0ZXJhYmxlPENsYXNzRW50aXR5PiBjbGFzc2VzKTsKCiAgLy8vIFJldHVybnMgYSBzb3J0ZWQgbGlzdCBvZiBbdHlwZWRlZnNdLgogIEl0ZXJhYmxlPFR5cGVkZWZFbnRpdHk+IHNvcnRUeXBlZGVmcyhJdGVyYWJsZTxUeXBlZGVmRW50aXR5PiB0eXBlZGVmcyk7CgogIC8vLyBSZXR1cm5zIGEgc29ydGVkIGxpc3Qgb2YgW21lbWJlcnNdLgogIEl0ZXJhYmxlPFQ+IHNvcnRNZW1iZXJzPFQgZXh0ZW5kcyBNZW1iZXJFbnRpdHk+KEl0ZXJhYmxlPFQ+IG1lbWJlcnMpOwoKICBpbnQgY29tcGFyZUxpYnJhcmllc0J5TG9jYXRpb24oTGlicmFyeUVudGl0eSBhLCBMaWJyYXJ5RW50aXR5IGIpOwogIGludCBjb21wYXJlQ2xhc3Nlc0J5TG9jYXRpb24oQ2xhc3NFbnRpdHkgYSwgQ2xhc3NFbnRpdHkgYik7CiAgaW50IGNvbXBhcmVUeXBlZGVmc0J5TG9jYXRpb24oVHlwZWRlZkVudGl0eSBhLCBUeXBlZGVmRW50aXR5IGIpOwogIGludCBjb21wYXJlTWVtYmVyc0J5TG9jYXRpb24oTWVtYmVyRW50aXR5IGEsIE1lbWJlckVudGl0eSBiKTsKfQodAE5OPAEjASQBORgsTAEqRAErSgEqSAFEPkNAAgErcGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9zb3J0ZXIuZGFydClzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy90cmFjZXIuZGFydIvhLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgdHJhY2VyOwoKaW1wb3J0ICcuLi9jb21waWxlcl9uZXcuZGFydCcgYXMgYXBpOwppbXBvcnQgJ2pzX2JhY2tlbmQvbmFtZXIuZGFydCcgc2hvdyBOYW1lcjsKaW1wb3J0ICdzc2Evbm9kZXMuZGFydCcgYXMgc3NhIHNob3cgSEdyYXBoOwppbXBvcnQgJ3NzYS9zc2FfdHJhY2VyLmRhcnQnIHNob3cgSFRyYWNlcjsKaW1wb3J0ICd1dGlsL3V0aWwuZGFydCcgc2hvdyBJbmRlbnRhdGlvbjsKaW1wb3J0ICd3b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKCi8vLyBJZiBub24tbnVsbCwgd2Ugb25seSB0cmFjZSBtZXRob2RzIHdob3NlIG5hbWUgbWF0Y2ggdGhlIHJlZ2V4cCBkZWZpbmVkIGJ5Ci8vLyB0aGUgZ2l2ZW4gcGF0dGVybi4KU3RyaW5nIGdldCBUUkFDRV9GSUxURVJfUEFUVEVSTiA9PgogICAgVFJBQ0VfRklMVEVSX1BBVFRFUk5fRlJPTV9FTlZJUk9OTUVOVCA/PyBUUkFDRV9GSUxURVJfUEFUVEVSTl9GT1JfVEVTVDsKCmNvbnN0IFN0cmluZyBUUkFDRV9GSUxURVJfUEFUVEVSTl9GUk9NX0VOVklST05NRU5UID0KICAgIGNvbnN0IFN0cmluZy5mcm9tRW52aXJvbm1lbnQoIkRVTVBfSVIiKTsKU3RyaW5nIFRSQUNFX0ZJTFRFUl9QQVRURVJOX0ZPUl9URVNUOwoKLy8vIER1bXBzIHRoZSBpbnRlcm1lZGlhdGUgcmVwcmVzZW50YXRpb24gYWZ0ZXIgZWFjaCBwaGFzZSBpbiBhIGZvcm1hdAovLy8gcmVhZGFibGUgYnkgSVIgSHlkcmEuCmNsYXNzIFRyYWNlciBleHRlbmRzIFRyYWNlclV0aWwgewogIGZpbmFsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZDsKICBmaW5hbCBOYW1lciBuYW1lcjsKICBib29sIHRyYWNlQWN0aXZlID0gZmFsc2U7CiAgQG92ZXJyaWRlCiAgZmluYWwgYXBpLk91dHB1dFNpbmsgb3V0cHV0OwogIGZpbmFsIFJlZ0V4cCB0cmFjZUZpbHRlcjsKCiAgVHJhY2VyKHRoaXMuY2xvc2VkV29ybGQsIHRoaXMubmFtZXIsIGFwaS5Db21waWxlck91dHB1dCBjb21waWxlck91dHB1dCkKICAgICAgOiB0cmFjZUZpbHRlciA9IFRSQUNFX0ZJTFRFUl9QQVRURVJOID09IG51bGwKICAgICAgICAgICAgPyBudWxsCiAgICAgICAgICAgIDogbmV3IFJlZ0V4cChUUkFDRV9GSUxURVJfUEFUVEVSTiksCiAgICAgICAgb3V0cHV0ID0gVFJBQ0VfRklMVEVSX1BBVFRFUk4gIT0gbnVsbAogICAgICAgICAgICA/IGNvbXBpbGVyT3V0cHV0LmNyZWF0ZU91dHB1dFNpbmsoCiAgICAgICAgICAgICAgICAnZGFydCcsICdjZmcnLCBhcGkuT3V0cHV0VHlwZS5kZWJ1ZykKICAgICAgICAgICAgOiBudWxsOwoKICBib29sIGdldCBpc0VuYWJsZWQgPT4gdHJhY2VGaWx0ZXIgIT0gbnVsbDsKCiAgdm9pZCB0cmFjZUNvbXBpbGF0aW9uKFN0cmluZyBtZXRob2ROYW1lKSB7CiAgICBpZiAoIWlzRW5hYmxlZCkgcmV0dXJuOwogICAgdHJhY2VBY3RpdmUgPSB0cmFjZUZpbHRlci5oYXNNYXRjaChtZXRob2ROYW1lKTsKICAgIGlmICghdHJhY2VBY3RpdmUpIHJldHVybjsKICAgIHRhZygiY29tcGlsYXRpb24iLCAoKSB7CiAgICAgIHByaW50UHJvcGVydHkoIm5hbWUiLCBtZXRob2ROYW1lKTsKICAgICAgcHJpbnRQcm9wZXJ0eSgibWV0aG9kIiwgbWV0aG9kTmFtZSk7CiAgICAgIHByaW50UHJvcGVydHkoImRhdGUiLCBuZXcgRGF0ZVRpbWUubm93KCkubWlsbGlzZWNvbmRzU2luY2VFcG9jaCk7CiAgICB9KTsKICB9CgogIHZvaWQgdHJhY2VHcmFwaChTdHJpbmcgbmFtZSwgdmFyIGlyT2JqZWN0KSB7CiAgICBpZiAoIXRyYWNlQWN0aXZlKSByZXR1cm47CiAgICBpZiAoaXJPYmplY3QgaXMgc3NhLkhHcmFwaCkgewogICAgICBuZXcgSFRyYWNlcihvdXRwdXQsIGNsb3NlZFdvcmxkLCBuYW1lcikudHJhY2VHcmFwaChuYW1lLCBpck9iamVjdCk7CiAgICB9CiAgfQoKICB2b2lkIGNsb3NlKCkgewogICAgaWYgKG91dHB1dCAhPSBudWxsKSB7CiAgICAgIG91dHB1dC5jbG9zZSgpOwogICAgfQogIH0KfQoKYWJzdHJhY3QgY2xhc3MgVHJhY2VyVXRpbCB7CiAgYXBpLk91dHB1dFNpbmsgZ2V0IG91dHB1dDsKICBmaW5hbCBJbmRlbnRhdGlvbiBfaW5kID0gbmV3IEluZGVudGF0aW9uKCk7CgogIHZvaWQgdGFnKFN0cmluZyB0YWdOYW1lLCBGdW5jdGlvbiBmKSB7CiAgICBwcmludGxuKCJiZWdpbl8kdGFnTmFtZSIpOwogICAgX2luZC5pbmRlbnRCbG9jayhmKTsKICAgIHByaW50bG4oImVuZF8kdGFnTmFtZSIpOwogIH0KCiAgdm9pZCBwcmludGxuKFN0cmluZyBzdHJpbmcpIHsKICAgIGFkZEluZGVudCgpOwogICAgYWRkKHN0cmluZyk7CiAgICBhZGQoIlxuIik7CiAgfQoKICB2b2lkIHByaW50RW1wdHlQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CiAgICBwcmludGxuKHByb3BlcnR5TmFtZSk7CiAgfQoKICBTdHJpbmcgZm9ybWF0UHJ0eSh4KSB7CiAgICBpZiAoeCBpcyBudW0pIHsKICAgICAgcmV0dXJuICcke3h9JzsKICAgIH0gZWxzZSBpZiAoeCBpcyBTdHJpbmcpIHsKICAgICAgcmV0dXJuICciJHt4fSInOwogICAgfSBlbHNlIGlmICh4IGlzIEl0ZXJhYmxlKSB7CiAgICAgIHJldHVybiB4Lm1hcCgocykgPT4gZm9ybWF0UHJ0eShzKSkuam9pbignICcpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgImludmFsaWQgcHJvcGVydHkgdHlwZTogJHt4fSI7CiAgICB9CiAgfQoKICB2b2lkIHByaW50UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgdmFsdWUpIHsKICAgIHByaW50bG4oIiRwcm9wZXJ0eU5hbWUgJHtmb3JtYXRQcnR5KHZhbHVlKX0iKTsKICB9CgogIHZvaWQgYWRkKFN0cmluZyBzdHJpbmcpIHsKICAgIG91dHB1dC5hZGQoc3RyaW5nKTsKICB9CgogIHZvaWQgYWRkSW5kZW50KCkgewogICAgYWRkKF9pbmQuaW5kZW50YXRpb24pOwogIH0KfQpyAE5OPAEQASYrLCsqJwFOFyNMATUtJgFHGiIiFRwMHxwBSjMTMC4vNRQBLQEtHDQeHCkrSAgEAS8eIkoGBAERGhYGBAIBHB0uASkfGR0EASAREQ8EATEbBAEZFBUeFyA0DSsGBAEzMwQBHBgEARUbBAIBIHBhY2thZ2U6Y29tcGlsZXIvc3JjL3RyYWNlci5kYXJ0PHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2JhY2tlbmQvYmFja2VuZF9pbXBhY3QuZGFydMAAXWEvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmpzX2hlbHBlcnMuaW1wYWN0OwoKaW1wb3J0ICcuLi9jb21tb24vbmFtZXMuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgQ29tbW9uRWxlbWVudHMsIEVsZW1lbnRFbnZpcm9ubWVudDsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JyBzaG93IEludGVyZmFjZVR5cGU7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvd29ybGRfaW1wYWN0LmRhcnQnCiAgICBzaG93IFdvcmxkSW1wYWN0LCBXb3JsZEltcGFjdEJ1aWxkZXIsIFdvcmxkSW1wYWN0QnVpbGRlckltcGw7CmltcG9ydCAnLi4vdW5pdmVyc2UvdXNlLmRhcnQnOwppbXBvcnQgJy4uL3V0aWwvZW51bXNldC5kYXJ0JzsKCi8vLyBCYWNrZW5kIHNwZWNpZmljIGZlYXR1cmVzIHJlcXVpcmVkIGJ5IGEgYmFja2VuZCBpbXBhY3QuCmVudW0gQmFja2VuZEZlYXR1cmUgewogIG5lZWRUb0luaXRpYWxpemVJc29sYXRlQWZmaW5pdHlUYWcsCiAgbmVlZFRvSW5pdGlhbGl6ZURpc3BhdGNoUHJvcGVydHksCn0KCi8vLyBBIHNldCBvZiBKYXZhU2NyaXB0IGJhY2tlbmQgZGVwZW5kZW5jaWVzLgpjbGFzcyBCYWNrZW5kSW1wYWN0IHsKICBmaW5hbCBMaXN0PEZ1bmN0aW9uRW50aXR5PiBzdGF0aWNVc2VzOwogIGZpbmFsIExpc3Q8RnVuY3Rpb25FbnRpdHk+IGdsb2JhbFVzZXM7CiAgZmluYWwgTGlzdDxTZWxlY3Rvcj4gZHluYW1pY1VzZXM7CiAgZmluYWwgTGlzdDxJbnRlcmZhY2VUeXBlPiBpbnN0YW50aWF0ZWRUeXBlczsKICBmaW5hbCBMaXN0PENsYXNzRW50aXR5PiBpbnN0YW50aWF0ZWRDbGFzc2VzOwogIGZpbmFsIExpc3Q8Q2xhc3NFbnRpdHk+IGdsb2JhbENsYXNzZXM7CiAgZmluYWwgTGlzdDxCYWNrZW5kSW1wYWN0PiBvdGhlckltcGFjdHM7CiAgZmluYWwgRW51bVNldDxCYWNrZW5kRmVhdHVyZT4gX2ZlYXR1cmVzOwoKICBjb25zdCBCYWNrZW5kSW1wYWN0KAogICAgICB7dGhpcy5zdGF0aWNVc2VzOiBjb25zdCA8RnVuY3Rpb25FbnRpdHk+W10sCiAgICAgIHRoaXMuZ2xvYmFsVXNlczogY29uc3QgPEZ1bmN0aW9uRW50aXR5PltdLAogICAgICB0aGlzLmR5bmFtaWNVc2VzOiBjb25zdCA8U2VsZWN0b3I+W10sCiAgICAgIHRoaXMuaW5zdGFudGlhdGVkVHlwZXM6IGNvbnN0IDxJbnRlcmZhY2VUeXBlPltdLAogICAgICB0aGlzLmluc3RhbnRpYXRlZENsYXNzZXM6IGNvbnN0IDxDbGFzc0VudGl0eT5bXSwKICAgICAgdGhpcy5nbG9iYWxDbGFzc2VzOiBjb25zdCA8Q2xhc3NFbnRpdHk+W10sCiAgICAgIHRoaXMub3RoZXJJbXBhY3RzOiBjb25zdCA8QmFja2VuZEltcGFjdD5bXSwKICAgICAgRW51bVNldDxCYWNrZW5kRmVhdHVyZT4gZmVhdHVyZXM6IGNvbnN0IEVudW1TZXQ8QmFja2VuZEZlYXR1cmU+LmZpeGVkKDApfSkKICAgICAgOiB0aGlzLl9mZWF0dXJlcyA9IGZlYXR1cmVzOwoKICBJdGVyYWJsZTxCYWNrZW5kRmVhdHVyZT4gZ2V0IGZlYXR1cmVzID0+CiAgICAgIF9mZWF0dXJlcy5pdGVyYWJsZShCYWNrZW5kRmVhdHVyZS52YWx1ZXMpOwoKICBXb3JsZEltcGFjdCBjcmVhdGVJbXBhY3QoRWxlbWVudEVudmlyb25tZW50IGVsZW1lbnRFbnZpcm9ubWVudCkgewogICAgV29ybGRJbXBhY3RCdWlsZGVySW1wbCBpbXBhY3RCdWlsZGVyID0gbmV3IFdvcmxkSW1wYWN0QnVpbGRlckltcGwoKTsKICAgIHJlZ2lzdGVySW1wYWN0KGltcGFjdEJ1aWxkZXIsIGVsZW1lbnRFbnZpcm9ubWVudCk7CiAgICByZXR1cm4gaW1wYWN0QnVpbGRlcjsKICB9CgogIC8vLyBSZWdpc3RlciB0aGlzIGJhY2tlbmQgaW1wYWN0IHRvIHRoZSBbd29ybGRJbXBhY3RCdWlsZGVyXS4KICB2b2lkIHJlZ2lzdGVySW1wYWN0KFdvcmxkSW1wYWN0QnVpbGRlciB3b3JsZEltcGFjdEJ1aWxkZXIsCiAgICAgIEVsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQpIHsKICAgIGZvciAoRnVuY3Rpb25FbnRpdHkgc3RhdGljVXNlIGluIHN0YXRpY1VzZXMpIHsKICAgICAgYXNzZXJ0KHN0YXRpY1VzZSAhPSBudWxsKTsKICAgICAgd29ybGRJbXBhY3RCdWlsZGVyCiAgICAgICAgICAucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5pbXBsaWNpdEludm9rZShzdGF0aWNVc2UpKTsKICAgIH0KICAgIGZvciAoRnVuY3Rpb25FbnRpdHkgc3RhdGljVXNlIGluIGdsb2JhbFVzZXMpIHsKICAgICAgYXNzZXJ0KHN0YXRpY1VzZSAhPSBudWxsKTsKICAgICAgd29ybGRJbXBhY3RCdWlsZGVyCiAgICAgICAgICAucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5pbXBsaWNpdEludm9rZShzdGF0aWNVc2UpKTsKICAgIH0KICAgIGZvciAoU2VsZWN0b3Igc2VsZWN0b3IgaW4gZHluYW1pY1VzZXMpIHsKICAgICAgYXNzZXJ0KHNlbGVjdG9yICE9IG51bGwpOwogICAgICB3b3JsZEltcGFjdEJ1aWxkZXIucmVnaXN0ZXJEeW5hbWljVXNlKG5ldyBEeW5hbWljVXNlKHNlbGVjdG9yKSk7CiAgICB9CiAgICBmb3IgKEludGVyZmFjZVR5cGUgaW5zdGFudGlhdGVkVHlwZSBpbiBpbnN0YW50aWF0ZWRUeXBlcykgewogICAgICB3b3JsZEltcGFjdEJ1aWxkZXIKICAgICAgICAgIC5yZWdpc3RlclR5cGVVc2UobmV3IFR5cGVVc2UuaW5zdGFudGlhdGlvbihpbnN0YW50aWF0ZWRUeXBlKSk7CiAgICB9CiAgICBmb3IgKENsYXNzRW50aXR5IGNscyBpbiBpbnN0YW50aWF0ZWRDbGFzc2VzKSB7CiAgICAgIHdvcmxkSW1wYWN0QnVpbGRlci5yZWdpc3RlclR5cGVVc2UoCiAgICAgICAgICBuZXcgVHlwZVVzZS5pbnN0YW50aWF0aW9uKGVsZW1lbnRFbnZpcm9ubWVudC5nZXRSYXdUeXBlKGNscykpKTsKICAgIH0KICAgIGZvciAoQ2xhc3NFbnRpdHkgY2xzIGluIGdsb2JhbENsYXNzZXMpIHsKICAgICAgd29ybGRJbXBhY3RCdWlsZGVyLnJlZ2lzdGVyVHlwZVVzZSgKICAgICAgICAgIG5ldyBUeXBlVXNlLmluc3RhbnRpYXRpb24oZWxlbWVudEVudmlyb25tZW50LmdldFJhd1R5cGUoY2xzKSkpOwogICAgfQogICAgZm9yIChCYWNrZW5kSW1wYWN0IG90aGVySW1wYWN0IGluIG90aGVySW1wYWN0cykgewogICAgICBvdGhlckltcGFjdC5yZWdpc3RlckltcGFjdCh3b3JsZEltcGFjdEJ1aWxkZXIsIGVsZW1lbnRFbnZpcm9ubWVudCk7CiAgICB9CiAgfQp9CgovLy8gVGhlIEphdmFTY3JpcHQgYmFja2VuZCBkZXBlbmRlbmNpZXMgZm9yIHZhcmlvdXMgZmVhdHVyZXMuCmNsYXNzIEJhY2tlbmRJbXBhY3RzIHsKICBmaW5hbCBDb21tb25FbGVtZW50cyBfY29tbW9uRWxlbWVudHM7CgogIEJhY2tlbmRJbXBhY3RzKHRoaXMuX2NvbW1vbkVsZW1lbnRzKTsKCiAgQmFja2VuZEltcGFjdCBfZ2V0UnVudGltZVR5cGVBcmd1bWVudDsKCiAgQmFja2VuZEltcGFjdCBnZXQgZ2V0UnVudGltZVR5cGVBcmd1bWVudCB7CiAgICByZXR1cm4gX2dldFJ1bnRpbWVUeXBlQXJndW1lbnQgPz89IG5ldyBCYWNrZW5kSW1wYWN0KGdsb2JhbFVzZXM6IFsKICAgICAgX2NvbW1vbkVsZW1lbnRzLmdldFJ1bnRpbWVUeXBlQXJndW1lbnRJbnRlcmNlcHRlZCwKICAgICAgX2NvbW1vbkVsZW1lbnRzLmdldFJ1bnRpbWVUeXBlQXJndW1lbnQsCiAgICAgIF9jb21tb25FbGVtZW50cy5nZXRUeXBlQXJndW1lbnRCeUluZGV4LAogICAgXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9jb21wdXRlU2lnbmF0dXJlOwoKICBCYWNrZW5kSW1wYWN0IGdldCBjb21wdXRlU2lnbmF0dXJlIHsKICAgIHJldHVybiBfY29tcHV0ZVNpZ25hdHVyZSA/Pz0gbmV3IEJhY2tlbmRJbXBhY3QoZ2xvYmFsVXNlczogWwogICAgICBfY29tbW9uRWxlbWVudHMuc2V0UnVudGltZVR5cGVJbmZvLAogICAgICBfY29tbW9uRWxlbWVudHMuZ2V0UnVudGltZVR5cGVJbmZvLAogICAgICBfY29tbW9uRWxlbWVudHMuY29tcHV0ZVNpZ25hdHVyZSwKICAgICAgX2NvbW1vbkVsZW1lbnRzLmdldFJ1bnRpbWVUeXBlQXJndW1lbnRzCiAgICBdLCBvdGhlckltcGFjdHM6IFsKICAgICAgbGlzdFZhbHVlcwogICAgXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9tYWluV2l0aEFyZ3VtZW50czsKCiAgQmFja2VuZEltcGFjdCBnZXQgbWFpbldpdGhBcmd1bWVudHMgewogICAgcmV0dXJuIF9tYWluV2l0aEFyZ3VtZW50cyA/Pz0gbmV3IEJhY2tlbmRJbXBhY3QoaW5zdGFudGlhdGVkQ2xhc3NlczogWwogICAgICBfY29tbW9uRWxlbWVudHMuanNBcnJheUNsYXNzLAogICAgICBfY29tbW9uRWxlbWVudHMuanNTdHJpbmdDbGFzcwogICAgXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9hc3luY0JvZHk7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGFzeW5jQm9keSA9PiBfYXN5bmNCb2R5ID8/PSBuZXcgQmFja2VuZEltcGFjdChzdGF0aWNVc2VzOiBbCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmFzeW5jSGVscGVyQXdhaXQsCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmFzeW5jSGVscGVyUmV0dXJuLAogICAgICAgIF9jb21tb25FbGVtZW50cy5hc3luY0hlbHBlclJldGhyb3csCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLnN0cmVhbUl0ZXJhdG9yQ29uc3RydWN0b3IsCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLndyYXBCb2R5LAogICAgICAgIF9jb21tb25FbGVtZW50cy5hc3luY0hlbHBlclN0YXJ0U3luYwogICAgICBdKTsKCiAgQmFja2VuZEltcGFjdCBfc3luY1N0YXJCb2R5OwoKICBCYWNrZW5kSW1wYWN0IGdldCBzeW5jU3RhckJvZHkgewogICAgcmV0dXJuIF9zeW5jU3RhckJvZHkgPz89IG5ldyBCYWNrZW5kSW1wYWN0KHN0YXRpY1VzZXM6IFsKICAgICAgX2NvbW1vbkVsZW1lbnRzLmVuZE9mSXRlcmF0aW9uLAogICAgICBfY29tbW9uRWxlbWVudHMueWllbGRTdGFyLAogICAgICBfY29tbW9uRWxlbWVudHMuc3luY1N0YXJVbmNhdWdodEVycm9yLAogICAgXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9hc3luY1N0YXJCb2R5OwoKICBCYWNrZW5kSW1wYWN0IGdldCBhc3luY1N0YXJCb2R5IHsKICAgIHJldHVybiBfYXN5bmNTdGFyQm9keSA/Pz0gbmV3IEJhY2tlbmRJbXBhY3Qoc3RhdGljVXNlczogWwogICAgICBfY29tbW9uRWxlbWVudHMuYXN5bmNTdGFySGVscGVyLAogICAgICBfY29tbW9uRWxlbWVudHMuc3RyZWFtT2ZDb250cm9sbGVyLAogICAgICBfY29tbW9uRWxlbWVudHMueWllbGRTaW5nbGUsCiAgICAgIF9jb21tb25FbGVtZW50cy55aWVsZFN0YXIsCiAgICAgIF9jb21tb25FbGVtZW50cy5zdHJlYW1JdGVyYXRvckNvbnN0cnVjdG9yLAogICAgICBfY29tbW9uRWxlbWVudHMud3JhcEJvZHksCiAgICBdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX3R5cGVWYXJpYWJsZUJvdW5kQ2hlY2s7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IHR5cGVWYXJpYWJsZUJvdW5kQ2hlY2sgewogICAgcmV0dXJuIF90eXBlVmFyaWFibGVCb3VuZENoZWNrID8/PSBuZXcgQmFja2VuZEltcGFjdChzdGF0aWNVc2VzOiBbCiAgICAgIF9jb21tb25FbGVtZW50cy50aHJvd1R5cGVFcnJvciwKICAgICAgX2NvbW1vbkVsZW1lbnRzLmFzc2VydElzU3VidHlwZQogICAgXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9hYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbjsKCiAgQmFja2VuZEltcGFjdCBnZXQgYWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb24gewogICAgcmV0dXJuIF9hYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbiA/Pz0gbmV3IEJhY2tlbmRJbXBhY3QoCiAgICAgICAgc3RhdGljVXNlczogW19jb21tb25FbGVtZW50cy50aHJvd0Fic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3JdLAogICAgICAgIG90aGVySW1wYWN0czogW19uZWVkc1N0cmluZygnTmVlZGVkIHRvIGVuY29kZSB0aGUgbWVzc2FnZS4nKV0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfZmFsbFRocm91Z2hFcnJvcjsKCiAgQmFja2VuZEltcGFjdCBnZXQgZmFsbFRocm91Z2hFcnJvciB7CiAgICByZXR1cm4gX2ZhbGxUaHJvdWdoRXJyb3IgPz89CiAgICAgICAgbmV3IEJhY2tlbmRJbXBhY3Qoc3RhdGljVXNlczogW19jb21tb25FbGVtZW50cy5mYWxsVGhyb3VnaEVycm9yXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9hc0NoZWNrOwoKICBCYWNrZW5kSW1wYWN0IGdldCBhc0NoZWNrIHsKICAgIHJldHVybiBfYXNDaGVjayA/Pz0KICAgICAgICBuZXcgQmFja2VuZEltcGFjdChzdGF0aWNVc2VzOiBbX2NvbW1vbkVsZW1lbnRzLnRocm93UnVudGltZUVycm9yXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF90aHJvd05vU3VjaE1ldGhvZDsKCiAgQmFja2VuZEltcGFjdCBnZXQgdGhyb3dOb1N1Y2hNZXRob2QgewogICAgcmV0dXJuIF90aHJvd05vU3VjaE1ldGhvZCA/Pz0gbmV3IEJhY2tlbmRJbXBhY3Qoc3RhdGljVXNlczogWwogICAgICBfY29tbW9uRWxlbWVudHMudGhyb3dOb1N1Y2hNZXRob2QsCiAgICBdLCBvdGhlckltcGFjdHM6IFsKICAgICAgLy8gQWxzbyByZWdpc3RlciB0aGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhpcyBtZXRob2QuCiAgICAgIF9uZWVkc0xpc3QoJ05lZWRlZCB0byBlbmNvZGUgdGhlIGFyZ3VtZW50cyBmb3IgdGhyb3cgTm9TdWNoTWV0aG9kRXJyb3IuJyksCiAgICAgIF9uZWVkc1N0cmluZygnTmVlZGVkIHRvIGVuY29kZSB0aGUgbmFtZSBmb3IgdGhyb3cgTm9TdWNoTWV0aG9kRXJyb3IuJyksCiAgICAgIG1hcExpdGVyYWxDbGFzcywgLy8gbm9TdWNoTWV0aG9kIGhlbHBlcnMgYXJlIHBhc3NlZCBhIE1hcC4KICAgIF0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfc3RyaW5nVmFsdWVzOwoKICBCYWNrZW5kSW1wYWN0IGdldCBzdHJpbmdWYWx1ZXMgewogICAgcmV0dXJuIF9zdHJpbmdWYWx1ZXMgPz89CiAgICAgICAgbmV3IEJhY2tlbmRJbXBhY3QoaW5zdGFudGlhdGVkQ2xhc3NlczogW19jb21tb25FbGVtZW50cy5qc1N0cmluZ0NsYXNzXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9udW1WYWx1ZXM7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IG51bVZhbHVlcyB7CiAgICByZXR1cm4gX251bVZhbHVlcyA/Pz0gbmV3IEJhY2tlbmRJbXBhY3QoaW5zdGFudGlhdGVkQ2xhc3NlczogWwogICAgICBfY29tbW9uRWxlbWVudHMuanNJbnRDbGFzcywKICAgICAgX2NvbW1vbkVsZW1lbnRzLmpzUG9zaXRpdmVJbnRDbGFzcywKICAgICAgX2NvbW1vbkVsZW1lbnRzLmpzVUludDMyQ2xhc3MsCiAgICAgIF9jb21tb25FbGVtZW50cy5qc1VJbnQzMUNsYXNzLAogICAgICBfY29tbW9uRWxlbWVudHMuanNOdW1iZXJDbGFzcywKICAgICAgX2NvbW1vbkVsZW1lbnRzLmpzRG91YmxlQ2xhc3MKICAgIF0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBnZXQgaW50VmFsdWVzID0+IG51bVZhbHVlczsKCiAgQmFja2VuZEltcGFjdCBnZXQgZG91YmxlVmFsdWVzID0+IG51bVZhbHVlczsKCiAgQmFja2VuZEltcGFjdCBfYm9vbFZhbHVlczsKCiAgQmFja2VuZEltcGFjdCBnZXQgYm9vbFZhbHVlcyB7CiAgICByZXR1cm4gX2Jvb2xWYWx1ZXMgPz89CiAgICAgICAgbmV3IEJhY2tlbmRJbXBhY3QoaW5zdGFudGlhdGVkQ2xhc3NlczogW19jb21tb25FbGVtZW50cy5qc0Jvb2xDbGFzc10pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfbnVsbFZhbHVlOwoKICBCYWNrZW5kSW1wYWN0IGdldCBudWxsVmFsdWUgewogICAgcmV0dXJuIF9udWxsVmFsdWUgPz89CiAgICAgICAgbmV3IEJhY2tlbmRJbXBhY3QoaW5zdGFudGlhdGVkQ2xhc3NlczogW19jb21tb25FbGVtZW50cy5qc051bGxDbGFzc10pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfbGlzdFZhbHVlczsKCiAgQmFja2VuZEltcGFjdCBnZXQgbGlzdFZhbHVlcyB7CiAgICByZXR1cm4gX2xpc3RWYWx1ZXMgPz89IG5ldyBCYWNrZW5kSW1wYWN0KGdsb2JhbENsYXNzZXM6IFsKICAgICAgX2NvbW1vbkVsZW1lbnRzLmpzQXJyYXlDbGFzcywKICAgICAgX2NvbW1vbkVsZW1lbnRzLmpzTXV0YWJsZUFycmF5Q2xhc3MsCiAgICAgIF9jb21tb25FbGVtZW50cy5qc0ZpeGVkQXJyYXlDbGFzcywKICAgICAgX2NvbW1vbkVsZW1lbnRzLmpzRXh0ZW5kYWJsZUFycmF5Q2xhc3MsCiAgICAgIF9jb21tb25FbGVtZW50cy5qc1VubW9kaWZpYWJsZUFycmF5Q2xhc3MKICAgIF0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfdGhyb3dSdW50aW1lRXJyb3I7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IHRocm93UnVudGltZUVycm9yIHsKICAgIHJldHVybiBfdGhyb3dSdW50aW1lRXJyb3IgPz89IG5ldyBCYWNrZW5kSW1wYWN0KHN0YXRpY1VzZXM6IFsKICAgICAgX2NvbW1vbkVsZW1lbnRzLnRocm93UnVudGltZUVycm9yLAogICAgXSwgb3RoZXJJbXBhY3RzOiBbCiAgICAgIC8vIEFsc28gcmVnaXN0ZXIgdGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoaXMgbWV0aG9kLgogICAgICBzdHJpbmdWYWx1ZXMKICAgIF0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfdGhyb3dVbnN1cHBvcnRlZEVycm9yOwoKICBCYWNrZW5kSW1wYWN0IGdldCB0aHJvd1Vuc3VwcG9ydGVkRXJyb3IgewogICAgcmV0dXJuIF90aHJvd1Vuc3VwcG9ydGVkRXJyb3IgPz89IG5ldyBCYWNrZW5kSW1wYWN0KHN0YXRpY1VzZXM6IFsKICAgICAgX2NvbW1vbkVsZW1lbnRzLnRocm93VW5zdXBwb3J0ZWRFcnJvcgogICAgXSwgb3RoZXJJbXBhY3RzOiBbCiAgICAgIC8vIEFsc28gcmVnaXN0ZXIgdGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoaXMgbWV0aG9kLgogICAgICBzdHJpbmdWYWx1ZXMKICAgIF0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfc3VwZXJOb1N1Y2hNZXRob2Q7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IHN1cGVyTm9TdWNoTWV0aG9kIHsKICAgIHJldHVybiBfc3VwZXJOb1N1Y2hNZXRob2QgPz89IG5ldyBCYWNrZW5kSW1wYWN0KHN0YXRpY1VzZXM6IFsKICAgICAgX2NvbW1vbkVsZW1lbnRzLmNyZWF0ZUludm9jYXRpb25NaXJyb3IsCiAgICAgIF9jb21tb25FbGVtZW50cy5vYmplY3ROb1N1Y2hNZXRob2QKICAgIF0sIG90aGVySW1wYWN0czogWwogICAgICBfbmVlZHNJbnQoJ05lZWRlZCB0byBlbmNvZGUgdGhlIGludm9jYXRpb24ga2luZCBvZiBzdXBlci5ub1N1Y2hNZXRob2QuJyksCiAgICAgIF9uZWVkc0xpc3QoJ05lZWRlZCB0byBlbmNvZGUgdGhlIGFyZ3VtZW50cyBvZiBzdXBlci5ub1N1Y2hNZXRob2QuJyksCiAgICAgIF9uZWVkc1N0cmluZygnTmVlZGVkIHRvIGVuY29kZSB0aGUgbmFtZSBvZiBzdXBlci5ub1N1Y2hNZXRob2QuJykKICAgIF0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfY29uc3RhbnRNYXBMaXRlcmFsOwoKICBCYWNrZW5kSW1wYWN0IGdldCBjb25zdGFudE1hcExpdGVyYWwgewogICAgcmV0dXJuIF9jb25zdGFudE1hcExpdGVyYWwgPz89IG5ldyBCYWNrZW5kSW1wYWN0KGluc3RhbnRpYXRlZENsYXNzZXM6IFsKICAgICAgX2NvbW1vbkVsZW1lbnRzLmNvbnN0YW50TWFwQ2xhc3MsCiAgICAgIF9jb21tb25FbGVtZW50cy5jb25zdGFudFByb3RvTWFwQ2xhc3MsCiAgICAgIF9jb21tb25FbGVtZW50cy5jb25zdGFudFN0cmluZ01hcENsYXNzLAogICAgICBfY29tbW9uRWxlbWVudHMuZ2VuZXJhbENvbnN0YW50TWFwQ2xhc3MsCiAgICBdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX2NvbnN0YW50U2V0TGl0ZXJhbDsKCiAgQmFja2VuZEltcGFjdCBnZXQgY29uc3RhbnRTZXRMaXRlcmFsID0+CiAgICAgIF9jb25zdGFudFNldExpdGVyYWwgPz89IG5ldyBCYWNrZW5kSW1wYWN0KGluc3RhbnRpYXRlZENsYXNzZXM6IFsKICAgICAgICBfY29tbW9uRWxlbWVudHMuY29uc3RTZXRMaXRlcmFsQ2xhc3MsCiAgICAgIF0sIG90aGVySW1wYWN0czogWwogICAgICAgIGNvbnN0YW50TWFwTGl0ZXJhbAogICAgICBdKTsKCiAgQmFja2VuZEltcGFjdCBfc3ltYm9sQ29uc3RydWN0b3I7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IHN5bWJvbENvbnN0cnVjdG9yIHsKICAgIHJldHVybiBfc3ltYm9sQ29uc3RydWN0b3IgPz89IG5ldyBCYWNrZW5kSW1wYWN0KAogICAgICAgIHN0YXRpY1VzZXM6IFtfY29tbW9uRWxlbWVudHMuc3ltYm9sVmFsaWRhdGVkQ29uc3RydWN0b3JdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX2NvbnN0U3ltYm9sOwoKICBCYWNrZW5kSW1wYWN0IGdldCBjb25zdFN5bWJvbCB7CiAgICByZXR1cm4gX2NvbnN0U3ltYm9sID8/PSBuZXcgQmFja2VuZEltcGFjdCgKICAgICAgICBpbnN0YW50aWF0ZWRDbGFzc2VzOiBbX2NvbW1vbkVsZW1lbnRzLnN5bWJvbEltcGxlbWVudGF0aW9uQ2xhc3NdLAogICAgICAgIHN0YXRpY1VzZXM6IFtfY29tbW9uRWxlbWVudHMuc3ltYm9sQ29uc3RydWN0b3JUYXJnZXRdKTsKICB9CgogIC8vLyBIZWxwZXIgZm9yIHJlZ2lzdGVyaW5nIHRoYXQgYGludGAgaXMgbmVlZGVkLgogIEJhY2tlbmRJbXBhY3QgX25lZWRzSW50KFN0cmluZyByZWFzb24pIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlZ2lzdGVyIFtyZWFzb25dIGZvciB1c2UgaW4gZHVtcC1pbmZvLgogICAgcmV0dXJuIGludFZhbHVlczsKICB9CgogIC8vLyBIZWxwZXIgZm9yIHJlZ2lzdGVyaW5nIHRoYXQgYExpc3RgIGlzIG5lZWRlZC4KICBCYWNrZW5kSW1wYWN0IF9uZWVkc0xpc3QoU3RyaW5nIHJlYXNvbikgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVnaXN0ZXIgW3JlYXNvbl0gZm9yIHVzZSBpbiBkdW1wLWluZm8uCiAgICByZXR1cm4gbGlzdFZhbHVlczsKICB9CgogIC8vLyBIZWxwZXIgZm9yIHJlZ2lzdGVyaW5nIHRoYXQgYFN0cmluZ2AgaXMgbmVlZGVkLgogIEJhY2tlbmRJbXBhY3QgX25lZWRzU3RyaW5nKFN0cmluZyByZWFzb24pIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlZ2lzdGVyIFtyZWFzb25dIGZvciB1c2UgaW4gZHVtcC1pbmZvLgogICAgcmV0dXJuIHN0cmluZ1ZhbHVlczsKICB9CgogIEJhY2tlbmRJbXBhY3QgX2Fzc2VydFdpdGhvdXRNZXNzYWdlOwoKICBCYWNrZW5kSW1wYWN0IGdldCBhc3NlcnRXaXRob3V0TWVzc2FnZSB7CiAgICByZXR1cm4gX2Fzc2VydFdpdGhvdXRNZXNzYWdlID8/PQogICAgICAgIG5ldyBCYWNrZW5kSW1wYWN0KHN0YXRpY1VzZXM6IFtfY29tbW9uRWxlbWVudHMuYXNzZXJ0SGVscGVyXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9hc3NlcnRXaXRoTWVzc2FnZTsKCiAgQmFja2VuZEltcGFjdCBnZXQgYXNzZXJ0V2l0aE1lc3NhZ2UgewogICAgcmV0dXJuIF9hc3NlcnRXaXRoTWVzc2FnZSA/Pz0gbmV3IEJhY2tlbmRJbXBhY3QoCiAgICAgICAgc3RhdGljVXNlczogW19jb21tb25FbGVtZW50cy5hc3NlcnRUZXN0LCBfY29tbW9uRWxlbWVudHMuYXNzZXJ0VGhyb3ddKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX2FzeW5jRm9ySW47CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGFzeW5jRm9ySW4gewogICAgcmV0dXJuIF9hc3luY0ZvckluID8/PSBuZXcgQmFja2VuZEltcGFjdCgKICAgICAgICBzdGF0aWNVc2VzOiBbX2NvbW1vbkVsZW1lbnRzLnN0cmVhbUl0ZXJhdG9yQ29uc3RydWN0b3JdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX3N0cmluZ0ludGVycG9sYXRpb247CgogIEJhY2tlbmRJbXBhY3QgZ2V0IHN0cmluZ0ludGVycG9sYXRpb24gewogICAgcmV0dXJuIF9zdHJpbmdJbnRlcnBvbGF0aW9uID8/PSBuZXcgQmFja2VuZEltcGFjdCgKICAgICAgICBkeW5hbWljVXNlczogW1NlbGVjdG9ycy50b1N0cmluZ19dLAogICAgICAgIHN0YXRpY1VzZXM6IFtfY29tbW9uRWxlbWVudHMuc3RyaW5nSW50ZXJwb2xhdGlvbkhlbHBlcl0sCiAgICAgICAgb3RoZXJJbXBhY3RzOiBbX25lZWRzU3RyaW5nKCdTdHJpbmdzIGFyZSBjcmVhdGVkLicpXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9zdHJpbmdKdXh0YXBvc2l0aW9uOwoKICBCYWNrZW5kSW1wYWN0IGdldCBzdHJpbmdKdXh0YXBvc2l0aW9uIHsKICAgIHJldHVybiBfc3RyaW5nSnV4dGFwb3NpdGlvbiA/Pz0gX25lZWRzU3RyaW5nKCdTdHJpbmcuY29uY2F0IGlzIHVzZWQuJyk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IGdldCBudWxsTGl0ZXJhbCA9PiBudWxsVmFsdWU7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGJvb2xMaXRlcmFsID0+IGJvb2xWYWx1ZXM7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGludExpdGVyYWwgPT4gaW50VmFsdWVzOwoKICBCYWNrZW5kSW1wYWN0IGdldCBkb3VibGVMaXRlcmFsID0+IGRvdWJsZVZhbHVlczsKCiAgQmFja2VuZEltcGFjdCBnZXQgc3RyaW5nTGl0ZXJhbCA9PiBzdHJpbmdWYWx1ZXM7CgogIEJhY2tlbmRJbXBhY3QgX2NhdGNoU3RhdGVtZW50OwoKICBCYWNrZW5kSW1wYWN0IGdldCBjYXRjaFN0YXRlbWVudCB7CiAgICByZXR1cm4gX2NhdGNoU3RhdGVtZW50ID8/PSBuZXcgQmFja2VuZEltcGFjdChzdGF0aWNVc2VzOiBbCiAgICAgIF9jb21tb25FbGVtZW50cy5leGNlcHRpb25VbndyYXBwZXIKICAgIF0sIGluc3RhbnRpYXRlZENsYXNzZXM6IFsKICAgICAgX2NvbW1vbkVsZW1lbnRzLmpzUGxhaW5KYXZhU2NyaXB0T2JqZWN0Q2xhc3MsCiAgICAgIF9jb21tb25FbGVtZW50cy5qc1Vua25vd25KYXZhU2NyaXB0T2JqZWN0Q2xhc3MKICAgIF0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfdGhyb3dFeHByZXNzaW9uOwoKICBCYWNrZW5kSW1wYWN0IGdldCB0aHJvd0V4cHJlc3Npb24gewogICAgcmV0dXJuIF90aHJvd0V4cHJlc3Npb24gPz89IG5ldyBCYWNrZW5kSW1wYWN0KAogICAgICAgIC8vIFdlIGRvbid0IGtub3cgYWhlYWQgb2YgdGltZSB3aGV0aGVyIHdlIHdpbGwgbmVlZCB0aGUgdGhyb3cgaW4gYQogICAgICAgIC8vIHN0YXRlbWVudCBjb250ZXh0IG9yIGFuIGV4cHJlc3Npb24gY29udGV4dCwgc28gd2UgcmVnaXN0ZXIgYm90aAogICAgICAgIC8vIGhlcmUsIGV2ZW4gdGhvdWdoIHdlIG1heSBub3QgbmVlZCB0aGUgdGhyb3dFeHByZXNzaW9uIGhlbHBlci4KICAgICAgICBzdGF0aWNVc2VzOiBbCiAgICAgICAgICBfY29tbW9uRWxlbWVudHMud3JhcEV4Y2VwdGlvbkhlbHBlciwKICAgICAgICAgIF9jb21tb25FbGVtZW50cy50aHJvd0V4cHJlc3Npb25IZWxwZXIKICAgICAgICBdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX2xhenlGaWVsZDsKCiAgQmFja2VuZEltcGFjdCBnZXQgbGF6eUZpZWxkIHsKICAgIHJldHVybiBfbGF6eUZpZWxkID8/PQogICAgICAgIG5ldyBCYWNrZW5kSW1wYWN0KHN0YXRpY1VzZXM6IFtfY29tbW9uRWxlbWVudHMuY3ljbGljVGhyb3dIZWxwZXJdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX3R5cGVMaXRlcmFsOwoKICBCYWNrZW5kSW1wYWN0IGdldCB0eXBlTGl0ZXJhbCB7CiAgICByZXR1cm4gX3R5cGVMaXRlcmFsID8/PSBuZXcgQmFja2VuZEltcGFjdCgKICAgICAgICBpbnN0YW50aWF0ZWRDbGFzc2VzOiBbX2NvbW1vbkVsZW1lbnRzLnR5cGVMaXRlcmFsQ2xhc3NdLAogICAgICAgIHN0YXRpY1VzZXM6IFtfY29tbW9uRWxlbWVudHMuY3JlYXRlUnVudGltZVR5cGVdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX3N0YWNrVHJhY2VJbkNhdGNoOwoKICBCYWNrZW5kSW1wYWN0IGdldCBzdGFja1RyYWNlSW5DYXRjaCB7CiAgICByZXR1cm4gX3N0YWNrVHJhY2VJbkNhdGNoID8/PSBuZXcgQmFja2VuZEltcGFjdCgKICAgICAgICBpbnN0YW50aWF0ZWRDbGFzc2VzOiBbX2NvbW1vbkVsZW1lbnRzLnN0YWNrVHJhY2VIZWxwZXJDbGFzc10sCiAgICAgICAgc3RhdGljVXNlczogW19jb21tb25FbGVtZW50cy50cmFjZUZyb21FeGNlcHRpb25dKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX3N5bmNGb3JJbjsKCiAgQmFja2VuZEltcGFjdCBnZXQgc3luY0ZvckluIHsKICAgIHJldHVybiBfc3luY0ZvckluID8/PSBuZXcgQmFja2VuZEltcGFjdCgKICAgICAgICAvLyBUaGUgU1NBIGJ1aWxkZXIgcmVjb2duaXplcyBjZXJ0YWluIGZvci1pbiBsb29wcyBhbmQgY2FuIGdlbmVyYXRlCiAgICAgICAgLy8gY2FsbHMgdG8gdGhyb3dDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IuCiAgICAgICAgc3RhdGljVXNlczogW19jb21tb25FbGVtZW50cy5jaGVja0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcl0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfdHlwZVZhcmlhYmxlRXhwcmVzc2lvbjsKCiAgQmFja2VuZEltcGFjdCBnZXQgdHlwZVZhcmlhYmxlRXhwcmVzc2lvbiB7CiAgICByZXR1cm4gX3R5cGVWYXJpYWJsZUV4cHJlc3Npb24gPz89IG5ldyBCYWNrZW5kSW1wYWN0KHN0YXRpY1VzZXM6IFsKICAgICAgX2NvbW1vbkVsZW1lbnRzLnNldFJ1bnRpbWVUeXBlSW5mbywKICAgICAgX2NvbW1vbkVsZW1lbnRzLmdldFJ1bnRpbWVUeXBlSW5mbywKICAgICAgX2NvbW1vbkVsZW1lbnRzLmNyZWF0ZVJ1bnRpbWVUeXBlCiAgICBdLCBvdGhlckltcGFjdHM6IFsKICAgICAgbGlzdFZhbHVlcywKICAgICAgZ2V0UnVudGltZVR5cGVBcmd1bWVudCwKICAgICAgX25lZWRzSW50KCdOZWVkZWQgZm9yIGFjY2Vzc2luZyBhIHR5cGUgdmFyaWFibGUgbGl0ZXJhbCBvbiB0aGlzLicpCiAgICBdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX3R5cGVDaGVjazsKCiAgQmFja2VuZEltcGFjdCBnZXQgdHlwZUNoZWNrIHsKICAgIHJldHVybiBfdHlwZUNoZWNrID8/PSBuZXcgQmFja2VuZEltcGFjdChvdGhlckltcGFjdHM6IFtib29sVmFsdWVzXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9nZW5lcmljVHlwZUNoZWNrOwoKICBCYWNrZW5kSW1wYWN0IGdldCBnZW5lcmljVHlwZUNoZWNrIHsKICAgIHJldHVybiBfZ2VuZXJpY1R5cGVDaGVjayA/Pz0gbmV3IEJhY2tlbmRJbXBhY3Qoc3RhdGljVXNlczogWwogICAgICBfY29tbW9uRWxlbWVudHMuY2hlY2tTdWJ0eXBlLAogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBJbnZlc3RpZ2F0ZSB3aHkgdGhpcyBpcyBuZWVkZWQuCiAgICAgIF9jb21tb25FbGVtZW50cy5zZXRSdW50aW1lVHlwZUluZm8sCiAgICAgIF9jb21tb25FbGVtZW50cy5nZXRSdW50aW1lVHlwZUluZm8KICAgIF0sIG90aGVySW1wYWN0czogWwogICAgICBsaXN0VmFsdWVzLAogICAgICBnZXRSdW50aW1lVHlwZUFyZ3VtZW50CiAgICBdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX2dlbmVyaWNJc0NoZWNrOwoKICBCYWNrZW5kSW1wYWN0IGdldCBnZW5lcmljSXNDaGVjayB7CiAgICByZXR1cm4gX2dlbmVyaWNJc0NoZWNrID8/PSBuZXcgQmFja2VuZEltcGFjdChvdGhlckltcGFjdHM6IFtpbnRWYWx1ZXNdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX3R5cGVWYXJpYWJsZVR5cGVDaGVjazsKCiAgQmFja2VuZEltcGFjdCBnZXQgdHlwZVZhcmlhYmxlVHlwZUNoZWNrIHsKICAgIHJldHVybiBfdHlwZVZhcmlhYmxlVHlwZUNoZWNrID8/PSBuZXcgQmFja2VuZEltcGFjdCgKICAgICAgICBzdGF0aWNVc2VzOiBbX2NvbW1vbkVsZW1lbnRzLmNoZWNrU3VidHlwZU9mUnVudGltZVR5cGVdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX2Z1bmN0aW9uVHlwZUNoZWNrOwoKICBCYWNrZW5kSW1wYWN0IGdldCBmdW5jdGlvblR5cGVDaGVjayB7CiAgICByZXR1cm4gX2Z1bmN0aW9uVHlwZUNoZWNrID8/PQogICAgICAgIG5ldyBCYWNrZW5kSW1wYWN0KHN0YXRpY1VzZXM6IFsvKmhlbHBlcnMuZnVuY3Rpb25UeXBlVGVzdE1ldGFIZWxwZXIqL10pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfZnV0dXJlT3JUeXBlQ2hlY2s7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGZ1dHVyZU9yVHlwZUNoZWNrIHsKICAgIHJldHVybiBfZnV0dXJlT3JUeXBlQ2hlY2sgPz89CiAgICAgICAgbmV3IEJhY2tlbmRJbXBhY3Qoc3RhdGljVXNlczogW19jb21tb25FbGVtZW50cy5mdXR1cmVPclRlc3RdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX25hdGl2ZVR5cGVDaGVjazsKCiAgQmFja2VuZEltcGFjdCBnZXQgbmF0aXZlVHlwZUNoZWNrIHsKICAgIHJldHVybiBfbmF0aXZlVHlwZUNoZWNrID8/PSBuZXcgQmFja2VuZEltcGFjdChzdGF0aWNVc2VzOiBbCiAgICAgIC8vIFdlIHdpbGwgbmVlZCB0byBhZGQgdGhlICIkaXMiIGFuZCAiJGFzIiBwcm9wZXJ0aWVzIG9uIHRoZQogICAgICAvLyBKYXZhU2NyaXB0IG9iamVjdCBwcm90b3R5cGUsIHNvIHdlIG1ha2Ugc3VyZQogICAgICAvLyBbOmRlZmluZVByb3BlcnR5Ol0gaXMgY29tcGlsZWQuCiAgICAgIF9jb21tb25FbGVtZW50cy5kZWZpbmVQcm9wZXJ0eQogICAgXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9jbG9zdXJlOwoKICBCYWNrZW5kSW1wYWN0IGdldCBjbG9zdXJlIHsKICAgIHJldHVybiBfY2xvc3VyZSA/Pz0KICAgICAgICBuZXcgQmFja2VuZEltcGFjdChpbnN0YW50aWF0ZWRDbGFzc2VzOiBbX2NvbW1vbkVsZW1lbnRzLmZ1bmN0aW9uQ2xhc3NdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX2ludGVyY2VwdG9yVXNlOwoKICBCYWNrZW5kSW1wYWN0IGdldCBpbnRlcmNlcHRvclVzZSB7CiAgICByZXR1cm4gX2ludGVyY2VwdG9yVXNlID8/PSBuZXcgQmFja2VuZEltcGFjdCgKICAgICAgICBzdGF0aWNVc2VzOiBbCiAgICAgICAgICBfY29tbW9uRWxlbWVudHMuZ2V0TmF0aXZlSW50ZXJjZXB0b3JNZXRob2QKICAgICAgICBdLAogICAgICAgIGluc3RhbnRpYXRlZENsYXNzZXM6IFsKICAgICAgICAgIF9jb21tb25FbGVtZW50cy5qc0phdmFTY3JpcHRPYmplY3RDbGFzcywKICAgICAgICAgIF9jb21tb25FbGVtZW50cy5qc1BsYWluSmF2YVNjcmlwdE9iamVjdENsYXNzLAogICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmpzSmF2YVNjcmlwdEZ1bmN0aW9uQ2xhc3MKICAgICAgICBdLAogICAgICAgIGZlYXR1cmVzOiBuZXcgRW51bVNldDxCYWNrZW5kRmVhdHVyZT4uZnJvbVZhbHVlcyhbCiAgICAgICAgICBCYWNrZW5kRmVhdHVyZS5uZWVkVG9Jbml0aWFsaXplRGlzcGF0Y2hQcm9wZXJ0eSwKICAgICAgICAgIEJhY2tlbmRGZWF0dXJlLm5lZWRUb0luaXRpYWxpemVJc29sYXRlQWZmaW5pdHlUYWcKICAgICAgICBdLCBmaXhlZDogdHJ1ZSkpOwogIH0KCiAgQmFja2VuZEltcGFjdCBfbnVtQ2xhc3NlczsKCiAgQmFja2VuZEltcGFjdCBnZXQgbnVtQ2xhc3NlcyB7CiAgICByZXR1cm4gX251bUNsYXNzZXMgPz89IG5ldyBCYWNrZW5kSW1wYWN0KAogICAgICAgIC8vIFRoZSBiYWNrZW5kIHdpbGwgdHJ5IHRvIG9wdGltaXplIG51bWJlciBvcGVyYXRpb25zIGFuZCB1c2UgdGhlCiAgICAgICAgLy8gYGlhZWAgaGVscGVyIGRpcmVjdGx5LgogICAgICAgIGdsb2JhbFVzZXM6IFtfY29tbW9uRWxlbWVudHMudGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25dKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX2xpc3RPclN0cmluZ0NsYXNzZXM7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGxpc3RPclN0cmluZ0NsYXNzZXMgewogICAgcmV0dXJuIF9saXN0T3JTdHJpbmdDbGFzc2VzID8/PSBuZXcgQmFja2VuZEltcGFjdCgKICAgICAgICAvLyBUaGUgYmFja2VuZCB3aWxsIHRyeSB0byBvcHRpbWl6ZSBhcnJheSBhbmQgc3RyaW5nIGFjY2VzcyBhbmQgdXNlIHRoZQogICAgICAgIC8vIGBpb29yZWAgYW5kIGBpYWVgIF9jb21tb25FbGVtZW50cyBkaXJlY3RseS4KICAgICAgICBnbG9iYWxVc2VzOiBbCiAgICAgICAgICBfY29tbW9uRWxlbWVudHMudGhyb3dJbmRleE91dE9mUmFuZ2VFeGNlcHRpb24sCiAgICAgICAgICBfY29tbW9uRWxlbWVudHMudGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAgICBdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX2Z1bmN0aW9uQ2xhc3M7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGZ1bmN0aW9uQ2xhc3MgewogICAgcmV0dXJuIF9mdW5jdGlvbkNsYXNzID8/PQogICAgICAgIG5ldyBCYWNrZW5kSW1wYWN0KGdsb2JhbENsYXNzZXM6IFtfY29tbW9uRWxlbWVudHMuY2xvc3VyZUNsYXNzXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9tYXBDbGFzczsKCiAgQmFja2VuZEltcGFjdCBnZXQgbWFwQ2xhc3MgewogICAgcmV0dXJuIF9tYXBDbGFzcyA/Pz0gbmV3IEJhY2tlbmRJbXBhY3QoCiAgICAgICAgLy8gVGhlIGJhY2tlbmQgd2lsbCB1c2UgYSBsaXRlcmFsIGxpc3QgdG8gaW5pdGlhbGl6ZSB0aGUgZW50cmllcwogICAgICAgIC8vIG9mIHRoZSBtYXAuCiAgICAgICAgZ2xvYmFsQ2xhc3NlczogWwogICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmxpc3RDbGFzcywKICAgICAgICAgIF9jb21tb25FbGVtZW50cy5tYXBMaXRlcmFsQ2xhc3MKICAgICAgICBdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX3NldENsYXNzOwoKICBCYWNrZW5kSW1wYWN0IGdldCBzZXRDbGFzcyA9PiBfc2V0Q2xhc3MgPz89IG5ldyBCYWNrZW5kSW1wYWN0KGdsb2JhbENsYXNzZXM6IFsKICAgICAgICAvLyBUaGUgYmFja2VuZCB3aWxsIHVzZSBhIGxpdGVyYWwgbGlzdCB0byBpbml0aWFsaXplIHRoZSBlbnRyaWVzCiAgICAgICAgLy8gb2YgdGhlIHNldC4KICAgICAgICBfY29tbW9uRWxlbWVudHMubGlzdENsYXNzLAogICAgICAgIF9jb21tb25FbGVtZW50cy5zZXRMaXRlcmFsQ2xhc3MsCiAgICAgIF0pOwoKICBCYWNrZW5kSW1wYWN0IF9ib3VuZENsb3N1cmVDbGFzczsKCiAgQmFja2VuZEltcGFjdCBnZXQgYm91bmRDbG9zdXJlQ2xhc3MgewogICAgcmV0dXJuIF9ib3VuZENsb3N1cmVDbGFzcyA/Pz0KICAgICAgICBuZXcgQmFja2VuZEltcGFjdChnbG9iYWxDbGFzc2VzOiBbX2NvbW1vbkVsZW1lbnRzLmJvdW5kQ2xvc3VyZUNsYXNzXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9uYXRpdmVPckV4dGVuZHNDbGFzczsKCiAgQmFja2VuZEltcGFjdCBnZXQgbmF0aXZlT3JFeHRlbmRzQ2xhc3MgewogICAgcmV0dXJuIF9uYXRpdmVPckV4dGVuZHNDbGFzcyA/Pz0gbmV3IEJhY2tlbmRJbXBhY3QoZ2xvYmFsVXNlczogWwogICAgICBfY29tbW9uRWxlbWVudHMuZ2V0TmF0aXZlSW50ZXJjZXB0b3JNZXRob2QKICAgIF0sIGdsb2JhbENsYXNzZXM6IFsKICAgICAgX2NvbW1vbkVsZW1lbnRzLmpzSW50ZXJjZXB0b3JDbGFzcywKICAgICAgX2NvbW1vbkVsZW1lbnRzLmpzSmF2YVNjcmlwdE9iamVjdENsYXNzLAogICAgICBfY29tbW9uRWxlbWVudHMuanNQbGFpbkphdmFTY3JpcHRPYmplY3RDbGFzcywKICAgICAgX2NvbW1vbkVsZW1lbnRzLmpzSmF2YVNjcmlwdEZ1bmN0aW9uQ2xhc3MKICAgIF0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfbWFwTGl0ZXJhbENsYXNzOwoKICBCYWNrZW5kSW1wYWN0IGdldCBtYXBMaXRlcmFsQ2xhc3MgewogICAgcmV0dXJuIF9tYXBMaXRlcmFsQ2xhc3MgPz89IG5ldyBCYWNrZW5kSW1wYWN0KGdsb2JhbFVzZXM6IFsKICAgICAgX2NvbW1vbkVsZW1lbnRzLm1hcExpdGVyYWxDb25zdHJ1Y3RvciwKICAgICAgX2NvbW1vbkVsZW1lbnRzLm1hcExpdGVyYWxDb25zdHJ1Y3RvckVtcHR5LAogICAgICBfY29tbW9uRWxlbWVudHMubWFwTGl0ZXJhbFVudHlwZWRNYWtlciwKICAgICAgX2NvbW1vbkVsZW1lbnRzLm1hcExpdGVyYWxVbnR5cGVkRW1wdHlNYWtlcgogICAgXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9zZXRMaXRlcmFsQ2xhc3M7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IHNldExpdGVyYWxDbGFzcyA9PgogICAgICBfc2V0TGl0ZXJhbENsYXNzID8/PSBuZXcgQmFja2VuZEltcGFjdChnbG9iYWxVc2VzOiBbCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLnNldExpdGVyYWxDb25zdHJ1Y3RvciwKICAgICAgICBfY29tbW9uRWxlbWVudHMuc2V0TGl0ZXJhbENvbnN0cnVjdG9yRW1wdHksCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLnNldExpdGVyYWxVbnR5cGVkTWFrZXIsCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLnNldExpdGVyYWxVbnR5cGVkRW1wdHlNYWtlciwKICAgICAgXSk7CgogIEJhY2tlbmRJbXBhY3QgX2Nsb3N1cmVDbGFzczsKCiAgQmFja2VuZEltcGFjdCBnZXQgY2xvc3VyZUNsYXNzIHsKICAgIHJldHVybiBfY2xvc3VyZUNsYXNzID8/PQogICAgICAgIG5ldyBCYWNrZW5kSW1wYWN0KGdsb2JhbFVzZXM6IFtfY29tbW9uRWxlbWVudHMuY2xvc3VyZUZyb21UZWFyT2ZmXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9saXN0Q2xhc3NlczsKCiAgQmFja2VuZEltcGFjdCBnZXQgbGlzdENsYXNzZXMgewogICAgcmV0dXJuIF9saXN0Q2xhc3NlcyA/Pz0gbmV3IEJhY2tlbmRJbXBhY3QoCiAgICAgICAgLy8gTGl0ZXJhbCBsaXN0cyBjYW4gYmUgdHJhbnNsYXRlZCBpbnRvIGNhbGxzIHRvIHRoZXNlIGZ1bmN0aW9uczoKICAgICAgICBnbG9iYWxVc2VzOiBbCiAgICAgICAgICBfY29tbW9uRWxlbWVudHMuanNBcnJheVR5cGVkQ29uc3RydWN0b3IsCiAgICAgICAgICBfY29tbW9uRWxlbWVudHMuc2V0UnVudGltZVR5cGVJbmZvLAogICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmdldFR5cGVBcmd1bWVudEJ5SW5kZXgKICAgICAgICBdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX2pzSW5kZXhpbmdCZWhhdmlvcjsKCiAgQmFja2VuZEltcGFjdCBnZXQganNJbmRleGluZ0JlaGF2aW9yIHsKICAgIHJldHVybiBfanNJbmRleGluZ0JlaGF2aW9yID8/PSBuZXcgQmFja2VuZEltcGFjdCgKICAgICAgICAvLyBUaGVzZSB0d28gX2NvbW1vbkVsZW1lbnRzIGFyZSB1c2VkIGJ5IHRoZSBlbWl0dGVyIGFuZCB0aGUgY29kZWdlbi4KICAgICAgICAvLyBCZWNhdXNlIHdlIGNhbm5vdCBlbnF1ZXVlIGVsZW1lbnRzIGF0IHRoZSB0aW1lIG9mIGVtaXNzaW9uLAogICAgICAgIC8vIHdlIG1ha2Ugc3VyZSB0aGV5IGFyZSBhbHdheXMgZ2VuZXJhdGVkLgogICAgICAgIGdsb2JhbFVzZXM6IFtfY29tbW9uRWxlbWVudHMuaXNKc0luZGV4YWJsZV0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfdHJhY2VIZWxwZXI7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IHRyYWNlSGVscGVyIHsKICAgIHJldHVybiBfdHJhY2VIZWxwZXIgPz89CiAgICAgICAgbmV3IEJhY2tlbmRJbXBhY3QoZ2xvYmFsVXNlczogW19jb21tb25FbGVtZW50cy50cmFjZUhlbHBlcl0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfYXNzZXJ0VW5yZWFjaGFibGU7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGFzc2VydFVucmVhY2hhYmxlIHsKICAgIHJldHVybiBfYXNzZXJ0VW5yZWFjaGFibGUgPz89IG5ldyBCYWNrZW5kSW1wYWN0KAogICAgICAgIGdsb2JhbFVzZXM6IFtfY29tbW9uRWxlbWVudHMuYXNzZXJ0VW5yZWFjaGFibGVNZXRob2RdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX3J1bnRpbWVUeXBlU3VwcG9ydDsKCiAgQmFja2VuZEltcGFjdCBnZXQgcnVudGltZVR5cGVTdXBwb3J0IHsKICAgIHJldHVybiBfcnVudGltZVR5cGVTdXBwb3J0ID8/PSBuZXcgQmFja2VuZEltcGFjdChnbG9iYWxDbGFzc2VzOiBbCiAgICAgIF9jb21tb25FbGVtZW50cy5saXN0Q2xhc3MKICAgIF0sIGdsb2JhbFVzZXM6IFsKICAgICAgX2NvbW1vbkVsZW1lbnRzLnNldFJ1bnRpbWVUeXBlSW5mbywKICAgICAgX2NvbW1vbkVsZW1lbnRzLmdldFJ1bnRpbWVUeXBlSW5mbwogICAgXSwgb3RoZXJJbXBhY3RzOiBbCiAgICAgIGdldFJ1bnRpbWVUeXBlQXJndW1lbnQsCiAgICAgIGNvbXB1dGVTaWduYXR1cmUKICAgIF0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfZGVmZXJyZWRMb2FkaW5nOwoKICBCYWNrZW5kSW1wYWN0IGdldCBkZWZlcnJlZExvYWRpbmcgewogICAgcmV0dXJuIF9kZWZlcnJlZExvYWRpbmcgPz89CiAgICAgICAgbmV3IEJhY2tlbmRJbXBhY3QoZ2xvYmFsVXNlczogW19jb21tb25FbGVtZW50cy5jaGVja0RlZmVycmVkSXNMb2FkZWRdLAogICAgICAgICAgICAvLyBBbHNvIHJlZ2lzdGVyIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGlzIG1ldGhvZC4KICAgICAgICAgICAgZ2xvYmFsQ2xhc3NlczogW19jb21tb25FbGVtZW50cy5zdHJpbmdDbGFzc10pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfbm9TdWNoTWV0aG9kU3VwcG9ydDsKCiAgQmFja2VuZEltcGFjdCBnZXQgbm9TdWNoTWV0aG9kU3VwcG9ydCB7CiAgICByZXR1cm4gX25vU3VjaE1ldGhvZFN1cHBvcnQgPz89IG5ldyBCYWNrZW5kSW1wYWN0KHN0YXRpY1VzZXM6IFsKICAgICAgX2NvbW1vbkVsZW1lbnRzLmNyZWF0ZUludm9jYXRpb25NaXJyb3IsCiAgICAgIF9jb21tb25FbGVtZW50cy5jcmVhdGVVbm1hbmdsZWRJbnZvY2F0aW9uTWlycm9yCiAgICBdLCBkeW5hbWljVXNlczogWwogICAgICBTZWxlY3RvcnMubm9TdWNoTWV0aG9kXwogICAgXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9sb2FkTGlicmFyeTsKCiAgLy8vIEJhY2tlbmQgaW1wYWN0IGZvciBhY2Nlc3NpbmcgYSBgbG9hZExpYnJhcnlgIGZ1bmN0aW9uIG9uIGEgZGVmZXJyZWQKICAvLy8gcHJlZml4LgogIEJhY2tlbmRJbXBhY3QgZ2V0IGxvYWRMaWJyYXJ5IHsKICAgIHJldHVybiBfbG9hZExpYnJhcnkgPz89IG5ldyBCYWNrZW5kSW1wYWN0KGdsb2JhbFVzZXM6IFsKICAgICAgLy8gVE9ETyhyZWRlbXB0aW9uKTogZGVsZXRlIHdyYXBwZXIgd2hlbiB3ZSBzdW5zZXQgdGhlIG9sZCBmcm9udGVuZC4KICAgICAgX2NvbW1vbkVsZW1lbnRzLmxvYWRMaWJyYXJ5V3JhcHBlciwKICAgICAgX2NvbW1vbkVsZW1lbnRzLmxvYWREZWZlcnJlZExpYnJhcnksCiAgICBdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX21lbWJlckNsb3N1cmU7CgogIC8vLyBCYWNrZW5kIGltcGFjdCBmb3IgcGVyZm9ybWluZyBtZW1iZXIgY2xvc3VyaXphdGlvbi4KICBCYWNrZW5kSW1wYWN0IGdldCBtZW1iZXJDbG9zdXJlIHsKICAgIHJldHVybiBfbWVtYmVyQ2xvc3VyZSA/Pz0KICAgICAgICBuZXcgQmFja2VuZEltcGFjdChnbG9iYWxDbGFzc2VzOiBbX2NvbW1vbkVsZW1lbnRzLmJvdW5kQ2xvc3VyZUNsYXNzXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9zdGF0aWNDbG9zdXJlOwoKICAvLy8gQmFja2VuZCBpbXBhY3QgZm9yIHBlcmZvcm1pbmcgY2xvc3VyaXphdGlvbiBvZiBhIHRvcC1sZXZlbCBvciBzdGF0aWMKICAvLy8gZnVuY3Rpb24uCiAgQmFja2VuZEltcGFjdCBnZXQgc3RhdGljQ2xvc3VyZSB7CiAgICByZXR1cm4gX3N0YXRpY0Nsb3N1cmUgPz89CiAgICAgICAgbmV3IEJhY2tlbmRJbXBhY3QoZ2xvYmFsQ2xhc3NlczogW19jb21tb25FbGVtZW50cy5jbG9zdXJlQ2xhc3NdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX3R5cGVWYXJpYWJsZU1pcnJvcjsKCiAgLy8vIEJhY2tlbmQgaW1wYWN0IGZvciB0eXBlIHZhcmlhYmxlcyB0aHJvdWdoIG1pcnJvcnMuCiAgQmFja2VuZEltcGFjdCBnZXQgdHlwZVZhcmlhYmxlTWlycm9yIHsKICAgIHJldHVybiBfdHlwZVZhcmlhYmxlTWlycm9yID8/PSBuZXcgQmFja2VuZEltcGFjdChzdGF0aWNVc2VzOiBbCiAgICAgIF9jb21tb25FbGVtZW50cy50eXBlVmFyaWFibGVDb25zdHJ1Y3RvciwKICAgICAgX2NvbW1vbkVsZW1lbnRzLmNyZWF0ZVJ1bnRpbWVUeXBlCiAgICBdLCBpbnN0YW50aWF0ZWRDbGFzc2VzOiBbCiAgICAgIF9jb21tb25FbGVtZW50cy50eXBlVmFyaWFibGVDbGFzcwogICAgXSk7CiAgfQoKICBNYXA8aW50LCBCYWNrZW5kSW1wYWN0PiBfZ2VuZXJpY0luc3RhbnRpYXRpb24gPSA8aW50LCBCYWNr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IFNzYUNvZGVHZW5lcmF0b3I7CmltcG9ydCAnLi4vc3NhL25vZGVzLmRhcnQnIHNob3cgSFR5cGVDb252ZXJzaW9uOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NhbGxfc3RydWN0dXJlLmRhcnQnIHNob3cgQ2FsbFN0cnVjdHVyZTsKaW1wb3J0ICcuLi91bml2ZXJzZS91c2UuZGFydCcgc2hvdyBTdGF0aWNVc2U7CmltcG9ydCAnbmFtZXIuZGFydCcgc2hvdyBOYW1lcjsKCmNsYXNzIENoZWNrZWRNb2RlSGVscGVyIHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgY29uc3QgQ2hlY2tlZE1vZGVIZWxwZXIoU3RyaW5nIHRoaXMubmFtZSk7CgogIFN0YXRpY1VzZSBnZXRTdGF0aWNVc2UoQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlZmFjdG9yIHRoaXMgdG8gYXZvaWQgbG9va2luZyB1cCBkaXJlY3RseSBpbiB0aGUKICAgIC8vIGpzIGhlbHBlciBsaWJyYXJ5IGJ1dCBpbnN0ZWFkIGFjY2VzcyBjb21tb25FbGVtZW50cy4KICAgIHJldHVybiBuZXcgU3RhdGljVXNlLnN0YXRpY0ludm9rZSgKICAgICAgICBjb21tb25FbGVtZW50cy5maW5kSGVscGVyRnVuY3Rpb24obmFtZSksIGNhbGxTdHJ1Y3R1cmUpOwogIH0KCiAgQ2FsbFN0cnVjdHVyZSBnZXQgY2FsbFN0cnVjdHVyZSA9PiBDYWxsU3RydWN0dXJlLk9ORV9BUkc7CgogIHZvaWQgZ2VuZXJhdGVBZGRpdGlvbmFsQXJndW1lbnRzKFNzYUNvZGVHZW5lcmF0b3IgY29kZWdlbiwgTmFtZXIgbmFtZXIsCiAgICAgIEhUeXBlQ29udmVyc2lvbiBub2RlLCBMaXN0PGpzQXN0LkV4cHJlc3Npb24+IGFyZ3VtZW50cykgewogICAgLy8gTm8gYWRkaXRpb25hbCBhcmd1bWVudHMgbmVlZGVkLgogIH0KfQoKY2xhc3MgUHJvcGVydHlDaGVja2VkTW9kZUhlbHBlciBleHRlbmRzIENoZWNrZWRNb2RlSGVscGVyIHsKICBjb25zdCBQcm9wZXJ0eUNoZWNrZWRNb2RlSGVscGVyKFN0cmluZyBuYW1lKSA6IHN1cGVyKG5hbWUpOwoKICBAb3ZlcnJpZGUKICBDYWxsU3RydWN0dXJlIGdldCBjYWxsU3RydWN0dXJlID0+IENhbGxTdHJ1Y3R1cmUuVFdPX0FSR1M7CgogIEBvdmVycmlkZQogIHZvaWQgZ2VuZXJhdGVBZGRpdGlvbmFsQXJndW1lbnRzKFNzYUNvZGVHZW5lcmF0b3IgY29kZWdlbiwgTmFtZXIgbmFtZXIsCiAgICAgIEhUeXBlQ29udmVyc2lvbiBub2RlLCBMaXN0PGpzQXN0LkV4cHJlc3Npb24+IGFyZ3VtZW50cykgewogICAgRGFydFR5cGUgdHlwZSA9IG5vZGUudHlwZUV4cHJlc3Npb247CiAgICBqc0FzdC5OYW1lIGFkZGl0aW9uYWxBcmd1bWVudCA9IG5hbWVyLm9wZXJhdG9ySXNUeXBlKHR5cGUpOwogICAgYXJndW1lbnRzLmFkZChqcy5xdW90ZU5hbWUoYWRkaXRpb25hbEFyZ3VtZW50KSk7CiAgfQp9CgpjbGFzcyBUeXBlVmFyaWFibGVDaGVja2VkTW9kZUhlbHBlciBleHRlbmRzIENoZWNrZWRNb2RlSGVscGVyIHsKICBjb25zdCBUeXBlVmFyaWFibGVDaGVja2VkTW9kZUhlbHBlcihTdHJpbmcgbmFtZSkgOiBzdXBlcihuYW1lKTsKCiAgQG92ZXJyaWRlCiAgQ2FsbFN0cnVjdHVyZSBnZXQgY2FsbFN0cnVjdHVyZSA9PiBDYWxsU3RydWN0dXJlLlRXT19BUkdTOwoKICBAb3ZlcnJpZGUKICB2b2lkIGdlbmVyYXRlQWRkaXRpb25hbEFyZ3VtZW50cyhTc2FDb2RlR2VuZXJhdG9yIGNvZGVnZW4sIE5hbWVyIG5hbWVyLAogICAgICBIVHlwZUNvbnZlcnNpb24gbm9kZSwgTGlzdDxqc0FzdC5FeHByZXNzaW9uPiBhcmd1bWVudHMpIHsKICAgIGFzc2VydChub2RlLnR5cGVFeHByZXNzaW9uLmlzVHlwZVZhcmlhYmxlKTsKICAgIGNvZGVnZW4udXNlKG5vZGUudHlwZVJlcHJlc2VudGF0aW9uKTsKICAgIGFyZ3VtZW50cy5hZGQoY29kZWdlbi5wb3AoKSk7CiAgfQp9CgpjbGFzcyBGdW5jdGlvblR5cGVSZXByZXNlbnRhdGlvbkNoZWNrZWRNb2RlSGVscGVyIGV4dGVuZHMgQ2hlY2tlZE1vZGVIZWxwZXIgewogIGNvbnN0IEZ1bmN0aW9uVHlwZVJlcHJlc2VudGF0aW9uQ2hlY2tlZE1vZGVIZWxwZXIoU3RyaW5nIG5hbWUpIDogc3VwZXIobmFtZSk7CgogIEBvdmVycmlkZQogIENhbGxTdHJ1Y3R1cmUgZ2V0IGNhbGxTdHJ1Y3R1cmUgPT4gQ2FsbFN0cnVjdHVyZS5UV09fQVJHUzsKCiAgQG92ZXJyaWRlCiAgdm9pZCBnZW5lcmF0ZUFkZGl0aW9uYWxBcmd1bWVudHMoU3NhQ29kZUdlbmVyYXRvciBjb2RlZ2VuLCBOYW1lciBuYW1lciwKICAgICAgSFR5cGVDb252ZXJzaW9uIG5vZGUsIExpc3Q8anNBc3QuRXhwcmVzc2lvbj4gYXJndW1lbnRzKSB7CiAgICBhc3NlcnQobm9kZS50eXBlRXhwcmVzc2lvbi5pc0Z1bmN0aW9uVHlwZSk7CiAgICBjb2RlZ2VuLnVzZShub2RlLnR5cGVSZXByZXNlbnRhdGlvbik7CiAgICBhcmd1bWVudHMuYWRkKGNvZGVnZW4ucG9wKCkpOwogIH0KfQoKY2xhc3MgRnV0dXJlT3JSZXByZXNlbnRhdGlvbkNoZWNrZWRNb2RlSGVscGVyIGV4dGVuZHMgQ2hlY2tlZE1vZGVIZWxwZXIgewogIGNvbnN0IEZ1dHVyZU9yUmVwcmVzZW50YXRpb25DaGVja2VkTW9kZUhlbHBlcihTdHJpbmcgbmFtZSkgOiBzdXBlcihuYW1lKTsKCiAgQG92ZXJyaWRlCiAgQ2FsbFN0cnVjdHVyZSBnZXQgY2FsbFN0cnVjdHVyZSA9PiBDYWxsU3RydWN0dXJlLlRXT19BUkdTOwoKICBAb3ZlcnJpZGUKICB2b2lkIGdlbmVyYXRlQWRkaXRpb25hbEFyZ3VtZW50cyhTc2FDb2RlR2VuZXJhdG9yIGNvZGVnZW4sIE5hbWVyIG5hbWVyLAogICAgICBIVHlwZUNvbnZlcnNpb24gbm9kZSwgTGlzdDxqc0FzdC5FeHByZXNzaW9uPiBhcmd1bWVudHMpIHsKICAgIGFzc2VydChub2RlLnR5cGVFeHByZXNzaW9uLmlzRnV0dXJlT3IpOwogICAgY29kZWdlbi51c2Uobm9kZS50eXBlUmVwcmVzZW50YXRpb24pOwogICAgYXJndW1lbnRzLmFkZChjb2RlZ2VuLnBvcCgpKTsKICB9Cn0KCmNsYXNzIFN1YnR5cGVDaGVja2VkTW9kZUhlbHBlciBleHRlbmRzIENoZWNrZWRNb2RlSGVscGVyIHsKICBjb25zdCBTdWJ0eXBlQ2hlY2tlZE1vZGVIZWxwZXIoU3RyaW5nIG5hbWUpIDogc3VwZXIobmFtZSk7CgogIEBvdmVycmlkZQogIENhbGxTdHJ1Y3R1cmUgZ2V0IGNhbGxTdHJ1Y3R1cmUgPT4gY29uc3QgQ2FsbFN0cnVjdHVyZS51bm5hbWVkKDQpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGdlbmVyYXRlQWRkaXRpb25hbEFyZ3VtZW50cyhTc2FDb2RlR2VuZXJhdG9yIGNvZGVnZW4sIE5hbWVyIG5hbWVyLAogICAgICBIVHlwZUNvbnZlcnNpb24gbm9kZSwgTGlzdDxqc0FzdC5FeHByZXNzaW9uPiBhcmd1bWVudHMpIHsKICAgIC8vIFRPRE8oc3JhKTogTW92ZSB0aGVzZSBjYWxscyBpbnRvIHRoZSBTU0EgZ3JhcGggc28gdGhhdCB0aGUgYXJndW1lbnRzIGNhbgogICAgLy8gYmUgb3B0aW1pemVkLCBlLGcsIEdWTmVkLgogICAgSW50ZXJmYWNlVHlwZSB0eXBlID0gbm9kZS50eXBlRXhwcmVzc2lvbjsKICAgIENsYXNzRW50aXR5IGVsZW1lbnQgPSB0eXBlLmVsZW1lbnQ7CiAgICBqc0FzdC5OYW1lIGlzRmllbGQgPSBuYW1lci5vcGVyYXRvcklzKGVsZW1lbnQpOwogICAgYXJndW1lbnRzLmFkZChqcy5xdW90ZU5hbWUoaXNGaWVsZCkpOwogICAgY29kZWdlbi51c2Uobm9kZS50eXBlUmVwcmVzZW50YXRpb24pOwogICAgYXJndW1lbnRzLmFkZChjb2RlZ2VuLnBvcCgpKTsKICAgIGpzQXN0Lk5hbWUgYXNGaWVsZCA9IG5hbWVyLnN1YnN0aXR1dGlvbk5hbWUoZWxlbWVudCk7CiAgICBhcmd1bWVudHMuYWRkKGpzLnF1b3RlTmFtZShhc0ZpZWxkKSk7CiAgfQp9CgpjbGFzcyBDaGVja2VkTW9kZUhlbHBlcnMgewogIENoZWNrZWRNb2RlSGVscGVycygpOwoKICAvLy8gQWxsIHRoZSBjaGVja2VkIG1vZGUgaGVscGVycy4KICBzdGF0aWMgY29uc3QgTGlzdDxDaGVja2VkTW9kZUhlbHBlcj4gaGVscGVycyA9IGNvbnN0IDxDaGVja2VkTW9kZUhlbHBlcj5bCiAgICBjb25zdCBDaGVja2VkTW9kZUhlbHBlcignc3RyaW5nVHlwZUNhc3QnKSwKICAgIGNvbnN0IENoZWNrZWRNb2RlSGVscGVyKCdzdHJpbmdUeXBlQ2hlY2snKSwKICAgIGNvbnN0IENoZWNrZWRNb2RlSGVscGVyKCdkb3VibGVUeXBlQ2FzdCcpLAogICAgY29uc3QgQ2hlY2tlZE1vZGVIZWxwZXIoJ2RvdWJsZVR5cGVDaGVjaycpLAogICAgY29uc3QgQ2hlY2tlZE1vZGVIZWxwZXIoJ251bVR5cGVDYXN0JyksCiAgICBjb25zdCBDaGVja2VkTW9kZUhlbHBlcignbnVtVHlwZUNoZWNrJyksCiAgICBjb25zdCBDaGVja2VkTW9kZUhlbHBlcignYm9vbENvbnZlcnNpb25DaGVjaycpLAogICAgY29uc3QgQ2hlY2tlZE1vZGVIZWxwZXIoJ2Jvb2xUeXBlQ2FzdCcpLAogICAgY29uc3QgQ2hlY2tlZE1vZGVIZWxwZXIoJ2Jvb2xUeXBlQ2hlY2snKSwKICAgIGNvbnN0IENoZWNrZWRNb2RlSGVscGVyKCdpbnRUeXBlQ2FzdCcpLAogICAgY29uc3QgQ2hlY2tlZE1vZGVIZWxwZXIoJ2ludFR5cGVDaGVjaycpLAogICAgY29uc3QgUHJvcGVydHlDaGVja2VkTW9kZUhlbHBlcignbnVtYmVyT3JTdHJpbmdTdXBlck5hdGl2ZVR5cGVDYXN0JyksCiAgICBjb25zdCBQcm9wZXJ0eUNoZWNrZWRNb2RlSGVscGVyKCdudW1iZXJPclN0cmluZ1N1cGVyTmF0aXZlVHlwZUNoZWNrJyksCiAgICBjb25zdCBQcm9wZXJ0eUNoZWNrZWRNb2RlSGVscGVyKCdudW1iZXJPclN0cmluZ1N1cGVyVHlwZUNhc3QnKSwKICAgIGNvbnN0IFByb3BlcnR5Q2hlY2tlZE1vZGVIZWxwZXIoJ251bWJlck9yU3RyaW5nU3VwZXJUeXBlQ2hlY2snKSwKICAgIGNvbnN0IFByb3BlcnR5Q2hlY2tlZE1vZGVIZWxwZXIoJ3N0cmluZ1N1cGVyTmF0aXZlVHlwZUNhc3QnKSwKICAgIGNvbnN0IFByb3BlcnR5Q2hlY2tlZE1vZGVIZWxwZXIoJ3N0cmluZ1N1cGVyTmF0aXZlVHlwZUNoZWNrJyksCiAgICBjb25zdCBQcm9wZXJ0eUNoZWNrZWRNb2RlSGVscGVyKCdzdHJpbmdTdXBlclR5cGVDYXN0JyksCiAgICBjb25zdCBQcm9wZXJ0eUNoZWNrZWRNb2RlSGVscGVyKCdzdHJpbmdTdXBlclR5cGVDaGVjaycpLAogICAgY29uc3QgQ2hlY2tlZE1vZGVIZWxwZXIoJ2xpc3RUeXBlQ2FzdCcpLAogICAgY29uc3QgQ2hlY2tlZE1vZGVIZWxwZXIoJ2xpc3RUeXBlQ2hlY2snKSwKICAgIGNvbnN0IFByb3BlcnR5Q2hlY2tlZE1vZGVIZWxwZXIoJ2xpc3RTdXBlck5hdGl2ZVR5cGVDYXN0JyksCiAgICBjb25zdCBQcm9wZXJ0eUNoZWNrZWRNb2RlSGVscGVyKCdsaXN0U3VwZXJOYXRpdmVUeXBlQ2hlY2snKSwKICAgIGNvbnN0IFByb3BlcnR5Q2hlY2tlZE1vZGVIZWxwZXIoJ2xpc3RTdXBlclR5cGVDYXN0JyksCiAgICBjb25zdCBQcm9wZXJ0eUNoZWNrZWRNb2RlSGVscGVyKCdsaXN0U3VwZXJUeXBlQ2hlY2snKSwKICAgIGNvbnN0IFByb3BlcnR5Q2hlY2tlZE1vZGVIZWxwZXIoJ2ludGVyY2VwdGVkVHlwZUNhc3QnKSwKICAgIGNvbnN0IFByb3BlcnR5Q2hlY2tlZE1vZGVIZWxwZXIoJ2ludGVyY2VwdGVkVHlwZUNoZWNrJyksCiAgICBjb25zdCBTdWJ0eXBlQ2hlY2tlZE1vZGVIZWxwZXIoJ3N1YnR5cGVDYXN0JyksCiAgICBjb25zdCBTdWJ0eXBlQ2hlY2tlZE1vZGVIZWxwZXIoJ2Fzc2VydFN1YnR5cGUnKSwKICAgIGNvbnN0IFR5cGVWYXJpYWJsZUNoZWNrZWRNb2RlSGVscGVyKCdzdWJ0eXBlT2ZSdW50aW1lVHlwZUNhc3QnKSwKICAgIGNvbnN0IFR5cGVWYXJpYWJsZUNoZWNrZWRNb2RlSGVscGVyKCdhc3NlcnRTdWJ0eXBlT2ZSdW50aW1lVHlwZScpLAogICAgY29uc3QgUHJvcGVydHlDaGVja2VkTW9kZUhlbHBlcigncHJvcGVydHlUeXBlQ2FzdCcpLAogICAgY29uc3QgUHJvcGVydHlDaGVja2VkTW9kZUhlbHBlcigncHJvcGVydHlUeXBlQ2hlY2snKSwKICAgIGNvbnN0IEZ1bmN0aW9uVHlwZVJlcHJlc2VudGF0aW9uQ2hlY2tlZE1vZGVIZWxwZXIoJ2Z1bmN0aW9uVHlwZUNhc3QnKSwKICAgIGNvbnN0IEZ1bmN0aW9uVHlwZVJlcHJlc2VudGF0aW9uQ2hlY2tlZE1vZGVIZWxwZXIoJ2Z1bmN0aW9uVHlwZUNoZWNrJyksCiAgICBjb25zdCBGdXR1cmVPclJlcHJlc2VudGF0aW9uQ2hlY2tlZE1vZGVIZWxwZXIoJ2Z1dHVyZU9yQ2FzdCcpLAogICAgY29uc3QgRnV0dXJlT3JSZXByZXNlbnRhdGlvbkNoZWNrZWRNb2RlSGVscGVyKCdmdXR1cmVPckNoZWNrJyksCiAgXTsKCiAgLy8gQ2hlY2tlZCBtb2RlIGhlbHBlcnMgaW5kZXhlZCBieSBuYW1lLgogIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBDaGVja2VkTW9kZUhlbHBlcj4gY2hlY2tlZE1vZGVIZWxwZXJCeU5hbWUgPQogICAgICBuZXcgTWFwPFN0cmluZywgQ2hlY2tlZE1vZGVIZWxwZXI+LmZyb21JdGVyYWJsZShoZWxwZXJzLAogICAgICAgICAga2V5OiAoaGVscGVyKSA9PiBoZWxwZXIubmFtZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBjaGVja2VkIG1vZGUgaGVscGVyIHRoYXQgd2lsbCBiZSBuZWVkZWQgdG8gZG8gYSB0eXBlCiAgLy8vIGNoZWNrL3R5cGUgY2FzdCBvbiBbdHlwZV0gYXQgcnVudGltZS4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGlzIGJlaW5nCiAgLy8vIGNhbGxlZCBib3RoIGJ5IHRoZSByZXNvbHZlciB3aXRoIGludGVyZmFjZSB0eXBlcyAoaW50LCBTdHJpbmcsIC4uLiksIGFuZAogIC8vLyBieSB0aGUgU1NBIGJhY2tlbmQgd2l0aCBpbXBsZW1lbnRhdGlvbiB0eXBlcyAoSlNJbnQsIEpTU3RyaW5nLCAuLi4pLgogIENoZWNrZWRNb2RlSGVscGVyIGdldENoZWNrZWRNb2RlSGVscGVyKAogICAgICBEYXJ0VHlwZSB0eXBlLCBDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgICAge2Jvb2wgdHlwZUNhc3R9KSB7CiAgICByZXR1cm4gZ2V0Q2hlY2tlZE1vZGVIZWxwZXJJbnRlcm5hbCh0eXBlLCBjb21tb25FbGVtZW50cywKICAgICAgICB0eXBlQ2FzdDogdHlwZUNhc3QsIG5hdGl2ZUNoZWNrT25seTogZmFsc2UpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIG5hdGl2ZSBjaGVja2VkIG1vZGUgaGVscGVyIHRoYXQgd2lsbCBiZSBuZWVkZWQgdG8gZG8gYSB0eXBlCiAgLy8vIGNoZWNrL3R5cGUgY2FzdCBvbiBbdHlwZV0gYXQgcnVudGltZS4gSWYgbm8gbmF0aXZlIGhlbHBlciBleGlzdHMgZm9yCiAgLy8vIFt0eXBlXSwgWzpudWxsOl0gaXMgcmV0dXJuZWQuCiAgQ2hlY2tlZE1vZGVIZWxwZXIgZ2V0TmF0aXZlQ2hlY2tlZE1vZGVIZWxwZXIoCiAgICAgIERhcnRUeXBlIHR5cGUsIENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgICB7Ym9vbCB0eXBlQ2FzdH0pIHsKICAgIHJldHVybiBnZXRDaGVja2VkTW9kZUhlbHBlckludGVybmFsKHR5cGUsIGNvbW1vbkVsZW1lbnRzLAogICAgICAgIHR5cGVDYXN0OiB0eXBlQ2FzdCwgbmF0aXZlQ2hlY2tPbmx5OiB0cnVlKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBjaGVja2VkIG1vZGUgaGVscGVyIGZvciB0aGUgdHlwZSBjaGVjay90eXBlIGNhc3QgZm9yCiAgLy8vIFt0eXBlXS4gSWYgW25hdGl2ZUNoZWNrT25seV0gaXMgWzp0cnVlOl0sIG9ubHkgbmFtZXMgZm9yIG5hdGl2ZSBoZWxwZXJzCiAgLy8vIGFyZSByZXR1cm5lZC4KICBDaGVja2VkTW9kZUhlbHBlciBnZXRDaGVja2VkTW9kZUhlbHBlckludGVybmFsKAogICAgICBEYXJ0VHlwZSB0eXBlLCBDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgICAge2Jvb2wgdHlwZUNhc3QsIGJvb2wgbmF0aXZlQ2hlY2tPbmx5fSkgewogICAgU3RyaW5nIG5hbWUgPSBnZXRDaGVja2VkTW9kZUhlbHBlck5hbWVJbnRlcm5hbCh0eXBlLCBjb21tb25FbGVtZW50cywKICAgICAgICB0eXBlQ2FzdDogdHlwZUNhc3QsIG5hdGl2ZUNoZWNrT25seTogbmF0aXZlQ2hlY2tPbmx5KTsKICAgIGlmIChuYW1lID09IG51bGwpIHJldHVybiBudWxsOwogICAgQ2hlY2tlZE1vZGVIZWxwZXIgaGVscGVyID0gY2hlY2tlZE1vZGVIZWxwZXJCeU5hbWVbbmFtZV07CiAgICBhc3NlcnQoaGVscGVyICE9IG51bGwpOwogICAgcmV0dXJuIGhlbHBlcjsKICB9CgogIFN0cmluZyBnZXRDaGVja2VkTW9kZUhlbHBlck5hbWVJbnRlcm5hbCgKICAgICAgRGFydFR5cGUgdHlwZSwgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIHtib29sIHR5cGVDYXN0LCBib29sIG5hdGl2ZUNoZWNrT25seX0pIHsKICAgIGFzc2VydCghdHlwZS5pc1R5cGVkZWYpOwoKICAgIGlmICh0eXBlLmlzVHlwZVZhcmlhYmxlKSB7CiAgICAgIHJldHVybiB0eXBlQ2FzdAogICAgICAgICAgPyAnc3VidHlwZU9mUnVudGltZVR5cGVDYXN0JwogICAgICAgICAgOiAnYXNzZXJ0U3VidHlwZU9mUnVudGltZVR5cGUnOwogICAgfQoKICAgIGlmICh0eXBlLmlzRnVuY3Rpb25UeXBlKSB7CiAgICAgIHJldHVybiB0eXBlQ2FzdCA/ICdmdW5jdGlvblR5cGVDYXN0JyA6ICdmdW5jdGlvblR5cGVDaGVjayc7CiAgICB9CgogICAgaWYgKHR5cGUuaXNGdXR1cmVPcikgewogICAgICByZXR1cm4gdHlwZUNhc3QgPyAnZnV0dXJlT3JDYXN0JyA6ICdmdXR1cmVPckNoZWNrJzsKICAgIH0KCiAgICBhc3NlcnQodHlwZS5pc0ludGVyZmFjZVR5cGUsCiAgICAgICAgZmFpbGVkQXQoTk9fTE9DQVRJT05fU1BBTk5BQkxFLCAiVW5leHBlY3RlZCB0eXBlOiAkdHlwZSIpKTsKICAgIEludGVyZmFjZVR5cGUgaW50ZXJmYWNlVHlwZSA9IHR5cGU7CiAgICBDbGFzc0VudGl0eSBlbGVtZW50ID0gaW50ZXJmYWNlVHlwZS5lbGVtZW50OwogICAgYm9vbCBuYXRpdmVDaGVjayA9IHRydWU7CiAgICAvLyBUT0RPKDEzOTU1KSwgVE9ETyg5NzMxKS4gIFRoZSB0ZXN0IGZvciBub24tcHJpbWl0aXZlIHR5cGVzIHNob3VsZCB1c2UgYW4KICAgIC8vIGludGVyY2VwdG9yLiAgVGhlIGludGVyY2VwdG9yIHNob3VsZCBiZSBhbiBhcmd1bWVudCB0byBIVHlwZUNvbnZlcnNpb24gc28KICAgIC8vIHRoYXQgaXQgY2FuIGJlIG9wdGltaXplZCBieSBzdGFuZGFyZCBpbnRlcmNlcHRvciBvcHRpbWl6YXRpb25zLgogICAgLy8gIG5hdGl2ZUNoZWNrT25seSB8fCBlbWl0dGVyLm5hdGl2ZUVtaXR0ZXIucmVxdWlyZXNOYXRpdmVJc0NoZWNrKGVsZW1lbnQpOwoKICAgIHZhciBzdWZmaXggPSB0eXBlQ2FzdCA/ICdUeXBlQ2FzdCcgOiAnVHlwZUNoZWNrJzsKICAgIGlmIChlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmpzU3RyaW5nQ2xhc3MgfHwKICAgICAgICBlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLnN0cmluZ0NsYXNzKSB7CiAgICAgIGlmIChuYXRpdmVDaGVja09ubHkpIHJldHVybiBudWxsOwogICAgICByZXR1cm4gJ3N0cmluZyRzdWZmaXgnOwogICAgfQoKICAgIGlmIChlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmpzRG91YmxlQ2xhc3MgfHwKICAgICAgICBlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmRvdWJsZUNsYXNzKSB7CiAgICAgIGlmIChuYXRpdmVDaGVja09ubHkpIHJldHVybiBudWxsOwogICAgICByZXR1cm4gJ2RvdWJsZSRzdWZmaXgnOwogICAgfQoKICAgIGlmIChlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmpzTnVtYmVyQ2xhc3MgfHwKICAgICAgICBlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLm51bUNsYXNzKSB7CiAgICAgIGlmIChuYXRpdmVDaGVja09ubHkpIHJldHVybiBudWxsOwogICAgICByZXR1cm4gJ251bSRzdWZmaXgnOwogICAgfQoKICAgIGlmIChlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmpzQm9vbENsYXNzIHx8CiAgICAgICAgZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5ib29sQ2xhc3MpIHsKICAgICAgaWYgKG5hdGl2ZUNoZWNrT25seSkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiAnYm9vbCRzdWZmaXgnOwogICAgfQoKICAgIGlmIChlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmpzSW50Q2xhc3MgfHwKICAgICAgICBlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmludENsYXNzIHx8CiAgICAgICAgZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5qc1VJbnQzMkNsYXNzIHx8CiAgICAgICAgZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5qc1VJbnQzMUNsYXNzIHx8CiAgICAgICAgZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5qc1Bvc2l0aXZlSW50Q2xhc3MpIHsKICAgICAgaWYgKG5hdGl2ZUNoZWNrT25seSkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiAnaW50JHN1ZmZpeCc7CiAgICB9CgogICAgaWYgKGNvbW1vbkVsZW1lbnRzLmlzTnVtYmVyT3JTdHJpbmdTdXBlcnR5cGUoZWxlbWVudCkpIHsKICAgICAgcmV0dXJuIG5hdGl2ZUNoZWNrCiAgICAgICAgICA/ICdudW1iZXJPclN0cmluZ1N1cGVyTmF0aXZlJHN1ZmZpeCcKICAgICAgICAgIDogJ251bWJlck9yU3RyaW5nU3VwZXIkc3VmZml4JzsKICAgIH0KCiAgICBpZiAoY29tbW9uRWxlbWVudHMuaXNTdHJpbmdPbmx5U3VwZXJ0eXBlKGVsZW1lbnQpKSB7CiAgICAgIHJldHVybiBuYXRpdmVDaGVjayA/ICdzdHJpbmdTdXBlck5hdGl2ZSRzdWZmaXgnIDogJ3N0cmluZ1N1cGVyJHN1ZmZpeCc7CiAgICB9CgogICAgaWYgKChlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmxpc3RDbGFzcyB8fAogICAgICAgICAgICBlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmpzQXJyYXlDbGFzcykgJiYKICAgICAgICB0eXBlLnRyZWF0QXNSYXcpIHsKICAgICAgaWYgKG5hdGl2ZUNoZWNrT25seSkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiAnbGlzdCRzdWZmaXgnOwogICAgfQoKICAgIGlmIChjb21tb25FbGVtZW50cy5pc0xpc3RTdXBlcnR5cGUoZWxlbWVudCkgJiYgdHlwZS50cmVhdEFzUmF3KSB7CiAgICAgIHJldHVybiBuYXRpdmVDaGVjayA/ICdsaXN0U3VwZXJOYXRpdmUkc3VmZml4JyA6ICdsaXN0U3VwZXIkc3VmZml4JzsKICAgIH0KCiAgICBpZiAodHlwZS5pc0ludGVyZmFjZVR5cGUgJiYgIXR5cGUudHJlYXRBc1JhdykgewogICAgICByZXR1cm4gdHlwZUNhc3QgPyAnc3VidHlwZUNhc3QnIDogJ2Fzc2VydFN1YnR5cGUnOwogICAgfQoKICAgIGlmIChuYXRpdmVDaGVjaykgewogICAgICAvLyBUT0RPKGthcmxrbG9zZSk6IGNhbiB3ZSBnZXQgcmlkIG9mIHRoaXMgYnJhbmNoIHdoZW4gd2UgdXNlCiAgICAgIC8vIGludGVyY2VwdG9ycz8KICAgICAgcmV0dXJuICdpbnRlcmNlcHRlZCRzdWZmaXgnOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICdwcm9wZXJ0eSRzdWZmaXgnOwogICAgfQogIH0KfQqBLQBOTjwBGSIkISEgNDE9LiABGhUBLQE6TjwnQQQBPAFKQCcEAgE8PgEMPQEMSkApQDUEAgFAQgEMPQEMSkAwKiIEAgFOUAEMPQEMSkAwKiIEAgFKTAEMPQEMSkAsKiIEAgE7PQEMRQEMSkBQIS4oNCoqIjoqBAIBGxgBJEwvMC8wLC00LS4sLUpLREVCQzw9LS5AQTo7PD0zNUVHOTpLTENEBQErSD8pAUdLT0sqNBk+NQQBTkskMDQZPjQEAUdOFDI0L0k/Iz4cEwQBKzQvHQEfFicqBgEfQgYBGzoGASFEKDEdUFFHUQE2MzEoHgYBMzEoHgYBMy4oGwYBMS8oHAYBMC4zMzgoGwYBPRkvKgYBOU4GATA3GygcBgFGSgYBNDkGARdEFyMNIAYEAgE5cGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9jaGVja2VkX21vZGVfaGVscGVycy5kYXJ0PnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2JhY2tlbmQvY29kZWdlbl9saXN0ZW5lci5kYXJ0rn0vLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBqc19iYWNrZW5kLmJhY2tlbmQuY29kZWdlbl9saXN0ZW5lcjsKCmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnIHNob3cgSWRlbnRpZmllcnM7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgQ29tbW9uRWxlbWVudHMsIEVsZW1lbnRFbnZpcm9ubWVudDsKaW1wb3J0ICcuLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2VucXVldWUuZGFydCcgc2hvdyBFbnF1ZXVlciwgRW5xdWV1ZXJMaXN0ZW5lcjsKaW1wb3J0ICcuLi9uYXRpdmUvZW5xdWV1ZS5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jYWxsX3N0cnVjdHVyZS5kYXJ0JyBzaG93IENhbGxTdHJ1Y3R1cmU7CmltcG9ydCAnLi4vdW5pdmVyc2UvdXNlLmRhcnQnIHNob3cgU3RhdGljVXNlLCBUeXBlVXNlOwppbXBvcnQgJy4uL3VuaXZlcnNlL3dvcmxkX2ltcGFjdC5kYXJ0JwogICAgc2hvdyBXb3JsZEltcGFjdCwgV29ybGRJbXBhY3RCdWlsZGVyLCBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsOwppbXBvcnQgJ2JhY2tlbmRfaW1wYWN0LmRhcnQnOwppbXBvcnQgJ2JhY2tlbmRfdXNhZ2UuZGFydCc7CmltcG9ydCAnY3VzdG9tX2VsZW1lbnRzX2FuYWx5c2lzLmRhcnQnOwppbXBvcnQgJ3J1bnRpbWVfdHlwZXMuZGFydCc7CgpjbGFzcyBDb2RlZ2VuRW5xdWV1ZXJMaXN0ZW5lciBleHRlbmRzIEVucXVldWVyTGlzdGVuZXIgewogIGZpbmFsIEVsZW1lbnRFbnZpcm9ubWVudCBfZWxlbWVudEVudmlyb25tZW50OwogIGZpbmFsIENvbW1vbkVsZW1lbnRzIF9jb21tb25FbGVtZW50czsKICBmaW5hbCBCYWNrZW5kSW1wYWN0cyBfaW1wYWN0czsKCiAgZmluYWwgQmFja2VuZFVzYWdlIF9iYWNrZW5kVXNhZ2U7CiAgZmluYWwgUnVudGltZVR5cGVzTmVlZCBfcnRpTmVlZDsKCiAgZmluYWwgQ3VzdG9tRWxlbWVudHNDb2RlZ2VuQW5hbHlzaXMgX2N1c3RvbUVsZW1lbnRzQW5hbHlzaXM7CgogIGZpbmFsIE5hdGl2ZUNvZGVnZW5FbnF1ZXVlciBfbmF0aXZlRW5xdWV1ZXI7CgogIGJvb2wgX2lzTm9TdWNoTWV0aG9kVXNlZCA9IGZhbHNlOwoKICBDb2RlZ2VuRW5xdWV1ZXJMaXN0ZW5lcigKICAgICAgdGhpcy5fZWxlbWVudEVudmlyb25tZW50LAogICAgICB0aGlzLl9jb21tb25FbGVtZW50cywKICAgICAgdGhpcy5faW1wYWN0cywKICAgICAgdGhpcy5fYmFja2VuZFVzYWdlLAogICAgICB0aGlzLl9ydGlOZWVkLAogICAgICB0aGlzLl9jdXN0b21FbGVtZW50c0FuYWx5c2lzLAogICAgICB0aGlzLl9uYXRpdmVFbnF1ZXVlcik7CgogIEBvdmVycmlkZQogIFdvcmxkSW1wYWN0IHJlZ2lzdGVyQ2xvc3VyaXplZE1lbWJlcihGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsIGltcGFjdEJ1aWxkZXIgPSBuZXcgV29ybGRJbXBhY3RCdWlsZGVySW1wbCgpOwogICAgaW1wYWN0QnVpbGRlcgogICAgICAgIC5hZGRJbXBhY3QoX2ltcGFjdHMubWVtYmVyQ2xvc3VyZS5jcmVhdGVJbXBhY3QoX2VsZW1lbnRFbnZpcm9ubWVudCkpOwogICAgRnVuY3Rpb25UeXBlIHR5cGUgPSBfZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZShlbGVtZW50KTsKICAgIGlmICh0eXBlLmNvbnRhaW5zVHlwZVZhcmlhYmxlcyAmJiBfcnRpTmVlZC5tZXRob2ROZWVkc1NpZ25hdHVyZShlbGVtZW50KSkgewogICAgICBpbXBhY3RCdWlsZGVyLmFkZEltcGFjdChfcmVnaXN0ZXJDb21wdXRlU2lnbmF0dXJlKCkpOwogICAgfQogICAgcmV0dXJuIGltcGFjdEJ1aWxkZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBXb3JsZEltcGFjdCByZWdpc3RlckdldE9mU3RhdGljRnVuY3Rpb24oKSB7CiAgICByZXR1cm4gX2ltcGFjdHMuc3RhdGljQ2xvc3VyZS5jcmVhdGVJbXBhY3QoX2VsZW1lbnRFbnZpcm9ubWVudCk7CiAgfQoKICBXb3JsZEltcGFjdCBfcmVnaXN0ZXJDb21wdXRlU2lnbmF0dXJlKCkgewogICAgcmV0dXJuIF9pbXBhY3RzLmNvbXB1dGVTaWduYXR1cmUuY3JlYXRlSW1wYWN0KF9lbGVtZW50RW52aXJvbm1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlckluc3RhbnRpYXRlZFR5cGUoSW50ZXJmYWNlVHlwZSB0eXBlLAogICAgICB7Ym9vbCBpc0dsb2JhbDogZmFsc2UsIGJvb2wgbmF0aXZlVXNhZ2U6IGZhbHNlfSkgewogICAgaWYgKG5hdGl2ZVVzYWdlKSB7CiAgICAgIF9uYXRpdmVFbnF1ZXVlci5vbkluc3RhbnRpYXRlZFR5cGUodHlwZSk7CiAgICB9CiAgfQoKICAvLy8gQ29tcHV0ZXMgdGhlIFtXb3JsZEltcGFjdF0gb2YgY2FsbGluZyBbbWFpbk1ldGhvZF0gYXMgdGhlIGVudHJ5IHBvaW50LgogIFdvcmxkSW1wYWN0IF9jb21wdXRlTWFpbkltcGFjdChGdW5jdGlvbkVudGl0eSBtYWluTWV0aG9kKSB7CiAgICBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsIG1haW5JbXBhY3QgPSBuZXcgV29ybGRJbXBhY3RCdWlsZGVySW1wbCgpOwogICAgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlID0gbWFpbk1ldGhvZC5wYXJhbWV0ZXJTdHJ1Y3R1cmUuY2FsbFN0cnVjdHVyZTsKICAgIGlmIChjYWxsU3RydWN0dXJlLmFyZ3VtZW50Q291bnQgPiAwKSB7CiAgICAgIF9pbXBhY3RzLm1haW5XaXRoQXJndW1lbnRzCiAgICAgICAgICAucmVnaXN0ZXJJbXBhY3QobWFpbkltcGFjdCwgX2VsZW1lbnRFbnZpcm9ubWVudCk7CiAgICAgIG1haW5JbXBhY3QucmVnaXN0ZXJTdGF0aWNVc2UoCiAgICAgICAgICBuZXcgU3RhdGljVXNlLnN0YXRpY0ludm9rZShtYWluTWV0aG9kLCBjYWxsU3RydWN0dXJlKSk7CiAgICB9CiAgICBtYWluSW1wYWN0LnJlZ2lzdGVyU3RhdGljVXNlKAogICAgICAgIG5ldyBTdGF0aWNVc2Uuc3RhdGljSW52b2tlKG1haW5NZXRob2QsIENhbGxTdHJ1Y3R1cmUuTk9fQVJHUykpOwogICAgcmV0dXJuIG1haW5JbXBhY3Q7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIG9uUXVldWVPcGVuKAogICAgICBFbnF1ZXVlciBlbnF1ZXVlciwgRnVuY3Rpb25FbnRpdHkgbWFpbk1ldGhvZCwgSXRlcmFibGU8VXJpPiBsaWJyYXJpZXMpIHsKICAgIGVucXVldWVyLmFwcGx5SW1wYWN0KF9uYXRpdmVFbnF1ZXVlci5wcm9jZXNzTmF0aXZlQ2xhc3NlcyhsaWJyYXJpZXMpKTsKICAgIGlmIChtYWluTWV0aG9kICE9IG51bGwpIHsKICAgICAgZW5xdWV1ZXIuYXBwbHlJbXBhY3QoX2NvbXB1dGVNYWluSW1wYWN0KG1haW5NZXRob2QpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgb25RdWV1ZUVtcHR5KEVucXVldWVyIGVucXVldWVyLCBJdGVyYWJsZTxDbGFzc0VudGl0eT4gcmVjZW50Q2xhc3NlcykgewogICAgLy8gQWRkIGVsZW1lbnRzIHVzZWQgc3ludGhldGljYWxseSwgdGhhdCBpcywgdGhyb3VnaCBmZWF0dXJlcyByYXRoZXIgdGhhbgogICAgLy8gc3ludGF4LCBmb3IgaW5zdGFuY2UgY3VzdG9tIGVsZW1lbnRzLgogICAgLy8KICAgIC8vIFJldHVybiBlYXJseSBpZiBhbnkgZWxlbWVudHMgYXJlIGFkZGVkIHRvIGF2b2lkIGNvdW50aW5nIHRoZSBlbGVtZW50cyBhcwogICAgLy8gZHVlIHRvIG1pcnJvcnMuCiAgICBlbnF1ZXVlci5hcHBseUltcGFjdChfY3VzdG9tRWxlbWVudHNBbmFseXNpcy5mbHVzaCgpKTsKCiAgICBpZiAoX2JhY2tlbmRVc2FnZS5pc05vU3VjaE1ldGhvZFVzZWQgJiYgIV9pc05vU3VjaE1ldGhvZFVzZWQpIHsKICAgICAgZW5xdWV1ZXIuYXBwbHlJbXBhY3QoCiAgICAgICAgICBfaW1wYWN0cy5ub1N1Y2hNZXRob2RTdXBwb3J0LmNyZWF0ZUltcGFjdChfZWxlbWVudEVudmlyb25tZW50KSk7CiAgICAgIF9pc05vU3VjaE1ldGhvZFVzZWQgPSB0cnVlOwogICAgfQoKICAgIGlmICghZW5xdWV1ZXIucXVldWVJc0VtcHR5KSByZXR1cm4gZmFsc2U7CgogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIG9uUXVldWVDbG9zZWQoKSB7fQoKICAvLy8gQWRkcyB0aGUgaW1wYWN0IG9mIFtjb25zdGFudF0gdG8gW2ltcGFjdEJ1aWxkZXJdLgogIHZvaWQgX2NvbXB1dGVJbXBhY3RGb3JDb21waWxlVGltZUNvbnN0YW50KAogICAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50LCBXb3JsZEltcGFjdEJ1aWxkZXIgaW1wYWN0QnVpbGRlcikgewogICAgX2NvbXB1dGVJbXBhY3RGb3JDb21waWxlVGltZUNvbnN0YW50SW50ZXJuYWwoY29uc3RhbnQsIGltcGFjdEJ1aWxkZXIpOwoKICAgIGZvciAoQ29uc3RhbnRWYWx1ZSBkZXBlbmRlbmN5IGluIGNvbnN0YW50LmdldERlcGVuZGVuY2llcygpKSB7CiAgICAgIF9jb21wdXRlSW1wYWN0Rm9yQ29tcGlsZVRpbWVDb25zdGFudChkZXBlbmRlbmN5LCBpbXBhY3RCdWlsZGVyKTsKICAgIH0KICB9CgogIHZvaWQgX2NvbXB1dGVJbXBhY3RGb3JDb21waWxlVGltZUNvbnN0YW50SW50ZXJuYWwoCiAgICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnQsIFdvcmxkSW1wYWN0QnVpbGRlciBpbXBhY3RCdWlsZGVyKSB7CiAgICBEYXJ0VHlwZSB0eXBlID0gY29uc3RhbnQuZ2V0VHlwZShfY29tbW9uRWxlbWVudHMpOwogICAgX2NvbXB1dGVJbXBhY3RGb3JJbnN0YW50aWF0ZWRDb25zdGFudFR5cGUodHlwZSwgaW1wYWN0QnVpbGRlcik7CgogICAgaWYgKGNvbnN0YW50LmlzRnVuY3Rpb24pIHsKICAgICAgRnVuY3Rpb25Db25zdGFudFZhbHVlIGZ1bmN0aW9uID0gY29uc3RhbnQ7CiAgICAgIGltcGFjdEJ1aWxkZXIKICAgICAgICAgIC5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN0YXRpY1RlYXJPZmYoZnVuY3Rpb24uZWxlbWVudCkpOwogICAgfSBlbHNlIGlmIChjb25zdGFudC5pc0ludGVyY2VwdG9yKSB7CiAgICAgIC8vIEFuIGludGVyY2VwdG9yIGNvbnN0YW50IHJlZmVyZW5jZXMgdGhlIGNsYXNzJ3MgcHJvdG90eXBlIGNoYWluLgogICAgICBJbnRlcmNlcHRvckNvbnN0YW50VmFsdWUgaW50ZXJjZXB0b3IgPSBjb25zdGFudDsKICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gaW50ZXJjZXB0b3IuY2xzOwogICAgICBfY29tcHV0ZUltcGFjdEZvckluc3RhbnRpYXRlZENvbnN0YW50VHlwZSgKICAgICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0VGhpc1R5cGUoY2xzKSwgaW1wYWN0QnVpbGRlcik7CiAgICB9IGVsc2UgaWYgKGNvbnN0YW50LmlzVHlwZSkgewogICAgICBpbXBhY3RCdWlsZGVyCiAgICAgICAgICAucmVnaXN0ZXJUeXBlVXNlKG5ldyBUeXBlVXNlLmluc3RhbnRpYXRpb24oX2NvbW1vbkVsZW1lbnRzLnR5cGVUeXBlKSk7CiAgICAgIC8vIElmIHRoZSB0eXBlIGlzIGEgd2ViIGNvbXBvbmVudCwgd2UgbmVlZCB0byBlbnN1cmUgdGhlIGNvbnN0cnVjdG9ycyBhcmUKICAgICAgLy8gYXZhaWxhYmxlIHRvICd1cGdyYWRlJyB0aGUgbmF0aXZlIG9iamVjdC4KICAgICAgVHlwZUNvbnN0YW50VmFsdWUgdHlwZSA9IGNvbnN0YW50OwogICAgICBpZiAodHlwZS5yZXByZXNlbnRlZFR5cGUuaXNJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgSW50ZXJmYWNlVHlwZSByZXByZXNlbnRlZFR5cGUgPSB0eXBlLnJlcHJlc2VudGVkVHlwZTsKICAgICAgICBfY3VzdG9tRWxlbWVudHNBbmFseXNpcy5yZWdpc3RlclR5cGVDb25zdGFudChyZXByZXNlbnRlZFR5cGUuZWxlbWVudCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY29uc3RhbnQgaXMgSW5zdGFudGlhdGlvbkNvbnN0YW50VmFsdWUpIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVnaXN0ZXIgdGhlc2UgdXNpbmcgYEJhY2tlbmRJbXBhY3RgLgogICAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyVHlwZVVzZShuZXcgVHlwZVVzZS5pbnN0YW50aWF0aW9uKAogICAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRUaGlzVHlwZShfY29tbW9uRWxlbWVudHMKICAgICAgICAgICAgICAuZ2V0SW5zdGFudGlhdGlvbkNsYXNzKGNvbnN0YW50LnR5cGVBcmd1bWVudHMubGVuZ3RoKSkpKTsKICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN0YXRpY0ludm9rZSgKICAgICAgICAgIF9jb21tb25FbGVtZW50cy5pbnN0YW50aWF0ZWRHZW5lcmljRnVuY3Rpb25UeXBlLAogICAgICAgICAgQ2FsbFN0cnVjdHVyZS5UV09fQVJHUykpOwogICAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3RhdGljSW52b2tlKAogICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmV4dHJhY3RGdW5jdGlvblR5cGVPYmplY3RGcm9tSW50ZXJuYWwsCiAgICAgICAgICBDYWxsU3RydWN0dXJlLk9ORV9BUkcpKTsKICAgIH0KICB9CgogIHZvaWQgX2NvbXB1dGVJbXBhY3RGb3JJbnN0YW50aWF0ZWRDb25zdGFudFR5cGUoCiAgICAgIERhcnRUeXBlIHR5cGUsIFdvcmxkSW1wYWN0QnVpbGRlciBpbXBhY3RCdWlsZGVyKSB7CiAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJUeXBlVXNlKG5ldyBUeXBlVXNlLmluc3RhbnRpYXRpb24odHlwZSkpOwogICAgICBpZiAoX3J0aU5lZWQuY2xhc3NOZWVkc1R5cGVBcmd1bWVudHModHlwZS5lbGVtZW50KSkgewogICAgICAgIEZ1bmN0aW9uRW50aXR5IGhlbHBlciA9IF9jb21tb25FbGVtZW50cy5zZXRSdW50aW1lVHlwZUluZm87CiAgICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN0YXRpY0ludm9rZSgKICAgICAgICAgICAgaGVscGVyLCBoZWxwZXIucGFyYW1ldGVyU3RydWN0dXJlLmNhbGxTdHJ1Y3R1cmUpKTsKICAgICAgfQogICAgICBpZiAodHlwZS5lbGVtZW50ID09IF9jb21tb25FbGVtZW50cy50eXBlTGl0ZXJhbENsYXNzKSB7CiAgICAgICAgLy8gSWYgd2UgdXNlIGEgdHlwZSBsaXRlcmFsIGluIGEgY29uc3RhbnQsIHRoZSBjb21waWxlIHRpbWUKICAgICAgICAvLyBjb25zdGFudCBlbWl0dGVyIHdpbGwgZ2VuZXJhdGUgYSBjYWxsIHRvIHRoZSBjcmVhdGVSdW50aW1lVHlwZQogICAgICAgIC8vIGhlbHBlciBzbyB3ZSByZWdpc3RlciBhIHVzZSBvZiB0aGF0LgogICAgICAgIEZ1bmN0aW9uRW50aXR5IGhlbHBlciA9IF9jb21tb25FbGVtZW50cy5jcmVhdGVSdW50aW1lVHlwZTsKICAgICAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3RhdGljSW52b2tlKAogICAgICAgICAgICBoZWxwZXIsIGhlbHBlci5wYXJhbWV0ZXJTdHJ1Y3R1cmUuY2FsbFN0cnVjdHVyZSkpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBXb3JsZEltcGFjdCByZWdpc3RlclVzZWRDb25zdGFudChDb25zdGFudFZhbHVlIGNvbnN0YW50KSB7CiAgICBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsIGltcGFjdEJ1aWxkZXIgPSBuZXcgV29ybGRJbXBhY3RCdWlsZGVySW1wbCgpOwogICAgX2NvbXB1dGVJbXBhY3RGb3JDb21waWxlVGltZUNvbnN0YW50KGNvbnN0YW50LCBpbXBhY3RCdWlsZGVyKTsKICAgIHJldHVybiBpbXBhY3RCdWlsZGVyOwogIH0KCiAgQG92ZXJyaWRlCiAgV29ybGRJbXBhY3QgcmVnaXN0ZXJVc2VkRWxlbWVudChNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsIHdvcmxkSW1wYWN0ID0gbmV3IFdvcmxkSW1wYWN0QnVpbGRlckltcGwoKTsKICAgIF9jdXN0b21FbGVtZW50c0FuYWx5c2lzLnJlZ2lzdGVyU3RhdGljVXNlKG1lbWJlcik7CgogICAgaWYgKG1lbWJlci5pc0Z1bmN0aW9uICYmIG1lbWJlci5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgIENsYXNzRW50aXR5IGNscyA9IG1lbWJlci5lbmNsb3NpbmdDbGFzczsKICAgICAgaWYgKG1lbWJlci5uYW1lID09IElkZW50aWZpZXJzLmNhbGwgJiYKICAgICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuaXNHZW5lcmljQ2xhc3MoY2xzKSAmJgogICAgICAgICAgX3J0aU5lZWQubWV0aG9kTmVlZHNTaWduYXR1cmUobWVtYmVyKSkgewogICAgICAgIHdvcmxkSW1wYWN0LmFkZEltcGFjdChfcmVnaXN0ZXJDb21wdXRlU2lnbmF0dXJlKCkpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHdvcmxkSW1wYWN0OwogIH0KCiAgV29ybGRJbXBhY3QgX3Byb2Nlc3NDbGFzcyhDbGFzc0VudGl0eSBjbHMpIHsKICAgIFdvcmxkSW1wYWN0QnVpbGRlckltcGwgaW1wYWN0QnVpbGRlciA9IG5ldyBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsKCk7CiAgICBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5jbG9zdXJlQ2xhc3MpIHsKICAgICAgX2ltcGFjdHMuY2xvc3VyZUNsYXNzLnJlZ2lzdGVySW1wYWN0KGltcGFjdEJ1aWxkZXIsIF9lbGVtZW50RW52aXJvbm1lbnQpOwogICAgfQoKICAgIHZvaWQgcmVnaXN0ZXJJbnN0YW50aWF0aW9uKENsYXNzRW50aXR5IGNscykgewogICAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyVHlwZVVzZSgKICAgICAgICAgIG5ldyBUeXBlVXNlLmluc3RhbnRpYXRpb24oX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRSYXdUeXBlKGNscykpKTsKICAgIH0KCiAgICBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5zdHJpbmdDbGFzcyB8fAogICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNTdHJpbmdDbGFzcykgewogICAgICByZWdpc3Rlckluc3RhbnRpYXRpb24oX2NvbW1vbkVsZW1lbnRzLmpzU3RyaW5nQ2xhc3MpOwogICAgfSBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmxpc3RDbGFzcyB8fAogICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNBcnJheUNsYXNzIHx8CiAgICAgICAgY2xzID09IF9jb21tb25FbGVtZW50cy5qc0ZpeGVkQXJyYXlDbGFzcyB8fAogICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNFeHRlbmRhYmxlQXJyYXlDbGFzcyB8fAogICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNVbm1vZGlmaWFibGVBcnJheUNsYXNzKSB7CiAgICAgIHJlZ2lzdGVySW5zdGFudGlhdGlvbihfY29tbW9uRWxlbWVudHMuanNBcnJheUNsYXNzKTsKICAgICAgcmVnaXN0ZXJJbnN0YW50aWF0aW9uKF9jb21tb25FbGVtZW50cy5qc011dGFibGVBcnJheUNsYXNzKTsKICAgICAgcmVnaXN0ZXJJbnN0YW50aWF0aW9uKF9jb21tb25FbGVtZW50cy5qc0ZpeGVkQXJyYXlDbGFzcyk7CiAgICAgIHJlZ2lzdGVySW5zdGFudGlhdGlvbihfY29tbW9uRWxlbWVudHMuanNFeHRlbmRhYmxlQXJyYXlDbGFzcyk7CiAgICAgIHJlZ2lzdGVySW5zdGFudGlhdGlvbihfY29tbW9uRWxlbWVudHMuanNVbm1vZGlmaWFibGVBcnJheUNsYXNzKTsKICAgIH0gZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5pbnRDbGFzcyB8fAogICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNJbnRDbGFzcykgewogICAgICByZWdpc3Rlckluc3RhbnRpYXRpb24oX2NvbW1vbkVsZW1lbnRzLmpzSW50Q2xhc3MpOwogICAgICByZWdpc3Rlckluc3RhbnRpYXRpb24oX2NvbW1vbkVsZW1lbnRzLmpzUG9zaXRpdmVJbnRDbGFzcyk7CiAgICAgIHJlZ2lzdGVySW5zdGFudGlhdGlvbihfY29tbW9uRWxlbWVudHMuanNVSW50MzJDbGFzcyk7CiAgICAgIHJlZ2lzdGVySW5zdGFudGlhdGlvbihfY29tbW9uRWxlbWVudHMuanNVSW50MzFDbGFzcyk7CiAgICAgIHJlZ2lzdGVySW5zdGFudGlhdGlvbihfY29tbW9uRWxlbWVudHMuanNOdW1iZXJDbGFzcyk7CiAgICB9IGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuZG91YmxlQ2xhc3MgfHwKICAgICAgICBjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzRG91YmxlQ2xhc3MpIHsKICAgICAgcmVnaXN0ZXJJbnN0YW50aWF0aW9uKF9jb21tb25FbGVtZW50cy5qc0RvdWJsZUNsYXNzKTsKICAgICAgcmVnaXN0ZXJJbnN0YW50aWF0aW9uKF9jb21tb25FbGVtZW50cy5qc051bWJlckNsYXNzKTsKICAgIH0gZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5ib29sQ2xhc3MgfHwKICAgICAgICBjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzQm9vbENsYXNzKSB7CiAgICAgIHJlZ2lzdGVySW5zdGFudGlhdGlvbihfY29tbW9uRWxlbWVudHMuanNCb29sQ2xhc3MpOwogICAgfSBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLm51bGxDbGFzcyB8fAogICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNOdWxsQ2xhc3MpIHsKICAgICAgcmVnaXN0ZXJJbnN0YW50aWF0aW9uKF9jb21tb25FbGVtZW50cy5qc051bGxDbGFzcyk7CiAgICB9IGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMubnVtQ2xhc3MgfHwKICAgICAgICBjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzTnVtYmVyQ2xhc3MpIHsKICAgICAgcmVnaXN0ZXJJbnN0YW50aWF0aW9uKF9jb21tb25FbGVtZW50cy5qc0ludENsYXNzKTsKICAgICAgcmVnaXN0ZXJJbnN0YW50aWF0aW9uKF9jb21tb25FbGVtZW50cy5qc1Bvc2l0aXZlSW50Q2xhc3MpOwogICAgICByZWdpc3Rlckluc3RhbnRpYXRpb24oX2NvbW1vbkVsZW1lbnRzLmpzVUludDMyQ2xhc3MpOwogICAgICByZWdpc3Rlckluc3RhbnRpYXRpb24oX2NvbW1vbkVsZW1lbnRzLmpzVUludDMxQ2xhc3MpOwogICAgICByZWdpc3Rlckluc3RhbnRpYXRpb24oX2NvbW1vbkVsZW1lbnRzLmpzRG91YmxlQ2xhc3MpOwogICAgICByZWdpc3Rlckluc3RhbnRpYXRpb24oX2NvbW1vbkVsZW1lbnRzLmpzTnVtYmVyQ2xhc3MpOwogICAgfSBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzSmF2YVNjcmlwdE9iamVjdENsYXNzKSB7CiAgICAgIHJlZ2lzdGVySW5zdGFudGlhdGlvbihfY29tbW9uRWxlbWVudHMuanNKYXZhU2NyaXB0T2JqZWN0Q2xhc3MpOwogICAgfSBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzUGxhaW5KYXZhU2NyaXB0T2JqZWN0Q2xhc3MpIHsKICAgICAgcmVnaXN0ZXJJbnN0YW50aWF0aW9uKF9jb21tb25FbGVtZW50cy5qc1BsYWluSmF2YVNjcmlwdE9iamVjdENsYXNzKTsKICAgIH0gZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5qc1Vua25vd25KYXZhU2NyaXB0T2JqZWN0Q2xhc3MpIHsKICAgICAgcmVnaXN0ZXJJbnN0YW50aWF0aW9uKF9jb21tb25FbGVtZW50cy5qc1Vua25vd25KYXZhU2NyaXB0T2JqZWN0Q2xhc3MpOwogICAgfSBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzSmF2YVNjcmlwdEZ1bmN0aW9uQ2xhc3MpIHsKICAgICAgcmVnaXN0ZXJJbnN0YW50aWF0aW9uKF9jb21tb25FbGVtZW50cy5qc0phdmFTY3JpcHRGdW5jdGlvbkNsYXNzKTsKICAgIH0gZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5qc0luZGV4aW5nQmVoYXZpb3JJbnRlcmZhY2UpIHsKICAgICAgX2ltcGFjdHMuanNJbmRleGluZ0JlaGF2aW9yCiAgICAgICAgICAucmVnaXN0ZXJJbXBhY3QoaW1wYWN0QnVpbGRlciwgX2VsZW1lbnRFbnZpcm9ubWVudCk7CiAgICB9CgogICAgX2N1c3RvbUVsZW1lbnRzQW5hbHlzaXMucmVnaXN0ZXJJbnN0YW50aWF0ZWRDbGFzcyhjbHMpOwogICAgcmV0dXJuIGltcGFjdEJ1aWxkZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBXb3JsZEltcGFjdCByZWdpc3RlckltcGxlbWVudGVkQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gX3Byb2Nlc3NDbGFzcyhjbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgV29ybGRJbXBhY3QgcmVnaXN0ZXJJbnN0YW50aWF0ZWRDbGFzcyhDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBfcHJvY2Vzc0NsYXNzKGNscyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGxvZ1N1bW1hcnkodm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpKSB7CiAgICBfbmF0aXZlRW5xdWV1ZXIubG9nU3VtbWFyeShsb2cpOwogIH0KfQqBKQBOTjwBLQEwSiMkITohPTcnQh4dKB0BOTAoIQEkIwE/AS8BJAEbIBwVGhUkHQEMQUkSTkZQPAYaBAEMLkUEASxIBAEMNDkXMAYEAU0+Rk8rITwkQgYiSBcEAQwUT0sePAYEAQxOTi0HUBc7AUQcSyIGAS4BEQQBDBoBOC1CSwFDRwYEATVCN0QBHzEUTSlJNykxQCIUUVAzKTI+Twg5RD86SEI7JEJBIwYEATI5IUY8REQ/CD5ESjBDRD8IBgQBDD1JQxoEAQw5RzcBOC8tNTM8CAYBGAQBL0kvUAYBMiVLBgEuMDwzLzQ5OztCQEVHMi05QTw8PDUwPDwzLjozLjoyMDlBPDw8PEFGRktITUNIRSI/BgE8GgQBDDofBAEMOx8EAQwuJQQCATVwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL2NvZGVnZW5fbGlzdGVuZXIuZGFydElzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL2NvbnN0YW50X2hhbmRsZXJfamF2YXNjcmlwdC5kYXJ0hwEvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9jb21waWxlX3RpbWVfY29uc3RhbnRzLmRhcnQnOwppbXBvcnQgJy4uL2NvbXBpbGVyLmRhcnQnIHNob3cgQ29tcGlsZXI7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CgovLy8gW0NvbnN0YW50Q29tcGlsZXJUYXNrXSBmb3IgY29tcGlsYXRpb24gb2YgY29uc3RhbnRzIGZvciB0aGUgSmF2YVNjcmlwdAovLy8gYmFja2VuZC4KLy8vCi8vLyBTaW5jZSB0aGlzIHRhc2sgbmVlZHMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBmcm9udGVuZCBhbmQgYmFja2VuZCBjb25zdGFudHMKLy8vIHRoZSBhY3R1YWwgY29tcGlsYXRpb24gb2YgdGhlIGNvbnN0YW50cyBpcyBmb3J3YXJkZWQgdG8gYQovLy8gW0RhcnRDb25zdGFudENvbXBpbGVyXSBmb3IgdGhlIGZyb250ZW5kIGludGVycHJldGF0aW9uIG9mIHRoZSBjb25zdGFudHMgYW5kCi8vLyB0byBhIFtKYXZhU2NyaXB0Q29uc3RhbnRDb21waWxlcl0gZm9yIHRoZSBiYWNrZW5kIGludGVycHJldGF0aW9uLgpjbGFzcyBKYXZhU2NyaXB0Q29uc3RhbnRUYXNrIGV4dGVuZHMgQ29uc3RhbnRDb21waWxlclRhc2sgewogIEphdmFTY3JpcHRDb25zdGFudENvbXBpbGVyIGpzQ29uc3RhbnRDb21waWxlcjsKCiAgSmF2YVNjcmlwdENvbnN0YW50VGFzayhDb21waWxlciBjb21waWxlcikKICAgICAgOiB0aGlzLmpzQ29uc3RhbnRDb21waWxlciA9IG5ldyBKYXZhU2NyaXB0Q29uc3RhbnRDb21waWxlcigpLAogICAgICAgIHN1cGVyKGNvbXBpbGVyLm1lYXN1cmVyKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+ICdDb25zdGFudEhhbmRsZXInOwp9CgovLy8gVGhlIFtKYXZhU2NyaXB0Q29uc3RhbnRDb21waWxlcl0gaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGNvbXBpbGUtdGltZQovLy8gY29uc3RhbnRzLCBpbml0aWFsaXphdGlvbnMgb2YgZ2xvYmFsIGFuZCBzdGF0aWMgZmllbGRzLCBhbmQgZGVmYXVsdCB2YWx1ZXMKLy8vIG9mIG9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHRoZSBKYXZhU2NyaXB0IGludGVycHJldGF0aW9uIG9mIGNvbnN0YW50cy4KY2xhc3MgSmF2YVNjcmlwdENvbnN0YW50Q29tcGlsZXIgaW1wbGVtZW50cyBCYWNrZW5kQ29uc3RhbnRFbnZpcm9ubWVudCB7CiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTW92ZSB0aGlzIHRvIHRoZSBiYWNrZW5kIGNvbnN0YW50IGhhbmRsZXIuCiAgLy8vIENhY2hlcyB0aGUgc3RhdGljcyB3aGVyZSB0aGUgaW5pdGlhbCB2YWx1ZSBjYW5ub3QgYmUgZWFnZXJseSBjb21waWxlZC4KICBmaW5hbCBTZXQ8RmllbGRFbnRpdHk+IGxhenlTdGF0aWNzID0gbmV3IFNldDxGaWVsZEVudGl0eT4oKTsKCiAgSmF2YVNjcmlwdENvbnN0YW50Q29tcGlsZXIoKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckxhenlTdGF0aWMoRmllbGRFbnRpdHkgZWxlbWVudCkgewogICAgbGF6eVN0YXRpY3MuYWRkKGVsZW1lbnQpOwogIH0KCiAgTGlzdDxGaWVsZEVudGl0eT4gZ2V0TGF6aWx5SW5pdGlhbGl6ZWRGaWVsZHNGb3JFbWlzc2lvbigpIHsKICAgIHJldHVybiBuZXcgTGlzdDxGaWVsZEVudGl0eT4uZnJvbShsYXp5U3RhdGljcyk7CiAgfQp9Ci8ATk48ASkpJAFLDQRQPlBGPDEBLEQiAQwoAgFLT0tJRU0/ASABDDEeBAE+NAQCAUBwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL2NvbnN0YW50X2hhbmRsZXJfamF2YXNjcmlwdC5kYXJ0RnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2JhY2tlbmQvY3VzdG9tX2VsZW1lbnRzX2FuYWx5c2lzLmRhcnSl5i8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JzsKaW1wb3J0ICcuLi9jb25zdGFudHMvY29uc3RhbnRfc3lzdGVtLmRhcnQnIGFzIGNvbnN0YW50X3N5c3RlbTsKaW1wb3J0ICcuLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NhbGxfc3RydWN0dXJlLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3VzZS5kYXJ0JyBzaG93IENvbnN0YW50VXNlLCBTdGF0aWNVc2U7CmltcG9ydCAnLi4vdW5pdmVyc2Uvd29ybGRfaW1wYWN0LmRhcnQnCiAgICBzaG93IFdvcmxkSW1wYWN0LCBTdGFnZWRXb3JsZEltcGFjdEJ1aWxkZXI7CmltcG9ydCAnYmFja2VuZF91c2FnZS5kYXJ0JyBzaG93IEJhY2tlbmRVc2FnZUJ1aWxkZXI7CmltcG9ydCAnbmF0aXZlX2RhdGEuZGFydCc7CgovLy8gU3VwcG9ydCBmb3IgQ3VzdG9tIEVsZW1lbnRzLgovLy8KLy8vIFRoZSBzdXBwb3J0IGZvciBjdXN0b20gZWxlbWVudHMgdGhlIGNvbXBpbGVyIGJ1aWxkcyBhIHRhYmxlIHRoYXQgbWFwcyB0aGUKLy8vIGN1c3RvbSBlbGVtZW50IGNsYXNzJ3MgW1R5cGVdIHRvIHRoZSBpbnRlcmNlcHRvciBmb3IgdGhlIGNsYXNzIGFuZCB0aGUKLy8vIGNvbnN0cnVjdG9yKHMpIGZvciB0aGUgY2xhc3MuCi8vLwovLy8gV2Ugd2FudCB0aGUgdGFibGUgdG8gY29udGFpbiBvbmx5IHRoZSBjdXN0b20gZWxlbWVudCBjbGFzc2VzIHVzZWQsIGFuZCB3ZQovLy8gd2FudCB0byBhdm9pZCByZXNvbHZpbmcgYW5kIGNvbXBpbGluZyBjb25zdHJ1Y3RvcnMgdGhhdCBhcmUgbm90IHVzZWQgc2luY2UKLy8vIHRoYXQgbWF5IGJyaW5nIGluIHVudXNlZCBjb2RlLiAgVGhpcyBjbGFzcyBjb250cm9scyB0aGUgcmVzb2x1dGlvbiBhbmQgY29kZQovLy8gZ2VuZXJhdGlvbiB0byByZXN0cmljdCB0aGUgaW1wYWN0LgovLy8KLy8vIFRoZSBmb2xsb3dpbmcgbGluZSBvZiBjb2RlIHJlcXVpcmVzIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBnZW5lcmF0aXZlCi8vLyBjb25zdHJ1Y3RvciBmYWN0b3J5IGZ1bmN0aW9uKHMpIGZvciBGYW5jeUJ1dHRvbiwgYW5kIHRoZWlyIGluc2VydGlvbiBpbnRvCi8vLyB0aGUgdGFibGU6Ci8vLwovLy8gICAgIGRvY3VtZW50LnJlZ2lzdGVyKEZhbmN5QnV0dG9uLCAneC1mYW5jeS1idXR0b24nKTsKLy8vCi8vLyBXZSBkZXRlY3QgdGhpcyBieSAnam9pbmluZycgdGhlIGNsYXNzZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBhcyB0eXBlIGxpdGVyYWxzCi8vLyB3aXRoIHRoZSBjbGFzc2VzIHRoYXQgYXJlIGN1c3RvbSBlbGVtZW50cywgZW5hYmxlZCBieSBkZXRlY3RpbmcgdGhlIHByZXNlbmNlCi8vLyBvZiB0aGUgdGFibGUgYWNjZXNzIGNvZGUgdXNlZCBieSBkb2N1bWVudC5yZWdpc3Rlci4KLy8vCi8vLyBXZSBoYXZlIHRvIGJlIG1vcmUgY29uc2VydmF0aXZlIHdoZW4gdGhlIHR5cGUgaXMgdW5rbm93biwgZS5nLgovLy8KLy8vICAgICBkb2N1bWVudC5yZWdpc3RlcihjbGFzc01pcnJvci5yZWZsZWN0ZWRUeXBlLCB0YWdGcm9tTWV0YWRhdGEpOwovLy8KLy8vIGFuZAovLy8KLy8vICAgICBjbGFzcyBDb21wb25lbnQ8VD4gewovLy8gICAgICAgZmluYWwgdGFnOwovLy8gICAgICAgQ29tcG9uZW50KHRoaXMudGFnKTsKLy8vICAgICAgIHZvaWQgcmVnaXN0ZXIoKSA9PiBkb2N1bWVudC5yZWdpc3RlcihULCB0YWcpOwovLy8gICAgIH0KLy8vICAgICBjb25zdCBDb21wb25lbnQ8RmFuY3lCdXR0b24+KCd4LWZhbmN5LWJ1dHRvbicpLnJlZ2lzdGVyKCk7Ci8vLwovLy8gSW4gdGhlc2UgY2FzZXMgd2UgY29uc2VydmF0aXZlbHkgZ2VuZXJhdGUgYWxsIHZpYWJsZSBlbnRyaWVzIGluIHRoZSB0YWJsZS4KYWJzdHJhY3QgY2xhc3MgQ3VzdG9tRWxlbWVudHNBbmFseXNpc0Jhc2UgewogIGZpbmFsIE5hdGl2ZUJhc2ljRGF0YSBfbmF0aXZlRGF0YTsKICBmaW5hbCBFbGVtZW50RW52aXJvbm1lbnQgX2VsZW1lbnRFbnZpcm9ubWVudDsKICBmaW5hbCBDb21tb25FbGVtZW50cyBfY29tbW9uRWxlbWVudHM7CgogIEN1c3RvbUVsZW1lbnRzQW5hbHlzaXNCYXNlKAogICAgICB0aGlzLl9lbGVtZW50RW52aXJvbm1lbnQsIHRoaXMuX2NvbW1vbkVsZW1lbnRzLCB0aGlzLl9uYXRpdmVEYXRhKTsKCiAgQ3VzdG9tRWxlbWVudHNBbmFseXNpc0pvaW4gZ2V0IGpvaW47CgogIHZvaWQgcmVnaXN0ZXJJbnN0YW50aWF0ZWRDbGFzcyhDbGFzc0VudGl0eSBjbHMpIHsKICAgIGlmICghX25hdGl2ZURhdGEuaXNOYXRpdmVPckV4dGVuZHNOYXRpdmUoY2xzKSkgcmV0dXJuOwogICAgaWYgKF9lbGVtZW50RW52aXJvbm1lbnQuaXNVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbihjbHMpKSByZXR1cm47CiAgICBpZiAoY2xzLmlzQWJzdHJhY3QpIHJldHVybjsKICAgIC8vIEpzSW50ZXJvcCBjbGFzc2VzIGFyZSBvcGFxdWUgaW50ZXJmYWNlcyB3aXRob3V0IGEgY29uY3JldGUKICAgIC8vIGltcGxlbWVudGF0aW9uLgogICAgaWYgKF9uYXRpdmVEYXRhLmlzSnNJbnRlcm9wQ2xhc3MoY2xzKSkgcmV0dXJuOwogICAgam9pbi5pbnN0YW50aWF0ZWRDbGFzc2VzLmFkZChjbHMpOwogIH0KCiAgdm9pZCByZWdpc3RlclN0YXRpY1VzZShNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgYXNzZXJ0KGVsZW1lbnQgIT0gbnVsbCk7CiAgICBpZiAoX2NvbW1vbkVsZW1lbnRzLmlzRmluZEluZGV4Rm9yTmF0aXZlU3ViY2xhc3NUeXBlKGVsZW1lbnQpKSB7CiAgICAgIGpvaW4uZGVtYW5kZWQgPSB0cnVlOwogICAgfQogIH0KCiAgLy8vIENvbXB1dGVzIHRoZSBbV29ybGRJbXBhY3RdIG9mIHRoZSBjbGFzc2VzIHJlZ2lzdGVyZWQgc2luY2UgbGFzdCBmbHVzaC4KICBXb3JsZEltcGFjdCBmbHVzaCgpID0+IGpvaW4uZmx1c2goKTsKfQoKY2xhc3MgQ3VzdG9tRWxlbWVudHNSZXNvbHV0aW9uQW5hbHlzaXMgZXh0ZW5kcyBDdXN0b21FbGVtZW50c0FuYWx5c2lzQmFzZSB7CiAgQG92ZXJyaWRlCiAgZmluYWwgQ3VzdG9tRWxlbWVudHNBbmFseXNpc0pvaW4gam9pbjsKCiAgQ3VzdG9tRWxlbWVudHNSZXNvbHV0aW9uQW5hbHlzaXMoCiAgICAgIEVsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQsCiAgICAgIENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgICBOYXRpdmVCYXNpY0RhdGEgbmF0aXZlRGF0YSwKICAgICAgQmFja2VuZFVzYWdlQnVpbGRlciBiYWNrZW5kVXNhZ2VCdWlsZGVyKQogICAgICA6IGpvaW4gPSBuZXcgQ3VzdG9tRWxlbWVudHNBbmFseXNpc0pvaW4oCiAgICAgICAgICAgIGVsZW1lbnRFbnZpcm9ubWVudCwgY29tbW9uRWxlbWVudHMsIG5hdGl2ZURhdGEsCiAgICAgICAgICAgIGJhY2tlbmRVc2FnZUJ1aWxkZXI6IGJhY2tlbmRVc2FnZUJ1aWxkZXIpLAogICAgICAgIHN1cGVyKGVsZW1lbnRFbnZpcm9ubWVudCwgY29tbW9uRWxlbWVudHMsIG5hdGl2ZURhdGEpIHsKICAgIC8vIFRPRE8oc3JhKTogUmVtb3ZlIHRoaXMgd29yay1hcm91bmQuICBXZSBzaG91bGQgbWFyayBhbGxDbGFzc2VzU2VsZWN0ZWQgaW4KICAgIC8vIGJvdGggam9pbnMgb25seSB3aGVuIHdlIHNlZSBhIGNvbnN0cnVjdCBnZW5lcmF0aW5nIGFuIHVua25vd24gW1R5cGVdIGJ1dAogICAgLy8gd2UgY2FuJ3QgY3VycmVudGx5IHJlY29nbml6ZSBhbGwgY2FzZXMuICBJbiBwYXJ0aWN1bGFyLCB0aGUgd29yay1hcm91bmQKICAgIC8vIGZvciB0aGUgdW5pbXBsZW1lbnRlZCBgQ2xhc3NNaXJyb3IucmVmbGVjdGVkVHlwZWAgaXMgbm90IHJlY29nbml6YWJsZS4KICAgIC8vIFRPRE8oMTI2MDcpOiBNYXRjaCBvbiBbQ2xhc3NNaXJyb3IucmVmbGVjdGVkVHlwZV0KICAgIGpvaW4uYWxsQ2xhc3Nlc1NlbGVjdGVkID0gdHJ1ZTsKICB9CgogIHZvaWQgcmVnaXN0ZXJUeXBlTGl0ZXJhbChEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZS5pc0ludGVyZmFjZVR5cGUpIHsKICAgICAgLy8gVE9ETyhzcmEpOiBJZiB3ZSBoYWQgYSBmbG93IHF1ZXJ5IGZyb20gdGhlIHR5cGUgbGl0ZXJhbCBleHByZXNzaW9uIHRvCiAgICAgIC8vIHRoZSBUeXBlIGFyZ3VtZW50IG9mIHRoZSBtZXRhZGF0YSBsb29rdXAsIHdlIGNvdWxkIHRlbGwgaWYgdGhpcyB0eXBlCiAgICAgIC8vIGxpdGVyYWwgaXMgcmVhbGx5IGEgZGVtYW5kIGZvciB0aGUgbWV0YWRhdGEuCiAgICAgIEludGVyZmFjZVR5cGUgaW50ZXJmYWNlVHlwZSA9IHR5cGU7CiAgICAgIGpvaW4uc2VsZWN0ZWRDbGFzc2VzLmFkZChpbnRlcmZhY2VUeXBlLmVsZW1lbnQpOwogICAgfSBlbHNlIGlmICh0eXBlLmlzVHlwZVZhcmlhYmxlKSB7CiAgICAgIC8vIFRoaXMgaXMgYSB0eXBlIHBhcmFtZXRlciBvZiBhIHBhcmFtZXRlcml6ZWQgY2xhc3MuCiAgICAgIC8vIFRPRE8oc3JhKTogSXMgdGhlcmUgYSB3YXkgdG8gZGV0ZXJtaW5lIHdoaWNoIHR5cGVzIGFyZSBib3VuZCB0byB0aGUKICAgICAgLy8gcGFyYW1ldGVyPwogICAgICBqb2luLmFsbENsYXNzZXNTZWxlY3RlZCA9IHRydWU7CiAgICB9CiAgfQp9CgpjbGFzcyBDdXN0b21FbGVtZW50c0NvZGVnZW5BbmFseXNpcyBleHRlbmRzIEN1c3RvbUVsZW1lbnRzQW5hbHlzaXNCYXNlIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBDdXN0b21FbGVtZW50c0FuYWx5c2lzSm9pbiBqb2luOwoKICBDdXN0b21FbGVtZW50c0NvZGVnZW5BbmFseXNpcyhDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgICAgRWxlbWVudEVudmlyb25tZW50IGVsZW1lbnRFbnZpcm9ubWVudCwgTmF0aXZlQmFzaWNEYXRhIG5hdGl2ZURhdGEpCiAgICAgIDogam9pbiA9IG5ldyBDdXN0b21FbGVtZW50c0FuYWx5c2lzSm9pbigKICAgICAgICAgICAgZWxlbWVudEVudmlyb25tZW50LCBjb21tb25FbGVtZW50cywgbmF0aXZlRGF0YSksCiAgICAgICAgc3VwZXIoZWxlbWVudEVudmlyb25tZW50LCBjb21tb25FbGVtZW50cywgbmF0aXZlRGF0YSkgewogICAgLy8gVE9ETyhzcmEpOiBSZW1vdmUgdGhpcyB3b3JrLWFyb3VuZC4gIFdlIHNob3VsZCBtYXJrIGFsbENsYXNzZXNTZWxlY3RlZCBpbgogICAgLy8gYm90aCBqb2lucyBvbmx5IHdoZW4gd2Ugc2VlIGEgY29uc3RydWN0IGdlbmVyYXRpbmcgYW4gdW5rbm93biBbVHlwZV0gYnV0CiAgICAvLyB3ZSBjYW4ndCBjdXJyZW50bHkgcmVjb2duaXplIGFsbCBjYXNlcy4gIEluIHBhcnRpY3VsYXIsIHRoZSB3b3JrLWFyb3VuZAogICAgLy8gZm9yIHRoZSB1bmltcGxlbWVudGVkIGBDbGFzc01pcnJvci5yZWZsZWN0ZWRUeXBlYCBpcyBub3QgcmVjb2duaXphYmxlLgogICAgLy8gVE9ETygxMjYwNyk6IE1hdGNoIG9uIFtDbGFzc01pcnJvci5yZWZsZWN0ZWRUeXBlXQogICAgam9pbi5hbGxDbGFzc2VzU2VsZWN0ZWQgPSB0cnVlOwogIH0KCiAgdm9pZCByZWdpc3RlclR5cGVDb25zdGFudChDbGFzc0VudGl0eSBjbHMpIHsKICAgIGpvaW4uc2VsZWN0ZWRDbGFzc2VzLmFkZChjbHMpOwogIH0KCiAgYm9vbCBnZXQgbmVlZHNUYWJsZSA9PiBqb2luLmRlbWFuZGVkOwoKICBib29sIG5lZWRzQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKSA9PiBqb2luLmFjdGl2ZUNsYXNzZXMuY29udGFpbnMoY2xzKTsKCiAgTGlzdDxDb25zdHJ1Y3RvckVudGl0eT4gY29uc3RydWN0b3JzKENsYXNzRW50aXR5IGNscykgPT4KICAgICAgam9pbi5jb21wdXRlRXNjYXBpbmdDb25zdHJ1Y3RvcnMoY2xzKTsKfQoKY2xhc3MgQ3VzdG9tRWxlbWVudHNBbmFseXNpc0pvaW4gewogIGZpbmFsIEVsZW1lbnRFbnZpcm9ubWVudCBfZWxlbWVudEVudmlyb25tZW50OwogIGZpbmFsIENvbW1vbkVsZW1lbnRzIF9jb21tb25FbGVtZW50czsKICBmaW5hbCBOYXRpdmVCYXNpY0RhdGEgX25hdGl2ZURhdGE7CiAgZmluYWwgQmFja2VuZFVzYWdlQnVpbGRlciBfYmFja2VuZFVzYWdlQnVpbGRlcjsKCiAgZmluYWwgYm9vbCBmb3JSZXNvbHV0aW9uOwoKICBmaW5hbCBTdGFnZWRXb3JsZEltcGFjdEJ1aWxkZXIgaW1wYWN0QnVpbGRlciA9IG5ldyBTdGFnZWRXb3JsZEltcGFjdEJ1aWxkZXIoKTsKCiAgLy8gQ2xhc3NlcyB0aGF0IGFyZSBjYW5kaWRhdGVzIGZvciBuZWVkaW5nIGNvbnN0cnVjdG9ycy4gIENsYXNzZXMgYXJlIG1vdmVkIHRvCiAgLy8gW2FjdGl2ZUNsYXNzZXNdIHdoZW4gd2Uga25vdyB0aGV5IG5lZWQgY29uc3RydWN0b3JzLgogIGZpbmFsIFNldDxDbGFzc0VudGl0eT4gaW5zdGFudGlhdGVkQ2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CgogIC8vIENsYXNzZXMgZXhwbGljaXRseSBuYW1lZC4KICBmaW5hbCBTZXQ8Q2xhc3NFbnRpdHk+IHNlbGVjdGVkQ2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CgogIC8vIFRydWUgaWYgd2UgbXVzdCBjb25zZXJ2YXRpdmVseSBpbmNsdWRlIGFsbCBleHRlbnNpb24gY2xhc3Nlcy4KICBib29sIGFsbENsYXNzZXNTZWxlY3RlZCA9IGZhbHNlOwoKICAvLyBEaWQgd2Ugc2VlIGEgZGVtYW5kIGZvciB0aGUgZGF0YT8KICBib29sIGRlbWFuZGVkID0gZmFsc2U7CgogIC8vIENsYXNzZXNPdXRwdXQ6IGNsYXNzZXMgcmVxdWlyaW5nIG1ldGFkYXRhLgogIGZpbmFsIFNldDxDbGFzc0VudGl0eT4gYWN0aXZlQ2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CgogIEN1c3RvbUVsZW1lbnRzQW5hbHlzaXNKb2luKAogICAgICB0aGlzLl9lbGVtZW50RW52aXJvbm1lbnQsIHRoaXMuX2NvbW1vbkVsZW1lbnRzLCB0aGlzLl9uYXRpdmVEYXRhLAogICAgICB7QmFja2VuZFVzYWdlQnVpbGRlciBiYWNrZW5kVXNhZ2VCdWlsZGVyfSkKICAgICAgOiB0aGlzLl9iYWNrZW5kVXNhZ2VCdWlsZGVyID0gYmFja2VuZFVzYWdlQnVpbGRlciwKICAgICAgICB0aGlzLmZvclJlc29sdXRpb24gPSBiYWNrZW5kVXNhZ2VCdWlsZGVyICE9IG51bGw7CgogIFdvcmxkSW1wYWN0IGZsdXNoKCkgewogICAgaWYgKCFkZW1hbmRlZCkgcmV0dXJuIGNvbnN0IFdvcmxkSW1wYWN0KCk7CiAgICB2YXIgbmV3QWN0aXZlQ2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CiAgICBmb3IgKENsYXNzRW50aXR5IGNscyBpbiBpbnN0YW50aWF0ZWRDbGFzc2VzKSB7CiAgICAgIGJvb2wgaXNOYXRpdmUgPSBfbmF0aXZlRGF0YS5pc05hdGl2ZUNsYXNzKGNscyk7CiAgICAgIGJvb2wgaXNFeHRlbnNpb24gPSAhaXNOYXRpdmUgJiYgX25hdGl2ZURhdGEuaXNOYXRpdmVPckV4dGVuZHNOYXRpdmUoY2xzKTsKICAgICAgLy8gR2VuZXJhdGUgdGFibGUgZW50cmllcyBmb3IgbmF0aXZlIGNsYXNzZXMgdGhhdCBhcmUgZXhwbGljaXRseSBuYW1lZCBhbmQKICAgICAgLy8gZXh0ZW5zaW9ucyB0aGF0IGZpeCBvdXIgY3JpdGVyaWEuCiAgICAgIGlmICgoaXNOYXRpdmUgJiYgc2VsZWN0ZWRDbGFzc2VzLmNvbnRhaW5zKGNscykpIHx8CiAgICAgICAgICAoaXNFeHRlbnNpb24gJiYKICAgICAgICAgICAgICAoYWxsQ2xhc3Nlc1NlbGVjdGVkIHx8IHNlbGVjdGVkQ2xhc3Nlcy5jb250YWlucyhjbHMpKSkpIHsKICAgICAgICBuZXdBY3RpdmVDbGFzc2VzLmFkZChjbHMpOwogICAgICAgIEl0ZXJhYmxlPENvbnN0cnVjdG9yRW50aXR5PiBlc2NhcGluZ0NvbnN0cnVjdG9ycyA9CiAgICAgICAgICAgIGNvbXB1dGVFc2NhcGluZ0NvbnN0cnVjdG9ycyhjbHMpOwogICAgICAgIGZvciAoQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IgaW4gZXNjYXBpbmdDb25zdHJ1Y3RvcnMpIHsKICAgICAgICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5jb25zdHJ1Y3Rvckludm9rZSgKICAgICAgICAgICAgICBjb25zdHJ1Y3RvciwgQ2FsbFN0cnVjdHVyZS5OT19BUkdTKSk7CiAgICAgICAgfQogICAgICAgIGlmIChmb3JSZXNvbHV0aW9uKSB7CiAgICAgICAgICBlc2NhcGluZ0NvbnN0cnVjdG9ycwogICAgICAgICAgICAgIC5mb3JFYWNoKF9iYWNrZW5kVXNhZ2VCdWlsZGVyLnJlZ2lzdGVyR2xvYmFsRnVuY3Rpb25EZXBlbmRlbmN5KTsKICAgICAgICB9CiAgICAgICAgLy8gRm9yY2UgdGhlIGdlbmVyYXRpb24gb2YgdGhlIHR5cGUgY29uc3RhbnQgdGhhdCBpcyB0aGUga2V5IHRvIGFuIGVudHJ5CiAgICAgICAgLy8gaW4gdGhlIGdlbmVyYXRlZCB0YWJsZS4KICAgICAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50ID0gX21ha2VUeXBlQ29uc3RhbnQoY2xzKTsKICAgICAgICBpbXBhY3RCdWlsZGVyCiAgICAgICAgICAgIC5yZWdpc3RlckNvbnN0YW50VXNlKG5ldyBDb25zdGFudFVzZS5jdXN0b21FbGVtZW50cyhjb25zdGFudCkpOwogICAgICB9CiAgICB9CiAgICBhY3RpdmVDbGFzc2VzLmFkZEFsbChuZXdBY3RpdmVDbGFzc2VzKTsKICAgIGluc3RhbnRpYXRlZENsYXNzZXMucmVtb3ZlQWxsKG5ld0FjdGl2ZUNsYXNzZXMpOwogICAgcmV0dXJuIGltcGFjdEJ1aWxkZXIuZmx1c2goKTsKICB9CgogIFR5cGVDb25zdGFudFZhbHVlIF9tYWtlVHlwZUNvbnN0YW50KENsYXNzRW50aXR5IGNscykgewogICAgRGFydFR5cGUgdHlwZSA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0UmF3VHlwZShjbHMpOwogICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5jcmVhdGVUeXBlKF9jb21tb25FbGVtZW50cywgdHlwZSk7CiAgfQoKICBMaXN0PENvbnN0cnVjdG9yRW50aXR5PiBjb21wdXRlRXNjYXBpbmdDb25zdHJ1Y3RvcnMoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICBMaXN0PENvbnN0cnVjdG9yRW50aXR5PiByZXN1bHQgPSA8Q29uc3RydWN0b3JFbnRpdHk+W107CiAgICAvLyBPbmx5IGNsYXNzZXMgdGhhdCBleHRlbmQgbmF0aXZlIGNsYXNzZXMgaGF2ZSBjb25zdHJ1Y3RvcnMgaW4gdGhlIHRhYmxlLgogICAgLy8gV2UgY291bGQgcmVmaW5lIHRoaXMgdG8gY2xhc3NlcyB0aGF0IGV4dGVuZCBFbGVtZW50LCBidXQgdGhhdCB3b3VsZCBicmVhawogICAgLy8gdGhlIHRlc3RzIGFuZCB0aGVyZSBpcyBubyBzYW5lIHJlYXNvbiB0byBzdWJjbGFzcyBvdGhlciBuYXRpdmUgY2xhc3Nlcy4KICAgIGlmIChfbmF0aXZlRGF0YS5pc05hdGl2ZUNsYXNzKGNscykpIHJldHVybiByZXN1bHQ7CgogICAgX2VsZW1lbnRFbnZpcm9ubWVudC5mb3JFYWNoQ29uc3RydWN0b3IoY2xzLAogICAgICAgIChDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvcikgewogICAgICBpZiAoY29uc3RydWN0b3IuaXNHZW5lcmF0aXZlQ29uc3RydWN0b3IpIHsKICAgICAgICAvLyBFbnN1cmUgdGhhdCBwYXJhbWV0ZXIgc3RydWN0dXJlIGhhcyBiZWVuIGNvbXB1dGVkIGJ5IHF1ZXJ5aW5nIHRoZQogICAgICAgIC8vIGZ1bmN0aW9uIHR5cGUuCiAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRGdW5jdGlvblR5cGUoY29uc3RydWN0b3IpOwogICAgICAgIC8vIElnbm9yZSBjb25zdHJ1Y3RvcnMgdGhhdCBjYW5ub3QgYmUgY2FsbGVkIHdpdGggemVybyBhcmd1bWVudHMuCiAgICAgICAgaWYgKGNvbnN0cnVjdG9yLnBhcmFtZXRlclN0cnVjdHVyZS5yZXF1aXJlZFBhcmFtZXRlcnMgPT0gMCkgewogICAgICAgICAgcmVzdWx0LmFkZChjb25zdHJ1Y3Rvcik7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CoDzAE5OPAEiPyMkISo7JzA2GwEhBE5LIgROT1AnBElODwQ6BFFROARDBEcECAQdFR84CkMETywlMCgBHkkBJwE0O0QgQhczJwQBMR1FHAYEAU0nAgFMDCkBJC0lIi8vPDdAUVBPTjkkBAEsIE9ONio3JjxNFCYGBAIBSQwpAT9JLz1AUVBPTjkkBAEvIwQBKAFIATstAgEjMCglMgEcAVEBUTpHAR9DAUMjAScZATBBAR5IMTk6ARgvMzM2UFErORpIIzsuRks0Ch0fTwpRIzkWTAgGLDUiBAE5OT4EAUk8T1FPNwEwKjFNGjpKRiMKCAgTBAIBPXBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvY3VzdG9tX2VsZW1lbnRzX2FuYWx5c2lzLmRhcnRAc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfYmFja2VuZC9pbXBhY3RfdHJhbnNmb3JtZXIuZGFydL8qLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkganNfYmFja2VuZC5iYWNrZW5kLmltcGFjdF90cmFuc2Zvcm1lcjsKCmltcG9ydCAnLi4vdW5pdmVyc2UvY2xhc3NfaGllcmFyY2h5LmRhcnQnIHNob3cgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyOwoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbi9iYWNrZW5kX2FwaS5kYXJ0JyBzaG93IEltcGFjdFRyYW5zZm9ybWVyOwppbXBvcnQgJy4uL2NvbW1vbi9jb2RlZ2VuLmRhcnQnIHNob3cgQ29kZWdlbkltcGFjdDsKaW1wb3J0ICcuLi9jb21tb24vcmVzb2x1dGlvbi5kYXJ0JyBzaG93IFJlc29sdXRpb25JbXBhY3Q7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgRWxlbWVudEVudmlyb25tZW50OwppbXBvcnQgJy4uL2NvbnN0YW50cy9leHByZXNzaW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9uYXRpdmUvZW5xdWV1ZS5kYXJ0JzsKaW1wb3J0ICcuLi9uYXRpdmUvYmVoYXZpb3IuZGFydCc7CmltcG9ydCAnLi4vb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9mZWF0dXJlLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3VzZS5kYXJ0JwogICAgc2hvdyBTdGF0aWNVc2UsIFN0YXRpY1VzZUtpbmQsIFR5cGVVc2UsIFR5cGVVc2VLaW5kOwppbXBvcnQgJy4uL3VuaXZlcnNlL3dvcmxkX2ltcGFjdC5kYXJ0JyBzaG93IFRyYW5zZm9ybWVkV29ybGRJbXBhY3QsIFdvcmxkSW1wYWN0OwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JzsKaW1wb3J0ICdiYWNrZW5kX2ltcGFjdC5kYXJ0JzsKaW1wb3J0ICdiYWNrZW5kX3VzYWdlLmRhcnQnOwppbXBvcnQgJ2N1c3RvbV9lbGVtZW50c19hbmFseXNpcy5kYXJ0JzsKaW1wb3J0ICdpbnRlcmNlcHRvcl9kYXRhLmRhcnQnOwppbXBvcnQgJ25hbWVyLmRhcnQnOwppbXBvcnQgJ25hdGl2ZV9kYXRhLmRhcnQnOwppbXBvcnQgJ3J1bnRpbWVfdHlwZXMuZGFydCc7CgpjbGFzcyBKYXZhU2NyaXB0SW1wYWN0VHJhbnNmb3JtZXIgZXh0ZW5kcyBJbXBhY3RUcmFuc2Zvcm1lciB7CiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwogIGZpbmFsIEVsZW1lbnRFbnZpcm9ubWVudCBfZWxlbWVudEVudmlyb25tZW50OwogIGZpbmFsIENvbW1vbkVsZW1lbnRzIF9jb21tb25FbGVtZW50czsKICBmaW5hbCBCYWNrZW5kSW1wYWN0cyBfaW1wYWN0czsKICBmaW5hbCBOYXRpdmVCYXNpY0RhdGEgX25hdGl2ZUJhc2ljRGF0YTsKICBmaW5hbCBOYXRpdmVSZXNvbHV0aW9uRW5xdWV1ZXIgX25hdGl2ZVJlc29sdXRpb25FbnF1ZXVlcjsKICBmaW5hbCBCYWNrZW5kVXNhZ2VCdWlsZGVyIF9iYWNrZW5kVXNhZ2VCdWlsZGVyOwogIGZpbmFsIEN1c3RvbUVsZW1lbnRzUmVzb2x1dGlvbkFuYWx5c2lzIF9jdXN0b21FbGVtZW50c1Jlc29sdXRpb25BbmFseXNpczsKICBmaW5hbCBSdW50aW1lVHlwZXNOZWVkQnVpbGRlciBfcnRpTmVlZEJ1aWxkZXI7CiAgZmluYWwgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIF9jbGFzc0hpZXJhcmNoeUJ1aWxkZXI7CgogIEphdmFTY3JpcHRJbXBhY3RUcmFuc2Zvcm1lcigKICAgICAgdGhpcy5fb3B0aW9ucywKICAgICAgdGhpcy5fZWxlbWVudEVudmlyb25tZW50LAogICAgICB0aGlzLl9jb21tb25FbGVtZW50cywKICAgICAgdGhpcy5faW1wYWN0cywKICAgICAgdGhpcy5fbmF0aXZlQmFzaWNEYXRhLAogICAgICB0aGlzLl9uYXRpdmVSZXNvbHV0aW9uRW5xdWV1ZXIsCiAgICAgIHRoaXMuX2JhY2tlbmRVc2FnZUJ1aWxkZXIsCiAgICAgIHRoaXMuX2N1c3RvbUVsZW1lbnRzUmVzb2x1dGlvbkFuYWx5c2lzLAogICAgICB0aGlzLl9ydGlOZWVkQnVpbGRlciwKICAgICAgdGhpcy5fY2xhc3NIaWVyYXJjaHlCdWlsZGVyKTsKCiAgQG92ZXJyaWRlCiAgV29ybGRJbXBhY3QgdHJhbnNmb3JtUmVzb2x1dGlvbkltcGFjdChSZXNvbHV0aW9uSW1wYWN0IHdvcmxkSW1wYWN0KSB7CiAgICBUcmFuc2Zvcm1lZFdvcmxkSW1wYWN0IHRyYW5zZm9ybWVkID0KICAgICAgICBuZXcgVHJhbnNmb3JtZWRXb3JsZEltcGFjdCh3b3JsZEltcGFjdCk7CgogICAgdm9pZCByZWdpc3RlckltcGFjdChCYWNrZW5kSW1wYWN0IGltcGFjdCkgewogICAgICBpbXBhY3QucmVnaXN0ZXJJbXBhY3QodHJhbnNmb3JtZWQsIF9lbGVtZW50RW52aXJvbm1lbnQpOwogICAgICBfYmFja2VuZFVzYWdlQnVpbGRlci5wcm9jZXNzQmFja2VuZEltcGFjdChpbXBhY3QpOwogICAgfQoKICAgIGZvciAoRmVhdHVyZSBmZWF0dXJlIGluIHdvcmxkSW1wYWN0LmZlYXR1cmVzKSB7CiAgICAgIHN3aXRjaCAoZmVhdHVyZSkgewogICAgICAgIGNhc2UgRmVhdHVyZS5BQlNUUkFDVF9DTEFTU19JTlNUQU5USUFUSU9OOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuYWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb24pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBGZWF0dXJlLkFTU0VSVDoKICAgICAgICAgIHJlZ2lzdGVySW1wYWN0KF9pbXBhY3RzLmFzc2VydFdpdGhvdXRNZXNzYWdlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRmVhdHVyZS5BU1NFUlRfV0lUSF9NRVNTQUdFOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuYXNzZXJ0V2l0aE1lc3NhZ2UpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBGZWF0dXJlLkFTWU5DOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuYXN5bmNCb2R5KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRmVhdHVyZS5BU1lOQ19GT1JfSU46CiAgICAgICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy5hc3luY0ZvckluKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRmVhdHVyZS5BU1lOQ19TVEFSOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuYXN5bmNTdGFyQm9keSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEZlYXR1cmUuQ0FUQ0hfU1RBVEVNRU5UOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuY2F0Y2hTdGF0ZW1lbnQpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBGZWF0dXJlLkNPTVBJTEVfVElNRV9FUlJPUjoKICAgICAgICAgIGlmIChfb3B0aW9ucy5nZW5lcmF0ZUNvZGVXaXRoQ29tcGlsZVRpbWVFcnJvcnMpIHsKICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVGhpcyBzaG91bGQgaGF2ZSBpdHMgb3duIHVuY2F0Y2hhYmxlIGVycm9yLgogICAgICAgICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy50aHJvd1J1bnRpbWVFcnJvcik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEZlYXR1cmUuRkFMTF9USFJPVUdIX0VSUk9SOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuZmFsbFRocm91Z2hFcnJvcik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEZlYXR1cmUuRklFTERfV0lUSE9VVF9JTklUSUFMSVpFUjoKICAgICAgICBjYXNlIEZlYXR1cmUuTE9DQUxfV0lUSE9VVF9JTklUSUFMSVpFUjoKICAgICAgICAgIHRyYW5zZm9ybWVkLnJlZ2lzdGVyVHlwZVVzZSgKICAgICAgICAgICAgICBuZXcgVHlwZVVzZS5pbnN0YW50aWF0aW9uKF9jb21tb25FbGVtZW50cy5udWxsVHlwZSkpOwogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMubnVsbExpdGVyYWwpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBGZWF0dXJlLkxBWllfRklFTEQ6CiAgICAgICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy5sYXp5RmllbGQpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBGZWF0dXJlLlNUQUNLX1RSQUNFX0lOX0NBVENIOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuc3RhY2tUcmFjZUluQ2F0Y2gpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBGZWF0dXJlLlNUUklOR19JTlRFUlBPTEFUSU9OOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuc3RyaW5nSW50ZXJwb2xhdGlvbik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEZlYXR1cmUuU1RSSU5HX0pVWFRBUE9TSVRJT046CiAgICAgICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy5zdHJpbmdKdXh0YXBvc2l0aW9uKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRmVhdHVyZS5TVVBFUl9OT19TVUNIX01FVEhPRDoKICAgICAgICAgIHJlZ2lzdGVySW1wYWN0KF9pbXBhY3RzLnN1cGVyTm9TdWNoTWV0aG9kKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRmVhdHVyZS5TWU1CT0xfQ09OU1RSVUNUT1I6CiAgICAgICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy5zeW1ib2xDb25zdHJ1Y3Rvcik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEZlYXR1cmUuU1lOQ19GT1JfSU46CiAgICAgICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy5zeW5jRm9ySW4pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBGZWF0dXJlLlNZTkNfU1RBUjoKICAgICAgICAgIHJlZ2lzdGVySW1wYWN0KF9pbXBhY3RzLnN5bmNTdGFyQm9keSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEZlYXR1cmUuVEhST1dfRVhQUkVTU0lPTjoKICAgICAgICAgIHJlZ2lzdGVySW1wYWN0KF9pbXBhY3RzLnRocm93RXhwcmVzc2lvbik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEZlYXR1cmUuVEhST1dfTk9fU1VDSF9NRVRIT0Q6CiAgICAgICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy50aHJvd05vU3VjaE1ldGhvZCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEZlYXR1cmUuVEhST1dfUlVOVElNRV9FUlJPUjoKICAgICAgICAgIHJlZ2lzdGVySW1wYWN0KF9pbXBhY3RzLnRocm93UnVudGltZUVycm9yKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRmVhdHVyZS5USFJPV19VTlNVUFBPUlRFRF9FUlJPUjoKICAgICAgICAgIHJlZ2lzdGVySW1wYWN0KF9pbXBhY3RzLnRocm93VW5zdXBwb3J0ZWRFcnJvcik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEZlYXR1cmUuVFlQRV9WQVJJQUJMRV9CT1VORFNfQ0hFQ0s6CiAgICAgICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy50eXBlVmFyaWFibGVCb3VuZENoZWNrKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRmVhdHVyZS5MT0FEX0xJQlJBUlk6CiAgICAgICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy5sb2FkTGlicmFyeSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQoKICAgIGJvb2wgaGFzQXNDYXN0ID0gZmFsc2U7CiAgICBib29sIGhhc1R5cGVMaXRlcmFsID0gZmFsc2U7CiAgICBmb3IgKFR5cGVVc2UgdHlwZVVzZSBpbiB3b3JsZEltcGFjdC50eXBlVXNlcykgewogICAgICBEYXJ0VHlwZSB0eXBlID0gdHlwZVVzZS50eXBlOwogICAgICBzd2l0Y2ggKHR5cGVVc2Uua2luZCkgewogICAgICAgIGNhc2UgVHlwZVVzZUtpbmQuSU5TVEFOVElBVElPTjoKICAgICAgICBjYXNlIFR5cGVVc2VLaW5kLkNPTlNUX0lOU1RBTlRJQVRJT046CiAgICAgICAgY2FzZSBUeXBlVXNlS2luZC5OQVRJVkVfSU5TVEFOVElBVElPTjoKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVHlwZVVzZUtpbmQuSVNfQ0hFQ0s6CiAgICAgICAgICBvbklzQ2hlY2sodHlwZSwgdHJhbnNmb3JtZWQpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUeXBlVXNlS2luZC5BU19DQVNUOgogICAgICAgICAgaWYgKCFfb3B0aW9ucy5vbWl0QXNDYXN0cykgewogICAgICAgICAgICBvbklzQ2hlY2sodHlwZSwgdHJhbnNmb3JtZWQpOwogICAgICAgICAgICBoYXNBc0Nhc3QgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUeXBlVXNlS2luZC5JTVBMSUNJVF9DQVNUOgogICAgICAgICAgaWYgKF9vcHRpb25zLmltcGxpY2l0RG93bmNhc3RDaGVja1BvbGljeS5pc0VtaXR0ZWQpIHsKICAgICAgICAgICAgb25Jc0NoZWNrKHR5cGUsIHRyYW5zZm9ybWVkKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVHlwZVVzZUtpbmQuUEFSQU1FVEVSX0NIRUNLOgogICAgICAgICAgaWYgKF9vcHRpb25zLnBhcmFtZXRlckNoZWNrUG9saWN5LmlzRW1pdHRlZCkgewogICAgICAgICAgICBvbklzQ2hlY2sodHlwZSwgdHJhbnNmb3JtZWQpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUeXBlVXNlS2luZC5DQVRDSF9UWVBFOgogICAgICAgICAgb25Jc0NoZWNrKHR5cGUsIHRyYW5zZm9ybWVkKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVHlwZVVzZUtpbmQuVFlQRV9MSVRFUkFMOgogICAgICAgICAgX2N1c3RvbUVsZW1lbnRzUmVzb2x1dGlvbkFuYWx5c2lzLnJlZ2lzdGVyVHlwZUxpdGVyYWwodHlwZSk7CiAgICAgICAgICBpZiAodHlwZS5pc1R5cGVWYXJpYWJsZSkgewogICAgICAgICAgICBUeXBlVmFyaWFibGVUeXBlIHR5cGVWYXJpYWJsZSA9IHR5cGU7CiAgICAgICAgICAgIEVudGl0eSB0eXBlRGVjbGFyYXRpb24gPSB0eXBlVmFyaWFibGUuZWxlbWVudC50eXBlRGVjbGFyYXRpb247CiAgICAgICAgICAgIGlmICh0eXBlRGVjbGFyYXRpb24gaXMgQ2xhc3NFbnRpdHkpIHsKICAgICAgICAgICAgICBfcnRpTmVlZEJ1aWxkZXIKICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyQ2xhc3NVc2luZ1R5cGVWYXJpYWJsZUxpdGVyYWwodHlwZURlY2xhcmF0aW9uKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlRGVjbGFyYXRpb24gaXMgRnVuY3Rpb25FbnRpdHkpIHsKICAgICAgICAgICAgICBfcnRpTmVlZEJ1aWxkZXIKICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyTWV0aG9kVXNpbmdUeXBlVmFyaWFibGVMaXRlcmFsKHR5cGVEZWNsYXJhdGlvbik7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZURlY2xhcmF0aW9uIGlzIExvY2FsKSB7CiAgICAgICAgICAgICAgX3J0aU5lZWRCdWlsZGVyLnJlZ2lzdGVyTG9jYWxGdW5jdGlvblVzaW5nVHlwZVZhcmlhYmxlTGl0ZXJhbCgKICAgICAgICAgICAgICAgICAgdHlwZURlY2xhcmF0aW9uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy50eXBlVmFyaWFibGVFeHByZXNzaW9uKTsKICAgICAgICAgIH0KICAgICAgICAgIGhhc1R5cGVMaXRlcmFsID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVHlwZVVzZUtpbmQuUlRJX1ZBTFVFOgogICAgICAgIGNhc2UgVHlwZVVzZUtpbmQuVFlQRV9BUkdVTUVOVDoKICAgICAgICAgIGZhaWxlZEF0KENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsICJVbmV4cGVjdGVkIHR5cGUgdXNlOiAkdHlwZVVzZS4iKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgaWYgKGhhc0FzQ2FzdCkgewogICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy5hc0NoZWNrKTsKICAgIH0KCiAgICBpZiAoaGFzVHlwZUxpdGVyYWwpIHsKICAgICAgdHJhbnNmb3JtZWQKICAgICAgICAgIC5yZWdpc3RlclR5cGVVc2UobmV3IFR5cGVVc2UuaW5zdGFudGlhdGlvbihfY29tbW9uRWxlbWVudHMudHlwZVR5cGUpKTsKICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMudHlwZUxpdGVyYWwpOwogICAgfQoKICAgIGZvciAoTWFwTGl0ZXJhbFVzZSBtYXBMaXRlcmFsVXNlIGluIHdvcmxkSW1wYWN0Lm1hcExpdGVyYWxzKSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSB0aGUgW2lzRW1wdHldIHByb3BlcnR5IHdoZW4gZmFjdG9yeQogICAgICAvLyBjb25zdHJ1Y3RvcnMgYXJlIHJlZ2lzdGVyZWQgZGlyZWN0bHkuCiAgICAgIGlmIChtYXBMaXRlcmFsVXNlLmlzQ29uc3RhbnQpIHsKICAgICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy5jb25zdGFudE1hcExpdGVyYWwpOwogICAgICB9IGVsc2UgewogICAgICAgIHRyYW5zZm9ybWVkCiAgICAgICAgICAgIC5yZWdpc3RlclR5cGVVc2UobmV3IFR5cGVVc2UuaW5zdGFudGlhdGlvbihtYXBMaXRlcmFsVXNlLnR5cGUpKTsKICAgICAgfQogICAgfQoKICAgIGZvciAoU2V0TGl0ZXJhbFVzZSBzZXRMaXRlcmFsVXNlIGluIHdvcmxkSW1wYWN0LnNldExpdGVyYWxzKSB7CiAgICAgIGlmIChzZXRMaXRlcmFsVXNlLmlzQ29uc3RhbnQpIHsKICAgICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy5jb25zdGFudFNldExpdGVyYWwpOwogICAgICB9IGVsc2UgewogICAgICAgIHRyYW5zZm9ybWVkCiAgICAgICAgICAgIC5yZWdpc3RlclR5cGVVc2UobmV3IFR5cGVVc2UuaW5zdGFudGlhdGlvbihzZXRMaXRlcmFsVXNlLnR5cGUpKTsKICAgICAgfQogICAgfQoKICAgIGZvciAoTGlzdExpdGVyYWxVc2UgbGlzdExpdGVyYWxVc2UgaW4gd29ybGRJbXBhY3QubGlzdExpdGVyYWxzKSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSB0aGUgW2lzQ29uc3RhbnRdIGFuZCBbaXNFbXB0eV0gcHJvcGVydHkgd2hlbgogICAgICAvLyBmYWN0b3J5IGNvbnN0cnVjdG9ycyBhcmUgcmVnaXN0ZXJlZCBkaXJlY3RseS4KICAgICAgdHJhbnNmb3JtZWQKICAgICAgICAgIC5yZWdpc3RlclR5cGVVc2UobmV3IFR5cGVVc2UuaW5zdGFudGlhdGlvbihsaXN0TGl0ZXJhbFVzZS50eXBlKSk7CiAgICB9CgogICAgZm9yIChSdW50aW1lVHlwZVVzZSBydW50aW1lVHlwZVVzZSBpbiB3b3JsZEltcGFjdC5ydW50aW1lVHlwZVVzZXMpIHsKICAgICAgLy8gRW5hYmxlIHJ1bnRpbWUgdHlwZSBzdXBwb3J0IGlmIHdlIGRpc2NvdmVyIGEgZ2V0dGVyIGNhbGxlZAogICAgICAvLyBydW50aW1lVHlwZS4gV2UgaGF2ZSB0byBlbmFibGUgcnVudGltZSB0eXBlIGJlZm9yZSBoaXR0aW5nIHRoZQogICAgICAvLyBjb2RlZ2VuLCBzbyB0aGF0IGNvbnN0cnVjdG9ycyBrbm93IHdoZXRoZXIgdGhleSBuZWVkIHRvIGdlbmVyYXRlIGNvZGUKICAgICAgLy8gZm9yIHJ1bnRpbWUgdHlwZS4KICAgICAgX2JhY2tlbmRVc2FnZUJ1aWxkZXIucmVnaXN0ZXJSdW50aW1lVHlwZVVzZShydW50aW1lVHlwZVVzZSk7CiAgICB9CgogICAgaWYgKHdvcmxkSW1wYWN0LmNvbnN0U3ltYm9sTmFtZXMuaXNOb3RFbXB0eSkgewogICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy5jb25zdFN5bWJvbCk7CiAgICB9CgogICAgZm9yIChTdGF0aWNVc2Ugc3RhdGljVXNlIGluIHdvcmxkSW1wYWN0LnN0YXRpY1VzZXMpIHsKICAgICAgc3dpdGNoIChzdGF0aWNVc2Uua2luZCkgewogICAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5DTE9TVVJFOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuY2xvc3VyZSk7CiAgICAgICAgICBMb2NhbCBjbG9zdXJlID0gc3RhdGljVXNlLmVsZW1lbnQ7CiAgICAgICAgICBGdW5jdGlvblR5cGUgdHlwZSA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0TG9jYWxGdW5jdGlvblR5cGUoY2xvc3VyZSk7CiAgICAgICAgICBpZiAodHlwZS5jb250YWluc1R5cGVWYXJpYWJsZXMgfHwKICAgICAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDYW4gd2UgYXZvaWQgdGhlIG5lZWQgZm9yIHNpZ25hdHVyZXMgaW4KICAgICAgICAgICAgICAvLyBEYXJ0IDI/CiAgICAgICAgICAgICAgdHJ1ZSkgewogICAgICAgICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy5jb21wdXRlU2lnbmF0dXJlKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgIH0KICAgIH0KCiAgICBmb3IgKENvbnN0YW50RXhwcmVzc2lvbiBjb25zdGFudCBpbiB3b3JsZEltcGFjdC5jb25zdGFudExpdGVyYWxzKSB7CiAgICAgIHN3aXRjaCAoY29uc3RhbnQua2luZCkgewogICAgICAgIGNhc2UgQ29uc3RhbnRFeHByZXNzaW9uS2luZC5OVUxMOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMubnVsbExpdGVyYWwpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBDb25zdGFudEV4cHJlc3Npb25LaW5kLkJPT0w6CiAgICAgICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy5ib29sTGl0ZXJhbCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIENvbnN0YW50RXhwcmVzc2lvbktpbmQuSU5UOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuaW50TGl0ZXJhbCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIENvbnN0YW50RXhwcmVzc2lvbktpbmQuRE9VQkxFOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuZG91YmxlTGl0ZXJhbCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIENvbnN0YW50RXhwcmVzc2lvbktpbmQuU1RSSU5HOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuc3RyaW5nTGl0ZXJhbCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgYXNzZXJ0KAogICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICAgIGZhaWxlZEF0KE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwKICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgY29uc3RhbnQgbGl0ZXJhbDogJHtjb25zdGFudC5raW5kfS4iKSk7CiAgICAgIH0KICAgIH0KCiAgICBmb3IgKE5hdGl2ZUJlaGF2aW9yIGJlaGF2aW9yIGluIHdvcmxkSW1wYWN0Lm5hdGl2ZURhdGEpIHsKICAgICAgX25hdGl2ZVJlc29sdXRpb25FbnF1ZXVlci5yZWdpc3Rlck5hdGl2ZUJlaGF2aW9yKAogICAgICAgICAgdHJhbnNmb3JtZWQsIGJlaGF2aW9yLCB3b3JsZEltcGFjdCk7CiAgICB9CgogICAgZm9yIChDbGFzc0VudGl0eSBjbGFzc0VudGl0eSBpbiB3b3JsZEltcGFjdC5zZWVuQ2xhc3NlcykgewogICAgICBfY2xhc3NIaWVyYXJjaHlCdWlsZGVyLnJlZ2lzdGVyQ2xhc3MoY2xhc3NFbnRpdHkpOwogICAgfQoKICAgIGlmICh3b3JsZEltcGFjdC5nZW5lcmljSW5zdGFudGlhdGlvbnMuaXNOb3RFbXB0eSkgewogICAgICBmb3IgKEdlbmVyaWNJbnN0YW50aWF0aW9uIGluc3RhbnRpYXRpb24KICAgICAgICAgIGluIHdvcmxkSW1wYWN0LmdlbmVyaWNJbnN0YW50aWF0aW9ucykgewogICAgICAgIHJlZ2lzdGVySW1wYWN0KF9pbXBhY3RzCiAgICAgICAgICAgIC5nZXRHZW5lcmljSW5zdGFudGlhdGlvbihpbnN0YW50aWF0aW9uLnR5cGVBcmd1bWVudHMubGVuZ3RoKSk7CiAgICAgICAgX3J0aU5lZWRCdWlsZGVyLnJlZ2lzdGVyR2VuZXJpY0luc3RhbnRpYXRpb24oaW5zdGFudGlhdGlvbik7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gdHJhbnNmb3JtZWQ7CiAgfQoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNYXliZSBzcGxpdCB0aGlzIGludG8gW29uQXNzZXJ0VHlwZV0gYW5kIFtvblRlc3RUeXBlXS4KICB2b2lkIG9uSXNDaGVjayhEYXJ0VHlwZSB0eXBlLCBUcmFuc2Zvcm1lZFdvcmxkSW1wYWN0IHRyYW5zZm9ybWVkKSB7CiAgICB2b2lkIHJlZ2lzdGVySW1wYWN0KEJhY2tlbmRJbXBhY3QgaW1wYWN0KSB7CiAgICAgIGltcGFjdC5yZWdpc3RlckltcGFjdCh0cmFuc2Zvcm1lZCwgX2VsZW1lbnRFbnZpcm9ubWVudCk7CiAgICAgIF9iYWNrZW5kVXNhZ2VCdWlsZGVyLnByb2Nlc3NCYWNrZW5kSW1wYWN0KGltcGFjdCk7CiAgICB9CgogICAgdHlwZSA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0VW5hbGlhc2VkVHlwZSh0eXBlKTsKICAgIHJlZ2lzdGVySW1wYWN0KF9pbXBhY3RzLnR5cGVDaGVjayk7CgogICAgaWYgKCF0eXBlLnRyZWF0QXNSYXcgfHwgdHlwZS5jb250YWluc1R5cGVWYXJpYWJsZXMgfHwgdHlwZS5pc0Z1bmN0aW9uVHlwZSkgewogICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy5nZW5lcmljVHlwZUNoZWNrKTsKICAgICAgaWYgKHR5cGUuaXNUeXBlVmFyaWFibGUpIHsKICAgICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy50eXBlVmFyaWFibGVUeXBlQ2hlY2spOwogICAgICB9CiAgICB9CiAgICBpZiAodHlwZSBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuZnVuY3Rpb25UeXBlQ2hlY2spOwogICAgfQogICAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJiBfbmF0aXZlQmFzaWNEYXRhLmlzTmF0aXZlQ2xhc3ModHlwZS5lbGVtZW50KSkgewogICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy5uYXRpdmVUeXBlQ2hlY2spOwogICAgfQogICAgaWYgKHR5cGUgaXMgRnV0dXJlT3JUeXBlKSB7CiAgICAgIHJlZ2lzdGVySW1wYWN0KF9pbXBhY3RzLmZ1dHVyZU9yVHlwZUNoZWNrKTsKICAgIH0KICB9Cn0KCmNsYXNzIENvZGVnZW5JbXBhY3RUcmFuc2Zvcm1lciB7CiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwogIGZpbmFsIEVsZW1lbnRFbnZpcm9ubWVudCBfZWxlbWVudEVudmlyb25tZW50OwogIGZpbmFsIENvbW1vbkVsZW1lbnRzIF9jb21tb25FbGVtZW50czsKICBmaW5hbCBCYWNrZW5kSW1wYWN0cyBfaW1wYWN0czsKICBmaW5hbCBOYXRpdmVEYXRhIF9uYXRpdmVEYXRhOwogIGZpbmFsIEJhY2tlbmRVc2FnZSBfYmFja2VuZFVzYWdlOwogIGZpbmFsIFJ1bnRpbWVUeXBlc05lZWQgX3J0aU5lZWQ7CiAgZmluYWwgTmF0aXZlQ29kZWdlbkVucXVldWVyIF9uYXRpdmVDb2RlZ2VuRW5xdWV1ZXI7CiAgZmluYWwgTmFtZXIgX25hbWVyOwogIGZpbmFsIE9uZVNob3RJbnRlcmNlcHRvckRhdGEgX29uZVNob3RJbnRlcmNlcHRvckRhdGE7CiAgZmluYWwgUnVudGltZVR5cGVzQ2hlY2tzQnVpbGRlciBfcnRpQ2hlY2tzQnVpbGRlcjsKCiAgQ29kZWdlbkltcGFjdFRyYW5zZm9ybWVyKAogICAgICB0aGlzLl9vcHRpb25zLAogICAgICB0aGlzLl9lbGVtZW50RW52aXJvbm1lbnQsCiAgICAgIHRoaXMuX2NvbW1vbkVsZW1lbnRzLAogICAgICB0aGlzLl9pbXBhY3RzLAogICAgICB0aGlzLl9uYXRpdmVEYXRhLAogICAgICB0aGlzLl9iYWNrZW5kVXNhZ2UsCiAgICAgIHRoaXMuX3J0aU5lZWQsCiAgICAgIHRoaXMuX25hdGl2ZUNvZGVnZW5FbnF1ZXVlciwKICAgICAgdGhpcy5fbmFtZXIsCiAgICAgIHRoaXMuX29uZVNob3RJbnRlcmNlcHRvckRhdGEsCiAgICAgIHRoaXMuX3J0aUNoZWNrc0J1aWxkZXIpOwoKICB2b2lkIG9uSXNDaGVja0ZvckNvZGVnZW4oRGFydFR5cGUgdHlwZSwgVHJhbnNmb3JtZWRXb3JsZEltcGFjdCB0cmFuc2Zvcm1lZCkgewogICAgaWYgKHR5cGUuaXNEeW5hbWljKSByZXR1cm47CiAgICBpZiAodHlwZS5pc1ZvaWQpIHJldHVybjsKICAgIHR5cGUgPSB0eXBlLnVuYWxpYXNlZDsKICAgIF9pbXBhY3RzLnR5cGVDaGVjay5yZWdpc3RlckltcGFjdCh0cmFuc2Zvcm1lZCwgX2VsZW1lbnRFbnZpcm9ubWVudCk7CgogICAgaWYgKCF0eXBlLnRyZWF0QXNSYXcgfHwgdHlwZS5jb250YWluc1R5cGVWYXJpYWJsZXMpIHsKICAgICAgX2ltcGFjdHMuZ2VuZXJpY0lzQ2hlY2sucmVnaXN0ZXJJbXBhY3QodHJhbnNmb3JtZWQsIF9lbGVtZW50RW52aXJvbm1lbnQpOwogICAgfQogICAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJiBfbmF0aXZlRGF0YS5pc05hdGl2ZUNsYXNzKHR5cGUuZWxlbWVudCkpIHsKICAgICAgLy8gV2Ugd2lsbCBuZWVlZCB0byBhZGQgdGhlICIkaXMiIGFuZCAiJGFzIiBwcm9wZXJ0aWVzIG9uIHRoZQogICAgICAvLyBKYXZhU2NyaXB0IG9iamVjdCBwcm90b3R5cGUsIHNvIHdlIG1ha2Ugc3VyZQogICAgICAvLyBbOmRlZmluZVByb3BlcnR5Ol0gaXMgY29tcGlsZWQuCiAgICAgIF9pbXBhY3RzLm5hdGl2ZVR5cGVDaGVjay5yZWdpc3RlckltcGFjdCh0cmFuc2Zvcm1lZCwgX2VsZW1lbnRFbnZpcm9ubWVudCk7CiAgICB9CiAgfQoKICBXb3JsZEltcGFjdCB0cmFuc2Zvcm1Db2RlZ2VuSW1wYWN0KENvZGVnZW5JbXBhY3QgaW1wYWN0KSB7CiAgICBUcmFuc2Zvcm1lZFdvcmxkSW1wYWN0IHRyYW5zZm9ybWVkID0gbmV3IFRyYW5zZm9ybWVkV29ybGRJbXBhY3QoaW1wYWN0KTsKCiAgICBmb3IgKFR5cGVVc2UgdHlwZVVzZSBpbiBpbXBhY3QudHlwZVVzZXMpIHsKICAgICAgRGFydFR5cGUgdHlwZSA9IHR5cGVVc2UudHlwZTsKICAgICAgaWYgKHR5cGVVc2Uua2luZCA9PSBUeXBlVXNlS2luZC5JU19DSEVDSykgewogICAgICAgIG9uSXNDaGVja0ZvckNvZGVnZW4odHlwZSwgdHJhbnNmb3JtZWQpOwogICAgICB9CiAgICB9CgogICAgZm9yIChQYWlyPERhcnRUeXBlLCBEYXJ0VHlwZT4gY2hlY2sKICAgICAgICBpbiBpbXBhY3QudHlwZVZhcmlhYmxlQm91bmRzU3VidHlwZUNoZWNrcykgewogICAgICBfcnRpQ2hlY2tzQnVpbGRlci5yZWdpc3RlclR5cGVWYXJpYWJsZUJvdW5kc1N1YnR5cGVDaGVjaygKICAgICAgICAgIGNoZWNrLmEsIGNoZWNrLmIpOwogICAgfQoKICAgIGZvciAoU3RhdGljVXNlIHN0YXRpY1VzZSBpbiBpbXBhY3Quc3RhdGljVXNlcykgewogICAgICBpZiAoc3RhdGljVXNlLmtpbmQgPT0gU3RhdGljVXNlS2luZC5DQUxMX01FVEhPRCkgewogICAgICAgIEZ1bmN0aW9uRW50aXR5IGNhbGxNZXRob2QgPSBzdGF0aWNVc2UuZWxlbWVudDsKICAgICAgICBpZiAoX3J0aU5lZWQubWV0aG9kTmVlZHNTaWduYXR1cmUoY2FsbE1ldGhvZCkpIHsKICAgICAgICAgIF9pbXBhY3RzLmNvbXB1dGVTaWduYXR1cmUKICAgICAgICAgICAgICAucmVnaXN0ZXJJbXBhY3QodHJhbnNmb3JtZWQsIF9lbGVtZW50RW52aXJvbm1lbnQpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGZvciAoU2V0PENsYXNzRW50aXR5PiBjbGFzc2VzIGluIGltcGFjdC5zcGVjaWFsaXplZEdldEludGVyY2VwdG9ycykgewogICAgICBfb25lU2hvdEludGVyY2VwdG9yRGF0YS5yZWdpc3RlclNwZWNpYWxpemVkR2V0SW50ZXJjZXB0b3IoCiAgICAgICAgICBjbGFzc2VzLCBfbmFtZXIpOwogICAgfQoKICAgIGlmIChpbXBhY3QudXNlc0ludGVyY2VwdG9yKSB7CiAgICAgIGlmIChfbmF0aXZlQ29kZWdlbkVucXVldWVyLmhhc0luc3RhbnRpYXRlZE5hdGl2ZUNsYXNzZXMpIHsKICAgICAgICBfaW1wYWN0cy5pbnRlcmNlcHRvclVzZQogICAgICAgICAgICAucmVnaXN0ZXJJbXBhY3QodHJhbnNmb3JtZWQsIF9lbGVtZW50RW52aXJvbm1lbnQpOwogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEF2b2lkIHRoZXNlIHdvcmthcm91bmRzLgogICAgICAgIF9iYWNrZW5kVXNhZ2UubmVlZFRvSW5pdGlhbGl6ZUlzb2xhdGVBZmZpbml0eVRhZyA9IHRydWU7CiAgICAgICAgX2JhY2tlbmRVc2FnZS5uZWVkVG9Jbml0aWFsaXplRGlzcGF0Y2hQcm9wZXJ0eSA9IHRydWU7CiAgICAgIH0KICAgIH0KCiAgICBmb3IgKEFzeW5jTWFya2VyIGFzeW5jTWFya2VyIGluIGltcGFjdC5hc3luY01hcmtlcnMpIHsKICAgICAgc3dpdGNoIChhc3luY01hcmtlcikgewogICAgICAgIGNhc2UgQXN5bmNNYXJrZXIuQVNZTkM6CiAgICAgICAgICBfaW1wYWN0cy5hc3luY0JvZHkucmVnaXN0ZXJJbXBhY3QodHJhbnNmb3JtZWQsIF9lbGVtZW50RW52aXJvbm1lbnQpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBBc3luY01hcmtlci5TWU5DX1NUQVI6CiAgICAgICAgICBfaW1wYWN0cy5zeW5jU3RhckJvZHkKICAgICAgICAgICAgICAucmVnaXN0ZXJJbXBhY3QodHJhbnNmb3JtZWQsIF9lbGVtZW50RW52aXJvbm1lbnQpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBBc3luY01hcmtlci5BU1lOQ19TVEFSOgogICAgICAgICAgX2ltcGFjdHMuYXN5bmNTdGFyQm9keQogICAgICAgICAgICAgIC5yZWdpc3RlckltcGFjdCh0cmFuc2Zvcm1lZCwgX2VsZW1lbnRFbnZpcm9ubWVudCk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQoKICAgIGZvciAoR2VuZXJpY0luc3RhbnRpYXRpb24gaW5zdGFudGlhdGlvbiBpbiBpbXBhY3QuZ2VuZXJpY0luc3RhbnRpYXRpb25zKSB7CiAgICAgIF9ydGlDaGVja3NCdWlsZGVyLnJlZ2lzdGVyR2VuZXJpY0luc3RhbnRpYXRpb24oaW5zdGFudGlhdGlvbik7CiAgICB9CgogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIGVhZ2VyIHJlZ2lzdHJhdGlvbi4KICAgIHJldHVybiB0cmFuc2Zvcm1lZDsKICB9Cn0KgckATk48AS8BRgEZIjw0OjooJCEhIhojHjlRHB4dKCAVGx0BPiIwKCEqPDJMMTYBHxUgHBUdJiEuHCQBDEgpMQEwPzkGATQZMz8RHTkRKjYRHC4RIy8RITIRJjMRKTxQOAwRKTURMDAnRDARIS4RKzYRKzgRKzgRKzYRKTYRIi4RIDERJzQRKzYRKjYRLjoRMTsRIzARCAYBHCE0JB4oLi8RIygRIicqHgwRKEAqDBEqOSoMESUoESdHJTJLMh5LPB5MM00kDj0MIREkKFERCAYBFSgGARoSUSwGAUNGLyY1DxRNCAYBQyY1DxRNCAYBRk83EkwGAUlESE8bQwYBMywGATogJCwtUSxOGRY3DBERCAYBSB8qMBEqMBEpLxEsMhEsMhEREhUuRggGAT44LwYBPzkGATguMiBLRQgGARgEAVFGMD85BgE3KAFRMSE4CAYgMgZRMAYgMgYEAgEhIjAoISAkIzYWODUBHBUgHBUYGhUjEyQfAVAgHRtJATpQBkxENilRBgQBPU0BLyQyMAgGASg1QB0GATU5NzkkQQoIBgFKQRwGASJBID85QT8IBgE7HSBPESQgQRElIUERCAYBT0UGATcYBAIBN3BhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvaW1wYWN0X3RyYW5zZm9ybWVyLmRhcnQzc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfYmFja2VuZC9uYW1lci5kYXJ0wAFRPi8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGpzX2JhY2tlbmQubmFtZXI7CgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbicgc2hvdyBIYXNoTWFwOwoKaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL2RhcnQyanMuZGFydCcKICAgIHNob3cgJDAsICQ5LCAkQSwgJFosICRfLCAkYSwgJGcsICRzLCAkejsKCmltcG9ydCAncGFja2FnZTpqc19ydW50aW1lL3NoYXJlZC9lbWJlZGRlZF9uYW1lcy5kYXJ0JyBzaG93IEpzR2V0TmFtZTsKCmltcG9ydCAnLi4vY2xvc3VyZS5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnIHNob3cgSWRlbnRpZmllcnMsIE5hbWVzLCBTZWxlY3RvcnM7CmltcG9ydCAnLi4vY29uc3RhbnRzL2NvbnN0YW50X3N5c3RlbS5kYXJ0JyBhcyBjb25zdGFudF9zeXN0ZW07CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCcgc2hvdyBDb21tb25FbGVtZW50cywgRWxlbWVudEVudmlyb25tZW50OwppbXBvcnQgJy4uL2RpYWdub3N0aWNzL2ludmFyaWFudC5kYXJ0JyBzaG93IERFQlVHX01PREU7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXR5X3V0aWxzLmRhcnQnIGFzIHV0aWxzOwppbXBvcnQgJy4uL2VsZW1lbnRzL2p1bXBzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL25hbWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIGFzIGpzQXN0OwppbXBvcnQgJy4uL2pzX21vZGVsL2Nsb3N1cmUuZGFydCc7CmltcG9ydCAnLi4vanNfbW9kZWwvZWxlbWVudHMuZGFydCcgc2hvdyBKR2VuZXJhdG9yQm9keTsKaW1wb3J0ICcuLi91bml2ZXJzZS9jYWxsX3N0cnVjdHVyZS5kYXJ0JyBzaG93IENhbGxTdHJ1Y3R1cmU7CmltcG9ydCAnLi4vdW5pdmVyc2UvY29kZWdlbl93b3JsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3IsIFNlbGVjdG9yS2luZDsKaW1wb3J0ICcuLi91dGlsL3V0aWwuZGFydCc7CmltcG9ydCAnLi4vd29ybGQuZGFydCcgc2hvdyBKQ2xvc2VkV29ybGQ7CmltcG9ydCAnYmFja2VuZC5kYXJ0JzsKaW1wb3J0ICduYXRpdmVfZGF0YS5kYXJ0JzsKaW1wb3J0ICdydW50aW1lX3R5cGVzLmRhcnQnOwoKcGFydCAnZmllbGRfbmFtaW5nX21peGluLmRhcnQnOwpwYXJ0ICdmcmVxdWVuY3lfbmFtZXIuZGFydCc7CnBhcnQgJ21pbmlmeV9uYW1lci5kYXJ0JzsKcGFydCAnbmFtZXJfbmFtZXMuZGFydCc7CgovLy8gQXNzaWducyBKYXZhU2NyaXB0IGlkZW50aWZpZXJzIHRvIERhcnQgdmFyaWFibGVzLCBjbGFzcy1uYW1lcyBhbmQgbWVtYmVycy4KLy8vCi8vLyBOYW1lcyBhcmUgZ2VuZXJhdGVkIHRocm91Z2ggdGhyZWUgc3RhZ2VzOgovLy8KLy8vIDEuIE9yaWdpbmFsIG5hbWVzIGFuZCBwcm9wb3NlZCBuYW1lcwovLy8gMi4gRGlzYW1iaWd1YXRlZCBuYW1lcyAoYWxzbyBrbm93biBhcyAibWFuZ2xlZCBuYW1lcyIpCi8vLyAzLiBBbm5vdGF0ZWQgbmFtZXMKLy8vCi8vLyBPcmlnaW5hbCBuYW1lcyBhcmUgbmFtZXMgdGFrZW4gZGlyZWN0bHkgZnJvbSB0aGUgaW5wdXQuCi8vLwovLy8gUHJvcG9zZWQgbmFtZXMgYXJlIGVpdGhlciBvcmlnaW5hbCBuYW1lcyBvciBzeW50aGVzaXplZCBuYW1lcyBmb3IgaW5wdXQKLy8vIGVsZW1lbnRzIHRoYXQgZG8gbm90IGhhdmUgb3JpZ2luYWwgbmFtZXMuCi8vLwovLy8gRGlzYW1iaWd1YXRlZCBuYW1lcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBhYm92ZSwgYnV0IGFyZSBtYW5nbGVkIHRvIGVuc3VyZQovLy8gdW5pcXVlbmVzcyB3aXRoaW4gc29tZSBuYW1lc3BhY2UgKGUuZy4gYXMgZmllbGRzIG9uIHRoZSBzYW1lIEpTIG9iamVjdCkuCi8vLyBJbiBbTWluaWZ5TmFtZXJdLCBkaXNhbWJpZ3VhdGVkIG5hbWVzIGFyZSBhbHNvIG1pbmlmaWVkLgovLy8KLy8vIEFubm90YXRlZCBuYW1lcyBhcmUgbmFtZXMgZ2VuZXJhdGVkIGZyb20gYSBkaXNhbWJpZ3VhdGVkIG5hbWUuIEFubm90YXRlZAovLy8gbmFtZXMgbXVzdCBiZSBjb21wdXRhYmxlIGF0IHJ1bnRpbWUgYnkgcHJlZml4aW5nL3N1ZmZpeGluZyBjb25zdGFudCBzdHJpbmdzCi8vLyBvbnRvIHRoZSBkaXNhbWJpZ3VhdGVkIG5hbWUuCi8vLwovLy8gRm9yIGV4YW1wbGUsIHNvbWUgZW50aXR5IGNhbGxlZCBgeGAgbWlnaHQgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZXNlIG5hbWVzOgovLy8KLy8vICAgICBPcmlnaW5hbCBuYW1lOiBgeGAKLy8vCi8vLyAgICAgRGlzYW1iaWd1YXRlZCBuYW1lOiBgeDFgIChpZiBzb21ldGhpbmcgZWxzZSB3YXMgY2FsbGVkIGB4YCkKLy8vCi8vLyAgICAgQW5ub3RhdGVkIG5hbWVzOiBgeDFgICAgICAoZmllbGQgbmFtZSkKLy8vICAgICAgICAgICAgICAgICAgICAgIGBnZXQkeDFgIChnZXR0ZXIgbmFtZSkKLy8vICAgICAgICAgICAgICAgICAgICAgIGBzZXQkeDFgIChzZXR0ZXIgbmFtZSkKLy8vCi8vLyBUaGUgW05hbWVyXSBjYW4gY2hvb3NlIHRoZSBkaXNhbWJpZ3VhdGVkIG5hbWVzLCBhbmQgdG8gc29tZSBkZWdyZWUgdGhlCi8vLyBwcmVmaXgvc3VmZml4IGNvbnN0YW50cyB1c2VkIHRvIGNvbnN0cnVjdCBhbm5vdGF0ZWQgbmFtZXMuIEl0IGNhbm5vdCBjaG9vc2UKLy8vIGFubm90YXRlZCBuYW1lcyB3aXRoIHRvdGFsIGZyZWVkb20sIGZvciBleGFtcGxlLCBpdCBjYW5ub3QgY2hvb3NlIHRoYXQgdGhlCi8vLyBnZXR0ZXIgZm9yIGB4MWAgc2hvdWxkIGJlIGNhbGxlZCBgZ2V0WGAgLS0gdGhlIGFubm90YXRlZCBuYW1lcyBhcmUgYWx3YXlzCi8vLyBidWlsdCBieSBjb25jYXRlbmF0aW9uLgovLy8KLy8vIERpc2FtYmlndWF0ZWQgbmFtZXMgbXVzdCBiZSBjaG9zZW4gc3VjaCB0aGF0IG5vbmUgb2YgdGhlIGFubm90YXRlZCBuYW1lcyBjYW4KLy8vIGNsYXNoIHdpdGggZWFjaCBvdGhlci4gVGhpcyBtYXkgaGFwcGVuIGV2ZW4gaWYgdGhlIGRpc2FtYmlndWF0ZWQgbmFtZXMgYXJlCi8vLyBkaXN0aW5jdCwgZm9yIGV4YW1wbGUsIHN1cHBvc2UgYSBmaWVsZCBgeGAgYW5kIGBnZXQkeGAgZXhpc3RzIGluIHRoZSBpbnB1dDoKLy8vCi8vLyAgICAgT3JpZ2luYWwgbmFtZXM6IGB4YCBhbmQgYGdldCR4YAovLy8KLy8vICAgICBEaXNhbWJpZ3VhdGVkIG5hbWVzOiBgeGAgYW5kIGBnZXQkeGAgKHRoZSB0d28gbmFtZXMgYSBkaWZmZXJlbnQpCi8vLwovLy8gICAgIEFubm90YXRlZCBuYW1lczogYHhgIChmaWVsZCBmb3IgYHhgKQovLy8gICAgICAgICAgICAgICAgICAgICAgYGdldCR4YCAoZ2V0dGVyIGZvciBgeGApCi8vLyAgICAgICAgICAgICAgICAgICAgICBgZ2V0JHhgIChmaWVsZCBmb3IgYGdldCR4YCkKLy8vICAgICAgICAgICAgICAgICAgICAgIGBnZXQkZ2V0JHhgIChnZXR0ZXIgZm9yIGBnZXQkeGApCi8vLwovLy8gVGhlIGdldHRlciBmb3IgYHhgIGNsYXNoZXMgd2l0aCB0aGUgZmllbGQgbmFtZSBmb3IgYGdldCR4YCwgc28gdGhlCi8vLyBkaXNhbWJpZ3VhdGVkIG5hbWVzIGFyZSBpbnZhbGlkLgovLy8KLy8vIEFkZGl0aW9uYWxseSwgZGlzYW1iaWd1YXRlZCBuYW1lcyBtdXN0IGJlIGNob3NlbiBzdWNoIHRoYXQgYWxsIGFubm90YXRlZAovLy8gbmFtZXMgYXJlIHZhbGlkIEphdmFTY3JpcHQgaWRlbnRpZmllcnMgYW5kIGRvIG5vdCBjb2luY2lkZSB3aXRoIGEgbmF0aXZlCi8vLyBKYXZhU2NyaXB0IHByb3BlcnR5IHN1Y2ggYXMgYF9fcHJvdG9fX2AuCi8vLwovLy8gVGhlIGZvbGxvd2luZyBhbm5vdGF0ZWQgbmFtZXMgYXJlIGdlbmVyYXRlZCBmb3IgaW5zdGFuY2UgbWVtYmVycywgd2hlcmUKLy8vIDxOQU1FPiBkZW5vdGVzIHRoZSBkaXNhbWJpZ3VhdGVkIG5hbWUuCi8vLwovLy8gMC4gVGhlIGRpc2FtYmlndWF0ZWQgbmFtZSBjYW4gaXRzZWxmIGJlIHNlZW4gYXMgYW4gYW5ub3RhdGVkIG5hbWUuCi8vLwovLy8gMS4gTXVsdGlwbGUgYW5ub3RhdGVkIG5hbWVzIGV4aXN0IGZvciB0aGUgYGNhbGxgIG1ldGhvZCwgZW5jb2RpbmcgYXJpdHkgYW5kCi8vLyAgICBuYW1lZCBwYXJhbWV0ZXJzIHdpdGggdGhlIHBhdHRlcm46Ci8vLwovLy8gICAgICAgY2FsbCQ8Tj4kbmFtZWRQYXJhbTEuLi4kbmFtZWRQYXJhbTxNPgovLy8KLy8vICAgIHdoZXJlIDxOPiBpcyB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKHJlcXVpcmVkIGFuZCBvcHRpb25hbCkgYW5kIDxNPiBpcwovLy8gICAgdGhlIG51bWJlciBvZiBuYW1lZCBwYXJhbWV0ZXJzLCBhbmQgbmFtZWRQYXJhbTxuPiBhcmUgdGhlIG5hbWVzIG9mIHRoZQovLy8gICAgbmFtZWQgcGFyYW1ldGVycyBpbiBhbHBoYWJldGljYWwgb3JkZXIuCi8vLwovLy8gICAgTm90ZSB0aGF0IHRoZSBzYW1lIGNvbnZlbnRpb24gaXMgdXNlZCBmb3IgdGhlICpwcm9wb3NlZCBuYW1lKiBvZiBvdGhlcgovLy8gICAgbWV0aG9kcy4gVGh1cywgZm9yIG9yZGluYXJ5IG1ldGhvZHMsIHRoZSBzdWZmaXggYmVjb21lcyBlbWJlZGRlZCBpbiB0aGUKLy8vICAgIGRpc2FtYmlndWF0ZWQgbmFtZSAoYW5kIGNhbiBiZSBtaW5pZmllZCksIHdoZXJlYXMgZm9yIHRoZSAnY2FsbCcgbWV0aG9kLAovLy8gICAgdGhlIHN1ZmZpeCBpcyBhbiBhbm5vdGF0aW9uIHRoYXQgbXVzdCBiZSBjb21wdXRhYmxlIGF0IHJ1bnRpbWUKLy8vICAgIChhbmQgdGh1cyBjYW5ub3QgYmUgbWluaWZpZWQpLgovLy8KLy8vICAgIE5vdGUgdGhhdCB0aGUgb3JkZXJpbmcgb2YgbmFtZWQgcGFyYW1ldGVycyBpcyBub3QgZW5jYXBzdWxhdGVkIGluIHRoZQovLy8gICAgW05hbWVyXSwgYW5kIGlzIGhhcmRjb2RlZCBpbnRvIG90aGVyIGNvbXBvbmVudHMsIHN1Y2ggYXMgW0VsZW1lbnRdIGFuZAovLy8gICAgW1NlbGVjdG9yXS4KLy8vCi8vLyAyLiBUaGUgZ2V0dGVyL3NldHRlciBmb3IgYSBmaWVsZDoKLy8vCi8vLyAgICAgICAgZ2V0JDxOQU1FPgovLy8gICAgICAgIHNldCQ8TkFNRT4KLy8vCi8vLyAgICAoVGhlIFtnZXR0ZXJQcmVmaXhdIGFuZCBbc2V0dGVyUHJlZml4XSBhcmUgZGlmZmVyZW50IGluIFtNaW5pZnlOYW1lcl0pLgovLy8KLy8vIDMuIFRoZSBgaXNgIGFuZCBvcGVyYXRvciB1c2VzIHRoZSBmb2xsb3dpbmcgbmFtZXM6Ci8vLwovLy8gICAgICAgICRpczxOQU1FPgovLy8gICAgICAgICRhczxOQU1FPgovLy8KLy8vIEZvciBsb2NhbCB2YXJpYWJsZXMsIHRoZSBbTmFtZXJdIG9ubHkgcHJvdmlkZXMgKnByb3Bvc2VkIG5hbWVzKi4gVGhlc2UgbmFtZXMKLy8vIG11c3QgYmUgZGlzYW1iaWd1YXRlZCBlbHNld2hlcmUuCmNsYXNzIE5hbWVyIHsKICBzdGF0aWMgY29uc3QgTGlzdDxTdHJpbmc+IGphdmFTY3JpcHRLZXl3b3JkcyA9IGNvbnN0IDxTdHJpbmc+WwogICAgLy8gRVM1IDcuNi4xLjEgS2V5d29yZHMuCiAgICAnYnJlYWsnLAogICAgJ2RvJywKICAgICdpbnN0YW5jZW9mJywKICAgICd0eXBlb2YnLAogICAgJ2Nhc2UnLAogICAgJ2Vsc2UnLAogICAgJ25ldycsCiAgICAndmFyJywKICAgICdjYXRjaCcsCiAgICAnZmluYWxseScsCiAgICAncmV0dXJuJywKICAgICd2b2lkJywKICAgICdjb250aW51ZScsCiAgICAnZm9yJywKICAgICdzd2l0Y2gnLAogICAgJ3doaWxlJywKICAgICdkZWJ1Z2dlcicsCiAgICAnZnVuY3Rpb24nLAogICAgJ3RoaXMnLAogICAgJ3dpdGgnLAogICAgJ2RlZmF1bHQnLAogICAgJ2lmJywKICAgICd0aHJvdycsCiAgICAnZGVsZXRlJywKICAgICdpbicsCiAgICAndHJ5JywKCiAgICAvLyBFUzUgNy42LjEuMiBGdXR1cmUgUmVzZXJ2ZWQgV29yZHMuCiAgICAnY2xhc3MnLAogICAgJ2VudW0nLAogICAgJ2V4dGVuZHMnLAogICAgJ3N1cGVyJywKICAgICdjb25zdCcsCiAgICAnZXhwb3J0JywKICAgICdpbXBvcnQnLAoKICAgIC8vIEVTNSA3LjYuMS4yIFdvcmRzIHdpdGggc2VtYW50aWMgcmVzdHJpY3Rpb25zLgogICAgJ2ltcGxlbWVudHMnLAogICAgJ2xldCcsCiAgICAncHJpdmF0ZScsCiAgICAncHVibGljJywKICAgICd5aWVsZCcsCiAgICAnaW50ZXJmYWNlJywKICAgICdwYWNrYWdlJywKICAgICdwcm90ZWN0ZWQnLAogICAgJ3N0YXRpYycsCgogICAgLy8gRVM2IDExLjYuMi4xIEtleXdvcmRzIChpbmNsdWRpbmcgcmVwZWF0cyBvZiBFUzUgdG8gZWFzZSBjb21wYXJpc29uIHdpdGgKICAgIC8vIGRvY3VtZW50cykuCiAgICAnYnJlYWsnLAogICAgJ2RvJywKICAgICdpbicsCiAgICAndHlwZW9mJywKICAgICdjYXNlJywKICAgICdlbHNlJywKICAgICdpbnN0YW5jZW9mJywKICAgICd2YXInLAogICAgJ2NhdGNoJywKICAgICdleHBvcnQnLAogICAgJ25ldycsCiAgICAndm9pZCcsCiAgICAnY2xhc3MnLAogICAgJ2V4dGVuZHMnLAogICAgJ3JldHVybicsCiAgICAnd2hpbGUnLAogICAgJ2NvbnN0JywKICAgICdmaW5hbGx5JywKICAgICdzdXBlcicsCiAgICAnd2l0aCcsCiAgICAnY29udGludWUnLAogICAgJ2ZvcicsCiAgICAnc3dpdGNoJywKICAgICd5aWVsZCcsCiAgICAnZGVidWdnZXInLAogICAgJ2Z1bmN0aW9uJywKICAgICd0aGlzJywKICAgICdkZWZhdWx0JywKICAgICdpZicsCiAgICAndGhyb3cnLAogICAgJ2RlbGV0ZScsCiAgICAnaW1wb3J0JywKICAgICd0cnknLAoKICAgIC8vIEVTNiAxMS42LjIuMSBXb3JkcyB3aXRoIHNlbWFudGljIHJlc3RyaWN0aW9ucy4KICAgICd5aWVsZCcsICdsZXQnLCAnc3RhdGljJywKCiAgICAvLyBFUzYgMTEuNi4yLjIgRnV0dXJlIFJlc2VydmVkIFdvcmRzLgogICAgJ2VudW0nLAogICAgJ2F3YWl0JywKCiAgICAvLyBFUzYgMTEuNi4yLjIgLyBFUzYgMTIuMS4xIFdvcmRzIHdpdGggc2VtYW50aWMgcmVzdHJpY3Rpb25zLgogICAgJ2ltcGxlbWVudHMnLAogICAgJ3BhY2thZ2UnLAogICAgJ3Byb3RlY3RlZCcsCiAgICAnaW50ZXJmYWNlJywKICAgICdwcml2YXRlJywKICAgICdwdWJsaWMnLAoKICAgIC8vIE90aGVyIHdvcmRzIHRvIGF2b2lkIGR1ZSB0byBub24tc3RhbmRhcmQga2V5d29yZC1saWtlIGJlaGF2aW9yLgogIF07CgogIHN0YXRpYyBjb25zdCBMaXN0PFN0cmluZz4gcmVzZXJ2ZWRQcm9wZXJ0eVN5bWJvbHMgPSBjb25zdCA8U3RyaW5nPlsKICAgICJfX3Byb3RvX18iLCAicHJvdG90eXBlIiwgImNvbnN0cnVjdG9yIiwgImNhbGwiLAogICAgLy8gInVzZSBzdHJpY3QiIGRpc2FsbG93cyB0aGUgdXNlIG9mICJhcmd1bWVudHMiIGFuZCAiZXZhbCIgYXMKICAgIC8vIHZhcmlhYmxlIG5hbWVzIG9yIHByb3BlcnR5IG5hbWVzLiBTZWUgRUNNQS0yNjIsIEVkaXRpb24gNS4xLAogICAgLy8gc2VjdGlvbiAxMS4xLjUgKGZvciB0aGUgcHJvcGVydHkgbmFtZXMpLgogICAgImV2YWwiLCAiYXJndW1lbnRzIgogIF07CgogIC8vIFN5bWJvbHMgdGhhdCB3ZSBtaWdodCBiZSB1c2luZyBpbiBvdXIgSlMgc25pcHBldHMuCiAgc3RhdGljIGNvbnN0IExpc3Q8U3RyaW5nPiByZXNlcnZlZEdsb2JhbFN5bWJvbHMgPSBjb25zdCA8U3RyaW5nPlsKICAgIC8vIFNlY3Rpb24gcmVmZXJlbmNlcyBhcmUgZnJvbSBFY21hLTI2MgogICAgLy8gKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvZmlsZXMvRUNNQS1TVC9FY21hLTI2Mi5wZGYpCgogICAgLy8gMTUuMS4xIFZhbHVlIFByb3BlcnRpZXMgb2YgdGhlIEdsb2JhbCBPYmplY3QKICAgICJOYU4iLCAiSW5maW5pdHkiLCAidW5kZWZpbmVkIiwKCiAgICAvLyAxNS4xLjIgRnVuY3Rpb24gUHJvcGVydGllcyBvZiB0aGUgR2xvYmFsIE9iamVjdAogICAgImV2YWwiLCAicGFyc2VJbnQiLCAicGFyc2VGbG9hdCIsICJpc05hTiIsICJpc0Zpbml0ZSIsCgogICAgLy8gMTUuMS4zIFVSSSBIYW5kbGluZyBGdW5jdGlvbiBQcm9wZXJ0aWVzCiAgICAiZGVjb2RlVVJJIiwgImRlY29kZVVSSUNvbXBvbmVudCIsCiAgICAiZW5jb2RlVVJJIiwKICAgICJlbmNvZGVVUklDb21wb25lbnQiLAoKICAgIC8vIDE1LjEuNCBDb25zdHJ1Y3RvciBQcm9wZXJ0aWVzIG9mIHRoZSBHbG9iYWwgT2JqZWN0CiAgICAiT2JqZWN0IiwgIkZ1bmN0aW9uIiwgIkFycmF5IiwgIlN0cmluZyIsICJCb29sZWFuIiwgIk51bWJlciIsICJEYXRlIiwKICAgICJSZWdFeHAiLCAiRXJyb3IiLCAiRXZhbEVycm9yIiwgIlJhbmdlRXJyb3IiLCAiUmVmZXJlbmNlRXJyb3IiLAogICAgIlN5bnRheEVycm9yIiwgIlR5cGVFcnJvciIsICJVUklFcnJvciIsCgogICAgLy8gMTUuMS41IE90aGVyIFByb3BlcnRpZXMgb2YgdGhlIEdsb2JhbCBPYmplY3QKICAgICJNYXRoIiwKCiAgICAvLyAxMC4xLjYgQWN0aXZhdGlvbiBPYmplY3QKICAgICJhcmd1bWVudHMiLAoKICAgIC8vIEIuMiBBZGRpdGlvbmFsIFByb3BlcnRpZXMgKG5vbi1ub3JtYXRpdmUpCiAgICAiZXNjYXBlIiwgInVuZXNjYXBlIiwKCiAgICAvLyBXaW5kb3cgcHJvcHMgKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0RPTS93aW5kb3cpCiAgICAiYXBwbGljYXRpb25DYWNoZSIsICJjbG9zZWQiLCAiQ29tcG9uZW50cyIsICJjb250ZW50IiwgImNvbnRyb2xsZXJzIiwKICAgICJjcnlwdG8iLCAiZGVmYXVsdFN0YXR1cyIsICJkaWFsb2dBcmd1bWVudHMiLCAiZGlyZWN0b3JpZXMiLAogICAgImRvY3VtZW50IiwgImZyYW1lRWxlbWVudCIsICJmcmFtZXMiLCAiZnVsbFNjcmVlbiIsICJnbG9iYWxTdG9yYWdlIiwKICAgICJoaXN0b3J5IiwgImlubmVySGVpZ2h0IiwgImlubmVyV2lkdGgiLCAibGVuZ3RoIiwKICAgICJsb2NhdGlvbiIsICJsb2NhdGlvbmJhciIsICJsb2NhbFN0b3JhZ2UiLCAibWVudWJhciIsCiAgICAibW96SW5uZXJTY3JlZW5YIiwgIm1veklubmVyU2NyZWVuWSIsICJtb3pTY3JlZW5QaXhlbHNQZXJDc3NQaXhlbCIsCiAgICAibmFtZSIsICJuYXZpZ2F0b3IiLCAib3BlbmVyIiwgIm91dGVySGVpZ2h0IiwgIm91dGVyV2lkdGgiLAogICAgInBhZ2VYT2Zmc2V0IiwgInBhZ2VZT2Zmc2V0IiwgInBhcmVudCIsICJwZXJzb25hbGJhciIsICJwa2NzMTEiLAogICAgInJldHVyblZhbHVlIiwgInNjcmVlbiIsICJzY3JvbGxiYXJzIiwgInNjcm9sbE1heFgiLCAic2Nyb2xsTWF4WSIsCiAgICAic2VsZiIsICJzZXNzaW9uU3RvcmFnZSIsICJzaWRlYmFyIiwgInN0YXR1cyIsICJzdGF0dXNiYXIiLCAidG9vbGJhciIsCiAgICAidG9wIiwgIndpbmRvdyIsCgogICAgLy8gV2luZG93IG1ldGhvZHMgKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0RPTS93aW5kb3cpCiAgICAiYWxlcnQiLCAiYWRkRXZlbnRMaXN0ZW5lciIsICJhdG9iIiwgImJhY2siLCAiYmx1ciIsICJidG9hIiwKICAgICJjYXB0dXJlRXZlbnRzIiwgImNsZWFySW50ZXJ2YWwiLCAiY2xlYXJUaW1lb3V0IiwgImNsb3NlIiwgImNvbmZpcm0iLAogICAgImRpc2FibGVFeHRlcm5hbENhcHR1cmUiLCAiZGlzcGF0Y2hFdmVudCIsICJkdW1wIiwKICAgICJlbmFibGVFeHRlcm5hbENhcHR1cmUiLCAiZXNjYXBlIiwgImZpbmQiLCAiZm9jdXMiLCAiZm9yd2FyZCIsCiAgICAiR2Vja29BY3RpdmVYT2JqZWN0IiwgImdldEF0dGVudGlvbiIsICJnZXRBdHRlbnRpb25XaXRoQ3ljbGVDb3VudCIsCiAgICAiZ2V0Q29tcHV0ZWRTdHlsZSIsICJnZXRTZWxlY3Rpb24iLCAiaG9tZSIsICJtYXhpbWl6ZSIsICJtaW5pbWl6ZSIsCiAgICAibW92ZUJ5IiwgIm1vdmVUbyIsICJvcGVuIiwgIm9wZW5EaWFsb2ciLCAicG9zdE1lc3NhZ2UiLCAicHJpbnQiLAogICAgInByb21wdCIsICJRdWVyeUludGVyZmFjZSIsICJyZWxlYXNlRXZlbnRzIiwgInJlbW92ZUV2ZW50TGlzdGVuZXIiLAogICAgInJlc2l6ZUJ5IiwgInJlc2l6ZVRvIiwgInJlc3RvcmUiLCAicm91dGVFdmVudCIsICJzY3JvbGwiLCAic2Nyb2xsQnkiLAogICAgInNjcm9sbEJ5TGluZXMiLCAic2Nyb2xsQnlQYWdlcyIsICJzY3JvbGxUbyIsICJzZXRJbnRlcnZhbCIsCiAgICAic2V0UmVzaXplYWJsZSIsICJzZXRUaW1lb3V0IiwgInNob3dNb2RhbERpYWxvZyIsICJzaXplVG9Db250ZW50IiwKICAgICJzdG9wIiwgInV1ZXNjYXBlIiwgInVwZGF0ZUNvbW1hbmRzIiwgIlhQQ05hdGl2ZVdyYXBwZXIiLAogICAgIlhQQ1NhZmVKU09qYmVjdFdyYXBwZXIiLAoKICAgIC8vIE1vemlsbGEgV2luZG93IGV2ZW50IGhhbmRsZXJzLCBzYW1lIGNpdGUKICAgICJvbmFib3J0IiwgIm9uYmVmb3JldW5sb2FkIiwgIm9uY2hhbmdlIiwgIm9uY2xpY2siLCAib25jbG9zZSIsCiAgICAib25jb250ZXh0bWVudSIsICJvbmRyYWdkcm9wIiwgIm9uZXJyb3IiLCAib25mb2N1cyIsICJvbmhhc2hjaGFuZ2UiLAogICAgIm9ua2V5ZG93biIsICJvbmtleXByZXNzIiwgIm9ua2V5dXAiLCAib25sb2FkIiwgIm9ubW91c2Vkb3duIiwKICAgICJvbm1vdXNlbW92ZSIsICJvbm1vdXNlb3V0IiwgIm9ubW91c2VvdmVyIiwgIm9ubW91c2V1cCIsCiAgICAib25tb3pvcmllbnRhdGlvbiIsICJvbnBhaW50IiwgIm9ucmVzZXQiLCAib25yZXNpemUiLCAib25zY3JvbGwiLAogICAgIm9uc2VsZWN0IiwgIm9uc3VibWl0IiwgIm9udW5sb2FkIiwKCiAgICAvLyBTYWZhcmkgV2ViIENvbnRlbnQgR3VpZGUKICAgIC8vIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xpYnJhcnkvc2FmYXJpLyNkb2N1bWVudGF0aW9uL0FwcGxlQXBwbGljYXRpb25zL1JlZmVyZW5jZS9TYWZhcmlXZWJDb250ZW50L1NhZmFyaVdlYkNvbnRlbnQucGRmCiAgICAvLyBXZWJLaXQgV2luZG93IG1lbWJlciBkYXRhLCBmcm9tIFdlYktpdCBET00gUmVmZXJlbmNlCiAgICAvLyAoaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vc2FmYXJpL2xpYnJhcnkvZG9jdW1lbnRhdGlvbi9BcHBsZUFwcGxpY2F0aW9ucy9SZWZlcmVuY2UvV2ViS2l0RE9NUmVmL0RPTVdpbmRvd19pZGwvQ2xhc3Nlcy9ET01XaW5kb3cvaW5kZXguaHRtbCkKICAgICJvbnRvdWNoY2FuY2VsIiwgIm9udG91Y2hlbmQiLCAib250b3VjaG1vdmUiLCAib250b3VjaHN0YXJ0IiwKICAgICJvbmdlc3R1cmVzdGFydCIsICJvbmdlc3R1cmVjaGFuZ2UiLCAib25nZXN0dXJlZW5kIiwKCiAgICAvLyBleHRyYSB3aW5kb3cgbWV0aG9kcwogICAgInVuZXZhbCIsCgogICAgLy8ga2V5d29yZHMgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vTmV3X2luX0phdmFTY3JpcHRfMS43LAogICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vTmV3X2luX0phdmFTY3JpcHRfMS44LjEKICAgICJnZXRQcm90b3R5cGVPZiIsICJsZXQiLCAieWllbGQiLAoKICAgIC8vIElFIG1ldGhvZHMKICAgIC8vIChodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzU4NzMoVlMuODUpLmFzcHgjKQogICAgImF0dGFjaEV2ZW50IiwgImNsaWVudEluZm9ybWF0aW9uIiwgImNsaXBib2FyZERhdGEiLCAiY3JlYXRlUG9wdXAiLAogICAgImRpYWxvZ0hlaWdodCIsICJkaWFsb2dMZWZ0IiwgImRpYWxvZ1RvcCIsICJkaWFsb2dXaWR0aCIsCiAgICAib25hZnRlcnByaW50IiwgIm9uYmVmb3JlZGVhY3RpdmF0ZSIsICJvbmJlZm9yZXByaW50IiwKICAgICJvbmNvbnRyb2xzZWxlY3QiLCAib25kZWFjdGl2YXRlIiwgIm9uaGVscCIsICJvbnJlc2l6ZWVuZCIsCgogICAgLy8gQ29tbW9uIGJyb3dzZXItZGVmaW5lZCBpZGVudGlmaWVycyBub3QgZGVmaW5lZCBpbiBFQ01BU2NyaXB0CiAgICAiZXZlbnQiLCAiZXh0ZXJuYWwiLCAiRGVidWciLCAiRW51bWVyYXRvciIsICJHbG9iYWwiLCAiSW1hZ2UiLAogICAgIkFjdGl2ZVhPYmplY3QiLCAiVkJBcnJheSIsICJDb21wb25lbnRzIiwKCiAgICAvLyBGdW5jdGlvbnMgY29tbW9ubHkgZGVmaW5lZCBvbiBPYmplY3QKICAgICJ0b1N0cmluZyIsICJnZXRDbGFzcyIsICJjb25zdHJ1Y3RvciIsICJwcm90b3R5cGUiLCAidmFsdWVPZiIsCgogICAgLy8gQ2xpZW50LXNpZGUgSmF2YVNjcmlwdCBpZGVudGlmaWVycwogICAgIkFuY2hvciIsICJBcHBsZXQiLCAiQXR0ciIsICJDYW52YXMiLCAiQ2FudmFzR3JhZGllbnQiLAogICAgIkNhbnZhc1BhdHRlcm4iLCAiQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIiwgIkNEQVRBU2VjdGlvbiIsCiAgICAiQ2hhcmFjdGVyRGF0YSIsICJDb21tZW50IiwgIkNTUzJQcm9wZXJ0aWVzIiwgIkNTU1J1bGUiLAogICAgIkNTU1N0eWxlU2hlZXQiLCAiRG9jdW1lbnQiLCAiRG9jdW1lbnRGcmFnbWVudCIsICJEb2N1bWVudFR5cGUiLAogICAgIkRPTUV4Y2VwdGlvbiIsICJET01JbXBsZW1lbnRhdGlvbiIsICJET01QYXJzZXIiLCAiRWxlbWVudCIsICJFdmVudCIsCiAgICAiRXh0ZXJuYWxJbnRlcmZhY2UiLCAiRmxhc2hQbGF5ZXIiLCAiRm9ybSIsICJGcmFtZSIsICJIaXN0b3J5IiwKICAgICJIVE1MQ29sbGVjdGlvbiIsICJIVE1MRG9jdW1lbnQiLCAiSFRNTEVsZW1lbnQiLCAiSUZyYW1lIiwgIkltYWdlIiwKICAgICJJbnB1dCIsICJKU09iamVjdCIsICJLZXlFdmVudCIsICJMaW5rIiwgIkxvY2F0aW9uIiwgIk1pbWVUeXBlIiwKICAgICJNb3VzZUV2ZW50IiwgIk5hdmlnYXRvciIsICJOb2RlIiwgIk5vZGVMaXN0IiwgIk9wdGlvbiIsICJQbHVnaW4iLAogICAgIlByb2Nlc3NpbmdJbnN0cnVjdGlvbiIsICJSYW5nZSIsICJSYW5nZUV4Y2VwdGlvbiIsICJTY3JlZW4iLCAiU2VsZWN0IiwKICAgICJUYWJsZSIsICJUYWJsZUNlbGwiLCAiVGFibGVSb3ciLCAiVGFibGVTZWxlY3Rpb24iLCAiVGV4dCIsICJUZXh0QXJlYSIsCiAgICAiVUlFdmVudCIsICJXaW5kb3ciLCAiWE1MSHR0cFJlcXVlc3QiLCAiWE1MU2VyaWFsaXplciIsCiAgICAiWFBhdGhFeGNlcHRpb24iLCAiWFBhdGhSZXN1bHQiLCAiWFNMVFByb2Nlc3NvciIsCgogICAgLy8gVGhlc2Uga2V5d29yZHMgdHJpZ2dlciB0aGUgbG9hZGluZyBvZiB0aGUgamF2YS1wbHVnaW4uIEZvciB0aGUKICAgIC8vIG5leHQtZ2VuZXJhdGlvbiBwbHVnaW4sIHRoaXMgcmVzdWx0cyBpbiBzdGFydGluZyBhIG5ldyBKYXZhIHByb2Nlc3MuCiAgICAiamF2YSIsICJQYWNrYWdlcyIsICJuZXRzY2FwZSIsICJzdW4iLCAiSmF2YU9iamVjdCIsICJKYXZhQ2xhc3MiLAogICAgIkphdmFBcnJheSIsICJKYXZhTWVtYmVyIiwKCiAgICAvLyBFUzYgY29sbGVjdGlvbnMuCiAgICAiTWFwIiwgIlNldCIsCiAgXTsKCiAgc3RhdGljIGNvbnN0IExpc3Q8U3RyaW5nPiByZXNlcnZlZEdsb2JhbE9iamVjdE5hbWVzID0gY29uc3QgPFN0cmluZz5bCiAgICAiQSIsCiAgICAiQiIsCiAgICAiQyIsIC8vIEdsb2JhbCBvYmplY3QgZm9yICpDKm9uc3RhbnRzLgogICAgIkQiLAogICAgIkUiLAogICAgIkYiLAogICAgIkciLAogICAgIkgiLCAvLyBHbG9iYWwgb2JqZWN0IGZvciBpbnRlcm5hbCAoKkgqZWxwZXIpIGxpYnJhcmllcy4KICAgIC8vIEkgaXMgdXNlZCBmb3IgdXNlZCBmb3IgdGhlIElzb2xhdGUgZnVuY3Rpb24uCiAgICAiSiIsIC8vIEdsb2JhbCBvYmplY3QgZm9yIHRoZSBpbnRlcmNlcHRvciBsaWJyYXJ5LgogICAgIksiLAogICAgIkwiLAogICAgIk0iLAogICAgIk4iLAogICAgIk8iLAogICAgIlAiLCAvLyBHbG9iYWwgb2JqZWN0IGZvciBvdGhlciAqUCpsYXRmb3JtIGxpYnJhcmllcy4KICAgICJRIiwKICAgICJSIiwKICAgICJTIiwKICAgICJUIiwKICAgICJVIiwKICAgICJWIiwKICAgICJXIiwgLy8gR2xvYmFsIG9iamVjdCBmb3IgKlcqZWIgbGlicmFyaWVzIChkYXJ0Omh0bWwpLgogICAgIlgiLAogICAgIlkiLAogICAgIloiLAogIF07CgogIHN0YXRpYyBjb25zdCBMaXN0PFN0cmluZz4gcmVzZXJ2ZWRHbG9iYWxIZWxwZXJGdW5jdGlvbnMgPSBjb25zdCA8U3RyaW5nPlsKICAgICJpbml0IiwKICAgICJJc29sYXRlIiwKICBdOwoKICBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IHVzZXJHbG9iYWxPYmplY3RzID0KICAgICAgbmV3IExpc3QuZnJvbShyZXNlcnZlZEdsb2JhbE9iamVjdE5hbWVzKQogICAgICAgIC4ucmVtb3ZlKCdDJykKICAgICAgICAuLnJlbW92ZSgnSCcpCiAgICAgICAgLi5yZW1vdmUoJ0onKQogICAgICAgIC4ucmVtb3ZlKCdQJykKICAgICAgICAuLnJlbW92ZSgnVycpOwoKICBTZXQ8U3RyaW5nPiBfanNSZXNlcnZlZCA9IG51bGw7CgogIC8vLyBOYW1lcyB0aGF0IGNhbm5vdCBiZSB1c2VkIGJ5IG1lbWJlcnMsIHRvcCBsZXZlbCBhbmQgc3RhdGljCiAgLy8vIG1ldGhvZHMuCiAgU2V0PFN0cmluZz4gZ2V0IGpzUmVzZXJ2ZWQgewogICAgaWYgKF9qc1Jlc2VydmVkID09IG51bGwpIHsKICAgICAgX2pzUmVzZXJ2ZWQgPSBuZXcgU2V0PFN0cmluZz4oKTsKICAgICAgX2pzUmVzZXJ2ZWQuYWRkQWxsKGphdmFTY3JpcHRLZXl3b3Jkcyk7CiAgICAgIF9qc1Jlc2VydmVkLmFkZEFsbChyZXNlcnZlZFByb3BlcnR5U3ltYm9scyk7CiAgICB9CiAgICByZXR1cm4gX2pzUmVzZXJ2ZWQ7CiAgfQoKICBTZXQ8U3RyaW5nPiBfanNWYXJpYWJsZVJlc2VydmVkID0gbnVsbDsKCiAgLy8vIE5hbWVzIHRoYXQgY2Fubm90IGJlIHVzZWQgYnkgbG9jYWwgdmFyaWFibGVzIGFuZCBwYXJhbWV0ZXJzLgogIFNldDxTdHJpbmc+IGdldCBqc1ZhcmlhYmxlUmVzZXJ2ZWQgewogICAgaWYgKF9qc1ZhcmlhYmxlUmVzZXJ2ZWQgPT0gbnVsbCkgewogICAgICBfanNWYXJpYWJsZVJlc2VydmVkID0gbmV3IFNldDxTdHJpbmc+KCk7CiAgICAgIF9qc1ZhcmlhYmxlUmVzZXJ2ZWQuYWRkQWxsKGphdmFTY3JpcHRLZXl3b3Jkcyk7CiAgICAgIF9qc1ZhcmlhYmxlUmVzZXJ2ZWQuYWRkQWxsKHJlc2VydmVkUHJvcGVydHlTeW1ib2xzKTsKICAgICAgX2pzVmFyaWFibGVSZXNlcnZlZC5hZGRBbGwocmVzZXJ2ZWRHbG9iYWxTeW1ib2xzKTsKICAgICAgX2pzVmFyaWFibGVSZXNlcnZlZC5hZGRBbGwocmVzZXJ2ZWRHbG9iYWxPYmplY3ROYW1lcyk7CiAgICAgIC8vIDI2IGxldHRlcnMgaW4gdGhlIGFscGhhYmV0LCAyNSBub3QgY291bnRpbmcgSS4KICAgICAgYXNzZXJ0KHJlc2VydmVkR2xvYmFsT2JqZWN0TmFtZXMubGVuZ3RoID09IDI1KTsKICAgICAgX2pzVmFyaWFibGVSZXNlcnZlZC5hZGRBbGwocmVzZXJ2ZWRHbG9iYWxIZWxwZXJGdW5jdGlvbnMpOwogICAgfQogICAgcmV0dXJuIF9qc1ZhcmlhYmxlUmVzZXJ2ZWQ7CiAgfQoKICBmaW5hbCBTdHJpbmcgYXN5bmNQcmVmaXggPSByIiRhc3luYyQiOwogIGZpbmFsIFN0cmluZyBzdGF0aWNTdGF0ZUhvbGRlciA9IHInJCc7CiAgZmluYWwgU3RyaW5nIGdldHRlclByZWZpeCA9IHInZ2V0JCc7CiAgZmluYWwgU3RyaW5nIGxhenlHZXR0ZXJQcmVmaXggPSByJyRnZXQkJzsKICBmaW5hbCBTdHJpbmcgc2V0dGVyUHJlZml4ID0gcidzZXQkJzsKICBmaW5hbCBTdHJpbmcgc3VwZXJQcmVmaXggPSByJ3N1cGVyJCc7CiAgZmluYWwgU3RyaW5nIG1ldGFkYXRhRmllbGQgPSAnQCc7CiAgZmluYWwgU3RyaW5nIGNhbGxQcmVmaXggPSAnY2FsbCc7CiAgU3RyaW5nIGdldCBjYWxsQ2F0Y2hBbGxOYW1lID0+IHInY2FsbConOwogIGZpbmFsIFN0cmluZyBjYWxsTmFtZUZpZWxkID0gcickY2FsbE5hbWUnOwogIGZpbmFsIFN0cmluZyBzdHViTmFtZUZpZWxkID0gcickc3R1Yk5hbWUnOwogIGZpbmFsIFN0cmluZyByZWZsZWN0YWJsZUZpZWxkID0gcickcmVmbGVjdGFibGUnOwogIGZpbmFsIFN0cmluZyByZWZsZWN0aW9uSW5mb0ZpZWxkID0gcickcmVmbGVjdGlvbkluZm8nOwogIGZpbmFsIFN0cmluZyByZWZsZWN0aW9uTmFtZUZpZWxkID0gcickcmVmbGVjdGlvbk5hbWUnOwogIGZpbmFsIFN0cmluZyBtZXRhZGF0YUluZGV4RmllbGQgPSByJyRtZXRhZGF0YUluZGV4JzsKICBTdHJpbmcgZ2V0IHJlcXVpcmVkUGFyYW1ldGVyRmllbGQgPT4gcickcmVxdWlyZWRBcmdDb3VudCc7CiAgU3RyaW5nIGdldCBkZWZhdWx0VmFsdWVzRmllbGQgPT4gcickZGVmYXVsdFZhbHVlcyc7CiAgZmluYWwgU3RyaW5nIG1ldGhvZHNXaXRoT3B0aW9uYWxBcmd1bWVudHNGaWVsZCA9CiAgICAgIHInJG1ldGhvZHNXaXRoT3B0aW9uYWxBcmd1bWVudHMnOwogIGZpbmFsIFN0cmluZyBkZWZlcnJlZEFjdGlvbiA9IHInJGRlZmVycmVkQWN0aW9uJzsKCiAgZmluYWwgU3RyaW5nIGNsYXNzRGVzY3JpcHRvclByb3BlcnR5ID0gcideJzsKCiAgLy8vIFRoZSBub24tbWluaWZ5aW5nIG5hbWVyJ3MgW2NhbGxQcmVmaXhdIHdpdGggYSBkb2xsYXIgYWZ0ZXIgaXQuCiAgc3RhdGljIGNvbnN0IFN0cmluZyBfY2FsbFByZWZpeERvbGxhciA9IHInY2FsbCQnOwoKICBzdGF0aWMgZmluYWwganNBc3QuTmFtZSBfbGl0ZXJhbERvbGxhciA9IG5ldyBTdHJpbmdCYWNrZWROYW1lKHInJCcpOwogIHN0YXRpYyBmaW5hbCBqc0FzdC5OYW1lIF9saXRlcmFsVW5kZXJzY29yZSA9IG5ldyBTdHJpbmdCYWNrZWROYW1lKCdfJyk7CiAgc3RhdGljIGZpbmFsIGpzQXN0Lk5hbWUgbGl0ZXJhbFBsdXMgPSBuZXcgU3RyaW5nQmFja2VkTmFtZSgnKycpOwogIHN0YXRpYyBmaW5hbCBqc0FzdC5OYW1lIF9saXRlcmFsRHluYW1pYyA9IG5ldyBTdHJpbmdCYWNrZWROYW1lKCJkeW5hbWljIik7CgogIGpzQXN0Lk5hbWUgX2xpdGVyYWxBc3luY1ByZWZpeDsKICBqc0FzdC5OYW1lIF9saXRlcmFsR2V0dGVyUHJlZml4OwogIGpzQXN0Lk5hbWUgX2xpdGVyYWxTZXR0ZXJQcmVmaXg7CgogIGpzQXN0Lk5hbWUgX3N0YXRpY3NQcm9wZXJ0eU5hbWU7CgogIGpzQXN0Lk5hbWUgZ2V0IHN0YXRpY3NQcm9wZXJ0eU5hbWUgPT4KICAgICAgX3N0YXRpY3NQcm9wZXJ0eU5hbWUgPz89IG5ldyBTdHJpbmdCYWNrZWROYW1lKCdzdGF0aWMnKTsKCiAgZmluYWwgU3RyaW5nIHJ0aU5hbWUgPSByJyR0aSc7CgogIGpzQXN0Lk5hbWUgX3J0aUZpZWxkSnNOYW1lOwogIGpzQXN0Lk5hbWUgZ2V0IHJ0aUZpZWxkSnNOYW1lID0+CiAgICAgIF9ydGlGaWVsZEpzTmFtZSA/Pz0gbmV3IFN0cmluZ0JhY2tlZE5hbWUocnRpTmFtZSk7CgogIC8vIE5hbWUgb2YgcHJvcGVydHkgaW4gYSBjbGFzcyBkZXNjcmlwdGlvbiBmb3IgdGhlIG5hdGl2ZSBkaXNwYXRjaCBtZXRhZGF0YS4KICBmaW5hbCBTdHJpbmcgbmF0aXZlU3BlY1Byb3BlcnR5ID0gJyUnOwoKICBzdGF0aWMgZmluYWwgUmVnRXhwIElERU5USUZJRVIgPSBuZXcgUmVnRXhwKHInXltBLVphLXpfJF1bQS1aYS16MC05XyRdKiQnKTsKICBzdGF0aWMgZmluYWwgUmVnRXhwIE5PTl9JREVOVElGSUVSX0NIQVIgPSBuZXcgUmVnRXhwKHInW15BLVphLXpfMC05JF0nKTsKCiAgZmluYWwgSkNsb3NlZFdvcmxkIF9jbG9zZWRXb3JsZDsKICBmaW5hbCBDb2RlZ2VuV29ybGRCdWlsZGVyIF9jb2RlZ2VuV29ybGRCdWlsZGVyOwoKICBSdW50aW1lVHlwZXNFbmNvZGVyIF9ydGlFbmNvZGVyOwogIFJ1bnRpbWVUeXBlc0VuY29kZXIgZ2V0IHJ0aUVuY29kZXIgewogICAgYXNzZXJ0KF9ydGlFbmNvZGVyICE9IG51bGwsCiAgICAgICAgZmFpbGVkQXQoTk9fTE9DQVRJT05fU1BBTk5BQkxFLCAiTmFtZXIucnRpRW5jb2RlciBoYXMgbm90IGJlZW4gc2V0LiIpKTsKICAgIHJldHVybiBfcnRpRW5jb2RlcjsKICB9CgogIHZvaWQgc2V0IHJ0aUVuY29kZXIoUnVudGltZVR5cGVzRW5jb2RlciB2YWx1ZSkgewogICAgYXNzZXJ0KAogICAgICAgIF9ydGlFbmNvZGVyID09IG51bGwsCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwgIk5hbWVyLnJ0aUVuY29kZXIgaGFzIGFscmVhZHkgYmVlbiBzZXQuIikpOwogICAgX3J0aUVuY29kZXIgPSB2YWx1ZTsKICB9CgogIC8vLyBVc2VkIGRpc2FtYmlndWF0ZWQgbmFtZXMgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGlzc3VlZCBieQogIC8vLyBbX2Rpc2FtYmlndWF0ZUdsb2JhbF0sIGFuZCBbX2Rpc2FtYmlndWF0ZUludGVybmFsR2xvYmFsXS4KICAvLy8KICAvLy8gQWx0aG91Z2ggZ2xvYmFsIG5hbWVzIGFyZSBkaXN0cmlidXRlZCBhY3Jvc3MgYSBudW1iZXIgb2YgZ2xvYmFsIG9iamVjdHMsCiAgLy8vIChzZWUgW2dsb2JhbE9iamVjdEZvcl0pLCB3ZSBjdXJyZW50bHkgdXNlIGEgc2luZ2xlIG5hbWVzcGFjZSBmb3IgYWxsIHRoZXNlCiAgLy8vIG5hbWVzLgogIGZpbmFsIE5hbWluZ1Njb3BlIGdsb2JhbFNjb3BlID0gTmFtaW5nU2NvcGUoKTsKICBmaW5hbCBNYXA8RW50aXR5LCBqc0FzdC5OYW1lPiB1c2VyR2xvYmFscyA9IHt9OwogIC8vIFt1c2VyR2xvYmFsc1NlY29uZE5hbWVdIGlzIHVzZWQgd2hlbiBhbiBlbnRpdHkgaGFzIGEgc2Vjb25kIG5hbWUsIGUuZy4gYQogIC8vIGxhemlseSBpbml0aWFsaXplZCBzdGF0aWMgdmFyaWFibGUgaGFzIGEgbG9jYXRpb24gYW5kIGEgZ2V0dGVyLgogIGZpbmFsIE1hcDxFbnRpdHksIGpzQXN0Lk5hbWU+IHVzZXJHbG9iYWxzU2Vjb25kTmFtZSA9IHt9OwogIGZpbmFsIE1hcDxTdHJpbmcsIGpzQXN0Lk5hbWU+IGludGVybmFsR2xvYmFscyA9IHt9OwoKICBfcmVnaXN0ZXJOYW1lKAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCwganNBc3QuTmFtZSBqc05hbWUsIFN0cmluZyBvcmlnaW5hbE5hbWUpIHsKICAgIC8vIE5vbi1maW5hbGl6ZWQgbmFtZXMgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvdXRwdXQgcHJvZ3JhbQogICAgaWYgKGpzTmFtZSBpcyBUb2tlbk5hbWUgJiYgIWpzTmFtZS5pc0ZpbmFsaXplZCkgcmV0dXJuOwogICAgbWFwW2pzTmFtZS5uYW1lXSA9IG9yaWdpbmFsTmFtZTsKICAgIHZhciBnZXR0ZXJOYW1lID0gdXNlckdldHRlcnNbanNOYW1lXTsKICAgIGlmIChnZXR0ZXJOYW1lICE9IG51bGwpIG1hcFtnZXR0ZXJOYW1lLm5hbWVdID0gb3JpZ2luYWxOYW1lOwogICAgdmFyIHNldHRlck5hbWUgPSB1c2VyU2V0dGVyc1tqc05hbWVdOwogICAgaWYgKHNldHRlck5hbWUgIT0gbnVsbCkgbWFwW3NldHRlck5hbWUubmFtZV0gPSBvcmlnaW5hbE5hbWU7CiAgfQoKICBNYXA8U3RyaW5nLCBTdHJpbmc+IGNyZWF0ZU1pbmlmaWVkR2xvYmFsTmFtZU1hcCgpIHsKICAgIHZhciBtYXAgPSA8U3RyaW5nLCBTdHJpbmc+e307CiAgICB1c2VyR2xvYmFscy5mb3JFYWNoKChlbnRpdHksIGpzTmFtZSkgewogICAgICBfcmVnaXN0ZXJOYW1lKG1hcCwganNOYW1lLCBlbnRpdHkubmFtZSk7CiAgICB9KTsKICAgIHVzZXJHbG9iYWxzU2Vjb25kTmFtZS5mb3JFYWNoKChlbnRpdHksIGpzTmFtZSkgewogICAgICBfcmVnaXN0ZXJOYW1lKG1hcCwganNOYW1lLCBlbnRpdHkubmFtZSk7CiAgICB9KTsKICAgIGludGVybmFsR2xvYmFscy5mb3JFYWNoKChuYW1lLCBqc05hbWUpIHsKICAgICAgX3JlZ2lzdGVyTmFtZShtYXAsIGpzTmFtZSwgbmFtZSk7CiAgICB9KTsKICAgIHJldHVybiBtYXA7CiAgfQoKICAvLy8gVXNlZCBkaXNhbWJpZ3VhdGVkIG5hbWVzIGluIHRoZSBpbnN0YW5jZSBuYW1lc3BhY2UsIGlzc3VlZCBieQogIC8vLyBbX2Rpc2FtYmlndWF0ZU1lbWJlcl0sIFtfZGlzYW1iaWd1YXRlSW50ZXJuYWxNZW1iZXJdLAogIC8vLyBbX2Rpc2FtYmlndWF0ZU9wZXJhdG9yXSwgYW5kIFtyZXNlcnZlUHVibGljTWVtYmVyTmFtZV0uCiAgZmluYWwgTmFtaW5nU2NvcGUgaW5zdGFuY2VTY29wZSA9IE5hbWluZ1Njb3BlKCk7CiAgZmluYWwgTWFwPFN0cmluZywganNBc3QuTmFtZT4gdXNlckluc3RhbmNlTWVtYmVycyA9IEhhc2hNYXAoKTsKICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHVzZXJJbnN0YW5jZU1lbWJlcnNPcmlnaW5hbE5hbWUgPSBIYXNoTWFwKCk7CiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwganNBc3QuTmFtZT4gaW50ZXJuYWxJbnN0YW5jZU1lbWJlcnMgPSBIYXNoTWFwKCk7CiAgZmluYWwgTWFwPFN0cmluZywganNBc3QuTmFtZT4gdXNlckluc3RhbmNlT3BlcmF0b3JzID0gSGFzaE1hcCgpOwogIGZpbmFsIE1hcDxqc0FzdC5OYW1lLCBqc0FzdC5OYW1lPiB1c2VyR2V0dGVycyA9IEhhc2hNYXAoKTsKICBmaW5hbCBNYXA8anNBc3QuTmFtZSwganNBc3QuTmFtZT4gdXNlclNldHRlcnMgPSBIYXNoTWFwKCk7CgogIE1hcDxTdHJpbmcsIFN0cmluZz4gY3JlYXRlTWluaWZpZWRJbnN0YW5jZU5hbWVNYXAoKSB7CiAgICB2YXIgbWFwID0gPFN0cmluZywgU3RyaW5nPnt9OwogICAgaW50ZXJuYWxJbnN0YW5jZU1lbWJlcnMuZm9yRWFjaCgoZW50aXR5LCBqc05hbWUpIHsKICAgICAgX3JlZ2lzdGVyTmFtZShtYXAsIGpzTmFtZSwgZW50aXR5Lm5hbWUpOwogICAgfSk7CiAgICB1c2VySW5zdGFuY2VNZW1iZXJzLmZvckVhY2goKG5hbWUsIGpzTmFtZSkgewogICAgICBfcmVnaXN0ZXJOYW1lKG1hcCwganNOYW1lLCB1c2VySW5zdGFuY2VNZW1iZXJzT3JpZ2luYWxOYW1lW25hbWVdID8/IG5hbWUpOwogICAgfSk7CgogICAgLy8gVE9ETyhzaWdtdW5kKTogcmV2ZXJzZSB0aGUgb3BlcmF0b3IgbmFtZXMgYmFjayB0byB0aGUgb3JpZ2luYWwgRGFydAogICAgLy8gbmFtZXMuCiAgICB1c2VySW5zdGFuY2VPcGVyYXRvcnMuZm9yRWFjaCgobmFtZSwganNOYW1lKSB7CiAgICAgIF9yZWdpc3Rlck5hbWUobWFwLCBqc05hbWUsIG5hbWUpOwogICAgfSk7CiAgICByZXR1cm4gbWFwOwogIH0KCiAgLy8vIFVzZWQgdG8gZGlzYW1iaWd1YXRlIG5hbWVzIGZvciBjb25zdGFudHMgaW4gW2NvbnN0YW50TmFtZV0uCiAgZmluYWwgTmFtaW5nU2NvcGUgX2NvbnN0YW50U2NvcGUgPSBuZXcgTmFtaW5nU2NvcGUoKTsKCiAgLy8vIFVzZWQgdG8gc3RvcmUgc2NvcGVzIGZvciBpbnN0YW5jZXMgb2YgW1ByaXZhdGVseU5hbWVkSnNFbnRpdHldCiAgZmluYWwgTWFwPEVudGl0eSwgTmFtaW5nU2NvcGU+IF9wcml2YXRlTmFtaW5nU2NvcGVzID0ge307CgogIGZpbmFsIE1hcDxTdHJpbmcsIGludD4gcG9wdWxhck5hbWVDb3VudGVycyA9IHt9OwoKICBmaW5hbCBNYXA8TGlicmFyeUVudGl0eSwgU3RyaW5nPiBsaWJyYXJ5TG9uZ05hbWVzID0gSGFzaE1hcCgpOwoKICBmaW5hbCBNYXA8Q29uc3RhbnRWYWx1ZSwganNBc3QuTmFtZT4gX2NvbnN0YW50TmFtZXMgPSBIYXNoTWFwKCk7CiAgZmluYWwgTWFwPENvbnN0YW50VmFsdWUsIFN0cmluZz4gX2NvbnN0YW50TG9uZ05hbWVzID0ge307CiAgQ29uc3RhbnRDYW5vbmljYWxIYXNoZXIgX2NvbnN0YW50SGFzaGVyOwoKICAvLy8gTWFwcyBwcml2YXRlIG5hbWVzIHRvIGEgbGlicmFyeSB0aGF0IG1heSB1c2UgdGhhdCBuYW1lIHdpdGhvdXQgcHJlZml4aW5nCiAgLy8vIGl0c2VsZi4gVXNlZCBmb3IgYnVpbGRpbmcgcHJvcG9zZWQgbmFtZXMuCiAgZmluYWwgTWFwPFN0cmluZywgTGlicmFyeUVudGl0eT4gc2hvcnRQcml2YXRlTmFtZU93bmVycyA9IHt9OwoKICAvLy8gVXNlZCB0byBzdG9yZSB1bmlxdWUga2V5cyBmb3IgbGlicmFyeSBuYW1lcy4gS2V5cyBhcmUgbm90IHVzZWQgYXMgbmFtZXMsCiAgLy8vIG5vciBhcmUgdGhleSB2aXNpYmxlIGluIHRoZSBvdXRwdXQuIFRoZSBvbmx5IHNlcnZlIGFzIGFuIGludGVybmFsCiAgLy8vIGtleSBpbnRvIG1hcHMuCiAgZmluYWwgTWFwPExpYnJhcnlFbnRpdHksIFN0cmluZz4gX2xpYnJhcnlLZXlzID0gSGFzaE1hcCgpOwoKICBOYW1lcih0aGlzLl9jbG9zZWRXb3JsZCwgdGhpcy5fY29kZWdlbldvcmxkQnVpbGRlcikgewogICAgX2xpdGVyYWxBc3luY1ByZWZpeCA9IG5ldyBTdHJpbmdCYWNrZWROYW1lKGFzeW5jUHJlZml4KTsKICAgIF9saXRlcmFsR2V0dGVyUHJlZml4ID0gbmV3IFN0cmluZ0JhY2tlZE5hbWUoZ2V0dGVyUHJlZml4KTsKICAgIF9saXRlcmFsU2V0dGVyUHJlZml4ID0gbmV3IFN0cmluZ0JhY2tlZE5hbWUoc2V0dGVyUHJlZml4KTsKICB9CgogIEVsZW1lbnRFbnZpcm9ubWVudCBnZXQgZWxlbWVudEVudmlyb25tZW50ID0+IF9jbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQ7CgogIENvbW1vbkVsZW1lbnRzIGdldCBfY29tbW9uRWxlbWVudHMgPT4gX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzOwoKICBOYXRpdmVEYXRhIGdldCBfbmF0aXZlRGF0YSA9PiBfY2xvc2VkV29ybGQubmF0aXZlRGF0YTsKCiAgU3RyaW5nIGdldCBkZWZlcnJlZE1ldGFkYXRhTmFtZSA9PiAnZGVmZXJyZWRNZXRhZGF0YSc7CiAgU3RyaW5nIGdldCBkZWZlcnJlZFR5cGVzTmFtZSA9PiAnZGVmZXJyZWRUeXBlcyc7CiAgU3RyaW5nIGdldCBpc29sYXRlTmFtZSA9PiAnSXNvbGF0ZSc7CiAgU3RyaW5nIGdldCBpc29sYXRlUHJvcGVydGllc05hbWUgPT4gcickaXNvbGF0ZVByb3BlcnRpZXMnOwogIGpzQXN0Lk5hbWUgZ2V0IG5vU3VjaE1ldGhvZE5hbWUgPT4gaW52b2NhdGlvbk5hbWUoU2VsZWN0b3JzLm5vU3VjaE1ldGhvZF8pOwoKICAvLy8gU29tZSBjbG9zdXJlcyBtdXN0IGNvbnRhaW4gdGhlaXIgbmFtZS4gVGhlIG5hbWUgaXMgc3RvcmVkIGluCiAgLy8vIFtTVEFUSUNfQ0xPU1VSRV9OQU1FX05BTUVdLgogIFN0cmluZyBnZXQgU1RBVElDX0NMT1NVUkVfTkFNRV9OQU1FID0+IHInJG5hbWUnOwogIFN0cmluZyBnZXQgY2xvc3VyZUludm9jYXRpb25TZWxlY3Rvck5hbWUgPT4gSWRlbnRpZmllcnMuY2FsbDsKICBib29sIGdldCBzaG91bGRNaW5pZnkgPT4gZmFsc2U7CgogIE5hbWluZ1Njb3BlIF9nZXRQcml2YXRlU2NvcGVGb3IoUHJpdmF0ZWx5TmFtZWRKU0VudGl0eSBlbnRpdHkpIHsKICAgIHJldHVybiBfcHJpdmF0ZU5hbWluZ1Njb3Blcy5wdXRJZkFic2VudCgKICAgICAgICBlbnRpdHkucm9vdE9mU2NvcGUsICgpID0+IG5ldyBOYW1pbmdTY29wZSgpKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBzdHJpbmcgdGhhdCBpcyB0byBiZSB1c2VkIGFzIHRoZSByZXN1bHQgb2YgYSBjYWxsIHRvCiAgLy8vIFtKU19HRVRfTkFNRV0gYXQgW25vZGVdIHdpdGggYXJndW1lbnQgW25hbWVdLgogIGpzQXN0Lk5hbWUgZ2V0TmFtZUZvckpzR2V0TmFtZShTcGFubmFibGUgc3Bhbm5hYmxlLCBKc0dldE5hbWUgbmFtZSkgewogICAgc3dpdGNoIChuYW1lKSB7CiAgICAgIGNhc2UgSnNHZXROYW1lLkdFVFRFUl9QUkVGSVg6CiAgICAgICAgcmV0dXJuIGFzTmFtZShnZXR0ZXJQcmVmaXgpOwogICAgICBjYXNlIEpzR2V0TmFtZS5TRVRURVJfUFJFRklYOgogICAgICAgIHJldHVybiBhc05hbWUoc2V0dGVyUHJlZml4KTsKICAgICAgY2FzZSBKc0dldE5hbWUuQ0FMTF9QUkVGSVg6CiAgICAgICAgcmV0dXJuIGFzTmFtZShjYWxsUHJlZml4KTsKICAgICAgY2FzZSBKc0dldE5hbWUuQ0FMTF9QUkVGSVgwOgogICAgICAgIHJldHVybiBhc05hbWUoJyR7Y2FsbFByZWZpeH1cJDAnKTsKICAgICAgY2FzZSBKc0dldE5hbWUuQ0FMTF9QUkVGSVgxOgogICAgICAgIHJldHVybiBhc05hbWUoJyR7Y2FsbFByZWZpeH1cJDEnKTsKICAgICAgY2FzZSBKc0dldE5hbWUuQ0FMTF9QUkVGSVgyOgogICAgICAgIHJldHVybiBhc05hbWUoJyR7Y2FsbFByZWZpeH1cJDInKTsKICAgICAgY2FzZSBKc0dldE5hbWUuQ0FMTF9QUkVGSVgzOgogICAgICAgIHJldHVybiBhc05hbWUoJyR7Y2FsbFByZWZpeH1cJDMnKTsKICAgICAgY2FzZSBKc0dldE5hbWUuQ0FMTF9QUkVGSVg0OgogICAgICAgIHJldHVybiBhc05hbWUoJyR7Y2FsbFByZWZpeH1cJDQnKTsKICAgICAgY2FzZSBKc0dldE5hbWUuQ0FMTF9QUkVGSVg1OgogICAgICAgIHJldHVybiBhc05hbWUoJyR7Y2FsbFByZWZpeH1cJDUnKTsKICAgICAgY2FzZSBKc0dldE5hbWUuQ0FMTF9DQVRDSF9BTEw6CiAgICAgICAgcmV0dXJuIGFzTmFtZShjYWxsQ2F0Y2hBbGxOYW1lKTsKICAgICAgY2FzZSBKc0dldE5hbWUuUkVGTEVDVEFCTEU6CiAgICAgICAgcmV0dXJuIGFzTmFtZShyZWZsZWN0YWJsZUZpZWxkKTsKICAgICAgY2FzZSBKc0dldE5hbWUuQ0xBU1NfREVTQ1JJUFRPUl9QUk9QRVJUWToKICAgICAgICByZXR1cm4gYXNOYW1lKGNsYXNzRGVzY3JpcHRvclByb3BlcnR5KTsKICAgICAgY2FzZSBKc0dldE5hbWUuUkVRVUlSRURfUEFSQU1FVEVSX1BST1BFUlRZOgogICAgICAgIHJldHVybiBhc05hbWUocmVxdWlyZWRQYXJhbWV0ZXJGaWVsZCk7CiAgICAgIGNhc2UgSnNHZXROYW1lLkRFRkFVTFRfVkFMVUVTX1BST1BFUlRZOgogICAgICAgIHJldHVybiBhc05hbWUoZGVmYXVsdFZhbHVlc0ZpZWxkKTsKICAgICAgY2FzZSBKc0dldE5hbWUuQ0FMTF9OQU1FX1BST1BFUlRZOgogICAgICAgIHJldHVybiBhc05hbWUoY2FsbE5hbWVGaWVsZCk7CiAgICAgIGNhc2UgSnNHZXROYW1lLkRFRkVSUkVEX0FDVElPTl9QUk9QRVJUWToKICAgICAgICByZXR1cm4gYXNOYW1lKGRlZmVycmVkQWN0aW9uKTsKICAgICAgY2FzZSBKc0dldE5hbWUuT1BFUkFUT1JfQVNfUFJFRklYOgogICAgICAgIHJldHVybiBhc05hbWUob3BlcmF0b3JBc1ByZWZpeCk7CiAgICAgIGNhc2UgSnNHZXROYW1lLlNJR05BVFVSRV9OQU1FOgogICAgICAgIHJldHVybiBhc05hbWUob3BlcmF0b3JTaWduYXR1cmUpOwogICAgICBjYXNlIEpzR2V0TmFtZS5SVElfTkFNRToKICAgICAgICByZXR1cm4gYXNOYW1lKHJ0aU5hbWUpOwogICAgICBjYXNlIEpzR2V0TmFtZS5UWVBFREVGX1RBRzoKICAgICAgICByZXR1cm4gYXNOYW1lKHR5cGVkZWZUYWcpOwogICAgICBjYXNlIEpzR2V0TmFtZS5GVU5DVElPTl9UWVBFX1RBRzoKICAgICAgICByZXR1cm4gYXNOYW1lKGZ1bmN0aW9uVHlwZVRhZyk7CiAgICAgIGNhc2UgSnNHZXROYW1lLkZVTkNUSU9OX1RZUEVfR0VORVJJQ19CT1VORFNfVEFHOgogICAgICAgIHJldHVybiBhc05hbWUoZnVuY3Rpb25UeXBlR2VuZXJpY0JvdW5kc1RhZyk7CiAgICAgIGNhc2UgSnNHZXROYW1lLkZVTkNUSU9OX1RZUEVfVk9JRF9SRVRVUk5fVEFHOgogICAgICAgIHJldHVybiBhc05hbWUoZnVuY3Rpb25UeXBlVm9pZFJldHVyblRhZyk7CiAgICAgIGNhc2UgSnNHZXROYW1lLkZVTkNUSU9OX1RZUEVfUkVUVVJOX1RZUEVfVEFHOgogICAgICAgIHJldHVybiBhc05hbWUoZnVuY3Rpb25UeXBlUmV0dXJuVHlwZVRhZyk7CiAgICAgIGNhc2UgSnNHZXROYW1lLkZVTkNUSU9OX1RZUEVfUkVRVUlSRURfUEFSQU1FVEVSU19UQUc6CiAgICAgICAgcmV0dXJuIGFzTmFtZShmdW5jdGlvblR5cGVSZXF1aXJlZFBhcmFtZXRlcnNUYWcpOwogICAgICBjYXNlIEpzR2V0TmFtZS5GVU5DVElPTl9UWVBFX09QVElPTkFMX1BBUkFNRVRFUlNfVEFHOgogICAgICAgIHJldHVybiBhc05hbWUoZnVuY3Rpb25UeXBlT3B0aW9uYWxQYXJhbWV0ZXJzVGFnKTsKICAgICAgY2FzZSBKc0dldE5hbWUuRlVOQ1RJT05fVFlQRV9OQU1FRF9QQVJBTUVURVJTX1RBRzoKICAgICAgICByZXR1cm4gYXNOYW1lKGZ1bmN0aW9uVHlwZU5hbWVkUGFyYW1ldGVyc1RhZyk7CiAgICAgIGNhc2UgSnNHZXROYW1lLkZVVFVSRV9PUl9UQUc6CiAgICAgICAgcmV0dXJuIGFzTmFtZShmdXR1cmVPclRhZyk7CiAgICAgIGNhc2UgSnNHZXROYW1lLkZVVFVSRV9PUl9UWVBFX0FSR1VNRU5UX1RBRzoKICAgICAgICByZXR1cm4gYXNOYW1lKGZ1dHVyZU9yVHlwZVRhZyk7CiAgICAgIGNhc2UgSnNHZXROYW1lLklTX0lOREVYQUJMRV9GSUVMRF9OQU1FOgogICAgICAgIHJldHVybiBvcGVyYXRvcklzKF9jb21tb25FbGVtZW50cy5qc0luZGV4aW5nQmVoYXZpb3JJbnRlcmZhY2UpOwogICAgICBjYXNlIEpzR2V0TmFtZS5OVUxMX0NMQVNTX1RZUEVfTkFNRToKICAgICAgICByZXR1cm4gcnVudGltZVR5cGVOYW1lKF9jb21tb25FbGVtZW50cy5udWxsQ2xhc3MpOwogICAgICBjYXNlIEpzR2V0TmFtZS5PQkpFQ1RfQ0xBU1NfVFlQRV9OQU1FOgogICAgICAgIHJldHVybiBydW50aW1lVHlwZU5hbWUoX2NvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKTsKICAgICAgY2FzZSBKc0dldE5hbWUuRlVOQ1RJT05fQ0xBU1NfVFlQRV9OQU1FOgogICAgICAgIHJldHVybiBydW50aW1lVHlwZU5hbWUoX2NvbW1vbkVsZW1lbnRzLmZ1bmN0aW9uQ2xhc3MpOwogICAgICBjYXNlIEpzR2V0TmFtZS5GVVRVUkVfQ0xBU1NfVFlQRV9OQU1FOgogICAgICAgIHJldHVybiBydW50aW1lVHlwZU5hbWUoX2NvbW1vbkVsZW1lbnRzLmZ1dHVyZUNsYXNzKTsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBmYWlsZWRBdChzcGFubmFibGUsICdFcnJvcjogTmFtZXIgaGFzIG5vIG5hbWUgZm9yICIkbmFtZSIuJyk7CiAgICB9CiAgfQoKICAvLy8gUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBnaXZlbiBbbmFtZV0uCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCBldmVyeSB1c2Ugc2l0ZSBvZiBhIG5hbWUgaGFzIGEgdW5pcXVlIG5vZGUgc28KICAvLy8gdGhhdCB3ZSBjYW4gcHJvcGVybHkgYXR0cmlidXRlIHNvdXJjZSBpbmZvcm1hdGlvbi4KICBqc0FzdC5OYW1lIF9uZXdSZWZlcmVuY2UoanNBc3QuTmFtZSBuYW1lKSB7CiAgICByZXR1cm4gbmV3IF9OYW1lUmVmZXJlbmNlKG5hbWUpOwogIH0KCiAgLy8vIERpc2FtYmlndWF0ZWQgbmFtZSBmb3IgW2NvbnN0YW50XS4KICAvLy8KICAvLy8gVW5pcXVlIHdpdGhpbiB0aGUgZ2xvYmFsLW1lbWJlciBuYW1lc3BhY2UuCiAganNBc3QuTmFtZSBjb25zdGFudE5hbWUoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgLy8gSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIGdpdmUgbmFtZXMgdG8KICAgIC8vIGZ1bmN0aW9uIGNvbnN0YW50cyBzaW5jZSB0aGUgZnVuY3Rpb24taW1wbGVtZW50YXRpb24gaXRzZWxmIHNlcnZlcyBhcwogICAgLy8gY29uc3RhbnQgYW5kIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseS4KICAgIGFzc2VydCghY29uc3RhbnQuaXNGdW5jdGlvbik7CiAgICBqc0FzdC5OYW1lIHJlc3VsdCA9IF9jb25zdGFudE5hbWVzW2NvbnN0YW50XTsKICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewogICAgICBTdHJpbmcgbG9uZ05hbWUgPSBjb25zdGFudExvbmdOYW1lKGNvbnN0YW50KTsKICAgICAgcmVzdWx0ID0gZ2V0RnJlc2hOYW1lKF9jb25zdGFudFNjb3BlLCBsb25nTmFtZSk7CiAgICAgIF9jb25zdGFudE5hbWVzW2NvbnN0YW50XSA9IHJlc3VsdDsKICAgIH0KICAgIHJldHVybiBfbmV3UmVmZXJlbmNlKHJlc3VsdCk7CiAgfQoKICAvLy8gUHJvcG9zZWQgbmFtZSBmb3IgW2NvbnN0YW50XS4KICBTdHJpbmcgY29uc3RhbnRMb25nTmFtZShDb25zdGFudFZhbHVlIGNvbnN0YW50KSB7CiAgICBTdHJpbmcgbG9uZ05hbWUgPSBfY29uc3RhbnRMb25nTmFtZXNbY29uc3RhbnRdOwogICAgaWYgKGxvbmdOYW1lID09IG51bGwpIHsKICAgICAgX2NvbnN0YW50SGFzaGVyID8/PQogICAgICAgICAgbmV3IENvbnN0YW50Q2Fub25pY2FsSGFzaGVyKHJ0aUVuY29kZXIsIF9jb2RlZ2VuV29ybGRCdWlsZGVyKTsKICAgICAgbG9uZ05hbWUgPSBuZXcgQ29uc3RhbnROYW1pbmdWaXNpdG9yKAogICAgICAgICAgICAgIHJ0aUVuY29kZXIsIF9jb2RlZ2VuV29ybGRCdWlsZGVyLCBfY29uc3RhbnRIYXNoZXIpCiAgICAgICAgICAuZ2V0TmFtZShjb25zdGFudCk7CiAgICAgIF9jb25zdGFudExvbmdOYW1lc1tjb25zdGFudF0gPSBsb25nTmFtZTsKICAgIH0KICAgIHJldHVybiBsb25nTmFtZTsKICB9CgogIFN0cmluZyBicmVha0xhYmVsTmFtZShMYWJlbERlZmluaXRpb24gbGFiZWwpIHsKICAgIHJldHVybiAnXCQke2xhYmVsLmxhYmVsTmFtZX1cJCR7bGFiZWwudGFyZ2V0Lm5lc3RpbmdMZXZlbH0nOwogIH0KCiAgU3RyaW5nIGltcGxpY2l0QnJlYWtMYWJlbE5hbWUoSnVtcFRhcmdldCB0YXJnZXQpIHsKICAgIHJldHVybiAnXCQke3RhcmdldC5uZXN0aW5nTGV2ZWx9JzsKICB9CgogIC8vIFdlIHNvbWV0aW1lcyBoYW5kbGUgY29udGludWUgdGFyZ2V0cyBkaWZmZXJlbnRseSBmcm9tIGJyZWFrIHRhcmdldHMsCiAgLy8gc28gd2UgaGF2ZSBzcGVjaWFsIGNvbnRpbnVlLW9ubHkgbGFiZWxzLgogIFN0cmluZyBjb250aW51ZUxhYmVsTmFtZShMYWJlbERlZmluaXRpb24gbGFiZWwpIHsKICAgIHJldHVybiAnY1wkJHtsYWJlbC5sYWJlbE5hbWV9XCQke2xhYmVsLnRhcmdldC5uZXN0aW5nTGV2ZWx9JzsKICB9CgogIFN0cmluZyBpbXBsaWNpdENvbnRpbnVlTGFiZWxOYW1lKEp1bXBUYXJnZXQgdGFyZ2V0KSB7CiAgICByZXR1cm4gJ2NcJCR7dGFyZ2V0Lm5lc3RpbmdMZXZlbH0nOwogIH0KCiAgLy8vIElmIHRoZSBbb3JpZ2luYWxOYW1lXSBpcyBub3QgcHJpdmF0ZSByZXR1cm5zIFtvcmlnaW5hbE5hbWVdLiBPdGhlcndpc2UKICAvLy8gbWFuZ2xlcyB0aGUgW29yaWdpbmFsTmFtZV0gc28gdGhhdCBlYWNoIGxpYnJhcnkgaGFzIGl0cyBvd24gZGlzdGluZ3Vpc2hlZAogIC8vLyB2ZXJzaW9uIG9mIHRoZSBuYW1lLgogIC8vLwogIC8vLyBBbHRob3VnaCB0aGUgbmFtZSBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgd2l0aGluIGFueSBuYW1lc3BhY2UsCiAgLy8vIGNsYXNoZXMgYXJlIHZlcnkgdW5saWtlbHkgaW4gcHJhY3RpY2UuIFRoZXJlZm9yZSwgaXQgY2FuIGJlIHVzZWQgaW4gY2FzZXMKICAvLy8gd2hlcmUgdW5pcXVlbmVzcyBpcyBuaWNlIGJ1dCBub3QgYSBzdHJpY3QgcmVxdWlyZW1lbnQuCiAgLy8vCiAgLy8vIFRoZSByZXN1bHRpbmcgbmFtZSBpcyBhICpwcm9wb3NlZCBuYW1lKiBhbmQgaXMgbmV2ZXIgbWluaWZpZWQuCiAgU3RyaW5nIHByaXZhdGVOYW1lKE5hbWUgb3JpZ2luYWxOYW1lKSB7CiAgICBTdHJpbmcgdGV4dCA9IG9yaWdpbmFsTmFtZS50ZXh0OwoKICAgIC8vIFB1YmxpYyBuYW1lcyBhcmUgZWFzeS4KICAgIGlmICghb3JpZ2luYWxOYW1lLmlzUHJpdmF0ZSkgcmV0dXJuIHRleHQ7CgogICAgTGlicmFyeUVudGl0eSBsaWJyYXJ5ID0gb3JpZ2luYWxOYW1lLmxpYnJhcnk7CgogICAgLy8gVGhlIGZpcnN0IGxpYnJhcnkgYXNraW5nIGZvciBhIHNob3J0IHByaXZhdGUgbmFtZSB3aW5zLgogICAgTGlicmFyeUVudGl0eSBvd25lciA9CiAgICAgICAgc2hvcnRQcml2YXRlTmFtZU93bmVycy5wdXRJZkFic2VudCh0ZXh0LCAoKSA9PiBsaWJyYXJ5KTsKCiAgICBpZiAob3duZXIgPT0gbGlicmFyeSkgewogICAgICByZXR1cm4gdGV4dDsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE1ha2Ugc3VyZSB0byByZXR1cm4gYSBwcml2YXRlIG5hbWUgdGhhdCBzdGFydHMgd2l0aCBfIHNvIGl0CiAgICAgIC8vIGNhbm5vdCBjbGFzaCB3aXRoIGFueSBwdWJsaWMgbmFtZXMuCiAgICAgIC8vIFRoZSBuYW1lIGlzIHN0aWxsIG5vdCBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSwgc2luY2UgYm90aCB0aGUgbGlicmFyeQogICAgICAvLyBuYW1lIGFuZCBvcmlnaW5hbE5hbWUgY291bGQgY29udGFpbiAkIHN5bWJvbHMgYW5kIGFzIHRoZSBsaWJyYXJ5CiAgICAgIC8vIG5hbWUgaXRzZWxmIG1pZ2h0IGNsYXNoLgogICAgICBTdHJpbmcgbGlicmFyeU5hbWUgPSBfcHJvcG9zZU5hbWVGb3JMaWJyYXJ5KGxpYnJhcnkpOwogICAgICByZXR1cm4gIl8kbGlicmFyeU5hbWVcJCR0ZXh0IjsKICAgIH0KICB9CgogIFN0cmluZyBfcHJvcG9zZU5hbWVGb3JDb25zdHJ1Y3RvckJvZHkoQ29uc3RydWN0b3JCb2R5RW50aXR5IG1ldGhvZCkgewogICAgU3RyaW5nIG5hbWUgPSB1dGlscy5yZWNvbnN0cnVjdENvbnN0cnVjdG9yTmFtZVNvdXJjZVN0cmluZyhtZXRob2QpOwogICAgLy8gV2UgaW5jbHVkZSB0aGUgbWV0aG9kIHN1ZmZpeCBvbiBjb25zdHJ1Y3RvciBib2RpZXMuIEl0IGhhcyBubyBwdXJwb3NlLAogICAgLy8gYnV0IHRoaXMgd2F5IGl0IHByb2R1Y2VzIHRoZSBzYW1lIG5hbWVzIGFzIHByZXZpb3VzIHZlcnNpb25zIG9mIHRoZQogICAgLy8gTmFtZXIgY2xhc3MgZGlkLgogICAgTGlzdDxTdHJpbmc+IHN1ZmZpeCA9IGNhbGxTdWZmaXhGb3JTaWduYXR1cmUobWV0aG9kLnBhcmFtZXRlclN0cnVjdHVyZSk7CiAgICByZXR1cm4gJyRuYW1lXCQke3N1ZmZpeC5qb2luKHInJCcpfSc7CiAgfQoKICAvLy8gTmFtZSBmb3IgYSBjb25zdHJ1Y3RvciBib2R5LgogIGpzQXN0Lk5hbWUgY29uc3RydWN0b3JCb2R5TmFtZShDb25zdHJ1Y3RvckJvZHlFbnRpdHkgY3RvcikgewogICAgcmV0dXJuIF9kaXNhbWJpZ3VhdGVJbnRlcm5hbE1lbWJlcigKICAgICAgICBjdG9yLCAoKSA9PiBfcHJvcG9zZU5hbWVGb3JDb25zdHJ1Y3RvckJvZHkoY3RvcikpOwogIH0KCiAgLy8vIE5hbWUgZm9yIGEgZ2VuZXJhdG9yIGJvZHkuCiAganNBc3QuTmFtZSBnZW5lcmF0b3JCb2R5SW5zdGFuY2VNZXRob2ROYW1lKEpHZW5lcmF0b3JCb2R5IG1ldGhvZCkgewogICAgYXNzZXJ0KG1ldGhvZC5pc0luc3RhbmNlTWVtYmVyKTsKICAgIC8vIFRPRE8oc3JhKTogRXhjZXB0IGZvciBtZXRob2RzIGRlY2xhcmVkIGluIG1peGlucywgd2UgY2FuIHVzZSBhIGNvbXBhY3QKICAgIC8vIG5hbWluZyBzY2hlbWUgbGlrZSB3ZSBkbyBmb3IgW0NvbnN0cnVjdG9yQm9keUVudGl0eV0uCiAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiA9IG1ldGhvZC5mdW5jdGlvbjsKICAgIHJldHVybiBfZGlzYW1iaWd1YXRlSW50ZXJuYWxNZW1iZXIobWV0aG9kLCAoKSB7CiAgICAgIFN0cmluZyBpbnZvY2F0aW9uTmFtZSA9IG9wZXJhdG9yTmFtZVRvSWRlbnRpZmllcihmdW5jdGlvbi5uYW1lKTsKICAgICAgLy8gVE9ETyhzcmEpOiBJZiB0aGUgZ2VuZXJhdG9yIGlzIGZvciBhIGNsb3N1cmUncyAnY2FsbCcgbWV0aG9kLCB3ZSBkb24ndAogICAgICAvLyBuZWVkIHRvIGluY29ycG9yYXRlIHRoZSBlbmNsb3NpbmcgY2xhc3MuCiAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBtZXRob2QuZW5jbG9zaW5nQ2xhc3MubmFtZS5yZXBsYWNlQWxsKCcmJywgJ18nKTsKICAgICAgcmV0dXJuICcke2ludm9jYXRpb25OYW1lfVwkYm9keVwkJHtjbGFzc05hbWV9JzsKICAgIH0pOwogIH0KCiAgLy8vIEFubm90YXRlZCBuYW1lIGZvciBbbWV0aG9kXSBlbmNvZGluZyBhcml0eSBhbmQgbmFtZWQgcGFyYW1ldGVycy4KICBqc0FzdC5OYW1lIGluc3RhbmNlTWV0aG9kTmFtZShGdW5jdGlvbkVudGl0eSBtZXRob2QpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEF2b2lkIHRoZSB1c2Ugb2YgW0NvbnN0cnVjdG9yQm9keUVudGl0eV0gYW5kCiAgICAvLyBbSkdlbmVyYXRvckJvZHldLiBUaGUgY29kZWdlbiBtb2RlbCBzaG91bGQgYmUgZXhwbGljaXQgYWJvdXQgaXRzCiAgICAvLyBjb25zdHJ1Y3RvciBib2R5IGVsZW1lbnRzLgogICAgaWYgKG1ldGhvZCBpcyBDb25zdHJ1Y3RvckJvZHlFbnRpdHkpIHsKICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yQm9keU5hbWUobWV0aG9kKTsKICAgIH0KICAgIGlmIChtZXRob2QgaXMgSkdlbmVyYXRvckJvZHkpIHsKICAgICAgcmV0dXJuIGdlbmVyYXRvckJvZHlJbnN0YW5jZU1ldGhvZE5hbWUobWV0aG9kKTsKICAgIH0KICAgIHJldHVybiBpbnZvY2F0aW9uTmFtZShuZXcgU2VsZWN0b3IuZnJvbUVsZW1lbnQobWV0aG9kKSk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgYW5ub3RhdGVkIG5hbWUgZm9yIGEgdmFyaWFudCBvZiBgY2FsbGAuCiAgLy8vIFRoZSByZXN1bHQgaGFzIHRoZSBmb3JtOgogIC8vLwogIC8vLyAgICAgY2FsbCQ8Tj4kbmFtZWRQYXJhbTEuLi4kbmFtZWRQYXJhbTxNPgogIC8vLwogIC8vLyBUaGlzIG5hbWUgY2Fubm90IGJlIG1pbmlmaWVkIGJlY2F1c2UgaXQgaXMgZ2VuZXJhdGVkIGJ5IHN0cmluZwogIC8vLyBjb25jYXRlbmF0aW9uIGF0IHJ1bnRpbWUsIGJ5IGFwcGx5RnVuY3Rpb24gaW4ganNfaGVscGVyLmRhcnQuCiAganNBc3QuTmFtZSBkZXJpdmVDYWxsTWV0aG9kTmFtZShMaXN0PFN0cmluZz4gc3VmZml4KSB7CiAgICAvLyBUT0RPKGFzZ2VyZik6IEF2b2lkIGNsYXNoZXMgd2hlbiBuYW1lZCBwYXJhbWV0ZXJzIGNvbnRhaW4gJCBzeW1ib2xzLgogICAgcmV0dXJuIG5ldyBTdHJpbmdCYWNrZWROYW1lKCckY2FsbFByZWZpeFwkJHtzdWZmaXguam9pbihyJyQnKX0nKTsKICB9CgogIC8vLyBUaGUgc3VmZml4IGxpc3QgZm9yIHRoZSBwYXR0ZXJuOgogIC8vLwogIC8vLyAgICAgJDxUPiQ8Tj4kbmFtZWRQYXJhbTEuLi4kbmFtZWRQYXJhbTxNPgogIC8vLwogIC8vLyBXaGVyZSA8VD4gaXMgdGhlIG51bWJlciBvZiB0eXBlIGFyZ3VtZW50cywgPE4+IGlzIHRoZSBudW1iZXIgb2YgcG9zaXRpb25hbAogIC8vLyBhcmd1bWVudHMgYW5kIDxNPiBpcyB0aGUgbnVtYmVyIG9mIG5hbWVkIGFyZ3VtZW50cy4KICAvLy8KICAvLy8gSWYgdGhlcmUgYXJlIG5vIHR5cGUgYXJndW1lbnRzIHRoZSBgJDxUPmAgaXMgb21pdHRlZC4KICAvLy8KICAvLy8gVGhpcyBpcyB1c2VkIGZvciB0aGUgYW5ub3RhdGVkIG5hbWVzIG9mIGBjYWxsYCwgYW5kIGZvciB0aGUgcHJvcG9zZWQgbmFtZQogIC8vLyBmb3Igb3RoZXIgaW5zdGFuY2UgbWV0aG9kcy4KICBzdGF0aWMgTGlzdDxTdHJpbmc+IGNhbGxTdWZmaXhGb3JTdHJ1Y3R1cmUoQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlKSB7CiAgICBMaXN0PFN0cmluZz4gc3VmZml4ZXMgPSBbXTsKICAgIGlmIChjYWxsU3RydWN0dXJlLnR5cGVBcmd1bWVudENvdW50ID4gMCkgewogICAgICBzdWZmaXhlcy5hZGQoJyR7Y2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRDb3VudH0nKTsKICAgIH0KICAgIHN1ZmZpeGVzLmFkZCgnJHtjYWxsU3RydWN0dXJlLmFyZ3VtZW50Q291bnR9Jyk7CiAgICBzdWZmaXhlcy5hZGRBbGwoY2FsbFN0cnVjdHVyZS5nZXRPcmRlcmVkTmFtZWRBcmd1bWVudHMoKSk7CiAgICByZXR1cm4gc3VmZml4ZXM7CiAgfQoKICAvLy8gVGhlIHN1ZmZpeCBsaXN0IGZvciB0aGUgcGF0dGVybjoKICAvLy8KICAvLy8gICAgICQ8Tj4kbmFtZWRQYXJhbTEuLi4kbmFtZWRQYXJhbTxNPgogIC8vLwogIC8vLyBUaGlzIGlzIHVzZWQgZm9yIHRoZSBhbm5vdGF0ZWQgbmFtZXMgb2YgYGNhbGxgLCBhbmQgZm9yIHRoZSBwcm9wb3NlZCBuYW1lCiAgLy8vIGZvciBvdGhlciBpbnN0YW5jZSBtZXRob2RzLgogIExpc3Q8U3RyaW5nPiBjYWxsU3VmZml4Rm9yU2lnbmF0dXJlKFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUpIHsKICAgIExpc3Q8U3RyaW5nPiBzdWZmaXhlcyA9IFsnJHtwYXJhbWV0ZXJTdHJ1Y3R1cmUudG90YWxQYXJhbWV0ZXJzfSddOwogICAgc3VmZml4ZXMuYWRkQWxsKHBhcmFtZXRlclN0cnVjdHVyZS5uYW1lZFBhcmFtZXRlcnMpOwogICAgcmV0dXJuIHN1ZmZpeGVzOwogIH0KCiAgLy8vIEFubm90YXRlZCBuYW1lIGZvciB0aGUgbWVtYmVyIGJlaW5nIGludm9rZWQgYnkgW3NlbGVjdG9yXS4KICBqc0FzdC5OYW1lIGludm9jYXRpb25OYW1lKFNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICBzd2l0Y2ggKHNlbGVjdG9yLmtpbmQpIHsKICAgICAgY2FzZSBTZWxlY3RvcktpbmQuR0VUVEVSOgogICAgICAgIGpzQXN0Lk5hbWUgZGlzYW1iaWd1YXRlZE5hbWUgPSBfZGlzYW1iaWd1YXRlTWVtYmVyKHNlbGVjdG9yLm1lbWJlck5hbWUpOwogICAgICAgIHJldHVybiBkZXJpdmVHZXR0ZXJOYW1lKGRpc2FtYmlndWF0ZWROYW1lKTsKCiAgICAgIGNhc2UgU2VsZWN0b3JLaW5kLlNFVFRFUjoKICAgICAgICBqc0FzdC5OYW1lIGRpc2FtYmlndWF0ZWROYW1lID0gX2Rpc2FtYmlndWF0ZU1lbWJlcihzZWxlY3Rvci5tZW1iZXJOYW1lKTsKICAgICAgICByZXR1cm4gZGVyaXZlU2V0dGVyTmFtZShkaXNhbWJpZ3VhdGVkTmFtZSk7CgogICAgICBjYXNlIFNlbGVjdG9yS2luZC5PUEVSQVRPUjoKICAgICAgY2FzZSBTZWxlY3RvcktpbmQuSU5ERVg6CiAgICAgICAgU3RyaW5nIG9wZXJhdG9ySWRlbnRpZmllciA9IG9wZXJhdG9yTmFtZVRvSWRlbnRpZmllcihzZWxlY3Rvci5uYW1lKTsKICAgICAgICBqc0FzdC5OYW1lIGRpc2FtYmlndWF0ZWROYW1lID0KICAgICAgICAgICAgX2Rpc2FtYmlndWF0ZU9wZXJhdG9yKG9wZXJhdG9ySWRlbnRpZmllcik7CiAgICAgICAgcmV0dXJuIGRpc2FtYmlndWF0ZWROYW1lOyAvLyBPcGVyYXRvcnMgYXJlIG5vdCBhbm5vdGF0ZWQuCgogICAgICBjYXNlIFNlbGVjdG9yS2luZC5DQUxMOgogICAgICAgIExpc3Q8U3RyaW5nPiBzdWZmaXggPSBjYWxsU3VmZml4Rm9yU3RydWN0dXJlKHNlbGVjdG9yLmNhbGxTdHJ1Y3R1cmUpOwogICAgICAgIGlmIChzZWxlY3Rvci5uYW1lID09IElkZW50aWZpZXJzLmNhbGwpIHsKICAgICAgICAgIC8vIERlcml2ZSB0aGUgYW5ub3RhdGVkIG5hbWUgZm9yIHRoaXMgdmFyaWFudCBvZiAnY2FsbCcuCiAgICAgICAgICByZXR1cm4gZGVyaXZlQ2FsbE1ldGhvZE5hbWUoc3VmZml4KTsKICAgICAgICB9CiAgICAgICAganNBc3QuTmFtZSBkaXNhbWJpZ3VhdGVkTmFtZSA9CiAgICAgICAgICAgIF9kaXNhbWJpZ3VhdGVNZW1iZXIoc2VsZWN0b3IubWVtYmVyTmFtZSwgc3VmZml4KTsKICAgICAgICByZXR1cm4gZGlzYW1iaWd1YXRlZE5hbWU7IC8vIE1ldGhvZHMgb3RoZXIgdGhhbiBjYWxsIGFyZSBub3QgYW5ub3RhdGVkLgoKICAgICAgY2FzZSBTZWxlY3RvcktpbmQuU1BFQ0lBTDoKICAgICAgICByZXR1cm4gc3BlY2lhbFNlbGVjdG9yTmFtZShzZWxlY3Rvcik7CgogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IGZhaWxlZEF0KENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgICAgICdVbmV4cGVjdGVkIHNlbGVjdG9yIGtpbmQ6ICR7c2VsZWN0b3Iua2luZH0nKTsKICAgIH0KICB9CgogIGpzQXN0Lk5hbWUgc3BlY2lhbFNlbGVjdG9yTmFtZShTZWxlY3RvciBzZWxlY3RvcikgewogICAgYXNzZXJ0KHNlbGVjdG9yLmtpbmQgPT0gU2VsZWN0b3JLaW5kLlNQRUNJQUwpOwogICAgaWYgKHNlbGVjdG9yLm1lbWJlck5hbWUgPT0gTmFtZXMuZ2VuZXJpY0luc3RhbnRpYXRpb24pIHsKICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCYWNrZWROYW1lKCcke2dlbmVyaWNJbnN0YW50aWF0aW9uUHJlZml4fScKICAgICAgICAgICcke3NlbGVjdG9yLmNhbGxTdHJ1Y3R1cmUudHlwZUFyZ3VtZW50Q291bnR9Jyk7CiAgICB9CgogICAgdGhyb3cgZmFpbGVkQXQoCiAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwgJ1VuZXhwZWN0ZWQgc3BlY2lhbCBzZWxlY3RvcjogJHNlbGVjdG9yJyk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgaW50ZXJuYWwgbmFtZSB1c2VkIGZvciBhbiBpbnZvY2F0aW9uIG1pcnJvciBvZiB0aGlzIHNlbGVjdG9yLgogIGpzQXN0Lk5hbWUgaW52b2NhdGlvbk1pcnJvckludGVybmFsTmFtZShTZWxlY3RvciBzZWxlY3RvcikgPT4KICAgICAgaW52b2NhdGlvbk5hbWUoc2VsZWN0b3IpOwoKICAvLy8gUmV0dXJucyB0aGUgZGlzYW1iaWd1YXRlZCBuYW1lIGZvciB0aGUgZ2l2ZW4gZmllbGQsIHVzZWQgZm9yIGNvbnN0cnVjdGluZwogIC8vLyB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgbmFtZXMuCiAganNBc3QuTmFtZSBmaWVsZEFjY2Vzc29yTmFtZShGaWVsZEVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gZWxlbWVudC5pc0luc3RhbmNlTWVtYmVyCiAgICAgICAgPyBfZGlzYW1iaWd1YXRlTWVtYmVyKGVsZW1lbnQubWVtYmVyTmFtZSkKICAgICAgICA6IF9kaXNhbWJpZ3VhdGVHbG9iYWxNZW1iZXIoZWxlbWVudCk7CiAgfQoKICAvLy8gUmV0dXJucyBuYW1lIG9mIHRoZSBKYXZhU2NyaXB0IHByb3BlcnR5IHVzZWQgdG8gc3RvcmUgYSBzdGF0aWMgb3IgaW5zdGFuY2UKICAvLy8gZmllbGQuCiAganNBc3QuTmFtZSBmaWVsZFByb3BlcnR5TmFtZShGaWVsZEVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gZWxlbWVudC5pc0luc3RhbmNlTWVtYmVyCiAgICAgICAgPyBpbnN0YW5jZUZpZWxkUHJvcGVydHlOYW1lKGVsZW1lbnQpCiAgICAgICAgOiBfZGlzYW1iaWd1YXRlR2xvYmFsTWVtYmVyKGVsZW1lbnQpOwogIH0KCiAgLy8vIFJldHVybnMgYSBKYXZhU2NyaXB0IHByb3BlcnR5IG5hbWUgdXNlZCB0byBzdG9yZSB0aGUgbWVtYmVyIFtlbGVtZW50XSBvbgogIC8vLyBvbmUgb2YgdGhlIGdsb2JhbCBvYmplY3RzLgogIC8vLwogIC8vLyBTaG91bGQgYmUgdXNlZCB0b2dldGhlciB3aXRoIFtnbG9iYWxPYmplY3RGb3JNZW1iZXJdLCB3aGljaCBkZW5vdGVzIHRoZQogIC8vLyBvYmplY3Qgb24gd2hpY2ggdGhlIHJldHVybmVkIHByb3BlcnR5IG5hbWUgc2hvdWxkIGJlIHVzZWQuCiAganNBc3QuTmFtZSBnbG9iYWxQcm9wZXJ0eU5hbWVGb3JNZW1iZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQpID0+CiAgICAgIF9kaXNhbWJpZ3VhdGVHbG9iYWxNZW1iZXIoZWxlbWVudCk7CgogIC8vLyBSZXR1cm5zIGEgSmF2YVNjcmlwdCBwcm9wZXJ0eSBuYW1lIHVzZWQgdG8gc3RvcmUgdGhlIGNsYXNzIFtlbGVtZW50XSBvbgogIC8vLyBvbmUgb2YgdGhlIGdsb2JhbCBvYmplY3RzLgogIC8vLwogIC8vLyBTaG91bGQgYmUgdXNlZCB0b2dldGhlciB3aXRoIFtnbG9iYWxPYmplY3RGb3JDbGFzc10sIHdoaWNoIGRlbm90ZXMgdGhlCiAgLy8vIG9iamVjdCBvbiB3aGljaCB0aGUgcmV0dXJuZWQgcHJvcGVydHkgbmFtZSBzaG91bGQgYmUgdXNlZC4KICBqc0FzdC5OYW1lIGdsb2JhbFByb3BlcnR5TmFtZUZvckNsYXNzKENsYXNzRW50aXR5IGVsZW1lbnQpID0+CiAgICAgIF9kaXNhbWJpZ3VhdGVHbG9iYWxUeXBlKGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyBhIEphdmFTY3JpcHQgcHJvcGVydHkgbmFtZSB1c2VkIHRvIHN0b3JlIHRoZSB0eXBlICh0eXBlZGVmKQogIC8vLyBbZWxlbWVudF0gb24gb25lIG9mIHRoZSBnbG9iYWwgb2JqZWN0cy4KICAvLy8KICAvLy8gU2hvdWxkIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBbZ2xvYmFsT2JqZWN0Rm9yVHlwZV0sIHdoaWNoIGRlbm90ZXMgdGhlCiAgLy8vIG9iamVjdCBvbiB3aGljaCB0aGUgcmV0dXJuZWQgcHJvcGVydHkgbmFtZSBzaG91bGQgYmUgdXNlZC4KICBqc0FzdC5OYW1lIGdsb2JhbFByb3BlcnR5TmFtZUZvclR5cGUoRW50aXR5IGVsZW1lbnQpID0+CiAgICAgIF9kaXNhbWJpZ3VhdGVHbG9iYWxUeXBlKGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyB0aGUgSmF2YVNjcmlwdCBwcm9wZXJ0eSBuYW1lIHVzZWQgdG8gc3RvcmUgYW4gaW5zdGFuY2UgZmllbGQuCiAganNBc3QuTmFtZSBpbnN0YW5jZUZpZWxkUHJvcGVydHlOYW1lKEZpZWxkRW50aXR5IGVsZW1lbnQpIHsKICAgIENsYXNzRW50aXR5IGVuY2xvc2luZ0NsYXNzID0gZWxlbWVudC5lbmNsb3NpbmdDbGFzczsKCiAgICBpZiAoX25hdGl2ZURhdGEuaGFzRml4ZWRCYWNrZW5kTmFtZShlbGVtZW50KSkgewogICAgICByZXR1cm4gbmV3IFN0cmluZ0JhY2tlZE5hbWUoX25hdGl2ZURhdGEuZ2V0Rml4ZWRCYWNrZW5kTmFtZShlbGVtZW50KSk7CiAgICB9CgogICAgLy8gU29tZSBlbGVtZW50cywgbGlrZSBlLmcuIGluc3RhbmNlcyBvZiBCb3hGaWVsZEVsZW1lbnQgYXJlIHNwZWNpYWwuCiAgICAvLyBUaGV5IGFyZSBjcmVhdGVkIHdpdGggYSB1bmlxdWUgYW5kIHNhZmUgbmFtZSBmb3IgdGhlIGVsZW1lbnQgbW9kZWwuCiAgICAvLyBXaGlsZSB0aGVpciBuYW1lIGlzIHVuaXF1ZSwgaXQgaXMgbm90IHZlcnkgcmVhZGFibGUuIFNvIHdlIHRyeSB0bwogICAgLy8gcHJlc2VydmUgdGhlIG9yaWdpbmFsLCBwcm9wb3NlZCBuYW1lLgogICAgLy8gSG93ZXZlciwgYXMgYm94ZXMgYXJlIG5vdCByZWFsbHkgaW5zdGFuY2VzIG9mIGNsYXNzZXMsIHRoZSB1c3VhbCBuYW1pbmcKICAgIC8vIHNjaGVtZSB0aGF0IHRyaWVzIHRvIGF2b2lkIG5hbWUgY2xhc2hlcyB3aXRoIHN1cGVyIGNsYXNzZXMgZG9lcyBub3QKICAgIC8vIGFwcGx5LiBTbyB3ZSBjYW4gZGlyZWN0bHkgZ3JhYiBhIG5hbWUuCiAgICBpZiAoZWxlbWVudCBpcyBKU0VudGl0eSkgewogICAgICByZXR1cm4gX2Rpc2FtYmlndWF0ZUludGVybmFsTWVtYmVyKAogICAgICAgICAgZWxlbWVudCwgKCkgPT4gKGVsZW1lbnQgYXMgSlNFbnRpdHkpLmRlY2xhcmVkTmFtZSk7CiAgICB9CgogICAgLy8gSWYgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIG1pZ2h0IGNsYXNoIHdpdGggYW5vdGhlciBmaWVsZCwKICAgIC8vIHVzZSBhIG1hbmdsZWQgZmllbGQgbmFtZSB0byBhdm9pZCBwb3RlbnRpYWwgY2xhc2hlcy4KICAgIC8vIE5vdGUgdGhhdCBpZiB0aGUgY2xhc3MgZXh0ZW5kcyBhIG5hdGl2ZSBjbGFzcywgdGhhdCBuYXRpdmUgY2xhc3MgbWlnaHQKICAgIC8vIGhhdmUgZmllbGRzIHdpdGggZml4ZWQgYmFja2VuZCBuYW1lcywgc28gd2UgYXNzdW1lIHRoZSB3b3JzdCBhbmQgYWx3YXlzCiAgICAvLyBtYW5nbGUgdGhlIGZpZWxkIG5hbWVzIG9mIGNsYXNzZXMgZXh0ZW5kaW5nIG5hdGl2ZSBjbGFzc2VzLgogICAgLy8gTWV0aG9kcyBvbiBzdWNoIGNsYXNzZXMgYXJlIHN0b3JlZCBvbiB0aGUgaW50ZXJjZXB0b3IsIG5vdCB0aGUgaW5zdGFuY2UsCiAgICAvLyBzbyBvbmx5IGZpZWxkcyBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gY2xhc2ggd2l0aCBhIG5hdGl2ZSBwcm9wZXJ0eSBuYW1lLgogICAgaWYgKF9jbG9zZWRXb3JsZC5pc1VzZWRBc01peGluKGVuY2xvc2luZ0NsYXNzKSB8fAogICAgICAgIF9pc1NoYWRvd2luZ1N1cGVyRmllbGQoZWxlbWVudCkgfHwKICAgICAgICBfaXNVc2VyQ2xhc3NFeHRlbmRpbmdOYXRpdmUoZW5jbG9zaW5nQ2xhc3MpKSB7CiAgICAgIFN0cmluZyBwcm9wb3NlTmFtZSgpID0+ICcke2VuY2xvc2luZ0NsYXNzLm5hbWV9XyR7ZWxlbWVudC5uYW1lfSc7CiAgICAgIHJldHVybiBfZGlzYW1iaWd1YXRlSW50ZXJuYWxNZW1iZXIoZWxlbWVudCwgcHJvcG9zZU5hbWUpOwogICAgfQoKICAgIC8vIE5vIHN1cGVyY2xhc3MgdXNlcyB0aGUgZGlzYW1iaWd1YXRlZCBuYW1lIGFzIGEgcHJvcGVydHkgbmFtZSwgc28gd2UgY2FuCiAgICAvLyB1c2UgaXQgZm9yIHRoaXMgZmllbGQuIFRoaXMgZ2VuZXJhdGVzIG5pY2VyIGZpZWxkIG5hbWVzIHNpbmNlIG90aGVyd2lzZQogICAgLy8gdGhlIGZpZWxkIG5hbWUgd291bGQgaGF2ZSB0byBiZSBtYW5nbGVkLgogICAgcmV0dXJuIF9kaXNhbWJpZ3VhdGVNZW1iZXIobmV3IE5hbWUoZWxlbWVudC5uYW1lLCBlbGVtZW50LmxpYnJhcnkpKTsKICB9CgogIGJvb2wgX2lzU2hhZG93aW5nU3VwZXJGaWVsZChGaWVsZEVudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQoZWxlbWVudC5pc0ZpZWxkKTsKICAgIFN0cmluZyBmaWVsZE5hbWUgPSBlbGVtZW50Lm5hbWU7CiAgICBib29sIGlzUHJpdmF0ZSA9IE5hbWUuaXNQcml2YXRlTmFtZShmaWVsZE5hbWUpOwogICAgTGlicmFyeUVudGl0eSBtZW1iZXJMaWJyYXJ5ID0gZWxlbWVudC5saWJyYXJ5OwogICAgQ2xhc3NFbnRpdHkgbG9va3VwQ2xhc3MgPQogICAgICAgIGVsZW1lbnRFbnZpcm9ubWVudC5nZXRTdXBlckNsYXNzKGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MpOwogICAgd2hpbGUgKGxvb2t1cENsYXNzICE9IG51bGwpIHsKICAgICAgTWVtYmVyRW50aXR5IGZvdW5kTWVtYmVyID0KICAgICAgICAgIGVsZW1lbnRFbnZpcm9ubWVudC5sb29rdXBMb2NhbENsYXNzTWVtYmVyKGxvb2t1cENsYXNzLCBmaWVsZE5hbWUpOwogICAgICBpZiAoZm91bmRNZW1iZXIgIT0gbnVsbCkgewogICAgICAgIGlmIChmb3VuZE1lbWJlci5pc0ZpZWxkKSB7CiAgICAgICAgICBpZiAoIWlzUHJpdmF0ZSB8fCBtZW1iZXJMaWJyYXJ5ID09IGZvdW5kTWVtYmVyLmxpYnJhcnkpIHsKICAgICAgICAgICAgLy8gUHJpdmF0ZSBmaWVsZHMgY2FuIG9ubHkgYmUgc2hhZG93ZWQgYnkgYSBmaWVsZCBkZWNsYXJlZCBpbiB0aGUKICAgICAgICAgICAgLy8gc2FtZSBsaWJyYXJ5LgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgbG9va3VwQ2xhc3MgPSBlbGVtZW50RW52aXJvbm1lbnQuZ2V0U3VwZXJDbGFzcyhsb29rdXBDbGFzcyk7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLy8gVHJ1ZSBpZiBbY2xhc3NfXSBpcyBhIG5vbi1uYXRpdmUgY2xhc3MgdGhhdCBpbmhlcml0cyBmcm9tIGEgbmF0aXZlIGNsYXNzLgogIGJvb2wgX2lzVXNlckNsYXNzRXh0ZW5kaW5nTmF0aXZlKENsYXNzRW50aXR5IGNsYXNzXykgewogICAgcmV0dXJuICFfbmF0aXZlRGF0YS5pc05hdGl2ZUNsYXNzKGNsYXNzXykgJiYKICAgICAgICBfbmF0aXZlRGF0YS5pc05hdGl2ZU9yRXh0ZW5kc05hdGl2ZShjbGFzc18pOwogIH0KCiAgLy8vIEFubm90YXRlZCBuYW1lIGZvciB0aGUgc2V0dGVyIG9mIFtlbGVtZW50XS4KICBqc0FzdC5OYW1lIHNldHRlckZvck1lbWJlcihNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgLy8gV2UgZHluYW1pY2FsbHkgY3JlYXRlIHNldHRlcnMgZnJvbSB0aGUgZmllbGQtbmFtZS4gVGhlIHNldHRlciBuYW1lIG11c3QKICAgIC8vIHRoZXJlZm9yZSBiZSBkZXJpdmVkIGZyb20gdGhlIGluc3RhbmNlIGZpZWxkLW5hbWUuCiAgICBqc0FzdC5OYW1lIG5hbWUgPSBfZGlzYW1iaWd1YXRlTWVtYmVyKGVsZW1lbnQubWVtYmVyTmFtZSk7CiAgICByZXR1cm4gZGVyaXZlU2V0dGVyTmFtZShuYW1lKTsKICB9CgogIC8vLyBBbm5vdGF0ZWQgbmFtZSBmb3IgdGhlIHNldHRlciBvZiBhbnkgbWVtYmVyIHdpdGggW2Rpc2FtYmlndWF0ZWROYW1lXS4KICBqc0FzdC5OYW1lIGRlcml2ZVNldHRlck5hbWUoanNBc3QuTmFtZSBkaXNhbWJpZ3VhdGVkTmFtZSkgewogICAgLy8gV2UgZHluYW1pY2FsbHkgY3JlYXRlIHNldHRlcnMgZnJvbSB0aGUgZmllbGQtbmFtZS4gVGhlIHNldHRlciBuYW1lIG11c3QKICAgIC8vIHRoZXJlZm9yZSBiZSBkZXJpdmVkIGZyb20gdGhlIGluc3RhbmNlIGZpZWxkLW5hbWUuCiAgICByZXR1cm4gdXNlclNldHRlcnNbZGlzYW1iaWd1YXRlZE5hbWVdID8/PQogICAgICAgIG5ldyBTZXR0ZXJOYW1lKF9saXRlcmFsU2V0dGVyUHJlZml4LCBkaXNhbWJpZ3VhdGVkTmFtZSk7CiAgfQoKICAvLy8gQW5ub3RhdGVkIG5hbWUgZm9yIHRoZSBzZXR0ZXIgb2YgYW55IG1lbWJlciB3aXRoIFtkaXNhbWJpZ3VhdGVkTmFtZV0uCiAganNBc3QuTmFtZSBkZXJpdmVHZXR0ZXJOYW1lKGpzQXN0Lk5hbWUgZGlzYW1iaWd1YXRlZE5hbWUpIHsKICAgIC8vIFdlIGR5bmFtaWNhbGx5IGNyZWF0ZSBnZXR0ZXJzIGZyb20gdGhlIGZpZWxkLW5hbWUuIFRoZSBnZXR0ZXIgbmFtZSBtdXN0CiAgICAvLyB0aGVyZWZvcmUgYmUgZGVyaXZlZCBmcm9tIHRoZSBpbnN0YW5jZSBmaWVsZC1uYW1lLgogICAgcmV0dXJuIHVzZXJHZXR0ZXJzW2Rpc2FtYmlndWF0ZWROYW1lXSA/Pz0KICAgICAgICBuZXcgR2V0dGVyTmFtZShfbGl0ZXJhbEdldHRlclByZWZpeCwgZGlzYW1iaWd1YXRlZE5hbWUpOwogIH0KCiAgLy8vIEFubm90YXRlZCBuYW1lIGZvciB0aGUgZ2V0dGVyIG9mIFtlbGVtZW50XS4KICBqc0FzdC5OYW1lIGdldHRlckZvckVsZW1lbnQoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIC8vIFdlIGR5bmFtaWNhbGx5IGNyZWF0ZSBnZXR0ZXJzIGZyb20gdGhlIGZpZWxkLW5hbWUuIFRoZSBnZXR0ZXIgbmFtZSBtdXN0CiAgICAvLyB0aGVyZWZvcmUgYmUgZGVyaXZlZCBmcm9tIHRoZSBpbnN0YW5jZSBmaWVsZC1uYW1lLgogICAganNBc3QuTmFtZSBuYW1lID0gX2Rpc2FtYmlndWF0ZU1lbWJlcihlbGVtZW50Lm1lbWJlck5hbWUpOwogICAgcmV0dXJuIGRlcml2ZUdldHRlck5hbWUobmFtZSk7CiAgfQoKICAvLy8gUHJvcGVydHkgbmFtZSBmb3IgdGhlIGdldHRlciBvZiBhbiBpbnN0YW5jZSBtZW1iZXIgd2l0aCBbb3JpZ2luYWxOYW1lXS4KICBqc0FzdC5OYW1lIGdldHRlckZvck1lbWJlcihOYW1lIG9yaWdpbmFsTmFtZSkgewogICAganNBc3QuTmFtZSBkaXNhbWJpZ3VhdGVkTmFtZSA9IF9kaXNhbWJpZ3VhdGVNZW1iZXIob3JpZ2luYWxOYW1lKTsKICAgIHJldHVybiBkZXJpdmVHZXR0ZXJOYW1lKGRpc2FtYmlndWF0ZWROYW1lKTsKICB9CgogIC8vLyBEaXNhbWJpZ3VhdGVkIG5hbWUgZm9yIGEgY29tcGlsZXItb3duZWQgZ2xvYmFsIHZhcmlhYmxlLgogIC8vLwogIC8vLyBUaGUgcmVzdWx0aW5nIG5hbWUgaXMgdW5pcXVlIHdpdGhpbiB0aGUgZ2xvYmFsLW1lbWJlciBuYW1lc3BhY2UuCiAganNBc3QuTmFtZSBfZGlzYW1iaWd1YXRlSW50ZXJuYWxHbG9iYWwoU3RyaW5nIG5hbWUpIHsKICAgIGpzQXN0Lk5hbWUgbmV3TmFtZSA9IGludGVybmFsR2xvYmFsc1tuYW1lXTsKICAgIGlmIChuZXdOYW1lID09IG51bGwpIHsKICAgICAgbmV3TmFtZSA9IGdldEZyZXNoTmFtZShnbG9iYWxTY29wZSwgbmFtZSk7CiAgICAgIGludGVybmFsR2xvYmFsc1tuYW1lXSA9IG5ld05hbWU7CiAgICB9CiAgICByZXR1cm4gX25ld1JlZmVyZW5jZShuZXdOYW1lKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIHVzZSBmb3IgYSBjb21waWxlci1vd25lciBnbG9iYWwgdmFyaWFibGUsCiAgLy8vIGkuZS4gb25lIHRoYXQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhbnkgZWxlbWVudCBidXQgaXMgdXNlZCBhcyBhIHV0aWxpdHkKICAvLy8gZ2xvYmFsIGJ5IGNvZGUgZ2VuZXJhdGlvbi4KICAvLy8KICAvLy8gW25hbWVdIGZ1bmN0aW9ucyBhcyBib3RoIHRoZSBwcm9wb3NlZCBuYW1lIGZvciB0aGUgZ2xvYmFsLCBhbmQgYXMgYSBrZXkKICAvLy8gaWRlbnRpZnlpbmcgdGhlIGdsb2JhbC4gVGhlIFtuYW1lXSBtdXN0IG5vdCBjb250YWluIGAkYCBzeW1ib2xzLCBzaW5jZQogIC8vLyB0aGUgW05hbWVyXSB1c2VzIHRob3NlIG5hbWVzIGludGVybmFsbHkuCiAgLy8vCiAgLy8vIFRoaXMgcHJvdmlkZXMgYW4gZWFzeSBtZWNoYW5pc20gb2YgYXZvaWRpbmcgYSBuYW1lLWNsYXNoIHdpdGggdXNlci1zcGFjZQogIC8vLyBnbG9iYWxzLCBhbHRob3VnaCB0aGUgY2FsbGVycyBvZiBtdXN0IHN0aWxsIHRha2UgY2FyZSBub3QgdG8gYWNjaWRlbnRhbGx5CiAgLy8vIHBhc3MgaW4gdGhlIHNhbWUgW25hbWVdIGZvciB0d28gZGlmZmVyZW50IGludGVybmFsIGdsb2JhbHMuCiAganNBc3QuTmFtZSBpbnRlcm5hbEdsb2JhbChTdHJpbmcgbmFtZSkgewogICAgYXNzZXJ0KCFuYW1lLmNvbnRhaW5zKHInJCcpKTsKICAgIHJldHVybiBfZGlzYW1iaWd1YXRlSW50ZXJuYWxHbG9iYWwobmFtZSk7CiAgfQoKICAvLy8gR2VuZXJhdGVzIGEgdW5pcXVlIGtleSBmb3IgW2xpYnJhcnldLgogIC8vLwogIC8vLyBLZXlzIGFyZSBtZWFudCB0byBiZSB1c2VkIGluIG1hcHMgYW5kIHNob3VsZCBub3QgYmUgdmlzaWJsZSBpbiB0aGUgb3V0cHV0LgogIFN0cmluZyBfZ2VuZXJhdGVMaWJyYXJ5S2V5KExpYnJhcnlFbnRpdHkgbGlicmFyeSkgewogICAgcmV0dXJuIF9saWJyYXJ5S2V5cy5wdXRJZkFic2VudChsaWJyYXJ5LCAoKSB7CiAgICAgIFN0cmluZyBrZXlCYXNlID0gbGlicmFyeS5uYW1lOwogICAgICBpbnQgY291bnRlciA9IDA7CiAgICAgIFN0cmluZyBrZXkgPSBrZXlCYXNlOwogICAgICB3aGlsZSAoX2xpYnJhcnlLZXlzLnZhbHVlcy5jb250YWlucyhrZXkpKSB7CiAgICAgICAga2V5ID0gIiRrZXlCYXNlJHtjb3VudGVyKyt9IjsKICAgICAgfQogICAgICByZXR1cm4ga2V5OwogICAgfSk7CiAgfQoKICBqc0FzdC5OYW1lIF9kaXNhbWJpZ3VhdGVHbG9iYWxNZW1iZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBfZGlzYW1iaWd1YXRlR2xvYmFsPE1lbWJlckVudGl0eT4oCiAgICAgICAgZWxlbWVudCwgX3Byb3Bvc2VOYW1lRm9yTWVtYmVyLCB1c2VyR2xvYmFscyk7CiAgfQoKICBqc0FzdC5OYW1lIF9kaXNhbWJpZ3VhdGVHbG9iYWxUeXBlKEVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gX2Rpc2FtYmlndWF0ZUdsb2JhbChlbGVtZW50LCBfcHJvcG9zZU5hbWVGb3JUeXBlLCB1c2VyR2xvYmFscyk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgZGlzYW1iaWd1YXRlZCBuYW1lIGZvciBhIHRvcC1sZXZlbCBvciBzdGF0aWMgZWxlbWVudC4KICAvLy8KICAvLy8gVGhlIHJlc3VsdGluZyBuYW1lIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIGdsb2JhbC1tZW1iZXIgbmFtZXNwYWNlLgogIGpzQXN0Lk5hbWUgX2Rpc2FtYmlndWF0ZUdsb2JhbDxUIGV4dGVuZHMgRW50aXR5PihUIGVsZW1lbnQsCiAgICAgIFN0cmluZyBwcm9wb3NlTmFtZShUIGVsZW1lbnQpLCBNYXA8RW50aXR5LCBqc0FzdC5OYW1lPiBnbG9iYWxzKSB7CiAgICAvLyBUT0RPKGFzZ2VyZik6IFdlIGNhbiByZXVzZSBtb3JlIHNob3J0IG5hbWVzIGlmIHdlIGRpc2FtYmlndWF0ZSB3aXRoCiAgICAvLyBhIHNlcGFyYXRlIG5hbWVzcGFjZSBmb3IgZWFjaCBvZiB0aGUgZ2xvYmFsIGhvbGRlciBvYmplY3RzLgogICAganNBc3QuTmFtZSBuZXdOYW1lID0gZ2xvYmFsc1tlbGVtZW50XTsKICAgIGlmIChuZXdOYW1lID09IG51bGwpIHsKICAgICAgU3RyaW5nIHByb3Bvc2VkTmFtZSA9IHByb3Bvc2VOYW1lKGVsZW1lbnQpOwogICAgICBuZXdOYW1lID0gZ2V0RnJlc2hOYW1lKGdsb2JhbFNjb3BlLCBwcm9wb3NlZE5hbWUpOwogICAgICBnbG9iYWxzW2VsZW1lbnRdID0gbmV3TmFtZTsKICAgIH0KICAgIHJldHVybiBfbmV3UmVmZXJlbmNlKG5ld05hbWUpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIGRpc2FtYmlndWF0ZWQgbmFtZSBmb3IgYW4gaW5zdGFuY2UgbWV0aG9kIG9yIGZpZWxkCiAgLy8vIHdpdGggW29yaWdpbmFsTmFtZV0gaW4gW2xpYnJhcnldLgogIC8vLwogIC8vLyBbbGlicmFyeV0gbWF5IGJlIGBudWxsYCBpZiBbb3JpZ2luYWxOYW1lXSBpcyBrbm93biB0byBiZSBwdWJsaWMuCiAgLy8vCiAgLy8vIFRoaXMgaXMgdGhlIG5hbWUgdXNlZCBmb3IgZGVyaXZpbmcgcHJvcGVydHkgbmFtZXMgb2YgYWNjZXNzb3JzIChnZXR0ZXJzCiAgLy8vIGFuZCBzZXR0ZXJzKSBhbmQgYXMgcHJvcGVydHkgbmFtZSBmb3Igc3RvcmluZyBtZXRob2RzIGFuZCBtZXRob2Qgc3R1YnMuCiAgLy8vCiAgLy8vIFtzdWZmaXhlc10gZGVub3RlIGFuIGV4dGVuc2lvbiBvZiBbb3JpZ2luYWxOYW1lXSB0byBkaXN0aW5ndWlzaCBpdCBmcm9tCiAgLy8vIG90aGVyIG1lbWJlcnMgd2l0aCB0aGF0IG5hbWUuIFRoZXNlIGFyZSB1c2VkIHRvIGVuY29kZSB0aGUgYXJpdHkgYW5kCiAgLy8vIG5hbWVkIHBhcmFtZXRlcnMgdG8gYSBtZXRob2QuIERpc2FtYmlndWF0aW5nIHRoZSBzYW1lIFtvcmlnaW5hbE5hbWVdIHdpdGgKICAvLy8gZGlmZmVyZW50IFtzdWZmaXhlc10gd2lsbCB5aWVsZCBkaWZmZXJlbnQgZGlzYW1iaWd1YXRlZCBuYW1lcy4KICAvLy8KICAvLy8gVGhlIHJlc3VsdGluZyBuYW1lLCBhbmQgaXRzIGFzc29jaWF0ZWQgYW5ub3RhdGVkIG5hbWVzLCBhcmUgdW5pcXVlCiAgLy8vIHRvIHRoZSAoW29yaWdpbmFsTmFtZV0sIFtzdWZmaXhlc10pIHBhaXIgd2l0aGluIHRoZSBpbnN0YW5jZS1tZW1iZXIKICAvLy8gbmFtZXNwYWNlLgogIGpzQXN0Lk5hbWUgX2Rpc2FtYmlndWF0ZU1lbWJlcihOYW1lIG9yaWdpbmFsTmFtZSwKICAgICAgW0xpc3Q8U3RyaW5nPiBzdWZmaXhlcyA9IGNvbnN0IFtdXSkgewogICAgLy8gQnVpbGQgYSBzdHJpbmcgZW5jb2RpbmcgdGhlIGxpYnJhcnkgbmFtZSwgaWYgdGhlIG5hbWUgaXMgcHJpdmF0ZS4KICAgIFN0cmluZyBsaWJyYXJ5S2V5ID0KICAgICAgICBvcmlnaW5hbE5hbWUuaXNQcml2YXRlID8gX2dlbmVyYXRlTGlicmFyeUtleShvcmlnaW5hbE5hbWUubGlicmFyeSkgOiAnJzsKCiAgICAvLyBJbiB0aGUgdW5pcXVlIGtleSwgc2VwYXJhdGUgdGhlIG5hbWUgcGFydHMgYnkgJ0AnLgogICAgLy8gVGhpcyBhdm9pZHMgY2xhc2hlcyBzaW5jZSB0aGUgb3JpZ2luYWwgbmFtZXMgY2Fubm90IGNvbnRhaW4gdGhhdCBzeW1ib2wuCiAgICBTdHJpbmcga2V5ID0gJyRsaWJyYXJ5S2V5QCR7b3JpZ2luYWxOYW1lLnRleHR9QCR7c3VmZml4ZXMuam9pbignQCcpfSc7CiAgICBqc0FzdC5OYW1lIG5ld05hbWUgPSB1c2VySW5zdGFuY2VNZW1iZXJzW2tleV07CiAgICBpZiAobmV3TmFtZSA9PSBudWxsKSB7CiAgICAgIFN0cmluZyBwcm9wb3NlZE5hbWUgPSBwcml2YXRlTmFtZShvcmlnaW5hbE5hbWUpOwogICAgICBpZiAoIXN1ZmZpeGVzLmlzRW1wdHkpIHsKICAgICAgICAvLyBJbiB0aGUgcHJvcG9zZWQgbmFtZSwgc2VwYXJhdGUgdGhlIG5hbWUgcGFydHMgYnkgJyQnLCBiZWNhdXNlIHRoZQogICAgICAgIC8vIHByb3Bvc2VkIG5hbWUgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXIsIGJ1dCBub3QgbmVjZXNzYXJpbHkgdW5pcXVlLgogICAgICAgIHByb3Bvc2VkTmFtZSArPSByJyQnICsgc3VmZml4ZXMuam9pbihyJyQnKTsKICAgICAgfQogICAgICBuZXdOYW1lID0gZ2V0RnJlc2hOYW1lKGluc3RhbmNlU2NvcGUsIHByb3Bvc2VkTmFtZSwKICAgICAgICAgIHNhbml0aXplRm9yQW5ub3RhdGlvbnM6IHRydWUpOwogICAgICB1c2VySW5zdGFuY2VNZW1iZXJzW2tleV0gPSBuZXdOYW1lOwogICAgICB1c2VySW5zdGFuY2VNZW1iZXJzT3JpZ2luYWxOYW1lW2tleV0gPSAnJG9yaWdpbmFsTmFtZSc7CiAgICB9CiAgICByZXR1cm4gX25ld1JlZmVyZW5jZShuZXdOYW1lKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBkaXNhbWJpZ3VhdGVkIG5hbWUgZm9yIHRoZSBpbnN0YW5jZSBtZW1iZXIgaWRlbnRpZmllZCBieQogIC8vLyBba2V5XS4KICAvLy8KICAvLy8gV2hlbiBhIG5hbWUgZm9yIGFuIGVsZW1lbnQgaXMgcmVxdWVzdGVkIGJ5IGtleSwgaXQgbWF5IG5vdCBiZSByZXF1ZXN0ZWQKICAvLy8gYnkgZWxlbWVudCBhdCB0aGUgc2FtZSB0aW1lLCBhcyB0d28gZGlmZmVyZW50IG5hbWVzIHdvdWxkIGJlIHJldHVybmVkLgogIC8vLwogIC8vLyBJZiBrZXkgaGFzIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkLCBbcHJvcG9zZU5hbWVdIGlzIHVzZWQgdG8gZ2VuZXJhdGUKICAvLy8gYSBuYW1lIHByb3Bvc2FsIGZvciB0aGUgZ2l2ZW4ga2V5LgogIC8vLwogIC8vLyBba2V5XSBtdXN0IG5vdCBjbGFzaCB3aXRoIHZhbGlkIGluc3RhbmNlIG5hbWVzLiBUaGlzIGlzIHR5cGljYWxseQogIC8vLyBhY2hpZXZlZCBieSB1c2luZyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGluIFtrZXldIHRoYXQgaXMgbm90IHZhbGlkIGluCiAgLy8vIGlkZW50aWZpZXJzLCBmb3IgZXhhbXBsZSB0aGUgQCBzeW1ib2wuCiAganNBc3QuTmFtZSBfZGlzYW1iaWd1YXRlTWVtYmVyQnlLZXkoU3RyaW5nIGtleSwgU3RyaW5nIHByb3Bvc2VOYW1lKCkpIHsKICAgIGpzQXN0Lk5hbWUgbmV3TmFtZSA9IHVzZXJJbnN0YW5jZU1lbWJlcnNba2V5XTsKICAgIGlmIChuZXdOYW1lID09IG51bGwpIHsKICAgICAgU3RyaW5nIG5hbWUgPSBwcm9wb3NlTmFtZSgpOwogICAgICBuZXdOYW1lID0gZ2V0RnJlc2hOYW1lKGluc3RhbmNlU2NvcGUsIG5hbWUsIHNhbml0aXplRm9yQW5ub3RhdGlvbnM6IHRydWUpOwogICAgICB1c2VySW5zdGFuY2VNZW1iZXJzW2tleV0gPSBuZXdOYW1lOwogICAgICAvLyBUT0RPKHNpZ211bmQpOiBjb25zaWRlciBwbHVtYmluZyB0aGUgb3JpZ2luYWwgbmFtZSBpbnN0ZWFkLgogICAgICB1c2VySW5zdGFuY2VNZW1iZXJzT3JpZ2luYWxOYW1lW2tleV0gPSBuYW1lOwogICAgfQogICAgcmV0dXJuIF9uZXdSZWZlcmVuY2UobmV3TmFtZSk7CiAgfQoKICAvLy8gRm9yY2VzIHRoZSBwdWJsaWMgaW5zdGFuY2UgbWVtYmVyIHdpdGggW29yaWdpbmFsTmFtZV0gdG8gaGF2ZSB0aGUgZ2l2ZW4KICAvLy8gW2Rpc2FtYmlndWF0ZWROYW1lXS4KICAvLy8KICAvLy8gVGhlIFtvcmlnaW5hbE5hbWVdIG11c3Qgbm90IGhhdmUgYmVlbiBkaXNhbWJpZ3VhdGVkIGJlZm9yZSwgYW5kIHRoZQogIC8vLyBbZGlzYW1iaWd1YXRlZE5hbWVdIG11c3Qgbm90IGhhdmUgYmVlbiB1c2VkLgogIC8vLwogIC8vLyBVc2luZyBbX2Rpc2FtYmlndWF0ZU1lbWJlcl0gd2l0aCB0aGUgZ2l2ZW4gW29yaWdpbmFsTmFtZV0gYW5kIG5vIHN1ZmZpeGVzCiAgLy8vIHdpbGwgc3Vic2VxdWVudGx5IHJldHVybiBbZGlzYW1iaWd1YXRlZE5hbWVdLgogIHZvaWQgcmVzZXJ2ZVB1YmxpY01lbWJlck5hbWUoU3RyaW5nIG9yaWdpbmFsTmFtZSwgU3RyaW5nIGRpc2FtYmlndWF0ZWROYW1lKSB7CiAgICAvLyBCdWlsZCBhIGtleSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBvbmUgYnVpbHQgaW4gZGlzYW1iaWd1YXRlTWVtYmVyLgogICAgU3RyaW5nIGxpYnJhcnlQcmVmaXggPSAnJzsgLy8gUHVibGljIG5hbWVzIGhhdmUgYW4gZW1wdHkgbGlicmFyeSBwcmVmaXguCiAgICBTdHJpbmcgc3VmZml4ID0gJyc7IC8vIFdlIGRvbid0IG5lZWQgYW55IHN1ZmZpeGVzLgogICAgU3RyaW5nIGtleSA9ICckbGlicmFyeVByZWZpeEAkb3JpZ2luYWxOYW1lQCRzdWZmaXgnOwogICAgYXNzZXJ0KCF1c2VySW5zdGFuY2VNZW1iZXJzLmNvbnRhaW5zS2V5KGtleSkpOwogICAgYXNzZXJ0KCFpbnN0YW5jZVNjb3BlLmlzVXNlZChkaXNhbWJpZ3VhdGVkTmFtZSkpOwogICAgdXNlckluc3RhbmNlTWVtYmVyc1trZXldID0gbmV3IFN0cmluZ0JhY2tlZE5hbWUoZGlzYW1iaWd1YXRlZE5hbWUpOwogICAgdXNlckluc3RhbmNlTWVtYmVyc09yaWdpbmFsTmFtZVtrZXldID0gb3JpZ2luYWxOYW1lOwogICAgaW5zdGFuY2VTY29wZS5yZWdpc3RlclVzZShkaXNhbWJpZ3VhdGVkTmFtZSk7CiAgfQoKICAvLy8gRGlzYW1iaWd1YXRlZCBuYW1lIHVuaXF1ZSB0byBbZWxlbWVudF0uCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCBhcyB0aGUgcHJvcGVydHkgbmFtZSBmb3IgZmllbGRzLCB0eXBlIHZhcmlhYmxlcywKICAvLy8gY29uc3RydWN0b3IgYm9kaWVzLCBhbmQgc3VwZXItYWNjZXNzb3JzLgogIC8vLwogIC8vLyBUaGUgcmVzdWx0aW5nIG5hbWUgaXMgdW5pcXVlIHdpdGhpbiB0aGUgaW5zdGFuY2UtbWVtYmVyIG5hbWVzcGFjZS4KICBqc0FzdC5OYW1lIF9kaXNhbWJpZ3VhdGVJbnRlcm5hbE1lbWJlcigKICAgICAgTWVtYmVyRW50aXR5IGVsZW1lbnQsIFN0cmluZyBwcm9wb3NlTmFtZSgpKSB7CiAgICBqc0FzdC5OYW1lIG5ld05hbWUgPSBpbnRlcm5hbEluc3RhbmNlTWVtYmVyc1tlbGVtZW50XTsKICAgIGlmIChuZXdOYW1lID09IG51bGwpIHsKICAgICAgU3RyaW5nIG5hbWUgPSBwcm9wb3NlTmFtZSgpOwoKICAgICAgaWYgKGVsZW1lbnQgaXMgUHJpdmF0ZWx5TmFtZWRKU0VudGl0eSkgewogICAgICAgIE5hbWluZ1Njb3BlIHNjb3BlID0gX2dldFByaXZhdGVTY29wZUZvcihlbGVtZW50KTsKICAgICAgICBuZXdOYW1lID0gZ2V0RnJlc2hOYW1lKHNjb3BlLCBuYW1lLAogICAgICAgICAgICBzYW5pdGl6ZUZvckFubm90YXRpb25zOiB0cnVlLCBzYW5pdGl6ZUZvck5hdGl2ZXM6IGZhbHNlKTsKICAgICAgICBpbnRlcm5hbEluc3RhbmNlTWVtYmVyc1tlbGVtZW50XSA9IG5ld05hbWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYm9vbCBtYXlDbGFzaE5hdGl2ZSA9CiAgICAgICAgICAgIF9pc1VzZXJDbGFzc0V4dGVuZGluZ05hdGl2ZShlbGVtZW50LmVuY2xvc2luZ0NsYXNzKTsKICAgICAgICBuZXdOYW1lID0gZ2V0RnJlc2hOYW1lKGluc3RhbmNlU2NvcGUsIG5hbWUsCiAgICAgICAgICAgIHNhbml0aXplRm9yQW5ub3RhdGlvbnM6IHRydWUsIHNhbml0aXplRm9yTmF0aXZlczogbWF5Q2xhc2hOYXRpdmUpOwogICAgICAgIGludGVybmFsSW5zdGFuY2VNZW1iZXJzW2VsZW1lbnRdID0gbmV3TmFtZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIF9uZXdSZWZlcmVuY2UobmV3TmFtZSk7CiAgfQoKICAvLy8gRGlzYW1iaWd1YXRlZCBuYW1lIGZvciB0aGUgZ2l2ZW4gb3BlcmF0b3IuCiAgLy8vCiAgLy8vIFtvcGVyYXRvcklkZW50aWZpZXJdIG11c3QgYmUgdGhlIG9wZXJhdG9yJ3MgaWRlbnRpZmllciwgZS5nLgogIC8vLyBgJGFkZGAgYW5kIG5vdCBgK2AuCiAgLy8vCiAgLy8vIFRoZSByZXN1bHRpbmcgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSBpbnN0YW5jZS1tZW1iZXIgbmFtZXNwYWNlLgogIGpzQXN0Lk5hbWUgX2Rpc2FtYmlndWF0ZU9wZXJhdG9yKFN0cmluZyBvcGVyYXRvcklkZW50aWZpZXIpIHsKICAgIGpzQXN0Lk5hbWUgbmV3TmFtZSA9IHVzZXJJbnN0YW5jZU9wZXJhdG9yc1tvcGVyYXRvcklkZW50aWZpZXJdOwogICAgaWYgKG5ld05hbWUgPT0gbnVsbCkgewogICAgICBuZXdOYW1lID0gZ2V0RnJlc2hOYW1lKGluc3RhbmNlU2NvcGUsIG9wZXJhdG9ySWRlbnRpZmllcik7CiAgICAgIHVzZXJJbnN0YW5jZU9wZXJhdG9yc1tvcGVyYXRvcklkZW50aWZpZXJdID0gbmV3TmFtZTsKICAgIH0KICAgIHJldHVybiBfbmV3UmVmZXJlbmNlKG5ld05hbWUpOwogIH0KCiAgU3RyaW5nIF9nZW5lcmF0ZUZyZXNoU3RyaW5nRm9yTmFtZShTdHJpbmcgcHJvcG9zZWROYW1lLCBOYW1pbmdTY29wZSBzY29wZSwKICAgICAge2Jvb2wgc2FuaXRpemVGb3JBbm5vdGF0aW9uczogZmFsc2UsIGJvb2wgc2FuaXRpemVGb3JOYXRpdmVzOiBmYWxzZX0pIHsKICAgIGlmIChzYW5pdGl6ZUZvckFubm90YXRpb25zKSB7CiAgICAgIHByb3Bvc2VkTmFtZSA9IF9zYW5pdGl6ZUZvckFubm90YXRpb25zKHByb3Bvc2VkTmFtZSk7CiAgICB9CiAgICBpZiAoc2FuaXRpemVGb3JOYXRpdmVzKSB7CiAgICAgIHByb3Bvc2VkTmFtZSA9IF9zYW5pdGl6ZUZvck5hdGl2ZXMocHJvcG9zZWROYW1lKTsKICAgIH0KICAgIHByb3Bvc2VkTmFtZSA9IF9zYW5pdGl6ZUZvcktleXdvcmRzKHByb3Bvc2VkTmFtZSk7CiAgICBTdHJpbmcgY2FuZGlkYXRlOwogICAgaWYgKHNjb3BlLmlzVW51c2VkKHByb3Bvc2VkTmFtZSkpIHsKICAgICAgY2FuZGlkYXRlID0gcHJvcG9zZWROYW1lOwogICAgfSBlbHNlIHsKICAgICAgaW50IGNvdW50ZXIgPSBwb3B1bGFyTmFtZUNvdW50ZXJzW3Byb3Bvc2VkTmFtZV07CiAgICAgIGludCBpID0gKGNvdW50ZXIgPT0gbnVsbCkgPyAwIDogY291bnRlcjsKICAgICAgd2hpbGUgKHNjb3BlLmlzVXNlZCgiJHByb3Bvc2VkTmFtZSRpIikpIHsKICAgICAgICBpKys7CiAgICAgIH0KICAgICAgcG9wdWxhck5hbWVDb3VudGVyc1twcm9wb3NlZE5hbWVdID0gaSArIDE7CiAgICAgIGNhbmRpZGF0ZSA9ICIkcHJvcG9zZWROYW1lJGkiOwogICAgfQogICAgc2NvcGUucmVnaXN0ZXJVc2UoY2FuZGlkYXRlKTsKICAgIHJldHVybiBjYW5kaWRhdGU7CiAgfQoKICAvLy8gUmV0dXJucyBhbiB1bnVzZWQgbmFtZS4KICAvLy8KICAvLy8gW3Byb3Bvc2VkTmFtZV0gbXVzdCBiZSBhIHZhbGlkIEphdmFTY3JpcHQgaWRlbnRpZmllci4KICAvLy8KICAvLy8gSWYgW3Nhbml0aXplRm9yQW5ub3RhdGlvbnNdIGlzIGB0cnVlYCwgdGhlbiB0aGUgcmVzdWx0IGlzIGd1YXJhbnRlZWQgbm90CiAgLy8vIHRvIGhhdmUgdGhlIGZvcm0gb2YgYW4gYW5ub3RhdGVkIG5hbWUuCiAgLy8vCiAgLy8vIElmIFtzYW5pdGl6ZUZvck5hdGl2ZXNdIGl0IGB0cnVlYCwgdGhlbiB0aGUgcmVzdWx0IGlzIGd1YXJhbnRlZWQgbm90IHRvCiAgLy8vIGNsYXNoIHdpdGggYSBwcm9wZXJ0eSBuYW1lIG9uIGEgbmF0aXZlIG9iamVjdC4KICAvLy8KICAvLy8gTm90ZSB0aGF0IFtNaW5pZnlOYW1lcl0gb3ZlcnJpZGVzIHRoaXMgbWV0aG9kIHdpdGggb25lIHRoYXQgcHJvZHVjZXMKICAvLy8gbWluaWZpZWQgbmFtZXMuCiAganNBc3QuTmFtZSBnZXRGcmVzaE5hbWUoTmFtaW5nU2NvcGUgc2NvcGUsIFN0cmluZyBwcm9wb3NlZE5hbWUsCiAgICAgIHtib29sIHNhbml0aXplRm9yQW5ub3RhdGlvbnM6IGZhbHNlLCBib29sIHNhbml0aXplRm9yTmF0aXZlczogZmFsc2V9KSB7CiAgICBTdHJpbmcgY2FuZGlkYXRlID0gX2dlbmVyYXRlRnJlc2hTdHJpbmdGb3JOYW1lKHByb3Bvc2VkTmFtZSwgc2NvcGUsCiAgICAgICAgc2FuaXRpemVGb3JBbm5vdGF0aW9uczogc2FuaXRpemVGb3JBbm5vdGF0aW9ucywKICAgICAgICBzYW5pdGl6ZUZvck5hdGl2ZXM6IHNhbml0aXplRm9yTmF0aXZlcyk7CiAgICByZXR1cm4gbmV3IFN0cmluZ0JhY2tlZE5hbWUoY2FuZGlkYXRlKTsKICB9CgogIC8vLyBSZXR1cm5zIGEgdmFyaWFudCBvZiBbbmFtZV0gdGhhdCBjYW5ub3QgY2xhc2ggd2l0aCB0aGUgYW5ub3RhdGVkCiAgLy8vIHZlcnNpb24gb2YgYW5vdGhlciBuYW1lLCB0aGF0IGlzLCB0aGUgcmVzdWx0aW5nIG5hbWUgY2FuIG5ldmVyIGJlIHJldHVybmVkCiAgLy8vIGJ5IFtkZXJpdmVHZXR0ZXJOYW1lXSwgW2Rlcml2ZVNldHRlck5hbWVdLCBbZGVyaXZlQ2FsbE1ldGhvZE5hbWVdLAogIC8vLyBbb3BlcmF0b3JJc10sIG9yIFtzdWJzdGl0dXRpb25OYW1lXS4KICAvLy8KICAvLy8gRm9yIGV4YW1wbGUsIGEgbmFtZSBgZ2V0JHhgIHdvdWxkIGJlIGNvbnZlcnRlZCB0byBgJGdldCR4YCB0byBlbnN1cmUgaXQKICAvLy8gY2Fubm90IGNsYXNoIHdpdGggdGhlIGdldHRlciBmb3IgYHhgLgogIC8vLwogIC8vLyBXZSBkb24ndCB3YW50IHRvIHJlZ2lzdGVyIGFsbCBwb3RlbnRpYWwgYW5ub3RhdGVkIG5hbWVzIGluCiAgLy8vIFt1c2VkSW5zdGFuY2VOYW1lc10gKHRoZXJlIGFyZSB0b28gbWFueSksIHNvIHdlIHVzZSB0aGlzIHN0ZXAgdG8gYXZvaWQKICAvLy8gY2xhc2hlcyBiZXR3ZWVuIGFubm90YXRlZCBhbmQgdW5hbm5vdGF0ZWQgbmFtZXMuCiAgU3RyaW5nIF9zYW5pdGl6ZUZvckFubm90YXRpb25zKFN0cmluZyBuYW1lKSB7CiAgICAvLyBFbnN1cmUgbmFtZSBkb2VzIG5vdCBjbGFzaCB3aXRoIGEgZ2V0dGVyIG9yIHNldHRlciBvZiBhbm90aGVyIG5hbWUsCiAgICAvLyBvbmUgb2YgdGhlIG90aGVyIHNwZWNpYWwgbmFtZXMgdGhhdCBzdGFydCB3aXRoIGAkYCwgc3VjaCBhcyBgJGlzYCwKICAgIC8vIG9yIHdpdGggb25lIG9mIHRoZSBgY2FsbGAgc3R1YnMsIHN1Y2ggYXMgYGNhbGwkMWAuCiAgICBhc3NlcnQodGhpcyBpcyEgTWluaWZ5TmFtZXIpOwogICAgaWYgKG5hbWUuc3RhcnRzV2l0aChyJyQnKSB8fAogICAgICAgIG5hbWUuc3RhcnRzV2l0aChnZXR0ZXJQcmVmaXgpIHx8CiAgICAgICAgbmFtZS5zdGFydHNXaXRoKHNldHRlclByZWZpeCkgfHwKICAgICAgICBuYW1lLnN0YXJ0c1dpdGgoX2NhbGxQcmVmaXhEb2xsYXIpKSB7CiAgICAgIG5hbWUgPSAnXCQkbmFtZSc7CiAgICB9CiAgICByZXR1cm4gbmFtZTsKICB9CgogIC8vLyBSZXR1cm5zIGEgdmFyaWFudCBvZiBbbmFtZV0gdGhhdCBjYW5ub3QgY2xhc2ggd2l0aCBhIG5hdGl2ZSBwcm9wZXJ0eSBuYW1lCiAgLy8vIChlLmcuIHRoZSBuYW1lIG9mIGEgbWV0aG9kIG9uIGEgSlMgRE9NIG9iamVjdCkuCiAgLy8vCiAgLy8vIElmIFtuYW1lXSBpcyBub3QgYW4gYW5ub3RhdGVkIG5hbWUsIHRoZSByZXN1bHQgd2lsbCBub3QgYmUgYW4gYW5ub3RhdGVkCiAgLy8vIG5hbWUgZWl0aGVyLgogIFN0cmluZyBfc2FuaXRpemVGb3JOYXRpdmVzKFN0cmluZyBuYW1lKSB7CiAgICBpZiAoIW5hbWUuY29udGFpbnMocickJykpIHsKICAgICAgLy8gUHJlcGVuZCAkJC4gVGhlIHJlc3VsdCBtdXN0IG5vdCBjb2luY2lkZSB3aXRoIGFuIGFubm90YXRlZCBuYW1lLgogICAgICBuYW1lID0gJ1wkXCQkbmFtZSc7CiAgICB9CiAgICByZXR1cm4gbmFtZTsKICB9CgogIC8vLyBSZXR1cm5zIGEgcHJvcG9zZWQgbmFtZSBmb3IgdGhlIGdpdmVuIHR5cGVkZWYgb3IgY2xhc3MgW2VsZW1lbnRdLgogIC8vLyBUaGUgcmV0dXJuZWQgaWQgaXMgZ3VhcmFudGVlZCB0byBiZSBhIHZhbGlkIEphdmFTY3JpcHQgaWRlbnRpZmllci4KICBTdHJpbmcgX3Byb3Bvc2VOYW1lRm9yVHlwZShFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIGVsZW1lbnQubmFtZS5yZXBsYWNlQWxsKF9ub25JZGVudGlmaWVyUkUsICdfJyk7CiAgfQoKICBzdGF0aWMgUmVnRXhwIF9ub25JZGVudGlmaWVyUkUgPSBuZXcgUmVnRXhwKHInW15BLVphLXowLTlfJF0nKTsKCiAgLy8vIFJldHVybnMgYSBwcm9wb3NlZCBuYW1lIGZvciB0aGUgZ2l2ZW4gdG9wLWxldmVsIG9yIHN0YXRpYyBtZW1iZXIKICAvLy8gW2VsZW1lbnRdLiBUaGUgcmV0dXJuZWQgaWQgaXMgZ3VhcmFudGVlZCB0byBiZSBhIHZhbGlkIEphdmFTY3JpcHQKICAvLy8gaWRlbnRpZmllci4KICBTdHJpbmcgX3Byb3Bvc2VOYW1lRm9yTWVtYmVyKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBpZiAoZWxlbWVudC5pc0NvbnN0cnVjdG9yKSB7CiAgICAgIHJldHVybiBfcHJvcG9zZU5hbWVGb3JDb25zdHJ1Y3RvcihlbGVtZW50KTsKICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpcyBKR2VuZXJhdG9yQm9keSkgewogICAgICByZXR1cm4gX3Byb3Bvc2VOYW1lRm9yTWVtYmVyKGVsZW1lbnQuZnVuY3Rpb24pICsgcickYm9keSc7CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCkgewogICAgICBDbGFzc0VudGl0eSBlbmNsb3NpbmdDbGFzcyA9IGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3M7CiAgICAgIHJldHVybiAnJHtlbmNsb3NpbmdDbGFzcy5uYW1lfV8ke2VsZW1lbnQubmFtZX0nOwogICAgfQogICAgcmV0dXJuIGVsZW1lbnQubmFtZS5yZXBsYWNlQWxsKCcrJywgJ18nKTsKICB9CgogIFN0cmluZyBfcHJvcG9zZU5hbWVGb3JMYXp5U3RhdGljR2V0dGVyKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gcickZ2V0JCcgKyBfcHJvcG9zZU5hbWVGb3JNZW1iZXIoZWxlbWVudCk7CiAgfQoKICBTdHJpbmcgX3Byb3Bvc2VOYW1lRm9yQ29uc3RydWN0b3IoQ29uc3RydWN0b3JFbnRpdHkgZWxlbWVudCkgewogICAgU3RyaW5nIGNsYXNzTmFtZSA9IGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MubmFtZTsKICAgIGlmIChlbGVtZW50LmlzR2VuZXJhdGl2ZUNvbnN0cnVjdG9yKSB7CiAgICAgIHJldHVybiAnJHtjbGFzc05hbWV9XCQke2VsZW1lbnQubmFtZX0nOwogICAgfSBlbHNlIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ2hhbmdlIGZhY3RvcnkgbmFtZSBlbmNvZGluZyBhcyB0byBub3QgaW5jbHVkZQogICAgICAvLyB0aGUgY2xhc3MtbmFtZSB0d2ljZS4KICAgICAgcmV0dXJuICcke2NsYXNzTmFtZX1fJHt1dGlscy5yZWNvbnN0cnVjdENvbnN0cnVjdG9yTmFtZShlbGVtZW50KX0nOwogICAgfQogIH0KCiAgLy8vIFJldHVybnMgYSBwcm9wb3NlZCBuYW1lIGZvciB0aGUgZ2l2ZW4gW0xpYnJhcnlFbGVtZW50XS4KICAvLy8gVGhlIHJldHVybmVkIGlkIGlzIGd1YXJhbnRlZWQgdG8gYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGlkZW50aWZpZXIuCiAgLy8gVE9ETyhzcmEpOiBQcmUtcHJvY2VzcyBsaWJyYXJpZXMgdG8gYXNzaWduIFtsaWJyYXJ5TG9uZ05hbWVzXSBpbiBhIHdheSB0aGF0CiAgLy8gaXMgaW5kZXBlbmRlbnQgb2YgdGhlIG9yZGVyIG9mIGNhbGxzIHRvIG5hbWVyLgogIFN0cmluZyBfcHJvcG9zZU5hbWVGb3JMaWJyYXJ5KExpYnJhcnlFbnRpdHkgbGlicmFyeSkgewogICAgU3RyaW5nIG5hbWUgPSBsaWJyYXJ5TG9uZ05hbWVzW2xpYnJhcnldOwogICAgaWYgKG5hbWUgIT0gbnVsbCkgcmV0dXJuIG5hbWU7CiAgICAvLyBVc2UgdGhlICdmaWxlJyBuYW1lLCBlLmcuICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCIgLT4gImV4cGVjdCIKICAgIG5hbWUgPSBsaWJyYXJ5LmNhbm9uaWNhbFVyaS5wYXRoOwogICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoJy8nKSArIDEpOwogICAgaWYgKG5hbWUuY29udGFpbnMoJy4nKSkgewogICAgICAvLyBEcm9wIGZpbGUgZXh0ZW5zaW9uLgogICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sYXN0SW5kZXhPZignLicpKTsKICAgIH0KICAgIC8vIFRoZSBmaWxlbmFtZSBiYXNlZCBuYW1lIGNhbiBjb250YWluIGFsbCBraW5kcyBvZiBuYXN0eSBjaGFyYWN0ZXJzLiBNYWtlCiAgICAvLyBzdXJlIGl0IGlzIGFuIGlkZW50aWZpZXIuCiAgICBpZiAoIUlERU5USUZJRVIuaGFzTWF0Y2gobmFtZSkpIHsKICAgICAgU3RyaW5nIHJlcGxhY2VyKE1hdGNoIG1hdGNoKSB7CiAgICAgICAgU3RyaW5nIHMgPSBtYXRjaFswXTsKICAgICAgICBpZiAocyA9PSAnLicpIHJldHVybiAnXyc7CiAgICAgICAgcmV0dXJuIHMuY29kZVVuaXRBdCgwKS50b1JhZGl4U3RyaW5nKDE2KTsKICAgICAgfQoKICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZUFsbE1hcHBlZChOT05fSURFTlRJRklFUl9DSEFSLCByZXBsYWNlcik7CiAgICAgIGlmICghSURFTlRJRklFUi5oYXNNYXRjaChuYW1lKSkgewogICAgICAgIC8vIGUuZy4gc3RhcnRzIHdpdGggZGlnaXQuCiAgICAgICAgbmFtZSA9ICdsaWJfJG5hbWUnOwogICAgICB9CiAgICB9CiAgICAvLyBOYW1lcyBjb25zdHJ1Y3RlZCBiYXNlZCBvbiBhIGxpYmFyeSBuYW1lIHdpbGwgYmUgZnVydGhlciBkaXNhbWJpZ3VhdGVkLgogICAgLy8gSG93ZXZlciwgYXMgbmFtZXMgZnJvbSB0aGUgc2FtZSBsaWJhcnkgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbGlicmFyeQogICAgLy8gbmFtZSBwYXJ0LCB3ZSBkaXNhbWJpZ3VhdGUgdGhlIGxpYnJhcnkgbmFtZSBoZXJlLgogICAgU3RyaW5nIGRpc2FtYmlndWF0ZWQgPSBuYW1lOwogICAgZm9yIChpbnQgYyA9IDA7IGxpYnJhcnlMb25nTmFtZXMuY29udGFpbnNWYWx1ZShkaXNhbWJpZ3VhdGVkKTsgYysrKSB7CiAgICAgIGRpc2FtYmlndWF0ZWQgPSAiJG5hbWUkYyI7CiAgICB9CiAgICBsaWJyYXJ5TG9uZ05hbWVzW2xpYnJhcnldID0gZGlzYW1iaWd1YXRlZDsKICAgIHJldHVybiBkaXNhbWJpZ3VhdGVkOwogIH0KCiAgU3RyaW5nIHN1ZmZpeEZvckdldEludGVyY2VwdG9yKEl0ZXJhYmxlPENsYXNzRW50aXR5PiBjbGFzc2VzKSB7CiAgICBTdHJpbmcgYWJicmV2aWF0ZShDbGFzc0VudGl0eSBjbHMpIHsKICAgICAgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MpIHJldHVybiAibyI7CiAgICAgIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzU3RyaW5nQ2xhc3MpIHJldHVybiAicyI7CiAgICAgIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzQXJyYXlDbGFzcykgcmV0dXJuICJhIjsKICAgICAgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNEb3VibGVDbGFzcykgcmV0dXJuICJkIjsKICAgICAgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNJbnRDbGFzcykgcmV0dXJuICJpIjsKICAgICAgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNOdW1iZXJDbGFzcykgcmV0dXJuICJuIjsKICAgICAgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNOdWxsQ2xhc3MpIHJldHVybiAidSI7CiAgICAgIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzQm9vbENsYXNzKSByZXR1cm4gImIiOwogICAgICBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5qc0ludGVyY2VwdG9yQ2xhc3MpIHJldHVybiAiSSI7CiAgICAgIHJldHVybiBjbHMubmFtZTsKICAgIH0KCiAgICBMaXN0PFN0cmluZz4gbmFtZXMgPSBjbGFzc2VzCiAgICAgICAgLndoZXJlKChjbHMpID0+ICFfbmF0aXZlRGF0YS5pc05hdGl2ZU9yRXh0ZW5kc05hdGl2ZShjbHMpKQogICAgICAgIC5tYXAoYWJicmV2aWF0ZSkKICAgICAgICAudG9MaXN0KCk7CiAgICAvLyBUaGVyZSBpcyBvbmUgZGlzcGF0Y2ggbWVjaGFuaXNtIGZvciBhbGwgbmF0aXZlIGNsYXNzZXMuCiAgICBpZiAoY2xhc3Nlcy5hbnkoKGNscykgPT4gX25hdGl2ZURhdGEuaXNOYXRpdmVPckV4dGVuZHNOYXRpdmUoY2xzKSkpIHsKICAgICAgbmFtZXMuYWRkKCJ4Iik7CiAgICB9CiAgICAvLyBTb3J0IHRoZSBuYW1lcyBvZiB0aGUgY2xhc3NlcyBhZnRlciBhYmJyZXZpYXRpbmcgdGhlbSB0byBlbnN1cmUKICAgIC8vIHRoZSBzdWZmaXggaXMgc3RhYmxlIGFuZCBwcmVkaWN0YWJsZSBmb3IgdGhlIHN1Z2dlc3RlZCBuYW1lcy4KICAgIG5hbWVzLnNvcnQoKTsKICAgIHJldHVybiBuYW1lcy5qb2luKCk7CiAgfQoKICBTdHJpbmcgX2dldFN1ZmZpeEZvckludGVyY2VwdGVkQ2xhc3NlcyhJdGVyYWJsZTxDbGFzc0VudGl0eT4gY2xhc3NlcykgewogICAgaWYgKGNsYXNzZXMuaXNFbXB0eSkgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIsc3JhKTogSWYgW2NsYXNzZXNdIGlzIGVtcHR5IGl0IHNob3VsZCBlaXRoZXIgaGF2ZQogICAgICAvLyBpdHMgb3duIHN1ZmZpeCAobGlrZSBoZXJlKSwgb3IgYWx3YXlzIGJlIGVxdWF0ZWQgd2l0aCB0aGUgc2V0IG9mCiAgICAgIC8vIGNsYXNzZXMgdGhhdCBjb250YWluIGBJbnRlcmNlcHRvcmAuIEZvciB0aGUgbGF0dGVyIHRvIHdvcmsgd2UgbmVlZCB0bwogICAgICAvLyB1cGRhdGUgYE9uZVNob3RJbnRlcmNlcHRvckRhdGEucmVnaXN0ZXJTcGVjaWFsaXplZEdldEludGVyY2VwdG9yYCwKICAgICAgLy8gc2luY2UgaXQgY3VycmVudGx5IHdvdWxkIG90aGVyd2lzZSBwb3RlbnRpYWxseSBvdmVyd3JpdGUgdGhlIGFsbAogICAgICAvLyBpbnRlcmNlcHRlZCBjbGFzc2VzIGNhc2Ugd2l0aCB0aGUgZW1wdHkgY2FzZS4KICAgICAgcmV0dXJuICd6JzsKICAgIH0gZWxzZSBpZiAoY2xhc3Nlcy5jb250YWlucyhfY29tbW9uRWxlbWVudHMuanNJbnRlcmNlcHRvckNsYXNzKSkgewogICAgICAvLyBJZiB0aGUgYmFzZSBJbnRlcmNlcHRvciBjbGFzcyBpcyBpbiB0aGUgc2V0IG9mIGludGVyY2VwdGVkIGNsYXNzZXMsCiAgICAgIC8vIHRoaXMgaXMgdGhlIG1vc3QgZ2VuZXJhbCBzcGVjaWFsaXphdGlvbiB3aGljaCB1c2VzIHRoZSBnZW5lcmljCiAgICAgIC8vIGdldEludGVyY2VwdG9yIG1ldGhvZC4KICAgICAgLy8gVE9ETyhzcmEpOiBGaW5kIGEgd2F5IHRvIGdldCB0aGUgc2ltcGxlIG5hbWUgd2hlbiBPYmplY3QgaXMgbm90IGluIHRoZQogICAgICAvLyBzZXQgb2YgY2xhc3NlcyBmb3IgbW9zdCBnZW5lcmFsIHZhcmlhbnQsIGUuZy4gIiRsdCRuIiBjb3VsZCBiZSAiJGx0Ii4KICAgICAgcmV0dXJuICcnOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHN1ZmZpeEZvckdldEludGVyY2VwdG9yKGNsYXNzZXMpOwogICAgfQogIH0KCiAgLy8vIFByb3BlcnR5IG5hbWUgdXNlZCBmb3IgYSBzcGVjaWFsaXphdGlvbiBvZiBgZ2V0SW50ZXJjZXB0b3JgLgogIC8vLwogIC8vLyBqc19ydW50aW1lIGNvbnRhaW5zIGEgdG9wLWxldmVsIGBnZXRJbnRlcmNlcHRvcmAgbWV0aG9kLiBUaGUKICAvLy8gc3BlY2lhbGl6YXRpb25zIGhhdmUgdGhlIHNhbWUgbmFtZSwgYnV0IHdpdGggYSBzdWZmaXggdG8gYXZvaWQgbmFtZQogIC8vLyBjb2xsaXNpb25zLgogIGpzQXN0Lk5hbWUgbmFtZUZvckdldEludGVyY2VwdG9yKEl0ZXJhYmxlPENsYXNzRW50aXR5PiBjbGFzc2VzKSB7CiAgICAvLyBJZiB0aGUgYmFzZSBJbnRlcmNlcHRvciBjbGFzcyBpcyBpbiB0aGUgc2V0IG9mIGludGVyY2VwdGVkIGNsYXNzZXMsIHdlCiAgICAvLyBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIGdlbmVyaWMgZ2V0SW50ZXJjZXB0b3IgbWV0aG9kIChhbnkgc3ViY2xhc3Mgb2YgdGhlCiAgICAvLyBiYXNlIEludGVyY2VwdG9yIGNvdWxkIG1hdGNoKSwgd2hpY2ggaXMgZW5jb2RlZCBhcyBhbiBlbXB0eSBzdWZmaXguCiAgICBTdHJpbmcgc3VmZml4ID0gX2dldFN1ZmZpeEZvckludGVyY2VwdGVkQ2xhc3NlcyhjbGFzc2VzKTsKICAgIHJldHVybiBfZGlzYW1iaWd1YXRlSW50ZXJuYWxHbG9iYWwoJ2dldEludGVyY2VwdG9yXCQkc3VmZml4Jyk7CiAgfQoKICAvLy8gUHJvcGVydHkgbmFtZSB1c2VkIGZvciB0aGUgb25lLXNob3QgaW50ZXJjZXB0b3IgbWV0aG9kIGZvciB0aGUgZ2l2ZW4KICAvLy8gW3NlbGVjdG9yXSBhbmQgcmV0dXJuLXR5cGUgc3BlY2lhbGl6YXRpb24uCiAganNBc3QuTmFtZSBuYW1lRm9yR2V0T25lU2hvdEludGVyY2VwdG9yKAogICAgICBTZWxlY3RvciBzZWxlY3RvciwgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGNsYXNzZXMpIHsKICAgIC8vIFRoZSBvbmUtc2hvdCBuYW1lIGlzIGEgZ2xvYmFsIG5hbWUgZGVyaXZlZCBmcm9tIHRoZSBpbnZvY2F0aW9uIG5hbWUuICBUbwogICAgLy8gYXZvaWQgaW5zdGFiaWxpdHkgd2Ugd291bGQgbGlrZSB0aGUgbmFtZXMgdG8gYmUgdW5pcXVlIGFuZCBub3QgY2xhc2ggd2l0aAogICAgLy8gb3RoZXIgZ2xvYmFsIG5hbWVzLgogICAganNBc3QuTmFtZSByb290ID0gaW52b2NhdGlvbk5hbWUoc2VsZWN0b3IpOwoKICAgIFN0cmluZyBzdWZmaXggPSBfZ2V0U3VmZml4Rm9ySW50ZXJjZXB0ZWRDbGFzc2VzKGNsYXNzZXMpOwogICAgcmV0dXJuIG5ldyBDb21wb3VuZE5hbWUoCiAgICAgICAgW3Jvb3QsIF9saXRlcmFsRG9sbGFyLCBuZXcgU3RyaW5nQmFja2VkTmFtZShzdWZmaXgpXSk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgcnVudGltZSBuYW1lIGZvciBbZWxlbWVudF0uCiAgLy8vCiAgLy8vIFRoaXMgbmFtZSBpcyB1c2VkIGFzIHRoZSBiYXNpcyBmb3IgZGVyaXZpbmcgYGlzYCBhbmQgYGFzYCBwcm9wZXJ0eSBuYW1lcwogIC8vLyBmb3IgdGhlIGdpdmVuIHR5cGUuCiAgLy8vCiAgLy8vIFRoZSByZXN1bHQgaXMgbm90IGFsd2F5cyBzYWZlIGFzIGEgcHJvcGVydHkgbmFtZSB1bmxlc3MgcHJlZml4aW5nCiAgLy8vIFtvcGVyYXRvcklzUHJlZml4XSBvciBbb3BlcmF0b3JBc1ByZWZpeF0uIElmIHRoaXMgaXMgYSBmdW5jdGlvbiB0eXBlLAogIC8vLyB0aGVuIGJ5IGNvbnZlbnRpb24sIGFuIHVuZGVyc2NvcmUgbXVzdCBhbHNvIHNlcGFyYXRlIFtvcGVyYXRvcklzUHJlZml4XQogIC8vLyBmcm9tIHRoZSB0eXBlIG5hbWUuCiAganNBc3QuTmFtZSBydW50aW1lVHlwZU5hbWUoRW50aXR5IGVsZW1lbnQpIHsKICAgIGlmIChlbGVtZW50ID09IG51bGwpIHJldHVybiBfbGl0ZXJhbER5bmFtaWM7CiAgICAvLyBUaGUgcmV0dXJuZWQgbmFtZSBhZmZlY3RzIGJvdGggdGhlIGdsb2JhbCBhbmQgaW5zdGFuY2UgbWVtYmVyIG5hbWVzcGFjZXM6CiAgICAvLwogICAgLy8gLSBJZiBnaXZlbiBhIGNsYXNzLCB0aGlzIG11c3QgY29pbmNpZGUgd2l0aCB0aGUgY2xhc3MgbmFtZSwgd2hpY2gKICAgIC8vICAgaXMgYWxzbyB0aGUgR0xPQkFMIHByb3BlcnR5IG5hbWUgb2YgaXRzIGNvbnN0cnVjdG9yLgogICAgLy8KICAgIC8vIC0gVGhlIHJlc3VsdCBpcyB1c2VkIHRvIGRlcml2ZSBgJGlzWGAgYW5kIGAkYXNYYCBuYW1lcywgd2hpY2ggYXJlIHVzZWQKICAgIC8vICAgYXMgSU5TVEFOQ0UgcHJvcGVydHkgbmFtZXMuCiAgICAvLwogICAgLy8gVG8gcHJldmVudCBjbGFzaGVzIGluIGJvdGggbmFtZXNwYWNlcyBhdCBvbmNlLCB3ZSBkaXNhbWJpZ3VhdGUgdGhlIG5hbWUKICAgIC8vIGFzIGEgZ2xvYmFsIGhlcmUsIGFuZCBpbiBbX3Nhbml0aXplRm9yQW5ub3RhdGlvbnNdIHdlIGVuc3VyZSB0aGF0CiAgICAvLyBvcmRpbmFyeSBpbnN0YW5jZSBtZW1iZXJzIGNhbm5vdCBzdGFydCB3aXRoIGAkaXNgIG9yIGAkYXNgLgogICAgcmV0dXJuIF9kaXNhbWJpZ3VhdGVHbG9iYWxUeXBlKGVsZW1lbnQpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIGRpc2FtYmlndWF0ZWQgbmFtZSBvZiBbY2xhc3NfXS4KICAvLy8KICAvLy8gVGhpcyBpcyBib3RoIHRoZSAqcnVudGltZSB0eXBlKiBvZiB0aGUgY2xhc3MgKHNlZSBbcnVudGltZVR5cGVOYW1lXSkKICAvLy8gYW5kIGEgZ2xvYmFsIHByb3BlcnR5IG5hbWUgaW4gd2hpY2ggdG8gc3RvcmUgaXRzIEpTIGNvbnN0cnVjdG9yLgogIGpzQXN0Lk5hbWUgY2xhc3NOYW1lKENsYXNzRW50aXR5IGNsYXNzXykgPT4gX2Rpc2FtYmlndWF0ZUdsb2JhbFR5cGUoY2xhc3NfKTsKCiAgLy8vIFByb3BlcnR5IG5hbWUgb24gd2hpY2ggW21lbWJlcl0gY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5LAogIC8vLyB3aXRob3V0IGNsYXNoaW5nIHdpdGggYW5vdGhlciBKUyBwcm9wZXJ0eSBuYW1lLgogIC8vLwogIC8vLyBUaGlzIGlzIHVzZWQgZm9yIGltcGxlbWVudGluZyBzdXBlci1jYWxscywgd2hlcmUgb3JkaW5hcnkgZGlzcGF0Y2gKICAvLy8gc2VtYW50aWNzIG11c3QgYmUgY2lyY3VtdmVudGVkLiBGb3IgZXhhbXBsZToKICAvLy8KICAvLy8gICAgIGNsYXNzIEEgeyBmb28oKSB9CiAgLy8vICAgICBjbGFzcyBCIGV4dGVuZHMgQSB7CiAgLy8vICAgICAgICAgZm9vKCkgeyBzdXBlci5mb28oKSB9CiAgLy8vICAgICB9CiAgLy8vCiAgLy8vIEV4YW1wbGUgdHJhbnNsYXRpb24gdG8gSlM6CiAgLy8vCiAgLy8vICAgICBBLnByb3RvdHlwZS5zdXBlciRBJGZvbyA9IGZ1bmN0aW9uKCkgey4uLn0KICAvLy8gICAgIEEucHJvdG90eXBlLmZvbyQwID0gQS5wcm90b3R5cGUuc3VwZXIkQSRmb28KICAvLy8KICAvLy8gICAgIEIucHJvdG90eXBlLmZvbyQwID0gZnVuY3Rpb24oKSB7CiAgLy8vICAgICAgICAgdGhpcy5zdXBlciRBJGZvbygpOyAvLyBzdXBlci5mb28oKQogIC8vLyAgICAgfQogIC8vLwogIGpzQXN0Lk5hbWUgYWxpYXNlZFN1cGVyTWVtYmVyUHJvcGVydHlOYW1lKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIGFzc2VydCghbWVtYmVyLmlzRmllbGQpOyAvLyBGaWVsZHMgZG8gbm90IG5lZWQgc3VwZXIgYWxpYXNlcy4KICAgIHJldHVybiBfZGlzYW1iaWd1YXRlSW50ZXJuYWxNZW1iZXIobWVtYmVyLCAoKSB7CiAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBtZW1iZXIuZW5jbG9zaW5nQ2xhc3MubmFtZS5yZXBsYWNlQWxsKCcmJywgJ18nKTsKICAgICAgU3RyaW5nIGludm9jYXRpb25OYW1lID0gb3BlcmF0b3JOYW1lVG9JZGVudGlmaWVyKG1lbWJlci5uYW1lKTsKICAgICAgcmV0dXJuICJzdXBlclwkJHtjbGFzc05hbWV9XCQkaW52b2NhdGlvbk5hbWUiOwogICAgfSk7CiAgfQoKICAvLy8gUHJvcGVydHkgbmFtZSBpbiB3aGljaCB0byBzdG9yZSB0aGUgZ2l2ZW4gc3RhdGljIG9yIGluc3RhbmNlIFttZXRob2RdLgogIC8vLyBGb3IgaW5zdGFuY2UgbWV0aG9kcywgdGhpcyBpbmNsdWRlcyB0aGUgc3VmZml4IGVuY29kaW5nIGFyaXR5IGFuZCBuYW1lZAogIC8vLyBwYXJhbWV0ZXJzLgogIC8vLwogIC8vLyBUaGUgbmFtZSBpcyBub3QgbmVjZXNzYXJpbHkgdW5pcXVlIHRvIFttZXRob2RdLCBzaW5jZSBhIHN0YXRpYyBtZXRob2QKICAvLy8gbWF5IHNoYXJlIGl0cyBuYW1lIHdpdGggYW4gaW5zdGFuY2UgbWV0aG9kLgogIGpzQXN0Lk5hbWUgbWV0aG9kUHJvcGVydHlOYW1lKEZ1bmN0aW9uRW50aXR5IG1ldGhvZCkgewogICAgcmV0dXJuIG1ldGhvZC5pc0luc3RhbmNlTWVtYmVyCiAgICAgICAgPyBpbnN0YW5jZU1ldGhvZE5hbWUobWV0aG9kKQogICAgICAgIDogZ2xvYmFsUHJvcGVydHlOYW1lRm9yTWVtYmVyKG1ldGhvZCk7CiAgfQoKICAvLy8gUmV0dXJucyB0cnVlIGlmIFtlbGVtZW50XSBpcyBzdG9yZWQgaW4gdGhlIHN0YXRpYyBzdGF0ZSBob2xkZXIKICAvLy8gKFtzdGF0aWNTdGF0ZUhvbGRlcl0pLiAgV2UgaW50ZW5kIHRvIHN0b3JlIG9ubHkgbXV0YWJsZSBzdGF0aWMgc3RhdGUKICAvLy8gdGhlcmUsIHdoZXJlYXMgY29uc3RhbnRzIGFyZSBzdG9yZWQgaW4gJ0MnLiBGdW5jdGlvbnMsIGFjY2Vzc29ycywKICAvLy8gY2xhc3NlcywgZXRjLiBhcmUgc3RvcmVkIGluIG9uZSBvZiB0aGUgb3RoZXIgb2JqZWN0cyBpbgogIC8vLyBbcmVzZXJ2ZWRHbG9iYWxPYmplY3ROYW1lc10uCiAgYm9vbCBfaXNQcm9wZXJ0eU9mU3RhdGljU3RhdGVIb2xkZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIC8vIFRPRE8oYWhlKTogTWFrZSBzdXJlIHRoaXMgbWV0aG9kJ3MgZG9jdW1lbnRhdGlvbiBpcyBhbHdheXMgdHJ1ZSBhbmQKICAgIC8vIHJlbW92ZSB0aGUgd29yZCAiaW50ZW5kIi4KICAgIHJldHVybiBlbGVtZW50LmlzRmllbGQ7CiAgfQoKICAvLy8gUmV0dXJucyBbc3RhdGljU3RhdGVIb2xkZXJdIG9yIG9uZSBvZiBbcmVzZXJ2ZWRHbG9iYWxPYmplY3ROYW1lc10uCiAgU3RyaW5nIGdsb2JhbE9iamVjdEZvck1lbWJlcihNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgaWYgKF9pc1Byb3BlcnR5T2ZTdGF0aWNTdGF0ZUhvbGRlcihlbGVtZW50KSkgcmV0dXJuIHN0YXRpY1N0YXRlSG9sZGVyOwogICAgcmV0dXJuIGdsb2JhbE9iamVjdEZvckxpYnJhcnkoZWxlbWVudC5saWJyYXJ5KTsKICB9CgogIFN0cmluZyBnbG9iYWxPYmplY3RGb3JDbGFzcyhDbGFzc0VudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gZ2xvYmFsT2JqZWN0Rm9yTGlicmFyeShlbGVtZW50LmxpYnJhcnkpOwogIH0KCiAgU3RyaW5nIGdsb2JhbE9iamVjdEZvclR5cGUoRW50aXR5IGVsZW1lbnQpIHsKICAgIGlmIChlbGVtZW50IGlzIFR5cGVkZWZFbnRpdHkpIHsKICAgICAgcmV0dXJuIGdsb2JhbE9iamVjdEZvckxpYnJhcnkoZWxlbWVudC5saWJyYXJ5KTsKICAgIH0KICAgIHJldHVybiBnbG9iYWxPYmplY3RGb3JDbGFzcyhlbGVtZW50KTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBbcmVzZXJ2ZWRHbG9iYWxPYmplY3ROYW1lc10gZm9yIFtsaWJyYXJ5XS4KICBTdHJpbmcgZ2xvYmFsT2JqZWN0Rm9yTGlicmFyeShMaWJyYXJ5RW50aXR5IGxpYnJhcnkpIHsKICAgIGlmIChsaWJyYXJ5ID09IF9jb21tb25FbGVtZW50cy5pbnRlcmNlcHRvcnNMaWJyYXJ5KSByZXR1cm4gJ0onOwogICAgVXJpIHVyaSA9IGxpYnJhcnkuY2Fub25pY2FsVXJpOwogICAgaWYgKHVyaS5zY2hlbWUgPT0gJ2RhcnQnKSB7CiAgICAgIGlmICh1cmkucGF0aCA9PSAnaHRtbCcpIHJldHVybiAnVyc7CiAgICAgIGlmICh1cmkucGF0aC5zdGFydHNXaXRoKCdfJykpIHJldHVybiAnSCc7CiAgICAgIHJldHVybiAnUCc7CiAgICB9CiAgICByZXR1cm4gdXNlckdsb2JhbE9iamVjdHNbbGlicmFyeS5uYW1lLmhhc2hDb2RlICUgdXNlckdsb2JhbE9iamVjdHMubGVuZ3RoXTsKICB9CgogIGpzQXN0Lk5hbWUgbGF6eUluaXRpYWxpemVyTmFtZShGaWVsZEVudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQoZWxlbWVudC5pc1RvcExldmVsIHx8IGVsZW1lbnQuaXNTdGF0aWMpOwogICAganNBc3QuTmFtZSBuYW1lID0gX2Rpc2FtYmlndWF0ZUdsb2JhbDxNZW1iZXJFbnRpdHk+KAogICAgICAgIGVsZW1lbnQsIF9wcm9wb3NlTmFtZUZvckxhenlTdGF0aWNHZXR0ZXIsIHVzZXJHbG9iYWxzU2Vjb25kTmFtZSk7CiAgICByZXR1cm4gbmFtZTsKICB9CgogIGpzQXN0Lk5hbWUgc3RhdGljQ2xvc3VyZU5hbWUoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgewogICAgYXNzZXJ0KGVsZW1lbnQuaXNUb3BMZXZlbCB8fCBlbGVtZW50LmlzU3RhdGljKTsKICAgIFN0cmluZyBlbmNsb3NpbmcgPQogICAgICAgIGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MgPT0gbnVsbCA/ICIiIDogZWxlbWVudC5lbmNsb3NpbmdDbGFzcy5uYW1lOwogICAgU3RyaW5nIGxpYnJhcnkgPSBfcHJvcG9zZU5hbWVGb3JMaWJyYXJ5KGVsZW1lbnQubGlicmFyeSk7CiAgICByZXR1cm4gX2Rpc2FtYmlndWF0ZUludGVybmFsR2xvYmFsKAogICAgICAgICIke2xpYnJhcnl9XyR7ZW5jbG9zaW5nfV8ke2VsZW1lbnQubmFtZX1cJGNsb3N1cmUiKTsKICB9CgogIC8vIFRoaXMgbmFtZSBpcyB1c2VkIGFzIHBhcnQgb2YgdGhlIG5hbWUgb2YgYSBUeXBlQ29uc3RhbnQKICBTdHJpbmcgdW5pcXVlTmFtZUZvclR5cGVDb25zdGFudEVsZW1lbnQoCiAgICAgIExpYnJhcnlFbnRpdHkgbGlicmFyeSwgRW50aXR5IGVsZW1lbnQpIHsKICAgIC8vIFRPRE8oc3JhKTogSWYgd2UgcmVwbGFjZSB0aGUgcGVyaW9kIHdpdGggYW4gaWRlbnRpZmllciBjaGFyYWN0ZXIsCiAgICAvLyBUeXBlQ29uc3RhbnRzIHdpbGwgaGF2ZSBiZXR0ZXIgbmFtZXMgaW4gdW5taW5pZmllZCBjb2RlLgogICAgU3RyaW5nIGxpYnJhcnlOYW1lID0gX3Byb3Bvc2VOYW1lRm9yTGlicmFyeShsaWJyYXJ5KTsKICAgIHJldHVybiAiJHtsaWJyYXJ5TmFtZX0uJHtlbGVtZW50Lm5hbWV9IjsKICB9CgogIFN0cmluZyBnbG9iYWxPYmplY3RGb3JDb25zdGFudChDb25zdGFudFZhbHVlIGNvbnN0YW50KSA9PiAnQyc7CgogIFN0cmluZyBnZXQgb3BlcmF0b3JJc1ByZWZpeCA9PiByJyRpcyc7CgogIFN0cmluZyBnZXQgb3BlcmF0b3JBc1ByZWZpeCA9PiByJyRhcyc7CgogIFN0cmluZyBnZXQgb3BlcmF0b3JTaWduYXR1cmUgPT4gcickc2lnbmF0dXJlJzsKCiAgU3RyaW5nIGdldCBnZW5lcmljSW5zdGFudGlhdGlvblByZWZpeCA9PiByJyRpbnN0YW50aWF0ZSc7CgogIFN0cmluZyBnZXQgdHlwZWRlZlRhZyA9PiByJ3R5cGVkZWYnOwoKICBTdHJpbmcgZ2V0IGZ1bmN0aW9uVHlwZVRhZyA9PiByJ2Z1bmMnOwoKICBTdHJpbmcgZ2V0IGZ1bmN0aW9uVHlwZVZvaWRSZXR1cm5UYWcgPT4gcid2JzsKCiAgU3RyaW5nIGdldCBmdW5jdGlvblR5cGVSZXR1cm5UeXBlVGFnID0+IHIncmV0JzsKCiAgU3RyaW5nIGdldCBmdW5jdGlvblR5cGVSZXF1aXJlZFBhcmFtZXRlcnNUYWcgPT4gcidhcmdzJzsKCiAgU3RyaW5nIGdldCBmdW5jdGlvblR5cGVPcHRpb25hbFBhcmFtZXRlcnNUYWcgPT4gcidvcHQnOwoKICBTdHJpbmcgZ2V0IGZ1bmN0aW9uVHlwZU5hbWVkUGFyYW1ldGVyc1RhZyA9PiByJ25hbWVkJzsKCiAgU3RyaW5nIGdldCBmdW5jdGlvblR5cGVHZW5lcmljQm91bmRzVGFnID0+IHInYm91bmRzJzsKCiAgU3RyaW5nIGdldCBmdXR1cmVPclRhZyA9PiByJ2Z1dHVyZU9yJzsKCiAgU3RyaW5nIGdldCBmdXR1cmVPclR5cGVUYWcgPT4gcid0eXBlJzsKCiAgLy8gVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHVzZWQgdG8gb2Zmc2V0IGZ1bmN0aW9uIHNpZ25hdHVyZXMgaW4gZGVmZXJyZWQKICAvLyBwYXJ0cyB3aXRoIHRoZSBmYXN0LXN0YXJ0dXAgZW1pdHRlci4KICBTdHJpbmcgZ2V0IHR5cGVzT2Zmc2V0TmFtZSA9PiByJ3R5cGVzT2Zmc2V0JzsKCiAgTWFwPEZ1bmN0aW9uVHlwZSwganNBc3QuTmFtZT4gZnVuY3Rpb25UeXBlTmFtZU1hcCA9IEhhc2hNYXAoKTsKCiAgRnVuY3Rpb25UeXBlTmFtZXIgX2Z1bmN0aW9uVHlwZU5hbWVyOwoKICBqc0FzdC5OYW1lIGdldEZ1bmN0aW9uVHlwZU5hbWUoRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uVHlwZU5hbWVNYXAucHV0SWZBYnNlbnQoZnVuY3Rpb25UeXBlLCAoKSB7CiAgICAgIF9mdW5jdGlvblR5cGVOYW1lciA/Pz0gbmV3IEZ1bmN0aW9uVHlwZU5hbWVyKHJ0aUVuY29kZXIpOwogICAgICBTdHJpbmcgcHJvcG9zZWROYW1lID0gX2Z1bmN0aW9uVHlwZU5hbWVyLmNvbXB1dGVOYW1lKGZ1bmN0aW9uVHlwZSk7CiAgICAgIHJldHVybiBnZXRGcmVzaE5hbWUoaW5zdGFuY2VTY29wZSwgcHJvcG9zZWROYW1lKTsKICAgIH0pOwogIH0KCiAganNBc3QuTmFtZSBvcGVyYXRvcklzVHlwZShEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZS5pc0Z1bmN0aW9uVHlwZSkgewogICAgICAvLyBUT0RPKGVyaWtjb3JyeSk6IFJlZHVjZSBmcm9tICRpc3ggdG8gaXggd2hlbiB3ZSBhcmUgbWluaWZ5aW5nLgogICAgICByZXR1cm4gbmV3IENvbXBvdW5kTmFtZShbCiAgICAgICAgbmV3IFN0cmluZ0JhY2tlZE5hbWUob3BlcmF0b3JJc1ByZWZpeCksCiAgICAgICAgX2xpdGVyYWxVbmRlcnNjb3JlLAogICAgICAgIGdldEZ1bmN0aW9uVHlwZU5hbWUodHlwZSkKICAgICAgXSk7CiAgICB9CiAgICBJbnRlcmZhY2VUeXBlIGludGVyZmFjZVR5cGUgPSB0eXBlOwogICAgcmV0dXJuIG9wZXJhdG9ySXMoaW50ZXJmYWNlVHlwZS5lbGVtZW50KTsKICB9CgogIGpzQXN0Lk5hbWUgb3BlcmF0b3JJcyhDbGFzc0VudGl0eSBlbGVtZW50KSB7CiAgICAvLyBUT0RPKGVyaWtjb3JyeSk6IFJlZHVjZSBmcm9tICRpc3ggdG8gaXggd2hlbiB3ZSBhcmUgbWluaWZ5aW5nLgogICAgcmV0dXJuIG5ldyBDb21wb3VuZE5hbWUoCiAgICAgICAgW25ldyBTdHJpbmdCYWNrZWROYW1lKG9wZXJhdG9ySXNQcmVmaXgpLCBydW50aW1lVHlwZU5hbWUoZWxlbWVudCldKTsKICB9CgogIC8vLyBSZXR1cm5zIGEgbmFtZSB0aGF0IGRvZXMgbm90IGNsYXNoIHdpdGggcmVzZXJ2ZWQgSlMga2V5d29yZHMuCiAgU3RyaW5nIF9zYW5pdGl6ZUZvcktleXdvcmRzKFN0cmluZyBuYW1lKSB7CiAgICBpZiAoanNSZXNlcnZlZC5jb250YWlucyhuYW1lKSkgewogICAgICBuYW1lID0gJ1wkJG5hbWUnOwogICAgfQogICAgYXNzZXJ0KCFqc1Jlc2VydmVkLmNvbnRhaW5zKG5hbWUpKTsKICAgIHJldHVybiBuYW1lOwogIH0KCiAganNBc3QuTmFtZSBzdWJzdGl0dXRpb25OYW1lKENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBuZXcgQ29tcG91bmROYW1lKAogICAgICAgIFtuZXcgU3RyaW5nQmFja2VkTmFtZShvcGVyYXRvckFzUHJlZml4KSwgcnVudGltZVR5cGVOYW1lKGVsZW1lbnQpXSk7CiAgfQoKICAvLy8gVHJhbnNsYXRlcyBhIFtTdHJpbmddIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgW05hbWVdIGRhdGEgc3RydWN0dXJlIGFzCiAgLy8vIHVzZWQgYnkgdGhlIG5hbWVyLgogIC8vLwogIC8vLyBJZiBbbmFtZV0gaXMgYSBzZXR0ZXIgb3IgZ2V0dGVyIG5hbWUsIHRoZSBjb3JyZXNwb25kaW5nIFtHZXR0ZXJOYW1lXSBvcgogIC8vLyBbU2V0dGVyTmFtZV0gZGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZC4KICBqc0FzdC5OYW1lIGFzTmFtZShTdHJpbmcgbmFtZSkgewogICAgaWYgKG5hbWUuc3RhcnRzV2l0aChnZXR0ZXJQcmVmaXgpICYmIG5hbWUubGVuZ3RoID4gZ2V0dGVyUHJlZml4Lmxlbmd0aCkgewogICAgICByZXR1cm4gbmV3IEdldHRlck5hbWUoX2xpdGVyYWxHZXR0ZXJQcmVmaXgsCiAgICAgICAgICBuZXcgU3RyaW5nQmFja2VkTmFtZShuYW1lLnN1YnN0cmluZyhnZXR0ZXJQcmVmaXgubGVuZ3RoKSkpOwogICAgfQogICAgaWYgKG5hbWUuc3RhcnRzV2l0aChzZXR0ZXJQcmVmaXgpICYmIG5hbWUubGVuZ3RoID4gc2V0dGVyUHJlZml4Lmxlbmd0aCkgewogICAgICByZXR1cm4gbmV3IEdldHRlck5hbWUoX2xpdGVyYWxTZXR0ZXJQcmVmaXgsCiAgICAgICAgICBuZXcgU3RyaW5nQmFja2VkTmFtZShuYW1lLnN1YnN0cmluZyhzZXR0ZXJQcmVmaXgubGVuZ3RoKSkpOwogICAgfQoKICAgIHJldHVybiBuZXcgU3RyaW5nQmFja2VkTmFtZShuYW1lKTsKICB9CgogIC8vLyBSZXR1cm5zIGEgdmFyaWFibGUgbmFtZSB0aGF0IGNhbm5vdCBjbGFzaCB3aXRoIGEga2V5d29yZCwgYSBnbG9iYWwKICAvLy8gdmFyaWFibGUsIG9yIGFueSBuYW1lIHN0YXJ0aW5nIHdpdGggYSBzaW5nbGUgJyQnLgogIC8vLwogIC8vLyBGdXJ0aGVybW9yZSwgdGhpcyBmdW5jdGlvbiBpcyBpbmplY3RpdmUsIHRoYXQgaXMsIGl0IG5ldmVyIHJldHVybnMgdGhlCiAgLy8vIHNhbWUgbmFtZSBmb3IgdHdvIGRpZmZlcmVudCBpbnB1dHMuCiAgU3RyaW5nIHNhZmVWYXJpYWJsZU5hbWUoU3RyaW5nIG5hbWUpIHsKICAgIG5hbWUgPSBuYW1lLnJlcGxhY2VBbGwoJyMnLCAnXycpOwogICAgaWYgKGpzVmFyaWFibGVSZXNlcnZlZC5jb250YWlucyhuYW1lKSB8fCBuYW1lLnN0YXJ0c1dpdGgocickJykpIHsKICAgICAgcmV0dXJuICdcJCRuYW1lJzsKICAgIH0KICAgIHJldHVybiBuYW1lOwogIH0KCiAgLy8vIFJldHVybnMgYSBzYWZlIHZhcmlhYmxlIG5hbWUgZm9yIHVzZSBpbiBhc3luYyByZXdyaXRpbmcuCiAgLy8vCiAgLy8vIEhhcyB0aGUgc2FtZSBwcm9wZXJ0eSBhcyBbc2FmZVZhcmlhYmxlTmFtZV0gYnV0IGRvZXMgbm90IGNsYXNoIHdpdGgKICAvLy8gbmFtZXMgcmV0dXJuZWQgZnJvbSB0aGVyZS4KICAvLy8gQWRkaXRpb25hbGx5LCB3aGVuIHVzZWQgYXMgYSBwcmVmaXggdG8gYSB2YXJpYWJsZSBuYW1lLCB0aGUgcmVzdWx0CiAgLy8vIHdpbGwgYmUgc2FmZSB0byB1c2UsIGFzIHdlbGwuCiAgU3RyaW5nIHNhZmVWYXJpYWJsZVByZWZpeEZvckFzeW5jUmV3cml0ZShTdHJpbmcgbmFtZSkgewogICAgcmV0dXJuICIkYXN5bmNQcmVmaXgkbmFtZSI7CiAgfQoKICBqc0FzdC5OYW1lIGRlcml2ZUFzeW5jQm9keU5hbWUoanNBc3QuTmFtZSBvcmlnaW5hbCkgewogICAgcmV0dXJuIG5ldyBfQXN5bmNOYW1lKF9saXRlcmFsQXN5bmNQcmVmaXgsIG9yaWdpbmFsKTsKICB9CgogIFN0cmluZyBvcGVyYXRvck5hbWVUb0lkZW50aWZpZXIoU3RyaW5nIG5hbWUpIHsKICAgIGlmIChuYW1lID09IG51bGwpIHJldHVybiBudWxsOwogICAgaWYgKG5hbWUgPT0gJz09JykgewogICAgICByZXR1cm4gcickZXEnOwogICAgfSBlbHNlIGlmIChuYW1lID09ICd+JykgewogICAgICByZXR1cm4gcickbm90JzsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnW10nKSB7CiAgICAgIHJldHVybiByJyRpbmRleCc7CiAgICB9IGVsc2UgaWYgKG5hbWUgPT0gJ1tdPScpIHsKICAgICAgcmV0dXJuIHInJGluZGV4U2V0JzsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnKicpIHsKICAgICAgcmV0dXJuIHInJG11bCc7CiAgICB9IGVsc2UgaWYgKG5hbWUgPT0gJy8nKSB7CiAgICAgIHJldHVybiByJyRkaXYnOwogICAgfSBlbHNlIGlmIChuYW1lID09ICclJykgewogICAgICByZXR1cm4gcickbW9kJzsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnfi8nKSB7CiAgICAgIHJldHVybiByJyR0ZGl2JzsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnKycpIHsKICAgICAgcmV0dXJuIHInJGFkZCc7CiAgICB9IGVsc2UgaWYgKG5hbWUgPT0gJzw8JykgewogICAgICByZXR1cm4gcickc2hsJzsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnPj4nKSB7CiAgICAgIHJldHVybiByJyRzaHInOwogICAgfSBlbHNlIGlmIChuYW1lID09ICc+PScpIHsKICAgICAgcmV0dXJuIHInJGdlJzsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnPicpIHsKICAgICAgcmV0dXJuIHInJGd0JzsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnPD0nKSB7CiAgICAgIHJldHVybiByJyRsZSc7CiAgICB9IGVsc2UgaWYgKG5hbWUgPT0gJzwnKSB7CiAgICAgIHJldHVybiByJyRsdCc7CiAgICB9IGVsc2UgaWYgKG5hbWUgPT0gJyYnKSB7CiAgICAgIHJldHVybiByJyRhbmQnOwogICAgfSBlbHNlIGlmIChuYW1lID09ICdeJykgewogICAgICByZXR1cm4gcickeG9yJzsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnfCcpIHsKICAgICAgcmV0dXJuIHInJG9yJzsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnLScpIHsKICAgICAgcmV0dXJuIHInJHN1Yic7CiAgICB9IGVsc2UgaWYgKG5hbWUgPT0gJ3VuYXJ5LScpIHsKICAgICAgcmV0dXJuIHInJG5lZ2F0ZSc7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmFtZTsKICAgIH0KICB9Cn0KCi8vLyBHZW5lcmF0b3Igb2YgbmFtZXMgZm9yIFtDb25zdGFudFZhbHVlXSB2YWx1ZXMuCi8vLwovLy8gVGhlIG5hbWVzIGFyZSBzdGFibGUgdW5kZXIgcGVydHVyYmF0aW9ucyBvZiB0aGUgc291cmNlLiAgVGhlIG5hbWUgaXMgZWl0aGVyCi8vLyBhIHNob3J0IHNlcXVlbmNlIG9mIHdvcmRzLCBpZiB0aGlzIGNhbiBiZSBmb3VuZCBmcm9tIHRoZSBjb25zdGFudCwgb3IgYSB0eXBlCi8vLyBmb2xsb3dlZCBieSBhIGhhc2ggdGFnLgovLy8KLy8vICAgICBMaXN0X2ltWCAgICAgICAgICAgICAgICAvLyBBIExpc3QsIHdpdGggaGFzaCB0YWcuCi8vLyAgICAgQ19TZW50aW5lbCAgICAgICAgICAgICAgLy8gY29uc3QgU2VudGluZWwoKSwgICJDXyIgYWRkZWQgdG8gYXZvaWQgY2xhc2gKLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHdpdGggY2xhc3MgbmFtZS4KLy8vICAgICBKU0ludF9tZXRob2RzICAgICAgICAgICAvLyBhbiBpbnRlcmNlcHRvci4KLy8vICAgICBEdXJhdGlvbl8xNjAwMCAgICAgICAgICAvLyBjb25zdCBEdXJhdGlvbihtaWxsaXNlY29uZHM6IDE2KQovLy8gICAgIEV2ZW50S2V5UHJvdmlkZXJfa2V5dXAgIC8vIGNvbnN0IEV2ZW50S2V5UHJvdmlkZXIoJ2tleXVwJykKLy8vCmNsYXNzIENvbnN0YW50TmFtaW5nVmlzaXRvciBpbXBsZW1lbnRzIENvbnN0YW50VmFsdWVWaXNpdG9yIHsKICBzdGF0aWMgZmluYWwgUmVnRXhwIElERU5USUZJRVIgPSBuZXcgUmVnRXhwKHInXltBLVphLXpfJF1bQS1aYS16MC05XyRdKiQnKTsKICBzdGF0aWMgY29uc3QgTUFYX0ZSQUdNRU5UUyA9IDU7CiAgc3RhdGljIGNvbnN0IE1BWF9FWFRSQV9MRU5HVEggPSAzMDsKICBzdGF0aWMgY29uc3QgREVGQVVMVF9UQUdfTEVOR1RIID0gMzsKCiAgZmluYWwgUnVudGltZVR5cGVzRW5jb2RlciBydGlFbmNvZGVyOwogIGZpbmFsIENvZGVnZW5Xb3JsZEJ1aWxkZXIgY29kZWdlbldvcmxkQnVpbGRlcjsKICBmaW5hbCBDb25zdGFudENhbm9uaWNhbEhhc2hlciBoYXNoZXI7CgogIFN0cmluZyByb290ID0gbnVsbDsgLy8gRmlyc3Qgd29yZCwgdXN1YWxseSBhIHR5cGUgbmFtZS4KICBib29sIGZhaWxlZCA9IGZhbHNlOyAvLyBGYWlsZWQgdG8gZ2VuZXJhdGUgc29tZXRoaW5nIHByZXR0eS4KICBMaXN0PFN0cmluZz4gZnJhZ21lbnRzID0gPFN0cmluZz5bXTsKICBpbnQgbGVuZ3RoID0gMDsKCiAgQ29uc3RhbnROYW1pbmdWaXNpdG9yKHRoaXMucnRpRW5jb2RlciwgdGhpcy5jb2RlZ2VuV29ybGRCdWlsZGVyLCB0aGlzLmhhc2hlcik7CgogIFN0cmluZyBnZXROYW1lKENvbnN0YW50VmFsdWUgY29uc3RhbnQpIHsKICAgIF92aXNpdChjb25zdGFudCk7CiAgICBpZiAocm9vdCA9PSBudWxsKSByZXR1cm4gJ0NPTlNUQU5UJzsKICAgIGlmIChmYWlsZWQpIHJldHVybiAnJHtyb290fV8ke2dldEhhc2hUYWcoY29uc3RhbnQsIERFRkFVTFRfVEFHX0xFTkdUSCl9JzsKICAgIGlmIChmcmFnbWVudHMubGVuZ3RoID09IDEpIHJldHVybiAnQ18ke3Jvb3R9JzsKICAgIHJldHVybiBmcmFnbWVudHMuam9pbignXycpOwogIH0KCiAgU3RyaW5nIGdldEhhc2hUYWcoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgaW50IHdpZHRoKSA9PgogICAgICBoYXNoV29yZChoYXNoZXIuZ2V0SGFzaChjb25zdGFudCksIHdpZHRoKTsKCiAgU3RyaW5nIGhhc2hXb3JkKGludCBoYXNoLCBpbnQgbGVuZ3RoKSB7CiAgICBoYXNoICY9IDB4MWZmZmZmZmY7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGludCBkaWdpdCA9IGhhc2ggJSA2MjsKICAgICAgc2Iud3JpdGUoJzAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ1sKICAgICAgICAgIGRpZ2l0XSk7CiAgICAgIGhhc2ggfi89IDYyOwogICAgICBpZiAoaGFzaCA9PSAwKSBicmVhazsKICAgIH0KICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgdm9pZCBhZGRSb290KFN0cmluZyBmcmFnbWVudCkgewogICAgaWYgKHJvb3QgPT0gbnVsbCAmJiBmcmFnbWVudHMuaXNFbXB0eSkgewogICAgICByb290ID0gZnJhZ21lbnQ7CiAgICB9CiAgICBhZGQoZnJhZ21lbnQpOwogIH0KCiAgdm9pZCBhZGQoU3RyaW5nIGZyYWdtZW50KSB7CiAgICBhc3NlcnQoZnJhZ21lbnQubGVuZ3RoID4gMCk7CiAgICBmcmFnbWVudHMuYWRkKGZyYWdtZW50KTsKICAgIGxlbmd0aCArPSBmcmFnbWVudC5sZW5ndGg7CiAgICBpZiAoZnJhZ21lbnRzLmxlbmd0aCA+IE1BWF9GUkFHTUVOVFMpIGZhaWxlZCA9IHRydWU7CiAgICBpZiAocm9vdCAhPSBudWxsICYmIGxlbmd0aCA+IHJvb3QubGVuZ3RoICsgMSArIE1BWF9FWFRSQV9MRU5HVEgpIHsKICAgICAgZmFpbGVkID0gdHJ1ZTsKICAgIH0KICB9CgogIHZvaWQgYWRkSWRlbnRpZmllcihTdHJpbmcgZnJhZ21lbnQpIHsKICAgIGlmIChmcmFnbWVudC5sZW5ndGggPD0gTUFYX0VYVFJBX0xFTkdUSCAmJiBJREVOVElGSUVSLmhhc01hdGNoKGZyYWdtZW50KSkgewogICAgICBhZGQoZnJhZ21lbnQpOwogICAgfSBlbHNlIHsKICAgICAgZmFpbGVkID0gdHJ1ZTsKICAgIH0KICB9CgogIHZvaWQgX3Zpc2l0KENvbnN0YW50VmFsdWUgY29uc3RhbnQpIHsKICAgIGNvbnN0YW50LmFjY2VwdCh0aGlzLCBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGdW5jdGlvbihGdW5jdGlvbkNvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgYWRkKGNvbnN0YW50LmVsZW1lbnQubmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW5zdGFudGlhdGlvbihJbnN0YW50aWF0aW9uQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICBfdmlzaXQoY29uc3RhbnQuZnVuY3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE51bGwoTnVsbENvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgYWRkKCdudWxsJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Tm9uQ29uc3RhbnQoTm9uQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICBhZGQoJ251bGwnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnQoSW50Q29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICAvLyBObyBgYWRkUm9vdGAgc2luY2UgSW50Q29uc3RhbnRzIGFyZSBhbHdheXMgaW5saW5lZC4KICAgIGlmIChjb25zdGFudC5pbnRWYWx1ZSA8IEJpZ0ludC56ZXJvKSB7CiAgICAgIGFkZCgnbSR7LWNvbnN0YW50LmludFZhbHVlfScpOwogICAgfSBlbHNlIHsKICAgICAgYWRkKCcke2NvbnN0YW50LmludFZhbHVlfScpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERvdWJsZShEb3VibGVDb25zdGFudFZhbHVlIGNvbnN0YW50LCBbX10pIHsKICAgIGZhaWxlZCA9IHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Qm9vbChCb29sQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICBhZGQoY29uc3RhbnQuaXNUcnVlID8gJ3RydWUnIDogJ2ZhbHNlJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RyaW5nKFN0cmluZ0NvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgLy8gTm8gYGFkZFJvb3RgIHNpbmNlIHN0cmluZyBjb25zdGFudHMgYXJlIGFsd2F5cyBpbmxpbmVkLgogICAgYWRkSWRlbnRpZmllcihjb25zdGFudC5zdHJpbmdWYWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGlzdChMaXN0Q29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICAvLyBUT0RPKDk0NzYpOiBJbmNvcnBvcmF0ZSB0eXBlIHBhcmFtZXRlcnMgaW50byBuYW1lLgogICAgYWRkUm9vdCgnTGlzdCcpOwogICAgaW50IGxlbmd0aCA9IGNvbnN0YW50Lmxlbmd0aDsKICAgIGlmIChjb25zdGFudC5sZW5ndGggPT0gMCkgewogICAgICBhZGQoJ2VtcHR5Jyk7CiAgICB9IGVsc2UgaWYgKGxlbmd0aCA+PSBNQVhfRlJBR01FTlRTKSB7CiAgICAgIGZhaWxlZCA9IHRydWU7CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgX3Zpc2l0KGNvbnN0YW50LmVudHJpZXNbaV0pOwogICAgICAgIGlmIChmYWlsZWQpIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U2V0KFNldENvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgLy8gVE9ETyg5NDc2KTogSW5jb3Jwb3JhdGUgdHlwZSBwYXJhbWV0ZXJzIGludG8gbmFtZS4KICAgIGFkZFJvb3QoJ1NldCcpOwogICAgaWYgKGNvbnN0YW50Lmxlbmd0aCA9PSAwKSB7CiAgICAgIGFkZCgnZW1wdHknKTsKICAgIH0gZWxzZSB7CiAgICAgIGFkZChnZXRIYXNoVGFnKGNvbnN0YW50LCA1KSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TWFwKGNvdmFyaWFudCBjb25zdGFudF9zeXN0ZW0uSmF2YVNjcmlwdE1hcENvbnN0YW50IGNvbnN0YW50LCBbX10pIHsKICAgIC8vIFRPRE8oOTQ3Nik6IEluY29ycG9yYXRlIHR5cGUgcGFyYW1ldGVycyBpbnRvIG5hbWUuCiAgICBhZGRSb290KCdNYXAnKTsKICAgIGlmIChjb25zdGFudC5sZW5ndGggPT0gMCkgewogICAgICBhZGQoJ2VtcHR5Jyk7CiAgICB9IGVsc2UgewogICAgICAvLyBVc2luZyBzb21lIGJpdHMgZnJvbSB0aGUga2V5cyBoYXNoIHRhZyBncm91cHMgdGhlIG5hbWVzIE1hcHMgd2l0aCB0aGUKICAgICAgLy8gc2FtZSBzdHJ1Y3R1cmUuCiAgICAgIGFkZChnZXRIYXNoVGFnKGNvbnN0YW50LmtleUxpc3QsIDIpICsgZ2V0SGFzaFRhZyhjb25zdGFudCwgMykpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbnN0cnVjdGVkKENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICBhZGRSb290KGNvbnN0YW50LnR5cGUuZWxlbWVudC5uYW1lKTsKCiAgICAvLyBSZWNvZ25pemUgZW51bSBjb25zdGFudHMgYW5kIG9ubHkgaW5jbHVkZSB0aGUgaW5kZXguCiAgICBmaW5hbCBNYXA8RmllbGRFbnRpdHksIENvbnN0YW50VmFsdWU+IGZpZWxkTWFwID0gY29uc3RhbnQuZmllbGRzOwogICAgaW50IHNpemUgPSBmaWVsZE1hcC5sZW5ndGg7CiAgICBpZiAoc2l6ZSA9PSAxIHx8IHNpemUgPT0gMikgewogICAgICBGaWVsZEVudGl0eSBpbmRleEZpZWxkOwogICAgICBmb3IgKEZpZWxkRW50aXR5IGZpZWxkIGluIGZpZWxkTWFwLmtleXMpIHsKICAgICAgICBTdHJpbmcgbmFtZSA9IGZpZWxkLm5hbWU7CiAgICAgICAgaWYgKG5hbWUgPT0gJ2luZGV4JykgewogICAgICAgICAgaW5kZXhGaWVsZCA9IGZpZWxkOwogICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnX25hbWUnKSB7CiAgICAgICAgICAvLyBJZ25vcmUgX25hbWUgZmllbGQuCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGluZGV4RmllbGQgPSBudWxsOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpbmRleEZpZWxkICE9IG51bGwpIHsKICAgICAgICBfdmlzaXQoY29uc3RhbnQuZmllbGRzW2luZGV4RmllbGRdKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGlzIHNob3VsZCBiZSBhY2Nlc3NlZCBmcm9tIGEgY29kZWdlbiBjbG9zZWQgd29ybGQuCiAgICBjb2RlZ2VuV29ybGRCdWlsZGVyLmZvckVhY2hJbnN0YW5jZUZpZWxkKGNvbnN0YW50LnR5cGUuZWxlbWVudCwKICAgICAgICAoXywgRmllbGRFbnRpdHkgZmllbGQsIHtib29sIGlzRWxpZGVkfSkgewogICAgICBpZiAoZmFpbGVkKSByZXR1cm47CiAgICAgIGlmIChpc0VsaWRlZCkgcmV0dXJuOwogICAgICBfdmlzaXQoY29uc3RhbnQuZmllbGRzW2ZpZWxkXSk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlKFR5cGVDb25zdGFudFZhbHVlIGNvbnN0YW50LCBbX10pIHsKICAgIC8vIEdlbmVyYXRlcyBzb21ldGhpbmcgbGlrZSAnVHlwZV9TdHJpbmdfazhGJywgdXNpbmcgdGhlIHNpbXBsZSBuYW1lIG9mIHRoZQogICAgLy8gdHlwZSBhbmQgYSBoYXNoIHRvIGRpc2FtYmlndWF0ZSB0aGUgc2FtZSBuYW1lIGluIGRpZmZlcmVudCBsaWJyYXJpZXMuCiAgICBhZGRSb290KCdUeXBlJyk7CiAgICBEYXJ0VHlwZSB0eXBlID0gY29uc3RhbnQucmVwcmVzZW50ZWRUeXBlOwogICAgU3RyaW5nIG5hbWU7CiAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIG5hbWUgPSB0eXBlLmVsZW1lbnQubmFtZTsKICAgIH0gZWxzZSBpZiAodHlwZSBpcyBUeXBlZGVmVHlwZSkgewogICAgICBuYW1lID0gdHlwZS5lbGVtZW50Lm5hbWU7CiAgICB9CiAgICBpZiAobmFtZSA9PSBudWxsKSB7CiAgICAgIC8vIGUuZy4gRGFydFR5cGUgJ2R5bmFtaWMnIGhhcyBubyBlbGVtZW50LgogICAgICBuYW1lID0gcnRpRW5jb2Rlci5nZXRUeXBlUmVwcmVzZW50YXRpb25Gb3JUeXBlQ29uc3RhbnQodHlwZSk7CiAgICB9CiAgICBhZGRJZGVudGlmaWVyKG5hbWUpOwogICAgYWRkKGdldEhhc2hUYWcoY29uc3RhbnQsIDMpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnRlcmNlcHRvcihJbnRlcmNlcHRvckNvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgLy8gVGhlIGNsYXNzIG5hbWUgZm9yIG1peGluIGFwcGxpY2F0aW9ucyBjb250YWluICcrJyBzaWducyAoaXNzdWUgMjgxOTYpLgogICAgYWRkUm9vdChjb25zdGFudC5jbHMubmFtZS5yZXBsYWNlQWxsKCcrJywgJ18nKSk7CiAgICBhZGQoJ21ldGhvZHMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTeW50aGV0aWMoU3ludGhldGljQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICBzd2l0Y2ggKGNvbnN0YW50LnZhbHVlS2luZCkgewogICAgICBjYXNlIFN5bnRoZXRpY0NvbnN0YW50S2luZC5EVU1NWV9JTlRFUkNFUFRPUjoKICAgICAgICBhZGQoJ2R1bW15X3JlY2VpdmVyJyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3ludGhldGljQ29uc3RhbnRLaW5kLlRZUEVWQVJJQUJMRV9SRUZFUkVOQ0U6CiAgICAgICAgLy8gT21pdC4gVGhlc2UgYXJlIG9wYXF1ZSBkZWZlcnJlZCBpbmRleGVzIHdpdGggbm90aGluZyBoZWxwZnVsIHRvIGFkZC4KICAgICAgICBicmVhazsKICAgICAgY2FzZSBTeW50aGV0aWNDb25zdGFudEtpbmQuTkFNRToKICAgICAgICBhZGQoJ25hbWUnKTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwgIlVuZXhwZWN0ZWQgU3ludGhldGljQ29uc3RhbnRWYWx1ZSIpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERlZmVycmVkR2xvYmFsKERlZmVycmVkR2xvYmFsQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICBhZGRSb290KCdEZWZlcnJlZCcpOwogIH0KfQoKLy8vIEdlbmVyYXRlcyBjYW5vbmljYWwgaGFzaCB2YWx1ZXMgZm9yIFtDb25zdGFudFZhbHVlXXMuCi8vLwovLy8gVW5mb3J0dW5hdGVseSwgW0NvbnN0YW50Lmhhc2hDb2RlXSBpcyBub3Qgc3RhYmxlIHVuZGVyIG1pbm9yIHBlcnR1cmJhdGlvbnMsCi8vLyBzbyBpdCBjYW4ndCBiZSB1c2VkIGZvciBnZW5lcmF0aW5nIG5hbWVzLiAgVGhpcyBoYXNoZXIga2VlcHMgY29uc2lzdGVuY3kKLy8vIGJldHdlZW4gcnVucyBieSBiYXNpbmcgaGFzaCB2YWx1ZXMgb2YgdGhlIG5hbWVzIG9mIGVsZW1lbnRzLCByYXRoZXIgdGhhbgovLy8gdGhlaXIgaGFzaENvZGVzLgpjbGFzcyBDb25zdGFudENhbm9uaWNhbEhhc2hlciBpbXBsZW1lbnRzIENvbnN0YW50VmFsdWVWaXNpdG9yPGludCwgTnVsbD4gewogIHN0YXRpYyBjb25zdCBfTUFTSyA9IDB4MWZmZmZmZmY7CiAgc3RhdGljIGNvbnN0IF9VSU5UMzJfTElNSVQgPSA0ICogMTAyNCAqIDEwMjQgKiAxMDI0OwoKICBmaW5hbCBSdW50aW1lVHlwZXNFbmNvZGVyIHJ0aUVuY29kZXI7CiAgZmluYWwgQ29kZWdlbldvcmxkQnVpbGRlciBjb2RlZ2VuV29ybGRCdWlsZGVyOwogIGZpbmFsIE1hcDxDb25zdGFudFZhbHVlLCBpbnQ+IGhhc2hlcyA9IHt9OwoKICBDb25zdGFudENhbm9uaWNhbEhhc2hlcih0aGlzLnJ0aUVuY29kZXIsIHRoaXMuY29kZWdlbldvcmxkQnVpbGRlcik7CgogIGludCBnZXRIYXNoKENvbnN0YW50VmFsdWUgY29uc3RhbnQpID0+IF92aXNpdChjb25zdGFudCk7CgogIGludCBfdmlzaXQoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgaW50IGhhc2ggPSBoYXNoZXNbY29uc3RhbnRdOwogICAgaWYgKGhhc2ggPT0gbnVsbCkgewogICAgICBoYXNoID0gX2ZpbmlzaChjb25zdGFudC5hY2NlcHQodGhpcywgbnVsbCkpOwogICAgICBoYXNoZXNbY29uc3RhbnRdID0gaGFzaDsKICAgIH0KICAgIHJldHVybiBoYXNoOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0TnVsbChOdWxsQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSA9PiAxOwoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXROb25Db25zdGFudChOb25Db25zdGFudFZhbHVlIGNvbnN0YW50LCBbX10pID0+IDE7CgogIEBvdmVycmlkZQogIGludCB2aXNpdEJvb2woQm9vbENvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgcmV0dXJuIGNvbnN0YW50LmlzVHJ1ZSA/IDIgOiAzOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0RnVuY3Rpb24oRnVuY3Rpb25Db25zdGFudFZhbHVlIGNvbnN0YW50LCBbX10pIHsKICAgIHJldHVybiBfaGFzaFN0cmluZygxLCBjb25zdGFudC5lbGVtZW50Lm5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0SW5zdGFudGlhdGlvbihJbnN0YW50aWF0aW9uQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICByZXR1cm4gX3Zpc2l0KGNvbnN0YW50LmZ1bmN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdEludChJbnRDb25zdGFudFZhbHVlIGNvbnN0YW50LCBbX10pIHsKICAgIEJpZ0ludCB2YWx1ZSA9IGNvbnN0YW50LmludFZhbHVlOwogICAgaWYgKHZhbHVlLnRvU2lnbmVkKDMyKSA9PSB2YWx1ZSkgewogICAgICByZXR1cm4gdmFsdWUudG9VbnNpZ25lZCgzMikudG9JbnQoKSAmIF9NQVNLOwogICAgfQogICAgcmV0dXJuIF9oYXNoRG91YmxlKHZhbHVlLnRvRG91YmxlKCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0RG91YmxlKERvdWJsZUNvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgcmV0dXJuIF9oYXNoRG91YmxlKGNvbnN0YW50LmRvdWJsZVZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdFN0cmluZyhTdHJpbmdDb25zdGFudFZhbHVlIGNvbnN0YW50LCBbX10pIHsKICAgIHJldHVybiBfaGFzaFN0cmluZygyLCBjb25zdGFudC5zdHJpbmdWYWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRMaXN0KExpc3RDb25zdGFudFZhbHVlIGNvbnN0YW50LCBbX10pIHsKICAgIHJldHVybiBfaGFzaExpc3QoY29uc3RhbnQubGVuZ3RoLCBjb25zdGFudC5lbnRyaWVzKTsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdFNldChTZXRDb25zdGFudFZhbHVlIGNvbnN0YW50LCBbX10pIHsKICAgIHJldHVybiBfaGFzaExpc3QoY29uc3RhbnQubGVuZ3RoLCBjb25zdGFudC52YWx1ZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0TWFwKE1hcENvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgaW50IGhhc2ggPSBfaGFzaExpc3QoY29uc3RhbnQubGVuZ3RoLCBjb25zdGFudC5rZXlzKTsKICAgIHJldHVybiBfaGFzaExpc3QoaGFzaCwgY29uc3RhbnQudmFsdWVzKTsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdENvbnN0cnVjdGVkKENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICBpbnQgaGFzaCA9IF9oYXNoU3RyaW5nKDMsIGNvbnN0YW50LnR5cGUuZWxlbWVudC5uYW1lKTsKICAgIGNvZGVnZW5Xb3JsZEJ1aWxkZXIuZm9yRWFjaEluc3RhbmNlRmllbGQoY29uc3RhbnQudHlwZS5lbGVtZW50LAogICAgICAgIChfLCBGaWVsZEVudGl0eSBmaWVsZCwge2Jvb2wgaXNFbGlkZWR9KSB7CiAgICAgIGlmIChpc0VsaWRlZCkgcmV0dXJuOwogICAgICBoYXNoID0gX2NvbWJpbmUoaGFzaCwgX3Zpc2l0KGNvbnN0YW50LmZpZWxkc1tmaWVsZF0pKTsKICAgIH0pOwogICAgcmV0dXJuIGhhc2g7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRUeXBlKFR5cGVDb25zdGFudFZhbHVlIGNvbnN0YW50LCBbX10pIHsKICAgIERhcnRUeXBlIHR5cGUgPSBjb25zdGFudC5yZXByZXNlbnRlZFR5cGU7CiAgICAvLyBUaGlzIG5hbWUgaW5jbHVkZXMgdGhlIGxpYnJhcnkgbmFtZSBhbmQgdHlwZSBwYXJhbWV0ZXJzLgogICAgU3RyaW5nIG5hbWUgPSBydGlFbmNvZGVyLmdldFR5cGVSZXByZXNlbnRhdGlvbkZvclR5cGVDb25zdGFudCh0eXBlKTsKICAgIHJldHVybiBfaGFzaFN0cmluZyg0LCBuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdEludGVyY2VwdG9yKEludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICBTdHJpbmcgdHlwZU5hbWUgPSBjb25zdGFudC5jbHMubmFtZTsKICAgIHJldHVybiBfaGFzaFN0cmluZyg1LCB0eXBlTmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRTeW50aGV0aWMoU3ludGhldGljQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICBzd2l0Y2ggKGNvbnN0YW50LnZhbHVlS2luZCkgewogICAgICBjYXNlIFN5bnRoZXRpY0NvbnN0YW50S2luZC5UWVBFVkFSSUFCTEVfUkVGRVJFTkNFOgogICAgICAgIC8vIFRoZXNlIGNvbnRhaW4gYSBkZWZlcnJlZCBvcGFxdWUgaW5kZXggaW50byBtZXRhZGF0YS4gVGhlcmUgaXMgbm90aGluZwogICAgICAgIC8vIHdlIGNhbiBhY2Nlc3MgdGhhdCBpcyBzdGFibGUgYmV0d2VlbiBjb21waWxlcy4gIEx1Y2tpbHksIHNpbmNlIHRoZXkKICAgICAgICAvLyByZXNvbHZlIHRvIGludGVnZXIgaW5kZXhlcywgdGhleSdyZSBhbHdheXMgcGFydCBvZiBhIGxhcmdlciBjb25zdGFudC4KICAgICAgICByZXR1cm4gMDsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBmYWlsZWRBdCgKICAgICAgICAgICAgTk9fTE9DQVRJT05fU1BBTk5BQkxFLAogICAgICAgICAgICAnU3ludGhldGljQ29uc3RhbnRWYWx1ZSBzaG91bGQgbmV2ZXIgYmUgbmFtZWQgYW5kICcKICAgICAgICAgICAgJ25ldmVyIGJlIHN1YmNvbnN0YW50Jyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXREZWZlcnJlZEdsb2JhbChEZWZlcnJlZEdsb2JhbENvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgaW50IGhhc2ggPSBjb25zdGFudC51bml0Lmhhc2hDb2RlOwogICAgcmV0dXJuIF9jb21iaW5lKGhhc2gsIF92aXNpdChjb25zdGFudC5yZWZlcmVuY2VkKSk7CiAgfQoKICBpbnQgX2hhc2hTdHJpbmcoaW50IGhhc2gsIFN0cmluZyBzKSB7CiAgICBpbnQgbGVuZ3RoID0gcy5sZW5ndGg7CiAgICBoYXNoID0gX2NvbWJpbmUoaGFzaCwgbGVuZ3RoKTsKICAgIC8vIEluY3JlYXNpbmcgc3RyaWRlIGlzIE8obG9nIE4pIG9uIGxhcmdlIHN0cmluZ3Mgd2hpY2ggYXJlIHVubGlrZWx5IHRvIGhhdmUKICAgIC8vIG1hbnkgY29sbGlzaW9ucy4KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEgKyAoaSA+PiAyKSkgewogICAgICBoYXNoID0gX2NvbWJpbmUoaGFzaCwgcy5jb2RlVW5pdEF0KGkpKTsKICAgIH0KICAgIHJldHVybiBoYXNoOwogIH0KCiAgaW50IF9oYXNoTGlzdChpbnQgaGFzaCwgTGlzdDxDb25zdGFudFZhbHVlPiBjb25zdGFudHMpIHsKICAgIGZvciAoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCBpbiBjb25zdGFudHMpIHsKICAgICAgaGFzaCA9IF9jb21iaW5lKGhhc2gsIF92aXNpdChjb25zdGFudCkpOwogICAgfQogICAgcmV0dXJuIGhhc2g7CiAgfQoKICBzdGF0aWMgaW50IF9oYXNoSW50KGludCB2YWx1ZSkgewogICAgaWYgKHZhbHVlLmFicygpIDwgX1VJTlQzMl9MSU1JVCkgcmV0dXJuIF9NQVNLICYgdmFsdWU7CiAgICByZXR1cm4gX2hhc2hEb3VibGUodmFsdWUudG9Eb3VibGUoKSk7CiAgfQoKICBzdGF0aWMgaW50IF9oYXNoRG91YmxlKGRvdWJsZSB2YWx1ZSkgewogICAgZG91YmxlIG1hZ25pdHVkZSA9IHZhbHVlLmFicygpOwogICAgaW50IHNpZ24gPSB2YWx1ZSA8IDAgPyAxIDogMDsKICAgIGlmIChtYWduaXR1ZGUgPCBfVUlOVDMyX0xJTUlUKSB7CiAgICAgIC8vIDJeMzIKICAgICAgaW50IGludFZhbHVlID0gdmFsdWUudG9JbnQoKTsKICAgICAgLy8gSW50ZWdlciB2YWx1ZWQgZG91YmxlcyBpbiAzMi1iaXQgcmFuZ2UgaGFzaCB0byB0aGUgc2FtZSB2YWx1ZXMgYXMgaW50cy4KICAgICAgaW50IGhhc2ggPSBfaGFzaEludChpbnRWYWx1ZSk7CiAgICAgIGlmICh2YWx1ZSA9PSBpbnRWYWx1ZSkgcmV0dXJuIGhhc2g7CiAgICAgIGhhc2ggPSBfY29tYmluZShoYXNoLCBzaWduKTsKICAgICAgaW50IGZyYWN0aW9uID0gKChtYWduaXR1ZGUgLSBpbnRWYWx1ZS5hYnMoKSkgKiAoX01BU0sgKyAxKSkudG9JbnQoKTsKICAgICAgaGFzaCA9IF9jb21iaW5lKGhhc2gsIGZyYWN0aW9uKTsKICAgICAgcmV0dXJuIGhhc2g7CiAgICB9IGVsc2UgaWYgKHZhbHVlLmlzSW5maW5pdGUpIHsKICAgICAgcmV0dXJuIF9jb21iaW5lKDYsIHNpZ24pOwogICAgfSBlbHNlIGlmICh2YWx1ZS5pc05hTikgewogICAgICByZXR1cm4gNzsKICAgIH0gZWxzZSB7CiAgICAgIGludCBoYXNoID0gMDsKICAgICAgd2hpbGUgKG1hZ25pdHVkZSA+PSBfVUlOVDMyX0xJTUlUKSB7CiAgICAgICAgbWFnbml0dWRlID0gbWFnbml0dWRlIC8gX1VJTlQzMl9MSU1JVDsKICAgICAgICBoYXNoKys7CiAgICAgIH0KICAgICAgaGFzaCA9IF9jb21iaW5lKGhhc2gsIHNpZ24pOwogICAgICByZXR1cm4gX2NvbWJpbmUoaGFzaCwgX2hhc2hEb3VibGUobWFnbml0dWRlKSk7CiAgICB9CiAgfQoKICAvLy8gW19jb21iaW5lXSBhbmQgW19maW5pc2hdIGFyZSBwYXJ0cyBvZiB0aGUgW0plbmtpbnMgaGFzaCBmdW5jdGlvbl1bMV0sCiAgLy8vIG1vZGlmaWVkIGJ5IHVzaW5nIG1hc2tpbmcgdG8ga2VlcCB2YWx1ZXMgaW4gU01JIHJhbmdlLgogIC8vLwogIC8vLyBbMV06IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSmVua2luc19oYXNoX2Z1bmN0aW9uCiAgc3RhdGljIGludCBfY29tYmluZShpbnQgaGFzaCwgaW50IHZhbHVlKSB7CiAgICBoYXNoID0gX01BU0sgJiAoaGFzaCArIHZhbHVlKTsKICAgIGhhc2ggPSBfTUFTSyAmIChoYXNoICsgKCgoX01BU0sgPj4gMTApICYgaGFzaCkgPDwgMTApKTsKICAgIGhhc2ggPSBoYXNoIF4gKGhhc2ggPj4gNik7CiAgICByZXR1cm4gaGFzaDsKICB9CgogIHN0YXRpYyBpbnQgX2ZpbmlzaChpbnQgaGFzaCkgewogICAgaGFzaCA9IF9NQVNLICYgKGhhc2ggKyAoKChfTUFTSyA+PiAzKSAmIGhhc2gpIDw8IDMpKTsKICAgIGhhc2ggPSBoYXNoICYgKGhhc2ggPj4gMTEpOwogICAgcmV0dXJuIF9NQVNLICYgKGhhc2ggKyAoKChfTUFTSyA+PiAxNSkgJiBoYXNoKSA8PCAxNSkpOwogIH0KfQoKY2xhc3MgRnVuY3Rpb25UeXBlTmFtZXIgZXh0ZW5kcyBCYXNlRGFydFR5cGVWaXNpdG9yIHsKICBmaW5hbCBSdW50aW1lVHlwZXNFbmNvZGVyIHJ0aUVuY29kZXI7CiAgU3RyaW5nQnVmZmVyIHNiOwoKICBGdW5jdGlvblR5cGVOYW1lcih0aGlzLnJ0aUVuY29kZXIpOwoKICBTdHJpbmcgY29tcHV0ZU5hbWUoRGFydFR5cGUgdHlwZSkgewogICAgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICB2aXNpdCh0eXBlKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXQoRGFydFR5cGUgdHlwZSwgW19dKSB7CiAgICB0eXBlLmFjY2VwdCh0aGlzLCBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VHlwZShEYXJ0VHlwZSB0eXBlLCBfKSB7fQoKICBAb3ZlcnJpZGUKICB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSB0eXBlLCBfKSB7CiAgICBzYi53cml0ZSh0eXBlLmVsZW1lbnQubmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIHR5cGUsIF8pIHsKICAgIHNiLndyaXRlKHR5cGUuZWxlbWVudC5uYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VHlwZVZhcmlhYmxlVHlwZShUeXBlVmFyaWFibGVUeXBlIHR5cGUsIF8pIHsKICAgIHNiLndyaXRlKHR5cGUuZWxlbWVudC5uYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSB0eXBlLCBfKSB7CiAgICBpZiAocnRpRW5jb2Rlci5pc1NpbXBsZUZ1bmN0aW9uVHlwZSh0eXBlKSkgewogICAgICBzYi53cml0ZSgnYXJncyR7dHlwZS5wYXJhbWV0ZXJUeXBlcy5sZW5ndGh9Jyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZpc2l0KHR5cGUucmV0dXJuVHlwZSk7CiAgICBzYi53cml0ZSgnXycpOwogICAgZm9yIChEYXJ0VHlwZSBwYXJhbWV0ZXIgaW4gdHlwZS5wYXJhbWV0ZXJUeXBlcykgewogICAgICBzYi53cml0ZSgnXycpOwogICAgICB2aXNpdChwYXJhbWV0ZXIpOwogICAgfQogICAgYm9vbCBmaXJzdCA9IGZhbHNlOwogICAgZm9yIChEYXJ0VHlwZSBwYXJhbWV0ZXIgaW4gdHlwZS5vcHRpb25hbFBhcmFtZXRlclR5cGVzKSB7CiAgICAgIGlmICghZmlyc3QpIHsKICAgICAgICBzYi53cml0ZSgnXycpOwogICAgICB9CiAgICAgIHNiLndyaXRlKCdfJyk7CiAgICAgIHZpc2l0KHBhcmFtZXRlcik7CiAgICAgIGZpcnN0ID0gdHJ1ZTsKICAgIH0KICAgIGlmICghdHlwZS5uYW1lZFBhcmFtZXRlclR5cGVzLmlzRW1wdHkpIHsKICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgZm9yIChEYXJ0VHlwZSBwYXJhbWV0ZXIgaW4gdHlwZS5uYW1lZFBhcmFtZXRlclR5cGVzKSB7CiAgICAgICAgaWYgKCFmaXJzdCkgewogICAgICAgICAgc2Iud3JpdGUoJ18nKTsKICAgICAgICB9CiAgICAgICAgc2Iud3JpdGUoJ18nKTsKICAgICAgICB2aXNpdChwYXJhbWV0ZXIpOwogICAgICAgIGZpcnN0ID0gdHJ1ZTsKICAgICAgfQogICAgfQogIH0KfQoKY2xhc3MgTmFtaW5nU2NvcGUgewogIC8vLyBNYXBzIHByb3Bvc2VkIG5hbWVzIHRvICpzdWdnZXN0ZWQqIGRpc2FtYmlndWF0ZWQgbmFtZXMuCiAgLy8vCiAgLy8vIFN1Z2dlc3RlZCBuYW1lcyBhcmUgaGludHMgdG8gdGhlIFtNaW5pZnlOYW1lcl0sIHN1Z2dlc3RpbmcgdGhhdCBhIHNwZWNpZmljCiAgLy8vIG5hbWVzIGJlIGdpdmVuIHRvIHRoZSBmaXJzdCBpdGVtIHdpdGggdGhlIGdpdmVuIHByb3Bvc2VkIG5hbWUuCiAgLy8vCiAgLy8vIFRoaXMgaXMgY3VycmVudGx5IHVzZWQgaW4gW01pbmlmeU5hbWVyXSB0byBhc3NpZ24gdmVyeSBzaG9ydCBtaW5pZmllZAogIC8vLyBuYW1lcyB0byB0aGluZ3MgdGhhdCB0ZW5kIHRvIGJlIHVzZWQgdmVyeSBvZnRlbi4KICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IF9zdWdnZXN0ZWROYW1lcyA9IHt9OwogIGZpbmFsIFNldDxTdHJpbmc+IF91c2VkTmFtZXMgPSBTZXQoKTsKCiAgYm9vbCBpc1VzZWQoU3RyaW5nIG5hbWUpID0+IF91c2VkTmFtZXMuY29udGFpbnMobmFtZSk7CiAgYm9vbCBpc1VudXNlZChTdHJpbmcgbmFtZSkgPT4gIV91c2VkTmFtZXMuY29udGFpbnMobmFtZSk7CiAgYm9vbCByZWdpc3RlclVzZShTdHJpbmcgbmFtZSkgPT4gX3VzZWROYW1lcy5hZGQobmFtZSk7CgogIFN0cmluZyBzdWdnZXN0TmFtZShTdHJpbmcgb3JpZ2luYWwpID0+IF9zdWdnZXN0ZWROYW1lc1tvcmlnaW5hbF07CiAgdm9pZCBhZGRTdWdnZXN0aW9uKFN0cmluZyBvcmlnaW5hbCwgU3RyaW5nIHN1Z2dlc3Rpb24pIHsKICAgIGFzc2VydCghX3N1Z2dlc3RlZE5hbWVzLmNvbnRhaW5zS2V5KG9yaWdpbmFsKSk7CiAgICBfc3Vn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X21peGluLmRhcnSiDy8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGpzX2JhY2tlbmQubmFtZXI7CgphYnN0cmFjdCBjbGFzcyBfTWluaWZpZWRGaWVsZE5hbWVyIGltcGxlbWVudHMgTmFtZXIgewogIF9GaWVsZE5hbWluZ1JlZ2lzdHJ5IGdldCBmaWVsZFJlZ2lzdHJ5OwoKICAvLyBSZXR1cm5zIGEgbWluaW1hbCBuYW1lIGZvciB0aGUgZmllbGQgdGhhdCBpcyBnbG9iYWxseSB1bmlxdWUgYWxvbmcKICAvLyB0aGUgZ2l2ZW4gZWxlbWVudCdzIGNsYXNzIGluaGVyaXRhbmNlIGNoYWluLgogIC8vCiAgLy8gVGhlIGluaGVyaXRhbmNlIHNjb3BlIGJhc2VkIG5hbWluZyBtaWdodCBub3QgeWllbGQgYSBuYW1lLiBGb3IgaW5zdGFuY2UsCiAgLy8gdGhpcyBjb3VsZCBiZSBiZWNhdXNlIHRoZSBmaWVsZCBiZWxvbmdzIHRvIGEgbWl4aW4uIEluIHN1Y2ggYSBjYXNlIHRoaXMKICAvLyB3aWxsIHJldHVybiBgbnVsbGAgYW5kIGEgbm9ybWFsIGZpZWxkIG5hbWUgaGFzIHRvIGJlIHVzZWQuCiAganNBc3QuTmFtZSBfbWluaWZpZWRJbnN0YW5jZUZpZWxkUHJvcGVydHlOYW1lKEZpZWxkRW50aXR5IGVsZW1lbnQpIHsKICAgIGlmIChfbmF0aXZlRGF0YS5oYXNGaXhlZEJhY2tlbmROYW1lKGVsZW1lbnQpKSB7CiAgICAgIHJldHVybiBuZXcgU3RyaW5nQmFja2VkTmFtZShfbmF0aXZlRGF0YS5nZXRGaXhlZEJhY2tlbmROYW1lKGVsZW1lbnQpKTsKICAgIH0KCiAgICBfRmllbGROYW1pbmdTY29wZSBuYW1lczsKICAgIGlmIChlbGVtZW50IGlzIEpSZWNvcmRGaWVsZCkgewogICAgICBuYW1lcyA9IG5ldyBfRmllbGROYW1pbmdTY29wZS5mb3JCb3goZWxlbWVudC5ib3gsIGZpZWxkUmVnaXN0cnkpOwogICAgfSBlbHNlIHsKICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gZWxlbWVudC5lbmNsb3NpbmdDbGFzczsKICAgICAgbmFtZXMgPSBuZXcgX0ZpZWxkTmFtaW5nU2NvcGUuZm9yQ2xhc3MoY2xzLCBfY2xvc2VkV29ybGQsIGZpZWxkUmVnaXN0cnkpOwogICAgfQoKICAgIGlmIChuYW1lcy5jb250YWluc0ZpZWxkKGVsZW1lbnQpKSB7CiAgICAgIHJldHVybiBuYW1lc1tlbGVtZW50XTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KfQoKLy8vIEVuY2Fwc3VsYXRlcyB0aGUgZ2xvYmFsIHN0YXRlIG9mIGZpZWxkIG5hbWluZy4KLy8vCi8vLyBUaGUgZmllbGQgbmFtaW5nIHJlZ2lzdHJ5IGFsbG9jYXRlcyBuYW1lcyB0byBiZSB1c2VkIGFsb25nIGEgcGF0aCBpbiB0aGUKLy8vIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBvZiBmaWVsZHMsIHN0YXJ0aW5nIHdpdGggdGhlIG9iamVjdCBjbGFzcy4gVGhlIGFjdHVhbAovLy8gaGllcmFyY2h5IGlzIGVuY29kZWQgdXNpbmcgaW5zdGFuY2VzIG9mIFtfRmllbGROYW1pbmdTY29wZV0uCmNsYXNzIF9GaWVsZE5hbWluZ1JlZ2lzdHJ5IHsKICBmaW5hbCBOYW1lciBuYW1lcjsKCiAgZmluYWwgTWFwPEVudGl0eSwgX0ZpZWxkTmFtaW5nU2NvcGU+IHNjb3BlcyA9CiAgICAgIG5ldyBNYXA8RW50aXR5LCBfRmllbGROYW1pbmdTY29wZT4oKTsKCiAgZmluYWwgTWFwPEVudGl0eSwganNBc3QuTmFtZT4gZ2xvYmFsTmFtZXMgPSBuZXcgTWFwPEVudGl0eSwganNBc3QuTmFtZT4oKTsKCiAgaW50IGdsb2JhbENvdW50ID0gMDsKCiAgZmluYWwgTGlzdDxqc0FzdC5OYW1lPiBuYW1lU3RvcmUgPSBuZXcgTGlzdDxqc0FzdC5OYW1lPigpOwoKICBfRmllbGROYW1pbmdSZWdpc3RyeSh0aGlzLm5hbWVyKTsKCiAgLy8gUmV0dXJucyB0aGUgbmFtZSB0byBiZSB1c2VkIGZvciBhIGZpZWxkIHdpdGggZGlzdGFuY2UgW2luZGV4XSBmcm9tIHRoZQogIC8vIHJvb3Qgb2YgdGhlIG9iamVjdCBoaWVyYXJjaHkuIFRoZSBkaXN0YW5jZSB0aGVyZWJ5IGlzIGNvbXB1dGVkIGFzIHRoZQogIC8vIG51bWJlciBvZiBmaWVsZHMgcHJlY2VkaW5nIHRoZSBjdXJyZW50IGZpZWxkIGluIGl0cyBjbGFzc2VzIGluaGVyaXRhbmNlCiAgLy8gY2hhaW4uCiAgLy8KICAvLyBUaGUgaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGF0IG5hbWVzIGFyZSByZXF1ZWRzdGVkIGluIG9yZGVyLCB0aGF0IGlzIHRoZQogIC8vIG5hbWUgYXQgcG9zaXRpb24gaSsxIGlzIHJlcXVlc3RlZCBhZnRlciB0aGUgbmFtZSBhdCBwb3NpdGlvbiBpIHdhcwogIC8vIHJlcXVlc3RlZC4KICBqc0FzdC5OYW1lIGdldE5hbWUoaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPj0gbmFtZVN0b3JlLmxlbmd0aCkgewogICAgICAvLyBUaGUgbmFtZXIgdXN1YWxseSBkb2VzIG5vdCB1c2UgY2VydGFpbiBuYW1lcyBhcyB0aGV5IGNsYXNoIHdpdGgKICAgICAgLy8gZXhpc3RpbmcgcHJvcGVydGllcyBvbiBKUyBvYmplY3RzIChzZWUgW19yZXNlcnZlZE5hdGl2ZVByb3BlcnRpZXNdKS4KICAgICAgLy8gSG93ZXZlciwgc29tZSBvZiB0aGVtIGFyZSByZWFsbHkgc2hvcnQgYW5kIHNhZmUgdG8gdXNlIGZvciBmaWVsZHMuCiAgICAgIC8vIFRodXMsIHdlIHNob3J0Y3V0IHRoZSBuYW1lciB0byB1c2UgdGhvc2UgZmlyc3QuCiAgICAgIGFzc2VydChpbmRleCA9PSBuYW1lU3RvcmUubGVuZ3RoKTsKICAgICAgaWYgKGluZGV4IDwgTWluaWZ5TmFtZXIuX3Jlc2VydmVkTmF0aXZlUHJvcGVydGllcy5sZW5ndGggJiYKICAgICAgICAgIE1pbmlmeU5hbWVyLl9yZXNlcnZlZE5hdGl2ZVByb3BlcnRpZXNbaW5kZXhdLmxlbmd0aCA8PSAyKSB7CiAgICAgICAgbmFtZVN0b3JlLmFkZCgKICAgICAgICAgICAgbmV3IFN0cmluZ0JhY2tlZE5hbWUoTWluaWZ5TmFtZXIuX3Jlc2VydmVkTmF0aXZlUHJvcGVydGllc1tpbmRleF0pKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBuYW1lU3RvcmUuYWRkKG5hbWVyLmdldEZyZXNoTmFtZShuYW1lci5pbnN0YW5jZVNjb3BlLCAiZmllbGQkaW5kZXgiKSk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbmFtZVN0b3JlW2luZGV4XTsKICB9Cn0KCi8vLyBBIFtfRmllbGROYW1pbmdTY29wZV0gZW5jb2RlcyBhIG5vZGUgaW4gdGhlIGluaGVyaXRhbmNlIHRyZWUgb2YgdGhlIGN1cnJlbnQKLy8vIGNsYXNzIGhpZXJhcmNoeS4gVGhlIHJvb3Qgbm9kZSB0eXBpY2FsbHkgaXMgdGhlIG5vZGUgY29ycmVzcG9uZGluZyB0byB0aGUKLy8vIGBPYmplY3RgIGNsYXNzLiBJdCBpcyB1c2VkIHRvIGFzc2lnbiBhIHVuaXF1ZSBuYW1lIHRvIGVhY2ggZmllbGQgb2YgYSBjbGFzcy4KLy8vIFVuaXF1ZSBoZXJlIG1lYW5zIHVuaXF1ZSB3cnQuIGFsbCBmaWVsZHMgYWxvbmcgdGhlIHBhdGggYmFjayB0byB0aGUgcm9vdC4KLy8vIFRoaXMgaXMgYWNoaWV2ZWQgYXQgY29uc3RydWN0aW9uIHRpbWUgdmlhIHRoZSBbX2ZpZWxkTmFtZUNvdW50ZXJdIGZpZWxkIHRoYXQKLy8vIGNvdW50cyB0aGUgbnVtYmVyIG9mIGZpZWxkcyBvbiB0aGUgcGF0aCB0byB0aGUgcm9vdCBub2RlIHRoYXQgaGF2ZSBiZWVuCi8vLyBlbmNvdW50ZXJlZCBzbyBmYXIuCi8vLwovLy8gT2J2aW91c2x5LCB0aGlzIG9ubHkgd29ya3MgaWYgbm8gZmllbGRzIGFyZSBhZGRlZCB0byBhIHBhcmVudCBub2RlIGFmdGVyIGl0cwovLy8gY2hpbGRyZW4gaGF2ZSBhZGRlZCB0aGVpciBmaXJzdCBmaWVsZC4KY2xhc3MgX0ZpZWxkTmFtaW5nU2NvcGUgewogIGZpbmFsIF9GaWVsZE5hbWluZ1Njb3BlIHN1cGVyU2NvcGU7CiAgZmluYWwgRW50aXR5IGNvbnRhaW5lcjsKICBmaW5hbCBNYXA8RW50aXR5LCBqc0FzdC5OYW1lPiBuYW1lcyA9IG5ldyBNYXBsZXQ8RW50aXR5LCBqc0FzdC5OYW1lPigpOwogIGZpbmFsIF9GaWVsZE5hbWluZ1JlZ2lzdHJ5IHJlZ2lzdHJ5OwoKICAvLy8gTmFtaW5nIGNvdW50ZXIgdXNlZCBmb3IgZmllbGRzIG9mIG9yZGluYXJ5IGNsYXNzZXMuCiAgaW50IF9maWVsZE5hbWVDb3VudGVyOwoKICAvLy8gVGhlIG51bWJlciBvZiBmaWVsZHMgYWxvbmcgdGhlIHN1cGVyY2xhc3MgY2hhaW4gdGhhdCB1c2UgaW5oZXJpdGFuY2UKICAvLy8gYmFzZWQgbmFtaW5nLCBpbmNsdWRpbmcgdGhlIG9uZXMgYWxsb2NhdGVkIGZvciB0aGlzIHNjb3BlLgogIGludCBnZXQgaW5oZXJpdGFuY2VCYXNlZEZpZWxkTmFtZUNvdW50ZXIgPT4gX2ZpZWxkTmFtZUNvdW50ZXI7CgogIC8vLyBUaGUgbnVtYmVyIG9mIGxvY2FsbHkgdXNlZCBmaWVsZHMuIERlcGVuZGluZyBvbiB0aGUgbmFtaW5nIHNvdXJjZQogIC8vLyAoZS5nLiBpbmhlcml0YW5jZSBiYXNlZCBvciBnbG9iYWxseSB1bmlxdWUgZm9yIG1peGl4bnMpIHRoaXMKICAvLy8gbWlnaHQgYmUgZGlmZmVyZW50IGZyb20gW2luaGVyaXRhbmNlQmFzZWRGaWVsZE5hbWVDb3VudGVyXS4KICBpbnQgZ2V0IF9sb2NhbEZpZWxkTmFtZUNvdW50ZXIgPT4gX2ZpZWxkTmFtZUNvdW50ZXI7CiAgdm9pZCBzZXQgX2xvY2FsRmllbGROYW1lQ291bnRlcihpbnQgdmFsKSB7CiAgICBfZmllbGROYW1lQ291bnRlciA9IHZhbDsKICB9CgogIGZhY3RvcnkgX0ZpZWxkTmFtaW5nU2NvcGUuZm9yQ2xhc3MoCiAgICAgIENsYXNzRW50aXR5IGNscywgSkNsb3NlZFdvcmxkIHdvcmxkLCBfRmllbGROYW1pbmdSZWdpc3RyeSByZWdpc3RyeSkgewogICAgX0ZpZWxkTmFtaW5nU2NvcGUgcmVzdWx0ID0gcmVnaXN0cnkuc2NvcGVzW2Nsc107CiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHJldHVybiByZXN1bHQ7CgogICAgaWYgKHdvcmxkLmlzVXNlZEFzTWl4aW4oY2xzKSkgewogICAgICByZXN1bHQgPSBuZXcgX01peGluRmllbGROYW1pbmdTY29wZS5taXhpbihjbHMsIHJlZ2lzdHJ5KTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBzdXBlcmNsYXNzID0gd29ybGQuZWxlbWVudEVudmlyb25tZW50LmdldFN1cGVyQ2xhc3MoY2xzKTsKICAgICAgaWYgKHN1cGVyY2xhc3MgPT0gbnVsbCkgewogICAgICAgIHJlc3VsdCA9IG5ldyBfRmllbGROYW1pbmdTY29wZS5yb290U2NvcGUoY2xzLCByZWdpc3RyeSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX0ZpZWxkTmFtaW5nU2NvcGUgc3VwZXJTY29wZSA9CiAgICAgICAgICAgIG5ldyBfRmllbGROYW1pbmdTY29wZS5mb3JDbGFzcyhzdXBlcmNsYXNzLCB3b3JsZCwgcmVnaXN0cnkpOwogICAgICAgIGlmICh3b3JsZC5lbGVtZW50RW52aXJvbm1lbnQuaXNNaXhpbkFwcGxpY2F0aW9uKGNscykpIHsKICAgICAgICAgIHJlc3VsdCA9CiAgICAgICAgICAgICAgbmV3IF9NaXhpbkZpZWxkTmFtaW5nU2NvcGUubWl4ZWRJbihjbHMsIHN1cGVyU2NvcGUsIHJlZ2lzdHJ5KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzdWx0ID0gbmV3IF9GaWVsZE5hbWluZ1Njb3BlLmluaGVyaXQoY2xzLCBzdXBlclNjb3BlLCByZWdpc3RyeSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgd29ybGQuZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hDbGFzc01lbWJlcihjbHMsCiAgICAgICAgKENsYXNzRW50aXR5IGRlY2xhcmVyLCBNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAgIGlmIChtZW1iZXIuaXNGaWVsZCAmJiBtZW1iZXIuaXNJbnN0YW5jZU1lbWJlcikgcmVzdWx0LmFkZChtZW1iZXIpOwogICAgfSk7CgogICAgcmVnaXN0cnkuc2NvcGVzW2Nsc10gPSByZXN1bHQ7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgZmFjdG9yeSBfRmllbGROYW1pbmdTY29wZS5mb3JCb3goTG9jYWwgYm94LCBfRmllbGROYW1pbmdSZWdpc3RyeSByZWdpc3RyeSkgewogICAgcmV0dXJuIHJlZ2lzdHJ5LnNjb3BlcwogICAgICAgIC5wdXRJZkFic2VudChib3gsICgpID0+IG5ldyBfQm94RmllbGROYW1pbmdTY29wZShib3gsIHJlZ2lzdHJ5KSk7CiAgfQoKICBfRmllbGROYW1pbmdTY29wZS5yb290U2NvcGUodGhpcy5jb250YWluZXIsIHRoaXMucmVnaXN0cnkpCiAgICAgIDogc3VwZXJTY29wZSA9IG51bGwsCiAgICAgICAgX2ZpZWxkTmFtZUNvdW50ZXIgPSAwOwoKICBfRmllbGROYW1pbmdTY29wZS5pbmhlcml0KHRoaXMuY29udGFpbmVyLCB0aGlzLnN1cGVyU2NvcGUsIHRoaXMucmVnaXN0cnkpIHsKICAgIF9maWVsZE5hbWVDb3VudGVyID0gc3VwZXJTY29wZS5pbmhlcml0YW5jZUJhc2VkRmllbGROYW1lQ291bnRlcjsKICB9CgogIC8vLyBDaGVja3Mgd2hldGhlciBbbmFtZV0gaXMgYWxyZWFkeSB1c2VkIGluIHRoZSBjdXJyZW50IHNjb3BlIGNoYWluLgogIF9pc05hbWVVbnVzZWQoanNBc3QuTmFtZSBuYW1lKSB7CiAgICByZXR1cm4gIW5hbWVzLnZhbHVlcy5jb250YWlucyhuYW1lKSAmJgogICAgICAgICgoc3VwZXJTY29wZSA9PSBudWxsKSB8fCBzdXBlclNjb3BlLl9pc05hbWVVbnVzZWQobmFtZSkpOwogIH0KCiAganNBc3QuTmFtZSBfbmV4dE5hbWUoKSA9PiByZWdpc3RyeS5nZXROYW1lKF9sb2NhbEZpZWxkTmFtZUNvdW50ZXIrKyk7CgogIGpzQXN0Lk5hbWUgb3BlcmF0b3IgW10oRW50aXR5IGZpZWxkKSB7CiAgICBqc0FzdC5OYW1lIG5hbWUgPSBuYW1lc1tmaWVsZF07CiAgICBpZiAobmFtZSA9PSBudWxsICYmIHN1cGVyU2NvcGUgIT0gbnVsbCkgcmV0dXJuIHN1cGVyU2NvcGVbZmllbGRdOwogICAgcmV0dXJuIG5hbWU7CiAgfQoKICB2b2lkIGFkZChFbnRpdHkgZmllbGQpIHsKICAgIGlmIChuYW1lcy5jb250YWluc0tleShmaWVsZCkpIHJldHVybjsKCiAgICBqc0FzdC5OYW1lIHZhbHVlID0gX25leHROYW1lKCk7CiAgICBhc3NlcnQoX2lzTmFtZVVudXNlZCh2YWx1ZSksIGZhaWxlZEF0KGZpZWxkKSk7CiAgICBuYW1lc1tmaWVsZF0gPSB2YWx1ZTsKICB9CgogIGJvb2wgY29udGFpbnNGaWVsZChFbnRpdHkgZmllbGQpID0+IG5hbWVzLmNvbnRhaW5zS2V5KGZpZWxkKTsKfQoKLy8vIEZpZWxkIG5hbWVzIGZvciBtaXhpbnMgaGF2ZSB0d28gY29uc3RyYWludHM6IFRoZXkgbmVlZCB0byBiZSB1bmlxdWUgaW4gdGhlCi8vLyBoaWVyYXJjaHkgb2YgZWFjaCBhcHBsaWNhdGlvbiBvZiBhIG1peGluIGFuZCB0aGV5IG5lZWQgdG8gYmUgdGhlIHNhbWUgZm9yCi8vLyBhbGwgYXBwbGljYXRpb25zIG9mIGEgbWl4aW4uIFRvIGFjaGlldmUgdGhpcywgd2UgdXNlIGdsb2JhbCBuYW1pbmcgZm9yCi8vLyBtaXhpbnMgZnJvbSB0aGUgc2FtZSBuYW1lIHBvb2wgYXMgZmllbGRzIGFuZCBhZGQgYSBgJGAgYXQgdGhlIGVuZCB0byBlbnN1cmUKLy8vIHRoZXkgZG8gbm90IGNvbGxpZGUgd2l0aCBub3JtYWwgZmllbGQgbmFtZXMuIFRoZSBgJGAgc2lnbiBpcyB0eXBpY2FsbHkgdXNlZAovLy8gYXMgYSBzZXBhcmF0b3IgYmV0d2VlbiBtZXRob2QgbmFtZXMgYW5kIGFyZ3VtZW50IGNvdW50cyBhbmQgZG9lcyBub3QgYXBwZWFyCi8vLyBpbiBnZW5lcmF0ZWQgbmFtZXMgdGhlbXNlbHZlcy4KY2xhc3MgX01peGluRmllbGROYW1pbmdTY29wZSBleHRlbmRzIF9GaWVsZE5hbWluZ1Njb3BlIHsKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IF9sb2NhbEZpZWxkTmFtZUNvdW50ZXIgPT4gcmVnaXN0cnkuZ2xvYmFsQ291bnQ7CiAgQG92ZXJyaWRlCiAgdm9pZCBzZXQgX2xvY2FsRmllbGROYW1lQ291bnRlcihpbnQgdmFsKSB7CiAgICByZWdpc3RyeS5nbG9iYWxDb3VudCA9IHZhbDsKICB9CgogIEBvdmVycmlkZQogIE1hcDxFbnRpdHksIGpzQXN0Lk5hbWU+IGdldCBuYW1lcyA9PiByZWdpc3RyeS5nbG9iYWxOYW1lczsKCiAgX01peGluRmllbGROYW1pbmdTY29wZS5taXhpbihDbGFzc0VudGl0eSBjbHMsIF9GaWVsZE5hbWluZ1JlZ2lzdHJ5IHJlZ2lzdHJ5KQogICAgICA6IHN1cGVyLnJvb3RTY29wZShjbHMsIHJlZ2lzdHJ5KTsKCiAgX01peGluRmllbGROYW1pbmdTY29wZS5taXhlZEluKENsYXNzRW50aXR5IGNvbnRhaW5lciwKICAgICAgX0ZpZWxkTmFtaW5nU2NvcGUgc3VwZXJTY29wZSwgX0ZpZWxkTmFtaW5nUmVnaXN0cnkgcmVnaXN0cnkpCiAgICAgIDogc3VwZXIuaW5oZXJpdChjb250YWluZXIsIHN1cGVyU2NvcGUsIHJlZ2lzdHJ5KTsKCiAgQG92ZXJyaWRlCiAganNBc3QuTmFtZSBfbmV4dE5hbWUoKSB7CiAgICBqc0FzdC5OYW1lIHByb3Bvc2VkID0gc3VwZXIuX25leHROYW1lKCk7CiAgICByZXR1cm4gbmV3IENvbXBvdW5kTmFtZShbcHJvcG9zZWQsIE5hbWVyLl9saXRlcmFsRG9sbGFyXSk7CiAgfQp9CgovLy8gW0JveEZpZWxkRWxlbWVudF0gZmllbGRzIHdvcmsgZGlmZmVyZW50bHkgaW4gdGhhdCB0aGV5IGRvIG5vdCBiZWxvbmcgdG8gYW4KLy8vIGFjdHVhbCBjbGFzcyBidXQgYW4gYW5vbnltb3VzIGJveCBhc3NvY2lhdGVkIHRvIGEgW0xvY2FsXS4gQXMgdGhlcmUgaXMgbm8KLy8vIGluaGVyaXRhbmNlIGNoYWluLCB3ZSBkbyBub3QgbmVlZCB0byBjb21wdXRlIGZpZWxkcyBhIHByaW9yaSBidXQgY2FuIGFzc2lnbgovLy8gbmFtZXMgb24gdGhlIGZseS4KY2xhc3MgX0JveEZpZWxkTmFtaW5nU2NvcGUgZXh0ZW5kcyBfRmllbGROYW1pbmdTY29wZSB7CiAgX0JveEZpZWxkTmFtaW5nU2NvcGUoTG9jYWwgYm94LCBfRmllbGROYW1pbmdSZWdpc3RyeSByZWdpc3RyeSkKICAgICAgOiBzdXBlci5yb290U2NvcGUoYm94LCByZWdpc3RyeSk7CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNGaWVsZChfKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBqc0FzdC5OYW1lIG9wZXJhdG9yIFtdKEVudGl0eSBmaWVsZCkgewogICAgaWYgKCFuYW1lcy5jb250YWluc0tleShmaWVsZCkpIGFkZChmaWVsZCk7CiAgICByZXR1cm4gbmFtZXNbZmllbGRdOwogIH0KfQqA6gBOTjwBGgE2KgFIMgVOTUBHNE0GAR0jSA0wUAYBKB0GEQQCATMETVBBHRUBMCwBTQEXAT0BJAFMS00MBVBIECIlSU5MOSlCRhdRD08IBgEdBAIBUE5RTlFMGARRKxomGkonAToZAUtBQQFIQ0I3LR0EASZMNScBJEANRCBBDydJQBNNEU0KCAYBNTZJCAEjEwQBTxtKBAE9Gx8BTkUEAUgjK0IEAUgBKSRGEQQBGyoBJDMaBAFAAgFPTktQUFAjOQw6DC0gBAEMPQFPKAE4QzgBDBstPwQCAU9OUBY3QSgBDCEBDCkvGQQCATdwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL2ZpZWxkX25hbWluZ19taXhpbi5kYXJ0PXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2JhY2tlbmQvZnJlcXVlbmN5X25hbWVyLmRhcnSSvi8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGpzX2JhY2tlbmQubmFtZXI7CgpjbGFzcyBGcmVxdWVuY3lCYXNlZE5hbWVyIGV4dGVuZHMgTmFtZXIKICAgIHdpdGggX01pbmlmaWVkRmllbGROYW1lciwgX01pbmlmaWVkT25lU2hvdEludGVyY2VwdG9yTmFtZXIKICAgIGltcGxlbWVudHMganNBc3QuVG9rZW5GaW5hbGl6ZXIgewogIEBvdmVycmlkZQogIF9GaWVsZE5hbWluZ1JlZ2lzdHJ5IGZpZWxkUmVnaXN0cnk7CiAgTGlzdDxUb2tlbk5hbWU+IHRva2VucyA9IG5ldyBMaXN0PFRva2VuTmFtZT4oKTsKCiAgTWFwPE5hbWluZ1Njb3BlLCBUb2tlblNjb3BlPiBfdG9rZW5TY29wZXMgPQogICAgICBuZXcgTWFwbGV0PE5hbWluZ1Njb3BlLCBUb2tlblNjb3BlPigpOwoKICAvLyBTb21lIGJhc2ljIHNldHRpbmdzIGZvciBzbWFsbGVyIG5hbWVzCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBpc29sYXRlTmFtZSA9PiAnSSc7CiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBpc29sYXRlUHJvcGVydGllc05hbWUgPT4gJ3AnOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IHNob3VsZE1pbmlmeSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgZ2V0dGVyUHJlZml4ID0gJ2cnOwogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBzZXR0ZXJQcmVmaXggPSAncyc7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIGNhbGxQcmVmaXggPSAnJzsgLy8gdGhpcyB3aWxsIGNyZWF0ZSBmdW5jdGlvbiBuYW1lcyAkPG4+CiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBvcGVyYXRvcklzUHJlZml4ID0+IHInJGknOwogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgb3BlcmF0b3JBc1ByZWZpeCA9PiByJyRhJzsKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGNhbGxDYXRjaEFsbE5hbWUgPT4gcickQyc7CiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCByZXF1aXJlZFBhcmFtZXRlckZpZWxkID0+IHInJFInOwogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZGVmYXVsdFZhbHVlc0ZpZWxkID0+IHInJEQnOwogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgb3BlcmF0b3JTaWduYXR1cmUgPT4gcickUyc7CiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBnZW5lcmljSW5zdGFudGlhdGlvblByZWZpeCA9PiByJyRJJzsKCiAgQG92ZXJyaWRlCiAganNBc3QuTmFtZSBnZXQgc3RhdGljc1Byb3BlcnR5TmFtZSA9PgogICAgICBfc3RhdGljc1Byb3BlcnR5TmFtZSA/Pz0gZ2V0RnJlc2hOYW1lKGluc3RhbmNlU2NvcGUsICdzdGF0aWMnKTsKCiAgRnJlcXVlbmN5QmFzZWROYW1lcigKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLCBDb2RlZ2VuV29ybGRCdWlsZGVyIGNvZGVnZW5Xb3JsZEJ1aWxkZXIpCiAgICAgIDogc3VwZXIoY2xvc2VkV29ybGQsIGNvZGVnZW5Xb3JsZEJ1aWxkZXIpIHsKICAgIGZpZWxkUmVnaXN0cnkgPSBuZXcgX0ZpZWxkTmFtaW5nUmVnaXN0cnkodGhpcyk7CiAgfQoKICBUb2tlblNjb3BlIG5ld1Njb3BlRm9yKE5hbWluZ1Njb3BlIHNjb3BlKSB7CiAgICBpZiAoc2NvcGUgPT0gaW5zdGFuY2VTY29wZSkgewogICAgICBTZXQ8U3RyaW5nPiBpbGxlZ2FsTmFtZXMgPSBuZXcgU2V0PFN0cmluZz4uZnJvbShqc1Jlc2VydmVkKTsKICAgICAgZm9yIChTdHJpbmcgaWxsZWdhbCBpbiBNaW5pZnlOYW1lci5fcmVzZXJ2ZWROYXRpdmVQcm9wZXJ0aWVzKSB7CiAgICAgICAgaWxsZWdhbE5hbWVzLmFkZChpbGxlZ2FsKTsKICAgICAgICBpZiAoTWluaWZ5TmFtZXIuX2hhc0Jhbm5lZFByZWZpeChpbGxlZ2FsKSkgewogICAgICAgICAgaWxsZWdhbE5hbWVzLmFkZChpbGxlZ2FsLnN1YnN0cmluZygxKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBuZXcgVG9rZW5TY29wZShpbGxlZ2FsTmFtZXMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBUb2tlblNjb3BlKGpzUmVzZXJ2ZWQpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuTmFtZSBnZXRGcmVzaE5hbWUoTmFtaW5nU2NvcGUgc2NvcGUsIFN0cmluZyBwcm9wb3NlZE5hbWUsCiAgICAgIHtib29sIHNhbml0aXplRm9yTmF0aXZlczogZmFsc2UsIGJvb2wgc2FuaXRpemVGb3JBbm5vdGF0aW9uczogZmFsc2V9KSB7CiAgICAvLyBHcmFiIHRoZSBzY29wZSBmb3IgdGhpcyB0b2tlbgogICAgVG9rZW5TY29wZSB0b2tlblNjb3BlID0KICAgICAgICBfdG9rZW5TY29wZXMucHV0SWZBYnNlbnQoc2NvcGUsICgpID0+IG5ld1Njb3BlRm9yKHNjb3BlKSk7CgogICAgLy8gR2V0IHRoZSBuYW1lIHRoZSBub3JtYWwgbmFtZXIgd291bGQgdXNlIGFzIGEga2V5LgogICAgU3RyaW5nIHByb3Bvc2VkID0gX2dlbmVyYXRlRnJlc2hTdHJpbmdGb3JOYW1lKHByb3Bvc2VkTmFtZSwgc2NvcGUsCiAgICAgICAgc2FuaXRpemVGb3JOYXRpdmVzOiBzYW5pdGl6ZUZvck5hdGl2ZXMsCiAgICAgICAgc2FuaXRpemVGb3JBbm5vdGF0aW9uczogc2FuaXRpemVGb3JBbm5vdGF0aW9ucyk7CgogICAgVG9rZW5OYW1lIG5hbWUgPSBuZXcgVG9rZW5OYW1lKHRva2VuU2NvcGUsIHByb3Bvc2VkKTsKICAgIHRva2Vucy5hZGQobmFtZSk7CiAgICByZXR1cm4gbmFtZTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0Lk5hbWUgaW5zdGFuY2VGaWVsZFByb3BlcnR5TmFtZShGaWVsZEVudGl0eSBlbGVtZW50KSB7CiAgICBqc0FzdC5OYW1lIHByb3Bvc2VkID0gX21pbmlmaWVkSW5zdGFuY2VGaWVsZFByb3BlcnR5TmFtZShlbGVtZW50KTsKICAgIGlmIChwcm9wb3NlZCAhPSBudWxsKSB7CiAgICAgIHJldHVybiBwcm9wb3NlZDsKICAgIH0KICAgIHJldHVybiBzdXBlci5pbnN0YW5jZUZpZWxkUHJvcGVydHlOYW1lKGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmaW5hbGl6ZVRva2VucygpIHsKICAgIGludCBjb21wYXJlUmVmZXJlbmNlQ291bnQoVG9rZW5OYW1lIGEsIFRva2VuTmFtZSBiKSB7CiAgICAgIGludCByZXN1bHQgPSBiLl9yYyAtIGEuX3JjOwogICAgICBpZiAocmVzdWx0ID09IDApIHJlc3VsdCA9IGEua2V5LmNvbXBhcmVUbyhiLmtleSk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgTGlzdDxUb2tlbk5hbWU+IHVzZWROYW1lcyA9CiAgICAgICAgdG9rZW5zLndoZXJlKChUb2tlbk5hbWUgYSkgPT4gYS5fcmMgPiAwKS50b0xpc3QoKTsKICAgIHVzZWROYW1lcy5zb3J0KGNvbXBhcmVSZWZlcmVuY2VDb3VudCk7CiAgICB1c2VkTmFtZXMuZm9yRWFjaCgoVG9rZW5OYW1lIHRva2VuKSA9PiB0b2tlbi5maW5hbGl6ZSgpKTsKICB9Cn0KCmNsYXNzIFRva2VuU2NvcGUgewogIExpc3Q8aW50PiBfbmV4dE5hbWUgPSBbJGFdOwogIGZpbmFsIFNldDxTdHJpbmc+IGlsbGVnYWxOYW1lczsKCiAgVG9rZW5TY29wZShbdGhpcy5pbGxlZ2FsTmFtZXMgPSBjb25zdCBJbW11dGFibGVFbXB0eVNldCgpXSk7CgogIC8vLyBJbmNyZW1lbnRzIHRoZSBsZXR0ZXIgYXQgW3Bvc10gaW4gdGhlIGN1cnJlbnQgbmFtZS4gQWxzbyB0YWtlcyBjYXJlIG9mCiAgLy8vIG92ZXJmbG93cyB0byB0aGUgbGVmdC4gUmV0dXJucyB0aGUgY2FycnkgYml0LCBpLmUuLCBpdCByZXR1cm5zIGB0cnVlYAogIC8vLyBpZiBhbGwgcG9zaXRpb25zIHRvIHRoZSBsZWZ0IGhhdmUgd3JhcHBlZCBhcm91bmQuCiAgLy8vCiAgLy8vIElmIFtfbmV4dE5hbWVdIGlzIGluaXRpYWxseSAnYScsIHRoaXMgd2lsbCBnZW5lcmF0ZSB0aGUgc2VxdWVuY2UKICAvLy8KICAvLy8gW2EtekEtWl0KICAvLy8gW2EtekEtWl1bXzAtOWEtekEtWl0KICAvLy8gW2EtekEtWl1bXzAtOWEtekEtWl1bXzAtOWEtekEtWl0KICAvLy8gLi4uCiAgYm9vbCBfaW5jcmVtZW50UG9zaXRpb24oaW50IHBvcykgewogICAgYm9vbCBvdmVyZmxvdyA9IGZhbHNlOwogICAgaWYgKHBvcyA8IDApIHJldHVybiB0cnVlOwogICAgaW50IHZhbHVlID0gX25leHROYW1lW3Bvc107CiAgICBpZiAodmFsdWUgPT0gJF8pIHsKICAgICAgdmFsdWUgPSAkMDsKICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gJDkpIHsKICAgICAgdmFsdWUgPSAkYTsKICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gJHopIHsKICAgICAgdmFsdWUgPSAkQTsKICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gJFopIHsKICAgICAgb3ZlcmZsb3cgPSBfaW5jcmVtZW50UG9zaXRpb24ocG9zIC0gMSk7CiAgICAgIHZhbHVlID0gKHBvcyA+IDApID8gJF8gOiAkYTsKICAgIH0gZWxzZSB7CiAgICAgIHZhbHVlKys7CiAgICB9CiAgICBfbmV4dE5hbWVbcG9zXSA9IHZhbHVlOwogICAgcmV0dXJuIG92ZXJmbG93OwogIH0KCiAgX2luY3JlbWVudE5hbWUoKSB7CiAgICBpZiAoX2luY3JlbWVudFBvc2l0aW9uKF9uZXh0TmFtZS5sZW5ndGggLSAxKSkgewogICAgICBfbmV4dE5hbWUuYWRkKCRfKTsKICAgIH0KICB9CgogIFN0cmluZyBnZXROZXh0TmFtZSgpIHsKICAgIFN0cmluZyBwcm9wb3NhbDsKICAgIGRvIHsKICAgICAgcHJvcG9zYWwgPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoX25leHROYW1lKTsKICAgICAgX2luY3JlbWVudE5hbWUoKTsKICAgIH0gd2hpbGUgKE1pbmlmeU5hbWVyLl9oYXNCYW5uZWRQcmVmaXgocHJvcG9zYWwpIHx8CiAgICAgICAgaWxsZWdhbE5hbWVzLmNvbnRhaW5zKHByb3Bvc2FsKSk7CgogICAgcmV0dXJuIHByb3Bvc2FsOwogIH0KfQqApgBOTjwBGgEoPyYMJjIBLi0BKwwhDCsMIQEMIwwjDEgMKAwoDCgMLgwqDCkMMgEMKEYBF0kyNAQBLiJDRiM1MgoIKw0pBgQBDEJOJRxDATlHMDkBOhYRBAEMPkccFwY1BAEMGjoiOBUGASA7Kz4EAgETHiIBPwFNTDgGRwYPGycKJRseIBcSHhIeEh4uIw0PBhwVBAEVNBkGBAEZFQk2GDcqARUEAgE0cGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9mcmVxdWVuY3lfbmFtZXIuZGFydDpzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL21pbmlmeV9uYW1lci5kYXJ0unAvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBqc19iYWNrZW5kLm5hbWVyOwoKLy8vIEFzc2lnbnMgSmF2YVNjcmlwdCBpZGVudGlmaWVycyB0byBEYXJ0IHZhcmlhYmxlcywgY2xhc3MtbmFtZXMgYW5kIG1lbWJlcnMuCmNsYXNzIE1pbmlmeU5hbWVyIGV4dGVuZHMgTmFtZXIKICAgIHdpdGgKICAgICAgICBfTWluaWZpZWRGaWVsZE5hbWVyLAogICAgICAgIF9NaW5pZnlDb25zdHJ1Y3RvckJvZHlOYW1lciwKICAgICAgICBfTWluaWZpZWRPbmVTaG90SW50ZXJjZXB0b3JOYW1lciB7CiAgTWluaWZ5TmFtZXIoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLCBDb2RlZ2VuV29ybGRCdWlsZGVyIGNvZGVnZW5Xb3JsZEJ1aWxkZXIpCiAgICAgIDogc3VwZXIoY2xvc2VkV29ybGQsIGNvZGVnZW5Xb3JsZEJ1aWxkZXIpIHsKICAgIHJlc2VydmVCYWNrZW5kTmFtZXMoKTsKICAgIGZpZWxkUmVnaXN0cnkgPSBuZXcgX0ZpZWxkTmFtaW5nUmVnaXN0cnkodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBfRmllbGROYW1pbmdSZWdpc3RyeSBmaWVsZFJlZ2lzdHJ5OwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGlzb2xhdGVOYW1lID0+ICdJJzsKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGlzb2xhdGVQcm9wZXJ0aWVzTmFtZSA9PiAncCc7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgc2hvdWxkTWluaWZ5ID0+IHRydWU7CgogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBnZXR0ZXJQcmVmaXggPSAnZyc7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIHNldHRlclByZWZpeCA9ICdzJzsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgY2FsbFByZWZpeCA9ICcnOyAvLyB0aGlzIHdpbGwgY3JlYXRlIGZ1bmN0aW9uIG5hbWVzICQ8bj4KICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IG9wZXJhdG9ySXNQcmVmaXggPT4gcickaSc7CiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBvcGVyYXRvckFzUHJlZml4ID0+IHInJGEnOwogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgY2FsbENhdGNoQWxsTmFtZSA9PiByJyRDJzsKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IHJlcXVpcmVkUGFyYW1ldGVyRmllbGQgPT4gcickUic7CiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBkZWZhdWx0VmFsdWVzRmllbGQgPT4gcickRCc7CiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBvcGVyYXRvclNpZ25hdHVyZSA9PiByJyRTJzsKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGdlbmVyaWNJbnN0YW50aWF0aW9uUHJlZml4ID0+IHInJEknOwoKICBmaW5hbCBBTFBIQUJFVF9DSEFSQUNURVJTID0gNTI7IC8vIGEtekEtWi4KICBmaW5hbCBBTFBIQU5VTUVSSUNfQ0hBUkFDVEVSUyA9IDYyOyAvLyBhLXpBLVowLTkuCgogIC8vLyBZb3UgY2FuIHBhc3MgYW4gaW52YWxpZCBpZGVudGlmaWVyIHRvIHRoaXMgYW5kIHVubGlrZSBpdHMgbm9uLW1pbmlmeWluZwogIC8vLyBjb3VudGVycGFydCBpdCB3aWxsIG5ldmVyIHJldHVybiB0aGUgcHJvcG9zZWROYW1lIGFzIHRoZSBuZXcgZnJlc2ggbmFtZS4KICAvLy8KICAvLy8gW3Nhbml0aXplRm9yTmF0aXZlc10gYW5kIFtzYW5pdGl6ZUZvckFubm90YXRpb25zXSBhcmUgaWdub3JlZCBiZWNhdXNlIHRoZQogIC8vLyBtaW5pZmllZCBuYW1lcyB3aWxsIGFsd2F5cyBhdm9pZCBjbGFzaGluZyB3aXRoIGFubm90YXRlZCBuYW1lcyBvciBuYXRpdmVzLgogIEBvdmVycmlkZQogIFN0cmluZyBfZ2VuZXJhdGVGcmVzaFN0cmluZ0Zvck5hbWUoU3RyaW5nIHByb3Bvc2VkTmFtZSwgTmFtaW5nU2NvcGUgc2NvcGUsCiAgICAgIHtib29sIHNhbml0aXplRm9yTmF0aXZlczogZmFsc2UsIGJvb2wgc2FuaXRpemVGb3JBbm5vdGF0aW9uczogZmFsc2V9KSB7CiAgICBTdHJpbmcgZnJlc2hOYW1lOwogICAgU3RyaW5nIHN1Z2dlc3Rpb24gPSBzY29wZS5zdWdnZXN0TmFtZShwcm9wb3NlZE5hbWUpOwogICAgaWYgKHN1Z2dlc3Rpb24gIT0gbnVsbCAmJiBzY29wZS5pc1VudXNlZChzdWdnZXN0aW9uKSkgewogICAgICBmcmVzaE5hbWUgPSBzdWdnZXN0aW9uOwogICAgfSBlbHNlIHsKICAgICAgZnJlc2hOYW1lID0gX2dldFVudXNlZE5hbWUocHJvcG9zZWROYW1lLCBzY29wZSk7CiAgICB9CiAgICBzY29wZS5yZWdpc3RlclVzZShmcmVzaE5hbWUpOwogICAgcmV0dXJuIGZyZXNoTmFtZTsKICB9CgogIC8vIEZyb20gaXNzdWUgNzU1NC4gIFRoZXNlIHNob3VsZCBub3QgYmUgdXNlZCBvbiBvYmplY3RzIChhcyBpbnN0YW5jZQogIC8vIHZhcmlhYmxlcykgYmVjYXVzZSB0aGV5IGNsYXNoIHdpdGggbmFtZXMgZnJvbSB0aGUgRE9NLiBIb3dldmVyLCBpdCBpcwogIC8vIE9LIHRvIHVzZSB0aGVtIGFzIGZpZWxkcywgYXMgd2Ugb25seSBhY2Nlc3MgZmllbGRzIGRpcmVjdGx5IGlmIHdlIGtub3cKICAvLyB0aGUgcmVjZWl2ZXIgdHlwZS4KICBzdGF0aWMgY29uc3QgTGlzdDxTdHJpbmc+IF9yZXNlcnZlZE5hdGl2ZVByb3BlcnRpZXMgPSBjb25zdCA8U3RyaW5nPlsKICAgICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdyJywgJ3gnLCAneScsICd6JywgJ1EnLAogICAgLy8gMi1sZXR0ZXI6CiAgICAnY2gnLCAnY3gnLCAnY3knLCAnZGInLCAnZHgnLCAnZHknLCAnZnInLCAnZngnLCAnZnknLCAnZ28nLCAnaWQnLCAnazEnLAogICAgJ2syJywgJ2szJywgJ2s0JywgJ3IxJywgJ3IyJywgJ3J4JywgJ3J5JywgJ3gxJywgJ3gyJywgJ3kxJywgJ3kyJywKICAgIC8vIDMtbGV0dGVyOgogICAgJ2FkZCcsICdhbGwnLCAnYWx0JywgJ2FyYycsICdDQ1cnLCAnY21wJywgJ2RpcicsICdlbmQnLCAnZ2V0JywgJ2luMScsCiAgICAnaW4yJywgJ0lOVCcsICdrZXknLCAnbG9nJywgJ2xvdycsICdtMTEnLCAnbTEyJywgJ20xMycsICdtMTQnLCAnbTIxJywKICAgICdtMjInLCAnbTIzJywgJ20yNCcsICdtMzEnLCAnbTMyJywgJ20zMycsICdtMzQnLCAnbTQxJywgJ200MicsICdtNDMnLAogICAgJ200NCcsICdtYXgnLCAnbWluJywgJ25vdycsICdPTkUnLCAncHV0JywgJ3JlZCcsICdyZWwnLCAncmV2JywgJ1JHQicsCiAgICAnc2RwJywgJ3NldCcsICdzcmMnLCAndGFnJywgJ3RvcCcsICd1aWQnLCAndXJpJywgJ3VybCcsICdVUkwnLAogICAgLy8gNC1sZXR0ZXI6CiAgICAnYWJicicsICdhdG9iJywgJ0F0dHInLCAnYXhlcycsICdheGlzJywgJ2JhY2snLCAnQkFDSycsICdiZXRhJywgJ2JpYXMnLAogICAgJ0Jsb2InLCAnYmx1ZScsICdibHVyJywgJ0JMVVInLCAnYm9keScsICdCT09MJywgJ0JPVEgnLCAnYnRvYScsICdCWVRFJywKICAgICdjaXRlJywgJ2NsaXAnLCAnY29kZScsICdjb2xzJywgJ2N1ZXMnLCAnZGF0YScsICdERUNSJywgJ0RPTkUnLCAnZmFjZScsCiAgICAnZmlsZScsICdGaWxlJywgJ2ZpbGwnLCAnZmluZCcsICdmb250JywgJ2Zvcm0nLCAnZ2FpbicsICdoYXNoJywgJ2hlYWQnLAogICAgJ2hpZ2gnLCAnaGludCcsICdob3N0JywgJ2hyZWYnLCAnSFJURicsICdJRExFJywgJ0lOQ1InLCAnaW5mbycsICdJTklUJywKICAgICdpc0lkJywgJ2l0ZW0nLCAnS0VFUCcsICdraW5kJywgJ2tuZWUnLCAnbGFuZycsICdsZWZ0JywgJ0xFU1MnLCAnbGluZScsCiAgICAnbGluaycsICdsaXN0JywgJ2xvYWQnLCAnbG9vcCcsICdtb2RlJywgJ25hbWUnLCAnTm9kZScsICdOb25lJywgJ05PTkUnLAogICAgJ29ubHknLCAnb3BlbicsICdPUEVOJywgJ3BpbmcnLCAncGxheScsICdwb3J0JywgJ3JlY3QnLCAnUmVjdCcsICdyZWZYJywKICAgICdyZWZZJywgJ1JHQkEnLCAncm9vdCcsICdyb3dzJywgJ3NhdmUnLCAnc2VlZCcsICdzZWVrJywgJ3NlbGYnLCAnc2VuZCcsCiAgICAnc2hvdycsICdTSU5FJywgJ3NpemUnLCAnc3BhbicsICdzdGF0JywgJ3N0ZXAnLCAnc3RvcCcsICd0YWdzJywgJ3RleHQnLAogICAgJ1RleHQnLCAndGltZScsICd0eXBlJywgJ3ZpZXcnLCAnd2FybicsICd3cmFwJywgJ1pFUk8nCiAgXTsKCiAgdm9pZCByZXNlcnZlQmFja2VuZE5hbWVzKCkgewogICAgZm9yIChTdHJpbmcgbmFtZSBpbiBfcmVzZXJ2ZWROYXRpdmVQcm9wZXJ0aWVzKSB7CiAgICAgIGlmIChuYW1lLmxlbmd0aCA8IDIpIHsKICAgICAgICAvLyBFbnN1cmUgdGhlIDEtbGV0dGVyIG5hbWVzIGFyZSBkaXNhbWJpZ3VhdGVkIHRvIHRoZSBzYW1lIG5hbWUuCiAgICAgICAgU3RyaW5nIGRpc2FtYmlndWF0ZWROYW1lID0gbmFtZTsKICAgICAgICByZXNlcnZlUHVibGljTWVtYmVyTmFtZShuYW1lLCBkaXNhbWJpZ3VhdGVkTmFtZSk7CiAgICAgIH0KICAgICAgaW5zdGFuY2VTY29wZS5yZWdpc3RlclVzZShuYW1lKTsKICAgICAgLy8gR2V0dGVyIGFuZCBzZXR0ZXIgbmFtZXMgYXJlIGF1dG9nZW5lcmF0ZWQgYnkgcHJlcGVuZGluZyAnZycgYW5kICdzJyB0bwogICAgICAvLyBmaWVsZCBuYW1lcy4gIFRoZXJlZm9yZSB0aGVyZSBhcmUgc29tZSBmaWVsZCBuYW1lcyB3ZSBkb24ndCB3YW50IHRvCiAgICAgIC8vIHVzZS4gIEl0IGlzIGltcGxpY2l0IGluIHRoZSBuZXh0IGxpbmUgdGhhdCB0aGUgYmFubmVkIHByZWZpeCBpcwogICAgICAvLyBvbmx5IG9uZSBjaGFyYWN0ZXIuCiAgICAgIGlmIChfaGFzQmFubmVkUHJlZml4KG5hbWUpKSB7CiAgICAgICAgaW5zdGFuY2VTY29wZS5yZWdpc3RlclVzZShuYW1lLnN1YnN0cmluZygxKSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBUaGVzZSBwb3B1bGFyIG5hbWVzIGFyZSBwcmVzZW50IGluIG1vc3QgcHJvZ3JhbXMgYW5kIGRlc2VydmUKICAgIC8vIHNpbmdsZSBjaGFyYWN0ZXIgbWluaWZpZWQgbmFtZXMuICBXZSBjb3VsZCBkZXRlcm1pbmUgdGhlIHBvcHVsYXIgbmFtZXMKICAgIC8vIGluZGl2aWR1YWxseSBwZXIgcHJvZ3JhbSwgYnV0IHRoYXQgd291bGQgbWVhbiB0aGF0IHRoZSBvdXRwdXQgb2YgdGhlCiAgICAvLyBtaW5pZmllciB3YXMgbGVzcyBzdGFibGUgZnJvbSB2ZXJzaW9uIHRvIHZlcnNpb24gb2YgdGhlIHByb2dyYW0gYmVpbmcKICAgIC8vIG1pbmlmaWVkLgogICAgX3BvcHVsYXRlU3VnZ2VzdGVkTmFtZXMoaW5zdGFuY2VTY29wZSwgY29uc3QgPFN0cmluZz5bCiAgICAgIHInJGFkZCcsCiAgICAgIHInYWRkJDEnLAogICAgICByJyRhbmQnLAogICAgICByJyRvcicsCiAgICAgIHInY3VycmVudCcsCiAgICAgIHInJHNocicsCiAgICAgIHInJGVxJywKICAgICAgcickbmUnLAogICAgICByJyRpbmRleCcsCiAgICAgIHInJGluZGV4U2V0JywKICAgICAgcickeG9yJywKICAgICAgcidjbG9uZSQwJywKICAgICAgcidpdGVyYXRvcicsCiAgICAgIHInbGVuZ3RoJywKICAgICAgcickbHQnLAogICAgICByJyRndCcsCiAgICAgIHInJGxlJywKICAgICAgcickZ2UnLAogICAgICByJ21vdmVOZXh0JDAnLAogICAgICByJ25vZGUnLAogICAgICByJ29uJywKICAgICAgcickbmVnYXRlJywKICAgICAgcidwdXNoJywKICAgICAgcidzZWxmJywKICAgICAgcidzdGFydCcsCiAgICAgIHIndGFyZ2V0JywKICAgICAgcickc2hsJywKICAgICAgcid2YWx1ZScsCiAgICAgIHInd2lkdGgnLAogICAgICByJ3N0eWxlJywKICAgICAgcidub1N1Y2hNZXRob2QkMScsCiAgICAgIHInJG11bCcsCiAgICAgIHInJGRpdicsCiAgICAgIHInJHN1YicsCiAgICAgIHInJG5vdCcsCiAgICAgIHInJG1vZCcsCiAgICAgIHInJHRkaXYnLAogICAgICByJ3RvU3RyaW5nJDAnCiAgICBdKTsKCiAgICBfcG9wdWxhdGVTdWdnZXN0ZWROYW1lcyhnbG9iYWxTY29wZSwgY29uc3QgPFN0cmluZz5bCiAgICAgIHInT2JqZWN0JywKICAgICAgJ3dyYXBFeGNlcHRpb24nLAogICAgICByJyRlcScsCiAgICAgIHInUycsCiAgICAgIHInaW9vcmUnLAogICAgICByJ1Vuc3VwcG9ydGVkRXJyb3IkJywKICAgICAgcidsZW5ndGgnLAogICAgICByJyRzdWInLAogICAgICByJyRhZGQnLAogICAgICByJyRndCcsCiAgICAgIHInJGdlJywKICAgICAgcickbHQnLAogICAgICByJyRsZScsCiAgICAgIHInYWRkJywKICAgICAgcidpYWUnLAogICAgICByJ0FyZ3VtZW50RXJyb3IkJywKICAgICAgcidCb3VuZENsb3N1cmUnLAogICAgICByJ0Nsb3N1cmUnLAogICAgICByJ1N0YXRlRXJyb3IkJywKICAgICAgcidnZXRJbnRlcmNlcHRvciQnLAogICAgICByJ21heCcsCiAgICAgIHInJG11bCcsCiAgICAgIHInTWFwJywKICAgICAgcidLZXlfS2V5JywKICAgICAgcickZGl2JywKICAgICAgcidMaXN0X0xpc3QkZnJvbScsCiAgICAgIHInTGlua2VkSGFzaE1hcF9MaW5rZWRIYXNoTWFwJF9lbXB0eScsCiAgICAgIHInTGlua2VkSGFzaE1hcF9MaW5rZWRIYXNoTWFwJF9saXRlcmFsJywKICAgICAgcidtaW4nLAogICAgICByJ1JhbmdlRXJyb3IkdmFsdWUnLAogICAgICByJ0pTU3RyaW5nJywKICAgICAgcidKU051bWJlcicsCiAgICAgIHInSlNBcnJheScsCiAgICAgIHInY3JlYXRlSW52b2NhdGlvbk1pcnJvcicsCiAgICAgIHInU3RyaW5nJywKICAgICAgcidzZXRSdW50aW1lVHlwZUluZm8nLAogICAgICByJ2NyZWF0ZVJ1bnRpbWVUeXBlJwogICAgXSk7CiAgfQoKICB2b2lkIF9wb3B1bGF0ZVN1Z2dlc3RlZE5hbWVzKE5hbWluZ1Njb3BlIHNjb3BlLCBMaXN0PFN0cmluZz4gc3VnZ2VzdGlvbnMpIHsKICAgIGludCBjID0gJGEgLSAxOwogICAgU3RyaW5nIGxldHRlcjsKICAgIGZvciAoU3RyaW5nIG5hbWUgaW4gc3VnZ2VzdGlvbnMpIHsKICAgICAgZG8gewogICAgICAgIGFzc2VydChjICE9ICRaKTsKICAgICAgICBjID0gKGMgPT0gJHopID8gJEEgOiBjICsgMTsKICAgICAgICBsZXR0ZXIgPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoW2NdKTsKICAgICAgfSB3aGlsZSAoX2hhc0Jhbm5lZFByZWZpeChsZXR0ZXIpIHx8IHNjb3BlLmlzVXNlZChsZXR0ZXIpKTsKICAgICAgYXNzZXJ0KCFzY29wZS5oYXNTdWdnZXN0aW9uKG5hbWUpKTsKICAgICAgc2NvcGUuYWRkU3VnZ2VzdGlvbihuYW1lLCBsZXR0ZXIpOwogICAgfQogIH0KCiAgLy8gVGhpcyBnZXRzIGEgbWluaWZpZWQgbmFtZSBiYXNlZCBvbiBhIGhhc2ggb2YgdGhlIHByb3Bvc2VkIG5hbWUuICBUaGlzCiAgLy8gaXMgc2xpZ2h0bHkgbGVzcyBlZmZpY2llbnQgdGhhbiBqdXN0IGdldHRpbmcgdGhlIG5leHQgbmFtZSBpbiBhIHNlcmllcywKICAvLyBidXQgaXQgbWVhbnMgdGhhdCBzbWFsbCBjaGFuZ2VzIGluIHRoZSBpbnB1dCBwcm9ncmFtIHdpbGwgZ2l2ZSBzbWFsbGlzaAogIC8vIGNoYW5nZXMgaW4gdGhlIG91dHB1dCwgd2hpY2ggY2FuIGJlIHVzZWZ1bCBmb3IgZGlmZmluZyBldGMuCiAgU3RyaW5nIF9nZXRVbnVzZWROYW1lKFN0cmluZyBwcm9wb3NlZE5hbWUsIE5hbWluZ1Njb3BlIHNjb3BlKSB7CiAgICBpbnQgaGFzaCA9IF9jYWxjdWxhdGVIYXNoKHByb3Bvc2VkTmFtZSk7CiAgICAvLyBBdm9pZCB2ZXJ5IHNtYWxsIGhhc2hlcyB0aGF0IHdvbid0IHRyeSBtYW55IG5hbWVzLgogICAgaGFzaCA9IGhhc2ggPCAxMDAwID8gaGFzaCAqIDMxNDE1OSA6IGhhc2g7IC8vIFllcywgaXQncyBwcmltZS4KCiAgICAvLyBUcnkgb3RoZXIgbi1jaGFyYWN0ZXIgbmFtZXMgYmFzZWQgb24gdGhlIGhhc2guICBXZSB0cnkgb25lIHRvIHRocmVlCiAgICAvLyBjaGFyYWN0ZXIgaWRlbnRpZmllcnMuICBGb3IgZWFjaCBsZW5ndGggd2UgdHJ5IGFyb3VuZCAxMCBkaWZmZXJlbnQgbmFtZXMKICAgIC8vIGluIGEgcHJlZGljdGFibGUgb3JkZXIgZGV0ZXJtaW5lZCBieSB0aGUgcHJvcG9zZWQgbmFtZS4gIFRoaXMgaXMgaW4gb3JkZXIKICAgIC8vIHRvIG1ha2UgdGhlIHJlbmFtZXIgc3RhYmxlOiBzbWFsbCBjaGFuZ2VzIGluIHRoZSBpbnB1dCBzaG91bGQgbm9ybmFsbHkKICAgIC8vIHJlc3VsdCBpbiByZWxhdGl2ZWx5IHNtYWxsIGNoYW5nZXMgaW4gdGhlIG91dHB1dC4KICAgIGZvciAoaW50IG4gPSAxOyBuIDw9IDM7IG4rKykgewogICAgICBpbnQgaCA9IGhhc2g7CiAgICAgIHdoaWxlIChoID4gMTApIHsKICAgICAgICBMaXN0PGludD4gY29kZXMgPSA8aW50PltfbGV0dGVyTnVtYmVyKGgpXTsKICAgICAgICBpbnQgaDIgPSBoIH4vIEFMUEhBQkVUX0NIQVJBQ1RFUlM7CiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuOyBpKyspIHsKICAgICAgICAgIGNvZGVzLmFkZChfYWxwaGFOdW1lcmljTnVtYmVyKGgyKSk7CiAgICAgICAgICBoMiB+Lz0gQUxQSEFOVU1FUklDX0NIQVJBQ1RFUlM7CiAgICAgICAgfQogICAgICAgIGZpbmFsIGNhbmRpZGF0ZSA9IG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2Rlcyk7CiAgICAgICAgaWYgKHNjb3BlLmlzVW51c2VkKGNhbmRpZGF0ZSkgJiYKICAgICAgICAgICAgIWpzUmVzZXJ2ZWQuY29udGFpbnMoY2FuZGlkYXRlKSAmJgogICAgICAgICAgICAhX2hhc0Jhbm5lZFByZWZpeChjYW5kaWRhdGUpICYmCiAgICAgICAgICAgIChuICE9IDEgfHwgc2NvcGUuaXNTdWdnZXN0aW9uKGNhbmRpZGF0ZSkpKSB7CiAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlOwogICAgICAgIH0KICAgICAgICAvLyBUcnkgYWdhaW4gd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBoYXNoLiAgQWZ0ZXIgYXJvdW5kIDEwIHR1cm5zCiAgICAgICAgLy8gYXJvdW5kIHRoaXMgbG9vcCBoIGlzIHplcm8gYW5kIHdlIHRyeSBhIGxvbmdlciBuYW1lLgogICAgICAgIGggfi89IDc7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfYmFkTmFtZShoYXNoLCBzY29wZSk7CiAgfQoKICAvLy8gSW5zdGFuY2UgbWVtYmVycyBzdGFydGluZyB3aXRoIGcgYW5kIHMgYXJlIHJlc2VydmVkIGZvciBnZXR0ZXJzIGFuZAogIC8vLyBzZXR0ZXJzLgogIHN0YXRpYyBib29sIF9oYXNCYW5uZWRQcmVmaXgoU3RyaW5nIG5hbWUpIHsKICAgIGludCBjb2RlID0gbmFtZS5jb2RlVW5pdEF0KDApOwogICAgcmV0dXJuIGNvZGUgPT0gJGcgfHwgY29kZSA9PSAkczsKICB9CgogIGludCBfY2FsY3VsYXRlSGFzaChTdHJpbmcgbmFtZSkgewogICAgaW50IGggPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aDsgaSsrKSB7CiAgICAgIGggKz0gbmFtZS5jb2RlVW5pdEF0KGkpOwogICAgICBoICY9IDB4ZmZmZmZmZmY7CiAgICAgIGggKz0gaCA8PCAxMDsKICAgICAgaCAmPSAweGZmZmZmZmZmOwogICAgICBoIF49IGggPj4gNjsKICAgICAgaCAmPSAweGZmZmZmZmZmOwogICAgfQogICAgcmV0dXJuIGg7CiAgfQoKICAvLy8gUmVtZW1iZXIgYmFkIGhhc2hlcyB0byBhdm9pZCB1c2luZyBhIHRoZSBzYW1lIGNoYXJhY3RlciB3aXRoIGxvbmcgbnVtYmVycwogIC8vLyBmb3IgZnJlcXVlbnQgaGFzaGVzLiBGb3IgZXhhbXBsZSwgYGNsb3N1cmVgIGlzIGEgdmVyeSBjb21tb24gbmFtZS4KICBNYXA8aW50LCBpbnQ+IF9iYWROYW1lcyA9IG5ldyBNYXA8aW50LCBpbnQ+KCk7CgogIC8vLyBJZiB3ZSBjYW4ndCBmaW5kIGEgaGFzaCBiYXNlZCBuYW1lIGluIHRoZSB0aHJlZS1sZXR0ZXIgc3BhY2UsIHRoZW4gYmFzZQogIC8vLyB0aGUgbmFtZSBvbiBhIGxldHRlciBhbmQgYSBjb3VudGVyLgogIFN0cmluZyBfYmFkTmFtZShpbnQgaGFzaCwgTmFtaW5nU2NvcGUgc2NvcGUpIHsKICAgIGludCBjb3VudCA9IF9iYWROYW1lcy5wdXRJZkFic2VudChoYXNoLCAoKSA9PiAwKTsKICAgIFN0cmluZyBzdGFydExldHRlciA9CiAgICAgICAgbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKFtfbGV0dGVyTnVtYmVyKGhhc2ggKyBjb3VudCldKTsKICAgIF9iYWROYW1lc1toYXNoXSA9IGNvdW50ICsgMTsKICAgIFN0cmluZyBuYW1lOwogICAgaW50IGkgPSAwOwogICAgZG8gewogICAgICBuYW1lID0gIiRzdGFydExldHRlciR7aSsrfSI7CiAgICB9IHdoaWxlIChzY29wZS5pc1VzZWQobmFtZSkpOwogICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgYmFubmVkIHByZWZpeCBiZWNhdXNlIHRoZSBuYW1lIGlzIGluIHRoZSBmb3JtCiAgICAvLyB4bm5uLCB3aGVyZSBubm4gaXMgYSBudW1iZXIuICBUaGVyZSBjYW4gYmUgbm8gZ2V0dGVyIG9yIHNldHRlciBjYWxsZWQKICAgIC8vIGdubm4gc2luY2UgdGhhdCB3b3VsZCBpbXBseSBhIG51bWVyaWMgZmllbGQgbmFtZS4KICAgIHJldHVybiBuYW1lOwogIH0KCiAgaW50IF9sZXR0ZXJOdW1iZXIoaW50IHgpIHsKICAgIGlmICh4ID49IEFMUEhBQkVUX0NIQVJBQ1RFUlMpIHggJT0gQUxQSEFCRVRfQ0hBUkFDVEVSUzsKICAgIGlmICh4IDwgMjYpIHJldHVybiAkYSArIHg7CiAgICByZXR1cm4gJEEgKyB4IC0gMjY7CiAgfQoKICBpbnQgX2FscGhhTnVtZXJpY051bWJlcihpbnQgeCkgewogICAgaWYgKHggPj0gQUxQSEFOVU1FUklDX0NIQVJBQ1RFUlMpIHggJT0gQUxQSEFOVU1FUklDX0NIQVJBQ1RFUlM7CiAgICBpZiAoeCA8IDI2KSByZXR1cm4gJGEgKyB4OwogICAgaWYgKHggPCA1MikgcmV0dXJuICRBICsgeCAtIDI2OwogICAgcmV0dXJuICQwICsgeCAtIDUyOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuTmFtZSBpbnN0YW5jZUZpZWxkUHJvcGVydHlOYW1lKEZpZWxkRW50aXR5IGVsZW1lbnQpIHsKICAgIGpzQXN0Lk5hbWUgcHJvcG9zZWQgPSBfbWluaWZpZWRJbnN0YW5jZUZpZWxkUHJvcGVydHlOYW1lKGVsZW1lbnQpOwogICAgaWYgKHByb3Bvc2VkICE9IG51bGwpIHsKICAgICAgcmV0dXJuIHByb3Bvc2VkOwogICAgfQogICAgcmV0dXJuIHN1cGVyLmluc3RhbmNlRmllbGRQcm9wZXJ0eU5hbWUoZWxlbWVudCk7CiAgfQp9CgovLy8gSW1wbGVtZW50cyBuYW1pbmcgZm9yIGNvbnN0cnVjdG9yIGJvZGllcy4KLy8vCi8vLyBDb25zdHJ1Y3RvciBib2RpZXMgYXJlIG9ubHkgY2FsbGVkIGluIHNldHRpbmdzIHdoZXJlIHRoZSB0YXJnZXQgaXMKLy8vIHN0YXRpY2FsbHkga25vd24uIFRoZXJlZm9yZSwgd2UgY2FuIHNoYXJlIHRoZWlyIG5hbWVzIGJldHdlZW4gY2xhc3Nlcy4KLy8vIEhvd2V2ZXIsIHRvIHN1cHBvcnQgY2FsbGluZyB0aGUgY29uc3RydWN0b3IgYm9keSBvZiBhIHN1cGVyIGNvbnN0cnVjdG9yLAovLy8gZWFjaCBsZXZlbCBpbiB0aGUgaW5oZXJpdGFuY2UgdHJlZSBoYXMgdG8gdXNlIGl0cyBvd24gbmFtZXMuCi8vLwovLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgbmFtaW5nIHNjaGVtZSBieSBjb3VudGluZyB0aGUgZGlzdGFuY2UgZnJvbQovLy8gYSBnaXZlbiBjb25zdHJ1Y3RvciB0byBbT2JqZWN0XSwgd2hlcmUgZGlzdGFuY2UgaXMgdGhlIG51bWJlciBvZgovLy8gY29uc3RydWN0b3JzIGRlY2xhcmVkIGFsb25nIHRoZSBpbmhlcml0YW5jZSBjaGFpbi4KY2xhc3MgX0NvbnN0cnVjdG9yQm9keU5hbWluZ1Njb3BlIHsKICBmaW5hbCBpbnQgX3N0YXJ0SW5kZXg7CiAgZmluYWwgTGlzdDxDb25zdHJ1Y3RvckVudGl0eT4gX2NvbnN0cnVjdG9yczsKICBpbnQgZ2V0IG51bWJlck9mQ29uc3RydWN0b3JzID0+IF9jb25zdHJ1Y3RvcnMubGVuZ3RoOwoKICBfQ29uc3RydWN0b3JCb2R5TmFtaW5nU2NvcGUucm9vdFNjb3BlKAogICAgICBDbGFzc0VudGl0eSBjbHMsIEVsZW1lbnRFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKICAgICAgOiBfc3RhcnRJbmRleCA9IDAsCiAgICAgICAgX2NvbnN0cnVjdG9ycyA9IF9nZXRDb25zdHJ1Y3Rvckxpc3QoY2xzLCBlbnZpcm9ubWVudCk7CgogIF9Db25zdHJ1Y3RvckJvZHlOYW1pbmdTY29wZS5mb3JDbGFzcyhDbGFzc0VudGl0eSBjbHMsCiAgICAgIF9Db25zdHJ1Y3RvckJvZHlOYW1pbmdTY29wZSBzdXBlclNjb3BlLCBFbGVtZW50RW52aXJvbm1lbnQgZW52aXJvbm1lbnQpCiAgICAgIDogX3N0YXJ0SW5kZXggPSBzdXBlclNjb3BlLl9zdGFydEluZGV4ICsgc3VwZXJTY29wZS5udW1iZXJPZkNvbnN0cnVjdG9ycywKICAgICAgICBfY29uc3RydWN0b3JzID0gX2dldENvbnN0cnVjdG9yTGlzdChjbHMsIGVudmlyb25tZW50KTsKCiAgLy8gTWl4aW4gQXBwbGljYXRpb25zIGhhdmUgY29uc3RydWN0b3JzIGJ1dCB3ZSBuZXZlciBnZW5lcmF0ZSBjb2RlIGZvciB0aGVtLAogIC8vIHNvIHRoZXkgZG8gbm90IGNvdW50IGluIHRoZSBpbmhlcml0YW5jZSBjaGFpbi4KICBfQ29uc3RydWN0b3JCb2R5TmFtaW5nU2NvcGUuZm9yTWl4aW5BcHBsaWNhdGlvbigKICAgICAgQ2xhc3NFbnRpdHkgY2xzLCBfQ29uc3RydWN0b3JCb2R5TmFtaW5nU2NvcGUgc3VwZXJTY29wZSkKICAgICAgOiBfc3RhcnRJbmRleCA9IHN1cGVyU2NvcGUuX3N0YXJ0SW5kZXggKyBzdXBlclNjb3BlLm51bWJlck9mQ29uc3RydWN0b3JzLAogICAgICAgIF9jb25zdHJ1Y3RvcnMgPSBjb25zdCBbXTsKCiAgZmFjdG9yeSBfQ29uc3RydWN0b3JCb2R5TmFtaW5nU2NvcGUoCiAgICAgIENsYXNzRW50aXR5IGNscywKICAgICAgTWFwPENsYXNzRW50aXR5LCBfQ29uc3RydWN0b3JCb2R5TmFtaW5nU2NvcGU+IHJlZ2lzdHJ5LAogICAgICBFbGVtZW50RW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIHJldHVybiByZWdpc3RyeS5wdXRJZkFic2VudChjbHMsICgpIHsKICAgICAgQ2xhc3NFbnRpdHkgc3VwZXJjbGFzcyA9IGVudmlyb25tZW50LmdldFN1cGVyQ2xhc3MoY2xzKTsKICAgICAgaWYgKHN1cGVyY2xhc3MgPT0gbnVsbCkgewogICAgICAgIHJldHVybiBuZXcgX0NvbnN0cnVjdG9yQm9keU5hbWluZ1Njb3BlLnJvb3RTY29wZShjbHMsIGVudmlyb25tZW50KTsKICAgICAgfSBlbHNlIGlmIChlbnZpcm9ubWVudC5pc01peGluQXBwbGljYXRpb24oY2xzKSkgewogICAgICAgIHJldHVybiBuZXcgX0NvbnN0cnVjdG9yQm9keU5hbWluZ1Njb3BlLmZvck1peGluQXBwbGljYXRpb24oY2xzLAogICAgICAgICAgICBuZXcgX0NvbnN0cnVjdG9yQm9keU5hbWluZ1Njb3BlKHN1cGVyY2xhc3MsIHJlZ2lzdHJ5LCBlbnZpcm9ubWVudCkpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBuZXcgX0NvbnN0cnVjdG9yQm9keU5hbWluZ1Njb3BlLmZvckNsYXNzKAogICAgICAgICAgICBjbHMsCiAgICAgICAgICAgIG5ldyBfQ29uc3RydWN0b3JCb2R5TmFtaW5nU2NvcGUoc3VwZXJjbGFzcywgcmVnaXN0cnksIGVudmlyb25tZW50KSwKICAgICAgICAgICAgZW52aXJvbm1lbnQpOwogICAgICB9CiAgICB9KTsKICB9CgogIFN0cmluZyBjb25zdHJ1Y3RvckJvZHlLZXlGb3IoQ29uc3RydWN0b3JCb2R5RW50aXR5IGJvZHkpIHsKICAgIGludCBwb3NpdGlvbiA9IF9jb25zdHJ1Y3RvcnMuaW5kZXhPZihib2R5LmNvbnN0cnVjdG9yKTsKICAgIGFzc2VydChwb3NpdGlvbiA+PSAwLCBmYWlsZWRBdChib2R5LCAiY29uc3RydWN0b3IgYm9keSBtaXNzaW5nIikpOwogICAgcmV0dXJuICJAY29uc3RydWN0b3JCb2R5QCR7X3N0YXJ0SW5kZXggKyBwb3NpdGlvbn0iOwogIH0KCiAgc3RhdGljIExpc3Q8Q29uc3RydWN0b3JFbnRpdHk+IF9nZXRDb25zdHJ1Y3Rvckxpc3QoCiAgICAgIENsYXNzRW50aXR5IGNscywgRWxlbWVudEVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICB2YXIgcmVzdWx0ID0gPENvbnN0cnVjdG9yRW50aXR5PltdOwogICAgZW52aXJvbm1lbnQuZm9yRWFjaENvbnN0cnVjdG9yKGNscywgcmVzdWx0LmFkZCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgX01pbmlmeUNvbnN0cnVjdG9yQm9keU5hbWVyIGltcGxlbWVudHMgTmFtZXIgewogIE1hcDxDbGFzc0VudGl0eSwgX0NvbnN0cnVjdG9yQm9keU5hbWluZ1Njb3BlPiBfY29uc3RydWN0b3JCb2R5U2NvcGVzID0KICAgICAgbmV3IE1hcDxDbGFzc0VudGl0eSwgX0NvbnN0cnVjdG9yQm9keU5hbWluZ1Njb3BlPigpOwoKICBAb3ZlcnJpZGUKICBqc0FzdC5OYW1lIGNvbnN0cnVjdG9yQm9keU5hbWUoQ29uc3RydWN0b3JCb2R5RW50aXR5IG1ldGhvZCkgewogICAgX0NvbnN0cnVjdG9yQm9keU5hbWluZ1Njb3BlIHNjb3BlID0gbmV3IF9Db25zdHJ1Y3RvckJvZHlOYW1pbmdTY29wZSgKICAgICAgICBtZXRob2QuZW5jbG9zaW5nQ2xhc3MsIF9jb25zdHJ1Y3RvckJvZHlTY29wZXMsIGVsZW1lbnRFbnZpcm9ubWVudCk7CiAgICBTdHJpbmcga2V5ID0gc2NvcGUuY29uc3RydWN0b3JCb2R5S2V5Rm9yKG1ldGhvZCk7CiAgICByZXR1cm4gX2Rpc2FtYmlndWF0ZU1lbWJlckJ5S2V5KAogICAgICAgIGtleSwgKCkgPT4gX3Byb3Bvc2VOYW1lRm9yQ29uc3RydWN0b3JCb2R5KG1ldGhvZCkpOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgX01pbmlmaWVkT25lU2hvdEludGVyY2VwdG9yTmFtZXIgaW1wbGVtZW50cyBOYW1lciB7CiAgLy8vIFByb3BlcnR5IG5hbWUgdXNlZCBmb3IgdGhlIG9uZS1zaG90IGludGVyY2VwdG9yIG1ldGhvZCBmb3IgdGhlIGdpdmVuCiAgLy8vIFtzZWxlY3Rvcl0gYW5kIHJldHVybi10eXBlIHNwZWNpYWxpemF0aW9uLgogIEBvdmVycmlkZQogIGpzQXN0Lk5hbWUgbmFtZUZvckdldE9uZVNob3RJbnRlcmNlcHRvcigKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBjbGFzc2VzKSB7CiAgICBTdHJpbmcgcm9vdCA9IHNlbGVjdG9yLmlzT3BlcmF0b3IKICAgICAgICA/IG9wZXJhdG9yTmFtZVRvSWRlbnRpZmllcihzZWxlY3Rvci5uYW1lKQogICAgICAgIDogcHJpdmF0ZU5hbWUoc2VsZWN0b3IubWVtYmVyTmFtZSk7CiAgICBTdHJpbmcgcHJlZml4ID0KICAgICAgICBzZWxlY3Rvci5pc0dldHRlciA/IHIiJGdldCIgOiBzZWxlY3Rvci5pc1NldHRlciA/IHIiJHNldCIgOiAiIjsKICAgIFN0cmluZyBjYWxsU3VmZml4ID0gc2VsZWN0b3IuaXNDYWxsCiAgICAgICAgPyBOYW1lci5jYWxsU3VmZml4Rm9yU3RydWN0dXJlKHNlbGVjdG9yLmNhbGxTdHJ1Y3R1cmUpLmpvaW4oKQogICAgICAgIDogIiI7CiAgICBTdHJpbmcgc3VmZml4ID0gc3VmZml4Rm9yR2V0SW50ZXJjZXB0b3IoY2xhc3Nlcyk7CiAgICBTdHJpbmcgZnVsbE5hbWUgPSAiXCRpbnRlcmNlcHRlZCRwcmVmaXhcJCRyb290JGNhbGxTdWZmaXhcJCRzdWZmaXgiOwogICAgcmV0dXJuIF9kaXNhbWJpZ3VhdGVJbnRlcm5hbEdsb2JhbChmdWxsTmFtZSk7CiAgfQp9CoGmAE5OPAEaAU8gCR0lK1EyGzQEAQwmAQwhDCsMIQEMIwwjDEgMKAwoDCgMLgwqDCkMMgEtNAFOTwZQUQxNThY5PB4NNwYiFgQBSEtMGEg7EUxGEUpKSkpDEUxMTExMTExMTEw7BQEfNR1JKToIJ1BNSR0kNggGAUROTE0ROw8QDw4SDw4OERQPEhMRDg4ODhUPDRIPDxARDxAQEBkPDw8PDxAUCAE5ERcODBAcEQ8PDg4ODg4OGRcSFhoODw4SDxktLw4bExMSIREdGwgEAU4UEycLGSQwQiopBgQBS01NQUItOkMBS1BRTjkjFBczKyYuKgo7KS8sORwKTEARCAYiBAFKDy4jJQQBJA8sHxcUFxMXBg4EAVBJMQFOKjE2GUEhEQ8JIyJQTTkRBAEdPB8YBAEjRB8kGAQBDD5HHBcGNQQCAS4ER0tNQQRIRTckGS84ASk3GT8BOE5QPwFPNDM/UCIBJxc+KCo/IEw4SFEPORFQGggIBAE9PEc5BAE2OSg1EwQCAT5JOwEMQUlMNiU8BAIBQ0sxDCs6JjIsFEgoRg42STIEAgExcGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9taW5pZnlfbmFtZXIuZGFydDlzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL25hbWVyX25hbWVzLmRhcnSamS8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGpzX2JhY2tlbmQubmFtZXI7CgovLyBpZ25vcmU6IFNUUk9OR19NT0RFX0lOVkFMSURfTUVUSE9EX09WRVJSSURFX0ZST01fQkFTRQphYnN0cmFjdCBjbGFzcyBfTmFtZXJOYW1lIGV4dGVuZHMganNBc3QuTmFtZSB7CiAgaW50IGdldCBfa2luZDsKICBfTmFtZXJOYW1lIGdldCBfdGFyZ2V0ID0+IHRoaXM7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIGlmIChERUJVR19NT0RFKSB7CiAgICAgIHJldHVybiAnTmFtZSgka2V5KSc7CiAgICB9CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGNvbnZlcnQgYSBuYW1lIHRvIGEgc3RyaW5nIik7CiAgfQp9CgplbnVtIF9OYW1lck5hbWVLaW5kcyB7IFN0cmluZ0JhY2tlZCwgR2V0dGVyLCBTZXR0ZXIsIEFzeW5jLCBDb21wb3VuZCwgVG9rZW4gfQoKLy8gaWdub3JlOiBTVFJPTkdfTU9ERV9JTlZBTElEX01FVEhPRF9PVkVSUklERV9GUk9NX0JBU0UKY2xhc3MgU3RyaW5nQmFja2VkTmFtZSBleHRlbmRzIF9OYW1lck5hbWUgewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lOwogIEBvdmVycmlkZQogIGludCBnZXQgX2tpbmQgPT4gX05hbWVyTmFtZUtpbmRzLlN0cmluZ0JhY2tlZC5pbmRleDsKCiAgU3RyaW5nQmFja2VkTmFtZSh0aGlzLm5hbWUpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGtleSA9PiBuYW1lOwoKICBAb3ZlcnJpZGUKICBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKG90aGVyIGlzIF9OYW1lUmVmZXJlbmNlKSBvdGhlciA9IG90aGVyLl90YXJnZXQ7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gKG90aGVyIGlzIFN0cmluZ0JhY2tlZE5hbWUpICYmIG90aGVyLm5hbWUgPT0gbmFtZTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gbmFtZS5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgaW50IGNvbXBhcmVUbyhjb3ZhcmlhbnQgX05hbWVyTmFtZSBvdGhlcikgewogICAgb3RoZXIgPSBvdGhlci5fdGFyZ2V0OwogICAgaWYgKG90aGVyLl9raW5kICE9IF9raW5kKSByZXR1cm4gb3RoZXIuX2tpbmQgLSBfa2luZDsKICAgIHJldHVybiBuYW1lLmNvbXBhcmVUbyhvdGhlci5uYW1lKTsKICB9Cn0KCi8vIGlnbm9yZTogU1RST05HX01PREVfSU5WQUxJRF9NRVRIT0RfT1ZFUlJJREVfRlJPTV9CQVNFCmFic3RyYWN0IGNsYXNzIF9QcmVmaXhlZE5hbWUgZXh0ZW5kcyBfTmFtZXJOYW1lIGltcGxlbWVudHMganNBc3QuQXN0Q29udGFpbmVyIHsKICBmaW5hbCBqc0FzdC5OYW1lIHByZWZpeDsKICBmaW5hbCBqc0FzdC5OYW1lIGJhc2U7CiAgQG92ZXJyaWRlCiAgaW50IGdldCBfa2luZDsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8anNBc3QuTm9kZT4gZ2V0IGNvbnRhaW5lZE5vZGVzID0+IFtwcmVmaXgsIGJhc2VdOwoKICBfUHJlZml4ZWROYW1lKHRoaXMucHJlZml4LCB0aGlzLmJhc2UpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IG5hbWUgPT4gcHJlZml4Lm5hbWUgKyBiYXNlLm5hbWU7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQga2V5ID0+IHByZWZpeC5rZXkgKyBiYXNlLmtleTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKG90aGVyIGlzIF9OYW1lUmVmZXJlbmNlKSBvdGhlciA9IG90aGVyLl90YXJnZXQ7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIF9QcmVmaXhlZE5hbWUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBvdGhlci5iYXNlID09IGJhc2UgJiYgb3RoZXIucHJlZml4ID09IHByZWZpeDsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gYmFzZS5oYXNoQ29kZSAqIDEzICsgcHJlZml4Lmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBpbnQgY29tcGFyZVRvKGNvdmFyaWFudCBfTmFtZXJOYW1lIG90aGVyKSB7CiAgICBvdGhlciA9IG90aGVyLl90YXJnZXQ7CiAgICBpZiAob3RoZXIuX2tpbmQgIT0gX2tpbmQpIHJldHVybiBvdGhlci5fa2luZCAtIF9raW5kOwogICAgX1ByZWZpeGVkTmFtZSBvdGhlclNhbWVLaW5kID0gb3RoZXI7CiAgICBpbnQgcmVzdWx0ID0gcHJlZml4LmNvbXBhcmVUbyhvdGhlclNhbWVLaW5kLnByZWZpeCk7CiAgICBpZiAocmVzdWx0ID09IDApIHsKICAgICAgcmVzdWx0ID0gcHJlZml4LmNvbXBhcmVUbyhvdGhlclNhbWVLaW5kLnByZWZpeCk7CiAgICAgIGlmIChyZXN1bHQgPT0gMCkgewogICAgICAgIHJlc3VsdCA9IGJhc2UuY29tcGFyZVRvKG90aGVyU2FtZUtpbmQuYmFzZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CgovLyBpZ25vcmU6IFNUUk9OR19NT0RFX0lOVkFMSURfTUVUSE9EX09WRVJSSURFX0ZST01fQkFTRQpjbGFzcyBHZXR0ZXJOYW1lIGV4dGVuZHMgX1ByZWZpeGVkTmFtZSB7CiAgQG92ZXJyaWRlCiAgaW50IGdldCBfa2luZCA9PiBfTmFtZXJOYW1lS2luZHMuR2V0dGVyLmluZGV4OwoKICBHZXR0ZXJOYW1lKGpzQXN0Lk5hbWUgcHJlZml4LCBqc0FzdC5OYW1lIGJhc2UpIDogc3VwZXIocHJlZml4LCBiYXNlKTsKfQoKLy8gaWdub3JlOiBTVFJPTkdfTU9ERV9JTlZBTElEX01FVEhPRF9PVkVSUklERV9GUk9NX0JBU0UKY2xhc3MgU2V0dGVyTmFtZSBleHRlbmRzIF9QcmVmaXhlZE5hbWUgewogIEBvdmVycmlkZQogIGludCBnZXQgX2tpbmQgPT4gX05hbWVyTmFtZUtpbmRzLlNldHRlci5pbmRleDsKCiAgU2V0dGVyTmFtZShqc0FzdC5OYW1lIHByZWZpeCwganNBc3QuTmFtZSBiYXNlKSA6IHN1cGVyKHByZWZpeCwgYmFzZSk7Cn0KCi8vIGlnbm9yZTogU1RST05HX01PREVfSU5WQUxJRF9NRVRIT0RfT1ZFUlJJREVfRlJPTV9CQVNFCmNsYXNzIF9Bc3luY05hbWUgZXh0ZW5kcyBfUHJlZml4ZWROYW1lIHsKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IF9raW5kID0+IF9OYW1lck5hbWVLaW5kcy5Bc3luYy5pbmRleDsKCiAgX0FzeW5jTmFtZShqc0FzdC5OYW1lIHByZWZpeCwganNBc3QuTmFtZSBiYXNlKSA6IHN1cGVyKHByZWZpeCwgYmFzZSk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGFsbG93UmVuYW1lID0+IHRydWU7Cn0KCi8vIGlnbm9yZTogU1RST05HX01PREVfSU5WQUxJRF9NRVRIT0RfT1ZFUlJJREVfRlJPTV9CQVNFCmNsYXNzIENvbXBvdW5kTmFtZSBleHRlbmRzIF9OYW1lck5hbWUgaW1wbGVtZW50cyBqc0FzdC5Bc3RDb250YWluZXIgewogIGZpbmFsIExpc3Q8X05hbWVyTmFtZT4gX3BhcnRzOwogIEBvdmVycmlkZQogIGludCBnZXQgX2tpbmQgPT4gX05hbWVyTmFtZUtpbmRzLkNvbXBvdW5kLmluZGV4OwogIFN0cmluZyBfY2FjaGVkTmFtZTsKICBpbnQgX2NhY2hlZEhhc2hDb2RlID0gLTE7CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPGpzQXN0Lk5vZGU+IGdldCBjb250YWluZWROb2RlcyA9PiBfcGFydHM7CgogIENvbXBvdW5kTmFtZSh0aGlzLl9wYXJ0cyk7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgbmFtZSB7CiAgICBpZiAoX2NhY2hlZE5hbWUgPT0gbnVsbCkgewogICAgICBfY2FjaGVkTmFtZSA9IF9wYXJ0cy5tYXAoKGpzQXN0Lk5hbWUgbmFtZSkgPT4gbmFtZS5uYW1lKS5qb2luKCk7CiAgICB9CiAgICByZXR1cm4gX2NhY2hlZE5hbWU7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGtleSA9PiBfcGFydHMubWFwKChfTmFtZXJOYW1lIG5hbWUpID0+IG5hbWUua2V5KS5qb2luKCk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyBfTmFtZVJlZmVyZW5jZSkgb3RoZXIgPSBvdGhlci5fdGFyZ2V0OwogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzISBDb21wb3VuZE5hbWUpIHJldHVybiBmYWxzZTsKICAgIGlmIChvdGhlci5fcGFydHMubGVuZ3RoICE9IF9wYXJ0cy5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3BhcnRzLmxlbmd0aDsgKytpKSB7CiAgICAgIGlmIChvdGhlci5fcGFydHNbaV0gIT0gX3BhcnRzW2ldKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgewogICAgaWYgKF9jYWNoZWRIYXNoQ29kZSA8IDApIHsKICAgICAgX2NhY2hlZEhhc2hDb2RlID0gMDsKICAgICAgZm9yIChqc0FzdC5OYW1lIG5hbWUgaW4gX3BhcnRzKSB7CiAgICAgICAgX2NhY2hlZEhhc2hDb2RlID0gKF9jYWNoZWRIYXNoQ29kZSAqIDE3ICsgbmFtZS5oYXNoQ29kZSkgJiAweDdmZmZmZmZmOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gX2NhY2hlZEhhc2hDb2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGNvbXBhcmVUbyhjb3ZhcmlhbnQgX05hbWVyTmFtZSBvdGhlcikgewogICAgb3RoZXIgPSBvdGhlci5fdGFyZ2V0OwogICAgaWYgKG90aGVyLl9raW5kICE9IF9raW5kKSByZXR1cm4gb3RoZXIuX2tpbmQgLSBfa2luZDsKICAgIENvbXBvdW5kTmFtZSBvdGhlclNhbWVLaW5kID0gb3RoZXI7CiAgICBpZiAob3RoZXJTYW1lS2luZC5fcGFydHMubGVuZ3RoICE9IF9wYXJ0cy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIG90aGVyU2FtZUtpbmQuX3BhcnRzLmxlbmd0aCAtIF9wYXJ0cy5sZW5ndGg7CiAgICB9CiAgICBpbnQgcmVzdWx0ID0gMDsKICAgIGZvciAoaW50IHBvcyA9IDA7IHJlc3VsdCA9PSAwICYmIHBvcyA8IF9wYXJ0cy5sZW5ndGg7IHBvcysrKSB7CiAgICAgIHJlc3VsdCA9IF9wYXJ0c1twb3NdLmNvbXBhcmVUbyhvdGhlclNhbWVLaW5kLl9wYXJ0c1twb3NdKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CgovLyBpZ25vcmU6IFNUUk9OR19NT0RFX0lOVkFMSURfTUVUSE9EX09WRVJSSURFX0ZST01fQkFTRQpjbGFzcyBUb2tlbk5hbWUgZXh0ZW5kcyBfTmFtZXJOYW1lIGltcGxlbWVudHMganNBc3QuUmVmZXJlbmNlQ291bnRlZEFzdE5vZGUgewogIEBvdmVycmlkZQogIGludCBnZXQgX2tpbmQgPT4gX05hbWVyTmFtZUtpbmRzLlRva2VuLmluZGV4OwogIFN0cmluZyBfbmFtZTsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcga2V5OwogIGZpbmFsIFRva2VuU2NvcGUgX3Njb3BlOwogIGludCBfcmMgPSAwOwoKICBUb2tlbk5hbWUodGhpcy5fc2NvcGUsIHRoaXMua2V5KTsKCiAgYm9vbCBnZXQgaXNGaW5hbGl6ZWQgPT4gX25hbWUgIT0gbnVsbDsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lIHsKICAgIGFzc2VydChpc0ZpbmFsaXplZCk7CiAgICByZXR1cm4gX25hbWU7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgY29tcGFyZVRvKGNvdmFyaWFudCBfTmFtZXJOYW1lIG90aGVyKSB7CiAgICBvdGhlciA9IG90aGVyLl90YXJnZXQ7CiAgICBpZiAob3RoZXIuX2tpbmQgIT0gX2tpbmQpIHJldHVybiBvdGhlci5fa2luZCAtIF9raW5kOwogICAgVG9rZW5OYW1lIG90aGVyVG9rZW4gPSBvdGhlcjsKICAgIHJldHVybiBrZXkuY29tcGFyZVRvKG90aGVyVG9rZW4ua2V5KTsKICB9CgogIEBvdmVycmlkZQogIG1hcmtTZWVuKGpzQXN0LlRva2VuQ291bnRlciBjb3VudGVyKSA9PiBfcmMrKzsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKG90aGVyIGlzIF9OYW1lUmVmZXJlbmNlKSBvdGhlciA9IG90aGVyLl90YXJnZXQ7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHN1cGVyLmhhc2hDb2RlOwoKICBmaW5hbGl6ZSgpIHsKICAgIGFzc2VydCgKICAgICAgICAhaXNGaW5hbGl6ZWQsCiAgICAgICAgZmFpbGVkQXQoTk9fTE9DQVRJT05fU1BBTk5BQkxFLAogICAgICAgICAgICAiVG9rZW5OYW1lKCRrZXkpPSRfbmFtZSBoYXMgYWxyZWFkeSBiZWVuIGZpbmFsaXplZC4iKSk7CiAgICBfbmFtZSA9IF9zY29wZS5nZXROZXh0TmFtZSgpOwogIH0KfQoKLy8gaWdub3JlOiBTVFJPTkdfTU9ERV9JTlZBTElEX01FVEhPRF9PVkVSUklERV9GUk9NX0JBU0UKY2xhc3MgX05hbWVSZWZlcmVuY2UgZXh0ZW5kcyBfTmFtZXJOYW1lIGltcGxlbWVudHMganNBc3QuQXN0Q29udGFpbmVyIHsKICBAb3ZlcnJpZGUKICBfTmFtZXJOYW1lIF90YXJnZXQ7CgogIEBvdmVycmlkZQogIGludCBnZXQgX2tpbmQgPT4gX3RhcmdldC5fa2luZDsKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGtleSA9PiBfdGFyZ2V0LmtleTsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8anNBc3QuTm9kZT4gZ2V0IGNvbnRhaW5lZE5vZGVzID0+IFtfdGFyZ2V0XTsKCiAgX05hbWVSZWZlcmVuY2UodGhpcy5fdGFyZ2V0KTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+IF90YXJnZXQubmFtZTsKCiAgQG92ZXJyaWRlCiAgaW50IGNvbXBhcmVUbyhjb3ZhcmlhbnQgX05hbWVyTmFtZSBvdGhlcikgPT4gX3RhcmdldC5jb21wYXJlVG8ob3RoZXIpOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSA9PiBfdGFyZ2V0ID09IG90aGVyOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IF90YXJnZXQuaGFzaENvZGU7Cn0KgQoATk48ARoBOS8RIgEMFhYbBkUEAgFOATksDBUMNwEfAQwaAQwXOC0+BAEMJQEMLhs6JwQCATlQGxkMEQEMPQEpAQwuAQwrAQwcOC0vOQQBDDwBDC4bOik5FzcZNQgGEwQCATkpDDEBSAIBOSkMMQFIAgE5KQwwAUgBDCACATlGIQwzFhwBDDUBHQEMFB9HBhgEAQxGAQwcOC0uPC42BhEEAQwVHxsoTwgGHAQBDC4bOig4OgYUQ0EGEwQCATlODDAQDBQbDwEkASkBDBQZEgQBDC4bOiIqBAEMMQEMHDgtEgQBDCYBDwwWKEQiBAIBOUgMFgEMIgwhAQw4ASABDCMBDEkBDC8BDCgCATBwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL25hbWVyX25hbWVzLmRhcnQmc2Rrcm9vdDovcGtnL2pzX2FzdC9saWIvc3JjL25vZGVzLmRhcnTAAOq6Ly8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YganNfYXN0OwoKYWJzdHJhY3QgY2xhc3MgTm9kZVZpc2l0b3I8VD4gewogIFQgdmlzaXRQcm9ncmFtKFByb2dyYW0gbm9kZSk7CgogIFQgdmlzaXRCbG9jayhCbG9jayBub2RlKTsKICBUIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpOwogIFQgdmlzaXRFbXB0eVN0YXRlbWVudChFbXB0eVN0YXRlbWVudCBub2RlKTsKICBUIHZpc2l0SWYoSWYgbm9kZSk7CiAgVCB2aXNpdEZvcihGb3Igbm9kZSk7CiAgVCB2aXNpdEZvckluKEZvckluIG5vZGUpOwogIFQgdmlzaXRXaGlsZShXaGlsZSBub2RlKTsKICBUIHZpc2l0RG8oRG8gbm9kZSk7CiAgVCB2aXNpdENvbnRpbnVlKENvbnRpbnVlIG5vZGUpOwogIFQgdmlzaXRCcmVhayhCcmVhayBub2RlKTsKICBUIHZpc2l0UmV0dXJuKFJldHVybiBub2RlKTsKICBUIHZpc2l0VGhyb3coVGhyb3cgbm9kZSk7CiAgVCB2aXNpdFRyeShUcnkgbm9kZSk7CiAgVCB2aXNpdENhdGNoKENhdGNoIG5vZGUpOwogIFQgdmlzaXRTd2l0Y2goU3dpdGNoIG5vZGUpOwogIFQgdmlzaXRDYXNlKENhc2Ugbm9kZSk7CiAgVCB2aXNpdERlZmF1bHQoRGVmYXVsdCBub2RlKTsKICBUIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpOwogIFQgdmlzaXRMYWJlbGVkU3RhdGVtZW50KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSk7CiAgVCB2aXNpdExpdGVyYWxTdGF0ZW1lbnQoTGl0ZXJhbFN0YXRlbWVudCBub2RlKTsKICBUIHZpc2l0RGFydFlpZWxkKERhcnRZaWVsZCBub2RlKTsKCiAgVCB2aXNpdExpdGVyYWxFeHByZXNzaW9uKExpdGVyYWxFeHByZXNzaW9uIG5vZGUpOwogIFQgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCBub2RlKTsKICBUIHZpc2l0QXNzaWdubWVudChBc3NpZ25tZW50IG5vZGUpOwogIFQgdmlzaXRWYXJpYWJsZUluaXRpYWxpemF0aW9uKFZhcmlhYmxlSW5pdGlhbGl6YXRpb24gbm9kZSk7CiAgVCB2aXNpdENvbmRpdGlvbmFsKENvbmRpdGlvbmFsIGNvbmQpOwogIFQgdmlzaXROZXcoTmV3IG5vZGUpOwogIFQgdmlzaXRDYWxsKENhbGwgbm9kZSk7CiAgVCB2aXNpdEJpbmFyeShCaW5hcnkgbm9kZSk7CiAgVCB2aXNpdFByZWZpeChQcmVmaXggbm9kZSk7CiAgVCB2aXNpdFBvc3RmaXgoUG9zdGZpeCBub2RlKTsKCiAgVCB2aXNpdFZhcmlhYmxlVXNlKFZhcmlhYmxlVXNlIG5vZGUpOwogIFQgdmlzaXRUaGlzKFRoaXMgbm9kZSk7CiAgVCB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKTsKICBUIHZpc2l0UGFyYW1ldGVyKFBhcmFtZXRlciBub2RlKTsKICBUIHZpc2l0QWNjZXNzKFByb3BlcnR5QWNjZXNzIG5vZGUpOwoKICBUIHZpc2l0TmFtZWRGdW5jdGlvbihOYW1lZEZ1bmN0aW9uIG5vZGUpOwogIFQgdmlzaXRGdW4oRnVuIG5vZGUpOwoKICBUIHZpc2l0RGVmZXJyZWRFeHByZXNzaW9uKERlZmVycmVkRXhwcmVzc2lvbiBub2RlKTsKICBUIHZpc2l0RGVmZXJyZWROdW1iZXIoRGVmZXJyZWROdW1iZXIgbm9kZSk7CiAgVCB2aXNpdERlZmVycmVkU3RyaW5nKERlZmVycmVkU3RyaW5nIG5vZGUpOwoKICBUIHZpc2l0TGl0ZXJhbEJvb2woTGl0ZXJhbEJvb2wgbm9kZSk7CiAgVCB2aXNpdExpdGVyYWxTdHJpbmcoTGl0ZXJhbFN0cmluZyBub2RlKTsKICBUIHZpc2l0TGl0ZXJhbE51bWJlcihMaXRlcmFsTnVtYmVyIG5vZGUpOwogIFQgdmlzaXRMaXRlcmFsTnVsbChMaXRlcmFsTnVsbCBub2RlKTsKCiAgVCB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlKTsKCiAgVCB2aXNpdE5hbWUoTmFtZSBub2RlKTsKCiAgVCB2aXNpdFBhcmVudGhlc2VzKFBhcmVudGhlc2VzIG5vZGUpOwoKICBUIHZpc2l0QXJyYXlJbml0aWFsaXplcihBcnJheUluaXRpYWxpemVyIG5vZGUpOwogIFQgdmlzaXRBcnJheUhvbGUoQXJyYXlIb2xlIG5vZGUpOwogIFQgdmlzaXRPYmplY3RJbml0aWFsaXplcihPYmplY3RJbml0aWFsaXplciBub2RlKTsKICBUIHZpc2l0UHJvcGVydHkoUHJvcGVydHkgbm9kZSk7CiAgVCB2aXNpdFJlZ0V4cExpdGVyYWwoUmVnRXhwTGl0ZXJhbCBub2RlKTsKCiAgVCB2aXNpdEF3YWl0KEF3YWl0IG5vZGUpOwoKICBUIHZpc2l0Q29tbWVudChDb21tZW50IG5vZGUpOwoKICBUIHZpc2l0SW50ZXJwb2xhdGVkRXhwcmVzc2lvbihJbnRlcnBvbGF0ZWRFeHByZXNzaW9uIG5vZGUpOwogIFQgdmlzaXRJbnRlcnBvbGF0ZWRMaXRlcmFsKEludGVycG9sYXRlZExpdGVyYWwgbm9kZSk7CiAgVCB2aXNpdEludGVycG9sYXRlZFBhcmFtZXRlcihJbnRlcnBvbGF0ZWRQYXJhbWV0ZXIgbm9kZSk7CiAgVCB2aXNpdEludGVycG9sYXRlZFNlbGVjdG9yKEludGVycG9sYXRlZFNlbGVjdG9yIG5vZGUpOwogIFQgdmlzaXRJbnRlcnBvbGF0ZWRTdGF0ZW1lbnQoSW50ZXJwb2xhdGVkU3RhdGVtZW50IG5vZGUpOwogIFQgdmlzaXRJbnRlcnBvbGF0ZWREZWNsYXJhdGlvbihJbnRlcnBvbGF0ZWREZWNsYXJhdGlvbiBub2RlKTsKfQoKY2xhc3MgQmFzZVZpc2l0b3I8VD4gaW1wbGVtZW50cyBOb2RlVmlzaXRvcjxUPiB7CiAgY29uc3QgQmFzZVZpc2l0b3IoKTsKCiAgVCB2aXNpdE5vZGUoTm9kZSBub2RlKSB7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIFQgdmlzaXRQcm9ncmFtKFByb2dyYW0gbm9kZSkgPT4gdmlzaXROb2RlKG5vZGUpOwoKICBUIHZpc2l0U3RhdGVtZW50KFN0YXRlbWVudCBub2RlKSA9PiB2aXNpdE5vZGUobm9kZSk7CiAgVCB2aXNpdExvb3AoTG9vcCBub2RlKSA9PiB2aXNpdFN0YXRlbWVudChub2RlKTsKICBUIHZpc2l0SnVtcChTdGF0ZW1lbnQgbm9kZSkgPT4gdmlzaXRTdGF0ZW1lbnQobm9kZSk7CgogIFQgdmlzaXRCbG9jayhCbG9jayBub2RlKSA9PiB2aXNpdFN0YXRlbWVudChub2RlKTsKICBUIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpID0+IHZpc2l0U3RhdGVtZW50KG5vZGUpOwogIFQgdmlzaXRFbXB0eVN0YXRlbWVudChFbXB0eVN0YXRlbWVudCBub2RlKSA9PiB2aXNpdFN0YXRlbWVudChub2RlKTsKICBUIHZpc2l0SWYoSWYgbm9kZSkgPT4gdmlzaXRTdGF0ZW1lbnQobm9kZSk7CiAgVCB2aXNpdEZvcihGb3Igbm9kZSkgPT4gdmlzaXRMb29wKG5vZGUpOwogIFQgdmlzaXRGb3JJbihGb3JJbiBub2RlKSA9PiB2aXNpdExvb3Aobm9kZSk7CiAgVCB2aXNpdFdoaWxlKFdoaWxlIG5vZGUpID0+IHZpc2l0TG9vcChub2RlKTsKICBUIHZpc2l0RG8oRG8gbm9kZSkgPT4gdmlzaXRMb29wKG5vZGUpOwogIFQgdmlzaXRDb250aW51ZShDb250aW51ZSBub2RlKSA9PiB2aXNpdEp1bXAobm9kZSk7CiAgVCB2aXNpdEJyZWFrKEJyZWFrIG5vZGUpID0+IHZpc2l0SnVtcChub2RlKTsKICBUIHZpc2l0UmV0dXJuKFJldHVybiBub2RlKSA9PiB2aXNpdEp1bXAobm9kZSk7CiAgVCB2aXNpdFRocm93KFRocm93IG5vZGUpID0+IHZpc2l0SnVtcChub2RlKTsKICBUIHZpc2l0VHJ5KFRyeSBub2RlKSA9PiB2aXNpdFN0YXRlbWVudChub2RlKTsKICBUIHZpc2l0U3dpdGNoKFN3aXRjaCBub2RlKSA9PiB2aXNpdFN0YXRlbWVudChub2RlKTsKICBUIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpID0+IHZpc2l0U3RhdGVtZW50KG5vZGUpOwogIFQgdmlzaXRMYWJlbGVkU3RhdGVtZW50KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgPT4gdmlzaXRTdGF0ZW1lbnQobm9kZSk7CiAgVCB2aXNpdExpdGVyYWxTdGF0ZW1lbnQoTGl0ZXJhbFN0YXRlbWVudCBub2RlKSA9PiB2aXNpdFN0YXRlbWVudChub2RlKTsKCiAgVCB2aXNpdENhdGNoKENhdGNoIG5vZGUpID0+IHZpc2l0Tm9kZShub2RlKTsKICBUIHZpc2l0Q2FzZShDYXNlIG5vZGUpID0+IHZpc2l0Tm9kZShub2RlKTsKICBUIHZpc2l0RGVmYXVsdChEZWZhdWx0IG5vZGUpID0+IHZpc2l0Tm9kZShub2RlKTsKCiAgVCB2aXNpdEV4cHJlc3Npb24oRXhwcmVzc2lvbiBub2RlKSA9PiB2aXNpdE5vZGUobm9kZSk7CiAgVCB2aXNpdFZhcmlhYmxlUmVmZXJlbmNlKFZhcmlhYmxlUmVmZXJlbmNlIG5vZGUpID0+IHZpc2l0RXhwcmVzc2lvbihub2RlKTsKCiAgVCB2aXNpdExpdGVyYWxFeHByZXNzaW9uKExpdGVyYWxFeHByZXNzaW9uIG5vZGUpID0+IHZpc2l0RXhwcmVzc2lvbihub2RlKTsKICBUIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoVmFyaWFibGVEZWNsYXJhdGlvbkxpc3Qgbm9kZSkgPT4KICAgICAgdmlzaXRFeHByZXNzaW9uKG5vZGUpOwogIFQgdmlzaXRBc3NpZ25tZW50KEFzc2lnbm1lbnQgbm9kZSkgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUpOwogIFQgdmlzaXRWYXJpYWJsZUluaXRpYWxpemF0aW9uKFZhcmlhYmxlSW5pdGlhbGl6YXRpb24gbm9kZSkgewogICAgaWYgKG5vZGUudmFsdWUgIT0gbnVsbCkgewogICAgICByZXR1cm4gdmlzaXRBc3NpZ25tZW50KG5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHZpc2l0RXhwcmVzc2lvbihub2RlKTsKICAgIH0KICB9CgogIFQgdmlzaXRDb25kaXRpb25hbChDb25kaXRpb25hbCBub2RlKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSk7CiAgVCB2aXNpdE5ldyhOZXcgbm9kZSkgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUpOwogIFQgdmlzaXRDYWxsKENhbGwgbm9kZSkgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUpOwogIFQgdmlzaXRCaW5hcnkoQmluYXJ5IG5vZGUpID0+IHZpc2l0RXhwcmVzc2lvbihub2RlKTsKICBUIHZpc2l0UHJlZml4KFByZWZpeCBub2RlKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSk7CiAgVCB2aXNpdFBvc3RmaXgoUG9zdGZpeCBub2RlKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSk7CiAgVCB2aXNpdEFjY2VzcyhQcm9wZXJ0eUFjY2VzcyBub2RlKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSk7CgogIFQgdmlzaXRWYXJpYWJsZVVzZShWYXJpYWJsZVVzZSBub2RlKSA9PiB2aXNpdFZhcmlhYmxlUmVmZXJlbmNlKG5vZGUpOwogIFQgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgPT4KICAgICAgdmlzaXRWYXJpYWJsZVJlZmVyZW5jZShub2RlKTsKICBUIHZpc2l0UGFyYW1ldGVyKFBhcmFtZXRlciBub2RlKSA9PiB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24obm9kZSk7CiAgVCB2aXNpdFRoaXMoVGhpcyBub2RlKSA9PiB2aXNpdFBhcmFtZXRlcihub2RlKTsKCiAgVCB2aXNpdE5hbWVkRnVuY3Rpb24oTmFtZWRGdW5jdGlvbiBub2RlKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSk7CiAgVCB2aXNpdEZ1bihGdW4gbm9kZSkgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUpOwoKICBUIHZpc2l0VG9rZW4oRGVmZXJyZWRUb2tlbiBub2RlKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSk7CgogIFQgdmlzaXREZWZlcnJlZEV4cHJlc3Npb24oRGVmZXJyZWRFeHByZXNzaW9uIG5vZGUpID0+IHZpc2l0RXhwcmVzc2lvbihub2RlKTsKICBUIHZpc2l0RGVmZXJyZWROdW1iZXIoRGVmZXJyZWROdW1iZXIgbm9kZSkgPT4gdmlzaXRUb2tlbihub2RlKTsKICBUIHZpc2l0RGVmZXJyZWRTdHJpbmcoRGVmZXJyZWRTdHJpbmcgbm9kZSkgPT4gdmlzaXRUb2tlbihub2RlKTsKCiAgVCB2aXNpdExpdGVyYWwoTGl0ZXJhbCBub2RlKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSk7CgogIFQgdmlzaXRMaXRlcmFsQm9vbChMaXRlcmFsQm9vbCBub2RlKSA9PiB2aXNpdExpdGVyYWwobm9kZSk7CiAgVCB2aXNpdExpdGVyYWxTdHJpbmcoTGl0ZXJhbFN0cmluZyBub2RlKSA9PiB2aXNpdExpdGVyYWwobm9kZSk7CiAgVCB2aXNpdExpdGVyYWxOdW1iZXIoTGl0ZXJhbE51bWJlciBub2RlKSA9PiB2aXNpdExpdGVyYWwobm9kZSk7CiAgVCB2aXNpdExpdGVyYWxOdWxsKExpdGVyYWxOdWxsIG5vZGUpID0+IHZpc2l0TGl0ZXJhbChub2RlKTsKCiAgVCB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlKSA9PiB2aXNpdExpdGVyYWwobm9kZSk7CgogIFQgdmlzaXROYW1lKE5hbWUgbm9kZSkgPT4gdmlzaXROb2RlKG5vZGUpOwoKICBUIHZpc2l0UGFyZW50aGVzZXMoUGFyZW50aGVzZXMgbm9kZSkgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUpOwoKICBUIHZpc2l0QXJyYXlJbml0aWFsaXplcihBcnJheUluaXRpYWxpemVyIG5vZGUpID0+IHZpc2l0RXhwcmVzc2lvbihub2RlKTsKICBUIHZpc2l0QXJyYXlIb2xlKEFycmF5SG9sZSBub2RlKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSk7CiAgVCB2aXNpdE9iamVjdEluaXRpYWxpemVyKE9iamVjdEluaXRpYWxpemVyIG5vZGUpID0+IHZpc2l0RXhwcmVzc2lvbihub2RlKTsKICBUIHZpc2l0UHJvcGVydHkoUHJvcGVydHkgbm9kZSkgPT4gdmlzaXROb2RlKG5vZGUpOwogIFQgdmlzaXRSZWdFeHBMaXRlcmFsKFJlZ0V4cExpdGVyYWwgbm9kZSkgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUpOwoKICBUIHZpc2l0SW50ZXJwb2xhdGVkTm9kZShJbnRlcnBvbGF0ZWROb2RlIG5vZGUpID0+IHZpc2l0Tm9kZShub2RlKTsKCiAgVCB2aXNpdEludGVycG9sYXRlZEV4cHJlc3Npb24oSW50ZXJwb2xhdGVkRXhwcmVzc2lvbiBub2RlKSA9PgogICAgICB2aXNpdEludGVycG9sYXRlZE5vZGUobm9kZSk7CiAgVCB2aXNpdEludGVycG9sYXRlZExpdGVyYWwoSW50ZXJwb2xhdGVkTGl0ZXJhbCBub2RlKSA9PgogICAgICB2aXNpdEludGVycG9sYXRlZE5vZGUobm9kZSk7CiAgVCB2aXNpdEludGVycG9sYXRlZFBhcmFtZXRlcihJbnRlcnBvbGF0ZWRQYXJhbWV0ZXIgbm9kZSkgPT4KICAgICAgdmlzaXRJbnRlcnBvbGF0ZWROb2RlKG5vZGUpOwogIFQgdmlzaXRJbnRlcnBvbGF0ZWRTZWxlY3RvcihJbnRlcnBvbGF0ZWRTZWxlY3RvciBub2RlKSA9PgogICAgICB2aXNpdEludGVycG9sYXRlZE5vZGUobm9kZSk7CiAgVCB2aXNpdEludGVycG9sYXRlZFN0YXRlbWVudChJbnRlcnBvbGF0ZWRTdGF0ZW1lbnQgbm9kZSkgPT4KICAgICAgdmlzaXRJbnRlcnBvbGF0ZWROb2RlKG5vZGUpOwogIFQgdmlzaXRJbnRlcnBvbGF0ZWREZWNsYXJhdGlvbihJbnRlcnBvbGF0ZWREZWNsYXJhdGlvbiBub2RlKSB7CiAgICByZXR1cm4gdmlzaXRJbnRlcnBvbGF0ZWROb2RlKG5vZGUpOwogIH0KCiAgLy8gSWdub3JlIGNvbW1lbnRzIGJ5IGRlZmF1bHQuCiAgVCB2aXNpdENvbW1lbnQoQ29tbWVudCBub2RlKSA9PiBudWxsOwoKICBUIHZpc2l0QXdhaXQoQXdhaXQgbm9kZSkgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUpOwogIFQgdmlzaXREYXJ0WWllbGQoRGFydFlpZWxkIG5vZGUpID0+IHZpc2l0U3RhdGVtZW50KG5vZGUpOwp9CgphYnN0cmFjdCBjbGFzcyBOb2RlVmlzaXRvcjE8UiwgQT4gewogIFIgdmlzaXRQcm9ncmFtKFByb2dyYW0gbm9kZSwgQSBhcmcpOwoKICBSIHZpc2l0QmxvY2soQmxvY2sgbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRFbXB0eVN0YXRlbWVudChFbXB0eVN0YXRlbWVudCBub2RlLCBBIGFyZyk7CiAgUiB2aXNpdElmKElmIG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0Rm9yKEZvciBub2RlLCBBIGFyZyk7CiAgUiB2aXNpdEZvckluKEZvckluIG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0V2hpbGUoV2hpbGUgbm9kZSwgQSBhcmcpOwogIFIgdmlzaXREbyhEbyBub2RlLCBBIGFyZyk7CiAgUiB2aXNpdENvbnRpbnVlKENvbnRpbnVlIG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0QnJlYWsoQnJlYWsgbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRSZXR1cm4oUmV0dXJuIG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0VGhyb3coVGhyb3cgbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRUcnkoVHJ5IG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0Q2F0Y2goQ2F0Y2ggbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRTd2l0Y2goU3dpdGNoIG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0Q2FzZShDYXNlIG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0RGVmYXVsdChEZWZhdWx0IG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0TGFiZWxlZFN0YXRlbWVudChMYWJlbGVkU3RhdGVtZW50IG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0TGl0ZXJhbFN0YXRlbWVudChMaXRlcmFsU3RhdGVtZW50IG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0RGFydFlpZWxkKERhcnRZaWVsZCBub2RlLCBBIGFyZyk7CgogIFIgdmlzaXRMaXRlcmFsRXhwcmVzc2lvbihMaXRlcmFsRXhwcmVzc2lvbiBub2RlLCBBIGFyZyk7CiAgUiB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KFZhcmlhYmxlRGVjbGFyYXRpb25MaXN0IG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0QXNzaWdubWVudChBc3NpZ25tZW50IG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0VmFyaWFibGVJbml0aWFsaXphdGlvbihWYXJpYWJsZUluaXRpYWxpemF0aW9uIG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0Q29uZGl0aW9uYWwoQ29uZGl0aW9uYWwgY29uZCwgQSBhcmcpOwogIFIgdmlzaXROZXcoTmV3IG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0Q2FsbChDYWxsIG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0QmluYXJ5KEJpbmFyeSBub2RlLCBBIGFyZyk7CiAgUiB2aXNpdFByZWZpeChQcmVmaXggbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRQb3N0Zml4KFBvc3RmaXggbm9kZSwgQSBhcmcpOwoKICBSIHZpc2l0VmFyaWFibGVVc2UoVmFyaWFibGVVc2Ugbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRUaGlzKFRoaXMgbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRQYXJhbWV0ZXIoUGFyYW1ldGVyIG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0QWNjZXNzKFByb3BlcnR5QWNjZXNzIG5vZGUsIEEgYXJnKTsKCiAgUiB2aXNpdE5hbWVkRnVuY3Rpb24oTmFtZWRGdW5jdGlvbiBub2RlLCBBIGFyZyk7CiAgUiB2aXNpdEZ1bihGdW4gbm9kZSwgQSBhcmcpOwoKICBSIHZpc2l0RGVmZXJyZWRFeHByZXNzaW9uKERlZmVycmVkRXhwcmVzc2lvbiBub2RlLCBBIGFyZyk7CiAgUiB2aXNpdERlZmVycmVkTnVtYmVyKERlZmVycmVkTnVtYmVyIG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0RGVmZXJyZWRTdHJpbmcoRGVmZXJyZWRTdHJpbmcgbm9kZSwgQSBhcmcpOwoKICBSIHZpc2l0TGl0ZXJhbEJvb2woTGl0ZXJhbEJvb2wgbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRMaXRlcmFsU3RyaW5nKExpdGVyYWxTdHJpbmcgbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRMaXRlcmFsTnVtYmVyKExpdGVyYWxOdW1iZXIgbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRMaXRlcmFsTnVsbChMaXRlcmFsTnVsbCBub2RlLCBBIGFyZyk7CgogIFIgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKFN0cmluZ0NvbmNhdGVuYXRpb24gbm9kZSwgQSBhcmcpOwoKICBSIHZpc2l0TmFtZShOYW1lIG5vZGUsIEEgYXJnKTsKCiAgUiB2aXNpdFBhcmVudGhlc2VzKFBhcmVudGhlc2VzIG5vZGUsIEEgYXJnKTsKCiAgUiB2aXNpdEFycmF5SW5pdGlhbGl6ZXIoQXJyYXlJbml0aWFsaXplciBub2RlLCBBIGFyZyk7CiAgUiB2aXNpdEFycmF5SG9sZShBcnJheUhvbGUgbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRPYmplY3RJbml0aWFsaXplcihPYmplY3RJbml0aWFsaXplciBub2RlLCBBIGFyZyk7CiAgUiB2aXNpdFByb3BlcnR5KFByb3BlcnR5IG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0UmVnRXhwTGl0ZXJhbChSZWdFeHBMaXRlcmFsIG5vZGUsIEEgYXJnKTsKCiAgUiB2aXNpdEF3YWl0KEF3YWl0IG5vZGUsIEEgYXJnKTsKCiAgUiB2aXNpdENvbW1lbnQoQ29tbWVudCBub2RlLCBBIGFyZyk7CgogIFIgdmlzaXRJbnRlcnBvbGF0ZWRFeHByZXNzaW9uKEludGVycG9sYXRlZEV4cHJlc3Npb24gbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRJbnRlcnBvbGF0ZWRMaXRlcmFsKEludGVycG9sYXRlZExpdGVyYWwgbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRJbnRlcnBvbGF0ZWRQYXJhbWV0ZXIoSW50ZXJwb2xhdGVkUGFyYW1ldGVyIG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0SW50ZXJwb2xhdGVkU2VsZWN0b3IoSW50ZXJwb2xhdGVkU2VsZWN0b3Igbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRJbnRlcnBvbGF0ZWRTdGF0ZW1lbnQoSW50ZXJwb2xhdGVkU3RhdGVtZW50IG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0SW50ZXJwb2xhdGVkRGVjbGFyYXRpb24oSW50ZXJwb2xhdGVkRGVjbGFyYXRpb24gbm9kZSwgQSBhcmcpOwp9CgpjbGFzcyBCYXNlVmlzaXRvcjE8UiwgQT4gaW1wbGVtZW50cyBOb2RlVmlzaXRvcjE8UiwgQT4gewogIGNvbnN0IEJhc2VWaXNpdG9yMSgpOwoKICBSIHZpc2l0Tm9kZShOb2RlIG5vZGUsIEEgYXJnKSB7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4xKHRoaXMsIGFyZyk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIFIgdmlzaXRQcm9ncmFtKFByb2dyYW0gbm9kZSwgQSBhcmcpID0+IHZpc2l0Tm9kZShub2RlLCBhcmcpOwoKICBSIHZpc2l0U3RhdGVtZW50KFN0YXRlbWVudCBub2RlLCBBIGFyZykgPT4gdmlzaXROb2RlKG5vZGUsIGFyZyk7CiAgUiB2aXNpdExvb3AoTG9vcCBub2RlLCBBIGFyZykgPT4gdmlzaXRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0SnVtcChTdGF0ZW1lbnQgbm9kZSwgQSBhcmcpID0+IHZpc2l0U3RhdGVtZW50KG5vZGUsIGFyZyk7CgogIFIgdmlzaXRCbG9jayhCbG9jayBub2RlLCBBIGFyZykgPT4gdmlzaXRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUsIEEgYXJnKSA9PgogICAgICB2aXNpdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRFbXB0eVN0YXRlbWVudChFbXB0eVN0YXRlbWVudCBub2RlLCBBIGFyZykgPT4KICAgICAgdmlzaXRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0SWYoSWYgbm9kZSwgQSBhcmcpID0+IHZpc2l0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdEZvcihGb3Igbm9kZSwgQSBhcmcpID0+IHZpc2l0TG9vcChub2RlLCBhcmcpOwogIFIgdmlzaXRGb3JJbihGb3JJbiBub2RlLCBBIGFyZykgPT4gdmlzaXRMb29wKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFdoaWxlKFdoaWxlIG5vZGUsIEEgYXJnKSA9PiB2aXNpdExvb3Aobm9kZSwgYXJnKTsKICBSIHZpc2l0RG8oRG8gbm9kZSwgQSBhcmcpID0+IHZpc2l0TG9vcChub2RlLCBhcmcpOwogIFIgdmlzaXRDb250aW51ZShDb250aW51ZSBub2RlLCBBIGFyZykgPT4gdmlzaXRKdW1wKG5vZGUsIGFyZyk7CiAgUiB2aXNpdEJyZWFrKEJyZWFrIG5vZGUsIEEgYXJnKSA9PiB2aXNpdEp1bXAobm9kZSwgYXJnKTsKICBSIHZpc2l0UmV0dXJuKFJldHVybiBub2RlLCBBIGFyZykgPT4gdmlzaXRKdW1wKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFRocm93KFRocm93IG5vZGUsIEEgYXJnKSA9PiB2aXNpdEp1bXAobm9kZSwgYXJnKTsKICBSIHZpc2l0VHJ5KFRyeSBub2RlLCBBIGFyZykgPT4gdmlzaXRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0U3dpdGNoKFN3aXRjaCBub2RlLCBBIGFyZykgPT4gdmlzaXRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUsIEEgYXJnKSA9PgogICAgICB2aXNpdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRMYWJlbGVkU3RhdGVtZW50KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSwgQSBhcmcpID0+CiAgICAgIHZpc2l0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdExpdGVyYWxTdGF0ZW1lbnQoTGl0ZXJhbFN0YXRlbWVudCBub2RlLCBBIGFyZykgPT4KICAgICAgdmlzaXRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKCiAgUiB2aXNpdENhdGNoKENhdGNoIG5vZGUsIEEgYXJnKSA9PiB2aXNpdE5vZGUobm9kZSwgYXJnKTsKICBSIHZpc2l0Q2FzZShDYXNlIG5vZGUsIEEgYXJnKSA9PiB2aXNpdE5vZGUobm9kZSwgYXJnKTsKICBSIHZpc2l0RGVmYXVsdChEZWZhdWx0IG5vZGUsIEEgYXJnKSA9PiB2aXNpdE5vZGUobm9kZSwgYXJnKTsKCiAgUiB2aXNpdEV4cHJlc3Npb24oRXhwcmVzc2lvbiBub2RlLCBBIGFyZykgPT4gdmlzaXROb2RlKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFZhcmlhYmxlUmVmZXJlbmNlKFZhcmlhYmxlUmVmZXJlbmNlIG5vZGUsIEEgYXJnKSA9PgogICAgICB2aXNpdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKCiAgUiB2aXNpdExpdGVyYWxFeHByZXNzaW9uKExpdGVyYWxFeHByZXNzaW9uIG5vZGUsIEEgYXJnKSA9PgogICAgICB2aXNpdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoVmFyaWFibGVEZWNsYXJhdGlvbkxpc3Qgbm9kZSwgQSBhcmcpID0+CiAgICAgIHZpc2l0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRBc3NpZ25tZW50KEFzc2lnbm1lbnQgbm9kZSwgQSBhcmcpID0+IHZpc2l0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRWYXJpYWJsZUluaXRpYWxpemF0aW9uKFZhcmlhYmxlSW5pdGlhbGl6YXRpb24gbm9kZSwgQSBhcmcpIHsKICAgIGlmIChub2RlLnZhbHVlICE9IG51bGwpIHsKICAgICAgcmV0dXJuIHZpc2l0QXNzaWdubWVudChub2RlLCBhcmcpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHZpc2l0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogICAgfQogIH0KCiAgUiB2aXNpdENvbmRpdGlvbmFsKENvbmRpdGlvbmFsIG5vZGUsIEEgYXJnKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0TmV3KE5ldyBub2RlLCBBIGFyZykgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdENhbGwoQ2FsbCBub2RlLCBBIGFyZykgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdEJpbmFyeShCaW5hcnkgbm9kZSwgQSBhcmcpID0+IHZpc2l0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRQcmVmaXgoUHJlZml4IG5vZGUsIEEgYXJnKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0UG9zdGZpeChQb3N0Zml4IG5vZGUsIEEgYXJnKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0QWNjZXNzKFByb3BlcnR5QWNjZXNzIG5vZGUsIEEgYXJnKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKCiAgUiB2aXNpdFZhcmlhYmxlVXNlKFZhcmlhYmxlVXNlIG5vZGUsIEEgYXJnKSA9PgogICAgICB2aXNpdFZhcmlhYmxlUmVmZXJlbmNlKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlLCBBIGFyZykgPT4KICAgICAgdmlzaXRWYXJpYWJsZVJlZmVyZW5jZShub2RlLCBhcmcpOwogIFIgdmlzaXRQYXJhbWV0ZXIoUGFyYW1ldGVyIG5vZGUsIEEgYXJnKSA9PgogICAgICB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24obm9kZSwgYXJnKTsKICBSIHZpc2l0VGhpcyhUaGlzIG5vZGUsIEEgYXJnKSA9PiB2aXNpdFBhcmFtZXRlcihub2RlLCBhcmcpOwoKICBSIHZpc2l0TmFtZWRGdW5jdGlvbihOYW1lZEZ1bmN0aW9uIG5vZGUsIEEgYXJnKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0RnVuKEZ1biBub2RlLCBBIGFyZykgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CgogIFIgdmlzaXRUb2tlbihEZWZlcnJlZFRva2VuIG5vZGUsIEEgYXJnKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKCiAgUiB2aXNpdERlZmVycmVkRXhwcmVzc2lvbihEZWZlcnJlZEV4cHJlc3Npb24gbm9kZSwgQSBhcmcpID0+CiAgICAgIHZpc2l0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXREZWZlcnJlZE51bWJlcihEZWZlcnJlZE51bWJlciBub2RlLCBBIGFyZykgPT4gdmlzaXRUb2tlbihub2RlLCBhcmcpOwogIFIgdmlzaXREZWZlcnJlZFN0cmluZyhEZWZlcnJlZFN0cmluZyBub2RlLCBBIGFyZykgPT4gdmlzaXRUb2tlbihub2RlLCBhcmcpOwoKICBSIHZpc2l0TGl0ZXJhbChMaXRlcmFsIG5vZGUsIEEgYXJnKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKCiAgUiB2aXNpdExpdGVyYWxCb29sKExpdGVyYWxCb29sIG5vZGUsIEEgYXJnKSA9PiB2aXNpdExpdGVyYWwobm9kZSwgYXJnKTsKICBSIHZpc2l0TGl0ZXJhbFN0cmluZyhMaXRlcmFsU3RyaW5nIG5vZGUsIEEgYXJnKSA9PiB2aXNpdExpdGVyYWwobm9kZSwgYXJnKTsKICBSIHZpc2l0TGl0ZXJhbE51bWJlcihMaXRlcmFsTnVtYmVyIG5vZGUsIEEgYXJnKSA9PiB2aXNpdExpdGVyYWwobm9kZSwgYXJnKTsKICBSIHZpc2l0TGl0ZXJhbE51bGwoTGl0ZXJhbE51bGwgbm9kZSwgQSBhcmcpID0+IHZpc2l0TGl0ZXJhbChub2RlLCBhcmcpOwoKICBSIHZpc2l0U3RyaW5nQ29uY2F0ZW5hdGlvbihTdHJpbmdDb25jYXRlbmF0aW9uIG5vZGUsIEEgYXJnKSA9PgogICAgICB2aXNpdExpdGVyYWwobm9kZSwgYXJnKTsKCiAgUiB2aXNpdE5hbWUoTmFtZSBub2RlLCBBIGFyZykgPT4gdmlzaXROb2RlKG5vZGUsIGFyZyk7CgogIFIgdmlzaXRQYXJlbnRoZXNlcyhQYXJlbnRoZXNlcyBub2RlLCBBIGFyZykgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CgogIFIgdmlzaXRBcnJheUluaXRpYWxpemVyKEFycmF5SW5pdGlhbGl6ZXIgbm9kZSwgQSBhcmcpID0+CiAgICAgIHZpc2l0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRBcnJheUhvbGUoQXJyYXlIb2xlIG5vZGUsIEEgYXJnKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0T2JqZWN0SW5pdGlhbGl6ZXIoT2JqZWN0SW5pdGlhbGl6ZXIgbm9kZSwgQSBhcmcpID0+CiAgICAgIHZpc2l0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRQcm9wZXJ0eShQcm9wZXJ0eSBub2RlLCBBIGFyZykgPT4gdmlzaXROb2RlKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFJlZ0V4cExpdGVyYWwoUmVnRXhwTGl0ZXJhbCBub2RlLCBBIGFyZykgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CgogIFIgdmlzaXRJbnRlcnBvbGF0ZWROb2RlKEludGVycG9sYXRlZE5vZGUgbm9kZSwgQSBhcmcpID0+IHZpc2l0Tm9kZShub2RlLCBhcmcpOwoKICBSIHZpc2l0SW50ZXJwb2xhdGVkRXhwcmVzc2lvbihJbnRlcnBvbGF0ZWRFeHByZXNzaW9uIG5vZGUsIEEgYXJnKSA9PgogICAgICB2aXNpdEludGVycG9sYXRlZE5vZGUobm9kZSwgYXJnKTsKICBSIHZpc2l0SW50ZXJwb2xhdGVkTGl0ZXJhbChJbnRlcnBvbGF0ZWRMaXRlcmFsIG5vZGUsIEEgYXJnKSA9PgogICAgICB2aXNpdEludGVycG9sYXRlZE5vZGUobm9kZSwgYXJnKTsKICBSIHZpc2l0SW50ZXJwb2xhdGVkUGFyYW1ldGVyKEludGVycG9sYXRlZFBhcmFtZXRlciBub2RlLCBBIGFyZykgPT4KICAgICAgdmlzaXRJbnRlcnBvbGF0ZWROb2RlKG5vZGUsIGFyZyk7CiAgUiB2aXNpdEludGVycG9sYXRlZFNlbGVjdG9yKEludGVycG9sYXRlZFNlbGVjdG9yIG5vZGUsIEEgYXJnKSA9PgogICAgICB2aXNpdEludGVycG9sYXRlZE5vZGUobm9kZSwgYXJnKTsKICBSIHZpc2l0SW50ZXJwb2xhdGVkU3RhdGVtZW50KEludGVycG9sYXRlZFN0YXRlbWVudCBub2RlLCBBIGFyZykgPT4KICAgICAgdmlzaXRJbnRlcnBvbGF0ZWROb2RlKG5vZGUsIGFyZyk7CiAgUiB2aXNpdEludGVycG9sYXRlZERlY2xhcmF0aW9uKEludGVycG9sYXRlZERlY2xhcmF0aW9uIG5vZGUsIEEgYXJnKSB7CiAgICByZXR1cm4gdmlzaXRJbnRlcnBvbGF0ZWROb2RlKG5vZGUsIGFyZyk7CiAgfQoKICAvLyBJZ25vcmUgY29tbWVudHMgYnkgZGVmYXVsdC4KICBSIHZpc2l0Q29tbWVudChDb21tZW50IG5vZGUsIEEgYXJnKSA9PiBudWxsOwoKICBSIHZpc2l0QXdhaXQoQXdhaXQgbm9kZSwgQSBhcmcpID0+IHZpc2l0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXREYXJ0WWllbGQoRGFydFlpZWxkIG5vZGUsIEEgYXJnKSA9PiB2aXNpdFN0YXRlbWVudChub2RlLCBhcmcpOwp9CgovLy8gVGhpcyB0YWcgaW50ZXJmYWNlIGhhcyBubyBiZWhhdmlvdXIgYnV0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYW55IGNsYXNzCi8vLyB0aGF0IGlzIHRvIGJlIHN0b3JlZCBvbiBhIFtOb2RlXSBhcyBzb3VyY2UgaW5mb3JtYXRpb24uCmFic3RyYWN0IGNsYXNzIEphdmFTY3JpcHROb2RlU291cmNlSW5mb3JtYXRpb24gewogIGNvbnN0IEphdmFTY3JpcHROb2RlU291cmNlSW5mb3JtYXRpb24oKTsKfQoKYWJzdHJhY3QgY2xhc3MgTm9kZSB7CiAgSmF2YVNjcmlwdE5vZGVTb3VyY2VJbmZvcm1hdGlvbiBnZXQgc291cmNlSW5mb3JtYXRpb24gPT4gX3NvdXJjZUluZm9ybWF0aW9uOwoKICBKYXZhU2NyaXB0Tm9kZVNvdXJjZUluZm9ybWF0aW9uIF9zb3VyY2VJbmZvcm1hdGlvbjsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcik7CiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKTsKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZyk7CgogIC8vIFNoYWxsb3cgY2xvbmUgb2Ygbm9kZS4gIERvZXMgbm90IGNsb25lIHBvc2l0aW9ucyBzaW5jZSB0aGUgb25seSB1c2Ugb2YgdGhpcwogIC8vIHByaXZhdGUgbWV0aG9kIGlzIGNyZWF0ZSBhIGNvcHkgd2l0aCBhIG5ldyBwb3NpdGlvbi4KICBOb2RlIF9jbG9uZSgpOwoKICAvLyBSZXR1cm5zIGEgbm9kZSBlcXVpdmFsZW50IHRvIFt0aGlzXSwgYnV0IHdpdGggbmV3IHNvdXJjZSBwb3NpdGlvbiBhbmQgZW5kCiAgLy8gc291cmNlIHBvc2l0aW9uLgogIE5vZGUgd2l0aFNvdXJjZUluZm9ybWF0aW9uKAogICAgICBKYXZhU2NyaXB0Tm9kZVNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBpZiAoc291cmNlSW5mb3JtYXRpb24gPT0gX3NvdXJjZUluZm9ybWF0aW9uKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgTm9kZSBjbG9uZSA9IF9jbG9uZSgpOwogICAgLy8gVE9ETyhzcmEpOiBTaG91bGQgZXhpc3RpbmcgZGF0YSBiZSAnc3RpY2t5JyBpZiB3ZSB0cnkgdG8gb3ZlcndyaXRlIHdpdGgKICAgIC8vIGBudWxsYD8KICAgIGNsb25lLl9zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogICAgcmV0dXJuIGNsb25lOwogIH0KCiAgVmFyaWFibGVVc2UgYXNWYXJpYWJsZVVzZSgpID0+IG51bGw7CgogIGJvb2wgZ2V0IGlzQ29tbWFPcGVyYXRvciA9PiBmYWxzZTsKCiAgU3RhdGVtZW50IHRvU3RhdGVtZW50KCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3RvU3RhdGVtZW50Jyk7CiAgfQoKICBTdHJpbmcgZGVidWdQcmludCgpID0+IERlYnVnUHJpbnQodGhpcyk7Cn0KCmNsYXNzIFByb2dyYW0gZXh0ZW5kcyBOb2RlIHsKICBmaW5hbCBMaXN0PFN0YXRlbWVudD4gYm9keTsKICBQcm9ncmFtKHRoaXMuYm9keSk7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRQcm9ncmFtKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0UHJvZ3JhbSh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgZm9yIChTdGF0ZW1lbnQgc3RhdGVtZW50IGluIGJvZHkpIHN0YXRlbWVudC5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgZm9yIChTdGF0ZW1lbnQgc3RhdGVtZW50IGluIGJvZHkpIHN0YXRlbWVudC5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgfQoKICBQcm9ncmFtIF9jbG9uZSgpID0+IG5ldyBQcm9ncmFtKGJvZHkpOwp9CgphYnN0cmFjdCBjbGFzcyBTdGF0ZW1lbnQgZXh0ZW5kcyBOb2RlIHsKICBTdGF0ZW1lbnQgdG9TdGF0ZW1lbnQoKSA9PiB0aGlzOwp9CgpjbGFzcyBCbG9jayBleHRlbmRzIFN0YXRlbWVudCB7CiAgZmluYWwgTGlzdDxTdGF0ZW1lbnQ+IHN0YXRlbWVudHM7CgogIEJsb2NrKHRoaXMuc3RhdGVtZW50cyk7CgogIEJsb2NrLmVtcHR5KCkgOiB0aGlzLnN0YXRlbWVudHMgPSA8U3RhdGVtZW50PltdOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0QmxvY2sodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRCbG9jayh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgZm9yIChTdGF0ZW1lbnQgc3RhdGVtZW50IGluIHN0YXRlbWVudHMpIHN0YXRlbWVudC5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgZm9yIChTdGF0ZW1lbnQgc3RhdGVtZW50IGluIHN0YXRlbWVudHMpIHN0YXRlbWVudC5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgfQoKICBCbG9jayBfY2xvbmUoKSA9PiBuZXcgQmxvY2soc3RhdGVtZW50cyk7Cn0KCmNsYXNzIEV4cHJlc3Npb25TdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIGZpbmFsIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKCiAgRXhwcmVzc2lvblN0YXRlbWVudCh0aGlzLmV4cHJlc3Npb24pIHsKICAgIGFzc2VydCh0aGlzLmV4cHJlc3Npb24gIT0gbnVsbCk7CiAgfQoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0RXhwcmVzc2lvblN0YXRlbWVudCh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQodGhpcywgYXJnKTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHsKICAgIGV4cHJlc3Npb24uYWNjZXB0KHZpc2l0b3IpOwogIH0KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHsKICAgIGV4cHJlc3Npb24uYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogIH0KCiAgRXhwcmVzc2lvblN0YXRlbWVudCBfY2xvbmUoKSA9PiBuZXcgRXhwcmVzc2lvblN0YXRlbWVudChleHByZXNzaW9uKTsKfQoKY2xhc3MgRW1wdHlTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIEVtcHR5U3RhdGVtZW50KCk7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRFbXB0eVN0YXRlbWVudCh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdEVtcHR5U3RhdGVtZW50KHRoaXMsIGFyZyk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7fQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykge30KCiAgRW1wdHlTdGF0ZW1lbnQgX2Nsb25lKCkgPT4gbmV3IEVtcHR5U3RhdGVtZW50KCk7Cn0KCmNsYXNzIElmIGV4dGVuZHMgU3RhdGVtZW50IHsKICBmaW5hbCBFeHByZXNzaW9uIGNvbmRpdGlvbjsKICBmaW5hbCBTdGF0ZW1lbnQgdGhlbjsKICBmaW5hbCBTdGF0ZW1lbnQgb3RoZXJ3aXNlOwoKICBJZih0aGlzLmNvbmRpdGlvbiwgdGhpcy50aGVuLCB0aGlzLm90aGVyd2lzZSk7CgogIElmLm5vRWxzZSh0aGlzLmNvbmRpdGlvbiwgdGhpcy50aGVuKSA6IHRoaXMub3RoZXJ3aXNlID0gbmV3IEVtcHR5U3RhdGVtZW50KCk7CgogIGJvb2wgZ2V0IGhhc0Vsc2UgPT4gb3RoZXJ3aXNlIGlzISBFbXB0eVN0YXRlbWVudDsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdElmKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0SWYodGhpcywgYXJnKTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHsKICAgIGNvbmRpdGlvbi5hY2NlcHQodmlzaXRvcik7CiAgICB0aGVuLmFjY2VwdCh2aXNpdG9yKTsKICAgIG90aGVyd2lzZS5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgY29uZGl0aW9uLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIHRoZW4uYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogICAgb3RoZXJ3aXNlLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICB9CgogIElmIF9jbG9uZSgpID0+IG5ldyBJZihjb25kaXRpb24sIHRoZW4sIG90aGVyd2lzZSk7Cn0KCmFic3RyYWN0IGNsYXNzIExvb3AgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIGZpbmFsIFN0YXRlbWVudCBib2R5OwoKICBMb29wKHRoaXMuYm9keSk7Cn0KCmNsYXNzIEZvciBleHRlbmRzIExvb3AgewogIGZpbmFsIEV4cHJlc3Npb24gaW5pdDsKICBmaW5hbCBFeHByZXNzaW9uIGNvbmRpdGlvbjsKICBmaW5hbCBFeHByZXNzaW9uIHVwZGF0ZTsKCiAgRm9yKHRoaXMuaW5pdCwgdGhpcy5jb25kaXRpb24sIHRoaXMudXBkYXRlLCBTdGF0ZW1lbnQgYm9keSkgOiBzdXBlcihib2R5KTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdEZvcih0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdEZvcih0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgaWYgKGluaXQgIT0gbnVsbCkgaW5pdC5hY2NlcHQodmlzaXRvcik7CiAgICBpZiAoY29uZGl0aW9uICE9IG51bGwpIGNvbmRpdGlvbi5hY2NlcHQodmlzaXRvcik7CiAgICBpZiAodXBkYXRlICE9IG51bGwpIHVwZGF0ZS5hY2NlcHQodmlzaXRvcik7CiAgICBib2R5LmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBpZiAoaW5pdCAhPSBudWxsKSBpbml0LmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIGlmIChjb25kaXRpb24gIT0gbnVsbCkgY29uZGl0aW9uLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIGlmICh1cGRhdGUgIT0gbnVsbCkgdXBkYXRlLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIGJvZHkuYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogIH0KCiAgRm9yIF9jbG9uZSgpID0+IG5ldyBGb3IoaW5pdCwgY29uZGl0aW9uLCB1cGRhdGUsIGJvZHkpOwp9CgpjbGFzcyBGb3JJbiBleHRlbmRzIExvb3AgewogIC8vIE5vdGUgdGhhdCBbVmFyaWFibGVEZWNsYXJhdGlvbkxpc3RdIGlzIGEgc3ViY2xhc3Mgb2YgW0V4cHJlc3Npb25dLgogIC8vIFRoZXJlZm9yZSB3ZSBjYW4gdHlwZSB0aGUgbGVmdEhhbmRTaWRlIGFzIFtFeHByZXNzaW9uXS4KICBmaW5hbCBFeHByZXNzaW9uIGxlZnRIYW5kU2lkZTsKICBmaW5hbCBFeHByZXNzaW9uIG9iamVjdDsKCiAgRm9ySW4odGhpcy5sZWZ0SGFuZFNpZGUsIHRoaXMub2JqZWN0LCBTdGF0ZW1lbnQgYm9keSkgOiBzdXBlcihib2R5KTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdEZvckluKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0Rm9ySW4odGhpcywgYXJnKTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHsKICAgIGxlZnRIYW5kU2lkZS5hY2NlcHQodmlzaXRvcik7CiAgICBvYmplY3QuYWNjZXB0KHZpc2l0b3IpOwogICAgYm9keS5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgbGVmdEhhbmRTaWRlLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIG9iamVjdC5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgICBib2R5LmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICB9CgogIEZvckluIF9jbG9uZSgpID0+IG5ldyBGb3JJbihsZWZ0SGFuZFNpZGUsIG9iamVjdCwgYm9keSk7Cn0KCmNsYXNzIFdoaWxlIGV4dGVuZHMgTG9vcCB7CiAgZmluYWwgTm9kZSBjb25kaXRpb247CgogIFdoaWxlKHRoaXMuY29uZGl0aW9uLCBTdGF0ZW1lbnQgYm9keSkgOiBzdXBlcihib2R5KTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFdoaWxlKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0V2hpbGUodGhpcywgYXJnKTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHsKICAgIGNvbmRpdGlvbi5hY2NlcHQodmlzaXRvcik7CiAgICBib2R5LmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBjb25kaXRpb24uYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogICAgYm9keS5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgfQoKICBXaGlsZSBfY2xvbmUoKSA9PiBuZXcgV2hpbGUoY29uZGl0aW9uLCBib2R5KTsKfQoKY2xhc3MgRG8gZXh0ZW5kcyBMb29wIHsKICBmaW5hbCBFeHByZXNzaW9uIGNvbmRpdGlvbjsKCiAgRG8oU3RhdGVtZW50IGJvZHksIHRoaXMuY29uZGl0aW9uKSA6IHN1cGVyKGJvZHkpOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0RG8odGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXREbyh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgYm9keS5hY2NlcHQodmlzaXRvcik7CiAgICBjb25kaXRpb24uYWNjZXB0KHZpc2l0b3IpOwogIH0KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHsKICAgIGJvZHkuYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogICAgY29uZGl0aW9uLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICB9CgogIERvIF9jbG9uZSgpID0+IG5ldyBEbyhib2R5LCBjb25kaXRpb24pOwp9CgpjbGFzcyBDb250aW51ZSBleHRlbmRzIFN0YXRlbWVudCB7CiAgZmluYWwgU3RyaW5nIHRhcmdldExhYmVsOyAvLyBDYW4gYmUgbnVsbC4KCiAgQ29udGludWUodGhpcy50YXJnZXRMYWJlbCk7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRDb250aW51ZSh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdENvbnRpbnVlKHRoaXMsIGFyZyk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7fQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykge30KCiAgQ29udGludWUgX2Nsb25lKCkgPT4gbmV3IENvbnRpbnVlKHRhcmdldExhYmVsKTsKfQoKY2xhc3MgQnJlYWsgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIGZpbmFsIFN0cmluZyB0YXJnZXRMYWJlbDsgLy8gQ2FuIGJlIG51bGwuCgogIEJyZWFrKHRoaXMudGFyZ2V0TGFiZWwpOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0QnJlYWsodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRCcmVhayh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikge30KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHt9CgogIEJyZWFrIF9jbG9uZSgpID0+IG5ldyBCcmVhayh0YXJnZXRMYWJlbCk7Cn0KCmNsYXNzIFJldHVybiBleHRlbmRzIFN0YXRlbWVudCB7CiAgZmluYWwgRXhwcmVzc2lvbiB2YWx1ZTsgLy8gQ2FuIGJlIG51bGwuCgogIFJldHVybihbdGhpcy52YWx1ZSA9IG51bGxdKTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFJldHVybih0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdFJldHVybih0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgaWYgKHZhbHVlICE9IG51bGwpIHZhbHVlLmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgdmFsdWUuYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogIH0KCiAgUmV0dXJuIF9jbG9uZSgpID0+IG5ldyBSZXR1cm4odmFsdWUpOwp9CgpjbGFzcyBUaHJvdyBleHRlbmRzIFN0YXRlbWVudCB7CiAgZmluYWwgRXhwcmVzc2lvbiBleHByZXNzaW9uOwoKICBUaHJvdyh0aGlzLmV4cHJlc3Npb24pOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0VGhyb3codGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRUaHJvdyh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgZXhwcmVzc2lvbi5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgZXhwcmVzc2lvbi5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgfQoKICBUaHJvdyBfY2xvbmUoKSA9PiBuZXcgVGhyb3coZXhwcmVzc2lvbik7Cn0KCmNsYXNzIFRyeSBleHRlbmRzIFN0YXRlbWVudCB7CiAgZmluYWwgQmxvY2sgYm9keTsKICBmaW5hbCBDYXRjaCBjYXRjaFBhcnQ7IC8vIENhbiBiZSBudWxsIGlmIFtmaW5hbGx5UGFydF0gaXMgbm9uLW51bGwuCiAgZmluYWwgQmxvY2sgZmluYWxseVBhcnQ7IC8vIENhbiBiZSBudWxsIGlmIFtjYXRjaFBhcnRdIGlzIG5vbi1udWxsLgoKICBUcnkodGhpcy5ib2R5LCB0aGlzLmNhdGNoUGFydCwgdGhpcy5maW5hbGx5UGFydCkgewogICAgYXNzZXJ0KGNhdGNoUGFydCAhPSBudWxsIHx8IGZpbmFsbHlQYXJ0ICE9IG51bGwpOwogIH0KCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFRyeSh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdFRyeSh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgYm9keS5hY2NlcHQodmlzaXRvcik7CiAgICBpZiAoY2F0Y2hQYXJ0ICE9IG51bGwpIGNhdGNoUGFydC5hY2NlcHQodmlzaXRvcik7CiAgICBpZiAoZmluYWxseVBhcnQgIT0gbnVsbCkgZmluYWxseVBhcnQuYWNjZXB0KHZpc2l0b3IpOwogIH0KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHsKICAgIGJvZHkuYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogICAgaWYgKGNhdGNoUGFydCAhPSBudWxsKSBjYXRjaFBhcnQuYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogICAgaWYgKGZpbmFsbHlQYXJ0ICE9IG51bGwpIGZpbmFsbHlQYXJ0LmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICB9CgogIFRyeSBfY2xvbmUoKSA9PiBuZXcgVHJ5KGJvZHksIGNhdGNoUGFydCwgZmluYWxseVBhcnQpOwp9CgpjbGFzcyBDYXRjaCBleHRlbmRzIE5vZGUgewogIGZpbmFsIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uOwogIGZpbmFsIEJsb2NrIGJvZHk7CgogIENhdGNoKHRoaXMuZGVjbGFyYXRpb24sIHRoaXMuYm9keSk7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRDYXRjaCh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdENhdGNoKHRoaXMsIGFyZyk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7CiAgICBkZWNsYXJhdGlvbi5hY2NlcHQodmlzaXRvcik7CiAgICBib2R5LmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBkZWNsYXJhdGlvbi5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgICBib2R5LmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICB9CgogIENhdGNoIF9jbG9uZSgpID0+IG5ldyBDYXRjaChkZWNsYXJhdGlvbiwgYm9keSk7Cn0KCmNsYXNzIFN3aXRjaCBleHRlbmRzIFN0YXRlbWVudCB7CiAgZmluYWwgRXhwcmVzc2lvbiBrZXk7CiAgZmluYWwgTGlzdDxTd2l0Y2hDbGF1c2U+IGNhc2VzOwoKICBTd2l0Y2godGhpcy5rZXksIHRoaXMuY2FzZXMpOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0U3dpdGNoKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0U3dpdGNoKHRoaXMsIGFyZyk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7CiAgICBrZXkuYWNjZXB0KHZpc2l0b3IpOwogICAgZm9yIChTd2l0Y2hDbGF1c2UgY2xhdXNlIGluIGNhc2VzKSBjbGF1c2UuYWNjZXB0KHZpc2l0b3IpOwogIH0KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHsKICAgIGtleS5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgICBmb3IgKFN3aXRjaENsYXVzZSBjbGF1c2UgaW4gY2FzZXMpIGNsYXVzZS5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgfQoKICBTd2l0Y2ggX2Nsb25lKCkgPT4gbmV3IFN3aXRjaChrZXksIGNhc2VzKTsKfQoKYWJzdHJhY3QgY2xhc3MgU3dpdGNoQ2xhdXNlIGV4dGVuZHMgTm9kZSB7CiAgZmluYWwgQmxvY2sgYm9keTsKCiAgU3dpdGNoQ2xhdXNlKHRoaXMuYm9keSk7Cn0KCmNsYXNzIENhc2UgZXh0ZW5kcyBTd2l0Y2hDbGF1c2UgewogIGZpbmFsIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKCiAgQ2FzZSh0aGlzLmV4cHJlc3Npb24sIEJsb2NrIGJvZHkpIDogc3VwZXIoYm9keSk7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRDYXNlKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0Q2FzZSh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgZXhwcmVzc2lvbi5hY2NlcHQodmlzaXRvcik7CiAgICBib2R5LmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBleHByZXNzaW9uLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIGJvZHkuYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogIH0KCiAgQ2FzZSBfY2xvbmUoKSA9PiBuZXcgQ2FzZShleHByZXNzaW9uLCBib2R5KTsKfQoKY2xhc3MgRGVmYXVsdCBleHRlbmRzIFN3aXRjaENsYXVzZSB7CiAgRGVmYXVsdChCbG9jayBib2R5KSA6IHN1cGVyKGJvZHkpOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0RGVmYXVsdCh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdERlZmF1bHQodGhpcywgYXJnKTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHsKICAgIGJvZHkuYWNjZXB0KHZpc2l0b3IpOwogIH0KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHsKICAgIGJvZHkuYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogIH0KCiAgRGVmYXVsdCBfY2xvbmUoKSA9PiBuZXcgRGVmYXVsdChib2R5KTsKfQoKY2xhc3MgRnVuY3Rpb25EZWNsYXJhdGlvbiBleHRlbmRzIFN0YXRlbWVudCB7CiAgZmluYWwgRGVjbGFyYXRpb24gbmFtZTsKICBmaW5hbCBGdW4gZnVuY3Rpb247CgogIEZ1bmN0aW9uRGVjbGFyYXRpb24odGhpcy5uYW1lLCB0aGlzLmZ1bmN0aW9uKTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24odGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKHRoaXMsIGFyZyk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7CiAgICBuYW1lLmFjY2VwdCh2aXNpdG9yKTsKICAgIGZ1bmN0aW9uLmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBuYW1lLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIGZ1bmN0aW9uLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICB9CgogIEZ1bmN0aW9uRGVjbGFyYXRpb24gX2Nsb25lKCkgPT4gbmV3IEZ1bmN0aW9uRGVjbGFyYXRpb24obmFtZSwgZnVuY3Rpb24pOwp9CgpjbGFzcyBMYWJlbGVkU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKICBmaW5hbCBTdHJpbmcgbGFiZWw7CiAgZmluYWwgU3RhdGVtZW50IGJvZHk7CgogIExhYmVsZWRTdGF0ZW1lbnQodGhpcy5sYWJlbCwgdGhpcy5ib2R5KTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdExhYmVsZWRTdGF0ZW1lbnQodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRMYWJlbGVkU3RhdGVtZW50KHRoaXMsIGFyZyk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7CiAgICBib2R5LmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBib2R5LmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICB9CgogIExhYmVsZWRTdGF0ZW1lbnQgX2Nsb25lKCkgPT4gbmV3IExhYmVsZWRTdGF0ZW1lbnQobGFiZWwsIGJvZHkpOwp9CgpjbGFzcyBMaXRlcmFsU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKICBmaW5hbCBTdHJpbmcgY29kZTsKCiAgTGl0ZXJhbFN0YXRlbWVudCh0aGlzLmNvZGUpOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0TGl0ZXJhbFN0YXRlbWVudCh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdExpdGVyYWxTdGF0ZW1lbnQodGhpcywgYXJnKTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHt9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7fQoKICBMaXRlcmFsU3RhdGVtZW50IF9jbG9uZSgpID0+IG5ldyBMaXRlcmFsU3RhdGVtZW50KGNvZGUpOwp9CgovLyBOb3QgYSByZWFsIEphdmFTY3JpcHQgbm9kZSwgYnV0IHJlcHJlc2VudHMgdGhlIHlpZWxkIHN0YXRlbWVudCBmcm9tIGEgZGFydAovLyBwcm9ncmFtIHRyYW5zbGF0ZWQgdG8gSmF2YVNjcmlwdC4KY2xhc3MgRGFydFlpZWxkIGV4dGVuZHMgU3RhdGVtZW50IHsKICBmaW5hbCBFeHByZXNzaW9uIGV4cHJlc3Npb247CgogIGZpbmFsIGJvb2wgaGFzU3RhcjsKCiAgRGFydFlpZWxkKHRoaXMuZXhwcmVzc2lvbiwgdGhpcy5oYXNTdGFyKTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdERhcnRZaWVsZCh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdERhcnRZaWVsZCh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgZXhwcmVzc2lvbi5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgZXhwcmVzc2lvbi5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgfQoKICBEYXJ0WWllbGQgX2Nsb25lKCkgPT4gbmV3IERhcnRZaWVsZChleHByZXNzaW9uLCBoYXNTdGFyKTsKfQoKYWJzdHJhY3QgY2xhc3MgRXhwcmVzc2lvbiBleHRlbmRzIE5vZGUgewogIGludCBnZXQgcHJlY2VkZW5jZUxldmVsOwoKICBTdGF0ZW1lbnQgdG9TdGF0ZW1lbnQoKSA9PiBuZXcgRXhwcmVzc2lvblN0YXRlbWVudCh0aGlzKTsKfQoKYWJzdHJhY3QgY2xhc3MgRGVjbGFyYXRpb24gaW1wbGVtZW50cyBWYXJpYWJsZVJlZmVyZW5jZSB7fQoKLy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIFtOYW1lXSByZXByZXNlbnRzIGEgcG90ZW50aWFsbHkgbGF0ZSBib3VuZCBuYW1lIGluCi8vLyB0aGUgZ2VuZXJhdGVkIGFzdC4KLy8vCi8vLyBXaGlsZSBbTmFtZV0gaW1wbGVtZW50cyBjb21wYXJhYmxlLCB0aGVyZSBpcyBubyByZXF1aXJlbWVudCBvbiB0aGUgYWN0dWFsCi8vLyBpbXBsZW1lbnRhdGlvbiBvZiBbY29tcGFyZVRvXSBvdGhlciB0aGFuIHRoYXQgaXQgbmVlZHMgdG8gYmUgc3RhYmxlLgovLy8gSW4gcGFydGljdWxhciwgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgaW1wbGVtZW50YXRpb25zIG9mIFtjb21wYXJlVG9dCi8vLyB3aWxsIGltcGxlbWVudCBzb21lIGZvcm0gb2YgbGV4aWNvZ3JhcGhpYyBvcmRlcmluZyBsaWtlIFtTdHJpbmcuY29tcGFyZVRvXS4KYWJzdHJhY3QgY2xhc3MgTmFtZSBleHRlbmRzIExpdGVyYWwKICAgIGltcGxlbWVudHMgRGVjbGFyYXRpb24sIFBhcmFtZXRlciwgQ29tcGFyYWJsZSB7CiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdE5hbWUodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXROYW1lKHRoaXMsIGFyZyk7CgogIE5hbWUgX2Nsb25lKCk7CgogIC8vLyBSZXR1cm5zIGEgdW5pcXVlIFtrZXldIGZvciB0aGlzIG5hbWUuCiAgLy8vCiAgLy8vIFRoZSBrZXkgaXMgdW5yZWxhdGVkIHRvIHRoZSBhY3R1YWwgbmFtZSBhbmQgaXMgbm90IGludGVuZGVkIGZvciBodW1hbgogIC8vLyBjb25zdW1wdGlvbi4gQXMgc3VjaCwgaXQgbWlnaHQgYmUgbG9uZyBvciBjcnlwdGljLgogIFN0cmluZyBnZXQga2V5OwoKICBib29sIGdldCBhbGxvd1JlbmFtZSA9PiBmYWxzZTsKfQoKY2xhc3MgTGl0ZXJhbFN0cmluZ0Zyb21OYW1lIGV4dGVuZHMgTGl0ZXJhbFN0cmluZyB7CiAgTmFtZSBuYW1lOwoKICBMaXRlcmFsU3RyaW5nRnJvbU5hbWUodGhpcy5uYW1lKSA6IHN1cGVyKG51bGwpOwoKICBTdHJpbmcgZ2V0IHZhbHVlID0+ICciJHtuYW1lLm5hbWV9Iic7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7CiAgICBuYW1lLmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBuYW1lLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICB9Cn0KCmNsYXNzIExpdGVyYWxFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgZmluYWwgU3RyaW5nIHRlbXBsYXRlOwogIGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gaW5wdXRzOwoKICBMaXRlcmFsRXhwcmVzc2lvbih0aGlzLnRlbXBsYXRlKSA6IGlucHV0cyA9IGNvbnN0IFtdOwoKICBMaXRlcmFsRXhwcmVzc2lvbi53aXRoRGF0YSh0aGlzLnRlbXBsYXRlLCB0aGlzLmlucHV0cyk7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRMaXRlcmFsRXhwcmVzc2lvbih0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdExpdGVyYWxFeHByZXNzaW9uKHRoaXMsIGFyZyk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7CiAgICBpZiAoaW5wdXRzICE9IG51bGwpIHsKICAgICAgZm9yIChFeHByZXNzaW9uIGV4cHIgaW4gaW5wdXRzKSBleHByLmFjY2VwdCh2aXNpdG9yKTsKICAgIH0KICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBpZiAoaW5wdXRzICE9IG51bGwpIHsKICAgICAgZm9yIChFeHByZXNzaW9uIGV4cHIgaW4gaW5wdXRzKSBleHByLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIH0KICB9CgogIExpdGVyYWxFeHByZXNzaW9uIF9jbG9uZSgpID0+CiAgICAgIG5ldyBMaXRlcmFsRXhwcmVzc2lvbi53aXRoRGF0YSh0ZW1wbGF0ZSwgaW5wdXRzKTsKCiAgLy8gQ29kZSB0aGF0IHVzZXMgSlMgbXVzdCB0YWtlIGNhcmUgb2Ygb3BlcmF0b3IgcHJlY2VkZW5jZXMsIGFuZAogIC8vIHB1dCBwYXJlbnRoZXNpcyBpZiBuZWVkZWQuCiAgaW50IGdldCBwcmVjZWRlbmNlTGV2ZWwgPT4gUFJJTUFSWTsKfQoKLyoqCiAqIFtWYXJpYWJsZURlY2xhcmF0aW9uTGlzdF0gaXMgYSBzdWJjbGFzcyBvZiBbRXhwcmVzc2lvbl0gdG8gc2ltcGxpZnkgdGhlCiAqIEFTVC4KICovCmNsYXNzIFZhcmlhYmxlRGVjbGFyYXRpb25MaXN0IGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgZmluYWwgTGlzdDxWYXJpYWJsZUluaXRpYWxpemF0aW9uPiBkZWNsYXJhdGlvbnM7CgogIC8vLyBXaGVuIHByZXR0eS1wcmludGluZyBhIGRlY2xhcmF0aW9uIGxpc3Qgd2l0aCBtdWx0aXBsZSBkZWNsYXJhdGlvbnMgb3ZlcgogIC8vLyBzZXZlcmFsIGxpbmVzLCB0aGUgZGVjbGFyYXRpb25zIGFyZSB1c3VhbGx5IGluZGVudGVkIHdpdGggcmVzcGVjdCB0byB0aGUKICAvLy8gYHZhcmAga2V5d29yZC4gU2V0IFtpbmRlbnRTcGxpdHNdIHRvIGBmYWxzZWAgdG8gc3VwcHJlc3MgdGhlIGluZGVudGF0aW9uLgogIGZpbmFsIGJvb2wgaW5kZW50U3BsaXRzOwoKICBWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCh0aGlzLmRlY2xhcmF0aW9ucywge3RoaXMuaW5kZW50U3BsaXRzID0gdHJ1ZX0pOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PgogICAgICB2aXNpdG9yLnZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbkxpc3QodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgZm9yIChWYXJpYWJsZUluaXRpYWxpemF0aW9uIGRlY2xhcmF0aW9uIGluIGRlY2xhcmF0aW9ucykgewogICAgICBkZWNsYXJhdGlvbi5hY2NlcHQodmlzaXRvcik7CiAgICB9CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgZm9yIChWYXJpYWJsZUluaXRpYWxpemF0aW9uIGRlY2xhcmF0aW9uIGluIGRlY2xhcmF0aW9ucykgewogICAgICBkZWNsYXJhdGlvbi5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgICB9CiAgfQoKICBWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCBfY2xvbmUoKSA9PiBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoZGVjbGFyYXRpb25zKTsKCiAgaW50IGdldCBwcmVjZWRlbmNlTGV2ZWwgPT4gRVhQUkVTU0lPTjsKfQoKLy8vIEZvcmNlZCBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24uIFByZXR0eS1wcmludGluZyB3aWxsIGVtaXQgcGFyZW50aGVzZXMgYmFzZWQKLy8vIG9uIG5lZWQsIHNvIHRoaXMgbm9kZSBpcyB2ZXJ5IHJhcmVseSBuZWVkZWQuCmNsYXNzIFBhcmVudGhlc2VzIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgZmluYWwgRXhwcmVzc2lvbiBlbmNsb3NlZDsKCiAgUGFyZW50aGVzZXModGhpcy5lbmNsb3NlZCk7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRQYXJlbnRoZXNlcyh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdFBhcmVudGhlc2VzKHRoaXMsIGFyZyk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7CiAgICBlbmNsb3NlZC5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgZW5jbG9zZWQuYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogIH0KCiAgUGFyZW50aGVzZXMgX2Nsb25lKCkgPT4gbmV3IFBhcmVudGhlc2VzKGVuY2xvc2VkKTsKCiAgaW50IGdldCBwcmVjZWRlbmNlTGV2ZWwgPT4gUFJJTUFSWTsKfQoKY2xhc3MgQXNzaWdubWVudCBleHRlbmRzIEV4cHJlc3Npb24gewogIGZpbmFsIEV4cHJlc3Npb24gbGVmdEhhbmRTaWRlOwogIGZpbmFsIFN0cmluZyBvcDsgLy8gTnVsbCwgaWYgdGhlIGFzc2lnbm1lbnQgaXMgbm90IGNvbXBvdW5kLgogIGZpbmFsIEV4cHJlc3Npb24gdmFsdWU7IC8vIE1heSBiZSBudWxsLCBmb3IgW1ZhcmlhYmxlSW5pdGlhbGl6YXRpb25dcy4KCiAgQXNzaWdubWVudChsZWZ0SGFuZFNpZGUsIHZhbHVlKSA6IHRoaXMuY29tcG91bmQobGVmdEhhbmRTaWRlLCBudWxsLCB2YWx1ZSk7CgogIC8vIElmIGB0aGlzLm9wID09IG51bGxgIHRoaXMgd2lsbCBiZSBhIG5vbi1jb21wb3VuZCBhc3NpZ25tZW50LgogIEFzc2lnbm1lbnQuY29tcG91bmQodGhpcy5sZWZ0SGFuZFNpZGUsIHRoaXMub3AsIHRoaXMudmFsdWUpOwoKICBpbnQgZ2V0IHByZWNlZGVuY2VMZXZlbCA9PiBBU1NJR05NRU5UOwoKICBib29sIGdldCBpc0NvbXBvdW5kID0+IG9wICE9IG51bGw7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRBc3NpZ25tZW50KHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0QXNzaWdubWVudCh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgbGVmdEhhbmRTaWRlLmFjY2VwdCh2aXNpdG9yKTsKICAgIGlmICh2YWx1ZSAhPSBudWxsKSB2YWx1ZS5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgbGVmdEhhbmRTaWRlLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIGlmICh2YWx1ZSAhPSBudWxsKSB2YWx1ZS5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgfQoKICBBc3NpZ25tZW50IF9jbG9uZSgpID0+IG5ldyBBc3NpZ25tZW50LmNvbXBvdW5kKGxlZnRIYW5kU2lkZSwgb3AsIHZhbHVlKTsKfQoKY2xhc3MgVmFyaWFibGVJbml0aWFsaXphdGlvbiBleHRlbmRzIEFzc2lnbm1lbnQgewogIC8qKiBbdmFsdWVdIG1heSBiZSBudWxsLiAqLwogIFZhcmlhYmxlSW5pdGlhbGl6YXRpb24oRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEV4cHJlc3Npb24gdmFsdWUpCiAgICAgIDogc3VwZXIoZGVjbGFyYXRpb24sIHZhbHVlKTsKCiAgRGVjbGFyYXRpb24gZ2V0IGRlY2xhcmF0aW9uID0+IGxlZnRIYW5kU2lkZTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4KICAgICAgdmlzaXRvci52aXNpdFZhcmlhYmxlSW5pdGlhbGl6YXRpb24odGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRWYXJpYWJsZUluaXRpYWxpemF0aW9uKHRoaXMsIGFyZyk7CgogIFZhcmlhYmxlSW5pdGlhbGl6YXRpb24gX2Nsb25lKCkgPT4KICAgICAgbmV3IFZhcmlhYmxlSW5pdGlhbGl6YXRpb24oZGVjbGFyYXRpb24sIHZhbHVlKTsKfQoKY2xhc3MgQ29uZGl0aW9uYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBmaW5hbCBFeHByZXNzaW9uIGNvbmRpdGlvbjsKICBmaW5hbCBFeHByZXNzaW9uIHRoZW47CiAgZmluYWwgRXhwcmVzc2lvbiBvdGhlcndpc2U7CgogIENvbmRpdGlvbmFsKHRoaXMuY29uZGl0aW9uLCB0aGlzLnRoZW4sIHRoaXMub3RoZXJ3aXNlKTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdENvbmRpdGlvbmFsKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0Q29uZGl0aW9uYWwodGhpcywgYXJnKTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHsKICAgIGNvbmRpdGlvbi5hY2NlcHQodmlzaXRvcik7CiAgICB0aGVuLmFjY2VwdCh2aXNpdG9yKTsKICAgIG90aGVyd2lzZS5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgY29uZGl0aW9uLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIHRoZW4uYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogICAgb3RoZXJ3aXNlLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICB9CgogIENvbmRpdGlvbmFsIF9jbG9uZSgpID0+IG5ldyBDb25kaXRpb25hbChjb25kaXRpb24sIHRoZW4sIG90aGVyd2lzZSk7CgogIGludCBnZXQgcHJlY2VkZW5jZUxldmVsID0+IEFTU0lHTk1FTlQ7Cn0KCmNsYXNzIENhbGwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBFeHByZXNzaW9uIHRhcmdldDsKICBMaXN0PEV4cHJlc3Npb24+IGFyZ3VtZW50czsKCiAgQ2FsbCh0aGlzLnRhcmdldCwgdGhpcy5hcmd1bWVudHMsCiAgICAgIHtKYXZhU2NyaXB0Tm9kZVNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9ufSkgewogICAgdGhpcy5fc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKICB9CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRDYWxsKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0Q2FsbCh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgdGFyZ2V0LmFjY2VwdCh2aXNpdG9yKTsKICAgIGZvciAoRXhwcmVzc2lvbiBhcmcgaW4gYXJndW1lbnRzKSB7CiAgICAgIGFyZy5hY2NlcHQodmlzaXRvcik7CiAgICB9CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgdGFyZ2V0LmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIGZvciAoRXhwcmVzc2lvbiBhcmcgaW4gYXJndW1lbnRzKSB7CiAgICAgIGFyZy5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgICB9CiAgfQoKICBDYWxsIF9jbG9uZSgpID0+IG5ldyBDYWxsKHRhcmdldCwgYXJndW1lbnRzKTsKCiAgaW50IGdldCBwcmVjZWRlbmNlTGV2ZWwgPT4gQ0FMTDsKfQoKY2xhc3MgTmV3IGV4dGVuZHMgQ2FsbCB7CiAgTmV3KEV4cHJlc3Npb24gY2xzLCBMaXN0PEV4cHJlc3Npb24+IGFyZ3VtZW50cykgOiBzdXBlcihjbHMsIGFyZ3VtZW50cyk7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXROZXcodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXROZXcodGhpcywgYXJnKTsKCiAgTmV3IF9jbG9uZSgpID0+IG5ldyBOZXcodGFyZ2V0LCBhcmd1bWVudHMpOwp9CgpjbGFzcyBCaW5hcnkgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBmaW5hbCBTdHJpbmcgb3A7CiAgZmluYWwgRXhwcmVzc2lvbiBsZWZ0OwogIGZpbmFsIEV4cHJlc3Npb24gcmlnaHQ7CgogIEJpbmFyeSh0aGlzLm9wLCB0aGlzLmxlZnQsIHRoaXMucmlnaHQpOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0QmluYXJ5KHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0QmluYXJ5KHRoaXMsIGFyZyk7CgogIEJpbmFyeSBfY2xvbmUoKSA9PiBuZXcgQmluYXJ5KG9wLCBsZWZ0LCByaWdodCk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7CiAgICBsZWZ0LmFjY2VwdCh2aXNpdG9yKTsKICAgIHJpZ2h0LmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBsZWZ0LmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIHJpZ2h0LmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICB9CgogIGJvb2wgZ2V0IGlzQ29tbWFPcGVyYXRvciA9PiBvcCA9PSAnLCc7CgogIGludCBnZXQgcHJlY2VkZW5jZUxldmVsIHsKICAgIC8vIFRPRE8oZmxvaXRzY2gpOiBzd2l0Y2ggdG8gY29uc3RhbnQgbWFwLgogICAgc3dpdGNoIChvcCkgewogICAgICBjYXNlICIqIjoKICAgICAgY2FzZSAiLyI6CiAgICAgIGNhc2UgIiUiOgogICAgICAgIHJldHVybiBNVUxUSVBMSUNBVElWRTsKICAgICAgY2FzZSAiKyI6CiAgICAgIGNhc2UgIi0iOgogICAgICAgIHJldHVybiBBRERJVElWRTsKICAgICAgY2FzZSAiPDwiOgogICAgICBjYXNlICI+PiI6CiAgICAgIGNhc2UgIj4+PiI6CiAgICAgICAgcmV0dXJuIFNISUZUOwogICAgICBjYXNlICI8IjoKICAgICAgY2FzZSAiPiI6CiAgICAgIGNhc2UgIjw9IjoKICAgICAgY2FzZSAiPj0iOgogICAgICBjYXNlICJpbnN0YW5jZW9mIjoKICAgICAgY2FzZSAiaW4iOgogICAgICAgIHJldHVybiBSRUxBVElPTkFMOwogICAgICBjYXNlICI9PSI6CiAgICAgIGNhc2UgIj09PSI6CiAgICAgIGNhc2UgIiE9IjoKICAgICAgY2FzZSAiIT09IjoKICAgICAgICByZXR1cm4gRVFVQUxJVFk7CiAgICAgIGNhc2UgIiYiOgogICAgICAgIHJldHVybiBCSVRfQU5EOwogICAgICBjYXNlICJeIjoKICAgICAgICByZXR1cm4gQklUX1hPUjsKICAgICAgY2FzZSAifCI6CiAgICAgICAgcmV0dXJuIEJJVF9PUjsKICAgICAgY2FzZSAiJiYiOgogICAgICAgIHJldHVybiBMT0dJQ0FMX0FORDsKICAgICAgY2FzZSAifHwiOgogICAgICAgIHJldHVybiBMT0dJQ0FMX09SOwogICAgICBjYXNlICcsJzoKICAgICAgICByZXR1cm4gRVhQUkVTU0lPTjsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyAiSW50ZXJuYWwgRXJyb3I6IFVuaGFuZGxlZCBiaW5hcnkgb3BlcmF0b3I6ICRvcCI7CiAgICB9CiAgfQp9CgpjbGFzcyBQcmVmaXggZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBmaW5hbCBTdHJpbmcgb3A7CiAgZmluYWwgRXhwcmVzc2lvbiBhcmd1bWVudDsKCiAgUHJlZml4KHRoaXMub3AsIHRoaXMuYXJndW1lbnQpOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0UHJlZml4KHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0UHJlZml4KHRoaXMsIGFyZyk7CgogIFByZWZpeCBfY2xvbmUoKSA9PiBuZXcgUHJlZml4KG9wLCBhcmd1bWVudCk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7CiAgICBhcmd1bWVudC5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgYXJndW1lbnQuYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogIH0KCiAgaW50IGdldCBwcmVjZWRlbmNlTGV2ZWwgPT4gVU5BUlk7Cn0KCmNsYXNzIFBvc3RmaXggZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBmaW5hbCBTdHJpbmcgb3A7CiAgZmluYWwgRXhwcmVzc2lvbiBhcmd1bWVudDsKCiAgUG9zdGZpeCh0aGlzLm9wLCB0aGlzLmFyZ3VtZW50KTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFBvc3RmaXgodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRQb3N0Zml4KHRoaXMsIGFyZyk7CgogIFBvc3RmaXggX2Nsb25lKCkgPT4gbmV3IFBvc3RmaXgob3AsIGFyZ3VtZW50KTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHsKICAgIGFyZ3VtZW50LmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBhcmd1bWVudC5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgfQoKICBpbnQgZ2V0IHByZWNlZGVuY2VMZXZlbCA9PiBVTkFSWTsKfQoKYWJzdHJhY3QgY2xhc3MgVmFyaWFibGVSZWZlcmVuY2UgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgVmFyaWFibGVSZWZlcmVuY2UodGhpcy5uYW1lKSB7CiAgICBhc3NlcnQoX2lkZW50aWZpZXJSRS5oYXNNYXRjaChuYW1lKSwgIk5vbi1pZGVudGlmaWVyIG5hbWUgJyRuYW1lJyIpOwogIH0KCiAgc3RhdGljIFJlZ0V4cCBfaWRlbnRpZmllclJFID0gbmV3IFJlZ0V4cChyJ15bQS1aYS16XyRdW0EtWmEtel8kMC05XSokJyk7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpOwoKICBpbnQgZ2V0IHByZWNlZGVuY2VMZXZlbCA9PiBQUklNQVJZOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikge30KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHt9Cn0KCmNsYXNzIFZhcmlhYmxlVXNlIGV4dGVuZHMgVmFyaWFibGVSZWZlcmVuY2UgewogIFZhcmlhYmxlVXNlKFN0cmluZyBuYW1lKSA6IHN1cGVyKG5hbWUpOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0VmFyaWFibGVVc2UodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRWYXJpYWJsZVVzZSh0aGlzLCBhcmcpOwoKICBWYXJpYWJsZVVzZSBfY2xvbmUoKSA9PiBuZXcgVmFyaWFibGVVc2UobmFtZSk7CgogIFZhcmlhYmxlVXNlIGFzVmFyaWFibGVVc2UoKSA9PiB0aGlzOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnVmFyaWFibGVVc2UoJG5hbWUpJzsKfQoKY2xhc3MgVmFyaWFibGVEZWNsYXJhdGlvbiBleHRlbmRzIFZhcmlhYmxlUmVmZXJlbmNlIGltcGxlbWVudHMgRGVjbGFyYXRpb24gewogIGZpbmFsIGJvb2wgYWxsb3dSZW5hbWU7CgogIFZhcmlhYmxlRGVjbGFyYXRpb24oU3RyaW5nIG5hbWUsIHt0aGlzLmFsbG93UmVuYW1lOiB0cnVlfSkgOiBzdXBlcihuYW1lKTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24odGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKHRoaXMsIGFyZyk7CgogIFZhcmlhYmxlRGVjbGFyYXRpb24gX2Nsb25lKCkgPT4gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24obmFtZSk7Cn0KCmNsYXNzIFBhcmFtZXRlciBleHRlbmRzIFZhcmlhYmxlRGVjbGFyYXRpb24gewogIFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgOiBzdXBlcihuYW1lKTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFBhcmFtZXRlcih0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdFBhcmFtZXRlcih0aGlzLCBhcmcpOwoKICBQYXJhbWV0ZXIgX2Nsb25lKCkgPT4gbmV3IFBhcmFtZXRlcihuYW1lKTsKfQoKY2xhc3MgVGhpcyBleHRlbmRzIFBhcmFtZXRlciB7CiAgVGhpcygpIDogc3VwZXIoInRoaXMiKTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFRoaXModGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRUaGlzKHRoaXMsIGFyZyk7CgogIFRoaXMgX2Nsb25lKCkgPT4gbmV3IFRoaXMoKTsKfQoKY2xhc3MgTmFtZWRGdW5jdGlvbiBleHRlbmRzIEV4cHJlc3Npb24gewogIGZpbmFsIERlY2xhcmF0aW9uIG5hbWU7CiAgZmluYWwgRnVuIGZ1bmN0aW9uOwoKICBOYW1lZEZ1bmN0aW9uKHRoaXMubmFtZSwgdGhpcy5mdW5jdGlvbik7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXROYW1lZEZ1bmN0aW9uKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0TmFtZWRGdW5jdGlvbih0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgbmFtZS5hY2NlcHQodmlzaXRvcik7CiAgICBmdW5jdGlvbi5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgbmFtZS5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgICBmdW5jdGlvbi5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgfQoKICBOYW1lZEZ1bmN0aW9uIF9jbG9uZSgpID0+IG5ldyBOYW1lZEZ1bmN0aW9uKG5hbWUsIGZ1bmN0aW9uKTsKCiAgaW50IGdldCBwcmVjZWRlbmNlTGV2ZWwgPT4gTEVGVF9IQU5EX1NJREU7Cn0KCmNsYXNzIEZ1biBleHRlbmRzIEV4cHJlc3Npb24gewogIGZpbmFsIExpc3Q8UGFyYW1ldGVyPiBwYXJhbXM7CiAgZmluYWwgQmxvY2sgYm9keTsKICBmaW5hbCBBc3luY01vZGlmaWVyIGFzeW5jTW9kaWZpZXI7CgogIEZ1bih0aGlzLnBhcmFtcywgdGhpcy5ib2R5LCB7dGhpcy5hc3luY01vZGlmaWVyOiBjb25zdCBBc3luY01vZGlmaWVyLnN5bmMoKX0pOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0RnVuKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0RnVuKHRoaXMsIGFyZyk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7CiAgICBmb3IgKFBhcmFtZXRlciBwYXJhbSBpbiBwYXJhbXMpIHBhcmFtLmFjY2VwdCh2aXNpdG9yKTsKICAgIGJvZHkuYWNjZXB0KHZpc2l0b3IpOwogIH0KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHsKICAgIGZvciAoUGFyYW1ldGVyIHBhcmFtIGluIHBhcmFtcykgcGFyYW0uYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogICAgYm9keS5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgfQoKICBGdW4gX2Nsb25lKCkgPT4gbmV3IEZ1bihwYXJhbXMsIGJvZHksIGFzeW5jTW9kaWZpZXI6IGFzeW5jTW9kaWZpZXIpOwoKICBpbnQgZ2V0IHByZWNlZGVuY2VMZXZlbCA9PiBMRUZUX0hBTkRfU0lERTsKfQoKY2xhc3MgQXN5bmNNb2RpZmllciB7CiAgZmluYWwgYm9vbCBpc0FzeW5jOwogIGZpbmFsIGJvb2wgaXNZaWVsZGluZzsKICBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb247CgogIGNvbnN0IEFzeW5jTW9kaWZpZXIuc3luYygpCiAgICAgIDogaXNBc3luYyA9IGZhbHNlLAogICAgICAgIGlzWWllbGRpbmcgPSBmYWxzZSwKICAgICAgICBkZXNjcmlwdGlvbiA9ICJzeW5jIjsKICBjb25zdCBBc3luY01vZGlmaWVyLmFzeW5jKCkKICAgICAgOiBpc0FzeW5jID0gdHJ1ZSwKICAgICAgICBpc1lpZWxkaW5nID0gZmFsc2UsCiAgICAgICAgZGVzY3JpcHRpb24gPSAiYXN5bmMiOwogIGNvbnN0IEFzeW5jTW9kaWZpZXIuYXN5bmNTdGFyKCkKICAgICAgOiBpc0FzeW5jID0gdHJ1ZSwKICAgICAgICBpc1lpZWxkaW5nID0gdHJ1ZSwKICAgICAgICBkZXNjcmlwdGlvbiA9ICJhc3luYyoiOwogIGNvbnN0IEFzeW5jTW9kaWZpZXIuc3luY1N0YXIoKQogICAgICA6IGlzQXN5bmMgPSBmYWxzZSwKICAgICAgICBpc1lpZWxkaW5nID0gdHJ1ZSwKICAgICAgICBkZXNjcmlwdGlvbiA9ICJzeW5jKiI7CiAgdG9TdHJpbmcoKSA9PiBkZXNjcmlwdGlvbjsKfQoKY2xhc3MgUHJvcGVydHlBY2Nlc3MgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBmaW5hbCBFeHByZXNzaW9uIHJlY2VpdmVyOwogIGZpbmFsIEV4cHJlc3Npb24gc2VsZWN0b3I7CgogIFByb3BlcnR5QWNjZXNzKHRoaXMucmVjZWl2ZXIsIHRoaXMuc2VsZWN0b3IpOwoKICBQcm9wZXJ0eUFjY2Vzcy5maWVsZCh0aGlzLnJlY2VpdmVyLCBTdHJpbmcgZmllbGROYW1lKQogICAgICA6IHNlbGVjdG9yID0gbmV3IExpdGVyYWxTdHJpbmcoJyIkZmllbGROYW1lIicpOwoKICBQcm9wZXJ0eUFjY2Vzcy5pbmRleGVkKHRoaXMucmVjZWl2ZXIsIGludCBpbmRleCkKICAgICAgOiBzZWxlY3RvciA9IG5ldyBMaXRlcmFsTnVtYmVyKCckaW5kZXgnKTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdEFjY2Vzcyh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdEFjY2Vzcyh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgcmVjZWl2ZXIuYWNjZXB0KHZpc2l0b3IpOwogICAgc2VsZWN0b3IuYWNjZXB0KHZpc2l0b3IpOwogIH0KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHsKICAgIHJlY2VpdmVyLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIHNlbGVjdG9yLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICB9CgogIFByb3BlcnR5QWNjZXNzIF9jbG9uZSgpID0+IG5ldyBQcm9wZXJ0eUFjY2VzcyhyZWNlaXZlciwgc2VsZWN0b3IpOwoKICBpbnQgZ2V0IHByZWNlZGVuY2VMZXZlbCA9PiBMRUZUX0hBTkRfU0lERTsKfQoKLy8vIEEgW0RlZmVycmVkVG9rZW5dIGlzIGEgcGxhY2Vob2xkZXIgZm9yIHNvbWUgW0V4cHJlc3Npb25dIHRoYXQgaXMgbm90IGtub3duCi8vLyBhdCBjb25zdHJ1Y3Rpb24gdGltZSBvZiBhbiBhc3QuIFVubGlrZSBbSW50ZXJwb2xhdGVkRXhwcmVzc2lvbl0sCi8vLyBbRGVmZXJyZWRUb2tlbl0gaXMgbm90IGxpbWl0ZWQgdG8gdGVtcGxhdGVzIGJ1dCBtYXkgYWxzbyBvY2N1ciBpbgovLy8gZnVsbHkgaW5zdGFudGlhdGVkIGFzdHMuCmFic3RyYWN0IGNsYXNzIERlZmVycmVkVG9rZW4gZXh0ZW5kcyBFeHByZXNzaW9uIHsKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikge30KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHt9CgogIERlZmVycmVkVG9rZW4gX2Nsb25lKCkgPT4gdGhpczsKfQoKLy8vIEludGVyZmFjZSBmb3IgYSBkZWZlcnJlZCBpbnRlZ2VyIHZhbHVlLiBBbiBpbXBsZW1lbnRhdGlvbiBoYXMgdG8gcHJvdmlkZQovLy8gYSB2YWx1ZSB2aWEgdGhlIFt2YWx1ZV0gZ2V0dGVyIHRoZSBsYXRlc3Qgd2hlbiB0aGUgYXN0IGlzIHByaW50ZWQuCmFic3RyYWN0IGNsYXNzIERlZmVycmVkTnVtYmVyIGV4dGVuZHMgRGVmZXJyZWRUb2tlbiBpbXBsZW1lbnRzIExpdGVyYWwgewogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXREZWZlcnJlZE51bWJlcih0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdERlZmVycmVkTnVtYmVyKHRoaXMsIGFyZyk7CgogIGludCBnZXQgdmFsdWU7CgogIGludCBnZXQgcHJlY2VkZW5jZUxldmVsID0+IHZhbHVlLmlzTmVnYXRpdmUgPyBVTkFSWSA6IFBSSU1BUlk7Cn0KCi8vLyBJbnRlcmZhY2UgZm9yIGEgZGVmZXJyZWQgc3RyaW5nIHZhbHVlLiBBbiBpbXBsZW1lbnRhdGlvbiBoYXMgdG8gcHJvdmlkZQovLy8gYSB2YWx1ZSB2aWEgdGhlIFt2YWx1ZV0gZ2V0dGVyIHRoZSBsYXRlc3Qgd2hlbiB0aGUgYXN0IGlzIHByaW50ZWQuCmFic3RyYWN0IGNsYXNzIERlZmVycmVkU3RyaW5nIGV4dGVuZHMgRGVmZXJyZWRUb2tlbiBpbXBsZW1lbnRzIExpdGVyYWwgewogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXREZWZlcnJlZFN0cmluZyh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdERlZmVycmVkU3RyaW5nKHRoaXMsIGFyZyk7CgogIFN0cmluZyBnZXQgdmFsdWU7CgogIGludCBnZXQgcHJlY2VkZW5jZUxldmVsID0+IFBSSU1BUlk7Cn0KCi8vLyBJbnRlcmZhY2UgZm9yIGEgZGVmZXJyZWQgW0V4cHJlc3Npb25dIHZhbHVlLiBBbiBpbXBsZW1lbnRhdGlvbiBoYXMgdG8gcHJvdmlkZQovLy8gYSB2YWx1ZSB2aWEgdGhlIFt2YWx1ZV0gZ2V0dGVyIHRoZSBsYXRlc3Qgd2hlbiB0aGUgYXN0IGlzIHByaW50ZWQuCi8vLyBBbHNvLCBbcHJlY2VkZW5jZUxldmVsXSBoYXMgdG8gcmV0dXJuIHRoZSBzYW1lIHZhbHVlIHRoYXQKLy8vIFt2YWx1ZS5wcmVjZWRlbmNlTGV2ZWxdIHJldHVybnMgb25jZSBbdmFsdWVdIGlzIGJvdW5kIHRvIGFuIFtFeHByZXNzaW9uXS4KYWJzdHJhY3QgY2xhc3MgRGVmZXJyZWRFeHByZXNzaW9uIGV4dGVuZHMgRGVmZXJyZWRUb2tlbiB7CiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdERlZmVycmVkRXhwcmVzc2lvbih0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdERlZmVycmVkRXhwcmVzc2lvbih0aGlzLCBhcmcpOwoKICBFeHByZXNzaW9uIGdldCB2YWx1ZTsKfQoKYWJzdHJhY3QgY2xhc3MgTGl0ZXJhbCBleHRlbmRzIEV4cHJlc3Npb24gewogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7fQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykge30KCiAgaW50IGdldCBwcmVjZWRlbmNlTGV2ZWwgPT4gUFJJTUFSWTsKfQoKY2xhc3MgTGl0ZXJhbEJvb2wgZXh0ZW5kcyBMaXRlcmFsIHsKICBmaW5hbCBib29sIHZhbHVlOwoKICBMaXRlcmFsQm9vbCh0aGlzLnZhbHVlKTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdExpdGVyYWxCb29sKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0TGl0ZXJhbEJvb2wodGhpcywgYXJnKTsKCiAgLy8gW3Zpc2l0Q2hpbGRyZW5dIGluaGVyaXRlZCBmcm9tIFtMaXRlcmFsXS4KCiAgTGl0ZXJhbEJvb2wgX2Nsb25lKCkgPT4gbmV3IExpdGVyYWxCb29sKHZhbHVlKTsKfQoKY2xhc3MgTGl0ZXJhbE51bGwgZXh0ZW5kcyBMaXRlcmFsIHsKICBMaXRlcmFsTnVsbCgpOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0TGl0ZXJhbE51bGwodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRMaXRlcmFsTnVsbCh0aGlzLCBhcmcpOwoKICBMaXRlcmFsTnVsbCBfY2xvbmUoKSA9PiBuZXcgTGl0ZXJhbE51bGwoKTsKfQoKY2xhc3MgTGl0ZXJhbFN0cmluZyBleHRlbmRzIExpdGVyYWwgewogIGZpbmFsIFN0cmluZyB2YWx1ZTsKCiAgLyoqCiAgICogQ29uc3RydWN0cyBhIExpdGVyYWxTdHJpbmcgZnJvbSBhIHN0cmluZyB2YWx1ZS4KICAgKgogICAqIFRoZSBjb25zdHJ1Y3RvciBkb2VzIG5vdCBhZGQgdGhlIHJlcXVpcmVkIHF1b3Rlcy4gIElmIFt2YWx1ZV0gaXMgbm90CiAgICogc3Vycm91bmRlZCBieSBxdW90ZXMgYW5kIHByb3Blcmx5IGVzY2FwZWQsIHRoZSByZXN1bHRpbmcgb2JqZWN0IGlzIGludmFsaWQKICAgKiBhcyBhIEpTIHZhbHVlLgogICAqCiAgICogVE9ETyhzcmEpOiBJbnRyb2R1Y2UgdmFyaWFudHMgZm9yIGtub3duIHZhbGlkIHN0cmluZ3MgdGhhdCBkb24ndCBhbGxvY2F0ZSBhCiAgICogbmV3IHN0cmluZyBqdXN0IHRvIGFkZCBxdW90ZXMuCiAgICovCiAgTGl0ZXJhbFN0cmluZyh0aGlzLnZhbHVlKTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdExpdGVyYWxTdHJpbmcodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRMaXRlcmFsU3RyaW5nKHRoaXMsIGFyZyk7CgogIExpdGVyYWxTdHJpbmcgX2Nsb25lKCkgPT4gbmV3IExpdGVyYWxTdHJpbmcodmFsdWUpOwp9CgpjbGFzcyBTdHJpbmdDb25jYXRlbmF0aW9uIGV4dGVuZHMgTGl0ZXJhbCB7CiAgZmluYWwgTGlzdDxMaXRlcmFsPiBwYXJ0czsKCiAgLyoqCiAgICogQ29uc3RydWN0cyBhIFN0cmluZ0NvbmNhdGVuYXRpb24gZnJvbSBhIGxpc3Qgb2YgTGl0ZXJhbCBlbGVtZW50cy4KICAgKiBUaGUgY29uc3RydWN0b3IgZG9lcyBub3QgYWRkIHN1cnJvdW5kaW5nIHF1b3RlcyB0byB0aGUgcmVzdWx0aW5nCiAgICogY29uY2F0ZW5hdGVkIHN0cmluZy4KICAgKi8KICBTdHJpbmdDb25jYXRlbmF0aW9uKHRoaXMucGFydHMpOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0U3RyaW5nQ29uY2F0ZW5hdGlvbih0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24odGhpcywgYXJnKTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHsKICAgIGZvciAoTGl0ZXJhbCBwYXJ0IGluIHBhcnRzKSBwYXJ0LmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBmb3IgKExpdGVyYWwgcGFydCBpbiBwYXJ0cykgcGFydC5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgfQoKICBTdHJpbmdDb25jYXRlbmF0aW9uIF9jbG9uZSgpID0+IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKHRoaXMucGFydHMpOwp9CgpjbGFzcyBMaXRlcmFsTnVtYmVyIGV4dGVuZHMgTGl0ZXJhbCB7CiAgZmluYWwgU3RyaW5nIHZhbHVlOyAvLyBNdXN0IGJlIGEgdmFsaWQgSmF2YVNjcmlwdCBudW1iZXIgbGl0ZXJhbC4KCiAgTGl0ZXJhbE51bWJlcih0aGlzLnZhbHVlKTsKCiAgaW50IGdldCBwcmVjZWRlbmNlTGV2ZWwgPT4gdmFsdWUuc3RhcnRzV2l0aCgnLScpID8gVU5BUlkgOiBQUklNQVJZOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0TGl0ZXJhbE51bWJlcih0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdExpdGVyYWxOdW1iZXIodGhpcywgYXJnKTsKCiAgTGl0ZXJhbE51bWJlciBfY2xvbmUoKSA9PiBuZXcgTGl0ZXJhbE51bWJlcih2YWx1ZSk7Cn0KCmNsYXNzIEFycmF5SW5pdGlhbGl6ZXIgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IGVsZW1lbnRzOwoKICBBcnJheUluaXRpYWxpemVyKHRoaXMuZWxlbWVudHMpIDogYXNzZXJ0KCFlbGVtZW50cy5jb250YWlucyhudWxsKSk7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRBcnJheUluaXRpYWxpemVyKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0QXJyYXlJbml0aWFsaXplcih0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgZm9yIChFeHByZXNzaW9uIGVsZW1lbnQgaW4gZWxlbWVudHMpIGVsZW1lbnQuYWNjZXB0KHZpc2l0b3IpOwogIH0KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHsKICAgIGZvciAoRXhwcmVzc2lvbiBlbGVtZW50IGluIGVsZW1lbnRzKSBlbGVtZW50LmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICB9CgogIEFycmF5SW5pdGlhbGl6ZXIgX2Nsb25lKCkgPT4gbmV3IEFycmF5SW5pdGlhbGl6ZXIoZWxlbWVudHMpOwoKICBpbnQgZ2V0IHByZWNlZGVuY2VMZXZlbCA9PiBQUklNQVJZOwp9CgovKioKICogQW4gZW1wdHkgcGxhY2UgaW4gYW4gW0FycmF5SW5pdGlhbGl6ZXJdLgogKiBGb3IgZXhhbXBsZSB0aGUgbGlzdCBbMSwgLCAsIDJdIHdvdWxkIGNvbnRhaW4gdHdvIGhvbGVzLgogKi8KY2xhc3MgQXJyYXlIb2xlIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdEFycmF5SG9sZSh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdEFycmF5SG9sZSh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikge30KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHt9CgogIEFycmF5SG9sZSBfY2xvbmUoKSA9PiBuZXcgQXJyYXlIb2xlKCk7CgogIGludCBnZXQgcHJlY2VkZW5jZUxldmVsID0+IFBSSU1BUlk7Cn0KCmNsYXNzIE9iamVjdEluaXRpYWxpemVyIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgZmluYWwgTGlzdDxQcm9wZXJ0eT4gcHJvcGVydGllczsKICBmaW5hbCBib29sIGlzT25lTGluZXI7CgogIC8qKgogICAqIENvbnN0cnVjdHMgYSBuZXcgb2JqZWN0LWluaXRpYWxpemVyIGNvbnRhaW5pbmcgdGhlIGdpdmVuIFtwcm9wZXJ0aWVzXS4KICAgKgogICAqIFtpc09uZUxpbmVyXSBkZXNjcmliZXMgdGhlIGJlaGF2aW91ciB3aGVuIHByZXR0eS1wcmludGluZyAobm9uLW1pbmlmaWVkKS4KICAgKiBJZiB0cnVlIHByaW50IGFsbCBwcm9wZXJ0aWVzIG9uIHRoZSBzYW1lIGxpbmUuCiAgICogSWYgZmFsc2UgcHJpbnQgZWFjaCBwcm9wZXJ0eSBvbiBhIHNlcGVyYXRlIGxpbmUuCiAgICovCiAgT2JqZWN0SW5pdGlhbGl6ZXIodGhpcy5wcm9wZXJ0aWVzLCB7dGhpcy5pc09uZUxpbmVyOiB0cnVlfSk7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRPYmplY3RJbml0aWFsaXplcih0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdE9iamVjdEluaXRpYWxpemVyKHRoaXMsIGFyZyk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7CiAgICBmb3IgKFByb3BlcnR5IGluaXQgaW4gcHJvcGVydGllcykgaW5pdC5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgZm9yIChQcm9wZXJ0eSBpbml0IGluIHByb3BlcnRpZXMpIGluaXQuYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogIH0KCiAgT2JqZWN0SW5pdGlhbGl6ZXIgX2Nsb25lKCkgPT4KICAgICAgbmV3IE9iamVjdEluaXRpYWxpemVyKHByb3BlcnRpZXMsIGlzT25lTGluZXI6IGlzT25lTGluZXIpOwoKICBpbnQgZ2V0IHByZWNlZGVuY2VMZXZlbCA9PiBQUklNQVJZOwp9CgpjbGFzcyBQcm9wZXJ0eSBleHRlbmRzIE5vZGUgewogIGZpbmFsIExpdGVyYWwgbmFtZTsKICBmaW5hbCBFeHByZXNzaW9uIHZhbHVlOwoKICBQcm9wZXJ0eSh0aGlzLm5hbWUsIHRoaXMudmFsdWUpOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0UHJvcGVydHkodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRQcm9wZXJ0eSh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgbmFtZS5hY2NlcHQodmlzaXRvcik7CiAgICB2YWx1ZS5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgbmFtZS5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgICB2YWx1ZS5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgfQoKICBQcm9wZXJ0eSBfY2xvbmUoKSA9PiBuZXcgUHJvcGVydHkobmFtZSwgdmFsdWUpOwp9CgovLy8gVGFnIGNsYXNzIGZvciBhbGwgaW50ZXJwb2xhdGVkIHBvc2l0aW9ucy4KYWJzdHJhY3QgY2xhc3MgSW50ZXJwb2xhdGVkTm9kZSBpbXBsZW1lbnRzIE5vZGUgewogIGdldCBuYW1lT3JQb3NpdGlvbjsKCiAgYm9vbCBnZXQgaXNOYW1lZCA9PiBuYW1lT3JQb3NpdGlvbiBpcyBTdHJpbmc7CgogIGJvb2wgZ2V0IGlzUG9zaXRpb25hbCA9PiBuYW1lT3JQb3NpdGlvbiBpcyBpbnQ7Cn0KCmNsYXNzIEludGVycG9sYXRlZEV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHdpdGggSW50ZXJwb2xhdGVkTm9kZSB7CiAgZmluYWwgbmFtZU9yUG9zaXRpb247CgogIEludGVycG9sYXRlZEV4cHJlc3Npb24odGhpcy5uYW1lT3JQb3NpdGlvbik7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+CiAgICAgIHZpc2l0b3IudmlzaXRJbnRlcnBvbGF0ZWRFeHByZXNzaW9uKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0SW50ZXJwb2xhdGVkRXhwcmVzc2lvbih0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikge30KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHt9CgogIEludGVycG9sYXRlZEV4cHJlc3Npb24gX2Nsb25lKCkgPT4gbmV3IEludGVycG9sYXRlZEV4cHJlc3Npb24obmFtZU9yUG9zaXRpb24pOwoKICBpbnQgZ2V0IHByZWNlZGVuY2VMZXZlbCA9PiBQUklNQVJZOwp9CgpjbGFzcyBJbnRlcnBvbGF0ZWRMaXRlcmFsIGV4dGVuZHMgTGl0ZXJhbCB3aXRoIEludGVycG9sYXRlZE5vZGUgewogIGZpbmFsIG5hbWVPclBvc2l0aW9uOwoKICBJbnRlcnBvbGF0ZWRMaXRlcmFsKHRoaXMubmFtZU9yUG9zaXRpb24pOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0SW50ZXJwb2xhdGVkTGl0ZXJhbCh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdEludGVycG9sYXRlZExpdGVyYWwodGhpcywgYXJnKTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHt9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7fQoKICBJbnRlcnBvbGF0ZWRMaXRlcmFsIF9jbG9uZSgpID0+IG5ldyBJbnRlcnBvbGF0ZWRMaXRlcmFsKG5hbWVPclBvc2l0aW9uKTsKfQoKY2xhc3MgSW50ZXJwb2xhdGVkUGFyYW1ldGVyIGV4dGVuZHMgRXhwcmVzc2lvbgogICAgd2l0aCBJbnRlcnBvbGF0ZWROb2RlCiAgICBpbXBsZW1lbnRzIFBhcmFtZXRlciB7CiAgZmluYWwgbmFtZU9yUG9zaXRpb247CgogIEludGVycG9sYXRlZFBhcmFtZXRlcih0aGlzLm5hbWVPclBvc2l0aW9uKTsKCiAgU3RyaW5nIGdldCBuYW1lIHsKICAgIHRocm93ICJJbnRlcnBvbGF0ZWRQYXJhbWV0ZXIubmFtZSBtdXN0IG5vdCBiZSBpbnZva2VkIjsKICB9CgogIGJvb2wgZ2V0IGFsbG93UmVuYW1lID0+IGZhbHNlOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PgogICAgICB2aXNpdG9yLnZpc2l0SW50ZXJwb2xhdGVkUGFyYW1ldGVyKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0SW50ZXJwb2xhdGVkUGFyYW1ldGVyKHRoaXMsIGFyZyk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7fQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykge30KCiAgSW50ZXJwb2xhdGVkUGFyYW1ldGVyIF9jbG9uZSgpID0+IG5ldyBJbnRlcnBvbGF0ZWRQYXJhbWV0ZXIobmFtZU9yUG9zaXRpb24pOwoKICBpbnQgZ2V0IHByZWNlZGVuY2VMZXZlbCA9PiBQUklNQVJZOwp9CgpjbGFzcyBJbnRlcnBvbGF0ZWRTZWxlY3RvciBleHRlbmRzIEV4cHJlc3Npb24gd2l0aCBJbnRlcnBvbGF0ZWROb2RlIHsKICBmaW5hbCBuYW1lT3JQb3NpdGlvbjsKCiAgSW50ZXJwb2xhdGVkU2VsZWN0b3IodGhpcy5uYW1lT3JQb3NpdGlvbik7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+CiAgICAgIHZpc2l0b3IudmlzaXRJbnRlcnBvbGF0ZWRTZWxlY3Rvcih0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdEludGVycG9sYXRlZFNlbGVjdG9yKHRoaXMsIGFyZyk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7fQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykge30KCiAgSW50ZXJwb2xhdGVkU2VsZWN0b3IgX2Nsb25lKCkgPT4gbmV3IEludGVycG9sYXRlZFNlbGVjdG9yKG5hbWVPclBvc2l0aW9uKTsKCiAgaW50IGdldCBwcmVjZWRlbmNlTGV2ZWwgPT4gUFJJTUFSWTsKfQoKY2xhc3MgSW50ZXJwb2xhdGVkU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHdpdGggSW50ZXJwb2xhdGVkTm9kZSB7CiAgZmluYWwgbmFtZU9yUG9zaXRpb247CgogIEludGVycG9sYXRlZFN0YXRlbWVudCh0aGlzLm5hbWVPclBvc2l0aW9uKTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4KICAgICAgdmlzaXRvci52aXNpdEludGVycG9sYXRlZFN0YXRlbWVudCh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdEludGVycG9sYXRlZFN0YXRlbWVudCh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikge30KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHt9CgogIEludGVycG9sYXRlZFN0YXRlbWVudCBfY2xvbmUoKSA9PiBuZXcgSW50ZXJwb2xhdGVkU3RhdGVtZW50KG5hbWVPclBvc2l0aW9uKTsKfQoKY2xhc3MgSW50ZXJwb2xhdGVkRGVjbGFyYXRpb24gZXh0ZW5kcyBFeHByZXNzaW9uCiAgICB3aXRoIEludGVycG9sYXRlZE5vZGUKICAgIGltcGxlbWVudHMgRGVjbGFyYXRpb24gewogIGZpbmFsIG5hbWVPclBvc2l0aW9uOwoKICBJbnRlcnBvbGF0ZWREZWNsYXJhdGlvbih0aGlzLm5hbWVPclBvc2l0aW9uKTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4KICAgICAgdmlzaXRvci52aXNpdEludGVycG9sYXRlZERlY2xhcmF0aW9uKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0SW50ZXJwb2xhdGVkRGVjbGFyYXRpb24odGhpcywgYXJnKTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHt9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7fQoKICBJbnRlcnBvbGF0ZWREZWNsYXJhdGlvbiBfY2xvbmUoKSB7CiAgICByZXR1cm4gbmV3IEludGVycG9sYXRlZERlY2xhcmF0aW9uKG5hbWVPclBvc2l0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgbmFtZSA9PiB0aHJvdyAiTm8gbmFtZSBmb3IgdGhlIGludGVycG9sYXRlZCBub2RlIjsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBwcmVjZWRlbmNlTGV2ZWwgPT4gUFJJTUFSWTsKfQoKLyoqCiAqIFtSZWdFeHBMaXRlcmFsXXMsIGRlc3BpdGUgYmVpbmcgY2FsbGVkICJMaXRlcmFsIiwgZG8gbm90IGluaGVyaXQgZnJvbQogKiBbTGl0ZXJhbF0uIEluZGVlZCwgcmVndWxhciBleHByZXNzaW9ucyBpbiBKYXZhU2NyaXB0IGhhdmUgYSBzaWRlLWVmZmVjdCBhbmQKICogYXJlIHRodXMgbm90IGluIHRoZSBzYW1lIGNhdGVnb3J5IGFzIG51bWJlcnMgb3Igc3RyaW5ncy4KICovCmNsYXNzIFJlZ0V4cExpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICAvKiogQ29udGFpbnMgdGhlIHBhdHRlcm4gYW5kIHRoZSBmbGFncy4qLwogIGZpbmFsIFN0cmluZyBwYXR0ZXJuOwoKICBSZWdFeHBMaXRlcmFsKHRoaXMucGF0dGVybik7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRSZWdFeHBMaXRlcmFsKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0UmVnRXhwTGl0ZXJhbCh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikge30KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHt9CgogIFJlZ0V4cExpdGVyYWwgX2Nsb25lKCkgPT4gbmV3IFJlZ0V4cExpdGVyYWwocGF0dGVybik7CgogIGludCBnZXQgcHJlY2VkZW5jZUxldmVsID0+IFBSSU1BUlk7Cn0KCi8qKgogKiBBbiBhc3luY2hyb25vdXMgYXdhaXQuCiAqCiAqIE5vdCBwYXJ0IG9mIEphdmFTY3JpcHQuIFdlIGRlc3VnYXIgdGhpcyBleHByZXNzaW9uIGJlZm9yZSBvdXRwdXR0aW5nLgogKiBTaG91bGQgb25seSBvY2N1ciBpbiBhIFtGdW5dIHdpdGggYGFzeW5jTW9kaWZpZXJgIGFzeW5jIG9yIGFzeW5jU3Rhci4KICovCmNsYXNzIEF3YWl0IGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgLyoqIFRoZSBhd2FpdGVkIGV4cHJlc3Npb24uICovCiAgZmluYWwgRXhwcmVzc2lvbiBleHByZXNzaW9uOwoKICBBd2FpdCh0aGlzLmV4cHJlc3Npb24pOwoKICBpbnQgZ2V0IHByZWNlZGVuY2VMZXZlbCA9PiBVTkFSWTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdEF3YWl0KHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0QXdhaXQodGhpcywgYXJnKTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IGV4cHJlc3Npb24uYWNjZXB0KHZpc2l0b3IpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4K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dGVuZXIuZGFydMAASwEvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBqc19iYWNrZW5kLmJhY2tlbmQucmVzb2x1dGlvbl9saXN0ZW5lcjsKCmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnIHNob3cgSWRlbnRpZmllcnM7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgS0NvbW1vbkVsZW1lbnRzLCBLRWxlbWVudEVudmlyb25tZW50OwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZGVmZXJyZWRfbG9hZC5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbnF1ZXVlLmRhcnQnIHNob3cgRW5xdWV1ZXIsIEVucXVldWVyTGlzdGVuZXI7CmltcG9ydCAnLi4vbmF0aXZlL2VucXVldWUuZGFydCc7CmltcG9ydCAnLi4vb3B0aW9ucy5kYXJ0JyBzaG93IENvbXBpbGVyT3B0aW9uczsKaW1wb3J0ICcuLi91bml2ZXJzZS9jYWxsX3N0cnVjdHVyZS5kYXJ0JyBzaG93IENhbGxTdHJ1Y3R1cmU7CmltcG9ydCAnLi4vdW5pdmVyc2UvdXNlLmRhcnQnIHNob3cgU3RhdGljVXNlLCBUeXBlVXNlOwppbXBvcnQgJy4uL3VuaXZlcnNlL3dvcmxkX2ltcGFjdC5kYXJ0JwogICAgc2hvdyBXb3JsZEltcGFjdCwgV29ybGRJbXBhY3RCdWlsZGVyLCBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsOwppbXBvcnQgJ2ZpZWxkX2FuYWx5c2lzLmRhcnQnOwppbXBvcnQgJ2JhY2tlbmRfaW1wYWN0LmRhcnQnOwppbXBvcnQgJ2JhY2tlbmRfdXNhZ2UuZGFydCc7CmltcG9ydCAnY2hlY2tlZF9tb2RlX2hlbHBlcnMuZGFydCc7CmltcG9ydCAnY3VzdG9tX2VsZW1lbnRzX2FuYWx5c2lzLmRhcnQnOwppbXBvcnQgJ2ludGVyY2VwdG9yX2RhdGEuZGFydCc7CmltcG9ydCAnbmF0aXZlX2RhdGEuZGFydCcgc2hvdyBOYXRpdmVCYXNpY0RhdGE7CmltcG9ydCAnbm9fc3VjaF9tZXRob2RfcmVnaXN0cnkuZGFydCc7CgpjbGFzcyBSZXNvbHV0aW9uRW5xdWV1ZXJMaXN0ZW5lciBleHRlbmRzIEVucXVldWVyTGlzdGVuZXIgewogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEF2b2lkIHRoZSBuZWVkIGZvciB0aGlzLgogIGZpbmFsIERlZmVycmVkTG9hZFRhc2sgX2RlZmVycmVkTG9hZFRhc2s7CgogIGZpbmFsIENvbXBpbGVyT3B0aW9ucyBfb3B0aW9uczsKICBmaW5hbCBLRWxlbWVudEVudmlyb25tZW50IF9lbGVtZW50RW52aXJvbm1lbnQ7CiAgZmluYWwgS0NvbW1vbkVsZW1lbnRzIF9jb21tb25FbGVtZW50czsKICBmaW5hbCBCYWNrZW5kSW1wYWN0cyBfaW1wYWN0czsKCiAgZmluYWwgTmF0aXZlQmFzaWNEYXRhIF9uYXRpdmVEYXRhOwogIGZpbmFsIEludGVyY2VwdG9yRGF0YUJ1aWxkZXIgX2ludGVyY2VwdG9yRGF0YTsKICBmaW5hbCBCYWNrZW5kVXNhZ2VCdWlsZGVyIF9iYWNrZW5kVXNhZ2U7CgogIGZpbmFsIE5vU3VjaE1ldGhvZFJlZ2lzdHJ5IF9ub1N1Y2hNZXRob2RSZWdpc3RyeTsKICBmaW5hbCBDdXN0b21FbGVtZW50c1Jlc29sdXRpb25BbmFseXNpcyBfY3VzdG9tRWxlbWVudHNBbmFseXNpczsKCiAgZmluYWwgTmF0aXZlUmVzb2x1dGlvbkVucXVldWVyIF9uYXRpdmVFbnF1ZXVlcjsKICBmaW5hbCBLRmllbGRBbmFseXNpcyBfZmllbGRBbmFseXNpczsKCiAgLy8vIFRydWUgd2hlbiB3ZSBlbnF1ZXVlIHRoZSBsb2FkTGlicmFyeSBjb2RlLgogIGJvb2wgX2lzTG9hZExpYnJhcnlGdW5jdGlvblJlc29sdmVkID0gZmFsc2U7CgogIFJlc29sdXRpb25FbnF1ZXVlckxpc3RlbmVyKAogICAgICB0aGlzLl9vcHRpb25zLAogICAgICB0aGlzLl9lbGVtZW50RW52aXJvbm1lbnQsCiAgICAgIHRoaXMuX2NvbW1vbkVsZW1lbnRzLAogICAgICB0aGlzLl9pbXBhY3RzLAogICAgICB0aGlzLl9uYXRpdmVEYXRhLAogICAgICB0aGlzLl9pbnRlcmNlcHRvckRhdGEsCiAgICAgIHRoaXMuX2JhY2tlbmRVc2FnZSwKICAgICAgdGhpcy5fbm9TdWNoTWV0aG9kUmVnaXN0cnksCiAgICAgIHRoaXMuX2N1c3RvbUVsZW1lbnRzQW5hbHlzaXMsCiAgICAgIHRoaXMuX25hdGl2ZUVucXVldWVyLAogICAgICB0aGlzLl9maWVsZEFuYWx5c2lzLAogICAgICB0aGlzLl9kZWZlcnJlZExvYWRUYXNrKTsKCiAgdm9pZCBfcmVnaXN0ZXJCYWNrZW5kSW1wYWN0KAogICAgICBXb3JsZEltcGFjdEJ1aWxkZXIgYnVpbGRlciwgQmFja2VuZEltcGFjdCBpbXBhY3QpIHsKICAgIGltcGFjdC5yZWdpc3RlckltcGFjdChidWlsZGVyLCBfZWxlbWVudEVudmlyb25tZW50KTsKICAgIF9iYWNrZW5kVXNhZ2UucHJvY2Vzc0JhY2tlbmRJbXBhY3QoaW1wYWN0KTsKICB9CgogIHZvaWQgX2FkZEludGVyY2VwdG9ycyhDbGFzc0VudGl0eSBjbHMsIFdvcmxkSW1wYWN0QnVpbGRlciBpbXBhY3RCdWlsZGVyKSB7CiAgICBfaW50ZXJjZXB0b3JEYXRhLmFkZEludGVyY2VwdG9ycyhjbHMpOwogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclR5cGVVc2UoCiAgICAgICAgbmV3IFR5cGVVc2UuaW5zdGFudGlhdGlvbihfZWxlbWVudEVudmlyb25tZW50LmdldFJhd1R5cGUoY2xzKSkpOwogICAgX2JhY2tlbmRVc2FnZS5yZWdpc3RlckJhY2tlbmRDbGFzc1VzZShjbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgV29ybGRJbXBhY3QgcmVnaXN0ZXJDbG9zdXJpemVkTWVtYmVyKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICAgIFdvcmxkSW1wYWN0QnVpbGRlckltcGwgaW1wYWN0QnVpbGRlciA9IG5ldyBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsKCk7CiAgICBfYmFja2VuZFVzYWdlLnByb2Nlc3NCYWNrZW5kSW1wYWN0KF9pbXBhY3RzLm1lbWJlckNsb3N1cmUpOwogICAgaW1wYWN0QnVpbGRlcgogICAgICAgIC5hZGRJbXBhY3QoX2ltcGFjdHMubWVtYmVyQ2xvc3VyZS5jcmVhdGVJbXBhY3QoX2VsZW1lbnRFbnZpcm9ubWVudCkpOwogICAgRnVuY3Rpb25UeXBlIHR5cGUgPSBfZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZShlbGVtZW50KTsKICAgIGlmICh0eXBlLmNvbnRhaW5zVHlwZVZhcmlhYmxlcykgewogICAgICBpbXBhY3RCdWlsZGVyLmFkZEltcGFjdChfcmVnaXN0ZXJDb21wdXRlU2lnbmF0dXJlKCkpOwogICAgfQogICAgcmV0dXJuIGltcGFjdEJ1aWxkZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBXb3JsZEltcGFjdCByZWdpc3RlckdldE9mU3RhdGljRnVuY3Rpb24oKSB7CiAgICBfYmFja2VuZFVzYWdlLnByb2Nlc3NCYWNrZW5kSW1wYWN0KF9pbXBhY3RzLnN0YXRpY0Nsb3N1cmUpOwogICAgcmV0dXJuIF9pbXBhY3RzLnN0YXRpY0Nsb3N1cmUuY3JlYXRlSW1wYWN0KF9lbGVtZW50RW52aXJvbm1lbnQpOwogIH0KCiAgV29ybGRJbXBhY3QgX3JlZ2lzdGVyQ29tcHV0ZVNpZ25hdHVyZSgpIHsKICAgIF9iYWNrZW5kVXNhZ2UucHJvY2Vzc0JhY2tlbmRJbXBhY3QoX2ltcGFjdHMuY29tcHV0ZVNpZ25hdHVyZSk7CiAgICByZXR1cm4gX2ltcGFjdHMuY29tcHV0ZVNpZ25hdHVyZS5jcmVhdGVJbXBhY3QoX2VsZW1lbnRFbnZpcm9ubWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVySW5zdGFudGlhdGVkVHlwZShJbnRlcmZhY2VUeXBlIHR5cGUsCiAgICAgIHtib29sIGlzR2xvYmFsOiBmYWxzZSwgYm9vbCBuYXRpdmVVc2FnZTogZmFsc2V9KSB7CiAgICBpZiAoaXNHbG9iYWwpIHsKICAgICAgX2JhY2tlbmRVc2FnZS5yZWdpc3Rlckdsb2JhbENsYXNzRGVwZW5kZW5jeSh0eXBlLmVsZW1lbnQpOwogICAgfQogICAgaWYgKG5hdGl2ZVVzYWdlKSB7CiAgICAgIF9uYXRpdmVFbnF1ZXVlci5vbkluc3RhbnRpYXRlZFR5cGUodHlwZSk7CiAgICB9CiAgfQoKICAvLy8gQ29tcHV0ZXMgdGhlIFtXb3JsZEltcGFjdF0gb2YgY2FsbGluZyBbbWFpbk1ldGhvZF0gYXMgdGhlIGVudHJ5IHBvaW50LgogIFdvcmxkSW1wYWN0IF9jb21wdXRlTWFpbkltcGFjdChGdW5jdGlvbkVudGl0eSBtYWluTWV0aG9kKSB7CiAgICBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsIG1haW5JbXBhY3QgPSBuZXcgV29ybGRJbXBhY3RCdWlsZGVySW1wbCgpOwogICAgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlID0gbWFpbk1ldGhvZC5wYXJhbWV0ZXJTdHJ1Y3R1cmUuY2FsbFN0cnVjdHVyZTsKICAgIGlmIChjYWxsU3RydWN0dXJlLmFyZ3VtZW50Q291bnQgPiAwKSB7CiAgICAgIF9pbXBhY3RzLm1haW5XaXRoQXJndW1lbnRzCiAgICAgICAgICAucmVnaXN0ZXJJbXBhY3QobWFpbkltcGFjdCwgX2VsZW1lbnRFbnZpcm9ubWVudCk7CiAgICAgIF9iYWNrZW5kVXNhZ2UucHJvY2Vzc0JhY2tlbmRJbXBhY3QoX2ltcGFjdHMubWFpbldpdGhBcmd1bWVudHMpOwogICAgICBtYWluSW1wYWN0LnJlZ2lzdGVyU3RhdGljVXNlKAogICAgICAgICAgbmV3IFN0YXRpY1VzZS5zdGF0aWNJbnZva2UobWFpbk1ldGhvZCwgY2FsbFN0cnVjdHVyZSkpOwogICAgfQogICAgbWFpbkltcGFjdC5yZWdpc3RlclN0YXRpY1VzZSgKICAgICAgICBuZXcgU3RhdGljVXNlLnN0YXRpY0ludm9rZShtYWluTWV0aG9kLCBDYWxsU3RydWN0dXJlLk5PX0FSR1MpKTsKICAgIHJldHVybiBtYWluSW1wYWN0OwogIH0KCiAgLy8vIFJldHVybnMgdGhlIFtXb3JsZEltcGFjdF0gb2YgZW5hYmxpbmcgZGVmZXJyZWQgbG9hZGluZy4KICBXb3JsZEltcGFjdCBfY29tcHV0ZURlZmVycmVkTG9hZGluZ0ltcGFjdCgpIHsKICAgIF9iYWNrZW5kVXNhZ2UucHJvY2Vzc0JhY2tlbmRJbXBhY3QoX2ltcGFjdHMuZGVmZXJyZWRMb2FkaW5nKTsKICAgIHJldHVybiBfaW1wYWN0cy5kZWZlcnJlZExvYWRpbmcuY3JlYXRlSW1wYWN0KF9lbGVtZW50RW52aXJvbm1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBvblF1ZXVlT3BlbigKICAgICAgRW5xdWV1ZXIgZW5xdWV1ZXIsIEZ1bmN0aW9uRW50aXR5IG1haW5NZXRob2QsIEl0ZXJhYmxlPFVyaT4gbGlicmFyaWVzKSB7CiAgICBpZiAoX2RlZmVycmVkTG9hZFRhc2suaXNQcm9ncmFtU3BsaXQpIHsKICAgICAgZW5xdWV1ZXIuYXBwbHlJbXBhY3QoX2NvbXB1dGVEZWZlcnJlZExvYWRpbmdJbXBhY3QoKSwKICAgICAgICAgIGltcGFjdFNvdXJjZTogJ2RlZmVycmVkIGxvYWQnKTsKICAgIH0KICAgIGVucXVldWVyLmFwcGx5SW1wYWN0KF9uYXRpdmVFbnF1ZXVlci5wcm9jZXNzTmF0aXZlQ2xhc3NlcyhsaWJyYXJpZXMpLAogICAgICAgIGltcGFjdFNvdXJjZTogJ25hdGl2ZSBjbGFzc2VzJyk7CiAgICBpZiAobWFpbk1ldGhvZCAhPSBudWxsKSB7CiAgICAgIGVucXVldWVyLmFwcGx5SW1wYWN0KF9jb21wdXRlTWFpbkltcGFjdChtYWluTWV0aG9kKSwKICAgICAgICAgIGltcGFjdFNvdXJjZTogJ21haW4gaW1wYWN0Jyk7CiAgICB9CiAgICAvLyBFbGVtZW50cyByZXF1aXJlZCBieSBlbnF1ZXVlSGVscGVycyBhcmUgZ2xvYmFsIGRlcGVuZGVuY2llcwogICAgLy8gdGhhdCBhcmUgbm90IHB1bGxlZCBpbiBieSBhIHBhcnRpY3VsYXIgZWxlbWVudC4KICAgIGVucXVldWVyLmFwcGx5SW1wYWN0KGNvbXB1dGVIZWxwZXJzSW1wYWN0KCksIGltcGFjdFNvdXJjZTogJ2hlbHBlcnMnKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb25RdWV1ZUVtcHR5KEVucXVldWVyIGVucXVldWVyLCBJdGVyYWJsZTxDbGFzc0VudGl0eT4gcmVjZW50Q2xhc3NlcykgewogICAgLy8gQWRkIGVsZW1lbnRzIHVzZWQgc3ludGhldGljYWxseSwgdGhhdCBpcywgdGhyb3VnaCBmZWF0dXJlcyByYXRoZXIgdGhhbgogICAgLy8gc3ludGF4LCBmb3IgaW5zdGFuY2UgY3VzdG9tIGVsZW1lbnRzLgogICAgLy8KICAgIC8vIFJldHVybiBlYXJseSBpZiBhbnkgZWxlbWVudHMgYXJlIGFkZGVkIHRvIGF2b2lkIGNvdW50aW5nIHRoZSBlbGVtZW50cyBhcwogICAgLy8gZHVlIHRvIG1pcnJvcnMuCiAgICBlbnF1ZXVlci5hcHBseUltcGFjdChfY3VzdG9tRWxlbWVudHNBbmFseXNpcy5mbHVzaCgpLAogICAgICAgIGltcGFjdFNvdXJjZTogX2N1c3RvbUVsZW1lbnRzQW5hbHlzaXMpOwoKICAgIGZvciAoQ2xhc3NFbnRpdHkgY2xzIGluIHJlY2VudENsYXNzZXMpIHsKICAgICAgTWVtYmVyRW50aXR5IGVsZW1lbnQgPSBfZWxlbWVudEVudmlyb25tZW50Lmxvb2t1cExvY2FsQ2xhc3NNZW1iZXIoCiAgICAgICAgICBjbHMsIElkZW50aWZpZXJzLm5vU3VjaE1ldGhvZF8pOwogICAgICBpZiAoZWxlbWVudCAhPSBudWxsICYmCiAgICAgICAgICBlbGVtZW50LmlzSW5zdGFuY2VNZW1iZXIgJiYKICAgICAgICAgIGVsZW1lbnQuaXNGdW5jdGlvbiAmJgogICAgICAgICAgIWVsZW1lbnQuaXNBYnN0cmFjdCkgewogICAgICAgIF9ub1N1Y2hNZXRob2RSZWdpc3RyeS5yZWdpc3Rlck5vU3VjaE1ldGhvZChlbGVtZW50KTsKICAgICAgfQogICAgfQogICAgX25vU3VjaE1ldGhvZFJlZ2lzdHJ5Lm9uUXVldWVFbXB0eSgpOwogICAgaWYgKCFfYmFja2VuZFVzYWdlLmlzTm9TdWNoTWV0aG9kVXNlZCAmJgogICAgICAgIChfbm9TdWNoTWV0aG9kUmVnaXN0cnkuaGFzVGhyb3dpbmdOb1N1Y2hNZXRob2QgfHwKICAgICAgICAgICAgX25vU3VjaE1ldGhvZFJlZ2lzdHJ5Lmhhc0NvbXBsZXhOb1N1Y2hNZXRob2QpKSB7CiAgICAgIF9iYWNrZW5kVXNhZ2UucHJvY2Vzc0JhY2tlbmRJbXBhY3QoX2ltcGFjdHMubm9TdWNoTWV0aG9kU3VwcG9ydCk7CiAgICAgIGVucXVldWVyLmFwcGx5SW1wYWN0KAogICAgICAgICAgX2ltcGFjdHMubm9TdWNoTWV0aG9kU3VwcG9ydC5jcmVhdGVJbXBhY3QoX2VsZW1lbnRFbnZpcm9ubWVudCkpOwogICAgICBfYmFja2VuZFVzYWdlLmlzTm9TdWNoTWV0aG9kVXNlZCA9IHRydWU7CiAgICB9CgogICAgaWYgKCFlbnF1ZXVlci5xdWV1ZUlzRW1wdHkpIHJldHVybiBmYWxzZTsKCiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgb25RdWV1ZUNsb3NlZCgpIHt9CgogIC8vLyBBZGRzIHRoZSBpbXBhY3Qgb2YgW2NvbnN0YW50XSB0byBbaW1wYWN0QnVpbGRlcl0uCiAgdm9pZCBfY29tcHV0ZUltcGFjdEZvckNvbXBpbGVUaW1lQ29uc3RhbnQoCiAgICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnQsIFdvcmxkSW1wYWN0QnVpbGRlciBpbXBhY3RCdWlsZGVyKSB7CiAgICBfY29tcHV0ZUltcGFjdEZvckNvbXBpbGVUaW1lQ29uc3RhbnRJbnRlcm5hbChjb25zdGFudCwgaW1wYWN0QnVpbGRlcik7CgogICAgZm9yIChDb25zdGFudFZhbHVlIGRlcGVuZGVuY3kgaW4gY29uc3RhbnQuZ2V0RGVwZW5kZW5jaWVzKCkpIHsKICAgICAgX2NvbXB1dGVJbXBhY3RGb3JDb21waWxlVGltZUNvbnN0YW50KGRlcGVuZGVuY3ksIGltcGFjdEJ1aWxkZXIpOwogICAgfQogIH0KCiAgdm9pZCBfY29tcHV0ZUltcGFjdEZvckNvbXBpbGVUaW1lQ29uc3RhbnRJbnRlcm5hbCgKICAgICAgQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgV29ybGRJbXBhY3RCdWlsZGVyIGltcGFjdEJ1aWxkZXIpIHsKICAgIERhcnRUeXBlIHR5cGUgPSBjb25zdGFudC5nZXRUeXBlKF9jb21tb25FbGVtZW50cyk7CiAgICBfY29tcHV0ZUltcGFjdEZvckluc3RhbnRpYXRlZENvbnN0YW50VHlwZSh0eXBlLCBpbXBhY3RCdWlsZGVyKTsKCiAgICBpZiAoY29uc3RhbnQuaXNGdW5jdGlvbikgewogICAgICBGdW5jdGlvbkNvbnN0YW50VmFsdWUgZnVuY3Rpb24gPSBjb25zdGFudDsKICAgICAgaW1wYWN0QnVpbGRlcgogICAgICAgICAgLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3RhdGljVGVhck9mZihmdW5jdGlvbi5lbGVtZW50KSk7CiAgICB9IGVsc2UgaWYgKGNvbnN0YW50LmlzSW50ZXJjZXB0b3IpIHsKICAgICAgLy8gQW4gaW50ZXJjZXB0b3IgY29uc3RhbnQgcmVmZXJlbmNlcyB0aGUgY2xhc3MncyBwcm90b3R5cGUgY2hhaW4uCiAgICAgIEludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZSBpbnRlcmNlcHRvciA9IGNvbnN0YW50OwogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUgPSBfZWxlbWVudEVudmlyb25tZW50LmdldFRoaXNUeXBlKGludGVyY2VwdG9yLmNscyk7CiAgICAgIF9jb21wdXRlSW1wYWN0Rm9ySW5zdGFudGlhdGVkQ29uc3RhbnRUeXBlKHR5cGUsIGltcGFjdEJ1aWxkZXIpOwogICAgfSBlbHNlIGlmIChjb25zdGFudC5pc1R5cGUpIHsKICAgICAgRnVuY3Rpb25FbnRpdHkgaGVscGVyID0gX2NvbW1vbkVsZW1lbnRzLmNyZWF0ZVJ1bnRpbWVUeXBlOwogICAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3RhdGljSW52b2tlKAogICAgICAgICAgaGVscGVyLCBoZWxwZXIucGFyYW1ldGVyU3RydWN0dXJlLmNhbGxTdHJ1Y3R1cmUpKTsKICAgICAgX2JhY2tlbmRVc2FnZS5yZWdpc3RlckJhY2tlbmRGdW5jdGlvblVzZShoZWxwZXIpOwogICAgICBpbXBhY3RCdWlsZGVyCiAgICAgICAgICAucmVnaXN0ZXJUeXBlVXNlKG5ldyBUeXBlVXNlLmluc3RhbnRpYXRpb24oX2NvbW1vbkVsZW1lbnRzLnR5cGVUeXBlKSk7CiAgICB9CiAgfQoKICB2b2lkIF9jb21wdXRlSW1wYWN0Rm9ySW5zdGFudGlhdGVkQ29uc3RhbnRUeXBlKAogICAgICBEYXJ0VHlwZSB0eXBlLCBXb3JsZEltcGFjdEJ1aWxkZXIgaW1wYWN0QnVpbGRlcikgewogICAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyVHlwZVVzZShuZXcgVHlwZVVzZS5pbnN0YW50aWF0aW9uKHR5cGUpKTsKICAgICAgaWYgKHR5cGUuZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMudHlwZUxpdGVyYWxDbGFzcykgewogICAgICAgIC8vIElmIHdlIHVzZSBhIHR5cGUgbGl0ZXJhbCBpbiBhIGNvbnN0YW50LCB0aGUgY29tcGlsZSB0aW1lCiAgICAgICAgLy8gY29uc3RhbnQgZW1pdHRlciB3aWxsIGdlbmVyYXRlIGEgY2FsbCB0byB0aGUgY3JlYXRlUnVudGltZVR5cGUKICAgICAgICAvLyBoZWxwZXIgc28gd2UgcmVnaXN0ZXIgYSB1c2Ugb2YgdGhhdC4KICAgICAgICBGdW5jdGlvbkVudGl0eSBoZWxwZXIgPSBfY29tbW9uRWxlbWVudHMuY3JlYXRlUnVudGltZVR5cGU7CiAgICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN0YXRpY0ludm9rZSgKICAgICAgICAgICAgaGVscGVyLCBoZWxwZXIucGFyYW1ldGVyU3RydWN0dXJlLmNhbGxTdHJ1Y3R1cmUpKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgV29ybGRJbXBhY3QgcmVnaXN0ZXJVc2VkQ29uc3RhbnQoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgV29ybGRJbXBhY3RCdWlsZGVySW1wbCBpbXBhY3RCdWlsZGVyID0gbmV3IFdvcmxkSW1wYWN0QnVpbGRlckltcGwoKTsKICAgIF9jb21wdXRlSW1wYWN0Rm9yQ29tcGlsZVRpbWVDb25zdGFudChjb25zdGFudCwgaW1wYWN0QnVpbGRlcik7CiAgICByZXR1cm4gaW1wYWN0QnVpbGRlcjsKICB9CgogIEBvdmVycmlkZQogIFdvcmxkSW1wYWN0IHJlZ2lzdGVyVXNlZEVsZW1lbnQoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgV29ybGRJbXBhY3RCdWlsZGVySW1wbCB3b3JsZEltcGFjdCA9IG5ldyBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsKCk7CiAgICBfY3VzdG9tRWxlbWVudHNBbmFseXNpcy5yZWdpc3RlclN0YXRpY1VzZShtZW1iZXIpOwoKICAgIGlmIChtZW1iZXIuaXNGdW5jdGlvbikgewogICAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiA9IG1lbWJlcjsKICAgICAgaWYgKGZ1bmN0aW9uLmlzRXh0ZXJuYWwpIHsKICAgICAgICBGdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlID0KICAgICAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRGdW5jdGlvblR5cGUoZnVuY3Rpb24pOwoKICAgICAgICB2YXIgYWxsUGFyYW1ldGVyVHlwZXMgPSA8RGFydFR5cGU+W10KICAgICAgICAgIC4uYWRkQWxsKGZ1bmN0aW9uVHlwZS5wYXJhbWV0ZXJUeXBlcykKICAgICAgICAgIC4uYWRkQWxsKGZ1bmN0aW9uVHlwZS5vcHRpb25hbFBhcmFtZXRlclR5cGVzKQogICAgICAgICAgLi5hZGRBbGwoZnVuY3Rpb25UeXBlLm5hbWVkUGFyYW1ldGVyVHlwZXMpOwogICAgICAgIGZvciAodmFyIHR5cGUgaW4gYWxsUGFyYW1ldGVyVHlwZXMpIHsKICAgICAgICAgIGlmICh0eXBlLmlzRnVuY3Rpb25UeXBlIHx8IHR5cGUuaXNUeXBlZGVmKSB7CiAgICAgICAgICAgIHZhciBjbG9zdXJlQ29udmVydGVyID0gX2NvbW1vbkVsZW1lbnRzLmNsb3N1cmVDb252ZXJ0ZXI7CiAgICAgICAgICAgIHdvcmxkSW1wYWN0LnJlZ2lzdGVyU3RhdGljVXNlKAogICAgICAgICAgICAgICAgbmV3IFN0YXRpY1VzZS5pbXBsaWNpdEludm9rZShjbG9zdXJlQ29udmVydGVyKSk7CiAgICAgICAgICAgIF9iYWNrZW5kVXNhZ2UucmVnaXN0ZXJCYWNrZW5kRnVuY3Rpb25Vc2UoY2xvc3VyZUNvbnZlcnRlcik7CiAgICAgICAgICAgIF9iYWNrZW5kVXNhZ2UucmVnaXN0ZXJHbG9iYWxGdW5jdGlvbkRlcGVuZGVuY3koY2xvc3VyZUNvbnZlcnRlcik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZnVuY3Rpb24uaXNJbnN0YW5jZU1lbWJlcikgewogICAgICAgIENsYXNzRW50aXR5IGNscyA9IGZ1bmN0aW9uLmVuY2xvc2luZ0NsYXNzOwoKICAgICAgICBpZiAoZnVuY3Rpb24ubmFtZSA9PSBJZGVudGlmaWVycy5jYWxsICYmCiAgICAgICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuaXNHZW5lcmljQ2xhc3MoY2xzKSkgewogICAgICAgICAgd29ybGRJbXBhY3QuYWRkSW1wYWN0KF9yZWdpc3RlckNvbXB1dGVTaWduYXR1cmUoKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBfYmFja2VuZFVzYWdlLnJlZ2lzdGVyVXNlZE1lbWJlcihtZW1iZXIpOwoKICAgIGlmIChfY29tbW9uRWxlbWVudHMuaXNDcmVhdGVJbnZvY2F0aW9uTWlycm9ySGVscGVyKG1lbWJlcikpIHsKICAgICAgX3JlZ2lzdGVyQmFja2VuZEltcGFjdCh3b3JsZEltcGFjdCwgX2ltcGFjdHMubm9TdWNoTWV0aG9kU3VwcG9ydCk7CiAgICB9CgogICAgaWYgKF9lbGVtZW50RW52aXJvbm1lbnQuaXNEZWZlcnJlZExvYWRMaWJyYXJ5R2V0dGVyKG1lbWJlcikpIHsKICAgICAgLy8gVE9ETyhzaWd1cmRtKTogQ3JlYXRlIGEgZnVuY3Rpb24gcmVnaXN0ZXJMb2FkTGlicmFyeUFjY2Vzcy4KICAgICAgaWYgKCFfaXNMb2FkTGlicmFyeUZ1bmN0aW9uUmVzb2x2ZWQpIHsKICAgICAgICBfaXNMb2FkTGlicmFyeUZ1bmN0aW9uUmVzb2x2ZWQgPSB0cnVlOwogICAgICAgIF9yZWdpc3RlckJhY2tlbmRJbXBhY3Qod29ybGRJbXBhY3QsIF9pbXBhY3RzLmxvYWRMaWJyYXJ5KTsKICAgICAgfQogICAgfQoKICAgIGlmIChtZW1iZXIuaXNHZXR0ZXIgJiYgbWVtYmVyLm5hbWUgPT0gSWRlbnRpZmllcnMucnVudGltZVR5cGVfKSB7CiAgICAgIC8vIEVuYWJsZSBydW50aW1lIHR5cGUgc3VwcG9ydCBpZiB3ZSBkaXNjb3ZlciBhIGdldHRlciBjYWxsZWQKICAgICAgLy8gcnVudGltZVR5cGUuIFdlIGhhdmUgdG8gZW5hYmxlIHJ1bnRpbWUgdHlwZSBiZWZvcmUgaGl0dGluZyB0aGUKICAgICAgLy8gY29kZWdlbiwgc28gdGhhdCBjb25zdHJ1Y3RvcnMga25vdyB3aGV0aGVyIHRoZXkgbmVlZCB0byBnZW5lcmF0ZSBjb2RlCiAgICAgIC8vIGZvciBydW50aW1lIHR5cGUuCiAgICAgIC8vIFRPRE8oYWhlKTogUmVjb3JkIHByZWNpc2UgZGVwZW5kZW5jeSBoZXJlLgogICAgICB3b3JsZEltcGFjdC5hZGRJbXBhY3QoX3JlZ2lzdGVyUnVudGltZVR5cGUoKSk7CiAgICB9CgogICAgcmV0dXJuIHdvcmxkSW1wYWN0OwogIH0KCiAgLy8vIENhbGxlZCB0byByZWdpc3RlciB0aGF0IHRoZSBgcnVudGltZVR5cGVgIHByb3BlcnR5IGhhcyBiZWVuIGFjY2Vzc2VkLiBBbnkKICAvLy8gYmFja2VuZCBzcGVjaWZpYyBbV29ybGRJbXBhY3RdIG9mIHRoaXMgaXMgcmV0dXJuZWQuCiAgV29ybGRJbXBhY3QgX3JlZ2lzdGVyUnVudGltZVR5cGUoKSB7CiAgICBfYmFja2VuZFVzYWdlLnByb2Nlc3NCYWNrZW5kSW1wYWN0KF9pbXBhY3RzLnJ1bnRpbWVUeXBlU3VwcG9ydCk7CiAgICByZXR1cm4gX2ltcGFjdHMucnVudGltZVR5cGVTdXBwb3J0LmNyZWF0ZUltcGFjdChfZWxlbWVudEVudmlyb25tZW50KTsKICB9CgogIFdvcmxkSW1wYWN0IF9wcm9jZXNzQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsIGltcGFjdEJ1aWxkZXIgPSBuZXcgV29ybGRJbXBhY3RCdWlsZGVySW1wbCgpOwogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogRXh0cmFjdCBhbiBgaW1wbGVtZW50YXRpb25DbGFzc2VzT2YoLi4uKWAgZnVuY3Rpb24KICAgIC8vIGZvciB0aGVzZSBpbnRvIFtDb21tb25FbGVtZW50c10gb3IgW0JhY2tlbmRJbXBhY3RzXS4KICAgIC8vIFJlZ2lzdGVyIGFueSBoZWxwZXIgdGhhdCB3aWxsIGJlIG5lZWRlZCBieSB0aGUgYmFja2VuZC4KICAgIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmludENsYXNzIHx8CiAgICAgICAgY2xzID09IF9jb21tb25FbGVtZW50cy5kb3VibGVDbGFzcyB8fAogICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMubnVtQ2xhc3MpIHsKICAgICAgX3JlZ2lzdGVyQmFja2VuZEltcGFjdChpbXBhY3RCdWlsZGVyLCBfaW1wYWN0cy5udW1DbGFzc2VzKTsKICAgIH0gZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5saXN0Q2xhc3MgfHwKICAgICAgICBjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLnN0cmluZ0NsYXNzKSB7CiAgICAgIF9yZWdpc3RlckJhY2tlbmRJbXBhY3QoaW1wYWN0QnVpbGRlciwgX2ltcGFjdHMubGlzdE9yU3RyaW5nQ2xhc3Nlcyk7CiAgICB9IGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuZnVuY3Rpb25DbGFzcykgewogICAgICBfcmVnaXN0ZXJCYWNrZW5kSW1wYWN0KGltcGFjdEJ1aWxkZXIsIF9pbXBhY3RzLmZ1bmN0aW9uQ2xhc3MpOwogICAgfSBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLm1hcENsYXNzKSB7CiAgICAgIF9yZWdpc3RlckJhY2tlbmRJbXBhY3QoaW1wYWN0QnVpbGRlciwgX2ltcGFjdHMubWFwQ2xhc3MpOwogICAgfSBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLnNldENsYXNzKSB7CiAgICAgIF9yZWdpc3RlckJhY2tlbmRJbXBhY3QoaW1wYWN0QnVpbGRlciwgX2ltcGFjdHMuc2V0Q2xhc3MpOwogICAgfSBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmJvdW5kQ2xvc3VyZUNsYXNzKSB7CiAgICAgIF9yZWdpc3RlckJhY2tlbmRJbXBhY3QoaW1wYWN0QnVpbGRlciwgX2ltcGFjdHMuYm91bmRDbG9zdXJlQ2xhc3MpOwogICAgfSBlbHNlIGlmIChfbmF0aXZlRGF0YS5pc05hdGl2ZU9yRXh0ZW5kc05hdGl2ZShjbHMpKSB7CiAgICAgIF9yZWdpc3RlckJhY2tlbmRJbXBhY3QoaW1wYWN0QnVpbGRlciwgX2ltcGFjdHMubmF0aXZlT3JFeHRlbmRzQ2xhc3MpOwogICAgfSBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLm1hcExpdGVyYWxDbGFzcykgewogICAgICBfcmVnaXN0ZXJCYWNrZW5kSW1wYWN0KGltcGFjdEJ1aWxkZXIsIF9pbXBhY3RzLm1hcExpdGVyYWxDbGFzcyk7CiAgICB9IGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuc2V0TGl0ZXJhbENsYXNzKSB7CiAgICAgIF9yZWdpc3RlckJhY2tlbmRJbXBhY3QoaW1wYWN0QnVpbGRlciwgX2ltcGFjdHMuc2V0TGl0ZXJhbENsYXNzKTsKICAgIH0KICAgIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmNsb3N1cmVDbGFzcykgewogICAgICBfcmVnaXN0ZXJCYWNrZW5kSW1wYWN0KGltcGFjdEJ1aWxkZXIsIF9pbXBhY3RzLmNsb3N1cmVDbGFzcyk7CiAgICB9CiAgICBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5zdHJpbmdDbGFzcyB8fAogICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNTdHJpbmdDbGFzcykgewogICAgICBfYWRkSW50ZXJjZXB0b3JzKF9jb21tb25FbGVtZW50cy5qc1N0cmluZ0NsYXNzLCBpbXBhY3RCdWlsZGVyKTsKICAgIH0gZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5saXN0Q2xhc3MgfHwKICAgICAgICBjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzQXJyYXlDbGFzcyB8fAogICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNGaXhlZEFycmF5Q2xhc3MgfHwKICAgICAgICBjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzRXh0ZW5kYWJsZUFycmF5Q2xhc3MgfHwKICAgICAgICBjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzVW5tb2RpZmlhYmxlQXJyYXlDbGFzcykgewogICAgICBfYWRkSW50ZXJjZXB0b3JzKF9jb21tb25FbGVtZW50cy5qc0FycmF5Q2xhc3MsIGltcGFjdEJ1aWxkZXIpOwogICAgICBfYWRkSW50ZXJjZXB0b3JzKF9jb21tb25FbGVtZW50cy5qc011dGFibGVBcnJheUNsYXNzLCBpbXBhY3RCdWlsZGVyKTsKICAgICAgX2FkZEludGVyY2VwdG9ycyhfY29tbW9uRWxlbWVudHMuanNGaXhlZEFycmF5Q2xhc3MsIGltcGFjdEJ1aWxkZXIpOwogICAgICBfYWRkSW50ZXJjZXB0b3JzKF9jb21tb25FbGVtZW50cy5qc0V4dGVuZGFibGVBcnJheUNsYXNzLCBpbXBhY3RCdWlsZGVyKTsKICAgICAgX2FkZEludGVyY2VwdG9ycyhfY29tbW9uRWxlbWVudHMuanNVbm1vZGlmaWFibGVBcnJheUNsYXNzLCBpbXBhY3RCdWlsZGVyKTsKICAgICAgX3JlZ2lzdGVyQmFja2VuZEltcGFjdChpbXBhY3RCdWlsZGVyLCBfaW1wYWN0cy5saXN0Q2xhc3Nlcyk7CiAgICB9IGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuaW50Q2xhc3MgfHwKICAgICAgICBjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzSW50Q2xhc3MpIHsKICAgICAgX2FkZEludGVyY2VwdG9ycyhfY29tbW9uRWxlbWVudHMuanNJbnRDbGFzcywgaW1wYWN0QnVpbGRlcik7CiAgICAgIF9hZGRJbnRlcmNlcHRvcnMoX2NvbW1vbkVsZW1lbnRzLmpzUG9zaXRpdmVJbnRDbGFzcywgaW1wYWN0QnVpbGRlcik7CiAgICAgIF9hZGRJbnRlcmNlcHRvcnMoX2NvbW1vbkVsZW1lbnRzLmpzVUludDMyQ2xhc3MsIGltcGFjdEJ1aWxkZXIpOwogICAgICBfYWRkSW50ZXJjZXB0b3JzKF9jb21tb25FbGVtZW50cy5qc1VJbnQzMUNsYXNzLCBpbXBhY3RCdWlsZGVyKTsKICAgICAgX2FkZEludGVyY2VwdG9ycyhfY29tbW9uRWxlbWVudHMuanNOdW1iZXJDbGFzcywgaW1wYWN0QnVpbGRlcik7CiAgICB9IGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuZG91YmxlQ2xhc3MgfHwKICAgICAgICBjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzRG91YmxlQ2xhc3MpIHsKICAgICAgX2FkZEludGVyY2VwdG9ycyhfY29tbW9uRWxlbWVudHMuanNEb3VibGVDbGFzcywgaW1wYWN0QnVpbGRlcik7CiAgICAgIF9hZGRJbnRlcmNlcHRvcnMoX2NvbW1vbkVsZW1lbnRzLmpzTnVtYmVyQ2xhc3MsIGltcGFjdEJ1aWxkZXIpOwogICAgfSBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmJvb2xDbGFzcyB8fAogICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNCb29sQ2xhc3MpIHsKICAgICAgX2FkZEludGVyY2VwdG9ycyhfY29tbW9uRWxlbWVudHMuanNCb29sQ2xhc3MsIGltcGFjdEJ1aWxkZXIpOwogICAgfSBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLm51bGxDbGFzcyB8fAogICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNOdWxsQ2xhc3MpIHsKICAgICAgX2FkZEludGVyY2VwdG9ycyhfY29tbW9uRWxlbWVudHMuanNOdWxsQ2xhc3MsIGltcGFjdEJ1aWxkZXIpOwogICAgfSBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLm51bUNsYXNzIHx8CiAgICAgICAgY2xzID09IF9jb21tb25FbGVtZW50cy5qc051bWJlckNsYXNzKSB7CiAgICAgIF9hZGRJbnRlcmNlcHRvcnMoX2NvbW1vbkVsZW1lbnRzLmpzSW50Q2xhc3MsIGltcGFjdEJ1aWxkZXIpOwogICAgICBfYWRkSW50ZXJjZXB0b3JzKF9jb21tb25FbGVtZW50cy5qc1Bvc2l0aXZlSW50Q2xhc3MsIGltcGFjdEJ1aWxkZXIpOwogICAgICBfYWRkSW50ZXJjZXB0b3JzKF9jb21tb25FbGVtZW50cy5qc1VJbnQzMkNsYXNzLCBpbXBhY3RCdWlsZGVyKTsKICAgICAgX2FkZEludGVyY2VwdG9ycyhfY29tbW9uRWxlbWVudHMuanNVSW50MzFDbGFzcywgaW1wYWN0QnVpbGRlcik7CiAgICAgIF9hZGRJbnRlcmNlcHRvcnMoX2NvbW1vbkVsZW1lbnRzLmpzRG91YmxlQ2xhc3MsIGltcGFjdEJ1aWxkZXIpOwogICAgICBfYWRkSW50ZXJjZXB0b3JzKF9jb21tb25FbGVtZW50cy5qc051bWJlckNsYXNzLCBpbXBhY3RCdWlsZGVyKTsKICAgIH0gZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5qc0phdmFTY3JpcHRPYmplY3RDbGFzcykgewogICAgICBfYWRkSW50ZXJjZXB0b3JzKF9jb21tb25FbGVtZW50cy5qc0phdmFTY3JpcHRPYmplY3RDbGFzcywgaW1wYWN0QnVpbGRlcik7CiAgICB9IGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNQbGFpbkphdmFTY3JpcHRPYmplY3RDbGFzcykgewogICAgICBfYWRkSW50ZXJjZXB0b3JzKAogICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmpzUGxhaW5KYXZhU2NyaXB0T2JqZWN0Q2xhc3MsIGltcGFjdEJ1aWxkZXIpOwogICAgfSBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzVW5rbm93bkphdmFTY3JpcHRPYmplY3RDbGFzcykgewogICAgICBfYWRkSW50ZXJjZXB0b3JzKAogICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmpzVW5rbm93bkphdmFTY3JpcHRPYmplY3RDbGFzcywgaW1wYWN0QnVpbGRlcik7CiAgICB9IGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNKYXZhU2NyaXB0RnVuY3Rpb25DbGFzcykgewogICAgICBfYWRkSW50ZXJjZXB0b3JzKAogICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmpzSmF2YVNjcmlwdEZ1bmN0aW9uQ2xhc3MsIGltcGFjdEJ1aWxkZXIpOwogICAgfSBlbHNlIGlmIChfbmF0aXZlRGF0YS5pc05hdGl2ZU9yRXh0ZW5kc05hdGl2ZShjbHMpKSB7CiAgICAgIF9pbnRlcmNlcHRvckRhdGEuYWRkSW50ZXJjZXB0b3JzRm9yTmF0aXZlQ2xhc3NNZW1iZXJzKGNscyk7CiAgICB9IGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNJbmRleGluZ0JlaGF2aW9ySW50ZXJmYWNlKSB7CiAgICAgIF9yZWdpc3RlckJhY2tlbmRJbXBhY3QoaW1wYWN0QnVpbGRlciwgX2ltcGFjdHMuanNJbmRleGluZ0JlaGF2aW9yKTsKICAgIH0KCiAgICBfY3VzdG9tRWxlbWVudHNBbmFseXNpcy5yZWdpc3Rlckluc3RhbnRpYXRlZENsYXNzKGNscyk7CiAgICByZXR1cm4gaW1wYWN0QnVpbGRlcjsKICB9CgogIEBvdmVycmlkZQogIFdvcmxkSW1wYWN0IHJlZ2lzdGVySW1wbGVtZW50ZWRDbGFzcyhDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBfcHJvY2Vzc0NsYXNzKGNscyk7CiAgfQoKICBAb3ZlcnJpZGUKICBXb3JsZEltcGFjdCByZWdpc3Rlckluc3RhbnRpYXRlZENsYXNzKENsYXNzRW50aXR5IGNscykgewogICAgX2ZpZWxkQW5hbHlzaXMucmVnaXN0ZXJJbnN0YW50aWF0ZWRDbGFzcyhjbHMpOwogICAgcmV0dXJuIF9wcm9jZXNzQ2xhc3MoY2xzKTsKICB9CgogIC8vLyBDb21wdXRlIHRoZSBbV29ybGRJbXBhY3RdIGZvciBiYWNrZW5kIGhlbHBlciBtZXRob2RzLgogIFdvcmxkSW1wYWN0IGNvbXB1dGVIZWxwZXJzSW1wYWN0KCkgewogICAgYXNzZXJ0KF9jb21tb25FbGVtZW50cy5pbnRlcmNlcHRvcnNMaWJyYXJ5ICE9IG51bGwpOwogICAgV29ybGRJbXBhY3RCdWlsZGVySW1wbCBpbXBhY3RCdWlsZGVyID0gbmV3IFdvcmxkSW1wYWN0QnVpbGRlckltcGwoKTsKICAgIC8vIFRPRE8obmdlb2ZmcmF5KTogTm90IGVucXVldWluZyB0aG9zZSB0d28gY2xhc3NlcyBjdXJyZW50bHkgbWFrZQogICAgLy8gdGhlIGNvbXBpbGVyIHBvdGVudGlhbGx5IGNyYXNoLiBIb3dldmVyLCBhbnkgcmVhc29uYWJsZSBwcm9ncmFtCiAgICAvLyB3aWxsIGluc3RhbnRpYXRlIHRob3NlIHR3byBjbGFzc2VzLgogICAgX2FkZEludGVyY2VwdG9ycyhfY29tbW9uRWxlbWVudHMuanNCb29sQ2xhc3MsIGltcGFjdEJ1aWxkZXIpOwogICAgX2FkZEludGVyY2VwdG9ycyhfY29tbW9uRWxlbWVudHMuanNOdWxsQ2xhc3MsIGltcGFjdEJ1aWxkZXIpOwogICAgaWYgKF9vcHRpb25zLmRpc2FibGVSdGlPcHRpbWl6YXRpb24pIHsKICAgICAgLy8gV2hlbiBSVEkgb3B0aW1pemF0aW9uIGlzIGRpc2FibGVkIHdlIGFsd2F5cyBuZWVkIGFsbCBSVEkgaGVscGVycywgc28KICAgICAgLy8gcmVnaXN0ZXIgdGhlc2UgaGVyZS4KICAgICAgX3JlZ2lzdGVyQmFja2VuZEltcGFjdChpbXBhY3RCdWlsZGVyLCBfaW1wYWN0cy5jb21wdXRlU2lnbmF0dXJlKTsKICAgICAgX3JlZ2lzdGVyQmFja2VuZEltcGFjdChpbXBhY3RCdWlsZGVyLCBfaW1wYWN0cy5nZXRSdW50aW1lVHlwZUFyZ3VtZW50KTsKICAgIH0KCiAgICBpZiAoX29wdGlvbnMuZXhwZXJpbWVudENhbGxJbnN0cnVtZW50YXRpb24pIHsKICAgICAgX3JlZ2lzdGVyQmFja2VuZEltcGFjdChpbXBhY3RCdWlsZGVyLCBfaW1wYWN0cy50cmFjZUhlbHBlcik7CiAgICB9CiAgICBfcmVnaXN0ZXJCYWNrZW5kSW1wYWN0KGltcGFjdEJ1aWxkZXIsIF9pbXBhY3RzLmFzc2VydFVucmVhY2hhYmxlKTsKICAgIF9yZWdpc3RlckNoZWNrZWRNb2RlSGVscGVycyhpbXBhY3RCdWlsZGVyKTsKICAgIHJldHVybiBpbXBhY3RCdWlsZGVyOwogIH0KCiAgdm9pZCBfcmVnaXN0ZXJDaGVja2VkTW9kZUhlbHBlcnMoV29ybGRJbXBhY3RCdWlsZGVyIGltcGFjdEJ1aWxkZXIpIHsKICAgIC8vIFdlIHJlZ2lzdGVyIGFsbCB0aGUgX2NvbW1vbkVsZW1lbnRzIGluIHRoZSByZXNvbHV0aW9uIHF1ZXVlLgogICAgLy8gVE9ETygxMzE1NSk6IEZpbmQgYSB3YXkgdG8gcmVnaXN0ZXIgZmV3ZXIgX2NvbW1vbkVsZW1lbnRzLgogICAgTGlzdDxGdW5jdGlvbkVudGl0eT4gc3RhdGljVXNlcyA9IDxGdW5jdGlvbkVudGl0eT5bXTsKICAgIGZvciAoQ2hlY2tlZE1vZGVIZWxwZXIgaGVscGVyIGluIENoZWNrZWRNb2RlSGVscGVycy5oZWxwZXJzKSB7CiAgICAgIHN0YXRpY1VzZXMuYWRkKGhlbHBlci5nZXRTdGF0aWNVc2UoX2NvbW1vbkVsZW1lbnRzKS5lbGVtZW50KTsKICAgIH0KICAgIF9yZWdpc3RlckJhY2tlbmRJbXBhY3QoCiAgICAgICAgaW1wYWN0QnVpbGRlciwgbmV3IEJhY2tlbmRJbXBhY3QoZ2xvYmFsVXNlczogc3RhdGljVXNlcykpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBsb2dTdW1tYXJ5KHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSkgewogICAgX25hdGl2ZUVucXVldWVyLmxvZ1N1bW1hcnkobG9nKTsKICB9Cn0KgckATk48ATABMEwjICQhOiEvPTcnQh4eHSQoIDAnATwzLAEiMSkhASUxKwE0QgEyJwExLwEeFSAcFRgdGiIkHBsfAR86OTAEAU0rI0kwBAEMQUlAEk5GJjwGGgQBDC5ARQQBLENIBAEMNDkUQQYXMAYEAU0+Rk8rITxGJEIGIkgXBAE+MEJHBAEMFE8sPCoGSikeOygGQzdLBAEMTk4tB1AXOjABLUkrHSYgIT0IBiotOj1IHEsvBgEuAREEAQwaATgtQksBQ0cGBAE1QjdEAR8xFE0pSTdNRiJBQj04FFEGBAEyOSFGPkRKMENEPwgGBAEMPUlDGgQBDDlHNwEdKCEkOwEtMDg2LjdFK0FIThMMCggnMwExNz4KCAYuAUJJBgFDRS0vQwgGAUZESE8bNDUGARgEAVA6J0VKBAEvSU88PysuK0IzLks3RTJAMkA7STtMOUc5RwYvRAYuMEYzLzQ5O0VMSk9RQzItQ0tGRkY1MEZGMy5EMy5EMjBDS0ZGRkZBUEYYSEgYSkMYRTtCRUoGATwaBAEMOh8EAQw7Mx8EATwnOUlHRytCQitOHkhOBgEyQwZHMBoEAUdEQjpDRAYcQwQBDC4lBAIBOHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvcmVzb2x1dGlvbl9saXN0ZW5lci5kYXJ0OHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3VuaXZlcnNlL3NpZGVfZWZmZWN0cy5kYXJ0oT4vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSB1bml2ZXJzZS5zaWRlX2VmZmVjdHM7CgppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0JzsKCmNsYXNzIFNpZGVFZmZlY3RzIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW1NpZGVFZmZlY3RzXSBvYmplY3RzIGluIGEgZGVidWdnaW5nCiAgLy8vIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ3NpZGUtZWZmZWN0cyc7CgogIC8vIENoYW5nZXMgZmxhZ3MuCiAgc3RhdGljIGNvbnN0IGludCBGTEFHX0NIQU5HRVNfSU5ERVggPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgRkxBR19DSEFOR0VTX0lOU1RBTkNFX1BST1BFUlRZID0gRkxBR19DSEFOR0VTX0lOREVYICsgMTsKICBzdGF0aWMgY29uc3QgaW50IEZMQUdfQ0hBTkdFU19TVEFUSUNfUFJPUEVSVFkgPQogICAgICBGTEFHX0NIQU5HRVNfSU5TVEFOQ0VfUFJPUEVSVFkgKyAxOwogIHN0YXRpYyBjb25zdCBpbnQgRkxBR19DSEFOR0VTX0NPVU5UID0gRkxBR19DSEFOR0VTX1NUQVRJQ19QUk9QRVJUWSArIDE7CgogIC8vIERlcGVuZHMgZmxhZ3MgKG9uZSBmb3IgZWFjaCBjaGFuZ2VzIGZsYWcpLgogIHN0YXRpYyBjb25zdCBpbnQgRkxBR19ERVBFTkRTX09OX0lOREVYX1NUT1JFID0gRkxBR19DSEFOR0VTX0NPVU5UOwogIHN0YXRpYyBjb25zdCBpbnQgRkxBR19ERVBFTkRTX09OX0lOU1RBTkNFX1BST1BFUlRZX1NUT1JFID0KICAgICAgRkxBR19ERVBFTkRTX09OX0lOREVYX1NUT1JFICsgMTsKICBzdGF0aWMgY29uc3QgaW50IEZMQUdfREVQRU5EU19PTl9TVEFUSUNfUFJPUEVSVFlfU1RPUkUgPQogICAgICBGTEFHX0RFUEVORFNfT05fSU5TVEFOQ0VfUFJPUEVSVFlfU1RPUkUgKyAxOwogIHN0YXRpYyBjb25zdCBpbnQgRkxBR19ERVBFTkRTX09OX0NPVU5UID0KICAgICAgRkxBR19ERVBFTkRTX09OX1NUQVRJQ19QUk9QRVJUWV9TVE9SRSArIDE7CgogIGludCBfZmxhZ3MgPSAwOwoKICBTaWRlRWZmZWN0cygpIHsKICAgIHNldEFsbFNpZGVFZmZlY3RzKCk7CiAgICBzZXREZXBlbmRzT25Tb21ldGhpbmcoKTsKICB9CgogIFNpZGVFZmZlY3RzLmVtcHR5KCkgewogICAgY2xlYXJBbGxEZXBlbmRlbmNpZXMoKTsKICAgIGNsZWFyQWxsU2lkZUVmZmVjdHMoKTsKICB9CgogIFNpZGVFZmZlY3RzLmZyb21GbGFncyh0aGlzLl9mbGFncyk7CgogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbU2lkZUVmZmVjdHNdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgU2lkZUVmZmVjdHMucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGludCBmbGFncyA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IFNpZGVFZmZlY3RzLmZyb21GbGFncyhmbGFncyk7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtTaWRlRWZmZWN0c10gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVJbnQoX2ZsYWdzKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSA9PiBfZmxhZ3MgPT0gb3RoZXIuX2ZsYWdzOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdTaWRlRWZmZWN0cy5oYXNoQ29kZScpOwoKICBib29sIF9nZXRGbGFnKGludCBwb3NpdGlvbikgewogICAgcmV0dXJuIChfZmxhZ3MgJiAoMSA8PCBwb3NpdGlvbikpICE9IDA7CiAgfQoKICBib29sIF9zZXRGbGFnKGludCBwb3NpdGlvbikgewogICAgaW50IGJlZm9yZSA9IF9mbGFnczsKICAgIF9mbGFncyB8PSAoMSA8PCBwb3NpdGlvbik7CiAgICByZXR1cm4gYmVmb3JlICE9IF9mbGFnczsKICB9CgogIGJvb2wgX2NsZWFyRmxhZyhpbnQgcG9zaXRpb24pIHsKICAgIGludCBiZWZvcmUgPSBfZmxhZ3M7CiAgICBfZmxhZ3MgJj0gfigxIDw8IHBvc2l0aW9uKTsKICAgIHJldHVybiBiZWZvcmUgIT0gX2ZsYWdzOwogIH0KCiAgaW50IGdldENoYW5nZXNGbGFncygpIHsKICAgIHJldHVybiBfZmxhZ3MgJiAoKDEgPDwgRkxBR19DSEFOR0VTX0NPVU5UKSAtIDEpOwogIH0KCiAgaW50IGdldERlcGVuZHNPbkZsYWdzKCkgewogICAgcmV0dXJuIChfZmxhZ3MgJiAoKDEgPDwgRkxBR19ERVBFTkRTX09OX0NPVU5UKSAtIDEpKSA+PiBGTEFHX0NIQU5HRVNfQ09VTlQ7CiAgfQoKICBib29sIGhhc1NpZGVFZmZlY3RzKCkgPT4gZ2V0Q2hhbmdlc0ZsYWdzKCkgIT0gMDsKICBib29sIGRlcGVuZHNPblNvbWV0aGluZygpID0+IGdldERlcGVuZHNPbkZsYWdzKCkgIT0gMDsKCiAgYm9vbCBzZXRBbGxTaWRlRWZmZWN0cygpIHsKICAgIGludCBiZWZvcmUgPSBfZmxhZ3M7CiAgICBfZmxhZ3MgfD0gKCgxIDw8IEZMQUdfQ0hBTkdFU19DT1VOVCkgLSAxKTsKICAgIHJldHVybiBiZWZvcmUgIT0gX2ZsYWdzOwogIH0KCiAgYm9vbCBjbGVhckFsbFNpZGVFZmZlY3RzKCkgewogICAgaW50IGJlZm9yZSA9IF9mbGFnczsKICAgIF9mbGFncyAmPSB+KCgxIDw8IEZMQUdfQ0hBTkdFU19DT1VOVCkgLSAxKTsKICAgIHJldHVybiBiZWZvcmUgIT0gX2ZsYWdzOwogIH0KCiAgYm9vbCBzZXREZXBlbmRzT25Tb21ldGhpbmcoKSB7CiAgICBpbnQgYmVmb3JlID0gX2ZsYWdzOwogICAgaW50IGNvdW50ID0gRkxBR19ERVBFTkRTX09OX0NPVU5UIC0gRkxBR19DSEFOR0VTX0NPVU5UOwogICAgX2ZsYWdzIHw9ICgoKDEgPDwgY291bnQpIC0gMSkgPDwgRkxBR19DSEFOR0VTX0NPVU5UKTsKICAgIHJldHVybiBiZWZvcmUgIT0gX2ZsYWdzOwogIH0KCiAgYm9vbCBjbGVhckFsbERlcGVuZGVuY2llcygpIHsKICAgIGludCBiZWZvcmUgPSBfZmxhZ3M7CiAgICBpbnQgY291bnQgPSBGTEFHX0RFUEVORFNfT05fQ09VTlQgLSBGTEFHX0NIQU5HRVNfQ09VTlQ7CiAgICBfZmxhZ3MgJj0gfigoKDEgPDwgY291bnQpIC0gMSkgPDwgRkxBR19DSEFOR0VTX0NPVU5UKTsKICAgIHJldHVybiBiZWZvcmUgIT0gX2ZsYWdzOwogIH0KCiAgYm9vbCBkZXBlbmRzT25TdGF0aWNQcm9wZXJ0eVN0b3JlKCkgewogICAgcmV0dXJuIF9nZXRGbGFnKEZMQUdfREVQRU5EU19PTl9TVEFUSUNfUFJPUEVSVFlfU1RPUkUpOwogIH0KCiAgYm9vbCBzZXREZXBlbmRzT25TdGF0aWNQcm9wZXJ0eVN0b3JlKCkgewogICAgcmV0dXJuIF9zZXRGbGFnKEZMQUdfREVQRU5EU19PTl9TVEFUSUNfUFJPUEVSVFlfU1RPUkUpOwogIH0KCiAgYm9vbCBjbGVhckRlcGVuZHNPblN0YXRpY1Byb3BlcnR5U3RvcmUoKSB7CiAgICByZXR1cm4gX2NsZWFyRmxhZyhGTEFHX0RFUEVORFNfT05fU1RBVElDX1BST1BFUlRZX1NUT1JFKTsKICB9CgogIGJvb2wgc2V0Q2hhbmdlc1N0YXRpY1Byb3BlcnR5KCkgewogICAgcmV0dXJuIF9zZXRGbGFnKEZMQUdfQ0hBTkdFU19TVEFUSUNfUFJPUEVSVFkpOwogIH0KCiAgYm9vbCBjbGVhckNoYW5nZXNTdGF0aWNQcm9wZXJ0eSgpIHsKICAgIHJldHVybiBfY2xlYXJGbGFnKEZMQUdfQ0hBTkdFU19TVEFUSUNfUFJPUEVSVFkpOwogIH0KCiAgYm9vbCBjaGFuZ2VzU3RhdGljUHJvcGVydHkoKSA9PiBfZ2V0RmxhZyhGTEFHX0NIQU5HRVNfU1RBVElDX1BST1BFUlRZKTsKCiAgYm9vbCBkZXBlbmRzT25JbmRleFN0b3JlKCkgPT4gX2dldEZsYWcoRkxBR19ERVBFTkRTX09OX0lOREVYX1NUT1JFKTsKCiAgYm9vbCBzZXREZXBlbmRzT25JbmRleFN0b3JlKCkgewogICAgcmV0dXJuIF9zZXRGbGFnKEZMQUdfREVQRU5EU19PTl9JTkRFWF9TVE9SRSk7CiAgfQoKICBib29sIGNsZWFyRGVwZW5kc09uSW5kZXhTdG9yZSgpIHsKICAgIHJldHVybiBfY2xlYXJGbGFnKEZMQUdfREVQRU5EU19PTl9JTkRFWF9TVE9SRSk7CiAgfQoKICBib29sIHNldENoYW5nZXNJbmRleCgpIHsKICAgIHJldHVybiBfc2V0RmxhZyhGTEFHX0NIQU5HRVNfSU5ERVgpOwogIH0KCiAgYm9vbCBjbGVhckNoYW5nZXNJbmRleCgpIHsKICAgIHJldHVybiBfY2xlYXJGbGFnKEZMQUdfQ0hBTkdFU19JTkRFWCk7CiAgfQoKICBib29sIGNoYW5nZXNJbmRleCgpID0+IF9nZXRGbGFnKEZMQUdfQ0hBTkdFU19JTkRFWCk7CgogIGJvb2wgZGVwZW5kc09uSW5zdGFuY2VQcm9wZXJ0eVN0b3JlKCkgewogICAgcmV0dXJuIF9nZXRGbGFnKEZMQUdfREVQRU5EU19PTl9JTlNUQU5DRV9QUk9QRVJUWV9TVE9SRSk7CiAgfQoKICBib29sIHNldERlcGVuZHNPbkluc3RhbmNlUHJvcGVydHlTdG9yZSgpIHsKICAgIHJldHVybiBfc2V0RmxhZyhGTEFHX0RFUEVORFNfT05fSU5TVEFOQ0VfUFJPUEVSVFlfU1RPUkUpOwogIH0KCiAgYm9vbCBjbGVhckRlcGVuZHNPbkluc3RhbmNlUHJvcGVydHlTdG9yZSgpIHsKICAgIHJldHVybiBfc2V0RmxhZyhGTEFHX0RFUEVORFNfT05fSU5TVEFOQ0VfUFJPUEVSVFlfU1RPUkUpOwogIH0KCiAgYm9vbCBzZXRDaGFuZ2VzSW5zdGFuY2VQcm9wZXJ0eSgpIHsKICAgIHJldHVybiBfc2V0RmxhZyhGTEFHX0NIQU5HRVNfSU5TVEFOQ0VfUFJPUEVSVFkpOwogIH0KCiAgYm9vbCBjbGVhckNoYW5nZXNJbnN0YW5jZVByb3BlcnR5KCkgewogICAgcmV0dXJuIF9jbGVhckZsYWcoRkxBR19DSEFOR0VTX0lOU1RBTkNFX1BST1BFUlRZKTsKICB9CgogIGJvb2wgY2hhbmdlc0luc3RhbmNlUHJvcGVydHkoKSA9PiBfZ2V0RmxhZyhGTEFHX0NIQU5HRVNfSU5TVEFOQ0VfUFJPUEVSVFkpOwoKICBzdGF0aWMgaW50IGNvbXB1dGVEZXBlbmRzT25GbGFncyhpbnQgZmxhZ3MpID0+IGZsYWdzIDw8IEZMQUdfQ0hBTkdFU19DT1VOVDsKCiAgYm9vbCBkZXBlbmRzT24oaW50IGRlcGVuZHNGbGFncykgewogICAgcmV0dXJuIChfZmxhZ3MgJiBkZXBlbmRzRmxhZ3MpICE9IDA7CiAgfQoKICBib29sIGFkZChTaWRlRWZmZWN0cyBvdGhlcikgewogICAgaW50IGJlZm9yZSA9IF9mbGFnczsKICAgIF9mbGFncyB8PSBvdGhlci5fZmxhZ3M7CiAgICByZXR1cm4gYmVmb3JlICE9IF9mbGFnczsKICB9CgogIHZvaWQgc2V0VG8oU2lkZUVmZmVjdHMgb3RoZXIpIHsKICAgIF9mbGFncyA9IG90aGVyLl9mbGFnczsKICB9CgogIGJvb2wgY29udGFpbnMoU2lkZUVmZmVjdHMgb3RoZXIpIHsKICAgIHJldHVybiAoX2ZsYWdzIHwgb3RoZXIuX2ZsYWdzKSA9PSBfZmxhZ3M7CiAgfQoKICBpbnQgZ2V0IGZsYWdzID0+IF9mbGFnczsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGJ1ZmZlci53cml0ZSgnU2lkZUVmZmVjdHMocmVhZHMnKTsKICAgIGlmICghZGVwZW5kc09uU29tZXRoaW5nKCkpIHsKICAgICAgYnVmZmVyLndyaXRlKCcgbm90aGluZycpOwogICAgfSBlbHNlIGlmIChkZXBlbmRzT25JbmRleFN0b3JlKCkgJiYKICAgICAgICBkZXBlbmRzT25JbnN0YW5jZVByb3BlcnR5U3RvcmUoKSAmJgogICAgICAgIGRlcGVuZHNPblN0YXRpY1Byb3BlcnR5U3RvcmUoKSkgewogICAgICBidWZmZXIud3JpdGUoJyBhbnl0aGluZycpOwogICAgfSBlbHNlIHsKICAgICAgU3RyaW5nIGNvbW1hID0gJyc7CiAgICAgIGlmIChkZXBlbmRzT25JbmRleFN0b3JlKCkpIHsKICAgICAgICBidWZmZXIud3JpdGUoJyBpbmRleCcpOwogICAgICAgIGNvbW1hID0gJywnOwogICAgICB9CiAgICAgIGlmIChkZXBlbmRzT25JbnN0YW5jZVByb3BlcnR5U3RvcmUoKSkgewogICAgICAgIGJ1ZmZlci53cml0ZSgnJGNvbW1hIGZpZWxkJyk7CiAgICAgICAgY29tbWEgPSAnLCc7CiAgICAgIH0KICAgICAgaWYgKGRlcGVuZHNPblN0YXRpY1Byb3BlcnR5U3RvcmUoKSkgewogICAgICAgIGJ1ZmZlci53cml0ZSgnJGNvbW1hIHN0YXRpYycpOwogICAgICB9CiAgICB9CiAgICBidWZmZXIud3JpdGUoJzsgd3JpdGVzJyk7CiAgICBpZiAoIWhhc1NpZGVFZmZlY3RzKCkpIHsKICAgICAgYnVmZmVyLndyaXRlKCcgbm90aGluZycpOwogICAgfSBlbHNlIGlmIChjaGFuZ2VzSW5kZXgoKSAmJgogICAgICAgIGNoYW5nZXNJbnN0YW5jZVByb3BlcnR5KCkgJiYKICAgICAgICBjaGFuZ2VzU3RhdGljUHJvcGVydHkoKSkgewogICAgICBidWZmZXIud3JpdGUoJyBhbnl0aGluZycpOwogICAgfSBlbHNlIHsKICAgICAgU3RyaW5nIGNvbW1hID0gJyc7CiAgICAgIGlmIChjaGFuZ2VzSW5kZXgoKSkgewogICAgICAgIGJ1ZmZlci53cml0ZSgnIGluZGV4Jyk7CiAgICAgICAgY29tbWEgPSAnLCc7CiAgICAgIH0KICAgICAgaWYgKGNoYW5nZXNJbnN0YW5jZVByb3BlcnR5KCkpIHsKICAgICAgICBidWZmZXIud3JpdGUoJyRjb21tYSBmaWVsZCcpOwogICAgICAgIGNvbW1hID0gJywnOwogICAgICB9CiAgICAgIGlmIChjaGFuZ2VzU3RhdGljUHJvcGVydHkoKSkgewogICAgICAgIGJ1ZmZlci53cml0ZSgnJGNvbW1hIHN0YXRpYycpOwogICAgICB9CiAgICB9CiAgICBidWZmZXIud3JpdGUoJyknKTsKICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9Cn0KCmNsYXNzIFNpZGVFZmZlY3RzQnVpbGRlciB7CiAgZmluYWwgTWVtYmVyRW50aXR5IF9tZW1iZXI7CiAgZmluYWwgU2lkZUVmZmVjdHMgX3NpZGVFZmZlY3RzID0gbmV3IFNpZGVFZmZlY3RzLmVtcHR5KCk7CiAgZmluYWwgYm9vbCBfZnJlZTsKICBTZXQ8U2lkZUVmZmVjdHNCdWlsZGVyPiBfZGVwZW5kaW5nOwoKICBTaWRlRWZmZWN0c0J1aWxkZXIodGhpcy5fbWVtYmVyKSA6IF9mcmVlID0gZmFsc2U7CgogIFNpZGVFZmZlY3RzQnVpbGRlci5mcmVlKHRoaXMuX21lbWJlcikgOiBfZnJlZSA9IHRydWU7CgogIHZvaWQgc2V0Q2hhbmdlc0luc3RhbmNlUHJvcGVydHkoKSB7CiAgICBpZiAoX2ZyZWUpIHJldHVybjsKICAgIF9zaWRlRWZmZWN0cy5zZXRDaGFuZ2VzSW5zdGFuY2VQcm9wZXJ0eSgpOwogIH0KCiAgdm9pZCBzZXREZXBlbmRzT25JbnN0YW5jZVByb3BlcnR5U3RvcmUoKSB7CiAgICBpZiAoX2ZyZWUpIHJldHVybjsKICAgIF9zaWRlRWZmZWN0cy5zZXREZXBlbmRzT25JbnN0YW5jZVByb3BlcnR5U3RvcmUoKTsKICB9CgogIHZvaWQgc2V0Q2hhbmdlc1N0YXRpY1Byb3BlcnR5KCkgewogICAgaWYgKF9mcmVlKSByZXR1cm47CiAgICBfc2lkZUVmZmVjdHMuc2V0Q2hhbmdlc1N0YXRpY1Byb3BlcnR5KCk7CiAgfQoKICB2b2lkIHNldERlcGVuZHNPblN0YXRpY1Byb3BlcnR5U3RvcmUoKSB7CiAgICBpZiAoX2ZyZWUpIHJldHVybjsKICAgIF9zaWRlRWZmZWN0cy5zZXREZXBlbmRzT25TdGF0aWNQcm9wZXJ0eVN0b3JlKCk7CiAgfQoKICB2b2lkIHNldEFsbFNpZGVFZmZlY3RzQW5kRGVwZW5kc09uU29tZXRoaW5nKCkgewogICAgaWYgKF9mcmVlKSByZXR1cm47CiAgICBfc2lkZUVmZmVjdHMuc2V0QWxsU2lkZUVmZmVjdHMoKTsKICAgIF9zaWRlRWZmZWN0cy5zZXREZXBlbmRzT25Tb21ldGhpbmcoKTsKICB9CgogIHZvaWQgc2V0QWxsU2lkZUVmZmVjdHMoKSB7CiAgICBpZiAoX2ZyZWUpIHJldHVybjsKICAgIF9zaWRlRWZmZWN0cy5zZXRBbGxTaWRlRWZmZWN0cygpOwogIH0KCiAgdm9pZCBhZGRJbnB1dChTaWRlRWZmZWN0c0J1aWxkZXIgaW5wdXQpIHsKICAgIGlmIChfZnJlZSkgcmV0dXJuOwogICAgKGlucHV0Ll9kZXBlbmRpbmcgPz89IG5ldyBTZXQ8U2lkZUVmZmVjdHNCdWlsZGVyPigpKS5hZGQodGhpcyk7CiAgfQoKICBib29sIGFkZChTaWRlRWZmZWN0cyBpbnB1dCkgewogICAgaWYgKF9mcmVlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gX3NpZGVFZmZlY3RzLmFkZChpbnB1dCk7CiAgfQoKICBTaWRlRWZmZWN0cyBnZXQgc2lkZUVmZmVjdHMgPT4gX3NpZGVFZmZlY3RzOwoKICBJdGVyYWJsZTxTaWRlRWZmZWN0c0J1aWxkZXI+IGdldCBkZXBlbmRpbmcgPT4KICAgICAgX2RlcGVuZGluZyAhPSBudWxsID8gX2RlcGVuZGluZyA6IGNvbnN0IDxTaWRlRWZmZWN0c0J1aWxkZXI+W107CgogIE1lbWJlckVudGl0eSBnZXQgbWVtYmVyID0+IF9tZW1iZXI7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCdTaWRlRWZmZWN0c0J1aWxkZXIobWVtYmVyPSRtZW1iZXIsJyk7CiAgICBzYi53cml0ZSgnZnJlZT0kX2ZyZWUsJyk7CiAgICBzYi53cml0ZSgnc2lkZUVmZmVjdHM9JHNpZGVFZmZlY3RzLCcpOwogICAgc2Iud3JpdGUoJ2RlcGVuZGluZz0ke2RlcGVuZGluZy5tYXAoKHMpID0+IHMubWVtYmVyKS5qb2luKCcsJyl9LCcpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CoFEAE5OPAEfASQuARRPEywBFCtMMipKATBFPSc7MysxARIBEhkdBAEYHBsEASYBOT4XIhUtBAEvKBUbEwQBDDUBDEoBICwEASAZHx0EASIZIB0EARo1BAEcUAQBMzkBHRkvHQQBHxkwHQQBIRk8Oh0EASAZPDsdBAEoPAQBKzwEAS0+BAEkMwQBJjUEAUoBRwEiMgQBJDQEARspBAEdKwQBNwEqPgQBLT4EAS8+BAEmNQQBKDcEAU4BTgElKQQBIBkcHQQBIhsEASUuBAEbAQwWLichICgsKiENGSMgFQguJhUILCcIBh4dICElIyENGRwgFQgnJhUIJScIBhceBAIBGx48FCYBNAE4ASYXLwQBLRc2BAEkFy0EASsXNAQBMhcmKgQBHRcmBAEsF0QEASAdJAQBLwEwRgEmAQwWKjQeK0gaBAIBL3BhY2thZ2U6Y29tcGlsZXIvc3JjL3VuaXZlcnNlL3NpZGVfZWZmZWN0cy5kYXJ0P3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2lvL2tlcm5lbF9zb3VyY2VfaW5mb3JtYXRpb24uZGFydL3JLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBTb3VyY2UgaW5mb3JtYXRpb24gc3lzdGVtIG1hcHBpbmcgdGhhdCBhdHRlbXB0cyBhIHNlbWFudGljIG1hcHBpbmcgYmV0d2VlbgovLy8gb2Zmc2V0cyBvZiBKYXZhU2NyaXB0IGNvZGUgcG9pbnRzIHRvIG9mZnNldHMgb2YgRGFydCBjb2RlIHBvaW50cy4KCmxpYnJhcnkgZGFydDJqcy5zb3VyY2VfaW5mb3JtYXRpb24ua2VybmVsOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vanNfbW9kZWwvZWxlbWVudF9tYXAuZGFydCc7CmltcG9ydCAnLi4vanNfbW9kZWwvanNfc3RyYXRlZ3kuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY2FsbF9zdHJ1Y3R1cmUuZGFydCc7CmltcG9ydCAnc291cmNlX2luZm9ybWF0aW9uLmRhcnQnOwppbXBvcnQgJ3Bvc2l0aW9uX2luZm9ybWF0aW9uLmRhcnQnOwoKY2xhc3MgS2VybmVsU291cmNlSW5mb3JtYXRpb25TdHJhdGVneQogICAgZXh0ZW5kcyBBYnN0cmFjdFBvc2l0aW9uU291cmNlSW5mb3JtYXRpb25TdHJhdGVneSB7CiAgZmluYWwgSnNCYWNrZW5kU3RyYXRlZ3kgX2JhY2tlbmRTdHJhdGVneTsKCiAgY29uc3QgS2VybmVsU291cmNlSW5mb3JtYXRpb25TdHJhdGVneSh0aGlzLl9iYWNrZW5kU3RyYXRlZ3kpOwoKICBAb3ZlcnJpZGUKICBTb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIgY3JlYXRlQnVpbGRlckZvckNvbnRleHQoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgcmV0dXJuIG5ldyBLZXJuZWxTb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIoCiAgICAgICAgX2JhY2tlbmRTdHJhdGVneQogICAgICAgICAgICAvLyBpZ25vcmU6ZGVwcmVjYXRlZF9tZW1iZXJfdXNlX2Zyb21fc2FtZV9wYWNrYWdlCiAgICAgICAgICAgIC5lbGVtZW50TWFwLAogICAgICAgIG1lbWJlcik7CiAgfQp9CgovLy8gQ29tcHV0ZSB0aGUgc291cmNlIG1hcCBuYW1lIGZvciBrZXJuZWwgYmFzZWQgW21lbWJlcl0uIElmIFtjYWxsU3RydWN0dXJlXQovLy8gaXMgbm9uLW51bGwgaXQgaXMgdXNlZCB0byBuYW1lIHRoZSBwYXJhbWV0ZXIgc3R1YiBmb3IgW2VsZW1lbnRdLgovLy8KLy8vIFtlbGVtZW50TWFwXSBpcyB1c2VkIHRvIGNvbXB1dGUgbmFtZXMgZm9yIGNsb3N1cmUgY2FsbCBtZXRob2RzLgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNYWtlIHRoZSBjbG9zdXJlIGNhbGwgbmFtZXMgYXZhaWxhYmxlIHRvCi8vIGBzb3VyY2VtYXBfaGVscGVyLmRhcnRgLgpTdHJpbmcgY29tcHV0ZUtlcm5lbEVsZW1lbnROYW1lRm9yU291cmNlTWFwcygKICAgIEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsIE1lbWJlckVudGl0eSBtZW1iZXIsCiAgICBbQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlXSkgewogIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiA9IGVsZW1lbnRNYXAuZ2V0TWVtYmVyRGVmaW5pdGlvbihtZW1iZXIpOwogIHN3aXRjaCAoZGVmaW5pdGlvbi5raW5kKSB7CiAgICBjYXNlIE1lbWJlcktpbmQuY2xvc3VyZUNhbGw6CiAgICAgIGlyLlRyZWVOb2RlIG5vZGUgPSBkZWZpbml0aW9uLm5vZGU7CiAgICAgIFN0cmluZyBuYW1lOwogICAgICB3aGlsZSAobm9kZSBpcyEgaXIuTWVtYmVyKSB7CiAgICAgICAgaWYgKG5vZGUgaXMgaXIuRnVuY3Rpb25EZWNsYXJhdGlvbikgewogICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewogICAgICAgICAgICBuYW1lID0gJyR7bm9kZS52YXJpYWJsZS5uYW1lfS4kbmFtZSc7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuYW1lID0gbm9kZS52YXJpYWJsZS5uYW1lOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAobm9kZSBpcyBpci5GdW5jdGlvbkV4cHJlc3Npb24pIHsKICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgbmFtZSA9ICc8YW5vbnltb3VzIGZ1bmN0aW9uPi4kbmFtZSc7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuYW1lID0gJzxhbm9ueW1vdXMgZnVuY3Rpb24+JzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50OwogICAgICB9CiAgICAgIE1lbWJlckVudGl0eSBlbmNsb3NpbmdNZW1iZXIgPSBlbGVtZW50TWFwLmdldE1lbWJlcihub2RlKTsKICAgICAgU3RyaW5nIGVuY2xvc2luZ01lbWJlck5hbWUgPQogICAgICAgICAgY29tcHV0ZUVsZW1lbnROYW1lRm9yU291cmNlTWFwcyhlbmNsb3NpbmdNZW1iZXIsIGNhbGxTdHJ1Y3R1cmUpOwogICAgICByZXR1cm4gJyRlbmNsb3NpbmdNZW1iZXJOYW1lLiRuYW1lJzsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBjb21wdXRlRWxlbWVudE5hbWVGb3JTb3VyY2VNYXBzKG1lbWJlciwgY2FsbFN0cnVjdHVyZSk7CiAgfQp9CgovLy8gW1NvdXJjZUluZm9ybWF0aW9uQnVpbGRlcl0gdGhhdCBnZW5lcmF0ZXMgW1Bvc2l0aW9uU291cmNlSW5mb3JtYXRpb25dIGZyb20KLy8vIEtlcm5lbCBub2Rlcy4KY2xhc3MgS2VybmVsU291cmNlSW5mb3JtYXRpb25CdWlsZGVyIGltcGxlbWVudHMgU291cmNlSW5mb3JtYXRpb25CdWlsZGVyIHsKICBmaW5hbCBKc1RvRWxlbWVudE1hcCBfZWxlbWVudE1hcDsKICBmaW5hbCBNZW1iZXJFbnRpdHkgX21lbWJlcjsKICBmaW5hbCBTdHJpbmcgX25hbWU7CgogIC8vLyBJbmxpbmluZyBjb250ZXh0IG9yIG51bGwgd2hlbiBubyBpbmxpbmluZyBoYXMgdGFrZW4gcGxhY2UuCiAgLy8vCiAgLy8vIEEgbmV3IGJ1aWxkZXIgaXMgY3JlYXRlZCBldmVyeSB0aW1lIHRoZSBiYWNrZW5kIGlubGluZXMgYSBtZXRob2QuIFRoaXMKICAvLy8gZmllbGQgY29udGFpbnMgdGhlIGxvY2F0aW9uIG9mIGV2ZXJ5IGNhbGwgc2l0ZSB0aGF0IGhhcyBiZWVuIGlubGluZWQuIFRoZQogIC8vLyBsYXN0IGVudHJ5IG9uIHRoZSBsaXN0IGlzIGFsd2F5cyBhIGNhbGwgdG8gW19tZW1iZXJdLgogIGZpbmFsIExpc3Q8RnJhbWVDb250ZXh0PiBpbmxpbmluZ0NvbnRleHQ7CgogIEtlcm5lbFNvdXJjZUluZm9ybWF0aW9uQnVpbGRlcih0aGlzLl9lbGVtZW50TWFwLCB0aGlzLl9tZW1iZXIpCiAgICAgIDogX25hbWUgPSBjb21wdXRlS2VybmVsRWxlbWVudE5hbWVGb3JTb3VyY2VNYXBzKF9lbGVtZW50TWFwLCBfbWVtYmVyKSwKICAgICAgICBpbmxpbmluZ0NvbnRleHQgPSBudWxsOwoKICBLZXJuZWxTb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIud2l0aENvbnRleHQoCiAgICAgIHRoaXMuX2VsZW1lbnRNYXAsIHRoaXMuX21lbWJlciwgdGhpcy5pbmxpbmluZ0NvbnRleHQsIHRoaXMuX25hbWUpOwoKICAvLy8gUmV0dXJucyB0aGUgW1NvdXJjZUxvY2F0aW9uXSBmb3IgdGhlIFtvZmZzZXRdIHdpdGhpbiBbbm9kZV0gdXNpbmcgW25hbWVdCiAgLy8vIGFzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgbG9jYXRpb24uCiAgLy8vCiAgLy8vIElmIFtvZmZzZXRdIGlzIGBudWxsYCwgdGhlIGZpcnN0IGBmaWxlT2Zmc2V0YCBvZiBbbm9kZV0gb3IgaXRzIHBhcmVudHMgaXMKICAvLy8gdXNlZC4KICBTb3VyY2VMb2NhdGlvbiBfZ2V0U291cmNlTG9jYXRpb24oU3RyaW5nIG5hbWUsIGlyLlRyZWVOb2RlIG5vZGUsCiAgICAgIFtpbnQgb2Zmc2V0XSkgewogICAgaXIuTG9jYXRpb24gbG9jYXRpb247CiAgICBpZiAob2Zmc2V0ICE9IG51bGwpIHsKICAgICAgbG9jYXRpb24gPSBub2RlLmxvY2F0aW9uOwogICAgICBsb2NhdGlvbiA9IG5vZGUuZW5jbG9zaW5nQ29tcG9uZW50LmdldExvY2F0aW9uKGxvY2F0aW9uLmZpbGUsIG9mZnNldCk7CiAgICB9IGVsc2UgewogICAgICB3aGlsZSAobm9kZSAhPSBudWxsICYmIG5vZGUuZmlsZU9mZnNldCA9PSBpci5UcmVlTm9kZS5ub09mZnNldCkgewogICAgICAgIG5vZGUgPSBub2RlLnBhcmVudDsKICAgICAgfQogICAgICBsb2NhdGlvbiA9IG5vZGUubG9jYXRpb247CiAgICAgIG9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKICAgIH0KICAgIGFzc2VydCgKICAgICAgICBsb2NhdGlvbiAhPSBudWxsLCAiTm8gbG9jYXRpb24gZm91bmQgZm9yICRub2RlICgke25vZGUucnVudGltZVR5cGV9KSIpOwogICAgcmV0dXJuIG5ldyBLZXJuZWxTb3VyY2VMb2NhdGlvbihsb2NhdGlvbiwgb2Zmc2V0LCBuYW1lKTsKICB9CgogIC8vLyBDcmVhdGVzIHRoZSBzb3VyY2UgaW5mb3JtYXRpb24gZm9yIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBkZWZpbmVkIGJ5IHRoZQogIC8vLyByb290IFtub2RlXSBhbmQgaXRzIFtmdW5jdGlvbk5vZGVdLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBoYW5kbGVzIGJvdGggbWV0aG9kcywgY29uc3RydWN0b3JzLCBhbmQgbG9jYWwgZnVuY3Rpb25zLgogIFNvdXJjZUluZm9ybWF0aW9uIF9idWlsZEZ1bmN0aW9uKAogICAgICBTdHJpbmcgbmFtZSwgaXIuVHJlZU5vZGUgbm9kZSwgaXIuRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uTm9kZSkgewogICAgaWYgKGZ1bmN0aW9uTm9kZS5maWxlRW5kT2Zmc2V0ICE9IGlyLlRyZWVOb2RlLm5vT2Zmc2V0KSB7CiAgICAgIHJldHVybiBuZXcgUG9zaXRpb25Tb3VyY2VJbmZvcm1hdGlvbigKICAgICAgICAgIF9nZXRTb3VyY2VMb2NhdGlvbihuYW1lLCBub2RlKSwKICAgICAgICAgIF9nZXRTb3VyY2VMb2NhdGlvbihuYW1lLCBmdW5jdGlvbk5vZGUsIGZ1bmN0aW9uTm9kZS5maWxlRW5kT2Zmc2V0KSwKICAgICAgICAgIHRoaXMuaW5saW5pbmdDb250ZXh0KTsKICAgIH0KICAgIHJldHVybiBfYnVpbGRUcmVlTm9kZShub2RlKTsKICB9CgogIC8vLyBDcmVhdGVzIHRoZSBzb3VyY2UgaW5mb3JtYXRpb24gZm9yIGEgW2Jhc2VdIGFuZCBlbmQgb2YgW21lbWJlcl0uIElmIFtiYXNlXQogIC8vLyBpcyBub3QgcHJvdmlkZWQsIHRoZSBvZmZzZXQgb2YgW21lbWJlcl0gaXMgdXNlZCBhcyB0aGUgc3RhcnQgcG9zaXRpb24uCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgYW5kIHJldHVybiBleHByZXNzaW9ucyB3aGljaCBib3RoIHBvaW50CiAgLy8vIHRvIHRoZSBlbmQgb2YgdGhlIG1lbWJlciBhcyB0aGUgY2xvc2luZyBwb3NpdGlvbi4KICBTb3VyY2VJbmZvcm1hdGlvbiBfYnVpbGRGdW5jdGlvbkVuZChNZW1iZXJFbnRpdHkgbWVtYmVyLCBbaXIuVHJlZU5vZGUgYmFzZV0pIHsKICAgIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiA9IF9lbGVtZW50TWFwLmdldE1lbWJlckRlZmluaXRpb24obWVtYmVyKTsKICAgIFN0cmluZyBuYW1lID0gY29tcHV0ZUtlcm5lbEVsZW1lbnROYW1lRm9yU291cmNlTWFwcyhfZWxlbWVudE1hcCwgbWVtYmVyKTsKICAgIGlyLk5vZGUgbm9kZSA9IGRlZmluaXRpb24ubm9kZTsKICAgIHN3aXRjaCAoZGVmaW5pdGlvbi5raW5kKSB7CiAgICAgIGNhc2UgTWVtYmVyS2luZC5yZWd1bGFyOgogICAgICAgIGlmIChub2RlIGlzIGlyLlByb2NlZHVyZSkgewogICAgICAgICAgcmV0dXJuIF9idWlsZEZ1bmN0aW9uKG5hbWUsIGJhc2UgPz8gbm9kZSwgbm9kZS5mdW5jdGlvbik7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE1lbWJlcktpbmQuY29uc3RydWN0b3I6CiAgICAgIGNhc2UgTWVtYmVyS2luZC5jb25zdHJ1Y3RvckJvZHk6CiAgICAgICAgaWYgKG5vZGUgaXMgaXIuUHJvY2VkdXJlKSB7CiAgICAgICAgICByZXR1cm4gX2J1aWxkRnVuY3Rpb24obmFtZSwgYmFzZSA/PyBub2RlLCBub2RlLmZ1bmN0aW9uKTsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaXMgaXIuQ29uc3RydWN0b3IpIHsKICAgICAgICAgIHJldHVybiBfYnVpbGRGdW5jdGlvbihuYW1lLCBiYXNlID8/IG5vZGUsIG5vZGUuZnVuY3Rpb24pOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBNZW1iZXJLaW5kLmNsb3N1cmVDYWxsOgogICAgICAgIGlmIChub2RlIGlzIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24pIHsKICAgICAgICAgIHJldHVybiBfYnVpbGRGdW5jdGlvbihuYW1lLCBiYXNlID8/IG5vZGUsIG5vZGUuZnVuY3Rpb24pOwogICAgICAgIH0gZWxzZSBpZiAobm9kZSBpcyBpci5GdW5jdGlvbkV4cHJlc3Npb24pIHsKICAgICAgICAgIHJldHVybiBfYnVpbGRGdW5jdGlvbihuYW1lLCBiYXNlID8/IG5vZGUsIG5vZGUuZnVuY3Rpb24pOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgLy8gVE9ETyhzcmEpOiBnZW5lcmF0b3JCb2R5CiAgICAgIGRlZmF1bHQ6CiAgICB9CiAgICByZXR1cm4gX2J1aWxkVHJlZU5vZGUoYmFzZSA/PyBub2RlLCBuYW1lOiBuYW1lKTsKICB9CgogIC8vLyBDcmVhdGVzIHRoZSBzb3VyY2UgaW5mb3JtYXRpb24gZm9yIGV4aXRpbmcgYSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZWQKICAvLy8gYnkgdGhlIHJvb3QgW25vZGVdIGFuZCBpdHMgW2Z1bmN0aW9uTm9kZV0uCiAgLy8vCiAgLy8vIFRoaXMgbWV0aG9kIGhhbmRsZXMgYm90aCBtZXRob2RzLCBjb25zdHJ1Y3RvcnMsIGFuZCBsb2NhbCBmdW5jdGlvbnMuCiAgU291cmNlSW5mb3JtYXRpb24gX2J1aWxkRnVuY3Rpb25FeGl0KAogICAgICBpci5UcmVlTm9kZSBub2RlLCBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb25Ob2RlKSB7CiAgICBpZiAoZnVuY3Rpb25Ob2RlLmZpbGVFbmRPZmZzZXQgIT0gaXIuVHJlZU5vZGUubm9PZmZzZXQpIHsKICAgICAgcmV0dXJuIG5ldyBQb3NpdGlvblNvdXJjZUluZm9ybWF0aW9uKAogICAgICAgICAgX2dldFNvdXJjZUxvY2F0aW9uKF9uYW1lLCBmdW5jdGlvbk5vZGUsIGZ1bmN0aW9uTm9kZS5maWxlRW5kT2Zmc2V0KSwKICAgICAgICAgIG51bGwsCiAgICAgICAgICB0aGlzLmlubGluaW5nQ29udGV4dCk7CiAgICB9CiAgICByZXR1cm4gX2J1aWxkVHJlZU5vZGUobm9kZSk7CiAgfQoKICAvLy8gQ3JlYXRlcyB0aGUgc291cmNlIGluZm9ybWF0aW9uIGZvciB0aGUgW2JvZHldIG9mIFtub2RlXS4KICAvLy8KICAvLy8gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBmb3IgY29kZSBpbiB0aGUgYmVnaW5uaW5nIG9mIGEgbWV0aG9kLCBsaWtlCiAgLy8vIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBpbiB0aGUgc3RhcnQgb2YgYSBmdW5jdGlvbi4KICBTb3VyY2VJbmZvcm1hdGlvbiBfYnVpbGRCb2R5KGlyLlRyZWVOb2RlIG5vZGUsIGlyLlRyZWVOb2RlIGJvZHkpIHsKICAgIFNvdXJjZUxvY2F0aW9uIGxvY2F0aW9uOwogICAgaWYgKGJvZHkgIT0gbnVsbCkgewogICAgICBpZiAoYm9keSBpcyBpci5CbG9jayAmJiBib2R5LnN0YXRlbWVudHMuaXNOb3RFbXB0eSkgewogICAgICAgIGxvY2F0aW9uID0gX2dldFNvdXJjZUxvY2F0aW9uKF9uYW1lLCBib2R5LnN0YXRlbWVudHMuZmlyc3QpOwogICAgICB9IGVsc2UgewogICAgICAgIGxvY2F0aW9uID0gX2dldFNvdXJjZUxvY2F0aW9uKF9uYW1lLCBib2R5KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbG9jYXRpb24gPSBfZ2V0U291cmNlTG9jYXRpb24oX25hbWUsIG5vZGUpOwogICAgfQogICAgcmV0dXJuIG5ldyBQb3NpdGlvblNvdXJjZUluZm9ybWF0aW9uKGxvY2F0aW9uLCBudWxsLCBpbmxpbmluZ0NvbnRleHQpOwogIH0KCiAgLy8vIENyZWF0ZXMgc291cmNlIGluZm9ybWF0aW9uIGZvciB0aGUgYm9keSBvZiB0aGUgY3VycmVudCBtZW1iZXIuCiAgU291cmNlSW5mb3JtYXRpb24gX2J1aWxkTWVtYmVyQm9keSgpIHsKICAgIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiA9IF9lbGVtZW50TWFwLmdldE1lbWJlckRlZmluaXRpb24oX21lbWJlcik7CiAgICBzd2l0Y2ggKGRlZmluaXRpb24ua2luZCkgewogICAgICBjYXNlIE1lbWJlcktpbmQucmVndWxhcjoKICAgICAgICBpci5Ob2RlIG5vZGUgPSBkZWZpbml0aW9uLm5vZGU7CiAgICAgICAgaWYgKG5vZGUgaXMgaXIuUHJvY2VkdXJlKSB7CiAgICAgICAgICByZXR1cm4gX2J1aWxkQm9keShub2RlLCBub2RlLmZ1bmN0aW9uLmJvZHkpOwogICAgICAgIH0gZWxzZSBpZiAobm9kZSBpcyBpci5GaWVsZCkgewogICAgICAgICAgcmV0dXJuIF9idWlsZEJvZHkobm9kZSwgbm9kZS5pbml0aWFsaXplcik7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE1lbWJlcktpbmQuY29uc3RydWN0b3I6CiAgICAgIGNhc2UgTWVtYmVyS2luZC5jb25zdHJ1Y3RvckJvZHk6CiAgICAgICAgaXIuTm9kZSBub2RlID0gZGVmaW5pdGlvbi5ub2RlOwogICAgICAgIGlmIChub2RlIGlzIGlyLlByb2NlZHVyZSkgewogICAgICAgICAgcmV0dXJuIF9idWlsZEJvZHkobm9kZSwgbm9kZS5mdW5jdGlvbi5ib2R5KTsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaXMgaXIuQ29uc3RydWN0b3IpIHsKICAgICAgICAgIHJldHVybiBfYnVpbGRCb2R5KG5vZGUsIG5vZGUuZnVuY3Rpb24uYm9keSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE1lbWJlcktpbmQuY2xvc3VyZUNhbGw6CiAgICAgICAgaXIuTm9kZSBub2RlID0gZGVmaW5pdGlvbi5ub2RlOwogICAgICAgIGlmIChub2RlIGlzIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24pIHsKICAgICAgICAgIHJldHVybiBfYnVpbGRCb2R5KG5vZGUsIG5vZGUuZnVuY3Rpb24uYm9keSk7CiAgICAgICAgfSBlbHNlIGlmIChub2RlIGlzIGlyLkZ1bmN0aW9uRXhwcmVzc2lvbikgewogICAgICAgICAgcmV0dXJuIF9idWlsZEJvZHkobm9kZSwgbm9kZS5mdW5jdGlvbi5ib2R5KTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTWVtYmVyS2luZC5nZW5lcmF0b3JCb2R5OgogICAgICAgIGlyLk5vZGUgbm9kZSA9IGRlZmluaXRpb24ubm9kZTsKICAgICAgICBpZiAobm9kZSBpcyBpci5GdW5jdGlvbkRlY2xhcmF0aW9uKSB7CiAgICAgICAgICByZXR1cm4gX2J1aWxkQm9keShub2RlLCBub2RlLmZ1bmN0aW9uLmJvZHkpOwogICAgICAgIH0gZWxzZSBpZiAobm9kZSBpcyBpci5GdW5jdGlvbkV4cHJlc3Npb24pIHsKICAgICAgICAgIHJldHVybiBfYnVpbGRCb2R5KG5vZGUsIG5vZGUuZnVuY3Rpb24uYm9keSk7CiAgICAgICAgfSBlbHNlIGlmIChub2RlIGlzIGlyLk1lbWJlciAmJiBub2RlLmZ1bmN0aW9uICE9IG51bGwpIHsKICAgICAgICAgIHJldHVybiBfYnVpbGRCb2R5KG5vZGUsIG5vZGUuZnVuY3Rpb24uYm9keSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgfQogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKGRlZmluaXRpb24ubm9kZSk7CiAgfQoKICAvLy8gQ3JlYXRlcyBzb3VyY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBleGl0IG9mIHRoZSBjdXJyZW50IG1lbWJlci4KICBTb3VyY2VJbmZvcm1hdGlvbiBfYnVpbGRNZW1iZXJFeGl0KCkgewogICAgTWVtYmVyRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gX2VsZW1lbnRNYXAuZ2V0TWVtYmVyRGVmaW5pdGlvbihfbWVtYmVyKTsKICAgIHN3aXRjaCAoZGVmaW5pdGlvbi5raW5kKSB7CiAgICAgIGNhc2UgTWVtYmVyS2luZC5yZWd1bGFyOgogICAgICAgIGlyLk5vZGUgbm9kZSA9IGRlZmluaXRpb24ubm9kZTsKICAgICAgICBpZiAobm9kZSBpcyBpci5Qcm9jZWR1cmUpIHsKICAgICAgICAgIHJldHVybiBfYnVpbGRGdW5jdGlvbkV4aXQobm9kZSwgbm9kZS5mdW5jdGlvbik7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE1lbWJlcktpbmQuY29uc3RydWN0b3I6CiAgICAgIGNhc2UgTWVtYmVyS2luZC5jb25zdHJ1Y3RvckJvZHk6CiAgICAgICAgaXIuTm9kZSBub2RlID0gZGVmaW5pdGlvbi5ub2RlOwogICAgICAgIGlmIChub2RlIGlzIGlyLlByb2NlZHVyZSkgewogICAgICAgICAgcmV0dXJuIF9idWlsZEZ1bmN0aW9uRXhpdChub2RlLCBub2RlLmZ1bmN0aW9uKTsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaXMgaXIuQ29uc3RydWN0b3IpIHsKICAgICAgICAgIHJldHVybiBfYnVpbGRGdW5jdGlvbkV4aXQobm9kZSwgbm9kZS5mdW5jdGlvbik7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE1lbWJlcktpbmQuY2xvc3VyZUNhbGw6CiAgICAgICAgaXIuTm9kZSBub2RlID0gZGVmaW5pdGlvbi5ub2RlOwogICAgICAgIGlmIChub2RlIGlzIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24pIHsKICAgICAgICAgIHJldHVybiBfYnVpbGRGdW5jdGlvbkV4aXQobm9kZSwgbm9kZS5mdW5jdGlvbik7CiAgICAgICAgfSBlbHNlIGlmIChub2RlIGlzIGlyLkZ1bmN0aW9uRXhwcmVzc2lvbikgewogICAgICAgICAgcmV0dXJuIF9idWlsZEZ1bmN0aW9uRXhpdChub2RlLCBub2RlLmZ1bmN0aW9uKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICB9CiAgICByZXR1cm4gX2J1aWxkVHJlZU5vZGUoZGVmaW5pdGlvbi5ub2RlKTsKICB9CgogIC8vLyBDcmVhdGVzIHNvdXJjZSBpbmZvcm1hdGlvbiBiYXNlZCBvbiB0aGUgbG9jYXRpb24gb2YgW25vZGVdLgogIFNvdXJjZUluZm9ybWF0aW9uIF9idWlsZFRyZWVOb2RlKGlyLlRyZWVOb2RlIG5vZGUsCiAgICAgIHtTb3VyY2VMb2NhdGlvbiBjbG9zaW5nUG9zaXRpb24sIFN0cmluZyBuYW1lfSkgewogICAgcmV0dXJuIG5ldyBQb3NpdGlvblNvdXJjZUluZm9ybWF0aW9uKAogICAgICAgIF9nZXRTb3VyY2VMb2NhdGlvbihuYW1lID8/IF9uYW1lLCBub2RlKSwKICAgICAgICBjbG9zaW5nUG9zaXRpb24sCiAgICAgICAgaW5saW5pbmdDb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uQnVpbGRlciBmb3JDb250ZXh0KAogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyLCBTb3VyY2VJbmZvcm1hdGlvbiBjb250ZXh0KSB7CiAgICBMaXN0PEZyYW1lQ29udGV4dD4gbmV3Q29udGV4dCA9IGlubGluaW5nQ29udGV4dD8udG9MaXN0KCkgPz8gW107CiAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7CiAgICAgIG5ld0NvbnRleHQuYWRkKG5ldyBGcmFtZUNvbnRleHQoY29udGV4dCwgbWVtYmVyLm5hbWUpKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFRPRE8oc2lnbXVuZCk6IGludmVzdGlnYXRlIHdoZXRoZXIgd2UgaGF2ZSBhbnkgbW9yZSBjYXNlcyB3aGVyZSBjb250ZXh0CiAgICAgIC8vIGlzIG51bGwuCiAgICAgIG5ld0NvbnRleHQgPSBpbmxpbmluZ0NvbnRleHQ7CiAgICB9CgogICAgU3RyaW5nIG5hbWUgPSBjb21wdXRlS2VybmVsRWxlbWVudE5hbWVGb3JTb3VyY2VNYXBzKF9lbGVtZW50TWFwLCBfbWVtYmVyKTsKICAgIHJldHVybiBuZXcgS2VybmVsU291cmNlSW5mb3JtYXRpb25CdWlsZGVyLndpdGhDb250ZXh0KAogICAgICAgIF9lbGVtZW50TWFwLCBtZW1iZXIsIG5ld0NvbnRleHQsIG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRTd2l0Y2hDYXNlKGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRTd2l0Y2goaXIuTm9kZSBub2RlKSB7CiAgICByZXR1cm4gX2J1aWxkVHJlZU5vZGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEFzKGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRJcyhpci5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiBfYnVpbGRUcmVlTm9kZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkVHJ5KGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRDYXRjaChpci5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiBfYnVpbGRUcmVlTm9kZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkQmluYXJ5KGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRVbmFyeShpci5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiBfYnVpbGRUcmVlTm9kZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkSW5kZXhTZXQoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEluZGV4KGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRGb3JJblNldChpci5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiBfYnVpbGRUcmVlTm9kZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkRm9ySW5DdXJyZW50KGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRGb3JJbk1vdmVOZXh0KGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRGb3JJbkl0ZXJhdG9yKGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRTdHJpbmdJbnRlcnBvbGF0aW9uKGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRGb3JlaWduQ29kZShpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkVmFyaWFibGVEZWNsYXJhdGlvbigpIHsKICAgIHJldHVybiBfYnVpbGRNZW1iZXJCb2R5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEF3YWl0KGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRZaWVsZChpci5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiBfYnVpbGRUcmVlTm9kZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkQXN5bmNCb2R5KCkgewogICAgcmV0dXJuIF9idWlsZE1lbWJlckJvZHkoKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkQXN5bmNFeGl0KCkgewogICAgcmV0dXJuIF9idWlsZE1lbWJlckV4aXQoKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkQXNzaWdubWVudChpci5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiBfYnVpbGRUcmVlTm9kZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkVGhyb3coaXIuTm9kZSBub2RlKSB7CiAgICByZXR1cm4gX2J1aWxkVHJlZU5vZGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEFzc2VydChpci5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiBfYnVpbGRUcmVlTm9kZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkTmV3KGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRJZihpci5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiBfYnVpbGRUcmVlTm9kZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkQ2FsbCgKICAgICAgY292YXJpYW50IGlyLlRyZWVOb2RlIHJlY2VpdmVyLCBjb3ZhcmlhbnQgaXIuVHJlZU5vZGUgY2FsbCkgewogICAgcmV0dXJuIG5ldyBQb3NpdGlvblNvdXJjZUluZm9ybWF0aW9uKF9nZXRTb3VyY2VMb2NhdGlvbihfbmFtZSwgcmVjZWl2ZXIpLAogICAgICAgIF9nZXRTb3VyY2VMb2NhdGlvbihfbmFtZSwgY2FsbCksIGlubGluaW5nQ29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEdldChpci5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiBfYnVpbGRUcmVlTm9kZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkU2V0KGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRMb29wKGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRJbXBsaWNpdFJldHVybihNZW1iZXJFbnRpdHkgZWxlbWVudCkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRSZXR1cm4oaXIuTm9kZSBub2RlKSB7CiAgICByZXR1cm4gX2J1aWxkRnVuY3Rpb25FbmQoX21lbWJlciwgbm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZENyZWF0ZShpci5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiBfYnVpbGRUcmVlTm9kZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkTGlzdExpdGVyYWwoaXIuTm9kZSBub2RlKSB7CiAgICByZXR1cm4gX2J1aWxkVHJlZU5vZGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEdlbmVyaWMoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZERlY2xhcmF0aW9uKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIHJldHVybiBfYnVpbGRGdW5jdGlvbkVuZChtZW1iZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRTdHViKAogICAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlKSB7CiAgICBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24gPSBfZWxlbWVudE1hcC5nZXRNZW1iZXJEZWZpbml0aW9uKGZ1bmN0aW9uKTsKICAgIFN0cmluZyBuYW1lID0gY29tcHV0ZUtlcm5lbEVsZW1lbnROYW1lRm9yU291cmNlTWFwcygKICAgICAgICBfZWxlbWVudE1hcCwgZnVuY3Rpb24sIGNhbGxTdHJ1Y3R1cmUpOwogICAgaXIuTm9kZSBub2RlID0gZGVmaW5pdGlvbi5ub2RlOwogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUsIG5hbWU6IG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRHb3RvKGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUpOwogIH0KfQoKY2xhc3MgS2VybmVsU291cmNlTG9jYXRpb24gZXh0ZW5kcyBBYnN0cmFjdFNvdXJjZUxvY2F0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgb2Zmc2V0OwogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBzb3VyY2VOYW1lOwogIEBvdmVycmlkZQogIGZpbmFsIFVyaSBzb3VyY2VVcmk7CgogIEtlcm5lbFNvdXJjZUxvY2F0aW9uKGlyLkxvY2F0aW9uIGxvY2F0aW9uLCB0aGlzLm9mZnNldCwgdGhpcy5zb3VyY2VOYW1lKQogICAgICA6IHNvdXJjZVVyaSA9IGxvY2F0aW9uLmZpbGUsCiAgICAgICAgc3VwZXIuZnJvbUxvY2F0aW9uKGxvY2F0aW9uKTsKCiAgS2VybmVsU291cmNlTG9jYXRpb24uZnJvbU90aGVyKEtlcm5lbFNvdXJjZUxvY2F0aW9uIG90aGVyLCB0aGlzLnNvdXJjZU5hbWUpCiAgICAgIDogc291cmNlVXJpID0gb3RoZXIuc291cmNlVXJpLAogICAgICAgIG9mZnNldCA9IG90aGVyLm9mZnNldCwKICAgICAgICBzdXBlci5mcm9tT3RoZXIob3RoZXIpOwp9CoH5AE5OPAFPRgErASgkJycqIiQBJjgsAUABDEovGT4ZEQQCAU5FBERBHC40JUgdISoTIy4eMhMnDDQeMRMrDAocCEEjSysNRQQCAU8SSyQeFgFBBk1QPCwBQU0gAS5JAU8qBlAMQxYaGiBNDUgcCCAgBgxQPQQBTioGSyRFPiwqTiEGIQQBUU0GUThRS04kHx8kRAoPIyckRC1ECg8jLkQ0RAoPIg8GNQQBTzEGSyg4PixPECEGIQQBPwZJOEUdGDxFDzQIDTIGSwQBRSlMHx8oJDcnNQoPIycoJDctNwoPIyguNzQ3Cg8lKC43NDdBNwoPDwYsBAFFKUwfHygkOgoPIycoJDotOgoPIyguOjQ6Cg8PBiwEAUI1NyoxGRoEAQwnOEUbPg1REiQGAU87MAQBDDsBDDAhBAEMLCEEAQwsIQQBDC0hBAEMLyEEAQwwIQQBDC8hBAEMOQEMNgEMMiEEAQw2IQQBDDchBAEMNyEEAQxEAQw8AQwxHwQBDC8hBAEMLyEEAQwnHwQBDCcfBAEMNCEEAQwvIQQBDDAhBAEMLSEEAQwsIQQBDB9ETjsEAQwtIQQBDC0hBAEMLiEEAQxHAQwwLQQBDDAhBAEMNSEEAQw4AQw8JgQBDB8+TTkvJC0EAQwuIQQCATwMFAwbDBcBSyMmAU4lHyACATZwYWNrYWdlOmNvbXBpbGVyL3NyYy9pby9rZXJuZWxfc291cmNlX2luZm9ybWF0aW9uLmRhcnQ3c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanMvanNfc291cmNlX21hcHBpbmcuZGFydJB8Ly8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkganMuc291cmNlX21hcHBpbmc7CgppbXBvcnQgJy4uL2lvL2NvZGVfb3V0cHV0LmRhcnQnCiAgICBzaG93IEJ1ZmZlcmVkQ29kZU91dHB1dCwgU291cmNlTG9jYXRpb25zLCBTb3VyY2VMb2NhdGlvbnNQcm92aWRlcjsKaW1wb3J0ICcuLi9pby9zb3VyY2VfaW5mb3JtYXRpb24uZGFydCcKICAgIHNob3cgU291cmNlTG9jYXRpb24sIFNvdXJjZUluZm9ybWF0aW9uLCBTb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5OwppbXBvcnQgJ2pzLmRhcnQnOwoKLy8vIFtTb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5XSB0aGF0IGNhbiBhc3NvY2lhdGUgc291cmNlIGluZm9ybWF0aW9uIHdpdGgKLy8vIEphdmFTY3JpcHQgb3V0cHV0LgpjbGFzcyBKYXZhU2NyaXB0U291cmNlSW5mb3JtYXRpb25TdHJhdGVneSBleHRlbmRzIFNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kgewogIGNvbnN0IEphdmFTY3JpcHRTb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5KCk7CgogIC8vLyBDcmVhdGVzIGEgcHJvY2Vzc29yIHRoYXQgY2FuIGFzc29jaWF0ZSBzb3VyY2UgaW5mb3JtYXRpb24gb24gW05vZGVdIHdpdGgKICAvLy8gY29kZSBvZmZzZXRzIGluIGEgW1NvdXJjZU1hcHBlcl0gcHJvdmlkZWQgYnkgW3NvdXJjZU1hcHBlclByb3ZpZGVyXS4KICAvLy8gU291cmNlIGluZm9ybWF0aW9uIGZvciBlYWNoIFtOb2RlXSBpcyBwcm92aWRlciBieSBbcmVhZGVyXS4KICBTb3VyY2VJbmZvcm1hdGlvblByb2Nlc3NvciBjcmVhdGVQcm9jZXNzb3IoCiAgICAgIFNvdXJjZU1hcHBlclByb3ZpZGVyIHNvdXJjZU1hcHBlclByb3ZpZGVyLAogICAgICBTb3VyY2VJbmZvcm1hdGlvblJlYWRlciByZWFkZXIpIHsKICAgIHJldHVybiBjb25zdCBTb3VyY2VJbmZvcm1hdGlvblByb2Nlc3NvcigpOwogIH0KfQoKLy8vIEludGVyZmFjZSBmb3IgZGVyaXZpbmcgW1NvdXJjZUluZm9ybWF0aW9uXSBmcm9tIGEgW05vZGVdLgovLy8KLy8vIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIHJlYWQgdGhlIHZhbHVlIG9mIHRoZSBub2RlIGl0c2VsZi4KY2xhc3MgU291cmNlSW5mb3JtYXRpb25SZWFkZXIgewogIGNvbnN0IFNvdXJjZUluZm9ybWF0aW9uUmVhZGVyKCk7CgogIFNvdXJjZUluZm9ybWF0aW9uIGdldFNvdXJjZUluZm9ybWF0aW9uKE5vZGUgbm9kZSkgPT4gbm9kZS5zb3VyY2VJbmZvcm1hdGlvbjsKfQoKLy8vIEFuIG9ic2VydmVyIG9mIGNvZGUgcG9zaXRpb25zIG9mIHByaW50ZWQgSmF2YVNjcmlwdCBbTm9kZV1zLgpjbGFzcyBDb2RlUG9zaXRpb25MaXN0ZW5lciB7CiAgY29uc3QgQ29kZVBvc2l0aW9uTGlzdGVuZXIoKTsKCiAgLy8vIENhbGxlZCB0byBhc3NvY2lhdGUgW25vZGVdIHdpdGggdGhlIHByb3ZpZGVkIHN0YXJ0IHBvc2l0aW9uLgogIC8vLwogIC8vLyBUaGUgbm9kZXMgYXJlIHNlZW4gaW4gcHJlLXRyYXZlcnNhbCBvcmRlci4KICB2b2lkIG9uU3RhcnRQb3NpdGlvbihOb2RlIG5vZGUsIGludCBzdGFydFBvc2l0aW9uKSB7fQoKICAvLy8gQ2FsbGVkIHRvIGFzc29jaWF0ZSBbbm9kZV0gd2l0aCB0aGUgcHJvdmlkZWQgc3RhcnQsIGVuZCBhbmQgY2xvc2luZwogIC8vLyBwb3NpdGlvbnMuCiAgLy8vCiAgLy8vIFRoZSBub2RlcyBhcmUgc2VlbiBpbiBwb3N0LXRyYXZlcnNhbCBvcmRlci4KICB2b2lkIG9uUG9zaXRpb25zKAogICAgICBOb2RlIG5vZGUsIGludCBzdGFydFBvc2l0aW9uLCBpbnQgZW5kUG9zaXRpb24sIGludCBjbG9zaW5nUG9zaXRpb24pIHt9Cn0KCi8vLyBJbnRlcmZhY2UgZm9yIGNyZWF0aW5nIFtTb3VyY2VNYXBwZXJdcyBmb3IgbXVsdGlwbGUgc291cmNlIGluZm9ybWF0aW9uCi8vLyBlbmdpbmVzLgphYnN0cmFjdCBjbGFzcyBTb3VyY2VNYXBwZXJQcm92aWRlciB7CiAgU291cmNlTWFwcGVyIGNyZWF0ZVNvdXJjZU1hcHBlcihTdHJpbmcgbmFtZSk7Cn0KCi8vLyBCYXNlIGltcGxlbWVudGF0aW9uIG9mIFtTb3VyY2VNYXBwZXJQcm92aWRlcl0uCmNsYXNzIFNvdXJjZU1hcHBlclByb3ZpZGVySW1wbCBpbXBsZW1lbnRzIFNvdXJjZU1hcHBlclByb3ZpZGVyIHsKICBmaW5hbCBTb3VyY2VMb2NhdGlvbnNQcm92aWRlciBwcm92aWRlcjsKCiAgU291cmNlTWFwcGVyUHJvdmlkZXJJbXBsKHRoaXMucHJvdmlkZXIpOwoKICBAb3ZlcnJpZGUKICBTb3VyY2VNYXBwZXIgY3JlYXRlU291cmNlTWFwcGVyKFN0cmluZyBuYW1lKSB7CiAgICByZXR1cm4gbmV3IFNvdXJjZUxvY2F0aW9uc01hcHBlcihwcm92aWRlci5jcmVhdGVTb3VyY2VMb2NhdGlvbnMobmFtZSkpOwogIH0KfQoKLy8vIEFuIGludGVyZmFjZSBmb3IgbWFwcGluZyBjb2RlIG9mZnNldHMgd2l0aCBbU291cmNlTG9jYXRpb25dcyBmb3IgSmF2YVNjcmlwdAovLy8gW05vZGVdcy4KYWJzdHJhY3QgY2xhc3MgU291cmNlTWFwcGVyIHsKICAvLy8gQXNzb2NpYXRlIFtjb2RlT2Zmc2V0XSB3aXRoIFtzb3VyY2VMb2NhdGlvbl0gZm9yIFtub2RlXS4KICB2b2lkIHJlZ2lzdGVyKE5vZGUgbm9kZSwgaW50IGNvZGVPZmZzZXQsIFNvdXJjZUxvY2F0aW9uIHNvdXJjZUxvY2F0aW9uKTsKCiAgLy8vIEFzc29jaWF0ZSBbY29kZU9mZnNldF0gd2l0aCBhbiBpbmxpbmluZyBjYWxsIGF0IFtzb3VyY2VMb2NhdGlvbl0uCiAgdm9pZCByZWdpc3RlclB1c2goCiAgICAgIGludCBjb2RlT2Zmc2V0LCBTb3VyY2VMb2NhdGlvbiBzb3VyY2VMb2NhdGlvbiwgU3RyaW5nIGlubGluZWRNZXRob2ROYW1lKTsKCiAgLy8vIEFzc29jaWF0ZSBbY29kZU9mZnNldF0gd2l0aCBhbiBpbmxpbmluZyByZXR1cm4uCiAgLy8vCiAgLy8vIElmIFtpc0VtcHR5XSBpcyB0cnVlLCBhbHNvIGFzc29jaWF0ZSB0aGF0IHRoZSBpbmxpbmluZyBzdGFjayBpcyBlbXB0eSBhdAogIC8vLyBbY29kZU9mZnNldF0uCiAgdm9pZCByZWdpc3RlclBvcChpbnQgY29kZU9mZnNldCwge2Jvb2wgaXNFbXB0eTogZmFsc2V9KTsKfQoKLy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIFtTb3VyY2VNYXBwZXJdIHRoYXQgc3RvcmVzIHRoZSBpbmZvcm1hdGlvbiBkaXJlY3RseQovLy8gaW50byBhIFtTb3VyY2VMb2NhdGlvbnNdIG9iamVjdC4KY2xhc3MgU291cmNlTG9jYXRpb25zTWFwcGVyIGltcGxlbWVudHMgU291cmNlTWFwcGVyIHsKICBmaW5hbCBTb3VyY2VMb2NhdGlvbnMgc291cmNlTG9jYXRpb25zOwoKICBTb3VyY2VMb2NhdGlvbnNNYXBwZXIodGhpcy5zb3VyY2VMb2NhdGlvbnMpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyKE5vZGUgbm9kZSwgaW50IGNvZGVPZmZzZXQsIFNvdXJjZUxvY2F0aW9uIHNvdXJjZUxvY2F0aW9uKSB7CiAgICBzb3VyY2VMb2NhdGlvbnMuYWRkU291cmNlTG9jYXRpb24oY29kZU9mZnNldCwgc291cmNlTG9jYXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclB1c2goCiAgICAgIGludCBjb2RlT2Zmc2V0LCBTb3VyY2VMb2NhdGlvbiBzb3VyY2VMb2NhdGlvbiwgU3RyaW5nIGlubGluZWRNZXRob2ROYW1lKSB7CiAgICBzb3VyY2VMb2NhdGlvbnMuYWRkUHVzaChjb2RlT2Zmc2V0LCBzb3VyY2VMb2NhdGlvbiwgaW5saW5lZE1ldGhvZE5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclBvcChpbnQgY29kZU9mZnNldCwge2Jvb2wgaXNFbXB0eTogZmFsc2V9KSB7CiAgICBzb3VyY2VMb2NhdGlvbnMuYWRkUG9wKGNvZGVPZmZzZXQsIGlzRW1wdHkpOwogIH0KfQoKLy8vIEEgcHJvY2Vzc29yIHRoYXQgYXNzb2NpYXRlcyBbU291cmNlSW5mb3JtYXRpb25dIHdpdGggY29kZSBwb3NpdGlvbiBvZgovLy8gSmF2YVNjcmlwdCBbTm9kZV1zLgpjbGFzcyBTb3VyY2VJbmZvcm1hdGlvblByb2Nlc3NvciBleHRlbmRzIENvZGVQb3NpdGlvbkxpc3RlbmVyIHsKICBjb25zdCBTb3VyY2VJbmZvcm1hdGlvblByb2Nlc3NvcigpOwoKICAvLy8gUHJvY2VzcyB0aGUgc291cmNlIGluZm9ybWF0aW9uIGFuZCBjb2RlIHBvc2l0aW9ucyBmb3IgdGhlIFtub2RlXSBhbmQgYWxsCiAgLy8vIGl0cyBjaGlsZHJlbi4KICB2b2lkIHByb2Nlc3MoTm9kZSBub2RlLCBCdWZmZXJlZENvZGVPdXRwdXQgY29kZSkge30KfQp7AE5OPAEbASBHJ0cSAUsXTi8BT0tCLjEoLwQCAT4EPyAjAU8CAUEdIAFDBjE4AUoRBjIUTQIBSw0mMAIBM0EqASsBDDFMBAIBUA0eP0sBSBVQATYGTxQ7AgFNJTYpAS8BDExDBAEMFVFMBAEMPDEEAgFKGEAmAU8UNgIBLnBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzL2pzX3NvdXJjZV9tYXBwaW5nLmRhcnQyc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvbmF0aXZlL2JlaGF2aW9yLmRhcnTAAIAQLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgQ29tbW9uRWxlbWVudHMsIEVsZW1lbnRFbnZpcm9ubWVudDsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBhcyBqczsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL25hdGl2ZV9kYXRhLmRhcnQnIHNob3cgTmF0aXZlQmFzaWNEYXRhOwppbXBvcnQgJy4uL3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9zaWRlX2VmZmVjdHMuZGFydCcgc2hvdyBTaWRlRWZmZWN0czsKaW1wb3J0ICdqcy5kYXJ0JzsKCnR5cGVkZWYgZHluYW1pYyAvKkRhcnRUeXBlfFNwZWNpYWxUeXBlKi8gVHlwZUxvb2t1cChTdHJpbmcgdHlwZVN0cmluZywKICAgIHtib29sIHJlcXVpcmVkfSk7CgovLy8gVGhpcyBjbGFzcyBpcyBhIHRlbXBvcmFyeSB3b3JrLWFyb3VuZCB1bnRpbCB3ZSBnZXQgYSBtb3JlIHBvd2VyZnVsIERhcnRUeXBlLgpjbGFzcyBTcGVjaWFsVHlwZSB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgY29uc3QgU3BlY2lhbFR5cGUuXyh0aGlzLm5hbWUpOwoKICAvLy8gVGhlIHR5cGUgT2JqZWN0LCBidXQgbm8gc3VidHlwZXM6CiAgc3RhdGljIGNvbnN0IEpzT2JqZWN0ID0gY29uc3QgU3BlY2lhbFR5cGUuXygnPU9iamVjdCcpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IG5hbWUuaGFzaENvZGU7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IG5hbWU7CgogIHN0YXRpYyBTcGVjaWFsVHlwZSBmcm9tTmFtZShTdHJpbmcgbmFtZSkgewogICAgaWYgKG5hbWUgPT0gJz1PYmplY3QnKSB7CiAgICAgIHJldHVybiBKc09iamVjdDsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmtub3duIFNwZWNpYWxUeXBlICckbmFtZScuIik7CiAgICB9CiAgfQp9CgovLy8gRGVzY3JpcHRpb24gb2YgdGhlIGV4Y2VwdGlvbiBiZWhhdmlvdXIgb2YgbmF0aXZlIGNvZGUuCmNsYXNzIE5hdGl2ZVRocm93QmVoYXZpb3IgewogIHN0YXRpYyBjb25zdCBOYXRpdmVUaHJvd0JlaGF2aW9yIE5FVkVSID0gTmF0aXZlVGhyb3dCZWhhdmlvci5fKDApOwogIHN0YXRpYyBjb25zdCBOYXRpdmVUaHJvd0JlaGF2aW9yIE1BWSA9IE5hdGl2ZVRocm93QmVoYXZpb3IuXygxKTsKCiAgLy8vIFRocm93cyBvbmx5IGlmIGZpcnN0IGFyZ3VtZW50IGlzIG51bGwuCiAgc3RhdGljIGNvbnN0IE5hdGl2ZVRocm93QmVoYXZpb3IgTlVMTF9OU00gPSBOYXRpdmVUaHJvd0JlaGF2aW9yLl8oMik7CgogIC8vLyBUaHJvd3MgaWYgZmlyc3QgYXJndW1lbnQgaXMgbnVsbCwgdGhlbiBtYXkgdGhyb3cuCiAgc3RhdGljIGNvbnN0IE5hdGl2ZVRocm93QmVoYXZpb3IgTlVMTF9OU01fVEhFTl9NQVkgPSBOYXRpdmVUaHJvd0JlaGF2aW9yLl8oMyk7CgogIGZpbmFsIGludCBfYml0czsKICBjb25zdCBOYXRpdmVUaHJvd0JlaGF2aW9yLl8odGhpcy5fYml0cyk7CgogIGJvb2wgZ2V0IGNhblRocm93ID0+IHRoaXMgIT0gTkVWRVI7CgogIC8vLyBEb2VzIHRoaXMgYmVoYXZpb3IgYWx3YXlzIHRocm93IGEgbm9TdWNoTWV0aG9kIGNoZWNrIG9uIGEgbnVsbCBmaXJzdAogIC8vLyBhcmd1bWVudCBiZWZvcmUgYW55IHNpZGUgZWZmZWN0IG9yIG90aGVyIGV4Y2VwdGlvbj8KICBib29sIGdldCBpc051bGxOU01HdWFyZCA9PiB0aGlzID09IE5VTExfTlNNIHx8IHRoaXMgPT0gTlVMTF9OU01fVEhFTl9NQVk7CgogIC8vLyBEb2VzIHRoaXMgYmVoYXZpb3IgYWx3YXlzIGFjdCBhcyBhIG51bGwgbm9TdWNoTWV0aG9kIGNoZWNrLCBhbmQgaGFzIG5vCiAgLy8vIG90aGVyIHRocm93aW5nIGJlaGF2aW9yPwogIGJvb2wgZ2V0IGlzT25seU51bGxOU01HdWFyZCA9PiB0aGlzID09IE5VTExfTlNNOwoKICAvLy8gUmV0dXJucyB0aGUgYmVoYXZpb3IgaWYgd2UgYXNzdW1lIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBub3QgbnVsbC4KICBOYXRpdmVUaHJvd0JlaGF2aW9yIGdldCBvbk5vbk51bGwgewogICAgaWYgKHRoaXMgPT0gTlVMTF9OU00pIHJldHVybiBORVZFUjsKICAgIGlmICh0aGlzID09IE5VTExfTlNNX1RIRU5fTUFZKSByZXR1cm4gTUFZOwogICAgcmV0dXJuIHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBpZiAodGhpcyA9PSBORVZFUikgcmV0dXJuICduZXZlcic7CiAgICBpZiAodGhpcyA9PSBNQVkpIHJldHVybiAnbWF5JzsKICAgIGlmICh0aGlzID09IE5VTExfTlNNKSByZXR1cm4gJ251bGwoMSknOwogICAgaWYgKHRoaXMgPT0gTlVMTF9OU01fVEhFTl9NQVkpIHJldHVybiAnbnVsbCgxKSttYXknOwogICAgcmV0dXJuICdOYXRpdmVUaHJvd0JlaGF2aW9yKCRfYml0cyknOwogIH0KCiAgLy8vIENhbm9uaWNhbCBsaXN0IG9mIG1hcmtlciB2YWx1ZXMuCiAgLy8vCiAgLy8vIEFkZGVkIHRvIG1ha2UgW05hdGl2ZVRocm93QmVoYXZpb3JdIGVudW0tbGlrZS4KICBzdGF0aWMgY29uc3QgTGlzdDxOYXRpdmVUaHJvd0JlaGF2aW9yPiB2YWx1ZXMgPSBbCiAgICBORVZFUiwKICAgIE1BWSwKICAgIE5VTExfTlNNLAogICAgTlVMTF9OU01fVEhFTl9NQVksCiAgXTsKCiAgLy8vIEluZGV4IHRvIHRoaXMgbWFya2VyIHdpdGhpbiBbdmFsdWVzXS4KICAvLy8KICAvLy8gQWRkZWQgdG8gbWFrZSBbTmF0aXZlVGhyb3dCZWhhdmlvcl0gZW51bS1saWtlLgogIGludCBnZXQgaW5kZXggPT4gdmFsdWVzLmluZGV4T2YodGhpcyk7CgogIC8vLyBEZXNlcmlhbGl6ZXIgaGVscGVyLgogIHN0YXRpYyBOYXRpdmVUaHJvd0JlaGF2aW9yIF9iaXRzVG9WYWx1ZShpbnQgYml0cykgewogICAgc3dpdGNoIChiaXRzKSB7CiAgICAgIGNhc2UgMDoKICAgICAgICByZXR1cm4gTkVWRVI7CiAgICAgIGNhc2UgMToKICAgICAgICByZXR1cm4gTUFZOwogICAgICBjYXNlIDI6CiAgICAgICAgcmV0dXJuIE5VTExfTlNNOwogICAgICBjYXNlIDM6CiAgICAgICAgcmV0dXJuIE5VTExfTlNNX1RIRU5fTUFZOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgLy8vIFNlcXVlbmNlIG9wZXJhdG9yLgogIE5hdGl2ZVRocm93QmVoYXZpb3IgdGhlbihOYXRpdmVUaHJvd0JlaGF2aW9yIHNlY29uZCkgewogICAgaWYgKHRoaXMgPT0gTkVWRVIpIHJldHVybiBzZWNvbmQ7CiAgICBpZiAodGhpcyA9PSBNQVkpIHJldHVybiBNQVk7CiAgICBpZiAodGhpcyA9PSBOVUxMX05TTV9USEVOX01BWSkgcmV0dXJuIE5VTExfTlNNX1RIRU5fTUFZOwogICAgYXNzZXJ0KHRoaXMgPT0gTlVMTF9OU00pOwogICAgaWYgKHNlY29uZCA9PSBORVZFUikgcmV0dXJuIHRoaXM7CiAgICByZXR1cm4gTlVMTF9OU01fVEhFTl9NQVk7CiAgfQoKICAvLy8gQ2hvaWNlIG9wZXJhdG9yLgogIE5hdGl2ZVRocm93QmVoYXZpb3Igb3IoTmF0aXZlVGhyb3dCZWhhdmlvciBvdGhlcikgewogICAgaWYgKHRoaXMgPT0gb3RoZXIpIHJldHVybiB0aGlzOwogICAgcmV0dXJuIE1BWTsKICB9Cn0KCi8vLyBBIHN1bW1hcnkgb2YgdGhlIGJlaGF2aW9yIG9mIGEgbmF0aXZlIGVsZW1lbnQuCi8vLwovLy8gTmF0aXZlIGNvZGUgY2FuIHJldHVybiB2YWx1ZXMgb2Ygb25lIHR5cGUgYW5kIGNhdXNlIG5hdGl2ZSBzdWJ0eXBlcyBvZgovLy8gYW5vdGhlciB0eXBlIHRvIGJlIGluc3RhbnRpYXRlZC4gIEJ5IGRlZmF1bHQsIHdlIGNvbXB1dGUgYm90aCBmcm9tIHRoZQovLy8gZGVjbGFyZWQgdHlwZS4KLy8vCi8vLyBBIGZpZWxkIG1pZ2h0IHlpZWxkIGFueSBuYXRpdmUgdHlwZSB0aGF0ICdpcycgdGhlIGZpZWxkIHR5cGUuCi8vLwovLy8gQSBtZXRob2QgbWlnaHQgY3JlYXRlIGFuZCByZXR1cm4gaW5zdGFuY2VzIG9mIG5hdGl2ZSBzdWJjbGFzc2VzIG9mIGl0cwovLy8gZGVjbGFyZWQgcmV0dXJuIHR5cGUsIGFuZCBhIGNhbGxiYWNrIGFyZ3VtZW50IG1heSBiZSBjYWxsZWQgd2l0aCBpbnN0YW5jZXMKLy8vIG9mIHRoZSBjYWxsYmFjayBwYXJhbWV0ZXIgdHlwZSAoZS5nLiBFdmVudCkuCi8vLwovLy8gSWYgdGhlcmUgaXMgb25lIG9yIG1vcmUgYEBDcmVhdGVzYCBhbm5vdGF0aW9ucywgdGhlIHVuaW9uIG9mIHRoZSBuYW1lZCB0eXBlcwovLy8gcmVwbGFjZXMgdGhlIGluZmVycmVkIGluc3RhbnRpYXRlZCB0eXBlLCBhbmQgdGhlIHJldHVybiB0eXBlIGlzIGlnbm9yZWQgZm9yCi8vLyB0aGUgcHVycG9zZSBvZiBpbmZlcnJpbmcgaW5zdGFudGlhdGVkIHR5cGVzLgovLy8KLy8vICAgICBAQ3JlYXRlcygnSURCQ3Vyc29yJykgICAgLy8gQ3JlYXRlZCBhc3luY2hyb25vdXNseS4KLy8vICAgICBAQ3JlYXRlcygnSURCUmVxdWVzdCcpICAgLy8gQ3JlYXRlZCBzeW5jaHJvbm91c2x5IChmb3IgcmV0dXJuIHZhbHVlKS4KLy8vICAgICBJREJSZXF1ZXN0IG9wZW5DdXJzb3IoKTsKLy8vCi8vLyBJZiB0aGVyZSBpcyBvbmUgb3IgbW9yZSBgQFJldHVybnNgIGFubm90YXRpb25zLCB0aGUgdW5pb24gb2YgdGhlIG5hbWVkIHR5cGVzCi8vLyByZXBsYWNlcyB0aGUgZGVjbGFyZWQgcmV0dXJuIHR5cGUuCi8vLwovLy8gICAgIEBSZXR1cm5zKCdJREJSZXF1ZXN0JykKLy8vICAgICBJREJSZXF1ZXN0IG9wZW5DdXJzb3IoKTsKLy8vCi8vLyBUeXBlcyBpbiBhbm5vdGF0aW9ucyBhcmUgbm9uLW51bGxhYmxlLCBzbyBpbmNsdWRlIGBAUmV0dXJucygnTnVsbCcpYCBpZgovLy8gYG51bGxgIG1heSBiZSByZXR1cm5lZC4KY2xhc3MgTmF0aXZlQmVoYXZpb3IgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbTmF0aXZlQmVoYXZpb3JdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnbmF0aXZlLWJlaGF2aW9yJzsKCiAgLy8vIFtEYXJ0VHlwZV1zIG9yIFtTcGVjaWFsVHlwZV1zIHJldHVybmVkIG9yIHlpZWxkZWQgYnkgdGhlIG5hdGl2ZQogIC8vLyBlbGVtZW50LgogIGZpbmFsIExpc3QgdHlwZXNSZXR1cm5lZCA9IFtdOwoKICAvLy8gW0RhcnRUeXBlXXMgb3IgW1NwZWNpYWxUeXBlXXMgaW5zdGFudGlhdGVkIGJ5IHRoZSBuYXRpdmUKICAvLy8gZWxlbWVudC4KICBmaW5hbCBMaXN0IHR5cGVzSW5zdGFudGlhdGVkID0gW107CgogIFN0cmluZyBjb2RlVGVtcGxhdGVUZXh0OwogIC8vIElmIHRoaXMgYmVoYXZpb3IgaXMgZm9yIGEgSlMgZXhwcmVzc2lvbiwgW2NvZGVUZW1wbGF0ZV0gY29udGFpbnMgdGhlCiAgLy8gcGFyc2VkIHRyZWUuCiAganMuVGVtcGxhdGUgY29kZVRlbXBsYXRlOwoKICBmaW5hbCBTaWRlRWZmZWN0cyBzaWRlRWZmZWN0czsKCiAgTmF0aXZlVGhyb3dCZWhhdmlvciB0aHJvd0JlaGF2aW9yID0gTmF0aXZlVGhyb3dCZWhhdmlvci5NQVk7CgogIGJvb2wgaXNBbGxvY2F0aW9uID0gZmFsc2U7CiAgYm9vbCB1c2VHdm4gPSBmYWxzZTsKCiAgLy8gVE9ETyhzcmEpOiBNYWtlIE5hdGl2ZUJlaGF2aW9yIGltbXV0YWJsZSBzbyBQVVJFIGFuZCBQVVJFX0FMTE9DQVRJT04gY2FuIGJlCiAgLy8gZmluYWwgY29uc3RhbnQtbGlrZSBvYmplY3RzLgogIHN0YXRpYyBOYXRpdmVCZWhhdmlvciBnZXQgUFVSRSA9PiBOYXRpdmVCZWhhdmlvci5fbWFrZVB1cmUoKTsKICBzdGF0aWMgTmF0aXZlQmVoYXZpb3IgZ2V0IFBVUkVfQUxMT0NBVElPTiA9PgogICAgICBOYXRpdmVCZWhhdmlvci5fbWFrZVB1cmUoaXNBbGxvY2F0aW9uOiB0cnVlKTsKICBzdGF0aWMgTmF0aXZlQmVoYXZpb3IgZ2V0IENIQU5HRVNfT1RIRVIgPT4gTmF0aXZlQmVoYXZpb3IuX21ha2VDaGFuZ2VzT3RoZXIoKTsKICBzdGF0aWMgTmF0aXZlQmVoYXZpb3IgZ2V0IERFUEVORFNfT1RIRVIgPT4gTmF0aXZlQmVoYXZpb3IuX21ha2VEZXBlbmRzT3RoZXIoKTsKCiAgTmF0aXZlQmVoYXZpb3IoKSA6IHNpZGVFZmZlY3RzID0gbmV3IFNpZGVFZmZlY3RzLmVtcHR5KCk7CgogIE5hdGl2ZUJlaGF2aW9yLmludGVybmFsKHRoaXMuc2lkZUVmZmVjdHMpOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW05hdGl2ZUJlaGF2aW9yXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IE5hdGl2ZUJlaGF2aW9yLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CgogICAgTGlzdCByZWFkVHlwZXMoKSB7CiAgICAgIExpc3QgdHlwZXMgPSBbXTsKICAgICAgdHlwZXMuYWRkQWxsKHNvdXJjZS5yZWFkRGFydFR5cGVzKCkpOwogICAgICBpbnQgc3BlY2lhbENvdW50ID0gc291cmNlLnJlYWRJbnQoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVjaWFsQ291bnQ7IGkrKykgewogICAgICAgIFN0cmluZyBuYW1lID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgICAgICB0eXBlcy5hZGQoU3BlY2lhbFR5cGUuZnJvbU5hbWUobmFtZSkpOwogICAgICB9CiAgICAgIHJldHVybiB0eXBlczsKICAgIH0KCiAgICBMaXN0IHR5cGVzUmV0dXJuZWQgPSByZWFkVHlwZXMoKTsKICAgIExpc3QgdHlwZXNJbnN0YW50aWF0ZWQgPSByZWFkVHlwZXMoKTsKICAgIFN0cmluZyBjb2RlVGVtcGxhdGVUZXh0ID0gc291cmNlLnJlYWRTdHJpbmdPck51bGwoKTsKICAgIFNpZGVFZmZlY3RzIHNpZGVFZmZlY3RzID0gbmV3IFNpZGVFZmZlY3RzLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgaW50IHRocm93QmVoYXZpb3IgPSBzb3VyY2UucmVhZEludCgpOwogICAgYm9vbCBpc0FsbG9jYXRpb24gPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGJvb2wgdXNlR3ZuID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CgogICAgTmF0aXZlQmVoYXZpb3IgYmVoYXZpb3IgPSBuZXcgTmF0aXZlQmVoYXZpb3IuaW50ZXJuYWwoc2lkZUVmZmVjdHMpOwogICAgYmVoYXZpb3IudHlwZXNSZXR1cm5lZC5hZGRBbGwodHlwZXNSZXR1cm5lZCk7CiAgICBiZWhhdmlvci50eXBlc0luc3RhbnRpYXRlZC5hZGRBbGwodHlwZXNJbnN0YW50aWF0ZWQpOwogICAgaWYgKGNvZGVUZW1wbGF0ZVRleHQgIT0gbnVsbCkgewogICAgICBiZWhhdmlvci5jb2RlVGVtcGxhdGVUZXh0ID0gY29kZVRlbXBsYXRlVGV4dDsKICAgICAgYmVoYXZpb3IuY29kZVRlbXBsYXRlID0ganMuanMucGFyc2VGb3JlaWduSlMoY29kZVRlbXBsYXRlVGV4dCk7CiAgICB9CiAgICBiZWhhdmlvci50aHJvd0JlaGF2aW9yID0gTmF0aXZlVGhyb3dCZWhhdmlvci5fYml0c1RvVmFsdWUodGhyb3dCZWhhdmlvcik7CiAgICBhc3NlcnQoYmVoYXZpb3IudGhyb3dCZWhhdmlvci5fYml0cyA9PSB0aHJvd0JlaGF2aW9yKTsKICAgIGJlaGF2aW9yLmlzQWxsb2NhdGlvbiA9IGlzQWxsb2NhdGlvbjsKICAgIGJlaGF2aW9yLnVzZUd2biA9IHVzZUd2bjsKICAgIHJldHVybiBiZWhhdmlvcjsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW05hdGl2ZUJlaGF2aW9yXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwoKICAgIHZvaWQgd3JpdGVUeXBlcyhMaXN0IHR5cGVzKSB7CiAgICAgIExpc3Q8RGFydFR5cGU+IGRhcnRUeXBlcyA9IFtdOwogICAgICBMaXN0PFNwZWNpYWxUeXBlPiBzcGVjaWFsVHlwZXMgPSBbXTsKICAgICAgZm9yICh2YXIgdHlwZSBpbiB0eXBlcykgewogICAgICAgIGlmICh0eXBlIGlzIERhcnRUeXBlKSB7CiAgICAgICAgICBkYXJ0VHlwZXMuYWRkKHR5cGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzcGVjaWFsVHlwZXMuYWRkKHR5cGUpOwogICAgICAgIH0KICAgICAgfQogICAgICBzaW5rLndyaXRlRGFydFR5cGVzKGRhcnRUeXBlcyk7CiAgICAgIHNpbmsud3JpdGVJbnQoc3BlY2lhbFR5cGVzLmxlbmd0aCk7CiAgICAgIGZvciAoU3BlY2lhbFR5cGUgdHlwZSBpbiBzcGVjaWFsVHlwZXMpIHsKICAgICAgICBzaW5rLndyaXRlU3RyaW5nKHR5cGUubmFtZSk7CiAgICAgIH0KICAgIH0KCiAgICB3cml0ZVR5cGVzKHR5cGVzUmV0dXJuZWQpOwogICAgd3JpdGVUeXBlcyh0eXBlc0luc3RhbnRpYXRlZCk7CiAgICBzaW5rLndyaXRlU3RyaW5nT3JOdWxsKGNvZGVUZW1wbGF0ZVRleHQpOwogICAgc2lkZUVmZmVjdHMud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay53cml0ZUludCh0aHJvd0JlaGF2aW9yLl9iaXRzKTsKICAgIHNpbmsud3JpdGVCb29sKGlzQWxsb2NhdGlvbik7CiAgICBzaW5rLndyaXRlQm9vbCh1c2VHdm4pOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnTmF0aXZlQmVoYXZpb3IoJwogICAgICAgICdyZXR1cm5zOiAke3R5cGVzUmV0dXJuZWR9JwogICAgICAgICcsIGNyZWF0ZXM6ICR7dHlwZXNJbnN0YW50aWF0ZWR9JwogICAgICAgICcsIHNpZGVFZmZlY3RzOiAke3NpZGVFZmZlY3RzfScKICAgICAgICAnLCB0aHJvd3M6ICR7dGhyb3dCZWhhdmlvcn0nCiAgICAgICAgJyR7aXNBbGxvY2F0aW9uID8gIiwgaXNBbGxvY2F0aW9uIiA6ICIifScKICAgICAgICAnJHt1c2VHdm4gPyAiLCB1c2VHdm4iIDogIiJ9JwogICAgICAgICcpJzsKICB9CgogIHN0YXRpYyBOYXRpdmVCZWhhdmlvciBfbWFrZVB1cmUoe2Jvb2wgaXNBbGxvY2F0aW9uOiBmYWxzZX0pIHsKICAgIE5hdGl2ZUJlaGF2aW9yIGJlaGF2aW9yID0gbmV3IE5hdGl2ZUJlaGF2aW9yKCk7CiAgICBiZWhhdmlvci5zaWRlRWZmZWN0cy5jbGVhckFsbERlcGVuZGVuY2llcygpOwogICAgYmVoYXZpb3Iuc2lkZUVmZmVjdHMuY2xlYXJBbGxTaWRlRWZmZWN0cygpOwogICAgYmVoYXZpb3IudGhyb3dCZWhhdmlvciA9IE5hdGl2ZVRocm93QmVoYXZpb3IuTkVWRVI7CiAgICBiZWhhdmlvci5pc0FsbG9jYXRpb24gPSBpc0FsbG9jYXRpb247CiAgICByZXR1cm4gYmVoYXZpb3I7CiAgfQoKICBzdGF0aWMgTmF0aXZlQmVoYXZpb3IgX21ha2VDaGFuZ2VzT3RoZXIoKSB7CiAgICAvLyBUT0RPKDI1NTQ0KTogSGF2ZSBhIGRpc3RpbmN0IGVmZmVjdCBpbnN0ZWFkIG9mIHVzaW5nIHN0YXRpYyBwcm9wZXJ0aWVzIHRvCiAgICAvLyBtb2RlbCAnb3RoZXInIGVmZmVjdHMuCiAgICByZXR1cm4gX21ha2VQdXJlKCkuLnNpZGVFZmZlY3RzLnNldENoYW5nZXNTdGF0aWNQcm9wZXJ0eSgpOwogIH0KCiAgc3RhdGljIE5hdGl2ZUJlaGF2aW9yIF9tYWtlRGVwZW5kc090aGVyKCkgewogICAgLy8gVE9ETygyNTU0NCk6IEhhdmUgYSBkaXN0aW5jdCBlZmZlY3QgaW5zdGVhZCBvZiB1c2luZyBzdGF0aWMgcHJvcGVydGllcyB0bwogICAgLy8gbW9kZWwgJ290aGVyJyBlZmZlY3RzLgogICAgcmV0dXJuIF9tYWtlUHVyZSgpLi5zaWRlRWZmZWN0cy5zZXREZXBlbmRzT25TdGF0aWNQcm9wZXJ0eVN0b3JlKCk7CiAgfQoKICAvLy8gUHJvY2Vzc2VzIHRoZSB0eXBlIHNwZWNpZmljYXRpb24gc3RyaW5nIG9mIGEgY2FsbCB0byBKUyBhbmQgc3RvcmVzIHRoZQogIC8vLyByZXN1bHQgaW4gdGhlIFt0eXBlc1JldHVybmVkXSBhbmQgW3R5cGVzSW5zdGFudGlhdGVkXS4gSXQgZnVydGhlcm1vcmUKICAvLy8gY29tcHV0ZXMgdGhlIHNpZGUgZWZmZWN0cywgYW5kLCBpZiBnaXZlbiwgaW52b2tlcyBbc2V0U2lkZUVmZmVjdHNdIHdpdGgKICAvLy8gdGhlIGNvbXB1dGVkIGVmZmVjdHMuIElmIG5vIHNpZGUgZWZmZWN0cyBhcmUgZW5jb2RlZCBpbiB0aGUgW3NwZWNTdHJpbmddCiAgLy8vIHRoZSBbc2V0U2lkZUVmZmVjdHNdIG1ldGhvZCBpcyBub3QgaW52b2tlZC4KICAvLy8KICAvLy8gVHdvIGZvcm1zIG9mIHRoZSBzdHJpbmcgaXMgc3VwcG9ydGVkOgogIC8vLwogIC8vLyAxKSBBIHNpbmdsZSB0eXBlIHN0cmluZyBvZiB0aGUgZm9ybSAndm9pZCcsICcnLCAndmFyJyBvciAnVDF8Li4ufFRuJyB3aGljaAogIC8vLyAgICBkZWZpbmVzIHRoZSB0eXBlcyByZXR1cm5lZCwgYW5kLCBmb3IgdGhlIGxhc3QgZm9ybSwgdGhlIHR5cGVzIGFsc28KICAvLy8gICAgY3JlYXRlZCBieSB0aGUgY2FsbCB0byBKUy4gICd2YXInIChhbmQgJycpIGFyZSBsaWtlICdkeW5hbWljJyBvcgogIC8vLyAgICAnT2JqZWN0JyBleGNlcHQgdGhhdCAnZHluYW1pYycgd291bGQgaW5kaWNhdGUgdGhhdCBvYmplY3RzIG9mIGFueSB0eXBlCiAgLy8vICAgIGFyZSBjcmVhdGVkLCB3aGljaCBkZWZlYXRzIHRyZWUtc2hha2luZy4gIFRoaW5rIG9mICd2YXInIChhbmQgJycpIGFzCiAgLy8vICAgIG1lYW5pbmcgJ2FueSBwcmUtZXhpc3RpbmcgdHlwZScuCiAgLy8vCiAgLy8vICAgIFRoZSB0eXBlcyBUaSBhcmUgbm9uLW51bGxhYmxlLCBzbyBhZGQgY2xhc3MgYE51bGxgIHRvIHNwZWNpZnkgYQogIC8vLyAgICBudWxsYWJsZSB0eXBlLCBlLmcgYCdTdHJpbmd8TnVsbCdgLgogIC8vLwogIC8vLyAyKSBBIHNlcXVlbmNlIG9mIDx0YWc+Ojx2YWx1ZT4gcGFpcnMgb2YgdGhlIGZvbGxvd2luZyBraW5kcwogIC8vLwogIC8vLyAgICAgICAgPHR5cGUtdGFnPjo8dHlwZS1zdHJpbmc+CiAgLy8vICAgICAgICA8ZWZmZWN0LXRhZz46PGVmZmVjdC1zdHJpbmc+CiAgLy8vICAgICAgICB0aHJvd3M6PHRocm93cy1zdHJpbmc+CiAgLy8vICAgICAgICBndm46PGd2bi1zdHJpbmc+CiAgLy8vICAgICAgICBuZXc6PG5ldy1zdHJpbmc+CiAgLy8vCiAgLy8vICAgIEEgPHR5cGUtdGFnPiBpcyBlaXRoZXIgJ3JldHVybnMnIG9yICdjcmVhdGVzJyBhbmQgPHR5cGUtc3RyaW5nPiBpcyBhCiAgLy8vICAgIHR5cGUgc3RyaW5nIGxpa2UgaW4gMSkuIFRoZSB0eXBlIHN0cmluZyBtYXJrZWQgYnkgJ3JldHVybnMnIGRlZmluZXMgdGhlCiAgLy8vICAgIHR5cGVzIHJldHVybmVkIGFuZCAnY3JlYXRlcycgZGVmaW5lcyB0aGUgdHlwZXMgY3JlYXRlZCBieSB0aGUgY2FsbCB0bwogIC8vLyAgICBKUy4gSWYgJ2NyZWF0ZXMnIGlzIG1pc3NpbmcsIGl0IGRlZmF1bHRzIHRvICdyZXR1cm5zJy4KICAvLy8KICAvLy8gICAgQW4gPGVmZmVjdC10YWc+IGlzIGVpdGhlciAnZWZmZWN0cycgb3IgJ2RlcGVuZHMnIGFuZCA8ZWZmZWN0LXN0cmluZz4gaXMKICAvLy8gICAgZWl0aGVyICdhbGwnLCAnbm9uZScgb3IgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiAnbm8taW5kZXgnLAogIC8vLyAgICAnbm8taW5zdGFuY2UnLCAnbm8tc3RhdGljJy4KICAvLy8KICAvLy8gICAgVGhlIGZsYWcgJ2FsbCcgaW5kaWNhdGVzIHRoYXQgdGhlIGNhbGwgYWZmZWN0cy9kZXBlbmRzIG9uIGV2ZXJ5CiAgLy8vICAgIHNpZGUtZWZmZWN0LiBUaGUgZmxhZyAnbm9uZScgaW5kaWNhdGVzIHRoYXQgdGhlIGNhbGwgZG9lcyBub3QgYWZmZWN0CiAgLy8vICAgIChyZXNwLiBkZXBlbmRzIG9uKSBhbnl0aGluZy4KICAvLy8KICAvLy8gICAgJ25vLWluZGV4JyBpbmRpY2F0ZXMgdGhhdCB0aGUgY2FsbCBkb2VzICpub3QqIGRvIGFueSBhcnJheSBpbmRleC1zdG9yZQogIC8vLyAgICAoZm9yICdlZmZlY3RzJyksIG9yIGRlcGVuZHMgb24gYW55IHZhbHVlIGluIGFuIGFycmF5IChmb3IgJ2RlcGVuZHMnKS4KICAvLy8gICAgVGhlIGZsYWcgJ25vLWluc3RhbmNlJyBpbmRpY2F0ZXMgdGhhdCB0aGUgY2FsbCBkb2VzIG5vdCBtb2RpZnkgKHJlc3AuCiAgLy8vICAgIGRlcGVuZHMgb24pIGFueSBpbnN0YW5jZSB2YXJpYWJsZS4gU2ltaWxhcmx5IHN0YXRpYyB2YXJpYWJsZXMgYXJlCiAgLy8vICAgIGluZGljYXRlZCB3aXRoICduby1zdGF0aWMnLiBUaGUgZmxhZ3MgJ2VmZmVjdHMnIGFuZCAnZGVwZW5kcycgbXVzdCBiZQogIC8vLyAgICB1c2VkIGluIHVuaXNvbiAoZWl0aGVyIGJvdGggYXJlIHByZXNlbnQgb3Igbm9uZSBpcykuCiAgLy8vCiAgLy8vICAgIFRoZSA8dGhyb3dzLXN0cmluZz4gdmFsdWVzIGFyZSAnbmV2ZXInLCAnbWF5JywgJ251bGwoMSknLCBhbmQKICAvLy8gICAgJ251bGwoMSkrbWF5Jy4gIFRoZSBkZWZhdWx0IGlmIHVuc3BlY2lmaWVkIGlzICdtYXknLiAnbnVsbCgxKScgbWVhbnMKICAvLy8gICAgdGhhdCB0aGUgdGVtcGxhdGUgZXhwcmVzc2lvbiB0aHJvd3MgaWYgYW5kIG9ubHkgaWYgdGhlIGZpcnN0IHRlbXBsYXRlCiAgLy8vICAgIHBhcmFtZXRlciBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAsIGFuZCAnbnVsbCgxKSttYXknIHRocm93cyBpZiB0aGUKICAvLy8gICAgZmlyc3QgYXJndW1lbnQgaXMgYG51bGxgIC8gYHVuZGVmaW5lZGAsIGFuZCB0aGVuIG1heSB0aHJvdyBmb3Igb3RoZXIKICAvLy8gICAgcmVhc29ucy4KICAvLy8KICAvLy8gICAgPGd2bi1zdHJpbmc+IHZhbHVlcyBhcmUgJ3RydWUnIGFuZCAnZmFsc2UnLiBUaGUgZGVmYXVsdCBpZiB1bnNwZWNpZmllZAogIC8vLyAgICBpcyAnZmFsc2UnLgogIC8vLwogIC8vLyAgICA8bmV3LXN0cmluZz4gdmFsdWVzIGFyZSAndHJ1ZScgYW5kICdmYWxzZScuIFRoZSBkZWZhdWx0IGlmIHVuc3BlY2lmaWVkCiAgLy8vICAgIGlzICdmYWxzZScuIEEgJ3RydWUnIHZhbHVlIG1lYW5zIHRoYXQgZWFjaCBldmFsdWF0aW9uIHJldHVybnMgYSBmcmVzaAogIC8vLyAgICAobmV3KSBvYmplY3QgdGhhdCBjYW5ub3QgYmUgdW5hbGlhc2VkIHdpdGggZXhpc3Rpbmcgb2JqZWN0cy4KICAvLy8KICAvLy8gICAgRWFjaCB0YWcga2luZCAoaW5jbHVkaW5nIHRoZSAndHlwZS10YWcncykgY2FuIG9ubHkgb2NjdXIgb25jZSBpbiB0aGUKICAvLy8gICAgc2VxdWVuY2UuCiAgLy8vCiAgLy8vIFtzcGVjU3RyaW5nXSBpcyB0aGUgc3BlY2lmaWNhdGlvbiBzdHJpbmcsIFtsb29rdXBUeXBlXSByZXNvbHZlcyBuYW1lZAogIC8vLyB0eXBlcyBpbnRvIHR5cGUgdmFsdWVzLCBbdHlwZXNSZXR1cm5lZF0gYW5kIFt0eXBlc0luc3RhbnRpYXRlZF0gY29sbGVjdHMKICAvLy8gdGhlIHR5cGVzIGRlZmluZWQgYnkgdGhlIHNwZWNpZmljYXRpb24gc3RyaW5nLCBhbmQgW29iamVjdFR5cGVdIGFuZAogIC8vLyBbbnVsbFR5cGVdIGRlZmluZSB0aGUgdHlwZXMgZm9yIGBPYmplY3RgIGFuZCBgTnVsbGAsIHJlc3BlY3RpdmVseS4gVGhlCiAgLy8vIGxhdHRlciBpcyB1c2VkIGZvciB0aGUgdHlwZSBzdHJpbmdzIG9mIHRoZSBmb3JtICcnIGFuZCAndmFyJy4KICAvLy8gW3ZhbGlkVGFnc10gY2FuIGJlIHVzZWQgdG8gcmVzdHJpY3Qgd2hpY2ggdGFncyBhcmUgYWNjZXB0ZWQuCiAgc3RhdGljIHZvaWQgcHJvY2Vzc1NwZWNTdHJpbmcoCiAgICAgIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwgU3Bhbm5hYmxlIHNwYW5uYWJsZSwgU3RyaW5nIHNwZWNTdHJpbmcsCiAgICAgIHtJdGVyYWJsZTxTdHJpbmc+IHZhbGlkVGFncywKICAgICAgdm9pZCBzZXRTaWRlRWZmZWN0cyhTaWRlRWZmZWN0cyBuZXdFZmZlY3RzKSwKICAgICAgdm9pZCBzZXRUaHJvd3MoTmF0aXZlVGhyb3dCZWhhdmlvciB0aHJvd0tpbmQpLAogICAgICB2b2lkIHNldElzQWxsb2NhdGlvbihib29sIGlzQWxsb2NhdGlvbiksCiAgICAgIHZvaWQgc2V0VXNlR3ZuKGJvb2wgdXNlR3ZuKSwKICAgICAgVHlwZUxvb2t1cCBsb29rdXBUeXBlLAogICAgICBMaXN0IHR5cGVzUmV0dXJuZWQsCiAgICAgIExpc3QgdHlwZXNJbnN0YW50aWF0ZWQsCiAgICAgIG9iamVjdFR5cGUsCiAgICAgIG51bGxUeXBlfSkgewogICAgYm9vbCBzZWVuRXJyb3IgPSBmYWxzZTsKCiAgICB2b2lkIHJlcG9ydEVycm9yKFN0cmluZyBtZXNzYWdlKSB7CiAgICAgIHNlZW5FcnJvciA9IHRydWU7CiAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgIHNwYW5uYWJsZSwgTWVzc2FnZUtpbmQuR0VORVJJQywgeyd0ZXh0JzogbWVzc2FnZX0pOwogICAgfQoKICAgIGNvbnN0IExpc3Q8U3RyaW5nPiBrbm93blRhZ3MgPSBjb25zdCBbCiAgICAgICdjcmVhdGVzJywKICAgICAgJ3JldHVybnMnLAogICAgICAnZGVwZW5kcycsCiAgICAgICdlZmZlY3RzJywKICAgICAgJ3Rocm93cycsCiAgICAgICdndm4nLAogICAgICAnbmV3JwogICAgXTsKCiAgICAvLy8gUmVzb2x2ZSBhIHR5cGUgc3RyaW5nIG9mIG9uZSBvZiB0aGUgdGhyZWUgZm9ybXM6CiAgICAvLy8gKiAgJ3ZvaWQnIC0gaW4gd2hpY2ggY2FzZSBbb25Wb2lkXSBpcyBjYWxsZWQsCiAgICAvLy8gKiAgJycgb3IgJ3ZhcicgLSBpbiB3aGljaCBjYXNlIFtvblZhcl0gaXMgY2FsbGVkLAogICAgLy8vICogICdUMXwuLi58VG4nIC0gaW4gd2hpY2ggY2FzZSBbb25UeXBlXSBpcyBjYWxsZWQgZm9yIGVhY2ggcmVzb2x2ZWQgVGkuCiAgICB2b2lkIHJlc29sdmVUeXBlc1N0cmluZyhTdHJpbmcgdHlwZXNTdHJpbmcsCiAgICAgICAge29uVm9pZCgpLCBvblZhcigpLCBvblR5cGUodHlwZSl9KSB7CiAgICAgIC8vIFZhcmlvdXMgdGhpbmdzIHRoYXQgYXJlIG5vdCBpbiBmYWN0IHR5cGVzLgogICAgICBpZiAodHlwZXNTdHJpbmcgPT0gJ3ZvaWQnKSB7CiAgICAgICAgaWYgKG9uVm9pZCAhPSBudWxsKSB7CiAgICAgICAgICBvblZvaWQoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0eXBlc1N0cmluZyA9PSAnJyB8fCB0eXBlc1N0cmluZyA9PSAndmFyJykgewogICAgICAgIGlmIChvblZhciAhPSBudWxsKSB7CiAgICAgICAgICBvblZhcigpOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZm9yIChmaW5hbCB0eXBlU3RyaW5nIGluIHR5cGVzU3RyaW5nLnNwbGl0KCd8JykpIHsKICAgICAgICBvblR5cGUoX3BhcnNlVHlwZSh0eXBlU3RyaW5nLnRyaW0oKSwgbG9va3VwVHlwZSkpOwogICAgICB9CiAgICB9CgogICAgaWYgKCFzcGVjU3RyaW5nLmNvbnRhaW5zKCc7JykgJiYgIXNwZWNTdHJpbmcuY29udGFpbnMoJzonKSkgewogICAgICAvLyBGb3JtICgxKSwgdHlwZXMgb3IgcHNldWRvLXR5cGVzIGxpa2UgJ3ZvaWQnIGFuZCAndmFyJy4KICAgICAgcmVzb2x2ZVR5cGVzU3RyaW5nKHNwZWNTdHJpbmcudHJpbSgpLCBvblZhcjogKCkgewogICAgICAgIHR5cGVzUmV0dXJuZWQuYWRkKG9iamVjdFR5cGUpOwogICAgICAgIHR5cGVzUmV0dXJuZWQuYWRkKG51bGxUeXBlKTsKICAgICAgfSwgb25UeXBlOiAodHlwZSkgewogICAgICAgIHR5cGVzSW5zdGFudGlhdGVkLmFkZCh0eXBlKTsKICAgICAgICB0eXBlc1JldHVybmVkLmFkZCh0eXBlKTsKICAgICAgfSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBMaXN0PFN0cmluZz4gc3BlY3MgPSBzcGVjU3RyaW5nLnNwbGl0KCc7JykubWFwKChzKSA9PiBzLnRyaW0oKSkudG9MaXN0KCk7CiAgICBpZiAoc3BlY3MubGFzdCA9PSAiIikgc3BlY3MucmVtb3ZlTGFzdCgpOyAvLyBBbGxvdyBzZXBhcmF0b3IgdG8gdGVybWluYXRlLgoKICAgIGFzc2VydCgKICAgICAgICB2YWxpZFRhZ3MgPT0gbnVsbCB8fCAodmFsaWRUYWdzLnRvU2V0KCkuLnJlbW92ZUFsbCh2YWxpZFRhZ3MpKS5pc0VtcHR5KTsKICAgIGlmICh2YWxpZFRhZ3MgPT0gbnVsbCkgdmFsaWRUYWdzID0ga25vd25UYWdzOwoKICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWVzID0gPFN0cmluZywgU3RyaW5nPnt9OwoKICAgIGZvciAoU3RyaW5nIHNwZWMgaW4gc3BlY3MpIHsKICAgICAgTGlzdDxTdHJpbmc+IHRhZ0FuZFZhbHVlID0gc3BlYy5zcGxpdCgnOicpOwogICAgICBpZiAodGFnQW5kVmFsdWUubGVuZ3RoICE9IDIpIHsKICAgICAgICByZXBvcnRFcnJvcigiSW52YWxpZCA8dGFnPjo8dmFsdWU+IHBhaXIgJyRzcGVjJy4iKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBTdHJpbmcgdGFnID0gdGFnQW5kVmFsdWVbMF0udHJpbSgpOwogICAgICBTdHJpbmcgdmFsdWUgPSB0YWdBbmRWYWx1ZVsxXS50cmltKCk7CgogICAgICBpZiAodmFsaWRUYWdzLmNvbnRhaW5zKHRhZykpIHsKICAgICAgICBpZiAodmFsdWVzW3RhZ10gPT0gbnVsbCkgewogICAgICAgICAgdmFsdWVzW3RhZ10gPSB2YWx1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVwb3J0RXJyb3IoIkR1cGxpY2F0ZSB0YWcgJyR0YWcnLiIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoa25vd25UYWdzLmNvbnRhaW5zKHRhZykpIHsKICAgICAgICAgIHJlcG9ydEVycm9yKCJUYWcgJyR0YWcnIGlzIG5vdCB2YWxpZCBoZXJlLiIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXBvcnRFcnJvcigiVW5rbm93biB0YWcgJyR0YWcnLiIpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIEVudW0tbGlrZSB0YWdzIGFyZSBsb29rZWQgdXAgaW4gYSBtYXAuIFRydWUgc2lnbmF0dXJlIGlzOgogICAgLy8KICAgIC8vICBUIHRhZ1ZhbHVlTG9va3VwPFQ+KFN0cmluZyB0YWcsIE1hcDxTdHJpbmcsIFQ+IG1hcCk7CiAgICAvLwogICAgZHluYW1pYyB0YWdWYWx1ZUxvb2t1cChTdHJpbmcgdGFnLCBNYXA8U3RyaW5nLCBkeW5hbWljPiBtYXApIHsKICAgICAgU3RyaW5nIHRhZ1N0cmluZyA9IHZhbHVlc1t0YWddOwogICAgICBpZiAodGFnU3RyaW5nID09IG51bGwpIHJldHVybiBudWxsOwogICAgICB2YXIgdmFsdWUgPSBtYXBbdGFnU3RyaW5nXTsKICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICByZXBvcnRFcnJvcigiVW5rbm93biAnJHRhZycgc3BlY2lmaWNhdGlvbjogJyR0YWdTdHJpbmcnLiIpOwogICAgICB9CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KCiAgICBTdHJpbmcgcmV0dXJucyA9IHZhbHVlc1sncmV0dXJucyddOwogICAgaWYgKHJldHVybnMgIT0gbnVsbCkgewogICAgICByZXNvbHZlVHlwZXNTdHJpbmcocmV0dXJucywgb25WYXI6ICgpIHsKICAgICAgICB0eXBlc1JldHVybmVkLmFkZChvYmplY3RUeXBlKTsKICAgICAgICB0eXBlc1JldHVybmVkLmFkZChudWxsVHlwZSk7CiAgICAgIH0sIG9uVHlwZTogKHR5cGUpIHsKICAgICAgICB0eXBlc1JldHVybmVkLmFkZCh0eXBlKTsKICAgICAgfSk7CiAgICB9CgogICAgU3RyaW5nIGNyZWF0ZXMgPSB2YWx1ZXNbJ2NyZWF0ZXMnXTsKICAgIGlmIChjcmVhdGVzICE9IG51bGwpIHsKICAgICAgcmVzb2x2ZVR5cGVzU3RyaW5nKGNyZWF0ZXMsIG9uVm9pZDogKCkgewogICAgICAgIHJlcG9ydEVycm9yKCJJbnZhbGlkIHR5cGUgc3RyaW5nICdjcmVhdGVzOiRjcmVhdGVzJyIpOwogICAgICB9LCBvblR5cGU6ICh0eXBlKSB7CiAgICAgICAgdHlwZXNJbnN0YW50aWF0ZWQuYWRkKHR5cGUpOwogICAgICB9KTsKICAgIH0gZWxzZSBpZiAocmV0dXJucyAhPSBudWxsKSB7CiAgICAgIHJlc29sdmVUeXBlc1N0cmluZyhyZXR1cm5zLCBvblR5cGU6ICh0eXBlKSB7CiAgICAgICAgdHlwZXNJbnN0YW50aWF0ZWQuYWRkKHR5cGUpOwogICAgICB9KTsKICAgIH0KCiAgICBjb25zdCB0aHJvd3NPcHRpb24gPSA8U3RyaW5nLCBOYXRpdmVUaHJvd0JlaGF2aW9yPnsKICAgICAgJ25ldmVyJzogTmF0aXZlVGhyb3dCZWhhdmlvci5ORVZFUiwKICAgICAgJ21heSc6IE5hdGl2ZVRocm93QmVoYXZpb3IuTUFZLAogICAgICAnbnVsbCgxKSc6IE5hdGl2ZVRocm93QmVoYXZpb3IuTlVMTF9OU00sCiAgICAgICdudWxsKDEpK21heSc6IE5hdGl2ZVRocm93QmVoYXZpb3IuTlVMTF9OU01fVEhFTl9NQVksCiAgICB9OwoKICAgIGNvbnN0IGJvb2xPcHRpb25zID0gPFN0cmluZywgYm9vbD57J3RydWUnOiB0cnVlLCAnZmFsc2UnOiBmYWxzZX07CgogICAgU2lkZUVmZmVjdHMgc2lkZUVmZmVjdHMgPQogICAgICAgIHByb2Nlc3NFZmZlY3RzKHJlcG9ydEVycm9yLCB2YWx1ZXNbJ2VmZmVjdHMnXSwgdmFsdWVzWydkZXBlbmRzJ10pOwogICAgTmF0aXZlVGhyb3dCZWhhdmlvciB0aHJvd3NLaW5kID0gdGFnVmFsdWVMb29rdXAoJ3Rocm93cycsIHRocm93c09wdGlvbik7CiAgICBib29sIGlzQWxsb2NhdGlvbiA9IHRhZ1ZhbHVlTG9va3VwKCduZXcnLCBib29sT3B0aW9ucyk7CiAgICBib29sIHVzZUd2biA9IHRhZ1ZhbHVlTG9va3VwKCdndm4nLCBib29sT3B0aW9ucyk7CgogICAgaWYgKGlzQWxsb2NhdGlvbiA9PSB0cnVlICYmIHVzZUd2biA9PSB0cnVlKSB7CiAgICAgIHJlcG9ydEVycm9yKCInbmV3JyBhbmQgJ2d2bicgYXJlIGluY29tcGF0aWJsZSIpOwogICAgfQoKICAgIGlmIChzZWVuRXJyb3IpIHJldHVybjsgLy8gQXZvaWQgY2FsbGJhY2tzLgoKICAgIC8vIFRPRE8oc3JhKTogU2ltcGxpZnkgW3Rocm93QmVoYXZpb3JdIHVzaW5nIFtzaWRlRWZmZWN0c10uCgogICAgaWYgKHNpZGVFZmZlY3RzICE9IG51bGwpIHNldFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzKTsKICAgIGlmICh0aHJvd3NLaW5kICE9IG51bGwpIHNldFRocm93cyh0aHJvd3NLaW5kKTsKICAgIGlmIChpc0FsbG9jYXRpb24gIT0gbnVsbCkgc2V0SXNBbGxvY2F0aW9uKGlzQWxsb2NhdGlvbik7CiAgICBpZiAodXNlR3ZuICE9IG51bGwpIHNldFVzZUd2bih1c2VHdm4pOwogIH0KCiAgc3RhdGljIFNpZGVFZmZlY3RzIHByb2Nlc3NFZmZlY3RzKAogICAgICB2b2lkIHJlcG9ydEVycm9yKFN0cmluZyBtZXNzYWdlKSwgU3RyaW5nIGVmZmVjdHMsIFN0cmluZyBkZXBlbmRzKSB7CiAgICBpZiAoZWZmZWN0cyA9PSBudWxsICYmIGRlcGVuZHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CgogICAgaWYgKGVmZmVjdHMgPT0gbnVsbCB8fCBkZXBlbmRzID09IG51bGwpIHsKICAgICAgcmVwb3J0RXJyb3IoIidlZmZlY3RzJyBhbmQgJ2RlcGVuZHMnIG11c3Qgb2NjdXIgdG9nZXRoZXIuIik7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIFNpZGVFZmZlY3RzIHNpZGVFZmZlY3RzID0gbmV3IFNpZGVFZmZlY3RzKCk7CiAgICBpZiAoZWZmZWN0cyA9PSAibm9uZSIpIHsKICAgICAgc2lkZUVmZmVjdHMuY2xlYXJBbGxTaWRlRWZmZWN0cygpOwogICAgfSBlbHNlIGlmIChlZmZlY3RzID09ICJhbGwiKSB7CiAgICAgIC8vIERvbid0IGRvIGFueXRoaW5nLgogICAgfSBlbHNlIHsKICAgICAgTGlzdDxTdHJpbmc+IHNwbGl0RWZmZWN0cyA9IGVmZmVjdHMuc3BsaXQoIiwiKTsKICAgICAgaWYgKHNwbGl0RWZmZWN0cy5pc0VtcHR5KSB7CiAgICAgICAgcmVwb3J0RXJyb3IoIk1pc3Npbmcgc2lkZS1lZmZlY3QgZmxhZy4iKTsKICAgICAgfQogICAgICBmb3IgKFN0cmluZyBlZmZlY3QgaW4gc3BsaXRFZmZlY3RzKSB7CiAgICAgICAgc3dpdGNoIChlZmZlY3QpIHsKICAgICAgICAgIGNhc2UgIm5vLWluZGV4IjoKICAgICAgICAgICAgc2lkZUVmZmVjdHMuY2xlYXJDaGFuZ2VzSW5kZXgoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJuby1pbnN0YW5jZSI6CiAgICAgICAgICAgIHNpZGVFZmZlY3RzLmNsZWFyQ2hhbmdlc0luc3RhbmNlUHJvcGVydHkoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJuby1zdGF0aWMiOgogICAgICAgICAgICBzaWRlRWZmZWN0cy5jbGVhckNoYW5nZXNTdGF0aWNQcm9wZXJ0eSgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJlcG9ydEVycm9yKCJVbnJlY29nbml6ZWQgc2lkZS1lZmZlY3QgZmxhZzogJyRlZmZlY3QnLiIpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmIChkZXBlbmRzID09ICJub25lIikgewogICAgICBzaWRlRWZmZWN0cy5jbGVhckFsbERlcGVuZGVuY2llcygpOwogICAgfSBlbHNlIGlmIChkZXBlbmRzID09ICJhbGwiKSB7CiAgICAgIC8vIERvbid0IGRvIGFueXRoaW5nLgogICAgfSBlbHNlIHsKICAgICAgTGlzdDxTdHJpbmc+IHNwbGl0RGVwZW5kZW5jaWVzID0gZGVwZW5kcy5zcGxpdCgiLCIpOwogICAgICBpZiAoc3BsaXREZXBlbmRlbmNpZXMuaXNFbXB0eSkgewogICAgICAgIHJlcG9ydEVycm9yKCJNaXNzaW5nIHNpZGUtZWZmZWN0IGRlcGVuZGVuY3kgZmxhZy4iKTsKICAgICAgfQogICAgICBmb3IgKFN0cmluZyBkZXBlbmRlbmN5IGluIHNwbGl0RGVwZW5kZW5jaWVzKSB7CiAgICAgICAgc3dpdGNoIChkZXBlbmRlbmN5KSB7CiAgICAgICAgICBjYXNlICJuby1pbmRleCI6CiAgICAgICAgICAgIHNpZGVFZmZlY3RzLmNsZWFyRGVwZW5kc09uSW5kZXhTdG9yZSgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgIm5vLWluc3RhbmNlIjoKICAgICAgICAgICAgc2lkZUVmZmVjdHMuY2xlYXJEZXBlbmRzT25JbnN0YW5jZVByb3BlcnR5U3RvcmUoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJuby1zdGF0aWMiOgogICAgICAgICAgICBzaWRlRWZmZWN0cy5jbGVhckRlcGVuZHNPblN0YXRpY1Byb3BlcnR5U3RvcmUoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXBvcnRFcnJvcigiVW5yZWNvZ25pemVkIHNpZGUtZWZmZWN0IGZsYWc6ICckZGVwZW5kZW5jeScuIik7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHNpZGVFZmZlY3RzOwogIH0KCiAgLy8vIENvbXB1dGUgdGhlIFtOYXRpdmVCZWhhdmlvcl0gZm9yIGEgY2FsbCB0byB0aGUgJ0pTJyBmdW5jdGlvbiB3aXRoIHRoZQogIC8vLyBnaXZlbiBbc3BlY1N0cmluZ10gYW5kIFtjb2RlU3RyaW5nXSAoZmlyc3QgYW5kIHNlY29uZCBhcmd1bWVudHMpLgogIHN0YXRpYyBOYXRpdmVCZWhhdmlvciBvZkpzQ2FsbCgKICAgICAgU3RyaW5nIHNwZWNTdHJpbmcsCiAgICAgIFN0cmluZyBjb2RlU3RyaW5nLAogICAgICBUeXBlTG9va3VwIGxvb2t1cFR5cGUsCiAgICAgIFNwYW5uYWJsZSBzcGFubmFibGUsCiAgICAgIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwKICAgICAgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpIHsKICAgIC8vIFRoZSBmaXJzdCBhcmd1bWVudCBvZiBhIEpTLWNhbGwgaXMgYSBzdHJpbmcgZW5jb2RpbmcgdmFyaW91cyBhdHRyaWJ1dGVzCiAgICAvLyBvZiB0aGUgY29kZS4KICAgIC8vCiAgICAvLyAgJ1R5cGUxfFR5cGUyJy4gIEEgdW5pb24gdHlwZS4KICAgIC8vICAnPU9iamVjdCcuICAgICAgQSBKYXZhU2NyaXB0IE9iamVjdCwgbm8gc3VidHlwZS4KCiAgICBOYXRpdmVCZWhhdmlvciBiZWhhdmlvciA9IG5ldyBOYXRpdmVCZWhhdmlvcigpOwoKICAgIGJlaGF2aW9yLmNvZGVUZW1wbGF0ZVRleHQgPSBjb2RlU3RyaW5nOwogICAgYmVoYXZpb3IuY29kZVRlbXBsYXRlID0ganMuanMucGFyc2VGb3JlaWduSlMoYmVoYXZpb3IuY29kZVRlbXBsYXRlVGV4dCk7CgogICAgYm9vbCBzaWRlRWZmZWN0c0FyZUVuY29kZWRJblNwZWNTdHJpbmcgPSBmYWxzZTsKCiAgICB2b2lkIHNldFNpZGVFZmZlY3RzKFNpZGVFZmZlY3RzIG5ld0VmZmVjdHMpIHsKICAgICAgc2lkZUVmZmVjdHNBcmVFbmNvZGVkSW5TcGVjU3RyaW5nID0gdHJ1ZTsKICAgICAgYmVoYXZpb3Iuc2lkZUVmZmVjdHMuc2V0VG8obmV3RWZmZWN0cyk7CiAgICB9CgogICAgYm9vbCB0aHJvd0JlaGF2aW9yRnJvbVNwZWNTdHJpbmcgPSBmYWxzZTsKICAgIHZvaWQgc2V0VGhyb3dzKE5hdGl2ZVRocm93QmVoYXZpb3IgdGhyb3dCZWhhdmlvcikgewogICAgICB0aHJvd0JlaGF2aW9yRnJvbVNwZWNTdHJpbmcgPSB0cnVlOwogICAgICBiZWhhdmlvci50aHJvd0JlaGF2aW9yID0gdGhyb3dCZWhhdmlvcjsKICAgIH0KCiAgICB2b2lkIHNldElzQWxsb2NhdGlvbihib29sIGlzQWxsb2NhdGlvbikgewogICAgICBiZWhhdmlvci5pc0FsbG9jYXRpb24gPSBpc0FsbG9jYXRpb247CiAgICB9CgogICAgdm9pZCBzZXRVc2VHdm4oYm9vbCB1c2VHdm4pIHsKICAgICAgYmVoYXZpb3IudXNlR3ZuID0gdXNlR3ZuOwogICAgfQoKICAgIHByb2Nlc3NTcGVjU3RyaW5nKHJlcG9ydGVyLCBzcGFubmFibGUsIHNwZWNTdHJpbmcsCiAgICAgICAgc2V0U2lkZUVmZmVjdHM6IHNldFNpZGVFZmZlY3RzLAogICAgICAgIHNldFRocm93czogc2V0VGhyb3dzLAogICAgICAgIHNldElzQWxsb2NhdGlvbjogc2V0SXNBbGxvY2F0aW9uLAogICAgICAgIHNldFVzZUd2bjogc2V0VXNlR3ZuLAogICAgICAgIGxvb2t1cFR5cGU6IGxvb2t1cFR5cGUsCiAgICAgICAgdHlwZXNSZXR1cm5lZDogYmVoYXZpb3IudHlwZXNSZXR1cm5lZCwKICAgICAgICB0eXBlc0luc3RhbnRpYXRlZDogYmVoYXZpb3IudHlwZXNJbnN0YW50aWF0ZWQsCiAgICAgICAgb2JqZWN0VHlwZTogY29tbW9uRWxlbWVudHMub2JqZWN0VHlwZSwKICAgICAgICBudWxsVHlwZTogY29tbW9uRWxlbWVudHMubnVsbFR5cGUpOwoKICAgIGlmICghc2lkZUVmZmVjdHNBcmVFbmNvZGVkSW5TcGVjU3RyaW5nKSB7CiAgICAgIG5ldyBTaWRlRWZmZWN0c1Zpc2l0b3IoYmVoYXZpb3Iuc2lkZUVmZmVjdHMpCiAgICAgICAgICAudmlzaXQoYmVoYXZpb3IuY29kZVRlbXBsYXRlLmFzdCk7CiAgICB9CiAgICBpZiAoIXRocm93QmVoYXZpb3JGcm9tU3BlY1N0cmluZykgewogICAgICBiZWhhdmlvci50aHJvd0JlaGF2aW9yID0KICAgICAgICAgIG5ldyBUaHJvd0JlaGF2aW9yVmlzaXRvcigpLmFuYWx5emUoYmVoYXZpb3IuY29kZVRlbXBsYXRlLmFzdCk7CiAgICB9CgogICAgcmV0dXJuIGJlaGF2aW9yOwogIH0KCiAgc3RhdGljIHZvaWQgX2ZpbGxOYXRpdmVCZWhhdmlvck9mQnVpbHRpbk9yRW1iZWRkZWRHbG9iYWwoCiAgICAgIE5hdGl2ZUJlaGF2aW9yIGJlaGF2aW9yLAogICAgICBTcGFubmFibGUgc3Bhbm5hYmxlLAogICAgICBTdHJpbmcgc3BlY1N0cmluZywKICAgICAgVHlwZUxvb2t1cCBsb29rdXBUeXBlLAogICAgICBEaWFnbm9zdGljUmVwb3J0ZXIgcmVwb3J0ZXIsCiAgICAgIENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgICB7TGlzdDxTdHJpbmc+IHZhbGlkVGFnc30pIHsKICAgIHZvaWQgc2V0U2lkZUVmZmVjdHMoU2lkZUVmZmVjdHMgbmV3RWZmZWN0cykgewogICAgICBiZWhhdmlvci5zaWRlRWZmZWN0cy5zZXRUbyhuZXdFZmZlY3RzKTsKICAgIH0KCiAgICBwcm9jZXNzU3BlY1N0cmluZyhyZXBvcnRlciwgc3Bhbm5hYmxlLCBzcGVjU3RyaW5nLAogICAgICAgIHZhbGlkVGFnczogdmFsaWRUYWdzLAogICAgICAgIGxvb2t1cFR5cGU6IGxvb2t1cFR5cGUsCiAgICAgICAgc2V0U2lkZUVmZmVjdHM6IHNldFNpZGVFZmZlY3RzLAogICAgICAgIHR5cGVzUmV0dXJuZWQ6IGJlaGF2aW9yLnR5cGVzUmV0dXJuZWQsCiAgICAgICAgdHlwZXNJbnN0YW50aWF0ZWQ6IGJlaGF2aW9yLnR5cGVzSW5zdGFudGlhdGVkLAogICAgICAgIG9iamVjdFR5cGU6IGNvbW1vbkVsZW1lbnRzLm9iamVjdFR5cGUsCiAgICAgICAgbnVsbFR5cGU6IGNvbW1vbkVsZW1lbnRzLm51bGxUeXBlKTsKICB9CgogIHN0YXRpYyBOYXRpdmVCZWhhdmlvciBvZkpzQnVpbHRpbkNhbGwoCiAgICAgIFN0cmluZyBzcGVjU3RyaW5nLAogICAgICBUeXBlTG9va3VwIGxvb2t1cFR5cGUsCiAgICAgIFNwYW5uYWJsZSBzcGFubmFibGUsCiAgICAgIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwKICAgICAgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpIHsKICAgIE5hdGl2ZUJlaGF2aW9yIGJlaGF2aW9yID0gbmV3IE5hdGl2ZUJlaGF2aW9yKCk7CiAgICBiZWhhdmlvci5zaWRlRWZmZWN0cy5zZXRUbyhuZXcgU2lkZUVmZmVjdHMoKSk7CiAgICBfZmlsbE5hdGl2ZUJlaGF2aW9yT2ZCdWlsdGluT3JFbWJlZGRlZEdsb2JhbCgKICAgICAgICBiZWhhdmlvciwgc3Bhbm5hYmxlLCBzcGVjU3RyaW5nLCBsb29rdXBUeXBlLCByZXBvcnRlciwgY29tbW9uRWxlbWVudHMpOwogICAgcmV0dXJuIGJlaGF2aW9yOwogIH0KCiAgc3RhdGljIE5hdGl2ZUJlaGF2aW9yIG9mSnNFbWJlZGRlZEdsb2JhbENhbGwoCiAgICAgIFN0cmluZyBzcGVjU3RyaW5nLAogICAgICBUeXBlTG9va3VwIGxvb2t1cFR5cGUsCiAgICAgIFNwYW5uYWJsZSBzcGFubmFibGUsCiAgICAgIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwKICAgICAgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpIHsKICAgIE5hdGl2ZUJlaGF2aW9yIGJlaGF2aW9yID0gbmV3IE5hdGl2ZUJlaGF2aW9yKCk7CiAgICAvLyBUT0RPKHNyYSk6IEFsbG93IHRoZSB1c2Ugc2l0ZSB0byBvdmVycmlkZSB0aGVzZSBkZWZhdWx0cy4KICAgIC8vIEVtYmVkZGVkIGdsb2JhbHMgYXJlIHVzdWFsbHkgcHJlLWNvbXB1dGVkIGRhdGEgc3RydWN0dXJlcyBvciBKYXZhU2NyaXB0CiAgICAvLyBmdW5jdGlvbnMgdGhhdCBuZXZlciBjaGFuZ2UuCiAgICBiZWhhdmlvci5zaWRlRWZmZWN0cy5zZXRUbyhuZXcgU2lkZUVmZmVjdHMuZW1wdHkoKSk7CiAgICBiZWhhdmlvci50aHJvd0JlaGF2aW9yID0gTmF0aXZlVGhyb3dCZWhhdmlvci5ORVZFUjsKICAgIF9maWxsTmF0aXZlQmVoYXZpb3JPZkJ1aWx0aW5PckVtYmVkZGVkR2xvYmFsKAogICAgICAgIGJlaGF2aW9yLCBzcGFubmFibGUsIHNwZWNTdHJpbmcsIGxvb2t1cFR5cGUsIHJlcG9ydGVyLCBjb21tb25FbGVtZW50cywKICAgICAgICB2YWxpZFRhZ3M6IFsncmV0dXJucycsICdjcmVhdGVzJ10pOwogICAgcmV0dXJuIGJlaGF2aW9yOwogIH0KCiAgc3RhdGljIGR5bmFtaWMgLypEYXJ0VHlwZXxTcGVjaWFsVHlwZSovIF9wYXJzZVR5cGUoCiAgICAgIFN0cmluZyB0eXBlU3RyaW5nLCBUeXBlTG9va3VwIGxvb2t1cFR5cGUpIHsKICAgIGlmICh0eXBlU3RyaW5nID09ICc9T2JqZWN0JykgcmV0dXJuIFNwZWNpYWxUeXBlLkpzT2JqZWN0OwogICAgaWYgKHR5cGVTdHJpbmcgPT0gJ2R5bmFtaWMnKSB7CiAgICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgfQogICAgaW50IGluZGV4ID0gdHlwZVN0cmluZy5pbmRleE9mKCc8Jyk7CiAgICB2YXIgdHlwZSA9IGxvb2t1cFR5cGUodHlwZVN0cmluZywgcmVxdWlyZWQ6IGluZGV4ID09IC0xKTsKICAgIGlmICh0eXBlICE9IG51bGwpIHJldHVybiB0eXBlOwoKICAgIGlmIChpbmRleCAhPSAtMSkgewogICAgICB0eXBlID0gbG9va3VwVHlwZSh0eXBlU3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCksIHJlcXVpcmVkOiB0cnVlKTsKICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewogICAgICAgIC8vIFRPRE8oc3JhKTogUGFyc2UgdHlwZSBwYXJhbWV0ZXJzLgogICAgICAgIHJldHVybiB0eXBlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gY29uc3QgRHluYW1pY1R5cGUoKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIEJlaGF2aW9yQnVpbGRlciB7CiAgQ29tbW9uRWxlbWVudHMgZ2V0IGNvbW1vbkVsZW1lbnRzOwogIERpYWdub3N0aWNSZXBvcnRlciBnZXQgcmVwb3J0ZXI7CiAgTmF0aXZlQmFzaWNEYXRhIGdldCBuYXRpdmVCYXNpY0RhdGE7CiAgYm9vbCBnZXQgdHJ1c3RKU0ludGVyb3BUeXBlQW5ub3RhdGlvbnM7CiAgRWxlbWVudEVudmlyb25tZW50IGdldCBlbGVtZW50RW52aXJvbm1lbnQ7CgogIE5hdGl2ZUJlaGF2aW9yIF9iZWhhdmlvcjsKCiAgdm9pZCBfb3ZlcnJpZGVXaXRoQW5ub3RhdGlvbnMoSXRlcmFibGU8U3RyaW5nPiBjcmVhdGVzQW5ub3RhdGlvbnMsCiAgICAgIEl0ZXJhYmxlPFN0cmluZz4gcmV0dXJuc0Fubm90YXRpb25zLCBUeXBlTG9va3VwIGxvb2t1cFR5cGUpIHsKICAgIGlmIChjcmVhdGVzQW5ub3RhdGlvbnMuaXNFbXB0eSAmJiByZXR1cm5zQW5ub3RhdGlvbnMuaXNFbXB0eSkgcmV0dXJuOwoKICAgIExpc3QgY3JlYXRlcyA9IF9jb2xsZWN0KGNyZWF0ZXNBbm5vdGF0aW9ucywgbG9va3VwVHlwZSk7CiAgICBMaXN0IHJldHVybnMgPSBfY29sbGVjdChyZXR1cm5zQW5ub3RhdGlvbnMsIGxvb2t1cFR5cGUpOwoKICAgIGlmIChjcmVhdGVzICE9IG51bGwpIHsKICAgICAgX2JlaGF2aW9yLnR5cGVzSW5zdGFudGlhdGVkCiAgICAgICAgLi5jbGVhcigpCiAgICAgICAgLi5hZGRBbGwoY3JlYXRlcyk7CiAgICB9CiAgICBpZiAocmV0dXJucyAhPSBudWxsKSB7CiAgICAgIF9iZWhhdmlvci50eXBlc1JldHVybmVkCiAgICAgICAgLi5jbGVhcigpCiAgICAgICAgLi5hZGRBbGwocmV0dXJucyk7CiAgICB9CiAgfQoKICAvLy8gUmV0dXJucyBhIGxpc3Qgb2YgdHlwZSBjb25zdHJhaW50cyBmcm9tIHRoZSBhbm5vdGF0aW9ucyBvZgogIC8vLyBbYW5ub3RhdGlvbkNsYXNzXS4KICAvLy8gUmV0dXJucyBgbnVsbGAgaWYgbm8gY29uc3RyYWludHMuCiAgTGlzdCBfY29sbGVjdChJdGVyYWJsZTxTdHJpbmc+IGFubm90YXRpb25zLCBUeXBlTG9va3VwIGxvb2t1cFR5cGUpIHsKICAgIHZhciB0eXBlcyA9IG51bGw7CiAgICBmb3IgKFN0cmluZyBzcGVjU3RyaW5nIGluIGFubm90YXRpb25zKSB7CiAgICAgIGZvciAoZmluYWwgdHlwZVN0cmluZyBpbiBzcGVjU3RyaW5nLnNwbGl0KCd8JykpIHsKICAgICAgICB2YXIgdHlwZSA9IE5hdGl2ZUJlaGF2aW9yLl9wYXJzZVR5cGUodHlwZVN0cmluZywgbG9va3VwVHlwZSk7CiAgICAgICAgaWYgKHR5cGVzID09IG51bGwpIHR5cGVzID0gW107CiAgICAgICAgdHlwZXMuYWRkKHR5cGUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHlwZXM7CiAgfQoKICAvLy8gTW9kZWxzIHRoZSBiZWhhdmlvciBvZiBoYXZpbmcgaW5zdGFuY2VzIG9mIFt0eXBlXSBlc2NhcGUgZnJvbSBEYXJ0IGNvZGUKICAvLy8gaW50byBuYXRpdmUgY29kZS4KICB2b2lkIF9lc2NhcGUoRGFydFR5cGUgdHlwZSwgYm9vbCBpc0pzSW50ZXJvcCkgewogICAgdHlwZSA9IGVsZW1lbnRFbnZpcm9ubWVudC5nZXRVbmFsaWFzZWRUeXBlKHR5cGUpOwogICAgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUgPSB0eXBlOwogICAgICAvLyBBIGZ1bmN0aW9uIG1pZ2h0IGJlIGNhbGxlZCBmcm9tIG5hdGl2ZSBjb2RlLCBwYXNzaW5nIHVzIG5vdmVsCiAgICAgIC8vIHBhcmFtZXRlcnMuCiAgICAgIF9lc2NhcGUoZnVuY3Rpb25UeXBlLnJldHVyblR5cGUsIGlzSnNJbnRlcm9wKTsKICAgICAgZm9yIChEYXJ0VHlwZSBwYXJhbWV0ZXIgaW4gZnVuY3Rpb25UeXBlLnBhcmFtZXRlclR5cGVzKSB7CiAgICAgICAgX2NhcHR1cmUocGFyYW1ldGVyLCBpc0pzSW50ZXJvcCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBNb2RlbHMgdGhlIGJlaGF2aW9yIG9mIERhcnQgY29kZSByZWNlaXZpbmcgaW5zdGFuY2VzIGFuZCBtZXRob2RzIG9mIFt0eXBlXQogIC8vLyBmcm9tIG5hdGl2ZSBjb2RlLiAgV2UgdXN1YWxseSBzdGFydCB0aGUgYW5hbHlzaXMgYnkgY2FwdHVyaW5nIGEgbmF0aXZlCiAgLy8vIG1ldGhvZCB0aGF0IGhhcyBiZWVuIHVzZWQuCiAgLy8vCiAgLy8vIFdlIGFzc3VtZSB0aGF0IEpTLWludGVyb3AgQVBJcyBjYW5ub3QgaW5zdGFudGlhdGUgRGFydCB0eXBlcyBvcgogIC8vLyBub24tSlNJbnRlcm9wIG5hdGl2ZSB0eXBlcy4KICB2b2lkIF9jYXB0dXJlKERhcnRUeXBlIHR5cGUsIGJvb2wgaXNKc0ludGVyb3ApIHsKICAgIHR5cGUgPSBlbGVtZW50RW52aXJvbm1lbnQuZ2V0VW5hbGlhc2VkVHlwZSh0eXBlKTsKICAgIGlmICh0eXBlIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICBGdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlID0gdHlwZTsKICAgICAgX2NhcHR1cmUoZnVuY3Rpb25UeXBlLnJldHVyblR5cGUsIGlzSnNJbnRlcm9wKTsKICAgICAgZm9yIChEYXJ0VHlwZSBwYXJhbWV0ZXIgaW4gZnVuY3Rpb25UeXBlLnBhcmFtZXRlclR5cGVzKSB7CiAgICAgICAgX2VzY2FwZShwYXJhbWV0ZXIsIGlzSnNJbnRlcm9wKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKCFpc0pzSW50ZXJvcCkgewogICAgICAgIF9iZWhhdmlvci50eXBlc0luc3RhbnRpYXRlZC5hZGQodHlwZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgICAgICBuYXRpdmVCYXNpY0RhdGEuaXNOYXRpdmVDbGFzcyh0eXBlLmVsZW1lbnQpKSB7CiAgICAgICAgICAvLyBBbnkgZGVjbGFyZWQgbmF0aXZlIG9yIGludGVyb3AgdHlwZSAoaXNOYXRpdmUgaW1wbGllcyBpc0pzSW50ZXJvcCkKICAgICAgICAgIC8vIGlzIGFzc3VtZWQgdG8gYmUgYWxsb2NhdGVkLgogICAgICAgICAgX2JlaGF2aW9yLnR5cGVzSW5zdGFudGlhdGVkLmFkZCh0eXBlKTsKICAgICAgICB9CgogICAgICAgIGlmICghdHJ1c3RKU0ludGVyb3BUeXBlQW5ub3RhdGlvbnMgfHwKICAgICAgICAgICAgdHlwZS5pc0R5bmFtaWMgfHwKICAgICAgICAgICAgdHlwZSA9PSBjb21tb25FbGVtZW50cy5vYmplY3RUeXBlKSB7CiAgICAgICAgICAvLyBCeSBzYXlpbmcgdGhhdCBvbmx5IEpTLWludGVyb3AgdHlwZXMgY2FuIGJlIGNyZWF0ZWQsIHdlIHByZXZlbnQKICAgICAgICAgIC8vIHB1bGxpbmcgaW4gZXZlcnkgb3RoZXIgbmF0aXZlIHR5cGUgKGUuZy4gYWxsIG9mIGRhcnQ6aHRtbCkgd2hlbiBhCiAgICAgICAgICAvLyBKUyBpbnRlcm9wIEFQSSByZXR1cm5zIGR5bmFtaWMgb3Igd2hlbiB3ZSBkb24ndCB0cnVzdCB0aGUgdHlwZQogICAgICAgICAgLy8gYW5ub3RhdGlvbnMuIFRoaXMgbWVhbnMgdGhhdCB0byBzb21lIGRlZ3JlZSB3ZSBzdGlsbCB1c2UgdGhlIHJldHVybgogICAgICAgICAgLy8gdHlwZSB0byBkZWNpZGUgd2hldGhlciB0byBpbmNsdWRlIG5hdGl2ZSB0eXBlcywgZXZlbiBpZiB3ZSBkb24ndAogICAgICAgICAgLy8gdHJ1c3QgdGhlIHR5cGUgYW5ub3RhdGlvbi4KICAgICAgICAgIENsYXNzRW50aXR5IGNscyA9IGNvbW1vbkVsZW1lbnRzLmpzSmF2YVNjcmlwdE9iamVjdENsYXNzOwogICAgICAgICAgX2JlaGF2aW9yLnR5cGVzSW5zdGFudGlhdGVkLmFkZChlbGVtZW50RW52aXJvbm1lbnQuZ2V0VGhpc1R5cGUoY2xzKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2hlbiB0aGUgZGVjbGFyZWQgdHlwZSBpcyBhIERhcnQgdHlwZSwgd2UgZG8gbm90CiAgICAgICAgICAvLyByZWdpc3RlciBhbiBhbGxvY2F0aW9uIGJlY2F1c2Ugd2UgYXNzdW1lIGl0IGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQKICAgICAgICAgIC8vIGZyb20gd2l0aGluIHRoZSBKUy1pbnRlcm9wIGNvZGUuIEl0IG11c3QgaGF2ZSBlc2NhcGVkIGZyb20gYW5vdGhlcgogICAgICAgICAgLy8gQVBJLgogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgTmF0aXZlQmVoYXZpb3IgYnVpbGRGaWVsZExvYWRCZWhhdmlvcigKICAgICAgRGFydFR5cGUgdHlwZSwKICAgICAgSXRlcmFibGU8U3RyaW5nPiBjcmVhdGVzQW5ub3RhdGlvbnMsCiAgICAgIEl0ZXJhYmxlPFN0cmluZz4gcmV0dXJuc0Fubm90YXRpb25zLAogICAgICBUeXBlTG9va3VwIGxvb2t1cFR5cGUsCiAgICAgIHtib29sIGlzSnNJbnRlcm9wfSkgewogICAgX2JlaGF2aW9yID0gbmV3IE5hdGl2ZUJlaGF2aW9yKCk7CiAgICAvLyBUT0RPKHNpZ211bmQsc3JhKTogY29uc2lkZXIgZG9pbmcgc29tZXRoaW5nIGJldHRlciBmb3IgbnVtZXJpYyB0eXBlcy4KICAgIF9iZWhhdmlvci50eXBlc1JldHVybmVkLmFkZCghaXNKc0ludGVyb3AgfHwgdHJ1c3RKU0ludGVyb3BUeXBlQW5ub3RhdGlvbnMKICAgICAgICA/IHR5cGUKICAgICAgICA6IGNvbW1vbkVsZW1lbnRzLmR5bmFtaWNUeXBlKTsKICAgIC8vIERlY2xhcmVkIHR5cGVzIGFyZSBudWxsYWJsZS4KICAgIF9iZWhhdmlvci50eXBlc1JldHVybmVkLmFkZChjb21tb25FbGVtZW50cy5udWxsVHlwZSk7CiAgICBfY2FwdHVyZSh0eXBlLCBpc0pzSW50ZXJvcCk7CiAgICBfb3ZlcnJpZGVXaXRoQW5ub3RhdGlvbnMoCiAgICAgICAgY3JlYXRlc0Fubm90YXRpb25zLCByZXR1cm5zQW5ub3RhdGlvbnMsIGxvb2t1cFR5cGUpOwogICAgcmV0dXJuIF9iZWhhdmlvcjsKICB9CgogIE5hdGl2ZUJlaGF2aW9yIGJ1aWxkRmllbGRTdG9yZUJlaGF2aW9yKERhcnRUeXBlIHR5cGUpIHsKICAgIF9iZWhhdmlvciA9IG5ldyBOYXRpdmVCZWhhdmlvcigpOwogICAgX2VzY2FwZSh0eXBlLCBmYWxzZSk7CiAgICAvLyBXZSBkb24ndCBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgLSB0aGUgYW5ub3RhdGlvbnMgYXBwbHkgdG8KICAgIC8vIGxvYWRpbmcgdGhlIGZpZWxkLgogICAgcmV0dXJuIF9iZWhhdmlvcjsKICB9CgogIE5hdGl2ZUJlaGF2aW9yIGJ1aWxkTWV0aG9kQmVoYXZpb3IoCiAgICAgIEZ1bmN0aW9uVHlwZSB0eXBlLAogICAgICBJdGVyYWJsZTxTdHJpbmc+IGNyZWF0ZUFubm90YXRpb25zLAogICAgICBJdGVyYWJsZTxTdHJpbmc+IHJldHVybnNBbm5vdGF0aW9ucywKICAgICAgVHlwZUxvb2t1cCBsb29rdXBUeXBlLAogICAgICB7Ym9vbCBpc0pzSW50ZXJvcH0pIHsKICAgIF9iZWhhdmlvciA9IG5ldyBOYXRpdmVCZWhhdmlvcigpOwogICAgRGFydFR5cGUgcmV0dXJuVHlwZSA9IHR5cGUucmV0dXJuVHlwZTsKICAgIC8vIE5vdGU6IEZvciBkYXJ0Omh0bWwgYW5kIG90aGVyIGludGVybmFsIGxpYnJhcmllcyB3ZSBtYWludGFpbiwgd2UgY2FuCiAgICAvLyB0cnVzdCB0aGUgcmV0dXJuIHR5cGUgYW5kIHVzZSBpdCB0byBsaW1pdCB3aGF0IHdlIGVucXVldWUuIFdlIGhhdmUgdG8KICAgIC8vIGJlIG1vcmUgY29uc2VydmF0aXZlIGFib3V0IEpTIGludGVyb3AgdHlwZXMgYW5kIGFzc3VtZSB0aGV5IGNhbiByZXR1cm4KICAgIC8vIGFueXRoaW5nICh1bmxlc3MgdGhlIHVzZXIgcHJvdmlkZXMgdGhlIGV4cGVyaW1lbnRhbCBmbGFnIHRvIHRydXN0IHRoZQogICAgLy8gdHlwZSBvZiBqcy1pbnRlcm9wIEFQSXMpLiBXZSBkbyByZXN0cmljdCB0aGUgYWxsb2NhdGlvbiBlZmZlY3RzIGFuZCBzYXkKICAgIC8vIHRoYXQgaW50ZXJvcCBjYWxscyBjcmVhdGUgb25seSBpbnRlcm9wIHR5cGVzICh3aGljaCBtYXkgYmUgdW5zb3VuZCBpZgogICAgLy8gYW4gaW50ZXJvcCBjYWxsIHJldHVybnMgYSBET00gdHlwZSBhbmQgZGVjbGFyZXMgYSBkeW5hbWljIHJldHVybiB0eXBlLAogICAgLy8gYnV0IG90aGVyd2lzZSB3ZSB3b3VsZCBpbmNsdWRlIGEgbG90IG9mIGNvZGUgYnkgZGVmYXVsdCkuCiAgICAvLyBUT0RPKHNpZ211bmQsc3JhKTogY29uc2lkZXIgZG9pbmcgc29tZXRoaW5nIGJldHRlciBmb3IgbnVtZXJpYyB0eXBlcy4KICAgIF9iZWhhdmlvci50eXBlc1JldHVybmVkLmFkZCghaXNKc0ludGVyb3AgfHwgdHJ1c3RKU0ludGVyb3BUeXBlQW5ub3RhdGlvbnMKICAgICAgICA/IHJldHVyblR5cGUKICAgICAgICA6IGNvbW1vbkVsZW1lbnRzLmR5bmFtaWNUeXBlKTsKICAgIGlmICghdHlwZS5yZXR1cm5UeXBlLmlzVm9pZCkgewogICAgICAvLyBEZWNsYXJlZCB0eXBlcyBhcmUgbnVsbGFibGUuCiAgICAgIF9iZWhhdmlvci50eXBlc1JldHVybmVkLmFkZChjb21tb25FbGVtZW50cy5udWxsVHlwZSk7CiAgICB9CiAgICBfY2FwdHVyZSh0eXBlLCBpc0pzSW50ZXJvcCk7CgogICAgZm9yIChEYXJ0VHlwZSB0eXBlIGluIHR5cGUub3B0aW9uYWxQYXJhbWV0ZXJUeXBlcykgewogICAgICBfZXNjYXBlKHR5cGUsIGlzSnNJbnRlcm9wKTsKICAgIH0KICAgIGZvciAoRGFydFR5cGUgdHlwZSBpbiB0eXBlLm5hbWVkUGFyYW1ldGVyVHlwZXMpIHsKICAgICAgX2VzY2FwZSh0eXBlLCBpc0pzSW50ZXJvcCk7CiAgICB9CgogICAgX292ZXJyaWRlV2l0aEFubm90YXRpb25zKGNyZWF0ZUFubm90YXRpb25zLCByZXR1cm5zQW5ub3RhdGlvbnMsIGxvb2t1cFR5cGUpOwogICAgcmV0dXJuIF9iZWhhdmlvcjsKICB9Cn0KCkxpc3Q8U3RyaW5nPiBfZ2V0QW5ub3RhdGlvbnMoRGlhZ25vc3RpY1JlcG9ydGVyIHJlcG9ydGVyLAogICAgSXRlcmFibGU8Q29uc3RhbnRWYWx1ZT4gbWV0YWRhdGEsIENsYXNzRW50aXR5IGNscykgewogIExpc3Q8U3RyaW5nPiBhbm5vdGF0aW9ucyA9IFtdOwogIGZvciAoQ29uc3RhbnRWYWx1ZSB2YWx1ZSBpbiBtZXRhZGF0YSkgewogICAgaWYgKCF2YWx1ZS5pc0NvbnN0cnVjdGVkT2JqZWN0KSBjb250aW51ZTsKICAgIENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZSBjb25zdHJ1Y3RlZE9iamVjdCA9IHZhbHVlOwogICAgaWYgKGNvbnN0cnVjdGVkT2JqZWN0LnR5cGUuZWxlbWVudCAhPSBjbHMpIGNvbnRpbnVlOwoKICAgIEl0ZXJhYmxlPENvbnN0YW50VmFsdWU+IGZpZWxkcyA9IGNvbnN0cnVjdGVkT2JqZWN0LmZpZWxkcy52YWx1ZXM7CiAgICAvLyBUT0RPKHNyYSk6IEJldHRlciB2YWxpZGF0aW9uIG9mIHRoZSBjb25zdGFudC4KICAgIGlmIChmaWVsZHMubGVuZ3RoICE9IDEgfHwgIWZpZWxkcy5zaW5nbGUuaXNTdHJpbmcpIHsKICAgICAgcmVwb3J0ZXIuaW50ZXJuYWxFcnJvcihDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICAgJ0Fubm90YXRpb25zIG5lZWRzIG9uZSBzdHJpbmc6ICR7dmFsdWUudG9TdHJ1Y3R1cmVkVGV4dCgpfScpOwogICAgfQogICAgU3RyaW5nQ29uc3RhbnRWYWx1ZSBzcGVjU3RyaW5nQ29uc3RhbnQgPSBmaWVsZHMuc2luZ2xlOwogICAgU3RyaW5nIHNwZWNTdHJpbmcgPSBzcGVjU3RyaW5nQ29uc3RhbnQuc3RyaW5nVmFsdWU7CiAgICBhbm5vdGF0aW9u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OwoKaW1wb3J0ICcuLi9jbG9zdXJlLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24vY29kZWdlbi5kYXJ0JyBzaG93IENvZGVnZW5SZWdpc3RyeTsKaW1wb3J0ICcuLi9jb21tb24vbmFtZXMuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL2NvbXBpbGVyLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy9jb25zdGFudF9zeXN0ZW0uZGFydCcgYXMgY29uc3RhbnRfc3lzdGVtOwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCcKICAgIHNob3cKICAgICAgICBDb25zdGFudFZhbHVlLAogICAgICAgIEludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZSwKICAgICAgICBTdHJpbmdDb25zdGFudFZhbHVlLAogICAgICAgIFR5cGVDb25zdGFudFZhbHVlOwppbXBvcnQgJy4uL2R1bXBfaW5mby5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9qdW1wcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9uYW1lcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci9hYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vaW8vc291cmNlX2luZm9ybWF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL2lyL3N0YXRpY190eXBlX3Byb3ZpZGVyLmRhcnQnOwppbXBvcnQgJy4uL2lyL3V0aWwuZGFydCc7CmltcG9ydCAnLi4vanMvanMuZGFydCcgYXMganM7CmltcG9ydCAnLi4vanNfYmFja2VuZC9maWVsZF9hbmFseXNpcy5kYXJ0JwogICAgc2hvdyBGaWVsZEFuYWx5c2lzRGF0YSwgSkZpZWxkQW5hbHlzaXM7CmltcG9ydCAnLi4vanNfYmFja2VuZC9iYWNrZW5kLmRhcnQnIHNob3cgRnVuY3Rpb25JbmxpbmVDYWNoZSwgSmF2YVNjcmlwdEJhY2tlbmQ7CmltcG9ydCAnLi4vanNfZW1pdHRlci9qc19lbWl0dGVyLmRhcnQnIHNob3cgTmF0aXZlRW1pdHRlcjsKaW1wb3J0ICcuLi9qc19tb2RlbC9sb2NhbHMuZGFydCcgc2hvdyBKdW1wVmlzaXRvcjsKaW1wb3J0ICcuLi9qc19tb2RlbC9lbGVtZW50cy5kYXJ0JyBzaG93IEpHZW5lcmF0b3JCb2R5OwppbXBvcnQgJy4uL2pzX21vZGVsL2VsZW1lbnRfbWFwLmRhcnQnOwppbXBvcnQgJy4uL2pzX21vZGVsL2pzX3N0cmF0ZWd5LmRhcnQnOwppbXBvcnQgJy4uL2tlcm5lbC9pbnZvY2F0aW9uX21pcnJvcl9jb25zdGFudHMuZGFydCc7CmltcG9ydCAnLi4vbmF0aXZlL2JlaGF2aW9yLmRhcnQnOwppbXBvcnQgJy4uL25hdGl2ZS9qcy5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jYWxsX3N0cnVjdHVyZS5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jb2RlZ2VuX3dvcmxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvZmVhdHVyZS5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9zZWxlY3Rvci5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9zaWRlX2VmZmVjdHMuZGFydCcgc2hvdyBTaWRlRWZmZWN0czsKaW1wb3J0ICcuLi91bml2ZXJzZS90YXJnZXRfY2hlY2tzLmRhcnQnIHNob3cgVGFyZ2V0Q2hlY2tzOwppbXBvcnQgJy4uL3VuaXZlcnNlL3VzZS5kYXJ0JyBzaG93IENvbnN0YW50VXNlLCBTdGF0aWNVc2U7CmltcG9ydCAnLi4vd29ybGQuZGFydCc7CmltcG9ydCAnZ3JhcGhfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdqdW1wX2hhbmRsZXIuZGFydCc7CmltcG9ydCAna2VybmVsX3N0cmluZ19idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2xvY2Fsc19oYW5kbGVyLmRhcnQnOwppbXBvcnQgJ2xvb3BfaGFuZGxlci5kYXJ0JzsKaW1wb3J0ICdub2Rlcy5kYXJ0JzsKaW1wb3J0ICdzc2EuZGFydCc7CmltcG9ydCAnc3NhX2JyYW5jaF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3N3aXRjaF9jb250aW51ZV9hbmFseXNpcy5kYXJ0JzsKaW1wb3J0ICd0eXBlX2J1aWxkZXIuZGFydCc7CgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNZXJnZSB0aGlzIHdpdGggW0tlcm5lbElubGluaW5nU3RhdGVdLgpjbGFzcyBTdGFja0ZyYW1lIHsKICBmaW5hbCBTdGFja0ZyYW1lIHBhcmVudDsKICBmaW5hbCBNZW1iZXJFbnRpdHkgbWVtYmVyOwogIGZpbmFsIEFzeW5jTWFya2VyIGFzeW5jTWFya2VyOwogIGZpbmFsIEtlcm5lbFRvTG9jYWxzTWFwIGxvY2Fsc01hcDsKICAvLyBbaXIuTGV0XSBhbmQgW2lyLkxvY2FsSW5pdGlhbGl6ZXJdIGJpbmRpbmdzLgogIGZpbmFsIE1hcDxpci5WYXJpYWJsZURlY2xhcmF0aW9uLCBISW5zdHJ1Y3Rpb24+IGxldEJpbmRpbmdzOwogIGZpbmFsIEtlcm5lbFRvVHlwZUluZmVyZW5jZU1hcCB0eXBlSW5mZXJlbmNlTWFwOwogIGZpbmFsIFNvdXJjZUluZm9ybWF0aW9uQnVpbGRlciBzb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXI7CiAgZmluYWwgU3RhdGljVHlwZVByb3ZpZGVyIHN0YXRpY1R5cGVQcm92aWRlcjsKCiAgU3RhY2tGcmFtZSgKICAgICAgdGhpcy5wYXJlbnQsCiAgICAgIHRoaXMubWVtYmVyLAogICAgICB0aGlzLmFzeW5jTWFya2VyLAogICAgICB0aGlzLmxvY2Fsc01hcCwKICAgICAgdGhpcy5sZXRCaW5kaW5ncywKICAgICAgdGhpcy50eXBlSW5mZXJlbmNlTWFwLAogICAgICB0aGlzLnNvdXJjZUluZm9ybWF0aW9uQnVpbGRlciwKICAgICAgdGhpcy5zdGF0aWNUeXBlUHJvdmlkZXIpOwp9CgpjbGFzcyBLZXJuZWxTc2FHcmFwaEJ1aWxkZXIgZXh0ZW5kcyBpci5WaXNpdG9yCiAgICB3aXRoIEdyYXBoQnVpbGRlciwgU3NhQnVpbGRlckZpZWxkTWl4aW4gewogIEBvdmVycmlkZQogIGZpbmFsIE1lbWJlckVudGl0eSB0YXJnZXRFbGVtZW50OwogIGZpbmFsIE1lbWJlckVudGl0eSBpbml0aWFsVGFyZ2V0RWxlbWVudDsKCiAgQG92ZXJyaWRlCiAgZmluYWwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkOwogIGZpbmFsIENvZGVnZW5Xb3JsZEJ1aWxkZXIgX3dvcmxkQnVpbGRlcjsKICBAb3ZlcnJpZGUKICBmaW5hbCBDb2RlZ2VuUmVnaXN0cnkgcmVnaXN0cnk7CiAgZmluYWwgQ2xvc3VyZURhdGEgY2xvc3VyZURhdGFMb29rdXA7CgogIC8vLyBBIHN0YWNrIG9mIFtJbnRlcmZhY2VUeXBlXXMgdGhhdCBoYXZlIGJlZW4gc2VlbiBkdXJpbmcgaW5saW5pbmcgb2YKICAvLy8gZmFjdG9yeSBjb25zdHJ1Y3RvcnMuICBUaGVzZSB0eXBlcyBhcmUgcHJlc2VydmVkIGluIFtISW52b2tlU3RhdGljXXMgYW5kCiAgLy8vIFtIQ3JlYXRlXXMgaW5zaWRlIHRoZSBpbmxpbmUgY29kZSBhbmQgcmVnaXN0ZXJlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCiAgLy8vIGZvciB0aGVzZSBub2Rlcy4KICAvLyBUT0RPKGthcmxrbG9zZSk6IGNvbnNpZGVyIHJlbW92aW5nIHRoaXMgYW5kIGtlZXBpbmcgdGhlIChzdWJzdGl0dXRlZCkgdHlwZXMKICAvLyBvZiB0aGUgdHlwZSB2YXJpYWJsZXMgaW4gYW4gZW52aXJvbm1lbnQgKGxpa2UgdGhlIFtMb2NhbHNIYW5kbGVyXSkuCiAgZmluYWwgTGlzdDxJbnRlcmZhY2VUeXBlPiBjdXJyZW50SW1wbGljaXRJbnN0YW50aWF0aW9ucyA9IDxJbnRlcmZhY2VUeXBlPltdOwoKICAvLy8gVXNlZCB0byByZXBvcnQgaW5mb3JtYXRpb24gYWJvdXQgaW5saW5pbmcgKHdoaWNoIG9jY3VycyB3aGlsZSBidWlsZGluZyB0aGUKICAvLy8gU1NBIGdyYXBoKSwgd2hlbiBkdW1wLWluZm8gaXMgZW5hYmxlZC4KICBmaW5hbCBJbmZvUmVwb3J0ZXIgX2luZm9SZXBvcnRlcjsKCiAgSEluc3RydWN0aW9uIHJldGhyb3dhYmxlRXhjZXB0aW9uOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBDb21waWxlciBjb21waWxlcjsKCiAgQG92ZXJyaWRlCiAgSmF2YVNjcmlwdEJhY2tlbmQgZ2V0IGJhY2tlbmQgPT4gY29tcGlsZXIuYmFja2VuZDsKCiAgZmluYWwgU291cmNlSW5mb3JtYXRpb25TdHJhdGVneSBfc291cmNlSW5mb3JtYXRpb25TdHJhdGVneTsKICBmaW5hbCBKc1RvRWxlbWVudE1hcCBfZWxlbWVudE1hcDsKICBAb3ZlcnJpZGUKICBmaW5hbCBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBnbG9iYWxJbmZlcmVuY2VSZXN1bHRzOwogIExvb3BIYW5kbGVyIGxvb3BIYW5kbGVyOwogIEBvdmVycmlkZQogIFR5cGVCdWlsZGVyIHR5cGVCdWlsZGVyOwoKICBmaW5hbCBOYXRpdmVFbWl0dGVyIG5hdGl2ZUVtaXR0ZXI7CgogIC8vLyBUcnVlIGlmIHdlIGFyZSB2aXNpdGluZyB0aGUgZXhwcmVzc2lvbiBvZiBhIHRocm93IHN0YXRlbWVudDsgd2UgYXNzdW1lCiAgLy8vIHRoaXMgaXMgYSBzbG93IHBhdGguCiAgYm9vbCBfaW5FeHByZXNzaW9uT2ZUaHJvdyA9IGZhbHNlOwoKICBmaW5hbCBMaXN0PEtlcm5lbElubGluaW5nU3RhdGU+IF9pbmxpbmluZ1N0YWNrID0gPEtlcm5lbElubGluaW5nU3RhdGU+W107CiAgTG9jYWwgX3JldHVybkxvY2FsOwogIERhcnRUeXBlIF9yZXR1cm5UeXBlOwogIGJvb2wgX2luTGF6eUluaXRpYWxpemVyRXhwcmVzc2lvbiA9IGZhbHNlOwoKICBTdGFja0ZyYW1lIF9jdXJyZW50RnJhbWU7CgogIGZpbmFsIEZ1bmN0aW9uSW5saW5lQ2FjaGUgaW5saW5lQ2FjaGU7CgogIEtlcm5lbFNzYUdyYXBoQnVpbGRlcigKICAgICAgdGhpcy5pbml0aWFsVGFyZ2V0RWxlbWVudCwKICAgICAgSW50ZXJmYWNlVHlwZSBpbnN0YW5jZVR5cGUsCiAgICAgIHRoaXMuY29tcGlsZXIsCiAgICAgIHRoaXMuX2VsZW1lbnRNYXAsCiAgICAgIHRoaXMuZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cywKICAgICAgdGhpcy5jbG9zZWRXb3JsZCwKICAgICAgdGhpcy5fd29ybGRCdWlsZGVyLAogICAgICB0aGlzLnJlZ2lzdHJ5LAogICAgICB0aGlzLm5hdGl2ZUVtaXR0ZXIsCiAgICAgIHRoaXMuX3NvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3ksCiAgICAgIHRoaXMuaW5saW5lQ2FjaGUpCiAgICAgIDogdGhpcy50YXJnZXRFbGVtZW50ID0gX2VmZmVjdGl2ZVRhcmdldEVsZW1lbnRGb3IoaW5pdGlhbFRhcmdldEVsZW1lbnQpLAogICAgICAgIF9pbmZvUmVwb3J0ZXIgPSBjb21waWxlci5kdW1wSW5mb1Rhc2ssCiAgICAgICAgdGhpcy5jbG9zdXJlRGF0YUxvb2t1cCA9IGNsb3NlZFdvcmxkLmNsb3N1cmVEYXRhTG9va3VwIHsKICAgIF9lbnRlckZyYW1lKHRhcmdldEVsZW1lbnQsIG51bGwpOwogICAgdGhpcy5sb29wSGFuZGxlciA9IG5ldyBLZXJuZWxMb29wSGFuZGxlcih0aGlzKTsKICAgIHR5cGVCdWlsZGVyID0gbmV3IEtlcm5lbFR5cGVCdWlsZGVyKHRoaXMsIF9lbGVtZW50TWFwKTsKICAgIGdyYXBoLmVsZW1lbnQgPSB0YXJnZXRFbGVtZW50OwogICAgZ3JhcGguc291cmNlSW5mb3JtYXRpb24gPQogICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRWYXJpYWJsZURlY2xhcmF0aW9uKCk7CiAgICB0aGlzLmxvY2Fsc0hhbmRsZXIgPSBuZXcgTG9jYWxzSGFuZGxlcih0aGlzLCB0YXJnZXRFbGVtZW50LCB0YXJnZXRFbGVtZW50LAogICAgICAgIGluc3RhbmNlVHlwZSwgbmF0aXZlRGF0YSwgaW50ZXJjZXB0b3JEYXRhKTsKICB9CgogIEtlcm5lbFRvTG9jYWxzTWFwIGdldCBsb2NhbHNNYXAgPT4gX2N1cnJlbnRGcmFtZS5sb2NhbHNNYXA7CgogIE1hcDxpci5WYXJpYWJsZURlY2xhcmF0aW9uLCBISW5zdHJ1Y3Rpb24+IGdldCBsZXRCaW5kaW5ncyA9PgogICAgICBfY3VycmVudEZyYW1lLmxldEJpbmRpbmdzOwoKICBKQ29tbW9uRWxlbWVudHMgZ2V0IF9jb21tb25FbGVtZW50cyA9PiBfZWxlbWVudE1hcC5jb21tb25FbGVtZW50czsKCiAgSkZpZWxkQW5hbHlzaXMgZ2V0IF9maWVsZEFuYWx5c2lzID0+IGNsb3NlZFdvcmxkLmZpZWxkQW5hbHlzaXM7CgogIEtlcm5lbFRvVHlwZUluZmVyZW5jZU1hcCBnZXQgX3R5cGVJbmZlcmVuY2VNYXAgPT4KICAgICAgX2N1cnJlbnRGcmFtZS50eXBlSW5mZXJlbmNlTWFwOwoKICBTb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIgZ2V0IF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIgPT4KICAgICAgX2N1cnJlbnRGcmFtZS5zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXI7CgogIERhcnRUeXBlIF9nZXRTdGF0aWNUeXBlKGlyLkV4cHJlc3Npb24gbm9kZSkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3Vic3RpdHV0ZSB0aGUgdHlwZSBieSB0aGUgdGhpcyB0eXBlIGFuZCB0eXBlCiAgICAvLyBhcmd1bWVudHMgb2YgdGhlIGN1cnJlbnQgZnJhbWUuCiAgICByZXR1cm4gX2VsZW1lbnRNYXAKICAgICAgICAuZ2V0RGFydFR5cGUoX2N1cnJlbnRGcmFtZS5zdGF0aWNUeXBlUHJvdmlkZXIuZ2V0U3RhdGljVHlwZShub2RlKSk7CiAgfQoKICBzdGF0aWMgTWVtYmVyRW50aXR5IF9lZmZlY3RpdmVUYXJnZXRFbGVtZW50Rm9yKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIGlmIChtZW1iZXIgaXMgSkdlbmVyYXRvckJvZHkpIHJldHVybiBtZW1iZXIuZnVuY3Rpb247CiAgICByZXR1cm4gbWVtYmVyOwogIH0KCiAgdm9pZCBfZW50ZXJGcmFtZSgKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciwgU291cmNlSW5mb3JtYXRpb24gY2FsbFNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBBc3luY01hcmtlciBhc3luY01hcmtlciA9IEFzeW5jTWFya2VyLlNZTkM7CiAgICBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb24gPSBnZXRGdW5jdGlvbk5vZGUoX2VsZW1lbnRNYXAsIG1lbWJlcik7CiAgICBpZiAoZnVuY3Rpb24gIT0gbnVsbCkgewogICAgICBhc3luY01hcmtlciA9IGdldEFzeW5jTWFya2VyKGZ1bmN0aW9uKTsKICAgIH0KICAgIF9jdXJyZW50RnJhbWUgPSBuZXcgU3RhY2tGcmFtZSgKICAgICAgICBfY3VycmVudEZyYW1lLAogICAgICAgIG1lbWJlciwKICAgICAgICBhc3luY01hcmtlciwKICAgICAgICBjbG9zZWRXb3JsZC5nbG9iYWxMb2NhbHNNYXAuZ2V0TG9jYWxzTWFwKG1lbWJlciksCiAgICAgICAge30sCiAgICAgICAgbmV3IEtlcm5lbFRvVHlwZUluZmVyZW5jZU1hcEltcGwobWVtYmVyLCBnbG9iYWxJbmZlcmVuY2VSZXN1bHRzKSwKICAgICAgICBfY3VycmVudEZyYW1lICE9IG51bGwKICAgICAgICAgICAgPyBfY3VycmVudEZyYW1lLnNvdXJjZUluZm9ybWF0aW9uQnVpbGRlcgogICAgICAgICAgICAgICAgLmZvckNvbnRleHQobWVtYmVyLCBjYWxsU291cmNlSW5mb3JtYXRpb24pCiAgICAgICAgICAgIDogX3NvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kuY3JlYXRlQnVpbGRlckZvckNvbnRleHQobWVtYmVyKSwKICAgICAgICBfZWxlbWVudE1hcC5nZXRTdGF0aWNUeXBlUHJvdmlkZXIobWVtYmVyKSk7CiAgfQoKICB2b2lkIF9sZWF2ZUZyYW1lKCkgewogICAgX2N1cnJlbnRGcmFtZSA9IF9jdXJyZW50RnJhbWUucGFyZW50OwogIH0KCiAgSEdyYXBoIGJ1aWxkKCkgewogICAgcmV0dXJuIHJlcG9ydGVyLndpdGhDdXJyZW50RWxlbWVudChsb2NhbHNNYXAuY3VycmVudE1lbWJlciwgKCkgewogICAgICAvLyBUT0RPKGhldCk6IG5vIHJlYXNvbiB0byBkbyB0aGlzIGhlcmUuLi4KICAgICAgSEluc3RydWN0aW9uLmlkQ291bnRlciA9IDA7CiAgICAgIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiA9CiAgICAgICAgICBfZWxlbWVudE1hcC5nZXRNZW1iZXJEZWZpbml0aW9uKGluaXRpYWxUYXJnZXRFbGVtZW50KTsKCiAgICAgIHN3aXRjaCAoZGVmaW5pdGlvbi5raW5kKSB7CiAgICAgICAgY2FzZSBNZW1iZXJLaW5kLnJlZ3VsYXI6CiAgICAgICAgY2FzZSBNZW1iZXJLaW5kLmNsb3N1cmVDYWxsOgogICAgICAgICAgaXIuTm9kZSB0YXJnZXQgPSBkZWZpbml0aW9uLm5vZGU7CiAgICAgICAgICBpZiAodGFyZ2V0IGlzIGlyLlByb2NlZHVyZSkgewogICAgICAgICAgICBpZiAodGFyZ2V0LmlzRXh0ZXJuYWwpIHsKICAgICAgICAgICAgICBidWlsZEV4dGVybmFsRnVuY3Rpb25Ob2RlKAogICAgICAgICAgICAgICAgICB0YXJnZXRFbGVtZW50LCBfZW5zdXJlRGVmYXVsdEFyZ3VtZW50VmFsdWVzKHRhcmdldC5mdW5jdGlvbikpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGJ1aWxkRnVuY3Rpb25Ob2RlKAogICAgICAgICAgICAgICAgICB0YXJnZXRFbGVtZW50LCBfZW5zdXJlRGVmYXVsdEFyZ3VtZW50VmFsdWVzKHRhcmdldC5mdW5jdGlvbikpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCBpcyBpci5GaWVsZCkgewogICAgICAgICAgICBpZiAoaGFuZGxlQ29uc3RhbnRGaWVsZCh0YXJnZXRFbGVtZW50LCByZWdpc3RyeSwgY2xvc2VkV29ybGQpKSB7CiAgICAgICAgICAgICAgLy8gTm8gY29kZSBpcyBnZW5lcmF0ZWQgZm9yIGB0YXJnZXRFbGVtZW50YDogQWxsIHJlZmVyZW5jZXMgaW5saW5lCiAgICAgICAgICAgICAgLy8gdGhlIGNvbnN0YW50IHZhbHVlLgogICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldEVsZW1lbnQuaXNTdGF0aWMgfHwgdGFyZ2V0RWxlbWVudC5pc1RvcExldmVsKSB7CiAgICAgICAgICAgICAgaWYgKF9maWVsZEFuYWx5c2lzLmdldEZpZWxkRGF0YSh0YXJnZXRFbGVtZW50KS5pc0xhenkpIHsKICAgICAgICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IExhenkgZmllbGRzIHNob3VsZCBiZSBjb2xsZWN0ZWQgbGlrZQogICAgICAgICAgICAgICAgLy8gZWFnZXIgYW5kIG5vbi1maW5hbCBmaWVsZHMuCiAgICAgICAgICAgICAgICBiYWNrZW5kLmNvbnN0YW50cy5yZWdpc3RlckxhenlTdGF0aWModGFyZ2V0RWxlbWVudCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGFzc2VydCh0YXJnZXRFbGVtZW50LmlzSW5zdGFuY2VNZW1iZXIpOwogICAgICAgICAgICAgIGlmIChfZmllbGRBbmFseXNpcwogICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkRGF0YSh0YXJnZXRFbGVtZW50KQogICAgICAgICAgICAgICAgICAgICAgLmlzRWZmZWN0aXZlbHlGaW5hbCB8fAogICAgICAgICAgICAgICAgICAhb3B0aW9ucy5wYXJhbWV0ZXJDaGVja1BvbGljeS5pc0VtaXR0ZWQpIHsKICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgZm9yIGEgY2hlY2tlZCBzZXR0ZXIuCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnVpbGRGaWVsZCh0YXJnZXQpOwogICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgaXMgaXIuRnVuY3Rpb25FeHByZXNzaW9uKSB7CiAgICAgICAgICAgIGJ1aWxkRnVuY3Rpb25Ob2RlKAogICAgICAgICAgICAgICAgdGFyZ2V0RWxlbWVudCwgX2Vuc3VyZURlZmF1bHRBcmd1bWVudFZhbHVlcyh0YXJnZXQuZnVuY3Rpb24pKTsKICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0IGlzIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24pIHsKICAgICAgICAgICAgYnVpbGRGdW5jdGlvbk5vZGUoCiAgICAgICAgICAgICAgICB0YXJnZXRFbGVtZW50LCBfZW5zdXJlRGVmYXVsdEFyZ3VtZW50VmFsdWVzKHRhcmdldC5mdW5jdGlvbikpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgJ05vIGNhc2UgaW1wbGVtZW50ZWQgdG8gaGFuZGxlIHRhcmdldDogJwogICAgICAgICAgICAgICAgJyR0YXJnZXQgZm9yICR0YXJnZXRFbGVtZW50JzsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTWVtYmVyS2luZC5jb25zdHJ1Y3RvcjoKICAgICAgICAgIGlyLkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gZGVmaW5pdGlvbi5ub2RlOwogICAgICAgICAgX2Vuc3VyZURlZmF1bHRBcmd1bWVudFZhbHVlcyhjb25zdHJ1Y3Rvci5mdW5jdGlvbik7CiAgICAgICAgICBidWlsZENvbnN0cnVjdG9yKHRhcmdldEVsZW1lbnQsIGNvbnN0cnVjdG9yKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTWVtYmVyS2luZC5jb25zdHJ1Y3RvckJvZHk6CiAgICAgICAgICBpci5Db25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IGRlZmluaXRpb24ubm9kZTsKICAgICAgICAgIF9lbnN1cmVEZWZhdWx0QXJndW1lbnRWYWx1ZXMoY29uc3RydWN0b3IuZnVuY3Rpb24pOwogICAgICAgICAgYnVpbGRDb25zdHJ1Y3RvckJvZHkoY29uc3RydWN0b3IpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNZW1iZXJLaW5kLmNsb3N1cmVGaWVsZDoKICAgICAgICAgIC8vIENsb3N1cmUgZmllbGRzIGhhdmUgbm8gc2V0dGVyIGFuZCB0aGVyZWZvcmUgbmV2ZXIgcmVxdWlyZSBhbnkgY29kZS4KICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIGNhc2UgTWVtYmVyS2luZC5zaWduYXR1cmU6CiAgICAgICAgICBpci5Ob2RlIHRhcmdldCA9IGRlZmluaXRpb24ubm9kZTsKICAgICAgICAgIGlyLkZ1bmN0aW9uTm9kZSBvcmlnaW5hbENsb3N1cmVOb2RlOwogICAgICAgICAgaWYgKHRhcmdldCBpcyBpci5Qcm9jZWR1cmUpIHsKICAgICAgICAgICAgb3JpZ2luYWxDbG9zdXJlTm9kZSA9IHRhcmdldC5mdW5jdGlvbjsKICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0IGlzIGlyLkZ1bmN0aW9uRXhwcmVzc2lvbikgewogICAgICAgICAgICBvcmlnaW5hbENsb3N1cmVOb2RlID0gdGFyZ2V0LmZ1bmN0aW9uOwogICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgaXMgaXIuRnVuY3Rpb25EZWNsYXJhdGlvbikgewogICAgICAgICAgICBvcmlnaW5hbENsb3N1cmVOb2RlID0gdGFyZ2V0LmZ1bmN0aW9uOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgICAgICB0YXJnZXRFbGVtZW50LAogICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgZnVuY3Rpb24gc2lnbmF0dXJlOiAiCiAgICAgICAgICAgICAgICAiJHRhcmdldEVsZW1lbnQgaW5zaWRlIGEgbm9uLWNsb3N1cmU6ICR0YXJnZXQiKTsKICAgICAgICAgIH0KICAgICAgICAgIGJ1aWxkTWV0aG9kU2lnbmF0dXJlKG9yaWdpbmFsQ2xvc3VyZU5vZGUpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNZW1iZXJLaW5kLmdlbmVyYXRvckJvZHk6CiAgICAgICAgICBidWlsZEdlbmVyYXRvckJvZHkoCiAgICAgICAgICAgICAgaW5pdGlhbFRhcmdldEVsZW1lbnQsIF9mdW5jdGlvbk5vZGVPZihkZWZpbml0aW9uLm5vZGUpKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGFzc2VydChncmFwaC5pc1ZhbGlkKCksICJJbnZhbGlkIGdyYXBoIGZvciAkaW5pdGlhbFRhcmdldEVsZW1lbnQuIik7CgogICAgICBpZiAoYmFja2VuZC50cmFjZXIuaXNFbmFibGVkKSB7CiAgICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IGluaXRpYWxUYXJnZXRFbGVtZW50OwogICAgICAgIFN0cmluZyBuYW1lID0gbWVtYmVyLm5hbWU7CiAgICAgICAgaWYgKG1lbWJlci5pc0luc3RhbmNlTWVtYmVyIHx8CiAgICAgICAgICAgIG1lbWJlci5pc0NvbnN0cnVjdG9yIHx8CiAgICAgICAgICAgIG1lbWJlci5pc1N0YXRpYykgewogICAgICAgICAgbmFtZSA9ICIke21lbWJlci5lbmNsb3NpbmdDbGFzcy5uYW1lfS4kbmFtZSI7CiAgICAgICAgICBpZiAoZGVmaW5pdGlvbi5raW5kID09IE1lbWJlcktpbmQuY29uc3RydWN0b3JCb2R5KSB7CiAgICAgICAgICAgIG5hbWUgKz0gIiAoYm9keSkiOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBiYWNrZW5kLnRyYWNlci50cmFjZUNvbXBpbGF0aW9uKG5hbWUpOwogICAgICAgIGJhY2tlbmQudHJhY2VyLnRyYWNlR3JhcGgoJ2J1aWxkZXInLCBncmFwaCk7CiAgICAgIH0KCiAgICAgIHJldHVybiBncmFwaDsKICAgIH0pOwogIH0KCiAgaXIuRnVuY3Rpb25Ob2RlIF9mdW5jdGlvbk5vZGVPZihpci5UcmVlTm9kZSBub2RlKSB7CiAgICBpZiAobm9kZSBpcyBpci5NZW1iZXIpIHJldHVybiBub2RlLmZ1bmN0aW9uOwogICAgaWYgKG5vZGUgaXMgaXIuRnVuY3Rpb25EZWNsYXJhdGlvbikgcmV0dXJuIG5vZGUuZnVuY3Rpb247CiAgICBpZiAobm9kZSBpcyBpci5GdW5jdGlvbkV4cHJlc3Npb24pIHJldHVybiBub2RlLmZ1bmN0aW9uOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBpci5GdW5jdGlvbk5vZGUgX2Vuc3VyZURlZmF1bHRBcmd1bWVudFZhbHVlcyhpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb24pIHsKICAgIC8vIFJlZ2lzdGVyIGFsbCBbZnVuY3Rpb25dJ3MgZGVmYXVsdCBhcmd1bWVudCB2YWx1ZXMuCiAgICAvLwogICAgLy8gRGVmYXVsdCB2YWx1ZXMgbWlnaHQgYmUgKG9yIGNvbnRhaW4pIGZ1bmN0aW9ucyB0aGF0IGFyZSBub3QgcmVmZXJlbmNlZAogICAgLy8gZnJvbSBhbnl3aGVyZSBlbHNlIHNvIHdlIG5lZWQgdG8gZW5zdXJlIHRoZXNlIGFyZSBlbnF1ZXVlZC4gIFN0dWJzIGFuZAogICAgLy8gYEZ1bmN0aW9uLmFwcGx5YCBkYXRhIGFyZSBjcmVhdGVkIGFmdGVyIHRoZSBjb2RlZ2VuIHF1ZXVlIGlzIGNsb3NlZCwgc28KICAgIC8vIHdlIGZvcmNlIHRoZXNlIGZ1bmN0aW9ucyBpbnRvIHRoZSBxdWV1ZSBieSByZWdpc3RlcmluZyB0aGUgY29uc3RhbnRzIGFzCiAgICAvLyB1c2VkIGluIGFkdmFuY2UuIFNlZSBsYW5ndWFnZS9jeWNsaWNfZGVmYXVsdF92YWx1ZXNfdGVzdC5kYXJ0IGZvciBhbgogICAgLy8gZXhhbXBsZS4KICAgIC8vCiAgICAvLyBUT0RPKHNyYSk6IFdlIGNvdWxkIGJlIG1vcmUgcHJlY2lzZSBpZiBzdHVicyBhbmQgYEZ1bmN0aW9uLmFwcGx5YCBkYXRhCiAgICAvLyB3ZXJlIGdlbmVyYXRlZCBieSB0aGUgY29kZWdlbiBlbnF1ZXVlci4gSW4gcHJhY3RpY2UgZXZlbiBpbiBodWdlIHByb2dyYW1zCiAgICAvLyB0aGVyZSBhcmUgb25seSB2ZXJ5IHNtYWxsIG51bWJlciBvZiBjb25zdGFudHMgY3JlYXRlZCBoZXJlIHRoYXQgYXJlIG5vdAogICAgLy8gYWN0dWFsbHkgdXNlZC4KICAgIHZvaWQgcmVnaXN0ZXJEZWZhdWx0VmFsdWUoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnRWYWx1ZSA9CiAgICAgICAgICBfZWxlbWVudE1hcC5nZXRDb25zdGFudFZhbHVlKG5vZGUuaW5pdGlhbGl6ZXIsIGltcGxpY2l0TnVsbDogdHJ1ZSk7CiAgICAgIGFzc2VydCgKICAgICAgICAgIGNvbnN0YW50VmFsdWUgIT0gbnVsbCwKICAgICAgICAgIGZhaWxlZEF0KF9lbGVtZW50TWFwLmdldE1ldGhvZChmdW5jdGlvbi5wYXJlbnQpLAogICAgICAgICAgICAgICdObyBjb25zdGFudCBjb21wdXRlZCBmb3IgJG5vZGUnKSk7CiAgICAgIHJlZ2lzdHJ5Py5yZWdpc3RlckNvbnN0YW50VXNlKG5ldyBDb25zdGFudFVzZS5pbml0KGNvbnN0YW50VmFsdWUpKTsKICAgIH0KCiAgICBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycwogICAgICAgIC5za2lwKGZ1bmN0aW9uLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpCiAgICAgICAgLmZvckVhY2gocmVnaXN0ZXJEZWZhdWx0VmFsdWUpOwogICAgZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLmZvckVhY2gocmVnaXN0ZXJEZWZhdWx0VmFsdWUpOwogICAgcmV0dXJuIGZ1bmN0aW9uOwogIH0KCiAgdm9pZCBidWlsZEZpZWxkKGlyLkZpZWxkIG5vZGUpIHsKICAgIF9pbkxhenlJbml0aWFsaXplckV4cHJlc3Npb24gPSBub2RlLmlzU3RhdGljOwogICAgRmllbGRFbnRpdHkgZmllbGQgPSBfZWxlbWVudE1hcC5nZXRNZW1iZXIobm9kZSk7CiAgICBvcGVuRnVuY3Rpb24oZmllbGQsIGNoZWNrczogVGFyZ2V0Q2hlY2tzLm5vbmUpOwogICAgaWYgKG5vZGUuaXNJbnN0YW5jZU1lbWJlciAmJiBvcHRpb25zLnBhcmFtZXRlckNoZWNrUG9saWN5LmlzRW1pdHRlZCkgewogICAgICBISW5zdHJ1Y3Rpb24gdGhpc0luc3RydWN0aW9uID0gbG9jYWxzSGFuZGxlci5yZWFkVGhpcygKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkR2V0KG5vZGUpKTsKICAgICAgLy8gVXNlIGR5bmFtaWMgdHlwZSBiZWNhdXNlIHRoZSB0eXBlIGNvbXB1dGVkIGJ5IHRoZSBpbmZlcnJlciBpcwogICAgICAvLyBuYXJyb3dlZCB0byB0aGUgdHlwZSBhbm5vdGF0aW9uLgogICAgICBISW5zdHJ1Y3Rpb24gcGFyYW1ldGVyID0KICAgICAgICAgIG5ldyBIUGFyYW1ldGVyVmFsdWUoZmllbGQsIGFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUpOwogICAgICAvLyBBZGQgdGhlIHBhcmFtZXRlciBhcyB0aGUgbGFzdCBpbnN0cnVjdGlvbiBvZiB0aGUgZW50cnkgYmxvY2suCiAgICAgIC8vIElmIHRoZSBtZXRob2QgaXMgaW50ZXJjZXB0ZWQsIHdlIHdhbnQgdGhlIGFjdHVhbCByZWNlaXZlcgogICAgICAvLyB0byBiZSB0aGUgZmlyc3QgcGFyYW1ldGVyLgogICAgICBncmFwaC5lbnRyeS5hZGRCZWZvcmUoZ3JhcGguZW50cnkubGFzdCwgcGFyYW1ldGVyKTsKICAgICAgSEluc3RydWN0aW9uIHZhbHVlID0gdHlwZUJ1aWxkZXIucG90ZW50aWFsbHlDaGVja09yVHJ1c3RUeXBlT2ZQYXJhbWV0ZXIoCiAgICAgICAgICBwYXJhbWV0ZXIsIF9nZXREYXJ0VHlwZUlmVmFsaWQobm9kZS50eXBlKSk7CiAgICAgIGlmICghX2ZpZWxkQW5hbHlzaXMuZ2V0RmllbGREYXRhKGZpZWxkKS5pc0VsaWRlZCkgewogICAgICAgIGFkZChuZXcgSEZpZWxkU2V0KGFic3RyYWN0VmFsdWVEb21haW4sIGZpZWxkLCB0aGlzSW5zdHJ1Y3Rpb24sIHZhbHVlKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChub2RlLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgICBub2RlLmluaXRpYWxpemVyLmFjY2VwdCh0aGlzKTsKICAgICAgICBISW5zdHJ1Y3Rpb24gZmllbGRWYWx1ZSA9IHBvcCgpOwogICAgICAgIEhJbnN0cnVjdGlvbiBjaGVja0luc3RydWN0aW9uID0KICAgICAgICAgICAgdHlwZUJ1aWxkZXIucG90ZW50aWFsbHlDaGVja09yVHJ1c3RUeXBlT2ZBc3NpZ25tZW50KAogICAgICAgICAgICAgICAgZmllbGRWYWx1ZSwgX2dldERhcnRUeXBlSWZWYWxpZChub2RlLnR5cGUpKTsKICAgICAgICBzdGFjay5hZGQoY2hlY2tJbnN0cnVjdGlvbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCkpOwogICAgICB9CiAgICAgIEhJbnN0cnVjdGlvbiB2YWx1ZSA9IHBvcCgpOwogICAgICBjbG9zZUFuZEdvdG9FeGl0KG5ldyBIUmV0dXJuKGFic3RyYWN0VmFsdWVEb21haW4sIHZhbHVlLAogICAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZFJldHVybihub2RlKSkpOwogICAgfQogICAgY2xvc2VGdW5jdGlvbigpOwogIH0KCiAgRGFydFR5cGUgX2dldERhcnRUeXBlSWZWYWxpZChpci5EYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZSBpcyBpci5JbnZhbGlkVHlwZSkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gX2VsZW1lbnRNYXAuZ2V0RGFydFR5cGUodHlwZSk7CiAgfQoKICAvLy8gUG9wcyB0aGUgbW9zdCByZWNlbnQgaW5zdHJ1Y3Rpb24gZnJvbSB0aGUgc3RhY2sgYW5kICdib29saWZpZXMnIGl0LgogIC8vLwogIC8vLyBCb29saWZpY2F0aW9uIGlzIGNoZWNraW5nIGlmIHRoZSB2YWx1ZSBpcyAnPT09IHRydWUnLgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBwb3BCb29saWZpZWQoKSB7CiAgICBISW5zdHJ1Y3Rpb24gdmFsdWUgPSBwb3AoKTsKICAgIGlmICh0eXBlQnVpbGRlci5jaGVja09yVHJ1c3RUeXBlcykgewogICAgICByZXR1cm4gdHlwZUJ1aWxkZXIucG90ZW50aWFsbHlDaGVja09yVHJ1c3RUeXBlT2ZDb25kaXRpb24odmFsdWUpOwogICAgfQogICAgSEluc3RydWN0aW9uIHJlc3VsdCA9IG5ldyBIQm9vbGlmeSh2YWx1ZSwgYWJzdHJhY3RWYWx1ZURvbWFpbi5ib29sVHlwZSk7CiAgICBhZGQocmVzdWx0KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gRXh0ZW5kIGN1cnJlbnQgbWV0aG9kIHBhcmFtZXRlcnMgd2l0aCBwYXJhbWV0ZXJzIGZvciB0aGUgY2xhc3MgdHlwZQogIC8vLyBwYXJhbWV0ZXJzLiAgSWYgdGhlIGNsYXNzIGhhcyB0eXBlIHBhcmFtZXRlcnMgYnV0IGRvZXMgbm90IG5lZWQgdGhlbSwgYmluZAogIC8vLyB0byBgZHluYW1pY2AgKHJlcHJlc2VudGVkIGFzIGBudWxsYCkgc28gdGhlIGJpbmRpbmdzIGFyZSBhdmFpbGFibGUgZm9yCiAgLy8vIGJ1aWxkaW5nIHR5cGVzIHVwIHRoZSBpbmhlcml0YW5jZSBjaGFpbiBvZiBnZW5lcmF0aXZlIGNvbnN0cnVjdG9ycy4KICB2b2lkIF9hZGRDbGFzc1R5cGVWYXJpYWJsZXNJZk5lZWRlZChNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICBpZiAoIW1lbWJlci5pc0NvbnN0cnVjdG9yICYmIG1lbWJlciBpcyEgQ29uc3RydWN0b3JCb2R5RW50aXR5KSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIENsYXNzRW50aXR5IGNscyA9IG1lbWJlci5lbmNsb3NpbmdDbGFzczsKICAgIEludGVyZmFjZVR5cGUgdGhpc1R5cGUgPSBfZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQuZ2V0VGhpc1R5cGUoY2xzKTsKICAgIGlmICh0aGlzVHlwZS50eXBlQXJndW1lbnRzLmlzRW1wdHkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgYm9vbCBuZWVkc1R5cGVBcmd1bWVudHMgPSBydGlOZWVkLmNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKGNscyk7CiAgICB0aGlzVHlwZS50eXBlQXJndW1lbnRzLmZvckVhY2goKERhcnRUeXBlIF90eXBlVmFyaWFibGUpIHsKICAgICAgVHlwZVZhcmlhYmxlVHlwZSB0eXBlVmFyaWFibGVUeXBlID0gX3R5cGVWYXJpYWJsZTsKICAgICAgSEluc3RydWN0aW9uIHBhcmFtOwogICAgICBpZiAobmVlZHNUeXBlQXJndW1lbnRzKSB7CiAgICAgICAgcGFyYW0gPSBhZGRQYXJhbWV0ZXIoCiAgICAgICAgICAgIHR5cGVWYXJpYWJsZVR5cGUuZWxlbWVudCwgYWJzdHJhY3RWYWx1ZURvbWFpbi5ub25OdWxsVHlwZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVW51c2VkLCBzbyBiaW5kIHRvIGBkeW5hbWljYC4KICAgICAgICBwYXJhbSA9IGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCk7CiAgICAgIH0KICAgICAgTG9jYWwgbG9jYWwgPSBsb2NhbHNIYW5kbGVyLmdldFR5cGVWYXJpYWJsZUFzTG9jYWwodHlwZVZhcmlhYmxlVHlwZSk7CiAgICAgIGxvY2Fsc0hhbmRsZXIuZGlyZWN0TG9jYWxzW2xvY2FsXSA9IHBhcmFtOwogICAgfSk7CiAgfQoKICAvLy8gRXh0ZW5kIGN1cnJlbnQgbWV0aG9kIHBhcmFtZXRlcnMgd2l0aCBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24gdHlwZQogIC8vLyB2YXJpYWJsZXMuCiAgLy8vCiAgLy8vIFRPRE8oam9obm5pd2ludGhlcik6IERvIHdlIG5lZWQgdGhpcz8KICAvLy8gSWYgdGhlIG1ldGhvZCBoYXMgdHlwZSB2YXJpYWJsZXMgYnV0IGRvZXMgbm90IG5lZWQgdGhlbSwgYmluZCB0byBgZHluYW1pY2AKICAvLy8gKHJlcHJlc2VudGVkIGFzIGBudWxsYCkuCiAgdm9pZCBfYWRkRnVuY3Rpb25UeXBlVmFyaWFibGVzSWZOZWVkZWQoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgaWYgKG1lbWJlciBpcyEgRnVuY3Rpb25FbnRpdHkpIHJldHVybjsKCiAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiA9IG1lbWJlcjsKICAgIExpc3Q8VHlwZVZhcmlhYmxlVHlwZT4gdHlwZVZhcmlhYmxlcyA9CiAgICAgICAgX2VsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZVZhcmlhYmxlcyhmdW5jdGlvbik7CiAgICBpZiAodHlwZVZhcmlhYmxlcy5pc0VtcHR5KSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGJvb2wgbmVlZHNUeXBlQXJndW1lbnRzID0gcnRpTmVlZC5tZXRob2ROZWVkc1R5cGVBcmd1bWVudHMoZnVuY3Rpb24pOwogICAgYm9vbCBlbGlkZVR5cGVQYXJhbWV0ZXJzID0gZnVuY3Rpb24ucGFyYW1ldGVyU3RydWN0dXJlLnR5cGVQYXJhbWV0ZXJzID09IDA7CiAgICBmb3IgKFR5cGVWYXJpYWJsZVR5cGUgdHlwZVZhcmlhYmxlCiAgICAgICAgaW4gX2VsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZVZhcmlhYmxlcyhmdW5jdGlvbikpIHsKICAgICAgSEluc3RydWN0aW9uIHBhcmFtOwogICAgICBpZiAoZWxpZGVUeXBlUGFyYW1ldGVycykgewogICAgICAgIC8vIEFkZCBlbGlkZWQgdHlwZSBwYXJhbWV0ZXJzLgogICAgICAgIHBhcmFtID0gX2NvbXB1dGVUeXBlQXJndW1lbnREZWZhdWx0VmFsdWUoZnVuY3Rpb24sIHR5cGVWYXJpYWJsZSk7CiAgICAgIH0gZWxzZSBpZiAobmVlZHNUeXBlQXJndW1lbnRzKSB7CiAgICAgICAgcGFyYW0gPQogICAgICAgICAgICBhZGRQYXJhbWV0ZXIodHlwZVZhcmlhYmxlLmVsZW1lbnQsIGFic3RyYWN0VmFsdWVEb21haW4ubm9uTnVsbFR5cGUpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFVudXNlZCwgc28gYmluZCB0byBgZHluYW1pY2AuCiAgICAgICAgcGFyYW0gPSBncmFwaC5hZGRDb25zdGFudE51bGwoY2xvc2VkV29ybGQpOwogICAgICB9CiAgICAgIExvY2FsIGxvY2FsID0gbG9jYWxzSGFuZGxlci5nZXRUeXBlVmFyaWFibGVBc0xvY2FsKHR5cGVWYXJpYWJsZSk7CiAgICAgIGxvY2Fsc0hhbmRsZXIuZGlyZWN0TG9jYWxzW2xvY2FsXSA9IHBhcmFtOwogICAgICBmdW5jdGlvblR5cGVQYXJhbWV0ZXJMb2NhbHMuYWRkKGxvY2FsKTsKICAgIH0KICB9CgogIExpc3Q8TG9jYWw+IGZ1bmN0aW9uVHlwZVBhcmFtZXRlckxvY2FscyA9IDxMb2NhbD5bXTsKCiAgLy8vIEJ1aWxkcyBhIGdlbmVyYXRpdmUgY29uc3RydWN0b3IuCiAgLy8vCiAgLy8vIEdlbmVyYXRpdmUgY29uc3RydWN0b3JzIGFyZSBidWlsdCBpbiBzdGFnZXMsIGluIGVmZmVjdCBpbmxpbmluZyB0aGUKICAvLy8gaW5pdGlhbGl6ZXJzIGFuZCBjb25zdHJ1Y3RvciBib2RpZXMgdXAgdGhlIGluaGVyaXRhbmNlIGNoYWluLgogIC8vLwogIC8vLyAgMS4gRXh0ZW5kIG1ldGhvZCBwYXJhbWV0ZXJzIHdpdGggcGFyYW1ldGVycyB0aGUgY2xhc3MncyB0eXBlIHBhcmFtZXRlcnMuCiAgLy8vCiAgLy8vICAyLiBBZGQgdHlwZSBjaGVja3MgZm9yIHZhbHVlIHBhcmFtZXRlcnMgKG1pZ2h0IG5lZWQgcmVzdWx0IG9mICgxKSkuCiAgLy8vCiAgLy8vICAzLiBXYWxrIGluaGVyaXRhbmNlIGNoYWluIHRvIGJ1aWxkIGJpbmRpbmdzIGZvciB0eXBlIHBhcmFtZXRlcnMgb2YKICAvLy8gICAgIHN1cGVyY2xhc3NlcyBhbmQgbWl4ZWQtaW4gY2xhc3Nlcy4KICAvLy8KICAvLy8gIDQuIENvbGxlY3QgaW5pdGlhbGl6ZXIgdmFsdWVzLiBXYWxrIHVwIGluaGVyaXRhbmNlIGNoYWluIHRvIGNvbGxlY3QgZmllbGQKICAvLy8gICAgIGluaXRpYWxpemVycyBmcm9tIGZpZWxkIGRlY2xhcmF0aW9ucywgaW5pdGlhbGl6aW5nIHBhcmFtZXRlcnMgYW5kCiAgLy8vICAgICBpbml0aWFsaXplci4KICAvLy8KICAvLy8gIDUuIENyZWF0ZSByZWlmaWVkIHR5cGUgaW5mb3JtYXRpb24gZm9yIGluc3RhbmNlLgogIC8vLwogIC8vLyAgNi4gQWxsb2NhdGUgaW5zdGFuY2UgYW5kIGFzc2lnbiBpbml0aWFsaXplcnMgYW5kIHJlaWZpZWQgdHlwZSBpbmZvcm1hdGlvbgogIC8vLyAgICAgdG8gZmllbGRzIGJ5IGNhbGxpbmcgSmF2YVNjcmlwdCBjb25zdHJ1Y3Rvci4KICAvLy8KICAvLy8gIDcuIFdhbGsgaW5oZXJpdGFuY2UgY2hhaW4gdG8gY2FsbCBvciBpbmxpbmUgY29uc3RydWN0b3IgYm9kaWVzLgogIC8vLwogIC8vLyBBbGwgdGhlIGJpbmRpbmdzIGFyZSBwdXQgaW4gdGhlIGNvbnN0cnVjdG9yJ3MgbG9jYWxzIGhhbmRsZXIuIFRoZQogIC8vLyBpbXBsaWNhdGlvbiBpcyB0aGF0IGEgY2xhc3MgY2Fubm90IGJlIGV4dGVuZGVkIG9yIG1peGVkLWluIHR3aWNlLiBJZiB3ZSBpbgogIC8vLyBmdXR1cmUgc3VwcG9ydCByZXBlYXRlZCB1c2VzIG9mIGEgbWl4aW4gY2xhc3MsIHdlIHNob3VsZCBkbyBzbyBieSBjbG9uaW5nCiAgLy8vIHRoZSBtaXhpbiBjbGFzcyBpbiB0aGUgS2VybmVsIGlucHV0LgogIHZvaWQgYnVpbGRDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvciwgaXIuQ29uc3RydWN0b3Igbm9kZSkgewogICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPQogICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRDcmVhdGUobm9kZSk7CiAgICBDbGFzc0VudGl0eSBjbHMgPSBjb25zdHJ1Y3Rvci5lbmNsb3NpbmdDbGFzczsKCiAgICBpZiAoX2lubGluaW5nU3RhY2suaXNFbXB0eSkgewogICAgICBvcGVuRnVuY3Rpb24oY29uc3RydWN0b3IsCiAgICAgICAgICBmdW5jdGlvbk5vZGU6IG5vZGUuZnVuY3Rpb24sCiAgICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmU6IGNvbnN0cnVjdG9yLnBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAgICAgIGNoZWNrczogVGFyZ2V0Q2hlY2tzLm5vbmUpOwogICAgfQoKICAgIC8vIFtjb25zdHJ1Y3RvckRhdGEuZmllbGRWYWx1ZXNdIGFjY3VtdWxhdGVzIHRoZSBmaWVsZCBpbml0aWFsaXplciB2YWx1ZXMsCiAgICAvLyB3aGljaCBtYXkgYmUgb3ZlcndyaXR0ZW4gYnkgaW5pdGlhbGl6ZXItbGlzdCBpbml0aWFsaXplcnMuCiAgICBDb25zdHJ1Y3RvckRhdGEgY29uc3RydWN0b3JEYXRhID0gQ29uc3RydWN0b3JEYXRhKCk7CiAgICBfYnVpbGRJbml0aWFsaXplcnMobm9kZSwgY29uc3RydWN0b3JEYXRhKTsKCiAgICBMaXN0PEhJbnN0cnVjdGlvbj4gY29uc3RydWN0b3JBcmd1bWVudHMgPSA8SEluc3RydWN0aW9uPltdOwogICAgLy8gRG9pbmcgdGhpcyBpbnN0ZWFkIG9mIGZpZWxkVmFsdWVzLmZvckVhY2ggYmVjYXVzZSB3ZSBoYXZlbid0IGRlZmluZWQgdGhlCiAgICAvLyBvcmRlciBvZiB0aGUgYXJndW1lbnRzIGhlcmUuIFdlIGNhbiBkZWZpbmUgdGhhdCB3aXRoIEpFbGVtZW50cy4KICAgIGJvb2wgaXNDdXN0b21FbGVtZW50ID0gbmF0aXZlRGF0YS5pc05hdGl2ZU9yRXh0ZW5kc05hdGl2ZShjbHMpICYmCiAgICAgICAgIW5hdGl2ZURhdGEuaXNKc0ludGVyb3BDbGFzcyhjbHMpOwogICAgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZSA9IF9lbGVtZW50TWFwLmVsZW1lbnRFbnZpcm9ubWVudC5nZXRUaGlzVHlwZShjbHMpOwogICAgTGlzdDxGaWVsZEVudGl0eT4gZmllbGRzID0gPEZpZWxkRW50aXR5PltdOwogICAgX3dvcmxkQnVpbGRlci5mb3JFYWNoSW5zdGFuY2VGaWVsZChjbHMsCiAgICAgICAgKENsYXNzRW50aXR5IGVuY2xvc2luZ0NsYXNzLCBGaWVsZEVudGl0eSBtZW1iZXIsIHtib29sIGlzRWxpZGVkfSkgewogICAgICBISW5zdHJ1Y3Rpb24gdmFsdWUgPSBjb25zdHJ1Y3RvckRhdGEuZmllbGRWYWx1ZXNbbWVtYmVyXTsKICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICBhc3NlcnQoCiAgICAgICAgICAgIF9maWVsZEFuYWx5c2lzLmdldEZpZWxkRGF0YShtZW1iZXIpLmlzSW5pdGlhbGl6ZWRJbkFsbG9jYXRvciB8fAogICAgICAgICAgICAgICAgaXNDdXN0b21FbGVtZW50IHx8CiAgICAgICAgICAgICAgICByZXBvcnRlci5oYXNSZXBvcnRlZEVycm9yLAogICAgICAgICAgICAnTm8gaW5pdGlhbGl6ZXIgdmFsdWUgZm9yIGZpZWxkICR7bWVtYmVyfScpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICghaXNFbGlkZWQpIHsKICAgICAgICAgIGZpZWxkcy5hZGQobWVtYmVyKTsKICAgICAgICAgIERhcnRUeXBlIHR5cGUgPSBfZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQuZ2V0RmllbGRUeXBlKG1lbWJlcik7CiAgICAgICAgICB0eXBlID0gbG9jYWxzSGFuZGxlci5zdWJzdEluQ29udGV4dCh0eXBlKTsKICAgICAgICAgIGNvbnN0cnVjdG9yQXJndW1lbnRzLmFkZCgKICAgICAgICAgICAgICB0eXBlQnVpbGRlci5wb3RlbnRpYWxseUNoZWNrT3JUcnVzdFR5cGVPZkFzc2lnbm1lbnQodmFsdWUsIHR5cGUpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwoKICAgIGFkZEltcGxpY2l0SW5zdGFudGlhdGlvbih0aGlzVHlwZSk7CiAgICBMaXN0PERhcnRUeXBlPiBpbnN0YW50aWF0ZWRUeXBlcyA9CiAgICAgICAgbmV3IExpc3Q8SW50ZXJmYWNlVHlwZT4uZnJvbShjdXJyZW50SW1wbGljaXRJbnN0YW50aWF0aW9ucyk7CgogICAgSEluc3RydWN0aW9uIG5ld09iamVjdDsKICAgIGlmIChpc0N1c3RvbUVsZW1lbnQpIHsKICAgICAgLy8gQnVsayBhc3NpZ24gdG8gdGhlIGluaXRpYWxpemVkIGZpZWxkcy4KICAgICAgbmV3T2JqZWN0ID0gZ3JhcGguZXhwbGljaXRSZWNlaXZlclBhcmFtZXRlcjsKICAgICAgLy8gTnVsbCBndWFyZCBlbnN1cmVzIGFuIGVycm9yIGlmIHdlIGFyZSBiZWluZyBjYWxsZWQgZnJvbSBhbiBleHBsaWNpdAogICAgICAvLyAnbmV3JyBvZiB0aGUgY29uc3RydWN0b3IgaW5zdGVhZCBvZiB2aWEgYW4gdXBncmFkZS4gSXQgaXMgb3B0aW1pemVkIG91dAogICAgICAvLyBpZiB0aGVyZSBhcmUgZmllbGQgaW5pdGlhbGl6ZXJzLgogICAgICBhZGQobmV3IEhGaWVsZEdldCgKICAgICAgICAgIG51bGwsIG5ld09iamVjdCwgYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSwgc291cmNlSW5mb3JtYXRpb24sCiAgICAgICAgICBpc0Fzc2lnbmFibGU6IGZhbHNlKSk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgYWRkKG5ldyBIRmllbGRTZXQoYWJzdHJhY3RWYWx1ZURvbWFpbiwgZmllbGRzW2ldLCBuZXdPYmplY3QsCiAgICAgICAgICAgIGNvbnN0cnVjdG9yQXJndW1lbnRzW2ldKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIENyZWF0ZSB0aGUgcnVudGltZSB0eXBlIGluZm9ybWF0aW9uLCBpZiBuZWVkZWQuCiAgICAgIGJvb2wgbmVlZHNUeXBlQXJndW1lbnRzID0KICAgICAgICAgIGNsb3NlZFdvcmxkLnJ0aU5lZWQuY2xhc3NOZWVkc1R5cGVBcmd1bWVudHMoY2xzKTsKICAgICAgaWYgKG5lZWRzVHlwZUFyZ3VtZW50cykgewogICAgICAgIC8vIFJlYWQgdGhlIHZhbHVlcyBvZiB0aGUgdHlwZSBhcmd1bWVudHMgYW5kIGNyZWF0ZSBhCiAgICAgICAgLy8gSFR5cGVJbmZvRXhwcmVzc2lvbiB0byBzZXQgb24gdGhlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0LgogICAgICAgIExpc3Q8SEluc3RydWN0aW9uPiB0eXBlQXJndW1lbnRzID0gPEhJbnN0cnVjdGlvbj5bXTsKICAgICAgICBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlID0KICAgICAgICAgICAgX2VsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50LmdldFRoaXNUeXBlKGNscyk7CiAgICAgICAgZm9yIChEYXJ0VHlwZSB0eXBlVmFyaWFibGUgaW4gdGhpc1R5cGUudHlwZUFyZ3VtZW50cykgewogICAgICAgICAgSEluc3RydWN0aW9uIGFyZ3VtZW50ID0gbG9jYWxzSGFuZGxlcgogICAgICAgICAgICAgIC5yZWFkTG9jYWwobG9jYWxzSGFuZGxlci5nZXRUeXBlVmFyaWFibGVBc0xvY2FsKHR5cGVWYXJpYWJsZSkpOwogICAgICAgICAgdHlwZUFyZ3VtZW50cy5hZGQoYXJndW1lbnQpOwogICAgICAgIH0KCiAgICAgICAgSEluc3RydWN0aW9uIHR5cGVJbmZvID0gbmV3IEhUeXBlSW5mb0V4cHJlc3Npb24oCiAgICAgICAgICAgIFR5cGVJbmZvRXhwcmVzc2lvbktpbmQuSU5TVEFOQ0UsCiAgICAgICAgICAgIHRoaXNUeXBlLAogICAgICAgICAgICB0eXBlQXJndW1lbnRzLAogICAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlKTsKICAgICAgICBhZGQodHlwZUluZm8pOwogICAgICAgIGNvbnN0cnVjdG9yQXJndW1lbnRzLmFkZCh0eXBlSW5mbyk7CiAgICAgIH0KCiAgICAgIG5ld09iamVjdCA9IG5ldyBIQ3JlYXRlKGNscywgY29uc3RydWN0b3JBcmd1bWVudHMsCiAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmNyZWF0ZU5vbk51bGxFeGFjdChjbHMpLCBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgICAgIGluc3RhbnRpYXRlZFR5cGVzOiBpbnN0YW50aWF0ZWRUeXBlcywKICAgICAgICAgIGhhc1J0aUlucHV0OiBuZWVkc1R5cGVBcmd1bWVudHMpOwoKICAgICAgYWRkKG5ld09iamVjdCk7CiAgICB9CiAgICByZW1vdmVJbXBsaWNpdEluc3RhbnRpYXRpb24odGhpc1R5cGUpOwoKICAgIEhJbnN0cnVjdGlvbiBpbnRlcmNlcHRvcjsKICAgIC8vIEdlbmVyYXRlIGNhbGxzIHRvIHRoZSBjb25zdHJ1Y3RvciBib2RpZXMuCiAgICBmb3IgKGlyLkNvbnN0cnVjdG9yIGJvZHkgaW4gY29uc3RydWN0b3JEYXRhLmNvbnN0cnVjdG9yQ2hhaW4ucmV2ZXJzZWQpIHsKICAgICAgaWYgKF9pc0VtcHR5U3RhdGVtZW50KGJvZHkuZnVuY3Rpb24uYm9keSkpIGNvbnRpbnVlOwoKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGJvZHlDYWxsSW5wdXRzID0gPEhJbnN0cnVjdGlvbj5bXTsKICAgICAgaWYgKGlzQ3VzdG9tRWxlbWVudCkgewogICAgICAgIGlmIChpbnRlcmNlcHRvciA9PSBudWxsKSB7CiAgICAgICAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50ID0gbmV3IEludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZShjbHMpOwogICAgICAgICAgaW50ZXJjZXB0b3IgPSBncmFwaC5hZGRDb25zdGFudChjb25zdGFudCwgY2xvc2VkV29ybGQpOwogICAgICAgIH0KICAgICAgICBib2R5Q2FsbElucHV0cy5hZGQoaW50ZXJjZXB0b3IpOwogICAgICB9CiAgICAgIGJvZHlDYWxsSW5wdXRzLmFkZChuZXdPYmplY3QpOwoKICAgICAgLy8gUGFzcyB1bmNhcHR1cmVkIGFyZ3VtZW50cyBmaXJzdCwgY2FwdHVyZWQgYXJndW1lbnRzIGluIGEgYm94LCB0aGVuIHR5cGUKICAgICAgLy8gYXJndW1lbnRzLgoKICAgICAgQ29uc3RydWN0b3JFbnRpdHkgaW5saW5lZENvbnN0cnVjdG9yID0gX2VsZW1lbnRNYXAuZ2V0Q29uc3RydWN0b3IoYm9keSk7CgogICAgICBpbmxpbmVkRnJvbSgKICAgICAgICAgIGlubGluZWRDb25zdHJ1Y3RvciwgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZENhbGwoYm9keSwgYm9keSksCiAgICAgICAgICAoKSB7CiAgICAgICAgQ29uc3RydWN0b3JCb2R5RW50aXR5IGNvbnN0cnVjdG9yQm9keSA9CiAgICAgICAgICAgIF9lbGVtZW50TWFwLmdldENvbnN0cnVjdG9yQm9keShib2R5KTsKCiAgICAgICAgdm9pZCBoYW5kbGVQYXJhbWV0ZXIoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlLCB7Ym9vbCBpc0VsaWRlZH0pIHsKICAgICAgICAgIGlmIChpc0VsaWRlZCkgcmV0dXJuOwoKICAgICAgICAgIExvY2FsIHBhcmFtZXRlciA9IGxvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKG5vZGUpOwogICAgICAgICAgLy8gSWYgW3BhcmFtZXRlcl0gaXMgYm94ZWQsIGl0IHdpbGwgYmUgYSBmaWVsZCBpbiB0aGUgYm94IHBhc3NlZCBhcwogICAgICAgICAgLy8gdGhlIGxhc3QgcGFyYW1ldGVyLiBTbyBubyBuZWVkIHRvIGRpcmVjdGx5IHBhc3MgaXQuCiAgICAgICAgICBpZiAoIWxvY2Fsc0hhbmRsZXIuaXNCb3hlZChwYXJhbWV0ZXIpKSB7CiAgICAgICAgICAgIGJvZHlDYWxsSW5wdXRzLmFkZChsb2NhbHNIYW5kbGVyLnJlYWRMb2NhbChwYXJhbWV0ZXIpKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFByb3ZpZGUgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIGdlbmVyYXRpdmUgY29uc3RydWN0b3IgYm9keS4KICAgICAgICBmb3JFYWNoT3JkZXJlZFBhcmFtZXRlcihfZWxlbWVudE1hcCwgY29uc3RydWN0b3JCb2R5LCBoYW5kbGVQYXJhbWV0ZXIpOwoKICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbG9jYWxzIHRoYXQgZXNjYXBlIChpLmUuIG11dGF0ZWQgaW4gY2xvc3VyZXMpLCB3ZSBwYXNzIHRoZQogICAgICAgIC8vIGJveCB0byB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgQ2FwdHVyZWRTY29wZSBzY29wZURhdGEgPQogICAgICAgICAgICBjbG9zdXJlRGF0YUxvb2t1cC5nZXRDYXB0dXJlZFNjb3BlKGNvbnN0cnVjdG9yQm9keSk7CiAgICAgICAgaWYgKHNjb3BlRGF0YS5yZXF1aXJlc0NvbnRleHRCb3gpIHsKICAgICAgICAgIGJvZHlDYWxsSW5wdXRzLmFkZChsb2NhbHNIYW5kbGVyLnJlYWRMb2NhbChzY29wZURhdGEuY29udGV4dCkpOwogICAgICAgIH0KCiAgICAgICAgLy8gUGFzcyB0eXBlIGFyZ3VtZW50cy4KICAgICAgICBDbGFzc0VudGl0eSBpbmxpbmVkQ29uc3RydWN0b3JDbGFzcyA9IGNvbnN0cnVjdG9yQm9keS5lbmNsb3NpbmdDbGFzczsKICAgICAgICBpZiAoY2xvc2VkV29ybGQucnRpTmVlZAogICAgICAgICAgICAuY2xhc3NOZWVkc1R5cGVBcmd1bWVudHMoaW5saW5lZENvbnN0cnVjdG9yQ2xhc3MpKSB7CiAgICAgICAgICBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlID0gX2VsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50CiAgICAgICAgICAgICAgLmdldFRoaXNUeXBlKGlubGluZWRDb25zdHJ1Y3RvckNsYXNzKTsKICAgICAgICAgIGZvciAoRGFydFR5cGUgdHlwZVZhcmlhYmxlIGluIHRoaXNUeXBlLnR5cGVBcmd1bWVudHMpIHsKICAgICAgICAgICAgRGFydFR5cGUgcmVzdWx0ID0gbG9jYWxzSGFuZGxlci5zdWJzdEluQ29udGV4dCh0eXBlVmFyaWFibGUpOwogICAgICAgICAgICBISW5zdHJ1Y3Rpb24gYXJndW1lbnQgPQogICAgICAgICAgICAgICAgdHlwZUJ1aWxkZXIuYW5hbHl6ZVR5cGVBcmd1bWVudChyZXN1bHQsIHNvdXJjZUVsZW1lbnQpOwogICAgICAgICAgICBib2R5Q2FsbElucHV0cy5hZGQoYXJndW1lbnQpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCFpc0N1c3RvbUVsZW1lbnQgJiYgLy8gVE9ETygxMzgzNik6IEZpeCBpbmxpbmluZy4KICAgICAgICAgICAgX3RyeUlubGluZU1ldGhvZChjb25zdHJ1Y3RvckJvZHksIG51bGwsIG51bGwsIGJvZHlDYWxsSW5wdXRzLCBudWxsLAogICAgICAgICAgICAgICAgbm9kZSwgc291cmNlSW5mb3JtYXRpb24pKSB7CiAgICAgICAgICBwb3AoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgX2ludm9rZUNvbnN0cnVjdG9yQm9keShib2R5LCBib2R5Q2FsbElucHV0cywKICAgICAgICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkRGVjbGFyYXRpb24oY29uc3RydWN0b3IpKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIGlmIChfaW5saW5pbmdTdGFjay5pc0VtcHR5KSB7CiAgICAgIGNsb3NlQW5kR290b0V4aXQoCiAgICAgICAgICBuZXcgSFJldHVybihhYnN0cmFjdFZhbHVlRG9tYWluLCBuZXdPYmplY3QsIHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICAgIGNsb3NlRnVuY3Rpb24oKTsKICAgIH0gZWxzZSB7CiAgICAgIGxvY2Fsc0hhbmRsZXIudXBkYXRlTG9jYWwoX3JldHVybkxvY2FsLCBuZXdPYmplY3QsCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pOwogICAgfQogIH0KCiAgc3RhdGljIGJvb2wgX2lzRW1wdHlTdGF0ZW1lbnQoaXIuU3RhdGVtZW50IGJvZHkpIHsKICAgIGlmIChib2R5IGlzIGlyLkVtcHR5U3RhdGVtZW50KSByZXR1cm4gdHJ1ZTsKICAgIGlmIChib2R5IGlzIGlyLkJsb2NrKSByZXR1cm4gYm9keS5zdGF0ZW1lbnRzLmV2ZXJ5KF9pc0VtcHR5U3RhdGVtZW50KTsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIHZvaWQgX2ludm9rZUNvbnN0cnVjdG9yQm9keShpci5Db25zdHJ1Y3RvciBjb25zdHJ1Y3RvciwKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cywgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIE1lbWJlckVudGl0eSBjb25zdHJ1Y3RvckJvZHkgPSBfZWxlbWVudE1hcC5nZXRDb25zdHJ1Y3RvckJvZHkoY29uc3RydWN0b3IpOwogICAgSEludm9rZUNvbnN0cnVjdG9yQm9keSBpbnZva2UgPSBuZXcgSEludm9rZUNvbnN0cnVjdG9yQm9keShjb25zdHJ1Y3RvckJvZHksCiAgICAgICAgaW5wdXRzLCBhYnN0cmFjdFZhbHVlRG9tYWluLm5vbk51bGxUeXBlLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBhZGQoaW52b2tlKTsKICB9CgogIC8vLyBTZXRzIGNvbnRleHQgZm9yIGdlbmVyYXRpbmcgY29kZSB0aGF0IGlzIHRoZSByZXN1bHQgb2YgaW5saW5pbmcKICAvLy8gW2lubGluZWRUYXJnZXRdLgogIGlubGluZWRGcm9tKE1lbWJlckVudGl0eSBpbmxpbmVkVGFyZ2V0LAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBjYWxsU291cmNlSW5mb3JtYXRpb24sIGYoKSkgewogICAgcmVwb3J0ZXIud2l0aEN1cnJlbnRFbGVtZW50KGlubGluZWRUYXJnZXQsICgpIHsKICAgICAgX2VudGVyRnJhbWUoaW5saW5lZFRhcmdldCwgY2FsbFNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgdmFyIHJlc3VsdCA9IGYoKTsKICAgICAgX2xlYXZlRnJhbWUoKTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0pOwogIH0KCiAgdm9pZCBfZW5zdXJlVHlwZVZhcmlhYmxlc0ZvckluaXRpYWxpemVycygKICAgICAgQ29uc3RydWN0b3JEYXRhIGNvbnN0cnVjdG9yRGF0YSwgQ2xhc3NFbnRpdHkgZW5jbG9zaW5nQ2xhc3MpIHsKICAgIGlmICghY29uc3RydWN0b3JEYXRhLmluY2x1ZGVkQ2xhc3Nlcy5hZGQoZW5jbG9zaW5nQ2xhc3MpKSByZXR1cm47CiAgICBpZiAocnRpTmVlZC5jbGFzc05lZWRzVHlwZUFyZ3VtZW50cyhlbmNsb3NpbmdDbGFzcykpIHsKICAgICAgLy8gSWYgW2VuY2xvc2luZ0NsYXNzXSBuZWVkcyBSVEksIHdlIGhhdmUgdG8gZ2l2ZSBhIHZhbHVlIHRvIGl0cyB0eXBlCiAgICAgIC8vIHBhcmFtZXRlcnMuIEZvciBhIHN1cGVyIGNvbnN0cnVjdG9yIGNhbGwsIHRoZSB0eXBlIGlzIHRoZSBzdXBlcnR5cGUKICAgICAgLy8gb2YgY3VycmVudCBjbGFzcy4gRm9yIGEgcmVkaXJlY3RpbmcgY29uc3RydWN0b3IsIHRoZSB0eXBlIGlzIHRoZQogICAgICAvLyBjdXJyZW50IHR5cGUuIFtMb2NhbHNIYW5kbGVyLnN1YnN0SW5Db250ZXh0XSB0YWtlcyBjYXJlIG9mIGJvdGguCiAgICAgIEludGVyZmFjZVR5cGUgdGhpc1R5cGUgPQogICAgICAgICAgX2VsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50LmdldFRoaXNUeXBlKGVuY2xvc2luZ0NsYXNzKTsKICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlID0gbG9jYWxzSGFuZGxlci5zdWJzdEluQ29udGV4dCh0aGlzVHlwZSk7CiAgICAgIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cyA9IHR5cGUudHlwZUFyZ3VtZW50czsKICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZVZhcmlhYmxlcyA9IHRoaXNUeXBlLnR5cGVBcmd1bWVudHM7CiAgICAgIGFzc2VydChhcmd1bWVudHMubGVuZ3RoID09IHR5cGVWYXJpYWJsZXMubGVuZ3RoKTsKICAgICAgSXRlcmF0b3I8RGFydFR5cGU+IHZhcmlhYmxlcyA9IHR5cGVWYXJpYWJsZXMuaXRlcmF0b3I7CiAgICAgIHR5cGUudHlwZUFyZ3VtZW50cy5mb3JFYWNoKChEYXJ0VHlwZSBhcmd1bWVudCkgewogICAgICAgIHZhcmlhYmxlcy5tb3ZlTmV4dCgpOwogICAgICAgIFR5cGVWYXJpYWJsZVR5cGUgdHlwZVZhcmlhYmxlID0gdmFyaWFibGVzLmN1cnJlbnQ7CiAgICAgICAgbG9jYWxzSGFuZGxlci51cGRhdGVMb2NhbCgKICAgICAgICAgICAgbG9jYWxzSGFuZGxlci5nZXRUeXBlVmFyaWFibGVBc0xvY2FsKHR5cGVWYXJpYWJsZSksCiAgICAgICAgICAgIHR5cGVCdWlsZGVyLmFuYWx5emVUeXBlQXJndW1lbnQoYXJndW1lbnQsIHNvdXJjZUVsZW1lbnQpKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICAvLy8gQ29sbGVjdHMgdGhlIHZhbHVlcyBmb3IgZmllbGQgaW5pdGlhbGl6ZXJzIGZvciB0aGUgZGlyZWN0IGZpZWxkcyBvZgogIC8vLyBbY2xhenpdLgogIHZvaWQgX2NvbGxlY3RGaWVsZFZhbHVlcyhpci5DbGFzcyBjbGF6eiwgQ29uc3RydWN0b3JEYXRhIGNvbnN0cnVjdG9yRGF0YSkgewogICAgQ2xhc3NFbnRpdHkgY2xzID0gX2VsZW1lbnRNYXAuZ2V0Q2xhc3MoY2xhenopOwogICAgX3dvcmxkQnVpbGRlci5mb3JFYWNoRGlyZWN0SW5zdGFuY2VGaWVsZChjbHMsIChGaWVsZEVudGl0eSBmaWVsZCwKICAgICAgICB7Ym9vbCBpc0VsaWRlZH0pIHsKICAgICAgX2Vuc3VyZVR5cGVWYXJpYWJsZXNGb3JJbml0aWFsaXplcnMoCiAgICAgICAgICBjb25zdHJ1Y3RvckRhdGEsIGZpZWxkLmVuY2xvc2luZ0NsYXNzKTsKCiAgICAgIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiA9IF9lbGVtZW50TWFwLmdldE1lbWJlckRlZmluaXRpb24oZmllbGQpOwogICAgICBpci5GaWVsZCBub2RlOwogICAgICBzd2l0Y2ggKGRlZmluaXRpb24ua2luZCkgewogICAgICAgIGNhc2UgTWVtYmVyS2luZC5yZWd1bGFyOgogICAgICAgICAgbm9kZSA9IGRlZmluaXRpb24ubm9kZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBmYWlsZWRBdChmaWVsZCwgIlVuZXhwZWN0ZWQgbWVtYmVyIGRlZmluaXRpb24gJGRlZmluaXRpb24uIik7CiAgICAgIH0KCiAgICAgIGJvb2wgaWdub3JlQWxsb2NhdG9yQW5hbHlzaXMgPSBmYWxzZTsKICAgICAgaWYgKG5hdGl2ZURhdGEuaXNOYXRpdmVPckV4dGVuZHNOYXRpdmUoY2xzKSkgewogICAgICAgIC8vIEBOYXRpdmUgY2xhc3NlcyBoYXZlICdmaWVsZHMnIHdoaWNoIGFyZSByZWFsbHkgZ2V0dGVycy9zZXR0ZXIuICBEbwogICAgICAgIC8vIG5vdCB0cnkgdG8gaW5pdGlhbGl6ZSBlLmcuICd0YWdOYW1lJy4KICAgICAgICBpZiAobmF0aXZlRGF0YS5pc05hdGl2ZUNsYXNzKGNscykpIHJldHVybjsKICAgICAgICAvLyBGaWVsZHMgdGhhdCBzdXJ2aXZlIHRoaXMgdGVzdCBhcmUgZmllbGRzIG9mIGN1c3RvbSBlbGVtZW50cy4KICAgICAgICBpZ25vcmVBbGxvY2F0b3JBbmFseXNpcyA9IHRydWU7CiAgICAgIH0KCiAgICAgIGlmIChpZ25vcmVBbGxvY2F0b3JBbmFseXNpcyB8fAogICAgICAgICAgIV9maWVsZEFuYWx5c2lzLmdldEZpZWxkRGF0YShmaWVsZCkuaXNJbml0aWFsaXplZEluQWxsb2NhdG9yKSB7CiAgICAgICAgaWYgKG5vZGUuaW5pdGlhbGl6ZXIgPT0gbnVsbCkgewogICAgICAgICAgY29uc3RydWN0b3JEYXRhLmZpZWxkVmFsdWVzW2ZpZWxkXSA9CiAgICAgICAgICAgICAgZ3JhcGguYWRkQ29uc3RhbnROdWxsKGNsb3NlZFdvcmxkKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gQ29tcGlsZSB0aGUgaW5pdGlhbGl6ZXIgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGZpZWxkIHNvIHdlIGtub3cgdGhhdAogICAgICAgICAgLy8gY2xhc3MgdHlwZSBwYXJhbWV0ZXJzIGFyZSBhY2Nlc3NlZCBhcyB2YWx1ZXMuCiAgICAgICAgICAvLyBUT0RPKHNyYSk6IEl0IHdvdWxkIGJlIHN1ZmZpY2llbnQgdG8ga25vdyB0aGUgY29udGV4dCB3YXMgYSBmaWVsZAogICAgICAgICAgLy8gaW5pdGlhbGl6ZXIuCiAgICAgICAgICBpbmxpbmVkRnJvbShmaWVsZCwKICAgICAgICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkQXNzaWdubWVudChub2RlLmluaXRpYWxpemVyKSwgKCkgewogICAgICAgICAgICBub2RlLmluaXRpYWxpemVyLmFjY2VwdCh0aGlzKTsKICAgICAgICAgICAgY29uc3RydWN0b3JEYXRhLmZpZWxkVmFsdWVzW2ZpZWxkXSA9IHBvcCgpOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9CgogIHN0YXRpYyBib29sIGlzUmVkaXJlY3RpbmdDb25zdHJ1Y3Rvcihpci5Db25zdHJ1Y3RvciBjb25zdHJ1Y3RvcikgPT4KICAgICAgY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzCiAgICAgICAgICAuYW55KChpbml0aWFsaXplcikgPT4gaW5pdGlhbGl6ZXIgaXMgaXIuUmVkaXJlY3RpbmdJbml0aWFsaXplcik7CgogIC8vLyBDb2xsZWN0cyBmaWVsZCBpbml0aWFsaXplcnMgYWxsIHRoZSB3YXkgdXAgdGhlIGluaGVyaXRhbmNlIGNoYWluLgogIHZvaWQgX2J1aWxkSW5pdGlhbGl6ZXJzKAogICAgICBpci5Db25zdHJ1Y3RvciBjb25zdHJ1Y3RvciwgQ29uc3RydWN0b3JEYXRhIGNvbnN0cnVjdG9yRGF0YSkgewogICAgYXNzZXJ0KAogICAgICAgIF9lbGVtZW50TWFwLmdldENvbnN0cnVjdG9yKGNvbnN0cnVjdG9yKSA9PSBsb2NhbHNNYXAuY3VycmVudE1lbWJlciwKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgbG9jYWxzTWFwLmN1cnJlbnRNZW1iZXIsCiAgICAgICAgICAgICdFeHBlY3RlZCAke2xvY2Fsc01hcC5jdXJyZW50TWVtYmVyfSAnCiAgICAgICAgICAgICdidXQgZm91bmQgJHtfZWxlbWVudE1hcC5nZXRDb25zdHJ1Y3Rvcihjb25zdHJ1Y3Rvcil9LicpKTsKICAgIGNvbnN0cnVjdG9yRGF0YS5jb25zdHJ1Y3RvckNoYWluLmFkZChjb25zdHJ1Y3Rvcik7CgogICAgaWYgKCFpc1JlZGlyZWN0aW5nQ29uc3RydWN0b3IoY29uc3RydWN0b3IpKSB7CiAgICAgIC8vIENvbXB1dGUgdmFsdWVzIGZvciBmaWVsZCBpbml0aWFsaXplcnMsIGJ1dCBvbmx5IGlmIHRoaXMgaXMgbm90IGEKICAgICAgLy8gcmVkaXJlY3RpbmcgY29uc3RydWN0b3IsIHNpbmNlIHRoZSB0YXJnZXQgd2lsbCBjb21wdXRlIHRoZSBmaWVsZHMuCiAgICAgIF9jb2xsZWN0RmllbGRWYWx1ZXMoY29uc3RydWN0b3IuZW5jbG9zaW5nQ2xhc3MsIGNvbnN0cnVjdG9yRGF0YSk7CiAgICB9CiAgICB2YXIgZm91bmRTdXBlck9yUmVkaXJlY3RDYWxsID0gZmFsc2U7CiAgICBmb3IgKHZhciBpbml0aWFsaXplciBpbiBjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnMpIHsKICAgICAgaWYgKGluaXRpYWxpemVyIGlzIGlyLkZpZWxkSW5pdGlhbGl6ZXIpIHsKICAgICAgICBGaWVsZEVudGl0eSBmaWVsZCA9IF9lbGVtZW50TWFwLmdldEZpZWxkKGluaXRpYWxpemVyLmZpZWxkKTsKICAgICAgICBpZiAoIV9maWVsZEFuYWx5c2lzLmdldEZpZWxkRGF0YShmaWVsZCkuaXNJbml0aWFsaXplZEluQWxsb2NhdG9yKSB7CiAgICAgICAgICBpbml0aWFsaXplci52YWx1ZS5hY2NlcHQodGhpcyk7CiAgICAgICAgICBjb25zdHJ1Y3RvckRhdGEuZmllbGRWYWx1ZXNbZmllbGRdID0gcG9wKCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGluaXRpYWxpemVyIGlzIGlyLlN1cGVySW5pdGlhbGl6ZXIpIHsKICAgICAgICBhc3NlcnQoIWZvdW5kU3VwZXJPclJlZGlyZWN0Q2FsbCk7CiAgICAgICAgZm91bmRTdXBlck9yUmVkaXJlY3RDYWxsID0gdHJ1ZTsKICAgICAgICBfaW5saW5lU3VwZXJJbml0aWFsaXplcihpbml0aWFsaXplciwgY29uc3RydWN0b3JEYXRhLCBjb25zdHJ1Y3Rvcik7CiAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbGl6ZXIgaXMgaXIuUmVkaXJlY3RpbmdJbml0aWFsaXplcikgewogICAgICAgIGFzc2VydCghZm91bmRTdXBlck9yUmVkaXJlY3RDYWxsKTsKICAgICAgICBmb3VuZFN1cGVyT3JSZWRpcmVjdENhbGwgPSB0cnVlOwogICAgICAgIF9pbmxpbmVSZWRpcmVjdGluZ0luaXRpYWxpemVyKAogICAgICAgICAgICBpbml0aWFsaXplciwgY29uc3RydWN0b3JEYXRhLCBjb25zdHJ1Y3Rvcik7CiAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbGl6ZXIgaXMgaXIuTG9jYWxJbml0aWFsaXplcikgewogICAgICAgIC8vIExvY2FsSW5pdGlhbGl6ZXIgaXMgbGlrZSBhIGxldC1leHByZXNzaW9uIHRoYXQgaXMgaW4gc2NvcGUgZm9yIHRoZQogICAgICAgIC8vIHJlc3Qgb2YgdGhlIGluaXRpYWxpemVycy4KICAgICAgICBpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gaW5pdGlhbGl6ZXIudmFyaWFibGU7CiAgICAgICAgYXNzZXJ0KHZhcmlhYmxlLmlzRmluYWwpOwogICAgICAgIHZhcmlhYmxlLmluaXRpYWxpemVyLmFjY2VwdCh0aGlzKTsKICAgICAgICBISW5zdHJ1Y3Rpb24gdmFsdWUgPSBwb3AoKTsKICAgICAgICAvLyBUT0RPKHNyYSk6IEFwcGx5IGluZmVycmVkIHR5cGUgaW5mb3JtYXRpb24uCiAgICAgICAgbGV0QmluZGluZ3NbdmFyaWFibGVdID0gdmFsdWU7CiAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbGl6ZXIgaXMgaXIuQXNzZXJ0SW5pdGlhbGl6ZXIpIHsKICAgICAgICAvLyBBc3NlcnQgaW4gaW5pdGlhbGl6ZXIgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgaW4gZGFydDJqcy4KICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTdXBwb3J0IGFzc2VydCBpbiBpbml0aWFsaXplci4KICAgICAgfSBlbHNlIGlmIChpbml0aWFsaXplciBpcyBpci5JbnZhbGlkSW5pdGlhbGl6ZXIpIHsKICAgICAgICBhc3NlcnQoZmFsc2UsICdpci5JbnZhbGlkSW5pdGlhbGl6ZXIgbm90IGhhbmRsZWQnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQoZmFsc2UsICdVbmhhbmRsZWQgaW5pdGlhbGl6ZXIgaXIuJHtpbml0aWFsaXplci5ydW50aW1lVHlwZX0nKTsKICAgICAgfQogICAgfQoKICAgIGlmICghZm91bmRTdXBlck9yUmVkaXJlY3RDYWxsKSB7CiAgICAgIGFzc2VydCgKICAgICAgICAgIF9lbGVtZW50TWFwLmdldENsYXNzKGNvbnN0cnVjdG9yLmVuY2xvc2luZ0NsYXNzKSA9PQogICAgICAgICAgICAgICAgICBfZWxlbWVudE1hcC5jb21tb25FbGVtZW50cy5vYmplY3RDbGFzcyB8fAogICAgICAgICAgICAgIGNvbnN0cnVjdG9yLmluaXRpYWxpemVycy5hbnkoX0Vycm9uZW91c0luaXRpYWxpemVyVmlzaXRvci5jaGVjayksCiAgICAgICAgICAnQWxsIGNvbnN0cnVjdG9ycyBzaG91bGQgaGF2ZSBzdXBlci0gb3IgcmVkaXJlY3RpbmctIGluaXRpYWxpemVycywnCiAgICAgICAgICAnIGV4Y2VwdCBPYmplY3QoKScKICAgICAgICAgICcgJHtjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnN9Jyk7CiAgICB9CiAgfQoKICBMaXN0PEhJbnN0cnVjdGlvbj4gX25vcm1hbGl6ZUFuZEJ1aWxkQXJndW1lbnRzKAogICAgICBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb24sIGlyLkFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHZhciBidWlsdEFyZ3VtZW50cyA9IDxISW5zdHJ1Y3Rpb24+W107CiAgICB2YXIgcG9zaXRpb25hbEluZGV4ID0gMDsKICAgIGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmZvckVhY2goKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgICBpZiAocG9zaXRpb25hbEluZGV4IDwgYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoKSB7CiAgICAgICAgYXJndW1lbnRzLnBvc2l0aW9uYWxbcG9zaXRpb25hbEluZGV4KytdLmFjY2VwdCh0aGlzKTsKICAgICAgICBidWlsdEFyZ3VtZW50cy5hZGQocG9wKCkpOwogICAgICB9IGVsc2UgewogICAgICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnRWYWx1ZSA9CiAgICAgICAgICAgIF9lbGVtZW50TWFwLmdldENvbnN0YW50VmFsdWUobm9kZS5pbml0aWFsaXplciwgaW1wbGljaXROdWxsOiB0cnVlKTsKICAgICAgICBhc3NlcnQoCiAgICAgICAgICAgIGNvbnN0YW50VmFsdWUgIT0gbnVsbCwKICAgICAgICAgICAgZmFpbGVkQXQoX2VsZW1lbnRNYXAuZ2V0TWV0aG9kKGZ1bmN0aW9uLnBhcmVudCksCiAgICAgICAgICAgICAgICAnTm8gY29uc3RhbnQgY29tcHV0ZWQgZm9yICRub2RlJykpOwogICAgICAgIGJ1aWx0QXJndW1lbnRzLmFkZChncmFwaC5hZGRDb25zdGFudChjb25zdGFudFZhbHVlLCBjbG9zZWRXb3JsZCkpOwogICAgICB9CiAgICB9KTsKICAgIGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycy50b0xpc3QoKQogICAgICAuLnNvcnQobmFtZWRPcmRlcmluZykKICAgICAgLi5mb3JFYWNoKChpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgICAgICB2YXIgY29ycmVzcG9uZGluZ05hbWVkID0gYXJndW1lbnRzLm5hbWVkCiAgICAgICAgICAgIC5maXJzdFdoZXJlKChuYW1lZCkgPT4gbmFtZWQubmFtZSA9PSBub2RlLm5hbWUsIG9yRWxzZTogKCkgPT4gbnVsbCk7CiAgICAgICAgaWYgKGNvcnJlc3BvbmRpbmdOYW1lZCAhPSBudWxsKSB7CiAgICAgICAgICBjb3JyZXNwb25kaW5nTmFtZWQudmFsdWUuYWNjZXB0KHRoaXMpOwogICAgICAgICAgYnVpbHRBcmd1bWVudHMuYWRkKHBvcCgpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgQ29uc3RhbnRWYWx1ZSBjb25zdGFudFZhbHVlID0gX2VsZW1lbnRNYXAKICAgICAgICAgICAgICAuZ2V0Q29uc3RhbnRWYWx1ZShub2RlLmluaXRpYWxpemVyLCBpbXBsaWNpdE51bGw6IHRydWUpOwogICAgICAgICAgYXNzZXJ0KAogICAgICAgICAgICAgIGNvbnN0YW50VmFsdWUgIT0gbnVsbCwKICAgICAgICAgICAgICBmYWlsZWRBdChfZWxlbWVudE1hcC5nZXRNZXRob2QoZnVuY3Rpb24ucGFyZW50KSwKICAgICAgICAgICAgICAgICAgJ05vIGNvbnN0YW50IGNvbXB1dGVkIGZvciAkbm9kZScpKTsKICAgICAgICAgIGJ1aWx0QXJndW1lbnRzLmFkZChncmFwaC5hZGRDb25zdGFudChjb25zdGFudFZhbHVlLCBjbG9zZWRXb3JsZCkpOwogICAgICAgIH0KICAgICAgfSk7CgogICAgcmV0dXJuIGJ1aWx0QXJndW1lbnRzOwogIH0KCiAgLy8vIElubGluZXMgdGhlIGdpdmVuIHJlZGlyZWN0aW5nIFtjb25zdHJ1Y3Rvcl0ncyBpbml0aWFsaXplcnMgYnkgY29sbGVjdGluZwogIC8vLyBpdHMgZmllbGQgdmFsdWVzIGFuZCBidWlsZGluZyBpdHMgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXJzLiBXZSB2aXNpdCBzdXBlcgogIC8vLyBjb25zdHJ1Y3RvcnMgYWxsIHRoZSB3YXkgdXAgdG8gdGhlIFtPYmplY3RdIGNvbnN0cnVjdG9yLgogIHZvaWQgX2lubGluZVJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIoaXIuUmVkaXJlY3RpbmdJbml0aWFsaXplciBpbml0aWFsaXplciwKICAgICAgQ29uc3RydWN0b3JEYXRhIGNvbnN0cnVjdG9yRGF0YSwgaXIuQ29uc3RydWN0b3IgY2FsbGVyKSB7CiAgICB2YXIgc3VwZXJPclJlZGlyZWN0Q29uc3RydWN0b3IgPSBpbml0aWFsaXplci50YXJnZXQ7CiAgICB2YXIgYXJndW1lbnRzID0gX25vcm1hbGl6ZUFuZEJ1aWxkQXJndW1lbnRzKAogICAgICAgIHN1cGVyT3JSZWRpcmVjdENvbnN0cnVjdG9yLmZ1bmN0aW9uLCBpbml0aWFsaXplci5hcmd1bWVudHMpOwoKICAgIC8vIFJlZGlyZWN0aW5nIGluaXRpYWxpemVyIGFscmVhZHkgaGFzIFtsb2NhbHNIYW5kbGVyXSBiaW5kaW5ncyBmb3IgdHlwZQogICAgLy8gcGFyYW1ldGVycyBmcm9tIHRoZSByZWRpcmVjdGluZyBjb25zdHJ1Y3Rvci4KCiAgICAvLyBGb3IgcmVkaXJlY3RpbmcgY29uc3RydWN0b3JzLCB0aGUgZmllbGRzIHdpbGwgYmUgaW5pdGlhbGl6ZWQgbGF0ZXIgYnkgdGhlCiAgICAvLyBlZmZlY3RpdmUgdGFyZ2V0LCBzbyB3ZSBkb24ndCBkbyBpdCBoZXJlLgoKICAgIF9pbmxpbmVTdXBlck9yUmVkaXJlY3RDb21tb24oaW5pdGlhbGl6ZXIsIHN1cGVyT3JSZWRpcmVjdENvbnN0cnVjdG9yLAogICAgICAgIGFyZ3VtZW50cywgY29uc3RydWN0b3JEYXRhLCBjYWxsZXIpOwogIH0KCiAgLy8vIElubGluZXMgdGhlIGdpdmVuIHN1cGVyIFtjb25zdHJ1Y3Rvcl0ncyBpbml0aWFsaXplcnMgYnkgY29sbGVjdGluZyBpdHMKICAvLy8gZmllbGQgdmFsdWVzIGFuZCBidWlsZGluZyBpdHMgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXJzLiBXZSB2aXNpdCBzdXBlcgogIC8vLyBjb25zdHJ1Y3RvcnMgYWxsIHRoZSB3YXkgdXAgdG8gdGhlIFtPYmplY3RdIGNvbnN0cnVjdG9yLgogIHZvaWQgX2lubGluZVN1cGVySW5pdGlhbGl6ZXIoaXIuU3VwZXJJbml0aWFsaXplciBpbml0aWFsaXplciwKICAgICAgQ29uc3RydWN0b3JEYXRhIGNvbnN0cnVjdG9yRGF0YSwgaXIuQ29uc3RydWN0b3IgY2FsbGVyKSB7CiAgICB2YXIgdGFyZ2V0ID0gaW5pdGlhbGl6ZXIudGFyZ2V0OwogICAgdmFyIGFyZ3VtZW50cyA9CiAgICAgICAgX25vcm1hbGl6ZUFuZEJ1aWxkQXJndW1lbnRzKHRhcmdldC5mdW5jdGlvbiwgaW5pdGlhbGl6ZXIuYXJndW1lbnRzKTsKCiAgICBpci5DbGFzcyBjYWxsZXJDbGFzcyA9IGNhbGxlci5lbmNsb3NpbmdDbGFzczsKICAgIGlyLlN1cGVydHlwZSBzdXBlcnR5cGUgPSBjYWxsZXJDbGFzcy5zdXBlcnR5cGU7CgogICAgLy8gVGhlIGNsYXNzIG9mIHRoZSBzdXBlci1jb25zdHJ1Y3RvciBtYXkgbm90IGJlIHRoZSBzdXBlcnR5cGUgY2xhc3MuIEluCiAgICAvLyB0aGlzIGNhc2UsIHdlIG11c3QgZ28gdXAgdGhlIGNsYXNzIGhpZXJhcmNoeSB1bnRpbCB3ZSByZWFjaCB0aGUgY2xhc3MKICAgIC8vIGNvbnRhaW5pbmcgdGhlIHN1cGVyLWNvbnN0cnVjdG9yLgogICAgd2hpbGUgKHN1cGVydHlwZS5jbGFzc05vZGUgIT0gdGFyZ2V0LmVuY2xvc2luZ0NsYXNzKSB7CiAgICAgIC8vIEZpZWxkcyBmcm9tIHVubmFtZWQgbWl4aW4gYXBwbGljYXRpb24gY2xhc3NlcyAoaWUgT2JqZWN0JkZvbykgZ2V0CiAgICAgIC8vICJjb2xsZWN0ZWQiIHdpdGggdGhlIHJlZ3VsYXIgc3VwZXJ0eXBlIGZpZWxkcywgc28gd2UgbXVzdCBiaW5kIHR5cGUKICAgICAgLy8gcGFyYW1ldGVycyBmcm9tIGJvdGggdGhlIHN1cGVydHlwZSBhbmQgdGhlIHN1cGVydHlwZSdzIG1peGluIGNsYXNzZXMKICAgICAgLy8gYmVmb3JlIGNvbGxlY3RpbmcgdGhlIGZpZWxkIHZhbHVlcy4KICAgICAgX2NvbGxlY3RGaWVsZFZhbHVlcyhzdXBlcnR5cGUuY2xhc3NOb2RlLCBjb25zdHJ1Y3RvckRhdGEpOwogICAgICBzdXBlcnR5cGUgPSBzdXBlcnR5cGUuY2xhc3NOb2RlLnN1cGVydHlwZTsKICAgIH0KICAgIHN1cGVydHlwZSA9IHN1cGVydHlwZS5jbGFzc05vZGUuc3VwZXJ0eXBlOwoKICAgIF9pbmxpbmVTdXBlck9yUmVkaXJlY3RDb21tb24oCiAgICAgICAgaW5pdGlhbGl6ZXIsIHRhcmdldCwgYXJndW1lbnRzLCBjb25zdHJ1Y3RvckRhdGEsIGNhbGxlcik7CiAgfQoKICB2b2lkIF9pbmxpbmVTdXBlck9yUmVkaXJlY3RDb21tb24oCiAgICAgIGlyLkluaXRpYWxpemVyIGluaXRpYWxpemVyLAogICAgICBpci5Db25zdHJ1Y3RvciBjb25zdHJ1Y3RvciwKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGFyZ3VtZW50cywKICAgICAgQ29uc3RydWN0b3JEYXRhIGNvbnN0cnVjdG9yRGF0YSwKICAgICAgaXIuQ29uc3RydWN0b3IgY2FsbGVyKSB7CiAgICB2YXIgaW5kZXggPSAwOwoKICAgIENvbnN0cnVjdG9yRW50aXR5IGVsZW1lbnQgPSBfZWxlbWVudE1hcC5nZXRDb25zdHJ1Y3Rvcihjb25zdHJ1Y3Rvcik7CiAgICBTY29wZUluZm8gb2xkU2NvcGVJbmZvID0gbG9jYWxzSGFuZGxlci5zY29wZUluZm87CgogICAgaW5saW5lZEZyb20oCiAgICAgICAgZWxlbWVudCwgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZENhbGwoaW5pdGlhbGl6ZXIsIGluaXRpYWxpemVyKSwKICAgICAgICAoKSB7CiAgICAgIHZvaWQgaGFuZGxlUGFyYW1ldGVyKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgICAgIExvY2FsIHBhcmFtZXRlciA9IGxvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKG5vZGUpOwogICAgICAgIEhJbnN0cnVjdGlvbiBhcmd1bWVudCA9IGFyZ3VtZW50c1tpbmRleCsrXTsKICAgICAgICAvLyBCZWNhdXNlIHdlIGFyZSBpbmxpbmluZyB0aGUgaW5pdGlhbGl6ZXIsIHdlIG11c3QgdXBkYXRlCiAgICAgICAgLy8gd2hhdCB3YXMgZ2l2ZW4gYXMgcGFyYW1ldGVyLiBUaGlzIHdpbGwgYmUgdXNlZCBpbiBjYXNlCiAgICAgICAgLy8gdGhlcmUgaXMgYSBwYXJhbWV0ZXIgY2hlY2sgZXhwcmVzc2lvbiBpbiB0aGUgaW5pdGlhbGl6ZXIuCiAgICAgICAgcGFyYW1ldGVyc1twYXJhbWV0ZXJdID0gYXJndW1lbnQ7CiAgICAgICAgbG9jYWxzSGFuZGxlci51cGRhdGVMb2NhbChwYXJhbWV0ZXIsIGFyZ3VtZW50KTsKICAgICAgfQoKICAgICAgY29uc3RydWN0b3IuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMuZm9yRWFjaChoYW5kbGVQYXJhbWV0ZXIpOwogICAgICBjb25zdHJ1Y3Rvci5mdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMudG9MaXN0KCkKICAgICAgICAuLnNvcnQobmFtZWRPcmRlcmluZykKICAgICAgICAuLmZvckVhY2goaGFuZGxlUGFyYW1ldGVyKTsKCiAgICAgIF9lbnN1cmVUeXBlVmFyaWFibGVzRm9ySW5pdGlhbGl6ZXJzKAogICAgICAgICAgY29uc3RydWN0b3JEYXRhLCBlbGVtZW50LmVuY2xvc2luZ0NsYXNzKTsKCiAgICAgIC8vIFNldCB0aGUgbG9jYWxzIGhhbmRsZXIgc3RhdGUgYXMgaWYgd2Ugd2VyZSBpbmxpbmluZyB0aGUgY29uc3RydWN0b3IuCiAgICAgIFNjb3BlSW5mbyBuZXdTY29wZUluZm8gPSBjbG9zdXJlRGF0YUxvb2t1cC5nZXRTY29wZUluZm8oZWxlbWVudCk7CiAgICAgIGxvY2Fsc0hhbmRsZXIuc2NvcGVJbmZvID0gbmV3U2NvcGVJbmZvOwogICAgICBsb2NhbHNIYW5kbGVyLmVudGVyU2NvcGUoY2xvc3VyZURhdGFMb29rdXAuZ2V0Q2FwdHVyZWRTY29wZShlbGVtZW50KSwKICAgICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGREZWNsYXJhdGlvbihlbGVtZW50KSk7CiAgICAgIF9idWlsZEluaXRpYWxpemVycyhjb25zdHJ1Y3RvciwgY29uc3RydWN0b3JEYXRhKTsKICAgIH0pOwogICAgbG9jYWxzSGFuZGxlci5zY29wZUluZm8gPSBvbGRTY29wZUluZm87CiAgfQoKICAvLy8gQ29uc3RydWN0cyBhIHNwZWNpYWwgc2lnbmF0dXJlIGZ1bmN0aW9uIGZvciBhIGNsb3N1cmUuIEl0IGlzIHVuaXF1ZSBpbgogIC8vLyB0aGF0IG5vIGNvcnJlc3BvbmRpbmcgaXIuTm9kZSBhY3R1YWxseSBleGlzdHMgZm9yIGl0LiBXZSBqdXN0IHVzZSB0aGUKICAvLy8gdGFyZ2V0RWxlbWVudC4KICB2b2lkIGJ1aWxkTWV0aG9kU2lnbmF0dXJlKGlyLkZ1bmN0aW9uTm9kZSBvcmlnaW5hbENsb3N1cmVOb2RlKSB7CiAgICBvcGVuRnVuY3Rpb24odGFyZ2V0RWxlbWVudCk7CiAgICBMaXN0PEhJbnN0cnVjdGlvbj4gdHlwZUFyZ3VtZW50cyA9IDxISW5zdHJ1Y3Rpb24+W107CgogICAgLy8gQWRkIGZ1bmN0aW9uIHR5cGUgdmFyaWFibGVzLgogICAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZSA9CiAgICAgICAgX2VsZW1lbnRNYXAuZ2V0RnVuY3Rpb25UeXBlKG9yaWdpbmFsQ2xvc3VyZU5vZGUpOwogICAgZnVuY3Rpb25UeXBlLmZvckVhY2hUeXBlVmFyaWFibGUoKFR5cGVWYXJpYWJsZVR5cGUgdHlwZVZhcmlhYmxlVHlwZSkgewogICAgICBEYXJ0VHlwZSByZXN1bHQgPSBsb2NhbHNIYW5kbGVyLnN1YnN0SW5Db250ZXh0KHR5cGVWYXJpYWJsZVR5cGUpOwogICAgICBISW5zdHJ1Y3Rpb24gYXJndW1lbnQgPQogICAgICAgICAgdHlwZUJ1aWxkZXIuYW5hbHl6ZVR5cGVBcmd1bWVudChyZXN1bHQsIHNvdXJjZUVsZW1lbnQpOwogICAgICB0eXBlQXJndW1lbnRzLmFkZChhcmd1bWVudCk7CiAgICB9KTsKICAgIHB1c2gobmV3IEhUeXBlSW5mb0V4cHJlc3Npb24oCiAgICAgICAgVHlwZUluZm9FeHByZXNzaW9uS2luZC5DT01QTEVURSwKICAgICAgICBfZWxlbWVudE1hcC5nZXRGdW5jdGlvblR5cGUob3JpZ2luYWxDbG9zdXJlTm9kZSksCiAgICAgICAgdHlwZUFyZ3VtZW50cywKICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmZ1bmN0aW9uVHlwZSkpOwogICAgSEluc3RydWN0aW9uIHZhbHVlID0gcG9wKCk7CiAgICBjbG9zZShuZXcgSFJldHVybihhYnN0cmFjdFZhbHVlRG9tYWluLCB2YWx1ZSwKICAgICAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZFJldHVybihvcmlnaW5hbENsb3N1cmVOb2RlKSkpCiAgICAgICAgLmFkZFN1Y2Nlc3NvcihncmFwaC5leGl0KTsKCiAgICBjbG9zZUZ1bmN0aW9uKCk7CiAgfQoKICAvLy8gQnVpbGRzIGdlbmVyYXRpdmUgY29uc3RydWN0b3IgYm9keS4KICB2b2lkIGJ1aWxkQ29uc3RydWN0b3JCb2R5KGlyLkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yKSB7CiAgICBGdW5jdGlvbkVudGl0eSBjb25zdHJ1Y3RvckJvZHkgPQogICAgICAgIF9lbGVtZW50TWFwLmdldENvbnN0cnVjdG9yQm9keShjb25zdHJ1Y3Rvcik7CiAgICBvcGVuRnVuY3Rpb24oY29uc3RydWN0b3JCb2R5LAogICAgICAgIGZ1bmN0aW9uTm9kZTogY29uc3RydWN0b3IuZnVuY3Rpb24sCiAgICAgICAgcGFyYW1ldGVyU3RydWN0dXJlOiBjb25zdHJ1Y3RvckJvZHkucGFyYW1ldGVyU3RydWN0dXJlLAogICAgICAgIGNoZWNrczogVGFyZ2V0Q2hlY2tzLm5vbmUpOwogICAgY29uc3RydWN0b3IuZnVuY3Rpb24uYm9keS5hY2NlcHQodGhpcyk7CiAgICBjbG9zZUZ1bmN0aW9uKCk7CiAgfQoKICAvLy8gQnVpbGRzIGEgU1NBIGdyYXBoIGZvciBGdW5jdGlvbk5vZGVzLCBmb3VuZCBpbiBGdW5jdGlvbkV4cHJlc3Npb25zIGFuZAogIC8vLyBQcm9jZWR1cmVzLgogIHZvaWQgYnVpbGRGdW5jdGlvbk5vZGUoCiAgICAgIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uLCBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb25Ob2RlKSB7CiAgICBpZiAoZnVuY3Rpb25Ob2RlLmFzeW5jTWFya2VyICE9IGlyLkFzeW5jTWFya2VyLlN5bmMpIHsKICAgICAgYnVpbGRHZW5lcmF0b3IoZnVuY3Rpb24sIGZ1bmN0aW9uTm9kZSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBUT0RPKHNyYSk6IFN0YXRpYyBtZXRob2RzIHdpdGggbm8gdGVhci1vZmYgY2FuIGJlIGdlbmVyYXRlZCB3aXRoIG5vCiAgICAvLyBjaGVja3MuCiAgICAvLyBUT0RPKHNyYSk6IEluc3RhbmNlIG1ldGhvZHMgY2FuIGJlIGdlbmVyYXRlZCB3aXRoIHJlZHVjZWQgY2hlY2tzIGlmCiAgICAvLyBjYWxsZWQgb25seSBmcm9tIG5vbi1keW5hbWljIGNhbGwtc2l0ZXMuCiAgICBvcGVuRnVuY3Rpb24oZnVuY3Rpb24sCiAgICAgICAgZnVuY3Rpb25Ob2RlOiBmdW5jdGlvbk5vZGUsCiAgICAgICAgcGFyYW1ldGVyU3RydWN0dXJlOiBmdW5jdGlvbi5wYXJhbWV0ZXJTdHJ1Y3R1cmUpOwoKICAgIC8vIElmIFtmdW5jdGlvbk5vZGVdIGlzIGBvcGVyYXRvcj09YCB3ZSBleHBsaWNpdGx5IGFkZCBhIG51bGwgY2hlY2sgYXQgdGhlCiAgICAvLyBiZWdpbm5pbmcgb2YgdGhlIG1ldGhvZC4gVGhpcyBpcyB0byBhdm9pZCBoYXZpbmcgY2FsbCBzaXRlcyBkbyB0aGUgbnVsbAogICAgLy8gY2hlY2suCiAgICBpZiAoZnVuY3Rpb24ubmFtZSA9PSAnPT0nKSB7CiAgICAgIGlmICghX2NvbW1vbkVsZW1lbnRzLm9wZXJhdG9yRXFIYW5kbGVzTnVsbEFyZ3VtZW50KGZ1bmN0aW9uKSkgewogICAgICAgIGhhbmRsZUlmKAogICAgICAgICAgICB2aXNpdENvbmRpdGlvbjogKCkgewogICAgICAgICAgICAgIEhQYXJhbWV0ZXJWYWx1ZSBwYXJhbWV0ZXIgPSBwYXJhbWV0ZXJzLnZhbHVlcy5maXJzdDsKICAgICAgICAgICAgICBwdXNoKG5ldyBISWRlbnRpdHkocGFyYW1ldGVyLCBncmFwaC5hZGRDb25zdGFudE51bGwoY2xvc2VkV29ybGQpLAogICAgICAgICAgICAgICAgICBudWxsLCBhYnN0cmFjdFZhbHVlRG9tYWluLmJvb2xUeXBlKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHZpc2l0VGhlbjogKCkgewogICAgICAgICAgICAgIGNsb3NlQW5kR290b0V4aXQobmV3IEhSZXR1cm4oCiAgICAgICAgICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4sCiAgICAgICAgICAgICAgICAgIGdyYXBoLmFkZENvbnN0YW50Qm9vbChmYWxzZSwgY2xvc2VkV29ybGQpLAogICAgICAgICAgICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkUmV0dXJuKGZ1bmN0aW9uTm9kZSkpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdmlzaXRFbHNlOiBudWxsLAogICAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZElmKGZ1bmN0aW9uTm9kZSkpOwogICAgICB9CiAgICB9CiAgICBpZiAoY29uc3QgYm9vbC5mcm9tRW52aXJvbm1lbnQoJ3VucmVhY2hhYmxlLXRocm93JykpIHsKICAgICAgdmFyIGVtcHR5UGFyYW1ldGVycyA9IHBhcmFtZXRlcnMudmFsdWVzLndoZXJlKChwKSA9PgogICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5pc0VtcHR5KHAuaW5zdHJ1Y3Rpb25UeXBlKS5pc0RlZmluaXRlbHlUcnVlKTsKICAgICAgaWYgKGVtcHR5UGFyYW1ldGVycy5sZW5ndGggPiAwKSB7CiAgICAgICAgYWRkQ29tbWVudCgnJHtlbXB0eVBhcmFtZXRlcnN9IGluZmVycmVkIGFzIFtlbXB0eV0nKTsKICAgICAgICBhZGQobmV3IEhJbnZva2VTdGF0aWMoCiAgICAgICAgICAgIGNvbW1vbkVsZW1lbnRzLmFzc2VydFVucmVhY2hhYmxlTWV0aG9kLAogICAgICAgICAgICA8SEluc3RydWN0aW9uPltdLAogICAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlLAogICAgICAgICAgICBjb25zdCA8RGFydFR5cGU+W10pKTsKICAgICAgICBjbG9zZUZ1bmN0aW9uKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbk5vZGUuYm9keS5hY2NlcHQodGhpcyk7CiAgICBjbG9zZUZ1bmN0aW9uKCk7CiAgfQoKICAvLy8gQWRkcyBhIEphdmFTY3JpcHQgY29tbWVudCB0byB0aGUgb3V0cHV0LiBUaGUgY29tbWVudCB3aWxsIGJlIG9taXR0ZWQgaW4KICAvLy8gbWluaWZpZWQgbW9kZS4gIEVhY2ggbGluZSBpbiBbdGV4dF0gaXMgcHJlY2VkZWQgd2l0aCBgLy9gIGFuZCBpbmRlbnRlZC4KICAvLy8gVXNlIHNwYXJpbmdseS4gSW4gb3JkZXIgZm9yIHRoZSBjb21tZW50IHRvIGJlIHJldGFpbmVkIGl0IGlzIG1vZGVsZWQgYXMKICAvLy8gaGF2aW5nIHNpZGUgZWZmZWN0cyB3aGljaCB3aWxsIGluaGliaXQgY29kZSBtb3Rpb24uCiAgLy8gVE9ETyhzcmEpOiBGaWd1cmUgb3V0IGhvdyB0byBrZWVwIGNvbW1lbnQgYW5jaG9yZWQgd2l0aG91dCBlZmZlY3RzLgogIHZvaWQgYWRkQ29tbWVudChTdHJpbmcgdGV4dCkgewogICAgYWRkKG5ldyBIRm9yZWlnbkNvZGUoanMuanMuc3RhdGVtZW50VGVtcGxhdGVZaWVsZGluZyhuZXcganMuQ29tbWVudCh0ZXh0KSksCiAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSwgPEhJbnN0cnVjdGlvbj5bXSwKICAgICAgICBpc1N0YXRlbWVudDogdHJ1ZSkpOwogIH0KCiAgLy8vIEJ1aWxkcyBhIFNTQSBncmFwaCBmb3IgYSBzeW5jKi9hc3luYy9hc3luYyogZ2VuZXJhdG9yLiAgV2UgZ2VuZXJhdGUgYQogIC8vLyBlbnRyeSBmdW5jdGlvbiB3aGljaCB0YWlsLWNhbGxzIGEgYm9keSBmdW5jdGlvbi4gVGhlIGVudHJ5IGNvbnRhaW5zCiAgLy8vIHBlci1pbnZvY2F0aW9uIGNoZWNrcyBhbmQgdGhlIGJvZHksIHdoaWNoIGlzIGxhdGVyIHRyYW5zZm9ybWVkLCBjb250YWlucwogIC8vLyB0aGUgcmUtZW50cmFudCAnc3RhdGUgbWFjaGluZScgY29kZS4KICB2b2lkIGJ1aWxkR2VuZXJhdG9yKEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uLCBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb25Ob2RlKSB7CiAgICBvcGVuRnVuY3Rpb24oZnVuY3Rpb24sCiAgICAgICAgZnVuY3Rpb25Ob2RlOiBmdW5jdGlvbk5vZGUsCiAgICAgICAgcGFyYW1ldGVyU3RydWN0dXJlOiBmdW5jdGlvbi5wYXJhbWV0ZXJTdHJ1Y3R1cmUpOwoKICAgIC8vIFByZXBhcmUgdG8gdGFpbC1jYWxsIHRoZSBib2R5LgoKICAgIC8vIElzICdidWlsZEFzeW5jQm9keScgdGhlIGJlc3QgbG9jYXRpb24gZm9yIHRoZSBlbnRyeT8KICAgIHZhciBzb3VyY2VJbmZvcm1hdGlvbiA9IF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRBc3luY0JvZHkoKTsKCiAgICAvLyBGb3J3YXJkIGFsbCB0aGUgcGFyYW1ldGVycyB0byB0aGUgYm9keS4KICAgIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMgPSA8SEluc3RydWN0aW9uPltdOwogICAgaWYgKGdyYXBoLnRoaXNJbnN0cnVjdGlvbiAhPSBudWxsKSB7CiAgICAgIGlucHV0cy5hZGQoZ3JhcGgudGhpc0luc3RydWN0aW9uKTsKICAgIH0KICAgIGlmIChncmFwaC5leHBsaWNpdFJlY2VpdmVyUGFyYW1ldGVyICE9IG51bGwpIHsKICAgICAgaW5wdXRzLmFkZChncmFwaC5leHBsaWNpdFJlY2VpdmVyUGFyYW1ldGVyKTsKICAgIH0KICAgIGZvciAoTG9jYWwgbG9jYWwgaW4gcGFyYW1ldGVycy5rZXlzKSB7CiAgICAgIGlmICghZWxpZGVkUGFyYW1ldGVycy5jb250YWlucyhsb2NhbCkpIHsKICAgICAgICBpbnB1dHMuYWRkKGxvY2Fsc0hhbmRsZXIucmVhZExvY2FsKGxvY2FsKSk7CiAgICAgIH0KICAgIH0KICAgIGZvciAoTG9jYWwgbG9jYWwgaW4gZnVuY3Rpb25UeXBlUGFyYW1ldGVyTG9jYWxzKSB7CiAgICAgIGlucHV0cy5hZGQobG9jYWxzSGFuZGxlci5yZWFkTG9jYWwobG9jYWwpKTsKICAgIH0KCiAgICAvLyBBZGQgdGhlIHR5cGUgcGFyYW1ldGVyIGZvciB0aGUgZ2VuZXJhdG9yJ3MgZWxlbWVudCB0eXBlLgogICAgRGFydFR5cGUgZWxlbWVudFR5cGUgPSBfZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQKICAgICAgICAuZ2V0QXN5bmNPclN5bmNTdGFyRWxlbWVudFR5cGUoZnVuY3Rpb24uYXN5bmNNYXJrZXIsIF9yZXR1cm5UeXBlKTsKCiAgICBpZiAoZWxlbWVudFR5cGUuY29udGFpbnNGcmVlVHlwZVZhcmlhYmxlcykgewogICAgICAvLyBUeXBlIG11c3QgYmUgY29tcHV0ZWQgaW4gdGhlIGVudHJ5IGZ1bmN0aW9uLCB3aGVyZSB0aGUgdHlwZSB2YXJpYWJsZXMKICAgICAgLy8gYXJlIGluIHNjb3BlLCBhbmQgcGFzc2VkIHRvIHRoZSBib2R5IGZ1bmN0aW9uLgogICAgICBpbnB1dHMuYWRkKHR5cGVCdWlsZGVyLmFuYWx5emVUeXBlQXJndW1lbnQoZWxlbWVudFR5cGUsIGZ1bmN0aW9uKSk7CiAgICB9IGVsc2UgewogICAgICAvLyBUeXBlcyB3aXRoIG5vIHR5cGUgdmFyaWFibGVzIGNhbiBiZSBlbWl0dGVkIGFzIHBhcnQgb2YgdGhlIGdlbmVyYXRvciwKICAgICAgLy8gYXZvaWRpbmcgYW4gZXh0cmEgYXJndW1lbnQuCiAgICAgIGlmIChfZ2VuZXJhdGVkRW50cnlJc0VtcHR5KCkpIHsKICAgICAgICAvLyBJZiB0aGUgZW50cnkgZnVuY3Rpb24gaXMgZW1wdHkgKGUuZy4gbm8gYXJndW1lbnQgY2hlY2tzKSBhbmQgdGhlIHR5cGUKICAgICAgICAvLyBjYW4gYmUgZ2VuZXJhdGVkIGluIGJvZHksICdpbmxpbmUnIHRoZSBib2R5IGJ5IGdlbmVyYXRpbmcgaXQgaW4KICAgICAgICAvLyBwbGFjZS4gVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBzdWJzZXF1ZW50IHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBjb2RlCiAgICAgICAgLy8gaXMgJ2NvcnJlY3QnIGZvciB0aGUgZW1wdHkgZW50cnkgZnVuY3Rpb24gY29kZS4KICAgICAgICBncmFwaC5uZWVkc0FzeW5jUmV3cml0ZSA9IHRydWU7CiAgICAgICAgZ3JhcGguYXN5bmNFbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOwogICAgICAgIGZ1bmN0aW9uTm9kZS5ib2R5LmFjY2VwdCh0aGlzKTsKICAgICAgICBjbG9zZUZ1bmN0aW9uKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CgogICAgSkdlbmVyYXRvckJvZHkgYm9keSA9IF9lbGVtZW50TWFwLmdldEdlbmVyYXRvckJvZHkoZnVuY3Rpb24pOwogICAgY2xvc2VkV29ybGQub3V0cHV0VW5pdERhdGEucmVnaXN0ZXJDb2xvY2F0ZWRNZW1iZXJzKGZ1bmN0aW9uLCBib2R5KTsKICAgIHB1c2gobmV3IEhJbnZva2VHZW5lcmF0b3JCb2R5KAogICAgICAgIGJvZHksCiAgICAgICAgaW5wdXRzLAogICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUsIC8vIFRPRE86IGJldHRlciB0eXBlLgogICAgICAgIHNvdXJjZUluZm9ybWF0aW9uKSk7CgogICAgY2xvc2VBbmRHb3RvRXhpdCgKICAgICAgICBuZXcgSFJldHVybihhYnN0cmFjdFZhbHVlRG9tYWluLCBwb3AoKSwgc291cmNlSW5mb3JtYXRpb24pKTsKCiAgICBjbG9zZUZ1bmN0aW9uKCk7CiAgfQoKICAvLy8gQnVpbGRzIGEgU1NBIGdyYXBoIGZvciBhIHN5bmMqL2FzeW5jL2FzeW5jKiBnZW5lcmF0b3IgYm9keS4KICB2b2lkIGJ1aWxkR2VuZXJhdG9yQm9keSgKICAgICAgSkdlbmVyYXRvckJvZHkgZnVuY3Rpb24sIGlyLkZ1bmN0aW9uTm9kZSBmdW5jdGlvbk5vZGUpIHsKICAgIEZ1bmN0aW9uRW50aXR5IGVudHJ5ID0gZnVuY3Rpb24uZnVuY3Rpb247CiAgICBvcGVuRnVuY3Rpb24oZW50cnksCiAgICAgICAgZnVuY3Rpb25Ob2RlOiBmdW5jdGlvbk5vZGUsCiAgICAgICAgcGFyYW1ldGVyU3RydWN0dXJlOiBmdW5jdGlvbi5wYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgICAgY2hlY2tzOiBUYXJnZXRDaGVja3Mubm9uZSk7CiAgICBncmFwaC5uZWVkc0FzeW5jUmV3cml0ZSA9IHRydWU7CiAgICBpZiAoIWZ1bmN0aW9uLmVsZW1lbnRUeXBlLmNvbnRhaW5zRnJlZVR5cGVWYXJpYWJsZXMpIHsKICAgICAgLy8gV2UgY2FuIGdlbmVyYXRlIHRoZSBlbGVtZW50IHR5cGUgaW4gcGxhY2UKICAgICAgZ3JhcGguYXN5bmNFbGVtZW50VHlwZSA9IGZ1bmN0aW9uLmVsZW1lbnRUeXBlOwogICAgfQogICAgZnVuY3Rpb25Ob2RlLmJvZHkuYWNjZXB0KHRoaXMpOwogICAgY2xvc2VGdW5jdGlvbigpOwogIH0KCiAgYm9vbCBfZ2VuZXJhdGVkRW50cnlJc0VtcHR5KCkgewogICAgSEJhc2ljQmxvY2sgYmxvY2sgPSBjdXJyZW50OwogICAgLy8gSWYgYGJsb2NrLmlkYCBpcyBub3QgMSB0aGVuIHdlIGdlbmVyYXRlZCBzb21lIGNvbnRyb2wgZmxvdy4KICAgIGlmIChibG9jay5pZCAhPSAxKSByZXR1cm4gZmFsc2U7CiAgICBmb3IgKEhJbnN0cnVjdGlvbiBub2RlID0gYmxvY2suZmlyc3Q7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUubmV4dCkgewogICAgICBpZiAobm9kZSBpcyBIR290bykgY29udGludWU7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgdm9pZCBfcG90ZW50aWFsbHlBZGRGdW5jdGlvblBhcmFtZXRlclR5cGVDaGVja3MoCiAgICAgIGlyLkZ1bmN0aW9uTm9kZSBmdW5jdGlvbiwgVGFyZ2V0Q2hlY2tzIHRhcmdldENoZWNrcykgewogICAgLy8gUHV0IHRoZSB0eXBlIGNoZWNrcyBpbiB0aGUgZmlyc3Qgc3VjY2Vzc29yIG9mIHRoZSBlbnRyeSwKICAgIC8vIGJlY2F1c2UgdGhhdCBpcyB3aGVyZSB0aGUgdHlwZSBndWFyZHMgd2lsbCBhbHNvIGJlIGluc2VydGVkLgogICAgLy8gVGhpcyB3YXkgd2UgZW5zdXJlIHRoYXQgYSB0eXBlIGd1YXJkIHdpbGwgZG9taW5hdGUgdGhlIHR5cGUKICAgIC8vIGNoZWNrLgoKICAgIGlmICh0YXJnZXRDaGVja3MuY2hlY2tUeXBlUGFyYW1ldGVycykgewogICAgICBjaGVja1R5cGVWYXJpYWJsZUJvdW5kcyh0YXJnZXRFbGVtZW50KTsKICAgIH0KCiAgICBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24gPQogICAgICAgIF9lbGVtZW50TWFwLmdldE1lbWJlckRlZmluaXRpb24odGFyZ2V0RWxlbWVudCk7CiAgICBib29sIG5vZGVJc0NvbnN0cnVjdG9yQm9keSA9IGRlZmluaXRpb24ua2luZCA9PSBNZW1iZXJLaW5kLmNvbnN0cnVjdG9yQm9keTsKCiAgICB2b2lkIF9oYW5kbGVQYXJhbWV0ZXIoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgewogICAgICBMb2NhbCBsb2NhbCA9IGxvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKHZhcmlhYmxlKTsKICAgICAgaWYgKG5vZGVJc0NvbnN0cnVjdG9yQm9keSAmJgogICAgICAgICAgY2xvc3VyZURhdGFMb29rdXAKICAgICAgICAgICAgICAuZ2V0Q2FwdHVyZWRTY29wZSh0YXJnZXRFbGVtZW50KQogICAgICAgICAgICAgIC5pc0JveGVkVmFyaWFibGUobG9jYWwpKSB7CiAgICAgICAgLy8gSWYgbG9jYWwgaXMgYm94ZWQsIHRoZW4gYHZhcmlhYmxlYCB3aWxsIGJlIGEgZmllbGQgaW5zaWRlIHRoZSBib3gKICAgICAgICAvLyBwYXNzZWQgYXMgdGhlIGxhc3QgcGFyYW1ldGVyLCBzbyBubyBuZWVkIHRvIHVwZGF0ZSBvdXIgbG9jYWxzCiAgICAgICAgLy8gaGFuZGxlciBvciBjaGVjayB0eXBlcyBhdCB0aGlzIHBvaW50LgogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBISW5zdHJ1Y3Rpb24gbmV3UGFyYW1ldGVyID0gbG9jYWxzSGFuZGxlci5kaXJlY3RMb2NhbHNbbG9jYWxdOwogICAgICBhc3NlcnQobmV3UGFyYW1ldGVyICE9IG51bGwsICJObyBpbml0aWFsIGluc3RydWN0aW9uIGZvciAke2xvY2FsfS4iKTsKICAgICAgRGFydFR5cGUgdHlwZSA9IF9nZXREYXJ0VHlwZUlmVmFsaWQodmFyaWFibGUudHlwZSk7CgogICAgICBpZiAodGFyZ2V0Q2hlY2tzLmNoZWNrQWxsUGFyYW1ldGVycyB8fAogICAgICAgICAgKHRhcmdldENoZWNrcy5jaGVja0NvdmFyaWFudFBhcmFtZXRlcnMgJiYKICAgICAgICAgICAgICAodmFyaWFibGUuaXNHZW5lcmljQ292YXJpYW50SW1wbCB8fCB2YXJpYWJsZS5pc0NvdmFyaWFudCkpKSB7CiAgICAgICAgbmV3UGFyYW1ldGVyID0gdHlwZUJ1aWxkZXIucG90ZW50aWFsbHlDaGVja09yVHJ1c3RUeXBlT2ZQYXJhbWV0ZXIoCiAgICAgICAgICAgIG5ld1BhcmFtZXRlciwgdHlwZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbmV3UGFyYW1ldGVyID0gdHlwZUJ1aWxkZXIudHJ1c3RUeXBlT2ZQYXJhbWV0ZXIobmV3UGFyYW1ldGVyLCB0eXBlKTsKICAgICAgfQoKICAgICAgbG9jYWxzSGFuZGxlci5kaXJlY3RMb2NhbHNbbG9jYWxdID0gbmV3UGFyYW1ldGVyOwogICAgfQoKICAgIGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmZvckVhY2goX2hhbmRsZVBhcmFtZXRlcik7CiAgICBmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMudG9MaXN0KCkuLmZvckVhY2goX2hhbmRsZVBhcmFtZXRlcik7CiAgfQoKICB2b2lkIGNoZWNrVHlwZVZhcmlhYmxlQm91bmRzKEZ1bmN0aW9uRW50aXR5IG1ldGhvZCkgewogICAgaWYgKHJ0aU5lZWQubWV0aG9kTmVlZHNUeXBlQXJndW1lbnRzKG1ldGhvZCkgJiYKICAgICAgICBvcHRpb25zLnBhcmFtZXRlckNoZWNrUG9saWN5LmlzRW1pdHRlZCkgewogICAgICBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb24gPSBnZXRGdW5jdGlvbk5vZGUoX2VsZW1lbnRNYXAsIG1ldGhvZCk7CiAgICAgIGZvciAoaXIuVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyIGluIGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgICAgTG9jYWwgbG9jYWwgPSBsb2NhbHNNYXAuZ2V0TG9jYWxUeXBlVmFyaWFibGUoCiAgICAgICAgICAgIG5ldyBpci5UeXBlUGFyYW1ldGVyVHlwZSh0eXBlUGFyYW1ldGVyKSwgX2VsZW1lbnRNYXApOwogICAgICAgIEhJbnN0cnVjdGlvbiBuZXdQYXJhbWV0ZXIgPSBsb2NhbHNIYW5kbGVyLmRpcmVjdExvY2Fsc1tsb2NhbF07CiAgICAgICAgRGFydFR5cGUgYm91bmQgPSBfZ2V0RGFydFR5cGVJZlZhbGlkKHR5cGVQYXJhbWV0ZXIuYm91bmQpOwogICAgICAgIGlmICghYm91bmQuaXNEeW5hbWljICYmCiAgICAgICAgICAgICFib3VuZC5pc1ZvaWQgJiYKICAgICAgICAgICAgYm91bmQgIT0gX2NvbW1vbkVsZW1lbnRzLm9iamVjdFR5cGUpIHsKICAgICAgICAgIF9hc3NlcnRJc1R5cGUoCiAgICAgICAgICAgICAgbmV3UGFyYW1ldGVyLAogICAgICAgICAgICAgIGJvdW5kLAogICAgICAgICAgICAgICJUaGUgdHlwZSBhcmd1bWVudCAnIiwKICAgICAgICAgICAgICAiJyBpcyBub3QgYSBzdWJ0eXBlIG9mIHRoZSB0eXBlIHZhcmlhYmxlIGJvdW5kICciLAogICAgICAgICAgICAgICInIG9mIHR5cGUgdmFyaWFibGUgJyR7bG9jYWwubmFtZX0nIGluICcke21ldGhvZC5uYW1lfScuIik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLy8gQnVpbGRzIGEgU1NBIGdyYXBoIGZvciBGdW5jdGlvbk5vZGVzIG9mIGV4dGVybmFsIG1ldGhvZHMuCiAgdm9pZCBidWlsZEV4dGVybmFsRnVuY3Rpb25Ob2RlKAogICAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwgaXIuRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uTm9kZSkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTm9uLWpzLWludGVyb3AgZXh0ZXJuYWwgZnVuY3Rpb25zIHNob3VsZAogICAgLy8gdGhyb3cgYSBydW50aW1lIGVycm9yLgogICAgYXNzZXJ0KGZ1bmN0aW9uTm9kZS5ib2R5ID09IG51bGwpOwogICAgb3BlbkZ1bmN0aW9uKGZ1bmN0aW9uLAogICAgICAgIGZ1bmN0aW9uTm9kZTogZnVuY3Rpb25Ob2RlLAogICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZTogZnVuY3Rpb24ucGFyYW1ldGVyU3RydWN0dXJlKTsKCiAgICBpZiAoY2xvc2VkV29ybGQubmF0aXZlRGF0YS5pc05hdGl2ZU1lbWJlcih0YXJnZXRFbGVtZW50KSkgewogICAgICBuYXRpdmVFbWl0dGVyLm5hdGl2ZU1ldGhvZHMuYWRkKHRhcmdldEVsZW1lbnQpOwogICAgICBTdHJpbmcgbmF0aXZlTmFtZTsKICAgICAgaWYgKGNsb3NlZFdvcmxkLm5hdGl2ZURhdGEuaGFzRml4ZWRCYWNrZW5kTmFtZSh0YXJnZXRFbGVtZW50KSkgewogICAgICAgIG5hdGl2ZU5hbWUgPSBjbG9zZWRXb3JsZC5uYXRpdmVEYXRhLmdldEZpeGVkQmFja2VuZE5hbWUodGFyZ2V0RWxlbWVudCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbmF0aXZlTmFtZSA9IHRhcmdldEVsZW1lbnQubmFtZTsKICAgICAgfQoKICAgICAgU3RyaW5nIHRlbXBsYXRlUmVjZWl2ZXIgPSAnJzsKICAgICAgTGlzdDxTdHJpbmc+IHRlbXBsYXRlQXJndW1lbnRzID0gPFN0cmluZz5bXTsKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cyA9IDxISW5zdHJ1Y3Rpb24+W107CiAgICAgIGlmICh0YXJnZXRFbGVtZW50LmlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgICB0ZW1wbGF0ZVJlY2VpdmVyID0gJyMuJzsKICAgICAgICBpbnB1dHMuYWRkKGxvY2Fsc0hhbmRsZXIucmVhZFRoaXMoCiAgICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOgogICAgICAgICAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEdldChmdW5jdGlvbk5vZGUpKSk7CiAgICAgIH0KCiAgICAgIHZvaWQgaGFuZGxlUGFyYW1ldGVyKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW0pIHsKICAgICAgICB0ZW1wbGF0ZUFyZ3VtZW50cy5hZGQoJyMnKTsKICAgICAgICBMb2NhbCBsb2NhbCA9IGxvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKHBhcmFtKTsKICAgICAgICAvLyBDb252ZXJ0IERhcnQgZnVuY3Rpb24gdG8gSmF2YVNjcmlwdCBmdW5jdGlvbi4KICAgICAgICBISW5zdHJ1Y3Rpb24gYXJndW1lbnQgPSBsb2NhbHNIYW5kbGVyLnJlYWRMb2NhbChsb2NhbCk7CiAgICAgICAgaXIuRGFydFR5cGUgdHlwZSA9IHBhcmFtLnR5cGU7CiAgICAgICAgaWYgKHR5cGUgaXMgaXIuRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgICBpbnQgYXJpdHkgPSB0eXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsKICAgICAgICAgIF9wdXNoU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgICAgICBfY29tbW9uRWxlbWVudHMuY2xvc3VyZUNvbnZlcnRlciwKICAgICAgICAgICAgICBbYXJndW1lbnQsIGdyYXBoLmFkZENvbnN0YW50SW50KGFyaXR5LCBjbG9zZWRXb3JsZCldLAogICAgICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUsCiAgICAgICAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBudWxsKTsKICAgICAgICAgIGFyZ3VtZW50ID0gcG9wKCk7CiAgICAgICAgfQogICAgICAgIGlucHV0cy5hZGQoYXJndW1lbnQpOwogICAgICB9CgogICAgICBmb3IgKGludCBwb3NpdGlvbiA9IDA7CiAgICAgICAgICBwb3NpdGlvbiA8IGZ1bmN0aW9uLnBhcmFtZXRlclN0cnVjdHVyZS5wb3NpdGlvbmFsUGFyYW1ldGVyczsKICAgICAgICAgIHBvc2l0aW9uKyspIHsKICAgICAgICBoYW5kbGVQYXJhbWV0ZXIoZnVuY3Rpb25Ob2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW3Bvc2l0aW9uXSk7CiAgICAgIH0KICAgICAgaWYgKGZ1bmN0aW9uTm9kZS5uYW1lZFBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICAgIExpc3Q8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4gbmFtZWRQYXJhbWV0ZXJzID0gZnVuY3Rpb25Ob2RlCiAgICAgICAgICAgIC5uYW1lZFBhcmFtZXRlcnMKICAgICAgICAgICAgLy8gRmlsdGVyIGVsaWRlZCBwYXJhbWV0ZXJzLgogICAgICAgICAgICAud2hlcmUoKHApID0+CiAgICAgICAgICAgICAgICBmdW5jdGlvbi5wYXJhbWV0ZXJTdHJ1Y3R1cmUubmFtZWRQYXJhbWV0ZXJzLmNvbnRhaW5zKHAubmFtZSkpCiAgICAgICAgICAgIC50b0xpc3QoKTsKICAgICAgICAvLyBTb3J0IGJ5IGZpbGUgb2Zmc2V0IHRvIHZpc2l0IHBhcmFtZXRlcnMgaW4gZGVjbGFyYXRpb24gb3JkZXIuCiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzLnNvcnQobmF0aXZlT3JkZXJpbmcpOwogICAgICAgIG5hbWVkUGFyYW1ldGVycy5mb3JFYWNoKGhhbmRsZVBhcmFtZXRlcik7CiAgICAgIH0KCiAgICAgIFN0cmluZyBhcmd1bWVudHMgPSB0ZW1wbGF0ZUFyZ3VtZW50cy5qb2luKCcsJyk7CgogICAgICAvLyBUT0RPKHNyYSk6IFVzZSBkZWNsYXJlZCB0eXBlIG9yIE5hdGl2ZUJlaGF2aW9yIHR5cGUuCiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZU1hc2sgPSBhYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlOwogICAgICBTdHJpbmcgdGVtcGxhdGU7CiAgICAgIGlmICh0YXJnZXRFbGVtZW50LmlzR2V0dGVyKSB7CiAgICAgICAgdGVtcGxhdGUgPSAnJHt0ZW1wbGF0ZVJlY2VpdmVyfSRuYXRpdmVOYW1lJzsKICAgICAgfSBlbHNlIGlmICh0YXJnZXRFbGVtZW50LmlzU2V0dGVyKSB7CiAgICAgICAgdGVtcGxhdGUgPSAnJHt0ZW1wbGF0ZVJlY2VpdmVyfSRuYXRpdmVOYW1lID0gJHthcmd1bWVudHN9JzsKICAgICAgfSBlbHNlIHsKICAgICAgICB0ZW1wbGF0ZSA9ICcke3RlbXBsYXRlUmVjZWl2ZXJ9JG5hdGl2ZU5hbWUoJHthcmd1bWVudHN9KSc7CiAgICAgIH0KCiAgICAgIHB1c2gobmV3IEhGb3JlaWduQ29kZSgKICAgICAgICAgIGpzLmpzLnVuY2FjaGVkRXhwcmVzc2lvblRlbXBsYXRlKHRlbXBsYXRlKSwgdHlwZU1hc2ssIGlucHV0cywKICAgICAgICAgIGVmZmVjdHM6IG5ldyBTaWRlRWZmZWN0cygpKSk7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFByb3ZpZGUgc291cmNlIGluZm9ybWF0aW9uLgogICAgICBISW5zdHJ1Y3Rpb24gdmFsdWUgPSBwb3AoKTsKICAgICAgaWYgKHRhcmdldEVsZW1lbnQuaXNTZXR0ZXIpIHsKICAgICAgICB2YWx1ZSA9IGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCk7CiAgICAgIH0KICAgICAgY2xvc2UobmV3IEhSZXR1cm4oYWJzdHJhY3RWYWx1ZURvbWFpbiwgdmFsdWUsCiAgICAgICAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZFJldHVybihmdW5jdGlvbk5vZGUpKSkKICAgICAgICAgIC5hZGRTdWNjZXNzb3IoZ3JhcGguZXhpdCk7CiAgICB9CiAgICAvLyBUT0RPKHNyYSk6IEhhbmRsZSBKUy1pbnRlcm9wIG1ldGhvZHMuCiAgICBjbG9zZUZ1bmN0aW9uKCk7CiAgfQoKICB2b2lkIGFkZEltcGxpY2l0SW5zdGFudGlhdGlvbihEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZSAhPSBudWxsKSB7CiAgICAgIGN1cnJlbnRJbXBsaWNpdEluc3RhbnRpYXRpb25zLmFkZCh0eXBlKTsKICAgIH0KICB9CgogIHZvaWQgcmVtb3ZlSW1wbGljaXRJbnN0YW50aWF0aW9uKERhcnRUeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlICE9IG51bGwpIHsKICAgICAgY3VycmVudEltcGxpY2l0SW5zdGFudGlhdGlvbnMucmVtb3ZlTGFzdCgpOwogICAgfQogIH0KCiAgdm9pZCBvcGVuRnVuY3Rpb24oTWVtYmVyRW50aXR5IG1lbWJlciwKICAgICAge2lyLkZ1bmN0aW9uTm9kZSBmdW5jdGlvbk5vZGUsCiAgICAgIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgIFRhcmdldENoZWNrcyBjaGVja3N9KSB7CiAgICAvLyBUT0RPKHNyYSk6IFBhc3MgZnJvbSBhbGwgc2l0ZXMuCiAgICBjaGVja3MgPz89IFRhcmdldENoZWNrcy5keW5hbWljQ2hlY2tzOwoKICAgIE1hcDxMb2NhbCwgQWJzdHJhY3RWYWx1ZT4gcGFyYW1ldGVyTWFwID0ge307CiAgICBMaXN0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+IGVsaWRlZFBhcmFtZXRlcnMgPSBbXTsKICAgIFNldDxMb2NhbD4gZWxpZGVkUGFyYW1ldGVyU2V0ID0gbmV3IFNldCgpOwogICAgaWYgKGZ1bmN0aW9uTm9kZSAhPSBudWxsKSB7CiAgICAgIGFzc2VydChwYXJhbWV0ZXJTdHJ1Y3R1cmUgIT0gbnVsbCk7CgogICAgICB2b2lkIGhhbmRsZVBhcmFtZXRlcihpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUsCiAgICAgICAgICB7Ym9vbCBpc09wdGlvbmFsLCBib29sIGlzRWxpZGVkfSkgewogICAgICAgIExvY2FsIGxvY2FsID0gbG9jYWxzTWFwLmdldExvY2FsVmFyaWFibGUobm9kZSk7CiAgICAgICAgaWYgKGlzRWxpZGVkKSB7CiAgICAgICAgICBlbGlkZWRQYXJhbWV0ZXJzLmFkZChub2RlKTsKICAgICAgICAgIGVsaWRlZFBhcmFtZXRlclNldC5hZGQobG9jYWwpOwogICAgICAgIH0KICAgICAgICBwYXJhbWV0ZXJNYXBbbG9jYWxdID0KICAgICAgICAgICAgX3R5cGVJbmZlcmVuY2VNYXAuZ2V0SW5mZXJyZWRUeXBlT2ZQYXJhbWV0ZXIobG9jYWwpOwogICAgICB9CgogICAgICBmb3JFYWNoT3JkZXJlZFBhcmFtZXRlckJ5RnVuY3Rpb25Ob2RlKAogICAgICAgICAgZnVuY3Rpb25Ob2RlLCBwYXJhbWV0ZXJTdHJ1Y3R1cmUsIGhhbmRsZVBhcmFtZXRlcik7CgogICAgICBfcmV0dXJuVHlwZSA9IF9lbGVtZW50TWFwLmdldERhcnRUeXBlKGZ1bmN0aW9uTm9kZS5yZXR1cm5UeXBlKTsKICAgIH0KCiAgICBIQmFzaWNCbG9jayBibG9jayA9IGdyYXBoLmFkZE5ld0Jsb2NrKCk7CiAgICAvLyBDcmVhdGUgYGdyYXBoLmVudHJ5YCBhcyBhbiBpbml0aWFsbHkgZW1wdHkgYmxvY2suIGBncmFwaC5lbnRyeWAgaXMKICAgIC8vIHRyZWF0ZWQgc3BlY2lhbGx5IChob2xkaW5nIHBhcmFtZXRlcnMsIGxvY2FsIHZhcmlhYmxlcyBhbmQgY29uc3RhbnRzKQogICAgLy8gYnV0IGNhbm5vdCByZWNlaXZlIGNvbnN0YW50cyBiZWZvcmUgaXQgaGFzIGJlZW4gY2xvc2VkLiBCeSBjbG9zaW5nIGl0CiAgICAvLyBoZXJlLCB3ZSBjYW4gdXNlIGNvbnN0YW50cyBpbiB0aGUgY29kZSB0aGF0IHNldHMgdXAgdGhlIGZ1bmN0aW9uLgogICAgb3BlbihncmFwaC5lbnRyeSk7CiAgICBjbG9zZShuZXcgSEdvdG8oYWJzdHJhY3RWYWx1ZURvbWFpbikpLmFkZFN1Y2Nlc3NvcihibG9jayk7CiAgICBvcGVuKGJsb2NrKTsKCiAgICBsb2NhbHNIYW5kbGVyLnN0YXJ0RnVuY3Rpb24oCiAgICAgICAgdGFyZ2V0RWxlbWVudCwKICAgICAgICBjbG9zdXJlRGF0YUxvb2t1cC5nZXRTY29wZUluZm8odGFyZ2V0RWxlbWVudCksCiAgICAgICAgY2xvc3VyZURhdGFMb29rdXAuZ2V0Q2FwdHVyZWRTY29wZSh0YXJnZXRFbGVtZW50KSwKICAgICAgICBwYXJhbWV0ZXJNYXAsCiAgICAgICAgZWxpZGVkUGFyYW1ldGVyU2V0LAogICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGREZWNsYXJhdGlvbih0YXJnZXRFbGVtZW50KSwKICAgICAgICBpc0dlbmVyYXRpdmVDb25zdHJ1Y3RvckJvZHk6IHRhcmdldEVsZW1lbnQgaXMgQ29uc3RydWN0b3JCb2R5RW50aXR5KTsKCiAgICBmb3IgKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSBpbiBlbGlkZWRQYXJhbWV0ZXJzKSB7CiAgICAgIExvY2FsIGxvY2FsID0gbG9jYWxzTWFwLmdldExvY2FsVmFyaWFibGUobm9kZSk7CiAgICAgIGxvY2Fsc0hhbmRsZXIudXBkYXRlTG9jYWwobG9jYWwsIF9kZWZhdWx0VmFsdWVGb3JQYXJhbWV0ZXIobm9kZSkpOwogICAgfQoKICAgIF9hZGRDbGFzc1R5cGVWYXJpYWJsZXNJZk5lZWRlZChtZW1iZXIpOwogICAgX2FkZEZ1bmN0aW9uVHlwZVZhcmlhYmxlc0lmTmVlZGVkKG1lbWJlcik7CgogICAgaWYgKGZ1bmN0aW9uTm9kZSAhPSBudWxsKSB7CiAgICAgIF9wb3RlbnRpYWxseUFkZEZ1bmN0aW9uUGFyYW1ldGVyVHlwZUNoZWNrcyhmdW5jdGlvbk5vZGUsIGNoZWNrcyk7CiAgICB9CiAgICBfaW5zZXJ0Q292ZXJhZ2VDYWxsKG1lbWJlcik7CiAgfQoKICB2b2lkIGNsb3NlRnVuY3Rpb24oKSB7CiAgICBpZiAoIWlzQWJvcnRlZCgpKSBjbG9zZUFuZEdvdG9FeGl0KG5ldyBIR290byhhYnN0cmFjdFZhbHVlRG9tYWluKSk7CiAgICBncmFwaC5maW5hbGl6ZShhYnN0cmFjdFZhbHVlRG9tYWluKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZGVmYXVsdE5vZGUoaXIuTm9kZSBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5oYW5kbGVkIG5vZGUgJG5vZGUgKCR7bm9kZS5ydW50aW1lVHlwZX0pIik7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgY3VycmVudCBzb3VyY2UgZWxlbWVudC4gVGhpcyBpcyB1c2VkIGJ5IHRoZSB0eXBlIGJ1aWxkZXIuCiAgLy8vCiAgLy8vIFRoZSByZXR1cm5lZCBlbGVtZW50IGlzIGEgZGVjbGFyYXRpb24gZWxlbWVudC4KICAvLyBUT0RPKGVmb3J0dW5hKTogVXBkYXRlIHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgaW5saW5pbmcuCiAgLy8gVE9ETyhzcmEpOiBSZS1pbXBsZW1lbnQgdHlwZSBidWlsZGVyIHVzaW5nIEtlcm5lbCB0eXBlcyBhbmQgdGhlCiAgLy8gYHRhcmdldGAgZm9yIGNvbnRleHQuCiAgQG92ZXJyaWRlCiAgTWVtYmVyRW50aXR5IGdldCBzb3VyY2VFbGVtZW50ID0+IF9jdXJyZW50RnJhbWUubWVtYmVyOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2hlY2tMaWJyYXJ5SXNMb2FkZWQoaXIuQ2hlY2tMaWJyYXJ5SXNMb2FkZWQgY2hlY2tMb2FkKSB7CiAgICBJbXBvcnRFbnRpdHkgaW1wb3J0ID0gX2VsZW1lbnRNYXAuZ2V0SW1wb3J0KGNoZWNrTG9hZC5pbXBvcnQpOwogICAgU3RyaW5nIGxvYWRJZCA9IGNsb3NlZFdvcmxkLm91dHB1dFVuaXREYXRhLmdldEltcG9ydERlZmVyTmFtZSgKICAgICAgICBfZWxlbWVudE1hcC5nZXRTcGFubmFibGUodGFyZ2V0RWxlbWVudCwgY2hlY2tMb2FkKSwgaW1wb3J0KTsKICAgIEhJbnN0cnVjdGlvbiBwcmVmaXhDb25zdGFudCA9IGdyYXBoLmFkZENvbnN0YW50U3RyaW5nKGxvYWRJZCwgY2xvc2VkV29ybGQpOwogICAgSEluc3RydWN0aW9uIHVyaUNvbnN0YW50ID0KICAgICAgICBncmFwaC5hZGRDb25zdGFudFN0cmluZygnJHtpbXBvcnQudXJpfScsIGNsb3NlZFdvcmxkKTsKICAgIF9wdXNoU3RhdGljSW52b2NhdGlvbigKICAgICAgICBfY29tbW9uRWxlbWVudHMuY2hlY2tEZWZlcnJlZElzTG9hZGVkLAogICAgICAgIFtwcmVmaXhDb25zdGFudCwgdXJpQ29uc3RhbnRdLAogICAgICAgIF90eXBlSW5mZXJlbmNlTWFwCiAgICAgICAgICAgIC5nZXRSZXR1cm5UeXBlT2YoX2NvbW1vbkVsZW1lbnRzLmNoZWNrRGVmZXJyZWRJc0xvYWRlZCksCiAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMb2FkTGlicmFyeShpci5Mb2FkTGlicmFyeSBsb2FkTGlicmFyeSkgewogICAgU3RyaW5nIGxvYWRJZCA9IGNsb3NlZFdvcmxkLm91dHB1dFVuaXREYXRhLmdldEltcG9ydERlZmVyTmFtZSgKICAgICAgICBfZWxlbWVudE1hcC5nZXRTcGFubmFibGUodGFyZ2V0RWxlbWVudCwgbG9hZExpYnJhcnkpLAogICAgICAgIF9lbGVtZW50TWFwLmdldEltcG9ydChsb2FkTGlicmFyeS5pbXBvcnQpKTsKICAgIC8vIFRPRE8oZWZvcnR1bmEpOiBTb3VyY2UgaW5mb3JtYXRpb24hCiAgICBwdXNoKG5ldyBISW52b2tlU3RhdGljKAogICAgICAgIGNvbW1vbkVsZW1lbnRzLmxvYWREZWZlcnJlZExpYnJhcnksCiAgICAgICAgPEhJbnN0cnVjdGlvbj5bZ3JhcGguYWRkQ29uc3RhbnRTdHJpbmcobG9hZElkLCBjbG9zZWRXb3JsZCldLAogICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4ubm9uTnVsbFR5cGUsCiAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgIHRhcmdldENhblRocm93OiBmYWxzZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJsb2NrKGlyLkJsb2NrIGJsb2NrKSB7CiAgICBhc3NlcnQoIWlzQWJvcnRlZCgpKTsKICAgIGlmICghaXNSZWFjaGFibGUpIHJldHVybjsgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gd2hlbiBpbmxpbmluZy4KICAgIGZvciAoaXIuU3RhdGVtZW50IHN0YXRlbWVudCBpbiBibG9jay5zdGF0ZW1lbnRzKSB7CiAgICAgIHN0YXRlbWVudC5hY2NlcHQodGhpcyk7CiAgICAgIGlmICghaXNSZWFjaGFibGUpIHsKICAgICAgICAvLyBUaGUgYmxvY2sgaGFzIGJlZW4gYWJvcnRlZCBieSBhIHJldHVybiBvciBhIHRocm93LgogICAgICAgIGlmIChzdGFjay5pc05vdEVtcHR5KSB7CiAgICAgICAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKAogICAgICAgICAgICAgIE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwgJ05vbi1lbXB0eSBpbnN0cnVjdGlvbiBzdGFjay4nKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICBhc3NlcnQoIWN1cnJlbnQuaXNDbG9zZWQoKSk7CiAgICBpZiAoc3RhY2suaXNOb3RFbXB0eSkgewogICAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKAogICAgICAgICAgTk9fTE9DQVRJT05fU1BBTk5BQkxFLCAnTm9uLWVtcHR5IGluc3RydWN0aW9uIHN0YWNrJyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RW1wdHlTdGF0ZW1lbnQoaXIuRW1wdHlTdGF0ZW1lbnQgbm9kZSkgewogICAgLy8gRW1wdHkgc3RhdGVtZW50IGFkZHMgbm8gaW5zdHJ1Y3Rpb25zIHRvIGN1cnJlbnQgYmxvY2suCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChpci5FeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpIHsKICAgIGlmICghaXNSZWFjaGFibGUpIHJldHVybjsKICAgIGlyLkV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG5vZGUuZXhwcmVzc2lvbjsKICAgIGlmIChleHByZXNzaW9uIGlzIGlyLlRocm93ICYmIF9pbmxpbmluZ1N0YWNrLmlzRW1wdHkpIHsKICAgICAgX3Zpc2l0VGhyb3dFeHByZXNzaW9uKGV4cHJlc3Npb24uZXhwcmVzc2lvbik7CiAgICAgIGhhbmRsZUluVHJ5U3RhdGVtZW50KCk7CiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0KICAgICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRUaHJvdyhub2RlLmV4cHJlc3Npb24pOwogICAgICBjbG9zZUFuZEdvdG9FeGl0KAogICAgICAgICAgbmV3IEhUaHJvdyhhYnN0cmFjdFZhbHVlRG9tYWluLCBwb3AoKSwgc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0gZWxzZSB7CiAgICAgIGV4cHJlc3Npb24uYWNjZXB0KHRoaXMpOwogICAgICBwb3AoKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDb25zdGFudEV4cHJlc3Npb24oaXIuQ29uc3RhbnRFeHByZXNzaW9uIG5vZGUpIHsKICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBfZWxlbWVudE1hcC5nZXRDb25zdGFudFZhbHVlKG5vZGUpOwogICAgaWYgKCFjbG9zZWRXb3JsZC5vdXRwdXRVbml0RGF0YQogICAgICAgIC5oYXNPbmx5Tm9uRGVmZXJyZWRJbXBvcnRQYXRoc1RvQ29uc3RhbnQodGFyZ2V0RWxlbWVudCwgdmFsdWUpKSB7CiAgICAgIHN0YWNrLmFkZChncmFwaC5hZGREZWZlcnJlZENvbnN0YW50KAogICAgICAgICAgdmFsdWUsCiAgICAgICAgICBjbG9zZWRXb3JsZC5vdXRwdXRVbml0RGF0YS5vdXRwdXRVbml0Rm9yQ29uc3RhbnQodmFsdWUpLAogICAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEdldChub2RlKSwKICAgICAgICAgIGNsb3NlZFdvcmxkKSk7CiAgICB9IGVsc2UgewogICAgICBzdGFjay5hZGQoZ3JhcGguYWRkQ29uc3RhbnQodmFsdWUsIGNsb3NlZFdvcmxkKSk7CiAgICB9CiAgfQoKICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBbdHlwZV0gaXMgYSB2YWxpZCByZXR1cm4gdHlwZSBmb3IgYW4gYXN5bmNocm9ub3VzCiAgLy8vIGZ1bmN0aW9uLgogIC8vLwogIC8vLyBBc3luY2hyb25vdXMgZnVuY3Rpb25zIHJldHVybiBhIGBGdXR1cmVgLCBhbmQgYSB2YWxpZCByZXR1cm4gaXMgdGh1cwogIC8vLyBlaXRoZXIgZHluYW1pYywgT2JqZWN0LCBvciBGdXR1cmUuCiAgLy8vCiAgLy8vIFdlIGRvIG5vdCBhY2NlcHQgdGhlIGludGVybmFsIEZ1dHVyZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KICBib29sIGlzVmFsaWRBc3luY1JldHVyblR5cGUoRGFydFR5cGUgdHlwZSkgewogICAgLy8gVE9ETyhzaWd1cmRtKTogSW4gYW4gaW50ZXJuYWwgbGlicmFyeSBhIGZ1bmN0aW9uIGNvdWxkIGJlIGRlY2xhcmVkOgogICAgLy8KICAgIC8vIF9GdXR1cmVJbXBsIGZvbyBhc3luYyA9PiAxOwogICAgLy8KICAgIC8vIFRoaXMgc2hvdWxkIGJlIHZhbGlkIChiZWNhdXNlIHRoZSBhY3R1YWwgdmFsdWUgcmV0dXJuZWQgZnJvbSBhbiBhc3luYwogICAgLy8gZnVuY3Rpb24gaXMgYSBgX0Z1dHVyZUltcGxgKSwgYnV0IGN1cnJlbnRseSBmYWxzZSBpcyByZXR1cm5lZCBpbiB0aGlzCiAgICAvLyBjYXNlLgogICAgcmV0dXJuIHR5cGUuaXNEeW5hbWljIHx8CiAgICAgICAgdHlwZSA9PSBfY29tbW9uRWxlbWVudHMub2JqZWN0VHlwZSB8fAogICAgICAgICh0eXBlIGlzIEludGVyZmFjZVR5cGUgJiYgdHlwZS5lbGVtZW50ID09IF9jb21tb25FbGVtZW50cy5mdXR1cmVDbGFzcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UmV0dXJuU3RhdGVtZW50KGlyLlJldHVyblN0YXRlbWVudCBub2RlKSB7CiAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9CiAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZFJldHVybihub2RlKTsKICAgIEhJbnN0cnVjdGlvbiB2YWx1ZTsKICAgIGlmIChub2RlLmV4cHJlc3Npb24gPT0gbnVsbCkgewogICAgICB2YWx1ZSA9IGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCk7CiAgICB9IGVsc2UgewogICAgICBub2RlLmV4cHJlc3Npb24uYWNjZXB0KHRoaXMpOwogICAgICB2YWx1ZSA9IHBvcCgpOwogICAgICBpZiAoX2N1cnJlbnRGcmFtZS5hc3luY01hcmtlciA9PSBBc3luY01hcmtlci5BU1lOQykgewogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IElzIHRoaXMgc3BlY2lhbC1jYXNpbmcgb2YgYXN5bmMgc3RpbGwgbmVlZGVkCiAgICAgICAgLy8gb3Igc2hvdWxkIHdlIHVzZSB0aGUgZ2VuZXJhbCBjaGVjayBiZWxvdz8KICAgICAgICAvKmlmIChvcHRpb25zLmVuYWJsZVR5cGVBc3NlcnRpb25zICYmCiAgICAgICAgICAgICFpc1ZhbGlkQXN5bmNSZXR1cm5UeXBlKF9yZXR1cm5UeXBlKSkgewogICAgICAgICAgZ2VuZXJhdGVUeXBlRXJyb3IoCiAgICAgICAgICAgICAgIkFzeW5jIGZ1bmN0aW9uIHJldHVybmVkIGEgRnV0dXJlLCIKICAgICAgICAgICAgICAiIHdhcyBkZWNsYXJlZCB0byByZXR1cm4gYSAke19yZXR1cm5UeXBlfS4iLAogICAgICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgICAgIHBvcCgpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0qLwogICAgICB9IGVsc2UgewogICAgICAgIHZhbHVlID0gdHlwZUJ1aWxkZXIucG90ZW50aWFsbHlDaGVja09yVHJ1c3RUeXBlT2ZBc3NpZ25tZW50KAogICAgICAgICAgICB2YWx1ZSwgX3JldHVyblR5cGUpOwogICAgICB9CiAgICB9CiAgICBoYW5kbGVJblRyeVN0YXRlbWVudCgpOwogICAgaWYgKF9pbmxpbmluZ1N0YWNrLmlzRW1wdHkgJiYgdGFyZ2V0RWxlbWVudC5pc1NldHRlcikgewogICAgICBpZiAobm9kZS5wYXJlbnQgaXMgaXIuRnVuY3Rpb25Ob2RlKSB7CiAgICAgICAgLy8gQW4gYXJyb3cgZnVuY3Rpb24gZGVmaW5pdGlvbiBvZiBhIHNldHRlciBoYXMgYSBSZXR1cm5TdGF0ZW1udCBhcyBhCiAgICAgICAgLy8gYm9keSwgZS5nLiAic2V0IGZvbyh4KSA9PiB0aGlzLl94ID0geDsiLiBUaGVyZSBpcyBubyB3YXkgdG8gYWNjZXNzCiAgICAgICAgLy8gdGhlIHJldHVybmVkIHZhbHVlLCBzbyBkb24ndCBlbWl0IGEgcmV0dXJuLgogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgX2VtaXRSZXR1cm4odmFsdWUsIHNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGb3JTdGF0ZW1lbnQoaXIuRm9yU3RhdGVtZW50IG5vZGUpIHsKICAgIGFzc2VydChpc1JlYWNoYWJsZSk7CiAgICBhc3NlcnQobm9kZS5ib2R5ICE9IG51bGwpOwogICAgdm9pZCBidWlsZEluaXRpYWxpemVyKCkgewogICAgICBmb3IgKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gaW4gbm9kZS52YXJpYWJsZXMpIHsKICAgICAgICBkZWNsYXJhdGlvbi5hY2NlcHQodGhpcyk7CiAgICAgIH0KICAgIH0KCiAgICBISW5zdHJ1Y3Rpb24gYnVpbGRDb25kaXRpb24oKSB7CiAgICAgIGlmIChub2RlLmNvbmRpdGlvbiA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGdyYXBoLmFkZENvbnN0YW50Qm9vbCh0cnVlLCBjbG9zZWRXb3JsZCk7CiAgICAgIH0KICAgICAgbm9kZS5jb25kaXRpb24uYWNjZXB0KHRoaXMpOwogICAgICByZXR1cm4gcG9wQm9vbGlmaWVkKCk7CiAgICB9CgogICAgdm9pZCBidWlsZFVwZGF0ZSgpIHsKICAgICAgZm9yIChpci5FeHByZXNzaW9uIGV4cHJlc3Npb24gaW4gbm9kZS51cGRhdGVzKSB7CiAgICAgICAgZXhwcmVzc2lvbi5hY2NlcHQodGhpcyk7CiAgICAgICAgYXNzZXJ0KCFpc0Fib3J0ZWQoKSk7CiAgICAgICAgLy8gVGhlIHJlc3VsdCBvZiB0aGUgdXBkYXRlIGluc3RydWN0aW9uIGlzbid0IHVzZWQsIGFuZCBjYW4ganVzdAogICAgICAgIC8vIGJlIGRyb3BwZWQuCiAgICAgICAgcG9wKCk7CiAgICAgIH0KICAgIH0KCiAgICB2b2lkIGJ1aWxkQm9keSgpIHsKICAgICAgbm9kZS5ib2R5LmFjY2VwdCh0aGlzKTsKICAgIH0KCiAgICBKdW1wVGFyZ2V0IGp1bXBUYXJnZXQgPSBsb2NhbHNNYXAuZ2V0SnVtcFRhcmdldEZvckZvcihub2RlKTsKICAgIGxvb3BIYW5kbGVyLmhhbmRsZUxvb3AoCiAgICAgICAgbm9kZSwKICAgICAgICBjbG9zdXJlRGF0YUxvb2t1cC5nZXRDYXB0dXJlZExvb3BTY29wZShub2RlKSwKICAgICAgICBqdW1wVGFyZ2V0LAogICAgICAgIGJ1aWxkSW5pdGlhbGl6ZXIsCiAgICAgICAgYnVpbGRDb25kaXRpb24sCiAgICAgICAgYnVpbGRVcGRhdGUsCiAgICAgICAgYnVpbGRCb2R5LAogICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRMb29wKG5vZGUpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGb3JJblN0YXRlbWVudChpci5Gb3JJblN0YXRlbWVudCBub2RlKSB7CiAgICBpZiAobm9kZS5pc0FzeW5jKSB7CiAgICAgIF9idWlsZEFzeW5jRm9ySW4obm9kZSk7CiAgICB9IGVsc2UgaWYgKF90eXBlSW5mZXJlbmNlTWFwLmlzSnNJbmRleGFibGVJdGVyYXRvcigKICAgICAgICBub2RlLCBhYnN0cmFjdFZhbHVlRG9tYWluKSkgewogICAgICAvLyBJZiB0aGUgZXhwcmVzc2lvbiBiZWluZyBpdGVyYXRlZCBvdmVyIGlzIGEgSlMgaW5kZXhhYmxlIHR5cGUsIHdlIGNhbgogICAgICAvLyBnZW5lcmF0ZSBhbiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBmb3ItaW4gdGhhdCB1c2VzIGluZGV4aW5nLgogICAgICBfYnVpbGRGb3JJbkluZGV4YWJsZShub2RlKTsKICAgIH0gZWxzZSB7CiAgICAgIF9idWlsZEZvckluSXRlcmF0b3Iobm9kZSk7CiAgICB9CiAgfQoKICAvLy8gQnVpbGRzIHRoZSBncmFwaCBmb3IgYSBmb3ItaW4gbm9kZSB3aXRoIGFuIGluZGV4YWJsZSBleHByZXNzaW9uLgogIC8vLwogIC8vLyBJbiB0aGlzIGNhc2Ugd2UgYnVpbGQ6CiAgLy8vCiAgLy8vICAgIGludCBlbmQgPSBhLmxlbmd0aDsKICAvLy8gICAgZm9yIChpbnQgaSA9IDA7CiAgLy8vICAgICAgICAgaSA8IGEubGVuZ3RoOwogIC8vLyAgICAgICAgIGNoZWNrQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKGEubGVuZ3RoID09IGVuZCwgYSksICsraSkgewogIC8vLyAgICAgIDxkZWNsYXJlZElkZW50aWZpZXI+ID0gYVtpXTsKICAvLy8gICAgICA8Ym9keT4KICAvLy8gICAgfQogIF9idWlsZEZvckluSW5kZXhhYmxlKGlyLkZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIFN5bnRoZXRpY0xvY2FsIGluZGV4VmFyaWFibGUgPSBsb2NhbHNIYW5kbGVyLmNyZWF0ZUxvY2FsKCdfaScpOwoKICAgIC8vIFRoZXNlIHZhcmlhYmxlcyBhcmUgc2hhcmVkIGJ5IGluaXRpYWxpemVyLCBjb25kaXRpb24sIGJvZHkgYW5kIHVwZGF0ZS4KICAgIEhJbnN0cnVjdGlvbiBhcnJheTsgLy8gU2V0IGluIGJ1aWxkSW5pdGlhbGl6ZXIuCiAgICBib29sIGlzRml4ZWQ7IC8vIFNldCBpbiBidWlsZEluaXRpYWxpemVyLgogICAgSEluc3RydWN0aW9uIG9yaWdpbmFsTGVuZ3RoID0gbnVsbDsgLy8gU2V0IGZvciBncm93YWJsZSBsaXN0cy4KCiAgICBISW5zdHJ1Y3Rpb24gYnVpbGRHZXRMZW5ndGgoU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgICAgSEdldExlbmd0aCByZXN1bHQgPSBuZXcgSEdldExlbmd0aCgKICAgICAgICAgIGFycmF5LCBhYnN0cmFjdFZhbHVlRG9tYWluLnBvc2l0aXZlSW50VHlwZSwKICAgICAgICAgIGlzQXNzaWduYWJsZTogIWlzRml4ZWQpCiAgICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogICAgICBhZGQocmVzdWx0KTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICB2b2lkIGJ1aWxkQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yQ2hlY2soKSB7CiAgICAgIGlmIChvcmlnaW5hbExlbmd0aCA9PSBudWxsKSByZXR1cm47CiAgICAgIC8vIFRoZSBzdGF0aWMgY2FsbCBjaGVja0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcigpIGlzIGV4cGFuZGVkIGluCiAgICAgIC8vIGNvZGVnZW4gdG86CiAgICAgIC8vCiAgICAgIC8vICAgICBhcnJheS5sZW5ndGggPT0gX2VuZCB8fCB0aHJvd0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcihhcnJheSkKICAgICAgLy8KICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPQogICAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEZvckluTW92ZU5leHQobm9kZSk7CiAgICAgIEhJbnN0cnVjdGlvbiBsZW5ndGggPSBidWlsZEdldExlbmd0aChzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIHB1c2gobmV3IEhJZGVudGl0eSgKICAgICAgICAgIGxlbmd0aCwgb3JpZ2luYWxMZW5ndGgsIG51bGwsIGFic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUpCiAgICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgX3B1c2hTdGF0aWNJbnZvY2F0aW9uKAogICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmNoZWNrQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yLAogICAgICAgICAgW3BvcCgpLCBhcnJheV0sCiAgICAgICAgICBfdHlwZUluZmVyZW5jZU1hcC5nZXRSZXR1cm5UeXBlT2YoCiAgICAgICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmNoZWNrQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKSwKICAgICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIHBvcCgpOwogICAgfQoKICAgIHZvaWQgYnVpbGRJbml0aWFsaXplcigpIHsKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPQogICAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEZvckluSXRlcmF0b3Iobm9kZSk7CgogICAgICBub2RlLml0ZXJhYmxlLmFjY2VwdCh0aGlzKTsKICAgICAgYXJyYXkgPSBwb3AoKTsKICAgICAgaXNGaXhlZCA9IGFic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAgIC5pc0ZpeGVkTGVuZ3RoSnNJbmRleGFibGUoYXJyYXkuaW5zdHJ1Y3Rpb25UeXBlKQogICAgICAgICAgLmlzRGVmaW5pdGVseVRydWU7CiAgICAgIGxvY2Fsc0hhbmRsZXIudXBkYXRlTG9jYWwoCiAgICAgICAgICBpbmRleFZhcmlhYmxlLCBncmFwaC5hZGRDb25zdGFudEludCgwLCBjbG9zZWRXb3JsZCksCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pOwogICAgICBvcmlnaW5hbExlbmd0aCA9IGJ1aWxkR2V0TGVuZ3RoKHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0KCiAgICBISW5zdHJ1Y3Rpb24gYnVpbGRDb25kaXRpb24oKSB7CiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0KICAgICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRGb3JJbk1vdmVOZXh0KG5vZGUpOwogICAgICBISW5zdHJ1Y3Rpb24gaW5kZXggPSBsb2NhbHNIYW5kbGVyLnJlYWRMb2NhbChpbmRleFZhcmlhYmxlLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgSEluc3RydWN0aW9uIGxlbmd0aCA9IGJ1aWxkR2V0TGVuZ3RoKHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgSEluc3RydWN0aW9uIGNvbXBhcmUgPQogICAgICAgICAgbmV3IEhMZXNzKGluZGV4LCBsZW5ndGgsIG51bGwsIGFic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUpCiAgICAgICAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKICAgICAgYWRkKGNvbXBhcmUpOwogICAgICByZXR1cm4gY29tcGFyZTsKICAgIH0KCiAgICB2b2lkIGJ1aWxkQm9keSgpIHsKICAgICAgLy8gSWYgd2UgaGFkIG1lY2hhbmljYWxseSBpbmxpbmVkIEFycmF5SXRlcmF0b3IubW92ZU5leHQoKSwgaXQgd291bGQgaGF2ZQogICAgICAvLyBpbnNlcnRlZCB0aGUgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yIGNoZWNrIGFzIHBhcnQgb2YgdGhlCiAgICAgIC8vIGNvbmRpdGlvbi4gIEl0IGlzIG5vdCBuZWNlc3Nhcnkgb24gdGhlIGZpcnN0IGl0ZXJhdGlvbiBzaW5jZSB0aGVyZSBpcwogICAgICAvLyBubyBjb2RlIGJldHdlZW4gY2FsbHMgdG8gYGdldCBpdGVyYXRvcmAgYW5kIGBtb3ZlTmV4dGAsIHNvIHRoZSB0ZXN0IGlzCiAgICAgIC8vIG1vdmVkIHRvIHRoZSBsb29wIHVwZGF0ZS4KCiAgICAgIC8vIEZpbmQgYSB0eXBlIGZvciB0aGUgZWxlbWVudC4gVXNlIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIGluZGV4ZXIgb2YgdGhlCiAgICAgIC8vIGFycmF5LCBhcyB0aGlzIGlzIHN0cm9uZ2VyIHRoYW4gdGhlIGl0ZXJhdG9yJ3MgYGdldCBjdXJyZW50YCB0eXBlLCBmb3IKICAgICAgLy8gZXhhbXBsZSwgYGdldCBjdXJyZW50YCBpbmNsdWRlcyBudWxsLgogICAgICAvLyBUT0RPKHNyYSk6IFRoZSBlbGVtZW50IHR5cGUgb2YgYSBjb250YWluZXIgdHlwZSBtYXNrIG1pZ2h0IGJlIGJldHRlci4KICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlID0gX3R5cGVJbmZlcmVuY2VNYXAuaW5mZXJyZWRJbmRleFR5cGUobm9kZSk7CgogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9CiAgICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkRm9ySW5DdXJyZW50KG5vZGUpOwogICAgICBISW5zdHJ1Y3Rpb24gaW5kZXggPSBsb2NhbHNIYW5kbGVyLnJlYWRMb2NhbChpbmRleFZhcmlhYmxlLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgSEluc3RydWN0aW9uIHZhbHVlID0gbmV3IEhJbmRleChhcnJheSwgaW5kZXgsIG51bGwsIHR5cGUpCiAgICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogICAgICBhZGQodmFsdWUpOwoKICAgICAgTG9jYWwgbG9vcFZhcmlhYmxlTG9jYWwgPSBsb2NhbHNNYXAuZ2V0TG9jYWxWYXJpYWJsZShub2RlLnZhcmlhYmxlKTsKICAgICAgbG9jYWxzSGFuZGxlci51cGRhdGVMb2NhbChsb29wVmFyaWFibGVMb2NhbCwgdmFsdWUsCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pOwogICAgICAvLyBIaW50IHRvIG5hbWUgbG9vcCB2YWx1ZSBhZnRlciBuYW1lIG9mIGxvb3AgdmFyaWFibGUuCiAgICAgIGlmIChsb29wVmFyaWFibGVMb2NhbCBpcyEgU3ludGhldGljTG9jYWwpIHsKICAgICAgICB2YWx1ZS5zb3VyY2VFbGVtZW50ID8/PSBsb29wVmFyaWFibGVMb2NhbDsKICAgICAgfQoKICAgICAgbm9kZS5ib2R5LmFjY2VwdCh0aGlzKTsKICAgIH0KCiAgICB2b2lkIGJ1aWxkVXBkYXRlKCkgewogICAgICAvLyBTZWUgYnVpbGRCb2R5IGFzIHRvIHdoeSB3ZSBjaGVjayBoZXJlLgogICAgICBidWlsZENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvckNoZWNrKCk7CgogICAgICAvLyBUT0RPKHNyYSk6IEl0IHdvdWxkIGJlIHNsaWdodGx5IHNob3J0ZXIgdG8gZ2VuZXJhdGUgYGFbaSsrXWAgaW4gdGhlCiAgICAgIC8vIGJvZHkgKGFuZCB0aGF0IG1vcmUgY2xvc2VseSBmb2xsb3dzIHdoYXQgYW4gaW5saW5lZCBpdGVyYXRvciB3b3VsZCBkbykKICAgICAgLy8gYnV0IHRoZSBjb2RlIGlzIGhvcnJpYmxlIGFzIGBpKzFgIGlzIGNhcnJpZWQgYXJvdW5kIHRoZSBsb29wIGluIGFuCiAgICAgIC8vIGFkZGl0aW9uYWwgdmFyaWFibGUuCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0KICAgICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRGb3JJblNldChub2RlKTsKICAgICAgSEluc3RydWN0aW9uIGluZGV4ID0gbG9jYWxzSGFuZGxlci5yZWFkTG9jYWwoaW5kZXhWYXJpYWJsZSwKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIEhJbnN0cnVjdGlvbiBvbmUgPSBncmFwaC5hZGRDb25zdGFudEludCgxLCBjbG9zZWRXb3JsZCk7CiAgICAgIEhJbnN0cnVjdGlvbiBhZGRJbnN0cnVjdGlvbiA9CiAgICAgICAgICBuZXcgSEFkZChpbmRleCwgb25lLCBudWxsLCBhYnN0cmFjdFZhbHVlRG9tYWluLnBvc2l0aXZlSW50VHlwZSkKICAgICAgICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogICAgICBhZGQoYWRkSW5zdHJ1Y3Rpb24pOwogICAgICBsb2NhbHNIYW5kbGVyLnVwZGF0ZUxvY2FsKGluZGV4VmFyaWFibGUsIGFkZEluc3RydWN0aW9uLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0KCiAgICBsb29wSGFuZGxlci5oYW5kbGVMb29wKAogICAgICAgIG5vZGUsCiAgICAgICAgY2xvc3VyZURhdGFMb29rdXAuZ2V0Q2FwdHVyZWRMb29wU2NvcGUobm9kZSksCiAgICAgICAgbG9jYWxzTWFwLmdldEp1bXBUYXJnZXRGb3JGb3JJbihub2RlKSwKICAgICAgICBidWlsZEluaXRpYWxpemVyLAogICAgICAgIGJ1aWxkQ29uZGl0aW9uLAogICAgICAgIGJ1aWxkVXBkYXRlLAogICAgICAgIGJ1aWxkQm9keSwKICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkTG9vcChub2RlKSk7CiAgfQoKICBfYnVpbGRGb3JJbkl0ZXJhdG9yKGlyLkZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIC8vIEdlbmVyYXRlIGEgc3RydWN0dXJlIGVxdWl2YWxlbnQgdG86CiAgICAvLyAgIEl0ZXJhdG9yPEU+ICRpdGVyID0gPGl0ZXJhYmxlPi5pdGVyYXRvcjsKICAgIC8vICAgd2hpbGUgKCRpdGVyLm1vdmVOZXh0KCkpIHsKICAgIC8vICAgICA8dmFyaWFibGU+ID0gJGl0ZXIuY3VycmVudDsKICAgIC8vICAgICA8Ym9keT4KICAgIC8vICAgfQoKICAgIC8vIFRoZSBpdGVyYXRvciBpcyBzaGFyZWQgYmV0d2VlbiBpbml0aWFsaXplciwgY29uZGl0aW9uIGFuZCBib2R5LgogICAgSEluc3RydWN0aW9uIGl0ZXJhdG9yOwoKICAgIHZvaWQgYnVpbGRJbml0aWFsaXplcigpIHsKICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gX3R5cGVJbmZlcmVuY2VNYXAudHlwZU9mSXRlcmF0b3Iobm9kZSk7CiAgICAgIG5vZGUuaXRlcmFibGUuYWNjZXB0KHRoaXMpOwogICAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIgPSBwb3AoKTsKICAgICAgX3B1c2hEeW5hbWljSW52b2NhdGlvbigKICAgICAgICAgIG5vZGUsCiAgICAgICAgICBtYXNrLAogICAgICAgICAgU2VsZWN0b3JzLml0ZXJhdG9yLAogICAgICAgICAgPEhJbnN0cnVjdGlvbj5bcmVjZWl2ZXJdLAogICAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEZvckluSXRlcmF0b3Iobm9kZSkpOwogICAgICBpdGVyYXRvciA9IHBvcCgpOwogICAgfQoKICAgIEhJbnN0cnVjdGlvbiBidWlsZENvbmRpdGlvbigpIHsKICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gX3R5cGVJbmZlcmVuY2VNYXAudHlwZU9mSXRlcmF0b3JNb3ZlTmV4dChub2RlKTsKICAgICAgX3B1c2hEeW5hbWljSW52b2NhdGlvbigKICAgICAgICAgIG5vZGUsCiAgICAgICAgICBtYXNrLAogICAgICAgICAgU2VsZWN0b3JzLm1vdmVOZXh0LAogICAgICAgICAgPEhJbnN0cnVjdGlvbj5baXRlcmF0b3JdLAogICAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEZvckluTW92ZU5leHQobm9kZSkpOwogICAgICByZXR1cm4gcG9wQm9vbGlmaWVkKCk7CiAgICB9CgogICAgdm9pZCBidWlsZEJvZHkoKSB7CiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0KICAgICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRGb3JJbkN1cnJlbnQobm9kZSk7CiAgICAgIEFic3RyYWN0VmFsdWUgbWFzayA9IF90eXBlSW5mZXJlbmNlTWFwLnR5cGVPZkl0ZXJhdG9yQ3VycmVudChub2RlKTsKICAgICAgX3B1c2hEeW5hbWljSW52b2NhdGlvbihub2RlLCBtYXNrLCBTZWxlY3RvcnMuY3VycmVudCwgW2l0ZXJhdG9yXSwKICAgICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bXSwgc291cmNlSW5mb3JtYXRpb24pOwoKICAgICAgTG9jYWwgbG9vcFZhcmlhYmxlTG9jYWwgPSBsb2NhbHNNYXAuZ2V0TG9jYWxWYXJpYWJsZShub2RlLnZhcmlhYmxlKTsKICAgICAgSEluc3RydWN0aW9uIHZhbHVlID0gdHlwZUJ1aWxkZXIucG90ZW50aWFsbHlDaGVja09yVHJ1c3RUeXBlT2ZBc3NpZ25tZW50KAogICAgICAgICAgcG9wKCksIF9nZXREYXJ0VHlwZUlmVmFsaWQobm9kZS52YXJpYWJsZS50eXBlKSk7CiAgICAgIGxvY2Fsc0hhbmRsZXIudXBkYXRlTG9jYWwobG9vcFZhcmlhYmxlTG9jYWwsIHZhbHVlLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgLy8gSGludCB0byBuYW1lIGxvb3AgdmFsdWUgYWZ0ZXIgbmFtZSBvZiBsb29wIHZhcmlhYmxlLgogICAgICBpZiAobG9vcFZhcmlhYmxlTG9jYWwgaXMhIFN5bnRoZXRpY0xvY2FsKSB7CiAgICAgICAgdmFsdWUuc291cmNlRWxlbWVudCA/Pz0gbG9vcFZhcmlhYmxlTG9jYWw7CiAgICAgIH0KICAgICAgbm9kZS5ib2R5LmFjY2VwdCh0aGlzKTsKICAgIH0KCiAgICBsb29wSGFuZGxlci5oYW5kbGVMb29wKAogICAgICAgIG5vZGUsCiAgICAgICAgY2xvc3VyZURhdGFMb29rdXAuZ2V0Q2FwdHVyZWRMb29wU2NvcGUobm9kZSksCiAgICAgICAgbG9jYWxzTWFwLmdldEp1bXBUYXJnZXRGb3JGb3JJbihub2RlKSwKICAgICAgICBidWlsZEluaXRpYWxpemVyLAogICAgICAgIGJ1aWxkQ29uZGl0aW9uLAogICAgICAgICgpIHt9LAogICAgICAgIGJ1aWxkQm9keSwKICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkTG9vcChub2RlKSk7CiAgfQoKICB2b2lkIF9idWlsZEFzeW5jRm9ySW4oaXIuRm9ySW5TdGF0ZW1lbnQgbm9kZSkgewogICAgLy8gVGhlIGFzeW5jLWZvciBpcyBpbXBsZW1lbnRlZCB3aXRoIGEgU3RyZWFtSXRlcmF0b3IuCiAgICBISW5zdHJ1Y3Rpb24gc3RyZWFtSXRlcmF0b3I7CgogICAgbm9kZS5pdGVyYWJsZS5hY2NlcHQodGhpcyk7CgogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGFyZ3VtZW50cyA9IFtwb3AoKV07CiAgICBDbGFzc0VudGl0eSBjbHMgPSBfY29tbW9uRWxlbWVudHMuc3RyZWFtSXRlcmF0b3I7CiAgICBEYXJ0VHlwZSB0eXBlQXJnID0gX2VsZW1lbnRNYXAuZ2V0RGFydFR5cGUobm9kZS52YXJpYWJsZS50eXBlKTsKICAgIEludGVyZmFjZVR5cGUgaW5zdGFuY2VUeXBlID0KICAgICAgICBsb2NhbHNIYW5kbGVyLnN1YnN0SW5Db250ZXh0KG5ldyBJbnRlcmZhY2VUeXBlKGNscywgW3R5cGVBcmddKSk7CiAgICBhZGRJbXBsaWNpdEluc3RhbnRpYXRpb24oaW5zdGFuY2VUeXBlKTsKICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0KICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkRm9ySW5JdGVyYXRvcihub2RlKTsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFBhc3MgdHlwZSBhcmd1bWVudHMgdG8gY29uc3RydWN0b3JzIGxpa2UgY2FsbGluZwogICAgLy8gYSBnZW5lcmljIG1ldGhvZC4KICAgIGlmIChydGlOZWVkLmNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKGNscykpIHsKICAgICAgX2FkZFR5cGVBcmd1bWVudHMoYXJndW1lbnRzLCBbdHlwZUFyZ10sIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0KICAgIENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yID0gX2NvbW1vbkVsZW1lbnRzLnN0cmVhbUl0ZXJhdG9yQ29uc3RydWN0b3I7CiAgICBfcHVzaFN0YXRpY0ludm9jYXRpb24oY29uc3RydWN0b3IsIGFyZ3VtZW50cywKICAgICAgICBfdHlwZUluZmVyZW5jZU1hcC5nZXRSZXR1cm5UeXBlT2YoY29uc3RydWN0b3IpLCBjb25zdCA8RGFydFR5cGU+W10sCiAgICAgICAgaW5zdGFuY2VUeXBlOiBpbnN0YW5jZVR5cGUsIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbik7CgogICAgc3RyZWFtSXRlcmF0b3IgPSBwb3AoKTsKCiAgICB2b2lkIGJ1aWxkSW5pdGlhbGl6ZXIoKSB7fQoKICAgIEhJbnN0cnVjdGlvbiBidWlsZENvbmRpdGlvbigpIHsKICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gX3R5cGVJbmZlcmVuY2VNYXAudHlwZU9mSXRlcmF0b3JNb3ZlTmV4dChub2RlKTsKICAgICAgX3B1c2hEeW5hbWljSW52b2NhdGlvbigKICAgICAgICAgIG5vZGUsCiAgICAgICAgICBtYXNrLAogICAgICAgICAgU2VsZWN0b3JzLm1vdmVOZXh0LAogICAgICAgICAgW3N0cmVhbUl0ZXJhdG9yXSwKICAgICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRGb3JJbk1vdmVOZXh0KG5vZGUpKTsKICAgICAgSEluc3RydWN0aW9uIGZ1dHVyZSA9IHBvcCgpOwogICAgICBwdXNoKG5ldyBIQXdhaXQoZnV0dXJlLCBhYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlKSk7CiAgICAgIHJldHVybiBwb3BCb29saWZpZWQoKTsKICAgIH0KCiAgICB2b2lkIGJ1aWxkQm9keSgpIHsKICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gX3R5cGVJbmZlcmVuY2VNYXAudHlwZU9mSXRlcmF0b3JDdXJyZW50KG5vZGUpOwogICAgICBfcHVzaER5bmFtaWNJbnZvY2F0aW9uKAogICAgICAgICAgbm9kZSwKICAgICAgICAgIG1hc2ssCiAgICAgICAgICBTZWxlY3RvcnMuY3VycmVudCwKICAgICAgICAgIFtzdHJlYW1JdGVyYXRvcl0sCiAgICAgICAgICBjb25zdCA8RGFydFR5cGU+W10sCiAgICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkRm9ySW5JdGVyYXRvcihub2RlKSk7CiAgICAgIGxvY2Fsc0hhbmRsZXIudXBkYXRlTG9jYWwoCiAgICAgICAgICBsb2NhbHNNYXAuZ2V0TG9jYWxWYXJpYWJsZShub2RlLnZhcmlhYmxlKSwgcG9wKCkpOwogICAgICBub2RlLmJvZHkuYWNjZXB0KHRoaXMpOwogICAgfQoKICAgIHZvaWQgYnVpbGRVcGRhdGUoKSB7fQoKICAgIC8vIENyZWF0ZXMgYSBzeW50aGV0aWMgdHJ5L2ZpbmFsbHkgYmxvY2sgaW4gY2FzZSBhbnl0aGluZyBhc3luYyBnb2VzIGFtaXNzLgogICAgVHJ5Q2F0Y2hGaW5hbGx5QnVpbGRlciB0cnlCdWlsZGVyID0gbmV3IFRyeUNhdGNoRmluYWxseUJ1aWxkZXIoCiAgICAgICAgdGhpcywgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZExvb3Aobm9kZSkpOwogICAgLy8gQnVpbGQgZmFrZSB0cnkgYm9keToKICAgIGxvb3BIYW5kbGVyLmhhbmRsZUxvb3AoCiAgICAgICAgbm9kZSwKICAgICAgICBjbG9zdXJlRGF0YUxvb2t1cC5nZXRDYXB0dXJlZExvb3BTY29wZShub2RlKSwKICAgICAgICBsb2NhbHNNYXAuZ2V0SnVtcFRhcmdldEZvckZvckluKG5vZGUpLAogICAgICAgIGJ1aWxkSW5pdGlhbGl6ZXIsCiAgICAgICAgYnVpbGRDb25kaXRpb24sCiAgICAgICAgYnVpbGRVcGRhdGUsCiAgICAgICAgYnVpbGRCb2R5LAogICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRMb29wKG5vZGUpKTsKCiAgICB2b2lkIGZpbmFsaXplckZ1bmN0aW9uKCkgewogICAgICBfcHVzaER5bmFtaWNJbnZvY2F0aW9uKAogICAgICAgICAgbm9kZSwKICAgICAgICAgIG51bGwsCiAgICAgICAgICBTZWxlY3RvcnMuY2FuY2VsLAogICAgICAgICAgW3N0cmVhbUl0ZXJhdG9yXSwKICAgICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIKICAgICAgICAgICAgICAvLyBpZ25vcmU6ZGVwcmVjYXRlZF9tZW1iZXJfdXNlX2Zyb21fc2FtZV9wYWNrYWdlCiAgICAgICAgICAgICAgLmJ1aWxkR2VuZXJpYyhub2RlKSk7CiAgICAgIGFkZChuZXcgSEF3YWl0KHBvcCgpLCBhYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlKSk7CiAgICB9CgogICAgdHJ5QnVpbGRlcgogICAgICAuLmNsb3NlVHJ5Qm9keSgpCiAgICAgIC4uYnVpbGRGaW5hbGx5QmxvY2soZmluYWxpemVyRnVuY3Rpb24pCiAgICAgIC4uY2xlYW5VcCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIGNhbGxTZXRSdW50aW1lVHlwZUluZm8oSEluc3RydWN0aW9uIHR5cGVJbmZvLAogICAgICBISW5zdHJ1Y3Rpb24gbmV3T2JqZWN0LCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgLy8gU2V0IHRoZSBydW50aW1lIHR5cGUgaW5mb3JtYXRpb24gb24gdGhlIG9iamVjdC4KICAgIEZ1bmN0aW9uRW50aXR5IHR5cGVJbmZvU2V0dGVyRm4gPSBfY29tbW9uRWxlbWVudHMuc2V0UnVudGltZVR5cGVJbmZvOwogICAgLy8gVE9ETyhlZm9ydHVuYSk6IEluc2VydCBzb3VyY2UgaW5mb3JtYXRpb24gaW4gdGhpcyBzdGF0aWMgaW52b2NhdGlvbi4KICAgIF9wdXNoU3RhdGljSW52b2NhdGlvbih0eXBlSW5mb1NldHRlckZuLCA8SEluc3RydWN0aW9uPltuZXdPYmplY3QsIHR5cGVJbmZvXSwKICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlLCBjb25zdCA8RGFydFR5cGU+W10sCiAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgICAvLyBUaGUgbmV3IG9iamVjdCB3aWxsIG5vdyBiZSByZWZlcmVuY2VkIHRocm91Z2ggdGhlCiAgICAvLyBgc2V0UnVudGltZVR5cGVJbmZvYCBjYWxsLiBXZSB0aGVyZWZvcmUgc2V0IHRoZSB0eXBlIG9mIHRoYXQKICAgIC8vIGluc3RydWN0aW9uIHRvIGJlIG9mIHRoZSBvYmplY3QncyB0eXBlLgogICAgYXNzZXJ0KAogICAgICAgIHN0YWNrLmxhc3QgaXMgSEludm9rZVN0YXRpYyB8fCBzdGFjay5sYXN0ID09IG5ld09iamVjdCwKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICAgICAgIlVuZXhwZWN0ZWQgYHN0YWNrLmxhc3RgOiBGb3VuZCAke3N0YWNrLmxhc3R9LCAiCiAgICAgICAgICAgICJleHBlY3RlZCAke25ld09iamVjdH0gb3IgYW4gSEludm9rZVN0YXRpYy4gIgogICAgICAgICAgICAiU3RhdGU6IHR5cGVJbmZvPSR0eXBlSW5mbywgc3RhY2s9JHN0YWNrLiIpKTsKICAgIHN0YWNrLmxhc3QuaW5zdHJ1Y3Rpb25UeXBlID0gbmV3T2JqZWN0Lmluc3RydWN0aW9uVHlwZTsKICAgIHJldHVybiBwb3AoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRXaGlsZVN0YXRlbWVudChpci5XaGlsZVN0YXRlbWVudCBub2RlKSB7CiAgICBhc3NlcnQoaXNSZWFjaGFibGUpOwogICAgSEluc3RydWN0aW9uIGJ1aWxkQ29uZGl0aW9uKCkgewogICAgICBub2RlLmNvbmRpdGlvbi5hY2NlcHQodGhpcyk7CiAgICAgIHJldHVybiBwb3BCb29saWZpZWQoKTsKICAgIH0KCiAgICBsb29wSGFuZGxlci5oYW5kbGVMb29wKAogICAgICAgIG5vZGUsCiAgICAgICAgY2xvc3VyZURhdGFMb29rdXAuZ2V0Q2FwdHVyZWRMb29wU2NvcGUobm9kZSksCiAgICAgICAgbG9jYWxzTWFwLmdldEp1bXBUYXJnZXRGb3JXaGlsZShub2RlKSwKICAgICAgICAoKSB7fSwKICAgICAgICBidWlsZENvbmRpdGlvbiwKICAgICAgICAoKSB7fSwgKCkgewogICAgICBub2RlLmJvZHkuYWNjZXB0KHRoaXMpOwogICAgfSwgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZExvb3Aobm9kZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXREb1N0YXRlbWVudChpci5Eb1N0YXRlbWVudCBub2RlKSB7CiAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9CiAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZExvb3Aobm9kZSk7CiAgICAvLyBUT0RPKGVmb3J0dW5hKTogSSB0aGluayB0aGlzIGNhbiBiZSByZXdyaXR0ZW4gdXNpbmcKICAgIC8vIExvb3BIYW5kbGVyLmhhbmRsZUxvb3Agd2l0aCBzb21lIHRyaWNrcyBhYm91dCB3aGVuIHRoZSAidXBkYXRlIiBoYXBwZW5zLgogICAgTG9jYWxzSGFuZGxlciBzYXZlZExvY2FscyA9IG5ldyBMb2NhbHNIYW5kbGVyLmZyb20obG9jYWxzSGFuZGxlcik7CiAgICBDYXB0dXJlZExvb3BTY29wZSBsb29wQ2xvc3VyZUluZm8gPQogICAgICAgIGNsb3N1cmVEYXRhTG9va3VwLmdldENhcHR1cmVkTG9vcFNjb3BlKG5vZGUpOwogICAgbG9jYWxzSGFuZGxlci5zdGFydExvb3AobG9vcENsb3N1cmVJbmZvLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBKdW1wVGFyZ2V0IHRhcmdldCA9IGxvY2Fsc01hcC5nZXRKdW1wVGFyZ2V0Rm9yRG8obm9kZSk7CiAgICBKdW1wSGFuZGxlciBqdW1wSGFuZGxlciA9IGxvb3BIYW5kbGVyLmJlZ2luTG9vcEhlYWRlcihub2RlLCB0YXJnZXQpOwogICAgSExvb3BJbmZvcm1hdGlvbiBsb29wSW5mbyA9IGN1cnJlbnQubG9vcEluZm9ybWF0aW9uOwogICAgSEJhc2ljQmxvY2sgbG9vcEVudHJ5QmxvY2sgPSBjdXJyZW50OwogICAgSEJhc2ljQmxvY2sgYm9keUVudHJ5QmxvY2sgPSBjdXJyZW50OwogICAgYm9vbCBoYXNDb250aW51ZXMgPSB0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQuaXNDb250aW51ZVRhcmdldDsKICAgIGlmIChoYXNDb250aW51ZXMpIHsKICAgICAgLy8gQWRkIGV4dHJhIGJsb2NrIHRvIGhhbmcgbGFiZWxzIG9uLgogICAgICAvLyBJdCBkb2Vzbid0IGN1cnJlbnRseSB3b3JrIGlmIHRoZXkgYXJlIG9uIHRoZSBzYW1lIGJsb2NrIGFzIHRoZQogICAgICAvLyBITG9vcEluZm8uIFRoZSBoYW5kbGluZyBvZiBITGFiZWxlZEJsb2NrSW5mb3JtYXRpb24gd2lsbCB2aXNpdCBhCiAgICAgIC8vIFN1YkdyYXBoIHRoYXQgc3RhcnRzIGF0IHRoZSBzYW1lIGJsb2NrIGFnYWluLCBzbyB0aGUgSExvb3BJbmZvIGlzCiAgICAgIC8vIGVpdGhlciBoYW5kbGVkIHR3aWNlLCBvciBpdCdzIGhhbmRsZWQgYWZ0ZXIgdGhlIGxhYmVsZWQgYmxvY2sgaW5mbywKICAgICAgLy8gYm90aCBvZiB3aGljaCBnZW5lcmF0ZSB0aGUgd3JvbmcgY29kZS4KICAgICAgLy8gVXNpbmcgYSBzZXBhcmF0ZSBibG9jayBpcyBqdXN0IGEgc2ltcGxlIHdvcmthcm91bmQuCiAgICAgIGJvZHlFbnRyeUJsb2NrID0gb3Blbk5ld0Jsb2NrKCk7CiAgICB9CiAgICBsb2NhbHNIYW5kbGVyLmVudGVyTG9vcEJvZHkobG9vcENsb3N1cmVJbmZvLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBub2RlLmJvZHkuYWNjZXB0KHRoaXMpOwoKICAgIC8vIElmIHRoZXJlIGFyZSBubyBjb250aW51ZXMgd2UgY291bGQgYXZvaWQgdGhlIGNyZWF0aW9uIG9mIHRoZSBjb25kaXRpb24KICAgIC8vIGJsb2NrLiBUaGlzIGNvdWxkIGFsc28gbGVhZCB0byBhIGJsb2NrIGhhdmluZyBtdWx0aXBsZSBlbnRyaWVzIGFuZCBleGl0cy4KICAgIEhCYXNpY0Jsb2NrIGJvZHlFeGl0QmxvY2s7CiAgICBib29sIGlzQWJvcnRpbmdCb2R5ID0gZmFsc2U7CiAgICBpZiAoY3VycmVudCAhPSBudWxsKSB7CiAgICAgIGJvZHlFeGl0QmxvY2sgPSBjbG9zZShuZXcgSEdvdG8oYWJzdHJhY3RWYWx1ZURvbWFpbikpOwogICAgfSBlbHNlIHsKICAgICAgaXNBYm9ydGluZ0JvZHkgPSB0cnVlOwogICAgICBib2R5RXhpdEJsb2NrID0gbGFzdE9wZW5lZEJsb2NrOwogICAgfQoKICAgIFN1YkV4cHJlc3Npb24gY29uZGl0aW9uRXhwcmVzc2lvbjsKICAgIGJvb2wgbG9vcElzRGVnZW5lcmF0ZSA9IGlzQWJvcnRpbmdCb2R5ICYmICFoYXNDb250aW51ZXM7CiAgICBpZiAoIWxvb3BJc0RlZ2VuZXJhdGUpIHsKICAgICAgSEJhc2ljQmxvY2sgY29uZGl0aW9uQmxvY2sgPSBhZGROZXdCbG9jaygpOwoKICAgICAgTGlzdDxMb2NhbHNIYW5kbGVyPiBjb250aW51ZUhhbmRsZXJzID0gPExvY2Fsc0hhbmRsZXI+W107CiAgICAgIGp1bXBIYW5kbGVyCiAgICAgICAgICAuZm9yRWFjaENvbnRpbnVlKChIQ29udGludWUgaW5zdHJ1Y3Rpb24sIExvY2Fsc0hhbmRsZXIgbG9jYWxzKSB7CiAgICAgICAgaW5zdHJ1Y3Rpb24uYmxvY2suYWRkU3VjY2Vzc29yKGNvbmRpdGlvbkJsb2NrKTsKICAgICAgICBjb250aW51ZUhhbmRsZXJzLmFkZChsb2NhbHMpOwogICAgICB9KTsKCiAgICAgIGlmICghaXNBYm9ydGluZ0JvZHkpIHsKICAgICAgICBib2R5RXhpdEJsb2NrLmFkZFN1Y2Nlc3Nvcihjb25kaXRpb25CbG9jayk7CiAgICAgIH0KCiAgICAgIGlmICghY29udGludWVIYW5kbGVycy5pc0VtcHR5KSB7CiAgICAgICAgaWYgKCFpc0Fib3J0aW5nQm9keSkgY29udGludWVIYW5kbGVycy5hZGQobG9jYWxzSGFuZGxlcik7CiAgICAgICAgbG9jYWxzSGFuZGxlciA9CiAgICAgICAgICAgIHNhdmVkTG9jYWxzLm1lcmdlTXVsdGlwbGUoY29udGludWVIYW5kbGVycywgY29uZGl0aW9uQmxvY2spOwogICAgICAgIFN1YkdyYXBoIGJvZHlHcmFwaCA9IG5ldyBTdWJHcmFwaChib2R5RW50cnlCbG9jaywgYm9keUV4aXRCbG9jayk7CiAgICAgICAgTGlzdDxMYWJlbERlZmluaXRpb24+IGxhYmVscyA9IGp1bXBIYW5kbGVyLmxhYmVsczsKICAgICAgICBIU3ViR3JhcGhCbG9ja0luZm9ybWF0aW9uIGJvZHlJbmZvID0KICAgICAgICAgICAgbmV3IEhTdWJHcmFwaEJsb2NrSW5mb3JtYXRpb24oYm9keUdyYXBoKTsKICAgICAgICBITGFiZWxlZEJsb2NrSW5mb3JtYXRpb24gaW5mbzsKICAgICAgICBpZiAoIWxhYmVscy5pc0VtcHR5KSB7CiAgICAgICAgICBpbmZvID0KICAgICAgICAgICAgICBuZXcgSExhYmVsZWRCbG9ja0luZm9ybWF0aW9uKGJvZHlJbmZvLCBsYWJlbHMsIGlzQ29udGludWU6IHRydWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbmZvID0gbmV3IEhMYWJlbGVkQmxvY2tJbmZvcm1hdGlvbi5pbXBsaWNpdChib2R5SW5mbywgdGFyZ2V0LAogICAgICAgICAgICAgIGlzQ29udGludWU6IHRydWUpOwogICAgICAgIH0KICAgICAgICBib2R5RW50cnlCbG9jay5zZXRCbG9ja0Zsb3coaW5mbywgY29uZGl0aW9uQmxvY2spOwogICAgICB9CiAgICAgIG9wZW4oY29uZGl0aW9uQmxvY2spOwoKICAgICAgbm9kZS5jb25kaXRpb24uYWNjZXB0KHRoaXMpOwogICAgICBhc3NlcnQoIWlzQWJvcnRlZCgpKTsKICAgICAgSEluc3RydWN0aW9uIGNvbmRpdGlvbkluc3RydWN0aW9uID0gcG9wQm9vbGlmaWVkKCk7CiAgICAgIEhCYXNpY0Jsb2NrIGNvbmRpdGlvbkVuZEJsb2NrID0gY2xvc2UobmV3IEhMb29wQnJhbmNoKGFic3RyYWN0VmFsdWVEb21haW4sCiAgICAgICAgICBjb25kaXRpb25JbnN0cnVjdGlvbiwgSExvb3BCcmFuY2guRE9fV0hJTEVfTE9PUCkpOwoKICAgICAgSEJhc2ljQmxvY2sgYXZvaWRDcml0aWNhbEVkZ2UgPSBhZGROZXdCbG9jaygpOwogICAgICBjb25kaXRpb25FbmRCbG9jay5hZGRTdWNjZXNzb3IoYXZvaWRDcml0aWNhbEVkZ2UpOwogICAgICBvcGVuKGF2b2lkQ3JpdGljYWxFZGdlKTsKICAgICAgY2xvc2UobmV3IEhHb3RvKGFic3RyYWN0VmFsdWVEb21haW4pKTsKICAgICAgYXZvaWRDcml0aWNhbEVkZ2UuYWRkU3VjY2Vzc29yKGxvb3BFbnRyeUJsb2NrKTsgLy8gVGhlIGJhY2stZWRnZS4KCiAgICAgIGNvbmRpdGlvbkV4cHJlc3Npb24gPQogICAgICAgICAgbmV3IFN1YkV4cHJlc3Npb24oY29uZGl0aW9uQmxvY2ssIGNvbmRpdGlvbkVuZEJsb2NrKTsKCiAgICAgIC8vIEF2b2lkIGEgY3JpdGljYWwgZWRnZSBmcm9tIHRoZSBjb25kaXRpb24gdG8gdGhlIGxvb3AtZXhpdCBib2R5LgogICAgICBIQmFzaWNCbG9jayBjb25kaXRpb25FeGl0QmxvY2sgPSBhZGROZXdCbG9jaygpOwogICAgICBvcGVuKGNvbmRpdGlvbkV4aXRCbG9jayk7CiAgICAgIGNsb3NlKG5ldyBIR290byhhYnN0cmFjdFZhbHVlRG9tYWluKSk7CiAgICAgIGNvbmRpdGlvbkVuZEJsb2NrLmFkZFN1Y2Nlc3Nvcihjb25kaXRpb25FeGl0QmxvY2spOwoKICAgICAgbG9vcEhhbmRsZXIuZW5kTG9vcCgKICAgICAgICAgIGxvb3BFbnRyeUJsb2NrLCBjb25kaXRpb25FeGl0QmxvY2ssIGp1bXBIYW5kbGVyLCBsb2NhbHNIYW5kbGVyKTsKCiAgICAgIGxvb3BFbnRyeUJsb2NrLnBvc3RQcm9jZXNzTG9vcEhlYWRlcigpOwogICAgICBTdWJHcmFwaCBib2R5R3JhcGggPSBuZXcgU3ViR3JhcGgobG9vcEVudHJ5QmxvY2ssIGJvZHlFeGl0QmxvY2spOwogICAgICBITG9vcEJsb2NrSW5mb3JtYXRpb24gbG9vcEJsb2NrSW5mbyA9IG5ldyBITG9vcEJsb2NrSW5mb3JtYXRpb24oCiAgICAgICAgICBITG9vcEJsb2NrSW5mb3JtYXRpb24uRE9fV0hJTEVfTE9PUCwKICAgICAgICAgIG51bGwsCiAgICAgICAgICB3cmFwRXhwcmVzc2lvbkdyYXBoKGNvbmRpdGlvbkV4cHJlc3Npb24pLAogICAgICAgICAgd3JhcFN0YXRlbWVudEdyYXBoKGJvZHlHcmFwaCksCiAgICAgICAgICBudWxsLAogICAgICAgICAgbG9vcEVudHJ5QmxvY2subG9vcEluZm9ybWF0aW9uLnRhcmdldCwKICAgICAgICAgIGxvb3BFbnRyeUJsb2NrLmxvb3BJbmZvcm1hdGlvbi5sYWJlbHMsCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIGxvb3BFbnRyeUJsb2NrLnNldEJsb2NrRmxvdyhsb29wQmxvY2tJbmZvLCBjdXJyZW50KTsKICAgICAgbG9vcEluZm8ubG9vcEJsb2NrSW5mb3JtYXRpb24gPSBsb29wQmxvY2tJbmZvOwogICAgfSBlbHNlIHsKICAgICAgLy8gU2luY2UgdGhlIGxvb3AgaGFzIG5vIGJhY2sgZWRnZSwgd2UgcmVtb3ZlIHRoZSBsb29wIGluZm9ybWF0aW9uIG9uIHRoZQogICAgICAvLyBoZWFkZXIuCiAgICAgIGxvb3BFbnRyeUJsb2NrLmxvb3BJbmZvcm1hdGlvbiA9IG51bGw7CgogICAgICBpZiAoanVtcEhhbmRsZXIuaGFzQW55QnJlYWsoKSkgewogICAgICAgIC8vIE51bGwgYnJhbmNoQmxvY2sgYmVjYXVzZSB0aGUgYm9keSBvZiB0aGUgZG8td2hpbGUgbG9vcCBhbHdheXMgYWJvcnRzLAogICAgICAgIC8vIHNvIHdlIG5ldmVyIGdldCB0byB0aGUgY29uZGl0aW9uLgogICAgICAgIGxvb3BIYW5kbGVyLmVuZExvb3AobG9vcEVudHJ5QmxvY2ssIG51bGwsIGp1bXBIYW5kbGVyLCBsb2NhbHNIYW5kbGVyKTsKCiAgICAgICAgLy8gU2luY2UgdGhlIGJvZHkgb2YgdGhlIGxvb3AgaGFzIGEgYnJlYWssIHdlIGF0dGFjaCBhIHN5bnRoZXNpemVkIGxhYmVsCiAgICAgICAgLy8gdG8gdGhlIGJvZHkuCiAgICAgICAgU3ViR3JhcGggYm9keUdyYXBoID0gbmV3IFN1YkdyYXBoKGJvZHlFbnRyeUJsb2NrLCBib2R5RXhpdEJsb2NrKTsKICAgICAgICBKdW1wVGFyZ2V0IHRhcmdldCA9IGxvY2Fsc01hcC5nZXRKdW1wVGFyZ2V0Rm9yRG8obm9kZSk7CiAgICAgICAgTGFiZWxEZWZpbml0aW9uIGxhYmVsID0gdGFyZ2V0LmFkZExhYmVsKCdsb29wJywgaXNCcmVha1RhcmdldDogdHJ1ZSk7CiAgICAgICAgSExhYmVsZWRCbG9ja0luZm9ybWF0aW9uIGluZm8gPSBuZXcgSExhYmVsZWRCbG9ja0luZm9ybWF0aW9uKAogICAgICAgICAgICBuZXcgSFN1YkdyYXBoQmxvY2tJbmZvcm1hdGlvbihib2R5R3JhcGgpLCA8TGFiZWxEZWZpbml0aW9uPltsYWJlbF0pOwogICAgICAgIGxvb3BFbnRyeUJsb2NrLnNldEJsb2NrRmxvdyhpbmZvLCBjdXJyZW50KTsKICAgICAgICBqdW1wSGFuZGxlci5mb3JFYWNoQnJlYWsoKEhCcmVhayBicmVha0luc3RydWN0aW9uLCBfKSB7CiAgICAgICAgICBIQmFzaWNCbG9jayBibG9jayA9IGJyZWFrSW5zdHJ1Y3Rpb24uYmxvY2s7CiAgICAgICAgICBibG9jay5hZGRBdEV4aXQobmV3IEhCcmVhay50b0xhYmVsKAogICAgICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4sIGxhYmVsLCBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICAgICAgYmxvY2sucmVtb3ZlKGJyZWFrSW5zdHJ1Y3Rpb24pOwogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICBqdW1wSGFuZGxlci5jbG9zZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdElmU3RhdGVtZW50KGlyLklmU3RhdGVtZW50IG5vZGUpIHsKICAgIGhhbmRsZUlmKAogICAgICAgIHZpc2l0Q29uZGl0aW9uOiAoKSA9PiBub2RlLmNvbmRpdGlvbi5hY2NlcHQodGhpcyksCiAgICAgICAgdmlzaXRUaGVuOiAoKSA9PiBub2RlLnRoZW4uYWNjZXB0KHRoaXMpLAogICAgICAgIHZpc2l0RWxzZTogKCkgPT4gbm9kZS5vdGhlcndpc2U/LmFjY2VwdCh0aGlzKSwKICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZElmKG5vZGUpKTsKICB9CgogIHZvaWQgaGFuZGxlSWYoCiAgICAgIHtpci5Ob2RlIG5vZGUsCiAgICAgIHZvaWQgdmlzaXRDb25kaXRpb24oKSwKICAgICAgdm9pZCB2aXNpdFRoZW4oKSwKICAgICAgdm9pZCB2aXNpdEVsc2UoKSwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb259KSB7CiAgICBTc2FCcmFuY2hCdWlsZGVyIGJyYW5jaEJ1aWxkZXIgPSBuZXcgU3NhQnJhbmNoQnVpbGRlcih0aGlzLAogICAgICAgIG5vZGUgPT0gbnVsbCA/IG51bGwgOiBfZWxlbWVudE1hcC5nZXRTcGFubmFibGUodGFyZ2V0RWxlbWVudCwgbm9kZSkpOwogICAgYnJhbmNoQnVpbGRlci5oYW5kbGVJZih2aXNpdENvbmRpdGlvbiwgdmlzaXRUaGVuLCB2aXNpdEVsc2UsCiAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRBc0V4cHJlc3Npb24oaXIuQXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIGlyLkV4cHJlc3Npb24gb3BlcmFuZCA9IG5vZGUub3BlcmFuZDsKICAgIG9wZXJhbmQuYWNjZXB0KHRoaXMpOwoKICAgIERhcnRUeXBlIG9wZXJhbmRUeXBlID0gX2dldFN0YXRpY1R5cGUob3BlcmFuZCk7CiAgICBEYXJ0VHlwZSB0eXBlID0gX2VsZW1lbnRNYXAuZ2V0RGFydFR5cGUobm9kZS50eXBlKTsKICAgIGlmIChfZWxlbWVudE1hcC50eXBlcy5pc1N1YnR5cGUob3BlcmFuZFR5cGUsIHR5cGUpKSB7CiAgICAgIC8vIFNraXAgdW5uZWVkZWQgY2FzdHMuCiAgICAgIGlmIChvcGVyYW5kIGlzISBpci5Qcm9wZXJ0eUdldCkgewogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFN1cHBvcnQgcHJvcGVydHkgZ2V0LiBDdXJyZW50bHkgQ0ZFIGluc2VydHMKICAgICAgICAvLyBhIHNlZW1pbmdseSB1bm5lY2Vzc2FyeSBjYXN0IG9uIHRlYXJvZmZzIHRoYXQgY29udGFpbiB0eXBlIHZhcmlhYmxlcwogICAgICAgIC8vIGluIGNvbnRyYXZhcmlhbnQgcG9zaXRpb25zLiBTaW5jZSB0aGVzZSBjYXN0cyBhcmUgbm90IG1hcmtlZCB3ZQogICAgICAgIC8vIGNhbm5vdCBlYXNpbHkgZGV0ZWN0IHdoZW4gd2UgYWN0dWFsbHkgbmVlZCB0aGUgY2FzdC4gU2VlIHRlc3QKICAgICAgICAvLyBgbGFuZ3VhZ2VfMi9pbnN0YW50aWF0ZV90ZWFyb2ZmX2FmdGVyX2NvbnRyYXZhcmlhbmNlX2NoZWNrX3Rlc3RgLgogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQoKICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0KICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkQXMobm9kZSk7CiAgICBISW5zdHJ1Y3Rpb24gZXhwcmVzc2lvbkluc3RydWN0aW9uID0gcG9wKCk7CgogICAgaWYgKG5vZGUudHlwZSBpcyBpci5JbnZhbGlkVHlwZSkgewogICAgICBnZW5lcmF0ZVR5cGVFcnJvcignaW52YWxpZCB0eXBlJywgc291cmNlSW5mb3JtYXRpb24pOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCghbm9kZS5pc1R5cGVFcnJvciAmJiAhb3B0aW9ucy5vbWl0QXNDYXN0cykgfHwKICAgICAgICBvcHRpb25zLmltcGxpY2l0RG93bmNhc3RDaGVja1BvbGljeS5pc0VtaXR0ZWQpIHsKICAgICAgSEluc3RydWN0aW9uIGNvbnZlcnRlZCA9IHR5cGVCdWlsZGVyLmJ1aWxkVHlwZUNvbnZlcnNpb24oCiAgICAgICAgICBleHByZXNzaW9uSW5zdHJ1Y3Rpb24sCiAgICAgICAgICBsb2NhbHNIYW5kbGVyLnN1YnN0SW5Db250ZXh0KHR5cGUpLAogICAgICAgICAgbm9kZS5pc1R5cGVFcnJvcgogICAgICAgICAgICAgID8gSFR5cGVDb252ZXJzaW9uLkNIRUNLRURfTU9ERV9DSEVDSwogICAgICAgICAgICAgIDogSFR5cGVDb252ZXJzaW9uLkNBU1RfVFlQRV9DSEVDSywKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIGlmIChjb252ZXJ0ZWQgIT0gZXhwcmVzc2lvbkluc3RydWN0aW9uKSB7CiAgICAgICAgYWRkKGNvbnZlcnRlZCk7CiAgICAgIH0KICAgICAgc3RhY2suYWRkKGNvbnZlcnRlZCk7CiAgICB9IGVsc2UgewogICAgICBzdGFjay5hZGQoZXhwcmVzc2lvbkluc3RydWN0aW9uKTsKICAgIH0KICB9CgogIHZvaWQgZ2VuZXJhdGVFcnJvcihGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwgU3RyaW5nIG1lc3NhZ2UsCiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZU1hc2ssIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBISW5zdHJ1Y3Rpb24gZXJyb3JNZXNzYWdlID0gZ3JhcGguYWRkQ29uc3RhbnRTdHJpbmcobWVzc2FnZSwgY2xvc2VkV29ybGQpOwogICAgX3B1c2hTdGF0aWNJbnZvY2F0aW9uKAogICAgICAgIGZ1bmN0aW9uLCBbZXJyb3JNZXNzYWdlXSwgdHlwZU1hc2ssIGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgdm9pZCBnZW5lcmF0ZVR5cGVFcnJvcihTdHJpbmcgbWVzc2FnZSwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIGdlbmVyYXRlRXJyb3IoCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLnRocm93VHlwZUVycm9yLAogICAgICAgIG1lc3NhZ2UsCiAgICAgICAgX3R5cGVJbmZlcmVuY2VNYXAuZ2V0UmV0dXJuVHlwZU9mKF9jb21tb25FbGVtZW50cy50aHJvd1R5cGVFcnJvciksCiAgICAgICAgc291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgdm9pZCBnZW5lcmF0ZVVuc3VwcG9ydGVkRXJyb3IoCiAgICAgIFN0cmluZyBtZXNzYWdlLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgZ2VuZXJhdGVFcnJvcigKICAgICAgICBfY29tbW9uRWxlbWVudHMudGhyb3dVbnN1cHBvcnRlZEVycm9yLAogICAgICAgIG1lc3NhZ2UsCiAgICAgICAgX3R5cGVJbmZlcmVuY2VNYXAKICAgICAgICAgICAgLmdldFJldHVyblR5cGVPZihfY29tbW9uRWxlbWVudHMudGhyb3dVbnN1cHBvcnRlZEVycm9yKSwKICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXNzZXJ0U3RhdGVtZW50KGlyLkFzc2VydFN0YXRlbWVudCBub2RlKSB7CiAgICBpZiAoIW9wdGlvbnMuZW5hYmxlVXNlckFzc2VydGlvbnMpIHJldHVybjsKICAgIHZhciBzb3VyY2VJbmZvcm1hdGlvbiA9IF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRBc3NlcnQobm9kZSk7CiAgICBpZiAobm9kZS5tZXNzYWdlID09IG51bGwpIHsKICAgICAgbm9kZS5jb25kaXRpb24uYWNjZXB0KHRoaXMpOwogICAgICBfcHVzaFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgICBfY29tbW9uRWxlbWVudHMuYXNzZXJ0SGVscGVyLAogICAgICAgICAgPEhJbnN0cnVjdGlvbj5bcG9wKCldLAogICAgICAgICAgX3R5cGVJbmZlcmVuY2VNYXAuZ2V0UmV0dXJuVHlwZU9mKF9jb21tb25FbGVtZW50cy5hc3NlcnRIZWxwZXIpLAogICAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgcG9wKCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBpZiAoYXNzZXJ0VGVzdChjb25kaXRpb24pKSBhc3NlcnRUaHJvdyhtZXNzYWdlKTsKICAgIHZvaWQgYnVpbGRDb25kaXRpb24oKSB7CiAgICAgIG5vZGUuY29uZGl0aW9uLmFjY2VwdCh0aGlzKTsKICAgICAgX3B1c2hTdGF0aWNJbnZvY2F0aW9uKAogICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmFzc2VydFRlc3QsCiAgICAgICAgICA8SEluc3RydWN0aW9uPltwb3AoKV0sCiAgICAgICAgICBfdHlwZUluZmVyZW5jZU1hcC5nZXRSZXR1cm5UeXBlT2YoX2NvbW1vbkVsZW1lbnRzLmFzc2VydFRlc3QpLAogICAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0KCiAgICB2b2lkIGZhaWwoKSB7CiAgICAgIG5vZGUubWVzc2FnZS5hY2NlcHQodGhpcyk7CiAgICAgIF9wdXNoU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgIF9jb21tb25FbGVtZW50cy5hc3NlcnRUaHJvdywKICAgICAgICAgIDxISW5zdHJ1Y3Rpb24+W3BvcCgpXSwKICAgICAgICAgIF90eXBlSW5mZXJlbmNlTWFwLmdldFJldHVyblR5cGVPZihfY29tbW9uRWxlbWVudHMuYXNzZXJ0VGhyb3cpLAogICAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgcG9wKCk7CiAgICB9CgogICAgaGFuZGxlSWYodmlzaXRDb25kaXRpb246IGJ1aWxkQ29uZGl0aW9uLCB2aXNpdFRoZW46IGZhaWwpOwogIH0KCiAgLy8vIENyZWF0ZXMgYSBbSnVtcEhhbmRsZXJdIGZvciBhIHN0YXRlbWVudC4gVGhlIG5vZGUgbXVzdCBiZSBhIGp1bXAKICAvLy8gdGFyZ2V0LiBJZiB0aGVyZSBhcmUgbm8gYnJlYWtzIG9yIGNvbnRpbnVlcyB0YXJnZXRpbmcgdGhlIHN0YXRlbWVudCwKICAvLy8gYSBzcGVjaWFsICJudWxsIGhhbmRsZXIiIGlzIHJldHVybmVkLgogIC8vLwogIC8vLyBbaXNMb29wSnVtcF0gaXMgdHJ1ZSB3aGVuIHRoZSBqdW1wIGhhbmRsZXIgaXMgZm9yIGEgbG9vcC4gVGhpcyBpcyB1c2VkCiAgLy8vIHRvIGRpc3Rpbmd1aXNoIHRoZSBzeW50aGVzaXplZCBsb29wIGNyZWF0ZWQgZm9yIGEgc3dpdGNoIHN0YXRlbWVudCB3aXRoCiAgLy8vIGNvbnRpbnVlIHN0YXRlbWVudHMgZnJvbSBzaW1wbGUgc3dpdGNoIHN0YXRlbWVudHMuCiAgSnVtcEhhbmRsZXIgY3JlYXRlSnVtcEhhbmRsZXIoaXIuVHJlZU5vZGUgbm9kZSwgSnVtcFRhcmdldCB0YXJnZXQsCiAgICAgIHtib29sIGlzTG9vcEp1bXA6IGZhbHNlfSkgewogICAgaWYgKHRhcmdldCA9PSBudWxsKSB7CiAgICAgIC8vIE5vIGJyZWFrcyBvciBjb250aW51ZXMgdG8gdGhpcyBub2RlLgogICAgICByZXR1cm4gbmV3IE51bGxKdW1wSGFuZGxlcihyZXBvcnRlcik7CiAgICB9CiAgICBpZiAoaXNMb29wSnVtcCAmJiBub2RlIGlzIGlyLlN3aXRjaFN0YXRlbWVudCkgewogICAgICByZXR1cm4gbmV3IEtlcm5lbFN3aXRjaENhc2VKdW1wSGFuZGxlcih0aGlzLCB0YXJnZXQsIG5vZGUsIGxvY2Fsc01hcCk7CiAgICB9CgogICAgcmV0dXJuIG5ldyBKdW1wSGFuZGxlcih0aGlzLCB0YXJnZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJyZWFrU3RhdGVtZW50KGlyLkJyZWFrU3RhdGVtZW50IG5vZGUpIHsKICAgIGFzc2VydCghaXNBYm9ydGVkKCkpOwogICAgaGFuZGxlSW5UcnlTdGF0ZW1lbnQoKTsKICAgIEp1bXBUYXJnZXQgdGFyZ2V0ID0gbG9jYWxzTWFwLmdldEp1bXBUYXJnZXRGb3JCcmVhayhub2RlKTsKICAgIGFzc2VydCh0YXJnZXQgIT0gbnVsbCk7CiAgICBKdW1wSGFuZGxlciBoYW5kbGVyID0ganVtcFRhcmdldHNbdGFyZ2V0XTsKICAgIGFzc2VydChoYW5kbGVyICE9IG51bGwpOwogICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPQogICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRHb3RvKG5vZGUpOwogICAgaWYgKGxvY2Fsc01hcC5nZW5lcmF0ZUNvbnRpbnVlRm9yQnJlYWsobm9kZSkpIHsKICAgICAgaWYgKGhhbmRsZXIubGFiZWxzLmlzTm90RW1wdHkpIHsKICAgICAgICBoYW5kbGVyLmdlbmVyYXRlQ29udGludWUoc291cmNlSW5mb3JtYXRpb24sIGhhbmRsZXIubGFiZWxzLmZpcnN0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBoYW5kbGVyLmdlbmVyYXRlQ29udGludWUoc291cmNlSW5mb3JtYXRpb24pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAoaGFuZGxlci5sYWJlbHMuaXNOb3RFbXB0eSkgewogICAgICAgIGhhbmRsZXIuZ2VuZXJhdGVCcmVhayhzb3VyY2VJbmZvcm1hdGlvbiwgaGFuZGxlci5sYWJlbHMuZmlyc3QpOwogICAgICB9IGVsc2UgewogICAgICAgIGhhbmRsZXIuZ2VuZXJhdGVCcmVhayhzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMYWJlbGVkU3RhdGVtZW50KGlyLkxhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgewogICAgaXIuU3RhdGVtZW50IGJvZHkgPSBub2RlLmJvZHk7CiAgICBpZiAoSnVtcFZpc2l0b3IuY2FuQmVCcmVha1RhcmdldChib2R5KSkgewogICAgICAvLyBsb29wcyBhbmQgc3dpdGNoZXMgaGFuZGxlIGJyZWFrcyBvbiB0aGVpciBvd24KICAgICAgYm9keS5hY2NlcHQodGhpcyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIEp1bXBUYXJnZXQganVtcFRhcmdldCA9IGxvY2Fsc01hcC5nZXRKdW1wVGFyZ2V0Rm9yTGFiZWwobm9kZSk7CiAgICBpZiAoanVtcFRhcmdldCA9PSBudWxsKSB7CiAgICAgIC8vIFRoZSBsYWJlbCBpcyBub3QgbmVlZGVkLgogICAgICBib2R5LmFjY2VwdCh0aGlzKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIEp1bXBIYW5kbGVyIGhhbmRsZXIgPSBjcmVhdGVKdW1wSGFuZGxlcihub2RlLCBqdW1wVGFyZ2V0KTsKCiAgICBMb2NhbHNIYW5kbGVyIGJlZm9yZUxvY2FscyA9IG5ldyBMb2NhbHNIYW5kbGVyLmZyb20obG9jYWxzSGFuZGxlcik7CgogICAgSEJhc2ljQmxvY2sgbmV3QmxvY2sgPSBvcGVuTmV3QmxvY2soKTsKICAgIGJvZHkuYWNjZXB0KHRoaXMpOwogICAgU3ViR3JhcGggYm9keUdyYXBoID0gbmV3IFN1YkdyYXBoKG5ld0Jsb2NrLCBsYXN0T3BlbmVkQmxvY2spOwoKICAgIEhCYXNpY0Jsb2NrIGpvaW5CbG9jayA9IGdyYXBoLmFkZE5ld0Jsb2NrKCk7CiAgICBMaXN0PExvY2Fsc0hhbmRsZXI+IGJyZWFrSGFuZGxlcnMgPSA8TG9jYWxzSGFuZGxlcj5bXTsKICAgIGhhbmRsZXIuZm9yRWFjaEJyZWFrKChIQnJlYWsgYnJlYWtJbnN0cnVjdGlvbiwgTG9jYWxzSGFuZGxlciBsb2NhbHMpIHsKICAgICAgYnJlYWtJbnN0cnVjdGlvbi5ibG9jay5hZGRTdWNjZXNzb3Ioam9pbkJsb2NrKTsKICAgICAgYnJlYWtIYW5kbGVycy5hZGQobG9jYWxzKTsKICAgIH0pOwoKICAgIGlmICghaXNBYm9ydGVkKCkpIHsKICAgICAgZ290byhjdXJyZW50LCBqb2luQmxvY2spOwogICAgICBicmVha0hhbmRsZXJzLmFkZChsb2NhbHNIYW5kbGVyKTsKICAgIH0KCiAgICBvcGVuKGpvaW5CbG9jayk7CiAgICBsb2NhbHNIYW5kbGVyID0gYmVmb3JlTG9jYWxzLm1lcmdlTXVsdGlwbGUoYnJlYWtIYW5kbGVycywgam9pbkJsb2NrKTsKCiAgICAvLyBUaGVyZSB3YXMgYXQgbGVhc3Qgb25lIHJlYWNoYWJsZSBicmVhaywgc28gdGhlIGxhYmVsIGlzIG5lZWRlZC4KICAgIG5ld0Jsb2NrLnNldEJsb2NrRmxvdygKICAgICAgICBuZXcgSExhYmVsZWRCbG9ja0luZm9ybWF0aW9uKAogICAgICAgICAgICBuZXcgSFN1YkdyYXBoQmxvY2tJbmZvcm1hdGlvbihib2R5R3JhcGgpLCBoYW5kbGVyLmxhYmVscyksCiAgICAgICAgam9pbkJsb2NrKTsKICAgIGhhbmRsZXIuY2xvc2UoKTsKICB9CgogIC8vLyBMb29wIHRocm91Z2ggdGhlIGNhc2VzIGluIGEgc3dpdGNoIGFuZCBjcmVhdGUgYSBtYXBwaW5nIG9mIGNhc2UKICAvLy8gZXhwcmVzc2lvbnMgdG8gY29uc3RhbnRzLgogIE1hcDxpci5FeHByZXNzaW9uLCBDb25zdGFudFZhbHVlPiBfYnVpbGRTd2l0Y2hDYXNlQ29uc3RhbnRzKAogICAgICBpci5Td2l0Y2hTdGF0ZW1lbnQgc3dpdGNoU3RhdGVtZW50KSB7CiAgICBNYXA8aXIuRXhwcmVzc2lvbiwgQ29uc3RhbnRWYWx1ZT4gY29uc3RhbnRzID0KICAgICAgICBuZXcgTWFwPGlyLkV4cHJlc3Npb24sIENvbnN0YW50VmFsdWU+KCk7CiAgICBmb3IgKGlyLlN3aXRjaENhc2Ugc3dpdGNoQ2FzZSBpbiBzd2l0Y2hTdGF0ZW1lbnQuY2FzZXMpIHsKICAgICAgZm9yIChpci5FeHByZXNzaW9uIGNhc2VFeHByZXNzaW9uIGluIHN3aXRjaENhc2UuZXhwcmVzc2lvbnMpIHsKICAgICAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50ID0gX2VsZW1lbnRNYXAuZ2V0Q29uc3RhbnRWYWx1ZShjYXNlRXhwcmVzc2lvbik7CiAgICAgICAgY29uc3RhbnRzW2Nhc2VFeHByZXNzaW9uXSA9IGNvbnN0YW50OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gY29uc3RhbnRzOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbnRpbnVlU3dpdGNoU3RhdGVtZW50KGlyLkNvbnRpbnVlU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIGhhbmRsZUluVHJ5U3RhdGVtZW50KCk7CiAgICBKdW1wVGFyZ2V0IHRhcmdldCA9IGxvY2Fsc01hcC5nZXRKdW1wVGFyZ2V0Rm9yQ29udGludWVTd2l0Y2gobm9kZSk7CiAgICBhc3NlcnQodGFyZ2V0ICE9IG51bGwpOwogICAgSnVtcEhhbmRsZXIgaGFuZGxlciA9IGp1bXBUYXJnZXRzW3RhcmdldF07CiAgICBhc3NlcnQoaGFuZGxlciAhPSBudWxsKTsKICAgIGFzc2VydCh0YXJnZXQubGFiZWxzLmlzTm90RW1wdHkpOwogICAgaGFuZGxlci5nZW5lcmF0ZUNvbnRpbnVlKAogICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRHb3RvKG5vZGUpLCB0YXJnZXQubGFiZWxzLmZpcnN0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTd2l0Y2hTdGF0ZW1lbnQoaXIuU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0KICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkU3dpdGNoKG5vZGUpOwogICAgLy8gVGhlIHN3aXRjaCBjYXNlIGluZGljZXMgbXVzdCBtYXRjaCB0aG9zZSBjb21wdXRlZCBpbgogICAgLy8gW0tlcm5lbFN3aXRjaENhc2VKdW1wSGFuZGxlcl0uCiAgICBib29sIGhhc0NvbnRpbnVlID0gZmFsc2U7CiAgICBNYXA8aXIuU3dpdGNoQ2FzZSwgaW50PiBjYXNlSW5kZXggPSBuZXcgTWFwPGlyLlN3aXRjaENhc2UsIGludD4oKTsKICAgIGludCBzd2l0Y2hJbmRleCA9IDE7CiAgICBib29sIGhhc0RlZmF1bHQgPSBmYWxzZTsKICAgIGZvciAoaXIuU3dpdGNoQ2FzZSBzd2l0Y2hDYXNlIGluIG5vZGUuY2FzZXMpIHsKICAgICAgaWYgKF9pc0RlZmF1bHRDYXNlKHN3aXRjaENhc2UpKSB7CiAgICAgICAgaGFzRGVmYXVsdCA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKFN3aXRjaENvbnRpbnVlQW5hbHlzaXMuY29udGFpbnNDb250aW51ZShzd2l0Y2hDYXNlLmJvZHkpKSB7CiAgICAgICAgaGFzQ29udGludWUgPSB0cnVlOwogICAgICB9CiAgICAgIGNhc2VJbmRleFtzd2l0Y2hDYXNlXSA9IHN3aXRjaEluZGV4OwogICAgICBzd2l0Y2hJbmRleCsrOwogICAgfQoKICAgIEp1bXBIYW5kbGVyIGp1bXBIYW5kbGVyID0KICAgICAgICBjcmVhdGVKdW1wSGFuZGxlcihub2RlLCBsb2NhbHNNYXAuZ2V0SnVtcFRhcmdldEZvclN3aXRjaChub2RlKSk7CiAgICBpZiAoIWhhc0NvbnRpbnVlKSB7CiAgICAgIC8vIElmIHRoZSBzd2l0Y2ggc3RhdGVtZW50IGhhcyBubyBzd2l0Y2ggY2FzZXMgdGFyZ2V0ZWQgYnkgY29udGludWUKICAgICAgLy8gc3RhdGVtZW50cyB3ZSBlbmNvZGUgdGhlIHN3aXRjaCBzdGF0ZW1lbnQgZGlyZWN0bHkuCiAgICAgIF9idWlsZFNpbXBsZVN3aXRjaFN0YXRlbWVudChub2RlLCBqdW1wSGFuZGxlciwgc291cmNlSW5mb3JtYXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgX2J1aWxkQ29tcGxleFN3aXRjaFN0YXRlbWVudCgKICAgICAgICAgIG5vZGUsIGp1bXBIYW5kbGVyLCBjYXNlSW5kZXgsIGhhc0RlZmF1bHQsIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0KICB9CgogIC8vLyBIZWxwZXIgZm9yIGJ1aWxkaW5nIHN3aXRjaCBzdGF0ZW1lbnRzLgogIHN0YXRpYyBib29sIF9pc0RlZmF1bHRDYXNlKGlyLlN3aXRjaENhc2Ugc3dpdGNoQ2FzZSkgPT4KICAgICAgc3dpdGNoQ2FzZSA9PSBudWxsIHx8IHN3aXRjaENhc2UuaXNEZWZhdWx0OwoKICAvLy8gSGVscGVyIGZvciBidWlsZGluZyBzd2l0Y2ggc3RhdGVtZW50cy4KICBISW5zdHJ1Y3Rpb24gX2J1aWxkRXhwcmVzc2lvbihpci5Td2l0Y2hTdGF0ZW1lbnQgc3dpdGNoU3RhdGVtZW50KSB7CiAgICBzd2l0Y2hTdGF0ZW1lbnQuZXhwcmVzc2lvbi5hY2NlcHQodGhpcyk7CiAgICByZXR1cm4gcG9wKCk7CiAgfQoKICAvLy8gSGVscGVyIG1ldGhvZCBmb3IgY3JlYXRpbmcgdGhlIGxpc3Qgb2YgY29uc3RhbnRzIHRoYXQgbWFrZSB1cCB0aGUKICAvLy8gc3dpdGNoIGNhc2UgYnJhbmNoZXMuCiAgTGlzdDxDb25zdGFudFZhbHVlPiBfZ2V0U3dpdGNoQ29uc3RhbnRzKAogICAgICBpci5Td2l0Y2hTdGF0ZW1lbnQgcGFyZW50U3dpdGNoLCBpci5Td2l0Y2hDYXNlIHN3aXRjaENhc2UpIHsKICAgIE1hcDxpci5FeHByZXNzaW9uLCBDb25zdGFudFZhbHVlPiBjb25zdGFudHNMb29rdXAgPQogICAgICAgIF9idWlsZFN3aXRjaENhc2VDb25zdGFudHMocGFyZW50U3dpdGNoKTsKICAgIExpc3Q8Q29uc3RhbnRWYWx1ZT4gY29uc3RhbnRMaXN0ID0gPENvbnN0YW50VmFsdWU+W107CiAgICBpZiAoc3dpdGNoQ2FzZSAhPSBudWxsKSB7CiAgICAgIGZvciAodmFyIGV4cHJlc3Npb24gaW4gc3dpdGNoQ2FzZS5leHByZXNzaW9ucykgewogICAgICAgIGNvbnN0YW50TGlzdC5hZGQoY29uc3RhbnRzTG9va3VwW2V4cHJlc3Npb25dKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNvbnN0YW50TGlzdDsKICB9CgogIC8vLyBCdWlsZHMgYSBzaW1wbGUgc3dpdGNoIHN0YXRlbWVudCB3aGljaCBkb2VzIG5vdCBoYW5kbGUgdXNlcyBvZiBjb250aW51ZQogIC8vLyBzdGF0ZW1lbnRzIHRvIGxhYmVsZWQgc3dpdGNoIGNhc2VzLgogIHZvaWQgX2J1aWxkU2ltcGxlU3dpdGNoU3RhdGVtZW50KGlyLlN3aXRjaFN0YXRlbWVudCBzd2l0Y2hTdGF0ZW1lbnQsCiAgICAgIEp1bXBIYW5kbGVyIGp1bXBIYW5kbGVyLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgdm9pZCBidWlsZFN3aXRjaENhc2UoaXIuU3dpdGNoQ2FzZSBzd2l0Y2hDYXNlKSB7CiAgICAgIHN3aXRjaENhc2UuYm9keS5hY2NlcHQodGhpcyk7CiAgICB9CgogICAgX2hhbmRsZVN3aXRjaCgKICAgICAgICBzd2l0Y2hTdGF0ZW1lbnQsCiAgICAgICAganVtcEhhbmRsZXIsCiAgICAgICAgX2J1aWxkRXhwcmVzc2lvbiwKICAgICAgICBzd2l0Y2hTdGF0ZW1lbnQuY2FzZXMsCiAgICAgICAgX2dldFN3aXRjaENvbnN0YW50cywKICAgICAgICBfaXNEZWZhdWx0Q2FzZSwKICAgICAgICBidWlsZFN3aXRjaENhc2UsCiAgICAgICAgc291cmNlSW5mb3JtYXRpb24pOwogICAganVtcEhhbmRsZXIuY2xvc2UoKTsKICB9CgogIC8vLyBCdWlsZHMgYSBzd2l0Y2ggc3RhdGVtZW50IHRoYXQgY2FuIGhhbmRsZSBhcmJpdHJhcnkgdXNlcyBvZiBjb250aW51ZQogIC8vLyBzdGF0ZW1lbnRzIHRvIGxhYmVsZWQgc3dpdGNoIGNhc2VzLgogIHZvaWQgX2J1aWxkQ29tcGxleFN3aXRjaFN0YXRlbWVudCgKICAgICAgaXIuU3dpdGNoU3RhdGVtZW50IHN3aXRjaFN0YXRlbWVudCwKICAgICAgSnVtcEhhbmRsZXIganVtcEhhbmRsZXIsCiAgICAgIE1hcDxpci5Td2l0Y2hDYXNlLCBpbnQ+IGNhc2VJbmRleCwKICAgICAgYm9vbCBoYXNEZWZhdWx0LAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgLy8gSWYgdGhlIHN3aXRjaCBzdGF0ZW1lbnQgaGFzIHN3aXRjaCBjYXNlcyB0YXJnZXRlZCBieSBjb250aW51ZQogICAgLy8gc3RhdGVtZW50cyB3ZSBjcmVhdGUgdGhlIGZvbGxvd2luZyBlbmNvZGluZzoKICAgIC8vCiAgICAvLyAgIHN3aXRjaCAoZSkgewogICAgLy8gICAgIGxfMTogY2FzZSBlMDogc18xOyBicmVhazsKICAgIC8vICAgICBsXzI6IGNhc2UgZTE6IHNfMjsgY29udGludWUgbF9pOwogICAgLy8gICAgIC4uLgogICAgLy8gICAgIGxfbjogZGVmYXVsdDogc19uOyBjb250aW51ZSBsX2o7CiAgICAvLyAgIH0KICAgIC8vCiAgICAvLyBpcyBlbmNvZGVkIGFzCiAgICAvLwogICAgLy8gICB2YXIgdGFyZ2V0OwogICAgLy8gICBzd2l0Y2ggKGUpIHsKICAgIC8vICAgICBjYXNlIGUxOiB0YXJnZXQgPSAxOyBicmVhazsKICAgIC8vICAgICBjYXNlIGUyOiB0YXJnZXQgPSAyOyBicmVhazsKICAgIC8vICAgICAuLi4KICAgIC8vICAgICBkZWZhdWx0OiB0YXJnZXQgPSBuOyBicmVhazsKICAgIC8vICAgfQogICAgLy8gICBsOiB3aGlsZSAodHJ1ZSkgewogICAgLy8gICAgc3dpdGNoICh0YXJnZXQpIHsKICAgIC8vICAgICAgIGNhc2UgMTogc18xOyBicmVhayBsOwogICAgLy8gICAgICAgY2FzZSAyOiBzXzI7IHRhcmdldCA9IGk7IGNvbnRpbnVlIGw7CiAgICAvLyAgICAgICAuLi4KICAgIC8vICAgICAgIGNhc2Ugbjogc19uOyB0YXJnZXQgPSBqOyBjb250aW51ZSBsOwogICAgLy8gICAgIH0KICAgIC8vICAgfQogICAgLy8KICAgIC8vIFRoaXMgaXMgYmVjYXVzZSBKUyBkb2VzIG5vdCBoYXZlIHRoaXMgc2FtZSAiY29udGludWUgbGFiZWwiIHNlbWFudGljcyBzbwogICAgLy8gd2UgZW5jb2RlIGl0IGluIHRoZSBmb3JtIG9mIGEgc3RhdGUgbWFjaGluZS4KCiAgICBKdW1wVGFyZ2V0IHN3aXRjaFRhcmdldCA9IGxvY2Fsc01hcC5nZXRKdW1wVGFyZ2V0Rm9yU3dpdGNoKHN3aXRjaFN0YXRlbWVudCk7CiAgICBsb2NhbHNIYW5kbGVyLnVwZGF0ZUxvY2FsKHN3aXRjaFRhcmdldCwgZ3JhcGguYWRkQ29uc3RhbnROdWxsKGNsb3NlZFdvcmxkKSk7CgogICAgdmFyIHN3aXRjaENhc2VzID0gc3dpdGNoU3RhdGVtZW50LmNhc2VzOwogICAgaWYgKCFoYXNEZWZhdWx0KSB7CiAgICAgIC8vIFVzZSBudWxsIGFzIHRoZSBtYXJrZXIgZm9yIGEgc3ludGhldGljIGRlZmF1bHQgY2xhdXNlLgogICAgICAvLyBUaGUgc3ludGhldGljIGRlZmF1bHQgaXMgYWRkZWQgYmVjYXVzZSBvdGhlcndpc2UgdGhlcmUgd291bGQgYmUgbm8KICAgICAgLy8gZ29vZCBwbGFjZSB0byBnaXZlIGEgZGVmYXVsdCB2YWx1ZSB0byB0aGUgbG9jYWwuCiAgICAgIHN3aXRjaENhc2VzID0gbmV3IExpc3Q8aXIuU3dpdGNoQ2FzZT4uZnJvbShzd2l0Y2hDYXNlcyk7CiAgICAgIHN3aXRjaENhc2VzLmFkZChudWxsKTsKICAgIH0KCiAgICB2b2lkIGJ1aWxkU3dpdGNoQ2FzZShpci5Td2l0Y2hDYXNlIHN3aXRjaENhc2UpIHsKICAgICAgU291cmNlSW5mb3JtYXRpb24gY2FzZVNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgICAgIGlmIChzd2l0Y2hDYXNlICE9IG51bGwpIHsKICAgICAgICBjYXNlU291cmNlSW5mb3JtYXRpb24gPSBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkR290byhzd2l0Y2hDYXNlKTsKICAgICAgICAvLyBHZW5lcmF0ZSAndGFyZ2V0ID0gaTsgYnJlYWs7JyBmb3Igc3dpdGNoIGNhc2UgaS4KICAgICAgICBpbnQgaW5kZXggPSBjYXNlSW5kZXhbc3dpdGNoQ2FzZV07CiAgICAgICAgSEluc3RydWN0aW9uIHZhbHVlID0gZ3JhcGguYWRkQ29uc3RhbnRJbnQoaW5kZXgsIGNsb3NlZFdvcmxkKTsKICAgICAgICBsb2NhbHNIYW5kbGVyLnVwZGF0ZUxvY2FsKHN3aXRjaFRhcmdldCwgdmFsdWUsCiAgICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBjYXNlU291cmNlSW5mb3JtYXRpb24pOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEdlbmVyYXRlIHN5bnRoZXRpYyBkZWZhdWx0IGNhc2UgJ3RhcmdldCA9IG51bGw7IGJyZWFrOycuCiAgICAgICAgSEluc3RydWN0aW9uIG51bGxWYWx1ZSA9IGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCk7CiAgICAgICAgbG9jYWxzSGFuZGxlci51cGRhdGVMb2NhbChzd2l0Y2hUYXJnZXQsIG51bGxWYWx1ZSwKICAgICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IGNhc2VTb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIH0KICAgICAganVtcFRhcmdldHNbc3dpdGNoVGFyZ2V0XS5nZW5lcmF0ZUJyZWFrKGNhc2VTb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CgogICAgX2hhbmRsZVN3aXRjaCgKICAgICAgICBzd2l0Y2hTdGF0ZW1lbnQsCiAgICAgICAganVtcEhhbmRsZXIsCiAgICAgICAgX2J1aWxkRXhwcmVzc2lvbiwKICAgICAgICBzd2l0Y2hDYXNlcywKICAgICAgICBfZ2V0U3dpdGNoQ29uc3RhbnRzLAogICAgICAgIF9pc0RlZmF1bHRDYXNlLAogICAgICAgIGJ1aWxkU3dpdGNoQ2FzZSwKICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBqdW1wSGFuZGxlci5jbG9zZSgpOwoKICAgIEhJbnN0cnVjdGlvbiBidWlsZENvbmRpdGlvbigpID0+IGdyYXBoLmFkZENvbnN0YW50Qm9vbCh0cnVlLCBjbG9zZWRXb3JsZCk7CgogICAgdm9pZCBidWlsZFN3aXRjaCgpIHsKICAgICAgSEluc3RydWN0aW9uIGJ1aWxkRXhwcmVzc2lvbihpci5Td2l0Y2hTdGF0ZW1lbnQgbm90VXNlZCkgewogICAgICAgIHJldHVybiBsb2NhbHNIYW5kbGVyLnJlYWRMb2NhbChzd2l0Y2hUYXJnZXQpOwogICAgICB9CgogICAgICBMaXN0PENvbnN0YW50VmFsdWU+IGdldENvbnN0YW50cygKICAgICAgICAgIGlyLlN3aXRjaFN0YXRlbWVudCBwYXJlbnRTd2l0Y2gsIGlyLlN3aXRjaENhc2Ugc3dpdGNoQ2FzZSkgewogICAgICAgIHJldHVybiA8Q29uc3RhbnRWYWx1ZT5bCiAgICAgICAgICBjb25zdGFudF9zeXN0ZW0uY3JlYXRlSW50RnJvbUludChjYXNlSW5kZXhbc3dpdGNoQ2FzZV0pCiAgICAgICAgXTsKICAgICAgfQoKICAgICAgdm9pZCBidWlsZFN3aXRjaENhc2UoaXIuU3dpdGNoQ2FzZSBzd2l0Y2hDYXNlKSB7CiAgICAgICAgc3dpdGNoQ2FzZS5ib2R5LmFjY2VwdCh0aGlzKTsKICAgICAgICBpZiAoIWlzQWJvcnRlZCgpKSB7CiAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB3ZSBicmVhayB0aGUgbG9vcCBpZiB0aGUgY2FzZSBmYWxscyB0aHJvdWdoLiAoVGhpcwogICAgICAgICAgLy8gaXMgb25seSBwb3NzaWJsZSBmb3IgdGhlIGxhc3QgY2FzZS4pCiAgICAgICAgICBqdW1wVGFyZ2V0c1tzd2l0Y2hUYXJnZXRdLmdlbmVyYXRlQnJlYWsoc291cmNlSW5mb3JtYXRpb24pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gUGFzcyBhIFtOdWxsSnVtcEhhbmRsZXJdIGJlY2F1c2UgdGhlIHRhcmdldCBmb3IgdGhlIGNvbnRhaW5lZCBicmVhawogICAgICAvLyBpcyBub3QgdGhlIGdlbmVyYXRlZCBzd2l0Y2ggc3RhdGVtZW50IGJ1dCBpbnN0ZWFkIHRoZSBsb29wIGdlbmVyYXRlZAogICAgICAvLyBpbiB0aGUgY2FsbCB0byBbaGFuZGxlTG9vcF0gYmVsb3cuCiAgICAgIF9oYW5kbGVTd2l0Y2goCiAgICAgICAgICBzd2l0Y2hTdGF0ZW1lbnQsIC8vIG5vciBpcyBidWlsZEV4cHJlc3Npb24uCiAgICAgICAgICBuZXcgTnVsbEp1bXBIYW5kbGVyKHJlcG9ydGVyKSwKICAgICAgICAgIGJ1aWxkRXhwcmVzc2lvbiwKICAgICAgICAgIHN3aXRjaFN0YXRlbWVudC5jYXNlcywKICAgICAgICAgIGdldENvbnN0YW50cywKICAgICAgICAgIChfKSA9PiBmYWxzZSwgLy8gTm8gY2FzZSBpcyBkZWZhdWx0LgogICAgICAgICAgYnVpbGRTd2l0Y2hDYXNlLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb24pOwogICAgfQoKICAgIHZvaWQgYnVpbGRMb29wKCkgewogICAgICBsb29wSGFuZGxlci5oYW5kbGVMb29wKAogICAgICAgICAgc3dpdGNoU3RhdGVtZW50LAogICAgICAgICAgY2xvc3VyZURhdGFMb29rdXAuZ2V0Q2FwdHVyZWRMb29wU2NvcGUoc3dpdGNoU3RhdGVtZW50KSwKICAgICAgICAgIHN3aXRjaFRhcmdldCwKICAgICAgICAgICgpIHt9LAogICAgICAgICAgYnVpbGRDb25kaXRpb24sCiAgICAgICAgICAoKSB7fSwKICAgICAgICAgIGJ1aWxkU3dpdGNoLAogICAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZExvb3Aoc3dpdGNoU3RhdGVtZW50KSk7CiAgICB9CgogICAgaWYgKGhhc0RlZmF1bHQpIHsKICAgICAgYnVpbGRMb29wKCk7CiAgICB9IGVsc2UgewogICAgICAvLyBJZiB0aGUgc3dpdGNoIHN0YXRlbWVudCBoYXMgbm8gZGVmYXVsdCBjYXNlLCBzdXJyb3VuZCB0aGUgbG9vcCB3aXRoCiAgICAgIC8vIGEgdGVzdCBvZiB0aGUgdGFyZ2V0LiBTbzoKICAgICAgLy8gYGlmICh0YXJnZXQpIHdoaWxlICh0cnVlKSAuLi5gIElmIHRoZXJlJ3Mgbm8gZGVmYXVsdCBjYXNlLCB0YXJnZXQgaXMKICAgICAgLy8gbnVsbCwgc28gd2UgZG9uJ3QgZHJvcCBpbnRvIHRoZSB3aGlsZSBsb29wLgogICAgICB2b2lkIGJ1aWxkQ29uZGl0aW9uKCkgewogICAgICAgIGpzLlRlbXBsYXRlIGNvZGUgPSBqcy5qcy5wYXJzZUZvcmVpZ25KUygnIycpOwogICAgICAgIHB1c2gobmV3IEhGb3JlaWduQ29kZShjb2RlLCBhYnN0cmFjdFZhbHVlRG9tYWluLmJvb2xUeXBlLAogICAgICAgICAgICBbbG9jYWxzSGFuZGxlci5yZWFkTG9jYWwoc3dpdGNoVGFyZ2V0KV0sCiAgICAgICAgICAgIG5hdGl2ZUJlaGF2aW9yOiBOYXRpdmVCZWhhdmlvci5QVVJFKSk7CiAgICAgIH0KCiAgICAgIGhhbmRsZUlmKAogICAgICAgICAgbm9kZTogc3dpdGNoU3RhdGVtZW50LAogICAgICAgICAgdmlzaXRDb25kaXRpb246IGJ1aWxkQ29uZGl0aW9uLAogICAgICAgICAgdmlzaXRUaGVuOiBidWlsZExvb3AsCiAgICAgICAgICB2aXNpdEVsc2U6ICgpID0+IHt9LAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0KICB9CgogIC8vLyBDcmVhdGVzIGEgc3dpdGNoIHN0YXRlbWVudC4KICAvLy8KICAvLy8gW2p1bXBIYW5kbGVyXSBpcyB0aGUgW0p1bXBIYW5kbGVyXSBmb3IgdGhlIGNyZWF0ZWQgc3dpdGNoIHN0YXRlbWVudC4KICAvLy8gW2J1aWxkU3dpdGNoQ2FzZV0gY3JlYXRlcyB0aGUgc3RhdGVtZW50cyBmb3IgdGhlIHN3aXRjaCBjYXNlLgogIHZvaWQgX2hhbmRsZVN3aXRjaCgKICAgICAgaXIuU3dpdGNoU3RhdGVtZW50IHN3aXRjaFN0YXRlbWVudCwKICAgICAgSnVtcEhhbmRsZXIganVtcEhhbmRsZXIsCiAgICAgIEhJbnN0cnVjdGlvbiBidWlsZEV4cHJlc3Npb24oaXIuU3dpdGNoU3RhdGVtZW50IHN0YXRlbWVudCksCiAgICAgIExpc3Q8aXIuU3dpdGNoQ2FzZT4gc3dpdGNoQ2FzZXMsCiAgICAgIExpc3Q8Q29uc3RhbnRWYWx1ZT4gZ2V0Q29uc3RhbnRzKAogICAgICAgICAgaXIuU3dpdGNoU3RhdGVtZW50IHBhcmVudFN3aXRjaCwgaXIuU3dpdGNoQ2FzZSBzd2l0Y2hDYXNlKSwKICAgICAgYm9vbCBpc0RlZmF1bHRDYXNlKGlyLlN3aXRjaENhc2Ugc3dpdGNoQ2FzZSksCiAgICAgIHZvaWQgYnVpbGRTd2l0Y2hDYXNlKGlyLlN3aXRjaENhc2Ugc3dpdGNoQ2FzZSksCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBIQmFzaWNCbG9jayBleHByZXNzaW9uU3RhcnQgPSBvcGVuTmV3QmxvY2soKTsKICAgIEhJbnN0cnVjdGlvbiBleHByZXNzaW9uID0gYnVpbGRFeHByZXNzaW9uKHN3aXRjaFN0YXRlbWVudCk7CgogICAgaWYgKHN3aXRjaENhc2VzLmlzRW1wdHkpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIEhTd2l0Y2ggc3dpdGNoSW5zdHJ1Y3Rpb24gPQogICAgICAgIG5ldyBIU3dpdGNoKGFic3RyYWN0VmFsdWVEb21haW4sIDxISW5zdHJ1Y3Rpb24+W2V4cHJlc3Npb25dKTsKICAgIEhCYXNpY0Jsb2NrIGV4cHJlc3Npb25FbmQgPSBjbG9zZShzd2l0Y2hJbnN0cnVjdGlvbik7CiAgICBMb2NhbHNIYW5kbGVyIHNhdmVkTG9jYWxzID0gbG9jYWxzSGFuZGxlcjsKCiAgICBMaXN0PEhTdGF0ZW1lbnRJbmZvcm1hdGlvbj4gc3RhdGVtZW50cyA9IDxIU3RhdGVtZW50SW5mb3JtYXRpb24+W107CiAgICBib29sIGhhc0RlZmF1bHQgPSBmYWxzZTsKICAgIGZvciAoaXIuU3dpdGNoQ2FzZSBzd2l0Y2hDYXNlIGluIHN3aXRjaENhc2VzKSB7CiAgICAgIEhCYXNpY0Jsb2NrIGJsb2NrID0gZ3JhcGguYWRkTmV3QmxvY2soKTsKICAgICAgZm9yIChDb25zdGFudFZhbHVlIGNvbnN0YW50CiAgICAgICAgICBpbiBnZXRDb25zdGFudHMoc3dpdGNoU3RhdGVtZW50LCBzd2l0Y2hDYXNlKSkgewogICAgICAgIEhDb25zdGFudCBoQ29uc3RhbnQgPSBncmFwaC5hZGRDb25zdGFudChjb25zdGFudCwgY2xvc2VkV29ybGQpOwogICAgICAgIHN3aXRjaEluc3RydWN0aW9uLmlucHV0cy5hZGQoaENvbnN0YW50KTsKICAgICAgICBoQ29uc3RhbnQudXNlZEJ5LmFkZChzd2l0Y2hJbnN0cnVjdGlvbik7CiAgICAgICAgZXhwcmVzc2lvbkVuZC5hZGRTdWNjZXNzb3IoYmxvY2spOwogICAgICB9CgogICAgICBpZiAoaXNEZWZhdWx0Q2FzZShzd2l0Y2hDYXNlKSkgewogICAgICAgIC8vIEFuIEhTd2l0Y2ggaGFzIG4gaW5wdXRzIGFuZCBuKzEgc3VjY2Vzc29ycywgdGhlIGxhc3QgYmVpbmcgdGhlCiAgICAgICAgLy8gZGVmYXVsdCBjYXNlLgogICAgICAgIGV4cHJlc3Npb25FbmQuYWRkU3VjY2Vzc29yKGJsb2NrKTsKICAgICAgICBoYXNEZWZhdWx0ID0gdHJ1ZTsKICAgICAgfQogICAgICBvcGVuKGJsb2NrKTsKICAgICAgbG9jYWxzSGFuZGxlciA9IG5ldyBMb2NhbHNIYW5kbGVyLmZyb20oc2F2ZWRMb2NhbHMpOwogICAgICBidWlsZFN3aXRjaENhc2Uoc3dpdGNoQ2FzZSk7CiAgICAgIGlmICghaXNBYm9ydGVkKCkgJiYKICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlaW5zZXJ0IHRoaXMgaWYgYGlzUmVhY2hhYmxlYCBpcyBubyBsb25nZXIKICAgICAgICAgIC8vIHNldCB0byBgZmFsc2VgIHdoZW4gYF90cnlJbmxpbmVNZXRob2RgIHNlZXMgYW4gYWx3YXlzIHRocm93aW5nCiAgICAgICAgICAvLyBtZXRob2QuCiAgICAgICAgICAvL3N3aXRjaENhc2UgPT0gc3dpdGNoQ2FzZXMubGFzdCAmJgogICAgICAgICAgIWlzRGVmYXVsdENhc2Uoc3dpdGNoQ2FzZSkpIHsKICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBkZWZhdWx0LCB3ZSB3aWxsIGFkZCBvbmUgbGF0ZXIgdG8gYXZvaWQKICAgICAgICAvLyB0aGUgY3JpdGljYWwgZWRnZS4gU28gd2UgZ2VuZXJhdGUgYSBicmVhayBzdGF0ZW1lbnQgdG8gbWFrZQogICAgICAgIC8vIHN1cmUgdGhlIGxhc3QgY2FzZSBkb2VzIG5vdCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgY2FzZS4KICAgICAgICBqdW1wSGFuZGxlci5nZW5lcmF0ZUJyZWFrKHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgfQogICAgICBzdGF0ZW1lbnRzLmFkZCgKICAgICAgICAgIG5ldyBIU3ViR3JhcGhCbG9ja0luZm9ybWF0aW9uKG5ldyBTdWJHcmFwaChibG9jaywgbGFzdE9wZW5lZEJsb2NrKSkpOwogICAgfQoKICAgIC8vIEFkZCBhIGpvaW4tYmxvY2sgaWYgbmVjZXNzYXJ5LgogICAgLy8gV2UgY3JlYXRlIFtqb2luQmxvY2tdIGVhcmx5LCBhbmQgdGhlbiBnbyB0aHJvdWdoIHRoZSBjYXNlcyB0aGF0IG1pZ2h0CiAgICAvLyB3YW50IHRvIGp1bXAgdG8gaXQuIEluIGVhY2ggY2FzZSwgaWYgd2UgYWRkIFtqb2luQmxvY2tdIGFzIGEgc3VjY2Vzc29yCiAgICAvLyBvZiBhbm90aGVyIGJsb2NrLCB3ZSBhbHNvIGFkZCBhbiBlbGVtZW50IHRvIFtjYXNlSGFuZGxlcnNdIHRoYXQgaXMgdXNlZAogICAgLy8gdG8gY3JlYXRlIHRoZSBwaGlzIGluIFtqb2luQmxvY2tdLgogICAgLy8gSWYgd2UgbmV2ZXIganVtcCB0byB0aGUgam9pbiBibG9jaywgW2Nhc2VIYW5kbGVyc10gd2lsbCBzdGF5IGVtcHR5LCBhbmQKICAgIC8vIHRoZSBqb2luIGJsb2NrIGlzIG5ldmVyIGFkZGVkIHRvIHRoZSBncmFwaC4KICAgIEhCYXNpY0Jsb2NrIGpvaW5CbG9jayA9IG5ldyBIQmFzaWNCbG9jaygpOwogICAgTGlzdDxMb2NhbHNIYW5kbGVyPiBjYXNlSGFuZGxlcnMgPSA8TG9jYWxzSGFuZGxlcj5bXTsKICAgIGp1bXBIYW5kbGVyLmZvckVhY2hCcmVhaygoSEJyZWFrIGluc3RydWN0aW9uLCBMb2NhbHNIYW5kbGVyIGxvY2FscykgewogICAgICBpbnN0cnVjdGlvbi5ibG9jay5hZGRTdWNjZXNzb3Ioam9pbkJsb2NrKTsKICAgICAgY2FzZUhhbmRsZXJzLmFkZChsb2NhbHMpOwogICAgfSk7CiAgICBqdW1wSGFuZGxlci5mb3JFYWNoQ29udGludWUoKEhDb250aW51ZSBpbnN0cnVjdGlvbiwgTG9jYWxzSGFuZGxlciBsb2NhbHMpIHsKICAgICAgYXNzZXJ0KAogICAgICAgICAgZmFsc2UsCiAgICAgICAgICBmYWlsZWRBdChfZWxlbWVudE1hcC5nZXRTcGFubmFibGUodGFyZ2V0RWxlbWVudCwgc3dpdGNoU3RhdGVtZW50KSwKICAgICAgICAgICAgICAnQ29udGludWUgY2Fubm90IHRhcmdldCBhIHN3aXRjaC4nKSk7CiAgICB9KTsKICAgIGlmICghaXNBYm9ydGVkKCkpIHsKICAgICAgY3VycmVudC5jbG9zZShuZXcgSEdvdG8oYWJzdHJhY3RWYWx1ZURvbWFpbikpOwogICAgICBsYXN0T3BlbmVkQmxvY2suYWRkU3VjY2Vzc29yKGpvaW5CbG9jayk7CiAgICAgIGNhc2VIYW5kbGVycy5hZGQobG9jYWxzSGFuZGxlcik7CiAgICB9CiAgICBpZiAoIWhhc0RlZmF1bHQpIHsKICAgICAgLy8gQWx3YXlzIGNyZWF0ZSBhIGRlZmF1bHQgY2FzZSwgdG8gYXZvaWQgYSBjcml0aWNhbCBlZGdlIGluIHRoZQogICAgICAvLyBncmFwaC4KICAgICAgSEJhc2ljQmxvY2sgZGVmYXVsdENhc2UgPSBhZGROZXdCbG9jaygpOwogICAgICBleHByZXNzaW9uRW5kLmFkZFN1Y2Nlc3NvcihkZWZhdWx0Q2FzZSk7CiAgICAgIG9wZW4oZGVmYXVsdENhc2UpOwogICAgICBjbG9zZShuZXcgSEdvdG8oYWJzdHJhY3RWYWx1ZURvbWFpbikpOwogICAgICBkZWZhdWx0Q2FzZS5hZGRTdWNjZXNzb3Ioam9pbkJsb2NrKTsKICAgICAgY2FzZUhhbmRsZXJzLmFkZChzYXZlZExvY2Fscyk7CiAgICAgIHN0YXRlbWVudHMuYWRkKG5ldyBIU3ViR3JhcGhCbG9ja0luZm9ybWF0aW9uKAogICAgICAgICAgbmV3IFN1YkdyYXBoKGRlZmF1bHRDYXNlLCBkZWZhdWx0Q2FzZSkpKTsKICAgIH0KICAgIGFzc2VydChjYXNlSGFuZGxlcnMubGVuZ3RoID09IGpvaW5CbG9jay5wcmVkZWNlc3NvcnMubGVuZ3RoKTsKICAgIGlmIChjYXNlSGFuZGxlcnMuaXNOb3RFbXB0eSkgewogICAgICBncmFwaC5hZGRCbG9jayhqb2luQmxvY2spOwogICAgICBvcGVuKGpvaW5CbG9jayk7CiAgICAgIGlmIChjYXNlSGFuZGxlcnMubGVuZ3RoID09IDEpIHsKICAgICAgICBsb2NhbHNIYW5kbGVyID0gY2FzZUhhbmRsZXJzWzBdOwogICAgICB9IGVsc2UgewogICAgICAgIGxvY2Fsc0hhbmRsZXIgPSBzYXZlZExvY2Fscy5tZXJnZU11bHRpcGxlKGNhc2VIYW5kbGVycywgam9pbkJsb2NrKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gVGhlIGpvaW5ibG9jayBpcyBub3QgdXNlZC4KICAgICAgam9pbkJsb2NrID0gbnVsbDsKICAgIH0KCiAgICBIU3ViRXhwcmVzc2lvbkJsb2NrSW5mb3JtYXRpb24gZXhwcmVzc2lvbkluZm8gPQogICAgICAgIG5ldyBIU3ViRXhwcmVzc2lvbkJsb2NrSW5mb3JtYXRpb24oCiAgICAgICAgICAgIG5ldyBTdWJFeHByZXNzaW9uKGV4cHJlc3Npb25TdGFydCwgZXhwcmVzc2lvbkVuZCkpOwogICAgZXhwcmVzc2lvblN0YXJ0LnNldEJsb2NrRmxvdygKICAgICAgICBuZXcgSFN3aXRjaEJsb2NrSW5mb3JtYXRpb24oZXhwcmVzc2lvbkluZm8sIHN0YXRlbWVudHMsCiAgICAgICAgICAgIGp1bXBIYW5kbGVyLnRhcmdldCwganVtcEhhbmRsZXIubGFiZWxzLCBzb3VyY2VJbmZvcm1hdGlvbiksCiAgICAgICAgam9pbkJsb2NrKTsKCiAgICBqdW1wSGFuZGxlci5jbG9zZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbmRpdGlvbmFsRXhwcmVzc2lvbihpci5Db25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgewogICAgU3NhQnJhbmNoQnVpbGRlciBicmFuY2hlciA9IG5ldyBTc2FCcmFuY2hCdWlsZGVyKHRoaXMpOwogICAgYnJhbmNoZXIuaGFuZGxlQ29uZGl0aW9uYWwoKCkgPT4gbm9kZS5jb25kaXRpb24uYWNjZXB0KHRoaXMpLAogICAgICAgICgpID0+IG5vZGUudGhlbi5hY2NlcHQodGhpcyksICgpID0+IG5vZGUub3RoZXJ3aXNlLmFjY2VwdCh0aGlzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TG9naWNhbEV4cHJlc3Npb24oaXIuTG9naWNhbEV4cHJlc3Npb24gbm9kZSkgewogICAgU3NhQnJhbmNoQnVpbGRlciBicmFuY2hlciA9IG5ldyBTc2FCcmFuY2hCdWlsZGVyKHRoaXMpOwogICAgU3RyaW5nIG9wZXJhdG9yID0gbm9kZS5vcGVyYXRvcjsKICAgIC8vIGlyLkxvZ2ljYWxFeHByZXNzaW9uIGNsYWltcyB0byBhbGxvdyAnPz8nIGFzIGFuIG9wZXJhdG9yIGJ1dCBjdXJyZW50bHkKICAgIC8vIHRoYXQgaXMgZXhwYW5kZWQgaW50byBhIGxldC10cmVlLgogICAgYXNzZXJ0KG9wZXJhdG9yID09ICcmJicgfHwgb3BlcmF0b3IgPT0gJ3x8Jyk7CiAgICBfaGFuZGxlTG9naWNhbEV4cHJlc3Npb24obm9kZS5sZWZ0LCAoKSA9PiBub2RlLnJpZ2h0LmFjY2VwdCh0aGlzKSwgYnJhbmNoZXIsCiAgICAgICAgb3BlcmF0b3IsIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRCaW5hcnkobm9kZSkpOwogIH0KCiAgLy8vIE9wdGltaXplcyBsb2dpY2FsIGJpbmFyeSBleHByZXNzaW9uIHdoZXJlIHRoZSBsZWZ0IGhhcyB0aGUgc2FtZSBsb2dpY2FsCiAgLy8vIGJpbmFyeSBvcGVyYXRvci4KICAvLy8KICAvLy8gVGhpcyBtZXRob2QgdHJhbnNmb3JtcyB0aGUgb3BlcmF0b3IgYnkgb3B0aW1pemluZyB0aGUgY2FzZSB3aGVyZSBbbGVmdF0gaXMKICAvLy8gYSBsb2dpY2FsICJhbmQiIG9yIGxvZ2ljYWwgIm9yIi4gVGhlbiBpdCB1c2VzIFticmFuY2hCdWlsZGVyXSB0byBidWlsZCB0aGUKICAvLy8gZ3JhcGggZm9yIHRoZSBvcHRpbWl6ZWQgZXhwcmVzc2lvbi4KICAvLy8KICAvLy8gRm9yIGV4YW1wbGUsIGAoeCAmJiB5KSAmJiB6YCBpcyB0cmFuc2Zvcm1lZCBpbnRvIGB4ICYmICh5ICYmIHopYDoKICAvLy8KICB2b2lkIF9oYW5kbGVMb2dpY2FsRXhwcmVzc2lvbigKICAgICAgaXIuRXhwcmVzc2lvbiBsZWZ0LAogICAgICB2b2lkIHZpc2l0UmlnaHQoKSwKICAgICAgU3NhQnJhbmNoQnVpbGRlciBicmFuY2hlciwKICAgICAgU3RyaW5nIG9wZXJhdG9yLAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgaWYgKGxlZnQgaXMgaXIuTG9naWNhbEV4cHJlc3Npb24gJiYgbGVmdC5vcGVyYXRvciA9PSBvcGVyYXRvcikgewogICAgICBpci5FeHByZXNzaW9uIGlubmVyTGVmdCA9IGxlZnQubGVmdDsKICAgICAgaXIuRXhwcmVzc2lvbiBtaWRkbGUgPSBsZWZ0LnJpZ2h0OwogICAgICBfaGFuZGxlTG9naWNhbEV4cHJlc3Npb24oCiAgICAgICAgICBpbm5lckxlZnQsCiAgICAgICAgICAoKSA9PiBfaGFuZGxlTG9naWNhbEV4cHJlc3Npb24obWlkZGxlLCB2aXNpdFJpZ2h0LCBicmFuY2hlciwgb3BlcmF0b3IsCiAgICAgICAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEJpbmFyeShtaWRkbGUpKSwKICAgICAgICAgIGJyYW5jaGVyLAogICAgICAgICAgb3BlcmF0b3IsCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9IGVsc2UgewogICAgICBicmFuY2hlci5oYW5kbGVMb2dpY2FsQmluYXJ5KAogICAgICAgICAgKCkgPT4gbGVmdC5hY2NlcHQodGhpcyksIHZpc2l0UmlnaHQsIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICAgICAgaXNBbmQ6IG9wZXJhdG9yID09ICcmJicpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludExpdGVyYWwoaXIuSW50TGl0ZXJhbCBub2RlKSB7CiAgICBzdGFjay5hZGQoZ3JhcGguYWRkQ29uc3RhbnRJbnRBc1Vuc2lnbmVkKG5vZGUudmFsdWUsIGNsb3NlZFdvcmxkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RG91YmxlTGl0ZXJhbChpci5Eb3VibGVMaXRlcmFsIG5vZGUpIHsKICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudERvdWJsZShub2RlLnZhbHVlLCBjbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJvb2xMaXRlcmFsKGlyLkJvb2xMaXRlcmFsIG5vZGUpIHsKICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudEJvb2wobm9kZS52YWx1ZSwgY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdHJpbmdMaXRlcmFsKGlyLlN0cmluZ0xpdGVyYWwgbm9kZSkgewogICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50U3RyaW5nKG5vZGUudmFsdWUsIGNsb3NlZFdvcmxkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3ltYm9sTGl0ZXJhbChpci5TeW1ib2xMaXRlcmFsIG5vZGUpIHsKICAgIHN0YWNrLmFkZCgKICAgICAgICBncmFwaC5hZGRDb25zdGFudChfZWxlbWVudE1hcC5nZXRDb25zdGFudFZhbHVlKG5vZGUpLCBjbG9zZWRXb3JsZCkpOwogICAgcmVnaXN0cnk/LnJlZ2lzdGVyQ29uc3RTeW1ib2wobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TnVsbExpdGVyYWwoaXIuTnVsbExpdGVyYWwgbm9kZSkgewogICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCkpOwogIH0KCiAgLy8vIFNldCB0aGUgcnVudGltZSB0eXBlIGluZm9ybWF0aW9uIGlmIG5lY2Vzc2FyeS4KICBISW5zdHJ1Y3Rpb24gX3NldExpc3RSdW50aW1lVHlwZUluZm9JZk5lZWRlZChISW5zdHJ1Y3Rpb24gb2JqZWN0LAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBpZiAoIXJ0aU5lZWQuY2xhc3NOZWVkc1R5cGVBcmd1bWVudHModHlwZS5lbGVtZW50KSB8fCB0eXBlLnRyZWF0QXNSYXcpIHsKICAgICAgcmV0dXJuIG9iamVjdDsKICAgIH0KICAgIExpc3Q8SEluc3RydWN0aW9uPiBhcmd1bWVudHMgPSA8SEluc3RydWN0aW9uPltdOwogICAgZm9yIChEYXJ0VHlwZSBhcmd1bWVudCBpbiB0eXBlLnR5cGVBcmd1bWVudHMpIHsKICAgICAgYXJndW1lbnRzLmFkZCh0eXBlQnVpbGRlci5hbmFseXplVHlwZUFyZ3VtZW50KGFyZ3VtZW50LCBzb3VyY2VFbGVtZW50KSk7CiAgICB9CiAgICAvLyBUT0RPKDE1NDg5KTogUmVnaXN0ZXIgYXQgY29kZWdlbi4KICAgIHJlZ2lzdHJ5Py5yZWdpc3Rlckluc3RhbnRpYXRpb24odHlwZSk7CiAgICByZXR1cm4gY2FsbFNldFJ1bnRpbWVUeXBlSW5mb1dpdGhUeXBlQXJndW1lbnRzKAogICAgICAgIHR5cGUsIGFyZ3VtZW50cywgb2JqZWN0LCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGlzdExpdGVyYWwoaXIuTGlzdExpdGVyYWwgbm9kZSkgewogICAgSEluc3RydWN0aW9uIGxpc3RJbnN0cnVjdGlvbjsKICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgbGlzdEluc3RydWN0aW9uID0KICAgICAgICAgIGdyYXBoLmFkZENvbnN0YW50KF9lbGVtZW50TWFwLmdldENvbnN0YW50VmFsdWUobm9kZSksIGNsb3NlZFdvcmxkKTsKICAgIH0gZWxzZSB7CiAgICAgIExpc3Q8SEluc3RydWN0aW9uPiBlbGVtZW50cyA9IDxISW5zdHJ1Y3Rpb24+W107CiAgICAgIGZvciAoaXIuRXhwcmVzc2lvbiBlbGVtZW50IGluIG5vZGUuZXhwcmVzc2lvbnMpIHsKICAgICAgICBlbGVtZW50LmFjY2VwdCh0aGlzKTsKICAgICAgICBlbGVtZW50cy5hZGQocG9wKCkpOwogICAgICB9CiAgICAgIGxpc3RJbnN0cnVjdGlvbiA9IGJ1aWxkTGl0ZXJhbExpc3QoZWxlbWVudHMpOwogICAgICBhZGQobGlzdEluc3RydWN0aW9uKTsKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPQogICAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZExpc3RMaXRlcmFsKG5vZGUpOwogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUgPSBsb2NhbHNIYW5kbGVyLnN1YnN0SW5Db250ZXh0KAogICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmxpc3RUeXBlKF9lbGVtZW50TWFwLmdldERhcnRUeXBlKG5vZGUudHlwZUFyZ3VtZW50KSkpOwogICAgICBsaXN0SW5zdHJ1Y3Rpb24gPSBfc2V0TGlzdFJ1bnRpbWVUeXBlSW5mb0lmTmVlZGVkKAogICAgICAgICAgbGlzdEluc3RydWN0aW9uLCB0eXBlLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CgogICAgQWJzdHJhY3RWYWx1ZSB0eXBlID0KICAgICAgICBfdHlwZUluZmVyZW5jZU1hcC50eXBlT2ZMaXN0TGl0ZXJhbChub2RlLCBhYnN0cmFjdFZhbHVlRG9tYWluKTsKICAgIGlmIChhYnN0cmFjdFZhbHVlRG9tYWluLmNvbnRhaW5zQWxsKHR5cGUpLmlzRGVmaW5pdGVseUZhbHNlKSB7CiAgICAgIGxpc3RJbnN0cnVjdGlvbi5pbnN0cnVjdGlvblR5cGUgPSB0eXBlOwogICAgfQogICAgc3RhY2suYWRkKGxpc3RJbnN0cnVjdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U2V0TGl0ZXJhbChpci5TZXRMaXRlcmFsIG5vZGUpIHsKICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgc3RhY2suYWRkKAogICAgICAgICAgZ3JhcGguYWRkQ29uc3RhbnQoX2VsZW1lbnRNYXAuZ2V0Q29uc3RhbnRWYWx1ZShub2RlKSwgY2xvc2VkV29ybGQpKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIFRoZSBzZXQgbGl0ZXJhbCBjb25zdHJ1Y3RvcnMgdGFrZSB0aGUgZWxlbWVudHMgYXMgYSBMaXN0LgogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGVsZW1lbnRzID0gPEhJbnN0cnVjdGlvbj5bXTsKICAgIGZvciAoaXIuRXhwcmVzc2lvbiBlbGVtZW50IGluIG5vZGUuZXhwcmVzc2lvbnMpIHsKICAgICAgZWxlbWVudC5hY2NlcHQodGhpcyk7CiAgICAgIGVsZW1lbnRzLmFkZChwb3AoKSk7CiAgICB9CgogICAgLy8gVGhlIGNvbnN0cnVjdG9yIGlzIGEgcHJvY2VkdXJlIGJlY2F1c2UgaXQncyBhIGZhY3RvcnkuCiAgICBGdW5jdGlvbkVudGl0eSBjb25zdHJ1Y3RvcjsKICAgIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMgPSA8SEluc3RydWN0aW9uPltdOwogICAgaWYgKGVsZW1lbnRzLmlzRW1wdHkpIHsKICAgICAgY29uc3RydWN0b3IgPSBfY29tbW9uRWxlbWVudHMuc2V0TGl0ZXJhbENvbnN0cnVjdG9yRW1wdHk7CiAgICB9IGVsc2UgewogICAgICBjb25zdHJ1Y3RvciA9IF9jb21tb25FbGVtZW50cy5zZXRMaXRlcmFsQ29uc3RydWN0b3I7CiAgICAgIEhMaXRlcmFsTGlzdCBhcmdMaXN0ID0gYnVpbGRMaXRlcmFsTGlzdChlbGVtZW50cyk7CiAgICAgIGFkZChhcmdMaXN0KTsKICAgICAgaW5wdXRzLmFkZChhcmdMaXN0KTsKICAgIH0KCiAgICBhc3NlcnQoCiAgICAgICAgY29uc3RydWN0b3IgaXMgQ29uc3RydWN0b3JFbnRpdHkgJiYgY29uc3RydWN0b3IuaXNGYWN0b3J5Q29uc3RydWN0b3IpOwoKICAgIEludGVyZmFjZVR5cGUgdHlwZSA9IGxvY2Fsc0hhbmRsZXIuc3Vic3RJbkNvbnRleHQoCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLnNldFR5cGUoX2VsZW1lbnRNYXAuZ2V0RGFydFR5cGUobm9kZS50eXBlQXJndW1lbnQpKSk7CiAgICBDbGFzc0VudGl0eSBjbHMgPSBjb25zdHJ1Y3Rvci5lbmNsb3NpbmdDbGFzczsKCiAgICBpZiAocnRpTmVlZC5jbGFzc05lZWRzVHlwZUFyZ3VtZW50cyhjbHMpKSB7CiAgICAgIExpc3Q8SEluc3RydWN0aW9uPiB0eXBlSW5wdXRzID0gPEhJbnN0cnVjdGlvbj5bXTsKICAgICAgdHlwZS50eXBlQXJndW1lbnRzLmZvckVhY2goKERhcnRUeXBlIGFyZ3VtZW50KSB7CiAgICAgICAgdHlwZUlucHV0cwogICAgICAgICAgICAuYWRkKHR5cGVCdWlsZGVyLmFuYWx5emVUeXBlQXJndW1lbnQoYXJndW1lbnQsIHNvdXJjZUVsZW1lbnQpKTsKICAgICAgfSk7CgogICAgICAvLyBXZSBsaWZ0IHRoaXMgY29tbW9uIGNhbGwgcGF0dGVybiBpbnRvIGEgaGVscGVyIGZ1bmN0aW9uIHRvIHNhdmUgc3BhY2UKICAgICAgLy8gaW4gdGhlIG91dHB1dC4KICAgICAgaWYgKHR5cGVJbnB1dHMuZXZlcnkoKEhJbnN0cnVjdGlvbiBpbnB1dCkgPT4KICAgICAgICAgIGlucHV0LmlzTnVsbChhYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSkgewogICAgICAgIGlmIChlbGVtZW50cy5pc0VtcHR5KSB7CiAgICAgICAgICBjb25zdHJ1Y3RvciA9IF9jb21tb25FbGVtZW50cy5zZXRMaXRlcmFsVW50eXBlZEVtcHR5TWFrZXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0cnVjdG9yID0gX2NvbW1vbkVsZW1lbnRzLnNldExpdGVyYWxVbnR5cGVkTWFrZXI7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlucHV0cy5hZGRBbGwodHlwZUlucHV0cyk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBJZiBydW50aW1lIHR5cGUgaW5mb3JtYXRpb24gaXMgbmVlZGVkIGFuZCB0aGUgc2V0IGxpdGVyYWwgaGFzIG5vIHR5cGUKICAgIC8vIHBhcmFtZXRlciwgJ2NvbnN0cnVjdG9yJyBpcyBhIHN0YXRpYyBmdW5jdGlvbiB0aGF0IGZvcndhcmRzIHRoZSBjYWxsIHRvCiAgICAvLyB0aGUgZmFjdG9yeSBjb25zdHJ1Y3RvciB3aXRob3V0IGEgdHlwZSBwYXJhbWV0ZXIuCiAgICBhc3NlcnQoY29uc3RydWN0b3IuaXNGdW5jdGlvbiB8fAogICAgICAgIChjb25zdHJ1Y3RvciBpcyBDb25zdHJ1Y3RvckVudGl0eSAmJiBjb25zdHJ1Y3Rvci5pc0ZhY3RvcnlDb25zdHJ1Y3RvcikpOwoKICAgIC8vIFRoZSBpbnN0cnVjdGlvbiB0eXBlIHdpbGwgYWx3YXlzIGJlIGEgc3VidHlwZSBvZiB0aGUgc2V0TGl0ZXJhbENsYXNzLCBidXQKICAgIC8vIHR5cGUgaW5mZXJlbmNlIG1pZ2h0IGRpc2NvdmVyIGEgbW9yZSBzcGVjaWZpYyB0eXBlIG9yIGZpbmQgbm90aGluZyAoaW4KICAgIC8vIGRhcnQyanMgdW5pdCB0ZXN0cykuCgogICAgQWJzdHJhY3RWYWx1ZSBzZXRUeXBlID0gYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgIC5jcmVhdGVOb25OdWxsU3VidHlwZShfY29tbW9uRWxlbWVudHMuc2V0TGl0ZXJhbENsYXNzKTsKICAgIEFic3RyYWN0VmFsdWUgcmV0dXJuVHlwZU1hc2sgPQogICAgICAgIF90eXBlSW5mZXJlbmNlTWFwLmdldFJldHVyblR5cGVPZihjb25zdHJ1Y3Rvcik7CiAgICBBYnN0cmFjdFZhbHVlIGluc3RydWN0aW9uVHlwZSA9CiAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5pbnRlcnNlY3Rpb24oc2V0VHlwZSwgcmV0dXJuVHlwZU1hc2spOwoKICAgIGFkZEltcGxpY2l0SW5zdGFudGlhdGlvbih0eXBlKTsKICAgIF9wdXNoU3RhdGljSW52b2NhdGlvbigKICAgICAgICBjb25zdHJ1Y3RvciwgaW5wdXRzLCBpbnN0cnVjdGlvblR5cGUsIGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZE5ldyhub2RlKSk7CiAgICByZW1vdmVJbXBsaWNpdEluc3RhbnRpYXRpb24odHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TWFwTGl0ZXJhbChpci5NYXBMaXRlcmFsIG5vZGUpIHsKICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgc3RhY2suYWRkKAogICAgICAgICAgZ3JhcGguYWRkQ29uc3RhbnQoX2VsZW1lbnRNYXAuZ2V0Q29uc3RhbnRWYWx1ZShub2RlKSwgY2xvc2VkV29ybGQpKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIFRoZSBtYXAgbGl0ZXJhbCBjb25zdHJ1Y3RvcnMgdGFrZSB0aGUga2V5LXZhbHVlIHBhaXJzIGFzIGEgTGlzdAogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGNvbnN0cnVjdG9yQXJncyA9IDxISW5zdHJ1Y3Rpb24+W107CiAgICBmb3IgKGlyLk1hcEVudHJ5IG1hcEVudHJ5IGluIG5vZGUuZW50cmllcykgewogICAgICBtYXBFbnRyeS5rZXkuYWNjZXB0KHRoaXMpOwogICAgICBjb25zdHJ1Y3RvckFyZ3MuYWRkKHBvcCgpKTsKICAgICAgbWFwRW50cnkudmFsdWUuYWNjZXB0KHRoaXMpOwogICAgICBjb25zdHJ1Y3RvckFyZ3MuYWRkKHBvcCgpKTsKICAgIH0KCiAgICAvLyBUaGUgY29uc3RydWN0b3IgaXMgYSBwcm9jZWR1cmUgYmVjYXVzZSBpdCdzIGEgZmFjdG9yeS4KICAgIEZ1bmN0aW9uRW50aXR5IGNvbnN0cnVjdG9yOwogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cyA9IDxISW5zdHJ1Y3Rpb24+W107CiAgICBpZiAoY29uc3RydWN0b3JBcmdzLmlzRW1wdHkpIHsKICAgICAgY29uc3RydWN0b3IgPSBfY29tbW9uRWxlbWVudHMubWFwTGl0ZXJhbENvbnN0cnVjdG9yRW1wdHk7CiAgICB9IGVsc2UgewogICAgICBjb25zdHJ1Y3RvciA9IF9jb21tb25FbGVtZW50cy5tYXBMaXRlcmFsQ29uc3RydWN0b3I7CiAgICAgIEhMaXRlcmFsTGlzdCBhcmdMaXN0ID0gYnVpbGRMaXRlcmFsTGlzdChjb25zdHJ1Y3RvckFyZ3MpOwogICAgICBhZGQoYXJnTGlzdCk7CiAgICAgIGlucHV0cy5hZGQoYXJnTGlzdCk7CiAgICB9CgogICAgYXNzZXJ0KAogICAgICAgIGNvbnN0cnVjdG9yIGlzIENvbnN0cnVjdG9yRW50aXR5ICYmIGNvbnN0cnVjdG9yLmlzRmFjdG9yeUNvbnN0cnVjdG9yKTsKCiAgICBJbnRlcmZhY2VUeXBlIHR5cGUgPSBsb2NhbHNIYW5kbGVyLnN1YnN0SW5Db250ZXh0KF9jb21tb25FbGVtZW50cy5tYXBUeXBlKAogICAgICAgIF9lbGVtZW50TWFwLmdldERhcnRUeXBlKG5vZGUua2V5VHlwZSksCiAgICAgICAgX2VsZW1lbnRNYXAuZ2V0RGFydFR5cGUobm9kZS52YWx1ZVR5cGUpKSk7CiAgICBDbGFzc0VudGl0eSBjbHMgPSBjb25zdHJ1Y3Rvci5lbmNsb3NpbmdDbGFzczsKCiAgICBpZiAocnRpTmVlZC5jbGFzc05lZWRzVHlwZUFyZ3VtZW50cyhjbHMpKSB7CiAgICAgIExpc3Q8SEluc3RydWN0aW9uPiB0eXBlSW5wdXRzID0gPEhJbnN0cnVjdGlvbj5bXTsKICAgICAgdHlwZS50eXBlQXJndW1lbnRzLmZvckVhY2goKERhcnRUeXBlIGFyZ3VtZW50KSB7CiAgICAgICAgdHlwZUlucHV0cwogICAgICAgICAgICAuYWRkKHR5cGVCdWlsZGVyLmFuYWx5emVUeXBlQXJndW1lbnQoYXJndW1lbnQsIHNvdXJjZUVsZW1lbnQpKTsKICAgICAgfSk7CgogICAgICAvLyBXZSBsaWZ0IHRoaXMgY29tbW9uIGNhbGwgcGF0dGVybiBpbnRvIGEgaGVscGVyIGZ1bmN0aW9uIHRvIHNhdmUgc3BhY2UKICAgICAgLy8gaW4gdGhlIG91dHB1dC4KICAgICAgaWYgKHR5cGVJbnB1dHMuZXZlcnkoKEhJbnN0cnVjdGlvbiBpbnB1dCkgPT4KICAgICAgICAgIGlucHV0LmlzTnVsbChhYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSkgewogICAgICAgIGlmIChjb25zdHJ1Y3RvckFyZ3MuaXNFbXB0eSkgewogICAgICAgICAgY29uc3RydWN0b3IgPSBfY29tbW9uRWxlbWVudHMubWFwTGl0ZXJhbFVudHlwZWRFbXB0eU1ha2VyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdHJ1Y3RvciA9IF9jb21tb25FbGVtZW50cy5tYXBMaXRlcmFsVW50eXBlZE1ha2VyOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpbnB1dHMuYWRkQWxsKHR5cGVJbnB1dHMpOwogICAgICB9CiAgICB9CgogICAgLy8gSWYgcnVudGltZSB0eXBlIGluZm9ybWF0aW9uIGlzIG5lZWRlZCBhbmQgdGhlIG1hcCBsaXRlcmFsIGhhcyBubyB0eXBlCiAgICAvLyBwYXJhbWV0ZXJzLCAnY29uc3RydWN0b3InIGlzIGEgc3RhdGljIGZ1bmN0aW9uIHRoYXQgZm9yd2FyZHMgdGhlIGNhbGwgdG8KICAgIC8vIHRoZSBmYWN0b3J5IGNvbnN0cnVjdG9yIHdpdGhvdXQgdHlwZSBwYXJhbWV0ZXJzLgogICAgYXNzZXJ0KGNvbnN0cnVjdG9yLmlzRnVuY3Rpb24gfHwKICAgICAgICAoY29uc3RydWN0b3IgaXMgQ29uc3RydWN0b3JFbnRpdHkgJiYgY29uc3RydWN0b3IuaXNGYWN0b3J5Q29uc3RydWN0b3IpKTsKCiAgICAvLyBUaGUgaW5zdHJ1Y3Rpb24gdHlwZSB3aWxsIGFsd2F5cyBiZSBhIHN1YnR5cGUgb2YgdGhlIG1hcExpdGVyYWxDbGFzcywgYnV0CiAgICAvLyB0eXBlIGluZmVyZW5jZSBtaWdodCBkaXNjb3ZlciBhIG1vcmUgc3BlY2lmaWMgdHlwZSwgb3IgZmluZCBub3RoaW5nIChpbgogICAgLy8gZGFydDJqcyB1bml0IHRlc3RzKS4KCiAgICBBYnN0cmFjdFZhbHVlIG1hcFR5cGUgPSBhYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgLmNyZWF0ZU5vbk51bGxTdWJ0eXBlKF9jb21tb25FbGVtZW50cy5tYXBMaXRlcmFsQ2xhc3MpOwogICAgQWJzdHJhY3RWYWx1ZSByZXR1cm5UeXBlTWFzayA9CiAgICAgICAgX3R5cGVJbmZlcmVuY2VNYXAuZ2V0UmV0dXJuVHlwZU9mKGNvbnN0cnVjdG9yKTsKICAgIEFic3RyYWN0VmFsdWUgaW5zdHJ1Y3Rpb25UeXBlID0KICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmludGVyc2VjdGlvbihtYXBUeXBlLCByZXR1cm5UeXBlTWFzayk7CgogICAgYWRkSW1wbGljaXRJbnN0YW50aWF0aW9uKHR5cGUpOwogICAgX3B1c2hTdGF0aWNJbnZvY2F0aW9uKAogICAgICAgIGNvbnN0cnVjdG9yLCBpbnB1dHMsIGluc3RydWN0aW9uVHlwZSwgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkTmV3KG5vZGUpKTsKICAgIHJlbW92ZUltcGxpY2l0SW5zdGFudGlhdGlvbih0eXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRNYXBFbnRyeShpci5NYXBFbnRyeSBub2RlKSB7CiAgICBmYWlsZWRBdChDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICdpci5NYXBFbnRyeSBzaG91bGQgYmUgaGFuZGxlZCBpbiB2aXNpdE1hcExpdGVyYWwnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlTGl0ZXJhbChpci5UeXBlTGl0ZXJhbCBub2RlKSB7CiAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9CiAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEdldChub2RlKTsKICAgIGlyLkRhcnRUeXBlIHR5cGUgPSBub2RlLnR5cGU7CiAgICBpZiAodHlwZSBpcyBpci5JbnRlcmZhY2VUeXBlIHx8CiAgICAgICAgdHlwZSBpcyBpci5EeW5hbWljVHlwZSB8fAogICAgICAgIHR5cGUgaXMgaXIuVHlwZWRlZlR5cGUgfHwKICAgICAgICB0eXBlIGlzIGlyLkZ1bmN0aW9uVHlwZSkgewogICAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50ID0gX2VsZW1lbnRNYXAuZ2V0Q29uc3RhbnRWYWx1ZShub2RlKTsKICAgICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50KGNvbnN0YW50LCBjbG9zZWRXb3JsZCwKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICByZXR1cm47CiAgICB9CiAgICBhc3NlcnQoCiAgICAgICAgdHlwZSBpcyBpci5UeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwgIlVuZXhwZWN0ZWQgdHlwZSBsaXRlcmFsICR7bm9kZX0uIikpOwogICAgLy8gRm9yIG90aGVyIHR5cGVzIChlLmcuIFR5cGVQYXJhbWV0ZXJUeXBlLCBmdW5jdGlvbiB0eXBlcyBmcm9tIGV4cGFuZGVkCiAgICAvLyB0eXBlZGVmcyksIGxvb2stdXAgb3IgY29uc3RydWN0IGEgcmVpZmllZCB0eXBlIHJlcHJlc2VudGF0aW9uIGFuZCBjb252ZXJ0CiAgICAvLyB0byBhIFJ1bnRpbWVUeXBlLgoKICAgIERhcnRUeXBlIGRhcnRUeXBlID0gX2VsZW1lbnRNYXAuZ2V0RGFydFR5cGUodHlwZSk7CiAgICBkYXJ0VHlwZSA9IGxvY2Fsc0hhbmRsZXIuc3Vic3RJbkNvbnRleHQoZGFydFR5cGUpOwogICAgSEluc3RydWN0aW9uIHZhbHVlID0gdHlwZUJ1aWxkZXIuYW5hbHl6ZVR5cGVBcmd1bWVudCgKICAgICAgICBkYXJ0VHlwZSwgc291cmNlRWxlbWVudCwKICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pOwogICAgX3B1c2hTdGF0aWNJbnZvY2F0aW9uKAogICAgICAgIF9jb21tb25FbGVtZW50cy5jcmVhdGVSdW50aW1lVHlwZSwKICAgICAgICA8SEluc3RydWN0aW9uPlt2YWx1ZV0sCiAgICAgICAgX3R5cGVJbmZlcmVuY2VNYXAuZ2V0UmV0dXJuVHlwZU9mKF9jb21tb25FbGVtZW50cy5jcmVhdGVSdW50aW1lVHlwZSksCiAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RhdGljR2V0KGlyLlN0YXRpY0dldCBub2RlKSB7CiAgICBpci5NZW1iZXIgc3RhdGljVGFyZ2V0ID0gbm9kZS50YXJnZXQ7CiAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9CiAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEdldChub2RlKTsKICAgIGlmIChzdGF0aWNUYXJnZXQgaXMgaXIuUHJvY2VkdXJlICYmCiAgICAgICAgc3RhdGljVGFyZ2V0LmtpbmQgPT0gaXIuUHJvY2VkdXJlS2luZC5HZXR0ZXIpIHsKICAgICAgRnVuY3Rpb25FbnRpdHkgZ2V0dGVyID0gX2VsZW1lbnRNYXAuZ2V0TWVtYmVyKHN0YXRpY1RhcmdldCk7CiAgICAgIC8vIEludm9rZSB0aGUgZ2V0dGVyCiAgICAgIF9wdXNoU3RhdGljSW52b2NhdGlvbihnZXR0ZXIsIGNvbnN0IDxISW5zdHJ1Y3Rpb24+W10sCiAgICAgICAgICBfdHlwZUluZmVyZW5jZU1hcC5nZXRSZXR1cm5UeXBlT2YoZ2V0dGVyKSwgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0gZWxzZSBpZiAoc3RhdGljVGFyZ2V0IGlzIGlyLkZpZWxkKSB7CiAgICAgIEZpZWxkRW50aXR5IGZpZWxkID0gX2VsZW1lbnRNYXAuZ2V0RmllbGQoc3RhdGljVGFyZ2V0KTsKICAgICAgRmllbGRBbmFseXNpc0RhdGEgZmllbGREYXRhID0gX2ZpZWxkQW5hbHlzaXMuZ2V0RmllbGREYXRhKGZpZWxkKTsKICAgICAgaWYgKGZpZWxkRGF0YS5pc0VhZ2VyKSB7CiAgICAgICAgcHVzaChuZXcgSFN0YXRpYyhmaWVsZCwgX3R5cGVJbmZlcmVuY2VNYXAuZ2V0SW5mZXJyZWRUeXBlT2YoZmllbGQpLAogICAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICB9IGVsc2UgaWYgKGZpZWxkRGF0YS5pc0VmZmVjdGl2ZWx5Q29uc3RhbnQpIHsKICAgICAgICB2YXIgdW5pdCA9IGNsb3NlZFdvcmxkLm91dHB1dFVuaXREYXRhLm91dHB1dFVuaXRGb3JNZW1iZXIoZmllbGQpOwogICAgICAgIC8vIFRPRE8oc2lnbXVuZCk6IHRoaXMgaXMgbm90IGVxdWl2YWxlbnQgdG8gd2hhdCB0aGUgb2xkIEZFIGRvZXM6IGlmCiAgICAgICAgLy8gdGhlcmUgaXMgbm8gcHJlZml4IHRoZSBvbGQgRkUgd291bGRuJ3QgdHJlYXQgdGhpcyBpbiBhbnkgc3BlY2lhbAogICAgICAgIC8vIHdheS4gQWxzbywgaWYgdGhlIHByZWZpeCBwb2ludHMgdG8gYSBjb25zdGFudCBpbiB0aGUgbWFpbiBvdXRwdXQKICAgICAgICAvLyB1bml0LCB0aGUgb2xkIEZFIHdvdWxkIHN0aWxsIGdlbmVyYXRlIGEgZGVmZXJyZWQgd3JhcHBlciBoZXJlLgogICAgICAgIGlmICghY2xvc2VkV29ybGQub3V0cHV0VW5pdERhdGEKICAgICAgICAgICAgLmhhc09ubHlOb25EZWZlcnJlZEltcG9ydFBhdGhzKHRhcmdldEVsZW1lbnQsIGZpZWxkKSkgewogICAgICAgICAgc3RhY2suYWRkKGdyYXBoLmFkZERlZmVycmVkQ29uc3RhbnQoCiAgICAgICAgICAgICAgZmllbGREYXRhLmluaXRpYWxWYWx1ZSwgdW5pdCwgc291cmNlSW5mb3JtYXRpb24sIGNsb3NlZFdvcmxkKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudChmaWVsZERhdGEuaW5pdGlhbFZhbHVlLCBjbG9zZWRXb3JsZCwKICAgICAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXNzZXJ0KAogICAgICAgICAgICBmaWVsZERhdGEuaXNMYXp5LCAiVW5leHBlY3RlZCBmaWVsZCBkYXRhIGZvciAkZmllbGQ6ICRmaWVsZERhdGEiKTsKICAgICAgICBwdXNoKG5ldyBITGF6eVN0YXRpYyhmaWVsZCwgX3R5cGVJbmZlcmVuY2VNYXAuZ2V0SW5mZXJyZWRUeXBlT2YoZmllbGQpLAogICAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0gX2VsZW1lbnRNYXAuZ2V0TWVtYmVyKHN0YXRpY1RhcmdldCk7CiAgICAgIHB1c2gobmV3IEhTdGF0aWMobWVtYmVyLCBfdHlwZUluZmVyZW5jZU1hcC5nZXRJbmZlcnJlZFR5cGVPZihtZW1iZXIpLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdGF0aWNTZXQoaXIuU3RhdGljU2V0IG5vZGUpIHsKICAgIG5vZGUudmFsdWUuYWNjZXB0KHRoaXMpOwogICAgSEluc3RydWN0aW9uIHZhbHVlID0gcG9wKCk7CgogICAgaXIuTWVtYmVyIHN0YXRpY1RhcmdldCA9IG5vZGUudGFyZ2V0OwogICAgaWYgKHN0YXRpY1RhcmdldCBpcyBpci5Qcm9jZWR1cmUpIHsKICAgICAgRnVuY3Rpb25FbnRpdHkgc2V0dGVyID0gX2VsZW1lbnRNYXAuZ2V0TWVtYmVyKHN0YXRpY1RhcmdldCk7CiAgICAgIC8vIEludm9rZSB0aGUgc2V0dGVyCiAgICAgIF9wdXNoU3RhdGljSW52b2NhdGlvbihzZXR0ZXIsIDxISW5zdHJ1Y3Rpb24+W3ZhbHVlXSwKICAgICAgICAgIF90eXBlSW5mZXJlbmNlTWFwLmdldFJldHVyblR5cGVPZihzZXR0ZXIpLCBjb25zdCA8RGFydFR5cGU+W10sCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZFNldChub2RlKSk7CiAgICAgIHBvcCgpOwogICAgfSBlbHNlIHsKICAgICAgTWVtYmVyRW50aXR5IHRhcmdldCA9IF9lbGVtZW50TWFwLmdldE1lbWJlcihzdGF0aWNUYXJnZXQpOwogICAgICBpZiAoIV9maWVsZEFuYWx5c2lzLmdldEZpZWxkRGF0YSh0YXJnZXQpLmlzRWxpZGVkKSB7CiAgICAgICAgYWRkKG5ldyBIU3RhdGljU3RvcmUoCiAgICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4sCiAgICAgICAgICAgIHRhcmdldCwKICAgICAgICAgICAgdHlwZUJ1aWxkZXIucG90ZW50aWFsbHlDaGVja09yVHJ1c3RUeXBlT2ZBc3NpZ25tZW50KAogICAgICAgICAgICAgICAgdmFsdWUsIF9nZXREYXJ0VHlwZUlmVmFsaWQoc3RhdGljVGFyZ2V0LnNldHRlclR5cGUpKSkpOwogICAgICB9CiAgICB9CiAgICBzdGFjay5hZGQodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFByb3BlcnR5R2V0KGlyLlByb3BlcnR5R2V0IG5vZGUpIHsKICAgIG5vZGUucmVjZWl2ZXIuYWNjZXB0KHRoaXMpOwogICAgSEluc3RydWN0aW9uIHJlY2VpdmVyID0gcG9wKCk7CgogICAgX3B1c2hEeW5hbWljSW52b2NhdGlvbigKICAgICAgICBub2RlLAogICAgICAgIF90eXBlSW5mZXJlbmNlTWFwLnJlY2VpdmVyVHlwZU9mR2V0KG5vZGUpLAogICAgICAgIG5ldyBTZWxlY3Rvci5nZXR0ZXIoX2VsZW1lbnRNYXAuZ2V0TmFtZShub2RlLm5hbWUpKSwKICAgICAgICA8SEluc3RydWN0aW9uPltyZWNlaXZlcl0sCiAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRHZXQobm9kZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFZhcmlhYmxlR2V0KGlyLlZhcmlhYmxlR2V0IG5vZGUpIHsKICAgIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSBub2RlLnZhcmlhYmxlOwogICAgSEluc3RydWN0aW9uIGxldEJpbmRpbmcgPSBsZXRCaW5kaW5nc1t2YXJpYWJsZV07CiAgICBpZiAobGV0QmluZGluZyAhPSBudWxsKSB7CiAgICAgIHN0YWNrLmFkZChsZXRCaW5kaW5nKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIExvY2FsIGxvY2FsID0gbG9jYWxzTWFwLmdldExvY2FsVmFyaWFibGUobm9kZS52YXJpYWJsZSk7CiAgICBzdGFjay5hZGQobG9jYWxzSGFuZGxlci5yZWFkTG9jYWwobG9jYWwsCiAgICAgICAgc291cmNlSW5mb3JtYXRpb246IF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRHZXQobm9kZSkpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRQcm9wZXJ0eVNldChpci5Qcm9wZXJ0eVNldCBub2RlKSB7CiAgICBub2RlLnJlY2VpdmVyLmFjY2VwdCh0aGlzKTsKICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciA9IHBvcCgpOwogICAgbm9kZS52YWx1ZS5hY2NlcHQodGhpcyk7CiAgICBISW5zdHJ1Y3Rpb24gdmFsdWUgPSBwb3AoKTsKCiAgICBfcHVzaER5bmFtaWNJbnZvY2F0aW9uKAogICAgICAgIG5vZGUsCiAgICAgICAgX3R5cGVJbmZlcmVuY2VNYXAucmVjZWl2ZXJUeXBlT2ZTZXQobm9kZSwgYWJzdHJhY3RWYWx1ZURvbWFpbiksCiAgICAgICAgbmV3IFNlbGVjdG9yLnNldHRlcihfZWxlbWVudE1hcC5nZXROYW1lKG5vZGUubmFtZSkpLAogICAgICAgIDxISW5zdHJ1Y3Rpb24+W3JlY2VpdmVyLCB2YWx1ZV0sCiAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRBc3NpZ25tZW50KG5vZGUpKTsKCiAgICBwb3AoKTsKICAgIHN0YWNrLmFkZCh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RGlyZWN0UHJvcGVydHlHZXQoaXIuRGlyZWN0UHJvcGVydHlHZXQgbm9kZSkgewogICAgbm9kZS5yZWNlaXZlci5hY2NlcHQodGhpcyk7CiAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIgPSBwb3AoKTsKCiAgICAvLyBGYWtlIGRpcmVjdCBjYWxsIHdpdGggYSBkeW5hbWljIGNhbGwuCiAgICAvLyBUT0RPKHNyYSk6IEltcGxlbWVudCBkaXJlY3QgaW52b2NhdGlvbnMgcHJvcGVybHkuCiAgICBfcHVzaER5bmFtaWNJbnZvY2F0aW9uKAogICAgICAgIG5vZGUsCiAgICAgICAgX3R5cGVJbmZlcmVuY2VNYXAucmVjZWl2ZXJUeXBlT2ZEaXJlY3RHZXQobm9kZSksCiAgICAgICAgbmV3IFNlbGVjdG9yLmdldHRlcihfZWxlbWVudE1hcC5nZXRNZW1iZXIobm9kZS50YXJnZXQpLm1lbWJlck5hbWUpLAogICAgICAgIDxISW5zdHJ1Y3Rpb24+W3JlY2VpdmVyXSwKICAgICAgICBjb25zdCA8RGFydFR5cGU+W10sCiAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEdldChub2RlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RGlyZWN0UHJvcGVydHlTZXQoaXIuRGlyZWN0UHJvcGVydHlTZXQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcignaXIuRGlyZWN0UHJvcGVydHlTZXQnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREaXJlY3RNZXRob2RJbnZvY2F0aW9uKGlyLkRpcmVjdE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcignaXIuRGlyZWN0TWV0aG9kSW52b2NhdGlvbicpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN1cGVyUHJvcGVydHlTZXQoaXIuU3VwZXJQcm9wZXJ0eVNldCBub2RlKSB7CiAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9CiAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEFzc2lnbm1lbnQobm9kZSk7CiAgICBub2RlLnZhbHVlLmFjY2VwdCh0aGlzKTsKICAgIEhJbnN0cnVjdGlvbiB2YWx1ZSA9IHBvcCgpOwoKICAgIE1lbWJlckVudGl0eSBtZW1iZXIgPSBfZWxlbWVudE1hcAogICAgICAgIC5nZXRTdXBlck1lbWJlcihfY3VycmVudEZyYW1lLm1lbWJlciwgbm9kZS5uYW1lLCBzZXR0ZXI6IHRydWUpOwogICAgaWYgKG1lbWJlciA9PSBudWxsKSB7CiAgICAgIF9nZW5lcmF0ZVN1cGVyTm9TdWNoTWV0aG9kKG5vZGUsIF9lbGVtZW50TWFwLmdldFNlbGVjdG9yKG5vZGUpLm5hbWUgKyAiPSIsCiAgICAgICAgICA8SEluc3RydWN0aW9uPlt2YWx1ZV0sIGNvbnN0IDxEYXJ0VHlwZT5bXSwgc291cmNlSW5mb3JtYXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgX2J1aWxkSW52b2tlU3VwZXIoCiAgICAgICAgICBfZWxlbWVudE1hcC5nZXRTZWxlY3Rvcihub2RlKSwKICAgICAgICAgIF9lbGVtZW50TWFwLmdldENsYXNzKF9jb250YWluaW5nQ2xhc3Mobm9kZSkpLAogICAgICAgICAgbWVtYmVyLAogICAgICAgICAgPEhJbnN0cnVjdGlvbj5bdmFsdWVdLAogICAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb24pOwogICAgfQogICAgcG9wKCk7CiAgICBzdGFjay5hZGQodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFZhcmlhYmxlU2V0KGlyLlZhcmlhYmxlU2V0IG5vZGUpIHsKICAgIG5vZGUudmFsdWUuYWNjZXB0KHRoaXMpOwogICAgSEluc3RydWN0aW9uIHZhbHVlID0gcG9wKCk7CiAgICBfdmlzaXRMb2NhbFNldHRlcigKICAgICAgICBub2RlLnZhcmlhYmxlLCB2YWx1ZSwgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEFzc2lnbm1lbnQobm9kZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICBMb2NhbCBsb2NhbCA9IGxvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKG5vZGUpOwogICAgaWYgKG5vZGUuaW5pdGlhbGl6ZXIgPT0gbnVsbCkgewogICAgICBISW5zdHJ1Y3Rpb24gaW5pdGlhbFZhbHVlID0gZ3JhcGguYWRkQ29uc3RhbnROdWxsKGNsb3NlZFdvcmxkKTsKICAgICAgbG9jYWxzSGFuZGxlci51cGRhdGVMb2NhbChsb2NhbCwgaW5pdGlhbFZhbHVlKTsKICAgIH0gZWxzZSBpZiAobm9kZS5pc0NvbnN0KSB7CiAgICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnQgPSBfZWxlbWVudE1hcC5nZXRDb25zdGFudFZhbHVlKG5vZGUuaW5pdGlhbGl6ZXIpOwogICAgICBhc3NlcnQoY29uc3RhbnQgIT0gbnVsbCwgZmFpbGVkQXQoQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSkpOwogICAgICBISW5zdHJ1Y3Rpb24gaW5pdGlhbFZhbHVlID0gZ3JhcGguYWRkQ29uc3RhbnQoY29uc3RhbnQsIGNsb3NlZFdvcmxkKTsKICAgICAgbG9jYWxzSGFuZGxlci51cGRhdGVMb2NhbChsb2NhbCwgaW5pdGlhbFZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgIG5vZGUuaW5pdGlhbGl6ZXIuYWNjZXB0KHRoaXMpOwogICAgICBISW5zdHJ1Y3Rpb24gaW5pdGlhbFZhbHVlID0gcG9wKCk7CgogICAgICBfdmlzaXRMb2NhbFNldHRlcigKICAgICAgICAgIG5vZGUsIGluaXRpYWxWYWx1ZSwgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEFzc2lnbm1lbnQobm9kZSkpOwoKICAgICAgLy8gSWdub3JlIHZhbHVlCiAgICAgIHBvcCgpOwogICAgfQogIH0KCiAgdm9pZCBfdmlzaXRMb2NhbFNldHRlcihpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBISW5zdHJ1Y3Rpb24gdmFsdWUsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBMb2NhbCBsb2NhbCA9IGxvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKHZhcmlhYmxlKTsKCiAgICAvLyBHaXZlIHRoZSB2YWx1ZSBhIG5hbWUgaWYgaXQgZG9lc24ndCBoYXZlIG9uZSBhbHJlYWR5LgogICAgaWYgKHZhbHVlLnNvdXJjZUVsZW1lbnQgPT0gbnVsbCkgewogICAgICB2YWx1ZS5zb3VyY2VFbGVtZW50ID0gbG9jYWw7CiAgICB9CgogICAgc3RhY2suYWRkKHZhbHVlKTsKICAgIGxvY2Fsc0hhbmRsZXIudXBkYXRlTG9jYWwoCiAgICAgICAgbG9jYWwsCiAgICAgICAgdHlwZUJ1aWxkZXIucG90ZW50aWFsbHlDaGVja09yVHJ1c3RUeXBlT2ZBc3NpZ25tZW50KAogICAgICAgICAgICB2YWx1ZSwgX2dldERhcnRUeXBlSWZWYWxpZCh2YXJpYWJsZS50eXBlKSksCiAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMZXQoaXIuTGV0IG5vZGUpIHsKICAgIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSBub2RlLnZhcmlhYmxlOwogICAgdmFyaWFibGUuaW5pdGlhbGl6ZXIuYWNjZXB0KHRoaXMpOwogICAgSEluc3RydWN0aW9uIGluaXRpYWxpemVkVmFsdWUgPSBwb3AoKTsKICAgIC8vIFRPRE8oc3JhKTogQXBwbHkgaW5mZXJyZWQgdHlwZSBpbmZvcm1hdGlvbi4KICAgIGxldEJpbmRpbmdzW3ZhcmlhYmxlXSA9IGluaXRpYWxpemVkVmFsdWU7CiAgICBub2RlLmJvZHkuYWNjZXB0KHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJsb2NrRXhwcmVzc2lvbihpci5CbG9ja0V4cHJlc3Npb24gbm9kZSkgewogICAgbm9kZS5ib2R5LmFjY2VwdCh0aGlzKTsKICAgIG5vZGUudmFsdWUuYWNjZXB0KHRoaXMpOwogIH0KCiAgLy8vIEV4dHJhY3RzIHRoZSBsaXN0IG9mIGluc3RydWN0aW9ucyBmb3IgdGhlIHBvc2l0aW9uYWwgc3Vic2V0IG9mIGFyZ3VtZW50cy4KICBMaXN0PEhJbnN0cnVjdGlvbj4gX3Zpc2l0UG9zaXRpb25hbEFyZ3VtZW50cyhpci5Bcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICBMaXN0PEhJbnN0cnVjdGlvbj4gcmVzdWx0ID0gPEhJbnN0cnVjdGlvbj5bXTsKICAgIGZvciAoaXIuRXhwcmVzc2lvbiBhcmd1bWVudCBpbiBhcmd1bWVudHMucG9zaXRpb25hbCkgewogICAgICBhcmd1bWVudC5hY2NlcHQodGhpcyk7CiAgICAgIHJlc3VsdC5hZGQocG9wKCkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBCdWlsZHMgdGhlIGxpc3Qgb2YgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgZXhwcmVzc2lvbnMgaW4gdGhlIGFyZ3VtZW50cyB0byBhCiAgLy8vIGR5bmFtaWMgdGFyZ2V0IChtZW1iZXIgZnVuY3Rpb24pLiAgRHluYW1pYyB0YXJnZXRzIHVzZSBzdHVicyB0byBhZGQKICAvLy8gZGVmYXVsdGVkIGFyZ3VtZW50cywgc28gKHVubGlrZSBzdGF0aWMgdGFyZ2V0cykgd2UgZG8gbm90IGFkZCB0aGUgZGVmYXVsdAogIC8vLyB2YWx1ZXMuCiAgTGlzdDxISW5zdHJ1Y3Rpb24+IF92aXNpdEFyZ3VtZW50c0ZvckR5bmFtaWNUYXJnZXQoCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLCBpci5Bcmd1bWVudHMgYXJndW1lbnRzLCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzLAogICAgICBbU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb25dKSB7CiAgICBMaXN0PEhJbnN0cnVjdGlvbj4gdmFsdWVzID0gX3Zpc2l0UG9zaXRpb25hbEFyZ3VtZW50cyhhcmd1bWVudHMpOwoKICAgIGlmIChhcmd1bWVudHMubmFtZWQuaXNOb3RFbXB0eSkgewogICAgICBNYXA8U3RyaW5nLCBISW5zdHJ1Y3Rpb24+IG5hbWVkVmFsdWVzID0gPFN0cmluZywgSEluc3RydWN0aW9uPnt9OwogICAgICBmb3IgKGlyLk5hbWVkRXhwcmVzc2lvbiBhcmd1bWVudCBpbiBhcmd1bWVudHMubmFtZWQpIHsKICAgICAgICBhcmd1bWVudC52YWx1ZS5hY2NlcHQodGhpcyk7CiAgICAgICAgbmFtZWRWYWx1ZXNbYXJndW1lbnQubmFtZV0gPSBwb3AoKTsKICAgICAgfQogICAgICBmb3IgKFN0cmluZyBuYW1lIGluIHNlbGVjdG9yLmNhbGxTdHJ1Y3R1cmUuZ2V0T3JkZXJlZE5hbWVkQXJndW1lbnRzKCkpIHsKICAgICAgICB2YWx1ZXMuYWRkKG5hbWVkVmFsdWVzW25hbWVdKTsKICAgICAgfQogICAgfQoKICAgIF9hZGRUeXBlQXJndW1lbnRzKHZhbHVlcywgdHlwZUFyZ3VtZW50cywgc291cmNlSW5mb3JtYXRpb24pOwoKICAgIHJldHVybiB2YWx1ZXM7CiAgfQoKICAvLy8gQnVpbGQgdGhlIGFyZ3VtZW50IGxpc3QgZm9yIEpTLWludGVyb3AgaW52b2NhdGlvbnMsIHdoaWNoIGhhdmUgc2xpZ2h0bHkKICAvLy8gZGlmZmVyZW50IHNlbWFudGljcyB0aGFuIGRhcnQgYmVjYXVzZSBvZiBKUydzIG51bGwgdnMgdW5kZWZpbmVkIGFuZCBsYWNrCiAgLy8vIG9mIG5hbWVkIGFyZ3VtZW50cy4gUmV0dXJuIG51bGwgaWYgdGhlIGFyZ3VtZW50cyBjb3VsZCBub3QgYmUgY29ycmVjdGx5CiAgLy8vIHBhcnNlZCBiZWNhdXNlIHRoZSB1c2VyIHByb3ZpZGVkIGNvZGUgd2l0aCBuYW1lZCBwYXJhbWV0ZXJzIGluIGEgSlMgKG5vbgogIC8vLyBmYWN0b3J5KSBmdW5jdGlvbi4KICBMaXN0PEhJbnN0cnVjdGlvbj4gX3Zpc2l0QXJndW1lbnRzRm9yTmF0aXZlU3RhdGljVGFyZ2V0KAogICAgICBpci5GdW5jdGlvbk5vZGUgdGFyZ2V0LCBpci5Bcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICAvLyBWaXNpdCBhcmd1bWVudHMgaW4gc291cmNlIG9yZGVyLCB0aGVuIHJlLW9yZGVyIGFuZCBmaWxsIGluIGRlZmF1bHRzLgogICAgdmFyIHZhbHVlcyA9IF92aXNpdFBvc2l0aW9uYWxBcmd1bWVudHMoYXJndW1lbnRzKTsKCiAgICBpZiAodGFyZ2V0Lm5hbWVkUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgIC8vIE9ubHkgYW5vbnltb3VzIGZhY3RvcnkgY29uc3RydWN0b3JzIGludm9sdmluZyBKUyBpbnRlcm9wIGFyZSBhbGxvd2VkIHRvCiAgICAgIC8vIGhhdmUgbmFtZWQgcGFyYW1ldGVycy4gT3RoZXJ3aXNlLCB0aHJvdyBhbiBlcnJvci4KICAgICAgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24gPSBfZWxlbWVudE1hcC5nZXRNZW1iZXIodGFyZ2V0LnBhcmVudCk7CiAgICAgIGlmIChmdW5jdGlvbiBpcyBDb25zdHJ1Y3RvckVudGl0eSAmJiBmdW5jdGlvbi5pc0ZhY3RvcnlDb25zdHJ1Y3RvcikgewogICAgICAgIC8vIFRPRE8oc3JhKTogSGF2ZSBhICJDb21waWxlZEFyZ3VtZW50cyIgc3RydWN0dXJlIHRvIGp1c3QgdXBkYXRlIHdpdGgKICAgICAgICAvLyB3aGF0IHZhbHVlcyB3ZSBoYXZlIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEgbWFwIGFuZCBkZS1wb3B1bGF0aW5nIGl0LgogICAgICAgIHZhciBuYW1lZFZhbHVlcyA9IDxTdHJpbmcsIEhJbnN0cnVjdGlvbj57fTsKICAgICAgICBmb3IgKGlyLk5hbWVkRXhwcmVzc2lvbiBhcmd1bWVudCBpbiBhcmd1bWVudHMubmFtZWQpIHsKICAgICAgICAgIGFyZ3VtZW50LnZhbHVlLmFjY2VwdCh0aGlzKTsKICAgICAgICAgIG5hbWVkVmFsdWVzW2FyZ3VtZW50Lm5hbWVdID0gcG9wKCk7CiAgICAgICAgfQoKICAgICAgICAvLyBWaXNpdCBuYW1lZCBhcmd1bWVudHMgaW4gcGFyYW1ldGVyLXBvc2l0aW9uIG9yZGVyLCBzZWxlY3RpbmcgcHJvdmlkZWQKICAgICAgICAvLyBvciBkZWZhdWx0IHZhbHVlLgogICAgICAgIHZhciBuYW1lZFBhcmFtZXRlcnMgPSB0YXJnZXQubmFtZWRQYXJhbWV0ZXJzLnRvTGlzdCgpOwogICAgICAgIG5hbWVkUGFyYW1ldGVycy5zb3J0KG5hdGl2ZU9yZGVyaW5nKTsKICAgICAgICBmb3IgKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyIGluIG5hbWVkUGFyYW1ldGVycykgewogICAgICAgICAgSEluc3RydWN0aW9uIHZhbHVlID0gbmFtZWRWYWx1ZXNbcGFyYW1ldGVyLm5hbWVdOwogICAgICAgICAgdmFsdWVzLmFkZCh2YWx1ZSk7CiAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICBuYW1lZFZhbHVlcy5yZW1vdmUocGFyYW1ldGVyLm5hbWUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBhc3NlcnQobmFtZWRWYWx1ZXMuaXNFbXB0eSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVGhyb3cgYW4gZXJyb3IgYmVjYXVzZSBKUyBjYW5ub3QgaGFuZGxlIG5hbWVkIHBhcmFtZXRlcnMuCiAgICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgICAgICBfZWxlbWVudE1hcC5nZXRTcGFubmFibGUodGFyZ2V0RWxlbWVudCwgdGFyZ2V0KSwKICAgICAgICAgICAgTWVzc2FnZUtpbmQuSlNfSU5URVJPUF9NRVRIT0RfV0lUSF9OQU1FRF9BUkdVTUVOVFMsCiAgICAgICAgICAgIHsnbWV0aG9kJzogZnVuY3Rpb24ubmFtZX0pOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdmFsdWVzOwogIH0KCiAgLy8vIEZpbGxzIFt0eXBlQXJndW1lbnRzXSB3aXRoIHRoZSB0eXBlIGFyZ3VtZW50cyBuZWVkZWQgZm9yIFtzZWxlY3Rvcl0gYW5kCiAgLy8vIHJldHVybnMgdGhlIHNlbGVjdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhc3NlZCB0eXBlIGFyZ3VtZW50cy4KICBTZWxlY3RvciBfZmlsbER5bmFtaWNUeXBlQXJndW1lbnRzKAogICAgICBTZWxlY3RvciBzZWxlY3RvciwgaXIuQXJndW1lbnRzIGFyZ3VtZW50cywgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykgewogICAgaWYgKHNlbGVjdG9yLnR5cGVBcmd1bWVudENvdW50ID4gMCkgewogICAgICBpZiAocnRpTmVlZC5zZWxlY3Rvck5lZWRzVHlwZUFyZ3VtZW50cyhzZWxlY3RvcikpIHsKICAgICAgICB0eXBlQXJndW1lbnRzLmFkZEFsbChhcmd1bWVudHMudHlwZXMubWFwKF9lbGVtZW50TWFwLmdldERhcnRUeXBlKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHNlbGVjdG9yLnRvTm9uR2VuZXJpYygpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2VsZWN0b3I7CiAgfQoKICBMaXN0PERhcnRUeXBlPiBfZ2V0Q29uc3RydWN0b3JUeXBlQXJndW1lbnRzKAogICAgICBDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvciwgaXIuQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUGFzcyB0eXBlIGFyZ3VtZW50cyB0byBjb25zdHJ1Y3RvcnMgbGlrZSBjYWxsaW5nCiAgICAvLyBhIGdlbmVyaWMgbWV0aG9kLgogICAgcmV0dXJuIGNvbnN0IDxEYXJ0VHlwZT5bXTsKICB9CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSB0aGlzIHdoZW4gdHlwZSBhcmd1bWVudHMgYXJlIHBhc3NlZCB0bwogIC8vIGNvbnN0cnVjdG9ycyBsaWtlIGNhbGxpbmcgYSBnZW5lcmljIG1ldGhvZC4KICBMaXN0PERhcnRUeXBlPiBfZ2V0Q2xhc3NUeXBlQXJndW1lbnRzKAogICAgICBDbGFzc0VudGl0eSBjbHMsIGlyLkFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIGlmIChydGlOZWVkLmNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKGNscykpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy50eXBlcy5tYXAoX2VsZW1lbnRNYXAuZ2V0RGFydFR5cGUpLnRvTGlzdCgpOwogICAgfQogICAgcmV0dXJuIGNvbnN0IDxEYXJ0VHlwZT5bXTsKICB9CgogIExpc3Q8RGFydFR5cGU+IF9nZXRTdGF0aWNUeXBlQXJndW1lbnRzKAogICAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwgaXIuQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgaWYgKHJ0aU5lZWQubWV0aG9kTmVlZHNUeXBlQXJndW1lbnRzKGZ1bmN0aW9uKSkgewogICAgICByZXR1cm4gYXJndW1lbnRzLnR5cGVzLm1hcChfZWxlbWVudE1hcC5nZXREYXJ0VHlwZSkudG9MaXN0KCk7CiAgICB9CiAgICByZXR1cm4gY29uc3QgPERhcnRUeXBlPltdOwogIH0KCiAgLy8vIEJ1aWxkIGFyZ3VtZW50IGxpc3QgaW4gY2Fub25pY2FsIG9yZGVyIGZvciBhIHN0YXRpYyBbdGFyZ2V0XSwgaW5jbHVkaW5nCiAgLy8vIGZpbGxpbmcgaW4gdGhlIGRlZmF1bHQgYXJndW1lbnQgdmFsdWUuCiAgTGlzdDxISW5zdHJ1Y3Rpb24+IF92aXNpdEFyZ3VtZW50c0ZvclN0YXRpY1RhcmdldCgKICAgICAgaXIuRnVuY3Rpb25Ob2RlIHRhcmdldCwKICAgICAgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAgaXIuQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cywKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIC8vIFZpc2l0IGFyZ3VtZW50cyBpbiBzb3VyY2Ugb3JkZXIsIHRoZW4gcmUtb3JkZXIgYW5kIGZpbGwgaW4gZGVmYXVsdHMuCiAgICBMaXN0PEhJbnN0cnVjdGlvbj4gdmFsdWVzID0gX3Zpc2l0UG9zaXRpb25hbEFyZ3VtZW50cyhhcmd1bWVudHMpOwoKICAgIHdoaWxlICh2YWx1ZXMubGVuZ3RoIDwgcGFyYW1ldGVyU3RydWN0dXJlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyID0KICAgICAgICAgIHRhcmdldC5wb3NpdGlvbmFsUGFyYW1ldGVyc1t2YWx1ZXMubGVuZ3RoXTsKICAgICAgdmFsdWVzLmFkZChfZGVmYXVsdFZhbHVlRm9yUGFyYW1ldGVyKHBhcmFtZXRlcikpOwogICAgfQoKICAgIGlmIChwYXJhbWV0ZXJTdHJ1Y3R1cmUubmFtZWRQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgTWFwPFN0cmluZywgSEluc3RydWN0aW9uPiBuYW1lZFZhbHVlcyA9IHt9OwogICAgICBmb3IgKGlyLk5hbWVkRXhwcmVzc2lvbiBhcmd1bWVudCBpbiBhcmd1bWVudHMubmFtZWQpIHsKICAgICAgICBhcmd1bWVudC52YWx1ZS5hY2NlcHQodGhpcyk7CiAgICAgICAgbmFtZWRWYWx1ZXNbYXJndW1lbnQubmFtZV0gPSBwb3AoKTsKICAgICAgfQoKICAgICAgLy8gVmlzaXQgbmFtZWQgYXJndW1lbnRzIGluIHBhcmFtZXRlci1wb3NpdGlvbiBvcmRlciwgc2VsZWN0aW5nIHByb3ZpZGVkCiAgICAgIC8vIG9yIGRlZmF1bHQgdmFsdWUuCiAgICAgIC8vIFRPRE8oc3JhKTogRW5zdXJlIHRoZSBzdG9yZWQgb3JkZXIgaXMgY2Fub25pY2FsIHNvIHdlIGRvbid0IGhhdmUgdG8KICAgICAgLy8gc29ydC4gVGhlIG9sZCBidWlsZGVyIHVzZXMgQ2FsbFN0cnVjdHVyZS5tYWtlQXJndW1lbnRMaXN0IHdoaWNoIGRlcGVuZHMKICAgICAgLy8gb24gdGhlIG9sZCBlbGVtZW50IG1vZGVsLgogICAgICBMaXN0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVycyA9IHRhcmdldC5uYW1lZFBhcmFtZXRlcnMKICAgICAgICAgIC8vIEZpbHRlciBlbGlkZWQgcGFyYW1ldGVycy4KICAgICAgICAgIC53aGVyZSgocCkgPT4gcGFyYW1ldGVyU3RydWN0dXJlLm5hbWVkUGFyYW1ldGVycy5jb250YWlucyhwLm5hbWUpKQogICAgICAgICAgLnRvTGlzdCgpCiAgICAgICAgICAgIC4uc29ydChuYW1lZE9yZGVyaW5nKTsKICAgICAgZm9yIChpci5WYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciBpbiBuYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgICBISW5zdHJ1Y3Rpb24gdmFsdWUgPSBuYW1lZFZhbHVlc1twYXJhbWV0ZXIubmFtZV07CiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICAgIHZhbHVlcy5hZGQoX2RlZmF1bHRWYWx1ZUZvclBhcmFtZXRlcihwYXJhbWV0ZXIpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFsdWVzLmFkZCh2YWx1ZSk7CiAgICAgICAgICBuYW1lZFZhbHVlcy5yZW1vdmUocGFyYW1ldGVyLm5hbWUpOwogICAgICAgIH0KICAgICAgfQogICAgICBhc3NlcnQobmFtZWRWYWx1ZXMuaXNFbXB0eSk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoYXJndW1lbnRzLm5hbWVkLmlzRW1wdHkpOwogICAgfQoKICAgIF9hZGRUeXBlQXJndW1lbnRzKHZhbHVlcywgdHlwZUFyZ3VtZW50cywgc291cmNlSW5mb3JtYXRpb24pOwogICAgcmV0dXJuIHZhbHVlczsKICB9CgogIHZvaWQgX2FkZFR5cGVBcmd1bWVudHMoTGlzdDxISW5zdHJ1Y3Rpb24+IHZhbHVlcywKICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cywgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIGlmICh0eXBlQXJndW1lbnRzLmlzRW1wdHkpIHJldHVybjsKICAgIGZvciAoRGFydFR5cGUgdHlwZSBpbiB0eXBlQXJndW1lbnRzKSB7CiAgICAgIHZhbHVlcy5hZGQodHlwZUJ1aWxkZXIuYW5hbHl6ZVR5cGVBcmd1bWVudCh0eXBlLCBzb3VyY2VFbGVtZW50LAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9CiAgfQoKICBISW5zdHJ1Y3Rpb24gX2RlZmF1bHRWYWx1ZUZvclBhcmFtZXRlcihpci5WYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlcikgewogICAgQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9CiAgICAgICAgX2VsZW1lbnRNYXAuZ2V0Q29uc3RhbnRWYWx1ZShwYXJhbWV0ZXIuaW5pdGlhbGl6ZXIsIGltcGxpY2l0TnVsbDogdHJ1ZSk7CiAgICBhc3NlcnQoY29uc3RhbnQgIT0gbnVsbCwgZmFpbGVkQXQoQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSkpOwogICAgcmV0dXJuIGdyYXBoLmFkZENvbnN0YW50KGNvbnN0YW50LCBjbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RhdGljSW52b2NhdGlvbihpci5TdGF0aWNJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGlyLlByb2NlZHVyZSB0YXJnZXQgPSBub2RlLnRhcmdldDsKICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0KICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkQ2FsbChub2RlLCBub2RlKTsKICAgIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uID0gX2VsZW1lbnRNYXAuZ2V0TWVtYmVyKHRhcmdldCk7CiAgICBpZiAoX2NvbW1vbkVsZW1lbnRzLmlzRm9yZWlnbkhlbHBlcihmdW5jdGlvbikpIHsKICAgICAgaGFuZGxlSW52b2tlU3RhdGljRm9yZWlnbihub2RlLCBmdW5jdGlvbik7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoX2NvbW1vbkVsZW1lbnRzLmlzRXh0cmFjdFR5cGVBcmd1bWVudHMoZnVuY3Rpb24pICYmCiAgICAgICAgaGFuZGxlRXh0cmFjdFR5cGVBcmd1bWVudHMobm9kZSwgc291cmNlSW5mb3JtYXRpb24pKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBBYnN0cmFjdFZhbHVlIHR5cGVNYXNrID0gX3R5cGVJbmZlcmVuY2VNYXAuZ2V0UmV0dXJuVHlwZU9mKGZ1bmN0aW9uKTsKCiAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0KICAgICAgICBfZ2V0U3RhdGljVHlwZUFyZ3VtZW50cyhmdW5jdGlvbiwgbm9kZS5hcmd1bWVudHMpOwogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGFyZ3VtZW50cyA9IGNsb3NlZFdvcmxkLm5hdGl2ZURhdGEKICAgICAgICAgICAgLmlzSnNJbnRlcm9wTWVtYmVyKGZ1bmN0aW9uKQogICAgICAgID8gX3Zpc2l0QXJndW1lbnRzRm9yTmF0aXZlU3RhdGljVGFyZ2V0KHRhcmdldC5mdW5jdGlvbiwgbm9kZS5hcmd1bWVudHMpCiAgICAgICAgOiBfdmlzaXRBcmd1bWVudHNGb3JTdGF0aWNUYXJnZXQoCiAgICAgICAgICAgIHRhcmdldC5mdW5jdGlvbiwKICAgICAgICAgICAgZnVuY3Rpb24ucGFyYW1ldGVyU3RydWN0dXJlLAogICAgICAgICAgICBub2RlLmFyZ3VtZW50cywKICAgICAgICAgICAgdHlwZUFyZ3VtZW50cywKICAgICAgICAgICAgc291cmNlSW5mb3JtYXRpb24pOwoKICAgIC8vIEVycm9yIGluIHRoZSBhcmd1bWVudHMgcHJvdmlkZWQuIERvIG5vdCBwcm9jZXNzIGZ1cnRoZXIuCiAgICBpZiAoYXJndW1lbnRzID09IG51bGwpIHsKICAgICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCkpOyAvLyBSZXN1bHQgZXhwZWN0ZWQgb24gc3RhY2sKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChmdW5jdGlvbiBpcyBDb25zdHJ1Y3RvckVudGl0eSAmJiBmdW5jdGlvbi5pc0ZhY3RvcnlDb25zdHJ1Y3RvcikgewogICAgICBoYW5kbGVJbnZva2VGYWN0b3J5Q29uc3RydWN0b3IoCiAgICAgICAgICBub2RlLCBmdW5jdGlvbiwgdHlwZU1hc2ssIGFyZ3VtZW50cywgc291cmNlSW5mb3JtYXRpb24pOwogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gU3RhdGljIG1ldGhvZHMgY3VycmVudGx5IGlnbm9yZSB0aGUgdHlwZSBwYXJhbWV0ZXJzLgogICAgX3B1c2hTdGF0aWNJbnZvY2F0aW9uKGZ1bmN0aW9uLCBhcmd1bWVudHMsIHR5cGVNYXNrLCB0eXBlQXJndW1lbnRzLAogICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICB2b2lkIGhhbmRsZUludm9rZUZhY3RvcnlDb25zdHJ1Y3RvcigKICAgICAgaXIuU3RhdGljSW52b2NhdGlvbiBpbnZvY2F0aW9uLAogICAgICBDb25zdHJ1Y3RvckVudGl0eSBmdW5jdGlvbiwKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlTWFzaywKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGFyZ3VtZW50cywKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIGlmIChmdW5jdGlvbi5pc0V4dGVybmFsICYmIGZ1bmN0aW9uLmlzRnJvbUVudmlyb25tZW50Q29uc3RydWN0b3IpIHsKICAgICAgaWYgKGludm9jYXRpb24uaXNDb25zdCkgewogICAgICAgIC8vIEp1c3QgbGlrZSBhbGwgY29uc3QgY29uc3RydWN0b3JzIChzZWUgdmlzaXRDb25zdHJ1Y3Rvckludm9jYXRpb24pLgogICAgICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudCgKICAgICAgICAgICAgX2VsZW1lbnRNYXAuZ2V0Q29uc3RhbnRWYWx1ZShpbnZvY2F0aW9uKSwgY2xvc2VkV29ybGQsCiAgICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICB9IGVsc2UgewogICAgICAgIGdlbmVyYXRlVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICAgJyR7ZnVuY3Rpb24uZW5jbG9zaW5nQ2xhc3MubmFtZX0uJHtmdW5jdGlvbi5uYW1lfSAnCiAgICAgICAgICAgICdjYW4gb25seSBiZSB1c2VkIGFzIGEgY29uc3QgY29uc3RydWN0b3InLAogICAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKICAgIGJvb2wgaXNGaXhlZExpc3QgPSBmYWxzZTsgLy8gQW55IGZpeGVkIGxpc3QsIGUuZy4gbmV3IExpc3QoMTApLCAgVUludDhMaXN0LgoKICAgIC8vIFJlY29nbml6ZSBgbmV3IExpc3QoKWAgYW5kIGBuZXcgTGlzdChuKWAuCiAgICBib29sIGlzRml4ZWRMaXN0Q29uc3RydWN0b3JDYWxsID0gZmFsc2U7CiAgICBib29sIGlzR3Jvd2FibGVMaXN0Q29uc3RydWN0b3JDYWxsID0gZmFsc2U7CiAgICBpZiAoY29tbW9uRWxlbWVudHMuaXNVbm5hbWVkTGlzdENvbnN0cnVjdG9yKGZ1bmN0aW9uKSAmJgogICAgICAgIGludm9jYXRpb24uYXJndW1lbnRzLm5hbWVkLmlzRW1wdHkpIHsKICAgICAgaW50IGFyZ3VtZW50Q291bnQgPSBpbnZvY2F0aW9uLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aDsKICAgICAgaXNGaXhlZExpc3RDb25zdHJ1Y3RvckNhbGwgPSBhcmd1bWVudENvdW50ID09IDE7CiAgICAgIGlzR3Jvd2FibGVMaXN0Q29uc3RydWN0b3JDYWxsID0gYXJndW1lbnRDb3VudCA9PSAwOwogICAgICBpc0ZpeGVkTGlzdCA9IGlzRml4ZWRMaXN0Q29uc3RydWN0b3JDYWxsOwogICAgfQoKICAgIEludGVyZmFjZVR5cGUgaW5zdGFuY2VUeXBlID0gX2VsZW1lbnRNYXAuY3JlYXRlSW50ZXJmYWNlVHlwZSgKICAgICAgICBpbnZvY2F0aW9uLnRhcmdldC5lbmNsb3NpbmdDbGFzcywgaW52b2NhdGlvbi5hcmd1bWVudHMudHlwZXMpOwoKICAgIEFic3RyYWN0VmFsdWUgcmVzdWx0VHlwZSA9IHR5cGVNYXNrOwoKICAgIGJvb2wgaXNKU0FycmF5VHlwZWRDb25zdHJ1Y3RvciA9CiAgICAgICAgZnVuY3Rpb24gPT0gY29tbW9uRWxlbWVudHMuanNBcnJheVR5cGVkQ29uc3RydWN0b3I7CgogICAgX2luZmVycmVkVHlwZU9mTmV3TGlzdChpci5TdGF0aWNJbnZvY2F0aW9uIG5vZGUpIHsKICAgICAgcmV0dXJuIGdsb2JhbEluZmVyZW5jZVJlc3VsdHMudHlwZU9mTmV3TGlzdChub2RlKSA/PwogICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZTsKICAgIH0KCiAgICBpZiAoaXNGaXhlZExpc3RDb25zdHJ1Y3RvckNhbGwpIHsKICAgICAgYXNzZXJ0KAogICAgICAgICAgLy8gQXJndW1lbnRzIG1heSBpbmNsdWRlIHRoZSB0eXBlLgogICAgICAgICAgYXJndW1lbnRzLmxlbmd0aCA9PSAxIHx8IGFyZ3VtZW50cy5sZW5ndGggPT0gMiwKICAgICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICAgIGZ1bmN0aW9uLAogICAgICAgICAgICAgICJVbmV4cGVjdGVkIGFyZ3VtZW50cy4gIgogICAgICAgICAgICAgICJFeHBlY3RlZCAxLTIgYXJndW1lbnQsIGFjdHVhbDogJGFyZ3VtZW50cy4iKSk7CiAgICAgIEhJbnN0cnVjdGlvbiBsZW5ndGhJbnB1dCA9IGFyZ3VtZW50cy5maXJzdDsKICAgICAgaWYgKGxlbmd0aElucHV0LmlzTnVtYmVyKGFic3RyYWN0VmFsdWVEb21haW4pLmlzUG90ZW50aWFsbHlGYWxzZSkgewogICAgICAgIEhUeXBlQ29udmVyc2lvbiBjb252ZXJzaW9uID0gbmV3IEhUeXBlQ29udmVyc2lvbigKICAgICAgICAgICAgY29tbW9uRWxlbWVudHMubnVtVHlwZSwKICAgICAgICAgICAgSFR5cGVDb252ZXJzaW9uLkFSR1VNRU5UX1RZUEVfQ0hFQ0ssCiAgICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4ubnVtVHlwZSwKICAgICAgICAgICAgbGVuZ3RoSW5wdXQsCiAgICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgICBhZGQoY29udmVyc2lvbik7CiAgICAgICAgbGVuZ3RoSW5wdXQgPSBjb252ZXJzaW9uOwogICAgICB9CiAgICAgIGpzLlRlbXBsYXRlIGNvZGUgPSBqcy5qcy5wYXJzZUZvcmVpZ25KUygnbmV3IEFycmF5KCMpJyk7CiAgICAgIHZhciBiZWhhdmlvciA9IG5ldyBOYXRpdmVCZWhhdmlvcigpOwoKICAgICAgdmFyIGV4cGVjdGVkVHlwZSA9CiAgICAgICAgICBfZWxlbWVudE1hcC5nZXREYXJ0VHlwZShpbnZvY2F0aW9uLmdldFN0YXRpY1R5cGUobnVsbCkpOwogICAgICBiZWhhdmlvci50eXBlc0luc3RhbnRpYXRlZC5hZGQoZXhwZWN0ZWRUeXBlKTsKICAgICAgYmVoYXZpb3IudHlwZXNSZXR1cm5lZC5hZGQoZXhwZWN0ZWRUeXBlKTsKCiAgICAgIC8vIFRoZSBhbGxvY2F0aW9uIGNhbiB0aHJvdyBvbmx5IGlmIHRoZSBnaXZlbiBsZW5ndGggaXMgYSBkb3VibGUgb3IKICAgICAgLy8gb3V0c2lkZSB0aGUgdW5zaWduZWQgMzIgYml0IHJhbmdlLgogICAgICAvLyBUT0RPKHNyYSk6IEFycmF5IGFsbG9jYXRpb24gc2hvdWxkIGJlIGFuIGluc3RydWN0aW9uIHNvIHRoYXQgY2FuVGhyb3cKICAgICAgLy8gY2FuIGRlcGVuZCBvbiBhIGxlbmd0aCB0eXBlIGRpc2NvdmVyZWQgaW4gb3B0aW1pemF0aW9uLgogICAgICBib29sIGNhblRocm93ID0gdHJ1ZTsKICAgICAgaWYgKGxlbmd0aElucHV0LmlzVUludDMyKGFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICBjYW5UaHJvdyA9IGZhbHNlOwogICAgICB9CgogICAgICB2YXIgaW5mZXJyZWRUeXBlID0gX2luZmVycmVkVHlwZU9mTmV3TGlzdChpbnZvY2F0aW9uKTsKICAgICAgcmVzdWx0VHlwZSA9CiAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmNvbnRhaW5zQWxsKGluZmVycmVkVHlwZSkuaXNQb3RlbnRpYWxseVRydWUKICAgICAgICAgICAgICA/IGFic3RyYWN0VmFsdWVEb21haW4uZml4ZWRMaXN0VHlwZQogICAgICAgICAgICAgIDogaW5mZXJyZWRUeXBlOwogICAgICBIRm9yZWlnbkNvZGUgZm9yZWlnbiA9IG5ldyBIRm9yZWlnbkNvZGUoCiAgICAgICAgICBjb2RlLCByZXN1bHRUeXBlLCA8SEluc3RydWN0aW9uPltsZW5ndGhJbnB1dF0sCiAgICAgICAgICBuYXRpdmVCZWhhdmlvcjogYmVoYXZpb3IsCiAgICAgICAgICB0aHJvd0JlaGF2aW9yOgogICAgICAgICAgICAgIGNhblRocm93ID8gTmF0aXZlVGhyb3dCZWhhdmlvci5NQVkgOiBOYXRpdmVUaHJvd0JlaGF2aW9yLk5FVkVSKQogICAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKICAgICAgcHVzaChmb3JlaWduKTsKICAgICAgLy8gVE9ETyhyZWRlbXB0aW9uKTogR2xvYmFsIHR5cGUgYW5hbHlzaXMgdHJhY2luZyBtYXkgaGF2ZSBkZXRlcm1pbmVkIHRoYXQKICAgICAgLy8gdGhlIGZpeGVkLWxlbmd0aCBwcm9wZXJ0eSBpcyBuZXZlciBjaGVja2VkLiBJZiBzbywgd2UgY2FuIGF2b2lkIG1hcmtpbmcKICAgICAgLy8gdGhlIGFycmF5LgogICAgICB7CiAgICAgICAganMuVGVtcGxhdGUgY29kZSA9IGpzLmpzLnBhcnNlRm9yZWlnbkpTKHInIy5maXhlZCRsZW5ndGggPSBBcnJheScpOwogICAgICAgIC8vIFdlIHNldCB0aGUgaW5zdHJ1Y3Rpb24gYXMgW2NhblRocm93XSB0byBhdm9pZCBpdCBiZWluZyBkZWFkIGNvZGUuCiAgICAgICAgLy8gV2UgbmVlZCBhIGZpbmVyIGdyYWluZWQgc2lkZSBlZmZlY3QuCiAgICAgICAgYWRkKG5ldyBIRm9yZWlnbkNvZGUoY29kZSwgYWJzdHJhY3RWYWx1ZURvbWFpbi5udWxsVHlwZSwgW3N0YWNrLmxhc3RdLAogICAgICAgICAgICB0aHJvd0JlaGF2aW9yOiBOYXRpdmVUaHJvd0JlaGF2aW9yLk1BWSkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzR3Jvd2FibGVMaXN0Q29uc3RydWN0b3JDYWxsKSB7CiAgICAgIHB1c2goYnVpbGRMaXRlcmFsTGlzdCg8SEluc3RydWN0aW9uPltdKSk7CiAgICAgIHZhciBpbmZlcnJlZFR5cGUgPSBfaW5mZXJyZWRUeXBlT2ZOZXdMaXN0KGludm9jYXRpb24pOwogICAgICByZXN1bHRUeXBlID0KICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uY29udGFpbnNBbGwoaW5mZXJyZWRUeXBlKS5pc1BvdGVudGlhbGx5VHJ1ZQogICAgICAgICAgICAgID8gYWJzdHJhY3RWYWx1ZURvbWFpbi5ncm93YWJsZUxpc3RUeXBlCiAgICAgICAgICAgICAgOiBpbmZlcnJlZFR5cGU7CiAgICAgIHN0YWNrLmxhc3QuaW5zdHJ1Y3Rpb25UeXBlID0gcmVzdWx0VHlwZTsKICAgIH0gZWxzZSBpZiAoaXNKU0FycmF5VHlwZWRDb25zdHJ1Y3RvcikgewogICAgICAvLyBUT0RPKHNyYSk6IEluc3RlYWQgb2YgY2FsbGluZyB0aGUgaWRlbnRpdHktbGlrZSBmYWN0b3J5IGNvbnN0cnVjdG9yLAogICAgICAvLyBzaW1wbHkgc2VsZWN0IHRoZSBzaW5nbGUgYXJndW1lbnQuCiAgICAgIC8vIEZhY3RvcnkgY29uc3RydWN0b3JzIHRha2UgdHlwZSBwYXJhbWV0ZXJzLgogICAgICBpZiAoY2xvc2VkV29ybGQucnRpTmVlZAogICAgICAgICAgLmNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKGZ1bmN0aW9uLmVuY2xvc2luZ0NsYXNzKSkge30KICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9CiAgICAgICAgICBfZ2V0Q29uc3RydWN0b3JUeXBlQXJndW1lbnRzKGZ1bmN0aW9uLCBpbnZvY2F0aW9uLmFyZ3VtZW50cyk7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSB0aGlzIHdoZW4gdHlwZSBhcmd1bWVudHMgYXJlIHBhc3NlZCB0bwogICAgICAvLyBjb25zdHJ1Y3RvcnMgbGlrZSBjYWxsaW5nIGEgZ2VuZXJpYyBtZXRob2QuCiAgICAgIF9hZGRUeXBlQXJndW1lbnRzKAogICAgICAgICAgYXJndW1lbnRzLAogICAgICAgICAgX2dldENsYXNzVHlwZUFyZ3VtZW50cyhmdW5jdGlvbi5lbmNsb3NpbmdDbGFzcywgaW52b2NhdGlvbi5hcmd1bWVudHMpLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb24pOwogICAgICBfcHVzaFN0YXRpY0ludm9jYXRpb24oZnVuY3Rpb24sIGFyZ3VtZW50cywgdHlwZU1hc2ssIHR5cGVBcmd1bWVudHMsCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgLy8gRmFjdG9yeSBjb25zdHJ1Y3RvcnMgdGFrZSB0eXBlIHBhcmFtZXRlcnMuCiAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPQogICAgICAgICAgX2dldENvbnN0cnVjdG9yVHlwZUFyZ3VtZW50cyhmdW5jdGlvbiwgaW52b2NhdGlvbi5hcmd1bWVudHMpOwogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhpcyB3aGVuIHR5cGUgYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8KICAgICAgLy8gY29uc3RydWN0b3JzIGxpa2UgY2FsbGluZyBhIGdlbmVyaWMgbWV0aG9kLgogICAgICBfYWRkVHlwZUFyZ3VtZW50cygKICAgICAgICAgIGFyZ3VtZW50cywKICAgICAgICAgIF9nZXRDbGFzc1R5cGVBcmd1bWVudHMoZnVuY3Rpb24uZW5jbG9zaW5nQ2xhc3MsIGludm9jYXRpb24uYXJndW1lbnRzKSwKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgaW5zdGFuY2VUeXBlID0gbG9jYWxzSGFuZGxlci5zdWJzdEluQ29udGV4dChpbnN0YW5jZVR5cGUpOwogICAgICBhZGRJbXBsaWNpdEluc3RhbnRpYXRpb24oaW5zdGFuY2VUeXBlKTsKICAgICAgX3B1c2hTdGF0aWNJbnZvY2F0aW9uKGZ1bmN0aW9uLCBhcmd1bWVudHMsIHR5cGVNYXNrLCB0eXBlQXJndW1lbnRzLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uLCBpbnN0YW5jZVR5cGU6IGluc3RhbmNlVHlwZSk7CiAgICB9CgogICAgSEluc3RydWN0aW9uIG5ld0luc3RhbmNlID0gc3RhY2subGFzdDsKCiAgICBpZiAoaXNGaXhlZExpc3QpIHsKICAgICAgLy8gSWYgd2UgaW5saW5lZCBhIGNvbnN0cnVjdG9yIHRoZSBjYWxsLXNpdGUtc3BlY2lmaWMgdHlwZSBmcm9tIHR5cGUKICAgICAgLy8gaW5mZXJlbmNlIChlLmcuIGEgY29udGFpbmVyIHR5cGUpIHdpbGwgbm90IGJlIG9uIHRoZSBub2RlLiBTdG9yZSB0aGUKICAgICAgLy8gbW9yZSBzcGVjaWFsaXplZCB0eXBlIG9uIHRoZSBhbGxvY2F0aW9uLgogICAgICBuZXdJbnN0YW5jZS5pbnN0cnVjdGlvblR5cGUgPSByZXN1bHRUeXBlOwogICAgICBncmFwaC5hbGxvY2F0ZWRGaXhlZExpc3RzLmFkZChuZXdJbnN0YW5jZSk7CiAgICB9CgogICAgaWYgKHJ0aU5lZWQuY2xhc3NOZWVkc1R5cGVBcmd1bWVudHMoY29tbW9uRWxlbWVudHMubGlzdENsYXNzKSAmJgogICAgICAgIChpc0ZpeGVkTGlzdENvbnN0cnVjdG9yQ2FsbCB8fAogICAgICAgICAgICBpc0dyb3dhYmxlTGlzdENvbnN0cnVjdG9yQ2FsbCB8fAogICAgICAgICAgICBpc0pTQXJyYXlUeXBlZENvbnN0cnVjdG9yKSkgewogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUgPSBfZWxlbWVudE1hcC5jcmVhdGVJbnRlcmZhY2VUeXBlKAogICAgICAgICAgaW52b2NhdGlvbi50YXJnZXQuZW5jbG9zaW5nQ2xhc3MsIGludm9jYXRpb24uYXJndW1lbnRzLnR5cGVzKTsKICAgICAgc3RhY2sKICAgICAgICAgIC5hZGQoX3NldExpc3RSdW50aW1lVHlwZUluZm9JZk5lZWRlZChwb3AoKSwgdHlwZSwgc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0KICB9CgogIC8vLyBSZXBsYWNlIGNhbGxzIHRvIGBleHRyYWN0VHlwZUFyZ3VtZW50c2Agd2l0aCBlcXVpdmFsZW50IGNvZGUuIFJldHVybnMKICAvLy8gYHRydWVgIGlmIGBleHRyYWN0VHlwZUFyZ3VtZW50c2AgaXMgaGFuZGxlZC4KICBib29sIGhhbmRsZUV4dHJhY3RUeXBlQXJndW1lbnRzKAogICAgICBpci5TdGF0aWNJbnZvY2F0aW9uIGludm9jYXRpb24sIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICAvLyBFeHBhbmQgY2FsbHMgYXMgZm9sbG93czoKICAgIC8vCiAgICAvLyAgICAgciA9IGV4dHJhY3RUeXBlQXJndW1lbnRzPE1hcD4oZSwgZikKICAgIC8vIC0tPgogICAgLy8gICAgIGludGVyY2VwdG9yID0gZ2V0SW50ZXJjZXB0b3IoZSk7CiAgICAvLyAgICAgVDEgPSBnZXRSdW50aW1lVHlwZUFyZ3VtZW50SW50ZXJjZXB0ZWQoaW50ZXJjZXB0b3IsIGUsICdNYXAnLCAwKTsKICAgIC8vICAgICBUMiA9IGdldFJ1bnRpbWVUeXBlQXJndW1lbnRJbnRlcmNlcHRlZChpbnRlcmNlcHRvciwgZSwgJ01hcCcsIDEpOwogICAgLy8gICAgIHIgPSBmPFQxLCBUMj4oKTsKICAgIC8vCiAgICAvLyBUT0RPKHNyYSk6IFNob3VsZCB3ZSBhZGQgYSBjaGVjayBiZWZvcmUgdGhlIHZhcmlhYmxlIGV4dHJhY3Rpb24/IFdlIGNvdWxkCiAgICAvLyBhZGQgYSB0eXBlIGNoZWNrICh3aGljaCB3b3VsZCBwZXJtaXQgYG51bGxgKSwgb3IgYWRkIGFuIGlzLWNoZWNrIHdpdGggYW4KICAgIC8vIGV4cGxpY2l0IHRocm93LgoKICAgIGlmIChpbnZvY2F0aW9uLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCAhPSAyKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoaW52b2NhdGlvbi5hcmd1bWVudHMubmFtZWQuaXNOb3RFbXB0eSkgcmV0dXJuIGZhbHNlOwogICAgdmFyIHR5cGVzID0gaW52b2NhdGlvbi5hcmd1bWVudHMudHlwZXM7CiAgICBpZiAodHlwZXMubGVuZ3RoICE9IDEpIHJldHVybiBmYWxzZTsKCiAgICAvLyBUaGUgdHlwZSBzaG91bGQgYmUgYSBzaW5nbGUgdHlwZSBuYW1lLgogICAgaXIuRGFydFR5cGUgdHlwZSA9IHR5cGVzLmZpcnN0OwogICAgRGFydFR5cGUgdHlwZVZhbHVlID0KICAgICAgICBsb2NhbHNIYW5kbGVyLnN1YnN0SW5Db250ZXh0KF9lbGVtZW50TWFwLmdldERhcnRUeXBlKHR5cGUpKTsKICAgIGlmICh0eXBlVmFsdWUgaXMhIEludGVyZmFjZVR5cGUpIHJldHVybiBmYWxzZTsKICAgIEludGVyZmFjZVR5cGUgaW50ZXJmYWNlVHlwZSA9IHR5cGVWYWx1ZTsKICAgIGlmICghaW50ZXJmYWNlVHlwZS50cmVhdEFzUmF3KSByZXR1cm4gZmFsc2U7CgogICAgQ2xhc3NFbnRpdHkgY2xzID0gaW50ZXJmYWNlVHlwZS5lbGVtZW50OwogICAgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZSA9IF9lbGVtZW50TWFwLmVsZW1lbnRFbnZpcm9ubWVudC5nZXRUaGlzVHlwZShjbHMpOwoKICAgIExpc3Q8SEluc3RydWN0aW9uPiBhcmd1bWVudHMgPQogICAgICAgIF92aXNpdFBvc2l0aW9uYWxBcmd1bWVudHMoaW52b2NhdGlvbi5hcmd1bWVudHMpOwoKICAgIEhJbnN0cnVjdGlvbiBvYmplY3QgPSBhcmd1bWVudHNbMF07CiAgICBISW5zdHJ1Y3Rpb24gY2xvc3VyZSA9IGFyZ3VtZW50c1sxXTsKICAgIEhJbnN0cnVjdGlvbiBpbnRlcmNlcHRvciA9IF9pbnRlcmNlcHRvckZvcihvYmplY3QsIHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgICBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzID0gPEhJbnN0cnVjdGlvbj5bY2xvc3VyZV07CiAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0gPERhcnRUeXBlPltdOwoKICAgIHRoaXNUeXBlLnR5cGVBcmd1bWVudHMuZm9yRWFjaCgoX3R5cGVWYXJpYWJsZSkgewogICAgICBUeXBlVmFyaWFibGVUeXBlIHZhcmlhYmxlID0gX3R5cGVWYXJpYWJsZTsKICAgICAgdHlwZUFyZ3VtZW50cy5hZGQodmFyaWFibGUpOwogICAgICBISW5zdHJ1Y3Rpb24gcmVhZFR5cGUgPSBuZXcgSFR5cGVJbmZvUmVhZFZhcmlhYmxlLmludGVyY2VwdGVkKAogICAgICAgICAgdmFyaWFibGUsIGludGVyY2VwdG9yLCBvYmplY3QsIGFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUpOwogICAgICBhZGQocmVhZFR5cGUpOwogICAgICBpbnB1dHMuYWRkKHJlYWRUeXBlKTsKICAgIH0pOwoKICAgIC8vIFRPRE8oc3JhKTogSW4gY29tcGxpYW5jZSBtb2RlLCBpbnNlcnQgYSBjaGVjayB0aGF0IFtjbG9zdXJlXSBpcyBhCiAgICAvLyBmdW5jdGlvbiBvZiBOIHR5cGUgYXJndW1lbnRzLgoKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0KICAgICAgICBuZXcgU2VsZWN0b3IuY2FsbENsb3N1cmUoMCwgY29uc3QgPFN0cmluZz5bXSwgdHlwZUFyZ3VtZW50cy5sZW5ndGgpOwogICAgcHVzaChuZXcgSEludm9rZUNsb3N1cmUoCiAgICAgICAgc2VsZWN0b3IsIGlucHV0cywgYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSwgdHlwZUFyZ3VtZW50cykpOwoKICAgIHJldHVybiB0cnVlOwogIH0KCiAgdm9pZCBoYW5kbGVJbnZva2VTdGF0aWNGb3JlaWduKAogICAgICBpci5TdGF0aWNJbnZvY2F0aW9uIGludm9jYXRpb24sIE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIFN0cmluZyBuYW1lID0gbWVtYmVyLm5hbWU7CiAgICBpZiAobmFtZSA9PSAnSlMnKSB7CiAgICAgIGhhbmRsZUZvcmVpZ25KcyhpbnZvY2F0aW9uKTsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnREFSVF9DTE9TVVJFX1RPX0pTJykgewogICAgICBoYW5kbGVGb3JlaWduRGFydENsb3N1cmVUb0pzKGludm9jYXRpb24sICdEQVJUX0NMT1NVUkVfVE9fSlMnKTsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnUkFXX0RBUlRfRlVOQ1RJT05fUkVGJykgewogICAgICBoYW5kbGVGb3JlaWduUmF3RnVuY3Rpb25SZWYoaW52b2NhdGlvbiwgJ1JBV19EQVJUX0ZVTkNUSU9OX1JFRicpOwogICAgfSBlbHNlIGlmIChuYW1lID09ICdKU19TRVRfU1RBVElDX1NUQVRFJykgewogICAgICBoYW5kbGVGb3JlaWduSnNTZXRTdGF0aWNTdGF0ZShpbnZvY2F0aW9uKTsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnSlNfR0VUX1NUQVRJQ19TVEFURScpIHsKICAgICAgaGFuZGxlRm9yZWlnbkpzR2V0U3RhdGljU3RhdGUoaW52b2NhdGlvbik7CiAgICB9IGVsc2UgaWYgKG5hbWUgPT0gJ0pTX0dFVF9OQU1FJykgewogICAgICBoYW5kbGVGb3JlaWduSnNHZXROYW1lKGludm9jYXRpb24pOwogICAgfSBlbHNlIGlmIChuYW1lID09ICdKU19FTUJFRERFRF9HTE9CQUwnKSB7CiAgICAgIGhhbmRsZUZvcmVpZ25Kc0VtYmVkZGVkR2xvYmFsKGludm9jYXRpb24pOwogICAgfSBlbHNlIGlmIChuYW1lID09ICdKU19CVUlMVElOJykgewogICAgICBoYW5kbGVGb3JlaWduSnNCdWlsdGluKGludm9jYXRpb24pOwogICAgfSBlbHNlIGlmIChuYW1lID09ICdKU19HRVRfRkxBRycpIHsKICAgICAgaGFuZGxlRm9yZWlnbkpzR2V0RmxhZyhpbnZvY2F0aW9uKTsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnSlNfRUZGRUNUJykgewogICAgICBzdGFjay5hZGQoZ3JhcGguYWRkQ29uc3RhbnROdWxsKGNsb3NlZFdvcmxkKSk7CiAgICB9IGVsc2UgaWYgKG5hbWUgPT0gJ0pTX0lOVEVSQ0VQVE9SX0NPTlNUQU5UJykgewogICAgICBoYW5kbGVKc0ludGVyY2VwdG9yQ29uc3RhbnQoaW52b2NhdGlvbik7CiAgICB9IGVsc2UgaWYgKG5hbWUgPT0gJ2dldEludGVyY2VwdG9yJykgewogICAgICBoYW5kbGVGb3JlaWduR2V0SW50ZXJjZXB0b3IoaW52b2NhdGlvbik7CiAgICB9IGVsc2UgaWYgKG5hbWUgPT0gJ0pTX1NUUklOR19DT05DQVQnKSB7CiAgICAgIGhhbmRsZUpzU3RyaW5nQ29uY2F0KGludm9jYXRpb24pOwogICAgfSBlbHNlIGlmIChuYW1lID09ICdfY3JlYXRlSW52b2NhdGlvbk1pcnJvcicpIHsKICAgICAgX2hhbmRsZUNyZWF0ZUludm9jYXRpb25NaXJyb3IoaW52b2NhdGlvbik7CiAgICB9IGVsc2UgewogICAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKAogICAgICAgICAgX2VsZW1lbnRNYXAuZ2V0U3Bhbm5hYmxlKHRhcmdldEVsZW1lbnQsIGludm9jYXRpb24pLAogICAgICAgICAgIlVua25vd24gZm9yZWlnbjogJHtuYW1lfSIpOwogICAgfQogIH0KCiAgdm9pZCBfaGFuZGxlQ3JlYXRlSW52b2NhdGlvbk1pcnJvcihpci5TdGF0aWNJbnZvY2F0aW9uIGludm9jYXRpb24pIHsKICAgIGlyLlN0cmluZ0xpdGVyYWwgbmFtZUxpdGVyYWwgPSBpbnZvY2F0aW9uLmFyZ3VtZW50cy5wb3NpdGlvbmFsWzBdOwogICAgU3RyaW5nIG5hbWUgPSBuYW1lTGl0ZXJhbC52YWx1ZTsKCiAgICBpci5MaXN0TGl0ZXJhbCB0eXBlQXJndW1lbnRzTGl0ZXJhbCA9IGludm9jYXRpb24uYXJndW1lbnRzLnBvc2l0aW9uYWxbMV07CiAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0KICAgICAgICB0eXBlQXJndW1lbnRzTGl0ZXJhbC5leHByZXNzaW9ucy5tYXAoKGlyLkV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogICAgICBpci5UeXBlTGl0ZXJhbCB0eXBlTGl0ZXJhbCA9IGV4cHJlc3Npb247CiAgICAgIHJldHVybiBfZWxlbWVudE1hcC5nZXREYXJ0VHlwZSh0eXBlTGl0ZXJhbC50eXBlKTsKICAgIH0pLnRvTGlzdCgpOwoKICAgIGlyLkxpc3RMaXRlcmFsIHBvc2l0aW9uYWxBcmd1bWVudHNMaXRlcmFsID0KICAgICAgICBpbnZvY2F0aW9uLmFyZ3VtZW50cy5wb3NpdGlvbmFsWzJdOwogICAgaXIuRXhwcmVzc2lvbiBuYW1lZEFyZ3VtZW50c0xpdGVyYWwgPSBpbnZvY2F0aW9uLmFyZ3VtZW50cy5wb3NpdGlvbmFsWzNdOwogICAgTWFwPFN0cmluZywgaXIuRXhwcmVzc2lvbj4gbmFtZWRBcmd1bWVudHMgPSB7fTsKICAgIGlyLkludExpdGVyYWwga2luZExpdGVyYWwgPSBpbnZvY2F0aW9uLmFyZ3VtZW50cy5wb3NpdGlvbmFsWzRdOwoKICAgIE5hbWUgbWVtYmVyTmFtZSA9IG5ldyBOYW1lKG5hbWUsIF9jdXJyZW50RnJhbWUubWVtYmVyLmxpYnJhcnkpOwogICAgU2VsZWN0b3Igc2VsZWN0b3I7CiAgICBzd2l0Y2ggKGtpbmRMaXRlcmFsLnZhbHVlKSB7CiAgICAgIGNhc2UgaW52b2NhdGlvbk1pcnJvckdldHRlcktpbmQ6CiAgICAgICAgc2VsZWN0b3IgPSBuZXcgU2VsZWN0b3IuZ2V0dGVyKG1lbWJlck5hbWUpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIGludm9jYXRpb25NaXJyb3JTZXR0ZXJLaW5kOgogICAgICAgIHNlbGVjdG9yID0gbmV3IFNlbGVjdG9yLnNldHRlcihtZW1iZXJOYW1lKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBpbnZvY2F0aW9uTWlycm9yTWV0aG9kS2luZDoKICAgICAgICBpZiAobWVtYmVyTmFtZSA9PSBOYW1lcy5JTkRFWF9OQU1FKSB7CiAgICAgICAgICBzZWxlY3RvciA9IG5ldyBTZWxlY3Rvci5pbmRleCgpOwogICAgICAgIH0gZWxzZSBpZiAobWVtYmVyTmFtZSA9PSBOYW1lcy5JTkRFWF9TRVRfTkFNRSkgewogICAgICAgICAgc2VsZWN0b3IgPSBuZXcgU2VsZWN0b3IuaW5kZXhTZXQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKG5hbWVkQXJndW1lbnRzTGl0ZXJhbCBpcyBpci5NYXBMaXRlcmFsKSB7CiAgICAgICAgICAgIG5hbWVkQXJndW1lbnRzTGl0ZXJhbC5lbnRyaWVzLmZvckVhY2goKGlyLk1hcEVudHJ5IGVudHJ5KSB7CiAgICAgICAgICAgICAgaXIuU3RyaW5nTGl0ZXJhbCBrZXkgPSBlbnRyeS5rZXk7CiAgICAgICAgICAgICAgbmFtZWRBcmd1bWVudHNba2V5LnZhbHVlXSA9IGVudHJ5LnZhbHVlOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0gZWxzZSBpZiAobmFtZWRBcmd1bWVudHNMaXRlcmFsIGlzIGlyLkNvbnN0YW50RXhwcmVzc2lvbiAmJgogICAgICAgICAgICAgIG5hbWVkQXJndW1lbnRzTGl0ZXJhbC5jb25zdGFudCBpcyBpci5NYXBDb25zdGFudCkgewogICAgICAgICAgICBpci5NYXBDb25zdGFudCBjb25zdGFudCA9IG5hbWVkQXJndW1lbnRzTGl0ZXJhbC5jb25zdGFudDsKICAgICAgICAgICAgZm9yIChpci5Db25zdGFudE1hcEVudHJ5IGVudHJ5IGluIGNvbnN0YW50LmVudHJpZXMpIHsKICAgICAgICAgICAgICBpci5TdHJpbmdDb25zdGFudCBrZXkgPSBlbnRyeS5rZXk7CiAgICAgICAgICAgICAgbmFtZWRBcmd1bWVudHNba2V5LnZhbHVlXSA9CiAgICAgICAgICAgICAgICAgIG5ldyBpci5Db25zdGFudEV4cHJlc3Npb24oZW50cnkudmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKAogICAgICAgICAgICAgICAgY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUoaW52b2NhdGlvbiksCiAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBuYW1lZCBhcmd1bWVudHMgdmFsdWUgaW4gY3JlYXRlSW52b2NhdGlvbk1pcnJyb3I6ICIKICAgICAgICAgICAgICAgICIke25hbWVkQXJndW1lbnRzTGl0ZXJhbH0uIik7CiAgICAgICAgICB9CiAgICAgICAgICBDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUgPSBuZXcgQ2FsbFN0cnVjdHVyZSgKICAgICAgICAgICAgICBwb3NpdGlvbmFsQXJndW1lbnRzTGl0ZXJhbC5leHByZXNzaW9ucy5sZW5ndGgsCiAgICAgICAgICAgICAgbmFtZWRBcmd1bWVudHMua2V5cy50b0xpc3QoKSwKICAgICAgICAgICAgICB0eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgICAgICAgICBpZiAoU2VsZWN0b3IuaXNPcGVyYXRvck5hbWUobmFtZSkpIHsKICAgICAgICAgICAgc2VsZWN0b3IgPQogICAgICAgICAgICAgICAgbmV3IFNlbGVjdG9yKFNlbGVjdG9yS2luZC5PUEVSQVRPUiwgbWVtYmVyTmFtZSwgY2FsbFN0cnVjdHVyZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZWxlY3RvciA9IG5ldyBTZWxlY3Rvci5jYWxsKG1lbWJlck5hbWUsIGNhbGxTdHJ1Y3R1cmUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIH0KCiAgICBIQ29uc3RhbnQgbmFtZUNvbnN0YW50ID0gZ3JhcGguYWRkQ29uc3RhbnQoCiAgICAgICAgY29uc3RhbnRfc3lzdGVtLmNyZWF0ZVN5bWJvbChjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cywgbmFtZSksCiAgICAgICAgY2xvc2VkV29ybGQpOwoKICAgIExpc3Q8SEluc3RydWN0aW9uPiBhcmd1bWVudHMgPSA8SEluc3RydWN0aW9uPltdOwogICAgZm9yIChpci5FeHByZXNzaW9uIGFyZ3VtZW50IGluIHBvc2l0aW9uYWxBcmd1bWVudHNMaXRlcmFsLmV4cHJlc3Npb25zKSB7CiAgICAgIGFyZ3VtZW50LmFjY2VwdCh0aGlzKTsKICAgICAgYXJndW1lbnRzLmFkZChwb3AoKSk7CiAgICB9CiAgICBpZiAobmFtZWRBcmd1bWVudHMuaXNOb3RFbXB0eSkgewogICAgICBNYXA8U3RyaW5nLCBISW5zdHJ1Y3Rpb24+IG5hbWVkVmFsdWVzID0gPFN0cmluZywgSEluc3RydWN0aW9uPnt9OwogICAgICBuYW1lZEFyZ3VtZW50cy5mb3JFYWNoKChTdHJpbmcgbmFtZSwgaXIuRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgICAgIHZhbHVlLmFjY2VwdCh0aGlzKTsKICAgICAgICBuYW1lZFZhbHVlc1tuYW1lXSA9IHBvcCgpOwogICAgICB9KTsKICAgICAgZm9yIChTdHJpbmcgbmFtZSBpbiBzZWxlY3Rvci5jYWxsU3RydWN0dXJlLmdldE9yZGVyZWROYW1lZEFyZ3VtZW50cygpKSB7CiAgICAgICAgYXJndW1lbnRzLmFkZChuYW1lZFZhbHVlc1tuYW1lXSk7CiAgICAgIH0KICAgIH0KCiAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9CiAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZENhbGwoaW52b2NhdGlvbiwgaW52b2NhdGlvbik7CiAgICBfYWRkVHlwZUFyZ3VtZW50cyhhcmd1bWVudHMsIHR5cGVBcmd1bWVudHMsIHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgICBISW5zdHJ1Y3Rpb24gYXJndW1lbnRzSW5zdHJ1Y3Rpb24gPSBidWlsZExpdGVyYWxMaXN0KGFyZ3VtZW50cyk7CiAgICBhZGQoYXJndW1lbnRzSW5zdHJ1Y3Rpb24pOwoKICAgIExpc3Q8SEluc3RydWN0aW9uPiBhcmd1bWVudE5hbWVzID0gPEhJbnN0cnVjdGlvbj5bXTsKICAgIGZvciAoU3RyaW5nIGFyZ3VtZW50TmFtZQogICAgICAgIGluIHNlbGVjdG9yLmNhbGxTdHJ1Y3R1cmUuZ2V0T3JkZXJlZE5hbWVkQXJndW1lbnRzKCkpIHsKICAgICAgQ29uc3RhbnRWYWx1ZSBhcmd1bWVudE5hbWVDb25zdGFudCA9CiAgICAgICAgICBjb25zdGFudF9zeXN0ZW0uY3JlYXRlU3RyaW5nKGFyZ3VtZW50TmFtZSk7CiAgICAgIGFyZ3VtZW50TmFtZXMuYWRkKGdyYXBoLmFkZENvbnN0YW50KGFyZ3VtZW50TmFtZUNvbnN0YW50LCBjbG9zZWRXb3JsZCkpOwogICAgfQogICAgSEluc3RydWN0aW9uIGFyZ3VtZW50TmFtZXNJbnN0cnVjdGlvbiA9IGJ1aWxkTGl0ZXJhbExpc3QoYXJndW1lbnROYW1lcyk7CiAgICBhZGQoYXJndW1lbnROYW1lc0luc3RydWN0aW9uKTsKCiAgICBISW5zdHJ1Y3Rpb24gdHlwZUFyZ3VtZW50Q291bnQgPQogICAgICAgIGdyYXBoLmFkZENvbnN0YW50SW50KHR5cGVBcmd1bWVudHMubGVuZ3RoLCBjbG9zZWRXb3JsZCk7CgogICAganMuTmFtZSBpbnRlcm5hbE5hbWUgPSBuYW1lci5pbnZvY2F0aW9uTmFtZShzZWxlY3Rvcik7CgogICAgQ29uc3RhbnRWYWx1ZSBraW5kQ29uc3RhbnQgPQogICAgICAgIGNvbnN0YW50X3N5c3RlbS5jcmVhdGVJbnRGcm9tSW50KHNlbGVjdG9yLmludm9jYXRpb25NaXJyb3JLaW5kKTsKCiAgICBfcHVzaFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmNyZWF0ZVVubWFuZ2xlZEludm9jYXRpb25NaXJyb3IsCiAgICAgICAgWwogICAgICAgICAgbmFtZUNvbnN0YW50LAogICAgICAgICAgZ3JhcGguYWRkQ29uc3RhbnRTdHJpbmdGcm9tTmFtZShpbnRlcm5hbE5hbWUsIGNsb3NlZFdvcmxkKSwKICAgICAgICAgIGdyYXBoLmFkZENvbnN0YW50KGtpbmRDb25zdGFudCwgY2xvc2VkV29ybGQpLAogICAgICAgICAgYXJndW1lbnRzSW5zdHJ1Y3Rpb24sCiAgICAgICAgICBhcmd1bWVudE5hbWVzSW5zdHJ1Y3Rpb24sCiAgICAgICAgICB0eXBlQXJndW1lbnRDb3VudCwKICAgICAgICBdLAogICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUsCiAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICBib29sIF91bmV4cGVjdGVkRm9yZWlnbkFyZ3VtZW50cyhpci5TdGF0aWNJbnZvY2F0aW9uIGludm9jYXRpb24sCiAgICAgIHtpbnQgbWluUG9zaXRpb25hbCwgaW50IG1heFBvc2l0aW9uYWwsIGludCB0eXBlQXJndW1lbnRDb3VudCA9IDB9KSB7CiAgICBTdHJpbmcgcGx1cmFsaXplQXJndW1lbnRzKGludCBjb3VudCwgW1N0cmluZyBhZGplY3RpdmUgPSAnJ10pIHsKICAgICAgaWYgKGNvdW50ID09IDApIHJldHVybiAnbm8gJHthZGplY3RpdmV9YXJndW1lbnRzJzsKICAgICAgaWYgKGNvdW50ID09IDEpIHJldHVybiAnb25lICR7YWRqZWN0aXZlfWFyZ3VtZW50JzsKICAgICAgaWYgKGNvdW50ID09IDIpIHJldHVybiAndHdvICR7YWRqZWN0aXZlfWFyZ3VtZW50cyc7CiAgICAgIHJldHVybiAnJGNvdW50ICR7YWRqZWN0aXZlfWFyZ3VtZW50cyc7CiAgICB9CgogICAgU3RyaW5nIG5hbWUoKSA9PiBpbnZvY2F0aW9uLnRhcmdldC5uYW1lLm5hbWU7CgogICAgaXIuQXJndW1lbnRzIGFyZ3VtZW50cyA9IGludm9jYXRpb24uYXJndW1lbnRzOwogICAgYm9vbCBiYWQgPSBmYWxzZTsKICAgIGlmIChhcmd1bWVudHMudHlwZXMubGVuZ3RoICE9IHR5cGVBcmd1bWVudENvdW50KSB7CiAgICAgIFN0cmluZyBleHBlY3RlZCA9IHBsdXJhbGl6ZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRDb3VudCwgJ3R5cGUgJyk7CiAgICAgIFN0cmluZyBhY3R1YWwgPSBwbHVyYWxpemVBcmd1bWVudHMoYXJndW1lbnRzLnR5cGVzLmxlbmd0aCwgJ3R5cGUgJyk7CiAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgIF9lbGVtZW50TWFwLmdldFNwYW5uYWJsZSh0YXJnZXRFbGVtZW50LCBpbnZvY2F0aW9uKSwKICAgICAgICAgIE1lc3NhZ2VLaW5kLkdFTkVSSUMsCiAgICAgICAgICB7J3RleHQnOiAiRXJyb3I6ICcke25hbWUoKX0nIHRha2VzICRleHBlY3RlZCwgbm90ICRhY3R1YWwuIn0pOwogICAgICBiYWQgPSB0cnVlOwogICAgfQogICAgaWYgKGFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA8IG1pblBvc2l0aW9uYWwpIHsKICAgICAgU3RyaW5nIHBocmFzZSA9IHBsdXJhbGl6ZUFyZ3VtZW50cyhtaW5Qb3NpdGlvbmFsKTsKICAgICAgaWYgKG1heFBvc2l0aW9uYWwgIT0gbWluUG9zaXRpb25hbCkgcGhyYXNlID0gJ2F0IGxlYXN0ICRwaHJhc2UnOwogICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICBfZWxlbWVudE1hcC5nZXRTcGFubmFibGUodGFyZ2V0RWxlbWVudCwgaW52b2NhdGlvbiksCiAgICAgICAgICBNZXNzYWdlS2luZC5HRU5FUklDLAogICAgICAgICAgeyd0ZXh0JzogIkVycm9yOiBUb28gZmV3IGFyZ3VtZW50cy4gJyR7bmFtZSgpfScgdGFrZXMgJHBocmFzZS4ifSk7CiAgICAgIGJhZCA9IHRydWU7CiAgICB9CiAgICBpZiAobWF4UG9zaXRpb25hbCAhPSBudWxsICYmIGFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA+IG1heFBvc2l0aW9uYWwpIHsKICAgICAgU3RyaW5nIHBocmFzZSA9IHBsdXJhbGl6ZUFyZ3VtZW50cyhtYXhQb3NpdGlvbmFsKTsKICAgICAgaWYgKG1heFBvc2l0aW9uYWwgIT0gbWluUG9zaXRpb25hbCkgcGhyYXNlID0gJ2F0IG1vc3QgJHBocmFzZSc7CiAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgIF9lbGVtZW50TWFwLmdldFNwYW5uYWJsZSh0YXJnZXRFbGVtZW50LCBpbnZvY2F0aW9uKSwKICAgICAgICAgIE1lc3NhZ2VLaW5kLkdFTkVSSUMsCiAgICAgICAgICB7J3RleHQnOiAiRXJyb3I6IFRvbyBtYW55IGFyZ3VtZW50cy4gJyR7bmFtZSgpfScgdGFrZXMgJHBocmFzZS4ifSk7CiAgICAgIGJhZCA9IHRydWU7CiAgICB9CiAgICBpZiAoYXJndW1lbnRzLm5hbWVkLmlzTm90RW1wdHkpIHsKICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgICAgX2VsZW1lbnRNYXAuZ2V0U3Bhbm5hYmxlKHRhcmdldEVsZW1lbnQsIGludm9jYXRpb24pLAogICAgICAgICAgTWVzc2FnZUtpbmQuR0VORVJJQywKICAgICAgICAgIHsndGV4dCc6ICJFcnJvcjogJyR7bmFtZSgpfScgZG9lcyBub3QgdGFrZSBuYW1lZCBhcmd1bWVudHMuIn0pOwogICAgICBiYWQgPSB0cnVlOwogICAgfQogICAgcmV0dXJuIGJhZDsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGFyZ3VtZW50LiBUaGUgYXJndW1lbnQgbXVzdCBldmFsdWF0ZSB0byBhCiAgLy8vIGNvbnN0YW50LiAgSWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRoZSBlcnJvciBpcyByZXBvcnRlZCBhbmQgYG51bGxgIGlzCiAgLy8vIHJldHVybmVkLgogIFN0cmluZyBfZm9yZWlnbkNvbnN0YW50U3RyaW5nQXJndW1lbnQoCiAgICAgIGlyLlN0YXRpY0ludm9jYXRpb24gaW52b2NhdGlvbiwgaW50IHBvc2l0aW9uLCBTdHJpbmcgbWV0aG9kTmFtZSwKICAgICAgW1N0cmluZyBhZGplY3RpdmUgPSAnJ10pIHsKICAgIGlyLkV4cHJlc3Npb24gYXJndW1lbnQgPSBpbnZvY2F0aW9uLmFyZ3VtZW50cy5wb3NpdGlvbmFsW3Bvc2l0aW9uXTsKICAgIGFyZ3VtZW50LmFjY2VwdCh0aGlzKTsKICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IHBvcCgpOwoKICAgIGlmICghaW5zdHJ1Y3Rpb24uaXNDb25zdGFudFN0cmluZygpKSB7CiAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgIF9lbGVtZW50TWFwLmdldFNwYW5uYWJsZSh0YXJnZXRFbGVtZW50LCBhcmd1bWVudCksCiAgICAgICAgICBNZXNzYWdlS2luZC5HRU5FUklDLCB7CiAgICAgICAgJ3RleHQnOiAiRXJyb3I6IEV4cGVjdGVkIFN0cmluZyBjb25zdGFudCBhcyAke2FkamVjdGl2ZX1hcmd1bWVudCAiCiAgICAgICAgICAgICJ0byAnJG1ldGhvZE5hbWUnLiIKICAgICAgfSk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIEhDb25zdGFudCBoQ29uc3RhbnQgPSBpbnN0cnVjdGlvbjsKICAgIFN0cmluZ0NvbnN0YW50VmFsdWUgc3RyaW5nQ29uc3RhbnQgPSBoQ29uc3RhbnQuY29uc3RhbnQ7CiAgICByZXR1cm4gc3RyaW5nQ29uc3RhbnQuc3RyaW5nVmFsdWU7CiAgfQoKICB2b2lkIGhhbmRsZUZvcmVpZ25EYXJ0Q2xvc3VyZVRvSnMoCiAgICAgIGlyLlN0YXRpY0ludm9jYXRpb24gaW52b2NhdGlvbiwgU3RyaW5nIG5hbWUpIHsKICAgIC8vIFRPRE8oc3JhKTogRG8gd2UgbmVlZCB0byB3cmFwIHRoZSBjbG9zdXJlIGluIHNvbWV0aGluZyB0aGF0IHNhdmVzIHRoZQogICAgLy8gY3VycmVudCBpc29sYXRlPwogICAgaGFuZGxlRm9yZWlnblJhd0Z1bmN0aW9uUmVmKGludm9jYXRpb24sIG5hbWUpOwogIH0KCiAgdm9pZCBoYW5kbGVGb3JlaWduUmF3RnVuY3Rpb25SZWYoCiAgICAgIGlyLlN0YXRpY0ludm9jYXRpb24gaW52b2NhdGlvbiwgU3RyaW5nIG5hbWUpIHsKICAgIGlmIChfdW5leHBlY3RlZEZvcmVpZ25Bcmd1bWVudHMoaW52b2NhdGlvbiwKICAgICAgICBtaW5Qb3NpdGlvbmFsOiAxLCBtYXhQb3NpdGlvbmFsOiAxKSkgewogICAgICAvLyBSZXN1bHQgZXhwZWN0ZWQgb24gc3RhY2suCiAgICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudE51bGwoY2xvc2VkV29ybGQpKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlyLkV4cHJlc3Npb24gY2xvc3VyZSA9IGludm9jYXRpb24uYXJndW1lbnRzLnBvc2l0aW9uYWwuc2luZ2xlOwogICAgU3RyaW5nIHByb2JsZW0gPSAncmVxdWlyZXMgYSBzdGF0aWMgbWV0aG9kIG9yIHRvcC1sZXZlbCBtZXRob2QnOwoKICAgIGJvb2wgaGFuZGxlVGFyZ2V0KGlyLlByb2NlZHVyZSBwcm9jZWR1cmUpIHsKICAgICAgaXIuRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uID0gcHJvY2VkdXJlLmZ1bmN0aW9uOwogICAgICBpZiAoZnVuY3Rpb24gIT0gbnVsbCAmJgogICAgICAgICAgZnVuY3Rpb24ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA9PQogICAgICAgICAgICAgIGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCAmJgogICAgICAgICAgZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLmlzRW1wdHkpIHsKICAgICAgICBwdXNoKG5ldyBIRm9yZWlnbkNvZGUoCiAgICAgICAgICAgIGpzLmpzLmV4cHJlc3Npb25UZW1wbGF0ZVlpZWxkaW5nKAogICAgICAgICAgICAgICAgZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2VzcyhfZWxlbWVudE1hcC5nZXRNZXRob2QocHJvY2VkdXJlKSkpLAogICAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlLAogICAgICAgICAgICA8SEluc3RydWN0aW9uPltdLAogICAgICAgICAgICBuYXRpdmVCZWhhdmlvcjogTmF0aXZlQmVoYXZpb3IuUFVSRSwKICAgICAgICAgICAgZm9yZWlnbkZ1bmN0aW9uOiBfZWxlbWVudE1hcC5nZXRNZXRob2QocHJvY2VkdXJlKSkpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHByb2JsZW0gPSAnZG9lcyBub3QgaGFuZGxlIGEgY2xvc3VyZSB3aXRoIG9wdGlvbmFsIHBhcmFtZXRlcnMnOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaWYgKGNsb3N1cmUgaXMgaXIuU3RhdGljR2V0KSB7CiAgICAgIGlyLk1lbWJlciBzdGF0aWNUYXJnZXQgPSBjbG9zdXJlLnRhcmdldDsKICAgICAgaWYgKHN0YXRpY1RhcmdldCBpcyBpci5Qcm9jZWR1cmUpIHsKICAgICAgICBpZiAoc3RhdGljVGFyZ2V0LmtpbmQgPT0gaXIuUHJvY2VkdXJlS2luZC5NZXRob2QpIHsKICAgICAgICAgIGlmIChoYW5kbGVUYXJnZXQoc3RhdGljVGFyZ2V0KSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKGNsb3N1cmUgaXMgaXIuQ29uc3RhbnRFeHByZXNzaW9uICYmCiAgICAgICAgY2xvc3VyZS5jb25zdGFudCBpcyBpci5UZWFyT2ZmQ29uc3RhbnQpIHsKICAgICAgaXIuVGVhck9mZkNvbnN0YW50IHRlYXJPZmYgPSBjbG9zdXJlLmNvbnN0YW50OwogICAgICBpZiAoaGFuZGxlVGFyZ2V0KHRlYXJPZmYucHJvY2VkdXJlKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQoKICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICBfZWxlbWVudE1hcC5nZXRTcGFubmFibGUodGFyZ2V0RWxlbWVudCwgaW52b2NhdGlvbiksCiAgICAgICAgTWVzc2FnZUtpbmQuR0VORVJJQywKICAgICAgICB7J3RleHQnOiAiJyRuYW1lJyAkcHJvYmxlbS4ifSk7CiAgICBzdGFjay5hZGQoZ3JhcGguYWRkQ29uc3RhbnROdWxsKGNsb3NlZFdvcmxkKSk7IC8vIFJlc3VsdCBleHBlY3RlZCBvbiBzdGFjay4KICAgIHJldHVybjsKICB9CgogIHZvaWQgaGFuZGxlRm9yZWlnbkpzU2V0U3RhdGljU3RhdGUoaXIuU3RhdGljSW52b2NhdGlvbiBpbnZvY2F0aW9uKSB7CiAgICBpZiAoX3VuZXhwZWN0ZWRGb3JlaWduQXJndW1lbnRzKGludm9jYXRpb24sCiAgICAgICAgbWluUG9zaXRpb25hbDogMSwgbWF4UG9zaXRpb25hbDogMSkpIHsKICAgICAgLy8gUmVzdWx0IGV4cGVjdGVkIG9uIHN0YWNrLgogICAgICBzdGFjay5hZGQoZ3JhcGguYWRkQ29uc3RhbnROdWxsKGNsb3NlZFdvcmxkKSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzID0gX3Zpc2l0UG9zaXRpb25hbEFyZ3VtZW50cyhpbnZvY2F0aW9uLmFyZ3VtZW50cyk7CgogICAgU3RyaW5nIGlzb2xhdGVOYW1lID0gbmFtZXIuc3RhdGljU3RhdGVIb2xkZXI7CiAgICBTaWRlRWZmZWN0cyBzaWRlRWZmZWN0cyA9IG5ldyBTaWRlRWZmZWN0cy5lbXB0eSgpOwogICAgc2lkZUVmZmVjdHMuc2V0QWxsU2lkZUVmZmVjdHMoKTsKICAgIHB1c2gobmV3IEhGb3JlaWduQ29kZShqcy5qcy5wYXJzZUZvcmVpZ25KUygiJGlzb2xhdGVOYW1lID0gIyIpLAogICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUsIGlucHV0cywKICAgICAgICBuYXRpdmVCZWhhdmlvcjogTmF0aXZlQmVoYXZpb3IuQ0hBTkdFU19PVEhFUiwgZWZmZWN0czogc2lkZUVmZmVjdHMpKTsKICB9CgogIHZvaWQgaGFuZGxlRm9yZWlnbkpzR2V0U3RhdGljU3RhdGUoaXIuU3RhdGljSW52b2NhdGlvbiBpbnZvY2F0aW9uKSB7CiAgICBpZiAoX3VuZXhwZWN0ZWRGb3JlaWduQXJndW1lbnRzKGludm9jYXRpb24sCiAgICAgICAgbWluUG9zaXRpb25hbDogMCwgbWF4UG9zaXRpb25hbDogMCkpIHsKICAgICAgLy8gUmVzdWx0IGV4cGVjdGVkIG9uIHN0YWNrLgogICAgICBzdGFjay5hZGQoZ3JhcGguYWRkQ29uc3RhbnROdWxsKGNsb3NlZFdvcmxkKSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBwdXNoKG5ldyBIRm9yZWlnbkNvZGUoanMuanMucGFyc2VGb3JlaWduSlMobmFtZXIuc3RhdGljU3RhdGVIb2xkZXIpLAogICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUsIDxISW5zdHJ1Y3Rpb24+W10sCiAgICAgICAgbmF0aXZlQmVoYXZpb3I6IE5hdGl2ZUJlaGF2aW9yLkRFUEVORFNfT1RIRVIpKTsKICB9CgogIHZvaWQgaGFuZGxlRm9yZWlnbkpzR2V0TmFtZShpci5TdGF0aWNJbnZvY2F0aW9uIGludm9jYXRpb24pIHsKICAgIGlmIChfdW5leHBlY3RlZEZvcmVpZ25Bcmd1bWVudHMoaW52b2NhdGlvbiwKICAgICAgICBtaW5Qb3NpdGlvbmFsOiAxLCBtYXhQb3NpdGlvbmFsOiAxKSkgewogICAgICAvLyBSZXN1bHQgZXhwZWN0ZWQgb24gc3RhY2suCiAgICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudE51bGwoY2xvc2VkV29ybGQpKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlyLk5vZGUgYXJndW1lbnQgPSBpbnZvY2F0aW9uLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmZpcnN0OwogICAgYXJndW1lbnQuYWNjZXB0KHRoaXMpOwogICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gcG9wKCk7CgogICAgaWYgKGluc3RydWN0aW9uIGlzIEhDb25zdGFudCkgewogICAgICBqcy5OYW1lIG5hbWUgPQogICAgICAgICAgX2VsZW1lbnRNYXAuZ2V0TmFtZUZvckpzR2V0TmFtZShpbnN0cnVjdGlvbi5jb25zdGFudCwgbmFtZXIpOwogICAgICBzdGFjay5hZGQoZ3JhcGguYWRkQ29uc3RhbnRTdHJpbmdGcm9tTmFtZShuYW1lLCBjbG9zZWRXb3JsZCkpOwogICAgICByZXR1cm47CiAgICB9CgogICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgIF9lbGVtZW50TWFwLmdldFNwYW5uYWJsZSh0YXJnZXRFbGVtZW50LCBhcmd1bWVudCksCiAgICAgICAgTWVzc2FnZUtpbmQuR0VORVJJQywKICAgICAgICB7J3RleHQnOiAnRXJyb3I6IEV4cGVjdGVkIGEgSnNHZXROYW1lIGVudW0gdmFsdWUuJ30pOwogICAgLy8gUmVzdWx0IGV4cGVjdGVkIG9uIHN0YWNrLgogICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCkpOwogIH0KCiAgdm9pZCBoYW5kbGVGb3JlaWduSnNFbWJlZGRlZEdsb2JhbChpci5TdGF0aWNJbnZvY2F0aW9uIGludm9jYXRpb24pIHsKICAgIGlmIChfdW5leHBlY3RlZEZvcmVpZ25Bcmd1bWVudHMoaW52b2NhdGlvbiwKICAgICAgICBtaW5Qb3NpdGlvbmFsOiAyLCBtYXhQb3NpdGlvbmFsOiAyKSkgewogICAgICAvLyBSZXN1bHQgZXhwZWN0ZWQgb24gc3RhY2suCiAgICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudE51bGwoY2xvc2VkV29ybGQpKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgU3RyaW5nIGdsb2JhbE5hbWUgPSBfZm9yZWlnbkNvbnN0YW50U3RyaW5nQXJndW1lbnQoCiAgICAgICAgaW52b2NhdGlvbiwgMSwgJ0pTX0VNQkVEREVEX0dMT0JBTCcsICdzZWNvbmQgJyk7CiAgICBqcy5UZW1wbGF0ZSBleHByID0ganMuanMuZXhwcmVzc2lvblRlbXBsYXRlWWllbGRpbmcoCiAgICAgICAgZW1pdHRlci5nZW5lcmF0ZUVtYmVkZGVkR2xvYmFsQWNjZXNzKGdsb2JhbE5hbWUpKTsKCiAgICBOYXRpdmVCZWhhdmlvciBuYXRpdmVCZWhhdmlvciA9CiAgICAgICAgX2VsZW1lbnRNYXAuZ2V0TmF0aXZlQmVoYXZpb3JGb3JKc0VtYmVkZGVkR2xvYmFsQ2FsbChpbnZvY2F0aW9uKTsKICAgIGFzc2VydCgKICAgICAgICBuYXRpdmVCZWhhdmlvciAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KF9lbGVtZW50TWFwLmdldFNwYW5uYWJsZSh0YXJnZXRFbGVtZW50LCBpbnZvY2F0aW9uKSwKICAgICAgICAgICAgIk5vIE5hdGl2ZUJlaGF2aW9yIGZvciAkaW52b2NhdGlvbiIpKTsKCiAgICBBYnN0cmFjdFZhbHVlIHNzYVR5cGUgPQogICAgICAgIF90eXBlSW5mZXJlbmNlTWFwLnR5cGVGcm9tTmF0aXZlQmVoYXZpb3IobmF0aXZlQmVoYXZpb3IsIGNsb3NlZFdvcmxkKTsKICAgIHB1c2gobmV3IEhGb3JlaWduQ29kZShleHByLCBzc2FUeXBlLCBjb25zdCA8SEluc3RydWN0aW9uPltdLAogICAgICAgIG5hdGl2ZUJlaGF2aW9yOiBuYXRpdmVCZWhhdmlvcikpOwogIH0KCiAgdm9pZCBoYW5kbGVGb3JlaWduSnNCdWlsdGluKGlyLlN0YXRpY0ludm9jYXRpb24gaW52b2NhdGlvbikgewogICAgaWYgKF91bmV4cGVjdGVkRm9yZWlnbkFyZ3VtZW50cyhpbnZvY2F0aW9uLCBtaW5Qb3NpdGlvbmFsOiAyKSkgewogICAgICAvLyBSZXN1bHQgZXhwZWN0ZWQgb24gc3RhY2suCiAgICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudE51bGwoY2xvc2VkV29ybGQpKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIExpc3Q8aXIuRXhwcmVzc2lvbj4gYXJndW1lbnRzID0gaW52b2NhdGlvbi5hcmd1bWVudHMucG9zaXRpb25hbDsKICAgIGlyLkV4cHJlc3Npb24gbmFtZUFyZ3VtZW50ID0gYXJndW1lbnRzWzFdOwoKICAgIG5hbWVBcmd1bWVudC5hY2NlcHQodGhpcyk7CiAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSBwb3AoKTsKCiAgICBqcy5UZW1wbGF0ZSB0ZW1wbGF0ZTsKICAgIGlmIChpbnN0cnVjdGlvbiBpcyBIQ29uc3RhbnQpIHsKICAgICAgdGVtcGxhdGUgPQogICAgICAgICAgX2VsZW1lbnRNYXAuZ2V0SnNCdWlsdGluVGVtcGxhdGUoaW5zdHJ1Y3Rpb24uY29uc3RhbnQsIGVtaXR0ZXIpOwogICAgfQogICAgaWYgKHRlbXBsYXRlID09IG51bGwpIHsKICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgICAgX2VsZW1lbnRNYXAuZ2V0U3Bhbm5hYmxlKHRhcmdldEVsZW1lbnQsIG5hbWVBcmd1bWVudCksCiAgICAgICAgICBNZXNzYWdlS2luZC5HRU5FUklDLAogICAgICAgICAgeyd0ZXh0JzogJ0Vycm9yOiBFeHBlY3RlZCBhIEpzQnVpbHRpbiBlbnVtIHZhbHVlLid9KTsKICAgICAgLy8gUmVzdWx0IGV4cGVjdGVkIG9uIHN0YWNrLgogICAgICBzdGFjay5hZGQoZ3JhcGguYWRkQ29uc3RhbnROdWxsKGNsb3NlZFdvcmxkKSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzID0gPEhJbnN0cnVjdGlvbj5bXTsKICAgIGZvciAoaXIuRXhwcmVzc2lvbiBhcmd1bWVudCBpbiBhcmd1bWVudHMuc2tpcCgyKSkgewogICAgICBhcmd1bWVudC5hY2NlcHQodGhpcyk7CiAgICAgIGlucHV0cy5hZGQocG9wKCkpOwogICAgfQoKICAgIE5hdGl2ZUJlaGF2aW9yIG5hdGl2ZUJlaGF2aW9yID0KICAgICAgICBfZWxlbWVudE1hcC5nZXROYXRpdmVCZWhhdmlvckZvckpzQnVpbHRpbkNhbGwoaW52b2NhdGlvbik7CiAgICBhc3NlcnQoCiAgICAgICAgbmF0aXZlQmVoYXZpb3IgIT0gbnVsbCwKICAgICAgICBmYWlsZWRBdChfZWxlbWVudE1hcC5nZXRTcGFubmFibGUodGFyZ2V0RWxlbWVudCwgaW52b2NhdGlvbiksCiAgICAgICAgICAgICJObyBOYXRpdmVCZWhhdmlvciBmb3IgJGludm9jYXRpb24iKSk7CgogICAgQWJzdHJhY3RWYWx1ZSBzc2FUeXBlID0KICAgICAgICBfdHlwZUluZmVyZW5jZU1hcC50eXBlRnJvbU5hdGl2ZUJlaGF2aW9yKG5hdGl2ZUJlaGF2aW9yLCBjbG9zZWRXb3JsZCk7CiAgICBwdXNoKG5ldyBIRm9yZWlnbkNvZGUodGVtcGxhdGUsIHNzYVR5cGUsIGlucHV0cywKICAgICAgICBuYXRpdmVCZWhhdmlvcjogbmF0aXZlQmVoYXZpb3IpKTsKICB9CgogIHZvaWQgaGFuZGxlRm9yZWlnbkpzR2V0RmxhZyhpci5TdGF0aWNJbnZvY2F0aW9uIGludm9jYXRpb24pIHsKICAgIGlmIChfdW5leHBlY3RlZEZvcmVpZ25Bcmd1bWVudHMoaW52b2NhdGlvbiwKICAgICAgICBtaW5Qb3NpdGlvbmFsOiAxLCBtYXhQb3NpdGlvbmFsOiAxKSkgewogICAgICBzdGFjay5hZGQoCiAgICAgICAgICAvLyBSZXN1bHQgZXhwZWN0ZWQgb24gc3RhY2suCiAgICAgICAgICBncmFwaC5hZGRDb25zdGFudEJvb2woZmFsc2UsIGNsb3NlZFdvcmxkKSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIFN0cmluZyBuYW1lID0gX2ZvcmVpZ25Db25zdGFudFN0cmluZ0FyZ3VtZW50KGludm9jYXRpb24sIDAsICdKU19HRVRfRkxBRycpOwogICAgYm9vbCB2YWx1ZSA9IGdldEZsYWdWYWx1ZShuYW1lKTsKICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgIF9lbGVtZW50TWFwLmdldFNwYW5uYWJsZSh0YXJnZXRFbGVtZW50LCBpbnZvY2F0aW9uKSwKICAgICAgICAgIE1lc3NhZ2VLaW5kLkdFTkVSSUMsCiAgICAgICAgICB7J3RleHQnOiAnRXJyb3I6IFVua25vd24gaW50ZXJuYWwgZmxhZyAiJG5hbWUiLid9KTsKICAgIH0gZWxzZSB7CiAgICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudEJvb2wodmFsdWUsIGNsb3NlZFdvcmxkKSk7CiAgICB9CiAgfQoKICB2b2lkIGhhbmRsZUpzSW50ZXJjZXB0b3JDb25zdGFudChpci5TdGF0aWNJbnZvY2F0aW9uIGludm9jYXRpb24pIHsKICAgIC8vIFNpbmdsZSBhcmd1bWVudCBtdXN0IGJlIGEgVHlwZUNvbnN0YW50IHdoaWNoIGlzIGNvbnZlcnRlZCBpbnRvIGEKICAgIC8vIEludGVyY2VwdG9yQ29uc3RhbnQuCiAgICBpZiAoX3VuZXhwZWN0ZWRGb3JlaWduQXJndW1lbnRzKGludm9jYXRpb24sCiAgICAgICAgbWluUG9zaXRpb25hbDogMSwgbWF4UG9zaXRpb25hbDogMSkpIHsKICAgICAgLy8gUmVzdWx0IGV4cGVjdGVkIG9uIHN0YWNrLgogICAgICBzdGFjay5hZGQoZ3JhcGguYWRkQ29uc3RhbnROdWxsKGNsb3NlZFdvcmxkKSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlyLkV4cHJlc3Npb24gYXJndW1lbnQgPSBpbnZvY2F0aW9uLmFyZ3VtZW50cy5wb3NpdGlvbmFsLnNpbmdsZTsKICAgIGFyZ3VtZW50LmFjY2VwdCh0aGlzKTsKICAgIEhJbnN0cnVjdGlvbiBhcmd1bWVudEluc3RydWN0aW9uID0gcG9wKCk7CiAgICBpZiAoYXJndW1lbnRJbnN0cnVjdGlvbiBpcyBIQ29uc3RhbnQpIHsKICAgICAgQ29uc3RhbnRWYWx1ZSBhcmd1bWVudENvbnN0YW50ID0gYXJndW1lbnRJbnN0cnVjdGlvbi5jb25zdGFudDsKICAgICAgaWYgKGFyZ3VtZW50Q29uc3RhbnQgaXMgVHlwZUNvbnN0YW50VmFsdWUgJiYKICAgICAgICAgIGFyZ3VtZW50Q29uc3RhbnQucmVwcmVzZW50ZWRUeXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICBJbnRlcmZhY2VUeXBlIHR5cGUgPSBhcmd1bWVudENvbnN0YW50LnJlcHJlc2VudGVkVHlwZTsKICAgICAgICAvLyBUT0RPKHNyYSk6IENoZWNrIHRoYXQgdHlwZSBpcyBhIHN1YmNsYXNzIG9mIFtJbnRlcmNlcHRvcl0uCiAgICAgICAgQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IG5ldyBJbnRlcmNlcHRvckNvbnN0YW50VmFsdWUodHlwZS5lbGVtZW50KTsKICAgICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSBncmFwaC5hZGRDb25zdGFudChjb25zdGFudCwgY2xvc2VkV29ybGQpOwogICAgICAgIHN0YWNrLmFkZChpbnN0cnVjdGlvbik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CgogICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgIF9lbGVtZW50TWFwLmdldFNwYW5uYWJsZSh0YXJnZXRFbGVtZW50LCBpbnZvY2F0aW9uKSwKICAgICAgICBNZXNzYWdlS2luZC5XUk9OR19BUkdVTUVOVF9GT1JfSlNfSU5URVJDRVBUT1JfQ09OU1RBTlQpOwogICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCkpOwogIH0KCiAgdm9pZCBoYW5kbGVGb3JlaWduR2V0SW50ZXJjZXB0b3IoaXIuU3RhdGljSW52b2NhdGlvbiBpbnZvY2F0aW9uKSB7CiAgICAvLyBTaW5nbGUgYXJndW1lbnQgaXMgdGhlIGludGVyY2VwdGVkIG9iamVjdC4KICAgIGlmIChfdW5leHBlY3RlZEZvcmVpZ25Bcmd1bWVudHMoaW52b2NhdGlvbiwKICAgICAgICBtaW5Qb3NpdGlvbmFsOiAxLCBtYXhQb3NpdGlvbmFsOiAxKSkgewogICAgICAvLyBSZXN1bHQgZXhwZWN0ZWQgb24gc3RhY2suCiAgICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudE51bGwoY2xvc2VkV29ybGQpKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaXIuRXhwcmVzc2lvbiBhcmd1bWVudCA9IGludm9jYXRpb24uYXJndW1lbnRzLnBvc2l0aW9uYWwuc2luZ2xlOwogICAgYXJndW1lbnQuYWNjZXB0KHRoaXMpOwogICAgSEluc3RydWN0aW9uIGFyZ3VtZW50SW5zdHJ1Y3Rpb24gPSBwb3AoKTsKCiAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9CiAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZENhbGwoaW52b2NhdGlvbiwgaW52b2NhdGlvbik7CiAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPQogICAgICAgIF9pbnRlcmNlcHRvckZvcihhcmd1bWVudEluc3RydWN0aW9uLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBzdGFjay5hZGQoaW5zdHJ1Y3Rpb24pOwogIH0KCiAgdm9pZCBoYW5kbGVGb3JlaWduSnMoaXIuU3RhdGljSW52b2NhdGlvbiBpbnZvY2F0aW9uKSB7CiAgICBpZiAoX3VuZXhwZWN0ZWRGb3JlaWduQXJndW1lbnRzKGludm9jYXRpb24sCiAgICAgICAgbWluUG9zaXRpb25hbDogMiwgbWF4UG9zaXRpb25hbDogbnVsbCwgdHlwZUFyZ3VtZW50Q291bnQ6IDEpKSB7CiAgICAgIC8vIFJlc3VsdCBleHBlY3RlZCBvbiBzdGFjay4KICAgICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCkpOwogICAgICByZXR1cm47CiAgICB9CgogICAgTmF0aXZlQmVoYXZpb3IgbmF0aXZlQmVoYXZpb3IgPQogICAgICAgIF9lbGVtZW50TWFwLmdldE5hdGl2ZUJlaGF2aW9yRm9ySnNDYWxsKGludm9jYXRpb24pOwogICAgYXNzZXJ0KAogICAgICAgIG5hdGl2ZUJlaGF2aW9yICE9IG51bGwsCiAgICAgICAgZmFpbGVkQXQoX2VsZW1lbnRNYXAuZ2V0U3Bhbm5hYmxlKHRhcmdldEVsZW1lbnQsIGludm9jYXRpb24pLAogICAgICAgICAgICAiTm8gTmF0aXZlQmVoYXZpb3IgZm9yICRpbnZvY2F0aW9uIikpOwoKICAgIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMgPSA8SEluc3RydWN0aW9uPltdOwogICAgZm9yIChpci5FeHByZXNzaW9uIGFyZ3VtZW50IGluIGludm9jYXRpb24uYXJndW1lbnRzLnBvc2l0aW9uYWwuc2tpcCgyKSkgewogICAgICBhcmd1bWVudC5hY2NlcHQodGhpcyk7CiAgICAgIGlucHV0cy5hZGQocG9wKCkpOwogICAgfQoKICAgIGlmIChuYXRpdmVCZWhhdmlvci5jb2RlVGVtcGxhdGUucG9zaXRpb25hbEFyZ3VtZW50Q291bnQgIT0gaW5wdXRzLmxlbmd0aCkgewogICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICBfZWxlbWVudE1hcC5nZXRTcGFubmFibGUodGFyZ2V0RWxlbWVudCwgaW52b2NhdGlvbiksCiAgICAgICAgICBNZXNzYWdlS2luZC5HRU5FUklDLCB7CiAgICAgICAgJ3RleHQnOiAnTWlzbWF0Y2ggYmV0d2VlbiBudW1iZXIgb2YgcGxhY2Vob2xkZXJzJwogICAgICAgICAgICAnIGFuZCBudW1iZXIgb2YgYXJndW1lbnRzLicKICAgICAgfSk7CiAgICAgIC8vIFJlc3VsdCBleHBlY3RlZCBvbiBzdGFjay4KICAgICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCkpOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKEhhc0NhcHR1cmVkUGxhY2Vob2xkZXJzLmNoZWNrKG5hdGl2ZUJlaGF2aW9yLmNvZGVUZW1wbGF0ZS5hc3QpKSB7CiAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgIF9lbGVtZW50TWFwLmdldFNwYW5uYWJsZSh0YXJnZXRFbGVtZW50LCBpbnZvY2F0aW9uKSwKICAgICAgICAgIE1lc3NhZ2VLaW5kLkpTX1BMQUNFSE9MREVSX0NBUFRVUkUpOwogICAgfQoKICAgIEFic3RyYWN0VmFsdWUgc3NhVHlwZSA9CiAgICAgICAgX3R5cGVJbmZlcmVuY2VNYXAudHlwZUZyb21OYXRpdmVCZWhhdmlvcihuYXRpdmVCZWhhdmlvciwgY2xvc2VkV29ybGQpOwoKICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0gbnVsbDsKICAgIEhJbnN0cnVjdGlvbiBjb2RlID0gbmV3IEhGb3JlaWduQ29kZSgKICAgICAgICBuYXRpdmVCZWhhdmlvci5jb2RlVGVtcGxhdGUsIHNzYVR5cGUsIGlucHV0cywKICAgICAgICBpc1N0YXRlbWVudDogIW5hdGl2ZUJlaGF2aW9yLmNvZGVUZW1wbGF0ZS5pc0V4cHJlc3Npb24sCiAgICAgICAgZWZmZWN0czogbmF0aXZlQmVoYXZpb3Iuc2lkZUVmZmVjdHMsCiAgICAgICAgbmF0aXZlQmVoYXZpb3I6IG5hdGl2ZUJlaGF2aW9yKQogICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgICBwdXNoKGNvZGUpOwoKICAgIERhcnRUeXBlIHR5cGUgPSBfZ2V0RGFydFR5cGVJZlZhbGlkKGludm9jYXRpb24uYXJndW1lbnRzLnR5cGVzLnNpbmdsZSk7CiAgICBBYnN0cmFjdFZhbHVlIHRydXN0ZWRNYXNrID0gdHlwZUJ1aWxkZXIudHJ1c3RUeXBlTWFzayh0eXBlKTsKCiAgICBpZiAodHJ1c3RlZE1hc2sgIT0gbnVsbCkgewogICAgICAvLyBXZSBvbmx5IGFsbG93IHRoZSB0eXBlIGFyZ3VtZW50IHRvIG5hcnJvdyBgZHluYW1pY2AsIHdoaWNoIHByb2JhYmx5CiAgICAgIC8vIGNvbWVzIGZyb20gYW4gdW5zcGVjaWZpZWQgcmV0dXJuIHR5cGUgaW4gdGhlIE5hdGl2ZUJlaGF2aW9yLgogICAgICBpZiAoYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgICAgLmNvbnRhaW5zQWxsKGNvZGUuaW5zdHJ1Y3Rpb25UeXBlKQogICAgICAgICAgLmlzUG90ZW50aWFsbHlUcnVlKSB7CiAgICAgICAgLy8gT3ZlcndyaXRlIHRoZSB0eXBlIHdpdGggdGhlIG5hcnJvd2VyIHR5cGUuCiAgICAgICAgY29kZS5pbnN0cnVjdGlvblR5cGUgPSB0cnVzdGVkTWFzazsKICAgICAgfSBlbHNlIGlmIChhYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgICAuY29udGFpbnModHJ1c3RlZE1hc2ssIGNvZGUuaW5zdHJ1Y3Rpb25UeXBlKQogICAgICAgICAgLmlzUG90ZW50aWFsbHlUcnVlKSB7CiAgICAgICAgLy8gSXQgaXMgYWNjZXB0YWJsZSBmb3IgdGhlIHR5cGUgcGFyYW1ldGVyIHRvIGJlIGJyb2FkZXIgdGhhbiB0aGUKICAgICAgICAvLyBzcGVjaWZpZWQgdHlwZS4KICAgICAgfSBlbHNlIHsKICAgICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICAgIF9lbGVtZW50TWFwLmdldFNwYW5uYWJsZSh0YXJnZXRFbGVtZW50LCBpbnZvY2F0aW9uKSwKICAgICAgICAgICAgTWVzc2FnZUtpbmQuR0VORVJJQywgewogICAgICAgICAgJ3RleHQnOiAnVHlwZSBhcmd1bWVudCB0b28gbmFycm93IGZvciBzcGVjaWZpZWQgYmVoYXZpb3IgdHlwZSAnCiAgICAgICAgICAgICAgJygke3RydXN0ZWRNYXNrfSBkb2VzIG5vdCBhbGxvdyAnCiAgICAgICAgICAgICAgJ2FsbCB2YWx1ZXMgaW4gJHtjb2RlLmluc3RydWN0aW9uVHlwZX0pJwogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGhhbmRsZUpzU3RyaW5nQ29uY2F0KGlyLlN0YXRpY0ludm9jYXRpb24gaW52b2NhdGlvbikgewogICAgaWYgKF91bmV4cGVjdGVkRm9yZWlnbkFyZ3VtZW50cyhpbnZvY2F0aW9uLAogICAgICAgIG1pblBvc2l0aW9uYWw6IDIsIG1heFBvc2l0aW9uYWw6IDIpKSB7CiAgICAgIC8vIFJlc3VsdCBleHBlY3RlZCBvbiBzdGFjay4KICAgICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCkpOwogICAgICByZXR1cm47CiAgICB9CiAgICBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzID0gX3Zpc2l0UG9zaXRpb25hbEFyZ3VtZW50cyhpbnZvY2F0aW9uLmFyZ3VtZW50cyk7CiAgICBwdXNoKG5ldyBIU3RyaW5nQ29uY2F0KAogICAgICAgIGlucHV0c1swXSwgaW5wdXRzWzFdLCBhYnN0cmFjdFZhbHVlRG9tYWluLnN0cmluZ1R5cGUpKTsKICB9CgogIHZvaWQgX3B1c2hTdGF0aWNJbnZvY2F0aW9uKE1lbWJlckVudGl0eSB0YXJnZXQsIExpc3Q8SEluc3RydWN0aW9uPiBhcmd1bWVudHMsCiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZU1hc2ssIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMsCiAgICAgIHtTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiwgSW50ZXJmYWNlVHlwZSBpbnN0YW5jZVR5cGV9KSB7CiAgICAvLyBUT0RPKHJlZGVtcHRpb24pOiBQYXNzIGN1cnJlbnQgbm9kZSBpZiBuZWVkZWQuCiAgICBpZiAoX3RyeUlubGluZU1ldGhvZCgKICAgICAgICB0YXJnZXQsIG51bGwsIG51bGwsIGFyZ3VtZW50cywgdHlwZUFyZ3VtZW50cywgbnVsbCwgc291cmNlSW5mb3JtYXRpb24sCiAgICAgICAgaW5zdGFuY2VUeXBlOiBpbnN0YW5jZVR5cGUpKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgaW5zdHJ1Y3Rpb247CiAgICBpZiAoY2xvc2VkV29ybGQubmF0aXZlRGF0YS5pc0pzSW50ZXJvcE1lbWJlcih0YXJnZXQpKSB7CiAgICAgIGluc3RydWN0aW9uID0gX2ludm9rZUpzSW50ZXJvcEZ1bmN0aW9uKHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH0gZWxzZSB7CiAgICAgIGluc3RydWN0aW9uID0gbmV3IEhJbnZva2VTdGF0aWMoCiAgICAgICAgICB0YXJnZXQsIGFyZ3VtZW50cywgdHlwZU1hc2ssIHR5cGVBcmd1bWVudHMsCiAgICAgICAgICB0YXJnZXRDYW5UaHJvdzogIWluZmVycmVkRGF0YS5nZXRDYW5ub3RUaHJvdyh0YXJnZXQpKQogICAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKCiAgICAgIGlmIChjdXJyZW50SW1wbGljaXRJbnN0YW50aWF0aW9ucy5pc05vdEVtcHR5KSB7CiAgICAgICAgaW5zdHJ1Y3Rpb24uaW5zdGFudGlhdGVkVHlwZXMgPQogICAgICAgICAgICBuZXcgTGlzdDxJbnRlcmZhY2VUeXBlPi5mcm9tKGN1cnJlbnRJbXBsaWNpdEluc3RhbnRpYXRpb25zKTsKICAgICAgfQogICAgICBpbnN0cnVjdGlvbi5zaWRlRWZmZWN0cyA9IGluZmVycmVkRGF0YS5nZXRTaWRlRWZmZWN0c09mRWxlbWVudCh0YXJnZXQpOwogICAgfQogICAgcHVzaChpbnN0cnVjdGlvbik7CiAgfQoKICB2b2lkIF9wdXNoRHluYW1pY0ludm9jYXRpb24oCiAgICAgIGlyLk5vZGUgbm9kZSwKICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrLAogICAgICBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGFyZ3VtZW50cywKICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cywKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIC8vIFdlIHByZWZlciB0byBub3QgaW5saW5lIGNlcnRhaW4gb3BlcmF0aW9ucyBvbiBpbmRleGFibGVzLAogICAgLy8gYmVjYXVzZSB0aGUgY29uc3RhbnQgZm9sZGVyIHdpbGwgaGFuZGxlIHRoZW0gYmV0dGVyIGFuZCB0dXJuCiAgICAvLyB0aGVtIGludG8gc2ltcGxlciBpbnN0cnVjdGlvbnMgdGhhdCBhbGxvdyBmdXJ0aGVyCiAgICAvLyBvcHRpbWl6YXRpb25zLgogICAgYm9vbCBpc09wdGltaXphYmxlT3BlcmF0aW9uT25JbmRleGFibGUoCiAgICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsIE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICAgIGJvb2wgaXNMZW5ndGggPSBzZWxlY3Rvci5pc0dldHRlciAmJiBzZWxlY3Rvci5uYW1lID09ICJsZW5ndGgiOwogICAgICBpZiAoaXNMZW5ndGggfHwgc2VsZWN0b3IuaXNJbmRleCkgewogICAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc1N1YnR5cGVPZigKICAgICAgICAgICAgZWxlbWVudC5lbmNsb3NpbmdDbGFzcywgY29tbW9uRWxlbWVudHMuanNJbmRleGFibGVDbGFzcyk7CiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaXNJbmRleFNldCkgewogICAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc1N1YnR5cGVPZigKICAgICAgICAgICAgZWxlbWVudC5lbmNsb3NpbmdDbGFzcywgY29tbW9uRWxlbWVudHMuanNNdXRhYmxlSW5kZXhhYmxlQ2xhc3MpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIGJvb2wgaXNPcHRpbWl6YWJsZU9wZXJhdGlvbihTZWxlY3RvciBzZWxlY3RvciwgTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gZWxlbWVudC5lbmNsb3NpbmdDbGFzczsKICAgICAgaWYgKGlzT3B0aW1pemFibGVPcGVyYXRpb25PbkluZGV4YWJsZShzZWxlY3RvciwgZWxlbWVudCkpIHJldHVybiB0cnVlOwogICAgICBpZiAoIWludGVyY2VwdG9yRGF0YS5pbnRlcmNlcHRlZENsYXNzZXMuY29udGFpbnMoY2xzKSkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoc2VsZWN0b3IuaXNPcGVyYXRvcikgcmV0dXJuIHRydWU7CiAgICAgIGlmIChzZWxlY3Rvci5pc1NldHRlcikgcmV0dXJuIHRydWU7CiAgICAgIGlmIChzZWxlY3Rvci5pc0luZGV4KSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKHNlbGVjdG9yLmlzSW5kZXhTZXQpIHJldHVybiB0cnVlOwogICAgICBpZiAoZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5qc0FycmF5QWRkIHx8CiAgICAgICAgICBlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmpzQXJyYXlSZW1vdmVMYXN0IHx8CiAgICAgICAgICBjb21tb25FbGVtZW50cy5pc0pzU3RyaW5nU3BsaXQoZWxlbWVudCkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgTWVtYmVyRW50aXR5IGVsZW1lbnQgPSBjbG9zZWRXb3JsZC5sb2NhdGVTaW5nbGVNZW1iZXIoc2VsZWN0b3IsIG1hc2spOwogICAgaWYgKGVsZW1lbnQgIT0gbnVsbCAmJgogICAgICAgICFlbGVtZW50LmlzRmllbGQgJiYKICAgICAgICAhKGVsZW1lbnQuaXNHZXR0ZXIgJiYgc2VsZWN0b3IuaXNDYWxsKSAmJgogICAgICAgICEoZWxlbWVudC5pc0Z1bmN0aW9uICYmIHNlbGVjdG9yLmlzR2V0dGVyKSAmJgogICAgICAgICFpc09wdGltaXphYmxlT3BlcmF0aW9uKHNlbGVjdG9yLCBlbGVtZW50KSkgewogICAgICBpZiAoX3RyeUlubGluZU1ldGhvZChlbGVtZW50LCBzZWxlY3RvciwgbWFzaywgYXJndW1lbnRzLCB0eXBlQXJndW1lbnRzLAogICAgICAgICAgbm9kZSwgc291cmNlSW5mb3JtYXRpb24pKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CgogICAgSEluc3RydWN0aW9uIHJlY2VpdmVyID0gYXJndW1lbnRzLmZpcnN0OwogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cyA9IDxISW5zdHJ1Y3Rpb24+W107CgogICAgc2VsZWN0b3IgPz89IF9lbGVtZW50TWFwLmdldFNlbGVjdG9yKG5vZGUpOwoKICAgIGJvb2wgaXNJbnRlcmNlcHRlZCA9CiAgICAgICAgY2xvc2VkV29ybGQuaW50ZXJjZXB0b3JEYXRhLmlzSW50ZXJjZXB0ZWRTZWxlY3RvcihzZWxlY3Rvcik7CgogICAgaWYgKGlzSW50ZXJjZXB0ZWQpIHsKICAgICAgSEludGVyY2VwdG9yIGludGVyY2VwdG9yID0gX2ludGVyY2VwdG9yRm9yKHJlY2VpdmVyLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIGlucHV0cy5hZGQoaW50ZXJjZXB0b3IpOwogICAgfQogICAgaW5wdXRzLmFkZEFsbChhcmd1bWVudHMpOwoKICAgIEFic3RyYWN0VmFsdWUgdHlwZSA9IF90eXBlSW5mZXJlbmNlTWFwLnNlbGVjdG9yVHlwZU9mKHNlbGVjdG9yLCBtYXNrKTsKICAgIGlmIChzZWxlY3Rvci5pc0dldHRlcikgewogICAgICBwdXNoKG5ldyBISW52b2tlRHluYW1pY0dldHRlcihzZWxlY3RvciwgbWFzaywgZWxlbWVudCwgaW5wdXRzLAogICAgICAgICAgaXNJbnRlcmNlcHRlZCwgdHlwZSwgc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaXNTZXR0ZXIpIHsKICAgICAgcHVzaChuZXcgSEludm9rZUR5bmFtaWNTZXR0ZXIoc2VsZWN0b3IsIG1hc2ssIGVsZW1lbnQsIGlucHV0cywKICAgICAgICAgIGlzSW50ZXJjZXB0ZWQsIHR5cGUsIHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmlzQ2xvc3VyZUNhbGwpIHsKICAgICAgYXNzZXJ0KCFpc0ludGVyY2VwdGVkKTsKICAgICAgcHVzaChuZXcgSEludm9rZUNsb3N1cmUoc2VsZWN0b3IsIGlucHV0cywgdHlwZSwgdHlwZUFyZ3VtZW50cykKICAgICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChuZXcgSEludm9rZUR5bmFtaWNNZXRob2QoCiAgICAgICAgICBzZWxlY3RvciwgbWFzaywgaW5wdXRzLCB0eXBlLCB0eXBlQXJndW1lbnRzLCBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgICAgIGlzSW50ZXJjZXB0ZWQ6IGlzSW50ZXJjZXB0ZWQpKTsKICAgIH0KICB9CgogIEhGb3JlaWduQ29kZSBfaW52b2tlSnNJbnRlcm9wRnVuY3Rpb24oCiAgICAgIEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQsIExpc3Q8SEluc3RydWN0aW9uPiBhcmd1bWVudHMpIHsKICAgIGFzc2VydChjbG9zZWRXb3JsZC5uYXRpdmVEYXRhLmlzSnNJbnRlcm9wTWVtYmVyKGVsZW1lbnQpKTsKICAgIG5hdGl2ZUVtaXR0ZXIubmF0aXZlTWV0aG9kcy5hZGQoZWxlbWVudCk7CgogICAgaWYgKGVsZW1lbnQgaXMgQ29uc3RydWN0b3JFbnRpdHkgJiYKICAgICAgICBlbGVtZW50LmlzRmFjdG9yeUNvbnN0cnVjdG9yICYmCiAgICAgICAgbmF0aXZlRGF0YS5pc0Fub255bW91c0pzSW50ZXJvcENsYXNzKGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MpKSB7CiAgICAgIC8vIEZhY3RvcnkgY29uc3RydWN0b3IgdGhhdCBpcyBzeW50YWN0aWMgc3VnYXIgZm9yIGNyZWF0aW5nIGEgSmF2YVNjcmlwdAogICAgICAvLyBvYmplY3QgbGl0ZXJhbC4KICAgICAgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IgPSBlbGVtZW50OwogICAgICBpbnQgaSA9IDA7CiAgICAgIGludCBwb3NpdGlvbnMgPSAwOwogICAgICB2YXIgZmlsdGVyZWRBcmd1bWVudHMgPSA8SEluc3RydWN0aW9uPltdOwogICAgICB2YXIgcGFyYW1ldGVyTmFtZU1hcCA9IG5ldyBNYXA8U3RyaW5nLCBqcy5FeHByZXNzaW9uPigpOwoKICAgICAgLy8gTm90ZTogd2UgZG9uJ3QgdXNlIGBjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJTdHJ1Y3R1cmVgIGhlcmUgYmVjYXVzZQogICAgICAvLyB3ZSBkb24ndCBlbGlkZSBwYXJhbWV0ZXJzIHRvIGpzLWludGVyb3AgZXh0ZXJuYWwgc3RhdGljIHRhcmdldHMKICAgICAgLy8gKGluY2x1ZGluZyBmYWN0b3J5IGNvbnN0cnVjdG9ycy4pCiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IGNhbiB3ZSBlbGlkZSB0aG9zZSBwYXJhbWV0ZXJzPyBUaGlzIHNob3VsZCBiZQogICAgICAvLyBjb25zaXN0ZW50IHdpdGggd2hhdCB3ZSBkbyB3aXRoIGluc3RhbmNlIG1ldGhvZHMuCiAgICAgIGlyLlByb2NlZHVyZSBub2RlID0gX2VsZW1lbnRNYXAuZ2V0TWVtYmVyRGVmaW5pdGlvbihjb25zdHJ1Y3Rvcikubm9kZTsKICAgICAgTGlzdDxpci5WYXJpYWJsZURlY2xhcmF0aW9uPiBuYW1lZFBhcmFtZXRlcnMgPQogICAgICAgICAgbm9kZS5mdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMudG9MaXN0KCk7CiAgICAgIG5hbWVkUGFyYW1ldGVycy5zb3J0KG5hdGl2ZU9yZGVyaW5nKTsKICAgICAgZm9yIChpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlIGluIG5hbWVkUGFyYW1ldGVycykgewogICAgICAgIFN0cmluZyBwYXJhbWV0ZXJOYW1lID0gdmFyaWFibGUubmFtZTsKICAgICAgICAvLyBUT0RPKGphY29icik6IGNvbnNpZGVyIHRocm93aW5nIGlmIHBhcmFtZXRlciBuYW1lcyBkbyBub3QgbWF0Y2gKICAgICAgICAvLyBuYW1lcyBvZiBwcm9wZXJ0aWVzIGluIHRoZSBjbGFzcy4KICAgICAgICBISW5zdHJ1Y3Rpb24gYXJndW1lbnQgPSBhcmd1bWVudHNbaV07CiAgICAgICAgaWYgKGFyZ3VtZW50ICE9IG51bGwpIHsKICAgICAgICAgIGZpbHRlcmVkQXJndW1lbnRzLmFkZChhcmd1bWVudCk7CiAgICAgICAgICB2YXIganNOYW1lID0gbmF0aXZlRGF0YS5jb21wdXRlVW5lc2NhcGVkSlNJbnRlcm9wTmFtZShwYXJhbWV0ZXJOYW1lKTsKICAgICAgICAgIHBhcmFtZXRlck5hbWVNYXBbanNOYW1lXSA9IG5ldyBqcy5JbnRlcnBvbGF0ZWRFeHByZXNzaW9uKHBvc2l0aW9ucysrKTsKICAgICAgICB9CiAgICAgICAgaSsrOwogICAgICB9CiAgICAgIHZhciBjb2RlVGVtcGxhdGUgPQogICAgICAgICAgbmV3IGpzLlRlbXBsYXRlKG51bGwsIGpzLm9iamVjdExpdGVyYWwocGFyYW1ldGVyTmFtZU1hcCkpOwoKICAgICAgdmFyIG5hdGl2ZUJlaGF2aW9yID0gbmV3IE5hdGl2ZUJlaGF2aW9yKCkuLmNvZGVUZW1wbGF0ZSA9IGNvZGVUZW1wbGF0ZTsKICAgICAgaWYgKG9wdGlvbnMudHJ1c3RKU0ludGVyb3BUeXBlQW5ub3RhdGlvbnMpIHsKICAgICAgICBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlID0gX2VsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50CiAgICAgICAgICAgIC5nZXRUaGlzVHlwZShjb25zdHJ1Y3Rvci5lbmNsb3NpbmdDbGFzcyk7CiAgICAgICAgbmF0aXZlQmVoYXZpb3IudHlwZXNSZXR1cm5lZC5hZGQodGhpc1R5cGUpOwogICAgICB9CiAgICAgIC8vIFRPRE8oZWZvcnR1bmEpOiBTb3VyY2UgaW5mb3JtYXRpb24uCiAgICAgIHJldHVybiBuZXcgSEZvcmVpZ25Db2RlKAogICAgICAgICAgY29kZVRlbXBsYXRlLCBhYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlLCBmaWx0ZXJlZEFyZ3VtZW50cywKICAgICAgICAgIG5hdGl2ZUJlaGF2aW9yOiBuYXRpdmVCZWhhdmlvcik7CiAgICB9CgogICAgdmFyIHRhcmdldCA9IG5ldyBIRm9yZWlnbkNvZGUoCiAgICAgICAganMuanMucGFyc2VGb3JlaWduSlMoIiR7bmF0aXZlRGF0YS5nZXRGaXhlZEJhY2tlbmRNZXRob2RQYXRoKGVsZW1lbnQpfS4iCiAgICAgICAgICAgICIke25hdGl2ZURhdGEuZ2V0Rml4ZWRCYWNrZW5kTmFtZShlbGVtZW50KX0iKSwKICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlLAogICAgICAgIDxISW5zdHJ1Y3Rpb24+W10pOwogICAgYWRkKHRhcmdldCk7CiAgICAvLyBTdHJpcCBvZmYgdHJhaWxpbmcgYXJndW1lbnRzIHRoYXQgd2VyZSBub3Qgc3BlY2lmaWVkLgogICAgLy8gd2UgY291bGQgYXNzZXJ0IHRoYXQgdGhlIHRyYWlsaW5nIGFyZ3VtZW50cyBhcmUgYWxsIG51bGwuCiAgICAvLyBUT0RPKGphY29icik6IHJld3JpdGUgbmFtZWQgYXJndW1lbnRzIHRvIGFuIG9iamVjdCBsaXRlcmFsIG1hdGNoaW5nCiAgICAvLyB0aGUgZmFjdG9yeSBjb25zdHJ1Y3RvciBjYXNlLgogICAgYXJndW1lbnRzID0gYXJndW1lbnRzLndoZXJlKChhcmcpID0+IGFyZyAhPSBudWxsKS50b0xpc3QoKTsKICAgIHZhciBpbnB1dHMgPSA8SEluc3RydWN0aW9uPlt0YXJnZXRdLi5hZGRBbGwoYXJndW1lbnRzKTsKCiAgICB2YXIgbmF0aXZlQmVoYXZpb3IgPSBuZXcgTmF0aXZlQmVoYXZpb3IoKS4uc2lkZUVmZmVjdHMuc2V0QWxsU2lkZUVmZmVjdHMoKTsKCiAgICBEYXJ0VHlwZSB0eXBlID0gZWxlbWVudCBpcyBDb25zdHJ1Y3RvckVudGl0eQogICAgICAgID8gX2VsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50LmdldFRoaXNUeXBlKGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MpCiAgICAgICAgOiBfZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQuZ2V0RnVuY3Rpb25UeXBlKGVsZW1lbnQpLnJldHVyblR5cGU7CiAgICAvLyBOYXRpdmUgYmVoYXZpb3IgZWZmZWN0cyBoZXJlIGFyZSBzaW1pbGFyIHRvIG5hdGl2ZS9iZWhhdmlvci5kYXJ0LgogICAgLy8gVGhlIHJldHVybiB0eXBlIGlzIGR5bmFtaWMgaWYgd2UgZG9uJ3QgdHJ1c3QganMtaW50ZXJvcCB0eXBlCiAgICAvLyBkZWNsYXJhdGlvbnMuCiAgICBuYXRpdmVCZWhhdmlvci50eXBlc1JldHVybmVkLmFkZCgKICAgICAgICBvcHRpb25zLnRydXN0SlNJbnRlcm9wVHlwZUFubm90YXRpb25zID8gdHlwZSA6IGNvbnN0IER5bmFtaWNUeXBlKCkpOwoKICAgIC8vIFRoZSBhbGxvY2F0aW9uIGVmZmVjdHMgaW5jbHVkZSB0aGUgZGVjbGFyZWQgdHlwZSBpZiBpdCBpcyBuYXRpdmUgKHdoaWNoCiAgICAvLyBpbmNsdWRlcyBqcyBpbnRlcm9wIHR5cGVzKS4KICAgIGlmICh0eXBlIGlzIEludGVyZmFjZVR5cGUgJiYgbmF0aXZlRGF0YS5pc05hdGl2ZUNsYXNzKHR5cGUuZWxlbWVudCkpIHsKICAgICAgbmF0aXZlQmVoYXZpb3IudHlwZXNJbnN0YW50aWF0ZWQuYWRkKHR5cGUpOwogICAgfQoKICAgIC8vIEl0IGFsc28gaW5jbHVkZXMgYW55IG90aGVyIEpTIGludGVyb3AgdHlwZSBpZiB3ZSBkb24ndCB0cnVzdCB0aGUKICAgIC8vIGFubm90YXRpb24gb3IgaWYgaXMgZGVjbGFyZWQgdG9vIGJyb2FkLgogICAgaWYgKCFvcHRpb25zLnRydXN0SlNJbnRlcm9wVHlwZUFubm90YXRpb25zIHx8CiAgICAgICAgdHlwZSA9PSBjb21tb25FbGVtZW50cy5vYmplY3RUeXBlIHx8CiAgICAgICAgdHlwZSBpcyBEeW5hbWljVHlwZSkgewogICAgICBuYXRpdmVCZWhhdmlvci50eXBlc0luc3RhbnRpYXRlZC5hZGQoX2VsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50CiAgICAgICAgICAuZ2V0VGhpc1R5cGUoY29tbW9uRWxlbWVudHMuanNKYXZhU2NyaXB0T2JqZWN0Q2xhc3MpKTsKICAgIH0KCiAgICBTdHJpbmcgdGVtcGxhdGU7CiAgICBpZiAoZWxlbWVudC5pc0dldHRlcikgewogICAgICB0ZW1wbGF0ZSA9ICcjJzsKICAgIH0gZWxzZSBpZiAoZWxlbWVudC5pc1NldHRlcikgewogICAgICB0ZW1wbGF0ZSA9ICcjID0gIyc7CiAgICB9IGVsc2UgewogICAgICB2YXIgYXJncyA9IG5ldyBMaXN0LmZpbGxlZChhcmd1bWVudHMubGVuZ3RoLCAnIycpLmpvaW4oJywnKTsKICAgICAgdGVtcGxhdGUgPSBlbGVtZW50LmlzQ29uc3RydWN0b3IgPyAibmV3ICMoJGFyZ3MpIiA6ICIjKCRhcmdzKSI7CiAgICB9CiAgICBqcy5UZW1wbGF0ZSBjb2RlVGVtcGxhdGUgPSBqcy5qcy5wYXJzZUZvcmVpZ25KUyh0ZW1wbGF0ZSk7CiAgICBuYXRpdmVCZWhhdmlvci5jb2RlVGVtcGxhdGUgPSBjb2RlVGVtcGxhdGU7CgogICAgLy8gVE9ETyhlZm9ydHVuYSk6IEFkZCBzb3VyY2UgaW5mb3JtYXRpb24uCiAgICByZXR1cm4gbmV3IEhGb3JlaWduQ29kZSgKICAgICAgICBjb2RlVGVtcGxhdGUsIGFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUsIGlucHV0cywKICAgICAgICBuYXRpdmVCZWhhdmlvcjogbmF0aXZlQmVoYXZpb3IpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGdW5jdGlvbk5vZGUoaXIuRnVuY3Rpb25Ob2RlIG5vZGUpIHsKICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0KICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkQ3JlYXRlKG5vZGUpOwogICAgQ2xvc3VyZVJlcHJlc2VudGF0aW9uSW5mbyBjbG9zdXJlSW5mbyA9CiAgICAgICAgY2xvc3VyZURhdGFMb29rdXAuZ2V0Q2xvc3VyZUluZm8obm9kZS5wYXJlbnQpOwogICAgQ2xhc3NFbnRpdHkgY2xvc3VyZUNsYXNzRW50aXR5ID0gY2xvc3VyZUluZm8uY2xvc3VyZUNsYXNzRW50aXR5OwoKICAgIExpc3Q8SEluc3RydWN0aW9uPiBjYXB0dXJlZFZhcmlhYmxlcyA9IDxISW5zdHJ1Y3Rpb24+W107CiAgICBfd29ybGRCdWlsZGVyLmZvckVhY2hJbnN0YW5jZUZpZWxkKGNsb3N1cmVDbGFzc0VudGl0eSwKICAgICAgICAoXywgRmllbGRFbnRpdHkgZmllbGQsIHtib29sIGlzRWxpZGVkfSkgewogICAgICBpZiAoaXNFbGlkZWQpIHJldHVybjsKICAgICAgY2FwdHVyZWRWYXJpYWJsZXMKICAgICAgICAgIC5hZGQobG9jYWxzSGFuZGxlci5yZWFkTG9jYWwoY2xvc3VyZUluZm8uZ2V0TG9jYWxGb3JGaWVsZChmaWVsZCkpKTsKICAgIH0pOwoKICAgIEFic3RyYWN0VmFsdWUgdHlwZSA9CiAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5jcmVhdGVOb25OdWxsRXhhY3QoY2xvc3VyZUNsYXNzRW50aXR5KTsKICAgIC8vIFRPRE8oZWZvcnR1bmEpOiBBZGQgc291cmNlIGluZm9ybWF0aW9uIGhlcmUuCiAgICBwdXNoKG5ldyBIQ3JlYXRlKAogICAgICAgIGNsb3N1cmVDbGFzc0VudGl0eSwgY2FwdHVyZWRWYXJpYWJsZXMsIHR5cGUsIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICAgIGNhbGxNZXRob2Q6IGNsb3N1cmVJbmZvLmNhbGxNZXRob2QpKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihpci5GdW5jdGlvbkRlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CiAgICBhc3NlcnQoaXNSZWFjaGFibGUpOwogICAgZGVjbGFyYXRpb24uZnVuY3Rpb24uYWNjZXB0KHRoaXMpOwogICAgTG9jYWwgbG9jYWwgPSBsb2NhbHNNYXAuZ2V0TG9jYWxWYXJpYWJsZShkZWNsYXJhdGlvbi52YXJpYWJsZSk7CiAgICBsb2NhbHNIYW5kbGVyLnVwZGF0ZUxvY2FsKGxvY2FsLCBwb3AoKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKGlyLkZ1bmN0aW9uRXhwcmVzc2lvbiBmdW5jRXhwcmVzc2lvbikgewogICAgZnVuY0V4cHJlc3Npb24uZnVuY3Rpb24uYWNjZXB0KHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEluc3RhbnRpYXRpb24oaXIuSW5zdGFudGlhdGlvbiBub2RlKSB7CiAgICB2YXIgYXJndW1lbnRzID0gPEhJbnN0cnVjdGlvbj5bXTsKICAgIG5vZGUuZXhwcmVzc2lvbi5hY2NlcHQodGhpcyk7CiAgICBhcmd1bWVudHMuYWRkKHBvcCgpKTsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSB0aGUgc3RhdGljIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24uCiAgICBib29sIHR5cGVBcmd1bWVudHNOZWVkZWQgPSBydGlOZWVkLmluc3RhbnRpYXRpb25OZWVkc1R5cGVBcmd1bWVudHMoCiAgICAgICAgbnVsbCwgbm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0gbm9kZS50eXBlQXJndW1lbnRzCiAgICAgICAgLm1hcCgodHlwZSkgPT4gdHlwZUFyZ3VtZW50c05lZWRlZAogICAgICAgICAgICA/IF9lbGVtZW50TWFwLmdldERhcnRUeXBlKHR5cGUpCiAgICAgICAgICAgIDogX2NvbW1vbkVsZW1lbnRzLmR5bmFtaWNUeXBlKQogICAgICAgIC50b0xpc3QoKTsKICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyR2VuZXJpY0luc3RhbnRpYXRpb24oCiAgICAgICAgbmV3IEdlbmVyaWNJbnN0YW50aWF0aW9uKG51bGwsIHR5cGVBcmd1bWVudHMpKTsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENhbiB3ZSBhdm9pZCBjcmVhdGluZyB0aGUgaW5zdGFudGlhdGlvbiBvYmplY3Q/CiAgICBmb3IgKERhcnRUeXBlIHR5cGUgaW4gdHlwZUFyZ3VtZW50cykgewogICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPQogICAgICAgICAgdHlwZUJ1aWxkZXIuYW5hbHl6ZVR5cGVBcmd1bWVudCh0eXBlLCBzb3VyY2VFbGVtZW50KTsKICAgICAgYXJndW1lbnRzLmFkZChpbnN0cnVjdGlvbik7CiAgICB9CiAgICBpbnQgdHlwZUFyZ3VtZW50Q291bnQgPSBub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoOwogICAgYm9vbCB0YXJnZXRDYW5UaHJvdyA9IGZhbHNlOyAvLyBUT0RPKHNyYSk6IElzIHRoaXMgdHJ1ZT8KICAgIEZ1bmN0aW9uRW50aXR5IHRhcmdldCA9CiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmdldEluc3RhbnRpYXRlRnVuY3Rpb24odHlwZUFyZ3VtZW50Q291bnQpOwogICAgaWYgKHRhcmdldCA9PSBudWxsKSB7CiAgICAgIHJlcG9ydGVyLmludGVybmFsRXJyb3IoCiAgICAgICAgICBfZWxlbWVudE1hcC5nZXRTcGFubmFibGUodGFyZ2V0RWxlbWVudCwgbm9kZSksCiAgICAgICAgICAnR2VuZXJpYyBmdW5jdGlvbiBpbnN0YW50aWF0aW9uIG5vdCBpbXBsZW1lbnRlZCBmb3IgJwogICAgICAgICAgJyR7dHlwZUFyZ3VtZW50Q291bnR9IHR5cGUgYXJndW1lbnRzJyk7CiAgICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudE51bGwoY2xvc2VkV29ybGQpKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gbmV3IEhJbnZva2VTdGF0aWMoCiAgICAgICAgdGFyZ2V0LCBhcmd1bWVudHMsIGFic3RyYWN0VmFsdWVEb21haW4uZnVuY3Rpb25UeXBlLCA8RGFydFR5cGU+W10sCiAgICAgICAgdGFyZ2V0Q2FuVGhyb3c6IHRhcmdldENhblRocm93KTsKICAgIC8vIFRPRE8oc3JhKTogLi5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uCiAgICBpbnN0cnVjdGlvbi5zaWRlRWZmZWN0cwogICAgICAuLmNsZWFyQWxsRGVwZW5kZW5jaWVzKCkKICAgICAgLi5jbGVhckFsbFNpZGVFZmZlY3RzKCk7CgogICAgcHVzaChpbnN0cnVjdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TWV0aG9kSW52b2NhdGlvbihpci5NZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIG5vZGUucmVjZWl2ZXIuYWNjZXB0KHRoaXMpOwogICAgSEluc3RydWN0aW9uIHJlY2VpdmVyID0gcG9wKCk7CiAgICBTZWxlY3RvciBzZWxlY3RvciA9IF9lbGVtZW50TWFwLmdldFNlbGVjdG9yKG5vZGUpOwogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9IDxEYXJ0VHlwZT5bXTsKICAgIHNlbGVjdG9yID0KICAgICAgICBfZmlsbER5bmFtaWNUeXBlQXJndW1lbnRzKHNlbGVjdG9yLCBub2RlLmFyZ3VtZW50cywgdHlwZUFyZ3VtZW50cyk7CiAgICBfcHVzaER5bmFtaWNJbnZvY2F0aW9uKAogICAgICAgIG5vZGUsCiAgICAgICAgX3R5cGVJbmZlcmVuY2VNYXAucmVjZWl2ZXJUeXBlT2ZJbnZvY2F0aW9uKG5vZGUsIGFic3RyYWN0VmFsdWVEb21haW4pLAogICAgICAgIHNlbGVjdG9yLAogICAgICAgIDxISW5zdHJ1Y3Rpb24+W3JlY2VpdmVyXS4uYWRkQWxsKF92aXNpdEFyZ3VtZW50c0ZvckR5bmFtaWNUYXJnZXQoCiAgICAgICAgICAgIHNlbGVjdG9yLCBub2RlLmFyZ3VtZW50cywgdHlwZUFyZ3VtZW50cykpLAogICAgICAgIHR5cGVBcmd1bWVudHMsCiAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZENhbGwobm9kZS5yZWNlaXZlciwgbm9kZSkpOwogIH0KCiAgSEludGVyY2VwdG9yIF9pbnRlcmNlcHRvckZvcigKICAgICAgSEluc3RydWN0aW9uIGludGVyY2VwdGVkLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgSEludGVyY2VwdG9yIGludGVyY2VwdG9yID0KICAgICAgICBuZXcgSEludGVyY2VwdG9yKGludGVyY2VwdGVkLCBhYnN0cmFjdFZhbHVlRG9tYWluLm5vbk51bGxUeXBlKQogICAgICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogICAgYWRkKGludGVyY2VwdG9yKTsKICAgIHJldHVybiBpbnRlcmNlcHRvcjsKICB9CgogIHN0YXRpYyBpci5DbGFzcyBfY29udGFpbmluZ0NsYXNzKGlyLlRyZWVOb2RlIG5vZGUpIHsKICAgIHdoaWxlIChub2RlICE9IG51bGwpIHsKICAgICAgaWYgKG5vZGUgaXMgaXIuQ2xhc3MpIHJldHVybiBub2RlOwogICAgICBub2RlID0gbm9kZS5wYXJlbnQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgX2dlbmVyYXRlU3VwZXJOb1N1Y2hNZXRob2QoCiAgICAgIGlyLkV4cHJlc3Npb24gaW52b2NhdGlvbiwKICAgICAgU3RyaW5nIHB1YmxpY05hbWUsCiAgICAgIExpc3Q8SEluc3RydWN0aW9uPiBhcmd1bWVudHMsCiAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBTZWxlY3RvciBzZWxlY3RvciA9IF9lbGVtZW50TWFwLmdldFNlbGVjdG9yKGludm9jYXRpb24pOwogICAgQ2xhc3NFbnRpdHkgY29udGFpbmluZ0NsYXNzID0KICAgICAgICBfZWxlbWVudE1hcC5nZXRDbGFzcyhfY29udGFpbmluZ0NsYXNzKGludm9jYXRpb24pKTsKICAgIEZ1bmN0aW9uRW50aXR5IG5vU3VjaE1ldGhvZCA9CiAgICAgICAgX2VsZW1lbnRNYXAuZ2V0U3VwZXJOb1N1Y2hNZXRob2QoY29udGFpbmluZ0NsYXNzKTsKCiAgICBDb25zdGFudFZhbHVlIG5hbWVDb25zdGFudCA9IGNvbnN0YW50X3N5c3RlbS5jcmVhdGVTdHJpbmcocHVibGljTmFtZSk7CgogICAganMuTmFtZSBpbnRlcm5hbE5hbWUgPSBuYW1lci5pbnZvY2F0aW9uTmFtZShzZWxlY3Rvcik7CgogICAgdmFyIGFyZ3VtZW50c0luc3RydWN0aW9uID0gYnVpbGRMaXRlcmFsTGlzdChhcmd1bWVudHMpOwogICAgYWRkKGFyZ3VtZW50c0luc3RydWN0aW9uKTsKCiAgICB2YXIgYXJndW1lbnROYW1lcyA9IG5ldyBMaXN0PEhJbnN0cnVjdGlvbj4oKTsKICAgIGZvciAoU3RyaW5nIGFyZ3VtZW50TmFtZSBpbiBzZWxlY3Rvci5uYW1lZEFyZ3VtZW50cykgewogICAgICBDb25zdGFudFZhbHVlIGFyZ3VtZW50TmFtZUNvbnN0YW50ID0KICAgICAgICAgIGNvbnN0YW50X3N5c3RlbS5jcmVhdGVTdHJpbmcoYXJndW1lbnROYW1lKTsKICAgICAgYXJndW1lbnROYW1lcy5hZGQoZ3JhcGguYWRkQ29uc3RhbnQoYXJndW1lbnROYW1lQ29uc3RhbnQsIGNsb3NlZFdvcmxkKSk7CiAgICB9CiAgICB2YXIgYXJndW1lbnROYW1lc0luc3RydWN0aW9uID0gYnVpbGRMaXRlcmFsTGlzdChhcmd1bWVudE5hbWVzKTsKICAgIGFkZChhcmd1bWVudE5hbWVzSW5zdHJ1Y3Rpb24pOwoKICAgIENvbnN0YW50VmFsdWUga2luZENvbnN0YW50ID0KICAgICAgICBjb25zdGFudF9zeXN0ZW0uY3JlYXRlSW50RnJvbUludChzZWxlY3Rvci5pbnZvY2F0aW9uTWlycm9yS2luZCk7CgogICAgX3B1c2hTdGF0aWNJbnZvY2F0aW9uKAogICAgICAgIF9jb21tb25FbGVtZW50cy5jcmVhdGVJbnZvY2F0aW9uTWlycm9yLAogICAgICAgIFsKICAgICAgICAgIGdyYXBoLmFkZENvbnN0YW50KG5hbWVDb25zdGFudCwgY2xvc2VkV29ybGQpLAogICAgICAgICAgZ3JhcGguYWRkQ29uc3RhbnRTdHJpbmdGcm9tTmFtZShpbnRlcm5hbE5hbWUsIGNsb3NlZFdvcmxkKSwKICAgICAgICAgIGdyYXBoLmFkZENvbnN0YW50KGtpbmRDb25zdGFudCwgY2xvc2VkV29ybGQpLAogICAgICAgICAgYXJndW1lbnRzSW5zdHJ1Y3Rpb24sCiAgICAgICAgICBhcmd1bWVudE5hbWVzSW5zdHJ1Y3Rpb24sCiAgICAgICAgICBncmFwaC5hZGRDb25zdGFudEludCh0eXBlQXJndW1lbnRzLmxlbmd0aCwgY2xvc2VkV29ybGQpLAogICAgICAgIF0sCiAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSwKICAgICAgICB0eXBlQXJndW1lbnRzLAogICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbik7CgogICAgX2J1aWxkSW52b2tlU3VwZXIoU2VsZWN0b3JzLm5vU3VjaE1ldGhvZF8sIGNvbnRhaW5pbmdDbGFzcywgbm9TdWNoTWV0aG9kLAogICAgICAgIDxISW5zdHJ1Y3Rpb24+W3BvcCgpXSwgdHlwZUFyZ3VtZW50cywgc291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgSEluc3RydWN0aW9uIF9idWlsZEludm9rZVN1cGVyKAogICAgICBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQ2xhc3NFbnRpdHkgY29udGFpbmluZ0NsYXNzLAogICAgICBNZW1iZXJFbnRpdHkgdGFyZ2V0LAogICAgICBMaXN0PEhJbnN0cnVjdGlvbj4gYXJndW1lbnRzLAogICAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzLAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgSEluc3RydWN0aW9uIHJlY2VpdmVyID0KICAgICAgICBsb2NhbHNIYW5kbGVyLnJlYWRUaGlzKHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbik7CgogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cyA9IDxISW5zdHJ1Y3Rpb24+W107CiAgICBib29sIGlzSW50ZXJjZXB0ZWQgPQogICAgICAgIGNsb3NlZFdvcmxkLmludGVyY2VwdG9yRGF0YS5pc0ludGVyY2VwdGVkU2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgaWYgKGlzSW50ZXJjZXB0ZWQpIHsKICAgICAgaW5wdXRzLmFkZChfaW50ZXJjZXB0b3JGb3IocmVjZWl2ZXIsIHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9CiAgICBpbnB1dHMuYWRkKHJlY2VpdmVyKTsKICAgIGlucHV0cy5hZGRBbGwoYXJndW1lbnRzKTsKCiAgICBBYnN0cmFjdFZhbHVlIHR5cGVNYXNrOwogICAgaWYgKHRhcmdldCBpcyBGdW5jdGlvbkVudGl0eSkgewogICAgICB0eXBlTWFzayA9IF90eXBlSW5mZXJlbmNlTWFwLmdldFJldHVyblR5cGVPZih0YXJnZXQpOwogICAgfSBlbHNlIHsKICAgICAgdHlwZU1hc2sgPSBhYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlOwogICAgfQogICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gbmV3IEhJbnZva2VTdXBlcigKICAgICAgICB0YXJnZXQsCiAgICAgICAgY29udGFpbmluZ0NsYXNzLAogICAgICAgIHNlbGVjdG9yLAogICAgICAgIGlucHV0cywKICAgICAgICBpc0ludGVyY2VwdGVkLAogICAgICAgIHR5cGVNYXNrLAogICAgICAgIHR5cGVBcmd1bWVudHMsCiAgICAgICAgc291cmNlSW5mb3JtYXRpb24sCiAgICAgICAgaXNTZXR0ZXI6IHNlbGVjdG9yLmlzU2V0dGVyIHx8IHNlbGVjdG9yLmlzSW5kZXhTZXQpOwogICAgaW5zdHJ1Y3Rpb24uc2lkZUVmZmVjdHMgPQogICAgICAgIGluZmVycmVkRGF0YS5nZXRTaWRlRWZmZWN0c09mU2VsZWN0b3Ioc2VsZWN0b3IsIG51bGwpOwogICAgcHVzaChpbnN0cnVjdGlvbik7CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb247CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3VwZXJQcm9wZXJ0eUdldChpci5TdXBlclByb3BlcnR5R2V0IG5vZGUpIHsKICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0KICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkR2V0KG5vZGUpOwogICAgTWVtYmVyRW50aXR5IG1lbWJlciA9CiAgICAgICAgX2VsZW1lbnRNYXAuZ2V0U3VwZXJNZW1iZXIoX2N1cnJlbnRGcmFtZS5tZW1iZXIsIG5vZGUubmFtZSk7CiAgICBpZiAobWVtYmVyID09IG51bGwpIHsKICAgICAgX2dlbmVyYXRlU3VwZXJOb1N1Y2hNZXRob2Qobm9kZSwgX2VsZW1lbnRNYXAuZ2V0U2VsZWN0b3Iobm9kZSkubmFtZSwKICAgICAgICAgIGNvbnN0IDxISW5zdHJ1Y3Rpb24+W10sIGNvbnN0IDxEYXJ0VHlwZT5bXSwgc291cmNlSW5mb3JtYXRpb24pOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAobWVtYmVyLmlzRmllbGQpIHsKICAgICAgRmllbGRBbmFseXNpc0RhdGEgZmllbGREYXRhID0gX2ZpZWxkQW5hbHlzaXMuZ2V0RmllbGREYXRhKG1lbWJlcik7CiAgICAgIGlmIChmaWVsZERhdGEuaXNFZmZlY3RpdmVseUNvbnN0YW50KSB7CiAgICAgICAgQ29uc3RhbnRWYWx1ZSB2YWx1ZSA9IGZpZWxkRGF0YS5jb25zdGFudFZhbHVlOwogICAgICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudCh2YWx1ZSwgY2xvc2VkV29ybGQsCiAgICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgX2J1aWxkSW52b2tlU3VwZXIoCiAgICAgICAgX2VsZW1lbnRNYXAuZ2V0U2VsZWN0b3Iobm9kZSksCiAgICAgICAgX2VsZW1lbnRNYXAuZ2V0Q2xhc3MoX2NvbnRhaW5pbmdDbGFzcyhub2RlKSksCiAgICAgICAgbWVtYmVyLAogICAgICAgIGNvbnN0IDxISW5zdHJ1Y3Rpb24+W10sCiAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgIHNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdXBlck1ldGhvZEludm9jYXRpb24oaXIuU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0KICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkQ2FsbChub2RlLCBub2RlKTsKICAgIE1lbWJlckVudGl0eSBtZW1iZXIgPQogICAgICAgIF9lbGVtZW50TWFwLmdldFN1cGVyTWVtYmVyKF9jdXJyZW50RnJhbWUubWVtYmVyLCBub2RlLm5hbWUpOwogICAgaWYgKG1lbWJlciA9PSBudWxsKSB7CiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gX2VsZW1lbnRNYXAuZ2V0U2VsZWN0b3Iobm9kZSk7CiAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPSA8RGFydFR5cGU+W107CiAgICAgIHNlbGVjdG9yID0KICAgICAgICAgIF9maWxsRHluYW1pY1R5cGVBcmd1bWVudHMoc2VsZWN0b3IsIG5vZGUuYXJndW1lbnRzLCB0eXBlQXJndW1lbnRzKTsKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGFyZ3VtZW50cyA9IF92aXNpdEFyZ3VtZW50c0ZvckR5bmFtaWNUYXJnZXQoCiAgICAgICAgICBzZWxlY3Rvciwgbm9kZS5hcmd1bWVudHMsIHR5cGVBcmd1bWVudHMpOwogICAgICBfZ2VuZXJhdGVTdXBlck5vU3VjaE1ldGhvZCgKICAgICAgICAgIG5vZGUsIHNlbGVjdG9yLm5hbWUsIGFyZ3VtZW50cywgdHlwZUFyZ3VtZW50cywgc291cmNlSW5mb3JtYXRpb24pOwogICAgICByZXR1cm47CiAgICB9CiAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0KICAgICAgICBfZ2V0U3RhdGljVHlwZUFyZ3VtZW50cyhtZW1iZXIsIG5vZGUuYXJndW1lbnRzKTsKCiAgICBNZW1iZXJEZWZpbml0aW9uIHRhcmdldERlZmluaXRpb24gPSBfZWxlbWVudE1hcC5nZXRNZW1iZXJEZWZpbml0aW9uKG1lbWJlcik7CiAgICBpci5Qcm9jZWR1cmUgdGFyZ2V0ID0gdGFyZ2V0RGVmaW5pdGlvbi5ub2RlOwogICAgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24gPSBtZW1iZXI7CiAgICBMaXN0PEhJbnN0cnVjdGlvbj4gYXJndW1lbnRzID0gX3Zpc2l0QXJndW1lbnRzRm9yU3RhdGljVGFyZ2V0KAogICAgICAgIHRhcmdldC5mdW5jdGlvbiwKICAgICAgICBmdW5jdGlvbi5wYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgICAgbm9kZS5hcmd1bWVudHMsCiAgICAgICAgdHlwZUFyZ3VtZW50cywKICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBfYnVpbGRJbnZva2VTdXBlcigKICAgICAgICBfZWxlbWVudE1hcC5nZXRTZWxlY3Rvcihub2RlKSwKICAgICAgICBfZWxlbWVudE1hcC5nZXRDbGFzcyhfY29udGFpbmluZ0NsYXNzKG5vZGUpKSwKICAgICAgICBtZW1iZXIsCiAgICAgICAgYXJndW1lbnRzLAogICAgICAgIHR5cGVBcmd1bWVudHMsCiAgICAgICAgc291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgdm9pZCBfYXNzZXJ0SXNUeXBlKEhJbnN0cnVjdGlvbiBzdWJ0eXBlSW5zdHJ1Y3Rpb24sIERhcnRUeXBlIHN1cGVydHlwZSwKICAgICAgU3RyaW5nIHByZWZpeCwgU3RyaW5nIGluZml4LCBTdHJpbmcgc3VmZml4KSB7CiAgICBISW5zdHJ1Y3Rpb24gc3VwZXJ0eXBlSW5zdHJ1Y3Rpb24gPSB0eXBlQnVpbGRlci5hbmFseXplVHlwZUFyZ3VtZW50KAogICAgICAgIGxvY2Fsc0hhbmRsZXIuc3Vic3RJbkNvbnRleHQoc3VwZXJ0eXBlKSwgc291cmNlRWxlbWVudCk7CiAgICBISW5zdHJ1Y3Rpb24gcHJlZml4SW5zdHJ1Y3Rpb24gPQogICAgICAgIGdyYXBoLmFkZENvbnN0YW50U3RyaW5nKHByZWZpeCwgY2xvc2VkV29ybGQpOwogICAgSEluc3RydWN0aW9uIGluZml4SW5zdHJ1Y3Rpb24gPSBncmFwaC5hZGRDb25zdGFudFN0cmluZyhpbmZpeCwgY2xvc2VkV29ybGQpOwogICAgSEluc3RydWN0aW9uIHN1ZmZpeEluc3RydWN0aW9uID0KICAgICAgICBncmFwaC5hZGRDb25zdGFudFN0cmluZyhzdWZmaXgsIGNsb3NlZFdvcmxkKTsKICAgIEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQgPSBjb21tb25FbGVtZW50cy5hc3NlcnRJc1N1YnR5cGU7CiAgICB2YXIgaW5wdXRzID0gPEhJbnN0cnVjdGlvbj5bCiAgICAgIHN1YnR5cGVJbnN0cnVjdGlvbiwKICAgICAgc3VwZXJ0eXBlSW5zdHJ1Y3Rpb24sCiAgICAgIHByZWZpeEluc3RydWN0aW9uLAogICAgICBpbmZpeEluc3RydWN0aW9uLAogICAgICBzdWZmaXhJbnN0cnVjdGlvbgogICAgXTsKICAgIEhJbnN0cnVjdGlvbiBhc3NlcnRJc1N1YnR5cGUgPSBuZXcgSEludm9rZVN0YXRpYyhlbGVtZW50LCBpbnB1dHMsCiAgICAgICAgc3VidHlwZUluc3RydWN0aW9uLmluc3RydWN0aW9uVHlwZSwgY29uc3QgPERhcnRUeXBlPltdKTsKICAgIGFkZChhc3NlcnRJc1N1YnR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihpci5Db25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewogICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPQogICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGROZXcobm9kZSk7CiAgICBpci5Db25zdHJ1Y3RvciB0YXJnZXQgPSBub2RlLnRhcmdldDsKICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IF9lbGVtZW50TWFwLmdldENvbnN0YW50VmFsdWUobm9kZSk7CiAgICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudChjb25zdGFudCwgY2xvc2VkV29ybGQsCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yID0gX2VsZW1lbnRNYXAuZ2V0Q29uc3RydWN0b3IodGFyZ2V0KTsKICAgIENsYXNzRW50aXR5IGNscyA9IGNvbnN0cnVjdG9yLmVuY2xvc2luZ0NsYXNzOwogICAgQWJzdHJhY3RWYWx1ZSB0eXBlTWFzayA9IGFic3RyYWN0VmFsdWVEb21haW4uY3JlYXRlTm9uTnVsbEV4YWN0KGNscyk7CiAgICBJbnRlcmZhY2VUeXBlIGluc3RhbmNlVHlwZSA9IF9lbGVtZW50TWFwLmNyZWF0ZUludGVyZmFjZVR5cGUoCiAgICAgICAgdGFyZ2V0LmVuY2xvc2luZ0NsYXNzLCBub2RlLmFyZ3VtZW50cy50eXBlcyk7CiAgICBpbnN0YW5jZVR5cGUgPSBsb2NhbHNIYW5kbGVyLnN1YnN0SW5Db250ZXh0KGluc3RhbmNlVHlwZSk7CgogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGFyZ3VtZW50cyA9IDxISW5zdHJ1Y3Rpb24+W107CiAgICBpZiAoY29uc3RydWN0b3IuaXNHZW5lcmF0aXZlQ29uc3RydWN0b3IgJiYKICAgICAgICBuYXRpdmVEYXRhLmlzTmF0aXZlT3JFeHRlbmRzTmF0aXZlKGNvbnN0cnVjdG9yLmVuY2xvc2luZ0NsYXNzKSAmJgogICAgICAgICFuYXRpdmVEYXRhLmlzSnNJbnRlcm9wTWVtYmVyKGNvbnN0cnVjdG9yKSkgewogICAgICAvLyBOYXRpdmUgY2xhc3MgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvcnMgdGFrZSBhIHByZS1jb25zdHJ1Y3RlZCBvYmplY3QuCiAgICAgIGFyZ3VtZW50cy5hZGQoZ3JhcGguYWRkQ29uc3RhbnROdWxsKGNsb3NlZFdvcmxkKSk7CiAgICB9CiAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0KICAgICAgICBfZ2V0Q29uc3RydWN0b3JUeXBlQXJndW1lbnRzKGNvbnN0cnVjdG9yLCBub2RlLmFyZ3VtZW50cyk7CiAgICBhcmd1bWVudHMuYWRkQWxsKGNsb3NlZFdvcmxkLm5hdGl2ZURhdGEuaXNKc0ludGVyb3BNZW1iZXIoY29uc3RydWN0b3IpCiAgICAgICAgPyBfdmlzaXRBcmd1bWVudHNGb3JOYXRpdmVTdGF0aWNUYXJnZXQodGFyZ2V0LmZ1bmN0aW9uLCBub2RlLmFyZ3VtZW50cykKICAgICAgICA6IF92aXNpdEFyZ3VtZW50c0ZvclN0YXRpY1RhcmdldCgKICAgICAgICAgICAgdGFyZ2V0LmZ1bmN0aW9uLAogICAgICAgICAgICBjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgICAgICAgIG5vZGUuYXJndW1lbnRzLAogICAgICAgICAgICB0eXBlQXJndW1lbnRzLAogICAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgaWYgKGNvbW1vbkVsZW1lbnRzLmlzU3ltYm9sQ29uc3RydWN0b3IoY29uc3RydWN0b3IpKSB7CiAgICAgIGNvbnN0cnVjdG9yID0gY29tbW9uRWxlbWVudHMuc3ltYm9sVmFsaWRhdGVkQ29uc3RydWN0b3I7CiAgICB9CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhpcyB3aGVuIHR5cGUgYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8KICAgIC8vIGNvbnN0cnVjdG9ycyBsaWtlIGNhbGxpbmcgYSBnZW5lcmljIG1ldGhvZC4KICAgIF9hZGRUeXBlQXJndW1lbnRzKGFyZ3VtZW50cywgX2dldENsYXNzVHlwZUFyZ3VtZW50cyhjbHMsIG5vZGUuYXJndW1lbnRzKSwKICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBhZGRJbXBsaWNpdEluc3RhbnRpYXRpb24oaW5zdGFuY2VUeXBlKTsKICAgIF9wdXNoU3RhdGljSW52b2NhdGlvbihjb25zdHJ1Y3RvciwgYXJndW1lbnRzLCB0eXBlTWFzaywgdHlwZUFyZ3VtZW50cywKICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24sIGluc3RhbmNlVHlwZTogaW5zdGFuY2VUeXBlKTsKICAgIHJlbW92ZUltcGxpY2l0SW5zdGFudGlhdGlvbihpbnN0YW5jZVR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdElzRXhwcmVzc2lvbihpci5Jc0V4cHJlc3Npb24gbm9kZSkgewogICAgbm9kZS5vcGVyYW5kLmFjY2VwdCh0aGlzKTsKICAgIEhJbnN0cnVjdGlvbiBleHByZXNzaW9uID0gcG9wKCk7CiAgICBwdXNoSXNUZXN0KG5vZGUudHlwZSwgZXhwcmVzc2lvbiwgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZElzKG5vZGUpKTsKICB9CgogIHZvaWQgcHVzaElzVGVzdChpci5EYXJ0VHlwZSB0eXBlLCBISW5zdHJ1Y3Rpb24gZXhwcmVzc2lvbiwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIC8vIE5vdGU6IFRoZSBjYWxsIHRvICJ1bmFsaWFzIiB0aGlzIHR5cGUgbGlrZSBpbiB0aGUgb3JpZ2luYWwgU1NBIGJ1aWxkZXIgaXMKICAgIC8vIHVubmVjZXNzYXJ5IGluIGtlcm5lbCBiZWNhdXNlIEtlcm5lbCBoYXMgbm8gbm90aW9uIG9mIHR5cGVkZWYuCiAgICAvLyBUT0RPKGVmb3J0dW5hKTogQWRkIHRlc3QgZm9yIHRoaXMuCgogICAgaWYgKHR5cGUgaXMgaXIuSW52YWxpZFR5cGUpIHsKICAgICAgLy8gVE9ETyhzcmEpOiBNYWtlIEludmFsaWRUeXBlIGNhcnJ5IGEgbWVzc2FnZS4KICAgICAgZ2VuZXJhdGVUeXBlRXJyb3IoJ2ludmFsaWQgdHlwZScsIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgcG9wKCk7CiAgICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudEJvb2wodHJ1ZSwgY2xvc2VkV29ybGQpKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIERhcnRUeXBlIHR5cGVWYWx1ZSA9CiAgICAgICAgbG9jYWxzSGFuZGxlci5zdWJzdEluQ29udGV4dChfZWxlbWVudE1hcC5nZXREYXJ0VHlwZSh0eXBlKSk7CgogICAgaWYgKHR5cGVWYWx1ZS50cmVhdEFzRHluYW1pYykgewogICAgICBzdGFjay5hZGQoZ3JhcGguYWRkQ29uc3RhbnRCb29sKHRydWUsIGNsb3NlZFdvcmxkKSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAodHlwZVZhbHVlIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICBISW5zdHJ1Y3Rpb24gcmVwcmVzZW50YXRpb24gPQogICAgICAgICAgdHlwZUJ1aWxkZXIuYW5hbHl6ZVR5cGVBcmd1bWVudCh0eXBlVmFsdWUsIHNvdXJjZUVsZW1lbnQpOwogICAgICBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzID0gPEhJbnN0cnVjdGlvbj5bCiAgICAgICAgZXhwcmVzc2lvbiwKICAgICAgICByZXByZXNlbnRhdGlvbiwKICAgICAgXTsKICAgICAgX3B1c2hTdGF0aWNJbnZvY2F0aW9uKF9jb21tb25FbGVtZW50cy5mdW5jdGlvblR5cGVUZXN0LCBpbnB1dHMsCiAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmJvb2xUeXBlLCBjb25zdCA8RGFydFR5cGU+W10sCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pOwogICAgICBISW5zdHJ1Y3Rpb24gY2FsbCA9IHBvcCgpOwogICAgICBwdXNoKG5ldyBISXMuY29tcG91bmQodHlwZVZhbHVlLCBleHByZXNzaW9uLCBjYWxsLAogICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5ib29sVHlwZSwgc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICh0eXBlVmFsdWUgaXMgRnV0dXJlT3JUeXBlKSB7CiAgICAgIEhJbnN0cnVjdGlvbiByZXByZXNlbnRhdGlvbiA9CiAgICAgICAgICB0eXBlQnVpbGRlci5hbmFseXplVHlwZUFyZ3VtZW50KHR5cGVWYWx1ZSwgc291cmNlRWxlbWVudCk7CiAgICAgIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMgPSA8SEluc3RydWN0aW9uPlsKICAgICAgICBleHByZXNzaW9uLAogICAgICAgIHJlcHJlc2VudGF0aW9uLAogICAgICBdOwogICAgICBfcHVzaFN0YXRpY0ludm9jYXRpb24oX2NvbW1vbkVsZW1lbnRzLmZ1dHVyZU9yVGVzdCwgaW5wdXRzLAogICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5ib29sVHlwZSwgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgSEluc3RydWN0aW9uIGNhbGwgPSBwb3AoKTsKICAgICAgcHVzaChuZXcgSElzLmNvbXBvdW5kKHR5cGVWYWx1ZSwgZXhwcmVzc2lvbiwgY2FsbCwKICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUsIHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAodHlwZVZhbHVlIGlzIFR5cGVWYXJpYWJsZVR5cGUpIHsKICAgICAgSEluc3RydWN0aW9uIHJ1bnRpbWVUeXBlID0KICAgICAgICAgIHR5cGVCdWlsZGVyLmFkZFR5cGVWYXJpYWJsZVJlZmVyZW5jZSh0eXBlVmFsdWUsIHNvdXJjZUVsZW1lbnQpOwogICAgICBfcHVzaFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgICBfY29tbW9uRWxlbWVudHMuY2hlY2tTdWJ0eXBlT2ZSdW50aW1lVHlwZSwKICAgICAgICAgIDxISW5zdHJ1Y3Rpb24+W2V4cHJlc3Npb24sIHJ1bnRpbWVUeXBlXSwKICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUsCiAgICAgICAgICBjb25zdCA8RGFydFR5cGU+W10sCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pOwogICAgICBwdXNoKG5ldyBISXMudmFyaWFibGUodHlwZVZhbHVlLCBleHByZXNzaW9uLCBwb3AoKSwKICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUsIHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAodHlwZVZhbHVlIGlzIEludGVyZmFjZVR5cGUgJiYgIV9jYW5JZ25vcmVUeXBlQXJndW1lbnRzKHR5cGVWYWx1ZSkpIHsKICAgICAgSEluc3RydWN0aW9uIHJlcHJlc2VudGF0aW9ucyA9IHR5cGVCdWlsZGVyCiAgICAgICAgICAuYnVpbGRUeXBlQXJndW1lbnRSZXByZXNlbnRhdGlvbnModHlwZVZhbHVlLCBzb3VyY2VFbGVtZW50KTsKICAgICAgYWRkKHJlcHJlc2VudGF0aW9ucyk7CiAgICAgIENsYXNzRW50aXR5IGVsZW1lbnQgPSB0eXBlVmFsdWUuZWxlbWVudDsKICAgICAganMuTmFtZSBvcGVyYXRvciA9IG5hbWVyLm9wZXJhdG9ySXMoZWxlbWVudCk7CiAgICAgIEhJbnN0cnVjdGlvbiBpc0ZpZWxkTmFtZSA9CiAgICAgICAgICBncmFwaC5hZGRDb25zdGFudFN0cmluZ0Zyb21OYW1lKG9wZXJhdG9yLCBjbG9zZWRXb3JsZCk7CiAgICAgIEhJbnN0cnVjdGlvbiBhc0ZpZWxkTmFtZSA9CiAgICAgICAgICBjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5oYXNBbnlTdHJpY3RTdWJ0eXBlKGVsZW1lbnQpIHx8CiAgICAgICAgICAgICAgICAgIGNsb3NlZFdvcmxkLm5hdGl2ZURhdGEuaXNKc0ludGVyb3BDbGFzcyhlbGVtZW50KQogICAgICAgICAgICAgID8gZ3JhcGguYWRkQ29uc3RhbnRTdHJpbmdGcm9tTmFtZSgKICAgICAgICAgICAgICAgICAgbmFtZXIuc3Vic3RpdHV0aW9uTmFtZShlbGVtZW50KSwgY2xvc2VkV29ybGQpCiAgICAgICAgICAgICAgOiBncmFwaC5hZGRDb25zdGFudE51bGwoY2xvc2VkV29ybGQpOwogICAgICBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzID0gPEhJbnN0cnVjdGlvbj5bCiAgICAgICAgZXhwcmVzc2lvbiwKICAgICAgICBpc0ZpZWxkTmFtZSwKICAgICAgICByZXByZXNlbnRhdGlvbnMsCiAgICAgICAgYXNGaWVsZE5hbWUKICAgICAgXTsKICAgICAgX3B1c2hTdGF0aWNJbnZvY2F0aW9uKF9jb21tb25FbGVtZW50cy5jaGVja1N1YnR5cGUsIGlucHV0cywKICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUsIGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIHB1c2gobmV3IEhJcy5jb21wb3VuZCh0eXBlVmFsdWUsIGV4cHJlc3Npb24sIHBvcCgpLAogICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5ib29sVHlwZSwgc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChiYWNrZW5kLmhhc0RpcmVjdENoZWNrRm9yKGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLCB0eXBlVmFsdWUpKSB7CiAgICAgIHB1c2gobmV3IEhJcy5kaXJlY3QodHlwZVZhbHVlLCBleHByZXNzaW9uLCBhYnN0cmFjdFZhbHVlRG9tYWluLmJvb2xUeXBlLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gVGhlIGludGVyY2VwdG9yIGlzIG5vdCBhbHdheXMgbmVlZGVkLiAgSXQgaXMgcmVtb3ZlZCBieSBvcHRpbWl6YXRpb24KICAgIC8vIHdoZW4gdGhlIHJlY2VpdmVyIHR5cGUgb3IgdGVzdGVkIHR5cGUgcGVybWl0LgogICAgcHVzaChuZXcgSElzLnJhdygKICAgICAgICB0eXBlVmFsdWUsCiAgICAgICAgZXhwcmVzc2lvbiwKICAgICAgICBfaW50ZXJjZXB0b3JGb3IoZXhwcmVzc2lvbiwgc291cmNlSW5mb3JtYXRpb24pLAogICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUsCiAgICAgICAgc291cmNlSW5mb3JtYXRpb24pKTsKICAgIHJldHVybjsKICB9CgogIC8vLyBXaGV0aGVyIGFuIGlzLWNoZWNrIGZvciBbdHlwZV0gY2FuIGJlIGRvbmUgaWdub3JpbmcgdHlwZS1hcmd1bWVudHMuCiAgLy8vIFRoaXMgd2lsbCBiZSB0cnVlIGlmIFt0eXBlXSBpcyByYXcsIG9yIGFsbCBpdHMgdHlwZS1hcmd1bWVudHMgbWF0Y2ggdGhlCiAgLy8vIHR5cGUtcGFyYW1ldGVyIGJvdW5kcy4KICBib29sIF9jYW5JZ25vcmVUeXBlQXJndW1lbnRzKEludGVyZmFjZVR5cGUgdHlwZSkgewogICAgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZSA9CiAgICAgICAgX2VsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50LmdldFRoaXNUeXBlKHR5cGUuZWxlbWVudCk7CiAgICBMaXN0PERhcnRUeXBlPiBib3VuZHMgPSB0aGlzVHlwZS50eXBlQXJndW1lbnRzOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBib3VuZHMubGVuZ3RoOyBpKyspIHsKICAgICAgRGFydFR5cGUgYXJnID0gdHlwZS50eXBlQXJndW1lbnRzW2ldOwogICAgICBpZiAoYXJnLnRyZWF0QXNEeW5hbWljKSBjb250aW51ZTsKICAgICAgVHlwZVZhcmlhYmxlVHlwZSB0eXBlVmFyaWFibGUgPSBib3VuZHNbaV07CiAgICAgIERhcnRUeXBlIGJvdW5kID0gX2VsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50CiAgICAgICAgICAuZ2V0VHlwZVZhcmlhYmxlQm91bmQodHlwZVZhcmlhYmxlLmVsZW1lbnQpOwogICAgICBpZiAoYm91bmQgIT0gYXJnKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUaHJvdyhpci5UaHJvdyBub2RlKSB7CiAgICBfdmlzaXRUaHJvd0V4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKTsKICAgIGlmIChpc1JlYWNoYWJsZSkgewogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9CiAgICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkVGhyb3cobm9kZSk7CiAgICAgIGhhbmRsZUluVHJ5U3RhdGVtZW50KCk7CiAgICAgIHB1c2gobmV3IEhUaHJvd0V4cHJlc3Npb24oYWJzdHJhY3RWYWx1ZURvbWFpbiwgcG9wKCksIHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICAgIGlzUmVhY2hhYmxlID0gZmFsc2U7CiAgICB9CiAgfQoKICB2b2lkIF92aXNpdFRocm93RXhwcmVzc2lvbihpci5FeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKICAgIGJvb2wgb2xkID0gX2luRXhwcmVzc2lvbk9mVGhyb3c7CiAgICB0cnkgewogICAgICBfaW5FeHByZXNzaW9uT2ZUaHJvdyA9IHRydWU7CiAgICAgIGV4cHJlc3Npb24uYWNjZXB0KHRoaXMpOwogICAgfSBmaW5hbGx5IHsKICAgICAgX2luRXhwcmVzc2lvbk9mVGhyb3cgPSBvbGQ7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0WWllbGRTdGF0ZW1lbnQoaXIuWWllbGRTdGF0ZW1lbnQgbm9kZSkgewogICAgbm9kZS5leHByZXNzaW9uLmFjY2VwdCh0aGlzKTsKICAgIGFkZChuZXcgSFlpZWxkKGFic3RyYWN0VmFsdWVEb21haW4sIHBvcCgpLCBub2RlLmlzWWllbGRTdGFyLAogICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRZaWVsZChub2RlKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEF3YWl0RXhwcmVzc2lvbihpci5Bd2FpdEV4cHJlc3Npb24gbm9kZSkgewogICAgbm9kZS5vcGVyYW5kLmFjY2VwdCh0aGlzKTsKICAgIEhJbnN0cnVjdGlvbiBhd2FpdGVkID0gcG9wKCk7CiAgICAvLyBUT0RPKGhlcmh1dCk6IEltcHJvdmUgdGhpcyB0eXBlLgogICAgcHVzaChuZXcgSEF3YWl0KGF3YWl0ZWQsIGFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUpCiAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkQXdhaXQobm9kZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFJldGhyb3coaXIuUmV0aHJvdyBub2RlKSB7CiAgICBISW5zdHJ1Y3Rpb24gZXhjZXB0aW9uID0gcmV0aHJvd2FibGVFeGNlcHRpb247CiAgICBpZiAoZXhjZXB0aW9uID09IG51bGwpIHsKICAgICAgZXhjZXB0aW9uID0gZ3JhcGguYWRkQ29uc3RhbnROdWxsKGNsb3NlZFdvcmxkKTsKICAgICAgcmVwb3J0ZXIuaW50ZXJuYWxFcnJvcihfZWxlbWVudE1hcC5nZXRTcGFubmFibGUodGFyZ2V0RWxlbWVudCwgbm9kZSksCiAgICAgICAgICAncmV0aHJvd2FibGVFeGNlcHRpb24gc2hvdWxkIG5vdCBiZSBudWxsLicpOwogICAgfQogICAgaGFuZGxlSW5UcnlTdGF0ZW1lbnQoKTsKICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0KICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkVGhyb3cobm9kZSk7CiAgICBjbG9zZUFuZEdvdG9FeGl0KG5ldyBIVGhyb3coCiAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbiwgZXhjZXB0aW9uLCBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgICBpc1JldGhyb3c6IHRydWUpKTsKICAgIC8vIGlyLlJldGhyb3cgaXMgYW4gZXhwcmVzc2lvbiBzbyB3ZSBuZWVkIHRvIHB1c2ggYSB2YWx1ZSAtIGEgY29uc3RhbnQgd2l0aAogICAgLy8gbm8gdHlwZS4KICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudFVucmVhY2hhYmxlKGNsb3NlZFdvcmxkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VGhpc0V4cHJlc3Npb24oaXIuVGhpc0V4cHJlc3Npb24gbm9kZSkgewogICAgc3RhY2suYWRkKGxvY2Fsc0hhbmRsZXIucmVhZFRoaXMoCiAgICAgICAgc291cmNlSW5mb3JtYXRpb246IF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRHZXQobm9kZSkpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXROb3QoaXIuTm90IG5vZGUpIHsKICAgIG5vZGUub3BlcmFuZC5hY2NlcHQodGhpcyk7CiAgICBwdXNoKG5ldyBITm90KHBvcEJvb2xpZmllZCgpLCBhYnN0cmFjdFZhbHVlRG9tYWluLmJvb2xUeXBlKQogICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZFVuYXJ5KG5vZGUpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKGlyLlN0cmluZ0NvbmNhdGVuYXRpb24gc3RyaW5nQ29uY2F0KSB7CiAgICBLZXJuZWxTdHJpbmdCdWlsZGVyIHN0cmluZ0J1aWxkZXIgPSBuZXcgS2VybmVsU3RyaW5nQnVpbGRlcih0aGlzKTsKICAgIHN0cmluZ0NvbmNhdC5hY2NlcHQoc3RyaW5nQnVpbGRlcik7CiAgICBzdGFjay5hZGQoc3RyaW5nQnVpbGRlci5yZXN1bHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFRyeUNhdGNoKGlyLlRyeUNhdGNoIG5vZGUpIHsKICAgIFRyeUNhdGNoRmluYWxseUJ1aWxkZXIgdHJ5QnVpbGRlciA9IG5ldyBUcnlDYXRjaEZpbmFsbHlCdWlsZGVyKAogICAgICAgIHRoaXMsIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRUcnkobm9kZSkpOwogICAgbm9kZS5ib2R5LmFjY2VwdCh0aGlzKTsKICAgIHRyeUJ1aWxkZXIKICAgICAgLi5jbG9zZVRyeUJvZHkoKQogICAgICAuLmJ1aWxkQ2F0Y2gobm9kZSkKICAgICAgLi5jbGVhblVwKCk7CiAgfQoKICAvLy8gYHRyeSB7IC4uLiB9IGNhdGNoIHsgLi4uIH0gZmluYWxseSB7IC4uLiB9YCBzdGF0ZW1lbnRzIGFyZSBhIGxpdHRsZSBmdW5ueQogIC8vLyBiZWNhdXNlIGEgdHJ5IGNhbiBoYXZlIG9uZSBvciBib3RoIG9mIHtjYXRjaHxmaW5hbGx5fS4gVGhlIHdheSB0aGlzIGlzCiAgLy8vIGVuY29kZWQgaW4ga2VybmVsIEFTVCBhcmUgdHdvIHNlcGFyYXRlIGNsYXNzZXMgd2l0aCBubyBjb21tb24gc3VwZXJjbGFzcwogIC8vLyBhc2lkZSBmcm9tIFN0YXRlbWVudC4gSWYgYSBzdGF0ZW1lbnQgaGFzIGJvdGggYGNhdGNoYCBhbmQgYGZpbmFsbHlgCiAgLy8vIGNsYXVzZXMgdGhlbiBpdCBpcyBlbmNvZGVkIGluIGtlcm5lbCBhcyBzbyB0aGF0IHRoZSBUcnlDYXRjaCBpcyB0aGUgYm9keQogIC8vLyBzdGF0ZW1lbnQgb2YgdGhlIFRyeUZpbmFsbHkuIFRvIHByb2R1Y2UgbW9yZSBlZmZpY2llbnQgY29kZSByYXRoZXIgdGhhbgogIC8vLyBuZXN0ZWQgdHJ5IHN0YXRlbWVudHMsIHRoZSB2aXNpdG9ycyBhdm9pZCBvbmUgcG90ZW50aWFsIGxldmVsIG9mCiAgLy8vIHJlY3Vyc2lvbi4KICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHJ5RmluYWxseShpci5UcnlGaW5hbGx5IG5vZGUpIHsKICAgIFRyeUNhdGNoRmluYWxseUJ1aWxkZXIgdHJ5QnVpbGRlciA9IG5ldyBUcnlDYXRjaEZpbmFsbHlCdWlsZGVyKAogICAgICAgIHRoaXMsIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRUcnkobm9kZSkpOwoKICAgIC8vIFdlIGRvIHRoZXNlIHNoZW5hbmlnYW5zIHRvIHByb2R1Y2UgYmV0dGVyIGxvb2tpbmcgY29kZSB0aGF0IGRvZXNuJ3QKICAgIC8vIGhhdmUgbmVzdGVkIHRyeSBzdGF0ZW1lbnRzLgogICAgaWYgKG5vZGUuYm9keSBpcyBpci5UcnlDYXRjaCkgewogICAgICBpci5UcnlDYXRjaCB0cnlDYXRjaCA9IG5vZGUuYm9keTsKICAgICAgdHJ5Q2F0Y2guYm9keS5hY2NlcHQodGhpcyk7CiAgICAgIHRyeUJ1aWxkZXIKICAgICAgICAuLmNsb3NlVHJ5Qm9keSgpCiAgICAgICAgLi5idWlsZENhdGNoKHRyeUNhdGNoKTsKICAgIH0gZWxzZSB7CiAgICAgIG5vZGUuYm9keS5hY2NlcHQodGhpcyk7CiAgICAgIHRyeUJ1aWxkZXIuY2xvc2VUcnlCb2R5KCk7CiAgICB9CgogICAgdHJ5QnVpbGRlcgogICAgICAuLmJ1aWxkRmluYWxseUJsb2NrKCgpIHsKICAgICAgICBub2RlLmZpbmFsaXplci5hY2NlcHQodGhpcyk7CiAgICAgIH0pCiAgICAgIC4uY2xlYW5VcCgpOwogIH0KCiAgLy8vIFRyeSB0byBpbmxpbmUgW2VsZW1lbnRdIHdpdGhpbiB0aGUgY29ycmVjdCBjb250ZXh0IG9mIHRoZSBidWlsZGVyLiBUaGUKICAvLy8gaW5zZXJ0aW9uIHBvaW50IGlzIHRoZSBzdGF0ZSBvZiB0aGUgYnVpbGRlci4KICBib29sIF90cnlJbmxpbmVNZXRob2QoCiAgICAgIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uLAogICAgICBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrLAogICAgICBMaXN0PEhJbnN0cnVjdGlvbj4gcHJvdmlkZWRBcmd1bWVudHMsCiAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMsCiAgICAgIGlyLk5vZGUgY3VycmVudE5vZGUsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICB7SW50ZXJmYWNlVHlwZSBpbnN0YW5jZVR5cGV9KSB7CiAgICBpZiAoZnVuY3Rpb24uaXNFeHRlcm5hbCkgewogICAgICAvLyBEb24ndCBpbmxpbmUgZXh0ZXJuYWwgbWV0aG9kczsgdGhlc2Ugc2hvdWxkIGp1c3QgZmFpbCBhdCBydW50aW1lLgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaWYgKG5hdGl2ZURhdGEuaXNKc0ludGVyb3BNZW1iZXIoZnVuY3Rpb24pICYmCiAgICAgICAgIShmdW5jdGlvbiBpcyBDb25zdHJ1Y3RvckVudGl0eSAmJiBmdW5jdGlvbi5pc0ZhY3RvcnlDb25zdHJ1Y3RvcikpIHsKICAgICAgLy8gV2Ugb25seSBpbmxpbmUgZmFjdG9yeSBKYXZhU2NyaXB0IGludGVyb3AgY29uc3RydWN0b3JzLgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaWYgKGNvbXBpbGVyLmVsZW1lbnRIYXNDb21waWxlVGltZUVycm9yKGZ1bmN0aW9uKSkgcmV0dXJuIGZhbHNlOwoKICAgIGJvb2wgaW5zaWRlTG9vcCA9IGxvb3BEZXB0aCA+IDAgfHwgZ3JhcGguY2FsbGVkSW5Mb29wOwoKICAgIC8vIEJhaWwgb3V0IGVhcmx5IGlmIHRoZSBpbmxpbmluZyBkZWNpc2lvbiBpcyBpbiB0aGUgY2FjaGUgYW5kIHdlIGNhbid0CiAgICAvLyBpbmxpbmUgKG5vIG5lZWQgdG8gY2hlY2sgdGhlIGhhcmQgY29uc3RyYWludHMpLgogICAgYm9vbCBjYWNoZWRDYW5CZUlubGluZWQgPQogICAgICAgIGlubGluZUNhY2hlLmNhbklubGluZShmdW5jdGlvbiwgaW5zaWRlTG9vcDogaW5zaWRlTG9vcCk7CiAgICBpZiAoY2FjaGVkQ2FuQmVJbmxpbmVkID09IGZhbHNlKSByZXR1cm4gZmFsc2U7CgogICAgYm9vbCBtZWV0c0hhcmRDb25zdHJhaW50cygpIHsKICAgICAgaWYgKG9wdGlvbnMuZGlzYWJsZUlubGluaW5nKSByZXR1cm4gZmFsc2U7CgogICAgICBhc3NlcnQoCiAgICAgICAgICBzZWxlY3RvciAhPSBudWxsIHx8CiAgICAgICAgICAgICAgZnVuY3Rpb24uaXNTdGF0aWMgfHwKICAgICAgICAgICAgICBmdW5jdGlvbi5pc1RvcExldmVsIHx8CiAgICAgICAgICAgICAgZnVuY3Rpb24uaXNDb25zdHJ1Y3RvciB8fAogICAgICAgICAgICAgIGZ1bmN0aW9uIGlzIENvbnN0cnVjdG9yQm9keUVudGl0eSwKICAgICAgICAgIGZhaWxlZEF0KGZ1bmN0aW9uLCAiTWlzc2luZyBzZWxlY3RvciBmb3IgaW5saW5pbmcgb2YgJGZ1bmN0aW9uLiIpKTsKICAgICAgaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKICAgICAgICBpZiAoIXNlbGVjdG9yLmFwcGxpZXMoZnVuY3Rpb24pKSByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKG1hc2sgIT0gbnVsbCAmJgogICAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgICAgICAgICAuaXNUYXJnZXRpbmdNZW1iZXIobWFzaywgZnVuY3Rpb24sIHNlbGVjdG9yLm1lbWJlck5hbWUpCiAgICAgICAgICAgICAgICAuaXNEZWZpbml0ZWx5RmFsc2UpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChuYXRpdmVEYXRhLmlzSnNJbnRlcm9wTWVtYmVyKGZ1bmN0aW9uKSkgcmV0dXJuIGZhbHNlOwoKICAgICAgLy8gRG9uJ3QgaW5saW5lIG9wZXJhdG9yPT0gbWV0aG9kcyBpZiB0aGUgcGFyYW1ldGVyIGNhbiBiZSBudWxsLgogICAgICBpZiAoZnVuY3Rpb24ubmFtZSA9PSAnPT0nKSB7CiAgICAgICAgaWYgKGZ1bmN0aW9uLmVuY2xvc2luZ0NsYXNzICE9IGNvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzICYmCiAgICAgICAgICAgIHByb3ZpZGVkQXJndW1lbnRzWzFdCiAgICAgICAgICAgICAgICAuaXNOdWxsKGFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgICAgICAuaXNQb3RlbnRpYWxseVRydWUpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIEdlbmVyYXRpdmUgY29uc3RydWN0b3JzIG9mIG5hdGl2ZSBjbGFzc2VzIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5CiAgICAgIC8vIGFuZCBoYXZlIGFuIGV4dHJhIGFyZ3VtZW50IHRoYXQgY2F1c2VzIHByb2JsZW1zIHdpdGggaW5saW5pbmcuCiAgICAgIGlmIChmdW5jdGlvbiBpcyBDb25zdHJ1Y3RvckVudGl0eSAmJgogICAgICAgICAgZnVuY3Rpb24uaXNHZW5lcmF0aXZlQ29uc3RydWN0b3IgJiYKICAgICAgICAgIG5hdGl2ZURhdGEuaXNOYXRpdmVPckV4dGVuZHNOYXRpdmUoZnVuY3Rpb24uZW5jbG9zaW5nQ2xhc3MpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICAvLyBBIGdlbmVyYXRpdmUgY29uc3RydWN0b3IgYm9keSBpcyBub3Qgc2VlbiBieSBnbG9iYWwgYW5hbHlzaXMsCiAgICAgIC8vIHNvIHdlIHNob3VsZCBub3QgcXVlcnkgZm9yIGl0cyB0eXBlLgogICAgICBpZiAoZnVuY3Rpb24gaXMhIENvbnN0cnVjdG9yQm9keUVudGl0eSkgewogICAgICAgIGlmIChnbG9iYWxJbmZlcmVuY2VSZXN1bHRzLnJlc3VsdE9mTWVtYmVyKGZ1bmN0aW9uKS50aHJvd3NBbHdheXMpIHsKICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEl0IHNlZW1zIHdyb25nIHRvIHNldCBgaXNSZWFjaGFibGVgIHRvIGBmYWxzZWAKICAgICAgICAgIC8vIHNpbmNlIHdlIGFyZSBfbm90XyBnb2luZyB0byBpbmxpbmUgW2Z1bmN0aW9uXS4gVGhpcyBoYXMKICAgICAgICAgIC8vIGltcGxpY2F0aW9ucyBpbiBzd2l0Y2ggY2FzZXMgd2hlcmUgd2UgbWlnaHQgbmVlZCB0byBpbnNlcnQgYQogICAgICAgICAgLy8gYGJyZWFrYCB0aGF0IHdhcyBza2lwcGVkIGR1ZSB0byBgaXNSZWFjaGFibGVgIGJlaW5nIGBmYWxzZWAuCiAgICAgICAgICBpc1JlYWNoYWJsZSA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgYm9vbCBkb2VzTm90Q29udGFpbkNvZGUoKSB7CiAgICAgIC8vIEEgZnVuY3Rpb24gd2l0aCBzaXplIDEgZG9lcyBub3QgY29udGFpbiBhbnkgY29kZS4KICAgICAgcmV0dXJuIElubGluZVdlZWRlci5jYW5CZUlubGluZWQoX2VsZW1lbnRNYXAsIGZ1bmN0aW9uLCAxLAogICAgICAgICAgZW5hYmxlVXNlckFzc2VydGlvbnM6IG9wdGlvbnMuZW5hYmxlVXNlckFzc2VydGlvbnMpOwogICAgfQoKICAgIGJvb2wgcmVkdWN0aXZlSGV1cmlzdGljKCkgewogICAgICAvLyBUaGUgY2FsbCBpcyBvbiBhIHBhdGggd2hpY2ggaXMgZXhlY3V0ZWQgcmFyZWx5LCBzbyBpbmxpbmUgb25seSBpZiBpdAogICAgICAvLyBkb2VzIG5vdCBtYWtlIHRoZSBwcm9ncmFtIGxhcmdlci4KICAgICAgaWYgKF9pc0NhbGxlZE9uY2UoZnVuY3Rpb24pKSB7CiAgICAgICAgcmV0dXJuIElubGluZVdlZWRlci5jYW5CZUlubGluZWQoX2VsZW1lbnRNYXAsIGZ1bmN0aW9uLCBudWxsLAogICAgICAgICAgICBlbmFibGVVc2VyQXNzZXJ0aW9uczogb3B0aW9ucy5lbmFibGVVc2VyQXNzZXJ0aW9ucyk7CiAgICAgIH0KICAgICAgaWYgKElubGluZVJlZHVjdGl2ZVdlZWRlci5jYW5CZUlubGluZWQoCiAgICAgICAgICBfZWxlbWVudE1hcCwgZnVuY3Rpb24sIHByb3ZpZGVkQXJndW1lbnRzLmxlbmd0aCwKICAgICAgICAgIGVuYWJsZVVzZXJBc3NlcnRpb25zOiBvcHRpb25zLmVuYWJsZVVzZXJBc3NlcnRpb25zLAogICAgICAgICAgb21pdEltcGxpY2l0Q2FzdHM6IG9wdGlvbnMub21pdEltcGxpY2l0Q2hlY2tzKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHJldHVybiBkb2VzTm90Q29udGFpbkNvZGUoKTsKICAgIH0KCiAgICBib29sIGhldXJpc3RpY1NheUdvb2RUb0dvKCkgewogICAgICAvLyBEb24ndCBpbmxpbmUgcmVjdXJzaXZlbHksCiAgICAgIGlmIChfaW5saW5pbmdTdGFjay5hbnkoKGVudHJ5KSA9PiBlbnRyeS5mdW5jdGlvbiA9PSBmdW5jdGlvbikpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8vIERvbid0IGlubGluZSBhY3Jvc3MgZGVmZXJyZWQgaW1wb3J0IHRvIHByZXZlbnQgbGVha2luZyBjb2RlLiBUaGUgb25seQogICAgICAvLyBleGNlcHRpb24gaXMgYW4gZW1wdHkgZnVuY3Rpb24gKHdoaWNoIGRvZXMgbm90IGNvbnRhaW4gY29kZSkuCiAgICAgIGJvb2wgaGFzT25seU5vbkRlZmVycmVkSW1wb3J0UGF0aHMgPSBjbG9zZWRXb3JsZC5vdXRwdXRVbml0RGF0YQogICAgICAgICAgLmhhc09ubHlOb25EZWZlcnJlZEltcG9ydFBhdGhzKGNvbXBpbGVyLmN1cnJlbnRFbGVtZW50LCBmdW5jdGlvbik7CgogICAgICBpZiAoIWhhc09ubHlOb25EZWZlcnJlZEltcG9ydFBhdGhzKSB7CiAgICAgICAgcmV0dXJuIGRvZXNOb3RDb250YWluQ29kZSgpOwogICAgICB9CgogICAgICAvLyBEbyBub3QgaW5saW5lIGNvZGUgdGhhdCBpcyByYXJlbHkgZXhlY3V0ZWQgdW5sZXNzIGl0IHJlZHVjZXMgc2l6ZS4KICAgICAgaWYgKF9pbkV4cHJlc3Npb25PZlRocm93IHx8IF9pbkxhenlJbml0aWFsaXplckV4cHJlc3Npb24pIHsKICAgICAgICByZXR1cm4gcmVkdWN0aXZlSGV1cmlzdGljKCk7CiAgICAgIH0KCiAgICAgIGlmIChjYWNoZWRDYW5CZUlubGluZWQgPT0gdHJ1ZSkgewogICAgICAgIC8vIFdlIG1heSBoYXZlIGZvcmNlZCB0aGUgaW5saW5pbmcgb2Ygc29tZSBtZXRob2RzLiBUaGVyZWZvcmUgY2hlY2sKICAgICAgICAvLyBpZiB3ZSBjYW4gaW5saW5lIHRoaXMgbWV0aG9kIHJlZ2FyZGxlc3Mgb2Ygc2l6ZS4KICAgICAgICBTdHJpbmcgcmVhc29uOwogICAgICAgIGFzc2VydCgKICAgICAgICAgICAgKHJlYXNvbiA9IElubGluZVdlZWRlci5jYW5ub3RCZUlubGluZWRSZWFzb24oCiAgICAgICAgICAgICAgICAgICAgX2VsZW1lbnRNYXAsIGZ1bmN0aW9uLCBudWxsLAogICAgICAgICAgICAgICAgICAgIGFsbG93TG9vcHM6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgZW5hYmxlVXNlckFzc2VydGlvbnM6IG9wdGlvbnMuZW5hYmxlVXNlckFzc2VydGlvbnMpKSA9PQogICAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgZmFpbGVkQXQoZnVuY3Rpb24sICJDYW5ub3QgaW5saW5lICRmdW5jdGlvbjogJHJlYXNvbiIpKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQoKICAgICAgaW50IG51bVBhcmFtZXRlcnMgPSBmdW5jdGlvbi5wYXJhbWV0ZXJTdHJ1Y3R1cmUudG90YWxQYXJhbWV0ZXJzOwogICAgICBpbnQgbWF4SW5saW5pbmdOb2RlczsKICAgICAgaWYgKGluc2lkZUxvb3ApIHsKICAgICAgICBtYXhJbmxpbmluZ05vZGVzID0gSW5saW5lV2VlZGVyLklOTElOSU5HX05PREVTX0lOU0lERV9MT09QICsKICAgICAgICAgICAgSW5saW5lV2VlZGVyLklOTElOSU5HX05PREVTX0lOU0lERV9MT09QX0FSR19GQUNUT1IgKiBudW1QYXJhbWV0ZXJzOwogICAgICB9IGVsc2UgewogICAgICAgIG1heElubGluaW5nTm9kZXMgPSBJbmxpbmVXZWVkZXIuSU5MSU5JTkdfTk9ERVNfT1VUU0lERV9MT09QICsKICAgICAgICAgICAgSW5saW5lV2VlZGVyLklOTElOSU5HX05PREVTX09VVFNJREVfTE9PUF9BUkdfRkFDVE9SICogbnVtUGFyYW1ldGVyczsKICAgICAgfQoKICAgICAgYm9vbCBtYXJrZWRUcnlJbmxpbmUgPSBpbmxpbmVDYWNoZS5tYXJrZWRBc1RyeUlubGluZShmdW5jdGlvbik7CiAgICAgIGJvb2wgY2FsbGVkT25jZSA9IF9pc0NhbGxlZE9uY2UoZnVuY3Rpb24pOwogICAgICAvLyBJZiBhIG1ldGhvZCBpcyBjYWxsZWQgb25seSBvbmNlLCBhbmQgYWxsIHRoZSBtZXRob2RzIGluIHRoZSBpbmxpbmluZwogICAgICAvLyBzdGFjayBhcmUgY2FsbGVkIG9ubHkgb25jZSBhcyB3ZWxsLCB3ZSBrbm93IHdlIHdpbGwgc2F2ZSBvbiBvdXRwdXQgc2l6ZQogICAgICAvLyBieSBpbmxpbmluZyB0aGlzIG1ldGhvZC4KICAgICAgaWYgKG1hcmtlZFRyeUlubGluZSB8fCBjYWxsZWRPbmNlKSB7CiAgICAgICAgbWF4SW5saW5pbmdOb2RlcyA9IG51bGw7CiAgICAgIH0KICAgICAgYm9vbCBhbGxvd0xvb3BzID0gZmFsc2U7CiAgICAgIGlmIChtYXJrZWRUcnlJbmxpbmUpIHsKICAgICAgICBhbGxvd0xvb3BzID0gdHJ1ZTsKICAgICAgfQoKICAgICAgYm9vbCBjYW5JbmxpbmUgPSBJbmxpbmVXZWVkZXIuY2FuQmVJbmxpbmVkKAogICAgICAgICAgX2VsZW1lbnRNYXAsIGZ1bmN0aW9uLCBtYXhJbmxpbmluZ05vZGVzLAogICAgICAgICAgYWxsb3dMb29wczogYWxsb3dMb29wcywKICAgICAgICAgIGVuYWJsZVVzZXJBc3NlcnRpb25zOiBvcHRpb25zLmVuYWJsZVVzZXJBc3NlcnRpb25zKTsKICAgICAgaWYgKG1hcmtlZFRyeUlubGluZSkgewogICAgICAgIGlmIChjYW5JbmxpbmUpIHsKICAgICAgICAgIGlubGluZUNhY2hlLm1hcmtBc0lubGluYWJsZShmdW5jdGlvbiwgaW5zaWRlTG9vcDogdHJ1ZSk7CiAgICAgICAgICBpbmxpbmVDYWNoZS5tYXJrQXNJbmxpbmFibGUoZnVuY3Rpb24sIGluc2lkZUxvb3A6IGZhbHNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5saW5lQ2FjaGUubWFya0FzTm9uSW5saW5hYmxlKGZ1bmN0aW9uLCBpbnNpZGVMb29wOiB0cnVlKTsKICAgICAgICAgIGlubGluZUNhY2hlLm1hcmtBc05vbklubGluYWJsZShmdW5jdGlvbiwgaW5zaWRlTG9vcDogZmFsc2UpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjYWxsZWRPbmNlKSB7CiAgICAgICAgLy8gVE9ETygzNDIwMyk6IFdlIGNhbid0IHVwZGF0ZSB0aGUgZGVjaXNpb24gZHVlIHRvIGltcHJlY2lzaW9uIGluIHRoZQogICAgICAgIC8vIGNhbGxlZE9uY2UgZGF0YSwgZGVzY3JpYmVkIGluIElzc3VlIDM0MjAzLgogICAgICB9IGVsc2UgewogICAgICAgIGlmIChjYW5JbmxpbmUpIHsKICAgICAgICAgIGlubGluZUNhY2hlLm1hcmtBc0lubGluYWJsZShmdW5jdGlvbiwgaW5zaWRlTG9vcDogaW5zaWRlTG9vcCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlubGluZUNhY2hlLm1hcmtBc05vbklubGluYWJsZShmdW5jdGlvbiwgaW5zaWRlTG9vcDogaW5zaWRlTG9vcCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBjYW5JbmxpbmU7CiAgICB9CgogICAgdm9pZCBkb0lubGluaW5nKCkgewogICAgICBpZiAoZnVuY3Rpb24uaXNDb25zdHJ1Y3RvcikgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyU3RhdGljVXNlKAogICAgICAgICAgICBuZXcgU3RhdGljVXNlLmNvbnN0cnVjdG9ySW5saW5pbmcoZnVuY3Rpb24sIGluc3RhbmNlVHlwZSkpOwogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydChpbnN0YW5jZVR5cGUgPT0gbnVsbCwKICAgICAgICAgICAgIlVuZXhwZWN0ZWQgaW5zdGFuY2UgdHlwZSBmb3IgJGZ1bmN0aW9uOiAkaW5zdGFuY2VUeXBlIik7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UoCiAgICAgICAgICAgIG5ldyBTdGF0aWNVc2UubWV0aG9kSW5saW5pbmcoZnVuY3Rpb24sIHR5cGVBcmd1bWVudHMpKTsKICAgICAgfQoKICAgICAgLy8gQWRkIGFuIGV4cGxpY2l0IG51bGwgY2hlY2sgb24gdGhlIHJlY2VpdmVyIGJlZm9yZSBkb2luZyB0aGUKICAgICAgLy8gaW5saW5pbmcuIFdlIHVzZSBbZWxlbWVudF0gdG8gZ2V0IHRoZSBzYW1lIG5hbWUgaW4gdGhlCiAgICAgIC8vIE5vU3VjaE1ldGhvZEVycm9yIG1lc3NhZ2UgYXMgaWYgd2UgaGFkIGNhbGxlZCBpdC4KICAgICAgaWYgKGZ1bmN0aW9uLmlzSW5zdGFuY2VNZW1iZXIgJiYKICAgICAgICAgIGZ1bmN0aW9uIGlzISBDb25zdHJ1Y3RvckJvZHlFbnRpdHkgJiYKICAgICAgICAgIChtYXNrID09IG51bGwgfHwKICAgICAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmlzTnVsbChtYXNrKS5pc1BvdGVudGlhbGx5VHJ1ZSkpIHsKICAgICAgICBhZGQobmV3IEhGaWVsZEdldChudWxsLCBwcm92aWRlZEFyZ3VtZW50c1swXSwKICAgICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSwgc291cmNlSW5mb3JtYXRpb24sCiAgICAgICAgICAgIGlzQXNzaWduYWJsZTogZmFsc2UpKTsKICAgICAgfQogICAgICBMaXN0PEhJbnN0cnVjdGlvbj4gY29tcGlsZWRBcmd1bWVudHMgPSBfY29tcGxldGVDYWxsQXJndW1lbnRzTGlzdCgKICAgICAgICAgIGZ1bmN0aW9uLCBzZWxlY3RvciwgcHJvdmlkZWRBcmd1bWVudHMsIGN1cnJlbnROb2RlKTsKICAgICAgX2VudGVySW5saW5lZE1ldGhvZChmdW5jdGlvbiwgY29tcGlsZWRBcmd1bWVudHMsIGluc3RhbmNlVHlwZSk7CiAgICAgIGlubGluZWRGcm9tKGZ1bmN0aW9uLCBzb3VyY2VJbmZvcm1hdGlvbiwgKCkgewogICAgICAgIGlmICghaXNSZWFjaGFibGUpIHsKICAgICAgICAgIF9lbWl0UmV0dXJuKGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCksIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgX2RvSW5saW5lKGZ1bmN0aW9uKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBfbGVhdmVJbmxpbmVkTWV0aG9kKCk7CiAgICB9CgogICAgaWYgKG1lZXRzSGFyZENvbnN0cmFpbnRzKCkgJiYgaGV1cmlzdGljU2F5R29vZFRvR28oKSkgewogICAgICBkb0lubGluaW5nKCk7CiAgICAgIF9pbmZvUmVwb3J0ZXI/LnJlcG9ydElubGluZWQoCiAgICAgICAgICBmdW5jdGlvbiwKICAgICAgICAgIF9pbmxpbmluZ1N0YWNrLmlzRW1wdHkKICAgICAgICAgICAgICA/IHRhcmdldEVsZW1lbnQKICAgICAgICAgICAgICA6IF9pbmxpbmluZ1N0YWNrLmxhc3QuZnVuY3Rpb24pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLy8gUmV0dXJucyBhIGNvbXBsZXRlIGFyZ3VtZW50IGxpc3QgZm9yIGEgY2FsbCBvZiBbZnVuY3Rpb25dLgogIExpc3Q8SEluc3RydWN0aW9uPiBfY29tcGxldGVDYWxsQXJndW1lbnRzTGlzdCgKICAgICAgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24sCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBMaXN0PEhJbnN0cnVjdGlvbj4gcHJvdmlkZWRBcmd1bWVudHMsCiAgICAgIGlyLk5vZGUgY3VycmVudE5vZGUpIHsKICAgIGFzc2VydChwcm92aWRlZEFyZ3VtZW50cyAhPSBudWxsKTsKCiAgICBib29sIGlzSW5zdGFuY2VNZW1iZXIgPSBmdW5jdGlvbi5pc0luc3RhbmNlTWVtYmVyOwogICAgLy8gRm9yIHN0YXRpYyBjYWxscywgW3Byb3ZpZGVkQXJndW1lbnRzXSBpcyBjb21wbGV0ZSwgZGVmYXVsdCBhcmd1bWVudHMKICAgIC8vIGhhdmUgYmVlbiBpbmNsdWRlZCBpZiBuZWNlc3NhcnksIHNlZSBbbWFrZVN0YXRpY0FyZ3VtZW50TGlzdF0uCiAgICBpZiAoIWlzSW5zdGFuY2VNZW1iZXIgfHwKICAgICAgICBjdXJyZW50Tm9kZSA9PSBudWxsIHx8IC8vIEluIGVycm9uZW91cyBjb2RlLCBjdXJyZW50Tm9kZSBjYW4gYmUgbnVsbC4KICAgICAgICBfcHJvdmlkZWRBcmd1bWVudHNLbm93blRvQmVDb21wbGV0ZShjdXJyZW50Tm9kZSkgfHwKICAgICAgICBmdW5jdGlvbiBpcyBDb25zdHJ1Y3RvckJvZHlFbnRpdHkgfHwKICAgICAgICBzZWxlY3Rvci5pc0dldHRlcikgewogICAgICAvLyBGb3IgdGhlc2UgY2FzZXMsIHRoZSBwcm92aWRlZCBhcmd1bWVudCBsaXN0IGlzIGtub3duIHRvIGJlIGNvbXBsZXRlLgogICAgICByZXR1cm4gcHJvdmlkZWRBcmd1bWVudHM7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gX2NvbXBsZXRlRHluYW1pY0NhbGxBcmd1bWVudHNMaXN0KAogICAgICAgICAgc2VsZWN0b3IsIGZ1bmN0aW9uLCBwcm92aWRlZEFyZ3VtZW50cyk7CiAgICB9CiAgfQoKICAvLy8gUmV0dXJucyBhIGNvbXBsZXRlIGFyZ3VtZW50IGxpc3QgZm9yIGEgZHluYW1pYyBjYWxsIG9mIFtmdW5jdGlvbl0uIFRoZQogIC8vLyBpbml0aWFsIGFyZ3VtZW50IGxpc3QgW3Byb3ZpZGVkQXJndW1lbnRzXSwgY3JlYXRlZCBieQogIC8vLyBbYWRkRHluYW1pY1NlbmRBcmd1bWVudHNUb0xpc3RdLCBkb2VzIG5vdCBpbmNsdWRlIHZhbHVlcyBmb3IgZGVmYXVsdAogIC8vLyBhcmd1bWVudHMgdXNlZCBpbiB0aGUgY2FsbC4gVGhlIHJlYXNvbiBpcyB0aGF0IHRoZSB0YXJnZXQgZnVuY3Rpb24gKHdoaWNoCiAgLy8vIGRlZmluZXMgdGhlIGRlZmF1bHRzKSBpcyBub3Qga25vd24uCiAgLy8vCiAgLy8vIEhvd2V2ZXIsIGlubGluaW5nIGNhbiBvbmx5IGJlIHBlcmZvcm1lZCB3aGVuIHRoZSB0YXJnZXQgZnVuY3Rpb24gY2FuIGJlCiAgLy8vIHJlc29sdmVkIHN0YXRpY2FsbHkuIFRoZSBkZWZhdWx0cyBjYW4gdGhlcmVmb3JlIGJlIGluY2x1ZGVkIGF0IHRoaXMgcG9pbnQuCiAgLy8vCiAgLy8vIFRoZSBbcHJvdmlkZWRBcmd1bWVudHNdIGxpc3QgY29udGFpbnMgZmlyc3QgYWxsIHBvc2l0aW9uYWwgYXJndW1lbnRzLCB0aGVuCiAgLy8vIHRoZSBwcm92aWRlZCBuYW1lZCBhcmd1bWVudHMgKHRoZSBuYW1lZCBhcmd1bWVudHMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUKICAvLy8gW3NlbGVjdG9yXSkgaW4gYSBzcGVjaWZpYyBvcmRlciAoc2VlIFthZGREeW5hbWljU2VuZEFyZ3VtZW50c1RvTGlzdF0pLgogIExpc3Q8SEluc3RydWN0aW9uPiBfY29tcGxldGVEeW5hbWljQ2FsbEFyZ3VtZW50c0xpc3QoU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uLCBMaXN0PEhJbnN0cnVjdGlvbj4gcHJvdmlkZWRBcmd1bWVudHMpIHsKICAgIGFzc2VydChzZWxlY3Rvci5hcHBsaWVzKGZ1bmN0aW9uKSk7CiAgICBDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUgPSBzZWxlY3Rvci5jYWxsU3RydWN0dXJlOwogICAgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSA9IGZ1bmN0aW9uLnBhcmFtZXRlclN0cnVjdHVyZTsKICAgIExpc3Q8U3RyaW5nPiBzZWxlY3RvckFyZ3VtZW50TmFtZXMgPQogICAgICAgIHNlbGVjdG9yLmNhbGxTdHJ1Y3R1cmUuZ2V0T3JkZXJlZE5hbWVkQXJndW1lbnRzKCk7CiAgICBMaXN0PEhJbnN0cnVjdGlvbj4gY29tcGlsZWRBcmd1bWVudHMgPSBuZXcgTGlzdDxISW5zdHJ1Y3Rpb24+KAogICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZS50b3RhbFBhcmFtZXRlcnMgKwogICAgICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmUudHlwZVBhcmFtZXRlcnMgKwogICAgICAgICAgICAxKTsgLy8gUGx1cyBvbmUgZm9yIHJlY2VpdmVyLgoKICAgIGludCBjb21waWxlZEFyZ3VtZW50SW5kZXggPSAwOwoKICAgIC8vIENvcHkgcmVjZWl2ZXIuCiAgICBjb21waWxlZEFyZ3VtZW50c1tjb21waWxlZEFyZ3VtZW50SW5kZXgrK10gPSBwcm92aWRlZEFyZ3VtZW50c1swXTsKCiAgICAvLy8gT2Zmc2V0IG9mIHBvc2l0aW9uYWwgYXJndW1lbnRzIGluIFtwcm92aWRlZEFyZ3VtZW50c10uCiAgICBpbnQgcG9zaXRpb25hbEFyZ3VtZW50T2Zmc2V0ID0gMTsKCiAgICAvLy8gT2Zmc2V0IG9mIG5hbWVkIGFyZ3VtZW50cyBpbiBbcHJvdmlkZWRBcmd1bWVudHNdLgogICAgaW50IG5hbWVkQXJndW1lbnRPZmZzZXQgPSBjYWxsU3RydWN0dXJlLnBvc2l0aW9uYWxBcmd1bWVudENvdW50ICsgMTsKCiAgICBpbnQgcG9zaXRpb25hbEFyZ3VtZW50SW5kZXggPSAwOwogICAgaW50IG5hbWVkQXJndW1lbnRJbmRleCA9IDA7CgogICAgX3dvcmxkQnVpbGRlci5mb3JFYWNoUGFyYW1ldGVyKGZ1bmN0aW9uLAogICAgICAgIChEYXJ0VHlwZSB0eXBlLCBTdHJpbmcgbmFtZSwgQ29uc3RhbnRWYWx1ZSBkZWZhdWx0VmFsdWUpIHsKICAgICAgaWYgKHBvc2l0aW9uYWxBcmd1bWVudEluZGV4IDwgcGFyYW1ldGVyU3RydWN0dXJlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgICAgaWYgKHBvc2l0aW9uYWxBcmd1bWVudEluZGV4IDwgY2FsbFN0cnVjdHVyZS5wb3NpdGlvbmFsQXJndW1lbnRDb3VudCkgewogICAgICAgICAgY29tcGlsZWRBcmd1bWVudHNbY29tcGlsZWRBcmd1bWVudEluZGV4KytdID0gcHJvdmlkZWRBcmd1bWVudHNbCiAgICAgICAgICAgICAgcG9zaXRpb25hbEFyZ3VtZW50T2Zmc2V0ICsgcG9zaXRpb25hbEFyZ3VtZW50SW5kZXgrK107CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFzc2VydChkZWZhdWx0VmFsdWUgIT0gbnVsbCwKICAgICAgICAgICAgICBmYWlsZWRBdChmdW5jdGlvbiwgJ05vIGNvbnN0YW50IGNvbXB1dGVkIGZvciBwYXJhbWV0ZXIgJG5hbWUnKSk7CiAgICAgICAgICBjb21waWxlZEFyZ3VtZW50c1tjb21waWxlZEFyZ3VtZW50SW5kZXgrK10gPQogICAgICAgICAgICAgIGdyYXBoLmFkZENvbnN0YW50KGRlZmF1bHRWYWx1ZSwgY2xvc2VkV29ybGQpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBFeGFtcGxlOgogICAgICAgIC8vICAgICB2b2lkIGZvbyhhLCB7YiwgZCwgY30pCiAgICAgICAgLy8gICAgIGZvbygwLCBkID0gMSwgYiA9IDIpCiAgICAgICAgLy8KICAgICAgICAvLyBwcm92aWRlZEFyZ3VtZW50cyA9IFswLCAyLCAxXQogICAgICAgIC8vIHNlbGVjdG9yQXJndW1lbnROYW1lcyA9IFtiLCBkXQogICAgICAgIC8vIHBhcmFtZXRlclN0cnVjdHVyZS5uYW1lZFBhcmFtZXRlcnMgPSBbYiwgYywgZF0KICAgICAgICAvLwogICAgICAgIC8vIEZvciBlYWNoIHBhcmFtZXRlciBuYW1lIGluIHRoZSBzaWduYXR1cmUsIGlmIHRoZSBhcmd1bWVudCBuYW1lCiAgICAgICAgLy8gbWF0Y2hlcyB3ZSB1c2UgdGhlIG5leHQgcHJvdmlkZWQgYXJndW1lbnQsIG90aGVyd2lzZSB3ZSBnZXQgdGhlCiAgICAgICAgLy8gZGVmYXVsdC4KICAgICAgICBpZiAobmFtZWRBcmd1bWVudEluZGV4IDwgc2VsZWN0b3JBcmd1bWVudE5hbWVzLmxlbmd0aCAmJgogICAgICAgICAgICBuYW1lID09IHNlbGVjdG9yQXJndW1lbnROYW1lc1tuYW1lZEFyZ3VtZW50SW5kZXhdKSB7CiAgICAgICAgICAvLyBUaGUgbmFtZWQgYXJndW1lbnQgd2FzIHByb3ZpZGVkIGluIHRoZSBmdW5jdGlvbiBpbnZvY2F0aW9uLgogICAgICAgICAgY29tcGlsZWRBcmd1bWVudHNbY29tcGlsZWRBcmd1bWVudEluZGV4KytdID0KICAgICAgICAgICAgICBwcm92aWRlZEFyZ3VtZW50c1tuYW1lZEFyZ3VtZW50T2Zmc2V0ICsgbmFtZWRBcmd1bWVudEluZGV4KytdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhc3NlcnQoZGVmYXVsdFZhbHVlICE9IG51bGwsCiAgICAgICAgICAgICAgZmFpbGVkQXQoZnVuY3Rpb24sICdObyBjb25zdGFudCBjb21wdXRlZCBmb3IgcGFyYW1ldGVyICRuYW1lJykpOwogICAgICAgICAgY29tcGlsZWRBcmd1bWVudHNbY29tcGlsZWRBcmd1bWVudEluZGV4KytdID0KICAgICAgICAgICAgICBncmFwaC5hZGRDb25zdGFudChkZWZhdWx0VmFsdWUsIGNsb3NlZFdvcmxkKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgaWYgKHJ0aU5lZWQubWV0aG9kTmVlZHNUeXBlQXJndW1lbnRzKGZ1bmN0aW9uKSkgewogICAgICBpZiAoY2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRDb3VudCA9PQogICAgICAgICAgcGFyYW1ldGVyU3RydWN0dXJlLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgICAgLy8vIE9mZnNldCBvZiB0eXBlIGFyZ3VtZW50cyBpbiBbcHJvdmlkZWRBcmd1bWVudHNdLgogICAgICAgIGludCB0eXBlQXJndW1lbnRPZmZzZXQgPSBjYWxsU3RydWN0dXJlLmFyZ3VtZW50Q291bnQgKyAxOwogICAgICAgIC8vIFBhc3MgZXhwbGljaXQgdHlwZSBhcmd1bWVudHMuCiAgICAgICAgZm9yIChpbnQgdHlwZUFyZ3VtZW50SW5kZXggPSAwOwogICAgICAgICAgICB0eXBlQXJndW1lbnRJbmRleCA8IGNhbGxTdHJ1Y3R1cmUudHlwZUFyZ3VtZW50Q291bnQ7CiAgICAgICAgICAgIHR5cGVBcmd1bWVudEluZGV4KyspIHsKICAgICAgICAgIGNvbXBpbGVkQXJndW1lbnRzW2NvbXBpbGVkQXJndW1lbnRJbmRleCsrXSA9CiAgICAgICAgICAgICAgcHJvdmlkZWRBcmd1bWVudHNbdHlwZUFyZ3VtZW50T2Zmc2V0ICsgdHlwZUFyZ3VtZW50SW5kZXhdOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQoY2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRDb3VudCA9PSAwKTsKICAgICAgICAvLyBQYXNzIHR5cGUgdmFyaWFibGUgYm91bmRzIGFzIHR5cGUgYXJndW1lbnRzLgogICAgICAgIGZvciAoVHlwZVZhcmlhYmxlVHlwZSB0eXBlVmFyaWFibGUgaW4gX2VsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50CiAgICAgICAgICAgIC5nZXRGdW5jdGlvblR5cGVWYXJpYWJsZXMoZnVuY3Rpb24pKSB7CiAgICAgICAgICBjb21waWxlZEFyZ3VtZW50c1tjb21waWxlZEFyZ3VtZW50SW5kZXgrK10gPQogICAgICAgICAgICAgIF9jb21wdXRlVHlwZUFyZ3VtZW50RGVmYXVsdFZhbHVlKGZ1bmN0aW9uLCB0eXBlVmFyaWFibGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGNvbXBpbGVkQXJndW1lbnRzOwogIH0KCiAgSEluc3RydWN0aW9uIF9jb21wdXRlVHlwZUFyZ3VtZW50RGVmYXVsdFZhbHVlKAogICAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwgVHlwZVZhcmlhYmxlVHlwZSB0eXBlVmFyaWFibGUpIHsKICAgIERhcnRUeXBlIGJvdW5kID0gX2VsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50CiAgICAgICAgLmdldFR5cGVWYXJpYWJsZURlZmF1bHRUeXBlKHR5cGVWYXJpYWJsZS5lbGVtZW50KTsKICAgIGlmIChib3VuZC5jb250YWluc1R5cGVWYXJpYWJsZXMpIHsKICAgICAgLy8gVE9ETygzMzQyMik6IFN1cHBvcnQgdHlwZSB2YXJpYWJsZXMgaW4gZGVmYXVsdAogICAgICAvLyB0eXBlcy4gVGVtcG9yYXJpbHkgdXNpbmcgdGhlICJhbnkiIHR5cGUgKGVuY29kZWQgYXMgLTIpIHRvCiAgICAgIC8vIGF2b2lkIGZhaWxpbmcgb24gYm91bmRzIGNoZWNrcy4KICAgICAgcmV0dXJuIGdyYXBoLmFkZENvbnN0YW50SW50KC0yLCBjbG9zZWRXb3JsZCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdHlwZUJ1aWxkZXIuYW5hbHl6ZVR5cGVBcmd1bWVudChib3VuZCwgZnVuY3Rpb24pOwogICAgfQogIH0KCiAgLy8vIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYmVmb3JlIGlubGluaW5nIHRoZSBib2R5IG9mIFtmdW5jdGlvbl0gaW50byB0aGlzCiAgLy8vIFtTc2FHcmFwaEJ1aWxkZXJdLgogIHZvaWQgX2VudGVySW5saW5lZE1ldGhvZChGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGNvbXBpbGVkQXJndW1lbnRzLCBJbnRlcmZhY2VUeXBlIGluc3RhbmNlVHlwZSkgewogICAgS2VybmVsSW5saW5pbmdTdGF0ZSBzdGF0ZSA9IG5ldyBLZXJuZWxJbmxpbmluZ1N0YXRlKAogICAgICAgIGZ1bmN0aW9uLAogICAgICAgIF9yZXR1cm5Mb2NhbCwKICAgICAgICBfcmV0dXJuVHlwZSwKICAgICAgICBzdGFjaywKICAgICAgICBsb2NhbHNIYW5kbGVyLAogICAgICAgIGluVHJ5U3RhdGVtZW50LAogICAgICAgIF9pc0NhbGxlZE9uY2UoZnVuY3Rpb24pKTsKICAgIF9pbmxpbmluZ1N0YWNrLmFkZChzdGF0ZSk7CgogICAgLy8gU2V0dGluZyB1cCB0aGUgc3RhdGUgb2YgdGhlIChBU1QpIGJ1aWxkZXIgaXMgcGVyZm9ybWVkIGV2ZW4gd2hlbiB0aGUKICAgIC8vIGlubGluZWQgZnVuY3Rpb24gaXMgaW4gSVIsIGJlY2F1c2UgdGhlIGlySW5saW5lciB1c2VzIHRoZSBbcmV0dXJuRWxlbWVudF0KICAgIC8vIG9mIHRoZSBBU1QgYnVpbGRlci4KICAgIF9zZXR1cFN0YXRlRm9ySW5saW5pbmcoZnVuY3Rpb24sIGNvbXBpbGVkQXJndW1lbnRzLCBpbnN0YW5jZVR5cGUpOwogIH0KCiAgLy8vIFRoaXMgbWV0aG9kIHNldHMgdXAgdGhlIGxvY2FsIHN0YXRlIG9mIHRoZSBidWlsZGVyIGZvciBpbmxpbmluZwogIC8vLyBbZnVuY3Rpb25dLiBUaGUgYXJndW1lbnRzIG9mIHRoZSBmdW5jdGlvbiBhcmUgaW5zZXJ0ZWQgaW50byB0aGUKICAvLy8gW2xvY2Fsc0hhbmRsZXJdLgogIC8vLwogIC8vLyBXaGVuIGlubGluaW5nIGEgZnVuY3Rpb24sIFs6cmV0dXJuOl0gc3RhdGVtZW50cyBhcmUgbm90IGVtaXR0ZWQgYXMKICAvLy8gW0hSZXR1cm5dIGluc3RydWN0aW9ucy4gSW5zdGVhZCwgdGhlIHZhbHVlIG9mIGEgc3ludGhldGljIGVsZW1lbnQgaXMKICAvLy8gdXBkYXRlZCBpbiB0aGUgW2xvY2Fsc0hhbmRsZXJdLiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgc3VjaCBhbiBlbGVtZW50IGFuZAogIC8vLyBzdG9yZXMgaXQgaW4gdGhlIFtfcmV0dXJuTG9jYWxdIGZpZWxkLgogIHZvaWQgX3NldHVwU3RhdGVGb3JJbmxpbmluZyhGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGNvbXBpbGVkQXJndW1lbnRzLCBJbnRlcmZhY2VUeXBlIGluc3RhbmNlVHlwZSkgewogICAgbG9jYWxzSGFuZGxlciA9IG5ldyBMb2NhbHNIYW5kbGVyKAogICAgICAgIHRoaXMsCiAgICAgICAgZnVuY3Rpb24sCiAgICAgICAgZnVuY3Rpb24sCiAgICAgICAgaW5zdGFuY2VUeXBlID8/IF9lbGVtZW50TWFwLmdldE1lbWJlclRoaXNUeXBlKGZ1bmN0aW9uKSwKICAgICAgICBuYXRpdmVEYXRhLAogICAgICAgIGludGVyY2VwdG9yRGF0YSk7CiAgICBsb2NhbHNIYW5kbGVyLnNjb3BlSW5mbyA9IGNsb3N1cmVEYXRhTG9va3VwLmdldFNjb3BlSW5mbyhmdW5jdGlvbik7CgogICAgQ2FwdHVyZWRTY29wZSBzY29wZURhdGEgPSBjbG9zdXJlRGF0YUxvb2t1cC5nZXRDYXB0dXJlZFNjb3BlKGZ1bmN0aW9uKTsKICAgIGJvb2wgZm9yR2VuZXJhdGl2ZUNvbnN0cnVjdG9yQm9keSA9IGZ1bmN0aW9uIGlzIENvbnN0cnVjdG9yQm9keUVudGl0eTsKCiAgICBfcmV0dXJuTG9jYWwgPSBuZXcgU3ludGhldGljTG9jYWwoInJlc3VsdCIsIGZ1bmN0aW9uLCBmdW5jdGlvbik7CiAgICBsb2NhbHNIYW5kbGVyLnVwZGF0ZUxvY2FsKF9yZXR1cm5Mb2NhbCwgZ3JhcGguYWRkQ29uc3RhbnROdWxsKGNsb3NlZFdvcmxkKSk7CgogICAgaW5UcnlTdGF0ZW1lbnQgPSBmYWxzZTsgLy8gVE9ETyhscnkpOiB3aHk/IERvY3VtZW50LgoKICAgIGludCBhcmd1bWVudEluZGV4ID0gMDsKICAgIGlmIChmdW5jdGlvbi5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgIGxvY2Fsc0hhbmRsZXIudXBkYXRlTG9jYWwobG9jYWxzSGFuZGxlci5zY29wZUluZm8udGhpc0xvY2FsLAogICAgICAgICAgY29tcGlsZWRBcmd1bWVudHNbYXJndW1lbnRJbmRleCsrXSk7CiAgICB9CgogICAgYm9vbCBoYXNCb3ggPSBmYWxzZTsKICAgIEtlcm5lbFRvTG9jYWxzTWFwIGxvY2Fsc01hcCA9CiAgICAgICAgY2xvc2VkV29ybGQuZ2xvYmFsTG9jYWxzTWFwLmdldExvY2Fsc01hcChmdW5jdGlvbik7CiAgICBmb3JFYWNoT3JkZXJlZFBhcmFtZXRlcihfZWxlbWVudE1hcCwgZnVuY3Rpb24sCiAgICAgICAgKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIHtib29sIGlzRWxpZGVkfSkgewogICAgICBMb2NhbCBsb2NhbCA9IGxvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKHZhcmlhYmxlKTsKICAgICAgaWYgKGlzRWxpZGVkKSB7CiAgICAgICAgbG9jYWxzSGFuZGxlci51cGRhdGVMb2NhbChsb2NhbCwgX2RlZmF1bHRWYWx1ZUZvclBhcmFtZXRlcih2YXJpYWJsZSkpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoZm9yR2VuZXJhdGl2ZUNvbnN0cnVjdG9yQm9keSAmJiBzY29wZURhdGEuaXNCb3hlZFZhcmlhYmxlKGxvY2FsKSkgewogICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgd2lsbCBiZSBhIGZpZWxkIGluIHRoZSBib3ggcGFzc2VkIGFzIHRoZSBsYXN0CiAgICAgICAgLy8gcGFyYW1ldGVyLiBTbyBubyBuZWVkIHRvIGhhdmUgaXQuCiAgICAgICAgaGFzQm94ID0gdHJ1ZTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgSEluc3RydWN0aW9uIGFyZ3VtZW50ID0gY29tcGlsZWRBcmd1bWVudHNbYXJndW1lbnRJbmRleCsrXTsKICAgICAgbG9jYWxzSGFuZGxlci51cGRhdGVMb2NhbChsb2NhbCwgYXJndW1lbnQpOwogICAgfSk7CgogICAgaWYgKGhhc0JveCkgewogICAgICBISW5zdHJ1Y3Rpb24gYm94ID0gY29tcGlsZWRBcmd1bWVudHNbYXJndW1lbnRJbmRleCsrXTsKICAgICAgYXNzZXJ0KGJveCBpcyBIQ3JlYXRlQm94KTsKICAgICAgLy8gVE9ETyhzcmEpOiBNYWtlIGlubGluaW5nIG9mIGNsb3N1cmVzIHdvcmsuIFdlIHNob3VsZCBhbHdheXMgY2FsbAogICAgICAvLyBlbnRlclNjb3BlLCBhbmQgcGFzcyBpbiB0aGUgaW5saW5lZCAndGhpcycgYXMgd2VsbCBhcyB0aGUgJ2JveCcuCiAgICAgIGxvY2Fsc0hhbmRsZXIuZW50ZXJTY29wZShzY29wZURhdGEsIG51bGwsCiAgICAgICAgICBpbmxpbmVkQm94OiBib3gsCiAgICAgICAgICBmb3JHZW5lcmF0aXZlQ29uc3RydWN0b3JCb2R5OiBmb3JHZW5lcmF0aXZlQ29uc3RydWN0b3JCb2R5KTsKICAgIH0KCiAgICBDbGFzc0VudGl0eSBlbmNsb3NpbmcgPSBmdW5jdGlvbi5lbmNsb3NpbmdDbGFzczsKICAgIGlmICgoZnVuY3Rpb24uaXNDb25zdHJ1Y3RvciB8fCBmdW5jdGlvbiBpcyBDb25zdHJ1Y3RvckJvZHlFbnRpdHkpICYmCiAgICAgICAgcnRpTmVlZC5jbGFzc05lZWRzVHlwZUFyZ3VtZW50cyhlbmNsb3NpbmcpKSB7CiAgICAgIEludGVyZmFjZVR5cGUgdGhpc1R5cGUgPQogICAgICAgICAgX2VsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50LmdldFRoaXNUeXBlKGVuY2xvc2luZyk7CiAgICAgIHRoaXNUeXBlLnR5cGVBcmd1bWVudHMuZm9yRWFjaCgoX3R5cGVWYXJpYWJsZSkgewogICAgICAgIFR5cGVWYXJpYWJsZVR5cGUgdHlwZVZhcmlhYmxlID0gX3R5cGVWYXJpYWJsZTsKICAgICAgICBISW5zdHJ1Y3Rpb24gYXJndW1lbnQgPSBjb21waWxlZEFyZ3VtZW50c1thcmd1bWVudEluZGV4KytdOwogICAgICAgIGxvY2Fsc0hhbmRsZXIudXBkYXRlTG9jYWwoCiAgICAgICAgICAgIGxvY2Fsc0hhbmRsZXIuZ2V0VHlwZVZhcmlhYmxlQXNMb2NhbCh0eXBlVmFyaWFibGUpLCBhcmd1bWVudCk7CiAgICAgIH0pOwogICAgfQogICAgaWYgKHJ0aU5lZWQubWV0aG9kTmVlZHNUeXBlQXJndW1lbnRzKGZ1bmN0aW9uKSkgewogICAgICBib29sIGlubGluZVR5cGVQYXJhbWV0ZXJzID0KICAgICAgICAgIGZ1bmN0aW9uLnBhcmFtZXRlclN0cnVjdHVyZS50eXBlUGFyYW1ldGVycyA9PSAwOwogICAgICBmb3IgKFR5cGVWYXJpYWJsZVR5cGUgdHlwZVZhcmlhYmxlIGluIF9lbGVtZW50TWFwLmVsZW1lbnRFbnZpcm9ubWVudAogICAgICAgICAgLmdldEZ1bmN0aW9uVHlwZVZhcmlhYmxlcyhmdW5jdGlvbikpIHsKICAgICAgICBISW5zdHJ1Y3Rpb24gYXJndW1lbnQ7CiAgICAgICAgaWYgKGlubGluZVR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgICAgICAvLyBBZGQgaW5saW5lZCB0eXBlIHBhcmFtZXRlcnMuCiAgICAgICAgICBhcmd1bWVudCA9IF9jb21wdXRlVHlwZUFyZ3VtZW50RGVmYXVsdFZhbHVlKGZ1bmN0aW9uLCB0eXBlVmFyaWFibGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhcmd1bWVudCA9IGNvbXBpbGVkQXJndW1lbnRzW2FyZ3VtZW50SW5kZXgrK107CiAgICAgICAgfQogICAgICAgIGxvY2Fsc0hhbmRsZXIudXBkYXRlTG9jYWwoCiAgICAgICAgICAgIGxvY2Fsc0hhbmRsZXIuZ2V0VHlwZVZhcmlhYmxlQXNMb2NhbCh0eXBlVmFyaWFibGUpLCBhcmd1bWVudCk7CiAgICAgIH0KICAgIH0KICAgIGFzc2VydCgKICAgICAgICBhcmd1bWVudEluZGV4ID09IGNvbXBpbGVkQXJndW1lbnRzLmxlbmd0aCB8fAogICAgICAgICAgICAhcnRpTmVlZC5tZXRob2ROZWVkc1R5cGVBcmd1bWVudHMoZnVuY3Rpb24pICYmCiAgICAgICAgICAgICAgICBjb21waWxlZEFyZ3VtZW50cy5sZW5ndGggLSBhcmd1bWVudEluZGV4ID09CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24ucGFyYW1ldGVyU3RydWN0dXJlLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBmdW5jdGlvbiwKICAgICAgICAgICAgIk9ubHkgJHthcmd1bWVudEluZGV4fSBvZiAke2NvbXBpbGVkQXJndW1lbnRzLmxlbmd0aH0gIgogICAgICAgICAgICAiYXJndW1lbnRzIGhhdmUgYmVlbiByZWFkIGZyb206ICR7Y29tcGlsZWRBcmd1bWVudHN9IHBhc3NlZCB0byAiCiAgICAgICAgICAgICIkZnVuY3Rpb24uIikpOwoKICAgIF9yZXR1cm5UeXBlID0KICAgICAgICBfZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQuZ2V0RnVuY3Rpb25UeXBlKGZ1bmN0aW9uKS5yZXR1cm5UeXBlOwogICAgc3RhY2sgPSA8SEluc3RydWN0aW9uPltdOwoKICAgIF9pbnNlcnRDb3ZlcmFnZUNhbGwoZnVuY3Rpb24pOwogIH0KCiAgdm9pZCBfbGVhdmVJbmxpbmVkTWV0aG9kKCkgewogICAgSEluc3RydWN0aW9uIHJlc3VsdCA9IGxvY2Fsc0hhbmRsZXIucmVhZExvY2FsKF9yZXR1cm5Mb2NhbCk7CiAgICBLZXJuZWxJbmxpbmluZ1N0YXRlIHN0YXRlID0gX2lubGluaW5nU3RhY2sucmVtb3ZlTGFzdCgpOwogICAgX3Jlc3RvcmVTdGF0ZShzdGF0ZSk7CiAgICBzdGFjay5hZGQocmVzdWx0KTsKICB9CgogIHZvaWQgX3Jlc3RvcmVTdGF0ZShLZXJuZWxJbmxpbmluZ1N0YXRlIHN0YXRlKSB7CiAgICBsb2NhbHNIYW5kbGVyID0gc3RhdGUub2xkTG9jYWxzSGFuZGxlcjsKICAgIF9yZXR1cm5Mb2NhbCA9IHN0YXRlLm9sZFJldHVybkxvY2FsOwogICAgaW5UcnlTdGF0ZW1lbnQgPSBzdGF0ZS5pblRyeVN0YXRlbWVudDsKICAgIF9yZXR1cm5UeXBlID0gc3RhdGUub2xkUmV0dXJuVHlwZTsKICAgIGFzc2VydChzdGFjay5pc0VtcHR5KTsKICAgIHN0YWNrID0gc3RhdGUub2xkU3RhY2s7CiAgfQoKICBib29sIF9wcm92aWRlZEFyZ3VtZW50c0tub3duVG9CZUNvbXBsZXRlKGlyLk5vZGUgY3VycmVudE5vZGUpIHsKICAgIC8qIFdoZW4gaW5saW5pbmcgdGhlIGl0ZXJhdG9yIG1ldGhvZHMgZ2VuZXJhdGVkIGZvciBhIFs6Zm9yLWluOl0gbG9vcCwgdGhlCiAgICAgKiBbY3VycmVudE5vZGVdIGlzIHRoZSBbRm9ySW5dIHRyZWUuIFRoZSBjb21waWxlci1nZW5lcmF0ZWQgaXRlcmF0b3IKICAgICAqIGludm9jYXRpb25zIGFyZSBrbm93biB0byBoYXZlIGZ1bGx5IHNwZWNpZmllZCBhcmd1bWVudCBsaXN0cywgbm8gZGVmYXVsdAogICAgICogYXJndW1lbnRzIGFyZSB1c2VkLiBTZWUgaW52b2NhdGlvbnMgb2YgW3B1c2hJbnZva2VEeW5hbWljXSBpbgogICAgICogW3Zpc2l0Rm9ySW5dLgogICAgICovCiAgICAvLyBUT0RPKHJlZGVtcHRpb24pOiBJcyB0aGlzIHZhbGlkIGhlcmU/CiAgICByZXR1cm4gY3VycmVudE5vZGUgaXMgaXIuRm9ySW5TdGF0ZW1lbnQ7CiAgfQoKICB2b2lkIF9lbWl0UmV0dXJuKEhJbnN0cnVjdGlvbiB2YWx1ZSwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIGlmIChfaW5saW5pbmdTdGFjay5pc0VtcHR5KSB7CiAgICAgIGNsb3NlQW5kR290b0V4aXQoCiAgICAgICAgICBuZXcgSFJldHVybihhYnN0cmFjdFZhbHVlRG9tYWluLCB2YWx1ZSwgc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0gZWxzZSB7CiAgICAgIGxvY2Fsc0hhbmRsZXIudXBkYXRlTG9jYWwoX3JldHVybkxvY2FsLCB2YWx1ZSk7CiAgICB9CiAgfQoKICB2b2lkIF9kb0lubGluZShGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikgewogICAgX3Zpc2l0SW5saW5lZEZ1bmN0aW9uKGZ1bmN0aW9uKTsKICB9CgogIC8vLyBSdW4gdGhpcyBidWlsZGVyIG9uIHRoZSBib2R5IG9mIHRoZSBbZnVuY3Rpb25dIHRvIGJlIGlubGluZWQuCiAgdm9pZCBfdmlzaXRJbmxpbmVkRnVuY3Rpb24oRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pIHsKICAgIF9wb3RlbnRpYWxseUNoZWNrSW5saW5lZFBhcmFtZXRlclR5cGVzKGZ1bmN0aW9uKTsKCiAgICBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24gPSBfZWxlbWVudE1hcC5nZXRNZW1iZXJEZWZpbml0aW9uKGZ1bmN0aW9uKTsKICAgIHN3aXRjaCAoZGVmaW5pdGlvbi5raW5kKSB7CiAgICAgIGNhc2UgTWVtYmVyS2luZC5jb25zdHJ1Y3RvcjoKICAgICAgICBidWlsZENvbnN0cnVjdG9yKGZ1bmN0aW9uLCBkZWZpbml0aW9uLm5vZGUpOwogICAgICAgIHJldHVybjsKICAgICAgY2FzZSBNZW1iZXJLaW5kLmNvbnN0cnVjdG9yQm9keToKICAgICAgICBpci5Db25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IGRlZmluaXRpb24ubm9kZTsKICAgICAgICBjb25zdHJ1Y3Rvci5mdW5jdGlvbi5ib2R5LmFjY2VwdCh0aGlzKTsKICAgICAgICByZXR1cm47CiAgICAgIGNhc2UgTWVtYmVyS2luZC5yZWd1bGFyOgogICAgICAgIGlyLk5vZGUgbm9kZSA9IGRlZmluaXRpb24ubm9kZTsKICAgICAgICBpZiAobm9kZSBpcyBpci5Db25zdHJ1Y3RvcikgewogICAgICAgICAgbm9kZS5mdW5jdGlvbi5ib2R5LmFjY2VwdCh0aGlzKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaXMgaXIuUHJvY2VkdXJlKSB7CiAgICAgICAgICBub2RlLmZ1bmN0aW9uLmJvZHkuYWNjZXB0KHRoaXMpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBNZW1iZXJLaW5kLmNsb3N1cmVDYWxsOgogICAgICAgIGlyLk5vZGUgbm9kZSA9IGRlZmluaXRpb24ubm9kZTsKICAgICAgICBpZiAobm9kZSBpcyBpci5GdW5jdGlvbkV4cHJlc3Npb24pIHsKICAgICAgICAgIG5vZGUuZnVuY3Rpb24uYm9keS5hY2NlcHQodGhpcyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfSBlbHNlIGlmIChub2RlIGlzIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24pIHsKICAgICAgICAgIG5vZGUuZnVuY3Rpb24uYm9keS5hY2NlcHQodGhpcyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGJyZWFrOwogICAgfQogICAgZmFpbGVkQXQoZnVuY3Rpb24sICJVbmV4cGVjdGVkIGlubGluZWQgZnVuY3Rpb246ICRkZWZpbml0aW9uIik7CiAgfQoKICAvLy8gR2VuZXJhdGVzIHR5cGUgdGVzdHMgZm9yIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBpbmxpbmVkIGZ1bmN0aW9uLgogIHZvaWQgX3BvdGVudGlhbGx5Q2hlY2tJbmxpbmVkUGFyYW1ldGVyVHlwZXMoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pIHsKICAgIGlmICghdHlwZUJ1aWxkZXIuY2hlY2tPclRydXN0VHlwZXMpIHJldHVybjsKCiAgICAvLyBUT0RPKHNyYSk6IEluY29ycG9yYXRlIHByb3BlcnRpZXMgb2YgY2FsbCBzaXRlIHRvIGhlbHAgZGV0ZXJtaW5lIHdoaWNoCiAgICAvLyB0eXBlIHBhcmFtZXRlcnMgYW5kIHZhbHVlIHBhcmFtZXRlcnMgbmVlZCB0byBiZSBjaGVja2VkLgogICAgYm9vbCB0cnVzdGVkID0gZmFsc2U7CiAgICBpZiAoZnVuY3Rpb24uaXNTdGF0aWMgfHwKICAgICAgICBmdW5jdGlvbi5pc1RvcExldmVsIHx8CiAgICAgICAgZnVuY3Rpb24uaXNDb25zdHJ1Y3RvciB8fAogICAgICAgIGZ1bmN0aW9uIGlzIENvbnN0cnVjdG9yQm9keUVudGl0eSkgewogICAgICAvLyBXZSBpbmxpbmUgc3RhdGljIG1ldGhvZHMsIHRvcC1sZXZlbCBtZXRob2RzLCBjb25zdHJ1Y3RvcnMgYW5kCiAgICAgIC8vIGNvbnN0cnVjdG9yIGJvZGllcyBvbmx5IGZyb20gZGlyZWN0IGNhbGwgc2l0ZXMuCiAgICAgIHRydXN0ZWQgPSB0cnVlOwogICAgfQoKICAgIGlmICghdHJ1c3RlZCkgewogICAgICBjaGVja1R5cGVWYXJpYWJsZUJvdW5kcyhmdW5jdGlvbik7CiAgICB9CgogICAgS2VybmVsVG9Mb2NhbHNNYXAgbG9jYWxzTWFwID0KICAgICAgICBjbG9zZWRXb3JsZC5nbG9iYWxMb2NhbHNNYXAuZ2V0TG9jYWxzTWFwKGZ1bmN0aW9uKTsKICAgIGZvckVhY2hPcmRlcmVkUGFyYW1ldGVyKF9lbGVtZW50TWFwLCBmdW5jdGlvbiwKICAgICAgICAoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwge2Jvb2wgaXNFbGlkZWR9KSB7CiAgICAgIExvY2FsIHBhcmFtZXRlciA9IGxvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKHZhcmlhYmxlKTsKICAgICAgSEluc3RydWN0aW9uIGFyZ3VtZW50ID0gbG9jYWxzSGFuZGxlci5yZWFkTG9jYWwocGFyYW1ldGVyKTsKICAgICAgRGFydFR5cGUgdHlwZSA9IGxvY2Fsc01hcC5nZXRMb2NhbFR5cGUoX2VsZW1lbnRNYXAsIHBhcmFtZXRlcik7CiAgICAgIEhJbnN0cnVjdGlvbiBjaGVja2VkT3JUcnVzdGVkOwogICAgICBpZiAodHJ1c3RlZCkgewogICAgICAgIGNoZWNrZWRPclRydXN0ZWQgPSB0eXBlQnVpbGRlci50cnVzdFR5cGVPZlBhcmFtZXRlcihhcmd1bWVudCwgdHlwZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY2hlY2tlZE9yVHJ1c3RlZCA9CiAgICAgICAgICAgIHR5cGVCdWlsZGVyLnBvdGVudGlhbGx5Q2hlY2tPclRydXN0VHlwZU9mUGFyYW1ldGVyKGFyZ3VtZW50LCB0eXBlKTsKICAgICAgfQogICAgICBsb2NhbHNIYW5kbGVyLnVwZGF0ZUxvY2FsKHBhcmFtZXRlciwgY2hlY2tlZE9yVHJ1c3RlZCk7CiAgICB9KTsKICB9CgogIGJvb2wgZ2V0IF9hbGxJbmxpbmVkRnVuY3Rpb25zQ2FsbGVkT25jZSB7CiAgICByZXR1cm4gX2lubGluaW5nU3RhY2suaXNFbXB0eSB8fCBfaW5saW5pbmdTdGFjay5sYXN0LmFsbEZ1bmN0aW9uc0NhbGxlZE9uY2U7CiAgfQoKICBib29sIF9pc0Z1bmN0aW9uQ2FsbGVkT25jZShGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICAvLyBDb25zdHJ1Y3RvckJvZHlFbGVtZW50cyBhcmUgbm90IGluIHRoZSB0eXBlIGluZmVyZW5jZSBncmFwaC4KICAgIGlmIChlbGVtZW50IGlzIENvbnN0cnVjdG9yQm9keUVudGl0eSkgewogICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gc3ViY2xhc3NlcyB3aXRoIGNvbnN0cnVjdG9ycyB0aGF0IGhhdmUgdGhpcyBjb25zdHJ1Y3RvcgogICAgICAvLyBhcyBhIHN1cGVyY29uc3RydWN0b3IsIGl0IGlzIGNhbGxlZCBvbmNlIGJ5IHRoZSBnZW5lcmF0aXZlCiAgICAgIC8vIGNvbnN0cnVjdG9yJ3MgZmFjdG9yeS4gIEEgc2ltcGxpZmllZCB2ZXJzaW9uIGlzIHRvIGNoZWNrIHRoaXMgaXMgYQogICAgICAvLyBjb25zdHJ1Y3RvciBib2R5IGZvciBhIGxlYWYgY2xhc3MuCiAgICAgIENsYXNzRW50aXR5IGNsYXNzXyA9IGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3M7CiAgICAgIGlmIChjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc0RpcmVjdGx5SW5zdGFudGlhdGVkKGNsYXNzXykpIHsKICAgICAgICByZXR1cm4gIWNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmlzSW5kaXJlY3RseUluc3RhbnRpYXRlZChjbGFzc18pOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiBnbG9iYWxJbmZlcmVuY2VSZXN1bHRzLnJlc3VsdE9mTWVtYmVyKGVsZW1lbnQpLmlzQ2FsbGVkT25jZTsKICB9CgogIGJvb2wgX2lzQ2FsbGVkT25jZShGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gX2FsbElubGluZWRGdW5jdGlvbnNDYWxsZWRPbmNlICYmIF9pc0Z1bmN0aW9uQ2FsbGVkT25jZShlbGVtZW50KTsKICB9CgogIHZvaWQgX2luc2VydENvdmVyYWdlQ2FsbChNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgaWYgKCFvcHRpb25zLmV4cGVyaW1lbnRDYWxsSW5zdHJ1bWVudGF0aW9uKSByZXR1cm47CiAgICBpZiAoZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy50cmFjZUhlbHBlcikgcmV0dXJuOwogICAgLy8gVE9ETyhzaWdtdW5kKTogY3JlYXRlIGEgYmV0dGVyIHV1aWQgZm9yIGVsZW1lbnRzLgogICAgSENvbnN0YW50IGlkQ29uc3RhbnQgPSBncmFwaC5hZGRDb25zdGFudEludChlbGVtZW50Lmhhc2hDb2RlLCBjbG9zZWRXb3JsZCk7CiAgICBuKGUpID0+IGUgPT0gbnVsbCA/ICcnIDogZS5uYW1lOwogICAgU3RyaW5nIG5hbWUgPSAiJHtuKGVsZW1lbnQubGlicmFyeSl9OiR7bihlbGVtZW50LmVuY2xvc2luZ0NsYXNzKX0uIgogICAgICAgICIke24oZWxlbWVudCl9IjsKICAgIEhDb25zdGFudCBuYW1lQ29uc3RhbnQgPSBncmFwaC5hZGRDb25zdGFudFN0cmluZyhuYW1lLCBjbG9zZWRXb3JsZCk7CiAgICBhZGQobmV3IEhJbnZva2VTdGF0aWMoCiAgICAgICAgY29tbW9uRWxlbWVudHMudHJhY2VIZWxwZXIsCiAgICAgICAgPEhJbnN0cnVjdGlvbj5baWRDb25zdGFudCwgbmFtZUNvbnN0YW50XSwKICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlLAogICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bXSkpOwogIH0KfQoKLy8vIERhdGEgY29sbGVjdGVkIHRvIGNyZWF0ZSBhIGNvbnN0cnVjdG9yLgpjbGFzcyBDb25zdHJ1Y3RvckRhdGEgewogIC8vLyBJbmxpbmVkIChzdXBlcikgY29uc3RydWN0b3JzLgogIGZpbmFsIExpc3Q8aXIuQ29uc3RydWN0b3I+IGNvbnN0cnVjdG9yQ2hhaW4gPSA8aXIuQ29uc3RydWN0b3I+W107CgogIC8vLyBJbml0aWFsIHZhbHVlcyBmb3IgYWxsIGluc3RhbmNlIGZpZWxkcy4KICBmaW5hbCBNYXA8RmllbGRFbnRpdHksIEhJbnN0cnVjdGlvbj4gZmllbGRWYWx1ZXMgPQogICAgICA8RmllbGRFbnRpdHksIEhJbnN0cnVjdGlvbj57fTsKCiAgLy8vIENsYXNzZXMgZm9yIHdoaWNoIHR5cGUgdmFyaWFibGVzIGhhdmUgYmVlbiBwcmVwYXJlZC4KICBmaW5hbCBTZXQ8Q2xhc3NFbnRpdHk+IGluY2x1ZGVkQ2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7Cn0KCmNsYXNzIEtlcm5lbElubGluaW5nU3RhdGUgewogIGZpbmFsIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uOwogIGZpbmFsIExvY2FsIG9sZFJldHVybkxvY2FsOwogIGZpbmFsIERhcnRUeXBlIG9sZFJldHVyblR5cGU7CiAgZmluYWwgTGlzdDxISW5zdHJ1Y3Rpb24+IG9sZFN0YWNrOwogIGZpbmFsIExvY2Fsc0hhbmRsZXIgb2xkTG9jYWxzSGFuZGxlcjsKICBmaW5hbCBib29sIGluVHJ5U3RhdGVtZW50OwogIGZpbmFsIGJvb2wgYWxsRnVuY3Rpb25zQ2FsbGVkT25jZTsKCiAgS2VybmVsSW5saW5pbmdTdGF0ZSgKICAgICAgdGhpcy5mdW5jdGlvbiwKICAgICAgdGhpcy5vbGRSZXR1cm5Mb2NhbCwKICAgICAgdGhpcy5vbGRSZXR1cm5UeXBlLAogICAgICB0aGlzLm9sZFN0YWNrLAogICAgICB0aGlzLm9sZExvY2Fsc0hhbmRsZXIsCiAgICAgIHRoaXMuaW5UcnlTdGF0ZW1lbnQsCiAgICAgIHRoaXMuYWxsRnVuY3Rpb25zQ2FsbGVkT25jZSk7Cn0KCmNsYXNzIElubGluZVdlZWRlciBleHRlbmRzIGlyLlZpc2l0b3IgewogIC8vIEludmFyaWFudDogKklOU0lERV9MT09QKiA+ICpPVVRTSURFX0xPT1AqCiAgc3RhdGljIGNvbnN0IElOTElOSU5HX05PREVTX09VVFNJREVfTE9PUCA9IDE1OwogIHN0YXRpYyBjb25zdCBJTkxJTklOR19OT0RFU19PVVRTSURFX0xPT1BfQVJHX0ZBQ1RPUiA9IDM7CiAgc3RhdGljIGNvbnN0IElOTElOSU5HX05PREVTX0lOU0lERV9MT09QID0gMzQ7CiAgc3RhdGljIGNvbnN0IElOTElOSU5HX05PREVTX0lOU0lERV9MT09QX0FSR19GQUNUT1IgPSA0OwoKICBzdGF0aWMgYm9vbCBjYW5CZUlubGluZWQoCiAgICAgIEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uLCBpbnQgbWF4SW5saW5pbmdOb2RlcywKICAgICAge2Jvb2wgYWxsb3dMb29wczogZmFsc2UsIGJvb2wgZW5hYmxlVXNlckFzc2VydGlvbnM6IG51bGx9KSB7CiAgICByZXR1cm4gY2Fubm90QmVJbmxpbmVkUmVhc29uKGVsZW1lbnRNYXAsIGZ1bmN0aW9uLCBtYXhJbmxpbmluZ05vZGVzLAogICAgICAgICAgICBhbGxvd0xvb3BzOiBhbGxvd0xvb3BzLAogICAgICAgICAgICBlbmFibGVVc2VyQXNzZXJ0aW9uczogZW5hYmxlVXNlckFzc2VydGlvbnMpID09CiAgICAgICAgbnVsbDsKICB9CgogIHN0YXRpYyBTdHJpbmcgY2Fubm90QmVJbmxpbmVkUmVhc29uKAogICAgICBKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwLCBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwgaW50IG1heElubGluaW5nTm9kZXMsCiAgICAgIHtib29sIGFsbG93TG9vcHM6IGZhbHNlLCBib29sIGVuYWJsZVVzZXJBc3NlcnRpb25zOiBudWxsfSkgewogICAgSW5saW5lV2VlZGVyIHZpc2l0b3IgPQogICAgICAgIG5ldyBJbmxpbmVXZWVkZXIobWF4SW5saW5pbmdOb2RlcywgYWxsb3dMb29wcywgZW5hYmxlVXNlckFzc2VydGlvbnMpOwogICAgaXIuRnVuY3Rpb25Ob2RlIG5vZGUgPSBnZXRGdW5jdGlvbk5vZGUoZWxlbWVudE1hcCwgZnVuY3Rpb24pOwogICAgbm9kZS5hY2NlcHQodmlzaXRvcik7CiAgICBpZiAoZnVuY3Rpb24uaXNDb25zdHJ1Y3RvcikgewogICAgICBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24gPSBlbGVtZW50TWFwLmdldE1lbWJlckRlZmluaXRpb24oZnVuY3Rpb24pOwogICAgICBpci5Ob2RlIG5vZGUgPSBkZWZpbml0aW9uLm5vZGU7CiAgICAgIGlmIChub2RlIGlzIGlyLkNvbnN0cnVjdG9yKSB7CiAgICAgICAgbm9kZS5pbml0aWFsaXplcnMuZm9yRWFjaCgobikgPT4gbi5hY2NlcHQodmlzaXRvcikpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdmlzaXRvci50b29EaWZmaWN1bHRSZWFzb247CiAgfQoKICBmaW5hbCBpbnQgbWF4SW5saW5pbmdOb2RlczsgLy8gYG51bGxgIGZvciB1bmJvdW5kZWQuCiAgZmluYWwgYm9vbCBhbGxvd0xvb3BzOwogIGZpbmFsIGJvb2wgZW5hYmxlVXNlckFzc2VydGlvbnM7CgogIGJvb2wgc2VlblJldHVybiA9IGZhbHNlOwogIGludCBub2RlQ291bnQgPSAwOwogIFN0cmluZyB0b29EaWZmaWN1bHRSZWFzb247CiAgYm9vbCBnZXQgdG9vRGlmZmljdWx0ID0+IHRvb0RpZmZpY3VsdFJlYXNvbiAhPSBudWxsOwoKICBJbmxpbmVXZWVkZXIoCiAgICAgIHRoaXMubWF4SW5saW5pbmdOb2RlcywgdGhpcy5hbGxvd0xvb3BzLCB0aGlzLmVuYWJsZVVzZXJBc3NlcnRpb25zKTsKCiAgYm9vbCByZWdpc3Rlck5vZGUoKSB7CiAgICBpZiAobWF4SW5saW5pbmdOb2RlcyA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChub2RlQ291bnQrKyA+IG1heElubGluaW5nTm9kZXMpIHsKICAgICAgdG9vRGlmZmljdWx0UmVhc29uID8/PSAndG9vIG1hbnkgbm9kZXMnOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGRlZmF1bHROb2RlKGlyLk5vZGUgbm9kZSkgewogICAgaWYgKHRvb0RpZmZpY3VsdCkgcmV0dXJuOwogICAgaWYgKCFyZWdpc3Rlck5vZGUoKSkgcmV0dXJuOwogICAgaWYgKHNlZW5SZXR1cm4pIHsKICAgICAgdG9vRGlmZmljdWx0UmVhc29uID8/PSAnY29kZSBhZnRlciByZXR1cm4nOwogICAgICByZXR1cm47CiAgICB9CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFJldHVyblN0YXRlbWVudChpci5SZXR1cm5TdGF0ZW1lbnQgbm9kZSkgewogICAgaWYgKCFyZWdpc3Rlck5vZGUoKSkgcmV0dXJuOwogICAgaWYgKHNlZW5SZXR1cm4pIHsKICAgICAgdG9vRGlmZmljdWx0UmVhc29uID8/PSAnY29kZSBhZnRlciByZXR1cm4nOwogICAgICByZXR1cm47CiAgICB9CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgICBzZWVuUmV0dXJuID0gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VGhyb3coaXIuVGhyb3cgbm9kZSkgewogICAgaWYgKCFyZWdpc3Rlck5vZGUoKSkgcmV0dXJuOwogICAgaWYgKHNlZW5SZXR1cm4pIHsKICAgICAgdG9vRGlmZmljdWx0UmVhc29uID8/PSAnY29kZSBhZnRlciByZXR1cm4nOwogICAgICByZXR1cm47CiAgICB9CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBfaGFuZGxlTG9vcChpci5Ob2RlIG5vZGUpIHsKICAgIC8vIEl0J3MgYWN0dWFsbHkgbm90IGRpZmZpY3VsdCB0byBpbmxpbmUgYSBtZXRob2Qgd2l0aCBhIGxvb3AsIGJ1dCBvdXIKICAgIC8vIG1lYXN1cmVtZW50cyBzaG93IHRoYXQgaXQncyBjdXJyZW50bHkgYmV0dGVyIHRvIG5vdCBpbmxpbmUgYSBtZXRob2QgdGhhdAogICAgLy8gY29udGFpbnMgYSBsb29wLgogICAgaWYgKCFhbGxvd0xvb3BzKSB0b29EaWZmaWN1bHRSZWFzb24gPz89ICdsb29wJzsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Rm9yU3RhdGVtZW50KGlyLkZvclN0YXRlbWVudCBub2RlKSB7CiAgICBfaGFuZGxlTG9vcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Rm9ySW5TdGF0ZW1lbnQoaXIuRm9ySW5TdGF0ZW1lbnQgbm9kZSkgewogICAgX2hhbmRsZUxvb3Aobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFdoaWxlU3RhdGVtZW50KGlyLldoaWxlU3RhdGVtZW50IG5vZGUpIHsKICAgIF9oYW5kbGVMb29wKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXREb1N0YXRlbWVudChpci5Eb1N0YXRlbWVudCBub2RlKSB7CiAgICBfaGFuZGxlTG9vcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VHJ5Q2F0Y2goaXIuVHJ5Q2F0Y2ggbm9kZSkgewogICAgdG9vRGlmZmljdWx0UmVhc29uID8/PSAndHJ5JzsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VHJ5RmluYWxseShpci5UcnlGaW5hbGx5IG5vZGUpIHsKICAgIHRvb0RpZmZpY3VsdFJlYXNvbiA/Pz0gJ3RyeSc7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbihpci5GdW5jdGlvbkV4cHJlc3Npb24gbm9kZSkgewogICAgaWYgKCFyZWdpc3Rlck5vZGUoKSkgcmV0dXJuOwogICAgdG9vRGlmZmljdWx0UmVhc29uID8/PSAnY2xvc3VyZSc7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24oaXIuRnVuY3Rpb25EZWNsYXJhdGlvbiBub2RlKSB7CiAgICBpZiAoIXJlZ2lzdGVyTm9kZSgpKSByZXR1cm47CiAgICB0b29EaWZmaWN1bHRSZWFzb24gPz89ICdjbG9zdXJlJzsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RnVuY3Rpb25Ob2RlKGlyLkZ1bmN0aW9uTm9kZSBub2RlKSB7CiAgICBpZiAobm9kZS5hc3luY01hcmtlciAhPSBpci5Bc3luY01hcmtlci5TeW5jKSB7CiAgICAgIHRvb0RpZmZpY3VsdFJlYXNvbiA/Pz0gJ2FzeW5jL2F3YWl0JzsKICAgICAgcmV0dXJuOwogICAgfQogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDb25kaXRpb25hbEV4cHJlc3Npb24oaXIuQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKICAgIC8vIEhldXJpc3RpYzogSW4gInBhcmFtZXRlciA/IEEgOiBCIiB0aGVyZSBpcyBhIGhpZ2ggcHJvYmFiaWxpdHkgdGhhdAogICAgLy8gcGFyYW1ldGVyIGlzIGEgY29uc3RhbnQuIEFzc3VtaW5nIHRoZSBwYXJhbWV0ZXIgaXMgY29uc3RhbnQsIHdlIGNhbgogICAgLy8gY29tcHV0ZSBhIGNvdW50IHRoYXQgaXMgYm91bmRlZCBieSB0aGUgbGFyZ2VzdCBhcm0gcmF0aGVyIHRoYW4gdGhlIHN1bSBvZgogICAgLy8gYm90aCBhcm1zLgogICAgaXIuRXhwcmVzc2lvbiBjb25kaXRpb24gPSBub2RlLmNvbmRpdGlvbjsKICAgIGNvbmRpdGlvbi5hY2NlcHQodGhpcyk7CiAgICBpZiAodG9vRGlmZmljdWx0KSByZXR1cm47CiAgICBpbnQgY29tbW9uUHJlZml4Q291bnQgPSBub2RlQ291bnQ7CgogICAgbm9kZS50aGVuLmFjY2VwdCh0aGlzKTsKICAgIGlmICh0b29EaWZmaWN1bHQpIHJldHVybjsKICAgIGludCB0aGVuQ291bnQgPSBub2RlQ291bnQgLSBjb21tb25QcmVmaXhDb3VudDsKCiAgICBub2RlQ291bnQgPSBjb21tb25QcmVmaXhDb3VudDsKICAgIG5vZGUub3RoZXJ3aXNlLmFjY2VwdCh0aGlzKTsKICAgIGlmICh0b29EaWZmaWN1bHQpIHJldHVybjsKICAgIGludCBlbHNlQ291bnQgPSBub2RlQ291bnQgLSBjb21tb25QcmVmaXhDb3VudDsKCiAgICBub2RlQ291bnQgPSBjb21tb25QcmVmaXhDb3VudCArIHRoZW5Db3VudCArIGVsc2VDb3VudDsKICAgIGlmIChjb25kaXRpb24gaXMgaXIuVmFyaWFibGVHZXQgJiYKICAgICAgICBjb25kaXRpb24udmFyaWFibGUucGFyZW50IGlzIGlyLkZ1bmN0aW9uTm9kZSkgewogICAgICBub2RlQ291bnQgPQogICAgICAgICAgY29tbW9uUHJlZml4Q291bnQgKyAodGhlbkNvdW50ID4gZWxzZUNvdW50ID8gdGhlbkNvdW50IDogZWxzZUNvdW50KTsKICAgIH0KICAgIC8vIFRoaXMgaXMgbGFzdCBzbyB0aGF0IFt0b29EaWZmaWN1bHRdIGlzIGFsd2F5cyB1cGRhdGVkLgogICAgaWYgKCFyZWdpc3Rlck5vZGUoKSkgcmV0dXJuOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRBc3NlcnRJbml0aWFsaXplcihpci5Bc3NlcnRJbml0aWFsaXplciBub2RlKSB7CiAgICBpZiAoIWVuYWJsZVVzZXJBc3NlcnRpb25zKSByZXR1cm47CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEFzc2VydFN0YXRlbWVudChpci5Bc3NlcnRTdGF0ZW1lbnQgbm9kZSkgewogICAgaWYgKCFlbmFibGVVc2VyQXNzZXJ0aW9ucykgcmV0dXJuOwogICAgZGVmYXVsdE5vZGUobm9kZSk7CiAgfQp9CgovLy8gRGV0ZXJtaW5lcyBpZiBpbmxpbmluZyBhIGZ1bmN0aW9uIGlzIHZlcnkgbGlrZWx5IHRvIHJlZHVjZSBjb2RlIHNpemUuCmNsYXNzIElubGluZVJlZHVjdGl2ZVdlZWRlciBleHRlbmRzIGlyLlZpc2l0b3IgewogIC8vIFdlIGFsbG93IHRoZSBib2R5IHRvIGJlIGEgc2luZ2xlIGZ1bmN0aW9uIGNhbGwgdGhhdCBkb2VzIG5vdCBoYXZlIGFueSBtb3JlCiAgLy8gaW5wdXRzIHRoYW4gdGhlIGlubGluZWUuCiAgLy8KICAvLyBXZSBhbGxvdyB0aGUgYm9keSB0byBiZSB0aGUgcmV0dXJuIG9mIGFuICdlbGlnaWJsZScgY29uc3RhbnQuIEEgY29uc3RhbnQgaXMKICAvLyAnZWxpZ2libGUnIGlmIGl0IGlzIG5vdCBsYXJnZSAoZS5nLiBhIGxvbmcgc3RyaW5nKS4KICAvLwogIC8vIFdlIHNraXAgJ2UgYXN7VHlwZUVycm9yfSBUJyB3aGVuIHRoZSBjaGVja3MgYXJlIG9taXR0ZWQuCiAgLy8KICAvLwogIC8vIFRPRE8oc3JhKTogQ29uc2lkZXIgc2xpZ2h0bHkgZXhwYW5zaXZlIHNpbXBsZSBjb25zdHJ1Y3RvcnMgd2hlcmUgYWxsIHdlCiAgLy8gZ2FpbiBpcyBhICduZXcnIGtleXdvcmQsIGUuZy4gYG5ldyBYLkZvbyhhKWAgdnMgYFguRm9vJChhKWAuCiAgLy8KICAvLyBUT0RPKDI1MjMxKTogTWFrZSBsYXJnZXIgc3RyaW5nIGNvbnN0YW50cyBlbGlnaWJsZSBieSBzaGFyaW5nIHJlZmVyZW5jZXMuCgogIHN0YXRpYyBib29sIGNhbkJlSW5saW5lZCgKICAgICAgSnNUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24sIGludCBhcmd1bWVudENvdW50LAogICAgICB7Ym9vbCBlbmFibGVVc2VyQXNzZXJ0aW9uczogbnVsbCwgYm9vbCBvbWl0SW1wbGljaXRDYXN0czogbnVsbH0pIHsKICAgIHJldHVybiBjYW5ub3RCZUlubGluZWRSZWFzb24oZWxlbWVudE1hcCwgZnVuY3Rpb24sIGFyZ3VtZW50Q291bnQsCiAgICAgICAgICAgIGVuYWJsZVVzZXJBc3NlcnRpb25zOiBlbmFibGVVc2VyQXNzZXJ0aW9ucywKICAgICAgICAgICAgb21pdEltcGxpY2l0Q2FzdHM6IG9taXRJbXBsaWNpdENhc3RzKSA9PQogICAgICAgIG51bGw7CiAgfQoKICBzdGF0aWMgU3RyaW5nIGNhbm5vdEJlSW5saW5lZFJlYXNvbigKICAgICAgSnNUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24sIGludCBhcmd1bWVudENvdW50LAogICAgICB7Ym9vbCBlbmFibGVVc2VyQXNzZXJ0aW9uczogbnVsbCwgYm9vbCBvbWl0SW1wbGljaXRDYXN0czogbnVsbH0pIHsKICAgIGFzc2VydChlbmFibGVVc2VyQXNzZXJ0aW9ucyAhPSBudWxsKTsKICAgIGFzc2VydChvbWl0SW1wbGljaXRDYXN0cyAhPSBudWxsKTsKICAgIHZhciB2aXNpdG9yID0gbmV3IElubGluZVJlZHVjdGl2ZVdlZWRlcigKICAgICAgICBhcmd1bWVudENvdW50LCBlbmFibGVVc2VyQXNzZXJ0aW9ucywgb21pdEltcGxpY2l0Q2FzdHMpOwogICAgaXIuRnVuY3Rpb25Ob2RlIG5vZGUgPSBnZXRGdW5jdGlvbk5vZGUoZWxlbWVudE1hcCwgZnVuY3Rpb24pOwogICAgaWYgKGZ1bmN0aW9uLmlzQ29uc3RydWN0b3IpIHsKICAgICAgcmV0dXJuIHZpc2l0b3IudG9vRGlmZmljdWx0UmVhc29uID8/PSAnY29uc3RydWN0b3InOwogICAgfQogICAgbm9kZS5hY2NlcHQodmlzaXRvcik7CiAgICByZXR1cm4gdmlzaXRvci50b29EaWZmaWN1bHRSZWFzb247CiAgfQoKICBmaW5hbCBpbnQgYXJndW1lbnRDb3VudDsKICBmaW5hbCBib29sIGVuYWJsZVVzZXJBc3NlcnRpb25zOwogIGZpbmFsIGJvb2wgb21pdEltcGxpY2l0Q2FzdHM7CiAgZmluYWwgaW50IG1heElubGluaW5nTm9kZXM7CgogIGJvb2wgc2VlblJldHVybiA9IGZhbHNlOwogIGludCBub2RlQ291bnQgPSAwOwogIGludCBjYWxsQ291bnQgPSAwOwogIFN0cmluZyB0b29EaWZmaWN1bHRSZWFzb247CiAgYm9vbCBnZXQgdG9vRGlmZmljdWx0ID0+IHRvb0RpZmZpY3VsdFJlYXNvbiAhPSBudWxsOwoKICBJbmxpbmVSZWR1Y3RpdmVXZWVkZXIoCiAgICAgIHRoaXMuYXJndW1lbnRDb3VudCwgdGhpcy5lbmFibGVVc2VyQXNzZXJ0aW9ucywgdGhpcy5vbWl0SW1wbGljaXRDYXN0cykKICAgICAgOgogICAgICAgIC8vIE5vZGUgYnVkZ2V0IHRoYXQgY292ZXJzIG9uZSBjYWxsIGFuZCB0aGUgcGFzc2VkLWluIGFyZ3VtZW50cy4KICAgICAgICAvLyBUaGUgKzEgYWxzbyBhbGxvd3MgYSB0b3AtbGV2ZWwgemVyby1hcmd1bWVudCB0byBiZSBpbmxpbmVkIGlmIGl0CiAgICAgICAgLy8gcmV0dXJucyBhIGNvbnN0YW50LgogICAgICAgIG1heElubGluaW5nTm9kZXMgPSBhcmd1bWVudENvdW50ICsgMTsKCiAgYm9vbCByZWdpc3Rlck5vZGUoKSB7CiAgICBpZiAoKytub2RlQ291bnQgPiBtYXhJbmxpbmluZ05vZGVzKSB7CiAgICAgIHRvb0RpZmZpY3VsdFJlYXNvbiA/Pz0gJ3RvbyBtYW55IG5vZGVzJzsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBib29sIHJlZ2lzdGVyQ2FsbCgpIHsKICAgIGlmICgrK2NhbGxDb3VudCA+IDEpIHsKICAgICAgdG9vRGlmZmljdWx0UmVhc29uID8/PSAndG9vIG1hbnkgY2FsbHMnOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGRlZmF1bHROb2RlKGlyLk5vZGUgbm9kZSkgewogICAgaWYgKHRvb0RpZmZpY3VsdCkgcmV0dXJuOwogICAgaWYgKHNlZW5SZXR1cm4pIHsKICAgICAgdG9vRGlmZmljdWx0UmVhc29uID8/PSAnY29kZSBhZnRlciByZXR1cm4nOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIXJlZ2lzdGVyTm9kZSgpKSByZXR1cm47CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFJldHVyblN0YXRlbWVudChpci5SZXR1cm5TdGF0ZW1lbnQgbm9kZSkgewogICAgaWYgKHNlZW5SZXR1cm4pIHsKICAgICAgdG9vRGlmZmljdWx0UmVhc29uID8/PSAnY29kZSBhZnRlciByZXR1cm4nOwogICAgICByZXR1cm47CiAgICB9CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgICBzZWVuUmV0dXJuID0gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VGhyb3coaXIuVGhyb3cgbm9kZSkgewogICAgdG9vRGlmZmljdWx0UmVhc29uID8/PSAndGhyb3cnOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRFbXB0eVN0YXRlbWVudChpci5FbXB0eVN0YXRlbWVudCBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoaXIuRXhwcmVzc2lvblN0YXRlbWVudCBub2RlKSB7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEJsb2NrKGlyLkJsb2NrIG5vZGUpIHsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0U3RyaW5nTGl0ZXJhbChpci5TdHJpbmdMaXRlcmFsIG5vZGUpIHsKICAgIHJlZ2lzdGVyTm9kZSgpOwogICAgLy8gQXZvaWQgY29weWluZyBsb25nIHN0cmluZ3MgaW50byBjYWxsIHNpdGUuCiAgICBpZiAobm9kZS52YWx1ZS5sZW5ndGggPiAxNCkgdG9vRGlmZmljdWx0UmVhc29uID8/PSAnbG9uZyBzdHJpbmcnOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRQcm9wZXJ0eUdldChpci5Qcm9wZXJ0eUdldCBub2RlKSB7CiAgICBpZiAoIXJlZ2lzdGVyQ2FsbCgpKSByZXR1cm47CiAgICBpZiAoIXJlZ2lzdGVyTm9kZSgpKSByZXR1cm47CiAgICBub2RlLnJlY2VpdmVyLmFjY2VwdCh0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RGlyZWN0UHJvcGVydHlHZXQoaXIuRGlyZWN0UHJvcGVydHlHZXQgbm9kZSkgewogICAgaWYgKCFyZWdpc3RlckNhbGwoKSkgcmV0dXJuOwogICAgaWYgKCFyZWdpc3Rlck5vZGUoKSkgcmV0dXJuOwogICAgbm9kZS5yZWNlaXZlci5hY2NlcHQodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFByb3BlcnR5U2V0KGlyLlByb3BlcnR5U2V0IG5vZGUpIHsKICAgIGlmICghcmVnaXN0ZXJDYWxsKCkpIHJldHVybjsKICAgIGlmICghcmVnaXN0ZXJOb2RlKCkpIHJldHVybjsKICAgIG5vZGUucmVjZWl2ZXIuYWNjZXB0KHRoaXMpOwogICAgbm9kZS52YWx1ZS5hY2NlcHQodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdERpcmVjdFByb3BlcnR5U2V0KGlyLkRpcmVjdFByb3BlcnR5U2V0IG5vZGUpIHsKICAgIGlmICghcmVnaXN0ZXJDYWxsKCkpIHJldHVybjsKICAgIGlmICghcmVnaXN0ZXJOb2RlKCkpIHJldHVybjsKICAgIG5vZGUucmVjZWl2ZXIuYWNjZXB0KHRoaXMpOwogICAgbm9kZS52YWx1ZS5hY2NlcHQodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFZhcmlhYmxlR2V0KGlyLlZhcmlhYmxlR2V0IG5vZGUpIHsKICAgIHJlZ2lzdGVyTm9kZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRUaGlzRXhwcmVzc2lvbihpci5UaGlzRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZWdpc3Rlck5vZGUoKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0U3RhdGljR2V0KGlyLlN0YXRpY0dldCBub2RlKSB7CiAgICAvLyBBc3N1bWUgbGF6eS1pbml0IHN0YXRpYywgbG9hZGVkIHZpYSBhIGNhbGw6IGAkLiRnZXQkZm9vKClgLgogICAgaWYgKCFyZWdpc3RlckNhbGwoKSkgcmV0dXJuOwogICAgcmVnaXN0ZXJOb2RlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihpci5Db25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewogICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICAvLyBBIGNvbnN0IGNvbnN0cnVjdG9yIGNhbGwgY29tcGlsZXMgdG8gYSBjb25zdGFudCBwb29sIHJlZmVyZW5jZS4KICAgICAgcmVnaXN0ZXJOb2RlKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghcmVnaXN0ZXJDYWxsKCkpIHJldHVybjsKICAgIGlmICghcmVnaXN0ZXJOb2RlKCkpIHJldHVybjsKICAgIF9wcm9jZXNzQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzLCBub2RlLnRhcmdldD8uZnVuY3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKGlyLlN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICB0b29EaWZmaWN1bHRSZWFzb24gPz89ICdleHRlcm5hbCBjb25zdCBjb25zdHJ1Y3Rvcic7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghcmVnaXN0ZXJDYWxsKCkpIHJldHVybjsKICAgIGlmICghcmVnaXN0ZXJOb2RlKCkpIHJldHVybjsKICAgIF9wcm9jZXNzQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzLCBub2RlLnRhcmdldD8uZnVuY3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRNZXRob2RJbnZvY2F0aW9uKGlyLk1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgaWYgKCFyZWdpc3RlckNhbGwoKSkgcmV0dXJuOwogICAgaWYgKCFyZWdpc3Rlck5vZGUoKSkgcmV0dXJuOwogICAgbm9kZS5yZWNlaXZlci5hY2NlcHQodGhpcyk7CiAgICBfcHJvY2Vzc0FyZ3VtZW50cyhub2RlLmFyZ3VtZW50cywgbnVsbCk7CiAgfQoKICBfcHJvY2Vzc0FyZ3VtZW50cyhpci5Bcmd1bWVudHMgYXJndW1lbnRzLCBpci5GdW5jdGlvbk5vZGUgdGFyZ2V0KSB7CiAgICBpZiAoYXJndW1lbnRzLnR5cGVzLmlzTm90RW1wdHkpIHsKICAgICAgdG9vRGlmZmljdWx0UmVhc29uID8/PSAndHlwZSBhcmd1bWVudHMnOwogICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgY291bnQgPSBhcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGggKyBhcmd1bWVudHMubmFtZWQubGVuZ3RoOwogICAgaWYgKGNvdW50ID4gYXJndW1lbnRDb3VudCkgewogICAgICB0b29EaWZmaWN1bHRSZWFzb24gPz89ICdpbmNyZWFzaW5nIGFyZ3VtZW50cyc7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHsKICAgICAgLy8gRGlzYWxsb3cgZGVmYXVsdGVkIG9wdGlvbmFsIGFyZ3VtZW50cyBzaW5jZSB0aGV5IHdpbGwgYmUgcGFzc2VkCiAgICAgIC8vIGV4cGxpY2l0bHkuCiAgICAgIGlmICh0YXJnZXQucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoICsgdGFyZ2V0Lm5hbWVkUGFyYW1ldGVycy5sZW5ndGggPgogICAgICAgICAgY291bnQpIHsKICAgICAgICB0b29EaWZmaWN1bHRSZWFzb24gPz89ICdhcmd1bWVudCBkZWZhdWx0aW5nJzsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICBmb3IgKHZhciBlIGluIGFyZ3VtZW50cy5wb3NpdGlvbmFsKSB7CiAgICAgIGUuYWNjZXB0KHRoaXMpOwogICAgICBpZiAodG9vRGlmZmljdWx0KSByZXR1cm47CiAgICB9CiAgICBmb3IgKHZhciBlIGluIGFyZ3VtZW50cy5uYW1lZCkgewogICAgICBlLnZhbHVlLmFjY2VwdCh0aGlzKTsKICAgICAgaWYgKHRvb0RpZmZpY3VsdCkgcmV0dXJuOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRBc0V4cHJlc3Npb24oaXIuQXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIGlmIChub2RlLmlzVHlwZUVycm9yICYmIG9taXRJbXBsaWNpdENhc3RzKSB7CiAgICAgIG5vZGUub3BlcmFuZC5hY2NlcHQodGhpcyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRvb0RpZmZpY3VsdFJlYXNvbiA/Pz0gJ2Nhc3QnOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgLy8gQSBsb2NhbCB2YXJpYWJsZSBpcyBhbiBhbGlhcyBmb3IgdGhlIGluaXRpYWxpemVyIGV4cHJlc3Npb24uCiAgICBpZiAobm9kZS5pbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgIC0tbm9kZUNvdW50OyAvLyBkaXNjb3VudCBvbmUgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZS4KICAgICAgbm9kZS5pbml0aWFsaXplci5hY2NlcHQodGhpcyk7CiAgICAgIHJldHVybjsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0Rm9yU3RhdGVtZW50KGlyLkZvclN0YXRlbWVudCBub2RlKSB7CiAgICB0b29EaWZmaWN1bHRSZWFzb24gPz89ICdsb29wJzsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Rm9ySW5TdGF0ZW1lbnQoaXIuRm9ySW5TdGF0ZW1lbnQgbm9kZSkgewogICAgdG9vRGlmZmljdWx0UmVhc29uID8/PSAnbG9vcCc7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFdoaWxlU3RhdGVtZW50KGlyLldoaWxlU3RhdGVtZW50IG5vZGUpIHsKICAgIHRvb0RpZmZpY3VsdFJlYXNvbiA/Pz0gJ2xvb3AnOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXREb1N0YXRlbWVudChpci5Eb1N0YXRlbWVudCBub2RlKSB7CiAgICB0b29EaWZmaWN1bHRSZWFzb24gPz89ICdsb29wJzsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VHJ5Q2F0Y2goaXIuVHJ5Q2F0Y2ggbm9kZSkgewogICAgdG9vRGlmZmljdWx0UmVhc29uID8/PSAndHJ5JzsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VHJ5RmluYWxseShpci5UcnlGaW5hbGx5IG5vZGUpIHsKICAgIHRvb0RpZmZpY3VsdFJlYXNvbiA/Pz0gJ3RyeSc7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdElmU3RhdGVtZW50KGlyLklmU3RhdGVtZW50IG5vZGUpIHsKICAgIHRvb0RpZmZpY3VsdFJlYXNvbiA/Pz0gJ2lmJzsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKGlyLkZ1bmN0aW9uRXhwcmVzc2lvbiBub2RlKSB7CiAgICB0b29EaWZmaWN1bHRSZWFzb24gPz89ICdjbG9zdXJlJzsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihpci5GdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpIHsKICAgIHRvb0RpZmZpY3VsdFJlYXNvbiA/Pz0gJ2Nsb3N1cmUnOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGdW5jdGlvbk5vZGUoaXIuRnVuY3Rpb25Ob2RlIG5vZGUpIHsKICAgIGlmIChub2RlLmFzeW5jTWFya2VyICE9IGlyLkFzeW5jTWFya2VyLlN5bmMpIHsKICAgICAgdG9vRGlmZmljdWx0UmVhc29uID8/PSAnYXN5bmMvYXdhaXQnOwogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBUT0RPKHNyYSk6IENvc3Qgb2YgcGFyYW1ldGVyIGNoZWNraW5nPwogICAgbm9kZS5ib2R5LmFjY2VwdCh0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uKGlyLkNvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7CiAgICBpZiAoIXJlZ2lzdGVyTm9kZSgpKSByZXR1cm47CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEFzc2VydEluaXRpYWxpemVyKGlyLkFzc2VydEluaXRpYWxpemVyIG5vZGUpIHsKICAgIGlmICghZW5hYmxlVXNlckFzc2VydGlvbnMpIHJldHVybjsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0QXNzZXJ0U3RhdGVtZW50KGlyLkFzc2VydFN0YXRlbWVudCBub2RlKSB7CiAgICBpZiAoIWVuYWJsZVVzZXJBc3NlcnRpb25zKSByZXR1cm47CiAgICBkZWZhdWx0Tm9kZShub2RlKTsKICB9Cn0KCi8vLyBDbGFzcyBpbiBjaGFyZ2Ugb2YgYnVpbGRpbmcgdHJ5LCBjYXRjaCBhbmQvb3IgZmluYWxseSBibG9ja3MuIFRoaXMgaGFuZGxlcwovLy8gdGhlIGluc3RydWN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgb3V0cHV0IGFuZCB0aGUgZG9taW5hdG9yIGNhbGN1bGF0aW9uIG9mCi8vLyB0aGlzIHNlcXVlbmNlIG9mIGNvZGUuCmNsYXNzIFRyeUNhdGNoRmluYWxseUJ1aWxkZXIgewogIGZpbmFsIEtlcm5lbFNzYUdyYXBoQnVpbGRlciBrZXJuZWxCdWlsZGVyOwogIGZpbmFsIFNvdXJjZUluZm9ybWF0aW9uIHRyeVNvdXJjZUluZm9ybWF0aW9uOwoKICBIQmFzaWNCbG9jayBlbnRlckJsb2NrOwogIEhCYXNpY0Jsb2NrIHN0YXJ0VHJ5QmxvY2s7CiAgSEJhc2ljQmxvY2sgZW5kVHJ5QmxvY2s7CiAgSEJhc2ljQmxvY2sgc3RhcnRDYXRjaEJsb2NrOwogIEhCYXNpY0Jsb2NrIGVuZENhdGNoQmxvY2s7CiAgSEJhc2ljQmxvY2sgc3RhcnRGaW5hbGx5QmxvY2s7CiAgSEJhc2ljQmxvY2sgZW5kRmluYWxseUJsb2NrOwogIEhCYXNpY0Jsb2NrIGV4aXRCbG9jazsKICBIVHJ5IHRyeUluc3RydWN0aW9uOwogIEhMb2NhbFZhbHVlIGV4Y2VwdGlvbjsKCiAgLy8vIFRydWUgaWYgdGhlIGNvZGUgc3Vycm91bmRpbmcgdGhpcyB0cnkgc3RhdGVtZW50IHdhcyBhbHNvIHBhcnQgb2YgYQogIC8vLyB0cnkvY2F0Y2gvZmluYWxseSBzdGF0ZW1lbnQuCiAgYm9vbCBwcmV2aW91c2x5SW5UcnlTdGF0ZW1lbnQ7CgogIFN1YkdyYXBoIGJvZHlHcmFwaDsKICBTdWJHcmFwaCBjYXRjaEdyYXBoOwogIFN1YkdyYXBoIGZpbmFsbHlHcmFwaDsKCiAgLy8gVGhlIG9yaWdpbmFsIHNldCBvZiBsb2NhbHMgdGhhdCB3ZXJlIGRlZmluZWQgYmVmb3JlIHRoaXMgdHJ5IGJsb2NrLgogIC8vIFRoZSBjYXRjaCBibG9jayBhbmQgdGhlIGZpbmFsbHkgYmxvY2sgbXVzdCBub3QgcmV1c2UgdGhlIGV4aXN0aW5nIGxvY2FscwogIC8vIGhhbmRsZXIuIE5vbmUgb2YgdGhlIHZhcmlhYmxlcyB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkIGluIHRoZSBib2R5LWJsb2NrCiAgLy8gd2lsbCBiZSB1c2VkLCBidXQgZm9yIGxvb3BzIHdlIHdpbGwgYWRkICh1bm5lY2Vzc2FyeSkgcGhpcyB0aGF0IHdpbGwKICAvLyByZWZlcmVuY2UgdGhlIGJvZHkgdmFyaWFibGVzLiBUaGlzIG1ha2VzIGl0IGxvb2sgYXMgaWYgdGhlIHZhcmlhYmxlcyB3ZXJlCiAgLy8gdXNlZCBpbiBhIG5vbi1kb21pbmF0ZWQgYmxvY2suCiAgTG9jYWxzSGFuZGxlciBvcmlnaW5hbFNhdmVkTG9jYWxzOwoKICBUcnlDYXRjaEZpbmFsbHlCdWlsZGVyKHRoaXMua2VybmVsQnVpbGRlciwgdGhpcy50cnlTb3VyY2VJbmZvcm1hdGlvbikgewogICAgdHJ5SW5zdHJ1Y3Rpb24gPSBuZXcgSFRyeShrZXJuZWxCdWlsZGVyLmFic3RyYWN0VmFsdWVEb21haW4pOwogICAgb3JpZ2luYWxTYXZlZExvY2FscyA9IG5ldyBMb2NhbHNIYW5kbGVyLmZyb20oa2VybmVsQnVpbGRlci5sb2NhbHNIYW5kbGVyKTsKICAgIGVudGVyQmxvY2sgPSBrZXJuZWxCdWlsZGVyLm9wZW5OZXdCbG9jaygpOwogICAga2VybmVsQnVpbGRlci5jbG9zZSh0cnlJbnN0cnVjdGlvbik7CiAgICBwcmV2aW91c2x5SW5UcnlTdGF0ZW1lbnQgPSBrZXJuZWxCdWlsZGVyLmluVHJ5U3RhdGVtZW50OwogICAga2VybmVsQnVpbGRlci5pblRyeVN0YXRlbWVudCA9IHRydWU7CgogICAgc3RhcnRUcnlCbG9jayA9IGtlcm5lbEJ1aWxkZXIuZ3JhcGguYWRkTmV3QmxvY2soKTsKICAgIGtlcm5lbEJ1aWxkZXIub3BlbihzdGFydFRyeUJsb2NrKTsKICB9CgogIHZvaWQgX2FkZEV4aXRUcnlTdWNjZXNzb3Ioc3VjY2Vzc29yKSB7CiAgICBpZiAoc3VjY2Vzc29yID09IG51bGwpIHJldHVybjsKICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgYmxvY2tzIGNyZWF0ZWQgaW5zaWRlIHRoaXMgdHJ5L2NhdGNoLCBhbmQKICAgIC8vIGF0dGFjaCBzdWNjZXNzb3IgaW5mb3JtYXRpb24gdG8gYmxvY2tzIHRoYXQgZW5kIHdpdGgKICAgIC8vIFtIRXhpdFRyeV0uCiAgICBmb3IgKGludCBpID0gc3RhcnRUcnlCbG9jay5pZDsgaSA8IHN1Y2Nlc3Nvci5pZDsgaSsrKSB7CiAgICAgIEhCYXNpY0Jsb2NrIGJsb2NrID0ga2VybmVsQnVpbGRlci5ncmFwaC5ibG9ja3NbaV07CiAgICAgIHZhciBsYXN0ID0gYmxvY2subGFzdDsKICAgICAgaWYgKGxhc3QgaXMgSEV4aXRUcnkpIHsKICAgICAgICBibG9jay5hZGRTdWNjZXNzb3Ioc3VjY2Vzc29yKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBfYWRkT3B0aW9uYWxTdWNjZXNzb3IoYmxvY2sxLCBibG9jazIpIHsKICAgIGlmIChibG9jazIgIT0gbnVsbCkgYmxvY2sxLmFkZFN1Y2Nlc3NvcihibG9jazIpOwogIH0KCiAgLy8vIEhlbHBlciBmdW5jdGlvbiB0byBzZXQgdXAgYmFzaWMgYmxvY2sgc3VjY2Vzc29ycyBmb3IgdHJ5LWNhdGNoLWZpbmFsbHkKICAvLy8gc2VxdWVuY2VzLgogIHZvaWQgX3NldEJsb2NrU3VjY2Vzc29ycygpIHsKICAgIC8vIFNldHVwIGFsbCBzdWNjZXNzb3JzLiBUaGUgZW50cnkgYmxvY2sgdGhhdCBjb250YWlucyB0aGUgW0hUcnldCiAgICAvLyBoYXMgMSkgdGhlIGJvZHksIDIpIHRoZSBjYXRjaCwgMykgdGhlIGZpbmFsbHksIGFuZCA0KSB0aGUgZXhpdAogICAgLy8gYmxvY2tzIGFzIHN1Y2Nlc3NvcnMuCiAgICBlbnRlckJsb2NrLmFkZFN1Y2Nlc3NvcihzdGFydFRyeUJsb2NrKTsKICAgIF9hZGRPcHRpb25hbFN1Y2Nlc3NvcihlbnRlckJsb2NrLCBzdGFydENhdGNoQmxvY2spOwogICAgX2FkZE9wdGlvbmFsU3VjY2Vzc29yKGVudGVyQmxvY2ssIHN0YXJ0RmluYWxseUJsb2NrKTsKICAgIGVudGVyQmxvY2suYWRkU3VjY2Vzc29yKGV4aXRCbG9jayk7CgogICAgLy8gVGhlIGJvZHkgaGFzIGVpdGhlciB0aGUgY2F0Y2ggb3IgdGhlIGZpbmFsbHkgYmxvY2sgYXMgc3VjY2Vzc29yLgogICAgaWYgKGVuZFRyeUJsb2NrICE9IG51bGwpIHsKICAgICAgYXNzZXJ0KHN0YXJ0Q2F0Y2hCbG9jayAhPSBudWxsIHx8IHN0YXJ0RmluYWxseUJsb2NrICE9IG51bGwpOwogICAgICBlbmRUcnlCbG9jay5hZGRTdWNjZXNzb3IoCiAgICAgICAgICBzdGFydENhdGNoQmxvY2sgIT0gbnVsbCA/IHN0YXJ0Q2F0Y2hCbG9jayA6IHN0YXJ0RmluYWxseUJsb2NrKTsKICAgICAgZW5kVHJ5QmxvY2suYWRkU3VjY2Vzc29yKGV4aXRCbG9jayk7CiAgICB9CgogICAgLy8gVGhlIGNhdGNoIGJsb2NrIGhhcyBlaXRoZXIgdGhlIGZpbmFsbHkgb3IgdGhlIGV4aXQgYmxvY2sgYXMKICAgIC8vIHN1Y2Nlc3Nvci4KICAgIGVuZENhdGNoQmxvY2s/LmFkZFN1Y2Nlc3NvcigKICAgICAgICBzdGFydEZpbmFsbHlCbG9jayAhPSBudWxsID8gc3RhcnRGaW5hbGx5QmxvY2sgOiBleGl0QmxvY2spOwoKICAgIC8vIFRoZSBmaW5hbGx5IGJsb2NrIGhhcyB0aGUgZXhpdCBibG9jayBhcyBzdWNjZXNzb3IuCiAgICBlbmRGaW5hbGx5QmxvY2s/LmFkZFN1Y2Nlc3NvcihleGl0QmxvY2spOwoKICAgIC8vIElmIGEgYmxvY2sgaW5zaWRlIHRyeS9jYXRjaCBhYm9ydHMgKGVnIHdpdGggYSByZXR1cm4gc3RhdGVtZW50KSwKICAgIC8vIHdlIGV4cGxpY2l0bHkgbWFyayB0aGlzIGJsb2NrIGEgcHJlZGVjZXNzb3Igb2YgdGhlIGNhdGNoCiAgICAvLyBibG9jayBhbmQgdGhlIGZpbmFsbHkgYmxvY2suCiAgICBfYWRkRXhpdFRyeVN1Y2Nlc3NvcihzdGFydENhdGNoQmxvY2spOwogICAgX2FkZEV4aXRUcnlTdWNjZXNzb3Ioc3RhcnRGaW5hbGx5QmxvY2spOwogIH0KCiAgLy8vIEJ1aWxkIHRoZSBmaW5hbGx5e30gY2xhdXNlIG9mIGEgdHJ5L3tjYXRjaH0vZmluYWxseSBzdGF0ZW1lbnQuIE5vdGUgdGhpcwogIC8vLyBkb2VzIG5vdCBleGFtaW5lIHRoZSBib2R5IG9mIHRoZSB0cnkgY2xhdXNlLCBvbmx5IHRoZSBmaW5hbGx5IHBvcnRpb24uCiAgdm9pZCBidWlsZEZpbmFsbHlCbG9jayh2b2lkIGJ1aWxkRmluYWxpemVyKCkpIHsKICAgIGtlcm5lbEJ1aWxkZXIubG9jYWxzSGFuZGxlciA9IG5ldyBMb2NhbHNIYW5kbGVyLmZyb20ob3JpZ2luYWxTYXZlZExvY2Fscyk7CiAgICBzdGFydEZpbmFsbHlCbG9jayA9IGtlcm5lbEJ1aWxkZXIuZ3JhcGguYWRkTmV3QmxvY2soKTsKICAgIGtlcm5lbEJ1aWxkZXIub3BlbihzdGFydEZpbmFsbHlCbG9jayk7CiAgICBidWlsZEZpbmFsaXplcigpOwogICAgaWYgKCFrZXJuZWxCdWlsZGVyLmlzQWJvcnRlZCgpKSB7CiAgICAgIGVuZEZpbmFsbHlCbG9jayA9CiAgICAgICAgICBrZXJuZWxCdWlsZGVyLmNsb3NlKG5ldyBIR290byhrZXJuZWxCdWlsZGVyLmFic3RyYWN0VmFsdWVEb21haW4pKTsKICAgIH0KICAgIHRyeUluc3RydWN0aW9uLmZpbmFsbHlCbG9jayA9IHN0YXJ0RmluYWxseUJsb2NrOwogICAgZmluYWxseUdyYXBoID0KICAgICAgICBuZXcgU3ViR3JhcGgoc3RhcnRGaW5hbGx5QmxvY2ssIGtlcm5lbEJ1aWxkZXIubGFzdE9wZW5lZEJsb2NrKTsKICB9CgogIHZvaWQgY2xvc2VUcnlCb2R5KCkgewogICAgLy8gV2UgdXNlIGEgW0hFeGl0VHJ5XSBpbnN0ZWFkIG9mIGEgW0hHb3RvXSBmb3IgdGhlIHRyeSBibG9jawogICAgLy8gYmVjYXVzZSBpdCB3aWxsIGhhdmUgbXVsdGlwbGUgc3VjY2Vzc29yczogdGhlIGpvaW4gYmxvY2ssIGFuZAogICAgLy8gdGhlIGNhdGNoIG9yIGZpbmFsbHkgYmxvY2suCiAgICBpZiAoIWtlcm5lbEJ1aWxkZXIuaXNBYm9ydGVkKCkpIHsKICAgICAgZW5kVHJ5QmxvY2sgPQogICAgICAgICAga2VybmVsQnVpbGRlci5jbG9zZShuZXcgSEV4aXRUcnkoa2VybmVsQnVpbGRlci5hYnN0cmFjdFZhbHVlRG9tYWluKSk7CiAgICB9CiAgICBib2R5R3JhcGggPSBuZXcgU3ViR3JhcGgoc3RhcnRUcnlCbG9jaywga2VybmVsQnVpbGRlci5sYXN0T3BlbmVkQmxvY2spOwogIH0KCiAgdm9pZCBidWlsZENhdGNoKGlyLlRyeUNhdGNoIHRyeUNhdGNoKSB7CiAgICBrZXJuZWxCdWlsZGVyLmxvY2Fsc0hhbmRsZXIgPSBuZXcgTG9jYWxzSGFuZGxlci5mcm9tKG9yaWdpbmFsU2F2ZWRMb2NhbHMpOwogICAgc3RhcnRDYXRjaEJsb2NrID0ga2VybmVsQnVpbGRlci5ncmFwaC5hZGROZXdCbG9jaygpOwogICAga2VybmVsQnVpbGRlci5vcGVuKHN0YXJ0Q2F0Y2hCbG9jayk7CiAgICAvLyBOb3RlIHRoYXQgdGhlIG5hbWUgb2YgdGhpcyBsb2NhbCBpcyBpcnJlbGV2YW50LgogICAgU3ludGhldGljTG9jYWwgbG9jYWwgPSBrZXJuZWxCdWlsZGVyLmxvY2Fsc0hhbmRsZXIuY3JlYXRlTG9jYWwoJ2V4Y2VwdGlvbicpOwogICAgZXhjZXB0aW9uID0KICAgICAgICBuZXcgSExvY2FsVmFsdWUobG9jYWwsIGtlcm5lbEJ1aWxkZXIuYWJzdHJhY3RWYWx1ZURvbWFpbi5ub25OdWxsVHlwZSkKICAgICAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSB0cnlTb3VyY2VJbmZvcm1hdGlvbjsKICAgIGtlcm5lbEJ1aWxkZXIuYWRkKGV4Y2VwdGlvbik7CiAgICBISW5zdHJ1Y3Rpb24gb2xkUmV0aHJvd2FibGVFeGNlcHRpb24gPSBrZXJuZWxCdWlsZGVyLnJldGhyb3dhYmxlRXhjZXB0aW9uOwogICAga2VybmVsQnVpbGRlci5yZXRocm93YWJsZUV4Y2VwdGlvbiA9IGV4Y2VwdGlvbjsKCiAgICBrZXJuZWxCdWlsZGVyLl9wdXNoU3RhdGljSW52b2NhdGlvbigKICAgICAgICBrZXJuZWxCdWlsZGVyLl9jb21tb25FbGVtZW50cy5leGNlcHRpb25VbndyYXBwZXIsCiAgICAgICAgW2V4Y2VwdGlvbl0sCiAgICAgICAga2VybmVsQnVpbGRlci5fdHlwZUluZmVyZW5jZU1hcAogICAgICAgICAgICAuZ2V0UmV0dXJuVHlwZU9mKGtlcm5lbEJ1aWxkZXIuX2NvbW1vbkVsZW1lbnRzLmV4Y2VwdGlvblVud3JhcHBlciksCiAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiB0cnlTb3VyY2VJbmZvcm1hdGlvbik7CiAgICBISW52b2tlU3RhdGljIHVud3JhcHBlZEV4Y2VwdGlvbiA9IGtlcm5lbEJ1aWxkZXIucG9wKCk7CiAgICB0cnlJbnN0cnVjdGlvbi5leGNlcHRpb24gPSBleGNlcHRpb247CiAgICBpbnQgY2F0Y2hlc0luZGV4ID0gMDsKCiAgICB2b2lkIHB1c2hDb25kaXRpb24oaXIuQ2F0Y2ggY2F0Y2hCbG9jaykgewogICAgICAvLyBgZ3VhcmRgIGlzIG9mdGVuIGBkeW5hbWljYCwgd2hpY2ggZ2VuZXJhdGVzIGB0cnVlYC4KICAgICAga2VybmVsQnVpbGRlci5wdXNoSXNUZXN0KGNhdGNoQmxvY2suZ3VhcmQsIHVud3JhcHBlZEV4Y2VwdGlvbiwKICAgICAgICAgIGtlcm5lbEJ1aWxkZXIuX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZENhdGNoKGNhdGNoQmxvY2spKTsKICAgIH0KCiAgICB2b2lkIHZpc2l0VGhlbigpIHsKICAgICAgaXIuQ2F0Y2ggY2F0Y2hCbG9jayA9IHRyeUNhdGNoLmNhdGNoZXNbY2F0Y2hlc0luZGV4XTsKICAgICAgY2F0Y2hlc0luZGV4Kys7CiAgICAgIGlmIChjYXRjaEJsb2NrLmV4Y2VwdGlvbiAhPSBudWxsKSB7CiAgICAgICAgTG9jYWwgZXhjZXB0aW9uVmFyaWFibGUgPQogICAgICAgICAgICBrZXJuZWxCdWlsZGVyLmxvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKGNhdGNoQmxvY2suZXhjZXB0aW9uKTsKICAgICAgICBrZXJuZWxCdWlsZGVyLmxvY2Fsc0hhbmRsZXIudXBkYXRlTG9jYWwoCiAgICAgICAgICAgIGV4Y2VwdGlvblZhcmlhYmxlLCB1bndyYXBwZWRFeGNlcHRpb24sCiAgICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOgogICAgICAgICAgICAgICAga2VybmVsQnVpbGRlci5fc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkQ2F0Y2goY2F0Y2hCbG9jaykpOwogICAgICB9CiAgICAgIGlmIChjYXRjaEJsb2NrLnN0YWNrVHJhY2UgIT0gbnVsbCkgewogICAgICAgIGtlcm5lbEJ1aWxkZXIuX3B1c2hTdGF0aWNJbnZvY2F0aW9uKAogICAgICAgICAgICBrZXJuZWxCdWlsZGVyLl9jb21tb25FbGVtZW50cy50cmFjZUZyb21FeGNlcHRpb24sCiAgICAgICAgICAgIFtleGNlcHRpb25dLAogICAgICAgICAgICBrZXJuZWxCdWlsZGVyLl90eXBlSW5mZXJlbmNlTWFwLmdldFJldHVyblR5cGVPZigKICAgICAgICAgICAgICAgIGtlcm5lbEJ1aWxkZXIuX2NvbW1vbkVsZW1lbnRzLnRyYWNlRnJvbUV4Y2VwdGlvbiksCiAgICAgICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgICAgICAgc291cmNlSW5mb3JtYXRpb246CiAgICAgICAgICAgICAgICBrZXJuZWxCdWlsZGVyLl9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRDYXRjaChjYXRjaEJsb2NrKSk7CiAgICAgICAgSEluc3RydWN0aW9uIHRyYWNlSW5zdHJ1Y3Rpb24gPSBrZXJuZWxCdWlsZGVyLnBvcCgpOwogICAgICAgIExvY2FsIHRyYWNlVmFyaWFibGUgPQogICAgICAgICAgICBrZXJuZWxCdWlsZGVyLmxvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKGNhdGNoQmxvY2suc3RhY2tUcmFjZSk7CiAgICAgICAga2VybmVsQnVpbGRlci5sb2NhbHNIYW5kbGVyLnVwZGF0ZUxvY2FsKHRyYWNlVmFyaWFibGUsIHRyYWNlSW5zdHJ1Y3Rpb24sCiAgICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOgogICAgICAgICAgICAgICAga2VybmVsQnVpbGRlci5fc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkQ2F0Y2goY2F0Y2hCbG9jaykpOwogICAgICB9CiAgICAgIGNhdGNoQmxvY2suYm9keS5hY2NlcHQoa2VybmVsQnVpbGRlcik7CiAgICB9CgogICAgdm9pZCB2aXNpdEVsc2UoKSB7CiAgICAgIGlmIChjYXRjaGVzSW5kZXggPj0gdHJ5Q2F0Y2guY2F0Y2hlcy5sZW5ndGgpIHsKICAgICAgICBrZXJuZWxCdWlsZGVyLmNsb3NlQW5kR290b0V4aXQobmV3IEhUaHJvdygKICAgICAgICAgICAga2VybmVsQnVpbGRlci5hYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICAgICAgICBleGNlcHRpb24sCiAgICAgICAgICAgIGV4Y2VwdGlvbi5zb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgICAgICAgaXNSZXRocm93OiB0cnVlKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaXIuQ2F0Y2ggbmV4dENhdGNoID0gdHJ5Q2F0Y2guY2F0Y2hlc1tjYXRjaGVzSW5kZXhdOwogICAgICAgIGtlcm5lbEJ1aWxkZXIuaGFuZGxlSWYoCiAgICAgICAgICAgIHZpc2l0Q29uZGl0aW9uOiAoKSB7CiAgICAgICAgICAgICAgcHVzaENvbmRpdGlvbihuZXh0Q2F0Y2gpOwogICAgICAgICAgICB9LAogICAgICAgICAgICB2aXNpdFRoZW46IHZpc2l0VGhlbiwKICAgICAgICAgICAgdmlzaXRFbHNlOiB2aXNpdEVsc2UsCiAgICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOgogICAgICAgICAgICAgICAga2VybmVsQnVpbGRlci5fc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkQ2F0Y2gobmV4dENhdGNoKSk7CiAgICAgIH0KICAgIH0KCiAgICBpci5DYXRjaCBmaXJzdEJsb2NrID0gdHJ5Q2F0Y2guY2F0Y2hlc1tjYXRjaGVzSW5kZXhdOwogICAga2VybmVsQnVpbGRlci5oYW5kbGVJZigKICAgICAgICB2aXNpdENvbmRpdGlvbjogKCkgewogICAgICAgICAgcHVzaENvbmRpdGlvbihmaXJzdEJsb2NrKTsKICAgICAgICB9LAogICAgICAgIHZpc2l0VGhlbjogdmlzaXRUaGVuLAogICAgICAgIHZpc2l0RWxzZTogdmlzaXRFbHNlLAogICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOgogICAgICAgICAgICBrZXJuZWxCdWlsZGVyLl9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRDYXRjaChmaXJzdEJsb2NrKSk7CiAgICBpZiAoIWtlcm5lbEJ1aWxkZXIuaXNBYm9ydGVkKCkpIHsKICAgICAgZW5kQ2F0Y2hCbG9jayA9CiAgICAgICAgICBrZXJuZWxCdWlsZGVyLmNsb3NlKG5ldyBIR290byhrZXJuZWxCdWlsZGVyLmFic3RyYWN0VmFsdWVEb21haW4pKTsKICAgIH0KCiAgICBrZXJuZWxCdWlsZGVyLnJldGhyb3dhYmxlRXhjZXB0aW9uID0gb2xkUmV0aHJvd2FibGVFeGNlcHRpb247CiAgICB0cnlJbnN0cnVjdGlvbi5jYXRjaEJsb2NrID0gc3RhcnRDYXRjaEJsb2NrOwogICAgY2F0Y2hHcmFwaCA9IG5ldyBTdWJHcmFwaChzdGFydENhdGNoQmxvY2ssIGtlcm5lbEJ1aWxkZXIubGFzdE9wZW5lZEJsb2NrKTsKICB9CgogIHZvaWQgY2xlYW5VcCgpIHsKICAgIGV4aXRCbG9jayA9IGtlcm5lbEJ1aWxkZXIuZ3JhcGguYWRkTmV3QmxvY2soKTsKICAgIF9zZXRCbG9ja1N1Y2Nlc3NvcnMoKTsKCiAgICAvLyBVc2UgdGhlIGxvY2FscyBoYW5kbGVyIG5vdCBhbHRlcmVkIGJ5IHRoZSBjYXRjaCBhbmQgZmluYWxseQogICAgLy8gYmxvY2tzLgogICAga2VybmVsQnVpbGRlci5sb2NhbHNIYW5kbGVyID0gb3JpZ2luYWxTYXZlZExvY2FsczsKICAgIGtlcm5lbEJ1aWxkZXIub3BlbihleGl0QmxvY2spOwogICAgZW50ZXJCbG9jay5zZXRCbG9ja0Zsb3coCiAgICAgICAgbmV3IEhUcnlCbG9ja0luZm9ybWF0aW9uKAogICAgICAgICAgICBrZXJuZWxCdWlsZGVyLndyYXBTdGF0ZW1lbnRHcmFwaChib2R5R3JhcGgpLAogICAgICAgICAgICBleGNlcHRpb24sCiAgICAgICAgICAgIGtlcm5lbEJ1aWxkZXIud3JhcFN0YXRlbWVudEdyYXBoKGNhdGNoR3JhcGgpLAogICAgICAgICAgICBrZXJuZWxCdWlsZGVyLndyYXBTdGF0ZW1lbnRHcmFwaChmaW5hbGx5R3JhcGgpKSwKICAgICAgICBleGl0QmxvY2spOwogICAga2VybmVsQnVpbGRlci5pblRyeVN0YXRlbWVudCA9IHByZXZpb3VzbHlJblRyeVN0YXRlbWVudDsKICB9Cn0KCmNsYXNzIEtlcm5lbFR5cGVCdWlsZGVyIGV4dGVuZHMgVHlwZUJ1aWxkZXIgewogIEpzVG9FbGVtZW50TWFwIF9lbGVtZW50TWFwOwoKICBLZXJuZWxUeXBlQnVpbGRlcihLZXJuZWxTc2FHcmFwaEJ1aWxkZXIgYnVpbGRlciwgdGhpcy5fZWxlbWVudE1hcCkKICAgICAgOiBzdXBlcihidWlsZGVyKTsKCiAgQG92ZXJyaWRlCiAgS2VybmVsU3NhR3JhcGhCdWlsZGVyIGdldCBidWlsZGVyID0+IHN1cGVyLmJ1aWxkZXI7CgogIEBvdmVycmlkZQogIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzIGNvbXB1dGVUeXBlVmFyaWFibGVBY2Nlc3MoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgcmV0dXJuIF9lbGVtZW50TWFwLmdldENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzRm9yTWVtYmVyKG1lbWJlcik7CiAgfQp9CgpjbGFzcyBfRXJyb25lb3VzSW5pdGlhbGl6ZXJWaXNpdG9yIGV4dGVuZHMgaXIuVmlzaXRvcjxib29sPiB7CiAgX0Vycm9uZW91c0luaXRpYWxpemVyVmlzaXRvcigpOwoKICAvLyBUT0RPKDMwODA5KTogVXNlIGNvbnN0IGNvbnN0cnVjdG9yLgogIHN0YXRpYyBib29sIGNoZWNrKGlyLkluaXRpYWxpemVyIGluaXRpYWxpemVyKSA9PgogICAgICBpbml0aWFsaXplci5hY2NlcHQobmV3IF9FcnJvbmVvdXNJbml0aWFsaXplclZpc2l0b3IoKSk7CgogIEBvdmVycmlkZQogIGJvb2wgZGVmYXVsdEluaXRpYWxpemVyKGlyLk5vZGUgbm9kZSkgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJbnZhbGlkSW5pdGlhbGl6ZXIoaXIuSW52YWxpZEluaXRpYWxpemVyIG5vZGUpID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRMb2NhbEluaXRpYWxpemVyKGlyLkxvY2FsSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgcmV0dXJuIG5vZGUudmFyaWFibGUuaW5pdGlhbGl6ZXI/LmFjY2VwdCh0aGlzKSA/PyBmYWxzZTsKICB9CgogIC8vIEV4cHJlc3Npb25zOiBEb2VzIHRoZSBleHByZXNzaW9uIGFsd2F5cyB0aHJvdz8KICBAb3ZlcnJpZGUKICBib29sIGRlZmF1bHRFeHByZXNzaW9uKGlyLkV4cHJlc3Npb24gbm9kZSkgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRUaHJvdyhpci5UaHJvdyBub2RlKSA9PiB0cnVlOwoKICAvLyBUT0RPKHNyYSk6IFdlIG1pZ2h0IG5lZWQgdG8gbWF0Y2ggb3RoZXIgZXhwcmVzc2lvbnMgdGhhdCBhbHdheXMgdGhyb3cgYnV0CiAgLy8gaW4gYSBzdWJleHByZXNzaW9uLgp9CgovLy8gU3BlY2lhbCBbSnVtcEhhbmRsZXJdIGltcGxlbWVudGF0aW9uIHVzZWQgdG8gaGFuZGxlIGNvbnRpbnVlIHN0YXRlbWVudHMKLy8vIHRhcmdldGluZyBzd2l0Y2ggY2FzZXMuCmNsYXNzIEtlcm5lbFN3aXRjaENhc2VKdW1wSGFuZGxlciBleHRlbmRzIFN3aXRjaENhc2VKdW1wSGFuZGxlciB7CiAgS2VybmVsU3dpdGNoQ2FzZUp1bXBIYW5kbGVyKEdyYXBoQnVpbGRlciBidWlsZGVyLCBKdW1wVGFyZ2V0IHRhcmdldCwKICAgICAgaXIuU3dpdGNoU3RhdGVtZW50IHN3aXRjaFN0YXRlbWVudCwgS2VybmVsVG9Mb2NhbHNNYXAgbG9jYWxzTWFwKQogICAgICA6IHN1cGVyKGJ1aWxkZXIsIHRhcmdldCkgewogICAgLy8gVGhlIHN3aXRjaCBjYXNlIGluZGljZXMgbXVzdCBtYXRjaCB0aG9zZSBjb21wdXRlZCBpbgogICAgLy8gW0tlcm5lbFNzYUJ1aWxkZXIuYnVpbGRTd2l0Y2hDYXNlQ29uc3RhbnRzXS4KICAgIC8vIFN3aXRjaCBpbmRpY2VzIGFyZSAxLWJhc2VkIHNvIHdlIGNhbiBieXBhc3MgdGhlIHN5bnRoZXRpYyBsb29wIHdoZW4gbm8KICAgIC8vIGNhc2VzIG1hdGNoIHNpbXBseSBieSBicmFuY2hpbmcgb24gdGhlIGluZGV4ICh3aGljaCBkZWZhdWx0cyB0byBudWxsKS4KICAgIC8vIFRPRE8KICAgIGludCBzd2l0Y2hJbmRleCA9IDE7CiAgICBmb3IgKGlyLlN3aXRjaENhc2Ugc3dpdGNoQ2FzZSBpbiBzd2l0Y2hTdGF0ZW1lbnQuY2FzZXMpIHsKICAgICAgSnVtcFRhcmdldCBjb250aW51ZVRhcmdldCA9CiAgICAgICAgICBsb2NhbHNNYXAuZ2V0SnVtcFRh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ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vY29tbW9uL2NvZGVnZW4uZGFydCcgc2hvdyBDb2RlZ2VuUmVnaXN0cnk7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL2NvbXBpbGVyLmRhcnQnOwppbXBvcnQgJy4uL2RlZmVycmVkX2xvYWQuZGFydCc7CmltcG9ydCAnLi4vZGlhZ25vc3RpY3MvZGlhZ25vc3RpY19saXN0ZW5lci5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JyBzaG93IEVudGl0eSwgTG9jYWwsIE1lbWJlckVudGl0eTsKaW1wb3J0ICcuLi9lbGVtZW50cy9qdW1wcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci9hYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vaW8vc291cmNlX2luZm9ybWF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvYmFja2VuZC5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2JhY2tlbmRfdXNhZ2UuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9jb25zdGFudF9oYW5kbGVyX2phdmFzY3JpcHQuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9pbnRlcmNlcHRvcl9kYXRhLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvaW5mZXJyZWRfZGF0YS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL25hbWVyLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9ydW50aW1lX3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2pzX2VtaXR0ZXIvY29kZV9lbWl0dGVyX3Rhc2suZGFydCc7CmltcG9ydCAnLi4vb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKaW1wb3J0ICdqdW1wX2hhbmRsZXIuZGFydCc7CmltcG9ydCAnbG9jYWxzX2hhbmRsZXIuZGFydCc7CmltcG9ydCAnbm9kZXMuZGFydCc7CmltcG9ydCAndHlwZV9idWlsZGVyLmRhcnQnOwoKLy8vIEJhc2UgY2xhc3MgZm9yIG9iamVjdHMgdGhhdCBidWlsZCB1cCBhbiBTU0EgZ3JhcGguCi8vLwovLy8gVGhpcyBjb250YWlucyBoZWxwZXJzIGZvciBidWlsZGluZyB0aGUgZ3JhcGggYW5kIHRyYWNraW5nIGluZm9ybWF0aW9uIGFib3V0Ci8vLyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZ3JhcGggYmVpbmcgYnVpbHQuCmFic3RyYWN0IGNsYXNzIEdyYXBoQnVpbGRlciB7CiAgLy8vIEhvbGRzIHRoZSByZXN1bHRpbmcgU1NBIGdyYXBoLgogIGZpbmFsIEhHcmFwaCBncmFwaCA9IG5ldyBIR3JhcGgoKTsKCiAgLy8gVE9ETyhoZXQpOiByZW1vdmUgdGhpcwogIC8vLyBBIHJlZmVyZW5jZSB0byB0aGUgY29tcGlsZXIuCiAgQ29tcGlsZXIgZ2V0IGNvbXBpbGVyOwoKICAvLy8gVHJ1ZSBpZiB0aGUgYnVpbGRlciBpcyBwcm9jZXNzaW5nIG5vZGVzIGluc2lkZSBhIHRyeSBzdGF0ZW1lbnQuIFRoaXMgaXMKICAvLy8gaW1wb3J0YW50IGZvciBnZW5lcmF0aW5nIGNvbnRyb2wgZmxvdyBvdXQgb2YgYSB0cnkgYmxvY2sgbGlrZSByZXR1cm5zIG9yCiAgLy8vIGJyZWFrcy4KICBib29sIGluVHJ5U3RhdGVtZW50ID0gZmFsc2U7CgogIC8vLyBUaGUgSmF2YVNjcmlwdCBiYWNrZW5kIHdlIGFyZSB0YXJnZXRpbmcgaW4gdGhpcyBjb21waWxhdGlvbi4KICBKYXZhU2NyaXB0QmFja2VuZCBnZXQgYmFja2VuZDsKCiAgQ29kZWdlblJlZ2lzdHJ5IGdldCByZWdpc3RyeTsKCiAgSkNsb3NlZFdvcmxkIGdldCBjbG9zZWRXb3JsZDsKCiAgQWJzdHJhY3RWYWx1ZURvbWFpbiBnZXQgYWJzdHJhY3RWYWx1ZURvbWFpbiA9PgogICAgICBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluOwoKICBEaWFnbm9zdGljUmVwb3J0ZXIgZ2V0IHJlcG9ydGVyID0+IGJhY2tlbmQucmVwb3J0ZXI7CgogIENvbXBpbGVyT3B0aW9ucyBnZXQgb3B0aW9ucyA9PiBjb21waWxlci5vcHRpb25zOwoKICBKQ29tbW9uRWxlbWVudHMgZ2V0IGNvbW1vbkVsZW1lbnRzID0+IGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzOwoKICBDb2RlRW1pdHRlclRhc2sgZ2V0IGVtaXR0ZXIgPT4gYmFja2VuZC5lbWl0dGVyOwoKICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBnZXQgZ2xvYmFsSW5mZXJlbmNlUmVzdWx0czsKCiAgTmF0aXZlRGF0YSBnZXQgbmF0aXZlRGF0YSA9PiBjbG9zZWRXb3JsZC5uYXRpdmVEYXRhOwoKICBJbnRlcmNlcHRvckRhdGEgZ2V0IGludGVyY2VwdG9yRGF0YSA9PiBjbG9zZWRXb3JsZC5pbnRlcmNlcHRvckRhdGE7CgogIEJhY2tlbmRVc2FnZSBnZXQgYmFja2VuZFVzYWdlID0+IGNsb3NlZFdvcmxkLmJhY2tlbmRVc2FnZTsKCiAgTmFtZXIgZ2V0IG5hbWVyID0+IGJhY2tlbmQubmFtZXI7CgogIFJ1bnRpbWVUeXBlc05lZWQgZ2V0IHJ0aU5lZWQgPT4gY2xvc2VkV29ybGQucnRpTmVlZDsKCiAgSmF2YVNjcmlwdENvbnN0YW50Q29tcGlsZXIgZ2V0IGNvbnN0YW50cyA9PiBiYWNrZW5kLmNvbnN0YW50czsKCiAgUnVudGltZVR5cGVzRW5jb2RlciBnZXQgcnRpRW5jb2RlciA9PiBiYWNrZW5kLnJ0aUVuY29kZXI7CgogIEluZmVycmVkRGF0YSBnZXQgaW5mZXJyZWREYXRhID0+IGdsb2JhbEluZmVyZW5jZVJlc3VsdHMuaW5mZXJyZWREYXRhOwoKICBEZWZlcnJlZExvYWRUYXNrIGdldCBkZWZlcnJlZExvYWRUYXNrID0+IGNvbXBpbGVyLmRlZmVycmVkTG9hZFRhc2s7CgogIERhcnRUeXBlcyBnZXQgdHlwZXMgPT4gY2xvc2VkV29ybGQuZGFydFR5cGVzOwoKICAvLy8gVXNlZCB0byB0cmFjayB0aGUgbG9jYWxzIHdoaWxlIGJ1aWxkaW5nIHRoZSBncmFwaC4KICBMb2NhbHNIYW5kbGVyIGxvY2Fsc0hhbmRsZXI7CgogIC8vLyBBIHN0YWNrIG9mIGluc3RydWN0aW9ucy4KICAvLy8KICAvLy8gV2UgYnVpbGQgdGhlIFNTQSBncmFwaCBieSBzaW11bGF0aW5nIGEgc3RhY2sgbWFjaGluZS4KICBMaXN0PEhJbnN0cnVjdGlvbj4gc3RhY2sgPSA8SEluc3RydWN0aW9uPltdOwoKICAvLy8gVGhlIGNvdW50IG9mIG5lc3RlZCBsb29wcyB3ZSBhcmUgY3VycmVudGx5IGJ1aWxkaW5nLgogIC8vLwogIC8vLyBUaGUgbG9vcCBuZXN0aW5nIGlzIGNvbnN1bHRlZCB3aGVuIGlubGluaW5nIGEgZnVuY3Rpb24gaW52b2NhdGlvbi4gVGhlCiAgLy8vIGlubGluaW5nIGhldXJpc3RpY3MgdGFrZSB0aGlzIGluZm9ybWF0aW9uIGludG8gYWNjb3VudC4KICBpbnQgbG9vcERlcHRoID0gMDsKCiAgLy8vIEEgbWFwcGluZyBmcm9tIGp1bXAgdGFyZ2V0cyB0byB0aGVpciBoYW5kbGVycy4KICBNYXA8SnVtcFRhcmdldCwgSnVtcEhhbmRsZXI+IGp1bXBUYXJnZXRzID0gPEp1bXBUYXJnZXQsIEp1bXBIYW5kbGVyPnt9OwoKICB2b2lkIHB1c2goSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBhZGQoaW5zdHJ1Y3Rpb24pOwogICAgc3RhY2suYWRkKGluc3RydWN0aW9uKTsKICB9CgogIEhJbnN0cnVjdGlvbiBwb3AoKSB7CiAgICByZXR1cm4gc3RhY2sucmVtb3ZlTGFzdCgpOwogIH0KCiAgLy8vIFBvcHMgdGhlIG1vc3QgcmVjZW50IGluc3RydWN0aW9uIGZyb20gdGhlIHN0YWNrIGFuZCAnYm9vbGlmaWVzJyBpdC4KICAvLy8KICAvLy8gQm9vbGlmaWNhdGlvbiBpcyBjaGVja2luZyBpZiB0aGUgdmFsdWUgaXMgJz09PSB0cnVlJy4KICBISW5zdHJ1Y3Rpb24gcG9wQm9vbGlmaWVkKCk7CgogIC8vLyBQdXNoZXMgYSBib29sZWFuIGNoZWNraW5nIFtleHByZXNzaW9uXSBhZ2FpbnN0IG51bGwuCiAgcHVzaENoZWNrTnVsbChISW5zdHJ1Y3Rpb24gZXhwcmVzc2lvbikgewogICAgcHVzaChuZXcgSElkZW50aXR5KGV4cHJlc3Npb24sIGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCksIG51bGwsCiAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5ib29sVHlwZSkpOwogIH0KCiAgdm9pZCBkdXAoKSB7CiAgICBzdGFjay5hZGQoc3RhY2subGFzdCk7CiAgfQoKICBIQmFzaWNCbG9jayBfY3VycmVudDsKCiAgLy8vIFRoZSBjdXJyZW50IGJsb2NrIHRvIGFkZCBpbnN0cnVjdGlvbnMgdG8uIE1pZ2h0IGJlIG51bGwsIGlmIHdlIGFyZQogIC8vLyB2aXNpdGluZyBkZWFkIGNvZGUsIGJ1dCBzZWUgW2lzUmVhY2hhYmxlXS4KICBIQmFzaWNCbG9jayBnZXQgY3VycmVudCA9PiBfY3VycmVudDsKCiAgdm9pZCBzZXQgY3VycmVudChjKSB7CiAgICBpc1JlYWNoYWJsZSA9IGMgIT0gbnVsbDsKICAgIF9jdXJyZW50ID0gYzsKICB9CgogIC8vLyBUaGUgbW9zdCByZWNlbnRseSBvcGVuZWQgYmxvY2suIEhhcyB0aGUgc2FtZSB2YWx1ZSBhcyBbY3VycmVudF0gd2hpbGUKICAvLy8gdGhlIGJsb2NrIGlzIG9wZW4sIGJ1dCB1bmxpa2UgW2N1cnJlbnRdLCBpdCBpc24ndCBjbGVhcmVkIHdoZW4gdGhlCiAgLy8vIGN1cnJlbnQgYmxvY2sgaXMgY2xvc2VkLgogIEhCYXNpY0Jsb2NrIGxhc3RPcGVuZWRCbG9jazsKCiAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjdXJyZW50IGJsb2NrIGlzIGRlYWQgKGJlY2F1c2UgaXQgaGFzIGEgdGhyb3cgb3IgYQogIC8vLyByZXR1cm4gZnVydGhlciB1cCkuIElmIHRoaXMgaXMgZmFsc2UsIHRoZW4gW2N1cnJlbnRdIG1heSBiZSBudWxsLiBJZiB0aGUKICAvLy8gYmxvY2sgaXMgZGVhZCB0aGVuIGl0IG1heSBhbHNvIGJlIGFib3J0ZWQsIGJ1dCBmb3Igc2ltcGxpY2l0eSB3ZSBvbmx5CiAgLy8vIGFib3J0IG9uIHN0YXRlbWVudCBib3VuZGFyaWVzLCBub3QgaW4gdGhlIG1pZGRsZSBvZiBleHByZXNzaW9ucy4gU2VlCiAgLy8vIFtpc0Fib3J0ZWRdLgogIGJvb2wgaXNSZWFjaGFibGUgPSB0cnVlOwoKICBITG9jYWxWYWx1ZSBsYXN0QWRkZWRQYXJhbWV0ZXI7CgogIE1hcDxMb2NhbCwgSEluc3RydWN0aW9uPiBwYXJhbWV0ZXJzID0gPExvY2FsLCBISW5zdHJ1Y3Rpb24+e307CiAgU2V0PExvY2FsPiBlbGlkZWRQYXJhbWV0ZXJzOwoKICBIQmFzaWNCbG9jayBhZGROZXdCbG9jaygpIHsKICAgIEhCYXNpY0Jsb2NrIGJsb2NrID0gZ3JhcGguYWRkTmV3QmxvY2soKTsKICAgIC8vIElmIGFkZGluZyBhIG5ldyBibG9jayBkdXJpbmcgYnVpbGRpbmcgb2YgYW4gZXhwcmVzc2lvbiwgaXQgaXMgZHVlIHRvCiAgICAvLyBjb25kaXRpb25hbCBleHByZXNzaW9ucyBvciBzaG9ydC1jaXJjdWl0IGxvZ2ljYWwgb3BlcmF0b3JzLgogICAgcmV0dXJuIGJsb2NrOwogIH0KCiAgdm9pZCBvcGVuKEhCYXNpY0Jsb2NrIGJsb2NrKSB7CiAgICBibG9jay5vcGVuKCk7CiAgICBjdXJyZW50ID0gYmxvY2s7CiAgICBsYXN0T3BlbmVkQmxvY2sgPSBibG9jazsKICB9CgogIEhCYXNpY0Jsb2NrIGNsb3NlKEhDb250cm9sRmxvdyBlbmQpIHsKICAgIEhCYXNpY0Jsb2NrIHJlc3VsdCA9IGN1cnJlbnQ7CiAgICBjdXJyZW50LmNsb3NlKGVuZCk7CiAgICBjdXJyZW50ID0gbnVsbDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBIQmFzaWNCbG9jayBjbG9zZUFuZEdvdG9FeGl0KEhDb250cm9sRmxvdyBlbmQpIHsKICAgIEhCYXNpY0Jsb2NrIHJlc3VsdCA9IGN1cnJlbnQ7CiAgICBjdXJyZW50LmNsb3NlKGVuZCk7CiAgICBjdXJyZW50ID0gbnVsbDsKICAgIHJlc3VsdC5hZGRTdWNjZXNzb3IoZ3JhcGguZXhpdCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBnb3RvKEhCYXNpY0Jsb2NrIGZyb20sIEhCYXNpY0Jsb2NrIHRvKSB7CiAgICBmcm9tLmNsb3NlKG5ldyBIR290byhhYnN0cmFjdFZhbHVlRG9tYWluKSk7CiAgICBmcm9tLmFkZFN1Y2Nlc3Nvcih0byk7CiAgfQoKICBib29sIGlzQWJvcnRlZCgpIHsKICAgIHJldHVybiBjdXJyZW50ID09IG51bGw7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIG5ldyBibG9jaywgdHJhbnNpdGlvbnMgdG8gaXQgZnJvbSBhbnkgY3VycmVudCBibG9jaywgYW5kCiAgLy8vIG9wZW5zIHRoZSBuZXcgYmxvY2suCiAgSEJhc2ljQmxvY2sgb3Blbk5ld0Jsb2NrKCkgewogICAgSEJhc2ljQmxvY2sgbmV3QmxvY2sgPSBhZGROZXdCbG9jaygpOwogICAgaWYgKCFpc0Fib3J0ZWQoKSkgZ290byhjdXJyZW50LCBuZXdCbG9jayk7CiAgICBvcGVuKG5ld0Jsb2NrKTsKICAgIHJldHVybiBuZXdCbG9jazsKICB9CgogIHZvaWQgYWRkKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgY3VycmVudC5hZGQoaW5zdHJ1Y3Rpb24pOwogIH0KCiAgSExvY2FsVmFsdWUgYWRkUGFyYW1ldGVyKEVudGl0eSBwYXJhbWV0ZXIsIEFic3RyYWN0VmFsdWUgdHlwZSwKICAgICAge2Jvb2wgaXNFbGlkZWQ6IGZhbHNlfSkgewogICAgSExvY2FsVmFsdWUgcmVzdWx0ID0gaXNFbGlkZWQKICAgICAgICA/IG5ldyBITG9jYWxWYWx1ZShwYXJhbWV0ZXIsIHR5cGUpCiAgICAgICAgOiBuZXcgSFBhcmFtZXRlclZhbHVlKHBhcmFtZXRlciwgdHlwZSk7CiAgICBpZiAobGFzdEFkZGVkUGFyYW1ldGVyID09IG51bGwpIHsKICAgICAgZ3JhcGguZW50cnkuYWRkQmVmb3JlKGdyYXBoLmVudHJ5LmZpcnN0LCByZXN1bHQpOwogICAgfSBlbHNlIHsKICAgICAgZ3JhcGguZW50cnkuYWRkQWZ0ZXIobGFzdEFkZGVkUGFyYW1ldGVyLCByZXN1bHQpOwogICAgfQogICAgbGFzdEFkZGVkUGFyYW1ldGVyID0gcmVzdWx0OwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEhTdWJHcmFwaEJsb2NrSW5mb3JtYXRpb24gd3JhcFN0YXRlbWVudEdyYXBoKFN1YkdyYXBoIHN0YXRlbWVudHMpIHsKICAgIGlmIChzdGF0ZW1lbnRzID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIG5ldyBIU3ViR3JhcGhCbG9ja0luZm9ybWF0aW9uKHN0YXRlbWVudHMpOwogIH0KCiAgSFN1YkV4cHJlc3Npb25CbG9ja0luZm9ybWF0aW9uIHdyYXBFeHByZXNzaW9uR3JhcGgoU3ViRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgICBpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBuZXcgSFN1YkV4cHJlc3Npb25CbG9ja0luZm9ybWF0aW9uKGV4cHJlc3Npb24pOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIGN1cnJlbnQgc291cmNlIGVsZW1lbnQuCiAgLy8vCiAgLy8vIFRoZSByZXR1cm5lZCBlbGVtZW50IGlzIGEgZGVjbGFyYXRpb24gZWxlbWVudC4KICBNZW1iZXJFbnRpdHkgZ2V0IHNvdXJjZUVsZW1lbnQ7CgogIEhMaXRlcmFsTGlzdCBidWlsZExpdGVyYWxMaXN0KExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMpIHsKICAgIHJldHVybiBuZXcgSExpdGVyYWxMaXN0KGlucHV0cywgYWJzdHJhY3RWYWx1ZURvbWFpbi5ncm93YWJsZUxpc3RUeXBlKTsKICB9CgogIEhJbnN0cnVjdGlvbiBjYWxsU2V0UnVudGltZVR5cGVJbmZvV2l0aFR5cGVBcmd1bWVudHMoCiAgICAgIEludGVyZmFjZVR5cGUgdHlwZSwKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IHJ0aUlucHV0cywKICAgICAgSEluc3RydWN0aW9uIG5ld09iamVjdCwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIGlmICghcnRpTmVlZC5jbGFzc05lZWRzVHlwZUFyZ3VtZW50cyh0eXBlLmVsZW1lbnQpKSB7CiAgICAgIHJldHVybiBuZXdPYmplY3Q7CiAgICB9CgogICAgSEluc3RydWN0aW9uIHR5cGVJbmZvID0gbmV3IEhUeXBlSW5mb0V4cHJlc3Npb24oCiAgICAgICAgVHlwZUluZm9FeHByZXNzaW9uS2luZC5JTlNUQU5DRSwKICAgICAgICBjbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQuZ2V0VGhpc1R5cGUodHlwZS5lbGVtZW50KSwKICAgICAgICBydGlJbnB1dHMsCiAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSk7CiAgICBhZGQodHlwZUluZm8pOwogICAgcmV0dXJuIGNhbGxTZXRSdW50aW1lVHlwZUluZm8odHlwZUluZm8sIG5ld09iamVjdCwgc291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgLy8vIENhbGxlZCB3aGVuIGNvbnRyb2wgZmxvdyBpcyBhYm91dCB0byBjaGFuZ2UsIGluIHdoaWNoIGNhc2Ugd2UgbmVlZCB0bwogIC8vLyBzcGVjaWZ5IHNwZWNpYWwgc3VjY2Vzc29ycyBpZiB3ZSBhcmUgYWxyZWFkeSBpbiBhIHRyeS9jYXRjaC9maW5hbGx5IGJsb2NrLgogIHZvaWQgaGFuZGxlSW5UcnlTdGF0ZW1lbnQoKSB7CiAgICBpZiAoIWluVHJ5U3RhdGVtZW50KSByZXR1cm47CiAgICBIQmFzaWNCbG9jayBibG9jayA9IGNsb3NlKG5ldyBIRXhpdFRyeShhYnN0cmFjdFZhbHVlRG9tYWluKSk7CiAgICBIQmFzaWNCbG9jayBuZXdCbG9jayA9IGdyYXBoLmFkZE5ld0Jsb2NrKCk7CiAgICBibG9jay5hZGRTdWNjZXNzb3IobmV3QmxvY2spOwogICAgb3BlbihuZXdCbG9jayk7CiAgfQoKICBISW5zdHJ1Y3Rpb24gY2FsbFNldFJ1bnRpbWVUeXBlSW5mbyhISW5zdHJ1Y3Rpb24gdHlwZUluZm8sCiAgICAgIEhJbnN0cnVjdGlvbiBuZXdPYmplY3QsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgLy8vIFRoZSBlbGVtZW50IGZvciB3aGljaCB0aGlzIFNTQSBidWlsZGVyIGlzIGJlaW5nIHVzZWQuCiAgTWVtYmVyRW50aXR5IGdldCB0YXJnZXRFbGVtZW50OwogIFR5cGVCdWlsZGVyIGdldCB0eXBlQnVpbGRlcjsKCiAgLy8vIEhlbHBlciB0byBpbXBsZW1lbnQgSlNfR0VUX0ZMQUcuCiAgLy8vCiAgLy8vIFRoZSBjb25jcmV0ZSBTU0EgZ3JhcGggYnVpbGRlciB3aWxsIGV4dHJhY3QgYSBmbGFnIHBhcmFtZXRlciBmcm9tIHRoZQogIC8vLyBKU19HRVRfRkxBRyBjYWxsIGFuZCB0aGVuIHB1c2ggYSBib29sZWFuIHJlc3VsdCBvbnRvIHRoZSBzdGFjay4gVGhpcwogIC8vLyBmdW5jdGlvbiBwcm92aWRlcyB0aGUgYm9vbGVhbiB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBbZmxhZ05hbWVdLgogIC8vLyBJZiBbZmxhZ05hbWVdIGlzIG5vdCByZWNvZ25pemVkLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYG51bGxgIGFuZCB0aGUKICAvLy8gY29uY3JldGUgU1NBIGJ1aWxkZXIgcmVwb3J0cyBhbiBlcnJvci4KICBib29sIGdldEZsYWdWYWx1ZShTdHJpbmcgZmxhZ05hbWUpIHsKICAgIHN3aXRjaCAoZmxhZ05hbWUpIHsKICAgICAgY2FzZSAnTUlOSUZJRUQnOgogICAgICAgIHJldHVybiBvcHRpb25zLmVuYWJsZU1pbmlmaWNhdGlvbjsKICAgICAgY2FzZSAnTVVTVF9SRVRBSU5fTUVUQURBVEEnOgogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgY2FzZSAnVVNFX0NPTlRFTlRfU0VDVVJJVFlfUE9MSUNZJzoKICAgICAgICByZXR1cm4gb3B0aW9ucy51c2VDb250ZW50U2VjdXJpdHlQb2xpY3k7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQp9CoEpAE5OPAE2IhsgMkUhITEhKCUrOS4rIykrLxoqHB4VHAE3BFAwHiUlARwjGQFOTw4fAUMhASABIAExJwE3ATMBRAEyATkBNwFGAT0BJAE3AUEBPAFIAUYBMAE5HwEfBjwvATsGTT4VATVKASgWHAQBFx8EAUoGPB8BOytNKAQBDxsEARgBSTEnARgdEgQBTEkfHwFPT0xLExsBIgFBHwEeLUxDEgQBIRIVHQQBKCIYFBMEATMiGBQlEwQBMDAbBAEVHAQBSRsfKi8UFQQBJx4EAUEgIiswJjgNOAYhEwQBRik2BAFRKTsEASoGNSIBPUsEATgaJB4tOhgGATUpQhMqE0sEAUxRICFCMCIUBAE9RAE8Ih8BJwZMS1FMLScYFysjFioxDxUGBAIBK3BhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS9ncmFwaF9idWlsZGVyLmRhcnQsc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvc3NhL3R5cGVzLmRhcnSLPy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JyBzaG93IENvbW1vbkVsZW1lbnRzOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2luZmVycmVyL2Fic3RyYWN0X3ZhbHVlX2RvbWFpbi5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9uYXRpdmUvYmVoYXZpb3IuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCcgc2hvdyBTZWxlY3RvcjsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKCmNsYXNzIEFic3RyYWN0VmFsdWVGYWN0b3J5IHsKICBzdGF0aWMgQWJzdHJhY3RWYWx1ZSBpbmZlcnJlZFJldHVyblR5cGVGb3JFbGVtZW50KAogICAgICBGdW5jdGlvbkVudGl0eSBlbGVtZW50LCBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzKSB7CiAgICByZXR1cm4gcmVzdWx0cy5yZXN1bHRPZk1lbWJlcihlbGVtZW50KS5yZXR1cm5UeXBlID8/CiAgICAgICAgcmVzdWx0cy5jbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlOwogIH0KCiAgc3RhdGljIEFic3RyYWN0VmFsdWUgaW5mZXJyZWRUeXBlRm9yTWVtYmVyKAogICAgICBNZW1iZXJFbnRpdHkgZWxlbWVudCwgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cykgewogICAgcmV0dXJuIHJlc3VsdHMucmVzdWx0T2ZNZW1iZXIoZWxlbWVudCkudHlwZSA/PwogICAgICAgIHJlc3VsdHMuY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZTsKICB9CgogIHN0YXRpYyBBYnN0cmFjdFZhbHVlIGluZmVycmVkVHlwZUZvclBhcmFtZXRlcigKICAgICAgTG9jYWwgZWxlbWVudCwgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cykgewogICAgcmV0dXJuIHJlc3VsdHMucmVzdWx0T2ZQYXJhbWV0ZXIoZWxlbWVudCkgPz8KICAgICAgICByZXN1bHRzLmNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGU7CiAgfQoKICBzdGF0aWMgQWJzdHJhY3RWYWx1ZSBpbmZlcnJlZFR5cGVGb3JTZWxlY3RvcihTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSByZWNlaXZlciwgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cykgewogICAgcmV0dXJuIHJlc3VsdHMudHlwZU9mU2VsZWN0b3Ioc2VsZWN0b3IsIHJlY2VpdmVyKSA/PwogICAgICAgIHJlc3VsdHMuY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZTsKICB9CgogIHN0YXRpYyBBYnN0cmFjdFZhbHVlIGZyb21OYXRpdmVCZWhhdmlvcigKICAgICAgTmF0aXZlQmVoYXZpb3IgbmF0aXZlQmVoYXZpb3IsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluID0gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbjsKICAgIHZhciB0eXBlc1JldHVybmVkID0gbmF0aXZlQmVoYXZpb3IudHlwZXNSZXR1cm5lZDsKICAgIGlmICh0eXBlc1JldHVybmVkLmlzRW1wdHkpIHJldHVybiBhYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlOwoKICAgIENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzID0gY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHM7CgogICAgLy8gW3R5cGVdIGlzIGVpdGhlciBhbiBpbnN0YW5jZSBvZiBbRGFydFR5cGVdIG9yIHNwZWNpYWwgb2JqZWN0cwogICAgLy8gbGlrZSBbbmF0aXZlLlNwZWNpYWxUeXBlLkpzT2JqZWN0XS4KICAgIEFic3RyYWN0VmFsdWUgZnJvbU5hdGl2ZVR5cGUoZHluYW1pYyB0eXBlKSB7CiAgICAgIGlmICh0eXBlID09IFNwZWNpYWxUeXBlLkpzT2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIGFic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAgICAgLmNyZWF0ZU5vbk51bGxFeGFjdChjb21tb25FbGVtZW50cy5vYmplY3RDbGFzcyk7CiAgICAgIH0gZWxzZSBpZiAodHlwZS5pc1ZvaWQpIHsKICAgICAgICByZXR1cm4gYWJzdHJhY3RWYWx1ZURvbWFpbi5udWxsVHlwZTsKICAgICAgfSBlbHNlIGlmICh0eXBlLmlzRHluYW1pYykgewogICAgICAgIHJldHVybiBhYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlOwogICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gY29tbW9uRWxlbWVudHMubnVsbFR5cGUpIHsKICAgICAgICByZXR1cm4gYWJzdHJhY3RWYWx1ZURvbWFpbi5udWxsVHlwZTsKICAgICAgfSBlbHNlIGlmICh0eXBlLnRyZWF0QXNEeW5hbWljKSB7CiAgICAgICAgcmV0dXJuIGFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGFic3RyYWN0VmFsdWVEb21haW4uY3JlYXRlTm9uTnVsbFN1YnR5cGUodHlwZS5lbGVtZW50KTsKICAgICAgfQogICAgfQoKICAgIEFic3RyYWN0VmFsdWUgcmVzdWx0ID0KICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLnVuaW9uT2ZNYW55KHR5cGVzUmV0dXJuZWQubWFwKGZyb21OYXRpdmVUeXBlKSk7CiAgICBhc3NlcnQoYWJzdHJhY3RWYWx1ZURvbWFpbi5pc0VtcHR5KHJlc3VsdCkuaXNQb3RlbnRpYWxseUZhbHNlLAogICAgICAgICJVbmV4cGVjdGVkIGVtcHR5IHJldHVybiB2YWx1ZSBmb3IgJG5hdGl2ZUJlaGF2aW9yLiIpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KSQBOTjwBNiQxISIyKgEdNUQ5PQQBLkIzPQQBMTsxPQQBQkQ5PQQBK0FPNkcBQAFFKzEqIz0gLSMwNC0oMA9HCAYBG0xDPxMEAgEjcGFja2FnZTpjb21waWxlci9zcmMvc3NhL3R5cGVzLmRhcnQzc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfbW9kZWwvY2xvc3VyZS5kYXJ0wACtTi8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAnLi4vY2xvc3VyZS5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL2V4cHJlc3Npb25zLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL25hbWVzLmRhcnQnIHNob3cgTmFtZTsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pci9jbG9zdXJlLmRhcnQnOwppbXBvcnQgJy4uL2lyL2VsZW1lbnRfbWFwLmRhcnQnOwppbXBvcnQgJy4uL2pzX21vZGVsL2VsZW1lbnRfbWFwLmRhcnQnOwppbXBvcnQgJy4uL2pzX21vZGVsL2Vudi5kYXJ0JzsKaW1wb3J0ICcuLi9vcmRlcmVkX3R5cGVzZXQuZGFydCc7CmltcG9ydCAnLi4vb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi9zZXJpYWxpemF0aW9uL3NlcmlhbGl6YXRpb24uZGFydCc7CmltcG9ydCAnLi4vc3NhL3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9zZWxlY3Rvci5kYXJ0JzsKaW1wb3J0ICdlbGVtZW50cy5kYXJ0JzsKaW1wb3J0ICdqc193b3JsZF9idWlsZGVyLmRhcnQnIHNob3cgSnNDbG9zZWRXb3JsZEJ1aWxkZXI7CmltcG9ydCAnbG9jYWxzLmRhcnQnOwoKY2xhc3MgQ2xvc3VyZURhdGFJbXBsIGltcGxlbWVudHMgQ2xvc3VyZURhdGEgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbQ2xvc3VyZURhdGFdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnY2xvc3VyZS1kYXRhJzsKCiAgZmluYWwgSnNUb0VsZW1lbnRNYXAgX2VsZW1lbnRNYXA7CgogIC8vLyBNYXAgb2YgdGhlIHNjb3BpbmcgaW5mb3JtYXRpb24gdGhhdCBjb3JyZXNwb25kcyB0byBhIHBhcnRpY3VsYXIgZW50aXR5LgogIGZpbmFsIE1hcDxNZW1iZXJFbnRpdHksIFNjb3BlSW5mbz4gX3Njb3BlTWFwOwogIGZpbmFsIE1hcDxpci5UcmVlTm9kZSwgQ2FwdHVyZWRTY29wZT4gX2NhcHR1cmVkU2NvcGVzTWFwOwogIC8vIEluZGljYXRlcyB0aGUgdHlwZSB2YXJpYWJsZXMgKGlmIGFueSkgdGhhdCBhcmUgY2FwdHVyZWQgaW4gYSBnaXZlbgogIC8vIFNpZ25hdHVyZSBmdW5jdGlvbi4KICBmaW5hbCBNYXA8TWVtYmVyRW50aXR5LCBDYXB0dXJlZFNjb3BlPiBfY2FwdHVyZWRTY29wZUZvclNpZ25hdHVyZU1hcDsKCiAgLy8gVGhlIGtleSBpcyBlaXRoZXIgYSBbaXIuRnVuY3Rpb25EZWNsYXJhdGlvbl0gb3IgW2lyLkZ1bmN0aW9uRXhwcmVzc2lvbl0uCiAgZmluYWwgTWFwPGlyLlRyZWVOb2RlLCBDbG9zdXJlUmVwcmVzZW50YXRpb25JbmZvPgogICAgICBfbG9jYWxDbG9zdXJlUmVwcmVzZW50YXRpb25NYXA7CgogIENsb3N1cmVEYXRhSW1wbCh0aGlzLl9lbGVtZW50TWFwLCB0aGlzLl9zY29wZU1hcCwgdGhpcy5fY2FwdHVyZWRTY29wZXNNYXAsCiAgICAgIHRoaXMuX2NhcHR1cmVkU2NvcGVGb3JTaWduYXR1cmVNYXAsIHRoaXMuX2xvY2FsQ2xvc3VyZVJlcHJlc2VudGF0aW9uTWFwKTsKCiAgLy8vIERlc2VyaWFsaXplcyBhIFtDbG9zdXJlRGF0YV0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBDbG9zdXJlRGF0YUltcGwucmVhZEZyb21EYXRhU291cmNlKAogICAgICBKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwLCBEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTdXBwb3J0IHNoYXJlZCBbU2NvcGVJbmZvXS4KICAgIE1hcDxNZW1iZXJFbnRpdHksIFNjb3BlSW5mbz4gc2NvcGVNYXAgPQogICAgICAgIHNvdXJjZS5yZWFkTWVtYmVyTWFwKCgpID0+IG5ldyBTY29wZUluZm8ucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSkpOwogICAgTWFwPGlyLlRyZWVOb2RlLCBDYXB0dXJlZFNjb3BlPiBjYXB0dXJlZFNjb3Blc01hcCA9IHNvdXJjZQogICAgICAgIC5yZWFkVHJlZU5vZGVNYXAoKCkgPT4gbmV3IENhcHR1cmVkU2NvcGUucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSkpOwogICAgTWFwPE1lbWJlckVudGl0eSwgQ2FwdHVyZWRTY29wZT4gY2FwdHVyZWRTY29wZUZvclNpZ25hdHVyZU1hcCA9IHNvdXJjZQogICAgICAgIC5yZWFkTWVtYmVyTWFwKCgpID0+IG5ldyBDYXB0dXJlZFNjb3BlLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpKTsKICAgIE1hcDxpci5UcmVlTm9kZSwgQ2xvc3VyZVJlcHJlc2VudGF0aW9uSW5mbz4gbG9jYWxDbG9zdXJlUmVwcmVzZW50YXRpb25NYXAgPQogICAgICAgIHNvdXJjZS5yZWFkVHJlZU5vZGVNYXAoCiAgICAgICAgICAgICgpID0+IG5ldyBDbG9zdXJlUmVwcmVzZW50YXRpb25JbmZvLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgQ2xvc3VyZURhdGFJbXBsKGVsZW1lbnRNYXAsIHNjb3BlTWFwLCBjYXB0dXJlZFNjb3Blc01hcCwKICAgICAgICBjYXB0dXJlZFNjb3BlRm9yU2lnbmF0dXJlTWFwLCBsb2NhbENsb3N1cmVSZXByZXNlbnRhdGlvbk1hcCk7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtDbG9zdXJlRGF0YV0gdG8gW3NpbmtdLgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVNZW1iZXJNYXAoCiAgICAgICAgX3Njb3BlTWFwLCAoU2NvcGVJbmZvIGluZm8pID0+IGluZm8ud3JpdGVUb0RhdGFTaW5rKHNpbmspKTsKICAgIHNpbmsud3JpdGVUcmVlTm9kZU1hcChfY2FwdHVyZWRTY29wZXNNYXAsIChDYXB0dXJlZFNjb3BlIHNjb3BlKSB7CiAgICAgIHNjb3BlLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIH0pOwogICAgc2luay53cml0ZU1lbWJlck1hcChfY2FwdHVyZWRTY29wZUZvclNpZ25hdHVyZU1hcCwKICAgICAgICAoQ2FwdHVyZWRTY29wZSBzY29wZSkgPT4gc2NvcGUud3JpdGVUb0RhdGFTaW5rKHNpbmspKTsKICAgIHNpbmsud3JpdGVUcmVlTm9kZU1hcChfbG9jYWxDbG9zdXJlUmVwcmVzZW50YXRpb25NYXAsCiAgICAgICAgKENsb3N1cmVSZXByZXNlbnRhdGlvbkluZm8gaW5mbykgewogICAgICBpbmZvLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIH0pOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIFNjb3BlSW5mbyBnZXRTY29wZUluZm8oTWVtYmVyRW50aXR5IGVudGl0eSkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMgY2hlY2sgd2hlbiBjb25zdHJ1Y3RvciBib2RpZXMgYSBjcmVhdGVkCiAgICAvLyBlYWdlcmx5IHdpdGggdGhlIEotbW9kZWw7IGEgY29uc3RydWN0b3IgYm9keSBzaG91bGQgaGF2ZSBpdCdzIG93bgogICAgLy8gW0Nsb3N1cmVSZXByZXNlbnRhdGlvbkluZm9dLgogICAgaWYgKGVudGl0eSBpcyBDb25zdHJ1Y3RvckJvZHlFbnRpdHkpIHsKICAgICAgQ29uc3RydWN0b3JCb2R5RW50aXR5IGNvbnN0cnVjdG9yQm9keSA9IGVudGl0eTsKICAgICAgZW50aXR5ID0gY29uc3RydWN0b3JCb2R5LmNvbnN0cnVjdG9yOwogICAgfQoKICAgIFNjb3BlSW5mbyBzY29wZUluZm8gPSBfc2NvcGVNYXBbZW50aXR5XTsKICAgIGFzc2VydCgKICAgICAgICBzY29wZUluZm8gIT0gbnVsbCwgZmFpbGVkQXQoZW50aXR5LCAiTWlzc2luZyBzY29wZSBpbmZvIGZvciAkZW50aXR5LiIpKTsKICAgIHJldHVybiBzY29wZUluZm87CiAgfQoKICAvLyBUT0RPKGVmb3J0dW5hKTogRXZlbnR1YWxseSBjYXB0dXJlZFNjb3Blc01hcFtub2RlXSBzaG91bGQgYWx3YXlzCiAgLy8gYmUgbm9uLW51bGwsIGFuZCB3ZSBzaG91bGQganVzdCB0ZXN0IHRoYXQgd2l0aCBhbiBhc3NlcnQuCiAgQG92ZXJyaWRlCiAgQ2FwdHVyZWRTY29wZSBnZXRDYXB0dXJlZFNjb3BlKE1lbWJlckVudGl0eSBlbnRpdHkpIHsKICAgIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiA9IF9lbGVtZW50TWFwLmdldE1lbWJlckRlZmluaXRpb24oZW50aXR5KTsKICAgIHN3aXRjaCAoZGVmaW5pdGlvbi5raW5kKSB7CiAgICAgIGNhc2UgTWVtYmVyS2luZC5yZWd1bGFyOgogICAgICBjYXNlIE1lbWJlcktpbmQuY29uc3RydWN0b3I6CiAgICAgIGNhc2UgTWVtYmVyS2luZC5jb25zdHJ1Y3RvckJvZHk6CiAgICAgIGNhc2UgTWVtYmVyS2luZC5jbG9zdXJlQ2FsbDoKICAgICAgICByZXR1cm4gX2NhcHR1cmVkU2NvcGVzTWFwW2RlZmluaXRpb24ubm9kZV0gPz8gY29uc3QgQ2FwdHVyZWRTY29wZSgpOwogICAgICBjYXNlIE1lbWJlcktpbmQuc2lnbmF0dXJlOgogICAgICAgIHJldHVybiBfY2FwdHVyZWRTY29wZUZvclNpZ25hdHVyZU1hcFtlbnRpdHldID8/IGNvbnN0IENhcHR1cmVkU2NvcGUoKTsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBmYWlsZWRBdChlbnRpdHksICJVbmV4cGVjdGVkIG1lbWJlciBkZWZpbml0aW9uICRkZWZpbml0aW9uIik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICAvLyBUT0RPKGVmb3J0dW5hKTogRXZlbnR1YWxseSBjYXB0dXJlZFNjb3Blc01hcFtub2RlXSBzaG91bGQgYWx3YXlzCiAgLy8gYmUgbm9uLW51bGwsIGFuZCB3ZSBzaG91bGQganVzdCB0ZXN0IHRoYXQgd2l0aCBhbiBhc3NlcnQuCiAgQ2FwdHVyZWRMb29wU2NvcGUgZ2V0Q2FwdHVyZWRMb29wU2NvcGUoaXIuTm9kZSBsb29wTm9kZSkgPT4KICAgICAgX2NhcHR1cmVkU2NvcGVzTWFwW2xvb3BOb2RlXSA/PyBjb25zdCBDYXB0dXJlZExvb3BTY29wZSgpOwoKICBAb3ZlcnJpZGUKICBDbG9zdXJlUmVwcmVzZW50YXRpb25JbmZvIGdldENsb3N1cmVJbmZvKGlyLk5vZGUgbm9kZSkgewogICAgYXNzZXJ0KG5vZGUgaXMgaXIuRnVuY3Rpb25FeHByZXNzaW9uIHx8IG5vZGUgaXMgaXIuRnVuY3Rpb25EZWNsYXJhdGlvbik7CiAgICB2YXIgY2xvc3VyZSA9IF9sb2NhbENsb3N1cmVSZXByZXNlbnRhdGlvbk1hcFtub2RlXTsKICAgIGFzc2VydCgKICAgICAgICBjbG9zdXJlICE9IG51bGwsCiAgICAgICAgIkNvcnJlc3BvbmRpbmcgY2xvc3VyZSBjbGFzcyBub3QgZm91bmQgZm9yICRub2RlLiAiCiAgICAgICAgIkNsb3N1cmVzIGZvdW5kIGZvciAke19sb2NhbENsb3N1cmVSZXByZXNlbnRhdGlvbk1hcC5rZXlzfSIpOwogICAgcmV0dXJuIGNsb3N1cmU7CiAgfQp9CgovLy8gQ2xvc3VyZSBjb252ZXJzaW9uIGNvZGUgdXNpbmcgb3VyIG5ldyBFbnRpdHkgbW9kZWwuIENsb3N1cmUgY29udmVyc2lvbiBpcwovLy8gbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIHNlbWFudGljcyBvZiBjbG9zdXJlcyBhcmUgc2xpZ2h0bHkgZGlmZmVyZW50IGluIERhcnQKLy8vIHRoYW4gSmF2YVNjcmlwdC4gQ2xvc3VyZSBjb252ZXJzaW9uIGlzIHNlcGFyYXRlZCBvdXQgaW50byB0d28gcGhhc2VzOgovLy8gZ2VuZXJhdGlvbiBvZiBhIG5ldyAodGVtcG9yYXJ5KSByZXByZXNlbnRhdGlvbiB0byBzdG9yZSB3aGVyZSB2YXJpYWJsZXMgbmVlZAovLy8gdG8gYmUgaG9pc3RlZC9jYXB0dXJlZCB1cCBhdCBhbm90aGVyIGxldmVsIHRvIHJlLXdyaXRlIHRoZSBjbG9zdXJlLCBhbmQgdGhlbgovLy8gdGhlIGNvZGUgZ2VuZXJhdGlvbiBwaGFzZSB3aGVyZSB3ZSBnZW5lcmF0ZSBlbGVtZW50cyBhbmQvb3IgaW5zdHJ1Y3Rpb25zIHRvCi8vLyByZXByZXNlbnQgdGhpcyBuZXcgY29kZSBwYXRoLgovLy8KLy8vIEZvciBhIGdlbmVyYWwgZXhwbGFuYXRpb24gb2YgaG93IGNsb3N1cmUgY29udmVyc2lvbiB3b3JrcyBhdCBhIGhpZ2ggbGV2ZWwsCi8vLyBjaGVjayBvdXQ6Ci8vLyBodHRwOi8vc2llay5ibG9nc3BvdC5jb20vMjAxMi8wNy9lc3NlbmNlLW9mLWNsb3N1cmUtY29udmVyc2lvbi5odG1sIG9yCi8vLyBodHRwOi8vbWF0dC5taWdodC5uZXQvYXJ0aWNsZXMvY2xvc3VyZS1jb252ZXJzaW9uLy4KCmNsYXNzIENsb3N1cmVEYXRhQnVpbGRlciB7CiAgZmluYWwgSnNUb0VsZW1lbnRNYXAgX2VsZW1lbnRNYXA7CiAgZmluYWwgR2xvYmFsTG9jYWxzTWFwIF9nbG9iYWxMb2NhbHNNYXA7CiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwoKICAvLy8gTWFwIG9mIHRoZSBzY29waW5nIGluZm9ybWF0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGVudGl0eS4KICBNYXA8TWVtYmVyRW50aXR5LCBTY29wZUluZm8+IF9zY29wZU1hcCA9IHt9OwogIE1hcDxpci5UcmVlTm9kZSwgQ2FwdHVyZWRTY29wZT4gX2NhcHR1cmVkU2NvcGVzTWFwID0ge307CiAgLy8gSW5kaWNhdGVzIHRoZSB0eXBlIHZhcmlhYmxlcyAoaWYgYW55KSB0aGF0IGFyZSBjYXB0dXJlZCBpbiBhIGdpdmVuCiAgLy8gU2lnbmF0dXJlIGZ1bmN0aW9uLgogIE1hcDxNZW1iZXJFbnRpdHksIENhcHR1cmVkU2NvcGU+IF9jYXB0dXJlZFNjb3BlRm9yU2lnbmF0dXJlTWFwID0ge307CgogIC8vIFRoZSBrZXkgaXMgZWl0aGVyIGEgW2lyLkZ1bmN0aW9uRGVjbGFyYXRpb25dIG9yIFtpci5GdW5jdGlvbkV4cHJlc3Npb25dLgogIE1hcDxpci5UcmVlTm9kZSwgQ2xvc3VyZVJlcHJlc2VudGF0aW9uSW5mbz4gX2xvY2FsQ2xvc3VyZVJlcHJlc2VudGF0aW9uTWFwID0KICAgICAge307CgogIENsb3N1cmVEYXRhQnVpbGRlcih0aGlzLl9lbGVtZW50TWFwLCB0aGlzLl9nbG9iYWxMb2NhbHNNYXAsIHRoaXMuX29wdGlvbnMpOwoKICB2b2lkIF91cGRhdGVTY29wZUJhc2VkT25SdGlOZWVkKEtlcm5lbFNjb3BlSW5mbyBzY29wZSwgQ2xvc3VyZVJ0aU5lZWQgcnRpTmVlZCwKICAgICAgTWVtYmVyRW50aXR5IG91dGVybW9zdEVudGl0eSkgewogICAgYm9vbCBpbmNsdWRlRm9yUnRpKFNldDxWYXJpYWJsZVVzZT4gdXNlU2V0KSB7CiAgICAgIGZvciAoVmFyaWFibGVVc2UgdXNhZ2UgaW4gdXNlU2V0KSB7CiAgICAgICAgc3dpdGNoICh1c2FnZS5raW5kKSB7CiAgICAgICAgICBjYXNlIFZhcmlhYmxlVXNlS2luZC5leHBsaWNpdDoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBWYXJpYWJsZVVzZUtpbmQuaW1wbGljaXRDYXN0OgogICAgICAgICAgICBpZiAoX29wdGlvbnMuaW1wbGljaXREb3duY2FzdENoZWNrUG9saWN5LmlzRW1pdHRlZCkgewogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBWYXJpYWJsZVVzZUtpbmQubG9jYWxUeXBlOgogICAgICAgICAgICBpZiAoX29wdGlvbnMuYXNzaWdubWVudENoZWNrUG9saWN5LmlzRW1pdHRlZCkgewogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgVmFyaWFibGVVc2VLaW5kLmNvbnN0cnVjdG9yVHlwZUFyZ3VtZW50OgogICAgICAgICAgICBDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvciA9CiAgICAgICAgICAgICAgICBfZWxlbWVudE1hcC5nZXRDb25zdHJ1Y3Rvcih1c2FnZS5tZW1iZXIpOwogICAgICAgICAgICBpZiAocnRpTmVlZC5jbGFzc05lZWRzVHlwZUFyZ3VtZW50cyhjb25zdHJ1Y3Rvci5lbmNsb3NpbmdDbGFzcykpIHsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgVmFyaWFibGVVc2VLaW5kLnN0YXRpY1R5cGVBcmd1bWVudDoKICAgICAgICAgICAgRnVuY3Rpb25FbnRpdHkgbWV0aG9kID0gX2VsZW1lbnRNYXAuZ2V0TWV0aG9kKHVzYWdlLm1lbWJlcik7CiAgICAgICAgICAgIGlmIChydGlOZWVkLm1ldGhvZE5lZWRzVHlwZUFyZ3VtZW50cyhtZXRob2QpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIFZhcmlhYmxlVXNlS2luZC5pbnN0YW5jZVR5cGVBcmd1bWVudDoKICAgICAgICAgICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBfZWxlbWVudE1hcC5nZXRTZWxlY3Rvcih1c2FnZS5pbnZvY2F0aW9uKTsKICAgICAgICAgICAgaWYgKHJ0aU5lZWQuc2VsZWN0b3JOZWVkc1R5cGVBcmd1bWVudHMoc2VsZWN0b3IpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIFZhcmlhYmxlVXNlS2luZC5sb2NhbFR5cGVBcmd1bWVudDoKICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdHJhY2sgZGlyZWN0IGxvY2FsCiAgICAgICAgICAgIC8vIGZ1bmN0aW9uIGludm9jYXRpb25zIGFuZCBub3QgaGF2ZSB0byB1c2UgdGhlIHNlbGVjdG9yIGhlcmUuCiAgICAgICAgICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gX2VsZW1lbnRNYXAuZ2V0U2VsZWN0b3IodXNhZ2UuaW52b2NhdGlvbik7CiAgICAgICAgICAgIGlmIChydGlOZWVkLmxvY2FsRnVuY3Rpb25OZWVkc1R5cGVBcmd1bWVudHModXNhZ2UubG9jYWxGdW5jdGlvbikgfHwKICAgICAgICAgICAgICAgIHJ0aU5lZWQuc2VsZWN0b3JOZWVkc1R5cGVBcmd1bWVudHMoc2VsZWN0b3IpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIFZhcmlhYmxlVXNlS2luZC5tZW1iZXJQYXJhbWV0ZXI6CiAgICAgICAgICAgIGlmIChfb3B0aW9ucy5wYXJhbWV0ZXJDaGVja1BvbGljeS5pc0VtaXR0ZWQpIHsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBGdW5jdGlvbkVudGl0eSBtZXRob2QgPSBfZWxlbWVudE1hcC5nZXRNZXRob2QodXNhZ2UubWVtYmVyKTsKICAgICAgICAgICAgICBpZiAocnRpTmVlZC5tZXRob2ROZWVkc1NpZ25hdHVyZShtZXRob2QpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIFZhcmlhYmxlVXNlS2luZC5sb2NhbFBhcmFtZXRlcjoKICAgICAgICAgICAgaWYgKF9vcHRpb25zLnBhcmFtZXRlckNoZWNrUG9saWN5LmlzRW1pdHRlZCkgewogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKHJ0aU5lZWQKICAgICAgICAgICAgICAgIC5sb2NhbEZ1bmN0aW9uTmVlZHNTaWduYXR1cmUodXNhZ2UubG9jYWxGdW5jdGlvbikpIHsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgVmFyaWFibGVVc2VLaW5kLm1lbWJlclJldHVyblR5cGU6CiAgICAgICAgICAgIGlmIChfb3B0aW9ucy5hc3NpZ25tZW50Q2hlY2tQb2xpY3kuaXNFbWl0dGVkKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgRnVuY3Rpb25FbnRpdHkgbWV0aG9kID0gX2VsZW1lbnRNYXAuZ2V0TWV0aG9kKHVzYWdlLm1lbWJlcik7CiAgICAgICAgICAgICAgaWYgKHJ0aU5lZWQubWV0aG9kTmVlZHNTaWduYXR1cmUobWV0aG9kKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBWYXJpYWJsZVVzZUtpbmQubG9jYWxSZXR1cm5UeXBlOgogICAgICAgICAgICBpZiAoX29wdGlvbnMuYXNzaWdubWVudENoZWNrUG9saWN5LmlzRW1pdHRlZCkgewogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKHJ0aU5lZWQKICAgICAgICAgICAgICAgIC5sb2NhbEZ1bmN0aW9uTmVlZHNTaWduYXR1cmUodXNhZ2UubG9jYWxGdW5jdGlvbikpIHsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgVmFyaWFibGVVc2VLaW5kLmZpZWxkVHlwZToKICAgICAgICAgICAgaWYgKF9vcHRpb25zLmFzc2lnbm1lbnRDaGVja1BvbGljeS5pc0VtaXR0ZWQgfHwKICAgICAgICAgICAgICAgIF9vcHRpb25zLnBhcmFtZXRlckNoZWNrUG9saWN5LmlzRW1pdHRlZCkgewogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBWYXJpYWJsZVVzZUtpbmQubGlzdExpdGVyYWw6CiAgICAgICAgICAgIGlmIChydGlOZWVkLmNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKAogICAgICAgICAgICAgICAgX2VsZW1lbnRNYXAuY29tbW9uRWxlbWVudHMuanNBcnJheUNsYXNzKSkgewogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBWYXJpYWJsZVVzZUtpbmQuc2V0TGl0ZXJhbDoKICAgICAgICAgICAgaWYgKHJ0aU5lZWQuY2xhc3NOZWVkc1R5cGVBcmd1bWVudHMoCiAgICAgICAgICAgICAgICBfZWxlbWVudE1hcC5jb21tb25FbGVtZW50cy5zZXRMaXRlcmFsQ2xhc3MpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIFZhcmlhYmxlVXNlS2luZC5tYXBMaXRlcmFsOgogICAgICAgICAgICBpZiAocnRpTmVlZC5jbGFzc05lZWRzVHlwZUFyZ3VtZW50cygKICAgICAgICAgICAgICAgIF9lbGVtZW50TWFwLmNvbW1vbkVsZW1lbnRzLm1hcExpdGVyYWxDbGFzcykpIHsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgVmFyaWFibGVVc2VLaW5kLmluc3RhbnRpYXRpb25UeXBlQXJndW1lbnQ6CiAgICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSB0aGUgc3RhdGljIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24uCiAgICAgICAgICAgIGlmIChydGlOZWVkLmluc3RhbnRpYXRpb25OZWVkc1R5cGVBcmd1bWVudHMoCiAgICAgICAgICAgICAgICBudWxsLCB1c2FnZS5pbnN0YW50aWF0aW9uLnR5cGVBcmd1bWVudHMubGVuZ3RoKSkgewogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaWYgKGluY2x1ZGVGb3JSdGkoc2NvcGUudGhpc1VzZWRBc0ZyZWVWYXJpYWJsZUlmTmVlZHNSdGkpKSB7CiAgICAgIHNjb3BlLnRoaXNVc2VkQXNGcmVlVmFyaWFibGUgPSB0cnVlOwogICAgfQogICAgc2NvcGUuZnJlZVZhcmlhYmxlc0ZvclJ0aS5mb3JFYWNoKAogICAgICAgIChUeXBlVmFyaWFibGVUeXBlV2l0aENvbnRleHQgdHlwZVZhcmlhYmxlLCBTZXQ8VmFyaWFibGVVc2U+IHVzZVNldCkgewogICAgICBpZiAoaW5jbHVkZUZvclJ0aSh1c2VTZXQpKSB7CiAgICAgICAgc2NvcGUuZnJlZVZhcmlhYmxlcy5hZGQodHlwZVZhcmlhYmxlKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBDbG9zdXJlRGF0YSBjcmVhdGVDbG9zdXJlRW50aXRpZXMoCiAgICAgIEpzQ2xvc2VkV29ybGRCdWlsZGVyIGNsb3NlZFdvcmxkQnVpbGRlciwKICAgICAgTWFwPE1lbWJlckVudGl0eSwgQ2xvc3VyZVNjb3BlTW9kZWw+IGNsb3N1cmVNb2RlbHMsCiAgICAgIENsb3N1cmVSdGlOZWVkIHJ0aU5lZWQsCiAgICAgIExpc3Q8RnVuY3Rpb25FbnRpdHk+IGNhbGxNZXRob2RzKSB7CiAgICBjbG9zdXJlTW9kZWxzLmZvckVhY2goKE1lbWJlckVudGl0eSBtZW1iZXIsIENsb3N1cmVTY29wZU1vZGVsIG1vZGVsKSB7CiAgICAgIEtlcm5lbFRvTG9jYWxzTWFwIGxvY2Fsc01hcCA9IF9nbG9iYWxMb2NhbHNNYXAuZ2V0TG9jYWxzTWFwKG1lbWJlcik7CiAgICAgIE1hcDxMb2NhbCwgSlJlY29yZEZpZWxkPiBhbGxCb3hlZFZhcmlhYmxlcyA9CiAgICAgICAgICBfZWxlbWVudE1hcC5tYWtlUmVjb3JkQ29udGFpbmVyKG1vZGVsLnNjb3BlSW5mbywgbWVtYmVyLCBsb2NhbHNNYXApOwogICAgICBfc2NvcGVNYXBbbWVtYmVyXSA9IG5ldyBKc1Njb3BlSW5mby5mcm9tKAogICAgICAgICAgYWxsQm94ZWRWYXJpYWJsZXMsIG1vZGVsLnNjb3BlSW5mbywgbG9jYWxzTWFwLCBfZWxlbWVudE1hcCk7CgogICAgICBtb2RlbC5jYXB0dXJlZFNjb3Blc01hcAogICAgICAgICAgLmZvckVhY2goKGlyLk5vZGUgbm9kZSwgS2VybmVsQ2FwdHVyZWRTY29wZSBzY29wZSkgewogICAgICAgIE1hcDxMb2NhbCwgSlJlY29yZEZpZWxkPiBib3hlZFZhcmlhYmxlcyA9CiAgICAgICAgICAgIF9lbGVtZW50TWFwLm1ha2VSZWNvcmRDb250YWluZXIoc2NvcGUsIG1lbWJlciwgbG9jYWxzTWFwKTsKICAgICAgICBfdXBkYXRlU2NvcGVCYXNlZE9uUnRpTmVlZChzY29wZSwgcnRpTmVlZCwgbWVtYmVyKTsKCiAgICAgICAgaWYgKHNjb3BlIGlzIEtlcm5lbENhcHR1cmVkTG9vcFNjb3BlKSB7CiAgICAgICAgICBfY2FwdHVyZWRTY29wZXNNYXBbbm9kZV0gPSBuZXcgSnNDYXB0dXJlZExvb3BTY29wZS5mcm9tKAogICAgICAgICAgICAgIGJveGVkVmFyaWFibGVzLCBzY29wZSwgbG9jYWxzTWFwLCBfZWxlbWVudE1hcCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIF9jYXB0dXJlZFNjb3Blc01hcFtub2RlXSA9IG5ldyBKc0NhcHR1cmVkU2NvcGUuZnJvbSgKICAgICAgICAgICAgICBib3hlZFZhcmlhYmxlcywgc2NvcGUsIGxvY2Fsc01hcCwgX2VsZW1lbnRNYXApOwogICAgICAgIH0KICAgICAgICBhbGxCb3hlZFZhcmlhYmxlcy5hZGRBbGwoYm94ZWRWYXJpYWJsZXMpOwogICAgICB9KTsKCiAgICAgIE1hcDxpci5UcmVlTm9kZSwgS2VybmVsU2NvcGVJbmZvPiBjbG9zdXJlc1RvR2VuZXJhdGUgPQogICAgICAgICAgbW9kZWwuY2xvc3VyZXNUb0dlbmVyYXRlOwogICAgICBmb3IgKGlyLlRyZWVOb2RlIG5vZGUgaW4gY2xvc3VyZXNUb0dlbmVyYXRlLmtleXMpIHsKICAgICAgICBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb25Ob2RlOwogICAgICAgIGlmIChub2RlIGlzIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24pIHsKICAgICAgICAgIGZ1bmN0aW9uTm9kZSA9IG5vZGUuZnVuY3Rpb247CiAgICAgICAgfSBlbHNlIGlmIChub2RlIGlzIGlyLkZ1bmN0aW9uRXhwcmVzc2lvbikgewogICAgICAgICAgZnVuY3Rpb25Ob2RlID0gbm9kZS5mdW5jdGlvbjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZmFpbGVkQXQobWVtYmVyLCAiVW5leHBlY3RlZCBjbG9zdXJlIG5vZGUgJHtub2RlfSIpOwogICAgICAgIH0KICAgICAgICBLZXJuZWxDbG9zdXJlQ2xhc3NJbmZvIGNsb3N1cmVDbGFzc0luZm8gPSBfcHJvZHVjZVN5bnRoZXRpY0VsZW1lbnRzKAogICAgICAgICAgICBjbG9zZWRXb3JsZEJ1aWxkZXIsCiAgICAgICAgICAgIG1lbWJlciwKICAgICAgICAgICAgZnVuY3Rpb25Ob2RlLAogICAgICAgICAgICBjbG9zdXJlc1RvR2VuZXJhdGVbbm9kZV0sCiAgICAgICAgICAgIGFsbEJveGVkVmFyaWFibGVzLAogICAgICAgICAgICBydGlOZWVkLAogICAgICAgICAgICBjcmVhdGVTaWduYXR1cmVNZXRob2Q6CiAgICAgICAgICAgICAgICBydGlOZWVkLmxvY2FsRnVuY3Rpb25OZWVkc1NpZ25hdHVyZShmdW5jdGlvbk5vZGUucGFyZW50KSk7CiAgICAgICAgLy8gQWRkIGFsc28gZm9yIHRoZSBjYWxsIG1ldGhvZC4KICAgICAgICBfc2NvcGVNYXBbY2xvc3VyZUNsYXNzSW5mby5jYWxsTWV0aG9kXSA9IGNsb3N1cmVDbGFzc0luZm87CiAgICAgICAgaWYgKGNsb3N1cmVDbGFzc0luZm8uc2lnbmF0dXJlTWV0aG9kICE9IG51bGwpIHsKICAgICAgICAgIF9zY29wZU1hcFtjbG9zdXJlQ2xhc3NJbmZvLnNpZ25hdHVyZU1ldGhvZF0gPSBjbG9zdXJlQ2xhc3NJbmZvOwoKICAgICAgICAgIC8vIFNldCB1cCBjYXB0dXJlZFNjb3BlIGZvciBzaWduYXR1cmUgbWV0aG9kLiBUaGlzIGlzIGRpc3RpbmN0IGZyb20KICAgICAgICAgIC8vIF9jYXB0dXJlZFNjb3Blc01hcCBiZWNhdXNlIHRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgaXIuTm9kZSBmb3IKICAgICAgICAgIC8vIHRoZSBzaWduYXR1cmUuCiAgICAgICAgICBpZiAocnRpTmVlZC5sb2NhbEZ1bmN0aW9uTmVlZHNTaWduYXR1cmUoZnVuY3Rpb25Ob2RlLnBhcmVudCkgJiYKICAgICAgICAgICAgICBtb2RlbC5jYXB0dXJlZFNjb3Blc01hcFtmdW5jdGlvbk5vZGVdICE9IG51bGwpIHsKICAgICAgICAgICAgS2VybmVsQ2FwdHVyZWRTY29wZSBjYXB0dXJlZFNjb3BlID0KICAgICAgICAgICAgICAgIG1vZGVsLmNhcHR1cmVkU2NvcGVzTWFwW2Z1bmN0aW9uTm9kZV07CiAgICAgICAgICAgIGFzc2VydChjYXB0dXJlZFNjb3BlIGlzISBLZXJuZWxDYXB0dXJlZExvb3BTY29wZSk7CiAgICAgICAgICAgIEtlcm5lbENhcHR1cmVkU2NvcGUgc2lnbmF0dXJlQ2FwdHVyZWRTY29wZSA9CiAgICAgICAgICAgICAgICBuZXcgS2VybmVsQ2FwdHVyZWRTY29wZS5mb3JTaWduYXR1cmUoY2FwdHVyZWRTY29wZSk7CiAgICAgICAgICAgIF91cGRhdGVTY29wZUJhc2VkT25SdGlOZWVkKHNpZ25hdHVyZUNhcHR1cmVkU2NvcGUsIHJ0aU5lZWQsIG1lbWJlcik7CiAgICAgICAgICAgIF9jYXB0dXJlZFNjb3BlRm9yU2lnbmF0dXJlTWFwW2Nsb3N1cmVDbGFzc0luZm8uc2lnbmF0dXJlTWV0aG9kXSA9CiAgICAgICAgICAgICAgICBuZXcgSnNDYXB0dXJlZFNjb3BlLmZyb20oCiAgICAgICAgICAgICAgICAgICAge30sIHNpZ25hdHVyZUNhcHR1cmVkU2NvcGUsIGxvY2Fsc01hcCwgX2VsZW1lbnRNYXApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjYWxsTWV0aG9kcy5hZGQoY2xvc3VyZUNsYXNzSW5mby5jYWxsTWV0aG9kKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gbmV3IENsb3N1cmVEYXRhSW1wbChfZWxlbWVudE1hcCwgX3Njb3BlTWFwLCBfY2FwdHVyZWRTY29wZXNNYXAsCiAgICAgICAgX2NhcHR1cmVkU2NvcGVGb3JTaWduYXR1cmVNYXAsIF9sb2NhbENsb3N1cmVSZXByZXNlbnRhdGlvbk1hcCk7CiAgfQoKICAvLy8gR2l2ZW4gd2hhdCB2YXJpYWJsZXMgYXJlIGNhcHR1cmVkIGF0IGVhY2ggcG9pbnQsIGNvbnN0cnVjdCBjbG9zdXJlIGNsYXNzZXMKICAvLy8gd2l0aCBmaWVsZHMgY29udGFpbmluZyB0aGUgY2FwdHVyZWQgdmFyaWFibGVzIHRvIHJlcGxpY2F0ZSB0aGUgRGFydAogIC8vLyBjbG9zdXJlIHNlbWFudGljcyBpbiBKUy4gSWYgdGhpcyBjbG9zdXJlIGNhcHR1cmVzIGFueSB2YXJpYWJsZXMgKG1lYW5pbmcKICAvLy8gdGhlIGNsb3N1cmUgYWNjZXNzZXMgYSB2YXJpYWJsZSB0aGF0IGdldHMgYWNjZXNzZWQgYXQgc29tZSBwb2ludCksIHRoZW4KICAvLy8gYm94Rm9yQ2FwdHVyZWRWYXJpYWJsZXMgc3RvcmVzIHRoZSBsb2NhbCBjb250ZXh0IGZvciB0aG9zZSB2YXJpYWJsZXMuCiAgLy8vIElmIG5vIHZhcmlhYmxlcyBhcmUgY2FwdHVyZWQsIHRoaXMgcGFyYW1ldGVyIGlzIG51bGwuCiAgS2VybmVsQ2xvc3VyZUNsYXNzSW5mbyBfcHJvZHVjZVN5bnRoZXRpY0VsZW1lbnRzKAogICAgICBKc0Nsb3NlZFdvcmxkQnVpbGRlciBjbG9zZWRXb3JsZEJ1aWxkZXIsCiAgICAgIE1lbWJlckVudGl0eSBtZW1iZXIsCiAgICAgIGlyLkZ1bmN0aW9uTm9kZSBub2RlLAogICAgICBLZXJuZWxTY29wZUluZm8gaW5mbywKICAgICAgTWFwPExvY2FsLCBKUmVjb3JkRmllbGQ+IGJveGVkVmFyaWFibGVzLAogICAgICBDbG9zdXJlUnRpTmVlZCBydGlOZWVkLAogICAgICB7Ym9vbCBjcmVhdGVTaWduYXR1cmVNZXRob2R9KSB7CiAgICBfdXBkYXRlU2NvcGVCYXNlZE9uUnRpTmVlZChpbmZvLCBydGlOZWVkLCBtZW1iZXIpOwogICAgS2VybmVsVG9Mb2NhbHNNYXAgbG9jYWxzTWFwID0gX2dsb2JhbExvY2Fsc01hcC5nZXRMb2NhbHNNYXAobWVtYmVyKTsKICAgIEtlcm5lbENsb3N1cmVDbGFzc0luZm8gY2xvc3VyZUNsYXNzSW5mbyA9CiAgICAgICAgY2xvc2VkV29ybGRCdWlsZGVyLmJ1aWxkQ2xvc3VyZUNsYXNzKAogICAgICAgICAgICBtZW1iZXIsIG5vZGUsIG1lbWJlci5saWJyYXJ5LCBib3hlZFZhcmlhYmxlcywgaW5mbywgbG9jYWxzTWFwLAogICAgICAgICAgICBjcmVhdGVTaWduYXR1cmVNZXRob2Q6IGNyZWF0ZVNpZ25hdHVyZU1ldGhvZCk7CgogICAgLy8gV2Ugd2FudCB0aGUgb3JpZ2luYWwgZGVjbGFyYXRpb24gd2hlcmUgdGhhdCBmdW5jdGlvbiBpcyB1c2VkIHRvIHBvaW50CiAgICAvLyB0byB0aGUgY29ycmVjdCBjbG9zdXJlIGNsYXNzLgogICAgX2dsb2JhbExvY2Fsc01hcC5zZXRMb2NhbHNNYXAoY2xvc3VyZUNsYXNzSW5mby5jYWxsTWV0aG9kLCBsb2NhbHNNYXApOwogICAgaWYgKGNsb3N1cmVDbGFzc0luZm8uc2lnbmF0dXJlTWV0aG9kICE9IG51bGwpIHsKICAgICAgX2dsb2JhbExvY2Fsc01hcC5zZXRMb2NhbHNNYXAoCiAgICAgICAgICBjbG9zdXJlQ2xhc3NJbmZvLnNpZ25hdHVyZU1ldGhvZCwgbG9jYWxzTWFwKTsKICAgIH0KICAgIGlmIChub2RlLnBhcmVudCBpcyBpci5NZW1iZXIpIHsKICAgICAgYXNzZXJ0KF9lbGVtZW50TWFwLmdldE1lbWJlcihub2RlLnBhcmVudCkgPT0gbWVtYmVyKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChub2RlLnBhcmVudCBpcyBpci5GdW5jdGlvbkV4cHJlc3Npb24gfHwKICAgICAgICAgIG5vZGUucGFyZW50IGlzIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24pOwogICAgICBfbG9jYWxDbG9zdXJlUmVwcmVzZW50YXRpb25NYXBbbm9kZS5wYXJlbnRdID0gY2xvc3VyZUNsYXNzSW5mbzsKICAgIH0KICAgIHJldHVybiBjbG9zdXJlQ2xhc3NJbmZvOwogIH0KfQoKLy8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IG9yIGNyZWF0ZSBhIExvY2FsIHZhcmlhYmxlIG91dCBvZiBhIHZhcmlhYmxlCi8vLyBkZWNsYXJhdGlvbiBvciB0eXBlIHBhcmFtZXRlci4KTG9jYWwgX2dldExvY2FsKAogICAgaXIuTm9kZSB2YXJpYWJsZSwgS2VybmVsVG9Mb2NhbHNNYXAgbG9jYWxzTWFwLCBKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwKSB7CiAgYXNzZXJ0KHZhcmlhYmxlIGlzIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gfHwKICAgICAgdmFyaWFibGUgaXMgVHlwZVZhcmlhYmxlVHlwZVdpdGhDb250ZXh0KTsKICBpZiAodmFyaWFibGUgaXMgaXIuVmFyaWFibGVEZWNsYXJhdGlvbikgewogICAgcmV0dXJuIGxvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKHZhcmlhYmxlKTsKICB9IGVsc2UgaWYgKHZhcmlhYmxlIGlzIFR5cGVWYXJpYWJsZVR5cGVXaXRoQ29udGV4dCkgewogICAgcmV0dXJuIGxvY2Fsc01hcC5nZXRMb2NhbFR5cGVWYXJpYWJsZSh2YXJpYWJsZS50eXBlLCBlbGVtZW50TWFwKTsKICB9CiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ09ubHkga25vdyBob3cgdG8gZ2V0L2NyZWF0ZSBsb2NhbHMgZm9yICcKICAgICAgJ1ZhcmlhYmxlRGVjbGFyYXRpb25zIG9yIFR5cGVQYXJhbWV0ZXJUeXBlV2l0aENvbnRleHQuIFJlY2lldmVkICcKICAgICAgJyR7dmFyaWFibGUucnVudGltZVR5cGV9Jyk7Cn0KCmNsYXNzIEpzU2NvcGVJbmZvIGV4dGVuZHMgU2NvcGVJbmZvIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0pzU2NvcGVJbmZvXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ3Njb3BlLWluZm8nOwoKICBmaW5hbCBJdGVyYWJsZTxMb2NhbD4gbG9jYWxzVXNlZEluVHJ5T3JTeW5jOwogIEBvdmVycmlkZQogIGZpbmFsIExvY2FsIHRoaXNMb2NhbDsKICBmaW5hbCBNYXA8TG9jYWwsIEpSZWNvcmRGaWVsZD4gYm94ZWRWYXJpYWJsZXM7CgogIC8vLyBUaGUgc2V0IG9mIHZhcmlhYmxlcyB0aGF0IHdlcmUgZGVmaW5lZCBpbiBhbm90aGVyIHNjb3BlLCBidXQgYXJlIHVzZWQgaW4KICAvLy8gdGhpcyBzY29wZS4KICBmaW5hbCBTZXQ8TG9jYWw+IGZyZWVWYXJpYWJsZXM7CgogIEpzU2NvcGVJbmZvLmludGVybmFsKHRoaXMubG9jYWxzVXNlZEluVHJ5T3JTeW5jLCB0aGlzLnRoaXNMb2NhbCwKICAgICAgdGhpcy5ib3hlZFZhcmlhYmxlcywgdGhpcy5mcmVlVmFyaWFibGVzKTsKCiAgSnNTY29wZUluZm8uZnJvbSh0aGlzLmJveGVkVmFyaWFibGVzLCBLZXJuZWxTY29wZUluZm8gaW5mbywKICAgICAgS2VybmVsVG9Mb2NhbHNNYXAgbG9jYWxzTWFwLCBKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwKQogICAgICA6IHRoaXMudGhpc0xvY2FsID0gaW5mby5oYXNUaGlzTG9jYWwKICAgICAgICAgICAgPyBuZXcgVGhpc0xvY2FsKGxvY2Fsc01hcC5jdXJyZW50TWVtYmVyLmVuY2xvc2luZ0NsYXNzKQogICAgICAgICAgICA6IG51bGwsCiAgICAgICAgdGhpcy5sb2NhbHNVc2VkSW5UcnlPclN5bmMgPQogICAgICAgICAgICBpbmZvLmxvY2Fsc1VzZWRJblRyeU9yU3luYy5tYXAobG9jYWxzTWFwLmdldExvY2FsVmFyaWFibGUpLnRvU2V0KCksCiAgICAgICAgdGhpcy5mcmVlVmFyaWFibGVzID0gaW5mby5mcmVlVmFyaWFibGVzCiAgICAgICAgICAgIC5tYXAoKGlyLk5vZGUgbm9kZSkgPT4gX2dldExvY2FsKG5vZGUsIGxvY2Fsc01hcCwgZWxlbWVudE1hcCkpCiAgICAgICAgICAgIC50b1NldCgpIHsKICAgIGlmIChpbmZvLnRoaXNVc2VkQXNGcmVlVmFyaWFibGUpIHsKICAgICAgdGhpcy5mcmVlVmFyaWFibGVzLmFkZCh0aGlzLnRoaXNMb2NhbCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hCb3hlZFZhcmlhYmxlKGYoTG9jYWwgbG9jYWwsIEZpZWxkRW50aXR5IGZpZWxkKSkgewogICAgYm94ZWRWYXJpYWJsZXMuZm9yRWFjaCgoTG9jYWwgbCwgSlJlY29yZEZpZWxkIGJveCkgewogICAgICBmKGwsIGJveCk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgbG9jYWxJc1VzZWRJblRyeU9yU3luYyhMb2NhbCB2YXJpYWJsZSkgPT4KICAgICAgbG9jYWxzVXNlZEluVHJ5T3JTeW5jLmNvbnRhaW5zKHZhcmlhYmxlKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJ3RoaXM9JHRoaXNMb2NhbCwnKTsKICAgIHNiLndyaXRlKCdsb2NhbHNVc2VkSW5UcnlPclN5bmM9eyR7bG9jYWxzVXNlZEluVHJ5T3JTeW5jLmpvaW4oJywgJyl9fScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzQm94ZWRWYXJpYWJsZShMb2NhbCB2YXJpYWJsZSkgPT4gYm94ZWRWYXJpYWJsZXMuY29udGFpbnNLZXkodmFyaWFibGUpOwoKICBmYWN0b3J5IEpzU2NvcGVJbmZvLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBJdGVyYWJsZTxMb2NhbD4gbG9jYWxzVXNlZEluVHJ5T3JTeW5jID0gc291cmNlLnJlYWRMb2NhbHMoKTsKICAgIExvY2FsIHRoaXNMb2NhbCA9IHNvdXJjZS5yZWFkTG9jYWxPck51bGwoKTsKICAgIE1hcDxMb2NhbCwgSlJlY29yZEZpZWxkPiBib3hlZFZhcmlhYmxlcyA9CiAgICAgICAgc291cmNlLnJlYWRMb2NhbE1hcDxMb2NhbCwgSlJlY29yZEZpZWxkPigoKSA9PiBzb3VyY2UucmVhZE1lbWJlcigpKTsKICAgIFNldDxMb2NhbD4gZnJlZVZhcmlhYmxlcyA9IHNvdXJjZS5yZWFkTG9jYWxzKCkudG9TZXQoKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgSnNTY29wZUluZm8uaW50ZXJuYWwoCiAgICAgICAgbG9jYWxzVXNlZEluVHJ5T3JTeW5jLCB0aGlzTG9jYWwsIGJveGVkVmFyaWFibGVzLCBmcmVlVmFyaWFibGVzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKFNjb3BlSW5mb0tpbmQuc2NvcGVJbmZvKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVMb2NhbHMobG9jYWxzVXNlZEluVHJ5T3JTeW5jKTsKICAgIHNpbmsud3JpdGVMb2NhbE9yTnVsbCh0aGlzTG9jYWwpOwogICAgc2luay53cml0ZUxvY2FsTWFwKGJveGVkVmFyaWFibGVzLCBzaW5rLndyaXRlTWVtYmVyKTsKICAgIHNpbmsud3JpdGVMb2NhbHMoZnJlZVZhcmlhYmxlcyk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KfQoKY2xhc3MgSnNDYXB0dXJlZFNjb3BlIGV4dGVuZHMgSnNTY29wZUluZm8gaW1wbGVtZW50cyBDYXB0dXJlZFNjb3BlIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0pzQ2FwdHVyZWRTY29wZV0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdjYXB0dXJlZC1zY29wZSc7CgogIEBvdmVycmlkZQogIGZpbmFsIExvY2FsIGNvbnRleHQ7CgogIEpzQ2FwdHVyZWRTY29wZS5pbnRlcm5hbCgKICAgICAgSXRlcmFibGU8TG9jYWw+IGxvY2Fsc1VzZWRJblRyeU9yU3luYywKICAgICAgTG9jYWwgdGhpc0xvY2FsLAogICAgICBNYXA8TG9jYWwsIEpSZWNvcmRGaWVsZD4gYm94ZWRWYXJpYWJsZXMsCiAgICAgIFNldDxMb2NhbD4gZnJlZVZhcmlhYmxlcywKICAgICAgdGhpcy5jb250ZXh0KQogICAgICA6IHN1cGVyLmludGVybmFsKAogICAgICAgICAgICBsb2NhbHNVc2VkSW5UcnlPclN5bmMsIHRoaXNMb2NhbCwgYm94ZWRWYXJpYWJsZXMsIGZyZWVWYXJpYWJsZXMpOwoKICBKc0NhcHR1cmVkU2NvcGUuZnJvbSgKICAgICAgTWFwPExvY2FsLCBKUmVjb3JkRmllbGQ+IGJveGVkVmFyaWFibGVzLAogICAgICBLZXJuZWxDYXB0dXJlZFNjb3BlIGNhcHR1cmVkU2NvcGUsCiAgICAgIEtlcm5lbFRvTG9jYWxzTWFwIGxvY2Fsc01hcCwKICAgICAgSnNUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCkKICAgICAgOiB0aGlzLmNvbnRleHQgPQogICAgICAgICAgICBib3hlZFZhcmlhYmxlcy5pc05vdEVtcHR5ID8gYm94ZWRWYXJpYWJsZXMudmFsdWVzLmZpcnN0LmJveCA6IG51bGwsCiAgICAgICAgc3VwZXIuZnJvbShib3hlZFZhcmlhYmxlcywgY2FwdHVyZWRTY29wZSwgbG9jYWxzTWFwLCBlbGVtZW50TWFwKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgcmVxdWlyZXNDb250ZXh0Qm94ID0+IGJveGVkVmFyaWFibGVzLmlzTm90RW1wdHk7CgogIGZhY3RvcnkgSnNDYXB0dXJlZFNjb3BlLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBJdGVyYWJsZTxMb2NhbD4gbG9jYWxzVXNlZEluVHJ5T3JTeW5jID0gc291cmNlLnJlYWRMb2NhbHMoKTsKICAgIExvY2FsIHRoaXNMb2NhbCA9IHNvdXJjZS5yZWFkTG9jYWxPck51bGwoKTsKICAgIE1hcDxMb2NhbCwgSlJlY29yZEZpZWxkPiBib3hlZFZhcmlhYmxlcyA9CiAgICAgICAgc291cmNlLnJlYWRMb2NhbE1hcDxMb2NhbCwgSlJlY29yZEZpZWxkPigoKSA9PiBzb3VyY2UucmVhZE1lbWJlcigpKTsKICAgIFNldDxMb2NhbD4gZnJlZVZhcmlhYmxlcyA9IHNvdXJjZS5yZWFkTG9jYWxzKCkudG9TZXQoKTsKICAgIExvY2FsIGNvbnRleHQgPSBzb3VyY2UucmVhZExvY2FsT3JOdWxsKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEpzQ2FwdHVyZWRTY29wZS5pbnRlcm5hbChsb2NhbHNVc2VkSW5UcnlPclN5bmMsIHRoaXNMb2NhbCwKICAgICAgICBib3hlZFZhcmlhYmxlcywgZnJlZVZhcmlhYmxlcywgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShTY29wZUluZm9LaW5kLmNhcHR1cmVkU2NvcGUpOwogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUxvY2Fscyhsb2NhbHNVc2VkSW5UcnlPclN5bmMpOwogICAgc2luay53cml0ZUxvY2FsT3JOdWxsKHRoaXNMb2NhbCk7CiAgICBzaW5rLndyaXRlTG9jYWxNYXAoYm94ZWRWYXJpYWJsZXMsIHNpbmsud3JpdGVNZW1iZXIpOwogICAgc2luay53cml0ZUxvY2FscyhmcmVlVmFyaWFibGVzKTsKICAgIHNpbmsud3JpdGVMb2NhbE9yTnVsbChjb250ZXh0KTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQp9CgpjbGFzcyBKc0NhcHR1cmVkTG9vcFNjb3BlIGV4dGVuZHMgSnNDYXB0dXJlZFNjb3BlIGltcGxlbWVudHMgQ2FwdHVyZWRMb29wU2NvcGUgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbSnNDYXB0dXJlZExvb3BTY29wZV0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdjYXB0dXJlZC1sb29wLXNjb3BlJzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgTGlzdDxMb2NhbD4gYm94ZWRMb29wVmFyaWFibGVzOwoKICBKc0NhcHR1cmVkTG9vcFNjb3BlLmludGVybmFsKAogICAgICBJdGVyYWJsZTxMb2NhbD4gbG9jYWxzVXNlZEluVHJ5T3JTeW5jLAogICAgICBMb2NhbCB0aGlzTG9jYWwsCiAgICAgIE1hcDxMb2NhbCwgSlJlY29yZEZpZWxkPiBib3hlZFZhcmlhYmxlcywKICAgICAgU2V0PExvY2FsPiBmcmVlVmFyaWFibGVzLAogICAgICBMb2NhbCBjb250ZXh0LAogICAgICB0aGlzLmJveGVkTG9vcFZhcmlhYmxlcykKICAgICAgOiBzdXBlci5pbnRlcm5hbChsb2NhbHNVc2VkSW5UcnlPclN5bmMsIHRoaXNMb2NhbCwgYm94ZWRWYXJpYWJsZXMsCiAgICAgICAgICAgIGZyZWVWYXJpYWJsZXMsIGNvbnRleHQpOwoKICBKc0NhcHR1cmVkTG9vcFNjb3BlLmZyb20oCiAgICAgIE1hcDxMb2NhbCwgSlJlY29yZEZpZWxkPiBib3hlZFZhcmlhYmxlcywKICAgICAgS2VybmVsQ2FwdHVyZWRMb29wU2NvcGUgY2FwdHVyZWRTY29wZSwKICAgICAgS2VybmVsVG9Mb2NhbHNNYXAgbG9jYWxzTWFwLAogICAgICBKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwKQogICAgICA6IHRoaXMuYm94ZWRMb29wVmFyaWFibGVzID0gY2FwdHVyZWRTY29wZS5ib3hlZExvb3BWYXJpYWJsZXMKICAgICAgICAgICAgLm1hcChsb2NhbHNNYXAuZ2V0TG9jYWxWYXJpYWJsZSkKICAgICAgICAgICAgLnRvTGlzdCgpLAogICAgICAgIHN1cGVyLmZyb20oYm94ZWRWYXJpYWJsZXMsIGNhcHR1cmVkU2NvcGUsIGxvY2Fsc01hcCwgZWxlbWVudE1hcCk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGhhc0JveGVkTG9vcFZhcmlhYmxlcyA9PiBib3hlZExvb3BWYXJpYWJsZXMuaXNOb3RFbXB0eTsKCiAgZmFjdG9yeSBKc0NhcHR1cmVkTG9vcFNjb3BlLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBJdGVyYWJsZTxMb2NhbD4gbG9jYWxzVXNlZEluVHJ5T3JTeW5jID0gc291cmNlLnJlYWRMb2NhbHMoKTsKICAgIExvY2FsIHRoaXNMb2NhbCA9IHNvdXJjZS5yZWFkTG9jYWxPck51bGwoKTsKICAgIE1hcDxMb2NhbCwgSlJlY29yZEZpZWxkPiBib3hlZFZhcmlhYmxlcyA9CiAgICAgICAgc291cmNlLnJlYWRMb2NhbE1hcDxMb2NhbCwgSlJlY29yZEZpZWxkPigoKSA9PiBzb3VyY2UucmVhZE1lbWJlcigpKTsKICAgIFNldDxMb2NhbD4gZnJlZVZhcmlhYmxlcyA9IHNvdXJjZS5yZWFkTG9jYWxzKCkudG9TZXQoKTsKICAgIExvY2FsIGNvbnRleHQgPSBzb3VyY2UucmVhZExvY2FsT3JOdWxsKCk7CiAgICBMaXN0PExvY2FsPiBib3hlZExvb3BWYXJpYWJsZXMgPSBzb3VyY2UucmVhZExvY2FscygpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBKc0NhcHR1cmVkTG9vcFNjb3BlLmludGVybmFsKGxvY2Fsc1VzZWRJblRyeU9yU3luYywgdGhpc0xvY2FsLAogICAgICAgIGJveGVkVmFyaWFibGVzLCBmcmVlVmFyaWFibGVzLCBjb250ZXh0LCBib3hlZExvb3BWYXJpYWJsZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oU2NvcGVJbmZvS2luZC5jYXB0dXJlZExvb3BTY29wZSk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTG9jYWxzKGxvY2Fsc1VzZWRJblRyeU9yU3luYyk7CiAgICBzaW5rLndyaXRlTG9jYWxPck51bGwodGhpc0xvY2FsKTsKICAgIHNpbmsud3JpdGVMb2NhbE1hcChib3hlZFZhcmlhYmxlcywgc2luay53cml0ZU1lbWJlcik7CiAgICBzaW5rLndyaXRlTG9jYWxzKGZyZWVWYXJpYWJsZXMpOwogICAgc2luay53cml0ZUxvY2FsT3JOdWxsKGNvbnRleHQpOwogICAgc2luay53cml0ZUxvY2Fscyhib3hlZExvb3BWYXJpYWJsZXMpOwogICAgc2luay5lbmQodGFnKTsKICB9Cn0KCi8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbmFtZSB0aGlzIGNsYXNzLgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBZGQgdW5pdHRlc3QgZm9yIHRoZSBjb21wdXRlZCBbQ2xvc3VyZUNsYXNzXS4KY2xhc3MgS2VybmVsQ2xvc3VyZUNsYXNzSW5mbyBleHRlbmRzIEpzU2NvcGVJbmZvCiAgICBpbXBsZW1lbnRzIENsb3N1cmVSZXByZXNlbnRhdGlvbkluZm8gewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbS2VybmVsQ2xvc3VyZUNsYXNzSW5mb10gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdjbG9zdXJlLXJlcHJlc2VudGF0aW9uLWluZm8nOwoKICBAb3ZlcnJpZGUKICBKRnVuY3Rpb24gY2FsbE1ldGhvZDsKICBKU2lnbmF0dXJlTWV0aG9kIHNpZ25hdHVyZU1ldGhvZDsKICBAb3ZlcnJpZGUKICBmaW5hbCBMb2NhbCBjbG9zdXJlRW50aXR5OwogIEBvdmVycmlkZQogIGZpbmFsIExvY2FsIHRoaXNMb2NhbDsKICBAb3ZlcnJpZGUKICBmaW5hbCBKQ2xhc3MgY2xvc3VyZUNsYXNzRW50aXR5OwoKICBmaW5hbCBNYXA8TG9jYWwsIEpGaWVsZD4gbG9jYWxUb0ZpZWxkTWFwOwoKICBLZXJuZWxDbG9zdXJlQ2xhc3NJbmZvLmludGVybmFsKAogICAgICBJdGVyYWJsZTxMb2NhbD4gbG9jYWxzVXNlZEluVHJ5T3JTeW5jLAogICAgICB0aGlzLnRoaXNMb2NhbCwKICAgICAgTWFwPExvY2FsLCBKUmVjb3JkRmllbGQ+IGJveGVkVmFyaWFibGVzLAogICAgICBTZXQ8TG9jYWw+IGZyZWVWYXJpYWJsZXMsCiAgICAgIHRoaXMuY2FsbE1ldGhvZCwKICAgICAgdGhpcy5zaWduYXR1cmVNZXRob2QsCiAgICAgIHRoaXMuY2xvc3VyZUVudGl0eSwKICAgICAgdGhpcy5jbG9zdXJlQ2xhc3NFbnRpdHksCiAgICAgIHRoaXMubG9jYWxUb0ZpZWxkTWFwKQogICAgICA6IHN1cGVyLmludGVybmFsKAogICAgICAgICAgICBsb2NhbHNVc2VkSW5UcnlPclN5bmMsIHRoaXNMb2NhbCwgYm94ZWRWYXJpYWJsZXMsIGZyZWVWYXJpYWJsZXMpOwoKICBLZXJuZWxDbG9zdXJlQ2xhc3NJbmZvLmZyb21TY29wZUluZm8oCiAgICAgIHRoaXMuY2xvc3VyZUNsYXNzRW50aXR5LAogICAgICBpci5GdW5jdGlvbk5vZGUgY2xvc3VyZVNvdXJjZU5vZGUsCiAgICAgIE1hcDxMb2NhbCwgSlJlY29yZEZpZWxkPiBib3hlZFZhcmlhYmxlcywKICAgICAgS2VybmVsU2NvcGVJbmZvIGluZm8sCiAgICAgIEtlcm5lbFRvTG9jYWxzTWFwIGxvY2Fsc01hcCwKICAgICAgdGhpcy5jbG9zdXJlRW50aXR5LAogICAgICB0aGlzLnRoaXNMb2NhbCwKICAgICAgSnNUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCkKICAgICAgOiBsb2NhbFRvRmllbGRNYXAgPSBuZXcgTWFwPExvY2FsLCBKRmllbGQ+KCksCiAgICAgICAgc3VwZXIuZnJvbShib3hlZFZhcmlhYmxlcywgaW5mbywgbG9jYWxzTWFwLCBlbGVtZW50TWFwKTsKCiAgZmFjdG9yeSBLZXJuZWxDbG9zdXJlQ2xhc3NJbmZvLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBJdGVyYWJsZTxMb2NhbD4gbG9jYWxzVXNlZEluVHJ5T3JTeW5jID0gc291cmNlLnJlYWRMb2NhbHMoKTsKICAgIExvY2FsIHRoaXNMb2NhbCA9IHNvdXJjZS5yZWFkTG9jYWxPck51bGwoKTsKICAgIE1hcDxMb2NhbCwgSlJlY29yZEZpZWxkPiBib3hlZFZhcmlhYmxlcyA9CiAgICAgICAgc291cmNlLnJlYWRMb2NhbE1hcDxMb2NhbCwgSlJlY29yZEZpZWxkPigoKSA9PiBzb3VyY2UucmVhZE1lbWJlcigpKTsKICAgIFNldDxMb2NhbD4gZnJlZVZhcmlhYmxlcyA9IHNvdXJjZS5yZWFkTG9jYWxzKCkudG9TZXQoKTsKICAgIEpGdW5jdGlvbiBjYWxsTWV0aG9kID0gc291cmNlLnJlYWRNZW1iZXIoKTsKICAgIEpTaWduYXR1cmVNZXRob2Qgc2lnbmF0dXJlTWV0aG9kID0gc291cmNlLnJlYWRNZW1iZXJPck51bGwoKTsKICAgIExvY2FsIGNsb3N1cmVFbnRpdHkgPSBzb3VyY2UucmVhZExvY2FsT3JOdWxsKCk7CiAgICBKQ2xhc3MgY2xvc3VyZUNsYXNzRW50aXR5ID0gc291cmNlLnJlYWRDbGFzcygpOwogICAgTWFwPExvY2FsLCBKRmllbGQ+IGxvY2FsVG9GaWVsZE1hcCA9CiAgICAgICAgc291cmNlLnJlYWRMb2NhbE1hcCgoKSA9PiBzb3VyY2UucmVhZE1lbWJlcigpKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgS2VybmVsQ2xvc3VyZUNsYXNzSW5mby5pbnRlcm5hbCgKICAgICAgICBsb2NhbHNVc2VkSW5UcnlPclN5bmMsCiAgICAgICAgdGhpc0xvY2FsLAogICAgICAgIGJveGVkVmFyaWFibGVzLAogICAgICAgIGZyZWVWYXJpYWJsZXMsCiAgICAgICAgY2FsbE1ldGhvZCwKICAgICAgICBzaWduYXR1cmVNZXRob2QsCiAgICAgICAgY2xvc3VyZUVudGl0eSwKICAgICAgICBjbG9zdXJlQ2xhc3NFbnRpdHksCiAgICAgICAgbG9jYWxUb0ZpZWxkTWFwKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKFNjb3BlSW5mb0tpbmQuY2xvc3VyZVJlcHJlc2VudGF0aW9uSW5mbyk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTG9jYWxzKGxvY2Fsc1VzZWRJblRyeU9yU3luYyk7CiAgICBzaW5rLndyaXRlTG9jYWxPck51bGwodGhpc0xvY2FsKTsKICAgIHNpbmsud3JpdGVMb2NhbE1hcChib3hlZFZhcmlhYmxlcywgc2luay53cml0ZU1lbWJlcik7CiAgICBzaW5rLndyaXRlTG9jYWxzKGZyZWVWYXJpYWJsZXMpOwogICAgc2luay53cml0ZU1lbWJlcihjYWxsTWV0aG9kKTsKICAgIHNpbmsud3JpdGVNZW1iZXJPck51bGwoc2lnbmF0dXJlTWV0aG9kKTsKICAgIHNpbmsud3JpdGVMb2NhbE9yTnVsbChjbG9zdXJlRW50aXR5KTsKICAgIHNpbmsud3JpdGVDbGFzcyhjbG9zdXJlQ2xhc3NFbnRpdHkpOwogICAgc2luay53cml0ZUxvY2FsTWFwKGxvY2FsVG9GaWVsZE1hcCwgc2luay53cml0ZU1lbWJlcik7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxMb2NhbD4gZ2V0IGNyZWF0ZWRGaWVsZEVudGl0aWVzID0+IGxvY2FsVG9GaWVsZE1hcC5rZXlzLnRvTGlzdCgpOwoKICBAb3ZlcnJpZGUKICBMb2NhbCBnZXRMb2NhbEZvckZpZWxkKEZpZWxkRW50aXR5IGZpZWxkKSB7CiAgICBmb3IgKExvY2FsIGxvY2FsIGluIGxvY2FsVG9GaWVsZE1hcC5rZXlzKSB7CiAgICAgIGlmIChsb2NhbFRvRmllbGRNYXBbbG9jYWxdID09IGZpZWxkKSB7CiAgICAgICAgcmV0dXJuIGxvY2FsOwogICAgICB9CiAgICB9CiAgICBmYWlsZWRBdChmaWVsZCwgIk5vIGxvY2FsIGZvciAkZmllbGQuIE9wdGlvbnM6ICRsb2NhbFRvRmllbGRNYXAiKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgRmllbGRFbnRpdHkgZ2V0IHRoaXNGaWVsZEVudGl0eSA9PiBsb2NhbFRvRmllbGRNYXBbdGhpc0xvY2FsXTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoRnJlZVZhcmlhYmxlKGYoTG9jYWwgdmFyaWFibGUsIEpGaWVsZCBmaWVsZCkpIHsKICAgIGxvY2FsVG9GaWVsZE1hcC5mb3JFYWNoKGYpOwogICAgYm94ZWRWYXJpYWJsZXMuZm9yRWFjaChmKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQ2xvc3VyZSA9PiB0cnVlOwp9CgpjbGFzcyBKQ2xvc3VyZUNsYXNzIGV4dGVuZHMgSkNsYXNzIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0pDbG9zdXJlQ2xhc3NdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnY2xvc3VyZS1jbGFzcyc7CgogIEpDbG9zdXJlQ2xhc3MoSkxpYnJhcnkgbGlicmFyeSwgU3RyaW5nIG5hbWUpCiAgICAgIDogc3VwZXIobGlicmFyeSwgbmFtZSwgaXNBYnN0cmFjdDogZmFsc2UpOwoKICBmYWN0b3J5IEpDbG9zdXJlQ2xhc3MucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIEpMaWJyYXJ5IGxpYnJhcnkgPSBzb3VyY2UucmVhZExpYnJhcnkoKTsKICAgIFN0cmluZyBuYW1lID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgSkNsb3N1cmVDbGFzcyhsaWJyYXJ5LCBuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKEpDbGFzc0tpbmQuY2xvc3VyZSk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTGlicmFyeShsaWJyYXJ5KTsKICAgIHNpbmsud3JpdGVTdHJpbmcobmFtZSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNDbG9zdXJlID0+IHRydWU7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICcke2pzRWxlbWVudFByZWZpeH1jbG9zdXJlX2NsYXNzKCRuYW1lKSc7Cn0KCmNsYXNzIEFub255bW91c0Nsb3N1cmVMb2NhbCBpbXBsZW1lbnRzIExvY2FsIHsKICBmaW5hbCBKQ2xvc3VyZUNsYXNzIGNsb3N1cmVDbGFzczsKCiAgQW5vbnltb3VzQ2xvc3VyZUxvY2FsKHRoaXMuY2xvc3VyZUNsYXNzKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+ICcnOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IGNsb3N1cmVDbGFzcy5oYXNoQ29kZSAqIDEzOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIEFub255bW91c0Nsb3N1cmVMb2NhbCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIGNsb3N1cmVDbGFzcyA9PSBvdGhlci5jbG9zdXJlQ2xhc3M7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PgogICAgICAnJHtqc0VsZW1lbnRQcmVmaXh9YW5vbnltb3VzX2Nsb3N1cmVfbG9jYWwoJHtjbG9zdXJlQ2xhc3MubmFtZX0pJzsKfQoKY2xhc3MgSkNsb3N1cmVGaWVsZCBleHRlbmRzIEpGaWVsZCBpbXBsZW1lbnRzIFByaXZhdGVseU5hbWVkSlNFbnRpdHkgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbSkNsb3N1cmVDbGFzc10gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdjbG9zdXJlLWZpZWxkJzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIGRlY2xhcmVkTmFtZTsKCiAgSkNsb3N1cmVGaWVsZCgKICAgICAgU3RyaW5nIG5hbWUsIEtlcm5lbENsb3N1cmVDbGFzc0luZm8gY29udGFpbmluZ0NsYXNzLCBTdHJpbmcgZGVjbGFyZWROYW1lLAogICAgICB7Ym9vbCBpc0NvbnN0LCBib29sIGlzQXNzaWduYWJsZX0pCiAgICAgIDogdGhpcy5pbnRlcm5hbCgKICAgICAgICAgICAgY29udGFpbmluZ0NsYXNzLmNsb3N1cmVDbGFzc0VudGl0eS5saWJyYXJ5LAogICAgICAgICAgICBjb250YWluaW5nQ2xhc3MuY2xvc3VyZUNsYXNzRW50aXR5LAogICAgICAgICAgICBuZXcgTmFtZShuYW1lLCBjb250YWluaW5nQ2xhc3MuY2xvc3VyZUNsYXNzRW50aXR5LmxpYnJhcnkpLAogICAgICAgICAgICBkZWNsYXJlZE5hbWUsCiAgICAgICAgICAgIGlzQXNzaWduYWJsZTogaXNBc3NpZ25hYmxlLAogICAgICAgICAgICBpc0NvbnN0OiBpc0NvbnN0KTsKCiAgSkNsb3N1cmVGaWVsZC5pbnRlcm5hbChKTGlicmFyeSBsaWJyYXJ5LCBKQ2xvc3VyZUNsYXNzIGVuY2xvc2luZ0NsYXNzLAogICAgICBOYW1lIG1lbWJlck5hbWUsIHRoaXMuZGVjbGFyZWROYW1lLCB7Ym9vbCBpc0NvbnN0LCBib29sIGlzQXNzaWduYWJsZX0pCiAgICAgIDogc3VwZXIobGlicmFyeSwgZW5jbG9zaW5nQ2xhc3MsIG1lbWJlck5hbWUsCiAgICAgICAgICAgIGlzQXNzaWduYWJsZTogaXNBc3NpZ25hYmxlLCBpc0NvbnN0OiBpc0NvbnN0LCBpc1N0YXRpYzogZmFsc2UpOwoKICBmYWN0b3J5IEpDbG9zdXJlRmllbGQucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIEpDbGFzcyBjbHMgPSBzb3VyY2UucmVhZENsYXNzKCk7CiAgICBTdHJpbmcgbmFtZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICBTdHJpbmcgZGVjbGFyZWROYW1lID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgIGJvb2wgaXNDb25zdCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgYm9vbCBpc0Fzc2lnbmFibGUgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgSkNsb3N1cmVGaWVsZC5pbnRlcm5hbCgKICAgICAgICBjbHMubGlicmFyeSwgY2xzLCBuZXcgTmFtZShuYW1lLCBjbHMubGlicmFyeSksIGRlY2xhcmVkTmFtZSwKICAgICAgICBpc0Fzc2lnbmFibGU6IGlzQXNzaWduYWJsZSwgaXNDb25zdDogaXNDb25zdCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShKTWVtYmVyS2luZC5jbG9zdXJlRmllbGQpOwogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUNsYXNzKGVuY2xvc2luZ0NsYXNzKTsKICAgIHNpbmsud3JpdGVTdHJpbmcobmFtZSk7CiAgICBzaW5rLndyaXRlU3RyaW5nKGRlY2xhcmVkTmFtZSk7CiAgICBzaW5rLndyaXRlQm9vbChpc0NvbnN0KTsKICAgIHNpbmsud3JpdGVCb29sKGlzQXNzaWduYWJsZSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgRW50aXR5IGdldCByb290T2ZTY29wZSA9PiBlbmNsb3NpbmdDbGFzczsKfQoKY2xhc3MgUmVjb3JkQ2xhc3NEYXRhIGltcGxlbWVudHMgSkNsYXNzRGF0YSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtSZWNvcmRDbGFzc0RhdGFdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAncmVjb3JkLWNsYXNzLWRhdGEnOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBDbGFzc0RlZmluaXRpb24gZGVmaW5pdGlvbjsKCiAgQG92ZXJyaWRlCiAgZmluYWwgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgT3JkZXJlZFR5cGVTZXQgb3JkZXJlZFR5cGVTZXQ7CgogIEBvdmVycmlkZQogIGZpbmFsIEludGVyZmFjZVR5cGUgc3VwZXJ0eXBlOwoKICBSZWNvcmRDbGFzc0RhdGEoCiAgICAgIHRoaXMuZGVmaW5pdGlvbiwgdGhpcy50aGlzVHlwZSwgdGhpcy5zdXBlcnR5cGUsIHRoaXMub3JkZXJlZFR5cGVTZXQpOwoKICBmYWN0b3J5IFJlY29yZENsYXNzRGF0YS5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgQ2xhc3NEZWZpbml0aW9uIGRlZmluaXRpb24gPSBuZXcgQ2xhc3NEZWZpbml0aW9uLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZSA9IHNvdXJjZS5yZWFkRGFydFR5cGUoKTsKICAgIEludGVyZmFjZVR5cGUgc3VwZXJ0eXBlID0gc291cmNlLnJlYWREYXJ0VHlwZSgpOwogICAgT3JkZXJlZFR5cGVTZXQgb3JkZXJlZFR5cGVTZXQgPQogICAgICAgIG5ldyBPcmRlcmVkVHlwZVNldC5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgUmVjb3JkQ2xhc3NEYXRhKGRlZmluaXRpb24sIHRoaXNUeXBlLCBzdXBlcnR5cGUsIG9yZGVyZWRUeXBlU2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKEpDbGFzc0RhdGFLaW5kLnJlY29yZCk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBkZWZpbml0aW9uLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIHNpbmsud3JpdGVEYXJ0VHlwZSh0aGlzVHlwZSk7CiAgICBzaW5rLndyaXRlRGFydFR5cGUoc3VwZXJ0eXBlKTsKICAgIG9yZGVyZWRUeXBlU2V0LndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc01peGluQXBwbGljYXRpb24gPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRW51bUNsYXNzID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXQgY2FsbFR5cGUgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgTGlzdDxJbnRlcmZhY2VUeXBlPiBnZXQgaW50ZXJmYWNlcyA9PiBjb25zdCA8SW50ZXJmYWNlVHlwZT5bXTsKCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXQgbWl4ZWRJblR5cGUgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXQgcmF3VHlwZSA9PiB0aGlzVHlwZTsKfQoKLy8vIEEgY29udGFpbmVyIGZvciB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gYSBwYXJ0aWN1bGFyIHNjb3BlIHRoYXQgYXJlIGFjY2Vzc2VkCi8vLyBlbHNld2hlcmUuCi8vIFRPRE8oam9obm5pd2ludGhlcik6IERvbid0IGltcGxlbWVudCBKQ2xhc3MuIFRoaXMgaXNuJ3QgYWN0dWFsbHkgYQovLyBjbGFzcy4KY2xhc3MgSlJlY29yZCBleHRlbmRzIEpDbGFzcyB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtKUmVjb3JkXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ3JlY29yZCc7CgogIEpSZWNvcmQoTGlicmFyeUVudGl0eSBsaWJyYXJ5LCBTdHJpbmcgbmFtZSkKICAgICAgOiBzdXBlcihsaWJyYXJ5LCBuYW1lLCBpc0Fic3RyYWN0OiBmYWxzZSk7CgogIGZhY3RvcnkgSlJlY29yZC5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgSkxpYnJhcnkgbGlicmFyeSA9IHNvdXJjZS5yZWFkTGlicmFyeSgpOwogICAgU3RyaW5nIG5hbWUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBKUmVjb3JkKGxpYnJhcnksIG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oSkNsYXNzS2luZC5yZWNvcmQpOwogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUxpYnJhcnkobGlicmFyeSk7CiAgICBzaW5rLndyaXRlU3RyaW5nKG5hbWUpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQ2xvc3VyZSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyR7anNFbGVtZW50UHJlZml4fXJlY29yZF9jb250YWluZXIoJG5hbWUpJzsKfQoKLy8vIEEgdmFyaWFibGUgdGhhdCBoYXMgYmVlbiAiYm94ZWQiIHRvIHByZXZlbnQgbmFtZSBzaGFkb3dpbmcgd2l0aCB0aGUKLy8vIG9yaWdpbmFsIHZhcmlhYmxlIGFuZCBlbnN1cmUgdGhhdCB0aGlzIHZhcmlhYmxlIGlzIHVwZGF0ZWQvcmVhZCB3aXRoIHRoZQovLy8gbW9zdCByZWNlbnQgdmFsdWUuCi8vLyBUaGlzIGNvcnJlc3BvbmRzIHRvIEJveEZpZWxkRWxlbWVudDsgd2UgcmV1c2UgQm94TG9jYWwgZnJvbSB0aGUgb3JpZ2luYWwKLy8vIGFsZ29yaXRobSB0byBjb3JyZXNwb25kIHRvIHRoZSBhY3R1YWwgbmFtZSBvZiB0aGUgdmFyaWFibGUuCmNsYXNzIEpSZWNvcmRGaWVsZCBleHRlbmRzIEpGaWVsZCB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtKUmVjb3JkRmllbGRdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAncmVjb3JkLWZpZWxkJzsKCiAgZmluYWwgQm94TG9jYWwgYm94OwoKICBKUmVjb3JkRmllbGQoU3RyaW5nIG5hbWUsIHRoaXMuYm94LCB7Ym9vbCBpc0NvbnN0fSkKICAgICAgOiBzdXBlcihib3guY29udGFpbmVyLmxpYnJhcnksIGJveC5jb250YWluZXIsCiAgICAgICAgICAgIG5ldyBOYW1lKG5hbWUsIGJveC5jb250YWluZXIubGlicmFyeSksCiAgICAgICAgICAgIGlzU3RhdGljOiBmYWxzZSwgaXNBc3NpZ25hYmxlOiB0cnVlLCBpc0NvbnN0OiBpc0NvbnN0KTsKCiAgZmFjdG9yeSBKUmVjb3JkRmllbGQucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIFN0cmluZyBuYW1lID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgIEpDbGFzcyBlbmNsb3NpbmdDbGFzcyA9IHNvdXJjZS5yZWFkQ2xhc3MoKTsKICAgIGJvb2wgaXNDb25zdCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBKUmVjb3JkRmllbGQobmFtZSwgbmV3IEJveExvY2FsKGVuY2xvc2luZ0NsYXNzKSwKICAgICAgICBpc0NvbnN0OiBpc0NvbnN0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKEpNZW1iZXJLaW5kLnJlY29yZEZpZWxkKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVTdHJpbmcobmFtZSk7CiAgICBzaW5rLndyaXRlQ2xhc3MoZW5jbG9zaW5nQ2xhc3MpOwogICAgc2luay53cml0ZUJvb2woaXNDb25zdCk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNJbnN0YW5jZU1lbWJlciA9PiBmYWxzZTsKfQoKY2xhc3MgQ2xvc3VyZUNsYXNzRGF0YSBleHRlbmRzIFJlY29yZENsYXNzRGF0YSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtDbG9zdXJlQ2xhc3NEYXRhXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2Nsb3N1cmUtY2xhc3MtZGF0YSc7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uVHlwZSBjYWxsVHlwZTsKCiAgQ2xvc3VyZUNsYXNzRGF0YShDbGFzc0RlZmluaXRpb24gZGVmaW5pdGlvbiwgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZSwKICAgICAgSW50ZXJmYWNlVHlwZSBzdXBlcnR5cGUsIE9yZGVyZWRUeXBlU2V0IG9yZGVyZWRUeXBlU2V0KQogICAgICA6IHN1cGVyKGRlZmluaXRpb24sIHRoaXNUeXBlLCBzdXBlcnR5cGUsIG9yZGVyZWRUeXBlU2V0KTsKCiAgZmFjdG9yeSBDbG9zdXJlQ2xhc3NEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBDbGFzc0RlZmluaXRpb24gZGVmaW5pdGlvbiA9IG5ldyBDbGFzc0RlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlID0gc291cmNlLnJlYWREYXJ0VHlwZSgpOwogICAgSW50ZXJmYWNlVHlwZSBzdXBlcnR5cGUgPSBzb3VyY2UucmVhZERhcnRUeXBlKCk7CiAgICBPcmRlcmVkVHlwZVNldCBvcmRlcmVkVHlwZVNldCA9CiAgICAgICAgbmV3IE9yZGVyZWRUeXBlU2V0LnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgRnVuY3Rpb25UeXBlIGNhbGxUeXBlID0gc291cmNlLnJlYWREYXJ0VHlwZSgpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBDbG9zdXJlQ2xhc3NEYXRhKGRlZmluaXRpb24sIHRoaXNUeXBlLCBzdXBlcnR5cGUsIG9yZGVyZWRUeXBlU2V0KQogICAgICAuLmNhbGxUeXBlID0gY2FsbFR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShKQ2xhc3NEYXRhS2luZC5jbG9zdXJlKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIGRlZmluaXRpb24ud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay53cml0ZURhcnRUeXBlKHRoaXNUeXBlKTsKICAgIHNpbmsud3JpdGVEYXJ0VHlwZShzdXBlcnR5cGUpOwogICAgb3JkZXJlZFR5cGVTZXQud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay53cml0ZURhcnRUeXBlKGNhbGxUeXBlKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQp9CgpjbGFzcyBDbG9zdXJlQ2xhc3NEZWZpbml0aW9uIGltcGxlbWVudHMgQ2xhc3NEZWZpbml0aW9uIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0Nsb3N1cmVDbGFzc0RlZmluaXRpb25dIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnY2xvc3VyZS1jbGFzcy1kZWZpbml0aW9uJzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgU291cmNlU3BhbiBsb2NhdGlvbjsKCiAgQ2xvc3VyZUNsYXNzRGVmaW5pdGlvbih0aGlzLmxvY2F0aW9uKTsKCiAgZmFjdG9yeSBDbG9zdXJlQ2xhc3NEZWZpbml0aW9uLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBTb3VyY2VTcGFuIGxvY2F0aW9uID0gc291cmNlLnJlYWRTb3VyY2VTcGFuKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IENsb3N1cmVDbGFzc0RlZmluaXRpb24obG9jYXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oQ2xhc3NLaW5kLmNsb3N1cmUpOwogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZVNvdXJjZVNwYW4obG9jYXRpb24pOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIENsYXNzS2luZCBnZXQga2luZCA9PiBDbGFzc0tpbmQuY2xvc3VyZTsKCiAgQG92ZXJyaWRlCiAgaXIuTm9kZSBnZXQgbm9kZSA9PgogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignQ2xvc3VyZUNsYXNzRGVmaW5pdGlvbi5ub2RlIGZvciAkbG9jYXRpb24nKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0Nsb3N1cmVDbGFzc0RlZmluaXRpb24oa2luZDoka2luZCxsb2NhdGlvbjokbG9jYXRpb24pJzsKfQoKYWJzdHJhY3QgY2xhc3MgQ2xvc3VyZU1lbWJlckRhdGEgaW1wbGVtZW50cyBKTWVtYmVyRGF0YSB7CiAgQG92ZXJyaWRlCiAgZmluYWwgTWVtYmVyRGVmaW5pdGlvbiBkZWZpbml0aW9uOwogIGZpbmFsIEludGVyZmFjZVR5cGUgbWVtYmVyVGhpc1R5cGU7CgogIENsb3N1cmVNZW1iZXJEYXRhKHRoaXMuZGVmaW5pdGlvbiwgdGhpcy5tZW1iZXJUaGlzVHlwZSk7CgogIEBvdmVycmlkZQogIE1hcDxpci5FeHByZXNzaW9uLCBpci5EYXJ0VHlwZT4gZ2V0IHN0YXRpY1R5cGVzIHsKICAgIC8vIFRoZSBjYWNoZWQgdHlwZXMgYXJlIHN0b3JlZCBpbiB0aGUgZGF0YSBmb3IgZW5jbG9zaW5nIG1lbWJlci4KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDbG9zdXJlTWVtYmVyRGF0YS5zdGF0aWNUeXBlcyIpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXRNZW1iZXJUaGlzVHlwZShKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwKSB7CiAgICByZXR1cm4gbWVtYmVyVGhpc1R5cGU7CiAgfQp9CgpjbGFzcyBDbG9zdXJlRnVuY3Rpb25EYXRhIGV4dGVuZHMgQ2xvc3VyZU1lbWJlckRhdGEKICAgIHdpdGggRnVuY3Rpb25EYXRhVHlwZVZhcmlhYmxlc01peGluLCBGdW5jdGlvbkRhdGFGb3JFYWNoUGFyYW1ldGVyTWl4aW4KICAgIGltcGxlbWVudHMgRnVuY3Rpb25EYXRhIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0Nsb3N1cmVGdW5jdGlvbkRhdGFdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnY2xvc3VyZS1mdW5jdGlvbi1kYXRhJzsKCiAgZmluYWwgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZTsKICBAb3ZlcnJpZGUKICBmaW5hbCBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb25Ob2RlOwogIEBvdmVycmlkZQogIGZpbmFsIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzIGNsYXNzVHlwZVZhcmlhYmxlQWNjZXNzOwoKICBDbG9zdXJlRnVuY3Rpb25EYXRhKAogICAgICBDbG9zdXJlTWVtYmVyRGVmaW5pdGlvbiBkZWZpbml0aW9uLAogICAgICBJbnRlcmZhY2VUeXBlIG1lbWJlclRoaXNUeXBlLAogICAgICB0aGlzLmZ1bmN0aW9uVHlwZSwKICAgICAgdGhpcy5mdW5jdGlvbk5vZGUsCiAgICAgIHRoaXMuY2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MpCiAgICAgIDogc3VwZXIoZGVmaW5pdGlvbiwgbWVtYmVyVGhpc1R5cGUpOwoKICBmYWN0b3J5IENsb3N1cmVGdW5jdGlvbkRhdGEucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIENsb3N1cmVNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24gPQogICAgICAgIG5ldyBNZW1iZXJEZWZpbml0aW9uLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgSW50ZXJmYWNlVHlwZSBtZW1iZXJUaGlzVHlwZSA9IHNvdXJjZS5yZWFkRGFydFR5cGUoYWxsb3dOdWxsOiB0cnVlKTsKICAgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUgPSBzb3VyY2UucmVhZERhcnRUeXBlKCk7CiAgICBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb25Ob2RlID0gc291cmNlLnJlYWRUcmVlTm9kZSgpOwogICAgQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgY2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgPQogICAgICAgIHNvdXJjZS5yZWFkRW51bShDbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcy52YWx1ZXMpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBDbG9zdXJlRnVuY3Rpb25EYXRhKGRlZmluaXRpb24sIG1lbWJlclRoaXNUeXBlLCBmdW5jdGlvblR5cGUsCiAgICAgICAgZnVuY3Rpb25Ob2RlLCBjbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShKTWVtYmVyRGF0YUtpbmQuY2xvc3VyZUZ1bmN0aW9uKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIGRlZmluaXRpb24ud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay53cml0ZURhcnRUeXBlKG1lbWJlclRoaXNUeXBlLCBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZURhcnRUeXBlKGZ1bmN0aW9uVHlwZSk7CiAgICBzaW5rLndyaXRlVHJlZU5vZGUoZnVuY3Rpb25Ob2RlKTsKICAgIHNpbmsud3JpdGVFbnVtKGNsYXNzVHlwZVZhcmlhYmxlQWNjZXNzKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBGdW5jdGlvblR5cGUgZ2V0RnVuY3Rpb25UeXBlKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApIHsKICAgIHJldHVybiBmdW5jdGlvblR5cGU7CiAgfQp9CgpjbGFzcyBDbG9zdXJlRmllbGREYXRhIGV4dGVuZHMgQ2xvc3VyZU1lbWJlckRhdGEgaW1wbGVtZW50cyBKRmllbGREYXRhIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0Nsb3N1cmVGaWVsZERhdGFdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnY2xvc3VyZS1maWVsZC1kYXRhJzsKCiAgRGFydFR5cGUgX3R5cGU7CgogIENsb3N1cmVGaWVsZERhdGEoTWVtYmVyRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBJbnRlcmZhY2VUeXBlIG1lbWJlclRoaXNUeXBlKQogICAgICA6IHN1cGVyKGRlZmluaXRpb24sIG1lbWJlclRoaXNUeXBlKTsKCiAgZmFjdG9yeSBDbG9zdXJlRmllbGREYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24gPQogICAgICAgIG5ldyBNZW1iZXJEZWZpbml0aW9uLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgSW50ZXJmYWNlVHlwZSBtZW1iZXJUaGlzVHlwZSA9IHNvdXJjZS5yZWFkRGFydFR5cGUoYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgQ2xvc3VyZUZpZWxkRGF0YShkZWZpbml0aW9uLCBtZW1iZXJUaGlzVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShKTWVtYmVyRGF0YUtpbmQuY2xvc3VyZUZpZWxkKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIGRlZmluaXRpb24ud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay53cml0ZURhcnRUeXBlKG1lbWJlclRoaXNUeXBlLCBhbGxvd051bGw6IHRydWUpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldEZpZWxkVHlwZShJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwKSB7CiAgICBpZiAoX3R5cGUgIT0gbnVsbCkgcmV0dXJuIF90eXBlOwogICAgaXIuVHJlZU5vZGUgc291cmNlTm9kZSA9IGRlZmluaXRpb24ubm9kZTsKICAgIGlyLkRhcnRUeXBlIHR5cGU7CiAgICBpZiAoc291cmNlTm9kZSBpcyBpci5DbGFzcykgewogICAgICB0eXBlID0gc291cmNlTm9kZS50aGlzVHlwZTsKICAgIH0gZWxzZSBpZiAoc291cmNlTm9kZSBpcyBpci5WYXJpYWJsZURlY2xhcmF0aW9uKSB7CiAgICAgIHR5cGUgPSBzb3VyY2VOb2RlLnR5cGU7CiAgICB9IGVsc2UgaWYgKHNvdXJjZU5vZGUgaXMgaXIuRmllbGQpIHsKICAgICAgdHlwZSA9IHNvdXJjZU5vZGUudHlwZTsKICAgIH0gZWxzZSBpZiAoc291cmNlTm9kZSBpcyBpci5UeXBlTGl0ZXJhbCkgewogICAgICB0eXBlID0gc291cmNlTm9kZS50eXBlOwogICAgfSBlbHNlIGlmIChzb3VyY2VOb2RlIGlzIGlyLlR5cGVkZWYpIHsKICAgICAgdHlwZSA9IHNvdXJjZU5vZGUudHlwZTsKICAgIH0gZWxzZSBpZiAoc291cmNlTm9kZSBpcyBpci5UeXBlUGFyYW1ldGVyKSB7CiAgICAgIHR5cGUgPSBzb3VyY2VOb2RlLmJvdW5kOwogICAgfSBlbHNlIHsKICAgICAgZmFpbGVkQXQoCiAgICAgICAgICBkZWZpbml0aW9uLmxvY2F0aW9uLAogICAgICAgICAgJ1VuZXhwZWN0ZWQgbm9kZSB0eXBlICR7c291cmNlTm9kZX0gaW4gJwogICAgICAgICAgJ0Nsb3N1cmVGaWVsZERhdGEuZ2V0RmllbGRUeXBlJyk7CiAgICB9CiAgICByZXR1cm4gX3R5cGUgPSBlbGVtZW50TWFwLmdldERhcnRUeXBlKHR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIGdldEZpZWxkQ29uc3RhbnRFeHByZXNzaW9uKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApIHsKICAgIGZhaWxlZEF0KAogICAgICAgIGRlZmluaXRpb24ubG9jYXRpb24sCiAgICAgICAgIlVuZXhwZWN0ZWQgZmllbGQgJHtkZWZpbml0aW9ufSBpbiAiCiAgICAgICAgIkNsb3N1cmVGaWVsZERhdGEuZ2V0RmllbGRDb25zdGFudEV4cHJlc3Npb24iKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgZ2V0IGNsYXNzVHlwZVZhcmlhYmxlQWNjZXNzID0+CiAgICAgIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzLm5vbmU7Cn0KCmNsYXNzIENsb3N1cmVNZW1iZXJEZWZpbml0aW9uIGltcGxlbWVudHMgTWVtYmVyRGVmaW5pdGlvbiB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtDbG9zdXJlTWVtYmVyRGVmaW5pdGlvbl0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdjbG9zdXJlLW1lbWJlci1kZWZpbml0aW9uJzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgU291cmNlU3BhbiBsb2NhdGlvbjsKICBAb3ZlcnJpZGUKICBmaW5hbCBNZW1iZXJLaW5kIGtpbmQ7CiAgQG92ZXJyaWRlCiAgZmluYWwgaXIuVHJlZU5vZGUgbm9kZTsKCiAgQ2xvc3VyZU1lbWJlckRlZmluaXRpb24odGhpcy5sb2NhdGlvbiwgdGhpcy5raW5kLCB0aGlzLm5vZGUpCiAgICAgIDogYXNzZXJ0KAogICAgICAgICAgICBraW5kID09IE1lbWJlcktpbmQuY2xvc3VyZUNhbGwgfHwga2luZCA9PSBNZW1iZXJLaW5kLmNsb3N1cmVGaWVsZCk7CgogIGZhY3RvcnkgQ2xvc3VyZU1lbWJlckRlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwgTWVtYmVyS2luZCBraW5kKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIFNvdXJjZVNwYW4gbG9jYXRpb24gPSBzb3VyY2UucmVhZFNvdXJjZVNwYW4oKTsKICAgIGlyLlRyZWVOb2RlIG5vZGUgPSBzb3VyY2UucmVhZFRyZWVOb2RlKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IENsb3N1cmVNZW1iZXJEZWZpbml0aW9uKGxvY2F0aW9uLCBraW5kLCBub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKGtpbmQpOwogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZVNvdXJjZVNwYW4obG9jYXRpb24pOwogICAgc2luay53cml0ZVRyZWVOb2RlKG5vZGUpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdDbG9zdXJlTWVtYmVyRGVmaW5pdGlvbihraW5kOiRraW5kLGxvY2F0aW9uOiRsb2NhdGlvbiknOwp9CgpjbGFzcyBSZWNvcmRDb250YWluZXJEZWZpbml0aW9uIGltcGxlbWVudHMgQ2xhc3NEZWZpbml0aW9uIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW1JlY29yZENvbnRhaW5lckRlZmluaXRpb25dIG9iamVjdHMgaW4KICAvLy8gYSBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAncmVjb3JkLWRlZmluaXRpb24nOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTb3VyY2VTcGFuIGxvY2F0aW9uOwoKICBSZWNvcmRDb250YWluZXJEZWZpbml0aW9uKHRoaXMubG9jYXRpb24pOwoKICBmYWN0b3J5IFJlY29yZENvbnRhaW5lckRlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIFNvdXJjZVNwYW4gbG9jYXRpb24gPSBzb3VyY2UucmVhZFNvdXJjZVNwYW4oKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgUmVjb3JkQ29udGFpbmVyRGVmaW5pdGlvbihsb2NhdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShDbGFzc0tpbmQucmVjb3JkKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVTb3VyY2VTcGFuKGxvY2F0aW9uKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc0tpbmQgZ2V0IGtpbmQgPT4gQ2xhc3NLaW5kLnJlY29yZDsKCiAgQG92ZXJyaWRlCiAgaXIuTm9kZSBnZXQgbm9kZSA9PiB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgJ1JlY29yZENvbnRhaW5lckRlZmluaXRpb24ubm9kZSBmb3IgJGxvY2F0aW9uJyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+CiAgICAgICdSZWNvcmRDb250YWluZXJEZWZpbml0aW9uKGtpbmQ6JGtpbmQsbG9jYXRpb246JGxvY2F0aW9uKSc7Cn0KCmFic3RyYWN0IGNsYXNzIENsb3N1cmVSdGlOZWVkIHsKICBib29sIGNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKENsYXNzRW50aXR5IGNscyk7Cgog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c2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5qc19tb2RlbC5lbnY7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy9jb25zdHJ1Y3RvcnMuZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL2V4cHJlc3Npb25zLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvaW5kZXhlZC5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pci9lbGVtZW50X21hcC5kYXJ0JzsKaW1wb3J0ICcuLi9pci92aXNpdG9ycy5kYXJ0JzsKaW1wb3J0ICcuLi9qc19tb2RlbC9lbGVtZW50X21hcC5kYXJ0JzsKaW1wb3J0ICcuLi9vcmRlcmVkX3R5cGVzZXQuZGFydCc7CmltcG9ydCAnLi4vc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL3NzYS90eXBlX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnY2xvc3VyZS5kYXJ0JzsKaW1wb3J0ICdlbGVtZW50X21hcC5kYXJ0JzsKaW1wb3J0ICdlbGVtZW50X21hcF9pbXBsLmRhcnQnOwppbXBvcnQgJ2VsZW1lbnRzLmRhcnQnOwoKLy8vIEVudmlyb25tZW50IGZvciBmYXN0IGxvb2t1cCBvZiBjb21wb25lbnQgbGlicmFyaWVzLgpjbGFzcyBKUHJvZ3JhbUVudiB7CiAgZmluYWwgSXRlcmFibGU8aXIuQ29tcG9uZW50PiBfY29tcG9uZW50czsKICBmaW5hbCBNYXA8VXJpLCBKTGlicmFyeUVudj4gX2xpYnJhcnlNYXAgPSB7fTsKCiAgSlByb2dyYW1FbnYodGhpcy5fY29tcG9uZW50cyk7CgogIC8vLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBIYW5kbGUgYXJiaXRyYXJ5IGxvYWQgb3JkZXIgaWYgbmVlZGVkLgogIGlyLk1lbWJlciBnZXQgbWFpbk1ldGhvZCA9PiBfY29tcG9uZW50cy5maXJzdD8ubWFpbk1ldGhvZDsKCiAgaXIuQ29tcG9uZW50IGdldCBtYWluQ29tcG9uZW50ID0+IF9jb21wb25lbnRzLmZpcnN0OwoKICB2b2lkIHJlZ2lzdGVyTGlicmFyeShKTGlicmFyeUVudiBlbnYpIHsKICAgIF9saWJyYXJ5TWFwW2Vudi5saWJyYXJ5LmltcG9ydFVyaV0gPSBlbnY7CiAgfQoKICAvLy8gUmV0dXJuIHRoZSBbSkxpYnJhcnlFbnZdIGZvciB0aGUgbGlicmFyeSB3aXRoIHRoZSBjYW5vbmljYWwgW3VyaV0uCiAgSkxpYnJhcnlFbnYgbG9va3VwTGlicmFyeShVcmkgdXJpKSB7CiAgICByZXR1cm4gX2xpYnJhcnlNYXBbdXJpXTsKICB9CgogIC8vLyBDYWxscyBbZl0gZm9yIGVhY2ggbGlicmFyeSBpbiB0aGlzIGVudmlyb25tZW50LgogIHZvaWQgZm9yRWFjaExpYnJhcnkodm9pZCBmKEpMaWJyYXJ5RW52IGxpYnJhcnkpKSB7CiAgICBfbGlicmFyeU1hcC52YWx1ZXMuZm9yRWFjaChmKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbGlicmFyaWVzIGluIHRoaXMgZW52aXJvbm1lbnQuCiAgaW50IGdldCBsZW5ndGggewogICAgcmV0dXJuIF9saWJyYXJ5TWFwLmxlbmd0aDsKICB9Cn0KCi8vLyBFbnZpcm9ubWVudCBmb3IgZmFzdCBsb29rdXAgb2YgbGlicmFyeSBjbGFzc2VzIGFuZCBtZW1iZXJzLgpjbGFzcyBKTGlicmFyeUVudiB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtKTGlicmFyeUVudl0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdsaWJyYXJ5LWVudic7CgogIGZpbmFsIGlyLkxpYnJhcnkgbGlicmFyeTsKICBmaW5hbCBNYXA8U3RyaW5nLCBKQ2xhc3NFbnY+IF9jbGFzc01hcCA9IHt9OwogIGZpbmFsIE1hcDxTdHJpbmcsIGlyLk1lbWJlcj4gX21lbWJlck1hcDsKICBmaW5hbCBNYXA8U3RyaW5nLCBpci5NZW1iZXI+IF9zZXR0ZXJNYXA7CgogIEpMaWJyYXJ5RW52KHRoaXMubGlicmFyeSwgdGhpcy5fbWVtYmVyTWFwLCB0aGlzLl9zZXR0ZXJNYXApOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW0pMaWJyYXJ5RW52XSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IEpMaWJyYXJ5RW52LnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5MaWJyYXJ5IGxpYnJhcnkgPSBzb3VyY2UucmVhZExpYnJhcnlOb2RlKCk7CiAgICBNYXA8U3RyaW5nLCBpci5NZW1iZXI+IG1lbWJlck1hcCA9CiAgICAgICAgc291cmNlLnJlYWRTdHJpbmdNYXAoc291cmNlLnJlYWRNZW1iZXJOb2RlKTsKICAgIE1hcDxTdHJpbmcsIGlyLk1lbWJlcj4gc2V0dGVyTWFwID0KICAgICAgICBzb3VyY2UucmVhZFN0cmluZ01hcChzb3VyY2UucmVhZE1lbWJlck5vZGUpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBKTGlicmFyeUVudihsaWJyYXJ5LCBtZW1iZXJNYXAsIHNldHRlck1hcCk7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtKTGlicmFyeUVudl0gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVMaWJyYXJ5Tm9kZShsaWJyYXJ5KTsKICAgIHNpbmsud3JpdGVTdHJpbmdNYXAoX21lbWJlck1hcCwgc2luay53cml0ZU1lbWJlck5vZGUpOwogICAgc2luay53cml0ZVN0cmluZ01hcChfc2V0dGVyTWFwLCBzaW5rLndyaXRlTWVtYmVyTm9kZSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgdm9pZCByZWdpc3RlckNsYXNzKFN0cmluZyBuYW1lLCBKQ2xhc3NFbnYgY2xhc3NFbnYpIHsKICAgIF9jbGFzc01hcFtuYW1lXSA9IGNsYXNzRW52OwogIH0KCiAgLy8vIFJldHVybiB0aGUgW0pDbGFzc0Vudl0gZm9yIHRoZSBjbGFzcyBbbmFtZV0gaW4gW2xpYnJhcnldLgogIEpDbGFzc0VudiBsb29rdXBDbGFzcyhTdHJpbmcgbmFtZSkgewogICAgcmV0dXJuIF9jbGFzc01hcFtuYW1lXTsKICB9CgogIC8vLyBDYWxscyBbZl0gZm9yIGVhY2ggY2xhc3MgaW4gdGhpcyBsaWJyYXJ5LgogIHZvaWQgZm9yRWFjaENsYXNzKHZvaWQgZihKQ2xhc3NFbnYgY2xzKSkgewogICAgX2NsYXNzTWFwLnZhbHVlcy5mb3JFYWNoKGYpOwogIH0KCiAgLy8vIFJldHVybiB0aGUgW2lyLk1lbWJlcl0gZm9yIHRoZSBtZW1iZXIgW25hbWVdIGluIFtsaWJyYXJ5XS4KICBpci5NZW1iZXIgbG9va3VwTWVtYmVyKFN0cmluZyBuYW1lLCB7Ym9vbCBzZXR0ZXI6IGZhbHNlfSkgewogICAgcmV0dXJuIHNldHRlciA/IF9zZXR0ZXJNYXBbbmFtZV0gOiBfbWVtYmVyTWFwW25hbWVdOwogIH0KCiAgdm9pZCBmb3JFYWNoTWVtYmVyKHZvaWQgZihpci5NZW1iZXIgbWVtYmVyKSkgewogICAgX21lbWJlck1hcC52YWx1ZXMuZm9yRWFjaChmKTsKICAgIGZvciAoaXIuTWVtYmVyIG1lbWJlciBpbiBfc2V0dGVyTWFwLnZhbHVlcykgewogICAgICBpZiAobWVtYmVyIGlzIGlyLlByb2NlZHVyZSkgewogICAgICAgIGYobWVtYmVyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBTa2lwIGZpZWxkczsgdGhlc2UgYXJlIGFsc28gaW4gX21lbWJlck1hcC4KICAgICAgfQogICAgfQogIH0KfQoKY2xhc3MgSkxpYnJhcnlEYXRhIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0pMaWJyYXJ5RGF0YV0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdsaWJyYXJ5LWRhdGEnOwoKICBmaW5hbCBpci5MaWJyYXJ5IGxpYnJhcnk7CiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQXZvaWQgZGlyZWN0IGFjY2VzcyB0byBbaW1wb3J0c10uIEl0IG1pZ2h0IGJlIG51bGwgaWYKICAvLyBpdCBoYXNuJ3QgYmVlbiBjb21wdXRlZCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgW0tMaWJyYXJ5RGF0YV0uCiAgZmluYWwgTWFwPGlyLkxpYnJhcnlEZXBlbmRlbmN5LCBJbXBvcnRFbnRpdHk+IGltcG9ydHM7CgogIEpMaWJyYXJ5RGF0YSh0aGlzLmxpYnJhcnksIHRoaXMuaW1wb3J0cyk7CgogIGZhY3RvcnkgSkxpYnJhcnlEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5MaWJyYXJ5IGxpYnJhcnkgPSBzb3VyY2UucmVhZExpYnJhcnlOb2RlKCk7CiAgICBpbnQgaW1wb3J0Q291bnQgPSBzb3VyY2UucmVhZEludCgpOwogICAgTWFwPGlyLkxpYnJhcnlEZXBlbmRlbmN5LCBJbXBvcnRFbnRpdHk+IGltcG9ydHM7CiAgICBpZiAoaW1wb3J0Q291bnQgPiAwKSB7CiAgICAgIGltcG9ydHMgPSB7fTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRDb3VudDsgaSsrKSB7CiAgICAgICAgaW50IGluZGV4ID0gc291cmNlLnJlYWRJbnQoKTsKICAgICAgICBJbXBvcnRFbnRpdHkgaW1wb3J0ID0gc291cmNlLnJlYWRJbXBvcnQoKTsKICAgICAgICBpbXBvcnRzW2xpYnJhcnkuZGVwZW5kZW5jaWVzW2luZGV4XV0gPSBpbXBvcnQ7CiAgICAgIH0KICAgIH0KICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgSkxpYnJhcnlEYXRhKGxpYnJhcnksIGltcG9ydHMpOwogIH0KCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUxpYnJhcnlOb2RlKGxpYnJhcnkpOwogICAgaWYgKGltcG9ydHMgPT0gbnVsbCkgewogICAgICBzaW5rLndyaXRlSW50KDApOwogICAgfSBlbHNlIHsKICAgICAgc2luay53cml0ZUludChpbXBvcnRzLmxlbmd0aCk7CiAgICAgIGludCBpbmRleCA9IDA7CiAgICAgIGZvciAoaXIuTGlicmFyeURlcGVuZGVuY3kgbm9kZSBpbiBsaWJyYXJ5LmRlcGVuZGVuY2llcykgewogICAgICAgIEltcG9ydEVudGl0eSBpbXBvcnQgPSBpbXBvcnRzW25vZGVdOwogICAgICAgIGlmIChpbXBvcnQgIT0gbnVsbCkgewogICAgICAgICAgc2luay53cml0ZUludChpbmRleCk7CiAgICAgICAgICBzaW5rLndyaXRlSW1wb3J0KGltcG9ydCk7CiAgICAgICAgfQogICAgICAgIGluZGV4Kys7CiAgICAgIH0KICAgIH0KICAgIHNpbmsuZW5kKHRhZyk7CiAgfQp9CgovLy8gRW51bSB1c2VkIGZvciBpZGVudGlmeWluZyBbSkNsYXNzRW52XSBzdWJjbGFzc2VzIGluIHNlcmlhbGl6YXRpb24uCmVudW0gSkNsYXNzRW52S2luZCB7IG5vZGUsIGNsb3N1cmUsIHJlY29yZCB9CgovLy8gTWVtYmVyIGRhdGEgZm9yIGEgY2xhc3MuCmFic3RyYWN0IGNsYXNzIEpDbGFzc0VudiB7CiAgLy8vIERlc2VyaWFsaXplcyBhIFtKQ2xhc3NFbnZdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgSkNsYXNzRW52LnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgSkNsYXNzRW52S2luZCBraW5kID0gc291cmNlLnJlYWRFbnVtKEpDbGFzc0VudktpbmQudmFsdWVzKTsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIEpDbGFzc0VudktpbmQubm9kZToKICAgICAgICByZXR1cm4gbmV3IEpDbGFzc0VudkltcGwucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNhc2UgSkNsYXNzRW52S2luZC5jbG9zdXJlOgogICAgICAgIHJldHVybiBuZXcgQ2xvc3VyZUNsYXNzRW52LnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBjYXNlIEpDbGFzc0VudktpbmQucmVjb3JkOgogICAgICAgIHJldHVybiBuZXcgUmVjb3JkRW52LnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgfQogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuc3VwcG9ydGVkIEpDbGFzc0VudktpbmQgJGtpbmQiKTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0pDbGFzc0Vudl0gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspOwoKICAvLy8gVGhlIFtpci5DbGFzc10gdGhhdCBkZWZpbmVkIHRoZSBjbGFzcywgaWYgYW55LgogIGlyLkNsYXNzIGdldCBjbHM7CgogIC8vLyBXaGV0aGVyIHRoZSBjbGFzcyBpcyBhbiB1bm5hbWVkIG1peGluIGFwcGxpY2F0aW9uLgogIGJvb2wgZ2V0IGlzVW5uYW1lZE1peGluQXBwbGljYXRpb247CgogIC8vLyBXaGV0aGVyIHRoZSBjbGFzcyBpcyBhIG1peGluIGFwcGxpY2F0aW9uIHRoYXQgbWl4ZXMgaW4gbWV0aG9kcyB3aXRoIHN1cGVyCiAgLy8vIGNhbGxzLgogIGJvb2wgZ2V0IGlzU3VwZXJNaXhpbkFwcGxpY2F0aW9uOwoKICAvLy8gUmV0dXJuIHRoZSBbTWVtYmVyRW50aXR5XSBmb3IgdGhlIG1lbWJlciBbbmFtZV0gaW4gdGhlIGNsYXNzLiBJZiBbc2V0dGVyXQogIC8vLyBpcyBgdHJ1ZWAsIHRoZSBzZXR0ZXIgb3IgYXNzaWduYWJsZSBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIFtuYW1lXSBpcwogIC8vLyByZXR1cm5lZC4KICBNZW1iZXJFbnRpdHkgbG9va3VwTWVtYmVyKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsIFN0cmluZyBuYW1lLAogICAgICB7Ym9vbCBzZXR0ZXI6IGZhbHNlfSk7CgogIC8vLyBDYWxscyBbZl0gZm9yIGVhY2ggbWVtYmVyIG9mIFtjbHNdLgogIHZvaWQgZm9yRWFjaE1lbWJlcihJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwLCB2b2lkIGYoTWVtYmVyRW50aXR5IG1lbWJlcikpOwoKICAvLy8gUmV0dXJuIHRoZSBbQ29uc3RydWN0b3JFbnRpdHldIGZvciB0aGUgY29uc3RydWN0b3IgW25hbWVdIGluIFtjbHNdLgogIENvbnN0cnVjdG9yRW50aXR5IGxvb2t1cENvbnN0cnVjdG9yKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsIFN0cmluZyBuYW1lKTsKCiAgLy8vIENhbGxzIFtmXSBmb3IgZWFjaCBjb25zdHJ1Y3RvciBvZiBbY2xzXS4KICB2b2lkIGZvckVhY2hDb25zdHJ1Y3RvcigKICAgICAgSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwgdm9pZCBmKENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yKSk7CgogIC8vLyBDYWxscyBbZl0gZm9yIGVhY2ggY29uc3RydWN0b3IgYm9keSBmb3IgdGhlIGxpdmUgY29uc3RydWN0b3JzIGluIHRoZQogIC8vLyBjbGFzcy4KICB2b2lkIGZvckVhY2hDb25zdHJ1Y3RvckJvZHkodm9pZCBmKENvbnN0cnVjdG9yQm9keUVudGl0eSBjb25zdHJ1Y3RvcikpOwp9CgovLy8gRW52aXJvbm1lbnQgZm9yIGZhc3QgbG9va3VwIG9mIGNsYXNzIG1lbWJlcnMuCmNsYXNzIEpDbGFzc0VudkltcGwgaW1wbGVtZW50cyBKQ2xhc3NFbnYgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbSkNsYXNzRW52XSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2NsYXNzLWVudic7CgogIEBvdmVycmlkZQogIGZpbmFsIGlyLkNsYXNzIGNsczsKICBmaW5hbCBNYXA8U3RyaW5nLCBpci5NZW1iZXI+IF9jb25zdHJ1Y3Rvck1hcDsKICBmaW5hbCBNYXA8U3RyaW5nLCBpci5NZW1iZXI+IF9tZW1iZXJNYXA7CiAgZmluYWwgTWFwPFN0cmluZywgaXIuTWVtYmVyPiBfc2V0dGVyTWFwOwogIGZpbmFsIExpc3Q8aXIuTWVtYmVyPiBfbWVtYmVyczsgLy8gaW4gZGVjbGFyYXRpb24gb3JkZXIuCiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc1N1cGVyTWl4aW5BcHBsaWNhdGlvbjsKCiAgLy8vIENvbnN0cnVjdG9yIGJvZGllcyBjcmVhdGVkIGZvciB0aGlzIGNsYXNzLgogIExpc3Q8Q29uc3RydWN0b3JCb2R5RW50aXR5PiBfY29uc3RydWN0b3JCb2R5TGlzdDsKCiAgSkNsYXNzRW52SW1wbCh0aGlzLmNscywgdGhpcy5fY29uc3RydWN0b3JNYXAsIHRoaXMuX21lbWJlck1hcCwKICAgICAgdGhpcy5fc2V0dGVyTWFwLCB0aGlzLl9tZW1iZXJzLCB0aGlzLmlzU3VwZXJNaXhpbkFwcGxpY2F0aW9uKTsKCiAgZmFjdG9yeSBKQ2xhc3NFbnZJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5DbGFzcyBjbHMgPSBzb3VyY2UucmVhZENsYXNzTm9kZSgpOwogICAgTWFwPFN0cmluZywgaXIuTWVtYmVyPiBjb25zdHJ1Y3Rvck1hcCA9CiAgICAgICAgc291cmNlLnJlYWRTdHJpbmdNYXAoc291cmNlLnJlYWRNZW1iZXJOb2RlKTsKICAgIE1hcDxTdHJpbmcsIGlyLk1lbWJlcj4gbWVtYmVyTWFwID0KICAgICAgICBzb3VyY2UucmVhZFN0cmluZ01hcChzb3VyY2UucmVhZE1lbWJlck5vZGUpOwogICAgTWFwPFN0cmluZywgaXIuTWVtYmVyPiBzZXR0ZXJNYXAgPQogICAgICAgIHNvdXJjZS5yZWFkU3RyaW5nTWFwKHNvdXJjZS5yZWFkTWVtYmVyTm9kZSk7CiAgICBMaXN0PGlyLk1lbWJlcj4gbWVtYmVycyA9IHNvdXJjZS5yZWFkTWVtYmVyTm9kZXMoKTsKICAgIGJvb2wgaXNTdXBlck1peGluQXBwbGljYXRpb24gPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgSkNsYXNzRW52SW1wbChjbHMsIGNvbnN0cnVjdG9yTWFwLCBtZW1iZXJNYXAsIHNldHRlck1hcCwgbWVtYmVycywKICAgICAgICBpc1N1cGVyTWl4aW5BcHBsaWNhdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShKQ2xhc3NFbnZLaW5kLm5vZGUpOwogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUNsYXNzTm9kZShjbHMpOwogICAgc2luay53cml0ZVN0cmluZ01hcChfY29uc3RydWN0b3JNYXAsIHNpbmsud3JpdGVNZW1iZXJOb2RlKTsKICAgIHNpbmsud3JpdGVTdHJpbmdNYXAoX21lbWJlck1hcCwgc2luay53cml0ZU1lbWJlck5vZGUpOwogICAgc2luay53cml0ZVN0cmluZ01hcChfc2V0dGVyTWFwLCBzaW5rLndyaXRlTWVtYmVyTm9kZSk7CiAgICBzaW5rLndyaXRlTWVtYmVyTm9kZXMoX21lbWJlcnMpOwogICAgc2luay53cml0ZUJvb2woaXNTdXBlck1peGluQXBwbGljYXRpb24pOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzVW5uYW1lZE1peGluQXBwbGljYXRpb24gPT4gY2xzLmlzQW5vbnltb3VzTWl4aW47CgogIEBvdmVycmlkZQogIE1lbWJlckVudGl0eSBsb29rdXBNZW1iZXIoSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwgU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2V9KSB7CiAgICBpci5NZW1iZXIgbWVtYmVyID0gc2V0dGVyID8gX3NldHRlck1hcFtuYW1lXSA6IF9tZW1iZXJNYXBbbmFtZV07CiAgICByZXR1cm4gbWVtYmVyICE9IG51bGwgPyBlbGVtZW50TWFwLmdldE1lbWJlcihtZW1iZXIpIDogbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaE1lbWJlcihJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwLCB2b2lkIGYoTWVtYmVyRW50aXR5IG1lbWJlcikpIHsKICAgIF9tZW1iZXJzLmZvckVhY2goKGlyLk1lbWJlciBtZW1iZXIpIHsKICAgICAgZihlbGVtZW50TWFwLmdldE1lbWJlcihtZW1iZXIpKTsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RydWN0b3JFbnRpdHkgbG9va3VwQ29uc3RydWN0b3IoSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwgU3RyaW5nIG5hbWUpIHsKICAgIGlyLk1lbWJlciBjb25zdHJ1Y3RvciA9IF9jb25zdHJ1Y3Rvck1hcFtuYW1lXTsKICAgIHJldHVybiBjb25zdHJ1Y3RvciAhPSBudWxsID8gZWxlbWVudE1hcC5nZXRDb25zdHJ1Y3Rvcihjb25zdHJ1Y3RvcikgOiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoQ29uc3RydWN0b3IoCiAgICAgIElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsIHZvaWQgZihDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvcikpIHsKICAgIF9jb25zdHJ1Y3Rvck1hcC52YWx1ZXMuZm9yRWFjaCgoaXIuTWVtYmVyIGNvbnN0cnVjdG9yKSB7CiAgICAgIGYoZWxlbWVudE1hcC5nZXRDb25zdHJ1Y3Rvcihjb25zdHJ1Y3RvcikpOwogICAgfSk7CiAgfQoKICB2b2lkIGFkZENvbnN0cnVjdG9yQm9keShDb25zdHJ1Y3RvckJvZHlFbnRpdHkgY29uc3RydWN0b3JCb2R5KSB7CiAgICBfY29uc3RydWN0b3JCb2R5TGlzdCA/Pz0gPENvbnN0cnVjdG9yQm9keUVudGl0eT5bXTsKICAgIF9jb25zdHJ1Y3RvckJvZHlMaXN0LmFkZChjb25zdHJ1Y3RvckJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoQ29uc3RydWN0b3JCb2R5KHZvaWQgZihDb25zdHJ1Y3RvckJvZHlFbnRpdHkgY29uc3RydWN0b3IpKSB7CiAgICBfY29uc3RydWN0b3JCb2R5TGlzdD8uZm9yRWFjaChmKTsKICB9Cn0KCmNsYXNzIFJlY29yZEVudiBpbXBsZW1lbnRzIEpDbGFzc0VudiB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtSZWNvcmRFbnZdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAncmVjb3JkLWVudic7CgogIGZpbmFsIE1hcDxTdHJpbmcsIEluZGV4ZWRNZW1iZXI+IF9tZW1iZXJNYXA7CgogIFJlY29yZEVudih0aGlzLl9tZW1iZXJNYXApOwoKICBmYWN0b3J5IFJlY29yZEVudi5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgTWFwPFN0cmluZywgSW5kZXhlZE1lbWJlcj4gX21lbWJlck1hcCA9CiAgICAgICAgc291cmNlLnJlYWRTdHJpbmdNYXAoKCkgPT4gc291cmNlLnJlYWRNZW1iZXIoKSk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IFJlY29yZEVudihfbWVtYmVyTWFwKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKEpDbGFzc0VudktpbmQucmVjb3JkKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVTdHJpbmdNYXAoCiAgICAgICAgX21lbWJlck1hcCwgKEluZGV4ZWRNZW1iZXIgbWVtYmVyKSA9PiBzaW5rLndyaXRlTWVtYmVyKG1lbWJlcikpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaENvbnN0cnVjdG9yQm9keSh2b2lkIGYoQ29uc3RydWN0b3JCb2R5RW50aXR5IGNvbnN0cnVjdG9yKSkgewogICAgLy8gV2UgZG8gbm90IGNyZWF0ZSBjb25zdHJ1Y3RvciBib2RpZXMgZm9yIGNvbnRhaW5lcnMuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hDb25zdHJ1Y3RvcigKICAgICAgSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwgdm9pZCBmKENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yKSkgewogICAgLy8gV2UgZG8gbm90IGNyZWF0ZSBjb25zdHJ1Y3RvcnMgZm9yIGNvbnRhaW5lcnMuCiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdHJ1Y3RvckVudGl0eSBsb29rdXBDb25zdHJ1Y3RvcihJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwLCBTdHJpbmcgbmFtZSkgewogICAgLy8gV2UgZG8gbm90IGNyZWF0ZSBjb25zdHJ1Y3RvcnMgZm9yIGNvbnRhaW5lcnMuCiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaE1lbWJlcihJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwLCB2b2lkIGYoTWVtYmVyRW50aXR5IG1lbWJlcikpIHsKICAgIF9tZW1iZXJNYXAudmFsdWVzLmZvckVhY2goZik7CiAgfQoKICBAb3ZlcnJpZGUKICBNZW1iZXJFbnRpdHkgbG9va3VwTWVtYmVyKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsIFN0cmluZyBuYW1lLAogICAgICB7Ym9vbCBzZXR0ZXI6IGZhbHNlfSkgewogICAgcmV0dXJuIF9tZW1iZXJNYXBbbmFtZV07CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1VubmFtZWRNaXhpbkFwcGxpY2F0aW9uID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1N1cGVyTWl4aW5BcHBsaWNhdGlvbiA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgaXIuQ2xhc3MgZ2V0IGNscyA9PiBudWxsOwp9CgpjbGFzcyBDbG9zdXJlQ2xhc3NFbnYgZXh0ZW5kcyBSZWNvcmRFbnYgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbQ2xvc3VyZUNsYXNzRW52XSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2Nsb3N1cmUtY2xhc3MtZW52JzsKCiAgQ2xvc3VyZUNsYXNzRW52KE1hcDxTdHJpbmcsIE1lbWJlckVudGl0eT4gbWVtYmVyTWFwKSA6IHN1cGVyKG1lbWJlck1hcCk7CgogIGZhY3RvcnkgQ2xvc3VyZUNsYXNzRW52LnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBNYXA8U3RyaW5nLCBJbmRleGVkTWVtYmVyPiBfbWVtYmVyTWFwID0KICAgICAgICBzb3VyY2UucmVhZFN0cmluZ01hcCgoKSA9PiBzb3VyY2UucmVhZE1lbWJlcigpKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgQ2xvc3VyZUNsYXNzRW52KF9tZW1iZXJNYXApOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oSkNsYXNzRW52S2luZC5jbG9zdXJlKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVTdHJpbmdNYXAoCiAgICAgICAgX21lbWJlck1hcCwgKEluZGV4ZWRNZW1iZXIgbWVtYmVyKSA9PiBzaW5rLndyaXRlTWVtYmVyKG1lbWJlcikpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlckVudGl0eSBsb29rdXBNZW1iZXIoSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwgU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2V9KSB7CiAgICBpZiAoc2V0dGVyKSB7CiAgICAgIC8vIEFsbCBjbG9zdXJlIGZpZWxkcyBhcmUgZmluYWwuCiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIHN1cGVyLmxvb2t1cE1lbWJlcihlbGVtZW50TWFwLCBuYW1lLCBzZXR0ZXI6IHNldHRlcik7CiAgfQp9CgovLy8gRW51bSB1c2VkIGZvciBpZGVudGlmeWluZyBbSkNsYXNzRGF0YV0gc3ViY2xhc3NlcyBpbiBzZXJpYWxpemF0aW9uLgplbnVtIEpDbGFzc0RhdGFLaW5kIHsgbm9kZSwgY2xvc3VyZSwgcmVjb3JkIH0KCmFic3RyYWN0IGNsYXNzIEpDbGFzc0RhdGEgewogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbSkNsYXNzRGF0YV0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBKQ2xhc3NEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgSkNsYXNzRGF0YUtpbmQga2luZCA9IHNvdXJjZS5yZWFkRW51bShKQ2xhc3NEYXRhS2luZC52YWx1ZXMpOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgSkNsYXNzRGF0YUtpbmQubm9kZToKICAgICAgICByZXR1cm4gbmV3IEpDbGFzc0RhdGFJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBjYXNlIEpDbGFzc0RhdGFLaW5kLmNsb3N1cmU6CiAgICAgICAgcmV0dXJuIG5ldyBDbG9zdXJlQ2xhc3NEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBjYXNlIEpDbGFzc0RhdGFLaW5kLnJlY29yZDoKICAgICAgICByZXR1cm4gbmV3IFJlY29yZENsYXNzRGF0YS5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmV4cGVjdGVkIEpDbGFzc0RhdGFLaW5kICRraW5kIik7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtKQ2xhc3NEYXRhXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luayk7CgogIENsYXNzRGVmaW5pdGlvbiBnZXQgZGVmaW5pdGlvbjsKCiAgSW50ZXJmYWNlVHlwZSBnZXQgdGhpc1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBnZXQgcmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIGdldCBzdXBlcnR5cGU7CiAgSW50ZXJmYWNlVHlwZSBnZXQgbWl4ZWRJblR5cGU7CiAgTGlzdDxJbnRlcmZhY2VUeXBlPiBnZXQgaW50ZXJmYWNlczsKICBPcmRlcmVkVHlwZVNldCBnZXQgb3JkZXJlZFR5cGVTZXQ7CiAgRGFydFR5cGUgZ2V0IGNhbGxUeXBlOwoKICBib29sIGdldCBpc0VudW1DbGFzczsKICBib29sIGdldCBpc01peGluQXBwbGljYXRpb247Cn0KCmNsYXNzIEpDbGFzc0RhdGFJbXBsIGltcGxlbWVudHMgSkNsYXNzRGF0YSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtKQ2xhc3NEYXRhSW1wbF0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdjbGFzcy1kYXRhJzsKCiAgZmluYWwgaXIuQ2xhc3MgY2xzOwogIEBvdmVycmlkZQogIGZpbmFsIENsYXNzRGVmaW5pdGlvbiBkZWZpbml0aW9uOwogIEBvdmVycmlkZQogIGJvb2wgaXNNaXhpbkFwcGxpY2F0aW9uOwogIGJvb2wgaXNDYWxsVHlwZUNvbXB1dGVkID0gZmFsc2U7CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgdGhpc1R5cGU7CiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSByYXdUeXBlOwogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgc3VwZXJ0eXBlOwogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgbWl4ZWRJblR5cGU7CiAgQG92ZXJyaWRlCiAgTGlzdDxJbnRlcmZhY2VUeXBlPiBpbnRlcmZhY2VzOwogIEBvdmVycmlkZQogIE9yZGVyZWRUeXBlU2V0IG9yZGVyZWRUeXBlU2V0OwoKICBKQ2xhc3NEYXRhSW1wbCh0aGlzLmNscywgdGhpcy5kZWZpbml0aW9uKTsKCiAgZmFjdG9yeSBKQ2xhc3NEYXRhSW1wbC5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgaXIuQ2xhc3MgY2xzID0gc291cmNlLnJlYWRDbGFzc05vZGUoKTsKICAgIENsYXNzRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbmV3IENsYXNzRGVmaW5pdGlvbi5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgSkNsYXNzRGF0YUltcGwoY2xzLCBkZWZpbml0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKEpDbGFzc0RhdGFLaW5kLm5vZGUpOwogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUNsYXNzTm9kZShjbHMpOwogICAgZGVmaW5pdGlvbi53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFbnVtQ2xhc3MgPT4gY2xzICE9IG51bGwgJiYgY2xzLmlzRW51bTsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0IGNhbGxUeXBlID0+IG51bGw7Cn0KCi8vLyBFbnVtIHVzZWQgZm9yIGlkZW50aWZ5aW5nIFtKTWVtYmVyRGF0YV0gc3ViY2xhc3NlcyBpbiBzZXJpYWxpemF0aW9uLgplbnVtIEpNZW1iZXJEYXRhS2luZCB7CiAgZnVuY3Rpb24sCiAgZmllbGQsCiAgY29uc3RydWN0b3IsCiAgY29uc3RydWN0b3JCb2R5LAogIHNpZ25hdHVyZSwKICBnZW5lcmF0b3JCb2R5LAogIGNsb3N1cmVGdW5jdGlvbiwKICBjbG9zdXJlRmllbGQsCn0KCmFic3RyYWN0IGNsYXNzIEpNZW1iZXJEYXRhIHsKICBNZW1iZXJEZWZpbml0aW9uIGdldCBkZWZpbml0aW9uOwoKICBJbnRlcmZhY2VUeXBlIGdldE1lbWJlclRoaXNUeXBlKEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApOwoKICBDbGFzc1R5cGVWYXJpYWJsZUFjY2VzcyBnZXQgY2xhc3NUeXBlVmFyaWFibGVBY2Nlc3M7CgogIE1hcDxpci5FeHByZXNzaW9uLCBpci5EYXJ0VHlwZT4gZ2V0IHN0YXRpY1R5cGVzOwoKICBKTWVtYmVyRGF0YSgpOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW0pNZW1iZXJEYXRhXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IEpNZW1iZXJEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgSk1lbWJlckRhdGFLaW5kIGtpbmQgPSBzb3VyY2UucmVhZEVudW0oSk1lbWJlckRhdGFLaW5kLnZhbHVlcyk7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBKTWVtYmVyRGF0YUtpbmQuZnVuY3Rpb246CiAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbkRhdGFJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBjYXNlIEpNZW1iZXJEYXRhS2luZC5maWVsZDoKICAgICAgICByZXR1cm4gbmV3IEpGaWVsZERhdGFJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBjYXNlIEpNZW1iZXJEYXRhS2luZC5jb25zdHJ1Y3RvcjoKICAgICAgICByZXR1cm4gbmV3IEpDb25zdHJ1Y3RvckRhdGFJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBjYXNlIEpNZW1iZXJEYXRhS2luZC5jb25zdHJ1Y3RvckJvZHk6CiAgICAgICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3RvckJvZHlEYXRhSW1wbC5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgY2FzZSBKTWVtYmVyRGF0YUtpbmQuc2lnbmF0dXJlOgogICAgICAgIHJldHVybiBuZXcgU2lnbmF0dXJlRnVuY3Rpb25EYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBjYXNlIEpNZW1iZXJEYXRhS2luZC5nZW5lcmF0b3JCb2R5OgogICAgICAgIHJldHVybiBuZXcgR2VuZXJhdG9yQm9keUZ1bmN0aW9uRGF0YS5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgY2FzZSBKTWVtYmVyRGF0YUtpbmQuY2xvc3VyZUZ1bmN0aW9uOgogICAgICAgIHJldHVybiBuZXcgQ2xvc3VyZUZ1bmN0aW9uRGF0YS5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgY2FzZSBKTWVtYmVyRGF0YUtpbmQuY2xvc3VyZUZpZWxkOgogICAgICAgIHJldHVybiBuZXcgQ2xvc3VyZUZpZWxkRGF0YS5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmV4cGVjdGVkIEpNZW1iZXJEYXRhS2luZCAka2luZCIpOwogIH0KCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbSk1lbWJlckRhdGFdIHRvIFtzaW5rXS4KICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKTsKfQoKYWJzdHJhY3QgY2xhc3MgSk1lbWJlckRhdGFJbXBsIGltcGxlbWVudHMgSk1lbWJlckRhdGEgewogIGZpbmFsIGlyLk1lbWJlciBub2RlOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb247CgogIEBvdmVycmlkZQogIGZpbmFsIE1hcDxpci5FeHByZXNzaW9uLCBpci5EYXJ0VHlwZT4gc3RhdGljVHlwZXM7CgogIEpNZW1iZXJEYXRhSW1wbCh0aGlzLm5vZGUsIHRoaXMuZGVmaW5pdGlvbiwgdGhpcy5zdGF0aWNUeXBlcyk7CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0TWVtYmVyVGhpc1R5cGUoSnNUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCkgewogICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IGVsZW1lbnRNYXAuZ2V0TWVtYmVyKG5vZGUpOwogICAgQ2xhc3NFbnRpdHkgY2xzID0gbWVtYmVyLmVuY2xvc2luZ0NsYXNzOwogICAgaWYgKGNscyAhPSBudWxsKSB7CiAgICAgIHJldHVybiBlbGVtZW50TWFwLmVsZW1lbnRFbnZpcm9ubWVudC5nZXRUaGlzVHlwZShjbHMpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBGdW5jdGlvbkRhdGEgaW1wbGVtZW50cyBKTWVtYmVyRGF0YSB7CiAgRnVuY3Rpb25UeXBlIGdldEZ1bmN0aW9uVHlwZShJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwKTsKCiAgTGlzdDxUeXBlVmFyaWFibGVUeXBlPiBnZXRGdW5jdGlvblR5cGVWYXJpYWJsZXMoSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCk7CgogIHZvaWQgZm9yRWFjaFBhcmFtZXRlcigKICAgICAgSnNUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwKICAgICAgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAgdm9pZCBmKERhcnRUeXBlIHR5cGUsIFN0cmluZyBuYW1lLCBDb25zdGFudFZhbHVlIGRlZmF1bHRWYWx1ZSksCiAgICAgIHtib29sIGlzTmF0aXZlOiBmYWxzZX0pOwp9CgphYnN0cmFjdCBjbGFzcyBGdW5jdGlvbkRhdGFUeXBlVmFyaWFibGVzTWl4aW4gaW1wbGVtZW50cyBGdW5jdGlvbkRhdGEgewogIGlyLkZ1bmN0aW9uTm9kZSBnZXQgZnVuY3Rpb25Ob2RlOwogIExpc3Q8VHlwZVZhcmlhYmxlVHlwZT4gX3R5cGVWYXJpYWJsZXM7CgogIEBvdmVycmlkZQogIExpc3Q8VHlwZVZhcmlhYmxlVHlwZT4gZ2V0RnVuY3Rpb25UeXBlVmFyaWFibGVzKAogICAgICBjb3ZhcmlhbnQgSnNLZXJuZWxUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCkgewogICAgaWYgKF90eXBlVmFyaWFibGVzID09IG51bGwpIHsKICAgICAgaWYgKGZ1bmN0aW9uTm9kZS50eXBlUGFyYW1ldGVycy5pc0VtcHR5KSB7CiAgICAgICAgX3R5cGVWYXJpYWJsZXMgPSBjb25zdCA8VHlwZVZhcmlhYmxlVHlwZT5bXTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpci5UcmVlTm9kZSBwYXJlbnQgPSBmdW5jdGlvbk5vZGUucGFyZW50OwogICAgICAgIGlmIChwYXJlbnQgaXMgaXIuQ29uc3RydWN0b3IgfHwKICAgICAgICAgICAgKHBhcmVudCBpcyBpci5Qcm9jZWR1cmUgJiYKICAgICAgICAgICAgICAgIHBhcmVudC5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuRmFjdG9yeSkpIHsKICAgICAgICAgIF90eXBlVmFyaWFibGVzID0gY29uc3QgPFR5cGVWYXJpYWJsZVR5cGU+W107CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIF90eXBlVmFyaWFibGVzID0gZnVuY3Rpb25Ob2RlLnR5cGVQYXJhbWV0ZXJzCiAgICAgICAgICAgICAgLm1hcDxUeXBlVmFyaWFibGVUeXBlPigoaXIuVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50TWFwCiAgICAgICAgICAgICAgICAuZ2V0RGFydFR5cGUobmV3IGlyLlR5cGVQYXJhbWV0ZXJUeXBlKHR5cGVQYXJhbWV0ZXIpKTsKICAgICAgICAgIH0pLnRvTGlzdCgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIF90eXBlVmFyaWFibGVzOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgRnVuY3Rpb25EYXRhRm9yRWFjaFBhcmFtZXRlck1peGluIGltcGxlbWVudHMgRnVuY3Rpb25EYXRhIHsKICBpci5GdW5jdGlvbk5vZGUgZ2V0IGZ1bmN0aW9uTm9kZTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoUGFyYW1ldGVyKAogICAgICBKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwLAogICAgICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlLAogICAgICB2b2lkIGYoRGFydFR5cGUgdHlwZSwgU3RyaW5nIG5hbWUsIENvbnN0YW50VmFsdWUgZGVmYXVsdFZhbHVlKSwKICAgICAge2Jvb2wgaXNOYXRpdmU6IGZhbHNlfSkgewogICAgdm9pZCBoYW5kbGVQYXJhbWV0ZXIoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlLCB7Ym9vbCBpc09wdGlvbmFsOiB0cnVlfSkgewogICAgICBEYXJ0VHlwZSB0eXBlID0gZWxlbWVudE1hcC5nZXREYXJ0VHlwZShub2RlLnR5cGUpOwogICAgICBTdHJpbmcgbmFtZSA9IG5vZGUubmFtZTsKICAgICAgQ29uc3RhbnRWYWx1ZSBkZWZhdWx0VmFsdWU7CiAgICAgIGlmIChpc09wdGlvbmFsKSB7CiAgICAgICAgaWYgKG5vZGUuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgZGVmYXVsdFZhbHVlID0gZWxlbWVudE1hcC5nZXRDb25zdGFudFZhbHVlKG5vZGUuaW5pdGlhbGl6ZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBuZXcgTnVsbENvbnN0YW50VmFsdWUoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZih0eXBlLCBuYW1lLCBkZWZhdWx0VmFsdWUpOwogICAgfQoKICAgIGZvckVhY2hPcmRlcmVkUGFyYW1ldGVyQnlGdW5jdGlvbk5vZGUoZnVuY3Rpb25Ob2RlLCBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgICAgKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyLCB7Ym9vbCBpc09wdGlvbmFsLCBib29sIGlzRWxpZGVkfSkgewogICAgICBpZiAoIWlzRWxpZGVkKSB7CiAgICAgICAgaGFuZGxlUGFyYW1ldGVyKHBhcmFtZXRlciwgaXNPcHRpb25hbDogaXNPcHRpb25hbCk7CiAgICAgIH0KICAgIH0sIHVzZU5hdGl2ZU9yZGVyaW5nOiBpc05hdGl2ZSk7CiAgfQp9CgpjbGFzcyBGdW5jdGlvbkRhdGFJbXBsIGV4dGVuZHMgSk1lbWJlckRhdGFJbXBsCiAgICB3aXRoIEZ1bmN0aW9uRGF0YVR5cGVWYXJpYWJsZXNNaXhpbiwgRnVuY3Rpb25EYXRhRm9yRWFjaFBhcmFtZXRlck1peGluCiAgICBpbXBsZW1lbnRzIEZ1bmN0aW9uRGF0YSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtGdW5jdGlvbkRhdGFJbXBsXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2Z1bmN0aW9uLWRhdGEnOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb25Ob2RlOwogIEZ1bmN0aW9uVHlwZSBfdHlwZTsKCiAgRnVuY3Rpb25EYXRhSW1wbChpci5NZW1iZXIgbm9kZSwgdGhpcy5mdW5jdGlvbk5vZGUsCiAgICAgIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiwgTWFwPGlyLkV4cHJlc3Npb24sIGlyLkRhcnRUeXBlPiBzdGF0aWNUeXBlcykKICAgICAgOiBzdXBlcihub2RlLCBkZWZpbml0aW9uLCBzdGF0aWNUeXBlcyk7CgogIGZhY3RvcnkgRnVuY3Rpb25EYXRhSW1wbC5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgaXIuTWVtYmVyIG5vZGUgPSBzb3VyY2UucmVhZE1lbWJlck5vZGUoKTsKICAgIGlyLkZ1bmN0aW9uTm9kZSBmdW5jdGlvbk5vZGU7CiAgICBpZiAobm9kZSBpcyBpci5Qcm9jZWR1cmUpIHsKICAgICAgZnVuY3Rpb25Ob2RlID0gbm9kZS5mdW5jdGlvbjsKICAgIH0gZWxzZSBpZiAobm9kZSBpcyBpci5Db25zdHJ1Y3RvcikgewogICAgICBmdW5jdGlvbk5vZGUgPSBub2RlLmZ1bmN0aW9uOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAiVW5leHBlY3RlZCBtZW1iZXIgbm9kZSAkbm9kZSAoJHtub2RlLnJ1bnRpbWVUeXBlfSkuIik7CiAgICB9CiAgICBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24gPQogICAgICAgIG5ldyBNZW1iZXJEZWZpbml0aW9uLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgTWFwPGlyLkV4cHJlc3Npb24sIGlyLkRhcnRUeXBlPiBzdGF0aWNUeXBlcyA9CiAgICAgICAgc291cmNlLnJlYWRUcmVlTm9kZU1hcCgoKSA9PiBzb3VyY2UucmVhZERhcnRUeXBlTm9kZSgpKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgRnVuY3Rpb25EYXRhSW1wbChub2RlLCBmdW5jdGlvbk5vZGUsIGRlZmluaXRpb24sIHN0YXRpY1R5cGVzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKEpNZW1iZXJEYXRhS2luZC5mdW5jdGlvbik7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTWVtYmVyTm9kZShub2RlKTsKICAgIGRlZmluaXRpb24ud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay53cml0ZVRyZWVOb2RlTWFwKHN0YXRpY1R5cGVzLCBzaW5rLndyaXRlRGFydFR5cGVOb2RlKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBGdW5jdGlvblR5cGUgZ2V0RnVuY3Rpb25UeXBlKGNvdmFyaWFudCBKc0tlcm5lbFRvRWxlbWVudE1hcCBlbGVtZW50TWFwKSB7CiAgICByZXR1cm4gX3R5cGUgPz89IGVsZW1lbnRNYXAuZ2V0RnVuY3Rpb25UeXBlKGZ1bmN0aW9uTm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc1R5cGVWYXJpYWJsZUFjY2VzcyBnZXQgY2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgewogICAgaWYgKG5vZGUuaXNJbnN0YW5jZU1lbWJlcikgcmV0dXJuIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzLnByb3BlcnR5OwogICAgcmV0dXJuIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzLm5vbmU7CiAgfQp9CgpjbGFzcyBTaWduYXR1cmVGdW5jdGlvbkRhdGEgaW1wbGVtZW50cyBGdW5jdGlvbkRhdGEgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbU2lnbmF0dXJlRnVuY3Rpb25EYXRhXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ3NpZ25hdHVyZS1mdW5jdGlvbi1kYXRhJzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgTWVtYmVyRGVmaW5pdGlvbiBkZWZpbml0aW9uOwogIGZpbmFsIEludGVyZmFjZVR5cGUgbWVtYmVyVGhpc1R5cGU7CiAgQG92ZXJyaWRlCiAgZmluYWwgQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgY2xhc3NUeXBlVmFyaWFibGVBY2Nlc3M7CiAgZmluYWwgTGlzdDxpci5UeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyczsKCiAgU2lnbmF0dXJlRnVuY3Rpb25EYXRhKHRoaXMuZGVmaW5pdGlvbiwgdGhpcy5tZW1iZXJUaGlzVHlwZSwKICAgICAgdGhpcy50eXBlUGFyYW1ldGVycywgdGhpcy5jbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcyk7CgogIGZhY3RvcnkgU2lnbmF0dXJlRnVuY3Rpb25EYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24gPQogICAgICAgIG5ldyBNZW1iZXJEZWZpbml0aW9uLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgSW50ZXJmYWNlVHlwZSBtZW1iZXJUaGlzVHlwZSA9IHNvdXJjZS5yZWFkRGFydFR5cGUoYWxsb3dOdWxsOiB0cnVlKTsKICAgIExpc3Q8aXIuVHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPSBzb3VyY2UucmVhZFR5cGVQYXJhbWV0ZXJOb2RlcygpOwogICAgQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgY2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgPQogICAgICAgIHNvdXJjZS5yZWFkRW51bShDbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcy52YWx1ZXMpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBTaWduYXR1cmVGdW5jdGlvbkRhdGEoCiAgICAgICAgZGVmaW5pdGlvbiwgbWVtYmVyVGhpc1R5cGUsIHR5cGVQYXJhbWV0ZXJzLCBjbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShKTWVtYmVyRGF0YUtpbmQuc2lnbmF0dXJlKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIGRlZmluaXRpb24ud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay53cml0ZURhcnRUeXBlKG1lbWJlclRoaXNUeXBlLCBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZVR5cGVQYXJhbWV0ZXJOb2Rlcyh0eXBlUGFyYW1ldGVycyk7CiAgICBzaW5rLndyaXRlRW51bShjbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcyk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWFwPGlyLkV4cHJlc3Npb24sIGlyLkRhcnRUeXBlPiBnZXQgc3RhdGljVHlwZXMgPT4gY29uc3Qge307CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uVHlwZSBnZXRGdW5jdGlvblR5cGUoY292YXJpYW50IEpzS2VybmVsVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJTaWduYXR1cmVGdW5jdGlvbkRhdGEuZ2V0RnVuY3Rpb25UeXBlIik7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PFR5cGVWYXJpYWJsZVR5cGU+IGdldEZ1bmN0aW9uVHlwZVZhcmlhYmxlcyhJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwKSB7CiAgICByZXR1cm4gdHlwZVBhcmFtZXRlcnMKICAgICAgICAubWFwPFR5cGVWYXJpYWJsZVR5cGU+KChpci5UeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIpIHsKICAgICAgcmV0dXJuIGVsZW1lbnRNYXAuZ2V0RGFydFR5cGUobmV3IGlyLlR5cGVQYXJhbWV0ZXJUeXBlKHR5cGVQYXJhbWV0ZXIpKTsKICAgIH0pLnRvTGlzdCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoUGFyYW1ldGVyKAogICAgICBKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwLAogICAgICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlLAogICAgICB2b2lkIGYoRGFydFR5cGUgdHlwZSwgU3RyaW5nIG5hbWUsIENvbnN0YW50VmFsdWUgZGVmYXVsdFZhbHVlKSwKICAgICAge2Jvb2wgaXNOYXRpdmU6IGZhbHNlfSkgewogICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcignU2lnbmF0dXJlRGF0YS5mb3JFYWNoUGFyYW1ldGVyJyk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldE1lbWJlclRoaXNUeXBlKEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApIHsKICAgIHJldHVybiBtZW1iZXJUaGlzVHlwZTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIERlbGVnYXRlZEZ1bmN0aW9uRGF0YSBpbXBsZW1lbnRzIEZ1bmN0aW9uRGF0YSB7CiAgZmluYWwgRnVuY3Rpb25EYXRhIGJhc2VEYXRhOwoKICBEZWxlZ2F0ZWRGdW5jdGlvbkRhdGEodGhpcy5iYXNlRGF0YSk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uVHlwZSBnZXRGdW5jdGlvblR5cGUoY292YXJpYW50IEpzS2VybmVsVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApIHsKICAgIHJldHVybiBiYXNlRGF0YS5nZXRGdW5jdGlvblR5cGUoZWxlbWVudE1hcCk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PFR5cGVWYXJpYWJsZVR5cGU+IGdldEZ1bmN0aW9uVHlwZVZhcmlhYmxlcyhJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwKSB7CiAgICByZXR1cm4gYmFzZURhdGEuZ2V0RnVuY3Rpb25UeXBlVmFyaWFibGVzKGVsZW1lbnRNYXApOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoUGFyYW1ldGVyKAogICAgICBKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwLAogICAgICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlLAogICAgICB2b2lkIGYoRGFydFR5cGUgdHlwZSwgU3RyaW5nIG5hbWUsIENvbnN0YW50VmFsdWUgZGVmYXVsdFZhbHVlKSwKICAgICAge2Jvb2wgaXNOYXRpdmU6IGZhbHNlfSkgewogICAgcmV0dXJuIGJhc2VEYXRhLmZvckVhY2hQYXJhbWV0ZXIoZWxlbWVudE1hcCwgcGFyYW1ldGVyU3RydWN0dXJlLCBmLAogICAgICAgIGlzTmF0aXZlOiBpc05hdGl2ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldE1lbWJlclRoaXNUeXBlKEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApIHsKICAgIHJldHVybiBiYXNlRGF0YS5nZXRNZW1iZXJUaGlzVHlwZShlbGVtZW50TWFwKTsKICB9CgogIEBvdmVycmlkZQogIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzIGdldCBjbGFzc1R5cGVWYXJpYWJsZUFjY2VzcyA9PgogICAgICBiYXNlRGF0YS5jbGFzc1R5cGVWYXJpYWJsZUFjY2VzczsKfQoKY2xhc3MgR2VuZXJhdG9yQm9keUZ1bmN0aW9uRGF0YSBleHRlbmRzIERlbGVnYXRlZEZ1bmN0aW9uRGF0YSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtHZW5lcmF0b3JCb2R5RnVuY3Rpb25EYXRhXSBvYmplY3RzIGluCiAgLy8vIGEgZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2dlbmVyYXRvci1ib2R5LWRhdGEnOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb247CgogIEdlbmVyYXRvckJvZHlGdW5jdGlvbkRhdGEoRnVuY3Rpb25EYXRhIGJhc2VEYXRhLCB0aGlzLmRlZmluaXRpb24pCiAgICAgIDogc3VwZXIoYmFzZURhdGEpOwoKICBmYWN0b3J5IEdlbmVyYXRvckJvZHlGdW5jdGlvbkRhdGEucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFNoYXJlIHRoZSBvcmlnaW5hbCBiYXNlIGRhdGEgb24gZGVzZXJpYWxpemF0aW9uLgogICAgRnVuY3Rpb25EYXRhIGJhc2VEYXRhID0gbmV3IEpNZW1iZXJEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgTWVtYmVyRGVmaW5pdGlvbiBkZWZpbml0aW9uID0KICAgICAgICBuZXcgTWVtYmVyRGVmaW5pdGlvbi5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgR2VuZXJhdG9yQm9keUZ1bmN0aW9uRGF0YShiYXNlRGF0YSwgZGVmaW5pdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShKTWVtYmVyRGF0YUtpbmQuZ2VuZXJhdG9yQm9keSk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBiYXNlRGF0YS53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBkZWZpbml0aW9uLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBNYXA8aXIuRXhwcmVzc2lvbiwgaXIuRGFydFR5cGU+IGdldCBzdGF0aWNUeXBlcyA9PiBjb25zdCB7fTsKfQoKYWJzdHJhY3QgY2xhc3MgSkNvbnN0cnVjdG9yRGF0YSBleHRlbmRzIEZ1bmN0aW9uRGF0YSB7CiAgQ29uc3RhbnRDb25zdHJ1Y3RvciBnZXRDb25zdHJ1Y3RvckNvbnN0YW50KAogICAgICBKc0tlcm5lbFRvRWxlbWVudE1hcCBlbGVtZW50TWFwLCBDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3Rvcik7Cn0KCmNsYXNzIEpDb25zdHJ1Y3RvckRhdGFJbXBsIGV4dGVuZHMgRnVuY3Rpb25EYXRhSW1wbAogICAgaW1wbGVtZW50cyBKQ29uc3RydWN0b3JEYXRhIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0pDb25zdHJ1Y3RvckRhdGFJbXBsXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2NvbnN0cnVjdG9yLWRhdGEnOwoKICBDb25zdGFudENvbnN0cnVjdG9yIF9jb25zdGFudENvbnN0cnVjdG9yOwogIEpDb25zdHJ1Y3RvckJvZHkgY29uc3RydWN0b3JCb2R5OwoKICBKQ29uc3RydWN0b3JEYXRhSW1wbChpci5NZW1iZXIgbm9kZSwgaXIuRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uTm9kZSwKICAgICAgTWVtYmVyRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBNYXA8aXIuRXhwcmVzc2lvbiwgaXIuRGFydFR5cGU+IHN0YXRpY1R5cGVzKQogICAgICA6IHN1cGVyKG5vZGUsIGZ1bmN0aW9uTm9kZSwgZGVmaW5pdGlvbiwgc3RhdGljVHlwZXMpOwoKICBmYWN0b3J5IEpDb25zdHJ1Y3RvckRhdGFJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5NZW1iZXIgbm9kZSA9IHNvdXJjZS5yZWFkTWVtYmVyTm9kZSgpOwogICAgaXIuRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uTm9kZTsKICAgIGlmIChub2RlIGlzIGlyLlByb2NlZHVyZSkgewogICAgICBmdW5jdGlvbk5vZGUgPSBub2RlLmZ1bmN0aW9uOwogICAgfSBlbHNlIGlmIChub2RlIGlzIGlyLkNvbnN0cnVjdG9yKSB7CiAgICAgIGZ1bmN0aW9uTm9kZSA9IG5vZGUuZnVuY3Rpb247CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICJVbmV4cGVjdGVkIG1lbWJlciBub2RlICRub2RlICgke25vZGUucnVudGltZVR5cGV9KS4iKTsKICAgIH0KICAgIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiA9CiAgICAgICAgbmV3IE1lbWJlckRlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBNYXA8aXIuRXhwcmVzc2lvbiwgaXIuRGFydFR5cGU+IHN0YXRpY1R5cGVzID0KICAgICAgICBzb3VyY2UucmVhZFRyZWVOb2RlTWFwKCgpID0+IHNvdXJjZS5yZWFkRGFydFR5cGVOb2RlKCkpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBKQ29uc3RydWN0b3JEYXRhSW1wbCgKICAgICAgICBub2RlLCBmdW5jdGlvbk5vZGUsIGRlZmluaXRpb24sIHN0YXRpY1R5cGVzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKEpNZW1iZXJEYXRhS2luZC5jb25zdHJ1Y3Rvcik7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTWVtYmVyTm9kZShub2RlKTsKICAgIGRlZmluaXRpb24ud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgYXNzZXJ0KGNvbnN0cnVjdG9yQm9keSA9PSBudWxsKTsKICAgIHNpbmsud3JpdGVUcmVlTm9kZU1hcChzdGF0aWNUeXBlcywgc2luay53cml0ZURhcnRUeXBlTm9kZSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRDb25zdHJ1Y3RvciBnZXRDb25zdHJ1Y3RvckNvbnN0YW50KAogICAgICBKc0tlcm5lbFRvRWxlbWVudE1hcCBlbGVtZW50TWFwLCBDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvcikgewogICAgaWYgKF9jb25zdGFudENvbnN0cnVjdG9yID09IG51bGwpIHsKICAgICAgaWYgKG5vZGUgaXMgaXIuQ29uc3RydWN0b3IgJiYgY29uc3RydWN0b3IuaXNDb25zdCkgewogICAgICAgIF9jb25zdGFudENvbnN0cnVjdG9yID0KICAgICAgICAgICAgbmV3IENvbnN0YW50aWZpZXIoZWxlbWVudE1hcCkuY29tcHV0ZUNvbnN0YW50Q29uc3RydWN0b3Iobm9kZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIGNvbnN0cnVjdG9yLAogICAgICAgICAgICAiVW5leHBlY3RlZCBjb25zdHJ1Y3RvciAkY29uc3RydWN0b3IgaW4gIgogICAgICAgICAgICAiQ29uc3RydWN0b3JEYXRhSW1wbC5fZ2V0Q29uc3RydWN0b3JDb25zdGFudCIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gX2NvbnN0YW50Q29uc3RydWN0b3I7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc1R5cGVWYXJpYWJsZUFjY2VzcyBnZXQgY2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgPT4KICAgICAgQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MucGFyYW1ldGVyOwp9CgpjbGFzcyBDb25zdHJ1Y3RvckJvZHlEYXRhSW1wbCBleHRlbmRzIEZ1bmN0aW9uRGF0YUltcGwgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbQ29uc3RydWN0b3JCb2R5RGF0YUltcGxdIG9iamVjdHMgaW4KICAvLy8gYSBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnY29uc3RydWN0b3ItYm9keS1kYXRhJzsKCiAgQ29uc3RydWN0b3JCb2R5RGF0YUltcGwoaXIuTWVtYmVyIG5vZGUsIGlyLkZ1bmN0aW9uTm9kZSBmdW5jdGlvbk5vZGUsCiAgICAgIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiwgTWFwPGlyLkV4cHJlc3Npb24sIGlyLkRhcnRUeXBlPiBzdGF0aWNUeXBlcykKICAgICAgOiBzdXBlcihub2RlLCBmdW5jdGlvbk5vZGUsIGRlZmluaXRpb24sIHN0YXRpY1R5cGVzKTsKCiAgZmFjdG9yeSBDb25zdHJ1Y3RvckJvZHlEYXRhSW1wbC5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgaXIuTWVtYmVyIG5vZGUgPSBzb3VyY2UucmVhZE1lbWJlck5vZGUoKTsKICAgIGlyLkZ1bmN0aW9uTm9kZSBmdW5jdGlvbk5vZGU7CiAgICBpZiAobm9kZSBpcyBpci5Qcm9jZWR1cmUpIHsKICAgICAgZnVuY3Rpb25Ob2RlID0gbm9kZS5mdW5jdGlvbjsKICAgIH0gZWxzZSBpZiAobm9kZSBpcyBpci5Db25zdHJ1Y3RvcikgewogICAgICBmdW5jdGlvbk5vZGUgPSBub2RlLmZ1bmN0aW9uOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAiVW5leHBlY3RlZCBtZW1iZXIgbm9kZSAkbm9kZSAoJHtub2RlLnJ1bnRpbWVUeXBlfSkuIik7CiAgICB9CiAgICBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24gPQogICAgICAgIG5ldyBNZW1iZXJEZWZpbml0aW9uLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgTWFwPGlyLkV4cHJlc3Npb24sIGlyLkRhcnRUeXBlPiBzdGF0aWNUeXBlcyA9CiAgICAgICAgc291cmNlLnJlYWRUcmVlTm9kZU1hcCgoKSA9PiBzb3VyY2UucmVhZERhcnRUeXBlTm9kZSgpKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3JCb2R5RGF0YUltcGwoCiAgICAgICAgbm9kZSwgZnVuY3Rpb25Ob2RlLCBkZWZpbml0aW9uLCBzdGF0aWNUeXBlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShKTWVtYmVyRGF0YUtpbmQuY29uc3RydWN0b3JCb2R5KTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVNZW1iZXJOb2RlKG5vZGUpOwogICAgZGVmaW5pdGlvbi53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLndyaXRlVHJlZU5vZGVNYXAoc3RhdGljVHlwZXMsIHNpbmsud3JpdGVEYXJ0VHlwZU5vZGUpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIC8vIFRPRE8oam9obm5pd2ludGhlcixzcmEpOiBDb25zdHJ1Y3RvciBib2RpZXMgc2hvdWxkIGFjY2VzcyB0eXBlIHZhcmlhYmxlcwogIC8vIHRocm91Z2ggYHRoaXNgLgogIEBvdmVycmlkZQogIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzIGdldCBjbGFzc1R5cGVWYXJpYWJsZUFjY2VzcyA9PgogICAgICBDbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcy5wYXJhbWV0ZXI7Cn0KCmFic3RyYWN0IGNsYXNzIEpGaWVsZERhdGEgZXh0ZW5kcyBKTWVtYmVyRGF0YSB7CiAgRGFydFR5cGUgZ2V0RmllbGRUeXBlKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApOwoKICBDb25zdGFudEV4cHJlc3Npb24gZ2V0RmllbGRDb25zdGFudEV4cHJlc3Npb24oCiAgICAgIEpzS2VybmVsVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApOwp9CgpjbGFzcyBKRmllbGREYXRhSW1wbCBleHRlbmRzIEpNZW1iZXJEYXRhSW1wbCBpbXBsZW1lbnRzIEpGaWVsZERhdGEgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbSkZpZWxkRGF0YUltcGxdIG9iamVjdHMgaW4KICAvLy8gYSBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnZmllbGQtZGF0YSc7CgogIERhcnRUeXBlIF90eXBlOwogIENvbnN0YW50RXhwcmVzc2lvbiBfY29uc3RhbnRFeHByZXNzaW9uOwoKICBKRmllbGREYXRhSW1wbChpci5GaWVsZCBub2RlLCBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24sCiAgICAgIE1hcDxpci5FeHByZXNzaW9uLCBpci5EYXJ0VHlwZT4gc3RhdGljVHlwZXMpCiAgICAgIDogc3VwZXIobm9kZSwgZGVmaW5pdGlvbiwgc3RhdGljVHlwZXMpOwoKICBmYWN0b3J5IEpGaWVsZERhdGFJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5NZW1iZXIgbm9kZSA9IHNvdXJjZS5yZWFkTWVtYmVyTm9kZSgpOwogICAgTWVtYmVyRGVmaW5pdGlvbiBkZWZpbml0aW9uID0KICAgICAgICBuZXcgTWVtYmVyRGVmaW5pdGlvbi5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgIE1hcDxpci5FeHByZXNzaW9uLCBpci5EYXJ0VHlwZT4gc3RhdGljVHlwZXMgPQogICAgICAgIHNvdXJjZS5yZWFkVHJlZU5vZGVNYXAoKCkgPT4gc291cmNlLnJlYWREYXJ0VHlwZU5vZGUoKSk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEpGaWVsZERhdGFJbXBsKG5vZGUsIGRlZmluaXRpb24sIHN0YXRpY1R5cGVzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKEpNZW1iZXJEYXRhS2luZC5maWVsZCk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTWVtYmVyTm9kZShub2RlKTsKICAgIGRlZmluaXRpb24ud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay53cml0ZVRyZWVOb2RlTWFwKHN0YXRpY1R5cGVzLCBzaW5rLndyaXRlRGFydFR5cGVOb2RlKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5GaWVsZCBnZXQgbm9kZSA9PiBzdXBlci5ub2RlOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRGaWVsZFR5cGUoY292YXJpYW50IEpzS2VybmVsVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApIHsKICAgIHJldHVybiBfdHlwZSA/Pz0gZWxlbWVudE1hcC5nZXREYXJ0VHlwZShub2RlLnR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIGdldEZpZWxkQ29uc3RhbnRFeHByZXNzaW9uKAogICAgICBKc0tlcm5lbFRvRWxlbWVudE1hcCBlbGVtZW50TWFwKSB7CiAgICBpZiAoX2NvbnN0YW50RXhwcmVzc2lvbiA9PSBudWxsKSB7CiAgICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgICBfY29uc3RhbnRFeHByZXNzaW9uID0KICAgICAgICAgICAgbmV3IENvbnN0YW50aWZpZXIoZWxlbWVudE1hcCkudmlzaXQobm9kZS5pbml0aWFsaXplcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIGRlZmluaXRpb24ubG9jYXRpb24sCiAgICAgICAgICAgICJVbmV4cGVjdGVkIGZpZWxkICR7ZGVmaW5pdGlvbn0gaW4gIgogICAgICAgICAgICAiRmllbGREYXRhSW1wbC5nZXRGaWVsZENvbnN0YW50Iik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfY29uc3RhbnRFeHByZXNzaW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgZ2V0IGNsYXNzVHlwZVZhcmlhYmxlQWNjZXNzIHsKICAgIGlmIChub2RlLmlzSW5zdGFuY2VNZW1iZXIpIHJldHVybiBDbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcy5pbnN0YW5jZUZpZWxkOwogICAgcmV0dXJuIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzLm5vbmU7CiAgfQp9CgpjbGFzcyBKVHlwZWRlZkRhdGEgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbSlR5cGVkZWZEYXRhXSBvYmplY3RzIGluCiAgLy8vIGEgZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ3R5cGVkZWYtZGF0YSc7CgogIGZpbmFsIGlyLlR5cGVkZWYgbm9kZTsKICBmaW5hbCBUeXBlZGVmVHlwZSByYXdUeXBlOwoKICBKVHlwZWRlZkRhdGEodGhpcy5ub2RlLCB0aGlzLnJhd1R5cGUpOwoKICBmYWN0b3J5IEpUeXBlZGVmRGF0YS5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgaXIuVHlwZWRlZiBub2RlID0gc291cmNlLnJlYWRUeXBlZGVmTm9kZSgpOwogICAgVHlwZWRlZlR5cGUgcmF3VHlwZSA9IHNvdXJjZS5yZWFkRGFydFR5cGUoKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgSlR5cGVkZWZEYXRhKG5vZGUsIHJhd1R5cGUpOwogIH0KCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZVR5cGVkZWZOb2RlKG5vZGUpOwogICAgc2luay53cml0ZURhcnRUeXBlKHJhd1R5cGUpOwogICAgc2luay5lbmQodGFnKTsKICB9Cn0KCmNsYXNzIEpUeXBlVmFyaWFibGVEYXRhIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0pUeXBlVmFyaWFibGVEYXRhXSBvYmplY3RzIGluCiAgLy8vIGEgZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ3R5cGUtdmFyaWFibGUtZGF0YSc7CgogIGZpbmFsIGlyLlR5cGVQYXJhbWV0ZXIgbm9kZTsKICBEYXJ0VHlwZSBfYm91bmQ7CiAgRGFydFR5cGUgX2RlZmF1bHRUeXBlOwoKICBKVHlwZVZhcmlhYmxlRGF0YSh0aGlzLm5vZGUpOwoKICBmYWN0b3J5IEpUeXBlVmFyaWFibGVEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5UeXBlUGFyYW1ldGVyIG5vZGUgPSBzb3VyY2UucmVhZFR5cGVQYXJhbWV0ZXJOb2RlKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEpUeXBlVmFyaWFibGVEYXRhKG5vZGUpOwogIH0KCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZVR5cGVQYXJhbWV0ZXJOb2RlKG5vZGUpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIERhcnRUeXBlIGdldEJvdW5kKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApIHsKICAgIHJldHVybiBfYm91bmQgPz89IGVsZW1lbnRNYXAuZ2V0RGFydFR5cGUobm9kZS5ib3VuZCk7CiAgfQoKICBEYXJ0VHlwZSBnZXREZWZhdWx0VHlwZShJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwKSB7CiAgICByZXR1cm4gX2RlZmF1bHRUeXBlID8/PSBlbGVtZW50TWFwLmdldERhcnRUeXBlKG5vZGUuZGVmYXVsdFR5cGUpOwogIH0KfQqESABOTjwBHgEoARkpKCMkIyEhHiciLiMXGyAYATgULDABIQFCPQE3ASouBAFJJx0EATY1IwQBOxMfBAIBQBRFHSsBHC8rKwE/ATk+FzMnNSc1FTsEAS8oFSQ7OxMEATggBAFAJxwEATAtIQQBQT45BAExIjIkEw82CAYEAgEVRh0sARxQQzkBLAE/FzMoNRsULiYzNwgGFS8EASgVJBsYDSUVQC0eICQKEQgGEwQCAUctAR0bNzxAFB89Ij8hOQZDBAEtJwE1FAE5JgFQDSQBUEsQRB0BKk4BSk8BLxtJAUsNSgIBMitDHSkBDBYwKys7DCYBMTQBQUUBQBcrLDUnNSc1ODYVUSIEAQwoKBUeQDs7JS0TBAEMPgEMRB5FQQQBDE8qJwgEAQxQM1AEAQwbSj0xCAQBQzgvBAEMSyYEAgEnQx0qAS8BHgE8Fyw5FSYEAQwoKhUZSRMEAQxLOwQBDBtKNQQBDFA1EQQBDE8iBAEMRB4dBAEMLwEMLQEMHAIBKkkdMQFLAUIXLDkVLAQBDCgrFRlJEwQBDEQeEicTBkEEAgFILgEcOD1CFCA+I0AiPwZDBAEuJwEiAR4dHyEmJRkBGB8CAS1IHSoBFgwkDBsjAQwaDBkMGwwdDCIMIQEtAUEXK1EVMAQBDCgpFR4mEwQBDDUBDCECAUkXDAkPEw0RExACAR0jAT4BNwEzAREBOT5EFCVAIj4oRCxHJkUqSSxDKUAGRAQBLycCATgYAQwlAQw1AUEBDD82LRc9BhEEAgE1OwFOARkhLUYfAgFIJCkBDDMzIjE1DzIoJzw3ETdIHkcXCggGGwQCAUskAQwZIS1GIFE5HyIYKEgRMgoIIwYBTE8XPAglBAIBL0seSh0tAQwmFgE2UC4BQxcuIiAkKSQNIkIGIjkyQRVOBAEMKC4VICZAEwQBDEw/BAEMOEgpBAIBNk8dNwEMJSYMOS8BPjoBSBciOUlNNjkVJk4EAQwoLxUmOTItEwQBDD8BDExJBAEMTxpCThEEAQwZIS1GIEQEAQw/GwQCAT8fASgBDEwxBAEMTzoEAQwZIS1GIEgdBAEMPzMEAQw5KAIBQFEfMwEMJQFEGQFMF01IIjkVQAQBDCgzFSQmEwQBDD8CATcuRwIBNCJOHTABLCQBRVA8AUcXLiIgJCkkDSJCBiI5MkEVJTYEAQwoMRUgJiVAEwQBDC5IKDsfTA8SGTY8CAYhBAEMOSkCATlPHzUBSFA8AUoXLiIgJCkkDSJCBiI5MkEVKDYEAQwoNRUgJkATBAFOFQw5KQIBMDQBMSgCAUVGHyoBEioBPTMuAUEXLiI5MkEVPgQBDCgrFSAmQBMEAQwjAQxFOAQBDDEpJxoeQw8SITEvCAYgBAEMOE0pBAIBFUQfLAEZHQEpAT8XMDEVLAQBKBUhIRMEAgEaSR8yAR8TGQEgAUQXPBUoBAEoFScTBAExOgQBN0YEAgEmcGFja2FnZTpjb21waWxlci9zcmMvanNfbW9kZWwvZW52LmRhcnQ3c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfbW9kZWwvZWxlbWVudF9tYXAuZGFydMAAViYvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JyBzaG93IEpDb21tb25FbGVtZW50cywgSkVsZW1lbnRFbnZpcm9ubWVudDsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9qdW1wcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9uYW1lcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci9hYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydCc7CmltcG9ydCAnLi4vaXIvY2xvc3VyZS5kYXJ0JzsKaW1wb3J0ICcuLi9pci9zdGF0aWNfdHlwZV9wcm92aWRlci5kYXJ0JzsKaW1wb3J0ICcuLi9pci91dGlsLmRhcnQnOwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIGFzIGpzOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmFtZXIuZGFydCc7CmltcG9ydCAnLi4vanNfZW1pdHRlci9jb2RlX2VtaXR0ZXJfdGFzay5kYXJ0JzsKaW1wb3J0ICcuLi9qc19tb2RlbC9jbG9zdXJlLmRhcnQnIHNob3cgSlJlY29yZEZpZWxkOwppbXBvcnQgJy4uL2pzX21vZGVsL2VsZW1lbnRzLmRhcnQnIHNob3cgSkdlbmVyYXRvckJvZHk7CmltcG9ydCAnLi4vbmF0aXZlL2JlaGF2aW9yLmRhcnQnOwppbXBvcnQgJy4uL3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi9zc2EvdHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NhbGxfc3RydWN0dXJlLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnOwppbXBvcnQgJy4uL3dvcmxkLmRhcnQnOwppbXBvcnQgJ2Nsb3N1cmUuZGFydCc7CgovLy8gSW50ZXJmYWNlIHRoYXQgdHJhbnNsYXRlcyBiZXR3ZWVuIEtlcm5lbCBJUiBub2RlcyBhbmQgZW50aXRpZXMgdXNlZCBmb3IKLy8vIGdsb2JhbCB0eXBlIGluZmVyZW5jZSBhbmQgYnVpbGRpbmcgdGhlIFNTQSBncmFwaCBmb3IgbWVtYmVycy4KYWJzdHJhY3QgY2xhc3MgSnNUb0VsZW1lbnRNYXAgewogIC8vLyBBY2Nlc3MgdG8gdGhlIGNvbW1vbmx5IHVzZWQgZWxlbWVudHMgYW5kIHR5cGVzLgogIEpDb21tb25FbGVtZW50cyBnZXQgY29tbW9uRWxlbWVudHM7CgogIC8vLyBBY2Nlc3MgdG8gdGhlIFtEYXJ0VHlwZXNdIG9iamVjdC4KICBEYXJ0VHlwZXMgZ2V0IHR5cGVzOwoKICAvLy8gUmV0dXJucyB0aGUgW0RhcnRUeXBlXSBjb3JyZXNwb25kaW5nIHRvIFt0eXBlXS4KICBEYXJ0VHlwZSBnZXREYXJ0VHlwZShpci5EYXJ0VHlwZSB0eXBlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtJbnRlcmZhY2VUeXBlXSBjb3JyZXNwb25kaW5nIHRvIFt0eXBlXS4KICBJbnRlcmZhY2VUeXBlIGdldEludGVyZmFjZVR5cGUoaXIuSW50ZXJmYWNlVHlwZSB0eXBlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtUeXBlVmFyaWFibGVUeXBlXSBjb3JyZXNwb25kaW5nIHRvIFt0eXBlXS4KICBUeXBlVmFyaWFibGVUeXBlIGdldFR5cGVWYXJpYWJsZVR5cGUoaXIuVHlwZVBhcmFtZXRlclR5cGUgdHlwZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbRnVuY3Rpb25UeXBlXSBvZiB0aGUgW25vZGVdLgogIEZ1bmN0aW9uVHlwZSBnZXRGdW5jdGlvblR5cGUoaXIuRnVuY3Rpb25Ob2RlIG5vZGUpOwoKICAvLy8gUmV0dXJuIHRoZSBbSW50ZXJmYWNlVHlwZV0gY29ycmVzcG9uZGluZyB0byB0aGUgW2Nsc10gd2l0aCB0aGUgZ2l2ZW4KICAvLy8gW3R5cGVBcmd1bWVudHNdLgogIEludGVyZmFjZVR5cGUgY3JlYXRlSW50ZXJmYWNlVHlwZSgKICAgICAgaXIuQ2xhc3MgY2xzLCBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzKTsKCiAgLy8vIFJldHVybnMgdGhlIFtDYWxsU3RydWN0dXJlXSBjb3JyZXNwb25kaW5nIHRvIHRoZSBbYXJndW1lbnRzXS4KICBDYWxsU3RydWN0dXJlIGdldENhbGxTdHJ1Y3R1cmUoaXIuQXJndW1lbnRzIGFyZ3VtZW50cyk7CgogIC8vLyBSZXR1cm5zIHRoZSBbU2VsZWN0b3JdIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGludm9jYXRpb24gb3IgZ2V0dGVyL3NldHRlcgogIC8vLyBhY2Nlc3Mgb2YgW25vZGVdLgogIFNlbGVjdG9yIGdldFNlbGVjdG9yKGlyLkV4cHJlc3Npb24gbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbTWVtYmVyRW50aXR5XSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtZW1iZXIgW25vZGVdLgogIE1lbWJlckVudGl0eSBnZXRNZW1iZXIoaXIuTWVtYmVyIG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgW0Z1bmN0aW9uRW50aXR5XSBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9jZWR1cmUgW25vZGVdLgogIEZ1bmN0aW9uRW50aXR5IGdldE1ldGhvZChpci5Qcm9jZWR1cmUgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbQ29uc3RydWN0b3JFbnRpdHldIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdlbmVyYXRpdmUgb3IgZmFjdG9yeQogIC8vLyBjb25zdHJ1Y3RvciBbbm9kZV0uCiAgQ29uc3RydWN0b3JFbnRpdHkgZ2V0Q29uc3RydWN0b3IoaXIuTWVtYmVyIG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgW0ZpZWxkRW50aXR5XSBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaWVsZCBbbm9kZV0uCiAgRmllbGRFbnRpdHkgZ2V0RmllbGQoaXIuRmllbGQgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbQ2xhc3NFbnRpdHldIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNsYXNzIFtub2RlXS4KICBDbGFzc0VudGl0eSBnZXRDbGFzcyhpci5DbGFzcyBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtUeXBlZGVmVHlwZV0gY29ycmVzcG9uZGluZyB0byByYXcgdHlwZSBvZiB0aGUgdHlwZWRlZiBbbm9kZV0uCiAgVHlwZWRlZlR5cGUgZ2V0VHlwZWRlZlR5cGUoaXIuVHlwZWRlZiBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIHN1cGVyIFtNZW1iZXJFbnRpdHldIGZvciBhIHN1cGVyIGludm9jYXRpb24sIGdldCBvciBzZXQgb2YKICAvLy8gW25hbWVdIGZyb20gdGhlIG1lbWJlciBbY29udGV4dF0uCiAgTWVtYmVyRW50aXR5IGdldFN1cGVyTWVtYmVyKE1lbWJlckVudGl0eSBjb250ZXh0LCBpci5OYW1lIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2V9KTsKCiAgLy8vIFJldHVybnMgdGhlIGBub1N1Y2hNZXRob2RgIFtGdW5jdGlvbkVudGl0eV0gY2FsbCBmcm9tIGEKICAvLy8gYHN1cGVyLm5vU3VjaE1ldGhvZGAgaW52b2NhdGlvbiB3aXRoaW4gW2Nsc10uCiAgRnVuY3Rpb25FbnRpdHkgZ2V0U3VwZXJOb1N1Y2hNZXRob2QoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgdGhlIFtOYW1lXSBjb3JyZXNwb25kaW5nIHRvIFtuYW1lXS4KICBOYW1lIGdldE5hbWUoaXIuTmFtZSBuYW1lKTsKCiAgLy8vIENvbXB1dGVzIHRoZSBbbmF0aXZlLk5hdGl2ZUJlaGF2aW9yXSBmb3IgYSBjYWxsIHRvIHRoZSBbSlNdIGZ1bmN0aW9uLgogIE5hdGl2ZUJlaGF2aW9yIGdldE5hdGl2ZUJlaGF2aW9yRm9ySnNDYWxsKGlyLlN0YXRpY0ludm9jYXRpb24gbm9kZSk7CgogIC8vLyBDb21wdXRlcyB0aGUgW25hdGl2ZS5OYXRpdmVCZWhhdmlvcl0gZm9yIGEgY2FsbCB0byB0aGUgW0pTX0JVSUxUSU5dCiAgLy8vIGZ1bmN0aW9uLgogIE5hdGl2ZUJlaGF2aW9yIGdldE5hdGl2ZUJlaGF2aW9yRm9ySnNCdWlsdGluQ2FsbChpci5TdGF0aWNJbnZvY2F0aW9uIG5vZGUpOwoKICAvLy8gQ29tcHV0ZXMgdGhlIFtuYXRpdmUuTmF0aXZlQmVoYXZpb3JdIGZvciBhIGNhbGwgdG8gdGhlCiAgLy8vIFtKU19FTUJFRERFRF9HTE9CQUxdIGZ1bmN0aW9uLgogIE5hdGl2ZUJlaGF2aW9yIGdldE5hdGl2ZUJlaGF2aW9yRm9ySnNFbWJlZGRlZEdsb2JhbENhbGwoCiAgICAgIGlyLlN0YXRpY0ludm9jYXRpb24gbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbanMuTmFtZV0gZm9yIHRoZSBgSnNHZXROYW1lYCBbY29uc3RhbnRdIHZhbHVlLgogIGpzLk5hbWUgZ2V0TmFtZUZvckpzR2V0TmFtZShDb25zdGFudFZhbHVlIGNvbnN0YW50LCBOYW1lciBuYW1lcik7CgogIC8vLyBDb21wdXRlcyB0aGUgW0NvbnN0YW50VmFsdWVdIGZvciB0aGUgY29uc3RhbnQgW2V4cHJlc3Npb25dLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IE1vdmUgdG8gW0tlcm5lbFRvRWxlbWVudE1hcEZvckJ1aWxkaW5nXS4gVGhpcyBpcyBvbmx5CiAgLy8gdXNlZCBpbiBpbXBhY3QgYnVpbGRlciBmb3Igc3ltYm9sIGNvbnN0YW50cy4KICBDb25zdGFudFZhbHVlIGdldENvbnN0YW50VmFsdWUoaXIuRXhwcmVzc2lvbiBleHByZXNzaW9uLAogICAgICB7Ym9vbCByZXF1aXJlQ29uc3RhbnQ6IHRydWUsIGJvb2wgaW1wbGljaXROdWxsOiBmYWxzZX0pOwoKICAvLy8gUmV0dXJuIHRoZSBbSW1wb3J0RW50aXR5XSBjb3JyZXNwb25kaW5nIHRvIFtub2RlXS4KICBJbXBvcnRFbnRpdHkgZ2V0SW1wb3J0KGlyLkxpYnJhcnlEZXBlbmRlbmN5IG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgZGVmaW5pdGlvbiBpbmZvcm1hdGlvbiBmb3IgW2Nsc10uCiAgQ2xhc3NEZWZpbml0aW9uIGdldENsYXNzRGVmaW5pdGlvbihjb3ZhcmlhbnQgQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFtFbGVtZW50RW52aXJvbm1lbnRdIGZvciBsaWJyYXJ5LCBjbGFzcyBhbmQgbWVtYmVyIGxvb2t1cC4KICBKRWxlbWVudEVudmlyb25tZW50IGdldCBlbGVtZW50RW52aXJvbm1lbnQ7CgogIC8vLyBSZXR1cm5zIHRoZSBsaXN0IG9mIFtEYXJ0VHlwZV1zIGNvcnJlc3BvbmRpbmcgdG8gW3R5cGVzXS4KICBMaXN0PERhcnRUeXBlPiBnZXREYXJ0VHlwZXMoTGlzdDxpci5EYXJ0VHlwZT4gdHlwZXMpOwoKICAvLy8gUmV0dXJucyB0aGUgZGVmaW5pdGlvbiBpbmZvcm1hdGlvbiBmb3IgW21lbWJlcl0uCiAgTWVtYmVyRGVmaW5pdGlvbiBnZXRNZW1iZXJEZWZpbml0aW9uKGNvdmFyaWFudCBNZW1iZXJFbnRpdHkgbWVtYmVyKTsKCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgYHRoaXNgIGluIFttZW1iZXJdLCBvciBgbnVsbGAgaWYgbWVtYmVyIGlzIGRlZmluZWQgaW4KICAvLy8gYSBzdGF0aWMgY29udGV4dC4KICBJbnRlcmZhY2VUeXBlIGdldE1lbWJlclRoaXNUeXBlKGNvdmFyaWFudCBNZW1iZXJFbnRpdHkgbWVtYmVyKTsKCiAgLy8vIFJldHVybnMgaG93IFttZW1iZXJdIGhhcyBhY2Nlc3MgdG8gdHlwZSB2YXJpYWJsZXMgb2YgdGhlIHRoaXMgdHlwZQogIC8vLyByZXR1cm5lZCBieSBbZ2V0TWVtYmVyVGhpc1R5cGVdLgogIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzIGdldENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzRm9yTWVtYmVyKAogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyKTsKCiAgLy8vIFJldHVybnMgdGhlIFtMaWJyYXJ5RW50aXR5XSBjb3JyZXNwb25kaW5nIHRvIHRoZSBsaWJyYXJ5IFtub2RlXS4KICBMaWJyYXJ5RW50aXR5IGdldExpYnJhcnkoaXIuTGlicmFyeSBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtqcy5UZW1wbGF0ZV0gZm9yIHRoZSBgSnNCdWlsdGluYCBbY29uc3RhbnRdIHZhbHVlLgogIGpzLlRlbXBsYXRlIGdldEpzQnVpbHRpblRlbXBsYXRlKAogICAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50LCBDb2RlRW1pdHRlclRhc2sgZW1pdHRlcik7CgogIC8vLyBSZXR1cm5zIGEgW1NwYW5uYWJsZV0gZm9yIGEgbWVzc2FnZSBwb2ludGluZyB0byB0aGUgSVIgW25vZGVdIGluIHRoZQogIC8vLyBjb250ZXh0IG9mIFttZW1iZXJdLgogIFNwYW5uYWJsZSBnZXRTcGFubmFibGUoTWVtYmVyRW50aXR5IG1lbWJlciwgaXIuTm9kZSBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIGNvbnN0cnVjdG9yIGJvZHkgZW50aXR5IGNvcnJlc3BvbmRpbmcgdG8gW2NvbnN0cnVjdG9yXS4KICBGdW5jdGlvbkVudGl0eSBnZXRDb25zdHJ1Y3RvckJvZHkoaXIuQ29uc3RydWN0b3Igbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBjb25zdHJ1Y3RvciBib2R5IGVudGl0eSBjb3JyZXNwb25kaW5nIHRvIFtmdW5jdGlvbl0uCiAgSkdlbmVyYXRvckJvZHkgZ2V0R2VuZXJhdG9yQm9keShGdW5jdGlvbkVudGl0eSBmdW5jdGlvbik7CgogIC8vLyBNYWtlIGEgcmVjb3JkIHRvIGVuc3VyZSB2YXJpYWJsZXMgdGhhdCBhcmUgYXJlIGRlY2xhcmVkIGluIG9uZSBzY29wZSBhbmQKICAvLy8gbW9kaWZpZWQgaW4gYW5vdGhlciBnZXQgdGhlaXIgdmFsdWVzIHVwZGF0ZWQgY29ycmVjdGx5LgogIE1hcDxMb2NhbCwgSlJlY29yZEZpZWxkPiBtYWtlUmVjb3JkQ29udGFpbmVyKAogICAgICBLZXJuZWxTY29wZUluZm8gaW5mbywgTWVtYmVyRW50aXR5IG1lbWJlciwgS2VybmVsVG9Mb2NhbHNNYXAgbG9jYWxzTWFwKTsKCiAgLy8vIFJldHVybnMgYSBwcm92aWRlciBmb3Igc3RhdGljIHR5cGVzIGZvciBbbWVtYmVyXS4KICBTdGF0aWNUeXBlUHJvdmlkZXIgZ2V0U3RhdGljVHlwZVByb3ZpZGVyKE1lbWJlckVudGl0eSBtZW1iZXIpOwp9CgovLy8gSW50ZXJmYWNlIGZvciB0eXBlIGluZmVyZW5jZSByZXN1bHRzIGZvciBrZXJuZWwgSVIgbm9kZXMuCmFic3RyYWN0IGNsYXNzIEtlcm5lbFRvVHlwZUluZmVyZW5jZU1hcCB7CiAgLy8vIFJldHVybnMgdGhlIGluZmVycmVkIHJldHVybiB0eXBlIG9mIFtmdW5jdGlvbl0uCiAgQWJzdHJhY3RWYWx1ZSBnZXRSZXR1cm5UeXBlT2YoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pOwoKICAvLy8gUmV0dXJucyB0aGUgaW5mZXJyZWQgcmVjZWl2ZXIgdHlwZSBvZiB0aGUgZHluYW1pYyBbaW52b2NhdGlvbl0uCiAgQWJzdHJhY3RWYWx1ZSByZWNlaXZlclR5cGVPZkludm9jYXRpb24oCiAgICAgIGlyLk1ldGhvZEludm9jYXRpb24gaW52b2NhdGlvbiwgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluKTsKCiAgLy8vIFJldHVybnMgdGhlIGluZmVycmVkIHJlY2VpdmVyIHR5cGUgb2YgdGhlIGR5bmFtaWMgW3JlYWRdLgogIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXJUeXBlT2ZHZXQoaXIuUHJvcGVydHlHZXQgcmVhZCk7CgogIC8vLyBSZXR1cm5zIHRoZSBpbmZlcnJlZCByZWNlaXZlciB0eXBlIG9mIHRoZSBkaXJlY3QgW3JlYWRdLgogIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXJUeXBlT2ZEaXJlY3RHZXQoaXIuRGlyZWN0UHJvcGVydHlHZXQgcmVhZCk7CgogIC8vLyBSZXR1cm5zIHRoZSBpbmZlcnJlZCByZWNlaXZlciB0eXBlIG9mIHRoZSBkeW5hbWljIFt3cml0ZV0uCiAgQWJzdHJhY3RWYWx1ZSByZWNlaXZlclR5cGVPZlNldCgKICAgICAgaXIuUHJvcGVydHlTZXQgd3JpdGUsIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbik7CgogIC8vLyBSZXR1cm5zIHRoZSBpbmZlcnJlZCB0eXBlIG9mIFtsaXN0TGl0ZXJhbF0uCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZMaXN0TGl0ZXJhbCgKICAgICAgaXIuTGlzdExpdGVyYWwgbGlzdExpdGVyYWwsIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbik7CgogIC8vLyBSZXR1cm5zIHRoZSBpbmZlcnJlZCB0eXBlIG9mIGl0ZXJhdG9yIGluIFtmb3JJblN0YXRlbWVudF0uCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZJdGVyYXRvcihpci5Gb3JJblN0YXRlbWVudCBmb3JJblN0YXRlbWVudCk7CgogIC8vLyBSZXR1cm5zIHRoZSBpbmZlcnJlZCB0eXBlIG9mIGBjdXJyZW50YCBpbiBbZm9ySW5TdGF0ZW1lbnRdLgogIEFic3RyYWN0VmFsdWUgdHlwZU9mSXRlcmF0b3JDdXJyZW50KGlyLkZvckluU3RhdGVtZW50IGZvckluU3RhdGVtZW50KTsKCiAgLy8vIFJldHVybnMgdGhlIGluZmVycmVkIHR5cGUgb2YgYG1vdmVOZXh0YCBpbiBbZm9ySW5TdGF0ZW1lbnRdLgogIEFic3RyYWN0VmFsdWUgdHlwZU9mSXRlcmF0b3JNb3ZlTmV4dChpci5Gb3JJblN0YXRlbWVudCBmb3JJblN0YXRlbWVudCk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbZm9ySW5TdGF0ZW1lbnRdIGlzIGluZmVycmVkIHRvIGJlIGEgSmF2YVNjcmlwdAogIC8vLyBpbmRleGFibGUgaXRlcmF0b3IuCiAgYm9vbCBpc0pzSW5kZXhhYmxlSXRlcmF0b3IoaXIuRm9ySW5TdGF0ZW1lbnQgZm9ySW5TdGF0ZW1lbnQsCiAgICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbik7CgogIC8vLyBSZXR1cm5zIHRoZSBpbmZlcnJlZCBpbmRleCB0eXBlIG9mIFtmb3JJblN0YXRlbWVudF0uCiAgQWJzdHJhY3RWYWx1ZSBpbmZlcnJlZEluZGV4VHlwZShpci5Gb3JJblN0YXRlbWVudCBmb3JJblN0YXRlbWVudCk7CgogIC8vLyBSZXR1cm5zIHRoZSBpbmZlcnJlZCB0eXBlIG9mIFttZW1iZXJdLgogIEFic3RyYWN0VmFsdWUgZ2V0SW5mZXJyZWRUeXBlT2YoTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIC8vLyBSZXR1cm5zIHRoZSBpbmZlcnJlZCB0eXBlIG9mIHRoZSBbcGFyYW1ldGVyXS4KICBBYnN0cmFjdFZhbHVlIGdldEluZmVycmVkVHlwZU9mUGFyYW1ldGVyKExvY2FsIHBhcmFtZXRlcik7CgogIC8vLyBSZXR1cm5zIHRoZSBpbmZlcnJlZCB0eXBlIG9mIGEgZHluYW1pYyBbc2VsZWN0b3JdIGFjY2VzcyBvbiB0aGUKICAvLy8gW3JlY2VpdmVyXS4KICBBYnN0cmFjdFZhbHVlIHNlbGVjdG9yVHlwZU9mKFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyKTsKCiAgLy8vIFJldHVybnMgdGhlIHJldHVybmVkIHR5cGUgYW5ub3RhdGlvbiBpbiB0aGUgW25hdGl2ZUJlaGF2aW9yXS4KICBBYnN0cmFjdFZhbHVlIHR5cGVGcm9tTmF0aXZlQmVoYXZpb3IoCiAgICAgIE5hdGl2ZUJlaGF2aW9yIG5hdGl2ZUJlaGF2aW9yLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpOwp9CgovLy8gTWFwIGZyb20ga2VybmVsIElSIG5vZGVzIHRvIGxvY2FsIGVudGl0aWVzLgphYnN0cmFjdCBjbGFzcyBLZXJuZWxUb0xvY2Fsc01hcCB7CiAgLy8vIFRoZSBtZW1iZXIgY3VycmVudGx5IGJlaW5nIGJ1aWx0LgogIE1lbWJlckVudGl0eSBnZXQgY3VycmVudE1lbWJlcjsKCiAgLy8vIFJldHVybnMgdGhlIFtMb2NhbF0gZm9yIFtub2RlXS4KICBMb2NhbCBnZXRMb2NhbFZhcmlhYmxlKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSk7CgogIExvY2FsIGdldExvY2FsVHlwZVZhcmlhYmxlKAogICAgICBpci5UeXBlUGFyYW1ldGVyVHlwZSBub2RlLCBKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwKTsKCiAgLy8vIFJldHVybnMgdGhlIFtpci5GdW5jdGlvbk5vZGVdIHRoYXQgZGVjbGFyZWQgW3BhcmFtZXRlcl0uCiAgaXIuRnVuY3Rpb25Ob2RlIGdldEZ1bmN0aW9uTm9kZUZvclBhcmFtZXRlcihMb2NhbCBwYXJhbWV0ZXIpOwoKICAvLy8gUmV0dXJucyB0aGUgW0RhcnRUeXBlXSBvZiBbbG9jYWxdLgogIERhcnRUeXBlIGdldExvY2FsVHlwZShKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwLCBMb2NhbCBsb2NhbCk7CgogIC8vLyBSZXR1cm5zIHRoZSBbSnVtcFRhcmdldF0gZm9yIHRoZSBicmVhayBzdGF0ZW1lbnQgW25vZGVdLgogIEp1bXBUYXJnZXQgZ2V0SnVtcFRhcmdldEZvckJyZWFrKGlyLkJyZWFrU3RhdGVtZW50IG5vZGUpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW25vZGVdIHNob3VsZCBnZW5lcmF0ZSBhIGBjb250aW51ZWAgdG8gaXRzIFtKdW1wVGFyZ2V0XS4KICBib29sIGdlbmVyYXRlQ29udGludWVGb3JCcmVhayhpci5CcmVha1N0YXRlbWVudCBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtKdW1wVGFyZ2V0XSBkZWZpbmVkIGJ5IHRoZSBsYWJlbGxlZCBzdGF0ZW1lbnQgW25vZGVdIG9yCiAgLy8vIGBudWxsYCBpZiBbbm9kZV0gaXMgbm90IGEganVtcCB0YXJnZXQuCiAgSnVtcFRhcmdldCBnZXRKdW1wVGFyZ2V0Rm9yTGFiZWwoaXIuTGFiZWxlZFN0YXRlbWVudCBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtKdW1wVGFyZ2V0XSBkZWZpbmVkIGJ5IHRoZSBzd2l0Y2ggc3RhdGVtZW50IFtub2RlXSBvciBgbnVsbGAKICAvLy8gaWYgW25vZGVdIGlzIG5vdCBhIGp1bXAgdGFyZ2V0LgogIEp1bXBUYXJnZXQgZ2V0SnVtcFRhcmdldEZvclN3aXRjaChpci5Td2l0Y2hTdGF0ZW1lbnQgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbSnVtcFRhcmdldF0gZm9yIHRoZSBjb250aW51ZSBzd2l0Y2ggc3RhdGVtZW50IFtub2RlXS4KICBKdW1wVGFyZ2V0IGdldEp1bXBUYXJnZXRGb3JDb250aW51ZVN3aXRjaChpci5Db250aW51ZVN3aXRjaFN0YXRlbWVudCBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtKdW1wVGFyZ2V0XSBkZWZpbmVkIGJ5IHRoZSBzd2l0Y2ggY2FzZSBbbm9kZV0gb3IgYG51bGxgCiAgLy8vIGlmIFtub2RlXSBpcyBub3QgYSBqdW1wIHRhcmdldC4KICBKdW1wVGFyZ2V0IGdldEp1bXBUYXJnZXRGb3JTd2l0Y2hDYXNlKGlyLlN3aXRjaENhc2Ugbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbSnVtcFRhcmdldF0gZGVmaW5lZCB0aGUgZG8gc3RhdGVtZW50IFtub2RlXSBvciBgbnVsbGAKICAvLy8gaWYgW25vZGVdIGlzIG5vdCBhIGp1bXAgdGFyZ2V0LgogIEp1bXBUYXJnZXQgZ2V0SnVtcFRhcmdldEZvckRvKGlyLkRvU3RhdGVtZW50IG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgW0p1bXBUYXJnZXRdIGRlZmluZWQgYnkgdGhlIGZvciBzdGF0ZW1lbnQgW25vZGVdIG9yIGBudWxsYAogIC8vLyBpZiBbbm9kZV0gaXMgbm90IGEganVtcCB0YXJnZXQuCiAgSnVtcFRhcmdldCBnZXRKdW1wVGFyZ2V0Rm9yRm9yKGlyLkZvclN0YXRlbWVudCBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtKdW1wVGFyZ2V0XSBkZWZpbmVkIGJ5IHRoZSBmb3ItaW4gc3RhdGVtZW50IFtub2RlXSBvciBgbnVsbGAKICAvLy8gaWYgW25vZGVdIGlzIG5vdCBhIGp1bXAgdGFyZ2V0LgogIEp1bXBUYXJnZXQgZ2V0SnVtcFRhcmdldEZvckZvckluKGlyLkZvckluU3RhdGVtZW50IG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgW0p1bXBUYXJnZXRdIGRlZmluZWQgYnkgdGhlIHdoaWxlIHN0YXRlbWVudCBbbm9kZV0gb3IgYG51bGxgCiAgLy8vIGlmIFtub2RlXSBpcyBub3QgYSBqdW1wIHRhcmdldC4KICBKdW1wVGFyZ2V0IGdldEp1bXBUYXJnZXRGb3JXaGlsZShpci5XaGlsZVN0YXRlbWVudCBub2RlKTsKCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbS2VybmVsVG9Mb2NhbHNNYXBdIHRvIFtzaW5rXS4KICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKTsKfQoKLy8vIFJldHVybnMgdGhlIFtpci5GdW5jdGlvbk5vZGVdIHRoYXQgZGVmaW5lcyBbbWVtYmVyXSBvciBgbnVsbGAgaWYgW21lbWJlcl0KLy8vIGlzIG5vdCBhIGNvbnN0cnVjdG9yLCBtZXRob2Qgb3IgbG9jYWwgZnVuY3Rpb24uCmlyLkZ1bmN0aW9uTm9kZSBnZXRGdW5jdGlvbk5vZGUoCiAgICBKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwLCBNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgTWVtYmVyRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZWxlbWVudE1hcC5nZXRNZW1iZXJEZWZpbml0aW9uKG1lbWJlcik7CiAgc3dpdGNoIChkZWZpbml0aW9uLmtpbmQpIHsKICAgIGNhc2UgTWVtYmVyS2luZC5yZWd1bGFyOgogICAgICBpci5Ob2RlIG5vZGUgPSBkZWZpbml0aW9uLm5vZGU7CiAgICAgIGlmIChub2RlIGlzIGlyLlByb2NlZHVyZSkgewogICAgICAgIHJldHVybiBub2RlLmZ1bmN0aW9uOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSBNZW1iZXJLaW5kLmNvbnN0cnVjdG9yOgogICAgY2FzZSBNZW1iZXJLaW5kLmNvbnN0cnVjdG9yQm9keToKICAgICAgaXIuTm9kZSBub2RlID0gZGVmaW5pdGlvbi5ub2RlOwogICAgICBpZiAobm9kZSBpcyBpci5Qcm9jZWR1cmUpIHsKICAgICAgICByZXR1cm4gbm9kZS5mdW5jdGlvbjsKICAgICAgfSBlbHNlIGlmIChub2RlIGlzIGlyLkNvbnN0cnVjdG9yKSB7CiAgICAgICAgcmV0dXJuIG5vZGUuZnVuY3Rpb247CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIE1lbWJlcktpbmQuY2xvc3VyZUNhbGw6CiAgICAgIGlyLk5vZGUgbm9kZSA9IGRlZmluaXRpb24ubm9kZTsKICAgICAgaWYgKG5vZGUgaXMgaXIuRnVuY3Rpb25EZWNsYXJhdGlvbikgewogICAgICAgIHJldHVybiBub2RlLmZ1bmN0aW9uOwogICAgICB9IGVsc2UgaWYgKG5vZGUgaXMgaXIuRnVuY3Rpb25FeHByZXNzaW9uKSB7CiAgICAgICAgcmV0dXJuIG5vZGUuZnVuY3Rpb247CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogIH0KICByZXR1cm4gbnVsbDsKfQoKLy8gVE9ETyhqb2hubml3aW50aGVyLGVmb3J0dW5hKTogQWRkIG1vcmUgd2hlbiBuZWVkZWQuCi8vIFRPRE8oam9obm5pd2ludGhlcik6IFNob3VsZCB3ZSBzcGxpdCByZWd1bGFyIGludG8gbWV0aG9kLCBmaWVsZCwgZXRjLj8KZW51bSBNZW1iZXJLaW5kIHsKICAvLyBBIHJlZ3VsYXIgbWVtYmVyIGRlZmluZWQgYnkgYW4gW2lyLk5vZGVdLgogIHJlZ3VsYXIsCiAgLy8gQSBjb25zdHJ1Y3RvciB3aG9zZSBpbml0aWFsaXplciBpcyBkZWZpbmVkIGJ5IGFuIFtpci5Db25zdHJ1Y3Rvcl0gbm9kZS4KICBjb25zdHJ1Y3RvciwKICAvLyBBIGNvbnN0cnVjdG9yIHdob3NlIGJvZHkgaXMgZGVmaW5lZCBieSBhbiBbaXIuQ29uc3RydWN0b3JdIG5vZGUuCiAgY29uc3RydWN0b3JCb2R5LAogIC8vIEEgY2xvc3VyZSBjbGFzcyBgY2FsbGAgbWV0aG9kIHdob3NlIGJvZHkgaXMgZGVmaW5lZCBieSBhbgogIC8vIFtpci5GdW5jdGlvbkV4cHJlc3Npb25dIG9yIFtpci5GdW5jdGlvbkRlY2xhcmF0aW9uXS4KICBjbG9zdXJlQ2FsbCwKICAvLyBBIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gYSBjYXB0dXJlZCB2YXJpYWJsZSBpbiB0aGUgY2xvc3VyZS4gSXQgZG9lcyBub3QKICAvLyBoYXZlIGEgY29ycmVzcG9uZGluZyBpci5Ob2RlLgogIGNsb3N1cmVGaWVsZCwKICAvLyBBIG1ldGhvZCB0aGF0IGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBhIGZ1bmN0aW9uIChpbiB0aGlzIGNhc2UgdGhlIHR5cGUgb2YKICAvLyB0aGUgY2xvc3VyZSBjbGFzcy4gSXQgZG9lcyBub3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgaXIuTm9kZSBvciBhIG1ldGhvZAogIC8vIGJvZHkuCiAgc2lnbmF0dXJlLAogIC8vIEEgc2VwYXJhdGVkIGJvZHkgb2YgYSBnZW5lcmF0b3IgKHN5bmMqL2FzeW5jL2FzeW5jKikgZnVuY3Rpb24uCiAgZ2VuZXJhdG9yQm9keSwKfQoKLy8vIERlZmluaXRpb24gaW5mb3JtYXRpb24gZm9yIGEgW01lbWJlckVudGl0eV0uCmFic3RyYWN0IGNsYXNzIE1lbWJlckRlZmluaXRpb24gewogIC8vLyBUaGUga2luZCBvZiB0aGUgZGVmaW5lZCBtZW1iZXIuIFRoaXMgZGV0ZXJtaW5lcyB0aGUgc2VtYW50aWNzIG9mIFtub2RlXS4KICBNZW1iZXJLaW5kIGdldCBraW5kOwoKICAvLy8gVGhlIGRlZmluaW5nIFtpci5Ob2RlXSBmb3IgdGhpcyBtZW1iZXIsIGlmIHN1cHBvcnRlZCBieSBpdHMgW2tpbmRdLgogIC8vLwogIC8vLyBGb3IgYSByZWd1bGFyIGNsYXNzIHRoaXMgaXMgdGhlIFtpci5DbGFzc10gbm9kZS4gRm9yIGNsb3N1cmUgY2xhc3NlcyB0aGlzCiAgLy8vIG1pZ2h0IGJlIGFuIFtpci5GdW5jdGlvbkV4cHJlc3Npb25dIG5vZGUgaWYgbmVlZGVkLgogIGlyLk5vZGUgZ2V0IG5vZGU7CgogIC8vLyBUaGUgY2Fub25pY2FsIGxvY2F0aW9uIG9mIFttZW1iZXJdLiBUaGlzIGlzIHVzZWQgZm9yIHNvcnRpbmcgdGhlIG1lbWJlcnMKICAvLy8gaW4gdGhlIGVtaXR0ZWQgY29kZS4KICBTb3VyY2VTcGFuIGdldCBsb2NhdGlvbjsKCiAgLy8vIERlc2VyaWFsaXplcyBhIFtNZW1iZXJEZWZpbml0aW9uXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IE1lbWJlckRlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBNZW1iZXJLaW5kIGtpbmQgPSBzb3VyY2UucmVhZEVudW0oTWVtYmVyS2luZC52YWx1ZXMpOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgTWVtYmVyS2luZC5yZWd1bGFyOgogICAgICAgIHJldHVybiBuZXcgUmVndWxhck1lbWJlckRlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNhc2UgTWVtYmVyS2luZC5jb25zdHJ1Y3RvcjoKICAgICAgY2FzZSBNZW1iZXJLaW5kLmNvbnN0cnVjdG9yQm9keToKICAgICAgY2FzZSBNZW1iZXJLaW5kLnNpZ25hdHVyZToKICAgICAgY2FzZSBNZW1iZXJLaW5kLmdlbmVyYXRvckJvZHk6CiAgICAgICAgcmV0dXJuIG5ldyBTcGVjaWFsTWVtYmVyRGVmaW5pdGlvbi5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlLCBraW5kKTsKICAgICAgY2FzZSBNZW1iZXJLaW5kLmNsb3N1cmVDYWxsOgogICAgICBjYXNlIE1lbWJlcktpbmQuY2xvc3VyZUZpZWxkOgogICAgICAgIHJldHVybiBuZXcgQ2xvc3VyZU1lbWJlckRlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSwga2luZCk7CiAgICB9CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5leHBlY3RlZCBNZW1iZXJLaW5kICRraW5kIik7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtNZW1iZXJEZWZpbml0aW9uXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luayk7Cn0KCmVudW0gQ2xhc3NLaW5kIHsKICByZWd1bGFyLAogIGNsb3N1cmUsCiAgLy8gVE9ETyhlZm9ydHVuYSwgam9obm5pd2ludGhlcik6IFJlY29yZCBpcyBub3QgYSBjbGFzcywgYnV0IGlzCiAgLy8gbWFzcXVlcmFkaW5nIGFzIG9uZSBjdXJyZW50bHkgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIG9sZCBlbGVtZW50IG1vZGVsLgogIHJlY29yZCwKfQoKLy8vIEEgbWVtYmVyIGRpcmVjdGx5IGRlZmluZWQgYnkgaXRzIFtpci5NZW1iZXJdIG5vZGUuCmNsYXNzIFJlZ3VsYXJNZW1iZXJEZWZpbml0aW9uIGltcGxlbWVudHMgTWVtYmVyRGVmaW5pdGlvbiB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtSZWd1bGFyTWVtYmVyRGVmaW5pdGlvbl0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdyZWd1bGFyLW1lbWJlci1kZWZpbml0aW9uJzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgaXIuTWVtYmVyIG5vZGU7CgogIFJlZ3VsYXJNZW1iZXJEZWZpbml0aW9uKHRoaXMubm9kZSk7CgogIGZhY3RvcnkgUmVndWxhck1lbWJlckRlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGlyLk1lbWJlciBub2RlID0gc291cmNlLnJlYWRNZW1iZXJOb2RlKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IFJlZ3VsYXJNZW1iZXJEZWZpbml0aW9uKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oTWVtYmVyS2luZC5yZWd1bGFyKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVNZW1iZXJOb2RlKG5vZGUpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZVNwYW4gZ2V0IGxvY2F0aW9uID0+IGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKG5vZGUpOwoKICBAb3ZlcnJpZGUKICBNZW1iZXJLaW5kIGdldCBraW5kID0+IE1lbWJlcktpbmQucmVndWxhcjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1JlZ3VsYXJNZW1iZXJEZWZpbml0aW9uKGtpbmQ6JGtpbmQsJwogICAgICAnbm9kZTokbm9kZSxsb2NhdGlvbjokbG9jYXRpb24pJzsKfQoKLy8vIFRoZSBkZWZpbml0aW9uIG9mIGEgc3BlY2lhbCBraW5kIG9mIG1lbWJlcgpjbGFzcyBTcGVjaWFsTWVtYmVyRGVmaW5pdGlvbiBpbXBsZW1lbnRzIE1lbWJlckRlZmluaXRpb24gewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbU3BlY2lhbE1lbWJlckRlZmluaXRpb25dIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnc3BlY2lhbC1tZW1iZXItZGVmaW5pdGlvbic7CgogIEBvdmVycmlkZQogIGZpbmFsIGlyLlRyZWVOb2RlIG5vZGU7CiAgQG92ZXJyaWRlCiAgZmluYWwgTWVtYmVyS2luZCBraW5kOwoKICBTcGVjaWFsTWVtYmVyRGVmaW5pdGlvbih0aGlzLm5vZGUsIHRoaXMua2luZCk7CgogIGZhY3RvcnkgU3BlY2lhbE1lbWJlckRlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwgTWVtYmVyS2luZCBraW5kKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGlyLlRyZWVOb2RlIG5vZGUgPSBzb3VyY2UucmVhZFRyZWVOb2RlKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IFNwZWNpYWxNZW1iZXJEZWZpbml0aW9uKG5vZGUsIGtpbmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oa2luZCk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlVHJlZU5vZGUobm9kZSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlU3BhbiBnZXQgbG9jYXRpb24gPT4gY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUobm9kZSk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdTcGVjaWFsTWVtYmVyRGVmaW5pdGlvbihraW5kOiRraW5kLCcKICAgICAgJ25vZGU6JG5vZGUsbG9jYXRpb246JGxvY2F0aW9uKSc7Cn0KCi8vLyBEZWZpbml0aW9uIGluZm9ybWF0aW9uIGZvciBhIFtDbGFzc0VudGl0eV0uCmFic3RyYWN0IGNsYXNzIENsYXNzRGVmaW5pdGlvbiB7CiAgLy8vIFRoZSBraW5kIG9mIHRoZSBkZWZpbmVkIGNsYXNzLiBUaGlzIGRldGVybWluZXMgdGhlIHNlbWFudGljcyBvZiBbbm9kZV0uCiAgQ2xhc3NLaW5kIGdldCBraW5kOwoKICAvLy8gVGhlIGRlZmluaW5nIFtpci5Ob2RlXSBmb3IgdGhpcyBjbGFzcywgaWYgc3VwcG9ydGVkIGJ5IGl0cyBba2luZF0uCiAgaXIuTm9kZSBnZXQgbm9kZTsKCiAgLy8vIFRoZSBjYW5vbmljYWwgbG9jYXRpb24gb2YgW2Nsc10uIFRoaXMgaXMgdXNlZCBmb3Igc29ydGluZyB0aGUgY2xhc3NlcwogIC8vLyBpbiB0aGUgZW1pdHRlZCBjb2RlLgogIFNvdXJjZVNwYW4gZ2V0IGxvY2F0aW9uOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW0NsYXNzRGVmaW5pdGlvbl0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBDbGFzc0RlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBDbGFzc0tpbmQga2luZCA9IHNvdXJjZS5yZWFkRW51bShDbGFzc0tpbmQudmFsdWVzKTsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIENsYXNzS2luZC5yZWd1bGFyOgogICAgICAgIHJldHVybiBuZXcgUmVndWxhckNsYXNzRGVmaW5pdGlvbi5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgY2FzZSBDbGFzc0tpbmQuY2xvc3VyZToKICAgICAgICByZXR1cm4gbmV3IENsb3N1cmVDbGFzc0RlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNhc2UgQ2xhc3NLaW5kLnJlY29yZDoKICAgICAgICByZXR1cm4gbmV3IFJlY29yZENvbnRhaW5lckRlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICB9CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5leHBlY3RlZCBDbGFzc0tpbmQgJGtpbmQiKTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0NsYXNzRGVmaW5pdGlvbl0gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspOwp9CgovLy8gQSBjbGFzcyBkaXJlY3RseSBkZWZpbmVkIGJ5IGl0cyBbaXIuQ2xhc3NdIG5vZGUuCmNsYXNzIFJlZ3VsYXJDbGFzc0RlZmluaXRpb24gaW1wbGVtZW50cyBDbGFzc0RlZmluaXRpb24gewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbUmVndWxhckNsYXNzRGVmaW5pdGlvbl0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdyZWd1bGFyLWNsYXNzLWRlZmluaXRpb24nOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBpci5DbGFzcyBub2RlOwoKICBSZWd1bGFyQ2xhc3NEZWZpbml0aW9uKHRoaXMubm9kZSk7CgogIGZhY3RvcnkgUmVndWxhckNsYXNzRGVmaW5pdGlvbi5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgaXIuQ2xhc3Mgbm9kZSA9IHNvdXJjZS5yZWFkQ2xhc3NOb2RlKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IFJlZ3VsYXJDbGFzc0RlZmluaXRpb24obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShraW5kKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVDbGFzc05vZGUobm9kZSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlU3BhbiBnZXQgbG9jYXRpb24gPT4gY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUobm9kZSk7CgogIEBvdmVycmlkZQogIENsYXNzS2luZCBnZXQga2luZCA9PiBDbGFzc0tpbmQucmVndWxhcjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1JlZ3VsYXJDbGFzc0RlZmluaXRpb24oa2luZDoka2luZCwnCiAgICAgICdub2RlOiRub2RlLGxvY2F0aW9uOiRsb2NhdGlvbiknOwp9CgovLy8gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZXIgZm9yIFtmaWVsZF0uCi8vLwovLy8gSWYgW2ZpZWxkXSBpcyBhbiBpbnN0YW5jZSBmaWVsZCB3aXRoIGEgbnVsbCBsaXRlcmFsIGluaXRpYWxpemVyIGBudWxsYCBpcwovLy8gcmV0dXJuZWQsIG90aGVyd2lzZSB0aGUgaW5pdGlhbGl6ZXIgb2YgdGhlIFtpci5GaWVsZF0gaXMgcmV0dXJuZWQuCmlyLk5vZGUgZ2V0RmllbGRJbml0aWFsaXplcihKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwLCBGaWVsZEVudGl0eSBmaWVsZCkgewogIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiA9IGVsZW1lbnRNYXAuZ2V0TWVtYmVyRGVmaW5pdGlvbihmaWVsZCk7CiAgaXIuRmllbGQgbm9kZSA9IGRlZmluaXRpb24ubm9kZTsKICBpZiAobm9kZS5pc0luc3RhbmNlTWVtYmVyICYmCiAgICAgICFub2RlLmlzRmluYWwgJiYKICAgICAgbm9kZS5pbml0aWFsaXplciBpcyBpci5OdWxsTGl0ZXJhbCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHJldHVybiBub2RlLmluaXRpYWxpemVyOwp9Cgp2b2lkIGZvckVhY2hPcmRlcmVkUGFyYW1ldGVyQnlGdW5jdGlvbk5vZGUoCiAgICBpci5GdW5jdGlvbk5vZGUgbm9kZSwKICAgIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICB2b2lkIGYoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIsIHtib29sIGlzT3B0aW9uYWwsIGJvb2wgaXNFbGlkZWR9KSwKICAgIHtib29sIHVzZU5hdGl2ZU9yZGVyaW5nOiBmYWxzZX0pIHsKICBmb3IgKGludCBwb3NpdGlvbiA9IDA7CiAgICAgIHBvc2l0aW9uIDwgbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7CiAgICAgIHBvc2l0aW9uKyspIHsKICAgIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW3Bvc2l0aW9uXTsKICAgIGYodmFyaWFibGUsCiAgICAgICAgaXNPcHRpb25hbDogcG9zaXRpb24gPj0gcGFyYW1ldGVyU3RydWN0dXJlLnJlcXVpcmVkUGFyYW1ldGVycywKICAgICAgICBpc0VsaWRlZDogcG9zaXRpb24gPj0gcGFyYW1ldGVyU3RydWN0dXJlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKTsKICB9CgogIGlmIChub2RlLm5hbWVkUGFyYW1ldGVycy5pc0VtcHR5KSB7CiAgICByZXR1cm47CiAgfQoKICBMaXN0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVycyA9IG5vZGUubmFtZWRQYXJhbWV0ZXJzLnRvTGlzdCgpOwogIGlmICh1c2VOYXRpdmVPcmRlcmluZykgewogICAgbmFtZWRQYXJhbWV0ZXJzLnNvcnQobmF0aXZlT3JkZXJpbmcpOwogIH0gZWxzZSB7CiAgICBuYW1lZFBhcmFtZXRlcnMuc29ydChuYW1lZE9yZGVyaW5nKTsKICB9CiAgZm9yIChpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlIGluIG5hbWVkUGFyYW1ldGVycykgewogICAgZih2YXJpYWJsZSwKICAgICAgICBpc09wdGlvbmFsOiB0cnVlLAogICAgICAgIGlzRWxpZGVkOiAhcGFyYW1ldGVyU3RydWN0dXJlLm5hbWVkUGFyYW1ldGVycy5jb250YWlucyh2YXJpYWJsZS5uYW1lKSk7CiAgfQp9Cgp2b2lkIGZvckVhY2hPcmRlcmVkUGFyYW1ldGVyKEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uLAogICAgdm9pZCBmKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyLCB7Ym9vbCBpc0VsaWRlZH0pKSB7CiAgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSA9IGZ1bmN0aW9uLnBhcmFtZXRlclN0cnVjdHVyZTsKCiAgdm9pZCBoYW5kbGVQYXJhbWV0ZXIoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIsCiAgICAgIHtib29sIGlzT3B0aW9uYWwsIGJvb2wgaXNFbGlkZWR9KSB7CiAgICBmKHBhcmFtZXRlciwgaXNFbGlkZWQ6IGlzRWxpZGVkKTsKICB9CgogIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiA9IGVsZW1lbnRNYXAuZ2V0TWVtYmVyRGVmaW5pdGlvbihmdW5jdGlvbik7CiAgc3dpdGNoIChkZWZpbml0aW9uLmtpbmQpIHsKICAgIGNhc2UgTWVtYmVyS2luZC5yZWd1bGFyOgogICAgICBpci5Ob2RlIG5vZGUgPSBkZWZpbml0aW9uLm5vZGU7CiAgICAgIGlmIChub2RlIGlzIGlyLlByb2NlZHVyZSkgewogICAgICAgIGZvckVhY2hPcmRlcmVkUGFyYW1ldGVyQnlGdW5jdGlvbk5vZGUoCiAgICAgICAgICAgIG5vZGUuZnVuY3Rpb24sIHBhcmFtZXRlclN0cnVjdHVyZSwgaGFuZGxlUGFyYW1ldGVyKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIE1lbWJlcktpbmQuY29uc3RydWN0b3I6CiAgICBjYXNlIE1lbWJlcktpbmQuY29uc3RydWN0b3JCb2R5OgogICAgICBpci5Ob2RlIG5vZGUgPSBkZWZpbml0aW9uLm5vZGU7CiAgICAgIGlmIChub2RlIGlzIGlyLlByb2NlZHVyZSkgewogICAgICAgIGZvckVhY2hPcmRlcmVkUGFyYW1ldGVyQnlGdW5jdGlvbk5vZGUoCiAgICAgICAgICAgIG5vZGUuZnVuY3Rpb24sIHBhcmFtZXRlclN0cnVjdHVyZSwgaGFuZGxlUGFyYW1ldGVyKTsKICAgICAgICByZXR1cm47CiAgICAgIH0gZWxzZSBpZiAobm9kZSBpcyBpci5Db25zdHJ1Y3RvcikgewogICAgICAgIGZvckVhY2hPcmRlcmVkUGFyYW1ldGVyQnlGdW5jdGlvbk5vZGUoCiAgICAgICAgICAgIG5vZGUuZnVuY3Rpb24sIHBhcmFtZXRlclN0cnVjdHVyZSwgaGFuZGxlUGFyYW1ldGVyKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIE1lbWJlcktpbmQuY2xvc3VyZUNhbGw6CiAgICAgIGlyLk5vZGUgbm9kZSA9IGRlZmluaXRpb24ubm9kZTsKICAgICAgaWYgKG5vZGUgaXMgaXIuRnVuY3Rpb25EZWNsYXJhdGlvbikgewogICAgICAgIGZvckVhY2hPcmRlcmVkUGFyYW1ldGVyQnlGdW5jdGlvbk5vZGUoCiAgICAgICAgICAgIG5vZGUuZnVuY3Rpb24sIHBhcmFtZXRlclN0cnVjdHVyZSwgaGFuZGxlUGFyYW1ldGVyKTsKICAgICAgICByZXR1cm47CiAgICAgIH0gZWxzZSBpZiAobm9kZSBpcyBpci5GdW5jdGlvbkV4cHJlc3Npb24pIHsKICAgICAgICBmb3JFYWNoT3JkZXJlZFBhcmFtZXRlckJ5RnVuY3Rpb25Ob2RlKAogICAgICAgICAgICBub2RlLmZ1bmN0aW9uLCBwYXJhbWV0ZXJTdHJ1Y3R1cmUsIGhhbmRsZVBhcmFtZXRlcik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICB9CiAgZmFpbGVkQXQoZnVuY3Rpb24sICJVbmV4cGVjdGVkIGZ1bmN0aW9uIGRlZmluaXRpb24gJGRlZmluaXRpb24uIik7Cn0KgmkATk48ASgBGSNMJCEhITEdKhoeIy81OCIuIyokGBcBTEIgNiYBKBcBNioBOzkBPkMBMDYBSxclNgFEOgFOGCwBRSoBSi8BURo0AUMnAUMnAVEvAU0oQh0BPjQ4ATIeAUxHAUoQTgE9JTshAUJEAUJQMjs/ATk1ATRBAUEuAUA4ATdHAVAYQgFJJz8cAUctAUYkOAFLGz0BSjoBRzwBTz4wTwE4QQIBPio2OgFGKlABQDgBP0QBQSNGATIjTAFBQgFCSQFDSgFIGj8wATtFAS04ATQ9AUYSSwFEKEACATAjKCIBJjcBHj0BP0ABKUEBPzwBUTkBSy0+AVAmPgFJTgFLJj0BSSY2AU0mOAFQJjwBTyY8ATUnAgFONCE2SB0dJiIeCA0hJSYiHiseCA0hJiweMh4IDQ0EDwIBN0oSLwtND0YTPzoPTiMQTk0LDUQRAgExIk8XAUoGUDoUAU8bGwE+QzoUH0cjJyElTSMkTQY/BAE0JwIBEQsLQk8KAgE3PFEdOQEMGAEmAUoXLhUuBAEMKCgVIBMEAQxCAQwtAQw9KAIBLzxRHTkBDBoMGQExATYsFy4VNAQBDCgaFR4TBAEMQgEMPSgCATAhThYBSRQBTBsbAT1COBQeRh5GHUkGPgQBMycCATU6UB04AQwXASUBSRcsFS0EAQwoGhUfEwQBDEIBDCsBDDwoAgEpBE5HTEcjHxcsEQQbAgEsGitQJxkzFEsQR0gEASYMBAFQGyoLKQQ9EBpQBAIBUUFHATkqJgQBSh0dJiIvQRAIDSElJiIvQRArL0EQCA0hJiwvQRAyL0EQCA0NBEUCAS5wYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19tb2RlbC9lbGVtZW50X21hcC5kYXJ0PHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX21vZGVsL2VsZW1lbnRfbWFwX2ltcGwuZGFydMABcOYvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL2RhcnQyanMuZGFydCcgc2hvdyBMaW5rLCBMaW5rQnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTpqc19ydW50aW1lL3NoYXJlZC9lbWJlZGRlZF9uYW1lcy5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydCcgYXMgaXI7CgppbXBvcnQgJy4uL2Nsb3N1cmUuZGFydCcgc2hvdyBCb3hMb2NhbCwgVGhpc0xvY2FsOwppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24vbmFtZXMuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL2NvbXBpbGVfdGltZV9jb25zdGFudHMuZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL2NvbnN0cnVjdG9ycy5kYXJ0JzsKaW1wb3J0ICcuLi9jb25zdGFudHMvZXZhbHVhdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb25zdGFudHMvZXhwcmVzc2lvbnMuZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdHlfdXRpbHMuZGFydCcgYXMgdXRpbHM7CmltcG9ydCAnLi4vZWxlbWVudHMvaW5kZXhlZC5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9uYW1lcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbnZpcm9ubWVudC5kYXJ0JzsKaW1wb3J0ICcuLi9pci9jYWNoZWRfc3RhdGljX3R5cGUuZGFydCc7CmltcG9ydCAnLi4vaXIvY2xvc3VyZS5kYXJ0JzsKaW1wb3J0ICcuLi9pci9kZWJ1Zy5kYXJ0JzsKaW1wb3J0ICcuLi9pci9lbGVtZW50X21hcC5kYXJ0JzsKaW1wb3J0ICcuLi9pci90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pci92aXNpdG9ycy5kYXJ0JzsKaW1wb3J0ICcuLi9pci9zdGF0aWNfdHlwZV9iYXNlLmRhcnQnOwppbXBvcnQgJy4uL2lyL3N0YXRpY190eXBlX3Byb3ZpZGVyLmRhcnQnOwppbXBvcnQgJy4uL2lyL3V0aWwuZGFydCc7CmltcG9ydCAnLi4vanMvanMuZGFydCcgYXMganM7CmltcG9ydCAnLi4vanNfYmFja2VuZC9hbm5vdGF0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL25hbWVyLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vanNfZW1pdHRlci9jb2RlX2VtaXR0ZXJfdGFzay5kYXJ0JzsKaW1wb3J0ICcuLi9rZXJuZWwvZWxlbWVudF9tYXBfaW1wbC5kYXJ0JzsKaW1wb3J0ICcuLi9rZXJuZWwvZW52LmRhcnQnOwppbXBvcnQgJy4uL2tlcm5lbC9rZWxlbWVudHMuZGFydCc7CmltcG9ydCAnLi4vbmF0aXZlL2JlaGF2aW9yLmRhcnQnOwppbXBvcnQgJy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vb3JkZXJlZF90eXBlc2V0LmRhcnQnOwppbXBvcnQgJy4uL3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi9zc2EvdHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NhbGxfc3RydWN0dXJlLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL21lbWJlcl91c2FnZS5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9zZWxlY3Rvci5kYXJ0JzsKCmltcG9ydCAnY2xvc3VyZS5kYXJ0JzsKaW1wb3J0ICdlbGVtZW50cy5kYXJ0JzsKaW1wb3J0ICdlbGVtZW50X21hcC5kYXJ0JzsKaW1wb3J0ICdlbnYuZGFydCc7CmltcG9ydCAnbG9jYWxzLmRhcnQnOwoKLy8vIEludGVyZmFjZSBmb3Iga2VybmVsIHF1ZXJpZXMgbmVlZGVkIHRvIGltcGxlbWVudCB0aGUgW0NvZGVnZW5Xb3JsZEJ1aWxkZXJdLgphYnN0cmFjdCBjbGFzcyBKc1RvV29ybGRCdWlsZGVyIGltcGxlbWVudHMgSnNUb0VsZW1lbnRNYXAgewogIC8vLyBDYWxscyBbZl0gZm9yIGVhY2ggcGFyYW1ldGVyIG9mIFtmdW5jdGlvbl0gcHJvdmlkaW5nIHRoZSB0eXBlIGFuZCBuYW1lIG9mCiAgLy8vIHRoZSBwYXJhbWV0ZXIgYW5kIHRoZSBbZGVmYXVsdFZhbHVlXSBpZiB0aGUgcGFyYW1ldGVyIGlzIG9wdGlvbmFsLgogIHZvaWQgZm9yRWFjaFBhcmFtZXRlcihGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwKICAgICAgdm9pZCBmKERhcnRUeXBlIHR5cGUsIFN0cmluZyBuYW1lLCBDb25zdGFudFZhbHVlIGRlZmF1bHRWYWx1ZSksCiAgICAgIHtib29sIGlzTmF0aXZlOiBmYWxzZX0pOwp9CgpjbGFzcyBKc0tlcm5lbFRvRWxlbWVudE1hcAogICAgaW1wbGVtZW50cyBKc1RvV29ybGRCdWlsZGVyLCBKc1RvRWxlbWVudE1hcCwgSXJUb0VsZW1lbnRNYXAgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbSnNLZXJuZWxUb0VsZW1lbnRNYXBdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnanMta2VybmVsLXRvLWVsZW1lbnQtbWFwJzsKCiAgLy8vIFRhZ3MgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBzdWJzZWN0aW9ucyBvZiBhCiAgLy8vIFtKc0tlcm5lbFRvRWxlbWVudE1hcF0gb2JqZWN0IGluIGEgZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgbGlicmFyeVRhZyA9ICdsaWJyYXJpZXMnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgY2xhc3NUYWcgPSAnY2xhc3Nlcyc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0eXBlZGVmVGFnID0gJ3R5cGVkZWZzJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIG1lbWJlclRhZyA9ICdtZW1iZXJzJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHR5cGVWYXJpYWJsZVRhZyA9ICd0eXBlLXZhcmlhYmxlcyc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBsaWJyYXJ5RGF0YVRhZyA9ICdsaWJyYXJ5LWRhdGEnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgY2xhc3NEYXRhVGFnID0gJ2NsYXNzLWRhdGEnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgdHlwZWRlZkRhdGFUYWcgPSAndHlwZWRlZi1kYXRhJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIG1lbWJlckRhdGFUYWcgPSAnbWVtYmVyLWRhdGEnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgdHlwZVZhcmlhYmxlRGF0YVRhZyA9ICd0eXBlLXZhcmlhYmxlLWRhdGEnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgbmVzdGVkQ2xvc3VyZXNUYWcgPSAnbmVzdGVkLWNsb3N1cmVzJzsKCiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnM7CiAgQG92ZXJyaWRlCiAgZmluYWwgRGlhZ25vc3RpY1JlcG9ydGVyIHJlcG9ydGVyOwogIENvbW1vbkVsZW1lbnRzSW1wbCBfY29tbW9uRWxlbWVudHM7CiAgSnNFbGVtZW50RW52aXJvbm1lbnQgX2VsZW1lbnRFbnZpcm9ubWVudDsKICBEYXJ0VHlwZUNvbnZlcnRlciBfdHlwZUNvbnZlcnRlcjsKICBKc0NvbnN0YW50RW52aXJvbm1lbnQgX2NvbnN0YW50RW52aXJvbm1lbnQ7CiAgS2VybmVsRGFydFR5cGVzIF90eXBlczsKICBpci5UeXBlRW52aXJvbm1lbnQgX3R5cGVFbnZpcm9ubWVudDsKICBpci5DbGFzc0hpZXJhcmNoeSBfY2xhc3NIaWVyYXJjaHk7CgogIC8vLyBMaWJyYXJ5IGVudmlyb25tZW50LiBVc2VkIGZvciBmYXN0IGxvb2t1cC4KICBKUHJvZ3JhbUVudiBwcm9ncmFtRW52OwoKICBmaW5hbCBFbnRpdHlEYXRhRW52TWFwPEluZGV4ZWRMaWJyYXJ5LCBKTGlicmFyeURhdGEsIEpMaWJyYXJ5RW52PiBsaWJyYXJpZXMgPQogICAgICBuZXcgRW50aXR5RGF0YUVudk1hcDxJbmRleGVkTGlicmFyeSwgSkxpYnJhcnlEYXRhLCBKTGlicmFyeUVudj4oKTsKICBmaW5hbCBFbnRpdHlEYXRhRW52TWFwPEluZGV4ZWRDbGFzcywgSkNsYXNzRGF0YSwgSkNsYXNzRW52PiBjbGFzc2VzID0KICAgICAgbmV3IEVudGl0eURhdGFFbnZNYXA8SW5kZXhlZENsYXNzLCBKQ2xhc3NEYXRhLCBKQ2xhc3NFbnY+KCk7CiAgZmluYWwgRW50aXR5RGF0YU1hcDxJbmRleGVkTWVtYmVyLCBKTWVtYmVyRGF0YT4gbWVtYmVycyA9CiAgICAgIG5ldyBFbnRpdHlEYXRhTWFwPEluZGV4ZWRNZW1iZXIsIEpNZW1iZXJEYXRhPigpOwogIGZpbmFsIEVudGl0eURhdGFNYXA8SW5kZXhlZFR5cGVWYXJpYWJsZSwgSlR5cGVWYXJpYWJsZURhdGE+IHR5cGVWYXJpYWJsZXMgPQogICAgICBuZXcgRW50aXR5RGF0YU1hcDxJbmRleGVkVHlwZVZhcmlhYmxlLCBKVHlwZVZhcmlhYmxlRGF0YT4oKTsKICBmaW5hbCBFbnRpdHlEYXRhTWFwPEluZGV4ZWRUeXBlZGVmLCBKVHlwZWRlZkRhdGE+IHR5cGVkZWZzID0KICAgICAgbmV3IEVudGl0eURhdGFNYXA8SW5kZXhlZFR5cGVkZWYsIEpUeXBlZGVmRGF0YT4oKTsKCiAgZmluYWwgTWFwPGlyLkxpYnJhcnksIEluZGV4ZWRMaWJyYXJ5PiBsaWJyYXJ5TWFwID0ge307CiAgZmluYWwgTWFwPGlyLkNsYXNzLCBJbmRleGVkQ2xhc3M+IGNsYXNzTWFwID0ge307CiAgZmluYWwgTWFwPGlyLlR5cGVkZWYsIEluZGV4ZWRUeXBlZGVmPiB0eXBlZGVmTWFwID0ge307CgogIC8vLyBNYXAgZnJvbSBbaXIuVHlwZVBhcmFtZXRlcl0gbm9kZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcKICAvLy8gW1R5cGVWYXJpYWJsZUVudGl0eV0uCiAgLy8vCiAgLy8vIE5vcm1hbGx5IHRoZSB0eXBlIHZhcmlhYmxlcyBhcmUgW0luZGV4ZWRUeXBlVmFyaWFibGVdcywgYnV0IGZvciB0eXBlCiAgLy8vIHBhcmFtZXRlcnMgb24gbG9jYWwgZnVuY3Rpb24gKGluIHRoZSBmcm9udGVuZCkgdGhlc2UgYXJlIF9ub3RfIHNpbmNlCiAgLy8vIHRoZWlyIHR5cGUgZGVjbGFyYXRpb24gaXMgbmVpdGhlciBhIGNsYXNzIG5vciBhIG1lbWJlci4gSW4gdGhlIGJhY2tlbmQsCiAgLy8vIHRoZXNlIHR5cGUgcGFyYW1ldGVycyBiZWxvbmcgdG8gdGhlIGNhbGwtbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIGluZGV4ZWQuCiAgZmluYWwgTWFwPGlyLlR5cGVQYXJhbWV0ZXIsIFR5cGVWYXJpYWJsZUVudGl0eT4gdHlwZVZhcmlhYmxlTWFwID0ge307CiAgZmluYWwgTWFwPGlyLk1lbWJlciwgSW5kZXhlZENvbnN0cnVjdG9yPiBjb25zdHJ1Y3Rvck1hcCA9IHt9OwogIGZpbmFsIE1hcDxpci5Qcm9jZWR1cmUsIEluZGV4ZWRGdW5jdGlvbj4gbWV0aG9kTWFwID0ge307CiAgZmluYWwgTWFwPGlyLkZpZWxkLCBJbmRleGVkRmllbGQ+IGZpZWxkTWFwID0ge307CiAgZmluYWwgTWFwPGlyLlRyZWVOb2RlLCBMb2NhbD4gbG9jYWxGdW5jdGlvbk1hcCA9IHt9OwoKICAvLy8gTWFwIGZyb20gbWVtYmVycyB0byB0aGUgY2FsbCBtZXRob2RzIGNyZWF0ZWQgZm9yIHRoZWlyIG5lc3RlZCBjbG9zdXJlcy4KICBNYXA8SW5kZXhlZE1lbWJlciwgTGlzdDxJbmRleGVkRnVuY3Rpb24+PiBfbmVzdGVkQ2xvc3VyZU1hcCA9IHt9OwoKICAvLy8gTmF0aXZlQmFzaWNEYXRhIGlzIG5lZWQgZm9yIGNvbXB1dGF0aW9uIG9mIHRoZSBkZWZhdWx0IHN1cGVyIGNsYXNzLgogIE5hdGl2ZUJhc2ljRGF0YSBuYXRpdmVCYXNpY0RhdGE7CgogIE1hcDxJbmRleGVkRnVuY3Rpb24sIEpHZW5lcmF0b3JCb2R5PiBfZ2VuZXJhdG9yQm9kaWVzID0ge307CgogIE1hcDxJbmRleGVkQ2xhc3MsIExpc3Q8SW5kZXhlZE1lbWJlcj4+IF9pbmplY3RlZENsYXNzTWVtYmVycyA9IHt9OwoKICBKc0tlcm5lbFRvRWxlbWVudE1hcCgKICAgICAgdGhpcy5yZXBvcnRlciwKICAgICAgRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsCiAgICAgIEtlcm5lbFRvRWxlbWVudE1hcEltcGwgX2VsZW1lbnRNYXAsCiAgICAgIE1hcDxNZW1iZXJFbnRpdHksIE1lbWJlclVzYWdlPiBsaXZlTWVtYmVyVXNhZ2UsCiAgICAgIEFubm90YXRpb25zRGF0YSBhbm5vdGF0aW9ucykKICAgICAgOiB0aGlzLm9wdGlvbnMgPSBfZWxlbWVudE1hcC5vcHRpb25zIHsKICAgIF9lbGVtZW50RW52aXJvbm1lbnQgPSBuZXcgSnNFbGVtZW50RW52aXJvbm1lbnQodGhpcyk7CiAgICBfY29tbW9uRWxlbWVudHMgPSBuZXcgQ29tbW9uRWxlbWVudHNJbXBsKF9lbGVtZW50RW52aXJvbm1lbnQpOwogICAgX2NvbnN0YW50RW52aXJvbm1lbnQgPSBuZXcgSnNDb25zdGFudEVudmlyb25tZW50KHRoaXMsIGVudmlyb25tZW50KTsKICAgIF90eXBlQ29udmVydGVyID0gbmV3IERhcnRUeXBlQ29udmVydGVyKHRoaXMpOwogICAgX3R5cGVzID0gbmV3IEtlcm5lbERhcnRUeXBlcyh0aGlzKTsKCiAgICBwcm9ncmFtRW52ID0gX2VsZW1lbnRNYXAuZW52LmNvbnZlcnQoKTsKICAgIGZvciAoaW50IGxpYnJhcnlJbmRleCA9IDA7CiAgICAgICAgbGlicmFyeUluZGV4IDwgX2VsZW1lbnRNYXAubGlicmFyaWVzLmxlbmd0aDsKICAgICAgICBsaWJyYXJ5SW5kZXgrKykgewogICAgICBJbmRleGVkTGlicmFyeSBvbGRMaWJyYXJ5ID0gX2VsZW1lbnRNYXAubGlicmFyaWVzLmdldEVudGl0eShsaWJyYXJ5SW5kZXgpOwogICAgICBLTGlicmFyeUVudiBvbGRFbnYgPSBfZWxlbWVudE1hcC5saWJyYXJpZXMuZ2V0RW52KG9sZExpYnJhcnkpOwogICAgICBLTGlicmFyeURhdGEgZGF0YSA9IF9lbGVtZW50TWFwLmxpYnJhcmllcy5nZXREYXRhKG9sZExpYnJhcnkpOwogICAgICBJbmRleGVkTGlicmFyeSBuZXdMaWJyYXJ5ID0gY29udmVydExpYnJhcnkob2xkTGlicmFyeSk7CiAgICAgIEpMaWJyYXJ5RW52IG5ld0VudiA9IG9sZEVudi5jb252ZXJ0KF9lbGVtZW50TWFwLCBsaXZlTWVtYmVyVXNhZ2UpOwogICAgICBsaWJyYXJ5TWFwW29sZEVudi5saWJyYXJ5XSA9CiAgICAgICAgICBsaWJyYXJpZXMucmVnaXN0ZXI8SW5kZXhlZExpYnJhcnksIEpMaWJyYXJ5RGF0YSwgSkxpYnJhcnlFbnY+KAogICAgICAgICAgICAgIG5ld0xpYnJhcnksIGRhdGEuY29udmVydCgpLCBuZXdFbnYpOwogICAgICBhc3NlcnQobmV3TGlicmFyeS5saWJyYXJ5SW5kZXggPT0gb2xkTGlicmFyeS5saWJyYXJ5SW5kZXgpOwogICAgICBwcm9ncmFtRW52LnJlZ2lzdGVyTGlicmFyeShuZXdFbnYpOwogICAgfQogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogRmlsdGVyIHVudXNlZCBjbGFzc2VzLgogICAgZm9yIChpbnQgY2xhc3NJbmRleCA9IDA7CiAgICAgICAgY2xhc3NJbmRleCA8IF9lbGVtZW50TWFwLmNsYXNzZXMubGVuZ3RoOwogICAgICAgIGNsYXNzSW5kZXgrKykgewogICAgICBJbmRleGVkQ2xhc3Mgb2xkQ2xhc3MgPSBfZWxlbWVudE1hcC5jbGFzc2VzLmdldEVudGl0eShjbGFzc0luZGV4KTsKICAgICAgS0NsYXNzRW52IGVudiA9IF9lbGVtZW50TWFwLmNsYXNzZXMuZ2V0RW52KG9sZENsYXNzKTsKICAgICAgS0NsYXNzRGF0YSBkYXRhID0gX2VsZW1lbnRNYXAuY2xhc3Nlcy5nZXREYXRhKG9sZENsYXNzKTsKICAgICAgSW5kZXhlZExpYnJhcnkgb2xkTGlicmFyeSA9IG9sZENsYXNzLmxpYnJhcnk7CiAgICAgIExpYnJhcnlFbnRpdHkgbmV3TGlicmFyeSA9IGxpYnJhcmllcy5nZXRFbnRpdHkob2xkTGlicmFyeS5saWJyYXJ5SW5kZXgpOwogICAgICBJbmRleGVkQ2xhc3MgbmV3Q2xhc3MgPSBjb252ZXJ0Q2xhc3MobmV3TGlicmFyeSwgb2xkQ2xhc3MpOwogICAgICBKQ2xhc3NFbnYgbmV3RW52ID0gZW52LmNvbnZlcnQoX2VsZW1lbnRNYXAsIGxpdmVNZW1iZXJVc2FnZSk7CiAgICAgIGNsYXNzTWFwW2Vudi5jbHNdID0gY2xhc3Nlcy5yZWdpc3RlcihuZXdDbGFzcywgZGF0YS5jb252ZXJ0KCksIG5ld0Vudik7CiAgICAgIGFzc2VydChuZXdDbGFzcy5jbGFzc0luZGV4ID09IG9sZENsYXNzLmNsYXNzSW5kZXgpOwogICAgICBsaWJyYXJpZXMuZ2V0RW52KG5ld0NsYXNzLmxpYnJhcnkpLnJlZ2lzdGVyQ2xhc3MobmV3Q2xhc3MubmFtZSwgbmV3RW52KTsKICAgIH0KICAgIGZvciAoaW50IHR5cGVkZWZJbmRleCA9IDA7CiAgICAgICAgdHlwZWRlZkluZGV4IDwgX2VsZW1lbnRNYXAudHlwZWRlZnMubGVuZ3RoOwogICAgICAgIHR5cGVkZWZJbmRleCsrKSB7CiAgICAgIEluZGV4ZWRUeXBlZGVmIG9sZFR5cGVkZWYgPSBfZWxlbWVudE1hcC50eXBlZGVmcy5nZXRFbnRpdHkodHlwZWRlZkluZGV4KTsKICAgICAgS1R5cGVkZWZEYXRhIGRhdGEgPSBfZWxlbWVudE1hcC50eXBlZGVmcy5nZXREYXRhKG9sZFR5cGVkZWYpOwogICAgICBJbmRleGVkTGlicmFyeSBvbGRMaWJyYXJ5ID0gb2xkVHlwZWRlZi5saWJyYXJ5OwogICAgICBMaWJyYXJ5RW50aXR5IG5ld0xpYnJhcnkgPSBsaWJyYXJpZXMuZ2V0RW50aXR5KG9sZExpYnJhcnkubGlicmFyeUluZGV4KTsKICAgICAgSW5kZXhlZFR5cGVkZWYgbmV3VHlwZWRlZiA9IGNvbnZlcnRUeXBlZGVmKG5ld0xpYnJhcnksIG9sZFR5cGVkZWYpOwogICAgICB0eXBlZGVmTWFwW2RhdGEubm9kZV0gPSB0eXBlZGVmcy5yZWdpc3RlcigKICAgICAgICAgIG5ld1R5cGVkZWYsCiAgICAgICAgICBuZXcgSlR5cGVkZWZEYXRhKAogICAgICAgICAgICAgIGRhdGEubm9kZSwKICAgICAgICAgICAgICBuZXcgVHlwZWRlZlR5cGUoCiAgICAgICAgICAgICAgICAgIG5ld1R5cGVkZWYsCiAgICAgICAgICAgICAgICAgIG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQoCiAgICAgICAgICAgICAgICAgICAgICBkYXRhLm5vZGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoLCBjb25zdCBEeW5hbWljVHlwZSgpKSwKICAgICAgICAgICAgICAgICAgZ2V0RGFydFR5cGUoZGF0YS5ub2RlLnR5cGUpKSkpOwogICAgICBhc3NlcnQobmV3VHlwZWRlZi50eXBlZGVmSW5kZXggPT0gb2xkVHlwZWRlZi50eXBlZGVmSW5kZXgpOwogICAgfQogICAgZm9yIChpbnQgbWVtYmVySW5kZXggPSAwOwogICAgICAgIG1lbWJlckluZGV4IDwgX2VsZW1lbnRNYXAubWVtYmVycy5sZW5ndGg7CiAgICAgICAgbWVtYmVySW5kZXgrKykgewogICAgICBJbmRleGVkTWVtYmVyIG9sZE1lbWJlciA9IF9lbGVtZW50TWFwLm1lbWJlcnMuZ2V0RW50aXR5KG1lbWJlckluZGV4KTsKICAgICAgTWVtYmVyVXNhZ2UgbWVtYmVyVXNhZ2UgPSBsaXZlTWVtYmVyVXNhZ2Vbb2xkTWVtYmVyXTsKICAgICAgaWYgKG1lbWJlclVzYWdlID09IG51bGwpIHsKICAgICAgICBtZW1iZXJzLnNraXBJbmRleChvbGRNZW1iZXIubWVtYmVySW5kZXgpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIEtNZW1iZXJEYXRhIGRhdGEgPSBfZWxlbWVudE1hcC5tZW1iZXJzLmdldERhdGEob2xkTWVtYmVyKTsKICAgICAgSW5kZXhlZExpYnJhcnkgb2xkTGlicmFyeSA9IG9sZE1lbWJlci5saWJyYXJ5OwogICAgICBJbmRleGVkQ2xhc3Mgb2xkQ2xhc3MgPSBvbGRNZW1iZXIuZW5jbG9zaW5nQ2xhc3M7CiAgICAgIExpYnJhcnlFbnRpdHkgbmV3TGlicmFyeSA9IGxpYnJhcmllcy5nZXRFbnRpdHkob2xkTGlicmFyeS5saWJyYXJ5SW5kZXgpOwogICAgICBDbGFzc0VudGl0eSBuZXdDbGFzcyA9CiAgICAgICAgICBvbGRDbGFzcyAhPSBudWxsID8gY2xhc3Nlcy5nZXRFbnRpdHkob2xkQ2xhc3MuY2xhc3NJbmRleCkgOiBudWxsOwogICAgICBJbmRleGVkTWVtYmVyIG5ld01lbWJlciA9IGNvbnZlcnRNZW1iZXIoCiAgICAgICAgICBuZXdMaWJyYXJ5LCBuZXdDbGFzcywgb2xkTWVtYmVyLCBtZW1iZXJVc2FnZSwgYW5ub3RhdGlvbnMpOwogICAgICBtZW1iZXJzLnJlZ2lzdGVyKG5ld01lbWJlciwgZGF0YS5jb252ZXJ0KCkpOwogICAgICBhc3NlcnQoCiAgICAgICAgICBuZXdNZW1iZXIubWVtYmVySW5kZXggPT0gb2xkTWVtYmVyLm1lbWJlckluZGV4LAogICAgICAgICAgIk1lbWJlciBpbmRleCBtaXNtYXRjaDogIgogICAgICAgICAgIk9sZCBtZW1iZXIgJG9sZE1lbWJlciBoYXMgaW5kZXggJHtvbGRNZW1iZXIubWVtYmVySW5kZXh9ICIKICAgICAgICAgICJ3aGVyZWFzIG5ldyBtZW1iZXIgJG5ld01lbWJlciBoYXMgaW5kZXggJHtuZXdNZW1iZXIubWVtYmVySW5kZXh9Iik7CiAgICAgIGlmIChuZXdNZW1iZXIuaXNGaWVsZCkgewogICAgICAgIGZpZWxkTWFwW2RhdGEubm9kZV0gPSBuZXdNZW1iZXI7CiAgICAgIH0gZWxzZSBpZiAobmV3TWVtYmVyLmlzQ29uc3RydWN0b3IpIHsKICAgICAgICBjb25zdHJ1Y3Rvck1hcFtkYXRhLm5vZGVdID0gbmV3TWVtYmVyOwogICAgICB9IGVsc2UgewogICAgICAgIG1ldGhvZE1hcFtkYXRhLm5vZGVdID0gbmV3TWVtYmVyOwogICAgICB9CiAgICB9CiAgICBmb3IgKGludCB0eXBlVmFyaWFibGVJbmRleCA9IDA7CiAgICAgICAgdHlwZVZhcmlhYmxlSW5kZXggPCBfZWxlbWVudE1hcC50eXBlVmFyaWFibGVzLmxlbmd0aDsKICAgICAgICB0eXBlVmFyaWFibGVJbmRleCsrKSB7CiAgICAgIEluZGV4ZWRUeXBlVmFyaWFibGUgb2xkVHlwZVZhcmlhYmxlID0KICAgICAgICAgIF9lbGVtZW50TWFwLnR5cGVWYXJpYWJsZXMuZ2V0RW50aXR5KHR5cGVWYXJpYWJsZUluZGV4KTsKICAgICAgS1R5cGVWYXJpYWJsZURhdGEgb2xkVHlwZVZhcmlhYmxlRGF0YSA9CiAgICAgICAgICBfZWxlbWVudE1hcC50eXBlVmFyaWFibGVzLmdldERhdGEob2xkVHlwZVZhcmlhYmxlKTsKICAgICAgRW50aXR5IG5ld1R5cGVEZWNsYXJhdGlvbjsKICAgICAgaWYgKG9sZFR5cGVWYXJpYWJsZS50eXBlRGVjbGFyYXRpb24gaXMgQ2xhc3NFbnRpdHkpIHsKICAgICAgICBJbmRleGVkQ2xhc3MgY2xzID0gb2xkVHlwZVZhcmlhYmxlLnR5cGVEZWNsYXJhdGlvbjsKICAgICAgICBuZXdUeXBlRGVjbGFyYXRpb24gPSBjbGFzc2VzLmdldEVudGl0eShjbHMuY2xhc3NJbmRleCk7CiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU2tpcCB0eXBlIHZhcmlhYmxlcyBvZiB1bnVzZWQgY2xhc3Nlcy4KICAgICAgfSBlbHNlIGlmIChvbGRUeXBlVmFyaWFibGUudHlwZURlY2xhcmF0aW9uIGlzIE1lbWJlckVudGl0eSkgewogICAgICAgIEluZGV4ZWRNZW1iZXIgbWVtYmVyID0gb2xkVHlwZVZhcmlhYmxlLnR5cGVEZWNsYXJhdGlvbjsKICAgICAgICBuZXdUeXBlRGVjbGFyYXRpb24gPSBtZW1iZXJzLmdldEVudGl0eShtZW1iZXIubWVtYmVySW5kZXgpOwogICAgICAgIGlmIChuZXdUeXBlRGVjbGFyYXRpb24gPT0gbnVsbCkgewogICAgICAgICAgdHlwZVZhcmlhYmxlcy5za2lwSW5kZXgodHlwZVZhcmlhYmxlSW5kZXgpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydChvbGRUeXBlVmFyaWFibGUudHlwZURlY2xhcmF0aW9uIGlzIExvY2FsKTsKICAgICAgfQogICAgICBJbmRleGVkVHlwZVZhcmlhYmxlIG5ld1R5cGVWYXJpYWJsZSA9IGNyZWF0ZVR5cGVWYXJpYWJsZSgKICAgICAgICAgIG5ld1R5cGVEZWNsYXJhdGlvbiwgb2xkVHlwZVZhcmlhYmxlLm5hbWUsIG9sZFR5cGVWYXJpYWJsZS5pbmRleCk7CiAgICAgIHR5cGVWYXJpYWJsZU1hcFtvbGRUeXBlVmFyaWFibGVEYXRhLm5vZGVdID0KICAgICAgICAgIHR5cGVWYXJpYWJsZXMucmVnaXN0ZXI8SW5kZXhlZFR5cGVWYXJpYWJsZSwgSlR5cGVWYXJpYWJsZURhdGE+KAogICAgICAgICAgICAgIG5ld1R5cGVWYXJpYWJsZSwgb2xkVHlwZVZhcmlhYmxlRGF0YS5jb3B5KCkpOwogICAgICBhc3NlcnQobmV3VHlwZVZhcmlhYmxlLnR5cGVWYXJpYWJsZUluZGV4ID09CiAgICAgICAgICBvbGRUeXBlVmFyaWFibGUudHlwZVZhcmlhYmxlSW5kZXgpOwogICAgfQogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogV2Ugc2hvdWxkIGNsb3NlIHRoZSBlbnZpcm9ubWVudCBpbiB0aGUgYmVnaW5uaW5nIG9mCiAgICAvLyB0aGlzIGNvbnN0cnVjdG9yIGJ1dCBjdXJyZW50bHkgd2UgbmVlZCB0aGUgW01lbWJlckVudGl0eV0gdG8gcXVlcnkgaWYgdGhlCiAgICAvLyBtZW1iZXIgaXMgbGl2ZSwgdGh1cyBwb3RlbnRpYWxseSBjcmVhdGluZyB0aGUgW01lbWJlckVudGl0eV0gaW4gdGhlCiAgICAvLyBwcm9jZXNzLiBBdm9pZCB0aGlzLgogICAgX2VsZW1lbnRNYXAuZW52SXNDbG9zZWQgPSB0cnVlOwogIH0KCiAgSnNLZXJuZWxUb0VsZW1lbnRNYXAucmVhZEZyb21EYXRhU291cmNlKHRoaXMub3B0aW9ucywgdGhpcy5yZXBvcnRlciwKICAgICAgRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsIGlyLkNvbXBvbmVudCBjb21wb25lbnQsIERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBfZWxlbWVudEVudmlyb25tZW50ID0gbmV3IEpzRWxlbWVudEVudmlyb25tZW50KHRoaXMpOwogICAgX2NvbW1vbkVsZW1lbnRzID0gbmV3IENvbW1vbkVsZW1lbnRzSW1wbChfZWxlbWVudEVudmlyb25tZW50KTsKICAgIF9jb25zdGFudEVudmlyb25tZW50ID0gbmV3IEpzQ29uc3RhbnRFbnZpcm9ubWVudCh0aGlzLCBlbnZpcm9ubWVudCk7CiAgICBfdHlwZUNvbnZlcnRlciA9IG5ldyBEYXJ0VHlwZUNvbnZlcnRlcih0aGlzKTsKICAgIF90eXBlcyA9IG5ldyBLZXJuZWxEYXJ0VHlwZXModGhpcyk7CgogICAgc291cmNlLnJlZ2lzdGVyQ29tcG9uZW50TG9va3VwKG5ldyBDb21wb25lbnRMb29rdXAoY29tcG9uZW50KSk7CiAgICBfRW50aXR5TG9va3VwIGVudGl0eUxvb2t1cCA9IG5ldyBfRW50aXR5TG9va3VwKCk7CiAgICBzb3VyY2UucmVnaXN0ZXJFbnRpdHlMb29rdXAoZW50aXR5TG9va3VwKTsKCiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIHNvdXJjZS5iZWdpbihsaWJyYXJ5VGFnKTsKICAgIGludCBsaWJyYXJ5Q291bnQgPSBzb3VyY2UucmVhZEludCgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaWJyYXJ5Q291bnQ7IGkrKykgewogICAgICBpbnQgaW5kZXggPSBzb3VyY2UucmVhZEludCgpOwogICAgICBKTGlicmFyeSBsaWJyYXJ5ID0gbmV3IEpMaWJyYXJ5LnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBlbnRpdHlMb29rdXAucmVnaXN0ZXJMaWJyYXJ5KGluZGV4LCBsaWJyYXJ5KTsKICAgIH0KICAgIHNvdXJjZS5lbmQobGlicmFyeVRhZyk7CgogICAgc291cmNlLmJlZ2luKGNsYXNzVGFnKTsKICAgIGludCBjbGFzc0NvdW50ID0gc291cmNlLnJlYWRJbnQoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NDb3VudDsgaSsrKSB7CiAgICAgIGludCBpbmRleCA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICAgIEpDbGFzcyBjbHMgPSBuZXcgSkNsYXNzLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBlbnRpdHlMb29rdXAucmVnaXN0ZXJDbGFzcyhpbmRleCwgY2xzKTsKICAgIH0KICAgIHNvdXJjZS5lbmQoY2xhc3NUYWcpOwoKICAgIHNvdXJjZS5iZWdpbih0eXBlZGVmVGFnKTsKICAgIGludCB0eXBlZGVmQ291bnQgPSBzb3VyY2UucmVhZEludCgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlZGVmQ291bnQ7IGkrKykgewogICAgICBpbnQgaW5kZXggPSBzb3VyY2UucmVhZEludCgpOwogICAgICBKVHlwZWRlZiB0eXBlZGVmID0gbmV3IEpUeXBlZGVmLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBlbnRpdHlMb29rdXAucmVnaXN0ZXJUeXBlZGVmKGluZGV4LCB0eXBlZGVmKTsKICAgIH0KICAgIHNvdXJjZS5lbmQodHlwZWRlZlRhZyk7CgogICAgc291cmNlLmJlZ2luKG1lbWJlclRhZyk7CiAgICBpbnQgbWVtYmVyQ291bnQgPSBzb3VyY2UucmVhZEludCgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJDb3VudDsgaSsrKSB7CiAgICAgIGludCBpbmRleCA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICAgIEpNZW1iZXIgbWVtYmVyID0gbmV3IEpNZW1iZXIucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGVudGl0eUxvb2t1cC5yZWdpc3Rlck1lbWJlcihpbmRleCwgbWVtYmVyKTsKICAgIH0KICAgIHNvdXJjZS5lbmQobWVtYmVyVGFnKTsKCiAgICBzb3VyY2UuYmVnaW4odHlwZVZhcmlhYmxlVGFnKTsKICAgIGludCB0eXBlVmFyaWFibGVDb3VudCA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVWYXJpYWJsZUNvdW50OyBpKyspIHsKICAgICAgaW50IGluZGV4ID0gc291cmNlLnJlYWRJbnQoKTsKICAgICAgSlR5cGVWYXJpYWJsZSB0eXBlVmFyaWFibGUgPSBuZXcgSlR5cGVWYXJpYWJsZS5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgZW50aXR5TG9va3VwLnJlZ2lzdGVyVHlwZVZhcmlhYmxlKGluZGV4LCB0eXBlVmFyaWFibGUpOwogICAgfQogICAgc291cmNlLmVuZCh0eXBlVmFyaWFibGVUYWcpOwoKICAgIHByb2dyYW1FbnYgPSBuZXcgSlByb2dyYW1FbnYoW2NvbXBvbmVudF0pOwogICAgc291cmNlLmJlZ2luKGxpYnJhcnlEYXRhVGFnKTsKICAgIGVudGl0eUxvb2t1cC5mb3JFYWNoTGlicmFyeSgoaW50IGluZGV4LCBKTGlicmFyeSBsaWJyYXJ5KSB7CiAgICAgIEpMaWJyYXJ5RW52IGVudiA9IG5ldyBKTGlicmFyeUVudi5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgSkxpYnJhcnlEYXRhIGRhdGEgPSBuZXcgSkxpYnJhcnlEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBsaWJyYXJ5TWFwW2Vudi5saWJyYXJ5XSA9CiAgICAgICAgICBsaWJyYXJpZXMucmVnaXN0ZXJCeUluZGV4KGluZGV4LCBsaWJyYXJ5LCBkYXRhLCBlbnYpOwogICAgICBwcm9ncmFtRW52LnJlZ2lzdGVyTGlicmFyeShlbnYpOwogICAgICBhc3NlcnQoaW5kZXggPT0gbGlicmFyeS5saWJyYXJ5SW5kZXgpOwogICAgfSk7CiAgICBzb3VyY2UuZW5kKGxpYnJhcnlEYXRhVGFnKTsKCiAgICBzb3VyY2UuYmVnaW4oY2xhc3NEYXRhVGFnKTsKICAgIGVudGl0eUxvb2t1cC5mb3JFYWNoQ2xhc3MoKGludCBpbmRleCwgSkNsYXNzIGNscykgewogICAgICBKQ2xhc3NFbnYgZW52ID0gbmV3IEpDbGFzc0Vudi5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgSkNsYXNzRGF0YSBkYXRhID0gbmV3IEpDbGFzc0RhdGEucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNsYXNzTWFwW2Vudi5jbHNdID0gY2xhc3Nlcy5yZWdpc3RlckJ5SW5kZXgoaW5kZXgsIGNscywgZGF0YSwgZW52KTsKICAgICAgaWYgKGNscyBpcyEgSlJlY29yZCAmJiBjbHMgaXMhIEpDbG9zdXJlQ2xhc3MpIHsKICAgICAgICAvLyBTeW50aGVzaXplZCBjbGFzc2VzIGFyZSBub3QgcGFydCBvZiB0aGUgbGlicmFyeSBlbnZpcm9ubWVudC4KICAgICAgICBsaWJyYXJpZXMuZ2V0RW52KGNscy5saWJyYXJ5KS5yZWdpc3RlckNsYXNzKGNscy5uYW1lLCBlbnYpOwogICAgICB9CiAgICAgIGFzc2VydChpbmRleCA9PSBjbHMuY2xhc3NJbmRleCk7CiAgICB9KTsKICAgIHNvdXJjZS5lbmQoY2xhc3NEYXRhVGFnKTsKCiAgICBzb3VyY2UuYmVnaW4odHlwZWRlZkRhdGFUYWcpOwogICAgZW50aXR5TG9va3VwLmZvckVhY2hUeXBlZGVmKChpbnQgaW5kZXgsIEpUeXBlZGVmIHR5cGVkZWYpIHsKICAgICAgSlR5cGVkZWZEYXRhIGRhdGEgPSBuZXcgSlR5cGVkZWZEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICB0eXBlZGVmTWFwW2RhdGEubm9kZV0gPSB0eXBlZGVmcy5yZWdpc3RlckJ5SW5kZXgoaW5kZXgsIHR5cGVkZWYsIGRhdGEpOwogICAgICBhc3NlcnQoaW5kZXggPT0gdHlwZWRlZi50eXBlZGVmSW5kZXgpOwogICAgfSk7CiAgICBzb3VyY2UuZW5kKHR5cGVkZWZEYXRhVGFnKTsKCiAgICBzb3VyY2UuYmVnaW4obWVtYmVyRGF0YVRhZyk7CiAgICBlbnRpdHlMb29rdXAuZm9yRWFjaE1lbWJlcigoaW50IGluZGV4LCBJbmRleGVkTWVtYmVyIG1lbWJlcikgewogICAgICBKTWVtYmVyRGF0YSBkYXRhID0gbmV3IEpNZW1iZXJEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBtZW1iZXJzLnJlZ2lzdGVyQnlJbmRleChpbmRleCwgbWVtYmVyLCBkYXRhKTsKICAgICAgc3dpdGNoIChkYXRhLmRlZmluaXRpb24ua2luZCkgewogICAgICAgIGNhc2UgTWVtYmVyS2luZC5yZWd1bGFyOgogICAgICAgIGNhc2UgTWVtYmVyS2luZC5jb25zdHJ1Y3RvcjoKICAgICAgICAgIGlyLk1lbWJlciBub2RlID0gZGF0YS5kZWZpbml0aW9uLm5vZGU7CiAgICAgICAgICBpZiAobWVtYmVyLmlzRmllbGQpIHsKICAgICAgICAgICAgZmllbGRNYXBbbm9kZV0gPSBtZW1iZXI7CiAgICAgICAgICB9IGVsc2UgaWYgKG1lbWJlci5pc0NvbnN0cnVjdG9yKSB7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yTWFwW25vZGVdID0gbWVtYmVyOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbWV0aG9kTWFwW25vZGVdID0gbWVtYmVyOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgfQogICAgICBhc3NlcnQoaW5kZXggPT0gbWVtYmVyLm1lbWJlckluZGV4KTsKICAgIH0pOwogICAgc291cmNlLmVuZChtZW1iZXJEYXRhVGFnKTsKCiAgICBzb3VyY2UuYmVnaW4odHlwZVZhcmlhYmxlRGF0YVRhZyk7CiAgICBlbnRpdHlMb29rdXAuZm9yRWFjaFR5cGVWYXJpYWJsZSgoaW50IGluZGV4LCBKVHlwZVZhcmlhYmxlIHR5cGVWYXJpYWJsZSkgewogICAgICBKVHlwZVZhcmlhYmxlRGF0YSBkYXRhID0gbmV3IEpUeXBlVmFyaWFibGVEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICB0eXBlVmFyaWFibGVNYXBbZGF0YS5ub2RlXSA9CiAgICAgICAgICB0eXBlVmFyaWFibGVzLnJlZ2lzdGVyQnlJbmRleChpbmRleCwgdHlwZVZhcmlhYmxlLCBkYXRhKTsKICAgICAgYXNzZXJ0KGluZGV4ID09IHR5cGVWYXJpYWJsZS50eXBlVmFyaWFibGVJbmRleCk7CiAgICB9KTsKICAgIHNvdXJjZS5lbmQodHlwZVZhcmlhYmxlRGF0YVRhZyk7CgogICAgc291cmNlLmJlZ2luKG5lc3RlZENsb3N1cmVzVGFnKTsKICAgIF9uZXN0ZWRDbG9zdXJlTWFwLmFkZEFsbCgKICAgICAgICBzb3VyY2UucmVhZE1lbWJlck1hcCgoKSA9PiBzb3VyY2UucmVhZE1lbWJlcnM8SW5kZXhlZEZ1bmN0aW9uPigpKSk7CiAgICBzb3VyY2UuZW5kKG5lc3RlZENsb3N1cmVzVGFnKTsKCiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtKc1RvRWxlbWVudE1hcF0gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKCiAgICAvLyBTZXJpYWxpemUgdGhlIGVudGl0aWVzIGJlZm9yZSBzZXJpYWxpemluZyB0aGUgZGF0YS4KICAgIHNpbmsuYmVnaW4obGlicmFyeVRhZyk7CiAgICBzaW5rLndyaXRlSW50KGxpYnJhcmllcy5zaXplKTsKICAgIGxpYnJhcmllcy5mb3JFYWNoKChKTGlicmFyeSBsaWJyYXJ5LCBfLCBfXykgewogICAgICBzaW5rLndyaXRlSW50KGxpYnJhcnkubGlicmFyeUluZGV4KTsKICAgICAgbGlicmFyeS53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICB9KTsKICAgIHNpbmsuZW5kKGxpYnJhcnlUYWcpOwoKICAgIHNpbmsuYmVnaW4oY2xhc3NUYWcpOwogICAgc2luay53cml0ZUludChjbGFzc2VzLnNpemUpOwogICAgY2xhc3Nlcy5mb3JFYWNoKChKQ2xhc3MgY2xzLCBfLCBfXykgewogICAgICBzaW5rLndyaXRlSW50KGNscy5jbGFzc0luZGV4KTsKICAgICAgY2xzLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIH0pOwogICAgc2luay5lbmQoY2xhc3NUYWcpOwoKICAgIHNpbmsuYmVnaW4odHlwZWRlZlRhZyk7CiAgICBzaW5rLndyaXRlSW50KHR5cGVkZWZzLnNpemUpOwogICAgdHlwZWRlZnMuZm9yRWFjaCgoSlR5cGVkZWYgdHlwZWRlZiwgXykgewogICAgICBzaW5rLndyaXRlSW50KHR5cGVkZWYudHlwZWRlZkluZGV4KTsKICAgICAgdHlwZWRlZi53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICB9KTsKICAgIHNpbmsuZW5kKHR5cGVkZWZUYWcpOwoKICAgIHNpbmsuYmVnaW4obWVtYmVyVGFnKTsKICAgIHNpbmsud3JpdGVJbnQobWVtYmVycy5zaXplKTsKICAgIG1lbWJlcnMuZm9yRWFjaCgoSk1lbWJlciBtZW1iZXIsIF8pIHsKICAgICAgc2luay53cml0ZUludChtZW1iZXIubWVtYmVySW5kZXgpOwogICAgICBtZW1iZXIud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgfSk7CiAgICBzaW5rLmVuZChtZW1iZXJUYWcpOwoKICAgIHNpbmsuYmVnaW4odHlwZVZhcmlhYmxlVGFnKTsKICAgIHNpbmsud3JpdGVJbnQodHlwZVZhcmlhYmxlcy5zaXplKTsKICAgIHR5cGVWYXJpYWJsZXMuZm9yRWFjaCgoSlR5cGVWYXJpYWJsZSB0eXBlVmFyaWFibGUsIF8pIHsKICAgICAgc2luay53cml0ZUludCh0eXBlVmFyaWFibGUudHlwZVZhcmlhYmxlSW5kZXgpOwogICAgICB0eXBlVmFyaWFibGUud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgfSk7CiAgICBzaW5rLmVuZCh0eXBlVmFyaWFibGVUYWcpOwoKICAgIC8vIFNlcmlhbGl6ZSB0aGUgZW50aXR5IGRhdGEgYWZ0ZXIgaGF2aW5nIHNlcmlhbGl6ZWQgdGhlIGVudGl0aWVzLgogICAgc2luay5iZWdpbihsaWJyYXJ5RGF0YVRhZyk7CiAgICBsaWJyYXJpZXMuZm9yRWFjaCgoXywgSkxpYnJhcnlEYXRhIGRhdGEsIEpMaWJyYXJ5RW52IGVudikgewogICAgICBlbnYud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgICBkYXRhLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIH0pOwogICAgc2luay5lbmQobGlicmFyeURhdGFUYWcpOwoKICAgIHNpbmsuYmVnaW4oY2xhc3NEYXRhVGFnKTsKICAgIGNsYXNzZXMuZm9yRWFjaCgoXywgSkNsYXNzRGF0YSBkYXRhLCBKQ2xhc3NFbnYgZW52KSB7CiAgICAgIGVudi53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICAgIGRhdGEud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgfSk7CiAgICBzaW5rLmVuZChjbGFzc0RhdGFUYWcpOwoKICAgIHNpbmsuYmVnaW4odHlwZWRlZkRhdGFUYWcpOwogICAgdHlwZWRlZnMuZm9yRWFjaCgoXywgSlR5cGVkZWZEYXRhIGRhdGEpIHsKICAgICAgZGF0YS53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICB9KTsKICAgIHNpbmsuZW5kKHR5cGVkZWZEYXRhVGFnKTsKCiAgICBzaW5rLmJlZ2luKG1lbWJlckRhdGFUYWcpOwogICAgbWVtYmVycy5mb3JFYWNoKChfLCBKTWVtYmVyRGF0YSBkYXRhKSB7CiAgICAgIGRhdGEud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgfSk7CiAgICBzaW5rLmVuZChtZW1iZXJEYXRhVGFnKTsKCiAgICBzaW5rLmJlZ2luKHR5cGVWYXJpYWJsZURhdGFUYWcpOwogICAgdHlwZVZhcmlhYmxlcy5mb3JFYWNoKChfLCBKVHlwZVZhcmlhYmxlRGF0YSBkYXRhKSB7CiAgICAgIGRhdGEud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgfSk7CiAgICBzaW5rLmVuZCh0eXBlVmFyaWFibGVEYXRhVGFnKTsKCiAgICBzaW5rLmJlZ2luKG5lc3RlZENsb3N1cmVzVGFnKTsKICAgIHNpbmsud3JpdGVNZW1iZXJNYXAoX25lc3RlZENsb3N1cmVNYXAsIHNpbmsud3JpdGVNZW1iZXJzKTsKICAgIHNpbmsuZW5kKG5lc3RlZENsb3N1cmVzVGFnKTsKCiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGVzIGdldCB0eXBlcyA9PiBfdHlwZXM7CgogIEBvdmVycmlkZQogIEpzRWxlbWVudEVudmlyb25tZW50IGdldCBlbGVtZW50RW52aXJvbm1lbnQgPT4gX2VsZW1lbnRFbnZpcm9ubWVudDsKCiAgQG92ZXJyaWRlCiAgQ29tbW9uRWxlbWVudHNJbXBsIGdldCBjb21tb25FbGVtZW50cyA9PiBfY29tbW9uRWxlbWVudHM7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBfbWFpbkZ1bmN0aW9uIHsKICAgIHJldHVybiBwcm9ncmFtRW52Lm1haW5NZXRob2QgIT0gbnVsbAogICAgICAgID8gZ2V0TWV0aG9kSW50ZXJuYWwocHJvZ3JhbUVudi5tYWluTWV0aG9kKQogICAgICAgIDogbnVsbDsKICB9CgogIExpYnJhcnlFbnRpdHkgZ2V0IF9tYWluTGlicmFyeSB7CiAgICByZXR1cm4gcHJvZ3JhbUVudi5tYWluTWV0aG9kICE9IG51bGwKICAgICAgICA/IGdldExpYnJhcnlJbnRlcm5hbChwcm9ncmFtRW52Lm1haW5NZXRob2QuZW5jbG9zaW5nTGlicmFyeSkKICAgICAgICA6IG51bGw7CiAgfQoKICBTb3VyY2VTcGFuIGdldFNvdXJjZVNwYW4oU3Bhbm5hYmxlIHNwYW5uYWJsZSwgRW50aXR5IGN1cnJlbnRFbGVtZW50KSB7CiAgICBTb3VyY2VTcGFuIGZyb21TcGFubmFibGUoU3Bhbm5hYmxlIHNwYW5uYWJsZSkgewogICAgICBpZiAoc3Bhbm5hYmxlIGlzIEluZGV4ZWRMaWJyYXJ5ICYmCiAgICAgICAgICBzcGFubmFibGUubGlicmFyeUluZGV4IDwgbGlicmFyaWVzLmxlbmd0aCkgewogICAgICAgIEpMaWJyYXJ5RW52IGVudiA9IGxpYnJhcmllcy5nZXRFbnYoc3Bhbm5hYmxlKTsKICAgICAgICByZXR1cm4gY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUoZW52LmxpYnJhcnkpOwogICAgICB9IGVsc2UgaWYgKHNwYW5uYWJsZSBpcyBJbmRleGVkQ2xhc3MgJiYKICAgICAgICAgIHNwYW5uYWJsZS5jbGFzc0luZGV4IDwgY2xhc3Nlcy5sZW5ndGgpIHsKICAgICAgICBKQ2xhc3NEYXRhIGRhdGEgPSBjbGFzc2VzLmdldERhdGEoc3Bhbm5hYmxlKTsKICAgICAgICBhc3NlcnQoZGF0YSAhPSBudWxsLCAiTm8gZGF0YSBmb3IgJHNwYW5uYWJsZSBpbiAkdGhpcyIpOwogICAgICAgIHJldHVybiBkYXRhLmRlZmluaXRpb24ubG9jYXRpb247CiAgICAgIH0gZWxzZSBpZiAoc3Bhbm5hYmxlIGlzIEluZGV4ZWRNZW1iZXIgJiYKICAgICAgICAgIHNwYW5uYWJsZS5tZW1iZXJJbmRleCA8IG1lbWJlcnMubGVuZ3RoKSB7CiAgICAgICAgSk1lbWJlckRhdGEgZGF0YSA9IG1lbWJlcnMuZ2V0RGF0YShzcGFubmFibGUpOwogICAgICAgIGFzc2VydChkYXRhICE9IG51bGwsICJObyBkYXRhIGZvciAkc3Bhbm5hYmxlIGluICR0aGlzIik7CiAgICAgICAgcmV0dXJuIGRhdGEuZGVmaW5pdGlvbi5sb2NhdGlvbjsKICAgICAgfSBlbHNlIGlmIChzcGFubmFibGUgaXMgSkxvY2FsKSB7CiAgICAgICAgcmV0dXJuIGdldFNvdXJjZVNwYW4oc3Bhbm5hYmxlLm1lbWJlckNvbnRleHQsIGN1cnJlbnRFbGVtZW50KTsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBTb3VyY2VTcGFuIHNvdXJjZVNwYW4gPSBmcm9tU3Bhbm5hYmxlKHNwYW5uYWJsZSk7CiAgICBzb3VyY2VTcGFuID8/PSBmcm9tU3Bhbm5hYmxlKGN1cnJlbnRFbGVtZW50KTsKICAgIHJldHVybiBzb3VyY2VTcGFuOwogIH0KCiAgTGlicmFyeUVudGl0eSBsb29rdXBMaWJyYXJ5KFVyaSB1cmkpIHsKICAgIEpMaWJyYXJ5RW52IGxpYnJhcnlFbnYgPSBwcm9ncmFtRW52Lmxvb2t1cExpYnJhcnkodXJpKTsKICAgIGlmIChsaWJyYXJ5RW52ID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIGdldExpYnJhcnlJbnRlcm5hbChsaWJyYXJ5RW52LmxpYnJhcnksIGxpYnJhcnlFbnYpOwogIH0KCiAgU3RyaW5nIF9nZXRMaWJyYXJ5TmFtZShJbmRleGVkTGlicmFyeSBsaWJyYXJ5KSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkobGlicmFyeSkpOwogICAgSkxpYnJhcnlFbnYgbGlicmFyeUVudiA9IGxpYnJhcmllcy5nZXRFbnYobGlicmFyeSk7CiAgICByZXR1cm4gbGlicmFyeUVudi5saWJyYXJ5Lm5hbWUgPz8gJyc7CiAgfQoKICBNZW1iZXJFbnRpdHkgbG9va3VwTGlicmFyeU1lbWJlcihJbmRleGVkTGlicmFyeSBsaWJyYXJ5LCBTdHJpbmcgbmFtZSwKICAgICAge2Jvb2wgc2V0dGVyOiBmYWxzZX0pIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShsaWJyYXJ5KSk7CiAgICBKTGlicmFyeUVudiBsaWJyYXJ5RW52ID0gbGlicmFyaWVzLmdldEVudihsaWJyYXJ5KTsKICAgIGlyLk1lbWJlciBtZW1iZXIgPSBsaWJyYXJ5RW52Lmxvb2t1cE1lbWJlcihuYW1lLCBzZXR0ZXI6IHNldHRlcik7CiAgICByZXR1cm4gbWVtYmVyICE9IG51bGwgPyBnZXRNZW1iZXIobWVtYmVyKSA6IG51bGw7CiAgfQoKICB2b2lkIF9mb3JFYWNoTGlicmFyeU1lbWJlcigKICAgICAgSW5kZXhlZExpYnJhcnkgbGlicmFyeSwgdm9pZCBmKE1lbWJlckVudGl0eSBtZW1iZXIpKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkobGlicmFyeSkpOwogICAgSkxpYnJhcnlFbnYgbGlicmFyeUVudiA9IGxpYnJhcmllcy5nZXRFbnYobGlicmFyeSk7CiAgICBsaWJyYXJ5RW52LmZvckVhY2hNZW1iZXIoKGlyLk1lbWJlciBub2RlKSB7CiAgICAgIGYoZ2V0TWVtYmVyKG5vZGUpKTsKICAgIH0pOwogIH0KCiAgQ2xhc3NFbnRpdHkgbG9va3VwQ2xhc3MoSW5kZXhlZExpYnJhcnkgbGlicmFyeSwgU3RyaW5nIG5hbWUpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShsaWJyYXJ5KSk7CiAgICBKTGlicmFyeUVudiBsaWJyYXJ5RW52ID0gbGlicmFyaWVzLmdldEVudihsaWJyYXJ5KTsKICAgIEpDbGFzc0VudiBjbGFzc0VudiA9IGxpYnJhcnlFbnYubG9va3VwQ2xhc3MobmFtZSk7CiAgICBpZiAoY2xhc3NFbnYgIT0gbnVsbCkgewogICAgICByZXR1cm4gZ2V0Q2xhc3NJbnRlcm5hbChjbGFzc0Vudi5jbHMsIGNsYXNzRW52KTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCBfZm9yRWFjaENsYXNzKEluZGV4ZWRMaWJyYXJ5IGxpYnJhcnksIHZvaWQgZihDbGFzc0VudGl0eSBjbHMpKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkobGlicmFyeSkpOwogICAgSkxpYnJhcnlFbnYgbGlicmFyeUVudiA9IGxpYnJhcmllcy5nZXRFbnYobGlicmFyeSk7CiAgICBsaWJyYXJ5RW52LmZvckVhY2hDbGFzcygoSkNsYXNzRW52IGNsYXNzRW52KSB7CiAgICAgIGlmICghY2xhc3NFbnYuaXNVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbikgewogICAgICAgIGYoZ2V0Q2xhc3NJbnRlcm5hbChjbGFzc0Vudi5jbHMsIGNsYXNzRW52KSk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgTWVtYmVyRW50aXR5IGxvb2t1cENsYXNzTWVtYmVyKEluZGV4ZWRDbGFzcyBjbHMsIFN0cmluZyBuYW1lLAogICAgICB7Ym9vbCBzZXR0ZXI6IGZhbHNlfSkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgSkNsYXNzRW52IGNsYXNzRW52ID0gY2xhc3Nlcy5nZXRFbnYoY2xzKTsKICAgIHJldHVybiBjbGFzc0Vudi5sb29rdXBNZW1iZXIodGhpcywgbmFtZSwgc2V0dGVyOiBzZXR0ZXIpOwogIH0KCiAgQ29uc3RydWN0b3JFbnRpdHkgbG9va3VwQ29uc3RydWN0b3IoSW5kZXhlZENsYXNzIGNscywgU3RyaW5nIG5hbWUpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIEpDbGFzc0VudiBjbGFzc0VudiA9IGNsYXNzZXMuZ2V0RW52KGNscyk7CiAgICByZXR1cm4gY2xhc3NFbnYubG9va3VwQ29uc3RydWN0b3IodGhpcywgbmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGNyZWF0ZUludGVyZmFjZVR5cGUoCiAgICAgIGlyLkNsYXNzIGNscywgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykgewogICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlKGdldENsYXNzKGNscyksIGdldERhcnRUeXBlcyh0eXBlQXJndW1lbnRzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaWJyYXJ5RW50aXR5IGdldExpYnJhcnkoaXIuTGlicmFyeSBub2RlKSA9PiBnZXRMaWJyYXJ5SW50ZXJuYWwobm9kZSk7CgogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldENsYXNzKGlyLkNsYXNzIG5vZGUpID0+IGdldENsYXNzSW50ZXJuYWwobm9kZSk7CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0U3VwZXJUeXBlKEluZGV4ZWRDbGFzcyBjbHMpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIEpDbGFzc0RhdGEgZGF0YSA9IGNsYXNzZXMuZ2V0RGF0YShjbHMpOwogICAgX2Vuc3VyZVN1cGVydHlwZXMoY2xzLCBkYXRhKTsKICAgIHJldHVybiBkYXRhLnN1cGVydHlwZTsKICB9CgogIHZvaWQgX2Vuc3VyZVRoaXNBbmRSYXdUeXBlKENsYXNzRW50aXR5IGNscywgSkNsYXNzRGF0YSBkYXRhKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBpZiAoZGF0YSBpcyBKQ2xhc3NEYXRhSW1wbCAmJiBkYXRhLnRoaXNUeXBlID09IG51bGwpIHsKICAgICAgaXIuQ2xhc3Mgbm9kZSA9IGRhdGEuY2xzOwogICAgICBpZiAobm9kZS50eXBlUGFyYW1ldGVycy5pc0VtcHR5KSB7CiAgICAgICAgZGF0YS50aGlzVHlwZSA9CiAgICAgICAgICAgIGRhdGEucmF3VHlwZSA9IG5ldyBJbnRlcmZhY2VUeXBlKGNscywgY29uc3QgPERhcnRUeXBlPltdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkYXRhLnRoaXNUeXBlID0gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICAgIGNscywKICAgICAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmdlbmVyYXRlKG5vZGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoLAogICAgICAgICAgICAgICAgKGludCBpbmRleCkgewogICAgICAgICAgICAgIHJldHVybiBuZXcgVHlwZVZhcmlhYmxlVHlwZSgKICAgICAgICAgICAgICAgICAgZ2V0VHlwZVZhcmlhYmxlSW50ZXJuYWwobm9kZS50eXBlUGFyYW1ldGVyc1tpbmRleF0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIGRhdGEucmF3VHlwZSA9IG5ldyBJbnRlcmZhY2VUeXBlKAogICAgICAgICAgICBjbHMsCiAgICAgICAgICAgIG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQoCiAgICAgICAgICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwgY29uc3QgRHluYW1pY1R5cGUoKSkpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlVmFyaWFibGVFbnRpdHkgZ2V0VHlwZVZhcmlhYmxlKGlyLlR5cGVQYXJhbWV0ZXIgbm9kZSkgPT4KICAgICAgZ2V0VHlwZVZhcmlhYmxlSW50ZXJuYWwobm9kZSk7CgogIHZvaWQgX2Vuc3VyZVN1cGVydHlwZXMoQ2xhc3NFbnRpdHkgY2xzLCBKQ2xhc3NEYXRhIGRhdGEpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIGlmIChkYXRhIGlzIEpDbGFzc0RhdGFJbXBsICYmIGRhdGEub3JkZXJlZFR5cGVTZXQgPT0gbnVsbCkgewogICAgICBfZW5zdXJlVGhpc0FuZFJhd1R5cGUoY2xzLCBkYXRhKTsKCiAgICAgIGlyLkNsYXNzIG5vZGUgPSBkYXRhLmNsczsKCiAgICAgIGlmIChub2RlLnN1cGVydHlwZSA9PSBudWxsKSB7CiAgICAgICAgZGF0YS5vcmRlcmVkVHlwZVNldCA9IG5ldyBPcmRlcmVkVHlwZVNldC5zaW5nbGV0b24oZGF0YS50aGlzVHlwZSk7CiAgICAgICAgZGF0YS5pc01peGluQXBwbGljYXRpb24gPSBmYWxzZTsKICAgICAgICBkYXRhLmludGVyZmFjZXMgPSBjb25zdCA8SW50ZXJmYWNlVHlwZT5bXTsKICAgICAgfSBlbHNlIHsKICAgICAgICBJbnRlcmZhY2VUeXBlIHByb2Nlc3NTdXBlcnR5cGUoaXIuU3VwZXJ0eXBlIG5vZGUpIHsKICAgICAgICAgIEludGVyZmFjZVR5cGUgc3VwZXJ0eXBlID0gX3R5cGVDb252ZXJ0ZXIudmlzaXRTdXBlcnR5cGUobm9kZSk7CiAgICAgICAgICBJbmRleGVkQ2xhc3Mgc3VwZXJjbGFzcyA9IHN1cGVydHlwZS5lbGVtZW50OwogICAgICAgICAgSkNsYXNzRGF0YSBzdXBlcmRhdGEgPSBjbGFzc2VzLmdldERhdGEoc3VwZXJjbGFzcyk7CiAgICAgICAgICBfZW5zdXJlU3VwZXJ0eXBlcyhzdXBlcmNsYXNzLCBzdXBlcmRhdGEpOwogICAgICAgICAgcmV0dXJuIHN1cGVydHlwZTsKICAgICAgICB9CgogICAgICAgIEludGVyZmFjZVR5cGUgc3VwZXJ0eXBlOwogICAgICAgIExpbmtCdWlsZGVyPEludGVyZmFjZVR5cGU+IGxpbmtCdWlsZGVyID0KICAgICAgICAgICAgbmV3IExpbmtCdWlsZGVyPEludGVyZmFjZVR5cGU+KCk7CiAgICAgICAgaWYgKG5vZGUuaXNNaXhpbkRlY2xhcmF0aW9uKSB7CiAgICAgICAgICAvLyBBIG1peGluIGRlY2xhcmF0aW9uCiAgICAgICAgICAvLwogICAgICAgICAgLy8gICBtaXhpbiBNIG9uIEEsIEIsIEMge30KICAgICAgICAgIC8vCiAgICAgICAgICAvLyBpcyBlbmNvZGVkIGJ5IENGRSBhcwogICAgICAgICAgLy8KICAgICAgICAgIC8vICAgYWJzdHJhY3QgY2xhc3MgTSBleHRlbmRzIEEgaW1wbGVtZW50cyBCLCBDIHt9CiAgICAgICAgICAvLyAgIGFic3RyYWN0IGNsYXNzIE0gZXh0ZW5kcyBBJkImQyB7fQogICAgICAgICAgLy8KICAgICAgICAgIC8vIGJ1dCB3ZSBlbmNvZGUgaXQgYXMKICAgICAgICAgIC8vCiAgICAgICAgICAvLyAgIGFic3RyYWN0IGNsYXNzIE0gZXh0ZW5kcyBPYmplY3QgaW1wbGVtZW50cyBBLCBCLCBDIHt9CiAgICAgICAgICAvLwogICAgICAgICAgLy8gc28gd2UgbmVlZCBnZXQgdGhlIHN1cGVyY2xhc3NlcyBmcm9tIHRoZSBvbi1jbGF1c2UsIEEsIEIsIGFuZCBDLAogICAgICAgICAgLy8gdGhyb3VnaCBbc3VwZXJjbGFzc0NvbnN0cmFpbnRzXS4KICAgICAgICAgIGZvciAoaXIuU3VwZXJ0eXBlIGNvbnN0cmFpbnQgaW4gbm9kZS5zdXBlcmNsYXNzQ29uc3RyYWludHMoKSkgewogICAgICAgICAgICBsaW5rQnVpbGRlci5hZGRMYXN0KHByb2Nlc3NTdXBlcnR5cGUoY29uc3RyYWludCkpOwogICAgICAgICAgfQogICAgICAgICAgLy8gU2V0IHN1cGVyY2xhc3MgdG8gYE9iamVjdGAuCiAgICAgICAgICBzdXBlcnR5cGUgPSBfY29tbW9uRWxlbWVudHMub2JqZWN0VHlwZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3VwZXJ0eXBlID0gcHJvY2Vzc1N1cGVydHlwZShub2RlLnN1cGVydHlwZSk7CiAgICAgICAgfQogICAgICAgIGlmIChzdXBlcnR5cGUgPT0gX2NvbW1vbkVsZW1lbnRzLm9iamVjdFR5cGUpIHsKICAgICAgICAgIENsYXNzRW50aXR5IGRlZmF1bHRTdXBlcmNsYXNzID0KICAgICAgICAgICAgICBfY29tbW9uRWxlbWVudHMuZ2V0RGVmYXVsdFN1cGVyY2xhc3MoY2xzLCBuYXRpdmVCYXNpY0RhdGEpOwogICAgICAgICAgZGF0YS5zdXBlcnR5cGUgPSBfZWxlbWVudEVudmlyb25tZW50LmdldFJhd1R5cGUoZGVmYXVsdFN1cGVyY2xhc3MpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkYXRhLnN1cGVydHlwZSA9IHN1cGVydHlwZTsKICAgICAgICB9CiAgICAgICAgaWYgKG5vZGUubWl4ZWRJblR5cGUgIT0gbnVsbCkgewogICAgICAgICAgZGF0YS5pc01peGluQXBwbGljYXRpb24gPSB0cnVlOwogICAgICAgICAgbGlua0J1aWxkZXIKICAgICAgICAgICAgICAuYWRkTGFzdChkYXRhLm1peGVkSW5UeXBlID0gcHJvY2Vzc1N1cGVydHlwZShub2RlLm1peGVkSW5UeXBlKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRhdGEuaXNNaXhpbkFwcGxpY2F0aW9uID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIG5vZGUuaW1wbGVtZW50ZWRUeXBlcy5mb3JFYWNoKChpci5TdXBlcnR5cGUgc3VwZXJ0eXBlKSB7CiAgICAgICAgICBsaW5rQnVpbGRlci5hZGRMYXN0KHByb2Nlc3NTdXBlcnR5cGUoc3VwZXJ0eXBlKSk7CiAgICAgICAgfSk7CiAgICAgICAgTGluazxJbnRlcmZhY2VUeXBlPiBpbnRlcmZhY2VzID0KICAgICAgICAgICAgbGlua0J1aWxkZXIudG9MaW5rKGNvbnN0IExpbms8SW50ZXJmYWNlVHlwZT4oKSk7CiAgICAgICAgT3JkZXJlZFR5cGVTZXRCdWlsZGVyIHNldEJ1aWxkZXIgPQogICAgICAgICAgICBuZXcgS2VybmVsT3JkZXJlZFR5cGVTZXRCdWlsZGVyKHRoaXMsIGNscyk7CiAgICAgICAgZGF0YS5vcmRlcmVkVHlwZVNldCA9IHNldEJ1aWxkZXIuY3JlYXRlT3JkZXJlZFR5cGVTZXQoCiAgICAgICAgICAgIGRhdGEuc3VwZXJ0eXBlLCBpbnRlcmZhY2VzLnJldmVyc2UoY29uc3QgTGluazxJbnRlcmZhY2VUeXBlPigpKSk7CiAgICAgICAgZGF0YS5pbnRlcmZhY2VzID0gbmV3IExpc3Q8SW50ZXJmYWNlVHlwZT4uZnJvbShpbnRlcmZhY2VzLnRvTGlzdCgpKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZWRlZlR5cGUgZ2V0VHlwZWRlZlR5cGUoaXIuVHlwZWRlZiBub2RlKSB7CiAgICBJbmRleGVkVHlwZWRlZiB0eXBlZGVmID0gZ2V0VHlwZWRlZkludGVybmFsKG5vZGUpOwogICAgcmV0dXJuIHR5cGVkZWZzLmdldERhdGEodHlwZWRlZikucmF3VHlwZTsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlckVudGl0eSBnZXRNZW1iZXIoaXIuTWVtYmVyIG5vZGUpIHsKICAgIGlmIChub2RlIGlzIGlyLkZpZWxkKSB7CiAgICAgIHJldHVybiBnZXRGaWVsZEludGVybmFsKG5vZGUpOwogICAgfSBlbHNlIGlmIChub2RlIGlzIGlyLkNvbnN0cnVjdG9yKSB7CiAgICAgIHJldHVybiBnZXRDb25zdHJ1Y3RvckludGVybmFsKG5vZGUpOwogICAgfSBlbHNlIGlmIChub2RlIGlzIGlyLlByb2NlZHVyZSkgewogICAgICBpZiAobm9kZS5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuRmFjdG9yeSkgewogICAgICAgIHJldHVybiBnZXRDb25zdHJ1Y3RvckludGVybmFsKG5vZGUpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBnZXRNZXRob2RJbnRlcm5hbChub2RlKTsKICAgICAgfQogICAgfQogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuZXhwZWN0ZWQgbWVtYmVyOiAkbm9kZSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyRW50aXR5IGdldFN1cGVyTWVtYmVyKE1lbWJlckVudGl0eSBjb250ZXh0LCBpci5OYW1lIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2V9KSB7CiAgICAvLyBXZSBjYW4gbm8gbG9uZ2VyIHRydXN0IHRoZSBpbnRlcmZhY2UgdGFyZ2V0IG9mIHRoZSBzdXBlciBhY2Nlc3Mgc2luY2UgaXQKICAgIC8vIG1pZ2h0IGJlIGEgbWVtYmVyIHRoYXQgd2UgaGF2ZSBjbG9uZWQuCiAgICBDbGFzc0VudGl0eSBjbHMgPSBnZXRNZW1iZXJUaGlzVHlwZShjb250ZXh0KS5lbGVtZW50OwogICAgYXNzZXJ0KAogICAgICAgIGNscyAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KGNvbnRleHQsCiAgICAgICAgICAgICJObyBlbmNsb3NpbmcgY2xhc3MgZm9yIHN1cGVyIG1lbWJlciBhY2Nlc3MgaW4gJGNvbnRleHQuIikpOwogICAgSW5kZXhlZENsYXNzIHN1cGVyY2xhc3MgPSBnZXRTdXBlclR5cGUoY2xzKT8uZWxlbWVudDsKICAgIHdoaWxlIChzdXBlcmNsYXNzICE9IG51bGwpIHsKICAgICAgSkNsYXNzRW52IGVudiA9IGNsYXNzZXMuZ2V0RW52KHN1cGVyY2xhc3MpOwogICAgICBNZW1iZXJFbnRpdHkgc3VwZXJNZW1iZXIgPQogICAgICAgICAgZW52Lmxvb2t1cE1lbWJlcih0aGlzLCBuYW1lLm5hbWUsIHNldHRlcjogc2V0dGVyKTsKICAgICAgaWYgKHN1cGVyTWVtYmVyICE9IG51bGwpIHsKICAgICAgICBpZiAoIXN1cGVyTWVtYmVyLmlzSW5zdGFuY2VNZW1iZXIpIHJldHVybiBudWxsOwogICAgICAgIGlmICghc3VwZXJNZW1iZXIuaXNBYnN0cmFjdCkgewogICAgICAgICAgcmV0dXJuIHN1cGVyTWVtYmVyOwogICAgICAgIH0KICAgICAgfQogICAgICBzdXBlcmNsYXNzID0gZ2V0U3VwZXJUeXBlKHN1cGVyY2xhc3MpPy5lbGVtZW50OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdHJ1Y3RvckVudGl0eSBnZXRDb25zdHJ1Y3Rvcihpci5NZW1iZXIgbm9kZSkgPT4KICAgICAgZ2V0Q29uc3RydWN0b3JJbnRlcm5hbChub2RlKTsKCiAgQ29uc3RydWN0b3JFbnRpdHkgZ2V0U3VwZXJDb25zdHJ1Y3RvcigKICAgICAgaXIuQ29uc3RydWN0b3Igc291cmNlTm9kZSwgaXIuTWVtYmVyIHRhcmdldE5vZGUpIHsKICAgIENvbnN0cnVjdG9yRW50aXR5IHNvdXJjZSA9IGdldENvbnN0cnVjdG9yKHNvdXJjZU5vZGUpOwogICAgQ2xhc3NFbnRpdHkgc291cmNlQ2xhc3MgPSBzb3VyY2UuZW5jbG9zaW5nQ2xhc3M7CiAgICBDb25zdHJ1Y3RvckVudGl0eSB0YXJnZXQgPSBnZXRDb25zdHJ1Y3Rvcih0YXJnZXROb2RlKTsKICAgIENsYXNzRW50aXR5IHRhcmdldENsYXNzID0gdGFyZ2V0LmVuY2xvc2luZ0NsYXNzOwogICAgSW5kZXhlZENsYXNzIHN1cGVyQ2xhc3MgPSBnZXRTdXBlclR5cGUoc291cmNlQ2xhc3MpPy5lbGVtZW50OwogICAgaWYgKHN1cGVyQ2xhc3MgPT0gdGFyZ2V0Q2xhc3MpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIEpDbGFzc0VudiBlbnYgPSBjbGFzc2VzLmdldEVudihzdXBlckNsYXNzKTsKICAgIENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yID0gZW52Lmxvb2t1cENvbnN0cnVjdG9yKHRoaXMsIHRhcmdldC5uYW1lKTsKICAgIGlmIChjb25zdHJ1Y3RvciAhPSBudWxsKSB7CiAgICAgIHJldHVybiBjb25zdHJ1Y3RvcjsKICAgIH0KICAgIHRocm93IGZhaWxlZEF0KHNvdXJjZSwgIlN1cGVyIGNvbnN0cnVjdG9yIGZvciAkc291cmNlIG5vdCBmb3VuZC4iKTsKICB9CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldE1ldGhvZChpci5Qcm9jZWR1cmUgbm9kZSkgPT4gZ2V0TWV0aG9kSW50ZXJuYWwobm9kZSk7CgogIEBvdmVycmlkZQogIEZpZWxkRW50aXR5IGdldEZpZWxkKGlyLkZpZWxkIG5vZGUpID0+IGdldEZpZWxkSW50ZXJuYWwobm9kZSk7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldERhcnRUeXBlKGlyLkRhcnRUeXBlIHR5cGUpID0+IF90eXBlQ29udmVydGVyLmNvbnZlcnQodHlwZSk7CgogIEBvdmVycmlkZQogIFR5cGVWYXJpYWJsZVR5cGUgZ2V0VHlwZVZhcmlhYmxlVHlwZShpci5UeXBlUGFyYW1ldGVyVHlwZSB0eXBlKSA9PgogICAgICBnZXREYXJ0VHlwZSh0eXBlKTsKCiAgQG92ZXJyaWRlCiAgTGlzdDxEYXJ0VHlwZT4gZ2V0RGFydFR5cGVzKExpc3Q8aXIuRGFydFR5cGU+IHR5cGVzKSB7CiAgICBMaXN0PERhcnRUeXBlPiBsaXN0ID0gPERhcnRUeXBlPltdOwogICAgdHlwZXMuZm9yRWFjaCgoaXIuRGFydFR5cGUgdHlwZSkgewogICAgICBsaXN0LmFkZChnZXREYXJ0VHlwZSh0eXBlKSk7CiAgICB9KTsKICAgIHJldHVybiBsaXN0OwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXRJbnRlcmZhY2VUeXBlKGlyLkludGVyZmFjZVR5cGUgdHlwZSkgPT4KICAgICAgX3R5cGVDb252ZXJ0ZXIuY29udmVydCh0eXBlKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25UeXBlIGdldEZ1bmN0aW9uVHlwZShpci5GdW5jdGlvbk5vZGUgbm9kZSkgewogICAgRGFydFR5cGUgcmV0dXJuVHlwZTsKICAgIGlmIChub2RlLnBhcmVudCBpcyBpci5Db25zdHJ1Y3RvcikgewogICAgICAvLyBUaGUgcmV0dXJuIHR5cGUgb24gZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvcnMgaXMgYHZvaWRgLCBidXQgd2UgbmVlZAogICAgICAvLyBgZHluYW1pY2AgdHlwZSB0byBtYXRjaCB0aGUgZWxlbWVudCBtb2RlbC4KICAgICAgcmV0dXJuVHlwZSA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm5UeXBlID0gZ2V0RGFydFR5cGUobm9kZS5yZXR1cm5UeXBlKTsKICAgIH0KICAgIExpc3Q8RGFydFR5cGU+IHBhcmFtZXRlclR5cGVzID0gPERhcnRUeXBlPltdOwogICAgTGlzdDxEYXJ0VHlwZT4gb3B0aW9uYWxQYXJhbWV0ZXJUeXBlcyA9IDxEYXJ0VHlwZT5bXTsKCiAgICBEYXJ0VHlwZSBnZXRQYXJhbWV0ZXJUeXBlKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpIHsKICAgICAgaWYgKHZhcmlhYmxlLmlzQ292YXJpYW50IHx8IHZhcmlhYmxlLmlzR2VuZXJpY0NvdmFyaWFudEltcGwpIHsKICAgICAgICAvLyBBIGNvdmFyaWFudCBwYXJhbWV0ZXIgaGFzIHR5cGUgYE9iamVjdGAgaW4gdGhlIG1ldGhvZCBzaWduYXR1cmUuCiAgICAgICAgcmV0dXJuIGNvbW1vbkVsZW1lbnRzLm9iamVjdFR5cGU7CiAgICAgIH0KICAgICAgcmV0dXJuIGdldERhcnRUeXBlKHZhcmlhYmxlLnR5cGUpOwogICAgfQoKICAgIGZvciAoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSBpbiBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgIGlmIChwYXJhbWV0ZXJUeXBlcy5sZW5ndGggPT0gbm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50KSB7CiAgICAgICAgb3B0aW9uYWxQYXJhbWV0ZXJUeXBlcy5hZGQoZ2V0UGFyYW1ldGVyVHlwZSh2YXJpYWJsZSkpOwogICAgICB9IGVsc2UgewogICAgICAgIHBhcmFtZXRlclR5cGVzLmFkZChnZXRQYXJhbWV0ZXJUeXBlKHZhcmlhYmxlKSk7CiAgICAgIH0KICAgIH0KICAgIExpc3Q8U3RyaW5nPiBuYW1lZFBhcmFtZXRlcnMgPSA8U3RyaW5nPltdOwogICAgTGlzdDxEYXJ0VHlwZT4gbmFtZWRQYXJhbWV0ZXJUeXBlcyA9IDxEYXJ0VHlwZT5bXTsKICAgIExpc3Q8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4gc29ydGVkTmFtZWRQYXJhbWV0ZXJzID0KICAgICAgICBub2RlLm5hbWVkUGFyYW1ldGVycy50b0xpc3QoKS4uc29ydCgoYSwgYikgPT4gYS5uYW1lLmNvbXBhcmVUbyhiLm5hbWUpKTsKICAgIGZvciAoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSBpbiBzb3J0ZWROYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgbmFtZWRQYXJhbWV0ZXJzLmFkZCh2YXJpYWJsZS5uYW1lKTsKICAgICAgbmFtZWRQYXJhbWV0ZXJUeXBlcy5hZGQoZ2V0UGFyYW1ldGVyVHlwZSh2YXJpYWJsZSkpOwogICAgfQogICAgTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4gdHlwZVZhcmlhYmxlczsKICAgIGlmIChub2RlLnR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZVBhcmFtZXRlcnMgPSA8RGFydFR5cGU+W107CiAgICAgIGZvciAoaXIuVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyIGluIG5vZGUudHlwZVBhcmFtZXRlcnMpIHsKICAgICAgICB0eXBlUGFyYW1ldGVycwogICAgICAgICAgICAuYWRkKGdldERhcnRUeXBlKG5ldyBpci5UeXBlUGFyYW1ldGVyVHlwZSh0eXBlUGFyYW1ldGVyKSkpOwogICAgICB9CiAgICAgIHR5cGVWYXJpYWJsZXMgPSBuZXcgTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4uZ2VuZXJhdGUoCiAgICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwKICAgICAgICAgIChpbnQgaW5kZXgpID0+IG5ldyBGdW5jdGlvblR5cGVWYXJpYWJsZShpbmRleCkpOwoKICAgICAgRGFydFR5cGUgc3Vic3QoRGFydFR5cGUgdHlwZSkgewogICAgICAgIHJldHVybiB0eXBlLnN1YnN0KHR5cGVWYXJpYWJsZXMsIHR5cGVQYXJhbWV0ZXJzKTsKICAgICAgfQoKICAgICAgcmV0dXJuVHlwZSA9IHN1YnN0KHJldHVyblR5cGUpOwogICAgICBwYXJhbWV0ZXJUeXBlcyA9IHBhcmFtZXRlclR5cGVzLm1hcChzdWJzdCkudG9MaXN0KCk7CiAgICAgIG9wdGlvbmFsUGFyYW1ldGVyVHlwZXMgPSBvcHRpb25hbFBhcmFtZXRlclR5cGVzLm1hcChzdWJzdCkudG9MaXN0KCk7CiAgICAgIG5hbWVkUGFyYW1ldGVyVHlwZXMgPSBuYW1lZFBhcmFtZXRlclR5cGVzLm1hcChzdWJzdCkudG9MaXN0KCk7CiAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCB0eXBlVmFyaWFibGVzLmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgIHR5cGVWYXJpYWJsZXNbaW5kZXhdLmJvdW5kID0KICAgICAgICAgICAgc3Vic3QoZ2V0RGFydFR5cGUobm9kZS50eXBlUGFyYW1ldGVyc1tpbmRleF0uYm91bmQpKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdHlwZVZhcmlhYmxlcyA9IGNvbnN0IDxGdW5jdGlvblR5cGVWYXJpYWJsZT5bXTsKICAgIH0KCiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uVHlwZShyZXR1cm5UeXBlLCBwYXJhbWV0ZXJUeXBlcywgb3B0aW9uYWxQYXJhbWV0ZXJUeXBlcywKICAgICAgICBuYW1lZFBhcmFtZXRlcnMsIG5hbWVkUGFyYW1ldGVyVHlwZXMsIHR5cGVWYXJpYWJsZXMpOwogIH0KCiAgQ29uc3RhbnRWYWx1ZSBjb21wdXRlQ29uc3RhbnRWYWx1ZSgKICAgICAgU3Bhbm5hYmxlIHNwYW5uYWJsZSwgQ29uc3RhbnRFeHByZXNzaW9uIGNvbnN0YW50LAogICAgICB7Ym9vbCByZXF1aXJlQ29uc3RhbnQ6IHRydWV9KSB7CiAgICByZXR1cm4gX2NvbnN0YW50RW52aXJvbm1lbnQuX2dldENvbnN0YW50VmFsdWUoc3Bhbm5hYmxlLCBjb25zdGFudCwKICAgICAgICBjb25zdGFudFJlcXVpcmVkOiByZXF1aXJlQ29uc3RhbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgc3Vic3RCeUNvbnRleHQoRGFydFR5cGUgdHlwZSwgSW50ZXJmYWNlVHlwZSBjb250ZXh0KSB7CiAgICByZXR1cm4gdHlwZS5zdWJzdCgKICAgICAgICBjb250ZXh0LnR5cGVBcmd1bWVudHMsIGdldFRoaXNUeXBlKGNvbnRleHQuZWxlbWVudCkudHlwZUFyZ3VtZW50cyk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgYGNhbGxgIG1ldGhvZCBvbiAndHlwZScuCiAgLy8vCiAgLy8vIElmIFt0eXBlXSBkb2Vzbid0IGhhdmUgYSBgY2FsbGAgbWVtYmVyIGBudWxsYCBpcyByZXR1cm5lZC4gSWYgW3R5cGVdIGhhcwogIC8vLyBhbiBpbnZhbGlkIGBjYWxsYCBtZW1iZXIgKG5vbi1tZXRob2Qgb3IgYSBzeW50aGVzaXplZCBtZXRob2Qgd2l0aCBib3RoCiAgLy8vIG9wdGlvbmFsIGFuZCBuYW1lZCBwYXJhbWV0ZXJzKSBhIFtEeW5hbWljVHlwZV0gaXMgcmV0dXJuZWQuCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0Q2FsbFR5cGUoSW50ZXJmYWNlVHlwZSB0eXBlKSB7CiAgICBJbmRleGVkQ2xhc3MgY2xzID0gdHlwZS5lbGVtZW50OwogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgSkNsYXNzRGF0YSBkYXRhID0gY2xhc3Nlcy5nZXREYXRhKGNscyk7CiAgICBpZiAoZGF0YS5jYWxsVHlwZSAhPSBudWxsKSB7CiAgICAgIHJldHVybiBzdWJzdEJ5Q29udGV4dChkYXRhLmNhbGxUeXBlLCB0eXBlKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXRUaGlzVHlwZShJbmRleGVkQ2xhc3MgY2xzKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBKQ2xhc3NEYXRhIGRhdGEgPSBjbGFzc2VzLmdldERhdGEoY2xzKTsKICAgIF9lbnN1cmVUaGlzQW5kUmF3VHlwZShjbHMsIGRhdGEpOwogICAgcmV0dXJuIGRhdGEudGhpc1R5cGU7CiAgfQoKICBJbnRlcmZhY2VUeXBlIF9nZXRSYXdUeXBlKEluZGV4ZWRDbGFzcyBjbHMpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIEpDbGFzc0RhdGEgZGF0YSA9IGNsYXNzZXMuZ2V0RGF0YShjbHMpOwogICAgX2Vuc3VyZVRoaXNBbmRSYXdUeXBlKGNscywgZGF0YSk7CiAgICByZXR1cm4gZGF0YS5yYXdUeXBlOwogIH0KCiAgRnVuY3Rpb25UeXBlIF9nZXRGdW5jdGlvblR5cGUoSW5kZXhlZEZ1bmN0aW9uIGZ1bmN0aW9uKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoZnVuY3Rpb24pKTsKICAgIEZ1bmN0aW9uRGF0YSBkYXRhID0gbWVtYmVycy5nZXREYXRhKGZ1bmN0aW9uKTsKICAgIHJldHVybiBkYXRhLmdldEZ1bmN0aW9uVHlwZSh0aGlzKTsKICB9CgogIExpc3Q8VHlwZVZhcmlhYmxlVHlwZT4gX2dldEZ1bmN0aW9uVHlwZVZhcmlhYmxlcyhJbmRleGVkRnVuY3Rpb24gZnVuY3Rpb24pIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShmdW5jdGlvbikpOwogICAgRnVuY3Rpb25EYXRhIGRhdGEgPSBtZW1iZXJzLmdldERhdGEoZnVuY3Rpb24pOwogICAgcmV0dXJuIGRhdGEuZ2V0RnVuY3Rpb25UeXBlVmFyaWFibGVzKHRoaXMpOwogIH0KCiAgRGFydFR5cGUgX2dldEZpZWxkVHlwZShJbmRleGVkRmllbGQgZmllbGQpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShmaWVsZCkpOwogICAgSkZpZWxkRGF0YSBkYXRhID0gbWVtYmVycy5nZXREYXRhKGZpZWxkKTsKICAgIHJldHVybiBkYXRhLmdldEZpZWxkVHlwZSh0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldFR5cGVWYXJpYWJsZUJvdW5kKEluZGV4ZWRUeXBlVmFyaWFibGUgdHlwZVZhcmlhYmxlKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkodHlwZVZhcmlhYmxlKSk7CiAgICBKVHlwZVZhcmlhYmxlRGF0YSBkYXRhID0gdHlwZVZhcmlhYmxlcy5nZXREYXRhKHR5cGVWYXJpYWJsZSk7CiAgICByZXR1cm4gZGF0YS5nZXRCb3VuZCh0aGlzKTsKICB9CgogIERhcnRUeXBlIF9nZXRUeXBlVmFyaWFibGVEZWZhdWx0VHlwZShJbmRleGVkVHlwZVZhcmlhYmxlIHR5cGVWYXJpYWJsZSkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KHR5cGVWYXJpYWJsZSkpOwogICAgSlR5cGVWYXJpYWJsZURhdGEgZGF0YSA9IHR5cGVWYXJpYWJsZXMuZ2V0RGF0YSh0eXBlVmFyaWFibGUpOwogICAgcmV0dXJuIGRhdGEuZ2V0RGVmYXVsdFR5cGUodGhpcyk7CiAgfQoKICBDbGFzc0VudGl0eSBnZXRBcHBsaWVkTWl4aW4oSW5kZXhlZENsYXNzIGNscykgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgSkNsYXNzRGF0YSBkYXRhID0gY2xhc3Nlcy5nZXREYXRhKGNscyk7CiAgICBfZW5zdXJlU3VwZXJ0eXBlcyhjbHMsIGRhdGEpOwogICAgcmV0dXJuIGRhdGEubWl4ZWRJblR5cGU/LmVsZW1lbnQ7CiAgfQoKICBib29sIF9pc01peGluQXBwbGljYXRpb24oSW5kZXhlZENsYXNzIGNscykgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgSkNsYXNzRGF0YSBkYXRhID0gY2xhc3Nlcy5nZXREYXRhKGNscyk7CiAgICBfZW5zdXJlU3VwZXJ0eXBlcyhjbHMsIGRhdGEpOwogICAgcmV0dXJuIGRhdGEuaXNNaXhpbkFwcGxpY2F0aW9uOwogIH0KCiAgYm9vbCBfaXNVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbihJbmRleGVkQ2xhc3MgY2xzKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBKQ2xhc3NFbnYgZW52ID0gY2xhc3Nlcy5nZXRFbnYoY2xzKTsKICAgIHJldHVybiBlbnYuaXNVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbjsKICB9CgogIGJvb2wgX2lzU3VwZXJNaXhpbkFwcGxpY2F0aW9uKEluZGV4ZWRDbGFzcyBjbHMpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIEpDbGFzc0VudiBlbnYgPSBjbGFzc2VzLmdldEVudihjbHMpOwogICAgcmV0dXJuIGVudi5pc1N1cGVyTWl4aW5BcHBsaWNhdGlvbjsKICB9CgogIHZvaWQgX2ZvckVhY2hTdXBlcnR5cGUoSW5kZXhlZENsYXNzIGNscywgdm9pZCBmKEludGVyZmFjZVR5cGUgc3VwZXJ0eXBlKSkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgSkNsYXNzRGF0YSBkYXRhID0gY2xhc3Nlcy5nZXREYXRhKGNscyk7CiAgICBfZW5zdXJlU3VwZXJ0eXBlcyhjbHMsIGRhdGEpOwogICAgZGF0YS5vcmRlcmVkVHlwZVNldC5zdXBlcnR5cGVzLmZvckVhY2goZik7CiAgfQoKICB2b2lkIF9mb3JFYWNoQ29uc3RydWN0b3IoSW5kZXhlZENsYXNzIGNscywgdm9pZCBmKENvbnN0cnVjdG9yRW50aXR5IG1lbWJlcikpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIEpDbGFzc0VudiBlbnYgPSBjbGFzc2VzLmdldEVudihjbHMpOwogICAgZW52LmZvckVhY2hDb25zdHJ1Y3Rvcih0aGlzLCBmKTsKICB9CgogIHZvaWQgX2ZvckVhY2hMb2NhbENsYXNzTWVtYmVyKEluZGV4ZWRDbGFzcyBjbHMsIHZvaWQgZihNZW1iZXJFbnRpdHkgbWVtYmVyKSkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgSkNsYXNzRW52IGVudiA9IGNsYXNzZXMuZ2V0RW52KGNscyk7CiAgICBlbnYuZm9yRWFjaE1lbWJlcih0aGlzLCAoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgICBmKG1lbWJlcik7CiAgICB9KTsKICB9CgogIHZvaWQgX2ZvckVhY2hDbGFzc01lbWJlcigKICAgICAgSW5kZXhlZENsYXNzIGNscywgdm9pZCBmKENsYXNzRW50aXR5IGNscywgTWVtYmVyRW50aXR5IG1lbWJlcikpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIEpDbGFzc0VudiBlbnYgPSBjbGFzc2VzLmdldEVudihjbHMpOwogICAgZW52LmZvckVhY2hNZW1iZXIodGhpcywgKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgICAgZihjbHMsIG1lbWJlcik7CiAgICB9KTsKICAgIEpDbGFzc0RhdGEgZGF0YSA9IGNsYXNzZXMuZ2V0RGF0YShjbHMpOwogICAgX2Vuc3VyZVN1cGVydHlwZXMoY2xzLCBkYXRhKTsKICAgIGlmIChkYXRhLnN1cGVydHlwZSAhPSBudWxsKSB7CiAgICAgIF9mb3JFYWNoQ2xhc3NNZW1iZXIoZGF0YS5zdXBlcnR5cGUuZWxlbWVudCwgZik7CiAgICB9CiAgfQoKICBDb25zdGFudENvbnN0cnVjdG9yIF9nZXRDb25zdHJ1Y3RvckNvbnN0YW50KEluZGV4ZWRDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcikgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNvbnN0cnVjdG9yKSk7CiAgICBKQ29uc3RydWN0b3JEYXRhIGRhdGEgPSBtZW1iZXJzLmdldERhdGEoY29uc3RydWN0b3IpOwogICAgcmV0dXJuIGRhdGEuZ2V0Q29uc3RydWN0b3JDb25zdGFudCh0aGlzLCBjb25zdHJ1Y3Rvcik7CiAgfQoKICBDb25zdGFudEV4cHJlc3Npb24gX2dldEZpZWxkQ29uc3RhbnRFeHByZXNzaW9uKEluZGV4ZWRGaWVsZCBmaWVsZCkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGZpZWxkKSk7CiAgICBKRmllbGREYXRhIGRhdGEgPSBtZW1iZXJzLmdldERhdGEoZmllbGQpOwogICAgcmV0dXJuIGRhdGEuZ2V0RmllbGRDb25zdGFudEV4cHJlc3Npb24odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGFzSW5zdGFuY2VPZihJbnRlcmZhY2VUeXBlIHR5cGUsIENsYXNzRW50aXR5IGNscykgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgT3JkZXJlZFR5cGVTZXQgb3JkZXJlZFR5cGVTZXQgPSBnZXRPcmRlcmVkVHlwZVNldCh0eXBlLmVsZW1lbnQpOwogICAgSW50ZXJmYWNlVHlwZSBzdXBlcnR5cGUgPQogICAgICAgIG9yZGVyZWRUeXBlU2V0LmFzSW5zdGFuY2VPZihjbHMsIGdldEhpZXJhcmNoeURlcHRoKGNscykpOwogICAgaWYgKHN1cGVydHlwZSAhPSBudWxsKSB7CiAgICAgIHN1cGVydHlwZSA9IHN1YnN0QnlDb250ZXh0KHN1cGVydHlwZSwgdHlwZSk7CiAgICB9CiAgICByZXR1cm4gc3VwZXJ0eXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgT3JkZXJlZFR5cGVTZXQgZ2V0T3JkZXJlZFR5cGVTZXQoSW5kZXhlZENsYXNzIGNscykgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgSkNsYXNzRGF0YSBkYXRhID0gY2xhc3Nlcy5nZXREYXRhKGNscyk7CiAgICBfZW5zdXJlU3VwZXJ0eXBlcyhjbHMsIGRhdGEpOwogICAgcmV0dXJuIGRhdGEub3JkZXJlZFR5cGVTZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0SGllcmFyY2h5RGVwdGgoSW5kZXhlZENsYXNzIGNscykgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgSkNsYXNzRGF0YSBkYXRhID0gY2xhc3Nlcy5nZXREYXRhKGNscyk7CiAgICBfZW5zdXJlU3VwZXJ0eXBlcyhjbHMsIGRhdGEpOwogICAgcmV0dXJuIGRhdGEub3JkZXJlZFR5cGVTZXQubWF4RGVwdGg7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxJbnRlcmZhY2VUeXBlPiBnZXRJbnRlcmZhY2VzKEluZGV4ZWRDbGFzcyBjbHMpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIEpDbGFzc0RhdGEgZGF0YSA9IGNsYXNzZXMuZ2V0RGF0YShjbHMpOwogICAgX2Vuc3VyZVN1cGVydHlwZXMoY2xzLCBkYXRhKTsKICAgIHJldHVybiBkYXRhLmludGVyZmFjZXM7CiAgfQoKICBNZW1iZXJEZWZpbml0aW9uIGdldE1lbWJlckRlZmluaXRpb25JbnRlcm5hbChjb3ZhcmlhbnQgSW5kZXhlZE1lbWJlciBtZW1iZXIpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShtZW1iZXIpKTsKICAgIHJldHVybiBtZW1iZXJzLmdldERhdGEobWVtYmVyKS5kZWZpbml0aW9uOwogIH0KCiAgQ2xhc3NEZWZpbml0aW9uIGdldENsYXNzRGVmaW5pdGlvbkludGVybmFsKGNvdmFyaWFudCBJbmRleGVkQ2xhc3MgY2xzKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICByZXR1cm4gY2xhc3Nlcy5nZXREYXRhKGNscykuZGVmaW5pdGlvbjsKICB9CgogIEBvdmVycmlkZQogIEltcG9ydEVudGl0eSBnZXRJbXBvcnQoaXIuTGlicmFyeURlcGVuZGVuY3kgbm9kZSkgewogICAgaXIuTGlicmFyeSBsaWJyYXJ5ID0gbm9kZS5wYXJlbnQ7CiAgICBKTGlicmFyeURhdGEgZGF0YSA9IGxpYnJhcmllcy5nZXREYXRhKGdldExpYnJhcnlJbnRlcm5hbChsaWJyYXJ5KSk7CiAgICByZXR1cm4gZGF0YS5pbXBvcnRzW25vZGVdOwogIH0KCiAgaXIuVHlwZUVudmlyb25tZW50IGdldCB0eXBlRW52aXJvbm1lbnQgewogICAgaWYgKF90eXBlRW52aXJvbm1lbnQgPT0gbnVsbCkgewogICAgICBfdHlwZUVudmlyb25tZW50ID8/PSBuZXcgaXIuVHlwZUVudmlyb25tZW50KAogICAgICAgICAgbmV3IGlyLkNvcmVUeXBlcyhwcm9ncmFtRW52Lm1haW5Db21wb25lbnQpLCBjbGFzc0hpZXJhcmNoeSk7CiAgICB9CiAgICByZXR1cm4gX3R5cGVFbnZpcm9ubWVudDsKICB9CgogIGlyLkNsYXNzSGllcmFyY2h5IGdldCBjbGFzc0hpZXJhcmNoeSB7CiAgICBpZiAoX2NsYXNzSGllcmFyY2h5ID09IG51bGwpIHsKICAgICAgX2NsYXNzSGllcmFyY2h5ID8/PSBuZXcgaXIuQ2xhc3NIaWVyYXJjaHkocHJvZ3JhbUVudi5tYWluQ29tcG9uZW50KTsKICAgIH0KICAgIHJldHVybiBfY2xhc3NIaWVyYXJjaHk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdGF0aWNUeXBlUHJvdmlkZXIgZ2V0U3RhdGljVHlwZVByb3ZpZGVyKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIE1lbWJlckRlZmluaXRpb24gbWVtYmVyRGVmaW5pdGlvbiA9IG1lbWJlcnMuZ2V0RGF0YShtZW1iZXIpLmRlZmluaXRpb247CiAgICBNYXA8aXIuRXhwcmVzc2lvbiwgaXIuRGFydFR5cGU+IGNhY2hlZFN0YXRpY1R5cGVzOwogICAgaXIuSW50ZXJmYWNlVHlwZSB0aGlzVHlwZTsKICAgIHN3aXRjaCAobWVtYmVyRGVmaW5pdGlvbi5raW5kKSB7CiAgICAgIGNhc2UgTWVtYmVyS2luZC5yZWd1bGFyOgogICAgICBjYXNlIE1lbWJlcktpbmQuY29uc3RydWN0b3I6CiAgICAgIGNhc2UgTWVtYmVyS2luZC5jb25zdHJ1Y3RvckJvZHk6CiAgICAgICAgaXIuTWVtYmVyIG5vZGUgPSBtZW1iZXJEZWZpbml0aW9uLm5vZGU7CiAgICAgICAgdGhpc1R5cGUgPSBub2RlLmVuY2xvc2luZ0NsYXNzPy50aGlzVHlwZTsKICAgICAgICBjYWNoZWRTdGF0aWNUeXBlcyA9IG1lbWJlcnMuZ2V0RGF0YShtZW1iZXIpLnN0YXRpY1R5cGVzOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE1lbWJlcktpbmQuY2xvc3VyZUNhbGw6CiAgICAgICAgaXIuVHJlZU5vZGUgbm9kZSA9IG1lbWJlckRlZmluaXRpb24ubm9kZTsKICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7CiAgICAgICAgICBpZiAobm9kZSBpcyBpci5NZW1iZXIpIHsKICAgICAgICAgICAgaXIuTWVtYmVyIG1lbWJlciA9IG5vZGU7CiAgICAgICAgICAgIHRoaXNUeXBlID0gbWVtYmVyLmVuY2xvc2luZ0NsYXNzPy50aGlzVHlwZTsKICAgICAgICAgICAgY2FjaGVkU3RhdGljVHlwZXMgPSBtZW1iZXJzLmdldERhdGEoZ2V0TWVtYmVyKG1lbWJlcikpLnN0YXRpY1R5cGVzOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudDsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTWVtYmVyS2luZC5jbG9zdXJlRmllbGQ6CiAgICAgIGNhc2UgTWVtYmVyS2luZC5zaWduYXR1cmU6CiAgICAgIGNhc2UgTWVtYmVyS2luZC5nZW5lcmF0b3JCb2R5OgogICAgICAgIGNhY2hlZFN0YXRpY1R5cGVzID0gY29uc3Qge307CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgYXNzZXJ0KGNhY2hlZFN0YXRpY1R5cGVzICE9IG51bGwsICJObyBzdGF0aWMgdHlwZXMgY2FjaGVkIGZvciAkbWVtYmVyLiIpOwogICAgcmV0dXJuIG5ldyBDYWNoZWRTdGF0aWNUeXBlKHR5cGVFbnZpcm9ubWVudCwgY2FjaGVkU3RhdGljVHlwZXMsCiAgICAgICAgbmV3IFRoaXNJbnRlcmZhY2VUeXBlLmZyb20odGhpc1R5cGUpKTsKICB9CgogIEBvdmVycmlkZQogIE5hbWUgZ2V0TmFtZShpci5OYW1lIG5hbWUpIHsKICAgIHJldHVybiBuZXcgTmFtZSgKICAgICAgICBuYW1lLm5hbWUsIG5hbWUuaXNQcml2YXRlID8gZ2V0TGlicmFyeShuYW1lLmxpYnJhcnkpIDogbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDYWxsU3RydWN0dXJlIGdldENhbGxTdHJ1Y3R1cmUoaXIuQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgaW50IGFyZ3VtZW50Q291bnQgPSBhcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGggKyBhcmd1bWVudHMubmFtZWQubGVuZ3RoOwogICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzID0gYXJndW1lbnRzLm5hbWVkLm1hcCgoZSkgPT4gZS5uYW1lKS50b0xpc3QoKTsKICAgIHJldHVybiBuZXcgQ2FsbFN0cnVjdHVyZSgKICAgICAgICBhcmd1bWVudENvdW50LCBuYW1lZEFyZ3VtZW50cywgYXJndW1lbnRzLnR5cGVzLmxlbmd0aCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTZWxlY3RvciBnZXRTZWxlY3Rvcihpci5FeHByZXNzaW9uIG5vZGUpIHsKICAgIC8vIFRPRE8oZWZvcnR1bmEpOiBUaGlzIGlzIHNjcmVhbWluZyBmb3IgYSBjb21tb24gaW50ZXJmYWNlIGJldHdlZW4KICAgIC8vIFByb3BlcnR5R2V0IGFuZCBTdXBlclByb3BlcnR5R2V0IChhbmQgc2FtZSBmb3IgKkdldCkuIFRhbGsgdG8ga2VybmVsCiAgICAvLyBmb2xrcy4KICAgIGlmIChub2RlIGlzIGlyLlByb3BlcnR5R2V0KSB7CiAgICAgIHJldHVybiBnZXRHZXR0ZXJTZWxlY3Rvcihub2RlLm5hbWUpOwogICAgfQogICAgaWYgKG5vZGUgaXMgaXIuRGlyZWN0UHJvcGVydHlHZXQpIHsKICAgICAgcmV0dXJuIGdldEdldHRlclNlbGVjdG9yKG5vZGUudGFyZ2V0Lm5hbWUpOwogICAgfQogICAgaWYgKG5vZGUgaXMgaXIuU3VwZXJQcm9wZXJ0eUdldCkgewogICAgICByZXR1cm4gZ2V0R2V0dGVyU2VsZWN0b3Iobm9kZS5uYW1lKTsKICAgIH0KICAgIGlmIChub2RlIGlzIGlyLlByb3BlcnR5U2V0KSB7CiAgICAgIHJldHVybiBnZXRTZXR0ZXJTZWxlY3Rvcihub2RlLm5hbWUpOwogICAgfQogICAgaWYgKG5vZGUgaXMgaXIuU3VwZXJQcm9wZXJ0eVNldCkgewogICAgICByZXR1cm4gZ2V0U2V0dGVyU2VsZWN0b3Iobm9kZS5uYW1lKTsKICAgIH0KICAgIGlmIChub2RlIGlzIGlyLkludm9jYXRpb25FeHByZXNzaW9uKSB7CiAgICAgIHJldHVybiBnZXRJbnZvY2F0aW9uU2VsZWN0b3Iobm9kZSk7CiAgICB9CiAgICB0aHJvdyBmYWlsZWRBdCgKICAgICAgICBDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICJDYW4gb25seSBnZXQgdGhlIHNlbGVjdG9yIGZvciBhIHByb3BlcnR5IGdldCBvciBhbiBpbnZvY2F0aW9uOiAiCiAgICAgICAgIiR7bm9kZX0iKTsKICB9CgogIFNlbGVjdG9yIGdldEludm9jYXRpb25TZWxlY3Rvcihpci5JbnZvY2F0aW9uRXhwcmVzc2lvbiBpbnZvY2F0aW9uKSB7CiAgICBOYW1lIG5hbWUgPSBnZXROYW1lKGludm9jYXRpb24ubmFtZSk7CiAgICBTZWxlY3RvcktpbmQga2luZDsKICAgIGlmIChTZWxlY3Rvci5pc09wZXJhdG9yTmFtZShuYW1lLnRleHQpKSB7CiAgICAgIGlmIChuYW1lID09IE5hbWVzLklOREVYX05BTUUgfHwgbmFtZSA9PSBOYW1lcy5JTkRFWF9TRVRfTkFNRSkgewogICAgICAgIGtpbmQgPSBTZWxlY3RvcktpbmQuSU5ERVg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAga2luZCA9IFNlbGVjdG9yS2luZC5PUEVSQVRPUjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAga2luZCA9IFNlbGVjdG9yS2luZC5DQUxMOwogICAgfQoKICAgIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSA9IGdldENhbGxTdHJ1Y3R1cmUoaW52b2NhdGlvbi5hcmd1bWVudHMpOwogICAgcmV0dXJuIG5ldyBTZWxlY3RvcihraW5kLCBuYW1lLCBjYWxsU3RydWN0dXJlKTsKICB9CgogIFNlbGVjdG9yIGdldEdldHRlclNlbGVjdG9yKGlyLk5hbWUgaXJOYW1lKSB7CiAgICBOYW1lIG5hbWUgPSBuZXcgTmFtZSgKICAgICAgICBpck5hbWUubmFtZSwgaXJOYW1lLmlzUHJpdmF0ZSA/IGdldExpYnJhcnkoaXJOYW1lLmxpYnJhcnkpIDogbnVsbCk7CiAgICByZXR1cm4gbmV3IFNlbGVjdG9yLmdldHRlcihuYW1lKTsKICB9CgogIFNlbGVjdG9yIGdldFNldHRlclNlbGVjdG9yKGlyLk5hbWUgaXJOYW1lKSB7CiAgICBOYW1lIG5hbWUgPSBuZXcgTmFtZSgKICAgICAgICBpck5hbWUubmFtZSwgaXJOYW1lLmlzUHJpdmF0ZSA/IGdldExpYnJhcnkoaXJOYW1lLmxpYnJhcnkpIDogbnVsbCk7CiAgICByZXR1cm4gbmV3IFNlbGVjdG9yLnNldHRlcihuYW1lKTsKICB9CgogIC8vLyBMb29rcyB1cCBbdHlwZU5hbWVdIGZvciB1c2UgaW4gdGhlIHNwZWMtc3RyaW5nIG9mIGEgYEpTYCBjYWxsLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSB0aGlzIGluIFtuYXRpdmUuTmF0aXZlQmVoYXZpb3JdIGluc3RlYWQgb2YgY2FsbGluZwogIC8vIHRoZSBgRm9yZWlnblJlc29sdmVyYC4KICBUeXBlTG9va3VwIHR5cGVMb29rdXAoe2Jvb2wgcmVzb2x2ZUFzUmF3OiB0cnVlfSkgewogICAgcmV0dXJuIHJlc29sdmVBc1JhdwogICAgICAgID8gKF9jYWNoZWRUeXBlTG9va3VwUmF3ID8/PSBfdHlwZUxvb2t1cChyZXNvbHZlQXNSYXc6IHRydWUpKQogICAgICAgIDogKF9jYWNoZWRUeXBlTG9va3VwRnVsbCA/Pz0gX3R5cGVMb29rdXAocmVzb2x2ZUFzUmF3OiBmYWxzZSkpOwogIH0KCiAgVHlwZUxvb2t1cCBfY2FjaGVkVHlwZUxvb2t1cFJhdzsKICBUeXBlTG9va3VwIF9jYWNoZWRUeXBlTG9va3VwRnVsbDsKCiAgVHlwZUxvb2t1cCBfdHlwZUxvb2t1cCh7Ym9vbCByZXNvbHZlQXNSYXc6IHRydWV9KSB7CiAgICBib29sIGNhY2hlZE1heUxvb2t1cEluTWFpbjsKICAgIGJvb2wgbWF5TG9va3VwSW5NYWluKCkgewogICAgICB2YXIgbWFpblVyaSA9IGVsZW1lbnRFbnZpcm9ubWVudC5tYWluTGlicmFyeS5jYW5vbmljYWxVcmk7CiAgICAgIC8vIFRlc3RzIHBlcm1pdCBsb29rdXAgb3V0c2lkZSBvZiBkYXJ0OiBsaWJyYXJpZXMuCiAgICAgIHJldHVybiBtYWluVXJpLnBhdGguY29udGFpbnMoJ3Rlc3RzL2NvbXBpbGVyL2RhcnQyanNfbmF0aXZlJykgfHwKICAgICAgICAgIG1haW5VcmkucGF0aC5jb250YWlucygndGVzdHMvY29tcGlsZXIvZGFydDJqc19leHRyYScpOwogICAgfQoKICAgIERhcnRUeXBlIGxvb2t1cChTdHJpbmcgdHlwZU5hbWUsIHtib29sIHJlcXVpcmVkfSkgewogICAgICBEYXJ0VHlwZSBmaW5kSW5MaWJyYXJ5KExpYnJhcnlFbnRpdHkgbGlicmFyeSkgewogICAgICAgIGlmIChsaWJyYXJ5ICE9IG51bGwpIHsKICAgICAgICAgIENsYXNzRW50aXR5IGNscyA9IGVsZW1lbnRFbnZpcm9ubWVudC5sb29rdXBDbGFzcyhsaWJyYXJ5LCB0eXBlTmFtZSk7CiAgICAgICAgICBpZiAoY2xzICE9IG51bGwpIHsKICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQWxpZ24gc2VtYW50aWNzLgogICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUFzUmF3CiAgICAgICAgICAgICAgICA/IGVsZW1lbnRFbnZpcm9ubWVudC5nZXRSYXdUeXBlKGNscykKICAgICAgICAgICAgICAgIDogZWxlbWVudEVudmlyb25tZW50LmdldFRoaXNUeXBlKGNscyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CgogICAgICBEYXJ0VHlwZSBmaW5kSW4oVXJpIHVyaSkgewogICAgICAgIHJldHVybiBmaW5kSW5MaWJyYXJ5KGVsZW1lbnRFbnZpcm9ubWVudC5sb29rdXBMaWJyYXJ5KHVyaSkpOwogICAgICB9CgogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBOYXJyb3cgdGhlIHNldCBvZiBsb29rdXBzIGJhc2VkIG9uIHRoZSBkZXBlbmRpbmcKICAgICAgLy8gbGlicmFyeS4KICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ2FjaGUgbW9yZSByZXN1bHRzIHRvIGF2b2lkIHJlZHVuZGFudCBsb29rdXBzPwogICAgICBEYXJ0VHlwZSB0eXBlOwogICAgICBpZiAoY2FjaGVkTWF5TG9va3VwSW5NYWluID8/PSBtYXlMb29rdXBJbk1haW4oKSkgewogICAgICAgIHR5cGUgPz89IGZpbmRJbkxpYnJhcnkoZWxlbWVudEVudmlyb25tZW50Lm1haW5MaWJyYXJ5KTsKICAgICAgfQogICAgICB0eXBlID8/PSBmaW5kSW4oVXJpcy5kYXJ0X2NvcmUpOwogICAgICB0eXBlID8/PSBmaW5kSW4oVXJpcy5kYXJ0X19qc19oZWxwZXIpOwogICAgICB0eXBlID8/PSBmaW5kSW4oVXJpcy5kYXJ0X19pbnRlcmNlcHRvcnMpOwogICAgICB0eXBlID8/PSBmaW5kSW4oVXJpcy5kYXJ0X19uYXRpdmVfdHlwZWRfZGF0YSk7CiAgICAgIHR5cGUgPz89IGZpbmRJbihVcmlzLmRhcnRfY29sbGVjdGlvbik7CiAgICAgIHR5cGUgPz89IGZpbmRJbihVcmlzLmRhcnRfbWF0aCk7CiAgICAgIHR5cGUgPz89IGZpbmRJbihVcmlzLmRhcnRfaHRtbCk7CiAgICAgIHR5cGUgPz89IGZpbmRJbihVcmlzLmRhcnRfaHRtbF9jb21tb24pOwogICAgICB0eXBlID8/PSBmaW5kSW4oVXJpcy5kYXJ0X3N2Zyk7CiAgICAgIHR5cGUgPz89IGZpbmRJbihVcmlzLmRhcnRfd2ViX2F1ZGlvKTsKICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF93ZWJfZ2wpOwogICAgICB0eXBlID8/PSBmaW5kSW4oVXJpcy5kYXJ0X3dlYl9zcWwpOwogICAgICB0eXBlID8/PSBmaW5kSW4oVXJpcy5kYXJ0X2luZGV4ZWRfZGIpOwogICAgICB0eXBlID8/PSBmaW5kSW4oVXJpcy5kYXJ0X3R5cGVkX2RhdGEpOwogICAgICB0eXBlID8/PSBmaW5kSW4oVXJpcy5kYXJ0X21pcnJvcnMpOwogICAgICBpZiAodHlwZSA9PSBudWxsICYmIHJlcXVpcmVkKSB7CiAgICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgICAgIE1lc3NhZ2VLaW5kLkdFTkVSSUMsIHsndGV4dCc6ICJUeXBlICckdHlwZU5hbWUnIG5vdCBmb3VuZC4ifSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHR5cGU7CiAgICB9CgogICAgcmV0dXJuIGxvb2t1cDsKICB9CgogIFN0cmluZyBfZ2V0U3RyaW5nQXJndW1lbnQoaXIuU3RhdGljSW52b2NhdGlvbiBub2RlLCBpbnQgaW5kZXgpIHsKICAgIHJldHVybiBub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsW2luZGV4XS5hY2NlcHQobmV3IFN0cmluZ2lmaWVyKCkpOwogIH0KCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ2FjaGUgdGhpcyBmb3IgbGF0ZXIgdXNlLgogIEBvdmVycmlkZQogIE5hdGl2ZUJlaGF2aW9yIGdldE5hdGl2ZUJlaGF2aW9yRm9ySnNDYWxsKGlyLlN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgaWYgKG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoIDwgMiB8fAogICAgICAgIG5vZGUuYXJndW1lbnRzLm5hbWVkLmlzTm90RW1wdHkpIHsKICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwgTWVzc2FnZUtpbmQuV1JPTkdfQVJHVU1FTlRfRk9SX0pTKTsKICAgICAgcmV0dXJuIG5ldyBOYXRpdmVCZWhhdmlvcigpOwogICAgfQogICAgU3RyaW5nIHNwZWNTdHJpbmcgPSBfZ2V0U3RyaW5nQXJndW1lbnQobm9kZSwgMCk7CiAgICBpZiAoc3BlY1N0cmluZyA9PSBudWxsKSB7CiAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsIE1lc3NhZ2VLaW5kLldST05HX0FSR1VNRU5UX0ZPUl9KU19GSVJTVCk7CiAgICAgIHJldHVybiBuZXcgTmF0aXZlQmVoYXZpb3IoKTsKICAgIH0KCiAgICBTdHJpbmcgY29kZVN0cmluZyA9IF9nZXRTdHJpbmdBcmd1bWVudChub2RlLCAxKTsKICAgIGlmIChjb2RlU3RyaW5nID09IG51bGwpIHsKICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwgTWVzc2FnZUtpbmQuV1JPTkdfQVJHVU1FTlRfRk9SX0pTX1NFQ09ORCk7CiAgICAgIHJldHVybiBuZXcgTmF0aXZlQmVoYXZpb3IoKTsKICAgIH0KCiAgICByZXR1cm4gTmF0aXZlQmVoYXZpb3Iub2ZKc0NhbGwoCiAgICAgICAgc3BlY1N0cmluZywKICAgICAgICBjb2RlU3RyaW5nLAogICAgICAgIHR5cGVMb29rdXAocmVzb2x2ZUFzUmF3OiB0cnVlKSwKICAgICAgICBDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgIHJlcG9ydGVyLAogICAgICAgIGNvbW1vbkVsZW1lbnRzKTsKICB9CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENhY2hlIHRoaXMgZm9yIGxhdGVyIHVzZS4KICBAb3ZlcnJpZGUKICBOYXRpdmVCZWhhdmlvciBnZXROYXRpdmVCZWhhdmlvckZvckpzQnVpbHRpbkNhbGwoaXIuU3RhdGljSW52b2NhdGlvbiBub2RlKSB7CiAgICBpZiAobm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGggPCAxKSB7CiAgICAgIHJlcG9ydGVyLmludGVybmFsRXJyb3IoCiAgICAgICAgICBDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLCAiSlMgYnVpbHRpbiBleHByZXNzaW9uIGhhcyBubyB0eXBlLiIpOwogICAgICByZXR1cm4gbmV3IE5hdGl2ZUJlaGF2aW9yKCk7CiAgICB9CiAgICBpZiAobm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGggPCAyKSB7CiAgICAgIHJlcG9ydGVyLmludGVybmFsRXJyb3IoCiAgICAgICAgICBDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLCAiSlMgYnVpbHRpbiBpcyBtaXNzaW5nIG5hbWUuIik7CiAgICAgIHJldHVybiBuZXcgTmF0aXZlQmVoYXZpb3IoKTsKICAgIH0KICAgIFN0cmluZyBzcGVjU3RyaW5nID0gX2dldFN0cmluZ0FyZ3VtZW50KG5vZGUsIDApOwogICAgaWYgKHNwZWNTdHJpbmcgPT0gbnVsbCkgewogICAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKAogICAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwgIlVuZXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQuIik7CiAgICAgIHJldHVybiBuZXcgTmF0aXZlQmVoYXZpb3IoKTsKICAgIH0KICAgIHJldHVybiBOYXRpdmVCZWhhdmlvci5vZkpzQnVpbHRpbkNhbGwoCiAgICAgICAgc3BlY1N0cmluZywKICAgICAgICB0eXBlTG9va3VwKHJlc29sdmVBc1JhdzogdHJ1ZSksCiAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICByZXBvcnRlciwKICAgICAgICBjb21tb25FbGVtZW50cyk7CiAgfQoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDYWNoZSB0aGlzIGZvciBsYXRlciB1c2UuCiAgQG92ZXJyaWRlCiAgTmF0aXZlQmVoYXZpb3IgZ2V0TmF0aXZlQmVoYXZpb3JGb3JKc0VtYmVkZGVkR2xvYmFsQ2FsbCgKICAgICAgaXIuU3RhdGljSW52b2NhdGlvbiBub2RlKSB7CiAgICBpZiAobm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGggPCAxKSB7CiAgICAgIHJlcG9ydGVyLmludGVybmFsRXJyb3IoQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICAgICJKUyBlbWJlZGRlZCBnbG9iYWwgZXhwcmVzc2lvbiBoYXMgbm8gdHlwZS4iKTsKICAgICAgcmV0dXJuIG5ldyBOYXRpdmVCZWhhdmlvcigpOwogICAgfQogICAgaWYgKG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoIDwgMikgewogICAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKAogICAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwgIkpTIGVtYmVkZGVkIGdsb2JhbCBpcyBtaXNzaW5nIG5hbWUuIik7CiAgICAgIHJldHVybiBuZXcgTmF0aXZlQmVoYXZpb3IoKTsKICAgIH0KICAgIGlmIChub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA+IDIgfHwKICAgICAgICBub2RlLmFyZ3VtZW50cy5uYW1lZC5pc05vdEVtcHR5KSB7CiAgICAgIHJlcG9ydGVyLmludGVybmFsRXJyb3IoQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICAgICJKUyBlbWJlZGRlZCBnbG9iYWwgaGFzIG1vcmUgdGhhbiAyIGFyZ3VtZW50cy4iKTsKICAgICAgcmV0dXJuIG5ldyBOYXRpdmVCZWhhdmlvcigpOwogICAgfQogICAgU3RyaW5nIHNwZWNTdHJpbmcgPSBfZ2V0U3RyaW5nQXJndW1lbnQobm9kZSwgMCk7CiAgICBpZiAoc3BlY1N0cmluZyA9PSBudWxsKSB7CiAgICAgIHJlcG9ydGVyLmludGVybmFsRXJyb3IoCiAgICAgICAgICBDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLCAiVW5leHBlY3RlZCBmaXJzdCBhcmd1bWVudC4iKTsKICAgICAgcmV0dXJuIG5ldyBOYXRpdmVCZWhhdmlvcigpOwogICAgfQogICAgcmV0dXJuIE5hdGl2ZUJlaGF2aW9yLm9mSnNFbWJlZGRlZEdsb2JhbENhbGwoCiAgICAgICAgc3BlY1N0cmluZywKICAgICAgICB0eXBlTG9va3VwKHJlc29sdmVBc1JhdzogdHJ1ZSksCiAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICByZXBvcnRlciwKICAgICAgICBjb21tb25FbGVtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBqcy5OYW1lIGdldE5hbWVGb3JKc0dldE5hbWUoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgTmFtZXIgbmFtZXIpIHsKICAgIGludCBpbmRleCA9IGV4dHJhY3RFbnVtSW5kZXhGcm9tQ29uc3RhbnRWYWx1ZSgKICAgICAgICBjb25zdGFudCwgY29tbW9uRWxlbWVudHMuanNHZXROYW1lRW51bSk7CiAgICBpZiAoaW5kZXggPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gbmFtZXIuZ2V0TmFtZUZvckpzR2V0TmFtZSgKICAgICAgICBDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLCBKc0dldE5hbWUudmFsdWVzW2luZGV4XSk7CiAgfQoKICBpbnQgZXh0cmFjdEVudW1JbmRleEZyb21Db25zdGFudFZhbHVlKAogICAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50LCBDbGFzc0VudGl0eSBjbGFzc0VsZW1lbnQpIHsKICAgIGlmIChjb25zdGFudCBpcyBDb25zdHJ1Y3RlZENvbnN0YW50VmFsdWUpIHsKICAgICAgaWYgKGNvbnN0YW50LnR5cGUuZWxlbWVudCA9PSBjbGFzc0VsZW1lbnQpIHsKICAgICAgICBhc3NlcnQoY29uc3RhbnQuZmllbGRzLmxlbmd0aCA9PSAxIHx8IGNvbnN0YW50LmZpZWxkcy5sZW5ndGggPT0gMik7CiAgICAgICAgQ29uc3RhbnRWYWx1ZSBpbmRleENvbnN0YW50ID0gY29uc3RhbnQuZmllbGRzLnZhbHVlcy5maXJzdDsKICAgICAgICBpZiAoaW5kZXhDb25zdGFudCBpcyBJbnRDb25zdGFudFZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gaW5kZXhDb25zdGFudC5pbnRWYWx1ZS50b0ludCgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGdldENvbnN0YW50VmFsdWUoaXIuRXhwcmVzc2lvbiBub2RlLAogICAgICB7Ym9vbCByZXF1aXJlQ29uc3RhbnQ6IHRydWUsIGJvb2wgaW1wbGljaXROdWxsOiBmYWxzZX0pIHsKICAgIGlmIChub2RlIGlzIGlyLkNvbnN0YW50RXhwcmVzc2lvbikgewogICAgICByZXR1cm4gbm9kZS5jb25zdGFudC5hY2NlcHQobmV3IENvbnN0YW50VmFsdWVmaWVyKHRoaXMpKTsKICAgIH0KCiAgICBDb25zdGFudEV4cHJlc3Npb24gY29uc3RhbnQ7CiAgICBpZiAobm9kZSA9PSBudWxsKSB7CiAgICAgIGlmICghaW1wbGljaXROdWxsKSB7CiAgICAgICAgdGhyb3cgZmFpbGVkQXQoCiAgICAgICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsICdObyBleHByZXNzaW9uIGZvciBjb25zdGFudC4nKTsKICAgICAgfQogICAgICBjb25zdGFudCA9IG5ldyBOdWxsQ29uc3RhbnRFeHByZXNzaW9uKCk7CiAgICB9IGVsc2UgewogICAgICBjb25zdGFudCA9CiAgICAgICAgICBuZXcgQ29uc3RhbnRpZmllcih0aGlzLCByZXF1aXJlQ29uc3RhbnQ6IHJlcXVpcmVDb25zdGFudCkudmlzaXQobm9kZSk7CiAgICB9CiAgICBpZiAoY29uc3RhbnQgPT0gbnVsbCkgewogICAgICBpZiAocmVxdWlyZUNvbnN0YW50KSB7CiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAgICdObyBjb25zdGFudCBmb3IgJHtEZWJ1Z1ByaW50ZXIucHJldHR5UHJpbnQobm9kZSl9Jyk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBDb25zdGFudFZhbHVlIHZhbHVlID0gY29tcHV0ZUNvbnN0YW50VmFsdWUoCiAgICAgICAgY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUobm9kZSksIGNvbnN0YW50LAogICAgICAgIHJlcXVpcmVDb25zdGFudDogcmVxdWlyZUNvbnN0YW50KTsKICAgIGlmICghdmFsdWUuaXNDb25zdGFudCAmJiAhcmVxdWlyZUNvbnN0YW50KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgLy8vIENvbnZlcnRzIFthbm5vdGF0aW9uc10gaW50byBhIGxpc3Qgb2YgW0NvbnN0YW50VmFsdWVdcy4KICBMaXN0PENvbnN0YW50VmFsdWU+IGdldE1ldGFkYXRhKExpc3Q8aXIuRXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMpIHsKICAgIGlmIChhbm5vdGF0aW9ucy5pc0VtcHR5KSByZXR1cm4gY29uc3QgPENvbnN0YW50VmFsdWU+W107CiAgICBMaXN0PENvbnN0YW50VmFsdWU+IG1ldGFkYXRhID0gPENvbnN0YW50VmFsdWU+W107CiAgICBhbm5vdGF0aW9ucy5mb3JFYWNoKChpci5FeHByZXNzaW9uIG5vZGUpIHsKICAgICAgbWV0YWRhdGEuYWRkKGdldENvbnN0YW50VmFsdWUobm9kZSkpOwogICAgfSk7CiAgICByZXR1cm4gbWV0YWRhdGE7CiAgfQoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXRTdXBlck5vU3VjaE1ldGhvZChDbGFzc0VudGl0eSBjbHMpIHsKICAgIHdoaWxlIChjbHMgIT0gbnVsbCkgewogICAgICBjbHMgPSBlbGVtZW50RW52aXJvbm1lbnQuZ2V0U3VwZXJDbGFzcyhjbHMpOwogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0gZWxlbWVudEVudmlyb25tZW50Lmxvb2t1cExvY2FsQ2xhc3NNZW1iZXIoCiAgICAgICAgICBjbHMsIElkZW50aWZpZXJzLm5vU3VjaE1ldGhvZF8pOwogICAgICBpZiAobWVtYmVyICE9IG51bGwgJiYgIW1lbWJlci5pc0Fic3RyYWN0KSB7CiAgICAgICAgaWYgKG1lbWJlci5pc0Z1bmN0aW9uKSB7CiAgICAgICAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiA9IG1lbWJlcjsKICAgICAgICAgIGlmIChmdW5jdGlvbi5wYXJhbWV0ZXJTdHJ1Y3R1cmUucG9zaXRpb25hbFBhcmFtZXRlcnMgPj0gMSkgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb247CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIElmIFttZW1iZXJdIGlzIG5vdCBhIHZhbGlkIGBub1N1Y2hNZXRob2RgIHRoZSB0YXJnZXQgaXMKICAgICAgICAvLyBgT2JqZWN0LnN1cGVyTm9TdWNoTWV0aG9kYC4KICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24gPSBlbGVtZW50RW52aXJvbm1lbnQubG9va3VwTG9jYWxDbGFzc01lbWJlcigKICAgICAgICBjb21tb25FbGVtZW50cy5vYmplY3RDbGFzcywgSWRlbnRpZmllcnMubm9TdWNoTWV0aG9kXyk7CiAgICBhc3NlcnQoZnVuY3Rpb24gIT0gbnVsbCwKICAgICAgICBmYWlsZWRBdChjbHMsICJObyBzdXBlciBub1N1Y2hNZXRob2QgZm91bmQgZm9yIGNsYXNzICRjbHMuIikpOwogICAgcmV0dXJuIGZ1bmN0aW9uOwogIH0KCiAgSW5kZXhlZExpYnJhcnkgY3JlYXRlTGlicmFyeShTdHJpbmcgbmFtZSwgVXJpIGNhbm9uaWNhbFVyaSkgewogICAgcmV0dXJuIG5ldyBKTGlicmFyeShuYW1lLCBjYW5vbmljYWxVcmkpOwogIH0KCiAgSW5kZXhlZENsYXNzIGNyZWF0ZUNsYXNzKExpYnJhcnlFbnRpdHkgbGlicmFyeSwgU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIGlzQWJzdHJhY3R9KSB7CiAgICByZXR1cm4gbmV3IEpDbGFzcyhsaWJyYXJ5LCBuYW1lLCBpc0Fic3RyYWN0OiBpc0Fic3RyYWN0KTsKICB9CgogIEluZGV4ZWRUeXBlZGVmIGNyZWF0ZVR5cGVkZWYoTGlicmFyeUVudGl0eSBsaWJyYXJ5LCBTdHJpbmcgbmFtZSkgewogICAgcmV0dXJuIG5ldyBKVHlwZWRlZihsaWJyYXJ5LCBuYW1lKTsKICB9CgogIFR5cGVWYXJpYWJsZUVudGl0eSBjcmVhdGVUeXBlVmFyaWFibGUoCiAgICAgIEVudGl0eSB0eXBlRGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBpbnQgaW5kZXgpIHsKICAgIHJldHVybiBuZXcgSlR5cGVWYXJpYWJsZSh0eXBlRGVjbGFyYXRpb24sIG5hbWUsIGluZGV4KTsKICB9CgogIEluZGV4ZWRDb25zdHJ1Y3RvciBjcmVhdGVHZW5lcmF0aXZlQ29uc3RydWN0b3IoQ2xhc3NFbnRpdHkgZW5jbG9zaW5nQ2xhc3MsCiAgICAgIE5hbWUgbmFtZSwgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAge2Jvb2wgaXNFeHRlcm5hbCwgYm9vbCBpc0NvbnN0fSkgewogICAgcmV0dXJuIG5ldyBKR2VuZXJhdGl2ZUNvbnN0cnVjdG9yKGVuY2xvc2luZ0NsYXNzLCBuYW1lLCBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgICAgaXNFeHRlcm5hbDogaXNFeHRlcm5hbCwgaXNDb25zdDogaXNDb25zdCk7CiAgfQoKICBJbmRleGVkQ29uc3RydWN0b3IgY3JlYXRlRmFjdG9yeUNvbnN0cnVjdG9yKENsYXNzRW50aXR5IGVuY2xvc2luZ0NsYXNzLAogICAgICBOYW1lIG5hbWUsIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgIHtib29sIGlzRXh0ZXJuYWwsIGJvb2wgaXNDb25zdCwgYm9vbCBpc0Zyb21FbnZpcm9ubWVudENvbnN0cnVjdG9yfSkgewogICAgcmV0dXJuIG5ldyBKRmFjdG9yeUNvbnN0cnVjdG9yKGVuY2xvc2luZ0NsYXNzLCBuYW1lLCBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgICAgaXNFeHRlcm5hbDogaXNFeHRlcm5hbCwKICAgICAgICBpc0NvbnN0OiBpc0NvbnN0LAogICAgICAgIGlzRnJvbUVudmlyb25tZW50Q29uc3RydWN0b3I6IGlzRnJvbUVudmlyb25tZW50Q29uc3RydWN0b3IpOwogIH0KCiAgSkNvbnN0cnVjdG9yQm9keSBjcmVhdGVDb25zdHJ1Y3RvckJvZHkoCiAgICAgIENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yLCBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlKSB7CiAgICByZXR1cm4gbmV3IEpDb25zdHJ1Y3RvckJvZHkoY29uc3RydWN0b3IsIHBhcmFtZXRlclN0cnVjdHVyZSk7CiAgfQoKICBKR2VuZXJhdG9yQm9keSBjcmVhdGVHZW5lcmF0b3JCb2R5KAogICAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwgRGFydFR5cGUgZWxlbWVudFR5cGUpIHsKICAgIHJldHVybiBuZXcgSkdlbmVyYXRvckJvZHkoZnVuY3Rpb24sIGVsZW1lbnRUeXBlKTsKICB9CgogIEluZGV4ZWRGdW5jdGlvbiBjcmVhdGVHZXR0ZXIoTGlicmFyeUVudGl0eSBsaWJyYXJ5LAogICAgICBDbGFzc0VudGl0eSBlbmNsb3NpbmdDbGFzcywgTmFtZSBuYW1lLCBBc3luY01hcmtlciBhc3luY01hcmtlciwKICAgICAge2Jvb2wgaXNTdGF0aWMsIGJvb2wgaXNFeHRlcm5hbCwgYm9vbCBpc0Fic3RyYWN0fSkgewogICAgcmV0dXJuIG5ldyBKR2V0dGVyKGxpYnJhcnksIGVuY2xvc2luZ0NsYXNzLCBuYW1lLCBhc3luY01hcmtlciwKICAgICAgICBpc1N0YXRpYzogaXNTdGF0aWMsIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwsIGlzQWJzdHJhY3Q6IGlzQWJzdHJhY3QpOwogIH0KCiAgSW5kZXhlZEZ1bmN0aW9uIGNyZWF0ZU1ldGhvZCgKICAgICAgTGlicmFyeUVudGl0eSBsaWJyYXJ5LAogICAgICBDbGFzc0VudGl0eSBlbmNsb3NpbmdDbGFzcywKICAgICAgTmFtZSBuYW1lLAogICAgICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlLAogICAgICBBc3luY01hcmtlciBhc3luY01hcmtlciwKICAgICAge2Jvb2wgaXNTdGF0aWMsCiAgICAgIGJvb2wgaXNFeHRlcm5hbCwKICAgICAgYm9vbCBpc0Fic3RyYWN0fSkgewogICAgcmV0dXJuIG5ldyBKTWV0aG9kKAogICAgICAgIGxpYnJhcnksIGVuY2xvc2luZ0NsYXNzLCBuYW1lLCBwYXJhbWV0ZXJTdHJ1Y3R1cmUsIGFzeW5jTWFya2VyLAogICAgICAgIGlzU3RhdGljOiBpc1N0YXRpYywgaXNFeHRlcm5hbDogaXNFeHRlcm5hbCwgaXNBYnN0cmFjdDogaXNBYnN0cmFjdCk7CiAgfQoKICBJbmRleGVkRnVuY3Rpb24gY3JlYXRlU2V0dGVyKAogICAgICBMaWJyYXJ5RW50aXR5IGxpYnJhcnksIENsYXNzRW50aXR5IGVuY2xvc2luZ0NsYXNzLCBOYW1lIG5hbWUsCiAgICAgIHtib29sIGlzU3RhdGljLCBib29sIGlzRXh0ZXJuYWwsIGJvb2wgaXNBYnN0cmFjdH0pIHsKICAgIHJldHVybiBuZXcgSlNldHRlcihsaWJyYXJ5LCBlbmNsb3NpbmdDbGFzcywgbmFtZSwKICAgICAgICBpc1N0YXRpYzogaXNTdGF0aWMsIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwsIGlzQWJzdHJhY3Q6IGlzQWJzdHJhY3QpOwogIH0KCiAgSW5kZXhlZEZpZWxkIGNyZWF0ZUZpZWxkKAogICAgICBMaWJyYXJ5RW50aXR5IGxpYnJhcnksIENsYXNzRW50aXR5IGVuY2xvc2luZ0NsYXNzLCBOYW1lIG5hbWUsCiAgICAgIHtib29sIGlzU3RhdGljLCBib29sIGlzQXNzaWduYWJsZSwgYm9vbCBpc0NvbnN0fSkgewogICAgcmV0dXJuIG5ldyBKRmllbGQobGlicmFyeSwgZW5jbG9zaW5nQ2xhc3MsIG5hbWUsCiAgICAgICAgaXNTdGF0aWM6IGlzU3RhdGljLCBpc0Fzc2lnbmFibGU6IGlzQXNzaWduYWJsZSwgaXNDb25zdDogaXNDb25zdCk7CiAgfQoKICBMaWJyYXJ5RW50aXR5IGNvbnZlcnRMaWJyYXJ5KEluZGV4ZWRMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIHJldHVybiBjcmVhdGVMaWJyYXJ5KGxpYnJhcnkubmFtZSwgbGlicmFyeS5jYW5vbmljYWxVcmkpOwogIH0KCiAgQ2xhc3NFbnRpdHkgY29udmVydENsYXNzKExpYnJhcnlFbnRpdHkgbGlicmFyeSwgSW5kZXhlZENsYXNzIGNscykgewogICAgcmV0dXJuIGNyZWF0ZUNsYXNzKGxpYnJhcnksIGNscy5uYW1lLCBpc0Fic3RyYWN0OiBjbHMuaXNBYnN0cmFjdCk7CiAgfQoKICBUeXBlZGVmRW50aXR5IGNvbnZlcnRUeXBlZGVmKExpYnJhcnlFbnRpdHkgbGlicmFyeSwgSW5kZXhlZFR5cGVkZWYgdHlwZWRlZikgewogICAgcmV0dXJuIGNyZWF0ZVR5cGVkZWYobGlicmFyeSwgdHlwZWRlZi5uYW1lKTsKICB9CgogIE1lbWJlckVudGl0eSBjb252ZXJ0TWVtYmVyKAogICAgICBMaWJyYXJ5RW50aXR5IGxpYnJhcnksCiAgICAgIENsYXNzRW50aXR5IGNscywKICAgICAgSW5kZXhlZE1lbWJlciBtZW1iZXIsCiAgICAgIE1lbWJlclVzYWdlIG1lbWJlclVzYWdlLAogICAgICBBbm5vdGF0aW9uc0RhdGEgYW5ub3RhdGlvbnMpIHsKICAgIE5hbWUgbWVtYmVyTmFtZSA9IG5ldyBOYW1lKG1lbWJlci5tZW1iZXJOYW1lLnRleHQsIGxpYnJhcnksCiAgICAgICAgaXNTZXR0ZXI6IG1lbWJlci5tZW1iZXJOYW1lLmlzU2V0dGVyKTsKICAgIGlmIChtZW1iZXIuaXNGaWVsZCkgewogICAgICBJbmRleGVkRmllbGQgZmllbGQgPSBtZW1iZXI7CiAgICAgIHJldHVybiBjcmVhdGVGaWVsZChsaWJyYXJ5LCBjbHMsIG1lbWJlck5hbWUsCiAgICAgICAgICBpc1N0YXRpYzogZmllbGQuaXNTdGF0aWMsCiAgICAgICAgICBpc0Fzc2lnbmFibGU6IGZpZWxkLmlzQXNzaWduYWJsZSwKICAgICAgICAgIGlzQ29uc3Q6IGZpZWxkLmlzQ29uc3QpOwogICAgfSBlbHNlIGlmIChtZW1iZXIuaXNDb25zdHJ1Y3RvcikgewogICAgICBJbmRleGVkQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBtZW1iZXI7CiAgICAgIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUgPQogICAgICAgICAgYW5ub3RhdGlvbnMuaGFzTm9FbGlzaW9uKGNvbnN0cnVjdG9yKQogICAgICAgICAgICAgID8gY29uc3RydWN0b3IucGFyYW1ldGVyU3RydWN0dXJlCiAgICAgICAgICAgICAgOiBtZW1iZXJVc2FnZS5pbnZva2VkUGFyYW1ldGVyczsKICAgICAgaWYgKGNvbnN0cnVjdG9yLmlzRmFjdG9yeUNvbnN0cnVjdG9yKSB7CiAgICAgICAgLy8gVE9ETyhyZWRlbXB0aW9uKTogVGhpcyBzaG91bGQgYmUgYSBKRnVuY3Rpb24uCiAgICAgICAgcmV0dXJuIGNyZWF0ZUZhY3RvcnlDb25zdHJ1Y3RvcihjbHMsIG1lbWJlck5hbWUsIHBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAgICAgICAgaXNFeHRlcm5hbDogY29uc3RydWN0b3IuaXNFeHRlcm5hbCwKICAgICAgICAgICAgaXNDb25zdDogY29uc3RydWN0b3IuaXNDb25zdCwKICAgICAgICAgICAgaXNGcm9tRW52aXJvbm1lbnRDb25zdHJ1Y3RvcjoKICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yLmlzRnJvbUVudmlyb25tZW50Q29uc3RydWN0b3IpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBjcmVhdGVHZW5lcmF0aXZlQ29uc3RydWN0b3IoY2xzLCBtZW1iZXJOYW1lLCBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgICAgICAgIGlzRXh0ZXJuYWw6IGNvbnN0cnVjdG9yLmlzRXh0ZXJuYWwsIGlzQ29uc3Q6IGNvbnN0cnVjdG9yLmlzQ29uc3QpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKG1lbWJlci5pc0dldHRlcikgewogICAgICBJbmRleGVkRnVuY3Rpb24gZ2V0dGVyID0gbWVtYmVyOwogICAgICByZXR1cm4gY3JlYXRlR2V0dGVyKGxpYnJhcnksIGNscywgbWVtYmVyTmFtZSwgZ2V0dGVyLmFzeW5jTWFya2VyLAogICAgICAgICAgaXNTdGF0aWM6IGdldHRlci5pc1N0YXRpYywKICAgICAgICAgIGlzRXh0ZXJuYWw6IGdldHRlci5pc0V4dGVybmFsLAogICAgICAgICAgaXNBYnN0cmFjdDogZ2V0dGVyLmlzQWJzdHJhY3QpOwogICAgfSBlbHNlIGlmIChtZW1iZXIuaXNTZXR0ZXIpIHsKICAgICAgSW5kZXhlZEZ1bmN0aW9uIHNldHRlciA9IG1lbWJlcjsKICAgICAgcmV0dXJuIGNyZWF0ZVNldHRlcihsaWJyYXJ5LCBjbHMsIG1lbWJlck5hbWUsCiAgICAgICAgICBpc1N0YXRpYzogc2V0dGVyLmlzU3RhdGljLAogICAgICAgICAgaXNFeHRlcm5hbDogc2V0dGVyLmlzRXh0ZXJuYWwsCiAgICAgICAgICBpc0Fic3RyYWN0OiBzZXR0ZXIuaXNBYnN0cmFjdCk7CiAgICB9IGVsc2UgewogICAgICBJbmRleGVkRnVuY3Rpb24gZnVuY3Rpb24gPSBtZW1iZXI7CiAgICAgIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUgPSBhbm5vdGF0aW9ucy5oYXNOb0VsaXNpb24oZnVuY3Rpb24pCiAgICAgICAgICA/IGZ1bmN0aW9uLnBhcmFtZXRlclN0cnVjdHVyZQogICAgICAgICAgOiBtZW1iZXJVc2FnZS5pbnZva2VkUGFyYW1ldGVyczsKICAgICAgcmV0dXJuIGNyZWF0ZU1ldGhvZCgKICAgICAgICAgIGxpYnJhcnksIGNscywgbWVtYmVyTmFtZSwgcGFyYW1ldGVyU3RydWN0dXJlLCBmdW5jdGlvbi5hc3luY01hcmtlciwKICAgICAgICAgIGlzU3RhdGljOiBmdW5jdGlvbi5pc1N0YXRpYywKICAgICAgICAgIGlzRXh0ZXJuYWw6IGZ1bmN0aW9uLmlzRXh0ZXJuYWwsCiAgICAgICAgICBpc0Fic3RyYWN0OiBmdW5jdGlvbi5pc0Fic3RyYWN0KTsKICAgIH0KICB9CgogIHZvaWQgZm9yRWFjaE5lc3RlZENsb3N1cmUoCiAgICAgIE1lbWJlckVudGl0eSBtZW1iZXIsIHZvaWQgZihGdW5jdGlvbkVudGl0eSBjbG9zdXJlKSkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KG1lbWJlcikpOwogICAgX25lc3RlZENsb3N1cmVNYXBbbWVtYmVyXT8uZm9yRWFjaChmKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0TWVtYmVyVGhpc1R5cGUoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgcmV0dXJuIG1lbWJlcnMuZ2V0RGF0YShtZW1iZXIpLmdldE1lbWJlclRoaXNUeXBlKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgZ2V0Q2xhc3NUeXBlVmFyaWFibGVBY2Nlc3NGb3JNZW1iZXIoCiAgICAgIE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIHJldHVybiBtZW1iZXJzLmdldERhdGEobWVtYmVyKS5jbGFzc1R5cGVWYXJpYWJsZUFjY2VzczsKICB9CgogIGJvb2wgY2hlY2tGYW1pbHkoRW50aXR5IGVudGl0eSkgewogICAgYXNzZXJ0KAogICAgICAgICckZW50aXR5Jy5zdGFydHNXaXRoKGpzRWxlbWVudFByZWZpeCksCiAgICAgICAgZmFpbGVkQXQoZW50aXR5LAogICAgICAgICAgICAiVW5leHBlY3RlZCBlbnRpdHkgJGVudGl0eSwgZXhwZWN0ZWQgZmFtaWx5ICRqc0VsZW1lbnRQcmVmaXguIikpOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBTcGFubmFibGUgZ2V0U3Bhbm5hYmxlKE1lbWJlckVudGl0eSBtZW1iZXIsIGlyLk5vZGUgbm9kZSkgewogICAgU291cmNlU3BhbiBzb3VyY2VTcGFuOwogICAgaWYgKG5vZGUgaXMgaXIuVHJlZU5vZGUpIHsKICAgICAgc291cmNlU3BhbiA9IGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKG5vZGUpOwogICAgfQogICAgc291cmNlU3BhbiA/Pz0gZ2V0U291cmNlU3BhbihtZW1iZXIsIG51bGwpOwogICAgcmV0dXJuIHNvdXJjZVNwYW47CiAgfQoKICBJdGVyYWJsZTxMaWJyYXJ5RW50aXR5PiBnZXQgbGlicmFyeUxpc3RJbnRlcm5hbCB7CiAgICByZXR1cm4gbGlicmFyeU1hcC52YWx1ZXM7CiAgfQoKICBMaWJyYXJ5RW50aXR5IGdldExpYnJhcnlJbnRlcm5hbChpci5MaWJyYXJ5IG5vZGUsIFtKTGlicmFyeUVudiBlbnZdKSB7CiAgICBMaWJyYXJ5RW50aXR5IGxpYnJhcnkgPSBsaWJyYXJ5TWFwW25vZGVdOwogICAgYXNzZXJ0KGxpYnJhcnkgIT0gbnVsbCwgIk5vIGxpYnJhcnkgZW50aXR5IGZvciAkbm9kZSIpOwogICAgcmV0dXJuIGxpYnJhcnk7CiAgfQoKICBDbGFzc0VudGl0eSBnZXRDbGFzc0ludGVybmFsKGlyLkNsYXNzIG5vZGUsIFtKQ2xhc3NFbnYgZW52XSkgewogICAgQ2xhc3NFbnRpdHkgY2xzID0gY2xhc3NNYXBbbm9kZV07CiAgICBhc3NlcnQoY2xzICE9IG51bGwsICJObyBjbGFzcyBlbnRpdHkgZm9yICRub2RlIik7CiAgICByZXR1cm4gY2xzOwogIH0KCiAgRmllbGRFbnRpdHkgZ2V0RmllbGRJbnRlcm5hbChpci5GaWVsZCBub2RlKSB7CiAgICBGaWVsZEVudGl0eSBmaWVsZCA9IGZpZWxkTWFwW25vZGVdOwogICAgYXNzZXJ0KGZpZWxkICE9IG51bGwsICJObyBmaWVsZCBlbnRpdHkgZm9yICRub2RlIik7CiAgICByZXR1cm4gZmllbGQ7CiAgfQoKICBGdW5jdGlvbkVudGl0eSBnZXRNZXRob2RJbnRlcm5hbChpci5Qcm9jZWR1cmUgbm9kZSkgewogICAgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24gPSBtZXRob2RNYXBbbm9kZV07CiAgICBhc3NlcnQoZnVuY3Rpb24gIT0gbnVsbCwgIk5vIGZ1bmN0aW9uIGVudGl0eSBmb3IgJG5vZGUiKTsKICAgIHJldHVybiBmdW5jdGlvbjsKICB9CgogIENvbnN0cnVjdG9yRW50aXR5IGdldENvbnN0cnVjdG9ySW50ZXJuYWwoaXIuTWVtYmVyIG5vZGUpIHsKICAgIENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yID0gY29uc3RydWN0b3JNYXBbbm9kZV07CiAgICBhc3NlcnQoY29uc3RydWN0b3IgIT0gbnVsbCwgIk5vIGNvbnN0cnVjdG9yIGVudGl0eSBmb3IgJG5vZGUiKTsKICAgIHJldHVybiBjb25zdHJ1Y3RvcjsKICB9CgogIFR5cGVWYXJpYWJsZUVudGl0eSBnZXRUeXBlVmFyaWFibGVJbnRlcm5hbChpci5UeXBlUGFyYW1ldGVyIG5vZGUpIHsKICAgIFR5cGVWYXJpYWJsZUVudGl0eSB0eXBlVmFyaWFibGUgPSB0eXBlVmFyaWFibGVNYXBbbm9kZV07CiAgICBpZiAodHlwZVZhcmlhYmxlID09IG51bGwpIHsKICAgICAgaWYgKG5vZGUucGFyZW50IGlzIGlyLkZ1bmN0aW9uTm9kZSkgewogICAgICAgIGlyLkZ1bmN0aW9uTm9kZSBmdW5jID0gbm9kZS5wYXJlbnQ7CiAgICAgICAgaW50IGluZGV4ID0gZnVuYy50eXBlUGFyYW1ldGVycy5pbmRleE9mKG5vZGUpOwogICAgICAgIGlmIChmdW5jLnBhcmVudCBpcyBpci5Db25zdHJ1Y3RvcikgewogICAgICAgICAgaXIuQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBmdW5jLnBhcmVudDsKICAgICAgICAgIGlyLkNsYXNzIGNscyA9IGNvbnN0cnVjdG9yLmVuY2xvc2luZ0NsYXNzOwogICAgICAgICAgdHlwZVZhcmlhYmxlTWFwW25vZGVdID0KICAgICAgICAgICAgICB0eXBlVmFyaWFibGUgPSBnZXRUeXBlVmFyaWFibGVJbnRlcm5hbChjbHMudHlwZVBhcmFtZXRlcnNbaW5kZXhdKTsKICAgICAgICB9IGVsc2UgaWYgKGZ1bmMucGFyZW50IGlzIGlyLlByb2NlZHVyZSkgewogICAgICAgICAgaXIuUHJvY2VkdXJlIHByb2NlZHVyZSA9IGZ1bmMucGFyZW50OwogICAgICAgICAgaWYgKHByb2NlZHVyZS5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuRmFjdG9yeSkgewogICAgICAgICAgICBpci5DbGFzcyBjbHMgPSBwcm9jZWR1cmUuZW5jbG9zaW5nQ2xhc3M7CiAgICAgICAgICAgIHR5cGVWYXJpYWJsZU1hcFtub2RlXSA9IHR5cGVWYXJpYWJsZSA9CiAgICAgICAgICAgICAgICBnZXRUeXBlVmFyaWFibGVJbnRlcm5hbChjbHMudHlwZVBhcmFtZXRlcnNbaW5kZXhdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGFzc2VydCgKICAgICAgICB0eXBlVmFyaWFibGUgIT0gbnVsbCwKICAgICAgICAiTm8gdHlwZSB2YXJpYWJsZSBlbnRpdHkgZm9yICRub2RlIG9uICIKICAgICAgICAiJHtub2RlLnBhcmVudCBpcyBpci5GdW5jdGlvbk5vZGUgPyBub2RlLnBhcmVudC5wYXJlbnQgOiBub2RlLnBhcmVudH0iKTsKICAgIHJldHVybiB0eXBlVmFyaWFibGU7CiAgfQoKICBUeXBlZGVmRW50aXR5IGdldFR5cGVkZWZJbnRlcm5hbChpci5UeXBlZGVmIG5vZGUpIHsKICAgIFR5cGVkZWZFbnRpdHkgdHlwZWRlZiA9IHR5cGVkZWZNYXBbbm9kZV07CiAgICBhc3NlcnQodHlwZWRlZiAhPSBudWxsLCAiTm8gdHlwZWRlZiBlbnRpdHkgZm9yICRub2RlIik7CiAgICByZXR1cm4gdHlwZWRlZjsKICB9CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldENvbnN0cnVjdG9yQm9keShpci5Db25zdHJ1Y3RvciBub2RlKSB7CiAgICBDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvciA9IGdldENvbnN0cnVjdG9yKG5vZGUpOwogICAgcmV0dXJuIF9nZXRDb25zdHJ1Y3RvckJvZHkobm9kZSwgY29uc3RydWN0b3IpOwogIH0KCiAgRnVuY3Rpb25FbnRpdHkgX2dldENvbnN0cnVjdG9yQm9keSgKICAgICAgaXIuQ29uc3RydWN0b3Igbm9kZSwgY292YXJpYW50IEluZGV4ZWRDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcikgewogICAgSkNvbnN0cnVjdG9yRGF0YUltcGwgZGF0YSA9IG1lbWJlcnMuZ2V0RGF0YShjb25zdHJ1Y3Rvcik7CiAgICBpZiAoZGF0YS5jb25zdHJ1Y3RvckJvZHkgPT0gbnVsbCkgewogICAgICAvLy8gVGhlIGNvbnN0cnVjdG9yIGNhbGxzIHRoZSBjb25zdHJ1Y3RvciBib2R5IHdpdGggYWxsIHBhcmFtZXRlcnMuCiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSBwYXJhbWV0ZXJzIHRoYXQgYXJlIG5vdCB1c2VkIGluIHRoZQogICAgICAvLyAgY29uc3RydWN0b3IgYm9keS4KICAgICAgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSA9CiAgICAgICAgICBfZ2V0UGFyYW1ldGVyU3RydWN0dXJlRnJvbUZ1bmN0aW9uTm9kZShub2RlLmZ1bmN0aW9uKTsKCiAgICAgIEpDb25zdHJ1Y3RvckJvZHkgY29uc3RydWN0b3JCb2R5ID0KICAgICAgICAgIGNyZWF0ZUNvbnN0cnVjdG9yQm9keShjb25zdHJ1Y3RvciwgcGFyYW1ldGVyU3RydWN0dXJlKTsKICAgICAgbWVtYmVycy5yZWdpc3RlcjxJbmRleGVkRnVuY3Rpb24sIEZ1bmN0aW9uRGF0YT4oCiAgICAgICAgICBjb25zdHJ1Y3RvckJvZHksCiAgICAgICAgICBuZXcgQ29uc3RydWN0b3JCb2R5RGF0YUltcGwoCiAgICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgICBub2RlLmZ1bmN0aW9uLAogICAgICAgICAgICAgIG5ldyBTcGVjaWFsTWVtYmVyRGVmaW5pdGlvbihub2RlLCBNZW1iZXJLaW5kLmNvbnN0cnVjdG9yQm9keSksCiAgICAgICAgICAgICAgZGF0YS5zdGF0aWNUeXBlcykpOwogICAgICBJbmRleGVkQ2xhc3MgY2xzID0gY29uc3RydWN0b3IuZW5jbG9zaW5nQ2xhc3M7CiAgICAgIEpDbGFzc0VudkltcGwgY2xhc3NFbnYgPSBjbGFzc2VzLmdldEVudihjbHMpOwogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBdm9pZCB0aGlzIGJ5IG9ubHkgaW5jbHVkaW5nIGxpdmUgbWVtYmVycyBpbiB0aGUKICAgICAgLy8ganMtbW9kZWwuCiAgICAgIGNsYXNzRW52LmFkZENvbnN0cnVjdG9yQm9keShjb25zdHJ1Y3RvckJvZHkpOwogICAgICBkYXRhLmNvbnN0cnVjdG9yQm9keSA9IGNvbnN0cnVjdG9yQm9keTsKICAgIH0KICAgIHJldHVybiBkYXRhLmNvbnN0cnVjdG9yQm9keTsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlckRlZmluaXRpb24gZ2V0TWVtYmVyRGVmaW5pdGlvbihNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICByZXR1cm4gZ2V0TWVtYmVyRGVmaW5pdGlvbkludGVybmFsKG1lbWJlcik7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc0RlZmluaXRpb24gZ2V0Q2xhc3NEZWZpbml0aW9uKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGdldENsYXNzRGVmaW5pdGlvbkludGVybmFsKGNscyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hQYXJhbWV0ZXIoY292YXJpYW50IEluZGV4ZWRGdW5jdGlvbiBmdW5jdGlvbiwKICAgICAgdm9pZCBmKERhcnRUeXBlIHR5cGUsIFN0cmluZyBuYW1lLCBDb25zdGFudFZhbHVlIGRlZmF1bHRWYWx1ZSksCiAgICAgIHtib29sIGlzTmF0aXZlOiBmYWxzZX0pIHsKICAgIEZ1bmN0aW9uRGF0YSBkYXRhID0gbWVtYmVycy5nZXREYXRhKGZ1bmN0aW9uKTsKICAgIGRhdGEuZm9yRWFjaFBhcmFtZXRlcih0aGlzLCBmdW5jdGlvbi5wYXJhbWV0ZXJTdHJ1Y3R1cmUsIGYsCiAgICAgICAgaXNOYXRpdmU6IGlzTmF0aXZlKTsKICB9CgogIHZvaWQgZm9yRWFjaENvbnN0cnVjdG9yQm9keSgKICAgICAgSW5kZXhlZENsYXNzIGNscywgdm9pZCBmKENvbnN0cnVjdG9yQm9keUVudGl0eSBtZW1iZXIpKSB7CiAgICBKQ2xhc3NFbnYgZW52ID0gY2xhc3Nlcy5nZXRFbnYoY2xzKTsKICAgIGVudi5mb3JFYWNoQ29uc3RydWN0b3JCb2R5KGYpOwogIH0KCiAgdm9pZCBmb3JFYWNoSW5qZWN0ZWRDbGFzc01lbWJlcigKICAgICAgSW5kZXhlZENsYXNzIGNscywgdm9pZCBmKE1lbWJlckVudGl0eSBtZW1iZXIpKSB7CiAgICBfaW5qZWN0ZWRDbGFzc01lbWJlcnNbY2xzXT8uZm9yRWFjaChmKTsKICB9CgogIEpSZWNvcmRGaWVsZCBfY29uc3RydWN0UmVjb3JkRmllbGRFbnRyeSgKICAgICAgSW50ZXJmYWNlVHlwZSBtZW1iZXJUaGlzVHlwZSwKICAgICAgaXIuVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwKICAgICAgQm94TG9jYWwgYm94TG9jYWwsCiAgICAgIE1hcDxTdHJpbmcsIE1lbWJlckVudGl0eT4gbWVtYmVyTWFwLAogICAgICBLZXJuZWxUb0xvY2Fsc01hcCBsb2NhbHNNYXApIHsKICAgIExvY2FsIGxvY2FsID0gbG9jYWxzTWFwLmdldExvY2FsVmFyaWFibGUodmFyaWFibGUpOwogICAgSlJlY29yZEZpZWxkIGJveGVkRmllbGQgPQogICAgICAgIG5ldyBKUmVjb3JkRmllbGQobG9jYWwubmFtZSwgYm94TG9jYWwsIGlzQ29uc3Q6IHZhcmlhYmxlLmlzQ29uc3QpOwogICAgbWVtYmVycy5yZWdpc3RlcigKICAgICAgICBib3hlZEZpZWxkLAogICAgICAgIG5ldyBDbG9zdXJlRmllbGREYXRhKAogICAgICAgICAgICBuZXcgQ2xvc3VyZU1lbWJlckRlZmluaXRpb24oY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUodmFyaWFibGUpLAogICAgICAgICAgICAgICAgTWVtYmVyS2luZC5jbG9zdXJlRmllbGQsIHZhcmlhYmxlKSwKICAgICAgICAgICAgbWVtYmVyVGhpc1R5cGUpKTsKICAgIG1lbWJlck1hcFtib3hlZEZpZWxkLm5hbWVdID0gYm94ZWRGaWVsZDsKCiAgICByZXR1cm4gYm94ZWRGaWVsZDsKICB9CgogIC8vLyBNYWtlIGEgY29udGFpbmVyIGNvbnRyb2xsaW5nIGFjY2VzcyB0byByZWNvcmRzLCB0aGF0IGlzLCB2YXJpYWJsZXMgdGhhdAogIC8vLyBhcmUgYWNjZXNzZWQgaW4gZGlmZmVyZW50IHNjb3Blcy4gVGhpcyBmdW5jdGlvbiBjcmVhdGVzIHRoZSBjb250YWluZXIKICAvLy8gYW5kIHJldHVybnMgYSBtYXAgb2YgbG9jYWxzIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJlY29yZHMgY3JlYXRlZC4KICBAb3ZlcnJpZGUKICBNYXA8TG9jYWwsIEpSZWNvcmRGaWVsZD4gbWFrZVJlY29yZENvbnRhaW5lcigKICAgICAgS2VybmVsU2NvcGVJbmZvIGluZm8sIE1lbWJlckVudGl0eSBtZW1iZXIsIEtlcm5lbFRvTG9jYWxzTWFwIGxvY2Fsc01hcCkgewogICAgTWFwPExvY2FsLCBKUmVjb3JkRmllbGQ+IGJveGVkRmllbGRzID0ge307CiAgICBpZiAoaW5mby5ib3hlZFZhcmlhYmxlcy5pc05vdEVtcHR5KSB7CiAgICAgIE5vZGVCb3ggYm94ID0gaW5mby5jYXB0dXJlZFZhcmlhYmxlc0FjY2Vzc29yOwoKICAgICAgTWFwPFN0cmluZywgSW5kZXhlZE1lbWJlcj4gbWVtYmVyTWFwID0gPFN0cmluZywgSW5kZXhlZE1lbWJlcj57fTsKICAgICAgSlJlY29yZCBjb250YWluZXIgPSBuZXcgSlJlY29yZChtZW1iZXIubGlicmFyeSwgYm94Lm5hbWUpOwogICAgICBCb3hMb2NhbCBib3hMb2NhbCA9IG5ldyBCb3hMb2NhbChjb250YWluZXIpOwogICAgICBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlID0gbmV3IEludGVyZmFjZVR5cGUoY29udGFpbmVyLCBjb25zdCA8RGFydFR5cGU+W10pOwogICAgICBJbnRlcmZhY2VUeXBlIHN1cGVydHlwZSA9IGNvbW1vbkVsZW1lbnRzLm9iamVjdFR5cGU7CiAgICAgIEpDbGFzc0RhdGEgY29udGFpbmVyRGF0YSA9IG5ldyBSZWNvcmRDbGFzc0RhdGEoCiAgICAgICAgICBuZXcgUmVjb3JkQ29udGFpbmVyRGVmaW5pdGlvbihnZXRNZW1iZXJEZWZpbml0aW9uKG1lbWJlcikubG9jYXRpb24pLAogICAgICAgICAgdGhpc1R5cGUsCiAgICAgICAgICBzdXBlcnR5cGUsCiAgICAgICAgICBnZXRPcmRlcmVkVHlwZVNldChzdXBlcnR5cGUuZWxlbWVudCkuZXh0ZW5kQ2xhc3ModGhpc1R5cGUpKTsKICAgICAgY2xhc3Nlcy5yZWdpc3Rlcihjb250YWluZXIsIGNvbnRhaW5lckRhdGEsIG5ldyBSZWNvcmRFbnYobWVtYmVyTWFwKSk7CgogICAgICBJbnRlcmZhY2VUeXBlIG1lbWJlclRoaXNUeXBlID0gbWVtYmVyLmVuY2xvc2luZ0NsYXNzICE9IG51bGwKICAgICAgICAgID8gZWxlbWVudEVudmlyb25tZW50LmdldFRoaXNUeXBlKG1lbWJlci5lbmNsb3NpbmdDbGFzcykKICAgICAgICAgIDogbnVsbDsKICAgICAgZm9yIChpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlIGluIGluZm8uYm94ZWRWYXJpYWJsZXMpIHsKICAgICAgICBib3hlZEZpZWxkc1tsb2NhbHNNYXAuZ2V0TG9jYWxWYXJpYWJsZSh2YXJpYWJsZSldID0KICAgICAgICAgICAgX2NvbnN0cnVjdFJlY29yZEZpZWxkRW50cnkoCiAgICAgICAgICAgICAgICBtZW1iZXJUaGlzVHlwZSwgdmFyaWFibGUsIGJveExvY2FsLCBtZW1iZXJNYXAsIGxvY2Fsc01hcCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBib3hlZEZpZWxkczsKICB9CgogIGJvb2wgX2lzSW5SZWNvcmQoCiAgICAgICAgICBMb2NhbCBsb2NhbCwgTWFwPExvY2FsLCBKUmVjb3JkRmllbGQ+IHJlY29yZEZpZWxkc1Zpc2libGVJblNjb3BlKSA9PgogICAgICByZWNvcmRGaWVsZHNWaXNpYmxlSW5TY29wZS5jb250YWluc0tleShsb2NhbCk7CgogIFBhcmFtZXRlclN0cnVjdHVyZSBfZ2V0UGFyYW1ldGVyU3RydWN0dXJlRnJvbUZ1bmN0aW9uTm9kZSgKICAgICAgaXIuRnVuY3Rpb25Ob2RlIG5vZGUpIHsKICAgIGludCByZXF1aXJlZFBhcmFtZXRlcnMgPSBub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQ7CiAgICBpbnQgcG9zaXRpb25hbFBhcmFtZXRlcnMgPSBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsKICAgIGludCB0eXBlUGFyYW1ldGVycyA9IG5vZGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoOwogICAgTGlzdDxTdHJpbmc+IG5hbWVkUGFyYW1ldGVycyA9CiAgICAgICAgbm9kZS5uYW1lZFBhcmFtZXRlcnMubWFwKChwKSA9PiBwLm5hbWUpLnRvTGlzdCgpLi5zb3J0KCk7CiAgICByZXR1cm4gbmV3IFBhcmFtZXRlclN0cnVjdHVyZShyZXF1aXJlZFBhcmFtZXRlcnMsIHBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgIG5hbWVkUGFyYW1ldGVycywgdHlwZVBhcmFtZXRlcnMpOwogIH0KCiAgS2VybmVsQ2xvc3VyZUNsYXNzSW5mbyBjb25zdHJ1Y3RDbG9zdXJlQ2xhc3MoCiAgICAgIE1lbWJlckVudGl0eSBtZW1iZXIsCiAgICAgIGlyLkZ1bmN0aW9uTm9kZSBub2RlLAogICAgICBKTGlicmFyeSBlbmNsb3NpbmdMaWJyYXJ5LAogICAgICBNYXA8TG9jYWwsIEpSZWNvcmRGaWVsZD4gcmVjb3JkRmllbGRzVmlzaWJsZUluU2NvcGUsCiAgICAgIEtlcm5lbFNjb3BlSW5mbyBpbmZvLAogICAgICBLZXJuZWxUb0xvY2Fsc01hcCBsb2NhbHNNYXAsCiAgICAgIEludGVyZmFjZVR5cGUgc3VwZXJ0eXBlLAogICAgICB7Ym9vbCBjcmVhdGVTaWduYXR1cmVNZXRob2R9KSB7CiAgICBJbnRlcmZhY2VUeXBlIG1lbWJlclRoaXNUeXBlID0gbWVtYmVyLmVuY2xvc2luZ0NsYXNzICE9IG51bGwKICAgICAgICA/IGVsZW1lbnRFbnZpcm9ubWVudC5nZXRUaGlzVHlwZShtZW1iZXIuZW5jbG9zaW5nQ2xhc3MpCiAgICAgICAgOiBudWxsOwogICAgQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgdHlwZVZhcmlhYmxlQWNjZXNzID0KICAgICAgICBtZW1iZXJzLmdldERhdGEobWVtYmVyKS5jbGFzc1R5cGVWYXJpYWJsZUFjY2VzczsKICAgIGlmICh0eXBlVmFyaWFibGVBY2Nlc3MgPT0gQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MuaW5zdGFuY2VGaWVsZCkgewogICAgICAvLyBBIGNsb3N1cmUgaW4gYSBmaWVsZCBpbml0aWFsaXplciB3aWxsIG9ubHkgYmUgZXhlY3V0ZWQgaW4gdGhlCiAgICAgIC8vIGNvbnN0cnVjdG9yIGFuZCB0eXBlIHZhcmlhYmxlcyBhcmUgdGhlcmVmb3JlIGFjY2Vzc2VkIHRocm91Z2gKICAgICAgLy8gcGFyYW1ldGVycy4KICAgICAgdHlwZVZhcmlhYmxlQWNjZXNzID0gQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MucGFyYW1ldGVyOwogICAgfQogICAgU3RyaW5nIG5hbWUgPSBfY29tcHV0ZUNsb3N1cmVOYW1lKG5vZGUpOwogICAgU291cmNlU3BhbiBsb2NhdGlvbiA9IGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKG5vZGUpOwogICAgTWFwPFN0cmluZywgSW5kZXhlZE1lbWJlcj4gbWVtYmVyTWFwID0gPFN0cmluZywgSW5kZXhlZE1lbWJlcj57fTsKCiAgICBKQ2xhc3MgY2xhc3NFbnRpdHkgPSBuZXcgSkNsb3N1cmVDbGFzcyhlbmNsb3NpbmdMaWJyYXJ5LCBuYW1lKTsKICAgIC8vIENyZWF0ZSBhIGNsYXNzRGF0YSBhbmQgc2V0IHVwIHRoZSBpbnRlcmZhY2VzIGFuZCBzdWJjbGFzcwogICAgLy8gcmVsYXRpb25zaGlwcyB0aGF0IF9lbnN1cmVTdXBlcnR5cGVzIGFuZCBfZW5zdXJlVGhpc0FuZFJhd1R5cGUgYXJlIGRvaW5nCiAgICBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlID0gbmV3IEludGVyZmFjZVR5cGUoY2xhc3NFbnRpdHksIGNvbnN0IDxEYXJ0VHlwZT5bXSk7CiAgICBDbG9zdXJlQ2xhc3NEYXRhIGNsb3N1cmVEYXRhID0gbmV3IENsb3N1cmVDbGFzc0RhdGEoCiAgICAgICAgbmV3IENsb3N1cmVDbGFzc0RlZmluaXRpb24obG9jYXRpb24pLAogICAgICAgIHRoaXNUeXBlLAogICAgICAgIHN1cGVydHlwZSwKICAgICAgICBnZXRPcmRlcmVkVHlwZVNldChzdXBlcnR5cGUuZWxlbWVudCkuZXh0ZW5kQ2xhc3ModGhpc1R5cGUpKTsKICAgIGNsYXNzZXMucmVnaXN0ZXIoY2xhc3NFbnRpdHksIGNsb3N1cmVEYXRhLCBuZXcgQ2xvc3VyZUNsYXNzRW52KG1lbWJlck1hcCkpOwoKICAgIExvY2FsIGNsb3N1cmVFbnRpdHk7CiAgICBpZiAobm9kZS5wYXJlbnQgaXMgaXIuRnVuY3Rpb25EZWNsYXJhdGlvbikgewogICAgICBpci5GdW5jdGlvbkRlY2xhcmF0aW9uIHBhcmVudCA9IG5vZGUucGFyZW50OwogICAgICBjbG9zdXJlRW50aXR5ID0gbG9jYWxzTWFwLmdldExvY2FsVmFyaWFibGUocGFyZW50LnZhcmlhYmxlKTsKICAgIH0gZWxzZSBpZiAobm9kZS5wYXJlbnQgaXMgaXIuRnVuY3Rpb25FeHByZXNzaW9uKSB7CiAgICAgIGNsb3N1cmVFbnRpdHkgPSBuZXcgQW5vbnltb3VzQ2xvc3VyZUxvY2FsKGNsYXNzRW50aXR5KTsKICAgIH0KCiAgICBJbmRleGVkRnVuY3Rpb24gY2FsbE1ldGhvZCA9IG5ldyBKQ2xvc3VyZUNhbGxNZXRob2QoY2xhc3NFbnRpdHksCiAgICAgICAgX2dldFBhcmFtZXRlclN0cnVjdHVyZUZyb21GdW5jdGlvbk5vZGUobm9kZSksIGdldEFzeW5jTWFya2VyKG5vZGUpKTsKICAgIF9uZXN0ZWRDbG9zdXJlTWFwCiAgICAgICAgLnB1dElmQWJzZW50KG1lbWJlciwgKCkgPT4gPEluZGV4ZWRGdW5jdGlvbj5bXSkKICAgICAgICAuYWRkKGNhbGxNZXRob2QpOwogICAgLy8gV2UgbmVlZCBjcmVhdGUgdGhlIHR5cGUgdmFyaWFibGUgaGVyZSAtIGJlZm9yZSB3ZSB0cnkgdG8gbWFrZSBsb2NhbAogICAgLy8gdmFyaWFibGVzIGZyb20gdGhlbSAoaW4gYEpzU2NvcGVJbmZvLmZyb21gIGNhbGxlZCB0aHJvdWdoCiAgICAvLyBgS2VybmVsQ2xvc3VyZUNsYXNzSW5mby5mcm9tU2NvcGVJbmZvYCBiZWxvdykuCiAgICBpbnQgaW5kZXggPSAwOwogICAgZm9yIChpci5UeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgaW4gbm9kZS50eXBlUGFyYW1ldGVycykgewogICAgICB0eXBlVmFyaWFibGVNYXBbdHlwZVBhcmFtZXRlcl0gPSB0eXBlVmFyaWFibGVzLnJlZ2lzdGVyKAogICAgICAgICAgY3JlYXRlVHlwZVZhcmlhYmxlKGNhbGxNZXRob2QsIHR5cGVQYXJhbWV0ZXIubmFtZSwgaW5kZXgpLAogICAgICAgICAgbmV3IEpUeXBlVmFyaWFibGVEYXRhKHR5cGVQYXJhbWV0ZXIpKTsKICAgICAgaW5kZXgrKzsKICAgIH0KCiAgICBLZXJuZWxDbG9zdXJlQ2xhc3NJbmZvIGNsb3N1cmVDbGFzc0luZm8gPQogICAgICAgIG5ldyBLZXJuZWxDbG9zdXJlQ2xhc3NJbmZvLmZyb21TY29wZUluZm8oCiAgICAgICAgICAgIGNsYXNzRW50aXR5LAogICAgICAgICAgICBub2RlLAogICAgICAgICAgICA8TG9jYWwsIEpSZWNvcmRGaWVsZD57fSwKICAgICAgICAgICAgaW5mbywKICAgICAgICAgICAgbG9jYWxzTWFwLAogICAgICAgICAgICBjbG9zdXJlRW50aXR5LAogICAgICAgICAgICBpbmZvLmhhc1RoaXNMb2NhbAogICAgICAgICAgICAgICAgPyBuZXcgVGhpc0xvY2FsKGxvY2Fsc01hcC5jdXJyZW50TWVtYmVyLmVuY2xvc2luZ0NsYXNzKQogICAgICAgICAgICAgICAgOiBudWxsLAogICAgICAgICAgICB0aGlzKTsKICAgIF9idWlsZENsb3N1cmVDbGFzc0ZpZWxkcyhjbG9zdXJlQ2xhc3NJbmZvLCBtZW1iZXIsIG1lbWJlclRoaXNUeXBlLCBpbmZvLAogICAgICAgIGxvY2Fsc01hcCwgcmVjb3JkRmllbGRzVmlzaWJsZUluU2NvcGUsIG1lbWJlck1hcCk7CgogICAgaWYgKGNyZWF0ZVNpZ25hdHVyZU1ldGhvZCkgewogICAgICBfY29uc3RydWN0U2lnbmF0dXJlTWV0aG9kKGNsb3N1cmVDbGFzc0luZm8sIG1lbWJlck1hcCwgbm9kZSwKICAgICAgICAgIG1lbWJlclRoaXNUeXBlLCBsb2NhdGlvbiwgdHlwZVZhcmlhYmxlQWNjZXNzKTsKICAgIH0KCiAgICBjbG9zdXJlRGF0YS5jYWxsVHlwZSA9IGdldEZ1bmN0aW9uVHlwZShub2RlKTsKCiAgICBtZW1iZXJzLnJlZ2lzdGVyPEluZGV4ZWRGdW5jdGlvbiwgRnVuY3Rpb25EYXRhPigKICAgICAgICBjYWxsTWV0aG9kLAogICAgICAgIG5ldyBDbG9zdXJlRnVuY3Rpb25EYXRhKAogICAgICAgICAgICBuZXcgQ2xvc3VyZU1lbWJlckRlZmluaXRpb24oCiAgICAgICAgICAgICAgICBsb2NhdGlvbiwgTWVtYmVyS2luZC5jbG9zdXJlQ2FsbCwgbm9kZS5wYXJlbnQpLAogICAgICAgICAgICBtZW1iZXJUaGlzVHlwZSwKICAgICAgICAgICAgY2xvc3VyZURhdGEuY2FsbFR5cGUsCiAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgIHR5cGVWYXJpYWJsZUFjY2VzcykpOwogICAgbWVtYmVyTWFwW2NhbGxNZXRob2QubmFtZV0gPSBjbG9zdXJlQ2xhc3NJbmZvLmNhbGxNZXRob2QgPSBjYWxsTWV0aG9kOwogICAgcmV0dXJuIGNsb3N1cmVDbGFzc0luZm87CiAgfQoKICB2b2lkIF9idWlsZENsb3N1cmVDbGFzc0ZpZWxkcygKICAgICAgS2VybmVsQ2xvc3VyZUNsYXNzSW5mbyBjbG9zdXJlQ2xhc3NJbmZvLAogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyLAogICAgICBJbnRlcmZhY2VUeXBlIG1lbWJlclRoaXNUeXBlLAogICAgICBLZXJuZWxTY29wZUluZm8gaW5mbywKICAgICAgS2VybmVsVG9Mb2NhbHNNYXAgbG9jYWxzTWFwLAogICAgICBNYXA8TG9jYWwsIEpSZWNvcmRGaWVsZD4gcmVjb3JkRmllbGRzVmlzaWJsZUluU2NvcGUsCiAgICAgIE1hcDxTdHJpbmcsIE1lbWJlckVudGl0eT4gbWVtYmVyTWFwKSB7CiAgICAvLyBUT0RPKGVmb3J0dW5hKTogTGltaXQgZmllbGQgbnVtYmVyIHVzYWdlIHRvIHdoZW4gd2UgbmVlZCB0byBkaXN0aW5ndWlzaAogICAgLy8gYmV0d2VlbiB0d28gdmFyaWFibGVzIHdpdGggdGhlIHNhbWUgbmFtZSBmcm9tIGRpZmZlcmVudCBzY29wZXMuCiAgICBpbnQgZmllbGROdW1iZXIgPSAwOwoKICAgIC8vIEZvciB0aGUgY2FwdHVyZWQgdmFyaWFibGVzIHRoYXQgYXJlIGJveGVkLCBlbnN1cmUgdGhpcyBjbG9zdXJlIGhhcyBhCiAgICAvLyBmaWVsZCB0byByZWZlcmVuY2UgdGhlIGJveC4gVGhpcyBwdXRzIHRoZSBib3hlcyBmaXJzdCBpbiB0aGUgY2xvc3VyZSBsaWtlCiAgICAvLyB0aGUgQVNUIGZyb250LWVuZCwgYnV0IG90aGVyd2lzZSB0aGVyZSBpcyBubyByZWFzb24gdG8gc2VwYXJhdGUgdGhpcyBsb29wCiAgICAvLyBmcm9tIHRoZSBvbmUgYmVsb3cuCiAgICAvLyBUT0RPKHJlZGVtcHRpb24pOiBNZXJnZSB0aGlzIGxvb3AgYW5kIHRoZSBmb2xsb3dpbmcuCgogICAgZm9yIChpci5Ob2RlIHZhcmlhYmxlIGluIGluZm8uZnJlZVZhcmlhYmxlcykgewogICAgICBpZiAodmFyaWFibGUgaXMgaXIuVmFyaWFibGVEZWNsYXJhdGlvbikgewogICAgICAgIExvY2FsIGNhcHR1cmVkTG9jYWwgPSBsb2NhbHNNYXAuZ2V0TG9jYWxWYXJpYWJsZSh2YXJpYWJsZSk7CiAgICAgICAgaWYgKF9pc0luUmVjb3JkKGNhcHR1cmVkTG9jYWwsIHJlY29yZEZpZWxkc1Zpc2libGVJblNjb3BlKSkgewogICAgICAgICAgYm9vbCBjb25zdHJ1Y3RlZEZpZWxkID0gX2NvbnN0cnVjdENsb3N1cmVGaWVsZEZvclJlY29yZCgKICAgICAgICAgICAgICBjYXB0dXJlZExvY2FsLAogICAgICAgICAgICAgIGNsb3N1cmVDbGFzc0luZm8sCiAgICAgICAgICAgICAgbWVtYmVyVGhpc1R5cGUsCiAgICAgICAgICAgICAgbWVtYmVyTWFwLAogICAgICAgICAgICAgIHZhcmlhYmxlLAogICAgICAgICAgICAgIHJlY29yZEZpZWxkc1Zpc2libGVJblNjb3BlLAogICAgICAgICAgICAgIGZpZWxkTnVtYmVyKTsKICAgICAgICAgIGlmIChjb25zdHJ1Y3RlZEZpZWxkKSBmaWVsZE51bWJlcisrOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIEFkZCBhIGZpZWxkIGZvciB0aGUgY2FwdHVyZWQgJ3RoaXMnLgogICAgaWYgKGluZm8udGhpc1VzZWRBc0ZyZWVWYXJpYWJsZSkgewogICAgICBfY29uc3RydWN0Q2xvc3VyZUZpZWxkKAogICAgICAgICAgY2xvc3VyZUNsYXNzSW5mby50aGlzTG9jYWwsCiAgICAgICAgICBjbG9zdXJlQ2xhc3NJbmZvLAogICAgICAgICAgbWVtYmVyVGhpc1R5cGUsCiAgICAgICAgICBtZW1iZXJNYXAsCiAgICAgICAgICBnZXRDbGFzc0RlZmluaXRpb24obWVtYmVyLmVuY2xvc2luZ0NsYXNzKS5ub2RlLAogICAgICAgICAgdHJ1ZSwKICAgICAgICAgIGZhbHNlLAogICAgICAgICAgZmllbGROdW1iZXIpOwogICAgICBmaWVsZE51bWJlcisrOwogICAgfQoKICAgIGZvciAoaXIuTm9kZSB2YXJpYWJsZSBpbiBpbmZvLmZyZWVWYXJpYWJsZXMpIHsKICAgICAgLy8gTWFrZSBhIGNvcnJlc3BvbmRpbmcgZmllbGQgZW50aXR5IGluIHRoaXMgY2xvc3VyZSBjbGFzcyBmb3IgdGhlCiAgICAgIC8vIGZyZWUgdmFyaWFibGVzIGluIHRoZSBLZXJuZWxTY29wZUluZm8uZnJlZVZhcmlhYmxlLgogICAgICBpZiAodmFyaWFibGUgaXMgaXIuVmFyaWFibGVEZWNsYXJhdGlvbikgewogICAgICAgIExvY2FsIGNhcHR1cmVkTG9jYWwgPSBsb2NhbHNNYXAuZ2V0TG9jYWxWYXJpYWJsZSh2YXJpYWJsZSk7CiAgICAgICAgaWYgKCFfaXNJblJlY29yZChjYXB0dXJlZExvY2FsLCByZWNvcmRGaWVsZHNWaXNpYmxlSW5TY29wZSkpIHsKICAgICAgICAgIF9jb25zdHJ1Y3RDbG9zdXJlRmllbGQoCiAgICAgICAgICAgICAgY2FwdHVyZWRMb2NhbCwKICAgICAgICAgICAgICBjbG9zdXJlQ2xhc3NJbmZvLAogICAgICAgICAgICAgIG1lbWJlclRoaXNUeXBlLAogICAgICAgICAgICAgIG1lbWJlck1hcCwKICAgICAgICAgICAgICB2YXJpYWJsZSwKICAgICAgICAgICAgICB2YXJpYWJsZS5pc0NvbnN0LAogICAgICAgICAgICAgIGZhbHNlLCAvLyBDbG9zdXJlIGZpZWxkIGlzIG5ldmVyIGFzc2lnbmVkIChvbmx5IGJveCBmaWVsZHMpLgogICAgICAgICAgICAgIGZpZWxkTnVtYmVyKTsKICAgICAgICAgIGZpZWxkTnVtYmVyKys7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHZhcmlhYmxlIGlzIFR5cGVWYXJpYWJsZVR5cGVXaXRoQ29udGV4dCkgewogICAgICAgIF9jb25zdHJ1Y3RDbG9zdXJlRmllbGQoCiAgICAgICAgICAgIGxvY2Fsc01hcC5nZXRMb2NhbFR5cGVWYXJpYWJsZSh2YXJpYWJsZS50eXBlLCB0aGlzKSwKICAgICAgICAgICAgY2xvc3VyZUNsYXNzSW5mbywKICAgICAgICAgICAgbWVtYmVyVGhpc1R5cGUsCiAgICAgICAgICAgIG1lbWJlck1hcCwKICAgICAgICAgICAgdmFyaWFibGUudHlwZS5wYXJhbWV0ZXIsCiAgICAgICAgICAgIHRydWUsCiAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICBmaWVsZE51bWJlcik7CiAgICAgICAgZmllbGROdW1iZXIrKzsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5leHBlY3RlZCBmaWVsZCBub2RlIHR5cGU6ICR2YXJpYWJsZSIpOwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gUmVjb3JkcyBwb2ludCB0byBvbmUgb3IgbW9yZSBsb2NhbCB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gYW5vdGhlciBzY29wZQogIC8vLyB0aGF0IGFyZSBjYXB0dXJlZCBpbiBhIHNjb3BlLiBBY2Nlc3MgdG8gdGhvc2UgdmFyaWFibGVzIGdvZXMgZW50aXJlbHkKICAvLy8gdGhyb3VnaCB0aGUgcmVjb3JkIGNvbnRhaW5lciwgc28gd2Ugb25seSBjcmVhdGUgYSBmaWVsZCBmb3IgdGhlICpyZWNvcmQqCiAgLy8vIGhvbGRpbmcgW2NhcHR1cmVkTG9jYWxdIGFuZCBub3QgdGhlIGluZGl2aWR1YWwgbG9jYWwgdmFyaWFibGVzIGFjY2Vzc2VkCiAgLy8vIHRocm91Z2ggdGhlIHJlY29yZC4gUmVjb3JkcywgYnkgZGVmaW5pdGlvbiwgYXJlIG5vdCBtdXRhYmxlICh0aG91Z2ggdGhlCiAgLy8vIGxvY2FscyB0aGV5IGNvbnRhaW4gbWF5IGJlKS4gUmV0dXJucyBgdHJ1ZWAgaWYgd2UgY29uc3RydWN0ZWQgYSBuZXcgZmllbGQKICAvLy8gaW4gdGhlIGNsb3N1cmUgY2xhc3MuCiAgYm9vbCBfY29uc3RydWN0Q2xvc3VyZUZpZWxkRm9yUmVjb3JkKAogICAgICBMb2NhbCBjYXB0dXJlZExvY2FsLAogICAgICBLZXJuZWxDbG9zdXJlQ2xhc3NJbmZvIGNsb3N1cmVDbGFzc0luZm8sCiAgICAgIEludGVyZmFjZVR5cGUgbWVtYmVyVGhpc1R5cGUsCiAgICAgIE1hcDxTdHJpbmcsIE1lbWJlckVudGl0eT4gbWVtYmVyTWFwLAogICAgICBpci5UcmVlTm9kZSBzb3VyY2VOb2RlLAogICAgICBNYXA8TG9jYWwsIEpSZWNvcmRGaWVsZD4gcmVjb3JkRmllbGRzVmlzaWJsZUluU2NvcGUsCiAgICAgIGludCBmaWVsZE51bWJlcikgewogICAgSlJlY29yZEZpZWxkIHJlY29yZEZpZWxkID0gcmVjb3JkRmllbGRzVmlzaWJsZUluU2NvcGVbY2FwdHVyZWRMb2NhbF07CgogICAgLy8gRG9uJ3QgY29uc3RydWN0IGEgbmV3IGZpZWxkIGlmIHRoZSBib3ggdGhhdCBob2xkcyB0aGlzIGxvY2FsIGFscmVhZHkgaGFzCiAgICAvLyBhIGZpZWxkIGluIHRoZSBjbG9zdXJlIGNsYXNzLgogICAgaWYgKGNsb3N1cmVDbGFzc0luZm8ubG9jYWxUb0ZpZWxkTWFwLmNvbnRhaW5zS2V5KHJlY29yZEZpZWxkLmJveCkpIHsKICAgICAgY2xvc3VyZUNsYXNzSW5mby5ib3hlZFZhcmlhYmxlc1tjYXB0dXJlZExvY2FsXSA9IHJlY29yZEZpZWxkOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgRmllbGRFbnRpdHkgY2xvc3VyZUZpZWxkID0gbmV3IEpDbG9zdXJlRmllbGQoCiAgICAgICAgJ19ib3hfJGZpZWxkTnVtYmVyJywgY2xvc3VyZUNsYXNzSW5mbywgcmVjb3JkRmllbGQuYm94Lm5hbWUsCiAgICAgICAgaXNDb25zdDogdHJ1ZSwgaXNBc3NpZ25hYmxlOiBmYWxzZSk7CgogICAgbWVtYmVycy5yZWdpc3RlcjxJbmRleGVkRmllbGQsIEpGaWVsZERhdGE+KAogICAgICAgIGNsb3N1cmVGaWVsZCwKICAgICAgICBuZXcgQ2xvc3VyZUZpZWxkRGF0YSgKICAgICAgICAgICAgbmV3IENsb3N1cmVNZW1iZXJEZWZpbml0aW9uKAogICAgICAgICAgICAgICAgY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUoc291cmNlTm9kZSksCiAgICAgICAgICAgICAgICBNZW1iZXJLaW5kLmNsb3N1cmVGaWVsZCwKICAgICAgICAgICAgICAgIHNvdXJjZU5vZGUpLAogICAgICAgICAgICBtZW1iZXJUaGlzVHlwZSkpOwogICAgbWVtYmVyTWFwW2Nsb3N1cmVGaWVsZC5uYW1lXSA9IGNsb3N1cmVGaWVsZDsKICAgIGNsb3N1cmVDbGFzc0luZm8ubG9jYWxUb0ZpZWxkTWFwW3JlY29yZEZpZWxkLmJveF0gPSBjbG9zdXJlRmllbGQ7CiAgICBjbG9zdXJlQ2xhc3NJbmZvLmJveGVkVmFyaWFibGVzW2NhcHR1cmVkTG9jYWxdID0gcmVjb3JkRmllbGQ7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHZvaWQgX2NvbnN0cnVjdFNpZ25hdHVyZU1ldGhvZCgKICAgICAgS2VybmVsQ2xvc3VyZUNsYXNzSW5mbyBjbG9zdXJlQ2xhc3NJbmZvLAogICAgICBNYXA8U3RyaW5nLCBNZW1iZXJFbnRpdHk+IG1lbWJlck1hcCwKICAgICAgaXIuRnVuY3Rpb25Ob2RlIGNsb3N1cmVTb3VyY2VOb2RlLAogICAgICBJbnRlcmZhY2VUeXBlIG1lbWJlclRoaXNUeXBlLAogICAgICBTb3VyY2VTcGFuIGxvY2F0aW9uLAogICAgICBDbGFzc1R5cGVWYXJpYWJsZUFjY2VzcyB0eXBlVmFyaWFibGVBY2Nlc3MpIHsKICAgIEZ1bmN0aW9uRW50aXR5IHNpZ25hdHVyZU1ldGhvZCA9CiAgICAgICAgbmV3IEpTaWduYXR1cmVNZXRob2QoY2xvc3VyZUNsYXNzSW5mby5jbG9zdXJlQ2xhc3NFbnRpdHkpOwogICAgbWVtYmVycy5yZWdpc3RlcjxJbmRleGVkRnVuY3Rpb24sIEZ1bmN0aW9uRGF0YT4oCiAgICAgICAgc2lnbmF0dXJlTWV0aG9kLAogICAgICAgIG5ldyBTaWduYXR1cmVGdW5jdGlvbkRhdGEoCiAgICAgICAgICAgIG5ldyBTcGVjaWFsTWVtYmVyRGVmaW5pdGlvbigKICAgICAgICAgICAgICAgIGNsb3N1cmVTb3VyY2VOb2RlLnBhcmVudCwgTWVtYmVyS2luZC5zaWduYXR1cmUpLAogICAgICAgICAgICBtZW1iZXJUaGlzVHlwZSwKICAgICAgICAgICAgY2xvc3VyZVNvdXJjZU5vZGUudHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICAgIHR5cGVWYXJpYWJsZUFjY2VzcykpOwogICAgbWVtYmVyTWFwW3NpZ25hdHVyZU1ldGhvZC5uYW1lXSA9CiAgICAgICAgY2xvc3VyZUNsYXNzSW5mby5zaWduYXR1cmVNZXRob2QgPSBzaWduYXR1cmVNZXRob2Q7CiAgfQoKICB2b2lkIF9jb25zdHJ1Y3RDbG9zdXJlRmllbGQoCiAgICAgIExvY2FsIGNhcHR1cmVkTG9jYWwsCiAgICAgIEtlcm5lbENsb3N1cmVDbGFzc0luZm8gY2xvc3VyZUNsYXNzSW5mbywKICAgICAgSW50ZXJmYWNlVHlwZSBtZW1iZXJUaGlzVHlwZSwKICAgICAgTWFwPFN0cmluZywgTWVtYmVyRW50aXR5PiBtZW1iZXJNYXAsCiAgICAgIGlyLlRyZWVOb2RlIHNvdXJjZU5vZGUsCiAgICAgIGJvb2wgaXNDb25zdCwKICAgICAgYm9vbCBpc0Fzc2lnbmFibGUsCiAgICAgIGludCBmaWVsZE51bWJlcikgewogICAgRmllbGRFbnRpdHkgY2xvc3VyZUZpZWxkID0gbmV3IEpDbG9zdXJlRmllbGQoCiAgICAgICAgX2dldENsb3N1cmVWYXJpYWJsZU5hbWUoY2FwdHVyZWRMb2NhbC5uYW1lLCBmaWVsZE51bWJlciksCiAgICAgICAgY2xvc3VyZUNsYXNzSW5mbywKICAgICAgICBjYXB0dXJlZExvY2FsLm5hbWUsCiAgICAgICAgaXNDb25zdDogaXNDb25zdCwKICAgICAgICBpc0Fzc2lnbmFibGU6IGlzQXNzaWduYWJsZSk7CgogICAgbWVtYmVycy5yZWdpc3RlcjxJbmRleGVkRmllbGQsIEpGaWVsZERhdGE+KAogICAgICAgIGNsb3N1cmVGaWVsZCwKICAgICAgICBuZXcgQ2xvc3VyZUZpZWxkRGF0YSgKICAgICAgICAgICAgbmV3IENsb3N1cmVNZW1iZXJEZWZpbml0aW9uKAogICAgICAgICAgICAgICAgY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUoc291cmNlTm9kZSksCiAgICAgICAgICAgICAgICBNZW1iZXJLaW5kLmNsb3N1cmVGaWVsZCwKICAgICAgICAgICAgICAgIHNvdXJjZU5vZGUpLAogICAgICAgICAgICBtZW1iZXJUaGlzVHlwZSkpOwogICAgbWVtYmVyTWFwW2Nsb3N1cmVGaWVsZC5uYW1lXSA9IGNsb3N1cmVGaWVsZDsKICAgIGNsb3N1cmVDbGFzc0luZm8ubG9jYWxUb0ZpZWxkTWFwW2NhcHR1cmVkTG9jYWxdID0gY2xvc3VyZUZpZWxkOwogIH0KCiAgLy8gUmV0dXJucyBhIG5vbi11bmlxdWUgbmFtZSBmb3IgdGhlIGdpdmVuIGNsb3N1cmUgZWxlbWVudC4KICBTdHJpbmcgX2NvbXB1dGVDbG9zdXJlTmFtZShpci5UcmVlTm9kZSB0cmVlTm9kZSkgewogICAgdmFyIHBhcnRzID0gPFN0cmluZz5bXTsKICAgIC8vIEZpcnN0IGFub255bW91cyBpcyBjYWxsZWQgJ2Nsb3N1cmUnLCBvdXRlciBvbmVzIGNhbGxlZCAnJyB0byBnaXZlIGEKICAgIC8vIGNvbXBvdW5kIG5hbWUgd2hlcmUgaW5jcmVhc2luZyBuZXN0aW5nIGxldmVsIGNvcnJlc3BvbmRzIHRvIGV4dHJhCiAgICAvLyB1bmRlcnNjb3Jlcy4KICAgIHZhciBhbm9ueW1vdXMgPSAnY2xvc3VyZSc7CiAgICBpci5UcmVlTm9kZSBjdXJyZW50ID0gdHJlZU5vZGU7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTaW1wbGlmeSBjb21wdXRlZCBuYW1lcy4KICAgIHdoaWxlIChjdXJyZW50ICE9IG51bGwpIHsKICAgICAgdmFyIG5vZGUgPSBjdXJyZW50OwogICAgICBpZiAobm9kZSBpcyBpci5GdW5jdGlvbkV4cHJlc3Npb24pIHsKICAgICAgICBwYXJ0cy5hZGQoYW5vbnltb3VzKTsKICAgICAgICBhbm9ueW1vdXMgPSAnJzsKICAgICAgfSBlbHNlIGlmIChub2RlIGlzIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24pIHsKICAgICAgICBTdHJpbmcgbmFtZSA9IG5vZGUudmFyaWFibGUubmFtZTsKICAgICAgICBpZiAobmFtZSAhPSBudWxsICYmIG5hbWUgIT0gIiIpIHsKICAgICAgICAgIHBhcnRzLmFkZCh1dGlscy5vcGVyYXRvck5hbWVUb0lkZW50aWZpZXIobmFtZSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwYXJ0cy5hZGQoYW5vbnltb3VzKTsKICAgICAgICAgIGFub255bW91cyA9ICcnOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChub2RlIGlzIGlyLkNsYXNzKSB7CiAgICAgICAgLy8gVE9ETyhzcmEpOiBEbyBzb21ldGhpbmcgd2l0aCBhYnN0cmFjdGVkIG1peGluIHR5cGUgbmFtZXMgbGlrZSAnXiNVMCcuCiAgICAgICAgcGFydHMuYWRkKG5vZGUubmFtZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0gZWxzZSBpZiAobm9kZSBpcyBpci5Qcm9jZWR1cmUpIHsKICAgICAgICBpZiAobm9kZS5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuRmFjdG9yeSkgewogICAgICAgICAgcGFydHMuYWRkKHV0aWxzLnJlY29uc3RydWN0Q29uc3RydWN0b3JOYW1lKGdldE1lbWJlcihub2RlKSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwYXJ0cy5hZGQodXRpbHMub3BlcmF0b3JOYW1lVG9JZGVudGlmaWVyKG5vZGUubmFtZS5uYW1lKSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKG5vZGUgaXMgaXIuQ29uc3RydWN0b3IpIHsKICAgICAgICBwYXJ0cy5hZGQodXRpbHMucmVjb25zdHJ1Y3RDb25zdHJ1Y3Rvck5hbWUoZ2V0TWVtYmVyKG5vZGUpKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50OwogICAgfQogICAgcmV0dXJuIHBhcnRzLnJldmVyc2VkLmpvaW4oJ18nKTsKICB9CgogIC8vLyBHZW5lcmF0ZSBhIHVuaXF1ZSBuYW1lIGZvciB0aGUgW2lkXXRoIGNsb3N1cmUgZmllbGQsIHdpdGggcHJvcG9zZWQgbmFtZQogIC8vLyBbbmFtZV0uCiAgLy8vCiAgLy8vIFRoZSByZXN1bHQgaXMgdXNlZCBhcyB0aGUgbmFtZSBvZiBbQ2xvc3VyZUZpZWxkRWxlbWVudF1zLCBhbmQgbXVzdAogIC8vLyB0aGVyZWZvcmUgYmUgdW5pcXVlIHRvIGF2b2lkIGJyZWFraW5nIGFuIGludmFyaWFudCBpbiB0aGUgZWxlbWVudCBtb2RlbAogIC8vLyAoY2xhc3NlcyBjYW5ub3QgZGVjbGFyZSBtdWx0aXBsZSBmaWVsZHMgd2l0aCB0aGUgc2FtZSBuYW1lKS4KICAvLy8KICAvLy8gQWxzbywgdGhlIG5hbWVzIHNob3VsZCBiZSBkaXN0aW5jdCBmcm9tIHJlYWwgZmllbGQgbmFtZXMgdG8gcHJldmVudAogIC8vLyBjbGFzaGVzIHdpdGggc2VsZWN0b3JzIGZvciB0aG9zZSBmaWVsZHMuCiAgLy8vCiAgLy8vIFRoZXNlIG5hbWVzIGFyZSBub3QgdXNlZCBpbiBnZW5lcmF0ZWQgY29kZSwganVzdCBhcyBlbGVtZW50IG5hbWUuCiAgU3RyaW5nIF9nZXRDbG9zdXJlVmFyaWFibGVOYW1lKFN0cmluZyBuYW1lLCBpbnQgaWQpIHsKICAgIHJldHVybiAiX2NhcHR1cmVkXyR7bmFtZX1fJGlkIjsKICB9CgogIEBvdmVycmlkZQogIEpHZW5lcmF0b3JCb2R5IGdldEdlbmVyYXRvckJvZHkoY292YXJpYW50IEluZGV4ZWRGdW5jdGlvbiBmdW5jdGlvbikgewogICAgSkdlbmVyYXRvckJvZHkgZ2VuZXJhdG9yQm9keSA9IF9nZW5lcmF0b3JCb2RpZXNbZnVuY3Rpb25dOwogICAgaWYgKGdlbmVyYXRvckJvZHkgPT0gbnVsbCkgewogICAgICBGdW5jdGlvbkRhdGEgZnVuY3Rpb25EYXRhID0gbWVtYmVycy5nZXREYXRhKGZ1bmN0aW9uKTsKICAgICAgaXIuVHJlZU5vZGUgbm9kZSA9IGZ1bmN0aW9uRGF0YS5kZWZpbml0aW9uLm5vZGU7CiAgICAgIERhcnRUeXBlIGVsZW1lbnRUeXBlID0KICAgICAgICAgIGVsZW1lbnRFbnZpcm9ubWVudC5nZXRGdW5jdGlvbkFzeW5jT3JTeW5jU3RhckVsZW1lbnRUeXBlKGZ1bmN0aW9uKTsKICAgICAgZ2VuZXJhdG9yQm9keSA9IGNyZWF0ZUdlbmVyYXRvckJvZHkoZnVuY3Rpb24sIGVsZW1lbnRUeXBlKTsKICAgICAgbWVtYmVycy5yZWdpc3RlcjxJbmRleGVkRnVuY3Rpb24sIEZ1bmN0aW9uRGF0YT4oCiAgICAgICAgICBnZW5lcmF0b3JCb2R5LAogICAgICAgICAgbmV3IEdlbmVyYXRvckJvZHlGdW5jdGlvbkRhdGEoZnVuY3Rpb25EYXRhLAogICAgICAgICAgICAgIG5ldyBTcGVjaWFsTWVtYmVyRGVmaW5pdGlvbihub2RlLCBNZW1iZXJLaW5kLmdlbmVyYXRvckJvZHkpKSk7CgogICAgICBpZiAoZnVuY3Rpb24uZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCkgewogICAgICAgIC8vIFRPRE8oc3JhKTogSW50ZWdyYXRlIHRoaXMgd2l0aCBDbGFzc0VudkltcGwuYWRkQ29uc3RydWN0b3JCb2R5ID8KICAgICAgICAoX2luamVjdGVkQ2xhc3NNZW1iZXJzW2Z1bmN0aW9uLmVuY2xvc2luZ0NsYXNzXSA/Pz0gPEluZGV4ZWRNZW1iZXI+W10pCiAgICAgICAgICAgIC5hZGQoZ2VuZXJhdG9yQm9keSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBnZW5lcmF0b3JCb2R5OwogIH0KCiAgQG92ZXJyaWRlCiAganMuVGVtcGxhdGUgZ2V0SnNCdWlsdGluVGVtcGxhdGUoCiAgICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnQsIENvZGVFbWl0dGVyVGFzayBlbWl0dGVyKSB7CiAgICBpbnQgaW5kZXggPSBleHRyYWN0RW51bUluZGV4RnJvbUNvbnN0YW50VmFsdWUoCiAgICAgICAgY29uc3RhbnQsIGNvbW1vbkVsZW1lbnRzLmpzQnVpbHRpbkVudW0pOwogICAgaWYgKGluZGV4ID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIGVtaXR0ZXIuYnVpbHRpblRlbXBsYXRlRm9yKEpzQnVpbHRpbi52YWx1ZXNbaW5kZXhdKTsKICB9Cn0KCmNsYXNzIEpzRWxlbWVudEVudmlyb25tZW50IGV4dGVuZHMgRWxlbWVudEVudmlyb25tZW50CiAgICBpbXBsZW1lbnRzIEpFbGVtZW50RW52aXJvbm1lbnQgewogIGZpbmFsIEpzS2VybmVsVG9FbGVtZW50TWFwIGVsZW1lbnRNYXA7CgogIEpzRWxlbWVudEVudmlyb25tZW50KHRoaXMuZWxlbWVudE1hcCk7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldCBkeW5hbWljVHlwZSA9PiBjb25zdCBEeW5hbWljVHlwZSgpOwoKICBAb3ZlcnJpZGUKICBMaWJyYXJ5RW50aXR5IGdldCBtYWluTGlicmFyeSA9PiBlbGVtZW50TWFwLl9tYWluTGlicmFyeTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IG1haW5GdW5jdGlvbiA9PiBlbGVtZW50TWFwLl9tYWluRnVuY3Rpb247CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPExpYnJhcnlFbnRpdHk+IGdldCBsaWJyYXJpZXMgPT4gZWxlbWVudE1hcC5saWJyYXJ5TGlzdEludGVybmFsOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0TGlicmFyeU5hbWUoTGlicmFyeUVudGl0eSBsaWJyYXJ5KSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5fZ2V0TGlicmFyeU5hbWUobGlicmFyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldFRoaXNUeXBlKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuZ2V0VGhpc1R5cGUoY2xzKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0UmF3VHlwZShDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBlbGVtZW50TWFwLl9nZXRSYXdUeXBlKGNscyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzR2VuZXJpY0NsYXNzKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGdldFRoaXNUeXBlKGNscykudHlwZUFyZ3VtZW50cy5pc05vdEVtcHR5OwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc01peGluQXBwbGljYXRpb24oQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5faXNNaXhpbkFwcGxpY2F0aW9uKGNscyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzVW5uYW1lZE1peGluQXBwbGljYXRpb24oQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5faXNVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbihjbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1N1cGVyTWl4aW5BcHBsaWNhdGlvbihDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBlbGVtZW50TWFwLl9pc1N1cGVyTWl4aW5BcHBsaWNhdGlvbihjbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0RWZmZWN0aXZlTWl4aW5DbGFzcyhDbGFzc0VudGl0eSBjbHMpIHsKICAgIGlmICghaXNNaXhpbkFwcGxpY2F0aW9uKGNscykpIHJldHVybiBudWxsOwogICAgZG8gewogICAgICBjbHMgPSBlbGVtZW50TWFwLmdldEFwcGxpZWRNaXhpbihjbHMpOwogICAgfSB3aGlsZSAoaXNNaXhpbkFwcGxpY2F0aW9uKGNscykpOwogICAgcmV0dXJuIGNsczsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldFR5cGVWYXJpYWJsZUJvdW5kKFR5cGVWYXJpYWJsZUVudGl0eSB0eXBlVmFyaWFibGUpIHsKICAgIHJldHVybiBlbGVtZW50TWFwLmdldFR5cGVWYXJpYWJsZUJvdW5kKHR5cGVWYXJpYWJsZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRUeXBlVmFyaWFibGVEZWZhdWx0VHlwZShUeXBlVmFyaWFibGVFbnRpdHkgdHlwZVZhcmlhYmxlKSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5fZ2V0VHlwZVZhcmlhYmxlRGVmYXVsdFR5cGUodHlwZVZhcmlhYmxlKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgY3JlYXRlSW50ZXJmYWNlVHlwZSgKICAgICAgQ2xhc3NFbnRpdHkgY2xzLCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUoY2xzLCB0eXBlQXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uVHlwZSBnZXRGdW5jdGlvblR5cGUoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pIHsKICAgIHJldHVybiBlbGVtZW50TWFwLl9nZXRGdW5jdGlvblR5cGUoZnVuY3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxUeXBlVmFyaWFibGVUeXBlPiBnZXRGdW5jdGlvblR5cGVWYXJpYWJsZXMoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pIHsKICAgIHJldHVybiBlbGVtZW50TWFwLl9nZXRGdW5jdGlvblR5cGVWYXJpYWJsZXMoZnVuY3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0RnVuY3Rpb25Bc3luY09yU3luY1N0YXJFbGVtZW50VHlwZShGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikgewogICAgLy8gVE9ETyhzcmEpOiBTaG91bGQgYmUgZ2V0dGluZyB0aGUgRGFydFR5cGUgZnJvbSB0aGUgbm9kZS4KICAgIERhcnRUeXBlIHJldHVyblR5cGUgPSBnZXRGdW5jdGlvblR5cGUoZnVuY3Rpb24pLnJldHVyblR5cGU7CiAgICByZXR1cm4gZ2V0QXN5bmNPclN5bmNTdGFyRWxlbWVudFR5cGUoZnVuY3Rpb24uYXN5bmNNYXJrZXIsIHJldHVyblR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0QXN5bmNPclN5bmNTdGFyRWxlbWVudFR5cGUoCiAgICAgIEFzeW5jTWFya2VyIGFzeW5jTWFya2VyLCBEYXJ0VHlwZSByZXR1cm5UeXBlKSB7CiAgICBzd2l0Y2ggKGFzeW5jTWFya2VyKSB7CiAgICAgIGNhc2UgQXN5bmNNYXJrZXIuU1lOQzoKICAgICAgICByZXR1cm4gcmV0dXJuVHlwZTsKICAgICAgY2FzZSBBc3luY01hcmtlci5TWU5DX1NUQVI6CiAgICAgICAgaWYgKHJldHVyblR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICAgICAgaWYgKHJldHVyblR5cGUuZWxlbWVudCA9PSBlbGVtZW50TWFwLmNvbW1vbkVsZW1lbnRzLml0ZXJhYmxlQ2xhc3MpIHsKICAgICAgICAgICAgcmV0dXJuIHJldHVyblR5cGUudHlwZUFyZ3VtZW50cy5maXJzdDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGR5bmFtaWNUeXBlOwogICAgICBjYXNlIEFzeW5jTWFya2VyLkFTWU5DOgogICAgICAgIGlmIChyZXR1cm5UeXBlIGlzIEZ1dHVyZU9yVHlwZSkgcmV0dXJuIHJldHVyblR5cGUudHlwZUFyZ3VtZW50OwogICAgICAgIGlmIChyZXR1cm5UeXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVsZW1lbnQgPT0gZWxlbWVudE1hcC5jb21tb25FbGVtZW50cy5mdXR1cmVDbGFzcykgewogICAgICAgICAgICByZXR1cm4gcmV0dXJuVHlwZS50eXBlQXJndW1lbnRzLmZpcnN0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZHluYW1pY1R5cGU7CiAgICAgIGNhc2UgQXN5bmNNYXJrZXIuQVNZTkNfU1RBUjoKICAgICAgICBpZiAocmV0dXJuVHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lbGVtZW50ID09IGVsZW1lbnRNYXAuY29tbW9uRWxlbWVudHMuc3RyZWFtQ2xhc3MpIHsKICAgICAgICAgICAgcmV0dXJuIHJldHVyblR5cGUudHlwZUFyZ3VtZW50cy5maXJzdDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGR5bmFtaWNUeXBlOwogICAgfQogICAgYXNzZXJ0KGZhbHNlLCAnVW5leHBlY3RlZCBtYXJrZXIgJHthc3luY01hcmtlcn0nKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0RmllbGRUeXBlKEZpZWxkRW50aXR5IGZpZWxkKSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5fZ2V0RmllbGRUeXBlKGZpZWxkKTsKICB9CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uVHlwZSBnZXRMb2NhbEZ1bmN0aW9uVHlwZShjb3ZhcmlhbnQgS0xvY2FsRnVuY3Rpb24gZnVuY3Rpb24pIHsKICAgIHJldHVybiBmdW5jdGlvbi5mdW5jdGlvblR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRVbmFsaWFzZWRUeXBlKERhcnRUeXBlIHR5cGUpID0+IHR5cGU7CgogIEBvdmVycmlkZQogIENvbnN0cnVjdG9yRW50aXR5IGxvb2t1cENvbnN0cnVjdG9yKENsYXNzRW50aXR5IGNscywgU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIHJlcXVpcmVkOiBmYWxzZX0pIHsKICAgIENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yID0gZWxlbWVudE1hcC5sb29rdXBDb25zdHJ1Y3RvcihjbHMsIG5hbWUpOwogICAgaWYgKGNvbnN0cnVjdG9yID09IG51bGwgJiYgcmVxdWlyZWQpIHsKICAgICAgdGhyb3cgZmFpbGVkQXQoCiAgICAgICAgICBDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICAgIlRoZSBjb25zdHJ1Y3RvciAnJG5hbWUnIHdhcyBub3QgZm91bmQgaW4gY2xhc3MgJyR7Y2xzLm5hbWV9JyAiCiAgICAgICAgICAiaW4gbGlicmFyeSAke2Nscy5saWJyYXJ5LmNhbm9uaWNhbFVyaX0uIik7CiAgICB9CiAgICByZXR1cm4gY29uc3RydWN0b3I7CiAgfQoKICBAb3ZlcnJpZGUKICBNZW1iZXJFbnRpdHkgbG9va3VwTG9jYWxDbGFzc01lbWJlcihDbGFzc0VudGl0eSBjbHMsIFN0cmluZyBuYW1lLAogICAgICB7Ym9vbCBzZXR0ZXI6IGZhbHNlLCBib29sIHJlcXVpcmVkOiBmYWxzZX0pIHsKICAgIE1lbWJlckVudGl0eSBtZW1iZXIgPQogICAgICAgIGVsZW1lbnRNYXAubG9va3VwQ2xhc3NNZW1iZXIoY2xzLCBuYW1lLCBzZXR0ZXI6IHNldHRlcik7CiAgICBpZiAobWVtYmVyID09IG51bGwgJiYgcmVxdWlyZWQpIHsKICAgICAgdGhyb3cgZmFpbGVkQXQoQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICAgICJUaGUgbWVtYmVyICckbmFtZScgd2FzIG5vdCBmb3VuZCBpbiAke2Nscy5uYW1lfS4iKTsKICAgIH0KICAgIHJldHVybiBtZW1iZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXRTdXBlckNsYXNzKENsYXNzRW50aXR5IGNscywKICAgICAge2Jvb2wgc2tpcFVubmFtZWRNaXhpbkFwcGxpY2F0aW9uczogZmFsc2V9KSB7CiAgICBhc3NlcnQoZWxlbWVudE1hcC5jaGVja0ZhbWlseShjbHMpKTsKICAgIENsYXNzRW50aXR5IHN1cGVyY2xhc3MgPSBlbGVtZW50TWFwLmdldFN1cGVyVHlwZShjbHMpPy5lbGVtZW50OwogICAgaWYgKHNraXBVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbnMpIHsKICAgICAgd2hpbGUgKHN1cGVyY2xhc3MgIT0gbnVsbCAmJgogICAgICAgICAgZWxlbWVudE1hcC5faXNVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbihzdXBlcmNsYXNzKSkgewogICAgICAgIHN1cGVyY2xhc3MgPSBlbGVtZW50TWFwLmdldFN1cGVyVHlwZShzdXBlcmNsYXNzKT8uZWxlbWVudDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN1cGVyY2xhc3M7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hTdXBlcnR5cGUoQ2xhc3NFbnRpdHkgY2xzLCB2b2lkIGYoSW50ZXJmYWNlVHlwZSBzdXBlcnR5cGUpKSB7CiAgICBlbGVtZW50TWFwLl9mb3JFYWNoU3VwZXJ0eXBlKGNscywgZik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hMb2NhbENsYXNzTWVtYmVyKENsYXNzRW50aXR5IGNscywgdm9pZCBmKE1lbWJlckVudGl0eSBtZW1iZXIpKSB7CiAgICBlbGVtZW50TWFwLl9mb3JFYWNoTG9jYWxDbGFzc01lbWJlcihjbHMsIGYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoSW5qZWN0ZWRDbGFzc01lbWJlcigKICAgICAgQ2xhc3NFbnRpdHkgY2xzLCB2b2lkIGYoTWVtYmVyRW50aXR5IG1lbWJlcikpIHsKICAgIGVsZW1lbnRNYXAuZm9yRWFjaEluamVjdGVkQ2xhc3NNZW1iZXIoY2xzLCBmKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaENsYXNzTWVtYmVyKAogICAgICBDbGFzc0VudGl0eSBjbHMsIHZvaWQgZihDbGFzc0VudGl0eSBkZWNsYXJlciwgTWVtYmVyRW50aXR5IG1lbWJlcikpIHsKICAgIGVsZW1lbnRNYXAuX2ZvckVhY2hDbGFzc01lbWJlcihjbHMsIGYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoQ29uc3RydWN0b3IoCiAgICAgIENsYXNzRW50aXR5IGNscywgdm9pZCBmKENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yKSkgewogICAgZWxlbWVudE1hcC5fZm9yRWFjaENvbnN0cnVjdG9yKGNscywgZik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hDb25zdHJ1Y3RvckJvZHkoCiAgICAgIENsYXNzRW50aXR5IGNscywgdm9pZCBmKENvbnN0cnVjdG9yQm9keUVudGl0eSBjb25zdHJ1Y3RvcikpIHsKICAgIGVsZW1lbnRNYXAuZm9yRWFjaENvbnN0cnVjdG9yQm9keShjbHMsIGYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoTmVzdGVkQ2xvc3VyZSgKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciwgdm9pZCBmKEZ1bmN0aW9uRW50aXR5IGNsb3N1cmUpKSB7CiAgICBlbGVtZW50TWFwLmZvckVhY2hOZXN0ZWRDbG9zdXJlKG1lbWJlciwgZik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hMaWJyYXJ5TWVtYmVyKAogICAgICBMaWJyYXJ5RW50aXR5IGxpYnJhcnksIHZvaWQgZihNZW1iZXJFbnRpdHkgbWVtYmVyKSkgewogICAgZWxlbWVudE1hcC5fZm9yRWFjaExpYnJhcnlNZW1iZXIobGlicmFyeSwgZik7CiAgfQoKICBAb3ZlcnJpZGUKICBNZW1iZXJFbnRpdHkgbG9va3VwTGlicmFyeU1lbWJlcihMaWJyYXJ5RW50aXR5IGxpYnJhcnksIFN0cmluZyBuYW1lLAogICAgICB7Ym9vbCBzZXR0ZXI6IGZhbHNlLCBib29sIHJlcXVpcmVkOiBmYWxzZX0pIHsKICAgIE1lbWJlckVudGl0eSBtZW1iZXIgPQogICAgICAgIGVsZW1lbnRNYXAubG9va3VwTGlicmFyeU1lbWJlcihsaWJyYXJ5LCBuYW1lLCBzZXR0ZXI6IHNldHRlcik7CiAgICBpZiAobWVtYmVyID09IG51bGwgJiYgcmVxdWlyZWQpIHsKICAgICAgZmFpbGVkQXQoQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICAgICJUaGUgbWVtYmVyICcke25hbWV9JyB3YXMgbm90IGZvdW5kIGluIGxpYnJhcnkgJyR7bGlicmFyeS5uYW1lfScuIik7CiAgICB9CiAgICByZXR1cm4gbWVtYmVyOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgbG9va3VwQ2xhc3MoTGlicmFyeUVudGl0eSBsaWJyYXJ5LCBTdHJpbmcgbmFtZSwKICAgICAge2Jvb2wgcmVxdWlyZWQ6IGZhbHNlfSkgewogICAgQ2xhc3NFbnRpdHkgY2xzID0gZWxlbWVudE1hcC5sb29rdXBDbGFzcyhsaWJyYXJ5LCBuYW1lKTsKICAgIGlmIChjbHMgPT0gbnVsbCAmJiByZXF1aXJlZCkgewogICAgICBmYWlsZWRBdChDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICAgIlRoZSBjbGFzcyAnJG5hbWUnICB3YXMgbm90IGZvdW5kIGluIGxpYnJhcnkgJyR7bGlicmFyeS5uYW1lfScuIik7CiAgICB9CiAgICByZXR1cm4gY2xzOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoQ2xhc3MoTGlicmFyeUVudGl0eSBsaWJyYXJ5LCB2b2lkIGYoQ2xhc3NFbnRpdHkgY2xzKSkgewogICAgZWxlbWVudE1hcC5fZm9yRWFjaENsYXNzKGxpYnJhcnksIGYpOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlicmFyeUVudGl0eSBsb29rdXBMaWJyYXJ5KFVyaSB1cmksIHtib29sIHJlcXVpcmVkOiBmYWxzZX0pIHsKICAgIExpYnJhcnlFbnRpdHkgbGlicmFyeSA9IGVsZW1lbnRNYXAubG9va3VwTGlicmFyeSh1cmkpOwogICAgaWYgKGxpYnJhcnkgPT0gbnVsbCAmJiByZXF1aXJlZCkgewogICAgICBmYWlsZWRBdChDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLCAiVGhlIGxpYnJhcnkgJyR1cmknIHdhcyBub3QgZm91bmQuIik7CiAgICB9CiAgICByZXR1cm4gbGlicmFyeTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNFbnVtQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICBhc3NlcnQoZWxlbWVudE1hcC5jaGVja0ZhbWlseShjbHMpKTsKICAgIEpDbGFzc0RhdGEgY2xhc3NEYXRhID0gZWxlbWVudE1hcC5jbGFzc2VzLmdldERhdGEoY2xzKTsKICAgIHJldHVybiBjbGFzc0RhdGEuaXNFbnVtQ2xhc3M7CiAgfQp9CgovLy8gW0JlaGF2aW9yQnVpbGRlcl0gZm9yIGtlcm5lbCBiYXNlZCBlbGVtZW50cy4KY2xhc3MgSnNCZWhhdmlvckJ1aWxkZXIgZXh0ZW5kcyBCZWhhdmlvckJ1aWxkZXIgewogIEBvdmVycmlkZQogIGZpbmFsIEVsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQ7CiAgQG92ZXJyaWRlCiAgZmluYWwgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHM7CiAgQG92ZXJyaWRlCiAgZmluYWwgRGlhZ25vc3RpY1JlcG9ydGVyIHJlcG9ydGVyOwogIEBvdmVycmlkZQogIGZpbmFsIE5hdGl2ZUJhc2ljRGF0YSBuYXRpdmVCYXNpY0RhdGE7CiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwoKICBKc0JlaGF2aW9yQnVpbGRlcih0aGlzLmVsZW1lbnRFbnZpcm9ubWVudCwgdGhpcy5jb21tb25FbGVtZW50cywKICAgICAgdGhpcy5uYXRpdmVCYXNpY0RhdGEsIHRoaXMucmVwb3J0ZXIsIHRoaXMuX29wdGlvbnMpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCB0cnVzdEpTSW50ZXJvcFR5cGVBbm5vdGF0aW9ucyA9PgogICAgICBfb3B0aW9ucy50cnVzdEpTSW50ZXJvcFR5cGVBbm5vdGF0aW9uczsKfQoKLy8vIENvbnN0YW50IGVudmlyb25tZW50IG1hcHBpbmcgW0NvbnN0YW50RXhwcmVzc2lvbl1zIHRvIFtDb25zdGFudFZhbHVlXXMgdXNpbmcKLy8vIFtfRXZhbHVhdGlvbkVudmlyb25tZW50XSBmb3IgdGhlIGV2YWx1YXRpb24uCmNsYXNzIEpzQ29uc3RhbnRFbnZpcm9ubWVudCBpbXBsZW1lbnRzIENvbnN0YW50RW52aXJvbm1lbnQgewogIGZpbmFsIEpzS2VybmVsVG9FbGVtZW50TWFwIF9lbGVtZW50TWFwOwogIGZpbmFsIEVudmlyb25tZW50IF9lbnZpcm9ubWVudDsKCiAgTWFwPENvbnN0YW50RXhwcmVzc2lvbiwgQ29uc3RhbnRWYWx1ZT4gX3ZhbHVlTWFwID0KICAgICAgPENvbnN0YW50RXhwcmVzc2lvbiwgQ29uc3RhbnRWYWx1ZT57fTsKCiAgSnNDb25zdGFudEVudmlyb25tZW50KHRoaXMuX2VsZW1lbnRNYXAsIHRoaXMuX2Vudmlyb25tZW50KTsKCiAgQ29uc3RhbnRWYWx1ZSBfZ2V0Q29uc3RhbnRWYWx1ZSgKICAgICAgU3Bhbm5hYmxlIHNwYW5uYWJsZSwgQ29uc3RhbnRFeHByZXNzaW9uIGV4cHJlc3Npb24sCiAgICAgIHtib29sIGNvbnN0YW50UmVxdWlyZWR9KSB7CiAgICByZXR1cm4gX3ZhbHVlTWFwLnB1dElmQWJzZW50KGV4cHJlc3Npb24sICgpIHsKICAgICAgcmV0dXJuIGV4cHJlc3Npb24uZXZhbHVhdGUobmV3IEpzRXZhbHVhdGlvbkVudmlyb25tZW50KAogICAgICAgICAgX2VsZW1lbnRNYXAsIF9lbnZpcm9ubWVudCwgc3Bhbm5hYmxlLAogICAgICAgICAgY29uc3RhbnRSZXF1aXJlZDogY29uc3RhbnRSZXF1aXJlZCkpOwogICAgfSk7CiAgfQp9CgovLy8gRXZhbHVhdGlvbiBlbnZpcm9ubWVudCB1c2VkIGZvciBjb21wdXRpbmcgW0NvbnN0YW50VmFsdWVdcyBmb3IKLy8vIGtlcm5lbCBiYXNlZCBbQ29uc3RhbnRFeHByZXNzaW9uXXMuCmNsYXNzIEpzRXZhbHVhdGlvbkVudmlyb25tZW50IGV4dGVuZHMgRXZhbHVhdGlvbkVudmlyb25tZW50QmFzZSB7CiAgZmluYWwgSnNLZXJuZWxUb0VsZW1lbnRNYXAgX2VsZW1lbnRNYXA7CiAgZmluYWwgRW52aXJvbm1lbnQgX2Vudmlyb25tZW50OwoKICBKc0V2YWx1YXRpb25FbnZpcm9ubWVudCgKICAgICAgdGhpcy5fZWxlbWVudE1hcCwgdGhpcy5fZW52aXJvbm1lbnQsIFNwYW5uYWJsZSBzcGFubmFibGUsCiAgICAgIHtib29sIGNvbnN0YW50UmVxdWlyZWR9KQogICAgICA6IHN1cGVyKHNwYW5uYWJsZSwgY29uc3RhbnRSZXF1aXJlZDogY29uc3RhbnRSZXF1aXJlZCk7CgogIEBvdmVycmlkZQogIENvbW1vbkVsZW1lbnRzIGdldCBjb21tb25FbGVtZW50cyA9PiBfZWxlbWVudE1hcC5jb21tb25FbGVtZW50czsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGVzIGdldCB0eXBlcyA9PiBfZWxlbWVudE1hcC50eXBlczsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgc3Vic3RCeUNvbnRleHQoRGFydFR5cGUgYmFzZSwgSW50ZXJmYWNlVHlwZSB0YXJnZXQpIHsKICAgIHJldHVybiBfZWxlbWVudE1hcC5zdWJzdEJ5Q29udGV4dChiYXNlLCB0YXJnZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRDb25zdHJ1Y3RvciBnZXRDb25zdHJ1Y3RvckNvbnN0YW50KENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yKSB7CiAgICByZXR1cm4gX2VsZW1lbnRNYXAuX2dldENvbnN0cnVjdG9yQ29uc3RhbnQoY29uc3RydWN0b3IpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIGdldEZpZWxkQ29uc3RhbnQoRmllbGRFbnRpdHkgZmllbGQpIHsKICAgIHJldHVybiBfZWxlbWVudE1hcC5fZ2V0RmllbGRDb25zdGFudEV4cHJlc3Npb24oZmllbGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIGdldExvY2FsQ29uc3RhbnQoTG9jYWwgbG9jYWwpIHsKICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoIl9FdmFsdWF0aW9uRW52aXJvbm1lbnQuZ2V0TG9jYWxDb25zdGFudCIpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHJlYWRGcm9tRW52aXJvbm1lbnQoU3RyaW5nIG5hbWUpIHsKICAgIHJldHVybiBfZW52aXJvbm1lbnQudmFsdWVPZihuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIERpYWdub3N0aWNSZXBvcnRlciBnZXQgcmVwb3J0ZXIgPT4gX2VsZW1lbnRNYXAucmVwb3J0ZXI7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGVuYWJsZUFzc2VydGlvbnMgPT4gX2VsZW1lbnRNYXAub3B0aW9ucy5lbmFibGVVc2VyQXNzZXJ0aW9uczsKfQoKLy8vIFtFbnRpdHlMb29rdXBdIGltcGxlbWVudGF0aW9uIHVzZWQgdG8gZGVzZXJpYWxpemUgW0pzS2VybmVsVG9FbGVtZW50TWFwXS4KLy8vCi8vLyBTaW5jZSBkYXRhIG9iamVjdHMgYW5kIGVudmlyb25tZW50cyBhcmUgcmVnaXN0ZXJlZCB0b2dldGhlciB3aXRoIHRoZWlyCi8vLyBlbnRpdHkgd2UgbmVlZCB0byBoYXZlIGEgc2VwYXJhdGUgbG9va3VwLWJ5LWluZGV4IG1lY2hhbmlzbSB0byBhbGxvdyBmb3IKLy8vIGluZGV4LWJhc2VkIHJlZmVyZW5jZSB3aXRoaW4gZGF0YSBvYmplY3RzIGFuZCBlbnZpcm9ubWVudHMuCmNsYXNzIF9FbnRpdHlMb29rdXAgaW1wbGVtZW50cyBFbnRpdHlMb29rdXAgewogIGZpbmFsIE1hcDxpbnQsIEpMaWJyYXJ5PiBfbGlicmFyaWVzID0ge307CiAgZmluYWwgTWFwPGludCwgSkNsYXNzPiBfY2xhc3NlcyA9IHt9OwogIGZpbmFsIE1hcDxpbnQsIEpUeXBlZGVmPiBfdHlwZWRlZnMgPSB7fTsKICBmaW5hbCBNYXA8aW50LCBKTWVtYmVyPiBfbWVtYmVycyA9IHt9OwogIGZpbmFsIE1hcDxpbnQsIEpUeXBlVmFyaWFibGU+IF90eXBlVmFyaWFibGVzID0ge307CgogIHZvaWQgcmVnaXN0ZXJMaWJyYXJ5KGludCBpbmRleCwgSkxpYnJhcnkgbGlicmFyeSkgewogICAgYXNzZXJ0KCFfbGlicmFyaWVzLmNvbnRhaW5zS2V5KGluZGV4KSwKICAgICAgICAiTGlicmFyeSBmb3IgaW5kZXggJGluZGV4IGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZC4iKTsKICAgIF9saWJyYXJpZXNbaW5kZXhdID0gbGlicmFyeTsKICB9CgogIHZvaWQgcmVnaXN0ZXJDbGFzcyhpbnQgaW5kZXgsIEpDbGFzcyBjbHMpIHsKICAgIGFzc2VydCghX2NsYXNzZXMuY29udGFpbnNLZXkoaW5kZXgpLAogICAgICAgICJDbGFzcyBmb3IgaW5kZXggJGluZGV4IGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZC4iKTsKICAgIF9jbGFzc2VzW2luZGV4XSA9IGNsczsKICB9CgogIHZvaWQgcmVnaXN0ZXJUeXBlZGVmKGludCBpbmRleCwgSlR5cGVkZWYgdHlwZWRlZikgewogICAgYXNzZXJ0KCFfdHlwZWRlZnMuY29udGFpbnNLZXkoaW5kZXgpLAogICAgICAgICJUeXBlZGVmIGZvciBpbmRleCAkaW5kZXggaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLiIpOwogICAgX3R5cGVkZWZzW2luZGV4XSA9IHR5cGVkZWY7CiAgfQoKICB2b2lkIHJlZ2lzdGVyTWVtYmVyKGludCBpbmRleCwgSk1lbWJlciBtZW1iZXIpIHsKICAgIGFzc2VydCghX21lbWJlcnMuY29udGFpbnNLZXkoaW5kZXgpLAogICAgICAgICJNZW1iZXIgZm9yIGluZGV4ICRpbmRleCBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIik7CiAgICBfbWVtYmVyc1tpbmRleF0gPSBtZW1iZXI7CiAgfQoKICB2b2lkIHJlZ2lzdGVyVHlwZVZhcmlhYmxlKGludCBpbmRleCwgSlR5cGVWYXJpYWJsZSB0eXBlVmFyaWFibGUpIHsKICAgIGFzc2VydCghX3R5cGVWYXJpYWJsZXMuY29udGFpbnNLZXkoaW5kZXgpLAogICAgICAgICJUeXBlIHZhcmlhYmxlIGZvciBpbmRleCAkaW5kZXggaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLiIpOwogICAgX3R5cGVWYXJpYWJsZXNbaW5kZXhdID0gdHlwZVZhcmlhYmxlOwogIH0KCiAgdm9pZCBmb3JFYWNoTGlicmFyeSh2b2lkIGYoaW50IGluZGV4LCBKTGlicmFyeSBsaWJyYXJ5KSkgewogICAgX2xpYnJhcmllcy5mb3JFYWNoKGYpOwogIH0KCiAgdm9pZCBmb3JFYWNoQ2xhc3Modm9pZCBmKGludCBpbmRleCwgSkNsYXNzIGNscykpIHsKICAgIF9jbGFzc2VzLmZvckVhY2goZik7CiAgfQoKICB2b2lkIGZvckVhY2hUeXBlZGVmKHZvaWQgZihpbnQgaW5kZXgsIEpUeXBlZGVmIHR5cGVkZWYpKSB7CiAgICBfdHlwZWRlZnMuZm9yRWFjaChmKTsKICB9CgogIHZvaWQgZm9yRWFjaE1lbWJlcih2b2lkIGYoaW50IGluZGV4LCBKTWVtYmVyIG1lbWJlcikpIHsKICAgIF9tZW1iZXJzLmZvckVhY2goZik7CiAgfQoKICB2b2lkIGZvckVhY2hUeXBlVmFyaWFibGUodm9pZCBmKGludCBpbmRleCwgSlR5cGVWYXJpYWJsZSB0eXBlVmFyaWFibGUpKSB7CiAgICBfdHlwZVZhcmlhYmxlcy5mb3JFYWNoKGYpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5kZXhlZExpYnJhcnkgZ2V0TGlicmFyeUJ5SW5kZXgoaW50IGluZGV4KSB7CiAgICBJbmRleGVkTGlicmFyeSBsaWJyYXJ5ID0gX2xpYnJhcmllc1tpbmRleF07CiAgICBhc3NlcnQobGlicmFyeSAhPSBudWxsLCAiTm8gbGlicmFyeSBmb3VuZCBmb3IgaW5kZXggJGluZGV4Iik7CiAgICByZXR1cm4gbGlicmFyeTsKICB9CgogIEBvdmVycmlkZQogIEluZGV4ZWRDbGFzcyBnZXRDbGFzc0J5SW5kZXgoaW50IGluZGV4KSB7CiAgICBJbmRleGVkQ2xhc3MgY2xzID0gX2NsYXNzZXNbaW5kZXhdOwogICAgYXNzZXJ0KGNscyAhPSBudWxsLCAiTm8gY2xhc3MgZm91bmQgZm9yIGluZGV4ICRpbmRleCIpOwogICAgcmV0dXJuIGNsczsKICB9CgogIEBvdmVycmlkZQogIEluZGV4ZWRUeXBlZGVmIGdldFR5cGVkZWZCeUluZGV4KGludCBpbmRleCkgewogICAgSW5kZXhlZFR5cGVkZWYgdHlwZWRlZiA9IF90eXBlZGVmc1tpbmRleF07CiAgICBhc3NlcnQodHlwZWRlZiAhPSBudWxsLCAiTm8gdHlwZWRlZiBmb3VuZCBmb3IgaW5kZXggJGluZGV4Iik7CiAgICByZXR1cm4gdHlwZWRlZjsKICB9CgogIEBvdmVycmlkZQogIEluZGV4ZWRNZW1iZXIgZ2V0TWVtYmVyQnlJbmRleChpbnQgaW5kZXgpIHsKICAgIEluZGV4ZWRNZW1iZXIgbWVtYmVyID0gX21lbWJlcnNbaW5kZXhdOwogICAgYXNzZXJ0KG1lbWJlciAhPSBudWxsLCAiTm8gbWVtYmVyIGZvdW5kIGZvciBpbmRleCAkaW5kZXgiKTsKICAgIHJldHVybiBtZW1iZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBJbmRleGVkVHlwZVZhcmlhYmxlIGdldFR5cGVWYXJpYWJsZUJ5SW5kZXgoaW50IGluZGV4KSB7CiAgICBJbmRleGVkVHlwZVZhcmlhYmxlIHR5cGVWYXJpYWJsZSA9IF90eXBlVmFyaWFibGVzW2luZGV4XTsKICAgIGFzc2VydCh0eXBlVmFyaWFibGUgIT0gbnVsbCwgIk5vIHR5cGUgdmFyaWFibGUgZm91bmQgZm9yIGluZGV4ICRpbmRleCIpOwogICAgcmV0dXJuIHR5cGVWYXJpYWJsZTsKICB9Cn0KimwATk48AVEBOCg0LzE1ATMZHyIpKScoIyQxIyEhHigdGyEbHiYqGh4pIykvKh0jIhoiLiMqKCQBFxgbExYBUDxQSTFGHwIBG0JOHTgBPEAwLC8tOjczNzVCPQEhDCUmLCQuGiclATEaAVBJSEM8N05DPzkBOTM5AT0cBktLTlFIQDszNwFORAFKIwE+AUUBGBUfKjYjLTpDSTIoASwfNRpRRUU+SSNJM0IqBjMdMRhJPD80T0JETjpPBh80GlBENk9KMRYcGR8eLU0yQgYe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b3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL2RhcnQyanMuZGFydCcgc2hvdyBMaW5rOwoKaW1wb3J0ICcuLi9jbG9zdXJlLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24vbmFtZXMuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgSkNvbW1vbkVsZW1lbnRzLCBKRWxlbWVudEVudmlyb25tZW50OwppbXBvcnQgJy4uL2RlZmVycmVkX2xvYWQuZGFydCc7CmltcG9ydCAnLi4vZGlhZ25vc3RpY3MvZGlhZ25vc3RpY19saXN0ZW5lci5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdHlfdXRpbHMuZGFydCcgYXMgdXRpbHM7CmltcG9ydCAnLi4vZWxlbWVudHMvbmFtZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vZW52aXJvbm1lbnQuZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJy4uL2pzX2VtaXR0ZXIvc29ydGVyLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvYW5ub3RhdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9maWVsZF9hbmFseXNpcy5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2JhY2tlbmRfdXNhZ2UuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9pbnRlcmNlcHRvcl9kYXRhLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9ub19zdWNoX21ldGhvZF9yZWdpc3RyeS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vanNfbW9kZWwvbG9jYWxzLmRhcnQnOwppbXBvcnQgJy4uL29yZGVyZWRfdHlwZXNldC5kYXJ0JzsKaW1wb3J0ICcuLi9vcHRpb25zLmRhcnQnOwppbXBvcnQgJy4uL3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jbGFzc19oaWVyYXJjaHkuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY2xhc3Nfc2V0LmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2Z1bmN0aW9uX3NldC5kYXJ0JyBzaG93IEZ1bmN0aW9uU2V0OwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnOwppbXBvcnQgJy4uL3dvcmxkLmRhcnQnOwppbXBvcnQgJ2VsZW1lbnRfbWFwLmRhcnQnOwppbXBvcnQgJ2VsZW1lbnRfbWFwX2ltcGwuZGFydCc7CmltcG9ydCAnbG9jYWxzLmRhcnQnOwoKY2xhc3MgSnNDbG9zZWRXb3JsZCBpbXBsZW1lbnRzIEpDbG9zZWRXb3JsZCB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnY2xvc2VkLXdvcmxkJzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgTmF0aXZlRGF0YSBuYXRpdmVEYXRhOwogIEBvdmVycmlkZQogIGZpbmFsIEludGVyY2VwdG9yRGF0YSBpbnRlcmNlcHRvckRhdGE7CiAgQG92ZXJyaWRlCiAgZmluYWwgQmFja2VuZFVzYWdlIGJhY2tlbmRVc2FnZTsKICBAb3ZlcnJpZGUKICBmaW5hbCBOb1N1Y2hNZXRob2REYXRhIG5vU3VjaE1ldGhvZERhdGE7CgogIEZ1bmN0aW9uU2V0IF9hbGxGdW5jdGlvbnM7CgogIGZpbmFsIE1hcDxDbGFzc0VudGl0eSwgU2V0PENsYXNzRW50aXR5Pj4gbWl4aW5Vc2VzOwogIE1hcDxDbGFzc0VudGl0eSwgTGlzdDxDbGFzc0VudGl0eT4+IF9saXZlTWl4aW5Vc2VzOwoKICBmaW5hbCBNYXA8Q2xhc3NFbnRpdHksIFNldDxDbGFzc0VudGl0eT4+IHR5cGVzSW1wbGVtZW50ZWRCeVN1YmNsYXNzZXM7CgogIGZpbmFsIE1hcDxDbGFzc0VudGl0eSwgTWFwPENsYXNzRW50aXR5LCBib29sPj4gX3N1YnR5cGVDb3ZlcmVkQnlDYWNoZSA9CiAgICAgIDxDbGFzc0VudGl0eSwgTWFwPENsYXNzRW50aXR5LCBib29sPj57fTsKCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ2FuIHRoaXMgYmUgZGVyaXZlZCBmcm9tIFtDbGFzc1NldF1zPwogIGZpbmFsIFNldDxDbGFzc0VudGl0eT4gaW1wbGVtZW50ZWRDbGFzc2VzOwoKICBmaW5hbCBTZXQ8TWVtYmVyRW50aXR5PiBsaXZlSW5zdGFuY2VNZW1iZXJzOwoKICAvLy8gTWVtYmVycyB0aGF0IGFyZSB3cml0dGVuIGVpdGhlciBkaXJlY3RseSBvciB0aHJvdWdoIGEgc2V0dGVyIHNlbGVjdG9yLgogIGZpbmFsIFNldDxNZW1iZXJFbnRpdHk+IGFzc2lnbmVkSW5zdGFuY2VNZW1iZXJzOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTZXQ8Q2xhc3NFbnRpdHk+IGxpdmVOYXRpdmVDbGFzc2VzOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTZXQ8TWVtYmVyRW50aXR5PiBwcm9jZXNzZWRNZW1iZXJzOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBDbGFzc0hpZXJhcmNoeSBjbGFzc0hpZXJhcmNoeTsKCiAgZmluYWwgSnNLZXJuZWxUb0VsZW1lbnRNYXAgZWxlbWVudE1hcDsKICBAb3ZlcnJpZGUKICBmaW5hbCBSdW50aW1lVHlwZXNOZWVkIHJ0aU5lZWQ7CiAgQWJzdHJhY3RWYWx1ZURvbWFpbiBfYWJzdHJhY3RWYWx1ZURvbWFpbjsKICBAb3ZlcnJpZGUKICBmaW5hbCBKRmllbGRBbmFseXNpcyBmaWVsZEFuYWx5c2lzOwogIEBvdmVycmlkZQogIGZpbmFsIEFubm90YXRpb25zRGF0YSBhbm5vdGF0aW9uc0RhdGE7CiAgQG92ZXJyaWRlCiAgZmluYWwgR2xvYmFsTG9jYWxzTWFwIGdsb2JhbExvY2Fsc01hcDsKICBAb3ZlcnJpZGUKICBmaW5hbCBDbG9zdXJlRGF0YSBjbG9zdXJlRGF0YUxvb2t1cDsKICBAb3ZlcnJpZGUKICBmaW5hbCBPdXRwdXRVbml0RGF0YSBvdXRwdXRVbml0RGF0YTsKICBTb3J0ZXIgX3NvcnRlcjsKCiAgSnNDbG9zZWRXb3JsZCgKICAgICAgdGhpcy5lbGVtZW50TWFwLAogICAgICB0aGlzLm5hdGl2ZURhdGEsCiAgICAgIHRoaXMuaW50ZXJjZXB0b3JEYXRhLAogICAgICB0aGlzLmJhY2tlbmRVc2FnZSwKICAgICAgdGhpcy5ydGlOZWVkLAogICAgICB0aGlzLmZpZWxkQW5hbHlzaXMsCiAgICAgIHRoaXMubm9TdWNoTWV0aG9kRGF0YSwKICAgICAgdGhpcy5pbXBsZW1lbnRlZENsYXNzZXMsCiAgICAgIHRoaXMubGl2ZU5hdGl2ZUNsYXNzZXMsCiAgICAgIHRoaXMubGl2ZUluc3RhbmNlTWVtYmVycywKICAgICAgdGhpcy5hc3NpZ25lZEluc3RhbmNlTWVtYmVycywKICAgICAgdGhpcy5wcm9jZXNzZWRNZW1iZXJzLAogICAgICB0aGlzLm1peGluVXNlcywKICAgICAgdGhpcy50eXBlc0ltcGxlbWVudGVkQnlTdWJjbGFzc2VzLAogICAgICB0aGlzLmNsYXNzSGllcmFyY2h5LAogICAgICBBYnN0cmFjdFZhbHVlU3RyYXRlZ3kgYWJzdHJhY3RWYWx1ZVN0cmF0ZWd5LAogICAgICB0aGlzLmFubm90YXRpb25zRGF0YSwKICAgICAgdGhpcy5nbG9iYWxMb2NhbHNNYXAsCiAgICAgIHRoaXMuY2xvc3VyZURhdGFMb29rdXAsCiAgICAgIHRoaXMub3V0cHV0VW5pdERhdGEpIHsKICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluID0gYWJzdHJhY3RWYWx1ZVN0cmF0ZWd5LmNyZWF0ZURvbWFpbih0aGlzKTsKICB9CgogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbSnNDbG9zZWRXb3JsZF0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBKc0Nsb3NlZFdvcmxkLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCiAgICAgIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwKICAgICAgRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsCiAgICAgIEFic3RyYWN0VmFsdWVTdHJhdGVneSBhYnN0cmFjdFZhbHVlU3RyYXRlZ3ksCiAgICAgIGlyLkNvbXBvbmVudCBjb21wb25lbnQsCiAgICAgIERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKCiAgICBKc0tlcm5lbFRvRWxlbWVudE1hcCBlbGVtZW50TWFwID0KICAgICAgICBuZXcgSnNLZXJuZWxUb0VsZW1lbnRNYXAucmVhZEZyb21EYXRhU291cmNlKAogICAgICAgICAgICBvcHRpb25zLCByZXBvcnRlciwgZW52aXJvbm1lbnQsIGNvbXBvbmVudCwgc291cmNlKTsKICAgIEdsb2JhbExvY2Fsc01hcCBnbG9iYWxMb2NhbHNNYXAgPQogICAgICAgIG5ldyBHbG9iYWxMb2NhbHNNYXAucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBzb3VyY2UucmVnaXN0ZXJMb2NhbExvb2t1cChuZXcgTG9jYWxMb29rdXBJbXBsKGdsb2JhbExvY2Fsc01hcCkpOwogICAgQ2xhc3NIaWVyYXJjaHkgY2xhc3NIaWVyYXJjaHkgPSBuZXcgQ2xhc3NIaWVyYXJjaHkucmVhZEZyb21EYXRhU291cmNlKAogICAgICAgIHNvdXJjZSwgZWxlbWVudE1hcC5jb21tb25FbGVtZW50cyk7CiAgICBOYXRpdmVEYXRhIG5hdGl2ZURhdGEgPSBuZXcgTmF0aXZlRGF0YS5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgICAgc291cmNlLCBlbGVtZW50TWFwLmVsZW1lbnRFbnZpcm9ubWVudCk7CiAgICBlbGVtZW50TWFwLm5hdGl2ZUJhc2ljRGF0YSA9IG5hdGl2ZURhdGE7CiAgICBJbnRlcmNlcHRvckRhdGEgaW50ZXJjZXB0b3JEYXRhID0gbmV3IEludGVyY2VwdG9yRGF0YS5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgICAgc291cmNlLCBuYXRpdmVEYXRhLCBlbGVtZW50TWFwLmNvbW1vbkVsZW1lbnRzKTsKICAgIEJhY2tlbmRVc2FnZSBiYWNrZW5kVXNhZ2UgPSBuZXcgQmFja2VuZFVzYWdlLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgUnVudGltZVR5cGVzTmVlZCBydGlOZWVkID0gbmV3IFJ1bnRpbWVUeXBlc05lZWQucmVhZEZyb21EYXRhU291cmNlKAogICAgICAgIHNvdXJjZSwgZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQpOwogICAgSkZpZWxkQW5hbHlzaXMgYWxsb2NhdG9yQW5hbHlzaXMgPQogICAgICAgIG5ldyBKRmllbGRBbmFseXNpcy5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlLCBvcHRpb25zKTsKICAgIE5vU3VjaE1ldGhvZERhdGEgbm9TdWNoTWV0aG9kRGF0YSA9CiAgICAgICAgbmV3IE5vU3VjaE1ldGhvZERhdGEucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CgogICAgU2V0PENsYXNzRW50aXR5PiBpbXBsZW1lbnRlZENsYXNzZXMgPSBzb3VyY2UucmVhZENsYXNzZXMoKS50b1NldCgpOwogICAgU2V0PENsYXNzRW50aXR5PiBsaXZlTmF0aXZlQ2xhc3NlcyA9IHNvdXJjZS5yZWFkQ2xhc3NlcygpLnRvU2V0KCk7CiAgICBTZXQ8TWVtYmVyRW50aXR5PiBsaXZlSW5zdGFuY2VNZW1iZXJzID0gc291cmNlLnJlYWRNZW1iZXJzKCkudG9TZXQoKTsKICAgIFNldDxNZW1iZXJFbnRpdHk+IGFzc2lnbmVkSW5zdGFuY2VNZW1iZXJzID0gc291cmNlLnJlYWRNZW1iZXJzKCkudG9TZXQoKTsKICAgIFNldDxNZW1iZXJFbnRpdHk+IHByb2Nlc3NlZE1lbWJlcnMgPSBzb3VyY2UucmVhZE1lbWJlcnMoKS50b1NldCgpOwogICAgTWFwPENsYXNzRW50aXR5LCBTZXQ8Q2xhc3NFbnRpdHk+PiBtaXhpblVzZXMgPQogICAgICAgIHNvdXJjZS5yZWFkQ2xhc3NNYXAoKCkgPT4gc291cmNlLnJlYWRDbGFzc2VzKCkudG9TZXQoKSk7CiAgICBNYXA8Q2xhc3NFbnRpdHksIFNldDxDbGFzc0VudGl0eT4+IHR5cGVzSW1wbGVtZW50ZWRCeVN1YmNsYXNzZXMgPQogICAgICAgIHNvdXJjZS5yZWFkQ2xhc3NNYXAoKCkgPT4gc291cmNlLnJlYWRDbGFzc2VzKCkudG9TZXQoKSk7CgogICAgQW5ub3RhdGlvbnNEYXRhIGFubm90YXRpb25zRGF0YSA9CiAgICAgICAgbmV3IEFubm90YXRpb25zRGF0YS5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKCiAgICBDbG9zdXJlRGF0YSBjbG9zdXJlRGF0YSA9CiAgICAgICAgbmV3IENsb3N1cmVEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShlbGVtZW50TWFwLCBzb3VyY2UpOwoKICAgIE91dHB1dFVuaXREYXRhIG91dHB1dFVuaXREYXRhID0KICAgICAgICBuZXcgT3V0cHV0VW5pdERhdGEucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CgogICAgc291cmNlLmVuZCh0YWcpOwoKICAgIHJldHVybiBuZXcgSnNDbG9zZWRXb3JsZCgKICAgICAgICBlbGVtZW50TWFwLAogICAgICAgIG5hdGl2ZURhdGEsCiAgICAgICAgaW50ZXJjZXB0b3JEYXRhLAogICAgICAgIGJhY2tlbmRVc2FnZSwKICAgICAgICBydGlOZWVkLAogICAgICAgIGFsbG9jYXRvckFuYWx5c2lzLAogICAgICAgIG5vU3VjaE1ldGhvZERhdGEsCiAgICAgICAgaW1wbGVtZW50ZWRDbGFzc2VzLAogICAgICAgIGxpdmVOYXRpdmVDbGFzc2VzLAogICAgICAgIGxpdmVJbnN0YW5jZU1lbWJlcnMsCiAgICAgICAgYXNzaWduZWRJbnN0YW5jZU1lbWJlcnMsCiAgICAgICAgcHJvY2Vzc2VkTWVtYmVycywKICAgICAgICBtaXhpblVzZXMsCiAgICAgICAgdHlwZXNJbXBsZW1lbnRlZEJ5U3ViY2xhc3NlcywKICAgICAgICBjbGFzc0hpZXJhcmNoeSwKICAgICAgICBhYnN0cmFjdFZhbHVlU3RyYXRlZ3ksCiAgICAgICAgYW5ub3RhdGlvbnNEYXRhLAogICAgICAgIGdsb2JhbExvY2Fsc01hcCwKICAgICAgICBjbG9zdXJlRGF0YSwKICAgICAgICBvdXRwdXRVbml0RGF0YSk7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtKc0Nsb3NlZFdvcmxkXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgZWxlbWVudE1hcC53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBnbG9iYWxMb2NhbHNNYXAud3JpdGVUb0RhdGFTaW5rKHNpbmspOwoKICAgIGNsYXNzSGllcmFyY2h5LndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIG5hdGl2ZURhdGEud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgaW50ZXJjZXB0b3JEYXRhLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIGJhY2tlbmRVc2FnZS53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBydGlOZWVkLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIGZpZWxkQW5hbHlzaXMud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgbm9TdWNoTWV0aG9kRGF0YS53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLndyaXRlQ2xhc3NlcyhpbXBsZW1lbnRlZENsYXNzZXMpOwogICAgc2luay53cml0ZUNsYXNzZXMobGl2ZU5hdGl2ZUNsYXNzZXMpOwogICAgc2luay53cml0ZU1lbWJlcnMobGl2ZUluc3RhbmNlTWVtYmVycyk7CiAgICBzaW5rLndyaXRlTWVtYmVycyhhc3NpZ25lZEluc3RhbmNlTWVtYmVycyk7CiAgICBzaW5rLndyaXRlTWVtYmVycyhwcm9jZXNzZWRNZW1iZXJzKTsKICAgIHNpbmsud3JpdGVDbGFzc01hcCgKICAgICAgICBtaXhpblVzZXMsIChTZXQ8Q2xhc3NFbnRpdHk+IHNldCkgPT4gc2luay53cml0ZUNsYXNzZXMoc2V0KSk7CiAgICBzaW5rLndyaXRlQ2xhc3NNYXAodHlwZXNJbXBsZW1lbnRlZEJ5U3ViY2xhc3NlcywKICAgICAgICAoU2V0PENsYXNzRW50aXR5PiBzZXQpID0+IHNpbmsud3JpdGVDbGFzc2VzKHNldCkpOwogICAgYW5ub3RhdGlvbnNEYXRhLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIGNsb3N1cmVEYXRhTG9va3VwLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIG91dHB1dFVuaXREYXRhLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBKRWxlbWVudEVudmlyb25tZW50IGdldCBlbGVtZW50RW52aXJvbm1lbnQgPT4gZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQ7CgogIEBvdmVycmlkZQogIEpDb21tb25FbGVtZW50cyBnZXQgY29tbW9uRWxlbWVudHMgPT4gZWxlbWVudE1hcC5jb21tb25FbGVtZW50czsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGVzIGdldCBkYXJ0VHlwZXMgPT4gZWxlbWVudE1hcC50eXBlczsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0ltcGxlbWVudGVkKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGltcGxlbWVudGVkQ2xhc3Nlcy5jb250YWlucyhjbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0THViT2ZJbnN0YW50aWF0ZWRTdWJjbGFzc2VzKENsYXNzRW50aXR5IGNscykgewogICAgaWYgKG5hdGl2ZURhdGEuaXNKc0ludGVyb3BDbGFzcyhjbHMpKSB7CiAgICAgIHJldHVybiBjb21tb25FbGVtZW50cy5qc0phdmFTY3JpcHRPYmplY3RDbGFzczsKICAgIH0KICAgIENsYXNzSGllcmFyY2h5Tm9kZSBoaWVyYXJjaHkgPSBjbGFzc0hpZXJhcmNoeS5nZXRDbGFzc0hpZXJhcmNoeU5vZGUoY2xzKTsKICAgIHJldHVybiBoaWVyYXJjaHkgIT0gbnVsbAogICAgICAgID8gaGllcmFyY2h5LmdldEx1Yk9mSW5zdGFudGlhdGVkU3ViY2xhc3NlcygpCiAgICAgICAgOiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0THViT2ZJbnN0YW50aWF0ZWRTdWJ0eXBlcyhDbGFzc0VudGl0eSBjbHMpIHsKICAgIGlmIChuYXRpdmVEYXRhLmlzSnNJbnRlcm9wQ2xhc3MoY2xzKSkgewogICAgICByZXR1cm4gY29tbW9uRWxlbWVudHMuanNKYXZhU2NyaXB0T2JqZWN0Q2xhc3M7CiAgICB9CiAgICBDbGFzc1NldCBjbGFzc1NldCA9IGNsYXNzSGllcmFyY2h5LmdldENsYXNzU2V0KGNscyk7CiAgICByZXR1cm4gY2xhc3NTZXQgIT0gbnVsbCA/IGNsYXNzU2V0LmdldEx1Yk9mSW5zdGFudGlhdGVkU3VidHlwZXMoKSA6IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzVXNlZEFzTWl4aW4oQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gIW1peGluVXNlc09mKGNscykuaXNFbXB0eTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaGFzQW55U3ViY2xhc3NPZk1peGluVXNlVGhhdEltcGxlbWVudHMoCiAgICAgIENsYXNzRW50aXR5IGNscywgQ2xhc3NFbnRpdHkgdHlwZSkgewogICAgcmV0dXJuIG1peGluVXNlc09mKGNscykKICAgICAgICAuYW55KCh1c2UpID0+IGhhc0FueVN1YmNsYXNzVGhhdEltcGxlbWVudHModXNlLCB0eXBlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGV2ZXJ5U3VidHlwZUlzU3ViY2xhc3NPZk9yTWl4aW5Vc2VPZihDbGFzc0VudGl0eSB4LCBDbGFzc0VudGl0eSB5KSB7CiAgICBNYXA8Q2xhc3NFbnRpdHksIGJvb2w+IHNlY29uZE1hcCA9CiAgICAgICAgX3N1YnR5cGVDb3ZlcmVkQnlDYWNoZVt4XSA/Pz0gPENsYXNzRW50aXR5LCBib29sPnt9OwogICAgcmV0dXJuIHNlY29uZE1hcFt5XSA/Pz0gY2xhc3NIaWVyYXJjaHkuc3VidHlwZXNPZih4KS5ldmVyeSgKICAgICAgICAoQ2xhc3NFbnRpdHkgY2xzKSA9PgogICAgICAgICAgICBjbGFzc0hpZXJhcmNoeS5pc1N1YmNsYXNzT2YoY2xzLCB5KSB8fAogICAgICAgICAgICBpc1N1YmNsYXNzT2ZNaXhpblVzZU9mKGNscywgeSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNBbnlTdWJjbGFzc1RoYXRJbXBsZW1lbnRzKENsYXNzRW50aXR5IHN1cGVyY2xhc3MsIENsYXNzRW50aXR5IHR5cGUpIHsKICAgIFNldDxDbGFzc0VudGl0eT4gc3ViY2xhc3NlcyA9IHR5cGVzSW1wbGVtZW50ZWRCeVN1YmNsYXNzZXNbc3VwZXJjbGFzc107CiAgICBpZiAoc3ViY2xhc3NlcyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gc3ViY2xhc3Nlcy5jb250YWlucyh0eXBlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgbmVlZHNOb1N1Y2hNZXRob2QoCiAgICAgIENsYXNzRW50aXR5IGJhc2UsIFNlbGVjdG9yIHNlbGVjdG9yLCBDbGFzc1F1ZXJ5IHF1ZXJ5KSB7CiAgICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgc3ViY2xhc3NlcyBpbiB0aGUgW3Jvb3ROb2RlXSB0cmVlIG5lZWRzIG5vU3VjaE1ldGhvZAogICAgLy8vIGhhbmRsaW5nLgogICAgYm9vbCBzdWJjbGFzc2VzTmVlZE5vU3VjaE1ldGhvZChDbGFzc0hpZXJhcmNoeU5vZGUgcm9vdE5vZGUpIHsKICAgICAgaWYgKCFyb290Tm9kZS5pc0luc3RhbnRpYXRlZCkgewogICAgICAgIC8vIE5vIHN1YmNsYXNzIG5lZWRzIG5vU3VjaE1ldGhvZCBoYW5kbGluZyBzaW5jZSB0aGV5IGFyZSBhbGwKICAgICAgICAvLyB1bmluc3RhbnRpYXRlZC4KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgQ2xhc3NFbnRpdHkgcm9vdENsYXNzID0gcm9vdE5vZGUuY2xzOwogICAgICBpZiAoX2hhc0NvbmNyZXRlTWF0Y2gocm9vdENsYXNzLCBzZWxlY3RvcikpIHsKICAgICAgICAvLyBUaGUgcm9vdCBzdWJjbGFzcyBoYXMgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBzbyBubyBzdWJjbGFzcyBuZWVkcwogICAgICAgIC8vIG5vU3VjaE1ldGhvZCBoYW5kbGluZy4KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAocm9vdE5vZGUuaXNFeHBsaWNpdGx5SW5zdGFudGlhdGVkKSB7CiAgICAgICAgLy8gVGhlIHJvb3QgY2xhc3MgbmVlZCBub1N1Y2hNZXRob2QgaGFuZGxpbmcuCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgSXRlcmF0aW9uU3RlcCByZXN1bHQgPSByb290Tm9kZS5mb3JFYWNoU3ViY2xhc3MoKENsYXNzRW50aXR5IHN1YmNsYXNzKSB7CiAgICAgICAgaWYgKF9oYXNDb25jcmV0ZU1hdGNoKHN1YmNsYXNzLCBzZWxlY3RvciwKICAgICAgICAgICAgc3RvcEF0U3VwZXJjbGFzczogcm9vdENsYXNzKSkgewogICAgICAgICAgLy8gRm91bmQgYSBtYXRjaCAtIHNraXAgYWxsIHN1YmNsYXNzZXMuCiAgICAgICAgICByZXR1cm4gSXRlcmF0aW9uU3RlcC5TS0lQX1NVQkNMQVNTRVM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFN0b3AgZmFzdCAtIHdlIGZvdW5kIGEgbmVlZCBmb3Igbm9TdWNoTWV0aG9kIGhhbmRsaW5nLgogICAgICAgICAgcmV0dXJuIEl0ZXJhdGlvblN0ZXAuU1RPUDsKICAgICAgICB9CiAgICAgIH0sIENsYXNzSGllcmFyY2h5Tm9kZS5FWFBMSUNJVExZX0lOU1RBTlRJQVRFRCwgc3RyaWN0OiB0cnVlKTsKICAgICAgLy8gV2Ugc3RvcHBlZCBmYXN0IHNvIHdlIG5lZWQgbm9TdWNoTWV0aG9kIGhhbmRsaW5nLgogICAgICByZXR1cm4gcmVzdWx0ID09IEl0ZXJhdGlvblN0ZXAuU1RPUDsKICAgIH0KCiAgICBDbGFzc1NldCBjbGFzc1NldCA9IGNsYXNzSGllcmFyY2h5LmdldENsYXNzU2V0KGJhc2UpOwogICAgYXNzZXJ0KGNsYXNzU2V0ICE9IG51bGwsIGZhaWxlZEF0KGJhc2UsICJObyBjbGFzcyBzZXQgZm9yICRiYXNlLiIpKTsKICAgIENsYXNzSGllcmFyY2h5Tm9kZSBub2RlID0gY2xhc3NTZXQubm9kZTsKICAgIGlmIChxdWVyeSA9PSBDbGFzc1F1ZXJ5LkVYQUNUKSB7CiAgICAgIHJldHVybiBub2RlLmlzRXhwbGljaXRseUluc3RhbnRpYXRlZCAmJgogICAgICAgICAgIV9oYXNDb25jcmV0ZU1hdGNoKGJhc2UsIHNlbGVjdG9yKTsKICAgIH0gZWxzZSBpZiAocXVlcnkgPT0gQ2xhc3NRdWVyeS5TVUJDTEFTUykgewogICAgICByZXR1cm4gc3ViY2xhc3Nlc05lZWROb1N1Y2hNZXRob2Qobm9kZSk7CiAgICB9IGVsc2UgewogICAgICBpZiAoc3ViY2xhc3Nlc05lZWROb1N1Y2hNZXRob2Qobm9kZSkpIHJldHVybiB0cnVlOwogICAgICBmb3IgKENsYXNzSGllcmFyY2h5Tm9kZSBzdWJ0eXBlTm9kZSBpbiBjbGFzc1NldC5zdWJ0eXBlTm9kZXMpIHsKICAgICAgICBpZiAoc3ViY2xhc3Nlc05lZWROb1N1Y2hNZXRob2Qoc3VidHlwZU5vZGUpKSByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gY29tbW9uU3VwZXJ0eXBlc09mKEl0ZXJhYmxlPENsYXNzRW50aXR5PiBjbGFzc2VzKSB7CiAgICBJdGVyYXRvcjxDbGFzc0VudGl0eT4gaXRlcmF0b3IgPSBjbGFzc2VzLml0ZXJhdG9yOwogICAgaWYgKCFpdGVyYXRvci5tb3ZlTmV4dCgpKSByZXR1cm4gY29uc3QgPENsYXNzRW50aXR5PltdOwoKICAgIENsYXNzRW50aXR5IGNscyA9IGl0ZXJhdG9yLmN1cnJlbnQ7CiAgICBPcmRlcmVkVHlwZVNldCB0eXBlU2V0ID0gZWxlbWVudE1hcC5nZXRPcmRlcmVkVHlwZVNldChjbHMpOwogICAgaWYgKCFpdGVyYXRvci5tb3ZlTmV4dCgpKSByZXR1cm4gdHlwZVNldC50eXBlcy5tYXAoKHR5cGUpID0+IHR5cGUuZWxlbWVudCk7CgogICAgaW50IGRlcHRoID0gdHlwZVNldC5tYXhEZXB0aDsKICAgIExpbms8T3JkZXJlZFR5cGVTZXQ+IG90aGVyVHlwZVNldHMgPSBjb25zdCBMaW5rPE9yZGVyZWRUeXBlU2V0PigpOwogICAgZG8gewogICAgICBDbGFzc0VudGl0eSBvdGhlckNsYXNzID0gaXRlcmF0b3IuY3VycmVudDsKICAgICAgT3JkZXJlZFR5cGVTZXQgb3RoZXJUeXBlU2V0ID0gZWxlbWVudE1hcC5nZXRPcmRlcmVkVHlwZVNldChvdGhlckNsYXNzKTsKICAgICAgb3RoZXJUeXBlU2V0cyA9IG90aGVyVHlwZVNldHMucHJlcGVuZChvdGhlclR5cGVTZXQpOwogICAgICBpZiAob3RoZXJUeXBlU2V0Lm1heERlcHRoIDwgZGVwdGgpIHsKICAgICAgICBkZXB0aCA9IG90aGVyVHlwZVNldC5tYXhEZXB0aDsKICAgICAgfQogICAgfSB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSk7CgogICAgTGlzdDxDbGFzc0VudGl0eT4gY29tbW9uU3VwZXJ0eXBlcyA9IDxDbGFzc0VudGl0eT5bXTsKICAgIE9VVEVSOgogICAgZm9yIChMaW5rPEludGVyZmFjZVR5cGU+IGxpbmsgPSB0eXBlU2V0W2RlcHRoXTsKICAgICAgICBsaW5rLmhlYWQuZWxlbWVudCAhPSBjb21tb25FbGVtZW50cy5vYmplY3RDbGFzczsKICAgICAgICBsaW5rID0gbGluay50YWlsKSB7CiAgICAgIENsYXNzRW50aXR5IGNscyA9IGxpbmsuaGVhZC5lbGVtZW50OwogICAgICBmb3IgKExpbms8T3JkZXJlZFR5cGVTZXQ+IGxpbmsgPSBvdGhlclR5cGVTZXRzOwogICAgICAgICAgIWxpbmsuaXNFbXB0eTsKICAgICAgICAgIGxpbmsgPSBsaW5rLnRhaWwpIHsKICAgICAgICBpZiAobGluay5oZWFkLmFzSW5zdGFuY2VPZihjbHMsIGVsZW1lbnRNYXAuZ2V0SGllcmFyY2h5RGVwdGgoY2xzKSkgPT0KICAgICAgICAgICAgbnVsbCkgewogICAgICAgICAgY29udGludWUgT1VURVI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbW1vblN1cGVydHlwZXMuYWRkKGNscyk7CiAgICB9CiAgICBjb21tb25TdXBlcnR5cGVzLmFkZChjb21tb25FbGVtZW50cy5vYmplY3RDbGFzcyk7CiAgICByZXR1cm4gY29tbW9uU3VwZXJ0eXBlczsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBtaXhpblVzZXNPZihDbGFzc0VudGl0eSBjbHMpIHsKICAgIGlmIChfbGl2ZU1peGluVXNlcyA9PSBudWxsKSB7CiAgICAgIF9saXZlTWl4aW5Vc2VzID0gbmV3IE1hcDxDbGFzc0VudGl0eSwgTGlzdDxDbGFzc0VudGl0eT4+KCk7CiAgICAgIGZvciAoQ2xhc3NFbnRpdHkgbWl4aW4gaW4gbWl4aW5Vc2VzLmtleXMpIHsKICAgICAgICBMaXN0PENsYXNzRW50aXR5PiB1c2VzID0gPENsYXNzRW50aXR5PltdOwoKICAgICAgICB2b2lkIGFkZExpdmVVc2UoQ2xhc3NFbnRpdHkgbWl4aW5BcHBsaWNhdGlvbikgewogICAgICAgICAgaWYgKGNsYXNzSGllcmFyY2h5LmlzSW5zdGFudGlhdGVkKG1peGluQXBwbGljYXRpb24pKSB7CiAgICAgICAgICAgIHVzZXMuYWRkKG1peGluQXBwbGljYXRpb24pOwogICAgICAgICAgfSBlbHNlIGlmIChfaXNOYW1lZE1peGluQXBwbGljYXRpb24obWl4aW5BcHBsaWNhdGlvbikpIHsKICAgICAgICAgICAgU2V0PENsYXNzRW50aXR5PiBuZXh0ID0gbWl4aW5Vc2VzW21peGluQXBwbGljYXRpb25dOwogICAgICAgICAgICBpZiAobmV4dCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgbmV4dC5mb3JFYWNoKGFkZExpdmVVc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBtaXhpblVzZXNbbWl4aW5dLmZvckVhY2goYWRkTGl2ZVVzZSk7CiAgICAgICAgaWYgKHVzZXMuaXNOb3RFbXB0eSkgewogICAgICAgICAgX2xpdmVNaXhpblVzZXNbbWl4aW5dID0gdXNlczsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIEl0ZXJhYmxlPENsYXNzRW50aXR5PiB1c2VzID0gX2xpdmVNaXhpblVzZXNbY2xzXTsKICAgIHJldHVybiB1c2VzICE9IG51bGwgPyB1c2VzIDogY29uc3QgPENsYXNzRW50aXR5PltdOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNBbnlTdWJjbGFzc1RoYXRNaXhlcyhDbGFzc0VudGl0eSBzdXBlcmNsYXNzLCBDbGFzc0VudGl0eSBtaXhpbikgewogICAgcmV0dXJuIG1peGluVXNlc09mKG1peGluKS5hbnkoKENsYXNzRW50aXR5IGVhY2gpIHsKICAgICAgcmV0dXJuIGNsYXNzSGllcmFyY2h5LmlzU3ViY2xhc3NPZihlYWNoLCBzdXBlcmNsYXNzKTsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1N1YmNsYXNzT2ZNaXhpblVzZU9mKENsYXNzRW50aXR5IGNscywgQ2xhc3NFbnRpdHkgbWl4aW4pIHsKICAgIGlmIChpc1VzZWRBc01peGluKG1peGluKSkgewogICAgICBDbGFzc0VudGl0eSBjdXJyZW50ID0gY2xzOwogICAgICB3aGlsZSAoY3VycmVudCAhPSBudWxsKSB7CiAgICAgICAgQ2xhc3NFbnRpdHkgY3VycmVudE1peGluID0gZWxlbWVudE1hcC5nZXRBcHBsaWVkTWl4aW4oY3VycmVudCk7CiAgICAgICAgaWYgKGN1cnJlbnRNaXhpbiA9PSBtaXhpbikgcmV0dXJuIHRydWU7CiAgICAgICAgY3VycmVudCA9IGVsZW1lbnRFbnZpcm9ubWVudC5nZXRTdXBlckNsYXNzKGN1cnJlbnQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICB2b2lkIF9lbnN1cmVGdW5jdGlvblNldCgpIHsKICAgIGlmIChfYWxsRnVuY3Rpb25zID09IG51bGwpIHsKICAgICAgLy8gW0Z1bmN0aW9uU2V0XSBpcyBjcmVhdGVkIGxhemlseSBiZWNhdXNlIGl0IGlzIG5vdCB1c2VkIHdoZW4gd2Ugc3dpdGNoCiAgICAgIC8vIGZyb20gYSBmcm9udGVuZCB0byBhIGJhY2tlbmQgbW9kZWwgYmVmb3JlIGluZmVyZW5jZS4KICAgICAgX2FsbEZ1bmN0aW9ucyA9IG5ldyBGdW5jdGlvblNldChsaXZlSW5zdGFuY2VNZW1iZXJzKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgaW5jbHVkZXNDbG9zdXJlQ2FsbChTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSByZWNlaXZlcikgewogICAgcmV0dXJuIHNlbGVjdG9yLm5hbWUgPT0gSWRlbnRpZmllcnMuY2FsbCAmJgogICAgICAgIChyZWNlaXZlciA9PSBudWxsIHx8CiAgICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFNob3VsZCB0aGlzIGhhdmUgYmVlbiBgaW50ZXJzZWN0c2AgaW5zdGVhZD8KICAgICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgICAgICAgICAgLmNvbnRhaW5zKHJlY2VpdmVyLCBhYnN0cmFjdFZhbHVlRG9tYWluLmZ1bmN0aW9uVHlwZSkKICAgICAgICAgICAgICAgIC5pc1BvdGVudGlhbGx5VHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVSZWNlaXZlclR5cGUoU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXIpIHsKICAgIF9lbnN1cmVGdW5jdGlvblNldCgpOwogICAgaWYgKGluY2x1ZGVzQ2xvc3VyZUNhbGwoc2VsZWN0b3IsIHJlY2VpdmVyKSkgewogICAgICByZXR1cm4gYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZTsKICAgIH0KICAgIHJldHVybiBfYWxsRnVuY3Rpb25zLnJlY2VpdmVyVHlwZShzZWxlY3RvciwgcmVjZWl2ZXIsIGFic3RyYWN0VmFsdWVEb21haW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBsb2NhdGVNZW1iZXJzKAogICAgICBTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSByZWNlaXZlcikgewogICAgX2Vuc3VyZUZ1bmN0aW9uU2V0KCk7CiAgICByZXR1cm4gX2FsbEZ1bmN0aW9ucy5maWx0ZXIoc2VsZWN0b3IsIHJlY2VpdmVyLCBhYnN0cmFjdFZhbHVlRG9tYWluKTsKICB9CgogIGJvb2wgaGFzQW55VXNlckRlZmluZWRHZXR0ZXIoU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXIpIHsKICAgIF9lbnN1cmVGdW5jdGlvblNldCgpOwogICAgcmV0dXJuIF9hbGxGdW5jdGlvbnMKICAgICAgICAuZmlsdGVyKHNlbGVjdG9yLCByZWNlaXZlciwgYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAuYW55KChlYWNoKSA9PiBlYWNoLmlzR2V0dGVyKTsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlckVudGl0eSBsb2NhdGVTaW5nbGVNZW1iZXIoU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXIpIHsKICAgIGlmIChpbmNsdWRlc0Nsb3N1cmVDYWxsKHNlbGVjdG9yLCByZWNlaXZlcikpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZWNlaXZlciA/Pz0gYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZTsKICAgIHJldHVybiBhYnN0cmFjdFZhbHVlRG9tYWluLmxvY2F0ZVNpbmdsZU1lbWJlcihyZWNlaXZlciwgc2VsZWN0b3IpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBmaWVsZE5ldmVyQ2hhbmdlcyhNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgaWYgKCFlbGVtZW50LmlzRmllbGQpIHJldHVybiBmYWxzZTsKICAgIGlmIChuYXRpdmVEYXRhLmlzTmF0aXZlTWVtYmVyKGVsZW1lbnQpKSB7CiAgICAgIC8vIFNvbWUgbmF0aXZlIGZpZWxkcyBhcmUgdmlld3Mgb2YgZGF0YSB0aGF0IG1heSBiZSBjaGFuZ2VkIGJ5IG9wZXJhdGlvbnMuCiAgICAgIC8vIEUuZy4gbm9kZS5maXJzdENoaWxkIGRlcGVuZHMgb24gcGFyZW50Tm9kZS5yZW1vdmVCZWZvcmUobjEsIG4yKS4KICAgICAgLy8gVE9ETyhzcmEpOiBSZWZpbmUgdGhlIGVmZmVjdCBjbGFzc2lmaWNhdGlvbiBzbyB0aGF0IG5hdGl2ZSBlZmZlY3RzIGFyZQogICAgICAvLyBkaXN0aW5jdCBmcm9tIG9yZGluYXJ5IERhcnQgZWZmZWN0cy4KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGlmICghZWxlbWVudC5pc0Fzc2lnbmFibGUpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoZWxlbWVudC5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgIHJldHVybiAhYXNzaWduZWRJbnN0YW5jZU1lbWJlcnMuY29udGFpbnMoZWxlbWVudCk7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBTb3J0ZXIgZ2V0IHNvcnRlciB7CiAgICByZXR1cm4gX3NvcnRlciA/Pz0gbmV3IEtlcm5lbFNvcnRlcihlbGVtZW50TWFwKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWVEb21haW4gZ2V0IGFic3RyYWN0VmFsdWVEb21haW4gewogICAgcmV0dXJuIF9hYnN0cmFjdFZhbHVlRG9tYWluOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNFbGVtZW50SW4oQ2xhc3NFbnRpdHkgY2xzLCBOYW1lIG5hbWUsIEVudGl0eSBlbGVtZW50KSB7CiAgICB3aGlsZSAoY2xzICE9IG51bGwpIHsKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IGVsZW1lbnRFbnZpcm9ubWVudAogICAgICAgICAgLmxvb2t1cExvY2FsQ2xhc3NNZW1iZXIoY2xzLCBuYW1lLnRleHQsIHNldHRlcjogbmFtZS5pc1NldHRlcik7CiAgICAgIGlmIChtZW1iZXIgIT0gbnVsbCAmJgogICAgICAgICAgIW1lbWJlci5pc0Fic3RyYWN0ICYmCiAgICAgICAgICAoIW5hbWUuaXNQcml2YXRlIHx8IG1lbWJlci5saWJyYXJ5ID09IG5hbWUubGlicmFyeSkpIHsKICAgICAgICByZXR1cm4gbWVtYmVyID09IGVsZW1lbnQ7CiAgICAgIH0KICAgICAgY2xzID0gZWxlbWVudEVudmlyb25tZW50LmdldFN1cGVyQ2xhc3MoY2xzKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgYSBbc2VsZWN0b3JdIGNhbGwgb24gYW4gaW5zdGFuY2Ugb2YgW2Nsc10KICAvLy8gd2lsbCBoaXQgYSBtZXRob2QgYXQgcnVudGltZSwgYW5kIG5vdCBnbyB0aHJvdWdoIFtub1N1Y2hNZXRob2RdLgogIGJvb2wgX2hhc0NvbmNyZXRlTWF0Y2goQ2xhc3NFbnRpdHkgY2xzLCBTZWxlY3RvciBzZWxlY3RvciwKICAgICAge0NsYXNzRW50aXR5IHN0b3BBdFN1cGVyY2xhc3N9KSB7CiAgICBhc3NlcnQoY2xhc3NIaWVyYXJjaHkuaXNJbnN0YW50aWF0ZWQoY2xzKSwKICAgICAgICBmYWlsZWRBdChjbHMsICckY2xzIGhhcyBub3QgYmVlbiBpbnN0YW50aWF0ZWQuJykpOwogICAgTWVtYmVyRW50aXR5IGVsZW1lbnQgPSBlbGVtZW50RW52aXJvbm1lbnQKICAgICAgICAubG9va3VwQ2xhc3NNZW1iZXIoY2xzLCBzZWxlY3Rvci5uYW1lLCBzZXR0ZXI6IHNlbGVjdG9yLmlzU2V0dGVyKTsKICAgIGlmIChlbGVtZW50ID09IG51bGwpIHJldHVybiBmYWxzZTsKCiAgICBpZiAoZWxlbWVudC5pc0Fic3RyYWN0KSB7CiAgICAgIENsYXNzRW50aXR5IGVuY2xvc2luZ0NsYXNzID0gZWxlbWVudC5lbmNsb3NpbmdDbGFzczsKICAgICAgcmV0dXJuIF9oYXNDb25jcmV0ZU1hdGNoKAogICAgICAgICAgZWxlbWVudEVudmlyb25tZW50LmdldFN1cGVyQ2xhc3MoZW5jbG9zaW5nQ2xhc3MpLCBzZWxlY3Rvcik7CiAgICB9CiAgICByZXR1cm4gc2VsZWN0b3IuYXBwbGllc1VubmFtZWQoZWxlbWVudCk7CiAgfQoKICBib29sIF9pc05hbWVkTWl4aW5BcHBsaWNhdGlvbihDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBlbGVtZW50RW52aXJvbm1lbnQuaXNNaXhpbkFwcGxpY2F0aW9uKGNscykgJiYKICAgICAgICAhZWxlbWVudEVudmlyb25tZW50LmlzVW5uYW1lZE1peGluQXBwbGljYXRpb24oY2xzKTsKICB9Cn0KCmNsYXNzIEtlcm5lbFNvcnRlciBpbXBsZW1lbnRzIFNvcnRlciB7CiAgZmluYWwgSnNUb0VsZW1lbnRNYXAgZWxlbWVudE1hcDsKCiAgS2VybmVsU29ydGVyKHRoaXMuZWxlbWVudE1hcCk7CgogIGludCBfY29tcGFyZUxpYnJhcmllcyhMaWJyYXJ5RW50aXR5IGEsIExpYnJhcnlFbnRpdHkgYikgewogICAgcmV0dXJuIHV0aWxzLmNvbXBhcmVMaWJyYXJpZXNVcmlzKGEuY2Fub25pY2FsVXJpLCBiLmNhbm9uaWNhbFVyaSk7CiAgfQoKICBpbnQgX2NvbXBhcmVTb3VyY2VTcGFucyhFbnRpdHkgZW50aXR5MSwgU291cmNlU3BhbiBzb3VyY2VTcGFuMSwKICAgICAgRW50aXR5IGVudGl0eTIsIFNvdXJjZVNwYW4gc291cmNlU3BhbjIpIHsKICAgIGludCByID0gdXRpbHMuY29tcGFyZVNvdXJjZVVyaXMoc291cmNlU3BhbjEudXJpLCBzb3VyY2VTcGFuMi51cmkpOwogICAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CiAgICByZXR1cm4gdXRpbHMuY29tcGFyZUVudGl0aWVzKAogICAgICAgIGVudGl0eTEsIHNvdXJjZVNwYW4xLmJlZ2luLCBudWxsLCBlbnRpdHkyLCBzb3VyY2VTcGFuMi5iZWdpbiwgbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxMaWJyYXJ5RW50aXR5PiBzb3J0TGlicmFyaWVzKEl0ZXJhYmxlPExpYnJhcnlFbnRpdHk+IGxpYnJhcmllcykgewogICAgcmV0dXJuIGxpYnJhcmllcy50b0xpc3QoKS4uc29ydChfY29tcGFyZUxpYnJhcmllcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxUPiBzb3J0TWVtYmVyczxUIGV4dGVuZHMgTWVtYmVyRW50aXR5PihJdGVyYWJsZTxUPiBtZW1iZXJzKSB7CiAgICByZXR1cm4gbWVtYmVycy50b0xpc3QoKS4uc29ydChjb21wYXJlTWVtYmVyc0J5TG9jYXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IHNvcnRDbGFzc2VzKEl0ZXJhYmxlPENsYXNzRW50aXR5PiBjbGFzc2VzKSB7CiAgICBMaXN0PENsYXNzRW50aXR5PiByZWd1bGFyQ2xhc3NlcyA9IDxDbGFzc0VudGl0eT5bXTsKICAgIExpc3Q8Q2xhc3NFbnRpdHk+IHVubmFtZWRNaXhpbnMgPSA8Q2xhc3NFbnRpdHk+W107CiAgICBmb3IgKENsYXNzRW50aXR5IGNscyBpbiBjbGFzc2VzKSB7CiAgICAgIGlmIChlbGVtZW50TWFwLmVsZW1lbnRFbnZpcm9ubWVudC5pc1VubmFtZWRNaXhpbkFwcGxpY2F0aW9uKGNscykpIHsKICAgICAgICB1bm5hbWVkTWl4aW5zLmFkZChjbHMpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlZ3VsYXJDbGFzc2VzLmFkZChjbHMpOwogICAgICB9CiAgICB9CiAgICBMaXN0PENsYXNzRW50aXR5PiBzb3J0ZWQgPSA8Q2xhc3NFbnRpdHk+W107CiAgICByZWd1bGFyQ2xhc3Nlcy5zb3J0KGNvbXBhcmVDbGFzc2VzQnlMb2NhdGlvbik7CiAgICBzb3J0ZWQuYWRkQWxsKHJlZ3VsYXJDbGFzc2VzKTsKICAgIHVubmFtZWRNaXhpbnMuc29ydCgoYSwgYikgewogICAgICBpbnQgcmVzdWx0ID0gX2NvbXBhcmVMaWJyYXJpZXMoYS5saWJyYXJ5LCBiLmxpYnJhcnkpOwogICAgICBpZiAocmVzdWx0ICE9IDApIHJldHVybiByZXN1bHQ7CiAgICAgIHJlc3VsdCA9IGEubmFtZS5jb21wYXJlVG8oYi5uYW1lKTsKICAgICAgYXNzZXJ0KHJlc3VsdCAhPSAwLAogICAgICAgICAgZmFpbGVkQXQoYSwgIk11bHRpcGxlIG1peGlucyBuYW1lZCAke2EubmFtZX06ICRhIHZzICRiLiIpKTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0pOwogICAgc29ydGVkLmFkZEFsbCh1bm5hbWVkTWl4aW5zKTsKICAgIHJldHVybiBzb3J0ZWQ7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxUeXBlZGVmRW50aXR5PiBzb3J0VHlwZWRlZnMoSXRlcmFibGU8VHlwZWRlZkVudGl0eT4gdHlwZWRlZnMpIHsKICAgIC8vIFRPRE8ocmVkZW1wdGlvbik6IFN1cHBvcnQgdGhpcy4KICAgIGFzc2VydCh0eXBlZGVmcy5pc0VtcHR5KTsKICAgIHJldHVybiB0eXBlZGVmczsKICB9CgogIEBvdmVycmlkZQogIGludCBjb21wYXJlTGlicmFyaWVzQnlMb2NhdGlvbihMaWJyYXJ5RW50aXR5IGEsIExpYnJhcnlFbnRpdHkgYikgewogICAgcmV0dXJuIF9jb21wYXJlTGlicmFyaWVzKGEsIGIpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGNvbXBhcmVDbGFzc2VzQnlMb2NhdGlvbihDbGFzc0VudGl0eSBhLCBDbGFzc0VudGl0eSBiKSB7CiAgICBpbnQgciA9IF9jb21wYXJlTGlicmFyaWVzKGEubGlicmFyeSwgYi5saWJyYXJ5KTsKICAgIGlmIChyICE9IDApIHJldHVybiByOwogICAgQ2xhc3NEZWZpbml0aW9uIGRlZmluaXRpb24xID0gZWxlbWVudE1hcC5nZXRDbGFzc0RlZmluaXRpb24oYSk7CiAgICBDbGFzc0RlZmluaXRpb24gZGVmaW5pdGlvbjIgPSBlbGVtZW50TWFwLmdldENsYXNzRGVmaW5pdGlvbihiKTsKICAgIHJldHVybiBfY29tcGFyZVNvdXJjZVNwYW5zKAogICAgICAgIGEsIGRlZmluaXRpb24xLmxvY2F0aW9uLCBiLCBkZWZpbml0aW9uMi5sb2NhdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgY29tcGFyZVR5cGVkZWZzQnlMb2NhdGlvbihUeXBlZGVmRW50aXR5IGEsIFR5cGVkZWZFbnRpdHkgYikgewogICAgLy8gVE9ETyhyZWRlbXB0aW9uKTogU3VwcG9ydCB0aGlzLgogICAgZmFpbGVkQXQoYSwgJ0tlcm5lbFNvcnRlci5jb21wYXJlVHlwZWRlZnNCeUxvY2F0aW9uIHVuaW1wbGVtZW50ZWQnKTsKICAgIHJldHVybiAwOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGNvbXBhcmVNZW1iZXJzQnlMb2NhdGlvbihNZW1iZXJFbnRpdHkgYSwgTWVtYmVyRW50aXR5IGIpIHsKICAgIGludCByID0gX2NvbXBhcmVMaWJyYXJpZXMoYS5saWJyYXJ5LCBiLmxpYnJhcnkpOwogICAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CiAgICBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24xID0gZWxlbWVudE1hcC5nZXRNZW1iZXJEZWZpbml0aW9uKGEpOwogICAgTWVtYmVyRGVmaW5pdGlvbiBkZWZpbml0aW9uMiA9IGVsZW1lbnRNYXAuZ2V0TWVtYmVyRGVmaW5pdGlvbihiKTsKICAgIHJldHVybiBfY29tcGFyZVNvdXJjZVNwYW5zKAogICAgICAgIGEsIGRlZmluaXRpb24xLmxvY2F0aW9uLCBiLCBkZWZpbml0aW9uMi5sb2NhdGlvbik7CiAgfQp9CgovLy8gW0xvY2FsTG9va3VwXSBpbXBsZW1lbnRhdGlvbiB1c2VkIHRvIGRlc2VyaWFsaXplIFtKc0Nsb3NlZFdvcmxkXS4KY2xhc3MgTG9jYWxMb29rdXBJbXBsIGltcGxlbWVudHMgTG9jYWxMb29rdXAgewogIGZpbmFsIEdsb2JhbExvY2Fsc01hcCBfZ2xvYmFsTG9jYWxzTWFwOwoKICBMb2NhbExvb2t1cEltcGwodGhpcy5fZ2xvYmFsTG9jYWxzTWFwKTsKCiAgQG92ZXJyaWRlCiAgTG9jYWwgZ2V0TG9jYWxCeUluZGV4KE1lbWJlckVudGl0eSBtZW1iZXJDb250ZXh0LCBpbnQgaW5kZXgpIHsKICAgIEtlcm5lbFRvTG9jYWxzTWFwSW1wbCBtYXAgPSBfZ2xvYmFsTG9jYWxzTWFwLmdldExvY2Fsc01hcChtZW1iZXJDb250ZXh0KTsKICAgIHJldHVybiBtYXAuZ2V0TG9jYWxCeUluZGV4KGluZGV4KTsKICB9Cn0KgooATk48AShEARoZH0wgMiQxISEeMSQpLCsuKTUrIiIaLislOSQYGyAWAS4sAQwfDCkMIwwrAR0BNjYBSQFKLwFALQEvAU0zAQwsAQwsAQwnASkMIiwMJgwpDCkMJwwnEgERFxccGRQaHR8eICQdFikbMxwcHh1FBAE7LB8jHzMeGxcBJjVAJjhGSyw/MC1OOE1IMCdAKDkBSEdKTkczQUZBASY4AR5AASQ3ARUBHhQUGRYRGxocGx0hGhMmGB8ZGRUZBAExKBUmKwEqJisoIyksKyosMCkYRjU7Ky0qEwQBDE8BDEMBDC8BDCgtBAEMQCw1Bk4dNRAEAQw+LDUGOU4EAQwoJgQBDC8rHEAEAQxMJz1AHTMtBAEMUEwqJgQBDBo/TxJDJkYbFggsNFAiFjY2FQhPMiwyMBFEJQpEOysGATpJLSUuLi8vDTlGQggUBgQBDEw3PAEoQFABIkcJMU47KycIIwE6CzQ5HCs2GR5OFBoKCCEGNh0EAQw3IkIyMgE4QShDQSAoDgwKAS4fKAoIBjY4BAEMTDc8CAQBDEQgISBIMD0IBhIEAR4hTz48BgQBDEgwHVAgRiUEAQxRGjMuBlAEAQwoMxpKBAFMGhk5JwQBDE8zEwYyRwQBDDEoLlFKUC4UBgEhEwYkOQYSBAEMFjUEAQwwIQQBDEIaL0ocIEEiCDMGEgQBQEc9KC87LksnAR47IEcGLQQBMzk8BAIBJyMBIQE8RwQBQjBHGiJNBAEMTTgEAQxJPQQBDEU4NydKIA8hCAYwMyMgPCYpGkYVCCITBAEMSyceFQQBDEUkBAEMPzUaREQgOwQBDEQnSQ4EAQxBNRpGRiA7BAIBRi8qASoBDEFOJwQCAStwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19tb2RlbC9qc193b3JsZC5kYXJ0PHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX21vZGVsL2pzX3dvcmxkX2J1aWxkZXIuZGFydMAAi68vLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CgppbXBvcnQgJy4uL2Nsb3N1cmUuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JzsKaW1wb3J0ICcuLi9jb25zdGFudHMvY29uc3RhbnRfc3lzdGVtLmRhcnQnIGFzIGNvbnN0YW50X3N5c3RlbTsKaW1wb3J0ICcuLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJy4uL2RlZmVycmVkX2xvYWQuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvaW5kZXhlZC5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9uYW1lcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci9hYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydCc7CmltcG9ydCAnLi4vaXIvY2xvc3VyZS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2Fubm90YXRpb25zLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvYmFja2VuZF91c2FnZS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2ZpZWxkX2FuYWx5c2lzLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvaW50ZXJjZXB0b3JfZGF0YS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL25hdGl2ZV9kYXRhLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbm9fc3VjaF9tZXRob2RfcmVnaXN0cnkuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9ydW50aW1lX3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2tlcm5lbC9rZWxlbWVudHMuZGFydCc7CmltcG9ydCAnLi4vbmF0aXZlL2JlaGF2aW9yLmRhcnQnOwppbXBvcnQgJy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY2xhc3NfaGllcmFyY2h5LmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NsYXNzX3NldC5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9mZWF0dXJlLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnOwppbXBvcnQgJy4uL3dvcmxkLmRhcnQnOwppbXBvcnQgJ2Nsb3N1cmUuZGFydCc7CmltcG9ydCAnZWxlbWVudHMuZGFydCc7CmltcG9ydCAnZWxlbWVudF9tYXAuZGFydCc7CmltcG9ydCAnZWxlbWVudF9tYXBfaW1wbC5kYXJ0JzsKaW1wb3J0ICdqc193b3JsZC5kYXJ0JzsKaW1wb3J0ICdsb2NhbHMuZGFydCc7CgpjbGFzcyBKc0Nsb3NlZFdvcmxkQnVpbGRlciB7CiAgZmluYWwgSnNLZXJuZWxUb0VsZW1lbnRNYXAgX2VsZW1lbnRNYXA7CiAgZmluYWwgTWFwPENsYXNzRW50aXR5LCBDbGFzc0hpZXJhcmNoeU5vZGU+IF9jbGFzc0hpZXJhcmNoeU5vZGVzID0KICAgICAgbmV3IENsYXNzSGllcmFyY2h5Tm9kZXNNYXAoKTsKICBmaW5hbCBNYXA8Q2xhc3NFbnRpdHksIENsYXNzU2V0PiBfY2xhc3NTZXRzID0gPENsYXNzRW50aXR5LCBDbGFzc1NldD57fTsKICBmaW5hbCBHbG9iYWxMb2NhbHNNYXAgX2dsb2JhbExvY2Fsc01hcDsKICBmaW5hbCBDbG9zdXJlRGF0YUJ1aWxkZXIgX2Nsb3N1cmVEYXRhQnVpbGRlcjsKICBmaW5hbCBDb21waWxlck9wdGlvbnMgX29wdGlvbnM7CiAgZmluYWwgQWJzdHJhY3RWYWx1ZVN0cmF0ZWd5IF9hYnN0cmFjdFZhbHVlU3RyYXRlZ3k7CgogIEpzQ2xvc2VkV29ybGRCdWlsZGVyKHRoaXMuX2VsZW1lbnRNYXAsIHRoaXMuX2dsb2JhbExvY2Fsc01hcCwKICAgICAgdGhpcy5fY2xvc3VyZURhdGFCdWlsZGVyLCB0aGlzLl9vcHRpb25zLCB0aGlzLl9hYnN0cmFjdFZhbHVlU3RyYXRlZ3kpOwoKICBFbGVtZW50RW52aXJvbm1lbnQgZ2V0IF9lbGVtZW50RW52aXJvbm1lbnQgPT4gX2VsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50OwogIENvbW1vbkVsZW1lbnRzIGdldCBfY29tbW9uRWxlbWVudHMgPT4gX2VsZW1lbnRNYXAuY29tbW9uRWxlbWVudHM7CgogIEpzQ2xvc2VkV29ybGQgY29udmVydENsb3NlZFdvcmxkKAogICAgICBLQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsCiAgICAgIE1hcDxNZW1iZXJFbnRpdHksIENsb3N1cmVTY29wZU1vZGVsPiBjbG9zdXJlTW9kZWxzLAogICAgICBPdXRwdXRVbml0RGF0YSBrT3V0cHV0VW5pdERhdGEpIHsKICAgIEpzVG9Gcm9udGVuZE1hcCBtYXAgPSBuZXcgSnNUb0Zyb250ZW5kTWFwSW1wbChfZWxlbWVudE1hcCk7CgogICAgQmFja2VuZFVzYWdlIGJhY2tlbmRVc2FnZSA9CiAgICAgICAgX2NvbnZlcnRCYWNrZW5kVXNhZ2UobWFwLCBjbG9zZWRXb3JsZC5iYWNrZW5kVXNhZ2UpOwogICAgTmF0aXZlRGF0YSBuYXRpdmVEYXRhID0gX2NvbnZlcnROYXRpdmVEYXRhKG1hcCwgY2xvc2VkV29ybGQubmF0aXZlRGF0YSk7CiAgICBfZWxlbWVudE1hcC5uYXRpdmVCYXNpY0RhdGEgPSBuYXRpdmVEYXRhOwogICAgSW50ZXJjZXB0b3JEYXRhIGludGVyY2VwdG9yRGF0YSA9CiAgICAgICAgX2NvbnZlcnRJbnRlcmNlcHRvckRhdGEobWFwLCBuYXRpdmVEYXRhLCBjbG9zZWRXb3JsZC5pbnRlcmNlcHRvckRhdGEpOwoKICAgIFNldDxDbGFzc0VudGl0eT4gaW1wbGVtZW50ZWRDbGFzc2VzID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKCiAgICAvLy8gQ29udmVydHMgW25vZGVdIGZyb20gdGhlIGZyb250ZW5kIHdvcmxkIHRvIHRoZSBjb3JyZXNwb25kaW5nCiAgICAvLy8gW0NsYXNzSGllcmFyY2h5Tm9kZV0gZm9yIHRoZSBiYWNrZW5kIHdvcmxkLgogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIGNvbnZlcnRDbGFzc0hpZXJhcmNoeU5vZGUoQ2xhc3NIaWVyYXJjaHlOb2RlIG5vZGUpIHsKICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gbWFwLnRvQmFja2VuZENsYXNzKG5vZGUuY2xzKTsKICAgICAgaWYgKGNsb3NlZFdvcmxkLmlzSW1wbGVtZW50ZWQobm9kZS5jbHMpKSB7CiAgICAgICAgaW1wbGVtZW50ZWRDbGFzc2VzLmFkZChjbHMpOwogICAgICB9CiAgICAgIENsYXNzSGllcmFyY2h5Tm9kZSBuZXdOb2RlID0gX2NsYXNzSGllcmFyY2h5Tm9kZXMucHV0SWZBYnNlbnQoY2xzLCAoKSB7CiAgICAgICAgQ2xhc3NIaWVyYXJjaHlOb2RlIHBhcmVudE5vZGU7CiAgICAgICAgaWYgKG5vZGUucGFyZW50Tm9kZSAhPSBudWxsKSB7CiAgICAgICAgICBwYXJlbnROb2RlID0gY29udmVydENsYXNzSGllcmFyY2h5Tm9kZShub2RlLnBhcmVudE5vZGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IENsYXNzSGllcmFyY2h5Tm9kZShwYXJlbnROb2RlLCBjbHMsIG5vZGUuaGllcmFyY2h5RGVwdGgpOwogICAgICB9KTsKICAgICAgbmV3Tm9kZS5pc0Fic3RyYWN0bHlJbnN0YW50aWF0ZWQgPSBub2RlLmlzQWJzdHJhY3RseUluc3RhbnRpYXRlZDsKICAgICAgbmV3Tm9kZS5pc0RpcmVjdGx5SW5zdGFudGlhdGVkID0gbm9kZS5pc0RpcmVjdGx5SW5zdGFudGlhdGVkOwogICAgICByZXR1cm4gbmV3Tm9kZTsKICAgIH0KCiAgICAvLy8gQ29udmVydHMgW2NsYXNzU2V0XSBmcm9tIHRoZSBmcm9udGVuZCB3b3JsZCB0byB0aGUgY29ycmVzcG9uZGluZwogICAgLy8vIFtDbGFzc1NldF0gZm9yIHRoZSBiYWNrZW5kIHdvcmxkLgogICAgQ2xhc3NTZXQgY29udmVydENsYXNzU2V0KENsYXNzU2V0IGNsYXNzU2V0KSB7CiAgICAgIENsYXNzRW50aXR5IGNscyA9IG1hcC50b0JhY2tlbmRDbGFzcyhjbGFzc1NldC5jbHMpOwogICAgICByZXR1cm4gX2NsYXNzU2V0cy5wdXRJZkFic2VudChjbHMsICgpIHsKICAgICAgICBDbGFzc0hpZXJhcmNoeU5vZGUgbmV3Tm9kZSA9IGNvbnZlcnRDbGFzc0hpZXJhcmNoeU5vZGUoY2xhc3NTZXQubm9kZSk7CiAgICAgICAgQ2xhc3NTZXQgbmV3Q2xhc3NTZXQgPSBuZXcgQ2xhc3NTZXQobmV3Tm9kZSk7CiAgICAgICAgZm9yIChDbGFzc0hpZXJhcmNoeU5vZGUgc3VidHlwZSBpbiBjbGFzc1NldC5zdWJ0eXBlTm9kZXMpIHsKICAgICAgICAgIENsYXNzSGllcmFyY2h5Tm9kZSBuZXdTdWJ0eXBlID0gY29udmVydENsYXNzSGllcmFyY2h5Tm9kZShzdWJ0eXBlKTsKICAgICAgICAgIG5ld0NsYXNzU2V0LmFkZFN1YnR5cGUobmV3U3VidHlwZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXdDbGFzc1NldDsKICAgICAgfSk7CiAgICB9CgogICAgY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkKICAgICAgICAuZ2V0Q2xhc3NIaWVyYXJjaHlOb2RlKGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKQogICAgICAgIC5mb3JFYWNoU3ViY2xhc3MoKENsYXNzRW50aXR5IGNscykgewogICAgICBjb252ZXJ0Q2xhc3NTZXQoY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuZ2V0Q2xhc3NTZXQoY2xzKSk7CiAgICB9LCBDbGFzc0hpZXJhcmNoeU5vZGUuQUxMKTsKCiAgICBTZXQ8TWVtYmVyRW50aXR5PiBsaXZlSW5zdGFuY2VNZW1iZXJzID0KICAgICAgICBtYXAudG9CYWNrZW5kTWVtYmVyU2V0KGNsb3NlZFdvcmxkLmxpdmVJbnN0YW5jZU1lbWJlcnMpOwoKICAgIE1hcDxDbGFzc0VudGl0eSwgU2V0PENsYXNzRW50aXR5Pj4gbWl4aW5Vc2VzID0KICAgICAgICBtYXAudG9CYWNrZW5kQ2xhc3NNYXAoY2xvc2VkV29ybGQubWl4aW5Vc2VzLCBtYXAudG9CYWNrZW5kQ2xhc3NTZXQpOwoKICAgIE1hcDxDbGFzc0VudGl0eSwgU2V0PENsYXNzRW50aXR5Pj4gdHlwZXNJbXBsZW1lbnRlZEJ5U3ViY2xhc3NlcyA9CiAgICAgICAgbWFwLnRvQmFja2VuZENsYXNzTWFwKAogICAgICAgICAgICBjbG9zZWRXb3JsZC50eXBlc0ltcGxlbWVudGVkQnlTdWJjbGFzc2VzLCBtYXAudG9CYWNrZW5kQ2xhc3NTZXQpOwoKICAgIFNldDxNZW1iZXJFbnRpdHk+IGFzc2lnbmVkSW5zdGFuY2VNZW1iZXJzID0KICAgICAgICBtYXAudG9CYWNrZW5kTWVtYmVyU2V0KGNsb3NlZFdvcmxkLmFzc2lnbmVkSW5zdGFuY2VNZW1iZXJzKTsKCiAgICBTZXQ8Q2xhc3NFbnRpdHk+IGxpdmVOYXRpdmVDbGFzc2VzID0KICAgICAgICBtYXAudG9CYWNrZW5kQ2xhc3NTZXQoY2xvc2VkV29ybGQubGl2ZU5hdGl2ZUNsYXNzZXMpOwoKICAgIFNldDxNZW1iZXJFbnRpdHk+IHByb2Nlc3NlZE1lbWJlcnMgPQogICAgICAgIG1hcC50b0JhY2tlbmRNZW1iZXJTZXQoY2xvc2VkV29ybGQubGl2ZU1lbWJlclVzYWdlLmtleXMpOwoKICAgIFJ1bnRpbWVUeXBlc05lZWQgcnRpTmVlZDsKCiAgICBMaXN0PEZ1bmN0aW9uRW50aXR5PiBjYWxsTWV0aG9kcyA9IDxGdW5jdGlvbkVudGl0eT5bXTsKICAgIENsb3N1cmVEYXRhIGNsb3N1cmVEYXRhOwogICAgaWYgKF9vcHRpb25zLmRpc2FibGVSdGlPcHRpbWl6YXRpb24pIHsKICAgICAgcnRpTmVlZCA9IG5ldyBUcml2aWFsUnVudGltZVR5cGVzTmVlZCgpOwogICAgICBjbG9zdXJlRGF0YSA9IF9jbG9zdXJlRGF0YUJ1aWxkZXIuY3JlYXRlQ2xvc3VyZUVudGl0aWVzKAogICAgICAgICAgdGhpcywKICAgICAgICAgIG1hcC50b0JhY2tlbmRNZW1iZXJNYXAoY2xvc3VyZU1vZGVscywgaWRlbnRpdHkpLAogICAgICAgICAgY29uc3QgVHJpdmlhbENsb3N1cmVSdGlOZWVkKCksCiAgICAgICAgICBjYWxsTWV0aG9kcyk7CiAgICB9IGVsc2UgewogICAgICBSdW50aW1lVHlwZXNOZWVkSW1wbCBrZXJuZWxSdGlOZWVkID0gY2xvc2VkV29ybGQucnRpTmVlZDsKICAgICAgU2V0PGlyLk5vZGU+IGxvY2FsRnVuY3Rpb25zTm9kZXNOZWVkaW5nU2lnbmF0dXJlID0gbmV3IFNldDxpci5Ob2RlPigpOwogICAgICBmb3IgKEtMb2NhbEZ1bmN0aW9uIGxvY2FsRnVuY3Rpb24KICAgICAgICAgIGluIGtlcm5lbFJ0aU5lZWQubG9jYWxGdW5jdGlvbnNOZWVkaW5nU2lnbmF0dXJlKSB7CiAgICAgICAgaXIuTm9kZSBub2RlID0gbG9jYWxGdW5jdGlvbi5ub2RlOwogICAgICAgIGFzc2VydChub2RlIGlzIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24gfHwgbm9kZSBpcyBpci5GdW5jdGlvbkV4cHJlc3Npb24sCiAgICAgICAgICAgICJVbmV4cGVjdGVkIGxvY2FsIGZ1bmN0aW9uIG5vZGU6ICRub2RlIik7CiAgICAgICAgbG9jYWxGdW5jdGlvbnNOb2Rlc05lZWRpbmdTaWduYXR1cmUuYWRkKG5vZGUpOwogICAgICB9CiAgICAgIFNldDxpci5Ob2RlPiBsb2NhbEZ1bmN0aW9uc05vZGVzTmVlZGluZ1R5cGVBcmd1bWVudHMgPSBuZXcgU2V0PGlyLk5vZGU+KCk7CiAgICAgIGZvciAoS0xvY2FsRnVuY3Rpb24gbG9jYWxGdW5jdGlvbgogICAgICAgICAgaW4ga2VybmVsUnRpTmVlZC5sb2NhbEZ1bmN0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzKSB7CiAgICAgICAgaXIuTm9kZSBub2RlID0gbG9jYWxGdW5jdGlvbi5ub2RlOwogICAgICAgIGFzc2VydChub2RlIGlzIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24gfHwgbm9kZSBpcyBpci5GdW5jdGlvbkV4cHJlc3Npb24sCiAgICAgICAgICAgICJVbmV4cGVjdGVkIGxvY2FsIGZ1bmN0aW9uIG5vZGU6ICRub2RlIik7CiAgICAgICAgbG9jYWxGdW5jdGlvbnNOb2Rlc05lZWRpbmdUeXBlQXJndW1lbnRzLmFkZChub2RlKTsKICAgICAgfQoKICAgICAgUnVudGltZVR5cGVzTmVlZEltcGwgalJ0aU5lZWQgPQogICAgICAgICAgX2NvbnZlcnRSdW50aW1lVHlwZXNOZWVkKG1hcCwgYmFja2VuZFVzYWdlLCBrZXJuZWxSdGlOZWVkKTsKICAgICAgY2xvc3VyZURhdGEgPSBfY2xvc3VyZURhdGFCdWlsZGVyLmNyZWF0ZUNsb3N1cmVFbnRpdGllcygKICAgICAgICAgIHRoaXMsCiAgICAgICAgICBtYXAudG9CYWNrZW5kTWVtYmVyTWFwKGNsb3N1cmVNb2RlbHMsIGlkZW50aXR5KSwKICAgICAgICAgIG5ldyBKc0Nsb3N1cmVSdGlOZWVkKAogICAgICAgICAgICAgIGpSdGlOZWVkLAogICAgICAgICAgICAgIGxvY2FsRnVuY3Rpb25zTm9kZXNOZWVkaW5nVHlwZUFyZ3VtZW50cywKICAgICAgICAgICAgICBsb2NhbEZ1bmN0aW9uc05vZGVzTmVlZGluZ1NpZ25hdHVyZSksCiAgICAgICAgICBjYWxsTWV0aG9kcyk7CgogICAgICBMaXN0PEZ1bmN0aW9uRW50aXR5PiBjYWxsTWV0aG9kc05lZWRpbmdTaWduYXR1cmUgPSA8RnVuY3Rpb25FbnRpdHk+W107CiAgICAgIGZvciAoaXIuTm9kZSBub2RlIGluIGxvY2FsRnVuY3Rpb25zTm9kZXNOZWVkaW5nU2lnbmF0dXJlKSB7CiAgICAgICAgY2FsbE1ldGhvZHNOZWVkaW5nU2lnbmF0dXJlCiAgICAgICAgICAgIC5hZGQoY2xvc3VyZURhdGEuZ2V0Q2xvc3VyZUluZm8obm9kZSkuY2FsbE1ldGhvZCk7CiAgICAgIH0KICAgICAgTGlzdDxGdW5jdGlvbkVudGl0eT4gY2FsbE1ldGhvZHNOZWVkaW5nVHlwZUFyZ3VtZW50cyA9IDxGdW5jdGlvbkVudGl0eT5bXTsKICAgICAgZm9yIChpci5Ob2RlIG5vZGUgaW4gbG9jYWxGdW5jdGlvbnNOb2Rlc05lZWRpbmdUeXBlQXJndW1lbnRzKSB7CiAgICAgICAgY2FsbE1ldGhvZHNOZWVkaW5nVHlwZUFyZ3VtZW50cwogICAgICAgICAgICAuYWRkKGNsb3N1cmVEYXRhLmdldENsb3N1cmVJbmZvKG5vZGUpLmNhbGxNZXRob2QpOwogICAgICB9CiAgICAgIGpSdGlOZWVkLm1ldGhvZHNOZWVkaW5nU2lnbmF0dXJlLmFkZEFsbChjYWxsTWV0aG9kc05lZWRpbmdTaWduYXR1cmUpOwogICAgICBqUnRpTmVlZC5tZXRob2RzTmVlZGluZ1R5cGVBcmd1bWVudHMKICAgICAgICAgIC5hZGRBbGwoY2FsbE1ldGhvZHNOZWVkaW5nVHlwZUFyZ3VtZW50cyk7CgogICAgICBydGlOZWVkID0galJ0aU5lZWQ7CiAgICB9CgogICAgTm9TdWNoTWV0aG9kRGF0YUltcGwgb2xkTm9TdWNoTWV0aG9kRGF0YSA9IGNsb3NlZFdvcmxkLm5vU3VjaE1ldGhvZERhdGE7CiAgICBOb1N1Y2hNZXRob2REYXRhIG5vU3VjaE1ldGhvZERhdGEgPSBuZXcgTm9TdWNoTWV0aG9kRGF0YUltcGwoCiAgICAgICAgbWFwLnRvQmFja2VuZEZ1bmN0aW9uU2V0KG9sZE5vU3VjaE1ldGhvZERhdGEudGhyb3dpbmdJbXBscyksCiAgICAgICAgbWFwLnRvQmFja2VuZEZ1bmN0aW9uU2V0KG9sZE5vU3VjaE1ldGhvZERhdGEub3RoZXJJbXBscyksCiAgICAgICAgbWFwLnRvQmFja2VuZEZ1bmN0aW9uU2V0KG9sZE5vU3VjaE1ldGhvZERhdGEuZm9yd2FyZGluZ1N5bnRheEltcGxzKSk7CgogICAgSkZpZWxkQW5hbHlzaXMgYWxsb2NhdG9yQW5hbHlzaXMgPQogICAgICAgIEpGaWVsZEFuYWx5c2lzLmZyb20oY2xvc2VkV29ybGQsIG1hcCwgX29wdGlvbnMpOwoKICAgIEFubm90YXRpb25zRGF0YUltcGwgb2xkQW5ub3RhdGlvbnNEYXRhID0gY2xvc2VkV29ybGQuYW5ub3RhdGlvbnNEYXRhOwogICAgQW5ub3RhdGlvbnNEYXRhIGFubm90YXRpb25zRGF0YSA9IG5ldyBBbm5vdGF0aW9uc0RhdGFJbXBsKAogICAgICAgIG1hcC50b0JhY2tlbmRNZW1iZXJNYXAob2xkQW5ub3RhdGlvbnNEYXRhLnByYWdtYUFubm90YXRpb25zLCBpZGVudGl0eSkpOwoKICAgIE91dHB1dFVuaXREYXRhIG91dHB1dFVuaXREYXRhID0KICAgICAgICBfY29udmVydE91dHB1dFVuaXREYXRhKG1hcCwga091dHB1dFVuaXREYXRhLCBjbG9zdXJlRGF0YSk7CgogICAgcmV0dXJuIG5ldyBKc0Nsb3NlZFdvcmxkKAogICAgICAgIF9lbGVtZW50TWFwLAogICAgICAgIG5hdGl2ZURhdGEsCiAgICAgICAgaW50ZXJjZXB0b3JEYXRhLAogICAgICAgIGJhY2tlbmRVc2FnZSwKICAgICAgICBydGlOZWVkLAogICAgICAgIGFsbG9jYXRvckFuYWx5c2lzLAogICAgICAgIG5vU3VjaE1ldGhvZERhdGEsCiAgICAgICAgaW1wbGVtZW50ZWRDbGFzc2VzLAogICAgICAgIGxpdmVOYXRpdmVDbGFzc2VzLAogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEluY2x1ZGUgdGhlIGNhbGwgbWV0aG9kIHdoZW4gd2UgY2FuIGFsc28KICAgICAgICAvLyByZXByZXNlbnQgdGhlIHN5bnRoZXNpemVkIGNhbGwgbWV0aG9kcyBmb3Igc3RhdGljIGFuZCBpbnN0YW5jZSBtZXRob2QKICAgICAgICAvLyBjbG9zdXJpemF0aW9ucy4KICAgICAgICBsaXZlSW5zdGFuY2VNZW1iZXJzIC8qLi5hZGRBbGwoY2FsbE1ldGhvZHMpKi8sCiAgICAgICAgYXNzaWduZWRJbnN0YW5jZU1lbWJlcnMsCiAgICAgICAgcHJvY2Vzc2VkTWVtYmVycywKICAgICAgICBtaXhpblVzZXMsCiAgICAgICAgdHlwZXNJbXBsZW1lbnRlZEJ5U3ViY2xhc3NlcywKICAgICAgICBuZXcgQ2xhc3NIaWVyYXJjaHlJbXBsKAogICAgICAgICAgICBfZWxlbWVudE1hcC5jb21tb25FbGVtZW50cywgX2NsYXNzSGllcmFyY2h5Tm9kZXMsIF9jbGFzc1NldHMpLAogICAgICAgIF9hYnN0cmFjdFZhbHVlU3RyYXRlZ3ksCiAgICAgICAgYW5ub3RhdGlvbnNEYXRhLAogICAgICAgIF9nbG9iYWxMb2NhbHNNYXAsCiAgICAgICAgY2xvc3VyZURhdGEsCiAgICAgICAgb3V0cHV0VW5pdERhdGEpOwogIH0KCiAgQmFja2VuZFVzYWdlIF9jb252ZXJ0QmFja2VuZFVzYWdlKAogICAgICBKc1RvRnJvbnRlbmRNYXAgbWFwLCBCYWNrZW5kVXNhZ2VJbXBsIGJhY2tlbmRVc2FnZSkgewogICAgU2V0PEZ1bmN0aW9uRW50aXR5PiBnbG9iYWxGdW5jdGlvbkRlcGVuZGVuY2llcyA9CiAgICAgICAgbWFwLnRvQmFja2VuZEZ1bmN0aW9uU2V0KGJhY2tlbmRVc2FnZS5nbG9iYWxGdW5jdGlvbkRlcGVuZGVuY2llcyk7CiAgICBTZXQ8Q2xhc3NFbnRpdHk+IGdsb2JhbENsYXNzRGVwZW5kZW5jaWVzID0KICAgICAgICBtYXAudG9CYWNrZW5kQ2xhc3NTZXQoYmFja2VuZFVzYWdlLmdsb2JhbENsYXNzRGVwZW5kZW5jaWVzKTsKICAgIFNldDxGdW5jdGlvbkVudGl0eT4gaGVscGVyRnVuY3Rpb25zVXNlZCA9CiAgICAgICAgbWFwLnRvQmFja2VuZEZ1bmN0aW9uU2V0KGJhY2tlbmRVc2FnZS5oZWxwZXJGdW5jdGlvbnNVc2VkKTsKICAgIFNldDxDbGFzc0VudGl0eT4gaGVscGVyQ2xhc3Nlc1VzZWQgPQogICAgICAgIG1hcC50b0JhY2tlbmRDbGFzc1NldChiYWNrZW5kVXNhZ2UuaGVscGVyQ2xhc3Nlc1VzZWQpOwogICAgU2V0PFJ1bnRpbWVUeXBlVXNlPiBydW50aW1lVHlwZVVzZXMgPQogICAgICAgIGJhY2tlbmRVc2FnZS5ydW50aW1lVHlwZVVzZXMubWFwKChSdW50aW1lVHlwZVVzZSBydW50aW1lVHlwZVVzZSkgewogICAgICByZXR1cm4gbmV3IFJ1bnRpbWVUeXBlVXNlKAogICAgICAgICAgcnVudGltZVR5cGVVc2Uua2luZCwKICAgICAgICAgIG1hcC50b0JhY2tlbmRUeXBlKHJ1bnRpbWVUeXBlVXNlLnJlY2VpdmVyVHlwZSksCiAgICAgICAgICBtYXAudG9CYWNrZW5kVHlwZShydW50aW1lVHlwZVVzZS5hcmd1bWVudFR5cGUpKTsKICAgIH0pLnRvU2V0KCk7CgogICAgcmV0dXJuIG5ldyBCYWNrZW5kVXNhZ2VJbXBsKAogICAgICAgIGdsb2JhbEZ1bmN0aW9uRGVwZW5kZW5jaWVzOiBnbG9iYWxGdW5jdGlvbkRlcGVuZGVuY2llcywKICAgICAgICBnbG9iYWxDbGFzc0RlcGVuZGVuY2llczogZ2xvYmFsQ2xhc3NEZXBlbmRlbmNpZXMsCiAgICAgICAgaGVscGVyRnVuY3Rpb25zVXNlZDogaGVscGVyRnVuY3Rpb25zVXNlZCwKICAgICAgICBoZWxwZXJDbGFzc2VzVXNlZDogaGVscGVyQ2xhc3Nlc1VzZWQsCiAgICAgICAgbmVlZFRvSW5pdGlhbGl6ZUlzb2xhdGVBZmZpbml0eVRhZzoKICAgICAgICAgICAgYmFja2VuZFVzYWdlLm5lZWRUb0luaXRpYWxpemVJc29sYXRlQWZmaW5pdHlUYWcsCiAgICAgICAgbmVlZFRvSW5pdGlhbGl6ZURpc3BhdGNoUHJvcGVydHk6CiAgICAgICAgICAgIGJhY2tlbmRVc2FnZS5uZWVkVG9Jbml0aWFsaXplRGlzcGF0Y2hQcm9wZXJ0eSwKICAgICAgICByZXF1aXJlc1ByZWFtYmxlOiBiYWNrZW5kVXNhZ2UucmVxdWlyZXNQcmVhbWJsZSwKICAgICAgICBydW50aW1lVHlwZVVzZXM6IHJ1bnRpbWVUeXBlVXNlcywKICAgICAgICBpc0Z1bmN0aW9uQXBwbHlVc2VkOiBiYWNrZW5kVXNhZ2UuaXNGdW5jdGlvbkFwcGx5VXNlZCwKICAgICAgICBpc01pcnJvcnNVc2VkOiBiYWNrZW5kVXNhZ2UuaXNNaXJyb3JzVXNlZCwKICAgICAgICBpc05vU3VjaE1ldGhvZFVzZWQ6IGJhY2tlbmRVc2FnZS5pc05vU3VjaE1ldGhvZFVzZWQpOwogIH0KCiAgTmF0aXZlQmFzaWNEYXRhIF9jb252ZXJ0TmF0aXZlQmFzaWNEYXRhKAogICAgICBKc1RvRnJvbnRlbmRNYXAgbWFwLCBOYXRpdmVCYXNpY0RhdGFJbXBsIG5hdGl2ZUJhc2ljRGF0YSkgewogICAgTWFwPENsYXNzRW50aXR5LCBOYXRpdmVDbGFzc1RhZz4gbmF0aXZlQ2xhc3NUYWdJbmZvID0KICAgICAgICA8Q2xhc3NFbnRpdHksIE5hdGl2ZUNsYXNzVGFnPnt9OwogICAgbmF0aXZlQmFzaWNEYXRhLm5hdGl2ZUNsYXNzVGFnSW5mbwogICAgICAgIC5mb3JFYWNoKChDbGFzc0VudGl0eSBjbHMsIE5hdGl2ZUNsYXNzVGFnIHRhZykgewogICAgICBuYXRpdmVDbGFzc1RhZ0luZm9bbWFwLnRvQmFja2VuZENsYXNzKGNscyldID0gdGFnOwogICAgfSk7CiAgICBNYXA8TGlicmFyeUVudGl0eSwgU3RyaW5nPiBqc0ludGVyb3BMaWJyYXJpZXMgPQogICAgICAgIG1hcC50b0JhY2tlbmRMaWJyYXJ5TWFwKG5hdGl2ZUJhc2ljRGF0YS5qc0ludGVyb3BMaWJyYXJpZXMsIGlkZW50aXR5KTsKICAgIE1hcDxDbGFzc0VudGl0eSwgU3RyaW5nPiBqc0ludGVyb3BDbGFzc2VzID0KICAgICAgICBtYXAudG9CYWNrZW5kQ2xhc3NNYXAobmF0aXZlQmFzaWNEYXRhLmpzSW50ZXJvcENsYXNzZXMsIGlkZW50aXR5KTsKICAgIFNldDxDbGFzc0VudGl0eT4gYW5vbnltb3VzSnNJbnRlcm9wQ2xhc3NlcyA9CiAgICAgICAgbWFwLnRvQmFja2VuZENsYXNzU2V0KG5hdGl2ZUJhc2ljRGF0YS5hbm9ueW1vdXNKc0ludGVyb3BDbGFzc2VzKTsKICAgIE1hcDxNZW1iZXJFbnRpdHksIFN0cmluZz4ganNJbnRlcm9wTWVtYmVycyA9CiAgICAgICAgbWFwLnRvQmFja2VuZE1lbWJlck1hcChuYXRpdmVCYXNpY0RhdGEuanNJbnRlcm9wTWVtYmVycywgaWRlbnRpdHkpOwogICAgcmV0dXJuIG5ldyBOYXRpdmVCYXNpY0RhdGFJbXBsKAogICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQsCiAgICAgICAgbmF0aXZlQ2xhc3NUYWdJbmZvLAogICAgICAgIGpzSW50ZXJvcExpYnJhcmllcywKICAgICAgICBqc0ludGVyb3BDbGFzc2VzLAogICAgICAgIGFub255bW91c0pzSW50ZXJvcENsYXNzZXMsCiAgICAgICAganNJbnRlcm9wTWVtYmVycyk7CiAgfQoKICBOYXRpdmVEYXRhIF9jb252ZXJ0TmF0aXZlRGF0YSgKICAgICAgSnNUb0Zyb250ZW5kTWFwIG1hcCwgTmF0aXZlRGF0YUltcGwgbmF0aXZlRGF0YSkgewogICAgY29udmVydE5hdGl2ZUJlaGF2aW9yVHlwZSh0eXBlKSB7CiAgICAgIGlmICh0eXBlIGlzIERhcnRUeXBlKSB7CiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQXZvaWQgZnJlZSB2YXJpYWJsZXMgaW4gdHlwZXMuIElmIHRoZSB0eXBlCiAgICAgICAgLy8gcHVsbGVkIGZyb20gYSBnZW5lcmljIGZ1bmN0aW9uIHR5cGUgaXQgbWlnaHQgY29udGFpbiBhIGZ1bmN0aW9uCiAgICAgICAgLy8gdHlwZSB2YXJpYWJsZSB0aGF0IHNob3VsZCBwcm9iYWJseSBoYXZlIGJlZW4gcmVwbGFjZWQgYnkgaXRzIGJvdW5kLgogICAgICAgIHJldHVybiBtYXAudG9CYWNrZW5kVHlwZSh0eXBlLCBhbGxvd0ZyZWVWYXJpYWJsZXM6IHRydWUpOwogICAgICB9CiAgICAgIGFzc2VydCh0eXBlIGlzIFNwZWNpYWxUeXBlKTsKICAgICAgcmV0dXJuIHR5cGU7CiAgICB9CgogICAgTmF0aXZlQmVoYXZpb3IgY29udmVydE5hdGl2ZUJlaGF2aW9yKE5hdGl2ZUJlaGF2aW9yIGJlaGF2aW9yKSB7CiAgICAgIE5hdGl2ZUJlaGF2aW9yIG5ld0JlaGF2aW9yID0gbmV3IE5hdGl2ZUJlaGF2aW9yKCk7CgogICAgICBmb3IgKGR5bmFtaWMgdHlwZSBpbiBiZWhhdmlvci50eXBlc1JldHVybmVkKSB7CiAgICAgICAgbmV3QmVoYXZpb3IudHlwZXNSZXR1cm5lZC5hZGQoY29udmVydE5hdGl2ZUJlaGF2aW9yVHlwZSh0eXBlKSk7CiAgICAgIH0KICAgICAgZm9yIChkeW5hbWljIHR5cGUgaW4gYmVoYXZpb3IudHlwZXNJbnN0YW50aWF0ZWQpIHsKICAgICAgICBuZXdCZWhhdmlvci50eXBlc0luc3RhbnRpYXRlZC5hZGQoY29udmVydE5hdGl2ZUJlaGF2aW9yVHlwZSh0eXBlKSk7CiAgICAgIH0KCiAgICAgIG5ld0JlaGF2aW9yLmNvZGVUZW1wbGF0ZVRleHQgPSBiZWhhdmlvci5jb2RlVGVtcGxhdGVUZXh0OwogICAgICBuZXdCZWhhdmlvci5jb2RlVGVtcGxhdGUgPSBiZWhhdmlvci5jb2RlVGVtcGxhdGU7CiAgICAgIG5ld0JlaGF2aW9yLnRocm93QmVoYXZpb3IgPSBiZWhhdmlvci50aHJvd0JlaGF2aW9yOwogICAgICBuZXdCZWhhdmlvci5pc0FsbG9jYXRpb24gPSBiZWhhdmlvci5pc0FsbG9jYXRpb247CiAgICAgIG5ld0JlaGF2aW9yLnVzZUd2biA9IGJlaGF2aW9yLnVzZUd2bjsKICAgICAgcmV0dXJuIG5ld0JlaGF2aW9yOwogICAgfQoKICAgIE5hdGl2ZUJhc2ljRGF0YSBuYXRpdmVCYXNpY0RhdGEgPSBfY29udmVydE5hdGl2ZUJhc2ljRGF0YShtYXAsIG5hdGl2ZURhdGEpOwoKICAgIE1hcDxNZW1iZXJFbnRpdHksIFN0cmluZz4gbmF0aXZlTWVtYmVyTmFtZSA9CiAgICAgICAgbWFwLnRvQmFja2VuZE1lbWJlck1hcChuYXRpdmVEYXRhLm5hdGl2ZU1lbWJlck5hbWUsIGlkZW50aXR5KTsKICAgIE1hcDxGdW5jdGlvbkVudGl0eSwgTmF0aXZlQmVoYXZpb3I+IG5hdGl2ZU1ldGhvZEJlaGF2aW9yID0KICAgICAgICA8RnVuY3Rpb25FbnRpdHksIE5hdGl2ZUJlaGF2aW9yPnt9OwogICAgbmF0aXZlRGF0YS5uYXRpdmVNZXRob2RCZWhhdmlvcgogICAgICAgIC5mb3JFYWNoKChGdW5jdGlvbkVudGl0eSBtZXRob2QsIE5hdGl2ZUJlaGF2aW9yIGJlaGF2aW9yKSB7CiAgICAgIEZ1bmN0aW9uRW50aXR5IGJhY2tlbmRNZXRob2QgPSBtYXAudG9CYWNrZW5kTWVtYmVyKG1ldGhvZCk7CiAgICAgIGlmIChiYWNrZW5kTWV0aG9kICE9IG51bGwpIHsKICAgICAgICAvLyBJZiBbbWV0aG9kXSBpc24ndCB1c2VkIGl0IGRvZXNuJ3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgYmFja2VuZAogICAgICAgIC8vIG1ldGhvZC4KICAgICAgICBuYXRpdmVNZXRob2RCZWhhdmlvcltiYWNrZW5kTWV0aG9kXSA9IGNvbnZlcnROYXRpdmVCZWhhdmlvcihiZWhhdmlvcik7CiAgICAgIH0KICAgIH0pOwogICAgTWFwPE1lbWJlckVudGl0eSwgTmF0aXZlQmVoYXZpb3I+IG5hdGl2ZUZpZWxkTG9hZEJlaGF2aW9yID0KICAgICAgICBtYXAudG9CYWNrZW5kTWVtYmVyTWFwKAogICAgICAgICAgICBuYXRpdmVEYXRhLm5hdGl2ZUZpZWxkTG9hZEJlaGF2aW9yLCBjb252ZXJ0TmF0aXZlQmVoYXZpb3IpOwogICAgTWFwPE1lbWJlckVudGl0eSwgTmF0aXZlQmVoYXZpb3I+IG5hdGl2ZUZpZWxkU3RvcmVCZWhhdmlvciA9CiAgICAgICAgbWFwLnRvQmFja2VuZE1lbWJlck1hcCgKICAgICAgICAgICAgbmF0aXZlRGF0YS5uYXRpdmVGaWVsZFN0b3JlQmVoYXZpb3IsIGNvbnZlcnROYXRpdmVCZWhhdmlvcik7CiAgICByZXR1cm4gbmV3IE5hdGl2ZURhdGFJbXBsKAogICAgICAgIG5hdGl2ZUJhc2ljRGF0YSwKICAgICAgICBuYXRpdmVNZW1iZXJOYW1lLAogICAgICAgIG5hdGl2ZU1ldGhvZEJlaGF2aW9yLAogICAgICAgIG5hdGl2ZUZpZWxkTG9hZEJlaGF2aW9yLAogICAgICAgIG5hdGl2ZUZpZWxkU3RvcmVCZWhhdmlvcik7CiAgfQoKICBJbnRlcmNlcHRvckRhdGEgX2NvbnZlcnRJbnRlcmNlcHRvckRhdGEoSnNUb0Zyb250ZW5kTWFwIG1hcCwKICAgICAgTmF0aXZlRGF0YSBuYXRpdmVEYXRhLCBJbnRlcmNlcHRvckRhdGFJbXBsIGludGVyY2VwdG9yRGF0YSkgewogICAgTWFwPFN0cmluZywgU2V0PE1lbWJlckVudGl0eT4+IGludGVyY2VwdGVkTWVtYmVycyA9CiAgICAgICAgPFN0cmluZywgU2V0PE1lbWJlckVudGl0eT4+e307CiAgICBpbnRlcmNlcHRvckRhdGEuaW50ZXJjZXB0ZWRNZW1iZXJzCiAgICAgICAgLmZvckVhY2goKFN0cmluZyBuYW1lLCBTZXQ8TWVtYmVyRW50aXR5PiBtZW1iZXJzKSB7CiAgICAgIGludGVyY2VwdGVkTWVtYmVyc1tuYW1lXSA9IG1hcC50b0JhY2tlbmRNZW1iZXJTZXQobWVtYmVycyk7CiAgICB9KTsKICAgIHJldHVybiBuZXcgSW50ZXJjZXB0b3JEYXRhSW1wbCgKICAgICAgICBuYXRpdmVEYXRhLAogICAgICAgIF9jb21tb25FbGVtZW50cywKICAgICAgICBpbnRlcmNlcHRlZE1lbWJlcnMsCiAgICAgICAgbWFwLnRvQmFja2VuZENsYXNzU2V0KGludGVyY2VwdG9yRGF0YS5pbnRlcmNlcHRlZENsYXNzZXMpLAogICAgICAgIG1hcC50b0JhY2tlbmRDbGFzc1NldCgKICAgICAgICAgICAgaW50ZXJjZXB0b3JEYXRhLmNsYXNzZXNNaXhlZEludG9JbnRlcmNlcHRlZENsYXNzZXMpKTsKICB9CgogIFJ1bnRpbWVUeXBlc05lZWQgX2NvbnZlcnRSdW50aW1lVHlwZXNOZWVkKEpzVG9Gcm9udGVuZE1hcCBtYXAsCiAgICAgIEJhY2tlbmRVc2FnZSBiYWNrZW5kVXNhZ2UsIFJ1bnRpbWVUeXBlc05lZWRJbXBsIHJ0aU5lZWQpIHsKICAgIFNldDxDbGFzc0VudGl0eT4gY2xhc3Nlc05lZWRpbmdUeXBlQXJndW1lbnRzID0KICAgICAgICBtYXAudG9CYWNrZW5kQ2xhc3NTZXQocnRpTmVlZC5jbGFzc2VzTmVlZGluZ1R5cGVBcmd1bWVudHMpOwogICAgU2V0PEZ1bmN0aW9uRW50aXR5PiBtZXRob2RzTmVlZGluZ1R5cGVBcmd1bWVudHMgPQogICAgICAgIG1hcC50b0JhY2tlbmRGdW5jdGlvblNldChydGlOZWVkLm1ldGhvZHNOZWVkaW5nVHlwZUFyZ3VtZW50cyk7CiAgICBTZXQ8RnVuY3Rpb25FbnRpdHk+IG1ldGhvZHNOZWVkaW5nU2lnbmF0dXJlID0KICAgICAgICBtYXAudG9CYWNrZW5kRnVuY3Rpb25TZXQocnRpTmVlZC5tZXRob2RzTmVlZGluZ1NpZ25hdHVyZSk7CiAgICBTZXQ8U2VsZWN0b3I+IHNlbGVjdG9yc05lZWRpbmdUeXBlQXJndW1lbnRzID0KICAgICAgICBydGlOZWVkLnNlbGVjdG9yc05lZWRpbmdUeXBlQXJndW1lbnRzLm1hcCgoU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgICAgaWYgKHNlbGVjdG9yLm1lbWJlck5hbWUuaXNQcml2YXRlKSB7CiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RvcigKICAgICAgICAgICAgc2VsZWN0b3Iua2luZCwKICAgICAgICAgICAgbmV3IFByaXZhdGVOYW1lKHNlbGVjdG9yLm1lbWJlck5hbWUudGV4dCwKICAgICAgICAgICAgICAgIG1hcC50b0JhY2tlbmRMaWJyYXJ5KHNlbGVjdG9yLm1lbWJlck5hbWUubGlicmFyeSksCiAgICAgICAgICAgICAgICBpc1NldHRlcjogc2VsZWN0b3IubWVtYmVyTmFtZS5pc1NldHRlciksCiAgICAgICAgICAgIHNlbGVjdG9yLmNhbGxTdHJ1Y3R1cmUpOwogICAgICB9CiAgICAgIHJldHVybiBzZWxlY3RvcjsKICAgIH0pLnRvU2V0KCk7CiAgICByZXR1cm4gbmV3IFJ1bnRpbWVUeXBlc05lZWRJbXBsKAogICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQsCiAgICAgICAgY2xhc3Nlc05lZWRpbmdUeXBlQXJndW1lbnRzLAogICAgICAgIG1ldGhvZHNOZWVkaW5nU2lnbmF0dXJlLAogICAgICAgIG1ldGhvZHNOZWVkaW5nVHlwZUFyZ3VtZW50cywKICAgICAgICBudWxsLAogICAgICAgIG51bGwsCiAgICAgICAgc2VsZWN0b3JzTmVlZGluZ1R5cGVBcmd1bWVudHMsCiAgICAgICAgcnRpTmVlZC5pbnN0YW50aWF0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzKTsKICB9CgogIC8vLyBDb25zdHJ1Y3QgYSBjbG9zdXJlIGNsYXNzIGFuZCBzZXQgdXAgdGhlIG5lY2Vzc2FyeSBjbGFzcyBpbmZlcmVuY2UKICAvLy8gaGllcmFyY2h5LgogIEtlcm5lbENsb3N1cmVDbGFzc0luZm8gYnVpbGRDbG9zdXJlQ2xhc3MoCiAgICAgIE1lbWJlckVudGl0eSBtZW1iZXIsCiAgICAgIGlyLkZ1bmN0aW9uTm9kZSBvcmlnaW5hbENsb3N1cmVGdW5jdGlvbk5vZGUsCiAgICAgIEpMaWJyYXJ5IGVuY2xvc2luZ0xpYnJhcnksCiAgICAgIE1hcDxMb2NhbCwgSlJlY29yZEZpZWxkPiBib3hlZFZhcmlhYmxlcywKICAgICAgS2VybmVsU2NvcGVJbmZvIGluZm8sCiAgICAgIEtlcm5lbFRvTG9jYWxzTWFwIGxvY2Fsc01hcCwKICAgICAge2Jvb2wgY3JlYXRlU2lnbmF0dXJlTWV0aG9kfSkgewogICAgQ2xhc3NFbnRpdHkgc3VwZXJjbGFzcyA9IF9jb21tb25FbGVtZW50cy5jbG9zdXJlQ2xhc3M7CgogICAgS2VybmVsQ2xvc3VyZUNsYXNzSW5mbyBjbG9zdXJlQ2xhc3NJbmZvID0gX2VsZW1lbnRNYXAuY29uc3RydWN0Q2xvc3VyZUNsYXNzKAogICAgICAgIG1lbWJlciwKICAgICAgICBvcmlnaW5hbENsb3N1cmVGdW5jdGlvbk5vZGUsCiAgICAgICAgZW5jbG9zaW5nTGlicmFyeSwKICAgICAgICBib3hlZFZhcmlhYmxlcywKICAgICAgICBpbmZvLAogICAgICAgIGxvY2Fsc01hcCwKICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZShzdXBlcmNsYXNzLCBjb25zdCBbXSksCiAgICAgICAgY3JlYXRlU2lnbmF0dXJlTWV0aG9kOiBjcmVhdGVTaWduYXR1cmVNZXRob2QpOwoKICAgIC8vIFRlbGwgdGhlIGhpZXJhcmNoeSB0aGF0IHRoaXMgaXMgdGhlIHN1cGVyIGNsYXNzLiB0aGVuIHdlIGNhbiB1c2UKICAgIC8vIC5nZXRTdXBlcnR5cGVzKGNsYXNzKQogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIHBhcmVudE5vZGUgPSBfY2xhc3NIaWVyYXJjaHlOb2Rlc1tzdXBlcmNsYXNzXTsKICAgIENsYXNzSGllcmFyY2h5Tm9kZSBub2RlID0gbmV3IENsYXNzSGllcmFyY2h5Tm9kZShwYXJlbnROb2RlLAogICAgICAgIGNsb3N1cmVDbGFzc0luZm8uY2xvc3VyZUNsYXNzRW50aXR5LCBwYXJlbnROb2RlLmhpZXJhcmNoeURlcHRoICsgMSk7CiAgICBfY2xhc3NIaWVyYXJjaHlOb2Rlc1tjbG9zdXJlQ2xhc3NJbmZvLmNsb3N1cmVDbGFzc0VudGl0eV0gPSBub2RlOwogICAgX2NsYXNzU2V0c1tjbG9zdXJlQ2xhc3NJbmZvLmNsb3N1cmVDbGFzc0VudGl0eV0gPSBuZXcgQ2xhc3NTZXQobm9kZSk7CiAgICBub2RlLmlzRGlyZWN0bHlJbnN0YW50aWF0ZWQgPSB0cnVlOwoKICAgIHJldHVybiBjbG9zdXJlQ2xhc3NJbmZvOwogIH0KCiAgT3V0cHV0VW5pdERhdGEgX2NvbnZlcnRPdXRwdXRVbml0RGF0YShKc1RvRnJvbnRlbmRNYXBJbXBsIG1hcCwKICAgICAgT3V0cHV0VW5pdERhdGEgZGF0YSwgQ2xvc3VyZURhdGEgY2xvc3VyZURhdGFMb29rdXApIHsKICAgIC8vIENvbnZlcnQgZnJvbnQtZW5kIG1hcHMgY29udGFpbmluZyBLLWNsYXNzIGFuZCBLLWxvY2FsIGZ1bmN0aW9uIGtleXMgdG8gYQogICAgLy8gYmFja2VuZCBtYXAgdXNpbmcgSi1jbGFzc2VzIGFzIGtleXMuCiAgICBNYXA8Q2xhc3NFbnRpdHksIE91dHB1dFVuaXQ+IGNvbnZlcnRDbGFzc01hcCgKICAgICAgICBNYXA8Q2xhc3NFbnRpdHksIE91dHB1dFVuaXQ+IGNsYXNzTWFwLAogICAgICAgIE1hcDxMb2NhbCwgT3V0cHV0VW5pdD4gbG9jYWxGdW5jdGlvbk1hcCkgewogICAgICB2YXIgcmVzdWx0ID0gPENsYXNzRW50aXR5LCBPdXRwdXRVbml0Pnt9OwogICAgICBjbGFzc01hcC5mb3JFYWNoKChDbGFzc0VudGl0eSBlbnRpdHksIE91dHB1dFVuaXQgdW5pdCkgewogICAgICAgIENsYXNzRW50aXR5IGJhY2tlbmRFbnRpdHkgPSBtYXAudG9CYWNrZW5kQ2xhc3MoZW50aXR5KTsKICAgICAgICBpZiAoYmFja2VuZEVudGl0eSAhPSBudWxsKSB7CiAgICAgICAgICAvLyBJZiBbZW50aXR5XSBpc24ndCB1c2VkIGl0IGRvZXNuJ3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgYmFja2VuZAogICAgICAgICAgLy8gZW50aXR5LgogICAgICAgICAgcmVzdWx0W2JhY2tlbmRFbnRpdHldID0gdW5pdDsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBsb2NhbEZ1bmN0aW9uTWFwLmZvckVhY2goKExvY2FsIGVudGl0eSwgT3V0cHV0VW5pdCB1bml0KSB7CiAgICAgICAgLy8gRW5zdXJlIGNsb3N1cmUgY2xhc3NlcyBhcmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCB1bml0IGNvcnJlc3BvbmRpbmcKICAgICAgICAvLyB0byB0aGUgbG9jYWwgZnVuY3Rpb24uCiAgICAgICAgaWYgKGVudGl0eSBpcyBLTG9jYWxGdW5jdGlvbikgewogICAgICAgICAgdmFyIGNsb3N1cmVJbmZvID0gY2xvc3VyZURhdGFMb29rdXAuZ2V0Q2xvc3VyZUluZm8oZW50aXR5Lm5vZGUpOwogICAgICAgICAgcmVzdWx0W2Nsb3N1cmVJbmZvLmNsb3N1cmVDbGFzc0VudGl0eV0gPSB1bml0OwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgLy8gQ29udmVydCBmcm9udC1lbmQgbWFwcyBjb250YWluaW5nIEstbWVtYmVyIGFuZCBLLWxvY2FsIGZ1bmN0aW9uIGtleXMgdG8KICAgIC8vIGEgYmFja2VuZCBtYXAgdXNpbmcgSi1tZW1iZXJzIGFzIGtleXMuCiAgICBNYXA8TWVtYmVyRW50aXR5LCBPdXRwdXRVbml0PiBjb252ZXJ0TWVtYmVyTWFwKAogICAgICAgIE1hcDxNZW1iZXJFbnRpdHksIE91dHB1dFVuaXQ+IG1lbWJlck1hcCwKICAgICAgICBNYXA8TG9jYWwsIE91dHB1dFVuaXQ+IGxvY2FsRnVuY3Rpb25NYXApIHsKICAgICAgdmFyIHJlc3VsdCA9IDxNZW1iZXJFbnRpdHksIE91dHB1dFVuaXQ+e307CiAgICAgIG1lbWJlck1hcC5mb3JFYWNoKChNZW1iZXJFbnRpdHkgZW50aXR5LCBPdXRwdXRVbml0IHVuaXQpIHsKICAgICAgICBNZW1iZXJFbnRpdHkgYmFja2VuZEVudGl0eSA9IG1hcC50b0JhY2tlbmRNZW1iZXIoZW50aXR5KTsKICAgICAgICBpZiAoYmFja2VuZEVudGl0eSAhPSBudWxsKSB7CiAgICAgICAgICAvLyBJZiBbZW50aXR5XSBpc24ndCB1c2VkIGl0IGRvZXNuJ3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgYmFja2VuZAogICAgICAgICAgLy8gZW50aXR5LgogICAgICAgICAgcmVzdWx0W2JhY2tlbmRFbnRpdHldID0gdW5pdDsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBsb2NhbEZ1bmN0aW9uTWFwLmZvckVhY2goKExvY2FsIGVudGl0eSwgT3V0cHV0VW5pdCB1bml0KSB7CiAgICAgICAgLy8gRW5zdXJlIGNsb3N1cmUgY2FsbC1tZXRob2RzIGFyZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IHVuaXQKICAgICAgICAvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb2NhbCBmdW5jdGlvbi4KICAgICAgICBpZiAoZW50aXR5IGlzIEtMb2NhbEZ1bmN0aW9uKSB7CiAgICAgICAgICB2YXIgY2xvc3VyZUluZm8gPSBjbG9zdXJlRGF0YUxvb2t1cC5nZXRDbG9zdXJlSW5mbyhlbnRpdHkubm9kZSk7CiAgICAgICAgICByZXN1bHRbY2xvc3VyZUluZm8uY2FsbE1ldGhvZF0gPSB1bml0OwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgcmV0dXJuIG5ldyBPdXRwdXRVbml0RGF0YS5mcm9tKAogICAgICAgIGRhdGEsCiAgICAgICAgbWFwLnRvQmFja2VuZExpYnJhcnksCiAgICAgICAgY29udmVydENsYXNzTWFwLAogICAgICAgIGNvbnZlcnRNZW1iZXJNYXAsCiAgICAgICAgKG0pID0+IGNvbnZlcnRNYXA8Q29uc3RhbnRWYWx1ZSwgT3V0cHV0VW5pdD4oCiAgICAgICAgICAgIG0sIG1hcC50b0JhY2tlbmRDb25zdGFudCwgKHYpID0+IHYpKTsKICB9Cn0KCmNsYXNzIFRyaXZpYWxDbG9zdXJlUnRpTmVlZCBpbXBsZW1lbnRzIENsb3N1cmVSdGlOZWVkIHsKICBjb25zdCBUcml2aWFsQ2xvc3VyZVJ0aU5lZWQoKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBsb2NhbEZ1bmN0aW9uTmVlZHNTaWduYXR1cmUoaXIuTm9kZSBub2RlKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKENsYXNzRW50aXR5IGNscykgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBtZXRob2ROZWVkc1R5cGVBcmd1bWVudHMoRnVuY3Rpb25FbnRpdHkgbWV0aG9kKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGxvY2FsRnVuY3Rpb25OZWVkc1R5cGVBcmd1bWVudHMoaXIuTm9kZSBub2RlKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIHNlbGVjdG9yTmVlZHNUeXBlQXJndW1lbnRzKFNlbGVjdG9yIHNlbGVjdG9yKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIG1ldGhvZE5lZWRzU2lnbmF0dXJlKE1lbWJlckVudGl0eSBtZXRob2QpID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgaW5zdGFudGlhdGlvbk5lZWRzVHlwZUFyZ3VtZW50cygKICAgICAgICAgIERhcnRUeXBlIGZ1bmN0aW9uVHlwZSwgaW50IHR5cGVBcmd1bWVudENvdW50KSA9PgogICAgICB0cnVlOwp9CgpjbGFzcyBKc0Nsb3N1cmVSdGlOZWVkIGltcGxlbWVudHMgQ2xvc3VyZVJ0aU5lZWQgewogIGZpbmFsIFJ1bnRpbWVUeXBlc05lZWQgcnRpTmVlZDsKICBmaW5hbCBTZXQ8aXIuTm9kZT4gbG9jYWxGdW5jdGlvbnNOb2Rlc05lZWRpbmdUeXBlQXJndW1lbnRzOwogIGZpbmFsIFNldDxpci5Ob2RlPiBsb2NhbEZ1bmN0aW9uc05vZGVzTmVlZGluZ1NpZ25hdHVyZTsKCiAgSnNDbG9zdXJlUnRpTmVlZCh0aGlzLnJ0aU5lZWQsIHRoaXMubG9jYWxGdW5jdGlvbnNOb2Rlc05lZWRpbmdUeXBlQXJndW1lbnRzLAogICAgICB0aGlzLmxvY2FsRnVuY3Rpb25zTm9kZXNOZWVkaW5nU2lnbmF0dXJlKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBsb2NhbEZ1bmN0aW9uTmVlZHNTaWduYXR1cmUoaXIuTm9kZSBub2RlKSB7CiAgICBhc3NlcnQobm9kZSBpcyBpci5GdW5jdGlvbkRlY2xhcmF0aW9uIHx8IG5vZGUgaXMgaXIuRnVuY3Rpb25FeHByZXNzaW9uKTsKICAgIHJldHVybiBsb2NhbEZ1bmN0aW9uc05vZGVzTmVlZGluZ1NpZ25hdHVyZS5jb250YWlucyhub2RlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY2xhc3NOZWVkc1R5cGVBcmd1bWVudHMoQ2xhc3NFbnRpdHkgY2xzKSA9PgogICAgICBydGlOZWVkLmNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKGNscyk7CgogIEBvdmVycmlkZQogIGJvb2wgbWV0aG9kTmVlZHNUeXBlQXJndW1lbnRzKEZ1bmN0aW9uRW50aXR5IG1ldGhvZCkgPT4KICAgICAgcnRpTmVlZC5tZXRob2ROZWVkc1R5cGVBcmd1bWVudHMobWV0aG9kKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBsb2NhbEZ1bmN0aW9uTmVlZHNUeXBlQXJndW1lbnRzKGlyLk5vZGUgbm9kZSkgewogICAgYXNzZXJ0KG5vZGUgaXMgaXIuRnVuY3Rpb25EZWNsYXJhdGlvbiB8fCBub2RlIGlzIGlyLkZ1bmN0aW9uRXhwcmVzc2lvbik7CiAgICByZXR1cm4gbG9jYWxGdW5jdGlvbnNOb2Rlc05lZWRpbmdUeXBlQXJndW1lbnRzLmNvbnRhaW5zKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBzZWxlY3Rvck5lZWRzVHlwZUFyZ3VtZW50cyhTZWxlY3RvciBzZWxlY3RvcikgPT4KICAgICAgcnRpTmVlZC5zZWxlY3Rvck5lZWRzVHlwZUFyZ3VtZW50cyhzZWxlY3Rvcik7CgogIEBvdmVycmlkZQogIGJvb2wgbWV0aG9kTmVlZHNTaWduYXR1cmUoTWVtYmVyRW50aXR5IG1ldGhvZCkgPT4KICAgICAgcnRpTmVlZC5tZXRob2ROZWVkc1NpZ25hdHVyZShtZXRob2QpOwoKICBAb3ZlcnJpZGUKICBib29sIGluc3RhbnRpYXRpb25OZWVkc1R5cGVBcmd1bWVudHMoCiAgICAgICAgICBEYXJ0VHlwZSBmdW5jdGlvblR5cGUsIGludCB0eXBlQXJndW1lbnRDb3VudCkgPT4KICAgICAgcnRpTmVlZC5pbnN0YW50aWF0aW9uTmVlZHNUeXBlQXJndW1lbnRzKGZ1bmN0aW9uVHlwZSwgdHlwZUFyZ3VtZW50Q291bnQpOwp9CgovLy8gTWFwIGZyb20gJ2Zyb250ZW5kJyB0byAnYmFja2VuZCcgZWxlbWVudHMuCi8vLwovLy8gRnJvbnRlbmQgZWxlbWVudHMgYXJlIHdoYXQgd2UgcmVhZCBpbiwgdGhlc2UgdHlwaWNhbGx5IHJlcHJlc2VudHMgY29uY2VwdHMKLy8vIGluIERhcnQuIEJhY2tlbmQgZWxlbWVudHMgYXJlIHdoYXQgd2UgZ2VuZXJhdGUsIHRoZXNlIG1heSBpbmNsdWRlIGVsZW1lbnRzCi8vLyB0aGF0IGRvIG5vdCBjb3JyZXNwb25kIHRvIGEgRGFydCBjb25jZXB0LCBzdWNoIGFzIGNsb3N1cmUgY2xhc3Nlcy4KLy8vCi8vLyBRdWVyeWluZyBmb3IgdGhlIGZyb250ZW5kIGVsZW1lbnQgZm9yIGEgYmFja2VuZC1vbmx5IGVsZW1lbnQgdGhyb3dzIGFuCi8vLyBleGNlcHRpb24uCmFic3RyYWN0IGNsYXNzIEpzVG9Gcm9udGVuZE1hcCB7CiAgTGlicmFyeUVudGl0eSB0b0JhY2tlbmRMaWJyYXJ5KExpYnJhcnlFbnRpdHkgbGlicmFyeSk7CgogIENsYXNzRW50aXR5IHRvQmFja2VuZENsYXNzKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIHRoZSBiYWNrZW5kIG1lbWJlciBjb3JyZXNwb25kaW5nIHRvIFttZW1iZXJdLiBJZiBhIG1lbWJlciBpc24ndAogIC8vLyBsaXZlLCBpdCBkb2Vzbid0IGhhdmUgYSBjb3JyZXNwb25kaW5nIGJhY2tlbmQgbWVtYmVyIGFuZCBgbnVsbGAgaXMKICAvLy8gcmV0dXJuZWQgaW5zdGVhZC4KICBNZW1iZXJFbnRpdHkgdG9CYWNrZW5kTWVtYmVyKE1lbWJlckVudGl0eSBtZW1iZXIpOwoKICBEYXJ0VHlwZSB0b0JhY2tlbmRUeXBlKERhcnRUeXBlIHR5cGUsIHtib29sIGFsbG93RnJlZVZhcmlhYmxlczogZmFsc2V9KTsKCiAgQ29uc3RhbnRWYWx1ZSB0b0JhY2tlbmRDb25zdGFudChDb25zdGFudFZhbHVlIHZhbHVlLCB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSk7CgogIFNldDxMaWJyYXJ5RW50aXR5PiB0b0JhY2tlbmRMaWJyYXJ5U2V0KEl0ZXJhYmxlPExpYnJhcnlFbnRpdHk+IHNldCkgewogICAgcmV0dXJuIHNldC5tYXAodG9CYWNrZW5kTGlicmFyeSkudG9TZXQoKTsKICB9CgogIFNldDxDbGFzc0VudGl0eT4gdG9CYWNrZW5kQ2xhc3NTZXQoSXRlcmFibGU8Q2xhc3NFbnRpdHk+IHNldCkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogRmlsdGVyIHVudXNlZCBjbGFzc2VzLgogICAgcmV0dXJuIHNldC5tYXAodG9CYWNrZW5kQ2xhc3MpLnRvU2V0KCk7CiAgfQoKICBTZXQ8TWVtYmVyRW50aXR5PiB0b0JhY2tlbmRNZW1iZXJTZXQoSXRlcmFibGU8TWVtYmVyRW50aXR5PiBzZXQpIHsKICAgIHJldHVybiBzZXQubWFwKHRvQmFja2VuZE1lbWJlcikud2hlcmUoKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgICAgLy8gTWVtYmVycyB0aGF0IGFyZSBub3QgbGl2ZSBkb24ndCBoYXZlIGEgY29ycmVzcG9uZGluZyBiYWNrZW5kIG1lbWJlci4KICAgICAgcmV0dXJuIG1lbWJlciAhPSBudWxsOwogICAgfSkudG9TZXQoKTsKICB9CgogIFNldDxGaWVsZEVudGl0eT4gdG9CYWNrZW5kRmllbGRTZXQoSXRlcmFibGU8RmllbGRFbnRpdHk+IHNldCkgewogICAgU2V0PEZpZWxkRW50aXR5PiBuZXdTZXQgPSBuZXcgU2V0PEZpZWxkRW50aXR5PigpOwogICAgZm9yIChGaWVsZEVudGl0eSBlbGVtZW50IGluIHNldCkgewogICAgICBGaWVsZEVudGl0eSBiYWNrZW5kRmllbGQgPSB0b0JhY2tlbmRNZW1iZXIoZWxlbWVudCk7CiAgICAgIGlmIChiYWNrZW5kRmllbGQgIT0gbnVsbCkgewogICAgICAgIC8vIE1lbWJlcnMgdGhhdCBhcmUgbm90IGxpdmUgZG9uJ3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgYmFja2VuZCBtZW1iZXIuCiAgICAgICAgbmV3U2V0LmFkZChiYWNrZW5kRmllbGQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3U2V0OwogIH0KCiAgU2V0PEZ1bmN0aW9uRW50aXR5PiB0b0JhY2tlbmRGdW5jdGlvblNldChJdGVyYWJsZTxGdW5jdGlvbkVudGl0eT4gc2V0KSB7CiAgICBTZXQ8RnVuY3Rpb25FbnRpdHk+IG5ld1NldCA9IG5ldyBTZXQ8RnVuY3Rpb25FbnRpdHk+KCk7CiAgICBmb3IgKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQgaW4gc2V0KSB7CiAgICAgIEZ1bmN0aW9uRW50aXR5IGJhY2tlbmRGdW5jdGlvbiA9IHRvQmFja2VuZE1lbWJlcihlbGVtZW50KTsKICAgICAgaWYgKGJhY2tlbmRGdW5jdGlvbiAhPSBudWxsKSB7CiAgICAgICAgLy8gTWVtYmVycyB0aGF0IGFyZSBub3QgbGl2ZSBkb24ndCBoYXZlIGEgY29ycmVzcG9uZGluZyBiYWNrZW5kIG1lbWJlci4KICAgICAgICBuZXdTZXQuYWRkKGJhY2tlbmRGdW5jdGlvbik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXdTZXQ7CiAgfQoKICBNYXA8TGlicmFyeUVudGl0eSwgVj4gdG9CYWNrZW5kTGlicmFyeU1hcDxWPigKICAgICAgTWFwPExpYnJhcnlFbnRpdHksIFY+IG1hcCwgViBjb252ZXJ0KFYgdmFsdWUpKSB7CiAgICByZXR1cm4gY29udmVydE1hcChtYXAsIHRvQmFja2VuZExpYnJhcnksIGNvbnZlcnQpOwogIH0KCiAgTWFwPENsYXNzRW50aXR5LCBWPiB0b0JhY2tlbmRDbGFzc01hcDxWPigKICAgICAgTWFwPENsYXNzRW50aXR5LCBWPiBtYXAsIFYgY29udmVydChWIHZhbHVlKSkgewogICAgcmV0dXJuIGNvbnZlcnRNYXAobWFwLCB0b0JhY2tlbmRDbGFzcywgY29udmVydCk7CiAgfQoKICBNYXA8TWVtYmVyRW50aXR5LCBWPiB0b0JhY2tlbmRNZW1iZXJNYXA8Vj4oCiAgICAgIE1hcDxNZW1iZXJFbnRpdHksIFY+IG1hcCwgViBjb252ZXJ0KFYgdmFsdWUpKSB7CiAgICByZXR1cm4gY29udmVydE1hcChtYXAsIHRvQmFja2VuZE1lbWJlciwgY29udmVydCk7CiAgfQp9CgpFIGlkZW50aXR5PEU+KEUgZWxlbWVudCkgPT4gZWxlbWVudDsKCk1hcDxLLCBWPiBjb252ZXJ0TWFwPEssIFY+KAogICAgTWFwPEssIFY+IG1hcCwgSyBjb252ZXJ0S2V5KEsga2V5KSwgViBjb252ZXJ0VmFsdWUoViB2YWx1ZSkpIHsKICBNYXA8SywgVj4gbmV3TWFwID0gPEssIFY+e307CiAgbWFwLmZvckVhY2goKEsga2V5LCBWIHZhbHVlKSB7CiAgICBLIG5ld0tleSA9IGNvbnZlcnRLZXkoa2V5KTsKICAgIFYgbmV3VmFsdWUgPSBjb252ZXJ0VmFsdWUodmFsdWUpOwogICAgaWYgKG5ld0tleSAhPSBudWxsICYmIG5ld1ZhbHVlICE9IG51bGwpIHsKICAgICAgLy8gRW50aXRpZXMgdGhhdCBhcmUgbm90IHVzZWQgZG9uJ3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgYmFja2VuZCBlbnRpdHkuCiAgICAgIG5ld01hcFtuZXdLZXldID0gbmV3VmFsdWU7CiAgICB9CiAgfSk7CiAgcmV0dXJuIG5ld01hcDsKfQoKY2xhc3MgSnNUb0Zyb250ZW5kTWFwSW1wbCBleHRlbmRzIEpzVG9Gcm9udGVuZE1hcCB7CiAgZmluYWwgSnNLZXJuZWxUb0VsZW1lbnRNYXAgX2JhY2tlbmQ7CgogIEpzVG9Gcm9udGVuZE1hcEltcGwodGhpcy5fYmFja2VuZCk7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHRvQmFja2VuZFR5cGUoRGFydFR5cGUgdHlwZSwge2Jvb2wgYWxsb3dGcmVlVmFyaWFibGVzOiBmYWxzZX0pID0+CiAgICAgIHR5cGUgPT0gbnVsbAogICAgICAgICAgPyBudWxsCiAgICAgICAgICA6IG5ldyBfVHlwZUNvbnZlcnRlcihhbGxvd0ZyZWVWYXJpYWJsZXM6IGFsbG93RnJlZVZhcmlhYmxlcykKICAgICAgICAgICAgICAudmlzaXQodHlwZSwgdG9CYWNrZW5kRW50aXR5KTsKCiAgRW50aXR5IHRvQmFja2VuZEVudGl0eShFbnRpdHkgZW50aXR5KSB7CiAgICBpZiAoZW50aXR5IGlzIENsYXNzRW50aXR5KSByZXR1cm4gdG9CYWNrZW5kQ2xhc3MoZW50aXR5KTsKICAgIGlmIChlbnRpdHkgaXMgTWVtYmVyRW50aXR5KSByZXR1cm4gdG9CYWNrZW5kTWVtYmVyKGVudGl0eSk7CiAgICBpZiAoZW50aXR5IGlzIFR5cGVkZWZFbnRpdHkpIHJldHVybiB0b0JhY2tlbmRUeXBlZGVmKGVudGl0eSk7CiAgICBpZiAoZW50aXR5IGlzIFR5cGVWYXJpYWJsZUVudGl0eSkgewogICAgICByZXR1cm4gdG9CYWNrZW5kVHlwZVZhcmlhYmxlKGVudGl0eSk7CiAgICB9CiAgICBhc3NlcnQoZW50aXR5IGlzIExpYnJhcnlFbnRpdHksICd1bmV4cGVjdGVkIGVudGl0eSAke2VudGl0eS5ydW50aW1lVHlwZX0nKTsKICAgIHJldHVybiB0b0JhY2tlbmRMaWJyYXJ5KGVudGl0eSk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaWJyYXJ5RW50aXR5IHRvQmFja2VuZExpYnJhcnkoY292YXJpYW50IEluZGV4ZWRMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIHJldHVybiBfYmFja2VuZC5saWJyYXJpZXMuZ2V0RW50aXR5KGxpYnJhcnkubGlicmFyeUluZGV4KTsKICB9CgogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IHRvQmFja2VuZENsYXNzKGNvdmFyaWFudCBJbmRleGVkQ2xhc3MgY2xzKSB7CiAgICByZXR1cm4gX2JhY2tlbmQuY2xhc3Nlcy5nZXRFbnRpdHkoY2xzLmNsYXNzSW5kZXgpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyRW50aXR5IHRvQmFja2VuZE1lbWJlcihjb3ZhcmlhbnQgSW5kZXhlZE1lbWJlciBtZW1iZXIpIHsKICAgIHJldHVybiBfYmFja2VuZC5tZW1iZXJzLmdldEVudGl0eShtZW1iZXIubWVtYmVySW5kZXgpOwogIH0KCiAgVHlwZWRlZkVudGl0eSB0b0JhY2tlbmRUeXBlZGVmKGNvdmFyaWFudCBJbmRleGVkVHlwZWRlZiB0eXBlZGVmKSB7CiAgICByZXR1cm4gX2JhY2tlbmQudHlwZWRlZnMuZ2V0RW50aXR5KHR5cGVkZWYudHlwZWRlZkluZGV4KTsKICB9CgogIFR5cGVWYXJpYWJsZUVudGl0eSB0b0JhY2tlbmRUeXBlVmFyaWFibGUoVHlwZVZhcmlhYmxlRW50aXR5IHR5cGVWYXJpYWJsZSkgewogICAgaWYgKHR5cGVWYXJpYWJsZSBpcyBLTG9jYWxUeXBlVmFyaWFibGUpIHsKICAgICAgZmFpbGVkQXQoCiAgICAgICAgICB0eXBlVmFyaWFibGUsICJMb2NhbCBmdW5jdGlvbiB0eXBlIHZhcmlhYmxlcyBhcmUgbm90IHN1cHBvcnRlZC4iKTsKICAgIH0KICAgIEluZGV4ZWRUeXBlVmFyaWFibGUgaW5kZXhlZFR5cGVWYXJpYWJsZSA9IHR5cGVWYXJpYWJsZTsKICAgIHJldHVybiBfYmFja2VuZC50eXBlVmFyaWFibGVzCiAgICAgICAgLmdldEVudGl0eShpbmRleGVkVHlwZVZhcmlhYmxlLnR5cGVWYXJpYWJsZUluZGV4KTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgdG9CYWNrZW5kQ29uc3RhbnQoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwKICAgICAge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmIChjb25zdGFudCA9PSBudWxsKSB7CiAgICAgIGlmICghYWxsb3dOdWxsKSB7CiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ051bGwgbm90IGFsbG93ZWQgYXMgY29uc3RhbnQgdmFsdWUuJyk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gY29uc3RhbnQuYWNjZXB0KG5ldyBfQ29uc3RhbnRDb252ZXJ0ZXIodG9CYWNrZW5kRW50aXR5KSwgbnVsbCk7CiAgfQp9Cgp0eXBlZGVmIEVudGl0eSBfRW50aXR5Q29udmVydGVyKEVudGl0eSBjbHMpOwoKY2xhc3MgX1R5cGVDb252ZXJ0ZXIgaW1wbGVtZW50cyBEYXJ0VHlwZVZpc2l0b3I8RGFydFR5cGUsIF9FbnRpdHlDb252ZXJ0ZXI+IHsKICBmaW5hbCBib29sIGFsbG93RnJlZVZhcmlhYmxlczsKCiAgTWFwPEZ1bmN0aW9uVHlwZVZhcmlhYmxlLCBGdW5jdGlvblR5cGVWYXJpYWJsZT4gX2Z1bmN0aW9uVHlwZVZhcmlhYmxlcyA9CiAgICAgIDxGdW5jdGlvblR5cGVWYXJpYWJsZSwgRnVuY3Rpb25UeXBlVmFyaWFibGU+e307CgogIF9UeXBlQ29udmVydGVyKHt0aGlzLmFsbG93RnJlZVZhcmlhYmxlczogZmFsc2V9KTsKCiAgTGlzdDxEYXJ0VHlwZT4gY29udmVydFR5cGVzKAogICAgICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZXMsIF9FbnRpdHlDb252ZXJ0ZXIgY29udmVydGVyKSA9PgogICAgICB2aXNpdExpc3QodHlwZXMsIGNvbnZlcnRlcik7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0KERhcnRUeXBlIHR5cGUsIF9FbnRpdHlDb252ZXJ0ZXIgY29udmVydGVyKSB7CiAgICByZXR1cm4gdHlwZS5hY2NlcHQodGhpcywgY29udmVydGVyKTsKICB9CgogIExpc3Q8RGFydFR5cGU+IHZpc2l0TGlzdChMaXN0PERhcnRUeXBlPiB0eXBlcywgX0VudGl0eUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKICAgIExpc3Q8RGFydFR5cGU+IGxpc3QgPSA8RGFydFR5cGU+W107CiAgICBmb3IgKERhcnRUeXBlIHR5cGUgaW4gdHlwZXMpIHsKICAgICAgbGlzdC5hZGQodmlzaXQodHlwZSwgY29udmVydGVyKSk7CiAgICB9CiAgICByZXR1cm4gbGlzdDsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0RHluYW1pY1R5cGUoRHluYW1pY1R5cGUgdHlwZSwgX0VudGl0eUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgdHlwZSwgX0VudGl0eUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICBjb252ZXJ0ZXIodHlwZS5lbGVtZW50KSwgdmlzaXRMaXN0KHR5cGUudHlwZUFyZ3VtZW50cywgY29udmVydGVyKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIHR5cGUsIF9FbnRpdHlDb252ZXJ0ZXIgY29udmVydGVyKSB7CiAgICByZXR1cm4gbmV3IFR5cGVkZWZUeXBlKAogICAgICAgIGNvbnZlcnRlcih0eXBlLmVsZW1lbnQpLAogICAgICAgIHZpc2l0TGlzdCh0eXBlLnR5cGVBcmd1bWVudHMsIGNvbnZlcnRlciksCiAgICAgICAgdmlzaXQodHlwZS51bmFsaWFzZWQsIGNvbnZlcnRlcikpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRUeXBlVmFyaWFibGVUeXBlKAogICAgICBUeXBlVmFyaWFibGVUeXBlIHR5cGUsIF9FbnRpdHlDb252ZXJ0ZXIgY29udmVydGVyKSB7CiAgICByZXR1cm4gbmV3IFR5cGVWYXJpYWJsZVR5cGUoY29udmVydGVyKHR5cGUuZWxlbWVudCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIHR5cGUsIF9FbnRpdHlDb252ZXJ0ZXIgY29udmVydGVyKSB7CiAgICBMaXN0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPiB0eXBlVmFyaWFibGVzID0gPEZ1bmN0aW9uVHlwZVZhcmlhYmxlPltdOwogICAgZm9yIChGdW5jdGlvblR5cGVWYXJpYWJsZSB0eXBlVmFyaWFibGUgaW4gdHlwZS50eXBlVmFyaWFibGVzKSB7CiAgICAgIHR5cGVWYXJpYWJsZXMuYWRkKF9mdW5jdGlvblR5cGVWYXJpYWJsZXNbdHlwZVZhcmlhYmxlXSA9CiAgICAgICAgICBuZXcgRnVuY3Rpb25UeXBlVmFyaWFibGUodHlwZVZhcmlhYmxlLmluZGV4KSk7CiAgICB9CiAgICBmb3IgKEZ1bmN0aW9uVHlwZVZhcmlhYmxlIHR5cGVWYXJpYWJsZSBpbiB0eXBlLnR5cGVWYXJpYWJsZXMpIHsKICAgICAgX2Z1bmN0aW9uVHlwZVZhcmlhYmxlc1t0eXBlVmFyaWFibGVdLmJvdW5kID0gdHlwZVZhcmlhYmxlLmJvdW5kICE9IG51bGwKICAgICAgICAgID8gdmlzaXQodHlwZVZhcmlhYmxlLmJvdW5kLCBjb252ZXJ0ZXIpCiAgICAgICAgICA6IG51bGw7CiAgICB9CiAgICBEYXJ0VHlwZSByZXR1cm5UeXBlID0gdmlzaXQodHlwZS5yZXR1cm5UeXBlLCBjb252ZXJ0ZXIpOwogICAgTGlzdDxEYXJ0VHlwZT4gcGFyYW1ldGVyVHlwZXMgPSB2aXNpdExpc3QodHlwZS5wYXJhbWV0ZXJUeXBlcywgY29udmVydGVyKTsKICAgIExpc3Q8RGFydFR5cGU+IG9wdGlvbmFsUGFyYW1ldGVyVHlwZXMgPQogICAgICAgIHZpc2l0TGlzdCh0eXBlLm9wdGlvbmFsUGFyYW1ldGVyVHlwZXMsIGNvbnZlcnRlcik7CiAgICBMaXN0PERhcnRUeXBlPiBuYW1lZFBhcmFtZXRlclR5cGVzID0KICAgICAgICB2aXNpdExpc3QodHlwZS5uYW1lZFBhcmFtZXRlclR5cGVzLCBjb252ZXJ0ZXIpOwogICAgZm9yIChGdW5jdGlvblR5cGVWYXJpYWJsZSB0eXBlVmFyaWFibGUgaW4gdHlwZS50eXBlVmFyaWFibGVzKSB7CiAgICAgIF9mdW5jdGlvblR5cGVWYXJpYWJsZXMucmVtb3ZlKHR5cGVWYXJpYWJsZSk7CiAgICB9CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uVHlwZShyZXR1cm5UeXBlLCBwYXJhbWV0ZXJUeXBlcywgb3B0aW9uYWxQYXJhbWV0ZXJUeXBlcywKICAgICAgICB0eXBlLm5hbWVkUGFyYW1ldGVycywgbmFtZWRQYXJhbWV0ZXJUeXBlcywgdHlwZVZhcmlhYmxlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdEZ1bmN0aW9uVHlwZVZhcmlhYmxlKAogICAgICBGdW5jdGlvblR5cGVWYXJpYWJsZSB0eXBlLCBfRW50aXR5Q29udmVydGVyIGNvbnZlcnRlcikgewogICAgRGFydFR5cGUgcmVzdWx0ID0gX2Z1bmN0aW9uVHlwZVZhcmlhYmxlc1t0eXBlXTsKICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiBhbGxvd0ZyZWVWYXJpYWJsZXMpIHsKICAgICAgcmV0dXJuIHR5cGU7CiAgICB9CiAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwsCiAgICAgICAgIkZ1bmN0aW9uIHR5cGUgdmFyaWFibGUgJHR5cGUgbm90IGZvdW5kIGluICRfZnVuY3Rpb25UeXBlVmFyaWFibGVzIik7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSB0eXBlLCBfRW50aXR5Q29udmVydGVyIGNvbnZlcnRlcikgewogICAgcmV0dXJuIGNvbnN0IFZvaWRUeXBlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdEZ1dHVyZU9yVHlwZShGdXR1cmVPclR5cGUgdHlwZSwgX0VudGl0eUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKICAgIHJldHVybiBuZXcgRnV0dXJlT3JUeXBlKHZpc2l0KHR5cGUudHlwZUFyZ3VtZW50LCBjb252ZXJ0ZXIpKTsKICB9Cn0KCmNsYXNzIF9Db25zdGFudENvbnZlcnRlciBpbXBsZW1lbnRzIENvbnN0YW50VmFsdWVWaXNpdG9yPENvbnN0YW50VmFsdWUsIE51bGw+IHsKICBmaW5hbCBFbnRpdHkgRnVuY3Rpb24oRW50aXR5KSB0b0JhY2tlbmRFbnRpdHk7CiAgZmluYWwgX1R5cGVDb252ZXJ0ZXIgdHlwZUNvbnZlcnRlcjsKCiAgX0NvbnN0YW50Q29udmVydGVyKHRoaXMudG9CYWNrZW5kRW50aXR5KQogICAgICA6IHR5cGVDb252ZXJ0ZXIgPSBuZXcgX1R5cGVDb252ZXJ0ZXIoKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSB2aXNpdE51bGwoTnVsbENvbnN0YW50VmFsdWUgY29uc3RhbnQsIF8pID0+IGNvbnN0YW50OwogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgdmlzaXRJbnQoSW50Q29uc3RhbnRWYWx1ZSBjb25zdGFudCwgXykgPT4gY29uc3RhbnQ7CiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSB2aXNpdERvdWJsZShEb3VibGVDb25zdGFudFZhbHVlIGNvbnN0YW50LCBfKSA9PiBjb25zdGFudDsKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0Qm9vbChCb29sQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgXykgPT4gY29uc3RhbnQ7CiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSB2aXNpdFN0cmluZyhTdHJpbmdDb25zdGFudFZhbHVlIGNvbnN0YW50LCBfKSA9PiBjb25zdGFudDsKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0U3ludGhldGljKFN5bnRoZXRpY0NvbnN0YW50VmFsdWUgY29uc3RhbnQsIF8pID0+IGNvbnN0YW50OwogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgdmlzaXROb25Db25zdGFudChOb25Db25zdGFudFZhbHVlIGNvbnN0YW50LCBfKSA9PiBjb25zdGFudDsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSB2aXNpdEZ1bmN0aW9uKEZ1bmN0aW9uQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgXykgewogICAgcmV0dXJuIG5ldyBGdW5jdGlvbkNvbnN0YW50VmFsdWUodG9CYWNrZW5kRW50aXR5KGNvbnN0YW50LmVsZW1lbnQpLAogICAgICAgIHR5cGVDb252ZXJ0ZXIudmlzaXQoY29uc3RhbnQudHlwZSwgdG9CYWNrZW5kRW50aXR5KSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0TGlzdChMaXN0Q29uc3RhbnRWYWx1ZSBjb25zdGFudCwgXykgewogICAgRGFydFR5cGUgdHlwZSA9IHR5cGVDb252ZXJ0ZXIudmlzaXQoY29uc3RhbnQudHlwZSwgdG9CYWNrZW5kRW50aXR5KTsKICAgIExpc3Q8Q29uc3RhbnRWYWx1ZT4gZW50cmllcyA9IF9oYW5kbGVWYWx1ZXMoY29uc3RhbnQuZW50cmllcyk7CiAgICBpZiAoaWRlbnRpY2FsKGVudHJpZXMsIGNvbnN0YW50LmVudHJpZXMpICYmIHR5cGUgPT0gY29uc3RhbnQudHlwZSkgewogICAgICByZXR1cm4gY29uc3RhbnQ7CiAgICB9CiAgICByZXR1cm4gbmV3IExpc3RDb25zdGFudFZhbHVlKHR5cGUsIGVudHJpZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSB2aXNpdFNldCgKICAgICAgY292YXJpYW50IGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0U2V0Q29uc3RhbnQgY29uc3RhbnQsIF8pIHsKICAgIERhcnRUeXBlIHR5cGUgPSB0eXBlQ29udmVydGVyLnZpc2l0KGNvbnN0YW50LnR5cGUsIHRvQmFja2VuZEVudGl0eSk7CiAgICBNYXBDb25zdGFudFZhbHVlIGVudHJpZXMgPSBjb25zdGFudC5lbnRyaWVzLmFjY2VwdCh0aGlzLCBudWxsKTsKICAgIGlmIChpZGVudGljYWwoZW50cmllcywgY29uc3RhbnQuZW50cmllcykgJiYgdHlwZSA9PSBjb25zdGFudC50eXBlKSB7CiAgICAgIHJldHVybiBjb25zdGFudDsKICAgIH0KICAgIHJldHVybiBuZXcgY29uc3RhbnRfc3lzdGVtLkphdmFTY3JpcHRTZXRDb25zdGFudCh0eXBlLCBlbnRyaWVzKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgdmlzaXRNYXAoCiAgICAgIGNvdmFyaWFudCBjb25zdGFudF9zeXN0ZW0uSmF2YVNjcmlwdE1hcENvbnN0YW50IGNvbnN0YW50LCBfKSB7CiAgICBEYXJ0VHlwZSB0eXBlID0gdHlwZUNvbnZlcnRlci52aXNpdChjb25zdGFudC50eXBlLCB0b0JhY2tlbmRFbnRpdHkpOwogICAgTGlzdENvbnN0YW50VmFsdWUga2V5cyA9IGNvbnN0YW50LmtleUxpc3QuYWNjZXB0KHRoaXMsIG51bGwpOwogICAgTGlzdDxDb25zdGFudFZhbHVlPiB2YWx1ZXMgPSBfaGFuZGxlVmFsdWVzKGNvbnN0YW50LnZhbHVlcyk7CiAgICBDb25zdGFudFZhbHVlIHByb3RvVmFsdWUgPSBjb25zdGFudC5wcm90b1ZhbHVlPy5hY2NlcHQodGhpcywgbnVsbCk7CiAgICBpZiAoaWRlbnRpY2FsKGtleXMsIGNvbnN0YW50LmtleXMpICYmCiAgICAgICAgaWRlbnRpY2FsKHZhbHVlcywgY29uc3RhbnQudmFsdWVzKSAmJgogICAgICAgIHR5cGUgPT0gY29uc3RhbnQudHlwZSAmJgogICAgICAgIHByb3RvVmFsdWUgPT0gY29uc3RhbnQucHJvdG9WYWx1ZSkgewogICAgICByZXR1cm4gY29uc3RhbnQ7CiAgICB9CiAgICByZXR1cm4gbmV3IGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0TWFwQ29uc3RhbnQoCiAgICAgICAgdHlwZSwga2V5cywgdmFsdWVzLCBwcm90b1ZhbHVlLCBjb25zdGFudC5vbmx5U3RyaW5nS2V5cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0Q29uc3RydWN0ZWQoQ29uc3RydWN0ZWRDb25zdGFudFZhbHVlIGNvbnN0YW50LCBfKSB7CiAgICBEYXJ0VHlwZSB0eXBlID0gdHlwZUNvbnZlcnRlci52aXNpdChjb25zdGFudC50eXBlLCB0b0JhY2tlbmRFbnRpdHkpOwogICAgTWFwPEZpZWxkRW50aXR5LCBDb25zdGFudFZhbHVlPiBmaWVsZHMgPSB7fTsKICAgIGNvbnN0YW50LmZpZWxkcy5mb3JFYWNoKChmLCB2KSB7CiAgICAgIEZpZWxkRW50aXR5IGJhY2tlbmRGaWVsZCA9IHRvQmFja2VuZEVudGl0eShmKTsKICAgICAgYXNzZXJ0KGJhY2tlbmRGaWVsZCAhPSBudWxsLCAiTm8gYmFja2VuZCBmaWVsZCBmb3IgJGYuIik7CiAgICAgIGZpZWxkc1tiYWNrZW5kRmllbGRdID0gdi5hY2NlcHQodGhpcywgbnVsbCk7CiAgICB9KTsKICAgIHJldHVybiBuZXcgQ29uc3RydWN0ZWRDb25zdGFudFZhbHVlKHR5cGUsIGZpZWxkcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0VHlwZShUeXBlQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgXykgewogICAgRGFydFR5cGUgdHlwZSA9IHR5cGVDb252ZXJ0ZXIudmlzaXQoY29uc3RhbnQudHlwZSwgdG9CYWNrZW5kRW50aXR5KTsKICAgIERhcnRUeXBlIHJlcHJlc2VudGVkVHlwZSA9CiAgICAgICAgdHlwZUNvbnZlcnRlci52aXNpdChjb25zdGFudC5yZXByZXNlbnRlZFR5cGUsIHRvQmFja2VuZEVudGl0eSk7CiAgICBpZiAodHlwZSA9PSBjb25zdGFudC50eXBlICYmIHJlcHJlc2VudGVkVHlwZSA9PSBjb25zdGFudC5yZXByZXNlbnRlZFR5cGUpIHsKICAgICAgcmV0dXJuIGNvbnN0YW50OwogICAgfQogICAgcmV0dXJuIG5ldyBUeXBlQ29uc3RhbnRWYWx1ZShyZXByZXNlbnRlZFR5cGUsIHR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSB2aXNpdEludGVyY2VwdG9yKEludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgXykgewogICAgLy8gSW50ZXJjZXB0b3IgY29uc3RhbnRzIGFyZSBvbmx5IGNyZWF0ZWQgaW4gdGhlIFNTQSBncmFwaCBidWlsZGVyLgogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIlVuZXhwZWN0ZWQgdmlzaXRJbnRlcmNlcHRvciAke2NvbnN0YW50LnRvU3RydWN0dXJlZFRleHQoKX0iKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgdmlzaXREZWZlcnJlZEdsb2JhbChEZWZlcnJlZEdsb2JhbENvbnN0YW50VmFsdWUgY29uc3RhbnQsIF8pIHsKICAgIC8vIERlZmVycmVkIGdsb2JhbCBjb25zdGFudHMgYXJlIG9ubHkgY3JlYXRlZCBpbiB0aGUgU1NBIGdyYXBoIGJ1aWxkZXIuCiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiVW5leHBlY3RlZCBEZWZlcnJlZEdsb2JhbENvbnN0YW50VmFsdWUgJHtjb25zdGFudC50b1N0cnVjdHVyZWRUZXh0KCl9Iik7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0SW5zdGFudGlhdGlvbihJbnN0YW50aWF0aW9uQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgXykgewogICAgQ29uc3RhbnRWYWx1ZSBmdW5jdGlvbiA9IGNvbnN0YW50LmZ1bmN0aW9uLmFjY2VwdCh0aGlzLCBudWxsKTsKICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPQogICAgICAgIHR5cGVDb252ZXJ0ZXIuY29udmVydFR5cGVzKGNvbnN0YW50LnR5cGVBcmd1bWVudHMsIHRvQmFja2VuZEVudGl0eSk7CiAgICByZXR1cm4gbmV3IEluc3RhbnRpYXRpb25Db25zdGFudFZhbHVlKHR5cGVBcmd1bWVudHMsIGZ1bmN0aW9uKTsKICB9CgogIExpc3Q8Q29uc3RhbnRWYWx1ZT4gX2hhbmRsZVZhbHVlcyhMaXN0PENvbnN0YW50VmFsdWU+IHZhbHVlcykgewogICAgTGlzdDxDb25zdGFudFZhbHVlPiByZXN1bHQ7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgdmFsdWUgPSB2YWx1ZXNbaV07CiAgICAgIHZhciBuZXdWYWx1ZSA9IHZhbHVlLmFjY2VwdCh0aGlzLCBudWxsKTsKICAgICAgaWYgKG5ld1ZhbHVlICE9IHZhbHVlICYmIHJlc3VsdCA9PSBudWxsKSB7CiAgICAgICAgcmVzdWx0ID0gdmFsdWVzLnN1Ymxpc3QoMCwgaSkudG9MaXN0KCk7CiAgICAgIH0KICAgICAgcmVzdWx0Py5hZGQobmV3VmFsdWUpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdCA/PyB2YWx1ZXM7CiAgfQp9CoO0AE5OPAEoARoZIj8jICQjISExHSkrLC4pNSsjIhorJSMkGBcYGyAYFgEdKkQkSyowIjYBQE0BUEQBJCA6KEABID1NLiZPAUIBRTRMNjElCE4nJ0MKTQpIRBYGAUkqMjouTzZETi4KHAoGAR9HLUQgASxBATNNAUYfTgEwRQEpPgEpQgEeATsdKy8/EDspGA1ATSg9K1A2NwhRKEErUDY7CAEmRj8QOyAYNzQYAU1CJD8IUUYoPwhMKzQBGgYBTUJFQk4BJzkBSj9RASRDAR4VFBkWERsaHBtJURs3IRoTJiBLIBkaFRkEASU8NUsvRS5EKT8qSyEfOjsQASFAOjIuLD0qOzkqPzM+BAErQjopJzk5CDRPMEsxSjFMJB0cHBojGwQBITgmHktLT0IIIxMGAUQ5ATVICDlMCAFAODo4LBoGAVABMUc/LCREQiNKE08ICEAgSEEgSR8ZGh4hIwQBP0Q4Jyc8QggkFBkcQx9CBAFBQTNENkcyQzJIKx0bNkM5JQgXECUdJSElDg4nNQQBSREsGzMhLxwjJjsBURAlGhgOEzE3AUgdRkFNRkooAR0EAUE8UCwyLzMwP0AlTBUoCgpBUCIoSzkKChUGAU8uNDEzMUFCJUwVKAoKQUcwKEsxCgoVBgEkDh4ZGjYyBAIBOCEBDDoBDDkBDEABDD4BDD4BDDoBDCg7DAIBMyI+OgFPMQEMM00/BAEMMywBDDowAQw3TUMEAQw4NAEMNCwBDCg7UAIBLwRPT0cESw8hOQEvAU5JGDUBSwFRAUguBAFCMywEAUVCTh0QBAFCNic7IlAiCAYTBAFLPCpBJVAlCAYTBAEwNzcEASw1NQQBLjY2BAIBJQEcQx8hICYuTyEGBhECATQnASYBDE0TEUctASo+QEIoLAZQJQQBDEU/BAEMOzcEAQxBOwQBRT4EAU4uEE0GPCI7BAEMOiEcGEsIEwZLBAIBLQFOIQFLNgE0AR8/IwEMPikEAU8oIygGEQQBDEwgBAEMUB5MBAEMTBwhMisEAQwiOzoEAQxOSUQ/OQZETjESBj1PLDspOEQzBlBDBAEMJj80MBMGG04TBAEMRh0EAQxOQgQCAVAxJgErLgEMRgxEDEoMRgxKDFAMTAEMQ0g+BAEMO0lDSRcGMQQBDBpFSURJFwZFBAEMGkVJQkFIKi4hLRcGNkIEAQxJSTElNUAzCDcEAQw7SR9IUBcGOQQBDElIIEcEAQxPTCBSBAEMTUMjTUQEAUIgLh0vMTAIHQYdBAIBM3BhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX21vZGVsL2pzX3dvcmxkX2J1aWxkZXIuZGFydDJzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19tb2RlbC9sb2NhbHMuZGFydMAATyovLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmpzX21vZGVsLmxvY2FsczsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwoKaW1wb3J0ICcuLi9jbG9zdXJlLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9pbmRleGVkLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2p1bXBzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0JzsKCmltcG9ydCAnZWxlbWVudF9tYXAuZGFydCc7CmltcG9ydCAnZWxlbWVudHMuZGFydCcgc2hvdyBKR2VuZXJhdG9yQm9keTsKCmNsYXNzIEdsb2JhbExvY2Fsc01hcCB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtHbG9iYWxMb2NhbHNNYXBdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnZ2xvYmFsLWxvY2Fscy1tYXAnOwoKICBmaW5hbCBNYXA8TWVtYmVyRW50aXR5LCBLZXJuZWxUb0xvY2Fsc01hcD4gX2xvY2Fsc01hcHM7CgogIEdsb2JhbExvY2Fsc01hcCgpIDogX2xvY2Fsc01hcHMgPSB7fTsKCiAgR2xvYmFsTG9jYWxzTWFwLmludGVybmFsKHRoaXMuX2xvY2Fsc01hcHMpOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW0dsb2JhbExvY2Fsc01hcF0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBHbG9iYWxMb2NhbHNNYXAucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIE1hcDxNZW1iZXJFbnRpdHksIEtlcm5lbFRvTG9jYWxzTWFwPiBfbG9jYWxzTWFwcyA9IHt9OwogICAgaW50IG1hcENvdW50ID0gc291cmNlLnJlYWRJbnQoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwQ291bnQ7IGkrKykgewogICAgICBLZXJuZWxUb0xvY2Fsc01hcCBsb2NhbHNNYXAgPQogICAgICAgICAgbmV3IEtlcm5lbFRvTG9jYWxzTWFwSW1wbC5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgTGlzdDxNZW1iZXJFbnRpdHk+IG1lbWJlcnMgPSBzb3VyY2UucmVhZE1lbWJlcnMoKTsKICAgICAgZm9yIChNZW1iZXJFbnRpdHkgbWVtYmVyIGluIG1lbWJlcnMpIHsKICAgICAgICBfbG9jYWxzTWFwc1ttZW1iZXJdID0gbG9jYWxzTWFwOwogICAgICB9CiAgICB9CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEdsb2JhbExvY2Fsc01hcC5pbnRlcm5hbChfbG9jYWxzTWFwcyk7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtHbG9iYWxMb2NhbHNNYXBdIHRvIFtzaW5rXS4KICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICAvLyBbS2VybmVsVG9Mb2NhbHNNYXBdcyBhcmUgc2hhcmVkIGJldHdlZW4gbWVtYmVycyBhbmQgdGhlaXIgbmVzdGVkCiAgICAvLyBjbG9zdXJlcywgc28gd2UgcmV2ZXJzZSBbX2xvY2Fsc01hcHNdIHRvIGVuc3VyZSB0aGF0IFtLZXJuZWxUb0xvY2Fsc01hcF1zCiAgICAvLyBhcmUgc2hhcmVkIHVwb24gZGVzZXJpYWxpemF0aW9uLiBUaGUgc2hhcmluZyBpcyBuZWVkZWQgZm9yIGNvcnJlY3RuZXNzCiAgICAvLyBzaW5jZSBjYXB0dXJlZCB2YXJpYWJsZXMgd2lsbCBvdGhlcndpc2UgaGF2ZSBkaXN0aW5jdCBsb2NhbHMgZm9yIHRoZWlyCiAgICAvLyBub24tY2FwdHVyZWQgYW5kIGNhcHR1cmVkIHVzZXMuCiAgICBNYXA8S2VybmVsVG9Mb2NhbHNNYXAsIExpc3Q8TWVtYmVyRW50aXR5Pj4gcmV2ZXJzZU1hcCA9IHt9OwogICAgX2xvY2Fsc01hcHMuZm9yRWFjaCgoTWVtYmVyRW50aXR5IG1lbWJlciwgS2VybmVsVG9Mb2NhbHNNYXAgbG9jYWxzTWFwKSB7CiAgICAgIHJldmVyc2VNYXAucHV0SWZBYnNlbnQobG9jYWxzTWFwLCAoKSA9PiBbXSkuYWRkKG1lbWJlcik7CiAgICB9KTsKICAgIHNpbmsud3JpdGVJbnQocmV2ZXJzZU1hcC5sZW5ndGgpOwogICAgcmV2ZXJzZU1hcAogICAgICAgIC5mb3JFYWNoKChLZXJuZWxUb0xvY2Fsc01hcCBsb2NhbHNNYXAsIExpc3Q8TWVtYmVyRW50aXR5PiBtZW1iZXJzKSB7CiAgICAgIGxvY2Fsc01hcC53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICAgIHNpbmsud3JpdGVNZW1iZXJzKG1lbWJlcnMpOwogICAgfSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIFtLZXJuZWxUb0xvY2Fsc01hcF0gZm9yIFttZW1iZXJdLgogIEtlcm5lbFRvTG9jYWxzTWFwIGdldExvY2Fsc01hcChNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAvLyBJZiBlbGVtZW50IGlzIGEgQ29uc3RydWN0b3JCb2R5RW50aXR5LCBpdHMgbG9jYWxzTWFwIGlzIHRoZSBzYW1lIGFzIGZvcgogICAgLy8gQ29uc3RydWN0b3JFbnRpdHksIGJlY2F1c2UgYm90aCBvZiB0aGVzZSBlbnRpdGllcyBjYW1lIGZyb20gdGhlIHNhbWUKICAgIC8vIGNvbnN0cnVjdG9yIG5vZGUuIFRoZSBlbnRpdGllcyBhcmUgdHdvIHNlcGFyYXRlIHBhcnRzIGJlY2F1c2UgSlMgZG9lcyBub3QKICAgIC8vIGhhdmUgdGhlIGNvbmNlcHQgb2YgYW4gaW5pdGlhbGl6ZXIgbGlzdCwgc28gdGhlIGNvbnN0cnVjdG9yIChpbml0aWFsaXplcgogICAgLy8gbGlzdCkgYW5kIHRoZSBjb25zdHJ1Y3RvciBib2R5IGFyZSBpbXBsZW1lbnRlZCBhcyB0d28gc2VwYXJhdGUKICAgIC8vIGNvbnN0cnVjdG9yIHN0ZXBzLgogICAgTWVtYmVyRW50aXR5IGVudGl0eSA9IG1lbWJlcjsKICAgIGlmIChlbnRpdHkgaXMgQ29uc3RydWN0b3JCb2R5RW50aXR5KSBtZW1iZXIgPSBlbnRpdHkuY29uc3RydWN0b3I7CiAgICByZXR1cm4gX2xvY2Fsc01hcHMucHV0SWZBYnNlbnQoCiAgICAgICAgbWVtYmVyLCAoKSA9PiBuZXcgS2VybmVsVG9Mb2NhbHNNYXBJbXBsKG1lbWJlcikpOwogIH0KCiAgLy8vIEFzc29jaWF0ZXMgW2xvY2Fsc01hcF0gd2l0aCBbbWVtYmVyXS4KICAvLy8KICAvLy8gVXNlIHRoaXMgZm9yIHNoYXJpbmcgbWFwcyBiZXR3ZWVuIG1lbWJlcnMgdGhhdCBzaGFyZSBJUiBub2Rlcy4KICB2b2lkIHNldExvY2Fsc01hcChNZW1iZXJFbnRpdHkgbWVtYmVyLCBLZXJuZWxUb0xvY2Fsc01hcCBsb2NhbHNNYXApIHsKICAgIGFzc2VydChtZW1iZXIgIT0gbnVsbCwgIk5vIG1lbWJlciBwcm92aWRlZC4iKTsKICAgIGFzc2VydCghX2xvY2Fsc01hcHMuY29udGFpbnNLZXkobWVtYmVyKSwKICAgICAgICAiTG9jYWxzIG1hcCBhbHJlYWR5IGNyZWF0ZWQgZm9yICRtZW1iZXIuIik7CiAgICBfbG9jYWxzTWFwc1ttZW1iZXJdID0gbG9jYWxzTWFwOwogIH0KfQoKY2xhc3MgS2VybmVsVG9Mb2NhbHNNYXBJbXBsIGltcGxlbWVudHMgS2VybmVsVG9Mb2NhbHNNYXAgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbS2VybmVsVG9Mb2NhbHNNYXBJbXBsXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2xvY2Fscy1tYXAnOwoKICBNZW1iZXJFbnRpdHkgX2N1cnJlbnRNZW1iZXI7CiAgZmluYWwgRW50aXR5RGF0YU1hcDxKTG9jYWwsIExvY2FsRGF0YT4gX2xvY2FscyA9CiAgICAgIG5ldyBFbnRpdHlEYXRhTWFwPEpMb2NhbCwgTG9jYWxEYXRhPigpOwogIE1hcDxpci5WYXJpYWJsZURlY2xhcmF0aW9uLCBKTG9jYWw+IF92YXJpYWJsZU1hcCA9CiAgICAgIDxpci5WYXJpYWJsZURlY2xhcmF0aW9uLCBKTG9jYWw+e307CiAgTWFwPGlyLlRyZWVOb2RlLCBKSnVtcFRhcmdldD4gX2p1bXBUYXJnZXRNYXA7CiAgSXRlcmFibGU8aXIuQnJlYWtTdGF0ZW1lbnQ+IF9icmVha3NBc0NvbnRpbnVlOwoKICBLZXJuZWxUb0xvY2Fsc01hcEltcGwodGhpcy5fY3VycmVudE1lbWJlcik7CgogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbS2VybmVsVG9Mb2NhbHNNYXBJbXBsXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBLZXJuZWxUb0xvY2Fsc01hcEltcGwucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIF9jdXJyZW50TWVtYmVyID0gc291cmNlLnJlYWRNZW1iZXIoKTsKICAgIGludCBsb2NhbHNDb3VudCA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvY2Fsc0NvdW50OyBpKyspIHsKICAgICAgaW50IGluZGV4ID0gc291cmNlLnJlYWRJbnQoKTsKICAgICAgU3RyaW5nIG5hbWUgPSBzb3VyY2UucmVhZFN0cmluZ09yTnVsbCgpOwogICAgICBib29sIGlzUmVndWxhclBhcmFtZXRlciA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgICBpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUgPSBzb3VyY2UucmVhZFRyZWVOb2RlKCk7CiAgICAgIEpMb2NhbCBsb2NhbCA9IG5ldyBKTG9jYWwobmFtZSwgY3VycmVudE1lbWJlciwKICAgICAgICAgIGlzUmVndWxhclBhcmFtZXRlcjogaXNSZWd1bGFyUGFyYW1ldGVyKTsKICAgICAgTG9jYWxEYXRhIGRhdGEgPSBuZXcgTG9jYWxEYXRhKG5vZGUpOwogICAgICBfbG9jYWxzLnJlZ2lzdGVyQnlJbmRleChpbmRleCwgbG9jYWwsIGRhdGEpOwogICAgICBfdmFyaWFibGVNYXBbbm9kZV0gPSBsb2NhbDsKICAgIH0KICAgIGludCBqdW1wQ291bnQgPSBzb3VyY2UucmVhZEludCgpOwogICAgaWYgKGp1bXBDb3VudCA+IDApIHsKICAgICAgX2p1bXBUYXJnZXRNYXAgPSB7fTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqdW1wQ291bnQ7IGkrKykgewogICAgICAgIEpKdW1wVGFyZ2V0IHRhcmdldCA9IG5ldyBKSnVtcFRhcmdldC5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgICBMaXN0PGlyLlRyZWVOb2RlPiBub2RlcyA9IHNvdXJjZS5yZWFkVHJlZU5vZGVzKCk7CiAgICAgICAgZm9yIChpci5UcmVlTm9kZSBub2RlIGluIG5vZGVzKSB7CiAgICAgICAgICBfanVtcFRhcmdldE1hcFtub2RlXSA9IHRhcmdldDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIF9icmVha3NBc0NvbnRpbnVlID0gc291cmNlLnJlYWRUcmVlTm9kZXMoKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0tlcm5lbFRvTG9jYWxzTWFwSW1wbF0gdG8gW3NpbmtdLgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVNZW1iZXIoY3VycmVudE1lbWJlcik7CiAgICBzaW5rLndyaXRlSW50KF9sb2NhbHMuc2l6ZSk7CiAgICBfbG9jYWxzLmZvckVhY2goKEpMb2NhbCBsb2NhbCwgTG9jYWxEYXRhIGRhdGEpIHsKICAgICAgYXNzZXJ0KGxvY2FsLm1lbWJlckNvbnRleHQgPT0gY3VycmVudE1lbWJlcik7CiAgICAgIHNpbmsud3JpdGVJbnQobG9jYWwubG9jYWxJbmRleCk7CiAgICAgIHNpbmsud3JpdGVTdHJpbmdPck51bGwobG9jYWwubmFtZSk7CiAgICAgIHNpbmsud3JpdGVCb29sKGxvY2FsLmlzUmVndWxhclBhcmFtZXRlcik7CiAgICAgIHNpbmsud3JpdGVUcmVlTm9kZShkYXRhLm5vZGUpOwogICAgfSk7CiAgICBpZiAoX2p1bXBUYXJnZXRNYXAgIT0gbnVsbCkgewogICAgICAvLyBbSkp1bXBUYXJnZXRdcyBhcmUgc2hhcmVkIGJldHdlZW4gbm9kZXMsIHNvIHdlIHJldmVyc2UKICAgICAgLy8gW19qdW1wVGFyZ2V0TWFwXSB0byBlbnN1cmUgdGhhdCBbSkp1bXBUYXJnZXRdcyBhcmUgc2hhcmVkIHVwb24KICAgICAgLy8gZGVzZXJpYWxpemF0aW9uLiBUaGlzIHNoYXJpbmcgaXMgbmVlZGVkIGZvciBjb3JyZWN0bmVzcyBzaW5jZSBmb3IKICAgICAgLy8gaW5zdGFuY2UgYSBsYWJlbCBzdGF0ZW1lbnQgY29udGFpbmluZyBhIGZvciBsb29wIGJvdGggY29uc3RpdHV0ZXMgdGhlCiAgICAgIC8vIHNhbWUganVtcCB0YXJnZXQgYW5kIHRoZSBTU0EgZ3JhcGggYnVpbGRlciBkZXBlbmRlbnRzIG9uIHRoaXMgcHJvcGVydHkuCiAgICAgIE1hcDxKSnVtcFRhcmdldCwgTGlzdDxpci5UcmVlTm9kZT4+IHJldmVyc2VkTWFwID0ge307CiAgICAgIF9qdW1wVGFyZ2V0TWFwLmZvckVhY2goKGlyLlRyZWVOb2RlIG5vZGUsIEpKdW1wVGFyZ2V0IHRhcmdldCkgewogICAgICAgIHJldmVyc2VkTWFwLnB1dElmQWJzZW50KHRhcmdldCwgKCkgPT4gW10pLmFkZChub2RlKTsKICAgICAgfSk7CiAgICAgIHNpbmsud3JpdGVJbnQocmV2ZXJzZWRNYXAubGVuZ3RoKTsKICAgICAgcmV2ZXJzZWRNYXAuZm9yRWFjaCgoSkp1bXBUYXJnZXQgdGFyZ2V0LCBMaXN0PGlyLlRyZWVOb2RlPiBub2RlcykgewogICAgICAgIHRhcmdldC53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICAgICAgc2luay53cml0ZVRyZWVOb2Rlcyhub2Rlcyk7CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgc2luay53cml0ZUludCgwKTsKICAgIH0KICAgIHNpbmsud3JpdGVUcmVlTm9kZXMoX2JyZWFrc0FzQ29udGludWUsIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ29tcHV0ZSB0aGlzIGVhZ2VybHkgZnJvbSB0aGUgcm9vdCBvZiB0aGUgbWVtYmVyLgogIHZvaWQgX2Vuc3VyZUp1bXBNYXAoaXIuVHJlZU5vZGUgbm9kZSkgewogICAgaWYgKF9qdW1wVGFyZ2V0TWFwID09IG51bGwpIHsKICAgICAgSnVtcFZpc2l0b3IgdmlzaXRvciA9IG5ldyBKdW1wVmlzaXRvcihjdXJyZW50TWVtYmVyKTsKCiAgICAgIC8vIEZpbmQgdGhlIHJvb3Qgbm9kZSBmb3IgdGhlIGN1cnJlbnQgbWVtYmVyLgogICAgICB3aGlsZSAobm9kZSBpcyEgaXIuTWVtYmVyKSB7CiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50OwogICAgICB9CgogICAgICBub2RlLmFjY2VwdCh2aXNpdG9yKTsKICAgICAgX2p1bXBUYXJnZXRNYXAgPSB2aXNpdG9yLmp1bXBUYXJnZXRNYXA7CiAgICAgIF9icmVha3NBc0NvbnRpbnVlID0gdmlzaXRvci5icmVha3NBc0NvbnRpbnVlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyRW50aXR5IGdldCBjdXJyZW50TWVtYmVyID0+IF9jdXJyZW50TWVtYmVyOwoKICBMb2NhbCBnZXRMb2NhbEJ5SW5kZXgoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2xvY2Fscy5nZXRFbnRpdHkoaW5kZXgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSnVtcFRhcmdldCBnZXRKdW1wVGFyZ2V0Rm9yQnJlYWsoaXIuQnJlYWtTdGF0ZW1lbnQgbm9kZSkgewogICAgX2Vuc3VyZUp1bXBNYXAobm9kZS50YXJnZXQpOwogICAgSnVtcFRhcmdldCB0YXJnZXQgPSBfanVtcFRhcmdldE1hcFtub2RlXTsKICAgIGFzc2VydCh0YXJnZXQgIT0gbnVsbCwgZmFpbGVkQXQoY3VycmVudE1lbWJlciwgJ05vIHRhcmdldCBmb3IgJG5vZGUuJykpOwogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2VuZXJhdGVDb250aW51ZUZvckJyZWFrKGlyLkJyZWFrU3RhdGVtZW50IG5vZGUpIHsKICAgIHJldHVybiBfYnJlYWtzQXNDb250aW51ZS5jb250YWlucyhub2RlKTsKICB9CgogIEBvdmVycmlkZQogIEp1bXBUYXJnZXQgZ2V0SnVtcFRhcmdldEZvckNvbnRpbnVlU3dpdGNoKGlyLkNvbnRpbnVlU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIF9lbnN1cmVKdW1wTWFwKG5vZGUudGFyZ2V0KTsKICAgIEp1bXBUYXJnZXQgdGFyZ2V0ID0gX2p1bXBUYXJnZXRNYXBbbm9kZV07CiAgICBhc3NlcnQodGFyZ2V0ICE9IG51bGwsIGZhaWxlZEF0KGN1cnJlbnRNZW1iZXIsICdObyB0YXJnZXQgZm9yICRub2RlLicpKTsKICAgIHJldHVybiB0YXJnZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBKdW1wVGFyZ2V0IGdldEp1bXBUYXJnZXRGb3JTd2l0Y2hDYXNlKGlyLlN3aXRjaENhc2Ugbm9kZSkgewogICAgX2Vuc3VyZUp1bXBNYXAobm9kZSk7CiAgICByZXR1cm4gX2p1bXBUYXJnZXRNYXBbbm9kZV07CiAgfQoKICBAb3ZlcnJpZGUKICBKdW1wVGFyZ2V0IGdldEp1bXBUYXJnZXRGb3JEbyhpci5Eb1N0YXRlbWVudCBub2RlKSB7CiAgICBfZW5zdXJlSnVtcE1hcChub2RlKTsKICAgIHJldHVybiBfanVtcFRhcmdldE1hcFtub2RlXTsKICB9CgogIEBvdmVycmlkZQogIEp1bXBUYXJnZXQgZ2V0SnVtcFRhcmdldEZvckxhYmVsKGlyLkxhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgewogICAgX2Vuc3VyZUp1bXBNYXAobm9kZSk7CiAgICByZXR1cm4gX2p1bXBUYXJnZXRNYXBbbm9kZV07CiAgfQoKICBAb3ZlcnJpZGUKICBKdW1wVGFyZ2V0IGdldEp1bXBUYXJnZXRGb3JTd2l0Y2goaXIuU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIF9lbnN1cmVKdW1wTWFwKG5vZGUpOwogICAgcmV0dXJuIF9qdW1wVGFyZ2V0TWFwW25vZGVdOwogIH0KCiAgQG92ZXJyaWRlCiAgSnVtcFRhcmdldCBnZXRKdW1wVGFyZ2V0Rm9yRm9yKGlyLkZvclN0YXRlbWVudCBub2RlKSB7CiAgICBfZW5zdXJlSnVtcE1hcChub2RlKTsKICAgIHJldHVybiBfanVtcFRhcmdldE1hcFtub2RlXTsKICB9CgogIEBvdmVycmlkZQogIEp1bXBUYXJnZXQgZ2V0SnVtcFRhcmdldEZvckZvckluKGlyLkZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIF9lbnN1cmVKdW1wTWFwKG5vZGUpOwogICAgcmV0dXJuIF9qdW1wVGFyZ2V0TWFwW25vZGVdOwogIH0KCiAgQG92ZXJyaWRlCiAgSnVtcFRhcmdldCBnZXRKdW1wVGFyZ2V0Rm9yV2hpbGUoaXIuV2hpbGVTdGF0ZW1lbnQgbm9kZSkgewogICAgX2Vuc3VyZUp1bXBNYXAobm9kZSk7CiAgICByZXR1cm4gX2p1bXBUYXJnZXRNYXBbbm9kZV07CiAgfQoKICBAb3ZlcnJpZGUKICBMb2NhbCBnZXRMb2NhbFZhcmlhYmxlKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgcmV0dXJuIF92YXJpYWJsZU1hcC5wdXRJZkFic2VudChub2RlLCAoKSB7CiAgICAgIEpMb2NhbCBsb2NhbCA9IG5ldyBKTG9jYWwobm9kZS5uYW1lLCBjdXJyZW50TWVtYmVyLAogICAgICAgICAgaXNSZWd1bGFyUGFyYW1ldGVyOiBub2RlLnBhcmVudCBpcyBpci5GdW5jdGlvbk5vZGUpOwogICAgICBfbG9jYWxzLnJlZ2lzdGVyPEpMb2NhbCwgTG9jYWxEYXRhPihsb2NhbCwgbmV3IExvY2FsRGF0YShub2RlKSk7CiAgICAgIHJldHVybiBsb2NhbDsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgTG9jYWwgZ2V0TG9jYWxUeXBlVmFyaWFibGUoCiAgICAgIGlyLlR5cGVQYXJhbWV0ZXJUeXBlIG5vZGUsIEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApIHsKICAgIC8vIFRPRE8oZWZvcnR1bmEsIGpvaG5uaXdpbnRoZXIpOiBXZSdyZSBub3QgcmVnaXN0ZXJpbmcgdGhlIHR5cGUgdmFyaWFibGVzCiAgICAvLyBsaWtlIHdlIGFyZSBmb3IgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4gSXMgdGhhdCBva2F5IG9yIGRvIHdlIG5lZWQgdG8KICAgIC8vIG1ha2UgVHlwZVZhcmlhYmxlTG9jYWwgYSBKTG9jYWw/CiAgICByZXR1cm4gbmV3IFR5cGVWYXJpYWJsZUxvY2FsKGVsZW1lbnRNYXAuZ2V0VHlwZVZhcmlhYmxlVHlwZShub2RlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5GdW5jdGlvbk5vZGUgZ2V0RnVuY3Rpb25Ob2RlRm9yUGFyYW1ldGVyKGNvdmFyaWFudCBKTG9jYWwgcGFyYW1ldGVyKSB7CiAgICByZXR1cm4gX2xvY2Fscy5nZXREYXRhKHBhcmFtZXRlcikuZnVuY3Rpb25Ob2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0TG9jYWxUeXBlKEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsIGNvdmFyaWFudCBKTG9jYWwgbG9jYWwpIHsKICAgIHJldHVybiBfbG9jYWxzLmdldERhdGEobG9jYWwpLmdldERhcnRUeXBlKGVsZW1lbnRNYXApOwogIH0KfQoKY2xhc3MgSnVtcFZpc2l0b3IgZXh0ZW5kcyBpci5WaXNpdG9yIHsKICBpbnQganVtcEluZGV4ID0gMDsKICBpbnQgbGFiZWxJbmRleCA9IDA7CiAgZmluYWwgTWVtYmVyRW50aXR5IG1lbWJlcjsKICBmaW5hbCBNYXA8aXIuVHJlZU5vZGUsIEpKdW1wVGFyZ2V0PiBqdW1wVGFyZ2V0TWFwID0KICAgICAgPGlyLlRyZWVOb2RlLCBKSnVtcFRhcmdldD57fTsKICBmaW5hbCBTZXQ8aXIuQnJlYWtTdGF0ZW1lbnQ+IGJyZWFrc0FzQ29udGludWUgPSBuZXcgU2V0PGlyLkJyZWFrU3RhdGVtZW50PigpOwoKICBKdW1wVmlzaXRvcih0aGlzLm1lbWJlcik7CgogIEpKdW1wVGFyZ2V0IF9nZXRKdW1wVGFyZ2V0KGlyLlRyZWVOb2RlIG5vZGUpIHsKICAgIHJldHVybiBqdW1wVGFyZ2V0TWFwLnB1dElmQWJzZW50KG5vZGUsICgpIHsKICAgICAgcmV0dXJuIG5ldyBKSnVtcFRhcmdldChtZW1iZXIsIGp1bXBJbmRleCsrLAogICAgICAgICAgaXNTd2l0Y2g6IG5vZGUgaXMgaXIuU3dpdGNoU3RhdGVtZW50LAogICAgICAgICAgaXNTd2l0Y2hDYXNlOiBub2RlIGlzIGlyLlN3aXRjaENhc2UpOwogICAgfSk7CiAgfQoKICBKTGFiZWxEZWZpbml0aW9uIF9nZXRPckNyZWF0ZUxhYmVsKEpKdW1wVGFyZ2V0IHRhcmdldCkgewogICAgaWYgKHRhcmdldC5sYWJlbHMuaXNFbXB0eSkgewogICAgICByZXR1cm4gdGFyZ2V0LmFkZExhYmVsKCdsYWJlbCR7bGFiZWxJbmRleCsrfScpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHRhcmdldC5sYWJlbHMuc2luZ2xlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgZGVmYXVsdE5vZGUoaXIuTm9kZSBub2RlKSA9PiBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CgogIHN0YXRpYyBib29sIGNhbkJlQnJlYWtUYXJnZXQoaXIuVHJlZU5vZGUgbm9kZSkgewogICAgcmV0dXJuIG5vZGUgaXMgaXIuRm9yU3RhdGVtZW50IHx8CiAgICAgICAgbm9kZSBpcyBpci5Gb3JJblN0YXRlbWVudCB8fAogICAgICAgIG5vZGUgaXMgaXIuV2hpbGVTdGF0ZW1lbnQgfHwKICAgICAgICBub2RlIGlzIGlyLkRvU3RhdGVtZW50IHx8CiAgICAgICAgbm9kZSBpcyBpci5Td2l0Y2hTdGF0ZW1lbnQ7CiAgfQoKICBzdGF0aWMgYm9vbCBjYW5CZUNvbnRpbnVlVGFyZ2V0KGlyLlRyZWVOb2RlIG5vZGUpIHsKICAgIHJldHVybiBub2RlIGlzIGlyLkZvclN0YXRlbWVudCB8fAogICAgICAgIG5vZGUgaXMgaXIuRm9ySW5TdGF0ZW1lbnQgfHwKICAgICAgICBub2RlIGlzIGlyLldoaWxlU3RhdGVtZW50IHx8CiAgICAgICAgbm9kZSBpcyBpci5Eb1N0YXRlbWVudDsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0QnJlYWtTdGF0ZW1lbnQoaXIuQnJlYWtTdGF0ZW1lbnQgbm9kZSkgewogICAgSkp1bXBUYXJnZXQgdGFyZ2V0OwogICAgaXIuVHJlZU5vZGUgYm9keSA9IG5vZGUudGFyZ2V0LmJvZHk7CiAgICBpci5UcmVlTm9kZSBwYXJlbnQgPSBub2RlLnRhcmdldC5wYXJlbnQ7CgogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ29vcmRpbmF0ZSB3aXRoIENGRS10ZWFtIHRvIGF2b2lkIHN1Y2ggYXJiaXRyYXJ5CiAgICAvLyByZXZlcnNlIGVuZ2luZWVyaW5nIG1pc21hdGNoZXM6CiAgICBpZiAocGFyZW50IGlzIGlyLkJsb2NrICYmIHBhcmVudC5zdGF0ZW1lbnRzLmxhc3QgPT0gbm9kZS50YXJnZXQpIHsKICAgICAgLy8gSW4gc3Ryb25nIG1vZGUgZm9yIGNvZGUgbGlrZSB0aGlzOgogICAgICAvLwogICAgICAvLyAgICAgZm9yIChpbnQgaSBpbiBsaXN0KSB7CiAgICAgIC8vICAgICAgIGNvbnRpbnVlOwogICAgICAvLyAgICAgfQogICAgICAvLwogICAgICAvLyBhbiBpbXBsaWNpdCBjYXN0IG1heSBiZSBpbnNlcnRlZCBiZWZvcmUgdGhlIGxhYmVsIHN0YXRlbWVudCwgcmVzdWx0aW5nCiAgICAgIC8vIGluIGNvZGUgbGlrZSB0aGlzOgogICAgICAvLwogICAgICAvLyAgICAgZm9yICh2YXIgaSBpbiBsaXN0KSB7CiAgICAgIC8vICAgICAgIHZhciAjMSA9IGkgYXMgaW50OwogICAgICAvLyAgICAgICBsMTogewogICAgICAvLyAgICAgICAgICBicmVhayBsMToKICAgICAgLy8gICAgICAgfQogICAgICAvLyAgICAgfQogICAgICAvLwogICAgICAvLyBmb3Igd2hpY2ggd2Ugc2hvdWxkIHN0aWxsIHVzZSB0aGUgZm9yIGxvb3AgYXMgYSBjb250aW51ZSB0YXJnZXQuCiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgICB9CiAgICBpZiAoY2FuQmVCcmVha1RhcmdldChib2R5KSkgewogICAgICAvLyBXZSBoYXZlIGNvZGUgbGlrZQogICAgICAvLwogICAgICAvLyAgICAgbDE6IGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewogICAgICAvLyAgICAgICAgYnJlYWsgbDE6CiAgICAgIC8vICAgICB9CiAgICAgIC8vCiAgICAgIC8vIGFuZCBjYW4gdGhlcmVmb3JlIHVzZSB0aGUgZm9yIGxvb3AgYXMgdGhlIGJyZWFrIHRhcmdldC4KICAgICAgdGFyZ2V0ID0gX2dldEp1bXBUYXJnZXQoYm9keSk7CiAgICAgIHRhcmdldC5pc0JyZWFrVGFyZ2V0ID0gdHJ1ZTsKICAgICAgaXIuVHJlZU5vZGUgc2VhcmNoID0gbm9kZTsKICAgICAgYm9vbCBuZWVkc0xhYmVsID0gZmFsc2U7CiAgICAgIHdoaWxlIChzZWFyY2ggIT0gbm9kZS50YXJnZXQpIHsKICAgICAgICBpZiAoY2FuQmVCcmVha1RhcmdldChzZWFyY2gpKSB7CiAgICAgICAgICBuZWVkc0xhYmVsID0gc2VhcmNoICE9IGJvZHk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgc2VhcmNoID0gc2VhcmNoLnBhcmVudDsKICAgICAgfQogICAgICBpZiAobmVlZHNMYWJlbCkgewogICAgICAgIEpMYWJlbERlZmluaXRpb24gbGFiZWwgPSBfZ2V0T3JDcmVhdGVMYWJlbCh0YXJnZXQpOwogICAgICAgIGxhYmVsLmlzQnJlYWtUYXJnZXQgPSB0cnVlOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGNhbkJlQ29udGludWVUYXJnZXQocGFyZW50KSkgewogICAgICAvLyBXZSBoYXZlIGNvZGUgbGlrZQogICAgICAvLwogICAgICAvLyAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSBsMTogewogICAgICAvLyAgICAgICAgYnJlYWsgbDE6CiAgICAgIC8vICAgICB9CiAgICAgIC8vCiAgICAgIC8vIGFuZCBjYW4gdGhlcmVmb3JlIHVzZSB0aGUgZm9yIGxvb3AgYXMgYSBjb250aW51ZSB0YXJnZXQuCiAgICAgIHRhcmdldCA9IF9nZXRKdW1wVGFyZ2V0KHBhcmVudCk7CiAgICAgIHRhcmdldC5pc0NvbnRpbnVlVGFyZ2V0ID0gdHJ1ZTsKICAgICAgYnJlYWtzQXNDb250aW51ZS5hZGQobm9kZSk7CiAgICAgIGlyLlRyZWVOb2RlIHNlYXJjaCA9IG5vZGU7CiAgICAgIGJvb2wgbmVlZHNMYWJlbCA9IGZhbHNlOwogICAgICB3aGlsZSAoc2VhcmNoICE9IG5vZGUudGFyZ2V0KSB7CiAgICAgICAgaWYgKGNhbkJlQ29udGludWVUYXJnZXQoc2VhcmNoKSkgewogICAgICAgICAgbmVlZHNMYWJlbCA9IHNlYXJjaCAhPSBib2R5OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHNlYXJjaCA9IHNlYXJjaC5wYXJlbnQ7CiAgICAgIH0KICAgICAgaWYgKG5lZWRzTGFiZWwpIHsKICAgICAgICBKTGFiZWxEZWZpbml0aW9uIGxhYmVsID0gX2dldE9yQ3JlYXRlTGFiZWwodGFyZ2V0KTsKICAgICAgICBsYWJlbC5pc0NvbnRpbnVlVGFyZ2V0ID0gdHJ1ZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gV2UgaGF2ZSBjb2RlIGxpa2UKICAgICAgLy8KICAgICAgLy8gICAgIGxhYmVsOiBpZiAoYykgewogICAgICAvLyAgICAgICAgIGlmIChjIDwgMTApIGJyZWFrIGxhYmVsOwogICAgICAvLyAgICAgfQogICAgICAvLwogICAgICAvLyBhbmQgbGFiZWwgaXMgdGhlcmVmb3JlIGFsd2F5cyBuZWVkZWQuCiAgICAgIHRhcmdldCA9IF9nZXRKdW1wVGFyZ2V0KG5vZGUudGFyZ2V0KTsKICAgICAgdGFyZ2V0LmlzQnJlYWtUYXJnZXQgPSB0cnVlOwogICAgICBKTGFiZWxEZWZpbml0aW9uIGxhYmVsID0gX2dldE9yQ3JlYXRlTGFiZWwodGFyZ2V0KTsKICAgICAgbGFiZWwuaXNCcmVha1RhcmdldCA9IHRydWU7CiAgICB9CiAgICBqdW1wVGFyZ2V0TWFwW25vZGVdID0gdGFyZ2V0OwogICAgc3VwZXIudmlzaXRCcmVha1N0YXRlbWVudChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q29udGludWVTd2l0Y2hTdGF0ZW1lbnQoaXIuQ29udGludWVTd2l0Y2hTdGF0ZW1lbnQgbm9kZSkgewogICAgSkp1bXBUYXJnZXQgdGFyZ2V0ID0gX2dldEp1bXBUYXJnZXQobm9kZS50YXJnZXQpOwogICAgdGFyZ2V0LmlzQ29udGludWVUYXJnZXQgPSB0cnVlOwogICAganVtcFRhcmdldE1hcFtub2RlXSA9IHRhcmdldDsKICAgIEpMYWJlbERlZmluaXRpb24gbGFiZWwgPSBfZ2V0T3JDcmVhdGVMYWJlbCh0YXJnZXQpOwogICAgbGFiZWwuaXNDb250aW51ZVRhcmdldCA9IHRydWU7CiAgICBzdXBlci52aXNpdENvbnRpbnVlU3dpdGNoU3RhdGVtZW50KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRTd2l0Y2hTdGF0ZW1lbnQoaXIuU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIG5vZGUuZXhwcmVzc2lvbi5hY2NlcHQodGhpcyk7CiAgICBpZiAobm9kZS5jYXNlcy5pc05vdEVtcHR5KSB7CiAgICAgIC8vIEVuc3VyZSB0aGF0IFtub2RlXSBoYXMgYSBjb3JyZXNwb25kaW5nIHRhcmdldC4gV2UgZ2VuZXJhdGUgYSBicmVhayBpZjoKICAgICAgLy8gICAtIGEgc3dpdGNoIGNhc2UgY2FsbHMgYSBmdW5jdGlvbiB0aGF0IGFsd2F5cyB0aHJvd3MKICAgICAgLy8gICAtIHRoZXJlJ3MgYSBtaXNzaW5nIGJyZWFrIG9uIHRoZSBsYXN0IGNhc2UgaWYgaXQgaXNuJ3QgYSBkZWZhdWx0IGNhc2UKICAgICAgX2dldEp1bXBUYXJnZXQobm9kZSk7CiAgICB9CiAgICBzdXBlci52aXNpdFN3aXRjaFN0YXRlbWVudChub2RlKTsKICB9Cn0KCmNsYXNzIEpKdW1wVGFyZ2V0IGV4dGVuZHMgSnVtcFRhcmdldCB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtKSnVtcFRhcmdldF0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdqdW1wLXRhcmdldCc7CgogIGZpbmFsIE1lbWJlckVudGl0eSBtZW1iZXJDb250ZXh0OwogIEBvdmVycmlkZQogIGZpbmFsIGludCBuZXN0aW5nTGV2ZWw7CiAgTGlzdDxMYWJlbERlZmluaXRpb24+IF9sYWJlbHM7CiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc1N3aXRjaDsKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzU3dpdGNoQ2FzZTsKICBAb3ZlcnJpZGUKICBib29sIGlzQnJlYWtUYXJnZXQ7CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvbnRpbnVlVGFyZ2V0OwoKICBKSnVtcFRhcmdldCh0aGlzLm1lbWJlckNvbnRleHQsIHRoaXMubmVzdGluZ0xldmVsLAogICAgICB7dGhpcy5pc1N3aXRjaDogZmFsc2UsCiAgICAgIHRoaXMuaXNTd2l0Y2hDYXNlOiBmYWxzZSwKICAgICAgdGhpcy5pc0JyZWFrVGFyZ2V0OiBmYWxzZSwKICAgICAgdGhpcy5pc0NvbnRpbnVlVGFyZ2V0OiBmYWxzZX0pOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW0pKdW1wVGFyZ2V0XSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IEpKdW1wVGFyZ2V0LnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBNZW1iZXJFbnRpdHkgbWVtYmVyQ29udGV4dCA9IHNvdXJjZS5yZWFkTWVtYmVyKCk7CiAgICBpbnQgbmVzdGluZ0xldmVsID0gc291cmNlLnJlYWRJbnQoKTsKICAgIGJvb2wgaXNTd2l0Y2ggPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGJvb2wgaXNTd2l0Y2hDYXNlID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBib29sIGlzQnJlYWtUYXJnZXQgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGJvb2wgaXNDb250aW51ZVRhcmdldCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgSkp1bXBUYXJnZXQgdGFyZ2V0ID0gbmV3IEpKdW1wVGFyZ2V0KG1lbWJlckNvbnRleHQsIG5lc3RpbmdMZXZlbCwKICAgICAgICBpc1N3aXRjaDogaXNTd2l0Y2gsCiAgICAgICAgaXNTd2l0Y2hDYXNlOiBpc1N3aXRjaENhc2UsCiAgICAgICAgaXNCcmVha1RhcmdldDogaXNCcmVha1RhcmdldCwKICAgICAgICBpc0NvbnRpbnVlVGFyZ2V0OiBpc0NvbnRpbnVlVGFyZ2V0KTsKICAgIGludCBsYWJlbENvdW50ID0gc291cmNlLnJlYWRJbnQoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxDb3VudDsgaSsrKSB7CiAgICAgIFN0cmluZyBsYWJlbE5hbWUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgICBib29sIGlzQnJlYWtUYXJnZXQgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgICAgYm9vbCBpc0NvbnRpbnVlVGFyZ2V0ID0gc291cmNlLnJlYWRCb29sKCk7CiAgICAgIHRhcmdldC5hZGRMYWJlbChsYWJlbE5hbWUsCiAgICAgICAgICBpc0JyZWFrVGFyZ2V0OiBpc0JyZWFrVGFyZ2V0LCBpc0NvbnRpbnVlVGFyZ2V0OiBpc0NvbnRpbnVlVGFyZ2V0KTsKICAgIH0KICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiB0YXJnZXQ7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtKSnVtcFRhcmdldF0gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVNZW1iZXIobWVtYmVyQ29udGV4dCk7CiAgICBzaW5rLndyaXRlSW50KG5lc3RpbmdMZXZlbCk7CiAgICBzaW5rLndyaXRlQm9vbChpc1N3aXRjaCk7CiAgICBzaW5rLndyaXRlQm9vbChpc1N3aXRjaENhc2UpOwogICAgc2luay53cml0ZUJvb2woaXNCcmVha1RhcmdldCk7CiAgICBzaW5rLndyaXRlQm9vbChpc0NvbnRpbnVlVGFyZ2V0KTsKICAgIGlmIChfbGFiZWxzICE9IG51bGwpIHsKICAgICAgc2luay53cml0ZUludChfbGFiZWxzLmxlbmd0aCk7CiAgICAgIGZvciAoTGFiZWxEZWZpbml0aW9uIGRlZmluaXRpb24gaW4gX2xhYmVscykgewogICAgICAgIHNpbmsud3JpdGVTdHJpbmcoZGVmaW5pdGlvbi5uYW1lKTsKICAgICAgICBzaW5rLndyaXRlQm9vbChkZWZpbml0aW9uLmlzQnJlYWtUYXJnZXQpOwogICAgICAgIHNpbmsud3JpdGVCb29sKGRlZmluaXRpb24uaXNDb250aW51ZVRhcmdldCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHNpbmsud3JpdGVJbnQoMCk7CiAgICB9CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgTGFiZWxEZWZpbml0aW9uIGFkZExhYmVsKFN0cmluZyBsYWJlbE5hbWUsCiAgICAgIHtib29sIGlzQnJlYWtUYXJnZXQ6IGZhbHNlLCBib29sIGlzQ29udGludWVUYXJnZXQ6IGZhbHNlfSkgewogICAgX2xhYmVscyA/Pz0gPExhYmVsRGVmaW5pdGlvbj5bXTsKICAgIExhYmVsRGVmaW5pdGlvbiBsYWJlbERlZmluaXRpb24gPSBuZXcgSkxhYmVsRGVmaW5pdGlvbih0aGlzLCBsYWJlbE5hbWUsCiAgICAgICAgaXNCcmVha1RhcmdldDogaXNCcmVha1RhcmdldCwgaXNDb250aW51ZVRhcmdldDogaXNDb250aW51ZVRhcmdldCk7CiAgICBfbGFiZWxzLmFkZChsYWJlbERlZmluaXRpb24pOwogICAgcmV0dXJuIGxhYmVsRGVmaW5pdGlvbjsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8TGFiZWxEZWZpbml0aW9uPiBnZXQgbGFiZWxzIHsKICAgIHJldHVybiBfbGFiZWxzID8/IGNvbnN0IDxMYWJlbERlZmluaXRpb24+W107CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnSkp1bXBUYXJnZXQoJyk7CiAgICBzYi53cml0ZSgnbWVtYmVyQ29udGV4dD0nKTsKICAgIHNiLndyaXRlKG1lbWJlckNvbnRleHQpOwogICAgc2Iud3JpdGUoJyxuZXN0aW5nTGV2ZWw9Jyk7CiAgICBzYi53cml0ZShuZXN0aW5nTGV2ZWwpOwogICAgc2Iud3JpdGUoJyxpc0JyZWFrVGFyZ2V0PScpOwogICAgc2Iud3JpdGUoaXNCcmVha1RhcmdldCk7CiAgICBzYi53cml0ZSgnLGlzQ29udGludWVUYXJnZXQ9Jyk7CiAgICBzYi53cml0ZShpc0NvbnRpbnVlVGFyZ2V0KTsKICAgIGlmIChfbGFiZWxzICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJyxsYWJlbHM9Jyk7CiAgICAgIHNiLndyaXRlKF9sYWJlbHMpOwogICAgfQogICAgc2Iud3JpdGUoJyknKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQoKY2xhc3MgSkxhYmVsRGVmaW5pdGlvbiBleHRlbmRzIExhYmVsRGVmaW5pdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgSnVtcFRhcmdldCB0YXJnZXQ7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIGxhYmVsTmFtZTsKICBAb3ZlcnJpZGUKICBib29sIGlzQnJlYWtUYXJnZXQ7CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvbnRpbnVlVGFyZ2V0OwoKICBKTGFiZWxEZWZpbml0aW9uKHRoaXMudGFyZ2V0LCB0aGlzLmxhYmVsTmFtZSwKICAgICAge3RoaXMuaXNCcmVha1RhcmdldDogZmFsc2UsIHRoaXMuaXNDb250aW51ZVRhcmdldDogZmFsc2V9KTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+IGxhYmVsTmFtZTsKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnSkxhYmVsRGVmaW5pdGlvbignKTsKICAgIHNiLndyaXRlKCcsbGFiZWxOYW1lPScpOwogICAgc2Iud3JpdGUobGFiZWxOYW1lKTsKICAgIHNiLndyaXRlKCcsaXNCcmVha1RhcmdldD0nKTsKICAgIHNiLndyaXRlKGlzQnJlYWtUYXJnZXQpOwogICAgc2Iud3JpdGUoJyxpc0NvbnRpbnVlVGFyZ2V0PScpOwogICAgc2Iud3JpdGUoaXNDb250aW51ZVRhcmdldCk7CiAgICBzYi53cml0ZSgnKScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgpjbGFzcyBKTG9jYWwgZXh0ZW5kcyBJbmRleGVkTG9jYWwgewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lOwogIGZpbmFsIE1lbWJlckVudGl0eSBtZW1iZXJDb250ZXh0OwoKICAvLy8gVHJ1ZSBpZiB0aGlzIGxvY2FsIHJlcHJlc2VudHMgYSBsb2NhbCBwYXJhbWV0ZXIuCiAgZmluYWwgYm9vbCBpc1JlZ3VsYXJQYXJhbWV0ZXI7CgogIEpMb2NhbCh0aGlzLm5hbWUsIHRoaXMubWVtYmVyQ29udGV4dCwge3RoaXMuaXNSZWd1bGFyUGFyYW1ldGVyOiBmYWxzZX0pIHsKICAgIGFzc2VydChtZW1iZXJDb250ZXh0IGlzISBKR2VuZXJhdG9yQm9keSk7CiAgfQoKICBTdHJpbmcgZ2V0IF9raW5kID0+ICdsb2NhbCc7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCckX2tpbmQoJyk7CiAgICBpZiAobWVtYmVyQ29udGV4dC5lbmNsb3NpbmdDbGFzcyAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKG1lbWJlckNvbnRleHQuZW5jbG9zaW5nQ2xhc3MubmFtZSk7CiAgICAgIHNiLndyaXRlKCcuJyk7CiAgICB9CiAgICBzYi53cml0ZShtZW1iZXJDb250ZXh0Lm5hbWUpOwogICAgc2Iud3JpdGUoJyMnKTsKICAgIHNiLndyaXRlKG5hbWUpOwogICAgc2Iud3JpdGUoJyknKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQoKY2xhc3MgTG9jYWxEYXRhIHsKICBmaW5hbCBpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGU7CgogIERhcnRUeXBlIF90eXBlOwoKICBMb2NhbERhdGEodGhpcy5ub2RlKTsKCiAgRGFydFR5cGUgZ2V0RGFydFR5cGUoSnNUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCkgewogICAgcmV0dXJuIF90eXBlID8/PSBlbGVtZW50TWFwLmdldERhcnRUeXBlKG5vZGUudHlwZSk7CiAgfQoKICBpci5GdW5jdGlvbk5vZGUgZ2V0IGZ1bmN0aW9uTm9kZSA9PiBub2RlLnBhcmVudDsKfQoKLy8vIENhbGxzIFtmXSBmb3IgZWFjaCBwYXJhbWV0ZXIgaW4gW2Z1bmN0aW9uXSBpbiB0aGUgY2Fub25pY2FsIG9yZGVyOgovLy8gUG9zaXRpb25hbCBwYXJhbWV0ZXJzIGJ5IGluZGV4LCB0aGVuIG5hbWVkIHBhcmFtZXRlcnMgbGV4aWNvZ3JhcGhpY2FsbHkuCnZvaWQgZm9yRWFjaE9yZGVyZWRQYXJhbWV0ZXJBc0xvY2FsKAogICAgR2xvYmFsTG9jYWxzTWFwIGdsb2JhbExvY2Fsc01hcCwKICAgIEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsCiAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwKICAgIHZvaWQgZihMb2NhbCBwYXJhbWV0ZXIsIHtib29sIGlzRWxpZGVkfSkpIHsKICBLZXJuZWxUb0xvY2Fsc01hcCBsb2NhbHNNYXAgPSBnbG9iYWxMb2NhbHNNYXAuZ2V0TG9jYWxzTWFwKGZ1bmN0aW9uKTsKICBmb3JFYWNoT3JkZXJlZFBhcmFtZXRlcihlbGVtZW50TWFwLCBmdW5jdGlvbiwKICAgICAgKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIHtib29sIGlzRWxpZGVkfSkgewogICAgZihsb2NhbHNNYXAuZ2V0TG9jYWxWYXJpYWJsZSh2YXJpYWJsZSksIGlzRWxpZGVkOiBpc0VsaWRlZCk7CiAgfSk7Cn0KgoYATk48ASEBKAEaGSQjISEuARssARhJHTEBOgEoAS4BPUIXOyUpJEA5LSkIBhU2BAEzKBVIUU5OJ0BNPwgmD00nIggTBAE0OE9MUVBGGiJGJDoEASwGRUgzLTQlBAIBO08dKgEfMy41KjAxAS4BQ0AXKigsJC8zOzUzLDMiBiYZGyxJOiopCggGMBUEATkMKBUlITU0JyowJQgiQEhLT1E8Rj0KKUomJAoNGAY9EwQBTCoiPAE0IxwIARwuNAYEAQw0ASUlBAEMPSEuTRMEAQw6LQQBDE8hLk0TBAEMPhohBAEMNxohBAEMPxohBAEMPxohBAEMORohBAEMPRohBAEMPRohBAEMOC86P0cUCAQBDB4+T1AoSAQBDEw0BAEMTTsEAgEnFRYdNiRQARwBMTAyMDAIBAE7ITYNIwYEAQw5ATMmJSUiJAQBNiYlJSAEAQwwGCktAU0nRywJIxkPCVAcCSMiFRwRDwlKHgYiGwkwGg8JQSUjIR8mKCcRCiAIGDwkCC4bCTAaDwlCJyYiIR8mKycRCiAIGDwnCA0bCR0qDwkvLCM6IgYiJQQBDEI2JCI4Iy4EAQwyIiFQP1EcBiYEAgEnRR0rASQMGiEMFwwbDBYMGQE1HSAhJgE5Phc2KScrLC9GHCQmLScrLi4xIU0GFRMEAS8oFSUhHiIjJhslNCsyNQgNGAYTBAEMLUMlTEsiHAQBDCUxBAEMFioeIB0gHCEdJCAbHBkGExoEAgExDBsMGgwWDBkBMEIBDCAMFiojHRkhHSQgExoEAgEkDBUkATchAUwuBAEfAQwWKhkwMxUGIhMUExoEAgESJQESARgBNDgEATMCAUdNJSUfHTBIMDtBBgIBKXBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX21vZGVsL2xvY2Fscy5kYXJ0NHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2NvbW1vbi9yZXNvbHV0aW9uLmRhcnSE2y8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuY29tbW9uLnJlc29sdXRpb247CgppbXBvcnQgJy4uL2NvbnN0YW50cy9leHByZXNzaW9ucy5kYXJ0JyBzaG93IENvbnN0YW50RXhwcmVzc2lvbjsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS93b3JsZF9pbXBhY3QuZGFydCcgc2hvdyBXb3JsZEltcGFjdDsKaW1wb3J0ICcuLi91bml2ZXJzZS9mZWF0dXJlLmRhcnQnOwoKY2xhc3MgUmVzb2x1dGlvbkltcGFjdCBleHRlbmRzIFdvcmxkSW1wYWN0IHsKICBjb25zdCBSZXNvbHV0aW9uSW1wYWN0KCk7CgogIEl0ZXJhYmxlPEZlYXR1cmU+IGdldCBmZWF0dXJlcyA9PiBjb25zdCA8RmVhdHVyZT5bXTsKICBJdGVyYWJsZTxNYXBMaXRlcmFsVXNlPiBnZXQgbWFwTGl0ZXJhbHMgPT4gY29uc3QgPE1hcExpdGVyYWxVc2U+W107CiAgSXRlcmFibGU8U2V0TGl0ZXJhbFVzZT4gZ2V0IHNldExpdGVyYWxzID0+IGNvbnN0IDxTZXRMaXRlcmFsVXNlPltdOwogIEl0ZXJhYmxlPExpc3RMaXRlcmFsVXNlPiBnZXQgbGlzdExpdGVyYWxzID0+IGNvbnN0IDxMaXN0TGl0ZXJhbFVzZT5bXTsKICBJdGVyYWJsZTxTdHJpbmc+IGdldCBjb25zdFN5bWJvbE5hbWVzID0+IGNvbnN0IDxTdHJpbmc+W107CiAgSXRlcmFibGU8Q29uc3RhbnRFeHByZXNzaW9uPiBnZXQgY29uc3RhbnRMaXRlcmFscyA9PgogICAgICBjb25zdCA8Q29uc3RhbnRFeHByZXNzaW9uPltdOwogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBnZXQgc2VlbkNsYXNzZXMgPT4gY29uc3QgPENsYXNzRW50aXR5PltdOwogIEl0ZXJhYmxlPFJ1bnRpbWVUeXBlVXNlPiBnZXQgcnVudGltZVR5cGVVc2VzID0+IGNvbnN0IDxSdW50aW1lVHlwZVVzZT5bXTsKCiAgSXRlcmFibGU8ZHluYW1pYz4gZ2V0IG5hdGl2ZURhdGEgPT4gY29uc3QgPGR5bmFtaWM+W107CgogIEl0ZXJhYmxlPEdlbmVyaWNJbnN0YW50aWF0aW9uPiBnZXQgZ2VuZXJpY0luc3RhbnRpYXRpb25zID0+CiAgICAgIGNvbnN0IDxHZW5lcmljSW5zdGFudGlhdGlvbj5bXTsKfQofAE5OPAEjAUAkOSMBLRwBN0ZGST03JEJMATkBPiYCAStwYWNrYWdlOmNvbXBpbGVyL3NyYy9jb21tb24vcmVzb2x1dGlvbi5kYXJ0MXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2lyL2Fubm90YXRpb25zLmRhcnSxnS8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICcuLi9jb21tb24vbmFtZXMuZGFydCc7CgpjbGFzcyBJckFubm90YXRpb25EYXRhIHsKICBNYXA8aXIuQ2xhc3MsIFN0cmluZz4gX25hdGl2ZUNsYXNzTmFtZXMgPSB7fTsKICBTZXQ8aXIuTWVtYmVyPiBfbmF0aXZlTWVtYmVycyA9IHt9OwogIE1hcDxpci5NZW1iZXIsIFN0cmluZz4gX25hdGl2ZU1lbWJlck5hbWVzID0ge307CiAgTWFwPGlyLk1lbWJlciwgTGlzdDxTdHJpbmc+PiBfY3JlYXRlc0Fubm90YXRpb25zID0ge307CiAgTWFwPGlyLk1lbWJlciwgTGlzdDxTdHJpbmc+PiBfcmV0dXJuc0Fubm90YXRpb25zID0ge307CgogIE1hcDxpci5MaWJyYXJ5LCBTdHJpbmc+IF9qc0ludGVyb3BMaWJyYXJ5TmFtZXMgPSB7fTsKICBNYXA8aXIuQ2xhc3MsIFN0cmluZz4gX2pzSW50ZXJvcENsYXNzTmFtZXMgPSB7fTsKICBTZXQ8aXIuQ2xhc3M+IF9hbm9ueW1vdXNKc0ludGVyb3BDbGFzc2VzID0ge307CiAgTWFwPGlyLk1lbWJlciwgU3RyaW5nPiBfanNJbnRlcm9wTWVtYmVyTmFtZXMgPSB7fTsKCiAgTWFwPGlyLk1lbWJlciwgTGlzdDxQcmFnbWFBbm5vdGF0aW9uRGF0YT4+IF9tZW1iZXJQcmFnbWFBbm5vdGF0aW9ucyA9IHt9OwoKICAvLyBSZXR1cm5zIHRoZSB0ZXh0IGZyb20gdGhlIGBATmF0aXZlKDx0ZXh0PilgIGFubm90YXRpb24gb2YgW25vZGVdLCBpZiBhbnkuCiAgU3RyaW5nIGdldE5hdGl2ZUNsYXNzTmFtZShpci5DbGFzcyBub2RlKSA9PiBfbmF0aXZlQ2xhc3NOYW1lc1tub2RlXTsKCiAgLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW25vZGVdIGhhcyBhIG5hdGl2ZSBib2R5LCBhcyBpbiBgbWV0aG9kKCkgbmF0aXZlO2AuCiAgYm9vbCBoYXNOYXRpdmVCb2R5KGlyLk1lbWJlciBub2RlKSA9PiBfbmF0aXZlTWVtYmVycy5jb250YWlucyhub2RlKTsKCiAgLy8gUmV0dXJucyB0aGUgdGV4dCBmcm9tIHRoZSBgQEpTTmFtZSg8dGV4dD4pYCBhbm5vdGF0aW9uIG9mIFtub2RlXSwgaWYgYW55LgogIFN0cmluZyBnZXROYXRpdmVNZW1iZXJOYW1lKGlyLk1lbWJlciBub2RlKSA9PiBfbmF0aXZlTWVtYmVyTmFtZXNbbm9kZV07CgogIC8vIFJldHVybnMgYSBsaXN0IG9mIHRoZSB0ZXh0IGZyb20gdGhlIGBAQ3JlYXRlcyg8dGV4dD4pYCBhbm5vdGF0aW9uIG9mCiAgLy8gW25vZGVdLgogIExpc3Q8U3RyaW5nPiBnZXRDcmVhdGVzQW5ub3RhdGlvbnMoaXIuTWVtYmVyIG5vZGUpID0+CiAgICAgIF9jcmVhdGVzQW5ub3RhdGlvbnNbbm9kZV0gPz8gY29uc3QgW107CgogIC8vIFJldHVybnMgYSBsaXN0IG9mIHRoZSB0ZXh0IGZyb20gdGhlIGBAUmV0dXJucyg8dGV4dD4pYCBhbm5vdGF0aW9uIG9mCiAgLy8gW25vZGVdLgogIExpc3Q8U3RyaW5nPiBnZXRSZXR1cm5zQW5ub3RhdGlvbnMoaXIuTWVtYmVyIG5vZGUpID0+CiAgICAgIF9yZXR1cm5zQW5ub3RhdGlvbnNbbm9kZV0gPz8gY29uc3QgW107CgogIC8vIFJldHVybnMgdGhlIHRleHQgZnJvbSB0aGUgYEBKUyg8dGV4dD4pYCBhbm5vdGF0aW9uIG9mIFtub2RlXSwgaWYgYW55LgogIFN0cmluZyBnZXRKc0ludGVyb3BMaWJyYXJ5TmFtZShpci5MaWJyYXJ5IG5vZGUpID0+CiAgICAgIF9qc0ludGVyb3BMaWJyYXJ5TmFtZXNbbm9kZV07CgogIC8vIFJldHVybnMgdGhlIHRleHQgZnJvbSB0aGUgYEBKUyg8dGV4dD4pYCBhbm5vdGF0aW9uIG9mIFtub2RlXSwgaWYgYW55LgogIFN0cmluZyBnZXRKc0ludGVyb3BDbGFzc05hbWUoaXIuQ2xhc3Mgbm9kZSkgPT4gX2pzSW50ZXJvcENsYXNzTmFtZXNbbm9kZV07CgogIC8vIFJldHVybnMgYHRydWVgIGlmIFtub2RlXSBpcyBhbm5vdGF0ZWQgd2l0aCBgQGFub255bW91c2AuCiAgYm9vbCBpc0Fub255bW91c0pzSW50ZXJvcENsYXNzKGlyLkNsYXNzIG5vZGUpID0+CiAgICAgIF9hbm9ueW1vdXNKc0ludGVyb3BDbGFzc2VzLmNvbnRhaW5zKG5vZGUpOwoKICAvLyBSZXR1cm5zIHRoZSB0ZXh0IGZyb20gdGhlIGBASlMoPHRleHQ+KWAgYW5ub3RhdGlvbiBvZiBbbm9kZV0sIGlmIGFueS4KICBTdHJpbmcgZ2V0SnNJbnRlcm9wTWVtYmVyTmFtZShpci5NZW1iZXIgbm9kZSkgPT4gX2pzSW50ZXJvcE1lbWJlck5hbWVzW25vZGVdOwoKICAvLyBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgYEBwcmFnbWEoJ2RhcnQyanM6PHN1ZmZpeD4nKWAgYW5ub3RhdGlvbnMgb24gW25vZGVdLgogIExpc3Q8UHJhZ21hQW5ub3RhdGlvbkRhdGE+IGdldE1lbWJlclByYWdtYUFubm90YXRpb25EYXRhKGlyLk1lbWJlciBub2RlKSA9PgogICAgICBfbWVtYmVyUHJhZ21hQW5ub3RhdGlvbnNbbm9kZV0gPz8gY29uc3QgW107CgogIHZvaWQgZm9yRWFjaE5hdGl2ZUNsYXNzKHZvaWQgRnVuY3Rpb24oaXIuQ2xhc3MsIFN0cmluZykgZikgewogICAgX25hdGl2ZUNsYXNzTmFtZXMuZm9yRWFjaChmKTsKICB9CgogIHZvaWQgZm9yRWFjaEpzSW50ZXJvcExpYnJhcnkodm9pZCBGdW5jdGlvbihpci5MaWJyYXJ5LCBTdHJpbmcpIGYpIHsKICAgIF9qc0ludGVyb3BMaWJyYXJ5TmFtZXMuZm9yRWFjaChmKTsKICB9CgogIHZvaWQgZm9yRWFjaEpzSW50ZXJvcENsYXNzKAogICAgICB2b2lkIEZ1bmN0aW9uKGlyLkNsYXNzLCBTdHJpbmcsIHtib29sIGlzQW5vbnltb3VzfSkgZikgewogICAgX2pzSW50ZXJvcENsYXNzTmFtZXMuZm9yRWFjaCgoaXIuQ2xhc3Mgbm9kZSwgU3RyaW5nIG5hbWUpIHsKICAgICAgZihub2RlLCBuYW1lLCBpc0Fub255bW91czogaXNBbm9ueW1vdXNKc0ludGVyb3BDbGFzcyhub2RlKSk7CiAgICB9KTsKICB9CgogIHZvaWQgZm9yRWFjaEpzSW50ZXJvcE1lbWJlcih2b2lkIEZ1bmN0aW9uKGlyLk1lbWJlciwgU3RyaW5nKSBmKSB7CiAgICBfanNJbnRlcm9wTGlicmFyeU5hbWVzLmZvckVhY2goKGlyLkxpYnJhcnkgbGlicmFyeSwgXykgewogICAgICBmb3IgKGlyLk1lbWJlciBtZW1iZXIgaW4gbGlicmFyeS5tZW1iZXJzKSB7CiAgICAgICAgaWYgKG1lbWJlci5pc0V4dGVybmFsKSB7CiAgICAgICAgICBmKG1lbWJlciwgX2pzSW50ZXJvcE1lbWJlck5hbWVzW21lbWJlcl0gPz8gbWVtYmVyLm5hbWUubmFtZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIF9qc0ludGVyb3BDbGFzc05hbWVzLmZvckVhY2goKGlyLkNsYXNzIGNscywgXykgewogICAgICBmb3IgKGlyLk1lbWJlciBtZW1iZXIgaW4gY2xzLm1lbWJlcnMpIHsKICAgICAgICBpZiAobWVtYmVyIGlzIGlyLkZpZWxkKSBjb250aW51ZTsKICAgICAgICBTdHJpbmcgbmFtZSA9IF9qc0ludGVyb3BNZW1iZXJOYW1lc1ttZW1iZXJdOwogICAgICAgIGlmIChtZW1iZXIuaXNFeHRlcm5hbCkgewogICAgICAgICAgbmFtZSA/Pz0gbWVtYmVyLm5hbWUubmFtZTsKICAgICAgICB9CiAgICAgICAgZihtZW1iZXIsIG5hbWUpOwogICAgICB9CiAgICB9KTsKICB9CgogIHZvaWQgZm9yRWFjaE5hdGl2ZU1ldGhvZERhdGEoCiAgICAgIHZvaWQgRnVuY3Rpb24oaXIuTWVtYmVyLCBTdHJpbmcgbmFtZSwgSXRlcmFibGU8U3RyaW5nPiBjcmVhdGVzQW5ub3RhdGlvbnMsCiAgICAgICAgICAgICAgSXRlcmFibGU8U3RyaW5nPiByZXR1cm5zQW5ub3RhdGlvbnMpCiAgICAgICAgICBmKSB7CiAgICBmb3IgKGlyLk1lbWJlciBub2RlIGluIF9uYXRpdmVNZW1iZXJzKSB7CiAgICAgIGlmIChub2RlIGlzISBpci5GaWVsZCkgewogICAgICAgIFN0cmluZyBuYW1lID0gX25hdGl2ZU1lbWJlck5hbWVzW25vZGVdID8/IG5vZGUubmFtZS5uYW1lOwogICAgICAgIGYobm9kZSwgbmFtZSwgZ2V0Q3JlYXRlc0Fubm90YXRpb25zKG5vZGUpLCBnZXRSZXR1cm5zQW5ub3RhdGlvbnMobm9kZSkpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGZvckVhY2hOYXRpdmVGaWVsZERhdGEoCiAgICAgIHZvaWQgRnVuY3Rpb24oaXIuTWVtYmVyLCBTdHJpbmcgbmFtZSwgSXRlcmFibGU8U3RyaW5nPiBjcmVhdGVzQW5ub3RhdGlvbnMsCiAgICAgICAgICAgICAgSXRlcmFibGU8U3RyaW5nPiByZXR1cm5zQW5ub3RhdGlvbnMpCiAgICAgICAgICBmKSB7CiAgICBmb3IgKGlyLkNsYXNzIGNscyBpbiBfbmF0aXZlQ2xhc3NOYW1lcy5rZXlzKSB7CiAgICAgIGZvciAoaXIuRmllbGQgZmllbGQgaW4gY2xzLmZpZWxkcykgewogICAgICAgIGlmIChmaWVsZC5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgICAgICBTdHJpbmcgbmFtZSA9IF9uYXRpdmVNZW1iZXJOYW1lc1tmaWVsZF0gPz8gZmllbGQubmFtZS5uYW1lOwogICAgICAgICAgZihmaWVsZCwgbmFtZSwgZ2V0Q3JlYXRlc0Fubm90YXRpb25zKGZpZWxkKSwKICAgICAgICAgICAgICBnZXRSZXR1cm5zQW5ub3RhdGlvbnMoZmllbGQpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KCklyQW5ub3RhdGlvbkRhdGEgcHJvY2Vzc0Fubm90YXRpb25zKGlyLkNvbXBvbmVudCBjb21wb25lbnQpIHsKICBJckFubm90YXRpb25EYXRhIGRhdGEgPSBuZXcgSXJBbm5vdGF0aW9uRGF0YSgpOwoKICB2b2lkIHByb2Nlc3NNZW1iZXIoaXIuTWVtYmVyIG1lbWJlcikgewogICAgTGlzdDxQcmFnbWFBbm5vdGF0aW9uRGF0YT4gcHJhZ21hQW5ub3RhdGlvbnM7CiAgICBMaXN0PFN0cmluZz4gY3JlYXRlc0Fubm90YXRpb25zOwogICAgTGlzdDxTdHJpbmc+IHJldHVybnNBbm5vdGF0aW9uczsKICAgIGZvciAoaXIuRXhwcmVzc2lvbiBhbm5vdGF0aW9uIGluIG1lbWJlci5hbm5vdGF0aW9ucykgewogICAgICBpZiAoYW5ub3RhdGlvbiBpcyBpci5Db25zdGFudEV4cHJlc3Npb24pIHsKICAgICAgICBpci5Db25zdGFudCBjb25zdGFudCA9IGFubm90YXRpb24uY29uc3RhbnQ7CgogICAgICAgIFN0cmluZyBqc05hbWUgPSBfZ2V0SnNJbnRlcm9wTmFtZShjb25zdGFudCk7CiAgICAgICAgaWYgKGpzTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICBkYXRhLl9qc0ludGVyb3BNZW1iZXJOYW1lc1ttZW1iZXJdID0ganNOYW1lOwogICAgICAgIH0KCiAgICAgICAgYm9vbCBpc05hdGl2ZU1lbWJlciA9IF9pc05hdGl2ZU1lbWJlcihjb25zdGFudCk7CiAgICAgICAgaWYgKGlzTmF0aXZlTWVtYmVyKSB7CiAgICAgICAgICBkYXRhLl9uYXRpdmVNZW1iZXJzLmFkZChtZW1iZXIpOwogICAgICAgIH0KCiAgICAgICAgU3RyaW5nIG5hdGl2ZU5hbWUgPSBfZ2V0TmF0aXZlTWVtYmVyTmFtZShjb25zdGFudCk7CiAgICAgICAgaWYgKG5hdGl2ZU5hbWUgIT0gbnVsbCkgewogICAgICAgICAgZGF0YS5fbmF0aXZlTWVtYmVyTmFtZXNbbWVtYmVyXSA9IG5hdGl2ZU5hbWU7CiAgICAgICAgfQoKICAgICAgICBTdHJpbmcgY3JlYXRlcyA9IF9nZXRDcmVhdGVzQW5ub3RhdGlvbihjb25zdGFudCk7CiAgICAgICAgaWYgKGNyZWF0ZXMgIT0gbnVsbCkgewogICAgICAgICAgaWYgKGNyZWF0ZXNBbm5vdGF0aW9ucyA9PSBudWxsKSB7CiAgICAgICAgICAgIGRhdGEuX2NyZWF0ZXNBbm5vdGF0aW9uc1ttZW1iZXJdID0gY3JlYXRlc0Fubm90YXRpb25zID0gW107CiAgICAgICAgICB9CiAgICAgICAgICBjcmVhdGVzQW5ub3RhdGlvbnMuYWRkKGNyZWF0ZXMpOwogICAgICAgIH0KCiAgICAgICAgU3RyaW5nIHJldHVybnMgPSBfZ2V0UmV0dXJuc0Fubm90YXRpb24oY29uc3RhbnQpOwogICAgICAgIGlmIChyZXR1cm5zICE9IG51bGwpIHsKICAgICAgICAgIGlmIChyZXR1cm5zQW5ub3RhdGlvbnMgPT0gbnVsbCkgewogICAgICAgICAgICBkYXRhLl9yZXR1cm5zQW5ub3RhdGlvbnNbbWVtYmVyXSA9IHJldHVybnNBbm5vdGF0aW9ucyA9IFtdOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuc0Fubm90YXRpb25zLmFkZChyZXR1cm5zKTsKICAgICAgICB9CgogICAgICAgIFByYWdtYUFubm90YXRpb25EYXRhIHByYWdtYUFubm90YXRpb24gPSBfZ2V0UHJhZ21hQW5ub3RhdGlvbihjb25zdGFudCk7CiAgICAgICAgaWYgKHByYWdtYUFubm90YXRpb24gIT0gbnVsbCkgewogICAgICAgICAgaWYgKHByYWdtYUFubm90YXRpb25zID09IG51bGwpIHsKICAgICAgICAgICAgZGF0YS5fbWVtYmVyUHJhZ21hQW5ub3RhdGlvbnNbbWVtYmVyXSA9IHByYWdtYUFubm90YXRpb25zID0gW107CiAgICAgICAgICB9CiAgICAgICAgICBwcmFnbWFBbm5vdGF0aW9ucy5hZGQocHJhZ21hQW5ub3RhdGlvbik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBmb3IgKGlyLkxpYnJhcnkgbGlicmFyeSBpbiBjb21wb25lbnQubGlicmFyaWVzKSB7CiAgICBmb3IgKGlyLkV4cHJlc3Npb24gYW5ub3RhdGlvbiBpbiBsaWJyYXJ5LmFubm90YXRpb25zKSB7CiAgICAgIGlmIChhbm5vdGF0aW9uIGlzIGlyLkNvbnN0YW50RXhwcmVzc2lvbikgewogICAgICAgIGlyLkNvbnN0YW50IGNvbnN0YW50ID0gYW5ub3RhdGlvbi5jb25zdGFudDsKCiAgICAgICAgU3RyaW5nIGpzTmFtZSA9IF9nZXRKc0ludGVyb3BOYW1lKGNvbnN0YW50KTsKICAgICAgICBpZiAoanNOYW1lICE9IG51bGwpIHsKICAgICAgICAgIGRhdGEuX2pzSW50ZXJvcExpYnJhcnlOYW1lc1tsaWJyYXJ5XSA9IGpzTmFtZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZvciAoaXIuQ2xhc3MgY2xzIGluIGxpYnJhcnkuY2xhc3NlcykgewogICAgICBmb3IgKGlyLkV4cHJlc3Npb24gYW5ub3RhdGlvbiBpbiBjbHMuYW5ub3RhdGlvbnMpIHsKICAgICAgICBpZiAoYW5ub3RhdGlvbiBpcyBpci5Db25zdGFudEV4cHJlc3Npb24pIHsKICAgICAgICAgIGlyLkNvbnN0YW50IGNvbnN0YW50ID0gYW5ub3RhdGlvbi5jb25zdGFudDsKCiAgICAgICAgICBTdHJpbmcgbmF0aXZlQ2xhc3NOYW1lID0gX2dldE5hdGl2ZUNsYXNzTmFtZShjb25zdGFudCk7CiAgICAgICAgICBpZiAobmF0aXZlQ2xhc3NOYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgZGF0YS5fbmF0aXZlQ2xhc3NOYW1lc1tjbHNdID0gbmF0aXZlQ2xhc3NOYW1lOwogICAgICAgICAgfQoKICAgICAgICAgIFN0cmluZyBqc05hbWUgPSBfZ2V0SnNJbnRlcm9wTmFtZShjb25zdGFudCk7CiAgICAgICAgICBpZiAoanNOYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgZGF0YS5fanNJbnRlcm9wQ2xhc3NOYW1lc1tjbHNdID0ganNOYW1lOwogICAgICAgICAgfQoKICAgICAgICAgIGJvb2wgaXNBbm9ueW1vdXNKc0ludGVyb3BDbGFzcyA9IF9pc0Fub255bW91c0pzSW50ZXJvcChjb25zdGFudCk7CiAgICAgICAgICBpZiAoaXNBbm9ueW1vdXNKc0ludGVyb3BDbGFzcykgewogICAgICAgICAgICBkYXRhLl9hbm9ueW1vdXNKc0ludGVyb3BDbGFzc2VzLmFkZChjbHMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKGlyLk1lbWJlciBtZW1iZXIgaW4gY2xzLm1lbWJlcnMpIHsKICAgICAgICBwcm9jZXNzTWVtYmVyKG1lbWJlcik7CiAgICAgIH0KICAgIH0KICAgIGZvciAoaXIuTWVtYmVyIG1lbWJlciBpbiBsaWJyYXJ5Lm1lbWJlcnMpIHsKICAgICAgcHJvY2Vzc01lbWJlcihtZW1iZXIpOwogICAgfQogIH0KICByZXR1cm4gZGF0YTsKfQoKU3RyaW5nIF9nZXROYXRpdmVDbGFzc05hbWUoaXIuQ29uc3RhbnQgY29uc3RhbnQpIHsKICBpZiAoY29uc3RhbnQgaXMgaXIuSW5zdGFuY2VDb25zdGFudCkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQWRkIGFuIElyQ29tbW9uRWxlbWVudHMgZm9yIHRoZXNlIHF1ZXJpZXM7IGkuZS4KICAgIC8vIGBjb21tb25FbGVtZW50cy5pc05hdGl2ZUFubm90YXRpb25DbGFzcyhjb25zdGFudC5jbGFzc05vZGUpYC4KICAgIGlmIChjb25zdGFudC5jbGFzc05vZGUubmFtZSA9PSAnTmF0aXZlJyAmJgogICAgICAgIGNvbnN0YW50LmNsYXNzTm9kZS5lbmNsb3NpbmdMaWJyYXJ5LmltcG9ydFVyaSA9PSBVcmlzLmRhcnRfX2pzX2hlbHBlcikgewogICAgICBpZiAoY29uc3RhbnQuZmllbGRWYWx1ZXMubGVuZ3RoID09IDEpIHsKICAgICAgICBpci5Db25zdGFudCBmaWVsZFZhbHVlID0gY29uc3RhbnQuZmllbGRWYWx1ZXMudmFsdWVzLnNpbmdsZTsKICAgICAgICBTdHJpbmcgbmFtZTsKICAgICAgICBpZiAoZmllbGRWYWx1ZSBpcyBpci5TdHJpbmdDb25zdGFudCkgewogICAgICAgICAgbmFtZSA9IGZpZWxkVmFsdWUudmFsdWU7CiAgICAgICAgfQogICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKICAgICAgICAgIHJldHVybiBuYW1lOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICByZXR1cm4gbnVsbDsKfQoKYm9vbCBfaXNOYXRpdmVNZW1iZXIoaXIuQ29uc3RhbnQgY29uc3RhbnQpIHsKICByZXR1cm4gY29uc3RhbnQgaXMgaXIuSW5zdGFuY2VDb25zdGFudCAmJgogICAgICBjb25zdGFudC5jbGFzc05vZGUubmFtZSA9PSAnRXh0ZXJuYWxOYW1lJyAmJgogICAgICBjb25zdGFudC5jbGFzc05vZGUuZW5jbG9zaW5nTGlicmFyeS5pbXBvcnRVcmkgPT0gVXJpcy5kYXJ0X19pbnRlcm5hbDsKfQoKU3RyaW5nIF9nZXROYXRpdmVNZW1iZXJOYW1lKGlyLkNvbnN0YW50IGNvbnN0YW50KSB7CiAgaWYgKGNvbnN0YW50IGlzIGlyLkluc3RhbmNlQ29uc3RhbnQgJiYKICAgICAgY29uc3RhbnQuY2xhc3NOb2RlLm5hbWUgPT0gJ0pTTmFtZScgJiYKICAgICAgY29uc3RhbnQuY2xhc3NOb2RlLmVuY2xvc2luZ0xpYnJhcnkuaW1wb3J0VXJpID09IFVyaXMuZGFydF9fanNfaGVscGVyKSB7CiAgICBhc3NlcnQoY29uc3RhbnQuZmllbGRWYWx1ZXMubGVuZ3RoID09IDEpOwogICAgaXIuQ29uc3RhbnQgZmllbGRWYWx1ZSA9IGNvbnN0YW50LmZpZWxkVmFsdWVzLnZhbHVlcy5zaW5nbGU7CiAgICBpZiAoZmllbGRWYWx1ZSBpcyBpci5TdHJpbmdDb25zdGFudCkgewogICAgICByZXR1cm4gZmllbGRWYWx1ZS52YWx1ZTsKICAgIH0KICB9CiAgcmV0dXJuIG51bGw7Cn0KClN0cmluZyBfZ2V0Q3JlYXRlc0Fubm90YXRpb24oaXIuQ29uc3RhbnQgY29uc3RhbnQpIHsKICBpZiAoY29uc3RhbnQgaXMgaXIuSW5zdGFuY2VDb25zdGFudCAmJgogICAgICBjb25zdGFudC5jbGFzc05vZGUubmFtZSA9PSAnQ3JlYXRlcycgJiYKICAgICAgY29uc3RhbnQuY2xhc3NOb2RlLmVuY2xvc2luZ0xpYnJhcnkuaW1wb3J0VXJpID09IFVyaXMuZGFydF9fanNfaGVscGVyKSB7CiAgICBhc3NlcnQoY29uc3RhbnQuZmllbGRWYWx1ZXMubGVuZ3RoID09IDEpOwogICAgaXIuQ29uc3RhbnQgZmllbGRWYWx1ZSA9IGNvbnN0YW50LmZpZWxkVmFsdWVzLnZhbHVlcy5zaW5nbGU7CiAgICBpZiAoZmllbGRWYWx1ZSBpcyBpci5TdHJpbmdDb25zdGFudCkgewogICAgICByZXR1cm4gZmllbGRWYWx1ZS52YWx1ZTsKICAgIH0KICB9CiAgcmV0dXJuIG51bGw7Cn0KClN0cmluZyBfZ2V0UmV0dXJuc0Fubm90YXRpb24oaXIuQ29uc3RhbnQgY29uc3RhbnQpIHsKICBpZiAoY29uc3RhbnQgaXMgaXIuSW5zdGFuY2VDb25zdGFudCAmJgogICAgICBjb25zdGFudC5jbGFzc05vZGUubmFtZSA9PSAnUmV0dXJucycgJiYKICAgICAgY29uc3RhbnQuY2xhc3NOb2RlLmVuY2xvc2luZ0xpYnJhcnkuaW1wb3J0VXJpID09IFVyaXMuZGFydF9fanNfaGVscGVyKSB7CiAgICBhc3NlcnQoY29uc3RhbnQuZmllbGRWYWx1ZXMubGVuZ3RoID09IDEpOwogICAgaXIuQ29uc3RhbnQgZmllbGRWYWx1ZSA9IGNvbnN0YW50LmZpZWxkVmFsdWVzLnZhbHVlcy5zaW5nbGU7CiAgICBpZiAoZmllbGRWYWx1ZSBpcyBpci5TdHJpbmdDb25zdGFudCkgewogICAgICByZXR1cm4gZmllbGRWYWx1ZS52YWx1ZTsKICAgIH0KICB9CiAgcmV0dXJuIG51bGw7Cn0KClN0cmluZyBfZ2V0SnNJbnRlcm9wTmFtZShpci5Db25zdGFudCBjb25zdGFudCkgewogIGlmIChjb25zdGFudCBpcyBpci5JbnN0YW5jZUNvbnN0YW50ICYmCiAgICAgIGNvbnN0YW50LmNsYXNzTm9kZS5uYW1lID09ICdKUycgJiYKICAgICAgY29uc3RhbnQuY2xhc3NOb2RlLmVuY2xvc2luZ0xpYnJhcnkuaW1wb3J0VXJpID09IFVyaXMucGFja2FnZV9qcykgewogICAgYXNzZXJ0KGNvbnN0YW50LmZpZWxkVmFsdWVzLmxlbmd0aCA9PSAxKTsKICAgIGlyLkNvbnN0YW50IGZpZWxkVmFsdWUgPSBjb25zdGFudC5maWVsZFZhbHVlcy52YWx1ZXMuc2luZ2xlOwogICAgaWYgKGZpZWxkVmFsdWUgaXMgaXIuTnVsbENvbnN0YW50KSB7CiAgICAgIHJldHVybiAnJzsKICAgIH0gZWxzZSBpZiAoZmllbGRWYWx1ZSBpcyBpci5TdHJpbmdDb25zdGFudCkgewogICAgICByZXR1cm4gZmllbGRWYWx1ZS52YWx1ZTsKICAgIH0KICB9CiAgcmV0dXJuIG51bGw7Cn0KCmJvb2wgX2lzQW5vbnltb3VzSnNJbnRlcm9wKGlyLkNvbnN0YW50IGNvbnN0YW50KSB7CiAgcmV0dXJuIGNvbnN0YW50IGlzIGlyLkluc3RhbmNlQ29uc3RhbnQgJiYKICAgICAgY29uc3RhbnQuY2xhc3NOb2RlLm5hbWUgPT0gJ19Bbm9ueW1vdXMnICYmCiAgICAgIGNvbnN0YW50LmNsYXNzTm9kZS5lbmNsb3NpbmdMaWJyYXJ5LmltcG9ydFVyaSA9PSBVcmlzLnBhY2thZ2VfanM7Cn0KCmNsYXNzIFByYWdtYUFubm90YXRpb25EYXRhIHsKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTdXBwb3J0IG5vbiAnZGFydDJqczonIHByYWdtYSBuYW1lcyBpZiBuZWNlc3NhcnkuCiAgZmluYWwgU3RyaW5nIHN1ZmZpeDsKCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3VwcG9ydCBvcHRpb25zIG9iamVjdHMgd2hlbiBuZWNlc3NhcnkuCiAgZmluYWwgYm9vbCBoYXNPcHRpb25zOwoKICBjb25zdCBQcmFnbWFBbm5vdGF0aW9uRGF0YSh0aGlzLnN1ZmZpeCwge3RoaXMuaGFzT3B0aW9uczogZmFsc2V9KTsKCiAgU3RyaW5nIGdldCBuYW1lID0+ICdkYXJ0MmpzOiRzdWZmaXgnOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnUHJhZ21hQW5ub3RhdGlvbkRhdGEoJG5hbWUpJzsKfQoKUHJhZ21hQW5ub3RhdGlvbkRhdGEgX2dldFByYWdtYUFubm90YXRpb24oaXIuQ29uc3RhbnQgY29uc3RhbnQpIHsKICBpZiAoY29uc3RhbnQgaXMhIGlyLkluc3RhbmNlQ29uc3RhbnQpIHJldHVybiBudWxsOwogIGlyLkluc3RhbmNlQ29uc3RhbnQgdmFsdWUgPSBjb25zdGFudDsKICBpci5DbGFzcyBjbHMgPSB2YWx1ZS5jbGFzc05vZGU7CiAgVXJpIHVyaSA9IGNscy5lbmNsb3NpbmdMaWJyYXJ5LmltcG9ydFVyaTsKICBpZiAodXJpID09IFVyaXMucGFja2FnZV9tZXRhX2RhcnQyanMpIHsKICAgIGlmIChjbHMubmFtZSA9PSAnX05vSW5saW5lJykgewogICAgICByZXR1cm4gY29uc3QgUHJhZ21hQW5ub3RhdGlvbkRhdGEoJ25vSW5saW5lJyk7CiAgICB9IGVsc2UgaWYgKGNscy5uYW1lID09ICdfVHJ5SW5saW5lJykgewogICAgICByZXR1cm4gY29uc3QgUHJhZ21hQW5ub3RhdGlvbkRhdGEoJ3RyeUlubGluZScpOwogICAgfQogIH0gZWxzZSBpZiAodXJpID09IFVyaXMuZGFydF9jb3JlICYmIGNscy5uYW1lID09ICdwcmFnbWEnKSB7CiAgICBpci5Db25zdGFudCBuYW1lVmFsdWU7CiAgICBpci5Db25zdGFudCBvcHRpb25zVmFsdWU7CiAgICB2YWx1ZS5maWVsZFZhbHVlcy5mb3JFYWNoKChpci5SZWZlcmVuY2UgcmVmZXJlbmNlLCBpci5Db25zdGFudCBmaWVsZFZhbHVlKSB7CiAgICAgIGlyLkZpZWxkIGZpZWxkID0gcmVmZXJlbmNlLmFzRmllbGQ7CiAgICAgIGlmIChmaWVsZC5uYW1lLm5hbWUgPT0gJ25hbWUnKSB7CiAgICAgICAgbmFtZVZhbHVlID0gZmllbGRWYWx1ZTsKICAgICAgfSBlbHNlIGlmIChmaWVsZC5uYW1lLm5hbWUgPT0gJ29wdGlvbnMnKSB7CiAgICAgICAgb3B0aW9uc1ZhbHVlID0gZmllbGRWYWx1ZTsKICAgICAgfQogICAgfSk7CiAgICBpZiAobmFtZVZhbHVlIGlzISBpci5TdHJpbmdDb25zdGFudCkgcmV0dXJuIG51bGw7CiAgICBpci5TdHJpbmdDb25zdGFudCBzdHJpbmdWYWx1ZSA9IG5hbWVWYWx1ZTsKICAgIFN0cmluZyBuYW1lID0gc3RyaW5nVmFsdWUudmFsdWU7CiAgICBTdHJpbmcgcHJlZml4ID0gJ2RhcnQyanM6JzsKICAgIGlmICghbmFtZS5zdGFydHNXaXRoKHByZWZpeCkpIHJldHVybiBudWxsOwogICAgU3RyaW5nIHN1ZmZpeCA9IG5hbWUuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpOwogICAgcmV0dXJuIG5ldyBQcmFnbWFBbm5vdGF0aW9uRGF0YShzdWZmaXgsCiAgICAgICAgaGFzT3B0aW9uczogb3B0aW9uc1ZhbHVlIGlzISBpci5OdWxsQ29uc3RhbnQpOwogIH0KICByZXR1cm4gbnVsbDsKfQoKTGlzdDxQcmFnbWFBbm5vdGF0aW9uRGF0YT4gY29tcHV0ZVByYWdtYUFubm90YXRpb25EYXRhRnJvbUlyKGlyLk1lbWJlciBtZW1iZXIpIHsKICBMaXN0PFByYWdtYUFubm90YXRpb25EYXRhPiBhbm5vdGF0aW9ucyA9IFtdOwogIGZvciAoaXIuRXhwcmVzc2lvbiBtZXRhZGF0YSBpbiBtZW1iZXIuYW5ub3RhdGlvbnMpIHsKICAgIGlmIChtZXRhZGF0YSBpcyEgaXIuQ29uc3RhbnRFeHByZXNzaW9uKSBjb250aW51ZTsKICAgIGlyLkNvbnN0YW50RXhwcmVzc2lvbiBjb25zdGFudEV4cHJlc3Npb24gPSBtZXRhZGF0YTsKICAgIGlyLkNvbnN0YW50IGNvbnN0YW50ID0gY29uc3RhbnRFeHByZXNzaW9uLmNvbnN0YW50OwogICAgUHJhZ21hQW5ub3RhdGlvbkRhdGEgZGF0YSA9IF9nZXRQcmFnbWFBbm5vdGF0aW9uKGNvbnN0YW50KTsKICAgIGlmIChkYXRhICE9IG51bGwpIHsKICAgICAgYW5ub3RhdGlvbnMuYWRkKGRhdGEpOwogICAgfQogIH0KICByZXR1cm4gYW5ub3RhdGlvbnM7Cn0KgXAATk48ASgfARkwJjI5OQE3MzE1AUwBT0cBS0cBT0oBSg04LQFKDTgtAUs1JAFLTQE+MzEBS1ABUE4yAT8iBAFGJwQBHj9AQwgEAUQ9MiFICggINS4qNSElChkICAQBIFEzDy0fQlEIBgQBH1EzDzMrJkY3LQoIBgQCAT4yASkyJSU7MTQBNR43CgE5HisKATwiOAoBOh8sSAwrCgE6HyxIDCsKAVAoK0wMMwoIBgQBNDwxNAE1HjkKCAYsOjM2AUIpOwwBNyA1DAFMKzYMCgguHwgGMB0GBA8CATMpTEUvUS5FFS8jChwXCggGBA8CAS0sM0wCATQpLU8uQSsfBgQPAgE1KS5PLkErHwYEDwIBNSkuTy5BKx8GBA8CATEpKUouQSkRMh8GBA8CATMsMUgCAR1MFwFCGQFFASgBDDYCAUI1KCIsKiM1KzYGPhseUSonIDEjCAg2LyUgLzMsNwQPAgFRLzc2OThAGB0GBBYCAShwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci9hbm5vdGF0aW9ucy5kYXJ0LXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2lyL2Nsb3N1cmUuZGFydLp3Ly8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwoKLy8vIENvbGxlY3Rpb24gb2Ygc2NvcGUgZGF0YSBjb2xsZWN0ZWQgZm9yIGEgc2luZ2xlIG1lbWJlci4KY2xhc3MgQ2xvc3VyZVNjb3BlTW9kZWwgewogIC8vLyBDb2xsZWN0aW9uIFtTY29wZUluZm9dIGRhdGEgZm9yIHRoZSBtZW1iZXIuCiAgS2VybmVsU2NvcGVJbmZvIHNjb3BlSW5mbzsKCiAgLy8vIENvbGxlY3RlZCBbQ2FwdHVyZWRTY29wZV0gZGF0YSBmb3Igbm9kZXMuCiAgTWFwPGlyLk5vZGUsIEtlcm5lbENhcHR1cmVkU2NvcGU+IGNhcHR1cmVkU2NvcGVzTWFwID0KICAgICAgPGlyLk5vZGUsIEtlcm5lbENhcHR1cmVkU2NvcGU+e307CgogIC8vLyBDb2xsZWN0ZWQgW1Njb3BlSW5mb10gZGF0YSBmb3Igbm9kZXMuCiAgTWFwPGlyLlRyZWVOb2RlLCBLZXJuZWxTY29wZUluZm8+IGNsb3N1cmVzVG9HZW5lcmF0ZSA9CiAgICAgIDxpci5UcmVlTm9kZSwgS2VybmVsU2NvcGVJbmZvPnt9OwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gJyRzY29wZUluZm9cbiRjYXB0dXJlZFNjb3Blc01hcFxuJGNsb3N1cmVzVG9HZW5lcmF0ZSc7CiAgfQp9CgpjbGFzcyBLZXJuZWxTY29wZUluZm8gewogIGZpbmFsIFNldDxpci5WYXJpYWJsZURlY2xhcmF0aW9uPiBsb2NhbHNVc2VkSW5UcnlPclN5bmM7CiAgZmluYWwgYm9vbCBoYXNUaGlzTG9jYWw7CiAgZmluYWwgU2V0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+IGJveGVkVmFyaWFibGVzOwogIC8vIElmIGJveGVkVmFyaWFibGVzIGlzIGVtcHR5LCB0aGlzIHdpbGwgYmUgbnVsbCwgYmVjYXVzZSBubyB2YXJpYWJsZXMgd2lsbAogIC8vIG5lZWQgdG8gYmUgYm94ZWQuCiAgZmluYWwgTm9kZUJveCBjYXB0dXJlZFZhcmlhYmxlc0FjY2Vzc29yOwoKICAvLy8gVGhlIHNldCBvZiB2YXJpYWJsZXMgdGhhdCB3ZXJlIGRlZmluZWQgaW4gYW5vdGhlciBzY29wZSwgYnV0IGFyZSB1c2VkIGluCiAgLy8vIHRoaXMgc2NvcGUuIFRoZSBpdGVtcyBpbiB0aGlzIHNldCBhcmUgZWl0aGVyIG9mIHR5cGUgVmFyaWFibGVEZWNsYXJhdGlvbgogIC8vLyBvciBUeXBlUGFyYW1ldGVyVHlwZVdpdGhDb250ZXh0LgogIFNldDxpci5Ob2RlIC8qIFZhcmlhYmxlRGVjbGFyYXRpb24gfCBUeXBlUGFyYW1ldGVyVHlwZVdpdGhDb250ZXh0ICovID4KICAgICAgZnJlZVZhcmlhYmxlcyA9IG5ldyBTZXQ8aXIuTm9kZT4oKTsKCiAgLy8vIEEgc2V0IG9mIHR5cGUgcGFyYW1ldGVycyB0aGF0IGFyZSBkZWZpbmVkIGluIGFub3RoZXIgc2NvcGUgYW5kIGFyZSBvbmx5CiAgLy8vIHVzZWQgaWYgcnVudGltZSB0eXBlIGluZm9ybWF0aW9uIGlzIGNoZWNrZWQuIElmIHJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbgogIC8vLyBuZWVkcyB0byBiZSByZXRhaW5lZCwgYWxsIG9mIHRoZXNlIHR5cGUgdmFyaWFibGVzIHdpbGwgYmUgYWRkZWQgb3QgdGhlCiAgLy8vIGZyZWVWYXJpYWJsZXMgc2V0LiBXaGV0aGVyIHRoZXNlIHZhcmlhYmxlcyBhcmUgYWN0dWFsbHkgdXNlZCBhcwogIC8vLyBmcmVlVmFyaWFibGVzIHdpbGwgYmUgc2V0IGJ5IHRoZSB0aW1lIHRoaXMgc3RydWN0dXJlIGlzIGNvbnZlcnRlZCB0byBhCiAgLy8vIEpzU2NvcGVJbmZvLCBzbyBKc1Njb3BlSW5mbyBkb2VzIG5vdCBuZWVkIHRvIHVzZSB0aGVtLgogIE1hcDxUeXBlVmFyaWFibGVUeXBlV2l0aENvbnRleHQsIFNldDxWYXJpYWJsZVVzZT4+IGZyZWVWYXJpYWJsZXNGb3JSdGkgPQogICAgICA8VHlwZVZhcmlhYmxlVHlwZVdpdGhDb250ZXh0LCBTZXQ8VmFyaWFibGVVc2U+Pnt9OwoKICAvLy8gSWYgdHJ1ZSwgYHRoaXNgIGlzIHVzZWQgYXMgYSBmcmVlIHZhcmlhYmxlLCBpbiB0aGlzIHNjb3BlLiBJdCBpcyBzdG9yZWQKICAvLy8gc2VwYXJhdGVseSBmcm9tIFtmcmVlVmFyaWFibGVzXSBiZWNhdXNlIHRoZXJlIGlzIG5vIHNpbmdsZQogIC8vLyBgVmFyaWFibGVEZWNsYXJhdGlvbmAgbm9kZSB0aGF0IHJlcHJlc2VudHMgYHRoaXNgLgogIGJvb2wgdGhpc1VzZWRBc0ZyZWVWYXJpYWJsZSA9IGZhbHNlOwoKICAvLy8gSWYgdHJ1ZSwgYHRoaXNgIGlzIHVzZWQgYXMgYSBmcmVlIHZhcmlhYmxlLCBpbiB0aGlzIHNjb3BlIGlmIHdlIGFyZSBhbHNvCiAgLy8vIHBlcmZvcm1pbmcgcnVudGltZSB0eXBlIGNoZWNrcy4gSXQgaXMgc3RvcmVkCiAgLy8vIHNlcGFyYXRlbHkgZnJvbSBbdGhpc1VzZWRBc0ZyZWVWYXJpYWJsZV0gYmVjYXVzZSB3ZSBkb24ndCBrbm93IGF0IHRoaXMKICAvLy8gc3RhZ2UgaWYgd2Ugd2lsbCBiZSBuZWVkaW5nIHR5cGUgY2hlY2tzIGZvciB0aGlzIHNjb3BlLgogIFNldDxWYXJpYWJsZVVzZT4gdGhpc1VzZWRBc0ZyZWVWYXJpYWJsZUlmTmVlZHNSdGkgPSBuZXcgU2V0PFZhcmlhYmxlVXNlPigpOwoKICBLZXJuZWxTY29wZUluZm8odGhpcy5oYXNUaGlzTG9jYWwpCiAgICAgIDogbG9jYWxzVXNlZEluVHJ5T3JTeW5jID0gbmV3IFNldDxpci5WYXJpYWJsZURlY2xhcmF0aW9uPigpLAogICAgICAgIGJveGVkVmFyaWFibGVzID0gbmV3IFNldDxpci5WYXJpYWJsZURlY2xhcmF0aW9uPigpLAogICAgICAgIGNhcHR1cmVkVmFyaWFibGVzQWNjZXNzb3IgPSBudWxsOwoKICBLZXJuZWxTY29wZUluZm8uZnJvbSh0aGlzLmhhc1RoaXNMb2NhbCwgS2VybmVsU2NvcGVJbmZvIGluZm8pCiAgICAgIDogbG9jYWxzVXNlZEluVHJ5T3JTeW5jID0gaW5mby5sb2NhbHNVc2VkSW5UcnlPclN5bmMsCiAgICAgICAgYm94ZWRWYXJpYWJsZXMgPSBpbmZvLmJveGVkVmFyaWFibGVzLAogICAgICAgIGNhcHR1cmVkVmFyaWFibGVzQWNjZXNzb3IgPSBudWxsOwoKICBLZXJuZWxTY29wZUluZm8ud2l0aEJveGVkVmFyaWFibGVzKAogICAgICB0aGlzLmJveGVkVmFyaWFibGVzLAogICAgICB0aGlzLmNhcHR1cmVkVmFyaWFibGVzQWNjZXNzb3IsCiAgICAgIHRoaXMubG9jYWxzVXNlZEluVHJ5T3JTeW5jLAogICAgICB0aGlzLmZyZWVWYXJpYWJsZXMsCiAgICAgIHRoaXMuZnJlZVZhcmlhYmxlc0ZvclJ0aSwKICAgICAgdGhpcy50aGlzVXNlZEFzRnJlZVZhcmlhYmxlLAogICAgICB0aGlzLnRoaXNVc2VkQXNGcmVlVmFyaWFibGVJZk5lZWRzUnRpLAogICAgICB0aGlzLmhhc1RoaXNMb2NhbCk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCdLZXJuZWxTY29wZUluZm8odGhpcz0kaGFzVGhpc0xvY2FsLCcpOwogICAgc2Iud3JpdGUoJ2ZyZWVWcmlhYmxlcz0kZnJlZVZhcmlhYmxlcywnKTsKICAgIHNiLndyaXRlKCdsb2NhbHNVc2VkSW5UcnlPclN5bmM9eyR7bG9jYWxzVXNlZEluVHJ5T3JTeW5jLmpvaW4oJywgJyl9fScpOwogICAgU3RyaW5nIGNvbW1hID0gJyc7CiAgICBzYi53cml0ZSgnZnJlZVZhcmlhYmxlc0ZvclJ0aT17Jyk7CiAgICBmcmVlVmFyaWFibGVzRm9yUnRpLmZvckVhY2goKGtleSwgdmFsdWUpIHsKICAgICAgc2Iud3JpdGUoJyRjb21tYSRrZXk6JHZhbHVlJyk7CiAgICAgIGNvbW1hID0gJywnOwogICAgfSk7CiAgICBzYi53cml0ZSgnfSknKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQoKY2xhc3MgS2VybmVsQ2FwdHVyZWRTY29wZSBleHRlbmRzIEtlcm5lbFNjb3BlSW5mbyB7CiAgS2VybmVsQ2FwdHVyZWRTY29wZSgKICAgICAgU2V0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+IGJveGVkVmFyaWFibGVzLAogICAgICBOb2RlQm94IGNhcHR1cmVkVmFyaWFibGVzQWNjZXNzb3IsCiAgICAgIFNldDxpci5WYXJpYWJsZURlY2xhcmF0aW9uPiBsb2NhbHNVc2VkSW5UcnlPclN5bmMsCiAgICAgIFNldDxpci5Ob2RlIC8qIFZhcmlhYmxlRGVjbGFyYXRpb24gfCBUeXBlVmFyaWFibGVUeXBlV2l0aENvbnRleHQgKi8gPgogICAgICAgICAgZnJlZVZhcmlhYmxlcywKICAgICAgTWFwPFR5cGVWYXJpYWJsZVR5cGVXaXRoQ29udGV4dCwgU2V0PFZhcmlhYmxlVXNlPj4gZnJlZVZhcmlhYmxlc0ZvclJ0aSwKICAgICAgYm9vbCB0aGlzVXNlZEFzRnJlZVZhcmlhYmxlLAogICAgICBTZXQ8VmFyaWFibGVVc2U+IHRoaXNVc2VkQXNGcmVlVmFyaWFibGVJZk5lZWRzUnRpLAogICAgICBib29sIGhhc1RoaXNMb2NhbCkKICAgICAgOiBzdXBlci53aXRoQm94ZWRWYXJpYWJsZXMoCiAgICAgICAgICAgIGJveGVkVmFyaWFibGVzLAogICAgICAgICAgICBjYXB0dXJlZFZhcmlhYmxlc0FjY2Vzc29yLAogICAgICAgICAgICBsb2NhbHNVc2VkSW5UcnlPclN5bmMsCiAgICAgICAgICAgIGZyZWVWYXJpYWJsZXMsCiAgICAgICAgICAgIGZyZWVWYXJpYWJsZXNGb3JSdGksCiAgICAgICAgICAgIHRoaXNVc2VkQXNGcmVlVmFyaWFibGUsCiAgICAgICAgICAgIHRoaXNVc2VkQXNGcmVlVmFyaWFibGVJZk5lZWRzUnRpLAogICAgICAgICAgICBoYXNUaGlzTG9jYWwpOwoKICAvLyBMb29wcyB0aHJvdWdoIHRoZSBmcmVlIHZhcmlhYmxlcyBvZiBhbiBleGlzdGluZyBLZXJuZWxDYXB0dXJlZFNjb3BlIGFuZAogIC8vIGNyZWF0ZXMgYSBuZXcgS2VybmVsQ2FwdHVyZWRTY29wZSB0aGF0IG9ubHkgY2FwdHVyZXMgdHlwZSB2YXJpYWJsZXMuCiAgS2VybmVsQ2FwdHVyZWRTY29wZS5mb3JTaWduYXR1cmUoS2VybmVsQ2FwdHVyZWRTY29wZSBzY29wZSkKICAgICAgOiB0aGlzKAogICAgICAgICAgICBfZW1wdHksCiAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgIF9lbXB0eSwKICAgICAgICAgICAgc2NvcGUuZnJlZVZhcmlhYmxlcy53aGVyZSgKICAgICAgICAgICAgICAgIChpci5Ob2RlIHZhcmlhYmxlKSA9PiB2YXJpYWJsZSBpcyBUeXBlVmFyaWFibGVUeXBlV2l0aENvbnRleHQpLAogICAgICAgICAgICBzY29wZS5mcmVlVmFyaWFibGVzRm9yUnRpLAogICAgICAgICAgICBzY29wZS50aGlzVXNlZEFzRnJlZVZhcmlhYmxlLAogICAgICAgICAgICBzY29wZS50aGlzVXNlZEFzRnJlZVZhcmlhYmxlSWZOZWVkc1J0aSwKICAgICAgICAgICAgc2NvcGUuaGFzVGhpc0xvY2FsKTsKCiAgLy8gU2lsbHkgaGFjayBiZWNhdXNlIHdlIGRvbid0IGhhdmUgY29uc3Qgc2V0cy4KICBzdGF0aWMgZmluYWwgU2V0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+IF9lbXB0eSA9IG5ldyBTZXQoKTsKCiAgYm9vbCBnZXQgcmVxdWlyZXNDb250ZXh0Qm94ID0+IGJveGVkVmFyaWFibGVzLmlzTm90RW1wdHk7Cn0KCmNsYXNzIEtlcm5lbENhcHR1cmVkTG9vcFNjb3BlIGV4dGVuZHMgS2VybmVsQ2FwdHVyZWRTY29wZSB7CiAgZmluYWwgTGlzdDxpci5WYXJpYWJsZURlY2xhcmF0aW9uPiBib3hlZExvb3BWYXJpYWJsZXM7CgogIEtlcm5lbENhcHR1cmVkTG9vcFNjb3BlKAogICAgICBTZXQ8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4gYm94ZWRWYXJpYWJsZXMsCiAgICAgIE5vZGVCb3ggY2FwdHVyZWRWYXJpYWJsZXNBY2Nlc3NvciwKICAgICAgdGhpcy5ib3hlZExvb3BWYXJpYWJsZXMsCiAgICAgIFNldDxpci5WYXJpYWJsZURlY2xhcmF0aW9uPiBsb2NhbHNVc2VkSW5UcnlPclN5bmMsCiAgICAgIFNldDxpci5Ob2RlIC8qIFZhcmlhYmxlRGVjbGFyYXRpb24gfCBUeXBlVmFyaWFibGVUeXBlV2l0aENvbnRleHQgKi8gPgogICAgICAgICAgZnJlZVZhcmlhYmxlcywKICAgICAgTWFwPFR5cGVWYXJpYWJsZVR5cGVXaXRoQ29udGV4dCwgU2V0PFZhcmlhYmxlVXNlPj4gZnJlZVZhcmlhYmxlc0ZvclJ0aSwKICAgICAgYm9vbCB0aGlzVXNlZEFzRnJlZVZhcmlhYmxlLAogICAgICBTZXQ8VmFyaWFibGVVc2U+IHRoaXNVc2VkQXNGcmVlVmFyaWFibGVJZk5lZWRzUnRpLAogICAgICBib29sIGhhc1RoaXNMb2NhbCkKICAgICAgOiBzdXBlcigKICAgICAgICAgICAgYm94ZWRWYXJpYWJsZXMsCiAgICAgICAgICAgIGNhcHR1cmVkVmFyaWFibGVzQWNjZXNzb3IsCiAgICAgICAgICAgIGxvY2Fsc1VzZWRJblRyeU9yU3luYywKICAgICAgICAgICAgZnJlZVZhcmlhYmxlcywKICAgICAgICAgICAgZnJlZVZhcmlhYmxlc0ZvclJ0aSwKICAgICAgICAgICAgdGhpc1VzZWRBc0ZyZWVWYXJpYWJsZSwKICAgICAgICAgICAgdGhpc1VzZWRBc0ZyZWVWYXJpYWJsZUlmTmVlZHNSdGksCiAgICAgICAgICAgIGhhc1RoaXNMb2NhbCk7CgogIGJvb2wgZ2V0IGhhc0JveGVkTG9vcFZhcmlhYmxlcyA9PiBib3hlZExvb3BWYXJpYWJsZXMuaXNOb3RFbXB0eTsKfQoKLy8vIEEgbG9jYWwgdmFyaWFibGUgdG8gZGlzYW1iaWd1YXRlIGJldHdlZW4gYSB2YXJpYWJsZSB0aGF0IGhhcyBiZWVuIGNhcHR1cmVkCi8vLyBmcm9tIG9uZSBzY29wZSB0byBhbm90aGVyLiBUaGlzIGlzIHRoZSBpci5Ob2RlIHZlcnNpb24gdGhhdCBjb3JyZXNwb25kcyB0bwovLy8gW0JveExvY2FsXS4KY2xhc3MgTm9kZUJveCB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgZmluYWwgaXIuVHJlZU5vZGUgZXhlY3V0YWJsZUNvbnRleHQ7CiAgTm9kZUJveCh0aGlzLm5hbWUsIHRoaXMuZXhlY3V0YWJsZUNvbnRleHQpOwp9CgplbnVtIFZhcmlhYmxlVXNlS2luZCB7CiAgLy8vIEFuIGV4cGxpY2l0IHZhcmlhYmxlIHVzZS4KICAvLy8KICAvLy8gRm9yIHR5cGUgdmFyaWFibGUgdGhpcyBpcyBhbiBleHBsaWNpdCBhcy1jYXN0LCBhbiBpcy10ZXN0IG9yIGEgdHlwZQogIC8vLyBsaXRlcmFsLgogIGV4cGxpY2l0LAoKICAvLy8gQSB0eXBlIHZhcmlhYmxlIHVzZWQgaW4gdGhlIHR5cGUgb2YgYSBsb2NhbCB2YXJpYWJsZS4KICBsb2NhbFR5cGUsCgogIC8vLyBBIHR5cGUgdmFyaWFibGUgdXNlZCBpbiBhbiBpbXBsaWNpdCBjYXN0LgogIGltcGxpY2l0Q2FzdCwKCiAgLy8vIEEgdHlwZSB2YXJpYWJsZSBwYXNzZWQgYXMgdGhlIHR5cGUgYXJndW1lbnQgb2YgYSBsaXN0IGxpdGVyYWwuCiAgbGlzdExpdGVyYWwsCgogIC8vLyBBIHR5cGUgdmFyaWFibGUgcGFzc2VkIGFzIHRoZSB0eXBlIGFyZ3VtZW50IG9mIGEgc2V0IGxpdGVyYWwuCiAgc2V0TGl0ZXJhbCwKCiAgLy8vIEEgdHlwZSB2YXJpYWJsZSBwYXNzZWQgYXMgdGhlIHR5cGUgYXJndW1lbnQgb2YgYSBtYXAgbGl0ZXJhbC4KICBtYXBMaXRlcmFsLAoKICAvLy8gQSB0eXBlIHZhcmlhYmxlIHBhc3NlZCBhcyBhIHR5cGUgYXJndW1lbnQgdG8gYSBjb25zdHJ1Y3Rvci4KICBjb25zdHJ1Y3RvclR5cGVBcmd1bWVudCwKCiAgLy8vIEEgdHlwZSB2YXJpYWJsZSBwYXNzZWQgYXMgYSB0eXBlIGFyZ3VtZW50IHRvIGEgc3RhdGljIG1ldGhvZC4KICBzdGF0aWNUeXBlQXJndW1lbnQsCgogIC8vLyBBIHR5cGUgdmFyaWFibGUgcGFzc2VkIGFzIGEgdHlwZSBhcmd1bWVudCB0byBhbiBpbnN0YW5jZSBtZXRob2QuCiAgaW5zdGFuY2VUeXBlQXJndW1lbnQsCgogIC8vLyBBIHR5cGUgdmFyaWFibGUgcGFzc2VkIGFzIGEgdHlwZSBhcmd1bWVudCB0byBhIGxvY2FsIGZ1bmN0aW9uLgogIGxvY2FsVHlwZUFyZ3VtZW50LAoKICAvLy8gQSB0eXBlIHZhcmlhYmxlIGluIGEgcGFyYW1ldGVyIHR5cGUgb2YgYSBtZW1iZXIuCiAgbWVtYmVyUGFyYW1ldGVyLAoKICAvLy8gQSB0eXBlIHZhcmlhYmxlIGluIGEgcGFyYW1ldGVyIHR5cGUgb2YgYSBsb2NhbCBmdW5jdGlvbi4KICBsb2NhbFBhcmFtZXRlciwKCiAgLy8vIEEgdHlwZSB2YXJpYWJsZSB1c2VkIGluIGEgcmV0dXJuIHR5cGUgb2YgYSBtZW1iZXIuCiAgbWVtYmVyUmV0dXJuVHlwZSwKCiAgLy8vIEEgdHlwZSB2YXJpYWJsZSB1c2VkIGluIGEgcmV0dXJuIHR5cGUgb2YgYSBsb2NhbCBmdW5jdGlvbi4KICBsb2NhbFJldHVyblR5cGUsCgogIC8vLyBBIHR5cGUgdmFyaWFibGUgaW4gYSBmaWVsZCB0eXBlLgogIGZpZWxkVHlwZSwKCiAgLy8vIEEgdHlwZSBhcmd1bWVudCBvZiBhbiBnZW5lcmljIGluc3RhbnRpYXRpb24uCiAgaW5zdGFudGlhdGlvblR5cGVBcmd1bWVudCwKfQoKY2xhc3MgVmFyaWFibGVVc2UgewogIGZpbmFsIFZhcmlhYmxlVXNlS2luZCBraW5kOwogIGZpbmFsIGlyLk1lbWJlciBtZW1iZXI7CiAgZmluYWwgaXIuVHJlZU5vZGUgLyppci5GdW5jdGlvbkRlY2xhcmF0aW9ufGlyLkZ1bmN0aW9uRXhwcmVzc2lvbiovCiAgICAgIGxvY2FsRnVuY3Rpb247CiAgZmluYWwgaXIuTWV0aG9kSW52b2NhdGlvbiBpbnZvY2F0aW9uOwogIGZpbmFsIGlyLkluc3RhbnRpYXRpb24gaW5zdGFudGlhdGlvbjsKCiAgY29uc3QgVmFyaWFibGVVc2UuX3NpbXBsZSh0aGlzLmtpbmQpCiAgICAgIDogdGhpcy5tZW1iZXIgPSBudWxsLAogICAgICAgIHRoaXMubG9jYWxGdW5jdGlvbiA9IG51bGwsCiAgICAgICAgdGhpcy5pbnZvY2F0aW9uID0gbnVsbCwKICAgICAgICB0aGlzLmluc3RhbnRpYXRpb24gPSBudWxsOwoKICBWYXJpYWJsZVVzZS5tZW1iZXJQYXJhbWV0ZXIodGhpcy5tZW1iZXIpCiAgICAgIDogdGhpcy5raW5kID0gVmFyaWFibGVVc2VLaW5kLm1lbWJlclBhcmFtZXRlciwKICAgICAgICB0aGlzLmxvY2FsRnVuY3Rpb24gPSBudWxsLAogICAgICAgIHRoaXMuaW52b2NhdGlvbiA9IG51bGwsCiAgICAgICAgdGhpcy5pbnN0YW50aWF0aW9uID0gbnVsbDsKCiAgVmFyaWFibGVVc2UubG9jYWxQYXJhbWV0ZXIodGhpcy5sb2NhbEZ1bmN0aW9uKQogICAgICA6IHRoaXMua2luZCA9IFZhcmlhYmxlVXNlS2luZC5sb2NhbFBhcmFtZXRlciwKICAgICAgICB0aGlzLm1lbWJlciA9IG51bGwsCiAgICAgICAgdGhpcy5pbnZvY2F0aW9uID0gbnVsbCwKICAgICAgICB0aGlzLmluc3RhbnRpYXRpb24gPSBudWxsIHsKICAgIGFzc2VydChsb2NhbEZ1bmN0aW9uIGlzIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24gfHwKICAgICAgICBsb2NhbEZ1bmN0aW9uIGlzIGlyLkZ1bmN0aW9uRXhwcmVzc2lvbik7CiAgfQoKICBWYXJpYWJsZVVzZS5tZW1iZXJSZXR1cm5UeXBlKHRoaXMubWVtYmVyKQogICAgICA6IHRoaXMua2luZCA9IFZhcmlhYmxlVXNlS2luZC5tZW1iZXJSZXR1cm5UeXBlLAogICAgICAgIHRoaXMubG9jYWxGdW5jdGlvbiA9IG51bGwsCiAgICAgICAgdGhpcy5pbnZvY2F0aW9uID0gbnVsbCwKICAgICAgICB0aGlzLmluc3RhbnRpYXRpb24gPSBudWxsOwoKICBWYXJpYWJsZVVzZS5sb2NhbFJldHVyblR5cGUodGhpcy5sb2NhbEZ1bmN0aW9uKQogICAgICA6IHRoaXMua2luZCA9IFZhcmlhYmxlVXNlS2luZC5sb2NhbFJldHVyblR5cGUsCiAgICAgICAgdGhpcy5tZW1iZXIgPSBudWxsLAogICAgICAgIHRoaXMuaW52b2NhdGlvbiA9IG51bGwsCiAgICAgICAgdGhpcy5pbnN0YW50aWF0aW9uID0gbnVsbCB7CiAgICBhc3NlcnQobG9jYWxGdW5jdGlvbiBpcyBpci5GdW5jdGlvbkRlY2xhcmF0aW9uIHx8CiAgICAgICAgbG9jYWxGdW5jdGlvbiBpcyBpci5GdW5jdGlvbkV4cHJlc3Npb24pOwogIH0KCiAgVmFyaWFibGVVc2UuY29uc3RydWN0b3JUeXBlQXJndW1lbnQodGhpcy5tZW1iZXIpCiAgICAgIDogdGhpcy5raW5kID0gVmFyaWFibGVVc2VLaW5kLmNvbnN0cnVjdG9yVHlwZUFyZ3VtZW50LAogICAgICAgIHRoaXMubG9jYWxGdW5jdGlvbiA9IG51bGwsCiAgICAgICAgdGhpcy5pbnZvY2F0aW9uID0gbnVsbCwKICAgICAgICB0aGlzLmluc3RhbnRpYXRpb24gPSBudWxsOwoKICBWYXJpYWJsZVVzZS5zdGF0aWNUeXBlQXJndW1lbnQodGhpcy5tZW1iZXIpCiAgICAgIDogdGhpcy5raW5kID0gVmFyaWFibGVVc2VLaW5kLnN0YXRpY1R5cGVBcmd1bWVudCwKICAgICAgICB0aGlzLmxvY2FsRnVuY3Rpb24gPSBudWxsLAogICAgICAgIHRoaXMuaW52b2NhdGlvbiA9IG51bGwsCiAgICAgICAgdGhpcy5pbnN0YW50aWF0aW9uID0gbnVsbDsKCiAgVmFyaWFibGVVc2UuaW5zdGFuY2VUeXBlQXJndW1lbnQodGhpcy5pbnZvY2F0aW9uKQogICAgICA6IHRoaXMua2luZCA9IFZhcmlhYmxlVXNlS2luZC5pbnN0YW5jZVR5cGVBcmd1bWVudCwKICAgICAgICB0aGlzLm1lbWJlciA9IG51bGwsCiAgICAgICAgdGhpcy5sb2NhbEZ1bmN0aW9uID0gbnVsbCwKICAgICAgICB0aGlzLmluc3RhbnRpYXRpb24gPSBudWxsOwoKICBWYXJpYWJsZVVzZS5sb2NhbFR5cGVBcmd1bWVudCh0aGlzLmxvY2FsRnVuY3Rpb24sIHRoaXMuaW52b2NhdGlvbikKICAgICAgOiB0aGlzLmtpbmQgPSBWYXJpYWJsZVVzZUtpbmQubG9jYWxUeXBlQXJndW1lbnQsCiAgICAgICAgdGhpcy5tZW1iZXIgPSBudWxsLAogICAgICAgIHRoaXMuaW5zdGFudGlhdGlvbiA9IG51bGwgewogICAgYXNzZXJ0KGxvY2FsRnVuY3Rpb24gaXMgaXIuRnVuY3Rpb25EZWNsYXJhdGlvbiB8fAogICAgICAgIGxvY2FsRnVuY3Rpb24gaXMgaXIuRnVuY3Rpb25FeHByZXNzaW9uKTsKICB9CgogIFZhcmlhYmxlVXNlLmluc3RhbnRpYXRpb25UeXBlQXJndW1lbnQodGhpcy5pbnN0YW50aWF0aW9uKQogICAgICA6IHRoaXMua2luZCA9IFZhcmlhYmxlVXNlS2luZC5pbnN0YW50aWF0aW9uVHlwZUFyZ3VtZW50LAogICAgICAgIHRoaXMubWVtYmVyID0gbnVsbCwKICAgICAgICB0aGlzLmxvY2FsRnVuY3Rpb24gPSBudWxsLAogICAgICAgIHRoaXMuaW52b2NhdGlvbiA9IG51bGw7CgogIHN0YXRpYyBjb25zdCBWYXJpYWJsZVVzZSBleHBsaWNpdCA9CiAgICAgIGNvbnN0IFZhcmlhYmxlVXNlLl9zaW1wbGUoVmFyaWFibGVVc2VLaW5kLmV4cGxpY2l0KTsKCiAgc3RhdGljIGNvbnN0IFZhcmlhYmxlVXNlIGxvY2FsVHlwZSA9CiAgICAgIGNvbnN0IFZhcmlhYmxlVXNlLl9zaW1wbGUoVmFyaWFibGVVc2VLaW5kLmxvY2FsVHlwZSk7CgogIHN0YXRpYyBjb25zdCBWYXJpYWJsZVVzZSBpbXBsaWNpdENhc3QgPQogICAgICBjb25zdCBWYXJpYWJsZVVzZS5fc2ltcGxlKFZhcmlhYmxlVXNlS2luZC5pbXBsaWNpdENhc3QpOwoKICBzdGF0aWMgY29uc3QgVmFyaWFibGVVc2UgbGlzdExpdGVyYWwgPQogICAgICBjb25zdCBWYXJpYWJsZVVzZS5fc2ltcGxlKFZhcmlhYmxlVXNlS2luZC5saXN0TGl0ZXJhbCk7CgogIHN0YXRpYyBjb25zdCBWYXJpYWJsZVVzZSBzZXRMaXRlcmFsID0KICAgICAgY29uc3QgVmFyaWFibGVVc2UuX3NpbXBsZShWYXJpYWJsZVVzZUtpbmQuc2V0TGl0ZXJhbCk7CgogIHN0YXRpYyBjb25zdCBWYXJpYWJsZVVzZSBtYXBMaXRlcmFsID0KICAgICAgY29uc3QgVmFyaWFibGVVc2UuX3NpbXBsZShWYXJpYWJsZVVzZUtpbmQubWFwTGl0ZXJhbCk7CgogIHN0YXRpYyBjb25zdCBWYXJpYWJsZVVzZSBmaWVsZFR5cGUgPQogICAgICBjb25zdCBWYXJpYWJsZVVzZS5fc2ltcGxlKFZhcmlhYmxlVXNlS2luZC5maWVsZFR5cGUpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+CiAgICAgIGtpbmQuaGFzaENvZGUgKiAxMSArCiAgICAgIG1lbWJlci5oYXNoQ29kZSAqIDEzICsKICAgICAgbG9jYWxGdW5jdGlvbi5oYXNoQ29kZSAqIDE3ICsKICAgICAgaW52b2NhdGlvbi5oYXNoQ29kZSAqIDE5ICsKICAgICAgaW5zdGFudGlhdGlvbi5oYXNoQ29kZSAqIDIzOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIFZhcmlhYmxlVXNlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4ga2luZCA9PSBvdGhlci5raW5kICYmCiAgICAgICAgbWVtYmVyID09IG90aGVyLm1lbWJlciAmJgogICAgICAgIGxvY2FsRnVuY3Rpb24gPT0gb3RoZXIubG9jYWxGdW5jdGlvbiAmJgogICAgICAgIGludm9jYXRpb24gPT0gb3RoZXIuaW52b2NhdGlvbiAmJgogICAgICAgIGluc3RhbnRpYXRpb24gPT0gb3RoZXIuaW5zdGFudGlhdGlvbjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdWYXJpYWJsZVVzZShraW5kPSRraW5kLG1lbWJlcj0kbWVtYmVyLCcKICAgICAgJ2xvY2FsRnVuY3Rpb249JGxvY2FsRnVuY3Rpb24saW52b2NhdGlvbj0kaW52b2NhdGlvbiwnCiAgICAgICdpbnN0YW50aWF0aW9uPSRpbnN0YW50aWF0aW9uKSc7Cn0KCmVudW0gVHlwZVZhcmlhYmxlS2luZCB7IGNscywgbWV0aG9kLCBsb2NhbCwgZnVuY3Rpb24gfQoKLy8vIEEgZmFrZSBpci5Ob2RlIHRoYXQgaG9sZHMgdGhlIFR5cGVQYXJhbWV0ZXJUeXBlIGFzIHdlbGwgYXMgdGhlIGNvbnRleHQgaW4KLy8vIHdoaWNoIGl0IG9jY3Vycy4KY2xhc3MgVHlwZVZhcmlhYmxlVHlwZVdpdGhDb250ZXh0IGltcGxlbWVudHMgaXIuTm9kZSB7CiAgZmluYWwgaXIuTm9kZSBjb250ZXh0OwogIGZpbmFsIGlyLlR5cGVQYXJhbWV0ZXJUeXBlIHR5cGU7CiAgZmluYWwgVHlwZVZhcmlhYmxlS2luZCBraW5kOwogIGZpbmFsIGlyLlRyZWVOb2RlIHR5cGVEZWNsYXJhdGlvbjsKCiAgLy8vIFtjb250ZXh0XSBjYW4gYmUgZWl0aGVyIGFuIGlyLk1lbWJlciBvciBhIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24gb3IKICAvLy8gaXIuRnVuY3Rpb25FeHByZXNzaW9uLgogIGZhY3RvcnkgVHlwZVZhcmlhYmxlVHlwZVdpdGhDb250ZXh0KAogICAgICBpci5UeXBlUGFyYW1ldGVyVHlwZSB0eXBlLCBpci5UcmVlTm9kZSBjb250ZXh0KSB7CiAgICBUeXBlVmFyaWFibGVLaW5kIGtpbmQ7CiAgICBpci5UcmVlTm9kZSB0eXBlRGVjbGFyYXRpb24gPSB0eXBlLnBhcmFtZXRlci5wYXJlbnQ7CiAgICBpZiAodHlwZURlY2xhcmF0aW9uID09IG51bGwpIHsKICAgICAgLy8gV2UgaGF2ZSBhIGZ1bmN0aW9uIHR5cGUgdmFyaWFibGUsIGxpa2UgYFRgIGluIGB2b2lkIEZ1bmN0aW9uPFQ+KGludClgLgogICAgICBraW5kID0gVHlwZVZhcmlhYmxlS2luZC5mdW5jdGlvbjsKICAgIH0gZWxzZSBpZiAodHlwZURlY2xhcmF0aW9uIGlzIGlyLkNsYXNzKSB7CiAgICAgIC8vIFdlIGhhdmUgYSBjbGFzcyB0eXBlIHZhcmlhYmxlLCBsaWtlIGBUYCBpbiBgY2xhc3MgQ2xhc3M8VD4geyAuLi4gfWAuCiAgICAgIGtpbmQgPSBUeXBlVmFyaWFibGVLaW5kLmNsczsKICAgIH0gZWxzZSBpZiAodHlwZURlY2xhcmF0aW9uLnBhcmVudCBpcyBpci5NZW1iZXIpIHsKICAgICAgaXIuTWVtYmVyIG1lbWJlciA9IHR5cGVEZWNsYXJhdGlvbi5wYXJlbnQ7CiAgICAgIGlmIChtZW1iZXIgaXMgaXIuQ29uc3RydWN0b3IgfHwKICAgICAgICAgIChtZW1iZXIgaXMgaXIuUHJvY2VkdXJlICYmIG1lbWJlci5pc0ZhY3RvcnkpKSB7CiAgICAgICAgLy8gV2UgaGF2ZSBhIHN5bnRoZXNpemVkIGdlbmVyaWMgbWV0aG9kIHR5cGUgdmFyaWFibGUgZm9yIGEgY2xhc3MgdHlwZQogICAgICAgIC8vIHZhcmlhYmxlLgogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEhhbmRsZSBjb25zdHJ1Y3Rvci9mYWN0b3J5IHR5cGUgdmFyaWFibGVzIGFzCiAgICAgICAgLy8gbWV0aG9kIHR5cGUgdmFyaWFibGVzLgogICAgICAgIGtpbmQgPSBUeXBlVmFyaWFibGVLaW5kLmNsczsKICAgICAgICB0eXBlRGVjbGFyYXRpb24gPSBtZW1iZXIuZW5jbG9zaW5nQ2xhc3M7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gV2UgaGF2ZSBhIGdlbmVyaWMgbWV0aG9kIHR5cGUgdmFyaWFibGUsIGxpa2UgYFRgIGluCiAgICAgICAgLy8gYG08VD4oKSB7IC4uLiB9YC4KICAgICAgICBraW5kID0gVHlwZVZhcmlhYmxlS2luZC5tZXRob2Q7CiAgICAgICAgdHlwZURlY2xhcmF0aW9uID0gdHlwZURlY2xhcmF0aW9uLnBhcmVudDsKICAgICAgICBjb250ZXh0ID0gdHlwZURlY2xhcmF0aW9uOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBXZSBoYXZlIGEgZ2VuZXJpYyBsb2NhbCBmdW5jdGlvbiB0eXBlIHZhcmlhYmxlLCBsaWtlIGBUYCBpbgogICAgICAvLyBgbSgpIHsgbG9jYWw8VD4oKSB7IC4uLiB9IC4uLiB9YC4KICAgICAgYXNzZXJ0KAogICAgICAgICAgdHlwZURlY2xhcmF0aW9uLnBhcmVudCBpcyBpci5GdW5jdGlvbkV4cHJlc3Npb24gfHwKICAgICAgICAgICAgICB0eXBlRGVjbGFyYXRpb24ucGFyZW50IGlzIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24sCiAgICAgICAgICAiVW5leHBlY3RlZCB0eXBlIGRlY2xhcmF0aW9uOiAkdHlwZURlY2xhcmF0aW9uIik7CiAgICAgIGtpbmQgPSBUeXBlVmFyaWFibGVLaW5kLmxvY2FsOwogICAgICB0eXBlRGVjbGFyYXRpb24gPSB0eXBlRGVjbGFyYXRpb24ucGFyZW50OwogICAgICBjb250ZXh0ID0gdHlwZURlY2xhcmF0aW9uOwogICAgfQogICAgcmV0dXJuIG5ldyBUeXBlVmFyaWFibGVUeXBlV2l0aENvbnRleHQuaW50ZXJuYWwoCiAgICAgICAgdHlwZSwgY29udGV4dCwga2luZCwgdHlwZURlY2xhcmF0aW9uKTsKICB9CgogIFR5cGVWYXJpYWJsZVR5cGVXaXRoQ29udGV4dC5pbnRlcm5hbCgKICAgICAgdGhpcy50eXBlLCB0aGlzLmNvbnRleHQsIHRoaXMua2luZCwgdGhpcy50eXBlRGVjbGFyYXRpb24pOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoaXIuVmlzaXRvciB2KSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignVHlwZVZhcmlhYmxlVHlwZVdpdGhDb250ZXh0LmFjY2VwdCcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDaGlsZHJlbihpci5WaXNpdG9yIHYpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdUeXBlVmFyaWFibGVUeXBlV2l0aENvbnRleHQudmlzaXRDaGlsZHJlbicpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiB0eXBlLmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMhIFR5cGVWYXJpYWJsZVR5cGVXaXRoQ29udGV4dCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHR5cGUgPT0gb3RoZXIudHlwZSAmJiBjb250ZXh0ID09IG90aGVyLmNvbnRleHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PgogICAgICAnVHlwZVZhcmlhYmxlVHlwZVdpdGhDb250ZXh0KHR5cGU9JHR5cGUsY29udGV4dD0kY29udGV4dCwnCiAgICAgICdraW5kPSRraW5kLHR5cGVEZWNsYXJhdGlvbj0kdHlwZURlY2xhcmF0aW9uKSc7Cn0Kga8ATk48ASgBPBoyHQEwOCgBLDkoAQwWQgQCARg7GzROFysBT08nSSoBTk9NRk09SzkBTkE5JwFPM00+TgElQzwqAUA8LioBJhsmIhogIy0aAQwWKjUuTRcnLyUTCBQaBAIBNBcyKTlMGU4jORkiHCcjGyEkLhsBTUo+DhQSFCdQJyo0IQEyPwE8AgE8OQEbMikfOUwZTiM5GQ8cJyMbISQuGwFDAgFPTxAQFScuAgEXIAZKDwwBPA0BMBABRQ8BRA4BRA4BQhsBRBYBRxgBRRUBNxMBPxIBORQBQRMBJw0BMx0CARQeGkUVKCgBJxwjICMBKzUjICMBMTQcICQ2MQQBLDYjICMBMjUcICQ2MQQBMz0jICMBLjgjICMBNDocIyMBRTccJDYxBAE8PxwjIAEmOwEnPAEqPwEpPgEoPQEoPQEnPAEMFhsdJCEjAQwcLS0hIjAqLgQBDEA9JwIBNwFOFTcZIx8lAUodJzgbOSNQKC5OIzYxJjpPFU0iJTEPPx0oMiMIDUUrDj1APCUwIQY1LwQBKEEBDBlGBAEMIE0EAQwlAQwcPTsEAQwXQTYCASRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci9jbG9zdXJlLmRhcnQsc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaXIvaW1wYWN0LmRhcnTAAGAULy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV91bnN0YWJsZS9kYXJ0MmpzLmRhcnQnCiAgICBzaG93IG9wZXJhdG9yRnJvbVN0cmluZzsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQnIGFzIGlyOwoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnY29uc3RhbnRzLmRhcnQnOwppbXBvcnQgJ2ltcGFjdF9kYXRhLmRhcnQnOwppbXBvcnQgJ3J1bnRpbWVfdHlwZV9hbmFseXNpcy5kYXJ0JzsKaW1wb3J0ICdzY29wZS5kYXJ0JzsKaW1wb3J0ICdzdGF0aWNfdHlwZS5kYXJ0JzsKaW1wb3J0ICdzdGF0aWNfdHlwZV9iYXNlLmRhcnQnOwppbXBvcnQgJ3V0aWwuZGFydCc7CgovLy8gSW50ZXJmYWNlIGZvciBjb2xsZWN0aW5nIHdvcmxkIGltcGFjdCBkYXRhLgovLy8KLy8vIFRoaXMgaXMgdXNlZCBib3RoIGZvciBkaXJlY3Qgd29ybGQgaW1wYWN0IGNvbXB1dGF0aW9uIHRocm91Z2ggdGhlCi8vLyBbS2VybmVsSW1wYWN0QnVpbGRlcl0gYW5kIGZvciBzZXJpYWxpemF0aW9uIHRocm91Z2ggdGhlIFtJbXBhY3RCdWlsZGVyXQovLy8gYW5kIFtJbXBhY3RMb2FkZXJdLgphYnN0cmFjdCBjbGFzcyBJbXBhY3RSZWdpc3RyeSB7CiAgdm9pZCByZWdpc3RlckludExpdGVyYWwoaW50IHZhbHVlKTsKCiAgdm9pZCByZWdpc3RlckRvdWJsZUxpdGVyYWwoZG91YmxlIHZhbHVlKTsKCiAgdm9pZCByZWdpc3RlckJvb2xMaXRlcmFsKGJvb2wgdmFsdWUpOwoKICB2b2lkIHJlZ2lzdGVyU3RyaW5nTGl0ZXJhbChTdHJpbmcgdmFsdWUpOwoKICB2b2lkIHJlZ2lzdGVyU3ltYm9sTGl0ZXJhbChTdHJpbmcgdmFsdWUpOwoKICB2b2lkIHJlZ2lzdGVyTnVsbExpdGVyYWwoKTsKCiAgdm9pZCByZWdpc3Rlckxpc3RMaXRlcmFsKGlyLkRhcnRUeXBlIGVsZW1lbnRUeXBlLAogICAgICB7Ym9vbCBpc0NvbnN0LCBib29sIGlzRW1wdHl9KTsKCiAgdm9pZCByZWdpc3RlclNldExpdGVyYWwoaXIuRGFydFR5cGUgZWxlbWVudFR5cGUsCiAgICAgIHtib29sIGlzQ29uc3QsIGJvb2wgaXNFbXB0eX0pOwoKICB2b2lkIHJlZ2lzdGVyTWFwTGl0ZXJhbChpci5EYXJ0VHlwZSBrZXlUeXBlLCBpci5EYXJ0VHlwZSB2YWx1ZVR5cGUsCiAgICAgIHtib29sIGlzQ29uc3QsIGJvb2wgaXNFbXB0eX0pOwoKICB2b2lkIHJlZ2lzdGVyU3RhdGljVGVhck9mZigKICAgICAgaXIuUHJvY2VkdXJlIHByb2NlZHVyZSwgaXIuTGlicmFyeURlcGVuZGVuY3kgaW1wb3J0KTsKCiAgdm9pZCByZWdpc3RlclN0YXRpY0dldChpci5NZW1iZXIgbWVtYmVyLCBpci5MaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQpOwoKICB2b2lkIHJlZ2lzdGVyU3RhdGljU2V0KGlyLk1lbWJlciBtZW1iZXIsIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydCk7CgogIHZvaWQgcmVnaXN0ZXJBc3NlcnQoe2Jvb2wgd2l0aE1lc3NhZ2V9KTsKCiAgdm9pZCByZWdpc3RlckdlbmVyaWNJbnN0YW50aWF0aW9uKAogICAgICBpci5GdW5jdGlvblR5cGUgZXhwcmVzc2lvblR5cGUsIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMpOwoKICB2b2lkIHJlZ2lzdGVyU3luY1N0YXIoaXIuRGFydFR5cGUgZWxlbWVudFR5cGUpOwoKICB2b2lkIHJlZ2lzdGVyQXN5bmMoaXIuRGFydFR5cGUgZWxlbWVudFR5cGUpOwoKICB2b2lkIHJlZ2lzdGVyQXN5bmNTdGFyKGlyLkRhcnRUeXBlIGVsZW1lbnRUeXBlKTsKCiAgdm9pZCByZWdpc3RlclN0cmluZ0NvbmNhdGVuYXRpb24oKTsKCiAgdm9pZCByZWdpc3RlckxvY2FsRnVuY3Rpb24oaXIuVHJlZU5vZGUgbm9kZSk7CgogIHZvaWQgcmVnaXN0ZXJMb2NhbFdpdGhvdXRJbml0aWFsaXplcigpOwoKICB2b2lkIHJlZ2lzdGVySXNDaGVjayhpci5EYXJ0VHlwZSB0eXBlKTsKCiAgdm9pZCByZWdpc3RlckltcGxpY2l0Q2FzdChpci5EYXJ0VHlwZSB0eXBlKTsKCiAgdm9pZCByZWdpc3RlckFzQ2FzdChpci5EYXJ0VHlwZSB0eXBlKTsKCiAgdm9pZCByZWdpc3RlclRocm93KCk7CgogIHZvaWQgcmVnaXN0ZXJTeW5jRm9ySW4oaXIuRGFydFR5cGUgaXRlcmFibGVUeXBlKTsKCiAgdm9pZCByZWdpc3RlckFzeW5jRm9ySW4oaXIuRGFydFR5cGUgaXRlcmFibGVUeXBlKTsKCiAgdm9pZCByZWdpc3RlckNhdGNoKCk7CgogIHZvaWQgcmVnaXN0ZXJTdGFja1RyYWNlKCk7CgogIHZvaWQgcmVnaXN0ZXJDYXRjaFR5cGUoaXIuRGFydFR5cGUgdHlwZSk7CgogIHZvaWQgcmVnaXN0ZXJUeXBlTGl0ZXJhbChpci5EYXJ0VHlwZSB0eXBlLCBpci5MaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQpOwoKICB2b2lkIHJlZ2lzdGVyRmllbGRJbml0aWFsaXphdGlvbihpci5GaWVsZCBub2RlKTsKCiAgdm9pZCByZWdpc3RlckZpZWxkQ29uc3RhbnRJbml0aWFsaXphdGlvbigKICAgICAgaXIuRmllbGQgbm9kZSwgQ29uc3RhbnRSZWZlcmVuY2UgY29uc3RhbnQpOwoKICB2b2lkIHJlZ2lzdGVyTG9hZExpYnJhcnkoKTsKCiAgdm9pZCByZWdpc3RlclJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIoCiAgICAgIGlyLkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yLAogICAgICBpbnQgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzLAogICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzKTsKCiAgdm9pZCByZWdpc3RlclBhcmFtZXRlckNoZWNrKGlyLkRhcnRUeXBlIHR5cGUpOwoKICB2b2lkIHJlZ2lzdGVyTGF6eUZpZWxkKCk7CgogIHZvaWQgcmVnaXN0ZXJOZXcoCiAgICAgIGlyLk1lbWJlciBjb25zdHJ1Y3RvciwKICAgICAgaXIuSW50ZXJmYWNlVHlwZSB0eXBlLAogICAgICBpbnQgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzLAogICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzLAogICAgICBpci5MaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQsCiAgICAgIHtib29sIGlzQ29uc3R9KTsKCiAgdm9pZCByZWdpc3RlckNvbnN0SW5zdGFudGlhdGlvbihpci5DbGFzcyBjbHMsIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMsCiAgICAgIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydCk7CgogIHZvaWQgcmVnaXN0ZXJTdGF0aWNJbnZvY2F0aW9uKAogICAgICBpci5Qcm9jZWR1cmUgdGFyZ2V0LAogICAgICBpbnQgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzLAogICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzLAogICAgICBpci5MaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQpOwoKICB2b2lkIHJlZ2lzdGVyTG9jYWxGdW5jdGlvbkludm9jYXRpb24oCiAgICAgIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24gbG9jYWxGdW5jdGlvbiwKICAgICAgaW50IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIExpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cywKICAgICAgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyk7CgogIHZvaWQgcmVnaXN0ZXJEeW5hbWljSW52b2NhdGlvbigKICAgICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlLAogICAgICBDbGFzc1JlbGF0aW9uIHJlbGF0aW9uLAogICAgICBpci5OYW1lIG5hbWUsCiAgICAgIGludCBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHMsCiAgICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMpOwoKICB2b2lkIHJlZ2lzdGVySW5zdGFuY2VJbnZvY2F0aW9uKAogICAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsCiAgICAgIENsYXNzUmVsYXRpb24gcmVsYXRpb24sCiAgICAgIGlyLk1lbWJlciB0YXJnZXQsCiAgICAgIGludCBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHMsCiAgICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMpOwoKICB2b2lkIHJlZ2lzdGVyRnVuY3Rpb25JbnZvY2F0aW9uKAogICAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsCiAgICAgIGludCBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHMsCiAgICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMpOwoKICB2b2lkIHJlZ2lzdGVyRHluYW1pY0dldCgKICAgICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlLCBDbGFzc1JlbGF0aW9uIHJlbGF0aW9uLCBpci5OYW1lIG5hbWUpOwoKICB2b2lkIHJlZ2lzdGVySW5zdGFuY2VHZXQoCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwgQ2xhc3NSZWxhdGlvbiByZWxhdGlvbiwgaXIuTWVtYmVyIHRhcmdldCk7CgogIHZvaWQgcmVnaXN0ZXJEeW5hbWljU2V0KAogICAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsIENsYXNzUmVsYXRpb24gcmVsYXRpb24sIGlyLk5hbWUgbmFtZSk7CgogIHZvaWQgcmVnaXN0ZXJJbnN0YW5jZVNldCgKICAgICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlLCBDbGFzc1JlbGF0aW9uIHJlbGF0aW9uLCBpci5NZW1iZXIgdGFyZ2V0KTsKCiAgdm9pZCByZWdpc3RlclN1cGVySW52b2NhdGlvbihpci5OYW1lIG5hbWUsIGludCBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHMsIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMpOwoKICB2b2lkIHJlZ2lzdGVyU3VwZXJHZXQoaXIuTmFtZSBuYW1lKTsKCiAgdm9pZCByZWdpc3RlclN1cGVyU2V0KGlyLk5hbWUgbmFtZSk7CgogIHZvaWQgcmVnaXN0ZXJTdXBlckluaXRpYWxpemVyKAogICAgICBpci5Db25zdHJ1Y3RvciBzb3VyY2UsCiAgICAgIGlyLkNvbnN0cnVjdG9yIHRhcmdldCwKICAgICAgaW50IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIExpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cywKICAgICAgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyk7CgogIHZvaWQgcmVnaXN0ZXJSdW50aW1lVHlwZVVzZShpci5Qcm9wZXJ0eUdldCBub2RlLCBSdW50aW1lVHlwZVVzZUtpbmQga2luZCwKICAgICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlLCBpci5EYXJ0VHlwZSBhcmd1bWVudFR5cGUpOwoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhlc2Ugd2hlbiBDRkUgcHJvdmlkZXMgY29uc3RhbnRzLgogIHZvaWQgcmVnaXN0ZXJDb25zdHJ1Y3Rvck5vZGUoaXIuQ29uc3RydWN0b3Igbm9kZSk7CiAgdm9pZCByZWdpc3RlckZpZWxkTm9kZShpci5GaWVsZCBub2RlKTsKICB2b2lkIHJlZ2lzdGVyUHJvY2VkdXJlTm9kZShpci5Qcm9jZWR1cmUgbm9kZSk7CiAgdm9pZCByZWdpc3RlclN0YXRpY0ludm9jYXRpb25Ob2RlKGlyLlN0YXRpY0ludm9jYXRpb24gbm9kZSk7CiAgdm9pZCByZWdpc3RlclN3aXRjaFN0YXRlbWVudE5vZGUoaXIuU3dpdGNoU3RhdGVtZW50IG5vZGUpOwogIHZvaWQgcmVnaXN0ZXJDb25zdENvbnN0cnVjdG9ySW52b2NhdGlvbk5vZGUoaXIuQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpOwp9CgphYnN0cmFjdCBjbGFzcyBJbXBhY3RCdWlsZGVyQmFzZSBleHRlbmRzIFN0YXRpY1R5cGVWaXNpdG9yCiAgICBpbXBsZW1lbnRzIEltcGFjdFJlZ2lzdHJ5IHsKICBAb3ZlcnJpZGUKICBmaW5hbCBWYXJpYWJsZVNjb3BlTW9kZWwgdmFyaWFibGVTY29wZU1vZGVsOwoKICBJbXBhY3RCdWlsZGVyQmFzZShpci5UeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LAogICAgICBpci5DbGFzc0hpZXJhcmNoeSBjbGFzc0hpZXJhcmNoeSwgdGhpcy52YXJpYWJsZVNjb3BlTW9kZWwpCiAgICAgIDogc3VwZXIodHlwZUVudmlyb25tZW50LCBjbGFzc0hpZXJhcmNoeSk7CgogIENsYXNzUmVsYXRpb24gX2NvbXB1dGVDbGFzc1JlbGF0aW9uRnJvbVR5cGUoaXIuRGFydFR5cGUgdHlwZSkgewogICAgaWYgKHR5cGUgaXMgVGhpc0ludGVyZmFjZVR5cGUpIHsKICAgICAgcmV0dXJuIENsYXNzUmVsYXRpb24udGhpc0V4cHJlc3Npb247CiAgICB9IGVsc2UgaWYgKHR5cGUgaXMgRXhhY3RJbnRlcmZhY2VUeXBlKSB7CiAgICAgIHJldHVybiBDbGFzc1JlbGF0aW9uLmV4YWN0OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIENsYXNzUmVsYXRpb24uc3VidHlwZTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW50TGl0ZXJhbChpci5JbnRMaXRlcmFsIG5vZGUpIHsKICAgIHJlZ2lzdGVySW50TGl0ZXJhbChub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRG91YmxlTGl0ZXJhbChpci5Eb3VibGVMaXRlcmFsIG5vZGUpIHsKICAgIHJlZ2lzdGVyRG91YmxlTGl0ZXJhbChub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQm9vbExpdGVyYWwoaXIuQm9vbExpdGVyYWwgbm9kZSkgewogICAgcmVnaXN0ZXJCb29sTGl0ZXJhbChub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU3RyaW5nTGl0ZXJhbChpci5TdHJpbmdMaXRlcmFsIG5vZGUpIHsKICAgIHJlZ2lzdGVyU3RyaW5nTGl0ZXJhbChub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU3ltYm9sTGl0ZXJhbChpci5TeW1ib2xMaXRlcmFsIG5vZGUpIHsKICAgIHJlZ2lzdGVyU3ltYm9sTGl0ZXJhbChub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTnVsbExpdGVyYWwoaXIuTnVsbExpdGVyYWwgbm9kZSkgewogICAgcmVnaXN0ZXJOdWxsTGl0ZXJhbCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVMaXN0TGl0ZXJhbChpci5MaXN0TGl0ZXJhbCBub2RlKSB7CiAgICByZWdpc3Rlckxpc3RMaXRlcmFsKG5vZGUudHlwZUFyZ3VtZW50LAogICAgICAgIGlzQ29uc3Q6IG5vZGUuaXNDb25zdCwgaXNFbXB0eTogbm9kZS5leHByZXNzaW9ucy5pc0VtcHR5KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU2V0TGl0ZXJhbChpci5TZXRMaXRlcmFsIG5vZGUpIHsKICAgIHJlZ2lzdGVyU2V0TGl0ZXJhbChub2RlLnR5cGVBcmd1bWVudCwKICAgICAgICBpc0NvbnN0OiBub2RlLmlzQ29uc3QsIGlzRW1wdHk6IG5vZGUuZXhwcmVzc2lvbnMuaXNFbXB0eSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU1hcExpdGVyYWwoaXIuTWFwTGl0ZXJhbCBub2RlKSB7CiAgICByZWdpc3Rlck1hcExpdGVyYWwobm9kZS5rZXlUeXBlLCBub2RlLnZhbHVlVHlwZSwKICAgICAgICBpc0NvbnN0OiBub2RlLmlzQ29uc3QsIGlzRW1wdHk6IG5vZGUuZW50cmllcy5pc0VtcHR5KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU3RhdGljR2V0KGlyLlN0YXRpY0dldCBub2RlLCBpci5EYXJ0VHlwZSByZXN1bHRUeXBlKSB7CiAgICBpci5NZW1iZXIgdGFyZ2V0ID0gbm9kZS50YXJnZXQ7CiAgICBpZiAodGFyZ2V0IGlzIGlyLlByb2NlZHVyZSAmJiB0YXJnZXQua2luZCA9PSBpci5Qcm9jZWR1cmVLaW5kLk1ldGhvZCkgewogICAgICByZWdpc3RlclN0YXRpY1RlYXJPZmYodGFyZ2V0LCBnZXREZWZlcnJlZEltcG9ydChub2RlKSk7CiAgICB9IGVsc2UgewogICAgICByZWdpc3RlclN0YXRpY0dldCh0YXJnZXQsIGdldERlZmVycmVkSW1wb3J0KG5vZGUpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU3RhdGljU2V0KGlyLlN0YXRpY1NldCBub2RlLCBpci5EYXJ0VHlwZSB2YWx1ZVR5cGUpIHsKICAgIHJlZ2lzdGVyU3RhdGljU2V0KG5vZGUudGFyZ2V0LCBnZXREZWZlcnJlZEltcG9ydChub2RlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUFzc2VydFN0YXRlbWVudChpci5Bc3NlcnRTdGF0ZW1lbnQgbm9kZSkgewogICAgcmVnaXN0ZXJBc3NlcnQod2l0aE1lc3NhZ2U6IG5vZGUubWVzc2FnZSAhPSBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW5zdGFudGlhdGlvbihpci5JbnN0YW50aWF0aW9uIG5vZGUsCiAgICAgIGlyLkZ1bmN0aW9uVHlwZSBleHByZXNzaW9uVHlwZSwgaXIuRGFydFR5cGUgcmVzdWx0VHlwZSkgewogICAgcmVnaXN0ZXJHZW5lcmljSW5zdGFudGlhdGlvbihleHByZXNzaW9uVHlwZSwgbm9kZS50eXBlQXJndW1lbnRzKTsKICB9CgogIHZvaWQgaGFuZGxlQXN5bmNNYXJrZXIoaXIuRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uKSB7CiAgICBpci5Bc3luY01hcmtlciBhc3luY01hcmtlciA9IGZ1bmN0aW9uLmFzeW5jTWFya2VyOwogICAgaXIuRGFydFR5cGUgcmV0dXJuVHlwZSA9IGZ1bmN0aW9uLnJldHVyblR5cGU7CgogICAgc3dpdGNoIChhc3luY01hcmtlcikgewogICAgICBjYXNlIGlyLkFzeW5jTWFya2VyLlN5bmM6CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgaXIuQXN5bmNNYXJrZXIuU3luY1N0YXI6CiAgICAgICAgaXIuRGFydFR5cGUgZWxlbWVudFR5cGUgPSBjb25zdCBpci5EeW5hbWljVHlwZSgpOwogICAgICAgIGlmIChyZXR1cm5UeXBlIGlzIGlyLkludGVyZmFjZVR5cGUpIHsKICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmNsYXNzTm9kZSA9PSB0eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzLml0ZXJhYmxlQ2xhc3MpIHsKICAgICAgICAgICAgZWxlbWVudFR5cGUgPSByZXR1cm5UeXBlLnR5cGVBcmd1bWVudHMuZmlyc3Q7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJlZ2lzdGVyU3luY1N0YXIoZWxlbWVudFR5cGUpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBpci5Bc3luY01hcmtlci5Bc3luYzoKICAgICAgICBpci5EYXJ0VHlwZSBlbGVtZW50VHlwZSA9IGNvbnN0IGlyLkR5bmFtaWNUeXBlKCk7CiAgICAgICAgaWYgKHJldHVyblR5cGUgaXMgaXIuSW50ZXJmYWNlVHlwZSkgewogICAgICAgICAgaWYgKHJldHVyblR5cGUuY2xhc3NOb2RlID09IHR5cGVFbnZpcm9ubWVudC5jb3JlVHlwZXMuZnV0dXJlT3JDbGFzcykgewogICAgICAgICAgICBlbGVtZW50VHlwZSA9IHJldHVyblR5cGUudHlwZUFyZ3VtZW50cy5maXJzdDsKICAgICAgICAgIH0gZWxzZSBpZiAocmV0dXJuVHlwZS5jbGFzc05vZGUgPT0KICAgICAgICAgICAgICB0eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzLmZ1dHVyZUNsYXNzKSB7CiAgICAgICAgICAgIGVsZW1lbnRUeXBlID0gcmV0dXJuVHlwZS50eXBlQXJndW1lbnRzLmZpcnN0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZWdpc3RlckFzeW5jKGVsZW1lbnRUeXBlKTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgaXIuQXN5bmNNYXJrZXIuQXN5bmNTdGFyOgogICAgICAgIGlyLkRhcnRUeXBlIGVsZW1lbnRUeXBlID0gY29uc3QgaXIuRHluYW1pY1R5cGUoKTsKICAgICAgICBpZiAocmV0dXJuVHlwZSBpcyBpci5JbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgICBpZiAocmV0dXJuVHlwZS5jbGFzc05vZGUgPT0gdHlwZUVudmlyb25tZW50LmNvcmVUeXBlcy5zdHJlYW1DbGFzcykgewogICAgICAgICAgICBlbGVtZW50VHlwZSA9IHJldHVyblR5cGUudHlwZUFyZ3VtZW50cy5maXJzdDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmVnaXN0ZXJBc3luY1N0YXIoZWxlbWVudFR5cGUpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBpci5Bc3luY01hcmtlci5TeW5jWWllbGRpbmc6CiAgICAgICAgZmFpbGVkQXQoQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICAgICAgIlVuZXhwZWN0ZWQgYXN5bmMgbWFya2VyOiAke2FzeW5jTWFya2VyfSIpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTdHJpbmdDb25jYXRlbmF0aW9uKGlyLlN0cmluZ0NvbmNhdGVuYXRpb24gbm9kZSkgewogICAgcmVnaXN0ZXJTdHJpbmdDb25jYXRlbmF0aW9uKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBOdWxsIGhhbmRsZUZ1bmN0aW9uRGVjbGFyYXRpb24oaXIuRnVuY3Rpb25EZWNsYXJhdGlvbiBub2RlKSB7CiAgICByZWdpc3RlckxvY2FsRnVuY3Rpb24obm9kZSk7CiAgICBoYW5kbGVBc3luY01hcmtlcihub2RlLmZ1bmN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRnVuY3Rpb25FeHByZXNzaW9uKGlyLkZ1bmN0aW9uRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZWdpc3RlckxvY2FsRnVuY3Rpb24obm9kZSk7CiAgICBoYW5kbGVBc3luY01hcmtlcihub2RlLmZ1bmN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVmFyaWFibGVEZWNsYXJhdGlvbihpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIGlmIChub2RlLmluaXRpYWxpemVyID09IG51bGwpIHsKICAgICAgcmVnaXN0ZXJMb2NhbFdpdGhvdXRJbml0aWFsaXplcigpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJc0V4cHJlc3Npb24oaXIuSXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJlZ2lzdGVySXNDaGVjayhub2RlLnR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVBc0V4cHJlc3Npb24oaXIuQXNFeHByZXNzaW9uIG5vZGUsIGlyLkRhcnRUeXBlIG9wZXJhbmRUeXBlKSB7CiAgICBpZiAodHlwZUVudmlyb25tZW50LmlzU3VidHlwZU9mKG9wZXJhbmRUeXBlLCBub2RlLnR5cGUpKSB7CiAgICAgIC8vIFNraXAgdW5uZWVkZWQgY2FzdHMuCiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChub2RlLmlzVHlwZUVycm9yKSB7CiAgICAgIHJlZ2lzdGVySW1wbGljaXRDYXN0KG5vZGUudHlwZSk7CiAgICB9IGVsc2UgewogICAgICByZWdpc3RlckFzQ2FzdChub2RlLnR5cGUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVUaHJvdyhpci5UaHJvdyBub2RlKSB7CiAgICByZWdpc3RlclRocm93KCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUZvckluU3RhdGVtZW50KGlyLkZvckluU3RhdGVtZW50IG5vZGUsIGlyLkRhcnRUeXBlIGl0ZXJhYmxlVHlwZSkgewogICAgaWYgKG5vZGUuaXNBc3luYykgewogICAgICByZWdpc3RlckFzeW5jRm9ySW4oaXRlcmFibGVUeXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlZ2lzdGVyU3luY0ZvckluKGl0ZXJhYmxlVHlwZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNhdGNoKGlyLkNhdGNoIG5vZGUpIHsKICAgIHJlZ2lzdGVyQ2F0Y2goKTsKICAgIGlmIChub2RlLnN0YWNrVHJhY2UgIT0gbnVsbCkgewogICAgICByZWdpc3RlclN0YWNrVHJhY2UoKTsKICAgIH0KICAgIGlmIChub2RlLmd1YXJkIGlzISBpci5EeW5hbWljVHlwZSkgewogICAgICByZWdpc3RlckNhdGNoVHlwZShub2RlLmd1YXJkKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVHlwZUxpdGVyYWwoaXIuVHlwZUxpdGVyYWwgbm9kZSkgewogICAgcmVnaXN0ZXJUeXBlTGl0ZXJhbChub2RlLnR5cGUsIGdldERlZmVycmVkSW1wb3J0KG5vZGUpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRmllbGRJbml0aWFsaXplcihpci5GaWVsZEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHJlZ2lzdGVyRmllbGRJbml0aWFsaXphdGlvbihub2RlLmZpZWxkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTG9hZExpYnJhcnkoaXIuTG9hZExpYnJhcnkgbm9kZSkgewogICAgcmVnaXN0ZXJMb2FkTGlicmFyeSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVSZWRpcmVjdGluZ0luaXRpYWxpemVyKAogICAgICBpci5SZWRpcmVjdGluZ0luaXRpYWxpemVyIG5vZGUsIEFyZ3VtZW50VHlwZXMgYXJndW1lbnRUeXBlcykgewogICAgcmVnaXN0ZXJSZWRpcmVjdGluZ0luaXRpYWxpemVyKAogICAgICAgIG5vZGUudGFyZ2V0LAogICAgICAgIG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoLAogICAgICAgIF9nZXROYW1lZEFyZ3VtZW50cyhub2RlLmFyZ3VtZW50cyksCiAgICAgICAgbm9kZS5hcmd1bWVudHMudHlwZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVQYXJhbWV0ZXIoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIpIHsKICAgIHJlZ2lzdGVyUGFyYW1ldGVyQ2hlY2socGFyYW1ldGVyLnR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTaWduYXR1cmUoaXIuRnVuY3Rpb25Ob2RlIG5vZGUpIHsKICAgIGZvciAoaXIuVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIgaW4gbm9kZS50eXBlUGFyYW1ldGVycykgewogICAgICByZWdpc3RlclBhcmFtZXRlckNoZWNrKHBhcmFtZXRlci5ib3VuZCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNvbnN0cnVjdG9yKGlyLkNvbnN0cnVjdG9yIG5vZGUpIHsKICAgIHJlZ2lzdGVyQ29uc3RydWN0b3JOb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVGaWVsZChpci5GaWVsZCBmaWVsZCkgewogICAgcmVnaXN0ZXJQYXJhbWV0ZXJDaGVjayhmaWVsZC50eXBlKTsKICAgIGlmIChmaWVsZC5pbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgIGlmICghZmllbGQuaXNJbnN0YW5jZU1lbWJlciAmJgogICAgICAgICAgIWZpZWxkLmlzQ29uc3QgJiYKICAgICAgICAgIGZpZWxkLmluaXRpYWxpemVyIGlzISBpci5OdWxsTGl0ZXJhbCkgewogICAgICAgIHJlZ2lzdGVyTGF6eUZpZWxkKCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlZ2lzdGVyTnVsbExpdGVyYWwoKTsKICAgIH0KICAgIHJlZ2lzdGVyRmllbGROb2RlKGZpZWxkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlUHJvY2VkdXJlKGlyLlByb2NlZHVyZSBwcm9jZWR1cmUpIHsKICAgIGhhbmRsZUFzeW5jTWFya2VyKHByb2NlZHVyZS5mdW5jdGlvbik7CiAgICByZWdpc3RlclByb2NlZHVyZU5vZGUocHJvY2VkdXJlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ29uc3RydWN0b3JJbnZvY2F0aW9uKGlyLkNvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlLAogICAgICBBcmd1bWVudFR5cGVzIGFyZ3VtZW50VHlwZXMsIGlyLkRhcnRUeXBlIHJlc3VsdFR5cGUpIHsKICAgIHJlZ2lzdGVyTmV3KAogICAgICAgIG5vZGUudGFyZ2V0LAogICAgICAgIG5vZGUuY29uc3RydWN0ZWRUeXBlLAogICAgICAgIG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoLAogICAgICAgIF9nZXROYW1lZEFyZ3VtZW50cyhub2RlLmFyZ3VtZW50cyksCiAgICAgICAgbm9kZS5hcmd1bWVudHMudHlwZXMsCiAgICAgICAgZ2V0RGVmZXJyZWRJbXBvcnQobm9kZSksCiAgICAgICAgaXNDb25zdDogbm9kZS5pc0NvbnN0KTsKICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgcmVnaXN0ZXJDb25zdENvbnN0cnVjdG9ySW52b2NhdGlvbk5vZGUobm9kZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVN0YXRpY0ludm9jYXRpb24oaXIuU3RhdGljSW52b2NhdGlvbiBub2RlLAogICAgICBBcmd1bWVudFR5cGVzIGFyZ3VtZW50VHlwZXMsIGlyLkRhcnRUeXBlIHJldHVyblR5cGUpIHsKICAgIGludCBwb3NpdGlvbkFyZ3VtZW50cyA9IG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoOwogICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzID0gX2dldE5hbWVkQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKTsKICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPSBub2RlLmFyZ3VtZW50cy50eXBlczsKICAgIGlmIChub2RlLnRhcmdldC5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuRmFjdG9yeSkgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBXZSBzaG91bGQgbm90IG1hcmsgdGhlIHR5cGUgYXMgaW5zdGFudGlhdGVkIGJ1dAogICAgICAvLyByYXRoZXIgZm9sbG93IHRoZSB0eXBlIGFyZ3VtZW50cyBkaXJlY3RseS4KICAgICAgLy8KICAgICAgLy8gQ29uc2lkZXIgdGhpczoKICAgICAgLy8KICAgICAgLy8gICAgYWJzdHJhY3QgY2xhc3MgQTxUPiB7CiAgICAgIC8vICAgICAgZmFjdG9yeSBBLnJlZ3VsYXIoKSA9PiBuZXcgQjxUPigpOwogICAgICAvLyAgICAgIGZhY3RvcnkgQS5yZWRpcmVjdCgpID0gQjxUPjsKICAgICAgLy8gICAgfQogICAgICAvLwogICAgICAvLyAgICBjbGFzcyBCPFQ+IGltcGxlbWVudHMgQTxUPiB7fQogICAgICAvLwogICAgICAvLyAgICBtYWluKCkgewogICAgICAvLyAgICAgIHByaW50KG5ldyBBPGludD4ucmVndWxhcigpIGlzIEI8aW50Pik7CiAgICAgIC8vICAgICAgcHJpbnQobmV3IEE8U3RyaW5nPi5yZWRpcmVjdCgpIGlzIEI8U3RyaW5nPik7CiAgICAgIC8vICAgIH0KICAgICAgLy8KICAgICAgLy8gVG8gdHJhY2sgdGhhdCBCIGlzIGFjdHVhbGx5IGluc3RhbnRpYXRlZCBhcyBCPGludD4gYW5kIEI8U3RyaW5nPiB3ZQogICAgICAvLyBuZWVkIHRvIGZvbGxvdyB0aGUgdHlwZSBhcmd1bWVudHMgcGFzc2VkIHRvIEEucmVndWxhciBhbmQgQS5yZWRpcmVjdAogICAgICAvLyB0byBCLiBDdXJyZW50bHksIHdlIG9ubHkgZG8gdGhpcyBzb3VuZGx5IGlmIHdlIHJlZ2lzdGVyIEE8aW50PiBhbmQKICAgICAgLy8gQTxTdHJpbmc+IGFzIGluc3RhbnRpYXRlZC4gV2Ugc2hvdWxkIGluc3RlYWQgcmVnaXN0ZXIgdGhhdCBBLlQgaXMKICAgICAgLy8gaW5zdGFudGlhdGVkIGFzIGludCBhbmQgU3RyaW5nLgogICAgICByZWdpc3Rlck5ldygKICAgICAgICAgIG5vZGUudGFyZ2V0LAogICAgICAgICAgbmV3IGlyLkludGVyZmFjZVR5cGUobm9kZS50YXJnZXQuZW5jbG9zaW5nQ2xhc3MsIHR5cGVBcmd1bWVudHMpLAogICAgICAgICAgcG9zaXRpb25Bcmd1bWVudHMsCiAgICAgICAgICBuYW1lZEFyZ3VtZW50cywKICAgICAgICAgIG5vZGUuYXJndW1lbnRzLnR5cGVzLAogICAgICAgICAgZ2V0RGVmZXJyZWRJbXBvcnQobm9kZSksCiAgICAgICAgICBpc0NvbnN0OiBub2RlLmlzQ29uc3QpOwogICAgfSBlbHNlIHsKICAgICAgcmVnaXN0ZXJTdGF0aWNJbnZvY2F0aW9uKG5vZGUudGFyZ2V0LCBwb3NpdGlvbkFyZ3VtZW50cywgbmFtZWRBcmd1bWVudHMsCiAgICAgICAgICB0eXBlQXJndW1lbnRzLCBnZXREZWZlcnJlZEltcG9ydChub2RlKSk7CiAgICB9CiAgICByZWdpc3RlclN0YXRpY0ludm9jYXRpb25Ob2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVNZXRob2RJbnZvY2F0aW9uKAogICAgICBpci5NZXRob2RJbnZvY2F0aW9uIG5vZGUsCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwKICAgICAgQXJndW1lbnRUeXBlcyBhcmd1bWVudFR5cGVzLAogICAgICBpci5EYXJ0VHlwZSByZXR1cm5UeXBlKSB7CiAgICBpbnQgcG9zaXRpb25Bcmd1bWVudHMgPSBub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aDsKICAgIExpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cyA9IF9nZXROYW1lZEFyZ3VtZW50cyhub2RlLmFyZ3VtZW50cyk7CiAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0gbm9kZS5hcmd1bWVudHMudHlwZXM7CiAgICBpci5FeHByZXNzaW9uIHJlY2VpdmVyID0gbm9kZS5yZWNlaXZlcjsKICAgIGlmIChyZWNlaXZlciBpcyBpci5WYXJpYWJsZUdldCAmJgogICAgICAgIHJlY2VpdmVyLnZhcmlhYmxlLmlzRmluYWwgJiYKICAgICAgICByZWNlaXZlci52YXJpYWJsZS5wYXJlbnQgaXMgaXIuRnVuY3Rpb25EZWNsYXJhdGlvbikgewogICAgICByZWdpc3RlckxvY2FsRnVuY3Rpb25JbnZvY2F0aW9uKHJlY2VpdmVyLnZhcmlhYmxlLnBhcmVudCwKICAgICAgICAgIHBvc2l0aW9uQXJndW1lbnRzLCBuYW1lZEFyZ3VtZW50cywgdHlwZUFyZ3VtZW50cyk7CiAgICB9IGVsc2UgewogICAgICBDbGFzc1JlbGF0aW9uIHJlbGF0aW9uID0gX2NvbXB1dGVDbGFzc1JlbGF0aW9uRnJvbVR5cGUocmVjZWl2ZXJUeXBlKTsKCiAgICAgIGlyLk1lbWJlciBpbnRlcmZhY2VUYXJnZXQgPSBub2RlLmludGVyZmFjZVRhcmdldDsKICAgICAgaWYgKGludGVyZmFjZVRhcmdldCA9PSBudWxsKSB7CiAgICAgICAgcmVnaXN0ZXJEeW5hbWljSW52b2NhdGlvbihyZWNlaXZlclR5cGUsIHJlbGF0aW9uLCBub2RlLm5hbWUsCiAgICAgICAgICAgIHBvc2l0aW9uQXJndW1lbnRzLCBuYW1lZEFyZ3VtZW50cywgdHlwZUFyZ3VtZW50cyk7CiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQXZvaWQgdHJlYXRpbmcgYSBrbm93biBmdW5jdGlvbiBjYWxsIGFzIGEKICAgICAgICAvLyBkeW5hbWljIGNhbGwgd2hlbiBDRkUgcHJvdmlkZXMgYSB3YXkgdG8gZGlzdGluZ3Vpc2ggdGhlIHR3by4KICAgICAgICBpZiAob3BlcmF0b3JGcm9tU3RyaW5nKG5vZGUubmFtZS5uYW1lKSA9PSBudWxsICYmCiAgICAgICAgICAgIHJlY2VpdmVyVHlwZSBpcyBpci5EeW5hbWljVHlwZSkgewogICAgICAgICAgLy8gV2UgbWlnaHQgaW1wbGljaXRseSBjYWxsIGEgZ2V0dGVyIHRoYXQgcmV0dXJucyBhIGZ1bmN0aW9uLgogICAgICAgICAgcmVnaXN0ZXJGdW5jdGlvbkludm9jYXRpb24oY29uc3QgaXIuRHluYW1pY1R5cGUoKSwgcG9zaXRpb25Bcmd1bWVudHMsCiAgICAgICAgICAgICAgbmFtZWRBcmd1bWVudHMsIHR5cGVBcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoaW50ZXJmYWNlVGFyZ2V0IGlzIGlyLkZpZWxkIHx8CiAgICAgICAgICAgIGludGVyZmFjZVRhcmdldCBpcyBpci5Qcm9jZWR1cmUgJiYKICAgICAgICAgICAgICAgIGludGVyZmFjZVRhcmdldC5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuR2V0dGVyKSB7CiAgICAgICAgICByZWdpc3Rlckluc3RhbmNlSW52b2NhdGlvbihyZWNlaXZlclR5cGUsIHJlbGF0aW9uLCBpbnRlcmZhY2VUYXJnZXQsCiAgICAgICAgICAgICAgcG9zaXRpb25Bcmd1bWVudHMsIG5hbWVkQXJndW1lbnRzLCB0eXBlQXJndW1lbnRzKTsKICAgICAgICAgIHJlZ2lzdGVyRnVuY3Rpb25JbnZvY2F0aW9uKGludGVyZmFjZVRhcmdldC5nZXR0ZXJUeXBlLAogICAgICAgICAgICAgIHBvc2l0aW9uQXJndW1lbnRzLCBuYW1lZEFyZ3VtZW50cywgdHlwZUFyZ3VtZW50cyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlZ2lzdGVySW5zdGFuY2VJbnZvY2F0aW9uKHJlY2VpdmVyVHlwZSwgcmVsYXRpb24sIGludGVyZmFjZVRhcmdldCwKICAgICAgICAgICAgICBwb3NpdGlvbkFyZ3VtZW50cywgbmFtZWRBcmd1bWVudHMsIHR5cGVBcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVEaXJlY3RNZXRob2RJbnZvY2F0aW9uKAogICAgICBpci5EaXJlY3RNZXRob2RJbnZvY2F0aW9uIG5vZGUsCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwKICAgICAgQXJndW1lbnRUeXBlcyBhcmd1bWVudFR5cGVzLAogICAgICBpci5EYXJ0VHlwZSByZXR1cm5UeXBlKSB7CiAgICByZWdpc3Rlckluc3RhbmNlSW52b2NhdGlvbigKICAgICAgICByZWNlaXZlclR5cGUsCiAgICAgICAgQ2xhc3NSZWxhdGlvbi5leGFjdCwKICAgICAgICBub2RlLnRhcmdldCwKICAgICAgICBub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCwKICAgICAgICBfZ2V0TmFtZWRBcmd1bWVudHMobm9kZS5hcmd1bWVudHMpLAogICAgICAgIG5vZGUuYXJndW1lbnRzLnR5cGVzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlUHJvcGVydHlHZXQoCiAgICAgIGlyLlByb3BlcnR5R2V0IG5vZGUsIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwgaXIuRGFydFR5cGUgcmVzdWx0VHlwZSkgewogICAgQ2xhc3NSZWxhdGlvbiByZWxhdGlvbiA9IF9jb21wdXRlQ2xhc3NSZWxhdGlvbkZyb21UeXBlKHJlY2VpdmVyVHlwZSk7CiAgICBpZiAobm9kZS5pbnRlcmZhY2VUYXJnZXQgIT0gbnVsbCkgewogICAgICByZWdpc3Rlckluc3RhbmNlR2V0KHJlY2VpdmVyVHlwZSwgcmVsYXRpb24sIG5vZGUuaW50ZXJmYWNlVGFyZ2V0KTsKICAgIH0gZWxzZSB7CiAgICAgIHJlZ2lzdGVyRHluYW1pY0dldChyZWNlaXZlclR5cGUsIHJlbGF0aW9uLCBub2RlLm5hbWUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVEaXJlY3RQcm9wZXJ0eUdldChpci5EaXJlY3RQcm9wZXJ0eUdldCBub2RlLAogICAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsIGlyLkRhcnRUeXBlIHJlc3VsdFR5cGUpIHsKICAgIHJlZ2lzdGVySW5zdGFuY2VHZXQocmVjZWl2ZXJUeXBlLCBDbGFzc1JlbGF0aW9uLmV4YWN0LCBub2RlLnRhcmdldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVByb3BlcnR5U2V0KAogICAgICBpci5Qcm9wZXJ0eVNldCBub2RlLCBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsIGlyLkRhcnRUeXBlIHZhbHVlVHlwZSkgewogICAgQ2xhc3NSZWxhdGlvbiByZWxhdGlvbiA9IF9jb21wdXRlQ2xhc3NSZWxhdGlvbkZyb21UeXBlKHJlY2VpdmVyVHlwZSk7CiAgICBpZiAobm9kZS5pbnRlcmZhY2VUYXJnZXQgIT0gbnVsbCkgewogICAgICByZWdpc3Rlckluc3RhbmNlU2V0KHJlY2VpdmVyVHlwZSwgcmVsYXRpb24sIG5vZGUuaW50ZXJmYWNlVGFyZ2V0KTsKICAgIH0gZWxzZSB7CiAgICAgIHJlZ2lzdGVyRHluYW1pY1NldChyZWNlaXZlclR5cGUsIHJlbGF0aW9uLCBub2RlLm5hbWUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVEaXJlY3RQcm9wZXJ0eVNldChpci5EaXJlY3RQcm9wZXJ0eVNldCBub2RlLAogICAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsIGlyLkRhcnRUeXBlIHZhbHVlVHlwZSkgewogICAgcmVnaXN0ZXJJbnN0YW5jZVNldChyZWNlaXZlclR5cGUsIENsYXNzUmVsYXRpb24uZXhhY3QsIG5vZGUudGFyZ2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU3VwZXJNZXRob2RJbnZvY2F0aW9uKGlyLlN1cGVyTWV0aG9kSW52b2NhdGlvbiBub2RlLAogICAgICBBcmd1bWVudFR5cGVzIGFyZ3VtZW50VHlwZXMsIGlyLkRhcnRUeXBlIHJldHVyblR5cGUpIHsKICAgIHJlZ2lzdGVyU3VwZXJJbnZvY2F0aW9uKG5vZGUubmFtZSwgbm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGgsCiAgICAgICAgX2dldE5hbWVkQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKSwgbm9kZS5hcmd1bWVudHMudHlwZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTdXBlclByb3BlcnR5R2V0KAogICAgICBpci5TdXBlclByb3BlcnR5R2V0IG5vZGUsIGlyLkRhcnRUeXBlIHJlc3VsdFR5cGUpIHsKICAgIHJlZ2lzdGVyU3VwZXJHZXQobm9kZS5uYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU3VwZXJQcm9wZXJ0eVNldChpci5TdXBlclByb3BlcnR5U2V0IG5vZGUsIGlyLkRhcnRUeXBlIHZhbHVlVHlwZSkgewogICAgcmVnaXN0ZXJTdXBlclNldChub2RlLm5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTdXBlckluaXRpYWxpemVyKAogICAgICBpci5TdXBlckluaXRpYWxpemVyIG5vZGUsIEFyZ3VtZW50VHlwZXMgYXJndW1lbnRUeXBlcykgewogICAgcmVnaXN0ZXJTdXBlckluaXRpYWxpemVyKAogICAgICAgIG5vZGUucGFyZW50LAogICAgICAgIG5vZGUudGFyZ2V0LAogICAgICAgIG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoLAogICAgICAgIF9nZXROYW1lZEFyZ3VtZW50cyhub2RlLmFyZ3VtZW50cyksCiAgICAgICAgbm9kZS5hcmd1bWVudHMudHlwZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgTnVsbCB2aXNpdFN3aXRjaFN0YXRlbWVudChpci5Td2l0Y2hTdGF0ZW1lbnQgbm9kZSkgewogICAgcmVnaXN0ZXJTd2l0Y2hTdGF0ZW1lbnROb2RlKG5vZGUpOwogICAgcmV0dXJuIHN1cGVyLnZpc2l0U3dpdGNoU3RhdGVtZW50KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVSdW50aW1lVHlwZVVzZShpci5Qcm9wZXJ0eUdldCBub2RlLCBSdW50aW1lVHlwZVVzZUtpbmQga2luZCwKICAgICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlLCBpci5EYXJ0VHlwZSBhcmd1bWVudFR5cGUpIHsKICAgIHJlZ2lzdGVyUnVudGltZVR5cGVVc2Uobm9kZSwga2luZCwgcmVjZWl2ZXJUeXBlLCBhcmd1bWVudFR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDb25zdGFudEV4cHJlc3Npb24oaXIuQ29uc3RhbnRFeHByZXNzaW9uIG5vZGUpIHsKICAgIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydCA9IGdldERlZmVycmVkSW1wb3J0KG5vZGUpOwogICAgbm9kZS5jb25zdGFudC5hY2NlcHQobmV3IENvbnN0YW50SW1wYWN0VmlzaXRvcih0aGlzLCBpbXBvcnQsIG5vZGUpKTsKICB9Cn0KCi8vLyBWaXNpdG9yIHRoYXQgYnVpbGRzIGFuIFtJbXBhY3REYXRhXSBvYmplY3QgZm9yIHRoZSB3b3JsZCBpbXBhY3QuCmNsYXNzIEltcGFjdEJ1aWxkZXIgZXh0ZW5kcyBJbXBhY3RCdWlsZGVyQmFzZSB3aXRoIEltcGFjdFJlZ2lzdHJ5TWl4aW4gewogIEBvdmVycmlkZQogIGZpbmFsIGJvb2wgdXNlQXNzZXJ0czsKCiAgQG92ZXJyaWRlCiAgZmluYWwgaW5mZXJFZmZlY3RpdmVseUZpbmFsVmFyaWFibGVUeXBlczsKCiAgSW1wYWN0QnVpbGRlcihpci5UeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LAogICAgICBpci5DbGFzc0hpZXJhcmNoeSBjbGFzc0hpZXJhcmNoeSwgVmFyaWFibGVTY29wZU1vZGVsIHZhcmlhYmxlU2NvcGVNb2RlbCwKICAgICAge3RoaXMudXNlQXNzZXJ0czogZmFsc2UsIHRoaXMuaW5mZXJFZmZlY3RpdmVseUZpbmFsVmFyaWFibGVUeXBlczogdHJ1ZX0pCiAgICAgIDogc3VwZXIodHlwZUVudmlyb25tZW50LCBjbGFzc0hpZXJhcmNoeSwgdmFyaWFibGVTY29wZU1vZGVsKTsKCiAgSW1wYWN0QnVpbGRlckRhdGEgY29tcHV0ZUltcGFjdChpci5NZW1iZXIgbm9kZSkgewogICAgaWYgKHJldGFpbkRhdGFGb3JUZXN0aW5nKSB7CiAgICAgIHR5cGVNYXBzRm9yVGVzdGluZyA9IHt9OwogICAgfQogICAgbm9kZS5hY2NlcHQodGhpcyk7CiAgICByZXR1cm4gbmV3IEltcGFjdEJ1aWxkZXJEYXRhKAogICAgICAgIGltcGFjdERhdGEsIHR5cGVNYXBzRm9yVGVzdGluZywgY2FjaGVkU3RhdGljVHlwZXMpOwogIH0KfQoKLy8vIFJldHVybiB0aGUgbmFtZWQgYXJndW1lbnRzIG5hbWVzIGFzIGEgbGlzdCBvZiBzdHJpbmdzLgpMaXN0PFN0cmluZz4gX2dldE5hbWVkQXJndW1lbnRzKGlyLkFyZ3VtZW50cyBhcmd1bWVudHMpID0+CiAgICBhcmd1bWVudHMubmFtZWQubWFwKChuKSA9PiBuLm5hbWUpLnRvTGlzdCgpOwoKY2xhc3MgSW1wYWN0QnVpbGRlckRhdGEgewogIGZpbmFsIEltcGFjdERhdGEgaW1wYWN0RGF0YTsKICBmaW5hbCBNYXA8aXIuRXhwcmVzc2lvbiwgVHlwZU1hcD4gdHlwZU1hcHNGb3JUZXN0aW5nOwogIGZpbmFsIE1hcDxpci5FeHByZXNzaW9uLCBpci5EYXJ0VHlwZT4gY2FjaGVkU3RhdGljVHlwZXM7CgogIEltcGFjdEJ1aWxkZXJEYXRhKAogICAgICB0aGlzLmltcGFjdERhdGEsIHRoaXMudHlwZU1hcHNGb3JUZXN0aW5nLCB0aGlzLmNhY2hlZFN0YXRpY1R5cGVzKTsKfQoKY2xhc3MgQ29uc3RhbnRJbXBhY3RWaXNpdG9yIGltcGxlbWVudHMgaXIuQ29uc3RhbnRWaXNpdG9yPHZvaWQ+IHsKICBmaW5hbCBJbXBhY3RSZWdpc3RyeSByZWdpc3RyeTsKICBmaW5hbCBpci5MaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQ7CiAgZmluYWwgaXIuQ29uc3RhbnRFeHByZXNzaW9uIGV4cHJlc3Npb247CgogIENvbnN0YW50SW1wYWN0VmlzaXRvcih0aGlzLnJlZ2lzdHJ5LCB0aGlzLmltcG9ydCwgdGhpcy5leHByZXNzaW9uKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBkZWZhdWx0Q29uc3RhbnQoaXIuQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIlVuZXhwZWN0ZWQgY29uc3RhbnQgJHtub2RlfSAoJHtub2RlLnJ1bnRpbWVUeXBlfSkuIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VW5ldmFsdWF0ZWRDb25zdGFudChpci5VbmV2YWx1YXRlZENvbnN0YW50IG5vZGUpIHsKICAgIC8vIERvIG5vdGhpbmcuIFRoaXMgb2NjdXJzIHdoZW4gdGhlIGNvbnN0YW50IGNvdWxkbid0IGJlIGV2YWx1YXRlZCBiZWNhdXNlCiAgICAvLyBvZiBhIGNvbXBpbGUtdGltZSBlcnJvci4KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlTGl0ZXJhbENvbnN0YW50KGlyLlR5cGVMaXRlcmFsQ29uc3RhbnQgbm9kZSkgewogICAgcmVnaXN0cnkucmVnaXN0ZXJUeXBlTGl0ZXJhbChub2RlLnR5cGUsIGltcG9ydCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VGVhck9mZkNvbnN0YW50KGlyLlRlYXJPZmZDb25zdGFudCBub2RlKSB7CiAgICByZWdpc3RyeS5yZWdpc3RlclN0YXRpY1RlYXJPZmYobm9kZS5wcm9jZWR1cmUsIGltcG9ydCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudChpci5QYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50IG5vZGUpIHsKICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyR2VuZXJpY0luc3RhbnRpYXRpb24oCiAgICAgICAgbm9kZS50ZWFyT2ZmQ29uc3RhbnQucHJvY2VkdXJlLmZ1bmN0aW9uLmZ1bmN0aW9uVHlwZSwgbm9kZS50eXBlcyk7CiAgICBub2RlLnRlYXJPZmZDb25zdGFudC5hY2NlcHQodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW5zdGFuY2VDb25zdGFudChpci5JbnN0YW5jZUNvbnN0YW50IG5vZGUpIHsKICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQ29uc3RJbnN0YW50aWF0aW9uKAogICAgICAgIG5vZGUuY2xhc3NOb2RlLCBub2RlLnR5cGVBcmd1bWVudHMsIGltcG9ydCk7CiAgICBub2RlLmZpZWxkVmFsdWVzLmZvckVhY2goKGlyLlJlZmVyZW5jZSByZWZlcmVuY2UsIGlyLkNvbnN0YW50IHZhbHVlKSB7CiAgICAgIGlyLkZpZWxkIGZpZWxkID0gcmVmZXJlbmNlLmFzRmllbGQ7CiAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyRmllbGRDb25zdGFudEluaXRpYWxpemF0aW9uKAogICAgICAgICAgZmllbGQsIG5ldyBDb25zdGFudFJlZmVyZW5jZShleHByZXNzaW9uLCB2YWx1ZSkpOwogICAgICB2YWx1ZS5hY2NlcHQodGhpcyk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTZXRDb25zdGFudChpci5TZXRDb25zdGFudCBub2RlKSB7CiAgICByZWdpc3RyeS5yZWdpc3RlclNldExpdGVyYWwobm9kZS50eXBlQXJndW1lbnQsCiAgICAgICAgaXNDb25zdDogdHJ1ZSwgaXNFbXB0eTogbm9kZS5lbnRyaWVzLmlzRW1wdHkpOwogICAgZm9yIChpci5Db25zdGFudCBlbGVtZW50IGluIG5vZGUuZW50cmllcykgewogICAgICBlbGVtZW50LmFjY2VwdCh0aGlzKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaXN0Q29uc3RhbnQoaXIuTGlzdENvbnN0YW50IG5vZGUpIHsKICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyTGlzdExpdGVyYWwobm9kZS50eXBlQXJndW1lbnQsCiAgICAgICAgaXNDb25zdDogdHJ1ZSwgaXNFbXB0eTogbm9kZS5lbnRyaWVzLmlzRW1wdHkpOwogICAgZm9yIChpci5Db25zdGFudCBlbGVtZW50IGluIG5vZGUuZW50cmllcykgewogICAgICBlbGVtZW50LmFjY2VwdCh0aGlzKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRNYXBDb25zdGFudChpci5NYXBDb25zdGFudCBub2RlKSB7CiAgICByZWdpc3RyeS5yZWdpc3Rlck1hcExpdGVyYWwobm9kZS5rZXlUeXBlLCBub2RlLnZhbHVlVHlwZSwKICAgICAgICBpc0NvbnN0OiB0cnVlLCBpc0VtcHR5OiBub2RlLmVudHJpZXMuaXNFbXB0eSk7CiAgICBmb3IgKGlyLkNvbnN0YW50TWFwRW50cnkgZW50cnkgaW4gbm9kZS5lbnRyaWVzKSB7CiAgICAgIGVudHJ5LmtleS5hY2NlcHQodGhpcyk7CiAgICAgIGVudHJ5LnZhbHVlLmFjY2VwdCh0aGlzKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTeW1ib2xDb25zdGFudChpci5TeW1ib2xDb25zdGFudCBub2RlKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBIYW5kbGUgdGhlIGxpYnJhcnkgcmVmZXJlbmNlLgogICAgcmVnaXN0cnkucmVnaXN0ZXJTeW1ib2xMaXRlcmFsKG5vZGUubmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RyaW5nQ29uc3RhbnQoaXIuU3RyaW5nQ29uc3RhbnQgbm9kZSkgewogICAgcmVnaXN0cnkucmVnaXN0ZXJTdHJpbmdMaXRlcmFsKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERvdWJsZUNvbnN0YW50KGlyLkRvdWJsZUNvbnN0YW50IG5vZGUpIHsKICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyRG91YmxlTGl0ZXJhbChub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnRDb25zdGFudChpci5JbnRDb25zdGFudCBub2RlKSB7CiAgICByZWdpc3RyeS5yZWdpc3RlckludExpdGVyYWwobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Qm9vbENvbnN0YW50KGlyLkJvb2xDb25zdGFudCBub2RlKSB7CiAgICByZWdpc3RyeS5yZWdpc3RlckJvb2xMaXRlcmFsKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE51bGxDb25zdGFudChpci5OdWxsQ29uc3RhbnQgbm9kZSkgewogICAgcmVnaXN0cnkucmVnaXN0ZXJOdWxsTGl0ZXJhbCgpOwogIH0KfQqDKgBOTjwBOR0BKDQ1ARkZGyUVGyAUATAERkwYICYBLAEoASwBLAEeATQlATMlAUYlAR48AUkBSQErASVIATIBLwEzASYBMAEqASoBLwEpARgBNAE1ARgBHQEsAUsBMwEsMgEeASciHyMoATEBHAEUHR0fIycjFwFRJAEhGx8jJyQBKCwfIygBIiAeFB8jKAEjIB4YHyMoASMgHyMoARtHARxLARtHARxLAUZFAScBJwEhHR0fIygBTDsBRDUpMT89TgIBOyAMLwE4QTABQiUrLSINJAYEAQwuJAQBDDQnBAEMMCUEAQw0JwQBDDQnBAEMMBsEAQwwK0MEAQwuKkMEAQwuNT8EAQxEJEw+DToGBAEMQz0EAQw4NwQBDDJARgQBNTcyARsgDyQ6LlE6DAonDwEhOi5ROi03OgwKJA8BJTouTzoMCigPASgsOAYEAQxAIwQBDEAhJgQBDD4hJgQBDEAkKQYEAQwyIAQBDEs/Hg4GHCcNIQYEAQwkFQQBDFAYKA0nBgQBDCQVIxwGKSUGBAEMMD0EAQw6LQQBDDAbBAEMJUUkFSosHwQBDDssBAEMLz4vBgQBDDAjBAEMJSglJRwyHQgNHQYeBAEMMSsmBAEMQj0RFR4qLB4hIBg0BgQBDDg9PkY8OE40CRgJIjErDgkqCRU1PA4JTU5MSykTF0sdGiAjIg1PMwYoBAEMHyAgIyA+RjwsJiU+QD0NTAE4JUU/Skg6LkhQLgoPKy9DTkFBQRFOQQoIBgQBDCUmICMgIBYdFSosHwQBDBpPSihJDT0GBAEMOjpJBAEMGk5KKEkNPQYEAQw6OUkEAQxCPUlDBAEMHzohBAEMUSEEAQwfPx4VFSosHwQBDDcnLQQBDEo8RAQBDD47SQQCAUVJDBkBDCwBNE9PRAE0IB8GFyI8BAIBOzsxARofODsBFUkCAUIhJSoBRgEMKyA/BAEMP08gBAEMPzUEAQw3PAQBDFErSycEAQw5KTVLKjQ8GggEAQwvMzcwHAYEAQwxNDcwHAYEAQwvPjc2HiAGBAEMNTovBAEMNTAEAQw1MAQBDC8tBAEMMS4EAQwxJAQCASNwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci9pbXBhY3QuZGFydDFzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pci9pbXBhY3RfZGF0YS5kYXJ0wADG/y8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAnLi4vc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL3V0aWwvZW51bXNldC5kYXJ0JzsKaW1wb3J0ICdjb25zdGFudHMuZGFydCc7CmltcG9ydCAnaW1wYWN0LmRhcnQnOwppbXBvcnQgJ3J1bnRpbWVfdHlwZV9hbmFseXNpcy5kYXJ0JzsKaW1wb3J0ICdzdGF0aWNfdHlwZS5kYXJ0JzsKCi8vLyBbSW1wYWN0UmVnaXN0cnldIHRoYXQgc3RvcmVzIHJlZ2lzdGVyZWQgaW1wYWN0IGluIGFuIFtJbXBhY3REYXRhXSBvYmplY3QuCmFic3RyYWN0IGNsYXNzIEltcGFjdFJlZ2lzdHJ5TWl4aW4gaW1wbGVtZW50cyBJbXBhY3RSZWdpc3RyeSB7CiAgZmluYWwgSW1wYWN0RGF0YUltcGwgX2RhdGEgPSBuZXcgSW1wYWN0RGF0YUltcGwoKTsKCiAgSW1wYWN0RGF0YSBnZXQgaW1wYWN0RGF0YSA9PiBfZGF0YTsKCiAgdm9pZCBfcmVnaXN0ZXJGZWF0dXJlKF9GZWF0dXJlIGZlYXR1cmUpIHsKICAgIF9kYXRhLl9mZWF0dXJlcyA/Pz0gbmV3IEVudW1TZXQ8X0ZlYXR1cmU+KCk7CiAgICBfZGF0YS5fZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwogIH0KCiAgdm9pZCBfcmVnaXN0ZXJUeXBlVXNlKGlyLkRhcnRUeXBlIHR5cGUsIF9UeXBlVXNlS2luZCBraW5kKSB7CiAgICBfZGF0YS5fdHlwZVVzZXMgPz89IFtdOwogICAgX2RhdGEuX3R5cGVVc2VzLmFkZChuZXcgX1R5cGVVc2UodHlwZSwga2luZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN1cGVySW5pdGlhbGl6ZXIoCiAgICAgIGlyLkNvbnN0cnVjdG9yIHNvdXJjZSwKICAgICAgaXIuQ29uc3RydWN0b3IgdGFyZ2V0LAogICAgICBpbnQgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzLAogICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICBfZGF0YS5fc3VwZXJJbml0aWFsaXplcnMgPz89IFtdOwogICAgX2RhdGEuX3N1cGVySW5pdGlhbGl6ZXJzLmFkZChuZXcgX1N1cGVySW5pdGlhbGl6ZXIoCiAgICAgICAgc291cmNlLAogICAgICAgIHRhcmdldCwKICAgICAgICBuZXcgX0NhbGxTdHJ1Y3R1cmUoCiAgICAgICAgICAgIHBvc2l0aW9uYWxBcmd1bWVudHMsIG5hbWVkQXJndW1lbnRzLCB0eXBlQXJndW1lbnRzKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN1cGVyU2V0KGlyLk5hbWUgbmFtZSkgewogICAgX2RhdGEuX3N1cGVyU2V0cyA/Pz0gW107CiAgICBfZGF0YS5fc3VwZXJTZXRzLmFkZChuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTdXBlckdldChpci5OYW1lIG5hbWUpIHsKICAgIF9kYXRhLl9zdXBlckdldHMgPz89IFtdOwogICAgX2RhdGEuX3N1cGVyR2V0cy5hZGQobmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyU3VwZXJJbnZvY2F0aW9uKGlyLk5hbWUgbmFtZSwgaW50IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIExpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cywgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykgewogICAgX2RhdGEuX3N1cGVySW52b2NhdGlvbnMgPz89IFtdOwogICAgX2RhdGEuX3N1cGVySW52b2NhdGlvbnMuYWRkKG5ldyBfU3VwZXJJbnZvY2F0aW9uKAogICAgICAgIG5hbWUsCiAgICAgICAgbmV3IF9DYWxsU3RydWN0dXJlKAogICAgICAgICAgICBwb3NpdGlvbmFsQXJndW1lbnRzLCBuYW1lZEFyZ3VtZW50cywgdHlwZUFyZ3VtZW50cykpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJJbnN0YW5jZVNldCgKICAgICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlLCBDbGFzc1JlbGF0aW9uIHJlbGF0aW9uLCBpci5NZW1iZXIgdGFyZ2V0KSB7CiAgICBfZGF0YS5faW5zdGFuY2VTZXRzID8/PSBbXTsKICAgIF9kYXRhLl9pbnN0YW5jZVNldHMKICAgICAgICAuYWRkKG5ldyBfSW5zdGFuY2VBY2Nlc3MocmVjZWl2ZXJUeXBlLCByZWxhdGlvbiwgdGFyZ2V0KSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyRHluYW1pY1NldCgKICAgICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlLCBDbGFzc1JlbGF0aW9uIHJlbGF0aW9uLCBpci5OYW1lIG5hbWUpIHsKICAgIF9kYXRhLl9keW5hbWljU2V0cyA/Pz0gW107CiAgICBfZGF0YS5fZHluYW1pY1NldHMuYWRkKG5ldyBfRHluYW1pY0FjY2VzcyhyZWNlaXZlclR5cGUsIHJlbGF0aW9uLCBuYW1lKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVySW5zdGFuY2VHZXQoCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwgQ2xhc3NSZWxhdGlvbiByZWxhdGlvbiwgaXIuTWVtYmVyIHRhcmdldCkgewogICAgX2RhdGEuX2luc3RhbmNlR2V0cyA/Pz0gW107CiAgICBfZGF0YS5faW5zdGFuY2VHZXRzCiAgICAgICAgLmFkZChuZXcgX0luc3RhbmNlQWNjZXNzKHJlY2VpdmVyVHlwZSwgcmVsYXRpb24sIHRhcmdldCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckR5bmFtaWNHZXQoCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwgQ2xhc3NSZWxhdGlvbiByZWxhdGlvbiwgaXIuTmFtZSBuYW1lKSB7CiAgICBfZGF0YS5fZHluYW1pY0dldHMgPz89IFtdOwogICAgX2RhdGEuX2R5bmFtaWNHZXRzLmFkZChuZXcgX0R5bmFtaWNBY2Nlc3MocmVjZWl2ZXJUeXBlLCByZWxhdGlvbiwgbmFtZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckZ1bmN0aW9uSW52b2NhdGlvbigKICAgICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlLAogICAgICBpbnQgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzLAogICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICBfZGF0YS5fZnVuY3Rpb25JbnZvY2F0aW9ucyA/Pz0gW107CiAgICBfZGF0YS5fZnVuY3Rpb25JbnZvY2F0aW9ucy5hZGQobmV3IF9GdW5jdGlvbkludm9jYXRpb24oCiAgICAgICAgcmVjZWl2ZXJUeXBlLAogICAgICAgIG5ldyBfQ2FsbFN0cnVjdHVyZSgKICAgICAgICAgICAgcG9zaXRpb25hbEFyZ3VtZW50cywgbmFtZWRBcmd1bWVudHMsIHR5cGVBcmd1bWVudHMpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVySW5zdGFuY2VJbnZvY2F0aW9uKAogICAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsCiAgICAgIENsYXNzUmVsYXRpb24gcmVsYXRpb24sCiAgICAgIGlyLk1lbWJlciB0YXJnZXQsCiAgICAgIGludCBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHMsCiAgICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIF9kYXRhLl9pbnN0YW5jZUludm9jYXRpb25zID8/PSBbXTsKICAgIF9kYXRhLl9pbnN0YW5jZUludm9jYXRpb25zLmFkZChuZXcgX0luc3RhbmNlSW52b2NhdGlvbigKICAgICAgICByZWNlaXZlclR5cGUsCiAgICAgICAgcmVsYXRpb24sCiAgICAgICAgdGFyZ2V0LAogICAgICAgIG5ldyBfQ2FsbFN0cnVjdHVyZSgKICAgICAgICAgICAgcG9zaXRpb25hbEFyZ3VtZW50cywgbmFtZWRBcmd1bWVudHMsIHR5cGVBcmd1bWVudHMpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyRHluYW1pY0ludm9jYXRpb24oCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwKICAgICAgQ2xhc3NSZWxhdGlvbiByZWxhdGlvbiwKICAgICAgaXIuTmFtZSBuYW1lLAogICAgICBpbnQgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzLAogICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICBfZGF0YS5fZHluYW1pY0ludm9jYXRpb25zID8/PSBbXTsKICAgIF9kYXRhLl9keW5hbWljSW52b2NhdGlvbnMuYWRkKG5ldyBfRHluYW1pY0ludm9jYXRpb24oCiAgICAgICAgcmVjZWl2ZXJUeXBlLAogICAgICAgIHJlbGF0aW9uLAogICAgICAgIG5hbWUsCiAgICAgICAgbmV3IF9DYWxsU3RydWN0dXJlKAogICAgICAgICAgICBwb3NpdGlvbmFsQXJndW1lbnRzLCBuYW1lZEFyZ3VtZW50cywgdHlwZUFyZ3VtZW50cykpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJMb2NhbEZ1bmN0aW9uSW52b2NhdGlvbigKICAgICAgaXIuRnVuY3Rpb25EZWNsYXJhdGlvbiBsb2NhbEZ1bmN0aW9uLAogICAgICBpbnQgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzLAogICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICBfZGF0YS5fbG9jYWxGdW5jdGlvbkludm9jYXRpb25zID8/PSBbXTsKICAgIF9kYXRhLl9sb2NhbEZ1bmN0aW9uSW52b2NhdGlvbnMuYWRkKG5ldyBfTG9jYWxGdW5jdGlvbkludm9jYXRpb24oCiAgICAgICAgbG9jYWxGdW5jdGlvbiwKICAgICAgICBuZXcgX0NhbGxTdHJ1Y3R1cmUoCiAgICAgICAgICAgIHBvc2l0aW9uYWxBcmd1bWVudHMsIG5hbWVkQXJndW1lbnRzLCB0eXBlQXJndW1lbnRzKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN0YXRpY0ludm9jYXRpb24oCiAgICAgIGlyLlByb2NlZHVyZSB0YXJnZXQsCiAgICAgIGludCBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHMsCiAgICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMsCiAgICAgIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydCkgewogICAgX2RhdGEuX3N0YXRpY0ludm9jYXRpb25zID8/PSBbXTsKICAgIF9kYXRhLl9zdGF0aWNJbnZvY2F0aW9ucy5hZGQobmV3IF9TdGF0aWNJbnZvY2F0aW9uKAogICAgICAgIHRhcmdldCwKICAgICAgICBuZXcgX0NhbGxTdHJ1Y3R1cmUocG9zaXRpb25hbEFyZ3VtZW50cywgbmFtZWRBcmd1bWVudHMsIHR5cGVBcmd1bWVudHMpLAogICAgICAgIGltcG9ydCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck5ldygKICAgICAgaXIuTWVtYmVyIGNvbnN0cnVjdG9yLAogICAgICBpci5JbnRlcmZhY2VUeXBlIHR5cGUsCiAgICAgIGludCBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHMsCiAgICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMsCiAgICAgIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydCwKICAgICAge2Jvb2wgaXNDb25zdH0pIHsKICAgIF9kYXRhLl9jb25zdHJ1Y3Rvckludm9jYXRpb25zID8/PSBbXTsKICAgIF9kYXRhLl9jb25zdHJ1Y3Rvckludm9jYXRpb25zLmFkZChuZXcgX0NvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgICBjb25zdHJ1Y3RvciwKICAgICAgICB0eXBlLAogICAgICAgIG5ldyBfQ2FsbFN0cnVjdHVyZShwb3NpdGlvbmFsQXJndW1lbnRzLCBuYW1lZEFyZ3VtZW50cywgdHlwZUFyZ3VtZW50cyksCiAgICAgICAgaW1wb3J0LAogICAgICAgIGlzQ29uc3Q6IGlzQ29uc3QpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJDb25zdEluc3RhbnRpYXRpb24oaXIuQ2xhc3MgY2xzLCBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzLAogICAgICBpci5MaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQpIHsKICAgIF9kYXRhLl9jb25zdEluc3RhbnRpYXRpb25zID8/PSBbXTsKICAgIF9kYXRhLl9jb25zdEluc3RhbnRpYXRpb25zCiAgICAgICAgLmFkZChuZXcgX0NvbnN0SW5zdGFudGlhdGlvbihjbHMsIHR5cGVBcmd1bWVudHMsIGltcG9ydCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckxhenlGaWVsZCgpIHsKICAgIF9yZWdpc3RlckZlYXR1cmUoX0ZlYXR1cmUubGF6eUZpZWxkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJQYXJhbWV0ZXJDaGVjayhpci5EYXJ0VHlwZSB0eXBlKSB7CiAgICBfcmVnaXN0ZXJUeXBlVXNlKHR5cGUsIF9UeXBlVXNlS2luZC5wYXJhbWV0ZXJDaGVjayk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyUmVkaXJlY3RpbmdJbml0aWFsaXplcigKICAgICAgaXIuQ29uc3RydWN0b3IgY29uc3RydWN0b3IsCiAgICAgIGludCBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHMsCiAgICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIF9kYXRhLl9yZWRpcmVjdGluZ0luaXRpYWxpemVycyA/Pz0gW107CiAgICBfZGF0YS5fcmVkaXJlY3RpbmdJbml0aWFsaXplcnMuYWRkKG5ldyBfUmVkaXJlY3RpbmdJbml0aWFsaXplcigKICAgICAgICBjb25zdHJ1Y3RvciwKICAgICAgICBuZXcgX0NhbGxTdHJ1Y3R1cmUoCiAgICAgICAgICAgIHBvc2l0aW9uYWxBcmd1bWVudHMsIG5hbWVkQXJndW1lbnRzLCB0eXBlQXJndW1lbnRzKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckxvYWRMaWJyYXJ5KCkgewogICAgX3JlZ2lzdGVyRmVhdHVyZShfRmVhdHVyZS5sb2FkTGlicmFyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyRmllbGRJbml0aWFsaXphdGlvbihpci5GaWVsZCBub2RlKSB7CiAgICBfZGF0YS5fZmllbGRJbml0aWFsaXplcnMgPz89IFtdOwogICAgX2RhdGEuX2ZpZWxkSW5pdGlhbGl6ZXJzLmFkZChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJGaWVsZENvbnN0YW50SW5pdGlhbGl6YXRpb24oCiAgICAgIGlyLkZpZWxkIG5vZGUsIENvbnN0YW50UmVmZXJlbmNlIGNvbnN0YW50KSB7CiAgICBfZGF0YS5fZmllbGRDb25zdGFudEluaXRpYWxpemVycyA/Pz0ge307CiAgICBfZGF0YS5fZmllbGRDb25zdGFudEluaXRpYWxpemVycy5wdXRJZkFic2VudChub2RlLCAoKSA9PiBbXSkuYWRkKGNvbnN0YW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJUeXBlTGl0ZXJhbChpci5EYXJ0VHlwZSB0eXBlLCBpci5MaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQpIHsKICAgIF9kYXRhLl90eXBlTGl0ZXJhbHMgPz89IFtdOwogICAgX2RhdGEuX3R5cGVMaXRlcmFscy5hZGQobmV3IF9UeXBlTGl0ZXJhbCh0eXBlLCBpbXBvcnQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJDYXRjaFR5cGUoaXIuRGFydFR5cGUgdHlwZSkgewogICAgX3JlZ2lzdGVyVHlwZVVzZSh0eXBlLCBfVHlwZVVzZUtpbmQuY2F0Y2hUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTdGFja1RyYWNlKCkgewogICAgX3JlZ2lzdGVyRmVhdHVyZShfRmVhdHVyZS5zdGFja1RyYWNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJDYXRjaCgpIHsKICAgIF9yZWdpc3RlckZlYXR1cmUoX0ZlYXR1cmUuY2F0Y2hDbGF1c2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckFzeW5jRm9ySW4oaXIuRGFydFR5cGUgaXRlcmFibGVUeXBlKSB7CiAgICBfcmVnaXN0ZXJUeXBlVXNlKGl0ZXJhYmxlVHlwZSwgX1R5cGVVc2VLaW5kLmFzeW5jRm9ySW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN5bmNGb3JJbihpci5EYXJ0VHlwZSBpdGVyYWJsZVR5cGUpIHsKICAgIF9yZWdpc3RlclR5cGVVc2UoaXRlcmFibGVUeXBlLCBfVHlwZVVzZUtpbmQuc3luY0ZvckluKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJUaHJvdygpIHsKICAgIF9yZWdpc3RlckZlYXR1cmUoX0ZlYXR1cmUudGhyb3dFeHByZXNzaW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJBc0Nhc3QoaXIuRGFydFR5cGUgdHlwZSkgewogICAgX3JlZ2lzdGVyVHlwZVVzZSh0eXBlLCBfVHlwZVVzZUtpbmQuYXNDYXN0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJJbXBsaWNpdENhc3QoaXIuRGFydFR5cGUgdHlwZSkgewogICAgX3JlZ2lzdGVyVHlwZVVzZSh0eXBlLCBfVHlwZVVzZUtpbmQuaW1wbGljaXRDYXN0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJJc0NoZWNrKGlyLkRhcnRUeXBlIHR5cGUpIHsKICAgIF9yZWdpc3RlclR5cGVVc2UodHlwZSwgX1R5cGVVc2VLaW5kLmlzQ2hlY2spOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckxvY2FsV2l0aG91dEluaXRpYWxpemVyKCkgewogICAgX3JlZ2lzdGVyRmVhdHVyZShfRmVhdHVyZS5sb2NhbFdpdGhvdXRJbml0aWFsaXplcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyTG9jYWxGdW5jdGlvbihpci5UcmVlTm9kZSBub2RlKSB7CiAgICBfZGF0YS5fbG9jYWxGdW5jdGlvbnMgPz89IFtdOwogICAgX2RhdGEuX2xvY2FsRnVuY3Rpb25zLmFkZChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTdHJpbmdDb25jYXRlbmF0aW9uKCkgewogICAgX3JlZ2lzdGVyRmVhdHVyZShfRmVhdHVyZS5zdHJpbmdDb25jYXRlbmF0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJBc3luY1N0YXIoaXIuRGFydFR5cGUgZWxlbWVudFR5cGUpIHsKICAgIF9yZWdpc3RlclR5cGVVc2UoZWxlbWVudFR5cGUsIF9UeXBlVXNlS2luZC5hc3luY1N0YXJNYXJrZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckFzeW5jKGlyLkRhcnRUeXBlIGVsZW1lbnRUeXBlKSB7CiAgICBfcmVnaXN0ZXJUeXBlVXNlKGVsZW1lbnRUeXBlLCBfVHlwZVVzZUtpbmQuYXN5bmNNYXJrZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN5bmNTdGFyKGlyLkRhcnRUeXBlIGVsZW1lbnRUeXBlKSB7CiAgICBfcmVnaXN0ZXJUeXBlVXNlKGVsZW1lbnRUeXBlLCBfVHlwZVVzZUtpbmQuc3luY1N0YXJNYXJrZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckdlbmVyaWNJbnN0YW50aWF0aW9uKAogICAgICBpci5GdW5jdGlvblR5cGUgZXhwcmVzc2lvblR5cGUsIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIF9kYXRhLl9nZW5lcmljSW5zdGFudGlhdGlvbnMgPz89IFtdOwogICAgX2RhdGEuX2dlbmVyaWNJbnN0YW50aWF0aW9ucwogICAgICAgIC5hZGQobmV3IF9HZW5lcmljSW5zdGFudGlhdGlvbihleHByZXNzaW9uVHlwZSwgdHlwZUFyZ3VtZW50cykpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckFzc2VydCh7Ym9vbCB3aXRoTWVzc2FnZX0pIHsKICAgIF9yZWdpc3RlckZlYXR1cmUod2l0aE1lc3NhZ2UKICAgICAgICA/IF9GZWF0dXJlLmFzc2VydFdpdGhNZXNzYWdlCiAgICAgICAgOiBfRmVhdHVyZS5hc3NlcnRXaXRob3V0TWVzc2FnZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyU3RhdGljU2V0KGlyLk1lbWJlciBtZW1iZXIsIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydCkgewogICAgX2RhdGEuX3N0YXRpY1NldHMgPz89IFtdOwogICAgX2RhdGEuX3N0YXRpY1NldHMuYWRkKG5ldyBfU3RhdGljQWNjZXNzKG1lbWJlciwgaW1wb3J0KSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyU3RhdGljR2V0KGlyLk1lbWJlciBtZW1iZXIsIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydCkgewogICAgX2RhdGEuX3N0YXRpY0dldHMgPz89IFtdOwogICAgX2RhdGEuX3N0YXRpY0dldHMuYWRkKG5ldyBfU3RhdGljQWNjZXNzKG1lbWJlciwgaW1wb3J0KSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyU3RhdGljVGVhck9mZigKICAgICAgaXIuUHJvY2VkdXJlIHByb2NlZHVyZSwgaXIuTGlicmFyeURlcGVuZGVuY3kgaW1wb3J0KSB7CiAgICBfZGF0YS5fc3RhdGljVGVhck9mZnMgPz89IFtdOwogICAgX2RhdGEuX3N0YXRpY1RlYXJPZmZzLmFkZChuZXcgX1N0YXRpY0FjY2Vzcyhwcm9jZWR1cmUsIGltcG9ydCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck1hcExpdGVyYWwoaXIuRGFydFR5cGUga2V5VHlwZSwgaXIuRGFydFR5cGUgdmFsdWVUeXBlLAogICAgICB7Ym9vbCBpc0NvbnN0LCBib29sIGlzRW1wdHl9KSB7CiAgICBfZGF0YS5fbWFwTGl0ZXJhbHMgPz89IFtdOwogICAgX2RhdGEuX21hcExpdGVyYWxzLmFkZChuZXcgX01hcExpdGVyYWwoa2V5VHlwZSwgdmFsdWVUeXBlLAogICAgICAgIGlzQ29uc3Q6IGlzQ29uc3QsIGlzRW1wdHk6IGlzRW1wdHkpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJMaXN0TGl0ZXJhbChpci5EYXJ0VHlwZSBlbGVtZW50VHlwZSwKICAgICAge2Jvb2wgaXNDb25zdCwgYm9vbCBpc0VtcHR5fSkgewogICAgX2RhdGEuX2xpc3RMaXRlcmFscyA/Pz0gW107CiAgICBfZGF0YS5fbGlzdExpdGVyYWxzLmFkZCgKICAgICAgICBuZXcgX0NvbnRhaW5lckxpdGVyYWwoZWxlbWVudFR5cGUsIGlzQ29uc3Q6IGlzQ29uc3QsIGlzRW1wdHk6IGlzRW1wdHkpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTZXRMaXRlcmFsKGlyLkRhcnRUeXBlIGVsZW1lbnRUeXBlLAogICAgICB7Ym9vbCBpc0NvbnN0LCBib29sIGlzRW1wdHl9KSB7CiAgICBfZGF0YS5fc2V0TGl0ZXJhbHMgPz89IFtdOwogICAgX2RhdGEuX3NldExpdGVyYWxzLmFkZCgKICAgICAgICBuZXcgX0NvbnRhaW5lckxpdGVyYWwoZWxlbWVudFR5cGUsIGlzQ29uc3Q6IGlzQ29uc3QsIGlzRW1wdHk6IGlzRW1wdHkpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJOdWxsTGl0ZXJhbCgpIHsKICAgIF9yZWdpc3RlckZlYXR1cmUoX0ZlYXR1cmUubnVsbExpdGVyYWwpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN5bWJvbExpdGVyYWwoU3RyaW5nIHZhbHVlKSB7CiAgICBfZGF0YS5fc3ltYm9sTGl0ZXJhbHMgPz89IFtdOwogICAgX2RhdGEuX3N5bWJvbExpdGVyYWxzLmFkZCh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyU3RyaW5nTGl0ZXJhbChTdHJpbmcgdmFsdWUpIHsKICAgIF9kYXRhLl9zdHJpbmdMaXRlcmFscyA/Pz0gW107CiAgICBfZGF0YS5fc3RyaW5nTGl0ZXJhbHMuYWRkKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJCb29sTGl0ZXJhbChib29sIHZhbHVlKSB7CiAgICBfZGF0YS5fYm9vbExpdGVyYWxzID8/PSBbXTsKICAgIF9kYXRhLl9ib29sTGl0ZXJhbHMuYWRkKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJEb3VibGVMaXRlcmFsKGRvdWJsZSB2YWx1ZSkgewogICAgX2RhdGEuX2RvdWJsZUxpdGVyYWxzID8/PSBbXTsKICAgIF9kYXRhLl9kb3VibGVMaXRlcmFscy5hZGQodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckludExpdGVyYWwoaW50IHZhbHVlKSB7CiAgICBfZGF0YS5faW50TGl0ZXJhbHMgPz89IFtdOwogICAgX2RhdGEuX2ludExpdGVyYWxzLmFkZCh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyUnVudGltZVR5cGVVc2UoaXIuUHJvcGVydHlHZXQgbm9kZSwgUnVudGltZVR5cGVVc2VLaW5kIGtpbmQsCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwgaXIuRGFydFR5cGUgYXJndW1lbnRUeXBlKSB7CiAgICBfZGF0YS5fcnVudGltZVR5cGVVc2VzID8/PSBbXTsKICAgIF9kYXRhLl9ydW50aW1lVHlwZVVzZXMKICAgICAgICAuYWRkKG5ldyBfUnVudGltZVR5cGVVc2Uobm9kZSwga2luZCwgcmVjZWl2ZXJUeXBlLCBhcmd1bWVudFR5cGUpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJDb25zdHJ1Y3Rvck5vZGUoaXIuQ29uc3RydWN0b3Igbm9kZSkgewogICAgX2RhdGEuX2NvbnN0cnVjdG9yTm9kZXMgPz89IFtdOwogICAgX2RhdGEuX2NvbnN0cnVjdG9yTm9kZXMuYWRkKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckZpZWxkTm9kZShpci5GaWVsZCBub2RlKSB7CiAgICBfZGF0YS5fZmllbGROb2RlcyA/Pz0gW107CiAgICBfZGF0YS5fZmllbGROb2Rlcy5hZGQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyUHJvY2VkdXJlTm9kZShpci5Qcm9jZWR1cmUgbm9kZSkgewogICAgX2RhdGEuX3Byb2NlZHVyZU5vZGVzID8/PSBbXTsKICAgIF9kYXRhLl9wcm9jZWR1cmVOb2Rlcy5hZGQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyU3RhdGljSW52b2NhdGlvbk5vZGUoaXIuU3RhdGljSW52b2NhdGlvbiBub2RlKSB7CiAgICBfZGF0YS5fc3RhdGljSW52b2NhdGlvbk5vZGVzID8/PSBbXTsKICAgIF9kYXRhLl9zdGF0aWNJbnZvY2F0aW9uTm9kZXMuYWRkKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN3aXRjaFN0YXRlbWVudE5vZGUoaXIuU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIF9kYXRhLl9zd2l0Y2hTdGF0ZW1lbnROb2RlcyA/Pz0gW107CiAgICBfZGF0YS5fc3dpdGNoU3RhdGVtZW50Tm9kZXMuYWRkKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckNvbnN0Q29uc3RydWN0b3JJbnZvY2F0aW9uTm9kZShpci5Db25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewogICAgX2RhdGEuX2NvbnN0Q29uc3RydWN0b3JJbnZvY2F0aW9uTm9kZXMgPz89IFtdOwogICAgX2RhdGEuX2NvbnN0Q29uc3RydWN0b3JJbnZvY2F0aW9uTm9kZXMuYWRkKG5vZGUpOwogIH0KfQoKLy8vIERhdGEgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHdvcmxkIGltcGFjdCBkYXRhIGRlcml2ZWQgcHVyZWx5IGZyb20ga2VybmVsLgphYnN0cmFjdCBjbGFzcyBJbXBhY3REYXRhIHsKICBmYWN0b3J5IEltcGFjdERhdGEuZnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpID0KICAgICAgSW1wYWN0RGF0YUltcGwuZnJvbURhdGFTb3VyY2U7CgogIHZvaWQgdG9EYXRhU2luayhEYXRhU2luayBzaW5rKTsKCiAgLy8vIFJlZ2lzdGVycyB0aGUgaW1wYWN0IGRhdGEgd2l0aCBbcmVnaXN0cnldLgogIHZvaWQgYXBwbHkoSW1wYWN0UmVnaXN0cnkgcmVnaXN0cnkpOwp9CgpjbGFzcyBJbXBhY3REYXRhSW1wbCBpbXBsZW1lbnRzIEltcGFjdERhdGEgewogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ0ltcGFjdERhdGEnOwoKICBMaXN0PF9TdXBlckluaXRpYWxpemVyPiBfc3VwZXJJbml0aWFsaXplcnM7CiAgTGlzdDxpci5OYW1lPiBfc3VwZXJTZXRzOwogIExpc3Q8aXIuTmFtZT4gX3N1cGVyR2V0czsKICBMaXN0PF9TdXBlckludm9jYXRpb24+IF9zdXBlckludm9jYXRpb25zOwogIExpc3Q8X0luc3RhbmNlQWNjZXNzPiBfaW5zdGFuY2VTZXRzOwogIExpc3Q8X0R5bmFtaWNBY2Nlc3M+IF9keW5hbWljU2V0czsKICBMaXN0PF9JbnN0YW5jZUFjY2Vzcz4gX2luc3RhbmNlR2V0czsKICBMaXN0PF9EeW5hbWljQWNjZXNzPiBfZHluYW1pY0dldHM7CiAgTGlzdDxfRnVuY3Rpb25JbnZvY2F0aW9uPiBfZnVuY3Rpb25JbnZvY2F0aW9uczsKICBMaXN0PF9JbnN0YW5jZUludm9jYXRpb24+IF9pbnN0YW5jZUludm9jYXRpb25zOwogIExpc3Q8X0R5bmFtaWNJbnZvY2F0aW9uPiBfZHluYW1pY0ludm9jYXRpb25zOwogIExpc3Q8X0xvY2FsRnVuY3Rpb25JbnZvY2F0aW9uPiBfbG9jYWxGdW5jdGlvbkludm9jYXRpb25zOwogIExpc3Q8X1N0YXRpY0ludm9jYXRpb24+IF9zdGF0aWNJbnZvY2F0aW9uczsKICBMaXN0PF9Db25zdHJ1Y3Rvckludm9jYXRpb24+IF9jb25zdHJ1Y3Rvckludm9jYXRpb25zOwogIExpc3Q8X0NvbnN0SW5zdGFudGlhdGlvbj4gX2NvbnN0SW5zdGFudGlhdGlvbnM7CiAgRW51bVNldDxfRmVhdHVyZT4gX2ZlYXR1cmVzOwogIExpc3Q8X1R5cGVVc2U+IF90eXBlVXNlczsKICBMaXN0PF9SZWRpcmVjdGluZ0luaXRpYWxpemVyPiBfcmVkaXJlY3RpbmdJbml0aWFsaXplcnM7CiAgTGlzdDxpci5GaWVsZD4gX2ZpZWxkSW5pdGlhbGl6ZXJzOwogIE1hcDxpci5GaWVsZCwgTGlzdDxDb25zdGFudFJlZmVyZW5jZT4+IF9maWVsZENvbnN0YW50SW5pdGlhbGl6ZXJzOwogIExpc3Q8X1R5cGVMaXRlcmFsPiBfdHlwZUxpdGVyYWxzOwogIExpc3Q8aXIuVHJlZU5vZGU+IF9sb2NhbEZ1bmN0aW9uczsKICBMaXN0PF9HZW5lcmljSW5zdGFudGlhdGlvbj4gX2dlbmVyaWNJbnN0YW50aWF0aW9uczsKICBMaXN0PF9TdGF0aWNBY2Nlc3M+IF9zdGF0aWNTZXRzOwogIExpc3Q8X1N0YXRpY0FjY2Vzcz4gX3N0YXRpY0dldHM7CiAgTGlzdDxfU3RhdGljQWNjZXNzPiBfc3RhdGljVGVhck9mZnM7CiAgTGlzdDxfTWFwTGl0ZXJhbD4gX21hcExpdGVyYWxzOwogIExpc3Q8X0NvbnRhaW5lckxpdGVyYWw+IF9saXN0TGl0ZXJhbHM7CiAgTGlzdDxfQ29udGFpbmVyTGl0ZXJhbD4gX3NldExpdGVyYWxzOwogIExpc3Q8U3RyaW5nPiBfc3ltYm9sTGl0ZXJhbHM7CiAgTGlzdDxTdHJpbmc+IF9zdHJpbmdMaXRlcmFsczsKICBMaXN0PGJvb2w+IF9ib29sTGl0ZXJhbHM7CiAgTGlzdDxkb3VibGU+IF9kb3VibGVMaXRlcmFsczsKICBMaXN0PGludD4gX2ludExpdGVyYWxzOwogIExpc3Q8X1J1bnRpbWVUeXBlVXNlPiBfcnVudGltZVR5cGVVc2VzOwoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhlc2Ugd2hlbiBDRkUgcHJvdmlkZXMgY29uc3RhbnRzLgogIExpc3Q8aXIuQ29uc3RydWN0b3I+IF9jb25zdHJ1Y3Rvck5vZGVzOwogIExpc3Q8aXIuRmllbGQ+IF9maWVsZE5vZGVzOwogIExpc3Q8aXIuUHJvY2VkdXJlPiBfcHJvY2VkdXJlTm9kZXM7CiAgTGlzdDxpci5Td2l0Y2hTdGF0ZW1lbnQ+IF9zd2l0Y2hTdGF0ZW1lbnROb2RlczsKICBMaXN0PGlyLlN0YXRpY0ludm9jYXRpb24+IF9zdGF0aWNJbnZvY2F0aW9uTm9kZXM7CiAgTGlzdDxpci5Db25zdHJ1Y3Rvckludm9jYXRpb24+IF9jb25zdENvbnN0cnVjdG9ySW52b2NhdGlvbk5vZGVzOwoKICBJbXBhY3REYXRhSW1wbCgpOwoKICBJbXBhY3REYXRhSW1wbC5mcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBfc3VwZXJJbml0aWFsaXplcnMgPSBzb3VyY2UucmVhZExpc3QoCiAgICAgICAgKCkgPT4gbmV3IF9TdXBlckluaXRpYWxpemVyLmZyb21EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICAgZW1wdHlBc051bGw6IHRydWUpOwogICAgX3N1cGVyU2V0cyA9IHNvdXJjZS5yZWFkTGlzdCgoKSA9PiBzb3VyY2UucmVhZE5hbWUoKSwgZW1wdHlBc051bGw6IHRydWUpOwogICAgX3N1cGVyR2V0cyA9IHNvdXJjZS5yZWFkTGlzdCgoKSA9PiBzb3VyY2UucmVhZE5hbWUoKSwgZW1wdHlBc051bGw6IHRydWUpOwogICAgX3N1cGVySW52b2NhdGlvbnMgPSBzb3VyY2UucmVhZExpc3QoCiAgICAgICAgKCkgPT4gbmV3IF9TdXBlckludm9jYXRpb24uZnJvbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgICBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfaW5zdGFuY2VTZXRzID0gc291cmNlLnJlYWRMaXN0KAogICAgICAgICgpID0+IG5ldyBfSW5zdGFuY2VBY2Nlc3MuZnJvbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgICBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfZHluYW1pY1NldHMgPSBzb3VyY2UucmVhZExpc3QoCiAgICAgICAgKCkgPT4gbmV3IF9EeW5hbWljQWNjZXNzLmZyb21EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICAgZW1wdHlBc051bGw6IHRydWUpOwogICAgX2luc3RhbmNlR2V0cyA9IHNvdXJjZS5yZWFkTGlzdCgKICAgICAgICAoKSA9PiBuZXcgX0luc3RhbmNlQWNjZXNzLmZyb21EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICAgZW1wdHlBc051bGw6IHRydWUpOwogICAgX2R5bmFtaWNHZXRzID0gc291cmNlLnJlYWRMaXN0KAogICAgICAgICgpID0+IG5ldyBfRHluYW1pY0FjY2Vzcy5mcm9tRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgIGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIF9mdW5jdGlvbkludm9jYXRpb25zID0gc291cmNlLnJlYWRMaXN0KAogICAgICAgICgpID0+IG5ldyBfRnVuY3Rpb25JbnZvY2F0aW9uLmZyb21EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICAgZW1wdHlBc051bGw6IHRydWUpOwogICAgX2luc3RhbmNlSW52b2NhdGlvbnMgPSBzb3VyY2UucmVhZExpc3QoCiAgICAgICAgKCkgPT4gbmV3IF9JbnN0YW5jZUludm9jYXRpb24uZnJvbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgICBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfZHluYW1pY0ludm9jYXRpb25zID0gc291cmNlLnJlYWRMaXN0KAogICAgICAgICgpID0+IG5ldyBfRHluYW1pY0ludm9jYXRpb24uZnJvbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgICBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfbG9jYWxGdW5jdGlvbkludm9jYXRpb25zID0gc291cmNlLnJlYWRMaXN0KAogICAgICAgICgpID0+IG5ldyBfTG9jYWxGdW5jdGlvbkludm9jYXRpb24uZnJvbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgICBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfc3RhdGljSW52b2NhdGlvbnMgPSBzb3VyY2UucmVhZExpc3QoCiAgICAgICAgKCkgPT4gbmV3IF9TdGF0aWNJbnZvY2F0aW9uLmZyb21EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICAgZW1wdHlBc051bGw6IHRydWUpOwogICAgX2NvbnN0cnVjdG9ySW52b2NhdGlvbnMgPSBzb3VyY2UucmVhZExpc3QoCiAgICAgICAgKCkgPT4gbmV3IF9Db25zdHJ1Y3Rvckludm9jYXRpb24uZnJvbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgICBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfZmVhdHVyZXMgPSBuZXcgRW51bVNldDxfRmVhdHVyZT4uZnJvbVZhbHVlKHNvdXJjZS5yZWFkSW50KCkpOwogICAgX3R5cGVVc2VzID0gc291cmNlLnJlYWRMaXN0KCgpID0+IG5ldyBfVHlwZVVzZS5mcm9tRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgIGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIF9yZWRpcmVjdGluZ0luaXRpYWxpemVycyA9IHNvdXJjZS5yZWFkTGlzdCgKICAgICAgICAoKSA9PiBuZXcgX1JlZGlyZWN0aW5nSW5pdGlhbGl6ZXIuZnJvbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgICBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfZmllbGRJbml0aWFsaXplcnMgPSBzb3VyY2UucmVhZE1lbWJlck5vZGVzKGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIF9maWVsZENvbnN0YW50SW5pdGlhbGl6ZXJzID0KICAgICAgICBzb3VyY2UucmVhZE1lbWJlck1hcCgoKSA9PiBzb3VyY2UucmVhZFRyZWVOb2RlcygpLCBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfdHlwZUxpdGVyYWxzID0gc291cmNlLnJlYWRMaXN0KAogICAgICAgICgpID0+IG5ldyBfVHlwZUxpdGVyYWwuZnJvbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgICBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfbG9jYWxGdW5jdGlvbnMgPSBzb3VyY2UucmVhZFRyZWVOb2RlcyhlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfZ2VuZXJpY0luc3RhbnRpYXRpb25zID0gc291cmNlLnJlYWRMaXN0KAogICAgICAgICgpID0+IG5ldyBfR2VuZXJpY0luc3RhbnRpYXRpb24uZnJvbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgICBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfc3RhdGljU2V0cyA9IHNvdXJjZS5yZWFkTGlzdCgKICAgICAgICAoKSA9PiBuZXcgX1N0YXRpY0FjY2Vzcy5mcm9tRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgIGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIF9zdGF0aWNHZXRzID0gc291cmNlLnJlYWRMaXN0KAogICAgICAgICgpID0+IG5ldyBfU3RhdGljQWNjZXNzLmZyb21EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICAgZW1wdHlBc051bGw6IHRydWUpOwogICAgX3N0YXRpY1RlYXJPZmZzID0gc291cmNlLnJlYWRMaXN0KAogICAgICAgICgpID0+IG5ldyBfU3RhdGljQWNjZXNzLmZyb21EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICAgZW1wdHlBc051bGw6IHRydWUpOwogICAgX21hcExpdGVyYWxzID0gc291cmNlLnJlYWRMaXN0KCgpID0+IG5ldyBfTWFwTGl0ZXJhbC5mcm9tRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgIGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIF9saXN0TGl0ZXJhbHMgPSBzb3VyY2UucmVhZExpc3QoCiAgICAgICAgKCkgPT4gbmV3IF9Db250YWluZXJMaXRlcmFsLmZyb21EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICAgZW1wdHlBc051bGw6IHRydWUpOwogICAgX3NldExpdGVyYWxzID0gc291cmNlLnJlYWRMaXN0KAogICAgICAgICgpID0+IG5ldyBfQ29udGFpbmVyTGl0ZXJhbC5mcm9tRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgIGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIF9zeW1ib2xMaXRlcmFscyA9IHNvdXJjZS5yZWFkU3RyaW5ncyhlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfc3RyaW5nTGl0ZXJhbHMgPSBzb3VyY2UucmVhZFN0cmluZ3MoZW1wdHlBc051bGw6IHRydWUpOwogICAgX2Jvb2xMaXRlcmFscyA9IHNvdXJjZS5yZWFkTGlzdCgoKSA9PiBzb3VyY2UucmVhZEJvb2woKSwgZW1wdHlBc051bGw6IHRydWUpOwogICAgX2RvdWJsZUxpdGVyYWxzID0KICAgICAgICBzb3VyY2UucmVhZExpc3QoKCkgPT4gc291cmNlLnJlYWREb3VibGVWYWx1ZSgpLCBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfaW50TGl0ZXJhbHMgPQogICAgICAgIHNvdXJjZS5yZWFkTGlzdCgoKSA9PiBzb3VyY2UucmVhZEludGVnZXJWYWx1ZSgpLCBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfcnVudGltZVR5cGVVc2VzID0gc291cmNlLnJlYWRMaXN0KAogICAgICAgICgpID0+IG5ldyBfUnVudGltZVR5cGVVc2UuZnJvbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgICBlbXB0eUFzTnVsbDogdHJ1ZSk7CgogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoZXNlIHdoZW4gQ0ZFIHByb3ZpZGVzIGNvbnN0YW50cy4KICAgIF9jb25zdHJ1Y3Rvck5vZGVzID0KICAgICAgICBzb3VyY2UucmVhZE1lbWJlck5vZGVzPGlyLkNvbnN0cnVjdG9yPihlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfZmllbGROb2RlcyA9IHNvdXJjZS5yZWFkTWVtYmVyTm9kZXM8aXIuRmllbGQ+KGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIF9wcm9jZWR1cmVOb2RlcyA9IHNvdXJjZS5yZWFkTWVtYmVyTm9kZXM8aXIuUHJvY2VkdXJlPihlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfc3dpdGNoU3RhdGVtZW50Tm9kZXMgPQogICAgICAgIHNvdXJjZS5yZWFkVHJlZU5vZGVzPGlyLlN3aXRjaFN0YXRlbWVudD4oZW1wdHlBc051bGw6IHRydWUpOwogICAgX3N0YXRpY0ludm9jYXRpb25Ob2RlcyA9CiAgICAgICAgc291cmNlLnJlYWRUcmVlTm9kZXM8aXIuU3RhdGljSW52b2NhdGlvbj4oZW1wdHlBc051bGw6IHRydWUpOwogICAgX2NvbnN0Q29uc3RydWN0b3JJbnZvY2F0aW9uTm9kZXMgPQogICAgICAgIHNvdXJjZS5yZWFkVHJlZU5vZGVzPGlyLkNvbnN0cnVjdG9ySW52b2NhdGlvbj4oZW1wdHlBc051bGw6IHRydWUpOwogICAgc291cmNlLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB0b0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKCiAgICBzaW5rLndyaXRlTGlzdCgKICAgICAgICBfc3VwZXJJbml0aWFsaXplcnMsIChfU3VwZXJJbml0aWFsaXplciBvKSA9PiBvLnRvRGF0YVNpbmsoc2luayksCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVMaXN0KF9zdXBlclNldHMsIHNpbmsud3JpdGVOYW1lLCBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZUxpc3QoX3N1cGVyR2V0cywgc2luay53cml0ZU5hbWUsIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlTGlzdCgKICAgICAgICBfc3VwZXJJbnZvY2F0aW9ucywgKF9TdXBlckludm9jYXRpb24gbykgPT4gby50b0RhdGFTaW5rKHNpbmspLAogICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlTGlzdChfaW5zdGFuY2VTZXRzLCAoX0luc3RhbmNlQWNjZXNzIG8pID0+IG8udG9EYXRhU2luayhzaW5rKSwKICAgICAgICBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZUxpc3QoX2R5bmFtaWNTZXRzLCAoX0R5bmFtaWNBY2Nlc3MgbykgPT4gby50b0RhdGFTaW5rKHNpbmspLAogICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlTGlzdChfaW5zdGFuY2VHZXRzLCAoX0luc3RhbmNlQWNjZXNzIG8pID0+IG8udG9EYXRhU2luayhzaW5rKSwKICAgICAgICBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZUxpc3QoX2R5bmFtaWNHZXRzLCAoX0R5bmFtaWNBY2Nlc3MgbykgPT4gby50b0RhdGFTaW5rKHNpbmspLAogICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlTGlzdCgKICAgICAgICBfZnVuY3Rpb25JbnZvY2F0aW9ucywgKF9GdW5jdGlvbkludm9jYXRpb24gbykgPT4gby50b0RhdGFTaW5rKHNpbmspLAogICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlTGlzdCgKICAgICAgICBfaW5zdGFuY2VJbnZvY2F0aW9ucywgKF9JbnN0YW5jZUludm9jYXRpb24gbykgPT4gby50b0RhdGFTaW5rKHNpbmspLAogICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlTGlzdCgKICAgICAgICBfZHluYW1pY0ludm9jYXRpb25zLCAoX0R5bmFtaWNJbnZvY2F0aW9uIG8pID0+IG8udG9EYXRhU2luayhzaW5rKSwKICAgICAgICBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZUxpc3QoX2xvY2FsRnVuY3Rpb25JbnZvY2F0aW9ucywKICAgICAgICAoX0xvY2FsRnVuY3Rpb25JbnZvY2F0aW9uIG8pID0+IG8udG9EYXRhU2luayhzaW5rKSwKICAgICAgICBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZUxpc3QoCiAgICAgICAgX3N0YXRpY0ludm9jYXRpb25zLCAoX1N0YXRpY0ludm9jYXRpb24gbykgPT4gby50b0RhdGFTaW5rKHNpbmspLAogICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlTGlzdChfY29uc3RydWN0b3JJbnZvY2F0aW9ucywKICAgICAgICAoX0NvbnN0cnVjdG9ySW52b2NhdGlvbiBvKSA9PiBvLnRvRGF0YVNpbmsoc2luayksCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVJbnQoX2ZlYXR1cmVzPy52YWx1ZSA/PyAwKTsKICAgIHNpbmsud3JpdGVMaXN0KF90eXBlVXNlcywgKF9UeXBlVXNlIG8pID0+IG8udG9EYXRhU2luayhzaW5rKSwKICAgICAgICBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZUxpc3QoX3JlZGlyZWN0aW5nSW5pdGlhbGl6ZXJzLAogICAgICAgIChfUmVkaXJlY3RpbmdJbml0aWFsaXplciBvKSA9PiBvLnRvRGF0YVNpbmsoc2luayksCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVNZW1iZXJOb2RlcyhfZmllbGRJbml0aWFsaXplcnMsIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlTWVtYmVyTm9kZU1hcChfZmllbGRDb25zdGFudEluaXRpYWxpemVycywgc2luay53cml0ZVRyZWVOb2RlcywKICAgICAgICBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZUxpc3QoX3R5cGVMaXRlcmFscywgKF9UeXBlTGl0ZXJhbCBvKSA9PiBvLnRvRGF0YVNpbmsoc2luayksCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVUcmVlTm9kZXMoX2xvY2FsRnVuY3Rpb25zLCBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZUxpc3QoCiAgICAgICAgX2dlbmVyaWNJbnN0YW50aWF0aW9ucywgKF9HZW5lcmljSW5zdGFudGlhdGlvbiBvKSA9PiBvLnRvRGF0YVNpbmsoc2luayksCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVMaXN0KF9zdGF0aWNTZXRzLCAoX1N0YXRpY0FjY2VzcyBvKSA9PiBvLnRvRGF0YVNpbmsoc2luayksCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVMaXN0KF9zdGF0aWNHZXRzLCAoX1N0YXRpY0FjY2VzcyBvKSA9PiBvLnRvRGF0YVNpbmsoc2luayksCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVMaXN0KF9zdGF0aWNUZWFyT2ZmcywgKF9TdGF0aWNBY2Nlc3MgbykgPT4gby50b0RhdGFTaW5rKHNpbmspLAogICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlTGlzdChfbWFwTGl0ZXJhbHMsIChfTWFwTGl0ZXJhbCBvKSA9PiBvLnRvRGF0YVNpbmsoc2luayksCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVMaXN0KF9saXN0TGl0ZXJhbHMsIChfQ29udGFpbmVyTGl0ZXJhbCBvKSA9PiBvLnRvRGF0YVNpbmsoc2luayksCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVMaXN0KF9zZXRMaXRlcmFscywgKF9Db250YWluZXJMaXRlcmFsIG8pID0+IG8udG9EYXRhU2luayhzaW5rKSwKICAgICAgICBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZVN0cmluZ3MoX3N5bWJvbExpdGVyYWxzLCBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZVN0cmluZ3MoX3N0cmluZ0xpdGVyYWxzLCBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZUxpc3QoX2Jvb2xMaXRlcmFscywgc2luay53cml0ZUJvb2wsIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlTGlzdChfZG91YmxlTGl0ZXJhbHMsIHNpbmsud3JpdGVEb3VibGVWYWx1ZSwgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVMaXN0KF9pbnRMaXRlcmFscywgc2luay53cml0ZUludGVnZXJWYWx1ZSwgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVMaXN0KF9ydW50aW1lVHlwZVVzZXMsIChfUnVudGltZVR5cGVVc2UgbykgPT4gby50b0RhdGFTaW5rKHNpbmspLAogICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CgogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoZXNlIHdoZW4gQ0ZFIHByb3ZpZGVzIGNvbnN0YW50cy4KICAgIHNpbmsud3JpdGVNZW1iZXJOb2RlcyhfY29uc3RydWN0b3JOb2RlcywgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVNZW1iZXJOb2RlcyhfZmllbGROb2RlcywgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVNZW1iZXJOb2RlcyhfcHJvY2VkdXJlTm9kZXMsIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlVHJlZU5vZGVzKF9zd2l0Y2hTdGF0ZW1lbnROb2RlcywgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVUcmVlTm9kZXMoX3N0YXRpY0ludm9jYXRpb25Ob2RlcywgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVUcmVlTm9kZXMoX2NvbnN0Q29uc3RydWN0b3JJbnZvY2F0aW9uTm9kZXMsIGFsbG93TnVsbDogdHJ1ZSk7CgogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYXBwbHkoSW1wYWN0UmVnaXN0cnkgcmVnaXN0cnkpIHsKICAgIGlmIChfc3VwZXJJbml0aWFsaXplcnMgIT0gbnVsbCkgewogICAgICBmb3IgKF9TdXBlckluaXRpYWxpemVyIGRhdGEgaW4gX3N1cGVySW5pdGlhbGl6ZXJzKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJTdXBlckluaXRpYWxpemVyKAogICAgICAgICAgICBkYXRhLnNvdXJjZSwKICAgICAgICAgICAgZGF0YS50YXJnZXQsCiAgICAgICAgICAgIGRhdGEuY2FsbFN0cnVjdHVyZS5wb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICAgICAgICBkYXRhLmNhbGxTdHJ1Y3R1cmUubmFtZWRBcmd1bWVudHMsCiAgICAgICAgICAgIGRhdGEuY2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRzKTsKICAgICAgfQogICAgfQogICAgaWYgKF9zdXBlclNldHMgIT0gbnVsbCkgewogICAgICBmb3IgKGlyLk5hbWUgZGF0YSBpbiBfc3VwZXJTZXRzKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJTdXBlclNldChkYXRhKTsKICAgICAgfQogICAgfQogICAgaWYgKF9zdXBlckdldHMgIT0gbnVsbCkgewogICAgICBmb3IgKGlyLk5hbWUgZGF0YSBpbiBfc3VwZXJHZXRzKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJTdXBlckdldChkYXRhKTsKICAgICAgfQogICAgfQogICAgaWYgKF9zdXBlckludm9jYXRpb25zICE9IG51bGwpIHsKICAgICAgZm9yIChfU3VwZXJJbnZvY2F0aW9uIGRhdGEgaW4gX3N1cGVySW52b2NhdGlvbnMpIHsKICAgICAgICByZWdpc3RyeS5yZWdpc3RlclN1cGVySW52b2NhdGlvbigKICAgICAgICAgICAgZGF0YS5uYW1lLAogICAgICAgICAgICBkYXRhLmNhbGxTdHJ1Y3R1cmUucG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgICAgICAgZGF0YS5jYWxsU3RydWN0dXJlLm5hbWVkQXJndW1lbnRzLAogICAgICAgICAgICBkYXRhLmNhbGxTdHJ1Y3R1cmUudHlwZUFyZ3VtZW50cyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfaW5zdGFuY2VTZXRzICE9IG51bGwpIHsKICAgICAgZm9yIChfSW5zdGFuY2VBY2Nlc3MgZGF0YSBpbiBfaW5zdGFuY2VTZXRzKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJJbnN0YW5jZVNldCgKICAgICAgICAgICAgZGF0YS5yZWNlaXZlclR5cGUsIGRhdGEuY2xhc3NSZWxhdGlvbiwgZGF0YS50YXJnZXQpOwogICAgICB9CiAgICB9CiAgICBpZiAoX2R5bmFtaWNTZXRzICE9IG51bGwpIHsKICAgICAgZm9yIChfRHluYW1pY0FjY2VzcyBkYXRhIGluIF9keW5hbWljU2V0cykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyRHluYW1pY1NldCgKICAgICAgICAgICAgZGF0YS5yZWNlaXZlclR5cGUsIGRhdGEuY2xhc3NSZWxhdGlvbiwgZGF0YS5uYW1lKTsKICAgICAgfQogICAgfQogICAgaWYgKF9pbnN0YW5jZUdldHMgIT0gbnVsbCkgewogICAgICBmb3IgKF9JbnN0YW5jZUFjY2VzcyBkYXRhIGluIF9pbnN0YW5jZUdldHMpIHsKICAgICAgICByZWdpc3RyeS5yZWdpc3Rlckluc3RhbmNlR2V0KAogICAgICAgICAgICBkYXRhLnJlY2VpdmVyVHlwZSwgZGF0YS5jbGFzc1JlbGF0aW9uLCBkYXRhLnRhcmdldCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfZHluYW1pY0dldHMgIT0gbnVsbCkgewogICAgICBmb3IgKF9EeW5hbWljQWNjZXNzIGRhdGEgaW4gX2R5bmFtaWNHZXRzKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJEeW5hbWljR2V0KAogICAgICAgICAgICBkYXRhLnJlY2VpdmVyVHlwZSwgZGF0YS5jbGFzc1JlbGF0aW9uLCBkYXRhLm5hbWUpOwogICAgICB9CiAgICB9CiAgICBpZiAoX2Z1bmN0aW9uSW52b2NhdGlvbnMgIT0gbnVsbCkgewogICAgICBmb3IgKF9GdW5jdGlvbkludm9jYXRpb24gZGF0YSBpbiBfZnVuY3Rpb25JbnZvY2F0aW9ucykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyRnVuY3Rpb25JbnZvY2F0aW9uKAogICAgICAgICAgICBkYXRhLnJlY2VpdmVyVHlwZSwKICAgICAgICAgICAgZGF0YS5jYWxsU3RydWN0dXJlLnBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgICAgICAgIGRhdGEuY2FsbFN0cnVjdHVyZS5uYW1lZEFyZ3VtZW50cywKICAgICAgICAgICAgZGF0YS5jYWxsU3RydWN0dXJlLnR5cGVBcmd1bWVudHMpOwogICAgICB9CiAgICB9CiAgICBpZiAoX2luc3RhbmNlSW52b2NhdGlvbnMgIT0gbnVsbCkgewogICAgICBmb3IgKF9JbnN0YW5jZUludm9jYXRpb24gZGF0YSBpbiBfaW5zdGFuY2VJbnZvY2F0aW9ucykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVySW5zdGFuY2VJbnZvY2F0aW9uKAogICAgICAgICAgICBkYXRhLnJlY2VpdmVyVHlwZSwKICAgICAgICAgICAgZGF0YS5jbGFzc1JlbGF0aW9uLAogICAgICAgICAgICBkYXRhLnRhcmdldCwKICAgICAgICAgICAgZGF0YS5jYWxsU3RydWN0dXJlLnBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgICAgICAgIGRhdGEuY2FsbFN0cnVjdHVyZS5uYW1lZEFyZ3VtZW50cywKICAgICAgICAgICAgZGF0YS5jYWxsU3RydWN0dXJlLnR5cGVBcmd1bWVudHMpOwogICAgICB9CiAgICB9CiAgICBpZiAoX2R5bmFtaWNJbnZvY2F0aW9ucyAhPSBudWxsKSB7CiAgICAgIGZvciAoX0R5bmFtaWNJbnZvY2F0aW9uIGRhdGEgaW4gX2R5bmFtaWNJbnZvY2F0aW9ucykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyRHluYW1pY0ludm9jYXRpb24oCiAgICAgICAgICAgIGRhdGEucmVjZWl2ZXJUeXBlLAogICAgICAgICAgICBkYXRhLmNsYXNzUmVsYXRpb24sCiAgICAgICAgICAgIGRhdGEubmFtZSwKICAgICAgICAgICAgZGF0YS5jYWxsU3RydWN0dXJlLnBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgICAgICAgIGRhdGEuY2FsbFN0cnVjdHVyZS5uYW1lZEFyZ3VtZW50cywKICAgICAgICAgICAgZGF0YS5jYWxsU3RydWN0dXJlLnR5cGVBcmd1bWVudHMpOwogICAgICB9CiAgICB9CiAgICBpZiAoX2xvY2FsRnVuY3Rpb25JbnZvY2F0aW9ucyAhPSBudWxsKSB7CiAgICAgIGZvciAoX0xvY2FsRnVuY3Rpb25JbnZvY2F0aW9uIGRhdGEgaW4gX2xvY2FsRnVuY3Rpb25JbnZvY2F0aW9ucykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyTG9jYWxGdW5jdGlvbkludm9jYXRpb24oCiAgICAgICAgICAgIGRhdGEubG9jYWxGdW5jdGlvbiwKICAgICAgICAgICAgZGF0YS5jYWxsU3RydWN0dXJlLnBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgICAgICAgIGRhdGEuY2FsbFN0cnVjdHVyZS5uYW1lZEFyZ3VtZW50cywKICAgICAgICAgICAgZGF0YS5jYWxsU3RydWN0dXJlLnR5cGVBcmd1bWVudHMpOwogICAgICB9CiAgICB9CiAgICBpZiAoX3N0YXRpY0ludm9jYXRpb25zICE9IG51bGwpIHsKICAgICAgZm9yIChfU3RhdGljSW52b2NhdGlvbiBkYXRhIGluIF9zdGF0aWNJbnZvY2F0aW9ucykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgICAgZGF0YS50YXJnZXQsCiAgICAgICAgICAgIGRhdGEuY2FsbFN0cnVjdHVyZS5wb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICAgICAgICBkYXRhLmNhbGxTdHJ1Y3R1cmUubmFtZWRBcmd1bWVudHMsCiAgICAgICAgICAgIGRhdGEuY2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRzLAogICAgICAgICAgICBkYXRhLmltcG9ydCk7CiAgICAgICAgOwogICAgICB9CiAgICB9CiAgICBpZiAoX2NvbnN0cnVjdG9ySW52b2NhdGlvbnMgIT0gbnVsbCkgewogICAgICBmb3IgKF9Db25zdHJ1Y3Rvckludm9jYXRpb24gZGF0YSBpbiBfY29uc3RydWN0b3JJbnZvY2F0aW9ucykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyTmV3KAogICAgICAgICAgICBkYXRhLmNvbnN0cnVjdG9yLAogICAgICAgICAgICBkYXRhLnR5cGUsCiAgICAgICAgICAgIGRhdGEuY2FsbFN0cnVjdHVyZS5wb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICAgICAgICBkYXRhLmNhbGxTdHJ1Y3R1cmUubmFtZWRBcmd1bWVudHMsCiAgICAgICAgICAgIGRhdGEuY2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRzLAogICAgICAgICAgICBkYXRhLmltcG9ydCwKICAgICAgICAgICAgaXNDb25zdDogZGF0YS5pc0NvbnN0KTsKICAgICAgfQogICAgfQogICAgaWYgKF9jb25zdEluc3RhbnRpYXRpb25zICE9IG51bGwpIHsKICAgICAgZm9yIChfQ29uc3RJbnN0YW50aWF0aW9uIGRhdGEgaW4gX2NvbnN0SW5zdGFudGlhdGlvbnMpIHsKICAgICAgICByZWdpc3RyeS5yZWdpc3RlckNvbnN0SW5zdGFudGlhdGlvbigKICAgICAgICAgICAgZGF0YS5jbHMsIGRhdGEudHlwZUFyZ3VtZW50cywgZGF0YS5pbXBvcnQpOwogICAgICB9CiAgICB9CiAgICBpZiAoX2ZlYXR1cmVzICE9IG51bGwpIHsKICAgICAgZm9yIChfRmVhdHVyZSBkYXRhIGluIF9mZWF0dXJlcy5pdGVyYWJsZShfRmVhdHVyZS52YWx1ZXMpKSB7CiAgICAgICAgc3dpdGNoIChkYXRhKSB7CiAgICAgICAgICBjYXNlIF9GZWF0dXJlLmxhenlGaWVsZDoKICAgICAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJMYXp5RmllbGQoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF9GZWF0dXJlLmxvYWRMaWJyYXJ5OgogICAgICAgICAgICByZWdpc3RyeS5yZWdpc3RlckxvYWRMaWJyYXJ5KCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBfRmVhdHVyZS5zdGFja1RyYWNlOgogICAgICAgICAgICByZWdpc3RyeS5yZWdpc3RlclN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF9GZWF0dXJlLmNhdGNoQ2xhdXNlOgogICAgICAgICAgICByZWdpc3RyeS5yZWdpc3RlckNhdGNoKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBfRmVhdHVyZS50aHJvd0V4cHJlc3Npb246CiAgICAgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyVGhyb3coKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF9GZWF0dXJlLmxvY2FsV2l0aG91dEluaXRpYWxpemVyOgogICAgICAgICAgICByZWdpc3RyeS5yZWdpc3RlckxvY2FsV2l0aG91dEluaXRpYWxpemVyKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBfRmVhdHVyZS5zdHJpbmdDb25jYXRlbmF0aW9uOgogICAgICAgICAgICByZWdpc3RyeS5yZWdpc3RlclN0cmluZ0NvbmNhdGVuYXRpb24oKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF9GZWF0dXJlLmFzc2VydFdpdGhNZXNzYWdlOgogICAgICAgICAgICByZWdpc3RyeS5yZWdpc3RlckFzc2VydCh3aXRoTWVzc2FnZTogdHJ1ZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBfRmVhdHVyZS5hc3NlcnRXaXRob3V0TWVzc2FnZToKICAgICAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJBc3NlcnQod2l0aE1lc3NhZ2U6IGZhbHNlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF9GZWF0dXJlLm51bGxMaXRlcmFsOgogICAgICAgICAgICByZWdpc3RyeS5yZWdpc3Rlck51bGxMaXRlcmFsKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKF90eXBlVXNlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoX1R5cGVVc2UgZGF0YSBpbiBfdHlwZVVzZXMpIHsKICAgICAgICBzd2l0Y2ggKGRhdGEua2luZCkgewogICAgICAgICAgY2FzZSBfVHlwZVVzZUtpbmQucGFyYW1ldGVyQ2hlY2s6CiAgICAgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyUGFyYW1ldGVyQ2hlY2soZGF0YS50eXBlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF9UeXBlVXNlS2luZC5jYXRjaFR5cGU6CiAgICAgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQ2F0Y2hUeXBlKGRhdGEudHlwZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBfVHlwZVVzZUtpbmQuYXN5bmNGb3JJbjoKICAgICAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJBc3luY0ZvckluKGRhdGEudHlwZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBfVHlwZVVzZUtpbmQuc3luY0ZvckluOgogICAgICAgICAgICByZWdpc3RyeS5yZWdpc3RlclN5bmNGb3JJbihkYXRhLnR5cGUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX1R5cGVVc2VLaW5kLmFzQ2FzdDoKICAgICAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJBc0Nhc3QoZGF0YS50eXBlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF9UeXBlVXNlS2luZC5pbXBsaWNpdENhc3Q6CiAgICAgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVySW1wbGljaXRDYXN0KGRhdGEudHlwZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBfVHlwZVVzZUtpbmQuaXNDaGVjazoKICAgICAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJJc0NoZWNrKGRhdGEudHlwZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBfVHlwZVVzZUtpbmQuYXN5bmNTdGFyTWFya2VyOgogICAgICAgICAgICByZWdpc3RyeS5yZWdpc3RlckFzeW5jU3RhcihkYXRhLnR5cGUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX1R5cGVVc2VLaW5kLmFzeW5jTWFya2VyOgogICAgICAgICAgICByZWdpc3RyeS5yZWdpc3RlckFzeW5jKGRhdGEudHlwZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBfVHlwZVVzZUtpbmQuc3luY1N0YXJNYXJrZXI6CiAgICAgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyU3luY1N0YXIoZGF0YS50eXBlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoX3JlZGlyZWN0aW5nSW5pdGlhbGl6ZXJzICE9IG51bGwpIHsKICAgICAgZm9yIChfUmVkaXJlY3RpbmdJbml0aWFsaXplciBkYXRhIGluIF9yZWRpcmVjdGluZ0luaXRpYWxpemVycykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyUmVkaXJlY3RpbmdJbml0aWFsaXplcigKICAgICAgICAgICAgZGF0YS5jb25zdHJ1Y3RvciwKICAgICAgICAgICAgZGF0YS5jYWxsU3RydWN0dXJlLnBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgICAgICAgIGRhdGEuY2FsbFN0cnVjdHVyZS5uYW1lZEFyZ3VtZW50cywKICAgICAgICAgICAgZGF0YS5jYWxsU3RydWN0dXJlLnR5cGVBcmd1bWVudHMpOwogICAgICB9CiAgICB9CiAgICBpZiAoX2ZpZWxkSW5pdGlhbGl6ZXJzICE9IG51bGwpIHsKICAgICAgZm9yIChpci5GaWVsZCBkYXRhIGluIF9maWVsZEluaXRpYWxpemVycykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyRmllbGRJbml0aWFsaXphdGlvbihkYXRhKTsKICAgICAgfQogICAgfQogICAgaWYgKF9maWVsZENvbnN0YW50SW5pdGlhbGl6ZXJzICE9IG51bGwpIHsKICAgICAgX2ZpZWxkQ29uc3RhbnRJbml0aWFsaXplcnMKICAgICAgICAgIC5mb3JFYWNoKChpci5GaWVsZCBmaWVsZCwgTGlzdDxDb25zdGFudFJlZmVyZW5jZT4gY29uc3RhbnRzKSB7CiAgICAgICAgZm9yIChDb25zdGFudFJlZmVyZW5jZSBjb25zdGFudCBpbiBjb25zdGFudHMpIHsKICAgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyRmllbGRDb25zdGFudEluaXRpYWxpemF0aW9uKGZpZWxkLCBjb25zdGFudCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIGlmIChfdHlwZUxpdGVyYWxzICE9IG51bGwpIHsKICAgICAgZm9yIChfVHlwZUxpdGVyYWwgZGF0YSBpbiBfdHlwZUxpdGVyYWxzKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJUeXBlTGl0ZXJhbChkYXRhLnR5cGUsIGRhdGEuaW1wb3J0KTsKICAgICAgfQogICAgfQogICAgaWYgKF9sb2NhbEZ1bmN0aW9ucyAhPSBudWxsKSB7CiAgICAgIGZvciAoaXIuVHJlZU5vZGUgZGF0YSBpbiBfbG9jYWxGdW5jdGlvbnMpIHsKICAgICAgICByZWdpc3RyeS5yZWdpc3RlckxvY2FsRnVuY3Rpb24oZGF0YSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfZ2VuZXJpY0luc3RhbnRpYXRpb25zICE9IG51bGwpIHsKICAgICAgZm9yIChfR2VuZXJpY0luc3RhbnRpYXRpb24gZGF0YSBpbiBfZ2VuZXJpY0luc3RhbnRpYXRpb25zKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJHZW5lcmljSW5zdGFudGlhdGlvbigKICAgICAgICAgICAgZGF0YS5leHByZXNzaW9uVHlwZSwgZGF0YS50eXBlQXJndW1lbnRzKTsKICAgICAgfQogICAgfQogICAgaWYgKF9zdGF0aWNTZXRzICE9IG51bGwpIHsKICAgICAgZm9yIChfU3RhdGljQWNjZXNzIGRhdGEgaW4gX3N0YXRpY1NldHMpIHsKICAgICAgICByZWdpc3RyeS5yZWdpc3RlclN0YXRpY1NldChkYXRhLnRhcmdldCwgZGF0YS5pbXBvcnQpOwogICAgICB9CiAgICB9CiAgICBpZiAoX3N0YXRpY0dldHMgIT0gbnVsbCkgewogICAgICBmb3IgKF9TdGF0aWNBY2Nlc3MgZGF0YSBpbiBfc3RhdGljR2V0cykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyU3RhdGljR2V0KGRhdGEudGFyZ2V0LCBkYXRhLmltcG9ydCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfc3RhdGljVGVhck9mZnMgIT0gbnVsbCkgewogICAgICBmb3IgKF9TdGF0aWNBY2Nlc3MgZGF0YSBpbiBfc3RhdGljVGVhck9mZnMpIHsKICAgICAgICByZWdpc3RyeS5yZWdpc3RlclN0YXRpY1RlYXJPZmYoZGF0YS50YXJnZXQsIGRhdGEuaW1wb3J0KTsKICAgICAgfQogICAgfQogICAgaWYgKF9tYXBMaXRlcmFscyAhPSBudWxsKSB7CiAgICAgIGZvciAoX01hcExpdGVyYWwgZGF0YSBpbiBfbWFwTGl0ZXJhbHMpIHsKICAgICAgICByZWdpc3RyeS5yZWdpc3Rlck1hcExpdGVyYWwoZGF0YS5rZXlUeXBlLCBkYXRhLnZhbHVlVHlwZSwKICAgICAgICAgICAgaXNDb25zdDogZGF0YS5pc0NvbnN0LCBpc0VtcHR5OiBkYXRhLmlzRW1wdHkpOwogICAgICB9CiAgICB9CiAgICBpZiAoX2xpc3RMaXRlcmFscyAhPSBudWxsKSB7CiAgICAgIGZvciAoX0NvbnRhaW5lckxpdGVyYWwgZGF0YSBpbiBfbGlzdExpdGVyYWxzKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJMaXN0TGl0ZXJhbChkYXRhLmVsZW1lbnRUeXBlLAogICAgICAgICAgICBpc0NvbnN0OiBkYXRhLmlzQ29uc3QsIGlzRW1wdHk6IGRhdGEuaXNFbXB0eSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfc2V0TGl0ZXJhbHMgIT0gbnVsbCkgewogICAgICBmb3IgKF9Db250YWluZXJMaXRlcmFsIGRhdGEgaW4gX3NldExpdGVyYWxzKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJTZXRMaXRlcmFsKGRhdGEuZWxlbWVudFR5cGUsCiAgICAgICAgICAgIGlzQ29uc3Q6IGRhdGEuaXNDb25zdCwgaXNFbXB0eTogZGF0YS5pc0VtcHR5KTsKICAgICAgfQogICAgfQogICAgaWYgKF9zeW1ib2xMaXRlcmFscyAhPSBudWxsKSB7CiAgICAgIGZvciAoU3RyaW5nIGRhdGEgaW4gX3N5bWJvbExpdGVyYWxzKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJTeW1ib2xMaXRlcmFsKGRhdGEpOwogICAgICB9CiAgICB9CiAgICBpZiAoX3N0cmluZ0xpdGVyYWxzICE9IG51bGwpIHsKICAgICAgZm9yIChTdHJpbmcgZGF0YSBpbiBfc3RyaW5nTGl0ZXJhbHMpIHsKICAgICAgICByZWdpc3RyeS5yZWdpc3RlclN0cmluZ0xpdGVyYWwoZGF0YSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfYm9vbExpdGVyYWxzICE9IG51bGwpIHsKICAgICAgZm9yIChib29sIGRhdGEgaW4gX2Jvb2xMaXRlcmFscykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQm9vbExpdGVyYWwoZGF0YSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfZG91YmxlTGl0ZXJhbHMgIT0gbnVsbCkgewogICAgICBmb3IgKGRvdWJsZSBkYXRhIGluIF9kb3VibGVMaXRlcmFscykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyRG91YmxlTGl0ZXJhbChkYXRhKTsKICAgICAgfQogICAgfQogICAgaWYgKF9pbnRMaXRlcmFscyAhPSBudWxsKSB7CiAgICAgIGZvciAoaW50IGRhdGEgaW4gX2ludExpdGVyYWxzKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJJbnRMaXRlcmFsKGRhdGEpOwogICAgICB9CiAgICB9CiAgICBpZiAoX3J1bnRpbWVUeXBlVXNlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoX1J1bnRpbWVUeXBlVXNlIGRhdGEgaW4gX3J1bnRpbWVUeXBlVXNlcykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyUnVudGltZVR5cGVVc2UoCiAgICAgICAgICAgIGRhdGEubm9kZSwgZGF0YS5raW5kLCBkYXRhLnJlY2VpdmVyVHlwZSwgZGF0YS5hcmd1bWVudFR5cGUpOwogICAgICB9CiAgICB9CgogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoZXNlIHdoZW4gQ0ZFIHByb3ZpZGVzIGNvbnN0YW50cy4KICAgIGlmIChfY29uc3RydWN0b3JOb2RlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoaXIuQ29uc3RydWN0b3IgZGF0YSBpbiBfY29uc3RydWN0b3JOb2RlcykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQ29uc3RydWN0b3JOb2RlKGRhdGEpOwogICAgICB9CiAgICB9CiAgICBpZiAoX2ZpZWxkTm9kZXMgIT0gbnVsbCkgewogICAgICBmb3IgKGlyLkZpZWxkIGRhdGEgaW4gX2ZpZWxkTm9kZXMpIHsKICAgICAgICByZWdpc3RyeS5yZWdpc3RlckZpZWxkTm9kZShkYXRhKTsKICAgICAgfQogICAgfQogICAgaWYgKF9wcm9jZWR1cmVOb2RlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoaXIuUHJvY2VkdXJlIGRhdGEgaW4gX3Byb2NlZHVyZU5vZGVzKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJQcm9jZWR1cmVOb2RlKGRhdGEpOwogICAgICB9CiAgICB9CiAgICBpZiAoX3N3aXRjaFN0YXRlbWVudE5vZGVzICE9IG51bGwpIHsKICAgICAgZm9yIChpci5Td2l0Y2hTdGF0ZW1lbnQgZGF0YSBpbiBfc3dpdGNoU3RhdGVtZW50Tm9kZXMpIHsKICAgICAgICByZWdpc3RyeS5yZWdpc3RlclN3aXRjaFN0YXRlbWVudE5vZGUoZGF0YSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfc3RhdGljSW52b2NhdGlvbk5vZGVzICE9IG51bGwpIHsKICAgICAgZm9yIChpci5TdGF0aWNJbnZvY2F0aW9uIGRhdGEgaW4gX3N0YXRpY0ludm9jYXRpb25Ob2RlcykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyU3RhdGljSW52b2NhdGlvbk5vZGUoZGF0YSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfY29uc3RDb25zdHJ1Y3Rvckludm9jYXRpb25Ob2RlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoaXIuQ29uc3RydWN0b3JJbnZvY2F0aW9uIGRhdGEgaW4gX2NvbnN0Q29uc3RydWN0b3JJbnZvY2F0aW9uTm9kZXMpIHsKICAgICAgICByZWdpc3RyeS5yZWdpc3RlckNvbnN0Q29uc3RydWN0b3JJbnZvY2F0aW9uTm9kZShkYXRhKTsKICAgICAgfQogICAgfQogIH0KfQoKY2xhc3MgX0NhbGxTdHJ1Y3R1cmUgewogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ19DYWxsU3RydWN0dXJlJzsKCiAgZmluYWwgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKICBmaW5hbCBpbnQgcG9zaXRpb25hbEFyZ3VtZW50czsKICBmaW5hbCBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHM7CgogIF9DYWxsU3RydWN0dXJlLmludGVybmFsKAogICAgICB0aGlzLnR5cGVBcmd1bWVudHMsIHRoaXMucG9zaXRpb25hbEFyZ3VtZW50cywgdGhpcy5uYW1lZEFyZ3VtZW50cyk7CgogIGZhY3RvcnkgX0NhbGxTdHJ1Y3R1cmUoaW50IHBvc2l0aW9uYWxBcmd1bWVudHMsIExpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cywKICAgICAgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykgewogICAgcmV0dXJuIG5ldyBfQ2FsbFN0cnVjdHVyZS5pbnRlcm5hbCgKICAgICAgICB0eXBlQXJndW1lbnRzLCBwb3NpdGlvbmFsQXJndW1lbnRzLCBuYW1lZEFyZ3VtZW50cyk7CiAgfQoKICBmYWN0b3J5IF9DYWxsU3RydWN0dXJlLmZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPSBzb3VyY2UucmVhZERhcnRUeXBlTm9kZXMoKTsKICAgIGludCBwb3NpdGlvbmFsQXJndW1lbnRzID0gc291cmNlLnJlYWRJbnQoKTsKICAgIExpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cyA9IHNvdXJjZS5yZWFkU3RyaW5ncygpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBfQ2FsbFN0cnVjdHVyZS5pbnRlcm5hbCgKICAgICAgICB0eXBlQXJndW1lbnRzLCBwb3NpdGlvbmFsQXJndW1lbnRzLCBuYW1lZEFyZ3VtZW50cyk7CiAgfQoKICB2b2lkIHRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZURhcnRUeXBlTm9kZXModHlwZUFyZ3VtZW50cyk7CiAgICBzaW5rLndyaXRlSW50KHBvc2l0aW9uYWxBcmd1bWVudHMpOwogICAgc2luay53cml0ZVN0cmluZ3MobmFtZWRBcmd1bWVudHMpOwogICAgc2luay5lbmQodGFnKTsKICB9Cn0KCmNsYXNzIF9TdXBlckluaXRpYWxpemVyIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdfU3VwZXJJbml0aWFsaXplcic7CgogIGZpbmFsIGlyLkNvbnN0cnVjdG9yIHNvdXJjZTsKICBmaW5hbCBpci5Db25zdHJ1Y3RvciB0YXJnZXQ7CiAgZmluYWwgX0NhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZTsKCiAgX1N1cGVySW5pdGlhbGl6ZXIodGhpcy5zb3VyY2UsIHRoaXMudGFyZ2V0LCB0aGlzLmNhbGxTdHJ1Y3R1cmUpOwoKICBmYWN0b3J5IF9TdXBlckluaXRpYWxpemVyLmZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGlyLkNvbnN0cnVjdG9yIHNvdXJjZUNvbnN0cnVjdG9yID0gc291cmNlLnJlYWRNZW1iZXJOb2RlKCk7CiAgICBpci5Db25zdHJ1Y3RvciB0YXJnZXRDb25zdHJ1Y3RvciA9IHNvdXJjZS5yZWFkTWVtYmVyTm9kZSgpOwogICAgX0NhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSA9IG5ldyBfQ2FsbFN0cnVjdHVyZS5mcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBfU3VwZXJJbml0aWFsaXplcigKICAgICAgICBzb3VyY2VDb25zdHJ1Y3RvciwgdGFyZ2V0Q29uc3RydWN0b3IsIGNhbGxTdHJ1Y3R1cmUpOwogIH0KCiAgdm9pZCB0b0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVNZW1iZXJOb2RlKHNvdXJjZSk7CiAgICBzaW5rLndyaXRlTWVtYmVyTm9kZSh0YXJnZXQpOwogICAgY2FsbFN0cnVjdHVyZS50b0RhdGFTaW5rKHNpbmspOwogICAgc2luay5lbmQodGFnKTsKICB9Cn0KCmNsYXNzIF9TdXBlckludm9jYXRpb24gewogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ19TdXBlckludm9jYXRpb24nOwoKICBmaW5hbCBpci5OYW1lIG5hbWU7CiAgZmluYWwgX0NhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZTsKCiAgX1N1cGVySW52b2NhdGlvbih0aGlzLm5hbWUsIHRoaXMuY2FsbFN0cnVjdHVyZSk7CgogIGZhY3RvcnkgX1N1cGVySW52b2NhdGlvbi5mcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5OYW1lIG5hbWUgPSBzb3VyY2UucmVhZE5hbWUoKTsKICAgIF9DYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUgPSBuZXcgX0NhbGxTdHJ1Y3R1cmUuZnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgX1N1cGVySW52b2NhdGlvbihuYW1lLCBjYWxsU3RydWN0dXJlKTsKICB9CgogIHZvaWQgdG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTmFtZShuYW1lKTsKICAgIGNhbGxTdHJ1Y3R1cmUudG9EYXRhU2luayhzaW5rKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQp9CgpjbGFzcyBfSW5zdGFuY2VBY2Nlc3MgewogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ19JbnN0YW5jZUFjY2Vzcyc7CgogIGZpbmFsIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZTsKICBmaW5hbCBDbGFzc1JlbGF0aW9uIGNsYXNzUmVsYXRpb247CiAgZmluYWwgaXIuTWVtYmVyIHRhcmdldDsKCiAgX0luc3RhbmNlQWNjZXNzKHRoaXMucmVjZWl2ZXJUeXBlLCB0aGlzLmNsYXNzUmVsYXRpb24sIHRoaXMudGFyZ2V0KTsKCiAgZmFjdG9yeSBfSW5zdGFuY2VBY2Nlc3MuZnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlID0gc291cmNlLnJlYWREYXJ0VHlwZU5vZGUoKTsKICAgIENsYXNzUmVsYXRpb24gY2xhc3NSZWxhdGlvbiA9IHNvdXJjZS5yZWFkRW51bShDbGFzc1JlbGF0aW9uLnZhbHVlcyk7CiAgICBpci5NZW1iZXIgdGFyZ2V0ID0gc291cmNlLnJlYWRNZW1iZXJOb2RlKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IF9JbnN0YW5jZUFjY2VzcyhyZWNlaXZlclR5cGUsIGNsYXNzUmVsYXRpb24sIHRhcmdldCk7CiAgfQoKICB2b2lkIHRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZURhcnRUeXBlTm9kZShyZWNlaXZlclR5cGUpOwogICAgc2luay53cml0ZUVudW0oY2xhc3NSZWxhdGlvbik7CiAgICBzaW5rLndyaXRlTWVtYmVyTm9kZSh0YXJnZXQpOwogICAgc2luay5lbmQodGFnKTsKICB9Cn0KCmNsYXNzIF9EeW5hbWljQWNjZXNzIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdfRHluYW1pY0FjY2Vzcyc7CgogIGZpbmFsIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZTsKICBmaW5hbCBDbGFzc1JlbGF0aW9uIGNsYXNzUmVsYXRpb247CiAgZmluYWwgaXIuTmFtZSBuYW1lOwoKICBfRHluYW1pY0FjY2Vzcyh0aGlzLnJlY2VpdmVyVHlwZSwgdGhpcy5jbGFzc1JlbGF0aW9uLCB0aGlzLm5hbWUpOwoKICBmYWN0b3J5IF9EeW5hbWljQWNjZXNzLmZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSA9IHNvdXJjZS5yZWFkRGFydFR5cGVOb2RlKCk7CiAgICBDbGFzc1JlbGF0aW9uIGNsYXNzUmVsYXRpb24gPSBzb3VyY2UucmVhZEVudW0oQ2xhc3NSZWxhdGlvbi52YWx1ZXMpOwogICAgaXIuTmFtZSBuYW1lID0gc291cmNlLnJlYWROYW1lKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IF9EeW5hbWljQWNjZXNzKHJlY2VpdmVyVHlwZSwgY2xhc3NSZWxhdGlvbiwgbmFtZSk7CiAgfQoKICB2b2lkIHRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZURhcnRUeXBlTm9kZShyZWNlaXZlclR5cGUpOwogICAgc2luay53cml0ZUVudW0oY2xhc3NSZWxhdGlvbik7CiAgICBzaW5rLndyaXRlTmFtZShuYW1lKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQp9CgpjbGFzcyBfRnVuY3Rpb25JbnZvY2F0aW9uIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdfRnVuY3Rpb25JbnZvY2F0aW9uJzsKCiAgZmluYWwgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlOwogIGZpbmFsIF9DYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmU7CgogIF9GdW5jdGlvbkludm9jYXRpb24odGhpcy5yZWNlaXZlclR5cGUsIHRoaXMuY2FsbFN0cnVjdHVyZSk7CgogIGZhY3RvcnkgX0Z1bmN0aW9uSW52b2NhdGlvbi5mcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUgPSBzb3VyY2UucmVhZERhcnRUeXBlTm9kZSgpOwogICAgX0NhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSA9IG5ldyBfQ2FsbFN0cnVjdHVyZS5mcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBfRnVuY3Rpb25JbnZvY2F0aW9uKHJlY2VpdmVyVHlwZSwgY2FsbFN0cnVjdHVyZSk7CiAgfQoKICB2b2lkIHRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZURhcnRUeXBlTm9kZShyZWNlaXZlclR5cGUpOwogICAgY2FsbFN0cnVjdHVyZS50b0RhdGFTaW5rKHNpbmspOwogICAgc2luay5lbmQodGFnKTsKICB9Cn0KCmNsYXNzIF9JbnN0YW5jZUludm9jYXRpb24gewogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ19JbnN0YW5jZUludm9jYXRpb24nOwoKICBmaW5hbCBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGU7CiAgZmluYWwgQ2xhc3NSZWxhdGlvbiBjbGFzc1JlbGF0aW9uOwogIGZpbmFsIGlyLk1lbWJlciB0YXJnZXQ7CiAgZmluYWwgX0NhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZTsKCiAgX0luc3RhbmNlSW52b2NhdGlvbigKICAgICAgdGhpcy5yZWNlaXZlclR5cGUsIHRoaXMuY2xhc3NSZWxhdGlvbiwgdGhpcy50YXJnZXQsIHRoaXMuY2FsbFN0cnVjdHVyZSk7CgogIGZhY3RvcnkgX0luc3RhbmNlSW52b2NhdGlvbi5mcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUgPSBzb3VyY2UucmVhZERhcnRUeXBlTm9kZSgpOwogICAgQ2xhc3NSZWxhdGlvbiBjbGFzc1JlbGF0aW9uID0gc291cmNlLnJlYWRFbnVtKENsYXNzUmVsYXRpb24udmFsdWVzKTsKICAgIGlyLk1lbWJlciB0YXJnZXQgPSBzb3VyY2UucmVhZE1lbWJlck5vZGUoKTsKICAgIF9DYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUgPSBuZXcgX0NhbGxTdHJ1Y3R1cmUuZnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgX0luc3RhbmNlSW52b2NhdGlvbigKICAgICAgICByZWNlaXZlclR5cGUsIGNsYXNzUmVsYXRpb24sIHRhcmdldCwgY2FsbFN0cnVjdHVyZSk7CiAgfQoKICB2b2lkIHRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZURhcnRUeXBlTm9kZShyZWNlaXZlclR5cGUpOwogICAgc2luay53cml0ZUVudW0oY2xhc3NSZWxhdGlvbik7CiAgICBzaW5rLndyaXRlTWVtYmVyTm9kZSh0YXJnZXQpOwogICAgY2FsbFN0cnVjdHVyZS50b0RhdGFTaW5rKHNpbmspOwogICAgc2luay5lbmQodGFnKTsKICB9Cn0KCmNsYXNzIF9EeW5hbWljSW52b2NhdGlvbiB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnX0R5bmFtaWNJbnZvY2F0aW9uJzsKCiAgZmluYWwgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlOwogIGZpbmFsIENsYXNzUmVsYXRpb24gY2xhc3NSZWxhdGlvbjsKICBmaW5hbCBpci5OYW1lIG5hbWU7CiAgZmluYWwgX0NhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZTsKCiAgX0R5bmFtaWNJbnZvY2F0aW9uKAogICAgICB0aGlzLnJlY2VpdmVyVHlwZSwgdGhpcy5jbGFzc1JlbGF0aW9uLCB0aGlzLm5hbWUsIHRoaXMuY2FsbFN0cnVjdHVyZSk7CgogIGZhY3RvcnkgX0R5bmFtaWNJbnZvY2F0aW9uLmZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSA9IHNvdXJjZS5yZWFkRGFydFR5cGVOb2RlKCk7CiAgICBDbGFzc1JlbGF0aW9uIGNsYXNzUmVsYXRpb24gPSBzb3VyY2UucmVhZEVudW0oQ2xhc3NSZWxhdGlvbi52YWx1ZXMpOwogICAgaXIuTmFtZSBuYW1lID0gc291cmNlLnJlYWROYW1lKCk7CiAgICBfQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlID0gbmV3IF9DYWxsU3RydWN0dXJlLmZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IF9EeW5hbWljSW52b2NhdGlvbigKICAgICAgICByZWNlaXZlclR5cGUsIGNsYXNzUmVsYXRpb24sIG5hbWUsIGNhbGxTdHJ1Y3R1cmUpOwogIH0KCiAgdm9pZCB0b0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVEYXJ0VHlwZU5vZGUocmVjZWl2ZXJUeXBlKTsKICAgIHNpbmsud3JpdGVFbnVtKGNsYXNzUmVsYXRpb24pOwogICAgc2luay53cml0ZU5hbWUobmFtZSk7CiAgICBjYWxsU3RydWN0dXJlLnRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KfQoKY2xhc3MgX0xvY2FsRnVuY3Rpb25JbnZvY2F0aW9uIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdfTG9jYWxGdW5jdGlvbkludm9jYXRpb24nOwoKICBmaW5hbCBpci5GdW5jdGlvbkRlY2xhcmF0aW9uIGxvY2FsRnVuY3Rpb247CiAgZmluYWwgX0NhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZTsKCiAgX0xvY2FsRnVuY3Rpb25JbnZvY2F0aW9uKHRoaXMubG9jYWxGdW5jdGlvbiwgdGhpcy5jYWxsU3RydWN0dXJlKTsKCiAgZmFjdG9yeSBfTG9jYWxGdW5jdGlvbkludm9jYXRpb24uZnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgaXIuRnVuY3Rpb25EZWNsYXJhdGlvbiBsb2NhbEZ1bmN0aW9uID0gc291cmNlLnJlYWRUcmVlTm9kZSgpOwogICAgX0NhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSA9IG5ldyBfQ2FsbFN0cnVjdHVyZS5mcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBfTG9jYWxGdW5jdGlvbkludm9jYXRpb24obG9jYWxGdW5jdGlvbiwgY2FsbFN0cnVjdHVyZSk7CiAgfQoKICB2b2lkIHRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZVRyZWVOb2RlKGxvY2FsRnVuY3Rpb24pOwogICAgY2FsbFN0cnVjdHVyZS50b0RhdGFTaW5rKHNpbmspOwogICAgc2luay5lbmQodGFnKTsKICB9Cn0KCmNsYXNzIF9TdGF0aWNJbnZvY2F0aW9uIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdfU3RhdGljSW52b2NhdGlvbic7CgogIGZpbmFsIGlyLlByb2NlZHVyZSB0YXJnZXQ7CiAgZmluYWwgX0NhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZTsKICBmaW5hbCBpci5MaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQ7CgogIF9TdGF0aWNJbnZvY2F0aW9uKHRoaXMudGFyZ2V0LCB0aGlzLmNhbGxTdHJ1Y3R1cmUsIHRoaXMuaW1wb3J0KTsKCiAgZmFjdG9yeSBfU3RhdGljSW52b2NhdGlvbi5mcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5Qcm9jZWR1cmUgdGFyZ2V0ID0gc291cmNlLnJlYWRNZW1iZXJOb2RlKCk7CiAgICBfQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlID0gbmV3IF9DYWxsU3RydWN0dXJlLmZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBpci5MaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQgPSBzb3VyY2UucmVhZExpYnJhcnlEZXBlbmRlbmN5Tm9kZU9yTnVsbCgpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBfU3RhdGljSW52b2NhdGlvbih0YXJnZXQsIGNhbGxTdHJ1Y3R1cmUsIGltcG9ydCk7CiAgfQoKICB2b2lkIHRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZU1lbWJlck5vZGUodGFyZ2V0KTsKICAgIGNhbGxTdHJ1Y3R1cmUudG9EYXRhU2luayhzaW5rKTsKICAgIHNpbmsud3JpdGVMaWJyYXJ5RGVwZW5kZW5jeU5vZGVPck51bGwoaW1wb3J0KTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQp9CgpjbGFzcyBfQ29uc3RydWN0b3JJbnZvY2F0aW9uIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdfQ29uc3RydWN0b3JJbnZvY2F0aW9uJzsKCiAgZmluYWwgaXIuTWVtYmVyIGNvbnN0cnVjdG9yOwogIGZpbmFsIGlyLkludGVyZmFjZVR5cGUgdHlwZTsKICBmaW5hbCBfQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlOwogIGZpbmFsIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydDsKICBmaW5hbCBib29sIGlzQ29uc3Q7CgogIF9Db25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICAgIHRoaXMuY29uc3RydWN0b3IsIHRoaXMudHlwZSwgdGhpcy5jYWxsU3RydWN0dXJlLCB0aGlzLmltcG9ydCwKICAgICAge3RoaXMuaXNDb25zdH0pOwoKICBmYWN0b3J5IF9Db25zdHJ1Y3Rvckludm9jYXRpb24uZnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgaXIuTWVtYmVyIGNvbnN0cnVjdG9yID0gc291cmNlLnJlYWRNZW1iZXJOb2RlKCk7CiAgICBpci5JbnRlcmZhY2VUeXBlIHR5cGUgPSBzb3VyY2UucmVhZERhcnRUeXBlTm9kZSgpOwogICAgX0NhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSA9IG5ldyBfQ2FsbFN0cnVjdHVyZS5mcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgaXIuTGlicmFyeURlcGVuZGVuY3kgaW1wb3J0ID0gc291cmNlLnJlYWRMaWJyYXJ5RGVwZW5kZW5jeU5vZGVPck51bGwoKTsKICAgIGJvb2wgaXNDb25zdCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBfQ29uc3RydWN0b3JJbnZvY2F0aW9uKGNvbnN0cnVjdG9yLCB0eXBlLCBjYWxsU3RydWN0dXJlLCBpbXBvcnQsCiAgICAgICAgaXNDb25zdDogaXNDb25zdCk7CiAgfQoKICB2b2lkIHRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZU1lbWJlck5vZGUoY29uc3RydWN0b3IpOwogICAgc2luay53cml0ZURhcnRUeXBlTm9kZSh0eXBlKTsKICAgIGNhbGxTdHJ1Y3R1cmUudG9EYXRhU2luayhzaW5rKTsKICAgIHNpbmsud3JpdGVMaWJyYXJ5RGVwZW5kZW5jeU5vZGVPck51bGwoaW1wb3J0KTsKICAgIHNpbmsud3JpdGVCb29sKGlzQ29uc3QpOwogICAgc2luay5lbmQodGFnKTsKICB9Cn0KCmNsYXNzIF9Db25zdEluc3RhbnRpYXRpb24gewogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ19Db25zdEluc3RhbnRpYXRpb24nOwoKICBmaW5hbCBpci5DbGFzcyBjbHM7CiAgZmluYWwgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKICBmaW5hbCBpci5MaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQ7CgogIF9Db25zdEluc3RhbnRpYXRpb24odGhpcy5jbHMsIHRoaXMudHlwZUFyZ3VtZW50cywgdGhpcy5pbXBvcnQpOwoKICBmYWN0b3J5IF9Db25zdEluc3RhbnRpYXRpb24uZnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgaXIuQ2xhc3MgY2xzID0gc291cmNlLnJlYWRDbGFzc05vZGUoKTsKICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPSBzb3VyY2UucmVhZERhcnRUeXBlTm9kZXMoKTsKICAgIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydCA9IHNvdXJjZS5yZWFkTGlicmFyeURlcGVuZGVuY3lOb2RlT3JOdWxsKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IF9Db25zdEluc3RhbnRpYXRpb24oY2xzLCB0eXBlQXJndW1lbnRzLCBpbXBvcnQpOwogIH0KCiAgdm9pZCB0b0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVDbGFzc05vZGUoY2xzKTsKICAgIHNpbmsud3JpdGVEYXJ0VHlwZU5vZGVzKHR5cGVBcmd1bWVudHMpOwogICAgc2luay53cml0ZUxpYnJhcnlEZXBlbmRlbmN5Tm9kZU9yTnVsbChpbXBvcnQpOwogICAgc2luay5lbmQodGFnKTsKICB9Cn0KCmVudW0gX0ZlYXR1cmUgewogIGxhenlGaWVsZCwKICBsb2FkTGlicmFyeSwKICBzdGFja1RyYWNlLAogIGNhdGNoQ2xhdXNlLAogIHRocm93RXhwcmVzc2lvbiwKICBsb2NhbFdpdGhvdXRJbml0aWFsaXplciwKICBzdHJpbmdDb25jYXRlbmF0aW9uLAogIGFzc2VydFdpdGhNZXNzYWdlLAogIGFzc2VydFdpdGhvdXRNZXNzYWdlLAogIG51bGxMaXRlcmFsLAp9CgpjbGFzcyBfVHlwZVVzZSB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnX1R5cGVVc2UnOwoKICBmaW5hbCBpci5EYXJ0VHlwZSB0eXBlOwogIGZpbmFsIF9UeXBlVXNlS2luZCBraW5kOwoKICBfVHlwZVVzZSh0aGlzLnR5cGUsIHRoaXMua2luZCk7CgogIGZhY3RvcnkgX1R5cGVVc2UuZnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgaXIuRGFydFR5cGUgdHlwZSA9IHNvdXJjZS5yZWFkRGFydFR5cGVOb2RlKCk7CiAgICBfVHlwZVVzZUtpbmQga2luZCA9IHNvdXJjZS5yZWFkRW51bShfVHlwZVVzZUtpbmQudmFsdWVzKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgX1R5cGVVc2UodHlwZSwga2luZCk7CiAgfQoKICB2b2lkIHRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZURhcnRUeXBlTm9kZSh0eXBlKTsKICAgIHNpbmsud3JpdGVFbnVtKGtpbmQpOwogICAgc2luay5lbmQodGFnKTsKICB9Cn0KCmVudW0gX1R5cGVVc2VLaW5kIHsKICBwYXJhbWV0ZXJDaGVjaywKICBjYXRjaFR5cGUsCiAgYXN5bmNGb3JJbiwKICBzeW5jRm9ySW4sCiAgYXNDYXN0LAogIGltcGxpY2l0Q2FzdCwKICBpc0NoZWNrLAogIGFzeW5jU3Rhck1hcmtlciwKICBhc3luY01hcmtlciwKICBzeW5jU3Rhck1hcmtlciwKfQoKY2xhc3MgX1JlZGlyZWN0aW5nSW5pdGlhbGl6ZXIgewogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ19SZWRpcmVjdGluZ0luaXRpYWxpemVyJzsKCiAgZmluYWwgaXIuQ29uc3RydWN0b3IgY29uc3RydWN0b3I7CiAgZmluYWwgX0NhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZTsKCiAgX1JlZGlyZWN0aW5nSW5pdGlhbGl6ZXIodGhpcy5jb25zdHJ1Y3RvciwgdGhpcy5jYWxsU3RydWN0dXJlKTsKCiAgZmFjdG9yeSBfUmVkaXJlY3RpbmdJbml0aWFsaXplci5mcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5Db25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHNvdXJjZS5yZWFkTWVtYmVyTm9kZSgpOwogICAgX0NhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSA9IG5ldyBfQ2FsbFN0cnVjdHVyZS5mcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBfUmVkaXJlY3RpbmdJbml0aWFsaXplcihjb25zdHJ1Y3RvciwgY2FsbFN0cnVjdHVyZSk7CiAgfQoKICB2b2lkIHRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZU1lbWJlck5vZGUoY29uc3RydWN0b3IpOwogICAgY2FsbFN0cnVjdHVyZS50b0RhdGFTaW5rKHNpbmspOwogICAgc2luay5lbmQodGFnKTsKICB9Cn0KCmNsYXNzIF9UeXBlTGl0ZXJhbCB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnX1R5cGVMaXRlcmFsJzsKCiAgZmluYWwgaXIuRGFydFR5cGUgdHlwZTsKICBmaW5hbCBpci5MaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQ7CgogIF9UeXBlTGl0ZXJhbCh0aGlzLnR5cGUsIHRoaXMuaW1wb3J0KTsKCiAgZmFjdG9yeSBfVHlwZUxpdGVyYWwuZnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgaXIuRGFydFR5cGUgdHlwZSA9IHNvdXJjZS5yZWFkRGFydFR5cGVOb2RlKCk7CiAgICBpci5MaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQgPSBzb3VyY2UucmVhZExpYnJhcnlEZXBlbmRlbmN5Tm9kZU9yTnVsbCgpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBfVHlwZUxpdGVyYWwodHlwZSwgaW1wb3J0KTsKICB9CgogIHZvaWQgdG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlRGFydFR5cGVOb2RlKHR5cGUpOwogICAgc2luay53cml0ZUxpYnJhcnlEZXBlbmRlbmN5Tm9kZU9yTnVsbChpbXBvcnQpOwogICAgc2luay5lbmQodGFnKTsKICB9Cn0KCmNsYXNzIF9HZW5lcmljSW5zdGFudGlhdGlvbiB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnX0dlbmVyaWNJbnN0YW50aWF0aW9uJzsKCiAgZmluYWwgaXIuRnVuY3Rpb25UeXBlIGV4cHJlc3Npb25UeXBlOwogIGZpbmFsIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHM7CgogIF9HZW5lcmljSW5zdGFudGlhdGlvbih0aGlzLmV4cHJlc3Npb25UeXBlLCB0aGlzLnR5cGVBcmd1bWVudHMpOwoKICBmYWN0b3J5IF9HZW5lcmljSW5zdGFudGlhdGlvbi5mcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5GdW5jdGlvblR5cGUgZXhwcmVzc2lvblR5cGUgPSBzb3VyY2UucmVhZERhcnRUeXBlTm9kZSgpOwogICAgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9IHNvdXJjZS5yZWFkRGFydFR5cGVOb2RlcygpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBfR2VuZXJpY0luc3RhbnRpYXRpb24oZXhwcmVzc2lvblR5cGUsIHR5cGVBcmd1bWVudHMpOwogIH0KCiAgdm9pZCB0b0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVEYXJ0VHlwZU5vZGUoZXhwcmVzc2lvblR5cGUpOwogICAgc2luay53cml0ZURhcnRUeXBlTm9kZXModHlwZUFyZ3VtZW50cyk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KfQoKY2xhc3MgX1N0YXRpY0FjY2VzcyB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnX1N0YXRpY0FjY2Vzcyc7CgogIGZpbmFsIGlyLk1lbWJlciB0YXJnZXQ7CiAgZmluYWwgaXIuTGlicmFyeURlcGVuZGVuY3kgaW1wb3J0OwoKICBfU3RhdGljQWNjZXNzKHRoaXMudGFyZ2V0LCB0aGlzLmltcG9ydCk7CgogIGZhY3RvcnkgX1N0YXRpY0FjY2Vzcy5mcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5NZW1iZXIgdGFyZ2V0ID0gc291cmNlLnJlYWRNZW1iZXJOb2RlKCk7CiAgICBpci5MaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQgPSBzb3VyY2UucmVhZExpYnJhcnlEZXBlbmRlbmN5Tm9kZU9yTnVsbCgpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBfU3RhdGljQWNjZXNzKHRhcmdldCwgaW1wb3J0KTsKICB9CgogIHZvaWQgdG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTWVtYmVyTm9kZSh0YXJnZXQpOwogICAgc2luay53cml0ZUxpYnJhcnlEZXBlbmRlbmN5Tm9kZU9yTnVsbChpbXBvcnQpOwogICAgc2luay5lbmQodGFnKTsKICB9Cn0KCmNsYXNzIF9NYXBMaXRlcmFsIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdfTWFwTGl0ZXJhbCc7CgogIGZpbmFsIGlyLkRhcnRUeXBlIGtleVR5cGU7CiAgZmluYWwgaXIuRGFydFR5cGUgdmFsdWVUeXBlOwogIGZpbmFsIGJvb2wgaXNDb25zdDsKICBmaW5hbCBib29sIGlzRW1wdHk7CgogIF9NYXBMaXRlcmFsKHRoaXMua2V5VHlwZSwgdGhpcy52YWx1ZVR5cGUsIHt0aGlzLmlzQ29uc3QsIHRoaXMuaXNFbXB0eX0pOwoKICBmYWN0b3J5IF9NYXBMaXRlcmFsLmZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGlyLkRhcnRUeXBlIGtleVR5cGUgPSBzb3VyY2UucmVhZERhcnRUeXBlTm9kZSgpOwogICAgaXIuRGFydFR5cGUgdmFsdWVUeXBlID0gc291cmNlLnJlYWREYXJ0VHlwZU5vZGUoKTsKICAgIGJvb2wgaXNDb25zdCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgYm9vbCBpc0VtcHR5ID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gX01hcExpdGVyYWwoa2V5VHlwZSwgdmFsdWVUeXBlLCBpc0NvbnN0OiBpc0NvbnN0LCBpc0VtcHR5OiBpc0VtcHR5KTsKICB9CgogIHZvaWQgdG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlRGFydFR5cGVOb2RlKGtleVR5cGUpOwogICAgc2luay53cml0ZURhcnRUeXBlTm9kZSh2YWx1ZVR5cGUpOwogICAgc2luay53cml0ZUJvb2woaXNDb25zdCk7CiAgICBzaW5rLndyaXRlQm9vbChpc0VtcHR5KTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQp9CgpjbGFzcyBfQ29udGFpbmVyTGl0ZXJhbCB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnX0NvbnRhaW5lckxpdGVyYWwnOwoKICBmaW5hbCBpci5EYXJ0VHlwZSBlbGVtZW50VHlwZTsKICBmaW5hbCBib29sIGlzQ29uc3Q7CiAgZmluYWwgYm9vbCBpc0VtcHR5OwoKICBfQ29udGFpbmVyTGl0ZXJhbCh0aGlzLmVsZW1lbnRUeXBlLCB7dGhpcy5pc0NvbnN0LCB0aGlzLmlzRW1wdHl9KTsKCiAgZmFjdG9yeSBfQ29udGFpbmVyTGl0ZXJhbC5mcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5EYXJ0VHlwZSBlbGVtZW50VHlwZSA9IHNvdXJjZS5yZWFkRGFydFR5cGVOb2RlKCk7CiAgICBib29sIGlzQ29uc3QgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGJvb2wgaXNFbXB0eSA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgcmV0dXJuIG5ldyBfQ29udGFpbmVyTGl0ZXJhbChlbGVtZW50VHlwZSwKICAgICAgICBpc0NvbnN0OiBpc0NvbnN0LCBpc0VtcHR5OiBpc0VtcHR5KTsKICB9CgogIHZvaWQgdG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlRGFydFR5cGVOb2RlKGVsZW1lbnRUeXBlKTsKICAgIHNpbmsud3JpdGVCb29sKGlzQ29uc3QpOwogICAgc2luay53cml0ZUJvb2woaXNFbXB0eSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KfQoKY2xhc3MgX1J1bnRpbWVUeXBlVXNlIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdfUnVudGltZVR5cGVVc2UnOwoKICBmaW5hbCBpci5Qcm9wZXJ0eUdldCBub2RlOwogIGZpbmFsIFJ1bnRpbWVUeXBlVXNlS2luZCBraW5kOwogIGZpbmFsIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZTsKICBmaW5hbCBpci5EYXJ0VHlwZSBhcmd1bWVudFR5cGU7CgogIF9SdW50aW1lVHlwZVVzZSh0aGlzLm5vZGUsIHRoaXMua2luZCwgdGhpcy5yZWNlaXZlclR5cGUsIHRoaXMuYXJndW1lbnRUeXBlKTsKCiAgZmFjdG9yeSBfUnVudGltZVR5cGVVc2UuZnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgaXIuVHJlZU5vZGUgbm9kZSA9IHNvdXJjZS5yZWFkVHJlZU5vZGUoKTsKICAgIFJ1bnRpbWVUeXBlVXNlS2luZCBraW5kID0gc291cmNlLnJlYWRFbnVtKFJ1bnRpbWVUeXBlVXNlS2luZC52YWx1ZXMpOwogICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlID0gc291cmNlLnJlYWREYXJ0VHlwZU5vZGUoKTsKICAgIGlyLkRhcnRUeXBlIGFyZ3VtZW50VHlwZSA9IHNvdXJjZS5yZWFkRGFydFR5cGVOb2RlKGFsbG93TnVsbDogdHJ1ZSk7CiAgICByZXR1cm4gbmV3IF9SdW50aW1lVHlwZVVzZShub2RlLCBraW5kLCByZWNlaXZlclR5cGUsIGFyZ3VtZW50VHlwZSk7CiAgfQoKICB2b2lkIHRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZVRyZWVOb2RlKG5vZGUpOwogICAgc2luay53cml0ZUVudW0oa2luZCk7CiAgICBzaW5rLndyaXRlRGFydFR5cGVOb2RlKHJlY2VpdmVyVHlwZSk7CiAgICBzaW5rLndyaXRlRGFydFR5cGVOb2RlKGFyZ3VtZW50VHlwZSwgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQp9CoZKAE5OPAEoNDUBLh8ZFiUbAU4/NQEmASwxIgQBPxwzBAEMIR0dHyMpJTgQEBxDBAEMKB0gBAEMKB0gBAEMRkYkNg4cQwQBDBxMIBhDBAEMG0gfTgQBDBxMIBhDBAEMG0gfTgQBDCMgHyMpJzwWHEMEAQwjIB4YHyMpJzwWEhAcQwQBDCIgHhQfIykmOhYSDhxDBAEMKCwfIyksRhccQwQBDCEbHyMnJSU4EFASBAEMFB0dHyMnIxgqQhUOUBAcBAEMUSUnH0MEAQwdKgQBDDI5BAEMJyIfIykrRBUcQwQBDB8sBAEMNCUoBAEMLDMtUAQBDEwgPQQBDC00BAEMHisEAQwZ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b3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAnLi4vanNfYmFja2VuZC9hbm5vdGF0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi91dGlsL2VudW1zZXQuZGFydCc7CmltcG9ydCAnYW5ub3RhdGlvbnMuZGFydCc7CmltcG9ydCAnaW1wYWN0LmRhcnQnOwppbXBvcnQgJ3Njb3BlLmRhcnQnOwoKY2xhc3MgTW9kdWxhck1lbWJlckRhdGEgewogIGZpbmFsIFNjb3BlTW9kZWwgc2NvcGVNb2RlbDsKICBmaW5hbCBJbXBhY3RCdWlsZGVyRGF0YSBpbXBhY3RCdWlsZGVyRGF0YTsKCiAgTW9kdWxhck1lbWJlckRhdGEodGhpcy5zY29wZU1vZGVsLCB0aGlzLmltcGFjdEJ1aWxkZXJEYXRhKTsKfQoKYWJzdHJhY3QgY2xhc3MgTW9kdWxhclN0cmF0ZWd5IHsKICBMaXN0PFByYWdtYUFubm90YXRpb25EYXRhPiBnZXRQcmFnbWFBbm5vdGF0aW9uRGF0YShpci5NZW1iZXIgbm9kZSk7CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEF2b2lkIHRoZSBuZWVkIGZvciBwYXNzaW5nIFtwcmFnbWFBbm5vdGF0aW9uc10uCiAgTW9kdWxhck1lbWJlckRhdGEgZ2V0TW9kdWxhck1lbWJlckRhdGEoCiAgICAgIGlyLk1lbWJlciBub2RlLCBFbnVtU2V0PFByYWdtYUFubm90YXRpb24+IHByYWdtYUFubm90YXRpb25zKTsKfQogAE5OPAEoNC8xNQEpHxsWFQEaHy0BPgIBIUYBSipEAgEkcGFja2FnZTpjb21waWxlci9zcmMvaXIvbW9kdWxhci5kYXJ0K3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2lyL3Njb3BlLmRhcnSPGC8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdjbG9zdXJlLmRhcnQnOwppbXBvcnQgJ3Njb3BlX3Zpc2l0b3IuZGFydCc7CmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUvY29uc3RhbnRfZXZhbHVhdG9yLmRhcnQnIGFzIGlyOwoKY2xhc3MgU2NvcGVNb2RlbCB7CiAgZmluYWwgQ2xvc3VyZVNjb3BlTW9kZWwgY2xvc3VyZVNjb3BlTW9kZWw7CiAgZmluYWwgVmFyaWFibGVTY29wZU1vZGVsIHZhcmlhYmxlU2NvcGVNb2RlbDsKICBmaW5hbCBJbml0aWFsaXplckNvbXBsZXhpdHkgaW5pdGlhbGl6ZXJDb21wbGV4aXR5OwoKICBjb25zdCBTY29wZU1vZGVsKAogICAgICB7dGhpcy5jbG9zdXJlU2NvcGVNb2RlbCwKICAgICAgdGhpcy52YXJpYWJsZVNjb3BlTW9kZWwsCiAgICAgIHRoaXMuaW5pdGlhbGl6ZXJDb21wbGV4aXR5fSkKICAgICAgOiBhc3NlcnQoaW5pdGlhbGl6ZXJDb21wbGV4aXR5ICE9IG51bGwpOwoKICAvLy8gSW5zcGVjdCBtZW1iZXJzIGFuZCBtYXJrIGlmIHRob3NlIG1lbWJlcnMgY2FwdHVyZSBhbnkgc3RhdGUgdGhhdCBuZWVkcyB0bwogIC8vLyBiZSBtYXJrZWQgYXMgZnJlZSB2YXJpYWJsZXMuCiAgZmFjdG9yeSBTY29wZU1vZGVsLmZyb20oCiAgICAgIGlyLk1lbWJlciBub2RlLCBpci5Db25zdGFudEV2YWx1YXRvciBjb25zdGFudEV2YWx1YXRvcikgewogICAgU2NvcGVNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTY29wZU1vZGVsQnVpbGRlcihjb25zdGFudEV2YWx1YXRvcik7CiAgICByZXR1cm4gYnVpbGRlci5jb21wdXRlTW9kZWwobm9kZSk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBWYXJpYWJsZVNjb3BlTW9kZWwgewogIFZhcmlhYmxlU2NvcGUgZ2V0U2NvcGVGb3IoaXIuVHJlZU5vZGUgbm9kZSk7CiAgSXRlcmFibGU8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4gZ2V0IGFzc2lnbmVkVmFyaWFibGVzOwogIGJvb2wgaXNFZmZlY3RpdmVseUZpbmFsKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSk7Cn0KCmNsYXNzIFZhcmlhYmxlU2NvcGVNb2RlbEltcGwgaW1wbGVtZW50cyBWYXJpYWJsZVNjb3BlTW9kZWwgewogIE1hcDxpci5UcmVlTm9kZSwgVmFyaWFibGVTY29wZT4gX3Njb3BlTWFwID0ge307CiAgU2V0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+IF9hc3NpZ25lZFZhcmlhYmxlczsKCiAgVmFyaWFibGVTY29wZSBjcmVhdGVTY29wZUZvcihpci5UcmVlTm9kZSBub2RlKSB7CiAgICByZXR1cm4gX3Njb3BlTWFwW25vZGVdID8/PSBuZXcgVmFyaWFibGVTY29wZUltcGwoKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJBc3NpZ25lZFZhcmlhYmxlKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgX2Fzc2lnbmVkVmFyaWFibGVzID8/PSBuZXcgU2V0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+KCk7CiAgICBfYXNzaWduZWRWYXJpYWJsZXMuYWRkKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgVmFyaWFibGVTY29wZSBnZXRTY29wZUZvcihpci5UcmVlTm9kZSBub2RlKSB7CiAgICByZXR1cm4gX3Njb3BlTWFwW25vZGVdOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4gZ2V0IGFzc2lnbmVkVmFyaWFibGVzID0+CiAgICAgIF9hc3NpZ25lZFZhcmlhYmxlcyA/PyA8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj5bXTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0VmZmVjdGl2ZWx5RmluYWwoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICByZXR1cm4gX2Fzc2lnbmVkVmFyaWFibGVzID09IG51bGwgfHwgIV9hc3NpZ25lZFZhcmlhYmxlcy5jb250YWlucyhub2RlKTsKICB9Cn0KCi8vLyBWYXJpYWJsZSBpbmZvcm1hdGlvbiBmb3IgYSBzY29wZS4KYWJzdHJhY3QgY2xhc3MgVmFyaWFibGVTY29wZSB7CiAgLy8vIFJldHVybnMgdGhlIHNldCBvZiBbaXIuVmFyaWFibGVEZWNsYXJhdGlvbl1zIHRoYXQgaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIGluCiAgLy8vIHRoaXMgc2NvcGUuCiAgSXRlcmFibGU8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4gZ2V0IGFzc2lnbmVkVmFyaWFibGVzOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBzY29wZSBoYXMgYSBbaXIuQ29udGludWVTd2l0Y2hTdGF0ZW1lbnRdLgogIGJvb2wgZ2V0IGhhc0NvbnRpbnVlU3dpdGNoOwp9CgpjbGFzcyBWYXJpYWJsZVNjb3BlSW1wbCBpbXBsZW1lbnRzIFZhcmlhYmxlU2NvcGUgewogIExpc3Q8VmFyaWFibGVTY29wZT4gX3N1YlNjb3BlczsKICBTZXQ8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4gX2Fzc2lnbmVkVmFyaWFibGVzOwogIEBvdmVycmlkZQogIGJvb2wgaGFzQ29udGludWVTd2l0Y2ggPSBmYWxzZTsKCiAgdm9pZCBhZGRTdWJTY29wZShWYXJpYWJsZVNjb3BlIHNjb3BlKSB7CiAgICBfc3ViU2NvcGVzID8/PSA8VmFyaWFibGVTY29wZT5bXTsKICAgIF9zdWJTY29wZXMuYWRkKHNjb3BlKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJBc3NpZ25lZFZhcmlhYmxlKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpIHsKICAgIF9hc3NpZ25lZFZhcmlhYmxlcyA/Pz0gbmV3IFNldDxpci5WYXJpYWJsZURlY2xhcmF0aW9uPigpOwogICAgX2Fzc2lnbmVkVmFyaWFibGVzLmFkZCh2YXJpYWJsZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxpci5WYXJpYWJsZURlY2xhcmF0aW9uPiBnZXQgYXNzaWduZWRWYXJpYWJsZXMgc3luYyogewogICAgaWYgKF9hc3NpZ25lZFZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgIHlpZWxkKiBfYXNzaWduZWRWYXJpYWJsZXM7CiAgICB9CiAgICBpZiAoX3N1YlNjb3BlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoVmFyaWFibGVTY29wZSBzdWJTY29wZSBpbiBfc3ViU2NvcGVzKSB7CiAgICAgICAgeWllbGQqIHN1YlNjb3BlLmFzc2lnbmVkVmFyaWFibGVzOwogICAgICB9CiAgICB9CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBWYXJpYWJsZUNvbGxlY3Rvck1peGluIHsKICBWYXJpYWJsZVNjb3BlSW1wbCBjdXJyZW50VmFyaWFibGVTY29wZTsKICBWYXJpYWJsZVNjb3BlTW9kZWxJbXBsIHZhcmlhYmxlU2NvcGVNb2RlbCA9IG5ldyBWYXJpYWJsZVNjb3BlTW9kZWxJbXBsKCk7CgogIHZvaWQgdmlzaXRJblZhcmlhYmxlU2NvcGUoaXIuVHJlZU5vZGUgcm9vdCwgdm9pZCBmKCkpIHsKICAgIFZhcmlhYmxlU2NvcGVJbXBsIG9sZFNjb3BlID0gY3VycmVudFZhcmlhYmxlU2NvcGU7CiAgICBjdXJyZW50VmFyaWFibGVTY29wZSA9IHZhcmlhYmxlU2NvcGVNb2RlbC5jcmVhdGVTY29wZUZvcihyb290KTsKICAgIG9sZFNjb3BlPy5hZGRTdWJTY29wZShjdXJyZW50VmFyaWFibGVTY29wZSk7CiAgICBmKCk7CiAgICBjdXJyZW50VmFyaWFibGVTY29wZSA9IG9sZFNjb3BlOwogIH0KCiAgdm9pZCByZWdpc3RlckFzc2lnbmVkVmFyaWFibGUoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICBjdXJyZW50VmFyaWFibGVTY29wZT8ucmVnaXN0ZXJBc3NpZ25lZFZhcmlhYmxlKG5vZGUpOwogICAgdmFyaWFibGVTY29wZU1vZGVsLnJlZ2lzdGVyQXNzaWduZWRWYXJpYWJsZShub2RlKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJDb250aW51ZVN3aXRjaCgpIHsKICAgIGN1cnJlbnRWYXJpYWJsZVNjb3BlPy5oYXNDb250aW51ZVN3aXRjaCA9IHRydWU7CiAgfQp9Cn0ATk48ASgXHUwBEy0vNQEUHx8jLwFQIxtASicEAgEkLzo4AgE9MjIBMzgEAT8+IgQBDDAcBAEMPDgBDDlNBAIBJh9REjoBRx4CATMiMgwiASomGwQBQz4mBAEMQSYhBh4zKwgGBAIBKCpMATo3RDEJJQQBPzo3BAEiNAQCASJwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci9zY29wZS5kYXJ0N3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2tlcm5lbC9kZWZlcnJlZF9sb2FkLmRhcnSaHC8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGtlcm5lbC5kZWZlcnJlZF9sb2FkX2RhdGE7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL2NvbXBpbGVyLmRhcnQnIHNob3cgQ29tcGlsZXI7CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9kZWZlcnJlZF9sb2FkLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2lyL3V0aWwuZGFydCc7CmltcG9ydCAnZWxlbWVudF9tYXAuZGFydCc7CgpjbGFzcyBLZXJuZWxEZWZlcnJlZExvYWRUYXNrIGV4dGVuZHMgRGVmZXJyZWRMb2FkVGFzayB7CiAgS2VybmVsVG9FbGVtZW50TWFwIF9lbGVtZW50TWFwOwogIE1hcDxpci5MaWJyYXJ5LCBTZXQ8aXIuTmFtZWROb2RlPj4gX2FkZGl0aW9uYWxFeHBvcnRzU2V0cyA9CiAgICAgIDxpci5MaWJyYXJ5LCBTZXQ8aXIuTmFtZWROb2RlPj57fTsKCiAgS2VybmVsRGVmZXJyZWRMb2FkVGFzayhDb21waWxlciBjb21waWxlciwgdGhpcy5fZWxlbWVudE1hcCkgOiBzdXBlcihjb21waWxlcik7CgogIEl0ZXJhYmxlPEltcG9ydEVudGl0eT4gX2ZpbmRJbXBvcnRzVG8oaXIuTmFtZWROb2RlIG5vZGUsIFN0cmluZyBub2RlTmFtZSwKICAgICAgaXIuTGlicmFyeSBlbmNsb3NpbmdMaWJyYXJ5LCBMaWJyYXJ5RW50aXR5IGxpYnJhcnkpIHsKICAgIHJldHVybiBtZWFzdXJlU3VidGFzaygnZmluZC1pbXBvcnRzJywgKCkgewogICAgICBMaXN0PEltcG9ydEVudGl0eT4gaW1wb3J0cyA9IFtdOwogICAgICBpci5MaWJyYXJ5IHNvdXJjZSA9IF9lbGVtZW50TWFwLmdldExpYnJhcnlOb2RlKGxpYnJhcnkpOwogICAgICBpZiAoIXNvdXJjZS5kZXBlbmRlbmNpZXMuYW55KChkKSA9PiBkLmlzRGVmZXJyZWQpKSByZXR1cm4gY29uc3QgW107CiAgICAgIGZvciAoaXIuTGlicmFyeURlcGVuZGVuY3kgZGVwZW5kZW5jeSBpbiBzb3VyY2UuZGVwZW5kZW5jaWVzKSB7CiAgICAgICAgaWYgKGRlcGVuZGVuY3kuaXNFeHBvcnQpIGNvbnRpbnVlOwogICAgICAgIGlmICghX2lzVmlzaWJsZShkZXBlbmRlbmN5LmNvbWJpbmF0b3JzLCBub2RlTmFtZSkpIGNvbnRpbnVlOwogICAgICAgIGlmIChlbmNsb3NpbmdMaWJyYXJ5ID09IGRlcGVuZGVuY3kudGFyZ2V0TGlicmFyeSB8fAogICAgICAgICAgICBhZGRpdGlvbmFsRXhwb3J0cyhkZXBlbmRlbmN5LnRhcmdldExpYnJhcnkpLmNvbnRhaW5zKG5vZGUpKSB7CiAgICAgICAgICBpbXBvcnRzLmFkZChfZWxlbWVudE1hcC5nZXRJbXBvcnQoZGVwZW5kZW5jeSkpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gaW1wb3J0czsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8SW1wb3J0RW50aXR5PiBjbGFzc0ltcG9ydHNUbygKICAgICAgQ2xhc3NFbnRpdHkgZWxlbWVudCwgTGlicmFyeUVudGl0eSBsaWJyYXJ5KSB7CiAgICBpci5DbGFzcyBub2RlID0gX2VsZW1lbnRNYXAuZ2V0Q2xhc3NOb2RlKGVsZW1lbnQpOwogICAgcmV0dXJuIF9maW5kSW1wb3J0c1RvKG5vZGUsIG5vZGUubmFtZSwgbm9kZS5lbmNsb3NpbmdMaWJyYXJ5LCBsaWJyYXJ5KTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPEltcG9ydEVudGl0eT4gdHlwZWRlZkltcG9ydHNUbygKICAgICAgVHlwZWRlZkVudGl0eSBlbGVtZW50LCBMaWJyYXJ5RW50aXR5IGxpYnJhcnkpIHsKICAgIGlyLlR5cGVkZWYgbm9kZSA9IF9lbGVtZW50TWFwLmdldFR5cGVkZWZOb2RlKGVsZW1lbnQpOwogICAgcmV0dXJuIF9maW5kSW1wb3J0c1RvKG5vZGUsIG5vZGUubmFtZSwgbm9kZS5lbmNsb3NpbmdMaWJyYXJ5LCBsaWJyYXJ5KTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPEltcG9ydEVudGl0eT4gbWVtYmVySW1wb3J0c1RvKAogICAgICBFbnRpdHkgZWxlbWVudCwgTGlicmFyeUVudGl0eSBsaWJyYXJ5KSB7CiAgICBpci5NZW1iZXIgbm9kZSA9IF9lbGVtZW50TWFwLmdldE1lbWJlck5vZGUoZWxlbWVudCk7CiAgICByZXR1cm4gX2ZpbmRJbXBvcnRzVG8oCiAgICAgICAgbm9kZSBpcyBpci5Db25zdHJ1Y3RvciA/IG5vZGUuZW5jbG9zaW5nQ2xhc3MgOiBub2RlLAogICAgICAgIG5vZGUgaXMgaXIuQ29uc3RydWN0b3IgPyBub2RlLmVuY2xvc2luZ0NsYXNzLm5hbWUgOiBub2RlLm5hbWUubmFtZSwKICAgICAgICBub2RlLmVuY2xvc2luZ0xpYnJhcnksCiAgICAgICAgbGlicmFyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNoZWNrRm9yRGVmZXJyZWRFcnJvckNhc2VzKExpYnJhcnlFbnRpdHkgbGlicmFyeSkgewogICAgLy8gTm90aGluZyB0byBkby4gVGhlIEZFIGNoZWNrcyBmb3IgZXJyb3IgY2FzZXMgdXBmcm9udC4KICB9CgogIEBvdmVycmlkZQogIHZvaWQgY29sbGVjdENvbnN0YW50c0Zyb21NZXRhZGF0YSgKICAgICAgRW50aXR5IGVsZW1lbnQsIFNldDxDb25zdGFudFZhbHVlPiBjb25zdGFudHMpIHsKICAgIC8vIE5vdGhpbmcgdG8gZG8uIEtlcm5lbC1waXBlbGluZSBkb2Vzbid0IHN1cHBvcnQgbWlycm9ycywgc28gd2UgZG9uJ3QgbmVlZAogICAgLy8gdG8gdHJhY2sgYW55IGNvbnN0YW50cyBmcm9tIG1ldGEtZGF0YS4KICB9CgogIEBvdmVycmlkZQogIHZvaWQgY29sbGVjdENvbnN0YW50c0luQm9keShNZW1iZXJFbnRpdHkgZWxlbWVudCwgRGVwZW5kZW5jaWVzIGRlcGVuZGVuY2llcykgewogICAgaXIuTWVtYmVyIG5vZGUgPSBfZWxlbWVudE1hcC5nZXRNZW1iZXJOb2RlKGVsZW1lbnQpOwoKICAgIC8vIEZldGNoIHRoZSBpbnRlcm5hbCBub2RlIGluIG9yZGVyIHRvIHNraXAgYW5ub3RhdGlvbnMgb24gdGhlIG1lbWJlci4KICAgIC8vIFRPRE8oc2lnbXVuZCk6IHJlcGxhY2UgdGhpcyBwYXR0ZXJuIHdoZW4gdGhlIGtlcm5lbC1hc3QgcHJvdmlkZXMgYSBiZXR0ZXIKICAgIC8vIHdheSB0byBza2lwIGFubm90YXRpb25zIChpc3N1ZSAzMTU2NSkuCiAgICB2YXIgdmlzaXRvciA9IG5ldyBDb25zdGFudENvbGxlY3RvcihfZWxlbWVudE1hcCwgZGVwZW5kZW5jaWVzKTsKICAgIGlmIChub2RlIGlzIGlyLkZpZWxkKSB7CiAgICAgIG5vZGUuaW5pdGlhbGl6ZXI/LmFjY2VwdCh2aXNpdG9yKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChub2RlIGlzIGlyLkNvbnN0cnVjdG9yKSB7CiAgICAgIG5vZGUuaW5pdGlhbGl6ZXJzLmZvckVhY2goKGkpID0+IGkuYWNjZXB0KHZpc2l0b3IpKTsKICAgIH0KICAgIG5vZGUuZnVuY3Rpb24/LmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIFNldDxpci5OYW1lZE5vZGU+IGFkZGl0aW9uYWxFeHBvcnRzKGlyLkxpYnJhcnkgbGlicmFyeSkgewogICAgcmV0dXJuIF9hZGRpdGlvbmFsRXhwb3J0c1NldHNbbGlicmFyeV0gPz89IG5ldyBTZXQ8aXIuTmFtZWROb2RlPi5mcm9tKAogICAgICAgIGxpYnJhcnkuYWRkaXRpb25hbEV4cG9ydHMubWFwKChpci5SZWZlcmVuY2UgcmVmKSA9PiByZWYubm9kZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjbGVhbnVwKCkgewogICAgX2FkZGl0aW9uYWxFeHBvcnRzU2V0cyA9IG51bGw7CiAgfQp9CgovLy8gUmV0dXJucyB3aGV0aGVyIFtuYW1lXSB3b3VsZCBiZSB2aXNpYmxlIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gbGlzdCBvZgovLy8gc2hvdy9oaWRlIFtjb21iaW5hdG9yc10uCmJvb2wgX2lzVmlzaWJsZShMaXN0PGlyLkNvbWJpbmF0b3I+IGNvbWJpbmF0b3JzLCBTdHJpbmcgbmFtZSkgewogIGZvciAodmFyIGMgaW4gY29tYmluYXRvcnMpIHsKICAgIGlmIChjLmlzU2hvdyAmJiAhYy5uYW1lcy5jb250YWlucyhuYW1lKSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKGMuaXNIaWRlICYmIGMubmFtZXMuY29udGFpbnMobmFtZSkpIHJldHVybiBmYWxzZTsKICB9CiAgcmV0dXJuIHRydWU7Cn0KCmNsYXNzIENvbnN0YW50Q29sbGVjdG9yIGV4dGVuZHMgaXIuUmVjdXJzaXZlVmlzaXRvciB7CiAgZmluYWwgS2VybmVsVG9FbGVtZW50TWFwIGVsZW1lbnRNYXA7CiAgZmluYWwgRGVwZW5kZW5jaWVzIGRlcGVuZGVuY2llczsKCiAgQ29uc3RhbnRDb2xsZWN0b3IodGhpcy5lbGVtZW50TWFwLCB0aGlzLmRlcGVuZGVuY2llcyk7CgogIENvbW1vbkVsZW1lbnRzIGdldCBjb21tb25FbGVtZW50cyA9PiBlbGVtZW50TWFwLmNvbW1vbkVsZW1lbnRzOwoKICB2b2lkIGFkZChpci5FeHByZXNzaW9uIG5vZGUsIHtib29sIHJlcXVpcmVkOiB0cnVlfSkgewogICAgQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9CiAgICAgICAgZWxlbWVudE1hcC5nZXRDb25zdGFudFZhbHVlKG5vZGUsIHJlcXVpcmVDb25zdGFudDogcmVxdWlyZWQpOwogICAgaWYgKGNvbnN0YW50ICE9IG51bGwpIHsKICAgICAgZGVwZW5kZW5jaWVzLmFkZENvbnN0YW50KAogICAgICAgICAgY29uc3RhbnQsIGVsZW1lbnRNYXAuZ2V0SW1wb3J0KGdldERlZmVycmVkSW1wb3J0KG5vZGUpKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW50TGl0ZXJhbChpci5JbnRMaXRlcmFsIGxpdGVyYWwpIHt9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREb3VibGVMaXRlcmFsKGlyLkRvdWJsZUxpdGVyYWwgbGl0ZXJhbCkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJvb2xMaXRlcmFsKGlyLkJvb2xMaXRlcmFsIGxpdGVyYWwpIHt9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdHJpbmdMaXRlcmFsKGlyLlN0cmluZ0xpdGVyYWwgbGl0ZXJhbCkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN5bWJvbExpdGVyYWwoaXIuU3ltYm9sTGl0ZXJhbCBsaXRlcmFsKSA9PiBhZGQobGl0ZXJhbCk7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXROdWxsTGl0ZXJhbChpci5OdWxsTGl0ZXJhbCBsaXRlcmFsKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGlzdExpdGVyYWwoaXIuTGlzdExpdGVyYWwgbGl0ZXJhbCkgewogICAgaWYgKGxpdGVyYWwuaXNDb25zdCkgewogICAgICBhZGQobGl0ZXJhbCk7CiAgICB9IGVsc2UgewogICAgICBzdXBlci52aXNpdExpc3RMaXRlcmFsKGxpdGVyYWwpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFNldExpdGVyYWwoaXIuU2V0TGl0ZXJhbCBsaXRlcmFsKSB7CiAgICBpZiAobGl0ZXJhbC5pc0NvbnN0KSB7CiAgICAgIGFkZChsaXRlcmFsKTsKICAgIH0gZWxzZSB7CiAgICAgIHN1cGVyLnZpc2l0U2V0TGl0ZXJhbChsaXRlcmFsKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRNYXBMaXRlcmFsKGlyLk1hcExpdGVyYWwgbGl0ZXJhbCkgewogICAgaWYgKGxpdGVyYWwuaXNDb25zdCkgewogICAgICBhZGQobGl0ZXJhbCk7CiAgICB9IGVsc2UgewogICAgICBzdXBlci52aXNpdE1hcExpdGVyYWwobGl0ZXJhbCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKGlyLkNvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7CiAgICBpZiAobm9kZS5pc0NvbnN0KSB7CiAgICAgIGFkZChub2RlKTsKICAgIH0gZWxzZSB7CiAgICAgIHN1cGVyLnZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKG5vZGUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVQYXJhbWV0ZXIoaXIuVHlwZVBhcmFtZXRlciBub2RlKSB7CiAgICAvLyBXZSBhdm9pZCB2aXNpdGluZyBtZXRhZGF0YSBvbiB0aGUgdHlwZSBwYXJhbWV0ZXIgZGVjbGFyYXRpb24uIFRoZSBib3VuZAogICAgLy8gY2Fubm90IGhvbGQgY29uc3RhbnRzIHNvIHdlIHNraXAgdGhhdCBhcyB3ZWxsLgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICAvLyBXZSBhdm9pZCB2aXNpdGluZyBtZXRhZGF0YSBvbiB0aGUgcGFyYW1ldGVyIGRlY2xhcmF0aW9uIGJ5IG9ubHkgdmlzaXRpbmcKICAgIC8vIHRoZSBpbml0aWFsaXplci4gVGhlIHR5cGUgY2Fubm90IGhvbGQgY29uc3RhbnRzIHNvIGNhbiBrYW4gc2tpcCB0aGF0CiAgICAvLyBhcyB3ZWxsLgogICAgbm9kZS5pbml0aWFsaXplcj8uYWNjZXB0KHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVMaXRlcmFsKGlyLlR5cGVMaXRlcmFsIG5vZGUpIHsKICAgIGlmIChub2RlLnR5cGUgaXMhIGlyLlR5cGVQYXJhbWV0ZXJUeXBlKSBhZGQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW5zdGFudGlhdGlvbihpci5JbnN0YW50aWF0aW9uIG5vZGUpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFRoZSBDRkUgc2hvdWxkIG1hcmsgY29uc3RhbnQgaW5zdGFudGlhdGlvbnMgYXMKICAgIC8vIGNvbnN0YW50LgogICAgYWRkKG5vZGUsIHJlcXVpcmVkOiBmYWxzZSk7CiAgICBzdXBlci52aXNpdEluc3RhbnRpYXRpb24obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29uc3RhbnRFeHByZXNzaW9uKGlyLkNvbnN0YW50RXhwcmVzc2lvbiBub2RlKSB7CiAgICBhZGQobm9kZSk7CiAgfQp9CoDfAE5OPAEjASgBIikjICQaGwE4Ij4pAVEBTDwvJz9KRStFPEo6CggWCAQBDCk0N0wEAQwrNjtMBAEMKi85Gz1MHxIEAQw7PQQBDCU2UC4EAQxROQFLUS5EHCkOBgEiOwYkBAE8S0gEAQwTIwQCAUsdQB87OgQPAgE2JyMBOQFCATgdRhwgRAYEAQwxAQw3AQwzAQw3AQxFAQwzAQwyGxQNJwYEAQwwGxQNJgYEAQwwGxQNJgYEAQxDGBENLgYEAQwzTzYEAQw/UEwQJAQBDC83BAEMM0sRICQEAQw9DwQCAS5wYWNrYWdlOmNvbXBpbGVyL3NyYy9rZXJuZWwvZGVmZXJyZWRfbG9hZC5kYXJ0NXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2tlcm5lbC9lbGVtZW50X21hcC5kYXJ0nG8vLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydCcgYXMgaXI7CgppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgS0NvbW1vbkVsZW1lbnRzLCBLRWxlbWVudEVudmlyb25tZW50OwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL25hbWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIGFzIGpzOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmFtZXIuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9uYXRpdmVfZGF0YS5kYXJ0JzsKaW1wb3J0ICcuLi9uYXRpdmUvYmVoYXZpb3IuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY2FsbF9zdHJ1Y3R1cmUuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCc7CgovLy8gSW50ZXJmYWNlIHRoYXQgdHJhbnNsYXRlcyBiZXR3ZWVuIEtlcm5lbCBJUiBub2RlcyBhbmQgZW50aXRpZXMgdXNlZCBmb3IKLy8vIGNvbXB1dGluZyB0aGUgW1dvcmxkSW1wYWN0XSBmb3IgbWVtYmVycy4KYWJzdHJhY3QgY2xhc3MgS2VybmVsVG9FbGVtZW50TWFwIHsKICBLRWxlbWVudEVudmlyb25tZW50IGdldCBlbGVtZW50RW52aXJvbm1lbnQ7CiAgTmF0aXZlQmFzaWNEYXRhIGdldCBuYXRpdmVCYXNpY0RhdGE7CgogIC8vLyBBY2Nlc3MgdG8gdGhlIGNvbW1vbmx5IHVzZWQgZWxlbWVudHMgYW5kIHR5cGVzLgogIEtDb21tb25FbGVtZW50cyBnZXQgY29tbW9uRWxlbWVudHM7CgogIC8vLyBBY2Nlc3MgdG8gdGhlIFtEYXJ0VHlwZXNdIG9iamVjdC4KICBEYXJ0VHlwZXMgZ2V0IHR5cGVzOwoKICAvLy8gUmV0dXJucyB0aGUgdHlwZSBlbnZpcm9ubWVudCBmb3IgdGhlIHVuZGVybHlpbmcga2VybmVsIG1vZGVsLgogIGlyLlR5cGVFbnZpcm9ubWVudCBnZXQgdHlwZUVudmlyb25tZW50OwoKICAvLy8gUmV0dXJucyB0aGUgY2xhc3MgaGllcmFyY2h5IGZvciB0aGUgdW5kZXJseWluZyBrZXJuZWwgbW9kZWwuCiAgaXIuQ2xhc3NIaWVyYXJjaHkgZ2V0IGNsYXNzSGllcmFyY2h5OwoKICAvLy8gUmV0dXJucyB0aGUgW0RhcnRUeXBlXSBjb3JyZXNwb25kaW5nIHRvIFt0eXBlXS4KICBEYXJ0VHlwZSBnZXREYXJ0VHlwZShpci5EYXJ0VHlwZSB0eXBlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtJbnRlcmZhY2VUeXBlXSBjb3JyZXNwb25kaW5nIHRvIFt0eXBlXS4KICBJbnRlcmZhY2VUeXBlIGdldEludGVyZmFjZVR5cGUoaXIuSW50ZXJmYWNlVHlwZSB0eXBlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtUeXBlVmFyaWFibGVUeXBlXSBjb3JyZXNwb25kaW5nIHRvIFt0eXBlXS4KICBUeXBlVmFyaWFibGVUeXBlIGdldFR5cGVWYXJpYWJsZVR5cGUoaXIuVHlwZVBhcmFtZXRlclR5cGUgdHlwZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbRnVuY3Rpb25UeXBlXSBvZiB0aGUgW25vZGVdLgogIEZ1bmN0aW9uVHlwZSBnZXRGdW5jdGlvblR5cGUoaXIuRnVuY3Rpb25Ob2RlIG5vZGUpOwoKICAvLy8gUmV0dXJuIHRoZSBbSW50ZXJmYWNlVHlwZV0gY29ycmVzcG9uZGluZyB0byB0aGUgW2Nsc10gd2l0aCB0aGUgZ2l2ZW4KICAvLy8gW3R5cGVBcmd1bWVudHNdLgogIEludGVyZmFjZVR5cGUgY3JlYXRlSW50ZXJmYWNlVHlwZSgKICAgICAgaXIuQ2xhc3MgY2xzLCBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzKTsKCiAgLy8vIFJldHVybnMgdGhlIFtDYWxsU3RydWN0dXJlXSBjb3JyZXNwb25kaW5nIHRvIHRoZSBbYXJndW1lbnRzXS4KICBDYWxsU3RydWN0dXJlIGdldENhbGxTdHJ1Y3R1cmUoaXIuQXJndW1lbnRzIGFyZ3VtZW50cyk7CgogIC8vLyBSZXR1cm5zIHRoZSBbU2VsZWN0b3JdIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGludm9jYXRpb24gb2YgW25hbWVdIHdpdGgKICAvLy8gW2FyZ3VtZW50c10uCiAgU2VsZWN0b3IgZ2V0SW52b2NhdGlvblNlbGVjdG9yKGlyLk5hbWUgbmFtZSwgaW50IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIExpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cywgaW50IHR5cGVBcmd1bWVudHMpOwoKICAvLy8gUmV0dXJucyB0aGUgW01lbWJlckVudGl0eV0gY29ycmVzcG9uZGluZyB0byB0aGUgbWVtYmVyIFtub2RlXS4KICBNZW1iZXJFbnRpdHkgZ2V0TWVtYmVyKGlyLk1lbWJlciBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtGdW5jdGlvbkVudGl0eV0gY29ycmVzcG9uZGluZyB0byB0aGUgcHJvY2VkdXJlIFtub2RlXS4KICBGdW5jdGlvbkVudGl0eSBnZXRNZXRob2QoaXIuUHJvY2VkdXJlIG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgW0NvbnN0cnVjdG9yRW50aXR5XSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnZW5lcmF0aXZlIG9yIGZhY3RvcnkKICAvLy8gY29uc3RydWN0b3IgW25vZGVdLgogIENvbnN0cnVjdG9yRW50aXR5IGdldENvbnN0cnVjdG9yKGlyLk1lbWJlciBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtGaWVsZEVudGl0eV0gY29ycmVzcG9uZGluZyB0byB0aGUgZmllbGQgW25vZGVdLgogIEZpZWxkRW50aXR5IGdldEZpZWxkKGlyLkZpZWxkIG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgW0NsYXNzRW50aXR5XSBjb3JyZXNwb25kaW5nIHRvIHRoZSBjbGFzcyBbbm9kZV0uCiAgQ2xhc3NFbnRpdHkgZ2V0Q2xhc3MoaXIuQ2xhc3Mgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbVHlwZWRlZlR5cGVdIGNvcnJlc3BvbmRpbmcgdG8gcmF3IHR5cGUgb2YgdGhlIHR5cGVkZWYgW25vZGVdLgogIFR5cGVkZWZUeXBlIGdldFR5cGVkZWZUeXBlKGlyLlR5cGVkZWYgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBzdXBlciBbTWVtYmVyRW50aXR5XSBmb3IgYSBzdXBlciBpbnZvY2F0aW9uLCBnZXQgb3Igc2V0IG9mCiAgLy8vIFtuYW1lXSBmcm9tIHRoZSBtZW1iZXIgW2NvbnRleHRdLgogIE1lbWJlckVudGl0eSBnZXRTdXBlck1lbWJlcihNZW1iZXJFbnRpdHkgY29udGV4dCwgaXIuTmFtZSBuYW1lLAogICAgICB7Ym9vbCBzZXR0ZXI6IGZhbHNlfSk7CgogIC8vLyBSZXR1cm5zIHRoZSBgbm9TdWNoTWV0aG9kYCBbRnVuY3Rpb25FbnRpdHldIGNhbGwgZnJvbSBhCiAgLy8vIGBzdXBlci5ub1N1Y2hNZXRob2RgIGludm9jYXRpb24gd2l0aGluIFtjbHNdLgogIEZ1bmN0aW9uRW50aXR5IGdldFN1cGVyTm9TdWNoTWV0aG9kKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIHRoZSBbTmFtZV0gY29ycmVzcG9uZGluZyB0byBbbmFtZV0uCiAgTmFtZSBnZXROYW1lKGlyLk5hbWUgbmFtZSk7CgogIC8vLyBDb21wdXRlcyB0aGUgW05hdGl2ZUJlaGF2aW9yXSBmb3IgYSBjYWxsIHRvIHRoZSBbSlNdIGZ1bmN0aW9uLgogIE5hdGl2ZUJlaGF2aW9yIGdldE5hdGl2ZUJlaGF2aW9yRm9ySnNDYWxsKGlyLlN0YXRpY0ludm9jYXRpb24gbm9kZSk7CgogIC8vLyBDb21wdXRlcyB0aGUgW05hdGl2ZUJlaGF2aW9yXSBmb3IgYSBjYWxsIHRvIHRoZSBbSlNfQlVJTFRJTl0KICAvLy8gZnVuY3Rpb24uCiAgTmF0aXZlQmVoYXZpb3IgZ2V0TmF0aXZlQmVoYXZpb3JGb3JKc0J1aWx0aW5DYWxsKGlyLlN0YXRpY0ludm9jYXRpb24gbm9kZSk7CgogIC8vLyBDb21wdXRlcyB0aGUgW05hdGl2ZUJlaGF2aW9yXSBmb3IgYSBjYWxsIHRvIHRoZQogIC8vLyBbSlNfRU1CRURERURfR0xPQkFMXSBmdW5jdGlvbi4KICBOYXRpdmVCZWhhdmlvciBnZXROYXRpdmVCZWhhdmlvckZvckpzRW1iZWRkZWRHbG9iYWxDYWxsKAogICAgICBpci5TdGF0aWNJbnZvY2F0aW9uIG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgW2pzLk5hbWVdIGZvciB0aGUgYEpzR2V0TmFtZWAgW2NvbnN0YW50XSB2YWx1ZS4KICBqcy5OYW1lIGdldE5hbWVGb3JKc0dldE5hbWUoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgTmFtZXIgbmFtZXIpOwoKICAvLy8gQ29tcHV0ZXMgdGhlIFtDb25zdGFudFZhbHVlXSBmb3IgdGhlIGNvbnN0YW50IFtleHByZXNzaW9uXS4KICBDb25zdGFudFZhbHVlIGdldENvbnN0YW50VmFsdWUoaXIuRXhwcmVzc2lvbiBleHByZXNzaW9uLAogICAgICB7Ym9vbCByZXF1aXJlQ29uc3RhbnQ6IHRydWUsIGJvb2wgaW1wbGljaXROdWxsOiBmYWxzZX0pOwoKICAvLy8gUmV0dXJuIHRoZSBbSW1wb3J0RW50aXR5XSBjb3JyZXNwb25kaW5nIHRvIFtub2RlXS4KICBJbXBvcnRFbnRpdHkgZ2V0SW1wb3J0KGlyLkxpYnJhcnlEZXBlbmRlbmN5IG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgZGVmaW5pbmcgbm9kZSBmb3IgW2Nsc10uCiAgaXIuQ2xhc3MgZ2V0Q2xhc3NOb2RlKGNvdmFyaWFudCBDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gQWRkcyBsaWJyYXJpZXMgaW4gW2NvbXBvbmVudF0gdG8gdGhlIHNldCBvZiBsaWJyYXJpZXMuCiAgLy8vCiAgLy8vIFRoZSBtYWluIG1ldGhvZCBvZiB0aGUgZmlyc3QgY29tcG9uZW50IGlzIHVzZWQgYXMgdGhlIG1haW4gbWV0aG9kIGZvciB0aGUKICAvLy8gY29tcGlsYXRpb24uCiAgdm9pZCBhZGRDb21wb25lbnQoaXIuQ29tcG9uZW50IGNvbXBvbmVudCk7CgogIC8vLyBSZXR1cm5zIHRoZSBbQ29uc3RydWN0b3JFbnRpdHldIGNvcnJlc3BvbmRpbmcgdG8gYSBzdXBlciBpbml0aWFsaXplciBpbgogIC8vLyBbY29uc3RydWN0b3JdLgogIC8vLwogIC8vLyBUaGUgSVIgcmVzb2x2ZXMgc3VwZXIgaW5pdGlhbGl6ZXJzIHRvIGEgW3RhcmdldF0gdXAgaW4gdGhlIHR5cGUgaGllcmFyY2h5LgogIC8vLyBNb3N0IG9mIHRoZSB0aW1lLCB0aGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSB0aGUgZW50aXR5CiAgLy8vIGNvcnJlc3BvbmRpbmcgdG8gdGhhdCB0YXJnZXQuIEluIHRoZSBwcmVzZW5jZSBvZiB1bm5hbWVkIG1peGlucywgdGhpcwogIC8vLyBmdW5jdGlvbiByZXR1cm5zIGFuIGVudGl0eSBmb3IgYW4gaW50ZXJtZWRpYXRlIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciB0aGF0CiAgLy8vIGtlcm5lbCBkb2Vzbid0IGV4cGxpY2l0bHkgcmVwcmVzZW50LgogIC8vLwogIC8vLyBGb3IgZXhhbXBsZToKICAvLy8gICAgIGNsYXNzIE0ge30KICAvLy8gICAgIGNsYXNzIEMgZXh0ZW5kcyBPYmplY3Qgd2l0aCBNIHt9CiAgLy8vCiAgLy8vIEtlcm5lbCB3aWxsIHNheSB0aGF0IEMoKSdzIHN1cGVyIGluaXRpYWxpemVyIHJlc29sdmVzIHRvIE9iamVjdCgpLCBidXQKICAvLy8gdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhbiBlbnRpdHkgcmVwcmVzZW50aW5nIHRoZSB1bm5hbWVkIG1peGluCiAgLy8vIGFwcGxpY2F0aW9uICJPYmplY3QrTSIncyBjb25zdHJ1Y3Rvci4KICBDb25zdHJ1Y3RvckVudGl0eSBnZXRTdXBlckNvbnN0cnVjdG9yKAogICAgICBpci5Db25zdHJ1Y3RvciBjb25zdHJ1Y3RvciwgaXIuTWVtYmVyIHRhcmdldCk7CgogIC8vLyBDb21wdXRlcyB0aGUgbmF0aXZlIGJlaGF2aW9yIGZvciByZWFkaW5nIHRoZSBuYXRpdmUgW2ZpZWxkXS4KICBOYXRpdmVCZWhhdmlvciBnZXROYXRpdmVCZWhhdmlvckZvckZpZWxkTG9hZChpci5GaWVsZCBmaWVsZCwKICAgICAgSXRlcmFibGU8U3RyaW5nPiBjcmVhdGVzQW5ub3RhdGlvbnMsIEl0ZXJhYmxlPFN0cmluZz4gcmV0dXJuc0Fubm90YXRpb25zLAogICAgICB7Ym9vbCBpc0pzSW50ZXJvcH0pOwoKICAvLy8gQ29tcHV0ZXMgdGhlIG5hdGl2ZSBiZWhhdmlvciBmb3Igd3JpdGluZyB0byB0aGUgbmF0aXZlIFtmaWVsZF0uCiAgTmF0aXZlQmVoYXZpb3IgZ2V0TmF0aXZlQmVoYXZpb3JGb3JGaWVsZFN0b3JlKGlyLkZpZWxkIGZpZWxkKTsKCiAgLy8vIENvbXB1dGVzIHRoZSBuYXRpdmUgYmVoYXZpb3IgZm9yIGNhbGxpbmcgdGhlIGZ1bmN0aW9uIG9yIGNvbnN0cnVjdG9yCiAgLy8vIFttZW1iZXJdLgogIE5hdGl2ZUJlaGF2aW9yIGdldE5hdGl2ZUJlaGF2aW9yRm9yTWV0aG9kKGlyLk1lbWJlciBtZW1iZXIsCiAgICAgIEl0ZXJhYmxlPFN0cmluZz4gY3JlYXRlc0Fubm90YXRpb25zLCBJdGVyYWJsZTxTdHJpbmc+IHJldHVybnNBbm5vdGF0aW9ucywKICAgICAge2Jvb2wgaXNKc0ludGVyb3B9KTsKCiAgLy8vIENvbXB1dGUgdGhlIGtpbmQgb2YgZm9yZWlnbiBoZWxwZXIgZnVuY3Rpb24gY2FsbGVkIGJ5IFtub2RlXSwgaWYgYW55LgogIEZvcmVpZ25LaW5kIGdldEZvcmVpZ25LaW5kKGlyLlN0YXRpY0ludm9jYXRpb24gbm9kZSk7CgogIC8vLyBDb21wdXRlcyB0aGUgW0ludGVyZmFjZVR5cGVdIHJlZmVyZW5jZWQgYnkgYSBjYWxsIHRvIHRoZQogIC8vLyBbSlNfSU5URVJDRVBUT1JfQ09OU1RBTlRdIGZ1bmN0aW9uLCBpZiBhbnkuCiAgSW50ZXJmYWNlVHlwZSBnZXRJbnRlcmZhY2VUeXBlRm9ySnNJbnRlcmNlcHRvckNhbGwoaXIuU3RhdGljSW52b2NhdGlvbiBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtMb2NhbF0gY29ycmVzcG9uZGluZyB0byB0aGUgW25vZGVdLiBUaGUgbm9kZSBtdXN0IGJlIGVpdGhlcgogIC8vLyBhIFtpci5GdW5jdGlvbkRlY2xhcmF0aW9uXSBvciBbaXIuRnVuY3Rpb25FeHByZXNzaW9uXS4KICBMb2NhbCBnZXRMb2NhbEZ1bmN0aW9uKGlyLlRyZWVOb2RlIG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgW2lyLkxpYnJhcnldIGNvcnJlc3BvbmRpbmcgdG8gW2xpYnJhcnldLgogIGlyLkxpYnJhcnkgZ2V0TGlicmFyeU5vZGUoTGlicmFyeUVudGl0eSBsaWJyYXJ5KTsKCiAgLy8vIFJldHVybnMgdGhlIG5vZGUgdGhhdCBkZWZpbmVzIFt0eXBlZGVmXS4KICBpci5UeXBlZGVmIGdldFR5cGVkZWZOb2RlKGNvdmFyaWFudCBUeXBlZGVmRW50aXR5IHR5cGVkZWYpOwoKICAvLy8gUmV0dXJucyB0aGUgZGVmaW5pbmcgbm9kZSBmb3IgW21lbWJlcl0uCiAgaXIuTWVtYmVyIGdldE1lbWJlck5vZGUoY292YXJpYW50IE1lbWJlckVudGl0eSBtZW1iZXIpOwp9CgovLy8gS2luZHMgb2YgZm9yZWlnbiBmdW5jdGlvbnMuCmVudW0gRm9yZWlnbktpbmQgewogIEpTLAogIEpTX0JVSUxUSU4sCiAgSlNfRU1CRURERURfR0xPQkFMLAogIEpTX0lOVEVSQ0VQVE9SX0NPTlNUQU5ULAogIE5PTkUsCn0KgL0ATk48ASg0NQEjTCQhIR4jKSIqJAFMLSQuJwE2JgEoFwFEKgFDKAE2KgE7OQE+QwEwNgFLFyU2AUQ6AUwTSDcBRSoBSi8BURo0AUMnAUMnAVEvAU0oQh0BPjQ4ATIeAUVHAUMQTgE2JTshAUJEAUI7PwE5NQErNAE9BlATLQFOFQZRR0xQKwYTFSsGTUksKTUBQz9QGwFGQQFLED5QGwFMOAE/MlABTz0sATs0AS8+AS46AgEgEwYOFhsIAgEscGFja2FnZTpjb21waWxlci9zcmMva2VybmVsL2VsZW1lbnRfbWFwLmRhcnQ6c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMva2VybmVsL2VsZW1lbnRfbWFwX2ltcGwuZGFydMABNRcvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmtlcm5lbC5lbGVtZW50X21hcDsKCmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV91bnN0YWJsZS9kYXJ0MmpzLmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6anNfcnVudGltZS9zaGFyZWQvZW1iZWRkZWRfbmFtZXMuZGFydCc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQnIGFzIGlyOwoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbi9yZXNvbHV0aW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JzsKaW1wb3J0ICcuLi9jb21waWxlX3RpbWVfY29uc3RhbnRzLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy9jb25zdHJ1Y3RvcnMuZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL2V2YWx1YXRpb24uZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL2V4cHJlc3Npb25zLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvaW5kZXhlZC5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9uYW1lcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbnZpcm9ubWVudC5kYXJ0JzsKaW1wb3J0ICcuLi9mcm9udGVuZF9zdHJhdGVneS5kYXJ0JzsKaW1wb3J0ICcuLi9pci9hbm5vdGF0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi9pci9jb25zdGFudHMuZGFydCc7CmltcG9ydCAnLi4vaXIvZGVidWcuZGFydCc7CmltcG9ydCAnLi4vaXIvZWxlbWVudF9tYXAuZGFydCc7CmltcG9ydCAnLi4vaXIvaW1wYWN0LmRhcnQnOwppbXBvcnQgJy4uL2lyL2ltcGFjdF9kYXRhLmRhcnQnOwppbXBvcnQgJy4uL2lyL3N0YXRpY190eXBlLmRhcnQnOwppbXBvcnQgJy4uL2lyL3Njb3BlLmRhcnQnOwppbXBvcnQgJy4uL2lyL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2lyL3Zpc2l0b3JzLmRhcnQnOwppbXBvcnQgJy4uL2lyL3V0aWwuZGFydCc7CmltcG9ydCAnLi4vanMvanMuZGFydCcgYXMganM7CmltcG9ydCAnLi4vanNfYmFja2VuZC9hbm5vdGF0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2JhY2tlbmQuZGFydCcgc2hvdyBKYXZhU2NyaXB0QmFja2VuZDsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL25hbWVyLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9ub19zdWNoX21ldGhvZF9yZWdpc3RyeS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19tb2RlbC9sb2NhbHMuZGFydCc7CmltcG9ydCAnLi4va2VybmVsL2RhcnQyanNfdGFyZ2V0LmRhcnQnOwppbXBvcnQgJy4uL25hdGl2ZS9iZWhhdmlvci5kYXJ0JzsKaW1wb3J0ICcuLi9uYXRpdmUvcmVzb2x2ZXIuZGFydCc7CmltcG9ydCAnLi4vb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi9vcmRlcmVkX3R5cGVzZXQuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY2FsbF9zdHJ1Y3R1cmUuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY2xhc3NfaGllcmFyY2h5LmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnOwoKaW1wb3J0ICdlbGVtZW50X21hcC5kYXJ0JzsKaW1wb3J0ICdlbnYuZGFydCc7CmltcG9ydCAna2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJ2tlcm5lbF9pbXBhY3QuZGFydCc7CgpwYXJ0ICduYXRpdmVfYmFzaWNfZGF0YS5kYXJ0JzsKcGFydCAnbm9fc3VjaF9tZXRob2RfcmVzb2x2ZXIuZGFydCc7CgovLy8gSW1wbGVtZW50YXRpb24gb2YgW0tlcm5lbFRvRWxlbWVudE1hcF0gdGhhdCBvbmx5IHN1cHBvcnRzIHdvcmxkCi8vLyBpbXBhY3QgY29tcHV0YXRpb24uCmNsYXNzIEtlcm5lbFRvRWxlbWVudE1hcEltcGwgaW1wbGVtZW50cyBLZXJuZWxUb0VsZW1lbnRNYXAsIElyVG9FbGVtZW50TWFwIHsKICBmaW5hbCBDb21waWxlck9wdGlvbnMgb3B0aW9uczsKICBAb3ZlcnJpZGUKICBmaW5hbCBEaWFnbm9zdGljUmVwb3J0ZXIgcmVwb3J0ZXI7CiAgZmluYWwgRW52aXJvbm1lbnQgX2Vudmlyb25tZW50OwogIENvbW1vbkVsZW1lbnRzSW1wbCBfY29tbW9uRWxlbWVudHM7CiAgS2VybmVsRWxlbWVudEVudmlyb25tZW50IF9lbGVtZW50RW52aXJvbm1lbnQ7CiAgRGFydFR5cGVDb252ZXJ0ZXIgX3R5cGVDb252ZXJ0ZXI7CiAgS2VybmVsQ29uc3RhbnRFbnZpcm9ubWVudCBfY29uc3RhbnRFbnZpcm9ubWVudDsKICBLZXJuZWxEYXJ0VHlwZXMgX3R5cGVzOwogIGlyLlR5cGVFbnZpcm9ubWVudCBfdHlwZUVudmlyb25tZW50OwogIGlyLkNsYXNzSGllcmFyY2h5IF9jbGFzc0hpZXJhcmNoeTsKICBEYXJ0MmpzQ29uc3RhbnRFdmFsdWF0b3IgX2NvbnN0YW50RXZhbHVhdG9yOwogIENvbnN0YW50VmFsdWVmaWVyIF9jb25zdGFudFZhbHVlZmllcjsKCiAgLy8vIExpYnJhcnkgZW52aXJvbm1lbnQuIFVzZWQgZm9yIGZhc3QgbG9va3VwLgogIEtQcm9ncmFtRW52IGVudiA9IG5ldyBLUHJvZ3JhbUVudigpOwoKICBmaW5hbCBFbnRpdHlEYXRhRW52TWFwPEluZGV4ZWRMaWJyYXJ5LCBLTGlicmFyeURhdGEsIEtMaWJyYXJ5RW52PiBsaWJyYXJpZXMgPQogICAgICBuZXcgRW50aXR5RGF0YUVudk1hcDxJbmRleGVkTGlicmFyeSwgS0xpYnJhcnlEYXRhLCBLTGlicmFyeUVudj4oKTsKICBmaW5hbCBFbnRpdHlEYXRhRW52TWFwPEluZGV4ZWRDbGFzcywgS0NsYXNzRGF0YSwgS0NsYXNzRW52PiBjbGFzc2VzID0KICAgICAgbmV3IEVudGl0eURhdGFFbnZNYXA8SW5kZXhlZENsYXNzLCBLQ2xhc3NEYXRhLCBLQ2xhc3NFbnY+KCk7CiAgZmluYWwgRW50aXR5RGF0YU1hcDxJbmRleGVkTWVtYmVyLCBLTWVtYmVyRGF0YT4gbWVtYmVycyA9CiAgICAgIG5ldyBFbnRpdHlEYXRhTWFwPEluZGV4ZWRNZW1iZXIsIEtNZW1iZXJEYXRhPigpOwogIGZpbmFsIEVudGl0eURhdGFNYXA8SW5kZXhlZFR5cGVWYXJpYWJsZSwgS1R5cGVWYXJpYWJsZURhdGE+IHR5cGVWYXJpYWJsZXMgPQogICAgICBuZXcgRW50aXR5RGF0YU1hcDxJbmRleGVkVHlwZVZhcmlhYmxlLCBLVHlwZVZhcmlhYmxlRGF0YT4oKTsKICBmaW5hbCBFbnRpdHlEYXRhTWFwPEluZGV4ZWRUeXBlZGVmLCBLVHlwZWRlZkRhdGE+IHR5cGVkZWZzID0KICAgICAgbmV3IEVudGl0eURhdGFNYXA8SW5kZXhlZFR5cGVkZWYsIEtUeXBlZGVmRGF0YT4oKTsKCiAgLy8vIFNldCB0byBgdHJ1ZWAgYmVmb3JlIGNyZWF0aW5nIHRoZSBKLVdvcmxkIGZyb20gdGhlIEstV29ybGQgdG8gYXNzZXJ0IHRoYXQKICAvLy8gbm8gZW50aXRpZXMgYXJlIGNyZWF0ZWQgbGF0ZS4KICBib29sIGVudklzQ2xvc2VkID0gZmFsc2U7CgogIGZpbmFsIE1hcDxpci5MaWJyYXJ5LCBJbmRleGVkTGlicmFyeT4gbGlicmFyeU1hcCA9IHt9OwogIGZpbmFsIE1hcDxpci5DbGFzcywgSW5kZXhlZENsYXNzPiBjbGFzc01hcCA9IHt9OwogIGZpbmFsIE1hcDxpci5UeXBlZGVmLCBJbmRleGVkVHlwZWRlZj4gdHlwZWRlZk1hcCA9IHt9OwoKICAvLy8gTWFwIGZyb20gW2lyLlR5cGVQYXJhbWV0ZXJdIG5vZGVzIHRvIHRoZSBjb3JyZXNwb25kaW5nCiAgLy8vIFtUeXBlVmFyaWFibGVFbnRpdHldLgogIC8vLwogIC8vLyBOb3JtYWxseSB0aGUgdHlwZSB2YXJpYWJsZXMgYXJlIFtJbmRleGVkVHlwZVZhcmlhYmxlXXMsIGJ1dCBmb3IgdHlwZQogIC8vLyBwYXJhbWV0ZXJzIG9uIGxvY2FsIGZ1bmN0aW9uIChpbiB0aGUgZnJvbnRlbmQpIHRoZXNlIGFyZSBfbm90XyBzaW5jZQogIC8vLyB0aGVpciB0eXBlIGRlY2xhcmF0aW9uIGlzIG5laXRoZXIgYSBjbGFzcyBub3IgYSBtZW1iZXIuIEluIHRoZSBiYWNrZW5kLAogIC8vLyB0aGVzZSB0eXBlIHBhcmFtZXRlcnMgYmVsb25nIHRvIHRoZSBjYWxsLW1ldGhvZCBhbmQgYXJlIHRoZXJlZm9yZSBpbmRleGVkLgogIGZpbmFsIE1hcDxpci5UeXBlUGFyYW1ldGVyLCBUeXBlVmFyaWFibGVFbnRpdHk+IHR5cGVWYXJpYWJsZU1hcCA9IHt9OwogIGZpbmFsIE1hcDxpci5NZW1iZXIsIEluZGV4ZWRDb25zdHJ1Y3Rvcj4gY29uc3RydWN0b3JNYXAgPSB7fTsKICBmaW5hbCBNYXA8aXIuUHJvY2VkdXJlLCBJbmRleGVkRnVuY3Rpb24+IG1ldGhvZE1hcCA9IHt9OwogIGZpbmFsIE1hcDxpci5GaWVsZCwgSW5kZXhlZEZpZWxkPiBmaWVsZE1hcCA9IHt9OwogIGZpbmFsIE1hcDxpci5UcmVlTm9kZSwgTG9jYWw+IGxvY2FsRnVuY3Rpb25NYXAgPSB7fTsKCiAgQmVoYXZpb3JCdWlsZGVyIF9uYXRpdmVCZWhhdmlvckJ1aWxkZXI7CiAgRnJvbnRlbmRTdHJhdGVneSBfZnJvbnRlbmRTdHJhdGVneTsKCiAgTWFwPEtNZW1iZXIsIE1hcDxpci5FeHByZXNzaW9uLCBUeXBlTWFwPj4gdHlwZU1hcHNGb3JUZXN0aW5nOwoKICBLZXJuZWxUb0VsZW1lbnRNYXBJbXBsKAogICAgICB0aGlzLnJlcG9ydGVyLCB0aGlzLl9lbnZpcm9ubWVudCwgdGhpcy5fZnJvbnRlbmRTdHJhdGVneSwgdGhpcy5vcHRpb25zKSB7CiAgICBfZWxlbWVudEVudmlyb25tZW50ID0gbmV3IEtlcm5lbEVsZW1lbnRFbnZpcm9ubWVudCh0aGlzKTsKICAgIF9jb21tb25FbGVtZW50cyA9IG5ldyBDb21tb25FbGVtZW50c0ltcGwoX2VsZW1lbnRFbnZpcm9ubWVudCk7CiAgICBfY29uc3RhbnRFbnZpcm9ubWVudCA9IG5ldyBLZXJuZWxDb25zdGFudEVudmlyb25tZW50KHRoaXMsIF9lbnZpcm9ubWVudCk7CiAgICBfdHlwZUNvbnZlcnRlciA9IG5ldyBEYXJ0VHlwZUNvbnZlcnRlcih0aGlzKTsKICAgIF90eXBlcyA9IG5ldyBLZXJuZWxEYXJ0VHlwZXModGhpcyk7CiAgICBfY29uc3RhbnRWYWx1ZWZpZXIgPSBuZXcgQ29uc3RhbnRWYWx1ZWZpZXIodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZXMgZ2V0IHR5cGVzID0+IF90eXBlczsKCiAgQG92ZXJyaWRlCiAgS2VybmVsRWxlbWVudEVudmlyb25tZW50IGdldCBlbGVtZW50RW52aXJvbm1lbnQgPT4gX2VsZW1lbnRFbnZpcm9ubWVudDsKCiAgQG92ZXJyaWRlCiAgQ29tbW9uRWxlbWVudHNJbXBsIGdldCBjb21tb25FbGVtZW50cyA9PiBfY29tbW9uRWxlbWVudHM7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBfbWFpbkZ1bmN0aW9uIHsKICAgIHJldHVybiBlbnYubWFpbk1ldGhvZCAhPSBudWxsID8gZ2V0TWV0aG9kSW50ZXJuYWwoZW52Lm1haW5NZXRob2QpIDogbnVsbDsKICB9CgogIExpYnJhcnlFbnRpdHkgZ2V0IF9tYWluTGlicmFyeSB7CiAgICByZXR1cm4gZW52Lm1haW5NZXRob2QgIT0gbnVsbAogICAgICAgID8gZ2V0TGlicmFyeUludGVybmFsKGVudi5tYWluTWV0aG9kLmVuY2xvc2luZ0xpYnJhcnkpCiAgICAgICAgOiBudWxsOwogIH0KCiAgU291cmNlU3BhbiBnZXRTb3VyY2VTcGFuKFNwYW5uYWJsZSBzcGFubmFibGUsIEVudGl0eSBjdXJyZW50RWxlbWVudCkgewogICAgU291cmNlU3BhbiBmcm9tU3Bhbm5hYmxlKFNwYW5uYWJsZSBzcGFubmFibGUpIHsKICAgICAgaWYgKHNwYW5uYWJsZSBpcyBJbmRleGVkTGlicmFyeSAmJgogICAgICAgICAgc3Bhbm5hYmxlLmxpYnJhcnlJbmRleCA8IGxpYnJhcmllcy5sZW5ndGgpIHsKICAgICAgICBLTGlicmFyeUVudiBlbnYgPSBsaWJyYXJpZXMuZ2V0RW52KHNwYW5uYWJsZSk7CiAgICAgICAgcmV0dXJuIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKGVudi5saWJyYXJ5KTsKICAgICAgfSBlbHNlIGlmIChzcGFubmFibGUgaXMgSW5kZXhlZENsYXNzICYmCiAgICAgICAgICBzcGFubmFibGUuY2xhc3NJbmRleCA8IGNsYXNzZXMubGVuZ3RoKSB7CiAgICAgICAgS0NsYXNzRGF0YSBkYXRhID0gY2xhc3Nlcy5nZXREYXRhKHNwYW5uYWJsZSk7CiAgICAgICAgYXNzZXJ0KGRhdGEgIT0gbnVsbCwgIk5vIGRhdGEgZm9yICRzcGFubmFibGUgaW4gJHRoaXMiKTsKICAgICAgICByZXR1cm4gY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUoZGF0YS5ub2RlKTsKICAgICAgfSBlbHNlIGlmIChzcGFubmFibGUgaXMgSW5kZXhlZE1lbWJlciAmJgogICAgICAgICAgc3Bhbm5hYmxlLm1lbWJlckluZGV4IDwgbWVtYmVycy5sZW5ndGgpIHsKICAgICAgICBLTWVtYmVyRGF0YSBkYXRhID0gbWVtYmVycy5nZXREYXRhKHNwYW5uYWJsZSk7CiAgICAgICAgYXNzZXJ0KGRhdGEgIT0gbnVsbCwgIk5vIGRhdGEgZm9yICRzcGFubmFibGUgaW4gJHRoaXMiKTsKICAgICAgICByZXR1cm4gY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUoZGF0YS5ub2RlKTsKICAgICAgfSBlbHNlIGlmIChzcGFubmFibGUgaXMgS0xvY2FsRnVuY3Rpb24pIHsKICAgICAgICByZXR1cm4gZ2V0U291cmNlU3BhbihzcGFubmFibGUubWVtYmVyQ29udGV4dCwgY3VycmVudEVsZW1lbnQpOwogICAgICB9IGVsc2UgaWYgKHNwYW5uYWJsZSBpcyBKTG9jYWwpIHsKICAgICAgICByZXR1cm4gZ2V0U291cmNlU3BhbihzcGFubmFibGUubWVtYmVyQ29udGV4dCwgY3VycmVudEVsZW1lbnQpOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIFNvdXJjZVNwYW4gc291cmNlU3BhbiA9IGZyb21TcGFubmFibGUoc3Bhbm5hYmxlKTsKICAgIHNvdXJjZVNwYW4gPz89IGZyb21TcGFubmFibGUoY3VycmVudEVsZW1lbnQpOwogICAgcmV0dXJuIHNvdXJjZVNwYW47CiAgfQoKICBMaWJyYXJ5RW50aXR5IGxvb2t1cExpYnJhcnkoVXJpIHVyaSkgewogICAgS0xpYnJhcnlFbnYgbGlicmFyeUVudiA9IGVudi5sb29rdXBMaWJyYXJ5KHVyaSk7CiAgICBpZiAobGlicmFyeUVudiA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBnZXRMaWJyYXJ5SW50ZXJuYWwobGlicmFyeUVudi5saWJyYXJ5LCBsaWJyYXJ5RW52KTsKICB9CgogIFN0cmluZyBfZ2V0TGlicmFyeU5hbWUoSW5kZXhlZExpYnJhcnkgbGlicmFyeSkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGxpYnJhcnkpKTsKICAgIEtMaWJyYXJ5RW52IGxpYnJhcnlFbnYgPSBsaWJyYXJpZXMuZ2V0RW52KGxpYnJhcnkpOwogICAgcmV0dXJuIGxpYnJhcnlFbnYubGlicmFyeS5uYW1lID8/ICcnOwogIH0KCiAgTWVtYmVyRW50aXR5IGxvb2t1cExpYnJhcnlNZW1iZXIoSW5kZXhlZExpYnJhcnkgbGlicmFyeSwgU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2V9KSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkobGlicmFyeSkpOwogICAgS0xpYnJhcnlFbnYgbGlicmFyeUVudiA9IGxpYnJhcmllcy5nZXRFbnYobGlicmFyeSk7CiAgICBpci5NZW1iZXIgbWVtYmVyID0gbGlicmFyeUVudi5sb29rdXBNZW1iZXIobmFtZSwgc2V0dGVyOiBzZXR0ZXIpOwogICAgcmV0dXJuIG1lbWJlciAhPSBudWxsID8gZ2V0TWVtYmVyKG1lbWJlcikgOiBudWxsOwogIH0KCiAgdm9pZCBfZm9yRWFjaExpYnJhcnlNZW1iZXIoCiAgICAgIEluZGV4ZWRMaWJyYXJ5IGxpYnJhcnksIHZvaWQgZihNZW1iZXJFbnRpdHkgbWVtYmVyKSkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGxpYnJhcnkpKTsKICAgIEtMaWJyYXJ5RW52IGxpYnJhcnlFbnYgPSBsaWJyYXJpZXMuZ2V0RW52KGxpYnJhcnkpOwogICAgbGlicmFyeUVudi5mb3JFYWNoTWVtYmVyKChpci5NZW1iZXIgbm9kZSkgewogICAgICBmKGdldE1lbWJlcihub2RlKSk7CiAgICB9KTsKICB9CgogIENsYXNzRW50aXR5IGxvb2t1cENsYXNzKEluZGV4ZWRMaWJyYXJ5IGxpYnJhcnksIFN0cmluZyBuYW1lKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkobGlicmFyeSkpOwogICAgS0xpYnJhcnlFbnYgbGlicmFyeUVudiA9IGxpYnJhcmllcy5nZXRFbnYobGlicmFyeSk7CiAgICBLQ2xhc3NFbnYgY2xhc3NFbnYgPSBsaWJyYXJ5RW52Lmxvb2t1cENsYXNzKG5hbWUpOwogICAgaWYgKGNsYXNzRW52ICE9IG51bGwpIHsKICAgICAgcmV0dXJuIGdldENsYXNzSW50ZXJuYWwoY2xhc3NFbnYuY2xzLCBjbGFzc0Vudik7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgX2ZvckVhY2hDbGFzcyhJbmRleGVkTGlicmFyeSBsaWJyYXJ5LCB2b2lkIGYoQ2xhc3NFbnRpdHkgY2xzKSkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGxpYnJhcnkpKTsKICAgIEtMaWJyYXJ5RW52IGxpYnJhcnlFbnYgPSBsaWJyYXJpZXMuZ2V0RW52KGxpYnJhcnkpOwogICAgbGlicmFyeUVudi5mb3JFYWNoQ2xhc3MoKEtDbGFzc0VudiBjbGFzc0VudikgewogICAgICBpZiAoIWNsYXNzRW52LmlzVW5uYW1lZE1peGluQXBwbGljYXRpb24pIHsKICAgICAgICBmKGdldENsYXNzSW50ZXJuYWwoY2xhc3NFbnYuY2xzLCBjbGFzc0VudikpOwogICAgICB9CiAgICB9KTsKICB9CgogIHZvaWQgZW5zdXJlQ2xhc3NNZW1iZXJzKGlyLkNsYXNzIG5vZGUpIHsKICAgIGNsYXNzZXMuZ2V0RW52KGdldENsYXNzSW50ZXJuYWwobm9kZSkpLmVuc3VyZU1lbWJlcnModGhpcyk7CiAgfQoKICBNZW1iZXJFbnRpdHkgbG9va3VwQ2xhc3NNZW1iZXIoSW5kZXhlZENsYXNzIGNscywgU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2V9KSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBLQ2xhc3NFbnYgY2xhc3NFbnYgPSBjbGFzc2VzLmdldEVudihjbHMpOwogICAgcmV0dXJuIGNsYXNzRW52Lmxvb2t1cE1lbWJlcih0aGlzLCBuYW1lLCBzZXR0ZXI6IHNldHRlcik7CiAgfQoKICBDb25zdHJ1Y3RvckVudGl0eSBsb29rdXBDb25zdHJ1Y3RvcihJbmRleGVkQ2xhc3MgY2xzLCBTdHJpbmcgbmFtZSkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgS0NsYXNzRW52IGNsYXNzRW52ID0gY2xhc3Nlcy5nZXRFbnYoY2xzKTsKICAgIHJldHVybiBjbGFzc0Vudi5sb29rdXBDb25zdHJ1Y3Rvcih0aGlzLCBuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgY3JlYXRlSW50ZXJmYWNlVHlwZSgKICAgICAgaXIuQ2xhc3MgY2xzLCBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUoZ2V0Q2xhc3MoY2xzKSwgZ2V0RGFydFR5cGVzKHR5cGVBcmd1bWVudHMpKTsKICB9CgogIExpYnJhcnlFbnRpdHkgZ2V0TGlicmFyeShpci5MaWJyYXJ5IG5vZGUpID0+IGdldExpYnJhcnlJbnRlcm5hbChub2RlKTsKCiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0Q2xhc3MoaXIuQ2xhc3Mgbm9kZSkgPT4gZ2V0Q2xhc3NJbnRlcm5hbChub2RlKTsKCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXRTdXBlclR5cGUoSW5kZXhlZENsYXNzIGNscykgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgS0NsYXNzRGF0YSBkYXRhID0gY2xhc3Nlcy5nZXREYXRhKGNscyk7CiAgICBfZW5zdXJlU3VwZXJ0eXBlcyhjbHMsIGRhdGEpOwogICAgcmV0dXJuIGRhdGEuc3VwZXJ0eXBlOwogIH0KCiAgdm9pZCBfZW5zdXJlVGhpc0FuZFJhd1R5cGUoQ2xhc3NFbnRpdHkgY2xzLCBLQ2xhc3NEYXRhIGRhdGEpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIGlmIChkYXRhIGlzIEtDbGFzc0RhdGFJbXBsICYmIGRhdGEudGhpc1R5cGUgPT0gbnVsbCkgewogICAgICBpci5DbGFzcyBub2RlID0gZGF0YS5ub2RlOwogICAgICBpZiAobm9kZS50eXBlUGFyYW1ldGVycy5pc0VtcHR5KSB7CiAgICAgICAgZGF0YS50aGlzVHlwZSA9CiAgICAgICAgICAgIGRhdGEucmF3VHlwZSA9IG5ldyBJbnRlcmZhY2VUeXBlKGNscywgY29uc3QgPERhcnRUeXBlPltdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkYXRhLnRoaXNUeXBlID0gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICAgIGNscywKICAgICAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmdlbmVyYXRlKG5vZGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoLAogICAgICAgICAgICAgICAgKGludCBpbmRleCkgewogICAgICAgICAgICAgIHJldHVybiBuZXcgVHlwZVZhcmlhYmxlVHlwZSgKICAgICAgICAgICAgICAgICAgZ2V0VHlwZVZhcmlhYmxlSW50ZXJuYWwobm9kZS50eXBlUGFyYW1ldGVyc1tpbmRleF0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIGRhdGEucmF3VHlwZSA9IG5ldyBJbnRlcmZhY2VUeXBlKAogICAgICAgICAgICBjbHMsCiAgICAgICAgICAgIG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQoCiAgICAgICAgICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwgY29uc3QgRHluYW1pY1R5cGUoKSkpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlVmFyaWFibGVFbnRpdHkgZ2V0VHlwZVZhcmlhYmxlKGlyLlR5cGVQYXJhbWV0ZXIgbm9kZSkgPT4KICAgICAgZ2V0VHlwZVZhcmlhYmxlSW50ZXJuYWwobm9kZSk7CgogIHZvaWQgX2Vuc3VyZVN1cGVydHlwZXMoQ2xhc3NFbnRpdHkgY2xzLCBLQ2xhc3NEYXRhIGRhdGEpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIGlmIChkYXRhIGlzIEtDbGFzc0RhdGFJbXBsICYmIGRhdGEub3JkZXJlZFR5cGVTZXQgPT0gbnVsbCkgewogICAgICBfZW5zdXJlVGhpc0FuZFJhd1R5cGUoY2xzLCBkYXRhKTsKCiAgICAgIGlyLkNsYXNzIG5vZGUgPSBkYXRhLm5vZGU7CgogICAgICBpZiAobm9kZS5zdXBlcnR5cGUgPT0gbnVsbCkgewogICAgICAgIGRhdGEub3JkZXJlZFR5cGVTZXQgPSBuZXcgT3JkZXJlZFR5cGVTZXQuc2luZ2xldG9uKGRhdGEudGhpc1R5cGUpOwogICAgICAgIGRhdGEuaXNNaXhpbkFwcGxpY2F0aW9uID0gZmFsc2U7CiAgICAgICAgZGF0YS5pbnRlcmZhY2VzID0gY29uc3QgPEludGVyZmFjZVR5cGU+W107CiAgICAgIH0gZWxzZSB7CiAgICAgICAgSW50ZXJmYWNlVHlwZSBwcm9jZXNzU3VwZXJ0eXBlKGlyLlN1cGVydHlwZSBub2RlKSB7CiAgICAgICAgICBJbnRlcmZhY2VUeXBlIHN1cGVydHlwZSA9IF90eXBlQ29udmVydGVyLnZpc2l0U3VwZXJ0eXBlKG5vZGUpOwogICAgICAgICAgSW5kZXhlZENsYXNzIHN1cGVyY2xhc3MgPSBzdXBlcnR5cGUuZWxlbWVudDsKICAgICAgICAgIEtDbGFzc0RhdGEgc3VwZXJkYXRhID0gY2xhc3Nlcy5nZXREYXRhKHN1cGVyY2xhc3MpOwogICAgICAgICAgX2Vuc3VyZVN1cGVydHlwZXMoc3VwZXJjbGFzcywgc3VwZXJkYXRhKTsKICAgICAgICAgIHJldHVybiBzdXBlcnR5cGU7CiAgICAgICAgfQoKICAgICAgICBJbnRlcmZhY2VUeXBlIHN1cGVydHlwZTsKICAgICAgICBpci5MaW5rQnVpbGRlcjxJbnRlcmZhY2VUeXBlPiBsaW5rQnVpbGRlciA9CiAgICAgICAgICAgIG5ldyBpci5MaW5rQnVpbGRlcjxJbnRlcmZhY2VUeXBlPigpOwogICAgICAgIGlmIChub2RlLmlzTWl4aW5EZWNsYXJhdGlvbikgewogICAgICAgICAgLy8gQSBtaXhpbiBkZWNsYXJhdGlvbgogICAgICAgICAgLy8KICAgICAgICAgIC8vICAgbWl4aW4gTSBvbiBBLCBCLCBDIHt9CiAgICAgICAgICAvLwogICAgICAgICAgLy8gaXMgZW5jb2RlZCBieSBDRkUgYXMKICAgICAgICAgIC8vCiAgICAgICAgICAvLyAgIGFic3RyYWN0IGNsYXNzIE0gZXh0ZW5kcyBBIGltcGxlbWVudHMgQiwgQyB7fQogICAgICAgICAgLy8gICBhYnN0cmFjdCBjbGFzcyBNIGV4dGVuZHMgQSZCJkMge30KICAgICAgICAgIC8vCiAgICAgICAgICAvLyBidXQgd2UgZW5jb2RlIGl0IGFzCiAgICAgICAgICAvLwogICAgICAgICAgLy8gICBhYnN0cmFjdCBjbGFzcyBNIGV4dGVuZHMgT2JqZWN0IGltcGxlbWVudHMgQSwgQiwgQyB7fQogICAgICAgICAgLy8KICAgICAgICAgIC8vIHNvIHdlIG5lZWQgZ2V0IHRoZSBzdXBlcmNsYXNzZXMgZnJvbSB0aGUgb24tY2xhdXNlLCBBLCBCLCBhbmQgQywKICAgICAgICAgIC8vIHRocm91Z2ggW3N1cGVyY2xhc3NDb25zdHJhaW50c10uCiAgICAgICAgICBmb3IgKGlyLlN1cGVydHlwZSBjb25zdHJhaW50IGluIG5vZGUuc3VwZXJjbGFzc0NvbnN0cmFpbnRzKCkpIHsKICAgICAgICAgICAgbGlua0J1aWxkZXIuYWRkTGFzdChwcm9jZXNzU3VwZXJ0eXBlKGNvbnN0cmFpbnQpKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIFNldCBzdXBlcmNsYXNzIHRvIGBPYmplY3RgLgogICAgICAgICAgc3VwZXJ0eXBlID0gX2NvbW1vbkVsZW1lbnRzLm9iamVjdFR5cGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN1cGVydHlwZSA9IHByb2Nlc3NTdXBlcnR5cGUobm9kZS5zdXBlcnR5cGUpOwogICAgICAgIH0KICAgICAgICBpZiAoc3VwZXJ0eXBlID09IF9jb21tb25FbGVtZW50cy5vYmplY3RUeXBlKSB7CiAgICAgICAgICBDbGFzc0VudGl0eSBkZWZhdWx0U3VwZXJjbGFzcyA9CiAgICAgICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmdldERlZmF1bHRTdXBlcmNsYXNzKGNscywgbmF0aXZlQmFzaWNEYXRhKTsKICAgICAgICAgIGRhdGEuc3VwZXJ0eXBlID0gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRSYXdUeXBlKGRlZmF1bHRTdXBlcmNsYXNzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZGF0YS5zdXBlcnR5cGUgPSBzdXBlcnR5cGU7CiAgICAgICAgfQogICAgICAgIGlmIChub2RlLm1peGVkSW5UeXBlICE9IG51bGwpIHsKICAgICAgICAgIGRhdGEuaXNNaXhpbkFwcGxpY2F0aW9uID0gdHJ1ZTsKICAgICAgICAgIGxpbmtCdWlsZGVyCiAgICAgICAgICAgICAgLmFkZExhc3QoZGF0YS5taXhlZEluVHlwZSA9IHByb2Nlc3NTdXBlcnR5cGUobm9kZS5taXhlZEluVHlwZSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkYXRhLmlzTWl4aW5BcHBsaWNhdGlvbiA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBub2RlLmltcGxlbWVudGVkVHlwZXMuZm9yRWFjaCgoaXIuU3VwZXJ0eXBlIHN1cGVydHlwZSkgewogICAgICAgICAgbGlua0J1aWxkZXIuYWRkTGFzdChwcm9jZXNzU3VwZXJ0eXBlKHN1cGVydHlwZSkpOwogICAgICAgIH0pOwogICAgICAgIGlyLkxpbms8SW50ZXJmYWNlVHlwZT4gaW50ZXJmYWNlcyA9CiAgICAgICAgICAgIGxpbmtCdWlsZGVyLnRvTGluayhjb25zdCBpci5MaW5rPEludGVyZmFjZVR5cGU+KCkpOwogICAgICAgIE9yZGVyZWRUeXBlU2V0QnVpbGRlciBzZXRCdWlsZGVyID0KICAgICAgICAgICAgbmV3IEtlcm5lbE9yZGVyZWRUeXBlU2V0QnVpbGRlcih0aGlzLCBjbHMpOwogICAgICAgIGRhdGEub3JkZXJlZFR5cGVTZXQgPSBzZXRCdWlsZGVyLmNyZWF0ZU9yZGVyZWRUeXBlU2V0KAogICAgICAgICAgICBkYXRhLnN1cGVydHlwZSwgaW50ZXJmYWNlcy5yZXZlcnNlKGNvbnN0IGlyLkxpbms8SW50ZXJmYWNlVHlwZT4oKSkpOwogICAgICAgIGRhdGEuaW50ZXJmYWNlcyA9IG5ldyBMaXN0PEludGVyZmFjZVR5cGU+LmZyb20oaW50ZXJmYWNlcy50b0xpc3QoKSk7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIFR5cGVkZWZUeXBlIGdldFR5cGVkZWZUeXBlKGlyLlR5cGVkZWYgbm9kZSkgewogICAgSW5kZXhlZFR5cGVkZWYgdHlwZWRlZiA9IGdldFR5cGVkZWZJbnRlcm5hbChub2RlKTsKICAgIHJldHVybiB0eXBlZGVmcy5nZXREYXRhKHR5cGVkZWYpLnJhd1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBNZW1iZXJFbnRpdHkgZ2V0TWVtYmVyKGlyLk1lbWJlciBub2RlKSB7CiAgICBpZiAobm9kZSBpcyBpci5GaWVsZCkgewogICAgICByZXR1cm4gZ2V0RmllbGRJbnRlcm5hbChub2RlKTsKICAgIH0gZWxzZSBpZiAobm9kZSBpcyBpci5Db25zdHJ1Y3RvcikgewogICAgICByZXR1cm4gZ2V0Q29uc3RydWN0b3JJbnRlcm5hbChub2RlKTsKICAgIH0gZWxzZSBpZiAobm9kZSBpcyBpci5Qcm9jZWR1cmUpIHsKICAgICAgaWYgKG5vZGUua2luZCA9PSBpci5Qcm9jZWR1cmVLaW5kLkZhY3RvcnkpIHsKICAgICAgICByZXR1cm4gZ2V0Q29uc3RydWN0b3JJbnRlcm5hbChub2RlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZ2V0TWV0aG9kSW50ZXJuYWwobm9kZSk7CiAgICAgIH0KICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmV4cGVjdGVkIG1lbWJlcjogJG5vZGUiKTsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlckVudGl0eSBnZXRTdXBlck1lbWJlcihNZW1iZXJFbnRpdHkgY29udGV4dCwgaXIuTmFtZSBuYW1lLAogICAgICB7Ym9vbCBzZXR0ZXI6IGZhbHNlfSkgewogICAgLy8gV2UgY2FuIG5vIGxvbmdlciB0cnVzdCB0aGUgaW50ZXJmYWNlIHRhcmdldCBvZiB0aGUgc3VwZXIgYWNjZXNzIHNpbmNlIGl0CiAgICAvLyBtaWdodCBiZSBhIG1lbWJlciB0aGF0IHdlIGhhdmUgY2xvbmVkLgogICAgQ2xhc3NFbnRpdHkgY2xzID0gY29udGV4dC5lbmNsb3NpbmdDbGFzczsKICAgIGFzc2VydCgKICAgICAgICBjbHMgIT0gbnVsbCwKICAgICAgICBmYWlsZWRBdChjb250ZXh0LAogICAgICAgICAgICAiTm8gZW5jbG9zaW5nIGNsYXNzIGZvciBzdXBlciBtZW1iZXIgYWNjZXNzIGluICRjb250ZXh0LiIpKTsKICAgIEluZGV4ZWRDbGFzcyBzdXBlcmNsYXNzID0gZ2V0U3VwZXJUeXBlKGNscyk/LmVsZW1lbnQ7CiAgICB3aGlsZSAoc3VwZXJjbGFzcyAhPSBudWxsKSB7CiAgICAgIEtDbGFzc0VudiBlbnYgPSBjbGFzc2VzLmdldEVudihzdXBlcmNsYXNzKTsKICAgICAgTWVtYmVyRW50aXR5IHN1cGVyTWVtYmVyID0KICAgICAgICAgIGVudi5sb29rdXBNZW1iZXIodGhpcywgbmFtZS5uYW1lLCBzZXR0ZXI6IHNldHRlcik7CiAgICAgIGlmIChzdXBlck1lbWJlciAhPSBudWxsKSB7CiAgICAgICAgaWYgKCFzdXBlck1lbWJlci5pc0luc3RhbmNlTWVtYmVyKSByZXR1cm4gbnVsbDsKICAgICAgICBpZiAoIXN1cGVyTWVtYmVyLmlzQWJzdHJhY3QpIHsKICAgICAgICAgIHJldHVybiBzdXBlck1lbWJlcjsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3VwZXJjbGFzcyA9IGdldFN1cGVyVHlwZShzdXBlcmNsYXNzKT8uZWxlbWVudDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RydWN0b3JFbnRpdHkgZ2V0Q29uc3RydWN0b3IoaXIuTWVtYmVyIG5vZGUpID0+CiAgICAgIGdldENvbnN0cnVjdG9ySW50ZXJuYWwobm9kZSk7CgogIEBvdmVycmlkZQogIENvbnN0cnVjdG9yRW50aXR5IGdldFN1cGVyQ29uc3RydWN0b3IoCiAgICAgIGlyLkNvbnN0cnVjdG9yIHNvdXJjZU5vZGUsIGlyLk1lbWJlciB0YXJnZXROb2RlKSB7CiAgICBDb25zdHJ1Y3RvckVudGl0eSBzb3VyY2UgPSBnZXRDb25zdHJ1Y3Rvcihzb3VyY2VOb2RlKTsKICAgIENsYXNzRW50aXR5IHNvdXJjZUNsYXNzID0gc291cmNlLmVuY2xvc2luZ0NsYXNzOwogICAgQ29uc3RydWN0b3JFbnRpdHkgdGFyZ2V0ID0gZ2V0Q29uc3RydWN0b3IodGFyZ2V0Tm9kZSk7CiAgICBDbGFzc0VudGl0eSB0YXJnZXRDbGFzcyA9IHRhcmdldC5lbmNsb3NpbmdDbGFzczsKICAgIEluZGV4ZWRDbGFzcyBzdXBlckNsYXNzID0gZ2V0U3VwZXJUeXBlKHNvdXJjZUNsYXNzKT8uZWxlbWVudDsKICAgIGlmIChzdXBlckNsYXNzID09IHRhcmdldENsYXNzKSB7CiAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9CgogICAgLy8vIFRoaXMgcGF0aCBpcyBuZWVkZWQgZm9yIHN5bnRoZXRpY2FsbHkgaW5qZWN0ZWQgc3VwZXJjbGFzc2VzIGxpa2UKICAgIC8vLyBgSW50ZXJjZXB0b3JgIGFuZCBgSmF2YVNjcmlwdE9iamVjdGAuCiAgICBLQ2xhc3NFbnYgZW52ID0gY2xhc3Nlcy5nZXRFbnYoc3VwZXJDbGFzcyk7CiAgICBDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvciA9IGVudi5sb29rdXBDb25zdHJ1Y3Rvcih0aGlzLCB0YXJnZXQubmFtZSk7CiAgICBpZiAoY29uc3RydWN0b3IgIT0gbnVsbCkgewogICAgICByZXR1cm4gY29uc3RydWN0b3I7CiAgICB9CiAgICB0aHJvdyBmYWlsZWRBdChzb3VyY2UsICJTdXBlciBjb25zdHJ1Y3RvciBmb3IgJHNvdXJjZSBub3QgZm91bmQuIik7CiAgfQoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXRNZXRob2QoaXIuUHJvY2VkdXJlIG5vZGUpID0+IGdldE1ldGhvZEludGVybmFsKG5vZGUpOwoKICBAb3ZlcnJpZGUKICBGaWVsZEVudGl0eSBnZXRGaWVsZChpci5GaWVsZCBub2RlKSA9PiBnZXRGaWVsZEludGVybmFsKG5vZGUpOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXREYXJ0VHlwZShpci5EYXJ0VHlwZSB0eXBlKSA9PiBfdHlwZUNvbnZlcnRlci5jb252ZXJ0KHR5cGUpOwoKICBAb3ZlcnJpZGUKICBUeXBlVmFyaWFibGVUeXBlIGdldFR5cGVWYXJpYWJsZVR5cGUoaXIuVHlwZVBhcmFtZXRlclR5cGUgdHlwZSkgPT4KICAgICAgZ2V0RGFydFR5cGUodHlwZSk7CgogIExpc3Q8RGFydFR5cGU+IGdldERhcnRUeXBlcyhMaXN0PGlyLkRhcnRUeXBlPiB0eXBlcykgewogICAgTGlzdDxEYXJ0VHlwZT4gbGlzdCA9IDxEYXJ0VHlwZT5bXTsKICAgIHR5cGVzLmZvckVhY2goKGlyLkRhcnRUeXBlIHR5cGUpIHsKICAgICAgbGlzdC5hZGQoZ2V0RGFydFR5cGUodHlwZSkpOwogICAgfSk7CiAgICByZXR1cm4gbGlzdDsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0SW50ZXJmYWNlVHlwZShpci5JbnRlcmZhY2VUeXBlIHR5cGUpID0+CiAgICAgIF90eXBlQ29udmVydGVyLmNvbnZlcnQodHlwZSk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uVHlwZSBnZXRGdW5jdGlvblR5cGUoaXIuRnVuY3Rpb25Ob2RlIG5vZGUpIHsKICAgIERhcnRUeXBlIHJldHVyblR5cGU7CiAgICBpZiAobm9kZS5wYXJlbnQgaXMgaXIuQ29uc3RydWN0b3IpIHsKICAgICAgLy8gVGhlIHJldHVybiB0eXBlIG9uIGdlbmVyYXRpdmUgY29uc3RydWN0b3JzIGlzIGB2b2lkYCwgYnV0IHdlIG5lZWQKICAgICAgLy8gYGR5bmFtaWNgIHR5cGUgdG8gbWF0Y2ggdGhlIGVsZW1lbnQgbW9kZWwuCiAgICAgIHJldHVyblR5cGUgPSBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuVHlwZSA9IGdldERhcnRUeXBlKG5vZGUucmV0dXJuVHlwZSk7CiAgICB9CiAgICBMaXN0PERhcnRUeXBlPiBwYXJhbWV0ZXJUeXBlcyA9IDxEYXJ0VHlwZT5bXTsKICAgIExpc3Q8RGFydFR5cGU+IG9wdGlvbmFsUGFyYW1ldGVyVHlwZXMgPSA8RGFydFR5cGU+W107CgogICAgRGFydFR5cGUgZ2V0UGFyYW1ldGVyVHlwZShpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSB7CiAgICAgIGlmICh2YXJpYWJsZS5pc0NvdmFyaWFudCB8fCB2YXJpYWJsZS5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsKSB7CiAgICAgICAgLy8gQSBjb3ZhcmlhbnQgcGFyYW1ldGVyIGhhcyB0eXBlIGBPYmplY3RgIGluIHRoZSBtZXRob2Qgc2lnbmF0dXJlLgogICAgICAgIHJldHVybiBjb21tb25FbGVtZW50cy5vYmplY3RUeXBlOwogICAgICB9CiAgICAgIHJldHVybiBnZXREYXJ0VHlwZSh2YXJpYWJsZS50eXBlKTsKICAgIH0KCiAgICBmb3IgKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgaW4gbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICBpZiAocGFyYW1ldGVyVHlwZXMubGVuZ3RoID09IG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCkgewogICAgICAgIG9wdGlvbmFsUGFyYW1ldGVyVHlwZXMuYWRkKGdldFBhcmFtZXRlclR5cGUodmFyaWFibGUpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwYXJhbWV0ZXJUeXBlcy5hZGQoZ2V0UGFyYW1ldGVyVHlwZSh2YXJpYWJsZSkpOwogICAgICB9CiAgICB9CiAgICBMaXN0PFN0cmluZz4gbmFtZWRQYXJhbWV0ZXJzID0gPFN0cmluZz5bXTsKICAgIExpc3Q8RGFydFR5cGU+IG5hbWVkUGFyYW1ldGVyVHlwZXMgPSA8RGFydFR5cGU+W107CiAgICBMaXN0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+IHNvcnRlZE5hbWVkUGFyYW1ldGVycyA9CiAgICAgICAgbm9kZS5uYW1lZFBhcmFtZXRlcnMudG9MaXN0KCkuLnNvcnQoKGEsIGIpID0+IGEubmFtZS5jb21wYXJlVG8oYi5uYW1lKSk7CiAgICBmb3IgKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgaW4gc29ydGVkTmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgIG5hbWVkUGFyYW1ldGVycy5hZGQodmFyaWFibGUubmFtZSk7CiAgICAgIG5hbWVkUGFyYW1ldGVyVHlwZXMuYWRkKGdldFBhcmFtZXRlclR5cGUodmFyaWFibGUpKTsKICAgIH0KICAgIExpc3Q8RnVuY3Rpb25UeXBlVmFyaWFibGU+IHR5cGVWYXJpYWJsZXM7CiAgICBpZiAobm9kZS50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVQYXJhbWV0ZXJzID0gPERhcnRUeXBlPltdOwogICAgICBmb3IgKGlyLlR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciBpbiBub2RlLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgICAgdHlwZVBhcmFtZXRlcnMKICAgICAgICAgICAgLmFkZChnZXREYXJ0VHlwZShuZXcgaXIuVHlwZVBhcmFtZXRlclR5cGUodHlwZVBhcmFtZXRlcikpKTsKICAgICAgfQogICAgICB0eXBlVmFyaWFibGVzID0gbmV3IExpc3Q8RnVuY3Rpb25UeXBlVmFyaWFibGU+LmdlbmVyYXRlKAogICAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycy5sZW5ndGgsCiAgICAgICAgICAoaW50IGluZGV4KSA9PiBuZXcgRnVuY3Rpb25UeXBlVmFyaWFibGUoaW5kZXgpKTsKCiAgICAgIERhcnRUeXBlIHN1YnN0KERhcnRUeXBlIHR5cGUpIHsKICAgICAgICByZXR1cm4gdHlwZS5zdWJzdCh0eXBlVmFyaWFibGVzLCB0eXBlUGFyYW1ldGVycyk7CiAgICAgIH0KCiAgICAgIHJldHVyblR5cGUgPSBzdWJzdChyZXR1cm5UeXBlKTsKICAgICAgcGFyYW1ldGVyVHlwZXMgPSBwYXJhbWV0ZXJUeXBlcy5tYXAoc3Vic3QpLnRvTGlzdCgpOwogICAgICBvcHRpb25hbFBhcmFtZXRlclR5cGVzID0gb3B0aW9uYWxQYXJhbWV0ZXJUeXBlcy5tYXAoc3Vic3QpLnRvTGlzdCgpOwogICAgICBuYW1lZFBhcmFtZXRlclR5cGVzID0gbmFtZWRQYXJhbWV0ZXJUeXBlcy5tYXAoc3Vic3QpLnRvTGlzdCgpOwogICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgdHlwZVZhcmlhYmxlcy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICB0eXBlVmFyaWFibGVzW2luZGV4XS5ib3VuZCA9CiAgICAgICAgICAgIHN1YnN0KGdldERhcnRUeXBlKG5vZGUudHlwZVBhcmFtZXRlcnNbaW5kZXhdLmJvdW5kKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHR5cGVWYXJpYWJsZXMgPSBjb25zdCA8RnVuY3Rpb25UeXBlVmFyaWFibGU+W107CiAgICB9CgogICAgcmV0dXJuIG5ldyBGdW5jdGlvblR5cGUocmV0dXJuVHlwZSwgcGFyYW1ldGVyVHlwZXMsIG9wdGlvbmFsUGFyYW1ldGVyVHlwZXMsCiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzLCBuYW1lZFBhcmFtZXRlclR5cGVzLCB0eXBlVmFyaWFibGVzKTsKICB9CgogIENvbnN0YW50VmFsdWUgY29tcHV0ZUNvbnN0YW50VmFsdWUoCiAgICAgIFNwYW5uYWJsZSBzcGFubmFibGUsIENvbnN0YW50RXhwcmVzc2lvbiBjb25zdGFudCwKICAgICAge2Jvb2wgcmVxdWlyZUNvbnN0YW50OiB0cnVlLCBib29sIGNoZWNrQ2FzdHM6IHRydWV9KSB7CiAgICByZXR1cm4gX2NvbnN0YW50RW52aXJvbm1lbnQuX2dldENvbnN0YW50VmFsdWUoc3Bhbm5hYmxlLCBjb25zdGFudCwKICAgICAgICBjb25zdGFudFJlcXVpcmVkOiByZXF1aXJlQ29uc3RhbnQsIGNoZWNrQ2FzdHM6IGNoZWNrQ2FzdHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgc3Vic3RCeUNvbnRleHQoRGFydFR5cGUgdHlwZSwgSW50ZXJmYWNlVHlwZSBjb250ZXh0KSB7CiAgICByZXR1cm4gdHlwZS5zdWJzdCgKICAgICAgICBjb250ZXh0LnR5cGVBcmd1bWVudHMsIGdldFRoaXNUeXBlKGNvbnRleHQuZWxlbWVudCkudHlwZUFyZ3VtZW50cyk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgYGNhbGxgIG1ldGhvZCBvbiAndHlwZScuCiAgLy8vCiAgLy8vIElmIFt0eXBlXSBkb2Vzbid0IGhhdmUgYSBgY2FsbGAgbWVtYmVyIGBudWxsYCBpcyByZXR1cm5lZC4gSWYgW3R5cGVdIGhhcwogIC8vLyBhbiBpbnZhbGlkIGBjYWxsYCBtZW1iZXIgKG5vbi1tZXRob2Qgb3IgYSBzeW50aGVzaXplZCBtZXRob2Qgd2l0aCBib3RoCiAgLy8vIG9wdGlvbmFsIGFuZCBuYW1lZCBwYXJhbWV0ZXJzKSBhIFtEeW5hbWljVHlwZV0gaXMgcmV0dXJuZWQuCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0Q2FsbFR5cGUoSW50ZXJmYWNlVHlwZSB0eXBlKSB7CiAgICBJbmRleGVkQ2xhc3MgY2xzID0gdHlwZS5lbGVtZW50OwogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgS0NsYXNzRGF0YSBkYXRhID0gY2xhc3Nlcy5nZXREYXRhKGNscyk7CiAgICBpZiAoZGF0YS5jYWxsVHlwZSAhPSBudWxsKSB7CiAgICAgIHJldHVybiBzdWJzdEJ5Q29udGV4dChkYXRhLmNhbGxUeXBlLCB0eXBlKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXRUaGlzVHlwZShJbmRleGVkQ2xhc3MgY2xzKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBLQ2xhc3NEYXRhIGRhdGEgPSBjbGFzc2VzLmdldERhdGEoY2xzKTsKICAgIF9lbnN1cmVUaGlzQW5kUmF3VHlwZShjbHMsIGRhdGEpOwogICAgcmV0dXJuIGRhdGEudGhpc1R5cGU7CiAgfQoKICBJbnRlcmZhY2VUeXBlIF9nZXRSYXdUeXBlKEluZGV4ZWRDbGFzcyBjbHMpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIEtDbGFzc0RhdGEgZGF0YSA9IGNsYXNzZXMuZ2V0RGF0YShjbHMpOwogICAgX2Vuc3VyZVRoaXNBbmRSYXdUeXBlKGNscywgZGF0YSk7CiAgICByZXR1cm4gZGF0YS5yYXdUeXBlOwogIH0KCiAgRGFydFR5cGUgX2dldEZpZWxkVHlwZShJbmRleGVkRmllbGQgZmllbGQpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShmaWVsZCkpOwogICAgS0ZpZWxkRGF0YSBkYXRhID0gbWVtYmVycy5nZXREYXRhKGZpZWxkKTsKICAgIHJldHVybiBkYXRhLmdldEZpZWxkVHlwZSh0aGlzKTsKICB9CgogIEZ1bmN0aW9uVHlwZSBfZ2V0RnVuY3Rpb25UeXBlKEluZGV4ZWRGdW5jdGlvbiBmdW5jdGlvbikgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGZ1bmN0aW9uKSk7CiAgICBLRnVuY3Rpb25EYXRhIGRhdGEgPSBtZW1iZXJzLmdldERhdGEoZnVuY3Rpb24pOwogICAgcmV0dXJuIGRhdGEuZ2V0RnVuY3Rpb25UeXBlKHRoaXMpOwogIH0KCiAgTGlzdDxUeXBlVmFyaWFibGVUeXBlPiBfZ2V0RnVuY3Rpb25UeXBlVmFyaWFibGVzKEluZGV4ZWRGdW5jdGlvbiBmdW5jdGlvbikgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGZ1bmN0aW9uKSk7CiAgICBLRnVuY3Rpb25EYXRhIGRhdGEgPSBtZW1iZXJzLmdldERhdGEoZnVuY3Rpb24pOwogICAgcmV0dXJuIGRhdGEuZ2V0RnVuY3Rpb25UeXBlVmFyaWFibGVzKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0VHlwZVZhcmlhYmxlQm91bmQoSW5kZXhlZFR5cGVWYXJpYWJsZSB0eXBlVmFyaWFibGUpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseSh0eXBlVmFyaWFibGUpKTsKICAgIEtUeXBlVmFyaWFibGVEYXRhIGRhdGEgPSB0eXBlVmFyaWFibGVzLmdldERhdGEodHlwZVZhcmlhYmxlKTsKICAgIHJldHVybiBkYXRhLmdldEJvdW5kKHRoaXMpOwogIH0KCiAgQ2xhc3NFbnRpdHkgZ2V0QXBwbGllZE1peGluKEluZGV4ZWRDbGFzcyBjbHMpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIEtDbGFzc0RhdGEgZGF0YSA9IGNsYXNzZXMuZ2V0RGF0YShjbHMpOwogICAgX2Vuc3VyZVN1cGVydHlwZXMoY2xzLCBkYXRhKTsKICAgIHJldHVybiBkYXRhLm1peGVkSW5UeXBlPy5lbGVtZW50OwogIH0KCiAgYm9vbCBfaXNNaXhpbkFwcGxpY2F0aW9uKEluZGV4ZWRDbGFzcyBjbHMpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIEtDbGFzc0RhdGEgZGF0YSA9IGNsYXNzZXMuZ2V0RGF0YShjbHMpOwogICAgX2Vuc3VyZVN1cGVydHlwZXMoY2xzLCBkYXRhKTsKICAgIHJldHVybiBkYXRhLmlzTWl4aW5BcHBsaWNhdGlvbjsKICB9CgogIGJvb2wgX2lzVW5uYW1lZE1peGluQXBwbGljYXRpb24oSW5kZXhlZENsYXNzIGNscykgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgS0NsYXNzRW52IGVudiA9IGNsYXNzZXMuZ2V0RW52KGNscyk7CiAgICByZXR1cm4gZW52LmlzVW5uYW1lZE1peGluQXBwbGljYXRpb247CiAgfQoKICB2b2lkIF9mb3JFYWNoU3VwZXJ0eXBlKEluZGV4ZWRDbGFzcyBjbHMsIHZvaWQgZihJbnRlcmZhY2VUeXBlIHN1cGVydHlwZSkpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIEtDbGFzc0RhdGEgZGF0YSA9IGNsYXNzZXMuZ2V0RGF0YShjbHMpOwogICAgX2Vuc3VyZVN1cGVydHlwZXMoY2xzLCBkYXRhKTsKICAgIGRhdGEub3JkZXJlZFR5cGVTZXQuc3VwZXJ0eXBlcy5mb3JFYWNoKGYpOwogIH0KCiAgdm9pZCBfZm9yRWFjaE1peGluKEluZGV4ZWRDbGFzcyBjbHMsIHZvaWQgZihDbGFzc0VudGl0eSBtaXhpbikpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIHdoaWxlIChjbHMgIT0gbnVsbCkgewogICAgICBLQ2xhc3NEYXRhIGRhdGEgPSBjbGFzc2VzLmdldERhdGEoY2xzKTsKICAgICAgX2Vuc3VyZVN1cGVydHlwZXMoY2xzLCBkYXRhKTsKICAgICAgaWYgKGRhdGEubWl4ZWRJblR5cGUgIT0gbnVsbCkgewogICAgICAgIGYoZGF0YS5taXhlZEluVHlwZS5lbGVtZW50KTsKICAgICAgfQogICAgICBjbHMgPSBkYXRhLnN1cGVydHlwZT8uZWxlbWVudDsKICAgIH0KICB9CgogIHZvaWQgX2ZvckVhY2hDb25zdHJ1Y3RvcihJbmRleGVkQ2xhc3MgY2xzLCB2b2lkIGYoQ29uc3RydWN0b3JFbnRpdHkgbWVtYmVyKSkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgS0NsYXNzRW52IGVudiA9IGNsYXNzZXMuZ2V0RW52KGNscyk7CiAgICBlbnYuZm9yRWFjaENvbnN0cnVjdG9yKHRoaXMsIGYpOwogIH0KCiAgdm9pZCBfZm9yRWFjaExvY2FsQ2xhc3NNZW1iZXIoSW5kZXhlZENsYXNzIGNscywgdm9pZCBmKE1lbWJlckVudGl0eSBtZW1iZXIpKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBLQ2xhc3NFbnYgZW52ID0gY2xhc3Nlcy5nZXRFbnYoY2xzKTsKICAgIGVudi5mb3JFYWNoTWVtYmVyKHRoaXMsIChNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAgIGYobWVtYmVyKTsKICAgIH0pOwogIH0KCiAgdm9pZCBmb3JFYWNoSW5qZWN0ZWRDbGFzc01lbWJlcigKICAgICAgSW5kZXhlZENsYXNzIGNscywgdm9pZCBmKE1lbWJlckVudGl0eSBtZW1iZXIpKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAnS2VybmVsVG9FbGVtZW50TWFwQmFzZS5fZm9yRWFjaEluamVjdGVkQ2xhc3NNZW1iZXInKTsKICB9CgogIHZvaWQgX2ZvckVhY2hDbGFzc01lbWJlcigKICAgICAgSW5kZXhlZENsYXNzIGNscywgdm9pZCBmKENsYXNzRW50aXR5IGNscywgTWVtYmVyRW50aXR5IG1lbWJlcikpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIEtDbGFzc0VudiBlbnYgPSBjbGFzc2VzLmdldEVudihjbHMpOwogICAgZW52LmZvckVhY2hNZW1iZXIodGhpcywgKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgICAgZihjbHMsIG1lbWJlcik7CiAgICB9KTsKICAgIEtDbGFzc0RhdGEgZGF0YSA9IGNsYXNzZXMuZ2V0RGF0YShjbHMpOwogICAgX2Vuc3VyZVN1cGVydHlwZXMoY2xzLCBkYXRhKTsKICAgIGlmIChkYXRhLnN1cGVydHlwZSAhPSBudWxsKSB7CiAgICAgIF9mb3JFYWNoQ2xhc3NNZW1iZXIoZGF0YS5zdXBlcnR5cGUuZWxlbWVudCwgZik7CiAgICB9CiAgfQoKICBDb25zdGFudENvbnN0cnVjdG9yIF9nZXRDb25zdHJ1Y3RvckNvbnN0YW50KEluZGV4ZWRDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcikgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNvbnN0cnVjdG9yKSk7CiAgICBLQ29uc3RydWN0b3JEYXRhIGRhdGEgPSBtZW1iZXJzLmdldERhdGEoY29uc3RydWN0b3IpOwogICAgcmV0dXJuIGRhdGEuZ2V0Q29uc3RydWN0b3JDb25zdGFudCh0aGlzLCBjb25zdHJ1Y3Rvcik7CiAgfQoKICBDb25zdGFudEV4cHJlc3Npb24gX2dldEZpZWxkQ29uc3RhbnRFeHByZXNzaW9uKEluZGV4ZWRGaWVsZCBmaWVsZCkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGZpZWxkKSk7CiAgICBLRmllbGREYXRhIGRhdGEgPSBtZW1iZXJzLmdldERhdGEoZmllbGQpOwogICAgcmV0dXJuIGRhdGEuZ2V0RmllbGRDb25zdGFudEV4cHJlc3Npb24odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGFzSW5zdGFuY2VPZihJbnRlcmZhY2VUeXBlIHR5cGUsIENsYXNzRW50aXR5IGNscykgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgT3JkZXJlZFR5cGVTZXQgb3JkZXJlZFR5cGVTZXQgPSBnZXRPcmRlcmVkVHlwZVNldCh0eXBlLmVsZW1lbnQpOwogICAgSW50ZXJmYWNlVHlwZSBzdXBlcnR5cGUgPQogICAgICAgIG9yZGVyZWRUeXBlU2V0LmFzSW5zdGFuY2VPZihjbHMsIGdldEhpZXJhcmNoeURlcHRoKGNscykpOwogICAgaWYgKHN1cGVydHlwZSAhPSBudWxsKSB7CiAgICAgIHN1cGVydHlwZSA9IHN1YnN0QnlDb250ZXh0KHN1cGVydHlwZSwgdHlwZSk7CiAgICB9CiAgICByZXR1cm4gc3VwZXJ0eXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgT3JkZXJlZFR5cGVTZXQgZ2V0T3JkZXJlZFR5cGVTZXQoSW5kZXhlZENsYXNzIGNscykgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgS0NsYXNzRGF0YSBkYXRhID0gY2xhc3Nlcy5nZXREYXRhKGNscyk7CiAgICBfZW5zdXJlU3VwZXJ0eXBlcyhjbHMsIGRhdGEpOwogICAgcmV0dXJuIGRhdGEub3JkZXJlZFR5cGVTZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0SGllcmFyY2h5RGVwdGgoSW5kZXhlZENsYXNzIGNscykgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgS0NsYXNzRGF0YSBkYXRhID0gY2xhc3Nlcy5nZXREYXRhKGNscyk7CiAgICBfZW5zdXJlU3VwZXJ0eXBlcyhjbHMsIGRhdGEpOwogICAgcmV0dXJuIGRhdGEub3JkZXJlZFR5cGVTZXQubWF4RGVwdGg7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxJbnRlcmZhY2VUeXBlPiBnZXRJbnRlcmZhY2VzKEluZGV4ZWRDbGFzcyBjbHMpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIEtDbGFzc0RhdGEgZGF0YSA9IGNsYXNzZXMuZ2V0RGF0YShjbHMpOwogICAgX2Vuc3VyZVN1cGVydHlwZXMoY2xzLCBkYXRhKTsKICAgIHJldHVybiBkYXRhLmludGVyZmFjZXM7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5NZW1iZXIgZ2V0TWVtYmVyTm9kZShjb3ZhcmlhbnQgSW5kZXhlZE1lbWJlciBtZW1iZXIpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShtZW1iZXIpKTsKICAgIHJldHVybiBtZW1iZXJzLmdldERhdGEobWVtYmVyKS5ub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuQ2xhc3MgZ2V0Q2xhc3NOb2RlKGNvdmFyaWFudCBJbmRleGVkQ2xhc3MgY2xzKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICByZXR1cm4gY2xhc3Nlcy5nZXREYXRhKGNscykubm9kZTsKICB9CgogIGlyLlR5cGVkZWYgX2dldFR5cGVkZWZOb2RlKGNvdmFyaWFudCBJbmRleGVkVHlwZWRlZiB0eXBlZGVmKSB7CiAgICByZXR1cm4gdHlwZWRlZnMuZ2V0RGF0YSh0eXBlZGVmKS5ub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgSW1wb3J0RW50aXR5IGdldEltcG9ydChpci5MaWJyYXJ5RGVwZW5kZW5jeSBub2RlKSB7CiAgICBpZiAobm9kZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGlyLkxpYnJhcnkgbGlicmFyeSA9IG5vZGUucGFyZW50OwogICAgS0xpYnJhcnlEYXRhIGRhdGEgPSBsaWJyYXJpZXMuZ2V0RGF0YShnZXRMaWJyYXJ5SW50ZXJuYWwobGlicmFyeSkpOwogICAgcmV0dXJuIGRhdGEuaW1wb3J0c1tub2RlXTsKICB9CgogIEBvdmVycmlkZQogIGlyLlR5cGVFbnZpcm9ubWVudCBnZXQgdHlwZUVudmlyb25tZW50IHsKICAgIHJldHVybiBfdHlwZUVudmlyb25tZW50ID8/PSBuZXcgaXIuVHlwZUVudmlyb25tZW50KAogICAgICAgIG5ldyBpci5Db3JlVHlwZXMoZW52Lm1haW5Db21wb25lbnQpLCBjbGFzc0hpZXJhcmNoeSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5DbGFzc0hpZXJhcmNoeSBnZXQgY2xhc3NIaWVyYXJjaHkgewogICAgcmV0dXJuIF9jbGFzc0hpZXJhcmNoeSA/Pz0gbmV3IGlyLkNsYXNzSGllcmFyY2h5KGVudi5tYWluQ29tcG9uZW50KTsKICB9CgogIERhcnQyanNDb25zdGFudEV2YWx1YXRvciBnZXQgY29uc3RhbnRFdmFsdWF0b3IgewogICAgcmV0dXJuIF9jb25zdGFudEV2YWx1YXRvciA/Pz0gbmV3IERhcnQyanNDb25zdGFudEV2YWx1YXRvcih0eXBlRW52aXJvbm1lbnQsCiAgICAgICAgKGlyLkxvY2F0ZWRNZXNzYWdlIG1lc3NhZ2UsIExpc3Q8aXIuTG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQpIHsKICAgICAgcmVwb3J0TG9jYXRlZE1lc3NhZ2UocmVwb3J0ZXIsIG1lc3NhZ2UsIGNvbnRleHQpOwogICAgfSwKICAgICAgICBlbmFibGVBc3NlcnRzOiBvcHRpb25zLmVuYWJsZVVzZXJBc3NlcnRpb25zLAogICAgICAgIGVudmlyb25tZW50OiBfZW52aXJvbm1lbnQudG9NYXAoKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBOYW1lIGdldE5hbWUoaXIuTmFtZSBuYW1lKSB7CiAgICByZXR1cm4gbmV3IE5hbWUoCiAgICAgICAgbmFtZS5uYW1lLCBuYW1lLmlzUHJpdmF0ZSA/IGdldExpYnJhcnkobmFtZS5saWJyYXJ5KSA6IG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2FsbFN0cnVjdHVyZSBnZXRDYWxsU3RydWN0dXJlKGlyLkFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIGludCBhcmd1bWVudENvdW50ID0gYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoICsgYXJndW1lbnRzLm5hbWVkLmxlbmd0aDsKICAgIExpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cyA9IGFyZ3VtZW50cy5uYW1lZC5tYXAoKGUpID0+IGUubmFtZSkudG9MaXN0KCk7CiAgICByZXR1cm4gbmV3IENhbGxTdHJ1Y3R1cmUoCiAgICAgICAgYXJndW1lbnRDb3VudCwgbmFtZWRBcmd1bWVudHMsIGFyZ3VtZW50cy50eXBlcy5sZW5ndGgpOwogIH0KCiAgUGFyYW1ldGVyU3RydWN0dXJlIGdldFBhcmFtZXRlclN0cnVjdHVyZShpci5GdW5jdGlvbk5vZGUgbm9kZSwKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMgd2hlbiB0eXBlIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvCiAgICAgIC8vIGNvbnN0cnVjdG9ycyBsaWtlIGNhbGxpbmcgYSBnZW5lcmljIG1ldGhvZC4KICAgICAge2Jvb2wgaW5jbHVkZVR5cGVQYXJhbWV0ZXJzOiB0cnVlfSkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ2FjaGUgdGhlIGNvbXB1dGVkIGZ1bmN0aW9uIHR5cGUuCiAgICBpbnQgcmVxdWlyZWRQYXJhbWV0ZXJzID0gbm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50OwogICAgaW50IHBvc2l0aW9uYWxQYXJhbWV0ZXJzID0gbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7CiAgICBpbnQgdHlwZVBhcmFtZXRlcnMgPSBub2RlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsKICAgIExpc3Q8U3RyaW5nPiBuYW1lZFBhcmFtZXRlcnMgPQogICAgICAgIG5vZGUubmFtZWRQYXJhbWV0ZXJzLm1hcCgocCkgPT4gcC5uYW1lKS50b0xpc3QoKS4uc29ydCgpOwogICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmUocmVxdWlyZWRQYXJhbWV0ZXJzLCBwb3NpdGlvbmFsUGFyYW1ldGVycywKICAgICAgICBuYW1lZFBhcmFtZXRlcnMsIGluY2x1ZGVUeXBlUGFyYW1ldGVycyA/IHR5cGVQYXJhbWV0ZXJzIDogMCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTZWxlY3RvciBnZXRJbnZvY2F0aW9uU2VsZWN0b3IoaXIuTmFtZSBpck5hbWUsIGludCBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHMsIGludCB0eXBlQXJndW1lbnRzKSB7CiAgICBOYW1lIG5hbWUgPSBnZXROYW1lKGlyTmFtZSk7CiAgICBTZWxlY3RvcktpbmQga2luZDsKICAgIGlmIChTZWxlY3Rvci5pc09wZXJhdG9yTmFtZShuYW1lLnRleHQpKSB7CiAgICAgIGlmIChuYW1lID09IE5hbWVzLklOREVYX05BTUUgfHwgbmFtZSA9PSBOYW1lcy5JTkRFWF9TRVRfTkFNRSkgewogICAgICAgIGtpbmQgPSBTZWxlY3RvcktpbmQuSU5ERVg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAga2luZCA9IFNlbGVjdG9yS2luZC5PUEVSQVRPUjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAga2luZCA9IFNlbGVjdG9yS2luZC5DQUxMOwogICAgfQoKICAgIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSA9IG5ldyBDYWxsU3RydWN0dXJlKAogICAgICAgIHBvc2l0aW9uYWxBcmd1bWVudHMgKyBuYW1lZEFyZ3VtZW50cy5sZW5ndGgsCiAgICAgICAgbmFtZWRBcmd1bWVudHMsCiAgICAgICAgdHlwZUFyZ3VtZW50cyk7CiAgICByZXR1cm4gbmV3IFNlbGVjdG9yKGtpbmQsIG5hbWUsIGNhbGxTdHJ1Y3R1cmUpOwogIH0KCiAgU2VsZWN0b3IgZ2V0R2V0dGVyU2VsZWN0b3IoaXIuTmFtZSBpck5hbWUpIHsKICAgIE5hbWUgbmFtZSA9IG5ldyBOYW1lKAogICAgICAgIGlyTmFtZS5uYW1lLCBpck5hbWUuaXNQcml2YXRlID8gZ2V0TGlicmFyeShpck5hbWUubGlicmFyeSkgOiBudWxsKTsKICAgIHJldHVybiBuZXcgU2VsZWN0b3IuZ2V0dGVyKG5hbWUpOwogIH0KCiAgU2VsZWN0b3IgZ2V0U2V0dGVyU2VsZWN0b3IoaXIuTmFtZSBpck5hbWUpIHsKICAgIE5hbWUgbmFtZSA9IG5ldyBOYW1lKAogICAgICAgIGlyTmFtZS5uYW1lLCBpck5hbWUuaXNQcml2YXRlID8gZ2V0TGlicmFyeShpck5hbWUubGlicmFyeSkgOiBudWxsKTsKICAgIHJldHVybiBuZXcgU2VsZWN0b3Iuc2V0dGVyKG5hbWUpOwogIH0KCiAgLy8vIExvb2tzIHVwIFt0eXBlTmFtZV0gZm9yIHVzZSBpbiB0aGUgc3BlYy1zdHJpbmcgb2YgYSBgSlNgIGNhbGwuCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVXNlIHRoaXMgaW4gW05hdGl2ZUJlaGF2aW9yXSBpbnN0ZWFkIG9mIGNhbGxpbmcKICAvLyB0aGUgYEZvcmVpZ25SZXNvbHZlcmAuCiAgVHlwZUxvb2t1cCB0eXBlTG9va3VwKHtib29sIHJlc29sdmVBc1JhdzogdHJ1ZX0pIHsKICAgIHJldHVybiByZXNvbHZlQXNSYXcKICAgICAgICA/IChfY2FjaGVkVHlwZUxvb2t1cFJhdyA/Pz0gX3R5cGVMb29rdXAocmVzb2x2ZUFzUmF3OiB0cnVlKSkKICAgICAgICA6IChfY2FjaGVkVHlwZUxvb2t1cEZ1bGwgPz89IF90eXBlTG9va3VwKHJlc29sdmVBc1JhdzogZmFsc2UpKTsKICB9CgogIFR5cGVMb29rdXAgX2NhY2hlZFR5cGVMb29rdXBSYXc7CiAgVHlwZUxvb2t1cCBfY2FjaGVkVHlwZUxvb2t1cEZ1bGw7CgogIFR5cGVMb29rdXAgX3R5cGVMb29rdXAoe2Jvb2wgcmVzb2x2ZUFzUmF3OiB0cnVlfSkgewogICAgYm9vbCBjYWNoZWRNYXlMb29rdXBJbk1haW47CiAgICBib29sIG1heUxvb2t1cEluTWFpbigpIHsKICAgICAgdmFyIG1haW5VcmkgPSBlbGVtZW50RW52aXJvbm1lbnQubWFpbkxpYnJhcnkuY2Fub25pY2FsVXJpOwogICAgICAvLyBUZXN0cyBwZXJtaXQgbG9va3VwIG91dHNpZGUgb2YgZGFydDogbGlicmFyaWVzLgogICAgICByZXR1cm4gbWFpblVyaS5wYXRoLmNvbnRhaW5zKCd0ZXN0cy9jb21waWxlci9kYXJ0MmpzX25hdGl2ZScpIHx8CiAgICAgICAgICBtYWluVXJpLnBhdGguY29udGFpbnMoJ3Rlc3RzL2NvbXBpbGVyL2RhcnQyanNfZXh0cmEnKTsKICAgIH0KCiAgICBEYXJ0VHlwZSBsb29rdXAoU3RyaW5nIHR5cGVOYW1lLCB7Ym9vbCByZXF1aXJlZH0pIHsKICAgICAgRGFydFR5cGUgZmluZEluTGlicmFyeShMaWJyYXJ5RW50aXR5IGxpYnJhcnkpIHsKICAgICAgICBpZiAobGlicmFyeSAhPSBudWxsKSB7CiAgICAgICAgICBDbGFzc0VudGl0eSBjbHMgPSBlbGVtZW50RW52aXJvbm1lbnQubG9va3VwQ2xhc3MobGlicmFyeSwgdHlwZU5hbWUpOwogICAgICAgICAgaWYgKGNscyAhPSBudWxsKSB7CiAgICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEFsaWduIHNlbWFudGljcy4KICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVBc1JhdwogICAgICAgICAgICAgICAgPyBlbGVtZW50RW52aXJvbm1lbnQuZ2V0UmF3VHlwZShjbHMpCiAgICAgICAgICAgICAgICA6IGVsZW1lbnRFbnZpcm9ubWVudC5nZXRUaGlzVHlwZShjbHMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQoKICAgICAgRGFydFR5cGUgZmluZEluKFVyaSB1cmkpIHsKICAgICAgICByZXR1cm4gZmluZEluTGlicmFyeShlbGVtZW50RW52aXJvbm1lbnQubG9va3VwTGlicmFyeSh1cmkpKTsKICAgICAgfQoKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTmFycm93IHRoZSBzZXQgb2YgbG9va3VwcyBiYXNlZCBvbiB0aGUgZGVwZW5kaW5nCiAgICAgIC8vIGxpYnJhcnkuCiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENhY2hlIG1vcmUgcmVzdWx0cyB0byBhdm9pZCByZWR1bmRhbnQgbG9va3Vwcz8KICAgICAgRGFydFR5cGUgdHlwZTsKICAgICAgaWYgKGNhY2hlZE1heUxvb2t1cEluTWFpbiA/Pz0gbWF5TG9va3VwSW5NYWluKCkpIHsKICAgICAgICB0eXBlID8/PSBmaW5kSW5MaWJyYXJ5KGVsZW1lbnRFbnZpcm9ubWVudC5tYWluTGlicmFyeSk7CiAgICAgIH0KICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF9jb3JlKTsKICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF9fanNfaGVscGVyKTsKICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF9faW50ZXJjZXB0b3JzKTsKICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF9fbmF0aXZlX3R5cGVkX2RhdGEpOwogICAgICB0eXBlID8/PSBmaW5kSW4oVXJpcy5kYXJ0X2NvbGxlY3Rpb24pOwogICAgICB0eXBlID8/PSBmaW5kSW4oVXJpcy5kYXJ0X21hdGgpOwogICAgICB0eXBlID8/PSBmaW5kSW4oVXJpcy5kYXJ0X2h0bWwpOwogICAgICB0eXBlID8/PSBmaW5kSW4oVXJpcy5kYXJ0X2h0bWxfY29tbW9uKTsKICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF9zdmcpOwogICAgICB0eXBlID8/PSBmaW5kSW4oVXJpcy5kYXJ0X3dlYl9hdWRpbyk7CiAgICAgIHR5cGUgPz89IGZpbmRJbihVcmlzLmRhcnRfd2ViX2dsKTsKICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF93ZWJfc3FsKTsKICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF9pbmRleGVkX2RiKTsKICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF90eXBlZF9kYXRhKTsKICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF9taXJyb3JzKTsKICAgICAgaWYgKHR5cGUgPT0gbnVsbCAmJiByZXF1aXJlZCkgewogICAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZShDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICAgICBNZXNzYWdlS2luZC5HRU5FUklDLCB7J3RleHQnOiAiVHlwZSAnJHR5cGVOYW1lJyBub3QgZm91bmQuIn0pOwogICAgICB9CiAgICAgIHJldHVybiB0eXBlOwogICAgfQoKICAgIHJldHVybiBsb29rdXA7CiAgfQoKICBTdHJpbmcgX2dldFN0cmluZ0FyZ3VtZW50KGlyLlN0YXRpY0ludm9jYXRpb24gbm9kZSwgaW50IGluZGV4KSB7CiAgICByZXR1cm4gbm9kZS5hcmd1bWVudHMucG9zaXRpb25hbFtpbmRleF0uYWNjZXB0KG5ldyBTdHJpbmdpZmllcigpKTsKICB9CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENhY2hlIHRoaXMgZm9yIGxhdGVyIHVzZS4KICBAb3ZlcnJpZGUKICBOYXRpdmVCZWhhdmlvciBnZXROYXRpdmVCZWhhdmlvckZvckpzQ2FsbChpci5TdGF0aWNJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGlmIChub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA8IDIgfHwKICAgICAgICBub2RlLmFyZ3VtZW50cy5uYW1lZC5pc05vdEVtcHR5KSB7CiAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsIE1lc3NhZ2VLaW5kLldST05HX0FSR1VNRU5UX0ZPUl9KUyk7CiAgICAgIHJldHVybiBuZXcgTmF0aXZlQmVoYXZpb3IoKTsKICAgIH0KICAgIFN0cmluZyBzcGVjU3RyaW5nID0gX2dldFN0cmluZ0FyZ3VtZW50KG5vZGUsIDApOwogICAgaWYgKHNwZWNTdHJpbmcgPT0gbnVsbCkgewogICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICBDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLCBNZXNzYWdlS2luZC5XUk9OR19BUkdVTUVOVF9GT1JfSlNfRklSU1QpOwogICAgICByZXR1cm4gbmV3IE5hdGl2ZUJlaGF2aW9yKCk7CiAgICB9CgogICAgU3RyaW5nIGNvZGVTdHJpbmcgPSBfZ2V0U3RyaW5nQXJndW1lbnQobm9kZSwgMSk7CiAgICBpZiAoY29kZVN0cmluZyA9PSBudWxsKSB7CiAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsIE1lc3NhZ2VLaW5kLldST05HX0FSR1VNRU5UX0ZPUl9KU19TRUNPTkQpOwogICAgICByZXR1cm4gbmV3IE5hdGl2ZUJlaGF2aW9yKCk7CiAgICB9CgogICAgcmV0dXJuIE5hdGl2ZUJlaGF2aW9yLm9mSnNDYWxsKAogICAgICAgIHNwZWNTdHJpbmcsCiAgICAgICAgY29kZVN0cmluZywKICAgICAgICB0eXBlTG9va3VwKHJlc29sdmVBc1JhdzogdHJ1ZSksCiAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICByZXBvcnRlciwKICAgICAgICBjb21tb25FbGVtZW50cyk7CiAgfQoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDYWNoZSB0aGlzIGZvciBsYXRlciB1c2UuCiAgQG92ZXJyaWRlCiAgTmF0aXZlQmVoYXZpb3IgZ2V0TmF0aXZlQmVoYXZpb3JGb3JKc0J1aWx0aW5DYWxsKGlyLlN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgaWYgKG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoIDwgMSkgewogICAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKAogICAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwgIkpTIGJ1aWx0aW4gZXhwcmVzc2lvbiBoYXMgbm8gdHlwZS4iKTsKICAgICAgcmV0dXJuIG5ldyBOYXRpdmVCZWhhdmlvcigpOwogICAgfQogICAgaWYgKG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoIDwgMikgewogICAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKAogICAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwgIkpTIGJ1aWx0aW4gaXMgbWlzc2luZyBuYW1lLiIpOwogICAgICByZXR1cm4gbmV3IE5hdGl2ZUJlaGF2aW9yKCk7CiAgICB9CiAgICBTdHJpbmcgc3BlY1N0cmluZyA9IF9nZXRTdHJpbmdBcmd1bWVudChub2RlLCAwKTsKICAgIGlmIChzcGVjU3RyaW5nID09IG51bGwpIHsKICAgICAgcmVwb3J0ZXIuaW50ZXJuYWxFcnJvcigKICAgICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsICJVbmV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50LiIpOwogICAgICByZXR1cm4gbmV3IE5hdGl2ZUJlaGF2aW9yKCk7CiAgICB9CiAgICByZXR1cm4gTmF0aXZlQmVoYXZpb3Iub2ZKc0J1aWx0aW5DYWxsKAogICAgICAgIHNwZWNTdHJpbmcsCiAgICAgICAgdHlwZUxvb2t1cChyZXNvbHZlQXNSYXc6IHRydWUpLAogICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgcmVwb3J0ZXIsCiAgICAgICAgY29tbW9uRWxlbWVudHMpOwogIH0KCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ2FjaGUgdGhpcyBmb3IgbGF0ZXIgdXNlLgogIEBvdmVycmlkZQogIE5hdGl2ZUJlaGF2aW9yIGdldE5hdGl2ZUJlaGF2aW9yRm9ySnNFbWJlZGRlZEdsb2JhbENhbGwoCiAgICAgIGlyLlN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgaWYgKG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoIDwgMSkgewogICAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgICAiSlMgZW1iZWRkZWQgZ2xvYmFsIGV4cHJlc3Npb24gaGFzIG5vIHR5cGUuIik7CiAgICAgIHJldHVybiBuZXcgTmF0aXZlQmVoYXZpb3IoKTsKICAgIH0KICAgIGlmIChub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA8IDIpIHsKICAgICAgcmVwb3J0ZXIuaW50ZXJuYWxFcnJvcigKICAgICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsICJKUyBlbWJlZGRlZCBnbG9iYWwgaXMgbWlzc2luZyBuYW1lLiIpOwogICAgICByZXR1cm4gbmV3IE5hdGl2ZUJlaGF2aW9yKCk7CiAgICB9CiAgICBpZiAobm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGggPiAyIHx8CiAgICAgICAgbm9kZS5hcmd1bWVudHMubmFtZWQuaXNOb3RFbXB0eSkgewogICAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgICAiSlMgZW1iZWRkZWQgZ2xvYmFsIGhhcyBtb3JlIHRoYW4gMiBhcmd1bWVudHMuIik7CiAgICAgIHJldHVybiBuZXcgTmF0aXZlQmVoYXZpb3IoKTsKICAgIH0KICAgIFN0cmluZyBzcGVjU3RyaW5nID0gX2dldFN0cmluZ0FyZ3VtZW50KG5vZGUsIDApOwogICAgaWYgKHNwZWNTdHJpbmcgPT0gbnVsbCkgewogICAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKAogICAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwgIlVuZXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQuIik7CiAgICAgIHJldHVybiBuZXcgTmF0aXZlQmVoYXZpb3IoKTsKICAgIH0KICAgIHJldHVybiBOYXRpdmVCZWhhdmlvci5vZkpzRW1iZWRkZWRHbG9iYWxDYWxsKAogICAgICAgIHNwZWNTdHJpbmcsCiAgICAgICAgdHlwZUxvb2t1cChyZXNvbHZlQXNSYXc6IHRydWUpLAogICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgcmVwb3J0ZXIsCiAgICAgICAgY29tbW9uRWxlbWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAganMuTmFtZSBnZXROYW1lRm9ySnNHZXROYW1lKENvbnN0YW50VmFsdWUgY29uc3RhbnQsIE5hbWVyIG5hbWVyKSB7CiAgICBpbnQgaW5kZXggPSBleHRyYWN0RW51bUluZGV4RnJvbUNvbnN0YW50VmFsdWUoCiAgICAgICAgY29uc3RhbnQsIGNvbW1vbkVsZW1lbnRzLmpzR2V0TmFtZUVudW0pOwogICAgaWYgKGluZGV4ID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIG5hbWVyLmdldE5hbWVGb3JKc0dldE5hbWUoCiAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwgSnNHZXROYW1lLnZhbHVlc1tpbmRleF0pOwogIH0KCiAgaW50IGV4dHJhY3RFbnVtSW5kZXhGcm9tQ29uc3RhbnRWYWx1ZSgKICAgICAgQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgQ2xhc3NFbnRpdHkgY2xhc3NFbGVtZW50KSB7CiAgICBpZiAoY29uc3RhbnQgaXMgQ29uc3RydWN0ZWRDb25zdGFudFZhbHVlKSB7CiAgICAgIGlmIChjb25zdGFudC50eXBlLmVsZW1lbnQgPT0gY2xhc3NFbGVtZW50KSB7CiAgICAgICAgYXNzZXJ0KGNvbnN0YW50LmZpZWxkcy5sZW5ndGggPT0gMSB8fCBjb25zdGFudC5maWVsZHMubGVuZ3RoID09IDIpOwogICAgICAgIENvbnN0YW50VmFsdWUgaW5kZXhDb25zdGFudCA9IGNvbnN0YW50LmZpZWxkcy52YWx1ZXMuZmlyc3Q7CiAgICAgICAgaWYgKGluZGV4Q29uc3RhbnQgaXMgSW50Q29uc3RhbnRWYWx1ZSkgewogICAgICAgICAgcmV0dXJuIGluZGV4Q29uc3RhbnQuaW50VmFsdWUudG9JbnQoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBnZXRDb25zdGFudFZhbHVlKGlyLkV4cHJlc3Npb24gbm9kZSwKICAgICAge2Jvb2wgcmVxdWlyZUNvbnN0YW50OiB0cnVlLAogICAgICBib29sIGltcGxpY2l0TnVsbDogZmFsc2UsCiAgICAgIGJvb2wgY2hlY2tDYXN0czogdHJ1ZX0pIHsKICAgIGlmIChub2RlIGlzIGlyLkNvbnN0YW50RXhwcmVzc2lvbikgewogICAgICBpci5Db25zdGFudCBjb25zdGFudCA9CiAgICAgICAgICBjb25zdGFudEV2YWx1YXRvci5ldmFsdWF0ZShub2RlLCByZXF1aXJlQ29uc3RhbnQ6IHJlcXVpcmVDb25zdGFudCk7CiAgICAgIGlmIChjb25zdGFudCA9PSBudWxsKSB7CiAgICAgICAgaWYgKHJlcXVpcmVDb25zdGFudCkgewogICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAgICAgJ05vIGNvbnN0YW50IGZvciAke0RlYnVnUHJpbnRlci5wcmV0dHlQcmludChub2RlKX0nKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGNvbnN0YW50LmFjY2VwdChfY29uc3RhbnRWYWx1ZWZpZXIpOwogICAgICB9CiAgICB9CgogICAgQ29uc3RhbnRFeHByZXNzaW9uIGNvbnN0YW50OwogICAgaWYgKG5vZGUgPT0gbnVsbCkgewogICAgICBpZiAoIWltcGxpY2l0TnVsbCkgewogICAgICAgIHRocm93IGZhaWxlZEF0KAogICAgICAgICAgICBDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLCAnTm8gZXhwcmVzc2lvbiBmb3IgY29uc3RhbnQuJyk7CiAgICAgIH0KICAgICAgY29uc3RhbnQgPSBuZXcgTnVsbENvbnN0YW50RXhwcmVzc2lvbigpOwogICAgfSBlbHNlIHsKICAgICAgY29uc3RhbnQgPQogICAgICAgICAgbmV3IENvbnN0YW50aWZpZXIodGhpcywgcmVxdWlyZUNvbnN0YW50OiByZXF1aXJlQ29uc3RhbnQpLnZpc2l0KG5vZGUpOwogICAgfQogICAgaWYgKGNvbnN0YW50ID09IG51bGwpIHsKICAgICAgaWYgKHJlcXVpcmVDb25zdGFudCkgewogICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICAgICAnTm8gY29uc3RhbnQgZm9yICR7RGVidWdQcmludGVyLnByZXR0eVByaW50KG5vZGUpfScpOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgQ29uc3RhbnRWYWx1ZSB2YWx1ZSA9IGNvbXB1dGVDb25zdGFudFZhbHVlKAogICAgICAgIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKG5vZGUpLCBjb25zdGFudCwKICAgICAgICByZXF1aXJlQ29uc3RhbnQ6IHJlcXVpcmVDb25zdGFudCwgY2hlY2tDYXN0czogY2hlY2tDYXN0cyk7CiAgICBpZiAoIXZhbHVlLmlzQ29uc3RhbnQgJiYgIXJlcXVpcmVDb25zdGFudCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CgogIC8vLyBDb252ZXJ0cyBbYW5ub3RhdGlvbnNdIGludG8gYSBsaXN0IG9mIFtDb25zdGFudFZhbHVlXXMuCiAgTGlzdDxDb25zdGFudFZhbHVlPiBnZXRNZXRhZGF0YShMaXN0PGlyLkV4cHJlc3Npb24+IGFubm90YXRpb25zKSB7CiAgICBpZiAoYW5ub3RhdGlvbnMuaXNFbXB0eSkgcmV0dXJuIGNvbnN0IDxDb25zdGFudFZhbHVlPltdOwogICAgTGlzdDxDb25zdGFudFZhbHVlPiBtZXRhZGF0YSA9IDxDb25zdGFudFZhbHVlPltdOwogICAgYW5ub3RhdGlvbnMuZm9yRWFjaCgoaXIuRXhwcmVzc2lvbiBub2RlKSB7CiAgICAgIC8vIFdlIHNraXAgdGhlIGltcGxpY2l0IGNhc3QgY2hlY2tzIGZvciBtZXRhZGF0YSB0byBhdm9pZCBjaXJjdWxhcgogICAgICAvLyBkZXBlbmRlbmNpZXMgaW4gdGhlIGpzLWludGVyb3AgY2xhc3MgcmVnaXN0cmF0aW9uLgogICAgICBtZXRhZGF0YS5hZGQoZ2V0Q29uc3RhbnRWYWx1ZShub2RlLCBjaGVja0Nhc3RzOiBmYWxzZSkpOwogICAgfSk7CiAgICByZXR1cm4gbWV0YWRhdGE7CiAgfQoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXRTdXBlck5vU3VjaE1ldGhvZChDbGFzc0VudGl0eSBjbHMpIHsKICAgIHdoaWxlIChjbHMgIT0gbnVsbCkgewogICAgICBjbHMgPSBlbGVtZW50RW52aXJvbm1lbnQuZ2V0U3VwZXJDbGFzcyhjbHMpOwogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0gZWxlbWVudEVudmlyb25tZW50Lmxvb2t1cExvY2FsQ2xhc3NNZW1iZXIoCiAgICAgICAgICBjbHMsIElkZW50aWZpZXJzLm5vU3VjaE1ldGhvZF8pOwogICAgICBpZiAobWVtYmVyICE9IG51bGwgJiYgIW1lbWJlci5pc0Fic3RyYWN0KSB7CiAgICAgICAgaWYgKG1lbWJlci5pc0Z1bmN0aW9uKSB7CiAgICAgICAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiA9IG1lbWJlcjsKICAgICAgICAgIGlmIChmdW5jdGlvbi5wYXJhbWV0ZXJTdHJ1Y3R1cmUucG9zaXRpb25hbFBhcmFtZXRlcnMgPj0gMSkgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb247CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIElmIFttZW1iZXJdIGlzIG5vdCBhIHZhbGlkIGBub1N1Y2hNZXRob2RgIHRoZSB0YXJnZXQgaXMKICAgICAgICAvLyBgT2JqZWN0LnN1cGVyTm9TdWNoTWV0aG9kYC4KICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24gPSBlbGVtZW50RW52aXJvbm1lbnQubG9va3VwTG9jYWxDbGFzc01lbWJlcigKICAgICAgICBjb21tb25FbGVtZW50cy5vYmplY3RDbGFzcywgSWRlbnRpZmllcnMubm9TdWNoTWV0aG9kXyk7CiAgICBhc3NlcnQoZnVuY3Rpb24gIT0gbnVsbCwKICAgICAgICBmYWlsZWRBdChjbHMsICJObyBzdXBlciBub1N1Y2hNZXRob2QgZm91bmQgZm9yIGNsYXNzICRjbHMuIikpOwogICAgcmV0dXJuIGZ1bmN0aW9uOwogIH0KCiAgSXRlcmFibGU8TGlicmFyeUVudGl0eT4gZ2V0IGxpYnJhcnlMaXN0SW50ZXJuYWwgewogICAgaWYgKGVudi5sZW5ndGggIT0gbGlicmFyeU1hcC5sZW5ndGgpIHsKICAgICAgLy8gQ3JlYXRlIGEgW0tMaWJyYXJ5XSBmb3IgZWFjaCBsaWJyYXJ5LgogICAgICBlbnYuZm9yRWFjaExpYnJhcnkoKEtMaWJyYXJ5RW52IGVudikgewogICAgICAgIGdldExpYnJhcnlJbnRlcm5hbChlbnYubGlicmFyeSwgZW52KTsKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gbGlicmFyeU1hcC52YWx1ZXM7CiAgfQoKICBMaWJyYXJ5RW50aXR5IGdldExpYnJhcnlJbnRlcm5hbChpci5MaWJyYXJ5IG5vZGUsIFtLTGlicmFyeUVudiBsaWJyYXJ5RW52XSkgewogICAgcmV0dXJuIGxpYnJhcnlNYXBbbm9kZV0gPz89IF9nZXRMaWJyYXJ5Q3JlYXRlKG5vZGUsIGxpYnJhcnlFbnYpOwogIH0KCiAgTGlicmFyeUVudGl0eSBfZ2V0TGlicmFyeUNyZWF0ZShpci5MaWJyYXJ5IG5vZGUsIEtMaWJyYXJ5RW52IGxpYnJhcnlFbnYpIHsKICAgIGFzc2VydCgKICAgICAgICAhZW52SXNDbG9zZWQsCiAgICAgICAgIkVudmlyb25tZW50IG9mICR0aGlzIGlzIGNsb3NlZC4gVHJ5aW5nIHRvIGNyZWF0ZSAiCiAgICAgICAgImxpYnJhcnkgZm9yICRub2RlLiIpOwogICAgVXJpIGNhbm9uaWNhbFVyaSA9IG5vZGUuaW1wb3J0VXJpOwogICAgU3RyaW5nIG5hbWUgPSBub2RlLm5hbWU7CiAgICBpZiAobmFtZSA9PSBudWxsKSB7CiAgICAgIC8vIFVzZSB0aGUgZmlsZSBuYW1lIGFzIHNjcmlwdCBuYW1lLgogICAgICBTdHJpbmcgcGF0aCA9IGNhbm9uaWNhbFVyaS5wYXRoOwogICAgICBuYW1lID0gcGF0aC5zdWJzdHJpbmcocGF0aC5sYXN0SW5kZXhPZignLycpICsgMSk7CiAgICB9CiAgICBJbmRleGVkTGlicmFyeSBsaWJyYXJ5ID0gY3JlYXRlTGlicmFyeShuYW1lLCBjYW5vbmljYWxVcmkpOwogICAgcmV0dXJuIGxpYnJhcmllcy5yZWdpc3RlcihsaWJyYXJ5LCBuZXcgS0xpYnJhcnlEYXRhKG5vZGUpLAogICAgICAgIGxpYnJhcnlFbnYgPz8gZW52Lmxvb2t1cExpYnJhcnkoY2Fub25pY2FsVXJpKSk7CiAgfQoKICBDbGFzc0VudGl0eSBnZXRDbGFzc0ludGVybmFsKGlyLkNsYXNzIG5vZGUsIFtLQ2xhc3NFbnYgY2xhc3NFbnZdKSB7CiAgICByZXR1cm4gY2xhc3NNYXBbbm9kZV0gPz89IF9nZXRDbGFzc0NyZWF0ZShub2RlLCBjbGFzc0Vudik7CiAgfQoKICBDbGFzc0VudGl0eSBfZ2V0Q2xhc3NDcmVhdGUoaXIuQ2xhc3Mgbm9kZSwgS0NsYXNzRW52IGNsYXNzRW52KSB7CiAgICBhc3NlcnQoCiAgICAgICAgIWVudklzQ2xvc2VkLAogICAgICAgICJFbnZpcm9ubWVudCBvZiAkdGhpcyBpcyBjbG9zZWQuIFRyeWluZyB0byBjcmVhdGUgIgogICAgICAgICJjbGFzcyBmb3IgJG5vZGUuIik7CiAgICBLTGlicmFyeSBsaWJyYXJ5ID0gZ2V0TGlicmFyeUludGVybmFsKG5vZGUuZW5jbG9zaW5nTGlicmFyeSk7CiAgICBpZiAoY2xhc3NFbnYgPT0gbnVsbCkgewogICAgICBjbGFzc0VudiA9IGxpYnJhcmllcy5nZXRFbnYobGlicmFyeSkubG9va3VwQ2xhc3Mobm9kZS5uYW1lKTsKICAgIH0KICAgIEluZGV4ZWRDbGFzcyBjbHMgPQogICAgICAgIGNyZWF0ZUNsYXNzKGxpYnJhcnksIG5vZGUubmFtZSwgaXNBYnN0cmFjdDogbm9kZS5pc0Fic3RyYWN0KTsKICAgIHJldHVybiBjbGFzc2VzLnJlZ2lzdGVyKGNscywgbmV3IEtDbGFzc0RhdGFJbXBsKG5vZGUpLCBjbGFzc0Vudik7CiAgfQoKICBUeXBlZGVmRW50aXR5IGdldFR5cGVkZWZJbnRlcm5hbChpci5UeXBlZGVmIG5vZGUpIHsKICAgIHJldHVybiB0eXBlZGVmTWFwW25vZGVdID8/PSBfZ2V0VHlwZWRlZkNyZWF0ZShub2RlKTsKICB9CgogIFR5cGVkZWZFbnRpdHkgX2dldFR5cGVkZWZDcmVhdGUoaXIuVHlwZWRlZiBub2RlKSB7CiAgICBhc3NlcnQoCiAgICAgICAgIWVudklzQ2xvc2VkLAogICAgICAgICJFbnZpcm9ubWVudCBvZiAkdGhpcyBpcyBjbG9zZWQuIFRyeWluZyB0byBjcmVhdGUgIgogICAgICAgICJ0eXBlZGVmIGZvciAkbm9kZS4iKTsKICAgIEluZGV4ZWRMaWJyYXJ5IGxpYnJhcnkgPSBnZXRMaWJyYXJ5SW50ZXJuYWwobm9kZS5lbmNsb3NpbmdMaWJyYXJ5KTsKICAgIEluZGV4ZWRUeXBlZGVmIHR5cGVkZWYgPSBjcmVhdGVUeXBlZGVmKGxpYnJhcnksIG5vZGUubmFtZSk7CiAgICBUeXBlZGVmVHlwZSB0eXBlZGVmVHlwZSA9IG5ldyBUeXBlZGVmVHlwZSgKICAgICAgICB0eXBlZGVmLAogICAgICAgIG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQoCiAgICAgICAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoLCBjb25zdCBEeW5hbWljVHlwZSgpKSwKICAgICAgICBnZXREYXJ0VHlwZShub2RlLnR5cGUpKTsKICAgIHJldHVybiB0eXBlZGVmcy5yZWdpc3RlcigKICAgICAgICB0eXBlZGVmLCBuZXcgS1R5cGVkZWZEYXRhKG5vZGUsIHR5cGVkZWYsIHR5cGVkZWZUeXBlKSk7CiAgfQoKICBUeXBlVmFyaWFibGVFbnRpdHkgZ2V0VHlwZVZhcmlhYmxlSW50ZXJuYWwoaXIuVHlwZVBhcmFtZXRlciBub2RlKSB7CiAgICByZXR1cm4gdHlwZVZhcmlhYmxlTWFwW25vZGVdID8/PSBfZ2V0VHlwZVZhcmlhYmxlQ3JlYXRlKG5vZGUpOwogIH0KCiAgVHlwZVZhcmlhYmxlRW50aXR5IF9nZXRUeXBlVmFyaWFibGVDcmVhdGUoaXIuVHlwZVBhcmFtZXRlciBub2RlKSB7CiAgICBhc3NlcnQoCiAgICAgICAgIWVudklzQ2xvc2VkLAogICAgICAgICJFbnZpcm9ubWVudCBvZiAkdGhpcyBpcyBjbG9zZWQuIFRyeWluZyB0byBjcmVhdGUgIgogICAgICAgICJ0eXBlIHZhcmlhYmxlIGZvciAkbm9kZS4iKTsKICAgIGlmIChub2RlLnBhcmVudCBpcyBpci5DbGFzcykgewogICAgICBpci5DbGFzcyBjbHMgPSBub2RlLnBhcmVudDsKICAgICAgaW50IGluZGV4ID0gY2xzLnR5cGVQYXJhbWV0ZXJzLmluZGV4T2Yobm9kZSk7CiAgICAgIHJldHVybiB0eXBlVmFyaWFibGVzLnJlZ2lzdGVyKAogICAgICAgICAgY3JlYXRlVHlwZVZhcmlhYmxlKGdldENsYXNzSW50ZXJuYWwoY2xzKSwgbm9kZS5uYW1lLCBpbmRleCksCiAgICAgICAgICBuZXcgS1R5cGVWYXJpYWJsZURhdGEobm9kZSkpOwogICAgfQogICAgaWYgKG5vZGUucGFyZW50IGlzIGlyLkZ1bmN0aW9uTm9kZSkgewogICAgICBpci5GdW5jdGlvbk5vZGUgZnVuYyA9IG5vZGUucGFyZW50OwogICAgICBpbnQgaW5kZXggPSBmdW5jLnR5cGVQYXJhbWV0ZXJzLmluZGV4T2Yobm9kZSk7CiAgICAgIGlmIChmdW5jLnBhcmVudCBpcyBpci5Db25zdHJ1Y3RvcikgewogICAgICAgIGlyLkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gZnVuYy5wYXJlbnQ7CiAgICAgICAgaXIuQ2xhc3MgY2xzID0gY29uc3RydWN0b3IuZW5jbG9zaW5nQ2xhc3M7CiAgICAgICAgcmV0dXJuIGdldFR5cGVWYXJpYWJsZUludGVybmFsKGNscy50eXBlUGFyYW1ldGVyc1tpbmRleF0pOwogICAgICB9IGVsc2UgaWYgKGZ1bmMucGFyZW50IGlzIGlyLlByb2NlZHVyZSkgewogICAgICAgIGlyLlByb2NlZHVyZSBwcm9jZWR1cmUgPSBmdW5jLnBhcmVudDsKICAgICAgICBpZiAocHJvY2VkdXJlLmtpbmQgPT0gaXIuUHJvY2VkdXJlS2luZC5GYWN0b3J5KSB7CiAgICAgICAgICBpci5DbGFzcyBjbHMgPSBwcm9jZWR1cmUuZW5jbG9zaW5nQ2xhc3M7CiAgICAgICAgICByZXR1cm4gZ2V0VHlwZVZhcmlhYmxlSW50ZXJuYWwoY2xzLnR5cGVQYXJhbWV0ZXJzW2luZGV4XSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiB0eXBlVmFyaWFibGVzLnJlZ2lzdGVyKAogICAgICAgICAgICAgIGNyZWF0ZVR5cGVWYXJpYWJsZSgKICAgICAgICAgICAgICAgICAgZ2V0TWV0aG9kSW50ZXJuYWwocHJvY2VkdXJlKSwgbm9kZS5uYW1lLCBpbmRleCksCiAgICAgICAgICAgICAgbmV3IEtUeXBlVmFyaWFibGVEYXRhKG5vZGUpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZnVuYy5wYXJlbnQgaXMgaXIuRnVuY3Rpb25EZWNsYXJhdGlvbiB8fAogICAgICAgICAgZnVuYy5wYXJlbnQgaXMgaXIuRnVuY3Rpb25FeHByZXNzaW9uKSB7CiAgICAgICAgLy8gRW5zdXJlIHRoYXQgbG9jYWwgZnVuY3Rpb24gdHlwZSB2YXJpYWJsZXMgaGF2ZSBiZWVuIGNyZWF0ZWQuCiAgICAgICAgZ2V0TG9jYWxGdW5jdGlvbihmdW5jLnBhcmVudCk7CiAgICAgICAgcmV0dXJuIHR5cGVWYXJpYWJsZU1hcFtub2RlXTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignVW5zdXBwb3J0ZWQgZnVuY3Rpb24gdHlwZSBwYXJhbWV0ZXIgcGFyZW50ICcKICAgICAgICAgICAgJ25vZGUgJHtmdW5jLnBhcmVudH0uJyk7CiAgICAgIH0KICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdVbnN1cHBvcnRlZCB0eXBlIHBhcmFtZXRlciB0eXBlIG5vZGUgJG5vZGUuJyk7CiAgfQoKICBDb25zdHJ1Y3RvckVudGl0eSBnZXRDb25zdHJ1Y3RvckludGVybmFsKGlyLk1lbWJlciBub2RlKSB7CiAgICByZXR1cm4gY29uc3RydWN0b3JNYXBbbm9kZV0gPz89IF9nZXRDb25zdHJ1Y3RvckNyZWF0ZShub2RlKTsKICB9CgogIENvbnN0cnVjdG9yRW50aXR5IF9nZXRDb25zdHJ1Y3RvckNyZWF0ZShpci5NZW1iZXIgbm9kZSkgewogICAgYXNzZXJ0KAogICAgICAgICFlbnZJc0Nsb3NlZCwKICAgICAgICAiRW52aXJvbm1lbnQgb2YgJHRoaXMgaXMgY2xvc2VkLiBUcnlpbmcgdG8gY3JlYXRlICIKICAgICAgICAiY29uc3RydWN0b3IgZm9yICRub2RlLiIpOwogICAgaXIuRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uTm9kZTsKICAgIENsYXNzRW50aXR5IGVuY2xvc2luZ0NsYXNzID0gZ2V0Q2xhc3NJbnRlcm5hbChub2RlLmVuY2xvc2luZ0NsYXNzKTsKICAgIE5hbWUgbmFtZSA9IGdldE5hbWUobm9kZS5uYW1lKTsKICAgIGJvb2wgaXNFeHRlcm5hbCA9IG5vZGUuaXNFeHRlcm5hbDsKCiAgICBJbmRleGVkQ29uc3RydWN0b3IgY29uc3RydWN0b3I7CiAgICBpZiAobm9kZSBpcyBpci5Db25zdHJ1Y3RvcikgewogICAgICBmdW5jdGlvbk5vZGUgPSBub2RlLmZ1bmN0aW9uOwogICAgICBjb25zdHJ1Y3RvciA9IGNyZWF0ZUdlbmVyYXRpdmVDb25zdHJ1Y3RvcihlbmNsb3NpbmdDbGFzcywgbmFtZSwKICAgICAgICAgIGdldFBhcmFtZXRlclN0cnVjdHVyZShmdW5jdGlvbk5vZGUsIGluY2x1ZGVUeXBlUGFyYW1ldGVyczogZmFsc2UpLAogICAgICAgICAgaXNFeHRlcm5hbDogaXNFeHRlcm5hbCwgaXNDb25zdDogbm9kZS5pc0NvbnN0KTsKICAgIH0gZWxzZSBpZiAobm9kZSBpcyBpci5Qcm9jZWR1cmUpIHsKICAgICAgZnVuY3Rpb25Ob2RlID0gbm9kZS5mdW5jdGlvbjsKICAgICAgYm9vbCBpc0Zyb21FbnZpcm9ubWVudCA9IGlzRXh0ZXJuYWwgJiYKICAgICAgICAgIG5hbWUudGV4dCA9PSAnZnJvbUVudmlyb25tZW50JyAmJgogICAgICAgICAgY29uc3QgWydpbnQnLCAnYm9vbCcsICdTdHJpbmcnXS5jb250YWlucyhlbmNsb3NpbmdDbGFzcy5uYW1lKTsKICAgICAgY29uc3RydWN0b3IgPSBjcmVhdGVGYWN0b3J5Q29uc3RydWN0b3IoZW5jbG9zaW5nQ2xhc3MsIG5hbWUsCiAgICAgICAgICBnZXRQYXJhbWV0ZXJTdHJ1Y3R1cmUoZnVuY3Rpb25Ob2RlLCBpbmNsdWRlVHlwZVBhcmFtZXRlcnM6IGZhbHNlKSwKICAgICAgICAgIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwsCiAgICAgICAgICBpc0NvbnN0OiBub2RlLmlzQ29uc3QsCiAgICAgICAgICBpc0Zyb21FbnZpcm9ubWVudENvbnN0cnVjdG9yOiBpc0Zyb21FbnZpcm9ubWVudCk7CiAgICB9IGVsc2UgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDb252ZXJ0IGBub2RlLmxvY2F0aW9uYCB0byBhIFtTb3VyY2VTcGFuXS4KICAgICAgdGhyb3cgZmFpbGVkQXQoCiAgICAgICAgICBOT19MT0NBVElPTl9TUEFOTkFCTEUsICJVbmV4cGVjdGVkIGNvbnN0cnVjdG9yIG5vZGU6ICR7bm9kZX0uIik7CiAgICB9CiAgICByZXR1cm4gbWVtYmVycy5yZWdpc3RlcjxJbmRleGVkQ29uc3RydWN0b3IsIEtDb25zdHJ1Y3RvckRhdGE+KAogICAgICAgIGNvbnN0cnVjdG9yLCBuZXcgS0NvbnN0cnVjdG9yRGF0YUltcGwobm9kZSwgZnVuY3Rpb25Ob2RlKSk7CiAgfQoKICBGdW5jdGlvbkVudGl0eSBnZXRNZXRob2RJbnRlcm5hbChpci5Qcm9jZWR1cmUgbm9kZSkgewogICAgLy8gW19nZXRNZXRob2RDcmVhdGVdIGluc2VydHMgdGhlIGNyZWF0ZWQgZnVuY3Rpb24gaW4gW21ldGhvZE1hcF0gc28gd2UKICAgIC8vIGRvbid0IG5lZWQgdG8gdXNlID8/PSBoZXJlLgogICAgcmV0dXJuIG1ldGhvZE1hcFtub2RlXSA/PyBfZ2V0TWV0aG9kQ3JlYXRlKG5vZGUpOwogIH0KCiAgRnVuY3Rpb25FbnRpdHkgX2dldE1ldGhvZENyZWF0ZShpci5Qcm9jZWR1cmUgbm9kZSkgewogICAgYXNzZXJ0KAogICAgICAgICFlbnZJc0Nsb3NlZCwKICAgICAgICAiRW52aXJvbm1lbnQgb2YgJHRoaXMgaXMgY2xvc2VkLiBUcnlpbmcgdG8gY3JlYXRlICIKICAgICAgICAiZnVuY3Rpb24gZm9yICRub2RlLiIpOwogICAgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb247CiAgICBMaWJyYXJ5RW50aXR5IGxpYnJhcnk7CiAgICBDbGFzc0VudGl0eSBlbmNsb3NpbmdDbGFzczsKICAgIGlmIChub2RlLmVuY2xvc2luZ0NsYXNzICE9IG51bGwpIHsKICAgICAgZW5jbG9zaW5nQ2xhc3MgPSBnZXRDbGFzc0ludGVybmFsKG5vZGUuZW5jbG9zaW5nQ2xhc3MpOwogICAgICBsaWJyYXJ5ID0gZW5jbG9zaW5nQ2xhc3MubGlicmFyeTsKICAgIH0gZWxzZSB7CiAgICAgIGxpYnJhcnkgPSBnZXRMaWJyYXJ5SW50ZXJuYWwobm9kZS5lbmNsb3NpbmdMaWJyYXJ5KTsKICAgIH0KICAgIE5hbWUgbmFtZSA9IGdldE5hbWUobm9kZS5uYW1lKTsKICAgIGJvb2wgaXNTdGF0aWMgPSBub2RlLmlzU3RhdGljOwogICAgYm9vbCBpc0V4dGVybmFsID0gbm9kZS5pc0V4dGVybmFsOwogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIGAmJiAhbm9kZS5pc0V4dGVybmFsYCB3aGVuICMzMTIzMyBpcyBmaXhlZC4KICAgIGJvb2wgaXNBYnN0cmFjdCA9IG5vZGUuaXNBYnN0cmFjdCAmJiAhbm9kZS5pc0V4dGVybmFsOwogICAgQXN5bmNNYXJrZXIgYXN5bmNNYXJrZXIgPSBnZXRBc3luY01hcmtlcihub2RlLmZ1bmN0aW9uKTsKICAgIHN3aXRjaCAobm9kZS5raW5kKSB7CiAgICAgIGNhc2UgaXIuUHJvY2VkdXJlS2luZC5GYWN0b3J5OgogICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgY3JlYXRlIG1ldGhvZCBmcm9tIGZhY3RvcnkuIik7CiAgICAgIGNhc2UgaXIuUHJvY2VkdXJlS2luZC5HZXR0ZXI6CiAgICAgICAgZnVuY3Rpb24gPSBjcmVhdGVHZXR0ZXIobGlicmFyeSwgZW5jbG9zaW5nQ2xhc3MsIG5hbWUsIGFzeW5jTWFya2VyLAogICAgICAgICAgICBpc1N0YXRpYzogaXNTdGF0aWMsIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwsIGlzQWJzdHJhY3Q6IGlzQWJzdHJhY3QpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIGlyLlByb2NlZHVyZUtpbmQuTWV0aG9kOgogICAgICBjYXNlIGlyLlByb2NlZHVyZUtpbmQuT3BlcmF0b3I6CiAgICAgICAgZnVuY3Rpb24gPSBjcmVhdGVNZXRob2QobGlicmFyeSwgZW5jbG9zaW5nQ2xhc3MsIG5hbWUsCiAgICAgICAgICAgIGdldFBhcmFtZXRlclN0cnVjdHVyZShub2RlLmZ1bmN0aW9uKSwgYXN5bmNNYXJrZXIsCiAgICAgICAgICAgIGlzU3RhdGljOiBpc1N0YXRpYywgaXNFeHRlcm5hbDogaXNFeHRlcm5hbCwgaXNBYnN0cmFjdDogaXNBYnN0cmFjdCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgaXIuUHJvY2VkdXJlS2luZC5TZXR0ZXI6CiAgICAgICAgYXNzZXJ0KGFzeW5jTWFya2VyID09IEFzeW5jTWFya2VyLlNZTkMpOwogICAgICAgIGZ1bmN0aW9uID0gY3JlYXRlU2V0dGVyKGxpYnJhcnksIGVuY2xvc2luZ0NsYXNzLCBuYW1lLnNldHRlciwKICAgICAgICAgICAgaXNTdGF0aWM6IGlzU3RhdGljLCBpc0V4dGVybmFsOiBpc0V4dGVybmFsLCBpc0Fic3RyYWN0OiBpc0Fic3RyYWN0KTsKICAgICAgICBicmVhazsKICAgIH0KICAgIG1lbWJlcnMucmVnaXN0ZXI8SW5kZXhlZEZ1bmN0aW9uLCBLRnVuY3Rpb25EYXRhPigKICAgICAgICBmdW5jdGlvbiwgbmV3IEtGdW5jdGlvbkRhdGFJbXBsKG5vZGUsIG5vZGUuZnVuY3Rpb24pKTsKICAgIC8vIFdlIG5lZWQgdG8gcmVnaXN0ZXIgdGhlIGZ1bmN0aW9uIGJlZm9yZSBjcmVhdGluZyB0aGUgdHlwZSB2YXJpYWJsZXMuCiAgICBtZXRob2RNYXBbbm9kZV0gPSBmdW5jdGlvbjsKICAgIGZvciAoaXIuVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyIGluIG5vZGUuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMpIHsKICAgICAgZ2V0VHlwZVZhcmlhYmxlKHR5cGVQYXJhbWV0ZXIpOwogICAgfQogICAgcmV0dXJuIGZ1bmN0aW9uOwogIH0KCiAgRmllbGRFbnRpdHkgZ2V0RmllbGRJbnRlcm5hbChpci5GaWVsZCBub2RlKSB7CiAgICByZXR1cm4gZmllbGRNYXBbbm9kZV0gPz89IF9nZXRGaWVsZENyZWF0ZShub2RlKTsKICB9CgogIEZpZWxkRW50aXR5IF9nZXRGaWVsZENyZWF0ZShpci5GaWVsZCBub2RlKSB7CiAgICBhc3NlcnQoCiAgICAgICAgIWVudklzQ2xvc2VkLAogICAgICAgICJFbnZpcm9ubWVudCBvZiAkdGhpcyBpcyBjbG9zZWQuIFRyeWluZyB0byBjcmVhdGUgIgogICAgICAgICJmaWVsZCBmb3IgJG5vZGUuIik7CiAgICBMaWJyYXJ5RW50aXR5IGxpYnJhcnk7CiAgICBDbGFzc0VudGl0eSBlbmNsb3NpbmdDbGFzczsKICAgIGlmIChub2RlLmVuY2xvc2luZ0NsYXNzICE9IG51bGwpIHsKICAgICAgZW5jbG9zaW5nQ2xhc3MgPSBnZXRDbGFzc0ludGVybmFsKG5vZGUuZW5jbG9zaW5nQ2xhc3MpOwogICAgICBsaWJyYXJ5ID0gZW5jbG9zaW5nQ2xhc3MubGlicmFyeTsKICAgIH0gZWxzZSB7CiAgICAgIGxpYnJhcnkgPSBnZXRMaWJyYXJ5SW50ZXJuYWwobm9kZS5lbmNsb3NpbmdMaWJyYXJ5KTsKICAgIH0KICAgIE5hbWUgbmFtZSA9IGdldE5hbWUobm9kZS5uYW1lKTsKICAgIGJvb2wgaXNTdGF0aWMgPSBub2RlLmlzU3RhdGljOwogICAgSW5kZXhlZEZpZWxkIGZpZWxkID0gY3JlYXRlRmllbGQobGlicmFyeSwgZW5jbG9zaW5nQ2xhc3MsIG5hbWUsCiAgICAgICAgaXNTdGF0aWM6IGlzU3RhdGljLAogICAgICAgIGlzQXNzaWduYWJsZTogbm9kZS5pc011dGFibGUsCiAgICAgICAgaXNDb25zdDogbm9kZS5pc0NvbnN0KTsKICAgIHJldHVybiBtZW1iZXJzLnJlZ2lzdGVyPEluZGV4ZWRGaWVsZCwgS0ZpZWxkRGF0YT4oCiAgICAgICAgZmllbGQsIG5ldyBLRmllbGREYXRhSW1wbChub2RlKSk7CiAgfQoKICBib29sIGNoZWNrRmFtaWx5KEVudGl0eSBlbnRpdHkpIHsKICAgIGFzc2VydCgKICAgICAgICAnJGVudGl0eScuc3RhcnRzV2l0aChrRWxlbWVudFByZWZpeCksCiAgICAgICAgZmFpbGVkQXQoZW50aXR5LAogICAgICAgICAgICAiVW5leHBlY3RlZCBlbnRpdHkgJGVudGl0eSwgZXhwZWN0ZWQgZmFtaWx5ICRrRWxlbWVudFByZWZpeC4iKSk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8vLyBOYXRpdmVCYXNpY0RhdGEgaXMgbmVlZCBmb3IgY29tcHV0YXRpb24gb2YgdGhlIGRlZmF1bHQgc3VwZXIgY2xhc3MuCiAgQG92ZXJyaWRlCiAgTmF0aXZlQmFzaWNEYXRhIGdldCBuYXRpdmVCYXNpY0RhdGEgPT4gX2Zyb250ZW5kU3RyYXRlZ3kubmF0aXZlQmFzaWNEYXRhOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZENvbXBvbmVudChpci5Db21wb25lbnQgY29tcG9uZW50KSB7CiAgICBlbnYuYWRkQ29tcG9uZW50KGNvbXBvbmVudCk7CiAgfQoKICBCZWhhdmlvckJ1aWxkZXIgZ2V0IG5hdGl2ZUJlaGF2aW9yQnVpbGRlciA9PgogICAgICBfbmF0aXZlQmVoYXZpb3JCdWlsZGVyID8/PSBuZXcgS2VybmVsQmVoYXZpb3JCdWlsZGVyKGVsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgICAgIGNvbW1vbkVsZW1lbnRzLCBuYXRpdmVCYXNpY0RhdGEsIHJlcG9ydGVyLCBvcHRpb25zKTsKCiAgUmVzb2x1dGlvbkltcGFjdCBjb21wdXRlV29ybGRJbXBhY3QoS01lbWJlciBtZW1iZXIsCiAgICAgIFZhcmlhYmxlU2NvcGVNb2RlbCB2YXJpYWJsZVNjb3BlTW9kZWwsIFNldDxQcmFnbWFBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucywKICAgICAge0ltcGFjdEJ1aWxkZXJEYXRhIGltcGFjdEJ1aWxkZXJEYXRhfSkgewogICAgS01lbWJlckRhdGEgbWVtYmVyRGF0YSA9IG1lbWJlcnMuZ2V0RGF0YShtZW1iZXIpOwogICAgaXIuTWVtYmVyIG5vZGUgPSBtZW1iZXJEYXRhLm5vZGU7CgogICAgaWYgKGltcGFjdEJ1aWxkZXJEYXRhICE9IG51bGwpIHsKICAgICAgaWYgKGltcGFjdEJ1aWxkZXJEYXRhLnR5cGVNYXBzRm9yVGVzdGluZyAhPSBudWxsKSB7CiAgICAgICAgdHlwZU1hcHNGb3JUZXN0aW5nID8/PSB7fTsKICAgICAgICB0eXBlTWFwc0ZvclRlc3RpbmdbbWVtYmVyXSA9IGltcGFjdEJ1aWxkZXJEYXRhLnR5cGVNYXBzRm9yVGVzdGluZzsKICAgICAgfQogICAgICBJbXBhY3REYXRhIGltcGFjdERhdGEgPSBpbXBhY3RCdWlsZGVyRGF0YS5pbXBhY3REYXRhOwogICAgICBtZW1iZXJEYXRhLnN0YXRpY1R5cGVzID0gaW1wYWN0QnVpbGRlckRhdGEuY2FjaGVkU3RhdGljVHlwZXM7CiAgICAgIEtlcm5lbEltcGFjdENvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgS2VybmVsSW1wYWN0Q29udmVydGVyKAogICAgICAgICAgdGhpcywgbWVtYmVyLCByZXBvcnRlciwgb3B0aW9ucywgX2NvbnN0YW50VmFsdWVmaWVyKTsKICAgICAgcmV0dXJuIGNvbnZlcnRlci5jb252ZXJ0KGltcGFjdERhdGEpOwogICAgfSBlbHNlIHsKICAgICAgS2VybmVsSW1wYWN0QnVpbGRlciBidWlsZGVyID0gbmV3IEtlcm5lbEltcGFjdEJ1aWxkZXIoCiAgICAgICAgICB0aGlzLAogICAgICAgICAgbWVtYmVyLAogICAgICAgICAgcmVwb3J0ZXIsCiAgICAgICAgICBvcHRpb25zLAogICAgICAgICAgdmFyaWFibGVTY29wZU1vZGVsLAogICAgICAgICAgYW5ub3RhdGlvbnMsCiAgICAgICAgICBfY29uc3RhbnRWYWx1ZWZpZXIpOwogICAgICBpZiAocmV0YWluRGF0YUZvclRlc3RpbmcpIHsKICAgICAgICB0eXBlTWFwc0ZvclRlc3RpbmcgPz89IHt9OwogICAgICAgIHR5cGVNYXBzRm9yVGVzdGluZ1ttZW1iZXJdID0gYnVpbGRlci50eXBlTWFwc0ZvclRlc3RpbmcgPSB7fTsKICAgICAgfQogICAgICBub2RlLmFjY2VwdChidWlsZGVyKTsKICAgICAgbWVtYmVyRGF0YS5zdGF0aWNUeXBlcyA9IGJ1aWxkZXIuY2FjaGVkU3RhdGljVHlwZXM7CiAgICAgIHJldHVybiBidWlsZGVyLmltcGFjdEJ1aWxkZXI7CiAgICB9CiAgfQoKICBNYXA8aXIuRXhwcmVzc2lvbiwgaXIuRGFydFR5cGU+IGdldENhY2hlZFN0YXRpY1R5cGVzKEtNZW1iZXIgbWVtYmVyKSB7CiAgICBNYXA8aXIuRXhwcmVzc2lvbiwgaXIuRGFydFR5cGU+IHN0YXRpY1R5cGVzID0KICAgICAgICBtZW1iZXJzLmdldERhdGEobWVtYmVyKS5zdGF0aWNUeXBlczsKICAgIGFzc2VydChzdGF0aWNUeXBlcyAhPSBudWxsLCAiTm8gc3RhdGljIHR5cGVzIGNhY2hlZCBmb3IgJG1lbWJlci4iKTsKICAgIHJldHVybiBzdGF0aWNUeXBlczsKICB9CgogIE1hcDxpci5FeHByZXNzaW9uLCBUeXBlTWFwPiBnZXRUeXBlTWFwc0ZvclRlc3RpbmcoS01lbWJlciBtZW1iZXIpIHsKICAgIHJldHVybiB0eXBlTWFwc0ZvclRlc3RpbmdbbWVtYmVyXTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBrZXJuZWwgW2lyLlByb2NlZHVyZV0gbm9kZSBmb3IgdGhlIFttZXRob2RdLgogIGlyLlByb2NlZHVyZSBfbG9va3VwUHJvY2VkdXJlKEtGdW5jdGlvbiBtZXRob2QpIHsKICAgIHJldHVybiBtZW1iZXJzLmdldERhdGEobWV0aG9kKS5ub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuTGlicmFyeSBnZXRMaWJyYXJ5Tm9kZShMaWJyYXJ5RW50aXR5IGxpYnJhcnkpIHsKICAgIHJldHVybiBsaWJyYXJpZXMuZ2V0RGF0YShsaWJyYXJ5KS5saWJyYXJ5OwogIH0KCiAgQG92ZXJyaWRlCiAgTG9jYWwgZ2V0TG9jYWxGdW5jdGlvbihpci5UcmVlTm9kZSBub2RlKSB7CiAgICBhc3NlcnQoCiAgICAgICAgbm9kZSBpcyBpci5GdW5jdGlvbkRlY2xhcmF0aW9uIHx8IG5vZGUgaXMgaXIuRnVuY3Rpb25FeHByZXNzaW9uLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLCAnSW52YWxpZCBsb2NhbCBmdW5jdGlvbiBub2RlOiAkbm9kZScpKTsKICAgIEtMb2NhbEZ1bmN0aW9uIGxvY2FsRnVuY3Rpb24gPSBsb2NhbEZ1bmN0aW9uTWFwW25vZGVdOwogICAgaWYgKGxvY2FsRnVuY3Rpb24gPT0gbnVsbCkgewogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyQ29udGV4dDsKICAgICAgRW50aXR5IGV4ZWN1dGFibGVDb250ZXh0OwogICAgICBpci5UcmVlTm9kZSBwYXJlbnQgPSBub2RlLnBhcmVudDsKICAgICAgd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7CiAgICAgICAgaWYgKHBhcmVudCBpcyBpci5NZW1iZXIpIHsKICAgICAgICAgIGV4ZWN1dGFibGVDb250ZXh0ID0gbWVtYmVyQ29udGV4dCA9IGdldE1lbWJlcihwYXJlbnQpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChwYXJlbnQgaXMgaXIuRnVuY3Rpb25EZWNsYXJhdGlvbiB8fAogICAgICAgICAgICBwYXJlbnQgaXMgaXIuRnVuY3Rpb25FeHByZXNzaW9uKSB7CiAgICAgICAgICBLTG9jYWxGdW5jdGlvbiBsb2NhbEZ1bmN0aW9uID0gZ2V0TG9jYWxGdW5jdGlvbihwYXJlbnQpOwogICAgICAgICAgZXhlY3V0YWJsZUNvbnRleHQgPSBsb2NhbEZ1bmN0aW9uOwogICAgICAgICAgbWVtYmVyQ29udGV4dCA9IGxvY2FsRnVuY3Rpb24ubWVtYmVyQ29udGV4dDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50OwogICAgICB9CiAgICAgIFN0cmluZyBuYW1lOwogICAgICBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb247CiAgICAgIGlmIChub2RlIGlzIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24pIHsKICAgICAgICBuYW1lID0gbm9kZS52YXJpYWJsZS5uYW1lOwogICAgICAgIGZ1bmN0aW9uID0gbm9kZS5mdW5jdGlvbjsKICAgICAgfSBlbHNlIGlmIChub2RlIGlzIGlyLkZ1bmN0aW9uRXhwcmVzc2lvbikgewogICAgICAgIGZ1bmN0aW9uID0gbm9kZS5mdW5jdGlvbjsKICAgICAgfQogICAgICBsb2NhbEZ1bmN0aW9uID0gbG9jYWxGdW5jdGlvbk1hcFtub2RlXSA9CiAgICAgICAgICBuZXcgS0xvY2FsRnVuY3Rpb24obmFtZSwgbWVtYmVyQ29udGV4dCwgZXhlY3V0YWJsZUNvbnRleHQsIG5vZGUpOwogICAgICBpbnQgaW5kZXggPSAwOwogICAgICBMaXN0PEtMb2NhbFR5cGVWYXJpYWJsZT4gdHlwZVZhcmlhYmxlcyA9IDxLTG9jYWxUeXBlVmFyaWFibGU+W107CiAgICAgIGZvciAoaXIuVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyIGluIGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgICAgdHlwZVZhcmlhYmxlcy5hZGQodHlwZVZhcmlhYmxlTWFwW3R5cGVQYXJhbWV0ZXJdID0KICAgICAgICAgICAgbmV3IEtMb2NhbFR5cGVWYXJpYWJsZShsb2NhbEZ1bmN0aW9uLCB0eXBlUGFyYW1ldGVyLm5hbWUsIGluZGV4KSk7CiAgICAgICAgaW5kZXgrKzsKICAgICAgfQogICAgICBpbmRleCA9IDA7CiAgICAgIGZvciAoaXIuVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyIGluIGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgICAgdHlwZVZhcmlhYmxlc1tpbmRleF0uYm91bmQgPSBnZXREYXJ0VHlwZSh0eXBlUGFyYW1ldGVyLmJvdW5kKTsKICAgICAgICB0eXBlVmFyaWFibGVzW2luZGV4XS5kZWZhdWx0VHlwZSA9CiAgICAgICAgICAgIGdldERhcnRUeXBlKHR5cGVQYXJhbWV0ZXIuZGVmYXVsdFR5cGUpOwogICAgICAgIGluZGV4Kys7CiAgICAgIH0KICAgICAgbG9jYWxGdW5jdGlvbi5mdW5jdGlvblR5cGUgPSBnZXRGdW5jdGlvblR5cGUoZnVuY3Rpb24pOwogICAgfQogICAgcmV0dXJuIGxvY2FsRnVuY3Rpb247CiAgfQoKICBib29sIF9pbXBsZW1lbnRzRnVuY3Rpb24oSW5kZXhlZENsYXNzIGNscykgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgS0NsYXNzRGF0YSBkYXRhID0gY2xhc3Nlcy5nZXREYXRhKGNscyk7CiAgICBPcmRlcmVkVHlwZVNldCBvcmRlcmVkVHlwZVNldCA9IGRhdGEub3JkZXJlZFR5cGVTZXQ7CiAgICBJbnRlcmZhY2VUeXBlIHN1cGVydHlwZSA9IG9yZGVyZWRUeXBlU2V0LmFzSW5zdGFuY2VPZigKICAgICAgICBjb21tb25FbGVtZW50cy5mdW5jdGlvbkNsYXNzLAogICAgICAgIGdldEhpZXJhcmNoeURlcHRoKGNvbW1vbkVsZW1lbnRzLmZ1bmN0aW9uQ2xhc3MpKTsKICAgIGlmIChzdXBlcnR5cGUgIT0gbnVsbCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBkYXRhLmNhbGxUeXBlIGlzIEZ1bmN0aW9uVHlwZTsKICB9CgogIEBvdmVycmlkZQogIGlyLlR5cGVkZWYgZ2V0VHlwZWRlZk5vZGUoVHlwZWRlZkVudGl0eSB0eXBlZGVmKSB7CiAgICByZXR1cm4gX2dldFR5cGVkZWZOb2RlKHR5cGVkZWYpOwogIH0KCiAgQG92ZXJyaWRlCiAgRm9yZWlnbktpbmQgZ2V0Rm9yZWlnbktpbmQoaXIuU3RhdGljSW52b2NhdGlvbiBub2RlKSB7CiAgICBpZiAoY29tbW9uRWxlbWVudHMuaXNGb3JlaWduSGVscGVyKGdldE1lbWJlcihub2RlLnRhcmdldCkpKSB7CiAgICAgIHN3aXRjaCAobm9kZS50YXJnZXQubmFtZS5uYW1lKSB7CiAgICAgICAgY2FzZSBKYXZhU2NyaXB0QmFja2VuZC5KUzoKICAgICAgICAgIHJldHVybiBGb3JlaWduS2luZC5KUzsKICAgICAgICBjYXNlIEphdmFTY3JpcHRCYWNrZW5kLkpTX0JVSUxUSU46CiAgICAgICAgICByZXR1cm4gRm9yZWlnbktpbmQuSlNfQlVJTFRJTjsKICAgICAgICBjYXNlIEphdmFTY3JpcHRCYWNrZW5kLkpTX0VNQkVEREVEX0dMT0JBTDoKICAgICAgICAgIHJldHVybiBGb3JlaWduS2luZC5KU19FTUJFRERFRF9HTE9CQUw7CiAgICAgICAgY2FzZSBKYXZhU2NyaXB0QmFja2VuZC5KU19JTlRFUkNFUFRPUl9DT05TVEFOVDoKICAgICAgICAgIHJldHVybiBGb3JlaWduS2luZC5KU19JTlRFUkNFUFRPUl9DT05TVEFOVDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIEZvcmVpZ25LaW5kLk5PTkU7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldEludGVyZmFjZVR5cGVGb3JKc0ludGVyY2VwdG9yQ2FsbChpci5TdGF0aWNJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGlmIChub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCAhPSAxIHx8CiAgICAgICAgbm9kZS5hcmd1bWVudHMubmFtZWQuaXNOb3RFbXB0eSkgewogICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICAgIE1lc3NhZ2VLaW5kLldST05HX0FSR1VNRU5UX0ZPUl9KU19JTlRFUkNFUFRPUl9DT05TVEFOVCk7CiAgICB9CiAgICBpci5Ob2RlIGFyZ3VtZW50ID0gbm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5maXJzdDsKICAgIGlmIChhcmd1bWVudCBpcyBpci5UeXBlTGl0ZXJhbCAmJiBhcmd1bWVudC50eXBlIGlzIGlyLkludGVyZmFjZVR5cGUpIHsKICAgICAgcmV0dXJuIGdldEludGVyZmFjZVR5cGUoYXJndW1lbnQudHlwZSk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENhY2hlIHRoaXMgZm9yIGxhdGVyIHVzZS4KICBAb3ZlcnJpZGUKICBOYXRpdmVCZWhhdmlvciBnZXROYXRpdmVCZWhhdmlvckZvckZpZWxkTG9hZChpci5GaWVsZCBmaWVsZCwKICAgICAgSXRlcmFibGU8U3RyaW5nPiBjcmVhdGVzQW5ub3RhdGlvbnMsIEl0ZXJhYmxlPFN0cmluZz4gcmV0dXJuc0Fubm90YXRpb25zLAogICAgICB7Ym9vbCBpc0pzSW50ZXJvcH0pIHsKICAgIERhcnRUeXBlIHR5cGUgPSBnZXREYXJ0VHlwZShmaWVsZC50eXBlKTsKICAgIHJldHVybiBuYXRpdmVCZWhhdmlvckJ1aWxkZXIuYnVpbGRGaWVsZExvYWRCZWhhdmlvcih0eXBlLAogICAgICAgIGNyZWF0ZXNBbm5vdGF0aW9ucywgcmV0dXJuc0Fubm90YXRpb25zLCB0eXBlTG9va3VwKHJlc29sdmVBc1JhdzogZmFsc2UpLAogICAgICAgIGlzSnNJbnRlcm9wOiBpc0pzSW50ZXJvcCk7CiAgfQoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDYWNoZSB0aGlzIGZvciBsYXRlciB1c2UuCiAgQG92ZXJyaWRlCiAgTmF0aXZlQmVoYXZpb3IgZ2V0TmF0aXZlQmVoYXZpb3JGb3JGaWVsZFN0b3JlKGlyLkZpZWxkIGZpZWxkKSB7CiAgICBEYXJ0VHlwZSB0eXBlID0gZ2V0RGFydFR5cGUoZmllbGQudHlwZSk7CiAgICByZXR1cm4gbmF0aXZlQmVoYXZpb3JCdWlsZGVyLmJ1aWxkRmllbGRTdG9yZUJlaGF2aW9yKHR5cGUpOwogIH0KCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ2FjaGUgdGhpcyBmb3IgbGF0ZXIgdXNlLgogIEBvdmVycmlkZQogIE5hdGl2ZUJlaGF2aW9yIGdldE5hdGl2ZUJlaGF2aW9yRm9yTWV0aG9kKGlyLk1lbWJlciBtZW1iZXIsCiAgICAgIEl0ZXJhYmxlPFN0cmluZz4gY3JlYXRlc0Fubm90YXRpb25zLCBJdGVyYWJsZTxTdHJpbmc+IHJldHVybnNBbm5vdGF0aW9ucywKICAgICAge2Jvb2wgaXNKc0ludGVyb3B9KSB7CiAgICBEYXJ0VHlwZSB0eXBlOwogICAgaWYgKG1lbWJlciBpcyBpci5Qcm9jZWR1cmUpIHsKICAgICAgdHlwZSA9IGdldEZ1bmN0aW9uVHlwZShtZW1iZXIuZnVuY3Rpb24pOwogICAgfSBlbHNlIGlmIChtZW1iZXIgaXMgaXIuQ29uc3RydWN0b3IpIHsKICAgICAgdHlwZSA9IGdldEZ1bmN0aW9uVHlwZShtZW1iZXIuZnVuY3Rpb24pOwogICAgfSBlbHNlIHsKICAgICAgZmFpbGVkQXQoQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwgIlVuZXhwZWN0ZWQgbWV0aG9kIG5vZGUgJG1lbWJlci4iKTsKICAgIH0KICAgIHJldHVybiBuYXRpdmVCZWhhdmlvckJ1aWxkZXIuYnVpbGRNZXRob2RCZWhhdmlvcih0eXBlLCBjcmVhdGVzQW5ub3RhdGlvbnMsCiAgICAgICAgcmV0dXJuc0Fubm90YXRpb25zLCB0eXBlTG9va3VwKHJlc29sdmVBc1JhdzogZmFsc2UpLAogICAgICAgIGlzSnNJbnRlcm9wOiBpc0pzSW50ZXJvcCk7CiAgfQoKICBJbmRleGVkTGlicmFyeSBjcmVhdGVMaWJyYXJ5KFN0cmluZyBuYW1lLCBVcmkgY2Fub25pY2FsVXJpKSB7CiAgICByZXR1cm4gbmV3IEtMaWJyYXJ5KG5hbWUsIGNhbm9uaWNhbFVyaSk7CiAgfQoKICBJbmRleGVkQ2xhc3MgY3JlYXRlQ2xhc3MoTGlicmFyeUVudGl0eSBsaWJyYXJ5LCBTdHJpbmcgbmFtZSwKICAgICAge2Jvb2wgaXNBYnN0cmFjdH0pIHsKICAgIHJldHVybiBuZXcgS0NsYXNzKGxpYnJhcnksIG5hbWUsIGlzQWJzdHJhY3Q6IGlzQWJzdHJhY3QpOwogIH0KCiAgSW5kZXhlZFR5cGVkZWYgY3JlYXRlVHlwZWRlZihMaWJyYXJ5RW50aXR5IGxpYnJhcnksIFN0cmluZyBuYW1lKSB7CiAgICByZXR1cm4gbmV3IEtUeXBlZGVmKGxpYnJhcnksIG5hbWUpOwogIH0KCiAgVHlwZVZhcmlhYmxlRW50aXR5IGNyZWF0ZVR5cGVWYXJpYWJsZSgKICAgICAgRW50aXR5IHR5cGVEZWNsYXJhdGlvbiwgU3RyaW5nIG5hbWUsIGludCBpbmRleCkgewogICAgcmV0dXJuIG5ldyBLVHlwZVZhcmlhYmxlKHR5cGVEZWNsYXJhdGlvbiwgbmFtZSwgaW5kZXgpOwogIH0KCiAgSW5kZXhlZENvbnN0cnVjdG9yIGNyZWF0ZUdlbmVyYXRpdmVDb25zdHJ1Y3RvcihDbGFzc0VudGl0eSBlbmNsb3NpbmdDbGFzcywKICAgICAgTmFtZSBuYW1lLCBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlLAogICAgICB7Ym9vbCBpc0V4dGVybmFsLCBib29sIGlzQ29uc3R9KSB7CiAgICByZXR1cm4gbmV3IEtHZW5lcmF0aXZlQ29uc3RydWN0b3IoZW5jbG9zaW5nQ2xhc3MsIG5hbWUsIHBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAgICBpc0V4dGVybmFsOiBpc0V4dGVybmFsLCBpc0NvbnN0OiBpc0NvbnN0KTsKICB9CgogIEluZGV4ZWRDb25zdHJ1Y3RvciBjcmVhdGVGYWN0b3J5Q29uc3RydWN0b3IoQ2xhc3NFbnRpdHkgZW5jbG9zaW5nQ2xhc3MsCiAgICAgIE5hbWUgbmFtZSwgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAge2Jvb2wgaXNFeHRlcm5hbCwgYm9vbCBpc0NvbnN0LCBib29sIGlzRnJvbUVudmlyb25tZW50Q29uc3RydWN0b3J9KSB7CiAgICByZXR1cm4gbmV3IEtGYWN0b3J5Q29uc3RydWN0b3IoZW5jbG9zaW5nQ2xhc3MsIG5hbWUsIHBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAgICBpc0V4dGVybmFsOiBpc0V4dGVybmFsLAogICAgICAgIGlzQ29uc3Q6IGlzQ29uc3QsCiAgICAgICAgaXNGcm9tRW52aXJvbm1lbnRDb25zdHJ1Y3RvcjogaXNGcm9tRW52aXJvbm1lbnRDb25zdHJ1Y3Rvcik7CiAgfQoKICBJbmRleGVkRnVuY3Rpb24gY3JlYXRlR2V0dGVyKExpYnJhcnlFbnRpdHkgbGlicmFyeSwKICAgICAgQ2xhc3NFbnRpdHkgZW5jbG9zaW5nQ2xhc3MsIE5hbWUgbmFtZSwgQXN5bmNNYXJrZXIgYXN5bmNNYXJrZXIsCiAgICAgIHtib29sIGlzU3RhdGljLCBib29sIGlzRXh0ZXJuYWwsIGJvb2wgaXNBYnN0cmFjdH0pIHsKICAgIHJldHVybiBuZXcgS0dldHRlcihsaWJyYXJ5LCBlbmNsb3NpbmdDbGFzcywgbmFtZSwgYXN5bmNNYXJrZXIsCiAgICAgICAgaXNTdGF0aWM6IGlzU3RhdGljLCBpc0V4dGVybmFsOiBpc0V4dGVybmFsLCBpc0Fic3RyYWN0OiBpc0Fic3RyYWN0KTsKICB9CgogIEluZGV4ZWRGdW5jdGlvbiBjcmVhdGVNZXRob2QoCiAgICAgIExpYnJhcnlFbnRpdHkgbGlicmFyeSwKICAgICAgQ2xhc3NFbnRpdHkgZW5jbG9zaW5nQ2xhc3MsCiAgICAgIE5hbWUgbmFtZSwKICAgICAgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAgQXN5bmNNYXJrZXIgYXN5bmNNYXJrZXIsCiAgICAgIHtib29sIGlzU3RhdGljLAogICAgICBib29sIGlzRXh0ZXJuYWwsCiAgICAgIGJvb2wgaXNBYnN0cmFjdH0pIHsKICAgIHJldHVybiBuZXcgS01ldGhvZCgKICAgICAgICBsaWJyYXJ5LCBlbmNsb3NpbmdDbGFzcywgbmFtZSwgcGFyYW1ldGVyU3RydWN0dXJlLCBhc3luY01hcmtlciwKICAgICAgICBpc1N0YXRpYzogaXNTdGF0aWMsIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwsIGlzQWJzdHJhY3Q6IGlzQWJzdHJhY3QpOwogIH0KCiAgSW5kZXhlZEZ1bmN0aW9uIGNyZWF0ZVNldHRlcigKICAgICAgTGlicmFyeUVudGl0eSBsaWJyYXJ5LCBDbGFzc0VudGl0eSBlbmNsb3NpbmdDbGFzcywgTmFtZSBuYW1lLAogICAgICB7Ym9vbCBpc1N0YXRpYywgYm9vbCBpc0V4dGVybmFsLCBib29sIGlzQWJzdHJhY3R9KSB7CiAgICByZXR1cm4gbmV3IEtTZXR0ZXIobGlicmFyeSwgZW5jbG9zaW5nQ2xhc3MsIG5hbWUsCiAgICAgICAgaXNTdGF0aWM6IGlzU3RhdGljLCBpc0V4dGVybmFsOiBpc0V4dGVybmFsLCBpc0Fic3RyYWN0OiBpc0Fic3RyYWN0KTsKICB9CgogIEluZGV4ZWRGaWVsZCBjcmVhdGVGaWVsZCgKICAgICAgTGlicmFyeUVudGl0eSBsaWJyYXJ5LCBDbGFzc0VudGl0eSBlbmNsb3NpbmdDbGFzcywgTmFtZSBuYW1lLAogICAgICB7Ym9vbCBpc1N0YXRpYywgYm9vbCBpc0Fzc2lnbmFibGUsIGJvb2wgaXNDb25zdH0pIHsKICAgIHJldHVybiBuZXcgS0ZpZWxkKGxpYnJhcnksIGVuY2xvc2luZ0NsYXNzLCBuYW1lLAogICAgICAgIGlzU3RhdGljOiBpc1N0YXRpYywgaXNBc3NpZ25hYmxlOiBpc0Fzc2lnbmFibGUsIGlzQ29uc3Q6IGlzQ29uc3QpOwogIH0KfQoKY2xhc3MgS2VybmVsRWxlbWVudEVudmlyb25tZW50IGV4dGVuZHMgRWxlbWVudEVudmlyb25tZW50CiAgICBpbXBsZW1lbnRzIEtFbGVtZW50RW52aXJvbm1lbnQgewogIGZpbmFsIEtlcm5lbFRvRWxlbWVudE1hcEltcGwgZWxlbWVudE1hcDsKCiAgS2VybmVsRWxlbWVudEVudmlyb25tZW50KHRoaXMuZWxlbWVudE1hcCk7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldCBkeW5hbWljVHlwZSA9PiBjb25zdCBEeW5hbWljVHlwZSgpOwoKICBAb3ZlcnJpZGUKICBMaWJyYXJ5RW50aXR5IGdldCBtYWluTGlicmFyeSA9PiBlbGVtZW50TWFwLl9tYWluTGlicmFyeTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IG1haW5GdW5jdGlvbiA9PiBlbGVtZW50TWFwLl9tYWluRnVuY3Rpb247CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPExpYnJhcnlFbnRpdHk+IGdldCBsaWJyYXJpZXMgPT4gZWxlbWVudE1hcC5saWJyYXJ5TGlzdEludGVybmFsOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0TGlicmFyeU5hbWUoTGlicmFyeUVudGl0eSBsaWJyYXJ5KSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5fZ2V0TGlicmFyeU5hbWUobGlicmFyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldFRoaXNUeXBlKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuZ2V0VGhpc1R5cGUoY2xzKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0UmF3VHlwZShDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBlbGVtZW50TWFwLl9nZXRSYXdUeXBlKGNscyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzR2VuZXJpY0NsYXNzKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGdldFRoaXNUeXBlKGNscykudHlwZUFyZ3VtZW50cy5pc05vdEVtcHR5OwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc01peGluQXBwbGljYXRpb24oQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5faXNNaXhpbkFwcGxpY2F0aW9uKGNscyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzVW5uYW1lZE1peGluQXBwbGljYXRpb24oQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5faXNVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbihjbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0VHlwZVZhcmlhYmxlQm91bmQoVHlwZVZhcmlhYmxlRW50aXR5IHR5cGVWYXJpYWJsZSkgewogICAgaWYgKHR5cGVWYXJpYWJsZSBpcyBLTG9jYWxUeXBlVmFyaWFibGUpIHJldHVybiB0eXBlVmFyaWFibGUuYm91bmQ7CiAgICByZXR1cm4gZWxlbWVudE1hcC5nZXRUeXBlVmFyaWFibGVCb3VuZCh0eXBlVmFyaWFibGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBjcmVhdGVJbnRlcmZhY2VUeXBlKAogICAgICBDbGFzc0VudGl0eSBjbHMsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZShjbHMsIHR5cGVBcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25UeXBlIGdldEZ1bmN0aW9uVHlwZShGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuX2dldEZ1bmN0aW9uVHlwZShmdW5jdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PFR5cGVWYXJpYWJsZVR5cGU+IGdldEZ1bmN0aW9uVHlwZVZhcmlhYmxlcyhGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuX2dldEZ1bmN0aW9uVHlwZVZhcmlhYmxlcyhmdW5jdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRGaWVsZFR5cGUoRmllbGRFbnRpdHkgZmllbGQpIHsKICAgIHJldHVybiBlbGVtZW50TWFwLl9nZXRGaWVsZFR5cGUoZmllbGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25UeXBlIGdldExvY2FsRnVuY3Rpb25UeXBlKGNvdmFyaWFudCBLTG9jYWxGdW5jdGlvbiBmdW5jdGlvbikgewogICAgcmV0dXJuIGZ1bmN0aW9uLmZ1bmN0aW9uVHlwZTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiBnZXRGaWVsZENvbnN0YW50Rm9yVGVzdGluZyhGaWVsZEVudGl0eSBmaWVsZCkgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuX2dldEZpZWxkQ29uc3RhbnRFeHByZXNzaW9uKGZpZWxkKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldFVuYWxpYXNlZFR5cGUoRGFydFR5cGUgdHlwZSkgPT4gdHlwZTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RydWN0b3JFbnRpdHkgbG9va3VwQ29uc3RydWN0b3IoQ2xhc3NFbnRpdHkgY2xzLCBTdHJpbmcgbmFtZSwKICAgICAge2Jvb2wgcmVxdWlyZWQ6IGZhbHNlfSkgewogICAgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IgPSBlbGVtZW50TWFwLmxvb2t1cENvbnN0cnVjdG9yKGNscywgbmFtZSk7CiAgICBpZiAoY29uc3RydWN0b3IgPT0gbnVsbCAmJiByZXF1aXJlZCkgewogICAgICB0aHJvdyBmYWlsZWRBdCgKICAgICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgICAiVGhlIGNvbnN0cnVjdG9yICckbmFtZScgd2FzIG5vdCBmb3VuZCBpbiBjbGFzcyAnJHtjbHMubmFtZX0nICIKICAgICAgICAgICJpbiBsaWJyYXJ5ICR7Y2xzLmxpYnJhcnkuY2Fub25pY2FsVXJpfS4iKTsKICAgIH0KICAgIHJldHVybiBjb25zdHJ1Y3RvcjsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlckVudGl0eSBsb29rdXBMb2NhbENsYXNzTWVtYmVyKENsYXNzRW50aXR5IGNscywgU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2UsIGJvb2wgcmVxdWlyZWQ6IGZhbHNlfSkgewogICAgTWVtYmVyRW50aXR5IG1lbWJlciA9CiAgICAgICAgZWxlbWVudE1hcC5sb29rdXBDbGFzc01lbWJlcihjbHMsIG5hbWUsIHNldHRlcjogc2V0dGVyKTsKICAgIGlmIChtZW1iZXIgPT0gbnVsbCAmJiByZXF1aXJlZCkgewogICAgICB0aHJvdyBmYWlsZWRBdChDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICAgIlRoZSBtZW1iZXIgJyRuYW1lJyB3YXMgbm90IGZvdW5kIGluICR7Y2xzLm5hbWV9LiIpOwogICAgfQogICAgcmV0dXJuIG1lbWJlcjsKICB9CgogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldFN1cGVyQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzLAogICAgICB7Ym9vbCBza2lwVW5uYW1lZE1peGluQXBwbGljYXRpb25zOiBmYWxzZX0pIHsKICAgIGFzc2VydChlbGVtZW50TWFwLmNoZWNrRmFtaWx5KGNscykpOwogICAgQ2xhc3NFbnRpdHkgc3VwZXJjbGFzcyA9IGVsZW1lbnRNYXAuZ2V0U3VwZXJUeXBlKGNscyk/LmVsZW1lbnQ7CiAgICBpZiAoc2tpcFVubmFtZWRNaXhpbkFwcGxpY2F0aW9ucykgewogICAgICB3aGlsZSAoc3VwZXJjbGFzcyAhPSBudWxsICYmCiAgICAgICAgICBlbGVtZW50TWFwLl9pc1VubmFtZWRNaXhpbkFwcGxpY2F0aW9uKHN1cGVyY2xhc3MpKSB7CiAgICAgICAgc3VwZXJjbGFzcyA9IGVsZW1lbnRNYXAuZ2V0U3VwZXJUeXBlKHN1cGVyY2xhc3MpPy5lbGVtZW50OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc3VwZXJjbGFzczsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaFN1cGVydHlwZShDbGFzc0VudGl0eSBjbHMsIHZvaWQgZihJbnRlcmZhY2VUeXBlIHN1cGVydHlwZSkpIHsKICAgIGVsZW1lbnRNYXAuX2ZvckVhY2hTdXBlcnR5cGUoY2xzLCBmKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaE1peGluKENsYXNzRW50aXR5IGNscywgdm9pZCBmKENsYXNzRW50aXR5IG1peGluKSkgewogICAgZWxlbWVudE1hcC5fZm9yRWFjaE1peGluKGNscywgZik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hMb2NhbENsYXNzTWVtYmVyKENsYXNzRW50aXR5IGNscywgdm9pZCBmKE1lbWJlckVudGl0eSBtZW1iZXIpKSB7CiAgICBlbGVtZW50TWFwLl9mb3JFYWNoTG9jYWxDbGFzc01lbWJlcihjbHMsIGYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoQ2xhc3NNZW1iZXIoCiAgICAgIENsYXNzRW50aXR5IGNscywgdm9pZCBmKENsYXNzRW50aXR5IGRlY2xhcmVyLCBNZW1iZXJFbnRpdHkgbWVtYmVyKSkgewogICAgZWxlbWVudE1hcC5fZm9yRWFjaENsYXNzTWVtYmVyKGNscywgZik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hDb25zdHJ1Y3RvcigKICAgICAgQ2xhc3NFbnRpdHkgY2xzLCB2b2lkIGYoQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IpKSB7CiAgICBlbGVtZW50TWFwLl9mb3JFYWNoQ29uc3RydWN0b3IoY2xzLCBmKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaExpYnJhcnlNZW1iZXIoCiAgICAgIExpYnJhcnlFbnRpdHkgbGlicmFyeSwgdm9pZCBmKE1lbWJlckVudGl0eSBtZW1iZXIpKSB7CiAgICBlbGVtZW50TWFwLl9mb3JFYWNoTGlicmFyeU1lbWJlcihsaWJyYXJ5LCBmKTsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlckVudGl0eSBsb29rdXBMaWJyYXJ5TWVtYmVyKExpYnJhcnlFbnRpdHkgbGlicmFyeSwgU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2UsIGJvb2wgcmVxdWlyZWQ6IGZhbHNlfSkgewogICAgTWVtYmVyRW50aXR5IG1lbWJlciA9CiAgICAgICAgZWxlbWVudE1hcC5sb29rdXBMaWJyYXJ5TWVtYmVyKGxpYnJhcnksIG5hbWUsIHNldHRlcjogc2V0dGVyKTsKICAgIGlmIChtZW1iZXIgPT0gbnVsbCAmJiByZXF1aXJlZCkgewogICAgICBmYWlsZWRBdChDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICAgIlRoZSBtZW1iZXIgJyR7bmFtZX0nIHdhcyBub3QgZm91bmQgaW4gbGlicmFyeSAnJHtsaWJyYXJ5Lm5hbWV9Jy4iKTsKICAgIH0KICAgIHJldHVybiBtZW1iZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBsb29rdXBDbGFzcyhMaWJyYXJ5RW50aXR5IGxpYnJhcnksIFN0cmluZyBuYW1lLAogICAgICB7Ym9vbCByZXF1aXJlZDogZmFsc2V9KSB7CiAgICBDbGFzc0VudGl0eSBjbHMgPSBlbGVtZW50TWFwLmxvb2t1cENsYXNzKGxpYnJhcnksIG5hbWUpOwogICAgaWYgKGNscyA9PSBudWxsICYmIHJlcXVpcmVkKSB7CiAgICAgIGZhaWxlZEF0KENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgICAiVGhlIGNsYXNzICckbmFtZScgIHdhcyBub3QgZm91bmQgaW4gbGlicmFyeSAnJHtsaWJyYXJ5Lm5hbWV9Jy4iKTsKICAgIH0KICAgIHJldHVybiBjbHM7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hDbGFzcyhMaWJyYXJ5RW50aXR5IGxpYnJhcnksIHZvaWQgZihDbGFzc0VudGl0eSBjbHMpKSB7CiAgICBlbGVtZW50TWFwLl9mb3JFYWNoQ2xhc3MobGlicmFyeSwgZik7CiAgfQoKICBAb3ZlcnJpZGUKICBMaWJyYXJ5RW50aXR5IGxvb2t1cExpYnJhcnkoVXJpIHVyaSwge2Jvb2wgcmVxdWlyZWQ6IGZhbHNlfSkgewogICAgTGlicmFyeUVudGl0eSBsaWJyYXJ5ID0gZWxlbWVudE1hcC5sb29rdXBMaWJyYXJ5KHVyaSk7CiAgICBpZiAobGlicmFyeSA9PSBudWxsICYmIHJlcXVpcmVkKSB7CiAgICAgIGZhaWxlZEF0KENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsICJUaGUgbGlicmFyeSAnJHVyaScgd2FzIG5vdCBmb3VuZC4iKTsKICAgIH0KICAgIHJldHVybiBsaWJyYXJ5OwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0RlZmVycmVkTG9hZExpYnJhcnlHZXR0ZXIoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgLy8gVGhlIGZyb250LWVuZCBnZW5lcmF0ZXMgdGhlIGdldHRlciBvZiBsb2FkTGlicmFyeSBleHBsaWNpdGx5IGFzIGNvZGUKICAgIC8vIHNvIHRoZXJlIGlzIG5vIGltcGxpY2l0IHJlcHJlc2VudGF0aW9uIGJhc2VkIG9uIGEgImxvYWRMaWJyYXJ5IiBtZW1iZXIuCiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxDb25zdGFudFZhbHVlPiBnZXRMaWJyYXJ5TWV0YWRhdGEoY292YXJpYW50IEluZGV4ZWRMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIGFzc2VydChlbGVtZW50TWFwLmNoZWNrRmFtaWx5KGxpYnJhcnkpKTsKICAgIEtMaWJyYXJ5RGF0YSBsaWJyYXJ5RGF0YSA9IGVsZW1lbnRNYXAubGlicmFyaWVzLmdldERhdGEobGlicmFyeSk7CiAgICByZXR1cm4gbGlicmFyeURhdGEuZ2V0TWV0YWRhdGEoZWxlbWVudE1hcCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxJbXBvcnRFbnRpdHk+IGdldEltcG9ydHMoY292YXJpYW50IEluZGV4ZWRMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIGFzc2VydChlbGVtZW50TWFwLmNoZWNrRmFtaWx5KGxpYnJhcnkpKTsKICAgIEtMaWJyYXJ5RGF0YSBsaWJyYXJ5RGF0YSA9IGVsZW1lbnRNYXAubGlicmFyaWVzLmdldERhdGEobGlicmFyeSk7CiAgICByZXR1cm4gbGlicmFyeURhdGEuZ2V0SW1wb3J0cyhlbGVtZW50TWFwKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPENvbnN0YW50VmFsdWU+IGdldENsYXNzTWV0YWRhdGEoY292YXJpYW50IEluZGV4ZWRDbGFzcyBjbHMpIHsKICAgIGFzc2VydChlbGVtZW50TWFwLmNoZWNrRmFtaWx5KGNscykpOwogICAgS0NsYXNzRGF0YSBjbGFzc0RhdGEgPSBlbGVtZW50TWFwLmNsYXNzZXMuZ2V0RGF0YShjbHMpOwogICAgcmV0dXJuIGNsYXNzRGF0YS5nZXRNZXRhZGF0YShlbGVtZW50TWFwKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPENvbnN0YW50VmFsdWU+IGdldE1lbWJlck1ldGFkYXRhKGNvdmFyaWFudCBJbmRleGVkTWVtYmVyIG1lbWJlciwKICAgICAge2Jvb2wgaW5jbHVkZVBhcmFtZXRlck1ldGFkYXRhOiBmYWxzZX0pIHsKICAgIC8vIFRPRE8ocmVkZW1wdGlvbik6IFN1cHBvcnQgaW5jbHVkZVBhcmFtZXRlck1ldGFkYXRhLgogICAgYXNzZXJ0KGVsZW1lbnRNYXAuY2hlY2tGYW1pbHkobWVtYmVyKSk7CiAgICBLTWVtYmVyRGF0YSBtZW1iZXJEYXRhID0gZWxlbWVudE1hcC5tZW1iZXJzLmdldERhdGEobWVtYmVyKTsKICAgIHJldHVybiBtZW1iZXJEYXRhLmdldE1ldGFkYXRhKGVsZW1lbnRNYXApOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0VudW1DbGFzcyhDbGFzc0VudGl0eSBjbHMpIHsKICAgIGFzc2VydChlbGVtZW50TWFwLmNoZWNrRmFtaWx5KGNscykpOwogICAgS0NsYXNzRGF0YSBjbGFzc0RhdGEgPSBlbGVtZW50TWFwLmNsYXNzZXMuZ2V0RGF0YShjbHMpOwogICAgcmV0dXJuIGNsYXNzRGF0YS5pc0VudW1DbGFzczsKICB9Cn0KCi8vLyBbQmVoYXZpb3JCdWlsZGVyXSBmb3Iga2VybmVsIGJhc2VkIGVsZW1lbnRzLgpjbGFzcyBLZXJuZWxCZWhhdmlvckJ1aWxkZXIgZXh0ZW5kcyBCZWhhdmlvckJ1aWxkZXIgewogIEBvdmVycmlkZQogIGZpbmFsIEVsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQ7CiAgQG92ZXJyaWRlCiAgZmluYWwgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHM7CiAgQG92ZXJyaWRlCiAgZmluYWwgRGlhZ25vc3RpY1JlcG9ydGVyIHJlcG9ydGVyOwogIEBvdmVycmlkZQogIGZpbmFsIE5hdGl2ZUJhc2ljRGF0YSBuYXRpdmVCYXNpY0RhdGE7CiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwoKICBLZXJuZWxCZWhhdmlvckJ1aWxkZXIodGhpcy5lbGVtZW50RW52aXJvbm1lbnQsIHRoaXMuY29tbW9uRWxlbWVudHMsCiAgICAgIHRoaXMubmF0aXZlQmFzaWNEYXRhLCB0aGlzLnJlcG9ydGVyLCB0aGlzLl9vcHRpb25zKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgdHJ1c3RKU0ludGVyb3BUeXBlQW5ub3RhdGlvbnMgPT4KICAgICAgX29wdGlvbnMudHJ1c3RKU0ludGVyb3BUeXBlQW5ub3RhdGlvbnM7Cn0KCi8vLyBDb25zdGFudCBlbnZpcm9ubWVudCBtYXBwaW5nIFtDb25zdGFudEV4cHJlc3Npb25dcyB0byBbQ29uc3RhbnRWYWx1ZV1zIHVzaW5nCi8vLyBbX0V2YWx1YXRpb25FbnZpcm9ubWVudF0gZm9yIHRoZSBldmFsdWF0aW9uLgpjbGFzcyBLZXJuZWxDb25zdGFudEVudmlyb25tZW50IGltcGxlbWVudHMgQ29uc3RhbnRFbnZpcm9ubWVudCB7CiAgZmluYWwgS2VybmVsVG9FbGVtZW50TWFwSW1wbCBfZWxlbWVudE1hcDsKICBmaW5hbCBFbnZpcm9ubWVudCBfZW52aXJvbm1lbnQ7CgogIE1hcDxDb25zdGFudEV4cHJlc3Npb24sIENvbnN0YW50VmFsdWU+IF92YWx1ZU1hcCA9CiAgICAgIDxDb25zdGFudEV4cHJlc3Npb24sIENvbnN0YW50VmFsdWU+e307CgogIEtlcm5lbENvbnN0YW50RW52aXJvbm1lbnQodGhpcy5fZWxlbWVudE1hcCwgdGhpcy5fZW52aXJvbm1lbnQpOwoKICBDb25zdGFudFZhbHVlIF9nZXRDb25zdGFudFZhbHVlKAogICAgICBTcGFubmFibGUgc3Bhbm5hYmxlLCBDb25zdGFudEV4cHJlc3Npb24gZXhwcmVzc2lvbiwKICAgICAge2Jvb2wgY29uc3RhbnRSZXF1aXJlZCwgYm9vbCBjaGVja0Nhc3RzOiB0cnVlfSkgewogICAgcmV0dXJuIF92YWx1ZU1hcC5wdXRJZkFic2VudChleHByZXNzaW9uLCAoKSB7CiAgICAgIHJldHVybiBleHByZXNzaW9uLmV2YWx1YXRlKG5ldyBLZXJuZWxFdmFsdWF0aW9uRW52aXJvbm1lbnQoCiAgICAgICAgICBfZWxlbWVudE1hcCwgX2Vudmlyb25tZW50LCBzcGFubmFibGUsCiAgICAgICAgICBjb25zdGFudFJlcXVpcmVkOiBjb25zdGFudFJlcXVpcmVkLCBjaGVja0Nhc3RzOiBjaGVja0Nhc3RzKSk7CiAgICB9KTsKICB9Cn0KCi8vLyBFdmFsdWF0aW9uIGVudmlyb25tZW50IHVzZWQgZm9yIGNvbXB1dGluZyBbQ29uc3RhbnRWYWx1ZV1zIGZvcgovLy8ga2VybmVsIGJhc2VkIFtDb25zdGFudEV4cHJlc3Npb25dcy4KY2xhc3MgS2VybmVsRXZhbHVhdGlvbkVudmlyb25tZW50IGV4dGVuZHMgRXZhbHVhdGlvbkVudmlyb25tZW50QmFzZSB7CiAgZmluYWwgS2VybmVsVG9FbGVtZW50TWFwSW1wbCBfZWxlbWVudE1hcDsKICBmaW5hbCBFbnZpcm9ubWVudCBfZW52aXJvbm1lbnQ7CiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBjaGVja0Nhc3RzOwoKICBLZXJuZWxFdmFsdWF0aW9uRW52aXJvbm1lbnQoCiAgICAgIHRoaXMuX2VsZW1lbnRNYXAsIHRoaXMuX2Vudmlyb25tZW50LCBTcGFubmFibGUgc3Bhbm5hYmxlLAogICAgICB7Ym9vbCBjb25zdGFudFJlcXVpcmVkLCB0aGlzLmNoZWNrQ2FzdHM6IHRydWV9KQogICAgICA6IHN1cGVyKHNwYW5uYWJsZSwgY29uc3RhbnRSZXF1aXJlZDogY29uc3RhbnRSZXF1aXJlZCk7CgogIEBvdmVycmlkZQogIENvbW1vbkVsZW1lbnRzIGdldCBjb21tb25FbGVtZW50cyA9PiBfZWxlbWVudE1hcC5jb21tb25FbGVtZW50czsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGVzIGdldCB0eXBlcyA9PiBfZWxlbWVudE1hcC50eXBlczsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgc3Vic3RCeUNvbnRleHQoRGFydFR5cGUgYmFzZSwgSW50ZXJmYWNlVHlwZSB0YXJnZXQpIHsKICAgIHJldHVybiBfZWxlbWVudE1hcC5zdWJzdEJ5Q29udGV4dChiYXNlLCB0YXJnZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRDb25zdHJ1Y3RvciBnZXRDb25zdHJ1Y3RvckNvbnN0YW50KENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yKSB7CiAgICByZXR1cm4gX2VsZW1lbnRNYXAuX2dldENvbnN0cnVjdG9yQ29uc3RhbnQoY29uc3RydWN0b3IpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIGdldEZpZWxkQ29uc3RhbnQoRmllbGRFbnRpdHkgZmllbGQpIHsKICAgIHJldHVybiBfZWxlbWVudE1hcC5fZ2V0RmllbGRDb25zdGFudEV4cHJlc3Npb24oZmllbGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIGdldExvY2FsQ29uc3RhbnQoTG9jYWwgbG9jYWwpIHsKICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoIl9FdmFsdWF0aW9uRW52aXJvbm1lbnQuZ2V0TG9jYWxDb25zdGFudCIpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHJlYWRGcm9tRW52aXJvbm1lbnQoU3RyaW5nIG5hbWUpIHsKICAgIHJldHVybiBfZW52aXJvbm1lbnQudmFsdWVPZihuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIERpYWdub3N0aWNSZXBvcnRlciBnZXQgcmVwb3J0ZXIgPT4gX2VsZW1lbnRNYXAucmVwb3J0ZXI7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGVuYWJsZUFzc2VydGlvbnMgPT4gX2VsZW1lbnRNYXAub3B0aW9ucy5lbmFibGVVc2VyQXNzZXJ0aW9uczsKfQoKY2xhc3MgS2VybmVsTmF0aXZlTWVtYmVyUmVzb2x2ZXIgaW1wbGVtZW50cyBOYXRpdmVNZW1iZXJSZXNvbHZlciB7CiAgc3RhdGljIGZpbmFsIFJlZ0V4cCBfaWRlbnRpZmllciA9IG5ldyBSZWdFeHAocideW2EtekEtWl8kXVthLXpBLVowLTlfJF0qJCcpOwoKICBmaW5hbCBLZXJuZWxUb0VsZW1lbnRNYXBJbXBsIF9lbGVtZW50TWFwOwogIGZpbmFsIE5hdGl2ZUJhc2ljRGF0YSBfbmF0aXZlQmFzaWNEYXRhOwogIGZpbmFsIE5hdGl2ZURhdGFCdWlsZGVyIF9uYXRpdmVEYXRhQnVpbGRlcjsKCiAgS2VybmVsTmF0aXZlTWVtYmVyUmVzb2x2ZXIoCiAgICAgIHRoaXMuX2VsZW1lbnRNYXAsIHRoaXMuX25hdGl2ZUJhc2ljRGF0YSwgdGhpcy5fbmF0aXZlRGF0YUJ1aWxkZXIpOwoKICBLRWxlbWVudEVudmlyb25tZW50IGdldCBfZWxlbWVudEVudmlyb25tZW50ID0+IF9lbGVtZW50TWFwLmVsZW1lbnRFbnZpcm9ubWVudDsKCiAgQ29tbW9uRWxlbWVudHMgZ2V0IF9jb21tb25FbGVtZW50cyA9PiBfZWxlbWVudE1hcC5jb21tb25FbGVtZW50czsKCiAgQG92ZXJyaWRlCiAgdm9pZCByZXNvbHZlTmF0aXZlTWVtYmVyKGlyLk1lbWJlciBub2RlLCBJckFubm90YXRpb25EYXRhIGFubm90YXRpb25EYXRhKSB7CiAgICBib29sIGlzSnNJbnRlcm9wID0gX2lzSnNJbnRlcm9wTWVtYmVyKG5vZGUpOwogICAgaWYgKG5vZGUgaXMgaXIuUHJvY2VkdXJlIHx8IG5vZGUgaXMgaXIuQ29uc3RydWN0b3IpIHsKICAgICAgRnVuY3Rpb25FbnRpdHkgbWV0aG9kID0gX2VsZW1lbnRNYXAuZ2V0TWVtYmVyKG5vZGUpOwogICAgICBib29sIGlzTmF0aXZlID0gX3Byb2Nlc3NNZXRob2RBbm5vdGF0aW9ucyhub2RlLCBhbm5vdGF0aW9uRGF0YSk7CiAgICAgIGlmIChpc05hdGl2ZSB8fCBpc0pzSW50ZXJvcCkgewogICAgICAgIE5hdGl2ZUJlaGF2aW9yIGJlaGF2aW9yID0gX2NvbXB1dGVOYXRpdmVNZXRob2RCZWhhdmlvcigKICAgICAgICAgICAgbWV0aG9kLCBhbm5vdGF0aW9uRGF0YSwKICAgICAgICAgICAgaXNKc0ludGVyb3A6IGlzSnNJbnRlcm9wKTsKICAgICAgICBfbmF0aXZlRGF0YUJ1aWxkZXIuc2V0TmF0aXZlTWV0aG9kQmVoYXZpb3IobWV0aG9kLCBiZWhhdmlvcik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobm9kZSBpcyBpci5GaWVsZCkgewogICAgICBGaWVsZEVudGl0eSBmaWVsZCA9IF9lbGVtZW50TWFwLmdldE1lbWJlcihub2RlKTsKICAgICAgYm9vbCBpc05hdGl2ZSA9IF9wcm9jZXNzRmllbGRBbm5vdGF0aW9ucyhub2RlLCBhbm5vdGF0aW9uRGF0YSk7CiAgICAgIGlmIChpc05hdGl2ZSB8fCBpc0pzSW50ZXJvcCkgewogICAgICAgIE5hdGl2ZUJlaGF2aW9yIGZpZWxkTG9hZEJlaGF2aW9yID0gX2NvbXB1dGVOYXRpdmVGaWVsZExvYWRCZWhhdmlvcigKICAgICAgICAgICAgZmllbGQsIGFubm90YXRpb25EYXRhLAogICAgICAgICAgICBpc0pzSW50ZXJvcDogaXNKc0ludGVyb3ApOwogICAgICAgIE5hdGl2ZUJlaGF2aW9yIGZpZWxkU3RvcmVCZWhhdmlvciA9CiAgICAgICAgICAgIF9jb21wdXRlTmF0aXZlRmllbGRTdG9yZUJlaGF2aW9yKGZpZWxkKTsKICAgICAgICBfbmF0aXZlRGF0YUJ1aWxkZXIuc2V0TmF0aXZlRmllbGRMb2FkQmVoYXZpb3IoZmllbGQsIGZpZWxkTG9hZEJlaGF2aW9yKTsKICAgICAgICBfbmF0aXZlRGF0YUJ1aWxkZXIuc2V0TmF0aXZlRmllbGRTdG9yZUJlaGF2aW9yKAogICAgICAgICAgICBmaWVsZCwgZmllbGRTdG9yZUJlaGF2aW9yKTsKICAgICAgfQogICAgfQogIH0KCiAgLy8vIFByb2Nlc3MgdGhlIHBvdGVudGlhbGx5IG5hdGl2ZSBbZmllbGRdLiBBZGRzIGluZm9ybWF0aW9uIGZyb20gbWV0YWRhdGEKICAvLy8gYXR0cmlidXRlcy4gUmV0dXJucyBgdHJ1ZWAgb2YgW21ldGhvZF0gaXMgbmF0aXZlLgogIGJvb2wgX3Byb2Nlc3NGaWVsZEFubm90YXRpb25zKAogICAgICBpci5GaWVsZCBub2RlLCBJckFubm90YXRpb25EYXRhIGFubm90YXRpb25EYXRhKSB7CiAgICBpZiAobm9kZS5pc0luc3RhbmNlTWVtYmVyICYmCiAgICAgICAgX25hdGl2ZUJhc2ljRGF0YQogICAgICAgICAgICAuaXNOYXRpdmVDbGFzcyhfZWxlbWVudE1hcC5nZXRDbGFzcyhub2RlLmVuY2xvc2luZ0NsYXNzKSkpIHsKICAgICAgLy8gRXhjbHVkZSBub24taW5zdGFuY2UgKHN0YXRpYykgZmllbGRzIC0gdGhleSBhcmUgbm90IHJlYWxseSBuYXRpdmUgYW5kCiAgICAgIC8vIGFyZSBjb21waWxlZCBhcyBpc29sYXRlIGdsb2JhbHMuICBBY2Nlc3Mgb2YgYSBwcm9wZXJ0eSBvZiBhIGNvbnN0cnVjdG9yCiAgICAgIC8vIGZ1bmN0aW9uIG9yIGEgbm9uLW1ldGhvZCBwcm9wZXJ0eSBpbiB0aGUgcHJvdG90eXBlIGNoYWluLCBtdXN0IGJlIGNvZGVkCiAgICAgIC8vIHVzaW5nIGEgSlMtY2FsbC4KICAgICAgX3NldE5hdGl2ZU5hbWUobm9kZSwgYW5ub3RhdGlvbkRhdGEpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIFN0cmluZyBuYW1lID0gX2ZpbmRKc05hbWVGcm9tQW5ub3RhdGlvbihub2RlLCBhbm5vdGF0aW9uRGF0YSk7CiAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUobm9kZSksCiAgICAgICAgICAgICdASlNOYW1lKC4uLikgYW5ub3RhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciBzdGF0aWMgZmllbGRzOiAnCiAgICAgICAgICAgICckbm9kZS4nKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8vIFByb2Nlc3MgdGhlIHBvdGVudGlhbGx5IG5hdGl2ZSBbbWV0aG9kXS4gQWRkcyBpbmZvcm1hdGlvbiBmcm9tIG1ldGFkYXRhCiAgLy8vIGF0dHJpYnV0ZXMuIFJldHVybnMgYHRydWVgIG9mIFttZXRob2RdIGlzIG5hdGl2ZS4KICBib29sIF9wcm9jZXNzTWV0aG9kQW5ub3RhdGlvbnMoCiAgICAgIGlyLk1lbWJlciBub2RlLCBJckFubm90YXRpb25EYXRhIGFubm90YXRpb25EYXRhKSB7CiAgICBpZiAoX2lzTmF0aXZlTWV0aG9kKG5vZGUsIGFubm90YXRpb25EYXRhKSkgewogICAgICBpZiAobm9kZS5lbmNsb3NpbmdDbGFzcyAhPSBudWxsICYmICFub2RlLmlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgICBpZiAoIV9uYXRpdmVCYXNpY0RhdGEKICAgICAgICAgICAgLmlzTmF0aXZlQ2xhc3MoX2VsZW1lbnRNYXAuZ2V0Q2xhc3Mobm9kZS5lbmNsb3NpbmdDbGFzcykpKSB7CiAgICAgICAgICBfZWxlbWVudE1hcC5yZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICAgICAgY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUobm9kZSksCiAgICAgICAgICAgICAgTWVzc2FnZUtpbmQuTkFUSVZFX05PTl9JTlNUQU5DRV9JTl9OT05fTkFUSVZFX0NMQVNTKTsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgX3NldE5hdGl2ZU5hbWVGb3JTdGF0aWNNZXRob2Qobm9kZSwgYW5ub3RhdGlvbkRhdGEpOwogICAgICB9IGVsc2UgewogICAgICAgIF9zZXROYXRpdmVOYW1lKG5vZGUsIGFubm90YXRpb25EYXRhKTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vLyBTZXRzIHRoZSBuYXRpdmUgbmFtZSBvZiBbZWxlbWVudF0sIGVpdGhlciBmcm9tIGFuIGFubm90YXRpb24sIG9yCiAgLy8vIGRlZmF1bHRpbmcgdG8gdGhlIERhcnQgbmFtZS4KICB2b2lkIF9zZXROYXRpdmVOYW1lKGlyLk1lbWJlciBub2RlLCBJckFubm90YXRpb25EYXRhIGFubm90YXRpb25EYXRhKSB7CiAgICBTdHJpbmcgbmFtZSA9IF9maW5kSnNOYW1lRnJvbUFubm90YXRpb24obm9kZSwgYW5ub3RhdGlvbkRhdGEpOwogICAgbmFtZSA/Pz0gbm9kZS5uYW1lLm5hbWU7CiAgICBfbmF0aXZlRGF0YUJ1aWxkZXIuc2V0TmF0aXZlTWVtYmVyTmFtZShfZWxlbWVudE1hcC5nZXRNZW1iZXIobm9kZSksIG5hbWUpOwogIH0KCiAgLy8vIFNldHMgdGhlIG5hdGl2ZSBuYW1lIG9mIHRoZSBzdGF0aWMgbmF0aXZlIG1ldGhvZCBbZWxlbWVudF0sIHVzaW5nIHRoZQogIC8vLyBmb2xsb3dpbmcgcnVsZXM6CiAgLy8vIDEuIElmIFtlbGVtZW50XSBoYXMgYSBASlNOYW1lIGFubm90YXRpb24gdGhhdCBpcyBhbiBpZGVudGlmaWVyLCBxdWFsaWZ5CiAgLy8vICAgIHRoYXQgaWRlbnRpZmllciB0byB0aGUgQE5hdGl2ZSBuYW1lIG9mIHRoZSBlbmNsb3NpbmcgY2xhc3MKICAvLy8gMi4gSWYgW2VsZW1lbnRdIGhhcyBhIEBKU05hbWUgYW5ub3RhdGlvbiB0aGF0IGlzIG5vdCBhbiBpZGVudGlmaWVyLAogIC8vLyAgICB1c2UgdGhlIGRlY2xhcmVkIEBKU05hbWUgYXMgdGhlIGV4cHJlc3Npb24KICAvLy8gMy4gSWYgW2VsZW1lbnRdIGRvZXMgbm90IGhhdmUgYSBASlNOYW1lIGFubm90YXRpb24sIHF1YWxpZnkgdGhlIG5hbWUgb2YKICAvLy8gICAgdGhlIG1ldGhvZCB3aXRoIHRoZSBATmF0aXZlIG5hbWUgb2YgdGhlIGVuY2xvc2luZyBjbGFzcy4KICB2b2lkIF9zZXROYXRpdmVOYW1lRm9yU3RhdGljTWV0aG9kKAogICAgICBpci5NZW1iZXIgbm9kZSwgSXJBbm5vdGF0aW9uRGF0YSBhbm5vdGF0aW9uRGF0YSkgewogICAgU3RyaW5nIG5hbWUgPSBfZmluZEpzTmFtZUZyb21Bbm5vdGF0aW9uKG5vZGUsIGFubm90YXRpb25EYXRhKTsKICAgIG5hbWUgPz89IG5vZGUubmFtZS5uYW1lOwogICAgaWYgKF9pc0lkZW50aWZpZXIobmFtZSkpIHsKICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gX2VsZW1lbnRNYXAuZ2V0Q2xhc3Mobm9kZS5lbmNsb3NpbmdDbGFzcyk7CiAgICAgIExpc3Q8U3RyaW5nPiBuYXRpdmVOYW1lcyA9IF9uYXRpdmVCYXNpY0RhdGEuZ2V0TmF0aXZlVGFnc09mQ2xhc3MoY2xzKTsKICAgICAgaWYgKG5hdGl2ZU5hbWVzLmxlbmd0aCAhPSAxKSB7CiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKG5vZGUpLAogICAgICAgICAgICAnVW5hYmxlIHRvIGRldGVybWluZSBhIG5hdGl2ZSBuYW1lIGZvciB0aGUgZW5jbG9zaW5nIGNsYXNzLCAnCiAgICAgICAgICAgICdvcHRpb25zOiAkbmF0aXZlTmFtZXMnKTsKICAgICAgfQogICAgICBfbmF0aXZlRGF0YUJ1aWxkZXIuc2V0TmF0aXZlTWVtYmVyTmFtZSgKICAgICAgICAgIF9lbGVtZW50TWFwLmdldE1lbWJlcihub2RlKSwgJyR7bmF0aXZlTmFtZXNbMF19LiRuYW1lJyk7CiAgICB9IGVsc2UgewogICAgICBfbmF0aXZlRGF0YUJ1aWxkZXIuc2V0TmF0aXZlTWVtYmVyTmFtZShfZWxlbWVudE1hcC5nZXRNZW1iZXIobm9kZSksIG5hbWUpOwogICAgfQogIH0KCiAgYm9vbCBfaXNJZGVudGlmaWVyKFN0cmluZyBzKSA9PiBfaWRlbnRpZmllci5oYXNNYXRjaChzKTsKCiAgLy8vIFJldHVybnMgdGhlIEpTTmFtZSBhbm5vdGF0aW9uIHN0cmluZyBvciBgbnVsbGAgaWYgbm8gSlNOYW1lIGFubm90YXRpb24gaXMKICAvLy8gcHJlc2VudC4KICBTdHJpbmcgX2ZpbmRKc05hbWVGcm9tQW5ub3RhdGlvbigKICAgICAgaXIuTWVtYmVyIG5vZGUsIElyQW5ub3RhdGlvbkRhdGEgYW5ub3RhdGlvbkRhdGEpIHsKICAgIFN0cmluZyBqc05hbWU7CiAgICBpZiAoYW5ub3RhdGlvbkRhdGEgIT0gbnVsbCkgewogICAgICBqc05hbWUgPSBhbm5vdGF0aW9uRGF0YS5nZXROYXRpdmVNZW1iZXJOYW1lKG5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgU291cmNlU3BhbiBzb3VyY2VTcGFuID0gY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUobm9kZSk7CiAgICAgIGZvciAoQ29uc3RhbnRWYWx1ZSB2YWx1ZSBpbiBfZWxlbWVudEVudmlyb25tZW50CiAgICAgICAgICAuZ2V0TWVtYmVyTWV0YWRhdGEoX2VsZW1lbnRNYXAuZ2V0TWVtYmVyKG5vZGUpKSkgewogICAgICAgIFN0cmluZyBuYW1lID0gcmVhZEFubm90YXRpb25OYW1lKAogICAgICAgICAgICBzb3VyY2VTcGFuLCB2YWx1ZSwgX2NvbW1vbkVsZW1lbnRzLmFubm90YXRpb25KU05hbWVDbGFzcyk7CiAgICAgICAgaWYgKGpzTmFtZSA9PSBudWxsKSB7CiAgICAgICAgICBqc05hbWUgPSBuYW1lOwogICAgICAgIH0gZWxzZSBpZiAobmFtZSAhPSBudWxsKSB7CiAgICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgICBzb3VyY2VTcGFuLCAnVG9vIG1hbnkgSlNOYW1lIGFubm90YXRpb25zOiAke3ZhbHVlLnRvRGFydFRleHQoKX0nKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBqc05hbWU7CiAgfQoKICBOYXRpdmVCZWhhdmlvciBfY29tcHV0ZU5hdGl2ZUZpZWxkU3RvcmVCZWhhdmlvcihjb3ZhcmlhbnQgS0ZpZWxkIGZpZWxkKSB7CiAgICBpci5GaWVsZCBub2RlID0gX2VsZW1lbnRNYXAuZ2V0TWVtYmVyTm9kZShmaWVsZCk7CiAgICByZXR1cm4gX2VsZW1lbnRNYXAuZ2V0TmF0aXZlQmVoYXZpb3JGb3JGaWVsZFN0b3JlKG5vZGUpOwogIH0KCiAgTmF0aXZlQmVoYXZpb3IgX2NvbXB1dGVOYXRpdmVGaWVsZExvYWRCZWhhdmlvcigKICAgICAgS0ZpZWxkIGZpZWxkLCBJckFubm90YXRpb25EYXRhIGFubm90YXRpb25EYXRhLAogICAgICB7Ym9vbCBpc0pzSW50ZXJvcH0pIHsKICAgIGlyLkZpZWxkIG5vZGUgPSBfZWxlbWVudE1hcC5nZXRNZW1iZXJOb2RlKGZpZWxkKTsKICAgIEl0ZXJhYmxlPFN0cmluZz4gY3JlYXRlc0Fubm90YXRpb25zOwogICAgSXRlcmFibGU8U3RyaW5nPiByZXR1cm5zQW5ub3RhdGlvbnM7CiAgICBpZiAoYW5ub3RhdGlvbkRhdGEgIT0gbnVsbCkgewogICAgICBjcmVhdGVzQW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uRGF0YS5nZXRDcmVhdGVzQW5ub3RhdGlvbnMobm9kZSk7CiAgICAgIHJldHVybnNBbm5vdGF0aW9ucyA9IGFubm90YXRpb25EYXRhLmdldFJldHVybnNBbm5vdGF0aW9ucyhub2RlKTsKICAgIH0gZWxzZSB7CiAgICAgIExpc3Q8Q29uc3RhbnRWYWx1ZT4gbWV0YWRhdGEgPQogICAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRNZW1iZXJNZXRhZGF0YShmaWVsZCk7CiAgICAgIGNyZWF0ZXNBbm5vdGF0aW9ucyA9IGdldENyZWF0ZXNBbm5vdGF0aW9ucygKICAgICAgICAgIF9lbGVtZW50TWFwLnJlcG9ydGVyLCBfZWxlbWVudE1hcC5jb21tb25FbGVtZW50cywgbWV0YWRhdGEpOwogICAgICByZXR1cm5zQW5ub3RhdGlvbnMgPSBnZXRSZXR1cm5zQW5ub3RhdGlvbnMoCiAgICAgICAgICBfZWxlbWVudE1hcC5yZXBvcnRlciwgX2VsZW1lbnRNYXAuY29tbW9uRWxlbWVudHMsIG1ldGFkYXRhKTsKICAgIH0KICAgIHJldHVybiBfZWxlbWVudE1hcC5nZXROYXRpdmVCZWhhdmlvckZvckZpZWxkTG9hZCgKICAgICAgICBub2RlLCBjcmVhdGVzQW5ub3RhdGlvbnMsIHJldHVybnNBbm5vdGF0aW9ucywKICAgICAgICBpc0pzSW50ZXJvcDogaXNKc0ludGVyb3ApOwogIH0KCiAgTmF0aXZlQmVoYXZpb3IgX2NvbXB1dGVOYXRpdmVNZXRob2RCZWhhdmlvcigKICAgICAgS0Z1bmN0aW9uIGZ1bmN0aW9uLCBJckFubm90YXRpb25EYXRhIGFubm90YXRpb25EYXRhLAogICAgICB7Ym9vbCBpc0pzSW50ZXJvcH0pIHsKICAgIGlyLk1lbWJlciBub2RlID0gX2VsZW1lbnRNYXAuZ2V0TWVtYmVyTm9kZShmdW5jdGlvbik7CiAgICBJdGVyYWJsZTxTdHJpbmc+IGNyZWF0ZXNBbm5vdGF0aW9uczsKICAgIEl0ZXJhYmxlPFN0cmluZz4gcmV0dXJuc0Fubm90YXRpb25zOwogICAgaWYgKGFubm90YXRpb25EYXRhICE9IG51bGwpIHsKICAgICAgY3JlYXRlc0Fubm90YXRpb25zID0gYW5ub3RhdGlvbkRhdGEuZ2V0Q3JlYXRlc0Fubm90YXRpb25zKG5vZGUpOwogICAgICByZXR1cm5zQW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uRGF0YS5nZXRSZXR1cm5zQW5ub3RhdGlvbnMobm9kZSk7CiAgICB9IGVsc2UgewogICAgICBMaXN0PENvbnN0YW50VmFsdWU+IG1ldGFkYXRhID0KICAgICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0TWVtYmVyTWV0YWRhdGEoZnVuY3Rpb24pOwogICAgICBjcmVhdGVzQW5ub3RhdGlvbnMgPSBnZXRDcmVhdGVzQW5ub3RhdGlvbnMoCiAgICAgICAgICBfZWxlbWVudE1hcC5yZXBvcnRlciwgX2VsZW1lbnRNYXAuY29tbW9uRWxlbWVudHMsIG1ldGFkYXRhKTsKICAgICAgcmV0dXJuc0Fubm90YXRpb25zID0gZ2V0UmV0dXJuc0Fubm90YXRpb25zKAogICAgICAgICAgX2VsZW1lbnRNYXAucmVwb3J0ZXIsIF9lbGVtZW50TWFwLmNvbW1vbkVsZW1lbnRzLCBtZXRhZGF0YSk7CiAgICB9CiAgICByZXR1cm4gX2VsZW1lbnRNYXAuZ2V0TmF0aXZlQmVoYXZpb3JGb3JNZXRob2QoCiAgICAgICAgbm9kZSwgY3JlYXRlc0Fubm90YXRpb25zLCByZXR1cm5zQW5ub3RhdGlvbnMsCiAgICAgICAgaXNKc0ludGVyb3A6IGlzSnNJbnRlcm9wKTsKICB9CgogIGJvb2wgX2lzTmF0aXZlTWV0aG9kKGlyLk1lbWJlciBub2RlLCBJckFubm90YXRpb25EYXRhIGFubm90YXRpb25EYXRhKSB7CiAgICBpZiAoIW1heWJlRW5hYmxlTmF0aXZlKG5vZGUuZW5jbG9zaW5nTGlicmFyeS5pbXBvcnRVcmkpKSByZXR1cm4gZmFsc2U7CiAgICBib29sIGhhc05hdGl2ZUJvZHk7CiAgICBpZiAoYW5ub3RhdGlvbkRhdGEgIT0gbnVsbCkgewogICAgICBoYXNOYXRpdmVCb2R5ID0gYW5ub3RhdGlvbkRhdGEuaGFzTmF0aXZlQm9keShub2RlKTsKICAgIH0gZWxzZSB7CiAgICAgIGhhc05hdGl2ZUJvZHkgPSBub2RlLmFubm90YXRpb25zLmFueSgoaXIuRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24gaXMgaXIuQ29uc3RydWN0b3JJbnZvY2F0aW9uICYmCiAgICAgICAgICAgIF9lbGVtZW50TWFwLmdldEludGVyZmFjZVR5cGUoZXhwcmVzc2lvbi5jb25zdHJ1Y3RlZFR5cGUpID09CiAgICAgICAgICAgICAgICBfY29tbW9uRWxlbWVudHMuZXh0ZXJuYWxOYW1lVHlwZTsKICAgICAgfSk7CiAgICB9CiAgICBpZiAoIWhhc05hdGl2ZUJvZHkgJiYKICAgICAgICBub2RlLmlzRXh0ZXJuYWwgJiYKICAgICAgICAhX25hdGl2ZUJhc2ljRGF0YS5pc0pzSW50ZXJvcE1lbWJlcihfZWxlbWVudE1hcC5nZXRNZW1iZXIobm9kZSkpKSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFNob3VsZCB3ZSBjaGFuZ2UgZGFydDpodG1sIGFuZCBmcmllbmRzIHRvIHVzZQogICAgICAvLyAgYGV4dGVybmFsYCBpbnN0ZWFkIG9mIHRoZSBuYXRpdmUgYm9keSBzeW50YXg/CiAgICAgIF9lbGVtZW50TWFwLnJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKG5vZGUpLCBNZXNzYWdlS2luZC5OT05fTkFUSVZFX0VYVEVSTkFMKTsKICAgIH0KICAgIHJldHVybiBoYXNOYXRpdmVCb2R5OwogIH0KCiAgYm9vbCBfaXNKc0ludGVyb3BNZW1iZXIoaXIuTWVtYmVyIG5vZGUpIHsKICAgIHJldHVybiBfbmF0aXZlQmFzaWNEYXRhLmlzSnNJbnRlcm9wTWVtYmVyKF9lbGVtZW50TWFwLmdldE1lbWJlcihub2RlKSk7CiAgfQp9CgpjbGFzcyBLZXJuZWxDbGFzc1F1ZXJpZXMgZXh0ZW5kcyBDbGFzc1F1ZXJpZXMgewogIGZpbmFsIEtlcm5lbFRvRWxlbWVudE1hcEltcGwgZWxlbWVudE1hcDsKCiAgS2VybmVsQ2xhc3NRdWVyaWVzKHRoaXMuZWxlbWVudE1hcCk7CgogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldERlY2xhcmF0aW9uKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGNsczsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPEludGVyZmFjZVR5cGU+IGdldFN1cGVydHlwZXMoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5nZXRPcmRlcmVkVHlwZVNldChjbHMpLnN1cGVydHlwZXM7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXRTdXBlckNsYXNzKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuZ2V0U3VwZXJUeXBlKGNscyk/LmVsZW1lbnQ7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGltcGxlbWVudHNGdW5jdGlvbihDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBlbGVtZW50TWFwLl9pbXBsZW1lbnRzRnVuY3Rpb24oY2xzKTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXRIaWVyYXJjaHlEZXB0aChDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBlbGVtZW50TWFwLmdldEhpZXJhcmNoeURlcHRoKGNscyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXRBcHBsaWVkTWl4aW4oQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5nZXRBcHBsaWVkTWl4aW4oY2xzKTsKICB9Cn0KCkRpYWdub3N0aWNNZXNzYWdlIF9jcmVhdGVEaWFnbm9zdGljTWVzc2FnZSgKICAgIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwgaXIuTG9jYXRlZE1lc3NhZ2UgbWVzc2FnZSkgewogIFNvdXJjZVNwYW4gc291cmNlU3BhbiA9IG5ldyBTb3VyY2VTcGFuKAogICAgICBtZXNzYWdlLnVyaSwgbWVzc2FnZS5jaGFyT2Zmc2V0LCBtZXNzYWdlLmNoYXJPZmZzZXQgKyBtZXNzYWdlLmxlbmd0aCk7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BhoEASxMBAIBMCsBJwEMMBAEAQw7OQQBDC8yBAEMLTAEAQwrLgQBDDEsBAIBLD4qTSFDAgE3QigzJi88BDICATFwYWNrYWdlOmNvbXBpbGVyL3NyYy9rZXJuZWwvZWxlbWVudF9tYXBfaW1wbC5kYXJ0O3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2tlcm5lbC9uYXRpdmVfYmFzaWNfZGF0YS5kYXJ0tMsvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWFrZSB0aGlzIGEgc2VwYXJhdGUgbGlicmFyeS4KcGFydCBvZiBkYXJ0MmpzLmtlcm5lbC5lbGVtZW50X21hcDsKCmNsYXNzIEtlcm5lbEFubm90YXRpb25Qcm9jZXNzb3IgaW1wbGVtZW50cyBBbm5vdGF0aW9uUHJvY2Vzc29yIHsKICBmaW5hbCBLZXJuZWxUb0VsZW1lbnRNYXBJbXBsIGVsZW1lbnRNYXA7CiAgZmluYWwgTmF0aXZlQmFzaWNEYXRhQnVpbGRlciBfbmF0aXZlQmFzaWNEYXRhQnVpbGRlcjsKICBmaW5hbCBJckFubm90YXRpb25EYXRhIGFubm90YXRpb25EYXRhOwoKICBLZXJuZWxBbm5vdGF0aW9uUHJvY2Vzc29yKAogICAgICB0aGlzLmVsZW1lbnRNYXAsIHRoaXMuX25hdGl2ZUJhc2ljRGF0YUJ1aWxkZXIsIHRoaXMuYW5ub3RhdGlvbkRhdGEpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGV4dHJhY3ROYXRpdmVBbm5vdGF0aW9ucyhMaWJyYXJ5RW50aXR5IGxpYnJhcnkpIHsKICAgIEtFbGVtZW50RW52aXJvbm1lbnQgZWxlbWVudEVudmlyb25tZW50ID0gZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQ7CiAgICBLQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMgPSBlbGVtZW50TWFwLmNvbW1vbkVsZW1lbnRzOwoKICAgIGVsZW1lbnRFbnZpcm9ubWVudC5mb3JFYWNoQ2xhc3MobGlicmFyeSwgKENsYXNzRW50aXR5IGNscykgewogICAgICBpci5DbGFzcyBub2RlID0gZWxlbWVudE1hcC5nZXRDbGFzc05vZGUoY2xzKTsKICAgICAgU3RyaW5nIGFubm90YXRpb25OYW1lOwogICAgICBpZiAoYW5ub3RhdGlvbkRhdGEgIT0gbnVsbCkgewogICAgICAgIGFubm90YXRpb25OYW1lID0gYW5ub3RhdGlvbkRhdGEuZ2V0TmF0aXZlQ2xhc3NOYW1lKG5vZGUpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSB0aGlzIGJyYW5jaCB3aGVuIHdlIHVzZSBjb25zdGFudHMgZnJvbQogICAgICAgIC8vIENGRS4KICAgICAgICBmb3IgKENvbnN0YW50VmFsdWUgdmFsdWUgaW4gZWxlbWVudEVudmlyb25tZW50LmdldENsYXNzTWV0YWRhdGEoY2xzKSkgewogICAgICAgICAgU3RyaW5nIG5hbWUgPSByZWFkQW5ub3RhdGlvbk5hbWUoCiAgICAgICAgICAgICAgY2xzLCB2YWx1ZSwgY29tbW9uRWxlbWVudHMubmF0aXZlQW5ub3RhdGlvbkNsYXNzKTsKICAgICAgICAgIGlmIChhbm5vdGF0aW9uTmFtZSA9PSBudWxsKSB7CiAgICAgICAgICAgIGFubm90YXRpb25OYW1lID0gbmFtZTsKICAgICAgICAgIH0gZWxzZSBpZiAobmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgIGZhaWxlZEF0KGNscywgJ1RvbyBtYW55IG5hbWUgYW5ub3RhdGlvbnMuJyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChhbm5vdGF0aW9uTmFtZSAhPSBudWxsKSB7CiAgICAgICAgX25hdGl2ZUJhc2ljRGF0YUJ1aWxkZXIuc2V0TmF0aXZlQ2xhc3NUYWdJbmZvKGNscywgYW5ub3RhdGlvbk5hbWUpOwogICAgICB9CiAgICB9KTsKICB9CgogIFN0cmluZyBnZXRKc0ludGVyb3BOYW1lKAogICAgICBTcGFubmFibGUgc3Bhbm5hYmxlLCBJdGVyYWJsZTxDb25zdGFudFZhbHVlPiBtZXRhZGF0YSkgewogICAgS0NvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzID0gZWxlbWVudE1hcC5jb21tb25FbGVtZW50czsKICAgIFN0cmluZyBhbm5vdGF0aW9uTmFtZTsKICAgIGZvciAoQ29uc3RhbnRWYWx1ZSB2YWx1ZSBpbiBtZXRhZGF0YSkgewogICAgICBTdHJpbmcgbmFtZSA9IHJlYWRBbm5vdGF0aW9uTmFtZSgKICAgICAgICAgIHNwYW5uYWJsZSwgdmFsdWUsIGNvbW1vbkVsZW1lbnRzLmpzQW5ub3RhdGlvbkNsYXNzLAogICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJyk7CiAgICAgIGlmIChhbm5vdGF0aW9uTmFtZSA9PSBudWxsKSB7CiAgICAgICAgYW5ub3RhdGlvbk5hbWUgPSBuYW1lOwogICAgICB9IGVsc2UgaWYgKG5hbWUgIT0gbnVsbCkgewogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFRoaXMgc2hvdWxkIGJlIGFuIGVycm9yLCBub3QgYSBjcmFzaC4KICAgICAgICBmYWlsZWRBdChzcGFubmFibGUsICdUb28gbWFueSBuYW1lIGFubm90YXRpb25zLicpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYW5ub3RhdGlvbk5hbWU7CiAgfQoKICB2b2lkIGNoZWNrRnVuY3Rpb25QYXJhbWV0ZXJzKEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uKSB7CiAgICBpZiAoZnVuY3Rpb24ucGFyYW1ldGVyU3RydWN0dXJlLm5hbWVkUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgIGVsZW1lbnRNYXAucmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgICAgZnVuY3Rpb24sCiAgICAgICAgICBNZXNzYWdlS2luZC5KU19JTlRFUk9QX01FVEhPRF9XSVRIX05BTUVEX0FSR1VNRU5UUywKICAgICAgICAgIHsnbWV0aG9kJzogZnVuY3Rpb24ubmFtZX0pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBleHRyYWN0SnNJbnRlcm9wQW5ub3RhdGlvbnMoTGlicmFyeUVudGl0eSBsaWJyYXJ5KSB7CiAgICBEaWFnbm9zdGljUmVwb3J0ZXIgcmVwb3J0ZXIgPSBlbGVtZW50TWFwLnJlcG9ydGVyOwogICAgS0VsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQgPSBlbGVtZW50TWFwLmVsZW1lbnRFbnZpcm9ubWVudDsKICAgIEtDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cyA9IGVsZW1lbnRNYXAuY29tbW9uRWxlbWVudHM7CgogICAgaXIuTGlicmFyeSBsaWJyYXJ5Tm9kZSA9IGVsZW1lbnRNYXAuZ2V0TGlicmFyeU5vZGUobGlicmFyeSk7CiAgICBTdHJpbmcgbGlicmFyeU5hbWU7CiAgICBpZiAoYW5ub3RhdGlvbkRhdGEgIT0gbnVsbCkgewogICAgICBsaWJyYXJ5TmFtZSA9IGFubm90YXRpb25EYXRhLmdldEpzSW50ZXJvcExpYnJhcnlOYW1lKGxpYnJhcnlOb2RlKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSB0aGlzIHdoZW4gd2UgdXNlIGNvbnN0YW50cyBmcm9tIENGRS4KICAgICAgbGlicmFyeU5hbWUgPSBnZXRKc0ludGVyb3BOYW1lKAogICAgICAgICAgbGlicmFyeSwgZWxlbWVudEVudmlyb25tZW50LmdldExpYnJhcnlNZXRhZGF0YShsaWJyYXJ5KSk7CiAgICB9CiAgICBmaW5hbCBib29sIGlzRXhwbGljaXRseWx5SnNMaWJyYXJ5ID0gbGlicmFyeU5hbWUgIT0gbnVsbDsKICAgIGJvb2wgaXNKc0xpYnJhcnkgPSBpc0V4cGxpY2l0bHlseUpzTGlicmFyeTsKCiAgICBlbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaExpYnJhcnlNZW1iZXIobGlicmFyeSwgKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgICAgaXIuTWVtYmVyIG1lbWJlck5vZGUgPSBlbGVtZW50TWFwLmdldE1lbWJlck5vZGUobWVtYmVyKTsKICAgICAgU3RyaW5nIG1lbWJlck5hbWU7CiAgICAgIGlmIChhbm5vdGF0aW9uRGF0YSAhPSBudWxsKSB7CiAgICAgICAgbWVtYmVyTmFtZSA9IGFubm90YXRpb25EYXRhLmdldEpzSW50ZXJvcE1lbWJlck5hbWUobWVtYmVyTm9kZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMgd2hlbiB3ZSB1c2UgY29uc3RhbnRzIGZyb20gQ0ZFLgogICAgICAgIG1lbWJlck5hbWUgPSBnZXRKc0ludGVyb3BOYW1lKAogICAgICAgICAgICBsaWJyYXJ5LCBlbGVtZW50RW52aXJvbm1lbnQuZ2V0TWVtYmVyTWV0YWRhdGEobWVtYmVyKSk7CiAgICAgIH0KICAgICAgaWYgKG1lbWJlci5pc0ZpZWxkKSB7CiAgICAgICAgaWYgKG1lbWJlck5hbWUgIT0gbnVsbCkgewogICAgICAgICAgLy8gVE9ETygzNDE3NCk6IERpc2FsbG93IGpzLWludGVyb3AgZmllbGRzLgogICAgICAgICAgLypyZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICAgICAgbWVtYmVyLCBNZXNzYWdlS2luZC5KU19JTlRFUk9QX0ZJRUxEX05PVF9TVVBQT1JURUQpOyovCiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uID0gbWVtYmVyOwogICAgICAgIGlmIChmdW5jdGlvbi5pc0V4dGVybmFsICYmIGlzRXhwbGljaXRseWx5SnNMaWJyYXJ5KSB7CiAgICAgICAgICAvLyBFeHRlcm5hbCBtZW1iZXJzIG9mIGV4cGxpY2l0IGpzLWludGVyb3AgbGlicmFyeSBhcmUgaW1wbGljaXRseQogICAgICAgICAgLy8ganMtaW50ZXJvcCBtZW1iZXJzLgogICAgICAgICAgbWVtYmVyTmFtZSA/Pz0gZnVuY3Rpb24ubmFtZTsKICAgICAgICB9CiAgICAgICAgaWYgKG1lbWJlck5hbWUgIT0gbnVsbCkgewogICAgICAgICAgaWYgKCFmdW5jdGlvbi5pc0V4dGVybmFsKSB7CiAgICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IERpc2FsbG93IG5vbi1leHRlcm5hbCBqcy1pbnRlcm9wIG1lbWJlcnMuCiAgICAgICAgICAgIC8qcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgICAgICAgICAgZnVuY3Rpb24sIE1lc3NhZ2VLaW5kLkpTX0lOVEVST1BfTk9OX0VYVEVSTkFMX01FTUJFUik7Ki8KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9uYXRpdmVCYXNpY0RhdGFCdWlsZGVyLm1hcmtBc0pzSW50ZXJvcE1lbWJlcihmdW5jdGlvbiwgbWVtYmVyTmFtZSk7CiAgICAgICAgICAgIGNoZWNrRnVuY3Rpb25QYXJhbWV0ZXJzKGZ1bmN0aW9uKTsKICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogSXQgaXMgdW5jbGVhciB3aGV0aGVyIGxpYnJhcnkgY2FuIGJlCiAgICAgICAgICAgIC8vIGltcGxpY2l0bHkganMtaW50ZXJvcC4gRm9yIG5vdyB3ZSBhbGxvdyBpdC4KICAgICAgICAgICAgaXNKc0xpYnJhcnkgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoZnVuY3Rpb24uaXNFeHRlcm5hbCAmJgogICAgICAgICAgICAhY29tbW9uRWxlbWVudHMuaXNFeHRlcm5hbEFsbG93ZWQoZnVuY3Rpb24pKSB7CiAgICAgICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICAgICAgZnVuY3Rpb24sIE1lc3NhZ2VLaW5kLk5PTl9OQVRJVkVfRVhURVJOQUwpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CgogICAgZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hDbGFzcyhsaWJyYXJ5LCAoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICAgIEl0ZXJhYmxlPENvbnN0YW50VmFsdWU+IG1ldGFkYXRhOwogICAgICBpci5DbGFzcyBjbGFzc05vZGUgPSBlbGVtZW50TWFwLmdldENsYXNzTm9kZShjbHMpOwogICAgICBTdHJpbmcgY2xhc3NOYW1lOwogICAgICBpZiAoYW5ub3RhdGlvbkRhdGEgIT0gbnVsbCkgewogICAgICAgIGNsYXNzTmFtZSA9IGFubm90YXRpb25EYXRhLmdldEpzSW50ZXJvcENsYXNzTmFtZShjbGFzc05vZGUpOwogICAgICB9IGVsc2UgewogICAgICAgIG1ldGFkYXRhID0gZWxlbWVudEVudmlyb25tZW50LmdldENsYXNzTWV0YWRhdGEoY2xzKTsKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhpcyB3aGVuIHdlIHVzZSBjb25zdGFudHMgZnJvbSBDRkUuCiAgICAgICAgY2xhc3NOYW1lID0gZ2V0SnNJbnRlcm9wTmFtZShjbHMsIG1ldGFkYXRhKTsKICAgICAgfQogICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKICAgICAgICBib29sIGlzQW5vbnltb3VzOwogICAgICAgIGlmIChhbm5vdGF0aW9uRGF0YSAhPSBudWxsKSB7CiAgICAgICAgICBpc0Fub255bW91cyA9IGFubm90YXRpb25EYXRhLmlzQW5vbnltb3VzSnNJbnRlcm9wQ2xhc3MoY2xhc3NOb2RlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaXNBbm9ueW1vdXMgPSBmYWxzZTsKICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSB0aGlzIGJyYW5jaCB3aGVuIHdlIHVzZSBjb25zdGFudHMgZnJvbQogICAgICAgICAgLy8gQ0ZFLgogICAgICAgICAgZm9yIChDb25zdGFudFZhbHVlIHZhbHVlIGluIG1ldGFkYXRhKSB7CiAgICAgICAgICAgIGlmIChpc0Fubm90YXRpb24oY2xzLCB2YWx1ZSwgY29tbW9uRWxlbWVudHMuanNBbm9ueW1vdXNDbGFzcykpIHsKICAgICAgICAgICAgICBpc0Fub255bW91cyA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVwb3J0IGFuIGVycm9yIGlmIHRoZSBjbGFzcyBpcyBhbm9ueW1vdXMgYnV0CiAgICAgICAgLy8gaGFzIGEgbm9uLWVtcHR5IG5hbWUuCiAgICAgICAgX25hdGl2ZUJhc2ljRGF0YUJ1aWxkZXIubWFya0FzSnNJbnRlcm9wQ2xhc3MoY2xzLAogICAgICAgICAgICBuYW1lOiBjbGFzc05hbWUsIGlzQW5vbnltb3VzOiBpc0Fub255bW91cyk7CiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogSXQgaXMgdW5jbGVhciB3aGV0aGVyIGxpYnJhcnkgY2FuIGJlIGltcGxpY2l0bHkKICAgICAgICAvLyBqcy1pbnRlcm9wLiBGb3Igbm93IHdlIGFsbG93IGl0LgogICAgICAgIGlzSnNMaWJyYXJ5ID0gdHJ1ZTsKCiAgICAgICAgZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hMb2NhbENsYXNzTWVtYmVyKGNscywgKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgICAgICAgIGlmIChtZW1iZXIuaXNGaWVsZCkgewogICAgICAgICAgICAvLyBUT0RPKDM0MTc0KTogRGlzYWxsb3cganMtaW50ZXJvcCBmaWVsZHMuCiAgICAgICAgICAgIC8qcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgICAgICAgICAgbWVtYmVyLCBNZXNzYWdlS2luZC5JTVBMSUNJVF9KU19JTlRFUk9QX0ZJRUxEX05PVF9TVVBQT1JURUQpOyovCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiA9IG1lbWJlcjsKICAgICAgICAgICAgaXIuTWVtYmVyIG1lbWJlck5vZGUgPSBlbGVtZW50TWFwLmdldE1lbWJlck5vZGUobWVtYmVyKTsKICAgICAgICAgICAgU3RyaW5nIG1lbWJlck5hbWU7CiAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uRGF0YSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgbWVtYmVyTmFtZSA9IGFubm90YXRpb25EYXRhLmdldEpzSW50ZXJvcE1lbWJlck5hbWUobWVtYmVyTm9kZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMgd2hlbiB3ZSB1c2UgY29uc3RhbnRzIGZyb20gQ0ZFLgogICAgICAgICAgICAgIG1lbWJlck5hbWUgPSBnZXRKc0ludGVyb3BOYW1lKAogICAgICAgICAgICAgICAgICBsaWJyYXJ5LCBlbGVtZW50RW52aXJvbm1lbnQuZ2V0TWVtYmVyTWV0YWRhdGEoZnVuY3Rpb24pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZnVuY3Rpb24uaXNFeHRlcm5hbCkgewogICAgICAgICAgICAgIG1lbWJlck5hbWUgPz89IGZ1bmN0aW9uLm5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1lbWJlck5hbWUgIT0gbnVsbCkgewogICAgICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFRoZSBkb2N1bWVudGF0aW9uIHN0YXRlcyB0aGF0IGV4cGxpY2l0CiAgICAgICAgICAgICAgLy8gbWVtYmVyIG5hbWUgYW5ub3RhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIG9uIGluc3RhbmNlIG1lbWJlcnMuCiAgICAgICAgICAgICAgX25hdGl2ZUJhc2ljRGF0YUJ1aWxkZXIubWFya0FzSnNJbnRlcm9wTWVtYmVyKAogICAgICAgICAgICAgICAgICBmdW5jdGlvbiwgbWVtYmVyTmFtZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghZnVuY3Rpb24uaXNFeHRlcm5hbCAmJgogICAgICAgICAgICAgICAgIWZ1bmN0aW9uLmlzQWJzdHJhY3QgJiYKICAgICAgICAgICAgICAgICFmdW5jdGlvbi5pc1N0YXRpYykgewogICAgICAgICAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCiAgICAgICAgICAgICAgICAgIE1lc3NhZ2VLaW5kLkpTX0lOVEVST1BfQ0xBU1NfTk9OX0VYVEVSTkFMX01FTUJFUiwKICAgICAgICAgICAgICAgICAgeydjbHMnOiBjbHMubmFtZSwgJ21lbWJlcic6IG1lbWJlci5uYW1lfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNoZWNrRnVuY3Rpb25QYXJhbWV0ZXJzKGZ1bmN0aW9uKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBlbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaENvbnN0cnVjdG9yKGNscywKICAgICAgICAgICAgKENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yKSB7CiAgICAgICAgICBTdHJpbmcgbWVtYmVyTmFtZSA9IGdldEpzSW50ZXJvcE5hbWUoCiAgICAgICAgICAgICAgbGlicmFyeSwgZWxlbWVudEVudmlyb25tZW50LmdldE1lbWJlck1ldGFkYXRhKGNvbnN0cnVjdG9yKSk7CiAgICAgICAgICBpZiAoY29uc3RydWN0b3IuaXNFeHRlcm5hbCkgewogICAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBJdCBzaG91bGQgcHJvYmFibHkgYmUgYW4gZXJyb3IgdG8gaGF2ZSBhCiAgICAgICAgICAgIC8vIG5vLW5hbWUgY29uc3RydWN0b3Igd2l0aG91dCBhIEBKUygpIGFubm90YXRpb24uCiAgICAgICAgICAgIG1lbWJlck5hbWUgPz89IGNvbnN0cnVjdG9yLm5hbWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobWVtYmVyTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFRoZSBkb2N1bWVudGF0aW9uIHN0YXRlcyB0aGF0IGV4cGxpY2l0CiAgICAgICAgICAgIC8vIG1lbWJlciBuYW1lIGFubm90YXRpb25zIGFyZSBub3QgYWxsb3dlZCBvbiBpbnN0YW5jZSBtZW1iZXJzLgogICAgICAgICAgICBfbmF0aXZlQmFzaWNEYXRhQnVpbGRlci5tYXJrQXNKc0ludGVyb3BNZW1iZXIoCiAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciwgbWVtYmVyTmFtZSk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gVE9ETygzMzgzNCk6IEl0IGlzIGEgYnJlYWtpbmcgY2hhbmdlIChhdCBsZWFzdCBhZ2FpbnN0IGluIHNvbWUgb2YKICAgICAgICAgIC8vIG91ciBvd24gdGVzdHMpIGJ1dCBKUy1pbnRlcm9wIGNvbnN0cnVjdG9ycyBzaG91bGQgYmUgcmVxdWlyZWQgdG8gYmUKICAgICAgICAgIC8vIGV4dGVybmFsIHNpbmNlIHdlIG90aGVyd2lzZSBhbGxvdyBjcmVhdGluZyBhIERhcnQgb2JqZWN0IHRoYXQgdHJpZXMKICAgICAgICAgIC8vIHRvIHBhc3MgYXMgYSBKUy1pbnRlcm9wIGNsYXNzLgogICAgICAgICAgLyppZiAoIWNvbnN0cnVjdG9yLmlzRXh0ZXJuYWwpIHsKICAgICAgICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKGNvbnN0cnVjdG9yLAogICAgICAgICAgICAgICAgTWVzc2FnZUtpbmQuSlNfSU5URVJPUF9DTEFTU19OT05fRVhURVJOQUxfQ09OU1RSVUNUT1IsIHsKICAgICAgICAgICAgICAnY2xzJzogY2xzLm5hbWUsCiAgICAgICAgICAgICAgJ2NvbnN0cnVjdG9yJzoKICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IubmFtZS5pc0VtcHR5ID8gJyR7Y2xzLm5hbWV9LicgOiBjb25zdHJ1Y3Rvci5uYW1lCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSovCgogICAgICAgICAgaWYgKGNvbnN0cnVjdG9yLmlzRmFjdG9yeUNvbnN0cnVjdG9yICYmIGlzQW5vbnltb3VzKSB7CiAgICAgICAgICAgIGlmIChjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJTdHJ1Y3R1cmUucG9zaXRpb25hbFBhcmFtZXRlcnMgPiAwKSB7CiAgICAgICAgICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciwKICAgICAgICAgICAgICAgICAgTWVzc2FnZUtpbmQKICAgICAgICAgICAgICAgICAgICAgIC5KU19PQkpFQ1RfTElURVJBTF9DT05TVFJVQ1RPUl9XSVRIX1BPU0lUSU9OQUxfQVJHVU1FTlRTLAogICAgICAgICAgICAgICAgICB7J2Nscyc6IGNscy5uYW1lfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNoZWNrRnVuY3Rpb25QYXJhbWV0ZXJzKGNvbnN0cnVjdG9yKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaExvY2FsQ2xhc3NNZW1iZXIoY2xzLCAoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgICAgICAgU3RyaW5nIG1lbWJlck5hbWUgPSBnZXRKc0ludGVyb3BOYW1lKAogICAgICAgICAgICAgIGxpYnJhcnksIGVsZW1lbnRFbnZpcm9ubWVudC5nZXRNZW1iZXJNZXRhZGF0YShtZW1iZXIpKTsKICAgICAgICAgIGlmIChtZW1iZXJOYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgICAgICAgICAgbWVtYmVyLCBNZXNzYWdlS2luZC5KU19JTlRFUk9QX01FTUJFUl9JTl9OT05fSlNfSU5URVJPUF9DTEFTUyk7CiAgICAgICAgICB9IGVsc2UgaWYgKG1lbWJlciBpcyBGdW5jdGlvbkVudGl0eSkgewogICAgICAgICAgICBpZiAobWVtYmVyLmlzRXh0ZXJuYWwgJiYKICAgICAgICAgICAgICAgICFjb21tb25FbGVtZW50cy5pc0V4dGVybmFsQWxsb3dlZChtZW1iZXIpKSB7CiAgICAgICAgICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgICAgICAgICAgICBtZW1iZXIsIE1lc3NhZ2VLaW5kLk5PTl9OQVRJVkVfRVhURVJOQUwpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hDb25zdHJ1Y3RvcihjbHMsCiAgICAgICAgICAgIChDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvcikgewogICAgICAgICAgU3RyaW5nIG1lbWJlck5hbWUgPSBnZXRKc0ludGVyb3BOYW1lKAogICAgICAgICAgICAgIGxpYnJhcnksIGVsZW1lbnRFbnZpcm9ubWVudC5nZXRNZW1iZXJNZXRhZGF0YShjb25zdHJ1Y3RvcikpOwogICAgICAgICAgaWYgKG1lbWJlck5hbWUgIT0gbnVsbCkgewogICAgICAgICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoY29uc3RydWN0b3IsCiAgICAgICAgICAgICAgICBNZXNzYWdlS2luZC5KU19JTlRFUk9QX01FTUJFUl9JTl9OT05fSlNfSU5URVJPUF9DTEFTUyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoY29uc3RydWN0b3IuaXNFeHRlcm5hbCAmJgogICAgICAgICAgICAgICAgIWNvbW1vbkVsZW1lbnRzLmlzRXh0ZXJuYWxBbGxvd2VkKGNvbnN0cnVjdG9yKSkgewogICAgICAgICAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IsIE1lc3NhZ2VLaW5kLk5PTl9OQVRJVkVfRVhURVJOQUwpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwoKICAgIGlmIChpc0pzTGlicmFyeSkgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBJdCBpcyB1bmNsZWFyIHdoZXRoZXIgbGlicmFyeSBjYW4gYmUgaW1wbGljaXRseQogICAgICAvLyBqcy1pbnRlcm9wLiBGb3Igbm93IHdlIGFsbG93IGl0IGFuZCBhc3N1bWUgdGhlIGVtcHR5IG5hbWUuCiAgICAgIGxpYnJhcnlOYW1lID8/PSAnJzsKICAgICAgX25hdGl2ZUJhc2ljRGF0YUJ1aWxkZXIubWFya0FzSnNJbnRlcm9wTGlicmFyeShsaWJyYXJ5LAogICAgICAgICAgbmFtZTogbGlicmFyeU5hbWUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcm9jZXNzSnNJbnRlcm9wQW5ub3RhdGlvbnMoCiAgICAgIE5hdGl2ZUJhc2ljRGF0YSBuYXRpdmVCYXNpY0RhdGEsIE5hdGl2ZURhdGFCdWlsZGVyIG5hdGl2ZURhdGFCdWlsZGVyKSB7CiAgICBEaWFnbm9zdGljUmVwb3J0ZXIgcmVwb3J0ZXIgPSBlbGVtZW50TWFwLnJlcG9ydGVyOwogICAgS0VsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQgPSBlbGVtZW50TWFwLmVsZW1lbnRFbnZpcm9ubWVudDsKICAgIEtDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cyA9IGVsZW1lbnRNYXAuY29tbW9uRWxlbWVudHM7CgogICAgZm9yIChMaWJyYXJ5RW50aXR5IGxpYnJhcnkgaW4gZWxlbWVudEVudmlyb25tZW50LmxpYnJhcmllcykgewogICAgICAvLyBFcnJvciBjaGVja2luZyBmb3IgY2xhc3MgaW5oZXJpdGFuY2UgbXVzdCBoYXBwZW4gYWZ0ZXIgdGhlIGZpcnN0IHBhc3MKICAgICAgLy8gdGhyb3VnaCBhbGwgdGhlIGNsYXNzZXMgYmVjYXVzZSBpdCBpcyBwb3NzaWJsZSB0byBkZWNsYXJlIGEgc3ViY2xhc3MKICAgICAgLy8gYmVmb3JlIGEgc3VwZXJjbGFzcyB0aGF0IGhhcyBub3QgeWV0IGhhZCAibWFya0pzSW50ZXJvcENsYXNzIiBjYWxsZWQgb24KICAgICAgLy8gaXQuCiAgICAgIGVsZW1lbnRFbnZpcm9ubWVudC5mb3JFYWNoQ2xhc3MobGlicmFyeSwgKENsYXNzRW50aXR5IGNscykgewogICAgICAgIGlyLkNsYXNzIGNsYXNzTm9kZSA9IGVsZW1lbnRNYXAuZ2V0Q2xhc3NOb2RlKGNscyk7CiAgICAgICAgU3RyaW5nIGNsYXNzTmFtZTsKICAgICAgICBpZiAoYW5ub3RhdGlvbkRhdGEgIT0gbnVsbCkgewogICAgICAgICAgY2xhc3NOYW1lID0gYW5ub3RhdGlvbkRhdGEuZ2V0SnNJbnRlcm9wQ2xhc3NOYW1lKGNsYXNzTm9kZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSB0aGlzIHdoZW4gd2UgdXNlIGNvbnN0YW50cyBmcm9tIENGRS4KICAgICAgICAgIGNsYXNzTmFtZSA/Pz0KICAgICAgICAgICAgICBnZXRKc0ludGVyb3BOYW1lKGNscywgZWxlbWVudEVudmlyb25tZW50LmdldENsYXNzTWV0YWRhdGEoY2xzKSk7CiAgICAgICAgfQogICAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkgewogICAgICAgICAgYm9vbCBpbXBsZW1lbnRzSnNKYXZhU2NyaXB0T2JqZWN0Q2xhc3MgPSBmYWxzZTsKICAgICAgICAgIGVsZW1lbnRFbnZpcm9ubWVudC5mb3JFYWNoU3VwZXJ0eXBlKGNscywgKEludGVyZmFjZVR5cGUgc3VwZXJ0eXBlKSB7CiAgICAgICAgICAgIGlmIChzdXBlcnR5cGUuZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5qc0phdmFTY3JpcHRPYmplY3RDbGFzcykgewogICAgICAgICAgICAgIGltcGxlbWVudHNKc0phdmFTY3JpcHRPYmplY3RDbGFzcyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKCFpbXBsZW1lbnRzSnNKYXZhU2NyaXB0T2JqZWN0Q2xhc3MpIHsKICAgICAgICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgICAgICAgICAgY2xzLCBNZXNzYWdlS2luZC5KU19JTlRFUk9QX0NMQVNTX0NBTk5PVF9FWFRFTkRfREFSVF9DTEFTUywgewogICAgICAgICAgICAgICdjbHMnOiBjbHMubmFtZSwKICAgICAgICAgICAgICAnc3VwZXJjbGFzcyc6IGVsZW1lbnRFbnZpcm9ubWVudC5nZXRTdXBlckNsYXNzKGNscykubmFtZQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0KfQqBSgBOTjwBNiQBQSs4KQEdSwEMOUxAAUE0HSRCD04QUCxBKCMlOQwKCCRMCAgEARs/QBssKD4dJB8hRjsIBhsEATpCLhQ+JgYEAQw8N0xAAUEYIkkNSiZEBj4wAU0/GSRID0wnRAgcIjYpRQoPKj5MISgKIiZOK0kTUS9JOyAMKjsnOgoICAFBKDkYJEUPPUw1CB8aJk0RH1ASMk0iFQ4MCk4hOjhQLBwBUCA4K1ATLkUfKk4VUi1MDicsDiZNTj0pDgEoKCYrHEQ9DgEvDAwzLjBLKE0/LQwkS0w7KgwBT1FRLCs1SR8dTxAOAUFLKx8eUCYOEzIMDA9QMEYkKVAxJT0rPA4MDDMuMEskNUgTKkIrQQ4MDAgIARdORBo+HgYEAQwkTjdMQAFCT05RDUM7GiZHEU4YTwohOk9POA4ONClOH0cQDAoKBgQCATJwYWNrYWdlOmNvbXBpbGVyL3NyYy9rZXJuZWwvbmF0aXZlX2Jhc2ljX2RhdGEuZGFydEFzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9rZXJuZWwvbm9fc3VjaF9tZXRob2RfcmVzb2x2ZXIuZGFydIlTLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydDJqcy5rZXJuZWwuZWxlbWVudF9tYXA7CgpjbGFzcyBLZXJuZWxOb1N1Y2hNZXRob2RSZXNvbHZlciBpbXBsZW1lbnRzIE5vU3VjaE1ldGhvZFJlc29sdmVyIHsKICBmaW5hbCBLZXJuZWxUb0VsZW1lbnRNYXBJbXBsIGVsZW1lbnRNYXA7CgogIEtlcm5lbE5vU3VjaE1ldGhvZFJlc29sdmVyKHRoaXMuZWxlbWVudE1hcCk7CgogIEVsZW1lbnRFbnZpcm9ubWVudCBnZXQgX2VsZW1lbnRFbnZpcm9ubWVudCA9PiBlbGVtZW50TWFwLmVsZW1lbnRFbnZpcm9ubWVudDsKCiAgQ29tbW9uRWxlbWVudHMgZ2V0IF9jb21tb25FbGVtZW50cyA9PiBlbGVtZW50TWFwLmNvbW1vbkVsZW1lbnRzOwoKICBAb3ZlcnJpZGUKICBib29sIGhhc0ZvcndhcmRpbmdTeW50YXgoS0Z1bmN0aW9uIG1ldGhvZCkgewogICAgaXIuUHJvY2VkdXJlIG5vZGUgPSBlbGVtZW50TWFwLl9sb29rdXBQcm9jZWR1cmUobWV0aG9kKTsKICAgIGlmIChub2RlLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmlzRW1wdHkpIHJldHVybiBmYWxzZTsKICAgIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gZmlyc3RQYXJhbWV0ZXIgPQogICAgICAgIG5vZGUuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMuZmlyc3Q7CiAgICBpci5TdGF0ZW1lbnQgYm9keSA9IG5vZGUuZnVuY3Rpb24uYm9keTsKICAgIGlyLkV4cHJlc3Npb24gZXhwcjsKICAgIGlmIChib2R5IGlzIGlyLkJsb2NrICYmIGJvZHkuc3RhdGVtZW50cy5pc05vdEVtcHR5KSB7CiAgICAgIGlyLkJsb2NrIGJsb2NrID0gYm9keTsKICAgICAgYm9keSA9IGJsb2NrLnN0YXRlbWVudHMuZmlyc3Q7CiAgICB9CiAgICBpZiAoYm9keSBpcyBpci5SZXR1cm5TdGF0ZW1lbnQpIHsKICAgICAgZXhwciA9IGJvZHkuZXhwcmVzc2lvbjsKICAgIH0KICAgIGlmIChleHByIGlzIGlyLkFzRXhwcmVzc2lvbiAmJgogICAgICAgIGVsZW1lbnRNYXAuZ2V0RGFydFR5cGUoZXhwci50eXBlKSA9PSBfY29tbW9uRWxlbWVudHMuZHluYW1pY1R5cGUpIHsKICAgICAgaXIuQXNFeHByZXNzaW9uIGFzRXhwcmVzc2lvbiA9IGV4cHI7CiAgICAgIGV4cHIgPSBhc0V4cHJlc3Npb24ub3BlcmFuZDsKICAgIH0KICAgIGlmIChleHByIGlzIGlyLlN1cGVyTWV0aG9kSW52b2NhdGlvbiAmJgogICAgICAgIGV4cHIubmFtZS5uYW1lID09IElkZW50aWZpZXJzLm5vU3VjaE1ldGhvZF8pIHsKICAgICAgaXIuQXJndW1lbnRzIGFyZ3VtZW50cyA9IGV4cHIuYXJndW1lbnRzOwogICAgICBpZiAoYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoID09IDEgJiYKICAgICAgICAgIGFyZ3VtZW50cy5uYW1lZC5pc0VtcHR5ICYmCiAgICAgICAgICBhcmd1bWVudHMucG9zaXRpb25hbC5maXJzdCBpcyBpci5WYXJpYWJsZUdldCkgewogICAgICAgIGlyLlZhcmlhYmxlR2V0IGdldCA9IGFyZ3VtZW50cy5wb3NpdGlvbmFsLmZpcnN0OwogICAgICAgIHJldHVybiBnZXQudmFyaWFibGUgPT0gZmlyc3RQYXJhbWV0ZXI7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaGFzVGhyb3dpbmdTeW50YXgoS0Z1bmN0aW9uIG1ldGhvZCkgewogICAgaXIuUHJvY2VkdXJlIG5vZGUgPSBlbGVtZW50TWFwLl9sb29rdXBQcm9jZWR1cmUobWV0aG9kKTsKICAgIGlyLlN0YXRlbWVudCBib2R5ID0gbm9kZS5mdW5jdGlvbi5ib2R5OwogICAgaWYgKGJvZHkgaXMgaXIuQmxvY2sgJiYgYm9keS5zdGF0ZW1lbnRzLmlzTm90RW1wdHkpIHsKICAgICAgaXIuQmxvY2sgYmxvY2sgPSBib2R5OwogICAgICBib2R5ID0gYmxvY2suc3RhdGVtZW50cy5maXJzdDsKICAgIH0KICAgIGlyLkV4cHJlc3Npb24gZXhwcjsKICAgIGlmIChib2R5IGlzIGlyLlJldHVyblN0YXRlbWVudCkgewogICAgICBleHByID0gYm9keS5leHByZXNzaW9uOwogICAgfSBlbHNlIGlmIChib2R5IGlzIGlyLkV4cHJlc3Npb25TdGF0ZW1lbnQpIHsKICAgICAgZXhwciA9IGJvZHkuZXhwcmVzc2lvbjsKICAgIH0KICAgIHJldHVybiBleHByIGlzIGlyLlRocm93OwogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0U3VwZXJOb1N1Y2hNZXRob2QoRnVuY3Rpb25FbnRpdHkgbWV0aG9kKSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5nZXRTdXBlck5vU3VjaE1ldGhvZChtZXRob2QuZW5jbG9zaW5nQ2xhc3MpOwogIH0KfQpIAE5OPAEkAUMrAS8BTwFDAQwvPUIsMiwYOh0lBiYeBiNMKyMGLDcvLiU6OS8IBhIEAQwtPSw6HSUGGCYeMR4GHQQBDD9DBAIBOHBhY2thZ2U6Y29tcGlsZXIvc3JjL2tlcm5lbC9ub19zdWNoX21ldGhvZF9yZXNvbHZlci5kYXJ0O3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2tlcm5lbC9mcm9udF9lbmRfYWRhcHRlci5kYXJ0jxovLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIEhlbHBlciBjbGFzc2VzIGFuZCBtZXRob2RzIHRvIGFkYXB0IGJldHdlZW4gYHBhY2thZ2U6Y29tcGlsZXJgIGFuZAovLy8gYHBhY2thZ2U6ZnJvbnRfZW5kYCBBUElzLgpsaWJyYXJ5IGNvbXBpbGVyLmtlcm5lbC5mcm9udF9lbmRfYWRhcHRlcjsKCmltcG9ydCAnZGFydDphc3luYyc7CgppbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfdW5zdGFibGUvZGFydDJqcy5kYXJ0JyBhcyBmZTsKCmltcG9ydCAnLi4vLi4vY29tcGlsZXJfbmV3LmRhcnQnIGFzIGFwaTsKCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2lvL3NvdXJjZV9maWxlLmRhcnQnOwoKLy8vIEEgZnJvbnQtZW5kcydzIFtGaWxlU3lzdGVtXSB0aGF0IHVzZXMgZGFydDJqcydzIFthcGkuQ29tcGlsZXJJbnB1dF0uCmNsYXNzIENvbXBpbGVyRmlsZVN5c3RlbSBpbXBsZW1lbnRzIGZlLkZpbGVTeXN0ZW0gewogIGZpbmFsIGFwaS5Db21waWxlcklucHV0IGlucHV0UHJvdmlkZXI7CgogIENvbXBpbGVyRmlsZVN5c3RlbSh0aGlzLmlucHV0UHJvdmlkZXIpOwoKICBAb3ZlcnJpZGUKICBmZS5GaWxlU3lzdGVtRW50aXR5IGVudGl0eUZvclVyaShVcmkgdXJpKSB7CiAgICBpZiAodXJpLnNjaGVtZSA9PSAnZGF0YScpIHsKICAgICAgcmV0dXJuIG5ldyBmZS5EYXRhRmlsZVN5c3RlbUVudGl0eShVcmkuYmFzZS5yZXNvbHZlVXJpKHVyaSkpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBfQ29tcGlsZXJGaWxlU3lzdGVtRW50aXR5KHVyaSwgdGhpcyk7CiAgICB9CiAgfQp9CgpjbGFzcyBfQ29tcGlsZXJGaWxlU3lzdGVtRW50aXR5IGltcGxlbWVudHMgZmUuRmlsZVN5c3RlbUVudGl0eSB7CiAgQG92ZXJyaWRlCiAgZmluYWwgVXJpIHVyaTsKICBmaW5hbCBDb21waWxlckZpbGVTeXN0ZW0gZnM7CgogIF9Db21waWxlckZpbGVTeXN0ZW1FbnRpdHkodGhpcy51cmksIHRoaXMuZnMpOwoKICBAb3ZlcnJpZGUKICBGdXR1cmU8U3RyaW5nPiByZWFkQXNTdHJpbmcoKSBhc3luYyB7CiAgICBhcGkuSW5wdXQgaW5wdXQ7CiAgICB0cnkgewogICAgICBpbnB1dCA9IGF3YWl0IGZzLmlucHV0UHJvdmlkZXIKICAgICAgICAgIC5yZWFkRnJvbVVyaSh1cmksIGlucHV0S2luZDogYXBpLklucHV0S2luZC5VVEY4KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgdGhyb3cgbmV3IGZlLkZpbGVTeXN0ZW1FeGNlcHRpb24odXJpLCAnJGUnKTsKICAgIH0KICAgIGlmIChpbnB1dCA9PSBudWxsKSB0aHJvdyBuZXcgZmUuRmlsZVN5c3RlbUV4Y2VwdGlvbih1cmksICJGaWxlIG5vdCBmb3VuZCIpOwogICAgLy8gVE9ETyhzaWdtdW5kKTogdGVjaG5pY2FsbHkgc29tZW9uZSBjb3VsZCBwcm92aWRlIGRhcnQyanMgd2l0aCBhbiBpbnB1dAogICAgLy8gdGhhdCBpcyBub3QgYSBTb3VyY2VGaWxlLiBOb3RlIHRoYXQgdGhpcyBhc3N1bXB0aW9uIGlzIGFsc28gZG9uZSBpbiB0aGUKICAgIC8vIChub24ta2VybmVsKSBTY3JpcHRMb2FkZXIuCiAgICBTb3VyY2VGaWxlIGZpbGUgPSBpbnB1dCBhcyBTb3VyY2VGaWxlOwogICAgcmV0dXJuIGZpbGUuc2xvd1RleHQoKTsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxMaXN0PGludD4+IHJlYWRBc0J5dGVzKCkgYXN5bmMgewogICAgYXBpLklucHV0IGlucHV0OwogICAgdHJ5IHsKICAgICAgaW5wdXQgPSBhd2FpdCBmcy5pbnB1dFByb3ZpZGVyCiAgICAgICAgICAucmVhZEZyb21VcmkodXJpLCBpbnB1dEtpbmQ6IGFwaS5JbnB1dEtpbmQuYmluYXJ5KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgdGhyb3cgbmV3IGZlLkZpbGVTeXN0ZW1FeGNlcHRpb24odXJpLCAnJGUnKTsKICAgIH0KICAgIGlmIChpbnB1dCA9PSBudWxsKSB0aHJvdyBuZXcgZmUuRmlsZVN5c3RlbUV4Y2VwdGlvbih1cmksICJGaWxlIG5vdCBmb3VuZCIpOwogICAgcmV0dXJuIGlucHV0LmRhdGE7CiAgfQoKICBAb3ZlcnJpZGUKICBGdXR1cmU8Ym9vbD4gZXhpc3RzKCkgYXN5bmMgewogICAgdHJ5IHsKICAgICAgYXBpLklucHV0IGlucHV0ID0gYXdhaXQgZnMuaW5wdXRQcm92aWRlcgogICAgICAgICAgLnJlYWRGcm9tVXJpKHVyaSwgaW5wdXRLaW5kOiBhcGkuSW5wdXRLaW5kLmJpbmFyeSk7CiAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsOwogICAgfSBjYXRjaCAoZSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQp9CgovLy8gUmVwb3J0IGEgW21lc3NhZ2VdIHJlY2VpdmVkIGZyb20gdGhlIGZyb250LWVuZCwgdXNpbmcgZGFydDJqcydzCi8vLyBbRGlhZ25vc3RpY1JlcG9ydGVyXS4Kdm9pZCByZXBvcnRGcm9udEVuZE1lc3NhZ2UoCiAgICBEaWFnbm9zdGljUmVwb3J0ZXIgcmVwb3J0ZXIsIGZlLkRpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UpIHsKICBTcGFubmFibGUgX2dldFNwYW5uYWJsZShmZS5EaWFnbm9zdGljTWVzc2FnZSBtZXNzYWdlKSB7CiAgICBVcmkgdXJpID0gZmUuZ2V0TWVzc2FnZVVyaShtZXNzYWdlKTsKICAgIGludCBvZmZzZXQgPSBmZS5nZXRNZXNzYWdlQ2hhck9mZnNldChtZXNzYWdlKTsKICAgIGludCBsZW5ndGggPSBmZS5nZXRNZXNzYWdlTGVuZ3RoKG1lc3NhZ2UpOwogICAgaWYgKHVyaSAhPSBudWxsICYmIG9mZnNldCAhPSAtMSkgewogICAgICByZXR1cm4gbmV3IFNvdXJjZVNwYW4odXJpLCBvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gTk9fTE9DQVRJT05fU1BBTk5BQkxFOwogICAgfQogIH0KCiAgRGlhZ25vc3RpY01lc3NhZ2UgX2NvbnZlcnRNZXNzYWdlKGZlLkRpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UpIHsKICAgIFNwYW5uYWJsZSBzcGFuID0gX2dldFNwYW5uYWJsZShtZXNzYWdlKTsKICAgIFN0cmluZyB0ZXh0ID0gZmUuZ2V0TWVzc2FnZUhlYWRlclRleHQobWVzc2FnZSk7CiAgICByZXR1cm4gcmVwb3J0ZXIuY3JlYXRlTWVzc2FnZShzcGFuLCBNZXNzYWdlS2luZC5HRU5FUklDLCB7J3RleHQnOiB0ZXh0fSk7CiAgfQoKICBMaXN0PGZlLkRpYWdub3N0aWNNZXNzYWdlPiByZWxhdGVkSW5mb3JtYXRpb24gPQogICAgICBmZS5nZXRNZXNzYWdlUmVsYXRlZEluZm9ybWF0aW9uKG1lc3NhZ2UpOwogIERpYWdub3N0aWNNZXNzYWdlIG1haW5NZXNzYWdlID0gX2NvbnZlcnRNZXNzYWdlKG1lc3NhZ2UpOwogIExpc3Q8RGlhZ25vc3RpY01lc3NhZ2U+IGluZm9zID0gcmVsYXRlZEluZm9ybWF0aW9uICE9IG51bGwKICAgICAgPyByZWxhdGVkSW5mb3JtYXRpb24ubWFwKF9jb252ZXJ0TWVzc2FnZSkudG9MaXN0KCkKICAgICAgOiBjb25zdCBbXTsKICBzd2l0Y2ggKG1lc3NhZ2Uuc2V2ZXJpdHkpIHsKICAgIGNhc2UgZmUuU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtOgogICAgICB0aHJvdyBtYWluTWVzc2FnZS5tZXNzYWdlLmNvbXB1dGVNZXNzYWdlKCk7CiAgICBjYXNlIGZlLlNldmVyaXR5LmVycm9yOgogICAgICByZXBvcnRlci5yZXBvcnRFcnJvcihtYWluTWVzc2FnZSwgaW5mb3MpOwogICAgICBicmVhazsKICAgIGNhc2UgZmUuU2V2ZXJpdHkud2FybmluZzoKICAgICAgcmVwb3J0ZXIucmVwb3J0V2FybmluZyhtYWluTWVzc2FnZSwgaW5mb3MpOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoJ3VuaGFuZGxlZCBzZXZlcml0eSAke21lc3NhZ2Uuc2V2ZXJpdHl9Jyk7CiAgfQp9CnwATk48AUceKwEVAUABKQEZIQFJNCkBKgEMLiBEDTcGBAIBQQwRHwEwAQwoFQolPBIzBlBOTyIrHAQBDCoVCiU+EjMGUBcEAQwgCi8+HBIUBgQCAUQaHEE6KTMvJzsNJAYEAUQtNE4EATIwPD05Eh4mMhwwDR4yDQ1OBAIBMnBhY2thZ2U6Y29tcGlsZXIvc3JjL2tlcm5lbC9mcm9udF9lbmRfYWRhcHRlci5kYXJ0KnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2Nsb3N1cmUuZGFydLiKLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwppbXBvcnQgJ2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICdlbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICdlbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICdqc19tb2RlbC9jbG9zdXJlLmRhcnQnOwppbXBvcnQgJ2pzX21vZGVsL2VsZW1lbnRfbWFwLmRhcnQnOwppbXBvcnQgJ3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0JzsKCi8vLyBDbGFzcyB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGZvciBob3cgY2xvc3VyZXMgYXJlIHJld3JpdHRlbi9yZXByZXNlbnRlZAovLy8gdG8gcHJlc2VydmUgRGFydCBzZW1hbnRpY3Mgd2hlbiBjb21waWxlZCB0byBKYXZhU2NyaXB0LiBHaXZlbiBhIHBhcnRpY3VsYXIKLy8vIG5vZGUgdG8gbG9vayB1cCwgaXQgcmV0dXJucyBhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbgovLy8gb2YgaG93IGNsb3N1cmUgY29udmVyc2lvbiBpcyBpbXBsZW1lbnRlZC4gVCBpcyBhbiBpci5Ob2RlIG9yIE5vZGUuCmFic3RyYWN0IGNsYXNzIENsb3N1cmVEYXRhIHsKICAvLy8gRGVzZXJpYWxpemVzIGEgW0Nsb3N1cmVEYXRhXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IENsb3N1cmVEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgICAgIEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsIERhdGFTb3VyY2Ugc291cmNlKSA9CiAgICAgIENsb3N1cmVEYXRhSW1wbC5yZWFkRnJvbURhdGFTb3VyY2U7CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0Nsb3N1cmVEYXRhXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luayk7CgogIC8vLyBMb29rIHVwIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2YXJpYWJsZXMgdGhhdCBoYXZlIGJlZW4gbXV0YXRlZCBhbmQgYXJlCiAgLy8vIHVzZWQgaW5zaWRlIHRoZSBzY29wZSBvZiBbbm9kZV0uCiAgU2NvcGVJbmZvIGdldFNjb3BlSW5mbyhNZW1iZXJFbnRpdHkgbWVtYmVyKTsKCiAgQ2xvc3VyZVJlcHJlc2VudGF0aW9uSW5mbyBnZXRDbG9zdXJlSW5mbyhpci5Ob2RlIGxvY2FsRnVuY3Rpb24pOwoKICAvLy8gTG9vayB1cCBpbmZvcm1hdGlvbiBhYm91dCBhIGxvb3AsIGluIGNhc2UgYW55IHZhcmlhYmxlcyBpdCBkZWNsYXJlcyBuZWVkCiAgLy8vIHRvIGJlIGJveGVkL3NuYXBzaG90dGVkLgogIENhcHR1cmVkTG9vcFNjb3BlIGdldENhcHR1cmVkTG9vcFNjb3BlKGlyLk5vZGUgbG9vcE5vZGUpOwoKICAvLy8gQWNjZXNzb3IgdG8gdGhlIGluZm9ybWF0aW9uIGFib3V0IHNjb3BlcyB0aGF0IGNsb3N1cmVzIGNhcHR1cmUuIFVzZWQgYnkKICAvLy8gdGhlIFNTQSBidWlsZGVyLgogIENhcHR1cmVkU2NvcGUgZ2V0Q2FwdHVyZWRTY29wZShNZW1iZXJFbnRpdHkgZW50aXR5KTsKfQoKLy8vIEVudW0gdXNlZCBmb3IgaWRlbnRpZnlpbmcgW1Njb3BlSW5mb10gc3ViY2xhc3NlcyBpbiBzZXJpYWxpemF0aW9uLgplbnVtIFNjb3BlSW5mb0tpbmQgewogIHNjb3BlSW5mbywKICBjYXB0dXJlZFNjb3BlLAogIGNhcHR1cmVkTG9vcFNjb3BlLAogIGNsb3N1cmVSZXByZXNlbnRhdGlvbkluZm8sCn0KCi8vLyBDbGFzcyB0aGF0IHJlcHJlc2VudHMgb25lIGxldmVsIG9mIHNjb3BpbmcgaW5mb3JtYXRpb24sIHdoZXRoZXIgdGhpcyBzY29wZQovLy8gaXMgYSBjbG9zdXJlIG9yIG5vdC4gVGhpcyBpcyBzcGVjaWZpY2FsbHkgdXNlZCB0byBzdG9yZSBpbmZvcm1hdGlvbgovLy8gYWJvdXQgdGhlIHVzYWdlIG9mIHZhcmlhYmxlcyBpbiB0cnkgb3Igc3luYyBibG9ja3MsIGJlY2F1c2UgdGhleSBuZWVkIHRvIGJlCi8vLyBib3hlZC4KLy8vCi8vLyBWYXJpYWJsZXMgdGhhdCBhcmUgdXNlZCBpbiBhIHRyeSBtdXN0IGJlIHRyZWF0ZWQgYXMgYm94ZWQgYmVjYXVzZSB0aGUKLy8vIGNvbnRyb2wgZmxvdyBjYW4gYmUgbm9uLWxpbmVhci4gQWxzbyBwYXJhbWV0ZXJzIHRvIGEgYHN5bmMqYCBnZW5lcmF0b3IgbXVzdAovLy8gYmUgYm94ZWQsIGJlY2F1c2Ugb2YgdGhlIHdheSB3ZSByZXdyaXRlIHN5bmMqIGZ1bmN0aW9ucy4gU2VlIGFsc28gY29tbWVudHMKLy8vIGluIFtDbG9zdXJlQ2xhc3NNYXAudXNlTG9jYWxdLgpjbGFzcyBTY29wZUluZm8gewogIGNvbnN0IFNjb3BlSW5mbygpOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW1Njb3BlSW5mb10gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBTY29wZUluZm8ucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBTY29wZUluZm9LaW5kIGtpbmQgPSBzb3VyY2UucmVhZEVudW0oU2NvcGVJbmZvS2luZC52YWx1ZXMpOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgU2NvcGVJbmZvS2luZC5zY29wZUluZm86CiAgICAgICAgcmV0dXJuIG5ldyBKc1Njb3BlSW5mby5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgY2FzZSBTY29wZUluZm9LaW5kLmNhcHR1cmVkU2NvcGU6CiAgICAgICAgcmV0dXJuIG5ldyBKc0NhcHR1cmVkU2NvcGUucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNhc2UgU2NvcGVJbmZvS2luZC5jYXB0dXJlZExvb3BTY29wZToKICAgICAgICByZXR1cm4gbmV3IEpzQ2FwdHVyZWRMb29wU2NvcGUucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNhc2UgU2NvcGVJbmZvS2luZC5jbG9zdXJlUmVwcmVzZW50YXRpb25JbmZvOgogICAgICAgIHJldHVybiBuZXcgS2VybmVsQ2xvc3VyZUNsYXNzSW5mby5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdVbmV4cGVjdGVkIFNjb3BlSW5mb0tpbmQgJGtpbmQnKTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW1Njb3BlSW5mb10gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCcke3J1bnRpbWVUeXBlfS53cml0ZVRvRGF0YVNpbmsnKTsKICB9CgogIC8vLyBDb252ZW5pZW5jZSByZWZlcmVuY2UgcG9pbnRlciB0byB0aGUgZWxlbWVudCByZXByZXNlbnRpbmcgYHRoaXNgLgogIC8vLyBJZiB0aGlzIHNjb3BlIGlzIG5vdCBpbiBhbiBpbnN0YW5jZSBtZW1iZXIsIGl0IHdpbGwgYmUgbnVsbC4KICBMb2NhbCBnZXQgdGhpc0xvY2FsID0+IG51bGw7CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBbdmFyaWFibGVdIGlzIHVzZWQgaW5zaWRlIGEgYHRyeWAgYmxvY2sgb3IgYSBgc3luYypgCiAgLy8vIGdlbmVyYXRvciAodGhpcyBpcyBpbXBvcnRhbnQgdG8ga25vdyBiZWNhdXNlIGJveGluZy9yZWRpcmVjdGlvbiBuZWVkcyB0bwogIC8vLyBoYXBwZW4gZm9yIHRob3NlIGxvY2FsIHZhcmlhYmxlcykuCiAgLy8vCiAgLy8vIFZhcmlhYmxlcyB0aGF0IGFyZSB1c2VkIGluIGEgdHJ5IG11c3QgYmUgdHJlYXRlZCBhcyBib3hlZCBiZWNhdXNlIHRoZQogIC8vLyBjb250cm9sIGZsb3cgY2FuIGJlIG5vbi1saW5lYXIuCiAgLy8vCiAgLy8vIEFsc28gcGFyYW1ldGVycyB0byBhIGBzeW5jKmAgZ2VuZXJhdG9yIG11c3QgYmUgYm94ZWQsIGJlY2F1c2Ugb2YgdGhlIHdheQogIC8vLyB3ZSByZXdyaXRlIHN5bmMqIGZ1bmN0aW9ucy4gU2VlIGFsc28gY29tbWVudHMgaW4KICAvLy8gW0Nsb3N1cmVDbGFzc01hcC51c2VMb2NhbF0uCiAgYm9vbCBsb2NhbElzVXNlZEluVHJ5T3JTeW5jKExvY2FsIHZhcmlhYmxlKSA9PiBmYWxzZTsKCiAgLy8vIExvb3AgdGhyb3VnaCBlYWNoIHZhcmlhYmxlIHRoYXQgaGFzIGJlZW4gZGVmaW5lZCBpbiB0aGlzIHNjb3BlLCBtb2RpZmllZAogIC8vLyBhbnl3aGVyZSAodGhpcyBzY29wZSBvciBhbm90aGVyIHNjb3BlKSBhbmQgdXNlZCBpbiBhbm90aGVyIHNjb3BlLiBCZWNhdXNlCiAgLy8vIGl0IGlzIHVzZWQgaW4gYW5vdGhlciBzY29wZSwgdGhlc2UgdmFyaWFibGVzIG5lZWQgdG8gYmUgImJveGVkIiwgY3JlYXRpbmcKICAvLy8gYSB0aGluIHdyYXBwZXIgYXJvdW5kIGFjY2Vzc2VzIHRvIHRoZXNlIHZhcmlhYmxlcyBzbyB0aGF0IGFjY2Vzc2VzIGdldAogIC8vLyB0aGUgY29ycmVjdCB1cGRhdGVkIHZhbHVlLiBUaGUgdmFyaWFibGVzIGluIGxvY2Fsc1VzZWRJblRyeU9yU3luYyBtYXkKICAvLy8gYmUgaW5jbHVkZWQgaW4gdGhpcyBzZXQuCiAgLy8vCiAgLy8vIEluIHRoZSBjYXNlIG9mIGxvb3BzLCB0aGlzIGlzIHRoZSBzZXQgb2YgaXRlcmF0aW9uIHZhcmlhYmxlcyAob3IgYW55CiAgLy8vIHZhcmlhYmxlcyBkZWNsYXJlZCBpbiB0aGUgZm9yIGxvb3AgZXhwcmVzc2lvbiAoYGZvciAoLi4uaGVyZS4uLilgKSB0aGF0CiAgLy8vIG5lZWQgdG8gYmUgYm94ZWQgdG8gc25hcHNob3QgdGhlaXIgdmFsdWUuCiAgdm9pZCBmb3JFYWNoQm94ZWRWYXJpYWJsZShmKExvY2FsIGxvY2FsLCBGaWVsZEVudGl0eSBmaWVsZCkpIHt9CgogIC8vLyBUcnVlIGlmIFt2YXJpYWJsZV0gaGFzIGJlZW4gbXV0YXRlZCBhbmQgaXMgYWxzbyB1c2VkIGluIGFub3RoZXIgc2NvcGUuCiAgYm9vbCBpc0JveGVkVmFyaWFibGUoTG9jYWwgdmFyaWFibGUpID0+IGZhbHNlOwp9CgovLy8gQ2xhc3MgcmVwcmVzZW50aW5nIHRoZSB1c2FnZSBvZiBhIHNjb3BlIHRoYXQgaGFzIGJlZW4gY2FwdHVyZWQgaW4gdGhlCi8vLyBjb250ZXh0IG9mIGEgY2xvc3VyZS4KY2xhc3MgQ2FwdHVyZWRTY29wZSBleHRlbmRzIFNjb3BlSW5mbyB7CiAgY29uc3QgQ2FwdHVyZWRTY29wZSgpOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW0NhcHR1cmVkU2NvcGVdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgQ2FwdHVyZWRTY29wZS5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIFNjb3BlSW5mb0tpbmQga2luZCA9IHNvdXJjZS5yZWFkRW51bShTY29wZUluZm9LaW5kLnZhbHVlcyk7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBTY29wZUluZm9LaW5kLnNjb3BlSW5mbzoKICAgICAgY2FzZSBTY29wZUluZm9LaW5kLmNsb3N1cmVSZXByZXNlbnRhdGlvbkluZm86CiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ1VuZXhwZWN0ZWQgQ2FwdHVyZWRTY29wZSBraW5kICRraW5kJyk7CiAgICAgIGNhc2UgU2NvcGVJbmZvS2luZC5jYXB0dXJlZFNjb3BlOgogICAgICAgIHJldHVybiBuZXcgSnNDYXB0dXJlZFNjb3BlLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBjYXNlIFNjb3BlSW5mb0tpbmQuY2FwdHVyZWRMb29wU2NvcGU6CiAgICAgICAgcmV0dXJuIG5ldyBKc0NhcHR1cmVkTG9vcFNjb3BlLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgfQogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ1VuZXhwZWN0ZWQgU2NvcGVJbmZvS2luZCAka2luZCcpOwogIH0KCiAgLy8vIElmIHRydWUsIHRoaXMgY2xvc3VyZSBhY2Nlc3NlcyBhIHZhcmlhYmxlIHRoYXQgd2FzIGRlZmluZWQgaW4gYW4gb3V0c2lkZQogIC8vLyBzY29wZSBhbmQgdGhpcyB2YXJpYWJsZSBnZXRzIG1vZGlmaWVkIGF0IHNvbWUgcG9pbnQgKHNvbWV0aW1lcyB3ZSBzYXkgdGhhdAogIC8vLyB2YXJpYWJsZSBoYXMgYmVlbiAiY2FwdHVyZWQiKS4gSW4gdGhpcyBzaXR1YXRpb24sIGFjY2VzcyB0byB0aGlzIHZhcmlhYmxlCiAgLy8vIGlzIGNvbnRyb2xsZWQgdmlhIGEgd3JhcHBlciAoYm94KSBzbyB0aGF0IHVwZGF0ZXMgdG8gdGhpcyB2YXJpYWJsZQogIC8vLyBhcmUgZG9uZSBpbiBhIHdheSB0aGF0IGlzIGluIGxpbmUgd2l0aCBEYXJ0J3MgY2xvc3VyZSBydWxlcy4KICBib29sIGdldCByZXF1aXJlc0NvbnRleHRCb3ggPT4gZmFsc2U7CgogIC8vLyBBY2Nlc3NvciB0byB0aGUgbG9jYWwgZW52aXJvbm1lbnQgaW4gd2hpY2ggYSBwYXJ0aWN1bGFyIGNsb3N1cmUgbm9kZSBpcwogIC8vLyBleGVjdXRlZC4gVGhpcyB3aWxsIGVuY2Fwc3VsYXRlIHRoZSB2YWx1ZSBvZiBhbnkgdmFyaWFibGVzIHRoYXQgaGF2ZSBiZWVuCiAgLy8vIHNjb3BlZCBpbnRvIHRoaXMgY29udGV4dCBmcm9tIG91dHNpZGUuIFRoaXMgaXMgYW4gYWNjZXNzb3IgdG8gdGhlCiAgLy8vIGNvbnRleHRCb3ggdGhhdCBbcmVxdWlyZXNDb250ZXh0Qm94XSBpcyB0ZXN0aW5nIGlzIHJlcXVpcmVkLgogIExvY2FsIGdldCBjb250ZXh0ID0+IG51bGw7Cn0KCi8vLyBDbGFzcyB0aGF0IGRlc2NyaWJlcyB0aGUgYWN0dWFsIG1lY2hhbmljcyBvZiBob3cgdmFsdWVzIG9mIHZhcmlhYmxlcwovLy8gaW5zdGFudGlhdGVkIGluIGEgbG9vcCBhcmUgY2FwdHVyZWQgaW5zaWRlIGNsb3N1cmVzIGluIHRoZSBsb29wIGJvZHkuCi8vLyBVbmxpa2UgSlMsIHRoZSB2YWx1ZSBvZiBhIGRlY2xhcmVkIGxvb3AgaXRlcmF0aW9uIHZhcmlhYmxlIGluIGFueSBjbG9zdXJlCi8vLyBpcyBjYXB0dXJlZC9zbmFwc2hvdHRlZCBpbnNpZGUgYXQgZWFjaCBpdGVyYXRpb24gcG9pbnQsIGFzIGlmIHdlIGNyZWF0ZWQgYQovLy8gbmV3IGxvY2FsIHZhcmlhYmxlIGZvciB0aGF0IHZhbHVlIGluc2lkZSB0aGUgbG9vcC4gRm9yIGV4YW1wbGUsIGZvciB0aGUKLy8vIGZvbGxvd2luZyBsb29wOgovLy8KLy8vICAgICB2YXIgbHN0ID0gW107Ci8vLyAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIGxzdC5hZGQoKCk9PmkpOwovLy8gICAgIHZhciByZXN1bHQgPSBsaXN0Lm1hcCgoZikgPT4gZigpKS50b0xpc3QoKTsKLy8vCi8vLyBgcmVzdWx0YCB3aWxsIGJlIFswLCAxLCAyLCAzLCA0XSwgd2hlcmVhcyB3ZXJlIHRoaXMgSlMgY29kZQovLy8gdGhlIHJlc3VsdCB3b3VsZCBiZSBbNSwgNSwgNSwgNSwgNV0uIEJlY2F1c2Ugb2YgdGhpcyBkaWZmZXJlbmNlIHdlIG5lZWQgdG8KLy8vIGNyZWF0ZSBhIGNsb3N1cmUgZm9yIHRoZXNlIHNvcnRzIG9mIGxvb3BzIHRvIGNhcHR1cmUgdGhlIHZhcmlhYmxlJ3MgdmFsdWUgYXQKLy8vIGVhY2ggaXRlcmF0aW9uLCBieSBib3hpbmcgdGhlIGl0ZXJhdGlvbiB2YXJpYWJsZVtzXS4KY2xhc3MgQ2FwdHVyZWRMb29wU2NvcGUgZXh0ZW5kcyBDYXB0dXJlZFNjb3BlIHsKICBjb25zdCBDYXB0dXJlZExvb3BTY29wZSgpOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW0NhcHR1cmVkTG9vcFNjb3BlXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IENhcHR1cmVkTG9vcFNjb3BlLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgU2NvcGVJbmZvS2luZCBraW5kID0gc291cmNlLnJlYWRFbnVtKFNjb3BlSW5mb0tpbmQudmFsdWVzKTsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIFNjb3BlSW5mb0tpbmQuc2NvcGVJbmZvOgogICAgICBjYXNlIFNjb3BlSW5mb0tpbmQuY2xvc3VyZVJlcHJlc2VudGF0aW9uSW5mbzoKICAgICAgY2FzZSBTY29wZUluZm9LaW5kLmNhcHR1cmVkU2NvcGU6CiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ1VuZXhwZWN0ZWQgQ2FwdHVyZWRMb29wU2NvcGUga2luZCAka2luZCcpOwogICAgICBjYXNlIFNjb3BlSW5mb0tpbmQuY2FwdHVyZWRMb29wU2NvcGU6CiAgICAgICAgcmV0dXJuIG5ldyBKc0NhcHR1cmVkTG9vcFNjb3BlLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgfQogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ1VuZXhwZWN0ZWQgU2NvcGVJbmZvS2luZCAka2luZCcpOwogIH0KCiAgLy8vIFRydWUgaWYgdGhpcyBsb29wIHNjb3BlIGRlY2xhcmVzIGluIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBsb29wCiAgLy8vIGBmb3IgKDxoZXJlPjsuLi47Li4uKWAgYW55IHZhcmlhYmxlcyB0aGF0IG5lZWQgdG8gYmUgYm94ZWQuCiAgYm9vbCBnZXQgaGFzQm94ZWRMb29wVmFyaWFibGVzID0+IGZhbHNlOwoKICAvLy8gVGhlIHNldCBvZiBpdGVyYXRpb24gdmFyaWFibGVzIChvciB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gdGhlIGZvciBsb29wCiAgLy8vIGV4cHJlc3Npb24gKGBmb3IgKDxoZXJlPjsgLi4uIDsgLi4uKWApIHRoYXQgbmVlZCB0byBiZSBib3hlZCB0byBzbmFwc2hvdAogIC8vLyB0aGVpciB2YWx1ZS4gVGhlc2UgdmFyaWFibGVzIGFyZSBhbHNvIGluY2x1ZGVkIGluIHRoZSBzZXQgb2YKICAvLy8gYGZvckVhY2hCb3hlZFZhcmlhYmxlYCBtZXRob2QuIFRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHRoZXNlIHR3byBzZXRzIGlzCiAgLy8vIGluIHRoaXMgZXhhbXBsZToKICAvLy8KICAvLy8gICAgIHJ1bihmKSA9PiBmKCk7CiAgLy8vICAgICB2YXIgYTsKICAvLy8gICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgLy8vICAgICAgIHZhciBiID0gMzsKICAvLy8gICAgICAgYSA9ICgpID0+IGIgPSBpOwogIC8vLyAgICAgfQogIC8vLwogIC8vLyBgaWAgd291bGQgYmUgYSBwYXJ0IG9mIHRoZSBib3hlZExvb3BWYXJpYWJsZXMgQU5EIGJveGVkVmFyaWFibGVzLCBidXQgYgogIC8vLyB3b3VsZCBvbmx5IGJlIGEgcGFydCBvZiBib3hlZFZhcmlhYmxlcy4KICBMaXN0PExvY2FsPiBnZXQgYm94ZWRMb29wVmFyaWFibGVzID0+IGNvbnN0IDxMb2NhbD5bXTsKfQoKLy8vIENsYXNzIHRoYXQgZGVzY3JpYmVzIHRoZSBhY3R1YWwgbWVjaGFuaWNzIG9mIGhvdyB0aGUgY29udmVydGVkLCByZXdyaXR0ZW4KLy8vIGNsb3N1cmUgaXMgaW1wbGVtZW50ZWQuIEZvciBleGFtcGxlLCBmb3IgdGhlIGZvbGxvd2luZyBjbG9zdXJlIChuYW1lZCBmb28KLy8vIGZvciBjb252ZW5pZW5jZSk6Ci8vLwovLy8gICB2YXIgZm9vID0gKHgpID0+IHkgKyB4OwovLy8KLy8vIFdlIHdvdWxkIHByb2R1Y2UgdGhlIGZvbGxvd2luZyBjbGFzcyB0byBjb250cm9sIGFjY2VzcyB0byB0aGVzZSB2YXJpYWJsZXMgaW4KLy8vIHRoZSBmb2xsb3dpbmcgd2F5IChtb2R1bG8gbmFtaW5nIG9mIHZhcmlhYmxlcywgYXNzdW1pbmcgdGhhdCB5IGlzIG1vZGlmaWVkCi8vLyBlbHNld2hlcmUgaW4gaXRzIHNjb3BlKToKLy8vCi8vLyAgICBjbGFzcyBGb29DbG9zdXJlIHsKLy8vICAgICAgIGludCB5OwovLy8gICAgICAgRm9vQ2xvc3VyZSh0aGlzLnkpOwovLy8gICAgICAgY2FsbCh4KSA9PiB0aGlzLnkgKyB4OwovLy8gICAgfQovLy8KLy8vICBhbmQgdGhlbiB0byBleGVjdXRlIHRoaXMgY2xvc3VyZSwgZm9yIGV4YW1wbGU6Ci8vLwovLy8gICAgIHZhciBmb28gPSBuZXcgRm9vQ2xvc3VyZSgxKTsKLy8vICAgICBmb28uY2FsbCgyKTsKLy8vCi8vLyBpZiBgeWAgaXMgbW9kaWZpZWQgZWxzZXdoZXJlIHdpdGhpbiBpdHMgc2NvcGUsIGFjY2Vzc2VzIHRvIHkgYW55d2hlcmUgaW4gdGhlCi8vLyBjb2RlIHdpbGwgYmUgY29udHJvbGxlZCB2aWEgYSBib3ggb2JqZWN0LgovLy8KLy8vIEJlY2F1c2UgaW4gdGhlc2UgZXhhbXBsZXMgYHlgIHdhcyBkZWNsYXJlZCBpbiBzb21lIG90aGVyLCBvdXRlciBzY29wZSwgYnV0Ci8vLyB1c2VkIGluIHRoZSBpbm5lciBzY29wZSBvZiB0aGlzIGNsb3N1cmUsIHdlIHNheSBgeWAgaXMgYSAiY2FwdHVyZWQiCi8vLyB2YXJpYWJsZS4KLy8vIFRPRE8oZWZvcnR1bmEpOiBNYWtlIGludGVyZmFjZSBzaW1wbGVyIGluIHN1YnNlcXVlbnQgcmVmYWN0b3JpbmdzLgpjbGFzcyBDbG9zdXJlUmVwcmVzZW50YXRpb25JbmZvIGV4dGVuZHMgU2NvcGVJbmZvIHsKICBjb25zdCBDbG9zdXJlUmVwcmVzZW50YXRpb25JbmZvKCk7CgogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbQ2xvc3VyZVJlcHJlc2VudGF0aW9uSW5mb10gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBDbG9zdXJlUmVwcmVzZW50YXRpb25JbmZvLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgU2NvcGVJbmZvS2luZCBraW5kID0gc291cmNlLnJlYWRFbnVtKFNjb3BlSW5mb0tpbmQudmFsdWVzKTsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIFNjb3BlSW5mb0tpbmQuc2NvcGVJbmZvOgogICAgICBjYXNlIFNjb3BlSW5mb0tpbmQuY2FwdHVyZWRTY29wZToKICAgICAgY2FzZSBTY29wZUluZm9LaW5kLmNhcHR1cmVkTG9vcFNjb3BlOgogICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICAgICAnVW5leHBlY3RlZCBDbG9zdXJlUmVwcmVzZW50YXRpb25JbmZvIGtpbmQgJGtpbmQnKTsKICAgICAgY2FzZSBTY29wZUluZm9LaW5kLmNsb3N1cmVSZXByZXNlbnRhdGlvbkluZm86CiAgICAgICAgcmV0dXJuIG5ldyBLZXJuZWxDbG9zdXJlQ2xhc3NJbmZvLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgfQogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ1VuZXhwZWN0ZWQgU2NvcGVJbmZvS2luZCAka2luZCcpOwogIH0KCiAgLy8vIFRoZSBvcmlnaW5hbCBsb2NhbCBmdW5jdGlvbiBiZWZvcmUgYW55IHRyYW5zbGF0aW9uLgogIC8vLwogIC8vLyBXaWxsIGJlIG51bGwgZm9yIG1ldGhvZHMuCiAgTG9jYWwgZ2V0IGNsb3N1cmVFbnRpdHkgPT4gbnVsbDsKCiAgLy8vIFRoZSBlbnRpdHkgZm9yIHRoZSBjbGFzcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcmV3cml0dGVuIGNsb3N1cmUgaW4gdGhlCiAgLy8vIGVtaXR0ZWQgSmF2YVNjcmlwdC4KICAvLy8KICAvLy8gQ2xvc3VyZXMgYXJlIHJld3JpdHRlbiBpbiB0aGUgZm9ybSBvZiBjbGFzc2VzIHRoYXQgaGF2ZSBmaWVsZHMgdG8gY29udHJvbAogIC8vLyB0aGUgcmVkaXJlY3Rpb24gYW5kIGVkaXRpbmcgb2YgY2FwdHVyZWQgdmFyaWFibGVzLgogIENsYXNzRW50aXR5IGdldCBjbG9zdXJlQ2xhc3NFbnRpdHkgPT4gbnVsbDsKCiAgLy8vIFRoZSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgdGhlIFtsb2NhbF0gZnVuY3Rpb24gYXMgYSBgY2FsbGAgbWV0aG9kIG9uCiAgLy8vIHRoZSBjbG9zdXJlIGNsYXNzLgogIEZ1bmN0aW9uRW50aXR5IGdldCBjYWxsTWV0aG9kID0+IG51bGw7CgogIC8vLyBMaXN0IG9mIGxvY2FscyB0aGF0IHRoaXMgY2xvc3VyZSBjbGFzcyBoYXMgY3JlYXRlZCBjb3JyZXNwb25kaW5nIGZpZWxkCiAgLy8vIGVudGl0aWVzIGZvci4KICBAZGVwcmVjYXRlZAogIExpc3Q8TG9jYWw+IGdldCBjcmVhdGVkRmllbGRFbnRpdGllcyA9PiBjb25zdCA8TG9jYWw+W107CgogIC8vLyBBcyBzaG93biBpbiB0aGUgZXhhbXBsZSBpbiB0aGUgY29tbWVudHMgYXQgdGhlIHRvcCBvZiB0aGlzIGNsYXNzLCB3ZQogIC8vLyBjcmVhdGUgZmllbGRzIGluIHRoZSBjbG9zdXJlIGNsYXNzIGZvciBlYWNoIGNhcHR1cmVkIHZhcmlhYmxlLiBUaGlzIGlzIGFuCiAgLy8vIGFjY2Vzc29yIHRoZSBbbG9jYWxdIGZvciB3aGljaCBbZmllbGRdIHdhcyBjcmVhdGVkLgogIC8vLyBSZXR1cm5zIHRoZSBbbG9jYWxdIGZvciB3aGljaCBbZmllbGRdIHdhcyBjcmVhdGVkLgogIExvY2FsIGdldExvY2FsRm9yRmllbGQoRmllbGRFbnRpdHkgZmllbGQpIHsKICAgIGZhaWxlZEF0KGZpZWxkLCAiTm8gbG9jYWwgZm9yICRmaWVsZC4iKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgLy8vIENvbnZlbmllbmNlIHBvaW50ZXIgdG8gdGhlIGZpZWxkIGVudGl0eSByZXByZXNlbnRhdGlvbiBpbiB0aGUgY2xvc3VyZQogIC8vLyBjbGFzcyBvZiB0aGUgZWxlbWVudCByZXByZXNlbnRpbmcgYHRoaXNgLgogIEZpZWxkRW50aXR5IGdldCB0aGlzRmllbGRFbnRpdHkgPT4gbnVsbDsKCiAgLy8vIExvb3AgdGhyb3VnaCBlYWNoIHZhcmlhYmxlIHRoYXQgaGFzIGJlZW4gYm94ZWQgaW4gdGhpcyBjbG9zdXJlIGNsYXNzLiBPbmx5CiAgLy8vIGNhcHR1cmVkIHZhcmlhYmxlcyB0aGF0IGFyZSBtdXRhdGVkIG5lZWQgdG8gYmUgImJveGVkIiAod2hpY2ggYmFzaWNhbGx5CiAgLy8vIHB1dHMgYSB0aGluIGxheWVyIGJldHdlZW4gdXBkYXRlcyBhbmQgcmVhZHMgdG8gdGhpcyB2YXJpYWJsZSB0byBlbnN1cmUKICAvLy8gdGhhdCBldmVyeSBwbGFjZSB0aGF0IGFjY2Vzc2VzIGl0IGdldHMgdGhlIGNvcnJlY3QgdXBkYXRlZCB2YWx1ZSkuIFRoaXMKICAvLy8gaW5jbHVkZXMgbG9vcGluZyBvdmVyIHZhcmlhYmxlcyB0aGF0IHdlcmUgYm94ZWQgZnJvbSBvdGhlciBzY29wZXMsIG5vdAogIC8vLyBzdHJpY3RseSB2YXJpYWJsZXMgZGVmaW5lZCBpbiB0aGlzIGNsb3N1cmUsIHVubGlrZSB0aGUgYmVoYXZpb3IgaW4KICAvLy8gdGhlIHN1cGVyY2xhc3MgU2NvcGVJbmZvLgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaEJveGVkVmFyaWFibGUoZihMb2NhbCBsb2NhbCwgRmllbGRFbnRpdHkgZmllbGQpKSB7fQoKICAvLy8gTG9vcCB0aHJvdWdoIGVhY2ggZnJlZSB2YXJpYWJsZSBpbiB0aGlzIGNsb3N1cmUuIEZyZWUgdmFyaWFibGVzIGFyZSB0aGUKICAvLy8gdmFyaWFibGVzIHRoYXQgaGF2ZSBiZWVuIGNhcHR1cmVkICpqdXN0KiBpbiB0aGlzIGNsb3N1cmUsIG5vdCBpbiBuZXN0ZWQKICAvLy8gc2NvcGVzLgogIHZvaWQgZm9yRWFjaEZyZWVWYXJpYWJsZShmKExvY2FsIHZhcmlhYmxlLCBGaWVsZEVudGl0eSBmaWVsZCkpIHt9CgogIC8vIFRPRE8oZWZvcnR1bmEpOiBSZW1vdmUgdGhpcyBtZXRob2QuIFRoZSBvbGQgc3lzdGVtIHdhcyB1c2luZwogIC8vIENsb3N1cmVDbGFzc01hcHMgZm9yIHNpdHVhdGlvbnMgb3RoZXIgdGhhbiBjbG9zdXJlIGNsYXNzIG1hcHMsIGFuZCB0aGF0J3MKICAvLyBqdXN0IGNvbmZ1c2luZy4KICBib29sIGdldCBpc0Nsb3N1cmUgPT4gZmFsc2U7Cn0KCi8vLyBBIGxvY2FsIHZhcmlhYmxlIHRoYXQgY29udGFpbnMgdGhlIGJveCBvYmplY3QgaG9sZGluZyB0aGUgW0JveEZpZWxkRWxlbWVudF0KLy8vIGZpZWxkcy4KY2xhc3MgQm94TG9jYWwgZXh0ZW5kcyBMb2NhbCB7CiAgZmluYWwgQ2xhc3NFbnRpdHkgY29udGFpbmVyOwoKICBCb3hMb2NhbCh0aGlzLmNvbnRhaW5lcik7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgbmFtZSA9PiBjb250YWluZXIubmFtZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgcmV0dXJuIG90aGVyIGlzIEJveExvY2FsICYmIG90aGVyLmNvbnRhaW5lciA9PSBjb250YWluZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IGNvbnRhaW5lci5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0JveExvY2FsKCRuYW1lKSc7Cn0KCi8vLyBBIGxvY2FsIHZhcmlhYmxlIHVzZWQgZW5jb2RlIHRoZSBkaXJlY3QgKHVuY2FwdHVyZWQpIHJlZmVyZW5jZXMgdG8gW3RoaXNdLgpjbGFzcyBUaGlzTG9jYWwgZXh0ZW5kcyBMb2NhbCB7CiAgZmluYWwgQ2xhc3NFbnRpdHkgZW5jbG9zaW5nQ2xhc3M7CgogIFRoaXNMb2NhbCh0aGlzLmVuY2xvc2luZ0NsYXNzKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+ICd0aGlzJzsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgcmV0dXJuIG90aGVyIGlzIFRoaXNMb2NhbCAmJiBvdGhlci5lbmNsb3NpbmdDbGFzcyA9PSBlbmNsb3NpbmdDbGFzczsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gZW5jbG9zaW5nQ2xhc3MuaGFzaENvZGU7Cn0KCi8vLyBBIHR5cGUgdmFyaWFibGUgYXMgYSBsb2NhbCB2YXJpYWJsZS4KY2xhc3MgVHlwZVZhcmlhYmxlTG9jYWwgaW1wbGVtZW50cyBMb2NhbCB7CiAgZmluYWwgVHlwZVZhcmlhYmxlVHlwZSB0eXBlVmFyaWFibGU7CgogIFR5cGVWYXJpYWJsZUxvY2FsKHRoaXMudHlwZVZhcmlhYmxlKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+IHR5cGVWYXJpYWJsZS5lbGVtZW50Lm5hbWU7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gdHlwZVZhcmlhYmxlLmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMhIFR5cGVWYXJpYWJsZUxvY2FsKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHlwZVZhcmlhYmxlID09IG90aGVyLnR5cGVWYXJpYWJsZTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCd0eXBlX3ZhcmlhYmxlX2xvY2FsKCcpOwogICAgc2Iud3JpdGUodHlwZVZhcmlhYmxlKTsKICAgIHNiLndyaXRlKCcpJyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCi8vLwovLy8gTW92ZSB0aGUgYmVsb3cgY2xhc3NlcyB0byBhIEpTIG1vZGVsIGV2ZW50dWFsbHkuCi8vLwphYnN0cmFjdCBjbGFzcyBKU0VudGl0eSBpbXBsZW1lbnRzIE1lbWJlckVudGl0eSB7CiAgU3RyaW5nIGdldCBkZWNsYXJlZE5hbWU7Cn0KCmFic3RyYWN0IGNsYXNzIFByaXZhdGVseU5hbWVkSlNFbnRpdHkgaW1wbGVtZW50cyBKU0VudGl0eSB7CiAgRW50aXR5IGdldCByb290T2ZTY29wZTsKfQqBfgBOTjwBKBYhHiAkKwFPT1BHHTkqOioBLycBTScvAUMBTx88AU4XNwIBRxUNERUdAgFPSFALBEpQTyMSFQE3PEAUJDsoPyxDNEYGQgQBLShCBAFIQx8BUE8pBkwmBk83IjgBT1BQTUwfBktOMEIBTTECAUoaKBkBO0BAFCQ0Syg/LEMGQgQBT1FQSUMoAU5QSEMdAgFJSk5PTBQEFjQ0BEBPUTkwHQE/REAUJDQoTyxDBkIEAUVCKwFMT0NPFwYZESgXHQwGTi45AgFOThYEHgRRTx0EGhEeIQkENAQlFQRRLgRPSA5HNCUBR0xAFCQoLCRANEYGQgQBOgYgIwFOGgZQOS4BThkpAU0UDjsBS1A6OS4tEQQBTDArAVFOTU5NSSAMQgFOTg5EAUJPFR8CAVAMHx8BHAEMJQEMHD4EAQwqAQwqAgFPICQBIgEMHQEMHEkEAQwvAgEpKycBKAEMMAEMLQEMHDMvBAEMFiomHBMaBAIBBDUEMhsCATwaAgEhcGFja2FnZTpjb21waWxlci9zcmMvY2xvc3VyZS5kYXJ0MXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2VsZW1lbnRzL2p1bXBzLmRhcnSESS8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGVsZW1lbnRzLmp1bXBzOwoKaW1wb3J0ICdlbnRpdGllcy5kYXJ0JzsKCi8vLyBUaGUgbGFiZWwgZW50aXR5IGRlZmluZWQgYnkgYSBsYWJlbGVkIHN0YXRlbWVudC4KYWJzdHJhY3QgY2xhc3MgTGFiZWxEZWZpbml0aW9uIGV4dGVuZHMgRW50aXR5IHsKICBTdHJpbmcgZ2V0IGxhYmVsTmFtZTsKICBKdW1wVGFyZ2V0IGdldCB0YXJnZXQ7CgogIGJvb2wgZ2V0IGlzVGFyZ2V0ID0+IGlzQnJlYWtUYXJnZXQgfHwgaXNDb250aW51ZVRhcmdldDsKCiAgYm9vbCBnZXQgaXNCcmVha1RhcmdldDsKICBib29sIGdldCBpc0NvbnRpbnVlVGFyZ2V0Owp9CgovLy8gQSBqdW1wIHRhcmdldCBpcyB0aGUgcmVmZXJlbmNlIHBvaW50IG9mIGEgc3RhdGVtZW50IG9yIHN3aXRjaC1jYXNlLAovLy8gZWl0aGVyIGJ5IGxhYmVsIG9yIGFzIHRoZSBkZWZhdWx0IHRhcmdldCBvZiBhIGJyZWFrIG9yIGNvbnRpbnVlLgphYnN0cmFjdCBjbGFzcyBKdW1wVGFyZ2V0IGV4dGVuZHMgTG9jYWwgewogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgbmFtZSA9PiAndGFyZ2V0JzsKCiAgYm9vbCBnZXQgaXNUYXJnZXQgPT4gaXNCcmVha1RhcmdldCB8fCBpc0NvbnRpbnVlVGFyZ2V0OwoKICBpbnQgZ2V0IG5lc3RpbmdMZXZlbDsKICBMaXN0PExhYmVsRGVmaW5pdGlvbj4gZ2V0IGxhYmVsczsKCiAgYm9vbCBnZXQgaXNCcmVha1RhcmdldDsKICBib29sIGdldCBpc0NvbnRpbnVlVGFyZ2V0OwogIGJvb2wgZ2V0IGlzU3dpdGNoOwogIGJvb2wgZ2V0IGlzU3dpdGNoQ2FzZTsKCiAgTGFiZWxEZWZpbml0aW9uIGFkZExhYmVsKFN0cmluZyBsYWJlbE5hbWUsCiAgICAgIHtib29sIGlzQnJlYWtUYXJnZXQ6IGZhbHNlLCBib29sIGlzQ29udGludWVUYXJnZXQ6IGZhbHNlfSk7Cn0KKABOTjwBGAEYATUwGBkBOgEaHQIBSEUqDB8BOgEYJAEaHRUZAS1CAgEocGFja2FnZTpjb21waWxlci9zcmMvZWxlbWVudHMvanVtcHMuZGFydEJzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9zc2EvaW52b2tlX2R5bmFtaWNfc3BlY2lhbGl6ZXJzLmRhcnTAANCbLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgSkNvbW1vbkVsZW1lbnRzOwppbXBvcnQgJy4uL2NvbnN0YW50cy9jb25zdGFudF9zeXN0ZW0uZGFydCcgYXMgY29uc3RhbnRfc3lzdGVtOwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvbmFtZXMuZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJy4uL2luZmVycmVyL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY2FsbF9zdHJ1Y3R1cmUuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCc7CmltcG9ydCAnLi4vd29ybGQuZGFydCcgc2hvdyBKQ2xvc2VkV29ybGQ7CmltcG9ydCAnbG9nZ2luZy5kYXJ0JzsKaW1wb3J0ICdub2Rlcy5kYXJ0JzsKaW1wb3J0ICd0eXBlcy5kYXJ0JzsKCi8vLyBbSW52b2tlRHluYW1pY1NwZWNpYWxpemVyXSBhbmQgaXRzIHN1YmNsYXNzZXMgYXJlIGhlbHBlcnMgdG8KLy8vIG9wdGltaXplIGludGVyY2VwdGVkIGR5bmFtaWMgY2FsbHMuIEl0IGtub3dzIHdoYXQgaW5wdXQgdHlwZXMKLy8vIHdvdWxkIGJlIGJlbmVmaWNpYWwgZm9yIHBlcmZvcm1hbmNlLCBhbmQgaG93IHRvIGNoYW5nZSBhIGludm9rZQovLy8gZHluYW1pYyB0byBhIGJ1aWx0aW4gaW5zdHJ1Y3Rpb24gKGUuZy4gSEluZGV4LCBIQml0Tm90KS4KY2xhc3MgSW52b2tlRHluYW1pY1NwZWNpYWxpemVyIHsKICBjb25zdCBJbnZva2VEeW5hbWljU3BlY2lhbGl6ZXIoKTsKCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIEFic3RyYWN0VmFsdWVGYWN0b3J5LmluZmVycmVkVHlwZUZvclNlbGVjdG9yKAogICAgICAgIGluc3RydWN0aW9uLnNlbGVjdG9yLCBpbnN0cnVjdGlvbi5tYXNrLCByZXN1bHRzKTsKICB9CgogIEhJbnN0cnVjdGlvbiB0cnlDb252ZXJ0VG9CdWlsdGluKAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgSEdyYXBoIGdyYXBoLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgICAgSkNvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgY2xlYXJBbGxTaWRlRWZmZWN0cyhISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGluc3RydWN0aW9uLnNpZGVFZmZlY3RzLmNsZWFyQWxsU2lkZUVmZmVjdHMoKTsKICAgIGluc3RydWN0aW9uLnNpZGVFZmZlY3RzLmNsZWFyQWxsRGVwZW5kZW5jaWVzKCk7CiAgICBpbnN0cnVjdGlvbi5zZXRVc2VHdm4oKTsKICB9CgogIFNlbGVjdG9yIHJlbmFtZVRvT3B0aW1pemVkU2VsZWN0b3IoCiAgICAgIFN0cmluZyBuYW1lLCBTZWxlY3RvciBzZWxlY3RvciwgSkNvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzKSB7CiAgICBpZiAoc2VsZWN0b3IubmFtZSA9PSBuYW1lKSByZXR1cm4gc2VsZWN0b3I7CiAgICByZXR1cm4gbmV3IFNlbGVjdG9yLmNhbGwobmV3IE5hbWUobmFtZSwgY29tbW9uRWxlbWVudHMuaW50ZXJjZXB0b3JzTGlicmFyeSksCiAgICAgICAgbmV3IENhbGxTdHJ1Y3R1cmUoc2VsZWN0b3IuYXJndW1lbnRDb3VudCkpOwogIH0KCiAgY29uc3RhbnRfc3lzdGVtLk9wZXJhdGlvbiBvcGVyYXRpb24oKSA9PiBudWxsOwoKICBzdGF0aWMgSW52b2tlRHluYW1pY1NwZWNpYWxpemVyIGxvb2t1cFNwZWNpYWxpemVyKFNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICBpZiAoc2VsZWN0b3IuaXNJbmRleCkgcmV0dXJuIGNvbnN0IEluZGV4U3BlY2lhbGl6ZXIoKTsKICAgIGlmIChzZWxlY3Rvci5pc0luZGV4U2V0KSByZXR1cm4gY29uc3QgSW5kZXhBc3NpZ25TcGVjaWFsaXplcigpOwogICAgU3RyaW5nIG5hbWUgPSBzZWxlY3Rvci5uYW1lOwogICAgaWYgKHNlbGVjdG9yLmlzT3BlcmF0b3IpIHsKICAgICAgaWYgKG5hbWUgPT0gJ3VuYXJ5LScpIHJldHVybiBjb25zdCBVbmFyeU5lZ2F0ZVNwZWNpYWxpemVyKCk7CiAgICAgIGlmIChuYW1lID09ICd+JykgcmV0dXJuIGNvbnN0IEJpdE5vdFNwZWNpYWxpemVyKCk7CiAgICAgIGlmIChuYW1lID09ICcrJykgcmV0dXJuIGNvbnN0IEFkZFNwZWNpYWxpemVyKCk7CiAgICAgIGlmIChuYW1lID09ICctJykgcmV0dXJuIGNvbnN0IFN1YnRyYWN0U3BlY2lhbGl6ZXIoKTsKICAgICAgaWYgKG5hbWUgPT0gJyonKSByZXR1cm4gY29uc3QgTXVsdGlwbHlTcGVjaWFsaXplcigpOwogICAgICBpZiAobmFtZSA9PSAnLycpIHJldHVybiBjb25zdCBEaXZpZGVTcGVjaWFsaXplcigpOwogICAgICBpZiAobmFtZSA9PSAnfi8nKSByZXR1cm4gY29uc3QgVHJ1bmNhdGluZ0RpdmlkZVNwZWNpYWxpemVyKCk7CiAgICAgIGlmIChuYW1lID09ICclJykgcmV0dXJuIGNvbnN0IE1vZHVsb1NwZWNpYWxpemVyKCk7CiAgICAgIGlmIChuYW1lID09ICc+PicpIHJldHVybiBjb25zdCBTaGlmdFJpZ2h0U3BlY2lhbGl6ZXIoKTsKICAgICAgaWYgKG5hbWUgPT0gJzw8JykgcmV0dXJuIGNvbnN0IFNoaWZ0TGVmdFNwZWNpYWxpemVyKCk7CiAgICAgIGlmIChuYW1lID09ICcmJykgcmV0dXJuIGNvbnN0IEJpdEFuZFNwZWNpYWxpemVyKCk7CiAgICAgIGlmIChuYW1lID09ICd8JykgcmV0dXJuIGNvbnN0IEJpdE9yU3BlY2lhbGl6ZXIoKTsKICAgICAgaWYgKG5hbWUgPT0gJ14nKSByZXR1cm4gY29uc3QgQml0WG9yU3BlY2lhbGl6ZXIoKTsKICAgICAgaWYgKG5hbWUgPT0gJz09JykgcmV0dXJuIGNvbnN0IEVxdWFsc1NwZWNpYWxpemVyKCk7CiAgICAgIGlmIChuYW1lID09ICc8JykgcmV0dXJuIGNvbnN0IExlc3NTcGVjaWFsaXplcigpOwogICAgICBpZiAobmFtZSA9PSAnPD0nKSByZXR1cm4gY29uc3QgTGVzc0VxdWFsU3BlY2lhbGl6ZXIoKTsKICAgICAgaWYgKG5hbWUgPT0gJz4nKSByZXR1cm4gY29uc3QgR3JlYXRlclNwZWNpYWxpemVyKCk7CiAgICAgIGlmIChuYW1lID09ICc+PScpIHJldHVybiBjb25zdCBHcmVhdGVyRXF1YWxTcGVjaWFsaXplcigpOwogICAgICByZXR1cm4gY29uc3QgSW52b2tlRHluYW1pY1NwZWNpYWxpemVyKCk7CiAgICB9CiAgICBpZiAoc2VsZWN0b3IuaXNDYWxsKSB7CiAgICAgIGlmIChzZWxlY3Rvci5uYW1lZEFyZ3VtZW50cy5sZW5ndGggPT0gMCkgewogICAgICAgIGludCBhcmd1bWVudENvdW50ID0gc2VsZWN0b3IuYXJndW1lbnRDb3VudDsKICAgICAgICBpZiAoYXJndW1lbnRDb3VudCA9PSAwKSB7CiAgICAgICAgICBpZiAobmFtZSA9PSAnYWJzJykgcmV0dXJuIGNvbnN0IEFic1NwZWNpYWxpemVyKCk7CiAgICAgICAgICBpZiAobmFtZSA9PSAncm91bmQnKSByZXR1cm4gY29uc3QgUm91bmRTcGVjaWFsaXplcigpOwogICAgICAgICAgaWYgKG5hbWUgPT0gJ3RyaW0nKSByZXR1cm4gY29uc3QgVHJpbVNwZWNpYWxpemVyKCk7CiAgICAgICAgfSBlbHNlIGlmIChhcmd1bWVudENvdW50ID09IDEpIHsKICAgICAgICAgIGlmIChuYW1lID09ICdjb2RlVW5pdEF0JykgcmV0dXJuIGNvbnN0IENvZGVVbml0QXRTcGVjaWFsaXplcigpOwogICAgICAgICAgaWYgKG5hbWUgPT0gJ2NvbXBhcmVUbycpIHJldHVybiBjb25zdCBDb21wYXJlVG9TcGVjaWFsaXplcigpOwogICAgICAgICAgaWYgKG5hbWUgPT0gJ3JlbWFpbmRlcicpIHJldHVybiBjb25zdCBSZW1haW5kZXJTcGVjaWFsaXplcigpOwogICAgICAgICAgaWYgKG5hbWUgPT0gJ3N1YnN0cmluZycpIHJldHVybiBjb25zdCBTdWJzdHJpbmdTcGVjaWFsaXplcigpOwogICAgICAgICAgaWYgKG5hbWUgPT0gJ2NvbnRhaW5zJykgcmV0dXJuIGNvbnN0IFBhdHRlcm5NYXRjaFNwZWNpYWxpemVyKCk7CiAgICAgICAgICBpZiAobmFtZSA9PSAnaW5kZXhPZicpIHJldHVybiBjb25zdCBQYXR0ZXJuTWF0Y2hTcGVjaWFsaXplcigpOwogICAgICAgICAgaWYgKG5hbWUgPT0gJ3N0YXJ0c1dpdGgnKSByZXR1cm4gY29uc3QgUGF0dGVybk1hdGNoU3BlY2lhbGl6ZXIoKTsKICAgICAgICAgIGlmIChuYW1lID09ICdlbmRzV2l0aCcpIHJldHVybiBjb25zdCBQYXR0ZXJuTWF0Y2hTcGVjaWFsaXplcigpOwogICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRDb3VudCA9PSAyKSB7CiAgICAgICAgICBpZiAobmFtZSA9PSAnc3Vic3RyaW5nJykgcmV0dXJuIGNvbnN0IFN1YnN0cmluZ1NwZWNpYWxpemVyKCk7CiAgICAgICAgICBpZiAobmFtZSA9PSAnY29udGFpbnMnKSByZXR1cm4gY29uc3QgUGF0dGVybk1hdGNoU3BlY2lhbGl6ZXIoKTsKICAgICAgICAgIGlmIChuYW1lID09ICdpbmRleE9mJykgcmV0dXJuIGNvbnN0IFBhdHRlcm5NYXRjaFNwZWNpYWxpemVyKCk7CiAgICAgICAgICBpZiAobmFtZSA9PSAnc3RhcnRzV2l0aCcpIHJldHVybiBjb25zdCBQYXR0ZXJuTWF0Y2hTcGVjaWFsaXplcigpOwogICAgICAgICAgaWYgKG5hbWUgPT0gJ2VuZHNXaXRoJykgcmV0dXJuIGNvbnN0IFBhdHRlcm5NYXRjaFNwZWNpYWxpemVyKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gY29uc3QgSW52b2tlRHluYW1pY1NwZWNpYWxpemVyKCk7CiAgfQp9CgpjbGFzcyBJbmRleEFzc2lnblNwZWNpYWxpemVyIGV4dGVuZHMgSW52b2tlRHluYW1pY1NwZWNpYWxpemVyIHsKICBjb25zdCBJbmRleEFzc2lnblNwZWNpYWxpemVyKCk7CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB0cnlDb252ZXJ0VG9CdWlsdGluKAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgSEdyYXBoIGdyYXBoLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgICAgSkNvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nKSB7CiAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMV07CiAgICBISW5zdHJ1Y3Rpb24gaW5kZXggPSBpbnN0cnVjdGlvbi5pbnB1dHNbMl07CiAgICBpZiAocmVjZWl2ZXIKICAgICAgICAuaXNNdXRhYmxlSW5kZXhhYmxlKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgLmlzUG90ZW50aWFsbHlGYWxzZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IE1lcmdlIHRoaXMgYW5kIHRoZSBmb2xsb3dpbmcgaWYgc3RhdGVtZW50LgogICAgaWYgKGluZGV4LmlzSW50ZWdlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc1BvdGVudGlhbGx5RmFsc2UgJiYKICAgICAgICBvcHRpb25zLnBhcmFtZXRlckNoZWNrUG9saWN5LmlzRW1pdHRlZCkgewogICAgICAvLyBXZSB3YW50IHRoZSByaWdodCBjaGVja2VkIG1vZGUgZXJyb3IuCiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIEhJbnN0cnVjdGlvbiB2YWx1ZSA9IGluc3RydWN0aW9uLmlucHV0c1szXTsKICAgIGlmIChvcHRpb25zLnBhcmFtZXRlckNoZWNrUG9saWN5LmlzRW1pdHRlZCkgewogICAgICBpZiAoIV92YWx1ZVBhcmFtZXRlckNoZWNrQWx3YXlzU3VjY2VlZHMoCiAgICAgICAgICBpbnN0cnVjdGlvbiwgcmVjZWl2ZXIsIHZhbHVlLCBjb21tb25FbGVtZW50cywgY2xvc2VkV29ybGQpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0KICAgIEhJbmRleEFzc2lnbiBjb252ZXJ0ZWQgPSBuZXcgSEluZGV4QXNzaWduKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4sCiAgICAgICAgcmVjZWl2ZXIsIGluZGV4LCB2YWx1ZSwgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IpOwogICAgbG9nPy5yZWdpc3RlckluZGV4QXNzaWduKGluc3RydWN0aW9uLCBjb252ZXJ0ZWQpOwogICAgcmV0dXJuIGNvbnZlcnRlZDsKICB9CgogIC8vLyBSZXR1cm5zIFt0cnVlXSBpZiBbdmFsdWVdIG1lZXRzIHRoZSByZXF1aXJlbWVudHMgZm9yIGJlaW5nIHN0b3JlZCBpbnRvCiAgLy8vIGluZGV4YWJsZSBbcmVjZWl2ZXJdLgogIGJvb2wgX3ZhbHVlUGFyYW1ldGVyQ2hlY2tBbHdheXNTdWNjZWVkcygKICAgICAgSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sCiAgICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciwKICAgICAgSEluc3RydWN0aW9uIHZhbHVlLAogICAgICBKQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgLy8gSGFuZGxlIHR5cGVkIGFycmF5cyBieSByZWNvZ25pemluZyB0aGUgZXhhY3QgaW1wbGVtZW50YXRpb24gb2YgYFtdPWAgYW5kCiAgICAvLyBjaGVja2luZyBpZiBbdmFsdWVdIGhhcyB0aGUgYXBwcm9wcmlhdGUgdHlwZS4KICAgIGlmIChpbnN0cnVjdGlvbi5lbGVtZW50ICE9IG51bGwpIHsKICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gaW5zdHJ1Y3Rpb24uZWxlbWVudC5lbmNsb3NpbmdDbGFzczsKICAgICAgaWYgKGNscyA9PSBjb21tb25FbGVtZW50cy50eXBlZEFycmF5T2ZJbnRDbGFzcykgewogICAgICAgIHJldHVybiB2YWx1ZQogICAgICAgICAgICAuaXNJbnRlZ2VyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlOwogICAgICB9IGVsc2UgaWYgKGNscyA9PSBjb21tb25FbGVtZW50cy50eXBlZEFycmF5T2ZEb3VibGVDbGFzcykgewogICAgICAgIHJldHVybiB2YWx1ZS5pc051bWJlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlOwogICAgICB9CiAgICB9CgogICAgLy8gVGhlIHR5cGUgY2hlY2sgd2lsbCBwYXNzIGlmIGl0IHBhc3NlZCBiZWZvcmUuIFdlIGtub3cgaXQgcGFzc2VkIGJlZm9yZSBpZgogICAgLy8gdGhlIHZhbHVlIHdhcyBsb2FkZWQgZnJvbSB0aGUgc2FtZSBpbmRleGFibGUuCiAgICBpZiAodmFsdWUgaXMgSEluZGV4KSB7CiAgICAgIGlmICh2YWx1ZS5yZWNlaXZlci5ub25DaGVjaygpID09IHJlY2VpdmVyLm5vbkNoZWNrKCkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBmYWxzZTsKICB9Cn0KCmNsYXNzIEluZGV4U3BlY2lhbGl6ZXIgZXh0ZW5kcyBJbnZva2VEeW5hbWljU3BlY2lhbGl6ZXIgewogIGNvbnN0IEluZGV4U3BlY2lhbGl6ZXIoKTsKCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHRyeUNvbnZlcnRUb0J1aWx0aW4oCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBIR3JhcGggZ3JhcGgsCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsCiAgICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgICBKQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2cpIHsKICAgIHZhciBhYnN0cmFjdFZhbHVlRG9tYWluID0gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbjsKICAgIGlmIChpbnN0cnVjdGlvbi5pbnB1dHNbMV0KICAgICAgICAuaXNJbmRleGFibGVQcmltaXRpdmUoYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAuaXNQb3RlbnRpYWxseUZhbHNlKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKGluc3RydWN0aW9uLmlucHV0c1syXQogICAgICAgICAgICAuaXNJbnRlZ2VyKGFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgIC5pc1BvdGVudGlhbGx5RmFsc2UgJiYKICAgICAgICBvcHRpb25zLnBhcmFtZXRlckNoZWNrUG9saWN5LmlzRW1pdHRlZCkgewogICAgICAvLyBXZSB3YW50IHRoZSByaWdodCBjaGVja2VkIG1vZGUgZXJyb3IuCiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgQWJzdHJhY3RWYWx1ZSByZWNlaXZlclR5cGUgPQogICAgICAgIGluc3RydWN0aW9uLmdldERhcnRSZWNlaXZlcihjbG9zZWRXb3JsZCkuaW5zdHJ1Y3Rpb25UeXBlOwogICAgQWJzdHJhY3RWYWx1ZSBlbGVtZW50VHlwZSA9IEFic3RyYWN0VmFsdWVGYWN0b3J5LmluZmVycmVkVHlwZUZvclNlbGVjdG9yKAogICAgICAgIGluc3RydWN0aW9uLnNlbGVjdG9yLCByZWNlaXZlclR5cGUsIHJlc3VsdHMpOwogICAgaWYgKGFic3RyYWN0VmFsdWVEb21haW4uaXNUeXBlZEFycmF5KHJlY2VpdmVyVHlwZSkuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBlbGVtZW50VHlwZSA9IGFic3RyYWN0VmFsdWVEb21haW4uZXhjbHVkZU51bGwoZWxlbWVudFR5cGUpOwogICAgfQogICAgSEluZGV4IGNvbnZlcnRlZCA9IG5ldyBISW5kZXgoaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdLCBpbnN0cnVjdGlvbi5pbnB1dHNbMl0sCiAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IsIGVsZW1lbnRUeXBlKTsKICAgIGxvZz8ucmVnaXN0ZXJJbmRleChpbnN0cnVjdGlvbiwgY29udmVydGVkKTsKICAgIHJldHVybiBjb252ZXJ0ZWQ7CiAgfQp9CgpjbGFzcyBCaXROb3RTcGVjaWFsaXplciBleHRlbmRzIEludm9rZUR5bmFtaWNTcGVjaWFsaXplciB7CiAgY29uc3QgQml0Tm90U3BlY2lhbGl6ZXIoKTsKCiAgQG92ZXJyaWRlCiAgY29uc3RhbnRfc3lzdGVtLlVuYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpIHsKICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0uYml0Tm90OwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgLy8gQWxsIGJpdHdpc2Ugb3BlcmF0aW9ucyBvbiBwcmltaXRpdmUgdHlwZXMgZWl0aGVyIHByb2R1Y2UgYW4KICAgIC8vIGludGVnZXIgb3IgdGhyb3cgYW4gZXJyb3IuCiAgICBpZiAoaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdCiAgICAgICAgLmlzUHJpbWl0aXZlT3JOdWxsKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4udWludDMyVHlwZTsKICAgIH0KICAgIHJldHVybiBzdXBlcgogICAgICAgIC5jb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKGluc3RydWN0aW9uLCByZXN1bHRzLCBvcHRpb25zLCBjbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdHJ5Q29udmVydFRvQnVpbHRpbigKICAgICAgSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sCiAgICAgIEhHcmFwaCBncmFwaCwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCiAgICAgIEpDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBPcHRpbWl6YXRpb25UZXN0TG9nIGxvZykgewogICAgSEluc3RydWN0aW9uIGlucHV0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdOwogICAgaWYgKGlucHV0LmlzTnVtYmVyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgSEJpdE5vdCBjb252ZXJ0ZWQgPSBuZXcgSEJpdE5vdCgKICAgICAgICAgIGlucHV0LAogICAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IsCiAgICAgICAgICBjb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKAogICAgICAgICAgICAgIGluc3RydWN0aW9uLCByZXN1bHRzLCBvcHRpb25zLCBjbG9zZWRXb3JsZCkpOwogICAgICBsb2c/LnJlZ2lzdGVyQml0Tm90KGluc3RydWN0aW9uLCBjb252ZXJ0ZWQpOwogICAgICByZXR1cm4gY29udmVydGVkOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQp9CgpjbGFzcyBVbmFyeU5lZ2F0ZVNwZWNpYWxpemVyIGV4dGVuZHMgSW52b2tlRHluYW1pY1NwZWNpYWxpemVyIHsKICBjb25zdCBVbmFyeU5lZ2F0ZVNwZWNpYWxpemVyKCk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5VbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24oKSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLm5lZ2F0ZTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcygKICAgICAgSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsCiAgICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIEhJbnN0cnVjdGlvbiBvcGVyYW5kID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdOwogICAgaWYgKG9wZXJhbmQKICAgICAgICAuaXNOdW1iZXJPck51bGwoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICAvLyBXZSBoYXZlIGludGVnZXIgc3ViY2xhc3NlcyB0aGF0IHJlcHJlc2VudCByYW5nZXMsIHNvIHdpZGVuIGFueSBpbnQKICAgICAgLy8gc3ViY2xhc3MgdG8gZnVsbCBpbnRlZ2VyLgogICAgICBpZiAob3BlcmFuZAogICAgICAgICAgLmlzSW50ZWdlck9yTnVsbChjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5pbnRUeXBlOwogICAgICB9CiAgICAgIGlmIChvcGVyYW5kCiAgICAgICAgICAuaXNEb3VibGVPck51bGwoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uZG91YmxlVHlwZTsKICAgICAgfQogICAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5udW1UeXBlOwogICAgfQogICAgcmV0dXJuIHN1cGVyCiAgICAgICAgLmNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoaW5zdHJ1Y3Rpb24sIHJlc3VsdHMsIG9wdGlvbnMsIGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB0cnlDb252ZXJ0VG9CdWlsdGluKAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgSEdyYXBoIGdyYXBoLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgICAgSkNvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nKSB7CiAgICBISW5zdHJ1Y3Rpb24gaW5wdXQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMV07CiAgICBpZiAoaW5wdXQuaXNOdW1iZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBITmVnYXRlIGNvbnZlcnRlZCA9IG5ldyBITmVnYXRlKAogICAgICAgICAgaW5wdXQsCiAgICAgICAgICBpbnN0cnVjdGlvbi5zZWxlY3RvciwKICAgICAgICAgIGNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoCiAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24sIHJlc3VsdHMsIG9wdGlvbnMsIGNsb3NlZFdvcmxkKSk7CiAgICAgIGxvZz8ucmVnaXN0ZXJVbmFyeU5lZ2F0ZShpbnN0cnVjdGlvbiwgY29udmVydGVkKTsKICAgICAgcmV0dXJuIGNvbnZlcnRlZDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KfQoKY2xhc3MgQWJzU3BlY2lhbGl6ZXIgZXh0ZW5kcyBJbnZva2VEeW5hbWljU3BlY2lhbGl6ZXIgewogIGNvbnN0IEFic1NwZWNpYWxpemVyKCk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5VbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24oKSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmFiczsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcygKICAgICAgSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsCiAgICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIEhJbnN0cnVjdGlvbiBpbnB1dCA9IGluc3RydWN0aW9uLmlucHV0c1sxXTsKICAgIGlmIChpbnB1dAogICAgICAgIC5pc051bWJlck9yTnVsbChjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgIC5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmV4Y2x1ZGVOdWxsKGlucHV0Lmluc3RydWN0aW9uVHlwZSk7CiAgICB9CiAgICByZXR1cm4gc3VwZXIKICAgICAgICAuY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgb3B0aW9ucywgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHRyeUNvbnZlcnRUb0J1aWx0aW4oCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBIR3JhcGggZ3JhcGgsCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsCiAgICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgICBKQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2cpIHsKICAgIEhJbnN0cnVjdGlvbiBpbnB1dCA9IGluc3RydWN0aW9uLmlucHV0c1sxXTsKICAgIGlmIChpbnB1dC5pc051bWJlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIEhBYnMgY29udmVydGVkID0gbmV3IEhBYnMoCiAgICAgICAgICBpbnB1dCwKICAgICAgICAgIGluc3RydWN0aW9uLnNlbGVjdG9yLAogICAgICAgICAgY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcygKICAgICAgICAgICAgICBpbnN0cnVjdGlvbiwgcmVzdWx0cywgb3B0aW9ucywgY2xvc2VkV29ybGQpKTsKICAgICAgbG9nPy5yZWdpc3RlckFicyhpbnN0cnVjdGlvbiwgY29udmVydGVkKTsKICAgICAgcmV0dXJuIGNvbnZlcnRlZDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCByZWdpc3Rlck9wdGltaXphdGlvbigKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2csIEhJbnN0cnVjdGlvbiBvcmlnaW5hbCwgSEluc3RydWN0aW9uIGNvbnZlcnRlZCkge30KfQoKYWJzdHJhY3QgY2xhc3MgQmluYXJ5QXJpdGhtZXRpY1NwZWNpYWxpemVyIGV4dGVuZHMgSW52b2tlRHluYW1pY1NwZWNpYWxpemVyIHsKICBjb25zdCBCaW5hcnlBcml0aG1ldGljU3BlY2lhbGl6ZXIoKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgSEluc3RydWN0aW9uIGxlZnQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMV07CiAgICBISW5zdHJ1Y3Rpb24gcmlnaHQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMl07CiAgICBpZiAobGVmdAogICAgICAgICAgICAuaXNJbnRlZ2VyT3JOdWxsKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgcmlnaHQKICAgICAgICAgICAgLmlzSW50ZWdlck9yTnVsbChjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5pbnRUeXBlOwogICAgfQogICAgaWYgKGxlZnQuaXNOdW1iZXJPck51bGwoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBpZiAobGVmdAogICAgICAgICAgICAgIC5pc0RvdWJsZU9yTnVsbChjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlIHx8CiAgICAgICAgICByaWdodAogICAgICAgICAgICAgIC5pc0RvdWJsZU9yTnVsbChjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uZG91YmxlVHlwZTsKICAgICAgfQogICAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5udW1UeXBlOwogICAgfQogICAgcmV0dXJuIHN1cGVyCiAgICAgICAgLmNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoaW5zdHJ1Y3Rpb24sIHJlc3VsdHMsIG9wdGlvbnMsIGNsb3NlZFdvcmxkKTsKICB9CgogIGJvb2wgaXNCdWlsdGluKEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBpbnN0cnVjdGlvbi5pbnB1dHNbMV0KICAgICAgICAgICAgLmlzTnVtYmVyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgaW5zdHJ1Y3Rpb24uaW5wdXRzWzJdCiAgICAgICAgICAgIC5pc051bWJlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB0cnlDb252ZXJ0VG9CdWlsdGluKAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgSEdyYXBoIGdyYXBoLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgICAgSkNvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nKSB7CiAgICBpZiAoaXNCdWlsdGluKGluc3RydWN0aW9uLCBjbG9zZWRXb3JsZCkpIHsKICAgICAgSEluc3RydWN0aW9uIGJ1aWx0aW4gPQogICAgICAgICAgbmV3QnVpbHRpblZhcmlhbnQoaW5zdHJ1Y3Rpb24sIHJlc3VsdHMsIG9wdGlvbnMsIGNsb3NlZFdvcmxkKTsKICAgICAgaWYgKGxvZyAhPSBudWxsKSB7CiAgICAgICAgcmVnaXN0ZXJPcHRpbWl6YXRpb24obG9nLCBpbnN0cnVjdGlvbiwgYnVpbHRpbik7CiAgICAgIH0KICAgICAgaWYgKGJ1aWx0aW4gIT0gbnVsbCkgewogICAgICAgIHJldHVybiBidWlsdGluOwogICAgICB9CiAgICAgIC8vIEV2ZW4gaWYgdGhlcmUgaXMgbm8gYnVpbHRpbiBlcXVpdmFsZW50IGluc3RydWN0aW9uLCB3ZSBrbm93CiAgICAgIC8vIHRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBoYXZlIGFueSBzaWRlIGVmZmVjdCwgYW5kIHRoYXQgaXQKICAgICAgLy8gY2FuIGJlIEdWTidlZC4KICAgICAgY2xlYXJBbGxTaWRlRWZmZWN0cyhpbnN0cnVjdGlvbik7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGJvb2wgaW5wdXRzQXJlUG9zaXRpdmVJbnRlZ2VycygKICAgICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIEhJbnN0cnVjdGlvbiBsZWZ0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdOwogICAgSEluc3RydWN0aW9uIHJpZ2h0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzJdOwogICAgcmV0dXJuIGxlZnQKICAgICAgICAgICAgLmlzUG9zaXRpdmVJbnRlZ2VyT3JOdWxsKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgcmlnaHQKICAgICAgICAgICAgLmlzUG9zaXRpdmVJbnRlZ2VyT3JOdWxsKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlOwogIH0KCiAgYm9vbCBpbnB1dHNBcmVVSW50MzEoSEluc3RydWN0aW9uIGluc3RydWN0aW9uLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIEhJbnN0cnVjdGlvbiBsZWZ0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdOwogICAgSEluc3RydWN0aW9uIHJpZ2h0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzJdOwogICAgcmV0dXJuIGxlZnQuaXNVSW50MzEoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSAmJgogICAgICAgIHJpZ2h0LmlzVUludDMxKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWU7CiAgfQoKICBISW5zdHJ1Y3Rpb24gbmV3QnVpbHRpblZhcmlhbnQoCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKTsKCiAgdm9pZCByZWdpc3Rlck9wdGltaXphdGlvbigKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2csIEhJbnN0cnVjdGlvbiBvcmlnaW5hbCwgSEluc3RydWN0aW9uIGNvbnZlcnRlZCk7Cn0KCmNsYXNzIEFkZFNwZWNpYWxpemVyIGV4dGVuZHMgQmluYXJ5QXJpdGhtZXRpY1NwZWNpYWxpemVyIHsKICBjb25zdCBBZGRTcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBpZiAoaW5wdXRzQXJlVUludDMxKGluc3RydWN0aW9uLCBjbG9zZWRXb3JsZCkpIHsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4udWludDMyVHlwZTsKICAgIH0KICAgIGlmIChpbnB1dHNBcmVQb3NpdGl2ZUludGVnZXJzKGluc3RydWN0aW9uLCBjbG9zZWRXb3JsZCkpIHsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4ucG9zaXRpdmVJbnRUeXBlOwogICAgfQogICAgcmV0dXJuIHN1cGVyCiAgICAgICAgLmNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoaW5zdHJ1Y3Rpb24sIHJlc3VsdHMsIG9wdGlvbnMsIGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgewogICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5hZGQ7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gbmV3QnVpbHRpblZhcmlhbnQoCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gbmV3IEhBZGQoCiAgICAgICAgaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdLAogICAgICAgIGluc3RydWN0aW9uLmlucHV0c1syXSwKICAgICAgICBpbnN0cnVjdGlvbi5zZWxlY3RvciwKICAgICAgICBjb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKGluc3RydWN0aW9uLCByZXN1bHRzLCBvcHRpb25zLCBjbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck9wdGltaXphdGlvbigKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2csIEhJbnN0cnVjdGlvbiBvcmlnaW5hbCwgSEluc3RydWN0aW9uIGNvbnZlcnRlZCkgewogICAgbG9nLnJlZ2lzdGVyQWRkKG9yaWdpbmFsLCBjb252ZXJ0ZWQpOwogIH0KfQoKY2xhc3MgRGl2aWRlU3BlY2lhbGl6ZXIgZXh0ZW5kcyBCaW5hcnlBcml0aG1ldGljU3BlY2lhbGl6ZXIgewogIGNvbnN0IERpdmlkZVNwZWNpYWxpemVyKCk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgewogICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5kaXZpZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoCiAgICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgSEluc3RydWN0aW9uIGxlZnQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMV07CiAgICBpZiAobGVmdC5pc051bWJlck9yTnVsbChjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmRvdWJsZVR5cGU7CiAgICB9CiAgICByZXR1cm4gc3VwZXIKICAgICAgICAuY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgb3B0aW9ucywgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIG5ld0J1aWx0aW5WYXJpYW50KAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIG5ldyBIRGl2aWRlKGluc3RydWN0aW9uLmlucHV0c1sxXSwgaW5zdHJ1Y3Rpb24uaW5wdXRzWzJdLAogICAgICAgIGluc3RydWN0aW9uLnNlbGVjdG9yLCBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmRvdWJsZVR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck9wdGltaXphdGlvbigKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2csIEhJbnN0cnVjdGlvbiBvcmlnaW5hbCwgSEluc3RydWN0aW9uIGNvbnZlcnRlZCkgewogICAgbG9nLnJlZ2lzdGVyRGl2aWRlKG9yaWdpbmFsLCBjb252ZXJ0ZWQpOwogIH0KfQoKY2xhc3MgTW9kdWxvU3BlY2lhbGl6ZXIgZXh0ZW5kcyBCaW5hcnlBcml0aG1ldGljU3BlY2lhbGl6ZXIgewogIGNvbnN0IE1vZHVsb1NwZWNpYWxpemVyKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcygKICAgICAgSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsCiAgICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGlmIChpbnB1dHNBcmVQb3NpdGl2ZUludGVnZXJzKGluc3RydWN0aW9uLCBjbG9zZWRXb3JsZCkpIHsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4ucG9zaXRpdmVJbnRUeXBlOwogICAgfQogICAgcmV0dXJuIHN1cGVyCiAgICAgICAgLmNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoaW5zdHJ1Y3Rpb24sIHJlc3VsdHMsIG9wdGlvbnMsIGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgewogICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5tb2R1bG87CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gbmV3QnVpbHRpblZhcmlhbnQoCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICAvLyBNb2R1bG8gY2Fubm90IGJlIG1hcHBlZCB0byB0aGUgbmF0aXZlIG9wZXJhdG9yIChkaWZmZXJlbnQgc2VtYW50aWNzKS4KCiAgICAvLyBXZSBjYW4gdXNlIEhSZW1haW5kZXIgaWYgYm90aCBpbnB1dHMgYXJlIG5vbi1uZWdhdGl2ZSBhbmQgdGhlIHJlY2VpdmVyCiAgICAvLyBjYW5ub3QgYmUgLTAuMC4gIE5vdGUgdGhhdCAtMC4wIGlzIGNvbnNpZGVyZWQgdG8gYmUgYW4gaW50LCBzbyB1bnRpbCB3ZQogICAgLy8gdHJhY2sgLTAuMCBwcmVjaXNlbHksIHdlIGhhdmUgdG8gc3ludGF0aWNhbGx5IGZpbHRlciBpbnB1dHMgdGhhdCBjYW5ub3QKICAgIC8vIGdlbmVyYXRlIC0wLjAuCiAgICBib29sIGNhbkJlUG9zaXRpdmVaZXJvKEhJbnN0cnVjdGlvbiBpbnB1dCkgewogICAgICBpZiAoaW5wdXQgaXMgSENvbnN0YW50KSB7CiAgICAgICAgQ29uc3RhbnRWYWx1ZSB2YWx1ZSA9IGlucHV0LmNvbnN0YW50OwogICAgICAgIGlmICh2YWx1ZSBpcyBEb3VibGVDb25zdGFudFZhbHVlICYmIHZhbHVlLmlzWmVybykgcmV0dXJuIHRydWU7CiAgICAgICAgaWYgKHZhbHVlIGlzIEludENvbnN0YW50VmFsdWUgJiYgdmFsdWUuaXNaZXJvKSByZXR1cm4gdHJ1ZTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgYm9vbCBpblBoaSA9IGZhbHNlOwogICAgYm9vbCBjYW5CZU5lZ2F0aXZlWmVybyhISW5zdHJ1Y3Rpb24gaW5wdXQpIHsKICAgICAgaWYgKGlucHV0IGlzIEhDb25zdGFudCkgewogICAgICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBpbnB1dC5jb25zdGFudDsKICAgICAgICBpZiAodmFsdWUgaXMgRG91YmxlQ29uc3RhbnRWYWx1ZSAmJiB2YWx1ZS5pc01pbnVzWmVybykgcmV0dXJuIHRydWU7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGlmIChpbnB1dCBpcyBIQWRkKSB7CiAgICAgICAgLy8gJysnIGNhbiBvbmx5IGdlbmVyYXRlIC0wLjAgd2hlbiBib3RoIGlucHV0cyBhcmUgLTAuMC4KICAgICAgICByZXR1cm4gY2FuQmVOZWdhdGl2ZVplcm8oaW5wdXQubGVmdCkgJiYgY2FuQmVOZWdhdGl2ZVplcm8oaW5wdXQucmlnaHQpOwogICAgICB9CiAgICAgIGlmIChpbnB1dCBpcyBIU3VidHJhY3QpIHsKICAgICAgICByZXR1cm4gY2FuQmVOZWdhdGl2ZVplcm8oaW5wdXQubGVmdCkgJiYgY2FuQmVQb3NpdGl2ZVplcm8oaW5wdXQucmlnaHQpOwogICAgICB9CiAgICAgIGlmIChpbnB1dCBpcyBIUGhpKSB7CiAgICAgICAgaWYgKGluUGhpKSByZXR1cm4gdHJ1ZTsKICAgICAgICBpblBoaSA9IHRydWU7CiAgICAgICAgYm9vbCByZXN1bHQgPSBpbnB1dC5pbnB1dHMuYW55KGNhbkJlTmVnYXRpdmVaZXJvKTsKICAgICAgICBpblBoaSA9IGZhbHNlOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgaWYgKGlucHV0c0FyZVBvc2l0aXZlSW50ZWdlcnMoaW5zdHJ1Y3Rpb24sIGNsb3NlZFdvcmxkKSAmJgogICAgICAgICFjYW5CZU5lZ2F0aXZlWmVybyhpbnN0cnVjdGlvbi5nZXREYXJ0UmVjZWl2ZXIoY2xvc2VkV29ybGQpKSkgewogICAgICByZXR1cm4gbmV3IEhSZW1haW5kZXIoCiAgICAgICAgICBpbnN0cnVjdGlvbi5pbnB1dHNbMV0sCiAgICAgICAgICBpbnN0cnVjdGlvbi5pbnB1dHNbMl0sCiAgICAgICAgICBpbnN0cnVjdGlvbi5zZWxlY3RvciwKICAgICAgICAgIGNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoCiAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24sIHJlc3VsdHMsIG9wdGlvbnMsIGNsb3NlZFdvcmxkKSk7CiAgICB9CiAgICAvLyBUT0RPKHNyYSk6CiAgICAvLyAgIGEgJSBOIC0tPiAgYSAmIChOLTEpLCBOPTJeaywgd2hlcmUgYT49MCwgZG9lcyBub3QgaGF2ZSAtMC4wIHByb2JsZW0uCgogICAgLy8gVE9ETyhzcmEpOiBXZSBjb3VsZCBhdm9pZCBwcm9ibGVtcyB3aXRoIC0wLjAgaWYgd2UgZ2VuZXJhdGUgeCAlIHkgYXMgKHggKwogICAgLy8gMCkgJSB5LCBidXQgd2Ugd291bGQgaGF2ZSB0byBmaXggSEFkZCBvcHRpbWl6YXRpb25zLgoKICAgIC8vIFRPRE8oc3JhKTogV2UgY291bGQgcmVwbGFjZSAkbW9kIHdpdGggSFJlbWFpbmRlciB3aGVuIHdlIGRvbid0IGNhcmUgYWJvdXQKICAgIC8vIGEgLTAuMCByZXN1bHQgKGUuZy4gYSAlIDEwID09IDAsIGFbaSAlIDNdKS4gVGhpcyBpcyB0cmlja3ksIHNpbmNlIHdlCiAgICAvLyBkb24ndCB3YW50IHRvIHJ1aW4gR1ZOIG9wcG9ydHVuaXRpZXMuCiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJPcHRpbWl6YXRpb24oCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nLCBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwsIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQpIHsKICAgIGxvZy5yZWdpc3Rlck1vZHVsbyhvcmlnaW5hbCwgY29udmVydGVkKTsKICB9Cn0KCmNsYXNzIFJlbWFpbmRlclNwZWNpYWxpemVyIGV4dGVuZHMgQmluYXJ5QXJpdGhtZXRpY1NwZWNpYWxpemVyIHsKICBjb25zdCBSZW1haW5kZXJTcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBpZiAoaW5wdXRzQXJlUG9zaXRpdmVJbnRlZ2VycyhpbnN0cnVjdGlvbiwgY2xvc2VkV29ybGQpKSB7CiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLnBvc2l0aXZlSW50VHlwZTsKICAgIH0KICAgIHJldHVybiBzdXBlcgogICAgICAgIC5jb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKGluc3RydWN0aW9uLCByZXN1bHRzLCBvcHRpb25zLCBjbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpIHsKICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0ucmVtYWluZGVyOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIG5ld0J1aWx0aW5WYXJpYW50KAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIG5ldyBIUmVtYWluZGVyKAogICAgICAgIGluc3RydWN0aW9uLmlucHV0c1sxXSwKICAgICAgICBpbnN0cnVjdGlvbi5pbnB1dHNbMl0sCiAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IsCiAgICAgICAgY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgb3B0aW9ucywgY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJPcHRpbWl6YXRpb24oCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nLCBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwsIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQpIHsKICAgIGxvZy5yZWdpc3RlclJlbWFpbmRlcihvcmlnaW5hbCwgY29udmVydGVkKTsKICB9Cn0KCmNsYXNzIE11bHRpcGx5U3BlY2lhbGl6ZXIgZXh0ZW5kcyBCaW5hcnlBcml0aG1ldGljU3BlY2lhbGl6ZXIgewogIGNvbnN0IE11bHRpcGx5U3BlY2lhbGl6ZXIoKTsKCiAgQG92ZXJyaWRlCiAgY29uc3RhbnRfc3lzdGVtLkJpbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24oKSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLm11bHRpcGx5OwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgaWYgKGlucHV0c0FyZVBvc2l0aXZlSW50ZWdlcnMoaW5zdHJ1Y3Rpb24sIGNsb3NlZFdvcmxkKSkgewogICAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5wb3NpdGl2ZUludFR5cGU7CiAgICB9CiAgICByZXR1cm4gc3VwZXIKICAgICAgICAuY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgb3B0aW9ucywgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIG5ld0J1aWx0aW5WYXJpYW50KAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIG5ldyBITXVsdGlwbHkoCiAgICAgICAgaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdLAogICAgICAgIGluc3RydWN0aW9uLmlucHV0c1syXSwKICAgICAgICBpbnN0cnVjdGlvbi5zZWxlY3RvciwKICAgICAgICBjb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKGluc3RydWN0aW9uLCByZXN1bHRzLCBvcHRpb25zLCBjbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck9wdGltaXphdGlvbigKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2csIEhJbnN0cnVjdGlvbiBvcmlnaW5hbCwgSEluc3RydWN0aW9uIGNvbnZlcnRlZCkgewogICAgbG9nLnJlZ2lzdGVyTXVsdGlwbHkob3JpZ2luYWwsIGNvbnZlcnRlZCk7CiAgfQp9CgpjbGFzcyBTdWJ0cmFjdFNwZWNpYWxpemVyIGV4dGVuZHMgQmluYXJ5QXJpdGhtZXRpY1NwZWNpYWxpemVyIHsKICBjb25zdCBTdWJ0cmFjdFNwZWNpYWxpemVyKCk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgewogICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5zdWJ0cmFjdDsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBuZXdCdWlsdGluVmFyaWFudCgKICAgICAgSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsCiAgICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBuZXcgSFN1YnRyYWN0KAogICAgICAgIGluc3RydWN0aW9uLmlucHV0c1sxXSwKICAgICAgICBpbnN0cnVjdGlvbi5pbnB1dHNbMl0sCiAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IsCiAgICAgICAgY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgb3B0aW9ucywgY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJPcHRpbWl6YXRpb24oCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nLCBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwsIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQpIHsKICAgIGxvZy5yZWdpc3RlclN1YnRyYWN0KG9yaWdpbmFsLCBjb252ZXJ0ZWQpOwogIH0KfQoKY2xhc3MgVHJ1bmNhdGluZ0RpdmlkZVNwZWNpYWxpemVyIGV4dGVuZHMgQmluYXJ5QXJpdGhtZXRpY1NwZWNpYWxpemVyIHsKICBjb25zdCBUcnVuY2F0aW5nRGl2aWRlU3BlY2lhbGl6ZXIoKTsKCiAgQG92ZXJyaWRlCiAgY29uc3RhbnRfc3lzdGVtLkJpbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24oKSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLnRydW5jYXRpbmdEaXZpZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBpZiAoaGFzVWludDMxUmVzdWx0KGluc3RydWN0aW9uLCBjbG9zZWRXb3JsZCkpIHsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4udWludDMxVHlwZTsKICAgIH0KICAgIGlmIChpbnB1dHNBcmVQb3NpdGl2ZUludGVnZXJzKGluc3RydWN0aW9uLCBjbG9zZWRXb3JsZCkpIHsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4ucG9zaXRpdmVJbnRUeXBlOwogICAgfQogICAgcmV0dXJuIHN1cGVyCiAgICAgICAgLmNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoaW5zdHJ1Y3Rpb24sIHJlc3VsdHMsIG9wdGlvbnMsIGNsb3NlZFdvcmxkKTsKICB9CgogIGJvb2wgaXNOb3RaZXJvKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgaWYgKCFpbnN0cnVjdGlvbi5pc0NvbnN0YW50SW50ZWdlcigpKSByZXR1cm4gZmFsc2U7CiAgICBIQ29uc3RhbnQgcmlnaHRDb25zdGFudCA9IGluc3RydWN0aW9uOwogICAgSW50Q29uc3RhbnRWYWx1ZSBpbnRDb25zdGFudCA9IHJpZ2h0Q29uc3RhbnQuY29uc3RhbnQ7CiAgICBCaWdJbnQgY291bnQgPSBpbnRDb25zdGFudC5pbnRWYWx1ZTsKICAgIHJldHVybiBjb3VudCAhPSBCaWdJbnQuemVybzsKICB9CgogIGJvb2wgaXNUd29PckdyZWF0ZXIoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBpZiAoIWluc3RydWN0aW9uLmlzQ29uc3RhbnRJbnRlZ2VyKCkpIHJldHVybiBmYWxzZTsKICAgIEhDb25zdGFudCByaWdodENvbnN0YW50ID0gaW5zdHJ1Y3Rpb247CiAgICBJbnRDb25zdGFudFZhbHVlIGludENvbnN0YW50ID0gcmlnaHRDb25zdGFudC5jb25zdGFudDsKICAgIEJpZ0ludCBjb3VudCA9IGludENvbnN0YW50LmludFZhbHVlOwogICAgcmV0dXJuIGNvdW50ID49IEJpZ0ludC50d287CiAgfQoKICBib29sIGhhc1VpbnQzMVJlc3VsdChISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24sIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgSEluc3RydWN0aW9uIGxlZnQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMV07CiAgICBISW5zdHJ1Y3Rpb24gcmlnaHQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMl07CiAgICBpZiAocmlnaHQKICAgICAgICAuaXNQb3NpdGl2ZUludGVnZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBpZiAobGVmdC5pc1VJbnQzMShjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgICBpc05vdFplcm8ocmlnaHQpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKGxlZnQuaXNVSW50MzIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSAmJgogICAgICAgICAgaXNUd29PckdyZWF0ZXIocmlnaHQpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB0cnlDb252ZXJ0VG9CdWlsdGluKAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgSEdyYXBoIGdyYXBoLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgICAgSkNvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nKSB7CiAgICBISW5zdHJ1Y3Rpb24gcmlnaHQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMl07CiAgICBpZiAoaXNCdWlsdGluKGluc3RydWN0aW9uLCBjbG9zZWRXb3JsZCkpIHsKICAgICAgaWYgKHJpZ2h0CiAgICAgICAgICAgICAgLmlzUG9zaXRpdmVJbnRlZ2VyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICAgIGlzTm90WmVybyhyaWdodCkpIHsKICAgICAgICBpZiAoaGFzVWludDMxUmVzdWx0KGluc3RydWN0aW9uLCBjbG9zZWRXb3JsZCkpIHsKICAgICAgICAgIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQgPQogICAgICAgICAgICAgIG5ld0J1aWx0aW5WYXJpYW50KGluc3RydWN0aW9uLCByZXN1bHRzLCBvcHRpb25zLCBjbG9zZWRXb3JsZCk7CiAgICAgICAgICBpZiAobG9nICE9IG51bGwpIHsKICAgICAgICAgICAgcmVnaXN0ZXJPcHRpbWl6YXRpb24obG9nLCBpbnN0cnVjdGlvbiwgY29udmVydGVkKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjb252ZXJ0ZWQ7CiAgICAgICAgfQogICAgICAgIC8vIFdlIGNhbiBjYWxsIF90ZGl2RmFzdCBiZWNhdXNlIHRoZSByaHMgaXMgYSAzMmJpdCBpbnRlZ2VyCiAgICAgICAgLy8gYW5kIG5vdCAwLCBub3IgLTEuCiAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IgPSByZW5hbWVUb09wdGltaXplZFNlbGVjdG9yKAogICAgICAgICAgICAnX3RkaXZGYXN0JywgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IsIGNvbW1vbkVsZW1lbnRzKTsKICAgICAgICBpZiAobG9nICE9IG51bGwpIHsKICAgICAgICAgIHJlZ2lzdGVyT3B0aW1pemF0aW9uKGxvZywgaW5zdHJ1Y3Rpb24sIG51bGwpOwogICAgICAgIH0KICAgICAgfQogICAgICBjbGVhckFsbFNpZGVFZmZlY3RzKGluc3RydWN0aW9uKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIG5ld0J1aWx0aW5WYXJpYW50KAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIG5ldyBIVHJ1bmNhdGluZ0RpdmlkZSgKICAgICAgICBpbnN0cnVjdGlvbi5pbnB1dHNbMV0sCiAgICAgICAgaW5zdHJ1Y3Rpb24uaW5wdXRzWzJdLAogICAgICAgIGluc3RydWN0aW9uLnNlbGVjdG9yLAogICAgICAgIGNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoaW5zdHJ1Y3Rpb24sIHJlc3VsdHMsIG9wdGlvbnMsIGNsb3NlZFdvcmxkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyT3B0aW1pemF0aW9uKAogICAgICBPcHRpbWl6YXRpb25UZXN0TG9nIGxvZywgSEluc3RydWN0aW9uIG9yaWdpbmFsLCBISW5zdHJ1Y3Rpb24gY29udmVydGVkKSB7CiAgICBsb2cucmVnaXN0ZXJUcnVuY2F0aW5nRGl2aWRlKG9yaWdpbmFsLCBjb252ZXJ0ZWQpOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgQmluYXJ5Qml0T3BTcGVjaWFsaXplciBleHRlbmRzIEJpbmFyeUFyaXRobWV0aWNTcGVjaWFsaXplciB7CiAgY29uc3QgQmluYXJ5Qml0T3BTcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICAvLyBBbGwgYml0d2lzZSBvcGVyYXRpb25zIG9uIG51bWJlciB0eXBlcyBlaXRoZXIgcHJvZHVjZSBhbiB1bnNpZ25lZCAzMi1iaXQKICAgIC8vIGludGVnZXIgb3IgdGhyb3cgYW4gZXJyb3IuCiAgICBISW5zdHJ1Y3Rpb24gbGVmdCA9IGluc3RydWN0aW9uLmlucHV0c1sxXTsKICAgIGlmIChsZWZ0LmlzTnVtYmVyT3JOdWxsKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4udWludDMyVHlwZTsKICAgIH0KICAgIHJldHVybiBzdXBlcgogICAgICAgIC5jb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKGluc3RydWN0aW9uLCByZXN1bHRzLCBvcHRpb25zLCBjbG9zZWRXb3JsZCk7CiAgfQoKICBib29sIGFyZ3VtZW50TGVzc1RoYW4zMihISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIHJldHVybiBhcmd1bWVudEluUmFuZ2UoaW5zdHJ1Y3Rpb24sIDAsIDMxKTsKICB9CgogIGJvb2wgYXJndW1lbnRJblJhbmdlKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiwgaW50IGxvdywgaW50IGhpZ2gpIHsKICAgIGlmIChpbnN0cnVjdGlvbi5pc0NvbnN0YW50SW50ZWdlcigpKSB7CiAgICAgIEhDb25zdGFudCByaWdodENvbnN0YW50ID0gaW5zdHJ1Y3Rpb247CiAgICAgIEludENvbnN0YW50VmFsdWUgaW50Q29uc3RhbnQgPSByaWdodENvbnN0YW50LmNvbnN0YW50OwogICAgICBpbnQgdmFsdWUgPSBpbnRDb25zdGFudC5pbnRWYWx1ZS50b0ludCgpOwogICAgICBhc3NlcnQoaW50Q29uc3RhbnQuaW50VmFsdWUgPT0KICAgICAgICAgIG5ldyBCaWdJbnQuZnJvbShpbnRDb25zdGFudC5pbnRWYWx1ZS50b0ludCgpKSk7CiAgICAgIHJldHVybiB2YWx1ZSA+PSBsb3cgJiYgdmFsdWUgPD0gaGlnaDsKICAgIH0KICAgIC8vIFRPRE8oc3JhKTogSW50ZWdyYXRlIHdpdGggdGhlIGJpdC13aWR0aCBhbmFseXNpcyBpbiBjb2RlZ2VuLmRhcnQuCiAgICBpZiAoaW5zdHJ1Y3Rpb24gaXMgSEJpdEFuZCkgewogICAgICByZXR1cm4gbG93ID09IDAgJiYKICAgICAgICAgIChhcmd1bWVudEluUmFuZ2UoaW5zdHJ1Y3Rpb24uaW5wdXRzWzBdLCBsb3csIGhpZ2gpIHx8CiAgICAgICAgICAgICAgYXJndW1lbnRJblJhbmdlKGluc3RydWN0aW9uLmlucHV0c1sxXSwgbG93LCBoaWdoKSk7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBib29sIGlzUG9zaXRpdmUoSEluc3RydWN0aW9uIGluc3RydWN0aW9uLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIC8vIFRPRE86IFdlIHNob3VsZCB1c2UgdGhlIHZhbHVlIHJhbmdlIGFuYWx5c2lzLiBDdXJyZW50bHksIHJhbmdlcwogICAgLy8gYXJlIGRpc2NhcmRlZCBqdXN0IGFmdGVyIHRoZSBhbmFseXNpcy4KICAgIHJldHVybiBpbnN0cnVjdGlvbgogICAgICAgIC5pc1Bvc2l0aXZlSW50ZWdlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgIC5pc0RlZmluaXRlbHlUcnVlOwogIH0KfQoKY2xhc3MgU2hpZnRMZWZ0U3BlY2lhbGl6ZXIgZXh0ZW5kcyBCaW5hcnlCaXRPcFNwZWNpYWxpemVyIHsKICBjb25zdCBTaGlmdExlZnRTcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpIHsKICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0uc2hpZnRMZWZ0OwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHRyeUNvbnZlcnRUb0J1aWx0aW4oCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBIR3JhcGggZ3JhcGgsCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsCiAgICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgICBKQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2cpIHsKICAgIEhJbnN0cnVjdGlvbiBsZWZ0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdOwogICAgSEluc3RydWN0aW9uIHJpZ2h0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzJdOwogICAgaWYgKGxlZnQuaXNOdW1iZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBpZiAoYXJndW1lbnRMZXNzVGhhbjMyKHJpZ2h0KSkgewogICAgICAgIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQgPQogICAgICAgICAgICBuZXdCdWlsdGluVmFyaWFudChpbnN0cnVjdGlvbiwgcmVzdWx0cywgb3B0aW9ucywgY2xvc2VkV29ybGQpOwogICAgICAgIGlmIChsb2cgIT0gbnVsbCkgewogICAgICAgICAgcmVnaXN0ZXJPcHRpbWl6YXRpb24obG9nLCBpbnN0cnVjdGlvbiwgY29udmVydGVkKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbnZlcnRlZDsKICAgICAgfQogICAgICAvLyBFdmVuIGlmIHRoZXJlIGlzIG5vIGJ1aWx0aW4gZXF1aXZhbGVudCBpbnN0cnVjdGlvbiwgd2Uga25vdwogICAgICAvLyB0aGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgaGF2ZSBhbnkgc2lkZSBlZmZlY3QsIGFuZCB0aGF0IGl0CiAgICAgIC8vIGNhbiBiZSBHVk4nZWQuCiAgICAgIGNsZWFyQWxsU2lkZUVmZmVjdHMoaW5zdHJ1Y3Rpb24pOwogICAgICBpZiAoaXNQb3NpdGl2ZShyaWdodCwgY2xvc2VkV29ybGQpKSB7CiAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IgPSByZW5hbWVUb09wdGltaXplZFNlbGVjdG9yKAogICAgICAgICAgICAnX3NobFBvc2l0aXZlJywgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IsIGNvbW1vbkVsZW1lbnRzKTsKICAgICAgfQogICAgICBpZiAobG9nICE9IG51bGwpIHsKICAgICAgICByZWdpc3Rlck9wdGltaXphdGlvbihsb2csIGluc3RydWN0aW9uLCBudWxsKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gbmV3QnVpbHRpblZhcmlhbnQoCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gbmV3IEhTaGlmdExlZnQoCiAgICAgICAgaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdLAogICAgICAgIGluc3RydWN0aW9uLmlucHV0c1syXSwKICAgICAgICBpbnN0cnVjdGlvbi5zZWxlY3RvciwKICAgICAgICBjb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKGluc3RydWN0aW9uLCByZXN1bHRzLCBvcHRpb25zLCBjbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck9wdGltaXphdGlvbigKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2csIEhJbnN0cnVjdGlvbiBvcmlnaW5hbCwgSEluc3RydWN0aW9uIGNvbnZlcnRlZCkgewogICAgbG9nLnJlZ2lzdGVyU2hpZnRMZWZ0KG9yaWdpbmFsLCBjb252ZXJ0ZWQpOwogIH0KfQoKY2xhc3MgU2hpZnRSaWdodFNwZWNpYWxpemVyIGV4dGVuZHMgQmluYXJ5Qml0T3BTcGVjaWFsaXplciB7CiAgY29uc3QgU2hpZnRSaWdodFNwZWNpYWxpemVyKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcygKICAgICAgSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsCiAgICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIEhJbnN0cnVjdGlvbiBsZWZ0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdOwogICAgaWYgKGxlZnQuaXNVSW50MzIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICByZXR1cm4gbGVmdC5pbnN0cnVjdGlvblR5cGU7CiAgICB9CiAgICByZXR1cm4gc3VwZXIKICAgICAgICAuY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgb3B0aW9ucywgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHRyeUNvbnZlcnRUb0J1aWx0aW4oCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBIR3JhcGggZ3JhcGgsCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsCiAgICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgICBKQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2cpIHsKICAgIEhJbnN0cnVjdGlvbiBsZWZ0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdOwogICAgSEluc3RydWN0aW9uIHJpZ2h0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzJdOwogICAgaWYgKGxlZnQuaXNOdW1iZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBpZiAoYXJndW1lbnRMZXNzVGhhbjMyKHJpZ2h0KSAmJiBpc1Bvc2l0aXZlKGxlZnQsIGNsb3NlZFdvcmxkKSkgewogICAgICAgIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQgPQogICAgICAgICAgICBuZXdCdWlsdGluVmFyaWFudChpbnN0cnVjdGlvbiwgcmVzdWx0cywgb3B0aW9ucywgY2xvc2VkV29ybGQpOwogICAgICAgIGlmIChsb2cgIT0gbnVsbCkgewogICAgICAgICAgcmVnaXN0ZXJPcHRpbWl6YXRpb24obG9nLCBpbnN0cnVjdGlvbiwgY29udmVydGVkKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbnZlcnRlZDsKICAgICAgfQogICAgICAvLyBFdmVuIGlmIHRoZXJlIGlzIG5vIGJ1aWx0aW4gZXF1aXZhbGVudCBpbnN0cnVjdGlvbiwgd2Uga25vdwogICAgICAvLyB0aGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgaGF2ZSBhbnkgc2lkZSBlZmZlY3QsIGFuZCB0aGF0IGl0CiAgICAgIC8vIGNhbiBiZSBHVk4nZWQuCiAgICAgIGNsZWFyQWxsU2lkZUVmZmVjdHMoaW5zdHJ1Y3Rpb24pOwogICAgICBpZiAoaXNQb3NpdGl2ZShyaWdodCwgY2xvc2VkV29ybGQpICYmIGlzUG9zaXRpdmUobGVmdCwgY2xvc2VkV29ybGQpKSB7CiAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IgPSByZW5hbWVUb09wdGltaXplZFNlbGVjdG9yKAogICAgICAgICAgICAnX3NockJvdGhQb3NpdGl2ZScsIGluc3RydWN0aW9uLnNlbGVjdG9yLCBjb21tb25FbGVtZW50cyk7CiAgICAgICAgaWYgKGxvZyAhPSBudWxsKSB7CiAgICAgICAgICByZWdpc3Rlck9wdGltaXphdGlvbihsb2csIGluc3RydWN0aW9uLCBudWxsKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoaXNQb3NpdGl2ZShsZWZ0LCBjbG9zZWRXb3JsZCkgJiYKICAgICAgICAgIHJpZ2h0LmlzTnVtYmVyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICBpbnN0cnVjdGlvbi5zZWxlY3RvciA9IHJlbmFtZVRvT3B0aW1pemVkU2VsZWN0b3IoCiAgICAgICAgICAgICdfc2hyUmVjZWl2ZXJQb3NpdGl2ZScsIGluc3RydWN0aW9uLnNlbGVjdG9yLCBjb21tb25FbGVtZW50cyk7CiAgICAgICAgaWYgKGxvZyAhPSBudWxsKSB7CiAgICAgICAgICByZWdpc3Rlck9wdGltaXphdGlvbihsb2csIGluc3RydWN0aW9uLCBudWxsKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoaXNQb3NpdGl2ZShyaWdodCwgY2xvc2VkV29ybGQpKSB7CiAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IgPSByZW5hbWVUb09wdGltaXplZFNlbGVjdG9yKAogICAgICAgICAgICAnX3Nock90aGVyUG9zaXRpdmUnLCBpbnN0cnVjdGlvbi5zZWxlY3RvciwgY29tbW9uRWxlbWVudHMpOwogICAgICAgIGlmIChsb2cgIT0gbnVsbCkgewogICAgICAgICAgcmVnaXN0ZXJPcHRpbWl6YXRpb24obG9nLCBpbnN0cnVjdGlvbiwgbnVsbCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBuZXdCdWlsdGluVmFyaWFudCgKICAgICAgSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsCiAgICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBuZXcgSFNoaWZ0UmlnaHQoCiAgICAgICAgaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdLAogICAgICAgIGluc3RydWN0aW9uLmlucHV0c1syXSwKICAgICAgICBpbnN0cnVjdGlvbi5zZWxlY3RvciwKICAgICAgICBjb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKGluc3RydWN0aW9uLCByZXN1bHRzLCBvcHRpb25zLCBjbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgY29uc3RhbnRfc3lzdGVtLkJpbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24oKSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLnNoaWZ0UmlnaHQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyT3B0aW1pemF0aW9uKAogICAgICBPcHRpbWl6YXRpb25UZXN0TG9nIGxvZywgSEluc3RydWN0aW9uIG9yaWdpbmFsLCBISW5zdHJ1Y3Rpb24gY29udmVydGVkKSB7CiAgICBsb2cucmVnaXN0ZXJTaGlmdFJpZ2h0KG9yaWdpbmFsLCBjb252ZXJ0ZWQpOwogIH0KfQoKY2xhc3MgQml0T3JTcGVjaWFsaXplciBleHRlbmRzIEJpbmFyeUJpdE9wU3BlY2lhbGl6ZXIgewogIGNvbnN0IEJpdE9yU3BlY2lhbGl6ZXIoKTsKCiAgQG92ZXJyaWRlCiAgY29uc3RhbnRfc3lzdGVtLkJpbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24oKSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmJpdE9yOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgSEluc3RydWN0aW9uIGxlZnQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMV07CiAgICBISW5zdHJ1Y3Rpb24gcmlnaHQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMl07CiAgICBpZiAobGVmdC5pc1VJbnQzMShjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgcmlnaHQuaXNVSW50MzEoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi51aW50MzFUeXBlOwogICAgfQogICAgcmV0dXJuIHN1cGVyCiAgICAgICAgLmNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoaW5zdHJ1Y3Rpb24sIHJlc3VsdHMsIG9wdGlvbnMsIGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBuZXdCdWlsdGluVmFyaWFudCgKICAgICAgSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsCiAgICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBuZXcgSEJpdE9yKAogICAgICAgIGluc3RydWN0aW9uLmlucHV0c1sxXSwKICAgICAgICBpbnN0cnVjdGlvbi5pbnB1dHNbMl0sCiAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IsCiAgICAgICAgY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgb3B0aW9ucywgY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJPcHRpbWl6YXRpb24oCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nLCBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwsIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQpIHsKICAgIGxvZy5yZWdpc3RlckJpdE9yKG9yaWdpbmFsLCBjb252ZXJ0ZWQpOwogIH0KfQoKY2xhc3MgQml0QW5kU3BlY2lhbGl6ZXIgZXh0ZW5kcyBCaW5hcnlCaXRPcFNwZWNpYWxpemVyIHsKICBjb25zdCBCaXRBbmRTcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpIHsKICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0uYml0QW5kOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgSEluc3RydWN0aW9uIGxlZnQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMV07CiAgICBISW5zdHJ1Y3Rpb24gcmlnaHQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMl07CiAgICBpZiAobGVmdAogICAgICAgICAgICAuaXNQcmltaXRpdmVPck51bGwoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICAobGVmdC5pc1VJbnQzMShjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlIHx8CiAgICAgICAgICAgIHJpZ2h0LmlzVUludDMxKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpKSB7CiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLnVpbnQzMVR5cGU7CiAgICB9CiAgICByZXR1cm4gc3VwZXIKICAgICAgICAuY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgb3B0aW9ucywgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIG5ld0J1aWx0aW5WYXJpYW50KAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIG5ldyBIQml0QW5kKAogICAgICAgIGluc3RydWN0aW9uLmlucHV0c1sxXSwKICAgICAgICBpbnN0cnVjdGlvbi5pbnB1dHNbMl0sCiAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IsCiAgICAgICAgY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgb3B0aW9ucywgY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJPcHRpbWl6YXRpb24oCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nLCBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwsIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQpIHsKICAgIGxvZy5yZWdpc3RlckJpdEFuZChvcmlnaW5hbCwgY29udmVydGVkKTsKICB9Cn0KCmNsYXNzIEJpdFhvclNwZWNpYWxpemVyIGV4dGVuZHMgQmluYXJ5Qml0T3BTcGVjaWFsaXplciB7CiAgY29uc3QgQml0WG9yU3BlY2lhbGl6ZXIoKTsKCiAgQG92ZXJyaWRlCiAgY29uc3RhbnRfc3lzdGVtLkJpbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24oKSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmJpdFhvcjsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcygKICAgICAgSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsCiAgICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIEhJbnN0cnVjdGlvbiBsZWZ0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdOwogICAgSEluc3RydWN0aW9uIHJpZ2h0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzJdOwogICAgaWYgKGxlZnQuaXNVSW50MzEoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSAmJgogICAgICAgIHJpZ2h0LmlzVUludDMxKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4udWludDMxVHlwZTsKICAgIH0KICAgIHJldHVybiBzdXBlcgogICAgICAgIC5jb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKGluc3RydWN0aW9uLCByZXN1bHRzLCBvcHRpb25zLCBjbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gbmV3QnVpbHRpblZhcmlhbnQoCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gbmV3IEhCaXRYb3IoCiAgICAgICAgaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdLAogICAgICAgIGluc3RydWN0aW9uLmlucHV0c1syXSwKICAgICAgICBpbnN0cnVjdGlvbi5zZWxlY3RvciwKICAgICAgICBjb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKGluc3RydWN0aW9uLCByZXN1bHRzLCBvcHRpb25zLCBjbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck9wdGltaXphdGlvbigKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2csIEhJbnN0cnVjdGlvbiBvcmlnaW5hbCwgSEluc3RydWN0aW9uIGNvbnZlcnRlZCkgewogICAgbG9nLnJlZ2lzdGVyQml0WG9yKG9yaWdpbmFsLCBjb252ZXJ0ZWQpOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgUmVsYXRpb25hbFNwZWNpYWxpemVyIGV4dGVuZHMgSW52b2tlRHluYW1pY1NwZWNpYWxpemVyIHsKICBjb25zdCBSZWxhdGlvbmFsU3BlY2lhbGl6ZXIoKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgaWYgKGluc3RydWN0aW9uLmlucHV0c1sxXQogICAgICAgIC5pc1ByaW1pdGl2ZU9yTnVsbChjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgIC5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmJvb2xUeXBlOwogICAgfQogICAgcmV0dXJuIHN1cGVyCiAgICAgICAgLmNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoaW5zdHJ1Y3Rpb24sIHJlc3VsdHMsIG9wdGlvbnMsIGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB0cnlDb252ZXJ0VG9CdWlsdGluKAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgSEdyYXBoIGdyYXBoLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgICAgSkNvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nKSB7CiAgICBISW5zdHJ1Y3Rpb24gbGVmdCA9IGluc3RydWN0aW9uLmlucHV0c1sxXTsKICAgIEhJbnN0cnVjdGlvbiByaWdodCA9IGluc3RydWN0aW9uLmlucHV0c1syXTsKICAgIGlmIChsZWZ0LmlzTnVtYmVyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICByaWdodC5pc051bWJlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQgPSBuZXdCdWlsdGluVmFyaWFudChpbnN0cnVjdGlvbiwgY2xvc2VkV29ybGQpOwogICAgICBpZiAobG9nICE9IG51bGwpIHsKICAgICAgICByZWdpc3Rlck9wdGltaXphdGlvbihsb2csIGluc3RydWN0aW9uLCBjb252ZXJ0ZWQpOwogICAgICB9CiAgICAgIHJldHVybiBjb252ZXJ0ZWQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEhJbnN0cnVjdGlvbiBuZXdCdWlsdGluVmFyaWFudCgKICAgICAgSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCk7CgogIHZvaWQgcmVnaXN0ZXJPcHRpbWl6YXRpb24oCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nLCBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwsIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQpOwp9CgpjbGFzcyBFcXVhbHNTcGVjaWFsaXplciBleHRlbmRzIFJlbGF0aW9uYWxTcGVjaWFsaXplciB7CiAgY29uc3QgRXF1YWxzU3BlY2lhbGl6ZXIoKTsKCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHRyeUNvbnZlcnRUb0J1aWx0aW4oCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBIR3JhcGggZ3JhcGgsCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsCiAgICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgICBKQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2cpIHsKICAgIEhJbnN0cnVjdGlvbiBsZWZ0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdOwogICAgSEluc3RydWN0aW9uIHJpZ2h0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzJdOwogICAgQWJzdHJhY3RWYWx1ZSBpbnN0cnVjdGlvblR5cGUgPSBsZWZ0Lmluc3RydWN0aW9uVHlwZTsKICAgIGlmIChyaWdodC5pc0NvbnN0YW50TnVsbCgpIHx8CiAgICAgICAgbGVmdAogICAgICAgICAgICAuaXNQcmltaXRpdmVPck51bGwoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgSEluc3RydWN0aW9uIGNvbnZlcnRlZCA9IG5ld0J1aWx0aW5WYXJpYW50KGluc3RydWN0aW9uLCBjbG9zZWRXb3JsZCk7CiAgICAgIGlmIChsb2cgIT0gbnVsbCkgewogICAgICAgIHJlZ2lzdGVyT3B0aW1pemF0aW9uKGxvZywgaW5zdHJ1Y3Rpb24sIGNvbnZlcnRlZCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnZlcnRlZDsKICAgIH0KICAgIGlmIChjbG9zZWRXb3JsZC5pbmNsdWRlc0Nsb3N1cmVDYWxsKAogICAgICAgIGluc3RydWN0aW9uLnNlbGVjdG9yLCBpbnN0cnVjdGlvblR5cGUpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBtYXRjaGVzID0KICAgICAgICBjbG9zZWRXb3JsZC5sb2NhdGVNZW1iZXJzKGluc3RydWN0aW9uLnNlbGVjdG9yLCBpbnN0cnVjdGlvblR5cGUpOwogICAgLy8gVGhpcyB0ZXN0IHJlbGllcyBvbiBgT2JqZWN0Lj09YCBhbmQgYEludGVyY2VwdG9yLj09YCBhbHdheXMgYmVpbmcKICAgIC8vIGltcGxlbWVudGVkIGJlY2F1c2UgaWYgdGhlIHNlbGVjdG9yIG1hdGNoZXMgYnkgc3VidHlwZSwgaXQgc3RpbGwgd2lsbCBiZQogICAgLy8gYSByZWd1bGFyIG9iamVjdCBvciBhbiBpbnRlcmNlcHRvci4KICAgIGlmIChtYXRjaGVzCiAgICAgICAgLmV2ZXJ5KGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmlzRGVmYXVsdEVxdWFsaXR5SW1wbGVtZW50YXRpb24pKSB7CiAgICAgIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQgPSBuZXdCdWlsdGluVmFyaWFudChpbnN0cnVjdGlvbiwgY2xvc2VkV29ybGQpOwogICAgICBpZiAobG9nICE9IG51bGwpIHsKICAgICAgICByZWdpc3Rlck9wdGltaXphdGlvbihsb2csIGluc3RydWN0aW9uLCBjb252ZXJ0ZWQpOwogICAgICB9CiAgICAgIHJldHVybiBjb252ZXJ0ZWQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgewogICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5lcXVhbDsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBuZXdCdWlsdGluVmFyaWFudCgKICAgICAgSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIG5ldyBISWRlbnRpdHkoaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdLCBpbnN0cnVjdGlvbi5pbnB1dHNbMl0sCiAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IsIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck9wdGltaXphdGlvbigKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2csIEhJbnN0cnVjdGlvbiBvcmlnaW5hbCwgSEluc3RydWN0aW9uIGNvbnZlcnRlZCkgewogICAgbG9nLnJlZ2lzdGVyRXF1YWxzKG9yaWdpbmFsLCBjb252ZXJ0ZWQpOwogIH0KfQoKY2xhc3MgTGVzc1NwZWNpYWxpemVyIGV4dGVuZHMgUmVsYXRpb25hbFNwZWNpYWxpemVyIHsKICBjb25zdCBMZXNzU3BlY2lhbGl6ZXIoKTsKCiAgQG92ZXJyaWRlCiAgY29uc3RhbnRfc3lzdGVtLkJpbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24oKSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmxlc3M7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gbmV3QnVpbHRpblZhcmlhbnQoCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBuZXcgSExlc3MoaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdLCBpbnN0cnVjdGlvbi5pbnB1dHNbMl0sCiAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IsIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck9wdGltaXphdGlvbigKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2csIEhJbnN0cnVjdGlvbiBvcmlnaW5hbCwgSEluc3RydWN0aW9uIGNvbnZlcnRlZCkgewogICAgbG9nLnJlZ2lzdGVyTGVzcyhvcmlnaW5hbCwgY29udmVydGVkKTsKICB9Cn0KCmNsYXNzIEdyZWF0ZXJTcGVjaWFsaXplciBleHRlbmRzIFJlbGF0aW9uYWxTcGVjaWFsaXplciB7CiAgY29uc3QgR3JlYXRlclNwZWNpYWxpemVyKCk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgewogICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5ncmVhdGVyOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIG5ld0J1aWx0aW5WYXJpYW50KAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gbmV3IEhHcmVhdGVyKGluc3RydWN0aW9uLmlucHV0c1sxXSwgaW5zdHJ1Y3Rpb24uaW5wdXRzWzJdLAogICAgICAgIGluc3RydWN0aW9uLnNlbGVjdG9yLCBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmJvb2xUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJPcHRpbWl6YXRpb24oCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nLCBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwsIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQpIHsKICAgIGxvZy5yZWdpc3RlckdyZWF0ZXIob3JpZ2luYWwsIGNvbnZlcnRlZCk7CiAgfQp9CgpjbGFzcyBHcmVhdGVyRXF1YWxTcGVjaWFsaXplciBleHRlbmRzIFJlbGF0aW9uYWxTcGVjaWFsaXplciB7CiAgY29uc3QgR3JlYXRlckVxdWFsU3BlY2lhbGl6ZXIoKTsKCiAgQG92ZXJyaWRlCiAgY29uc3RhbnRfc3lzdGVtLkJpbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24oKSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmdyZWF0ZXJFcXVhbDsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBuZXdCdWlsdGluVmFyaWFudCgKICAgICAgSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIG5ldyBIR3JlYXRlckVxdWFsKGluc3RydWN0aW9uLmlucHV0c1sxXSwgaW5zdHJ1Y3Rpb24uaW5wdXRzWzJdLAogICAgICAgIGluc3RydWN0aW9uLnNlbGVjdG9yLCBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmJvb2xUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJPcHRpbWl6YXRpb24oCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nLCBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwsIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQpIHsKICAgIGxvZy5yZWdpc3RlckdyZWF0ZXJFcXVhbChvcmlnaW5hbCwgY29udmVydGVkKTsKICB9Cn0KCmNsYXNzIExlc3NFcXVhbFNwZWNpYWxpemVyIGV4dGVuZHMgUmVsYXRpb25hbFNwZWNpYWxpemVyIHsKICBjb25zdCBMZXNzRXF1YWxTcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpIHsKICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0ubGVzc0VxdWFsOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIG5ld0J1aWx0aW5WYXJpYW50KAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gbmV3IEhMZXNzRXF1YWwoaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdLCBpbnN0cnVjdGlvbi5pbnB1dHNbMl0sCiAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IsIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck9wdGltaXphdGlvbigKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2csIEhJbnN0cnVjdGlvbiBvcmlnaW5hbCwgSEluc3RydWN0aW9uIGNvbnZlcnRlZCkgewogICAgbG9nLnJlZ2lzdGVyTGVzc0VxdWFsKG9yaWdpbmFsLCBjb252ZXJ0ZWQpOwogIH0KfQoKY2xhc3MgQ29kZVVuaXRBdFNwZWNpYWxpemVyIGV4dGVuZHMgSW52b2tlRHluYW1pY1NwZWNpYWxpemVyIHsKICBjb25zdCBDb2RlVW5pdEF0U3BlY2lhbGl6ZXIoKTsKCiAgQG92ZXJyaWRlCiAgY29uc3RhbnRfc3lzdGVtLkJpbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24oKSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmNvZGVVbml0QXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdHJ5Q29udmVydFRvQnVpbHRpbigKICAgICAgSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sCiAgICAgIEhHcmFwaCBncmFwaCwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCiAgICAgIEpDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBPcHRpbWl6YXRpb25UZXN0TG9nIGxvZykgewogICAgLy8gVE9ETyhzcmEpOiBJbXBsZW1lbnQgYSBidWlsdGluIEhDb2RlVW5pdEF0IGluc3RydWN0aW9uIGFuZCB0aGUgc2FtZSBpbmRleAogICAgLy8gYm91bmRzIGNoZWNraW5nIG9wdGltaXphdGlvbnMgYXMgZm9yIEhJbmRleC4KICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciA9IGluc3RydWN0aW9uLmdldERhcnRSZWNlaXZlcihjbG9zZWRXb3JsZCk7CiAgICBpZiAocmVjZWl2ZXIKICAgICAgICAuaXNTdHJpbmdPck51bGwoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICAvLyBFdmVuIGlmIHRoZXJlIGlzIG5vIGJ1aWx0aW4gZXF1aXZhbGVudCBpbnN0cnVjdGlvbiwgd2Uga25vdwogICAgICAvLyBTdHJpbmcuY29kZVVuaXRBdCBkb2VzIG5vdCBoYXZlIGFueSBzaWRlIGVmZmVjdCAob3RoZXIgdGhhbiB0aHJvd2luZyksCiAgICAgIC8vIGFuZCB0aGF0IGl0IGNhbiBiZSBHVk4nZWQuCiAgICAgIGNsZWFyQWxsU2lkZUVmZmVjdHMoaW5zdHJ1Y3Rpb24pOwogICAgICBpZiAoaW5zdHJ1Y3Rpb24uaW5wdXRzLmxhc3QKICAgICAgICAgIC5pc1Bvc2l0aXZlSW50ZWdlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICBpbnN0cnVjdGlvbi5zZWxlY3RvciA9IHJlbmFtZVRvT3B0aW1pemVkU2VsZWN0b3IoCiAgICAgICAgICAgICdfY29kZVVuaXRBdCcsIGluc3RydWN0aW9uLnNlbGVjdG9yLCBjb21tb25FbGVtZW50cyk7CiAgICAgIH0KICAgICAgbG9nPy5yZWdpc3RlckNvZGVVbml0QXQoaW5zdHJ1Y3Rpb24pOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQp9CgpjbGFzcyBDb21wYXJlVG9TcGVjaWFsaXplciBleHRlbmRzIEludm9rZUR5bmFtaWNTcGVjaWFsaXplciB7CiAgY29uc3QgQ29tcGFyZVRvU3BlY2lhbGl6ZXIoKTsKCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHRyeUNvbnZlcnRUb0J1aWx0aW4oCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBIR3JhcGggZ3JhcGgsCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsCiAgICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgICBKQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2cpIHsKICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciA9IGluc3RydWN0aW9uLmdldERhcnRSZWNlaXZlcihjbG9zZWRXb3JsZCk7CiAgICAvLyBgY29tcGFyZVRvYCBoYXMgbm8gc2lkZS1lZmZlY3QgKG90aGVyIHRoYW4gdGhyb3dpbmcpIGFuZCBjYW4gYmUgR1ZOJ2VkCiAgICAvLyBmb3Igc29tZSBrbm93biB0eXBlcy4KICAgIGlmIChyZWNlaXZlcgogICAgICAgICAgICAuaXNTdHJpbmdPck51bGwoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUgfHwKICAgICAgICByZWNlaXZlcgogICAgICAgICAgICAuaXNOdW1iZXJPck51bGwoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgLy8gUmVwbGFjZSBgYS5jb21wYXJlVG8oYSlgIHdpdGggYDBgLCBidXQgb25seSBpZiByZWNlaXZlciBhbmQgYXJndW1lbnQKICAgICAgLy8gYXJlIHN1Y2ggdGhhdCBubyBleGNlcHRpb25zIGNhbiBiZSB0aHJvd24uCiAgICAgIEhJbnN0cnVjdGlvbiBhcmd1bWVudCA9IGluc3RydWN0aW9uLmlucHV0cy5sYXN0OwogICAgICBpZiAoKHJlY2VpdmVyCiAgICAgICAgICAgICAgICAgIC5pc051bWJlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSAmJgogICAgICAgICAgICAgIGFyZ3VtZW50CiAgICAgICAgICAgICAgICAgIC5pc051bWJlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSkgfHwKICAgICAgICAgIChyZWNlaXZlcgogICAgICAgICAgICAgICAgICAuaXNTdHJpbmcoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICAgICAgICBhcmd1bWVudAogICAgICAgICAgICAgICAgICAuaXNTdHJpbmcoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpKSB7CiAgICAgICAgaWYgKGlkZW50aWNhbChyZWNlaXZlci5ub25DaGVjaygpLCBhcmd1bWVudC5ub25DaGVjaygpKSkgewogICAgICAgICAgSEluc3RydWN0aW9uIGNvbnZlcnRlZCA9IGdyYXBoLmFkZENvbnN0YW50SW50KDAsIGNsb3NlZFdvcmxkKTsKICAgICAgICAgIGxvZz8ucmVnaXN0ZXJDb21wYXJlVG8oaW5zdHJ1Y3Rpb24sIGNvbnZlcnRlZCk7CiAgICAgICAgICByZXR1cm4gY29udmVydGVkOwogICAgICAgIH0KICAgICAgfQogICAgICBjbGVhckFsbFNpZGVFZmZlY3RzKGluc3RydWN0aW9uKTsKICAgICAgbG9nPy5yZWdpc3RlckNvbXBhcmVUbyhpbnN0cnVjdGlvbik7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIElkZW1wb3RlbnRTdHJpbmdPcGVyYXRpb25TcGVjaWFsaXplcgogICAgZXh0ZW5kcyBJbnZva2VEeW5hbWljU3BlY2lhbGl6ZXIgewogIGNvbnN0IElkZW1wb3RlbnRTdHJpbmdPcGVyYXRpb25TcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdHJ5Q29udmVydFRvQnVpbHRpbigKICAgICAgSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sCiAgICAgIEhHcmFwaCBncmFwaCwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCiAgICAgIEpDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBPcHRpbWl6YXRpb25UZXN0TG9nIGxvZykgewogICAgSEluc3RydWN0aW9uIHJlY2VpdmVyID0gaW5zdHJ1Y3Rpb24uZ2V0RGFydFJlY2VpdmVyKGNsb3NlZFdvcmxkKTsKICAgIGlmIChyZWNlaXZlcgogICAgICAgIC5pc1N0cmluZ09yTnVsbChjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgIC5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIC8vIFN0cmluZy54eHggZG9lcyBub3QgaGF2ZSBhbnkgc2lkZSBlZmZlY3QgKG90aGVyIHRoYW4gdGhyb3dpbmcpLCBhbmQgaXQKICAgICAgLy8gY2FuIGJlIEdWTidlZC4KICAgICAgY2xlYXJBbGxTaWRlRWZmZWN0cyhpbnN0cnVjdGlvbik7CiAgICAgIGlmIChsb2cgIT0gbnVsbCkgewogICAgICAgIHJlZ2lzdGVyT3B0aW1pemF0aW9uKGxvZywgaW5zdHJ1Y3Rpb24pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgcmVnaXN0ZXJPcHRpbWl6YXRpb24oT3B0aW1pemF0aW9uVGVzdExvZyBsb2csIEhJbnN0cnVjdGlvbiBvcmlnaW5hbCk7Cn0KCmNsYXNzIFN1YnN0cmluZ1NwZWNpYWxpemVyIGV4dGVuZHMgSWRlbXBvdGVudFN0cmluZ09wZXJhdGlvblNwZWNpYWxpemVyIHsKICBjb25zdCBTdWJzdHJpbmdTcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyT3B0aW1pemF0aW9uKE9wdGltaXphdGlvblRlc3RMb2cgbG9nLCBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwpIHsKICAgIGxvZy5yZWdpc3RlclN1YnN0cmluZyhvcmlnaW5hbCk7CiAgfQp9CgpjbGFzcyBUcmltU3BlY2lhbGl6ZXIgZXh0ZW5kcyBJZGVtcG90ZW50U3RyaW5nT3BlcmF0aW9uU3BlY2lhbGl6ZXIgewogIGNvbnN0IFRyaW1TcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyT3B0aW1pemF0aW9uKE9wdGltaXphdGlvblRlc3RMb2cgbG9nLCBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwpIHsKICAgIGxvZy5yZWdpc3RlclRyaW0ob3JpZ2luYWwpOwogIH0KfQoKY2xhc3MgUGF0dGVybk1hdGNoU3BlY2lhbGl6ZXIgZXh0ZW5kcyBJbnZva2VEeW5hbWljU3BlY2lhbGl6ZXIgewogIGNvbnN0IFBhdHRlcm5NYXRjaFNwZWNpYWxpemVyKCk7CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB0cnlDb252ZXJ0VG9CdWlsdGluKAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgSEdyYXBoIGdyYXBoLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgICAgSkNvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nKSB7CiAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIgPSBpbnN0cnVjdGlvbi5nZXREYXJ0UmVjZWl2ZXIoY2xvc2VkV29ybGQpOwogICAgSEluc3RydWN0aW9uIHBhdHRlcm4gPSBpbnN0cnVjdGlvbi5pbnB1dHNbMl07CiAgICBpZiAocmVjZWl2ZXIKICAgICAgICAgICAgLmlzU3RyaW5nT3JOdWxsKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgcGF0dGVybgogICAgICAgICAgICAuaXNTdHJpbmdPck51bGwoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgLy8gU3RyaW5nLmNvbnRhaW5zKFN0cmluZyBzKSBkb2VzIG5vdCBoYXZlIGFueSBzaWRlIGVmZmVjdCAob3RoZXIgdGhhbgogICAgICAvLyB0aHJvd2luZyksIGFuZCBpdCBjYW4gYmUgR1ZOJ2VkLgogICAgICBjbGVhckFsbFNpZGVFZmZlY3RzKGluc3RydWN0aW9uKTsKICAgICAgbG9nPy5yZWdpc3RlclBhdHRlcm5NYXRjaChpbnN0cnVjdGlvbik7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCmNsYXNzIFJvdW5kU3BlY2lhbGl6ZXIgZXh0ZW5kcyBJbnZva2VEeW5hbWljU3BlY2lhbGl6ZXIgewogIGNvbnN0IFJvdW5kU3BlY2lhbGl6ZXIoKTsKCiAgQG92ZXJyaWRlCiAgY29uc3RhbnRfc3lzdGVtLlVuYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpIHsKICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0ucm91bmQ7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdHJ5Q29udmVydFRvQnVpbHRpbigKICAgICAgSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sCiAgICAgIEhHcmFwaCBncmFwaCwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCiAgICAgIEpDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBPcHRpbWl6YXRpb25UZXN0TG9nIGxvZykgewogICAgSEluc3RydWN0aW9uIHJlY2VpdmVyID0g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HVAzBAIBOyABDDAmBAEMIj5ISQQBDB1QMAQCAT8hAQwwJwQBDCQiFCofJiAhUTRGETkdRVAkKCI+HzpCCCwGEQQCAT4gAQwkIhQqHyYgIUZOHRE9IRE9IU40NxQ9Jxc9KBQ9Jxc9KENJOhwKCCgrBhEEAgE0JzABDCQiFCofJiAhRhE5HVAYKBkwCAYRBAFNAgFKIAEMTiUEAgFFGwEMTiAEAgFBIwEMJCIUKh8mICFGMhE9IRA9IU0qKC4GEQQCATocAQwvIgQBDCQiFCofJiAhRhE5HUlPKCcGEQQCATlwYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2EvaW52b2tlX2R5bmFtaWNfc3BlY2lhbGl6ZXJzLmRhcnQvc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvc3NhL3ZhbGlkYXRlLmRhcnSb/y8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ25vZGVzLmRhcnQnOwoKY2xhc3MgSFZhbGlkYXRvciBleHRlbmRzIEhJbnN0cnVjdGlvblZpc2l0b3IgewogIGJvb2wgaXNWYWxpZCA9IHRydWU7CiAgSEdyYXBoIGdyYXBoOwoKICB2b2lkIHZpc2l0R3JhcGgoSEdyYXBoIHZpc2l0ZWUpIHsKICAgIGdyYXBoID0gdmlzaXRlZTsKICAgIHZpc2l0RG9taW5hdG9yVHJlZSh2aXNpdGVlKTsKICB9CgogIHZvaWQgbWFya0ludmFsaWQoU3RyaW5nIHJlYXNvbikgewogICAgcHJpbnQocmVhc29uKTsKICAgIGlzVmFsaWQgPSBmYWxzZTsKICB9CgogIC8vIE5vdGUgdGhhdCBkdXJpbmcgY29uc3RydWN0aW9uIG9mIHRoZSBTc2EgZ3JhcGggdGhlIGJhc2ljIGJsb2NrcyBhcmUKICAvLyBub3QgcmVxdWlyZWQgdG8gYmUgdmFsaWQgeWV0LgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCYXNpY0Jsb2NrKEhCYXNpY0Jsb2NrIGJsb2NrKSB7CiAgICBjdXJyZW50QmxvY2sgPSBibG9jazsKICAgIGlmICghaXNWYWxpZCkgcmV0dXJuOyAvLyBEb24ndCBuZWVkIHRvIGNvbnRpbnVlIGlmIHdlIGFyZSBhbHJlYWR5IGludmFsaWQuCgogICAgLy8gVGVzdCB0aGF0IHRoZSBsYXN0IGluc3RydWN0aW9uIGlzIGEgYnJhbmNoaW5nIGluc3RydWN0aW9uIGFuZCB0aGF0IHRoZQogICAgLy8gYmFzaWMgYmxvY2sgY29udGFpbnMgdGhlIGJyYW5jaC10YXJnZXQuCiAgICBpZiAoYmxvY2suZmlyc3QgPT0gbnVsbCB8fCBibG9jay5sYXN0ID09IG51bGwpIHsKICAgICAgbWFya0ludmFsaWQoImVtcHR5IGJsb2NrIik7CiAgICB9CiAgICBpZiAoYmxvY2subGFzdCBpcyEgSENvbnRyb2xGbG93KSB7CiAgICAgIG1hcmtJbnZhbGlkKCJibG9jayBlbmRzIHdpdGggbm9uLXRhaWwgbm9kZS4iKTsKICAgIH0KICAgIGlmIChibG9jay5sYXN0IGlzIEhJZiAmJiBibG9jay5zdWNjZXNzb3JzLmxlbmd0aCAhPSAyKSB7CiAgICAgIG1hcmtJbnZhbGlkKCJJZiBub2RlIHdpdGhvdXQgdHdvIHN1Y2Nlc3NvcnMiKTsKICAgIH0KICAgIGlmIChibG9jay5sYXN0IGlzIEhDb25kaXRpb25hbEJyYW5jaCAmJiBibG9jay5zdWNjZXNzb3JzLmxlbmd0aCAhPSAyKSB7CiAgICAgIG1hcmtJbnZhbGlkKCJDb25kaXRpb25hbCBub2RlIHdpdGhvdXQgdHdvIHN1Y2Nlc3NvcnMiKTsKICAgIH0KICAgIGlmIChibG9jay5sYXN0IGlzIEhMb29wQnJhbmNoKSB7CiAgICAgIC8vIEFzc2VydCB0aGF0IHRoZSBibG9jayB3ZSBpbnNlcnRlZCB0byBhdm9pZCBjcml0aWNhbCBlZGdlcyBzYXRpc2ZpZXMKICAgICAgLy8gb3VyIGFzc3VtcHRpb25zLiBUaGF0IGlzLCBpdCBtdXN0IG5vdCBjb250YWluIGFueSBpbnN0cnVjdGlvbnMKICAgICAgLy8gKGFsdGhvdWdoIGl0IG1heSBjb250YWluIHBoaS11cGRhdGVzKS4KICAgICAgSEJhc2ljQmxvY2sgYXZvaWRDcml0aWNhbEVkZ2VCbG9jayA9IGJsb2NrLnN1Y2Nlc3NvcnMubGFzdDsKICAgICAgaWYgKGF2b2lkQ3JpdGljYWxFZGdlQmxvY2suZmlyc3QgaXMhIEhHb3RvKSB7CiAgICAgICAgbWFya0ludmFsaWQoIkNyaXRpY2FsIGVkZ2UgYmxvY2sgY29udGFpbnMgaW5zdHJ1Y3Rpb25zIik7CiAgICAgIH0KICAgIH0KICAgIGlmIChibG9jay5sYXN0IGlzIEhHb3RvICYmIGJsb2NrLnN1Y2Nlc3NvcnMubGVuZ3RoICE9IDEpIHsKICAgICAgbWFya0ludmFsaWQoIkdvdG8gbm9kZSB3aXRoIG5vdCBleGFjdGx5IG9uZSBzdWNjZXNzb3IiKTsKICAgIH0KICAgIGlmIChibG9jay5sYXN0IGlzIEhKdW1wICYmIGJsb2NrLnN1Y2Nlc3NvcnMubGVuZ3RoICE9IDEpIHsKICAgICAgbWFya0ludmFsaWQoIkJyZWFrIG9yIGNvbnRpbnVlIG5vZGUgd2l0aG91dCBvbmUgc3VjY2Vzc29yIik7CiAgICB9CiAgICBpZiAoKGJsb2NrLmxhc3QgaXMgSFJldHVybiB8fCBibG9jay5sYXN0IGlzIEhUaHJvdykgJiYKICAgICAgICAoYmxvY2suc3VjY2Vzc29ycy5sZW5ndGggIT0gMSB8fCAhYmxvY2suc3VjY2Vzc29yc1swXS5pc0V4aXRCbG9jaygpKSkgewogICAgICBtYXJrSW52YWxpZCgiUmV0dXJuIG9yIHRocm93IG5vZGUgd2l0aCA+IDEgc3VjY2Vzc29yICIKICAgICAgICAgICJvciBub3QgZ29pbmcgdG8gZXhpdC1ibG9jayIpOwogICAgfQogICAgaWYgKGJsb2NrLmxhc3QgaXMgSEV4aXQgJiYgIWJsb2NrLnN1Y2Nlc3NvcnMuaXNFbXB0eSkgewogICAgICBtYXJrSW52YWxpZCgiRXhpdCBibG9jayB3aXRoIHN1Y2Nlc3NvciIpOwogICAgfQoKICAgIGlmIChibG9jay5zdWNjZXNzb3JzLmlzRW1wdHkgJiYgIWJsb2NrLmlzRXhpdEJsb2NrKCkpIHsKICAgICAgbWFya0ludmFsaWQoIk5vbi1leGl0IGJsb2NrIHdpdGhvdXQgc3VjY2Vzc29yIik7CiAgICB9CgogICAgLy8gQ2hlY2sgdGhhdCBzdWNjZXNzb3JzIGlkcyBhcmUgYWx3YXlzIGhpZ2hlciB0aGFuIHRoZSBjdXJyZW50IG9uZS4KICAgIC8vIFRPRE8oZmxvaXRzY2gpOiB0aGlzIGlzLCBvZiBjb3Vyc2UsIG5vdCB0cnVlIGZvciBiYWNrLWJyYW5jaGVzLgogICAgaWYgKGJsb2NrLmlkID09IG51bGwpIG1hcmtJbnZhbGlkKCJibG9jayB3aXRob3V0IGlkIik7CiAgICBmb3IgKEhCYXNpY0Jsb2NrIHN1Y2Nlc3NvciBpbiBibG9jay5zdWNjZXNzb3JzKSB7CiAgICAgIGlmICghaXNWYWxpZCkgYnJlYWs7CiAgICAgIGlmIChzdWNjZXNzb3IuaWQgPT0gbnVsbCkgbWFya0ludmFsaWQoInN1Y2Nlc3NvciB3aXRob3V0IGlkIik7CiAgICAgIGlmIChzdWNjZXNzb3IuaWQgPD0gYmxvY2suaWQgJiYgIXN1Y2Nlc3Nvci5pc0xvb3BIZWFkZXIoKSkgewogICAgICAgIG1hcmtJbnZhbGlkKCJzdWNjZXNzb3Igd2l0aCBsb3dlciBpZCwgYnV0IG5vdCBhIGxvb3AtaGVhZGVyIik7CiAgICAgIH0KICAgIH0KICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIGEgY3JpdGljYWwgZWRnZS4KICAgIGlmIChpc1ZhbGlkICYmCiAgICAgICAgYmxvY2suc3VjY2Vzc29ycy5sZW5ndGggPiAxICYmCiAgICAgICAgYmxvY2subGFzdCBpcyEgSFRyeSAmJgogICAgICAgIGJsb2NrLmxhc3QgaXMhIEhFeGl0VHJ5ICYmCiAgICAgICAgYmxvY2subGFzdCBpcyEgSFN3aXRjaCkgewogICAgICBmb3IgKEhCYXNpY0Jsb2NrIHN1Y2Nlc3NvciBpbiBibG9jay5zdWNjZXNzb3JzKSB7CiAgICAgICAgaWYgKCFpc1ZhbGlkKSBicmVhazsKICAgICAgICBpZiAoc3VjY2Vzc29yLnByZWRlY2Vzc29ycy5sZW5ndGggPj0gMikgewogICAgICAgICAgbWFya0ludmFsaWQoIlNTQSBncmFwaCBjb250YWlucyBjcml0aWNhbCBlZGdlLiIpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIENoZWNrIHRoYXQgdGhlIGVudHJpZXMgaW4gdGhlIGRvbWluYXRlZC1saXN0IGFyZSBzb3J0ZWQuCiAgICBpbnQgbGFzdElkID0gMDsKICAgIGZvciAoSEJhc2ljQmxvY2sgZG9taW5hdGVkIGluIGJsb2NrLmRvbWluYXRlZEJsb2NrcykgewogICAgICBpZiAoIWlzVmFsaWQpIGJyZWFrOwogICAgICBpZiAoIWlkZW50aWNhbChkb21pbmF0ZWQuZG9taW5hdG9yLCBibG9jaykpIHsKICAgICAgICBtYXJrSW52YWxpZCgiZG9taW5hdGVkIGJsb2NrIG5vdCBwb2ludGluZyBiYWNrIik7CiAgICAgIH0KICAgICAgaWYgKGRvbWluYXRlZC5pZCA9PSBudWxsIHx8IGRvbWluYXRlZC5pZCA8PSBsYXN0SWQpIHsKICAgICAgICBtYXJrSW52YWxpZCgiZG9taW5hdGVkLmlkID09IG51bGwgb3IgZG9taW5hdGVkIGhhcyA8PSBpZCIpOwogICAgICB9CiAgICAgIGxhc3RJZCA9IGRvbWluYXRlZC5pZDsKICAgIH0KCiAgICBpZiAoIWlzVmFsaWQpIHJldHVybjsKICAgIGJsb2NrLmZvckVhY2hQaGkodmlzaXRJbnN0cnVjdGlvbik7CgogICAgLy8gQ2hlY2sgdGhhdCB0aGUgYmxvY2tzIG9mIHRoZSBwYXJhbWV0ZXJzIG9mIGEgcGhpIGFyZSBkb21pbmF0aW5nIHRoZQogICAgLy8gY29ycmVzcG9uZGluZyBwcmVkZWNlc3NvciBibG9jay4gTm90ZSB0aGF0IGEgYmxvY2sgZG9taW5hdGVzCiAgICAvLyBpdHNlbGYuCiAgICBibG9jay5mb3JFYWNoUGhpKChIUGhpIHBoaSkgewogICAgICBhc3NlcnQocGhpLmlucHV0cy5sZW5ndGggPD0gYmxvY2sucHJlZGVjZXNzb3JzLmxlbmd0aCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhpLmlucHV0cy5sZW5ndGg7IGkrKykgewogICAgICAgIEhJbnN0cnVjdGlvbiBpbnB1dCA9IHBoaS5pbnB1dHNbaV07CiAgICAgICAgaWYgKCFpbnB1dC5ibG9jay5kb21pbmF0ZXMoYmxvY2sucHJlZGVjZXNzb3JzW2ldKSkgewogICAgICAgICAgbWFya0ludmFsaWQoIkRlZmluaXRpb24gZG9lcyBub3QgZG9taW5hdGUgdXNlIik7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKCiAgICAvLyBDaGVjayB0aGF0IHRoZSBibG9ja3Mgb2YgdGhlIGlucHV0cyBvZiBhbiBpbnN0cnVjdGlvbiBkb21pbmF0ZSB0aGUKICAgIC8vIGluc3RydWN0aW9uJ3MgYmxvY2suCiAgICBibG9jay5mb3JFYWNoSW5zdHJ1Y3Rpb24oKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgICBmb3IgKEhJbnN0cnVjdGlvbiBpbnB1dCBpbiBpbnN0cnVjdGlvbi5pbnB1dHMpIHsKICAgICAgICBpZiAoIWlucHV0LmJsb2NrLmRvbWluYXRlcyhibG9jaykpIHsKICAgICAgICAgIG1hcmtJbnZhbGlkKCJEZWZpbml0aW9uIGRvZXMgbm90IGRvbWluYXRlIHVzZSIpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CgogICAgc3VwZXIudmlzaXRCYXNpY0Jsb2NrKGJsb2NrKTsKICB9CgogIC8vLyBSZXR1cm5zIGhvdyBvZnRlbiBbaW5zdHJ1Y3Rpb25dIGlzIGNvbnRhaW5lZCBpbiBbaW5zdHJ1Y3Rpb25zXS4KICBzdGF0aWMgaW50IGNvdW50SW5zdHJ1Y3Rpb24oCiAgICAgIExpc3Q8SEluc3RydWN0aW9uPiBpbnN0cnVjdGlvbnMsIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgaW50IHJlc3VsdCA9IDA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RydWN0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaWRlbnRpY2FsKGluc3RydWN0aW9uc1tpXSwgaW5zdHJ1Y3Rpb24pKSByZXN1bHQrKzsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBwcmVkaWNhdGUgcmV0dXJucyB0cnVlIGZvciBldmVyeSBpbnN0cnVjdGlvbiBpbiB0aGUKICAvLy8gbGlzdC4gVGhlIGFyZ3VtZW50IHRvIFtmXSBpcyBhbiBpbnN0cnVjdGlvbiB3aXRoIHRoZSBjb3VudCBvZiBob3cgb2Z0ZW4KICAvLy8gaXQgYXBwZWFyZWQgaW4gdGhlIGxpc3QgW2luc3RydWN0aW9uc10uCiAgc3RhdGljIGJvb2wgZXZlcnlJbnN0cnVjdGlvbihMaXN0PEhJbnN0cnVjdGlvbj4gaW5zdHJ1Y3Rpb25zLCBGdW5jdGlvbiBmKSB7CiAgICB2YXIgY29weSA9IG5ldyBMaXN0PEhJbnN0cnVjdGlvbj4uZnJvbShpbnN0cnVjdGlvbnMpOwogICAgLy8gVE9ETyhmbG9pdHNjaCk6IHRoZXJlIGlzIGN1cnJlbnRseSBubyB3YXkgdG8gc29ydCBISW5zdHJ1Y3Rpb25zIGJlZm9yZQogICAgLy8gd2UgaGF2ZSBhc3NpZ25lZCBhbiBJRC4gVGhlIGxvb3AgaXMgdGhlcmVmb3JlIE8obl4yKSBmb3Igbm93LgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3B5Lmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBjdXJyZW50ID0gY29weVtpXTsKICAgICAgaWYgKGN1cnJlbnQgPT0gbnVsbCkgY29udGludWU7CiAgICAgIGludCBjb3VudCA9IDE7CiAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IGNvcHkubGVuZ3RoOyBqKyspIHsKICAgICAgICBpZiAoaWRlbnRpY2FsKGNvcHlbal0sIGN1cnJlbnQpKSB7CiAgICAgICAgICBjb3B5W2pdID0gbnVsbDsKICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghZihjdXJyZW50LCBjb3VudCkpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEluc3RydWN0aW9uKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgLy8gVmVyaWZpZXMgdGhhdCB3ZSBhcmUgaW4gdGhlIHVzZSBsaXN0IG9mIG91ciBpbnB1dHMuCiAgICBib29sIGhhc0NvcnJlY3RJbnB1dHMoKSB7CiAgICAgIGJvb2wgaW5CYXNpY0Jsb2NrID0gaW5zdHJ1Y3Rpb24uaXNJbkJhc2ljQmxvY2soKTsKICAgICAgcmV0dXJuIGV2ZXJ5SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24uaW5wdXRzLCAoaW5wdXQsIGNvdW50KSB7CiAgICAgICAgaWYgKGluQmFzaWNCbG9jaykgewogICAgICAgICAgcmV0dXJuIGlucHV0LmlzSW5CYXNpY0Jsb2NrKCkgJiYKICAgICAgICAgICAgICBjb3VudEluc3RydWN0aW9uKGlucHV0LnVzZWRCeSwgaW5zdHJ1Y3Rpb24pID09IGNvdW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gY291bnRJbnN0cnVjdGlvbihpbnB1dC51c2VkQnksIGluc3RydWN0aW9uKSA9PSAwOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgLy8gVmVyaWZpZXMgdGhhdCBhbGwgb3VyIHVzZXMgaGF2ZSB1cyBpbiB0aGVpciBpbnB1dHMuCiAgICBib29sIGhhc0NvcnJlY3RVc2VzKCkgewogICAgICBpZiAoIWluc3RydWN0aW9uLmlzSW5CYXNpY0Jsb2NrKCkpIHJldHVybiB0cnVlOwogICAgICByZXR1cm4gZXZlcnlJbnN0cnVjdGlvbihpbnN0cnVjdGlvbi51c2VkQnksICh1c2UsIGNvdW50KSB7CiAgICAgICAgcmV0dXJuIHVzZS5pc0luQmFzaWNCbG9jaygpICYmCiAgICAgICAgICAgIGNvdW50SW5zdHJ1Y3Rpb24odXNlLmlucHV0cywgaW5zdHJ1Y3Rpb24pID09IGNvdW50OwogICAgICB9KTsKICAgIH0KCiAgICBpZiAoIWlkZW50aWNhbChpbnN0cnVjdGlvbi5ibG9jaywgY3VycmVudEJsb2NrKSkgewogICAgICBtYXJrSW52YWxpZCgiSW5zdHJ1Y3Rpb24gaW4gd3JvbmcgYmxvY2siKTsKICAgIH0KICAgIGlmICghaGFzQ29ycmVjdElucHV0cygpKSB7CiAgICAgIG1hcmtJbnZhbGlkKCJJbmNvcnJlY3QgaW5wdXRzIik7CiAgICB9CiAgICBpZiAoIWhhc0NvcnJlY3RVc2VzKCkpIHsKICAgICAgbWFya0ludmFsaWQoIkluY29ycmVjdCB1c2VzIik7CiAgICB9CiAgfQp9CoDMAE5OPAEVAS8XEAEkFSEEASQTFQQBSSMMLBpPAU4vNSIGJzUGPTUGTD4GJU1IMEI0QggGPz8GP0MGO1A9KQY8MAYBPDcGAUlHOzYbRUNHCAYwEycfIyI4HTI8CggGAUAUOxs0Ogg8RAgdBgEaKAFLRA8iPjQsPTsKCAgBShw6Ny07CggIASIEAUYfQxQ0PQYTBAFOTi5OOk5FLB0lFTIrGhMKCCwGEQQBDDQ7HjhDHCtEEUMKCgYBOxw2QSdACgYBNzEGHycGHSUGBAIBJnBhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS92YWxpZGF0ZS5kYXJ0OHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2VsZW1lbnRzL2VudGl0eV91dGlscy5kYXJ0k8svLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBlbnRpdHlfdXRpbHM7CgppbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfdW5zdGFibGUvZGFydDJqcy5kYXJ0JwogICAgc2hvdyBpc1VzZXJEZWZpbmFibGVPcGVyYXRvciwgaXNNaW51c09wZXJhdG9yOwoKaW1wb3J0ICdlbnRpdGllcy5kYXJ0JzsKCi8vIFNvbWV3aGF0IHN0YWJsZSBvcmRlcmluZyBmb3IgbGlicmFyaWVzIHVzaW5nIFtVcmldcwppbnQgY29tcGFyZUxpYnJhcmllc1VyaXMoVXJpIGEsIFVyaSBiKSB7CiAgaWYgKGEgPT0gYikgcmV0dXJuIDA7CgogIGludCBieUNhbm9uaWNhbFVyaVBhdGgoKSB7CiAgICByZXR1cm4gYS5wYXRoLmNvbXBhcmVUbyhiLnBhdGgpOwogIH0KCiAgLy8gT3JkZXI6IHBsYXRmb3JtIDwgcGFja2FnZSA8IG90aGVyLgogIGlmIChhLnNjaGVtZSA9PSAnZGFydCcpIHsKICAgIGlmIChiLnNjaGVtZSA9PSAnZGFydCcpIHJldHVybiBieUNhbm9uaWNhbFVyaVBhdGgoKTsKICAgIHJldHVybiAtMTsKICB9CiAgaWYgKGIuc2NoZW1lID09ICdkYXJ0JykgcmV0dXJuIDE7CgogIGlmIChhLnNjaGVtZSA9PSAncGFja2FnZScpIHsKICAgIGlmIChiLnNjaGVtZSA9PSAncGFja2FnZScpIHJldHVybiBieUNhbm9uaWNhbFVyaVBhdGgoKTsKICAgIHJldHVybiAtMTsKICB9CiAgaWYgKGIuc2NoZW1lID09ICdwYWNrYWdlJykgcmV0dXJuIDE7CgogIHJldHVybiBfY29tcGFyZUNhbm9uaWNhbFVyaShhLCBiKTsKfQoKaW50IF9jb21wYXJlQ2Fub25pY2FsVXJpKFVyaSBhLCBVcmkgYikgewogIGludCByID0gYS5zY2hlbWUuY29tcGFyZVRvKGIuc2NoZW1lKTsKICBpZiAociAhPSAwKSByZXR1cm4gcjsKCiAgLy8gV2Ugd291bGQgbGlrZSB0aGUgb3JkZXIgb2YgJ2ZpbGU6JyBVcmlzIHRvIGJlIHN0YWJsZSBhY3Jvc3MgZGlmZmVyZW50CiAgLy8gdXNlcnMgb3IgZGlmZmVyZW50IGJ1aWxkcyBmcm9tIHRlbXBvcmFyeSBkaXJlY3Rvcmllcy4gIFdlIHNvcnQgYnkKICAvLyBwYXRoU2VnbWVudHMgZWxlbWVudHMgZnJvbSB0aGUgbGFzdCB0byB0aGUgZmlyc3Qgc2luY2UgdGhhdCB0ZW5kcyB0byBmaW5kCiAgLy8gYSBzdGFibGUgZGlzdGluY3Rpb24gcmVnYXJkbGVzcyBvZiBkaXJlY3Rvcnkgcm9vdC4KICBMaXN0PFN0cmluZz4gYVNlZ21lbnRzID0gYS5wYXRoU2VnbWVudHM7CiAgTGlzdDxTdHJpbmc+IGJTZWdtZW50cyA9IGIucGF0aFNlZ21lbnRzOwogIGludCBhSSA9IGFTZWdtZW50cy5sZW5ndGg7CiAgaW50IGJJID0gYlNlZ21lbnRzLmxlbmd0aDsKICB3aGlsZSAoYUkgPiAwICYmIGJJID4gMCkgewogICAgU3RyaW5nIGFTZWdtZW50ID0gYVNlZ21lbnRzWy0tYUldOwogICAgU3RyaW5nIGJTZWdtZW50ID0gYlNlZ21lbnRzWy0tYkldOwogICAgciA9IGFTZWdtZW50LmNvbXBhcmVUbyhiU2VnbWVudCk7CiAgICBpZiAociAhPSAwKSByZXR1cm4gcjsKICB9CiAgcmV0dXJuIGFJLmNvbXBhcmVUbyhiSSk7IC8vIFNob3J0ZXN0IGZpcnN0Lgp9CgovLy8gQ29tcGFyZSBVUklzIG9mIGNvbXBpbGF0aW9uIHVuaXRzLgppbnQgY29tcGFyZVNvdXJjZVVyaXMoVXJpIHVyaTEsIFVyaSB1cmkyKSB7CiAgaWYgKHVyaTEgPT0gdXJpMikgcmV0dXJuIDA7CiAgLy8gQ29tcGlsYXRpb24gdW5pdHMgYXJlIGNvbXBhcmVkIG9ubHkgd2l0aGluIHRoZSBzYW1lIGxpYnJhcnkgc28gd2UgZXhwZWN0CiAgLy8gdGhlIFVyaXMgdG8gdXN1YWxseSBiZSBjbHVzdGVyZWQgdG9nZXRoZXIgd2l0aCBhIGNvbW1vbiBzY2hlbWUgYW5kIHBhdGgKICAvLyBwcmVmaXguCiAgcmV0dXJuICcke3VyaTF9Jy5jb21wYXJlVG8oJyR7dXJpMn0nKTsKfQoKLy8vIENvbXBhcmUgZW50aXRpZXMgd2l0aGluIHRoZSBzYW1lIGNvbXBpbGF0aW9uIHVuaXQuCmludCBjb21wYXJlRW50aXRpZXMoRW50aXR5IGVsZW1lbnQxLCBpbnQgbGluZTEsIGludCBjb2x1bW4xLCBFbnRpdHkgZWxlbWVudDIsCiAgICBpbnQgbGluZTIsIGludCBjb2x1bW4yKSB7CiAgbGluZTEgPz89IC0xOwogIGxpbmUyID8/PSAtMTsKICBpbnQgciA9IGxpbmUxLmNvbXBhcmVUbyhsaW5lMik7CiAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CgogIGNvbHVtbjEgPz89IC0xOwogIGNvbHVtbjIgPz89IC0xOwogIHIgPSBjb2x1bW4xLmNvbXBhcmVUbyhjb2x1bW4yKTsKICBpZiAociAhPSAwKSByZXR1cm4gcjsKCiAgciA9IGVsZW1lbnQxLm5hbWUuY29tcGFyZVRvKGVsZW1lbnQyLm5hbWUpOwogIGlmIChyICE9IDApIHJldHVybiByOwoKICAvLyBTYW1lIGZpbGUsIHBvc2l0aW9uIGFuZCBuYW1lLiAgSWYgdGhpcyBoYXBwZW5zLCB3ZSBzaG91bGQgZmluZCBvdXQgd2h5CiAgLy8gYW5kIG1ha2UgdGhlIG9yZGVyIHRvdGFsIGFuZCBpbmRlcGVuZGVudCBvZiBoYXNoQ29kZS4KICByZXR1cm4gZWxlbWVudDEuaGFzaENvZGUuY29tcGFyZVRvKGVsZW1lbnQyLmhhc2hDb2RlKTsKfQoKU3RyaW5nIHJlY29uc3RydWN0Q29uc3RydWN0b3JOYW1lKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICBTdHJpbmcgY2xhc3NOYW1lID0gZWxlbWVudC5lbmNsb3NpbmdDbGFzcy5uYW1lOwogIGlmIChlbGVtZW50Lm5hbWUgPT0gJycpIHsKICAgIHJldHVybiBjbGFzc05hbWU7CiAgfSBlbHNlIHsKICAgIHJldHVybiAnJGNsYXNzTmFtZVwkJHtlbGVtZW50Lm5hbWV9JzsKICB9Cn0KClN0cmluZyByZWNvbnN0cnVjdENvbnN0cnVjdG9yTmFtZVNvdXJjZVN0cmluZyhGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgaWYgKGVsZW1lbnQubmFtZSA9PSAnJykgewogICAgcmV0dXJuIGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MubmFtZTsKICB9IGVsc2UgewogICAgcmV0dXJuIHJlY29uc3RydWN0Q29uc3RydWN0b3JOYW1lKGVsZW1lbnQpOwogIH0KfQoKLy8vIE1hcCBhbiBvcGVyYXRvci1uYW1lIHRvIGEgdmFsaWQgSmF2YVNjcmlwdCBpZGVudGlmaWVyLgovLy8KLy8vIEZvciBub24tb3BlcmF0b3IgbmFtZXMsIHRoaXMgbWV0aG9kIGp1c3QgcmV0dXJucyBpdHMgaW5wdXQuCi8vLwovLy8gVGhlIHJlc3VsdHMgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZCBhcmUgZ3VhcmFudGVlZCB0byBiZSB2YWxpZAovLy8gSmF2YVNjcmlwdCBpZGVudGlmaWVycywgZXhjZXB0IGl0IG1heSBpbmNsdWRlIHJlc2VydmVkIHdvcmRzIGZvcgovLy8gbm9uLW9wZXJhdG9yIG5hbWVzLgpTdHJpbmcgb3BlcmF0b3JOYW1lVG9JZGVudGlmaWVyKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUgPT0gbnVsbCkgewogICAgcmV0dXJuIG5hbWU7CiAgfSBlbHNlIGlmIChuYW1lID09ICc9PScpIHsKICAgIHJldHVybiByJ29wZXJhdG9yJGVxJzsKICB9IGVsc2UgaWYgKG5hbWUgPT0gJ34nKSB7CiAgICByZXR1cm4gcidvcGVyYXRvciRub3QnOwogIH0gZWxzZSBpZiAobmFtZSA9PSAnW10nKSB7CiAgICByZXR1cm4gcidvcGVyYXRvciRpbmRleCc7CiAgfSBlbHNlIGlmIChuYW1lID09ICdbXT0nKSB7CiAgICByZXR1cm4gcidvcGVyYXRvciRpbmRleFNldCc7CiAgfSBlbHNlIGlmIChuYW1lID09ICcqJykgewogICAgcmV0dXJuIHInb3BlcmF0b3IkbXVsJzsKICB9IGVsc2UgaWYgKG5hbWUgPT0gJy8nKSB7CiAgICByZXR1cm4gcidvcGVyYXRvciRkaXYnOwogIH0gZWxzZSBpZiAobmFtZSA9PSAnJScpIHsKICAgIHJldHVybiByJ29wZXJhdG9yJG1vZCc7CiAgfSBlbHNlIGlmIChuYW1lID09ICd+LycpIHsKICAgIHJldHVybiByJ29wZXJhdG9yJHRkaXYnOwogIH0gZWxzZSBpZiAobmFtZSA9PSAnKycpIHsKICAgIHJldHVybiByJ29wZXJhdG9yJGFkZCc7CiAgfSBlbHNlIGlmIChuYW1lID09ICc8PCcpIHsKICAgIHJldHVybiByJ29wZXJhdG9yJHNobCc7CiAgfSBlbHNlIGlmIChuYW1lID09ICc+PicpIHsKICAgIHJldHVybiByJ29wZXJhdG9yJHNocic7CiAgfSBlbHNlIGlmIChuYW1lID09ICc+PScpIHsKICAgIHJldHVybiByJ29wZXJhdG9yJGdlJzsKICB9IGVsc2UgaWYgKG5hbWUgPT0gJz4nKSB7CiAgICByZXR1cm4gcidvcGVyYXRvciRndCc7CiAgfSBlbHNlIGlmIChuYW1lID09ICc8PScpIHsKICAgIHJldHVybiByJ29wZXJhdG9yJGxlJzsKICB9IGVsc2UgaWYgKG5hbWUgPT0gJzwnKSB7CiAgICByZXR1cm4gcidvcGVyYXRvciRsdCc7CiAgfSBlbHNlIGlmIChuYW1lID09ICcmJykgewogICAgcmV0dXJuIHInb3BlcmF0b3IkYW5kJzsKICB9IGVsc2UgaWYgKG5hbWUgPT0gJ14nKSB7CiAgICByZXR1cm4gcidvcGVyYXRvciR4b3InOwogIH0gZWxzZSBpZiAobmFtZSA9PSAnfCcpIHsKICAgIHJldHVybiByJ29wZXJhdG9yJG9yJzsKICB9IGVsc2UgaWYgKG5hbWUgPT0gJy0nKSB7CiAgICByZXR1cm4gcidvcGVyYXRvciRzdWInOwogIH0gZWxzZSBpZiAobmFtZSA9PSAndW5hcnktJykgewogICAgcmV0dXJuIHInb3BlcmF0b3IkbmVnYXRlJzsKICB9IGVsc2UgewogICAgcmV0dXJuIG5hbWU7CiAgfQp9CgpTdHJpbmcgY29uc3RydWN0T3BlcmF0b3JOYW1lT3JOdWxsKFN0cmluZyBvcCwgYm9vbCBpc1VuYXJ5KSB7CiAgaWYgKGlzTWludXNPcGVyYXRvcihvcCkpIHsKICAgIHJldHVybiBpc1VuYXJ5ID8gJ3VuYXJ5LScgOiBvcDsKICB9IGVsc2UgaWYgKGlzVXNlckRlZmluYWJsZU9wZXJhdG9yKG9wKSB8fCBvcCA9PSAnPz8nKSB7CiAgICByZXR1cm4gb3A7CiAgfSBlbHNlIHsKICAgIHJldHVybiBudWxsOwogIH0KfQoKU3RyaW5nIGNvbnN0cnVjdE9wZXJhdG9yTmFtZShTdHJpbmcgb3AsIGJvb2wgaXNVbmFyeSkgewogIFN0cmluZyBvcGVyYXRvck5hbWUgPSBjb25zdHJ1Y3RPcGVyYXRvck5hbWVPck51bGwob3AsIGlzVW5hcnkpOwogIGlmIChvcGVyYXRvck5hbWUgPT0gbnVsbCkKICAgIHRocm93ICdVbmhhbmRsZWQgb3BlcmF0b3I6ICRvcCc7CiAgZWxzZQogICAgcmV0dXJuIG9wZXJhdG9yTmFtZTsKfQqAsQBOTjwBFgE5MwEYATcpGAEdJQQBKBw5DwQkAR88DwQnASUCASkoGAFLR084KysdHR0nJyYaBC4CAScsHk5NDSkCATdOHhAQIhgBEhIiGAEuGAFMOzkCATwyHBYLKgQCAUgcKAswBAIBOwRABEVFGC8WER0bHBwdHh4hHBwcHBwcHR0cHB0cHRwdGxwbHRscGxwcHBwcGxwcIR8LEQQCAT4dJDoPCxEEAgE4QhwlBxkCAS9wYWNrYWdlOmNvbXBpbGVyL3NyYy9lbGVtZW50cy9lbnRpdHlfdXRpbHMuZGFydDVzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9lbGVtZW50cy9vcGVyYXRvcnMuZGFydKB1Ly8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5vcGVyYXRvcnM7CgppbXBvcnQgJ25hbWVzLmRhcnQnIHNob3cgUHVibGljTmFtZTsKaW1wb3J0ICcuLi91bml2ZXJzZS9jYWxsX3N0cnVjdHVyZS5kYXJ0JyBzaG93IENhbGxTdHJ1Y3R1cmU7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCcgc2hvdyBTZWxlY3RvciwgU2VsZWN0b3JLaW5kOwoKZW51bSBVbmFyeU9wZXJhdG9yS2luZCB7CiAgTk9ULAogIE5FR0FURSwKICBDT01QTEVNRU5ULAp9CgpjbGFzcyBVbmFyeU9wZXJhdG9yIHsKICBmaW5hbCBVbmFyeU9wZXJhdG9yS2luZCBraW5kOwogIGZpbmFsIFN0cmluZyBuYW1lOwogIGZpbmFsIFN0cmluZyBzZWxlY3Rvck5hbWU7CgogIGNvbnN0IFVuYXJ5T3BlcmF0b3IodGhpcy5raW5kLCB0aGlzLm5hbWUsIHRoaXMuc2VsZWN0b3JOYW1lKTsKCiAgYm9vbCBnZXQgaXNVc2VyRGVmaW5hYmxlID0+IHNlbGVjdG9yTmFtZSAhPSBudWxsOwoKICBTZWxlY3RvciBnZXQgc2VsZWN0b3IgPT4gbmV3IFNlbGVjdG9yKFNlbGVjdG9yS2luZC5PUEVSQVRPUiwKICAgICAgbmV3IFB1YmxpY05hbWUoc2VsZWN0b3JOYW1lKSwgQ2FsbFN0cnVjdHVyZS5OT19BUkdTKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gbmFtZTsKCiAgLy8vIFRoZSB1bmFyeSAhIG9wZXJhdG9yLgogIHN0YXRpYyBjb25zdCBVbmFyeU9wZXJhdG9yIE5PVCA9CiAgICAgIGNvbnN0IFVuYXJ5T3BlcmF0b3IoVW5hcnlPcGVyYXRvcktpbmQuTk9ULCAnIScsIG51bGwpOwoKICAvLy8gVGhlIHVuYXJ5IC0gb3BlcmF0b3IuCiAgc3RhdGljIGNvbnN0IFVuYXJ5T3BlcmF0b3IgTkVHQVRFID0KICAgICAgY29uc3QgVW5hcnlPcGVyYXRvcihVbmFyeU9wZXJhdG9yS2luZC5ORUdBVEUsICctJywgJ3VuYXJ5LScpOwoKICAvLy8gVGhlIHVuYXJ5IH4gb3BlcmF0b3IuCiAgc3RhdGljIGNvbnN0IFVuYXJ5T3BlcmF0b3IgQ09NUExFTUVOVCA9CiAgICAgIGNvbnN0IFVuYXJ5T3BlcmF0b3IoVW5hcnlPcGVyYXRvcktpbmQuQ09NUExFTUVOVCwgJ34nLCAnficpOwoKICBzdGF0aWMgVW5hcnlPcGVyYXRvciBwYXJzZShTdHJpbmcgdmFsdWUpIHsKICAgIHN3aXRjaCAodmFsdWUpIHsKICAgICAgY2FzZSAnISc6CiAgICAgICAgcmV0dXJuIE5PVDsKICAgICAgY2FzZSAnLSc6CiAgICAgICAgcmV0dXJuIE5FR0FURTsKICAgICAgY2FzZSAnfic6CiAgICAgICAgcmV0dXJuIENPTVBMRU1FTlQ7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICAvLyBpZ25vcmU6IE1JU1NJTkdfUkVUVVJOCiAgc3RhdGljIFVuYXJ5T3BlcmF0b3IgZnJvbUtpbmQoVW5hcnlPcGVyYXRvcktpbmQga2luZCkgewogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgVW5hcnlPcGVyYXRvcktpbmQuTk9UOgogICAgICAgIHJldHVybiBOT1Q7CiAgICAgIGNhc2UgVW5hcnlPcGVyYXRvcktpbmQuTkVHQVRFOgogICAgICAgIHJldHVybiBORUdBVEU7CiAgICAgIGNhc2UgVW5hcnlPcGVyYXRvcktpbmQuQ09NUExFTUVOVDoKICAgICAgICByZXR1cm4gQ09NUExFTUVOVDsKICAgIH0KICB9Cn0KCmVudW0gQmluYXJ5T3BlcmF0b3JLaW5kIHsKICBFUSwKICBOT1RfRVEsCiAgSU5ERVgsCiAgQURELAogIFNVQiwKICBNVUwsCiAgRElWLAogIElESVYsCiAgTU9ELAogIFNITCwKICBTSFIsCiAgR1RFUSwKICBHVCwKICBMVEVRLAogIExULAogIEFORCwKICBPUiwKICBYT1IsCiAgTE9HSUNBTF9BTkQsCiAgTE9HSUNBTF9PUiwKICBJRl9OVUxMLAp9CgpjbGFzcyBCaW5hcnlPcGVyYXRvciB7CiAgZmluYWwgQmluYXJ5T3BlcmF0b3JLaW5kIGtpbmQ7CiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIGNvbnN0IEJpbmFyeU9wZXJhdG9yLl8odGhpcy5raW5kLCB0aGlzLm5hbWUpOwoKICAvLy8gYHRydWVgIGlmIHRoaXMgb3BlcmF0b3IgY2FuIGJlIGltcGxlbWVudGVkIHRocm91Z2ggYW4gYG9wZXJhdG9yIFtuYW1lXWAKICAvLy8gbWV0aG9kLgogIGJvb2wgZ2V0IGlzVXNlckRlZmluYWJsZSA9PiB0cnVlOwoKICBTdHJpbmcgZ2V0IHNlbGVjdG9yTmFtZSA9PiBuYW1lOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBuYW1lOwoKICAvLy8gVGhlID09IG9wZXJhdG9yLgogIHN0YXRpYyBjb25zdCBCaW5hcnlPcGVyYXRvciBFUSA9CiAgICAgIGNvbnN0IEJpbmFyeU9wZXJhdG9yLl8oQmluYXJ5T3BlcmF0b3JLaW5kLkVRLCAnPT0nKTsKCiAgLy8vIFRoZSAhPSBvcGVyYXRvci4KICBzdGF0aWMgY29uc3QgQmluYXJ5T3BlcmF0b3IgTk9UX0VRID0gY29uc3QgX05vdEVxdWFsc09wZXJhdG9yKCk7CgogIC8vLyBUaGUgW10gb3BlcmF0b3IuCiAgc3RhdGljIGNvbnN0IEJpbmFyeU9wZXJhdG9yIElOREVYID0KICAgICAgY29uc3QgQmluYXJ5T3BlcmF0b3IuXyhCaW5hcnlPcGVyYXRvcktpbmQuSU5ERVgsICdbXScpOwoKICAvLy8gVGhlIGJpbmFyeSArIG9wZXJhdG9yLgogIHN0YXRpYyBjb25zdCBCaW5hcnlPcGVyYXRvciBBREQgPQogICAgICBjb25zdCBCaW5hcnlPcGVyYXRvci5fKEJpbmFyeU9wZXJhdG9yS2luZC5BREQsICcrJyk7CgogIC8vLyBUaGUgYmluYXJ5IC0gb3BlcmF0b3IuCiAgc3RhdGljIGNvbnN0IEJpbmFyeU9wZXJhdG9yIFNVQiA9CiAgICAgIGNvbnN0IEJpbmFyeU9wZXJhdG9yLl8oQmluYXJ5T3BlcmF0b3JLaW5kLlNVQiwgJy0nKTsKCiAgLy8vIFRoZSBiaW5hcnkgKiBvcGVyYXRvci4KICBzdGF0aWMgY29uc3QgQmluYXJ5T3BlcmF0b3IgTVVMID0KICAgICAgY29uc3QgQmluYXJ5T3BlcmF0b3IuXyhCaW5hcnlPcGVyYXRvcktpbmQuTVVMLCAnKicpOwoKICAvLy8gVGhlIGJpbmFyeSAvIG9wZXJhdG9yLgogIHN0YXRpYyBjb25zdCBCaW5hcnlPcGVyYXRvciBESVYgPQogICAgICBjb25zdCBCaW5hcnlPcGVyYXRvci5fKEJpbmFyeU9wZXJhdG9yS2luZC5ESVYsICcvJyk7CgogIC8vLyBUaGUgYmluYXJ5IH4vIG9wZXJhdG9yLgogIHN0YXRpYyBjb25zdCBCaW5hcnlPcGVyYXRvciBJRElWID0KICAgICAgY29uc3QgQmluYXJ5T3BlcmF0b3IuXyhCaW5hcnlPcGVyYXRvcktpbmQuSURJViwgJ34vJyk7CgogIC8vLyBUaGUgYmluYXJ5ICUgb3BlcmF0b3IuCiAgc3RhdGljIGNvbnN0IEJpbmFyeU9wZXJhdG9yIE1PRCA9CiAgICAgIGNvbnN0IEJpbmFyeU9wZXJhdG9yLl8oQmluYXJ5T3BlcmF0b3JLaW5kLk1PRCwgJyUnKTsKCiAgLy8vIFRoZSBiaW5hcnkgPDwgb3BlcmF0b3IuCiAgc3RhdGljIGNvbnN0IEJpbmFyeU9wZXJhdG9yIFNITCA9CiAgICAgIGNvbnN0IEJpbmFyeU9wZXJhdG9yLl8oQmluYXJ5T3BlcmF0b3JLaW5kLlNITCwgJzw8Jyk7CgogIC8vLyBUaGUgYmluYXJ5ID4+IG9wZXJhdG9yLgogIHN0YXRpYyBjb25zdCBCaW5hcnlPcGVyYXRvciBTSFIgPQogICAgICBjb25zdCBCaW5hcnlPcGVyYXRvci5fKEJpbmFyeU9wZXJhdG9yS2luZC5TSFIsICc+PicpOwoKICAvLy8gVGhlIGJpbmFyeSA+PSBvcGVyYXRvci4KICBzdGF0aWMgY29uc3QgQmluYXJ5T3BlcmF0b3IgR1RFUSA9CiAgICAgIGNvbnN0IEJpbmFyeU9wZXJhdG9yLl8oQmluYXJ5T3BlcmF0b3JLaW5kLkdURVEsICc+PScpOwoKICAvLy8gVGhlIGJpbmFyeSA+IG9wZXJhdG9yLgogIHN0YXRpYyBjb25zdCBCaW5hcnlPcGVyYXRvciBHVCA9CiAgICAgIGNvbnN0IEJpbmFyeU9wZXJhdG9yLl8oQmluYXJ5T3BlcmF0b3JLaW5kLkdULCAnPicpOwoKICAvLy8gVGhlIGJpbmFyeSA8PSBvcGVyYXRvci4KICBzdGF0aWMgY29uc3QgQmluYXJ5T3BlcmF0b3IgTFRFUSA9CiAgICAgIGNvbnN0IEJpbmFyeU9wZXJhdG9yLl8oQmluYXJ5T3BlcmF0b3JLaW5kLkxURVEsICc8PScpOwoKICAvLy8gVGhlIGJpbmFyeSA8IG9wZXJhdG9yLgogIHN0YXRpYyBjb25zdCBCaW5hcnlPcGVyYXRvciBMVCA9CiAgICAgIGNvbnN0IEJpbmFyeU9wZXJhdG9yLl8oQmluYXJ5T3BlcmF0b3JLaW5kLkxULCAnPCcpOwoKICAvLy8gVGhlIGJpbmFyeSAmIG9wZXJhdG9yLgogIHN0YXRpYyBjb25zdCBCaW5hcnlPcGVyYXRvciBBTkQgPQogICAgICBjb25zdCBCaW5hcnlPcGVyYXRvci5fKEJpbmFyeU9wZXJhdG9yS2luZC5BTkQsICcmJyk7CgogIC8vLyBUaGUgYmluYXJ5IHwgb3BlcmF0b3IuCiAgc3RhdGljIGNvbnN0IEJpbmFyeU9wZXJhdG9yIE9SID0KICAgICAgY29uc3QgQmluYXJ5T3BlcmF0b3IuXyhCaW5hcnlPcGVyYXRvcktpbmQuT1IsICd8Jyk7CgogIC8vLyBUaGUgYmluYXJ5IF4gb3BlcmF0b3IuCiAgc3RhdGljIGNvbnN0IEJpbmFyeU9wZXJhdG9yIFhPUiA9CiAgICAgIGNvbnN0IEJpbmFyeU9wZXJhdG9yLl8oQmluYXJ5T3BlcmF0b3JLaW5kLlhPUiwgJ14nKTsKCiAgLy8vIFRoZSBsb2dpY2FsICYmIG9wZXJhdG9yLgogIHN0YXRpYyBjb25zdCBCaW5hcnlPcGVyYXRvciBMT0dJQ0FMX0FORCA9CiAgICAgIGNvbnN0IF9Mb2dpY2FsT3BlcmF0b3IoQmluYXJ5T3BlcmF0b3JLaW5kLkxPR0lDQUxfQU5ELCAnJiYnKTsKCiAgLy8vIFRoZSBiaW5hcnkgfCBvcGVyYXRvci4KICBzdGF0aWMgY29uc3QgQmluYXJ5T3BlcmF0b3IgTE9HSUNBTF9PUiA9CiAgICAgIGNvbnN0IF9Mb2dpY2FsT3BlcmF0b3IoQmluYXJ5T3BlcmF0b3JLaW5kLkxPR0lDQUxfT1IsICd8fCcpOwoKICAvLy8gVGhlIGlmLW51bGwgPz8gb3BlcmF0b3IuCiAgc3RhdGljIGNvbnN0IEJpbmFyeU9wZXJhdG9yIElGX05VTEwgPQogICAgICBjb25zdCBfSWZOdWxsT3BlcmF0b3IoQmluYXJ5T3BlcmF0b3JLaW5kLklGX05VTEwsICc/PycpOwoKICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgcGFyc2UoU3RyaW5nIHZhbHVlKSB7CiAgICBzd2l0Y2ggKHZhbHVlKSB7CiAgICAgIGNhc2UgJyYmJzoKICAgICAgICByZXR1cm4gTE9HSUNBTF9BTkQ7CiAgICAgIGNhc2UgJ3x8JzoKICAgICAgICByZXR1cm4gTE9HSUNBTF9PUjsKICAgICAgY2FzZSAnPz8nOgogICAgICAgIHJldHVybiBJRl9OVUxMOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBwYXJzZVVzZXJEZWZpbmFibGUodmFsdWUpOwogICAgfQogIH0KCiAgc3RhdGljIEJpbmFyeU9wZXJhdG9yIHBhcnNlVXNlckRlZmluYWJsZShTdHJpbmcgdmFsdWUpIHsKICAgIHN3aXRjaCAodmFsdWUpIHsKICAgICAgY2FzZSAnPT0nOgogICAgICAgIHJldHVybiBFUTsKICAgICAgY2FzZSAnIT0nOgogICAgICAgIHJldHVybiBOT1RfRVE7CiAgICAgIGNhc2UgJ1tdJzoKICAgICAgICByZXR1cm4gSU5ERVg7CiAgICAgIGNhc2UgJyonOgogICAgICAgIHJldHVybiBNVUw7CiAgICAgIGNhc2UgJy8nOgogICAgICAgIHJldHVybiBESVY7CiAgICAgIGNhc2UgJyUnOgogICAgICAgIHJldHVybiBNT0Q7CiAgICAgIGNhc2UgJ34vJzoKICAgICAgICByZXR1cm4gSURJVjsKICAgICAgY2FzZSAnKyc6CiAgICAgICAgcmV0dXJuIEFERDsKICAgICAgY2FzZSAnLSc6CiAgICAgICAgcmV0dXJuIFNVQjsKICAgICAgY2FzZSAnPDwnOgogICAgICAgIHJldHVybiBTSEw7CiAgICAgIGNhc2UgJz4+JzoKICAgICAgICByZXR1cm4gU0hSOwogICAgICBjYXNlICc+PSc6CiAgICAgICAgcmV0dXJuIEdURVE7CiAgICAgIGNhc2UgJz4nOgogICAgICAgIHJldHVybiBHVDsKICAgICAgY2FzZSAnPD0nOgogICAgICAgIHJldHVybiBMVEVROwogICAgICBjYXNlICc8JzoKICAgICAgICByZXR1cm4gTFQ7CiAgICAgIGNhc2UgJyYnOgogICAgICAgIHJldHVybiBBTkQ7CiAgICAgIGNhc2UgJ14nOgogICAgICAgIHJldHVybiBYT1I7CiAgICAgIGNhc2UgJ3wnOgogICAgICAgIHJldHVybiBPUjsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIC8vIGlnbm9yZTogTUlTU0lOR19SRVRVUk4KICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgZnJvbUtpbmQoQmluYXJ5T3BlcmF0b3JLaW5kIGtpbmQpIHsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5FUToKICAgICAgICByZXR1cm4gRVE7CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLk5PVF9FUToKICAgICAgICByZXR1cm4gTk9UX0VROwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5JTkRFWDoKICAgICAgICByZXR1cm4gSU5ERVg7CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLk1VTDoKICAgICAgICByZXR1cm4gTVVMOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5ESVY6CiAgICAgICAgcmV0dXJuIERJVjsKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuTU9EOgogICAgICAgIHJldHVybiBNT0Q7CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLklESVY6CiAgICAgICAgcmV0dXJuIElESVY7CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkFERDoKICAgICAgICByZXR1cm4gQUREOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5TVUI6CiAgICAgICAgcmV0dXJuIFNVQjsKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuU0hMOgogICAgICAgIHJldHVybiBTSEw7CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLlNIUjoKICAgICAgICByZXR1cm4gU0hSOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5HVEVROgogICAgICAgIHJldHVybiBHVEVROwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5HVDoKICAgICAgICByZXR1cm4gR1Q7CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkxURVE6CiAgICAgICAgcmV0dXJuIExURVE7CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkxUOgogICAgICAgIHJldHVybiBMVDsKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuQU5EOgogICAgICAgIHJldHVybiBBTkQ7CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLlhPUjoKICAgICAgICByZXR1cm4gWE9SOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5PUjoKICAgICAgICByZXR1cm4gT1I7CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkxPR0lDQUxfQU5EOgogICAgICAgIHJldHVybiBMT0dJQ0FMX0FORDsKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuTE9HSUNBTF9PUjoKICAgICAgICByZXR1cm4gTE9HSUNBTF9PUjsKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuSUZfTlVMTDoKICAgICAgICByZXR1cm4gSUZfTlVMTDsKICAgIH0KICB9Cn0KCi8vLyBUaGUgb3BlcmF0b3IgIT0sIHdoaWNoIGlzIG5vdCB1c2VyIGRlZmluYWJsZSBvcGVyYXRvciBidXQgaW5zdGVhZCBpcyBhCi8vLyBuZWdhdGlvbiBvZiBhIGNhbGwgdG8gdXNlciBkZWZpbmFibGUgb3BlcmF0b3IsIG5hbWVseSA9PS4KY2xhc3MgX05vdEVxdWFsc09wZXJhdG9yIGV4dGVuZHMgQmluYXJ5T3BlcmF0b3IgewogIGNvbnN0IF9Ob3RFcXVhbHNPcGVyYXRvcigpIDogc3VwZXIuXyhCaW5hcnlPcGVyYXRvcktpbmQuTk9UX0VRLCAnIT0nKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNVc2VyRGVmaW5hYmxlID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IHNlbGVjdG9yTmFtZSA9PiAnPT0nOwp9CgovLy8gVGhlIG9wZXJhdG9ycyAmJiBhbmQgfHwgd2hpY2ggYXJlIG5vdCB1c2VyIGRlZmluYWJsZSBvcGVyYXRvcnMgYnV0IGNvbnRyb2wKLy8vIHN0cnVjdHVyZXMuCmNsYXNzIF9Mb2dpY2FsT3BlcmF0b3IgZXh0ZW5kcyBCaW5hcnlPcGVyYXRvciB7CiAgY29uc3QgX0xvZ2ljYWxPcGVyYXRvcihCaW5hcnlPcGVyYXRvcktpbmQga2luZCwgU3RyaW5nIG5hbWUpCiAgICAgIDogc3VwZXIuXyhraW5kLCBuYW1lKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNVc2VyRGVmaW5hYmxlID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IHNlbGVjdG9yTmFtZSA9PiBudWxsOwp9CgovLy8gVGhlIG9wZXJhdG9ycyA/PyBpcyBub3QgdXNlciBkZWZpbmFibGUuCmNsYXNzIF9JZk51bGxPcGVyYXRvciBleHRlbmRzIEJpbmFyeU9wZXJhdG9yIHsKICBjb25zdCBfSWZOdWxsT3BlcmF0b3IoQmluYXJ5T3BlcmF0b3JLaW5kIGtpbmQsIFN0cmluZyBuYW1lKQogICAgICA6IHN1cGVyLl8oa2luZCwgbmFtZSk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzVXNlckRlZmluYWJsZSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBzZWxlY3Rvck5hbWUgPT4gJz8/JzsKfQqBTgBOTjwBGwElPUABGQcKDgIBFiAVHQFAATQBPzwBDB0BHCM9ARwmRAEcKkMBLRUQFBAXEBsPFQYEARw6FCIUJRcpGwYEAgEaBgoJBwcHBwgHBwcIBggGBwYHDw4LAgEXIRUBMAFODiQBIwEMHQEXIzsBF0MBFyY+AR0kOwEdJDsBHSQ7AR0kOwEeJT0BHSQ7AR4kPAEeJDwBHiU9AR0jOgEeJT0BHSM6AR0kOwEdIzoBHSQ7AR8sRAEdK0MBHyg/AS4VERwRGxEYDyoGBAE7FRETERcRFhAUEBQQFBEVEBQQFBEUERQRFRATERUQExAUEBQQEw8VBgQBHDwUIhMmFyUWIxQjFCMUJBUjFCMUIxQjFCQVIhMkFSITIxQjFCITKxwqGycYBgQCAUs+MkkBDCUBDCMCAU8QMD8dAQwlAQwjAgEsLz4dAQwlAQwjAgEscGFja2FnZTpjb21waWxlci9zcmMvZWxlbWVudHMvb3BlcmF0b3JzLmRhcnRFc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMva2VybmVsL2ludm9jYXRpb25fbWlycm9yX2NvbnN0YW50cy5kYXJ0gVcvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKY29uc3QgaW50IGludm9jYXRpb25NaXJyb3JNZXRob2RLaW5kID0gMDsKY29uc3QgaW50IGludm9jYXRpb25NaXJyb3JHZXR0ZXJLaW5kID0gMTsKY29uc3QgaW50IGludm9jYXRpb25NaXJyb3JTZXR0ZXJLaW5kID0gMjsKCQBOTjwBKioqATxwYWNrYWdlOmNvbXBpbGVyL3NyYy9rZXJuZWwvaW52b2NhdGlvbl9taXJyb3JfY29uc3RhbnRzLmRhcnQxc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaXIvc3RhdGljX3R5cGUuZGFydMABADIvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydCcgYXMgaXI7CmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnOwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JzsKaW1wb3J0ICdydW50aW1lX3R5cGVfYW5hbHlzaXMuZGFydCc7CmltcG9ydCAnc2NvcGUuZGFydCc7CmltcG9ydCAnc3RhdGljX3R5cGVfYmFzZS5kYXJ0JzsKCi8vLyBFbnVtIHZhbHVlcyBmb3IgaG93IHRoZSB0YXJnZXQgb2YgYSBzdGF0aWMgdHlwZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQuCmVudW0gQ2xhc3NSZWxhdGlvbiB7CiAgLy8vIFRoZSB0YXJnZXQgaXMgYW55IHN1YnR5cGUgb2YgdGhlIHN0YXRpYyB0eXBlLgogIHN1YnR5cGUsCgogIC8vLyBUaGUgdGFyZ2V0IGlzIGEgc3ViY2xhc3Mgb3IgbWl4aW4gYXBwbGljYXRpb24gb2YgdGhlIHN0YXRpYyB0eXBlLgogIC8vLwogIC8vLyBUaGlzIGNvcnJlc3BvbmRzIHRvIGFjY2Vzc2luZyBhIG1lbWJlciB0aHJvdWdoIGEgdGhpcyBleHByZXNzaW9uLgogIHRoaXNFeHByZXNzaW9uLAoKICAvLy8gVGhlIHRhcmdldCBpcyBhbiBleGFjdCBpbnN0YW5jZSBvZiB0aGUgc3RhdGljIHR5cGUuCiAgZXhhY3QsCn0KCi8vLyBWaXNpdG9yIHRoYXQgY29tcHV0ZXMgYW5kIGNhY2hlcyB0aGUgc3RhdGljIHR5cGUgb2YgZXhwcmVzc2lvbiB3aGlsZQovLy8gdmlzaXRpbmcgdGhlIGZ1bGwgdHJlZSBhdCBleHByZXNzaW9uIGxldmVsLgovLy8KLy8vIFRvIGVuc3VyZSB0aGF0IHRoZSB0cmF2ZXJzYWwgb25seSB2aXNpdHMgYW5kIGNvbXB1dGVzIHRoZSBleHByZXNzaW9uIHR5cGUKLy8vIGZvciBlYWNoIGV4cHJlc3Npb24gb25jZSwgdGhpcyBjbGFzcyBwZXJmb3JtcyB0aGUgdHJhdmVyc2FsIGV4cGxpY2l0bHkgYW5kCi8vLyBhZGRzICdoYW5kbGVYJyBob29rcyBmb3Igc3ViY2xhc3NlcyB0byBoYW5kbGUgaW5kaXZpZHVhbCBleHByZXNzaW9ucyB1c2luZwovLy8gdGhlIHJlYWRpbHkgY29tcHV0ZSBzdGF0aWMgdHlwZXMgb2Ygc3ViZXhwcmVzc2lvbnMuCmFic3RyYWN0IGNsYXNzIFN0YXRpY1R5cGVWaXNpdG9yIGV4dGVuZHMgU3RhdGljVHlwZUJhc2UgewogIE1hcDxpci5FeHByZXNzaW9uLCBpci5EYXJ0VHlwZT4gX2NhY2hlID0ge307CiAgTWFwPGlyLkV4cHJlc3Npb24sIFR5cGVNYXA+IHR5cGVNYXBzRm9yVGVzdGluZzsKICBNYXA8aXIuUHJvcGVydHlHZXQsIFJ1bnRpbWVUeXBlVXNlRGF0YT4gX3BlbmRpbmdSdW50aW1lVHlwZVVzZURhdGEgPSB7fTsKCiAgZmluYWwgaXIuQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5OwoKICBUaGlzSW50ZXJmYWNlVHlwZSBfdGhpc1R5cGU7CgogIFN0YXRpY1R5cGVWaXNpdG9yKGlyLlR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQsIHRoaXMuaGllcmFyY2h5KQogICAgICA6IHN1cGVyKHR5cGVFbnZpcm9ubWVudCk7CgogIE1hcDxpci5FeHByZXNzaW9uLCBpci5EYXJ0VHlwZT4gZ2V0IGNhY2hlZFN0YXRpY1R5cGVzID0+IF9jYWNoZTsKCiAgLy8vIElmIGB0cnVlYCwgdGhlIGVmZmVjdCBvZiBleGVjdXRpbmcgYXNzZXJ0IHN0YXRlbWVudHMgaXMgdGFrZW4gaW50byBhY2NvdW50CiAgLy8vIHdoZW4gY29tcHV0aW5nIHRoZSBzdGF0aWMgdHlwZS4KICBib29sIGdldCB1c2VBc3NlcnRzOwoKICAvLy8gSWYgYHRydWVgLCB0aGUgc3RhdGljIHR5cGUgb2YgYW4gZWZmZWN0aXZlbHkgZmluYWwgdmFyaWFibGUgaXMgaW5mZXJyZWQKICAvLy8gZnJvbSB0aGUgc3RhdGljIHR5cGUgb2YgaXRzIGluaXRpYWxpemVyLgogIGJvb2wgZ2V0IGluZmVyRWZmZWN0aXZlbHlGaW5hbFZhcmlhYmxlVHlwZXM7CgogIFZhcmlhYmxlU2NvcGVNb2RlbCBnZXQgdmFyaWFibGVTY29wZU1vZGVsOwoKICBAb3ZlcnJpZGUKICBUaGlzSW50ZXJmYWNlVHlwZSBnZXQgdGhpc1R5cGUgewogICAgYXNzZXJ0KF90aGlzVHlwZSAhPSBudWxsKTsKICAgIHJldHVybiBfdGhpc1R5cGU7CiAgfQoKICB2b2lkIHNldCB0aGlzVHlwZShUaGlzSW50ZXJmYWNlVHlwZSB2YWx1ZSkgewogICAgYXNzZXJ0KHZhbHVlID09IG51bGwgfHwgX3RoaXNUeXBlID09IG51bGwpOwogICAgX3RoaXNUeXBlID0gdmFsdWU7CiAgfQoKICBib29sIGNvbXBsZXRlcyhpci5EYXJ0VHlwZSB0eXBlKSA9PiB0eXBlICE9IGNvbnN0IERvZXNOb3RDb21wbGV0ZVR5cGUoKTsKCiAgU2V0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+IF9jdXJyZW50VmFyaWFibGVzOwogIFNldDxpci5WYXJpYWJsZURlY2xhcmF0aW9uPiBfaW52YWxpZGF0ZWRWYXJpYWJsZXMgPQogICAgICBuZXcgU2V0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+KCk7CgogIFR5cGVNYXAgX3R5cGVNYXBCYXNlID0gY29uc3QgVHlwZU1hcCgpOwogIFR5cGVNYXAgX3R5cGVNYXBXaGVuVHJ1ZTsKICBUeXBlTWFwIF90eXBlTWFwV2hlbkZhbHNlOwoKICAvLy8gUmV0dXJucyB0aGUgbG9jYWwgdmFyaWFibGUgdHlwZSBwcm9tb3Rpb25zIGZvciB3aGVuIHRoZSBib29sZWFuIHZhbHVlIG9mCiAgLy8vIHRoZSBtb3N0IHJlY2VudCBub2RlIGlzIG5vdCB0YWtlbiBpbnRvIGFjY291bnQuCiAgVHlwZU1hcCBnZXQgdHlwZU1hcCB7CiAgICBpZiAoX3R5cGVNYXBCYXNlID09IG51bGwpIHsKICAgICAgX3R5cGVNYXBCYXNlID0gX3R5cGVNYXBXaGVuVHJ1ZS5qb2luKF90eXBlTWFwV2hlbkZhbHNlKTsKICAgICAgX3R5cGVNYXBXaGVuVHJ1ZSA9IF90eXBlTWFwV2hlbkZhbHNlID0gbnVsbDsKICAgIH0KICAgIHJldHVybiBfdHlwZU1hcEJhc2U7CiAgfQoKICAvLy8gU2V0cyB0aGUgbG9jYWwgdmFyaWFibGUgdHlwZSBwcm9tb3Rpb25zIGZvciB3aGVuIHRoZSBib29sZWFuIHZhbHVlIG9mCiAgLy8vIHRoZSBtb3N0IHJlY2VudCBub2RlIGlzIG5vdCB0YWtlbiBpbnRvIGFjY291bnQuCiAgdm9pZCBzZXQgdHlwZU1hcChUeXBlTWFwIHZhbHVlKSB7CiAgICBfdHlwZU1hcEJhc2UgPSB2YWx1ZTsKICAgIF90eXBlTWFwV2hlblRydWUgPSBfdHlwZU1hcFdoZW5GYWxzZSA9IG51bGw7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgbG9jYWwgdmFyaWFibGUgdHlwZSBwcm9tb3Rpb25zIGZvciB3aGVuIHRoZSBib29sZWFuIHZhbHVlIG9mCiAgLy8vIHRoZSBtb3N0IHJlY2VudCBub2RlIGlzIGB0cnVlYC4KICBUeXBlTWFwIGdldCB0eXBlTWFwV2hlblRydWUgPT4gX3R5cGVNYXBXaGVuVHJ1ZSA/PyBfdHlwZU1hcEJhc2U7CgogIC8vLyBTZXRzIHRoZSBsb2NhbCB2YXJpYWJsZSB0eXBlIHByb21vdGlvbnMgZm9yIHdoZW4gdGhlIGJvb2xlYW4gdmFsdWUgb2YKICAvLy8gdGhlIG1vc3QgcmVjZW50IG5vZGUgaXMgYHRydWVgLgogIHZvaWQgc2V0IHR5cGVNYXBXaGVuVHJ1ZShUeXBlTWFwIHZhbHVlKSB7CiAgICBfdHlwZU1hcFdoZW5UcnVlID0gdmFsdWU7CiAgICBfdHlwZU1hcEJhc2UgPSBudWxsOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIGxvY2FsIHZhcmlhYmxlIHR5cGUgcHJvbW90aW9ucyBmb3Igd2hlbiB0aGUgYm9vbGVhbiB2YWx1ZSBvZgogIC8vLyB0aGUgbW9zdCByZWNlbnQgbm9kZSBpcyBgZmFsc2VgLgogIFR5cGVNYXAgZ2V0IHR5cGVNYXBXaGVuRmFsc2UgPT4gX3R5cGVNYXBXaGVuRmFsc2UgPz8gX3R5cGVNYXBCYXNlOwoKICAvLy8gU2V0cyB0aGUgbG9jYWwgdmFyaWFibGUgdHlwZSBwcm9tb3Rpb25zIGZvciB3aGVuIHRoZSBib29sZWFuIHZhbHVlIG9mCiAgLy8vIHRoZSBtb3N0IHJlY2VudCBub2RlIGlzIGBmYWxzZWAuCiAgdm9pZCBzZXQgdHlwZU1hcFdoZW5GYWxzZShUeXBlTWFwIHZhbHVlKSB7CiAgICBfdHlwZU1hcFdoZW5GYWxzZSA9IHZhbHVlOwogICAgX3R5cGVNYXBCYXNlID0gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIGRlZmF1bHROb2RlKGlyLk5vZGUgbm9kZSkgPT4KICAgICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcignVW5oYW5kbGVkIG5vZGUgJG5vZGUgKCR7bm9kZS5ydW50aW1lVHlwZX0pJyk7CgogIEBvdmVycmlkZQogIE51bGwgdmlzaXRDb21wb25lbnQoaXIuQ29tcG9uZW50IG5vZGUpIHsKICAgIHZpc2l0Tm9kZXMobm9kZS5saWJyYXJpZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgTnVsbCB2aXNpdExpYnJhcnkoaXIuTGlicmFyeSBub2RlKSB7CiAgICB2aXNpdE5vZGVzKG5vZGUuY2xhc3Nlcyk7CiAgICB2aXNpdE5vZGVzKG5vZGUucHJvY2VkdXJlcyk7CiAgICB2aXNpdE5vZGVzKG5vZGUuZmllbGRzKTsKICB9CgogIEBvdmVycmlkZQogIE51bGwgdmlzaXRDbGFzcyhpci5DbGFzcyBub2RlKSB7CiAgICB2aXNpdE5vZGVzKG5vZGUuY29uc3RydWN0b3JzKTsKICAgIHZpc2l0Tm9kZXMobm9kZS5wcm9jZWR1cmVzKTsKICAgIHZpc2l0Tm9kZXMobm9kZS5maWVsZHMpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBleHByZXNzaW9uIGFzIGFuIGluc3RhbnRpYXRpb24gb2YKICAvLy8gW3N1cGVyY2xhc3NdLgogIC8vLwogIC8vLyBTaG91bGQgb25seSBiZSB1c2VkIG9uIGNvZGUgY29tcGlsZWQgaW4gc3Ryb25nIG1vZGUsIGFzIHRoaXMgbWV0aG9kCiAgLy8vIGFzc3VtZXMgdGhlIElSIGlzIHN0cm9uZ2x5IHR5cGVkLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBmdXJ0aGVybW9yZSBhc3N1bWVzIHRoYXQgdGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gYWN0dWFsbHkKICAvLy8gaXMgYSBzdWJ0eXBlIG9mIChzb21lIGluc3RhbnRpYXRpb24gb2YpIHRoZSBnaXZlbiBbc3VwZXJjbGFzc10uCiAgLy8vIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlIHRoZSByYXcgdHlwZSBvZiBbc3VwZXJjbGFzc10gaXMgcmV0dXJuZWQuCiAgLy8vCiAgLy8vIFRoaXMgbWV0aG9kIGlzIGRlcml2ZWQgZnJvbSBgaXIuRXhwcmVzc2lvbi5nZXRTdGF0aWNUeXBlQXNJbnN0YW5jZU9mYC4KICBpci5JbnRlcmZhY2VUeXBlIGdldFR5cGVBc0luc3RhbmNlT2YoaXIuRGFydFR5cGUgdHlwZSwgaXIuQ2xhc3Mgc3VwZXJjbGFzcykgewogICAgLy8gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGUgcHJvZ3JhbSBpcyBjb3JyZWN0bHkgdHlwZWQsIHNvIGlmIHRoZSBzdXBlcmNsYXNzCiAgICAvLyBpcyBub3QgZ2VuZXJpYywgd2UgY2FuIGp1c3QgcmV0dXJuIGl0cyByYXcgdHlwZSB3aXRob3V0IGNvbXB1dGluZyB0aGUKICAgIC8vIHR5cGUgb2YgdGhpcyBleHByZXNzaW9uLiAgSXQgYWxzbyBlbnN1cmVzIHRoYXQgYWxsIHR5cGVzIGFyZSBjb25zaWRlcmVkCiAgICAvLyBzdWJ0eXBlcyBvZiBPYmplY3QgKG5vdCBqdXN0IGludGVyZmFjZSB0eXBlcyksIGFuZCBmdW5jdGlvbiB0eXBlcyBhcmUKICAgIC8vIGNvbnNpZGVyZWQgc3VidHlwZXMgb2YgRnVuY3Rpb24uCiAgICBpZiAoc3VwZXJjbGFzcy50eXBlUGFyYW1ldGVycy5pc0VtcHR5KSB7CiAgICAgIHJldHVybiBzdXBlcmNsYXNzLnJhd1R5cGU7CiAgICB9CiAgICB3aGlsZSAodHlwZSBpcyBpci5UeXBlUGFyYW1ldGVyVHlwZSkgewogICAgICB0eXBlID0gKHR5cGUgYXMgaXIuVHlwZVBhcmFtZXRlclR5cGUpLnBhcmFtZXRlci5ib3VuZDsKICAgIH0KICAgIGlmICh0eXBlID09IHR5cGVFbnZpcm9ubWVudC5udWxsVHlwZSkgewogICAgICByZXR1cm4gc3VwZXJjbGFzcy5ib3R0b21UeXBlOwogICAgfQogICAgaWYgKHR5cGUgaXMgaXIuSW50ZXJmYWNlVHlwZSkgewogICAgICBpci5JbnRlcmZhY2VUeXBlIHVwY2FzdFR5cGUgPQogICAgICAgICAgdHlwZUVudmlyb25tZW50LmdldFR5cGVBc0luc3RhbmNlT2YodHlwZSwgc3VwZXJjbGFzcyk7CiAgICAgIGlmICh1cGNhc3RUeXBlICE9IG51bGwpIHJldHVybiB1cGNhc3RUeXBlOwogICAgfSBlbHNlIGlmICh0eXBlIGlzIGlyLkJvdHRvbVR5cGUpIHsKICAgICAgcmV0dXJuIHN1cGVyY2xhc3MuYm90dG9tVHlwZTsKICAgIH0KICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFNob3VsZCB3ZSBhc3NlcnQgdGhhdCB0aGlzIGRvZXNuJ3QgaGFwcGVuPwogICAgcmV0dXJuIHN1cGVyY2xhc3MucmF3VHlwZTsKICB9CgogIC8vLyBDb21wdXRlcyB0aGUgcmVzdWx0IHR5cGUgb2YgdGhlIHByb3BlcnR5IGFjY2VzcyBbbm9kZV0gb24gYSByZWNlaXZlciBvZgogIC8vLyB0eXBlIFtyZWNlaXZlclR5cGVdLgogIC8vLwogIC8vLyBJZiB0aGUgYG5vZGUuaW50ZXJmYWNlVGFyZ2V0YCBpcyBgbnVsbGAgYnV0IG1hdGNoZXMgYW4gYE9iamVjdGAgbWVtYmVyCiAgLy8vIGl0IGlzIHVwZGF0ZWQgdG8gdGFyZ2V0IHRoaXMgbWVtYmVyLgogIGlyLkRhcnRUeXBlIF9jb21wdXRlUHJvcGVydHlHZXRUeXBlKAogICAgICBpci5Qcm9wZXJ0eUdldCBub2RlLCBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUpIHsKICAgIGlyLk1lbWJlciBpbnRlcmZhY2VUYXJnZXQgPSBub2RlLmludGVyZmFjZVRhcmdldDsKICAgIGlmIChpbnRlcmZhY2VUYXJnZXQgPT0gbnVsbCAmJiByZWNlaXZlclR5cGUgaXMgaXIuSW50ZXJmYWNlVHlwZSkgewogICAgICBpbnRlcmZhY2VUYXJnZXQgPSBub2RlLmludGVyZmFjZVRhcmdldCA9CiAgICAgICAgICBoaWVyYXJjaHkuZ2V0SW50ZXJmYWNlTWVtYmVyKHJlY2VpdmVyVHlwZS5jbGFzc05vZGUsIG5vZGUubmFtZSk7CiAgICB9CiAgICBpZiAoaW50ZXJmYWNlVGFyZ2V0ICE9IG51bGwpIHsKICAgICAgaXIuQ2xhc3Mgc3VwZXJjbGFzcyA9IGludGVyZmFjZVRhcmdldC5lbmNsb3NpbmdDbGFzczsKICAgICAgcmVjZWl2ZXJUeXBlID0gZ2V0VHlwZUFzSW5zdGFuY2VPZihyZWNlaXZlclR5cGUsIHN1cGVyY2xhc3MpOwogICAgICByZXR1cm4gaXIuU3Vic3RpdHV0aW9uLmZyb21JbnRlcmZhY2VUeXBlKHJlY2VpdmVyVHlwZSkKICAgICAgICAgIC5zdWJzdGl0dXRlVHlwZShpbnRlcmZhY2VUYXJnZXQuZ2V0dGVyVHlwZSk7CiAgICB9CiAgICAvLyBUcmVhdCB0aGUgcHJvcGVydGllcyBvZiBPYmplY3Qgc3BlY2lhbGx5LgogICAgU3RyaW5nIG5hbWVTdHJpbmcgPSBub2RlLm5hbWUubmFtZTsKICAgIGlmIChuYW1lU3RyaW5nID09ICdoYXNoQ29kZScpIHsKICAgICAgcmV0dXJuIHR5cGVFbnZpcm9ubWVudC5pbnRUeXBlOwogICAgfSBlbHNlIGlmIChuYW1lU3RyaW5nID09ICdydW50aW1lVHlwZScpIHsKICAgICAgcmV0dXJuIHR5cGVFbnZpcm9ubWVudC50eXBlVHlwZTsKICAgIH0KICAgIHJldHVybiBjb25zdCBpci5EeW5hbWljVHlwZSgpOwogIH0KCiAgdm9pZCBoYW5kbGVQcm9wZXJ0eUdldCgKICAgICAgaXIuUHJvcGVydHlHZXQgbm9kZSwgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlLCBpci5EYXJ0VHlwZSByZXN1bHRUeXBlKSB7fQoKICB2b2lkIGhhbmRsZVJ1bnRpbWVUeXBlVXNlKGlyLlByb3BlcnR5R2V0IG5vZGUsIFJ1bnRpbWVUeXBlVXNlS2luZCBraW5kLAogICAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsIGlyLkRhcnRUeXBlIGFyZ3VtZW50VHlwZSkge30KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRQcm9wZXJ0eUdldChpci5Qcm9wZXJ0eUdldCBub2RlKSB7CiAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUgPSB2aXNpdE5vZGUobm9kZS5yZWNlaXZlcik7CiAgICBpci5EYXJ0VHlwZSByZXN1bHRUeXBlID0KICAgICAgICBfY2FjaGVbbm9kZV0gPSBfY29tcHV0ZVByb3BlcnR5R2V0VHlwZShub2RlLCByZWNlaXZlclR5cGUpOwogICAgcmVjZWl2ZXJUeXBlID0gX25hcnJvd0luc3RhbmNlUmVjZWl2ZXIobm9kZS5pbnRlcmZhY2VUYXJnZXQsIHJlY2VpdmVyVHlwZSk7CiAgICBoYW5kbGVQcm9wZXJ0eUdldChub2RlLCByZWNlaXZlclR5cGUsIHJlc3VsdFR5cGUpOwogICAgaWYgKG5vZGUubmFtZS5uYW1lID09IElkZW50aWZpZXJzLnJ1bnRpbWVUeXBlXykgewogICAgICBSdW50aW1lVHlwZVVzZURhdGEgZGF0YSA9CiAgICAgICAgICBjb21wdXRlUnVudGltZVR5cGVVc2UoX3BlbmRpbmdSdW50aW1lVHlwZVVzZURhdGEsIG5vZGUpOwogICAgICBpZiAoZGF0YS5sZWZ0UnVudGltZVR5cGVFeHByZXNzaW9uID09IG5vZGUpIHsKICAgICAgICAvLyBbbm9kZV0gaXMgdGhlIGxlZnQgKG9yIHNpbmdsZSkgb2NjdXJyZW5jZSBvZiBgLnJ1bnRpbWVUeXBlYCBzbyB3ZQogICAgICAgIC8vIGNhbiBzZXQgdGhlIHN0YXRpYyB0eXBlIG9mIHRoZSByZWNlaXZlciBleHByZXNzaW9uLgogICAgICAgIGRhdGEucmVjZWl2ZXJUeXBlID0gcmVjZWl2ZXJUeXBlOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFtub2RlXSBpcyB0aGUgcmlnaHQgb2NjdXJyZW5jZSBvZiBgLnJ1bnRpbWVUeXBlYCBzbyB3ZQogICAgICAgIC8vIGNhbiBzZXQgdGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBhcmd1bWVudCBleHByZXNzaW9uLgogICAgICAgIGFzc2VydChkYXRhLnJpZ2h0UnVudGltZVR5cGVFeHByZXNzaW9uID09IG5vZGUsCiAgICAgICAgICAgICJVbmV4cGVjdGVkIFJ1bnRpbWVUeXBlVXNlRGF0YSBmb3IgJG5vZGU6ICRkYXRhIik7CiAgICAgICAgZGF0YS5hcmd1bWVudFR5cGUgPSByZWNlaXZlclR5cGU7CiAgICAgIH0KICAgICAgaWYgKGRhdGEuaXNDb21wbGV0ZSkgewogICAgICAgIC8vLyBXZSBub3cgaGF2ZSBhbGwgbmVlZCBzdGF0aWMgdHlwZXMgc28gd2UgY2FuIHJlbW92ZSB0aGUgZGF0YSBmcm9tCiAgICAgICAgLy8vIHRoZSBjYWNoZSBhbmQgaGFuZGxlIHRoZSBydW50aW1lIHR5cGUgdXNlLgogICAgICAgIF9wZW5kaW5nUnVudGltZVR5cGVVc2VEYXRhLnJlbW92ZShkYXRhLmxlZnRSdW50aW1lVHlwZUV4cHJlc3Npb24pOwogICAgICAgIGlmIChkYXRhLnJpZ2h0UnVudGltZVR5cGVFeHByZXNzaW9uICE9IG51bGwpIHsKICAgICAgICAgIF9wZW5kaW5nUnVudGltZVR5cGVVc2VEYXRhLnJlbW92ZShkYXRhLnJpZ2h0UnVudGltZVR5cGVFeHByZXNzaW9uKTsKICAgICAgICB9CiAgICAgICAgaGFuZGxlUnVudGltZVR5cGVVc2UoCiAgICAgICAgICAgIG5vZGUsIGRhdGEua2luZCwgZGF0YS5yZWNlaXZlclR5cGUsIGRhdGEuYXJndW1lbnRUeXBlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdFR5cGU7CiAgfQoKICB2b2lkIGhhbmRsZVByb3BlcnR5U2V0KAogICAgICBpci5Qcm9wZXJ0eVNldCBub2RlLCBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsIGlyLkRhcnRUeXBlIHZhbHVlVHlwZSkge30KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRQcm9wZXJ0eVNldChpci5Qcm9wZXJ0eVNldCBub2RlKSB7CiAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUgPSB2aXNpdE5vZGUobm9kZS5yZWNlaXZlcik7CiAgICBpci5EYXJ0VHlwZSB2YWx1ZVR5cGUgPSBzdXBlci52aXNpdFByb3BlcnR5U2V0KG5vZGUpOwogICAgaXIuTWVtYmVyIGludGVyZmFjZVRhcmdldCA9IG5vZGUuaW50ZXJmYWNlVGFyZ2V0OwogICAgaWYgKGludGVyZmFjZVRhcmdldCA9PSBudWxsICYmIHJlY2VpdmVyVHlwZSBpcyBpci5JbnRlcmZhY2VUeXBlKSB7CiAgICAgIGludGVyZmFjZVRhcmdldCA9IGhpZXJhcmNoeQogICAgICAgICAgLmdldEludGVyZmFjZU1lbWJlcihyZWNlaXZlclR5cGUuY2xhc3NOb2RlLCBub2RlLm5hbWUsIHNldHRlcjogdHJ1ZSk7CiAgICAgIGlmIChpbnRlcmZhY2VUYXJnZXQgIT0gbnVsbCkgewogICAgICAgIGlyLkNsYXNzIHN1cGVyY2xhc3MgPSBpbnRlcmZhY2VUYXJnZXQuZW5jbG9zaW5nQ2xhc3M7CiAgICAgICAgaXIuU3Vic3RpdHV0aW9uIHJlY2VpdmVyU3Vic3RpdHV0aW9uID0KICAgICAgICAgICAgaXIuU3Vic3RpdHV0aW9uLmZyb21JbnRlcmZhY2VUeXBlKAogICAgICAgICAgICAgICAgZ2V0VHlwZUFzSW5zdGFuY2VPZihyZWNlaXZlclR5cGUsIHN1cGVyY2xhc3MpKTsKICAgICAgICBpci5EYXJ0VHlwZSBzZXR0ZXJUeXBlID0KICAgICAgICAgICAgcmVjZWl2ZXJTdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoaW50ZXJmYWNlVGFyZ2V0LnNldHRlclR5cGUpOwogICAgICAgIGlmICghdHlwZUVudmlyb25tZW50LmlzU3VidHlwZU9mKHZhbHVlVHlwZSwgc2V0dGVyVHlwZSkpIHsKICAgICAgICAgIC8vIFdlIG5lZWQgdG8gaW5zZXJ0IGFuIGltcGxpY2l0IGNhc3QgdG8gcHJlc2VydmUgdGhlIGludmFyaWFudCB0aGF0CiAgICAgICAgICAvLyBhIHByb3BlcnR5IHNldCB3aXRoIGEga25vd24gaW50ZXJmYWNlIHRhcmdldCBpcyBhbHNvIHN0YXRpY2FsbHkKICAgICAgICAgIC8vIGNoZWNrZWQuCiAgICAgICAgICBpci5Bc0V4cHJlc3Npb24gaW1wbGljaXRDYXN0ID0KICAgICAgICAgICAgICBuZXcgaXIuQXNFeHByZXNzaW9uKG5vZGUudmFsdWUsIHNldHRlclR5cGUpCiAgICAgICAgICAgICAgICAuLmlzVHlwZUVycm9yID0gdHJ1ZQogICAgICAgICAgICAgICAgLi5wYXJlbnQgPSBub2RlOwogICAgICAgICAgbm9kZS52YWx1ZSA9IGltcGxpY2l0Q2FzdDsKICAgICAgICAgIC8vIFZpc2l0IHRoZSBuZXdseSBjcmVhdGVkIGFzIGV4cHJlc3Npb247IHRoZSBvcmlnaW5hbCB2YWx1ZSBoYXMKICAgICAgICAgIC8vIGFscmVhZHkgYmVlbiB2aXNpdGVkLgogICAgICAgICAgaGFuZGxlQXNFeHByZXNzaW9uKGltcGxpY2l0Q2FzdCwgdmFsdWVUeXBlKTsKICAgICAgICAgIHZhbHVlVHlwZSA9IHNldHRlclR5cGU7CiAgICAgICAgfQogICAgICAgIG5vZGUuaW50ZXJmYWNlVGFyZ2V0ID0gaW50ZXJmYWNlVGFyZ2V0OwogICAgICB9CiAgICB9CiAgICByZWNlaXZlclR5cGUgPSBfbmFycm93SW5zdGFuY2VSZWNlaXZlcihpbnRlcmZhY2VUYXJnZXQsIHJlY2VpdmVyVHlwZSk7CiAgICBoYW5kbGVQcm9wZXJ0eVNldChub2RlLCByZWNlaXZlclR5cGUsIHZhbHVlVHlwZSk7CiAgICByZXR1cm4gdmFsdWVUeXBlOwogIH0KCiAgdm9pZCBoYW5kbGVEaXJlY3RQcm9wZXJ0eUdldChpci5EaXJlY3RQcm9wZXJ0eUdldCBub2RlLAogICAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsIGlyLkRhcnRUeXBlIHJlc3VsdFR5cGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0RGlyZWN0UHJvcGVydHlHZXQoaXIuRGlyZWN0UHJvcGVydHlHZXQgbm9kZSkgewogICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlID0gdmlzaXROb2RlKG5vZGUucmVjZWl2ZXIpOwogICAgaXIuQ2xhc3Mgc3VwZXJjbGFzcyA9IG5vZGUudGFyZ2V0LmVuY2xvc2luZ0NsYXNzOwogICAgcmVjZWl2ZXJUeXBlID0gZ2V0VHlwZUFzSW5zdGFuY2VPZihyZWNlaXZlclR5cGUsIHN1cGVyY2xhc3MpOwogICAgaXIuRGFydFR5cGUgcmVzdWx0VHlwZSA9IGlyLlN1YnN0aXR1dGlvbi5mcm9tSW50ZXJmYWNlVHlwZShyZWNlaXZlclR5cGUpCiAgICAgICAgLnN1YnN0aXR1dGVUeXBlKG5vZGUudGFyZ2V0LmdldHRlclR5cGUpOwogICAgX2NhY2hlW25vZGVdID0gcmVzdWx0VHlwZTsKICAgIGhhbmRsZURpcmVjdFByb3BlcnR5R2V0KG5vZGUsIHJlY2VpdmVyVHlwZSwgcmVzdWx0VHlwZSk7CiAgICByZXR1cm4gcmVzdWx0VHlwZTsKICB9CgogIHZvaWQgaGFuZGxlRGlyZWN0TWV0aG9kSW52b2NhdGlvbigKICAgICAgaXIuRGlyZWN0TWV0aG9kSW52b2NhdGlvbiBub2RlLAogICAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsCiAgICAgIEFyZ3VtZW50VHlwZXMgYXJndW1lbnRUeXBlcywKICAgICAgaXIuRGFydFR5cGUgcmV0dXJuVHlwZSkge30KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXREaXJlY3RNZXRob2RJbnZvY2F0aW9uKGlyLkRpcmVjdE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlID0gdmlzaXROb2RlKG5vZGUucmVjZWl2ZXIpOwogICAgQXJndW1lbnRUeXBlcyBhcmd1bWVudFR5cGVzID0gX3Zpc2l0QXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKTsKICAgIGlyLkRhcnRUeXBlIHJldHVyblR5cGU7CiAgICBpZiAodHlwZUVudmlyb25tZW50LmlzT3ZlcmxvYWRlZEFyaXRobWV0aWNPcGVyYXRvcihub2RlLnRhcmdldCkpIHsKICAgICAgaXIuRGFydFR5cGUgYXJndW1lbnRUeXBlID0gYXJndW1lbnRUeXBlcy5wb3NpdGlvbmFsWzBdOwogICAgICByZXR1cm5UeXBlID0gdHlwZUVudmlyb25tZW50LmdldFR5cGVPZk92ZXJsb2FkZWRBcml0aG1ldGljKAogICAgICAgICAgcmVjZWl2ZXJUeXBlLCBhcmd1bWVudFR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgaXIuQ2xhc3Mgc3VwZXJjbGFzcyA9IG5vZGUudGFyZ2V0LmVuY2xvc2luZ0NsYXNzOwogICAgICByZWNlaXZlclR5cGUgPSBnZXRUeXBlQXNJbnN0YW5jZU9mKHJlY2VpdmVyVHlwZSwgc3VwZXJjbGFzcyk7CiAgICAgIGlyLkRhcnRUeXBlIHJldHVyblR5cGUgPSBpci5TdWJzdGl0dXRpb24uZnJvbUludGVyZmFjZVR5cGUocmVjZWl2ZXJUeXBlKQogICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKG5vZGUudGFyZ2V0LmZ1bmN0aW9uLnJldHVyblR5cGUpOwogICAgICByZXR1cm5UeXBlID0gaXIuU3Vic3RpdHV0aW9uLmZyb21QYWlycygKICAgICAgICAgICAgICBub2RlLnRhcmdldC5mdW5jdGlvbi50eXBlUGFyYW1ldGVycywgbm9kZS5hcmd1bWVudHMudHlwZXMpCiAgICAgICAgICAuc3Vic3RpdHV0ZVR5cGUocmV0dXJuVHlwZSk7CiAgICB9CiAgICBfY2FjaGVbbm9kZV0gPSByZXR1cm5UeXBlOwogICAgaGFuZGxlRGlyZWN0TWV0aG9kSW52b2NhdGlvbihub2RlLCByZWNlaXZlclR5cGUsIGFyZ3VtZW50VHlwZXMsIHJldHVyblR5cGUpOwogICAgcmV0dXJuIHJldHVyblR5cGU7CiAgfQoKICB2b2lkIGhhbmRsZURpcmVjdFByb3BlcnR5U2V0KGlyLkRpcmVjdFByb3BlcnR5U2V0IG5vZGUsCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwgaXIuRGFydFR5cGUgdmFsdWVUeXBlKSB7fQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdERpcmVjdFByb3BlcnR5U2V0KGlyLkRpcmVjdFByb3BlcnR5U2V0IG5vZGUpIHsKICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSA9IHZpc2l0Tm9kZShub2RlLnJlY2VpdmVyKTsKICAgIGlyLkRhcnRUeXBlIHZhbHVlVHlwZSA9IHN1cGVyLnZpc2l0RGlyZWN0UHJvcGVydHlTZXQobm9kZSk7CiAgICBoYW5kbGVEaXJlY3RQcm9wZXJ0eVNldChub2RlLCByZWNlaXZlclR5cGUsIHZhbHVlVHlwZSk7CiAgICByZXR1cm4gdmFsdWVUeXBlOwogIH0KCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtpbnRlcmZhY2VUYXJnZXRdIGlzIGFuIGFyaXRobWV0aWMgb3BlcmF0b3Igd2hvc2UgcmVzdWx0CiAgLy8vIHR5cGUgaXMgY29tcHV0ZWQgdXNpbmcgYm90aCB0aGUgcmVjZWl2ZXIgdHlwZSBhbmQgdGhlIGFyZ3VtZW50IHR5cGUuCiAgLy8vCiAgLy8vIFZpc2l0b3JzIHRoYXQgc3ViY2xhc3MgdGhlIFtTdGF0aWNUeXBlVmlzaXRvcl0gbXVzdCBzcGVjaWFsIGNhc2UgdGhpcwogIC8vLyB0YXJnZXQgYXMgdG8gYXZvaWQgdmlzaXRpbmcgdGhlIGFyZ3VtZW50IHR3aWNlLgogIGJvb2wgaXNTcGVjaWFsQ2FzZWRCaW5hcnlPcGVyYXRvcihpci5NZW1iZXIgaW50ZXJmYWNlVGFyZ2V0KSB7CiAgICByZXR1cm4gaW50ZXJmYWNlVGFyZ2V0IGlzIGlyLlByb2NlZHVyZSAmJgogICAgICAgIHR5cGVFbnZpcm9ubWVudC5pc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3IoaW50ZXJmYWNlVGFyZ2V0KTsKICB9CgogIGlyLk1lbWJlciBfZ2V0TWVtYmVyKGlyLkNsYXNzIGNscywgU3RyaW5nIG5hbWUpIHsKICAgIGZvciAoaXIuTWVtYmVyIG1lbWJlciBpbiBjbHMubWVtYmVycykgewogICAgICBpZiAobWVtYmVyLm5hbWUubmFtZSA9PSBuYW1lKSByZXR1cm4gbWVtYmVyOwogICAgfQogICAgdGhyb3cgZmFpbCgiTWVtYmVyICckbmFtZScgbm90IGZvdW5kIGluICRjbHMiKTsKICB9CgogIGlyLlByb2NlZHVyZSBfb2JqZWN0RXF1YWxzOwogIGlyLlByb2NlZHVyZSBnZXQgb2JqZWN0RXF1YWxzID0+CiAgICAgIF9vYmplY3RFcXVhbHMgPz89IF9nZXRNZW1iZXIodHlwZUVudmlyb25tZW50Lm9iamVjdFR5cGUuY2xhc3NOb2RlLCAnPT0nKTsKCiAgLy8vIFJldHVybnMgW3JlY2VpdmVyVHlwZV0gbmFycm93ZWQgdG8gZW5jbG9zaW5nIGNsYXNzIG9mIFtpbnRlcmZhY2VUYXJnZXRdLgogIC8vLwogIC8vLyBJZiBbaW50ZXJmYWNlVGFyZ2V0XSBpcyBgbnVsbGAgb3IgYHJlY2VpdmVyVHlwZWAgaXMgX25vdF8gYGR5bmFtaWNgIG5vCiAgLy8vIG5hcnJvd2luZyBpcyBwZXJmb3JtZWQuCiAgaXIuRGFydFR5cGUgX25hcnJvd0luc3RhbmNlUmVjZWl2ZXIoCiAgICAgIGlyLk1lbWJlciBpbnRlcmZhY2VUYXJnZXQsIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSkgewogICAgaWYgKGludGVyZmFjZVRhcmdldCAhPSBudWxsICYmIHJlY2VpdmVyVHlwZSA9PSBjb25zdCBpci5EeW5hbWljVHlwZSgpKSB7CiAgICAgIHJlY2VpdmVyVHlwZSA9IGludGVyZmFjZVRhcmdldC5lbmNsb3NpbmdDbGFzcy50aGlzVHlwZTsKICAgIH0KICAgIHJldHVybiByZWNlaXZlclR5cGU7CiAgfQoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW21lbWJlcl0gY2FuIGJlIGNhbGxlZCB3aXRoIHRoZSBzdHJ1Y3R1cmUgb2YKICAvLy8gW2FyZ3VtZW50c10uCiAgYm9vbCBfaXNBcHBsaWNhYmxlKGlyLkFyZ3VtZW50cyBhcmd1bWVudHMsIGlyLk1lbWJlciBtZW1iZXIpIHsKICAgIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbYXJndW1lbnRzXSBhcmUgYXBwbGljYWJsZSB0byB0aGUgZnVuY3Rpb24gdHlwZQogICAgLy8vIHN0cnVjdHVyZS4KICAgIGJvb2wgaXNGdW5jdGlvblR5cGVBcHBsaWNhYmxlKAogICAgICAgIGludCB0eXBlUGFyYW1ldGVyQ291bnQsCiAgICAgICAgaW50IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgaW50IHBvc2l0aW9uYWxQYXJhbWV0ZXJDb3VudCwKICAgICAgICBJdGVyYWJsZTxTdHJpbmc+IEZ1bmN0aW9uKCkgZ2V0TmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgIGlmIChhcmd1bWVudHMudHlwZXMuaXNOb3RFbXB0eSAmJgogICAgICAgICAgYXJndW1lbnRzLnR5cGVzLmxlbmd0aCAhPSB0eXBlUGFyYW1ldGVyQ291bnQpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKGFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA8IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKGFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA+IHBvc2l0aW9uYWxQYXJhbWV0ZXJDb3VudCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBJdGVyYWJsZTxTdHJpbmc+IG5hbWVkUGFyYW1ldGVycyA9IGdldE5hbWVkUGFyYW1ldGVycygpOwogICAgICBpZiAoYXJndW1lbnRzLm5hbWVkLmxlbmd0aCA+IG5hbWVkUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKGFyZ3VtZW50cy5uYW1lZC5pc05vdEVtcHR5KSB7CiAgICAgICAgZm9yIChpci5OYW1lZEV4cHJlc3Npb24gbmFtZWRBcmd1bWVudHMgaW4gYXJndW1lbnRzLm5hbWVkKSB7CiAgICAgICAgICBpZiAoIW5hbWVkUGFyYW1ldGVycy5jb250YWlucyhuYW1lZEFyZ3VtZW50cy5uYW1lKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbYXJndW1lbnRzXSBhcmUgYXBwbGljYWJsZSB0byBhIHZhbHVlIG9mIHRoZSBzdGF0aWMKICAgIC8vLyBbdHlwZV0uCiAgICBib29sIGlzVHlwZUFwcGxpY2FibGUoaXIuRGFydFR5cGUgdHlwZSkgewogICAgICBpZiAodHlwZSBpcyBpci5EeW5hbWljVHlwZSkgcmV0dXJuIHRydWU7CiAgICAgIGlmICh0eXBlID09IHR5cGVFbnZpcm9ubWVudC5yYXdGdW5jdGlvblR5cGUpIHJldHVybiB0cnVlOwogICAgICBpZiAodHlwZSBpcyBpci5GdW5jdGlvblR5cGUpIHsKICAgICAgICByZXR1cm4gaXNGdW5jdGlvblR5cGVBcHBsaWNhYmxlKAogICAgICAgICAgICB0eXBlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwKICAgICAgICAgICAgdHlwZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgICAgICB0eXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCwKICAgICAgICAgICAgKCkgPT4gdHlwZS5uYW1lZFBhcmFtZXRlcnMubWFwKChwKSA9PiBwLm5hbWUpLnRvU2V0KCkpOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBpZiAobWVtYmVyIGlzIGlyLlByb2NlZHVyZSkgewogICAgICBpZiAobWVtYmVyLmtpbmQgPT0gaXIuUHJvY2VkdXJlS2luZC5TZXR0ZXIgfHwKICAgICAgICAgIG1lbWJlci5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuRmFjdG9yeSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfSBlbHNlIGlmIChtZW1iZXIua2luZCA9PSBpci5Qcm9jZWR1cmVLaW5kLkdldHRlcikgewogICAgICAgIHJldHVybiBpc1R5cGVBcHBsaWNhYmxlKG1lbWJlci5nZXR0ZXJUeXBlKTsKICAgICAgfSBlbHNlIGlmIChtZW1iZXIua2luZCA9PSBpci5Qcm9jZWR1cmVLaW5kLk1ldGhvZCB8fAogICAgICAgICAgbWVtYmVyLmtpbmQgPT0gaXIuUHJvY2VkdXJlS2luZC5PcGVyYXRvcikgewogICAgICAgIHJldHVybiBpc0Z1bmN0aW9uVHlwZUFwcGxpY2FibGUoCiAgICAgICAgICAgIG1lbWJlci5mdW5jdGlvbi50eXBlUGFyYW1ldGVycy5sZW5ndGgsCiAgICAgICAgICAgIG1lbWJlci5mdW5jdGlvbi5yZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgICAgICBtZW1iZXIuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoLAogICAgICAgICAgICAoKSA9PiBtZW1iZXIuZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLm1hcCgocCkgPT4gcC5uYW1lKS50b1NldCgpKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChtZW1iZXIgaXMgaXIuRmllbGQpIHsKICAgICAgcmV0dXJuIGlzVHlwZUFwcGxpY2FibGUobWVtYmVyLnR5cGUpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8vIFVwZGF0ZSB0aGUgaW50ZXJmYWNlIHRhcmdldCBvbiBbbm9kZV0uCiAgLy8vCiAgLy8vIFRoaXMgaW5zZXJ0cyBhbnkgaW1wbGljaXQgY2FzdCBvZiB0aGUgYXJndW1lbnRzIG5lY2Vzc2FyeSB0byB1cGhvbGQgdGhlCiAgLy8vIGludmFyaWFudCB0aGF0IGEgbWV0aG9kIGludm9jYXRpb24gd2l0aCBhbiBpbnRlcmZhY2UgdGFyZ2V0IGhhbmRsZXMKICAvLy8gdGhlIHN0YXRpYyB0eXBlcyBhdCB0aGUgY2FsbCBzaXRlLgogIHZvaWQgX3VwZGF0ZU1ldGhvZEludm9jYXRpb25UYXJnZXQoCiAgICAgIGlyLk1ldGhvZEludm9jYXRpb24gbm9kZSwKICAgICAgQXJndW1lbnRUeXBlcyBhcmd1bWVudFR5cGVzLAogICAgICBpci5EYXJ0VHlwZSBmdW5jdGlvblR5cGUsCiAgICAgIGlyLk1lbWJlciBpbnRlcmZhY2VUYXJnZXQpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEhhbmRsZSBpbmNyZW1lbnRhbCB0YXJnZXQgaW1wcm92ZW1lbnQuCiAgICBpZiAobm9kZS5pbnRlcmZhY2VUYXJnZXQgIT0gbnVsbCkgcmV0dXJuOwogICAgbm9kZS5pbnRlcmZhY2VUYXJnZXQgPSBpbnRlcmZhY2VUYXJnZXQ7CiAgICBpZiAoZnVuY3Rpb25UeXBlIGlzISBpci5GdW5jdGlvblR5cGUpIHJldHVybjsKICAgIGlyLkZ1bmN0aW9uVHlwZSBwYXJhbWV0ZXJUeXBlcyA9IGZ1bmN0aW9uVHlwZTsKICAgIE1hcDxpbnQsIGlyLkRhcnRUeXBlPiBuZWVkZWRQb3NpdGlvbmFsQ2hlY2tzID0ge307CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoOyBpKyspIHsKICAgICAgaXIuRGFydFR5cGUgYXJndW1lbnRUeXBlID0gYXJndW1lbnRUeXBlcy5wb3NpdGlvbmFsW2ldOwogICAgICBpci5EYXJ0VHlwZSBwYXJhbWV0ZXJUeXBlID0gcGFyYW1ldGVyVHlwZXMucG9zaXRpb25hbFBhcmFtZXRlcnNbaV07CiAgICAgIGlmICghdHlwZUVudmlyb25tZW50LmlzU3VidHlwZU9mKGFyZ3VtZW50VHlwZSwgcGFyYW1ldGVyVHlwZSkpIHsKICAgICAgICBuZWVkZWRQb3NpdGlvbmFsQ2hlY2tzW2ldID0gcGFyYW1ldGVyVHlwZTsKICAgICAgfQogICAgfQogICAgTWFwPGludCwgaXIuRGFydFR5cGU+IG5lZWRlZE5hbWVkQ2hlY2tzID0ge307CiAgICBmb3IgKGludCBhcmd1bWVudEluZGV4ID0gMDsKICAgICAgICBhcmd1bWVudEluZGV4IDwgbm9kZS5hcmd1bWVudHMubmFtZWQubGVuZ3RoOwogICAgICAgIGFyZ3VtZW50SW5kZXgrKykgewogICAgICBpci5OYW1lZEV4cHJlc3Npb24gbmFtZWRBcmd1bWVudCA9IG5vZGUuYXJndW1lbnRzLm5hbWVkW2FyZ3VtZW50SW5kZXhdOwogICAgICBpci5EYXJ0VHlwZSBhcmd1bWVudFR5cGUgPSBhcmd1bWVudFR5cGVzLm5hbWVkW2FyZ3VtZW50SW5kZXhdOwogICAgICBpci5EYXJ0VHlwZSBwYXJhbWV0ZXJUeXBlID0gcGFyYW1ldGVyVHlwZXMubmFtZWRQYXJhbWV0ZXJzCiAgICAgICAgICAuc2luZ2xlV2hlcmUoKG5hbWVkVHlwZSkgPT4gbmFtZWRUeXBlLm5hbWUgPT0gbmFtZWRBcmd1bWVudC5uYW1lKQogICAgICAgICAgLnR5cGU7CiAgICAgIGlmICghdHlwZUVudmlyb25tZW50LmlzU3VidHlwZU9mKGFyZ3VtZW50VHlwZSwgcGFyYW1ldGVyVHlwZSkpIHsKICAgICAgICBuZWVkZWROYW1lZENoZWNrc1thcmd1bWVudEluZGV4XSA9IHBhcmFtZXRlclR5cGU7CiAgICAgIH0KICAgIH0KICAgIGlmIChuZWVkZWRQb3NpdGlvbmFsQ2hlY2tzLmlzRW1wdHkgJiYgbmVlZGVkTmFtZWRDaGVja3MuaXNFbXB0eSkgewogICAgICAvLyBObyBpbXBsaWNpdCBjYXN0cyBuZWVkZWQKICAgICAgcmV0dXJuOwogICAgfQoKICAgIExpc3Q8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4gbGV0VmFyaWFibGVzID0gW107CgogICAgLy8gQXJndW1lbnRzIG5lZWQgdG8gYmUgaG9pc3RlZCB0byBhbiBlbmNsb3NpbmcgbGV0IGV4cHJlc3Npb24gaW4gb3JkZXIKICAgIC8vIHRvIGVuc3VyZSB0aGF0IHRoZSBhcmd1bWVudHMgYXJlIGV2YWx1YXRlZCBiZWZvcmUgYW55IGltcGxpY2l0IGNhc3QuCgogICAgaXIuRXhwcmVzc2lvbiB1cGRhdGVBcmd1bWVudChpci5FeHByZXNzaW9uIGV4cHJlc3Npb24sIGlyLlRyZWVOb2RlIHBhcmVudCwKICAgICAgICBpci5EYXJ0VHlwZSBhcmd1bWVudFR5cGUsIGlyLkRhcnRUeXBlIGNoZWNrZWRQYXJhbWV0ZXJUeXBlKSB7CiAgICAgIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPQogICAgICAgICAgbmV3IGlyLlZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoZXhwcmVzc2lvbiwgdHlwZTogYXJndW1lbnRUeXBlKTsKICAgICAgLy8gVmlzaXQgdGhlIG5ld2x5IGNyZWF0ZWQgdmFyaWFibGUgZGVjbGFyYXRpb24uCiAgICAgIGhhbmRsZVZhcmlhYmxlRGVjbGFyYXRpb24odmFyaWFibGUpOwogICAgICBsZXRWYXJpYWJsZXMuYWRkKHZhcmlhYmxlKTsKICAgICAgaXIuVmFyaWFibGVHZXQgZ2V0ID0gbmV3IGlyLlZhcmlhYmxlR2V0KHZhcmlhYmxlKS4ucGFyZW50ID0gcGFyZW50OwogICAgICAvLyBWaXNpdCB0aGUgbmV3bHkgY3JlYXRlZCB2YXJpYWJsZSBnZXQuCiAgICAgIGhhbmRsZVZhcmlhYmxlR2V0KGdldCwgYXJndW1lbnRUeXBlKTsKICAgICAgY2FjaGVkU3RhdGljVHlwZXNbZ2V0XSA9IGFyZ3VtZW50VHlwZTsKCiAgICAgIGlmIChjaGVja2VkUGFyYW1ldGVyVHlwZSA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGdldDsKICAgICAgfQogICAgICAvLyBXZSBuZWVkIHRvIGluc2VydCBhbiBpbXBsaWNpdCBjYXN0IHRvIHByZXNlcnZlIHRoZSBpbnZhcmlhbnQgdGhhdAogICAgICAvLyBhIG1ldGhvZCBpbnZvY2F0aW9uIHdpdGggYSBrbm93biBpbnRlcmZhY2UgdGFyZ2V0IGlzIGFsc28KICAgICAgLy8gc3RhdGljYWxseSBjaGVja2VkLgogICAgICBpci5Bc0V4cHJlc3Npb24gaW1wbGljaXRDYXN0ID0KICAgICAgICAgIG5ldyBpci5Bc0V4cHJlc3Npb24oZ2V0LCBjaGVja2VkUGFyYW1ldGVyVHlwZSkKICAgICAgICAgICAgLi5pc1R5cGVFcnJvciA9IHRydWUKICAgICAgICAgICAgLi5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgIC8vIFZpc2l0IHRoZSBuZXdseSBjcmVhdGVkIGFzIGV4cHJlc3Npb247IHRoZSBvcmlnaW5hbCB2YWx1ZSBoYXMKICAgICAgLy8gYWxyZWFkeSBiZWVuIHZpc2l0ZWQuCiAgICAgIGhhbmRsZUFzRXhwcmVzc2lvbihpbXBsaWNpdENhc3QsIGFyZ3VtZW50VHlwZSk7CiAgICAgIHJldHVybiBpbXBsaWNpdENhc3Q7CiAgICB9CgogICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgIGlyLkRhcnRUeXBlIGFyZ3VtZW50VHlwZSA9IGFyZ3VtZW50VHlwZXMucG9zaXRpb25hbFtpbmRleF07CiAgICAgIG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWxbaW5kZXhdID0gdXBkYXRlQXJndW1lbnQoCiAgICAgICAgICBub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsW2luZGV4XSwKICAgICAgICAgIG5vZGUuYXJndW1lbnRzLAogICAgICAgICAgYXJndW1lbnRUeXBlLAogICAgICAgICAgbmVlZGVkUG9zaXRpb25hbENoZWNrc1tpbmRleF0pOwogICAgfQogICAgZm9yIChpbnQgYXJndW1lbnRJbmRleCA9IDA7CiAgICAgICAgYXJndW1lbnRJbmRleCA8IG5vZGUuYXJndW1lbnRzLm5hbWVkLmxlbmd0aDsKICAgICAgICBhcmd1bWVudEluZGV4KyspIHsKICAgICAgaXIuTmFtZWRFeHByZXNzaW9uIG5hbWVkQXJndW1lbnQgPSBub2RlLmFyZ3VtZW50cy5uYW1lZFthcmd1bWVudEluZGV4XTsKICAgICAgaXIuRGFydFR5cGUgYXJndW1lbnRUeXBlID0gYXJndW1lbnRUeXBlcy5uYW1lZFthcmd1bWVudEluZGV4XTsKICAgICAgbmFtZWRBcmd1bWVudC52YWx1ZSA9IHVwZGF0ZUFyZ3VtZW50KG5hbWVkQXJndW1lbnQudmFsdWUsIG5hbWVkQXJndW1lbnQsCiAgICAgICAgICBhcmd1bWVudFR5cGUsIG5lZWRlZE5hbWVkQ2hlY2tzW2FyZ3VtZW50SW5kZXhdKTsKICAgIH0KCiAgICBpci5FeHByZXNzaW9uIGR1bW15ID0gbmV3IGlyLk51bGxMaXRlcmFsKCk7CiAgICBub2RlLnJlcGxhY2VXaXRoKGR1bW15KTsKICAgIGlyLkV4cHJlc3Npb24gYm9keSA9IG5vZGU7CiAgICBmb3IgKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgaW4gbGV0VmFyaWFibGVzLnJldmVyc2VkKSB7CiAgICAgIGJvZHkgPSBuZXcgaXIuTGV0KHZhcmlhYmxlLCBib2R5KTsKICAgIH0KICAgIGR1bW15LnJlcGxhY2VXaXRoKGJvZHkpOwogIH0KCiAgLy8vIENvbXB1dGVzIHRoZSByZXN1bHQgdHlwZSBvZiB0aGUgbWV0aG9kIGludm9jYXRpb24gW25vZGVdIG9uIGEgcmVjZWl2ZXIgb2YKICAvLy8gdHlwZSBbcmVjZWl2ZXJUeXBlXS4KICAvLy8KICAvLy8gSWYgdGhlIGBub2RlLmludGVyZmFjZVRhcmdldGAgaXMgYG51bGxgIGJ1dCBtYXRjaGVzIGFuIGBPYmplY3RgIG1lbWJlcgogIC8vLyBpdCBpcyB1cGRhdGVkIHRvIHRhcmdldCB0aGlzIG1lbWJlci4KICBpci5EYXJ0VHlwZSBfY29tcHV0ZU1ldGhvZEludm9jYXRpb25UeXBlKGlyLk1ldGhvZEludm9jYXRpb24gbm9kZSwKICAgICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlLCBBcmd1bWVudFR5cGVzIGFyZ3VtZW50VHlwZXMpIHsKICAgIGlyLk1lbWJlciBpbnRlcmZhY2VUYXJnZXQgPSBub2RlLmludGVyZmFjZVRhcmdldDsKICAgIC8vIFRPRE8oMzQ2MDIpOiBSZW1vdmUgd2hlbiBgaW50ZXJmYWNlVGFyZ2V0YCBpcyBzZXQgb24gc3ludGhldGljIGNhbGxzIHRvCiAgICAvLyA9PS4KICAgIGlmIChpbnRlcmZhY2VUYXJnZXQgPT0gbnVsbCAmJgogICAgICAgIG5vZGUubmFtZS5uYW1lID09ICc9PScgJiYKICAgICAgICBub2RlLmFyZ3VtZW50cy50eXBlcy5pc0VtcHR5ICYmCiAgICAgICAgbm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGggPT0gMSAmJgogICAgICAgIG5vZGUuYXJndW1lbnRzLm5hbWVkLmlzRW1wdHkpIHsKICAgICAgaW50ZXJmYWNlVGFyZ2V0ID0gbm9kZS5pbnRlcmZhY2VUYXJnZXQgPSBvYmplY3RFcXVhbHM7CiAgICB9CiAgICBpZiAoaW50ZXJmYWNlVGFyZ2V0ID09IG51bGwgJiYgcmVjZWl2ZXJUeXBlIGlzIGlyLkludGVyZmFjZVR5cGUpIHsKICAgICAgaXIuTWVtYmVyIG1lbWJlciA9CiAgICAgICAgICBoaWVyYXJjaHkuZ2V0SW50ZXJmYWNlTWVtYmVyKHJlY2VpdmVyVHlwZS5jbGFzc05vZGUsIG5vZGUubmFtZSk7CiAgICAgIGlmIChfaXNBcHBsaWNhYmxlKG5vZGUuYXJndW1lbnRzLCBtZW1iZXIpKSB7CiAgICAgICAgaW50ZXJmYWNlVGFyZ2V0ID0gbWVtYmVyOwogICAgICB9CiAgICB9CiAgICBpZiAoaW50ZXJmYWNlVGFyZ2V0ICE9IG51bGwpIHsKICAgICAgaXIuQ2xhc3Mgc3VwZXJjbGFzcyA9IGludGVyZmFjZVRhcmdldC5lbmNsb3NpbmdDbGFzczsKICAgICAgaXIuU3Vic3RpdHV0aW9uIHJlY2VpdmVyU3Vic3RpdHV0aW9uID0gaXIuU3Vic3RpdHV0aW9uLmZyb21JbnRlcmZhY2VUeXBlKAogICAgICAgICAgZ2V0VHlwZUFzSW5zdGFuY2VPZihyZWNlaXZlclR5cGUsIHN1cGVyY2xhc3MpKTsKICAgICAgaXIuRGFydFR5cGUgZ2V0dGVyVHlwZSA9CiAgICAgICAgICByZWNlaXZlclN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShpbnRlcmZhY2VUYXJnZXQuZ2V0dGVyVHlwZSk7CiAgICAgIGlmIChnZXR0ZXJUeXBlIGlzIGlyLkZ1bmN0aW9uVHlwZSkgewogICAgICAgIGlyLkZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUgPSBnZXR0ZXJUeXBlOwogICAgICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPSBub2RlLmFyZ3VtZW50cy50eXBlczsKICAgICAgICBpZiAoaW50ZXJmYWNlVGFyZ2V0IGlzIGlyLlByb2NlZHVyZSAmJgogICAgICAgICAgICBpbnRlcmZhY2VUYXJnZXQuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSAmJgogICAgICAgICAgICB0eXBlQXJndW1lbnRzLmlzRW1wdHkpIHsKICAgICAgICAgIC8vIElmIHRoaXMgd2FzIGEgZHluYW1pYyBjYWxsIHRoZSBpbnZvY2F0aW9uIGRvZXMgbm90IGhhdmUgdGhlCiAgICAgICAgICAvLyBpbmZlcnJlZCBkZWZhdWx0IHR5cGUgYXJndW1lbnRzIHNvIHdlIG5lZWQgdG8gY3JlYXRlIHRoZW0gaGVyZQogICAgICAgICAgLy8gdG8gcGVyZm9ybSBhIHZhbGlkIHN1YnN0aXR1dGlvbi4KICAgICAgICAgIHR5cGVBcmd1bWVudHMgPSBpbnRlcmZhY2VUYXJnZXQuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMKICAgICAgICAgICAgICAubWFwKCh0KSA9PiByZWNlaXZlclN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZSh0LmRlZmF1bHRUeXBlKSkKICAgICAgICAgICAgICAudG9MaXN0KCk7CiAgICAgICAgfQogICAgICAgIGdldHRlclR5cGUgPSBpci5TdWJzdGl0dXRpb24uZnJvbVBhaXJzKAogICAgICAgICAgICAgICAgZnVuY3Rpb25UeXBlLnR5cGVQYXJhbWV0ZXJzLCB0eXBlQXJndW1lbnRzKQogICAgICAgICAgICAuc3Vic3RpdHV0ZVR5cGUoZnVuY3Rpb25UeXBlLndpdGhvdXRUeXBlUGFyYW1ldGVycyk7CiAgICAgIH0KICAgICAgX3VwZGF0ZU1ldGhvZEludm9jYXRpb25UYXJnZXQoCiAgICAgICAgICBub2RlLCBhcmd1bWVudFR5cGVzLCBnZXR0ZXJUeXBlLCBpbnRlcmZhY2VUYXJnZXQpOwogICAgICBpZiAoaXNTcGVjaWFsQ2FzZWRCaW5hcnlPcGVyYXRvcihpbnRlcmZhY2VUYXJnZXQpKSB7CiAgICAgICAgaXIuRGFydFR5cGUgYXJndW1lbnRUeXBlID0gYXJndW1lbnRUeXBlcy5wb3NpdGlvbmFsWzBdOwogICAgICAgIHJldHVybiB0eXBlRW52aXJvbm1lbnQuZ2V0VHlwZU9mT3ZlcmxvYWRlZEFyaXRobWV0aWMoCiAgICAgICAgICAgIHJlY2VpdmVyVHlwZSwgYXJndW1lbnRUeXBlKTsKICAgICAgfSBlbHNlIGlmIChnZXR0ZXJUeXBlIGlzIGlyLkZ1bmN0aW9uVHlwZSkgewogICAgICAgIHJldHVybiBnZXR0ZXJUeXBlLnJldHVyblR5cGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGNvbnN0IGlyLkR5bmFtaWNUeXBlKCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChub2RlLm5hbWUubmFtZSA9PSAnY2FsbCcpIHsKICAgICAgaWYgKHJlY2VpdmVyVHlwZSBpcyBpci5GdW5jdGlvblR5cGUpIHsKICAgICAgICBpZiAocmVjZWl2ZXJUeXBlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCAhPSBub2RlLmFyZ3VtZW50cy50eXBlcy5sZW5ndGgpIHsKICAgICAgICAgIHJldHVybiBjb25zdCBEb2VzTm90Q29tcGxldGVUeXBlKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpci5TdWJzdGl0dXRpb24uZnJvbVBhaXJzKAogICAgICAgICAgICAgICAgcmVjZWl2ZXJUeXBlLnR5cGVQYXJhbWV0ZXJzLCBub2RlLmFyZ3VtZW50cy50eXBlcykKICAgICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHJlY2VpdmVyVHlwZS5yZXR1cm5UeXBlKTsKICAgICAgfQogICAgfQogICAgaWYgKG5vZGUubmFtZS5uYW1lID09ICc9PScpIHsKICAgICAgLy8gV2UgdXNlIHRoaXMgc3BlY2lhbCBjYXNlIHRvIHNpbXBsaWZ5IGdlbmVyYXRpb24gb2YgJz09JyBjaGVja3MuCiAgICAgIHJldHVybiB0eXBlRW52aXJvbm1lbnQuYm9vbFR5cGU7CiAgICB9CiAgICByZXR1cm4gY29uc3QgaXIuRHluYW1pY1R5cGUoKTsKICB9CgogIEFyZ3VtZW50VHlwZXMgX3Zpc2l0QXJndW1lbnRzKGlyLkFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIExpc3Q8aXIuRGFydFR5cGU+IHBvc2l0aW9uYWw7CiAgICBMaXN0PGlyLkRhcnRUeXBlPiBuYW1lZDsKICAgIGlmIChhcmd1bWVudHMucG9zaXRpb25hbC5pc0VtcHR5KSB7CiAgICAgIHBvc2l0aW9uYWwgPSBjb25zdCA8aXIuRGFydFR5cGU+W107CiAgICB9IGVsc2UgewogICAgICBwb3NpdGlvbmFsID0gbmV3IExpc3Q8aXIuRGFydFR5cGU+KGFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCk7CiAgICAgIGludCBpbmRleCA9IDA7CiAgICAgIGZvciAoaXIuRXhwcmVzc2lvbiBhcmd1bWVudCBpbiBhcmd1bWVudHMucG9zaXRpb25hbCkgewogICAgICAgIHBvc2l0aW9uYWxbaW5kZXgrK10gPSB2aXNpdE5vZGUoYXJndW1lbnQpOwogICAgICB9CiAgICB9CiAgICBpZiAoYXJndW1lbnRzLm5hbWVkLmlzRW1wdHkpIHsKICAgICAgbmFtZWQgPSBjb25zdCA8aXIuRGFydFR5cGU+W107CiAgICB9IGVsc2UgewogICAgICBuYW1lZCA9IG5ldyBMaXN0PGlyLkRhcnRUeXBlPihhcmd1bWVudHMubmFtZWQubGVuZ3RoKTsKICAgICAgaW50IGluZGV4ID0gMDsKICAgICAgZm9yIChpci5OYW1lZEV4cHJlc3Npb24gYXJndW1lbnQgaW4gYXJndW1lbnRzLm5hbWVkKSB7CiAgICAgICAgbmFtZWRbaW5kZXgrK10gPSB2aXNpdE5vZGUoYXJndW1lbnQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IEFyZ3VtZW50VHlwZXMocG9zaXRpb25hbCwgbmFtZWQpOwogIH0KCiAgdm9pZCBoYW5kbGVNZXRob2RJbnZvY2F0aW9uKAogICAgICBpci5NZXRob2RJbnZvY2F0aW9uIG5vZGUsCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwKICAgICAgQXJndW1lbnRUeXBlcyBhcmd1bWVudFR5cGVzLAogICAgICBpci5EYXJ0VHlwZSByZXR1cm5UeXBlKSB7fQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdE1ldGhvZEludm9jYXRpb24oaXIuTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICBBcmd1bWVudFR5cGVzIGFyZ3VtZW50VHlwZXMgPSBfdmlzaXRBcmd1bWVudHMobm9kZS5hcmd1bWVudHMpOwogICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlID0gdmlzaXROb2RlKG5vZGUucmVjZWl2ZXIpOwogICAgaXIuRGFydFR5cGUgcmV0dXJuVHlwZSA9CiAgICAgICAgX2NvbXB1dGVNZXRob2RJbnZvY2F0aW9uVHlwZShub2RlLCByZWNlaXZlclR5cGUsIGFyZ3VtZW50VHlwZXMpOwogICAgcmVjZWl2ZXJUeXBlID0gX25hcnJvd0luc3RhbmNlUmVjZWl2ZXIobm9kZS5pbnRlcmZhY2VUYXJnZXQsIHJlY2VpdmVyVHlwZSk7CiAgICBpZiAobm9kZS5uYW1lLm5hbWUgPT0gJz09JykgewogICAgICBpci5FeHByZXNzaW9uIGxlZnQgPSBub2RlLnJlY2VpdmVyOwogICAgICBpci5FeHByZXNzaW9uIHJpZ2h0ID0gbm9kZS5hcmd1bWVudHMucG9zaXRpb25hbFswXTsKICAgICAgVHlwZU1hcCBhZnRlckludm9jYXRpb24gPSB0eXBlTWFwOwogICAgICBpZiAobGVmdCBpcyBpci5WYXJpYWJsZUdldCAmJgogICAgICAgICAgcmlnaHQgaXMgaXIuTnVsbExpdGVyYWwgJiYKICAgICAgICAgICFfaW52YWxpZGF0ZWRWYXJpYWJsZXMuY29udGFpbnMobGVmdC52YXJpYWJsZSkpIHsKICAgICAgICAvLyBJZiBgbGVmdCA9PSBudWxsYCBpcyB0cnVlLCB3ZSBwcm9tb3RlIHRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZSB0bwogICAgICAgIC8vIGBOdWxsYCBieSByZWdpc3RlcmluZyB0aGF0IGlzIGtub3duIF9ub3RfIHRvIGJlIG9mIGl0cyBkZWNsYXJlZCB0eXBlLgogICAgICAgIHR5cGVNYXBXaGVuVHJ1ZSA9IGFmdGVySW52b2NhdGlvbgogICAgICAgICAgICAucHJvbW90ZShsZWZ0LnZhcmlhYmxlLCBsZWZ0LnZhcmlhYmxlLnR5cGUsIGlzVHJ1ZTogZmFsc2UpOwogICAgICAgIHR5cGVNYXBXaGVuRmFsc2UgPSBhZnRlckludm9jYXRpb24KICAgICAgICAgICAgLnByb21vdGUobGVmdC52YXJpYWJsZSwgbGVmdC52YXJpYWJsZS50eXBlLCBpc1RydWU6IHRydWUpOwogICAgICB9CiAgICAgIGlmIChyaWdodCBpcyBpci5WYXJpYWJsZUdldCAmJgogICAgICAgICAgbGVmdCBpcyBpci5OdWxsTGl0ZXJhbCAmJgogICAgICAgICAgIV9pbnZhbGlkYXRlZFZhcmlhYmxlcy5jb250YWlucyhyaWdodC52YXJpYWJsZSkpIHsKICAgICAgICAvLyBJZiBgbnVsbCA9PSByaWdodGAgaXMgdHJ1ZSwgd2UgcHJvbW90ZSB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUgdG8KICAgICAgICAvLyBgTnVsbGAgYnkgcmVnaXN0ZXJpbmcgdGhhdCBpcyBrbm93biBfbm90XyB0byBiZSBvZiBpdHMgZGVjbGFyZWQgdHlwZS4KICAgICAgICB0eXBlTWFwV2hlblRydWUgPSBhZnRlckludm9jYXRpb24KICAgICAgICAgICAgLnByb21vdGUocmlnaHQudmFyaWFibGUsIHJpZ2h0LnZhcmlhYmxlLnR5cGUsIGlzVHJ1ZTogZmFsc2UpOwogICAgICAgIHR5cGVNYXBXaGVuRmFsc2UgPSBhZnRlckludm9jYXRpb24KICAgICAgICAgICAgLnByb21vdGUocmlnaHQudmFyaWFibGUsIHJpZ2h0LnZhcmlhYmxlLnR5cGUsIGlzVHJ1ZTogdHJ1ZSk7CiAgICAgIH0KICAgIH0KICAgIF9jYWNoZVtub2RlXSA9IHJldHVyblR5cGU7CiAgICBoYW5kbGVNZXRob2RJbnZvY2F0aW9uKG5vZGUsIHJlY2VpdmVyVHlwZSwgYXJndW1lbnRUeXBlcywgcmV0dXJuVHlwZSk7CiAgICByZXR1cm4gcmV0dXJuVHlwZTsKICB9CgogIHZvaWQgaGFuZGxlVmFyaWFibGVHZXQoaXIuVmFyaWFibGVHZXQgbm9kZSwgaXIuRGFydFR5cGUgdHlwZSkge30KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRWYXJpYWJsZUdldChpci5WYXJpYWJsZUdldCBub2RlKSB7CiAgICBpZiAodHlwZU1hcHNGb3JUZXN0aW5nICE9IG51bGwpIHsKICAgICAgdHlwZU1hcHNGb3JUZXN0aW5nW25vZGVdID0gdHlwZU1hcDsKICAgIH0KICAgIGlyLkRhcnRUeXBlIHByb21vdGVkVHlwZSA9IHR5cGVNYXAudHlwZU9mKG5vZGUsIHR5cGVFbnZpcm9ubWVudCk7CiAgICBhc3NlcnQoCiAgICAgICAgbm9kZS5wcm9tb3RlZFR5cGUgPT0gbnVsbCB8fAogICAgICAgICAgICBwcm9tb3RlZFR5cGUgPT0gdHlwZUVudmlyb25tZW50Lm51bGxUeXBlIHx8CiAgICAgICAgICAgIHR5cGVFbnZpcm9ubWVudC5pc1N1YnR5cGVPZihwcm9tb3RlZFR5cGUsIG5vZGUucHJvbW90ZWRUeXBlKSwKICAgICAgICAiVW5leHBlY3RlZCBwcm9tb3Rpb24gb2YgJHtub2RlLnZhcmlhYmxlfSBpbiAke25vZGUucGFyZW50fS4gIgogICAgICAgICJFeHBlY3RlZCAke25vZGUucHJvbW90ZWRUeXBlfSwgZm91bmQgJHByb21vdGVkVHlwZSIpOwogICAgX2NhY2hlW25vZGVdID0gcHJvbW90ZWRUeXBlOwogICAgaGFuZGxlVmFyaWFibGVHZXQobm9kZSwgcHJvbW90ZWRUeXBlKTsKICAgIHJldHVybiBwcm9tb3RlZFR5cGU7CiAgfQoKICB2b2lkIGhhbmRsZVZhcmlhYmxlU2V0KGlyLlZhcmlhYmxlU2V0IG5vZGUsIGlyLkRhcnRUeXBlIHJlc3VsdFR5cGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0VmFyaWFibGVTZXQoaXIuVmFyaWFibGVTZXQgbm9kZSkgewogICAgaXIuRGFydFR5cGUgcmVzdWx0VHlwZSA9IHN1cGVyLnZpc2l0VmFyaWFibGVTZXQobm9kZSk7CiAgICBoYW5kbGVWYXJpYWJsZVNldChub2RlLCByZXN1bHRUeXBlKTsKICAgIGlmICghX2N1cnJlbnRWYXJpYWJsZXMuY29udGFpbnMobm9kZS52YXJpYWJsZSkpIHsKICAgICAgX2ludmFsaWRhdGVkVmFyaWFibGVzLmFkZChub2RlLnZhcmlhYmxlKTsKICAgICAgdHlwZU1hcCA9IHR5cGVNYXAucmVtb3ZlKFtub2RlLnZhcmlhYmxlXSk7CiAgICB9IGVsc2UgewogICAgICB0eXBlTWFwID0gdHlwZU1hcC5yZWR1Y2Uobm9kZSwgcmVzdWx0VHlwZSwgdHlwZUVudmlyb25tZW50KTsKICAgIH0KICAgIHJldHVybiByZXN1bHRUeXBlOwogIH0KCiAgdm9pZCBoYW5kbGVTdGF0aWNHZXQoaXIuU3RhdGljR2V0IG5vZGUsIGlyLkRhcnRUeXBlIHJlc3VsdFR5cGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0U3RhdGljR2V0KGlyLlN0YXRpY0dldCBub2RlKSB7CiAgICBpci5EYXJ0VHlwZSByZXN1bHRUeXBlID0gc3VwZXIudmlzaXRTdGF0aWNHZXQobm9kZSk7CiAgICBoYW5kbGVTdGF0aWNHZXQobm9kZSwgcmVzdWx0VHlwZSk7CiAgICByZXR1cm4gcmVzdWx0VHlwZTsKICB9CgogIHZvaWQgaGFuZGxlU3RhdGljU2V0KGlyLlN0YXRpY1NldCBub2RlLCBpci5EYXJ0VHlwZSB2YWx1ZVR5cGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0U3RhdGljU2V0KGlyLlN0YXRpY1NldCBub2RlKSB7CiAgICBpci5EYXJ0VHlwZSB2YWx1ZVR5cGUgPSBzdXBlci52aXNpdFN0YXRpY1NldChub2RlKTsKICAgIGhhbmRsZVN0YXRpY1NldChub2RlLCB2YWx1ZVR5cGUpOwogICAgcmV0dXJuIHZhbHVlVHlwZTsKICB9CgogIHZvaWQgaGFuZGxlU3RhdGljSW52b2NhdGlvbihpci5TdGF0aWNJbnZvY2F0aW9uIG5vZGUsCiAgICAgIEFyZ3VtZW50VHlwZXMgYXJndW1lbnRUeXBlcywgaXIuRGFydFR5cGUgcmV0dXJuVHlwZSkge30KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKGlyLlN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgQXJndW1lbnRUeXBlcyBhcmd1bWVudFR5cGVzID0gX3Zpc2l0QXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKTsKICAgIGlyLkRhcnRUeXBlIHJldHVyblR5cGUgPSBpci5TdWJzdGl0dXRpb24uZnJvbVBhaXJzKAogICAgICAgICAgICBub2RlLnRhcmdldC5mdW5jdGlvbi50eXBlUGFyYW1ldGVycywgbm9kZS5hcmd1bWVudHMudHlwZXMpCiAgICAgICAgLnN1YnN0aXR1dGVUeXBlKG5vZGUudGFyZ2V0LmZ1bmN0aW9uLnJldHVyblR5cGUpOwogICAgX2NhY2hlW25vZGVdID0gcmV0dXJuVHlwZTsKICAgIGhhbmRsZVN0YXRpY0ludm9jYXRpb24obm9kZSwgYXJndW1lbnRUeXBlcywgcmV0dXJuVHlwZSk7CiAgICByZXR1cm4gcmV0dXJuVHlwZTsKICB9CgogIHZvaWQgaGFuZGxlQ29uc3RydWN0b3JJbnZvY2F0aW9uKGlyLkNvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlLAogICAgICBBcmd1bWVudFR5cGVzIGFyZ3VtZW50VHlwZXMsIGlyLkRhcnRUeXBlIHJlc3VsdFR5cGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKGlyLkNvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7CiAgICBBcmd1bWVudFR5cGVzIGFyZ3VtZW50VHlwZXMgPSBfdmlzaXRBcmd1bWVudHMobm9kZS5hcmd1bWVudHMpOwogICAgaXIuRGFydFR5cGUgcmVzdWx0VHlwZSA9IG5vZGUuYXJndW1lbnRzLnR5cGVzLmlzRW1wdHkKICAgICAgICA/IG5ldyBFeGFjdEludGVyZmFjZVR5cGUuZnJvbShub2RlLnRhcmdldC5lbmNsb3NpbmdDbGFzcy5yYXdUeXBlKQogICAgICAgIDogbmV3IEV4YWN0SW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgbm9kZS50YXJnZXQuZW5jbG9zaW5nQ2xhc3MsIG5vZGUuYXJndW1lbnRzLnR5cGVzKTsKICAgIF9jYWNoZVtub2RlXSA9IHJlc3VsdFR5cGU7CiAgICBoYW5kbGVDb25zdHJ1Y3Rvckludm9jYXRpb24obm9kZSwgYXJndW1lbnRUeXBlcywgcmVzdWx0VHlwZSk7CiAgICByZXR1cm4gcmVzdWx0VHlwZTsKICB9CgogIHZvaWQgaGFuZGxlU3VwZXJQcm9wZXJ0eUdldCgKICAgICAgaXIuU3VwZXJQcm9wZXJ0eUdldCBub2RlLCBpci5EYXJ0VHlwZSByZXN1bHRUeXBlKSB7fQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFN1cGVyUHJvcGVydHlHZXQoaXIuU3VwZXJQcm9wZXJ0eUdldCBub2RlKSB7CiAgICBpci5EYXJ0VHlwZSByZXN1bHRUeXBlOwogICAgaWYgKG5vZGUuaW50ZXJmYWNlVGFyZ2V0ID09IG51bGwpIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVzb2x2ZSBhbmQgc2V0IHRoZSB0YXJnZXQgaGVyZS4KICAgICAgcmVzdWx0VHlwZSA9IGNvbnN0IGlyLkR5bmFtaWNUeXBlKCk7CiAgICB9IGVsc2UgewogICAgICBpci5DbGFzcyBkZWNsYXJpbmdDbGFzcyA9IG5vZGUuaW50ZXJmYWNlVGFyZ2V0LmVuY2xvc2luZ0NsYXNzOwogICAgICBpZiAoZGVjbGFyaW5nQ2xhc3MudHlwZVBhcmFtZXRlcnMuaXNFbXB0eSkgewogICAgICAgIHJlc3VsdFR5cGUgPSBub2RlLmludGVyZmFjZVRhcmdldC5nZXR0ZXJUeXBlOwogICAgICB9IGVsc2UgewogICAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyID0KICAgICAgICAgICAgdHlwZUVudmlyb25tZW50LmdldFR5cGVBc0luc3RhbmNlT2YodGhpc1R5cGUsIGRlY2xhcmluZ0NsYXNzKTsKICAgICAgICByZXN1bHRUeXBlID0gaXIuU3Vic3RpdHV0aW9uLmZyb21JbnRlcmZhY2VUeXBlKHJlY2VpdmVyKQogICAgICAgICAgICAuc3Vic3RpdHV0ZVR5cGUobm9kZS5pbnRlcmZhY2VUYXJnZXQuZ2V0dGVyVHlwZSk7CiAgICAgIH0KICAgIH0KICAgIF9jYWNoZVtub2RlXSA9IHJlc3VsdFR5cGU7CiAgICBoYW5kbGVTdXBlclByb3BlcnR5R2V0KG5vZGUsIHJlc3VsdFR5cGUpOwogICAgcmV0dXJuIHJlc3VsdFR5cGU7CiAgfQoKICB2b2lkIGhhbmRsZVN1cGVyUHJvcGVydHlTZXQoCiAgICAgIGlyLlN1cGVyUHJvcGVydHlTZXQgbm9kZSwgaXIuRGFydFR5cGUgdmFsdWVUeXBlKSB7fQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFN1cGVyUHJvcGVydHlTZXQoaXIuU3VwZXJQcm9wZXJ0eVNldCBub2RlKSB7CiAgICBpci5EYXJ0VHlwZSB2YWx1ZVR5cGUgPSBzdXBlci52aXNpdFN1cGVyUHJvcGVydHlTZXQobm9kZSk7CiAgICBoYW5kbGVTdXBlclByb3BlcnR5U2V0KG5vZGUsIHZhbHVlVHlwZSk7CiAgICByZXR1cm4gdmFsdWVUeXBlOwogIH0KCiAgdm9pZCBoYW5kbGVTdXBlck1ldGhvZEludm9jYXRpb24oaXIuU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUsCiAgICAgIEFyZ3VtZW50VHlwZXMgYXJndW1lbnRUeXBlcywgaXIuRGFydFR5cGUgcmV0dXJuVHlwZSkge30KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRTdXBlck1ldGhvZEludm9jYXRpb24oaXIuU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIEFyZ3VtZW50VHlwZXMgYXJndW1lbnRUeXBlcyA9IF92aXNpdEFyZ3VtZW50cyhub2RlLmFyZ3VtZW50cyk7CiAgICBpci5EYXJ0VHlwZSByZXR1cm5UeXBlOwogICAgaWYgKG5vZGUuaW50ZXJmYWNlVGFyZ2V0ID09IG51bGwpIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVzb2x2ZSBhbmQgc2V0IHRoZSB0YXJnZXQgaGVyZS4KICAgICAgcmV0dXJuVHlwZSA9IGNvbnN0IGlyLkR5bmFtaWNUeXBlKCk7CiAgICB9IGVsc2UgewogICAgICBpci5DbGFzcyBzdXBlcmNsYXNzID0gbm9kZS5pbnRlcmZhY2VUYXJnZXQuZW5jbG9zaW5nQ2xhc3M7CiAgICAgIGlyLkludGVyZmFjZVR5cGUgcmVjZWl2ZXJUeXBlID0KICAgICAgICAgIHR5cGVFbnZpcm9ubWVudC5nZXRUeXBlQXNJbnN0YW5jZU9mKHRoaXNUeXBlLCBzdXBlcmNsYXNzKTsKICAgICAgcmV0dXJuVHlwZSA9IGlyLlN1YnN0aXR1dGlvbi5mcm9tSW50ZXJmYWNlVHlwZShyZWNlaXZlclR5cGUpCiAgICAgICAgICAuc3Vic3RpdHV0ZVR5cGUobm9kZS5pbnRlcmZhY2VUYXJnZXQuZnVuY3Rpb24ucmV0dXJuVHlwZSk7CiAgICAgIHJldHVyblR5cGUgPSBpci5TdWJzdGl0dXRpb24uZnJvbVBhaXJzKAogICAgICAgICAgICAgIG5vZGUuaW50ZXJmYWNlVGFyZ2V0LmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgICAgICAgIG5vZGUuYXJndW1lbnRzLnR5cGVzKQogICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHJldHVyblR5cGUpOwogICAgfQogICAgX2NhY2hlW25vZGVdID0gcmV0dXJuVHlwZTsKICAgIGhhbmRsZVN1cGVyTWV0aG9kSW52b2NhdGlvbihub2RlLCBhcmd1bWVudFR5cGVzLCByZXR1cm5UeXBlKTsKICAgIHJldHVybiByZXR1cm5UeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRMb2dpY2FsRXhwcmVzc2lvbihpci5Mb2dpY2FsRXhwcmVzc2lvbiBub2RlKSB7CiAgICBpZiAobm9kZS5vcGVyYXRvciA9PSAnJiYnKSB7CiAgICAgIHZpc2l0Tm9kZShub2RlLmxlZnQpOwogICAgICBUeXBlTWFwIGFmdGVyTGVmdFdoZW5UcnVlID0gdHlwZU1hcFdoZW5UcnVlOwogICAgICBUeXBlTWFwIGFmdGVyTGVmdFdoZW5GYWxzZSA9IHR5cGVNYXBXaGVuRmFsc2U7CiAgICAgIHR5cGVNYXAgPSBhZnRlckxlZnRXaGVuVHJ1ZTsKICAgICAgdmlzaXROb2RlKG5vZGUucmlnaHQpOwogICAgICBUeXBlTWFwIGFmdGVyUmlnaHRXaGVuVHJ1ZSA9IHR5cGVNYXBXaGVuVHJ1ZTsKICAgICAgVHlwZU1hcCBhZnRlclJpZ2h0V2hlbkZhbHNlID0gdHlwZU1hcFdoZW5GYWxzZTsKICAgICAgdHlwZU1hcFdoZW5UcnVlID0gYWZ0ZXJSaWdodFdoZW5UcnVlOwogICAgICB0eXBlTWFwV2hlbkZhbHNlID0gYWZ0ZXJMZWZ0V2hlbkZhbHNlLmpvaW4oYWZ0ZXJSaWdodFdoZW5GYWxzZSk7CiAgICB9IGVsc2UgewogICAgICB2aXNpdE5vZGUobm9kZS5sZWZ0KTsKICAgICAgVHlwZU1hcCBhZnRlckxlZnRXaGVuVHJ1ZSA9IHR5cGVNYXBXaGVuVHJ1ZTsKICAgICAgVHlwZU1hcCBhZnRlckxlZnRXaGVuRmFsc2UgPSB0eXBlTWFwV2hlbkZhbHNlOwogICAgICB0eXBlTWFwID0gYWZ0ZXJMZWZ0V2hlbkZhbHNlOwogICAgICB2aXNpdE5vZGUobm9kZS5yaWdodCk7CiAgICAgIFR5cGVNYXAgYWZ0ZXJSaWdodFdoZW5UcnVlID0gdHlwZU1hcFdoZW5UcnVlOwogICAgICBUeXBlTWFwIGFmdGVyUmlnaHRXaGVuRmFsc2UgPSB0eXBlTWFwV2hlbkZhbHNlOwogICAgICB0eXBlTWFwV2hlblRydWUgPSBhZnRlckxlZnRXaGVuVHJ1ZS5qb2luKGFmdGVyUmlnaHRXaGVuVHJ1ZSk7CiAgICAgIHR5cGVNYXBXaGVuRmFsc2UgPSBhZnRlclJpZ2h0V2hlbkZhbHNlOwogICAgfQogICAgcmV0dXJuIHN1cGVyLnZpc2l0TG9naWNhbEV4cHJlc3Npb24obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdE5vdChpci5Ob3Qgbm9kZSkgewogICAgdmlzaXROb2RlKG5vZGUub3BlcmFuZCk7CiAgICBUeXBlTWFwIGFmdGVyT3BlcmFuZFdoZW5UcnVlID0gdHlwZU1hcFdoZW5UcnVlOwogICAgVHlwZU1hcCBhZnRlck9wZXJhbmRXaGVuRmFsc2UgPSB0eXBlTWFwV2hlbkZhbHNlOwogICAgdHlwZU1hcFdoZW5UcnVlID0gYWZ0ZXJPcGVyYW5kV2hlbkZhbHNlOwogICAgdHlwZU1hcFdoZW5GYWxzZSA9IGFmdGVyT3BlcmFuZFdoZW5UcnVlOwogICAgcmV0dXJuIHN1cGVyLnZpc2l0Tm90KG5vZGUpOwogIH0KCiAgaXIuRGFydFR5cGUgX2hhbmRsZUNvbmRpdGlvbmFsKAogICAgICBpci5FeHByZXNzaW9uIGNvbmRpdGlvbiwgaXIuVHJlZU5vZGUgdGhlbiwgaXIuVHJlZU5vZGUgb3RoZXJ3aXNlKSB7CiAgICB2aXNpdE5vZGUoY29uZGl0aW9uKTsKICAgIFR5cGVNYXAgYWZ0ZXJDb25kaXRpb25XaGVuVHJ1ZSA9IHR5cGVNYXBXaGVuVHJ1ZTsKICAgIFR5cGVNYXAgYWZ0ZXJDb25kaXRpb25XaGVuRmFsc2UgPSB0eXBlTWFwV2hlbkZhbHNlOwogICAgdHlwZU1hcCA9IGFmdGVyQ29uZGl0aW9uV2hlblRydWU7CiAgICBpci5EYXJ0VHlwZSB0aGVuVHlwZSA9IHZpc2l0Tm9kZSh0aGVuKTsKICAgIFR5cGVNYXAgYWZ0ZXJUaGVuID0gdHlwZU1hcDsKICAgIHR5cGVNYXAgPSBhZnRlckNvbmRpdGlvbldoZW5GYWxzZTsKICAgIGlyLkRhcnRUeXBlIG90aGVyd2lzZVR5cGUgPSB2aXNpdE5vZGUob3RoZXJ3aXNlKTsKICAgIFR5cGVNYXAgYWZ0ZXJPdGhlcndpc2UgPSB0eXBlTWFwOwogICAgaWYgKGNvbXBsZXRlcyh0aGVuVHlwZSkgJiYgY29tcGxldGVzKG90aGVyd2lzZVR5cGUpKSB7CiAgICAgIHR5cGVNYXAgPSBhZnRlclRoZW4uam9pbihhZnRlck90aGVyd2lzZSk7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIGlmIChjb21wbGV0ZXModGhlblR5cGUpKSB7CiAgICAgIHR5cGVNYXAgPSBhZnRlclRoZW47CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIGlmIChjb21wbGV0ZXMob3RoZXJ3aXNlVHlwZSkpIHsKICAgICAgdHlwZU1hcCA9IGFmdGVyT3RoZXJ3aXNlOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHR5cGVNYXAgPSBhZnRlclRoZW4uam9pbihhZnRlck90aGVyd2lzZSk7CiAgICAgIHJldHVybiBjb25zdCBEb2VzTm90Q29tcGxldGVUeXBlKCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdENvbmRpdGlvbmFsRXhwcmVzc2lvbihpci5Db25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU2hvdWxkIHdlIHJldHVybiBgY29uc3QgRG9lc05vdENvbXBsZXRlVHlwZSgpYCBpZgogICAgLy8gYm90aCBicmFuY2hlcyBhcmUgZmFpbGluZz8KICAgIF9oYW5kbGVDb25kaXRpb25hbChub2RlLmNvbmRpdGlvbiwgbm9kZS50aGVuLCBub2RlLm90aGVyd2lzZSk7CiAgICByZXR1cm4gc3VwZXIudmlzaXRDb25kaXRpb25hbEV4cHJlc3Npb24obm9kZSk7CiAgfQoKICB2b2lkIGhhbmRsZUlzRXhwcmVzc2lvbihpci5Jc0V4cHJlc3Npb24gbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRJc0V4cHJlc3Npb24oaXIuSXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIGlyLkV4cHJlc3Npb24gb3BlcmFuZCA9IG5vZGUub3BlcmFuZDsKICAgIHZpc2l0Tm9kZShvcGVyYW5kKTsKICAgIGlmIChvcGVyYW5kIGlzIGlyLlZhcmlhYmxlR2V0ICYmCiAgICAgICAgIV9pbnZhbGlkYXRlZFZhcmlhYmxlcy5jb250YWlucyhvcGVyYW5kLnZhcmlhYmxlKSkgewogICAgICBUeXBlTWFwIGFmdGVyT3BlcmFuZCA9IHR5cGVNYXA7CiAgICAgIHR5cGVNYXBXaGVuVHJ1ZSA9CiAgICAgICAgICBhZnRlck9wZXJhbmQucHJvbW90ZShvcGVyYW5kLnZhcmlhYmxlLCBub2RlLnR5cGUsIGlzVHJ1ZTogdHJ1ZSk7CiAgICAgIHR5cGVNYXBXaGVuRmFsc2UgPQogICAgICAgICAgYWZ0ZXJPcGVyYW5kLnByb21vdGUob3BlcmFuZC52YXJpYWJsZSwgbm9kZS50eXBlLCBpc1RydWU6IGZhbHNlKTsKICAgIH0KICAgIGhhbmRsZUlzRXhwcmVzc2lvbihub2RlKTsKICAgIHJldHVybiBzdXBlci52aXNpdElzRXhwcmVzc2lvbihub2RlKTsKICB9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0TGV0KGlyLkxldCBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS52YXJpYWJsZS5pbml0aWFsaXplcik7CiAgICByZXR1cm4gc3VwZXIudmlzaXRMZXQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdEJsb2NrRXhwcmVzc2lvbihpci5CbG9ja0V4cHJlc3Npb24gbm9kZSkgewogICAgdmlzaXROb2RlKG5vZGUuYm9keSk7CiAgICByZXR1cm4gc3VwZXIudmlzaXRCbG9ja0V4cHJlc3Npb24obm9kZSk7CiAgfQoKICBpci5EYXJ0VHlwZSBfY29tcHV0ZUluc3RhbnRpYXRpb25UeXBlKAogICAgICBpci5JbnN0YW50aWF0aW9uIG5vZGUsIGlyLkZ1bmN0aW9uVHlwZSBleHByZXNzaW9uVHlwZSkgewogICAgcmV0dXJuIGlyLlN1YnN0aXR1dGlvbi5mcm9tUGFpcnMoCiAgICAgICAgICAgIGV4cHJlc3Npb25UeXBlLnR5cGVQYXJhbWV0ZXJzLCBub2RlLnR5cGVBcmd1bWVudHMpCiAgICAgICAgLnN1YnN0aXR1dGVUeXBlKGV4cHJlc3Npb25UeXBlLndpdGhvdXRUeXBlUGFyYW1ldGVycyk7CiAgfQoKICB2b2lkIGhhbmRsZUluc3RhbnRpYXRpb24oaXIuSW5zdGFudGlhdGlvbiBub2RlLAogICAgICBpci5GdW5jdGlvblR5cGUgZXhwcmVzc2lvblR5cGUsIGlyLkRhcnRUeXBlIHJlc3VsdFR5cGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0SW5zdGFudGlhdGlvbihpci5JbnN0YW50aWF0aW9uIG5vZGUpIHsKICAgIGlyLkZ1bmN0aW9uVHlwZSBleHByZXNzaW9uVHlwZSA9IHZpc2l0Tm9kZShub2RlLmV4cHJlc3Npb24pOwogICAgaXIuRGFydFR5cGUgcmVzdWx0VHlwZSA9IF9jb21wdXRlSW5zdGFudGlhdGlvblR5cGUobm9kZSwgZXhwcmVzc2lvblR5cGUpOwogICAgX2NhY2hlW25vZGVdID0gcmVzdWx0VHlwZTsKICAgIGhhbmRsZUluc3RhbnRpYXRpb24obm9kZSwgZXhwcmVzc2lvblR5cGUsIHJlc3VsdFR5cGUpOwogICAgcmV0dXJuIHJlc3VsdFR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdEJsb2NrKGlyLkJsb2NrIG5vZGUpIHsKICAgIGFzc2VydChfcGVuZGluZ1J1bnRpbWVUeXBlVXNlRGF0YS5pc0VtcHR5KTsKICAgIGlyLkRhcnRUeXBlIHR5cGU7CiAgICBmb3IgKGlyLlN0YXRlbWVudCBzdGF0ZW1lbnQgaW4gbm9kZS5zdGF0ZW1lbnRzKSB7CiAgICAgIGlmICghY29tcGxldGVzKHZpc2l0Tm9kZShzdGF0ZW1lbnQpKSkgewogICAgICAgIHR5cGUgPSBjb25zdCBEb2VzTm90Q29tcGxldGVUeXBlKCk7CiAgICAgIH0KICAgIH0KICAgIGFzc2VydChfcGVuZGluZ1J1bnRpbWVUeXBlVXNlRGF0YS5pc0VtcHR5LAogICAgICAgICJJbmNvbXBsZXRlIFJ1bnRpbWVUeXBlVXNlRGF0YTogJF9wZW5kaW5nUnVudGltZVR5cGVVc2VEYXRhIik7CiAgICByZXR1cm4gdHlwZTsKICB9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChpci5FeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLmV4cHJlc3Npb24pOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIGhhbmRsZUFzRXhwcmVzc2lvbihpci5Bc0V4cHJlc3Npb24gbm9kZSwgaXIuRGFydFR5cGUgb3BlcmFuZFR5cGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0QXNFeHByZXNzaW9uKGlyLkFzRXhwcmVzc2lvbiBub2RlKSB7CiAgICBpci5EYXJ0VHlwZSBvcGVyYW5kVHlwZSA9IHZpc2l0Tm9kZShub2RlLm9wZXJhbmQpOwogICAgaGFuZGxlQXNFeHByZXNzaW9uKG5vZGUsIG9wZXJhbmRUeXBlKTsKICAgIHJldHVybiBzdXBlci52aXNpdEFzRXhwcmVzc2lvbihub2RlKTsKICB9CgogIHZvaWQgaGFuZGxlU3RyaW5nQ29uY2F0ZW5hdGlvbihpci5TdHJpbmdDb25jYXRlbmF0aW9uIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0U3RyaW5nQ29uY2F0ZW5hdGlvbihpci5TdHJpbmdDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIHZpc2l0Tm9kZXMobm9kZS5leHByZXNzaW9ucyk7CiAgICBoYW5kbGVTdHJpbmdDb25jYXRlbmF0aW9uKG5vZGUpOwogICAgcmV0dXJuIHN1cGVyLnZpc2l0U3RyaW5nQ29uY2F0ZW5hdGlvbihub2RlKTsKICB9CgogIHZvaWQgaGFuZGxlSW50TGl0ZXJhbChpci5JbnRMaXRlcmFsIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0SW50TGl0ZXJhbChpci5JbnRMaXRlcmFsIG5vZGUpIHsKICAgIGhhbmRsZUludExpdGVyYWwobm9kZSk7CiAgICByZXR1cm4gc3VwZXIudmlzaXRJbnRMaXRlcmFsKG5vZGUpOwogIH0KCiAgdm9pZCBoYW5kbGVEb3VibGVMaXRlcmFsKGlyLkRvdWJsZUxpdGVyYWwgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXREb3VibGVMaXRlcmFsKGlyLkRvdWJsZUxpdGVyYWwgbm9kZSkgewogICAgaGFuZGxlRG91YmxlTGl0ZXJhbChub2RlKTsKICAgIHJldHVybiBzdXBlci52aXNpdERvdWJsZUxpdGVyYWwobm9kZSk7CiAgfQoKICB2b2lkIGhhbmRsZUJvb2xMaXRlcmFsKGlyLkJvb2xMaXRlcmFsIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0Qm9vbExpdGVyYWwoaXIuQm9vbExpdGVyYWwgbm9kZSkgewogICAgaGFuZGxlQm9vbExpdGVyYWwobm9kZSk7CiAgICByZXR1cm4gc3VwZXIudmlzaXRCb29sTGl0ZXJhbChub2RlKTsKICB9CgogIHZvaWQgaGFuZGxlU3RyaW5nTGl0ZXJhbChpci5TdHJpbmdMaXRlcmFsIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0U3RyaW5nTGl0ZXJhbChpci5TdHJpbmdMaXRlcmFsIG5vZGUpIHsKICAgIGhhbmRsZVN0cmluZ0xpdGVyYWwobm9kZSk7CiAgICByZXR1cm4gc3VwZXIudmlzaXRTdHJpbmdMaXRlcmFsKG5vZGUpOwogIH0KCiAgdm9pZCBoYW5kbGVTeW1ib2xMaXRlcmFsKGlyLlN5bWJvbExpdGVyYWwgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRTeW1ib2xMaXRlcmFsKGlyLlN5bWJvbExpdGVyYWwgbm9kZSkgewogICAgaGFuZGxlU3ltYm9sTGl0ZXJhbChub2RlKTsKICAgIHJldHVybiBzdXBlci52aXNpdFN5bWJvbExpdGVyYWwobm9kZSk7CiAgfQoKICB2b2lkIGhhbmRsZU51bGxMaXRlcmFsKGlyLk51bGxMaXRlcmFsIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0TnVsbExpdGVyYWwoaXIuTnVsbExpdGVyYWwgbm9kZSkgewogICAgaGFuZGxlTnVsbExpdGVyYWwobm9kZSk7CiAgICByZXR1cm4gc3VwZXIudmlzaXROdWxsTGl0ZXJhbChub2RlKTsKICB9CgogIHZvaWQgaGFuZGxlTGlzdExpdGVyYWwoaXIuTGlzdExpdGVyYWwgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRMaXN0TGl0ZXJhbChpci5MaXN0TGl0ZXJhbCBub2RlKSB7CiAgICB2aXNpdE5vZGVzKG5vZGUuZXhwcmVzc2lvbnMpOwogICAgaGFuZGxlTGlzdExpdGVyYWwobm9kZSk7CiAgICByZXR1cm4gc3VwZXIudmlzaXRMaXN0TGl0ZXJhbChub2RlKTsKICB9CgogIHZvaWQgaGFuZGxlU2V0TGl0ZXJhbChpci5TZXRMaXRlcmFsIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0U2V0TGl0ZXJhbChpci5TZXRMaXRlcmFsIG5vZGUpIHsKICAgIHZpc2l0Tm9kZXMobm9kZS5leHByZXNzaW9ucyk7CiAgICBoYW5kbGVTZXRMaXRlcmFsKG5vZGUpOwogICAgcmV0dXJuIHN1cGVyLnZpc2l0U2V0TGl0ZXJhbChub2RlKTsKICB9CgogIHZvaWQgaGFuZGxlTWFwTGl0ZXJhbChpci5NYXBMaXRlcmFsIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0TWFwTGl0ZXJhbChpci5NYXBMaXRlcmFsIG5vZGUpIHsKICAgIHZpc2l0Tm9kZXMobm9kZS5lbnRyaWVzKTsKICAgIGhhbmRsZU1hcExpdGVyYWwobm9kZSk7CiAgICByZXR1cm4gc3VwZXIudmlzaXRNYXBMaXRlcmFsKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgTnVsbCB2aXNpdE1hcEVudHJ5KGlyLk1hcEVudHJ5IGVudHJ5KSB7CiAgICB2aXNpdE5vZGUoZW50cnkua2V5KTsKICAgIHZpc2l0Tm9kZShlbnRyeS52YWx1ZSk7CiAgfQoKICB2b2lkIGhhbmRsZUZ1bmN0aW9uRXhwcmVzc2lvbihpci5GdW5jdGlvbkV4cHJlc3Npb24gbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oaXIuRnVuY3Rpb25FeHByZXNzaW9uIG5vZGUpIHsKICAgIGlyLkRhcnRUeXBlIHJldHVyblR5cGUgPSBzdXBlci52aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbihub2RlKTsKICAgIFNldDxpci5WYXJpYWJsZURlY2xhcmF0aW9uPiBfb2xkVmFyaWFibGVzID0gX2N1cnJlbnRWYXJpYWJsZXM7CiAgICBfY3VycmVudFZhcmlhYmxlcyA9IG5ldyBTZXQ8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4oKTsKICAgIHZpc2l0U2lnbmF0dXJlKG5vZGUuZnVuY3Rpb24pOwogICAgdmlzaXROb2RlKG5vZGUuZnVuY3Rpb24uYm9keSk7CiAgICBoYW5kbGVGdW5jdGlvbkV4cHJlc3Npb24obm9kZSk7CiAgICBfaW52YWxpZGF0ZWRWYXJpYWJsZXMucmVtb3ZlQWxsKF9jdXJyZW50VmFyaWFibGVzKTsKICAgIF9jdXJyZW50VmFyaWFibGVzID0gX29sZFZhcmlhYmxlczsKICAgIHJldHVybiByZXR1cm5UeXBlOwogIH0KCiAgdm9pZCBoYW5kbGVUaHJvdyhpci5UaHJvdyBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFRocm93KGlyLlRocm93IG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLmV4cHJlc3Npb24pOwogICAgaGFuZGxlVGhyb3cobm9kZSk7CiAgICByZXR1cm4gc3VwZXIudmlzaXRUaHJvdyhub2RlKTsKICB9CgogIEBvdmVycmlkZQogIE51bGwgdmlzaXRTd2l0Y2hDYXNlKGlyLlN3aXRjaENhc2Ugbm9kZSkgewogICAgdmlzaXROb2Rlcyhub2RlLmV4cHJlc3Npb25zKTsKICAgIHZpc2l0Tm9kZShub2RlLmJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRDb250aW51ZVN3aXRjaFN0YXRlbWVudChpci5Db250aW51ZVN3aXRjaFN0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gY29uc3QgRG9lc05vdENvbXBsZXRlVHlwZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgTnVsbCB2aXNpdExhYmVsZWRTdGF0ZW1lbnQoaXIuTGFiZWxlZFN0YXRlbWVudCBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS5ib2R5KTsKICB9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0QnJlYWtTdGF0ZW1lbnQoaXIuQnJlYWtTdGF0ZW1lbnQgbm9kZSkgewogICAgcmV0dXJuIGNvbnN0IERvZXNOb3RDb21wbGV0ZVR5cGUoKTsKICB9CgogIEBvdmVycmlkZQogIE51bGwgdmlzaXRZaWVsZFN0YXRlbWVudChpci5ZaWVsZFN0YXRlbWVudCBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS5leHByZXNzaW9uKTsKICB9CgogIEBvdmVycmlkZQogIE51bGwgdmlzaXRBc3NlcnRJbml0aWFsaXplcihpci5Bc3NlcnRJbml0aWFsaXplciBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS5zdGF0ZW1lbnQpOwogIH0KCiAgdm9pZCBoYW5kbGVGaWVsZEluaXRpYWxpemVyKGlyLkZpZWxkSW5pdGlhbGl6ZXIgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgTnVsbCB2aXNpdEZpZWxkSW5pdGlhbGl6ZXIoaXIuRmllbGRJbml0aWFsaXplciBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS52YWx1ZSk7CiAgICBoYW5kbGVGaWVsZEluaXRpYWxpemVyKG5vZGUpOwogIH0KCiAgdm9pZCBoYW5kbGVSZWRpcmVjdGluZ0luaXRpYWxpemVyKAogICAgICBpci5SZWRpcmVjdGluZ0luaXRpYWxpemVyIG5vZGUsIEFyZ3VtZW50VHlwZXMgYXJndW1lbnRUeXBlcykge30KCiAgQG92ZXJyaWRlCiAgTnVsbCB2aXNpdFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIoaXIuUmVkaXJlY3RpbmdJbml0aWFsaXplciBub2RlKSB7CiAgICBBcmd1bWVudFR5cGVzIGFyZ3VtZW50VHlwZXMgPSBfdmlzaXRBcmd1bWVudHMobm9kZS5hcmd1bWVudHMpOwogICAgaGFuZGxlUmVkaXJlY3RpbmdJbml0aWFsaXplcihub2RlLCBhcmd1bWVudFR5cGVzKTsKICB9CgogIHZvaWQgaGFuZGxlU3VwZXJJbml0aWFsaXplcigKICAgICAgaXIuU3VwZXJJbml0aWFsaXplciBub2RlLCBBcmd1bWVudFR5cGVzIGFyZ3VtZW50VHlwZXMpIHt9CgogIEBvdmVycmlkZQogIE51bGwgdmlzaXRTdXBlckluaXRpYWxpemVyKGlyLlN1cGVySW5pdGlhbGl6ZXIgbm9kZSkgewogICAgQXJndW1lbnRUeXBlcyBhcmd1bWVudFR5cGVzID0gX3Zpc2l0QXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKTsKICAgIGhhbmRsZVN1cGVySW5pdGlhbGl6ZXIobm9kZSwgYXJndW1lbnRUeXBlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBOdWxsIHZpc2l0TG9jYWxJbml0aWFsaXplcihpci5Mb2NhbEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLnZhcmlhYmxlKTsKICB9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0TmFtZWRFeHByZXNzaW9uKGlyLk5hbWVkRXhwcmVzc2lvbiBub2RlKSA9PgogICAgICB2aXNpdE5vZGUobm9kZS52YWx1ZSk7CgogIEBvdmVycmlkZQogIE51bGwgdmlzaXRFbXB0eVN0YXRlbWVudChpci5FbXB0eVN0YXRlbWVudCBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICBOdWxsIHZpc2l0Rm9yU3RhdGVtZW50KGlyLkZvclN0YXRlbWVudCBub2RlKSB7CiAgICB2aXNpdE5vZGVzKG5vZGUudmFyaWFibGVzKTsKICAgIFR5cGVNYXAgYmVmb3JlTG9vcCA9IHR5cGVNYXAgPQogICAgICAgIHR5cGVNYXAucmVtb3ZlKHZhcmlhYmxlU2NvcGVNb2RlbC5nZXRTY29wZUZvcihub2RlKS5hc3NpZ25lZFZhcmlhYmxlcyk7CiAgICB2aXNpdE5vZGUobm9kZS5jb25kaXRpb24pOwogICAgdHlwZU1hcCA9IHR5cGVNYXBXaGVuVHJ1ZTsKICAgIHZpc2l0Tm9kZShub2RlLmJvZHkpOwogICAgdmlzaXROb2Rlcyhub2RlLnVwZGF0ZXMpOwogICAgdHlwZU1hcCA9IGJlZm9yZUxvb3A7CiAgfQoKICB2b2lkIGhhbmRsZUZvckluU3RhdGVtZW50KGlyLkZvckluU3RhdGVtZW50IG5vZGUsIGlyLkRhcnRUeXBlIGl0ZXJhYmxlVHlwZSkge30KCiAgQG92ZXJyaWRlCiAgTnVsbCB2aXNpdEZvckluU3RhdGVtZW50KGlyLkZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIGlyLkRhcnRUeXBlIGl0ZXJhYmxlVHlwZSA9IHZpc2l0Tm9kZShub2RlLml0ZXJhYmxlKTsKICAgIFR5cGVNYXAgYmVmb3JlTG9vcCA9IHR5cGVNYXAgPQogICAgICAgIHR5cGVNYXAucmVtb3ZlKHZhcmlhYmxlU2NvcGVNb2RlbC5nZXRTY29wZUZvcihub2RlKS5hc3NpZ25lZFZhcmlhYmxlcyk7CiAgICB2aXNpdE5vZGUobm9kZS52YXJpYWJsZSk7CiAgICB2aXNpdE5vZGUobm9kZS5ib2R5KTsKICAgIGhhbmRsZUZvckluU3RhdGVtZW50KG5vZGUsIGl0ZXJhYmxlVHlwZSk7CiAgICB0eXBlTWFwID0gYmVmb3JlTG9vcDsKICB9CgogIEBvdmVycmlkZQogIE51bGwgdmlzaXREb1N0YXRlbWVudChpci5Eb1N0YXRlbWVudCBub2RlKSB7CiAgICBUeXBlTWFwIGJlZm9yZUxvb3AgPSB0eXBlTWFwID0KICAgICAgICB0eXBlTWFwLnJlbW92ZSh2YXJpYWJsZVNjb3BlTW9kZWwuZ2V0U2NvcGVGb3Iobm9kZSkuYXNzaWduZWRWYXJpYWJsZXMpOwogICAgdmlzaXROb2RlKG5vZGUuYm9keSk7CiAgICB2aXNpdE5vZGUobm9kZS5jb25kaXRpb24pOwogICAgdHlwZU1hcCA9IGJlZm9yZUxvb3A7CiAgfQoKICBAb3ZlcnJpZGUKICBOdWxsIHZpc2l0V2hpbGVTdGF0ZW1lbnQoaXIuV2hpbGVTdGF0ZW1lbnQgbm9kZSkgewogICAgVHlwZU1hcCBiZWZvcmVMb29wID0gdHlwZU1hcCA9CiAgICAgICAgdHlwZU1hcC5yZW1vdmUodmFyaWFibGVTY29wZU1vZGVsLmdldFNjb3BlRm9yKG5vZGUpLmFzc2lnbmVkVmFyaWFibGVzKTsKICAgIHZpc2l0Tm9kZShub2RlLmNvbmRpdGlvbik7CiAgICB0eXBlTWFwID0gdHlwZU1hcFdoZW5UcnVlOwogICAgdmlzaXROb2RlKG5vZGUuYm9keSk7CiAgICB0eXBlTWFwID0gYmVmb3JlTG9vcDsKICB9CgogIHZvaWQgaGFuZGxlU3dpdGNoU3RhdGVtZW50KGlyLlN3aXRjaFN0YXRlbWVudCBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICBOdWxsIHZpc2l0U3dpdGNoU3RhdGVtZW50KGlyLlN3aXRjaFN0YXRlbWVudCBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS5leHByZXNzaW9uKTsKICAgIFR5cGVNYXAgYWZ0ZXJFeHByZXNzaW9uID0gdHlwZU1hcDsKICAgIFZhcmlhYmxlU2NvcGUgc2NvcGUgPSB2YXJpYWJsZVNjb3BlTW9kZWwuZ2V0U2NvcGVGb3Iobm9kZSk7CiAgICBUeXBlTWFwIGFmdGVyU3RhdGVtZW50ID0gYWZ0ZXJFeHByZXNzaW9uLnJlbW92ZShzY29wZS5hc3NpZ25lZFZhcmlhYmxlcyk7CiAgICBUeXBlTWFwIGJlZm9yZUNhc2UgPQogICAgICAgIHNjb3BlLmhhc0NvbnRpbnVlU3dpdGNoID8gYWZ0ZXJTdGF0ZW1lbnQgOiBhZnRlckV4cHJlc3Npb247CiAgICBmb3IgKGlyLlN3aXRjaENhc2Ugc3dpdGNoQ2FzZSBpbiBub2RlLmNhc2VzKSB7CiAgICAgIHR5cGVNYXAgPSBiZWZvcmVDYXNlOwogICAgICB2aXNpdE5vZGUoc3dpdGNoQ2FzZSk7CiAgICB9CiAgICBoYW5kbGVTd2l0Y2hTdGF0ZW1lbnQobm9kZSk7CiAgICB0eXBlTWFwID0gYWZ0ZXJTdGF0ZW1lbnQ7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFJldHVyblN0YXRlbWVudChpci5SZXR1cm5TdGF0ZW1lbnQgbm9kZSkgewogICAgdmlzaXROb2RlKG5vZGUuZXhwcmVzc2lvbik7CiAgICByZXR1cm4gY29uc3QgRG9lc05vdENvbXBsZXRlVHlwZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRJZlN0YXRlbWVudChpci5JZlN0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gX2hhbmRsZUNvbmRpdGlvbmFsKG5vZGUuY29uZGl0aW9uLCBub2RlLnRoZW4sIG5vZGUub3RoZXJ3aXNlKTsKICB9CgogIEBvdmVycmlkZQogIE51bGwgdmlzaXRUcnlDYXRjaChpci5UcnlDYXRjaCBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS5ib2R5KTsKICAgIHZpc2l0Tm9kZXMobm9kZS5jYXRjaGVzKTsKICB9CgogIHZvaWQgaGFuZGxlQ2F0Y2goaXIuQ2F0Y2ggbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgTnVsbCB2aXNpdENhdGNoKGlyLkNhdGNoIG5vZGUpIHsKICAgIGhhbmRsZUNhdGNoKG5vZGUpOwogICAgdmlzaXROb2RlKG5vZGUuYm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICBOdWxsIHZpc2l0VHJ5RmluYWxseShpci5UcnlGaW5hbGx5IG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLmJvZHkpOwogICAgdmlzaXROb2RlKG5vZGUuZmluYWxpemVyKTsKICB9CgogIHZvaWQgaGFuZGxlVHlwZUxpdGVyYWwoaXIuVHlwZUxpdGVyYWwgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRUeXBlTGl0ZXJhbChpci5UeXBlTGl0ZXJhbCBub2RlKSB7CiAgICBoYW5kbGVUeXBlTGl0ZXJhbChub2RlKTsKICAgIHJldHVybiBzdXBlci52aXNpdFR5cGVMaXRlcmFsKG5vZGUpOwogIH0KCiAgdm9pZCBoYW5kbGVMb2FkTGlicmFyeShpci5Mb2FkTGlicmFyeSBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdExvYWRMaWJyYXJ5KGlyLkxvYWRMaWJyYXJ5IG5vZGUpIHsKICAgIGhhbmRsZUxvYWRMaWJyYXJ5KG5vZGUpOwogICAgcmV0dXJuIHN1cGVyLnZpc2l0TG9hZExpYnJhcnkobm9kZSk7CiAgfQoKICB2b2lkIGhhbmRsZUFzc2VydFN0YXRlbWVudChpci5Bc3NlcnRTdGF0ZW1lbnQgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgTnVsbCB2aXNpdEFzc2VydFN0YXRlbWVudChpci5Bc3NlcnRTdGF0ZW1lbnQgbm9kZSkgewogICAgVHlwZU1hcCBiZWZvcmVDb25kaXRpb24gPSB0eXBlTWFwOwogICAgdmlzaXROb2RlKG5vZGUuY29uZGl0aW9uKTsKICAgIFR5cGVNYXAgYWZ0ZXJDb25kaXRpb25XaGVuVHJ1ZSA9IHR5cGVNYXBXaGVuVHJ1ZTsKICAgIFR5cGVNYXAgYWZ0ZXJDb25kaXRpb25XaGVuRmFsc2UgPSB0eXBlTWFwV2hlbkZhbHNlOwogICAgdHlwZU1hcCA9IGFmdGVyQ29uZGl0aW9uV2hlbkZhbHNlOwogICAgdmlzaXROb2RlKG5vZGUubWVzc2FnZSk7CiAgICBoYW5kbGVBc3NlcnRTdGF0ZW1lbnQobm9kZSk7CiAgICB0eXBlTWFwID0gdXNlQXNzZXJ0cyA/IGFmdGVyQ29uZGl0aW9uV2hlblRydWUgOiBiZWZvcmVDb25kaXRpb247CiAgfQoKICB2b2lkIGhhbmRsZUZ1bmN0aW9uRGVjbGFyYXRpb24oaXIuRnVuY3Rpb25EZWNsYXJhdGlvbiBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICBOdWxsIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihpci5GdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpIHsKICAgIFR5cGVNYXAgYmVmb3JlQ2xvc3VyZSA9CiAgICAgICAgdHlwZU1hcCA9IHR5cGVNYXAucmVtb3ZlKHZhcmlhYmxlU2NvcGVNb2RlbC5hc3NpZ25lZFZhcmlhYmxlcyk7CiAgICBTZXQ8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4gX29sZFZhcmlhYmxlcyA9IF9jdXJyZW50VmFyaWFibGVzOwogICAgX2N1cnJlbnRWYXJpYWJsZXMgPSBuZXcgU2V0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+KCk7CiAgICB2aXNpdFNpZ25hdHVyZShub2RlLmZ1bmN0aW9uKTsKICAgIHZpc2l0Tm9kZShub2RlLmZ1bmN0aW9uLmJvZHkpOwogICAgaGFuZGxlRnVuY3Rpb25EZWNsYXJhdGlvbihub2RlKTsKICAgIF9pbnZhbGlkYXRlZFZhcmlhYmxlcy5yZW1vdmVBbGwoX2N1cnJlbnRWYXJpYWJsZXMpOwogICAgX2N1cnJlbnRWYXJpYWJsZXMgPSBfb2xkVmFyaWFibGVzOwogICAgdHlwZU1hcCA9IGJlZm9yZUNsb3N1cmU7CiAgfQoKICB2b2lkIGhhbmRsZVBhcmFtZXRlcihpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHt9CgogIHZvaWQgdmlzaXRQYXJhbWV0ZXIoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICBfY3VycmVudFZhcmlhYmxlcy5hZGQobm9kZSk7CiAgICB2aXNpdE5vZGUobm9kZS5pbml0aWFsaXplcik7CiAgICBoYW5kbGVQYXJhbWV0ZXIobm9kZSk7CiAgfQoKICB2b2lkIGhhbmRsZVNpZ25hdHVyZShpci5GdW5jdGlvbk5vZGUgbm9kZSkge30KCiAgdm9pZCB2aXNpdFNpZ25hdHVyZShpci5GdW5jdGlvbk5vZGUgbm9kZSkgewogICAgbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5mb3JFYWNoKHZpc2l0UGFyYW1ldGVyKTsKICAgIG5vZGUubmFtZWRQYXJhbWV0ZXJzLmZvckVhY2godmlzaXRQYXJhbWV0ZXIpOwogICAgaGFuZGxlU2lnbmF0dXJlKG5vZGUpOwogIH0KCiAgdm9pZCBoYW5kbGVQcm9jZWR1cmUoaXIuUHJvY2VkdXJlIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIE51bGwgdmlzaXRQcm9jZWR1cmUoaXIuUHJvY2VkdXJlIG5vZGUpIHsKICAgIHRoaXNUeXBlID0gbmV3IFRoaXNJbnRlcmZhY2VUeXBlLmZyb20obm9kZS5lbmNsb3NpbmdDbGFzcz8udGhpc1R5cGUpOwogICAgX2N1cnJlbnRWYXJpYWJsZXMgPSBuZXcgU2V0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+KCk7CiAgICB2aXNpdFNpZ25hdHVyZShub2RlLmZ1bmN0aW9uKTsKICAgIHZpc2l0Tm9kZShub2RlLmZ1bmN0aW9uLmJvZHkpOwogICAgaGFuZGxlUHJvY2VkdXJlKG5vZGUpOwogICAgX2ludmFsaWRhdGVkVmFyaWFibGVzLnJlbW92ZUFsbChfY3VycmVudFZhcmlhYmxlcyk7CiAgICBfY3VycmVudFZhcmlhYmxlcyA9IG51bGw7CiAgICB0aGlzVHlwZSA9IG51bGw7CiAgfQoKICB2b2lkIGhhbmRsZUNvbnN0cnVjdG9yKGlyLkNvbnN0cnVjdG9yIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIE51bGwgdmlzaXRDb25zdHJ1Y3Rvcihpci5Db25zdHJ1Y3RvciBub2RlKSB7CiAgICB0aGlzVHlwZSA9IG5ldyBUaGlzSW50ZXJmYWNlVHlwZS5mcm9tKG5vZGUuZW5jbG9zaW5nQ2xhc3MudGhpc1R5cGUpOwogICAgX2N1cnJlbnRWYXJpYWJsZXMgPSBuZXcgU2V0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+KCk7CiAgICB2aXNpdFNpZ25hdHVyZShub2RlLmZ1bmN0aW9uKTsKICAgIHZpc2l0Tm9kZXMobm9kZS5pbml0aWFsaXplcnMpOwogICAgdmlzaXROb2RlKG5vZGUuZnVuY3Rpb24uYm9keSk7CiAgICBoYW5kbGVDb25zdHJ1Y3Rvcihub2RlKTsKICAgIF9pbnZhbGlkYXRlZFZhcmlhYmxlcy5yZW1vdmVBbGwoX2N1cnJlbnRWYXJpYWJsZXMpOwogICAgX2N1cnJlbnRWYXJpYWJsZXMgPSBudWxsOwogICAgdGhpc1R5cGUgPSBudWxsOwogIH0KCiAgdm9pZCBoYW5kbGVGaWVsZChpci5GaWVsZCBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICBOdWxsIHZpc2l0RmllbGQoaXIuRmllbGQgbm9kZSkgewogICAgdGhpc1R5cGUgPSBuZXcgVGhpc0ludGVyZmFjZVR5cGUuZnJvbShub2RlLmVuY2xvc2luZ0NsYXNzPy50aGlzVHlwZSk7CiAgICB2aXNpdE5vZGUobm9kZS5pbml0aWFsaXplcik7CiAgICBoYW5kbGVGaWVsZChub2RlKTsKICAgIHRoaXNUeXBlID0gbnVsbDsKICB9CgogIHZvaWQgaGFuZGxlVmFyaWFibGVEZWNsYXJhdGlvbihpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIE51bGwgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgX2N1cnJlbnRWYXJpYWJsZXMuYWRkKG5vZGUpOwogICAgaXIuRGFydFR5cGUgdHlwZSA9IHZpc2l0Tm9kZShub2RlLmluaXRpYWxpemVyKTsKICAgIGlmIChub2RlLmluaXRpYWxpemVyICE9IG51bGwgJiYKICAgICAgICB2YXJpYWJsZVNjb3BlTW9kZWwuaXNFZmZlY3RpdmVseUZpbmFsKG5vZGUpICYmCiAgICAgICAgaW5mZXJFZmZlY3RpdmVseUZpbmFsVmFyaWFibGVUeXBlcykgewogICAgICBub2RlLnR5cGUgPSB0eXBlOwogICAgfQogICAgaGFuZGxlVmFyaWFibGVEZWNsYXJhdGlvbihub2RlKTsKICB9CgogIHZvaWQgaGFuZGxlQ29uc3RhbnRFeHByZXNzaW9uKGlyLkNvbnN0YW50RXhwcmVzc2lvbiBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdENvbnN0YW50RXhwcmVzc2lvbihpci5Db25zdGFudEV4cHJlc3Npb24gbm9kZSkgewogICAgaGFuZGxlQ29uc3RhbnRFeHByZXNzaW9uKG5vZGUpOwogICAgcmV0dXJuIHN1cGVyLnZpc2l0Q29uc3RhbnRFeHByZXNzaW9uKG5vZGUpOwogIH0KfQoKY2xhc3MgQXJndW1lbnRUeXBlcyB7CiAgZmluYWwgTGlzdDxpci5EYXJ0VHlwZT4gcG9zaXRpb25hbDsKICBmaW5hbCBMaXN0PGlyLkRhcnRUeXBlPiBuYW1lZDsKCiAgQXJndW1lbnRUeXBlcyh0aGlzLnBvc2l0aW9uYWwsIHRoaXMubmFtZWQpOwp9CgovLy8gVHlwZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZm9yIGEgc2luZ2xlIHBhdGggZm9yIGEgbG9jYWwgdmFyaWFibGUuCi8vLwovLy8gVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCBndWFyZGVkIHR5cGUgcHJvbW90aW9uLgovLy8KLy8vIFRoZSB0ZXJtaW5vbG9neSBhbmQgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gdGhpcyBwYXBlcjoKLy8vCi8vLyAgIGh0dHA6Ly93d3cuY3Mud2lsbGlhbXMuZWR1L0ZUZkpQMjAxMS82LVdpbnRoZXIucGRmCi8vLwpjbGFzcyBUeXBlSG9sZGVyIHsKICAvLy8gVGhlIGRlY2xhcmVkIHR5cGUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlLgogIGZpbmFsIGlyLkRhcnRUeXBlIGRlY2xhcmVkVHlwZTsKCiAgLy8vIFRoZSB0eXBlcyB0aGF0IHRoZSBsb2NhbCB2YXJpYWJsZSBpcyBrbm93biB0byBiZSBhbiBpbnN0YW5jZSBvZi4KICBmaW5hbCBTZXQ8aXIuRGFydFR5cGU+IHRydWVUeXBlczsKCiAgLy8vIFRoZSB0eXBlcyB0aGF0IHRoZSBsb2NhbCB2YXJpYWJsZSBpcyBrbm93biBfbm90XyB0byBiZSBhbiBpbnN0YW5jZSBvZi4KICBmaW5hbCBTZXQ8aXIuRGFydFR5cGU+IGZhbHNlVHlwZXM7CgogIGludCBfaGFzaENvZGU7CgogIFR5cGVIb2xkZXIodGhpcy5kZWNsYXJlZFR5cGUsIHRoaXMudHJ1ZVR5cGVzLCB0aGlzLmZhbHNlVHlwZXMpOwoKICAvLy8gQ29tcHV0ZXMgYSBzaW5nbGUgdHlwZSB0aGF0IHNvdW5kbHkgcmVwcmVzZW50cyB0aGUgcHJvbW90ZWQgdHlwZSBvZiB0aGUKICAvLy8gbG9jYWwgdmFyaWFibGUgb24gdGhpcyBzaW5nbGUgcGF0aC4KICBpci5EYXJ0VHlwZSB0eXBlT2YoaXIuVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCkgewogICAgaXIuRGFydFR5cGUgY2FuZGlkYXRlID0gZGVjbGFyZWRUeXBlOwogICAgaWYgKGZhbHNlVHlwZXMgIT0gbnVsbCkgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTcGVjaWFsLWNhc2UgdGhlIGA9PSBudWxsYCByZXByZXNlbnRhdGlvbiB0bwogICAgICAvLyBtYWtlIGl0IGZhc3Rlci4KICAgICAgZm9yIChpci5EYXJ0VHlwZSB0eXBlIGluIGZhbHNlVHlwZXMpIHsKICAgICAgICBpZiAodHlwZUVudmlyb25tZW50LmlzU3VidHlwZU9mKGRlY2xhcmVkVHlwZSwgdHlwZSkpIHsKICAgICAgICAgIHJldHVybiB0eXBlRW52aXJvbm1lbnQubnVsbFR5cGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAodHJ1ZVR5cGVzICE9IG51bGwpIHsKICAgICAgZm9yIChpci5EYXJ0VHlwZSB0eXBlIGluIHRydWVUeXBlcykgewogICAgICAgIGlmICh0eXBlID09IHR5cGVFbnZpcm9ubWVudC5udWxsVHlwZSkgewogICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YodHlwZSwgY2FuZGlkYXRlKSkgewogICAgICAgICAgY2FuZGlkYXRlID0gdHlwZTsKICAgICAgICB9IGVsc2UgaWYgKCF0eXBlRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoY2FuZGlkYXRlLCB0eXBlKSkgewogICAgICAgICAgLy8gV2UgY2Fubm90IHByb21vdGUuIE5vIHNpbmdsZSB0eXBlIGlzIG1vc3Qgc3BlY2lmaWMuCiAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDb21wdXRlIGltcGxpZWQgdHlwZXM/IEZvciBpbnN0YW5jZSB3aGVuIHRoZQogICAgICAgICAgLy8gZGVjbGFyZWQgdHlwZSBpcyBgSXRlcmFibGU8U3RyaW5nPmAgYW5kIHRlc3RlZCB0eXBlIGlzCiAgICAgICAgICAvLyBgTGlzdDxkeW5hbWljPmAgd2UgY291bGQgcHJvbW90ZSB0byB0aGUgaW1wbGllZCB0eXBlCiAgICAgICAgICAvLyBgTGlzdDxTdHJpbmc+YC4KICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGNhbmRpZGF0ZTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgewogICAgaWYgKF9oYXNoQ29kZSA9PSBudWxsKSB7CiAgICAgIF9oYXNoQ29kZSA9IEhhc2hpbmcuc2V0SGFzaChmYWxzZVR5cGVzLAogICAgICAgICAgSGFzaGluZy5zZXRIYXNoKHRydWVUeXBlcywgSGFzaGluZy5vYmplY3RIYXNoKGRlY2xhcmVkVHlwZSkpKTsKICAgIH0KICAgIHJldHVybiBfaGFzaENvZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gb3RoZXIgaXMgVHlwZUhvbGRlciAmJgogICAgICAgIGRlY2xhcmVkVHlwZSA9PSBvdGhlci5kZWNsYXJlZFR5cGUgJiYKICAgICAgICBlcXVhbFNldHModHJ1ZVR5cGVzLCBvdGhlci50cnVlVHlwZXMpICYmCiAgICAgICAgZXF1YWxTZXRzKGZhbHNlVHlwZXMsIG90aGVyLmZhbHNlVHlwZXMpOwogIH0KCiAgdm9pZCBfZ2V0VGV4dCgKICAgICAgU3RyaW5nQnVmZmVyIHNiLCBTdHJpbmcgRnVuY3Rpb24oSXRlcmFibGU8aXIuRGFydFR5cGU+KSB0eXBlc1RvVGV4dCkgewogICAgc2Iud3JpdGUoJ3snKTsKICAgIFN0cmluZyBjb21tYSA9ICcnOwogICAgaWYgKHRydWVUeXBlcyAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCd0cnVlOicpOwogICAgICBzYi53cml0ZSh0eXBlc1RvVGV4dCh0cnVlVHlwZXMpKTsKICAgICAgY29tbWEgPSAnLCc7CiAgICB9CiAgICBpZiAoZmFsc2VUeXBlcyAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKGNvbW1hKTsKICAgICAgc2Iud3JpdGUoJ2ZhbHNlOicpOwogICAgICBzYi53cml0ZSh0eXBlc1RvVGV4dChmYWxzZVR5cGVzKSk7CiAgICB9CiAgICBzYi53cml0ZSgnfScpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJ1R5cGVIb2xkZXIoJyk7CiAgICBzYi53cml0ZSgnZGVjbGFyZWQ9JGRlY2xhcmVkVHlwZScpOwogICAgaWYgKHRydWVUeXBlcyAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCcsdHJ1ZT0kdHJ1ZVR5cGVzJyk7CiAgICB9CiAgICBpZiAoZmFsc2VUeXBlcyAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCcsZmFsc2U9JGZhbHNlVHlwZXMnKTsKICAgIH0KICAgIHNiLndyaXRlKCcpJyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCi8vLyBUeXBlIGluZm9ybWF0aW9uIGZvciBhIHNpbmdsZSBsb2NhbCB2YXJpYWJsZSBvbiBhbGwgcG9zc2libGUgcGF0aHMuCi8vLwovLy8gVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCBndWFyZGVkIHR5cGUgcHJvbW90aW9uLgovLy8KLy8vIFRoZSB0ZXJtaW5vbG9neSBhbmQgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gdGhpcyBwYXBlcjoKLy8vCi8vLyAgIGh0dHA6Ly93d3cuY3Mud2lsbGlhbXMuZWR1L0ZUZkpQMjAxMS82LVdpbnRoZXIucGRmCi8vLwpjbGFzcyBUYXJnZXRJbmZvIHsKICAvLy8gVGhlIGRlY2xhcmVkIHR5cGUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlLgogIGZpbmFsIGlyLkRhcnRUeXBlIGRlY2xhcmVkVHlwZTsKCiAgLy8vIENvbGxlY3RlZCB0eXBlIGluZm9ybWF0aW9uIGZvciBkaXNqb2ludCBwYXRocy4KICBmaW5hbCBJdGVyYWJsZTxUeXBlSG9sZGVyPiB0eXBlSG9sZGVyczsKCiAgLy8vIFR5cGVzIHJlbGV2YW50IGZvciBwcm9tb3Rpb24gb2YgdGhlIGxvY2FsIHZhcmlhYmxlLgogIGZpbmFsIEl0ZXJhYmxlPGlyLkRhcnRUeXBlPiB0eXBlc09mSW50ZXJlc3Q7CgogIFRhcmdldEluZm8odGhpcy5kZWNsYXJlZFR5cGUsIHRoaXMudHlwZUhvbGRlcnMsIHRoaXMudHlwZXNPZkludGVyZXN0KTsKCiAgLy8vIFJldHVybnMgdGhlIFtUYXJnZXRJbmZvXSB0aGF0IGRlc2NyaWJlcyB0aGUgYWRkZWQgdHlwZSBrbm93bGVkZ2UgZm9yIHRoZQogIC8vLyBsb2NhbCB2YXJpYWJsZS4gSWYgW2lzVHJ1ZV0gaXMgYHRydWVgLCB0aGUgbG9jYWwgdmFyaWFibGUgaXMga25vd24gdG8KICAvLy8gYmUgYW4gaW5zdGFuY2Ugb2YgW3R5cGVdLiBJZiBbaXNUcnVlXSBpcyBgZmFsc2VgLCB0aGUgbG9jYWwgdmFyaWFibGUgaXMKICAvLy8ga25vd24gX25vdF8gdG8gYmUgYW4gaW5zdGFuY2Ugb2YgW3R5cGVdLgogIFRhcmdldEluZm8gcHJvbW90ZShpci5EYXJ0VHlwZSB0eXBlLCB7Ym9vbCBpc1RydWV9KSB7CiAgICBTZXQ8VHlwZUhvbGRlcj4gbmV3VHlwZUhvbGRlcnMgPSBuZXcgU2V0PFR5cGVIb2xkZXI+KCk7CgogICAgYm9vbCBhZGRUeXBlSG9sZGVyKFR5cGVIb2xkZXIgdHlwZUhvbGRlcikgewogICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKCiAgICAgIFNldDxpci5EYXJ0VHlwZT4gYWRkQXNDb3B5KFNldDxpci5EYXJ0VHlwZT4gc2V0LCBpci5EYXJ0VHlwZSB0eXBlKSB7CiAgICAgICAgU2V0PGlyLkRhcnRUeXBlPiByZXN1bHQ7CiAgICAgICAgaWYgKHNldCA9PSBudWxsKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgU2V0PGlyLkRhcnRUeXBlPigpOwogICAgICAgIH0gZWxzZSBpZiAoc2V0LmNvbnRhaW5zKHR5cGUpKSB7CiAgICAgICAgICByZXR1cm4gc2V0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHQgPSBTZXQ8aXIuRGFydFR5cGU+LmZyb20oc2V0KTsKICAgICAgICB9CiAgICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICAgICAgcmV0dXJuIHJlc3VsdC4uYWRkKHR5cGUpOwogICAgICB9CgogICAgICBTZXQ8aXIuRGFydFR5cGU+IHRydWVUeXBlcyA9IHR5cGVIb2xkZXI/LnRydWVUeXBlczsKICAgICAgU2V0PGlyLkRhcnRUeXBlPiBmYWxzZVR5cGVzID0gdHlwZUhvbGRlcj8uZmFsc2VUeXBlczsKICAgICAgaWYgKGlzVHJ1ZSkgewogICAgICAgIHRydWVUeXBlcyA9IGFkZEFzQ29weSh0cnVlVHlwZXMsIHR5cGUpOwogICAgICB9IGVsc2UgewogICAgICAgIGZhbHNlVHlwZXMgPSBhZGRBc0NvcHkoZmFsc2VUeXBlcywgdHlwZSk7CiAgICAgIH0KICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ2hlY2sgdmFsaWRpdHk7IGlmIHRoZSB0cnVlIHR5cGVzIGFyZQogICAgICAvLyBjb250cmFkaWN0aW5nLCBmb3IgaW5zdGFuY2UgaWYgdGhlIGxvY2FsIGlzIGtub3duIHRvIGJlIGFuZCBpbnN0YW5jZQogICAgICAvLyBvZiB0eXBlcyBgaW50YCBhbmQgYFN0cmluZ2Agc2ltdWx0YW5lb3VzbHksIHRoZW4gd2UgY291bGQgZmxhZyBjb2RlCiAgICAgIC8vIGFzIGRlYWQgY29kZS4KICAgICAgbmV3VHlwZUhvbGRlcnMuYWRkKFR5cGVIb2xkZXIoZGVjbGFyZWRUeXBlLCB0cnVlVHlwZXMsIGZhbHNlVHlwZXMpKTsKICAgICAgcmV0dXJuIGNoYW5nZWQ7CiAgICB9CgogICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CiAgICBpZiAodHlwZUhvbGRlcnMuaXNFbXB0eSkgewogICAgICBjaGFuZ2VkIHw9IGFkZFR5cGVIb2xkZXIobnVsbCk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKFR5cGVIb2xkZXIgdHlwZUhvbGRlciBpbiB0eXBlSG9sZGVycykgewogICAgICAgIGNoYW5nZWQgfD0gYWRkVHlwZUhvbGRlcih0eXBlSG9sZGVyKTsKICAgICAgfQogICAgfQogICAgSXRlcmFibGU8aXIuRGFydFR5cGU+IG5ld1R5cGVzT2ZJbnRlcmVzdDsKICAgIGlmICh0eXBlc09mSW50ZXJlc3QuY29udGFpbnModHlwZSkpIHsKICAgICAgbmV3VHlwZXNPZkludGVyZXN0ID0gdHlwZXNPZkludGVyZXN0OwogICAgfSBlbHNlIHsKICAgICAgbmV3VHlwZXNPZkludGVyZXN0ID0gbmV3IFNldDxpci5EYXJ0VHlwZT4uZnJvbSh0eXBlc09mSW50ZXJlc3QpCiAgICAgICAgLi5hZGQodHlwZSk7CiAgICAgIGNoYW5nZWQgPSB0cnVlOwogICAgfQogICAgcmV0dXJuIGNoYW5nZWQKICAgICAgICA/IG5ldyBUYXJnZXRJbmZvKGRlY2xhcmVkVHlwZSwgbmV3VHlwZUhvbGRlcnMsIG5ld1R5cGVzT2ZJbnRlcmVzdCkKICAgICAgICA6IHRoaXM7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgW1RhcmdldEluZm9dIHRoYXQgZGVzY3JpYmVzIHRoYXQgdGhlIGxvY2FsIGlzIGVpdGhlciBvZiBbdGhpc10KICAvLy8gb3IgdGhlIFtvdGhlcl0gdHlwZS4KICAvLy8KICAvLy8gUmV0dXJucyBgbnVsbGAgaWYgdGhlIGpvaW4gaXMgZW1wdHkuCiAgVGFyZ2V0SW5mbyBqb2luKFRhcmdldEluZm8gb3RoZXIpIHsKICAgIGlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdGhpczsKCiAgICBTZXQ8VHlwZUhvbGRlcj4gbmV3VHlwZUhvbGRlcnMgPSBuZXcgU2V0PFR5cGVIb2xkZXI+KCk7CiAgICBTZXQ8aXIuRGFydFR5cGU+IG5ld1R5cGVzT2ZJbnRlcmVzdCA9IG5ldyBTZXQ8aXIuRGFydFR5cGU+KCk7CgogICAgLy8vIEFkZHMgdGhlIFt0eXBlSG9sZGVyc10gdG8gW25ld1R5cGVIb2xkZXJzXSBmb3IgdHlwZXMgaW4KICAgIC8vLyBbb3RoZXJUeXBlc09mSW50ZXJlc3RdIHdoaWxlIHJlbW92aW5nIHRoZSBpbmZvcm1hdGlvbgogICAgLy8vIGludmFsaWRhdGVkIGJ5IFtvdGhlclRydWVUeXBlc10gYW5kIFtvdGhlckZhbHNlVHlwZXNdLgogICAgdm9pZCBhZGRUeXBlSG9sZGVycygKICAgICAgICBJdGVyYWJsZTxUeXBlSG9sZGVyPiB0eXBlSG9sZGVycywKICAgICAgICBTZXQ8aXIuRGFydFR5cGU+IG90aGVyVHJ1ZVR5cGVzLAogICAgICAgIFNldDxpci5EYXJ0VHlwZT4gb3RoZXJGYWxzZVR5cGVzLAogICAgICAgIEl0ZXJhYmxlPGlyLkRhcnRUeXBlPiBvdGhlclR5cGVzT2ZJbnRlcmVzdCkgewogICAgICBmb3IgKFR5cGVIb2xkZXIgdHlwZUhvbGRlciBpbiB0eXBlSG9sZGVycykgewogICAgICAgIFNldDxpci5EYXJ0VHlwZT4gbmV3VHJ1ZVR5cGVzOwogICAgICAgIGlmICh0eXBlSG9sZGVyLnRydWVUeXBlcyAhPSBudWxsKSB7CiAgICAgICAgICBuZXdUcnVlVHlwZXMgPSBuZXcgU2V0PGlyLkRhcnRUeXBlPi5mcm9tKHR5cGVIb2xkZXIudHJ1ZVR5cGVzKTsKCiAgICAgICAgICAvLy8gT25seSB0eXBlcyBpbiBbb3RoZXJUeXBlc09mSW50ZXJlc3RdIGhhcyBpbmZvcm1hdGlvbiBmcm9tIGFsbAogICAgICAgICAgLy8vIHBhdGhzLgogICAgICAgICAgbmV3VHJ1ZVR5cGVzLnJldGFpbkFsbChvdGhlclR5cGVzT2ZJbnRlcmVzdCk7CgogICAgICAgICAgLy8vIFJlbW92ZSB0eXBlcyB0aGF0IGFyZSBrbm93biB0byBiZSBmYWxzZSBvbiBvdGhlciBwYXRoczsgdGhlc2UKICAgICAgICAgIC8vLyB3b3VsZCBhbW91bnQgdG8ga25vd2luZyB0aGF0IGEgdmFyaWFibGUgaXMgb3IgaXMgbm90IG9mIHNvbWUKICAgICAgICAgIC8vLyB0eXBlLgogICAgICAgICAgbmV3VHJ1ZVR5cGVzLnJlbW92ZUFsbChvdGhlckZhbHNlVHlwZXMpOwogICAgICAgICAgaWYgKG5ld1RydWVUeXBlcy5pc0VtcHR5KSB7CiAgICAgICAgICAgIG5ld1RydWVUeXBlcyA9IG51bGw7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuZXdUeXBlc09mSW50ZXJlc3QuYWRkQWxsKG5ld1RydWVUeXBlcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIFNldDxpci5EYXJ0VHlwZT4gbmV3RmFsc2VUeXBlczsKICAgICAgICBpZiAodHlwZUhvbGRlci5mYWxzZVR5cGVzICE9IG51bGwpIHsKICAgICAgICAgIG5ld0ZhbHNlVHlwZXMgPSBuZXcgU2V0PGlyLkRhcnRUeXBlPi5mcm9tKHR5cGVIb2xkZXIuZmFsc2VUeXBlcyk7CgogICAgICAgICAgLy8vIE9ubHkgdHlwZXMgaW4gW290aGVyVHlwZXNPZkludGVyZXN0XSBoYXMgaW5mb3JtYXRpb24gZnJvbSBhbGwKICAgICAgICAgIC8vLyBwYXRocy4KICAgICAgICAgIG5ld0ZhbHNlVHlwZXMucmV0YWluQWxsKG90aGVyVHlwZXNPZkludGVyZXN0KTsKCiAgICAgICAgICAvLy8gUmVtb3ZlIHR5cGVzIHRoYXQgYXJlIGtub3duIHRvIGJlIHRydWUgb24gb3RoZXIgcGF0aHM7IHRoZXNlCiAgICAgICAgICAvLy8gd291bGQgYW1vdW50IHRvIGtub3dpbmcgdGhhdCBhIHZhcmlhYmxlIGlzIG9yIGlzIG5vdCBvZiBzb21lCiAgICAgICAgICAvLy8gdHlwZS4KICAgICAgICAgIG5ld0ZhbHNlVHlwZXMucmVtb3ZlQWxsKG90aGVyVHJ1ZVR5cGVzKTsKICAgICAgICAgIGlmIChuZXdGYWxzZVR5cGVzLmlzRW1wdHkpIHsKICAgICAgICAgICAgbmV3RmFsc2VUeXBlcyA9IG51bGw7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuZXdUeXBlc09mSW50ZXJlc3QuYWRkQWxsKG5ld0ZhbHNlVHlwZXMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobmV3VHJ1ZVR5cGVzICE9IG51bGwgfHwgbmV3RmFsc2VUeXBlcyAhPSBudWxsKSB7CiAgICAgICAgICAvLyBPbmx5IGluY2x1ZGUgdHlwZSBob2xkZXJzIHdpdGggaW5mb3JtYXRpb24uCiAgICAgICAgICBuZXdUeXBlSG9sZGVycwogICAgICAgICAgICAgIC5hZGQobmV3IFR5cGVIb2xkZXIoZGVjbGFyZWRUeXBlLCBuZXdUcnVlVHlwZXMsIG5ld0ZhbHNlVHlwZXMpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBTZXQ8aXIuRGFydFR5cGU+IHRoaXNUcnVlVHlwZXMgPSBuZXcgU2V0PGlyLkRhcnRUeXBlPigpOwogICAgU2V0PGlyLkRhcnRUeXBlPiB0aGlzRmFsc2VUeXBlcyA9IG5ldyBTZXQ8aXIuRGFydFR5cGU+KCk7CiAgICBmb3IgKFR5cGVIb2xkZXIgdHlwZUhvbGRlciBpbiB0eXBlSG9sZGVycykgewogICAgICBpZiAodHlwZUhvbGRlci50cnVlVHlwZXMgIT0gbnVsbCkgewogICAgICAgIHRoaXNUcnVlVHlwZXMuYWRkQWxsKHR5cGVIb2xkZXIudHJ1ZVR5cGVzKTsKICAgICAgfQogICAgICBpZiAodHlwZUhvbGRlci5mYWxzZVR5cGVzICE9IG51bGwpIHsKICAgICAgICB0aGlzRmFsc2VUeXBlcy5hZGRBbGwodHlwZUhvbGRlci5mYWxzZVR5cGVzKTsKICAgICAgfQogICAgfQoKICAgIFNldDxpci5EYXJ0VHlwZT4gb3RoZXJUcnVlVHlwZXMgPSBuZXcgU2V0PGlyLkRhcnRUeXBlPigpOwogICAgU2V0PGlyLkRhcnRUeXBlPiBvdGhlckZhbHNlVHlwZXMgPSBuZXcgU2V0PGlyLkRhcnRUeXBlPigpOwogICAgZm9yIChUeXBlSG9sZGVyIHR5cGVIb2xkZXIgaW4gb3RoZXIudHlwZUhvbGRlcnMpIHsKICAgICAgaWYgKHR5cGVIb2xkZXIudHJ1ZVR5cGVzICE9IG51bGwpIHsKICAgICAgICBvdGhlclRydWVUeXBlcy5hZGRBbGwodHlwZUhvbGRlci50cnVlVHlwZXMpOwogICAgICB9CiAgICAgIGlmICh0eXBlSG9sZGVyLmZhbHNlVHlwZXMgIT0gbnVsbCkgewogICAgICAgIG90aGVyRmFsc2VUeXBlcy5hZGRBbGwodHlwZUhvbGRlci5mYWxzZVR5cGVzKTsKICAgICAgfQogICAgfQoKICAgIGFkZFR5cGVIb2xkZXJzKHRoaXMudHlwZUhvbGRlcnMsIG90aGVyVHJ1ZVR5cGVzLCBvdGhlckZhbHNlVHlwZXMsCiAgICAgICAgb3RoZXIudHlwZXNPZkludGVyZXN0KTsKICAgIGFkZFR5cGVIb2xkZXJzKAogICAgICAgIG90aGVyLnR5cGVIb2xkZXJzLCB0aGlzVHJ1ZVR5cGVzLCB0aGlzRmFsc2VUeXBlcywgdGhpcy50eXBlc09mSW50ZXJlc3QpOwoKICAgIGlmIChuZXdUeXBlSG9sZGVycy5pc0VtcHR5KSB7CiAgICAgIGFzc2VydChuZXdUeXBlc09mSW50ZXJlc3QuaXNFbXB0eSk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHJldHVybiBuZXcgVGFyZ2V0SW5mbyhkZWNsYXJlZFR5cGUsIG5ld1R5cGVIb2xkZXJzLCBuZXdUeXBlc09mSW50ZXJlc3QpOwogIH0KCiAgLy8vIENvbXB1dGVzIGEgc2luZ2xlIHR5cGUgdGhhdCBzb3VuZGx5IHJlcHJlc2VudHMgdGhlIHByb21vdGVkIHR5cGUgb2YgdGhlCiAgLy8vIGxvY2FsIHZhcmlhYmxlIG9uIGFsbCBwb3NzaWJsZSBwYXRocy4KICBpci5EYXJ0VHlwZSB0eXBlT2YoaXIuVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCkgewogICAgaXIuRGFydFR5cGUgY2FuZGlkYXRlID0gbnVsbDsKICAgIGZvciAoVHlwZUhvbGRlciB0eXBlSG9sZGVyIGluIHR5cGVIb2xkZXJzKSB7CiAgICAgIGlyLkRhcnRUeXBlIHR5cGUgPSB0eXBlSG9sZGVyLnR5cGVPZih0eXBlRW52aXJvbm1lbnQpOwogICAgICBpZiAodHlwZSA9PSBudWxsKSB7CiAgICAgICAgLy8gV2UgY2Fubm90IHByb21vdGUuIE5vIHNpbmdsZSB0eXBlIGlzIG1vc3Qgc3BlY2lmaWMuCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgaWYgKGNhbmRpZGF0ZSA9PSBudWxsKSB7CiAgICAgICAgY2FuZGlkYXRlID0gdHlwZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAodHlwZSA9PSB0eXBlRW52aXJvbm1lbnQubnVsbFR5cGUpIHsKICAgICAgICAgIC8vIEtlZXAgdGhlIGN1cnJlbnQgY2FuZGlkYXRlLgogICAgICAgIH0gZWxzZSBpZiAoY2FuZGlkYXRlID09IHR5cGVFbnZpcm9ubWVudC5udWxsVHlwZSkgewogICAgICAgICAgY2FuZGlkYXRlID0gdHlwZTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVFbnZpcm9ubWVudC5pc1N1YnR5cGVPZihjYW5kaWRhdGUsIHR5cGUpKSB7CiAgICAgICAgICBjYW5kaWRhdGUgPSB0eXBlOwogICAgICAgIH0gZWxzZSBpZiAoIXR5cGVFbnZpcm9ubWVudC5pc1N1YnR5cGVPZih0eXBlLCBjYW5kaWRhdGUpKSB7CiAgICAgICAgICAvLyBXZSBjYW5ub3QgcHJvbW90ZS4gTm8gcHJvbW90ZWQgdHlwZSBvZiBvbmUgcGF0aCBpcyBhIHN1cGVydHlwZSBvZgogICAgICAgICAgLy8gdGhlIHByb21vdGVkIHR5cGUgZnJvbSBhbGwgb3RoZXIgcGF0aHMuCiAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDb21wdXRlIGEgZ3JlYXRlc3QgbG93ZXIgYm91bmQsIGluc3RlYWQ/CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBjYW5kaWRhdGU7CiAgfQoKICB2b2lkIF9nZXRUZXh0KAogICAgICBTdHJpbmdCdWZmZXIgc2IsIFN0cmluZyBGdW5jdGlvbihJdGVyYWJsZTxpci5EYXJ0VHlwZT4pIHR5cGVzVG9UZXh0KSB7CiAgICBzYi53cml0ZSgnWycpOwogICAgU3RyaW5nIGNvbW1hID0gJyc7CiAgICBmb3IgKFR5cGVIb2xkZXIgdHlwZUhvbGRlciBpbiB0eXBlSG9sZGVycykgewogICAgICBzYi53cml0ZShjb21tYSk7CiAgICAgIHR5cGVIb2xkZXIuX2dldFRleHQoc2IsIHR5cGVzVG9UZXh0KTsKICAgICAgY29tbWEgPSAnLCc7CiAgICB9CiAgICBzYi53cml0ZSgnfCcpOwogICAgc2Iud3JpdGUodHlwZXNUb1RleHQodHlwZXNPZkludGVyZXN0KSk7CiAgICBzYi53cml0ZSgnXScpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJ1RhcmdldEluZm8oJyk7CiAgICBzYi53cml0ZSgnZGVjbGFyZWRUeXBlPSRkZWNsYXJlZFR5cGUsJyk7CiAgICBzYi53cml0ZSgndHlwZUhvbGRlcnM9JHR5cGVIb2xkZXJzLCcpOwogICAgc2Iud3JpdGUoJ2RlY2xhcmF0aW9uc09mSW50ZXJlc3Q9JHR5cGVzT2ZJbnRlcmVzdCcpOwogICAgc2Iud3JpdGUoJyknKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQoKLy8vIE1hcCBmcm9tIGxvY2FsIHZhcmlhYmxlcyB0byB0eXBlIGluZm9ybWF0aW9uIHVzZWQgZm9yIGd1YXJkZWQgdHlwZQovLy8gcHJvbW90aW9uLgovLy8KLy8vIFRoZSB0ZXJtaW5vbG9neSBhbmQgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gdGhpcyBwYXBlcjoKLy8vCi8vLyAgIGh0dHA6Ly93d3cuY3Mud2lsbGlhbXMuZWR1L0ZUZkpQMjAxMS82LVdpbnRoZXIucGRmCi8vLwpjbGFzcyBUeXBlTWFwIHsKICBmaW5hbCBNYXA8aXIuVmFyaWFibGVEZWNsYXJhdGlvbiwgVGFyZ2V0SW5mbz4gX3RhcmdldEluZm9NYXA7CgogIGNvbnN0IFR5cGVNYXAoW3RoaXMuX3RhcmdldEluZm9NYXAgPSBjb25zdCB7fV0pOwoKICAvLy8gUmV0dXJucyB0aGUgW1R5cGVNYXBdIHRoYXQgZGVzY3JpYmVzIHRoZSBhZGRlZCB0eXBlIGtub3dsZWRnZSBmb3IgdGhlCiAgLy8vIGxvY2FsIFt2YXJpYWJsZV0uIElmIFtpc1RydWVdIGlzIGB0cnVlYCwgdGhlIGxvY2FsIFt2YXJpYWJsZV0gaXMga25vd24gdG8KICAvLy8gYmUgYW4gaW5zdGFuY2Ugb2YgW3R5cGVdLiBJZiBbaXNUcnVlXSBpcyBgZmFsc2VgLCB0aGUgbG9jYWwgW3ZhcmlhYmxlXSBpcwogIC8vLyBrbm93biBfbm90XyB0byBiZSBhbiBpbnN0YW5jZSBvZiBbdHlwZV0uCiAgVHlwZU1hcCBwcm9tb3RlKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIGlyLkRhcnRUeXBlIHR5cGUsCiAgICAgIHtib29sIGlzVHJ1ZX0pIHsKICAgIE1hcDxpci5WYXJpYWJsZURlY2xhcmF0aW9uLCBUYXJnZXRJbmZvPiBuZXdJbmZvTWFwID0KICAgICAgICBuZXcgTWFwPGlyLlZhcmlhYmxlRGVjbGFyYXRpb24sIFRhcmdldEluZm8+LmZyb20oX3RhcmdldEluZm9NYXApOwogICAgVGFyZ2V0SW5mbyB0YXJnZXRJbmZvID0gbmV3SW5mb01hcFt2YXJpYWJsZV07CiAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKICAgIGlmICh0YXJnZXRJbmZvICE9IG51bGwpIHsKICAgICAgVGFyZ2V0SW5mbyByZXN1bHQgPSB0YXJnZXRJbmZvLnByb21vdGUodHlwZSwgaXNUcnVlOiBpc1RydWUpOwogICAgICBjaGFuZ2VkID0gIWlkZW50aWNhbCh0YXJnZXRJbmZvLCByZXN1bHQpOwogICAgICB0YXJnZXRJbmZvID0gcmVzdWx0OwogICAgfSBlbHNlIHsKICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICAgIFNldDxpci5EYXJ0VHlwZT4gdHJ1ZVR5cGVzID0KICAgICAgICAgIGlzVHJ1ZSA/IChuZXcgU2V0PGlyLkRhcnRUeXBlPigpLi5hZGQodHlwZSkpIDogbnVsbDsKICAgICAgU2V0PGlyLkRhcnRUeXBlPiBmYWxzZVR5cGVzID0KICAgICAgICAgIGlzVHJ1ZSA/IG51bGwgOiAobmV3IFNldDxpci5EYXJ0VHlwZT4oKS4uYWRkKHR5cGUpKTsKICAgICAgVHlwZUhvbGRlciB0eXBlSG9sZGVyID0KICAgICAgICAgIG5ldyBUeXBlSG9sZGVyKHZhcmlhYmxlLnR5cGUsIHRydWVUeXBlcywgZmFsc2VUeXBlcyk7CiAgICAgIHRhcmdldEluZm8gPSBuZXcgVGFyZ2V0SW5mbygKICAgICAgICAgIHZhcmlhYmxlLnR5cGUsIDxUeXBlSG9sZGVyPlt0eXBlSG9sZGVyXSwgPGlyLkRhcnRUeXBlPlt0eXBlXSk7CiAgICB9CiAgICBuZXdJbmZvTWFwW3ZhcmlhYmxlXSA9IHRhcmdldEluZm87CiAgICByZXR1cm4gY2hhbmdlZCA/IG5ldyBUeXBlTWFwKG5ld0luZm9NYXApIDogdGhpczsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBbVHlwZU1hcF0gdGhhdCBkZXNjcmliZXMgdGhhdCB0aGUgbG9jYWxzIGFyZSBlaXRoZXIgb2YgW3RoaXNdCiAgLy8vIG9yIHRoZSBbb3RoZXJdIHR5cGVzLgogIFR5cGVNYXAgam9pbihUeXBlTWFwIG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRoaXM7CgogICAgTWFwPGlyLlZhcmlhYmxlRGVjbGFyYXRpb24sIFRhcmdldEluZm8+IG5ld0luZm9NYXAgPSB7fTsKICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOwogICAgX3RhcmdldEluZm9NYXAuZm9yRWFjaCgoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgVGFyZ2V0SW5mbyBpbmZvKSB7CiAgICAgIFRhcmdldEluZm8gcmVzdWx0ID0gaW5mby5qb2luKG90aGVyLl90YXJnZXRJbmZvTWFwW3ZhcmlhYmxlXSk7CiAgICAgIGNoYW5nZWQgfD0gIWlkZW50aWNhbChpbmZvLCByZXN1bHQpOwogICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKICAgICAgICAvLyBBZGQgb25seSBub24tZW1wdHkgaW5mb3JtYXRpb24uCiAgICAgICAgbmV3SW5mb01hcFt2YXJpYWJsZV0gPSByZXN1bHQ7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIGNoYW5nZWQgPyBuZXcgVHlwZU1hcChuZXdJbmZvTWFwKSA6IHRoaXM7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgW1R5cGVNYXBdIGluIHdoaWNoIGFsbCB0eXBlIGluZm9ybWF0aW9uIGZvciBhbnkgb2YgdGhlCiAgLy8vIFt2YXJpYWJsZXNdIGhhcyBiZWVuIHJlbW92ZWQuCiAgVHlwZU1hcCByZW1vdmUoSXRlcmFibGU8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4gdmFyaWFibGVzKSB7CiAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKICAgIE1hcDxpci5WYXJpYWJsZURlY2xhcmF0aW9uLCBUYXJnZXRJbmZvPiBuZXdJbmZvTWFwID0ge307CiAgICBfdGFyZ2V0SW5mb01hcC5mb3JFYWNoKChpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBUYXJnZXRJbmZvIGluZm8pIHsKICAgICAgaWYgKCF2YXJpYWJsZXMuY29udGFpbnModmFyaWFibGUpKSB7CiAgICAgICAgbmV3SW5mb01hcFt2YXJpYWJsZV0gPSBpbmZvOwogICAgICB9IGVsc2UgewogICAgICAgIGNoYW5nZWQgPSB0cnVlOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiBjaGFuZ2VkID8gbmV3IFR5cGVNYXAobmV3SW5mb01hcCkgOiB0aGlzOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIFtUeXBlTWFwXSB3aGVyZSB0eXBlIGluZm9ybWF0aW9uIGZvciBgbm9kZS52YXJpYWJsZWAgaXMKICAvLy8gcmVkdWNlZCB0byB0aGUgcHJvbW90aW9ucyB1cGhlbGQgYnkgYW4gYXNzaWdubWVudCB0byBgbm9kZS52YXJpYWJsZWAgb2YKICAvLy8gdGhlIHN0YXRpYyBbdHlwZV0uCiAgVHlwZU1hcCByZWR1Y2UoaXIuVmFyaWFibGVTZXQgbm9kZSwgaXIuRGFydFR5cGUgdHlwZSwKICAgICAgaXIuVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCkgewogICAgTWFwPGlyLlZhcmlhYmxlRGVjbGFyYXRpb24sIFRhcmdldEluZm8+IG5ld0luZm9NYXAgPSB7fTsKICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOwogICAgX3RhcmdldEluZm9NYXAuZm9yRWFjaCgoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgVGFyZ2V0SW5mbyBpbmZvKSB7CiAgICAgIGlmICh2YXJpYWJsZSAhPSBub2RlLnZhcmlhYmxlKSB7CiAgICAgICAgbmV3SW5mb01hcFt2YXJpYWJsZV0gPSBpbmZvOwogICAgICB9IGVsc2UgaWYgKHR5cGUgIT0gbnVsbCkgewogICAgICAgIGNoYW5nZWQgPSB0cnVlOwogICAgICAgIFNldDxpci5EYXJ0VHlwZT4gbmV3VHlwZXNPZkludGVyZXN0ID0gbmV3IFNldDxpci5EYXJ0VHlwZT4oKTsKICAgICAgICBmb3IgKGlyLkRhcnRUeXBlIHR5cGVPZkludGVyZXN0IGluIGluZm8udHlwZXNPZkludGVyZXN0KSB7CiAgICAgICAgICBpZiAodHlwZUVudmlyb25tZW50LmlzU3VidHlwZU9mKHR5cGUsIHR5cGVPZkludGVyZXN0KSkgewogICAgICAgICAgICBuZXdUeXBlc09mSW50ZXJlc3QuYWRkKHR5cGVPZkludGVyZXN0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKG5ld1R5cGVzT2ZJbnRlcmVzdC5pc05vdEVtcHR5KSB7CiAgICAgICAgICBUeXBlSG9sZGVyIHR5cGVIb2xkZXJJZk5vbk51bGwgPQogICAgICAgICAgICAgIG5ldyBUeXBlSG9sZGVyKGluZm8uZGVjbGFyZWRUeXBlLCBuZXdUeXBlc09mSW50ZXJlc3QsIG51bGwpOwogICAgICAgICAgVHlwZUhvbGRlciB0eXBlSG9sZGVySWZOdWxsID0gbmV3IFR5cGVIb2xkZXIoaW5mby5kZWNsYXJlZFR5cGUsIG51bGwsCiAgICAgICAgICAgICAgbmV3IFNldDxpci5EYXJ0VHlwZT4oKS4uYWRkKGluZm8uZGVjbGFyZWRUeXBlKSk7CiAgICAgICAgICBuZXdJbmZvTWFwW3ZhcmlhYmxlXSA9IG5ldyBUYXJnZXRJbmZvKAogICAgICAgICAgICAgIGluZm8uZGVjbGFyZWRUeXBlLAogICAgICAgICAgICAgIDxUeXBlSG9sZGVyPlt0eXBlSG9sZGVySWZOb25OdWxsLCB0eXBlSG9sZGVySWZOdWxsXSwKICAgICAgICAgICAgICBuZXdUeXBlc09mSW50ZXJlc3QpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gY2hhbmdlZCA/IG5ldyBUeXBlTWFwKG5ld0luZm9NYXApIDogdGhpczsKICB9CgogIC8vLyBDb21wdXRlcyBhIHNpbmdsZSB0eXBlIHRoYXQgc291bmRseSByZXByZXNlbnRzIHRoZSBwcm9tb3RlZCB0eXBlIG9mCiAgLy8vIGBub2RlLnZhcmlhYmxlYCBvbiBhbGwgcG9zc2libGUgcGF0aHMuCiAgaXIuRGFydFR5cGUgdHlwZU9mKGlyLlZhcmlhYmxlR2V0IG5vZGUsIGlyLlR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQpIHsKICAgIFRhcmdldEluZm8gaW5mbyA9IF90YXJnZXRJbmZvTWFwW25vZGUudmFyaWFibGVdOwogICAgaXIuRGFydFR5cGUgdHlwZTsKICAgIGlmIChpbmZvICE9IG51bGwpIHsKICAgICAgdHlwZSA9IGluZm8udHlwZU9mKHR5cGVFbnZpcm9ubWVudCk7CiAgICB9CiAgICByZXR1cm4gdHlwZSA/PyBub2RlLnByb21vdGVkVHlwZSA/PyBub2RlLnZhcmlhYmxlLnR5cGU7CiAgfQoKICBTdHJpbmcgZ2V0VGV4dChTdHJpbmcgRnVuY3Rpb24oSXRlcmFibGU8aXIuRGFydFR5cGU+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ZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCc7CgppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwoKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2Fubm90YXRpb25zLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvZmllbGRfYW5hbHlzaXMuZGFydCcgc2hvdyBLRmllbGRBbmFseXNpczsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2JhY2tlbmRfdXNhZ2UuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9pbnRlcmNlcHRvcl9kYXRhLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9ub19zdWNoX21ldGhvZF9yZWdpc3RyeS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jbGFzc19oaWVyYXJjaHkuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvbWVtYmVyX3VzYWdlLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3Jlc29sdXRpb25fd29ybGRfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JzsKCmltcG9ydCAnZWxlbWVudF9tYXBfaW1wbC5kYXJ0JzsKCmNsYXNzIEtDbG9zZWRXb3JsZEltcGwgaW1wbGVtZW50cyBLQ2xvc2VkV29ybGQgewogIGZpbmFsIEtlcm5lbFRvRWxlbWVudE1hcEltcGwgZWxlbWVudE1hcDsKICBAb3ZlcnJpZGUKICBmaW5hbCBLRWxlbWVudEVudmlyb25tZW50IGVsZW1lbnRFbnZpcm9ubWVudDsKICBAb3ZlcnJpZGUKICBmaW5hbCBEYXJ0VHlwZXMgZGFydFR5cGVzOwogIEBvdmVycmlkZQogIGZpbmFsIEtDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50czsKICBAb3ZlcnJpZGUKICBmaW5hbCBOYXRpdmVEYXRhIG5hdGl2ZURhdGE7CiAgQG92ZXJyaWRlCiAgZmluYWwgSW50ZXJjZXB0b3JEYXRhIGludGVyY2VwdG9yRGF0YTsKICBAb3ZlcnJpZGUKICBmaW5hbCBCYWNrZW5kVXNhZ2UgYmFja2VuZFVzYWdlOwogIEBvdmVycmlkZQogIGZpbmFsIE5vU3VjaE1ldGhvZERhdGEgbm9TdWNoTWV0aG9kRGF0YTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgTWFwPENsYXNzRW50aXR5LCBTZXQ8Q2xhc3NFbnRpdHk+PiBtaXhpblVzZXM7CgogIEBvdmVycmlkZQogIGZpbmFsIE1hcDxDbGFzc0VudGl0eSwgU2V0PENsYXNzRW50aXR5Pj4gdHlwZXNJbXBsZW1lbnRlZEJ5U3ViY2xhc3NlczsKCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ2FuIHRoaXMgYmUgZGVyaXZlZCBmcm9tIFtDbGFzc1NldF1zPwogIGZpbmFsIFNldDxDbGFzc0VudGl0eT4gX2ltcGxlbWVudGVkQ2xhc3NlczsKCiAgQG92ZXJyaWRlCiAgZmluYWwgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBsaXZlSW5zdGFuY2VNZW1iZXJzOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IGFzc2lnbmVkSW5zdGFuY2VNZW1iZXJzOwogIEBvdmVycmlkZQogIGZpbmFsIEtGaWVsZEFuYWx5c2lzIGZpZWxkQW5hbHlzaXM7CgogIEBvdmVycmlkZQogIGZpbmFsIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBsaXZlTmF0aXZlQ2xhc3NlczsKCiAgQG92ZXJyaWRlCiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwgTWVtYmVyVXNhZ2U+IGxpdmVNZW1iZXJVc2FnZTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgQ2xhc3NIaWVyYXJjaHkgY2xhc3NIaWVyYXJjaHk7CgogIEBvdmVycmlkZQogIGZpbmFsIEFubm90YXRpb25zRGF0YSBhbm5vdGF0aW9uc0RhdGE7CgogIFJ1bnRpbWVUeXBlc05lZWQgX3J0aU5lZWQ7CgogIEtDbG9zZWRXb3JsZEltcGwodGhpcy5lbGVtZW50TWFwLAogICAgICB7Q29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCiAgICAgIHRoaXMuZWxlbWVudEVudmlyb25tZW50LAogICAgICB0aGlzLmRhcnRUeXBlcywKICAgICAgdGhpcy5jb21tb25FbGVtZW50cywKICAgICAgdGhpcy5uYXRpdmVEYXRhLAogICAgICB0aGlzLmludGVyY2VwdG9yRGF0YSwKICAgICAgdGhpcy5iYWNrZW5kVXNhZ2UsCiAgICAgIHRoaXMubm9TdWNoTWV0aG9kRGF0YSwKICAgICAgUmVzb2x1dGlvbldvcmxkQnVpbGRlciByZXNvbHV0aW9uV29ybGRCdWlsZGVyLAogICAgICBSdW50aW1lVHlwZXNOZWVkQnVpbGRlciBydGlOZWVkQnVpbGRlciwKICAgICAgdGhpcy5maWVsZEFuYWx5c2lzLAogICAgICBTZXQ8Q2xhc3NFbnRpdHk+IGltcGxlbWVudGVkQ2xhc3NlcywKICAgICAgdGhpcy5saXZlTmF0aXZlQ2xhc3NlcywKICAgICAgdGhpcy5saXZlSW5zdGFuY2VNZW1iZXJzLAogICAgICB0aGlzLmFzc2lnbmVkSW5zdGFuY2VNZW1iZXJzLAogICAgICB0aGlzLmxpdmVNZW1iZXJVc2FnZSwKICAgICAgdGhpcy5taXhpblVzZXMsCiAgICAgIHRoaXMudHlwZXNJbXBsZW1lbnRlZEJ5U3ViY2xhc3NlcywKICAgICAgdGhpcy5jbGFzc0hpZXJhcmNoeSwKICAgICAgdGhpcy5hbm5vdGF0aW9uc0RhdGF9KQogICAgICA6IF9pbXBsZW1lbnRlZENsYXNzZXMgPSBpbXBsZW1lbnRlZENsYXNzZXMgewogICAgX3J0aU5lZWQgPSBydGlOZWVkQnVpbGRlci5jb21wdXRlUnVudGltZVR5cGVzTmVlZCgKICAgICAgICByZXNvbHV0aW9uV29ybGRCdWlsZGVyLCB0aGlzLCBvcHRpb25zKTsKICB9CgogIEBvdmVycmlkZQogIFJ1bnRpbWVUeXBlc05lZWQgZ2V0IHJ0aU5lZWQgPT4gX3J0aU5lZWQ7CgogIEBvdmVycmlkZQogIGJvb2wgaXNJbXBsZW1lbnRlZChDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBfaW1wbGVtZW50ZWRDbGFzc2VzLmNvbnRhaW5zKGNscyk7CiAgfQoKICAvLy8gTmVlZGVkIGZvciB0ZXN0aW5nLgogIEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gZ2V0IHByb2Nlc3NlZE1lbWJlcnMgPT4gbGl2ZU1lbWJlclVzYWdlLmtleXM7Cn0KbwBOTjwBIgEkASEpQCsuKTUrGisoNBgBIAExKwwwDB0MKAwfDCkMIwwrAQw2AQxJAUAuAQw0AQw4DCYBDDEBDDgBDCcBDCkBHQEkIB8WGxccGR01LhorHiAkHBYpGx0zNzAEAQwsAQwoLgQBGkcCAS1wYWNrYWdlOmNvbXBpbGVyL3NyYy9rZXJuZWwva2VybmVsX3dvcmxkLmRhcnQ5c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvY29uc3RhbnRzL2NvbnN0cnVjdG9ycy5kYXJ0qwMvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmNvbnN0YW50cy5jb25zdHJ1Y3RvcnM7CgppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnIHNob3cgRmllbGRFbnRpdHk7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY2FsbF9zdHJ1Y3R1cmUuZGFydCcgc2hvdyBDYWxsU3RydWN0dXJlOwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JzsKaW1wb3J0ICdldmFsdWF0aW9uLmRhcnQnOwppbXBvcnQgJ2V4cHJlc3Npb25zLmRhcnQnOwoKZW51bSBDb25zdGFudENvbnN0cnVjdG9yS2luZCB7CiAgR0VORVJBVElWRSwKICBSRURJUkVDVElOR19HRU5FUkFUSVZFLAogIFJFRElSRUNUSU5HX0ZBQ1RPUlksCiAgRVJST05FT1VTLAp9CgpjbGFzcyBJbnN0YW5jZURhdGEgewogIGZpbmFsIE1hcDxGaWVsZEVudGl0eSwgQ29uc3RhbnRFeHByZXNzaW9uPiBmaWVsZE1hcDsKICBmaW5hbCBMaXN0PEFzc2VydENvbnN0YW50RXhwcmVzc2lvbj4gYXNzZXJ0aW9uczsKCiAgSW5zdGFuY2VEYXRhKHRoaXMuZmllbGRNYXAsIHRoaXMuYXNzZXJ0aW9ucyk7Cn0KCi8vLyBEZWZpbml0aW9uIG9mIGEgY29uc3RhbnQgY29uc3RydWN0b3IuCmFic3RyYWN0IGNsYXNzIENvbnN0YW50Q29uc3RydWN0b3IgewogIENvbnN0YW50Q29uc3RydWN0b3JLaW5kIGdldCBraW5kOwoKICAvLy8gQ29tcHV0ZXMgdGhlIHR5cGUgb2YgdGhlIGluc3RhbmNlIGNyZWF0ZWQgaW4gYSBjb25zdCBjb25zdHJ1Y3RvcgogIC8vLyBpbnZvY2F0aW9uIHdpdGggdHlwZSBbbmV3VHlwZV0uCiAgSW50ZXJmYWNlVHlwZSBjb21wdXRlSW5zdGFuY2VUeXBlKAogICAgICBFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsIEludGVyZmFjZVR5cGUgbmV3VHlwZSk7CgogIC8vLyBDb21wdXRlcyB0aGUgY29uc3RhbnQgZXhwcmVzc2lvbnMgb2YgdGhlIGZpZWxkcyBhbmQgaW5pdGlhbGl6ZXIgYXNzZXJ0aW9ucwogIC8vLyBvZiB0aGUgY3JlYXRlZCBpbnN0YW5jZSBpbiBhIGNvbnN0IGNvbnN0cnVjdG9yIGludm9jYXRpb24gd2l0aAogIC8vLyBbYXJndW1lbnRzXS4KICBJbnN0YW5jZURhdGEgY29tcHV0ZUluc3RhbmNlRGF0YShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsCiAgICAgIExpc3Q8Q29uc3RhbnRFeHByZXNzaW9uPiBhcmd1bWVudHMsIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSk7CgogIGFjY2VwdChDb25zdGFudENvbnN0cnVjdG9yVmlzaXRvciB2aXNpdG9yLCBhcmcpOwp9CgphYnN0cmFjdCBjbGFzcyBDb25zdGFudENvbnN0cnVjdG9yVmlzaXRvcjxSLCBBPiB7CiAgY29uc3QgQ29uc3RhbnRDb25zdHJ1Y3RvclZpc2l0b3IoKTsKCiAgUiB2aXNpdCgKICAgICAgY292YXJpYW50IENvbnN0YW50Q29uc3RydWN0b3IgY29uc3RhbnRDb25zdHJ1Y3RvciwgY292YXJpYW50IEEgY29udGV4dCkgewogICAgcmV0dXJuIGNvbnN0YW50Q29uc3RydWN0b3IuYWNjZXB0KHRoaXMsIGNvbnRleHQpOwogIH0KCiAgUiB2aXNpdEdlbmVyYXRpdmUoCiAgICAgIGNvdmFyaWFudCBHZW5lcmF0aXZlQ29uc3RhbnRDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciwgY292YXJpYW50IEEgYXJnKTsKICBSIHZpc2l0UmVkaXJlY3RpbmdHZW5lcmF0aXZlKAogICAgICBjb3ZhcmlhbnQgUmVkaXJlY3RpbmdHZW5lcmF0aXZlQ29uc3RhbnRDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciwKICAgICAgY292YXJpYW50IEEgYXJnKTsKICBSIHZpc2l0UmVkaXJlY3RpbmdGYWN0b3J5KAogICAgICBjb3ZhcmlhbnQgUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RhbnRDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciwKICAgICAgY292YXJpYW50IEEgYXJnKTsKICBSIHZpc2l0RXJyb25lb3VzKAogICAgICBjb3ZhcmlhbnQgRXJyb25lb3VzQ29uc3RhbnRDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciwgY292YXJpYW50IEEgYXJnKTsKfQoKLy8vIEEgZ2VuZXJhdGl2ZSBjb25zdGFudCBjb25zdHJ1Y3Rvci4KY2xhc3MgR2VuZXJhdGl2ZUNvbnN0YW50Q29uc3RydWN0b3IgaW1wbGVtZW50cyBDb25zdGFudENvbnN0cnVjdG9yIHsKICBmaW5hbCBJbnRlcmZhY2VUeXBlIHR5cGU7CiAgZmluYWwgTWFwPGR5bmFtaWMgLyppbnR8U3RyaW5nKi8sIENvbnN0YW50RXhwcmVzc2lvbj4gZGVmYXVsdFZhbHVlczsKICBmaW5hbCBNYXA8RmllbGRFbnRpdHksIENvbnN0YW50RXhwcmVzc2lvbj4gZmllbGRNYXA7CiAgZmluYWwgTGlzdDxBc3NlcnRDb25zdGFudEV4cHJlc3Npb24+IGFzc2VydGlvbnM7CiAgZmluYWwgQ29uc3RydWN0ZWRDb25zdGFudEV4cHJlc3Npb24gc3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb247CgogIEdlbmVyYXRpdmVDb25zdGFudENvbnN0cnVjdG9yKHRoaXMudHlwZSwgdGhpcy5kZWZhdWx0VmFsdWVzLCB0aGlzLmZpZWxkTWFwLAogICAgICB0aGlzLmFzc2VydGlvbnMsIHRoaXMuc3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24pOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudENvbnN0cnVjdG9yS2luZCBnZXQga2luZCA9PiBDb25zdGFudENvbnN0cnVjdG9yS2luZC5HRU5FUkFUSVZFOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGNvbXB1dGVJbnN0YW5jZVR5cGUoCiAgICAgIEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgSW50ZXJmYWNlVHlwZSBuZXdUeXBlKSB7CiAgICByZXR1cm4gZW52aXJvbm1lbnQuc3Vic3RCeUNvbnRleHQodHlwZSwgbmV3VHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnN0YW5jZURhdGEgY29tcHV0ZUluc3RhbmNlRGF0YShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsCiAgICAgIExpc3Q8Q29uc3RhbnRFeHByZXNzaW9uPiBhcmd1bWVudHMsIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSkgewogICAgTm9ybWFsaXplZEFyZ3VtZW50cyBhcmdzID0KICAgICAgICBuZXcgTm9ybWFsaXplZEFyZ3VtZW50cyhkZWZhdWx0VmFsdWVzLCBjYWxsU3RydWN0dXJlLCBhcmd1bWVudHMpOwogICAgSW5zdGFuY2VEYXRhIGFwcGxpZWRJbnN0YW5jZURhdGEgPQogICAgICAgIGFwcGx5SW5zdGFuY2VEYXRhKGVudmlyb25tZW50LCBhcmdzLCBzdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbik7CiAgICBmaWVsZE1hcC5mb3JFYWNoKChGaWVsZEVudGl0eSBmaWVsZCwgQ29uc3RhbnRFeHByZXNzaW9uIGNvbnN0YW50KSB7CiAgICAgIGFwcGxpZWRJbnN0YW5jZURhdGEuZmllbGRNYXBbZmllbGRdID0gY29uc3RhbnQuYXBwbHkoYXJncyk7CiAgICB9KTsKICAgIGZvciAoQXNzZXJ0Q29uc3RhbnRFeHByZXNzaW9uIGFzc2VydGlvbiBpbiBhc3NlcnRpb25zKSB7CiAgICAgIGFwcGxpZWRJbnN0YW5jZURhdGEuYXNzZXJ0aW9ucy5hZGQoYXNzZXJ0aW9uLmFwcGx5KGFyZ3MpKTsKICAgIH0KICAgIHJldHVybiBhcHBsaWVkSW5zdGFuY2VEYXRhOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50Q29uc3RydWN0b3JWaXNpdG9yIHZpc2l0b3IsIGFyZykgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRHZW5lcmF0aXZlKHRoaXMsIGFyZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIGludCBoYXNoID0gSGFzaGluZy5vYmplY3RIYXNoKHR5cGUpOwogICAgaGFzaCA9IEhhc2hpbmcubWFwSGFzaChkZWZhdWx0VmFsdWVzLCBoYXNoKTsKICAgIGhhc2ggPSBIYXNoaW5nLm1hcEhhc2goZmllbGRNYXAsIGhhc2gpOwogICAgcmV0dXJuIEhhc2hpbmcub2JqZWN0SGFzaChzdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbiwgaGFzaCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIEdlbmVyYXRpdmVDb25zdGFudENvbnN0cnVjdG9yKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHlwZSA9PSBvdGhlci50eXBlICYmCiAgICAgICAgc3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24gPT0gb3RoZXIuc3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24gJiYKICAgICAgICBtYXBFcXVhbHMoZGVmYXVsdFZhbHVlcywgb3RoZXIuZGVmYXVsdFZhbHVlcykgJiYKICAgICAgICBtYXBFcXVhbHMoZmllbGRNYXAsIG90aGVyLmZpZWxkTWFwKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCJ7J3R5cGUnOiAkdHlwZSIpOwogICAgZGVmYXVsdFZhbHVlcy5mb3JFYWNoKChrZXksIENvbnN0YW50RXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgICAgIHNiLndyaXRlKCIsXG4gJ2RlZmF1bHQ6JHtrZXl9JzogJHtleHByZXNzaW9uLnRvRGFydFRleHQoKX0iKTsKICAgIH0pOwogICAgZmllbGRNYXAuZm9yRWFjaCgoRmllbGRFbnRpdHkgZmllbGQsIENvbnN0YW50RXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgICAgIHNiLndyaXRlKCIsXG4gJ2ZpZWxkOiR7ZmllbGR9JzogJHtleHByZXNzaW9uLnRvRGFydFRleHQoKX0iKTsKICAgIH0pOwogICAgaWYgKHN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoIixcbiAnY29uc3RydWN0b3I6ICR7c3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24udG9EYXJ0VGV4dCgpfSIpOwogICAgfQogICAgc2Iud3JpdGUoIn0iKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgc3RhdGljIGJvb2wgbWFwRXF1YWxzKE1hcCBtYXAxLCBNYXAgbWFwMikgewogICAgaWYgKG1hcDEubGVuZ3RoICE9IG1hcDEubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICBmb3IgKHZhciBrZXkgaW4gbWFwMS5rZXlzKSB7CiAgICAgIGlmIChtYXAxW2tleV0gIT0gbWFwMltrZXldKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8vLyBDcmVhdGVzIHRoZSBmaWVsZC10by1jb25zdGFudCBtYXAgZnJvbSBhcHBseWluZyBbYXJnc10gdG8KICAvLy8gW2NvbnN0cnVjdG9ySW52b2NhdGlvbl0uIElmIFtjb25zdHJ1Y3Rvckludm9jYXRpb25dIGlzIGBudWxsYCwgYW4gZW1wdHkKICAvLy8gbWFwIGlzIGNyZWF0ZWQuIFJldHVybnMgYG51bGxgIGlmIGFuIGVycm9uZW91cyBjb25zdGFudCBjb25zdHJ1Y3RvciB3YXMKICAvLy8gZW5jb3VudGVyZWQgaW4gdGhlIHN1cGVyLWNoYWluLgogIHN0YXRpYyBJbnN0YW5jZURhdGEgYXBwbHlJbnN0YW5jZURhdGEoCiAgICAgIEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCwKICAgICAgTm9ybWFsaXplZEFyZ3VtZW50cyBhcmdzLAogICAgICBDb25zdHJ1Y3RlZENvbnN0YW50RXhwcmVzc2lvbiBjb25zdHJ1Y3Rvckludm9jYXRpb24pIHsKICAgIE1hcDxGaWVsZEVudGl0eSwgQ29uc3RhbnRFeHByZXNzaW9uPiBhcHBsaWVkRmllbGRNYXAgPQogICAgICAgIDxGaWVsZEVudGl0eSwgQ29uc3RhbnRFeHByZXNzaW9uPnt9OwogICAgTGlzdDxBc3NlcnRDb25zdGFudEV4cHJlc3Npb24+IGFwcGxpZWRBc3NlcnRpb25zID0KICAgICAgICA8QXNzZXJ0Q29uc3RhbnRFeHByZXNzaW9uPltdOwogICAgaWYgKGNvbnN0cnVjdG9ySW52b2NhdGlvbiAhPSBudWxsKSB7CiAgICAgIEluc3RhbmNlRGF0YSBpbnN0YW5jZURhdGEgPQogICAgICAgICAgY29uc3RydWN0b3JJbnZvY2F0aW9uLmNvbXB1dGVJbnN0YW5jZURhdGEoZW52aXJvbm1lbnQpOwogICAgICBpZiAoaW5zdGFuY2VEYXRhID09IG51bGwpIHsKICAgICAgICAvLyBBbiBlcnJvbmVvdXMgY29uc3RhbnQgY29uc3RydWN0b3Igd2FzIGVuY291bnRlcmVkIGluIHRoZSBzdXBlci1jaGFpbi4KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBpbnN0YW5jZURhdGEuZmllbGRNYXAKICAgICAgICAgIC5mb3JFYWNoKChGaWVsZEVudGl0eSBmaWVsZCwgQ29uc3RhbnRFeHByZXNzaW9uIGNvbnN0YW50KSB7CiAgICAgICAgYXBwbGllZEZpZWxkTWFwW2ZpZWxkXSA9IGNvbnN0YW50LmFwcGx5KGFyZ3MpOwogICAgICB9KTsKICAgICAgZm9yIChBc3NlcnRDb25zdGFudEV4cHJlc3Npb24gYXNzZXJ0aW9uIGluIGluc3RhbmNlRGF0YS5hc3NlcnRpb25zKSB7CiAgICAgICAgYXBwbGllZEFzc2VydGlvbnMuYWRkKGFzc2VydGlvbi5hcHBseShhcmdzKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgSW5zdGFuY2VEYXRhKGFwcGxpZWRGaWVsZE1hcCwgYXBwbGllZEFzc2VydGlvbnMpOwogIH0KfQoKLy8vIEEgcmVkaXJlY3RpbmcgZ2VuZXJhdGl2ZSBjb25zdGFudCBjb25zdHJ1Y3Rvci4KY2xhc3MgUmVkaXJlY3RpbmdHZW5lcmF0aXZlQ29uc3RhbnRDb25zdHJ1Y3RvciBpbXBsZW1lbnRzIENvbnN0YW50Q29uc3RydWN0b3IgewogIGZpbmFsIE1hcDxkeW5hbWljIC8qaW50fFN0cmluZyovLCBDb25zdGFudEV4cHJlc3Npb24+IGRlZmF1bHRWYWx1ZXM7CiAgZmluYWwgQ29uc3RydWN0ZWRDb25zdGFudEV4cHJlc3Npb24gdGhpc0NvbnN0cnVjdG9ySW52b2NhdGlvbjsKCiAgUmVkaXJlY3RpbmdHZW5lcmF0aXZlQ29uc3RhbnRDb25zdHJ1Y3RvcigKICAgICAgdGhpcy5kZWZhdWx0VmFsdWVzLCB0aGlzLnRoaXNDb25zdHJ1Y3Rvckludm9jYXRpb24pOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudENvbnN0cnVjdG9yS2luZCBnZXQga2luZCB7CiAgICByZXR1cm4gQ29uc3RhbnRDb25zdHJ1Y3RvcktpbmQuUkVESVJFQ1RJTkdfR0VORVJBVElWRTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgY29tcHV0ZUluc3RhbmNlVHlwZSgKICAgICAgRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50LCBJbnRlcmZhY2VUeXBlIG5ld1R5cGUpIHsKICAgIHJldHVybiBlbnZpcm9ubWVudC5zdWJzdEJ5Q29udGV4dCgKICAgICAgICB0aGlzQ29uc3RydWN0b3JJbnZvY2F0aW9uLmNvbXB1dGVJbnN0YW5jZVR5cGUoZW52aXJvbm1lbnQpLCBuZXdUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIEluc3RhbmNlRGF0YSBjb21wdXRlSW5zdGFuY2VEYXRhKEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCwKICAgICAgTGlzdDxDb25zdGFudEV4cHJlc3Npb24+IGFyZ3VtZW50cywgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlKSB7CiAgICBOb3JtYWxpemVkQXJndW1lbnRzIGFyZ3MgPQogICAgICAgIG5ldyBOb3JtYWxpemVkQXJndW1lbnRzKGRlZmF1bHRWYWx1ZXMsIGNhbGxTdHJ1Y3R1cmUsIGFyZ3VtZW50cyk7CiAgICBJbnN0YW5jZURhdGEgYXBwbGllZEluc3RhbmNlRGF0YSA9CiAgICAgICAgR2VuZXJhdGl2ZUNvbnN0YW50Q29uc3RydWN0b3IuYXBwbHlJbnN0YW5jZURhdGEoCiAgICAgICAgICAgIGVudmlyb25tZW50LCBhcmdzLCB0aGlzQ29uc3RydWN0b3JJbnZvY2F0aW9uKTsKICAgIHJldHVybiBhcHBsaWVkSW5zdGFuY2VEYXRhOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50Q29uc3RydWN0b3JWaXNpdG9yIHZpc2l0b3IsIGFyZykgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRSZWRpcmVjdGluZ0dlbmVyYXRpdmUodGhpcywgYXJnKTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgewogICAgaW50IGhhc2ggPSBIYXNoaW5nLm9iamVjdEhhc2godGhpc0NvbnN0cnVjdG9ySW52b2NhdGlvbik7CiAgICByZXR1cm4gSGFzaGluZy5tYXBIYXNoKGRlZmF1bHRWYWx1ZXMsIGhhc2gpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzISBSZWRpcmVjdGluZ0dlbmVyYXRpdmVDb25zdGFudENvbnN0cnVjdG9yKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdGhpc0NvbnN0cnVjdG9ySW52b2NhdGlvbiA9PSBvdGhlci50aGlzQ29uc3RydWN0b3JJbnZvY2F0aW9uICYmCiAgICAgICAgR2VuZXJhdGl2ZUNvbnN0YW50Q29uc3RydWN0b3IubWFwRXF1YWxzKAogICAgICAgICAgICBkZWZhdWx0VmFsdWVzLCBvdGhlci5kZWZhdWx0VmFsdWVzKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCJ7J3R5cGUnOiAke3RoaXNDb25zdHJ1Y3Rvckludm9jYXRpb24udHlwZX0iKTsKICAgIGRlZmF1bHRWYWx1ZXMuZm9yRWFjaCgoa2V5LCBDb25zdGFudEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogICAgICBzYi53cml0ZSgiLFxuICdkZWZhdWx0OiR7a2V5fSc6ICR7ZXhwcmVzc2lvbi50b0RhcnRUZXh0KCl9Iik7CiAgICB9KTsKICAgIHNiLndyaXRlKCIsXG4gJ2NvbnN0cnVjdG9yJzogJHt0aGlzQ29uc3RydWN0b3JJbnZvY2F0aW9uLnRvRGFydFRleHQoKX0iKTsKICAgIHNiLndyaXRlKCJ9Iik7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCi8vLyBBIHJlZGlyZWN0aW5nIGZhY3RvcnkgY29uc3RhbnQgY29uc3RydWN0b3IuCmNsYXNzIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0YW50Q29uc3RydWN0b3IgaW1wbGVtZW50cyBDb25zdGFudENvbnN0cnVjdG9yIHsKICBmaW5hbCBDb25zdHJ1Y3RlZENvbnN0YW50RXhwcmVzc2lvbiB0YXJnZXRDb25zdHJ1Y3Rvckludm9jYXRpb247CgogIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0YW50Q29uc3RydWN0b3IodGhpcy50YXJnZXRDb25zdHJ1Y3Rvckludm9jYXRpb24pOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudENvbnN0cnVjdG9yS2luZCBnZXQga2luZCB7CiAgICByZXR1cm4gQ29uc3RhbnRDb25zdHJ1Y3RvcktpbmQuUkVESVJFQ1RJTkdfRkFDVE9SWTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgY29tcHV0ZUluc3RhbmNlVHlwZSgKICAgICAgRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50LCBJbnRlcmZhY2VUeXBlIG5ld1R5cGUpIHsKICAgIHJldHVybiBlbnZpcm9ubWVudC5zdWJzdEJ5Q29udGV4dCgKICAgICAgICB0YXJnZXRDb25zdHJ1Y3Rvckludm9jYXRpb24uY29tcHV0ZUluc3RhbmNlVHlwZShlbnZpcm9ubWVudCksIG5ld1R5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5zdGFuY2VEYXRhIGNvbXB1dGVJbnN0YW5jZURhdGEoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50LAogICAgICBMaXN0PENvbnN0YW50RXhwcmVzc2lvbj4gYXJndW1lbnRzLCBDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUpIHsKICAgIENvbnN0YW50Q29uc3RydWN0b3IgY29uc3RhbnRDb25zdHJ1Y3RvciA9CiAgICAgICAgZW52aXJvbm1lbnQuZ2V0Q29uc3RydWN0b3JDb25zdGFudCh0YXJnZXRDb25zdHJ1Y3Rvckludm9jYXRpb24udGFyZ2V0KTsKICAgIHJldHVybiBjb25zdGFudENvbnN0cnVjdG9yLmNvbXB1dGVJbnN0YW5jZURhdGEoCiAgICAgICAgZW52aXJvbm1lbnQsIGFyZ3VtZW50cywgY2FsbFN0cnVjdHVyZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRDb25zdHJ1Y3RvclZpc2l0b3IgdmlzaXRvciwgYXJnKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFJlZGlyZWN0aW5nRmFjdG9yeSh0aGlzLCBhcmcpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICByZXR1cm4gSGFzaGluZy5vYmplY3RIYXNoKHRhcmdldENvbnN0cnVjdG9ySW52b2NhdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0YW50Q29uc3RydWN0b3IpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB0YXJnZXRDb25zdHJ1Y3Rvckludm9jYXRpb24gPT0gb3RoZXIudGFyZ2V0Q29uc3RydWN0b3JJbnZvY2F0aW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoInsiKTsKICAgIHNiLndyaXRlKCInY29uc3RydWN0b3InOiAke3RhcmdldENvbnN0cnVjdG9ySW52b2NhdGlvbi50b0RhcnRUZXh0KCl9Iik7CiAgICBzYi53cml0ZSgifSIpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgovLy8gQSBjb25zdGFudCBjb25zdHJ1Y3RvciB3aXRoIGVycm9ycy4KY2xhc3MgRXJyb25lb3VzQ29uc3RhbnRDb25zdHJ1Y3RvciBpbXBsZW1lbnRzIENvbnN0YW50Q29uc3RydWN0b3IgewogIEBvdmVycmlkZQogIENvbnN0YW50Q29uc3RydWN0b3JLaW5kIGdldCBraW5kID0+IENvbnN0YW50Q29uc3RydWN0b3JLaW5kLkVSUk9ORU9VUzsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50Q29uc3RydWN0b3JWaXNpdG9yIHZpc2l0b3IsIGFyZykgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRFcnJvbmVvdXModGhpcywgYXJnKTsKICB9CgogIEBvdmVycmlkZQogIEluc3RhbmNlRGF0YSBjb21wdXRlSW5zdGFuY2VEYXRhKEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCwKICAgICAgTGlzdDxDb25zdGFudEV4cHJlc3Npb24+IGFyZ3VtZW50cywgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgY29tcHV0ZUluc3RhbmNlVHlwZSgKICAgICAgRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50LCBJbnRlcmZhY2VUeXBlIG5ld1R5cGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICdFcnJvbmVvdXNDb25zdGFudENvbnN0cnVjdG9yLmNvbXB1dGVJbnN0YW5jZVR5cGUnKTsKICB9Cn0KgUUATk48ASgBNSE9HBobAR8OGhcNAgEVNzMBMAIBKiUkAUcmJUEBUUUTRkgBMwIBMiYBC1A2BAEVTSBGGB1DGBRMAgEnRRxHNzNCAU45AQxKAQwlQjYEAQxGSR9KJ0pIQgg9QQYgBAEMNC8EAQwVKTEsQQQBDBwtPyFKOS0EAQwWKiBBRAhKRAguUAYTGgQBLjIhJBYIBhEEAUBOTiYpKSA9Oy03JikiQiJRFQgcRjcKTDYIBkEEAgEzUEdBASw7AQwlOwQBDCVCJ04EAQxGSR9KJzk7IAQBDDQ6BAEMFT4xBAEMHC1KSzExBAEMFio8QUQIThMaBAIBME1DAUsBDCU4BAEMJUInUAQBDEZJLlA0MAQBDDQ3BAEMFTwEAQwcLUdNBAEMFioTTBMaBAIBKEQMSQEMNC4EAQxGSREEAQwlQiA9BAIBMHBhY2thZ2U6Y29tcGlsZXIvc3JjL2NvbnN0YW50cy9jb25zdHJ1Y3RvcnMuZGFydDdzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9jb25zdGFudHMvZXZhbHVhdGlvbi5kYXJ0pMUvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmNvbnN0YW50cy5ldmFsdWF0aW9uOwoKaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL2RhcnQyanMuZGFydCcgc2hvdyBMaW5rOwoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgQ29tbW9uRWxlbWVudHM7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY2FsbF9zdHJ1Y3R1cmUuZGFydCcgc2hvdyBDYWxsU3RydWN0dXJlOwppbXBvcnQgJ2NvbnN0cnVjdG9ycy5kYXJ0JzsKaW1wb3J0ICdleHByZXNzaW9ucy5kYXJ0JzsKaW1wb3J0ICd2YWx1ZXMuZGFydCc7CgovLy8gRW52aXJvbm1lbnQgdXNlZCBmb3IgZXZhbHVhdGluZyBjb25zdGFudCBleHByZXNzaW9ucy4KYWJzdHJhY3QgY2xhc3MgRXZhbHVhdGlvbkVudmlyb25tZW50IHsKICBDb21tb25FbGVtZW50cyBnZXQgY29tbW9uRWxlbWVudHM7CgogIERhcnRUeXBlcyBnZXQgdHlwZXM7CgogIC8vLyBUeXBlIGluIHRoZSBlbmNsb3NpbmcgY29uc3RydWN0ZWQKICBJbnRlcmZhY2VUeXBlIGdldCBlbmNsb3NpbmdDb25zdHJ1Y3RlZFR5cGU7CgogIC8vLyBSZWFkIGVudmlyb25tZW50cyBzdHJpbmcgcGFzc2VkIGluIHVzaW5nIHRoZSAnLURuYW1lPXZhbHVlJyBvcHRpb24uCiAgU3RyaW5nIHJlYWRGcm9tRW52aXJvbm1lbnQoU3RyaW5nIG5hbWUpOwoKICAvLy8gUmV0dXJucyB0aGUgW0NvbnN0YW50RXhwcmVzc2lvbl0gZm9yIHRoZSB2YWx1ZSBvZiB0aGUgY29uc3RhbnQgW2xvY2FsXS4KICBDb25zdGFudEV4cHJlc3Npb24gZ2V0TG9jYWxDb25zdGFudChjb3ZhcmlhbnQgTG9jYWwgbG9jYWwpOwoKICAvLy8gUmV0dXJucyB0aGUgW0NvbnN0YW50RXhwcmVzc2lvbl0gZm9yIHRoZSB2YWx1ZSBvZiB0aGUgY29uc3RhbnQgW2ZpZWxkXS4KICBDb25zdGFudEV4cHJlc3Npb24gZ2V0RmllbGRDb25zdGFudChjb3ZhcmlhbnQgRmllbGRFbnRpdHkgZmllbGQpOwoKICAvLy8gUmV0dXJucyB0aGUgW0NvbnN0YW50Q29uc3RydWN0b3JdIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbnN0YW50CiAgLy8vIFtjb25zdHJ1Y3Rvcl0uCiAgQ29uc3RhbnRDb25zdHJ1Y3RvciBnZXRDb25zdHJ1Y3RvckNvbnN0YW50KAogICAgICBjb3ZhcmlhbnQgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IpOwoKICAvLy8gUGVyZm9ybXMgdGhlIHN1YnN0aXR1dGlvbiBvZiB0aGUgdHlwZSBhcmd1bWVudHMgb2YgW3RhcmdldF0gZm9yIHRoZWlyCiAgLy8vIGNvcnJlc3BvbmRpbmcgdHlwZSB2YXJpYWJsZXMgaW4gW3R5cGVdLgogIERhcnRUeXBlIHN1YnN0QnlDb250ZXh0KAogICAgICBjb3ZhcmlhbnQgRGFydFR5cGUgYmFzZSwgY292YXJpYW50IEludGVyZmFjZVR5cGUgdGFyZ2V0KTsKCiAgLy8vIFJldHVybnMgW3R5cGVdIGluIHRoZSBjb250ZXh0IG9mIHRoZSBbZW5jbG9zaW5nQ29uc3RydWN0ZWRUeXBlXS4KICBEYXJ0VHlwZSBnZXRUeXBlSW5Db250ZXh0KERhcnRUeXBlIHR5cGUpOwoKICB2b2lkIHJlcG9ydFdhcm5pbmcoCiAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBleHByZXNzaW9uLCBNZXNzYWdlS2luZCBraW5kLCBNYXAgYXJndW1lbnRzKTsKCiAgdm9pZCByZXBvcnRFcnJvcigKICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIGV4cHJlc3Npb24sIE1lc3NhZ2VLaW5kIGtpbmQsIE1hcCBhcmd1bWVudHMpOwoKICBDb25zdGFudFZhbHVlIGV2YWx1YXRlQ29uc3RydWN0b3IoQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IsCiAgICAgIEludGVyZmFjZVR5cGUgdHlwZSwgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZSgpKTsKCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZU1hcEJvZHkoQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZSgpKTsKCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZUZpZWxkKEZpZWxkRW50aXR5IGZpZWxkLCBDb25zdGFudFZhbHVlIGV2YWx1YXRlKCkpOwoKICAvLy8gYHRydWVgIGlmIGFzc2VydGlvbnMgYXJlIGVuYWJsZWQuCiAgYm9vbCBnZXQgZW5hYmxlQXNzZXJ0aW9uczsKCiAgLy8vIElmIGB0cnVlYCwgaW1wbGljaXQgY2FzdHMgc2hvdWxkIGJlIGNoZWNrZWQuCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmNpZXMgYmV0d2VlbiBqcy1pbnRlcm9wIGNsYXNzZXMKICAvLy8gYW5kIHRoZWlyIG1ldGFkYXRhLiBGb3Igbm9uLW1ldGFkYXRhIGNvbnN0YW50cyB3ZSBhbHdheXMgY2hlY2sgdGhlIGNhc3RzLgogIGJvb2wgZ2V0IGNoZWNrQ2FzdHM7Cn0KCmFic3RyYWN0IGNsYXNzIEV2YWx1YXRpb25FbnZpcm9ubWVudEJhc2UgaW1wbGVtZW50cyBFdmFsdWF0aW9uRW52aXJvbm1lbnQgewogIExpbms8U3Bhbm5hYmxlPiBfc3Bhbm5hYmxlU3RhY2sgPSBjb25zdCBMaW5rPFNwYW5uYWJsZT4oKTsKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGVuY2xvc2luZ0NvbnN0cnVjdGVkVHlwZTsKICBmaW5hbCBTZXQ8RmllbGRFbnRpdHk+IF9jdXJyZW50bHlFdmFsdWF0ZWRGaWVsZHMgPSBuZXcgU2V0PEZpZWxkRW50aXR5PigpOwogIGZpbmFsIGJvb2wgY29uc3RhbnRSZXF1aXJlZDsKCiAgRXZhbHVhdGlvbkVudmlyb25tZW50QmFzZShTcGFubmFibGUgc3Bhbm5hYmxlLCB7dGhpcy5jb25zdGFudFJlcXVpcmVkfSkgewogICAgX3NwYW5uYWJsZVN0YWNrID0gX3NwYW5uYWJsZVN0YWNrLnByZXBlbmQoc3Bhbm5hYmxlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGNoZWNrQ2FzdHMgPT4gdHJ1ZTsKCiAgRGlhZ25vc3RpY1JlcG9ydGVyIGdldCByZXBvcnRlcjsKCiAgLy8vIFJldHVybnMgdGhlIFtTcGFubmFibGVdIHVzZWQgZm9yIHJlcG9ydGluZyBlcnJvcnMgYW5kIHdhcm5pbmdzLgogIC8vLwogIC8vLyBSZXR1cm5zIHRoZSBzZWNvbmQtdG8tbGFzdCBpbiB0aGUgc3Bhbm5hYmxlIHN0YWNrLCBpZiBhdmFpbGFibGUsIHRvIHBvaW50CiAgLy8vIHRvIHRoZSB1c2UsIHJhdGhlciB0aGFuIHRoZSBkZWNsYXJhdGlvbiwgb2YgYSBjb25zdHJ1Y3RvciBvciBmaWVsZC4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlCiAgLy8vCiAgLy8vICAgIGNvbnN0IGZvbyA9IGNvbnN0IGJvb2wuZnJvbUVudmlyb25tZW50KCJmb28iLCBkZWZhdWx0OiAwKTsKICAvLy8KICAvLy8gd2lsbCBwb2ludCB0byBgZm9vYCBpbnN0ZWFkIG9mIHRoZSBkZWNsYXJhdGlvbiBvZiBgYm9vbC5mcm9tRW52aXJvbm1lbnRgLgogIFNwYW5uYWJsZSBnZXQgX3NwYW5uYWJsZSA9PiBfc3Bhbm5hYmxlU3RhY2sudGFpbC5pc0VtcHR5CiAgICAgID8gX3NwYW5uYWJsZVN0YWNrLmhlYWQKICAgICAgOiBfc3Bhbm5hYmxlU3RhY2sudGFpbC5oZWFkOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGV2YWx1YXRlRmllbGQoRmllbGRFbnRpdHkgZmllbGQsIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoKSkgewogICAgaWYgKF9jdXJyZW50bHlFdmFsdWF0ZWRGaWVsZHMuYWRkKGZpZWxkKSkgewogICAgICBfc3Bhbm5hYmxlU3RhY2sgPSBfc3Bhbm5hYmxlU3RhY2sucHJlcGVuZChmaWVsZCk7CiAgICAgIENvbnN0YW50VmFsdWUgcmVzdWx0ID0gZXZhbHVhdGUoKTsKICAgICAgX2N1cnJlbnRseUV2YWx1YXRlZEZpZWxkcy5yZW1vdmUoZmllbGQpOwogICAgICBfc3Bhbm5hYmxlU3RhY2sgPSBfc3Bhbm5hYmxlU3RhY2sudGFpbDsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGlmIChjb25zdGFudFJlcXVpcmVkKSB7CiAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgIGZpZWxkLCBNZXNzYWdlS2luZC5DWUNMSUNfQ09NUElMRV9USU1FX0NPTlNUQU5UUyk7CiAgICB9CiAgICByZXR1cm4gbmV3IE5vbkNvbnN0YW50VmFsdWUoKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGVDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvciwKICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlLCBDb25zdGFudFZhbHVlIGV2YWx1YXRlKCkpIHsKICAgIF9zcGFubmFibGVTdGFjayA9IF9zcGFubmFibGVTdGFjay5wcmVwZW5kKGNvbnN0cnVjdG9yKTsKICAgIHZhciBvbGQgPSBlbmNsb3NpbmdDb25zdHJ1Y3RlZFR5cGU7CiAgICBlbmNsb3NpbmdDb25zdHJ1Y3RlZFR5cGUgPSB0eXBlOwogICAgQ29uc3RhbnRWYWx1ZSByZXN1bHQgPSBldmFsdWF0ZSgpOwogICAgLy8gQWxsIGNvbnN0IHNldCBsaXRlcmFscyBoYXZlIGFzIGFuIGltbWVkaWF0ZSBjaGlsZCBhIGNvbnN0IG1hcC4gVGhlIG1hcAogICAgLy8gZXZhbHVhdGUgbWV0aG9kIGNhbGxzIGV2YWx1YXRlTWFwQm9keSBhbmQgcmVzZXQgdGhpcyBmbGFnIGltbWVkaWF0ZWx5LgogICAgLy8gQmVjYXVzZSB0aGVyZSBhcmUgbm8gb3RoZXIgY2hpbGRyZW4sIHRoZSBmbGFnIGlzIGtlcHQgZmFsc2UuCiAgICBlbmNsb3NpbmdDb25zdHJ1Y3RlZFR5cGUgPSBvbGQ7CiAgICBfc3Bhbm5hYmxlU3RhY2sgPSBfc3Bhbm5hYmxlU3RhY2sudGFpbDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGV2YWx1YXRlTWFwQm9keShDb25zdGFudFZhbHVlIGV2YWx1YXRlKCkpIHsKICAgIHJldHVybiBldmFsdWF0ZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZXBvcnRFcnJvcigKICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIGV4cHJlc3Npb24sIE1lc3NhZ2VLaW5kIGtpbmQsIE1hcCBhcmd1bWVudHMpIHsKICAgIGlmIChjb25zdGFudFJlcXVpcmVkKSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFNob3VsZCBbQ29uc3RhbnRFeHByZXNzaW9uXSBoYXZlIGEgbG9jYXRpb24/CiAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZShfc3Bhbm5hYmxlLCBraW5kLCBhcmd1bWVudHMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZXBvcnRXYXJuaW5nKAogICAgICBDb25zdGFudEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgTWVzc2FnZUtpbmQga2luZCwgTWFwIGFyZ3VtZW50cykgewogICAgaWYgKGNvbnN0YW50UmVxdWlyZWQpIHsKICAgICAgcmVwb3J0ZXIucmVwb3J0V2FybmluZ01lc3NhZ2UoX3NwYW5uYWJsZSwga2luZCwgYXJndW1lbnRzKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldFR5cGVJbkNvbnRleHQoRGFydFR5cGUgdHlwZSkgewogICAgLy8gUnVubmluZyBleGFtcGxlIGZvciBjb21tZW50czoKICAgIC8vCiAgICAvLyAgICAgY2xhc3MgQTxUPiB7CiAgICAvLyAgICAgICBmaW5hbCBUIHQ7CiAgICAvLyAgICAgICBjb25zdCBBKGR5bmFtaWMgdCkgOiB0aGlzLnQgPSB0OyAvLyBpbXBsaWNpdGx5IGB0IGFzIEEuVGAKICAgIC8vICAgICB9CiAgICAvLyAgICAgY2xhc3MgQjxTPiBleHRlbmRzIEE8Uz4gewogICAgLy8gICAgICAgY29uc3QgQihkeW5hbWljIHMpIDogc3VwZXIocyk7CiAgICAvLyAgICAgfQogICAgLy8gICAgIG1haW4oKSA9PiBjb25zdCBCPG51bT4oMCk7CiAgICAvLwogICAgLy8gV2UgdmlzaXQgYHQgYXMgQS5UYCB3aGlsZSBldmFsdWF0aW5nIGBjb25zdCBCPG51bT4oMClgLgoKICAgIC8vIFRoZSBgYXNgIHR5cGUgaXMgYEEuVGAuCiAgICBEYXJ0VHlwZSB0eXBlSW5Db250ZXh0ID0gdHlwZTsKCiAgICAvLyBUaGUgZW5jbG9zaW5nIHR5cGUgaXMgYEI8bnVtPmAuCiAgICBEYXJ0VHlwZSBlbmNsb3NpbmdUeXBlID0gZW5jbG9zaW5nQ29uc3RydWN0ZWRUeXBlOwogICAgaWYgKGVuY2xvc2luZ1R5cGUgIT0gbnVsbCkgewogICAgICBDbGFzc0VudGl0eSBjb250ZXh0Q2xhc3M7CiAgICAgIHR5cGUuZm9yRWFjaFR5cGVWYXJpYWJsZSgoVHlwZVZhcmlhYmxlVHlwZSB0eXBlKSB7CiAgICAgICAgaWYgKHR5cGUuZWxlbWVudC50eXBlRGVjbGFyYXRpb24gaXMgQ2xhc3NFbnRpdHkpIHsKICAgICAgICAgIC8vIFdlIGZpbmQgYEFgIGZyb20gYEEuVGAuIFNpbmNlIHdlIGRvbid0IGhhdmUgbmVzdGVkIGNsYXNzZXMsIGNsYXNzCiAgICAgICAgICAvLyBiYXNlZCB0eXBlIHZhcmlhYmxlcyBjYW4gb25seSBjb21lIGZyb20gdGhlIHNhbWUgY2xhc3MuCiAgICAgICAgICBjb250ZXh0Q2xhc3MgPSB0eXBlLmVsZW1lbnQudHlwZURlY2xhcmF0aW9uOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGlmIChjb250ZXh0Q2xhc3MgIT0gbnVsbCkgewogICAgICAgIC8vIFRoZSBlbmNsb3NpbmcgdHlwZSBgQjxudW0+YCBhcyBhbiBpbnN0YW5jZSBvZiBgQWAgaXMgYEE8bnVtPmAuCiAgICAgICAgZW5jbG9zaW5nVHlwZSA9IHR5cGVzLmFzSW5zdGFuY2VPZihlbmNsb3NpbmdUeXBlLCBjb250ZXh0Q2xhc3MpOwogICAgICB9CiAgICAgIC8vIGBBLlRgIGluIHRoZSBjb250ZXh0IG9mIHRoZSBlbmNsb3NpbmcgdHlwZSBgQTxudW0+YCBpcyBgbnVtYC4KICAgICAgdHlwZUluQ29udGV4dCA9IGVuY2xvc2luZ1R5cGUgIT0gbnVsbAogICAgICAgICAgPyBzdWJzdEJ5Q29udGV4dCh0eXBlSW5Db250ZXh0LCBlbmNsb3NpbmdUeXBlKQogICAgICAgICAgOiB0eXBlSW5Db250ZXh0OwogICAgfQogICAgcmV0dXJuIHR5cGVJbkNvbnRleHQ7CiAgfQp9CgovLy8gVGhlIG5vcm1hbGl6ZWQgYXJndW1lbnRzIHBhc3NlZCB0byBhIGNvbnN0IGNvbnN0cnVjdG9yIGNvbXB1dGVkIGZyb20gdGhlCi8vLyBhY3R1YWwgW2FyZ3VtZW50c10gYW5kIHRoZSBbZGVmYXVsdFZhbHVlc10gb2YgdGhlIGNhbGxlZCBjb25zdHJ1cmN0b3IuCmNsYXNzIE5vcm1hbGl6ZWRBcmd1bWVudHMgewogIGZpbmFsIE1hcDxkeW5hbWljIC8qaW50fFN0cmluZyovLCBDb25zdGFudEV4cHJlc3Npb24+IGRlZmF1bHRWYWx1ZXM7CiAgZmluYWwgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlOwogIGZpbmFsIExpc3Q8Q29uc3RhbnRFeHByZXNzaW9uPiBhcmd1bWVudHM7CgogIE5vcm1hbGl6ZWRBcmd1bWVudHModGhpcy5kZWZhdWx0VmFsdWVzLCB0aGlzLmNhbGxTdHJ1Y3R1cmUsIHRoaXMuYXJndW1lbnRzKTsKCiAgLy8vIFJldHVybnMgdGhlIG5vcm1hbGl6ZWQgbmFtZWQgYXJndW1lbnQgW25hbWVdLgogIENvbnN0YW50RXhwcmVzc2lvbiBnZXROYW1lZEFyZ3VtZW50KFN0cmluZyBuYW1lKSB7CiAgICBpbnQgaW5kZXggPSBjYWxsU3RydWN0dXJlLm5hbWVkQXJndW1lbnRzLmluZGV4T2YobmFtZSk7CiAgICBpZiAoaW5kZXggPT0gLTEpIHsKICAgICAgLy8gVGhlIG5hbWVkIGFyZ3VtZW50IGlzIG5vdCBwcm92aWRlZC4KICAgICAgYXNzZXJ0KAogICAgICAgICAgZGVmYXVsdFZhbHVlc1tuYW1lXSAhPSBudWxsLAogICAgICAgICAgZmFpbGVkQXQoQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICAgICAgICAiTm8gZGVmYXVsdCB2YWx1ZSBmb3IgbmFtZWQgYXJndW1lbnQgJyRuYW1lJyBpbiAkdGhpcy4iKSk7CiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVzW25hbWVdOwogICAgfQogICAgQ29uc3RhbnRFeHByZXNzaW9uIHZhbHVlID0KICAgICAgICBhcmd1bWVudHNbaW5kZXggKyBjYWxsU3RydWN0dXJlLnBvc2l0aW9uYWxBcmd1bWVudENvdW50XTsKICAgIGFzc2VydCgKICAgICAgICB2YWx1ZSAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgICAgICJObyB2YWx1ZSBmb3IgbmFtZWQgYXJndW1lbnQgJyRuYW1lJyBpbiAkdGhpcy4iKSk7CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgbm9ybWFsaXplZCBbaW5kZXhddGggcG9zaXRpb25hbCBhcmd1bWVudC4KICBDb25zdGFudEV4cHJlc3Npb24gZ2V0UG9zaXRpb25hbEFyZ3VtZW50KGludCBpbmRleCkgewogICAgaWYgKGluZGV4ID49IGNhbGxTdHJ1Y3R1cmUucG9zaXRpb25hbEFyZ3VtZW50Q291bnQpIHsKICAgICAgLy8gVGhlIHBvc2l0aW9uYWwgYXJndW1lbnQgaXMgbm90IHByb3ZpZGVkLgogICAgICBhc3NlcnQoCiAgICAgICAgICBkZWZhdWx0VmFsdWVzW2luZGV4XSAhPSBudWxsLAogICAgICAgICAgZmFpbGVkQXQoQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICAgICAgICAiTm8gZGVmYXVsdCB2YWx1ZSBmb3IgcG9zaXRpb25hbCBhcmd1bWVudCAkaW5kZXggaW4gJHRoaXMuIikpOwogICAgICByZXR1cm4gZGVmYXVsdFZhbHVlc1tpbmRleF07CiAgICB9CiAgICBDb25zdGFudEV4cHJlc3Npb24gdmFsdWUgPSBhcmd1bWVudHNbaW5kZXhdOwogICAgYXNzZXJ0KAogICAgICAgIHZhbHVlICE9IG51bGwsCiAgICAgICAgZmFpbGVkQXQoQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICAgICAgIk5vIHZhbHVlIGZvciBwb3NpdGlvbmFsIGFyZ3VtZW50ICRpbmRleCBpbiAkdGhpcy4iKSk7CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnTm9ybWFsaXplZEFyZ3VtZW50c1snKTsKICAgIHNiLndyaXRlKCdkZWZhdWx0VmFsdWVzPXsnKTsKICAgIGJvb2wgbmVlZHNDb21tYSA9IGZhbHNlOwogICAgZGVmYXVsdFZhbHVlcy5mb3JFYWNoKCh2YXIga2V5LCBDb25zdGFudEV4cHJlc3Npb24gdmFsdWUpIHsKICAgICAgaWYgKG5lZWRzQ29tbWEpIHsKICAgICAgICBzYi53cml0ZSgnLCcpOwogICAgICB9CiAgICAgIGlmIChrZXkgaXMgU3RyaW5nKSB7CiAgICAgICAgc2Iud3JpdGUoJyInKTsKICAgICAgICBzYi53cml0ZShrZXkpOwogICAgICAgIHNiLndyaXRlKCciJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2Iud3JpdGUoa2V5KTsKICAgICAgfQogICAgICBzYi53cml0ZSgnOicpOwogICAgICBzYi53cml0ZSh2YWx1ZS50b1N0cnVjdHVyZWRUZXh0KCkpOwogICAgICBuZWVkc0NvbW1hID0gdHJ1ZTsKICAgIH0pOwogICAgc2Iud3JpdGUoJ30sY2FsbFN0cnVjdHVyZT0nKTsKICAgIHNiLndyaXRlKGNhbGxTdHJ1Y3R1cmUpOwogICAgc2Iud3JpdGUoJyxhcmd1bWVudHM9WycpOwogICAgYXJndW1lbnRzLmZvckVhY2goKENvbnN0YW50RXhwcmVzc2lvbiB2YWx1ZSkgewogICAgICBpZiAobmVlZHNDb21tYSkgewogICAgICAgIHNiLndyaXRlKCcsJyk7CiAgICAgIH0KICAgICAgc2Iud3JpdGUodmFsdWUudG9TdHJ1Y3R1cmVkVGV4dCgpKTsKICAgICAgbmVlZHNDb21tYSA9IHRydWU7CiAgICB9KTsKICAgIHNiLndyaXRlKCddXScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CoEYAE5OPAEmAUQBGTYkIT0cGxYBOiclARcBKC4BSisBTj4BTkQBRhUuMAFMLhtAAUcsARZHARRHAUM1ATsBTAEoHQEzBk1QFwIBTD0MKk0fAUw6BAEMHwEjAUYGUEoGEwZEBlA7HSMBDE0wOCkvLhUGHCM9BiMEAQxDNjwoJSdOTkQkLBMEAQw8FwQBDBRIHEtABgQBDBZIHEIGBAEMLSUHGBhHDSUsDSYHPwEfIwEnNyEgOTtPRTcKCiJKSQhHLDkbBhoEAgFNSxxHJSwBTwE0NTwXLQ4nLkkiBh9CDBcsPxIEATw4OjIOKC5NIwYxDBcsQxIEAQwWKiYhHUAYFwgbFxcXDxcIFSoZCCIdHjMYFwgqGQgUGgQCAS5wYWNrYWdlOmNvbXBpbGVyL3NyYy9jb25zdGFudHMvZXZhbHVhdGlvbi5kYXJ0L3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9uYW1lcy5kYXJ0hlYvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmcm9udF9lbmQuc3JjLmZhc3RhLm5hbWVzOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBOYW1lOwoKZmluYWwgTmFtZSBhbXBlcnNhbmROYW1lID0gbmV3IE5hbWUoIiYiKTsKCmZpbmFsIE5hbWUgYmFyTmFtZSA9IG5ldyBOYW1lKCJ8Iik7CgpmaW5hbCBOYW1lIGNhbGxOYW1lID0gbmV3IE5hbWUoImNhbGwiKTsKCmZpbmFsIE5hbWUgY2FyZXROYW1lID0gbmV3IE5hbWUoIl4iKTsKCmZpbmFsIE5hbWUgZGl2aXNpb25OYW1lID0gbmV3IE5hbWUoIi8iKTsKCmZpbmFsIE5hbWUgZG91YmxlQW1wZXJzYW5kTmFtZSA9IG5ldyBOYW1lKCImJiIpOwoKZmluYWwgTmFtZSBkb3VibGVCYXJOYW1lID0gbmV3IE5hbWUoInx8Iik7CgpmaW5hbCBOYW1lIGRvdWJsZVF1ZXN0aW9uTmFtZSA9IG5ldyBOYW1lKCI/PyIpOwoKZmluYWwgTmFtZSBlbXB0eU5hbWUgPSBuZXcgTmFtZSgiIik7CgpmaW5hbCBOYW1lIGVxdWFsc05hbWUgPSBuZXcgTmFtZSgnPT0nKTsKCmZpbmFsIE5hbWUgZ3JlYXRlclRoYW5OYW1lID0gbmV3IE5hbWUoIj4iKTsKCmZpbmFsIE5hbWUgZ3JlYXRlclRoYW5PckVxdWFsc05hbWUgPSBuZXcgTmFtZSgiPj0iKTsKCmZpbmFsIE5hbWUgaWRlbnRpY2FsTmFtZSA9IG5ldyBOYW1lKCJpZGVudGljYWwiKTsKCmZpbmFsIE5hbWUgaW5kZXhHZXROYW1lID0gbmV3IE5hbWUoIltdIik7CgpmaW5hbCBOYW1lIGluZGV4U2V0TmFtZSA9IG5ldyBOYW1lKCJbXT0iKTsKCmZpbmFsIE5hbWUgbGVmdFNoaWZ0TmFtZSA9IG5ldyBOYW1lKCI8PCIpOwoKZmluYWwgTmFtZSBsZW5ndGhOYW1lID0gbmV3IE5hbWUoImxlbmd0aCIpOwoKZmluYWwgTmFtZSBsZXNzVGhhbk5hbWUgPSBuZXcgTmFtZSgiPCIpOwoKZmluYWwgTmFtZSBsZXNzVGhhbk9yRXF1YWxzTmFtZSA9IG5ldyBOYW1lKCI8PSIpOwoKZmluYWwgTmFtZSBtaW51c05hbWUgPSBuZXcgTmFtZSgiLSIpOwoKZmluYWwgTmFtZSBtdWx0aXBseU5hbWUgPSBuZXcgTmFtZSgiKiIpOwoKZmluYWwgTmFtZSBtdXN0YWNoZU5hbWUgPSBuZXcgTmFtZSgifi8iKTsKCmZpbmFsIE5hbWUgbmVnYXRpb25OYW1lID0gbmV3IE5hbWUoIiEiKTsKCmZpbmFsIE5hbWUgbm9TdWNoTWV0aG9kTmFtZSA9IG5ldyBOYW1lKCJub1N1Y2hNZXRob2QiKTsKCmZpbmFsIE5hbWUgcGVyY2VudE5hbWUgPSBuZXcgTmFtZSgiJSIpOwoKZmluYWwgTmFtZSBwbHVzTmFtZSA9IG5ldyBOYW1lKCIrIik7CgpmaW5hbCBOYW1lIHJpZ2h0U2hpZnROYW1lID0gbmV3IE5hbWUoIj4+Iik7CgpmaW5hbCBOYW1lIHRyaXBsZVNoaWZ0TmFtZSA9IG5ldyBOYW1lKCI+Pj4iKTsKCmZpbmFsIE5hbWUgdGlsZGVOYW1lID0gbmV3IE5hbWUoIn4iKTsKCmZpbmFsIE5hbWUgdW5hcnlNaW51c05hbWUgPSBuZXcgTmFtZSgidW5hcnktIik7CkUATk48ASMBLAEqASQBKAEmASkBMQErATABJQEoASwBNQEyASoBKwErASwBKQEyASYBKQEqASkBOAEoASUBLAEuASYBMAEmcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL25hbWVzLmRhcnRRc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL3R5cGVfY29uc3RyYWludF9nYXRoZXJlci5kYXJ0wABKlC8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UubWQgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQ2xhc3MsCiAgICAgICAgRGFydFR5cGUsCiAgICAgICAgRHluYW1pY1R5cGUsCiAgICAgICAgRnVuY3Rpb25UeXBlLAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgTWVtYmVyLAogICAgICAgIE5hbWUsCiAgICAgICAgTmFtZWRUeXBlLAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBUeXBlUGFyYW1ldGVyLAogICAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlLAogICAgICAgIFZvaWRUeXBlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgc2hvdyBzdWJzdGl0dXRlLCBTdWJzdGl0dXRpb247CgppbXBvcnQgJ3R5cGVfc2NoZW1hLmRhcnQnIHNob3cgVW5rbm93blR5cGU7CgppbXBvcnQgJ3R5cGVfc2NoZW1hX2Vudmlyb25tZW50LmRhcnQnCiAgICBzaG93IFR5cGVDb25zdHJhaW50LCBUeXBlU2NoZW1hRW52aXJvbm1lbnQsIHN1YnN0aXR1dGVUeXBlUGFyYW1zOwoKaW1wb3J0ICcuLi9uYW1lcy5kYXJ0JyBzaG93IGNhbGxOYW1lOwoKaW1wb3J0ICd0eXBlX3NjaGVtYS5kYXJ0JzsKCmltcG9ydCAndHlwZV9zY2hlbWFfZW52aXJvbm1lbnQuZGFydCc7CgovLy8gQ3JlYXRlcyBhIGNvbGxlY3Rpb24gb2YgW1R5cGVDb25zdHJhaW50XXMgY29ycmVzcG9uZGluZyB0byB0eXBlIHBhcmFtZXRlcnMsCi8vLyBiYXNlZCBvbiBhbiBhdHRlbXB0IHRvIG1ha2Ugb25lIHR5cGUgc2NoZW1hIGEgc3VidHlwZSBvZiBhbm90aGVyLgphYnN0cmFjdCBjbGFzcyBUeXBlQ29uc3RyYWludEdhdGhlcmVyIHsKICBmaW5hbCBfcHJvdG9Db25zdHJhaW50cyA9IDxfUHJvdG9Db25zdHJhaW50PltdOwoKICBmaW5hbCBMaXN0PFR5cGVQYXJhbWV0ZXI+IF9wYXJhbWV0ZXJzVG9Db25zdHJhaW47CgogIC8vLyBDcmVhdGVzIGEgW1R5cGVDb25zdHJhaW50R2F0aGVyZXJdIHdoaWNoIGlzIHByZXBhcmVkIHRvIGdhdGhlciB0eXBlCiAgLy8vIGNvbnN0cmFpbnRzIGZvciB0aGUgZ2l2ZW4gW3R5cGVQYXJhbWV0ZXJzXS4KICBUeXBlQ29uc3RyYWludEdhdGhlcmVyLnN1YmNsYXNzaW5nKEl0ZXJhYmxlPFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKQogICAgICA6IF9wYXJhbWV0ZXJzVG9Db25zdHJhaW4gPSB0eXBlUGFyYW1ldGVycy50b0xpc3QoKTsKCiAgZmFjdG9yeSBUeXBlQ29uc3RyYWludEdhdGhlcmVyKFR5cGVTY2hlbWFFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwKICAgICAgSXRlcmFibGU8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMpIHsKICAgIHJldHVybiBuZXcgVHlwZVNjaGVtYUNvbnN0cmFpbnRHYXRoZXJlcihlbnZpcm9ubWVudCwgdHlwZVBhcmFtZXRlcnMpOwogIH0KCiAgQ2xhc3MgZ2V0IG9iamVjdENsYXNzOwoKICBDbGFzcyBnZXQgZnVuY3Rpb25DbGFzczsKCiAgQ2xhc3MgZ2V0IGZ1dHVyZU9yQ2xhc3M7CgogIENsYXNzIGdldCBudWxsQ2xhc3M7CgogIHZvaWQgYWRkVXBwZXJCb3VuZChUeXBlQ29uc3RyYWludCBjb25zdHJhaW50LCBEYXJ0VHlwZSB1cHBlcik7CgogIHZvaWQgYWRkTG93ZXJCb3VuZChUeXBlQ29uc3RyYWludCBjb25zdHJhaW50LCBEYXJ0VHlwZSBsb3dlcik7CgogIE1lbWJlciBnZXRJbnRlcmZhY2VNZW1iZXIoQ2xhc3MgY2xhc3NfLCBOYW1lIG5hbWUsIHtib29sIHNldHRlcjogZmFsc2V9KTsKCiAgSW50ZXJmYWNlVHlwZSBnZXRUeXBlQXNJbnN0YW5jZU9mKEludGVyZmFjZVR5cGUgdHlwZSwgQ2xhc3Mgc3VwZXJjbGFzcyk7CgogIEludGVyZmFjZVR5cGUgZnV0dXJlVHlwZShEYXJ0VHlwZSB0eXBlKTsKCiAgLy8vIFJldHVybnMgdGhlIHNldCBvZiB0eXBlIGNvbnN0cmFpbnRzIHRoYXQgd2FzIGdhdGhlcmVkLgogIE1hcDxUeXBlUGFyYW1ldGVyLCBUeXBlQ29uc3RyYWludD4gY29tcHV0ZUNvbnN0cmFpbnRzKCkgewogICAgdmFyIHJlc3VsdCA9IDxUeXBlUGFyYW1ldGVyLCBUeXBlQ29uc3RyYWludD57fTsKICAgIGZvciAodmFyIHBhcmFtZXRlciBpbiBfcGFyYW1ldGVyc1RvQ29uc3RyYWluKSB7CiAgICAgIHJlc3VsdFtwYXJhbWV0ZXJdID0gbmV3IFR5cGVDb25zdHJhaW50KCk7CiAgICB9CiAgICBmb3IgKHZhciBwcm90b0NvbnN0cmFpbnQgaW4gX3Byb3RvQ29uc3RyYWludHMpIHsKICAgICAgaWYgKHByb3RvQ29uc3RyYWludC5pc1VwcGVyKSB7CiAgICAgICAgYWRkVXBwZXJCb3VuZChyZXN1bHRbcHJvdG9Db25zdHJhaW50LnBhcmFtZXRlcl0sIHByb3RvQ29uc3RyYWludC5ib3VuZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWRkTG93ZXJCb3VuZChyZXN1bHRbcHJvdG9Db25zdHJhaW50LnBhcmFtZXRlcl0sIHByb3RvQ29uc3RyYWludC5ib3VuZCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gVHJpZXMgdG8gbWF0Y2ggW3N1YnR5cGVdIGFnYWluc3QgW3N1cGVydHlwZV0uCiAgLy8vCiAgLy8vIElmIHRoZSBtYXRjaCBzdWNjZWVkcywgdGhlIHJlc3VsdGluZyB0eXBlIGNvbnN0cmFpbnRzIGFyZSByZWNvcmRlZCBmb3IKICAvLy8gbGF0ZXIgdXNlIGJ5IFtjb21wdXRlQ29uc3RyYWludHNdLiAgSWYgdGhlIG1hdGNoIGZhaWxzLCB0aGUgc2V0IG9mIHR5cGUKICAvLy8gY29uc3RyYWludHMgaXMgdW5jaGFuZ2VkLgogIGJvb2wgdHJ5U3VidHlwZU1hdGNoKERhcnRUeXBlIHN1YnR5cGUsIERhcnRUeXBlIHN1cGVydHlwZSkgewogICAgaW50IG9sZFByb3RvQ29uc3RyYWludHNMZW5ndGggPSBfcHJvdG9Db25zdHJhaW50cy5sZW5ndGg7CiAgICBib29sIGlzTWF0Y2ggPSBfaXNTdWJ0eXBlTWF0Y2goc3VidHlwZSwgc3VwZXJ0eXBlKTsKICAgIGlmICghaXNNYXRjaCkgewogICAgICBfcHJvdG9Db25zdHJhaW50cy5sZW5ndGggPSBvbGRQcm90b0NvbnN0cmFpbnRzTGVuZ3RoOwogICAgfQogICAgcmV0dXJuIGlzTWF0Y2g7CiAgfQoKICB2b2lkIF9jb25zdHJhaW5Mb3dlcihUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgRGFydFR5cGUgbG93ZXIpIHsKICAgIF9wcm90b0NvbnN0cmFpbnRzLmFkZChuZXcgX1Byb3RvQ29uc3RyYWludC5sb3dlcihwYXJhbWV0ZXIsIGxvd2VyKSk7CiAgfQoKICB2b2lkIF9jb25zdHJhaW5VcHBlcihUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgRGFydFR5cGUgdXBwZXIpIHsKICAgIF9wcm90b0NvbnN0cmFpbnRzLmFkZChuZXcgX1Byb3RvQ29uc3RyYWludC51cHBlcihwYXJhbWV0ZXIsIHVwcGVyKSk7CiAgfQoKICBib29sIF9pc0Z1bmN0aW9uU3VidHlwZU1hdGNoKEZ1bmN0aW9uVHlwZSBzdWJ0eXBlLCBGdW5jdGlvblR5cGUgc3VwZXJ0eXBlKSB7CiAgICAvLyBBIGZ1bmN0aW9uIHR5cGUgYChNMCwuLi4sIE1uLCBbTXtuKzF9LCAuLi4sIE1tXSkgLT4gUjBgIGlzIGEgc3VidHlwZQogICAgLy8gbWF0Y2ggZm9yIGEgZnVuY3Rpb24gdHlwZSBgKE4wLC4uLiwgTmssIFtOe2srMX0sIC4uLiwgTnJdKSAtPiBSMWAgd2l0aAogICAgLy8gcmVzcGVjdCB0byBgTGAgdW5kZXIgY29uc3RyYWludHMgYEMwICsgLi4uICsgQ3IgKyBDYAogICAgLy8gLSBJZiBgUjBgIGlzIGEgc3VidHlwZSBtYXRjaCBmb3IgYSB0eXBlIGBSMWAgd2l0aCByZXNwZWN0IHRvIGBMYCB1bmRlcgogICAgLy8gICBjb25zdHJhaW50cyBgQ2A6CiAgICAvLyAtIElmIGBuIDw9IGtgIGFuZCBgciA8PSBtYC4KICAgIC8vIC0gQW5kIGZvciBgaWAgaW4gYDAuLi5yYCwgYE5pYCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBNaWAgd2l0aCByZXNwZWN0CiAgICAvLyAgIHRvIGBMYCB1bmRlciBjb25zdHJhaW50cyBgQ2lgLgogICAgLy8gRnVuY3Rpb24gdHlwZXMgd2l0aCBuYW1lZCBwYXJhbWV0ZXJzIGFyZSB0cmVhdGVkIGFuYWxvZ291c2x5IHRvIHRoZQogICAgLy8gcG9zaXRpb25hbCBwYXJhbWV0ZXIgY2FzZSBhYm92ZS4KICAgIC8vIEEgZ2VuZXJpYyBmdW5jdGlvbiB0eXBlIGA8VDAgZXh0ZW5kcyBCMCwgLi4uLCBUbiBleHRlbmRzIEJuPkYwYCBpcyBhCiAgICAvLyBzdWJ0eXBlIG1hdGNoIGZvciBhIGdlbmVyaWMgZnVuY3Rpb24gdHlwZSBgPFMwIGV4dGVuZHMgQjAsIC4uLiwgU24KICAgIC8vIGV4dGVuZHMgQm4+RjFgIHdpdGggcmVzcGVjdCB0byBgTGAgdW5kZXIgY29uc3RyYWludHMgYENsYDoKICAgIC8vIC0gSWYgYEYwW1owL1QwLCAuLi4sIFpuL1RuXWAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBgRjBbWjAvUzAsIC4uLiwKICAgIC8vICAgWm4vU25dYCB3aXRoIHJlc3BlY3QgdG8gYExgIHVuZGVyIGNvbnN0cmFpbnRzIGBDYCwgd2hlcmUgZWFjaCBgWmlgIGlzIGEKICAgIC8vICAgZnJlc2ggdHlwZSB2YXJpYWJsZSB3aXRoIGJvdW5kIGBCaWAuCiAgICAvLyAtIEFuZCBgQ2xgIGlzIGBDYCB3aXRoIGVhY2ggY29uc3RyYWludCByZXBsYWNlZCB3aXRoIGl0cyBjbG9zdXJlIHdpdGgKICAgIC8vICAgcmVzcGVjdCB0byBgW1owLCAuLi4sIFpuXWAuCiAgICBpZiAoc3VidHlwZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50ID4gc3VwZXJ0eXBlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHN1YnR5cGUucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoIDwKICAgICAgICBzdXBlcnR5cGUucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChzdWJ0eXBlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCAhPSBzdXBlcnR5cGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChzdWJ0eXBlLnR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgdmFyIHN1YnR5cGVTdWJzdGl0dXRpb24gPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICAgIHZhciBzdXBlcnR5cGVTdWJzdGl0dXRpb24gPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICAgIHZhciBmcmVzaFR5cGVWYXJpYWJsZXMgPSA8VHlwZVBhcmFtZXRlcj5bXTsKICAgICAgaWYgKCFfbWF0Y2hUeXBlRm9ybWFscyhzdWJ0eXBlLnR5cGVQYXJhbWV0ZXJzLCBzdXBlcnR5cGUudHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICBzdWJ0eXBlU3Vic3RpdHV0aW9uLCBzdXBlcnR5cGVTdWJzdGl0dXRpb24sIGZyZXNoVHlwZVZhcmlhYmxlcykpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIHN1YnR5cGUgPSBzdWJzdGl0dXRlVHlwZVBhcmFtcygKICAgICAgICAgIHN1YnR5cGUsIHN1YnR5cGVTdWJzdGl0dXRpb24sIGZyZXNoVHlwZVZhcmlhYmxlcyk7CiAgICAgIHN1cGVydHlwZSA9IHN1YnN0aXR1dGVUeXBlUGFyYW1zKAogICAgICAgICAgc3VwZXJ0eXBlLCBzdXBlcnR5cGVTdWJzdGl0dXRpb24sIGZyZXNoVHlwZVZhcmlhYmxlcyk7CiAgICB9CgogICAgLy8gVGVzdCB0aGUgcmV0dXJuIHR5cGVzLgogICAgaWYgKHN1cGVydHlwZS5yZXR1cm5UeXBlIGlzISBWb2lkVHlwZSAmJgogICAgICAgICFfaXNTdWJ0eXBlTWF0Y2goc3VidHlwZS5yZXR1cm5UeXBlLCBzdXBlcnR5cGUucmV0dXJuVHlwZSkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIFRlc3QgdGhlIHBhcmFtZXRlciB0eXBlcy4KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJ0eXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBzdXBlcnR5cGVQYXJhbWV0ZXIgPSBzdXBlcnR5cGUucG9zaXRpb25hbFBhcmFtZXRlcnNbaV07CiAgICAgIHZhciBzdWJ0eXBlUGFyYW1ldGVyID0gc3VidHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICAgICAgLy8gVGVybWluYXRpb246IEJvdGggdHlwZXMgc2hyaW5rIGluIHNpemUuCiAgICAgIGlmICghX2lzU3VidHlwZU1hdGNoKHN1cGVydHlwZVBhcmFtZXRlciwgc3VidHlwZVBhcmFtZXRlcikpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGludCBzdWJ0eXBlTmFtZUluZGV4ID0gMDsKICAgIGZvciAoTmFtZWRUeXBlIHN1cGVydHlwZVBhcmFtZXRlciBpbiBzdXBlcnR5cGUubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgIHdoaWxlIChzdWJ0eXBlTmFtZUluZGV4IDwgc3VidHlwZS5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoICYmCiAgICAgICAgICBzdWJ0eXBlLm5hbWVkUGFyYW1ldGVyc1tzdWJ0eXBlTmFtZUluZGV4XS5uYW1lICE9CiAgICAgICAgICAgICAgc3VwZXJ0eXBlUGFyYW1ldGVyLm5hbWUpIHsKICAgICAgICArK3N1YnR5cGVOYW1lSW5kZXg7CiAgICAgIH0KICAgICAgaWYgKHN1YnR5cGVOYW1lSW5kZXggPT0gc3VidHlwZS5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICAgIE5hbWVkVHlwZSBzdWJ0eXBlUGFyYW1ldGVyID0gc3VidHlwZS5uYW1lZFBhcmFtZXRlcnNbc3VidHlwZU5hbWVJbmRleF07CiAgICAgIC8vIFRlcm1pbmF0aW9uOiBCb3RoIHR5cGVzIHNocmluayBpbiBzaXplLgogICAgICBpZiAoIV9pc1N1YnR5cGVNYXRjaChzdXBlcnR5cGVQYXJhbWV0ZXIudHlwZSwgc3VidHlwZVBhcmFtZXRlci50eXBlKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBib29sIF9pc0ludGVyZmFjZVN1YnR5cGVNYXRjaCgKICAgICAgSW50ZXJmYWNlVHlwZSBzdWJ0eXBlLCBJbnRlcmZhY2VUeXBlIHN1cGVydHlwZSkgewogICAgLy8gQSB0eXBlIGBQPE0wLCAuLi4sIE1rPmAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBgUDxOMCwgLi4uLCBOaz5gIHdpdGgKICAgIC8vIHJlc3BlY3QgdG8gYExgIHVuZGVyIGNvbnN0cmFpbnRzIGBDMCArIC4uLiArIENrYDoKICAgIC8vIC0gSWYgYE1pYCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBOaWAgd2l0aCByZXNwZWN0IHRvIGBMYCB1bmRlcgogICAgLy8gICBjb25zdHJhaW50cyBgQ2lgLgogICAgLy8gQSB0eXBlIGBQPE0wLCAuLi4sIE1rPmAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBgUTxOMCwgLi4uLCBOaj5gIHdpdGgKICAgIC8vIHJlc3BlY3QgdG8gYExgIHVuZGVyIGNvbnN0cmFpbnRzIGBDYDoKICAgIC8vIC0gSWYgYFI8QjAsIC4uLiwgQmo+YCBpcyB0aGUgc3VwZXJjbGFzcyBvZiBgUDxNMCwgLi4uLCBNaz5gIGFuZCBgUjxCMCwKICAgIC8vICAgLi4uLCBCaj5gIGlzIGEgc3VidHlwZSBtYXRjaCBmb3IgYFE8TjAsIC4uLiwgTmo+YCB3aXRoIHJlc3BlY3QgdG8gYExgCiAgICAvLyAgIHVuZGVyIGNvbnN0cmFpbnRzIGBDYC4KICAgIC8vIC0gT3IgYFI8QjAsIC4uLiwgQmo+YCBpcyBvbmUgb2YgdGhlIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgYFA8TTAsIC4uLiwKICAgIC8vICAgTWs+YCAoY29uc2lkZXJlZCBpbiBsZXhpY2FsIG9yZGVyKSBhbmQgYFI8QjAsIC4uLiwgQmo+YCBpcyBhIHN1YnR5cGUKICAgIC8vICAgbWF0Y2ggZm9yIGBRPE4wLCAuLi4sIE5qPmAgd2l0aCByZXNwZWN0IHRvIGBMYCB1bmRlciBjb25zdHJhaW50cyBgQ2AuCiAgICAvLyAtIE9yIGBSPEIwLCAuLi4sIEJqPmAgaXMgYSBtaXhpbiBpbnRvIGBQPE0wLCAuLi4sIE1rPmAgKGNvbnNpZGVyZWQgaW4KICAgIC8vICAgbGV4aWNhbCBvcmRlcikgYW5kIGBSPEIwLCAuLi4sIEJqPmAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBgUTxOMCwgLi4uLAogICAgLy8gICBOaj5gIHdpdGggcmVzcGVjdCB0byBgTGAgdW5kZXIgY29uc3RyYWludHMgYENgLgoKICAgIC8vIE5vdGUgdGhhdCBzaW5jZSBrZXJuZWwgcmVxdWlyZXMgdGhhdCBubyBjbGFzcyBtYXkgb25seSBhcHBlYXIgaW4gdGhlIHNldAogICAgLy8gb2Ygc3VwZXJ0eXBlcyBvZiBhIGdpdmVuIHR5cGUgbW9yZSB0aGFuIG9uY2UsIHRoZSBvcmRlciBvZiB0aGUgY2hlY2tzCiAgICAvLyBhYm92ZSBpcyBpcnJlbGV2YW50OyB3ZSBqdXN0IG5lZWQgdG8gZmluZCB0aGUgbWF0Y2hlZCBzdXBlcmNsYXNzLAogICAgLy8gc3Vic3RpdHV0ZSwgYW5kIHRoZW4gaXRlcmF0ZSB0aHJvdWdoIHR5cGUgdmFyaWFibGVzLgogICAgdmFyIG1hdGNoaW5nU3VwZXJ0eXBlT2ZTdWJ0eXBlID0KICAgICAgICBnZXRUeXBlQXNJbnN0YW5jZU9mKHN1YnR5cGUsIHN1cGVydHlwZS5jbGFzc05vZGUpOwogICAgaWYgKG1hdGNoaW5nU3VwZXJ0eXBlT2ZTdWJ0eXBlID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJ0eXBlLmNsYXNzTm9kZS50eXBlUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoIV9pc1N1YnR5cGVNYXRjaChtYXRjaGluZ1N1cGVydHlwZU9mU3VidHlwZS50eXBlQXJndW1lbnRzW2ldLAogICAgICAgICAgc3VwZXJ0eXBlLnR5cGVBcmd1bWVudHNbaV0pKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGJvb2wgX2lzTnVsbChEYXJ0VHlwZSB0eXBlKSB7CiAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IHdvdWxkIGl0IGJlIGJldHRlciB0byBjYWxsIHRoaXMgIl9pc0JvdHRvbSIsIGFuZCB0byBoYXZlCiAgICAvLyBpdCByZXR1cm4gYHRydWVgIGZvciBib3RoIE51bGwgYW5kIGJvdHRvbSB0eXBlcz8gIFJldmlzaXQgdGhpcyBvbmNlCiAgICAvLyBlbm91Z2ggZnVuY3Rpb25hbGl0eSBpcyBpbXBsZW1lbnRlZCB0aGF0IHdlIGNhbiBjb21wYXJlIHRoZSBiZWhhdmlvciB3aXRoCiAgICAvLyB0aGUgb2xkIGFuYWx5emVyLWJhc2VkIGltcGxlbWVudGF0aW9uLgogICAgcmV0dXJuIHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJiBpZGVudGljYWwodHlwZS5jbGFzc05vZGUsIG51bGxDbGFzcyk7CiAgfQoKICAvLy8gQXR0ZW1wdHMgdG8gbWF0Y2ggW3N1YnR5cGVdIGFzIGEgc3VidHlwZSBvZiBbc3VwZXJ0eXBlXSwgZ2F0aGVyaW5nIGFueQogIC8vLyBjb25zdHJhaW50cyBkaXNjb3ZlcmVkIGluIHRoZSBwcm9jZXNzLgogIC8vLwogIC8vLyBJZiBhIHNldCBvZiBjb25zdHJhaW50cyB3YXMgZm91bmQsIGB0cnVlYCBpcyByZXR1cm5lZCBhbmQgdGhlIGNhbGxlcgogIC8vLyBtYXkgcHJvY2VlZCB0byBjYWxsIFtjb21wdXRlQ29uc3RyYWludHNdLiAgT3RoZXJ3aXNlLCBgZmFsc2VgIGlzIHJldHVybmVkLgogIC8vLwogIC8vLyBJbiB0aGUgY2FzZSB3aGVyZSBgZmFsc2VgIGlzIHJldHVybmVkLCBzb21lIGJvZ3VzIGNvbnN0cmFpbnRzIG1heSBoYXZlCiAgLy8vIGJlZW4gYWRkZWQgdG8gW19wcm90b0NvbnN0cmFpbnRzXS4gIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0bwogIC8vLyBkaXNjYXJkIHRoZW0gaWYgbmVjZXNzYXJ5LgogIGJvb2wgX2lzU3VidHlwZU1hdGNoKERhcnRUeXBlIHN1YnR5cGUsIERhcnRUeXBlIHN1cGVydHlwZSkgewogICAgLy8gVGhlIHVua25vd24gdHlwZSBgP2AgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBhbnkgdHlwZSBgUWAgd2l0aCBubwogICAgLy8gY29uc3RyYWludHMuCiAgICBpZiAoc3VidHlwZSBpcyBVbmtub3duVHlwZSkgcmV0dXJuIHRydWU7CiAgICAvLyBBbnkgdHlwZSBgUGAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciB0aGUgdW5rbm93biB0eXBlIGA/YCB3aXRoIG5vCiAgICAvLyBjb25zdHJhaW50cy4KICAgIGlmIChzdXBlcnR5cGUgaXMgVW5rbm93blR5cGUpIHJldHVybiB0cnVlOwogICAgLy8gQSB0eXBlIHZhcmlhYmxlIGBUYCBpbiBgTGAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBhbnkgdHlwZSBzY2hlbWEgYFFgOgogICAgLy8gLSBVbmRlciBjb25zdHJhaW50IGBUIDw6IFFgLgogICAgaWYgKHN1YnR5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGUgJiYKICAgICAgICBfcGFyYW1ldGVyc1RvQ29uc3RyYWluLmNvbnRhaW5zKHN1YnR5cGUucGFyYW1ldGVyKSkgewogICAgICBfY29uc3RyYWluVXBwZXIoc3VidHlwZS5wYXJhbWV0ZXIsIHN1cGVydHlwZSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgLy8gQSB0eXBlIHNjaGVtYSBgUWAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBhIHR5cGUgdmFyaWFibGUgYFRgIGluIGBMYDoKICAgIC8vIC0gVW5kZXIgY29uc3RyYWludCBgUSA8OiBUYC4KICAgIGlmIChzdXBlcnR5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGUgJiYKICAgICAgICBfcGFyYW1ldGVyc1RvQ29uc3RyYWluLmNvbnRhaW5zKHN1cGVydHlwZS5wYXJhbWV0ZXIpKSB7CiAgICAgIF9jb25zdHJhaW5Mb3dlcihzdXBlcnR5cGUucGFyYW1ldGVyLCBzdWJ0eXBlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvLyBBbnkgdHdvIGVxdWFsIHR5cGVzIGBQYCBhbmQgYFFgIGFyZSBzdWJ0eXBlIG1hdGNoZXMgdW5kZXIgbm8gY29uc3RyYWludHMuCiAgICAvLyBOb3RlOiB0byBhdm9pZCBtYWtpbmcgdGhlIGFsZ29yaXRobSBxdWFkcmF0aWMsIHdlIGp1c3QgY2hlY2sgZm9yCiAgICAvLyBpZGVudGljYWwoKS4gIElmIFAgYW5kIFEgYXJlIGVxdWFsIGJ1dCBub3QgaWRlbnRpY2FsLCByZWN1cnNpbmcgdGhyb3VnaAogICAgLy8gdGhlIHR5cGVzIHdpbGwgZ2l2ZSB0aGUgcHJvcGVyIHJlc3VsdC4KICAgIGlmIChpZGVudGljYWwoc3VidHlwZSwgc3VwZXJ0eXBlKSkgcmV0dXJuIHRydWU7CiAgICAvLyBBbnkgdHlwZSBgUGAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBgZHluYW1pY2AsIGBPYmplY3RgLCBvciBgdm9pZGAgdW5kZXIKICAgIC8vIG5vIGNvbnN0cmFpbnRzLgogICAgaWYgKF9pc1RvcChzdXBlcnR5cGUpKSByZXR1cm4gdHJ1ZTsKICAgIC8vIGBOdWxsYCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGFueSB0eXBlIGBRYCB1bmRlciBubyBjb25zdHJhaW50cy4KICAgIC8vIE5vdGUgdGhhdCBudWxsYWJsZSB0eXBlcyB3aWxsIGNoYW5nZSB0aGlzLgogICAgaWYgKF9pc051bGwoc3VidHlwZSkpIHJldHVybiB0cnVlOwoKICAgIC8vIEhhbmRsZSBGdXR1cmVPcjxUPiB1bmlvbiB0eXBlLgogICAgaWYgKHN1YnR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgIGlkZW50aWNhbChzdWJ0eXBlLmNsYXNzTm9kZSwgZnV0dXJlT3JDbGFzcykpIHsKICAgICAgdmFyIHN1YnR5cGVBcmcgPSBzdWJ0eXBlLnR5cGVBcmd1bWVudHNbMF07CiAgICAgIGlmIChzdXBlcnR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgICAgaWRlbnRpY2FsKHN1cGVydHlwZS5jbGFzc05vZGUsIGZ1dHVyZU9yQ2xhc3MpKSB7CiAgICAgICAgLy8gYEZ1dHVyZU9yPFA+YCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBGdXR1cmVPcjxRPmAgd2l0aCByZXNwZWN0IHRvCiAgICAgICAgLy8gYExgIHVuZGVyIGNvbnN0cmFpbnRzIGBDYDoKICAgICAgICAvLyAtIElmIGBQYCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBRYCB3aXRoIHJlc3BlY3QgdG8gYExgIHVuZGVyCiAgICAgICAgLy8gICBjb25zdHJhaW50cyBgQ2AuCiAgICAgICAgdmFyIHN1cGVydHlwZUFyZyA9IHN1cGVydHlwZS50eXBlQXJndW1lbnRzWzBdOwogICAgICAgIHJldHVybiBfaXNTdWJ0eXBlTWF0Y2goc3VidHlwZUFyZywgc3VwZXJ0eXBlQXJnKTsKICAgICAgfQoKICAgICAgLy8gYEZ1dHVyZU9yPFA+YCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBRYCB3aXRoIHJlc3BlY3QgdG8gYExgIHVuZGVyCiAgICAgIC8vIGNvbnN0cmFpbnRzIGBDMCArIEMxYDoKICAgICAgLy8gLSBJZiBgRnV0dXJlPFA+YCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBRYCB3aXRoIHJlc3BlY3QgdG8gYExgIHVuZGVyCiAgICAgIC8vICAgY29uc3RyYWludHMgYEMwYC4KICAgICAgLy8gLSBBbmQgYFBgIGlzIGEgc3VidHlwZSBtYXRjaCBmb3IgYFFgIHdpdGggcmVzcGVjdCB0byBgTGAgdW5kZXIKICAgICAgLy8gICBjb25zdHJhaW50cyBgQzFgLgogICAgICB2YXIgc3VidHlwZUZ1dHVyZSA9IGZ1dHVyZVR5cGUoc3VidHlwZUFyZyk7CiAgICAgIHJldHVybiBfaXNTdWJ0eXBlTWF0Y2goc3VidHlwZUZ1dHVyZSwgc3VwZXJ0eXBlKSAmJgogICAgICAgICAgX2lzU3VidHlwZU1hdGNoKHN1YnR5cGVBcmcsIHN1cGVydHlwZSk7CiAgICB9CgogICAgaWYgKHN1cGVydHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgaWRlbnRpY2FsKHN1cGVydHlwZS5jbGFzc05vZGUsIGZ1dHVyZU9yQ2xhc3MpKSB7CiAgICAgIC8vIGBQYCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBGdXR1cmVPcjxRPmAgd2l0aCByZXNwZWN0IHRvIGBMYCB1bmRlcgogICAgICAvLyBjb25zdHJhaW50cyBgQ2A6CiAgICAgIC8vIC0gSWYgYFBgIGlzIGEgc3VidHlwZSBtYXRjaCBmb3IgYEZ1dHVyZTxRPmAgd2l0aCByZXNwZWN0IHRvIGBMYCB1bmRlcgogICAgICAvLyAgIGNvbnN0cmFpbnRzIGBDYC4KICAgICAgLy8gLSBPciBgUGAgaXMgbm90IGEgc3VidHlwZSBtYXRjaCBmb3IgYEZ1dHVyZTxRPmAgd2l0aCByZXNwZWN0IHRvIGBMYAogICAgICAvLyAgIHVuZGVyIGNvbnN0cmFpbnRzIGBDYAogICAgICAvLyAgIC0gQW5kIGBQYCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBRYCB3aXRoIHJlc3BlY3QgdG8gYExgIHVuZGVyCiAgICAgIC8vICAgICBjb25zdHJhaW50cyBgQ2AKICAgICAgdmFyIHN1cGVydHlwZUFyZyA9IHN1cGVydHlwZS50eXBlQXJndW1lbnRzWzBdOwogICAgICB2YXIgc3VwZXJ0eXBlRnV0dXJlID0gZnV0dXJlVHlwZShzdXBlcnR5cGVBcmcpOwogICAgICByZXR1cm4gdHJ5U3VidHlwZU1hdGNoKHN1YnR5cGUsIHN1cGVydHlwZUZ1dHVyZSkgfHwKICAgICAgICAgIF9pc1N1YnR5cGVNYXRjaChzdWJ0eXBlLCBzdXBlcnR5cGVBcmcpOwogICAgfQoKICAgIC8vIEEgdHlwZSB2YXJpYWJsZSBgVGAgbm90IGluIGBMYCB3aXRoIGJvdW5kIGBQYCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIHRoZQogICAgLy8gc2FtZSB0eXBlIHZhcmlhYmxlIGBUYCB3aXRoIGJvdW5kIGBRYCB3aXRoIHJlc3BlY3QgdG8gYExgIHVuZGVyCiAgICAvLyBjb25zdHJhaW50cyBgQ2A6CiAgICAvLyAtIElmIGBQYCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBRYCB3aXRoIHJlc3BlY3QgdG8gYExgIHVuZGVyIGNvbnN0cmFpbnRzCiAgICAvLyAgIGBDYC4KICAgIGlmIChzdWJ0eXBlIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgIGlmIChzdXBlcnR5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGUgJiYKICAgICAgICAgIGlkZW50aWNhbChzdWJ0eXBlLnBhcmFtZXRlciwgc3VwZXJ0eXBlLnBhcmFtZXRlcikpIHsKICAgICAgICAvLyBLZXJuZWwgZG9lc24ndCB5ZXQgYWxsb3cgYSB0eXBlIHZhcmlhYmxlIHRvIGhhdmUgZGlmZmVyZW50IGJvdW5kcwogICAgICAgIC8vIHVuZGVyIGRpZmZlcmVudCBjaXJjdW1zdGFuY2VzIChzZWUgZGFydGJ1Zy5jb20vMjk1MjkpIHNvIGZvciBub3cgaWYKICAgICAgICAvLyB3ZSBnZXQgaGVyZSwgdGhlIGJvdW5kcyBtdXN0IGJlIHRoZSBzYW1lLgogICAgICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogdXBkYXRlIHRoaXMgY29kZSBvbmNlIGRhcnRidWcuY29tLzI5NTI5IGlzCiAgICAgICAgLy8gYWRkcmVzc2VkLgogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIC8vIEEgdHlwZSB2YXJpYWJsZSBgVGAgbm90IGluIGBMYCB3aXRoIGJvdW5kIGBQYCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGEKICAgICAgLy8gdHlwZSBgUWAgd2l0aCByZXNwZWN0IHRvIGBMYCB1bmRlciBjb25zdHJhaW50cyBgQ2A6CiAgICAgIC8vIC0gSWYgYFBgIGlzIGEgc3VidHlwZSBtYXRjaCBmb3IgYFFgIHdpdGggcmVzcGVjdCB0byBgTGAgdW5kZXIKICAgICAgLy8gICBjb25zdHJhaW50cyBgQ2AuCiAgICAgIHJldHVybiBfaXNTdWJ0eXBlTWF0Y2goc3VidHlwZS5wYXJhbWV0ZXIuYm91bmQsIHN1cGVydHlwZSk7CiAgICB9CiAgICBpZiAoc3VidHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmIHN1cGVydHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIHJldHVybiBfaXNJbnRlcmZhY2VTdWJ0eXBlTWF0Y2goc3VidHlwZSwgc3VwZXJ0eXBlKTsKICAgIH0KICAgIGlmIChzdWJ0eXBlIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICBpZiAoc3VwZXJ0eXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICByZXR1cm4gaWRlbnRpY2FsKHN1cGVydHlwZS5jbGFzc05vZGUsIGZ1bmN0aW9uQ2xhc3MpIHx8CiAgICAgICAgICAgIGlkZW50aWNhbChzdXBlcnR5cGUuY2xhc3NOb2RlLCBvYmplY3RDbGFzcyk7CiAgICAgIH0gZWxzZSBpZiAoc3VwZXJ0eXBlIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICAgIHJldHVybiBfaXNGdW5jdGlvblN1YnR5cGVNYXRjaChzdWJ0eXBlLCBzdXBlcnR5cGUpOwogICAgICB9CiAgICB9CiAgICAvLyBBIHR5cGUgYFBgIGlzIGEgc3VidHlwZSBtYXRjaCBmb3IgYSB0eXBlIGBRYCB3aXRoIHJlc3BlY3QgdG8gYExgIHVuZGVyCiAgICAvLyBjb25zdHJhaW50cyBgQ2A6CiAgICAvLyAtIElmIGBQYCBpcyBhbiBpbnRlcmZhY2UgdHlwZSB3aGljaCBpbXBsZW1lbnRzIGEgY2FsbCBtZXRob2Qgb2YgdHlwZSBgRmAsCiAgICAvLyAgIGFuZCBgRmAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBhIHR5cGUgYFFgIHdpdGggcmVzcGVjdCB0byBgTGAgdW5kZXIKICAgIC8vICAgY29uc3RyYWludHMgYENgLgogICAgaWYgKHN1YnR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICB2YXIgY2FsbE1lbWJlciA9IGdldEludGVyZmFjZU1lbWJlcihzdWJ0eXBlLmNsYXNzTm9kZSwgY2FsbE5hbWUpOwogICAgICBpZiAoY2FsbE1lbWJlciBpcyBQcm9jZWR1cmUgJiYgIWNhbGxNZW1iZXIuaXNHZXR0ZXIpIHsKICAgICAgICB2YXIgY2FsbFR5cGUgPSBjYWxsTWVtYmVyLmdldHRlclR5cGU7CiAgICAgICAgaWYgKGNhbGxUeXBlICE9IG51bGwpIHsKICAgICAgICAgIGNhbGxUeXBlID0KICAgICAgICAgICAgICBTdWJzdGl0dXRpb24uZnJvbUludGVyZmFjZVR5cGUoc3VidHlwZSkuc3Vic3RpdHV0ZVR5cGUoY2FsbFR5cGUpOwogICAgICAgICAgLy8gVE9ETyhrbWlsbGlraW4pOiBUaGUgc3VidHlwZSBjaGVjayB3aWxsIGZhaWwgaWYgdGhlIHR5cGUgb2YgYQogICAgICAgICAgLy8gZ2VuZXJpYyBjYWxsIG1ldGhvZCBpcyBhIHN1YnR5cGUgb2YgYSBub24tZ2VuZXJpYyBmdW5jdGlvbiB0eXBlLgogICAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGlmIGBUIGNhbGw8VD4oVCBhcmcpYCBpcyBhIHN1YnR5cGUgb2YgYFMtPlNgIGZvciBzb21lCiAgICAgICAgICAvLyBTLiAgSG93ZXZlciwgZXhwbGljaXRseSB0ZWFyaW5nIG9mZiB0aGF0IGNhbGwgbWV0aG9kIHdpbGwgd29yayBhbmQKICAgICAgICAgIC8vIGluc2VydCBhbiBleHBsaWNpdCBpbnN0YW50aWF0aW9uLCBzbyB0aGUgaW1wbGljaXQgdGVhciBvZmYgc2hvdWxkCiAgICAgICAgICAvLyB3b3JrIGFzIHdlbGwuICBGaWd1cmUgb3V0IGhvdyB0byBzdXBwb3J0IHRoaXMgY2FzZS4KICAgICAgICAgIHJldHVybiBfaXNTdWJ0eXBlTWF0Y2goY2FsbFR5cGUsIHN1cGVydHlwZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBib29sIF9pc1RvcChEYXJ0VHlwZSB0eXBlKSA9PgogICAgICB0eXBlIGlzIER5bmFtaWNUeXBlIHx8CiAgICAgIHR5cGUgaXMgVm9pZFR5cGUgfHwKICAgICAgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJiBpZGVudGljYWwodHlwZS5jbGFzc05vZGUsIG9iamVjdENsYXNzKSk7CgogIC8vLyBHaXZlbiB0d28gbGlzdHMgb2YgZnVuY3Rpb24gdHlwZSBmb3JtYWwgcGFyYW1ldGVycywgY2hlY2tzIHRoYXQgdGhlaXIKICAvLy8gYm91bmRzIGFyZSBjb21wYXRpYmxlLgogIC8vLwogIC8vLyBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIGEgbWF0Y2ggd2FzIGZvdW5kLiAgSWYgaXQgd2FzLCBlbnRyaWVzCiAgLy8vIGFyZSBhZGRlZCB0byBbc3Vic3RpdHV0aW9uMV0gYW5kIFtzdWJzdGl0dXRpb24yXSB3aGljaCBzdWJzdGl0dXRlIGEgZnJlc2gKICAvLy8gc2V0IG9mIHR5cGUgdmFyaWFibGVzIGZvciB0aGUgdHlwZSBwYXJhbWV0ZXJzIFtwYXJhbXMxXSBhbmQgW3BhcmFtczJdLAogIC8vLyByZXNwZWN0aXZlbHksIGFsbG93aW5nIGZ1cnRoZXIgY29tcGFyaXNvbi4KICBib29sIF9tYXRjaFR5cGVGb3JtYWxzKAogICAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHBhcmFtczEsCiAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gcGFyYW1zMiwKICAgICAgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBzdWJzdGl0dXRpb24xLAogICAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbjIsCiAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gZnJlc2hUeXBlVmFyaWFibGVzKSB7CiAgICBhc3NlcnQocGFyYW1zMS5sZW5ndGggPT0gcGFyYW1zMi5sZW5ndGgpOwogICAgLy8gVE9ETyhwYXVsYmVycnkpOiBpbiBpbWl0YXRpb24gb2YgYW5hbHl6ZXIsIHdlJ3JlIGNoZWNraW5nIHRoZSBib3VuZHMgYXMKICAgIC8vIHdlIGJ1aWxkIHVwIHRoZSBzdWJzdGl0dXRpb25zLiAgQnV0IEkgZG9uJ3QgdGhpbmsgdGhhdCdzIGNvcnJlY3QtLUkgdGhpbmsKICAgIC8vIHdlIHNob3VsZCBidWlsZCB1cCBib3RoIHN1YnN0aXR1dGlvbnMgY29tcGxldGVseSBiZWZvcmUgY2hlY2tpbmcgYW55CiAgICAvLyBib3VuZHMuICBTZWUgZGFydGJ1Zy5jb20vMjk2MjkuCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtczEubGVuZ3RoOyArK2kpIHsKICAgICAgVHlwZVBhcmFtZXRlciBwRnJlc2ggPSBuZXcgVHlwZVBhcmFtZXRlcihwYXJhbXMyW2ldLm5hbWUpOwogICAgICBmcmVzaFR5cGVWYXJpYWJsZXMuYWRkKHBGcmVzaCk7CiAgICAgIERhcnRUeXBlIHZhcmlhYmxlRnJlc2ggPSBuZXcgVHlwZVBhcmFtZXRlclR5cGUocEZyZXNoKTsKICAgICAgc3Vic3RpdHV0aW9uMVtwYXJhbXMxW2ldXSA9IHZhcmlhYmxlRnJlc2g7CiAgICAgIHN1YnN0aXR1dGlvbjJbcGFyYW1zMltpXV0gPSB2YXJpYWJsZUZyZXNoOwogICAgICBEYXJ0VHlwZSBib3VuZDEgPSBzdWJzdGl0dXRlKHBhcmFtczFbaV0uYm91bmQsIHN1YnN0aXR1dGlvbjEpOwogICAgICBEYXJ0VHlwZSBib3VuZDIgPSBzdWJzdGl0dXRlKHBhcmFtczJbaV0uYm91bmQsIHN1YnN0aXR1dGlvbjIpOwogICAgICBwRnJlc2guYm91bmQgPSBib3VuZDI7CiAgICAgIGlmICghX2lzU3VidHlwZU1hdGNoKGJvdW5kMiwgYm91bmQxKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQp9CgpjbGFzcyBUeXBlU2NoZW1hQ29uc3RyYWludEdhdGhlcmVyIGV4dGVuZHMgVHlwZUNvbnN0cmFpbnRHYXRoZXJlciB7CiAgZmluYWwgVHlwZVNjaGVtYUVudmlyb25tZW50IGVudmlyb25tZW50OwoKICBUeXBlU2NoZW1hQ29uc3RyYWludEdhdGhlcmVyKAogICAgICB0aGlzLmVudmlyb25tZW50LCBJdGVyYWJsZTxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycykKICAgICAgOiBzdXBlci5zdWJjbGFzc2luZyh0eXBlUGFyYW1ldGVycyk7CgogIEBvdmVycmlkZQogIENsYXNzIGdldCBvYmplY3RDbGFzcyA9PiBlbnZpcm9ubWVudC5jb3JlVHlwZXMub2JqZWN0Q2xhc3M7CgogIEBvdmVycmlkZQogIENsYXNzIGdldCBmdW5jdGlvbkNsYXNzID0+IGVudmlyb25tZW50LmNvcmVUeXBlcy5mdW5jdGlvbkNsYXNzOwoKICBAb3ZlcnJpZGUKICBDbGFzcyBnZXQgZnV0dXJlT3JDbGFzcyA9PiBlbnZpcm9ubWVudC5jb3JlVHlwZXMuZnV0dXJlT3JDbGFzczsKCiAgQG92ZXJyaWRlCiAgQ2xhc3MgZ2V0IG51bGxDbGFzcyA9PiBlbnZpcm9ubWVudC5jb3JlVHlwZXMubnVsbENsYXNzOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZFVwcGVyQm91bmQoVHlwZUNvbnN0cmFpbnQgY29uc3RyYWludCwgRGFydFR5cGUgdXBwZXIpIHsKICAgIGVudmlyb25tZW50LmFkZFVwcGVyQm91bmQoY29uc3RyYWludCwgdXBwZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRMb3dlckJvdW5kKFR5cGVDb25zdHJhaW50IGNvbnN0cmFpbnQsIERhcnRUeXBlIGxvd2VyKSB7CiAgICBlbnZpcm9ubWVudC5hZGRMb3dlckJvdW5kKGNvbnN0cmFpbnQsIGxvd2VyKTsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlciBnZXRJbnRlcmZhY2VNZW1iZXIoQ2xhc3MgY2xhc3NfLCBOYW1lIG5hbWUsIHtib29sIHNldHRlcjogZmFsc2V9KSB7CiAgICByZXR1cm4gZW52aXJvbm1lbnQuaGllcmFyY2h5CiAgICAgICAgLmdldEludGVyZmFjZU1lbWJlcihjbGFzc18sIG5hbWUsIHNldHRlcjogc2V0dGVyKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0VHlwZUFzSW5zdGFuY2VPZihJbnRlcmZhY2VUeXBlIHR5cGUsIENsYXNzIHN1cGVyY2xhc3MpIHsKICAgIHJldHVybiBlbnZpcm9ubWVudC5nZXRUeXBlQXNJbnN0YW5jZU9mKHR5cGUsIHN1cGVyY2xhc3MpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBmdXR1cmVUeXBlKERhcnRUeXBlIHR5cGUpIHsKICAgIHJldHVybiBlbnZpcm9ubWVudC5mdXR1cmVUeXBlKHR5cGUpOwogIH0KfQoKLy8vIFRyYWNrcyBhIHNpbmdsZSBjb25zdHJhaW50IG9uIGEgc2luZ2xlIHR5cGUgdmFyaWFibGUuCi8vLwovLy8gVGhpcyBpcyBjYWxsZWQgIl9Qcm90b0NvbnN0cmFpbnQiIHRvIGRpc3Rpbmd1aXNoIGZyb20gW1R5cGVDb25zdHJhaW50XSwKLy8vIHdoaWNoIHRyYWNrcyB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyB0aGF0IGFyZSB0b2dldGhlciBpbXBsaWVkIGJ5IGEgc2V0Ci8vLyBvZiBbX1Byb3RvQ29uc3RyYWludF1zLgpjbGFzcyBfUHJvdG9Db25zdHJhaW50IHsKICBmaW5hbCBUeXBlUGFyYW1ldGVyIHBhcmFtZXRlcjsKCiAgZmluYWwgRGFydFR5cGUgYm91bmQ7CgogIGZpbmFsIGJvb2wgaXNVcHBlcjsKCiAgX1Byb3RvQ29uc3RyYWludC5sb3dlcih0aGlzLnBhcmFtZXRlciwgdGhpcy5ib3VuZCkgOiBpc1VwcGVyID0gZmFsc2U7CgogIF9Qcm90b0NvbnN0cmFpbnQudXBwZXIodGhpcy5wYXJhbWV0ZXIsIHRoaXMuYm91bmQpIDogaXNVcHBlciA9IHRydWU7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiBpc1VwcGVyCiAgICAgICAgPyAiJHtwYXJhbWV0ZXIubmFtZX0gPDogJGJvdW5kIgogICAgICAgIDogIiRib3VuZCA8OiAke3BhcmFtZXRlci5uYW1lfSI7CiAgfQp9CoHXAE1OPwEhCQ8SFRYXEA4TExcbEgFJASwBJkYBJgEbAScBUEYoMgE0AUoyTToBRDBKBAEZARsBGwEXAUEBQQFMAUsBKwE9PDQ0MAY1JVEPUQgGEwQBNAZNTiA/PjgUPAYUBAFCSQQBQkkEAU9MTjxOGiNPKEsoTEpCS1EuTSVNFAYuMRQGTBQGLT0/Mk9NFggBJj0oQQYBHi1GFAYBIUZCPjFEFggGHkZCPCkcCExOMU4WCAYRBAEhOEw5RxtMLU5PIFFOT01QOQFQTUk8JTs6SkgpFggGEQQBIFFLUS5KBAFNLQZLUQZNTyE/SBQtSBQvTiQoPjUTBkwkKkA1EwZRSE8uNFAXKEgyJwEmJDcxKDtOJkkeNzoIAUwgTx1IHTI6MgYBJjlMGk8cTSFKHTU2OjIGAVBHGFEOKCw/TU81RxYVCFA9RxxCBkI7BiMoQDkuPAgGThhRTRokSD0uIBVQS05QUE9BNwoIBhIEASAdGkkBTB0GUFBNMRojIzIyMC5PUUwnL0EmPjExRUUdOgYRBAIBRCsBIEArAQw+AQxCAQxCAQw6AQxCMgQBDEIyBAEMTSE7BAEMTD4EAQwsKQQCAToETE8cGSEBGAEWAUgBRwEWEygpBAIBSHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX2NvbnN0cmFpbnRfZ2F0aGVyZXIuZGFydDZzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL3R5cGVzLmRhcnTAAFEtLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEudHlwZXM7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIEJvdHRvbVR5cGUsCiAgICAgICAgQ2xhc3MsCiAgICAgICAgRGFydFR5cGUsCiAgICAgICAgRHluYW1pY1R5cGUsCiAgICAgICAgRnVuY3Rpb25UeXBlLAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgSW52YWxpZFR5cGUsCiAgICAgICAgTmFtZWRUeXBlLAogICAgICAgIFR5cGVQYXJhbWV0ZXIsCiAgICAgICAgVHlwZVBhcmFtZXRlclR5cGUsCiAgICAgICAgVHlwZWRlZlR5cGUsCiAgICAgICAgVm9pZFR5cGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JyBzaG93IFN1YnN0aXR1dGlvbjsKCmltcG9ydCAna2VybmVsX2J1aWxkZXIuZGFydCcgc2hvdyBDbGFzc0hpZXJhcmNoeUJ1aWxkZXI7CgpjbGFzcyBUeXBlcyB7CiAgZmluYWwgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGhpZXJhcmNoeTsKCiAgVHlwZXModGhpcy5oaWVyYXJjaHkpOwoKICAvLy8gUmV0dXJucyB0cnVlIGlmIFtzXSBpcyBhIHN1YnR5cGUgb2YgW3RdLgogIGJvb2wgaXNTdWJ0eXBlT2ZLZXJuZWwoRGFydFR5cGUgcywgRGFydFR5cGUgdCkgewogICAgaWYgKHMgaXMgQm90dG9tVHlwZSkgewogICAgICByZXR1cm4gdHJ1ZTsgLy8gUnVsZSAzLgogICAgfQogICAgaWYgKHMgaXMgSW52YWxpZFR5cGUpIHsKICAgICAgLy8gSW52YWxpZFR5cGUgaXMgYWxzbyBhIGJvdHRvbSB0eXBlLgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmICh0IGlzIEludmFsaWRUeXBlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICh0IGlzIER5bmFtaWNUeXBlKSB7CiAgICAgIHJldHVybiB0cnVlOyAvLyBSdWxlIDIuCiAgICB9CiAgICBpZiAodCBpcyBWb2lkVHlwZSkgewogICAgICByZXR1cm4gdHJ1ZTsgLy8gUnVsZSAyLgogICAgfQogICAgaWYgKHQgaXMgQm90dG9tVHlwZSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAodCBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIENsYXNzIGNscyA9IHQuY2xhc3NOb2RlOwogICAgICBpZiAoY2xzID09IGhpZXJhcmNoeS5vYmplY3RLZXJuZWxDbGFzcykgewogICAgICAgIHJldHVybiB0cnVlOyAvLyBSdWxlIDIuCiAgICAgIH0KICAgICAgaWYgKGNscyA9PSBoaWVyYXJjaHkuZnV0dXJlT3JLZXJuZWxDbGFzcykgewogICAgICAgIGNvbnN0IElzRnV0dXJlT3JTdWJ0eXBlT2YgcmVsYXRpb24gPSBjb25zdCBJc0Z1dHVyZU9yU3VidHlwZU9mKCk7CiAgICAgICAgaWYgKHMgaXMgRHluYW1pY1R5cGUpIHsKICAgICAgICAgIHJldHVybiByZWxhdGlvbi5pc0R5bmFtaWNSZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICAgIH0gZWxzZSBpZiAocyBpcyBWb2lkVHlwZSkgewogICAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzVm9pZFJlbGF0ZWQocywgdCwgdGhpcyk7CiAgICAgICAgfSBlbHNlIGlmIChzIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICAgIHJldHVybiBzLmNsYXNzTm9kZSA9PSBoaWVyYXJjaHkuZnV0dXJlT3JLZXJuZWxDbGFzcwogICAgICAgICAgICAgID8gcmVsYXRpb24uaXNGdXR1cmVPclJlbGF0ZWQocywgdCwgdGhpcykKICAgICAgICAgICAgICA6IHJlbGF0aW9uLmlzSW50ZXJmYWNlUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgICB9IGVsc2UgaWYgKHMgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgICByZXR1cm4gcmVsYXRpb24uaXNGdW5jdGlvblJlbGF0ZWQocywgdCwgdGhpcyk7CiAgICAgICAgfSBlbHNlIGlmIChzIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgICAgICByZXR1cm4gcy5wcm9tb3RlZEJvdW5kID09IG51bGwKICAgICAgICAgICAgICA/IHJlbGF0aW9uLmlzVHlwZVBhcmFtZXRlclJlbGF0ZWQocywgdCwgdGhpcykKICAgICAgICAgICAgICA6IHJlbGF0aW9uLmlzSW50ZXJzZWN0aW9uUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgICB9IGVsc2UgaWYgKHMgaXMgVHlwZWRlZlR5cGUpIHsKICAgICAgICAgIHJldHVybiByZWxhdGlvbi5pc1R5cGVkZWZSZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBJc0ludGVyZmFjZVN1YnR5cGVPZiByZWxhdGlvbiA9IGNvbnN0IElzSW50ZXJmYWNlU3VidHlwZU9mKCk7CiAgICAgICAgaWYgKHMgaXMgRHluYW1pY1R5cGUpIHsKICAgICAgICAgIHJldHVybiByZWxhdGlvbi5pc0R5bmFtaWNSZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICAgIH0gZWxzZSBpZiAocyBpcyBWb2lkVHlwZSkgewogICAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzVm9pZFJlbGF0ZWQocywgdCwgdGhpcyk7CiAgICAgICAgfSBlbHNlIGlmIChzIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICAgIHJldHVybiBzLmNsYXNzTm9kZSA9PSBoaWVyYXJjaHkuZnV0dXJlT3JLZXJuZWxDbGFzcwogICAgICAgICAgICAgID8gcmVsYXRpb24uaXNGdXR1cmVPclJlbGF0ZWQocywgdCwgdGhpcykKICAgICAgICAgICAgICA6IHJlbGF0aW9uLmlzSW50ZXJmYWNlUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgICB9IGVsc2UgaWYgKHMgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgICByZXR1cm4gcmVsYXRpb24uaXNGdW5jdGlvblJlbGF0ZWQocywgdCwgdGhpcyk7CiAgICAgICAgfSBlbHNlIGlmIChzIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgICAgICByZXR1cm4gcy5wcm9tb3RlZEJvdW5kID09IG51bGwKICAgICAgICAgICAgICA/IHJlbGF0aW9uLmlzVHlwZVBhcmFtZXRlclJlbGF0ZWQocywgdCwgdGhpcykKICAgICAgICAgICAgICA6IHJlbGF0aW9uLmlzSW50ZXJzZWN0aW9uUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgICB9IGVsc2UgaWYgKHMgaXMgVHlwZWRlZlR5cGUpIHsKICAgICAgICAgIHJldHVybiByZWxhdGlvbi5pc1R5cGVkZWZSZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmICh0IGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICBjb25zdCBJc0Z1bmN0aW9uU3VidHlwZU9mIHJlbGF0aW9uID0gY29uc3QgSXNGdW5jdGlvblN1YnR5cGVPZigpOwogICAgICBpZiAocyBpcyBEeW5hbWljVHlwZSkgewogICAgICAgIHJldHVybiByZWxhdGlvbi5pc0R5bmFtaWNSZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICB9IGVsc2UgaWYgKHMgaXMgVm9pZFR5cGUpIHsKICAgICAgICByZXR1cm4gcmVsYXRpb24uaXNWb2lkUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgfSBlbHNlIGlmIChzIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICByZXR1cm4gcy5jbGFzc05vZGUgPT0gaGllcmFyY2h5LmZ1dHVyZU9yS2VybmVsQ2xhc3MKICAgICAgICAgICAgPyByZWxhdGlvbi5pc0Z1dHVyZU9yUmVsYXRlZChzLCB0LCB0aGlzKQogICAgICAgICAgICA6IHJlbGF0aW9uLmlzSW50ZXJmYWNlUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgfSBlbHNlIGlmIChzIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICAgIHJldHVybiByZWxhdGlvbi5pc0Z1bmN0aW9uUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgfSBlbHNlIGlmIChzIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgICAgcmV0dXJuIHMucHJvbW90ZWRCb3VuZCA9PSBudWxsCiAgICAgICAgICAgID8gcmVsYXRpb24uaXNUeXBlUGFyYW1ldGVyUmVsYXRlZChzLCB0LCB0aGlzKQogICAgICAgICAgICA6IHJlbGF0aW9uLmlzSW50ZXJzZWN0aW9uUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgfSBlbHNlIGlmIChzIGlzIFR5cGVkZWZUeXBlKSB7CiAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzVHlwZWRlZlJlbGF0ZWQocywgdCwgdGhpcyk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodCBpcyBUeXBlUGFyYW1ldGVyVHlwZSkgewogICAgICBpZiAodC5wcm9tb3RlZEJvdW5kID09IG51bGwpIHsKICAgICAgICBjb25zdCBJc1R5cGVQYXJhbWV0ZXJTdWJ0eXBlT2YgcmVsYXRpb24gPQogICAgICAgICAgICBjb25zdCBJc1R5cGVQYXJhbWV0ZXJTdWJ0eXBlT2YoKTsKICAgICAgICBpZiAocyBpcyBEeW5hbWljVHlwZSkgewogICAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzRHluYW1pY1JlbGF0ZWQocywgdCwgdGhpcyk7CiAgICAgICAgfSBlbHNlIGlmIChzIGlzIFZvaWRUeXBlKSB7CiAgICAgICAgICByZXR1cm4gcmVsYXRpb24uaXNWb2lkUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgICB9IGVsc2UgaWYgKHMgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICAgICAgcmV0dXJuIHMuY2xhc3NOb2RlID09IGhpZXJhcmNoeS5mdXR1cmVPcktlcm5lbENsYXNzCiAgICAgICAgICAgICAgPyByZWxhdGlvbi5pc0Z1dHVyZU9yUmVsYXRlZChzLCB0LCB0aGlzKQogICAgICAgICAgICAgIDogcmVsYXRpb24uaXNJbnRlcmZhY2VSZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICAgIH0gZWxzZSBpZiAocyBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgICAgIHJldHVybiByZWxhdGlvbi5pc0Z1bmN0aW9uUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgICB9IGVsc2UgaWYgKHMgaXMgVHlwZVBhcmFtZXRlclR5cGUpIHsKICAgICAgICAgIHJldHVybiBzLnByb21vdGVkQm91bmQgPT0gbnVsbAogICAgICAgICAgICAgID8gcmVsYXRpb24uaXNUeXBlUGFyYW1ldGVyUmVsYXRlZChzLCB0LCB0aGlzKQogICAgICAgICAgICAgIDogcmVsYXRpb24uaXNJbnRlcnNlY3Rpb25SZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICAgIH0gZWxzZSBpZiAocyBpcyBUeXBlZGVmVHlwZSkgewogICAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzVHlwZWRlZlJlbGF0ZWQocywgdCwgdGhpcyk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IElzSW50ZXJzZWN0aW9uU3VidHlwZU9mIHJlbGF0aW9uID0KICAgICAgICAgICAgY29uc3QgSXNJbnRlcnNlY3Rpb25TdWJ0eXBlT2YoKTsKICAgICAgICBpZiAocyBpcyBEeW5hbWljVHlwZSkgewogICAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzRHluYW1pY1JlbGF0ZWQocywgdCwgdGhpcyk7CiAgICAgICAgfSBlbHNlIGlmIChzIGlzIFZvaWRUeXBlKSB7CiAgICAgICAgICByZXR1cm4gcmVsYXRpb24uaXNWb2lkUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgICB9IGVsc2UgaWYgKHMgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICAgICAgcmV0dXJuIHMuY2xhc3NOb2RlID09IGhpZXJhcmNoeS5mdXR1cmVPcktlcm5lbENsYXNzCiAgICAgICAgICAgICAgPyByZWxhdGlvbi5pc0Z1dHVyZU9yUmVsYXRlZChzLCB0LCB0aGlzKQogICAgICAgICAgICAgIDogcmVsYXRpb24uaXNJbnRlcmZhY2VSZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICAgIH0gZWxzZSBpZiAocyBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgICAgIHJldHVybiByZWxhdGlvbi5pc0Z1bmN0aW9uUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgICB9IGVsc2UgaWYgKHMgaXMgVHlwZVBhcmFtZXRlclR5cGUpIHsKICAgICAgICAgIHJldHVybiBzLnByb21vdGVkQm91bmQgPT0gbnVsbAogICAgICAgICAgICAgID8gcmVsYXRpb24uaXNUeXBlUGFyYW1ldGVyUmVsYXRlZChzLCB0LCB0aGlzKQogICAgICAgICAgICAgIDogcmVsYXRpb24uaXNJbnRlcnNlY3Rpb25SZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICAgIH0gZWxzZSBpZiAocyBpcyBUeXBlZGVmVHlwZSkgewogICAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzVHlwZWRlZlJlbGF0ZWQocywgdCwgdGhpcyk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKHQgaXMgVHlwZWRlZlR5cGUpIHsKICAgICAgY29uc3QgSXNUeXBlZGVmU3VidHlwZU9mIHJlbGF0aW9uID0gY29uc3QgSXNUeXBlZGVmU3VidHlwZU9mKCk7CiAgICAgIGlmIChzIGlzIER5bmFtaWNUeXBlKSB7CiAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzRHluYW1pY1JlbGF0ZWQocywgdCwgdGhpcyk7CiAgICAgIH0gZWxzZSBpZiAocyBpcyBWb2lkVHlwZSkgewogICAgICAgIHJldHVybiByZWxhdGlvbi5pc1ZvaWRSZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICB9IGVsc2UgaWYgKHMgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICAgIHJldHVybiBzLmNsYXNzTm9kZSA9PSBoaWVyYXJjaHkuZnV0dXJlT3JLZXJuZWxDbGFzcwogICAgICAgICAgICA/IHJlbGF0aW9uLmlzRnV0dXJlT3JSZWxhdGVkKHMsIHQsIHRoaXMpCiAgICAgICAgICAgIDogcmVsYXRpb24uaXNJbnRlcmZhY2VSZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICB9IGVsc2UgaWYgKHMgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzRnVuY3Rpb25SZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICB9IGVsc2UgaWYgKHMgaXMgVHlwZVBhcmFtZXRlclR5cGUpIHsKICAgICAgICByZXR1cm4gcy5wcm9tb3RlZEJvdW5kID09IG51bGwKICAgICAgICAgICAgPyByZWxhdGlvbi5pc1R5cGVQYXJhbWV0ZXJSZWxhdGVkKHMsIHQsIHRoaXMpCiAgICAgICAgICAgIDogcmVsYXRpb24uaXNJbnRlcnNlY3Rpb25SZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICB9IGVsc2UgaWYgKHMgaXMgVHlwZWRlZlR5cGUpIHsKICAgICAgICByZXR1cm4gcmVsYXRpb24uaXNUeXBlZGVmUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgIlVuaGFuZGxlZCB0eXBlOiAke3QucnVudGltZVR5cGV9IjsKICAgIH0KICAgIHRocm93ICJVbmhhbmRsZWQgdHlwZSBjb21iaW5hdGlvbjogJHt0LnJ1bnRpbWVUeXBlfSAke3MucnVudGltZVR5cGV9IjsKICB9CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgYWxsIHR5cGVzIGluIFtzXSBhbmQgW3RdIHBhaXJ3aXNlIGFyZSBzdWJ0eXBlcy4KICBib29sIGFyZVN1YnR5cGVzT2ZLZXJuZWwoTGlzdDxEYXJ0VHlwZT4gcywgTGlzdDxEYXJ0VHlwZT4gdCkgewogICAgaWYgKHMubGVuZ3RoICE9IHQubGVuZ3RoKSB7CiAgICAgIHRocm93ICJOdW1iZXJzIG9mIHR5cGUgYXJndW1lbnRzIGRvbid0IG1hdGNoICRzICR0LiI7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKCFpc1N1YnR5cGVPZktlcm5lbChzW2ldLCB0W2ldKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBib29sIGlzU2FtZVR5cGVLZXJuZWwoRGFydFR5cGUgcywgRGFydFR5cGUgdCkgewogICAgcmV0dXJuIGlzU3VidHlwZU9mS2VybmVsKHMsIHQpICYmIGlzU3VidHlwZU9mS2VybmVsKHQsIHMpOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgVHlwZVJlbGF0aW9uPFQgZXh0ZW5kcyBEYXJ0VHlwZT4gewogIGNvbnN0IFR5cGVSZWxhdGlvbigpOwoKICBib29sIGlzRHluYW1pY1JlbGF0ZWQoRHluYW1pY1R5cGUgcywgVCB0LCBUeXBlcyB0eXBlcyk7CgogIGJvb2wgaXNWb2lkUmVsYXRlZChWb2lkVHlwZSBzLCBUIHQsIFR5cGVzIHR5cGVzKTsKCiAgYm9vbCBpc0ludGVyZmFjZVJlbGF0ZWQoSW50ZXJmYWNlVHlwZSBzLCBUIHQsIFR5cGVzIHR5cGVzKTsKCiAgYm9vbCBpc0ludGVyc2VjdGlvblJlbGF0ZWQoVHlwZVBhcmFtZXRlclR5cGUgaW50ZXJzZWN0aW9uLCBUIHQsIFR5cGVzIHR5cGVzKTsKCiAgYm9vbCBpc0Z1bmN0aW9uUmVsYXRlZChGdW5jdGlvblR5cGUgcywgVCB0LCBUeXBlcyB0eXBlcyk7CgogIGJvb2wgaXNGdXR1cmVPclJlbGF0ZWQoSW50ZXJmYWNlVHlwZSBmdXR1cmVPciwgVCB0LCBUeXBlcyB0eXBlcyk7CgogIGJvb2wgaXNUeXBlUGFyYW1ldGVyUmVsYXRlZChUeXBlUGFyYW1ldGVyVHlwZSBzLCBUIHQsIFR5cGVzIHR5cGVzKTsKCiAgYm9vbCBpc1R5cGVkZWZSZWxhdGVkKFR5cGVkZWZUeXBlIHMsIFQgdCwgVHlwZXMgdHlwZXMpOwp9CgpjbGFzcyBJc0ludGVyZmFjZVN1YnR5cGVPZiBleHRlbmRzIFR5cGVSZWxhdGlvbjxJbnRlcmZhY2VUeXBlPiB7CiAgY29uc3QgSXNJbnRlcmZhY2VTdWJ0eXBlT2YoKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0ludGVyZmFjZVJlbGF0ZWQoSW50ZXJmYWNlVHlwZSBzLCBJbnRlcmZhY2VUeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICBpZiAocy5jbGFzc05vZGUgPT0gdHlwZXMuaGllcmFyY2h5Lm51bGxLZXJuZWxDbGFzcykgewogICAgICAvLyBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiwgdG8gYXZvaWQgaW5zdGFudGF0aW5nIHVubmVjZXNzYXJ5IHR5cGUKICAgICAgLy8gYXJndW1lbnRzIGluIGdldEtlcm5lbFR5cGVBc0luc3RhbmNlT2YuCiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgSW50ZXJmYWNlVHlwZSBhc1N1cGVydHlwZSA9CiAgICAgICAgdHlwZXMuaGllcmFyY2h5LmdldEtlcm5lbFR5cGVBc0luc3RhbmNlT2YocywgdC5jbGFzc05vZGUpOwogICAgaWYgKGFzU3VwZXJ0eXBlID09IG51bGwpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHR5cGVzLmFyZVN1YnR5cGVzT2ZLZXJuZWwoCiAgICAgICAgICBhc1N1cGVydHlwZS50eXBlQXJndW1lbnRzLCB0LnR5cGVBcmd1bWVudHMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1R5cGVQYXJhbWV0ZXJSZWxhdGVkKAogICAgICBUeXBlUGFyYW1ldGVyVHlwZSBzLCBJbnRlcmZhY2VUeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gdHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwocy5wYXJhbWV0ZXIuYm91bmQsIHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0Z1dHVyZU9yUmVsYXRlZChJbnRlcmZhY2VUeXBlIGZ1dHVyZU9yLCBJbnRlcmZhY2VUeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICBMaXN0PERhcnRUeXBlPiBhcmd1bWVudHMgPSBmdXR1cmVPci50eXBlQXJndW1lbnRzOwogICAgaWYgKCF0eXBlcy5pc1N1YnR5cGVPZktlcm5lbChhcmd1bWVudHMuc2luZ2xlLCB0KSkgewogICAgICByZXR1cm4gZmFsc2U7IC8vIFJ1bGUgNy4xCiAgICB9CiAgICBpZiAoIXR5cGVzLmlzU3VidHlwZU9mS2VybmVsKAogICAgICAgIG5ldyBJbnRlcmZhY2VUeXBlKHR5cGVzLmhpZXJhcmNoeS5mdXR1cmVLZXJuZWxDbGFzcywgYXJndW1lbnRzKSwgdCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOyAvLyBSdWxlIDcuMgogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSW50ZXJzZWN0aW9uUmVsYXRlZCgKICAgICAgVHlwZVBhcmFtZXRlclR5cGUgaW50ZXJzZWN0aW9uLCBJbnRlcmZhY2VUeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gdHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwoaW50ZXJzZWN0aW9uLnByb21vdGVkQm91bmQsIHQpOyAvLyBSdWxlIDEyLgogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0R5bmFtaWNSZWxhdGVkKER5bmFtaWNUeXBlIHMsIEludGVyZmFjZVR5cGUgdCwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNGdW5jdGlvblJlbGF0ZWQoRnVuY3Rpb25UeXBlIHMsIEludGVyZmFjZVR5cGUgdCwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiB0LmNsYXNzTm9kZSA9PSB0eXBlcy5oaWVyYXJjaHkuZnVuY3Rpb25LZXJuZWxDbGFzczsgLy8gUnVsZSAxNC4KICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNUeXBlZGVmUmVsYXRlZChUeXBlZGVmVHlwZSBzLCBJbnRlcmZhY2VUeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICAvLyBSdWxlIDUuCiAgICByZXR1cm4gdHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwocy51bmFsaWFzLCB0KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNWb2lkUmVsYXRlZChWb2lkVHlwZSBzLCBJbnRlcmZhY2VUeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CgpjbGFzcyBJc0Z1bmN0aW9uU3VidHlwZU9mIGV4dGVuZHMgVHlwZVJlbGF0aW9uPEZ1bmN0aW9uVHlwZT4gewogIGNvbnN0IElzRnVuY3Rpb25TdWJ0eXBlT2YoKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0Z1bmN0aW9uUmVsYXRlZChGdW5jdGlvblR5cGUgcywgRnVuY3Rpb25UeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHNUeXBlVmFyaWFibGVzID0gcy50eXBlUGFyYW1ldGVyczsKICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdFR5cGVWYXJpYWJsZXMgPSB0LnR5cGVQYXJhbWV0ZXJzOwogICAgaWYgKHNUeXBlVmFyaWFibGVzLmxlbmd0aCAhPSB0VHlwZVZhcmlhYmxlcy5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgIGlmIChzVHlwZVZhcmlhYmxlcy5pc05vdEVtcHR5KSB7CiAgICAgIC8vIElmIHRoZSBmdW5jdGlvbiB0eXBlcyBoYXZlIHR5cGUgdmFyaWFibGVzLCB3ZSBhbHBoYS1yZW5hbWUgdGhlIHR5cGUKICAgICAgLy8gdmFyaWFibGVzIG9mIFtzXSB0byB1c2UgdGhvc2Ugb2YgW3RdLgogICAgICBMaXN0PERhcnRUeXBlPiB0eXBlVmFyaWFibGVTdWJzdGl0dXRpb24gPSA8RGFydFR5cGU+W107CiAgICAgIGJvb2wgc2Vjb25kQm91bmRzQ2hlY2tOZWVkZWQgPSBmYWxzZTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzVHlwZVZhcmlhYmxlcy5sZW5ndGg7IGkrKykgewogICAgICAgIFR5cGVQYXJhbWV0ZXIgc1R5cGVWYXJpYWJsZSA9IHNUeXBlVmFyaWFibGVzW2ldOwogICAgICAgIFR5cGVQYXJhbWV0ZXIgdFR5cGVWYXJpYWJsZSA9IHRUeXBlVmFyaWFibGVzW2ldOwogICAgICAgIGlmICghdHlwZXMuaXNTYW1lVHlwZUtlcm5lbChzVHlwZVZhcmlhYmxlLmJvdW5kLCB0VHlwZVZhcmlhYmxlLmJvdW5kKSkgewogICAgICAgICAgLy8gSWYgdGhlIGJvdW5kcyBhcmVuJ3QgdGhlIHNhbWUsIHdlIG5lZWQgdG8gdHJ5IGFnYWluIGFmdGVyCiAgICAgICAgICAvLyBjb21wdXRpbmcgdGhlIHN1YnN0aXR1dGlvbiBvZiB0eXBlIHZhcmlhYmxlcy4KICAgICAgICAgIHNlY29uZEJvdW5kc0NoZWNrTmVlZGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgdHlwZVZhcmlhYmxlU3Vic3RpdHV0aW9uLmFkZChuZXcgVHlwZVBhcmFtZXRlclR5cGUodFR5cGVWYXJpYWJsZSkpOwogICAgICB9CiAgICAgIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24gPQogICAgICAgICAgU3Vic3RpdHV0aW9uLmZyb21QYWlycyhzVHlwZVZhcmlhYmxlcywgdHlwZVZhcmlhYmxlU3Vic3RpdHV0aW9uKTsKICAgICAgaWYgKHNlY29uZEJvdW5kc0NoZWNrTmVlZGVkKSB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzVHlwZVZhcmlhYmxlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgVHlwZVBhcmFtZXRlciBzVHlwZVZhcmlhYmxlID0gc1R5cGVWYXJpYWJsZXNbaV07CiAgICAgICAgICBUeXBlUGFyYW1ldGVyIHRUeXBlVmFyaWFibGUgPSB0VHlwZVZhcmlhYmxlc1tpXTsKICAgICAgICAgIGlmICghdHlwZXMuaXNTYW1lVHlwZUtlcm5lbCgKICAgICAgICAgICAgICBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoc1R5cGVWYXJpYWJsZS5ib3VuZCksCiAgICAgICAgICAgICAgdFR5cGVWYXJpYWJsZS5ib3VuZCkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBzID0gc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKHMud2l0aG91dFR5cGVQYXJhbWV0ZXJzKTsKICAgIH0KICAgIGlmICghdHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwocy5yZXR1cm5UeXBlLCB0LnJldHVyblR5cGUpKSByZXR1cm4gZmFsc2U7CiAgICBMaXN0PERhcnRUeXBlPiBzUG9zaXRpb25hbCA9IHMucG9zaXRpb25hbFBhcmFtZXRlcnM7CiAgICBMaXN0PERhcnRUeXBlPiB0UG9zaXRpb25hbCA9IHQucG9zaXRpb25hbFBhcmFtZXRlcnM7CiAgICBpZiAocy5yZXF1aXJlZFBhcmFtZXRlckNvdW50ID4gdC5yZXF1aXJlZFBhcmFtZXRlckNvdW50KSB7CiAgICAgIC8vIFJ1bGUgMTUsIG4xIDw9IG4yLgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoc1Bvc2l0aW9uYWwubGVuZ3RoIDwgdFBvc2l0aW9uYWwubGVuZ3RoKSB7CiAgICAgIC8vIFJ1bGUgMTUsIG4xICsgazEgPj0gbjIgKyBrMi4KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0UG9zaXRpb25hbC5sZW5ndGg7IGkrKykgewogICAgICBpZiAoIXR5cGVzLmlzU3VidHlwZU9mS2VybmVsKHRQb3NpdGlvbmFsW2ldLCBzUG9zaXRpb25hbFtpXSkpIHsKICAgICAgICAvLyBSdWxlIDE1LCBUaiA8OiBTai4KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIExpc3Q8TmFtZWRUeXBlPiBzTmFtZWQgPSBzLm5hbWVkUGFyYW1ldGVyczsKICAgIExpc3Q8TmFtZWRUeXBlPiB0TmFtZWQgPSB0Lm5hbWVkUGFyYW1ldGVyczsKICAgIGlmIChzTmFtZWQuaXNOb3RFbXB0eSB8fCB0TmFtZWQuaXNOb3RFbXB0eSkgewogICAgICAvLyBSdWxlIDE2LCB0aGUgbnVtYmVyIG9mIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBtdXN0IGJlIHRoZSBzYW1lLgogICAgICBpZiAoc1Bvc2l0aW9uYWwubGVuZ3RoICE9IHRQb3NpdGlvbmFsLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAocy5yZXF1aXJlZFBhcmFtZXRlckNvdW50ICE9IHQucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCkgcmV0dXJuIGZhbHNlOwoKICAgICAgLy8gUnVsZSAxNiwgdGhlIHBhcmFtZXRlciBuYW1lcyBvZiBbdF0gbXVzdCBiZSBhIHN1YnNldCBvZiB0aG9zZSBvZgogICAgICAvLyBbc10uIEFsc28sIGZvciB0aGUgaW50ZXJzZWN0aW9uLCB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyIG9mIFt0XSBtdXN0CiAgICAgIC8vIGJlIGEgc3VidHlwZSBvZiB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyIG9mIFtzXS4KICAgICAgaW50IHNDb3VudCA9IDA7CiAgICAgIGZvciAoaW50IHRDb3VudCA9IDA7IHRDb3VudCA8IHROYW1lZC5sZW5ndGg7IHRDb3VudCsrKSB7CiAgICAgICAgU3RyaW5nIG5hbWUgPSB0TmFtZWRbdENvdW50XS5uYW1lOwogICAgICAgIGZvciAoOyBzQ291bnQgPCBzTmFtZWQubGVuZ3RoOyBzQ291bnQrKykgewogICAgICAgICAgaWYgKHNOYW1lZFtzQ291bnRdLm5hbWUgPT0gbmFtZSkgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChzQ291bnQgPT0gc05hbWVkLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmICghdHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwoCiAgICAgICAgICAgIHROYW1lZFt0Q291bnRdLnR5cGUsIHNOYW1lZFtzQ291bnRdLnR5cGUpKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNJbnRlcmZhY2VSZWxhdGVkKEludGVyZmFjZVR5cGUgcywgRnVuY3Rpb25UeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gcy5jbGFzc05vZGUgPT0gdHlwZXMuaGllcmFyY2h5Lm51bGxLZXJuZWxDbGFzczsgLy8gUnVsZSA0LgogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0R5bmFtaWNSZWxhdGVkKER5bmFtaWNUeXBlIHMsIEZ1bmN0aW9uVHlwZSB0LCBUeXBlcyB0eXBlcykgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgaXNGdXR1cmVPclJlbGF0ZWQoSW50ZXJmYWNlVHlwZSBmdXR1cmVPciwgRnVuY3Rpb25UeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSW50ZXJzZWN0aW9uUmVsYXRlZCgKICAgICAgVHlwZVBhcmFtZXRlclR5cGUgaW50ZXJzZWN0aW9uLCBGdW5jdGlvblR5cGUgdCwgVHlwZXMgdHlwZXMpIHsKICAgIC8vIFJ1bGUgMTIuCiAgICByZXR1cm4gdHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwoaW50ZXJzZWN0aW9uLnByb21vdGVkQm91bmQsIHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1R5cGVQYXJhbWV0ZXJSZWxhdGVkKAogICAgICBUeXBlUGFyYW1ldGVyVHlwZSBzLCBGdW5jdGlvblR5cGUgdCwgVHlwZXMgdHlwZXMpIHsKICAgIC8vIFJ1bGUgMTMuCiAgICByZXR1cm4gdHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwocy5wYXJhbWV0ZXIuYm91bmQsIHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1R5cGVkZWZSZWxhdGVkKFR5cGVkZWZUeXBlIHMsIEZ1bmN0aW9uVHlwZSB0LCBUeXBlcyB0eXBlcykgewogICAgLy8gUnVsZSA1LgogICAgcmV0dXJuIHR5cGVzLmlzU3VidHlwZU9mS2VybmVsKHMudW5hbGlhcywgdCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzVm9pZFJlbGF0ZWQoVm9pZFR5cGUgcywgRnVuY3Rpb25UeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CgpjbGFzcyBJc1R5cGVQYXJhbWV0ZXJTdWJ0eXBlT2YgZXh0ZW5kcyBUeXBlUmVsYXRpb248VHlwZVBhcmFtZXRlclR5cGU+IHsKICBjb25zdCBJc1R5cGVQYXJhbWV0ZXJTdWJ0eXBlT2YoKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1R5cGVQYXJhbWV0ZXJSZWxhdGVkKAogICAgICBUeXBlUGFyYW1ldGVyVHlwZSBzLCBUeXBlUGFyYW1ldGVyVHlwZSB0LCBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIHMucGFyYW1ldGVyID09IHQucGFyYW1ldGVyIHx8CiAgICAgICAgLy8gUnVsZSAxMy4KICAgICAgICB0eXBlcy5pc1N1YnR5cGVPZktlcm5lbChzLmJvdW5kLCB0KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNJbnRlcnNlY3Rpb25SZWxhdGVkKAogICAgICBUeXBlUGFyYW1ldGVyVHlwZSBpbnRlcnNlY3Rpb24sIFR5cGVQYXJhbWV0ZXJUeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gaW50ZXJzZWN0aW9uLnBhcmFtZXRlciA9PSB0LnBhcmFtZXRlcjsgLy8gUnVsZSA4LgogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0ludGVyZmFjZVJlbGF0ZWQoSW50ZXJmYWNlVHlwZSBzLCBUeXBlUGFyYW1ldGVyVHlwZSB0LCBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIHMuY2xhc3NOb2RlID09IHR5cGVzLmhpZXJhcmNoeS5udWxsS2VybmVsQ2xhc3M7IC8vIFJ1bGUgNC4KICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNEeW5hbWljUmVsYXRlZChEeW5hbWljVHlwZSBzLCBUeXBlUGFyYW1ldGVyVHlwZSB0LCBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0Z1bmN0aW9uUmVsYXRlZChGdW5jdGlvblR5cGUgcywgVHlwZVBhcmFtZXRlclR5cGUgdCwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNGdXR1cmVPclJlbGF0ZWQoCiAgICAgIEludGVyZmFjZVR5cGUgZnV0dXJlT3IsIFR5cGVQYXJhbWV0ZXJUeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzVHlwZWRlZlJlbGF0ZWQoVHlwZWRlZlR5cGUgcywgVHlwZVBhcmFtZXRlclR5cGUgdCwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiB0eXBlcy5pc1N1YnR5cGVPZktlcm5lbChzLnVuYWxpYXMsIHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1ZvaWRSZWxhdGVkKFZvaWRUeXBlIHMsIFR5cGVQYXJhbWV0ZXJUeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CgpjbGFzcyBJc1R5cGVkZWZTdWJ0eXBlT2YgZXh0ZW5kcyBUeXBlUmVsYXRpb248VHlwZWRlZlR5cGU+IHsKICBjb25zdCBJc1R5cGVkZWZTdWJ0eXBlT2YoKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0ludGVyZmFjZVJlbGF0ZWQoSW50ZXJmYWNlVHlwZSBzLCBUeXBlZGVmVHlwZSB0LCBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIHR5cGVzLmlzU3VidHlwZU9mS2VybmVsKHMsIHQudW5hbGlhcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzRHluYW1pY1JlbGF0ZWQoRHluYW1pY1R5cGUgcywgVHlwZWRlZlR5cGUgdCwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiB0eXBlcy5pc1N1YnR5cGVPZktlcm5lbChzLCB0LnVuYWxpYXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0Z1bmN0aW9uUmVsYXRlZChGdW5jdGlvblR5cGUgcywgVHlwZWRlZlR5cGUgdCwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiB0eXBlcy5pc1N1YnR5cGVPZktlcm5lbChzLCB0LnVuYWxpYXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0Z1dHVyZU9yUmVsYXRlZChJbnRlcmZhY2VUeXBlIGZ1dHVyZU9yLCBUeXBlZGVmVHlwZSB0LCBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIHR5cGVzLmlzU3VidHlwZU9mS2VybmVsKGZ1dHVyZU9yLCB0LnVuYWxpYXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0ludGVyc2VjdGlvblJlbGF0ZWQoCiAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlIGludGVyc2VjdGlvbiwgVHlwZWRlZlR5cGUgdCwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiB0eXBlcy5pc1N1YnR5cGVPZktlcm5lbChpbnRlcnNlY3Rpb24sIHQudW5hbGlhcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzVHlwZVBhcmFtZXRlclJlbGF0ZWQoVHlwZVBhcmFtZXRlclR5cGUgcywgVHlwZWRlZlR5cGUgdCwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiB0eXBlcy5pc1N1YnR5cGVPZktlcm5lbChzLCB0LnVuYWxpYXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1R5cGVkZWZSZWxhdGVkKFR5cGVkZWZUeXBlIHMsIFR5cGVkZWZUeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gdHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwocy51bmFsaWFzLCB0LnVuYWxpYXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1ZvaWRSZWxhdGVkKFZvaWRUeXBlIHMsIFR5cGVkZWZUeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gdHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwocywgdC51bmFsaWFzKTsKICB9Cn0KCmNsYXNzIElzRnV0dXJlT3JTdWJ0eXBlT2YgZXh0ZW5kcyBUeXBlUmVsYXRpb248SW50ZXJmYWNlVHlwZT4gewogIGNvbnN0IElzRnV0dXJlT3JTdWJ0eXBlT2YoKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0ludGVyZmFjZVJlbGF0ZWQoCiAgICAgIEludGVyZmFjZVR5cGUgcywgSW50ZXJmYWNlVHlwZSBmdXR1cmVPciwgVHlwZXMgdHlwZXMpIHsKICAgIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cyA9IGZ1dHVyZU9yLnR5cGVBcmd1bWVudHM7CiAgICBpZiAodHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwocywgYXJndW1lbnRzLnNpbmdsZSkpIHsKICAgICAgcmV0dXJuIHRydWU7IC8vIFJ1bGUgMTEuCiAgICB9CiAgICAvLyBSdWxlIDEwLgogICAgcmV0dXJuIHR5cGVzLmlzU3VidHlwZU9mS2VybmVsKAogICAgICAgIHMsIG5ldyBJbnRlcmZhY2VUeXBlKHR5cGVzLmhpZXJhcmNoeS5mdXR1cmVLZXJuZWxDbGFzcywgYXJndW1lbnRzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzRnV0dXJlT3JSZWxhdGVkKAogICAgICBJbnRlcmZhY2VUeXBlIHNGdXR1cmVPciwgSW50ZXJmYWNlVHlwZSB0RnV0dXJlT3IsIFR5cGVzIHR5cGVzKSB7CiAgICAvLyBUaGlzIGZvbGxvd3MgZnJvbSBjb21iaW5pbmcgcnVsZXMgNywgMTAsIGFuZCAxMS4KICAgIHJldHVybiB0eXBlcy5pc1N1YnR5cGVPZktlcm5lbCgKICAgICAgICBzRnV0dXJlT3IudHlwZUFyZ3VtZW50cy5zaW5nbGUsIHRGdXR1cmVPci50eXBlQXJndW1lbnRzLnNpbmdsZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzRHluYW1pY1JlbGF0ZWQoRHluYW1pY1R5cGUgcywgSW50ZXJmYWNlVHlwZSBmdXR1cmVPciwgVHlwZXMgdHlwZXMpIHsKICAgIC8vIFJ1bGUgMTEuCiAgICByZXR1cm4gdHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwocywgZnV0dXJlT3IudHlwZUFyZ3VtZW50cy5zaW5nbGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1ZvaWRSZWxhdGVkKFZvaWRUeXBlIHMsIEludGVyZmFjZVR5cGUgZnV0dXJlT3IsIFR5cGVzIHR5cGVzKSB7CiAgICAvLyBSdWxlIDExLgogICAgcmV0dXJuIHR5cGVzLmlzU3VidHlwZU9mS2VybmVsKHMsIGZ1dHVyZU9yLnR5cGVBcmd1bWVudHMuc2luZ2xlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNUeXBlUGFyYW1ldGVyUmVsYXRlZCgKICAgICAgVHlwZVBhcmFtZXRlclR5cGUgcywgSW50ZXJmYWNlVHlwZSBmdXR1cmVPciwgVHlwZXMgdHlwZXMpIHsKICAgIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cyA9IGZ1dHVyZU9yLnR5cGVBcmd1bWVudHM7CiAgICBpZiAodHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwocywgYXJndW1lbnRzLnNpbmdsZSkpIHsKICAgICAgLy8gUnVsZSAxMS4KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgaWYgKHR5cGVzLmlzU3VidHlwZU9mS2VybmVsKHMucGFyYW1ldGVyLmJvdW5kLCBmdXR1cmVPcikpIHsKICAgICAgLy8gUnVsZSAxMy4KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLy8gUnVsZSAxMC4KICAgIHJldHVybiB0eXBlcy5pc1N1YnR5cGVPZktlcm5lbCgKICAgICAgICBzLCBuZXcgSW50ZXJmYWNlVHlwZSh0eXBlcy5oaWVyYXJjaHkuZnV0dXJlS2VybmVsQ2xhc3MsIGFyZ3VtZW50cykpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0Z1bmN0aW9uUmVsYXRlZChGdW5jdGlvblR5cGUgcywgSW50ZXJmYWNlVHlwZSBmdXR1cmVPciwgVHlwZXMgdHlwZXMpIHsKICAgIC8vIFJ1bGUgMTEuCiAgICByZXR1cm4gdHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwocywgZnV0dXJlT3IudHlwZUFyZ3VtZW50cy5zaW5nbGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0ludGVyc2VjdGlvblJlbGF0ZWQoCiAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlIGludGVyc2VjdGlvbiwgSW50ZXJmYWNlVHlwZSBmdXR1cmVPciwgVHlwZXMgdHlwZXMpIHsKICAgIGlmIChpc1R5cGVQYXJhbWV0ZXJSZWxhdGVkKGludGVyc2VjdGlvbiwgZnV0dXJlT3IsIHR5cGVzKSkgewogICAgICAvLyBSdWxlIDguCiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgLy8gUnVsZSAxMi4KICAgIHJldHVybiB0eXBlcy5pc1N1YnR5cGVPZktlcm5lbChpbnRlcnNlY3Rpb24ucHJvbW90ZWRCb3VuZCwgZnV0dXJlT3IpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1R5cGVkZWZSZWxhdGVkKFR5cGVkZWZUeXBlIHMsIEludGVyZmFjZVR5cGUgZnV0dXJlT3IsIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gdHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwocy51bmFsaWFzLCBmdXR1cmVPcik7CiAgfQp9CgpjbGFzcyBJc0ludGVyc2VjdGlvblN1YnR5cGVPZiBleHRlbmRzIFR5cGVSZWxhdGlvbjxUeXBlUGFyYW1ldGVyVHlwZT4gewogIGNvbnN0IElzSW50ZXJzZWN0aW9uU3VidHlwZU9mKCk7CgogIEBvdmVycmlkZQogIGJvb2wgaXNJbnRlcnNlY3Rpb25SZWxhdGVkKFR5cGVQYXJhbWV0ZXJUeXBlIHNJbnRlcnNlY3Rpb24sCiAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlIHRJbnRlcnNlY3Rpb24sIFR5cGVzIHR5cGVzKSB7CiAgICAvLyBSdWxlIDkuCiAgICByZXR1cm4gY29uc3QgSXNUeXBlUGFyYW1ldGVyU3VidHlwZU9mKCkKICAgICAgICAgICAgLmlzSW50ZXJzZWN0aW9uUmVsYXRlZChzSW50ZXJzZWN0aW9uLCB0SW50ZXJzZWN0aW9uLCB0eXBlcykgJiYKICAgICAgICB0eXBlcy5pc1N1YnR5cGVPZktlcm5lbChzSW50ZXJzZWN0aW9uLCB0SW50ZXJzZWN0aW9uLnByb21vdGVkQm91bmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1R5cGVQYXJhbWV0ZXJSZWxhdGVkKAogICAgICBUeXBlUGFyYW1ldGVyVHlwZSBzLCBUeXBlUGFyYW1ldGVyVHlwZSBpbnRlcnNlY3Rpb24sIFR5cGVzIHR5cGVzKSB7CiAgICAvLyBSdWxlIDkuCiAgICByZXR1cm4gY29uc3QgSXNUeXBlUGFyYW1ldGVyU3VidHlwZU9mKCkKICAgICAgICAgICAgLmlzVHlwZVBhcmFtZXRlclJlbGF0ZWQocywgaW50ZXJzZWN0aW9uLCB0eXBlcykgJiYKICAgICAgICB0eXBlcy5pc1N1YnR5cGVPZktlcm5lbChzLCBpbnRlcnNlY3Rpb24ucHJvbW90ZWRCb3VuZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSW50ZXJmYWNlUmVsYXRlZCgKICAgICAgSW50ZXJmYWNlVHlwZSBzLCBUeXBlUGFyYW1ldGVyVHlwZSBpbnRlcnNlY3Rpb24sIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gcy5jbGFzc05vZGUgPT0gdHlwZXMuaGllcmFyY2h5Lm51bGxLZXJuZWxDbGFzczsgLy8gUnVsZSA0LgogIH0KCiAgYm9vbCBpc0R5bmFtaWNSZWxhdGVkKAogICAgICBEeW5hbWljVHlwZSBzLCBUeXBlUGFyYW1ldGVyVHlwZSBpbnRlcnNlY3Rpb24sIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBib29sIGlzRnVuY3Rpb25SZWxhdGVkKAogICAgICBGdW5jdGlvblR5cGUgcywgVHlwZVBhcmFtZXRlclR5cGUgaW50ZXJzZWN0aW9uLCBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgYm9vbCBpc0Z1dHVyZU9yUmVsYXRlZCgKICAgICAgSW50ZXJmYWNlVHlwZSBmdXR1cmVPciwgVHlwZVBhcmFtZXRlclR5cGUgaW50ZXJzZWN0aW9uLCBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgYm9vbCBpc1R5cGVkZWZSZWxhdGVkKAogICAgICBUeXBlZGVmVHlwZSBzLCBUeXBlUGFyYW1ldGVyVHlwZSBpbnRlcnNlY3Rpb24sIFR5cGVzIHR5cGVzKSB7CiAgICAvLyBSdWxlIDUuCiAgICByZXR1cm4gdHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwocy51bmFsaWFzLCBpbnRlcnNlY3Rpb24pOwogIH0KCiAgYm9vbCBpc1ZvaWRSZWxhdGVkKFZvaWRUeXBlIHMsIFR5cGVQYXJhbWV0ZXJUeXBlIGludGVyc2VjdGlvbiwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiBmYWxzZTsKICB9Cn0KgnUATk48ARUBIQkUDxIVFhcVExcbFRIBPQE5AQ4pARkBLzMbHgYcLBMGHBQGHB4GGR4GGxQGHh8wIAgySiA4JDUpPjc5KDktKTw8JzgKD0wgOCQ1KT43OSg5LSk8PCc4CggkSB42IjMnPDU3JjcrJzo6JTYIKSUyLiA4JDUpPjc5KDktKTw8JzgKDzEtIDgkNSk+NzkoOS0pPDwnOAoII0YeNiIzJzw1NyY3Kyc6OiU2CA0wBksEAUZBIDwGKTgGEQQBMj8EAgEyGAE6ATQBPgFQATwBRAFGAToCAUEgAQxLOkkxEwYgQx8UDSg3BgQBDB87OgQBDFE3OSAGIk8gBhEEAQweRk8EAQxHEgQBDElLBAEMRw8yBAEMQRIEAgE/HwEMSDs7RiVNLz4sODk5UUc7KgpMCCJMJTo7OydAJhoMCghABkw5OT8cFAYzJhQGM0YeFggGMDAySEJOAUpQOxY/KzMyCjMmORgKCAYRBAEMSkYEAQxOAQxQEgQBDB5FEEMEAQwfOhA6BAEMRg8yBAEMQBIEAgFJJAEMHz8pFC0EAQweSj0EAQxPRgQBDEsSBAEMTRIEAQwaQhIEAQxLMgQBDEUSBAIBPR4BDEkyBAEMRTIEAQxHMgQBDE85BAEMHkQ9BAEMUTIEAQxFOgQBDD8yBAIBQB8BDBs+NzgfBhAkTQQBDBpHOCRJBAEMThBGBAEMSBBGBAEMH0I3OBITBgFAEhMGARAkTQQBDFAQRgQBDB5NQRETBhBKBAEMTjkEAgFIIwEMPjYPLEtNBAEMH0oPLD9ABAEMG0ZGBAEZRBIEARpFEgQBGk0SBAEZRA89BAFQEgQCAS1wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL3R5cGVzLmRhcnREc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfYm9keV9idWlsZGVyLmRhcnSF4S8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmtlcm5lbF9ib2R5X2J1aWxkZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IEV4cHJlc3Npb247CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfaW5mZXJyZXIuZGFydCcgc2hvdyBUeXBlSW5mZXJyZXI7CgppbXBvcnQgJ2JvZHlfYnVpbGRlci5kYXJ0JyBzaG93IEJvZHlCdWlsZGVyOwoKaW1wb3J0ICdmYW5nb3JuLmRhcnQnIHNob3cgRmFuZ29ybjsKCmltcG9ydCAnZm9yZXN0LmRhcnQnIHNob3cgRm9yZXN0OwoKaW1wb3J0ICdrZXJuZWxfYXBpLmRhcnQnIHNob3cgQ2xhc3NIaWVyYXJjaHksIENvcmVUeXBlczsKCmltcG9ydCAna2VybmVsX2J1aWxkZXIuZGFydCcKICAgIHNob3cgS2VybmVsQ2xhc3NCdWlsZGVyLCBLZXJuZWxMaWJyYXJ5QnVpbGRlciwgTW9kaWZpZXJCdWlsZGVyLCBTY29wZTsKCmNsYXNzIEtlcm5lbEJvZHlCdWlsZGVyIGV4dGVuZHMgQm9keUJ1aWxkZXIgewogIEBvdmVycmlkZQogIGZpbmFsIEZvcmVzdCBmb3Jlc3Q7CgogIEtlcm5lbEJvZHlCdWlsZGVyKAogICAgICBLZXJuZWxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LAogICAgICBNb2RpZmllckJ1aWxkZXIgbWVtYmVyLAogICAgICBTY29wZSBzY29wZSwKICAgICAgU2NvcGUgZm9ybWFsUGFyYW1ldGVyU2NvcGUsCiAgICAgIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSwKICAgICAgQ29yZVR5cGVzIGNvcmVUeXBlcywKICAgICAgS2VybmVsQ2xhc3NCdWlsZGVyIGNsYXNzQnVpbGRlciwKICAgICAgYm9vbCBpc0luc3RhbmNlTWVtYmVyLAogICAgICBVcmkgdXJpLAogICAgICBUeXBlSW5mZXJyZXIgdHlwZUluZmVycmVyKQogICAgICA6IGZvcmVzdCA9IGNvbnN0IEZhbmdvcm4oKSwKICAgICAgICBzdXBlcihsaWJyYXJ5LCBtZW1iZXIsIHNjb3BlLCBmb3JtYWxQYXJhbWV0ZXJTY29wZSwgaGllcmFyY2h5LAogICAgICAgICAgICBjb3JlVHlwZXMsIGNsYXNzQnVpbGRlciwgaXNJbnN0YW5jZU1lbWJlciwgdXJpLCB0eXBlSW5mZXJyZXIpOwoKICBLZXJuZWxCb2R5QnVpbGRlci5mb3JGaWVsZChNb2RpZmllckJ1aWxkZXIgbWVtYmVyLCBUeXBlSW5mZXJyZXIgdHlwZUluZmVycmVyKQogICAgICA6IGZvcmVzdCA9IGNvbnN0IEZhbmdvcm4oKSwKICAgICAgICBzdXBlci5mb3JGaWVsZChtZW1iZXIsIHR5cGVJbmZlcnJlcik7CgogIEBvdmVycmlkZQogIHZvaWQgZW50ZXJUaGVuRm9yVHlwZVByb21vdGlvbihFeHByZXNzaW9uIGNvbmRpdGlvbikgewogICAgdHlwZVByb21vdGVyPy5lbnRlclRoZW4oY29uZGl0aW9uKTsKICB9Cn0KMwBOTjwBIwEyAUEBLQEkASIBOQEdSwEuDBcBFSQeEyIgGycdDyEiR0sBUCIuAQw5KAQCATtwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF9ib2R5X2J1aWxkZXIuZGFydExzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL2V4cHJlc3Npb25fZ2VuZXJhdG9yX2hlbHBlci5kYXJ0lDYvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5leHByZXNzaW9uX2dlbmVyYXRvcl9oZWxwZXI7CgppbXBvcnQgJy4uLy4uL3NjYW5uZXIvdG9rZW4uZGFydCcgc2hvdyBUb2tlbjsKCmltcG9ydCAnLi4vY29uc3RhbnRfY29udGV4dC5kYXJ0JyBzaG93IENvbnN0YW50Q29udGV4dDsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcgc2hvdyBMb2NhdGVkTWVzc2FnZTsKCmltcG9ydCAnLi4vbWVzc2FnZXMuZGFydCcgc2hvdyBNZXNzYWdlOwoKaW1wb3J0ICcuLi9zY29wZS5kYXJ0JyBzaG93IFNjb3BlOwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS9pbmZlcmVuY2VfaGVscGVyLmRhcnQnIHNob3cgSW5mZXJlbmNlSGVscGVyOwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX3Byb21vdGlvbi5kYXJ0JyBzaG93IFR5cGVQcm9tb3RlcjsKCmltcG9ydCAnY29uc3RuZXNzLmRhcnQnIHNob3cgQ29uc3RuZXNzOwoKaW1wb3J0ICdmb3Jlc3QuZGFydCcgc2hvdyBGb3Jlc3Q7CgppbXBvcnQgJ2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93IERlY2xhcmF0aW9uLCBLZXJuZWxUeXBlQnVpbGRlciwgUHJlZml4QnVpbGRlciwgVW5yZXNvbHZlZFR5cGU7CgppbXBvcnQgJ2tlcm5lbF9hc3RfYXBpLmRhcnQnCiAgICBzaG93CiAgICAgICAgQXJndW1lbnRzLAogICAgICAgIENvbnN0cnVjdG9yLAogICAgICAgIERhcnRUeXBlLAogICAgICAgIEV4cHJlc3Npb24sCiAgICAgICAgRnVuY3Rpb25Ob2RlLAogICAgICAgIEluaXRpYWxpemVyLAogICAgICAgIE1lbWJlciwKICAgICAgICBOYW1lLAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBTdGF0aWNHZXQsCiAgICAgICAgVHlwZVBhcmFtZXRlcjsKCmltcG9ydCAna2VybmVsX2J1aWxkZXIuZGFydCcKICAgIHNob3cKICAgICAgICBLZXJuZWxQcmVmaXhCdWlsZGVyLAogICAgICAgIExpYnJhcnlCdWlsZGVyLAogICAgICAgIFByZWZpeEJ1aWxkZXIsCiAgICAgICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlcjsKCmFic3RyYWN0IGNsYXNzIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaW1wbGVtZW50cyBJbmZlcmVuY2VIZWxwZXIgewogIExpYnJhcnlCdWlsZGVyIGdldCBsaWJyYXJ5OwoKICBUeXBlUHJvbW90ZXIgZ2V0IHR5cGVQcm9tb3RlcjsKCiAgaW50IGdldCBmdW5jdGlvbk5lc3RpbmdMZXZlbDsKCiAgQ29uc3RhbnRDb250ZXh0IGdldCBjb25zdGFudENvbnRleHQ7CgogIEZvcmVzdCBnZXQgZm9yZXN0OwoKICBib29sIGdldCBsZWdhY3lNb2RlOwoKICBDb25zdHJ1Y3RvciBsb29rdXBDb25zdHJ1Y3RvcihOYW1lIG5hbWUsIHtib29sIGlzU3VwZXJ9KTsKCiAgRXhwcmVzc2lvbiB0b1ZhbHVlKG5vZGUpOwoKICBNZW1iZXIgbG9va3VwSW5zdGFuY2VNZW1iZXIoTmFtZSBuYW1lLCB7Ym9vbCBpc1NldHRlciwgYm9vbCBpc1N1cGVyfSk7CgogIHNjb3BlTG9va3VwKFNjb3BlIHNjb3BlLCBTdHJpbmcgbmFtZSwgVG9rZW4gdG9rZW4sCiAgICAgIHtib29sIGlzUXVhbGlmaWVkOiBmYWxzZSwgUHJlZml4QnVpbGRlciBwcmVmaXh9KTsKCiAgZmluaXNoU2VuZChPYmplY3QgcmVjZWl2ZXIsIEFyZ3VtZW50cyBhcmd1bWVudHMsIGludCBvZmZzZXQpOwoKICBJbml0aWFsaXplciBidWlsZEludmFsaWRJbml0aWFsaXplcihFeHByZXNzaW9uIGV4cHJlc3Npb24sIFtpbnQgb2Zmc2V0XSk7CgogIEluaXRpYWxpemVyIGJ1aWxkRmllbGRJbml0aWFsaXplcihib29sIGlzU3ludGhldGljLCBTdHJpbmcgbmFtZSwKICAgICAgaW50IGZpZWxkTmFtZU9mZnNldCwgaW50IGFzc2lnbm1lbnRPZmZzZXQsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwKICAgICAge0RhcnRUeXBlIGZvcm1hbFR5cGV9KTsKCiAgSW5pdGlhbGl6ZXIgYnVpbGRTdXBlckluaXRpYWxpemVyKAogICAgICBib29sIGlzU3ludGhldGljLCBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciwgQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAgW2ludCBvZmZzZXRdKTsKCiAgSW5pdGlhbGl6ZXIgYnVpbGRSZWRpcmVjdGluZ0luaXRpYWxpemVyKAogICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciwgQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAgW2ludCBjaGFyT2Zmc2V0ID0gLTFdKTsKCiAgRXhwcmVzc2lvbiBidWlsZFN0YXRpY0ludm9jYXRpb24oUHJvY2VkdXJlIHRhcmdldCwgQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAge0NvbnN0bmVzcyBjb25zdG5lc3MsIGludCBjaGFyT2Zmc2V0fSk7CgogIEV4cHJlc3Npb24gdGhyb3dOb1N1Y2hNZXRob2RFcnJvcigKICAgICAgRXhwcmVzc2lvbiByZWNlaXZlciwgU3RyaW5nIG5hbWUsIEFyZ3VtZW50cyBhcmd1bWVudHMsIGludCBvZmZzZXQsCiAgICAgIHtNZW1iZXIgY2FuZGlkYXRlLAogICAgICBib29sIGlzU3VwZXIsCiAgICAgIGJvb2wgaXNHZXR0ZXIsCiAgICAgIGJvb2wgaXNTZXR0ZXIsCiAgICAgIGJvb2wgaXNTdGF0aWMsCiAgICAgIExvY2F0ZWRNZXNzYWdlIG1lc3NhZ2V9KTsKCiAgTG9jYXRlZE1lc3NhZ2UgY2hlY2tBcmd1bWVudHNGb3JGdW5jdGlvbihGdW5jdGlvbk5vZGUgZnVuY3Rpb24sCiAgICAgIEFyZ3VtZW50cyBhcmd1bWVudHMsIGludCBvZmZzZXQsIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMpOwoKICBTdGF0aWNHZXQgbWFrZVN0YXRpY0dldChNZW1iZXIgcmVhZFRhcmdldCwgVG9rZW4gdG9rZW4pOwoKICBFeHByZXNzaW9uIHdyYXBJbkRlZmVycmVkQ2hlY2soCiAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgS2VybmVsUHJlZml4QnVpbGRlciBwcmVmaXgsIGludCBjaGFyT2Zmc2V0KTsKCiAgYm9vbCBpc0lkZW50aWNhbChNZW1iZXIgbWVtYmVyKTsKCiAgRXhwcmVzc2lvbiBidWlsZE1ldGhvZEludm9jYXRpb24oCiAgICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIsIE5hbWUgbmFtZSwgQXJndW1lbnRzIGFyZ3VtZW50cywgaW50IG9mZnNldCwKICAgICAge2Jvb2wgaXNDb25zdGFudEV4cHJlc3Npb24sCiAgICAgIGJvb2wgaXNOdWxsQXdhcmUsCiAgICAgIGJvb2wgaXNJbXBsaWNpdENhbGwsCiAgICAgIGJvb2wgaXNTdXBlciwKICAgICAgTWVtYmVyIGludGVyZmFjZVRhcmdldH0pOwoKICBFeHByZXNzaW9uIGJ1aWxkQ29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgICBUeXBlRGVjbGFyYXRpb25CdWlsZGVyPEtlcm5lbFR5cGVCdWlsZGVyLCBEYXJ0VHlwZT4gdHlwZSwKICAgICAgVG9rZW4gbmFtZVRva2VuLAogICAgICBUb2tlbiBuYW1lTGFzdFRva2VuLAogICAgICBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICBTdHJpbmcgbmFtZSwKICAgICAgTGlzdDxVbnJlc29sdmVkVHlwZTxLZXJuZWxUeXBlQnVpbGRlcj4+IHR5cGVBcmd1bWVudHMsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBDb25zdG5lc3MgY29uc3RuZXNzKTsKCiAgVW5yZXNvbHZlZFR5cGU8S2VybmVsVHlwZUJ1aWxkZXI+IHZhbGlkYXRlVHlwZVVzZSgKICAgICAgVW5yZXNvbHZlZFR5cGU8S2VybmVsVHlwZUJ1aWxkZXI+IHVucmVzb2x2ZWQsCiAgICAgIGJvb2wgbm9uSW5zdGFuY2VBY2Nlc3NJc0Vycm9yKTsKCiAgdm9pZCBhZGRQcm9ibGVtRXJyb3JJZkNvbnN0KE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgpOwoKICBNZXNzYWdlIHdhcm5VbnJlc29sdmVkR2V0KE5hbWUgbmFtZSwgaW50IGNoYXJPZmZzZXQsIHtib29sIGlzU3VwZXJ9KTsKCiAgTWVzc2FnZSB3YXJuVW5yZXNvbHZlZFNldChOYW1lIG5hbWUsIGludCBjaGFyT2Zmc2V0LCB7Ym9vbCBpc1N1cGVyfSk7CgogIE1lc3NhZ2Ugd2FyblVucmVzb2x2ZWRNZXRob2QoTmFtZSBuYW1lLCBpbnQgY2hhck9mZnNldCwge2Jvb2wgaXNTdXBlcn0pOwoKICB2b2lkIHdhcm5UeXBlQXJndW1lbnRzTWlzbWF0Y2goU3RyaW5nIG5hbWUsIGludCBleHBlY3RlZCwgaW50IGNoYXJPZmZzZXQpOwoKICBFeHByZXNzaW9uIHdyYXBJbkxvY2F0ZWRQcm9ibGVtKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgTG9jYXRlZE1lc3NhZ2UgbWVzc2FnZSwKICAgICAge0xpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHR9KTsKCiAgRXhwcmVzc2lvbiBldmFsdWF0ZUFyZ3VtZW50c0JlZm9yZSgKICAgICAgQXJndW1lbnRzIGFyZ3VtZW50cywgRXhwcmVzc2lvbiBleHByZXNzaW9uKTsKCiAgRGFydFR5cGUgYnVpbGREYXJ0VHlwZShVbnJlc29sdmVkVHlwZTxLZXJuZWxUeXBlQnVpbGRlcj4gdW5yZXNvbHZlZFR5cGUsCiAgICAgIHtib29sIG5vbkluc3RhbmNlQWNjZXNzSXNFcnJvcn0pOwoKICBMaXN0PERhcnRUeXBlPiBidWlsZERhcnRUeXBlQXJndW1lbnRzKAogICAgICBMaXN0PFVucmVzb2x2ZWRUeXBlPEtlcm5lbFR5cGVCdWlsZGVyPj4gdW5yZXNvbHZlZFR5cGVzKTsKCiAgdm9pZCByZXBvcnREdXBsaWNhdGVkRGVjbGFyYXRpb24oCiAgICAgIERlY2xhcmF0aW9uIGV4aXN0aW5nLCBTdHJpbmcgbmFtZSwgaW50IGNoYXJPZmZzZXQpOwoKICBFeHByZXNzaW9uIHdyYXBTeW50aGV0aWNFeHByZXNzaW9uKEV4cHJlc3Npb24gbm9kZSwgaW50IGNoYXJPZmZzZXQpOwoKICBFeHByZXNzaW9uIHdyYXBJbnZhbGlkQ29uc3RydWN0b3JJbnZvY2F0aW9uKEV4cHJlc3Npb24gZGVzdWdhcmVkLAogICAgICBNZW1iZXIgY29uc3RydWN0b3IsIEFyZ3VtZW50cyBhcmd1bWVudHMsIGludCBjaGFyT2Zmc2V0KTsKCiAgRXhwcmVzc2lvbiB3cmFwSW52YWxpZFdyaXRlKAogICAgICBFeHByZXNzaW9uIGRlc3VnYXJlZCwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBpbnQgY2hhck9mZnNldCk7CgogIEV4cHJlc3Npb24gd3JhcFVucmVzb2x2ZWRUYXJnZXRJbnZvY2F0aW9uKAogICAgICBFeHByZXNzaW9uIGRlc3VnYXJlZCwgQXJndW1lbnRzIGFyZ3VtZW50cywgaW50IGNoYXJPZmZzZXQpOwoKICBFeHByZXNzaW9uIHdyYXBVbnJlc29sdmVkVmFyaWFibGVBc3NpZ25tZW50KAogICAgICBFeHByZXNzaW9uIGRlc3VnYXJlZCwgYm9vbCBpc0NvbXBvdW5kLCBFeHByZXNzaW9uIHJocywgaW50IGNoYXJPZmZzZXQpOwp9CoCrAE5OPAErAS4BOAEyASgBIwFHAUIBKAEiAR1IAR0JExUSFBYVEA4TExcBHQkdGBcgAUYeASEBIAEnARUBFwE8ARwBSQE1OAFAAUwBQ0geASVGFQErNB4BSi4BJUkZFBUVFSABQkwBOwEiSgEjASRHIhgbFCABKUAXGxsTPRYcATU0JgFMAUgBSAFLAU0BUScBJjMBSygBKUABJDoBRwFEQAEfRAEtQgEvTgIBQ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvZXhwcmVzc2lvbl9nZW5lcmF0b3JfaGVscGVyLmRhcnQ3c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9mb3Jlc3QuZGFydMAASQsvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5mb3Jlc3Q7CgppbXBvcnQgJ2RhcnQ6Y29yZScgaGlkZSBNYXBFbnRyeTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQXJndW1lbnRzLAogICAgICAgIENhdGNoLAogICAgICAgIERhcnRUeXBlLAogICAgICAgIEV4cHJlc3Npb24sCiAgICAgICAgTGlicmFyeURlcGVuZGVuY3ksCiAgICAgICAgTWFwRW50cnksCiAgICAgICAgTWVtYmVyLAogICAgICAgIE5hbWUsCiAgICAgICAgTmFtZWRFeHByZXNzaW9uLAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBTdGF0ZW1lbnQsCiAgICAgICAgVHJlZU5vZGUsCiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbjsKCmltcG9ydCAnYm9keV9idWlsZGVyLmRhcnQnIHNob3cgTGFiZWxUYXJnZXQ7CgppbXBvcnQgJ2V4cHJlc3Npb25fZ2VuZXJhdG9yLmRhcnQnIHNob3cgR2VuZXJhdG9yLCBQcmVmaXhVc2VHZW5lcmF0b3I7CgppbXBvcnQgJ2V4cHJlc3Npb25fZ2VuZXJhdG9yX2hlbHBlci5kYXJ0JyBzaG93IEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXI7CgppbXBvcnQgJ2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgSWRlbnRpZmllciwKICAgICAgICBMb2FkTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgUHJlZml4QnVpbGRlciwKICAgICAgICBUeXBlRGVjbGFyYXRpb25CdWlsZGVyLAogICAgICAgIFVubGlua2VkRGVjbGFyYXRpb247CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnIHNob3cgTWVzc2FnZTsKCmltcG9ydCAnLi4vc2Nhbm5lci5kYXJ0JyBzaG93IFRva2VuOwoKZXhwb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JyBzaG93IE1lc3NhZ2U7CgpleHBvcnQgJ2JvZHlfYnVpbGRlci5kYXJ0JyBzaG93IE9wZXJhdG9yOwoKZXhwb3J0ICdjb25zdG5lc3MuZGFydCcgc2hvdyBDb25zdG5lc3M7CgpleHBvcnQgJ2V4cHJlc3Npb25fZ2VuZXJhdG9yLmRhcnQnIHNob3cgR2VuZXJhdG9yLCBQcmVmaXhVc2VHZW5lcmF0b3I7CgpleHBvcnQgJ2V4cHJlc3Npb25fZ2VuZXJhdG9yX2hlbHBlci5kYXJ0JyBzaG93IEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXI7CgpleHBvcnQgJ2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgSWRlbnRpZmllciwKICAgICAgICBMb2FkTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgUHJlZml4QnVpbGRlciwKICAgICAgICBUeXBlRGVjbGFyYXRpb25CdWlsZGVyLAogICAgICAgIFVubGlua2VkRGVjbGFyYXRpb247CgovLy8gQSB0cmVlIGZhY3RvcnkuCmFic3RyYWN0IGNsYXNzIEZvcmVzdCB7CiAgY29uc3QgRm9yZXN0KCk7CgogIEFyZ3VtZW50cyBhcmd1bWVudHMoTGlzdDxFeHByZXNzaW9uPiBwb3NpdGlvbmFsLCBUb2tlbiBsb2NhdGlvbiwKICAgICAge0xpc3Q8RGFydFR5cGU+IHR5cGVzLCBMaXN0PE5hbWVkRXhwcmVzc2lvbj4gbmFtZWR9KTsKCiAgQXJndW1lbnRzIGFyZ3VtZW50c0VtcHR5KFRva2VuIGxvY2F0aW9uKTsKCiAgTGlzdDxPYmplY3Q+IGFyZ3VtZW50c05hbWVkKEFyZ3VtZW50cyBhcmd1bWVudHMpOwoKICBMaXN0PEV4cHJlc3Npb24+IGFyZ3VtZW50c1Bvc2l0aW9uYWwoQXJndW1lbnRzIGFyZ3VtZW50cyk7CgogIExpc3QgYXJndW1lbnRzVHlwZUFyZ3VtZW50cyhBcmd1bWVudHMgYXJndW1lbnRzKTsKCiAgdm9pZCBhcmd1bWVudHNTZXRUeXBlQXJndW1lbnRzKEFyZ3VtZW50cyBhcmd1bWVudHMsIExpc3Q8RGFydFR5cGU+IHR5cGVzKTsKCiAgRXhwcmVzc2lvbiBhc0xpdGVyYWxTdHJpbmcoRXhwcmVzc2lvbiB2YWx1ZSk7CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIGJvb2xlYW4gbGl0ZXJhbCBhdCB0aGUgZ2l2ZW4gW2xvY2F0aW9uXS4gVGhlCiAgLy8vIGxpdGVyYWwgaGFzIHRoZSBnaXZlbiBbdmFsdWVdLgogIEV4cHJlc3Npb24gbGl0ZXJhbEJvb2woYm9vbCB2YWx1ZSwgVG9rZW4gbG9jYXRpb24pOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSBkb3VibGUgbGl0ZXJhbCBhdCB0aGUgZ2l2ZW4gW2xvY2F0aW9uXS4gVGhlCiAgLy8vIGxpdGVyYWwgaGFzIHRoZSBnaXZlbiBbdmFsdWVdLgogIEV4cHJlc3Npb24gbGl0ZXJhbERvdWJsZShkb3VibGUgdmFsdWUsIFRva2VuIGxvY2F0aW9uKTsKCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIgbGl0ZXJhbCBhdCB0aGUgZ2l2ZW4gW2xvY2F0aW9uXS4gVGhlCiAgLy8vIGxpdGVyYWwgaGFzIHRoZSBnaXZlbiBbdmFsdWVdLgogIEV4cHJlc3Npb24gbGl0ZXJhbEludChpbnQgdmFsdWUsIFRva2VuIGxvY2F0aW9uKTsKCiAgRXhwcmVzc2lvbiBsaXRlcmFsTGFyZ2VJbnQoU3RyaW5nIGxpdGVyYWwsIFRva2VuIGxvY2F0aW9uKTsKCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGEgbGlzdCBsaXRlcmFsLiBUaGUgW2NvbnN0S2V5d29yZF0gaXMgdGhlCiAgLy8vIGxvY2F0aW9uIG9mIHRoZSBgY29uc3RgIGtleXdvcmQsIG9yIGBudWxsYCBpZiB0aGVyZSBpcyBubyBrZXl3b3JkLiBUaGUKICAvLy8gW2lzQ29uc3RdIGlzIGB0cnVlYCBpZiB0aGUgbGl0ZXJhbCBpcyBlaXRoZXIgZXhwbGljaXRseSBvciBpbXBsaWNpdGx5IGEKICAvLy8gY29uc3RhbnQuIFRoZSBbdHlwZUFyZ3VtZW50XSBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNpbmdsZSB2YWxpZAogIC8vLyB0eXBlIGFyZ3VtZW50IHByZWNlZGluZyB0aGUgbGlzdCBsaXRlcmFsLCBvciBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gdHlwZQogIC8vLyBhcmd1bWVudCwgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSB0eXBlIGFyZ3VtZW50LCBvciBpZiB0aGUgdHlwZSBhcmd1bWVudAogIC8vLyBjYW5ub3QgYmUgcmVzb2x2ZWQuIFRoZSBbdHlwZUFyZ3VtZW50c10gaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFsbCBvZgogIC8vLyB0aGUgdHlwZSBhcmd1bWVudHMgcHJlY2VkaW5nIHRoZSBsaXN0IGxpdGVyYWwsIG9yIGBudWxsYCBpZiB0aGVyZSBhcmUgbm8KICAvLy8gdHlwZSBhcmd1bWVudHMuIFRoZSBbbGVmdEJyYWNrZXRdIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgYFtgLiBUaGUgbGlzdCBvZgogIC8vLyBbZXhwcmVzc2lvbnNdIGlzIGEgbGlzdCBvZiB0aGUgcmVwcmVzZW50YXRpb25zIG9mIHRoZSBsaXN0IGVsZW1lbnRzLiBUaGUKICAvLy8gW3JpZ2h0QnJhY2tldF0gaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBgXWAuCiAgRXhwcmVzc2lvbiBsaXRlcmFsTGlzdCgKICAgICAgVG9rZW4gY29uc3RLZXl3b3JkLAogICAgICBib29sIGlzQ29uc3QsCiAgICAgIE9iamVjdCB0eXBlQXJndW1lbnQsCiAgICAgIE9iamVjdCB0eXBlQXJndW1lbnRzLAogICAgICBUb2tlbiBsZWZ0QnJhY2tldCwKICAgICAgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucywKICAgICAgVG9rZW4gcmlnaHRCcmFja2V0KTsKCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGEgc2V0IGxpdGVyYWwuIFRoZSBbY29uc3RLZXl3b3JkXSBpcyB0aGUKICAvLy8gbG9jYXRpb24gb2YgdGhlIGBjb25zdGAga2V5d29yZCwgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vIGtleXdvcmQuIFRoZQogIC8vLyBbaXNDb25zdF0gaXMgYHRydWVgIGlmIHRoZSBsaXRlcmFsIGlzIGVpdGhlciBleHBsaWNpdGx5IG9yIGltcGxpY2l0bHkgYQogIC8vLyBjb25zdGFudC4gVGhlIFt0eXBlQXJndW1lbnRdIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2luZ2xlIHZhbGlkCiAgLy8vIHR5cGUgYXJndW1lbnQgcHJlY2VkaW5nIHRoZSBzZXQgbGl0ZXJhbCwgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vIHR5cGUKICAvLy8gYXJndW1lbnQsIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgdHlwZSBhcmd1bWVudCwgb3IgaWYgdGhlIHR5cGUgYXJndW1lbnQKICAvLy8gY2Fubm90IGJlIHJlc29sdmVkLiBUaGUgW3R5cGVBcmd1bWVudHNdIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhbGwgb2YKICAvLy8gdGhlIHR5cGUgYXJndW1lbnRzIHByZWNlZGluZyB0aGUgc2V0IGxpdGVyYWwsIG9yIGBudWxsYCBpZiB0aGVyZSBhcmUgbm8KICAvLy8gdHlwZSBhcmd1bWVudHMuIFRoZSBbbGVmdEJyYWNlXSBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIGB7YC4gVGhlIGxpc3Qgb2YKICAvLy8gW2V4cHJlc3Npb25zXSBpcyBhIGxpc3Qgb2YgdGhlIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgc2V0IGVsZW1lbnRzLiBUaGUKICAvLy8gW3JpZ2h0QnJhY2VdIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgYH1gLgogIEV4cHJlc3Npb24gbGl0ZXJhbFNldCgKICAgICAgVG9rZW4gY29uc3RLZXl3b3JkLAogICAgICBib29sIGlzQ29uc3QsCiAgICAgIE9iamVjdCB0eXBlQXJndW1lbnQsCiAgICAgIE9iamVjdCB0eXBlQXJndW1lbnRzLAogICAgICBUb2tlbiBsZWZ0QnJhY2UsCiAgICAgIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMsCiAgICAgIFRva2VuIHJpZ2h0QnJhY2UpOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSBtYXAgbGl0ZXJhbC4gVGhlIFtjb25zdEtleXdvcmRdIGlzIHRoZQogIC8vLyBsb2NhdGlvbiBvZiB0aGUgYGNvbnN0YCBrZXl3b3JkLCBvciBgbnVsbGAgaWYgdGhlcmUgaXMgbm8ga2V5d29yZC4gVGhlCiAgLy8vIFtpc0NvbnN0XSBpcyBgdHJ1ZWAgaWYgdGhlIGxpdGVyYWwgaXMgZWl0aGVyIGV4cGxpY2l0bHkgb3IgaW1wbGljaXRseSBhCiAgLy8vIGNvbnN0YW50LiBUaGUgW2tleVR5cGVdIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmlyc3QgdHlwZSBhcmd1bWVudAogIC8vLyBwcmVjZWRpbmcgdGhlIG1hcCBsaXRlcmFsLCBvciBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vdCBleGFjdGx5IHR3byB0eXBlCiAgLy8vIGFyZ3VtZW50cyBvciBpZiB0aGUgZmlyc3QgdHlwZSBhcmd1bWVudCBjYW5ub3QgYmUgcmVzb2x2ZWQuIFRoZQogIC8vLyBbdmFsdWVUeXBlXSBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNlY29uZCB0eXBlIGFyZ3VtZW50IHByZWNlZGluZwogIC8vLyB0aGUgbWFwIGxpdGVyYWwsIG9yIGBudWxsYCBpZiB0aGVyZSBhcmUgbm90IGV4YWN0bHkgdHdvIHR5cGUgYXJndW1lbnRzIG9yCiAgLy8vIGlmIHRoZSBzZWNvbmQgdHlwZSBhcmd1bWVudCBjYW5ub3QgYmUgcmVzb2x2ZWQuIFRoZSBbdHlwZUFyZ3VtZW50c10gaXMgdGhlCiAgLy8vIHJlcHJlc2VudGF0aW9uIG9mIGFsbCBvZiB0aGUgdHlwZSBhcmd1bWVudHMgcHJlY2VkaW5nIHRoZSBtYXAgbGl0ZXJhbCwgb3IKICAvLy8gYG51bGxgIGlmIHRoZXJlIGFyZSBubyB0eXBlIGFyZ3VtZW50cy4gVGhlIFtsZWZ0QnJhY2VdIGlzIHRoZSBsb2NhdGlvbgogIC8vLyBvZiB0aGUgYHtgLiBUaGUgbGlzdCBvZiBbZW50cmllc10gaXMgYSBsaXN0IG9mIHRoZSByZXByZXNlbnRhdGlvbnMgb2YgdGhlCiAgLy8vIG1hcCBlbnRyaWVzLiBUaGUgW3JpZ2h0QnJhY2VdIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgYH1gLgogIEV4cHJlc3Npb24gbGl0ZXJhbE1hcCgKICAgICAgVG9rZW4gY29uc3RLZXl3b3JkLAogICAgICBib29sIGlzQ29uc3QsCiAgICAgIERhcnRUeXBlIGtleVR5cGUsCiAgICAgIERhcnRUeXBlIHZhbHVlVHlwZSwKICAgICAgT2JqZWN0IHR5cGVBcmd1bWVudHMsCiAgICAgIFRva2VuIGxlZnRCcmFjZSwKICAgICAgTGlzdDxNYXBFbnRyeT4gZW50cmllcywKICAgICAgVG9rZW4gcmlnaHRCcmFjZSk7CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIG51bGwgbGl0ZXJhbCBhdCB0aGUgZ2l2ZW4gW2xvY2F0aW9uXS4KICBFeHByZXNzaW9uIGxpdGVyYWxOdWxsKFRva2VuIGxvY2F0aW9uKTsKCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGEgc2ltcGxlIHN0cmluZyBsaXRlcmFsIGF0IHRoZSBnaXZlbgogIC8vLyBbbG9jYXRpb25dLiBUaGUgbGl0ZXJhbCBoYXMgdGhlIGdpdmVuIFt2YWx1ZV0uIFRoaXMgZG9lcyBub3QgaW5jbHVkZQogIC8vLyBlaXRoZXIgYWRqYWNlbnQgc3RyaW5ncyBvciBpbnRlcnBvbGF0ZWQgc3RyaW5ncy4KICBFeHByZXNzaW9uIGxpdGVyYWxTdHJpbmcoU3RyaW5nIHZhbHVlLCBUb2tlbiBsb2NhdGlvbik7CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIHN5bWJvbCBsaXRlcmFsIGRlZmluZWQgYnkgdGhlIFtoYXNoXSBhbmQgdGhlCiAgLy8vIGxpc3Qgb2YgW2NvbXBvbmVudHNdLiBUaGUgW3ZhbHVlXSBpcyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBzeW1ib2wuCiAgRXhwcmVzc2lvbiBsaXRlcmFsU3ltYm9sTXVsdGlwbGUoCiAgICAgIFN0cmluZyB2YWx1ZSwgVG9rZW4gaGFzaCwgTGlzdDxJZGVudGlmaWVyPiBjb21wb25lbnRzKTsKCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGEgc3ltYm9sIGxpdGVyYWwgZGVmaW5lZCBieSB0aGUgW2hhc2hdIGFuZCB0aGUKICAvLy8gc2luZ2xlIFtjb21wb25lbnRdLiBUaGUgY29tcG9uZW50IGNhbiBiZSBlaXRoZXIgYW4gW0lkZW50aWZpZXJdIG9yIGFuCiAgLy8vIFtPcGVyYXRvcl0uIFRoZSBbdmFsdWVdIGlzIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIHN5bWJvbC4KICBFeHByZXNzaW9uIGxpdGVyYWxTeW1ib2xTaW5nbHVhcihTdHJpbmcgdmFsdWUsIFRva2VuIGhhc2gsIE9iamVjdCBjb21wb25lbnQpOwoKICBFeHByZXNzaW9uIGxpdGVyYWxUeXBlKERhcnRUeXBlIHR5cGUsIFRva2VuIGxvY2F0aW9uKTsKCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGEga2V5L3ZhbHVlIHBhaXIgaW4gYSBsaXRlcmFsIG1hcC4gVGhlIFtrZXldIGlzCiAgLy8vIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXhwcmVzc2lvbiB1c2VkIHRvIGNvbXB1dGUgdGhlIGtleS4gVGhlIFtjb2xvbl0KICAvLy8gaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBjb2xvbiBzZXBhcmF0aW5nIHRoZSBrZXkgYW5kIHRoZSB2YWx1ZS4gVGhlIFt2YWx1ZV0KICAvLy8gaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBleHByZXNzaW9uIHVzZWQgdG8gY29tcHV0ZSB0aGUgdmFsdWUuCiAgT2JqZWN0IG1hcEVudHJ5KEV4cHJlc3Npb24ga2V5LCBUb2tlbiBjb2xvbiwgRXhwcmVzc2lvbiB2YWx1ZSk7CgogIGludCByZWFkT2Zmc2V0KFRyZWVOb2RlIG5vZGUpOwoKICBFeHByZXNzaW9uIGxvYWRMaWJyYXJ5KExpYnJhcnlEZXBlbmRlbmN5IGRlcGVuZGVuY3ksIEFyZ3VtZW50cyBhcmd1bWVudHMpOwoKICBFeHByZXNzaW9uIGNoZWNrTGlicmFyeUlzTG9hZGVkKExpYnJhcnlEZXBlbmRlbmN5IGRlcGVuZGVuY3kpOwoKICBFeHByZXNzaW9uIGFzRXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24sIERhcnRUeXBlIHR5cGUsIFRva2VuIGxvY2F0aW9uKTsKCiAgRXhwcmVzc2lvbiBzcHJlYWRFbGVtZW50KEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgVG9rZW4gdG9rZW4pOwoKICBFeHByZXNzaW9uIGlmRWxlbWVudCgKICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24sIEV4cHJlc3Npb24gdGhlbiwgRXhwcmVzc2lvbiBvdGhlcndpc2UsIFRva2VuIHRva2VuKTsKCiAgTWFwRW50cnkgaWZNYXBFbnRyeSgKICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24sIE1hcEVudHJ5IHRoZW4sIE1hcEVudHJ5IG90aGVyd2lzZSwgVG9rZW4gdG9rZW4pOwoKICBFeHByZXNzaW9uIGZvckVsZW1lbnQoCiAgICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gdmFyaWFibGVzLAogICAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiwKICAgICAgTGlzdDxFeHByZXNzaW9uPiB1cGRhdGVzLAogICAgICBFeHByZXNzaW9uIGJvZHksCiAgICAgIFRva2VuIHRva2VuKTsKCiAgTWFwRW50cnkgZm9yTWFwRW50cnkoCiAgICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gdmFyaWFibGVzLAogICAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiwKICAgICAgTGlzdDxFeHByZXNzaW9uPiB1cGRhdGVzLAogICAgICBNYXBFbnRyeSBib2R5LAogICAgICBUb2tlbiB0b2tlbik7CgogIEV4cHJlc3Npb24gZm9ySW5FbGVtZW50KFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIEV4cHJlc3Npb24gaXRlcmFibGUsCiAgICAgIFN0YXRlbWVudCBwcm9sb2d1ZSwgRXhwcmVzc2lvbiBib2R5LCBFeHByZXNzaW9uIHByb2JsZW0sIFRva2VuIHRva2VuLAogICAgICB7Ym9vbCBpc0FzeW5jOiBmYWxzZX0pOwoKICBNYXBFbnRyeSBmb3JJbk1hcEVudHJ5KFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIEV4cHJlc3Npb24gaXRlcmFibGUsCiAgICAgIFN0YXRlbWVudCBwcm9sb2d1ZSwgTWFwRW50cnkgYm9keSwgRXhwcmVzc2lvbiBwcm9ibGVtLCBUb2tlbiB0b2tlbiwKICAgICAge2Jvb2wgaXNBc3luYzogZmFsc2V9KTsKCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGFuIGFzc2VydCB0aGF0IGFwcGVhcnMgaW4gYSBjb25zdHJ1Y3RvcidzCiAgLy8vIGluaXRpYWxpemVyIGxpc3QuCiAgT2JqZWN0IGFzc2VydEluaXRpYWxpemVyKFRva2VuIGFzc2VydEtleXdvcmQsIFRva2VuIGxlZnRQYXJlbnRoZXNpcywKICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24sIFRva2VuIGNvbW1hLCBFeHByZXNzaW9uIG1lc3NhZ2UpOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYW4gYXNzZXJ0IHRoYXQgYXBwZWFycyBhcyBhIHN0YXRlbWVudC4KICBTdGF0ZW1lbnQgYXNzZXJ0U3RhdGVtZW50KFRva2VuIGFzc2VydEtleXdvcmQsIFRva2VuIGxlZnRQYXJlbnRoZXNpcywKICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24sIFRva2VuIGNvbW1hLCBFeHByZXNzaW9uIG1lc3NhZ2UsIFRva2VuIHNlbWljb2xvbik7CgogIEV4cHJlc3Npb24gYXdhaXRFeHByZXNzaW9uKEV4cHJlc3Npb24gb3BlcmFuZCwgVG9rZW4gbG9jYXRpb24pOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSBibG9jayBvZiBbc3RhdGVtZW50c10gZW5jbG9zZWQgYmV0d2VlbiB0aGUKICAvLy8gW29wZW5CcmFja2V0XSBhbmQgW2Nsb3NlQnJhY2tldF0uCiAgU3RhdGVtZW50IGJsb2NrKAogICAgICBUb2tlbiBvcGVuQnJhY2UsIExpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzLCBUb2tlbiBjbG9zZUJyYWNlKTsKCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGEgYnJlYWsgc3RhdGVtZW50LgogIFN0YXRlbWVudCBicmVha1N0YXRlbWVudCgKICAgICAgVG9rZW4gYnJlYWtLZXl3b3JkLCBJZGVudGlmaWVyIGxhYmVsLCBUb2tlbiBzZW1pY29sb24pOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSBjYXRjaCBjbGF1c2UuCiAgT2JqZWN0IGNhdGNoQ2xhdXNlKAogICAgICBUb2tlbiBvbktleXdvcmQsCiAgICAgIERhcnRUeXBlIGV4Y2VwdGlvblR5cGUsCiAgICAgIFRva2VuIGNhdGNoS2V5d29yZCwKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBleGNlcHRpb25QYXJhbWV0ZXIsCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gc3RhY2tUcmFjZVBhcmFtZXRlciwKICAgICAgRGFydFR5cGUgc3RhY2tUcmFjZVR5cGUsCiAgICAgIFN0YXRlbWVudCBib2R5KTsKCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbi4gVGhlIFtjb25kaXRpb25dIGlzCiAgLy8vIHRoZSBleHByZXNzaW9uIHByZWNlZGluZyB0aGUgcXVlc3Rpb24gbWFyay4gVGhlIFtxdWVzdGlvbl0gaXMgdGhlIGA/YC4gVGhlCiAgLy8vIFt0aGVuRXhwcmVzc2lvbl0gaXMgdGhlIGV4cHJlc3Npb24gZm9sbG93aW5nIHRoZSBxdWVzdGlvbiBtYXJrLiBUaGUKICAvLy8gW2NvbG9uXSBpcyB0aGUgYDpgLiBUaGUgW2Vsc2VFeHByZXNzaW9uXSBpcyB0aGUgZXhwcmVzc2lvbiBmb2xsb3dpbmcgdGhlCiAgLy8vIGNvbG9uLgogIEV4cHJlc3Npb24gY29uZGl0aW9uYWxFeHByZXNzaW9uKEV4cHJlc3Npb24gY29uZGl0aW9uLCBUb2tlbiBxdWVzdGlvbiwKICAgICAgRXhwcmVzc2lvbiB0aGVuRXhwcmVzc2lvbiwgVG9rZW4gY29sb24sIEV4cHJlc3Npb24gZWxzZUV4cHJlc3Npb24pOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSBjb250aW51ZSBzdGF0ZW1lbnQuCiAgU3RhdGVtZW50IGNvbnRpbnVlU3RhdGVtZW50KAogICAgICBUb2tlbiBjb250aW51ZUtleXdvcmQsIElkZW50aWZpZXIgbGFiZWwsIFRva2VuIHNlbWljb2xvbik7CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIGRvIHN0YXRlbWVudC4KICBTdGF0ZW1lbnQgZG9TdGF0ZW1lbnQoVG9rZW4gZG9LZXl3b3JkLCBTdGF0ZW1lbnQgYm9keSwgVG9rZW4gd2hpbGVLZXl3b3JkLAogICAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiwgVG9rZW4gc2VtaWNvbG9uKTsKCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGFuIGV4cHJlc3Npb24gc3RhdGVtZW50IGNvbXBvc2VkIGZyb20gdGhlCiAgLy8vIFtleHByZXNzaW9uXSBhbmQgW3NlbWljb2xvbl0uCiAgU3RhdGVtZW50IGV4cHJlc3Npb25TdGF0ZW1lbnQoRXhwcmVzc2lvbiBleHByZXNzaW9uLCBUb2tlbiBzZW1pY29sb24pOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYW4gZW1wdHkgc3RhdGVtZW50IGNvbnNpc3Rpbmcgb2YgdGhlIGdpdmVuCiAgLy8vIFtzZW1pY29sb25dLgogIFN0YXRlbWVudCBlbXB0eVN0YXRlbWVudChUb2tlbiBzZW1pY29sb24pOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSBmb3Igc3RhdGVtZW50LgogIFN0YXRlbWVudCBmb3JTdGF0ZW1lbnQoCiAgICAgIFRva2VuIGZvcktleXdvcmQsCiAgICAgIFRva2VuIGxlZnRQYXJlbnRoZXNpcywKICAgICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXMsCiAgICAgIFRva2VuIGxlZnRTZXBhcmF0b3IsCiAgICAgIEV4cHJlc3Npb24gY29uZGl0aW9uLAogICAgICBTdGF0ZW1lbnQgY29uZGl0aW9uU3RhdGVtZW50LAogICAgICBMaXN0PEV4cHJlc3Npb24+IHVwZGF0ZXJzLAogICAgICBUb2tlbiByaWdodFBhcmVudGhlc2lzLAogICAgICBTdGF0ZW1lbnQgYm9keSk7CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhbiBgaWZgIHN0YXRlbWVudC4KICBTdGF0ZW1lbnQgaWZTdGF0ZW1lbnQoVG9rZW4gaWZLZXl3b3JkLCBFeHByZXNzaW9uIGNvbmRpdGlvbiwKICAgICAgU3RhdGVtZW50IHRoZW5TdGF0ZW1lbnQsIFRva2VuIGVsc2VLZXl3b3JkLCBTdGF0ZW1lbnQgZWxzZVN0YXRlbWVudCk7CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhbiBgaXNgIGV4cHJlc3Npb24uIFRoZSBbb3BlcmFuZF0gaXMgdGhlCiAgLy8vIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsZWZ0IG9wZXJhbmQuIFRoZSBbaXNPcGVyYXRvcl0gaXMgdGhlIGBpc2Agb3BlcmF0b3IuCiAgLy8vIFRoZSBbbm90T3BlcmF0b3JdIGlzIGVpdGhlciB0aGUgYCFgIG9yIGBudWxsYCBpZiB0aGUgdGVzdCBpcyBub3QgbmVnYXRlZC4KICAvLy8gVGhlIFt0eXBlXSBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0eXBlIHRoYXQgaXMgdGhlIHJpZ2h0IG9wZXJhbmQuCiAgRXhwcmVzc2lvbiBpc0V4cHJlc3Npb24oCiAgICAgIEV4cHJlc3Npb24gb3BlcmFuZCwgVG9rZW4gaXNPcGVyYXRvciwgVG9rZW4gbm90T3BlcmF0b3IsIERhcnRUeXBlIHR5cGUpOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSBbc3RhdGVtZW50XSB0aGF0IGhhcyBvbmUgb3IgbW9yZSBsYWJlbHMgKGZyb20KICAvLy8gdGhlIFt0YXJnZXRdKSBhc3NvY2lhdGVkIHdpdGggaXQuCiAgU3RhdGVtZW50IGxhYmVsZWRTdGF0ZW1lbnQoTGFiZWxUYXJnZXQgdGFyZ2V0LCBTdGF0ZW1lbnQgc3RhdGVtZW50KTsKCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGEgbG9naWNhbCBleHByZXNzaW9uIGhhdmluZyB0aGUgW2xlZnRPcGVyYW5kXSwKICAvLy8gW3JpZ2h0T3BlcmFuZF0gYW5kIHRoZSBbb3BlcmF0b3JdIChlaXRoZXIgYCYmYCBvciBgfHxgKS4KICBFeHByZXNzaW9uIGxvZ2ljYWxFeHByZXNzaW9uKAogICAgICBFeHByZXNzaW9uIGxlZnRPcGVyYW5kLCBUb2tlbiBvcGVyYXRvciwgRXhwcmVzc2lvbiByaWdodE9wZXJhbmQpOwoKICBFeHByZXNzaW9uIG5vdEV4cHJlc3Npb24oCiAgICAgIEV4cHJlc3Npb24gb3BlcmFuZCwgVG9rZW4gbG9jYXRpb24sIGJvb2wgaXNTeW50aGV0aWMpOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSBwYXJlbnRoZXNpemVkIGNvbmRpdGlvbiBjb25zaXN0aW5nIG9mIHRoZQogIC8vLyBnaXZlbiBbZXhwcmVzc2lvbl0gYmV0d2VlbiB0aGUgW2xlZnRQYXJlbnRoZXNpc10gYW5kIFtyaWdodFBhcmVudGhlc2lzXS4KICBPYmplY3QgcGFyZW50aGVzaXplZENvbmRpdGlvbigKICAgICAgVG9rZW4gbGVmdFBhcmVudGhlc2lzLCBFeHByZXNzaW9uIGV4cHJlc3Npb24sIFRva2VuIHJpZ2h0UGFyZW50aGVzaXMpOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSByZXRocm93IHN0YXRlbWVudCBjb25zaXN0aW5nIG9mIHRoZQogIC8vLyBbcmV0aHJvd0tleXdvcmRdIGZvbGxvd2VkIGJ5IHRoZSBbc2VtaWNvbG9uXS4KICBTdGF0ZW1lbnQgcmV0aHJvd1N0YXRlbWVudChUb2tlbiByZXRocm93S2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uKTsKCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGEgcmV0dXJuIHN0YXRlbWVudC4KICBTdGF0ZW1lbnQgcmV0dXJuU3RhdGVtZW50KAogICAgICBUb2tlbiByZXR1cm5LZXl3b3JkLCBFeHByZXNzaW9uIGV4cHJlc3Npb24sIFRva2VuIHNlbWljb2xvbik7CgogIEV4cHJlc3Npb24gc3RyaW5nQ29uY2F0ZW5hdGlvbkV4cHJlc3Npb24oCiAgICAgIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMsIFRva2VuIGxvY2F0aW9uKTsKCiAgLy8vIFRoZSBnaXZlbiBbc3RhdGVtZW50XSBpcyBiZWluZyB1c2VkIGFzIHRoZSB0YXJnZXQgb2YgZWl0aGVyIGEgYnJlYWsgb3IKICAvLy8gY29udGludWUgc3RhdGVtZW50LiBSZXR1cm4gdGhlIHN0YXRlbWVudCB0aGF0IHNob3VsZCBiZSB1c2VkIGFzIHRoZSBhY3R1YWwKICAvLy8gdGFyZ2V0LgogIFN0YXRlbWVudCBzeW50aGV0aWNMYWJlbGVkU3RhdGVtZW50KFN0YXRlbWVudCBzdGF0ZW1lbnQpOwoKICBFeHByZXNzaW9uIHRoaXNFeHByZXNzaW9uKFRva2VuIGxvY2F0aW9uKTsKCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGEgdGhyb3cgZXhwcmVzc2lvbiBjb25zaXN0aW5nIG9mIHRoZQogIC8vLyBbdGhyb3dLZXl3b3JkXS4KICBFeHByZXNzaW9uIHRocm93RXhwcmVzc2lvbihUb2tlbiB0aHJvd0tleXdvcmQsIEV4cHJlc3Npb24gZXhwcmVzc2lvbik7CgogIGJvb2wgaXNUaHJvdyhPYmplY3Qgbyk7CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIHRyeSBzdGF0ZW1lbnQuIFRoZSBzdGF0ZW1lbnQgaXMgaW50cm9kdWNlZCBieQogIC8vLyB0aGUgW3RyeUtleXdvcmRdIGFuZCB0aGUgZ2l2ZW4gW2JvZHldLiBJZiBjYXRjaCBjbGF1c2VzIHdlcmUgaW5jbHVkZWQsCiAgLy8vIHRoZW4gdGhlIFtjYXRjaENsYXVzZXNdIHdpbGwgcmVwcmVzZW50IHRoZW0sIG90aGVyd2lzZSBpdCB3aWxsIGJlIGBudWxsYC4KICAvLy8gU2ltaWxhcmx5LCBpZiBhIGZpbmFsbHkgYmxvY2sgd2FzIGluY2x1ZGVkLCB0aGVuIHRoZSBbZmluYWxseUtleXdvcmRdIGFuZAogIC8vLyBbZmluYWxseUJsb2NrXSB3aWxsIGJlIG5vbi1gbnVsbGAsIG90aGVyd2lzZSBib3RoIHdpbGwgYmUgYG51bGxgLiBJZiB0aGVyZQogIC8vLyB3YXMgYW4gZXJyb3IgaW4gc29tZSBwYXJ0IG9mIHRoZSB0cnkgc3RhdGVtZW50LCB0aGVuIGFuIFtlcnJvclJlcGxhY2VtZW50XQogIC8vLyBtaWdodCBiZSBwcm92aWRlZCwgaW4gd2hpY2ggY2FzZSBpdCBjb3VsZCBiZSByZXR1cm5lZCBpbnN0ZWFkIG9mIHRoZQogIC8vLyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHJ5IHN0YXRlbWVudC4KICBTdGF0ZW1lbnQgdHJ5U3RhdGVtZW50KFRva2VuIHRyeUtleXdvcmQsIFN0YXRlbWVudCBib2R5LAogICAgICBMaXN0PENhdGNoPiBjYXRjaENsYXVzZXMsIFRva2VuIGZpbmFsbHlLZXl3b3JkLCBTdGF0ZW1lbnQgZmluYWxseUJsb2NrKTsKCiAgU3RhdGVtZW50IHZhcmlhYmxlc0RlY2xhcmF0aW9uKAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IGRlY2xhcmF0aW9ucywgVXJpIHVyaSk7CgogIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gdmFyaWFibGVzRGVjbGFyYXRpb25FeHRyYWN0RGVjbGFyYXRpb25zKAogICAgICBjb3ZhcmlhbnQgU3RhdGVtZW50IHZhcmlhYmxlc0RlY2xhcmF0aW9uKTsKCiAgU3RhdGVtZW50IHdyYXBWYXJpYWJsZXMoU3RhdGVtZW50IHN0YXRlbWVudCk7CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIHdoaWxlIHN0YXRlbWVudCBpbnRyb2R1Y2VkIGJ5IHRoZQogIC8vLyBbd2hpbGVLZXl3b3JkXSBhbmQgY29uc2lzdGluZyBvZiB0aGUgZ2l2ZW4gW2NvbmRpdGlvbl0gYW5kIFtib2R5XS4KICBTdGF0ZW1lbnQgd2hpbGVTdGF0ZW1lbnQoCiAgICAgIFRva2VuIHdoaWxlS2V5d29yZCwgRXhwcmVzc2lvbiBjb25kaXRpb24sIFN0YXRlbWVudCBib2R5KTsKCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGEgeWllbGQgc3RhdGVtZW50IGNvbnNpc3Rpbmcgb2YgdGhlCiAgLy8vIFt5aWVsZEtleXdvcmRdLCBbc3Rhcl0sIFtleHByZXNzaW9uXSwgYW5kIFtzZW1pY29sb25dLiBUaGUgW3N0YXJdIGlzIG51bGwKICAvLy8gd2hlbiBubyBzdGFyIHdhcyBpbmNsdWRlZCBpbiB0aGUgc291cmNlIGNvZGUuCiAgU3RhdGVtZW50IHlpZWxkU3RhdGVtZW50KAogICAgICBUb2tlbiB5aWVsZEtleXdvcmQsIFRva2VuIHN0YXIsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgVG9rZW4gc2VtaWNvbG9uKTsKCiAgLy8vIFJldHVybiB0aGUgZXhwcmVzc2lvbiBmcm9tIHRoZSBnaXZlbiBleHByZXNzaW9uIFtzdGF0ZW1lbnRdLgogIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbkZyb21FeHByZXNzaW9uU3RhdGVtZW50KFN0YXRlbWVudCBzdGF0ZW1lbnQpOwoKICBib29sIGlzQmxvY2soT2JqZWN0IG5vZGUpOwoKICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gW3N0YXRlbWVudF0gaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFuIGVtcHR5CiAgLy8vIHN0YXRlbWVudC4KICBib29sIGlzRW1wdHlTdGF0ZW1lbnQoU3RhdGVtZW50IHN0YXRlbWVudCk7CgogIGJvb2wgaXNFcnJvbmVvdXNOb2RlKE9iamVjdCBub2RlKTsKCiAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFtzdGF0ZW1lbnRdIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhbgogIC8vLyBleHByZXNzaW9uIHN0YXRlbWVudC4KICBib29sIGlzRXhwcmVzc2lvblN0YXRlbWVudChTdGF0ZW1lbnQgc3RhdGVtZW50KTsKCiAgYm9vbCBpc1RoaXNFeHByZXNzaW9uKE9iamVjdCBub2RlKTsKCiAgYm9vbCBpc1ZhcmlhYmxlc0RlY2xhcmF0aW9uKE9iamVjdCBub2RlKTsKCiAgR2VuZXJhdG9yIHZhcmlhYmxlVXNlR2VuZXJhdG9yKEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLAogICAgICBUb2tlbiBsb2NhdGlvbiwgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgRGFydFR5cGUgcHJvbW90ZWRUeXBlKTsKCiAgR2VuZXJhdG9yIHByb3BlcnR5QWNjZXNzR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgVG9rZW4gbG9jYXRpb24sCiAgICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIsCiAgICAgIE5hbWUgbmFtZSwKICAgICAgTWVtYmVyIGdldHRlciwKICAgICAgTWVtYmVyIHNldHRlcik7CgogIEdlbmVyYXRvciB0aGlzUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IoRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsCiAgICAgIFRva2VuIGxvY2F0aW9uLCBOYW1lIG5hbWUsIE1lbWJlciBnZXR0ZXIsIE1lbWJlciBzZXR0ZXIpOwoKICBHZW5lcmF0b3IgbnVsbEF3YXJlUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IoCiAgICAgIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLAogICAgICBUb2tlbiBsb2NhdGlvbiwKICAgICAgRXhwcmVzc2lvbiByZWNlaXZlckV4cHJlc3Npb24sCiAgICAgIE5hbWUgbmFtZSwKICAgICAgTWVtYmVyIGdldHRlciwKICAgICAgTWVtYmVyIHNldHRlciwKICAgICAgRGFydFR5cGUgdHlwZSk7CgogIEdlbmVyYXRvciBzdXBlclByb3BlcnR5QWNjZXNzR2VuZXJhdG9yKEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLAogICAgICBUb2tlbiBsb2NhdGlvbiwgTmFtZSBuYW1lLCBNZW1iZXIgZ2V0dGVyLCBNZW1iZXIgc2V0dGVyKTsKCiAgR2VuZXJhdG9yIGluZGV4ZWRBY2Nlc3NHZW5lcmF0b3IoCiAgICAgIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLAogICAgICBUb2tlbiBsb2NhdGlvbiwKICAgICAgRXhwcmVzc2lvbiByZWNlaXZlciwKICAgICAgRXhwcmVzc2lvbiBpbmRleCwKICAgICAgUHJvY2VkdXJlIGdldHRlciwKICAgICAgUHJvY2VkdXJlIHNldHRlcik7CgogIEdlbmVyYXRvciB0aGlzSW5kZXhlZEFjY2Vzc0dlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgVG9rZW4gbG9jYXRpb24sIEV4cHJlc3Npb24gaW5kZXgsIFByb2NlZHVyZSBnZXR0ZXIsIFByb2NlZHVyZSBzZXR0ZXIpOwoKICBHZW5lcmF0b3Igc3VwZXJJbmRleGVkQWNjZXNzR2VuZXJhdG9yKEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLAogICAgICBUb2tlbiBsb2NhdGlvbiwgRXhwcmVzc2lvbiBpbmRleCwgTWVtYmVyIGdldHRlciwgTWVtYmVyIHNldHRlcik7CgogIEdlbmVyYXRvciBzdGF0aWNBY2Nlc3NHZW5lcmF0b3IoRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsCiAgICAgIFRva2VuIGxvY2F0aW9uLCBNZW1iZXIgZ2V0dGVyLCBNZW1iZXIgc2V0dGVyKTsKCiAgR2VuZXJhdG9yIGxvYWRMaWJyYXJ5R2VuZXJhdG9yKEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLAogICAgICBUb2tlbiBsb2NhdGlvbiwgTG9hZExpYnJhcnlCdWlsZGVyIGJ1aWxkZXIpOwoKICBHZW5lcmF0b3IgZGVmZXJyZWRBY2Nlc3NHZW5lcmF0b3IoCiAgICAgIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLAogICAgICBUb2tlbiBsb2NhdGlvbiwKICAgICAgUHJlZml4VXNlR2VuZXJhdG9yIHByZWZpeEdlbmVyYXRvciwKICAgICAgR2VuZXJhdG9yIHN1ZmZpeEdlbmVyYXRvcik7CgogIEdlbmVyYXRvciB0eXBlVXNlR2VuZXJhdG9yKEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLCBUb2tlbiBsb2NhdGlvbiwKICAgICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciBkZWNsYXJhdGlvbiwgU3RyaW5nIHBsYWluTmFtZUZvclJlYWQpOwoKICBHZW5lcmF0b3IgcmVhZE9ubHlBY2Nlc3NHZW5lcmF0b3IoRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsCiAgICAgIFRva2VuIGxvY2F0aW9uLCBFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBwbGFpbk5hbWVGb3JSZWFkKTsKCiAgR2VuZXJhdG9yIHVucmVzb2x2ZWROYW1lR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gbG9jYXRpb24sIE5hbWUgbmFtZSk7CgogIEdlbmVyYXRvciB1bmxpbmtlZEdlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gbG9jYXRpb24sCiAgICAgIFVubGlua2VkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pOwoKICBHZW5lcmF0b3IgZGVsYXllZEFzc2lnbm1lbnQoRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIGxvY2F0aW9uLAogICAgICBHZW5lcmF0b3IgZ2VuZXJhdG9yLCBFeHByZXNzaW9uIHZhbHVlLCBTdHJpbmcgYXNzaWdubWVudE9wZXJhdG9yKTsKCiAgR2VuZXJhdG9yIGRlbGF5ZWRQb3N0Zml4SW5jcmVtZW50KAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgVG9rZW4gbG9jYXRpb24sCiAgICAgIEdlbmVyYXRvciBnZW5lcmF0b3IsCiAgICAgIE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIFByb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXQpOwoKICBHZW5lcmF0b3IgcHJlZml4VXNlR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gbG9jYXRpb24sIFByZWZpeEJ1aWxkZXIgcHJlZml4KTsKCiAgR2VuZXJhdG9yIHVuZXhwZWN0ZWRRdWFsaWZpZWRVc2VHZW5lcmF0b3IoRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsCiAgICAgIFRva2VuIHRva2VuLCBHZW5lcmF0b3IgcHJlZml4R2VuZXJhdG9yLCBib29sIGlzVW5yZXNvbHZlZCk7CgogIEdlbmVyYXRvciBwYXJzZXJFcnJvckdlbmVyYXRvcigKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLCBNZXNzYWdlIG1lc3NhZ2UpOwoKICAvLyBUT0RPKGFoZSk6IFJlbW92ZSB0aGlzIG1ldGhvZCB3aGVuIGFsbCB1c2VycyBhcmUgbW92ZWQgaGVyZS4KICBBcmd1bWVudHMgY2FzdEFyZ3VtZW50cyhBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gYXJndW1lbnRzOwogIH0KfQqB3QBOTjwBFgEiASEJEw8SFBsSEA4ZExMSHQEtAUcBSgEdCRQcFyAdASsBJQErASoBKAFHAUoBHQkUHBcgHQEUGBIBQzwBLAE0AT0BNAFNATABUCU2AU8lOgFRJTQBPgFLTU5NTk5OT1BPMRoaFBscGSQbAUpNTk1NTk5OTk4vGRoUGxwXJBkBSk1OT01GTlBRUE1QQBkaFBgaHBceGQFJKgFGSzc6AVBLJD4BUExBUAE5AVFQUUlCASEBTQFBAVEBQAEYUQEXTQEZKxwgFxQBGCscIBUUAU1MHgFMSh4BSxhHPgFISE8BQgFOKBNGATQcPgExFhceGi4vHxcBTlFKTw1JSgE3H0EBMU0uAUskSQFMEy0BMhoYHSsbHCQhHhcBND9MAUpRUEwbTwFRKEcBUD8gSAEcPQFNTyFNAUc0RQE1HUQBLDUBTVEOPAEtAUYWSQEaAVFNUFBRUUsrO08BIjgBRTEBMAFFSRxBAUVQNBxPAUNIAR0BTxEuASUBSRwzASYBLAFDTAElKBYbERUWAUpAAS4oFiURFRUWAUtAASQoFhsYGBkBSU0BSkcBRDUBQzMBJSgWKiIBT0QBRkcBJUQBUCgBUEkBJSgWGxsiASBPAU5CASJHAUIxFgQCAS5wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2ZvcmVzdC5kYXJ0OnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9jb25zdGFudF9jb250ZXh0LmRhcnSE4S8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmNvbnN0YW50X2NvbnRleHQ7CgplbnVtIENvbnN0YW50Q29udGV4dCB7CiAgLy8vIE5vdCBpbiBhIGNvbnN0YW50IGNvbnRleHQuCiAgLy8vCiAgLy8vIFRoaXMgbWVhbnMgdGhhdCBgT2JqZWN0KClgIGFuZCBgW11gIGFyZSBlcXVpdmFsZW50IHRvIGBuZXcgT2JqZWN0KClgIGFuZAogIC8vLyBgW11gIHJlc3BlY3RpdmVseS4gYG5ldyBPYmplY3QoKWAgaXMgKipub3QqKiBhIGNvbXBpbGUtdGltZSBlcnJvci4KICAvLy8KICAvLy8gVE9ETyhhaGUpOiBVcGRhdGUgdGhlIGFib3ZlIHNwZWNpZmljYXRpb24gYW5kIGNvcnJlc3BvbmRpbmcKICAvLy8gaW1wbGVtZW50YXRpb24gYmVjYXVzZSBgT2JqZWN0KClgIGlzIGEgY29tcGlsZS10aW1lIGNvbnN0YW50LiBTZWUgW21hZ2ljCiAgLy8vIGNvbnN0XSgKICAvLy8gLi4vLi4vLi4vLi4vLi4vLi4vZG9jcy9sYW5ndWFnZS9pbmZvcm1hbC9kb2NzL2xhbmd1YWdlL2luZm9ybWFsL2ltcGxpY2l0LWNyZWF0aW9uLm1kCiAgLy8vICkuCiAgbm9uZSwKCiAgLy8vIEluIGEgY29udGV4dCB3aGVyZSBjb25zdGFudCBleHByZXNzaW9ucyBhcmUgcmVxdWlyZWQsIGFuZCBgY29uc3RgIG1heSBiZQogIC8vLyBpbmZlcnJlZC4KICAvLy8KICAvLy8gVGhpcyBtZWFucyB0aGF0IGBPYmplY3QoKWAgYW5kIGBbXWAgYXJlIGVxdWl2YWxlbnQgdG8gYGNvbnN0IE9iamVjdCgpYCBhbmQKICAvLy8gYGNvbnN0IFtdYCByZXNwZWN0aXZlbHkuIGBuZXcgT2JqZWN0KClgIGlzIGEgY29tcGlsZS10aW1lIGVycm9yLgogIGluZmVycmVkLAoKICAvLy8gSW4gYSBjb250ZXh0IHdoZXJlIGNvbnN0YW50IGV4cHJlc3Npb25zIGFyZSByZXF1aXJlZCwgYnV0IGBjb25zdGAgaXMgbm90CiAgLy8vIGluZmVycmVkLiBUaGlzIGluY2x1ZGVzIGRlZmF1bHQgdmFsdWVzIG9mIG9wdGlvbmFsIHBhcmFtZXRlcnMgYW5kCiAgLy8vIGluaXRpYWxpemluZyBleHByZXNzaW9ucyBvbiBmaWVsZHMgaW4gY2xhc3NlcyB3aXRoIGEgYGNvbnN0YCBjb25zdHJ1Y3Rvci4KICByZXF1aXJlZCwKfQohAE5OPAEgARchBk9JBkJPDlsJCAFPEAZRRwwBT0hQDAIBMXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9jb25zdGFudF9jb250ZXh0LmRhcnQvc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3F1b3RlLmRhcnSlay8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnF1b3RlOwoKaW1wb3J0ICdwcm9ibGVtcy5kYXJ0JyBzaG93IHVuaGFuZGxlZDsKCmltcG9ydCAnZmFzdGFfY29kZXMuZGFydCcgYXMgZmFzdGE7CgppbXBvcnQgJ3NjYW5uZXIvY2hhcmFjdGVycy5kYXJ0JwogICAgc2hvdwogICAgICAgICRCQUNLU0xBU0gsCiAgICAgICAgJEJTLAogICAgICAgICRDTE9TRV9DVVJMWV9CUkFDS0VULAogICAgICAgICRDUiwKICAgICAgICAkRkYsCiAgICAgICAgJExGLAogICAgICAgICRPUEVOX0NVUkxZX0JSQUNLRVQsCiAgICAgICAgJFNQQUNFLAogICAgICAgICRUQUIsCiAgICAgICAgJFZUQUIsCiAgICAgICAgJGIsCiAgICAgICAgJGYsCiAgICAgICAgJG4sCiAgICAgICAgJHIsCiAgICAgICAgJHQsCiAgICAgICAgJHUsCiAgICAgICAgJHYsCiAgICAgICAgJHgsCiAgICAgICAgaGV4RGlnaXRWYWx1ZSwKICAgICAgICBpc0hleERpZ2l0OwoKZW51bSBRdW90ZSB7CiAgU2luZ2xlLAogIERvdWJsZSwKICBNdWx0aUxpbmVTaW5nbGUsCiAgTXVsdGlMaW5lRG91YmxlLAogIFJhd1NpbmdsZSwKICBSYXdEb3VibGUsCiAgUmF3TXVsdGlMaW5lU2luZ2xlLAogIFJhd011bHRpTGluZURvdWJsZSwKfQoKUXVvdGUgYW5hbHl6ZVF1b3RlKFN0cmluZyBmaXJzdCkgewogIGlmIChmaXJzdC5zdGFydHNXaXRoKCciIiInKSkgcmV0dXJuIFF1b3RlLk11bHRpTGluZURvdWJsZTsKICBpZiAoZmlyc3Quc3RhcnRzV2l0aCgnciIiIicpKSByZXR1cm4gUXVvdGUuUmF3TXVsdGlMaW5lRG91YmxlOwogIGlmIChmaXJzdC5zdGFydHNXaXRoKCInJyciKSkgcmV0dXJuIFF1b3RlLk11bHRpTGluZVNpbmdsZTsKICBpZiAoZmlyc3Quc3RhcnRzV2l0aCgicicnJyIpKSByZXR1cm4gUXVvdGUuUmF3TXVsdGlMaW5lU2luZ2xlOwogIGlmIChmaXJzdC5zdGFydHNXaXRoKCciJykpIHJldHVybiBRdW90ZS5Eb3VibGU7CiAgaWYgKGZpcnN0LnN0YXJ0c1dpdGgoJ3IiJykpIHJldHVybiBRdW90ZS5SYXdEb3VibGU7CiAgaWYgKGZpcnN0LnN0YXJ0c1dpdGgoIiciKSkgcmV0dXJuIFF1b3RlLlNpbmdsZTsKICBpZiAoZmlyc3Quc3RhcnRzV2l0aCgiciciKSkgcmV0dXJuIFF1b3RlLlJhd1NpbmdsZTsKICByZXR1cm4gdW5oYW5kbGVkKGZpcnN0LCAiYW5hbHl6ZVF1b3RlIiwgLTEsIG51bGwpOwp9CgovLyBOb3RlOiBiYXNlZCBvbiBbU3RyaW5nVmFsaWRhdG9yLnF1b3RpbmdGcm9tU3RyaW5nXQovLyAocGtnL2NvbXBpbGVyL2xpYi9zcmMvc3RyaW5nX3ZhbGlkYXRvci5kYXJ0KS4KaW50IGxlbmd0aE9mT3B0aW9uYWxXaGl0ZXNwYWNlUHJlZml4KFN0cmluZyBmaXJzdCwgaW50IHN0YXJ0KSB7CiAgTGlzdDxpbnQ+IGNvZGVVbml0cyA9IGZpcnN0LmNvZGVVbml0czsKICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBjb2RlVW5pdHMubGVuZ3RoOyBpKyspIHsKICAgIGludCBjb2RlID0gY29kZVVuaXRzW2ldOwogICAgaWYgKGNvZGUgPT0gJEJBQ0tTTEFTSCkgewogICAgICBpKys7CiAgICAgIGlmIChpIDwgY29kZVVuaXRzLmxlbmd0aCkgewogICAgICAgIGNvZGUgPSBjb2RlVW5pdHNbaV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmIChjb2RlID09ICRUQUIgfHwgY29kZSA9PSAkU1BBQ0UpIGNvbnRpbnVlOwogICAgaWYgKGNvZGUgPT0gJENSKSB7CiAgICAgIGlmIChpICsgMSA8IGNvZGVVbml0cy5sZW5ndGggJiYgY29kZVVuaXRzW2kgKyAxXSA9PSAkTEYpIHsKICAgICAgICBpKys7CiAgICAgIH0KICAgICAgcmV0dXJuIGkgKyAxOwogICAgfQogICAgaWYgKGNvZGUgPT0gJExGKSB7CiAgICAgIHJldHVybiBpICsgMTsKICAgIH0KICAgIGJyZWFrOyAvLyBOb3QgYSB3aGl0ZS1zcGFjZSBjaGFyYWN0ZXIuCiAgfQogIHJldHVybiBzdGFydDsKfQoKaW50IGZpcnN0UXVvdGVMZW5ndGgoU3RyaW5nIGZpcnN0LCBRdW90ZSBxdW90ZSkgewogIHN3aXRjaCAocXVvdGUpIHsKICAgIGNhc2UgUXVvdGUuU2luZ2xlOgogICAgY2FzZSBRdW90ZS5Eb3VibGU6CiAgICAgIHJldHVybiAxOwoKICAgIGNhc2UgUXVvdGUuTXVsdGlMaW5lU2luZ2xlOgogICAgY2FzZSBRdW90ZS5NdWx0aUxpbmVEb3VibGU6CiAgICAgIHJldHVybiBsZW5ndGhPZk9wdGlvbmFsV2hpdGVzcGFjZVByZWZpeChmaXJzdCwgMyk7CgogICAgY2FzZSBRdW90ZS5SYXdTaW5nbGU6CiAgICBjYXNlIFF1b3RlLlJhd0RvdWJsZToKICAgICAgcmV0dXJuIDI7CgogICAgY2FzZSBRdW90ZS5SYXdNdWx0aUxpbmVTaW5nbGU6CiAgICBjYXNlIFF1b3RlLlJhd011bHRpTGluZURvdWJsZToKICAgICAgcmV0dXJuIGxlbmd0aE9mT3B0aW9uYWxXaGl0ZXNwYWNlUHJlZml4KGZpcnN0LCA0KTsKICB9CiAgcmV0dXJuIHVuaGFuZGxlZCgiJHF1b3RlIiwgImZpcnN0UXVvdGVMZW5ndGgiLCAtMSwgbnVsbCk7Cn0KCmludCBsYXN0UXVvdGVMZW5ndGgoUXVvdGUgcXVvdGUpIHsKICBzd2l0Y2ggKHF1b3RlKSB7CiAgICBjYXNlIFF1b3RlLlNpbmdsZToKICAgIGNhc2UgUXVvdGUuRG91YmxlOgogICAgY2FzZSBRdW90ZS5SYXdTaW5nbGU6CiAgICBjYXNlIFF1b3RlLlJhd0RvdWJsZToKICAgICAgcmV0dXJuIDE7CgogICAgY2FzZSBRdW90ZS5NdWx0aUxpbmVTaW5nbGU6CiAgICBjYXNlIFF1b3RlLk11bHRpTGluZURvdWJsZToKICAgIGNhc2UgUXVvdGUuUmF3TXVsdGlMaW5lU2luZ2xlOgogICAgY2FzZSBRdW90ZS5SYXdNdWx0aUxpbmVEb3VibGU6CiAgICAgIHJldHVybiAzOwogIH0KICByZXR1cm4gdW5oYW5kbGVkKCIkcXVvdGUiLCAibGFzdFF1b3RlTGVuZ3RoIiwgLTEsIG51bGwpOwp9CgpTdHJpbmcgdW5lc2NhcGVGaXJzdFN0cmluZ1BhcnQoU3RyaW5nIGZpcnN0LCBRdW90ZSBxdW90ZSwgT2JqZWN0IGxvY2F0aW9uLAogICAgVW5lc2NhcGVFcnJvckxpc3RlbmVyIGxpc3RlbmVyKSB7CiAgcmV0dXJuIHVuZXNjYXBlKGZpcnN0LnN1YnN0cmluZyhmaXJzdFF1b3RlTGVuZ3RoKGZpcnN0LCBxdW90ZSkpLCBxdW90ZSwKICAgICAgbG9jYXRpb24sIGxpc3RlbmVyKTsKfQoKU3RyaW5nIHVuZXNjYXBlTGFzdFN0cmluZ1BhcnQoU3RyaW5nIGxhc3QsIFF1b3RlIHF1b3RlLCBPYmplY3QgbG9jYXRpb24sCiAgICBib29sIGlzTGFzdFF1b3RlU3ludGhldGljLCBVbmVzY2FwZUVycm9yTGlzdGVuZXIgbGlzdGVuZXIpIHsKICBpbnQgZW5kID0gbGFzdC5sZW5ndGggLSAoaXNMYXN0UXVvdGVTeW50aGV0aWMgPyAwIDogbGFzdFF1b3RlTGVuZ3RoKHF1b3RlKSk7CiAgcmV0dXJuIHVuZXNjYXBlKGxhc3Quc3Vic3RyaW5nKDAsIGVuZCksIHF1b3RlLCBsb2NhdGlvbiwgbGlzdGVuZXIpOwp9CgpTdHJpbmcgdW5lc2NhcGVTdHJpbmcoCiAgICBTdHJpbmcgc3RyaW5nLCBPYmplY3QgbG9jYXRpb24sIFVuZXNjYXBlRXJyb3JMaXN0ZW5lciBsaXN0ZW5lcikgewogIFF1b3RlIHF1b3RlID0gYW5hbHl6ZVF1b3RlKHN0cmluZyk7CiAgcmV0dXJuIHVuZXNjYXBlKAogICAgICBzdHJpbmcuc3Vic3RyaW5nKGZpcnN0UXVvdGVMZW5ndGgoc3RyaW5nLCBxdW90ZSksCiAgICAgICAgICBzdHJpbmcubGVuZ3RoIC0gbGFzdFF1b3RlTGVuZ3RoKHF1b3RlKSksCiAgICAgIHF1b3RlLAogICAgICBsb2NhdGlvbiwKICAgICAgbGlzdGVuZXIpOwp9CgpTdHJpbmcgdW5lc2NhcGUoU3RyaW5nIHN0cmluZywgUXVvdGUgcXVvdGUsIE9iamVjdCBsb2NhdGlvbiwKICAgIFVuZXNjYXBlRXJyb3JMaXN0ZW5lciBsaXN0ZW5lcikgewogIHN3aXRjaCAocXVvdGUpIHsKICAgIGNhc2UgUXVvdGUuU2luZ2xlOgogICAgY2FzZSBRdW90ZS5Eb3VibGU6CiAgICAgIHJldHVybiAhc3RyaW5nLmNvbnRhaW5zKCJcXCIpCiAgICAgICAgICA/IHN0cmluZwogICAgICAgICAgOiB1bmVzY2FwZUNvZGVVbml0cyhzdHJpbmcuY29kZVVuaXRzLCBmYWxzZSwgbG9jYXRpb24sIGxpc3RlbmVyKTsKCiAgICBjYXNlIFF1b3RlLk11bHRpTGluZVNpbmdsZToKICAgIGNhc2UgUXVvdGUuTXVsdGlMaW5lRG91YmxlOgogICAgICByZXR1cm4gIXN0cmluZy5jb250YWlucygiXFwiKSAmJiAhc3RyaW5nLmNvbnRhaW5zKCJcciIpCiAgICAgICAgICA/IHN0cmluZwogICAgICAgICAgOiB1bmVzY2FwZUNvZGVVbml0cyhzdHJpbmcuY29kZVVuaXRzLCBmYWxzZSwgbG9jYXRpb24sIGxpc3RlbmVyKTsKCiAgICBjYXNlIFF1b3RlLlJhd1NpbmdsZToKICAgIGNhc2UgUXVvdGUuUmF3RG91YmxlOgogICAgICByZXR1cm4gc3RyaW5nOwoKICAgIGNhc2UgUXVvdGUuUmF3TXVsdGlMaW5lU2luZ2xlOgogICAgY2FzZSBRdW90ZS5SYXdNdWx0aUxpbmVEb3VibGU6CiAgICAgIHJldHVybiAhc3RyaW5nLmNvbnRhaW5zKCJcciIpCiAgICAgICAgICA/IHN0cmluZwogICAgICAgICAgOiB1bmVzY2FwZUNvZGVVbml0cyhzdHJpbmcuY29kZVVuaXRzLCB0cnVlLCBsb2NhdGlvbiwgbGlzdGVuZXIpOwogIH0KICByZXR1cm4gdW5oYW5kbGVkKCIkcXVvdGUiLCAidW5lc2NhcGUiLCAtMSwgbnVsbCk7Cn0KCi8vIE5vdGU6IGJhc2VkIG9uCi8vIFtTdHJpbmdWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmddKHBrZy9jb21waWxlci9saWIvc3JjL3N0cmluZ192YWxpZGF0b3IuZGFydCkuClN0cmluZyB1bmVzY2FwZUNvZGVVbml0cyhMaXN0PGludD4gY29kZVVuaXRzLCBib29sIGlzUmF3LCBPYmplY3QgbG9jYXRpb24sCiAgICBVbmVzY2FwZUVycm9yTGlzdGVuZXIgbGlzdGVuZXIpIHsKICAvLyBDYW4ndCB1c2UgVWludDhMaXN0IG9yIFVpbnQxNkxpc3QgaGVyZSwgdGhlIGNvZGUgdW5pdHMgbWF5IGJlIGxhcmdlci4KICBMaXN0PGludD4gcmVzdWx0ID0gbmV3IExpc3Q8aW50Pihjb2RlVW5pdHMubGVuZ3RoKTsKICBpbnQgcmVzdWx0T2Zmc2V0ID0gMDsKCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2RlVW5pdHMubGVuZ3RoOyBpKyspIHsKICAgIGludCBjb2RlID0gY29kZVVuaXRzW2ldOwogICAgaWYgKGNvZGUgPT0gJENSKSB7CiAgICAgIGlmIChpICsgMSA8IGNvZGVVbml0cy5sZW5ndGggJiYgY29kZVVuaXRzW2kgKyAxXSA9PSAkTEYpIHsKICAgICAgICBpKys7CiAgICAgIH0KICAgICAgY29kZSA9ICRMRjsKICAgIH0gZWxzZSBpZiAoIWlzUmF3ICYmIGNvZGUgPT0gJEJBQ0tTTEFTSCkgewogICAgICBpZiAoY29kZVVuaXRzLmxlbmd0aCA9PSArK2kpIHsKICAgICAgICBsaXN0ZW5lci5oYW5kbGVVbmVzY2FwZUVycm9yKAogICAgICAgICAgICBmYXN0YS5tZXNzYWdlSW52YWxpZFVuaWNvZGVFc2NhcGUsIGxvY2F0aW9uLCBpLCAxKTsKICAgICAgICByZXR1cm4gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKGNvZGVVbml0cyk7CiAgICAgIH0KICAgICAgY29kZSA9IGNvZGVVbml0c1tpXTsKCiAgICAgIC8vLyBgXG5gIGZvciBuZXdsaW5lLCBlcXVpdmFsZW50IHRvIGBceDBBYC4KICAgICAgLy8vIGBccmAgZm9yIGNhcnJpYWdlIHJldHVybiwgZXF1aXZhbGVudCB0byBgXHgwRGAuCiAgICAgIC8vLyBgXGZgIGZvciBmb3JtIGZlZWQsIGVxdWl2YWxlbnQgdG8gYFx4MENgLgogICAgICAvLy8gYFxiYCBmb3IgYmFja3NwYWNlLCBlcXVpdmFsZW50IHRvIGBceDA4YC4KICAgICAgLy8vIGBcdGAgZm9yIHRhYiwgZXF1aXZhbGVudCB0byBgXHgwOWAuCiAgICAgIC8vLyBgXHZgIGZvciB2ZXJ0aWNhbCB0YWIsIGVxdWl2YWxlbnQgdG8gYFx4MEJgLgogICAgICAvLy8gYFx4WFhgIGZvciBoZXggZXNjYXBlLgogICAgICAvLy8gYFx1WFhYWGAgb3IgYFx1e1hYP1g/WD9YP1g/fWAgZm9yIFVuaWNvZGUgaGV4IGVzY2FwZS4KICAgICAgaWYgKGNvZGUgPT0gJG4pIHsKICAgICAgICBjb2RlID0gJExGOwogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gJHIpIHsKICAgICAgICBjb2RlID0gJENSOwogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gJGYpIHsKICAgICAgICBjb2RlID0gJEZGOwogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gJGIpIHsKICAgICAgICBjb2RlID0gJEJTOwogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gJHQpIHsKICAgICAgICBjb2RlID0gJFRBQjsKICAgICAgfSBlbHNlIGlmIChjb2RlID09ICR2KSB7CiAgICAgICAgY29kZSA9ICRWVEFCOwogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gJHgpIHsKICAgICAgICAvLyBFeHBlY3QgZXhhY3RseSAyIGhleCBkaWdpdHMuCiAgICAgICAgaW50IGJlZ2luID0gaTsKICAgICAgICBpZiAoY29kZVVuaXRzLmxlbmd0aCA8PSBpICsgMikgewogICAgICAgICAgbGlzdGVuZXIuaGFuZGxlVW5lc2NhcGVFcnJvcihmYXN0YS5tZXNzYWdlSW52YWxpZEhleEVzY2FwZSwgbG9jYXRpb24sCiAgICAgICAgICAgICAgYmVnaW4sIGNvZGVVbml0cy5sZW5ndGggKyAxIC0gYmVnaW4pOwogICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RlVW5pdHMpOwogICAgICAgIH0KICAgICAgICBjb2RlID0gMDsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDI7IGorKykgewogICAgICAgICAgaW50IGRpZ2l0ID0gY29kZVVuaXRzWysraV07CiAgICAgICAgICBpZiAoIWlzSGV4RGlnaXQoZGlnaXQpKSB7CiAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZVVuZXNjYXBlRXJyb3IoCiAgICAgICAgICAgICAgICBmYXN0YS5tZXNzYWdlSW52YWxpZEhleEVzY2FwZSwgbG9jYXRpb24sIGJlZ2luLCBpICsgMSAtIGJlZ2luKTsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RlVW5pdHMpOwogICAgICAgICAgfQogICAgICAgICAgY29kZSA9IChjb2RlIDw8IDQpICsgaGV4RGlnaXRWYWx1ZShkaWdpdCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gJHUpIHsKICAgICAgICBpbnQgYmVnaW4gPSBpOwogICAgICAgIGlmIChjb2RlVW5pdHMubGVuZ3RoID09IGkgKyAxKSB7CiAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVVbmVzY2FwZUVycm9yKGZhc3RhLm1lc3NhZ2VJbnZhbGlkVW5pY29kZUVzY2FwZSwKICAgICAgICAgICAgICBsb2NhdGlvbiwgYmVnaW4sIGNvZGVVbml0cy5sZW5ndGggKyAxIC0gYmVnaW4pOwogICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RlVW5pdHMpOwogICAgICAgIH0KICAgICAgICBjb2RlID0gY29kZVVuaXRzW2kgKyAxXTsKICAgICAgICBpZiAoY29kZSA9PSAkT1BFTl9DVVJMWV9CUkFDS0VUKSB7CiAgICAgICAgICAvLyBFeHBlY3QgMS02IGhleCBkaWdpdHMgZm9sbG93ZWQgYnkgJ30nLgogICAgICAgICAgaWYgKGNvZGVVbml0cy5sZW5ndGggPT0gKytpKSB7CiAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZVVuZXNjYXBlRXJyb3IoZmFzdGEubWVzc2FnZUludmFsaWRVbmljb2RlRXNjYXBlLAogICAgICAgICAgICAgICAgbG9jYXRpb24sIGJlZ2luLCBpICsgMSAtIGJlZ2luKTsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RlVW5pdHMpOwogICAgICAgICAgfQogICAgICAgICAgY29kZSA9IDA7CiAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDc7IGorKykgewogICAgICAgICAgICBpZiAoY29kZVVuaXRzLmxlbmd0aCA9PSArK2kpIHsKICAgICAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVVbmVzY2FwZUVycm9yKGZhc3RhLm1lc3NhZ2VJbnZhbGlkVW5pY29kZUVzY2FwZSwKICAgICAgICAgICAgICAgICAgbG9jYXRpb24sIGJlZ2luLCBpICsgMSAtIGJlZ2luKTsKICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKGNvZGVVbml0cyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW50IGRpZ2l0ID0gY29kZVVuaXRzW2ldOwogICAgICAgICAgICBpZiAoaiAhPSAwICYmIGRpZ2l0ID09ICRDTE9TRV9DVVJMWV9CUkFDS0VUKSBicmVhazsKICAgICAgICAgICAgaWYgKCFpc0hleERpZ2l0KGRpZ2l0KSkgewogICAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZVVuZXNjYXBlRXJyb3IoZmFzdGEubWVzc2FnZUludmFsaWRVbmljb2RlRXNjYXBlLAogICAgICAgICAgICAgICAgICBsb2NhdGlvbiwgYmVnaW4sIGkgKyAyIC0gYmVnaW4pOwogICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoY29kZVVuaXRzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb2RlID0gKGNvZGUgPDwgNCkgKyBoZXhEaWdpdFZhbHVlKGRpZ2l0KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gRXhwZWN0IGV4YWN0bHkgNCBoZXggZGlnaXRzLgogICAgICAgICAgaWYgKGNvZGVVbml0cy5sZW5ndGggPD0gaSArIDQpIHsKICAgICAgICAgICAgbGlzdGVuZXIuaGFuZGxlVW5lc2NhcGVFcnJvcihmYXN0YS5tZXNzYWdlSW52YWxpZFVuaWNvZGVFc2NhcGUsCiAgICAgICAgICAgICAgICBsb2NhdGlvbiwgYmVnaW4sIGNvZGVVbml0cy5sZW5ndGggKyAxIC0gYmVnaW4pOwogICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKGNvZGVVbml0cyk7CiAgICAgICAgICB9CiAgICAgICAgICBjb2RlID0gMDsKICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKSB7CiAgICAgICAgICAgIGludCBkaWdpdCA9IGNvZGVVbml0c1srK2ldOwogICAgICAgICAgICBpZiAoIWlzSGV4RGlnaXQoZGlnaXQpKSB7CiAgICAgICAgICAgICAgbGlzdGVuZXIuaGFuZGxlVW5lc2NhcGVFcnJvcihmYXN0YS5tZXNzYWdlSW52YWxpZFVuaWNvZGVFc2NhcGUsCiAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLCBiZWdpbiwgaSArIDEgLSBiZWdpbik7CiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RlVW5pdHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvZGUgPSAoY29kZSA8PCA0KSArIGhleERpZ2l0VmFsdWUoZGlnaXQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoY29kZSA+IDB4MTBGRkZGKSB7CiAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVVbmVzY2FwZUVycm9yKAogICAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VJbnZhbGlkQ29kZVBvaW50LCBsb2NhdGlvbiwgYmVnaW4sIGkgKyAxIC0gYmVnaW4pOwogICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RlVW5pdHMpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBOb3RoaW5nLCBlc2NhcGVkIGNoYXJhY3RlciBpcyBwYXNzZWQgdGhyb3VnaDsKICAgICAgfQogICAgfQogICAgcmVzdWx0W3Jlc3VsdE9mZnNldCsrXSA9IGNvZGU7CiAgfQogIHJldHVybiBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMocmVzdWx0LCAwLCByZXN1bHRPZmZzZXQpOwp9CgphYnN0cmFjdCBjbGFzcyBVbmVzY2FwZUVycm9yTGlzdGVuZXIgewogIHZvaWQgaGFuZGxlVW5lc2NhcGVFcnJvcigKICAgICAgZmFzdGEuTWVzc2FnZSBtZXNzYWdlLCBjb3ZhcmlhbnQgbG9jYXRpb24sIGludCBvZmZzZXQsIGludCBsZW5ndGgpOwp9CoEwAE5OPAEVAScBJAEhCRQNHg0NDR0QDg8MDAwMDAwMDBcUAQ0KChMTDQ0WFgIBIz1BPUEyNjI2NQIBNjFAKTMdHgsiHQ8PCAYyF0ENCBQGFxQGKwQQAgEyExcXEAEgIDkBGhoQASMjOQQ8AgEjExcXGhoQASAgIyMQBDsCAUsmShsCAUlBT0YCARdGJhM4Mw0QEQIBPSYTFxckE0wBICA+E0wBGhoVASMjJBNLBDQCARJRSyZLNhgBLx0XQQ0IEi8lJkA0CBsBMjo0NC43IUAYFB8UHxQfFB8VHxYfKBcpUDQ2ChImJiQqUDgMNQofFylKPjYKISs0KUwxOAwUKCtOMzoOJkAmTjM6DjcMESorTEA4DBQoKCZOMzoONwwKHyhONgoPOQgGIwQ8AgEnHEoCASZwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcXVvdGUuZGFydD9zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvc291cmNlL3Njb3BlX2xpc3RlbmVyLmRhcnSS4S8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnNjb3BlX2xpc3RlbmVyOwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJy4uL3Njb3BlLmRhcnQnIHNob3cgU2NvcGU7CgppbXBvcnQgJ3N0YWNrX2xpc3RlbmVyLmRhcnQnIHNob3cgTnVsbFZhbHVlLCBTdGFja0xpc3RlbmVyOwoKZXhwb3J0ICdzdGFja19saXN0ZW5lci5kYXJ0JwogICAgc2hvdyBGaXhlZE51bGxhYmxlTGlzdCwgR3Jvd2FibGVMaXN0LCBOdWxsVmFsdWUsIFBhcnNlclJlY292ZXJ5OwoKZW51bSBKdW1wVGFyZ2V0S2luZCB7CiAgQnJlYWssCiAgQ29udGludWUsCiAgR290bywgLy8gQ29udGludWUgbGFiZWwgaW4gc3dpdGNoLgp9CgphYnN0cmFjdCBjbGFzcyBTY29wZUxpc3RlbmVyPEo+IGV4dGVuZHMgU3RhY2tMaXN0ZW5lciB7CiAgU2NvcGUgc2NvcGU7CgogIEogYnJlYWtUYXJnZXQ7CgogIEogY29udGludWVUYXJnZXQ7CgogIFNjb3BlTGlzdGVuZXIoU2NvcGUgc2NvcGUpIDogc2NvcGUgPSBzY29wZSA/PyBuZXcgU2NvcGUuaW1tdXRhYmxlKCk7CgogIEogY3JlYXRlSnVtcFRhcmdldChKdW1wVGFyZ2V0S2luZCBraW5kLCBpbnQgY2hhck9mZnNldCk7CgogIEogY3JlYXRlQnJlYWtUYXJnZXQoaW50IGNoYXJPZmZzZXQpIHsKICAgIHJldHVybiBjcmVhdGVKdW1wVGFyZ2V0KEp1bXBUYXJnZXRLaW5kLkJyZWFrLCBjaGFyT2Zmc2V0KTsKICB9CgogIEogY3JlYXRlQ29udGludWVUYXJnZXQoaW50IGNoYXJPZmZzZXQpIHsKICAgIHJldHVybiBjcmVhdGVKdW1wVGFyZ2V0KEp1bXBUYXJnZXRLaW5kLkNvbnRpbnVlLCBjaGFyT2Zmc2V0KTsKICB9CgogIEogY3JlYXRlR290b1RhcmdldChpbnQgY2hhck9mZnNldCkgewogICAgcmV0dXJuIGNyZWF0ZUp1bXBUYXJnZXQoSnVtcFRhcmdldEtpbmQuR290bywgY2hhck9mZnNldCk7CiAgfQoKICB2b2lkIGVudGVyTG9jYWxTY29wZShTdHJpbmcgZGVidWdOYW1lLCBbU2NvcGUgbmV3U2NvcGVdKSB7CiAgICBwdXNoKHNjb3BlKTsKICAgIHNjb3BlID0gbmV3U2NvcGUgPz8gc2NvcGUuY3JlYXRlTmVzdGVkU2NvcGUoZGVidWdOYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZXhpdExvY2FsU2NvcGUoKSB7CiAgICBzY29wZSA9IHBvcCgpOwogICAgYXNzZXJ0KHNjb3BlICE9IG51bGwpOwogIH0KCiAgdm9pZCBlbnRlckJyZWFrVGFyZ2V0KGludCBjaGFyT2Zmc2V0LCBbSiB0YXJnZXRdKSB7CiAgICBwdXNoKGJyZWFrVGFyZ2V0ID8/IE51bGxWYWx1ZS5CcmVha1RhcmdldCk7CiAgICBicmVha1RhcmdldCA9IHRhcmdldCA/PyBjcmVhdGVCcmVha1RhcmdldChjaGFyT2Zmc2V0KTsKICB9CgogIHZvaWQgZW50ZXJDb250aW51ZVRhcmdldChpbnQgY2hhck9mZnNldCwgW0ogdGFyZ2V0XSkgewogICAgcHVzaChjb250aW51ZVRhcmdldCA/PyBOdWxsVmFsdWUuQ29udGludWVUYXJnZXQpOwogICAgY29udGludWVUYXJnZXQgPSB0YXJnZXQgPz8gY3JlYXRlQ29udGludWVUYXJnZXQoY2hhck9mZnNldCk7CiAgfQoKICBKIGV4aXRCcmVha1RhcmdldCgpIHsKICAgIEogY3VycmVudCA9IGJyZWFrVGFyZ2V0OwogICAgYnJlYWtUYXJnZXQgPSBwb3AoKTsKICAgIHJldHVybiBjdXJyZW50OwogIH0KCiAgSiBleGl0Q29udGludWVUYXJnZXQoKSB7CiAgICBKIGN1cnJlbnQgPSBjb250aW51ZVRhcmdldDsKICAgIGNvbnRpbnVlVGFyZ2V0ID0gcG9wKCk7CiAgICByZXR1cm4gY3VycmVudDsKICB9CgogIHZvaWQgZW50ZXJMb29wKGludCBjaGFyT2Zmc2V0KSB7CiAgICBlbnRlckJyZWFrVGFyZ2V0KGNoYXJPZmZzZXQpOwogICAgZW50ZXJDb250aW51ZVRhcmdldChjaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5CbG9ja0Z1bmN0aW9uQm9keShUb2tlbiBiZWdpbikgewogICAgZGVidWdFdmVudCgiYmVnaW5CbG9ja0Z1bmN0aW9uQm9keSIpOwogICAgZW50ZXJMb2NhbFNjb3BlKCJibG9jayBmdW5jdGlvbiBib2R5Iik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRm9yU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkZvclN0YXRlbWVudCIpOwogICAgZW50ZXJMb29wKHRva2VuLmNoYXJPZmZzZXQpOwogICAgZW50ZXJMb2NhbFNjb3BlKCJmb3Igc3RhdG1lbnQiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Gb3JDb250cm9sRmxvdyhUb2tlbiBhd2FpdFRva2VuLCBUb2tlbiBmb3JUb2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5Gb3JDb250cm9sRmxvdyIpOwogICAgZW50ZXJMb2NhbFNjb3BlKCJmb3IgaW4gYSBjb2xsZWN0aW9uIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQmxvY2soVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luQmxvY2siKTsKICAgIGVudGVyTG9jYWxTY29wZSgiYmxvY2siKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Td2l0Y2hCbG9jayhUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5Td2l0Y2hCbG9jayIpOwogICAgZW50ZXJMb2NhbFNjb3BlKCJzd2l0Y2ggYmxvY2siKTsKICAgIGVudGVyQnJlYWtUYXJnZXQodG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRG9XaGlsZVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5Eb1doaWxlU3RhdGVtZW50Iik7CiAgICBlbnRlckxvb3AodG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luV2hpbGVTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luV2hpbGVTdGF0ZW1lbnQiKTsKICAgIGVudGVyTG9vcCh0b2tlbi5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Eb1doaWxlU3RhdGVtZW50Qm9keShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5Eb1doaWxlU3RhdGVtZW50Qm9keSIpOwogICAgZW50ZXJMb2NhbFNjb3BlKCJkby13aGlsZSBzdGF0ZW1lbnQgYm9keSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmREb1doaWxlU3RhdGVtZW50Qm9keShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiZW5kRG9XaGlsZVN0YXRlbWVudEJvZHkiKTsKICAgIHZhciBib2R5ID0gcG9wKCk7CiAgICBleGl0TG9jYWxTY29wZSgpOwogICAgcHVzaChib2R5KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5XaGlsZVN0YXRlbWVudEJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luV2hpbGVTdGF0ZW1lbnRCb2R5Iik7CiAgICBlbnRlckxvY2FsU2NvcGUoIndoaWxlIHN0YXRlbWVudCBib2R5Iik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFdoaWxlU3RhdGVtZW50Qm9keShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiZW5kV2hpbGVTdGF0ZW1lbnRCb2R5Iik7CiAgICB2YXIgYm9keSA9IHBvcCgpOwogICAgZXhpdExvY2FsU2NvcGUoKTsKICAgIHB1c2goYm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRm9yU3RhdGVtZW50Qm9keShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5Gb3JTdGF0ZW1lbnRCb2R5Iik7CiAgICBlbnRlckxvY2FsU2NvcGUoImZvciBzdGF0ZW1lbnQgYm9keSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JTdGF0ZW1lbnRCb2R5KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRGb3JTdGF0ZW1lbnRCb2R5Iik7CiAgICB2YXIgYm9keSA9IHBvcCgpOwogICAgZXhpdExvY2FsU2NvcGUoKTsKICAgIHB1c2goYm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRm9ySW5Cb2R5KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkZvckluQm9keSIpOwogICAgZW50ZXJMb2NhbFNjb3BlKCJmb3ItaW4gYm9keSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JJbkJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZEZvckluQm9keSIpOwogICAgdmFyIGJvZHkgPSBwb3AoKTsKICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICBwdXNoKGJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblRoZW5TdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luVGhlblN0YXRlbWVudCIpOwogICAgZW50ZXJMb2NhbFNjb3BlKCJ0aGVuIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFRoZW5TdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZFRoZW5TdGF0ZW1lbnQiKTsKICAgIHZhciBib2R5ID0gcG9wKCk7CiAgICBleGl0TG9jYWxTY29wZSgpOwogICAgcHVzaChib2R5KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5FbHNlU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkVsc2VTdGF0ZW1lbnQiKTsKICAgIGVudGVyTG9jYWxTY29wZSgiZWxzZSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRFbHNlU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRFbHNlU3RhdGVtZW50Iik7CiAgICB2YXIgYm9keSA9IHBvcCgpOwogICAgZXhpdExvY2FsU2NvcGUoKTsKICAgIHB1c2goYm9keSk7CiAgfQp9CoDUAE5OPAEeAS4BIwE8AR1FARYJDCUCATgPAREBFAFHATsBKD8EAStCBAEnPgQBPRE8BAEMGhMbBAE2MDsEATk2QQQBGB0ZFAQBGyAcFAQBIyIlBAEMLSosBAEMKCUhJQQBDD8nLAQBDCEeHgQBDCckJSgEAQwsKSEEAQwqJyEEAQwwLTAEAQwuKxYWEAQBDC4rLQQBDCwpFhYQBAEMLCkrBAEMKicWFhAEAQwlIiQEAQwjIBYWEAQBDCkmHQQBDCckFhYQBAEMKSYdBAEMJyQWFhAEAgE2cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NvdXJjZS9zY29wZV9saXN0ZW5lci5kYXJ0OnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvY29uc3RuZXNzLmRhcnSBMi8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmNvbnN0bmVzczsKCmVudW0gQ29uc3RuZXNzIHsKICBleHBsaWNpdENvbnN0LAogIGV4cGxpY2l0TmV3LAogIGltcGxpY2l0LAp9Cg0ATk48ARkBEREPDAIBMXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvY29uc3RuZXNzLmRhcnQ7c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfYXBpLmRhcnSGzC8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gVGhpcyBsaWJyYXJ5IGV4cG9ydHMgYWxsIEFQSSBmcm9tIEtlcm5lbCB0aGF0IGNhbiBiZSB1c2VkIHRocm91Z2hvdXQgZmFzdGEuCmxpYnJhcnkgZmFzdGEua2VybmVsX2FwaTsKCmV4cG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQnIHNob3cgU3Vic3RpdHV0aW9uLCBzdWJzdGl0dXRlOwoKZXhwb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCcgc2hvdyBDbGFzc0hpZXJhcmNoeTsKCmV4cG9ydCAncGFja2FnZTprZXJuZWwvY2xvbmUuZGFydCcgc2hvdyBDbG9uZVZpc2l0b3I7CgpleHBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgc2hvdyBDb3JlVHlwZXM7CgpleHBvcnQgJ3BhY2thZ2U6a2VybmVsL3RyYW5zZm9ybWF0aW9ucy9mbGFncy5kYXJ0JyBzaG93IFRyYW5zZm9ybWVyRmxhZzsKCmV4cG9ydCAncGFja2FnZTprZXJuZWwvdGV4dC9hc3RfdG9fdGV4dC5kYXJ0JyBzaG93IE5hbWVTeXN0ZW07CgpleHBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydCcgc2hvdyBUeXBlRW52aXJvbm1lbnQ7CgpleHBvcnQgJ3BhY2thZ2U6a2VybmVsL3NyYy9ib3VuZHNfY2hlY2tzLmRhcnQnIHNob3cgaW5zdGFudGlhdGVUb0JvdW5kczsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdGV4dC9hc3RfdG9fdGV4dC5kYXJ0JyBzaG93IE5hbWVTeXN0ZW0sIFByaW50ZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IENsYXNzLCBNZW1iZXIsIE5vZGU7Cgp2b2lkIHByaW50Tm9kZU9uKE5vZGUgbm9kZSwgU3RyaW5nU2luayBzaW5rLCB7TmFtZVN5c3RlbSBzeW50aGV0aWNOYW1lc30pIHsKICBpZiAobm9kZSA9PSBudWxsKSB7CiAgICBzaW5rLndyaXRlKCJudWxsIik7CiAgfSBlbHNlIHsKICAgIHN5bnRoZXRpY05hbWVzID8/PSBuZXcgTmFtZVN5c3RlbSgpOwogICAgbmV3IFByaW50ZXIoc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKS53cml0ZU5vZGUobm9kZSk7CiAgfQp9Cgp2b2lkIHByaW50UXVhbGlmaWVkTmFtZU9uKE1lbWJlciBtZW1iZXIsIFN0cmluZ1Npbmsgc2luaywKICAgIHtOYW1lU3lzdGVtIHN5bnRoZXRpY05hbWVzfSkgewogIGlmIChtZW1iZXIgPT0gbnVsbCkgewogICAgc2luay53cml0ZSgibnVsbCIpOwogIH0gZWxzZSB7CiAgICBzeW50aGV0aWNOYW1lcyA/Pz0gbmV3IE5hbWVTeXN0ZW0oKTsKICAgIHNpbmsud3JpdGUobWVtYmVyLmVuY2xvc2luZ0xpYnJhcnkuaW1wb3J0VXJpKTsKICAgIHNpbmsud3JpdGUoIjo6Iik7CiAgICBDbGFzcyBjbHMgPSBtZW1iZXIuZW5jbG9zaW5nQ2xhc3M7CiAgICBpZiAoY2xzICE9IG51bGwpIHsKICAgICAgc2luay53cml0ZShjbHMubmFtZSA/PyBzeW50aGV0aWNOYW1lcy5uYW1lQ2xhc3MoY2xzKSk7CiAgICAgIHNpbmsud3JpdGUoIjo6Iik7CiAgICB9CiAgICBzaW5rLndyaXRlKG1lbWJlci5uYW1lPy5uYW1lID8/IHN5bnRoZXRpY05hbWVzLm5hbWVNZW1iZXIobWVtYmVyKSk7CiAgfQp9CjYATk48AVAaAUkBQgE2ATgBSQE/AUQBSQFIATsBTBYYCylHBAIBOiMYGAspMxYnFz0YBkgEAgEycGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfYXBpLmRhcnQ/c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfYXN0X2FwaS5kYXJ0jE4vLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIFRoaXMgbGlicmFyeSBleHBvcnRzIGFsbCBBUEkgZnJvbSBLZXJuZWwncyBhc3QuZGFydCB0aGF0IGNhbiBiZSB1c2VkCi8vLyB0aHJvdWdob3V0IGZhc3RhLgpsaWJyYXJ5IGZhc3RhLmtlcm5lbF9hc3RfYXBpOwoKZXhwb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBBcmd1bWVudHMsCiAgICAgICAgQXNFeHByZXNzaW9uLAogICAgICAgIEFzc2VydFN0YXRlbWVudCwKICAgICAgICBBc3luY01hcmtlciwKICAgICAgICBCbG9jaywKICAgICAgICBCb3R0b21UeXBlLAogICAgICAgIEJyZWFrU3RhdGVtZW50LAogICAgICAgIENhdGNoLAogICAgICAgIENoZWNrTGlicmFyeUlzTG9hZGVkLAogICAgICAgIENsYXNzLAogICAgICAgIENvbXBvbmVudCwKICAgICAgICBDb25zdHJ1Y3RvciwKICAgICAgICBDb25zdHJ1Y3Rvckludm9jYXRpb24sCiAgICAgICAgQ29udGludWVTd2l0Y2hTdGF0ZW1lbnQsCiAgICAgICAgRGFydFR5cGUsCiAgICAgICAgRHluYW1pY1R5cGUsCiAgICAgICAgRW1wdHlTdGF0ZW1lbnQsCiAgICAgICAgRXhwcmVzc2lvbiwKICAgICAgICBFeHByZXNzaW9uU3RhdGVtZW50LAogICAgICAgIEZpZWxkLAogICAgICAgIEZvckluU3RhdGVtZW50LAogICAgICAgIEZ1bmN0aW9uRGVjbGFyYXRpb24sCiAgICAgICAgRnVuY3Rpb25FeHByZXNzaW9uLAogICAgICAgIEZ1bmN0aW9uTm9kZSwKICAgICAgICBGdW5jdGlvblR5cGUsCiAgICAgICAgSW5pdGlhbGl6ZXIsCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBJbnZhbGlkRXhwcmVzc2lvbiwKICAgICAgICBJbnZhbGlkVHlwZSwKICAgICAgICBJc0V4cHJlc3Npb24sCiAgICAgICAgTGFiZWxlZFN0YXRlbWVudCwKICAgICAgICBMZXQsCiAgICAgICAgTGlicmFyeSwKICAgICAgICBMaWJyYXJ5RGVwZW5kZW5jeSwKICAgICAgICBMaWJyYXJ5UGFydCwKICAgICAgICBMaXN0TGl0ZXJhbCwKICAgICAgICBMb2NhbEluaXRpYWxpemVyLAogICAgICAgIExvY2F0aW9uLAogICAgICAgIE1hcEVudHJ5LAogICAgICAgIE1hcExpdGVyYWwsCiAgICAgICAgTWVtYmVyLAogICAgICAgIE1ldGhvZEludm9jYXRpb24sCiAgICAgICAgTmFtZSwKICAgICAgICBOYW1lZEV4cHJlc3Npb24sCiAgICAgICAgTmFtZWRUeXBlLAogICAgICAgIE5vZGUsCiAgICAgICAgTnVsbExpdGVyYWwsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFByb2NlZHVyZUtpbmQsCiAgICAgICAgUHJvcGVydHlHZXQsCiAgICAgICAgUHJvcGVydHlTZXQsCiAgICAgICAgUmV0aHJvdywKICAgICAgICBSZXR1cm5TdGF0ZW1lbnQsCiAgICAgICAgU3RhdGVtZW50LAogICAgICAgIFN0YXRpY0dldCwKICAgICAgICBTdGF0aWNJbnZvY2F0aW9uLAogICAgICAgIFN0YXRpY1NldCwKICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uLAogICAgICAgIFN1cGVySW5pdGlhbGl6ZXIsCiAgICAgICAgU3VwZXJNZXRob2RJbnZvY2F0aW9uLAogICAgICAgIFN1cGVyUHJvcGVydHlTZXQsCiAgICAgICAgU3dpdGNoQ2FzZSwKICAgICAgICBUaGlzRXhwcmVzc2lvbiwKICAgICAgICBUcmVlTm9kZSwKICAgICAgICBUeXBlUGFyYW1ldGVyLAogICAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlLAogICAgICAgIFR5cGVkZWYsCiAgICAgICAgVHlwZWRlZlR5cGUsCiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiwKICAgICAgICBWYXJpYWJsZUdldCwKICAgICAgICBWYXJpYWJsZVNldCwKICAgICAgICBWb2lkVHlwZSwKICAgICAgICBzZXRQYXJlbnRzOwoKZXhwb3J0ICdrZXJuZWxfc2hhZG93X2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIEFyZ3VtZW50c0p1ZGdtZW50LAogICAgICAgIEFzc2VydEluaXRpYWxpemVySnVkZ21lbnQsCiAgICAgICAgQXNzZXJ0U3RhdGVtZW50SnVkZ21lbnQsCiAgICAgICAgQmxvY2tKdWRnbWVudCwKICAgICAgICBDYXNjYWRlSnVkZ21lbnQsCiAgICAgICAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCwKICAgICAgICBDb250aW51ZVN3aXRjaEp1ZGdtZW50LAogICAgICAgIERlZmVycmVkQ2hlY2tKdWRnbWVudCwKICAgICAgICBFeHByZXNzaW9uU3RhdGVtZW50SnVkZ21lbnQsCiAgICAgICAgRmFjdG9yeUNvbnN0cnVjdG9ySW52b2NhdGlvbkp1ZGdtZW50LAogICAgICAgIEZ1bmN0aW9uRGVjbGFyYXRpb25KdWRnbWVudCwKICAgICAgICBGdW5jdGlvbk5vZGVKdWRnbWVudCwKICAgICAgICBJZkp1ZGdtZW50LAogICAgICAgIElmTnVsbEp1ZGdtZW50LAogICAgICAgIEludmFsaWRTdXBlckluaXRpYWxpemVySnVkZ21lbnQsCiAgICAgICAgTG9hZExpYnJhcnlUZWFyT2ZmSnVkZ21lbnQsCiAgICAgICAgTWV0aG9kSW52b2NhdGlvbkp1ZGdtZW50LAogICAgICAgIE5hbWVkRnVuY3Rpb25FeHByZXNzaW9uSnVkZ21lbnQsCiAgICAgICAgTnVsbEF3YXJlTWV0aG9kSW52b2NhdGlvbkp1ZGdtZW50LAogICAgICAgIE51bGxBd2FyZVByb3BlcnR5R2V0SnVkZ21lbnQsCiAgICAgICAgUmVkaXJlY3RpbmdJbml0aWFsaXplckp1ZGdtZW50LAogICAgICAgIFJldHVybkp1ZGdtZW50LAogICAgICAgIFNoYWRvd0ZpZWxkSW5pdGlhbGl6ZXIsCiAgICAgICAgU2hhZG93SW52YWxpZEZpZWxkSW5pdGlhbGl6ZXIsCiAgICAgICAgU2hhZG93SW52YWxpZEluaXRpYWxpemVyLAogICAgICAgIFNoYWRvd0xhcmdlSW50TGl0ZXJhbCwKICAgICAgICBTdXBlckluaXRpYWxpemVySnVkZ21lbnQsCiAgICAgICAgU3VwZXJNZXRob2RJbnZvY2F0aW9uSnVkZ21lbnQsCiAgICAgICAgU3VwZXJQcm9wZXJ0eUdldEp1ZGdtZW50LAogICAgICAgIFN3aXRjaENhc2VKdWRnbWVudCwKICAgICAgICBTd2l0Y2hTdGF0ZW1lbnRKdWRnbWVudCwKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQsCiAgICAgICAgVmFyaWFibGVHZXRKdWRnbWVudCwKICAgICAgICBZaWVsZEp1ZGdtZW50Owp6AE5OPAFJFh4BIQkTFhkVDxQYDx4PExUfIRIVGBQdDxgdHBYWFRcbFRYaDREbFRUaEhIUEBoOGRMOFRMXFRURGRMTGhMdGh8aFBgSFxsRFR0VFRIUASAJGyMhFxkjIB8lLiUeFBgpJCIpKyYoGCAnIh8iJyIcISUdFwE2cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfYXN0X2FwaS5kYXJ0SnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9wYXJzZXIvZXJyb3JfZGVsZWdhdGlvbl9saXN0ZW5lci5kYXJ0gtovLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnIHNob3cgTWVzc2FnZTsKCmltcG9ydCAnbGlzdGVuZXIuZGFydCcgc2hvdyBMaXN0ZW5lcjsKCi8vLyBBIGxpc3RlbmVyIHdoaWNoIGZvcndhcmRzIGVycm9yIHJlcG9ydHMgdG8gYW5vdGhlciBsaXN0ZW5lciBidXQgaWdub3JlcwovLy8gYWxsIG90aGVyIGV2ZW50cy4KY2xhc3MgRXJyb3JEZWxlZ2F0aW9uTGlzdGVuZXIgZXh0ZW5kcyBMaXN0ZW5lciB7CiAgTGlzdGVuZXIgZGVsZWdhdGU7CgogIEVycm9yRGVsZWdhdGlvbkxpc3RlbmVyKHRoaXMuZGVsZWdhdGUpOwoKICB2b2lkIGhhbmRsZVJlY292ZXJhYmxlRXJyb3IoCiAgICAgIE1lc3NhZ2UgbWVzc2FnZSwgVG9rZW4gc3RhcnRUb2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIHJldHVybiBkZWxlZ2F0ZS5oYW5kbGVSZWNvdmVyYWJsZUVycm9yKG1lc3NhZ2UsIHN0YXJ0VG9rZW4sIGVuZFRva2VuKTsKICB9Cn0KGABOTjwBLgErASYBTBYxFQEqAR87SwQCAUFwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL2Vycm9yX2RlbGVnYXRpb25fbGlzdGVuZXIuZGFydDlzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvcGFyc2VyL2xpc3RlbmVyLmRhcnTAAKtBLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEucGFyc2VyLmxpc3RlbmVyOwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnIHNob3cgTWVzc2FnZSwgdGVtcGxhdGVFeHBlcmltZW50Tm90RW5hYmxlZDsKCmltcG9ydCAnLi4vcXVvdGUuZGFydCcgc2hvdyBVbmVzY2FwZUVycm9yTGlzdGVuZXI7CgppbXBvcnQgJy4uL3NjYW5uZXIvZXJyb3JfdG9rZW4uZGFydCcgc2hvdyBFcnJvclRva2VuOwoKaW1wb3J0ICdhc3NlcnQuZGFydCcgc2hvdyBBc3NlcnQ7CgppbXBvcnQgJ2Zvcm1hbF9wYXJhbWV0ZXJfa2luZC5kYXJ0JyBzaG93IEZvcm1hbFBhcmFtZXRlcktpbmQ7CgppbXBvcnQgJ2lkZW50aWZpZXJfY29udGV4dC5kYXJ0JyBzaG93IElkZW50aWZpZXJDb250ZXh0OwoKaW1wb3J0ICdtZW1iZXJfa2luZC5kYXJ0JyBzaG93IE1lbWJlcktpbmQ7CgppbXBvcnQgJ3V0aWwuZGFydCcgc2hvdyBvcHRpb25hbDsKCi8vLyBBIHBhcnNlciBldmVudCBsaXN0ZW5lciB0aGF0IGRvZXMgbm90aGluZyBleGNlcHQgdGhyb3cgZXhjZXB0aW9ucwovLy8gb24gcGFyc2VyIGVycm9ycy4KLy8vCi8vLyBFdmVudHMgYXJlIG1ldGhvZHMgdGhhdCBiZWdpbiB3aXRoIG9uZSBvZjogYGJlZ2luYCwgYGVuZGAsIG9yIGBoYW5kbGVgLgovLy8KLy8vIEV2ZW50cyBzdGFydGluZyB3aXRoIGBiZWdpbmAgYW5kIGBlbmRgIGNvbWUgaW4gcGFpcnMuIE5vcm1hbGx5LCBhCi8vLyBgYmVnaW5Gb29gIGV2ZW50IGlzIGZvbGxvd2VkIGJ5IGFuIGBlbmRGb29gIGV2ZW50LiBUaGVyZSdzIGEgZmV3IGV4Y2VwdGlvbnMKLy8vIGRvY3VtZW50ZWQgYmVsb3cuCi8vLwovLy8gRXZlbnRzIHN0YXJ0aW5nIHdpdGggYGhhbmRsZWAgYXJlIHVzZWQgd2hlbiBpc24ndCBwb3NzaWJsZSB0byBoYXZlIGEgYmVnaW4KLy8vIGV2ZW50LgpjbGFzcyBMaXN0ZW5lciBpbXBsZW1lbnRzIFVuZXNjYXBlRXJyb3JMaXN0ZW5lciB7CiAgVXJpIGdldCB1cmkgPT4gbnVsbDsKCiAgdm9pZCBsb2dFdmVudChTdHJpbmcgbmFtZSkge30KCiAgc2V0IHN1cHByZXNzUGFyc2VFcnJvcnMoYm9vbCB2YWx1ZSkge30KCiAgdm9pZCBiZWdpbkFyZ3VtZW50cyhUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRBcmd1bWVudHMoaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkFyZ3VtZW50cyIpOwogIH0KCiAgLy8vIEhhbmRsZSBhc3luYyBtb2RpZmllcnMgYGFzeW5jYCwgYGFzeW5jKmAsIGBzeW5jYC4KICB2b2lkIGhhbmRsZUFzeW5jTW9kaWZpZXIoVG9rZW4gYXN5bmNUb2tlbiwgVG9rZW4gc3RhclRva2VuKSB7CiAgICBsb2dFdmVudCgiQXN5bmNNb2RpZmllciIpOwogIH0KCiAgdm9pZCBiZWdpbkF3YWl0RXhwcmVzc2lvbihUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRBd2FpdEV4cHJlc3Npb24oVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJBd2FpdEV4cHJlc3Npb24iKTsKICB9CgogIHZvaWQgYmVnaW5CbG9jayhUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRCbG9jayhpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiQmxvY2siKTsKICB9CgogIC8vLyBDYWxsZWQgdG8gaGFuZGxlIGEgYmxvY2sgdGhhdCBoYXMgYmVlbiBwYXJzZWQgYnV0IGlzIG5vdCBhc3NvY2lhdGVkCiAgLy8vIHdpdGggYW55IHRvcCBsZXZlbCBmdW5jdGlvbiBkZWNsYXJhdGlvbi4gU3Vic3RydWN0dXJlczoKICAvLy8gLSBibG9jawogIHZvaWQgaGFuZGxlSW52YWxpZFRvcExldmVsQmxvY2soVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgYmVnaW5DYXNjYWRlKFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZENhc2NhZGUoKSB7CiAgICBsb2dFdmVudCgiQ2FzY2FkZSIpOwogIH0KCiAgdm9pZCBiZWdpbkNhc2VFeHByZXNzaW9uKFRva2VuIGNhc2VLZXl3b3JkKSB7fQoKICB2b2lkIGVuZENhc2VFeHByZXNzaW9uKFRva2VuIGNvbG9uKSB7CiAgICBsb2dFdmVudCgiQ2FzZUV4cHJlc3Npb24iKTsKICB9CgogIHZvaWQgYmVnaW5DbGFzc09yTWl4aW5Cb2R5KFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgdGhlIGJvZHkgb2YgYSBjbGFzcyBvciBtaXhpbiBkZWNsYXJhdGlvbi4KICAvLy8gVGhlIG9ubHkgc3Vic3RydWN0dXJlcyBhcmUgdGhlIGNsYXNzIG9yIG1peGluIG1lbWJlcnMuCiAgdm9pZCBlbmRDbGFzc09yTWl4aW5Cb2R5KGludCBtZW1iZXJDb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJDbGFzc09yTWl4aW5Cb2R5Iik7CiAgfQoKICAvLy8gQ2FsbGVkIGJlZm9yZSBwYXJzaW5nIGEgY2xhc3Mgb3IgbmFtZWQgbWl4aW4gYXBwbGljYXRpb24uCiAgdm9pZCBiZWdpbkNsYXNzT3JOYW1lZE1peGluQXBwbGljYXRpb24oVG9rZW4gdG9rZW4pIHt9CgogIC8vLyBIYW5kbGUgdGhlIGJlZ2lubmluZyBvZiBhIGNsYXNzIGRlY2xhcmF0aW9uLgogIC8vLyBbYmVnaW5dIG1heSBiZSB0aGUgc2FtZSBhcyBbbmFtZV0sIG9yIG1heSBwb2ludCB0byBtb2RpZmllcnMKICAvLy8gKG9yIGV4dHJhbmVvdXMgbW9kaWZpZXJzIGluIHRoZSBjYXNlIG9mIHJlY292ZXJ5KSBwcmVjZWRpbmcgW25hbWVdLgogIHZvaWQgYmVnaW5DbGFzc0RlY2xhcmF0aW9uKFRva2VuIGJlZ2luLCBUb2tlbiBhYnN0cmFjdFRva2VuLCBUb2tlbiBuYW1lKSB7fQoKICAvLy8gSGFuZGxlIGFuIGV4dGVuZHMgY2xhdXNlIGluIGEgY2xhc3MgZGVjbGFyYXRpb24uIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gc3VwZXJ0eXBlIChtYXkgYmUgYSBtaXhpbiBhcHBsaWNhdGlvbikKICB2b2lkIGhhbmRsZUNsYXNzRXh0ZW5kcyhUb2tlbiBleHRlbmRzS2V5d29yZCkgewogICAgbG9nRXZlbnQoIkNsYXNzRXh0ZW5kcyIpOwogIH0KCiAgLy8vIEhhbmRsZSBhbiBpbXBsZW1lbnRzIGNsYXVzZSBpbiBhIGNsYXNzIG9yIG1peGluIGRlY2xhcmF0aW9uLgogIC8vLyBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIGltcGxlbWVudGVkIHR5cGVzCiAgdm9pZCBoYW5kbGVDbGFzc09yTWl4aW5JbXBsZW1lbnRzKAogICAgICBUb2tlbiBpbXBsZW1lbnRzS2V5d29yZCwgaW50IGludGVyZmFjZXNDb3VudCkgewogICAgbG9nRXZlbnQoIkNsYXNzSW1wbGVtZW50cyIpOwogIH0KCiAgLy8vIEhhbmRsZSB0aGUgaGVhZGVyIG9mIGEgY2xhc3MgZGVjbGFyYXRpb24uICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIG1ldGFkYXRhCiAgLy8vIC0gbW9kaWZpZXJzCiAgLy8vIC0gY2xhc3MgbmFtZQogIC8vLyAtIHR5cGUgdmFyaWFibGVzCiAgLy8vIC0gc3VwZXJ0eXBlCiAgLy8vIC0gd2l0aCBjbGF1c2UKICAvLy8gLSBpbXBsZW1lbnRlZCB0eXBlcwogIC8vLyAtIG5hdGl2ZSBjbGF1c2UKICB2b2lkIGhhbmRsZUNsYXNzSGVhZGVyKFRva2VuIGJlZ2luLCBUb2tlbiBjbGFzc0tleXdvcmQsIFRva2VuIG5hdGl2ZVRva2VuKSB7CiAgICBsb2dFdmVudCgiQ2xhc3NIZWFkZXIiKTsKICB9CgogIC8vLyBIYW5kbGUgcmVjb3ZlcnkgYXNzb2NpYXRlZCB3aXRoIGEgY2xhc3MgaGVhZGVyLgogIC8vLyBUaGlzIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYWZ0ZXIgW2hhbmRsZUNsYXNzSGVhZGVyXQogIC8vLyB0byByZWNvdmVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcmV2aW91cyBjbGFzcyBoZWFkZXIuCiAgLy8vIFRoZSBzdWJzdHJ1Y3R1cmVzIGFyZSBhIHN1YnNldCBvZgogIC8vLyBhbmQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgW2hhbmRsZUNsYXNzSGVhZGVyXToKICAvLy8gLSBzdXBlcnR5cGUKICAvLy8gLSB3aXRoIGNsYXVzZQogIC8vLyAtIGltcGxlbWVudGVkIHR5cGVzCiAgdm9pZCBoYW5kbGVSZWNvdmVyQ2xhc3NIZWFkZXIoKSB7CiAgICBsb2dFdmVudCgiUmVjb3ZlckNsYXNzSGVhZGVyIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBjbGFzcyBkZWNsYXJhdGlvbi4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gY2xhc3MgaGVhZGVyCiAgLy8vIC0gY2xhc3MgYm9keQogIHZvaWQgZW5kQ2xhc3NEZWNsYXJhdGlvbihUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkNsYXNzRGVjbGFyYXRpb24iKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIGJlZ2lubmluZyBvZiBhIG1peGluIGRlY2xhcmF0aW9uLgogIHZvaWQgYmVnaW5NaXhpbkRlY2xhcmF0aW9uKFRva2VuIG1peGluS2V5d29yZCwgVG9rZW4gbmFtZSkge30KCiAgLy8vIEhhbmRsZSBhbiBvbiBjbGF1c2UgaW4gYSBtaXhpbiBkZWNsYXJhdGlvbi4gU3Vic3RydWN0dXJlczoKICAvLy8gLSBpbXBsZW1lbnRlZCB0eXBlcwogIHZvaWQgaGFuZGxlTWl4aW5PbihUb2tlbiBvbktleXdvcmQsIGludCB0eXBlQ291bnQpIHsKICAgIGxvZ0V2ZW50KCJNaXhpbk9uIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBoZWFkZXIgb2YgYSBjbGFzcyBkZWNsYXJhdGlvbi4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gbWV0YWRhdGEKICAvLy8gLSBtaXhpbiBuYW1lCiAgLy8vIC0gdHlwZSB2YXJpYWJsZXMKICAvLy8gLSBvbiB0eXBlcwogIC8vLyAtIGltcGxlbWVudGVkIHR5cGVzCiAgdm9pZCBoYW5kbGVNaXhpbkhlYWRlcihUb2tlbiBtaXhpbktleXdvcmQpIHsKICAgIGxvZ0V2ZW50KCJNaXhpbkhlYWRlciIpOwogIH0KCiAgLy8vIEhhbmRsZSByZWNvdmVyeSBhc3NvY2lhdGVkIHdpdGggYSBtaXhpbiBoZWFkZXIuCiAgLy8vIFRoaXMgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBhZnRlciBbaGFuZGxlTWl4aW5IZWFkZXJdCiAgLy8vIHRvIHJlY292ZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByZXZpb3VzIG1peGluIGhlYWRlci4KICAvLy8gVGhlIHN1YnN0cnVjdHVyZXMgYXJlIGEgc3Vic2V0IG9mCiAgLy8vIGFuZCBpbiB0aGUgc2FtZSBvcmRlciBhcyBbaGFuZGxlTWl4aW5IZWFkZXJdCiAgLy8vIC0gb24gdHlwZXMKICAvLy8gLSBpbXBsZW1lbnRlZCB0eXBlcwogIHZvaWQgaGFuZGxlUmVjb3Zlck1peGluSGVhZGVyKCkgewogICAgbG9nRXZlbnQoIlJlY292ZXJNaXhpbkhlYWRlciIpOwogIH0KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGEgbWl4aW4gZGVjbGFyYXRpb24uICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIG1peGluIGhlYWRlcgogIC8vLyAtIGNsYXNzIG9yIG1peGluIGJvZHkKICB2b2lkIGVuZE1peGluRGVjbGFyYXRpb24oVG9rZW4gbWl4aW5LZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIk1peGluRGVjbGFyYXRpb24iKTsKICB9CgogIHZvaWQgYmVnaW5Db21iaW5hdG9ycyhUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRDb21iaW5hdG9ycyhpbnQgY291bnQpIHsKICAgIGxvZ0V2ZW50KCJDb21iaW5hdG9ycyIpOwogIH0KCiAgdm9pZCBiZWdpbkNvbXBpbGF0aW9uVW5pdChUb2tlbiB0b2tlbikge30KCiAgLy8vIFRoaXMgbWV0aG9kIGV4aXN0cyBmb3IgYW5hbHl6ZXIgY29tcGF0aWJpbGl0eSBvbmx5CiAgLy8vIGFuZCB3aWxsIGJlIHJlbW92ZWQgb25jZSBhbmFseXplci9mYXN0YSBpbnRlZ3JhdGlvbiBpcyBjb21wbGV0ZS4KICAvLy8KICAvLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBbcGFyc2VEaXJlY3RpdmVzXSBoYXMgcGFyc2VkIGFsbCBkaXJlY3RpdmVzCiAgLy8vIGFuZCBpcyBza2lwcGluZyB0aGUgcmVtYWluZGVyIG9mIHRoZSBmaWxlLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBtZXRhZGF0YQogIHZvaWQgaGFuZGxlRGlyZWN0aXZlc09ubHkoKSB7fQoKICB2b2lkIGVuZENvbXBpbGF0aW9uVW5pdChpbnQgY291bnQsIFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiQ29tcGlsYXRpb25Vbml0Iik7CiAgfQoKICB2b2lkIGJlZ2luQ29uc3RMaXRlcmFsKFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZENvbnN0TGl0ZXJhbChUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkNvbnN0TGl0ZXJhbCIpOwogIH0KCiAgdm9pZCBiZWdpbkNvbnN0cnVjdG9yUmVmZXJlbmNlKFRva2VuIHN0YXJ0KSB7fQoKICB2b2lkIGVuZENvbnN0cnVjdG9yUmVmZXJlbmNlKAogICAgICBUb2tlbiBzdGFydCwgVG9rZW4gcGVyaW9kQmVmb3JlTmFtZSwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJDb25zdHJ1Y3RvclJlZmVyZW5jZSIpOwogIH0KCiAgdm9pZCBiZWdpbkRvV2hpbGVTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kRG9XaGlsZVN0YXRlbWVudCgKICAgICAgVG9rZW4gZG9LZXl3b3JkLCBUb2tlbiB3aGlsZUtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiRG9XaGlsZVN0YXRlbWVudCIpOwogIH0KCiAgdm9pZCBiZWdpbkRvV2hpbGVTdGF0ZW1lbnRCb2R5KFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZERvV2hpbGVTdGF0ZW1lbnRCb2R5KFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiRG9XaGlsZVN0YXRlbWVudEJvZHkiKTsKICB9CgogIHZvaWQgYmVnaW5XaGlsZVN0YXRlbWVudEJvZHkoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kV2hpbGVTdGF0ZW1lbnRCb2R5KFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiV2hpbGVTdGF0ZW1lbnRCb2R5Iik7CiAgfQoKICB2b2lkIGJlZ2luRW51bShUb2tlbiBlbnVtS2V5d29yZCkge30KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGFuIGVudW0gZGVjbGFyYXRpb24uICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIE1ldGFkYXRhCiAgLy8vIC0gRW51bSBuYW1lIChpZGVudGlmaWVyKQogIC8vLyAtIFtjb3VudF0gdGltZXM6CiAgLy8vICAgLSBFbnVtIHZhbHVlIChpZGVudGlmaWVyKQogIHZvaWQgZW5kRW51bShUb2tlbiBlbnVtS2V5d29yZCwgVG9rZW4gbGVmdEJyYWNlLCBpbnQgY291bnQpIHsKICAgIGxvZ0V2ZW50KCJFbnVtIik7CiAgfQoKICB2b2lkIGJlZ2luRXhwb3J0KFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYW4gZXhwb3J0IGRpcmVjdGl2ZS4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gbWV0YWRhdGEKICAvLy8gLSB1cmkKICAvLy8gLSBjb25kaXRpb25hbCB1cmlzCiAgLy8vIC0gY29tYmluYXRvcnMKICB2b2lkIGVuZEV4cG9ydChUb2tlbiBleHBvcnRLZXl3b3JkLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGxvZ0V2ZW50KCJFeHBvcnQiKTsKICB9CgogIC8vLyBDYWxsZWQgYnkgW1BhcnNlcl0gYWZ0ZXIgcGFyc2luZyBhbiBleHRyYW5lb3VzIGV4cHJlc3Npb24gYXMgZXJyb3IKICAvLy8gcmVjb3ZlcnkuIEZvciBhIHN0YWNrLWJhc2VkIGxpc3RlbmVyLCB0aGUgc3VnZ2VzdGVkIGFjdGlvbiBpcyB0byBkaXNjYXJkCiAgLy8vIGFuIGV4cHJlc3Npb24gZnJvbSB0aGUgc3RhY2suCiAgdm9pZCBoYW5kbGVFeHRyYW5lb3VzRXhwcmVzc2lvbihUb2tlbiB0b2tlbiwgTWVzc2FnZSBtZXNzYWdlKSB7CiAgICBsb2dFdmVudCgiRXh0cmFuZW91c0V4cHJlc3Npb24iKTsKICB9CgogIHZvaWQgaGFuZGxlRXhwcmVzc2lvblN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkV4cHJlc3Npb25TdGF0ZW1lbnQiKTsKICB9CgogIHZvaWQgYmVnaW5GYWN0b3J5TWV0aG9kKAogICAgICBUb2tlbiBsYXN0Q29uc3VtZWQsIFRva2VuIGV4dGVybmFsVG9rZW4sIFRva2VuIGNvbnN0VG9rZW4pIHt9CgogIHZvaWQgZW5kRmFjdG9yeU1ldGhvZCgKICAgICAgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZmFjdG9yeUtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiRmFjdG9yeU1ldGhvZCIpOwogIH0KCiAgdm9pZCBiZWdpbkZvcm1hbFBhcmFtZXRlcihUb2tlbiB0b2tlbiwgTWVtYmVyS2luZCBraW5kLCBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwKICAgICAgVG9rZW4gdmFyRmluYWxPckNvbnN0KSB7fQoKICB2b2lkIGVuZEZvcm1hbFBhcmFtZXRlcihUb2tlbiB0aGlzS2V5d29yZCwgVG9rZW4gcGVyaW9kQWZ0ZXJUaGlzLAogICAgICBUb2tlbiBuYW1lVG9rZW4sIEZvcm1hbFBhcmFtZXRlcktpbmQga2luZCwgTWVtYmVyS2luZCBtZW1iZXJLaW5kKSB7CiAgICBsb2dFdmVudCgiRm9ybWFsUGFyYW1ldGVyIik7CiAgfQoKICB2b2lkIGhhbmRsZU5vRm9ybWFsUGFyYW1ldGVycyhUb2tlbiB0b2tlbiwgTWVtYmVyS2luZCBraW5kKSB7CiAgICBsb2dFdmVudCgiTm9Gb3JtYWxQYXJhbWV0ZXJzIik7CiAgfQoKICB2b2lkIGJlZ2luRm9ybWFsUGFyYW1ldGVycyhUb2tlbiB0b2tlbiwgTWVtYmVyS2luZCBraW5kKSB7fQoKICB2b2lkIGVuZEZvcm1hbFBhcmFtZXRlcnMoCiAgICAgIGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgbG9nRXZlbnQoIkZvcm1hbFBhcmFtZXRlcnMiKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIGVuZCBvZiBhIGZpZWxkIGRlY2xhcmF0aW9uLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBNZXRhZGF0YQogIC8vLyAtIE1vZGlmaWVycwogIC8vLyAtIFR5cGUKICAvLy8gLSBWYXJpYWJsZSBkZWNsYXJhdGlvbnMgKGNvdW50IHRpbWVzKQogIC8vLwogIC8vLyBEb2Vzbid0IGhhdmUgYSBjb3JyZXNwb25kaW5nIGJlZ2luIGV2ZW50LCB1c2UgW2JlZ2luTWVtYmVyXSBpbnN0ZWFkLgogIHZvaWQgZW5kRmllbGRzKFRva2VuIHN0YXRpY1Rva2VuLCBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwgVG9rZW4gdmFyRmluYWxPckNvbnN0LAogICAgICBpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiRmllbGRzIik7CiAgfQoKICAvLy8gTWFya3MgdGhhdCB0aGUgZ3JhbW1hciB0ZXJtIGBmb3JJbml0aWFsaXplclN0YXRlbWVudGAgaGFzIGJlZW4gcGFyc2VkIGFuZAogIC8vLyBpdCB3YXMgYW4gZW1wdHkgc3RhdGVtZW50LgogIHZvaWQgaGFuZGxlRm9ySW5pdGlhbGl6ZXJFbXB0eVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkZvckluaXRpYWxpemVyRW1wdHlTdGF0ZW1lbnQiKTsKICB9CgogIC8vLyBNYXJrcyB0aGF0IHRoZSBncmFtbWFyIHRlcm0gYGZvckluaXRpYWxpemVyU3RhdGVtZW50YCBoYXMgYmVlbiBwYXJzZWQgYW5kCiAgLy8vIGl0IHdhcyBhbiBleHByZXNzaW9uIHN0YXRlbWVudC4KICB2b2lkIGhhbmRsZUZvckluaXRpYWxpemVyRXhwcmVzc2lvblN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkZvckluaXRpYWxpemVyRXhwcmVzc2lvblN0YXRlbWVudCIpOwogIH0KCiAgLy8vIE1hcmtzIHRoYXQgdGhlIGdyYW1tYXIgdGVybSBgZm9ySW5pdGlhbGl6ZXJTdGF0ZW1lbnRgIGhhcyBiZWVuIHBhcnNlZCBhbmQKICAvLy8gaXQgd2FzIGEgYGxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbmAuCiAgdm9pZCBoYW5kbGVGb3JJbml0aWFsaXplckxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbihUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkZvckluaXRpYWxpemVyTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uIik7CiAgfQoKICAvLy8gTWFya3MgdGhlIHN0YXJ0IG9mIGEgZm9yIHN0YXRlbWVudCB3aGljaCBpcyBlbmRlZCBieSBlaXRoZXIKICAvLy8gW2VuZEZvclN0YXRlbWVudF0gb3IgW2VuZEZvckluXS4KICB2b2lkIGJlZ2luRm9yU3RhdGVtZW50KFRva2VuIHRva2VuKSB7fQoKICAvLy8gTWFya3MgdGhlIGVuZCBvZiBwYXJzaW5nIHRoZSBjb250cm9sIHN0cnVjdHVyZSBvZiBhIGZvciBzdGF0ZW1lbnQKICAvLy8gb3IgZm9yIGNvbnRyb2wgZmxvdyBlbnRyeSB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBjbG9zaW5nIHBhcmVudGhlc2lzLgogIC8vLyBgZm9yYCBgKGAgaW5pdGlhbGl6YXRpb24gYDtgIGNvbmRpdGlvbiBgO2AgdXBkYXRlcnMgYClgCiAgdm9pZCBoYW5kbGVGb3JMb29wUGFydHMoVG9rZW4gZm9yS2V5d29yZCwgVG9rZW4gbGVmdFBhcmVuLAogICAgICBUb2tlbiBsZWZ0U2VwYXJhdG9yLCBpbnQgdXBkYXRlRXhwcmVzc2lvbkNvdW50KSB7fQoKICB2b2lkIGVuZEZvclN0YXRlbWVudChUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkZvclN0YXRlbWVudCIpOwogIH0KCiAgdm9pZCBiZWdpbkZvclN0YXRlbWVudEJvZHkoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kRm9yU3RhdGVtZW50Qm9keShUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkZvclN0YXRlbWVudEJvZHkiKTsKICB9CgogIC8vLyBNYXJrcyB0aGUgZW5kIG9mIHBhcnNpbmcgdGhlIGNvbnRyb2wgc3RydWN0dXJlIG9mIGEgZm9yLWluIHN0YXRlbWVudAogIC8vLyBvciBmb3IgY29udHJvbCBmbG93IGVudHJ5IHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGNsb3NpbmcgcGFyZW50aGVzaXMuCiAgLy8vIGBmb3JgIGAoYCAodHlwZSk/IGlkZW50aWZpZXIgYGluYCBpdGVyYXRvciBgKWAKICB2b2lkIGhhbmRsZUZvckluTG9vcFBhcnRzKFRva2VuIGF3YWl0VG9rZW4sIFRva2VuIGZvclRva2VuLAogICAgICBUb2tlbiBsZWZ0UGFyZW50aGVzaXMsIFRva2VuIGluS2V5d29yZCkge30KCiAgLy8gT25lIG9mIHRoZSB0d28gcG9zc2libGUgY29ycmVzcG9uZGluZyBlbmQgZXZlbnRzIGZvciBbYmVnaW5Gb3JTdGF0ZW1lbnRdLgogIHZvaWQgZW5kRm9ySW4oVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJGb3JJbiIpOwogIH0KCiAgdm9pZCBiZWdpbkZvckluRXhwcmVzc2lvbihUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRGb3JJbkV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJGb3JJbkV4cHJlc3Npb24iKTsKICB9CgogIHZvaWQgYmVnaW5Gb3JJbkJvZHkoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kRm9ySW5Cb2R5KFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiRm9ySW5Cb2R5Iik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBiZWdpbm5pbmcgb2YgYSBuYW1lZCBmdW5jdGlvbiBleHByZXNzaW9uIHdoaWNoIGlzbid0IGxlZ2FsCiAgLy8vIHN5bnRheCBpbiBEYXJ0LiAgVXNlZnVsIGZvciByZWNvdmVyaW5nIGZyb20gSmF2YXNjcmlwdCBjb2RlIGJlaW5nIHBhc3RlZAogIC8vLyBpbnRvIGEgRGFydCBwcm9yYW0sIGFzIGl0IHdpbGwgaW50ZXJwcmV0IGBmdW5jdGlvbiBmb28oKSB7fWAgYXMgYSBuYW1lZAogIC8vLyBmdW5jdGlvbiBleHByZXNzaW9uIHdpdGggcmV0dXJuIHR5cGUgYGZ1bmN0aW9uYCBhbmQgbmFtZSBgZm9vYC4KICAvLy8KICAvLy8gU3Vic3RydWN0dXJlczoKICAvLy8gLSBUeXBlIHZhcmlhYmxlcwogIHZvaWQgYmVnaW5OYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbihUb2tlbiB0b2tlbikge30KCiAgLy8vIEEgbmFtZWQgZnVuY3Rpb24gZXhwcmVzc2lvbiB3aGljaCBpc24ndCBsZWdhbCBzeW50YXggaW4gRGFydC4KICAvLy8gVXNlZnVsIGZvciByZWNvdmVyaW5nIGZyb20gSmF2YXNjcmlwdCBjb2RlIGJlaW5nIHBhc3RlZCBpbnRvIGEgRGFydAogIC8vLyBwcm9yYW0sIGFzIGl0IHdpbGwgaW50ZXJwcmV0IGBmdW5jdGlvbiBmb28oKSB7fWAgYXMgYSBuYW1lZCBmdW5jdGlvbgogIC8vLyBleHByZXNzaW9uIHdpdGggcmV0dXJuIHR5cGUgYGZ1bmN0aW9uYCBhbmQgbmFtZSBgZm9vYC4KICAvLy8KICAvLy8gU3Vic3RydWN0dXJlczoKICAvLy8gLSBUeXBlIHZhcmlhYmxlcwogIC8vLyAtIE1vZGlmaWVycwogIC8vLyAtIFJldHVybiB0eXBlCiAgLy8vIC0gTmFtZQogIC8vLyAtIEZvcm1hbHMKICAvLy8gLSBJbml0aWFsaXplcnMKICAvLy8gLSBBc3luYyBtb2RpZmllcgogIC8vLyAtIEZ1bmN0aW9uIGJvZHkgKGJsb2NrIG9yIGFycm93IGV4cHJlc3Npb24pLgogIHZvaWQgZW5kTmFtZWRGdW5jdGlvbkV4cHJlc3Npb24oVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJOYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbiIpOwogIH0KCiAgLy8vIEhhbmRsZSB0aGUgYmVnaW5uaW5nIG9mIGEgbG9jYWwgZnVuY3Rpb24gZGVjbGFyYXRpb24uICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIE1ldGFkYXRhCiAgLy8vIC0gVHlwZSB2YXJpYWJsZXMKICB2b2lkIGJlZ2luTG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uKFRva2VuIHRva2VuKSB7fQoKICAvLy8gQSBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KICAvLy8KICAvLy8gU3Vic3RydWN0dXJlczoKICAvLy8gLSBNZXRhZGF0YQogIC8vLyAtIFR5cGUgdmFyaWFibGVzCiAgLy8vIC0gUmV0dXJuIHR5cGUKICAvLy8gLSBOYW1lCiAgLy8vIC0gVHlwZSB2YXJpYWJsZXMKICAvLy8gLSBGb3JtYWxzCiAgLy8vIC0gSW5pdGlhbGl6ZXJzCiAgLy8vIC0gQXN5bmMgbW9kaWZpZXIKICAvLy8gLSBGdW5jdGlvbiBib2R5IChibG9jayBvciBhcnJvdyBleHByZXNzaW9uKS4KICB2b2lkIGVuZExvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbihUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkZ1bmN0aW9uRGVjbGFyYXRpb24iKTsKICB9CgogIC8vLyBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIHdoZW4gdGhlIHBhcnNlciBzZWVzIHRoYXQgYSBmdW5jdGlvbiBoYXMgYQogIC8vLyBibG9jayBmdW5jdGlvbiBib2R5LiAgVGhpcyBtZXRob2QgaXMgbm90IGludm9rZWQgZm9yIGVtcHR5IG9yIGV4cHJlc3Npb24KICAvLy8gZnVuY3Rpb24gYm9kaWVzLCBzZWUgdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kcyBbaGFuZGxlRW1wdHlGdW5jdGlvbkJvZHldCiAgLy8vIGFuZCBbaGFuZGxlRXhwcmVzc2lvbkZ1bmN0aW9uQm9keV0uCiAgdm9pZCBiZWdpbkJsb2NrRnVuY3Rpb25Cb2R5KFRva2VuIHRva2VuKSB7fQoKICAvLy8gVGhpcyBtZXRob2QgaXMgaW52b2tlZCBieSB0aGUgcGFyc2VyIGFmdGVyIGl0IGZpbmlzaGVkIHBhcnNpbmcgYSBibG9jawogIC8vLyBmdW5jdGlvbiBib2R5LiAgVGhpcyBtZXRob2QgaXMgbm90IGludm9rZWQgZm9yIGVtcHR5IG9yIGV4cHJlc3Npb24KICAvLy8gZnVuY3Rpb24gYm9kaWVzLCBzZWUgdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kcyBbaGFuZGxlRW1wdHlGdW5jdGlvbkJvZHldCiAgLy8vIGFuZCBbaGFuZGxlRXhwcmVzc2lvbkZ1bmN0aW9uQm9keV0uICBUaGUgW2JlZ2luVG9rZW5dIGlzIHRoZSAneycgdG9rZW4sCiAgLy8vIGFuZCB0aGUgW2VuZFRva2VuXSBpcyB0aGUgJ30nIHRva2VuIG9mIHRoZSBibG9jay4gIFRoZSBudW1iZXIgb2YKICAvLy8gc3RhdGVtZW50cyBpcyBnaXZlbiBhcyB0aGUgW2NvdW50XSBwYXJhbWV0ZXIuCiAgdm9pZCBlbmRCbG9ja0Z1bmN0aW9uQm9keShpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiQmxvY2tGdW5jdGlvbkJvZHkiKTsKICB9CgogIHZvaWQgaGFuZGxlTm9GdW5jdGlvbkJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJOb0Z1bmN0aW9uQm9keSIpOwogIH0KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGEgZnVuY3Rpb24gYm9keSB0aGF0IHdhcyBza2lwcGVkIGJ5IHRoZSBwYXJzZXIuCiAgLy8vCiAgLy8vIFRoZSBib29sZWFuIFtpc0V4cHJlc3Npb25Cb2R5XSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZnVuY3Rpb24gYm9keSB0aGF0CiAgLy8vIHdhcyBza2lwcGVkIHVzZWQgIj0+IiBzeW50YXguCiAgdm9pZCBoYW5kbGVGdW5jdGlvbkJvZHlTa2lwcGVkKFRva2VuIHRva2VuLCBib29sIGlzRXhwcmVzc2lvbkJvZHkpIHt9CgogIHZvaWQgYmVnaW5GdW5jdGlvbk5hbWUoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kRnVuY3Rpb25OYW1lKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiRnVuY3Rpb25OYW1lIik7CiAgfQoKICB2b2lkIGJlZ2luRnVuY3Rpb25UeXBlQWxpYXMoVG9rZW4gdG9rZW4pIHt9CgogIC8vLyBIYW5kbGUgdGhlIGVuZCBvZiBhIHR5cGVkZWYgZGVjbGFyYXRpb24uCiAgLy8vCiAgLy8vIElmIFtlcXVhbHNdIGlzIG51bGwsIHRoZW4gd2UgaGF2ZSB0aGUgZm9sbG93aW5nIHN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gTWV0YWRhdGEKICAvLy8gLSBSZXR1cm4gdHlwZQogIC8vLyAtIE5hbWUgKGlkZW50aWZpZXIpCiAgLy8vIC0gQWxpYXMgdHlwZSB2YXJpYWJsZXMKICAvLy8gLSBGb3JtYWwgcGFyYW1ldGVycwogIC8vLwogIC8vLyBJZiBbZXF1YWxzXSBpcyBub3QgbnVsbCwgdGhlbiB0aGUgaGF2ZSB0aGUgZm9sbG93aW5nIHN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gTWV0YWRhdGEKICAvLy8gLSBOYW1lIChpZGVudGlmaWVyKQogIC8vLyAtIEFsaWFzIHR5cGUgdmFyaWFibGVzCiAgLy8vIC0gVHlwZSAoRnVuY3Rpb25UeXBlQW5ub3RhdGlvbikKICB2b2lkIGVuZEZ1bmN0aW9uVHlwZUFsaWFzKAogICAgICBUb2tlbiB0eXBlZGVmS2V5d29yZCwgVG9rZW4gZXF1YWxzLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkZ1bmN0aW9uVHlwZUFsaWFzIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSB3aXRoIGNsYXVzZSAoZS5nLiAid2l0aCBCLCBDIikuCiAgLy8vIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gbWl4aW4gdHlwZXMgKFR5cGVMaXN0KQogIHZvaWQgaGFuZGxlQ2xhc3NXaXRoQ2xhdXNlKFRva2VuIHdpdGhLZXl3b3JkKSB7CiAgICBsb2dFdmVudCgiQ2xhc3NXaXRoQ2xhdXNlIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBhYnNlbmNlIG9mIGEgd2l0aCBjbGF1c2UuCiAgdm9pZCBoYW5kbGVDbGFzc05vV2l0aENsYXVzZSgpIHsKICAgIGxvZ0V2ZW50KCJDbGFzc05vV2l0aENsYXVzZSIpOwogIH0KCiAgLy8vIEhhbmRsZSB0aGUgYmVnaW5uaW5nIG9mIGEgbmFtZWQgbWl4aW4gYXBwbGljYXRpb24uCiAgLy8vIFtiZWdpblRva2VuXSBtYXkgYmUgdGhlIHNhbWUgYXMgW25hbWVdLCBvciBtYXkgcG9pbnQgdG8gbW9kaWZpZXJzCiAgLy8vIChvciBleHRyYW5lb3VzIG1vZGlmaWVycyBpbiB0aGUgY2FzZSBvZiByZWNvdmVyeSkgcHJlY2VkaW5nIFtuYW1lXS4KICB2b2lkIGJlZ2luTmFtZWRNaXhpbkFwcGxpY2F0aW9uKAogICAgICBUb2tlbiBiZWdpbiwgVG9rZW4gYWJzdHJhY3RUb2tlbiwgVG9rZW4gbmFtZSkge30KCiAgLy8vIEhhbmRsZSBhIG5hbWVkIG1peGluIGFwcGxpY2F0aW9uIHdpdGggY2xhdXNlIChlLmcuICJBIHdpdGggQiwgQyIpLgogIC8vLyBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIHN1cGVydHlwZQogIC8vLyAtIG1peGluIHR5cGVzIChUeXBlTGlzdCkKICB2b2lkIGhhbmRsZU5hbWVkTWl4aW5BcHBsaWNhdGlvbldpdGhDbGF1c2UoVG9rZW4gd2l0aEtleXdvcmQpIHsKICAgIGxvZ0V2ZW50KCJOYW1lZE1peGluQXBwbGljYXRpb25XaXRoQ2xhdXNlIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBuYW1lZCBtaXhpbiBkZWNsYXJhdGlvbi4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gbWV0YWRhdGEKICAvLy8gLSBtb2RpZmllcnMKICAvLy8gLSBjbGFzcyBuYW1lCiAgLy8vIC0gdHlwZSB2YXJpYWJsZXMKICAvLy8gLSBzdXBlcnR5cGUKICAvLy8gLSB3aXRoIGNsYXVzZQogIC8vLyAtIGltcGxlbWVudGVkIHR5cGVzIChUeXBlTGlzdCkKICAvLy8KICAvLy8gVE9ETyhwYXVsYmVycnksYWhlKTogaXQgc2VlbXMgaW5jb25zaXN0ZW50IHRoYXQgZm9yIGEgbmFtZWQgbWl4aW4KICAvLy8gYXBwbGljYXRpb24sIHRoZSBpbXBsZW1lbnRlZCB0eXBlcyBhcmUgYSBUeXBlTGlzdCwgd2hlcmVhcyBmb3IgYSBjbGFzcwogIC8vLyBkZWNsYXJhdGlvbiwgZWFjaCBpbXBsZW1lbnRlZCB0eXBlIGlzIGxpc3RlZCBzZXBhcmF0ZWx5IG9uIHRoZSBzdGFjaywgYW5kCiAgLy8vIHRoZSBudW1iZXIgb2YgaW1wbGVtZW50ZWQgdHlwZXMgaXMgcGFzc2VkIGFzIGEgcGFyYW1ldGVyLgogIHZvaWQgZW5kTmFtZWRNaXhpbkFwcGxpY2F0aW9uKFRva2VuIGJlZ2luLCBUb2tlbiBjbGFzc0tleXdvcmQsIFRva2VuIGVxdWFscywKICAgICAgVG9rZW4gaW1wbGVtZW50c0tleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiTmFtZWRNaXhpbkFwcGxpY2F0aW9uIik7CiAgfQoKICB2b2lkIGJlZ2luSGlkZShUb2tlbiBoaWRlS2V5d29yZCkge30KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGEgImhpZGUiIGNvbWJpbmF0b3IuICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIGhpZGRlbiBuYW1lcyAoSWRlbnRpZmllckxpc3QpCiAgdm9pZCBlbmRIaWRlKFRva2VuIGhpZGVLZXl3b3JkKSB7CiAgICBsb2dFdmVudCgiSGlkZSIpOwogIH0KCiAgdm9pZCBoYW5kbGVJZGVudGlmaWVyTGlzdChpbnQgY291bnQpIHsKICAgIGxvZ0V2ZW50KCJJZGVudGlmaWVyTGlzdCIpOwogIH0KCiAgdm9pZCBiZWdpblR5cGVMaXN0KFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZFR5cGVMaXN0KGludCBjb3VudCkgewogICAgbG9nRXZlbnQoIlR5cGVMaXN0Iik7CiAgfQoKICB2b2lkIGJlZ2luSWZTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kSWZTdGF0ZW1lbnQoVG9rZW4gaWZUb2tlbiwgVG9rZW4gZWxzZVRva2VuKSB7CiAgICBsb2dFdmVudCgiSWZTdGF0ZW1lbnQiKTsKICB9CgogIHZvaWQgYmVnaW5UaGVuU3RhdGVtZW50KFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZFRoZW5TdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJUaGVuU3RhdGVtZW50Iik7CiAgfQoKICB2b2lkIGJlZ2luRWxzZVN0YXRlbWVudChUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRFbHNlU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiRWxzZVN0YXRlbWVudCIpOwogIH0KCiAgdm9pZCBiZWdpbkltcG9ydChUb2tlbiBpbXBvcnRLZXl3b3JkKSB7fQoKICAvLy8gU2lnbmFscyB0aGF0IHRoZSBjdXJyZW50IGltcG9ydCBpcyBkZWZlcnJlZCBhbmQvb3IgaGFzIGEgcHJlZml4CiAgLy8vIGRlcGVuZGluZyB1cG9uIHdoZXRoZXIgW2RlZmVycmVkS2V5d29yZF0gYW5kIFthc0tleXdvcmRdCiAgLy8vIGFyZSBub3QgYG51bGxgIHJlc3BlY3RpdmVseS4gU3Vic3RydWN0dXJlczoKICAvLy8gLSBwcmVmaXggaWRlbnRpZmllciAob25seSBpZiBhc0tleXdvcmQgIT0gbnVsbCkKICB2b2lkIGhhbmRsZUltcG9ydFByZWZpeChUb2tlbiBkZWZlcnJlZEtleXdvcmQsIFRva2VuIGFzS2V5d29yZCkgewogICAgbG9nRXZlbnQoIkltcG9ydFByZWZpeCIpOwogIH0KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGFuIGltcG9ydCBkaXJlY3RpdmUuICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIG1ldGFkYXRhCiAgLy8vIC0gdXJpCiAgLy8vIC0gY29uZGl0aW9uYWwgdXJpcwogIC8vLyAtIHByZWZpeCBpZGVudGlmaWVyCiAgLy8vIC0gY29tYmluYXRvcnMKICB2b2lkIGVuZEltcG9ydChUb2tlbiBpbXBvcnRLZXl3b3JkLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGxvZ0V2ZW50KCJJbXBvcnQiKTsKICB9CgogIC8vLyBIYW5kbGUgcmVjb3ZlcnkgYXNzb2NpYXRlZCB3aXRoIGFuIGltcG9ydCBkaXJlY3RpdmUuCiAgLy8vIFRoaXMgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBhZnRlciBbZW5kSW1wb3J0XQogIC8vLyB0byByZWNvdmVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcmV2aW91cyBpbXBvcnQgZGlyZWN0aXZlLgogIC8vLyBUaGUgc3Vic3RydWN0dXJlcyBhcmUgYSBzdWJzZXQgb2YgYW5kIGluIHRoZSBzYW1lIG9yZGVyIGFzIFtlbmRJbXBvcnRdOgogIC8vLyAtIGNvbmRpdGlvbmFsIHVyaXMKICAvLy8gLSBwcmVmaXggaWRlbnRpZmllcgogIC8vLyAtIGNvbWJpbmF0b3JzCiAgdm9pZCBoYW5kbGVSZWNvdmVySW1wb3J0KFRva2VuIHNlbWljb2xvbikgewogICAgbG9nRXZlbnQoIkltcG9ydFJlY292ZXJ5Iik7CiAgfQoKICB2b2lkIGJlZ2luQ29uZGl0aW9uYWxVcmlzKFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZENvbmRpdGlvbmFsVXJpcyhpbnQgY291bnQpIHsKICAgIGxvZ0V2ZW50KCJDb25kaXRpb25hbFVyaXMiKTsKICB9CgogIHZvaWQgYmVnaW5Db25kaXRpb25hbFVyaShUb2tlbiBpZktleXdvcmQpIHt9CgogIC8vLyBIYW5kbGUgdGhlIGVuZCBvZiBhIGNvbmRpdGlvbmFsIFVSSSBjb25zdHJ1Y3QuICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIERvdHRlZCBuYW1lCiAgLy8vIC0gQ29uZGl0aW9uIChsaXRlcmFsIHN0cmluZzsgb25seSBpZiBbZXF1YWxTaWduXSAhPSBudWxsKQogIC8vLyAtIFVSSSAobGl0ZXJhbCBzdHJpbmcpCiAgdm9pZCBlbmRDb25kaXRpb25hbFVyaShUb2tlbiBpZktleXdvcmQsIFRva2VuIGxlZnRQYXJlbiwgVG9rZW4gZXF1YWxTaWduKSB7CiAgICBsb2dFdmVudCgiQ29uZGl0aW9uYWxVcmkiKTsKICB9CgogIHZvaWQgaGFuZGxlRG90dGVkTmFtZShpbnQgY291bnQsIFRva2VuIGZpcnN0SWRlbnRpZmllcikgewogICAgbG9nRXZlbnQoIkRvdHRlZE5hbWUiKTsKICB9CgogIHZvaWQgYmVnaW5JbXBsaWNpdENyZWF0aW9uRXhwcmVzc2lvbihUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRJbXBsaWNpdENyZWF0aW9uRXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkltcGxpY2l0Q3JlYXRpb25FeHByZXNzaW9uIik7CiAgfQoKICB2b2lkIGJlZ2luSW5pdGlhbGl6ZWRJZGVudGlmaWVyKFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZEluaXRpYWxpemVkSWRlbnRpZmllcihUb2tlbiBuYW1lVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJJbml0aWFsaXplZElkZW50aWZpZXIiKTsKICB9CgogIHZvaWQgYmVnaW5GaWVsZEluaXRpYWxpemVyKFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBmaWVsZCBpbml0aWFsaXplci4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gSW5pdGlhbGl6ZXIgZXhwcmVzc2lvbgogIHZvaWQgZW5kRmllbGRJbml0aWFsaXplcihUb2tlbiBhc3NpZ25tZW50LCBUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkZpZWxkSW5pdGlhbGl6ZXIiKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIGxhY2sgb2YgYSBmaWVsZCBpbml0aWFsaXplci4KICB2b2lkIGhhbmRsZU5vRmllbGRJbml0aWFsaXplcihUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIk5vRmllbGRJbml0aWFsaXplciIpOwogIH0KCiAgdm9pZCBiZWdpblZhcmlhYmxlSW5pdGlhbGl6ZXIoVG9rZW4gdG9rZW4pIHt9CgogIC8vLyBIYW5kbGUgdGhlIGVuZCBvZiBhIHZhcmlhYmxlIGluaXRpYWxpemVyLiBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIEluaXRpYWxpemVyIGV4cHJlc3Npb24uCiAgdm9pZCBlbmRWYXJpYWJsZUluaXRpYWxpemVyKFRva2VuIGFzc2lnbm1lbnRPcGVyYXRvcikgewogICAgbG9nRXZlbnQoIlZhcmlhYmxlSW5pdGlhbGl6ZXIiKTsKICB9CgogIC8vLyBVc2VkIHdoZW4gYSB2YXJpYWJsZSBoYXMgbm8gaW5pdGlhbGl6ZXIuCiAgdm9pZCBoYW5kbGVOb1ZhcmlhYmxlSW5pdGlhbGl6ZXIoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJOb1ZhcmlhYmxlSW5pdGlhbGl6ZXIiKTsKICB9CgogIHZvaWQgYmVnaW5Jbml0aWFsaXplcihUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRJbml0aWFsaXplcihUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkNvbnN0cnVjdG9ySW5pdGlhbGl6ZXIiKTsKICB9CgogIHZvaWQgYmVnaW5Jbml0aWFsaXplcnMoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kSW5pdGlhbGl6ZXJzKGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJJbml0aWFsaXplcnMiKTsKICB9CgogIHZvaWQgaGFuZGxlTm9Jbml0aWFsaXplcnMoKSB7CiAgICBsb2dFdmVudCgiTm9Jbml0aWFsaXplcnMiKTsKICB9CgogIC8vLyBDYWxsZWQgYWZ0ZXIgdGhlIGxpc3RlbmVyIGhhcyByZWNvdmVyZWQgZnJvbSBhbiBpbnZhbGlkIGV4cHJlc3Npb24uIFRoZQogIC8vLyBwYXJzZXIgd2lsbCByZXN1bWUgcGFyc2luZyBmcm9tIFt0b2tlbl0uIEV4YWN0bHkgd2hlcmUgdGhlIHBhcnNlciB3aWxsCiAgLy8vIHJlc3VtZSBwYXJzaW5nIGlzIHVuc3BlY2lmaWVkLgogIHZvaWQgaGFuZGxlSW52YWxpZEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJJbnZhbGlkRXhwcmVzc2lvbiIpOwogIH0KCiAgLy8vIENhbGxlZCBhZnRlciB0aGUgbGlzdGVuZXIgaGFzIHJlY292ZXJlZCBmcm9tIGFuIGludmFsaWQgZnVuY3Rpb24KICAvLy8gYm9keS4gVGhlIHBhcnNlciBleHBlY3RlZCBhbiBvcGVuIGN1cmx5IGJyYWNlIGB7YCBhbmQgd2lsbCByZXN1bWUgcGFyc2luZwogIC8vLyBmcm9tIFt0b2tlbl0gYXMgaWYgYSBmdW5jdGlvbiBib2R5IGhhZCBwcmVjZWVkZWQgaXQuCiAgdm9pZCBoYW5kbGVJbnZhbGlkRnVuY3Rpb25Cb2R5KFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiSW52YWxpZEZ1bmN0aW9uQm9keSIpOwogIH0KCiAgLy8vIENhbGxlZCBhZnRlciB0aGUgbGlzdGVuZXIgaGFzIHJlY292ZXJlZCBmcm9tIGFuIGludmFsaWQgdHlwZS4gVGhlIHBhcnNlcgogIC8vLyBleHBlY3RlZCBhbiBpZGVudGlmaWVyLCBhbmQgd2lsbCByZXN1bWUgcGFyc2luZyB0eXBlIGFyZ3VtZW50cyBmcm9tCiAgLy8vIFt0b2tlbl0uCiAgdm9pZCBoYW5kbGVJbnZhbGlkVHlwZVJlZmVyZW5jZShUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkludmFsaWRUeXBlUmVmZXJlbmNlIik7CiAgfQoKICB2b2lkIGhhbmRsZUxhYmVsKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiTGFiZWwiKTsKICB9CgogIHZvaWQgYmVnaW5MYWJlbGVkU3RhdGVtZW50KFRva2VuIHRva2VuLCBpbnQgbGFiZWxDb3VudCkge30KCiAgdm9pZCBlbmRMYWJlbGVkU3RhdGVtZW50KGludCBsYWJlbENvdW50KSB7CiAgICBsb2dFdmVudCgiTGFiZWxlZFN0YXRlbWVudCIpOwogIH0KCiAgdm9pZCBiZWdpbkxpYnJhcnlOYW1lKFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBsaWJyYXJ5IGRpcmVjdGl2ZS4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gTWV0YWRhdGEKICAvLy8gLSBMaWJyYXJ5IG5hbWUgKGEgcXVhbGlmaWVkIGlkZW50aWZpZXIpCiAgdm9pZCBlbmRMaWJyYXJ5TmFtZShUb2tlbiBsaWJyYXJ5S2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBsb2dFdmVudCgiTGlicmFyeU5hbWUiKTsKICB9CgogIHZvaWQgaGFuZGxlTGl0ZXJhbE1hcEVudHJ5KFRva2VuIGNvbG9uLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkxpdGVyYWxNYXBFbnRyeSIpOwogIH0KCiAgdm9pZCBiZWdpbkxpdGVyYWxTdHJpbmcoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgaGFuZGxlSW50ZXJwb2xhdGlvbkV4cHJlc3Npb24oVG9rZW4gbGVmdEJyYWNrZXQsIFRva2VuIHJpZ2h0QnJhY2tldCkge30KCiAgdm9pZCBlbmRMaXRlcmFsU3RyaW5nKGludCBpbnRlcnBvbGF0aW9uQ291bnQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiTGl0ZXJhbFN0cmluZyIpOwogIH0KCiAgdm9pZCBoYW5kbGVTdHJpbmdKdXh0YXBvc2l0aW9uKGludCBsaXRlcmFsQ291bnQpIHsKICAgIGxvZ0V2ZW50KCJTdHJpbmdKdXh0YXBvc2l0aW9uIik7CiAgfQoKICB2b2lkIGJlZ2luTWVtYmVyKCkge30KCiAgLy8vIEhhbmRsZSBhbiBpbnZhbGlkIG1lbWJlciBkZWNsYXJhdGlvbi4gU3Vic3RydWN0dXJlczoKICAvLy8gLSBtZXRhZGF0YQogIHZvaWQgaGFuZGxlSW52YWxpZE1lbWJlcihUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkludmFsaWRNZW1iZXIiKTsKICB9CgogIC8vLyBUaGlzIGV2ZW50IGlzIGFkZGVkIGZvciBjb252ZW5pZW5jZS4gTm9ybWFsbHksIG9uZSBzaG91bGQgb3ZlcnJpZGUKICAvLy8gW2VuZE1ldGhvZF0gb3IgW2VuZEZpZWxkc10gaW5zdGVhZC4KICB2b2lkIGVuZE1lbWJlcigpIHsKICAgIGxvZ0V2ZW50KCJNZW1iZXIiKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIGJlZ2lubmluZyBvZiBhIG1ldGhvZCBkZWNsYXJhdGlvbi4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gbWV0YWRhdGEKICB2b2lkIGJlZ2luTWV0aG9kKFRva2VuIGV4dGVybmFsVG9rZW4sIFRva2VuIHN0YXRpY1Rva2VuLCBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwKICAgICAgVG9rZW4gdmFyRmluYWxPckNvbnN0LCBUb2tlbiBnZXRPclNldCwgVG9rZW4gbmFtZSkge30KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGEgbWV0aG9kIGRlY2xhcmF0aW9uLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBtZXRhZGF0YQogIC8vLyAtIHJldHVybiB0eXBlCiAgLy8vIC0gbWV0aG9kIG5hbWUgKGlkZW50aWZpZXIsIHBvc3NpYmx5IHF1YWxpZmllZCkKICAvLy8gLSB0eXBlIHZhcmlhYmxlcwogIC8vLyAtIGZvcm1hbCBwYXJhbWV0ZXJzCiAgLy8vIC0gaW5pdGlhbGl6ZXJzCiAgLy8vIC0gYXN5bmMgbWFya2VyCiAgLy8vIC0gYm9keQogIHZvaWQgZW5kTWV0aG9kKAogICAgICBUb2tlbiBnZXRPclNldCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gYmVnaW5QYXJhbSwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJNZXRob2QiKTsKICB9CgogIHZvaWQgYmVnaW5NZXRhZGF0YVN0YXIoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kTWV0YWRhdGFTdGFyKGludCBjb3VudCkgewogICAgbG9nRXZlbnQoIk1ldGFkYXRhU3RhciIpOwogIH0KCiAgdm9pZCBiZWdpbk1ldGFkYXRhKFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBtZXRhZGF0YSBhbm5vdGF0aW9uLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBJZGVudGlmaWVyCiAgLy8vIC0gVHlwZSBhcmd1bWVudHMKICAvLy8gLSBDb25zdHJ1Y3RvciBuYW1lIChvbmx5IGlmIFtwZXJpb2RCZWZvcmVOYW1lXSBpcyBub3QgYG51bGxgKQogIC8vLyAtIEFyZ3VtZW50cwogIHZvaWQgZW5kTWV0YWRhdGEoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gcGVyaW9kQmVmb3JlTmFtZSwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJNZXRhZGF0YSIpOwogIH0KCiAgdm9pZCBiZWdpbk9wdGlvbmFsRm9ybWFsUGFyYW1ldGVycyhUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRPcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMoCiAgICAgIGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJPcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMiKTsKICB9CgogIHZvaWQgYmVnaW5QYXJ0KFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBwYXJ0IGRpcmVjdGl2ZS4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gbWV0YWRhdGEKICAvLy8gLSB1cmkKICB2b2lkIGVuZFBhcnQoVG9rZW4gcGFydEtleXdvcmQsIFRva2VuIHNlbWljb2xvbikgewogICAgbG9nRXZlbnQoIlBhcnQiKTsKICB9CgogIHZvaWQgYmVnaW5QYXJ0T2YoVG9rZW4gdG9rZW4pIHt9CgogIC8vLyBIYW5kbGUgdGhlIGVuZCBvZiBhICJwYXJ0IG9mIiBkaXJlY3RpdmUuICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIE1ldGFkYXRhCiAgLy8vIC0gTGlicmFyeSBuYW1lIChhIHF1YWxpZmllZCBpZGVudGlmaWVyKQogIC8vLwogIC8vLyBJZiBbaGFzTmFtZV0gaXMgdHJ1ZSwgdGhpcyBwYXJ0IHJlZmVycyB0byBpdHMgbGlicmFyeSBieSBuYW1lLCBvdGhlcndpc2UsCiAgLy8vIGJ5IFVSSS4KICB2b2lkIGVuZFBhcnRPZigKICAgICAgVG9rZW4gcGFydEtleXdvcmQsIFRva2VuIG9mS2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uLCBib29sIGhhc05hbWUpIHsKICAgIGxvZ0V2ZW50KCJQYXJ0T2YiKTsKICB9CgogIHZvaWQgYmVnaW5SZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5Iik7CiAgfQoKICB2b2lkIGJlZ2luUmV0dXJuU3RhdGVtZW50KFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBgbmF0aXZlYCBmdW5jdGlvbi4KICAvLy8gVGhlIFtoYW5kbGVOYXRpdmVDbGF1c2VdIGV2ZW50IGlzIHNlbnQgcHJpb3IgdG8gdGhpcyBldmVudC4KICB2b2lkIGhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keShUb2tlbiBuYXRpdmVUb2tlbiwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBsb2dFdmVudCgiTmF0aXZlRnVuY3Rpb25Cb2R5Iik7CiAgfQoKICAvLy8gQ2FsbGVkIGFmdGVyIHRoZSBbaGFuZGxlTmF0aXZlQ2xhdXNlXSBldmVudCB3aGVuIHRoZSBwYXJzZXIgZGV0ZXJtaW5lcwogIC8vLyB0aGF0IHRoZSBuYXRpdmUgY2xhdXNlIHNob3VsZCBiZSBkaXNjYXJkZWQgLyBpZ25vcmVkLgogIC8vLyBGb3IgZXhhbXBsZSwgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGEgbmF0aXZlIGNsYXVzZSBpcyBmb2xsb3dlZCBieQogIC8vLyBhIGZ1bmN0aW9uIGJvZHkuCiAgdm9pZCBoYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHlJZ25vcmVkKFRva2VuIG5hdGl2ZVRva2VuLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGxvZ0V2ZW50KCJOYXRpdmVGdW5jdGlvbkJvZHlJZ25vcmVkIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBgbmF0aXZlYCBmdW5jdGlvbiB0aGF0IHdhcyBza2lwcGVkIGJ5IHRoZSBwYXJzZXIuCiAgLy8vIFRoZSBbaGFuZGxlTmF0aXZlQ2xhdXNlXSBldmVudCBpcyBzZW50IHByaW9yIHRvIHRoaXMgZXZlbnQuCiAgdm9pZCBoYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHlTa2lwcGVkKFRva2VuIG5hdGl2ZVRva2VuLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGxvZ0V2ZW50KCJOYXRpdmVGdW5jdGlvbkJvZHlTa2lwcGVkIik7CiAgfQoKICAvLy8gVGhpcyBtZXRob2QgaXMgaW52b2tlZCB3aGVuIGEgZnVuY3Rpb24gaGFzIHRoZSBlbXB0eSBib2R5LgogIHZvaWQgaGFuZGxlRW1wdHlGdW5jdGlvbkJvZHkoVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBsb2dFdmVudCgiRW1wdHlGdW5jdGlvbkJvZHkiKTsKICB9CgogIC8vLyBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIHdoZW4gcGFyc2VyIGZpbmlzaGVzIHBhcnNpbmcgdGhlIGNvcnJlc3BvbmRpbmcKICAvLy8gZXhwcmVzc2lvbiBvZiB0aGUgZXhwcmVzc2lvbiBmdW5jdGlvbiBib2R5LgogIHZvaWQgaGFuZGxlRXhwcmVzc2lvbkZ1bmN0aW9uQm9keShUb2tlbiBhcnJvd1Rva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkV4cHJlc3Npb25GdW5jdGlvbkJvZHkiKTsKICB9CgogIHZvaWQgZW5kUmV0dXJuU3RhdGVtZW50KAogICAgICBib29sIGhhc0V4cHJlc3Npb24sIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiUmV0dXJuU3RhdGVtZW50Iik7CiAgfQoKICB2b2lkIGhhbmRsZVNlbmQoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJTZW5kIik7CiAgfQoKICB2b2lkIGJlZ2luU2hvdyhUb2tlbiBzaG93S2V5d29yZCkge30KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGEgInNob3ciIGNvbWJpbmF0b3IuICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIHNob3duIG5hbWVzIChJZGVudGlmaWVyTGlzdCkKICB2b2lkIGVuZFNob3coVG9rZW4gc2hvd0tleXdvcmQpIHsKICAgIGxvZ0V2ZW50KCJTaG93Iik7CiAgfQoKICB2b2lkIGJlZ2luU3dpdGNoU3RhdGVtZW50KFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZFN3aXRjaFN0YXRlbWVudChUb2tlbiBzd2l0Y2hLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIlN3aXRjaFN0YXRlbWVudCIpOwogIH0KCiAgdm9pZCBiZWdpblN3aXRjaEJsb2NrKFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZFN3aXRjaEJsb2NrKGludCBjYXNlQ291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiU3dpdGNoQmxvY2siKTsKICB9CgogIHZvaWQgYmVnaW5MaXRlcmFsU3ltYm9sKFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZExpdGVyYWxTeW1ib2woVG9rZW4gaGFzaFRva2VuLCBpbnQgaWRlbnRpZmllckNvdW50KSB7CiAgICBsb2dFdmVudCgiTGl0ZXJhbFN5bWJvbCIpOwogIH0KCiAgdm9pZCBoYW5kbGVUaHJvd0V4cHJlc3Npb24oVG9rZW4gdGhyb3dUb2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJUaHJvd0V4cHJlc3Npb24iKTsKICB9CgogIHZvaWQgYmVnaW5SZXRocm93U3RhdGVtZW50KFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZFJldGhyb3dTdGF0ZW1lbnQoVG9rZW4gcmV0aHJvd1Rva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIlJldGhyb3dTdGF0ZW1lbnQiKTsKICB9CgogIC8vLyBUaGlzIGV2ZW50IGlzIGFkZGVkIGZvciBjb252ZW5pZW5jZS4gTm9ybWFsbHksIG9uZSBzaG91bGQgdXNlCiAgLy8vIFtlbmRDbGFzc0RlY2xhcmF0aW9uXSwgW2VuZE5hbWVkTWl4aW5BcHBsaWNhdGlvbl0sIFtlbmRFbnVtXSwKICAvLy8gW2VuZEZ1bmN0aW9uVHlwZUFsaWFzXSwgW2VuZExpYnJhcnlOYW1lXSwgW2VuZEltcG9ydF0sIFtlbmRFeHBvcnRdLAogIC8vLyBbZW5kUGFydF0sIFtlbmRQYXJ0T2ZdLCBbZW5kVG9wTGV2ZWxGaWVsZHNdLCBvciBbZW5kVG9wTGV2ZWxNZXRob2RdLgogIHZvaWQgZW5kVG9wTGV2ZWxEZWNsYXJhdGlvbihUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIlRvcExldmVsRGVjbGFyYXRpb24iKTsKICB9CgogIC8vLyBDYWxsZWQgYnkgdGhlIFtQYXJzZXJdIHdoZW4gaXQgcmVjb3ZlcnMgZnJvbSBhbiBpbnZhbGlkIHRvcCBsZXZlbAogIC8vLyBkZWNsYXJhdGlvbiwgd2hlcmUgW2VuZFRva2VuXSBpcyB0aGUgbGFzdCB0b2tlbiBpbiB0aGUgZGVjbGFyYXRpb24KICAvLy8gVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGJlZ2luL2VuZCBtZXRhZGF0YSBzdGFyIGV2ZW50cywKICAvLy8gYW5kIGlzIGZvbGxvd2VkIGJ5IFtlbmRUb3BMZXZlbERlY2xhcmF0aW9uXS4KICAvLy8KICAvLy8gU3Vic3RydWN0dXJlczoKICAvLy8gLSBtZXRhZGF0YQogIHZvaWQgaGFuZGxlSW52YWxpZFRvcExldmVsRGVjbGFyYXRpb24oVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJJbnZhbGlkVG9wTGV2ZWxEZWNsYXJhdGlvbiIpOwogIH0KCiAgLy8vIE1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgYSB0b3AgbGV2ZWwgZmllbGQgb3IgbWV0aG9kIGRlY2xhcmF0aW9uLgogIC8vLyBEb2Vzbid0IGhhdmUgYSBjb3JyZXNwb25kaW5nIGVuZCBldmVudC4KICAvLy8gU2VlIFtlbmRUb3BMZXZlbEZpZWxkc10gYW5kIFtlbmRUb3BMZXZlbE1ldGhvZF0uCiAgdm9pZCBiZWdpblRvcExldmVsTWVtYmVyKFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSB0b3AgbGV2ZWwgdmFyaWFibGUgZGVjbGFyYXRpb24uICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIE1ldGFkYXRhCiAgLy8vIC0gVHlwZQogIC8vLyAtIFJlcGVhdGVkIFtjb3VudF0gdGltZXM6CiAgLy8vICAgLSBWYXJpYWJsZSBuYW1lIChpZGVudGlmaWVyKQogIC8vLyAgIC0gRmllbGQgaW5pdGlhbGl6ZXIKICAvLy8gRG9lc24ndCBoYXZlIGEgY29ycmVzcG9uZGluZyBiZWdpbiBldmVudC4KICAvLy8gVXNlIFtiZWdpblRvcExldmVsTWVtYmVyXSBpbnN0ZWFkLgogIHZvaWQgZW5kVG9wTGV2ZWxGaWVsZHMoVG9rZW4gc3RhdGljVG9rZW4sIFRva2VuIGNvdmFyaWFudFRva2VuLAogICAgICBUb2tlbiB2YXJGaW5hbE9yQ29uc3QsIGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJUb3BMZXZlbEZpZWxkcyIpOwogIH0KCiAgdm9pZCBiZWdpblRvcExldmVsTWV0aG9kKFRva2VuIGxhc3RDb25zdW1lZCwgVG9rZW4gZXh0ZXJuYWxUb2tlbikge30KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGEgdG9wIGxldmVsIG1ldGhvZC4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gbWV0YWRhdGEKICAvLy8gLSBtb2RpZmllcnMKICAvLy8gLSByZXR1cm4gdHlwZQogIC8vLyAtIGlkZW50aWZpZXIKICAvLy8gLSB0eXBlIHZhcmlhYmxlcwogIC8vLyAtIGZvcm1hbCBwYXJhbWV0ZXJzCiAgLy8vIC0gYXN5bmMgbWFya2VyCiAgLy8vIC0gYm9keQogIHZvaWQgZW5kVG9wTGV2ZWxNZXRob2QoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZ2V0T3JTZXQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiVG9wTGV2ZWxNZXRob2QiKTsKICB9CgogIHZvaWQgYmVnaW5UcnlTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgaGFuZGxlQ2FzZU1hdGNoKFRva2VuIGNhc2VLZXl3b3JkLCBUb2tlbiBjb2xvbikgewogICAgbG9nRXZlbnQoIkNhc2VNYXRjaCIpOwogIH0KCiAgdm9pZCBiZWdpbkNhdGNoQ2xhdXNlKFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZENhdGNoQ2xhdXNlKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiQ2F0Y2hDbGF1c2UiKTsKICB9CgogIHZvaWQgaGFuZGxlQ2F0Y2hCbG9jayhUb2tlbiBvbktleXdvcmQsIFRva2VuIGNhdGNoS2V5d29yZCwgVG9rZW4gY29tbWEpIHsKICAgIGxvZ0V2ZW50KCJDYXRjaEJsb2NrIik7CiAgfQoKICB2b2lkIGhhbmRsZUZpbmFsbHlCbG9jayhUb2tlbiBmaW5hbGx5S2V5d29yZCkgewogICAgbG9nRXZlbnQoIkZpbmFsbHlCbG9jayIpOwogIH0KCiAgdm9pZCBlbmRUcnlTdGF0ZW1lbnQoaW50IGNhdGNoQ291bnQsIFRva2VuIHRyeUtleXdvcmQsIFRva2VuIGZpbmFsbHlLZXl3b3JkKSB7CiAgICBsb2dFdmVudCgiVHJ5U3RhdGVtZW50Iik7CiAgfQoKICB2b2lkIGhhbmRsZVR5cGUoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gcXVlc3Rpb25NYXJrKSB7CiAgICBsb2dFdmVudCgiVHlwZSIpOwogIH0KCiAgLy8vIENhbGxlZCB3aGVuIHBhcnNlciBlbmNvdW50ZXJzIGEgJyEnCiAgLy8vIHVzZWQgYXMgYSBub24tbnVsbCBwb3N0Zml4IGFzc2VydGlvbiBpbiBhbiBleHByZXNzaW9uLgogIHZvaWQgaGFuZGxlTm9uTnVsbEFzc2VydEV4cHJlc3Npb24oVG9rZW4gYmFuZykgewogICAgbG9nRXZlbnQoIk5vbk51bGxBc3NlcnRFeHByZXNzaW9uIik7CiAgfQoKICAvLyBUT0RPKGRhbnJ1YmVsKTogUmVtb3ZlIHRoaXMgb25jZSBhbGwgbGlzdGVuZXJzIGhhdmUgYmVlbiB1cGRhdGVkCiAgLy8gdG8gcHJvcGVybHkgaGFuZGxlIG51bGxhYmxlIHR5cGVzCiAgdm9pZCByZXBvcnRFcnJvcklmTnVsbGFibGVUeXBlKFRva2VuIHF1ZXN0aW9uTWFyaykgewogICAgaWYgKHF1ZXN0aW9uTWFyayAhPSBudWxsKSB7CiAgICAgIGFzc2VydChvcHRpb25hbCgnPycsIHF1ZXN0aW9uTWFyaykpOwogICAgICBoYW5kbGVSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgdGVtcGxhdGVFeHBlcmltZW50Tm90RW5hYmxlZC53aXRoQXJndW1lbnRzKCdub24tbnVsbGFibGUnKSwKICAgICAgICAgIHF1ZXN0aW9uTWFyaywKICAgICAgICAgIHF1ZXN0aW9uTWFyayk7CiAgICB9CiAgfQoKICAvLyBUT0RPKGRhbnJ1YmVsKTogUmVtb3ZlIHRoaXMgb25jZSBhbGwgbGlzdGVuZXJzIGhhdmUgYmVlbiB1cGRhdGVkCiAgLy8gdG8gcHJvcGVybHkgaGFuZGxlIG5vbi1udWxsIGFzc2VydCBleHByZXNzaW9ucwogIHZvaWQgcmVwb3J0Tm9uTnVsbEFzc2VydEV4cHJlc3Npb25Ob3RFbmFibGVkKFRva2VuIGJhbmcpIHsKICAgIGhhbmRsZVJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgdGVtcGxhdGVFeHBlcmltZW50Tm90RW5hYmxlZC53aXRoQXJndW1lbnRzKCdub24tbnVsbGFibGUnKSwgYmFuZywgYmFuZyk7CiAgfQoKICB2b2lkIGhhbmRsZU5vTmFtZShUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIk5vTmFtZSIpOwogIH0KCiAgdm9pZCBiZWdpbkZ1bmN0aW9uVHlwZShUb2tlbiBiZWdpblRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBnZW5lcmljIGZ1bmN0aW9uIHR5cGUgZGVjbGFyYXRpb24uCiAgLy8vCiAgLy8vIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gVHlwZSB2YXJpYWJsZXMKICAvLy8gLSBSZXR1cm4gdHlwZQogIC8vLyAtIEZvcm1hbCBwYXJhbWV0ZXJzCiAgdm9pZCBlbmRGdW5jdGlvblR5cGUoVG9rZW4gZnVuY3Rpb25Ub2tlbiwgVG9rZW4gcXVlc3Rpb25NYXJrKSB7CiAgICBsb2dFdmVudCgiRnVuY3Rpb25UeXBlIik7CiAgfQoKICB2b2lkIGJlZ2luVHlwZUFyZ3VtZW50cyhUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRUeXBlQXJndW1lbnRzKGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJUeXBlQXJndW1lbnRzIik7CiAgfQoKICAvLy8gQWZ0ZXIgZW5kVHlwZUFyZ3VtZW50cyBoYXMgYmVlbiBjYWxsZWQsCiAgLy8vIHRoaXMgZXZlbnQgaXMgY2FsbGVkIGlmIHRob3NlIHR5cGUgYXJndW1lbnRzIGFyZSBpbnZhbGlkLgogIHZvaWQgaGFuZGxlSW52YWxpZFR5cGVBcmd1bWVudHMoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJOb1R5cGVBcmd1bWVudHMiKTsKICB9CgogIHZvaWQgaGFuZGxlTm9UeXBlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiTm9UeXBlQXJndW1lbnRzIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBiZWdpbiBvZiBhIHR5cGUgZm9ybWFsIHBhcmFtZXRlciAoZS5nLiAiWCBleHRlbmRzIFkiKS4KICAvLy8gU3Vic3RydWN0dXJlczoKICAvLy8gLSBNZXRhZGF0YQogIC8vLyAtIE5hbWUgKGlkZW50aWZpZXIpCiAgdm9pZCBiZWdpblR5cGVWYXJpYWJsZShUb2tlbiB0b2tlbikge30KCiAgLy8vIENhbGxlZCB3aGVuIFtiZWdpblR5cGVWYXJpYWJsZV0gaGFzIGJlZW4gY2FsbGVkIGZvciBhbGwgb2YgdGhlIHZhcmlhYmxlcwogIC8vLyBpbiBhIGdyb3VwLCBhbmQgYmVmb3JlIFtlbmRUeXBlVmFyaWFibGVdIGhhcyBiZWVuIGNhbGxlZCBmb3IgYW55IG9mIHRoZQogIC8vLyB2YXJpYWJsZXMgaW4gdGhhdCBzYW1lIGdyb3VwLgogIHZvaWQgaGFuZGxlVHlwZVZhcmlhYmxlc0RlZmluZWQoVG9rZW4gdG9rZW4sIGludCBjb3VudCkge30KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGEgdHlwZSBmb3JtYWwgcGFyYW1ldGVyIChlLmcuICJYIGV4dGVuZHMgWSIpCiAgLy8vIHdoZXJlIFtpbmRleF0gaXMgdGhlIGluZGV4IG9mIHRoZSB0eXBlIHZhcmlhYmxlIGluIHRoZSBsaXN0IG9mCiAgLy8vIHR5cGUgdmFyaWFibGVzIGJlaW5nIGRlY2xhcmVkLgogIC8vLwogIC8vLyBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIFR5cGUgYm91bmQKICAvLy8KICAvLy8gU2VlIFtiZWdpblR5cGVWYXJpYWJsZV0gZm9yIGFkZGl0aW9uYWwgc3Vic3RydWN0dXJlcy4KICB2b2lkIGVuZFR5cGVWYXJpYWJsZShUb2tlbiB0b2tlbiwgaW50IGluZGV4LCBUb2tlbiBleHRlbmRzT3JTdXBlcikgewogICAgbG9nRXZlbnQoIlR5cGVWYXJpYWJsZSIpOwogIH0KCiAgdm9pZCBiZWdpblR5cGVWYXJpYWJsZXMoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kVHlwZVZhcmlhYmxlcyhUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIlR5cGVWYXJpYWJsZXMiKTsKICB9CgogIHZvaWQgYmVnaW5GdW5jdGlvbkV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHt9CgogIC8vLyBIYW5kbGUgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uIGV4cHJlc3Npb24gKGUuZy4gIigpIHsgLi4uIH0iKS4KICAvLy8gU3Vic3RydWN0dXJlczoKICAvLy8gLSBUeXBlIHZhcmlhYmxlcwogIC8vLyAtIEZvcm1hbCBwYXJhbWV0ZXJzCiAgLy8vIC0gQXN5bmMgbWFya2VyCiAgLy8vIC0gQm9keQogIHZvaWQgZW5kRnVuY3Rpb25FeHByZXNzaW9uKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiRnVuY3Rpb25FeHByZXNzaW9uIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBzdGFydCBvZiBhIHZhcmlhYmxlcyBkZWNsYXJhdGlvbi4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gTWV0YWRhdGEKICAvLy8gLSBUeXBlCiAgdm9pZCBiZWdpblZhcmlhYmxlc0RlY2xhcmF0aW9uKFRva2VuIHRva2VuLCBUb2tlbiB2YXJGaW5hbE9yQ29uc3QpIHt9CgogIHZvaWQgZW5kVmFyaWFibGVzRGVjbGFyYXRpb24oaW50IGNvdW50LCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIlZhcmlhYmxlc0RlY2xhcmF0aW9uIik7CiAgfQoKICB2b2lkIGJlZ2luV2hpbGVTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kV2hpbGVTdGF0ZW1lbnQoVG9rZW4gd2hpbGVLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIldoaWxlU3RhdGVtZW50Iik7CiAgfQoKICB2b2lkIGhhbmRsZUFzT3BlcmF0b3IoVG9rZW4gb3BlcmF0b3IpIHsKICAgIGxvZ0V2ZW50KCJBc09wZXJhdG9yIik7CiAgfQoKICB2b2lkIGhhbmRsZUFzc2lnbm1lbnRFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiQXNzaWdubWVudEV4cHJlc3Npb24iKTsKICB9CgogIC8vLyBDYWxsZWQgd2hlbiB0aGUgcGFyc2VyIGVuY291bnRlcnMgYSBiaW5hcnkgb3BlcmF0b3IsIGluIGJldHdlZW4gdGhlIExIUwogIC8vLyBhbmQgUkhTIHN1YmV4cHJlc3Npb25zLgogIC8vLwogIC8vLyBOb3QgY2FsbGVkIHdoZW4gdGhlIGJpbmFyeSBvcGVyYXRvciBpcyBgLmAsIGA/LmAsIG9yIGAuLmAuCiAgdm9pZCBiZWdpbkJpbmFyeUV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kQmluYXJ5RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkJpbmFyeUV4cHJlc3Npb24iKTsKICB9CgogIC8vLyBDYWxsZWQgd2hlbiB0aGUgcGFyc2VyIGVuY291bnRlcnMgYSBgP2Agb3BlcmF0b3IgYW5kIGJlZ2lucyBwYXJzaW5nIGEKICAvLy8gY29uZGl0aW9uYWwgZXhwcmVzc2lvbi4KICB2b2lkIGJlZ2luQ29uZGl0aW9uYWxFeHByZXNzaW9uKFRva2VuIHF1ZXN0aW9uKSB7fQoKICAvLy8gQ2FsbGVkIHdoZW4gdGhlIHBhcnNlciBlbmNvdW50ZXJzIGEgYDpgIG9wZXJhdG9yIGluIGEgY29uZGl0aW9uYWwKICAvLy8gZXhwcmVzc2lvbi4KICB2b2lkIGhhbmRsZUNvbmRpdGlvbmFsRXhwcmVzc2lvbkNvbG9uKCkge30KCiAgLy8vIENhbGxlZCB3aGVuIHRoZSBwYXJzZXIgZmluaXNoZXMgcHJvY2Vzc2luZyBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCiAgdm9pZCBlbmRDb25kaXRpb25hbEV4cHJlc3Npb24oVG9rZW4gcXVlc3Rpb24sIFRva2VuIGNvbG9uKSB7CiAgICBsb2dFdmVudCgiQ29uZGl0aW9uYWxFeHByZXNzaW9uIik7CiAgfQoKICB2b2lkIGJlZ2luQ29uc3RFeHByZXNzaW9uKFRva2VuIGNvbnN0S2V5d29yZCkge30KCiAgdm9pZCBlbmRDb25zdEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJDb25zdEV4cHJlc3Npb24iKTsKICB9CgogIC8vLyBDYWxsZWQgYmVmb3JlIHBhcnNpbmcgYSAiZm9yIiBjb250cm9sIGZsb3cgbGlzdCwgc2V0LCBvciBtYXAgZW50cnkuCiAgdm9pZCBiZWdpbkZvckNvbnRyb2xGbG93KFRva2VuIGF3YWl0VG9rZW4sIFRva2VuIGZvclRva2VuKSB7fQoKICAvLy8gQ2FsbGVkIGFmdGVyIHBhcnNpbmcgYSAiZm9yIiBjb250cm9sIGZsb3cgbGlzdCwgc2V0LCBvciBtYXAgZW50cnkuCiAgdm9pZCBlbmRGb3JDb250cm9sRmxvdyhUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoJ2VuZEZvckNvbnRyb2xGbG93Jyk7CiAgfQoKICAvLy8gQ2FsbGVkIGFmdGVyIHBhcnNpbmcgYSAiZm9yLWluIiBjb250cm9sIGZsb3cgbGlzdCwgc2V0LCBvciBtYXAgZW50cnkuCiAgdm9pZCBlbmRGb3JJbkNvbnRyb2xGbG93KFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgnZW5kRm9ySW5Db250cm9sRmxvdycpOwogIH0KCiAgLy8vIENhbGxlZCBiZWZvcmUgcGFyc2luZyBhbiBgaWZgIGNvbnRyb2wgZmxvdyBsaXN0LCBzZXQsIG9yIG1hcCBlbnRyeS4KICB2b2lkIGJlZ2luSWZDb250cm9sRmxvdyhUb2tlbiBpZlRva2VuKSB7fQoKICAvLy8gQ2FsbGVkIGJlZm9yZSBwYXJzaW5nIHRoZSBgdGhlbmAgcG9ydGlvbiBvZiBhbiBgaWZgIGNvbnRyb2wgZmxvdyBsaXN0LAogIC8vLyBzZXQsIG9yIG1hcCBlbnRyeS4KICB2b2lkIGJlZ2luVGhlbkNvbnRyb2xGbG93KFRva2VuIHRva2VuKSB7fQoKICAvLy8gQ2FsbGVkIGJlZm9yZSBwYXJzaW5nIHRoZSBgZWxzZWAgcG9ydGlvbiBvZiBhbiBgaWZgIGNvbnRyb2wgZmxvdyBsaXN0LAogIC8vLyBzZXQsIG9yIG1hcCBlbnRyeS4KICB2b2lkIGhhbmRsZUVsc2VDb250cm9sRmxvdyhUb2tlbiBlbHNlVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJFbHNlQ29udHJvbEZsb3ciKTsKICB9CgogIC8vLyBDYWxsZWQgYWZ0ZXIgcGFyc2luZyBhbiBgaWZgIGNvbnRyb2wgZmxvdyBsaXN0LCBzZXQsIG9yIG1hcCBlbnRyeS4KICAvLy8gU3Vic3RydWN0dXJlczoKICAvLy8gLSBpZiBjb25kaXRpb25hbCBleHByZXNzaW9uCiAgLy8vIC0gZXhwcmVzc2lvbgogIHZvaWQgZW5kSWZDb250cm9sRmxvdyhUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoImVuZElmQ29udHJvbEZsb3ciKTsKICB9CgogIC8vLyBDYWxsZWQgYWZ0ZXIgcGFyc2luZyBhbiBpZi1lbHNlIGNvbnRyb2wgZmxvdyBsaXN0LCBzZXQsIG9yIG1hcCBlbnRyeS4KICAvLy8gU3Vic3RydWN0dXJlczoKICAvLy8gLSBpZiBjb25kaXRpb25hbCBleHByZXNzaW9uCiAgLy8vIC0gdGhlbiBleHByZXNzaW9uCiAgLy8vIC0gZWxzZSBleHByZXNzaW9uCiAgdm9pZCBlbmRJZkVsc2VDb250cm9sRmxvdyhUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoImVuZElmRWxzZUNvbnRyb2xGbG93Iik7CiAgfQoKICAvLy8gQ2FsbGVkIGFmdGVyIHBhcnNpbmcgYSBsaXN0LCBzZXQsIG9yIG1hcCBlbnRyeSB0aGF0IHN0YXJ0cyB3aXRoCiAgLy8vIG9uZSBvZiB0aGUgc3ByZWFkIGNvbGxlY3Rpb24gdG9rZW5zIGAuLi5gIG9yIGAuLi4/YC4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gZXhwcmVzc2lvbgogIHZvaWQgaGFuZGxlU3ByZWFkRXhwcmVzc2lvbihUb2tlbiBzcHJlYWRUb2tlbikgewogICAgbG9nRXZlbnQoIlNwcmVhZEV4cHJlc3Npb24iKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24gdHlwZWQgZm9ybWFsIHBhcmFtZXRlci4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gdHlwZSB2YXJpYWJsZXMKICB2b2lkIGJlZ2luRnVuY3Rpb25UeXBlZEZvcm1hbFBhcmFtZXRlcihUb2tlbiB0b2tlbikge30KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGEgZnVuY3Rpb24gdHlwZWQgZm9ybWFsIHBhcmFtZXRlci4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gdHlwZSB2YXJpYWJsZXMKICAvLy8gLSByZXR1cm4gdHlwZQogIC8vLyAtIGZvcm1hbCBwYXJhbWV0ZXJzCiAgdm9pZCBlbmRGdW5jdGlvblR5cGVkRm9ybWFsUGFyYW1ldGVyKFRva2VuIG5hbWVUb2tlbikgewogICAgbG9nRXZlbnQoIkZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXIiKTsKICB9CgogIC8vLyBIYW5kbGUgYW4gaWRlbnRpZmllciB0b2tlbi4KICAvLy8KICAvLy8gW2NvbnRleHRdIGluZGljYXRlcyB3aGF0IGtpbmQgb2YgY29uc3RydWN0IHRoZSBpZGVudGlmaWVyIGFwcGVhcnMgaW4uCiAgdm9pZCBoYW5kbGVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dCBjb250ZXh0KSB7CiAgICBsb2dFdmVudCgiSWRlbnRpZmllciIpOwogIH0KCiAgdm9pZCBoYW5kbGVJbmRleGVkRXhwcmVzc2lvbigKICAgICAgVG9rZW4gb3BlblNxdWFyZUJyYWNrZXQsIFRva2VuIGNsb3NlU3F1YXJlQnJhY2tldCkgewogICAgbG9nRXZlbnQoIkluZGV4ZWRFeHByZXNzaW9uIik7CiAgfQoKICB2b2lkIGhhbmRsZUlzT3BlcmF0b3IoVG9rZW4gaXNPcGVyYXRvciwgVG9rZW4gbm90KSB7CiAgICBsb2dFdmVudCgiSXNPcGVyYXRvciIpOwogIH0KCiAgdm9pZCBoYW5kbGVMaXRlcmFsQm9vbChUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkxpdGVyYWxCb29sIik7CiAgfQoKICB2b2lkIGhhbmRsZUJyZWFrU3RhdGVtZW50KAogICAgICBib29sIGhhc1RhcmdldCwgVG9rZW4gYnJlYWtLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkJyZWFrU3RhdGVtZW50Iik7CiAgfQoKICB2b2lkIGhhbmRsZUNvbnRpbnVlU3RhdGVtZW50KAogICAgICBib29sIGhhc1RhcmdldCwgVG9rZW4gY29udGludWVLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkNvbnRpbnVlU3RhdGVtZW50Iik7CiAgfQoKICB2b2lkIGhhbmRsZUVtcHR5U3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiRW1wdHlTdGF0ZW1lbnQiKTsKICB9CgogIHZvaWQgYmVnaW5Bc3NlcnQoVG9rZW4gYXNzZXJ0S2V5d29yZCwgQXNzZXJ0IGtpbmQpIHt9CgogIHZvaWQgZW5kQXNzZXJ0KFRva2VuIGFzc2VydEtleXdvcmQsIEFzc2VydCBraW5kLCBUb2tlbiBsZWZ0UGFyZW50aGVzaXMsCiAgICAgIFRva2VuIGNvbW1hVG9rZW4sIFRva2VuIHNlbWljb2xvblRva2VuKSB7CiAgICBsb2dFdmVudCgiQXNzZXJ0Iik7CiAgfQoKICAvKiogQ2FsbGVkIHdpdGggZWl0aGVyIHRoZSB0b2tlbiBjb250YWluaW5nIGEgZG91YmxlIGxpdGVyYWwsIG9yCiAgICAqIGFuIGltbWVkaWF0ZWx5IHByZWNlZGluZyAidW5hcnkgcGx1cyIgdG9rZW4uCiAgICAqLwogIHZvaWQgaGFuZGxlTGl0ZXJhbERvdWJsZShUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkxpdGVyYWxEb3VibGUiKTsKICB9CgogIC8qKiBDYWxsZWQgd2l0aCBlaXRoZXIgdGhlIHRva2VuIGNvbnRhaW5pbmcgYW4gaW50ZWdlciBsaXRlcmFsLAogICAgKiBvciBhbiBpbW1lZGlhdGVseSBwcmVjZWRpbmcgInVuYXJ5IHBsdXMiIHRva2VuLgogICAgKi8KICB2b2lkIGhhbmRsZUxpdGVyYWxJbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJMaXRlcmFsSW50Iik7CiAgfQoKICB2b2lkIGhhbmRsZUxpdGVyYWxMaXN0KAogICAgICBpbnQgY291bnQsIFRva2VuIGxlZnRCcmFja2V0LCBUb2tlbiBjb25zdEtleXdvcmQsIFRva2VuIHJpZ2h0QnJhY2tldCkgewogICAgbG9nRXZlbnQoIkxpdGVyYWxMaXN0Iik7CiAgfQoKICB2b2lkIGhhbmRsZUxpdGVyYWxTZXRPck1hcCgKICAgIGludCBjb3VudCwKICAgIFRva2VuIGxlZnRCcmFjZSwKICAgIFRva2VuIGNvbnN0S2V5d29yZCwKICAgIFRva2VuIHJpZ2h0QnJhY2UsCiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogaGFzU2V0RW50cnkgcGFyYW1ldGVyIGV4aXN0cyBmb3IgcmVwbGljYXRpbmcgZXhpc3RpbmcKICAgIC8vIGJlaGF2aW9yIGFuZCB3aWxsIGJlIHJlbW92ZWQgb25jZSB1bmlmaWVkIGNvbGxlY3Rpb24gaGFzIGJlZW4gZW5hYmxlZAogICAgYm9vbCBoYXNTZXRFbnRyeSwKICApIHsKICAgIGxvZ0V2ZW50KCdMaXRlcmFsU2V0T3JNYXAnKTsKICB9CgogIHZvaWQgaGFuZGxlTGl0ZXJhbE51bGwoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJMaXRlcmFsTnVsbCIpOwogIH0KCiAgdm9pZCBoYW5kbGVOYXRpdmVDbGF1c2UoVG9rZW4gbmF0aXZlVG9rZW4sIGJvb2wgaGFzTmFtZSkgewogICAgbG9nRXZlbnQoIk5hdGl2ZUNsYXVzZSIpOwogIH0KCiAgdm9pZCBoYW5kbGVOYW1lZEFyZ3VtZW50KFRva2VuIGNvbG9uKSB7CiAgICBsb2dFdmVudCgiTmFtZWRBcmd1bWVudCIpOwogIH0KCiAgdm9pZCBiZWdpbk5ld0V4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kTmV3RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIk5ld0V4cHJlc3Npb24iKTsKICB9CgogIHZvaWQgaGFuZGxlTm9Bcmd1bWVudHMoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJOb0FyZ3VtZW50cyIpOwogIH0KCiAgdm9pZCBoYW5kbGVOb0NvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiTm9Db25zdHJ1Y3RvclJlZmVyZW5jZUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cyIpOwogIH0KCiAgdm9pZCBoYW5kbGVOb1R5cGUoVG9rZW4gbGFzdENvbnN1bWVkKSB7CiAgICBsb2dFdmVudCgiTm9UeXBlIik7CiAgfQoKICB2b2lkIGhhbmRsZU5vVHlwZVZhcmlhYmxlcyhUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIk5vVHlwZVZhcmlhYmxlcyIpOwogIH0KCiAgdm9pZCBoYW5kbGVPcGVyYXRvcihUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIk9wZXJhdG9yIik7CiAgfQoKICB2b2lkIGhhbmRsZVN5bWJvbFZvaWQoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJTeW1ib2xWb2lkIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBjb25zdHJ1Y3Qgb2YgdGhlIGZvcm0gIm9wZXJhdG9yIDx0b2tlbj4iLgogIHZvaWQgaGFuZGxlT3BlcmF0b3JOYW1lKFRva2VuIG9wZXJhdG9yS2V5d29yZCwgVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJPcGVyYXRvck5hbWUiKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIGVuZCBvZiBhIGNvbnN0cnVjdCBvZiB0aGUgZm9ybSAib3BlcmF0b3IgPHRva2VuPiIKICAvLy8gd2hlcmUgPHRva2VuPiBpcyBub3QgYSB2YWxpZCBvcGVyYXRvciB0b2tlbi4KICB2b2lkIGhhbmRsZUludmFsaWRPcGVyYXRvck5hbWUoVG9rZW4gb3BlcmF0b3JLZXl3b3JkLCBUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkludmFsaWRPcGVyYXRvck5hbWUiKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIGNvbmRpdGlvbiBpbiBhIGNvbnRyb2wgc3RydWN0dXJlOgogIC8vLyAtIGlmIHN0YXRlbWVudAogIC8vLyAtIGRvIHdoaWxlIGxvb3AKICAvLy8gLSBzd2l0Y2ggc3RhdGVtZW50CiAgLy8vIC0gd2hpbGUgbG9vcAogIHZvaWQgaGFuZGxlUGFyZW50aGVzaXplZENvbmRpdGlvbihUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIlBhcmVudGhlc2l6ZWRDb25kaXRpb24iKTsKICB9CgogIC8vLyBIYW5kbGUgYSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24uCiAgLy8vIFRoZXNlIG1heSBiZSB3aXRoaW4gdGhlIGNvbmRpdGlvbiBleHByZXNzaW9uIG9mIGEgY29udHJvbCBzdHJ1Y3R1cmUKICAvLy8gYnV0IHdpbGwgbm90IGJlIHRoZSBjb25kaXRpb24gb2YgYSBjb250cm9sIHN0cnVjdHVyZS4KICB2b2lkIGhhbmRsZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiUGFyZW50aGVzaXplZEV4cHJlc3Npb24iKTsKICB9CgogIC8vLyBIYW5kbGUgYSBjb25zdHJ1Y3Qgb2YgdGhlIGZvcm0gImlkZW50aWZpZXIuaWRlbnRpZmllciIgb2NjdXJyaW5nIGluIGEgcGFydAogIC8vLyBvZiB0aGUgZ3JhbW1hciB3aGVyZSBleHByZXNzaW9ucyBpbiBnZW5lcmFsIGFyZSBub3QgYWxsb3dlZC4KICAvLy8gU3Vic3RydWN0dXJlczoKICAvLy8gLSBRdWFsaWZpZWQgaWRlbnRpZmllciAoYmVmb3JlIHRoZSBwZXJpb2QpCiAgLy8vIC0gSWRlbnRpZmllciAoYWZ0ZXIgdGhlIHBlcmlvZCkKICB2b2lkIGhhbmRsZVF1YWxpZmllZChUb2tlbiBwZXJpb2QpIHsKICAgIGxvZ0V2ZW50KCJRdWFsaWZpZWQiKTsKICB9CgogIHZvaWQgaGFuZGxlU3RyaW5nUGFydChUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIlN0cmluZ1BhcnQiKTsKICB9CgogIHZvaWQgaGFuZGxlU3VwZXJFeHByZXNzaW9uKFRva2VuIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dCBjb250ZXh0KSB7CiAgICBsb2dFdmVudCgiU3VwZXJFeHByZXNzaW9uIik7CiAgfQoKICB2b2lkIGJlZ2luU3dpdGNoQ2FzZShpbnQgbGFiZWxDb3VudCwgaW50IGV4cHJlc3Npb25Db3VudCwgVG9rZW4gZmlyc3RUb2tlbikge30KCiAgdm9pZCBlbmRTd2l0Y2hDYXNlKAogICAgICBpbnQgbGFiZWxDb3VudCwKICAgICAgaW50IGV4cHJlc3Npb25Db3VudCwKICAgICAgVG9rZW4gZGVmYXVsdEtleXdvcmQsCiAgICAgIFRva2VuIGNvbG9uQWZ0ZXJEZWZhdWx0LAogICAgICBpbnQgc3RhdGVtZW50Q291bnQsCiAgICAgIFRva2VuIGZpcnN0VG9rZW4sCiAgICAgIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiU3dpdGNoQ2FzZSIpOwogIH0KCiAgdm9pZCBoYW5kbGVUaGlzRXhwcmVzc2lvbihUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgbG9nRXZlbnQoIlRoaXNFeHByZXNzaW9uIik7CiAgfQoKICB2b2lkIGhhbmRsZVVuYXJ5UG9zdGZpeEFzc2lnbm1lbnRFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiVW5hcnlQb3N0Zml4QXNzaWdubWVudEV4cHJlc3Npb24iKTsKICB9CgogIHZvaWQgaGFuZGxlVW5hcnlQcmVmaXhFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiVW5hcnlQcmVmaXhFeHByZXNzaW9uIik7CiAgfQoKICB2b2lkIGhhbmRsZVVuYXJ5UHJlZml4QXNzaWdubWVudEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJVbmFyeVByZWZpeEFzc2lnbm1lbnRFeHByZXNzaW9uIik7CiAgfQoKICB2b2lkIGJlZ2luRm9ybWFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlRXhwcmVzc2lvbigpIHt9CgogIHZvaWQgZW5kRm9ybWFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlRXhwcmVzc2lvbigpIHsKICAgIGxvZ0V2ZW50KCJGb3JtYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVFeHByZXNzaW9uIik7CiAgfQoKICB2b2lkIGhhbmRsZVZhbHVlZEZvcm1hbFBhcmFtZXRlcihUb2tlbiBlcXVhbHMsIFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiVmFsdWVkRm9ybWFsUGFyYW1ldGVyIik7CiAgfQoKICB2b2lkIGhhbmRsZUZvcm1hbFBhcmFtZXRlcldpdGhvdXRWYWx1ZShUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkZvcm1hbFBhcmFtZXRlcldpdGhvdXRWYWx1ZSIpOwogIH0KCiAgdm9pZCBoYW5kbGVWb2lkS2V5d29yZChUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIlZvaWRLZXl3b3JkIik7CiAgfQoKICB2b2lkIGJlZ2luWWllbGRTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kWWllbGRTdGF0ZW1lbnQoVG9rZW4geWllbGRUb2tlbiwgVG9rZW4gc3RhclRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIllpZWxkU3RhdGVtZW50Iik7CiAgfQoKICAvLy8gVGhlIHBhcnNlciBub3RpY2VkIGEgc3ludGF4IGVycm9yLCBidXQgd2FzIGFibGUgdG8gcmVjb3ZlciBmcm9tIGl0LiBUaGUKICAvLy8gZXJyb3Igc2hvdWxkIGJlIHJlcG9ydGVkIHVzaW5nIHRoZSBbbWVzc2FnZV0sIGFuZCB0aGUgY29kZSBiZXR3ZWVuIHRoZQogIC8vLyBiZWdpbm5pbmcgb2YgdGhlIFtzdGFydFRva2VuXSBhbmQgdGhlIGVuZCBvZiB0aGUgW2VuZFRva2VuXSBzaG91bGQgYmUKICAvLy8gaGlnaGxpZ2h0ZWQuIFRoZSBbc3RhcnRUb2tlbl0gYW5kIFtlbmRUb2tlbl0gY2FuIGJlIHRoZSBzYW1lIHRva2VuLgogIHZvaWQgaGFuZGxlUmVjb3ZlcmFibGVFcnJvcigKICAgICAgTWVzc2FnZSBtZXNzYWdlLCBUb2tlbiBzdGFydFRva2VuLCBUb2tlbiBlbmRUb2tlbikge30KCiAgLy8vIFRoZSBwYXJzZXIgZW5jb3VudGVyZWQgYW4gW0Vycm9yVG9rZW5dIHJlcHJlc2VudGluZyBhbiBlcnJvcgogIC8vLyBmcm9tIHRoZSBzY2FubmVyIGJ1dCByZWNvdmVyZWQgZnJvbSBpdC4gQnkgZGVmYXVsdCwgdGhlIGVycm9yIGlzIHJlcG9ydGVkCiAgLy8vIGJ5IGNhbGxpbmcgW2hhbmRsZVJlY292ZXJhYmxlRXJyb3JdIHdpdGggdGhlIG1lc3NhZ2UgYXNzb2NpYXRlZAogIC8vLyB3aXRoIHRoZSBlcnJvciBbdG9rZW5dLgogIHZvaWQgaGFuZGxlRXJyb3JUb2tlbihFcnJvclRva2VuIHRva2VuKSB7CiAgICBoYW5kbGVSZWNvdmVyYWJsZUVycm9yKHRva2VuLmFzc2VydGlvbk1lc3NhZ2UsIHRva2VuLCB0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVVuZXNjYXBlRXJyb3IoCiAgICAgIE1lc3NhZ2UgbWVzc2FnZSwgVG9rZW4gbG9jYXRpb24sIGludCBzdHJpbmdPZmZzZXQsIGludCBsZW5ndGgpIHsKICAgIGhhbmRsZVJlY292ZXJhYmxlRXJyb3IobWVzc2FnZSwgbG9jYXRpb24sIGxvY2F0aW9uKTsKICB9CgogIC8vLyBTaWduYWxzIHRvIHRoZSBsaXN0ZW5lciB0aGF0IHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQgY29udGFpbmVkIGEgc2VtYW50aWMKICAvLy8gZXJyb3IgKGRlc2NyaWJlZCBieSB0aGUgZ2l2ZW4gW21lc3NhZ2VdKS4gVGhpcyBtZXRob2QgY2FuIGFsc28gYmUgY2FsbGVkCiAgLy8vIGFmdGVyIFtoYW5kbGVFeHByZXNzaW9uRnVuY3Rpb25Cb2R5XSwgaW4gd2hpY2ggY2FzZSBpdCBzaWduYWxzIHRoYXQgdGhlCiAgLy8vIGltcGxpY2l0IHJldHVybiBzdGF0ZW1lbnQgb2YgdGhlIGZ1bmN0aW9uIGNvbnRhaW5lZCBhIHNlbWFudGljIGVycm9yLgogIHZvaWQgaGFuZGxlSW52YWxpZFN0YXRlbWVudChUb2tlbiB0b2tlbiwgTWVzc2FnZSBtZXNzYWdlKSB7CiAgICBoYW5kbGVSZWNvdmVyYWJsZUVycm9yKG1lc3NhZ2UsIHRva2VuLCB0b2tlbik7CiAgfQoKICB2b2lkIGhhbmRsZVNjcmlwdChUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIlNjcmlwdCIpOwogIH0KCiAgLy8vIEEgdHlwZSBoYXMgYmVlbiBqdXN0IHBhcnNlZCwgYW5kIHRoZSBwYXJzZXIgbm90aWNlZCB0aGF0IHRoZSBuZXh0IHRva2VuCiAgLy8vIGhhcyBhIHR5cGUgc3Vic3RpdHV0aW9uIGNvbW1lbnQgLyo9VCouIFNvLCB0aGUgdHlwZSB0aGF0IGhhcyBiZWVuIGp1c3QKICAvLy8gcGFyc2VkIHNob3VsZCBiZSBkaXNjYXJkZWQsIGFuZCBhIG5ldyB0eXBlIHNob3VsZCBiZSBwYXJzZWQgaW5zdGVhZC4KICB2b2lkIGRpc2NhcmRUeXBlUmVwbGFjZWRXaXRoQ29tbWVudFR5cGVBc3NpZ24oKSB7fQoKICAvLy8gQSBzaW5nbGUgY29tbWVudCByZWZlcmVuY2UgaGFzIGJlZW4gZm91bmQKICAvLy8gd2hlcmUgW3JlZmVyZW5jZVNvdXJjZV0gaXMgdGhlIHRleHQgYmV0d2VlbiB0aGUgYFtgIGFuZCBgXWAKICAvLy8gYW5kIFtyZWZlcmVuY2VPZmZzZXRdIGlzIHRoZSBjaGFyYWN0ZXIgb2Zmc2V0IGluIHRoZSB0b2tlbiBzdHJlYW0uCiAgLy8vCiAgLy8vIFRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBwYXJzZXIgd2hlbiB0aGUgcGFyc2VyJ3MKICAvLy8gYHBhcnNlQ29tbWVudFJlZmVyZW5jZXNgIG1ldGhvZCBpcyBjYWxsZWQuIEZvciBmdXJ0aGVyIHByb2Nlc3NpbmcsCiAgLy8vIGEgbGlzdGVuZXIgbWF5IHNjYW4gdGhlIFtyZWZlcmVuY2VTb3VyY2VdIGFuZCB0aGVuIHBhc3MgdGhlIHJlc3VsdGluZwogIC8vLyB0b2tlbiBzdHJlYW0gdG8gdGhlIHBhcnNlcidzIGBwYXJzZU9uZUNvbW1lbnRSZWZlcmVuY2VgIG1ldGhvZC4KICB2b2lkIGhhbmRsZUNvbW1lbnRSZWZlcmVuY2VUZXh0KFN0cmluZyByZWZlcmVuY2VTb3VyY2UsIGludCByZWZlcmVuY2VPZmZzZXQpIHsKICAgIGxvZ0V2ZW50KCJDb21tZW50UmVmZXJlbmNlVGV4dCIpOwogIH0KCiAgLy8vIEEgc2luZ2xlIGNvbW1lbnQgcmVmZXJlbmNlIGhhcyBiZWVuIHBhcnNlZC4KICAvLy8gKiBbbmV3S2V5d29yZF0gbWF5IGJlIG51bGwuCiAgLy8vICogW3ByZWZpeF0gYW5kIFtwZXJpb2RdIGFyZSBlaXRoZXIgYm90aCB0b2tlbnMgb3IgYm90aCBgbnVsbGAuCiAgLy8vICogW3Rva2VuXSBjYW4gYmUgYW4gaWRlbnRpZmllciBvciBhbiBvcGVyYXRvci4KICAvLy8KICAvLy8gVGhpcyBldmVudCBpcyBnZW5lcmF0ZWQgYnkgdGhlIHBhcnNlciB3aGVuIHRoZSBwYXJzZXIncwogIC8vLyBgcGFyc2VPbmVDb21tZW50UmVmZXJlbmNlYCBtZXRob2QgaXMgY2FsbGVkLgogIHZvaWQgaGFuZGxlQ29tbWVudFJlZmVyZW5jZSgKICAgICAgVG9rZW4gbmV3S2V5d29yZCwgVG9rZW4gcHJlZml4LCBUb2tlbiBwZXJpb2QsIFRva2VuIHRva2VuKSB7fQoKICAvLy8gVGhpcyBldmVudCBpcyBnZW5lcmF0ZWQgYnkgdGhlIHBhcnNlciB3aGVuIHRoZSBwYXJzZXIncwogIC8vLyBgcGFyc2VPbmVDb21tZW50UmVmZXJlbmNlYCBtZXRob2QgaXMgY2FsbGVkLgogIHZvaWQgaGFuZGxlTm9Db21tZW50UmVmZXJlbmNlKCkge30KfQqFoABOTjwBHwEuAUkBMwE2ASIBPgE5ASsBIgFGFgRMBEZQFgRPCzIXASABKQEmAUMbBAE4QB8EASwBPiEEASIBPxcEAUo+DjIBJAEWGQQB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JyBhcyBmYXN0YTsKCmltcG9ydCAnLi4vc2Nhbm5lci5kYXJ0JyBzaG93IEVycm9yVG9rZW4sIFRva2VuOwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnCiAgICBzaG93CiAgICAgICAgQVNTSUdOTUVOVF9QUkVDRURFTkNFLAogICAgICAgIEJlZ2luVG9rZW4sCiAgICAgICAgQ0FTQ0FERV9QUkVDRURFTkNFLAogICAgICAgIEVRVUFMSVRZX1BSRUNFREVOQ0UsCiAgICAgICAgS2V5d29yZCwKICAgICAgICBQT1NURklYX1BSRUNFREVOQ0UsCiAgICAgICAgUFJFRklYX1BSRUNFREVOQ0UsCiAgICAgICAgUkVMQVRJT05BTF9QUkVDRURFTkNFLAogICAgICAgIFNFTEVDVE9SX1BSRUNFREVOQ0UsCiAgICAgICAgU3ludGhldGljQmVnaW5Ub2tlbiwKICAgICAgICBTeW50aGV0aWNLZXl3b3JkVG9rZW4sCiAgICAgICAgU3ludGhldGljU3RyaW5nVG9rZW4sCiAgICAgICAgU3ludGhldGljVG9rZW4sCiAgICAgICAgVG9rZW5UeXBlOwoKaW1wb3J0ICcuLi9zY2FubmVyL3Rva2VuX2NvbnN0YW50cy5kYXJ0JwogICAgc2hvdwogICAgICAgIEJBTkdfRVFfRVFfVE9LRU4sCiAgICAgICAgQ09NTUFfVE9LRU4sCiAgICAgICAgRE9VQkxFX1RPS0VOLAogICAgICAgIEVPRl9UT0tFTiwKICAgICAgICBFUV9FUV9FUV9UT0tFTiwKICAgICAgICBFUV9UT0tFTiwKICAgICAgICBGVU5DVElPTl9UT0tFTiwKICAgICAgICBIQVNIX1RPS0VOLAogICAgICAgIEhFWEFERUNJTUFMX1RPS0VOLAogICAgICAgIElERU5USUZJRVJfVE9LRU4sCiAgICAgICAgSU5UX1RPS0VOLAogICAgICAgIEtFWVdPUkRfVE9LRU4sCiAgICAgICAgTFRfVE9LRU4sCiAgICAgICAgT1BFTl9DVVJMWV9CUkFDS0VUX1RPS0VOLAogICAgICAgIE9QRU5fUEFSRU5fVE9LRU4sCiAgICAgICAgT1BFTl9TUVVBUkVfQlJBQ0tFVF9UT0tFTiwKICAgICAgICBTRU1JQ09MT05fVE9LRU4sCiAgICAgICAgU1RSSU5HX0lOVEVSUE9MQVRJT05fSURFTlRJRklFUl9UT0tFTiwKICAgICAgICBTVFJJTkdfSU5URVJQT0xBVElPTl9UT0tFTiwKICAgICAgICBTVFJJTkdfVE9LRU47CgppbXBvcnQgJ2Fzc2VydC5kYXJ0JyBzaG93IEFzc2VydDsKCmltcG9ydCAnYXN5bmNfbW9kaWZpZXIuZGFydCcgc2hvdyBBc3luY01vZGlmaWVyOwoKaW1wb3J0ICdkaXJlY3RpdmVfY29udGV4dC5kYXJ0JzsKCmltcG9ydCAnZm9ybWFsX3BhcmFtZXRlcl9raW5kLmRhcnQnCiAgICBzaG93CiAgICAgICAgRm9ybWFsUGFyYW1ldGVyS2luZCwKICAgICAgICBpc01hbmRhdG9yeUZvcm1hbFBhcmFtZXRlcktpbmQsCiAgICAgICAgaXNPcHRpb25hbFBvc2l0aW9uYWxGb3JtYWxQYXJhbWV0ZXJLaW5kOwoKaW1wb3J0ICdmb3J3YXJkaW5nX2xpc3RlbmVyLmRhcnQnIHNob3cgRm9yd2FyZGluZ0xpc3RlbmVyOwoKaW1wb3J0ICdpZGVudGlmaWVyX2NvbnRleHQuZGFydCcKICAgIHNob3cgSWRlbnRpZmllckNvbnRleHQsIGxvb2tzTGlrZUV4cHJlc3Npb25TdGFydDsKCmltcG9ydCAnbGlzdGVuZXIuZGFydCcgc2hvdyBMaXN0ZW5lcjsKCmltcG9ydCAnbGl0ZXJhbF9lbnRyeV9pbmZvLmRhcnQnCiAgICBzaG93CiAgICAgICAgTGl0ZXJhbEVudHJ5SW5mbywKICAgICAgICBjb21wdXRlTGl0ZXJhbEVudHJ5LAogICAgICAgIGxvb2tzTGlrZUxpdGVyYWxFbnRyeSwKICAgICAgICBzaW1wbGVFbnRyeTsKCmltcG9ydCAnbG9vcF9zdGF0ZS5kYXJ0JyBzaG93IExvb3BTdGF0ZTsKCmltcG9ydCAnbWVtYmVyX2tpbmQuZGFydCcgc2hvdyBNZW1iZXJLaW5kOwoKaW1wb3J0ICdtb2RpZmllcl9jb250ZXh0LmRhcnQnIHNob3cgTW9kaWZpZXJSZWNvdmVyeUNvbnRleHQsIGlzTW9kaWZpZXI7CgppbXBvcnQgJ3JlY292ZXJ5X2xpc3RlbmVycy5kYXJ0JwogICAgc2hvdwogICAgICAgIENsYXNzSGVhZGVyUmVjb3ZlcnlMaXN0ZW5lciwKICAgICAgICBJbXBvcnRSZWNvdmVyeUxpc3RlbmVyLAogICAgICAgIE1peGluSGVhZGVyUmVjb3ZlcnlMaXN0ZW5lcjsKCmltcG9ydCAndG9rZW5fc3RyZWFtX3Jld3JpdGVyLmRhcnQnIHNob3cgVG9rZW5TdHJlYW1SZXdyaXRlcjsKCmltcG9ydCAndHlwZV9pbmZvLmRhcnQnCiAgICBzaG93CiAgICAgICAgVHlwZUluZm8sCiAgICAgICAgVHlwZVBhcmFtT3JBcmdJbmZvLAogICAgICAgIGNvbXB1dGVNZXRob2RUeXBlQXJndW1lbnRzLAogICAgICAgIGNvbXB1dGVUeXBlLAogICAgICAgIGNvbXB1dGVUeXBlUGFyYW1PckFyZywKICAgICAgICBpc1ZhbGlkVHlwZVJlZmVyZW5jZSwKICAgICAgICBub1R5cGUsCiAgICAgICAgbm9UeXBlUGFyYW1PckFyZzsKCmltcG9ydCAndXRpbC5kYXJ0JwogICAgc2hvdwogICAgICAgIGZpbmROb25aZXJvTGVuZ3RoVG9rZW4sCiAgICAgICAgZmluZFByZXZpb3VzTm9uWmVyb0xlbmd0aFRva2VuLAogICAgICAgIGlzTGV0dGVyLAogICAgICAgIGlzTGV0dGVyT3JEaWdpdCwKICAgICAgICBpc09uZU9mLAogICAgICAgIGlzT25lT2ZPckVvZiwKICAgICAgICBpc1doaXRlc3BhY2UsCiAgICAgICAgb3B0aW9uYWw7CgovLy8gQW4gZXZlbnQgZ2VuZXJhdGluZyBwYXJzZXIgb2YgRGFydCBwcm9ncmFtcy4gVGhpcyBwYXJzZXIgZXhwZWN0cyBhbGwgdG9rZW5zCi8vLyBpbiBhIGxpbmtlZCBsaXN0IChha2EgYSB0b2tlbiBzdHJlYW0pLgovLy8KLy8vIFRoZSBjbGFzcyBbU2Nhbm5lcl0gaXMgdXNlZCB0byBnZW5lcmF0ZSBhIHRva2VuIHN0cmVhbS4gU2VlIHRoZSBmaWxlCi8vLyBbc2Nhbm5lci5kYXJ0XSguLi9zY2FubmVyLmRhcnQpLgovLy8KLy8vIFN1YmNsYXNzZXMgb2YgdGhlIGNsYXNzIFtMaXN0ZW5lcl0gYXJlIHVzZWQgdG8gbGlzdGVuIHRvIGV2ZW50cy4KLy8vCi8vLyBNb3N0IG1ldGhvZHMgb2YgdGhpcyBjbGFzcyBiZWxvbmcgaW4gb25lIG9mIGZvdXIgbWFqb3IgY2F0ZWdvcmllczogcGFyc2UKLy8vIG1ldGhvZHMsIHBlZWsgbWV0aG9kcywgZW5zdXJlIG1ldGhvZHMsIGFuZCBza2lwIG1ldGhvZHMuCi8vLwovLy8gUGFyc2UgbWV0aG9kcyBhbGwgaGF2ZSB0aGUgcHJlZml4IGBwYXJzZWAsIGdlbmVyYXRlIGV2ZW50cwovLy8gKGJ5IGNhbGxpbmcgbWV0aG9kcyBvbiBbbGlzdGVuZXJdKSwgYW5kIHJldHVybiB0aGUgbmV4dCB0b2tlbiB0byBwYXJzZS4KLy8vIFNvbWUgZXhjZXB0aW9ucyB0byB0aGlzIGxhc3QgcG9pbnQgYXJlIG1ldGhvZHMgc3VjaCBhcyBbcGFyc2VGdW5jdGlvbkJvZHldCi8vLyBhbmQgW3BhcnNlQ2xhc3NPck1peGluQm9keV0gd2hpY2ggcmV0dXJuIHRoZSBsYXN0IHRva2VuIHBhcnNlZAovLy8gcmF0aGVyIHRoYW4gdGhlIG5leHQgdG9rZW4gdG8gYmUgcGFyc2VkLgovLy8gUGFyc2UgbWV0aG9kcyBhcmUgZ2VuZXJhbGx5IG5hbWVkIGBwYXJzZUdyYW1tYXJQcm9kdWN0aW9uU3VmZml4YC4KLy8vIFRoZSBzdWZmaXggY2FuIGJlIG9uZSBvZiBgb3B0YCwgb3IgYHN0YXJgLgovLy8gYG9wdGAgbWVhbnMgemVybyBvciBvbmUgbWF0Y2hlcywgYHN0YXJgIG1lYW5zIHplcm8gb3IgbW9yZSBtYXRjaGVzLgovLy8gRm9yIGV4YW1wbGUsIFtwYXJzZU1ldGFkYXRhU3Rhcl0gY29ycmVzcG9uZHMgdG8gdGhpcyBncmFtbWFyIHNuaXBwZXQ6Ci8vLyBgbWV0YWRhdGEqYCwgYW5kIFtwYXJzZUFyZ3VtZW50c09wdF0gY29ycmVzcG9uZHMgdG86IGBhcmd1bWVudHM/YC4KLy8vCi8vLyBQZWVrIG1ldGhvZHMgYWxsIGhhdmUgdGhlIHByZWZpeCBgcGVla2AsIGRvIG5vdCBnZW5lcmF0ZSBldmVudHMKLy8vIChleGNlcHQgZm9yIGVycm9ycykgYW5kIG1heSByZXR1cm4gbnVsbC4KLy8vCi8vLyBFbnN1cmUgbWV0aG9kcyBhbGwgaGF2ZSB0aGUgcHJlZml4IGBlbnN1cmVgIGFuZCBtYXkgZ2VuZXJhdGUgZXZlbnRzLgovLy8gVGhleSByZXR1cm4gdGhlIGN1cnJlbnQgdG9rZW4sIG9yIGluc2VydCBhbmQgcmV0dXJuIGEgc3ludGhldGljIHRva2VuCi8vLyBpZiB0aGUgY3VycmVudCB0b2tlbiBkb2VzIG5vdCBtYXRjaC4gRm9yIGV4YW1wbGUsCi8vLyBbZW5zdXJlU2VtaWNvbG9uXSByZXR1cm5zIHRoZSBjdXJyZW50IHRva2VuIGlmIHRoZSBjdXJyZW50IHRva2VuIGlzIGEKLy8vIHNlbWljb2xvbiwgb3RoZXJ3aXNlIGluc2VydHMgYSBzeW50aGV0aWMgc2VtaWNvbG9uIGluIHRoZSB0b2tlbiBzdHJlYW0KLy8vIGJlZm9yZSB0aGUgY3VycmVudCB0b2tlbiBhbmQgdGhlbiByZXR1cm5zIHRoYXQgbmV3IHN5bnRoZXRpYyB0b2tlbi4KLy8vCi8vLyBTa2lwIG1ldGhvZHMgYXJlIGxpa2UgcGFyc2UgbWV0aG9kcywgYnV0IGFsbCBoYXZlIHRoZSBwcmVmaXggYHNraXBgCi8vLyBhbmQgc2tpcCBvdmVyIHNvbWUgcGFydHMgb2YgdGhlIGZpbGUgYmVpbmcgcGFyc2VkLgovLy8gVHlwaWNhbGx5LCBza2lwIG1ldGhvZHMgZ2VuZXJhdGUgYW4gZXZlbnQgZm9yIHRoZSBzdHJ1Y3R1cmUgYmVpbmcgc2tpcHBlZCwKLy8vIGJ1dCBub3QgZm9yIGl0cyBzdWJzdHJ1Y3R1cmVzLgovLy8KLy8vICMjIEN1cnJlbnQgVG9rZW4KLy8vCi8vLyBUaGUgY3VycmVudCB0b2tlbiBpcyBhbHdheXMgdG8gYmUgZm91bmQgaW4gYSBmb3JtYWwgcGFyYW1ldGVyIG5hbWVkCi8vLyBgdG9rZW5gLiBUaGlzIHBhcmFtZXRlciBzaG91bGQgYmUgdGhlIGZpcnN0IGFzIHRoaXMgaW5jcmVhc2VzIHRoZSBjaGFuY2UKLy8vIHRoYXQgYSBjb21waWxlciB3aWxsIHBsYWNlIGl0IGluIGEgcmVnaXN0ZXIuCi8vLwovLy8gIyMgSW1wbGVtZW50YXRpb24gTm90ZXMKLy8vCi8vLyBUaGUgcGFyc2VyIGFzc3VtZXMgdGhhdCBrZXl3b3JkcywgYnVpbHQtaW4gaWRlbnRpZmllcnMsIGFuZCBvdGhlciBzcGVjaWFsCi8vLyB3b3JkcyAocHNldWRvLWtleXdvcmRzKSBhcmUgYWxsIGNhbm9uaWNhbGl6ZWQuIFRvIGV4dGVuZCB0aGUgcGFyc2VyIHRvCi8vLyByZWNvZ25pemUgYSBuZXcgaWRlbnRpZmllciwgb25lIHNob3VsZCBtb2RpZnkKLy8vIFtrZXl3b3JkLmRhcnRdKC4uL3NjYW5uZXIva2V5d29yZC5kYXJ0KSBhbmQgZW5zdXJlIHRoZSBpZGVudGlmaWVyIGlzIGFkZGVkCi8vLyB0byB0aGUga2V5d29yZCB0YWJsZS4KLy8vCi8vLyBBcyBhIGNvbnNlcXVlbmNlIG9mIHRoaXMsIG9uZSBzaG91bGQgbm90IHVzZSBgPT1gIHRvIGNvbXBhcmUgc3RyaW5ncyBpbiB0aGUKLy8vIHBhcnNlci4gT25lIHNob3VsZCBmYXZvciB0aGUgbWV0aG9kcyBbb3B0aW9uYWxdIGFuZCBbZXhwZWN0XSB0byByZWNvZ25pemUKLy8vIGtleXdvcmRzIG9yIGlkZW50aWZpZXJzLiBJbiBzb21lIGNhc2VzLCBpdCdzIHBvc3NpYmxlIHRvIGNvbXBhcmUgYSB0b2tlbidzCi8vLyBgc3RyaW5nVmFsdWVgIHVzaW5nIFtpZGVudGljYWxdLCBidXQgbm9ybWFsbHkgW29wdGlvbmFsXSB3aWxsIHN1ZmZpY2UuCi8vLwovLy8gSGlzdG9yaWNhbGx5LCB3ZSBvdmVyLXVzZWQgaWRlbnRpY2FsLCBhbmQgd2hlbiBpZGVudGljYWwgaXMgdXNlZCBvbiBvYmplY3RzCi8vLyBvdGhlciB0aGFuIHN0cmluZ3MsIGl0IGNhbiBvZnRlbiBiZSByZXBsYWNlZCBieSBgPT1gLgovLy8KLy8vICMjIEZsZXhpYmlsaXR5LCBFeHRlbnNpYmlsaXR5LCBhbmQgU3BlY2lmaWNhdGlvbgovLy8KLy8vIFRoZSBwYXJzZXIgaXMgZGVzaWduZWQgdG8gYmUgZmxleGlibGUgYW5kIGV4dGVuc2libGUuIEl0cyBtZXRob2RzIGFyZQovLy8gZGVzaWduZWQgdG8gYmUgb3ZlcnJpZGRlbiBpbiBzdWJjbGFzc2VzLCBzbyBpdCBjYW4gYmUgZXh0ZW5kZWQgdG8gaGFuZGxlCi8vLyB1bnNwZWNpZmllZCBsYW5ndWFnZSBleHRlbnNpb24gb3IgZXhwZXJpbWVudHMgd2hpbGUgZXZlcnl0aGluZyBpbiB0aGlzIGZpbGUKLy8vIGF0dGVtcHRzIHRvIGZvbGxvdyB0aGUgc3BlY2lmaWNhdGlvbiAodW5sZXNzIHdoZW4gaXQgaW50ZXJmZXJlcyB3aXRoIGVycm9yCi8vLyByZWNvdmVyeSkuCi8vLwovLy8gV2UgYWNoaWV2ZSBmbGV4aWJpbGl0eSwgZXh0ZW5zaWJsZSwgYW5kIHNwZWNpZmljYXRpb24gY29tcGxpYW5jZSBieQovLy8gZm9sbG93aW5nIGEgZmV3IHJ1bGVzLW9mLXRodW1iOgovLy8KLy8vIDEuIEFsbCBtZXRob2RzIGluIHRoZSBwYXJzZXIgc2hvdWxkIGJlIHB1YmxpYy4KLy8vCi8vLyAyLiBUaGUgbWV0aG9kcyBmb2xsb3cgdGhlIHNwZWNpZmllZCBncmFtbWFyLCBhbmQgZG8gbm90IGltcGxlbWVudCBjdXN0b20KLy8vIGV4dGVuc2lvbnMsIGZvciBleGFtcGxlLCBgbmF0aXZlYC4KLy8vCi8vLyAzLiBUaGUgcGFyc2VyIGRvZXNuJ3QgcmV3cml0ZSB0aGUgdG9rZW4gc3RyZWFtICh3aGVuIGRlYWxpbmcgd2l0aCBgPj5gKS4KLy8vCi8vLyAjIyMgSW1wbGVtZW50aW5nIEV4dGVuc2lvbnMKLy8vCi8vLyBGb3IgdmFyaW91cyByZWFzb25zLCBzb21lIERhcnQgbGFuZ3VhZ2UgaW1wbGVtZW50YXRpb25zIGhhdmUgdXNlZAovLy8gY3VzdG9tL3Vuc3BlY2lmaWVkIGV4dGVuc2lvbnMgdG8gdGhlIERhcnQgZ3JhbW1hci4gRXhhbXBsZXMgb2YgdGhpcwovLy8gaW5jbHVkZXMgZGlldCBwYXJzaW5nLCBwYXRjaCBmaWxlcywgYG5hdGl2ZWAga2V5d29yZCwgYW5kIGdlbmVyaWMKLy8vIGNvbW1lbnRzLiBUaGlzIGNsYXNzIGlzbid0IHN1cHBvc2VkIHRvIGltcGxlbWVudCBhbnkgb2YgdGhlc2UKLy8vIGZlYXR1cmVzLiBJbnN0ZWFkIGl0IHByb3ZpZGVzIGhvb2tzIGZvciB0aG9zZSBleHRlbnNpb25zIHRvIGJlIGltcGxlbWVudGVkCi8vLyBpbiBzdWJjbGFzc2VzIG9yIGxpc3RlbmVycy4gTGV0J3MgZXhhbWluZSBob3cgZGlldCBwYXJzaW5nIGFuZCBgbmF0aXZlYAovLy8ga2V5d29yZCBpcyBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IEZhc3RhLgovLy8KLy8vICMjIyMgTGVnYWN5IEltcGxlbWVudGF0aW9uIG9mIGBuYXRpdmVgIEtleXdvcmQKLy8vCi8vLyBUT0RPKGFoZSxkYW5ydWJlbCk6IFJlbW92ZSB0aGlzIHNlY3Rpb24uCi8vLwovLy8gQm90aCBkYXJ0MmpzIGFuZCB0aGUgRGFydCBWTSBoYXZlIHVzZWQgdGhlIGBuYXRpdmVgIGtleXdvcmQgdG8gbWFyayBtZXRob2RzCi8vLyB0aGF0IGNvdWxkbid0IGJlIGltcGxlbWVudGVkIGluIHRoZSBEYXJ0IGxhbmd1YWdlIGFuZCBuZWVkZWQgdG8gYmUKLy8vIGltcGxlbWVudGVkIGluIEphdmFTY3JpcHQgb3IgQysrLCByZXNwZWN0aXZlbHkuIEFuIGV4YW1wbGUgb2YgdGhlIHN5bnRheAovLy8gZXh0ZW5zaW9uIHVzZWQgYnkgdGhlIERhcnQgVk0gaXM6Ci8vLwovLy8gICAgIG5hdGl2ZUZ1bmN0aW9uKCkgbmF0aXZlICJOYXRpdmVGdW5jdGlvbiI7Ci8vLwovLy8gV2hlbiBhdHRlbXB0aW5nIHRvIHBhcnNlIHRoaXMgZnVuY3Rpb24sIHRoZSBwYXJzZXIgZXZlbnR1YWxseSBjYWxscwovLy8gW3BhcnNlRnVuY3Rpb25Cb2R5XS4gVGhpcyBtZXRob2Qgd2lsbCByZXBvcnQgYW4gdW5yZWNvdmVyYWJsZSBlcnJvciB0byB0aGUKLy8vIGxpc3RlbmVyIHdpdGggdGhlIGNvZGUgW2Zhc3RhLm1lc3NhZ2VFeHBlY3RlZEZ1bmN0aW9uQm9keV0uIFRoZSBsaXN0ZW5lciBjYW4KLy8vIHRoZW4gbG9vayBhdCB0aGUgZXJyb3IgY29kZSBhbmQgdGhlIHRva2VuIGFuZCB1c2UgdGhlIG1ldGhvZHMgaW4KLy8vIFtuYXRpdmVfc3VwcG9ydC5kYXJ0XShuYXRpdmVfc3VwcG9ydC5kYXJ0KSB0byBwYXJzZSB0aGUgbmF0aXZlIHN5bnRheC4KLy8vCi8vLyAjIyMjIEltcGxlbWVudGF0aW9uIG9mIERpZXQgUGFyc2luZwovLy8KLy8vIFdlIGNhbGwgaXQgX2RpZXRfIF9wYXJzaW5nXyB3aGVuIHRoZSBwYXJzZXIgc2tpcHMgcGFydHMgb2YgYSBmaWxlLiBCb3RoCi8vLyBkYXJ0MmpzIGFuZCB0aGUgRGFydCBWTSBoYXZlIGJlZW4gcmVseWluZyBvbiB0aGlzIGZyb20gZWFybHkgb24gYXMgaXQgYWxsb3dzCi8vLyB0aGVtIHRvIG1vcmUgcXVpY2tseSBjb21waWxlIHNtYWxsIHByb2dyYW1zIHRoYXQgdXNlIHNtYWxsIHBhcnRzIG9mIGJpZwovLy8gbGlicmFyaWVzLiBJdCdzIGFsc28gYmVjb21lIGFuIGludGVncmF0ZWQgcGFydCBvZiBob3cgRmFzdGEgYnVpbGRzIHVwCi8vLyBvdXRsaW5lcyBiZWZvcmUgc3RhcnRpbmcgdG8gcGFyc2UgbWV0aG9kIGJvZGllcy4KLy8vCi8vLyBXaGVuIGxvb2tpbmcgdGhyb3VnaCB0aGlzIHBhcnNlciwgeW91J2xsIGZpbmQgYSBudW1iZXIgb2YgdW51c2VkIG1ldGhvZHMKLy8vIHN0YXJ0aW5nIHdpdGggYHNraXBgLiBUaGVzZSBtZXRob2RzIGFyZSBvbmx5IHVzZWQgYnkgc3ViY2xhc3Nlcywgc3VjaCBhcwovLy8gW0NsYXNzTWVtYmVyUGFyc2VyXShjbGFzc19tZW1iZXJfcGFyc2VyLmRhcnQpIGFuZAovLy8gW1RvcExldmVsUGFyc2VyXSh0b3BfbGV2ZWxfcGFyc2VyLmRhcnQpLiBUaGVzZSBtZXRob2RzIHZpb2xhdGUgdGhlCi8vLyBwcmluY2lwbGUgYWJvdmUgYWJvdXQgZm9sbG93aW5nIHRoZSBzcGVjaWZpZWQgZ3JhbW1hciwgYW5kIG9yaWdpbmFsbHkgbGl2ZWQKLy8vIGluIHN1YmNsYXNzZXMuIEhvd2V2ZXIsIHdlIHJlYWxpemVkIHRoYXQgdGhlc2UgbWV0aG9kcyB3ZXJlIHNvIHdpZGVseSB1c2VkCi8vLyBhbmQgaGFyZCB0byBtYWludGFpbiBpbiBzdWJjbGFzc2VzLCB0aGF0IGl0IG1hZGUgc2Vuc2UgdG8gbW92ZSB0aGVtIGhlcmUuCi8vLwovLy8gIyMjIFNwZWNpZmljYXRpb24gYW5kIEVycm9yIFJlY292ZXJ5Ci8vLwovLy8gVG8gaW1wcm92ZSBlcnJvciByZWNvdmVyeSwgdGhlIHBhcnNlciB3aWxsIGluZm9ybSB0aGUgbGlzdGVuZXIgb2YKLy8vIHJlY292ZXJhYmxlIGVycm9ycyBhbmQgY29udGludWUgdG8gcGFyc2UuICBBbiBleGFtcGxlIG9mIGEgcmVjb3ZlcmFibGUKLy8vIGVycm9yIGlzOgovLy8KLy8vICAgICBFcnJvcjogQXN5bmNocm9ub3VzIGZvci1sb29wIGNhbiBvbmx5IGJlIHVzZWQgaW4gJ2FzeW5jJyBvciAnYXN5bmMqJy4uLgovLy8gICAgIG1haW4oKSB7IGF3YWl0IGZvciAodmFyIHggaW4gW10pIHt9IH0KLy8vICAgICAgICAgICAgICBeXl5eXgovLy8KLy8vICMjIyBMZWdhY3kgRXJyb3IgUmVjb3ZlcnkKLy8vCi8vLyBXaGF0J3MgZGVzY3JpYmVkIGJlbG93IHdpbGwgYmUgcGhhc2VkIG91dCBpbiBwcmVmZXJlbmNlIG9mIHRoZSBwYXJzZXIKLy8vIHJlcG9ydGluZyBhbmQgcmVjb3ZlcmluZyBmcm9tIHN5bnRheCBlcnJvcnMuIFRoZSBtb3RpdmF0aW9uIGZvciB0aGlzIGlzCi8vLyB0aGF0IHdlIGhhdmUgbXVsdGlwbGUgbGlzdGVuZXJzIHRoYXQgdXNlIHRoZSBwYXJzZXIsIGFuZCB0aGlzIHdpbGwgZW5zdXJlCi8vLyBjb25zaXN0ZW5jeS4KLy8vCi8vLyBGb3IgdW5yZWNvdmVyYWJsZSBlcnJvcnMsIHRoZSBwYXJzZXIgd2lsbCBhc2sgdGhlIGxpc3RlbmVyIGZvciBoZWxwIHRvCi8vLyByZWNvdmVyIGZyb20gdGhlIGVycm9yLiBXZSBoYXZlbid0IG1hZGUgbXVjaCBwcm9ncmVzcyBvbiB0aGVzZSBraW5kcyBvZgovLy8gZXJyb3JzLCBzbyBpbiBtb3N0IGNhc2VzLCB0aGUgcGFyc2VyIGFib3J0cyBieSBza2lwcGluZyB0byB0aGUgZW5kIG9mIGZpbGUuCi8vLwovLy8gSGlzdG9yaWNhbGx5LCB0aGlzIHBhcnNlciBoYXMgYmVlbiByYXRoZXIgbGF4IGluIHdoYXQgaXQgYWxsb3dzLCBhbmQKLy8vIGRlZmVycmVkIHRoZSBlbmZvcmNlbWVudCBvZiBzb21lIHN5bnRhY3RpY2FsIHJ1bGVzIHRvIHN1YnNlcXVlbnQgcGhhc2VzLiBJdAovLy8gZG9lc24ndCBtYXR0ZXIgaG93IHdlIGdvdCB0aGVyZSwgb25seSB0aGF0IHdlJ3ZlIGlkZW50aWZpZWQgdGhhdCBpdCdzCi8vLyBlYXNpZXIgaWYgdGhlIHBhcnNlciByZXBvcnRzIGFzIG1hbnkgZXJyb3JzIGl0IGNhbiwgYnV0IGluZm9ybXMgdGhlCi8vLyBsaXN0ZW5lciBpZiB0aGUgZXJyb3IgaXMgcmVjb3ZlcmFibGUgb3Igbm90LgpjbGFzcyBQYXJzZXIgewogIExpc3RlbmVyIGxpc3RlbmVyOwoKICBVcmkgZ2V0IHVyaSA9PiBsaXN0ZW5lci51cmk7CgogIGJvb2wgbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zID0gdHJ1ZTsKCiAgLy8vIFJlcHJlc2VudHMgcGFyc2VyIHN0YXRlOiB3aGF0IGFzeW5jaHJvbm91cyBzeW50YXggaXMgYWxsb3dlZCBpbiB0aGUKICAvLy8gZnVuY3Rpb24gYmVpbmcgY3VycmVudGx5IHBhcnNlZC4gSW4gcmFyZSBzaXR1YXRpb25zLCB0aGlzIGNhbiBiZSBzZXQgYnkKICAvLy8gZXh0ZXJuYWwgY2xpZW50cywgZm9yIGV4YW1wbGUsIHRvIHBhcnNlIGFuIGV4cHJlc3Npb24gb3V0c2lkZSBhIGZ1bmN0aW9uLgogIEFzeW5jTW9kaWZpZXIgYXN5bmNTdGF0ZSA9IEFzeW5jTW9kaWZpZXIuU3luYzsKCiAgLy8gVE9ETyhkYW5ydWJlbCk6IFRoZSBbbG9vcFN0YXRlXSBhbmQgYXNzb2NpYXRlZCBmdW5jdGlvbmFsaXR5IGluIHRoZQogIC8vIFtQYXJzZXJdIGR1cGxpY2F0ZXMgd29yayB0aGF0IHRoZSByZXNvbHZlciBuZWVkcyB0byBkbyB3aGVuIHJlc29sdmluZwogIC8vIGJyZWFrL2NvbnRpbnVlIHRhcmdldHMuIExvbmcgdGVybSwgdGhpcyBzdGF0ZSBhbmQgZnVuY3Rpb25hbGl0eSB3aWxsIGJlCiAgLy8gcmVtb3ZlZCBmcm9tIHRoZSBbUGFyc2VyXSBjbGFzcyBhbmQgdGhlIHJlc29sdmVyIHdpbGwgYmUgcmVzcG9uc2libGUKICAvLyBmb3IgZ2VuZXJhdGluZyBhbGwgYnJlYWsvY29udGludWUgZXJyb3IgbWVzc2FnZXMuCgogIC8vLyBSZXByZXNlbnRzIHBhcnNlciBzdGF0ZTogd2hldGhlciBwYXJzaW5nIG91dHNpZGUgYSBsb29wLAogIC8vLyBpbnNpZGUgYSBsb29wLCBvciBpbnNpZGUgYSBzd2l0Y2guIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlcgogIC8vLyBicmVhayBhbmQgY29udGludWUgc3RhdGVtZW50cyBhcmUgYWxsb3dlZC4KICBMb29wU3RhdGUgbG9vcFN0YXRlID0gTG9vcFN0YXRlLk91dHNpZGVMb29wOwoKICAvLy8gQSByZXdyaXRlciBmb3IgaW5zZXJ0aW5nIHN5bnRoZXRpYyB0b2tlbnMuCiAgLy8vIEFjY2VzcyB1c2luZyBbcmV3cml0ZXJdIGZvciBsYXp5IGluaXRpYWxpemF0aW9uLgogIFRva2VuU3RyZWFtUmV3cml0ZXIgY2FjaGVkUmV3cml0ZXI7CgogIFRva2VuU3RyZWFtUmV3cml0ZXIgZ2V0IHJld3JpdGVyIHsKICAgIGNhY2hlZFJld3JpdGVyID8/PSBuZXcgVG9rZW5TdHJlYW1SZXdyaXRlcigpOwogICAgcmV0dXJuIGNhY2hlZFJld3JpdGVyOwogIH0KCiAgUGFyc2VyKHRoaXMubGlzdGVuZXIpOwoKICBib29sIGdldCBpbkdlbmVyYXRvciB7CiAgICByZXR1cm4gYXN5bmNTdGF0ZSA9PSBBc3luY01vZGlmaWVyLkFzeW5jU3RhciB8fAogICAgICAgIGFzeW5jU3RhdGUgPT0gQXN5bmNNb2RpZmllci5TeW5jU3RhcjsKICB9CgogIGJvb2wgZ2V0IGluQXN5bmMgewogICAgcmV0dXJuIGFzeW5jU3RhdGUgPT0gQXN5bmNNb2RpZmllci5Bc3luYyB8fAogICAgICAgIGFzeW5jU3RhdGUgPT0gQXN5bmNNb2RpZmllci5Bc3luY1N0YXI7CiAgfQoKICBib29sIGdldCBpblBsYWluU3luYyA9PiBhc3luY1N0YXRlID09IEFzeW5jTW9kaWZpZXIuU3luYzsKCiAgYm9vbCBnZXQgaXNCcmVha0FsbG93ZWQgPT4gbG9vcFN0YXRlICE9IExvb3BTdGF0ZS5PdXRzaWRlTG9vcDsKCiAgYm9vbCBnZXQgaXNDb250aW51ZUFsbG93ZWQgPT4gbG9vcFN0YXRlID09IExvb3BTdGF0ZS5JbnNpZGVMb29wOwoKICBib29sIGdldCBpc0NvbnRpbnVlV2l0aExhYmVsQWxsb3dlZCA9PiBsb29wU3RhdGUgIT0gTG9vcFN0YXRlLk91dHNpZGVMb29wOwoKICAvLy8gUGFyc2UgYSBjb21waWxhdGlvbiB1bml0LgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBpcyBvbmx5IGludm9rZWQgZnJvbSBvdXRzaWRlIHRoZSBwYXJzZXIuIEFzIGEgcmVzdWx0LCB0aGlzCiAgLy8vIG1ldGhvZCB0YWtlcyB0aGUgbmV4dCB0b2tlbiB0byBiZSBjb25zdW1lZCByYXRoZXIgdGhhbiB0aGUgbGFzdCBjb25zdW1lZAogIC8vLyB0b2tlbiBhbmQgcmV0dXJucyB0aGUgdG9rZW4gYWZ0ZXIgdGhlIGxhc3QgY29uc3VtZWQgdG9rZW4gcmF0aGVyIHRoYW4gdGhlCiAgLy8vIGxhc3QgY29uc3VtZWQgdG9rZW4uCiAgLy8vCiAgLy8vIGBgYAogIC8vLyBsaWJyYXJ5RGVmaW5pdGlvbjoKICAvLy8gICBzY3JpcHRUYWc/CiAgLy8vICAgbGlicmFyeU5hbWU/CiAgLy8vICAgaW1wb3J0T3JFeHBvcnQqCiAgLy8vICAgcGFydERpcmVjdGl2ZSoKICAvLy8gICB0b3BMZXZlbERlZmluaXRpb24qCiAgLy8vIDsKICAvLy8KICAvLy8gcGFydERlY2xhcmF0aW9uOgogIC8vLyAgIHBhcnRIZWFkZXIgdG9wTGV2ZWxEZWZpbml0aW9uKgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlVW5pdChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXIuYmVnaW5Db21waWxhdGlvblVuaXQodG9rZW4pOwogICAgaW50IGNvdW50ID0gMDsKICAgIERpcmVjdGl2ZUNvbnRleHQgZGlyZWN0aXZlU3RhdGUgPSBuZXcgRGlyZWN0aXZlQ29udGV4dCgpOwogICAgdG9rZW4gPSBzeW50aGV0aWNQcmV2aW91c1Rva2VuKHRva2VuKTsKICAgIGlmIChpZGVudGljYWwodG9rZW4ubmV4dC50eXBlLCBUb2tlblR5cGUuU0NSSVBUX1RBRykpIHsKICAgICAgZGlyZWN0aXZlU3RhdGU/LmNoZWNrU2NyaXB0VGFnKHRoaXMsIHRva2VuLm5leHQpOwogICAgICB0b2tlbiA9IHBhcnNlU2NyaXB0KHRva2VuKTsKICAgIH0KICAgIHdoaWxlICghdG9rZW4ubmV4dC5pc0VvZikgewogICAgICBmaW5hbCBUb2tlbiBzdGFydCA9IHRva2VuLm5leHQ7CiAgICAgIHRva2VuID0gcGFyc2VUb3BMZXZlbERlY2xhcmF0aW9uSW1wbCh0b2tlbiwgZGlyZWN0aXZlU3RhdGUpOwogICAgICBsaXN0ZW5lci5lbmRUb3BMZXZlbERlY2xhcmF0aW9uKHRva2VuLm5leHQpOwogICAgICBjb3VudCsrOwogICAgICBpZiAoc3RhcnQgPT0gdG9rZW4ubmV4dCkgewogICAgICAgIC8vIFJlY292ZXJ5OgogICAgICAgIC8vIElmIHByb2dyZXNzIGhhcyBub3QgYmVlbiBtYWRlIHJlYWNoaW5nIHRoZSBlbmQgb2YgdGhlIHRva2VuIHN0cmVhbSwKICAgICAgICAvLyB0aGVuIHJlcG9ydCBhbiBlcnJvciBhbmQgc2tpcCB0aGUgY3VycmVudCB0b2tlbi4KICAgICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICAgICAgbGlzdGVuZXIuYmVnaW5NZXRhZGF0YVN0YXIodG9rZW4pOwogICAgICAgIGxpc3RlbmVyLmVuZE1ldGFkYXRhU3RhcigwKTsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgICB0b2tlbiwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZERlY2xhcmF0aW9uKTsKICAgICAgICBsaXN0ZW5lci5oYW5kbGVJbnZhbGlkVG9wTGV2ZWxEZWNsYXJhdGlvbih0b2tlbik7CiAgICAgICAgbGlzdGVuZXIuZW5kVG9wTGV2ZWxEZWNsYXJhdGlvbih0b2tlbi5uZXh0KTsKICAgICAgICBjb3VudCsrOwogICAgICB9CiAgICB9CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBsaXN0ZW5lci5lbmRDb21waWxhdGlvblVuaXQoY291bnQsIHRva2VuKTsKICAgIC8vIENsZWFyIGZpZWxkcyB0aGF0IGNvdWxkIGxlYWQgdG8gbWVtb3J5IGxlYWsuCiAgICBjYWNoZWRSZXdyaXRlciA9IG51bGw7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gVGhpcyBtZXRob2QgZXhpc3RzIGZvciBhbmFseXplciBjb21wYXRpYmlsaXR5IG9ubHkKICAvLy8gYW5kIHdpbGwgYmUgcmVtb3ZlZCBvbmNlIGFuYWx5emVyL2Zhc3RhIGludGVncmF0aW9uIGlzIGNvbXBsZXRlLgogIC8vLwogIC8vLyBTaW1pbGFyIHRvIFtwYXJzZVVuaXRdLCB0aGlzIG1ldGhvZCBwYXJzZXMgYSBjb21waWxhdGlvbiB1bml0LAogIC8vLyBidXQgc3RvcHMgd2hlbiBpdCByZWFjaGVzIHRoZSBmaXJzdCBkZWNsYXJhdGlvbiBvciBFT0YuCiAgLy8vCiAgLy8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgaW52b2tlZCBmcm9tIG91dHNpZGUgdGhlIHBhcnNlci4gQXMgYSByZXN1bHQsIHRoaXMKICAvLy8gbWV0aG9kIHRha2VzIHRoZSBuZXh0IHRva2VuIHRvIGJlIGNvbnN1bWVkIHJhdGhlciB0aGFuIHRoZSBsYXN0IGNvbnN1bWVkCiAgLy8vIHRva2VuIGFuZCByZXR1cm5zIHRoZSB0b2tlbiBhZnRlciB0aGUgbGFzdCBjb25zdW1lZCB0b2tlbiByYXRoZXIgdGhhbiB0aGUKICAvLy8gbGFzdCBjb25zdW1lZCB0b2tlbi4KICBUb2tlbiBwYXJzZURpcmVjdGl2ZXMoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyLmJlZ2luQ29tcGlsYXRpb25Vbml0KHRva2VuKTsKICAgIGludCBjb3VudCA9IDA7CiAgICBEaXJlY3RpdmVDb250ZXh0IGRpcmVjdGl2ZVN0YXRlID0gbmV3IERpcmVjdGl2ZUNvbnRleHQoKTsKICAgIHRva2VuID0gc3ludGhldGljUHJldmlvdXNUb2tlbih0b2tlbik7CiAgICB3aGlsZSAoIXRva2VuLm5leHQuaXNFb2YpIHsKICAgICAgZmluYWwgVG9rZW4gc3RhcnQgPSB0b2tlbi5uZXh0OwogICAgICBmaW5hbCBTdHJpbmcgbmV4dFZhbHVlID0gc3RhcnQubmV4dC5zdHJpbmdWYWx1ZTsKCiAgICAgIC8vIElmIGEgYnVpbHQtaW4ga2V5d29yZCBpcyBiZWluZyB1c2VkIGFzIGZ1bmN0aW9uIG5hbWUsIHRoZW4gc3RvcC4KICAgICAgaWYgKGlkZW50aWNhbChuZXh0VmFsdWUsICcuJykgfHwKICAgICAgICAgIGlkZW50aWNhbChuZXh0VmFsdWUsICc8JykgfHwKICAgICAgICAgIGlkZW50aWNhbChuZXh0VmFsdWUsICcoJykpIHsKICAgICAgICBicmVhazsKICAgICAgfQoKICAgICAgaWYgKGlkZW50aWNhbCh0b2tlbi5uZXh0LnR5cGUsIFRva2VuVHlwZS5TQ1JJUFRfVEFHKSkgewogICAgICAgIGRpcmVjdGl2ZVN0YXRlPy5jaGVja1NjcmlwdFRhZyh0aGlzLCB0b2tlbi5uZXh0KTsKICAgICAgICB0b2tlbiA9IHBhcnNlU2NyaXB0KHRva2VuKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0b2tlbiA9IHBhcnNlTWV0YWRhdGFTdGFyKHRva2VuKTsKICAgICAgICBUb2tlbiBrZXl3b3JkID0gdG9rZW4ubmV4dDsKICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBrZXl3b3JkLnN0cmluZ1ZhbHVlOwogICAgICAgIGlmIChpZGVudGljYWwodmFsdWUsICdpbXBvcnQnKSkgewogICAgICAgICAgZGlyZWN0aXZlU3RhdGU/LmNoZWNrSW1wb3J0KHRoaXMsIGtleXdvcmQpOwogICAgICAgICAgdG9rZW4gPSBwYXJzZUltcG9ydChrZXl3b3JkKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2V4cG9ydCcpKSB7CiAgICAgICAgICBkaXJlY3RpdmVTdGF0ZT8uY2hlY2tFeHBvcnQodGhpcywga2V5d29yZCk7CiAgICAgICAgICB0b2tlbiA9IHBhcnNlRXhwb3J0KGtleXdvcmQpOwogICAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnbGlicmFyeScpKSB7CiAgICAgICAgICBkaXJlY3RpdmVTdGF0ZT8uY2hlY2tMaWJyYXJ5KHRoaXMsIGtleXdvcmQpOwogICAgICAgICAgdG9rZW4gPSBwYXJzZUxpYnJhcnlOYW1lKGtleXdvcmQpOwogICAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAncGFydCcpKSB7CiAgICAgICAgICB0b2tlbiA9IHBhcnNlUGFydE9yUGFydE9mKGtleXdvcmQsIGRpcmVjdGl2ZVN0YXRlKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJzsnKSkgewogICAgICAgICAgdG9rZW4gPSBzdGFydDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGlzdGVuZXIuaGFuZGxlRGlyZWN0aXZlc09ubHkoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBsaXN0ZW5lci5lbmRUb3BMZXZlbERlY2xhcmF0aW9uKHRva2VuLm5leHQpOwogICAgfQogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgbGlzdGVuZXIuZW5kQ29tcGlsYXRpb25Vbml0KGNvdW50LCB0b2tlbik7CiAgICAvLyBDbGVhciBmaWVsZHMgdGhhdCBjb3VsZCBsZWFkIHRvIG1lbW9yeSBsZWFrLgogICAgY2FjaGVkUmV3cml0ZXIgPSBudWxsOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFBhcnNlIGEgdG9wLWxldmVsIGRlY2xhcmF0aW9uLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBpcyBvbmx5IGludm9rZWQgZnJvbSBvdXRzaWRlIHRoZSBwYXJzZXIuIEFzIGEgcmVzdWx0LCB0aGlzCiAgLy8vIG1ldGhvZCB0YWtlcyB0aGUgbmV4dCB0b2tlbiB0byBiZSBjb25zdW1lZCByYXRoZXIgdGhhbiB0aGUgbGFzdCBjb25zdW1lZAogIC8vLyB0b2tlbiBhbmQgcmV0dXJucyB0aGUgdG9rZW4gYWZ0ZXIgdGhlIGxhc3QgY29uc3VtZWQgdG9rZW4gcmF0aGVyIHRoYW4gdGhlCiAgLy8vIGxhc3QgY29uc3VtZWQgdG9rZW4uCiAgVG9rZW4gcGFyc2VUb3BMZXZlbERlY2xhcmF0aW9uKFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9CiAgICAgICAgcGFyc2VUb3BMZXZlbERlY2xhcmF0aW9uSW1wbChzeW50aGV0aWNQcmV2aW91c1Rva2VuKHRva2VuKSwgbnVsbCkubmV4dDsKICAgIGxpc3RlbmVyLmVuZFRvcExldmVsRGVjbGFyYXRpb24odG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyB0b3BMZXZlbERlZmluaXRpb246CiAgLy8vICAgY2xhc3NEZWZpbml0aW9uIHwKICAvLy8gICBlbnVtVHlwZSB8CiAgLy8vICAgdHlwZUFsaWFzIHwKICAvLy8gICAnZXh0ZXJuYWwnPyBmdW5jdGlvblNpZ25hdHVyZSAnOycgfAogIC8vLyAgICdleHRlcm5hbCc/IGdldHRlclNpZ25hdHVyZSAnOycgfAogIC8vLyAgICdleHRlcm5hbCcnPyBzZXR0ZXJTaWduYXR1cmUgJzsnIHwKICAvLy8gICBmdW5jdGlvblNpZ25hdHVyZSBmdW5jdGlvbkJvZHkgfAogIC8vLyAgIHJldHVyblR5cGU/ICdnZXQnIGlkZW50aWZpZXIgZnVuY3Rpb25Cb2R5IHwKICAvLy8gICByZXR1cm5UeXBlPyAnc2V0JyBpZGVudGlmaWVyIGZvcm1hbFBhcmFtZXRlckxpc3QgZnVuY3Rpb25Cb2R5IHwKICAvLy8gICAoJ2ZpbmFsJyB8ICdjb25zdCcpIHR5cGU/IHN0YXRpY0ZpbmFsRGVjbGFyYXRpb25MaXN0ICc7JyB8CiAgLy8vICAgdmFyaWFibGVEZWNsYXJhdGlvbiAnOycKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZVRvcExldmVsRGVjbGFyYXRpb25JbXBsKAogICAgICBUb2tlbiB0b2tlbiwgRGlyZWN0aXZlQ29udGV4dCBkaXJlY3RpdmVTdGF0ZSkgewogICAgdG9rZW4gPSBwYXJzZU1ldGFkYXRhU3Rhcih0b2tlbik7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChuZXh0LmlzVG9wTGV2ZWxLZXl3b3JkKSB7CiAgICAgIHJldHVybiBwYXJzZVRvcExldmVsS2V5d29yZERlY2xhcmF0aW9uKHRva2VuLCBuZXh0LCBkaXJlY3RpdmVTdGF0ZSk7CiAgICB9CiAgICBUb2tlbiBzdGFydCA9IHRva2VuOwogICAgLy8gU2tpcCBtb2RpZmllcnMgdG8gZmluZCBhIHRvcCBsZXZlbCBrZXl3b3JkIG9yIGlkZW50aWZpZXIKICAgIGlmIChuZXh0LmlzTW9kaWZpZXIpIHsKICAgICAgaWYgKG9wdGlvbmFsKCd2YXInLCBuZXh0KSB8fAogICAgICAgICAgKChvcHRpb25hbCgnY29uc3QnLCBuZXh0KSB8fCBvcHRpb25hbCgnZmluYWwnLCBuZXh0KSkgJiYKICAgICAgICAgICAgICAvLyBJZ25vcmUgYGNvbnN0IGNsYXNzYCBhbmQgYGZpbmFsIGNsYXNzYCBzbyB0aGF0IGl0IGlzIHJlcG9ydGVkCiAgICAgICAgICAgICAgLy8gYmVsb3cgYXMgYW4gaW52YWxpZCBtb2RpZmllciBvbiBhIGNsYXNzLgogICAgICAgICAgICAgICFvcHRpb25hbCgnY2xhc3MnLCBuZXh0Lm5leHQpKSkgewogICAgICAgIGRpcmVjdGl2ZVN0YXRlPy5jaGVja0RlY2xhcmF0aW9uKCk7CiAgICAgICAgcmV0dXJuIHBhcnNlVG9wTGV2ZWxNZW1iZXJJbXBsKHRva2VuKTsKICAgICAgfQogICAgICB3aGlsZSAodG9rZW4ubmV4dC5pc01vZGlmaWVyKSB7CiAgICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICB9CiAgICB9CiAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChuZXh0LmlzVG9wTGV2ZWxLZXl3b3JkKSB7CiAgICAgIHJldHVybiBwYXJzZVRvcExldmVsS2V5d29yZERlY2xhcmF0aW9uKHN0YXJ0LCBuZXh0LCBkaXJlY3RpdmVTdGF0ZSk7CiAgICB9IGVsc2UgaWYgKG5leHQuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBpbXByb3ZlIHBhcnNlVG9wTGV2ZWxNZW1iZXIKICAgICAgLy8gc28gdGhhdCB3ZSBkb24ndCBwYXJzZSBtb2RpZmllcnMgdHdpY2UuCiAgICAgIGRpcmVjdGl2ZVN0YXRlPy5jaGVja0RlY2xhcmF0aW9uKCk7CiAgICAgIHJldHVybiBwYXJzZVRvcExldmVsTWVtYmVySW1wbChzdGFydCk7CiAgICB9IGVsc2UgaWYgKHN0YXJ0Lm5leHQgIT0gbmV4dCkgewogICAgICBkaXJlY3RpdmVTdGF0ZT8uY2hlY2tEZWNsYXJhdGlvbigpOwogICAgICAvLyBIYW5kbGUgdGhlIGVkZ2UgY2FzZSB3aGVyZSBhIG1vZGlmaWVyIGlzIGJlaW5nIHVzZWQgYXMgYW4gaWRlbnRpZmllcgogICAgICByZXR1cm4gcGFyc2VUb3BMZXZlbE1lbWJlckltcGwoc3RhcnQpOwogICAgfQogICAgLy8gUmVjb3ZlcnkKICAgIGlmIChuZXh0LmlzT3BlcmF0b3IgJiYgb3B0aW9uYWwoJygnLCBuZXh0Lm5leHQpKSB7CiAgICAgIC8vIFRoaXMgYXBwZWFycyB0byBiZSBhIHRvcCBsZXZlbCBvcGVyYXRvciBkZWNsYXJhdGlvbiwgd2hpY2ggaXMgaW52YWxpZC4KICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBmYXN0YS5tZXNzYWdlVG9wTGV2ZWxPcGVyYXRvcik7CiAgICAgIC8vIEluc2VydCBhIHN5bnRoZXRpYyBpZGVudGlmaWVyCiAgICAgIC8vIGFuZCBjb250aW51ZSBwYXJzaW5nIGFzIGEgdG9wIGxldmVsIGZ1bmN0aW9uLgogICAgICByZXdyaXRlci5pbnNlcnRUb2tlbigKICAgICAgICAgIG5leHQsCiAgICAgICAgICBuZXcgU3ludGhldGljU3RyaW5nVG9rZW4oCiAgICAgICAgICAgICAgVG9rZW5UeXBlLklERU5USUZJRVIsCiAgICAgICAgICAgICAgJyNzeW50aGV0aWNfZnVuY3Rpb25fJHtuZXh0LmNoYXJPZmZzZXR9JywKICAgICAgICAgICAgICBuZXh0Lm5leHQuY2hhck9mZnNldCwKICAgICAgICAgICAgICAwKSk7CiAgICAgIHJldHVybiBwYXJzZVRvcExldmVsTWVtYmVySW1wbChuZXh0KTsKICAgIH0KICAgIC8vIElnbm9yZSBhbnkgcHJlY2VkaW5nIG1vZGlmaWVycyBhbmQganVzdCByZXBvcnQgdGhlIHVuZXhwZWN0ZWQgdG9rZW4KICAgIGxpc3RlbmVyLmJlZ2luVG9wTGV2ZWxNZW1iZXIobmV4dCk7CiAgICByZXR1cm4gcGFyc2VJbnZhbGlkVG9wTGV2ZWxEZWNsYXJhdGlvbih0b2tlbik7CiAgfQoKICAvLy8gUGFyc2UgdGhlIG1vZGlmaWVycyBiZWZvcmUgdGhlIGBjbGFzc2Aga2V5d29yZC4KICAvLy8gUmV0dXJuIHRoZSBmaXJzdCBgYWJzdHJhY3RgIG1vZGlmaWVyIG9yIGBudWxsYCBpZiBub3QgZm91bmQuCiAgVG9rZW4gcGFyc2VDbGFzc0RlY2xhcmF0aW9uTW9kaWZpZXJzKFRva2VuIHN0YXJ0LCBUb2tlbiBrZXl3b3JkKSB7CiAgICBUb2tlbiBtb2RpZmllciA9IHN0YXJ0Lm5leHQ7CiAgICB3aGlsZSAobW9kaWZpZXIgIT0ga2V5d29yZCkgewogICAgICBpZiAob3B0aW9uYWwoJ2Fic3RyYWN0JywgbW9kaWZpZXIpKSB7CiAgICAgICAgcGFyc2VUb3BMZXZlbEtleXdvcmRNb2RpZmllcnMobW9kaWZpZXIsIGtleXdvcmQpOwogICAgICAgIHJldHVybiBtb2RpZmllcjsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgIHJlcG9ydFRvcExldmVsTW9kaWZpZXJFcnJvcihtb2RpZmllciwga2V5d29yZCk7CiAgICAgIH0KICAgICAgbW9kaWZpZXIgPSBtb2RpZmllci5uZXh0OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLy8gUmVwb3J0IGVycm9ycyBvbiBhbnkgbW9kaWZpZXJzIGJlZm9yZSB0aGUgc3BlY2lmaWVkIGtleXdvcmQuCiAgdm9pZCBwYXJzZVRvcExldmVsS2V5d29yZE1vZGlmaWVycyhUb2tlbiBzdGFydCwgVG9rZW4ga2V5d29yZCkgewogICAgVG9rZW4gbW9kaWZpZXIgPSBzdGFydC5uZXh0OwogICAgd2hpbGUgKG1vZGlmaWVyICE9IGtleXdvcmQpIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgcmVwb3J0VG9wTGV2ZWxNb2RpZmllckVycm9yKG1vZGlmaWVyLCBrZXl3b3JkKTsKICAgICAgbW9kaWZpZXIgPSBtb2RpZmllci5uZXh0OwogICAgfQogIH0KCiAgLy8gUmVwb3J0IGFuIGVycm9yIGZvciB0aGUgZ2l2ZW4gbW9kaWZpZXIgcHJlY2VkaW5nIGEgdG9wIGxldmVsIGtleXdvcmQKICAvLyBzdWNoIGFzIGBpbXBvcnRgIG9yIGBjbGFzc2AuCiAgdm9pZCByZXBvcnRUb3BMZXZlbE1vZGlmaWVyRXJyb3IoVG9rZW4gbW9kaWZpZXIsIFRva2VuIGFmdGVyTW9kaWZpZXJzKSB7CiAgICBpZiAob3B0aW9uYWwoJ2NvbnN0JywgbW9kaWZpZXIpICYmIG9wdGlvbmFsKCdjbGFzcycsIGFmdGVyTW9kaWZpZXJzKSkgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG1vZGlmaWVyLCBmYXN0YS5tZXNzYWdlQ29uc3RDbGFzcyk7CiAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCdleHRlcm5hbCcsIG1vZGlmaWVyKSkgewogICAgICBpZiAob3B0aW9uYWwoJ2NsYXNzJywgYWZ0ZXJNb2RpZmllcnMpKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihtb2RpZmllciwgZmFzdGEubWVzc2FnZUV4dGVybmFsQ2xhc3MpOwogICAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCdlbnVtJywgYWZ0ZXJNb2RpZmllcnMpKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihtb2RpZmllciwgZmFzdGEubWVzc2FnZUV4dGVybmFsRW51bSk7CiAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ3R5cGVkZWYnLCBhZnRlck1vZGlmaWVycykpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG1vZGlmaWVyLCBmYXN0YS5tZXNzYWdlRXh0ZXJuYWxUeXBlZGVmKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgICBtb2RpZmllciwgZmFzdGEudGVtcGxhdGVFeHRyYW5lb3VzTW9kaWZpZXIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgbW9kaWZpZXIsIGZhc3RhLnRlbXBsYXRlRXh0cmFuZW91c01vZGlmaWVyKTsKICAgIH0KICB9CgogIC8vLyBQYXJzZSBhbnkgdG9wLWxldmVsIGRlY2xhcmF0aW9uIHRoYXQgYmVnaW5zIHdpdGggYSBrZXl3b3JkLgogIC8vLyBbc3RhcnRdIGlzIHRoZSB0b2tlbiBiZWZvcmUgYW55IG1vZGlmaWVycyBwcmVjZWRpbmcgW2tleXdvcmRdLgogIFRva2VuIHBhcnNlVG9wTGV2ZWxLZXl3b3JkRGVjbGFyYXRpb24oCiAgICAgIFRva2VuIHN0YXJ0LCBUb2tlbiBrZXl3b3JkLCBEaXJlY3RpdmVDb250ZXh0IGRpcmVjdGl2ZVN0YXRlKSB7CiAgICBhc3NlcnQoa2V5d29yZC5pc1RvcExldmVsS2V5d29yZCk7CiAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBrZXl3b3JkLnN0cmluZ1ZhbHVlOwogICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2NsYXNzJykpIHsKICAgICAgZGlyZWN0aXZlU3RhdGU/LmNoZWNrRGVjbGFyYXRpb24oKTsKICAgICAgVG9rZW4gYWJzdHJhY3RUb2tlbiA9IHBhcnNlQ2xhc3NEZWNsYXJhdGlvbk1vZGlmaWVycyhzdGFydCwga2V5d29yZCk7CiAgICAgIHJldHVybiBwYXJzZUNsYXNzT3JOYW1lZE1peGluQXBwbGljYXRpb24oYWJzdHJhY3RUb2tlbiwga2V5d29yZCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2VudW0nKSkgewogICAgICBkaXJlY3RpdmVTdGF0ZT8uY2hlY2tEZWNsYXJhdGlvbigpOwogICAgICBwYXJzZVRvcExldmVsS2V5d29yZE1vZGlmaWVycyhzdGFydCwga2V5d29yZCk7CiAgICAgIHJldHVybiBwYXJzZUVudW0oa2V5d29yZCk7CiAgICB9IGVsc2UgewogICAgICAvLyBUaGUgcmVtYWluaW5nIHRvcCBsZXZlbCBrZXl3b3JkcyBhcmUgYnVpbHQtaW4ga2V5d29yZHMKICAgICAgLy8gYW5kIGNhbiBiZSB1c2VkIGluIGEgdG9wIGxldmVsIGRlY2xhcmF0aW9uCiAgICAgIC8vIGFzIGFuIGlkZW50aWZpZXIgc3VjaCBhcyAiYWJzdHJhY3Q8VD4oKSA9PiAwOyIKICAgICAgLy8gb3IgYXMgYSBwcmVmaXggc3VjaCBhcyAiYWJzdHJhY3QuQSBiKCkgPT4gMDsiLgogICAgICBTdHJpbmcgbmV4dFZhbHVlID0ga2V5d29yZC5uZXh0LnN0cmluZ1ZhbHVlOwogICAgICBpZiAoaWRlbnRpY2FsKG5leHRWYWx1ZSwgJygnKSB8fAogICAgICAgICAgaWRlbnRpY2FsKG5leHRWYWx1ZSwgJzwnKSB8fAogICAgICAgICAgaWRlbnRpY2FsKG5leHRWYWx1ZSwgJy4nKSkgewogICAgICAgIGRpcmVjdGl2ZVN0YXRlPy5jaGVja0RlY2xhcmF0aW9uKCk7CiAgICAgICAgcmV0dXJuIHBhcnNlVG9wTGV2ZWxNZW1iZXJJbXBsKHN0YXJ0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwYXJzZVRvcExldmVsS2V5d29yZE1vZGlmaWVycyhzdGFydCwga2V5d29yZCk7CiAgICAgICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ21peGluJykpIHsKICAgICAgICAgIGRpcmVjdGl2ZVN0YXRlPy5jaGVja0RlY2xhcmF0aW9uKCk7CiAgICAgICAgICByZXR1cm4gcGFyc2VNaXhpbihrZXl3b3JkKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ3R5cGVkZWYnKSkgewogICAgICAgICAgZGlyZWN0aXZlU3RhdGU/LmNoZWNrRGVjbGFyYXRpb24oKTsKICAgICAgICAgIHJldHVybiBwYXJzZVR5cGVkZWYoa2V5d29yZCk7CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdsaWJyYXJ5JykpIHsKICAgICAgICAgIGRpcmVjdGl2ZVN0YXRlPy5jaGVja0xpYnJhcnkodGhpcywga2V5d29yZCk7CiAgICAgICAgICByZXR1cm4gcGFyc2VMaWJyYXJ5TmFtZShrZXl3b3JkKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2ltcG9ydCcpKSB7CiAgICAgICAgICBkaXJlY3RpdmVTdGF0ZT8uY2hlY2tJbXBvcnQodGhpcywga2V5d29yZCk7CiAgICAgICAgICByZXR1cm4gcGFyc2VJbXBvcnQoa2V5d29yZCk7CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdleHBvcnQnKSkgewogICAgICAgICAgZGlyZWN0aXZlU3RhdGU/LmNoZWNrRXhwb3J0KHRoaXMsIGtleXdvcmQpOwogICAgICAgICAgcmV0dXJuIHBhcnNlRXhwb3J0KGtleXdvcmQpOwogICAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAncGFydCcpKSB7CiAgICAgICAgICByZXR1cm4gcGFyc2VQYXJ0T3JQYXJ0T2Yoa2V5d29yZCwgZGlyZWN0aXZlU3RhdGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHRocm93ICJJbnRlcm5hbCBlcnJvcjogVW5oYW5kbGVkIHRvcCBsZXZlbCBrZXl3b3JkICckdmFsdWUnLiI7CiAgfQoKICAvLy8gYGBgCiAgLy8vIGxpYnJhcnlEaXJlY3RpdmU6CiAgLy8vICAgJ2xpYnJhcnknIHF1YWxpZmllZCAnOycKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUxpYnJhcnlOYW1lKFRva2VuIGxpYnJhcnlLZXl3b3JkKSB7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2xpYnJhcnknLCBsaWJyYXJ5S2V5d29yZCkpOwogICAgbGlzdGVuZXIuYmVnaW5MaWJyYXJ5TmFtZShsaWJyYXJ5S2V5d29yZCk7CiAgICBUb2tlbiB0b2tlbiA9IHBhcnNlUXVhbGlmaWVkKGxpYnJhcnlLZXl3b3JkLCBJZGVudGlmaWVyQ29udGV4dC5saWJyYXJ5TmFtZSwKICAgICAgICBJZGVudGlmaWVyQ29udGV4dC5saWJyYXJ5TmFtZUNvbnRpbnVhdGlvbik7CiAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICBsaXN0ZW5lci5lbmRMaWJyYXJ5TmFtZShsaWJyYXJ5S2V5d29yZCwgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyBpbXBvcnRQcmVmaXg6CiAgLy8vICAgJ2RlZmVycmVkJz8gJ2FzJyBpZGVudGlmaWVyCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VJbXBvcnRQcmVmaXhPcHQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCdkZWZlcnJlZCcsIG5leHQpICYmIG9wdGlvbmFsKCdhcycsIG5leHQubmV4dCkpIHsKICAgICAgVG9rZW4gZGVmZXJyZWRUb2tlbiA9IG5leHQ7CiAgICAgIFRva2VuIGFzS2V5d29yZCA9IG5leHQubmV4dDsKICAgICAgdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKAogICAgICAgICAgYXNLZXl3b3JkLCBJZGVudGlmaWVyQ29udGV4dC5pbXBvcnRQcmVmaXhEZWNsYXJhdGlvbik7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUltcG9ydFByZWZpeChkZWZlcnJlZFRva2VuLCBhc0tleXdvcmQpOwogICAgfSBlbHNlIGlmIChvcHRpb25hbCgnYXMnLCBuZXh0KSkgewogICAgICBUb2tlbiBhc0tleXdvcmQgPSBuZXh0OwogICAgICB0b2tlbiA9IGVuc3VyZUlkZW50aWZpZXIobmV4dCwgSWRlbnRpZmllckNvbnRleHQuaW1wb3J0UHJlZml4RGVjbGFyYXRpb24pOwogICAgICBsaXN0ZW5lci5oYW5kbGVJbXBvcnRQcmVmaXgobnVsbCwgYXNLZXl3b3JkKTsKICAgIH0gZWxzZSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUltcG9ydFByZWZpeChudWxsLCBudWxsKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gaW1wb3J0RGlyZWN0aXZlOgogIC8vLyAgICdpbXBvcnQnIHVyaSAoJ2lmJyAnKCcgdGVzdCAnKScgdXJpKSogaW1wb3J0UHJlZml4PyBjb21iaW5hdG9yKiAnOycKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUltcG9ydChUb2tlbiBpbXBvcnRLZXl3b3JkKSB7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2ltcG9ydCcsIGltcG9ydEtleXdvcmQpKTsKICAgIGxpc3RlbmVyLmJlZ2luSW1wb3J0KGltcG9ydEtleXdvcmQpOwogICAgVG9rZW4gdG9rZW4gPSBlbnN1cmVMaXRlcmFsU3RyaW5nKGltcG9ydEtleXdvcmQpOwogICAgVG9rZW4gdXJpID0gdG9rZW47CiAgICB0b2tlbiA9IHBhcnNlQ29uZGl0aW9uYWxVcmlTdGFyKHRva2VuKTsKICAgIHRva2VuID0gcGFyc2VJbXBvcnRQcmVmaXhPcHQodG9rZW4pOwogICAgdG9rZW4gPSBwYXJzZUNvbWJpbmF0b3JTdGFyKHRva2VuKS5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCc7JywgdG9rZW4pKSB7CiAgICAgIGxpc3RlbmVyLmVuZEltcG9ydChpbXBvcnRLZXl3b3JkLCB0b2tlbik7CiAgICAgIHJldHVybiB0b2tlbjsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFJlY292ZXJ5CiAgICAgIGxpc3RlbmVyLmVuZEltcG9ydChpbXBvcnRLZXl3b3JkLCBudWxsKTsKICAgICAgcmV0dXJuIHBhcnNlSW1wb3J0UmVjb3ZlcnkodXJpKTsKICAgIH0KICB9CgogIC8vLyBSZWNvdmVyIGdpdmVuIG91dC1vZi1vcmRlciBjbGF1c2VzIGluIGFuIGltcG9ydCBkaXJlY3RpdmUgd2hlcmUgW3Rva2VuXSBpcwogIC8vLyB0aGUgaW1wb3J0IGtleXdvcmQuCiAgVG9rZW4gcGFyc2VJbXBvcnRSZWNvdmVyeShUb2tlbiB0b2tlbikgewogICAgZmluYWwgcHJpbWFyeUxpc3RlbmVyID0gbGlzdGVuZXI7CiAgICBmaW5hbCByZWNvdmVyeUxpc3RlbmVyID0gbmV3IEltcG9ydFJlY292ZXJ5TGlzdGVuZXIoKTsKCiAgICAvLyBSZXBhcnNlIHRvIGRldGVybWluZSB3aGljaCBjbGF1c2VzIGhhdmUgYWxyZWFkeSBiZWVuIHBhcnNlZAogICAgLy8gYnV0IGludGVyY2VwdCB0aGUgZXZlbnRzIHNvIHRoZXkgYXJlIG5vdCBzZW50IHRvIHRoZSBwcmltYXJ5IGxpc3RlbmVyCiAgICBsaXN0ZW5lciA9IHJlY292ZXJ5TGlzdGVuZXI7CiAgICB0b2tlbiA9IHBhcnNlQ29uZGl0aW9uYWxVcmlTdGFyKHRva2VuKTsKICAgIHRva2VuID0gcGFyc2VJbXBvcnRQcmVmaXhPcHQodG9rZW4pOwogICAgdG9rZW4gPSBwYXJzZUNvbWJpbmF0b3JTdGFyKHRva2VuKTsKCiAgICBUb2tlbiBmaXJzdERlZmVycmVkS2V5d29yZCA9IHJlY292ZXJ5TGlzdGVuZXIuZGVmZXJyZWRLZXl3b3JkOwogICAgYm9vbCBoYXNQcmVmaXggPSByZWNvdmVyeUxpc3RlbmVyLmFzS2V5d29yZCAhPSBudWxsOwogICAgYm9vbCBoYXNDb21iaW5hdG9yID0gcmVjb3ZlcnlMaXN0ZW5lci5oYXNDb21iaW5hdG9yOwoKICAgIC8vIFVwZGF0ZSB0aGUgcmVjb3ZlcnkgbGlzdGVuZXIgdG8gZm9yd2FyZCBzdWJzZXF1ZW50IGV2ZW50cwogICAgLy8gdG8gdGhlIHByaW1hcnkgbGlzdGVuZXIKICAgIHJlY292ZXJ5TGlzdGVuZXIubGlzdGVuZXIgPSBwcmltYXJ5TGlzdGVuZXI7CgogICAgLy8gUGFyc2UgYWRkaXRpb25hbCBvdXQtb2Ytb3JkZXIgY2xhdXNlcy4KICAgIFRva2VuIHNlbWljb2xvbjsKICAgIGRvIHsKICAgICAgVG9rZW4gc3RhcnQgPSB0b2tlbi5uZXh0OwoKICAgICAgLy8gQ2hlY2sgZm9yIGV4dHJhbmVvdXMgdG9rZW4gaW4gdGhlIG1pZGRsZSBvZiBhbiBpbXBvcnQgc3RhdGVtZW50LgogICAgICB0b2tlbiA9IHNraXBVbmV4cGVjdGVkVG9rZW5PcHQoCiAgICAgICAgICB0b2tlbiwgY29uc3QgPFN0cmluZz5bJ2lmJywgJ2RlZmVycmVkJywgJ2FzJywgJ2hpZGUnLCAnc2hvdycsICc7J10pOwoKICAgICAgLy8gRHVyaW5nIHJlY292ZXJ5LCBjbGF1c2VzIGFyZSBwYXJzZWQgaW4gdGhlIHNhbWUgb3JkZXIKICAgICAgLy8gYW5kIGdlbmVyYXRlIHRoZSBzYW1lIGV2ZW50cyBhcyBpbiB0aGUgcGFyc2VJbXBvcnQgbWV0aG9kIGFib3ZlLgogICAgICByZWNvdmVyeUxpc3RlbmVyLmNsZWFyKCk7CiAgICAgIHRva2VuID0gcGFyc2VDb25kaXRpb25hbFVyaVN0YXIodG9rZW4pOwogICAgICBpZiAocmVjb3ZlcnlMaXN0ZW5lci5pZktleXdvcmQgIT0gbnVsbCkgewogICAgICAgIGlmIChmaXJzdERlZmVycmVkS2V5d29yZCAhPSBudWxsKSB7CiAgICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogcmVwb3J0IGVycm9yIGluZGljYXRpbmcgY29uZGl0aW9uYWwgc2hvdWxkCiAgICAgICAgICAvLyBiZSBtb3ZlZCBiZWZvcmUgZGVmZXJyZWQga2V5d29yZAogICAgICAgIH0gZWxzZSBpZiAoaGFzUHJlZml4KSB7CiAgICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogcmVwb3J0IGVycm9yIGluZGljYXRpbmcgY29uZGl0aW9uYWwgc2hvdWxkCiAgICAgICAgICAvLyBiZSBtb3ZlZCBiZWZvcmUgcHJlZml4IGNsYXVzZQogICAgICAgIH0gZWxzZSBpZiAoaGFzQ29tYmluYXRvcikgewogICAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IHJlcG9ydCBlcnJvciBpbmRpY2F0aW5nIGNvbmRpdGlvbmFsIHNob3VsZAogICAgICAgICAgLy8gYmUgbW92ZWQgYmVmb3JlIGNvbWJpbmF0b3JzCiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAob3B0aW9uYWwoJ2RlZmVycmVkJywgdG9rZW4ubmV4dCkgJiYKICAgICAgICAgICFvcHRpb25hbCgnYXMnLCB0b2tlbi5uZXh0Lm5leHQpKSB7CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlSW1wb3J0UHJlZml4KHRva2VuLm5leHQsIG51bGwpOwogICAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0b2tlbiA9IHBhcnNlSW1wb3J0UHJlZml4T3B0KHRva2VuKTsKICAgICAgfQogICAgICBpZiAocmVjb3ZlcnlMaXN0ZW5lci5kZWZlcnJlZEtleXdvcmQgIT0gbnVsbCkgewogICAgICAgIGlmIChmaXJzdERlZmVycmVkS2V5d29yZCAhPSBudWxsKSB7CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgIHJlY292ZXJ5TGlzdGVuZXIuZGVmZXJyZWRLZXl3b3JkLCBmYXN0YS5tZXNzYWdlRHVwbGljYXRlRGVmZXJyZWQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoaGFzUHJlZml4KSB7CiAgICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IocmVjb3ZlcnlMaXN0ZW5lci5kZWZlcnJlZEtleXdvcmQsCiAgICAgICAgICAgICAgICBmYXN0YS5tZXNzYWdlRGVmZXJyZWRBZnRlclByZWZpeCk7CiAgICAgICAgICB9CiAgICAgICAgICBmaXJzdERlZmVycmVkS2V5d29yZCA9IHJlY292ZXJ5TGlzdGVuZXIuZGVmZXJyZWRLZXl3b3JkOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAocmVjb3ZlcnlMaXN0ZW5lci5hc0tleXdvcmQgIT0gbnVsbCkgewogICAgICAgIGlmIChoYXNQcmVmaXgpIHsKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgICAgcmVjb3ZlcnlMaXN0ZW5lci5hc0tleXdvcmQsIGZhc3RhLm1lc3NhZ2VEdXBsaWNhdGVQcmVmaXgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoaGFzQ29tYmluYXRvcikgewogICAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgICAgcmVjb3ZlcnlMaXN0ZW5lci5hc0tleXdvcmQsIGZhc3RhLm1lc3NhZ2VQcmVmaXhBZnRlckNvbWJpbmF0b3IpOwogICAgICAgICAgfQogICAgICAgICAgaGFzUHJlZml4ID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRva2VuID0gcGFyc2VDb21iaW5hdG9yU3Rhcih0b2tlbik7CiAgICAgIGhhc0NvbWJpbmF0b3IgPSBoYXNDb21iaW5hdG9yIHx8IHJlY292ZXJ5TGlzdGVuZXIuaGFzQ29tYmluYXRvcjsKCiAgICAgIGlmIChvcHRpb25hbCgnOycsIHRva2VuLm5leHQpKSB7CiAgICAgICAgc2VtaWNvbG9uID0gdG9rZW4ubmV4dDsKICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwoc3RhcnQsIHRva2VuLm5leHQpKSB7CiAgICAgICAgLy8gSWYgbm8gZm9yd2FyZCBwcm9ncmVzcyB3YXMgbWFkZSwgaW5zZXJ0ICc7JyBzbyB0aGF0IHdlIGV4aXQgbG9vcC4KICAgICAgICBzZW1pY29sb24gPSBlbnN1cmVTZW1pY29sb24odG9rZW4pOwogICAgICB9CiAgICAgIGxpc3RlbmVyLmhhbmRsZVJlY292ZXJJbXBvcnQoc2VtaWNvbG9uKTsKICAgIH0gd2hpbGUgKHNlbWljb2xvbiA9PSBudWxsKTsKCiAgICBpZiAoZmlyc3REZWZlcnJlZEtleXdvcmQgIT0gbnVsbCAmJiAhaGFzUHJlZml4KSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBmaXJzdERlZmVycmVkS2V5d29yZCwgZmFzdGEubWVzc2FnZU1pc3NpbmdQcmVmaXhJbkRlZmVycmVkSW1wb3J0KTsKICAgIH0KCiAgICByZXR1cm4gc2VtaWNvbG9uOwogIH0KCiAgLy8vIGBgYAogIC8vLyBjb25kaXRpb25hbFVyaXM6CiAgLy8vICAgY29uZGl0aW9uYWxVcmkqCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VDb25kaXRpb25hbFVyaVN0YXIoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyLmJlZ2luQ29uZGl0aW9uYWxVcmlzKHRva2VuLm5leHQpOwogICAgaW50IGNvdW50ID0gMDsKICAgIHdoaWxlIChvcHRpb25hbCgnaWYnLCB0b2tlbi5uZXh0KSkgewogICAgICBjb3VudCsrOwogICAgICB0b2tlbiA9IHBhcnNlQ29uZGl0aW9uYWxVcmkodG9rZW4pOwogICAgfQogICAgbGlzdGVuZXIuZW5kQ29uZGl0aW9uYWxVcmlzKGNvdW50KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gY29uZGl0aW9uYWxVcmk6CiAgLy8vICAgJ2lmJyAnKCcgZG90dGVkTmFtZSAoJz09JyBsaXRlcmFsU3RyaW5nKT8gJyknIHVyaQogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlQ29uZGl0aW9uYWxVcmkoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIGlmS2V5d29yZCA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnaWYnLCB0b2tlbikpOwogICAgbGlzdGVuZXIuYmVnaW5Db25kaXRpb25hbFVyaSh0b2tlbik7CiAgICBUb2tlbiBsZWZ0UGFyZW4gPSB0b2tlbi5uZXh0OwogICAgaWYgKCFvcHRpb25hbCgnKCcsIGxlZnRQYXJlbikpIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIGxlZnRQYXJlbiwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCcoJykpOwogICAgICBsZWZ0UGFyZW4gPSByZXdyaXRlci5pbnNlcnRQYXJlbnModG9rZW4sIHRydWUpOwogICAgfQogICAgdG9rZW4gPSBwYXJzZURvdHRlZE5hbWUobGVmdFBhcmVuKTsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgVG9rZW4gZXF1YWxpdHlTaWduOwogICAgaWYgKG9wdGlvbmFsKCc9PScsIG5leHQpKSB7CiAgICAgIGVxdWFsaXR5U2lnbiA9IG5leHQ7CiAgICAgIHRva2VuID0gZW5zdXJlTGl0ZXJhbFN0cmluZyhuZXh0KTsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICB9CiAgICBpZiAobmV4dCAhPSBsZWZ0UGFyZW4uZW5kR3JvdXApIHsKICAgICAgVG9rZW4gZW5kR3JvdXAgPSBsZWZ0UGFyZW4uZW5kR3JvdXA7CiAgICAgIGlmIChlbmRHcm91cC5pc1N5bnRoZXRpYykgewogICAgICAgIC8vIFRoZSBzY2FubmVyIGRpZCBub3QgcGxhY2UgdGhlIHN5bnRoZXRpYyAnKScgY29ycmVjdGx5LCBzbyBtb3ZlIGl0LgogICAgICAgIG5leHQgPSByZXdyaXRlci5tb3ZlU3ludGhldGljKHRva2VuLCBlbmRHcm91cCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbihuZXh0LCBmYXN0YS50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbik7CiAgICAgICAgbmV4dCA9IGVuZEdyb3VwOwogICAgICB9CiAgICB9CiAgICB0b2tlbiA9IG5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJyknLCB0b2tlbikpOwoKICAgIHRva2VuID0gZW5zdXJlTGl0ZXJhbFN0cmluZyh0b2tlbik7CiAgICBsaXN0ZW5lci5lbmRDb25kaXRpb25hbFVyaShpZktleXdvcmQsIGxlZnRQYXJlbiwgZXF1YWxpdHlTaWduKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gZG90dGVkTmFtZToKICAvLy8gICBpZGVudGlmaWVyICgnLicgaWRlbnRpZmllcikqCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VEb3R0ZWROYW1lKFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9IGVuc3VyZUlkZW50aWZpZXIodG9rZW4sIElkZW50aWZpZXJDb250ZXh0LmRvdHRlZE5hbWUpOwogICAgVG9rZW4gZmlyc3RJZGVudGlmaWVyID0gdG9rZW47CiAgICBpbnQgY291bnQgPSAxOwogICAgd2hpbGUgKG9wdGlvbmFsKCcuJywgdG9rZW4ubmV4dCkpIHsKICAgICAgdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKAogICAgICAgICAgdG9rZW4ubmV4dCwgSWRlbnRpZmllckNvbnRleHQuZG90dGVkTmFtZUNvbnRpbnVhdGlvbik7CiAgICAgIGNvdW50Kys7CiAgICB9CiAgICBsaXN0ZW5lci5oYW5kbGVEb3R0ZWROYW1lKGNvdW50LCBmaXJzdElkZW50aWZpZXIpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyBleHBvcnREaXJlY3RpdmU6CiAgLy8vICAgJ2V4cG9ydCcgdXJpIGNvbmRpdGlvbmFsLXVyaXMqIGNvbWJpbmF0b3IqICc7JwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlRXhwb3J0KFRva2VuIGV4cG9ydEtleXdvcmQpIHsKICAgIGFzc2VydChvcHRpb25hbCgnZXhwb3J0JywgZXhwb3J0S2V5d29yZCkpOwogICAgbGlzdGVuZXIuYmVnaW5FeHBvcnQoZXhwb3J0S2V5d29yZCk7CiAgICBUb2tlbiB0b2tlbiA9IGVuc3VyZUxpdGVyYWxTdHJpbmcoZXhwb3J0S2V5d29yZCk7CiAgICB0b2tlbiA9IHBhcnNlQ29uZGl0aW9uYWxVcmlTdGFyKHRva2VuKTsKICAgIHRva2VuID0gcGFyc2VDb21iaW5hdG9yU3Rhcih0b2tlbik7CiAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICBsaXN0ZW5lci5lbmRFeHBvcnQoZXhwb3J0S2V5d29yZCwgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyBjb21iaW5hdG9yczoKICAvLy8gICAoaGlkZUNvbWJpbmF0b3IgfCBzaG93Q29tYmluYXRvcikqCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VDb21iaW5hdG9yU3RhcihUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBsaXN0ZW5lci5iZWdpbkNvbWJpbmF0b3JzKG5leHQpOwogICAgaW50IGNvdW50ID0gMDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIFN0cmluZyB2YWx1ZSA9IG5leHQuc3RyaW5nVmFsdWU7CiAgICAgIGlmIChpZGVudGljYWwoJ2hpZGUnLCB2YWx1ZSkpIHsKICAgICAgICB0b2tlbiA9IHBhcnNlSGlkZSh0b2tlbik7CiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCdzaG93JywgdmFsdWUpKSB7CiAgICAgICAgdG9rZW4gPSBwYXJzZVNob3codG9rZW4pOwogICAgICB9IGVsc2UgewogICAgICAgIGxpc3RlbmVyLmVuZENvbWJpbmF0b3JzKGNvdW50KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgY291bnQrKzsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gaGlkZUNvbWJpbmF0b3I6CiAgLy8vICAgJ2hpZGUnIGlkZW50aWZpZXJMaXN0CiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VIaWRlKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBoaWRlS2V5d29yZCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2hpZGUnLCBoaWRlS2V5d29yZCkpOwogICAgbGlzdGVuZXIuYmVnaW5IaWRlKGhpZGVLZXl3b3JkKTsKICAgIHRva2VuID0gcGFyc2VJZGVudGlmaWVyTGlzdChoaWRlS2V5d29yZCk7CiAgICBsaXN0ZW5lci5lbmRIaWRlKGhpZGVLZXl3b3JkKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gc2hvd0NvbWJpbmF0b3I6CiAgLy8vICAgJ3Nob3cnIGlkZW50aWZpZXJMaXN0CiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VTaG93KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBzaG93S2V5d29yZCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ3Nob3cnLCBzaG93S2V5d29yZCkpOwogICAgbGlzdGVuZXIuYmVnaW5TaG93KHNob3dLZXl3b3JkKTsKICAgIHRva2VuID0gcGFyc2VJZGVudGlmaWVyTGlzdChzaG93S2V5d29yZCk7CiAgICBsaXN0ZW5lci5lbmRTaG93KHNob3dLZXl3b3JkKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gaWRlbnRpZmllckxpc3Q6CiAgLy8vICAgaWRlbnRpZmllciAoJywnIGlkZW50aWZpZXIpKgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlSWRlbnRpZmllckxpc3QoVG9rZW4gdG9rZW4pIHsKICAgIHRva2VuID0gZW5zdXJlSWRlbnRpZmllcih0b2tlbiwgSWRlbnRpZmllckNvbnRleHQuY29tYmluYXRvcik7CiAgICBpbnQgY291bnQgPSAxOwogICAgd2hpbGUgKG9wdGlvbmFsKCcsJywgdG9rZW4ubmV4dCkpIHsKICAgICAgdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKHRva2VuLm5leHQsIElkZW50aWZpZXJDb250ZXh0LmNvbWJpbmF0b3IpOwogICAgICBjb3VudCsrOwogICAgfQogICAgbGlzdGVuZXIuaGFuZGxlSWRlbnRpZmllckxpc3QoY291bnQpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyB0eXBlTGlzdDoKICAvLy8gICB0eXBlICgnLCcgdHlwZSkqCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VUeXBlTGlzdChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXIuYmVnaW5UeXBlTGlzdCh0b2tlbi5uZXh0KTsKICAgIHRva2VuID0gY29tcHV0ZVR5cGUodG9rZW4sIHRydWUpLmVuc3VyZVR5cGVPclZvaWQodG9rZW4sIHRoaXMpOwogICAgaW50IGNvdW50ID0gMTsKICAgIHdoaWxlIChvcHRpb25hbCgnLCcsIHRva2VuLm5leHQpKSB7CiAgICAgIHRva2VuID0gY29tcHV0ZVR5cGUodG9rZW4ubmV4dCwgdHJ1ZSkuZW5zdXJlVHlwZU9yVm9pZCh0b2tlbi5uZXh0LCB0aGlzKTsKICAgICAgY291bnQrKzsKICAgIH0KICAgIGxpc3RlbmVyLmVuZFR5cGVMaXN0KGNvdW50KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlUGFydE9yUGFydE9mKFRva2VuIHBhcnRLZXl3b3JkLCBEaXJlY3RpdmVDb250ZXh0IGRpcmVjdGl2ZVN0YXRlKSB7CiAgICBhc3NlcnQob3B0aW9uYWwoJ3BhcnQnLCBwYXJ0S2V5d29yZCkpOwogICAgaWYgKG9wdGlvbmFsKCdvZicsIHBhcnRLZXl3b3JkLm5leHQpKSB7CiAgICAgIGRpcmVjdGl2ZVN0YXRlPy5jaGVja1BhcnRPZih0aGlzLCBwYXJ0S2V5d29yZCk7CiAgICAgIHJldHVybiBwYXJzZVBhcnRPZihwYXJ0S2V5d29yZCk7CiAgICB9IGVsc2UgewogICAgICBkaXJlY3RpdmVTdGF0ZT8uY2hlY2tQYXJ0KHRoaXMsIHBhcnRLZXl3b3JkKTsKICAgICAgcmV0dXJuIHBhcnNlUGFydChwYXJ0S2V5d29yZCk7CiAgICB9CiAgfQoKICAvLy8gYGBgCiAgLy8vIHBhcnREaXJlY3RpdmU6CiAgLy8vICAgJ3BhcnQnIHVyaSAnOycKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZVBhcnQoVG9rZW4gcGFydEtleXdvcmQpIHsKICAgIGFzc2VydChvcHRpb25hbCgncGFydCcsIHBhcnRLZXl3b3JkKSk7CiAgICBsaXN0ZW5lci5iZWdpblBhcnQocGFydEtleXdvcmQpOwogICAgVG9rZW4gdG9rZW4gPSBlbnN1cmVMaXRlcmFsU3RyaW5nKHBhcnRLZXl3b3JkKTsKICAgIHRva2VuID0gZW5zdXJlU2VtaWNvbG9uKHRva2VuKTsKICAgIGxpc3RlbmVyLmVuZFBhcnQocGFydEtleXdvcmQsIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gcGFydE9mRGlyZWN0aXZlOgogIC8vLyAgICdwYXJ0JyAnb2YnIChxdWFsaWZpZWQgfCB1cmkpICc7JwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlUGFydE9mKFRva2VuIHBhcnRLZXl3b3JkKSB7CiAgICBUb2tlbiBvZktleXdvcmQgPSBwYXJ0S2V5d29yZC5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdwYXJ0JywgcGFydEtleXdvcmQpKTsKICAgIGFzc2VydChvcHRpb25hbCgnb2YnLCBvZktleXdvcmQpKTsKICAgIGxpc3RlbmVyLmJlZ2luUGFydE9mKHBhcnRLZXl3b3JkKTsKICAgIGJvb2wgaGFzTmFtZSA9IG9mS2V5d29yZC5uZXh0LmlzSWRlbnRpZmllcjsKICAgIFRva2VuIHRva2VuOwogICAgaWYgKGhhc05hbWUpIHsKICAgICAgdG9rZW4gPSBwYXJzZVF1YWxpZmllZChvZktleXdvcmQsIElkZW50aWZpZXJDb250ZXh0LnBhcnROYW1lLAogICAgICAgICAgSWRlbnRpZmllckNvbnRleHQucGFydE5hbWVDb250aW51YXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgdG9rZW4gPSBlbnN1cmVMaXRlcmFsU3RyaW5nKG9mS2V5d29yZCk7CiAgICB9CiAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICBsaXN0ZW5lci5lbmRQYXJ0T2YocGFydEtleXdvcmQsIG9mS2V5d29yZCwgdG9rZW4sIGhhc05hbWUpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyBtZXRhZGF0YToKICAvLy8gICBhbm5vdGF0aW9uKgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlTWV0YWRhdGFTdGFyKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lci5iZWdpbk1ldGFkYXRhU3Rhcih0b2tlbi5uZXh0KTsKICAgIGludCBjb3VudCA9IDA7CiAgICB3aGlsZSAob3B0aW9uYWwoJ0AnLCB0b2tlbi5uZXh0KSkgewogICAgICB0b2tlbiA9IHBhcnNlTWV0YWRhdGEodG9rZW4pOwogICAgICBjb3VudCsrOwogICAgfQogICAgbGlzdGVuZXIuZW5kTWV0YWRhdGFTdGFyKGNvdW50KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gYW5ub3RhdGlvbjoKICAvLy8gICAnQCcgcXVhbGlmaWVkICgnLicgaWRlbnRpZmllcik/IGFyZ3VtZW50cz8KICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZU1ldGFkYXRhKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBhdFRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnQCcsIGF0VG9rZW4pKTsKICAgIGxpc3RlbmVyLmJlZ2luTWV0YWRhdGEoYXRUb2tlbik7CiAgICB0b2tlbiA9IGVuc3VyZUlkZW50aWZpZXIoYXRUb2tlbiwgSWRlbnRpZmllckNvbnRleHQubWV0YWRhdGFSZWZlcmVuY2UpOwogICAgdG9rZW4gPQogICAgICAgIHBhcnNlUXVhbGlmaWVkUmVzdE9wdCh0b2tlbiwgSWRlbnRpZmllckNvbnRleHQubWV0YWRhdGFDb250aW51YXRpb24pOwogICAgaWYgKG9wdGlvbmFsKCI8IiwgdG9rZW4ubmV4dCkpIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0b2tlbi5uZXh0LCBmYXN0YS5tZXNzYWdlTWV0YWRhdGFUeXBlQXJndW1lbnRzKTsKICAgIH0KICAgIHRva2VuID0gY29tcHV0ZVR5cGVQYXJhbU9yQXJnKHRva2VuKS5wYXJzZUFyZ3VtZW50cyh0b2tlbiwgdGhpcyk7CiAgICBUb2tlbiBwZXJpb2QgPSBudWxsOwogICAgaWYgKG9wdGlvbmFsKCcuJywgdG9rZW4ubmV4dCkpIHsKICAgICAgcGVyaW9kID0gdG9rZW4ubmV4dDsKICAgICAgdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKAogICAgICAgICAgcGVyaW9kLCBJZGVudGlmaWVyQ29udGV4dC5tZXRhZGF0YUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cyk7CiAgICB9CiAgICB0b2tlbiA9IHBhcnNlQXJndW1lbnRzT3B0KHRva2VuKTsKICAgIGxpc3RlbmVyLmVuZE1ldGFkYXRhKGF0VG9rZW4sIHBlcmlvZCwgdG9rZW4ubmV4dCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIHNjcmlwdFRhZzoKICAvLy8gICAnIyEnICjLnE5FV0xJTkUpKiBORVdMSU5FCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VTY3JpcHQoVG9rZW4gdG9rZW4pIHsKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGljYWwodG9rZW4udHlwZSwgVG9rZW5UeXBlLlNDUklQVF9UQUcpKTsKICAgIGxpc3RlbmVyLmhhbmRsZVNjcmlwdCh0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIHR5cGVBbGlhczoKICAvLy8gICBtZXRhZGF0YSAndHlwZWRlZicgdHlwZUFsaWFzQm9keSB8CiAgLy8vICAgbWV0YWRhdGEgJ3R5cGVkZWYnIGlkZW50aWZpZXIgdHlwZVBhcmFtZXRlcnM/ICc9JyBmdW5jdGlvblR5cGUgJzsnCiAgLy8vIDsKICAvLy8KICAvLy8gZnVuY3Rpb25UeXBlOgogIC8vLyAgIHJldHVyblR5cGU/ICdGdW5jdGlvbicgdHlwZVBhcmFtZXRlcnM/IHBhcmFtZXRlclR5cGVMaXN0CiAgLy8vCiAgLy8vIHR5cGVBbGlhc0JvZHk6CiAgLy8vICAgZnVuY3Rpb25UeXBlQWxpYXMKICAvLy8gOwogIC8vLwogIC8vLyBmdW5jdGlvblR5cGVBbGlhczoKICAvLy8gICBmdW5jdGlvblByZWZpeCB0eXBlUGFyYW1ldGVycz8gZm9ybWFsUGFyYW1ldGVyTGlzdCDigJg74oCZCiAgLy8vIDsKICAvLy8KICAvLy8gZnVuY3Rpb25QcmVmaXg6CiAgLy8vICAgcmV0dXJuVHlwZT8gaWRlbnRpZmllcgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlVHlwZWRlZihUb2tlbiB0eXBlZGVmS2V5d29yZCkgewogICAgYXNzZXJ0KG9wdGlvbmFsKCd0eXBlZGVmJywgdHlwZWRlZktleXdvcmQpKTsKICAgIGxpc3RlbmVyLmJlZ2luRnVuY3Rpb25UeXBlQWxpYXModHlwZWRlZktleXdvcmQpOwogICAgVHlwZUluZm8gdHlwZUluZm8gPSBjb21wdXRlVHlwZSh0eXBlZGVmS2V5d29yZCwgZmFsc2UpOwogICAgVG9rZW4gdG9rZW4gPSB0eXBlSW5mby5za2lwVHlwZSh0eXBlZGVmS2V5d29yZCkubmV4dDsKICAgIFRva2VuIGVxdWFsczsKICAgIFR5cGVQYXJhbU9yQXJnSW5mbyB0eXBlUGFyYW0gPSBjb21wdXRlVHlwZVBhcmFtT3JBcmcodG9rZW4sIHRydWUpOwogICAgaWYgKHR5cGVJbmZvID09IG5vVHlwZSAmJgogICAgICAgICh0b2tlbi5raW5kID09IElERU5USUZJRVJfVE9LRU4gfHwgdG9rZW4udHlwZS5pc1BzZXVkbykgJiYKICAgICAgICBvcHRpb25hbCgnPScsIHR5cGVQYXJhbS5za2lwKHRva2VuKS5uZXh0KSkgewogICAgICBsaXN0ZW5lci5oYW5kbGVJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC50eXBlZGVmRGVjbGFyYXRpb24pOwogICAgICBlcXVhbHMgPSB0eXBlUGFyYW0ucGFyc2VWYXJpYWJsZXModG9rZW4sIHRoaXMpLm5leHQ7CiAgICAgIGFzc2VydChvcHRpb25hbCgnPScsIGVxdWFscykpOwogICAgICB0b2tlbiA9IGNvbXB1dGVUeXBlKGVxdWFscywgdHJ1ZSkuZW5zdXJlVHlwZU9yVm9pZChlcXVhbHMsIHRoaXMpOwogICAgfSBlbHNlIHsKICAgICAgdG9rZW4gPSB0eXBlSW5mby5wYXJzZVR5cGUodHlwZWRlZktleXdvcmQsIHRoaXMpOwogICAgICB0b2tlbiA9IGVuc3VyZUlkZW50aWZpZXIodG9rZW4sIElkZW50aWZpZXJDb250ZXh0LnR5cGVkZWZEZWNsYXJhdGlvbik7CiAgICAgIHRva2VuID0gdHlwZVBhcmFtLnBhcnNlVmFyaWFibGVzKHRva2VuLCB0aGlzKTsKICAgICAgdG9rZW4gPQogICAgICAgICAgcGFyc2VGb3JtYWxQYXJhbWV0ZXJzUmVxdWlyZWRPcHQodG9rZW4sIE1lbWJlcktpbmQuRnVuY3Rpb25UeXBlQWxpYXMpOwogICAgfQogICAgdG9rZW4gPSBlbnN1cmVTZW1pY29sb24odG9rZW4pOwogICAgbGlzdGVuZXIuZW5kRnVuY3Rpb25UeXBlQWxpYXModHlwZWRlZktleXdvcmQsIGVxdWFscywgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFBhcnNlIGEgbWl4aW4gYXBwbGljYXRpb24gc3RhcnRpbmcgZnJvbSBgd2l0aGAuIEFzc3VtZXMgdGhhdCB0aGUgZmlyc3QKICAvLy8gdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHBhcnNlZC4KICBUb2tlbiBwYXJzZU1peGluQXBwbGljYXRpb25SZXN0KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiB3aXRoS2V5d29yZCA9IHRva2VuLm5leHQ7CiAgICBpZiAoIW9wdGlvbmFsKCd3aXRoJywgd2l0aEtleXdvcmQpKSB7CiAgICAgIC8vIFJlY292ZXJ5OiBSZXBvcnQgYW4gZXJyb3IgYW5kIGluc2VydCBzeW50aGV0aWMgYHdpdGhgIGNsYXVzZS4KICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIHdpdGhLZXl3b3JkLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQnV0R290LndpdGhBcmd1bWVudHMoJ3dpdGgnKSk7CiAgICAgIHdpdGhLZXl3b3JkID0KICAgICAgICAgIG5ldyBTeW50aGV0aWNLZXl3b3JkVG9rZW4oS2V5d29yZC5XSVRILCB3aXRoS2V5d29yZC5jaGFyT2Zmc2V0KTsKICAgICAgcmV3cml0ZXIuaW5zZXJ0VG9rZW4odG9rZW4sIHdpdGhLZXl3b3JkKTsKICAgICAgaWYgKCFpc1ZhbGlkVHlwZVJlZmVyZW5jZSh3aXRoS2V5d29yZC5uZXh0KSkgewogICAgICAgIHJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIod2l0aEtleXdvcmQpOwogICAgICB9CiAgICB9CiAgICB0b2tlbiA9IHBhcnNlVHlwZUxpc3Qod2l0aEtleXdvcmQpOwogICAgbGlzdGVuZXIuaGFuZGxlTmFtZWRNaXhpbkFwcGxpY2F0aW9uV2l0aENsYXVzZSh3aXRoS2V5d29yZCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZVdpdGhDbGF1c2VPcHQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIHdpdGhLZXl3b3JkID0gdG9rZW4ubmV4dDsKICAgIGlmIChvcHRpb25hbCgnd2l0aCcsIHdpdGhLZXl3b3JkKSkgewogICAgICB0b2tlbiA9IHBhcnNlVHlwZUxpc3Qod2l0aEtleXdvcmQpOwogICAgICBsaXN0ZW5lci5oYW5kbGVDbGFzc1dpdGhDbGF1c2Uod2l0aEtleXdvcmQpOwogICAgfSBlbHNlIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlQ2xhc3NOb1dpdGhDbGF1c2UoKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBQYXJzZSB0aGUgZm9ybWFsIHBhcmFtZXRlcnMgb2YgYSBnZXR0ZXIgKHdoaWNoIHNob3VsZG4ndCBoYXZlIHBhcmFtZXRlcnMpCiAgLy8vIG9yIGZ1bmN0aW9uIG9yIG1ldGhvZC4KICBUb2tlbiBwYXJzZUdldHRlck9yRm9ybWFsUGFyYW1ldGVycygKICAgICAgVG9rZW4gdG9rZW4sIFRva2VuIG5hbWUsIGJvb2wgaXNHZXR0ZXIsIE1lbWJlcktpbmQga2luZCkgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoIigiLCBuZXh0KSkgewogICAgICBpZiAoaXNHZXR0ZXIpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGZhc3RhLm1lc3NhZ2VHZXR0ZXJXaXRoRm9ybWFscyk7CiAgICAgIH0KICAgICAgdG9rZW4gPSBwYXJzZUZvcm1hbFBhcmFtZXRlcnModG9rZW4sIGtpbmQpOwogICAgfSBlbHNlIGlmIChpc0dldHRlcikgewogICAgICBsaXN0ZW5lci5oYW5kbGVOb0Zvcm1hbFBhcmFtZXRlcnMobmV4dCwga2luZCk7CiAgICB9IGVsc2UgewogICAgICAvLyBSZWNvdmVyeQogICAgICBpZiAob3B0aW9uYWwoJ29wZXJhdG9yJywgbmFtZSkpIHsKICAgICAgICBUb2tlbiBuZXh0ID0gbmFtZS5uZXh0OwogICAgICAgIGlmIChuZXh0LmlzT3BlcmF0b3IpIHsKICAgICAgICAgIG5hbWUgPSBuZXh0OwogICAgICAgIH0gZWxzZSBpZiAoaXNVbmFyeU1pbnVzKG5leHQpKSB7CiAgICAgICAgICBuYW1lID0gbmV4dC5uZXh0OwogICAgICAgIH0KICAgICAgfQogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5hbWUsIG1pc3NpbmdQYXJhbWV0ZXJNZXNzYWdlKGtpbmQpKTsKICAgICAgdG9rZW4gPSByZXdyaXRlci5pbnNlcnRQYXJlbnModG9rZW4sIGZhbHNlKTsKICAgICAgdG9rZW4gPSBwYXJzZUZvcm1hbFBhcmFtZXRlcnNSZXN0KHRva2VuLCBraW5kKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlRm9ybWFsUGFyYW1ldGVyc09wdChUb2tlbiB0b2tlbiwgTWVtYmVyS2luZCBraW5kKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChvcHRpb25hbCgnKCcsIG5leHQpKSB7CiAgICAgIHRva2VuID0gcGFyc2VGb3JtYWxQYXJhbWV0ZXJzKHRva2VuLCBraW5kKTsKICAgIH0gZWxzZSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZU5vRm9ybWFsUGFyYW1ldGVycyhuZXh0LCBraW5kKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHNraXBGb3JtYWxQYXJhbWV0ZXJzKFRva2VuIHRva2VuLCBNZW1iZXJLaW5kIGtpbmQpIHsKICAgIHJldHVybiBza2lwRm9ybWFsUGFyYW1ldGVyc1Jlc3QodG9rZW4ubmV4dCwga2luZCk7CiAgfQoKICBUb2tlbiBza2lwRm9ybWFsUGFyYW1ldGVyc1Jlc3QoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgYXNzZXJ0KG9wdGlvbmFsKCcoJywgdG9rZW4pKTsKICAgIC8vIFRPRE8oYWhlKTogU2hvdWxkbid0IHRoaXMgYmUgYGJlZ2luRm9ybWFsUGFyYW1ldGVyc2A/CiAgICBsaXN0ZW5lci5iZWdpbk9wdGlvbmFsRm9ybWFsUGFyYW1ldGVycyh0b2tlbik7CiAgICBUb2tlbiBjbG9zZUJyYWNlID0gdG9rZW4uZW5kR3JvdXA7CiAgICBhc3NlcnQob3B0aW9uYWwoJyknLCBjbG9zZUJyYWNlKSk7CiAgICBsaXN0ZW5lci5lbmRGb3JtYWxQYXJhbWV0ZXJzKDAsIHRva2VuLCBjbG9zZUJyYWNlLCBraW5kKTsKICAgIHJldHVybiBjbG9zZUJyYWNlOwogIH0KCiAgLy8vIFBhcnNlcyB0aGUgZm9ybWFsIHBhcmFtZXRlciBsaXN0IG9mIGEgZnVuY3Rpb24uCiAgLy8vCiAgLy8vIElmIGBraW5kID09IE1lbWJlcktpbmQuR2VuZXJhbGl6ZWRGdW5jdGlvblR5cGVgLCB0aGVuIG5hbWVzIG1heSBiZQogIC8vLyBvbWl0dGVkIChleGNlcHQgZm9yIG5hbWVkIGFyZ3VtZW50cykuIE90aGVyd2lzZSwgdHlwZXMgbWF5IGJlIG9taXR0ZWQuCiAgVG9rZW4gcGFyc2VGb3JtYWxQYXJhbWV0ZXJzUmVxdWlyZWRPcHQoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAoIW9wdGlvbmFsKCcoJywgbmV4dCkpIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBtaXNzaW5nUGFyYW1ldGVyTWVzc2FnZShraW5kKSk7CiAgICAgIG5leHQgPSByZXdyaXRlci5pbnNlcnRQYXJlbnModG9rZW4sIGZhbHNlKTsKICAgIH0KICAgIHJldHVybiBwYXJzZUZvcm1hbFBhcmFtZXRlcnNSZXN0KG5leHQsIGtpbmQpOwogIH0KCiAgLy8vIFBhcnNlcyB0aGUgZm9ybWFsIHBhcmFtZXRlciBsaXN0IG9mIGEgZnVuY3Rpb24gZ2l2ZW4gdGhhdCB0aGUgbGVmdAogIC8vLyBwYXJlbnRoZXNpcyBpcyBrbm93biB0byBleGlzdC4KICAvLy8KICAvLy8gSWYgYGtpbmQgPT0gTWVtYmVyS2luZC5HZW5lcmFsaXplZEZ1bmN0aW9uVHlwZWAsIHRoZW4gbmFtZXMgbWF5IGJlCiAgLy8vIG9taXR0ZWQgKGV4Y2VwdCBmb3IgbmFtZWQgYXJndW1lbnRzKS4gT3RoZXJ3aXNlLCB0eXBlcyBtYXkgYmUgb21pdHRlZC4KICBUb2tlbiBwYXJzZUZvcm1hbFBhcmFtZXRlcnMoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgcmV0dXJuIHBhcnNlRm9ybWFsUGFyYW1ldGVyc1Jlc3QodG9rZW4ubmV4dCwga2luZCk7CiAgfQoKICAvLy8gUGFyc2VzIHRoZSBmb3JtYWwgcGFyYW1ldGVyIGxpc3Qgb2YgYSBmdW5jdGlvbiBnaXZlbiB0aGF0IHRoZSBsZWZ0CiAgLy8vIHBhcmVudGhlc2lzIHBhc3NlZCBpbiBhcyBbdG9rZW5dLgogIC8vLwogIC8vLyBJZiBga2luZCA9PSBNZW1iZXJLaW5kLkdlbmVyYWxpemVkRnVuY3Rpb25UeXBlYCwgdGhlbiBuYW1lcyBtYXkgYmUKICAvLy8gb21pdHRlZCAoZXhjZXB0IGZvciBuYW1lZCBhcmd1bWVudHMpLiBPdGhlcndpc2UsIHR5cGVzIG1heSBiZSBvbWl0dGVkLgogIFRva2VuIHBhcnNlRm9ybWFsUGFyYW1ldGVyc1Jlc3QoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgVG9rZW4gYmVnaW4gPSB0b2tlbjsKICAgIGFzc2VydChvcHRpb25hbCgnKCcsIHRva2VuKSk7CiAgICBsaXN0ZW5lci5iZWdpbkZvcm1hbFBhcmFtZXRlcnMoYmVnaW4sIGtpbmQpOwogICAgaW50IHBhcmFtZXRlckNvdW50ID0gMDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJyknLCBuZXh0KSkgewogICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICArK3BhcmFtZXRlckNvdW50OwogICAgICBTdHJpbmcgdmFsdWUgPSBuZXh0LnN0cmluZ1ZhbHVlOwogICAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnWycpKSB7CiAgICAgICAgdG9rZW4gPSBwYXJzZU9wdGlvbmFsUG9zaXRpb25hbFBhcmFtZXRlcnModG9rZW4sIGtpbmQpOwogICAgICAgIHRva2VuID0gZW5zdXJlQ2xvc2VQYXJlbih0b2tlbiwgYmVnaW4pOwogICAgICAgIGJyZWFrOwogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ3snKSkgewogICAgICAgIHRva2VuID0gcGFyc2VPcHRpb25hbE5hbWVkUGFyYW1ldGVycyh0b2tlbiwga2luZCk7CiAgICAgICAgdG9rZW4gPSBlbnN1cmVDbG9zZVBhcmVuKHRva2VuLCBiZWdpbik7CiAgICAgICAgYnJlYWs7CiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnW10nKSkgewogICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgdG9rZW4gPSByZXdyaXRlU3F1YXJlQnJhY2tldHModG9rZW4pOwogICAgICAgIHRva2VuID0gcGFyc2VPcHRpb25hbFBvc2l0aW9uYWxQYXJhbWV0ZXJzKHRva2VuLCBraW5kKTsKICAgICAgICB0b2tlbiA9IGVuc3VyZUNsb3NlUGFyZW4odG9rZW4sIGJlZ2luKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICB0b2tlbiA9IHBhcnNlRm9ybWFsUGFyYW1ldGVyKHRva2VuLCBGb3JtYWxQYXJhbWV0ZXJLaW5kLm1hbmRhdG9yeSwga2luZCk7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAoIW9wdGlvbmFsKCcsJywgbmV4dCkpIHsKICAgICAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICBpZiAob3B0aW9uYWwoJyknLCBuZXh0KSkgewogICAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgICAgaWYgKGJlZ2luLmVuZEdyb3VwLmlzU3ludGhldGljKSB7CiAgICAgICAgICAgIC8vIFNjYW5uZXIgaGFzIGFscmVhZHkgcmVwb3J0ZWQgYSBtaXNzaW5nIGApYCBlcnJvciwKICAgICAgICAgICAgLy8gYnV0IHBsYWNlZCB0aGUgYClgIGluIHRoZSB3cm9uZyBsb2NhdGlvbiwgc28gbW92ZSBpdC4KICAgICAgICAgICAgdG9rZW4gPSByZXdyaXRlci5tb3ZlU3ludGhldGljKHRva2VuLCBiZWdpbi5lbmRHcm91cCk7CiAgICAgICAgICB9IGVsc2UgaWYgKG5leHQua2luZCA9PSBJREVOVElGSUVSX1RPS0VOICYmCiAgICAgICAgICAgICAgbmV4dC5uZXh0LmtpbmQgPT0gSURFTlRJRklFUl9UT0tFTikgewogICAgICAgICAgICAvLyBMb29rcyBsaWtlIGEgbWlzc2luZyBjb21tYQogICAgICAgICAgICB0b2tlbiA9IHJld3JpdGVBbmRSZWNvdmVyKAogICAgICAgICAgICAgICAgdG9rZW4sCiAgICAgICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQnV0R290LndpdGhBcmd1bWVudHMoJywnKSwKICAgICAgICAgICAgICAgIG5ldyBTeW50aGV0aWNUb2tlbihUb2tlblR5cGUuQ09NTUEsIG5leHQuY2hhck9mZnNldCkpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRva2VuID0gZW5zdXJlQ2xvc2VQYXJlbih0b2tlbiwgYmVnaW4pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfQogICAgICB0b2tlbiA9IG5leHQ7CiAgICB9CiAgICBhc3NlcnQob3B0aW9uYWwoJyknLCB0b2tlbikpOwogICAgbGlzdGVuZXIuZW5kRm9ybWFsUGFyYW1ldGVycyhwYXJhbWV0ZXJDb3VudCwgYmVnaW4sIHRva2VuLCBraW5kKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBSZXR1cm4gdGhlIG1lc3NhZ2UgdGhhdCBzaG91bGQgYmUgcHJvZHVjZWQgd2hlbiB0aGUgZm9ybWFsIHBhcmFtZXRlcnMgYXJlCiAgLy8vIG1pc3NpbmcuCiAgTWVzc2FnZSBtaXNzaW5nUGFyYW1ldGVyTWVzc2FnZShNZW1iZXJLaW5kIGtpbmQpIHsKICAgIGlmIChraW5kID09IE1lbWJlcktpbmQuRnVuY3Rpb25UeXBlQWxpYXMpIHsKICAgICAgcmV0dXJuIGZhc3RhLm1lc3NhZ2VNaXNzaW5nVHlwZWRlZlBhcmFtZXRlcnM7CiAgICB9IGVsc2UgaWYgKGtpbmQgPT0gTWVtYmVyS2luZC5Ob25TdGF0aWNNZXRob2QgfHwKICAgICAgICBraW5kID09IE1lbWJlcktpbmQuU3RhdGljTWV0aG9kKSB7CiAgICAgIHJldHVybiBmYXN0YS5tZXNzYWdlTWlzc2luZ01ldGhvZFBhcmFtZXRlcnM7CiAgICB9CiAgICByZXR1cm4gZmFzdGEubWVzc2FnZU1pc3NpbmdGdW5jdGlvblBhcmFtZXRlcnM7CiAgfQoKICAvLy8gYGBgCiAgLy8vIG5vcm1hbEZvcm1hbFBhcmFtZXRlcjoKICAvLy8gICBmdW5jdGlvbkZvcm1hbFBhcmFtZXRlciB8CiAgLy8vICAgZmllbGRGb3JtYWxQYXJhbWV0ZXIgfAogIC8vLyAgIHNpbXBsZUZvcm1hbFBhcmFtZXRlcgogIC8vLyA7CiAgLy8vCiAgLy8vIGZ1bmN0aW9uRm9ybWFsUGFyYW1ldGVyOgogIC8vLyAgIG1ldGFkYXRhICdjb3ZhcmlhbnQnPyByZXR1cm5UeXBlPyBpZGVudGlmaWVyIGZvcm1hbFBhcmFtZXRlckxpc3QKICAvLy8gOwogIC8vLwogIC8vLyBzaW1wbGVGb3JtYWxQYXJhbWV0ZXI6CiAgLy8vICAgbWV0YWRhdGEgJ2NvdmFyaWFudCc/IGZpbmFsQ29uc3RWYXJPclR5cGU/IGlkZW50aWZpZXIgfAogIC8vLyA7CiAgLy8vCiAgLy8vIGZpZWxkRm9ybWFsUGFyYW1ldGVyOgogIC8vLyAgIG1ldGFkYXRhIGZpbmFsQ29uc3RWYXJPclR5cGU/ICd0aGlzJyAnLicgaWRlbnRpZmllciBmb3JtYWxQYXJhbWV0ZXJMaXN0PwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlRm9ybWFsUGFyYW1ldGVyKAogICAgICBUb2tlbiB0b2tlbiwgRm9ybWFsUGFyYW1ldGVyS2luZCBwYXJhbWV0ZXJLaW5kLCBNZW1iZXJLaW5kIG1lbWJlcktpbmQpIHsKICAgIGFzc2VydChwYXJhbWV0ZXJLaW5kICE9IG51bGwpOwogICAgdG9rZW4gPSBwYXJzZU1ldGFkYXRhU3Rhcih0b2tlbik7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIFRva2VuIHN0YXJ0ID0gbmV4dDsKCiAgICBmaW5hbCBib29sIGluRnVuY3Rpb25UeXBlID0KICAgICAgICBtZW1iZXJLaW5kID09IE1lbWJlcktpbmQuR2VuZXJhbGl6ZWRGdW5jdGlvblR5cGU7CgogICAgVG9rZW4gY292YXJpYW50VG9rZW47CiAgICBUb2tlbiB2YXJGaW5hbE9yQ29uc3Q7CiAgICBpZiAoaXNNb2RpZmllcihuZXh0KSkgewogICAgICBpZiAob3B0aW9uYWwoJ2NvdmFyaWFudCcsIG5leHQpKSB7CiAgICAgICAgaWYgKG1lbWJlcktpbmQgIT0gTWVtYmVyS2luZC5TdGF0aWNNZXRob2QgJiYKICAgICAgICAgICAgbWVtYmVyS2luZCAhPSBNZW1iZXJLaW5kLlRvcExldmVsTWV0aG9kKSB7CiAgICAgICAgICBjb3ZhcmlhbnRUb2tlbiA9IHRva2VuID0gbmV4dDsKICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGlzTW9kaWZpZXIobmV4dCkpIHsKICAgICAgICBpZiAoIWluRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgICBpZiAob3B0aW9uYWwoJ3ZhcicsIG5leHQpKSB7CiAgICAgICAgICAgIHZhckZpbmFsT3JDb25zdCA9IHRva2VuID0gbmV4dDsKICAgICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCdmaW5hbCcsIG5leHQpKSB7CiAgICAgICAgICAgIHZhckZpbmFsT3JDb25zdCA9IHRva2VuID0gbmV4dDsKICAgICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNNb2RpZmllcihuZXh0KSkgewogICAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICAgIE1vZGlmaWVyUmVjb3ZlcnlDb250ZXh0IGNvbnRleHQgPSBuZXcgTW9kaWZpZXJSZWNvdmVyeUNvbnRleHQodGhpcyk7CiAgICAgICAgICB0b2tlbiA9IGNvbnRleHQucGFyc2VGb3JtYWxQYXJhbWV0ZXJNb2RpZmllcnModG9rZW4sIG1lbWJlcktpbmQsCiAgICAgICAgICAgICAgY292YXJpYW50VG9rZW46IGNvdmFyaWFudFRva2VuLCB2YXJGaW5hbE9yQ29uc3Q6IHZhckZpbmFsT3JDb25zdCk7CiAgICAgICAgICBjb3ZhcmlhbnRUb2tlbiA9IGNvbnRleHQuY292YXJpYW50VG9rZW47CiAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QgPSBjb250ZXh0LnZhckZpbmFsT3JDb25zdDsKICAgICAgICAgIGNvbnRleHQgPSBudWxsOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGxpc3RlbmVyLmJlZ2luRm9ybWFsUGFyYW1ldGVyKAogICAgICAgIHN0YXJ0LCBtZW1iZXJLaW5kLCBjb3ZhcmlhbnRUb2tlbiwgdmFyRmluYWxPckNvbnN0KTsKCiAgICAvLyBUeXBlIGlzIHJlcXVpcmVkIGluIGEgZ2VuZXJhbGl6ZWQgZnVuY3Rpb24gdHlwZSwgYnV0IG9wdGlvbmFsIG90aGVyd2lzZS4KICAgIGZpbmFsIFRva2VuIGJlZm9yZVR5cGUgPSB0b2tlbjsKICAgIFR5cGVJbmZvIHR5cGVJbmZvID0gY29tcHV0ZVR5cGUodG9rZW4sIGluRnVuY3Rpb25UeXBlKTsKICAgIHRva2VuID0gdHlwZUluZm8uc2tpcFR5cGUodG9rZW4pOwogICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAodHlwZUluZm8gPT0gbm9UeXBlICYmCiAgICAgICAgKG9wdGlvbmFsKCcuJywgbmV4dCkgfHwKICAgICAgICAgICAgKG5leHQuaXNJZGVudGlmaWVyICYmIG9wdGlvbmFsKCcuJywgbmV4dC5uZXh0KSkpKSB7CiAgICAgIC8vIFJlY292ZXJ5OiBNYWxmb3JtZWQgdHlwZSByZWZlcmVuY2UuCiAgICAgIHR5cGVJbmZvID0gY29tcHV0ZVR5cGUoYmVmb3JlVHlwZSwgdHJ1ZSk7CiAgICAgIHRva2VuID0gdHlwZUluZm8uc2tpcFR5cGUoYmVmb3JlVHlwZSk7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgfQoKICAgIGZpbmFsIGJvb2wgaXNOYW1lZFBhcmFtZXRlciA9CiAgICAgICAgcGFyYW1ldGVyS2luZCA9PSBGb3JtYWxQYXJhbWV0ZXJLaW5kLm9wdGlvbmFsTmFtZWQ7CgogICAgVG9rZW4gdGhpc0tleXdvcmQ7CiAgICBUb2tlbiBwZXJpb2RBZnRlclRoaXM7CiAgICBJZGVudGlmaWVyQ29udGV4dCBuYW1lQ29udGV4dCA9CiAgICAgICAgSWRlbnRpZmllckNvbnRleHQuZm9ybWFsUGFyYW1ldGVyRGVjbGFyYXRpb247CgogICAgaWYgKCFpbkZ1bmN0aW9uVHlwZSAmJiBvcHRpb25hbCgndGhpcycsIG5leHQpKSB7CiAgICAgIHRoaXNLZXl3b3JkID0gdG9rZW4gPSBuZXh0OwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKCFvcHRpb25hbCgnLicsIG5leHQpKSB7CiAgICAgICAgLy8gUmVjb3ZlciBmcm9tIGEgbWlzc2luZyBwZXJpb2QgYnkgaW5zZXJ0aW5nIG9uZS4KICAgICAgICBuZXh0ID0gcmV3cml0ZUFuZFJlY292ZXIoCiAgICAgICAgICAgIHRva2VuLAogICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQnV0R290LndpdGhBcmd1bWVudHMoJy4nKSwKICAgICAgICAgICAgbmV3IFN5bnRoZXRpY1Rva2VuKFRva2VuVHlwZS5QRVJJT0QsIG5leHQuY2hhck9mZnNldCkpOwogICAgICB9CiAgICAgIHBlcmlvZEFmdGVyVGhpcyA9IHRva2VuID0gbmV4dDsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIG5hbWVDb250ZXh0ID0gSWRlbnRpZmllckNvbnRleHQuZmllbGRJbml0aWFsaXplcjsKICAgIH0KCiAgICBpZiAobmV4dC5pc0lkZW50aWZpZXIpIHsKICAgICAgdG9rZW4gPSBuZXh0OwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIH0KICAgIFRva2VuIGJlZm9yZUlubGluZUZ1bmN0aW9uVHlwZTsKICAgIFR5cGVQYXJhbU9yQXJnSW5mbyB0eXBlUGFyYW0gPSBub1R5cGVQYXJhbU9yQXJnOwogICAgaWYgKG9wdGlvbmFsKCI8IiwgbmV4dCkpIHsKICAgICAgdHlwZVBhcmFtID0gY29tcHV0ZVR5cGVQYXJhbU9yQXJnKHRva2VuKTsKICAgICAgaWYgKHR5cGVQYXJhbSAhPSBub1R5cGVQYXJhbU9yQXJnKSB7CiAgICAgICAgVG9rZW4gY2xvc2VyID0gdHlwZVBhcmFtLnNraXAodG9rZW4pOwogICAgICAgIGlmIChvcHRpb25hbCgiKCIsIGNsb3Nlci5uZXh0KSkgewogICAgICAgICAgaWYgKHZhckZpbmFsT3JDb25zdCAhPSBudWxsKSB7CiAgICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QsIGZhc3RhLm1lc3NhZ2VGdW5jdGlvblR5cGVkUGFyYW1ldGVyVmFyKTsKICAgICAgICAgIH0KICAgICAgICAgIGJlZm9yZUlubGluZUZ1bmN0aW9uVHlwZSA9IHRva2VuOwogICAgICAgICAgdG9rZW4gPSBjbG9zZXIubmV4dC5lbmRHcm91cDsKICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmIChvcHRpb25hbCgiKCIsIG5leHQpKSB7CiAgICAgIGlmICh2YXJGaW5hbE9yQ29uc3QgIT0gbnVsbCkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgIHZhckZpbmFsT3JDb25zdCwgZmFzdGEubWVzc2FnZUZ1bmN0aW9uVHlwZWRQYXJhbWV0ZXJWYXIpOwogICAgICB9CiAgICAgIGJlZm9yZUlubGluZUZ1bmN0aW9uVHlwZSA9IHRva2VuOwogICAgICB0b2tlbiA9IG5leHQuZW5kR3JvdXA7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgfQogICAgaWYgKHR5cGVJbmZvICE9IG5vVHlwZSAmJgogICAgICAgIHZhckZpbmFsT3JDb25zdCAhPSBudWxsICYmCiAgICAgICAgb3B0aW9uYWwoJ3ZhcicsIHZhckZpbmFsT3JDb25zdCkpIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcih2YXJGaW5hbE9yQ29uc3QsIGZhc3RhLm1lc3NhZ2VUeXBlQWZ0ZXJWYXIpOwogICAgfQoKICAgIFRva2VuIGVuZElubGluZUZ1bmN0aW9uVHlwZTsKICAgIGlmIChiZWZvcmVJbmxpbmVGdW5jdGlvblR5cGUgIT0gbnVsbCkgewogICAgICBlbmRJbmxpbmVGdW5jdGlvblR5cGUgPQogICAgICAgICAgdHlwZVBhcmFtLnBhcnNlVmFyaWFibGVzKGJlZm9yZUlubGluZUZ1bmN0aW9uVHlwZSwgdGhpcyk7CiAgICAgIGxpc3RlbmVyLmJlZ2luRnVuY3Rpb25UeXBlZEZvcm1hbFBhcmFtZXRlcihiZWZvcmVJbmxpbmVGdW5jdGlvblR5cGUubmV4dCk7CiAgICAgIHRva2VuID0gdHlwZUluZm8ucGFyc2VUeXBlKGJlZm9yZVR5cGUsIHRoaXMpOwogICAgICBlbmRJbmxpbmVGdW5jdGlvblR5cGUgPSBwYXJzZUZvcm1hbFBhcmFtZXRlcnNSZXF1aXJlZE9wdCgKICAgICAgICAgIGVuZElubGluZUZ1bmN0aW9uVHlwZSwgTWVtYmVyS2luZC5GdW5jdGlvblR5cGVkUGFyYW1ldGVyKTsKICAgICAgbGlzdGVuZXIuZW5kRnVuY3Rpb25UeXBlZEZvcm1hbFBhcmFtZXRlcihiZWZvcmVJbmxpbmVGdW5jdGlvblR5cGUpOwoKICAgICAgLy8gR2VuZXJhbGl6ZWQgZnVuY3Rpb24gdHlwZXMgZG9uJ3QgYWxsb3cgaW5saW5lIGZ1bmN0aW9uIHR5cGVzLgogICAgICAvLyBUaGUgZm9sbG93aW5nIGlzbid0IGFsbG93ZWQ6CiAgICAgIC8vICAgIGludCBGdW5jdGlvbihpbnQgYmFyKFN0cmluZyB4KSkuCiAgICAgIGlmIChpbkZ1bmN0aW9uVHlwZSkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoYmVmb3JlSW5saW5lRnVuY3Rpb25UeXBlLm5leHQsCiAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VJbnZhbGlkSW5saW5lRnVuY3Rpb25UeXBlKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChpbkZ1bmN0aW9uVHlwZSkgewogICAgICB0b2tlbiA9IHR5cGVJbmZvLmVuc3VyZVR5cGVPclZvaWQoYmVmb3JlVHlwZSwgdGhpcyk7CiAgICB9IGVsc2UgewogICAgICB0b2tlbiA9IHR5cGVJbmZvLnBhcnNlVHlwZShiZWZvcmVUeXBlLCB0aGlzKTsKICAgIH0KCiAgICBUb2tlbiBuYW1lVG9rZW47CiAgICBpZiAocGVyaW9kQWZ0ZXJUaGlzICE9IG51bGwpIHsKICAgICAgdG9rZW4gPSBwZXJpb2RBZnRlclRoaXM7CiAgICB9CiAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChpbkZ1bmN0aW9uVHlwZSAmJiAhaXNOYW1lZFBhcmFtZXRlciAmJiAhbmV4dC5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgbmFtZVRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgbGlzdGVuZXIuaGFuZGxlTm9OYW1lKG5hbWVUb2tlbik7CiAgICB9IGVsc2UgewogICAgICBuYW1lVG9rZW4gPSB0b2tlbiA9IGVuc3VyZUlkZW50aWZpZXIodG9rZW4sIG5hbWVDb250ZXh0KTsKICAgICAgaWYgKGlzTmFtZWRQYXJhbWV0ZXIgJiYgbmFtZVRva2VuLmxleGVtZS5zdGFydHNXaXRoKCJfIikpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5hbWVUb2tlbiwgZmFzdGEubWVzc2FnZVByaXZhdGVOYW1lZFBhcmFtZXRlcik7CiAgICAgIH0KICAgIH0KICAgIGlmIChlbmRJbmxpbmVGdW5jdGlvblR5cGUgIT0gbnVsbCkgewogICAgICB0b2tlbiA9IGVuZElubGluZUZ1bmN0aW9uVHlwZTsKICAgIH0KICAgIG5leHQgPSB0b2tlbi5uZXh0OwoKICAgIFN0cmluZyB2YWx1ZSA9IG5leHQuc3RyaW5nVmFsdWU7CiAgICBpZiAoKGlkZW50aWNhbCgnPScsIHZhbHVlKSkgfHwgKGlkZW50aWNhbCgnOicsIHZhbHVlKSkpIHsKICAgICAgVG9rZW4gZXF1YWwgPSBuZXh0OwogICAgICBsaXN0ZW5lci5iZWdpbkZvcm1hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZUV4cHJlc3Npb24oKTsKICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24oZXF1YWwpOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgbGlzdGVuZXIuZW5kRm9ybWFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlRXhwcmVzc2lvbigpOwogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogQ29uc2lkZXIgcmVtb3ZpbmcgdGhlIGxhc3QgcGFyYW1ldGVyIGZyb20gdGhlCiAgICAgIC8vIGhhbmRsZVZhbHVlZEZvcm1hbFBhcmFtZXRlciBldmVudC4uLiBpdCBhcHBlYXJzIHRvIGJlIHVudXNlZC4KICAgICAgbGlzdGVuZXIuaGFuZGxlVmFsdWVkRm9ybWFsUGFyYW1ldGVyKGVxdWFsLCBuZXh0KTsKICAgICAgaWYgKGlzTWFuZGF0b3J5Rm9ybWFsUGFyYW1ldGVyS2luZChwYXJhbWV0ZXJLaW5kKSkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgIGVxdWFsLCBmYXN0YS5tZXNzYWdlUmVxdWlyZWRQYXJhbWV0ZXJXaXRoRGVmYXVsdCk7CiAgICAgIH0gZWxzZSBpZiAoaXNPcHRpb25hbFBvc2l0aW9uYWxGb3JtYWxQYXJhbWV0ZXJLaW5kKHBhcmFtZXRlcktpbmQpICYmCiAgICAgICAgICBpZGVudGljYWwoJzonLCB2YWx1ZSkpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICBlcXVhbCwgZmFzdGEubWVzc2FnZVBvc2l0aW9uYWxQYXJhbWV0ZXJXaXRoRXF1YWxzKTsKICAgICAgfSBlbHNlIGlmIChpbkZ1bmN0aW9uVHlwZSB8fAogICAgICAgICAgbWVtYmVyS2luZCA9PSBNZW1iZXJLaW5kLkZ1bmN0aW9uVHlwZUFsaWFzIHx8CiAgICAgICAgICBtZW1iZXJLaW5kID09IE1lbWJlcktpbmQuRnVuY3Rpb25UeXBlZFBhcmFtZXRlcikgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoZXF1YWwsIGZhc3RhLm1lc3NhZ2VGdW5jdGlvblR5cGVEZWZhdWx0VmFsdWUpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBsaXN0ZW5lci5oYW5kbGVGb3JtYWxQYXJhbWV0ZXJXaXRob3V0VmFsdWUobmV4dCk7CiAgICB9CiAgICBsaXN0ZW5lci5lbmRGb3JtYWxQYXJhbWV0ZXIoCiAgICAgICAgdGhpc0tleXdvcmQsIHBlcmlvZEFmdGVyVGhpcywgbmFtZVRva2VuLCBwYXJhbWV0ZXJLaW5kLCBtZW1iZXJLaW5kKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gZGVmYXVsdEZvcm1hbFBhcmFtZXRlcjoKICAvLy8gICBub3JtYWxGb3JtYWxQYXJhbWV0ZXIgKCc9JyBleHByZXNzaW9uKT8KICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZU9wdGlvbmFsUG9zaXRpb25hbFBhcmFtZXRlcnMoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgVG9rZW4gYmVnaW4gPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ1snLCB0b2tlbikpOwogICAgbGlzdGVuZXIuYmVnaW5PcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMoYmVnaW4pOwogICAgaW50IHBhcmFtZXRlckNvdW50ID0gMDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJ10nLCBuZXh0KSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHRva2VuID0gcGFyc2VGb3JtYWxQYXJhbWV0ZXIoCiAgICAgICAgICB0b2tlbiwgRm9ybWFsUGFyYW1ldGVyS2luZC5vcHRpb25hbFBvc2l0aW9uYWwsIGtpbmQpOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgKytwYXJhbWV0ZXJDb3VudDsKICAgICAgaWYgKCFvcHRpb25hbCgnLCcsIG5leHQpKSB7CiAgICAgICAgaWYgKCFvcHRpb25hbCgnXScsIG5leHQpKSB7CiAgICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICBuZXh0LCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQnV0R290LndpdGhBcmd1bWVudHMoJ10nKSk7CiAgICAgICAgICAvLyBTY2FubmVyIGd1YXJhbnRlZXMgYSBjbG9zaW5nIGJyYWNrZXQuCiAgICAgICAgICBuZXh0ID0gYmVnaW4uZW5kR3JvdXA7CiAgICAgICAgICB3aGlsZSAodG9rZW4ubmV4dCAhPSBuZXh0KSB7CiAgICAgICAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgdG9rZW4gPSBuZXh0OwogICAgfQogICAgaWYgKHBhcmFtZXRlckNvdW50ID09IDApIHsKICAgICAgcmV3cml0ZUFuZFJlY292ZXIoCiAgICAgICAgICB0b2tlbiwKICAgICAgICAgIGZhc3RhLm1lc3NhZ2VFbXB0eU9wdGlvbmFsUGFyYW1ldGVyTGlzdCwKICAgICAgICAgIG5ldyBTeW50aGV0aWNTdHJpbmdUb2tlbigKICAgICAgICAgICAgICBUb2tlblR5cGUuSURFTlRJRklFUiwgJycsIHRva2VuLm5leHQuY2hhck9mZnNldCwgMCkpOwogICAgICB0b2tlbiA9IHBhcnNlRm9ybWFsUGFyYW1ldGVyKAogICAgICAgICAgdG9rZW4sIEZvcm1hbFBhcmFtZXRlcktpbmQub3B0aW9uYWxQb3NpdGlvbmFsLCBraW5kKTsKICAgICAgKytwYXJhbWV0ZXJDb3VudDsKICAgIH0KICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnXScsIHRva2VuKSk7CiAgICBsaXN0ZW5lci5lbmRPcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMocGFyYW1ldGVyQ291bnQsIGJlZ2luLCB0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIGRlZmF1bHROYW1lZFBhcmFtZXRlcjoKICAvLy8gICBub3JtYWxGb3JtYWxQYXJhbWV0ZXIgKCc9JyBleHByZXNzaW9uKT8gfAogIC8vLyAgIG5vcm1hbEZvcm1hbFBhcmFtZXRlciAoJzonIGV4cHJlc3Npb24pPwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlT3B0aW9uYWxOYW1lZFBhcmFtZXRlcnMoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgVG9rZW4gYmVnaW4gPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ3snLCB0b2tlbikpOwogICAgbGlzdGVuZXIuYmVnaW5PcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMoYmVnaW4pOwogICAgaW50IHBhcmFtZXRlckNvdW50ID0gMDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJ30nLCBuZXh0KSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHRva2VuID0KICAgICAgICAgIHBhcnNlRm9ybWFsUGFyYW1ldGVyKHRva2VuLCBGb3JtYWxQYXJhbWV0ZXJLaW5kLm9wdGlvbmFsTmFtZWQsIGtpbmQpOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgKytwYXJhbWV0ZXJDb3VudDsKICAgICAgaWYgKCFvcHRpb25hbCgnLCcsIG5leHQpKSB7CiAgICAgICAgaWYgKCFvcHRpb25hbCgnfScsIG5leHQpKSB7CiAgICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICBuZXh0LCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQnV0R290LndpdGhBcmd1bWVudHMoJ30nKSk7CiAgICAgICAgICAvLyBTY2FubmVyIGd1YXJhbnRlZXMgYSBjbG9zaW5nIGJyYWNrZXQuCiAgICAgICAgICBuZXh0ID0gYmVnaW4uZW5kR3JvdXA7CiAgICAgICAgICB3aGlsZSAodG9rZW4ubmV4dCAhPSBuZXh0KSB7CiAgICAgICAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgdG9rZW4gPSBuZXh0OwogICAgfQogICAgaWYgKHBhcmFtZXRlckNvdW50ID09IDApIHsKICAgICAgcmV3cml0ZUFuZFJlY292ZXIoCiAgICAgICAgICB0b2tlbiwKICAgICAgICAgIGZhc3RhLm1lc3NhZ2VFbXB0eU5hbWVkUGFyYW1ldGVyTGlzdCwKICAgICAgICAgIG5ldyBTeW50aGV0aWNTdHJpbmdUb2tlbigKICAgICAgICAgICAgICBUb2tlblR5cGUuSURFTlRJRklFUiwgJycsIHRva2VuLm5leHQuY2hhck9mZnNldCwgMCkpOwogICAgICB0b2tlbiA9CiAgICAgICAgICBwYXJzZUZvcm1hbFBhcmFtZXRlcih0b2tlbiwgRm9ybWFsUGFyYW1ldGVyS2luZC5vcHRpb25hbE5hbWVkLCBraW5kKTsKICAgICAgKytwYXJhbWV0ZXJDb3VudDsKICAgIH0KICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnfScsIHRva2VuKSk7CiAgICBsaXN0ZW5lci5lbmRPcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMocGFyYW1ldGVyQ291bnQsIGJlZ2luLCB0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIHF1YWxpZmllZDoKICAvLy8gICBpZGVudGlmaWVyIHF1YWxpZmllZFJlc3QqCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VRdWFsaWZpZWQoVG9rZW4gdG9rZW4sIElkZW50aWZpZXJDb250ZXh0IGNvbnRleHQsCiAgICAgIElkZW50aWZpZXJDb250ZXh0IGNvbnRpbnVhdGlvbkNvbnRleHQpIHsKICAgIHRva2VuID0gZW5zdXJlSWRlbnRpZmllcih0b2tlbiwgY29udGV4dCk7CiAgICB3aGlsZSAob3B0aW9uYWwoJy4nLCB0b2tlbi5uZXh0KSkgewogICAgICB0b2tlbiA9IHBhcnNlUXVhbGlmaWVkUmVzdCh0b2tlbiwgY29udGludWF0aW9uQ29udGV4dCk7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIHF1YWxpZmllZFJlc3RPcHQ6CiAgLy8vICAgcXVhbGlmaWVkUmVzdD8KICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZVF1YWxpZmllZFJlc3RPcHQoCiAgICAgIFRva2VuIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dCBjb250aW51YXRpb25Db250ZXh0KSB7CiAgICBpZiAob3B0aW9uYWwoJy4nLCB0b2tlbi5uZXh0KSkgewogICAgICByZXR1cm4gcGFyc2VRdWFsaWZpZWRSZXN0KHRva2VuLCBjb250aW51YXRpb25Db250ZXh0KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0b2tlbjsKICAgIH0KICB9CgogIC8vLyBgYGAKICAvLy8gcXVhbGlmaWVkUmVzdDoKICAvLy8gICAnLicgaWRlbnRpZmllcgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlUXVhbGlmaWVkUmVzdChUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCcuJywgdG9rZW4pKTsKICAgIFRva2VuIHBlcmlvZCA9IHRva2VuOwogICAgdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKHRva2VuLCBjb250ZXh0KTsKICAgIGxpc3RlbmVyLmhhbmRsZVF1YWxpZmllZChwZXJpb2QpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gc2tpcEJsb2NrKFRva2VuIHRva2VuKSB7CiAgICAvLyBUaGUgc2Nhbm5lciBlbnN1cmVzIHRoYXQgYHtgIGFsd2F5cyBoYXMgYSBjbG9zaW5nIGB9YC4KICAgIHJldHVybiBlbnN1cmVCbG9jayh0b2tlbiwgbnVsbCkuZW5kR3JvdXA7CiAgfQoKICAvLy8gYGBgCiAgLy8vIGVudW1UeXBlOgogIC8vLyAgIG1ldGFkYXRhICdlbnVtJyBpZCAneycgbWV0YWRhdGEgaWQgWycsJyBtZXRhZGF0YSBpZF0qIFsnLCddICd9JwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlRW51bShUb2tlbiBlbnVtS2V5d29yZCkgewogICAgYXNzZXJ0KG9wdGlvbmFsKCdlbnVtJywgZW51bUtleXdvcmQpKTsKICAgIGxpc3RlbmVyLmJlZ2luRW51bShlbnVtS2V5d29yZCk7CiAgICBUb2tlbiB0b2tlbiA9CiAgICAgICAgZW5zdXJlSWRlbnRpZmllcihlbnVtS2V5d29yZCwgSWRlbnRpZmllckNvbnRleHQuZW51bURlY2xhcmF0aW9uKTsKICAgIFRva2VuIGxlZnRCcmFjZSA9IHRva2VuLm5leHQ7CiAgICBpbnQgY291bnQgPSAwOwogICAgaWYgKG9wdGlvbmFsKCd7JywgbGVmdEJyYWNlKSkgewogICAgICB0b2tlbiA9IGxlZnRCcmFjZTsKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICBpZiAob3B0aW9uYWwoJ30nLCBuZXh0KSkgewogICAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgICAgaWYgKGNvdW50ID09IDApIHsKICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0b2tlbiwgZmFzdGEubWVzc2FnZUVudW1EZWNsYXJhdGlvbkVtcHR5KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB0b2tlbiA9IHBhcnNlTWV0YWRhdGFTdGFyKHRva2VuKTsKICAgICAgICB0b2tlbiA9IGVuc3VyZUlkZW50aWZpZXIodG9rZW4sIElkZW50aWZpZXJDb250ZXh0LmVudW1WYWx1ZURlY2xhcmF0aW9uKTsKICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICBjb3VudCsrOwogICAgICAgIGlmIChvcHRpb25hbCgnLCcsIG5leHQpKSB7CiAgICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25hbCgnfScsIG5leHQpKSB7CiAgICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgICBicmVhazsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICAgIFRva2VuIGVuZEdyb3VwID0gbGVmdEJyYWNlLmVuZEdyb3VwOwogICAgICAgICAgaWYgKGVuZEdyb3VwLmlzU3ludGhldGljKSB7CiAgICAgICAgICAgIC8vIFRoZSBzY2FubmVyIGRpZCBub3QgcGxhY2UgdGhlIHN5bnRoZXRpYyAnfScgY29ycmVjdGx5LgogICAgICAgICAgICB0b2tlbiA9IHJld3JpdGVyLm1vdmVTeW50aGV0aWModG9rZW4sIGVuZEdyb3VwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9IGVsc2UgaWYgKG5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgICAgICAgIC8vIElmIHRoZSBuZXh0IHRva2VuIGlzIGFuIGlkZW50aWZpZXIsIGFzc3VtZSBhIG1pc3NpbmcgY29tbWEuCiAgICAgICAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBDb25zaWRlciBpbXByb3ZlZCByZWNvdmVyeSBmb3IgbWlzc2luZyBgfWAKICAgICAgICAgICAgLy8gYm90aCBoZXJlIGFuZCB3aGVuIHRoZSBzY2FubmVyIGluc2VydHMgYSBzeW50aGV0aWMgYH1gCiAgICAgICAgICAgIC8vIGZvciBzaXR1YXRpb25zIHN1Y2ggYXMgYGVudW0gTGV0dGVyIHthLCBiICAgTGV0dGVyIGU7YC4KICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICAgIG5leHQsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnLCcpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIE90aGVyd2lzZSBhc3N1bWUgYSBtaXNzaW5nIGB9YCBhbmQgZXhpdCB0aGUgbG9vcAogICAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgICAgbmV4dCwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCd9JykpOwogICAgICAgICAgICB0b2tlbiA9IGxlZnRCcmFjZS5lbmRHcm91cDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBsZWZ0QnJhY2UgPSBlbnN1cmVCbG9jayh0b2tlbiwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEVudW1Cb2R5KTsKICAgICAgdG9rZW4gPSBsZWZ0QnJhY2UuZW5kR3JvdXA7CiAgICB9CiAgICBhc3NlcnQob3B0aW9uYWwoJ30nLCB0b2tlbikpOwogICAgbGlzdGVuZXIuZW5kRW51bShlbnVtS2V5d29yZCwgbGVmdEJyYWNlLCBjb3VudCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZUNsYXNzT3JOYW1lZE1peGluQXBwbGljYXRpb24oCiAgICAgIFRva2VuIGFic3RyYWN0VG9rZW4sIFRva2VuIGNsYXNzS2V5d29yZCkgewogICAgYXNzZXJ0KG9wdGlvbmFsKCdjbGFzcycsIGNsYXNzS2V5d29yZCkpOwogICAgVG9rZW4gYmVnaW4gPSBhYnN0cmFjdFRva2VuID8/IGNsYXNzS2V5d29yZDsKICAgIGxpc3RlbmVyLmJlZ2luQ2xhc3NPck5hbWVkTWl4aW5BcHBsaWNhdGlvbihiZWdpbik7CiAgICBUb2tlbiBuYW1lID0gZW5zdXJlSWRlbnRpZmllcigKICAgICAgICBjbGFzc0tleXdvcmQsIElkZW50aWZpZXJDb250ZXh0LmNsYXNzT3JNaXhpbkRlY2xhcmF0aW9uKTsKICAgIFRva2VuIHRva2VuID0gY29tcHV0ZVR5cGVQYXJhbU9yQXJnKG5hbWUsIHRydWUpLnBhcnNlVmFyaWFibGVzKG5hbWUsIHRoaXMpOwogICAgaWYgKG9wdGlvbmFsKCc9JywgdG9rZW4ubmV4dCkpIHsKICAgICAgbGlzdGVuZXIuYmVnaW5OYW1lZE1peGluQXBwbGljYXRpb24oYmVnaW4sIGFic3RyYWN0VG9rZW4sIG5hbWUpOwogICAgICByZXR1cm4gcGFyc2VOYW1lZE1peGluQXBwbGljYXRpb24odG9rZW4sIGJlZ2luLCBjbGFzc0tleXdvcmQpOwogICAgfSBlbHNlIHsKICAgICAgbGlzdGVuZXIuYmVnaW5DbGFzc0RlY2xhcmF0aW9uKGJlZ2luLCBhYnN0cmFjdFRva2VuLCBuYW1lKTsKICAgICAgcmV0dXJuIHBhcnNlQ2xhc3ModG9rZW4sIGJlZ2luLCBjbGFzc0tleXdvcmQpOwogICAgfQogIH0KCiAgVG9rZW4gcGFyc2VOYW1lZE1peGluQXBwbGljYXRpb24oCiAgICAgIFRva2VuIHRva2VuLCBUb2tlbiBiZWdpbiwgVG9rZW4gY2xhc3NLZXl3b3JkKSB7CiAgICBUb2tlbiBlcXVhbHMgPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJz0nLCBlcXVhbHMpKTsKICAgIHRva2VuID0gY29tcHV0ZVR5cGUodG9rZW4sIHRydWUpLmVuc3VyZVR5cGVOb3RWb2lkKHRva2VuLCB0aGlzKTsKICAgIHRva2VuID0gcGFyc2VNaXhpbkFwcGxpY2F0aW9uUmVzdCh0b2tlbik7CiAgICBUb2tlbiBpbXBsZW1lbnRzS2V5d29yZCA9IG51bGw7CiAgICBpZiAob3B0aW9uYWwoJ2ltcGxlbWVudHMnLCB0b2tlbi5uZXh0KSkgewogICAgICBpbXBsZW1lbnRzS2V5d29yZCA9IHRva2VuLm5leHQ7CiAgICAgIHRva2VuID0gcGFyc2VUeXBlTGlzdChpbXBsZW1lbnRzS2V5d29yZCk7CiAgICB9CiAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICBsaXN0ZW5lci5lbmROYW1lZE1peGluQXBwbGljYXRpb24oCiAgICAgICAgYmVnaW4sIGNsYXNzS2V5d29yZCwgZXF1YWxzLCBpbXBsZW1lbnRzS2V5d29yZCwgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFBhcnNlIHRoZSBwb3J0aW9uIG9mIGEgY2xhc3MgZGVjbGFyYXRpb24gKG5vdCBhIG1peGluIGFwcGxpY2F0aW9uKSB0aGF0CiAgLy8vIGZvbGxvd3MgdGhlIGVuZCBvZiB0aGUgdHlwZSBwYXJhbWV0ZXJzLgogIC8vLwogIC8vLyBgYGAKICAvLy8gY2xhc3NEZWZpbml0aW9uOgogIC8vLyAgIG1ldGFkYXRhIGFic3RyYWN0PyAnY2xhc3MnIGlkZW50aWZpZXIgdHlwZVBhcmFtZXRlcnM/CiAgLy8vICAgICAgIChzdXBlcmNsYXNzIG1peGlucz8pPyBpbnRlcmZhY2VzPwogIC8vLyAgICAgICAneycgKG1ldGFkYXRhIGNsYXNzTWVtYmVyRGVmaW5pdGlvbikqICd9JyB8CiAgLy8vICAgbWV0YWRhdGEgYWJzdHJhY3Q/ICdjbGFzcycgbWl4aW5BcHBsaWNhdGlvbkNsYXNzCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VDbGFzcyhUb2tlbiB0b2tlbiwgVG9rZW4gYmVnaW4sIFRva2VuIGNsYXNzS2V5d29yZCkgewogICAgVG9rZW4gc3RhcnQgPSB0b2tlbjsKICAgIHRva2VuID0gcGFyc2VDbGFzc0hlYWRlck9wdCh0b2tlbiwgYmVnaW4sIGNsYXNzS2V5d29yZCk7CiAgICBpZiAoIW9wdGlvbmFsKCd7JywgdG9rZW4ubmV4dCkpIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgdG9rZW4gPSBwYXJzZUNsYXNzSGVhZGVyUmVjb3Zlcnkoc3RhcnQsIGJlZ2luLCBjbGFzc0tleXdvcmQpOwogICAgICBlbnN1cmVCbG9jayh0b2tlbiwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZENsYXNzT3JNaXhpbkJvZHkpOwogICAgfQogICAgdG9rZW4gPSBwYXJzZUNsYXNzT3JNaXhpbkJvZHkodG9rZW4pOwogICAgbGlzdGVuZXIuZW5kQ2xhc3NEZWNsYXJhdGlvbihiZWdpbiwgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VDbGFzc0hlYWRlck9wdChUb2tlbiB0b2tlbiwgVG9rZW4gYmVnaW4sIFRva2VuIGNsYXNzS2V5d29yZCkgewogICAgdG9rZW4gPSBwYXJzZUNsYXNzRXh0ZW5kc09wdCh0b2tlbik7CiAgICB0b2tlbiA9IHBhcnNlV2l0aENsYXVzZU9wdCh0b2tlbik7CiAgICB0b2tlbiA9IHBhcnNlQ2xhc3NPck1peGluSW1wbGVtZW50c09wdCh0b2tlbik7CiAgICBUb2tlbiBuYXRpdmVUb2tlbjsKICAgIGlmIChvcHRpb25hbCgnbmF0aXZlJywgdG9rZW4ubmV4dCkpIHsKICAgICAgbmF0aXZlVG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICB0b2tlbiA9IHBhcnNlTmF0aXZlQ2xhdXNlKHRva2VuKTsKICAgIH0KICAgIGxpc3RlbmVyLmhhbmRsZUNsYXNzSGVhZGVyKGJlZ2luLCBjbGFzc0tleXdvcmQsIG5hdGl2ZVRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBSZWNvdmVyIGdpdmVuIG91dC1vZi1vcmRlciBjbGF1c2VzIGluIGEgY2xhc3MgaGVhZGVyLgogIFRva2VuIHBhcnNlQ2xhc3NIZWFkZXJSZWNvdmVyeShUb2tlbiB0b2tlbiwgVG9rZW4gYmVnaW4sIFRva2VuIGNsYXNzS2V5d29yZCkgewogICAgZmluYWwgcHJpbWFyeUxpc3RlbmVyID0gbGlzdGVuZXI7CiAgICBmaW5hbCByZWNvdmVyeUxpc3RlbmVyID0gbmV3IENsYXNzSGVhZGVyUmVjb3ZlcnlMaXN0ZW5lcigpOwoKICAgIC8vIFJlcGFyc2UgdG8gZGV0ZXJtaW5lIHdoaWNoIGNsYXVzZXMgaGF2ZSBhbHJlYWR5IGJlZW4gcGFyc2VkCiAgICAvLyBidXQgaW50ZXJjZXB0IHRoZSBldmVudHMgc28gdGhleSBhcmUgbm90IHNlbnQgdG8gdGhlIHByaW1hcnkgbGlzdGVuZXIuCiAgICBsaXN0ZW5lciA9IHJlY292ZXJ5TGlzdGVuZXI7CiAgICB0b2tlbiA9IHBhcnNlQ2xhc3NIZWFkZXJPcHQodG9rZW4sIGJlZ2luLCBjbGFzc0tleXdvcmQpOwogICAgYm9vbCBoYXNFeHRlbmRzID0gcmVjb3ZlcnlMaXN0ZW5lci5leHRlbmRzS2V5d29yZCAhPSBudWxsOwogICAgYm9vbCBoYXNJbXBsZW1lbnRzID0gcmVjb3ZlcnlMaXN0ZW5lci5pbXBsZW1lbnRzS2V5d29yZCAhPSBudWxsOwogICAgYm9vbCBoYXNXaXRoID0gcmVjb3ZlcnlMaXN0ZW5lci53aXRoS2V5d29yZCAhPSBudWxsOwoKICAgIC8vIFVwZGF0ZSB0aGUgcmVjb3ZlcnkgbGlzdGVuZXIgdG8gZm9yd2FyZCBzdWJzZXF1ZW50IGV2ZW50cwogICAgLy8gdG8gdGhlIHByaW1hcnkgbGlzdGVuZXIuCiAgICByZWNvdmVyeUxpc3RlbmVyLmxpc3RlbmVyID0gcHJpbWFyeUxpc3RlbmVyOwoKICAgIC8vIFBhcnNlIGFkZGl0aW9uYWwgb3V0LW9mLW9yZGVyIGNsYXVzZXMKICAgIFRva2VuIHN0YXJ0OwogICAgZG8gewogICAgICBzdGFydCA9IHRva2VuOwoKICAgICAgLy8gQ2hlY2sgZm9yIGV4dHJhbmVvdXMgdG9rZW4gaW4gdGhlIG1pZGRsZSBvZiBhIGNsYXNzIGhlYWRlci4KICAgICAgdG9rZW4gPSBza2lwVW5leHBlY3RlZFRva2VuT3B0KAogICAgICAgICAgdG9rZW4sIGNvbnN0IDxTdHJpbmc+WydleHRlbmRzJywgJ3dpdGgnLCAnaW1wbGVtZW50cycsICd7J10pOwoKICAgICAgLy8gRHVyaW5nIHJlY292ZXJ5LCBjbGF1c2VzIGFyZSBwYXJzZWQgaW4gdGhlIHNhbWUgb3JkZXIKICAgICAgLy8gYW5kIGdlbmVyYXRlIHRoZSBzYW1lIGV2ZW50cyBhcyBpbiB0aGUgcGFyc2VDbGFzc0hlYWRlciBtZXRob2QgYWJvdmUuCiAgICAgIHJlY292ZXJ5TGlzdGVuZXIuY2xlYXIoKTsKCiAgICAgIGlmICh0b2tlbi5uZXh0LmlzS2V5d29yZE9ySWRlbnRpZmllciAmJgogICAgICAgICAgY29uc3QgWydleHRlbmQnLCAnb24nXS5jb250YWlucyh0b2tlbi5uZXh0LmxleGVtZSkpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICB0b2tlbi5uZXh0LCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSW5zdGVhZC53aXRoQXJndW1lbnRzKCdleHRlbmRzJykpOwogICAgICAgIFRva2VuIGluY29ycmVjdEV4dGVuZHNLZXl3b3JkID0gdG9rZW4ubmV4dDsKICAgICAgICB0b2tlbiA9IGNvbXB1dGVUeXBlKGluY29ycmVjdEV4dGVuZHNLZXl3b3JkLCB0cnVlKQogICAgICAgICAgICAuZW5zdXJlVHlwZU5vdFZvaWQoaW5jb3JyZWN0RXh0ZW5kc0tleXdvcmQsIHRoaXMpOwogICAgICAgIGxpc3RlbmVyLmhhbmRsZUNsYXNzRXh0ZW5kcyhpbmNvcnJlY3RFeHRlbmRzS2V5d29yZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdG9rZW4gPSBwYXJzZUNsYXNzRXh0ZW5kc09wdCh0b2tlbik7CiAgICAgIH0KCiAgICAgIGlmIChyZWNvdmVyeUxpc3RlbmVyLmV4dGVuZHNLZXl3b3JkICE9IG51bGwpIHsKICAgICAgICBpZiAoaGFzRXh0ZW5kcykgewogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICByZWNvdmVyeUxpc3RlbmVyLmV4dGVuZHNLZXl3b3JkLCBmYXN0YS5tZXNzYWdlTXVsdGlwbGVFeHRlbmRzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGhhc1dpdGgpIHsKICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihyZWNvdmVyeUxpc3RlbmVyLmV4dGVuZHNLZXl3b3JkLAogICAgICAgICAgICAgICAgZmFzdGEubWVzc2FnZVdpdGhCZWZvcmVFeHRlbmRzKTsKICAgICAgICAgIH0gZWxzZSBpZiAoaGFzSW1wbGVtZW50cykgewogICAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKHJlY292ZXJ5TGlzdGVuZXIuZXh0ZW5kc0tleXdvcmQsCiAgICAgICAgICAgICAgICBmYXN0YS5tZXNzYWdlSW1wbGVtZW50c0JlZm9yZUV4dGVuZHMpOwogICAgICAgICAgfQogICAgICAgICAgaGFzRXh0ZW5kcyA9IHRydWU7CiAgICAgICAgfQogICAgICB9CgogICAgICB0b2tlbiA9IHBhcnNlV2l0aENsYXVzZU9wdCh0b2tlbik7CgogICAgICBpZiAocmVjb3ZlcnlMaXN0ZW5lci53aXRoS2V5d29yZCAhPSBudWxsKSB7CiAgICAgICAgaWYgKGhhc1dpdGgpIHsKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgICAgcmVjb3ZlcnlMaXN0ZW5lci53aXRoS2V5d29yZCwgZmFzdGEubWVzc2FnZU11bHRpcGxlV2l0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChoYXNJbXBsZW1lbnRzKSB7CiAgICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IocmVjb3ZlcnlMaXN0ZW5lci53aXRoS2V5d29yZCwKICAgICAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VJbXBsZW1lbnRzQmVmb3JlV2l0aCk7CiAgICAgICAgICB9CiAgICAgICAgICBoYXNXaXRoID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRva2VuID0gcGFyc2VDbGFzc09yTWl4aW5JbXBsZW1lbnRzT3B0KHRva2VuKTsKCiAgICAgIGlmIChyZWNvdmVyeUxpc3RlbmVyLmltcGxlbWVudHNLZXl3b3JkICE9IG51bGwpIHsKICAgICAgICBpZiAoaGFzSW1wbGVtZW50cykgewogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihyZWNvdmVyeUxpc3RlbmVyLmltcGxlbWVudHNLZXl3b3JkLAogICAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VNdWx0aXBsZUltcGxlbWVudHMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBoYXNJbXBsZW1lbnRzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGxpc3RlbmVyLmhhbmRsZVJlY292ZXJDbGFzc0hlYWRlcigpOwoKICAgICAgLy8gRXhpdCBpZiBhIGNsYXNzIGJvZHkgaXMgZGV0ZWN0ZWQsIG9yIGlmIG5vIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUKICAgIH0gd2hpbGUgKCFvcHRpb25hbCgneycsIHRva2VuLm5leHQpICYmIHN0YXJ0ICE9IHRva2VuKTsKCiAgICBsaXN0ZW5lciA9IHByaW1hcnlMaXN0ZW5lcjsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlQ2xhc3NFeHRlbmRzT3B0KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChvcHRpb25hbCgnZXh0ZW5kcycsIG5leHQpKSB7CiAgICAgIFRva2VuIGV4dGVuZHNLZXl3b3JkID0gbmV4dDsKICAgICAgdG9rZW4gPSBjb21wdXRlVHlwZShuZXh0LCB0cnVlKS5lbnN1cmVUeXBlTm90Vm9pZChuZXh0LCB0aGlzKTsKICAgICAgbGlzdGVuZXIuaGFuZGxlQ2xhc3NFeHRlbmRzKGV4dGVuZHNLZXl3b3JkKTsKICAgIH0gZWxzZSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZU5vVHlwZSh0b2tlbik7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUNsYXNzRXh0ZW5kcyhudWxsKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gaW1wbGVtZW50c0NsYXVzZToKICAvLy8gICAnaW1wbGVtZW50cycgdHlwZU5hbWUgKCcsJyB0eXBlTmFtZSkqCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VDbGFzc09yTWl4aW5JbXBsZW1lbnRzT3B0KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBpbXBsZW1lbnRzS2V5d29yZDsKICAgIGludCBpbnRlcmZhY2VzQ291bnQgPSAwOwogICAgaWYgKG9wdGlvbmFsKCdpbXBsZW1lbnRzJywgdG9rZW4ubmV4dCkpIHsKICAgICAgaW1wbGVtZW50c0tleXdvcmQgPSB0b2tlbi5uZXh0OwogICAgICBkbyB7CiAgICAgICAgdG9rZW4gPQogICAgICAgICAgICBjb21wdXRlVHlwZSh0b2tlbi5uZXh0LCB0cnVlKS5lbnN1cmVUeXBlTm90Vm9pZCh0b2tlbi5uZXh0LCB0aGlzKTsKICAgICAgICArK2ludGVyZmFjZXNDb3VudDsKICAgICAgfSB3aGlsZSAob3B0aW9uYWwoJywnLCB0b2tlbi5uZXh0KSk7CiAgICB9CiAgICBsaXN0ZW5lci5oYW5kbGVDbGFzc09yTWl4aW5JbXBsZW1lbnRzKGltcGxlbWVudHNLZXl3b3JkLCBpbnRlcmZhY2VzQ291bnQpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFBhcnNlIGEgbWl4aW4gZGVjbGFyYXRpb24uCiAgLy8vCiAgLy8vIGBgYAogIC8vLyBtaXhpbkRlY2xhcmF0aW9uOgogIC8vLyAgIG1ldGFkYXRhPyAnbWl4aW4nIFtTaW1wbGVJZGVudGlmaWVyXSBbVHlwZVBhcmFtZXRlckxpc3RdPwogIC8vLyAgICAgICAgW09uQ2xhdXNlXT8gW0ltcGxlbWVudHNDbGF1c2VdPyAneycgW0NsYXNzTWVtYmVyXSogJ30nCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VNaXhpbihUb2tlbiBtaXhpbktleXdvcmQpIHsKICAgIGFzc2VydChvcHRpb25hbCgnbWl4aW4nLCBtaXhpbktleXdvcmQpKTsKICAgIGxpc3RlbmVyLmJlZ2luQ2xhc3NPck5hbWVkTWl4aW5BcHBsaWNhdGlvbihtaXhpbktleXdvcmQpOwogICAgVG9rZW4gbmFtZSA9IGVuc3VyZUlkZW50aWZpZXIoCiAgICAgICAgbWl4aW5LZXl3b3JkLCBJZGVudGlmaWVyQ29udGV4dC5jbGFzc09yTWl4aW5EZWNsYXJhdGlvbik7CiAgICBUb2tlbiBoZWFkZXJTdGFydCA9CiAgICAgICAgY29tcHV0ZVR5cGVQYXJhbU9yQXJnKG5hbWUsIHRydWUpLnBhcnNlVmFyaWFibGVzKG5hbWUsIHRoaXMpOwogICAgbGlzdGVuZXIuYmVnaW5NaXhpbkRlY2xhcmF0aW9uKG1peGluS2V5d29yZCwgbmFtZSk7CiAgICBUb2tlbiB0b2tlbiA9IHBhcnNlTWl4aW5IZWFkZXJPcHQoaGVhZGVyU3RhcnQsIG1peGluS2V5d29yZCk7CiAgICBpZiAoIW9wdGlvbmFsKCd7JywgdG9rZW4ubmV4dCkpIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgdG9rZW4gPSBwYXJzZU1peGluSGVhZGVyUmVjb3ZlcnkodG9rZW4sIG1peGluS2V5d29yZCwgaGVhZGVyU3RhcnQpOwogICAgICBlbnN1cmVCbG9jayh0b2tlbiwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZENsYXNzT3JNaXhpbkJvZHkpOwogICAgfQogICAgdG9rZW4gPSBwYXJzZUNsYXNzT3JNaXhpbkJvZHkodG9rZW4pOwogICAgbGlzdGVuZXIuZW5kTWl4aW5EZWNsYXJhdGlvbihtaXhpbktleXdvcmQsIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlTWl4aW5IZWFkZXJPcHQoVG9rZW4gdG9rZW4sIFRva2VuIG1peGluS2V5d29yZCkgewogICAgdG9rZW4gPSBwYXJzZU1peGluT25PcHQodG9rZW4pOwogICAgdG9rZW4gPSBwYXJzZUNsYXNzT3JNaXhpbkltcGxlbWVudHNPcHQodG9rZW4pOwogICAgbGlzdGVuZXIuaGFuZGxlTWl4aW5IZWFkZXIobWl4aW5LZXl3b3JkKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlTWl4aW5IZWFkZXJSZWNvdmVyeSgKICAgICAgVG9rZW4gdG9rZW4sIFRva2VuIG1peGluS2V5d29yZCwgVG9rZW4gaGVhZGVyU3RhcnQpIHsKICAgIGZpbmFsIHByaW1hcnlMaXN0ZW5lciA9IGxpc3RlbmVyOwogICAgZmluYWwgcmVjb3ZlcnlMaXN0ZW5lciA9IG5ldyBNaXhpbkhlYWRlclJlY292ZXJ5TGlzdGVuZXIoKTsKCiAgICAvLyBSZXBhcnNlIHRvIGRldGVybWluZSB3aGljaCBjbGF1c2VzIGhhdmUgYWxyZWFkeSBiZWVuIHBhcnNlZAogICAgLy8gYnV0IGludGVyY2VwdCB0aGUgZXZlbnRzIHNvIHRoZXkgYXJlIG5vdCBzZW50IHRvIHRoZSBwcmltYXJ5IGxpc3RlbmVyLgogICAgbGlzdGVuZXIgPSByZWNvdmVyeUxpc3RlbmVyOwogICAgdG9rZW4gPSBwYXJzZU1peGluSGVhZGVyT3B0KGhlYWRlclN0YXJ0LCBtaXhpbktleXdvcmQpOwogICAgYm9vbCBoYXNPbiA9IHJlY292ZXJ5TGlzdGVuZXIub25LZXl3b3JkICE9IG51bGw7CiAgICBib29sIGhhc0ltcGxlbWVudHMgPSByZWNvdmVyeUxpc3RlbmVyLmltcGxlbWVudHNLZXl3b3JkICE9IG51bGw7CgogICAgLy8gVXBkYXRlIHRoZSByZWNvdmVyeSBsaXN0ZW5lciB0byBmb3J3YXJkIHN1YnNlcXVlbnQgZXZlbnRzCiAgICAvLyB0byB0aGUgcHJpbWFyeSBsaXN0ZW5lci4KICAgIHJlY292ZXJ5TGlzdGVuZXIubGlzdGVuZXIgPSBwcmltYXJ5TGlzdGVuZXI7CgogICAgLy8gUGFyc2UgYWRkaXRpb25hbCBvdXQtb2Ytb3JkZXIgY2xhdXNlcwogICAgVG9rZW4gc3RhcnQ7CiAgICBkbyB7CiAgICAgIHN0YXJ0ID0gdG9rZW47CgogICAgICAvLyBDaGVjayBmb3IgZXh0cmFuZW91cyB0b2tlbiBpbiB0aGUgbWlkZGxlIG9mIGEgY2xhc3MgaGVhZGVyLgogICAgICB0b2tlbiA9IHNraXBVbmV4cGVjdGVkVG9rZW5PcHQoCiAgICAgICAgICB0b2tlbiwgY29uc3QgPFN0cmluZz5bJ29uJywgJ2ltcGxlbWVudHMnLCAneyddKTsKCiAgICAgIC8vIER1cmluZyByZWNvdmVyeSwgY2xhdXNlcyBhcmUgcGFyc2VkIGluIHRoZSBzYW1lIG9yZGVyIGFuZAogICAgICAvLyBnZW5lcmF0ZSB0aGUgc2FtZSBldmVudHMgYXMgaW4gdGhlIHBhcnNlTWl4aW5IZWFkZXJPcHQgbWV0aG9kIGFib3ZlLgogICAgICByZWNvdmVyeUxpc3RlbmVyLmNsZWFyKCk7CgogICAgICBpZiAodG9rZW4ubmV4dC5pc0tleXdvcmRPcklkZW50aWZpZXIgJiYKICAgICAgICAgIGNvbnN0IFsnZXh0ZW5kJywgJ2V4dGVuZHMnXS5jb250YWlucyh0b2tlbi5uZXh0LmxleGVtZSkpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICB0b2tlbi5uZXh0LCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSW5zdGVhZC53aXRoQXJndW1lbnRzKCdvbicpKTsKICAgICAgICB0b2tlbiA9IHBhcnNlTWl4aW5Pbih0b2tlbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdG9rZW4gPSBwYXJzZU1peGluT25PcHQodG9rZW4pOwogICAgICB9CgogICAgICBpZiAocmVjb3ZlcnlMaXN0ZW5lci5vbktleXdvcmQgIT0gbnVsbCkgewogICAgICAgIGlmIChoYXNPbikgewogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICByZWNvdmVyeUxpc3RlbmVyLm9uS2V5d29yZCwgZmFzdGEubWVzc2FnZU11bHRpcGxlT25DbGF1c2VzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGhhc0ltcGxlbWVudHMpIHsKICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICAgIHJlY292ZXJ5TGlzdGVuZXIub25LZXl3b3JkLCBmYXN0YS5tZXNzYWdlSW1wbGVtZW50c0JlZm9yZU9uKTsKICAgICAgICAgIH0KICAgICAgICAgIGhhc09uID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRva2VuID0gcGFyc2VDbGFzc09yTWl4aW5JbXBsZW1lbnRzT3B0KHRva2VuKTsKCiAgICAgIGlmIChyZWNvdmVyeUxpc3RlbmVyLmltcGxlbWVudHNLZXl3b3JkICE9IG51bGwpIHsKICAgICAgICBpZiAoaGFzSW1wbGVtZW50cykgewogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihyZWNvdmVyeUxpc3RlbmVyLmltcGxlbWVudHNLZXl3b3JkLAogICAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VNdWx0aXBsZUltcGxlbWVudHMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBoYXNJbXBsZW1lbnRzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGxpc3RlbmVyLmhhbmRsZVJlY292ZXJNaXhpbkhlYWRlcigpOwoKICAgICAgLy8gRXhpdCBpZiBhIG1peGluIGJvZHkgaXMgZGV0ZWN0ZWQsIG9yIGlmIG5vIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUKICAgIH0gd2hpbGUgKCFvcHRpb25hbCgneycsIHRva2VuLm5leHQpICYmIHN0YXJ0ICE9IHRva2VuKTsKCiAgICBsaXN0ZW5lciA9IHByaW1hcnlMaXN0ZW5lcjsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gb25DbGF1c2U6CiAgLy8vICAgJ29uJyB0eXBlTmFtZSAoJywnIHR5cGVOYW1lKSoKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZU1peGluT25PcHQoVG9rZW4gdG9rZW4pIHsKICAgIGlmICghb3B0aW9uYWwoJ29uJywgdG9rZW4ubmV4dCkpIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlTWl4aW5PbihudWxsLCAwKTsKICAgICAgcmV0dXJuIHRva2VuOwogICAgfQogICAgcmV0dXJuIHBhcnNlTWl4aW5Pbih0b2tlbik7CiAgfQoKICBUb2tlbiBwYXJzZU1peGluT24oVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG9uS2V5d29yZCA9IHRva2VuLm5leHQ7CiAgICAvLyBEdXJpbmcgcmVjb3ZlcnksIHRoZSBbb25LZXl3b3JkXSBjYW4gYmUgImV4dGVuZCIgb3IgImV4dGVuZHMiCiAgICBhc3NlcnQob3B0aW9uYWwoJ29uJywgb25LZXl3b3JkKSB8fAogICAgICAgIG9wdGlvbmFsKCdleHRlbmRzJywgb25LZXl3b3JkKSB8fAogICAgICAgIG9uS2V5d29yZC5sZXhlbWUgPT0gJ2V4dGVuZCcpOwogICAgaW50IHR5cGVDb3VudCA9IDA7CiAgICBkbyB7CiAgICAgIHRva2VuID0gY29tcHV0ZVR5cGUodG9rZW4ubmV4dCwgdHJ1ZSkuZW5zdXJlVHlwZU5vdFZvaWQodG9rZW4ubmV4dCwgdGhpcyk7CiAgICAgICsrdHlwZUNvdW50OwogICAgfSB3aGlsZSAob3B0aW9uYWwoJywnLCB0b2tlbi5uZXh0KSk7CiAgICBsaXN0ZW5lci5oYW5kbGVNaXhpbk9uKG9uS2V5d29yZCwgdHlwZUNvdW50KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlU3RyaW5nUGFydChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAobmV4dC5raW5kICE9IFNUUklOR19UT0tFTikgewogICAgICBib29sIGVycm9yUmVwb3J0ZWQgPSBmYWxzZTsKICAgICAgd2hpbGUgKG5leHQgaXMgRXJyb3JUb2tlbikgewogICAgICAgIGVycm9yUmVwb3J0ZWQgPSB0cnVlOwogICAgICAgIHJlcG9ydEVycm9yVG9rZW4obmV4dCk7CiAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICB9CiAgICAgIGlmIChuZXh0LmtpbmQgIT0gU1RSSU5HX1RPS0VOKSB7CiAgICAgICAgaWYgKCFlcnJvclJlcG9ydGVkKSB7CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKG5leHQsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRTdHJpbmcpOwogICAgICAgIH0KICAgICAgICBuZXh0ID0gcmV3cml0ZXIuaW5zZXJ0VG9rZW4odG9rZW4sCiAgICAgICAgICAgIG5ldyBTeW50aGV0aWNTdHJpbmdUb2tlbihUb2tlblR5cGUuU1RSSU5HLCAnJywgbmV4dC5jaGFyT2Zmc2V0KSk7CiAgICAgIH0KICAgIH0KICAgIGxpc3RlbmVyLmhhbmRsZVN0cmluZ1BhcnQobmV4dCk7CiAgICByZXR1cm4gbmV4dDsKICB9CgogIC8vLyBJbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciBhZnRlciB0aGUgZ2l2ZW4gW3Rva2VuXSBhbmQgY3JlYXRlIGFuIGVycm9yCiAgLy8vIG1lc3NhZ2UgYmFzZWQgb24gdGhlIGdpdmVuIFtjb250ZXh0XS4gUmV0dXJuIHRoZSBzeW50aGV0aWMgaWRlbnRpZmllciB0aGF0CiAgLy8vIHdhcyBpbnNlcnRlZC4KICBUb2tlbiBpbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKFRva2VuIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dCBjb250ZXh0LAogICAgICB7TWVzc2FnZSBtZXNzYWdlLCBUb2tlbiBtZXNzYWdlT25Ub2tlbn0pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihtZXNzYWdlT25Ub2tlbiA/PyBuZXh0LAogICAgICAgIG1lc3NhZ2UgPz8gY29udGV4dC5yZWNvdmVyeVRlbXBsYXRlLndpdGhBcmd1bWVudHMobmV4dCkpOwogICAgcmV0dXJuIHJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4pOwogIH0KCiAgLy8vIFBhcnNlIGEgc2ltcGxlIGlkZW50aWZpZXIgYXQgdGhlIGdpdmVuIFt0b2tlbl0sIGFuZCByZXR1cm4gdGhlIGlkZW50aWZpZXIKICAvLy8gdGhhdCB3YXMgcGFyc2VkLgogIC8vLwogIC8vLyBJZiB0aGUgdG9rZW4gaXMgbm90IGFuIGlkZW50aWZpZXIsIG9yIGlzIG5vdCBhcHByb3ByaWF0ZSBmb3IgdXNlIGFzIGFuCiAgLy8vIGlkZW50aWZpZXIgaW4gdGhlIGdpdmVuIFtjb250ZXh0XSwgY3JlYXRlIGEgc3ludGhldGljIGlkZW50aWZpZXIsIHJlcG9ydAogIC8vLyBhbiBlcnJvciwgYW5kIHJldHVybiB0aGUgc3ludGhldGljIGlkZW50aWZpZXIuCiAgVG9rZW4gZW5zdXJlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgYXNzZXJ0KGNvbnRleHQgIT0gbnVsbCk7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGlmIChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTikgewogICAgICBpZGVudGlmaWVyID0gY29udGV4dC5lbnN1cmVJZGVudGlmaWVyKHRva2VuLCB0aGlzKTsKICAgICAgYXNzZXJ0KGlkZW50aWZpZXIgIT0gbnVsbCk7CiAgICAgIGFzc2VydChpZGVudGlmaWVyLmlzS2V5d29yZE9ySWRlbnRpZmllcik7CiAgICB9CiAgICBsaXN0ZW5lci5oYW5kbGVJZGVudGlmaWVyKGlkZW50aWZpZXIsIGNvbnRleHQpOwogICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgfQoKICBib29sIG5vdEVvZk9yVmFsdWUoU3RyaW5nIHZhbHVlLCBUb2tlbiB0b2tlbikgewogICAgcmV0dXJuICFpZGVudGljYWwodG9rZW4ua2luZCwgRU9GX1RPS0VOKSAmJgogICAgICAgICFpZGVudGljYWwodmFsdWUsIHRva2VuLnN0cmluZ1ZhbHVlKTsKICB9CgogIFRva2VuIHBhcnNlVHlwZVZhcmlhYmxlc09wdChUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIGNvbXB1dGVUeXBlUGFyYW1PckFyZyh0b2tlbiwgdHJ1ZSkucGFyc2VWYXJpYWJsZXModG9rZW4sIHRoaXMpOwogIH0KCiAgLy8vIFBhcnNlIGEgdG9wIGxldmVsIGZpZWxkIG9yIGZ1bmN0aW9uLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBpcyBvbmx5IGludm9rZWQgZnJvbSBvdXRzaWRlIHRoZSBwYXJzZXIuIEFzIGEgcmVzdWx0LCB0aGlzCiAgLy8vIG1ldGhvZCB0YWtlcyB0aGUgbmV4dCB0b2tlbiB0byBiZSBjb25zdW1lZCByYXRoZXIgdGhhbiB0aGUgbGFzdCBjb25zdW1lZAogIC8vLyB0b2tlbiBhbmQgcmV0dXJucyB0aGUgdG9rZW4gYWZ0ZXIgdGhlIGxhc3QgY29uc3VtZWQgdG9rZW4gcmF0aGVyIHRoYW4gdGhlCiAgLy8vIGxhc3QgY29uc3VtZWQgdG9rZW4uCiAgVG9rZW4gcGFyc2VUb3BMZXZlbE1lbWJlcihUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPSBwYXJzZU1ldGFkYXRhU3RhcihzeW50aGV0aWNQcmV2aW91c1Rva2VuKHRva2VuKSk7CiAgICByZXR1cm4gcGFyc2VUb3BMZXZlbE1lbWJlckltcGwodG9rZW4pLm5leHQ7CiAgfQoKICBUb2tlbiBwYXJzZVRvcExldmVsTWVtYmVySW1wbChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gYmVmb3JlU3RhcnQgPSB0b2tlbjsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgbGlzdGVuZXIuYmVnaW5Ub3BMZXZlbE1lbWJlcihuZXh0KTsKCiAgICBUb2tlbiBleHRlcm5hbFRva2VuOwogICAgVG9rZW4gdmFyRmluYWxPckNvbnN0OwoKICAgIGlmIChpc01vZGlmaWVyKG5leHQpKSB7CiAgICAgIGlmIChvcHRpb25hbCgnZXh0ZXJuYWwnLCBuZXh0KSkgewogICAgICAgIGV4dGVybmFsVG9rZW4gPSB0b2tlbiA9IG5leHQ7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIH0KICAgICAgaWYgKGlzTW9kaWZpZXIobmV4dCkpIHsKICAgICAgICBpZiAob3B0aW9uYWwoJ2ZpbmFsJywgbmV4dCkpIHsKICAgICAgICAgIHZhckZpbmFsT3JDb25zdCA9IHRva2VuID0gbmV4dDsKICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ3ZhcicsIG5leHQpKSB7CiAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QgPSB0b2tlbiA9IG5leHQ7CiAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCdjb25zdCcsIG5leHQpKSB7CiAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QgPSB0b2tlbiA9IG5leHQ7CiAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICB9CiAgICAgICAgaWYgKGlzTW9kaWZpZXIobmV4dCkpIHsKICAgICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgICBpZiAodmFyRmluYWxPckNvbnN0ICE9IG51bGwgJiYKICAgICAgICAgICAgICAob3B0aW9uYWwoJ2ZpbmFsJywgbmV4dCkgfHwKICAgICAgICAgICAgICAgICAgb3B0aW9uYWwoJ3ZhcicsIG5leHQpIHx8CiAgICAgICAgICAgICAgICAgIG9wdGlvbmFsKCdjb25zdCcsIG5leHQpKSkgewogICAgICAgICAgICAvLyBJZiBhbm90aGVyIGB2YXJgLCBgZmluYWxgLCBvciBgY29uc3RgIHRoZW4gZmFsbCB0aHJvdWdoCiAgICAgICAgICAgIC8vIHRvIHBhcnNlIHRoYXQgYXMgcGFydCBvZiB0aGUgbmV4dCB0b3AgbGV2ZWwgZGVjbGFyYXRpb24uCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBNb2RpZmllclJlY292ZXJ5Q29udGV4dCBjb250ZXh0ID0gbmV3IE1vZGlmaWVyUmVjb3ZlcnlDb250ZXh0KHRoaXMpOwogICAgICAgICAgICB0b2tlbiA9IGNvbnRleHQucGFyc2VUb3BMZXZlbE1vZGlmaWVycyh0b2tlbiwKICAgICAgICAgICAgICAgIGV4dGVybmFsVG9rZW46IGV4dGVybmFsVG9rZW4sIHZhckZpbmFsT3JDb25zdDogdmFyRmluYWxPckNvbnN0KTsKICAgICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CgogICAgICAgICAgICBleHRlcm5hbFRva2VuID0gY29udGV4dC5leHRlcm5hbFRva2VuOwogICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QgPSBjb250ZXh0LnZhckZpbmFsT3JDb25zdDsKICAgICAgICAgICAgY29udGV4dCA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgVG9rZW4gYmVmb3JlVHlwZSA9IHRva2VuOwogICAgVHlwZUluZm8gdHlwZUluZm8gPSBjb21wdXRlVHlwZSh0b2tlbiwgZmFsc2UsIHRydWUpOwogICAgdG9rZW4gPSB0eXBlSW5mby5za2lwVHlwZSh0b2tlbik7CiAgICBuZXh0ID0gdG9rZW4ubmV4dDsKCiAgICBUb2tlbiBnZXRPclNldDsKICAgIFN0cmluZyB2YWx1ZSA9IG5leHQuc3RyaW5nVmFsdWU7CiAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnZ2V0JykgfHwgaWRlbnRpY2FsKHZhbHVlLCAnc2V0JykpIHsKICAgICAgaWYgKG5leHQubmV4dC5pc0lkZW50aWZpZXIpIHsKICAgICAgICBnZXRPclNldCA9IHRva2VuID0gbmV4dDsKICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgfQogICAgfQoKICAgIGlmIChuZXh0LnR5cGUgIT0gVG9rZW5UeXBlLklERU5USUZJRVIpIHsKICAgICAgdmFsdWUgPSBuZXh0LnN0cmluZ1ZhbHVlOwogICAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnZmFjdG9yeScpIHx8IGlkZW50aWNhbCh2YWx1ZSwgJ29wZXJhdG9yJykpIHsKICAgICAgICAvLyBgZmFjdG9yeWAgYW5kIGBvcGVyYXRvcmAgY2FuIGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllci4KICAgICAgICB2YWx1ZSA9IG5leHQubmV4dC5zdHJpbmdWYWx1ZTsKICAgICAgICBpZiAoZ2V0T3JTZXQgPT0gbnVsbCAmJgogICAgICAgICAgICAhaWRlbnRpY2FsKHZhbHVlLCAnKCcpICYmCiAgICAgICAgICAgICFpZGVudGljYWwodmFsdWUsICd7JykgJiYKICAgICAgICAgICAgIWlkZW50aWNhbCh2YWx1ZSwgJzwnKSAmJgogICAgICAgICAgICAhaWRlbnRpY2FsKHZhbHVlLCAnPT4nKSAmJgogICAgICAgICAgICAhaWRlbnRpY2FsKHZhbHVlLCAnPScpICYmCiAgICAgICAgICAgICFpZGVudGljYWwodmFsdWUsICc7JykgJiYKICAgICAgICAgICAgIWlkZW50aWNhbCh2YWx1ZSwgJywnKSkgewogICAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICAgIHZhbHVlID0gbmV4dC5zdHJpbmdWYWx1ZTsKICAgICAgICAgIGlmIChpZGVudGljYWwodmFsdWUsICdmYWN0b3J5JykpIHsKICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICAgIG5leHQsIGZhc3RhLm1lc3NhZ2VGYWN0b3J5VG9wTGV2ZWxEZWNsYXJhdGlvbik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGZhc3RhLm1lc3NhZ2VUb3BMZXZlbE9wZXJhdG9yKTsKICAgICAgICAgICAgaWYgKG5leHQubmV4dC5pc09wZXJhdG9yKSB7CiAgICAgICAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgICAgICAgIGlmIChvcHRpb25hbCgnKCcsIG5leHQubmV4dCkpIHsKICAgICAgICAgICAgICAgIHJld3JpdGVyLmluc2VydFRva2VuKAogICAgICAgICAgICAgICAgICAgIG5leHQsCiAgICAgICAgICAgICAgICAgICAgbmV3IFN5bnRoZXRpY1N0cmluZ1Rva2VuKAogICAgICAgICAgICAgICAgICAgICAgICBUb2tlblR5cGUuSURFTlRJRklFUiwKICAgICAgICAgICAgICAgICAgICAgICAgJyNzeW50aGV0aWNfaWRlbnRpZmllcl8ke25leHQuY2hhck9mZnNldH0nLAogICAgICAgICAgICAgICAgICAgICAgICBuZXh0LmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgIDApKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZUludmFsaWRUb3BMZXZlbERlY2xhcmF0aW9uKG5leHQpOwogICAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgICAgfQogICAgICAgIC8vIEZhbGwgdGhyb3VnaCBhbmQgY29udGludWUgcGFyc2luZwogICAgICB9IGVsc2UgaWYgKCFuZXh0LmlzSWRlbnRpZmllcikgewogICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgaWYgKG5leHQuaXNLZXl3b3JkKSB7CiAgICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gcGFyc2UgdGhlIGtleXdvcmQgYXMgdGhlIGlkZW50aWZpZXIuCiAgICAgICAgICAvLyBlbnN1cmVJZGVudGlmaWVyIHdpbGwgcmVwb3J0IHRoZSBlcnJvci4KICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09IGJlZm9yZVN0YXJ0KSB7CiAgICAgICAgICAvLyBFbnN1cmUgd2UgbWFrZSBwcm9ncmVzcy4KICAgICAgICAgIHJldHVybiBwYXJzZUludmFsaWRUb3BMZXZlbERlY2xhcmF0aW9uKHRva2VuKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gTG9va3MgbGlrZSBhIGRlY2xhcmF0aW9uIG1pc3NpbmcgYW4gaWRlbnRpZmllci4KICAgICAgICAgIC8vIEluc2VydCBzeW50aGV0aWMgaWRlbnRpZmllciBhbmQgZmFsbCB0aHJvdWdoLgogICAgICAgICAgaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbiwgSWRlbnRpZmllckNvbnRleHQubWV0aG9kRGVjbGFyYXRpb24pOwogICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvLyBBdCB0aGlzIHBvaW50LCBgdG9rZW5gIGlzIGJlZm9yZU5hbWUuCgogICAgbmV4dCA9IG5leHQubmV4dDsKICAgIHZhbHVlID0gbmV4dC5zdHJpbmdWYWx1ZTsKICAgIGlmIChnZXRPclNldCAhPSBudWxsIHx8CiAgICAgICAgaWRlbnRpY2FsKHZhbHVlLCAnKCcpIHx8CiAgICAgICAgaWRlbnRpY2FsKHZhbHVlLCAneycpIHx8CiAgICAgICAgaWRlbnRpY2FsKHZhbHVlLCAnPCcpIHx8CiAgICAgICAgaWRlbnRpY2FsKHZhbHVlLCAnLicpIHx8CiAgICAgICAgaWRlbnRpY2FsKHZhbHVlLCAnPT4nKSkgewogICAgICBpZiAodmFyRmluYWxPckNvbnN0ICE9IG51bGwpIHsKICAgICAgICBpZiAob3B0aW9uYWwoJ3ZhcicsIHZhckZpbmFsT3JDb25zdCkpIHsKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IodmFyRmluYWxPckNvbnN0LCBmYXN0YS5tZXNzYWdlVmFyUmV0dXJuVHlwZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICAgICAgdmFyRmluYWxPckNvbnN0LCBmYXN0YS50ZW1wbGF0ZUV4dHJhbmVvdXNNb2RpZmllcik7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBwYXJzZVRvcExldmVsTWV0aG9kKGJlZm9yZVN0YXJ0LCBleHRlcm5hbFRva2VuLCBiZWZvcmVUeXBlLAogICAgICAgICAgdHlwZUluZm8sIGdldE9yU2V0LCB0b2tlbi5uZXh0KTsKICAgIH0KCiAgICBpZiAoZ2V0T3JTZXQgIT0gbnVsbCkgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgZ2V0T3JTZXQsIGZhc3RhLnRlbXBsYXRlRXh0cmFuZW91c01vZGlmaWVyKTsKICAgIH0KICAgIHJldHVybiBwYXJzZUZpZWxkcyhiZWZvcmVTdGFydCwgZXh0ZXJuYWxUb2tlbiwgbnVsbCwgbnVsbCwgdmFyRmluYWxPckNvbnN0LAogICAgICAgIGJlZm9yZVR5cGUsIHR5cGVJbmZvLCB0b2tlbi5uZXh0LCB0cnVlKTsKICB9CgogIFRva2VuIHBhcnNlRmllbGRzKAogICAgICBUb2tlbiBiZWZvcmVTdGFydCwKICAgICAgVG9rZW4gZXh0ZXJuYWxUb2tlbiwKICAgICAgVG9rZW4gc3RhdGljVG9rZW4sCiAgICAgIFRva2VuIGNvdmFyaWFudFRva2VuLAogICAgICBUb2tlbiB2YXJGaW5hbE9yQ29uc3QsCiAgICAgIFRva2VuIGJlZm9yZVR5cGUsCiAgICAgIFR5cGVJbmZvIHR5cGVJbmZvLAogICAgICBUb2tlbiBuYW1lLAogICAgICBib29sIGlzVG9wTGV2ZWwpIHsKICAgIGlmIChleHRlcm5hbFRva2VuICE9IG51bGwpIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihleHRlcm5hbFRva2VuLCBmYXN0YS5tZXNzYWdlRXh0ZXJuYWxGaWVsZCk7CiAgICB9CiAgICBpZiAoY292YXJpYW50VG9rZW4gIT0gbnVsbCkgewogICAgICBpZiAodmFyRmluYWxPckNvbnN0ICE9IG51bGwgJiYgb3B0aW9uYWwoJ2ZpbmFsJywgdmFyRmluYWxPckNvbnN0KSkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoY292YXJpYW50VG9rZW4sIGZhc3RhLm1lc3NhZ2VGaW5hbEFuZENvdmFyaWFudCk7CiAgICAgICAgY292YXJpYW50VG9rZW4gPSBudWxsOwogICAgICB9CiAgICB9CiAgICBpZiAodHlwZUluZm8gPT0gbm9UeXBlKSB7CiAgICAgIGlmICh2YXJGaW5hbE9yQ29uc3QgPT0gbnVsbCkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmFtZSwgZmFzdGEubWVzc2FnZU1pc3NpbmdDb25zdEZpbmFsVmFyT3JUeXBlKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKHZhckZpbmFsT3JDb25zdCAhPSBudWxsICYmIG9wdGlvbmFsKCd2YXInLCB2YXJGaW5hbE9yQ29uc3QpKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcih2YXJGaW5hbE9yQ29uc3QsIGZhc3RhLm1lc3NhZ2VUeXBlQWZ0ZXJWYXIpOwogICAgICB9CiAgICB9CgogICAgVG9rZW4gdG9rZW4gPSB0eXBlSW5mby5wYXJzZVR5cGUoYmVmb3JlVHlwZSwgdGhpcyk7CiAgICBhc3NlcnQodG9rZW4ubmV4dCA9PSBuYW1lKTsKCiAgICBJZGVudGlmaWVyQ29udGV4dCBjb250ZXh0ID0gaXNUb3BMZXZlbAogICAgICAgID8gSWRlbnRpZmllckNvbnRleHQudG9wTGV2ZWxWYXJpYWJsZURlY2xhcmF0aW9uCiAgICAgICAgOiBJZGVudGlmaWVyQ29udGV4dC5maWVsZERlY2xhcmF0aW9uOwogICAgbmFtZSA9IGVuc3VyZUlkZW50aWZpZXIodG9rZW4sIGNvbnRleHQpOwoKICAgIGludCBmaWVsZENvdW50ID0gMTsKICAgIHRva2VuID0gcGFyc2VGaWVsZEluaXRpYWxpemVyT3B0KG5hbWUsIG5hbWUsIHZhckZpbmFsT3JDb25zdCwgaXNUb3BMZXZlbCk7CiAgICB3aGlsZSAob3B0aW9uYWwoJywnLCB0b2tlbi5uZXh0KSkgewogICAgICBuYW1lID0gZW5zdXJlSWRlbnRpZmllcih0b2tlbi5uZXh0LCBjb250ZXh0KTsKICAgICAgdG9rZW4gPSBwYXJzZUZpZWxkSW5pdGlhbGl6ZXJPcHQobmFtZSwgbmFtZSwgdmFyRmluYWxPckNvbnN0LCBpc1RvcExldmVsKTsKICAgICAgKytmaWVsZENvdW50OwogICAgfQogICAgdG9rZW4gPSBlbnN1cmVTZW1pY29sb24odG9rZW4pOwogICAgaWYgKGlzVG9wTGV2ZWwpIHsKICAgICAgbGlzdGVuZXIuZW5kVG9wTGV2ZWxGaWVsZHMoc3RhdGljVG9rZW4sIGNvdmFyaWFudFRva2VuLCB2YXJGaW5hbE9yQ29uc3QsCiAgICAgICAgICBmaWVsZENvdW50LCBiZWZvcmVTdGFydC5uZXh0LCB0b2tlbik7CiAgICB9IGVsc2UgewogICAgICBsaXN0ZW5lci5lbmRGaWVsZHMoc3RhdGljVG9rZW4sIGNvdmFyaWFudFRva2VuLCB2YXJGaW5hbE9yQ29uc3QsCiAgICAgICAgICBmaWVsZENvdW50LCBiZWZvcmVTdGFydC5uZXh0LCB0b2tlbik7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZVRvcExldmVsTWV0aG9kKFRva2VuIGJlZm9yZVN0YXJ0LCBUb2tlbiBleHRlcm5hbFRva2VuLAogICAgICBUb2tlbiBiZWZvcmVUeXBlLCBUeXBlSW5mbyB0eXBlSW5mbywgVG9rZW4gZ2V0T3JTZXQsIFRva2VuIG5hbWUpIHsKICAgIGxpc3RlbmVyLmJlZ2luVG9wTGV2ZWxNZXRob2QoYmVmb3JlU3RhcnQsIGV4dGVybmFsVG9rZW4pOwoKICAgIFRva2VuIHRva2VuID0gdHlwZUluZm8ucGFyc2VUeXBlKGJlZm9yZVR5cGUsIHRoaXMpOwogICAgYXNzZXJ0KHRva2VuLm5leHQgPT0gKGdldE9yU2V0ID8/IG5hbWUpKTsKICAgIG5hbWUgPSBlbnN1cmVJZGVudGlmaWVyKAogICAgICAgIGdldE9yU2V0ID8/IHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC50b3BMZXZlbEZ1bmN0aW9uRGVjbGFyYXRpb24pOwoKICAgIGJvb2wgaXNHZXR0ZXIgPSBmYWxzZTsKICAgIGlmIChnZXRPclNldCA9PSBudWxsKSB7CiAgICAgIHRva2VuID0gcGFyc2VNZXRob2RUeXBlVmFyKG5hbWUpOwogICAgfSBlbHNlIHsKICAgICAgaXNHZXR0ZXIgPSBvcHRpb25hbCgiZ2V0IiwgZ2V0T3JTZXQpOwogICAgICB0b2tlbiA9IG5hbWU7CiAgICAgIGxpc3RlbmVyLmhhbmRsZU5vVHlwZVZhcmlhYmxlcyh0b2tlbi5uZXh0KTsKICAgIH0KICAgIHRva2VuID0gcGFyc2VHZXR0ZXJPckZvcm1hbFBhcmFtZXRlcnMoCiAgICAgICAgdG9rZW4sIG5hbWUsIGlzR2V0dGVyLCBNZW1iZXJLaW5kLlRvcExldmVsTWV0aG9kKTsKICAgIEFzeW5jTW9kaWZpZXIgc2F2ZWRBc3luY01vZGlmaWVyID0gYXN5bmNTdGF0ZTsKICAgIFRva2VuIGFzeW5jVG9rZW4gPSB0b2tlbi5uZXh0OwogICAgdG9rZW4gPSBwYXJzZUFzeW5jTW9kaWZpZXJPcHQodG9rZW4pOwogICAgaWYgKGdldE9yU2V0ICE9IG51bGwgJiYgIWluUGxhaW5TeW5jICYmIG9wdGlvbmFsKCJzZXQiLCBnZXRPclNldCkpIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihhc3luY1Rva2VuLCBmYXN0YS5tZXNzYWdlU2V0dGVyTm90U3luYyk7CiAgICB9CiAgICBib29sIGlzRXh0ZXJuYWwgPSBleHRlcm5hbFRva2VuICE9IG51bGw7CiAgICBpZiAoaXNFeHRlcm5hbCAmJiAhb3B0aW9uYWwoJzsnLCB0b2tlbi5uZXh0KSkgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgZXh0ZXJuYWxUb2tlbiwgZmFzdGEubWVzc2FnZUV4dGVybmFsTWV0aG9kV2l0aEJvZHkpOwogICAgfQogICAgdG9rZW4gPSBwYXJzZUZ1bmN0aW9uQm9keSh0b2tlbiwgZmFsc2UsIGlzRXh0ZXJuYWwpOwogICAgYXN5bmNTdGF0ZSA9IHNhdmVkQXN5bmNNb2RpZmllcjsKICAgIGxpc3RlbmVyLmVuZFRvcExldmVsTWV0aG9kKGJlZm9yZVN0YXJ0Lm5leHQsIGdldE9yU2V0LCB0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZU1ldGhvZFR5cGVWYXIoVG9rZW4gbmFtZSkgewogICAgaWYgKCFvcHRpb25hbCgnPCcsIG5hbWUubmV4dCkpIHsKICAgICAgcmV0dXJuIG5vVHlwZVBhcmFtT3JBcmcucGFyc2VWYXJpYWJsZXMobmFtZSwgdGhpcyk7CiAgICB9CiAgICBUeXBlUGFyYW1PckFyZ0luZm8gdHlwZVZhciA9IGNvbXB1dGVUeXBlUGFyYW1PckFyZyhuYW1lLCB0cnVlKTsKICAgIFRva2VuIHRva2VuID0gdHlwZVZhci5wYXJzZVZhcmlhYmxlcyhuYW1lLCB0aGlzKTsKICAgIGlmIChvcHRpb25hbCgnPScsIHRva2VuLm5leHQpKSB7CiAgICAgIC8vIFJlY292ZXJ5CiAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbih0b2tlbiwgZmFzdGEudGVtcGxhdGVVbmV4cGVjdGVkVG9rZW4pOwogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VGaWVsZEluaXRpYWxpemVyT3B0KAogICAgICBUb2tlbiB0b2tlbiwgVG9rZW4gbmFtZSwgVG9rZW4gdmFyRmluYWxPckNvbnN0LCBib29sIGlzVG9wTGV2ZWwpIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCc9JywgbmV4dCkpIHsKICAgICAgVG9rZW4gYXNzaWdubWVudCA9IG5leHQ7CiAgICAgIGxpc3RlbmVyLmJlZ2luRmllbGRJbml0aWFsaXplcihuZXh0KTsKICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24obmV4dCk7CiAgICAgIGxpc3RlbmVyLmVuZEZpZWxkSW5pdGlhbGl6ZXIoYXNzaWdubWVudCwgdG9rZW4ubmV4dCk7CiAgICB9IGVsc2UgewogICAgICBpZiAodmFyRmluYWxPckNvbnN0ICE9IG51bGwgJiYgIW5hbWUuaXNTeW50aGV0aWMpIHsKICAgICAgICBpZiAob3B0aW9uYWwoImNvbnN0IiwgdmFyRmluYWxPckNvbnN0KSkgewogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgIGZhc3RhLnRlbXBsYXRlQ29uc3RGaWVsZFdpdGhvdXRJbml0aWFsaXplcgogICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhuYW1lLmxleGVtZSkpOwogICAgICAgIH0gZWxzZSBpZiAoaXNUb3BMZXZlbCAmJiBvcHRpb25hbCgiZmluYWwiLCB2YXJGaW5hbE9yQ29uc3QpKSB7CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVGaW5hbEZpZWxkV2l0aG91dEluaXRpYWxpemVyCiAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUubGV4ZW1lKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxpc3RlbmVyLmhhbmRsZU5vRmllbGRJbml0aWFsaXplcih0b2tlbi5uZXh0KTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlVmFyaWFibGVJbml0aWFsaXplck9wdChUb2tlbiB0b2tlbikgewogICAgaWYgKG9wdGlvbmFsKCc9JywgdG9rZW4ubmV4dCkpIHsKICAgICAgVG9rZW4gYXNzaWdubWVudCA9IHRva2VuLm5leHQ7CiAgICAgIGxpc3RlbmVyLmJlZ2luVmFyaWFibGVJbml0aWFsaXplcihhc3NpZ25tZW50KTsKICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24oYXNzaWdubWVudCk7CiAgICAgIGxpc3RlbmVyLmVuZFZhcmlhYmxlSW5pdGlhbGl6ZXIoYXNzaWdubWVudCk7CiAgICB9IGVsc2UgewogICAgICBsaXN0ZW5lci5oYW5kbGVOb1ZhcmlhYmxlSW5pdGlhbGl6ZXIodG9rZW4ubmV4dCk7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZUluaXRpYWxpemVyc09wdChUb2tlbiB0b2tlbikgewogICAgaWYgKG9wdGlvbmFsKCc6JywgdG9rZW4ubmV4dCkpIHsKICAgICAgcmV0dXJuIHBhcnNlSW5pdGlhbGl6ZXJzKHRva2VuKTsKICAgIH0gZWxzZSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZU5vSW5pdGlhbGl6ZXJzKCk7CiAgICAgIHJldHVybiB0b2tlbjsKICAgIH0KICB9CgogIC8vLyBgYGAKICAvLy8gaW5pdGlhbGl6ZXJzOgogIC8vLyAgICc6JyBpbml0aWFsaXplckxpc3RFbnRyeSAoJywnIGluaXRpYWxpemVyTGlzdEVudHJ5KSoKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUluaXRpYWxpemVycyhUb2tlbiB0b2tlbikgewogICAgVG9rZW4gYmVnaW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCc6JywgYmVnaW4pKTsKICAgIGxpc3RlbmVyLmJlZ2luSW5pdGlhbGl6ZXJzKGJlZ2luKTsKICAgIGludCBjb3VudCA9IDA7CiAgICBib29sIG9sZCA9IG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9uczsKICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IGZhbHNlOwogICAgVG9rZW4gbmV4dCA9IGJlZ2luOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgdG9rZW4gPSBwYXJzZUluaXRpYWxpemVyKG5leHQpOwogICAgICArK2NvdW50OwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKCFvcHRpb25hbCgnLCcsIG5leHQpKSB7CiAgICAgICAgaWYgKCFuZXh0LmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8vIFJlY292ZXJ5OiBGb3VuZCBhbiBpZGVudGlmaWVyIHdoaWNoIGNvdWxkIGJlCiAgICAgICAgLy8gMSkgbWlzc2luZyBwcmVjZWRpbmcgYCxgIHRodXMgaXQncyBhbm90aGVyIGluaXRpYWxpemVyLCBvcgogICAgICAgIC8vIDIpIG1pc3NpbmcgcHJlY2VkaW5nIGA7YCB0aHVzIGl0J3MgYSBjbGFzcyBtZW1iZXIsIG9yCiAgICAgICAgLy8gMykgbWlzc2luZyBwcmVjZWRpbmcgJ3snIHRodXMgaXQncyBhIHN0YXRlbWVudAogICAgICAgIGlmIChvcHRpb25hbCgnYXNzZXJ0JywgbmV4dCkpIHsKICAgICAgICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICAgICAgICBpZiAoIW9wdGlvbmFsKCcoJywgbmV4dCkpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBMb29rcyBsaWtlIGFzc2VydCBleHByZXNzaW9uIC4uLiBmYWxsIHRocm91Z2ggdG8gaW5zZXJ0IGNvbW1hCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChvcHRpb25hbCgndGhpcycsIG5leHQpKSB7CiAgICAgICAgICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICAgICAgICAgIGlmICghb3B0aW9uYWwoJy4nLCBuZXh0KSkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICAgICAgICAgIGlmICghbmV4dC5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgbmV4dCA9IG5leHQubmV4dDsKICAgICAgICAgIGlmICghb3B0aW9uYWwoJz0nLCBuZXh0KSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIC8vIExvb2tzIGxpa2UgZmllbGQgYXNzaWdubWVudC4uLiBmYWxsIHRocm91Z2ggdG8gaW5zZXJ0IGNvbW1hCiAgICAgICAgfQogICAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBDb25zaWRlciBlbmhhbmNpbmcgdGhpcyB0byBpbmRpY2F0ZSB0aGF0IHdlIGFyZQogICAgICAgIC8vIGV4cGVjdGluZyBvbmUgb2YgYCxgIG9yIGA7YCBvciBge2AKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICB0b2tlbiwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEFmdGVyQnV0R290LndpdGhBcmd1bWVudHMoJywnKSk7CiAgICAgICAgbmV4dCA9IHJld3JpdGVyLmluc2VydFRva2VuKAogICAgICAgICAgICB0b2tlbiwgbmV3IFN5bnRoZXRpY1Rva2VuKFRva2VuVHlwZS5DT01NQSwgdG9rZW4ubmV4dC5jaGFyT2Zmc2V0KSk7CiAgICAgIH0KICAgIH0KICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IG9sZDsKICAgIGxpc3RlbmVyLmVuZEluaXRpYWxpemVycyhjb3VudCwgYmVnaW4sIHRva2VuLm5leHQpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyBpbml0aWFsaXplckxpc3RFbnRyeToKICAvLy8gICAnc3VwZXInICgnLicgaWRlbnRpZmllcik/IGFyZ3VtZW50cyB8CiAgLy8vICAgZmllbGRJbml0aWFsaXplciB8CiAgLy8vICAgYXNzZXJ0aW9uCiAgLy8vIDsKICAvLy8KICAvLy8gZmllbGRJbml0aWFsaXplcjoKICAvLy8gICAoJ3RoaXMnICcuJyk/IGlkZW50aWZpZXIgJz0nIGNvbmRpdGlvbmFsRXhwcmVzc2lvbiBjYXNjYWRlU2VjdGlvbioKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUluaXRpYWxpemVyKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGxpc3RlbmVyLmJlZ2luSW5pdGlhbGl6ZXIobmV4dCk7CiAgICBUb2tlbiBiZWZvcmVFeHByZXNzaW9uID0gdG9rZW47CiAgICBpZiAob3B0aW9uYWwoJ2Fzc2VydCcsIG5leHQpKSB7CiAgICAgIHRva2VuID0gcGFyc2VBc3NlcnQodG9rZW4sIEFzc2VydC5Jbml0aWFsaXplcik7CiAgICAgIGxpc3RlbmVyLmVuZEluaXRpYWxpemVyKHRva2VuLm5leHQpOwogICAgICByZXR1cm4gdG9rZW47CiAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCdzdXBlcicsIG5leHQpKSB7CiAgICAgIHJldHVybiBwYXJzZVN1cGVySW5pdGlhbGl6ZXJFeHByZXNzaW9uKHRva2VuKTsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ3RoaXMnLCBuZXh0KSkgewogICAgICB0b2tlbiA9IG5leHQ7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJy4nLCBuZXh0KSkgewogICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICBpZiAobmV4dC5pc0lkZW50aWZpZXIpIHsKICAgICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICAgIHRva2VuID0gaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcigKICAgICAgICAgICAgICB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQuZmllbGRJbml0aWFsaXplcik7CiAgICAgICAgfQogICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIGlmIChvcHRpb25hbCgnPScsIG5leHQpKSB7CiAgICAgICAgICByZXR1cm4gcGFyc2VJbml0aWFsaXplckV4cHJlc3Npb25SZXN0KGJlZm9yZUV4cHJlc3Npb24pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAob3B0aW9uYWwoJygnLCBuZXh0KSkgewogICAgICAgIHRva2VuID0gcGFyc2VJbml0aWFsaXplckV4cHJlc3Npb25SZXN0KGJlZm9yZUV4cHJlc3Npb24pOwogICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIGlmIChvcHRpb25hbCgneycsIG5leHQpIHx8IG9wdGlvbmFsKCc9PicsIG5leHQpKSB7CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgIG5leHQsIGZhc3RhLm1lc3NhZ2VSZWRpcmVjdGluZ0NvbnN0cnVjdG9yV2l0aEJvZHkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgIH0KICAgICAgLy8gUmVjb3ZlcnkKICAgICAgaWYgKG9wdGlvbmFsKCd0aGlzJywgdG9rZW4pKSB7CiAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IENvbnNpZGVyIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0CiAgICAgICAgLy8gYHRoaXMuPGZpZWxkbmFtZT49YCBpcyBleHBlY3RlZC4KICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICBuZXh0LCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQnV0R290LndpdGhBcmd1bWVudHMoJy4nKSk7CiAgICAgICAgcmV3cml0ZXIuaW5zZXJ0VG9rZW4oCiAgICAgICAgICAgIHRva2VuLCBuZXcgU3ludGhldGljVG9rZW4oVG9rZW5UeXBlLlBFUklPRCwgbmV4dC5vZmZzZXQpKTsKICAgICAgICB0b2tlbiA9IHJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4ubmV4dCk7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIH0KICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIHJlY292ZXJ5CiAgICB9IGVsc2UgaWYgKG5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgIFRva2VuIG5leHQyID0gbmV4dC5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJz0nLCBuZXh0MikpIHsKICAgICAgICByZXR1cm4gcGFyc2VJbml0aWFsaXplckV4cHJlc3Npb25SZXN0KHRva2VuKTsKICAgICAgfQogICAgICAvLyBSZWNvdmVyeTogSWYgdGhpcyBsb29rcyBsaWtlIGFuIGV4cHJlc3Npb24sCiAgICAgIC8vIHRoZW4gZmFsbCB0aHJvdWdoIHRvIGluc2VydCB0aGUgTEhTIGFuZCBgPWAgb2YgdGhlIGFzc2lnbm1lbnQsCiAgICAgIC8vIG90aGVyd2lzZSBpbnNlcnQgYW4gYD1gIGFuZCBzeW50aGV0aWMgaWRlbnRpZmllci4KICAgICAgaWYgKCFuZXh0Mi5pc09wZXJhdG9yICYmICFvcHRpb25hbCgnLicsIG5leHQyKSkgewogICAgICAgIHRva2VuID0gcmV3cml0ZXIuaW5zZXJ0VG9rZW4oCiAgICAgICAgICAgIG5leHQsIG5ldyBTeW50aGV0aWNUb2tlbihUb2tlblR5cGUuRVEsIG5leHQyLm9mZnNldCkpOwogICAgICAgIHRva2VuID0gaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbiwgSWRlbnRpZmllckNvbnRleHQuZXhwcmVzc2lvbiwKICAgICAgICAgICAgbWVzc2FnZTogZmFzdGEubWVzc2FnZU1pc3NpbmdBc3NpZ25tZW50SW5Jbml0aWFsaXplciwKICAgICAgICAgICAgbWVzc2FnZU9uVG9rZW46IG5leHQpOwogICAgICAgIHJldHVybiBwYXJzZUluaXRpYWxpemVyRXhwcmVzc2lvblJlc3QoYmVmb3JlRXhwcmVzc2lvbik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIFJlY292ZXJ5OiBJbnNlcnQgYSBzeW50aGV0aWMgYXNzaWdubWVudC4KICAgICAgdG9rZW4gPSBpbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKAogICAgICAgICAgdG9rZW4sIElkZW50aWZpZXJDb250ZXh0LmZpZWxkSW5pdGlhbGl6ZXIsCiAgICAgICAgICBtZXNzYWdlOiBmYXN0YS5tZXNzYWdlRXhwZWN0ZWRBbkluaXRpYWxpemVyLCBtZXNzYWdlT25Ub2tlbjogdG9rZW4pOwogICAgICB0b2tlbiA9IHJld3JpdGVyLmluc2VydFRva2VuKAogICAgICAgICAgdG9rZW4sIG5ldyBTeW50aGV0aWNUb2tlbihUb2tlblR5cGUuRVEsIHRva2VuLm9mZnNldCkpOwogICAgICB0b2tlbiA9IHJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4pOwogICAgICByZXR1cm4gcGFyc2VJbml0aWFsaXplckV4cHJlc3Npb25SZXN0KGJlZm9yZUV4cHJlc3Npb24pOwogICAgfQogICAgLy8gUmVjb3Zlcnk6CiAgICAvLyBJbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciBhbmQgYXNzaWdubWVudCBvcGVyYXRvcgogICAgLy8gdG8gZW5zdXJlIHRoYXQgdGhlIGV4cHJlc3Npb24gaXMgaW5kZWVkIGFuIGFzc2lnbm1lbnQuCiAgICAvLyBGYWlsaW5nIHRvIGRvIHNvIGNhdXNlcyB0aGlzIHRlc3QgdG8gZmFpbDoKICAgIC8vIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL3JlZ3Jlc3MvaXNzdWVfMzExOTIuZGFydAogICAgLy8gVE9ETyhkYW5ydWJlbCk6IEludmVzdGlnYXRlIGJldHRlciByZWNvdmVyeS4KICAgIHRva2VuID0gaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcigKICAgICAgICBiZWZvcmVFeHByZXNzaW9uLCBJZGVudGlmaWVyQ29udGV4dC5maWVsZEluaXRpYWxpemVyLAogICAgICAgIG1lc3NhZ2U6IGZhc3RhLm1lc3NhZ2VNaXNzaW5nQXNzaWdubWVudEluSW5pdGlhbGl6ZXIpOwogICAgcmV3cml0ZXIuaW5zZXJ0VG9rZW4odG9rZW4sIG5ldyBTeW50aGV0aWNUb2tlbihUb2tlblR5cGUuRVEsIHRva2VuLm9mZnNldCkpOwogICAgcmV0dXJuIHBhcnNlSW5pdGlhbGl6ZXJFeHByZXNzaW9uUmVzdChiZWZvcmVFeHByZXNzaW9uKTsKICB9CgogIC8vLyBQYXJzZSB0aGUgYHN1cGVyYCBpbml0aWFsaXplcjoKICAvLy8gYGBgCiAgLy8vICAgJ3N1cGVyJyAoJy4nIGlkZW50aWZpZXIpPyBhcmd1bWVudHMgOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZVN1cGVySW5pdGlhbGl6ZXJFeHByZXNzaW9uKGZpbmFsIFRva2VuIHN0YXJ0KSB7CiAgICBUb2tlbiB0b2tlbiA9IHN0YXJ0Lm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ3N1cGVyJywgdG9rZW4pKTsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCcuJywgbmV4dCkpIHsKICAgICAgdG9rZW4gPSBuZXh0OwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKG5leHQua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKSB7CiAgICAgICAgbmV4dCA9IElkZW50aWZpZXJDb250ZXh0LmV4cHJlc3Npb25Db250aW51YXRpb24KICAgICAgICAgICAgLmVuc3VyZUlkZW50aWZpZXIodG9rZW4sIHRoaXMpOwogICAgICB9CiAgICAgIHRva2VuID0gbmV4dDsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICB9CiAgICBpZiAoIW9wdGlvbmFsKCcoJywgbmV4dCkpIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgaWYgKG9wdGlvbmFsKCc/LicsIG5leHQpKSB7CiAgICAgICAgLy8gQW4gZXJyb3IgZm9yIGBzdXBlcj8uYCBpcyByZXBvcnRlZCBpbiBwYXJzZVN1cGVyRXhwcmVzc2lvbi4KICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgaWYgKCFuZXh0LmlzSWRlbnRpZmllcikgewogICAgICAgICAgLy8gSW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgYnV0IGRvbid0IHJlcG9ydCBhbm90aGVyIGVycm9yLgogICAgICAgICAgbmV4dCA9IHJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4pOwogICAgICAgIH0KICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIH0KICAgICAgaWYgKG9wdGlvbmFsKCc9JywgbmV4dCkpIHsKICAgICAgICBpZiAob3B0aW9uYWwoJ3N1cGVyJywgdG9rZW4pKSB7CiAgICAgICAgICAvLyBwYXJzZUV4cHJlc3Npb24gd2lsbCByZXBvcnQgZXJyb3Igb24gYXNzaWdubWVudCB0byBzdXBlcgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgIHRva2VuLCBmYXN0YS5tZXNzYWdlRmllbGRJbml0aWFsaXplZE91dHNpZGVEZWNsYXJpbmdDbGFzcyk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKCFvcHRpb25hbCgnKCcsIG5leHQpKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgbmV4dCwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEFmdGVyQnV0R290LndpdGhBcmd1bWVudHMoJygnKSk7CiAgICAgICAgcmV3cml0ZXIuaW5zZXJ0UGFyZW5zKHRva2VuLCBmYWxzZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwYXJzZUluaXRpYWxpemVyRXhwcmVzc2lvblJlc3Qoc3RhcnQpOwogIH0KCiAgVG9rZW4gcGFyc2VJbml0aWFsaXplckV4cHJlc3Npb25SZXN0KFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvbih0b2tlbik7CiAgICBsaXN0ZW5lci5lbmRJbml0aWFsaXplcih0b2tlbi5uZXh0KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhbiBvcGVuaW5nIGN1cmx5IGJyYWNlLCByZXR1cm4gaXQuIE90aGVyd2lzZSwgdXNlIHRoZQogIC8vLyBnaXZlbiBbdGVtcGxhdGVdIHRvIHJlcG9ydCBhbiBlcnJvciwgaW5zZXJ0IGFuIG9wZW5pbmcgYW5kIGEgY2xvc2luZyBjdXJseQogIC8vLyBicmFjZSwgYW5kIHJldHVybiB0aGUgbmV3bHkgaW5zZXJ0ZWQgb3BlbmluZyBjdXJseSBicmFjZS4gSWYgdGhlCiAgLy8vIFt0ZW1wbGF0ZV0gaXMgYG51bGxgLCB1c2UgYSBkZWZhdWx0IGVycm9yIG1lc3NhZ2UgaW5zdGVhZC4KICBUb2tlbiBlbnN1cmVCbG9jaygKICAgICAgVG9rZW4gdG9rZW4sIFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiB0ZW1wbGF0ZSkgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJ3snLCBuZXh0KSkgcmV0dXJuIG5leHQ7CiAgICBNZXNzYWdlIG1lc3NhZ2UgPSB0ZW1wbGF0ZSA9PSBudWxsCiAgICAgICAgPyBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQnV0R290LndpdGhBcmd1bWVudHMoJ3snKQogICAgICAgIDogdGVtcGxhdGUud2l0aEFyZ3VtZW50cyhuZXh0KTsKICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgbWVzc2FnZSk7CiAgICByZXR1cm4gaW5zZXJ0QmxvY2sodG9rZW4pOwogIH0KCiAgVG9rZW4gaW5zZXJ0QmxvY2soVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgQmVnaW5Ub2tlbiBiZWdpbkdyb3VwID0gcmV3cml0ZXIuaW5zZXJ0VG9rZW4odG9rZW4sCiAgICAgICAgbmV3IFN5bnRoZXRpY0JlZ2luVG9rZW4oVG9rZW5UeXBlLk9QRU5fQ1VSTFlfQlJBQ0tFVCwgbmV4dC5vZmZzZXQpKTsKICAgIFRva2VuIGVuZEdyb3VwID0gcmV3cml0ZXIuaW5zZXJ0VG9rZW4oYmVnaW5Hcm91cCwKICAgICAgICBuZXcgU3ludGhldGljVG9rZW4oVG9rZW5UeXBlLkNMT1NFX0NVUkxZX0JSQUNLRVQsIG5leHQub2Zmc2V0KSk7CiAgICBiZWdpbkdyb3VwLmVuZEdyb3VwID0gZW5kR3JvdXA7CiAgICByZXR1cm4gYmVnaW5Hcm91cDsKICB9CgogIC8vLyBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIGNsb3NpbmcgcGFyZW50aGVzaXMsIHJldHVybiBpdC4KICAvLy8gT3RoZXJ3aXNlLCByZXBvcnQgYW4gZXJyb3IgYW5kIHJldHVybiB0aGUgY2xvc2luZyBwYXJlbnRoZXNpcwogIC8vLyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBvcGVuIHBhcmVudGhlc2lzLgogIFRva2VuIGVuc3VyZUNsb3NlUGFyZW4oVG9rZW4gdG9rZW4sIFRva2VuIG9wZW5QYXJlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJyknLCBuZXh0KSkgewogICAgICByZXR1cm4gbmV4dDsKICAgIH0KICAgIGlmIChvcGVuUGFyZW4uZW5kR3JvdXAuaXNTeW50aGV0aWMpIHsKICAgICAgLy8gU2Nhbm5lciBoYXMgYWxyZWFkeSByZXBvcnRlZCBhIG1pc3NpbmcgYClgIGVycm9yLAogICAgICAvLyBidXQgcGxhY2VkIHRoZSBgKWAgaW4gdGhlIHdyb25nIGxvY2F0aW9uLCBzbyBtb3ZlIGl0LgogICAgICByZXR1cm4gcmV3cml0ZXIubW92ZVN5bnRoZXRpYyh0b2tlbiwgb3BlblBhcmVuLmVuZEdyb3VwKTsKICAgIH0KCiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogUGFzcyBpbiBjb250ZXh0IGZvciBiZXR0ZXIgZXJyb3IgbWVzc2FnZS4KICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgbmV4dCwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCcpJykpOwoKICAgIC8vIFNjYW5uZXIgZ3VhcmFudGVlcyBhIGNsb3NpbmcgcGFyZW50aGVzaXMKICAgIC8vIFRPRE8oZGFucnViZWwpOiBJbXByb3ZlIHJlY292ZXJ5IGJ5IGhhdmluZyBjYWxsZXJzIHBhcnNlIHRva2VucwogICAgLy8gYmV0d2VlbiBgdG9rZW5gIGFuZCBgb3BlblBhcmVuLmVuZEdyb3VwYC4KICAgIHJldHVybiBvcGVuUGFyZW4uZW5kR3JvdXA7CiAgfQoKICAvLy8gSWYgdGhlIG5leHQgdG9rZW4gaXMgYSBjb2xvbiwgcmV0dXJuIGl0LiBPdGhlcndpc2UsIHJlcG9ydCBhbgogIC8vLyBlcnJvciwgaW5zZXJ0IGEgc3ludGhldGljIGNvbG9uLCBhbmQgcmV0dXJuIHRoZSBpbnNlcnRlZCBjb2xvbi4KICBUb2tlbiBlbnN1cmVDb2xvbihUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJzonLCBuZXh0KSkgcmV0dXJuIG5leHQ7CiAgICBNZXNzYWdlIG1lc3NhZ2UgPSBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQnV0R290LndpdGhBcmd1bWVudHMoJzonKTsKICAgIFRva2VuIG5ld1Rva2VuID0gbmV3IFN5bnRoZXRpY1Rva2VuKFRva2VuVHlwZS5DT0xPTiwgbmV4dC5jaGFyT2Zmc2V0KTsKICAgIHJldHVybiByZXdyaXRlQW5kUmVjb3Zlcih0b2tlbiwgbWVzc2FnZSwgbmV3VG9rZW4pOwogIH0KCiAgLy8vIElmIHRoZSB0b2tlbiBhZnRlciBbdG9rZW5dIGlzIGEgbm90IGxpdGVyYWwgc3RyaW5nLAogIC8vLyB0aGVuIGluc2VydCBhIHN5bnRoZXRpYyBsaXRlcmFsIHN0cmluZy4KICAvLy8gQ2FsbCBgcGFyc2VMaXRlcmFsU3RyaW5nYCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCiAgVG9rZW4gZW5zdXJlTGl0ZXJhbFN0cmluZyhUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAoIWlkZW50aWNhbChuZXh0LmtpbmQsIFNUUklOR19UT0tFTikpIHsKICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZmFzdGEudGVtcGxhdGVFeHBlY3RlZFN0cmluZy53aXRoQXJndW1lbnRzKG5leHQpOwogICAgICBUb2tlbiBuZXdUb2tlbiA9CiAgICAgICAgICBuZXcgU3ludGhldGljU3RyaW5nVG9rZW4oVG9rZW5UeXBlLlNUUklORywgJyIiJywgbmV4dC5jaGFyT2Zmc2V0LCAwKTsKICAgICAgcmV3cml0ZUFuZFJlY292ZXIodG9rZW4sIG1lc3NhZ2UsIG5ld1Rva2VuKTsKICAgIH0KICAgIHJldHVybiBwYXJzZUxpdGVyYWxTdHJpbmcodG9rZW4pOwogIH0KCiAgLy8vIElmIHRoZSB0b2tlbiBhZnRlciBbdG9rZW5dIGlzIGEgc2VtaS1jb2xvbiwgcmV0dXJuIGl0LgogIC8vLyBPdGhlcndpc2UsIHJlcG9ydCBhbiBlcnJvciwgaW5zZXJ0IGEgc3ludGhldGljIHNlbWktY29sb24sCiAgLy8vIGFuZCByZXR1cm4gdGhlIGluc2VydGVkIHNlbWktY29sb24uCiAgVG9rZW4gZW5zdXJlU2VtaWNvbG9uKFRva2VuIHRva2VuKSB7CiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogT25jZSBhbGwgZXhwZWN0KCc7Jy4uLikgY2FsbCBzaXRlcyBoYXZlIGJlZW4gY29udmVydGVkCiAgICAvLyB0byB1c2UgdGhpcyBtZXRob2QsIHJlbW92ZSBzaW1pbGFyIHNlbWljb2xvbiByZWNvdmVyeSBjb2RlCiAgICAvLyBmcm9tIHRoZSBoYW5kbGVFcnJvciBtZXRob2QgaW4gZWxlbWVudF9saXN0ZW5lci5kYXJ0LgogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJzsnLCBuZXh0KSkgcmV0dXJuIG5leHQ7CgogICAgLy8gRmluZCBhIHRva2VuIG9uIHRoZSBzYW1lIGxpbmUgYXMgd2hlcmUgdGhlICc7JyBzaG91bGQgYmUgaW5zZXJ0ZWQuCiAgICAvLyBSZXBvcnRpbmcgdGhlIGVycm9yIG9uIHRoaXMgdG9rZW4gbWFrZXMgaXQgZWFzaWVyCiAgICAvLyBmb3IgdXNlcnMgdG8gdW5kZXJzdGFuZCBhbmQgZml4IHRoZSBlcnJvci4KICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoZmluZFByZXZpb3VzTm9uWmVyb0xlbmd0aFRva2VuKHRva2VuKSwKICAgICAgICBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQWZ0ZXJCdXRHb3Qud2l0aEFyZ3VtZW50cygnOycpKTsKCiAgICByZXR1cm4gcmV3cml0ZXIuaW5zZXJ0VG9rZW4oCiAgICAgICAgdG9rZW4sIG5ldyBTeW50aGV0aWNUb2tlbihUb2tlblR5cGUuU0VNSUNPTE9OLCBuZXh0LmNoYXJPZmZzZXQpKTsKICB9CgogIC8vLyBSZXBvcnQgYW4gZXJyb3IgYXQgdGhlIHRva2VuIGFmdGVyIFt0b2tlbl0gdGhhdCBoYXMgdGhlIGdpdmVuIFttZXNzYWdlXS4KICAvLy8gSW5zZXJ0IHRoZSBbbmV3VG9rZW5dIGFmdGVyIFt0b2tlbl0gYW5kIHJldHVybiBbbmV3VG9rZW5dLgogIFRva2VuIHJld3JpdGVBbmRSZWNvdmVyKFRva2VuIHRva2VuLCBNZXNzYWdlIG1lc3NhZ2UsIFRva2VuIG5ld1Rva2VuKSB7CiAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLm5leHQsIG1lc3NhZ2UpOwogICAgcmV0dXJuIHJld3JpdGVyLmluc2VydFRva2VuKHRva2VuLCBuZXdUb2tlbik7CiAgfQoKICAvLy8gUmVwbGFjZSB0aGUgdG9rZW4gYWZ0ZXIgW3Rva2VuXSB3aXRoIGBbYCBmb2xsb3dlZCBieSBgXWAKICAvLy8gYW5kIHJldHVybiBbdG9rZW5dLgogIFRva2VuIHJld3JpdGVTcXVhcmVCcmFja2V0cyhUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ1tdJywgbmV4dCkpOwogICAgVG9rZW4gcmVwbGFjZW1lbnQgPSBsaW5rKAogICAgICAgIG5ldyBCZWdpblRva2VuKFRva2VuVHlwZS5PUEVOX1NRVUFSRV9CUkFDS0VULCBuZXh0Lm9mZnNldCksCiAgICAgICAgbmV3IFRva2VuKFRva2VuVHlwZS5DTE9TRV9TUVVBUkVfQlJBQ0tFVCwgbmV4dC5vZmZzZXQgKyAxKSk7CiAgICByZXdyaXRlci5yZXBsYWNlVG9rZW5Gb2xsb3dpbmcodG9rZW4sIHJlcGxhY2VtZW50KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBSZXBvcnQgdGhlIGdpdmVuIHRva2VuIGFzIHVuZXhwZWN0ZWQgYW5kIHJldHVybiB0aGUgbmV4dCB0b2tlbiBpZiB0aGUgbmV4dAogIC8vLyB0b2tlbiBpcyBvbmUgb2YgdGhlIFtleHBlY3RlZE5leHRdLCBvdGhlcndpc2UganVzdCByZXR1cm4gdGhlIGdpdmVuIHRva2VuLgogIFRva2VuIHNraXBVbmV4cGVjdGVkVG9rZW5PcHQoVG9rZW4gdG9rZW4sIExpc3Q8U3RyaW5nPiBleHBlY3RlZE5leHQpIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG5leHQua2V5d29yZCA9PSBudWxsKSB7CiAgICAgIGZpbmFsIFN0cmluZyBuZXh0VmFsdWUgPSBuZXh0Lm5leHQuc3RyaW5nVmFsdWU7CiAgICAgIGZvciAoU3RyaW5nIGV4cGVjdGVkVmFsdWUgaW4gZXhwZWN0ZWROZXh0KSB7CiAgICAgICAgaWYgKGlkZW50aWNhbChuZXh0VmFsdWUsIGV4cGVjdGVkVmFsdWUpKSB7CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKG5leHQsIGZhc3RhLnRlbXBsYXRlVW5leHBlY3RlZFRva2VuKTsKICAgICAgICAgIHJldHVybiBuZXh0OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VOYXRpdmVDbGF1c2UoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5hdGl2ZVRva2VuID0gdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCduYXRpdmUnLCBuYXRpdmVUb2tlbikpOwogICAgYm9vbCBoYXNOYW1lID0gZmFsc2U7CiAgICBpZiAodG9rZW4ubmV4dC5raW5kID09IFNUUklOR19UT0tFTikgewogICAgICBoYXNOYW1lID0gdHJ1ZTsKICAgICAgdG9rZW4gPSBwYXJzZUxpdGVyYWxTdHJpbmcodG9rZW4pOwogICAgfQogICAgbGlzdGVuZXIuaGFuZGxlTmF0aXZlQ2xhdXNlKG5hdGl2ZVRva2VuLCBoYXNOYW1lKTsKICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgbmF0aXZlVG9rZW4sIGZhc3RhLm1lc3NhZ2VOYXRpdmVDbGF1c2VTaG91bGRCZUFubm90YXRpb24pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gc2tpcENsYXNzT3JNaXhpbkJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIC8vIFRoZSBzY2FubmVyIGVuc3VyZXMgdGhhdCBge2AgYWx3YXlzIGhhcyBhIGNsb3NpbmcgYH1gLgogICAgcmV0dXJuIGVuc3VyZUJsb2NrKHRva2VuLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQ2xhc3NPck1peGluQm9keSk7CiAgfQoKICAvLy8gYGBgCiAgLy8vIGNsYXNzQm9keToKICAvLy8gICAneycgY2xhc3NNZW1iZXIqICd9JwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlQ2xhc3NPck1peGluQm9keShUb2tlbiB0b2tlbikgewogICAgVG9rZW4gYmVnaW4gPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ3snLCB0b2tlbikpOwogICAgbGlzdGVuZXIuYmVnaW5DbGFzc09yTWl4aW5Cb2R5KHRva2VuKTsKICAgIGludCBjb3VudCA9IDA7CiAgICB3aGlsZSAobm90RW9mT3JWYWx1ZSgnfScsIHRva2VuLm5leHQpKSB7CiAgICAgIHRva2VuID0gcGFyc2VDbGFzc09yTWl4aW5NZW1iZXJJbXBsKHRva2VuKTsKICAgICAgKytjb3VudDsKICAgIH0KICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnfScsIHRva2VuKSk7CiAgICBsaXN0ZW5lci5lbmRDbGFzc09yTWl4aW5Cb2R5KGNvdW50LCBiZWdpbiwgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgYm9vbCBpc1VuYXJ5TWludXMoVG9rZW4gdG9rZW4pID0+CiAgICAgIHRva2VuLmtpbmQgPT0gSURFTlRJRklFUl9UT0tFTiAmJgogICAgICB0b2tlbi5sZXhlbWUgPT0gJ3VuYXJ5JyAmJgogICAgICBvcHRpb25hbCgnLScsIHRva2VuLm5leHQpOwoKICAvLy8gUGFyc2UgYSBjbGFzcyBvciBtaXhpbiBtZW1iZXIuCiAgLy8vCiAgLy8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgaW52b2tlZCBmcm9tIG91dHNpZGUgdGhlIHBhcnNlci4gQXMgYSByZXN1bHQsIHRoaXMKICAvLy8gbWV0aG9kIHRha2VzIHRoZSBuZXh0IHRva2VuIHRvIGJlIGNvbnN1bWVkIHJhdGhlciB0aGFuIHRoZSBsYXN0IGNvbnN1bWVkCiAgLy8vIHRva2VuIGFuZCByZXR1cm5zIHRoZSB0b2tlbiBhZnRlciB0aGUgbGFzdCBjb25zdW1lZCB0b2tlbiByYXRoZXIgdGhhbiB0aGUKICAvLy8gbGFzdCBjb25zdW1lZCB0b2tlbi4KICBUb2tlbiBwYXJzZUNsYXNzT3JNaXhpbk1lbWJlcihUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIHBhcnNlQ2xhc3NPck1peGluTWVtYmVySW1wbChzeW50aGV0aWNQcmV2aW91c1Rva2VuKHRva2VuKSkubmV4dDsKICB9CgogIC8vLyBgYGAKICAvLy8gY2xhc3NNZW1iZXI6CiAgLy8vICAgZmllbGREZWNsYXJhdGlvbiB8CiAgLy8vICAgY29uc3RydWN0b3JEZWNsYXJhdGlvbiB8CiAgLy8vICAgbWV0aG9kRGVjbGFyYXRpb24KICAvLy8gOwogIC8vLwogIC8vLyBtaXhpbk1lbWJlcjoKICAvLy8gICBmaWVsZERlY2xhcmF0aW9uIHwKICAvLy8gICBtZXRob2REZWNsYXJhdGlvbgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlQ2xhc3NPck1peGluTWVtYmVySW1wbChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gYmVmb3JlU3RhcnQgPSB0b2tlbiA9IHBhcnNlTWV0YWRhdGFTdGFyKHRva2VuKTsKCiAgICBUb2tlbiBjb3ZhcmlhbnRUb2tlbjsKICAgIFRva2VuIGV4dGVybmFsVG9rZW47CiAgICBUb2tlbiBzdGF0aWNUb2tlbjsKICAgIFRva2VuIHZhckZpbmFsT3JDb25zdDsKCiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChpc01vZGlmaWVyKG5leHQpKSB7CiAgICAgIGlmIChvcHRpb25hbCgnZXh0ZXJuYWwnLCBuZXh0KSkgewogICAgICAgIGV4dGVybmFsVG9rZW4gPSB0b2tlbiA9IG5leHQ7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIH0KICAgICAgaWYgKGlzTW9kaWZpZXIobmV4dCkpIHsKICAgICAgICBpZiAob3B0aW9uYWwoJ3N0YXRpYycsIG5leHQpKSB7CiAgICAgICAgICBzdGF0aWNUb2tlbiA9IHRva2VuID0gbmV4dDsKICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ2NvdmFyaWFudCcsIG5leHQpKSB7CiAgICAgICAgICBjb3ZhcmlhbnRUb2tlbiA9IHRva2VuID0gbmV4dDsKICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIH0KICAgICAgICBpZiAoaXNNb2RpZmllcihuZXh0KSkgewogICAgICAgICAgaWYgKG9wdGlvbmFsKCdmaW5hbCcsIG5leHQpKSB7CiAgICAgICAgICAgIHZhckZpbmFsT3JDb25zdCA9IHRva2VuID0gbmV4dDsKICAgICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCd2YXInLCBuZXh0KSkgewogICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QgPSB0b2tlbiA9IG5leHQ7CiAgICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25hbCgnY29uc3QnLCBuZXh0KSAmJiBjb3ZhcmlhbnRUb2tlbiA9PSBudWxsKSB7CiAgICAgICAgICAgIHZhckZpbmFsT3JDb25zdCA9IHRva2VuID0gbmV4dDsKICAgICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaXNNb2RpZmllcihuZXh0KSkgewogICAgICAgICAgICBNb2RpZmllclJlY292ZXJ5Q29udGV4dCBjb250ZXh0ID0gbmV3IE1vZGlmaWVyUmVjb3ZlcnlDb250ZXh0KHRoaXMpOwogICAgICAgICAgICB0b2tlbiA9IGNvbnRleHQucGFyc2VDbGFzc01lbWJlck1vZGlmaWVycyh0b2tlbiwKICAgICAgICAgICAgICAgIGV4dGVybmFsVG9rZW46IGV4dGVybmFsVG9rZW4sCiAgICAgICAgICAgICAgICBzdGF0aWNUb2tlbjogc3RhdGljVG9rZW4sCiAgICAgICAgICAgICAgICBjb3ZhcmlhbnRUb2tlbjogY292YXJpYW50VG9rZW4sCiAgICAgICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3Q6IHZhckZpbmFsT3JDb25zdCk7CiAgICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwoKICAgICAgICAgICAgY292YXJpYW50VG9rZW4gPSBjb250ZXh0LmNvdmFyaWFudFRva2VuOwogICAgICAgICAgICBleHRlcm5hbFRva2VuID0gY29udGV4dC5leHRlcm5hbFRva2VuOwogICAgICAgICAgICBzdGF0aWNUb2tlbiA9IGNvbnRleHQuc3RhdGljVG9rZW47CiAgICAgICAgICAgIHZhckZpbmFsT3JDb25zdCA9IGNvbnRleHQudmFyRmluYWxPckNvbnN0OwoKICAgICAgICAgICAgY29udGV4dCA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgbGlzdGVuZXIuYmVnaW5NZW1iZXIoKTsKCiAgICBUb2tlbiBiZWZvcmVUeXBlID0gdG9rZW47CiAgICBUeXBlSW5mbyB0eXBlSW5mbyA9IGNvbXB1dGVUeXBlKHRva2VuLCBmYWxzZSwgdHJ1ZSk7CiAgICB0b2tlbiA9IHR5cGVJbmZvLnNraXBUeXBlKHRva2VuKTsKICAgIG5leHQgPSB0b2tlbi5uZXh0OwoKICAgIFRva2VuIGdldE9yU2V0OwogICAgaWYgKG5leHQudHlwZSAhPSBUb2tlblR5cGUuSURFTlRJRklFUikgewogICAgICBTdHJpbmcgdmFsdWUgPSBuZXh0LnN0cmluZ1ZhbHVlOwogICAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnZ2V0JykgfHwgaWRlbnRpY2FsKHZhbHVlLCAnc2V0JykpIHsKICAgICAgICBpZiAobmV4dC5uZXh0LmlzSWRlbnRpZmllcikgewogICAgICAgICAgZ2V0T3JTZXQgPSB0b2tlbiA9IG5leHQ7CiAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICB9CiAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIGNvbnRpbnVlIHBhcnNpbmcgYGdldGAgb3IgYHNldGAgYXMgYW4gaWRlbnRpZmllci4KICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdmYWN0b3J5JykpIHsKICAgICAgICBUb2tlbiBuZXh0MiA9IG5leHQubmV4dDsKICAgICAgICBpZiAobmV4dDIuaXNJZGVudGlmaWVyIHx8IG5leHQyLmlzTW9kaWZpZXIpIHsKICAgICAgICAgIGlmIChiZWZvcmVUeXBlICE9IHRva2VuKSB7CiAgICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4sIGZhc3RhLm1lc3NhZ2VUeXBlQmVmb3JlRmFjdG9yeSk7CiAgICAgICAgICB9CiAgICAgICAgICB0b2tlbiA9IHBhcnNlRmFjdG9yeU1ldGhvZCh0b2tlbiwgYmVmb3JlU3RhcnQsIGV4dGVybmFsVG9rZW4sCiAgICAgICAgICAgICAgc3RhdGljVG9rZW4gPz8gY292YXJpYW50VG9rZW4sIHZhckZpbmFsT3JDb25zdCk7CiAgICAgICAgICBsaXN0ZW5lci5lbmRNZW1iZXIoKTsKICAgICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgICB9CiAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIGNvbnRpbnVlIHBhcnNpbmcgYGZhY3RvcnlgIGFzIGFuIGlkZW50aWZpZXIuCiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnb3BlcmF0b3InKSkgewogICAgICAgIFRva2VuIG5leHQyID0gbmV4dC5uZXh0OwogICAgICAgIFR5cGVQYXJhbU9yQXJnSW5mbyB0eXBlUGFyYW0gPSBjb21wdXRlVHlwZVBhcmFtT3JBcmcobmV4dCk7CiAgICAgICAgLy8gYG9wZXJhdG9yYCBjYW4gYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyIGFzIGluCiAgICAgICAgLy8gYGludCBvcGVyYXRvcjxUPigpYCBvciBgaW50IG9wZXJhdG9yID0gMmAKICAgICAgICBpZiAobmV4dDIuaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3IgJiYgdHlwZVBhcmFtID09IG5vVHlwZVBhcmFtT3JBcmcpIHsKICAgICAgICAgIHRva2VuID0gcGFyc2VNZXRob2QoCiAgICAgICAgICAgICAgYmVmb3JlU3RhcnQsCiAgICAgICAgICAgICAgZXh0ZXJuYWxUb2tlbiwKICAgICAgICAgICAgICBzdGF0aWNUb2tlbiwKICAgICAgICAgICAgICBjb3ZhcmlhbnRUb2tlbiwKICAgICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QsCiAgICAgICAgICAgICAgYmVmb3JlVHlwZSwKICAgICAgICAgICAgICB0eXBlSW5mbywKICAgICAgICAgICAgICBnZXRPclNldCwKICAgICAgICAgICAgICB0b2tlbi5uZXh0KTsKICAgICAgICAgIGxpc3RlbmVyLmVuZE1lbWJlcigpOwogICAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJz09PScsIG5leHQyKSB8fAogICAgICAgICAgICBvcHRpb25hbCgnIT09JywgbmV4dDIpIHx8CiAgICAgICAgICAgIChuZXh0Mi5pc09wZXJhdG9yICYmCiAgICAgICAgICAgICAgICAhb3B0aW9uYWwoJz0nLCBuZXh0MikgJiYKICAgICAgICAgICAgICAgICFvcHRpb25hbCgnPCcsIG5leHQyKSkpIHsKICAgICAgICAgIC8vIFJlY292ZXJ5OiBJbnZhbGlkIG9wZXJhdG9yCiAgICAgICAgICByZXR1cm4gcGFyc2VJbnZhbGlkT3BlcmF0b3JEZWNsYXJhdGlvbihiZWZvcmVTdGFydCwgZXh0ZXJuYWxUb2tlbiwKICAgICAgICAgICAgICBzdGF0aWNUb2tlbiwgY292YXJpYW50VG9rZW4sIHZhckZpbmFsT3JDb25zdCwgYmVmb3JlVHlwZSk7CiAgICAgICAgfSBlbHNlIGlmIChpc1VuYXJ5TWludXMobmV4dDIpKSB7CiAgICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgICAgdG9rZW4gPSBwYXJzZU1ldGhvZCgKICAgICAgICAgICAgICBiZWZvcmVTdGFydCwKICAgICAgICAgICAgICBleHRlcm5hbFRva2VuLAogICAgICAgICAgICAgIHN0YXRpY1Rva2VuLAogICAgICAgICAgICAgIGNvdmFyaWFudFRva2VuLAogICAgICAgICAgICAgIHZhckZpbmFsT3JDb25zdCwKICAgICAgICAgICAgICBiZWZvcmVUeXBlLAogICAgICAgICAgICAgIHR5cGVJbmZvLAogICAgICAgICAgICAgIGdldE9yU2V0LAogICAgICAgICAgICAgIHRva2VuLm5leHQpOwogICAgICAgICAgbGlzdGVuZXIuZW5kTWVtYmVyKCk7CiAgICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgICAgfQogICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBjb250aW51ZSBwYXJzaW5nIGBvcGVyYXRvcmAgYXMgYW4gaWRlbnRpZmllci4KICAgICAgfSBlbHNlIGlmICghbmV4dC5pc0lkZW50aWZpZXIgfHwKICAgICAgICAgIChpZGVudGljYWwodmFsdWUsICd0eXBlZGVmJykgJiYKICAgICAgICAgICAgICB0b2tlbiA9PSBiZWZvcmVTdGFydCAmJgogICAgICAgICAgICAgIG5leHQubmV4dC5pc0lkZW50aWZpZXIpKSB7CiAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICByZXR1cm4gcmVjb3ZlckZyb21JbnZhbGlkQ2xhc3NNZW1iZXIoCiAgICAgICAgICAgIHRva2VuLAogICAgICAgICAgICBiZWZvcmVTdGFydCwKICAgICAgICAgICAgZXh0ZXJuYWxUb2tlbiwKICAgICAgICAgICAgc3RhdGljVG9rZW4sCiAgICAgICAgICAgIGNvdmFyaWFudFRva2VuLAogICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QsCiAgICAgICAgICAgIGJlZm9yZVR5cGUsCiAgICAgICAgICAgIHR5cGVJbmZvLAogICAgICAgICAgICBnZXRPclNldCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodHlwZUluZm8gPT0gbm9UeXBlICYmIHZhckZpbmFsT3JDb25zdCA9PSBudWxsKSB7CiAgICAgIFRva2VuIG5leHQyID0gbmV4dC5uZXh0OwogICAgICBpZiAobmV4dDIuaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3IgJiYgbmV4dDIuZW5kR3JvdXAgPT0gbnVsbCkgewogICAgICAgIFN0cmluZyB2YWx1ZSA9IG5leHQyLm5leHQuc3RyaW5nVmFsdWU7CiAgICAgICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJygnKSB8fAogICAgICAgICAgICBpZGVudGljYWwodmFsdWUsICd7JykgfHwKICAgICAgICAgICAgaWRlbnRpY2FsKHZhbHVlLCAnPT4nKSkgewogICAgICAgICAgLy8gUmVjb3Zlcnk6IE1pc3NpbmcgYG9wZXJhdG9yYCBrZXl3b3JkCiAgICAgICAgICByZXR1cm4gcGFyc2VJbnZhbGlkT3BlcmF0b3JEZWNsYXJhdGlvbihiZWZvcmVTdGFydCwgZXh0ZXJuYWxUb2tlbiwKICAgICAgICAgICAgICBzdGF0aWNUb2tlbiwgY292YXJpYW50VG9rZW4sIHZhckZpbmFsT3JDb25zdCwgYmVmb3JlVHlwZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gQXQgdGhpcyBwb2ludCwgdG9rZW4gaXMgYmVmb3JlIHRoZSBuYW1lLCBhbmQgbmV4dCBpcyB0aGUgbmFtZQogICAgbmV4dCA9IG5leHQubmV4dDsKICAgIFN0cmluZyB2YWx1ZSA9IG5leHQuc3RyaW5nVmFsdWU7CiAgICBpZiAoZ2V0T3JTZXQgIT0gbnVsbCB8fAogICAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJygnKSB8fAogICAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJ3snKSB8fAogICAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJzwnKSB8fAogICAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJy4nKSB8fAogICAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJz0+JykpIHsKICAgICAgdG9rZW4gPSBwYXJzZU1ldGhvZCgKICAgICAgICAgIGJlZm9yZVN0YXJ0LAogICAgICAgICAgZXh0ZXJuYWxUb2tlbiwKICAgICAgICAgIHN0YXRpY1Rva2VuLAogICAgICAgICAgY292YXJpYW50VG9rZW4sCiAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QsCiAgICAgICAgICBiZWZvcmVUeXBlLAogICAgICAgICAgdHlwZUluZm8sCiAgICAgICAgICBnZXRPclNldCwKICAgICAgICAgIHRva2VuLm5leHQpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGdldE9yU2V0ICE9IG51bGwpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgICBnZXRPclNldCwgZmFzdGEudGVtcGxhdGVFeHRyYW5lb3VzTW9kaWZpZXIpOwogICAgICB9CiAgICAgIHRva2VuID0gcGFyc2VGaWVsZHMoCiAgICAgICAgICBiZWZvcmVTdGFydCwKICAgICAgICAgIGV4dGVybmFsVG9rZW4sCiAgICAgICAgICBzdGF0aWNUb2tlbiwKICAgICAgICAgIGNvdmFyaWFudFRva2VuLAogICAgICAgICAgdmFyRmluYWxPckNvbnN0LAogICAgICAgICAgYmVmb3JlVHlwZSwKICAgICAgICAgIHR5cGVJbmZvLAogICAgICAgICAgdG9rZW4ubmV4dCwKICAgICAgICAgIGZhbHNlKTsKICAgIH0KICAgIGxpc3RlbmVyLmVuZE1lbWJlcigpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VNZXRob2QoCiAgICAgIFRva2VuIGJlZm9yZVN0YXJ0LAogICAgICBUb2tlbiBleHRlcm5hbFRva2VuLAogICAgICBUb2tlbiBzdGF0aWNUb2tlbiwKICAgICAgVG9rZW4gY292YXJpYW50VG9rZW4sCiAgICAgIFRva2VuIHZhckZpbmFsT3JDb25zdCwKICAgICAgVG9rZW4gYmVmb3JlVHlwZSwKICAgICAgVHlwZUluZm8gdHlwZUluZm8sCiAgICAgIFRva2VuIGdldE9yU2V0LAogICAgICBUb2tlbiBuYW1lKSB7CiAgICBib29sIGlzT3BlcmF0b3IgPSBmYWxzZTsKICAgIGlmIChnZXRPclNldCA9PSBudWxsICYmIG9wdGlvbmFsKCdvcGVyYXRvcicsIG5hbWUpKSB7CiAgICAgIFRva2VuIG9wZXJhdG9yID0gbmFtZS5uZXh0OwogICAgICBpZiAob3BlcmF0b3IuaXNPcGVyYXRvciB8fAogICAgICAgICAgaWRlbnRpY2FsKG9wZXJhdG9yLmtpbmQsIEVRX0VRX0VRX1RPS0VOKSB8fAogICAgICAgICAgaWRlbnRpY2FsKG9wZXJhdG9yLmtpbmQsIEJBTkdfRVFfRVFfVE9LRU4pIHx8CiAgICAgICAgICBpc1VuYXJ5TWludXMob3BlcmF0b3IpKSB7CiAgICAgICAgaXNPcGVyYXRvciA9IHRydWU7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoc3RhdGljVG9rZW4gIT0gbnVsbCkgewogICAgICBpZiAoaXNPcGVyYXRvcikgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3Ioc3RhdGljVG9rZW4sIGZhc3RhLm1lc3NhZ2VTdGF0aWNPcGVyYXRvcik7CiAgICAgICAgc3RhdGljVG9rZW4gPSBudWxsOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGNvdmFyaWFudFRva2VuICE9IG51bGwpIHsKICAgICAgaWYgKGdldE9yU2V0ID09IG51bGwgfHwgb3B0aW9uYWwoJ2dldCcsIGdldE9yU2V0KSkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoY292YXJpYW50VG9rZW4sIGZhc3RhLm1lc3NhZ2VDb3ZhcmlhbnRNZW1iZXIpOwogICAgICAgIGNvdmFyaWFudFRva2VuID0gbnVsbDsKICAgICAgfQogICAgfQogICAgaWYgKHZhckZpbmFsT3JDb25zdCAhPSBudWxsKSB7CiAgICAgIGlmIChvcHRpb25hbCgnY29uc3QnLCB2YXJGaW5hbE9yQ29uc3QpKSB7CiAgICAgICAgaWYgKGdldE9yU2V0ICE9IG51bGwpIHsKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICAgICAgdmFyRmluYWxPckNvbnN0LCBmYXN0YS50ZW1wbGF0ZUV4dHJhbmVvdXNNb2RpZmllcik7CiAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QgPSBudWxsOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChvcHRpb25hbCgndmFyJywgdmFyRmluYWxPckNvbnN0KSkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IodmFyRmluYWxPckNvbnN0LCBmYXN0YS5tZXNzYWdlVmFyUmV0dXJuVHlwZSk7CiAgICAgICAgdmFyRmluYWxPckNvbnN0ID0gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQob3B0aW9uYWwoJ2ZpbmFsJywgdmFyRmluYWxPckNvbnN0KSk7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgICAgdmFyRmluYWxPckNvbnN0LCBmYXN0YS50ZW1wbGF0ZUV4dHJhbmVvdXNNb2RpZmllcik7CiAgICAgICAgdmFyRmluYWxPckNvbnN0ID0gbnVsbDsKICAgICAgfQogICAgfQoKICAgIC8vIFRPRE8oZGFucnViZWwpOiBDb25zaWRlciBwYXJzaW5nIHRoZSBuYW1lIGJlZm9yZSBjYWxsaW5nIGJlZ2luTWV0aG9kCiAgICAvLyByYXRoZXIgdGhhbiBwYXNzaW5nIHRoZSBuYW1lIHRva2VuIGludG8gYmVnaW5NZXRob2QuCiAgICBsaXN0ZW5lci5iZWdpbk1ldGhvZChleHRlcm5hbFRva2VuLCBzdGF0aWNUb2tlbiwgY292YXJpYW50VG9rZW4sCiAgICAgICAgdmFyRmluYWxPckNvbnN0LCBnZXRPclNldCwgbmFtZSk7CgogICAgVG9rZW4gdG9rZW4gPSB0eXBlSW5mby5wYXJzZVR5cGUoYmVmb3JlVHlwZSwgdGhpcyk7CiAgICBhc3NlcnQodG9rZW4ubmV4dCA9PSAoZ2V0T3JTZXQgPz8gbmFtZSkpOwogICAgdG9rZW4gPSBnZXRPclNldCA/PyB0b2tlbjsKCiAgICBpZiAoaXNPcGVyYXRvcikgewogICAgICB0b2tlbiA9IHBhcnNlT3BlcmF0b3JOYW1lKHRva2VuKTsKICAgIH0gZWxzZSB7CiAgICAgIHRva2VuID0gZW5zdXJlSWRlbnRpZmllcih0b2tlbiwgSWRlbnRpZmllckNvbnRleHQubWV0aG9kRGVjbGFyYXRpb24pOwogICAgICBpZiAoZ2V0T3JTZXQgPT0gbnVsbCkgewogICAgICAgIHRva2VuID0gcGFyc2VRdWFsaWZpZWRSZXN0T3B0KAogICAgICAgICAgICB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQubWV0aG9kRGVjbGFyYXRpb25Db250aW51YXRpb24pOwogICAgICB9CiAgICB9CgogICAgYm9vbCBpc0dldHRlciA9IGZhbHNlOwogICAgaWYgKGdldE9yU2V0ID09IG51bGwpIHsKICAgICAgdG9rZW4gPSBwYXJzZU1ldGhvZFR5cGVWYXIodG9rZW4pOwogICAgfSBlbHNlIHsKICAgICAgaXNHZXR0ZXIgPSBvcHRpb25hbCgiZ2V0IiwgZ2V0T3JTZXQpOwogICAgICBsaXN0ZW5lci5oYW5kbGVOb1R5cGVWYXJpYWJsZXModG9rZW4ubmV4dCk7CiAgICB9CgogICAgTWVtYmVyS2luZCBraW5kID0gc3RhdGljVG9rZW4gIT0gbnVsbAogICAgICAgID8gTWVtYmVyS2luZC5TdGF0aWNNZXRob2QKICAgICAgICA6IE1lbWJlcktpbmQuTm9uU3RhdGljTWV0aG9kOwogICAgVG9rZW4gYmVmb3JlUGFyYW0gPSB0b2tlbjsKICAgIHRva2VuID0gcGFyc2VHZXR0ZXJPckZvcm1hbFBhcmFtZXRlcnModG9rZW4sIG5hbWUsIGlzR2V0dGVyLCBraW5kKTsKICAgIHRva2VuID0gcGFyc2VJbml0aWFsaXplcnNPcHQodG9rZW4pOwoKICAgIEFzeW5jTW9kaWZpZXIgc2F2ZWRBc3luY01vZGlmaWVyID0gYXN5bmNTdGF0ZTsKICAgIFRva2VuIGFzeW5jVG9rZW4gPSB0b2tlbi5uZXh0OwogICAgdG9rZW4gPSBwYXJzZUFzeW5jTW9kaWZpZXJPcHQodG9rZW4pOwogICAgaWYgKGdldE9yU2V0ICE9IG51bGwgJiYgIWluUGxhaW5TeW5jICYmIG9wdGlvbmFsKCJzZXQiLCBnZXRPclNldCkpIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihhc3luY1Rva2VuLCBmYXN0YS5tZXNzYWdlU2V0dGVyTm90U3luYyk7CiAgICB9CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChleHRlcm5hbFRva2VuICE9IG51bGwpIHsKICAgICAgaWYgKCFvcHRpb25hbCgnOycsIG5leHQpKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBmYXN0YS5tZXNzYWdlRXh0ZXJuYWxNZXRob2RXaXRoQm9keSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChvcHRpb25hbCgnPScsIG5leHQpKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgZmFzdGEubWVzc2FnZVJlZGlyZWN0aW9uSW5Ob25GYWN0b3J5KTsKICAgICAgdG9rZW4gPSBwYXJzZVJlZGlyZWN0aW5nRmFjdG9yeUJvZHkodG9rZW4pOwogICAgfSBlbHNlIHsKICAgICAgdG9rZW4gPSBwYXJzZUZ1bmN0aW9uQm9keSh0b2tlbiwgZmFsc2UsCiAgICAgICAgICAoc3RhdGljVG9rZW4gPT0gbnVsbCB8fCBleHRlcm5hbFRva2VuICE9IG51bGwpICYmIGluUGxhaW5TeW5jKTsKICAgIH0KICAgIGFzeW5jU3RhdGUgPSBzYXZlZEFzeW5jTW9kaWZpZXI7CiAgICBsaXN0ZW5lci5lbmRNZXRob2QoZ2V0T3JTZXQsIGJlZm9yZVN0YXJ0Lm5leHQsIGJlZm9yZVBhcmFtLm5leHQsIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlRmFjdG9yeU1ldGhvZChUb2tlbiB0b2tlbiwgVG9rZW4gYmVmb3JlU3RhcnQsIFRva2VuIGV4dGVybmFsVG9rZW4sCiAgICAgIFRva2VuIHN0YXRpY09yQ292YXJpYW50LCBUb2tlbiB2YXJGaW5hbE9yQ29uc3QpIHsKICAgIFRva2VuIGZhY3RvcnlLZXl3b3JkID0gdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdmYWN0b3J5JywgZmFjdG9yeUtleXdvcmQpKTsKCiAgICBpZiAoIWlzVmFsaWRUeXBlUmVmZXJlbmNlKHRva2VuLm5leHQpKSB7CiAgICAgIC8vIFJlY292ZXJ5CiAgICAgIE1vZGlmaWVyUmVjb3ZlcnlDb250ZXh0IGNvbnRleHQgPSBuZXcgTW9kaWZpZXJSZWNvdmVyeUNvbnRleHQodGhpcyk7CiAgICAgIHRva2VuID0gY29udGV4dC5wYXJzZU1vZGlmaWVyc0FmdGVyRmFjdG9yeSh0b2tlbiwKICAgICAgICAgIGV4dGVybmFsVG9rZW46IGV4dGVybmFsVG9rZW4sCiAgICAgICAgICBzdGF0aWNPckNvdmFyaWFudDogc3RhdGljT3JDb3ZhcmlhbnQsCiAgICAgICAgICB2YXJGaW5hbE9yQ29uc3Q6IHZhckZpbmFsT3JDb25zdCk7CgogICAgICBleHRlcm5hbFRva2VuID0gY29udGV4dC5leHRlcm5hbFRva2VuOwogICAgICBzdGF0aWNPckNvdmFyaWFudCA9IGNvbnRleHQuc3RhdGljVG9rZW4gPz8gY29udGV4dC5jb3ZhcmlhbnRUb2tlbjsKICAgICAgdmFyRmluYWxPckNvbnN0ID0gY29udGV4dC52YXJGaW5hbE9yQ29uc3Q7CiAgICB9CgogICAgaWYgKHN0YXRpY09yQ292YXJpYW50ICE9IG51bGwpIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIHN0YXRpY09yQ292YXJpYW50LCBmYXN0YS50ZW1wbGF0ZUV4dHJhbmVvdXNNb2RpZmllcik7CiAgICB9CiAgICBpZiAodmFyRmluYWxPckNvbnN0ICE9IG51bGwgJiYgIW9wdGlvbmFsKCdjb25zdCcsIHZhckZpbmFsT3JDb25zdCkpIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIHZhckZpbmFsT3JDb25zdCwgZmFzdGEudGVtcGxhdGVFeHRyYW5lb3VzTW9kaWZpZXIpOwogICAgICB2YXJGaW5hbE9yQ29uc3QgPSBudWxsOwogICAgfQoKICAgIGxpc3RlbmVyLmJlZ2luRmFjdG9yeU1ldGhvZChiZWZvcmVTdGFydCwgZXh0ZXJuYWxUb2tlbiwgdmFyRmluYWxPckNvbnN0KTsKICAgIHRva2VuID0gZW5zdXJlSWRlbnRpZmllcih0b2tlbiwgSWRlbnRpZmllckNvbnRleHQubWV0aG9kRGVjbGFyYXRpb24pOwogICAgdG9rZW4gPSBwYXJzZVF1YWxpZmllZFJlc3RPcHQoCiAgICAgICAgdG9rZW4sIElkZW50aWZpZXJDb250ZXh0Lm1ldGhvZERlY2xhcmF0aW9uQ29udGludWF0aW9uKTsKICAgIHRva2VuID0gcGFyc2VNZXRob2RUeXBlVmFyKHRva2VuKTsKICAgIHRva2VuID0gcGFyc2VGb3JtYWxQYXJhbWV0ZXJzUmVxdWlyZWRPcHQodG9rZW4sIE1lbWJlcktpbmQuRmFjdG9yeSk7CiAgICBUb2tlbiBhc3luY1Rva2VuID0gdG9rZW4ubmV4dDsKICAgIHRva2VuID0gcGFyc2VBc3luY01vZGlmaWVyT3B0KHRva2VuKTsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKCFpblBsYWluU3luYykgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKGFzeW5jVG9rZW4sIGZhc3RhLm1lc3NhZ2VGYWN0b3J5Tm90U3luYyk7CiAgICB9CiAgICBpZiAob3B0aW9uYWwoJz0nLCBuZXh0KSkgewogICAgICBpZiAoZXh0ZXJuYWxUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBmYXN0YS5tZXNzYWdlRXh0ZXJuYWxGYWN0b3J5UmVkaXJlY3Rpb24pOwogICAgICB9CiAgICAgIHRva2VuID0gcGFyc2VSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KHRva2VuKTsKICAgIH0gZWxzZSBpZiAoZXh0ZXJuYWxUb2tlbiAhPSBudWxsKSB7CiAgICAgIGlmICghb3B0aW9uYWwoJzsnLCBuZXh0KSkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgZmFzdGEubWVzc2FnZUV4dGVybmFsRmFjdG9yeVdpdGhCb2R5KTsKICAgICAgfQogICAgICB0b2tlbiA9IHBhcnNlRnVuY3Rpb25Cb2R5KHRva2VuLCBmYWxzZSwgdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBpZiAodmFyRmluYWxPckNvbnN0ICE9IG51bGwgJiYgIW9wdGlvbmFsKCduYXRpdmUnLCBuZXh0KSkgewogICAgICAgIGlmIChvcHRpb25hbCgnY29uc3QnLCB2YXJGaW5hbE9yQ29uc3QpKSB7CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKHZhckZpbmFsT3JDb25zdCwgZmFzdGEubWVzc2FnZUNvbnN0RmFjdG9yeSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRva2VuID0gcGFyc2VGdW5jdGlvbkJvZHkodG9rZW4sIGZhbHNlLCBmYWxzZSk7CiAgICB9CiAgICBsaXN0ZW5lci5lbmRGYWN0b3J5TWV0aG9kKGJlZm9yZVN0YXJ0Lm5leHQsIGZhY3RvcnlLZXl3b3JkLCB0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZU9wZXJhdG9yTmFtZShUb2tlbiB0b2tlbikgewogICAgVG9rZW4gYmVmb3JlVG9rZW4gPSB0b2tlbjsKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnb3BlcmF0b3InLCB0b2tlbikpOwogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAobmV4dC5pc1VzZXJEZWZpbmFibGVPcGVyYXRvcikgewogICAgICBpZiAoY29tcHV0ZVR5cGVQYXJhbU9yQXJnKHRva2VuKSAhPSBub1R5cGVQYXJhbU9yQXJnKSB7CiAgICAgICAgLy8gYG9wZXJhdG9yYCBpcyBiZWluZyB1c2VkIGFzIGFuIGlkZW50aWZpZXIuCiAgICAgICAgLy8gRm9yIGV4YW1wbGU6IGBpbnQgb3BlcmF0b3I8VD4oZm9vKSA9PiAwO2AKICAgICAgICBsaXN0ZW5lci5oYW5kbGVJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5tZXRob2REZWNsYXJhdGlvbik7CiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICB9IGVsc2UgewogICAgICAgIGxpc3RlbmVyLmhhbmRsZU9wZXJhdG9yTmFtZSh0b2tlbiwgbmV4dCk7CiAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJygnLCBuZXh0KSkgewogICAgICByZXR1cm4gZW5zdXJlSWRlbnRpZmllcihiZWZvcmVUb2tlbiwgSWRlbnRpZmllckNvbnRleHQub3BlcmF0b3JOYW1lKTsKICAgIH0gZWxzZSBpZiAoaXNVbmFyeU1pbnVzKG5leHQpKSB7CiAgICAgIC8vIFJlY292ZXJ5CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4obmV4dCwgZmFzdGEudGVtcGxhdGVVbmV4cGVjdGVkVG9rZW4pOwogICAgICBuZXh0ID0gbmV4dC5uZXh0OwogICAgICBsaXN0ZW5lci5oYW5kbGVPcGVyYXRvck5hbWUodG9rZW4sIG5leHQpOwogICAgICByZXR1cm4gbmV4dDsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFJlY292ZXJ5CiAgICAgIC8vIFNjYW5uZXIgcmVwb3J0cyBhbiBlcnJvciBmb3IgYD09PWAgYW5kIGAhPT1gLgogICAgICBpZiAobmV4dC50eXBlICE9IFRva2VuVHlwZS5FUV9FUV9FUSAmJgogICAgICAgICAgbmV4dC50eXBlICE9IFRva2VuVHlwZS5CQU5HX0VRX0VRKSB7CiAgICAgICAgLy8gVGhlIHVzZXIgaGFzIHNwZWNpZmllZCBhbiBpbnZhbGlkIG9wZXJhdG9yIG5hbWUuCiAgICAgICAgLy8gUmVwb3J0IHRoZSBlcnJvciwgYWNjZXB0IHRoZSBpbnZhbGlkIG9wZXJhdG9yIG5hbWUsIGFuZCBtb3ZlIG9uLgogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4obmV4dCwgZmFzdGEudGVtcGxhdGVJbnZhbGlkT3BlcmF0b3IpOwogICAgICB9CiAgICAgIGxpc3RlbmVyLmhhbmRsZUludmFsaWRPcGVyYXRvck5hbWUodG9rZW4sIG5leHQpOwogICAgICByZXR1cm4gbmV4dDsKICAgIH0KICB9CgogIFRva2VuIHBhcnNlRnVuY3Rpb25FeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBiZWdpblRva2VuID0gdG9rZW4ubmV4dDsKICAgIGxpc3RlbmVyLmJlZ2luRnVuY3Rpb25FeHByZXNzaW9uKGJlZ2luVG9rZW4pOwogICAgdG9rZW4gPSBwYXJzZUZvcm1hbFBhcmFtZXRlcnNSZXF1aXJlZE9wdCh0b2tlbiwgTWVtYmVyS2luZC5Mb2NhbCk7CiAgICB0b2tlbiA9IHBhcnNlQXN5bmNPcHRCb2R5KHRva2VuLCB0cnVlLCBmYWxzZSk7CiAgICBsaXN0ZW5lci5lbmRGdW5jdGlvbkV4cHJlc3Npb24oYmVnaW5Ub2tlbiwgdG9rZW4ubmV4dCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZUZ1bmN0aW9uTGl0ZXJhbCgKICAgICAgVG9rZW4gc3RhcnQsCiAgICAgIFRva2VuIGJlZm9yZU5hbWUsCiAgICAgIFRva2VuIG5hbWUsCiAgICAgIFR5cGVJbmZvIHR5cGVJbmZvLAogICAgICBUeXBlUGFyYW1PckFyZ0luZm8gdHlwZVBhcmFtLAogICAgICBJZGVudGlmaWVyQ29udGV4dCBjb250ZXh0KSB7CiAgICBUb2tlbiBmb3JtYWxzID0gdHlwZVBhcmFtLnBhcnNlVmFyaWFibGVzKG5hbWUsIHRoaXMpOwogICAgbGlzdGVuZXIuYmVnaW5OYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbihzdGFydC5uZXh0KTsKICAgIHR5cGVJbmZvLnBhcnNlVHlwZShzdGFydCwgdGhpcyk7CiAgICByZXR1cm4gcGFyc2VOYW1lZEZ1bmN0aW9uUmVzdChiZWZvcmVOYW1lLCBzdGFydC5uZXh0LCBmb3JtYWxzLCB0cnVlKTsKICB9CgogIC8vLyBQYXJzZXMgdGhlIHJlc3Qgb2YgYSBuYW1lZCBmdW5jdGlvbiBkZWNsYXJhdGlvbiBzdGFydGluZyBmcm9tIGl0cyBbbmFtZV0KICAvLy8gYnV0IHRoZW4gc2tpcHMgYW55IHR5cGUgcGFyYW1ldGVycyBhbmQgY29udGludWUgcGFyc2luZyBmcm9tIFtmb3JtYWxzXQogIC8vLyAodGhlIGZvcm1hbCBwYXJhbWV0ZXJzKS4KICAvLy8KICAvLy8gSWYgW2lzRnVuY3Rpb25FeHByZXNzaW9uXSBpcyB0cnVlLCB0aGlzIG1ldGhvZCBwYXJzZXMgdGhlIHJlc3Qgb2YgbmFtZWQKICAvLy8gZnVuY3Rpb24gZXhwcmVzc2lvbiB3aGljaCBpc24ndCBsZWdhbCBzeW50YXggaW4gRGFydC4gIFVzZWZ1bCBmb3IKICAvLy8gcmVjb3ZlcmluZyBmcm9tIEphdmFzY3JpcHQgY29kZSBiZWluZyBwYXN0ZWQgaW50byBhIERhcnQgcHJvZ3JhbSwgYXMgaXQKICAvLy8gd2lsbCBpbnRlcnByZXQgYGZ1bmN0aW9uIGZvbygpIHt9YCBhcyBhIG5hbWVkIGZ1bmN0aW9uIGV4cHJlc3Npb24gd2l0aAogIC8vLyByZXR1cm4gdHlwZSBgZnVuY3Rpb25gIGFuZCBuYW1lIGBmb29gLgogIC8vLwogIC8vLyBQcmVjb25kaXRpb246IHRoZSBwYXJzZXIgaGFzIHByZXZpb3VzbHkgZ2VuZXJhdGVkIHRoZXNlIGV2ZW50czoKICAvLy8KICAvLy8gLSBUeXBlIHZhcmlhYmxlcy4KICAvLy8gLSBgYmVnaW5Mb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb25gIGlmIFtpc0Z1bmN0aW9uRXhwcmVzc2lvbl0gaXMgZmFsc2UsCiAgLy8vICAgb3RoZXJ3aXNlIGBiZWdpbk5hbWVkRnVuY3Rpb25FeHByZXNzaW9uYC4KICAvLy8gLSBSZXR1cm4gdHlwZS4KICBUb2tlbiBwYXJzZU5hbWVkRnVuY3Rpb25SZXN0KAogICAgICBUb2tlbiBiZWZvcmVOYW1lLCBUb2tlbiBiZWdpbiwgVG9rZW4gZm9ybWFscywgYm9vbCBpc0Z1bmN0aW9uRXhwcmVzc2lvbikgewogICAgVG9rZW4gdG9rZW4gPSBiZWZvcmVOYW1lLm5leHQ7CiAgICBsaXN0ZW5lci5iZWdpbkZ1bmN0aW9uTmFtZSh0b2tlbik7CiAgICB0b2tlbiA9CiAgICAgICAgZW5zdXJlSWRlbnRpZmllcihiZWZvcmVOYW1lLCBJZGVudGlmaWVyQ29udGV4dC5sb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb24pCiAgICAgICAgICAgIC5uZXh0OwogICAgaWYgKGlzRnVuY3Rpb25FeHByZXNzaW9uKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBiZWZvcmVOYW1lLm5leHQsIGZhc3RhLm1lc3NhZ2VOYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbik7CiAgICB9CiAgICBsaXN0ZW5lci5lbmRGdW5jdGlvbk5hbWUoYmVnaW4sIHRva2VuKTsKICAgIHRva2VuID0gcGFyc2VGb3JtYWxQYXJhbWV0ZXJzUmVxdWlyZWRPcHQoZm9ybWFscywgTWVtYmVyS2luZC5Mb2NhbCk7CiAgICB0b2tlbiA9IHBhcnNlSW5pdGlhbGl6ZXJzT3B0KHRva2VuKTsKICAgIHRva2VuID0gcGFyc2VBc3luY09wdEJvZHkodG9rZW4sIGlzRnVuY3Rpb25FeHByZXNzaW9uLCBmYWxzZSk7CiAgICBpZiAoaXNGdW5jdGlvbkV4cHJlc3Npb24pIHsKICAgICAgbGlzdGVuZXIuZW5kTmFtZWRGdW5jdGlvbkV4cHJlc3Npb24odG9rZW4pOwogICAgfSBlbHNlIHsKICAgICAgbGlzdGVuZXIuZW5kTG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uKHRva2VuKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBQYXJzZXMgYSBmdW5jdGlvbiBib2R5IG9wdGlvbmFsbHkgcHJlY2VkZWQgYnkgYW4gYXN5bmMgbW9kaWZpZXIgKHNlZQogIC8vLyBbcGFyc2VBc3luY01vZGlmaWVyT3B0XSkuICBUaGlzIG1ldGhvZCBpcyB1c2VkIGluIGJvdGggZXhwcmVzc2lvbiBjb250ZXh0CiAgLy8vICh3aGVuIFtvZkZ1bmN0aW9uRXhwcmVzc2lvbl0gaXMgdHJ1ZSkgYW5kIHN0YXRlbWVudCBjb250ZXh0LiBJbiBzdGF0ZW1lbnQKICAvLy8gY29udGV4dCAod2hlbiBbb2ZGdW5jdGlvbkV4cHJlc3Npb25dIGlzIGZhbHNlKSwgYW5kIGlmIHRoZSBmdW5jdGlvbiBib2R5CiAgLy8vIGlzIG9uIHRoZSBmb3JtIGA9PiBleHByZXNzaW9uYCwgYSB0cmFpbGluZyBzZW1pY29sb24gaXMgcmVxdWlyZWQuCiAgLy8vCiAgLy8vIEl0J3MgYW4gZXJyb3IgaWYgdGhlcmUncyBubyBmdW5jdGlvbiBib2R5IHVubGVzcyBbYWxsb3dBYnN0cmFjdF0gaXMgdHJ1ZS4KICBUb2tlbiBwYXJzZUFzeW5jT3B0Qm9keSgKICAgICAgVG9rZW4gdG9rZW4sIGJvb2wgb2ZGdW5jdGlvbkV4cHJlc3Npb24sIGJvb2wgYWxsb3dBYnN0cmFjdCkgewogICAgQXN5bmNNb2RpZmllciBzYXZlZEFzeW5jTW9kaWZpZXIgPSBhc3luY1N0YXRlOwogICAgdG9rZW4gPSBwYXJzZUFzeW5jTW9kaWZpZXJPcHQodG9rZW4pOwogICAgdG9rZW4gPSBwYXJzZUZ1bmN0aW9uQm9keSh0b2tlbiwgb2ZGdW5jdGlvbkV4cHJlc3Npb24sIGFsbG93QWJzdHJhY3QpOwogICAgYXN5bmNTdGF0ZSA9IHNhdmVkQXN5bmNNb2RpZmllcjsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlQ29uc3RydWN0b3JSZWZlcmVuY2UoVG9rZW4gdG9rZW4sIFtUeXBlUGFyYW1PckFyZ0luZm8gdHlwZUFyZ10pIHsKICAgIFRva2VuIHN0YXJ0ID0KICAgICAgICBlbnN1cmVJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5jb25zdHJ1Y3RvclJlZmVyZW5jZSk7CiAgICBsaXN0ZW5lci5iZWdpbkNvbnN0cnVjdG9yUmVmZXJlbmNlKHN0YXJ0KTsKICAgIHRva2VuID0gcGFyc2VRdWFsaWZpZWRSZXN0T3B0KAogICAgICAgIHN0YXJ0LCBJZGVudGlmaWVyQ29udGV4dC5jb25zdHJ1Y3RvclJlZmVyZW5jZUNvbnRpbnVhdGlvbik7CiAgICB0eXBlQXJnID8/PSBjb21wdXRlVHlwZVBhcmFtT3JBcmcodG9rZW4pOwogICAgdG9rZW4gPSB0eXBlQXJnLnBhcnNlQXJndW1lbnRzKHRva2VuLCB0aGlzKTsKICAgIFRva2VuIHBlcmlvZCA9IG51bGw7CiAgICBpZiAob3B0aW9uYWwoJy4nLCB0b2tlbi5uZXh0KSkgewogICAgICBwZXJpb2QgPSB0b2tlbi5uZXh0OwogICAgICB0b2tlbiA9IGVuc3VyZUlkZW50aWZpZXIocGVyaW9kLAogICAgICAgICAgSWRlbnRpZmllckNvbnRleHQuY29uc3RydWN0b3JSZWZlcmVuY2VDb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHMpOwogICAgfSBlbHNlIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlTm9Db25zdHJ1Y3RvclJlZmVyZW5jZUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cygKICAgICAgICAgIHRva2VuLm5leHQpOwogICAgfQogICAgbGlzdGVuZXIuZW5kQ29uc3RydWN0b3JSZWZlcmVuY2Uoc3RhcnQsIHBlcmlvZCwgdG9rZW4ubmV4dCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZVJlZGlyZWN0aW5nRmFjdG9yeUJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnPScsIHRva2VuKSk7CiAgICBsaXN0ZW5lci5iZWdpblJlZGlyZWN0aW5nRmFjdG9yeUJvZHkodG9rZW4pOwogICAgVG9rZW4gZXF1YWxzID0gdG9rZW47CiAgICB0b2tlbiA9IHBhcnNlQ29uc3RydWN0b3JSZWZlcmVuY2UodG9rZW4pOwogICAgdG9rZW4gPSBlbnN1cmVTZW1pY29sb24odG9rZW4pOwogICAgbGlzdGVuZXIuZW5kUmVkaXJlY3RpbmdGYWN0b3J5Qm9keShlcXVhbHMsIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHNraXBGdW5jdGlvbkJvZHkoVG9rZW4gdG9rZW4sIGJvb2wgaXNFeHByZXNzaW9uLCBib29sIGFsbG93QWJzdHJhY3QpIHsKICAgIGFzc2VydCghaXNFeHByZXNzaW9uKTsKICAgIHRva2VuID0gc2tpcEFzeW5jTW9kaWZpZXIodG9rZW4pOwogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJ25hdGl2ZScsIG5leHQpKSB7CiAgICAgIFRva2VuIG5hdGl2ZVRva2VuID0gbmV4dDsKICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IHNraXAgdGhlIG5hdGl2ZSBjbGF1c2UgcmF0aGVyIHRoYW4gcGFyc2luZyBpdAogICAgICAvLyBvciByZW1vdmUgdGhpcyBjb2RlIGNvbXBsZXRlbHkgd2hlbiB3ZSByZW1vdmUgc3VwcG9ydAogICAgICAvLyBmb3IgdGhlIGBuYXRpdmVgIGNsYXVzZS4KICAgICAgdG9rZW4gPSBwYXJzZU5hdGl2ZUNsYXVzZSh0b2tlbik7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJzsnLCBuZXh0KSkgewogICAgICAgIGxpc3RlbmVyLmhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keVNraXBwZWQobmF0aXZlVG9rZW4sIG5leHQpOwogICAgICAgIHJldHVybiB0b2tlbi5uZXh0OwogICAgICB9CiAgICAgIGxpc3RlbmVyLmhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keUlnbm9yZWQobmF0aXZlVG9rZW4sIG5leHQpOwogICAgICAvLyBGYWxsIHRocm91Z2ggdG8gcmVjb3ZlciBhbmQgc2tpcCBmdW5jdGlvbiBib2R5CiAgICB9CiAgICBTdHJpbmcgdmFsdWUgPSBuZXh0LnN0cmluZ1ZhbHVlOwogICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJzsnKSkgewogICAgICB0b2tlbiA9IG5leHQ7CiAgICAgIGlmICghYWxsb3dBYnN0cmFjdCkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4sIGZhc3RhLm1lc3NhZ2VFeHBlY3RlZEJvZHkpOwogICAgICB9CiAgICAgIGxpc3RlbmVyLmhhbmRsZU5vRnVuY3Rpb25Cb2R5KHRva2VuKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnPT4nKSkgewogICAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvbihuZXh0KTsKICAgICAgLy8gVGhlcmUgb3VnaHQgdG8gYmUgYSBzZW1pY29sb24gZm9sbG93aW5nIHRoZSBleHByZXNzaW9uLCBidXQgd2UgY2hlY2sKICAgICAgLy8gYmVmb3JlIGFkdmFuY2luZyBpbiBvcmRlciB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHdheSB0aGUgbWV0aG9kCiAgICAgIC8vIFtwYXJzZUZ1bmN0aW9uQm9keV0gcmVjb3ZlcnMgd2hlbiB0aGUgc2VtaWNvbG9uIGlzIG1pc3NpbmcuCiAgICAgIGlmIChvcHRpb25hbCgnOycsIHRva2VuLm5leHQpKSB7CiAgICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICB9CiAgICAgIGxpc3RlbmVyLmhhbmRsZUZ1bmN0aW9uQm9keVNraXBwZWQodG9rZW4sIHRydWUpOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICc9JykpIHsKICAgICAgdG9rZW4gPSBuZXh0OwogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLCBmYXN0YS5tZXNzYWdlRXhwZWN0ZWRCb2R5KTsKICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24odG9rZW4pOwogICAgICAvLyBUaGVyZSBvdWdodCB0byBiZSBhIHNlbWljb2xvbiBmb2xsb3dpbmcgdGhlIGV4cHJlc3Npb24sIGJ1dCB3ZSBjaGVjawogICAgICAvLyBiZWZvcmUgYWR2YW5jaW5nIGluIG9yZGVyIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2F5IHRoZSBtZXRob2QKICAgICAgLy8gW3BhcnNlRnVuY3Rpb25Cb2R5XSByZWNvdmVycyB3aGVuIHRoZSBzZW1pY29sb24gaXMgbWlzc2luZy4KICAgICAgaWYgKG9wdGlvbmFsKCc7JywgdG9rZW4ubmV4dCkpIHsKICAgICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICAgIH0KICAgICAgbGlzdGVuZXIuaGFuZGxlRnVuY3Rpb25Cb2R5U2tpcHBlZCh0b2tlbiwgdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICB0b2tlbiA9IHNraXBCbG9jayh0b2tlbik7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUZ1bmN0aW9uQm9keVNraXBwZWQodG9rZW4sIGZhbHNlKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBQYXJzZXMgYSBmdW5jdGlvbiBib2R5LiAgVGhpcyBtZXRob2QgaXMgdXNlZCBpbiBib3RoIGV4cHJlc3Npb24gY29udGV4dAogIC8vLyAod2hlbiBbb2ZGdW5jdGlvbkV4cHJlc3Npb25dIGlzIHRydWUpIGFuZCBzdGF0ZW1lbnQgY29udGV4dC4gSW4gc3RhdGVtZW50CiAgLy8vIGNvbnRleHQgKHdoZW4gW29mRnVuY3Rpb25FeHByZXNzaW9uXSBpcyBmYWxzZSksIGFuZCBpZiB0aGUgZnVuY3Rpb24gYm9keQogIC8vLyBpcyBvbiB0aGUgZm9ybSBgPT4gZXhwcmVzc2lvbmAsIGEgdHJhaWxpbmcgc2VtaWNvbG9uIGlzIHJlcXVpcmVkLgogIC8vLwogIC8vLyBJdCdzIGFuIGVycm9yIGlmIHRoZXJlJ3Mgbm8gZnVuY3Rpb24gYm9keSB1bmxlc3MgW2FsbG93QWJzdHJhY3RdIGlzIHRydWUuCiAgVG9rZW4gcGFyc2VGdW5jdGlvbkJvZHkoCiAgICAgIFRva2VuIHRva2VuLCBib29sIG9mRnVuY3Rpb25FeHByZXNzaW9uLCBib29sIGFsbG93QWJzdHJhY3QpIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCduYXRpdmUnLCBuZXh0KSkgewogICAgICBUb2tlbiBuYXRpdmVUb2tlbiA9IG5leHQ7CiAgICAgIHRva2VuID0gcGFyc2VOYXRpdmVDbGF1c2UodG9rZW4pOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKG9wdGlvbmFsKCc7JywgbmV4dCkpIHsKICAgICAgICBsaXN0ZW5lci5oYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHkobmF0aXZlVG9rZW4sIG5leHQpOwogICAgICAgIHJldHVybiBuZXh0OwogICAgICB9CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgZmFzdGEubWVzc2FnZUV4dGVybmFsTWV0aG9kV2l0aEJvZHkpOwogICAgICBsaXN0ZW5lci5oYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHlJZ25vcmVkKG5hdGl2ZVRva2VuLCBuZXh0KTsKICAgICAgLy8gSWdub3JlIHRoZSBuYXRpdmUga2V5d29yZCBhbmQgZmFsbCB0aHJvdWdoIHRvIHBhcnNlIHRoZSBib2R5CiAgICB9CiAgICBpZiAob3B0aW9uYWwoJzsnLCBuZXh0KSkgewogICAgICBpZiAoIWFsbG93QWJzdHJhY3QpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGZhc3RhLm1lc3NhZ2VFeHBlY3RlZEJvZHkpOwogICAgICB9CiAgICAgIGxpc3RlbmVyLmhhbmRsZUVtcHR5RnVuY3Rpb25Cb2R5KG5leHQpOwogICAgICByZXR1cm4gbmV4dDsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJz0+JywgbmV4dCkpIHsKICAgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvbkZ1bmN0aW9uQm9keShuZXh0LCBvZkZ1bmN0aW9uRXhwcmVzc2lvbik7CiAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCc9JywgbmV4dCkpIHsKICAgICAgLy8gUmVjb3ZlciBmcm9tIGEgYmFkIGZhY3RvcnkgbWV0aG9kLgogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGZhc3RhLm1lc3NhZ2VFeHBlY3RlZEJvZHkpOwogICAgICBuZXh0ID0gcmV3cml0ZXIuaW5zZXJ0VG9rZW4oCiAgICAgICAgICBuZXh0LCBuZXcgU3ludGhldGljVG9rZW4oVG9rZW5UeXBlLkZVTkNUSU9OLCBuZXh0Lm5leHQuY2hhck9mZnNldCkpOwogICAgICBUb2tlbiBiZWdpbiA9IG5leHQ7CiAgICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uKG5leHQpOwogICAgICBpZiAoIW9mRnVuY3Rpb25FeHByZXNzaW9uKSB7CiAgICAgICAgdG9rZW4gPSBlbnN1cmVTZW1pY29sb24odG9rZW4pOwogICAgICAgIGxpc3RlbmVyLmhhbmRsZUV4cHJlc3Npb25GdW5jdGlvbkJvZHkoYmVnaW4sIHRva2VuKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsaXN0ZW5lci5oYW5kbGVFeHByZXNzaW9uRnVuY3Rpb25Cb2R5KGJlZ2luLCBudWxsKTsKICAgICAgfQogICAgICByZXR1cm4gdG9rZW47CiAgICB9CiAgICBUb2tlbiBiZWdpbiA9IG5leHQ7CiAgICBpbnQgc3RhdGVtZW50Q291bnQgPSAwOwogICAgaWYgKCFvcHRpb25hbCgneycsIG5leHQpKSB7CiAgICAgIC8vIFJlY292ZXJ5CiAgICAgIC8vIElmIGByZXR1cm5gIHVzZWQgaW5zdGVhZCBvZiBgPT5gLCB0aGVuIHJlcG9ydCBhbiBlcnJvciBhbmQgY29udGludWUKICAgICAgaWYgKG9wdGlvbmFsKCdyZXR1cm4nLCBuZXh0KSkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgZmFzdGEubWVzc2FnZUV4cGVjdGVkQm9keSk7CiAgICAgICAgbmV4dCA9IHJld3JpdGVyLmluc2VydFRva2VuKAogICAgICAgICAgICBuZXh0LCBuZXcgU3ludGhldGljVG9rZW4oVG9rZW5UeXBlLkZVTkNUSU9OLCBuZXh0Lm5leHQuY2hhck9mZnNldCkpOwogICAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb25GdW5jdGlvbkJvZHkobmV4dCwgb2ZGdW5jdGlvbkV4cHJlc3Npb24pOwogICAgICB9CiAgICAgIC8vIElmIHRoZXJlIGlzIGEgc3RyYXkgc2ltcGxlIGlkZW50aWZpZXIgaW4gdGhlIGZ1bmN0aW9uIGV4cHJlc3Npb24KICAgICAgLy8gYmVjYXVzZSB0aGUgdXNlciBpcyB0eXBpbmcgKGUuZy4gYCgpIGFzeSA9PiBudWxsO2ApCiAgICAgIC8vIHRoZW4gcmVwb3J0IGFuIGVycm9yLCBza2lwIHRoZSB0b2tlbiwgYW5kIGNvbnRpbnVlIHBhcnNpbmcuCiAgICAgIGlmIChuZXh0LmlzS2V5d29yZE9ySWRlbnRpZmllciAmJiBvcHRpb25hbCgnPT4nLCBuZXh0Lm5leHQpKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbihuZXh0LCBmYXN0YS50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbik7CiAgICAgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvbkZ1bmN0aW9uQm9keShuZXh0Lm5leHQsIG9mRnVuY3Rpb25FeHByZXNzaW9uKTsKICAgICAgfQogICAgICBpZiAobmV4dC5pc0tleXdvcmRPcklkZW50aWZpZXIgJiYgb3B0aW9uYWwoJ3snLCBuZXh0Lm5leHQpKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbihuZXh0LCBmYXN0YS50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbik7CiAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgIGJlZ2luID0gbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIHBhcnNlIHRoZSBibG9jay4KICAgICAgfSBlbHNlIHsKICAgICAgICB0b2tlbiA9IGVuc3VyZUJsb2NrKHRva2VuLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkRnVuY3Rpb25Cb2R5KTsKICAgICAgICBsaXN0ZW5lci5oYW5kbGVJbnZhbGlkRnVuY3Rpb25Cb2R5KHRva2VuKTsKICAgICAgICByZXR1cm4gdG9rZW4uZW5kR3JvdXA7CiAgICAgIH0KICAgIH0KCiAgICBMb29wU3RhdGUgc2F2ZWRMb29wU3RhdGUgPSBsb29wU3RhdGU7CiAgICBsb29wU3RhdGUgPSBMb29wU3RhdGUuT3V0c2lkZUxvb3A7CiAgICBsaXN0ZW5lci5iZWdpbkJsb2NrRnVuY3Rpb25Cb2R5KGJlZ2luKTsKICAgIHRva2VuID0gbmV4dDsKICAgIHdoaWxlIChub3RFb2ZPclZhbHVlKCd9JywgdG9rZW4ubmV4dCkpIHsKICAgICAgVG9rZW4gc3RhcnRUb2tlbiA9IHRva2VuLm5leHQ7CiAgICAgIHRva2VuID0gcGFyc2VTdGF0ZW1lbnQodG9rZW4pOwogICAgICBpZiAoaWRlbnRpY2FsKHRva2VuLm5leHQsIHN0YXJ0VG9rZW4pKSB7CiAgICAgICAgLy8gTm8gcHJvZ3Jlc3Mgd2FzIG1hZGUsIHNvIHdlIHJlcG9ydCB0aGUgY3VycmVudCB0b2tlbiBhcyBiZWluZyBpbnZhbGlkCiAgICAgICAgLy8gYW5kIG1vdmUgZm9yd2FyZC4KICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICB0b2tlbiwgZmFzdGEudGVtcGxhdGVVbmV4cGVjdGVkVG9rZW4ud2l0aEFyZ3VtZW50cyh0b2tlbikpOwogICAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgfQogICAgICArK3N0YXRlbWVudENvdW50OwogICAgfQogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCd9JywgdG9rZW4pKTsKICAgIGxpc3RlbmVyLmVuZEJsb2NrRnVuY3Rpb25Cb2R5KHN0YXRlbWVudENvdW50LCBiZWdpbiwgdG9rZW4pOwogICAgbG9vcFN0YXRlID0gc2F2ZWRMb29wU3RhdGU7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZUV4cHJlc3Npb25GdW5jdGlvbkJvZHkoVG9rZW4gdG9rZW4sIGJvb2wgb2ZGdW5jdGlvbkV4cHJlc3Npb24pIHsKICAgIGFzc2VydChvcHRpb25hbCgnPT4nLCB0b2tlbikpOwogICAgVG9rZW4gYmVnaW4gPSB0b2tlbjsKICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uKHRva2VuKTsKICAgIGlmICghb2ZGdW5jdGlvbkV4cHJlc3Npb24pIHsKICAgICAgdG9rZW4gPSBlbnN1cmVTZW1pY29sb24odG9rZW4pOwogICAgICBsaXN0ZW5lci5oYW5kbGVFeHByZXNzaW9uRnVuY3Rpb25Cb2R5KGJlZ2luLCB0b2tlbik7CiAgICB9IGVsc2UgewogICAgICBsaXN0ZW5lci5oYW5kbGVFeHByZXNzaW9uRnVuY3Rpb25Cb2R5KGJlZ2luLCBudWxsKTsKICAgIH0KICAgIGlmIChpbkdlbmVyYXRvcikgewogICAgICBsaXN0ZW5lci5oYW5kbGVJbnZhbGlkU3RhdGVtZW50KAogICAgICAgICAgYmVnaW4sIGZhc3RhLm1lc3NhZ2VHZW5lcmF0b3JSZXR1cm5zVmFsdWUpOwogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gc2tpcEFzeW5jTW9kaWZpZXIoVG9rZW4gdG9rZW4pIHsKICAgIFN0cmluZyB2YWx1ZSA9IHRva2VuLm5leHQuc3RyaW5nVmFsdWU7CiAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnYXN5bmMnKSkgewogICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICAgIHZhbHVlID0gdG9rZW4ubmV4dC5zdHJpbmdWYWx1ZTsKCiAgICAgIGlmIChpZGVudGljYWwodmFsdWUsICcqJykpIHsKICAgICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnc3luYycpKSB7CiAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgdmFsdWUgPSB0b2tlbi5uZXh0LnN0cmluZ1ZhbHVlOwoKICAgICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJyonKSkgewogICAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VBc3luY01vZGlmaWVyT3B0KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBhc3luYzsKICAgIFRva2VuIHN0YXI7CiAgICBhc3luY1N0YXRlID0gQXN5bmNNb2RpZmllci5TeW5jOwogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJ2FzeW5jJywgbmV4dCkpIHsKICAgICAgYXN5bmMgPSB0b2tlbiA9IG5leHQ7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJyonLCBuZXh0KSkgewogICAgICAgIGFzeW5jU3RhdGUgPSBBc3luY01vZGlmaWVyLkFzeW5jU3RhcjsKICAgICAgICBzdGFyID0gbmV4dDsKICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXN5bmNTdGF0ZSA9IEFzeW5jTW9kaWZpZXIuQXN5bmM7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ3N5bmMnLCBuZXh0KSkgewogICAgICBhc3luYyA9IHRva2VuID0gbmV4dDsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIGlmIChvcHRpb25hbCgnKicsIG5leHQpKSB7CiAgICAgICAgYXN5bmNTdGF0ZSA9IEFzeW5jTW9kaWZpZXIuU3luY1N0YXI7CiAgICAgICAgc3RhciA9IG5leHQ7CiAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICB9IGVsc2UgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoYXN5bmMsIGZhc3RhLm1lc3NhZ2VJbnZhbGlkU3luY01vZGlmaWVyKTsKICAgICAgfQogICAgfQogICAgbGlzdGVuZXIuaGFuZGxlQXN5bmNNb2RpZmllcihhc3luYywgc3Rhcik7CiAgICBpZiAoIWluUGxhaW5TeW5jICYmIG9wdGlvbmFsKCc7JywgdG9rZW4ubmV4dCkpIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0b2tlbi5uZXh0LCBmYXN0YS5tZXNzYWdlQWJzdHJhY3ROb3RTeW5jKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIGludCBzdGF0ZW1lbnREZXB0aCA9IDA7CiAgVG9rZW4gcGFyc2VTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGlmIChzdGF0ZW1lbnREZXB0aCsrID4gNTAwKSB7CiAgICAgIC8vIFRoaXMgaGFwcGVucyBmb3IgZGVnZW5lcmF0ZSBwcm9ncmFtcywgZm9yIGV4YW1wbGUsIGEgbG90IG9mIG5lc3RlZAogICAgICAvLyBpZi1zdGF0ZW1lbnRzLiBUaGUgbGFuZ3VhZ2UgdGVzdCBkZWVwX25lc3RpbmcyX25lZ2F0aXZlX3Rlc3QsIGZvcgogICAgICAvLyBleGFtcGxlLCBwcm92b2tlcyB0aGlzLgogICAgICByZXR1cm4gcmVjb3ZlckZyb21TdGFja092ZXJmbG93KHRva2VuKTsKICAgIH0KICAgIFRva2VuIHJlc3VsdCA9IHBhcnNlU3RhdGVtZW50WCh0b2tlbik7CiAgICBzdGF0ZW1lbnREZXB0aC0tOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIFRva2VuIHBhcnNlU3RhdGVtZW50WChUb2tlbiB0b2tlbikgewogICAgaWYgKGlkZW50aWNhbCh0b2tlbi5uZXh0LmtpbmQsIElERU5USUZJRVJfVE9LRU4pKSB7CiAgICAgIGlmIChvcHRpb25hbCgnOicsIHRva2VuLm5leHQubmV4dCkpIHsKICAgICAgICByZXR1cm4gcGFyc2VMYWJlbGVkU3RhdGVtZW50KHRva2VuKTsKICAgICAgfQogICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50T3JEZWNsYXJhdGlvbkFmdGVyTW9kaWZpZXJzKHRva2VuLCB0b2tlbik7CiAgICB9CiAgICBmaW5hbCB2YWx1ZSA9IHRva2VuLm5leHQuc3RyaW5nVmFsdWU7CiAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAneycpKSB7CiAgICAgIHJldHVybiBwYXJzZUJsb2NrKHRva2VuKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAncmV0dXJuJykpIHsKICAgICAgcmV0dXJuIHBhcnNlUmV0dXJuU3RhdGVtZW50KHRva2VuKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAndmFyJykgfHwgaWRlbnRpY2FsKHZhbHVlLCAnZmluYWwnKSkgewogICAgICBUb2tlbiB2YXJPckZpbmFsID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKGlzTW9kaWZpZXIodmFyT3JGaW5hbC5uZXh0KSkgewogICAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRPckRlY2xhcmF0aW9uKHRva2VuKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50T3JEZWNsYXJhdGlvbkFmdGVyTW9kaWZpZXJzKAogICAgICAgICAgICB2YXJPckZpbmFsLCB0b2tlbiwgdmFyT3JGaW5hbCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnaWYnKSkgewogICAgICByZXR1cm4gcGFyc2VJZlN0YXRlbWVudCh0b2tlbik7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2F3YWl0JykgJiYgb3B0aW9uYWwoJ2ZvcicsIHRva2VuLm5leHQubmV4dCkpIHsKICAgICAgcmV0dXJuIHBhcnNlRm9yU3RhdGVtZW50KHRva2VuLm5leHQsIHRva2VuLm5leHQpOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdmb3InKSkgewogICAgICByZXR1cm4gcGFyc2VGb3JTdGF0ZW1lbnQodG9rZW4sIG51bGwpOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdyZXRocm93JykpIHsKICAgICAgcmV0dXJuIHBhcnNlUmV0aHJvd1N0YXRlbWVudCh0b2tlbik7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ3doaWxlJykpIHsKICAgICAgcmV0dXJuIHBhcnNlV2hpbGVTdGF0ZW1lbnQodG9rZW4pOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdkbycpKSB7CiAgICAgIHJldHVybiBwYXJzZURvV2hpbGVTdGF0ZW1lbnQodG9rZW4pOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICd0cnknKSkgewogICAgICByZXR1cm4gcGFyc2VUcnlTdGF0ZW1lbnQodG9rZW4pOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdzd2l0Y2gnKSkgewogICAgICByZXR1cm4gcGFyc2VTd2l0Y2hTdGF0ZW1lbnQodG9rZW4pOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdicmVhaycpKSB7CiAgICAgIHJldHVybiBwYXJzZUJyZWFrU3RhdGVtZW50KHRva2VuKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnY29udGludWUnKSkgewogICAgICByZXR1cm4gcGFyc2VDb250aW51ZVN0YXRlbWVudCh0b2tlbik7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2Fzc2VydCcpKSB7CiAgICAgIHJldHVybiBwYXJzZUFzc2VydFN0YXRlbWVudCh0b2tlbik7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJzsnKSkgewogICAgICByZXR1cm4gcGFyc2VFbXB0eVN0YXRlbWVudCh0b2tlbik7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ3lpZWxkJykpIHsKICAgICAgc3dpdGNoIChhc3luY1N0YXRlKSB7CiAgICAgICAgY2FzZSBBc3luY01vZGlmaWVyLlN5bmM6CiAgICAgICAgICBpZiAob3B0aW9uYWwoJzonLCB0b2tlbi5uZXh0Lm5leHQpKSB7CiAgICAgICAgICAgIHJldHVybiBwYXJzZUxhYmVsZWRTdGF0ZW1lbnQodG9rZW4pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudE9yRGVjbGFyYXRpb24odG9rZW4pOwoKICAgICAgICBjYXNlIEFzeW5jTW9kaWZpZXIuU3luY1N0YXI6CiAgICAgICAgY2FzZSBBc3luY01vZGlmaWVyLkFzeW5jU3RhcjoKICAgICAgICAgIHJldHVybiBwYXJzZVlpZWxkU3RhdGVtZW50KHRva2VuKTsKCiAgICAgICAgY2FzZSBBc3luY01vZGlmaWVyLkFzeW5jOgogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0b2tlbi5uZXh0LCBmYXN0YS5tZXNzYWdlWWllbGROb3RHZW5lcmF0b3IpOwogICAgICAgICAgcmV0dXJuIHBhcnNlWWllbGRTdGF0ZW1lbnQodG9rZW4pOwogICAgICB9CiAgICAgIHRocm93ICJJbnRlcm5hbCBlcnJvcjogVW5rbm93biBhc3luY1N0YXRlOiAnJGFzeW5jU3RhdGUnLiI7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2NvbnN0JykpIHsKICAgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudE9yQ29uc3REZWNsYXJhdGlvbih0b2tlbik7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2F3YWl0JykpIHsKICAgICAgaWYgKGluUGxhaW5TeW5jKSB7CiAgICAgICAgaWYgKCFsb29rc0xpa2VBd2FpdEV4cHJlc3Npb24odG9rZW4pKSB7CiAgICAgICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50T3JEZWNsYXJhdGlvbih0b2tlbik7CiAgICAgICAgfQogICAgICAgIC8vIFJlY292ZXJ5OiBsb29rcyBsaWtlIGFuIGV4cHJlc3Npb24gcHJlY2VkZWQgYnkgYGF3YWl0YAogICAgICAgIC8vIGJ1dCBub3QgaW5zaWRlIGFuIGFzeW5jIGNvbnRleHQuCiAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudAogICAgICAgIC8vIGFuZCBwYXJzZUF3YWl0RXhwcmVzc2lvbiB3aWxsIHJlcG9ydCB0aGUgZXJyb3IuCiAgICAgIH0KICAgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudCh0b2tlbik7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ3NldCcpICYmIHRva2VuLm5leHQubmV4dC5pc0lkZW50aWZpZXIpIHsKICAgICAgLy8gUmVjb3Zlcnk6IGludmFsaWQgdXNlIG9mIGBzZXRgCiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICB0b2tlbi5uZXh0LCBmYXN0YS50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbik7CiAgICAgIHJldHVybiBwYXJzZVN0YXRlbWVudFgodG9rZW4ubmV4dCk7CiAgICB9IGVsc2UgaWYgKHRva2VuLm5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgIGlmIChvcHRpb25hbCgnOicsIHRva2VuLm5leHQubmV4dCkpIHsKICAgICAgICByZXR1cm4gcGFyc2VMYWJlbGVkU3RhdGVtZW50KHRva2VuKTsKICAgICAgfQogICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50T3JEZWNsYXJhdGlvbih0b2tlbik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50T3JEZWNsYXJhdGlvbih0b2tlbik7CiAgICB9CiAgfQoKICAvLy8gYGBgCiAgLy8vIHlpZWxkU3RhdGVtZW50OgogIC8vLyAgICd5aWVsZCcgZXhwcmVzc2lvbj8gJzsnCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VZaWVsZFN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gYmVnaW4gPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ3lpZWxkJywgdG9rZW4pKTsKICAgIGxpc3RlbmVyLmJlZ2luWWllbGRTdGF0ZW1lbnQoYmVnaW4pOwogICAgVG9rZW4gc3RhclRva2VuOwogICAgaWYgKG9wdGlvbmFsKCcqJywgdG9rZW4ubmV4dCkpIHsKICAgICAgc3RhclRva2VuID0gdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgfQogICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24odG9rZW4pOwogICAgdG9rZW4gPSBlbnN1cmVTZW1pY29sb24odG9rZW4pOwogICAgbGlzdGVuZXIuZW5kWWllbGRTdGF0ZW1lbnQoYmVnaW4sIHN0YXJUb2tlbiwgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyByZXR1cm5TdGF0ZW1lbnQ6CiAgLy8vICAgJ3JldHVybicgZXhwcmVzc2lvbj8gJzsnCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VSZXR1cm5TdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIGJlZ2luID0gdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdyZXR1cm4nLCB0b2tlbikpOwogICAgbGlzdGVuZXIuYmVnaW5SZXR1cm5TdGF0ZW1lbnQoYmVnaW4pOwogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJzsnLCBuZXh0KSkgewogICAgICBsaXN0ZW5lci5lbmRSZXR1cm5TdGF0ZW1lbnQoZmFsc2UsIGJlZ2luLCBuZXh0KTsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CiAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvbih0b2tlbik7CiAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICBsaXN0ZW5lci5lbmRSZXR1cm5TdGF0ZW1lbnQodHJ1ZSwgYmVnaW4sIHRva2VuKTsKICAgIGlmIChpbkdlbmVyYXRvcikgewogICAgICBsaXN0ZW5lci5oYW5kbGVJbnZhbGlkU3RhdGVtZW50KAogICAgICAgICAgYmVnaW4sIGZhc3RhLm1lc3NhZ2VHZW5lcmF0b3JSZXR1cm5zVmFsdWUpOwogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyBsYWJlbDoKICAvLy8gICBpZGVudGlmaWVyICc6JwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlTGFiZWwoVG9rZW4gdG9rZW4pIHsKICAgIGFzc2VydCh0b2tlbi5uZXh0LmlzSWRlbnRpZmllcik7CiAgICB0b2tlbiA9IGVuc3VyZUlkZW50aWZpZXIodG9rZW4sIElkZW50aWZpZXJDb250ZXh0LmxhYmVsRGVjbGFyYXRpb24pLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJzonLCB0b2tlbikpOwogICAgbGlzdGVuZXIuaGFuZGxlTGFiZWwodG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyBzdGF0ZW1lbnQ6CiAgLy8vICAgbGFiZWwqIG5vbkxhYmVsbGVkU3RhdGVtZW50CiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VMYWJlbGVkU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChuZXh0LmlzSWRlbnRpZmllcik7CiAgICBhc3NlcnQob3B0aW9uYWwoJzonLCBuZXh0Lm5leHQpKTsKICAgIGludCBsYWJlbENvdW50ID0gMDsKICAgIGRvIHsKICAgICAgdG9rZW4gPSBwYXJzZUxhYmVsKHRva2VuKTsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIGxhYmVsQ291bnQrKzsKICAgIH0gd2hpbGUgKG5leHQuaXNJZGVudGlmaWVyICYmIG9wdGlvbmFsKCc6JywgbmV4dC5uZXh0KSk7CiAgICBsaXN0ZW5lci5iZWdpbkxhYmVsZWRTdGF0ZW1lbnQobmV4dCwgbGFiZWxDb3VudCk7CiAgICB0b2tlbiA9IHBhcnNlU3RhdGVtZW50KHRva2VuKTsKICAgIGxpc3RlbmVyLmVuZExhYmVsZWRTdGF0ZW1lbnQobGFiZWxDb3VudCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIGV4cHJlc3Npb25TdGF0ZW1lbnQ6CiAgLy8vICAgZXhwcmVzc2lvbj8gJzsnCiAgLy8vIDsKICAvLy8gYGBgCiAgLy8vCiAgLy8vIE5vdGU6IFRoaXMgbWV0aG9kIGNhbiBmYWlsIHRvIG1ha2UgcHJvZ3Jlc3MuIElmIHRoZXJlIGlzIG5laXRoZXIgYW4KICAvLy8gZXhwcmVzc2lvbiBub3IgYSBzZW1pLWNvbG9uLCB0aGVuIGEgc3ludGhldGljIGlkZW50aWZpZXIgYW5kIHN5bnRoZXRpYwogIC8vLyBzZW1pY29sb24gd2lsbCBiZSBpbnNlcnRlZCBiZWZvcmUgW3Rva2VuXSBhbmQgdGhlIHNlbWljb2xvbiB3aWxsIGJlCiAgLy8vIHJldHVybmVkLgogIFRva2VuIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgLy8gVE9ETyhicmlhbndpbGtlcnNvbik6IElmIHRoZSBuZXh0IHRva2VuIGlzIG5vdCB0aGUgc3RhcnQgb2YgYSB2YWxpZAogICAgLy8gZXhwcmVzc2lvbiwgdGhlbiB0aGlzIG1ldGhvZCBzaG91bGRuJ3QgcmVwb3J0IHRoYXQgd2UgaGF2ZSBhbiBleHByZXNzaW9uCiAgICAvLyBzdGF0ZW1lbnQuCiAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvbih0b2tlbik7CiAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICBsaXN0ZW5lci5oYW5kbGVFeHByZXNzaW9uU3RhdGVtZW50KHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIGludCBleHByZXNzaW9uRGVwdGggPSAwOwogIFRva2VuIHBhcnNlRXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgaWYgKGV4cHJlc3Npb25EZXB0aCsrID4gNTAwKSB7CiAgICAgIC8vIFRoaXMgaGFwcGVucyBpbiBkZWdlbmVyYXRlIHByb2dyYW1zLCBmb3IgZXhhbXBsZSwgd2l0aCBhIGxvdCBvZiBuZXN0ZWQKICAgICAgLy8gbGlzdCBsaXRlcmFscy4gVGhpcyBpcyBwcm92b2tlZCBieSwgZm9yIGV4YW1wbGUsIHRoZSBsYW5ndWFnZSB0ZXN0CiAgICAgIC8vIGRlZXBfbmVzdGluZzFfbmVnYXRpdmVfdGVzdC4KICAgICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgZmFzdGEubWVzc2FnZVN0YWNrT3ZlcmZsb3cpOwoKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgVG9rZW4gZW5kR3JvdXAgPSBuZXh0LmVuZEdyb3VwOwogICAgICBpZiAoZW5kR3JvdXAgIT0gbnVsbCkgewogICAgICAgIHdoaWxlICghbmV4dC5pc0VvZiAmJiAhaWRlbnRpY2FsKG5leHQsIGVuZEdyb3VwKSkgewogICAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHdoaWxlICghaXNPbmVPZihuZXh0LCBjb25zdCBbJyknLCAnXScsICd9JywgJzsnXSkpIHsKICAgICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIXRva2VuLmlzRW9mKSB7CiAgICAgICAgdG9rZW4gPSByZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuKTsKICAgICAgICBsaXN0ZW5lci5oYW5kbGVJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5leHByZXNzaW9uKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdG9rZW4gPSBvcHRpb25hbCgndGhyb3cnLCB0b2tlbi5uZXh0KQogICAgICAgICAgPyBwYXJzZVRocm93RXhwcmVzc2lvbih0b2tlbiwgdHJ1ZSkKICAgICAgICAgIDogcGFyc2VQcmVjZWRlbmNlRXhwcmVzc2lvbih0b2tlbiwgQVNTSUdOTUVOVF9QUkVDRURFTkNFLCB0cnVlKTsKICAgIH0KICAgIGV4cHJlc3Npb25EZXB0aC0tOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VFeHByZXNzaW9uV2l0aG91dENhc2NhZGUoVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBvcHRpb25hbCgndGhyb3cnLCB0b2tlbi5uZXh0KQogICAgICAgID8gcGFyc2VUaHJvd0V4cHJlc3Npb24odG9rZW4sIGZhbHNlKQogICAgICAgIDogcGFyc2VQcmVjZWRlbmNlRXhwcmVzc2lvbih0b2tlbiwgQVNTSUdOTUVOVF9QUkVDRURFTkNFLCBmYWxzZSk7CiAgfQoKICBUb2tlbiBwYXJzZUNvbmRpdGlvbmFsRXhwcmVzc2lvblJlc3QoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIHF1ZXN0aW9uID0gdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCc/JywgcXVlc3Rpb24pKTsKICAgIGxpc3RlbmVyLmJlZ2luQ29uZGl0aW9uYWxFeHByZXNzaW9uKHRva2VuKTsKICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uV2l0aG91dENhc2NhZGUodG9rZW4pOwogICAgVG9rZW4gY29sb24gPSBlbnN1cmVDb2xvbih0b2tlbik7CiAgICBsaXN0ZW5lci5oYW5kbGVDb25kaXRpb25hbEV4cHJlc3Npb25Db2xvbigpOwogICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb25XaXRob3V0Q2FzY2FkZShjb2xvbik7CiAgICBsaXN0ZW5lci5lbmRDb25kaXRpb25hbEV4cHJlc3Npb24ocXVlc3Rpb24sIGNvbG9uKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlUHJlY2VkZW5jZUV4cHJlc3Npb24oCiAgICAgIFRva2VuIHRva2VuLCBpbnQgcHJlY2VkZW5jZSwgYm9vbCBhbGxvd0Nhc2NhZGVzKSB7CiAgICBhc3NlcnQocHJlY2VkZW5jZSA+PSAxKTsKICAgIGFzc2VydChwcmVjZWRlbmNlIDw9IFNFTEVDVE9SX1BSRUNFREVOQ0UpOwogICAgdG9rZW4gPSBwYXJzZVVuYXJ5RXhwcmVzc2lvbih0b2tlbiwgYWxsb3dDYXNjYWRlcyk7CiAgICBUeXBlUGFyYW1PckFyZ0luZm8gdHlwZUFyZyA9IGNvbXB1dGVNZXRob2RUeXBlQXJndW1lbnRzKHRva2VuKTsKICAgIGlmICh0eXBlQXJnICE9IG5vVHlwZVBhcmFtT3JBcmcpIHsKICAgICAgLy8gRm9yIGV4YW1wbGUgYShiKTxUPihjKSwgd2hlcmUgdG9rZW4gaXMgYmVmb3JlICc8Jy4KICAgICAgdG9rZW4gPSB0eXBlQXJnLnBhcnNlQXJndW1lbnRzKHRva2VuLCB0aGlzKTsKICAgICAgYXNzZXJ0KG9wdGlvbmFsKCcoJywgdG9rZW4ubmV4dCkpOwogICAgfQogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBUb2tlblR5cGUgdHlwZSA9IG5leHQudHlwZTsKICAgIGludCB0b2tlbkxldmVsID0gdHlwZS5wcmVjZWRlbmNlOwogICAgZm9yIChpbnQgbGV2ZWwgPSB0b2tlbkxldmVsOyBsZXZlbCA+PSBwcmVjZWRlbmNlOyAtLWxldmVsKSB7CiAgICAgIGludCBsYXN0QmluYXJ5RXhwcmVzc2lvbkxldmVsID0gLTE7CiAgICAgIHdoaWxlIChpZGVudGljYWwodG9rZW5MZXZlbCwgbGV2ZWwpKSB7CiAgICAgICAgVG9rZW4gb3BlcmF0b3IgPSBuZXh0OwogICAgICAgIGlmIChpZGVudGljYWwodG9rZW5MZXZlbCwgQ0FTQ0FERV9QUkVDRURFTkNFKSkgewogICAgICAgICAgaWYgKCFhbGxvd0Nhc2NhZGVzKSB7CiAgICAgICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgICAgIH0KICAgICAgICAgIHRva2VuID0gcGFyc2VDYXNjYWRlRXhwcmVzc2lvbih0b2tlbik7CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodG9rZW5MZXZlbCwgQVNTSUdOTUVOVF9QUkVDRURFTkNFKSkgewogICAgICAgICAgLy8gUmlnaHQgYXNzb2NpYXRpdmUsIHNvIHdlIHJlY3Vyc2UgYXQgdGhlIHNhbWUgcHJlY2VkZW5jZQogICAgICAgICAgLy8gbGV2ZWwuCiAgICAgICAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICAgIHRva2VuID0gb3B0aW9uYWwoJ3Rocm93JywgbmV4dC5uZXh0KQogICAgICAgICAgICAgID8gcGFyc2VUaHJvd0V4cHJlc3Npb24obmV4dCwgZmFsc2UpCiAgICAgICAgICAgICAgOiBwYXJzZVByZWNlZGVuY2VFeHByZXNzaW9uKG5leHQsIGxldmVsLCBhbGxvd0Nhc2NhZGVzKTsKICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZUFzc2lnbm1lbnRFeHByZXNzaW9uKG9wZXJhdG9yKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh0b2tlbkxldmVsLCBQT1NURklYX1BSRUNFREVOQ0UpKSB7CiAgICAgICAgICBpZiAoKGlkZW50aWNhbCh0eXBlLCBUb2tlblR5cGUuUExVU19QTFVTKSkgfHwKICAgICAgICAgICAgICAoaWRlbnRpY2FsKHR5cGUsIFRva2VuVHlwZS5NSU5VU19NSU5VUykpKSB7CiAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZVVuYXJ5UG9zdGZpeEFzc2lnbm1lbnRFeHByZXNzaW9uKHRva2VuLm5leHQpOwogICAgICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodG9rZW5MZXZlbCwgUFJFRklYX1BSRUNFREVOQ0UpICYmCiAgICAgICAgICAgIChpZGVudGljYWwodHlwZSwgVG9rZW5UeXBlLkJBTkcpKSkgewogICAgICAgICAgLy8gVGhlICchJyBoYXMgcHJlZml4IHByZWNlZGVuY2UgYnV0IGhlcmUgaXQncyBiZWluZyB1c2VkIGFzIGEKICAgICAgICAgIC8vIHBvc3RmaXggb3BlcmF0b3IgdG8gYXNzZXJ0IHRoZSBleHByZXNzaW9uIGhhcyBhIG5vbi1udWxsIHZhbHVlLgogICAgICAgICAgbGlzdGVuZXIuaGFuZGxlTm9uTnVsbEFzc2VydEV4cHJlc3Npb24odG9rZW4ubmV4dCk7CiAgICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodG9rZW5MZXZlbCwgU0VMRUNUT1JfUFJFQ0VERU5DRSkpIHsKICAgICAgICAgIGlmIChpZGVudGljYWwodHlwZSwgVG9rZW5UeXBlLlBFUklPRCkgfHwKICAgICAgICAgICAgICBpZGVudGljYWwodHlwZSwgVG9rZW5UeXBlLlFVRVNUSU9OX1BFUklPRCkpIHsKICAgICAgICAgICAgLy8gTGVmdCBhc3NvY2lhdGl2ZSwgc28gd2UgcmVjdXJzZSBhdCB0aGUgbmV4dCBoaWdoZXIgcHJlY2VkZW5jZQogICAgICAgICAgICAvLyBsZXZlbC4gSG93ZXZlciwgU0VMRUNUT1JfUFJFQ0VERU5DRSBpcyB0aGUgaGlnaGVzdCBsZXZlbCwgc28gd2UKICAgICAgICAgICAgLy8gc2hvdWxkIGp1c3QgY2FsbCBbcGFyc2VVbmFyeUV4cHJlc3Npb25dIGRpcmVjdGx5LiBIb3dldmVyLCBhCiAgICAgICAgICAgIC8vIHVuYXJ5IGV4cHJlc3Npb24gaXNuJ3QgbGVnYWwgYWZ0ZXIgYSBwZXJpb2QsIHNvIHdlIGNhbGwKICAgICAgICAgICAgLy8gW3BhcnNlUHJpbWFyeV0gaW5zdGVhZC4KICAgICAgICAgICAgdG9rZW4gPSBwYXJzZVByaW1hcnkoCiAgICAgICAgICAgICAgICB0b2tlbi5uZXh0LCBJZGVudGlmaWVyQ29udGV4dC5leHByZXNzaW9uQ29udGludWF0aW9uKTsKICAgICAgICAgICAgbGlzdGVuZXIuZW5kQmluYXJ5RXhwcmVzc2lvbihvcGVyYXRvcik7CiAgICAgICAgICB9IGVsc2UgaWYgKChpZGVudGljYWwodHlwZSwgVG9rZW5UeXBlLk9QRU5fUEFSRU4pKSB8fAogICAgICAgICAgICAgIChpZGVudGljYWwodHlwZSwgVG9rZW5UeXBlLk9QRU5fU1FVQVJFX0JSQUNLRVQpKSkgewogICAgICAgICAgICB0b2tlbiA9IHBhcnNlQXJndW1lbnRPckluZGV4U3Rhcih0b2tlbiwgdHlwZUFyZyk7CiAgICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh0eXBlLCBUb2tlblR5cGUuSU5ERVgpKSB7CiAgICAgICAgICAgIEJlZ2luVG9rZW4gcmVwbGFjZW1lbnQgPSBsaW5rKAogICAgICAgICAgICAgICAgbmV3IEJlZ2luVG9rZW4oVG9rZW5UeXBlLk9QRU5fU1FVQVJFX0JSQUNLRVQsIG5leHQuY2hhck9mZnNldCwKICAgICAgICAgICAgICAgICAgICBuZXh0LnByZWNlZGluZ0NvbW1lbnRzKSwKICAgICAgICAgICAgICAgIG5ldyBUb2tlbihUb2tlblR5cGUuQ0xPU0VfU1FVQVJFX0JSQUNLRVQsIG5leHQuY2hhck9mZnNldCArIDEpKTsKICAgICAgICAgICAgcmV3cml0ZXIucmVwbGFjZVRva2VuRm9sbG93aW5nKHRva2VuLCByZXBsYWNlbWVudCk7CiAgICAgICAgICAgIHJlcGxhY2VtZW50LmVuZFRva2VuID0gcmVwbGFjZW1lbnQubmV4dDsKICAgICAgICAgICAgdG9rZW4gPSBwYXJzZUFyZ3VtZW50T3JJbmRleFN0YXIodG9rZW4sIG5vVHlwZVBhcmFtT3JBcmcpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgICAgICAgIHRva2VuLm5leHQsIGZhc3RhLnRlbXBsYXRlVW5leHBlY3RlZFRva2VuKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh0eXBlLCBUb2tlblR5cGUuSVMpKSB7CiAgICAgICAgICB0b2tlbiA9IHBhcnNlSXNPcGVyYXRvclJlc3QodG9rZW4pOwogICAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHR5cGUsIFRva2VuVHlwZS5BUykpIHsKICAgICAgICAgIHRva2VuID0gcGFyc2VBc09wZXJhdG9yUmVzdCh0b2tlbik7CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodHlwZSwgVG9rZW5UeXBlLlFVRVNUSU9OKSkgewogICAgICAgICAgdG9rZW4gPSBwYXJzZUNvbmRpdGlvbmFsRXhwcmVzc2lvblJlc3QodG9rZW4pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAobGV2ZWwgPT0gRVFVQUxJVFlfUFJFQ0VERU5DRSB8fCBsZXZlbCA9PSBSRUxBVElPTkFMX1BSRUNFREVOQ0UpIHsKICAgICAgICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgKGEgPT0gYiA9PSBjKSBvciAoYSA8IGIgPCBjKS4KICAgICAgICAgICAgaWYgKGxhc3RCaW5hcnlFeHByZXNzaW9uTGV2ZWwgPT0gbGV2ZWwpIHsKICAgICAgICAgICAgICAvLyBSZXBvcnQgYW4gZXJyb3IsIHRoZW4gY29udGludWUgcGFyc2luZyBhcyBpZiBpdCBpcyBsZWdhbC4KICAgICAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgICAgICBuZXh0LCBmYXN0YS5tZXNzYWdlRXF1YWxpdHlDYW5ub3RCZUVxdWFsaXR5T3BlcmFuZCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy8gU2V0IGEgZmxhZyB0byBjYXRjaCBzdWJzZXF1ZW50IGJpbmFyeSBleHByZXNzaW9ucyBvZiB0aGlzIHR5cGUuCiAgICAgICAgICAgICAgbGFzdEJpbmFyeUV4cHJlc3Npb25MZXZlbCA9IGxldmVsOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBsaXN0ZW5lci5iZWdpbkJpbmFyeUV4cHJlc3Npb24obmV4dCk7CiAgICAgICAgICAvLyBMZWZ0IGFzc29jaWF0aXZlLCBzbyB3ZSByZWN1cnNlIGF0IHRoZSBuZXh0IGhpZ2hlcgogICAgICAgICAgLy8gcHJlY2VkZW5jZSBsZXZlbC4KICAgICAgICAgIHRva2VuID0KICAgICAgICAgICAgICBwYXJzZVByZWNlZGVuY2VFeHByZXNzaW9uKHRva2VuLm5leHQsIGxldmVsICsgMSwgYWxsb3dDYXNjYWRlcyk7CiAgICAgICAgICBsaXN0ZW5lci5lbmRCaW5hcnlFeHByZXNzaW9uKG9wZXJhdG9yKTsKICAgICAgICB9CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgdHlwZSA9IG5leHQudHlwZTsKICAgICAgICB0b2tlbkxldmVsID0gdHlwZS5wcmVjZWRlbmNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZUNhc2NhZGVFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBjYXNjYWRlT3BlcmF0b3IgPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJy4uJywgY2FzY2FkZU9wZXJhdG9yKSk7CiAgICBsaXN0ZW5lci5iZWdpbkNhc2NhZGUoY2FzY2FkZU9wZXJhdG9yKTsKICAgIGlmIChvcHRpb25hbCgnWycsIHRva2VuLm5leHQpKSB7CiAgICAgIHRva2VuID0gcGFyc2VBcmd1bWVudE9ySW5kZXhTdGFyKHRva2VuLCBub1R5cGVQYXJhbU9yQXJnKTsKICAgIH0gZWxzZSB7CiAgICAgIHRva2VuID0gcGFyc2VTZW5kKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5leHByZXNzaW9uQ29udGludWF0aW9uKTsKICAgICAgbGlzdGVuZXIuZW5kQmluYXJ5RXhwcmVzc2lvbihjYXNjYWRlT3BlcmF0b3IpOwogICAgfQogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBUb2tlbiBtYXJrOwogICAgZG8gewogICAgICBtYXJrID0gdG9rZW47CiAgICAgIGlmIChvcHRpb25hbCgnLicsIG5leHQpIHx8IG9wdGlvbmFsKCc/LicsIG5leHQpKSB7CiAgICAgICAgVG9rZW4gcGVyaW9kID0gbmV4dDsKICAgICAgICB0b2tlbiA9IHBhcnNlU2VuZChuZXh0LCBJZGVudGlmaWVyQ29udGV4dC5leHByZXNzaW9uQ29udGludWF0aW9uKTsKICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICBsaXN0ZW5lci5lbmRCaW5hcnlFeHByZXNzaW9uKHBlcmlvZCk7CiAgICAgIH0KICAgICAgVHlwZVBhcmFtT3JBcmdJbmZvIHR5cGVBcmcgPSBjb21wdXRlTWV0aG9kVHlwZUFyZ3VtZW50cyh0b2tlbik7CiAgICAgIGlmICh0eXBlQXJnICE9IG5vVHlwZVBhcmFtT3JBcmcpIHsKICAgICAgICAvLyBGb3IgZXhhbXBsZSBhKGIpLi48VD4oYyksIHdoZXJlIHRva2VuIGlzICc8Jy4KICAgICAgICB0b2tlbiA9IHR5cGVBcmcucGFyc2VBcmd1bWVudHModG9rZW4sIHRoaXMpOwogICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIGFzc2VydChvcHRpb25hbCgnKCcsIG5leHQpKTsKICAgICAgfQogICAgICB0b2tlbiA9IHBhcnNlQXJndW1lbnRPckluZGV4U3Rhcih0b2tlbiwgdHlwZUFyZyk7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgfSB3aGlsZSAoIWlkZW50aWNhbChtYXJrLCB0b2tlbikpOwoKICAgIGlmIChpZGVudGljYWwobmV4dC50eXBlLnByZWNlZGVuY2UsIEFTU0lHTk1FTlRfUFJFQ0VERU5DRSkpIHsKICAgICAgVG9rZW4gYXNzaWdubWVudCA9IG5leHQ7CiAgICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uV2l0aG91dENhc2NhZGUobmV4dCk7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUFzc2lnbm1lbnRFeHByZXNzaW9uKGFzc2lnbm1lbnQpOwogICAgfQogICAgbGlzdGVuZXIuZW5kQ2FzY2FkZSgpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VVbmFyeUV4cHJlc3Npb24oVG9rZW4gdG9rZW4sIGJvb2wgYWxsb3dDYXNjYWRlcykgewogICAgU3RyaW5nIHZhbHVlID0gdG9rZW4ubmV4dC5zdHJpbmdWYWx1ZTsKICAgIC8vIFByZWZpeDoKICAgIGlmIChpZGVudGljYWwodmFsdWUsICdhd2FpdCcpKSB7CiAgICAgIGlmIChpblBsYWluU3luYykgewogICAgICAgIGlmICghbG9va3NMaWtlQXdhaXRFeHByZXNzaW9uKHRva2VuKSkgewogICAgICAgICAgcmV0dXJuIHBhcnNlUHJpbWFyeSh0b2tlbiwgSWRlbnRpZmllckNvbnRleHQuZXhwcmVzc2lvbik7CiAgICAgICAgfQogICAgICAgIC8vIFJlY292ZXJ5OiBMb29rcyBsaWtlIGFuIGV4cHJlc3Npb24gcHJlY2VkZWQgYnkgYGF3YWl0YC4KICAgICAgICAvLyBGYWxsIHRocm91Z2ggYW5kIGxldCBwYXJzZUF3YWl0RXhwcmVzc2lvbiByZXBvcnQgdGhlIGVycm9yLgogICAgICB9CiAgICAgIHJldHVybiBwYXJzZUF3YWl0RXhwcmVzc2lvbih0b2tlbiwgYWxsb3dDYXNjYWRlcyk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJysnKSkgewogICAgICAvLyBEYXJ0IG5vIGxvbmdlciBhbGxvd3MgcHJlZml4LXBsdXMuCiAgICAgIHJld3JpdGVBbmRSZWNvdmVyKAogICAgICAgICAgdG9rZW4sCiAgICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogQ29uc2lkZXIgcmVwb3J0aW5nICJtaXNzaW5nIGlkZW50aWZpZXIiIGluc3RlYWQuCiAgICAgICAgICBmYXN0YS5tZXNzYWdlVW5zdXBwb3J0ZWRQcmVmaXhQbHVzLAogICAgICAgICAgbmV3IFN5bnRoZXRpY1N0cmluZ1Rva2VuKAogICAgICAgICAgICAgIFRva2VuVHlwZS5JREVOVElGSUVSLCAnJywgdG9rZW4ubmV4dC5vZmZzZXQpKTsKICAgICAgcmV0dXJuIHBhcnNlUHJpbWFyeSh0b2tlbiwgSWRlbnRpZmllckNvbnRleHQuZXhwcmVzc2lvbik7CiAgICB9IGVsc2UgaWYgKChpZGVudGljYWwodmFsdWUsICchJykpIHx8CiAgICAgICAgKGlkZW50aWNhbCh2YWx1ZSwgJy0nKSkgfHwKICAgICAgICAoaWRlbnRpY2FsKHZhbHVlLCAnficpKSkgewogICAgICBUb2tlbiBvcGVyYXRvciA9IHRva2VuLm5leHQ7CiAgICAgIC8vIFJpZ2h0IGFzc29jaWF0aXZlLCBzbyB3ZSByZWN1cnNlIGF0IHRoZSBzYW1lIHByZWNlZGVuY2UKICAgICAgLy8gbGV2ZWwuCiAgICAgIHRva2VuID0gcGFyc2VQcmVjZWRlbmNlRXhwcmVzc2lvbigKICAgICAgICAgIHRva2VuLm5leHQsIFBPU1RGSVhfUFJFQ0VERU5DRSwgYWxsb3dDYXNjYWRlcyk7CiAgICAgIGxpc3RlbmVyLmhhbmRsZVVuYXJ5UHJlZml4RXhwcmVzc2lvbihvcGVyYXRvcik7CiAgICAgIHJldHVybiB0b2tlbjsKICAgIH0gZWxzZSBpZiAoKGlkZW50aWNhbCh2YWx1ZSwgJysrJykpIHx8IGlkZW50aWNhbCh2YWx1ZSwgJy0tJykpIHsKICAgICAgLy8gVE9ETyhhaGUpOiBWYWxpZGF0ZSB0aGlzIGlzIHVzZWQgY29ycmVjdGx5LgogICAgICBUb2tlbiBvcGVyYXRvciA9IHRva2VuLm5leHQ7CiAgICAgIC8vIFJpZ2h0IGFzc29jaWF0aXZlLCBzbyB3ZSByZWN1cnNlIGF0IHRoZSBzYW1lIHByZWNlZGVuY2UKICAgICAgLy8gbGV2ZWwuCiAgICAgIHRva2VuID0gcGFyc2VQcmVjZWRlbmNlRXhwcmVzc2lvbigKICAgICAgICAgIHRva2VuLm5leHQsIFBPU1RGSVhfUFJFQ0VERU5DRSwgYWxsb3dDYXNjYWRlcyk7CiAgICAgIGxpc3RlbmVyLmhhbmRsZVVuYXJ5UHJlZml4QXNzaWdubWVudEV4cHJlc3Npb24ob3BlcmF0b3IpOwogICAgICByZXR1cm4gdG9rZW47CiAgICB9IGVsc2UgaWYgKHRva2VuLm5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoIi4iLCBpZGVudGlmaWVyLm5leHQpKSB7CiAgICAgICAgaWRlbnRpZmllciA9IGlkZW50aWZpZXIubmV4dC5uZXh0OwogICAgICB9CiAgICAgIGlmIChpZGVudGlmaWVyLmlzSWRlbnRpZmllcikgewogICAgICAgIC8vIExvb2tpbmcgYXQgYGlkZW50aWZpZXIgKCcuJyBpZGVudGlmaWVyKT9gLgogICAgICAgIGlmIChvcHRpb25hbCgiPCIsIGlkZW50aWZpZXIubmV4dCkpIHsKICAgICAgICAgIFR5cGVQYXJhbU9yQXJnSW5mbyB0eXBlQXJnID0gY29tcHV0ZVR5cGVQYXJhbU9yQXJnKGlkZW50aWZpZXIpOwogICAgICAgICAgaWYgKHR5cGVBcmcgIT0gbm9UeXBlUGFyYW1PckFyZykgewogICAgICAgICAgICBUb2tlbiBlbmRUeXBlQXJndW1lbnRzID0gdHlwZUFyZy5za2lwKGlkZW50aWZpZXIpOwogICAgICAgICAgICBpZiAob3B0aW9uYWwoIi4iLCBlbmRUeXBlQXJndW1lbnRzLm5leHQpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb24odG9rZW4sIHR5cGVBcmcpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcGFyc2VQcmltYXJ5KHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5leHByZXNzaW9uKTsKICB9CgogIFRva2VuIHBhcnNlQXJndW1lbnRPckluZGV4U3RhcihUb2tlbiB0b2tlbiwgVHlwZVBhcmFtT3JBcmdJbmZvIHR5cGVBcmcpIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgVG9rZW4gYmVnaW5Ub2tlbiA9IG5leHQ7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAob3B0aW9uYWwoJ1snLCBuZXh0KSkgewogICAgICAgIGFzc2VydCh0eXBlQXJnID09IG5vVHlwZVBhcmFtT3JBcmcpOwogICAgICAgIFRva2VuIG9wZW5TcXVhcmVCcmFja2V0ID0gbmV4dDsKICAgICAgICBib29sIG9sZCA9IG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9uczsKICAgICAgICBtYXlQYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbnMgPSB0cnVlOwogICAgICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uKG5leHQpOwogICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IG9sZDsKICAgICAgICBpZiAoIW9wdGlvbmFsKCddJywgbmV4dCkpIHsKICAgICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgIG5leHQsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnXScpKTsKICAgICAgICAgIC8vIFNjYW5uZXIgZW5zdXJlcyBhIGNsb3NpbmcgJ10nCiAgICAgICAgICBUb2tlbiBlbmRHcm91cCA9IG9wZW5TcXVhcmVCcmFja2V0LmVuZEdyb3VwOwogICAgICAgICAgaWYgKGVuZEdyb3VwLmlzU3ludGhldGljKSB7CiAgICAgICAgICAgIC8vIFNjYW5uZXIgaW5zZXJ0ZWQgY2xvc2luZyAnXScgaW4gdGhlIHdyb25nIHBsYWNlLCBzbyBtb3ZlIGl0LgogICAgICAgICAgICBuZXh0ID0gcmV3cml0ZXIubW92ZVN5bnRoZXRpYyh0b2tlbiwgZW5kR3JvdXApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gU2tpcCBvdmVyIHVuZXhwZWN0ZWQgdG9rZW5zIHRvIHdoZXJlIHRoZSB1c2VyIHBsYWNlZCB0aGUgYF1gLgogICAgICAgICAgICBuZXh0ID0gZW5kR3JvdXA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxpc3RlbmVyLmhhbmRsZUluZGV4ZWRFeHByZXNzaW9uKG9wZW5TcXVhcmVCcmFja2V0LCBuZXh0KTsKICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgdHlwZUFyZyA9IGNvbXB1dGVNZXRob2RUeXBlQXJndW1lbnRzKHRva2VuKTsKICAgICAgICBpZiAodHlwZUFyZyAhPSBub1R5cGVQYXJhbU9yQXJnKSB7CiAgICAgICAgICAvLyBGb3IgZXhhbXBsZSBhW2JdPFQ+KGMpLCB3aGVyZSB0b2tlbiBpcyBiZWZvcmUgJzwnLgogICAgICAgICAgdG9rZW4gPSB0eXBlQXJnLnBhcnNlQXJndW1lbnRzKHRva2VuLCB0aGlzKTsKICAgICAgICAgIGFzc2VydChvcHRpb25hbCgnKCcsIHRva2VuLm5leHQpKTsKICAgICAgICB9CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJygnLCBuZXh0KSkgewogICAgICAgIGlmICh0eXBlQXJnID09IG5vVHlwZVBhcmFtT3JBcmcpIHsKICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZU5vVHlwZUFyZ3VtZW50cyhuZXh0KTsKICAgICAgICB9CiAgICAgICAgdG9rZW4gPSBwYXJzZUFyZ3VtZW50cyh0b2tlbik7CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlU2VuZChiZWdpblRva2VuLCB0b2tlbik7CiAgICAgICAgdHlwZUFyZyA9IGNvbXB1dGVNZXRob2RUeXBlQXJndW1lbnRzKHRva2VuKTsKICAgICAgICBpZiAodHlwZUFyZyAhPSBub1R5cGVQYXJhbU9yQXJnKSB7CiAgICAgICAgICAvLyBGb3IgZXhhbXBsZSBhKGIpPFQ+KGMpLCB3aGVyZSB0b2tlbiBpcyBiZWZvcmUgJzwnLgogICAgICAgICAgdG9rZW4gPSB0eXBlQXJnLnBhcnNlQXJndW1lbnRzKHRva2VuLCB0aGlzKTsKICAgICAgICAgIGFzc2VydChvcHRpb25hbCgnKCcsIHRva2VuLm5leHQpKTsKICAgICAgICB9CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlUHJpbWFyeShUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgZmluYWwga2luZCA9IHRva2VuLm5leHQua2luZDsKICAgIGlmIChraW5kID09IElERU5USUZJRVJfVE9LRU4pIHsKICAgICAgcmV0dXJuIHBhcnNlU2VuZE9yRnVuY3Rpb25MaXRlcmFsKHRva2VuLCBjb250ZXh0KTsKICAgIH0gZWxzZSBpZiAoa2luZCA9PSBJTlRfVE9LRU4gfHwga2luZCA9PSBIRVhBREVDSU1BTF9UT0tFTikgewogICAgICByZXR1cm4gcGFyc2VMaXRlcmFsSW50KHRva2VuKTsKICAgIH0gZWxzZSBpZiAoa2luZCA9PSBET1VCTEVfVE9LRU4pIHsKICAgICAgcmV0dXJuIHBhcnNlTGl0ZXJhbERvdWJsZSh0b2tlbik7CiAgICB9IGVsc2UgaWYgKGtpbmQgPT0gU1RSSU5HX1RPS0VOKSB7CiAgICAgIHJldHVybiBwYXJzZUxpdGVyYWxTdHJpbmcodG9rZW4pOwogICAgfSBlbHNlIGlmIChraW5kID09IEhBU0hfVE9LRU4pIHsKICAgICAgcmV0dXJuIHBhcnNlTGl0ZXJhbFN5bWJvbCh0b2tlbik7CiAgICB9IGVsc2UgaWYgKGtpbmQgPT0gS0VZV09SRF9UT0tFTikgewogICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSB0b2tlbi5uZXh0LnN0cmluZ1ZhbHVlOwogICAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAidHJ1ZSIpIHx8IGlkZW50aWNhbCh2YWx1ZSwgImZhbHNlIikpIHsKICAgICAgICByZXR1cm4gcGFyc2VMaXRlcmFsQm9vbCh0b2tlbik7CiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAibnVsbCIpKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlTGl0ZXJhbE51bGwodG9rZW4pOwogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgInRoaXMiKSkgewogICAgICAgIHJldHVybiBwYXJzZVRoaXNFeHByZXNzaW9uKHRva2VuLCBjb250ZXh0KTsKICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICJzdXBlciIpKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlU3VwZXJFeHByZXNzaW9uKHRva2VuLCBjb250ZXh0KTsKICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICJuZXciKSkgewogICAgICAgIHJldHVybiBwYXJzZU5ld0V4cHJlc3Npb24odG9rZW4pOwogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgImNvbnN0IikpIHsKICAgICAgICByZXR1cm4gcGFyc2VDb25zdEV4cHJlc3Npb24odG9rZW4pOwogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgInZvaWQiKSkgewogICAgICAgIHJldHVybiBwYXJzZVNlbmRPckZ1bmN0aW9uTGl0ZXJhbCh0b2tlbiwgY29udGV4dCk7CiAgICAgIH0gZWxzZSBpZiAoIWluUGxhaW5TeW5jICYmCiAgICAgICAgICAoaWRlbnRpY2FsKHZhbHVlLCAieWllbGQiKSB8fCBpZGVudGljYWwodmFsdWUsICJhc3luYyIpKSkgewogICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byB0aGUgcmVjb3ZlcnkgY29kZS4KICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICJhc3NlcnQiKSkgewogICAgICAgIHJldHVybiBwYXJzZUFzc2VydCh0b2tlbiwgQXNzZXJ0LkV4cHJlc3Npb24pOwogICAgICB9IGVsc2UgaWYgKHRva2VuLm5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlU2VuZE9yRnVuY3Rpb25MaXRlcmFsKHRva2VuLCBjb250ZXh0KTsKICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICJyZXR1cm4iKSkgewogICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4odG9rZW4sIGZhc3RhLnRlbXBsYXRlVW5leHBlY3RlZFRva2VuKTsKICAgICAgICByZXR1cm4gcGFyc2VQcmltYXJ5KHRva2VuLCBjb250ZXh0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gdGhlIHJlY292ZXJ5IGNvZGUuCiAgICAgIH0KICAgIH0gZWxzZSBpZiAoa2luZCA9PSBPUEVOX1BBUkVOX1RPS0VOKSB7CiAgICAgIHJldHVybiBwYXJzZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uT3JGdW5jdGlvbkxpdGVyYWwodG9rZW4pOwogICAgfSBlbHNlIGlmIChraW5kID09IE9QRU5fU1FVQVJFX0JSQUNLRVRfVE9LRU4gfHwKICAgICAgICBvcHRpb25hbCgnW10nLCB0b2tlbi5uZXh0KSkgewogICAgICBsaXN0ZW5lci5oYW5kbGVOb1R5cGVBcmd1bWVudHModG9rZW4ubmV4dCk7CiAgICAgIHJldHVybiBwYXJzZUxpdGVyYWxMaXN0U3VmZml4KHRva2VuLCBudWxsKTsKICAgIH0gZWxzZSBpZiAoa2luZCA9PSBPUEVOX0NVUkxZX0JSQUNLRVRfVE9LRU4pIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlTm9UeXBlQXJndW1lbnRzKHRva2VuLm5leHQpOwogICAgICByZXR1cm4gcGFyc2VMaXRlcmFsU2V0T3JNYXBTdWZmaXgodG9rZW4sIG51bGwpOwogICAgfSBlbHNlIGlmIChraW5kID09IExUX1RPS0VOKSB7CiAgICAgIHJldHVybiBwYXJzZUxpdGVyYWxMaXN0U2V0TWFwT3JGdW5jdGlvbih0b2tlbiwgbnVsbCk7CiAgICB9IGVsc2UgewogICAgICAvLyBGYWxsIHRocm91Z2ggdG8gdGhlIHJlY292ZXJ5IGNvZGUuCiAgICB9CiAgICAvLwogICAgLy8gUmVjb3ZlcnkgY29kZS4KICAgIC8vCiAgICBpZiAodG9rZW4ubmV4dCBpcyBFcnJvclRva2VuKSB7CiAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgVG9rZW4gcHJldmlvdXM7CiAgICAgIGRvIHsKICAgICAgICAvLyBSZXBvcnQgdGhlIGVycm9yIGluIHRoZSBlcnJvciB0b2tlbiwgc2tpcCB0aGUgZXJyb3IgdG9rZW4sIGFuZCB0cnkKICAgICAgICAvLyBhZ2Fpbi4KICAgICAgICBwcmV2aW91cyA9IHRva2VuOwogICAgICAgIHJlcG9ydEVycm9yVG9rZW4odG9rZW4pOwogICAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgfSB3aGlsZSAodG9rZW4gaXMgRXJyb3JUb2tlbik7CiAgICAgIHJldHVybiBwYXJzZVByaW1hcnkocHJldmlvdXMsIGNvbnRleHQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHBhcnNlU2VuZCh0b2tlbiwgY29udGV4dCk7CiAgICB9CiAgfQoKICBUb2tlbiBwYXJzZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uT3JGdW5jdGlvbkxpdGVyYWwoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCcoJywgbmV4dCkpOwogICAgVG9rZW4gbmV4dFRva2VuID0gbmV4dC5lbmRHcm91cC5uZXh0OwogICAgaW50IGtpbmQgPSBuZXh0VG9rZW4ua2luZDsKICAgIGlmIChtYXlQYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbnMpIHsKICAgICAgaWYgKChpZGVudGljYWwoa2luZCwgRlVOQ1RJT05fVE9LRU4pIHx8CiAgICAgICAgICBpZGVudGljYWwoa2luZCwgT1BFTl9DVVJMWV9CUkFDS0VUX1RPS0VOKSkpIHsKICAgICAgICBsaXN0ZW5lci5oYW5kbGVOb1R5cGVWYXJpYWJsZXMobmV4dCk7CiAgICAgICAgcmV0dXJuIHBhcnNlRnVuY3Rpb25FeHByZXNzaW9uKHRva2VuKTsKICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwoa2luZCwgS0VZV09SRF9UT0tFTikgfHwKICAgICAgICAgIGlkZW50aWNhbChraW5kLCBJREVOVElGSUVSX1RPS0VOKSkgewogICAgICAgIGlmIChvcHRpb25hbCgnYXN5bmMnLCBuZXh0VG9rZW4pIHx8IG9wdGlvbmFsKCdzeW5jJywgbmV4dFRva2VuKSkgewogICAgICAgICAgbGlzdGVuZXIuaGFuZGxlTm9UeXBlVmFyaWFibGVzKG5leHQpOwogICAgICAgICAgcmV0dXJuIHBhcnNlRnVuY3Rpb25FeHByZXNzaW9uKHRva2VuKTsKICAgICAgICB9CiAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHN0cmF5IHNpbXBsZSBpZGVudGlmaWVyIGluIHRoZSBmdW5jdGlvbiBleHByZXNzaW9uCiAgICAgICAgLy8gYmVjYXVzZSB0aGUgdXNlciBpcyB0eXBpbmcgKGUuZy4gYCgpIGFzeSB7fWApIHRoZW4gY29udGludWUgcGFyc2luZwogICAgICAgIC8vIGFuZCBhbGxvdyBwYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbiB0byByZXBvcnQgYW4gdW5leHBlY3RlZCB0b2tlbi4KICAgICAgICBraW5kID0gbmV4dFRva2VuLm5leHQua2luZDsKICAgICAgICBpZiAoKGlkZW50aWNhbChraW5kLCBGVU5DVElPTl9UT0tFTikgfHwKICAgICAgICAgICAgaWRlbnRpY2FsKGtpbmQsIE9QRU5fQ1VSTFlfQlJBQ0tFVF9UT0tFTikpKSB7CiAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVOb1R5cGVWYXJpYWJsZXMobmV4dCk7CiAgICAgICAgICByZXR1cm4gcGFyc2VGdW5jdGlvbkV4cHJlc3Npb24odG9rZW4pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYm9vbCBvbGQgPSBtYXlQYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbnM7CiAgICBtYXlQYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbnMgPSB0cnVlOwogICAgdG9rZW4gPSBwYXJzZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKHRva2VuKTsKICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IG9sZDsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIGVuc3VyZVBhcmVudGhlc2l6ZWRDb25kaXRpb24oVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG9wZW5QYXJlbiA9IHRva2VuLm5leHQ7CiAgICBpZiAoIW9wdGlvbmFsKCcoJywgb3BlblBhcmVuKSkgewogICAgICAvLyBSZWNvdmVyCiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBvcGVuUGFyZW4sIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRUb2tlbi53aXRoQXJndW1lbnRzKCcoJykpOwogICAgICBvcGVuUGFyZW4gPSByZXdyaXRlci5pbnNlcnRQYXJlbnModG9rZW4sIGZhbHNlKTsKICAgIH0KICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uSW5QYXJlbnRoZXNpc1Jlc3Qob3BlblBhcmVuKTsKICAgIGxpc3RlbmVyLmhhbmRsZVBhcmVudGhlc2l6ZWRDb25kaXRpb24ob3BlblBhcmVuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlUGFyZW50aGVzaXplZEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIGJlZ2luID0gdG9rZW4ubmV4dDsKICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uSW5QYXJlbnRoZXNpcyh0b2tlbik7CiAgICBsaXN0ZW5lci5oYW5kbGVQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihiZWdpbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZUV4cHJlc3Npb25JblBhcmVudGhlc2lzKFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uSW5QYXJlbnRoZXNpc1Jlc3QodG9rZW4ubmV4dCk7CiAgfQoKICBUb2tlbiBwYXJzZUV4cHJlc3Npb25JblBhcmVudGhlc2lzUmVzdChUb2tlbiB0b2tlbikgewogICAgYXNzZXJ0KG9wdGlvbmFsKCcoJywgdG9rZW4pKTsKICAgIEJlZ2luVG9rZW4gYmVnaW4gPSB0b2tlbjsKICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uKHRva2VuKTsKICAgIHRva2VuID0gZW5zdXJlQ2xvc2VQYXJlbih0b2tlbiwgYmVnaW4pOwogICAgYXNzZXJ0KG9wdGlvbmFsKCcpJywgdG9rZW4pKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlVGhpc0V4cHJlc3Npb24oVG9rZW4gdG9rZW4sIElkZW50aWZpZXJDb250ZXh0IGNvbnRleHQpIHsKICAgIFRva2VuIHRoaXNUb2tlbiA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgndGhpcycsIHRoaXNUb2tlbikpOwogICAgbGlzdGVuZXIuaGFuZGxlVGhpc0V4cHJlc3Npb24odGhpc1Rva2VuLCBjb250ZXh0KTsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCcoJywgbmV4dCkpIHsKICAgICAgLy8gQ29uc3RydWN0b3IgZm9yd2FyZGluZy4KICAgICAgbGlzdGVuZXIuaGFuZGxlTm9UeXBlQXJndW1lbnRzKG5leHQpOwogICAgICB0b2tlbiA9IHBhcnNlQXJndW1lbnRzKHRva2VuKTsKICAgICAgbGlzdGVuZXIuaGFuZGxlU2VuZCh0aGlzVG9rZW4sIHRva2VuLm5leHQpOwogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VTdXBlckV4cHJlc3Npb24oVG9rZW4gdG9rZW4sIElkZW50aWZpZXJDb250ZXh0IGNvbnRleHQpIHsKICAgIFRva2VuIHN1cGVyVG9rZW4gPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ3N1cGVyJywgdG9rZW4pKTsKICAgIGxpc3RlbmVyLmhhbmRsZVN1cGVyRXhwcmVzc2lvbihzdXBlclRva2VuLCBjb250ZXh0KTsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCcoJywgbmV4dCkpIHsKICAgICAgLy8gU3VwZXIgY29uc3RydWN0b3IuCiAgICAgIGxpc3RlbmVyLmhhbmRsZU5vVHlwZUFyZ3VtZW50cyhuZXh0KTsKICAgICAgdG9rZW4gPSBwYXJzZUFyZ3VtZW50cyh0b2tlbik7CiAgICAgIGxpc3RlbmVyLmhhbmRsZVNlbmQoc3VwZXJUb2tlbiwgdG9rZW4ubmV4dCk7CiAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCI/LiIsIG5leHQpKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgZmFzdGEubWVzc2FnZVN1cGVyTnVsbEF3YXJlKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBUaGlzIG1ldGhvZCBwYXJzZXMgdGhlIHBvcnRpb24gb2YgYSBsaXN0IGxpdGVyYWwgc3RhcnRpbmcgd2l0aCB0aGUgbGVmdAogIC8vLyBzcXVhcmUgYnJhY2tldC4KICAvLy8KICAvLy8gYGBgCiAgLy8vIGxpc3RMaXRlcmFsOgogIC8vLyAgICdjb25zdCc/IHR5cGVBcmd1bWVudHM/ICdbJyAoZXhwcmVzc2lvbkxpc3QgJywnPyk/ICddJwogIC8vLyA7CiAgLy8vIGBgYAogIC8vLwogIC8vLyBQcm92aWRlIGEgW2NvbnN0S2V5d29yZF0gaWYgdGhlIGxpdGVyYWwgaXMgcHJlY2VkZWQgYnkgJ2NvbnN0Jywgb3IgYG51bGxgCiAgLy8vIGlmIG5vdC4gVGhpcyBpcyBhIHN1ZmZpeCBwYXJzZXIgYmVjYXVzZSBpdCBpcyBhc3N1bWVkIHRoYXQgdHlwZSBhcmd1bWVudHMKICAvLy8gaGF2ZSBiZWVuIHBhcnNlZCwgb3IgYGxpc3RlbmVyLmhhbmRsZU5vVHlwZUFyZ3VtZW50c2AgaGFzIGJlZW4gZXhlY3V0ZWQuCiAgVG9rZW4gcGFyc2VMaXRlcmFsTGlzdFN1ZmZpeChUb2tlbiB0b2tlbiwgVG9rZW4gY29uc3RLZXl3b3JkKSB7CiAgICBUb2tlbiBiZWZvcmVUb2tlbiA9IHRva2VuOwogICAgVG9rZW4gYmVnaW5Ub2tlbiA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnWycsIHRva2VuKSB8fCBvcHRpb25hbCgnW10nLCB0b2tlbikpOwogICAgaW50IGNvdW50ID0gMDsKICAgIGlmIChvcHRpb25hbCgnW10nLCB0b2tlbikpIHsKICAgICAgdG9rZW4gPSByZXdyaXRlU3F1YXJlQnJhY2tldHMoYmVmb3JlVG9rZW4pLm5leHQ7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUxpdGVyYWxMaXN0KDAsIHRva2VuLCBjb25zdEtleXdvcmQsIHRva2VuLm5leHQpOwogICAgICByZXR1cm4gdG9rZW4ubmV4dDsKICAgIH0KICAgIGJvb2wgb2xkID0gbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zOwogICAgbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zID0gdHJ1ZTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJ10nLCBuZXh0KSkgewogICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpbnQgaWZDb3VudCA9IDA7CiAgICAgIExpdGVyYWxFbnRyeUluZm8gaW5mbyA9IGNvbXB1dGVMaXRlcmFsRW50cnkodG9rZW4pOwogICAgICB3aGlsZSAoaW5mbyAhPSBudWxsKSB7CiAgICAgICAgaWYgKGluZm8uaGFzRW50cnkpIHsKICAgICAgICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uKHRva2VuKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdG9rZW4gPSBpbmZvLnBhcnNlKHRva2VuLCB0aGlzKTsKICAgICAgICB9CiAgICAgICAgaWZDb3VudCArPSBpbmZvLmlmQ29uZGl0aW9uRGVsdGE7CiAgICAgICAgaW5mbyA9IGluZm8uY29tcHV0ZU5leHQodG9rZW4pOwogICAgICB9CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICArK2NvdW50OwogICAgICBpZiAoIW9wdGlvbmFsKCcsJywgbmV4dCkpIHsKICAgICAgICBpZiAob3B0aW9uYWwoJ10nLCBuZXh0KSkgewogICAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgIGlmICghbG9va3NMaWtlTGl0ZXJhbEVudHJ5KG5leHQpKSB7CiAgICAgICAgICBpZiAoYmVnaW5Ub2tlbi5lbmRHcm91cC5pc1N5bnRoZXRpYykgewogICAgICAgICAgICAvLyBUaGUgc2Nhbm5lciBoYXMgYWxyZWFkeSByZXBvcnRlZCBhbiBlcnJvciwKICAgICAgICAgICAgLy8gYnV0IGluc2VydGVkIGBdYCBpbiB0aGUgd3JvbmcgcGxhY2UuCiAgICAgICAgICAgIHRva2VuID0gcmV3cml0ZXIubW92ZVN5bnRoZXRpYyh0b2tlbiwgYmVnaW5Ub2tlbi5lbmRHcm91cCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBSZXBvcnQgYW4gZXJyb3IgYW5kIGp1bXAgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICAgIG5leHQsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnXScpKTsKICAgICAgICAgICAgdG9rZW4gPSBiZWdpblRva2VuLmVuZEdyb3VwOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8vIFRoaXMgbG9va3MgbGlrZSB0aGUgc3RhcnQgb2YgYW4gZXhwcmVzc2lvbi4KICAgICAgICAvLyBSZXBvcnQgYW4gZXJyb3IsIGluc2VydCB0aGUgY29tbWEsIGFuZCBjb250aW51ZSBwYXJzaW5nLgogICAgICAgIHZhciBjb21tYSA9IG5ldyBTeW50aGV0aWNUb2tlbihUb2tlblR5cGUuQ09NTUEsIG5leHQub2Zmc2V0KTsKICAgICAgICB2YXIgbWVzc2FnZSA9IGlmQ291bnQgPiAwCiAgICAgICAgICAgID8gZmFzdGEubWVzc2FnZUV4cGVjdGVkRWxzZU9yQ29tbWEKICAgICAgICAgICAgOiBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQnV0R290LndpdGhBcmd1bWVudHMoJywnKTsKICAgICAgICBuZXh0ID0gcmV3cml0ZUFuZFJlY292ZXIodG9rZW4sIG1lc3NhZ2UsIGNvbW1hKTsKICAgICAgfQogICAgICB0b2tlbiA9IG5leHQ7CiAgICB9CiAgICBtYXlQYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbnMgPSBvbGQ7CiAgICBsaXN0ZW5lci5oYW5kbGVMaXRlcmFsTGlzdChjb3VudCwgYmVnaW5Ub2tlbiwgY29uc3RLZXl3b3JkLCB0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gVGhpcyBtZXRob2QgcGFyc2VzIHRoZSBwb3J0aW9uIG9mIGEgc2V0IG9yIG1hcCBsaXRlcmFsIHRoYXQgc3RhcnRzIHdpdGgKICAvLy8gdGhlIGxlZnQgY3VybHkgYnJhY2Ugd2hlbiB0aGVyZSBhcmUgbm8gbGVhZGluZyB0eXBlIGFyZ3VtZW50cy4KICBUb2tlbiBwYXJzZUxpdGVyYWxTZXRPck1hcFN1ZmZpeChUb2tlbiB0b2tlbiwgVG9rZW4gY29uc3RLZXl3b3JkKSB7CiAgICBUb2tlbiBsZWZ0QnJhY2UgPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ3snLCBsZWZ0QnJhY2UpKTsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCd9JywgbmV4dCkpIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlTGl0ZXJhbFNldE9yTWFwKDAsIGxlZnRCcmFjZSwgY29uc3RLZXl3b3JkLCBuZXh0LCBmYWxzZSk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQoKICAgIGZpbmFsIG9sZCA9IG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9uczsKICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IHRydWU7CiAgICBpbnQgY291bnQgPSAwOwogICAgLy8gVE9ETyhkYW5ydWJlbCk6IGhhc1NldEVudHJ5IHBhcmFtZXRlciBleGlzdHMgZm9yIHJlcGxpY2F0aW5nIGV4aXN0aW5nCiAgICAvLyBiZWhhdmlvciBhbmQgd2lsbCBiZSByZW1vdmVkIG9uY2UgdW5pZmllZCBjb2xsZWN0aW9uIGhhcyBiZWVuIGVuYWJsZWQKICAgIGJvb2wgaGFzU2V0RW50cnk7CgogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaW50IGlmQ291bnQgPSAwOwogICAgICBMaXRlcmFsRW50cnlJbmZvIGluZm8gPSBjb21wdXRlTGl0ZXJhbEVudHJ5KHRva2VuKTsKICAgICAgaWYgKGluZm8gPT0gc2ltcGxlRW50cnkpIHsKICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogUmVtb3ZlIHRoaXMgc2VjdGlvbiBhbmQgdXNlIHRoZSB3aGlsZSBsb29wIGJlbG93CiAgICAgICAgLy8gb25jZSBoYXNTZXRFbnRyeSBpcyBubyBsb25nZXIgbmVlZGVkLgogICAgICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uKHRva2VuKTsKICAgICAgICB2YXIgaXNNYXBFbnRyeSA9IG9wdGlvbmFsKCc6JywgdG9rZW4ubmV4dCk7CiAgICAgICAgaGFzU2V0RW50cnkgPz89ICFpc01hcEVudHJ5OwogICAgICAgIGlmIChpc01hcEVudHJ5KSB7CiAgICAgICAgICBUb2tlbiBjb2xvbiA9IHRva2VuLm5leHQ7CiAgICAgICAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvbihjb2xvbik7CiAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVMaXRlcmFsTWFwRW50cnkoY29sb24sIHRva2VuLm5leHQpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB3aGlsZSAoaW5mbyAhPSBudWxsKSB7CiAgICAgICAgICBpZiAoaW5mby5oYXNFbnRyeSkgewogICAgICAgICAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvbih0b2tlbik7CiAgICAgICAgICAgIGlmIChvcHRpb25hbCgnOicsIHRva2VuLm5leHQpKSB7CiAgICAgICAgICAgICAgVG9rZW4gY29sb24gPSB0b2tlbi5uZXh0OwogICAgICAgICAgICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uKGNvbG9uKTsKICAgICAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVMaXRlcmFsTWFwRW50cnkoY29sb24sIHRva2VuLm5leHQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0b2tlbiA9IGluZm8ucGFyc2UodG9rZW4sIHRoaXMpOwogICAgICAgICAgfQogICAgICAgICAgaWZDb3VudCArPSBpbmZvLmlmQ29uZGl0aW9uRGVsdGE7CiAgICAgICAgICBpbmZvID0gaW5mby5jb21wdXRlTmV4dCh0b2tlbik7CiAgICAgICAgfQogICAgICB9CiAgICAgICsrY291bnQ7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwoKICAgICAgVG9rZW4gY29tbWE7CiAgICAgIGlmIChvcHRpb25hbCgnLCcsIG5leHQpKSB7CiAgICAgICAgY29tbWEgPSB0b2tlbiA9IG5leHQ7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIH0KICAgICAgaWYgKG9wdGlvbmFsKCd9JywgbmV4dCkpIHsKICAgICAgICBsaXN0ZW5lci5oYW5kbGVMaXRlcmFsU2V0T3JNYXAoCiAgICAgICAgICAgIGNvdW50LCBsZWZ0QnJhY2UsIGNvbnN0S2V5d29yZCwgbmV4dCwgaGFzU2V0RW50cnkgPz8gZmFsc2UpOwogICAgICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IG9sZDsKICAgICAgICByZXR1cm4gbmV4dDsKICAgICAgfQoKICAgICAgaWYgKGNvbW1hID09IG51bGwpIHsKICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgIGlmIChsb29rc0xpa2VMaXRlcmFsRW50cnkobmV4dCkpIHsKICAgICAgICAgIC8vIElmIHRoaXMgbG9va3MgbGlrZSB0aGUgc3RhcnQgb2YgYW4gZXhwcmVzc2lvbiwKICAgICAgICAgIC8vIHRoZW4gcmVwb3J0IGFuIGVycm9yLCBpbnNlcnQgdGhlIGNvbW1hLCBhbmQgY29udGludWUgcGFyc2luZy4KICAgICAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBDb25zaWRlciBiZXR0ZXIgZXJyb3IgbWVzc2FnZQogICAgICAgICAgdmFyIGNvbW1hID0gbmV3IFN5bnRoZXRpY1Rva2VuKFRva2VuVHlwZS5DT01NQSwgbmV4dC5vZmZzZXQpOwogICAgICAgICAgdmFyIG1lc3NhZ2UgPSBpZkNvdW50ID4gMAogICAgICAgICAgICAgID8gZmFzdGEubWVzc2FnZUV4cGVjdGVkRWxzZU9yQ29tbWEKICAgICAgICAgICAgICA6IGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnLCcpOwogICAgICAgICAgdG9rZW4gPSByZXdyaXRlQW5kUmVjb3Zlcih0b2tlbiwgbWVzc2FnZSwgY29tbWEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgIG5leHQsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnfScpKTsKICAgICAgICAgIC8vIFNjYW5uZXIgZ3VhcmFudGVlcyBhIGNsb3NpbmcgY3VybHkgYnJhY2tldAogICAgICAgICAgbmV4dCA9IGxlZnRCcmFjZS5lbmRHcm91cDsKICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZUxpdGVyYWxTZXRPck1hcCgKICAgICAgICAgICAgICBjb3VudCwgbGVmdEJyYWNlLCBjb25zdEtleXdvcmQsIG5leHQsIGhhc1NldEVudHJ5ID8/IGZhbHNlKTsKICAgICAgICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IG9sZDsKICAgICAgICAgIHJldHVybiBuZXh0OwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLy8vIGZvcm1hbFBhcmFtZXRlckxpc3QgZnVuY3Rpb25Cb2R5LgogIC8vLwogIC8vLyBUaGlzIGlzIGEgc3VmZml4IHBhcnNlciBiZWNhdXNlIGl0IGlzIGFzc3VtZWQgdGhhdCB0eXBlIGFyZ3VtZW50cyBoYXZlCiAgLy8vIGJlZW4gcGFyc2VkLCBvciBgbGlzdGVuZXIuaGFuZGxlTm9UeXBlQXJndW1lbnRzKC4uKWAgaGFzIGJlZW4gZXhlY3V0ZWQuCiAgVG9rZW4gcGFyc2VMaXRlcmFsRnVuY3Rpb25TdWZmaXgoVG9rZW4gdG9rZW4pIHsKICAgIGFzc2VydChvcHRpb25hbCgnKCcsIHRva2VuLm5leHQpKTsKICAgIC8vIFNjYW5uZXIgZW5zdXJlcyBgKGAgaGFzIG1hdGNoaW5nIGApYC4KICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0LmVuZEdyb3VwLm5leHQ7CiAgICBpbnQga2luZCA9IG5leHQua2luZDsKICAgIGlmICghaWRlbnRpY2FsKGtpbmQsIEZVTkNUSU9OX1RPS0VOKSAmJgogICAgICAgICFpZGVudGljYWwoa2luZCwgT1BFTl9DVVJMWV9CUkFDS0VUX1RPS0VOKSAmJgogICAgICAgICghaWRlbnRpY2FsKGtpbmQsIEtFWVdPUkRfVE9LRU4pIHx8CiAgICAgICAgICAgICFvcHRpb25hbCgnYXN5bmMnLCBuZXh0KSAmJiAhb3B0aW9uYWwoJ3N5bmMnLCBuZXh0KSkpIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbihuZXh0LCBmYXN0YS50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbik7CiAgICB9CiAgICByZXR1cm4gcGFyc2VGdW5jdGlvbkV4cHJlc3Npb24odG9rZW4pOwogIH0KCiAgLy8vIGdlbmVyaWNMaXN0TGl0ZXJhbCB8IGdlbmVyaWNNYXBMaXRlcmFsIHwgZ2VuZXJpY0Z1bmN0aW9uTGl0ZXJhbC4KICAvLy8KICAvLy8gV2hlcmUKICAvLy8gICBnZW5lcmljTGlzdExpdGVyYWwgOjo9IHR5cGVBcmd1bWVudHMgJ1snIChleHByZXNzaW9uTGlzdCAnLCc/KT8gJ10nCiAgLy8vICAgZ2VuZXJpY01hcExpdGVyYWwgOjo9CiAgLy8vICAgICAgIHR5cGVBcmd1bWVudHMgJ3snIChtYXBMaXRlcmFsRW50cnkgKCcsJyBtYXBMaXRlcmFsRW50cnkpKiAnLCc/KT8gJ30nCiAgLy8vICAgZ2VuZXJpY0Z1bmN0aW9uTGl0ZXJhbCA6Oj0KICAvLy8gICAgICAgdHlwZVBhcmFtZXRlcnMgZm9ybWFsUGFyYW1ldGVyTGlzdCBmdW5jdGlvbkJvZHkKICAvLy8gUHJvdmlkZSB0b2tlbiBmb3IgW2NvbnN0S2V5d29yZF0gaWYgcHJlY2VkZWQgYnkgJ2NvbnN0JywgbnVsbCBpZiBub3QuCiAgVG9rZW4gcGFyc2VMaXRlcmFsTGlzdFNldE1hcE9yRnVuY3Rpb24oCiAgICAgIGZpbmFsIFRva2VuIHN0YXJ0LCBUb2tlbiBjb25zdEtleXdvcmQpIHsKICAgIGFzc2VydChvcHRpb25hbCgnPCcsIHN0YXJ0Lm5leHQpKTsKICAgIFR5cGVQYXJhbU9yQXJnSW5mbyB0eXBlUGFyYW1PckFyZyA9IGNvbXB1dGVUeXBlUGFyYW1PckFyZyhzdGFydCwgdHJ1ZSk7CiAgICBUb2tlbiB0b2tlbiA9IHR5cGVQYXJhbU9yQXJnLnNraXAoc3RhcnQpOwogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJygnLCBuZXh0KSkgewogICAgICBpZiAoY29uc3RLZXl3b3JkICE9IG51bGwpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgICBjb25zdEtleXdvcmQsIGZhc3RhLnRlbXBsYXRlVW5leHBlY3RlZFRva2VuKTsKICAgICAgfQogICAgICB0b2tlbiA9IHR5cGVQYXJhbU9yQXJnLnBhcnNlVmFyaWFibGVzKHN0YXJ0LCB0aGlzKTsKICAgICAgcmV0dXJuIHBhcnNlTGl0ZXJhbEZ1bmN0aW9uU3VmZml4KHRva2VuKTsKICAgIH0KICAgIHRva2VuID0gdHlwZVBhcmFtT3JBcmcucGFyc2VBcmd1bWVudHMoc3RhcnQsIHRoaXMpOwogICAgaWYgKG9wdGlvbmFsKCd7JywgbmV4dCkpIHsKICAgICAgaWYgKHR5cGVQYXJhbU9yQXJnLnR5cGVBcmd1bWVudENvdW50ID4gMikgewogICAgICAgIC8vIFRPRE8oZGFucnViZWwpOiByZW1vdmUgY29kZSBpbiBsaXN0ZW5lcnMgd2hpY2ggcmVwb3J0IHRoaXMgZXJyb3IKICAgICAgICBsaXN0ZW5lci5oYW5kbGVSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICBmYXN0YS5tZXNzYWdlU2V0T3JNYXBMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHMsCiAgICAgICAgICAgIHN0YXJ0Lm5leHQsCiAgICAgICAgICAgIHRva2VuKTsKICAgICAgfQogICAgICByZXR1cm4gcGFyc2VMaXRlcmFsU2V0T3JNYXBTdWZmaXgodG9rZW4sIGNvbnN0S2V5d29yZCk7CiAgICB9CiAgICBpZiAoIW9wdGlvbmFsKCdbJywgbmV4dCkgJiYgIW9wdGlvbmFsKCdbXScsIG5leHQpKSB7CiAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBJbXByb3ZlIHRoaXMgZXJyb3IgbWVzc2FnZS4KICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIG5leHQsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnWycpKTsKICAgICAgcmV3cml0ZXIuaW5zZXJ0VG9rZW4oCiAgICAgICAgICB0b2tlbiwgbmV3IFN5bnRoZXRpY1Rva2VuKFRva2VuVHlwZS5JTkRFWCwgbmV4dC5jaGFyT2Zmc2V0KSk7CiAgICB9CiAgICByZXR1cm4gcGFyc2VMaXRlcmFsTGlzdFN1ZmZpeCh0b2tlbiwgY29uc3RLZXl3b3JkKTsKICB9CgogIC8vLyBgYGAKICAvLy8gbWFwTGl0ZXJhbEVudHJ5OgogIC8vLyAgIGV4cHJlc3Npb24gJzonIGV4cHJlc3Npb24gfAogIC8vLyAgICdpZicgJygnIGV4cHJlc3Npb24gJyknIG1hcExpdGVyYWxFbnRyeSAoICdlbHNlJyBtYXBMaXRlcmFsRW50cnkgKT8gfAogIC8vLyAgICdhd2FpdCc/ICdmb3InICcoJyBmb3JMb29wUGFydHMgJyknIG1hcExpdGVyYWxFbnRyeSB8CiAgLy8vICAgKCAnLi4uJyB8ICcuLi4/JyApIGV4cHJlc3Npb24KICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZU1hcExpdGVyYWxFbnRyeShUb2tlbiB0b2tlbikgewogICAgLy8gQXNzdW1lIHRoZSBsaXN0ZW5lciByZWplY3RzIG5vbi1zdHJpbmcga2V5cy4KICAgIC8vIFRPRE8oYnJpYW53aWxrZXJzb24pOiBDaGFuZ2UgdGhlIGFzc3VtcHRpb24gYWJvdmUgYnkgbW92aW5nIGVycm9yCiAgICAvLyBjaGVja2luZyBpbnRvIHRoZSBwYXJzZXIsIG1ha2luZyBpdCBwb3NzaWJsZSB0byByZWNvdmVyLgogICAgTGl0ZXJhbEVudHJ5SW5mbyBpbmZvID0gY29tcHV0ZUxpdGVyYWxFbnRyeSh0b2tlbik7CiAgICB3aGlsZSAoaW5mbyAhPSBudWxsKSB7CiAgICAgIGlmIChpbmZvLmhhc0VudHJ5KSB7CiAgICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24odG9rZW4pOwogICAgICAgIFRva2VuIGNvbG9uID0gZW5zdXJlQ29sb24odG9rZW4pOwogICAgICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uKGNvbG9uKTsKICAgICAgICAvLyBUT0RPIHJlbW92ZSB1bnVzZWQgMm5kIHBhcmFtZXRlcgogICAgICAgIGxpc3RlbmVyLmhhbmRsZUxpdGVyYWxNYXBFbnRyeShjb2xvbiwgdG9rZW4ubmV4dCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdG9rZW4gPSBpbmZvLnBhcnNlKHRva2VuLCB0aGlzKTsKICAgICAgfQogICAgICBpbmZvID0gaW5mby5jb21wdXRlTmV4dCh0b2tlbik7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZVNlbmRPckZ1bmN0aW9uTGl0ZXJhbChUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgaWYgKCFtYXlQYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbnMpIHsKICAgICAgcmV0dXJuIHBhcnNlU2VuZCh0b2tlbiwgY29udGV4dCk7CiAgICB9CiAgICBUeXBlSW5mbyB0eXBlSW5mbyA9IGNvbXB1dGVUeXBlKHRva2VuLCBmYWxzZSk7CiAgICBUb2tlbiBiZWZvcmVOYW1lID0gdHlwZUluZm8uc2tpcFR5cGUodG9rZW4pOwogICAgVG9rZW4gbmFtZSA9IGJlZm9yZU5hbWUubmV4dDsKICAgIGlmIChuYW1lLmlzSWRlbnRpZmllcikgewogICAgICBUeXBlUGFyYW1PckFyZ0luZm8gdHlwZVBhcmFtID0gY29tcHV0ZVR5cGVQYXJhbU9yQXJnKG5hbWUpOwogICAgICBUb2tlbiBuZXh0ID0gdHlwZVBhcmFtLnNraXAobmFtZSkubmV4dDsKICAgICAgaWYgKG9wdGlvbmFsKCcoJywgbmV4dCkpIHsKICAgICAgICBpZiAobG9va3NMaWtlRnVuY3Rpb25Cb2R5KG5leHQuZW5kR3JvdXAubmV4dCkpIHsKICAgICAgICAgIHJldHVybiBwYXJzZUZ1bmN0aW9uTGl0ZXJhbCgKICAgICAgICAgICAgICB0b2tlbiwgYmVmb3JlTmFtZSwgbmFtZSwgdHlwZUluZm8sIHR5cGVQYXJhbSwgY29udGV4dCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcGFyc2VTZW5kKHRva2VuLCBjb250ZXh0KTsKICB9CgogIFRva2VuIGVuc3VyZUFyZ3VtZW50cyhUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAoIW9wdGlvbmFsKCcoJywgbmV4dCkpIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIHRva2VuLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQWZ0ZXJCdXRHb3Qud2l0aEFyZ3VtZW50cygnKCcpKTsKICAgICAgbmV4dCA9IHJld3JpdGVyLmluc2VydFBhcmVucyh0b2tlbiwgZmFsc2UpOwogICAgfQogICAgcmV0dXJuIHBhcnNlQXJndW1lbnRzUmVzdChuZXh0KTsKICB9CgogIFRva2VuIHBhcnNlQ29uc3RydWN0b3JJbnZvY2F0aW9uQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmICghb3B0aW9uYWwoJygnLCBuZXh0KSkgewogICAgICAvLyBSZWNvdmVyeTogQ2hlY2sgZm9yIGludmFsaWQgdHlwZSBwYXJhbWV0ZXJzCiAgICAgIFR5cGVQYXJhbU9yQXJnSW5mbyB0eXBlQXJnID0gY29tcHV0ZVR5cGVQYXJhbU9yQXJnKHRva2VuKTsKICAgICAgaWYgKHR5cGVBcmcgPT0gbm9UeXBlUGFyYW1PckFyZykgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgIHRva2VuLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQWZ0ZXJCdXRHb3Qud2l0aEFyZ3VtZW50cygnKCcpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICB0b2tlbiwgZmFzdGEubWVzc2FnZUNvbnN0cnVjdG9yV2l0aFR5cGVBcmd1bWVudHMpOwogICAgICAgIHRva2VuID0gdHlwZUFyZy5wYXJzZUFyZ3VtZW50cyh0b2tlbiwgdGhpcyk7CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlSW52YWxpZFR5cGVBcmd1bWVudHModG9rZW4pOwogICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICB9CiAgICAgIGlmICghb3B0aW9uYWwoJygnLCBuZXh0KSkgewogICAgICAgIG5leHQgPSByZXdyaXRlci5pbnNlcnRQYXJlbnModG9rZW4sIGZhbHNlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBhcnNlQXJndW1lbnRzUmVzdChuZXh0KTsKICB9CgogIC8vLyBgYGAKICAvLy8gbmV3RXhwcmVzc2lvbjoKICAvLy8gICAnbmV3JyB0eXBlICgnLicgaWRlbnRpZmllcik/IGFyZ3VtZW50cwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlTmV3RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV3S2V5d29yZCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ25ldycsIG5ld0tleXdvcmQpKTsKICAgIGxpc3RlbmVyLmJlZ2luTmV3RXhwcmVzc2lvbihuZXdLZXl3b3JkKTsKICAgIHRva2VuID0gcGFyc2VDb25zdHJ1Y3RvclJlZmVyZW5jZShuZXdLZXl3b3JkKTsKICAgIHRva2VuID0gcGFyc2VDb25zdHJ1Y3Rvckludm9jYXRpb25Bcmd1bWVudHModG9rZW4pOwogICAgbGlzdGVuZXIuZW5kTmV3RXhwcmVzc2lvbihuZXdLZXl3b3JkKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb24oCiAgICAgIFRva2VuIHRva2VuLCBUeXBlUGFyYW1PckFyZ0luZm8gdHlwZUFyZykgewogICAgVG9rZW4gYmVnaW4gPSB0b2tlbjsKICAgIGxpc3RlbmVyLmJlZ2luSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb24odG9rZW4pOwogICAgdG9rZW4gPSBwYXJzZUNvbnN0cnVjdG9yUmVmZXJlbmNlKHRva2VuLCB0eXBlQXJnKTsKICAgIHRva2VuID0gcGFyc2VDb25zdHJ1Y3Rvckludm9jYXRpb25Bcmd1bWVudHModG9rZW4pOwogICAgbGlzdGVuZXIuZW5kSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb24oYmVnaW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFRoaXMgbWV0aG9kIHBhcnNlcyBhIGxpc3Qgb3IgbWFwIGxpdGVyYWwgdGhhdCBpcyBrbm93biB0byBzdGFydCB3aXRoIHRoZQogIC8vLyBrZXl3b3JkICdjb25zdCcuCiAgLy8vCiAgLy8vIGBgYAogIC8vLyBsaXN0TGl0ZXJhbDoKICAvLy8gICAnY29uc3QnPyB0eXBlQXJndW1lbnRzPyAnWycgKGV4cHJlc3Npb25MaXN0ICcsJz8pPyAnXScKICAvLy8gOwogIC8vLwogIC8vLyBtYXBMaXRlcmFsOgogIC8vLyAgICdjb25zdCc/IHR5cGVBcmd1bWVudHM/ICd7JyAobWFwTGl0ZXJhbEVudHJ5ICgnLCcgbWFwTGl0ZXJhbEVudHJ5KSogJywnPyk/ICd9JwogIC8vLyA7CiAgLy8vCiAgLy8vIG1hcExpdGVyYWxFbnRyeToKICAvLy8gICBleHByZXNzaW9uICc6JyBleHByZXNzaW9uCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VDb25zdEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIGNvbnN0S2V5d29yZCA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnY29uc3QnLCBjb25zdEtleXdvcmQpKTsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgZmluYWwgU3RyaW5nIHZhbHVlID0gbmV4dC5zdHJpbmdWYWx1ZTsKICAgIGlmICgoaWRlbnRpY2FsKHZhbHVlLCAnWycpKSB8fCAoaWRlbnRpY2FsKHZhbHVlLCAnW10nKSkpIHsKICAgICAgbGlzdGVuZXIuYmVnaW5Db25zdExpdGVyYWwobmV4dCk7CiAgICAgIGxpc3RlbmVyLmhhbmRsZU5vVHlwZUFyZ3VtZW50cyhuZXh0KTsKICAgICAgdG9rZW4gPSBwYXJzZUxpdGVyYWxMaXN0U3VmZml4KHRva2VuLCBjb25zdEtleXdvcmQpOwogICAgICBsaXN0ZW5lci5lbmRDb25zdExpdGVyYWwodG9rZW4ubmV4dCk7CiAgICAgIHJldHVybiB0b2tlbjsKICAgIH0KICAgIGlmIChpZGVudGljYWwodmFsdWUsICd7JykpIHsKICAgICAgbGlzdGVuZXIuYmVnaW5Db25zdExpdGVyYWwobmV4dCk7CiAgICAgIGxpc3RlbmVyLmhhbmRsZU5vVHlwZUFyZ3VtZW50cyhuZXh0KTsKICAgICAgdG9rZW4gPSBwYXJzZUxpdGVyYWxTZXRPck1hcFN1ZmZpeCh0b2tlbiwgY29uc3RLZXl3b3JkKTsKICAgICAgbGlzdGVuZXIuZW5kQ29uc3RMaXRlcmFsKHRva2VuLm5leHQpOwogICAgICByZXR1cm4gdG9rZW47CiAgICB9CiAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnPCcpKSB7CiAgICAgIGxpc3RlbmVyLmJlZ2luQ29uc3RMaXRlcmFsKG5leHQpOwogICAgICB0b2tlbiA9IHBhcnNlTGl0ZXJhbExpc3RTZXRNYXBPckZ1bmN0aW9uKHRva2VuLCBjb25zdEtleXdvcmQpOwogICAgICBsaXN0ZW5lci5lbmRDb25zdExpdGVyYWwodG9rZW4ubmV4dCk7CiAgICAgIHJldHVybiB0b2tlbjsKICAgIH0KICAgIGxpc3RlbmVyLmJlZ2luQ29uc3RFeHByZXNzaW9uKGNvbnN0S2V5d29yZCk7CiAgICB0b2tlbiA9IHBhcnNlQ29uc3RydWN0b3JSZWZlcmVuY2UodG9rZW4pOwogICAgdG9rZW4gPSBwYXJzZUNvbnN0cnVjdG9ySW52b2NhdGlvbkFyZ3VtZW50cyh0b2tlbik7CiAgICBsaXN0ZW5lci5lbmRDb25zdEV4cHJlc3Npb24oY29uc3RLZXl3b3JkKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gaW50TGl0ZXJhbDoKICAvLy8gICBpbnRlZ2VyCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VMaXRlcmFsSW50KFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQoaWRlbnRpY2FsKHRva2VuLmtpbmQsIElOVF9UT0tFTikgfHwKICAgICAgICBpZGVudGljYWwodG9rZW4ua2luZCwgSEVYQURFQ0lNQUxfVE9LRU4pKTsKICAgIGxpc3RlbmVyLmhhbmRsZUxpdGVyYWxJbnQodG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyBkb3VibGVMaXRlcmFsOgogIC8vLyAgIGRvdWJsZQogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlTGl0ZXJhbERvdWJsZShUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWNhbCh0b2tlbi5raW5kLCBET1VCTEVfVE9LRU4pKTsKICAgIGxpc3RlbmVyLmhhbmRsZUxpdGVyYWxEb3VibGUodG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyBzdHJpbmdMaXRlcmFsOgogIC8vLyAgIChtdWx0aWxpbmVTdHJpbmcgfCBzaW5nbGVMaW5lU3RyaW5nKSsKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUxpdGVyYWxTdHJpbmcoVG9rZW4gdG9rZW4pIHsKICAgIGFzc2VydChpZGVudGljYWwodG9rZW4ubmV4dC5raW5kLCBTVFJJTkdfVE9LRU4pKTsKICAgIGJvb2wgb2xkID0gbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zOwogICAgbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zID0gdHJ1ZTsKICAgIHRva2VuID0gcGFyc2VTaW5nbGVMaXRlcmFsU3RyaW5nKHRva2VuKTsKICAgIGludCBjb3VudCA9IDE7CiAgICB3aGlsZSAoaWRlbnRpY2FsKHRva2VuLm5leHQua2luZCwgU1RSSU5HX1RPS0VOKSkgewogICAgICB0b2tlbiA9IHBhcnNlU2luZ2xlTGl0ZXJhbFN0cmluZyh0b2tlbik7CiAgICAgIGNvdW50Kys7CiAgICB9CiAgICBpZiAoY291bnQgPiAxKSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZVN0cmluZ0p1eHRhcG9zaXRpb24oY291bnQpOwogICAgfQogICAgbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zID0gb2xkOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyBzeW1ib2xMaXRlcmFsOgogIC8vLyAgICcjJyAob3BlcmF0b3IgfCAoaWRlbnRpZmllciAoJy4nIGlkZW50aWZpZXIpKikpCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VMaXRlcmFsU3ltYm9sKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBoYXNoVG9rZW4gPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJyMnLCBoYXNoVG9rZW4pKTsKICAgIGxpc3RlbmVyLmJlZ2luTGl0ZXJhbFN5bWJvbChoYXNoVG9rZW4pOwogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAobmV4dC5pc1VzZXJEZWZpbmFibGVPcGVyYXRvcikgewogICAgICBsaXN0ZW5lci5oYW5kbGVPcGVyYXRvcihuZXh0KTsKICAgICAgbGlzdGVuZXIuZW5kTGl0ZXJhbFN5bWJvbChoYXNoVG9rZW4sIDEpOwogICAgICByZXR1cm4gbmV4dDsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ3ZvaWQnLCBuZXh0KSkgewogICAgICBsaXN0ZW5lci5oYW5kbGVTeW1ib2xWb2lkKG5leHQpOwogICAgICBsaXN0ZW5lci5lbmRMaXRlcmFsU3ltYm9sKGhhc2hUb2tlbiwgMSk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfSBlbHNlIHsKICAgICAgaW50IGNvdW50ID0gMTsKICAgICAgdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5saXRlcmFsU3ltYm9sKTsKICAgICAgd2hpbGUgKG9wdGlvbmFsKCcuJywgdG9rZW4ubmV4dCkpIHsKICAgICAgICBjb3VudCsrOwogICAgICAgIHRva2VuID0gZW5zdXJlSWRlbnRpZmllcigKICAgICAgICAgICAgdG9rZW4ubmV4dCwgSWRlbnRpZmllckNvbnRleHQubGl0ZXJhbFN5bWJvbENvbnRpbnVhdGlvbik7CiAgICAgIH0KICAgICAgbGlzdGVuZXIuZW5kTGl0ZXJhbFN5bWJvbChoYXNoVG9rZW4sIGNvdW50KTsKICAgICAgcmV0dXJuIHRva2VuOwogICAgfQogIH0KCiAgVG9rZW4gcGFyc2VTaW5nbGVMaXRlcmFsU3RyaW5nKFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQoaWRlbnRpY2FsKHRva2VuLmtpbmQsIFNUUklOR19UT0tFTikpOwogICAgbGlzdGVuZXIuYmVnaW5MaXRlcmFsU3RyaW5nKHRva2VuKTsKICAgIC8vIFBhcnNpbmcgdGhlIHByZWZpeCwgZm9yIGluc3RhbmNlICd4IG9mICd4JHtpZH15JHtpZH16JwogICAgaW50IGludGVycG9sYXRpb25Db3VudCA9IDA7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIHZhciBraW5kID0gbmV4dC5raW5kOwogICAgd2hpbGUgKGtpbmQgIT0gRU9GX1RPS0VOKSB7CiAgICAgIGlmIChpZGVudGljYWwoa2luZCwgU1RSSU5HX0lOVEVSUE9MQVRJT05fVE9LRU4pKSB7CiAgICAgICAgLy8gUGFyc2luZyAke2V4cHJlc3Npb259LgogICAgICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uKG5leHQpLm5leHQ7CiAgICAgICAgaWYgKCFvcHRpb25hbCgnfScsIHRva2VuKSkgewogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICB0b2tlbiwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCd9JykpOwogICAgICAgICAgdG9rZW4gPSBuZXh0LmVuZEdyb3VwOwogICAgICAgIH0KICAgICAgICBsaXN0ZW5lci5oYW5kbGVJbnRlcnBvbGF0aW9uRXhwcmVzc2lvbihuZXh0LCB0b2tlbik7CiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKGtpbmQsIFNUUklOR19JTlRFUlBPTEFUSU9OX0lERU5USUZJRVJfVE9LRU4pKSB7CiAgICAgICAgLy8gUGFyc2luZyAkaWRlbnRpZmllci4KICAgICAgICB0b2tlbiA9IHBhcnNlSWRlbnRpZmllckV4cHJlc3Npb24obmV4dCk7CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlSW50ZXJwb2xhdGlvbkV4cHJlc3Npb24obmV4dCwgbnVsbCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgKytpbnRlcnBvbGF0aW9uQ291bnQ7CiAgICAgIC8vIFBhcnNpbmcgdGhlIGluZml4L3N1ZmZpeCwgZm9yIGluc3RhbmNlIHkgYW5kIHonIG9mICd4JHtpZH15JHtpZH16JwogICAgICB0b2tlbiA9IHBhcnNlU3RyaW5nUGFydCh0b2tlbik7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBraW5kID0gbmV4dC5raW5kOwogICAgfQogICAgbGlzdGVuZXIuZW5kTGl0ZXJhbFN0cmluZyhpbnRlcnBvbGF0aW9uQ291bnQsIG5leHQpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VJZGVudGlmaWVyRXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAobmV4dC5raW5kID09IEtFWVdPUkRfVE9LRU4gJiYgaWRlbnRpY2FsKG5leHQuc3RyaW5nVmFsdWUsICJ0aGlzIikpIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlVGhpc0V4cHJlc3Npb24obmV4dCwgSWRlbnRpZmllckNvbnRleHQuZXhwcmVzc2lvbik7CiAgICAgIHJldHVybiBuZXh0OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHBhcnNlU2VuZCh0b2tlbiwgSWRlbnRpZmllckNvbnRleHQuZXhwcmVzc2lvbik7CiAgICB9CiAgfQoKICAvLy8gYGBgCiAgLy8vIGJvb2xlYW5MaXRlcmFsOgogIC8vLyAgICd0cnVlJyB8CiAgLy8vICAgJ2ZhbHNlJwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlTGl0ZXJhbEJvb2woVG9rZW4gdG9rZW4pIHsKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnZmFsc2UnLCB0b2tlbikgfHwgb3B0aW9uYWwoJ3RydWUnLCB0b2tlbikpOwogICAgbGlzdGVuZXIuaGFuZGxlTGl0ZXJhbEJvb2wodG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyBudWxsTGl0ZXJhbDoKICAvLy8gICAnbnVsbCcKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUxpdGVyYWxOdWxsKFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ251bGwnLCB0b2tlbikpOwogICAgbGlzdGVuZXIuaGFuZGxlTGl0ZXJhbE51bGwodG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VTZW5kKFRva2VuIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dCBjb250ZXh0KSB7CiAgICBUb2tlbiBiZWdpblRva2VuID0gdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKHRva2VuLCBjb250ZXh0KTsKICAgIFR5cGVQYXJhbU9yQXJnSW5mbyB0eXBlQXJnID0gY29tcHV0ZU1ldGhvZFR5cGVBcmd1bWVudHModG9rZW4pOwogICAgaWYgKHR5cGVBcmcgIT0gbm9UeXBlUGFyYW1PckFyZykgewogICAgICB0b2tlbiA9IHR5cGVBcmcucGFyc2VBcmd1bWVudHModG9rZW4sIHRoaXMpOwogICAgfSBlbHNlIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlTm9UeXBlQXJndW1lbnRzKHRva2VuLm5leHQpOwogICAgfQogICAgdG9rZW4gPSBwYXJzZUFyZ3VtZW50c09wdCh0b2tlbik7CiAgICBsaXN0ZW5lci5oYW5kbGVTZW5kKGJlZ2luVG9rZW4sIHRva2VuLm5leHQpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gc2tpcEFyZ3VtZW50c09wdChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBsaXN0ZW5lci5oYW5kbGVOb0FyZ3VtZW50cyhuZXh0KTsKICAgIGlmIChvcHRpb25hbCgnKCcsIG5leHQpKSB7CiAgICAgIHJldHVybiBuZXh0LmVuZEdyb3VwOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHRva2VuOwogICAgfQogIH0KCiAgVG9rZW4gcGFyc2VBcmd1bWVudHNPcHQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKCFvcHRpb25hbCgnKCcsIG5leHQpKSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZU5vQXJndW1lbnRzKG5leHQpOwogICAgICByZXR1cm4gdG9rZW47CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gcGFyc2VBcmd1bWVudHModG9rZW4pOwogICAgfQogIH0KCiAgLy8vIGBgYAogIC8vLyBhcmd1bWVudHM6CiAgLy8vICAgJygnIChhcmd1bWVudExpc3QgJywnPyk/ICcpJwogIC8vLyA7CiAgLy8vCiAgLy8vIGFyZ3VtZW50TGlzdDoKICAvLy8gICBuYW1lZEFyZ3VtZW50ICgnLCcgbmFtZWRBcmd1bWVudCkqIHwKICAvLy8gICBleHByZXNzaW9uTGlzdCAoJywnIG5hbWVkQXJndW1lbnQpKgogIC8vLyA7CiAgLy8vCiAgLy8vIG5hbWVkQXJndW1lbnQ6CiAgLy8vICAgbGFiZWwgZXhwcmVzc2lvbgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gcGFyc2VBcmd1bWVudHNSZXN0KHRva2VuLm5leHQpOwogIH0KCiAgVG9rZW4gcGFyc2VBcmd1bWVudHNSZXN0KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBiZWdpbiA9IHRva2VuOwogICAgYXNzZXJ0KG9wdGlvbmFsKCcoJywgYmVnaW4pKTsKICAgIGxpc3RlbmVyLmJlZ2luQXJndW1lbnRzKGJlZ2luKTsKICAgIGludCBhcmd1bWVudENvdW50ID0gMDsKICAgIGJvb2wgaGFzU2Vlbk5hbWVkQXJndW1lbnQgPSBmYWxzZTsKICAgIGJvb2wgb2xkID0gbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zOwogICAgbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zID0gdHJ1ZTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJyknLCBuZXh0KSkgewogICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBUb2tlbiBjb2xvbiA9IG51bGw7CiAgICAgIGlmIChvcHRpb25hbCgnOicsIG5leHQubmV4dCkpIHsKICAgICAgICB0b2tlbiA9CiAgICAgICAgICAgIGVuc3VyZUlkZW50aWZpZXIodG9rZW4sIElkZW50aWZpZXJDb250ZXh0Lm5hbWVkQXJndW1lbnRSZWZlcmVuY2UpCiAgICAgICAgICAgICAgICAubmV4dDsKICAgICAgICBjb2xvbiA9IHRva2VuOwogICAgICAgIGhhc1NlZW5OYW1lZEFyZ3VtZW50ID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChoYXNTZWVuTmFtZWRBcmd1bWVudCkgewogICAgICAgIC8vIFBvc2l0aW9uYWwgYXJndW1lbnQgYWZ0ZXIgbmFtZWQgYXJndW1lbnQuCiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBmYXN0YS5tZXNzYWdlUG9zaXRpb25hbEFmdGVyTmFtZWRBcmd1bWVudCk7CiAgICAgIH0KICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24odG9rZW4pOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKGNvbG9uICE9IG51bGwpIGxpc3RlbmVyLmhhbmRsZU5hbWVkQXJndW1lbnQoY29sb24pOwogICAgICArK2FyZ3VtZW50Q291bnQ7CiAgICAgIGlmICghb3B0aW9uYWwoJywnLCBuZXh0KSkgewogICAgICAgIGlmIChvcHRpb25hbCgnKScsIG5leHQpKSB7CiAgICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICBpZiAobG9va3NMaWtlRXhwcmVzc2lvblN0YXJ0KG5leHQpKSB7CiAgICAgICAgICAvLyBJZiB0aGlzIGxvb2tzIGxpa2UgdGhlIHN0YXJ0IG9mIGFuIGV4cHJlc3Npb24sCiAgICAgICAgICAvLyB0aGVuIHJlcG9ydCBhbiBlcnJvciwgaW5zZXJ0IHRoZSBjb21tYSwgYW5kIGNvbnRpbnVlIHBhcnNpbmcuCiAgICAgICAgICBuZXh0ID0gcmV3cml0ZUFuZFJlY292ZXIoCiAgICAgICAgICAgICAgdG9rZW4sCiAgICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCcsJyksCiAgICAgICAgICAgICAgbmV3IFN5bnRoZXRpY1Rva2VuKFRva2VuVHlwZS5DT01NQSwgbmV4dC5vZmZzZXQpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdG9rZW4gPSBlbnN1cmVDbG9zZVBhcmVuKHRva2VuLCBiZWdpbik7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgdG9rZW4gPSBuZXh0OwogICAgfQogICAgYXNzZXJ0KG9wdGlvbmFsKCcpJywgdG9rZW4pKTsKICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IG9sZDsKICAgIGxpc3RlbmVyLmVuZEFyZ3VtZW50cyhhcmd1bWVudENvdW50LCBiZWdpbiwgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyB0eXBlVGVzdDo6CiAgLy8vICAgJ2lzJyAnISc/IHR5cGUKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUlzT3BlcmF0b3JSZXN0KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBvcGVyYXRvciA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnaXMnLCBvcGVyYXRvcikpOwogICAgVG9rZW4gbm90ID0gbnVsbDsKICAgIGlmIChvcHRpb25hbCgnIScsIHRva2VuLm5leHQpKSB7CiAgICAgIG5vdCA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIH0KICAgIFR5cGVJbmZvIHR5cGVJbmZvID0gY29tcHV0ZVR5cGVBZnRlcklzT3JBcyh0b2tlbik7CiAgICB0b2tlbiA9IHR5cGVJbmZvLmVuc3VyZVR5cGVOb3RWb2lkKHRva2VuLCB0aGlzKTsKICAgIGxpc3RlbmVyLmhhbmRsZUlzT3BlcmF0b3Iob3BlcmF0b3IsIG5vdCk7CiAgICByZXR1cm4gc2tpcENoYWluZWRBc0lzT3BlcmF0b3JzKHRva2VuKTsKICB9CgogIFR5cGVJbmZvIGNvbXB1dGVUeXBlQWZ0ZXJJc09yQXMoVG9rZW4gdG9rZW4pIHsKICAgIFR5cGVJbmZvIHR5cGVJbmZvID0gY29tcHV0ZVR5cGUodG9rZW4sIHRydWUpOwogICAgaWYgKHR5cGVJbmZvLmlzTnVsbGFibGUpIHsKICAgICAgVG9rZW4gbmV4dCA9IHR5cGVJbmZvLnNraXBUeXBlKHRva2VuKS5uZXh0OwogICAgICBpZiAoIWlzT25lT2ZPckVvZihuZXh0LCBjb25zdCBbJyknLCAnPycsICc7JywgJ2lzJywgJ2FzJ10pKSB7CiAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IGludmVzdGlnYXRlIG90aGVyIHNpdHVhdGlvbnMKICAgICAgICAvLyB3aGVyZSBgP2Agc2hvdWxkIGJlIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgdHlwZSBpbmZvCiAgICAgICAgLy8gcmF0aGVyIHRoYW4gdGhlIHN0YXJ0IG9mIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbi4KICAgICAgICB0eXBlSW5mbyA9IHR5cGVJbmZvLmFzTm9uTnVsbGFibGU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0eXBlSW5mbzsKICB9CgogIC8vLyBgYGAKICAvLy8gdHlwZUNhc3Q6CiAgLy8vICAgJ2FzJyB0eXBlCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VBc09wZXJhdG9yUmVzdChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gb3BlcmF0b3IgPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2FzJywgb3BlcmF0b3IpKTsKICAgIFR5cGVJbmZvIHR5cGVJbmZvID0gY29tcHV0ZVR5cGVBZnRlcklzT3JBcyh0b2tlbik7CiAgICB0b2tlbiA9IHR5cGVJbmZvLmVuc3VyZVR5cGVOb3RWb2lkKHRva2VuLCB0aGlzKTsKICAgIGxpc3RlbmVyLmhhbmRsZUFzT3BlcmF0b3Iob3BlcmF0b3IpOwogICAgcmV0dXJuIHNraXBDaGFpbmVkQXNJc09wZXJhdG9ycyh0b2tlbik7CiAgfQoKICBUb2tlbiBza2lwQ2hhaW5lZEFzSXNPcGVyYXRvcnMoVG9rZW4gdG9rZW4pIHsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBTdHJpbmcgdmFsdWUgPSBuZXh0LnN0cmluZ1ZhbHVlOwogICAgICBpZiAoIWlkZW50aWNhbCh2YWx1ZSwgJ2lzJykgJiYgIWlkZW50aWNhbCh2YWx1ZSwgJ2FzJykpIHsKICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgIH0KICAgICAgLy8gVGhlIGlzLSBhbmQgYXMtb3BlcmF0b3JzIGNhbm5vdCBiZSBjaGFpbmVkLgogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogQ29uc2lkZXIgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZS4KICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbihuZXh0LCBmYXN0YS50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbik7CiAgICAgIGlmIChvcHRpb25hbCgnIScsIG5leHQubmV4dCkpIHsKICAgICAgICBuZXh0ID0gbmV4dC5uZXh0OwogICAgICB9CiAgICAgIFR5cGVJbmZvIHR5cGVJbmZvID0gY29tcHV0ZVR5cGVBZnRlcklzT3JBcyhuZXh0KTsKICAgICAgdG9rZW4gPSB0eXBlSW5mby5za2lwVHlwZShuZXh0KTsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIHZhbHVlID0gbmV4dC5zdHJpbmdWYWx1ZTsKICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgW3Rva2VuXSBjb3VsZCBiZSB0aGUgc3RhcnQgb2YgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbgogIC8vLyB3aXRob3V0IGEgcmV0dXJuIHR5cGUuCiAgYm9vbCBsb29rc0xpa2VMb2NhbEZ1bmN0aW9uKFRva2VuIHRva2VuKSB7CiAgICBpZiAodG9rZW4uaXNJZGVudGlmaWVyKSB7CiAgICAgIGlmIChvcHRpb25hbCgnPCcsIHRva2VuLm5leHQpKSB7CiAgICAgICAgVHlwZVBhcmFtT3JBcmdJbmZvIHR5cGVQYXJhbSA9IGNvbXB1dGVUeXBlUGFyYW1PckFyZyh0b2tlbik7CiAgICAgICAgaWYgKHR5cGVQYXJhbSA9PSBub1R5cGVQYXJhbU9yQXJnKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHRva2VuID0gdHlwZVBhcmFtLnNraXAodG9rZW4pOwogICAgICB9CiAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKG9wdGlvbmFsKCcoJywgdG9rZW4pKSB7CiAgICAgICAgdG9rZW4gPSB0b2tlbi5lbmRHcm91cC5uZXh0OwogICAgICAgIHJldHVybiBvcHRpb25hbCgneycsIHRva2VuKSB8fAogICAgICAgICAgICBvcHRpb25hbCgnPT4nLCB0b2tlbikgfHwKICAgICAgICAgICAgb3B0aW9uYWwoJ2FzeW5jJywgdG9rZW4pIHx8CiAgICAgICAgICAgIG9wdGlvbmFsKCdzeW5jJywgdG9rZW4pOwogICAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCc9PicsIHRva2VuKSkgewogICAgICAgIC8vIFJlY292ZXJ5OiBMb29rcyBsaWtlIGEgbG9jYWwgZnVuY3Rpb24gdGhhdCBpcyBtaXNzaW5nIHBhcmVudGhlc2lzLgogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLy8gUmV0dXJucyB0cnVlIGlmIFt0b2tlbl0gY291bGQgYmUgdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24gYm9keS4KICBib29sIGxvb2tzTGlrZUZ1bmN0aW9uQm9keShUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIG9wdGlvbmFsKCd7JywgdG9rZW4pIHx8CiAgICAgICAgb3B0aW9uYWwoJz0+JywgdG9rZW4pIHx8CiAgICAgICAgb3B0aW9uYWwoJ2FzeW5jJywgdG9rZW4pIHx8CiAgICAgICAgb3B0aW9uYWwoJ3N5bmMnLCB0b2tlbik7CiAgfQoKICBUb2tlbiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRPckNvbnN0RGVjbGFyYXRpb24oZmluYWwgVG9rZW4gc3RhcnQpIHsKICAgIFRva2VuIGNvbnN0VG9rZW4gPSBzdGFydC5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdjb25zdCcsIGNvbnN0VG9rZW4pKTsKICAgIGlmICghaXNNb2RpZmllcihjb25zdFRva2VuLm5leHQpKSB7CiAgICAgIFR5cGVJbmZvIHR5cGVJbmZvID0gY29tcHV0ZVR5cGUoY29uc3RUb2tlbiwgZmFsc2UpOwogICAgICBpZiAodHlwZUluZm8gPT0gbm9UeXBlKSB7CiAgICAgICAgVG9rZW4gbmV4dCA9IGNvbnN0VG9rZW4ubmV4dDsKICAgICAgICBpZiAoIW5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KHN0YXJ0KTsKICAgICAgICB9CiAgICAgICAgbmV4dCA9IG5leHQubmV4dDsKICAgICAgICBpZiAoIShvcHRpb25hbCgnPScsIG5leHQpIHx8CiAgICAgICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgICAgIG5leHQuaXNLZXl3b3JkT3JJZGVudGlmaWVyIHx8CiAgICAgICAgICAgIG9wdGlvbmFsKCc7JywgbmV4dCkgfHwKICAgICAgICAgICAgb3B0aW9uYWwoJywnLCBuZXh0KSB8fAogICAgICAgICAgICBvcHRpb25hbCgneycsIG5leHQpKSkgewogICAgICAgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudChzdGFydCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRPckRlY2xhcmF0aW9uQWZ0ZXJNb2RpZmllcnMoCiAgICAgICAgICBjb25zdFRva2VuLCBzdGFydCwgY29uc3RUb2tlbiwgdHlwZUluZm8pOwogICAgfQogICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudE9yRGVjbGFyYXRpb24oc3RhcnQpOwogIH0KCiAgLy8vIFRoaXMgbWV0aG9kIGhhcyB0d28gbW9kZXMgYmFzZWQgdXBvbiBbb25seVBhcnNlVmFyaWFibGVEZWNsYXJhdGlvblN0YXJ0XS4KICAvLy8KICAvLy8gSWYgW29ubHlQYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25TdGFydF0gaXMgYGZhbHNlYCAodGhlIGRlZmF1bHQpIHRoZW4gdGhpcwogIC8vLyBtZXRob2Qgd2lsbCBwYXJzZSBhIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uLCBhIGxvY2FsIGZ1bmN0aW9uLAogIC8vLyBvciBhbiBleHByZXNzaW9uIHN0YXRlbWVudCwgYW5kIHRoZW4gcmV0dXJuIHRoZSBsYXN0IGNvbnN1bWVkIHRva2VuLgogIC8vLwogIC8vLyBJZiBbb25seVBhcnNlVmFyaWFibGVEZWNsYXJhdGlvblN0YXJ0XSBpcyBgdHJ1ZWAgdGhlbiB0aGlzIG1ldGhvZAogIC8vLyB3aWxsIG9ubHkgcGFyc2UgdGhlIG1ldGFkYXRhLCBtb2RpZmllcnMsIGFuZCB0eXBlIG9mIGEgbG9jYWwgdmFyaWFibGUKICAvLy8gZGVjbGFyYXRpb24gaWYgaXQgZXhpc3RzLiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0bwogIC8vLyBjYWxsIFtwYXJzZVZhcmlhYmxlc0RlY2xhcmF0aW9uUmVzdF0gdG8gZmluaXNoIHBhcnNpbmcgdGhlIGxvY2FsIHZhcmlhYmxlCiAgLy8vIGRlY2xhcmF0aW9uLiBJZiBhIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGlzIG5vdCBmb3VuZCB0aGVuIHRoaXMKICAvLy8gbWV0aG9kIHdpbGwgcmV0dXJuIFtzdGFydF0uCiAgVG9rZW4gcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50T3JEZWNsYXJhdGlvbihmaW5hbCBUb2tlbiBzdGFydCwKICAgICAgW2Jvb2wgb25seVBhcnNlVmFyaWFibGVEZWNsYXJhdGlvblN0YXJ0ID0gZmFsc2VdKSB7CiAgICBUb2tlbiB0b2tlbiA9IHN0YXJ0OwogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJ0AnLCBuZXh0KSkgewogICAgICB0b2tlbiA9IHBhcnNlTWV0YWRhdGFTdGFyKHRva2VuKTsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICB9CgogICAgVG9rZW4gdmFyRmluYWxPckNvbnN0OwogICAgaWYgKGlzTW9kaWZpZXIobmV4dCkpIHsKICAgICAgaWYgKG9wdGlvbmFsKCd2YXInLCBuZXh0KSkgewogICAgICAgIHZhckZpbmFsT3JDb25zdCA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgfSBlbHNlIGlmIChvcHRpb25hbCgnZmluYWwnLCBuZXh0KSB8fCBvcHRpb25hbCgnY29uc3QnLCBuZXh0KSkgewogICAgICAgIHZhckZpbmFsT3JDb25zdCA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgfQoKICAgICAgaWYgKGlzTW9kaWZpZXIobmV4dCkpIHsKICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgIE1vZGlmaWVyUmVjb3ZlcnlDb250ZXh0IG1vZGlmaWVyQ29udGV4dCA9CiAgICAgICAgICAgIG5ldyBNb2RpZmllclJlY292ZXJ5Q29udGV4dCh0aGlzKTsKICAgICAgICB0b2tlbiA9IG1vZGlmaWVyQ29udGV4dC5wYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25Nb2RpZmllcnModG9rZW4sCiAgICAgICAgICAgIHZhckZpbmFsT3JDb25zdDogdmFyRmluYWxPckNvbnN0KTsKICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKCiAgICAgICAgdmFyRmluYWxPckNvbnN0ID0gbW9kaWZpZXJDb250ZXh0LnZhckZpbmFsT3JDb25zdDsKICAgICAgICBtb2RpZmllckNvbnRleHQgPSBudWxsOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudE9yRGVjbGFyYXRpb25BZnRlck1vZGlmaWVycygKICAgICAgICB0b2tlbiwgc3RhcnQsIHZhckZpbmFsT3JDb25zdCwgbnVsbCwgb25seVBhcnNlVmFyaWFibGVEZWNsYXJhdGlvblN0YXJ0KTsKICB9CgogIC8vLyBTZWUgW3BhcnNlRXhwcmVzc2lvblN0YXRlbWVudE9yRGVjbGFyYXRpb25dCiAgVG9rZW4gcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50T3JEZWNsYXJhdGlvbkFmdGVyTW9kaWZpZXJzKAogICAgICBmaW5hbCBUb2tlbiBiZWZvcmVUeXBlLCBmaW5hbCBUb2tlbiBzdGFydCwKICAgICAgW1Rva2VuIHZhckZpbmFsT3JDb25zdCA9IG51bGwsCiAgICAgIFR5cGVJbmZvIHR5cGVJbmZvLAogICAgICBib29sIG9ubHlQYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25TdGFydCA9IGZhbHNlXSkgewogICAgdHlwZUluZm8gPz89IGNvbXB1dGVUeXBlKGJlZm9yZVR5cGUsIGZhbHNlKTsKCiAgICBUb2tlbiB0b2tlbiA9IHR5cGVJbmZvLnNraXBUeXBlKGJlZm9yZVR5cGUpOwogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CgogICAgaWYgKCFvbmx5UGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uU3RhcnQpIHsKICAgICAgaWYgKGxvb2tzTGlrZUxvY2FsRnVuY3Rpb24obmV4dCkpIHsKICAgICAgICAvLyBQYXJzZSBhIGxvY2FsIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgogICAgICAgIGlmICh2YXJGaW5hbE9yQ29uc3QgIT0gbnVsbCkgewogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QsIGZhc3RhLnRlbXBsYXRlRXh0cmFuZW91c01vZGlmaWVyKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFvcHRpb25hbCgnQCcsIHN0YXJ0Lm5leHQpKSB7CiAgICAgICAgICBsaXN0ZW5lci5iZWdpbk1ldGFkYXRhU3RhcihzdGFydC5uZXh0KTsKICAgICAgICAgIGxpc3RlbmVyLmVuZE1ldGFkYXRhU3RhcigwKTsKICAgICAgICB9CiAgICAgICAgVG9rZW4gYmVmb3JlRm9ybWFscyA9CiAgICAgICAgICAgIGNvbXB1dGVUeXBlUGFyYW1PckFyZyhuZXh0KS5wYXJzZVZhcmlhYmxlcyhuZXh0LCB0aGlzKTsKICAgICAgICBsaXN0ZW5lci5iZWdpbkxvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbihzdGFydC5uZXh0KTsKICAgICAgICB0b2tlbiA9IHR5cGVJbmZvLnBhcnNlVHlwZShiZWZvcmVUeXBlLCB0aGlzKTsKICAgICAgICByZXR1cm4gcGFyc2VOYW1lZEZ1bmN0aW9uUmVzdCh0b2tlbiwgc3RhcnQubmV4dCwgYmVmb3JlRm9ybWFscywgZmFsc2UpOwogICAgICB9CiAgICB9CgogICAgaWYgKGJlZm9yZVR5cGUgPT0gc3RhcnQgJiYKICAgICAgICB0eXBlSW5mby5pc051bGxhYmxlICYmCiAgICAgICAgdHlwZUluZm8uY291bGRCZUV4cHJlc3Npb24pIHsKICAgICAgYXNzZXJ0KG9wdGlvbmFsKCc/JywgdG9rZW4pKTsKICAgICAgYXNzZXJ0KG5leHQuaXNJZGVudGlmaWVyKTsKICAgICAgVG9rZW4gYWZ0ZXJJZGVudGlmaWVyID0gbmV4dC5uZXh0OwogICAgICAvLwogICAgICAvLyBmb3VuZCA8dHlwZXJlZj4gYD9gIDxpZGVudGlmaWVyPgogICAgICAvLyB3aXRoIG5vIGFubm90YXRpb25zIG9yIG1vZGlmaWVycyBwcmVjZWVkaW5nIGl0CiAgICAgIC8vCiAgICAgIGlmIChvcHRpb25hbCgnPScsIGFmdGVySWRlbnRpZmllcikpIHsKICAgICAgICAvLwogICAgICAgIC8vIGxvb2sgcGFzdCB0aGUgbmV4dCBleHByZXNzaW9uCiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgcGFydCBvZiBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24KICAgICAgICAvLwogICAgICAgIGZpbmFsIG9yaWdpbmFsTGlzdGVuZXIgPSBsaXN0ZW5lcjsKICAgICAgICBsaXN0ZW5lciA9IG5ldyBGb3J3YXJkaW5nTGlzdGVuZXIoKTsKICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogY29uc2lkZXIgdXNpbmcgVG9rZW5TdHJlYW1HaG9zdFdyaXRlciBoZXJlCiAgICAgICAgVG9rZW4gYWZ0ZXJFeHByZXNzaW9uID0KICAgICAgICAgICAgcGFyc2VFeHByZXNzaW9uV2l0aG91dENhc2NhZGUoYWZ0ZXJJZGVudGlmaWVyKS5uZXh0OwogICAgICAgIGxpc3RlbmVyID0gb3JpZ2luYWxMaXN0ZW5lcjsKCiAgICAgICAgaWYgKG9wdGlvbmFsKCc6JywgYWZ0ZXJFeHByZXNzaW9uKSkgewogICAgICAgICAgLy8gTG9va3MgbGlrZSBwYXJ0IG9mIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbi4KICAgICAgICAgIC8vIERyb3AgdGhlIHR5cGUgaW5mb3JtYXRpb24gYW5kIHJlc2V0IHRoZSBsYXN0IGNvbnN1bWVkIHRva2VuLgogICAgICAgICAgdHlwZUluZm8gPSBub1R5cGU7CiAgICAgICAgICB0b2tlbiA9IHN0YXJ0OwogICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKCFhZnRlcklkZW50aWZpZXIuaXNLZXl3b3JkICYmCiAgICAgICAgICAhaXNPbmVPZk9yRW9mKGFmdGVySWRlbnRpZmllciwgY29uc3QgWyc7JywgJywnLCAnKSddKSkgewogICAgICAgIC8vIExvb2tzIGxpa2UgcGFydCBvZiBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCiAgICAgICAgLy8gRHJvcCB0aGUgdHlwZSBpbmZvcm1hdGlvbiBhbmQgcmVzZXQgdGhlIGxhc3QgY29uc3VtZWQgdG9rZW4uCiAgICAgICAgdHlwZUluZm8gPSBub1R5cGU7CiAgICAgICAgdG9rZW4gPSBzdGFydDsKICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgfQogICAgfQoKICAgIGlmICh0b2tlbiA9PSBzdGFydCkgewogICAgICAvLyBJZiBubyBhbm5vdGF0aW9uLCBtb2RpZmllciwgb3IgdHlwZSwgYW5kIHRoaXMgaXMgbm90IGEgbG9jYWwgZnVuY3Rpb24KICAgICAgLy8gdGhlbiB0aGlzIG11c3QgYmUgYW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnQuCiAgICAgIGlmIChvbmx5UGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uU3RhcnQpIHsKICAgICAgICByZXR1cm4gc3RhcnQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudChzdGFydCk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAobmV4dC50eXBlLmlzQnVpbHRJbiAmJgogICAgICAgIGJlZm9yZVR5cGUgPT0gc3RhcnQgJiYKICAgICAgICB0eXBlSW5mby5jb3VsZEJlRXhwcmVzc2lvbikgewogICAgICAvLyBEZXRlY3QgZXhwcmVzc2lvbnMgc3VjaCBhcyBpZGVudGlmaWVyIGBhc2AgaWRlbnRpZmllcgogICAgICAvLyBhbmQgdHJlYXQgdGhvc2UgYXMgZXhwcmVzc2lvbnMuCiAgICAgIGlmIChvcHRpb25hbCgnYXMnLCBuZXh0KSB8fCBvcHRpb25hbCgnaXMnLCBuZXh0KSkgewogICAgICAgIGludCBraW5kID0gbmV4dC5uZXh0LmtpbmQ7CiAgICAgICAgaWYgKEVRX1RPS0VOICE9IGtpbmQgJiYKICAgICAgICAgICAgU0VNSUNPTE9OX1RPS0VOICE9IGtpbmQgJiYKICAgICAgICAgICAgQ09NTUFfVE9LRU4gIT0ga2luZCkgewogICAgICAgICAgaWYgKG9ubHlQYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25TdGFydCkgewogICAgICAgICAgICBpZiAoIW9wdGlvbmFsKCdpbicsIG5leHQubmV4dCkpIHsKICAgICAgICAgICAgICByZXR1cm4gc3RhcnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQoc3RhcnQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmIChuZXh0LmlzSWRlbnRpZmllcikgewogICAgICAvLyBPbmx5IHJlcG9ydCB0aGVzZSBlcnJvcnMgaWYgdGhlcmUgaXMgYW4gaWRlbnRpZmllci4gSWYgdGhlcmUgaXMgbm90IGFuCiAgICAgIC8vIGlkZW50aWZpZXIsIHRoZW4gYWxsb3cgZW5zdXJlSWRlbnRpZmllciB0byByZXBvcnQgYW4gZXJyb3IKICAgICAgLy8gYW5kIGRvbid0IHJlcG9ydCBlcnJvcnMgaGVyZS4KICAgICAgaWYgKHZhckZpbmFsT3JDb25zdCA9PSBudWxsKSB7CiAgICAgICAgaWYgKHR5cGVJbmZvID09IG5vVHlwZSkgewogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBmYXN0YS5tZXNzYWdlTWlzc2luZ0NvbnN0RmluYWxWYXJPclR5cGUpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChvcHRpb25hbCgndmFyJywgdmFyRmluYWxPckNvbnN0KSkgewogICAgICAgIGlmICh0eXBlSW5mbyAhPSBub1R5cGUpIHsKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IodmFyRmluYWxPckNvbnN0LCBmYXN0YS5tZXNzYWdlVHlwZUFmdGVyVmFyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAoIW9wdGlvbmFsKCdAJywgc3RhcnQubmV4dCkpIHsKICAgICAgbGlzdGVuZXIuYmVnaW5NZXRhZGF0YVN0YXIoc3RhcnQubmV4dCk7CiAgICAgIGxpc3RlbmVyLmVuZE1ldGFkYXRhU3RhcigwKTsKICAgIH0KICAgIHRva2VuID0gdHlwZUluZm8ucGFyc2VUeXBlKGJlZm9yZVR5cGUsIHRoaXMpOwogICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICBsaXN0ZW5lci5iZWdpblZhcmlhYmxlc0RlY2xhcmF0aW9uKG5leHQsIHZhckZpbmFsT3JDb25zdCk7CiAgICBpZiAoIW9ubHlQYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25TdGFydCkgewogICAgICB0b2tlbiA9IHBhcnNlVmFyaWFibGVzRGVjbGFyYXRpb25SZXN0KHRva2VuLCB0cnVlKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlVmFyaWFibGVzRGVjbGFyYXRpb25SZXN0KFRva2VuIHRva2VuLCBib29sIGVuZFdpdGhTZW1pY29sb24pIHsKICAgIGludCBjb3VudCA9IDE7CiAgICB0b2tlbiA9IHBhcnNlT3B0aW9uYWxseUluaXRpYWxpemVkSWRlbnRpZmllcih0b2tlbik7CiAgICB3aGlsZSAob3B0aW9uYWwoJywnLCB0b2tlbi5uZXh0KSkgewogICAgICB0b2tlbiA9IHBhcnNlT3B0aW9uYWxseUluaXRpYWxpemVkSWRlbnRpZmllcih0b2tlbi5uZXh0KTsKICAgICAgKytjb3VudDsKICAgIH0KICAgIGlmIChlbmRXaXRoU2VtaWNvbG9uKSB7CiAgICAgIFRva2VuIHNlbWljb2xvbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICAgIGxpc3RlbmVyLmVuZFZhcmlhYmxlc0RlY2xhcmF0aW9uKGNvdW50LCBzZW1pY29sb24pOwogICAgICByZXR1cm4gc2VtaWNvbG9uOwogICAgfSBlbHNlIHsKICAgICAgbGlzdGVuZXIuZW5kVmFyaWFibGVzRGVjbGFyYXRpb24oY291bnQsIG51bGwpOwogICAgICByZXR1cm4gdG9rZW47CiAgICB9CiAgfQoKICBUb2tlbiBwYXJzZU9wdGlvbmFsbHlJbml0aWFsaXplZElkZW50aWZpZXIoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5hbWVUb2tlbiA9CiAgICAgICAgZW5zdXJlSWRlbnRpZmllcih0b2tlbiwgSWRlbnRpZmllckNvbnRleHQubG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uKTsKICAgIGxpc3RlbmVyLmJlZ2luSW5pdGlhbGl6ZWRJZGVudGlmaWVyKG5hbWVUb2tlbik7CiAgICB0b2tlbiA9IHBhcnNlVmFyaWFibGVJbml0aWFsaXplck9wdChuYW1lVG9rZW4pOwogICAgbGlzdGVuZXIuZW5kSW5pdGlhbGl6ZWRJZGVudGlmaWVyKG5hbWVUb2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIGlmU3RhdGVtZW50OgogIC8vLyAgICdpZicgJygnIGV4cHJlc3Npb24gJyknIHN0YXRlbWVudCAoJ2Vsc2UnIHN0YXRlbWVudCk/CiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VJZlN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gaWZUb2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2lmJywgaWZUb2tlbikpOwogICAgbGlzdGVuZXIuYmVnaW5JZlN0YXRlbWVudChpZlRva2VuKTsKICAgIHRva2VuID0gZW5zdXJlUGFyZW50aGVzaXplZENvbmRpdGlvbihpZlRva2VuKTsKICAgIGxpc3RlbmVyLmJlZ2luVGhlblN0YXRlbWVudCh0b2tlbi5uZXh0KTsKICAgIHRva2VuID0gcGFyc2VTdGF0ZW1lbnQodG9rZW4pOwogICAgbGlzdGVuZXIuZW5kVGhlblN0YXRlbWVudCh0b2tlbik7CiAgICBUb2tlbiBlbHNlVG9rZW4gPSBudWxsOwogICAgaWYgKG9wdGlvbmFsKCdlbHNlJywgdG9rZW4ubmV4dCkpIHsKICAgICAgZWxzZVRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgbGlzdGVuZXIuYmVnaW5FbHNlU3RhdGVtZW50KGVsc2VUb2tlbik7CiAgICAgIHRva2VuID0gcGFyc2VTdGF0ZW1lbnQoZWxzZVRva2VuKTsKICAgICAgbGlzdGVuZXIuZW5kRWxzZVN0YXRlbWVudChlbHNlVG9rZW4pOwogICAgfQogICAgbGlzdGVuZXIuZW5kSWZTdGF0ZW1lbnQoaWZUb2tlbiwgZWxzZVRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gZm9yU3RhdGVtZW50OgogIC8vLyAgICdhd2FpdCc/ICdmb3InICcoJyBmb3JMb29wUGFydHMgJyknIHN0YXRlbWVudAogIC8vLyA7CiAgLy8vCiAgLy8vICBmb3JMb29wUGFydHM6CiAgLy8vICAgICAgbG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uICc7JyBleHByZXNzaW9uPyAnOycgZXhwcmVzc2lvbkxpc3Q/CiAgLy8vICAgIHwgZXhwcmVzc2lvbj8gJzsnIGV4cHJlc3Npb24/ICc7JyBleHByZXNzaW9uTGlzdD8KICAvLy8gICAgfCBsb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gJ2luJyBleHByZXNzaW9uCiAgLy8vICAgIHwgaWRlbnRpZmllciAnaW4nIGV4cHJlc3Npb24KICAvLy8gOwogIC8vLwogIC8vLyBmb3JJbml0aWFsaXplclN0YXRlbWVudDoKICAvLy8gICBsb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gfAogIC8vLyAgIGV4cHJlc3Npb24/ICc7JwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlRm9yU3RhdGVtZW50KFRva2VuIHRva2VuLCBUb2tlbiBhd2FpdFRva2VuKSB7CiAgICBUb2tlbiBmb3JUb2tlbiA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChhd2FpdFRva2VuID09IG51bGwgfHwgb3B0aW9uYWwoJ2F3YWl0JywgYXdhaXRUb2tlbikpOwogICAgYXNzZXJ0KG9wdGlvbmFsKCdmb3InLCB0b2tlbikpOwogICAgbGlzdGVuZXIuYmVnaW5Gb3JTdGF0ZW1lbnQoZm9yVG9rZW4pOwoKICAgIHRva2VuID0gcGFyc2VGb3JMb29wUGFydHNTdGFydChhd2FpdFRva2VuLCBmb3JUb2tlbik7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIHRva2VuID0gcGFyc2VGb3JMb29wUGFydHNNaWQodG9rZW4sIGF3YWl0VG9rZW4sIGZvclRva2VuKTsKICAgIGlmIChvcHRpb25hbCgnaW4nLCB0b2tlbi5uZXh0KSB8fCBvcHRpb25hbCgnOicsIHRva2VuLm5leHQpKSB7CiAgICAgIC8vIFByb2Nlc3MgYGZvciAoIC4uLiBpbiAuLi4gKWAKICAgICAgcmV0dXJuIHBhcnNlRm9ySW5SZXN0KHRva2VuLCBhd2FpdFRva2VuLCBmb3JUb2tlbiwgaWRlbnRpZmllcik7CiAgICB9IGVsc2UgewogICAgICAvLyBQcm9jZXNzIGBmb3IgKCAuLi4gOyAuLi4gOyAuLi4gKWAKICAgICAgcmV0dXJuIHBhcnNlRm9yUmVzdChhd2FpdFRva2VuLCB0b2tlbiwgZm9yVG9rZW4pOwogICAgfQogIH0KCiAgLy8vIFBhcnNlIHRoZSBzdGFydCBvZiBhIGZvciBsb29wIGNvbnRyb2wgc3RydWN0dXJlCiAgLy8vIGZyb20gdGhlIG9wZW4gcGFyZW50aGVzaXMgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgdGhlIGlkZW50aWZpZXIuCiAgVG9rZW4gcGFyc2VGb3JMb29wUGFydHNTdGFydChUb2tlbiBhd2FpdFRva2VuLCBUb2tlbiBmb3JUb2tlbikgewogICAgVG9rZW4gbGVmdFBhcmVudGhlc2lzID0gZm9yVG9rZW4ubmV4dDsKICAgIGlmICghb3B0aW9uYWwoJygnLCBsZWZ0UGFyZW50aGVzaXMpKSB7CiAgICAgIC8vIFJlY292ZXJ5CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBsZWZ0UGFyZW50aGVzaXMsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnKCcpKTsKICAgICAgaW50IG9mZnNldCA9IGxlZnRQYXJlbnRoZXNpcy5vZmZzZXQ7CgogICAgICBCZWdpblRva2VuIG9wZW5QYXJlbiA9IGZvclRva2VuCiAgICAgICAgICAuc2V0TmV4dChuZXcgU3ludGhldGljQmVnaW5Ub2tlbihUb2tlblR5cGUuT1BFTl9QQVJFTiwgb2Zmc2V0KSk7CgogICAgICBUb2tlbiBsb29wUGFydDsKICAgICAgaWYgKGF3YWl0VG9rZW4gIT0gbnVsbCkgewogICAgICAgIGxvb3BQYXJ0ID0gb3BlblBhcmVuLnNldE5leHQoCiAgICAgICAgICAgIG5ldyBTeW50aGV0aWNTdHJpbmdUb2tlbihUb2tlblR5cGUuSURFTlRJRklFUiwgJycsIG9mZnNldCkpOwogICAgICAgIGxvb3BQYXJ0ID0KICAgICAgICAgICAgbG9vcFBhcnQuc2V0TmV4dChuZXcgU3ludGhldGljS2V5d29yZFRva2VuKEtleXdvcmQuSU4sIG9mZnNldCkpOwogICAgICAgIGxvb3BQYXJ0ID0gbG9vcFBhcnQuc2V0TmV4dCgKICAgICAgICAgICAgbmV3IFN5bnRoZXRpY1N0cmluZ1Rva2VuKFRva2VuVHlwZS5JREVOVElGSUVSLCAnJywgb2Zmc2V0KSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbG9vcFBhcnQgPQogICAgICAgICAgICBvcGVuUGFyZW4uc2V0TmV4dChuZXcgU3ludGhldGljVG9rZW4oVG9rZW5UeXBlLlNFTUlDT0xPTiwgb2Zmc2V0KSk7CiAgICAgICAgbG9vcFBhcnQgPQogICAgICAgICAgICBsb29wUGFydC5zZXROZXh0KG5ldyBTeW50aGV0aWNUb2tlbihUb2tlblR5cGUuU0VNSUNPTE9OLCBvZmZzZXQpKTsKICAgICAgfQoKICAgICAgVG9rZW4gY2xvc2VQYXJlbiA9CiAgICAgICAgICBsb29wUGFydC5zZXROZXh0KG5ldyBTeW50aGV0aWNUb2tlbihUb2tlblR5cGUuQ0xPU0VfUEFSRU4sIG9mZnNldCkpOwogICAgICBvcGVuUGFyZW4uZW5kR3JvdXAgPSBjbG9zZVBhcmVuOwogICAgICBUb2tlbiBpZGVudGlmaWVyID0gY2xvc2VQYXJlbgogICAgICAgICAgLnNldE5leHQobmV3IFN5bnRoZXRpY1N0cmluZ1Rva2VuKFRva2VuVHlwZS5JREVOVElGSUVSLCAnJywgb2Zmc2V0KSk7CiAgICAgIFRva2VuIHNlbWljb2xvbiA9CiAgICAgICAgICBpZGVudGlmaWVyLnNldE5leHQobmV3IFN5bnRoZXRpY1Rva2VuKFRva2VuVHlwZS5TRU1JQ09MT04sIG9mZnNldCkpOwogICAgICBzZW1pY29sb24uc2V0TmV4dChsZWZ0UGFyZW50aGVzaXMpOwoKICAgICAgbGVmdFBhcmVudGhlc2lzID0gb3BlblBhcmVuOwogICAgfQoKICAgIC8vIFBhc3MgYHRydWVgIHNvIHRoYXQgdGhlIFtwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRPckRlY2xhcmF0aW9uXSBvbmx5CiAgICAvLyBwYXJzZXMgdGhlIG1ldGFkYXRhLCBtb2RpZmllcnMsIGFuZCB0eXBlIG9mIGEgbG9jYWwgdmFyaWFibGUKICAgIC8vIGRlY2xhcmF0aW9uIGlmIGl0IGV4aXN0cy4gVGhpcyBlbmFibGVzIGNhcHR1cmluZyBbYmVmb3JlSWRlbnRpZmllcl0KICAgIC8vIGZvciBsYXRlciBlcnJvciByZXBvcnRpbmcuCiAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50T3JEZWNsYXJhdGlvbihmb3JUb2tlbi5uZXh0LCB0cnVlKTsKICB9CgogIC8vLyBQYXJzZSB0aGUgcmVtYWluZGVyIG9mIHRoZSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbgogIC8vLyBvciBhbiBleHByZXNzaW9uIGlmIG5vIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHdhcyBmb3VuZC4KICBUb2tlbiBwYXJzZUZvckxvb3BQYXJ0c01pZChUb2tlbiB0b2tlbiwgVG9rZW4gYXdhaXRUb2tlbiwgVG9rZW4gZm9yVG9rZW4pIHsKICAgIGlmICh0b2tlbiAhPSBmb3JUb2tlbi5uZXh0KSB7CiAgICAgIHRva2VuID0gcGFyc2VWYXJpYWJsZXNEZWNsYXJhdGlvblJlc3QodG9rZW4sIGZhbHNlKTsKICAgICAgbGlzdGVuZXIuaGFuZGxlRm9ySW5pdGlhbGl6ZXJMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24odG9rZW4pOwogICAgfSBlbHNlIGlmIChvcHRpb25hbCgnOycsIHRva2VuLm5leHQpKSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUZvckluaXRpYWxpemVyRW1wdHlTdGF0ZW1lbnQodG9rZW4ubmV4dCk7CiAgICB9IGVsc2UgewogICAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvbih0b2tlbik7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUZvckluaXRpYWxpemVyRXhwcmVzc2lvblN0YXRlbWVudCh0b2tlbik7CiAgICB9CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChvcHRpb25hbCgnOycsIG5leHQpKSB7CiAgICAgIGlmIChhd2FpdFRva2VuICE9IG51bGwpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKGF3YWl0VG9rZW4sIGZhc3RhLm1lc3NhZ2VJbnZhbGlkQXdhaXRGb3IpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKCFvcHRpb25hbCgnaW4nLCBuZXh0KSkgewogICAgICAvLyBSZWNvdmVyeQogICAgICBpZiAob3B0aW9uYWwoJzonLCBuZXh0KSkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgZmFzdGEubWVzc2FnZUNvbG9uSW5QbGFjZU9mSW4pOwogICAgICB9IGVsc2UgaWYgKGF3YWl0VG9rZW4gIT0gbnVsbCkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgIG5leHQsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnaW4nKSk7CiAgICAgICAgdG9rZW4uc2V0TmV4dCgKICAgICAgICAgICAgbmV3IFN5bnRoZXRpY0tleXdvcmRUb2tlbihLZXl3b3JkLklOLCBuZXh0Lm9mZnNldCkuLnNldE5leHQobmV4dCkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gVGhpcyBtZXRob2QgcGFyc2VzIHRoZSBwb3J0aW9uIG9mIHRoZSBmb3JMb29wUGFydHMgdGhhdCBzdGFydHMgd2l0aCB0aGUKICAvLy8gZmlyc3Qgc2VtaWNvbG9uICh0aGUgb25lIHRoYXQgdGVybWluYXRlcyB0aGUgZm9ySW5pdGlhbGl6ZXJTdGF0ZW1lbnQpLgogIC8vLwogIC8vLyBgYGAKICAvLy8gIGZvckxvb3BQYXJ0czoKICAvLy8gICAgICBsb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gJzsnIGV4cHJlc3Npb24/ICc7JyBleHByZXNzaW9uTGlzdD8KICAvLy8gICAgfCBleHByZXNzaW9uPyAnOycgZXhwcmVzc2lvbj8gJzsnIGV4cHJlc3Npb25MaXN0PwogIC8vLyAgICB8IGxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbiAnaW4nIGV4cHJlc3Npb24KICAvLy8gICAgfCBpZGVudGlmaWVyICdpbicgZXhwcmVzc2lvbgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlRm9yUmVzdChUb2tlbiBhd2FpdFRva2VuLCBUb2tlbiB0b2tlbiwgVG9rZW4gZm9yVG9rZW4pIHsKICAgIHRva2VuID0gcGFyc2VGb3JMb29wUGFydHNSZXN0KHRva2VuLCBmb3JUb2tlbiwgYXdhaXRUb2tlbik7CiAgICBsaXN0ZW5lci5iZWdpbkZvclN0YXRlbWVudEJvZHkodG9rZW4ubmV4dCk7CiAgICBMb29wU3RhdGUgc2F2ZWRMb29wU3RhdGUgPSBsb29wU3RhdGU7CiAgICBsb29wU3RhdGUgPSBMb29wU3RhdGUuSW5zaWRlTG9vcDsKICAgIHRva2VuID0gcGFyc2VTdGF0ZW1lbnQodG9rZW4pOwogICAgbG9vcFN0YXRlID0gc2F2ZWRMb29wU3RhdGU7CiAgICBsaXN0ZW5lci5lbmRGb3JTdGF0ZW1lbnRCb2R5KHRva2VuLm5leHQpOwogICAgbGlzdGVuZXIuZW5kRm9yU3RhdGVtZW50KHRva2VuLm5leHQpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VGb3JMb29wUGFydHNSZXN0KFRva2VuIHRva2VuLCBUb2tlbiBmb3JUb2tlbiwgVG9rZW4gYXdhaXRUb2tlbikgewogICAgVG9rZW4gbGVmdFBhcmVudGhlc2lzID0gZm9yVG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnZm9yJywgZm9yVG9rZW4pKTsKICAgIGFzc2VydChvcHRpb25hbCgnKCcsIGxlZnRQYXJlbnRoZXNpcykpOwoKICAgIFRva2VuIGxlZnRTZXBhcmF0b3IgPSBlbnN1cmVTZW1pY29sb24odG9rZW4pOwogICAgaWYgKG9wdGlvbmFsKCc7JywgbGVmdFNlcGFyYXRvci5uZXh0KSkgewogICAgICB0b2tlbiA9IHBhcnNlRW1wdHlTdGF0ZW1lbnQobGVmdFNlcGFyYXRvcik7CiAgICB9IGVsc2UgewogICAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudChsZWZ0U2VwYXJhdG9yKTsKICAgIH0KICAgIGludCBleHByZXNzaW9uQ291bnQgPSAwOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIGlmIChvcHRpb25hbCgnKScsIG5leHQpKSB7CiAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uKHRva2VuKS5uZXh0OwogICAgICArK2V4cHJlc3Npb25Db3VudDsKICAgICAgaWYgKCFvcHRpb25hbCgnLCcsIHRva2VuKSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZiAodG9rZW4gIT0gbGVmdFBhcmVudGhlc2lzLmVuZEdyb3VwKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4odG9rZW4sIGZhc3RhLnRlbXBsYXRlVW5leHBlY3RlZFRva2VuKTsKICAgICAgdG9rZW4gPSBsZWZ0UGFyZW50aGVzaXMuZW5kR3JvdXA7CiAgICB9CiAgICBsaXN0ZW5lci5oYW5kbGVGb3JMb29wUGFydHMoCiAgICAgICAgZm9yVG9rZW4sIGxlZnRQYXJlbnRoZXNpcywgbGVmdFNlcGFyYXRvciwgZXhwcmVzc2lvbkNvdW50KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBUaGlzIG1ldGhvZCBwYXJzZXMgdGhlIHBvcnRpb24gb2YgdGhlIGZvckxvb3BQYXJ0cyB0aGF0IHN0YXJ0cyB3aXRoIHRoZQogIC8vLyBrZXl3b3JkICdpbicuIEZvciB0aGUgc2FrZSBvZiByZWNvdmVyeSwgd2UgYWNjZXB0IGEgY29sb24gaW4gcGxhY2Ugb2YgdGhlCiAgLy8vIGtleXdvcmQuCiAgLy8vCiAgLy8vIGBgYAogIC8vLyAgZm9yTG9vcFBhcnRzOgogIC8vLyAgICAgIGxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbiAnOycgZXhwcmVzc2lvbj8gJzsnIGV4cHJlc3Npb25MaXN0PwogIC8vLyAgICB8IGV4cHJlc3Npb24/ICc7JyBleHByZXNzaW9uPyAnOycgZXhwcmVzc2lvbkxpc3Q/CiAgLy8vICAgIHwgbG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uICdpbicgZXhwcmVzc2lvbgogIC8vLyAgICB8IGlkZW50aWZpZXIgJ2luJyBleHByZXNzaW9uCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VGb3JJblJlc3QoCiAgICAgIFRva2VuIHRva2VuLCBUb2tlbiBhd2FpdFRva2VuLCBUb2tlbiBmb3JUb2tlbiwgVG9rZW4gaWRlbnRpZmllcikgewogICAgdG9rZW4gPSBwYXJzZUZvckluTG9vcFBhcnRzUmVzdCh0b2tlbiwgYXdhaXRUb2tlbiwgZm9yVG9rZW4sIGlkZW50aWZpZXIpOwogICAgbGlzdGVuZXIuYmVnaW5Gb3JJbkJvZHkodG9rZW4ubmV4dCk7CiAgICBMb29wU3RhdGUgc2F2ZWRMb29wU3RhdGUgPSBsb29wU3RhdGU7CiAgICBsb29wU3RhdGUgPSBMb29wU3RhdGUuSW5zaWRlTG9vcDsKICAgIHRva2VuID0gcGFyc2VTdGF0ZW1lbnQodG9rZW4pOwogICAgbG9vcFN0YXRlID0gc2F2ZWRMb29wU3RhdGU7CiAgICBsaXN0ZW5lci5lbmRGb3JJbkJvZHkodG9rZW4ubmV4dCk7CiAgICBsaXN0ZW5lci5lbmRGb3JJbih0b2tlbi5uZXh0KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlRm9ySW5Mb29wUGFydHNSZXN0KAogICAgICBUb2tlbiB0b2tlbiwgVG9rZW4gYXdhaXRUb2tlbiwgVG9rZW4gZm9yVG9rZW4sIFRva2VuIGlkZW50aWZpZXIpIHsKICAgIFRva2VuIGluS2V5d29yZCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2ZvcicsIGZvclRva2VuKSk7CiAgICBhc3NlcnQob3B0aW9uYWwoJygnLCBmb3JUb2tlbi5uZXh0KSk7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2luJywgaW5LZXl3b3JkKSB8fCBvcHRpb25hbCgnOicsIGluS2V5d29yZCkpOwoKICAgIGlmICghaWRlbnRpZmllci5pc0lkZW50aWZpZXIpIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIGlkZW50aWZpZXIsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpZmllciAhPSB0b2tlbikgewogICAgICBpZiAob3B0aW9uYWwoJz0nLCBpZGVudGlmaWVyLm5leHQpKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgaWRlbnRpZmllci5uZXh0LCBmYXN0YS5tZXNzYWdlSW5pdGlhbGl6ZWRWYXJpYWJsZUluRm9yRWFjaCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgICAgaWRlbnRpZmllci5uZXh0LCBmYXN0YS50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoYXdhaXRUb2tlbiAhPSBudWxsICYmICFpbkFzeW5jKSB7CiAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBjb25zaWRlciByZXBvcnRpbmcgdGhlIGVycm9yIG9uIGF3YWl0VG9rZW4KICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihpbktleXdvcmQsIGZhc3RhLm1lc3NhZ2VBd2FpdEZvck5vdEFzeW5jKTsKICAgIH0KCiAgICBsaXN0ZW5lci5iZWdpbkZvckluRXhwcmVzc2lvbihpbktleXdvcmQubmV4dCk7CiAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvbihpbktleXdvcmQpOwogICAgdG9rZW4gPSBlbnN1cmVDbG9zZVBhcmVuKHRva2VuLCBmb3JUb2tlbi5uZXh0KTsKICAgIGxpc3RlbmVyLmVuZEZvckluRXhwcmVzc2lvbih0b2tlbik7CiAgICBsaXN0ZW5lci5oYW5kbGVGb3JJbkxvb3BQYXJ0cygKICAgICAgICBhd2FpdFRva2VuLCBmb3JUb2tlbiwgZm9yVG9rZW4ubmV4dCwgaW5LZXl3b3JkKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gd2hpbGVTdGF0ZW1lbnQ6CiAgLy8vICAgJ3doaWxlJyAnKCcgZXhwcmVzc2lvbiAnKScgc3RhdGVtZW50CiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VXaGlsZVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gd2hpbGVUb2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ3doaWxlJywgd2hpbGVUb2tlbikpOwogICAgbGlzdGVuZXIuYmVnaW5XaGlsZVN0YXRlbWVudCh3aGlsZVRva2VuKTsKICAgIHRva2VuID0gZW5zdXJlUGFyZW50aGVzaXplZENvbmRpdGlvbih3aGlsZVRva2VuKTsKICAgIGxpc3RlbmVyLmJlZ2luV2hpbGVTdGF0ZW1lbnRCb2R5KHRva2VuLm5leHQpOwogICAgTG9vcFN0YXRlIHNhdmVkTG9vcFN0YXRlID0gbG9vcFN0YXRlOwogICAgbG9vcFN0YXRlID0gTG9vcFN0YXRlLkluc2lkZUxvb3A7CiAgICB0b2tlbiA9IHBhcnNlU3RhdGVtZW50KHRva2VuKTsKICAgIGxvb3BTdGF0ZSA9IHNhdmVkTG9vcFN0YXRlOwogICAgbGlzdGVuZXIuZW5kV2hpbGVTdGF0ZW1lbnRCb2R5KHRva2VuLm5leHQpOwogICAgbGlzdGVuZXIuZW5kV2hpbGVTdGF0ZW1lbnQod2hpbGVUb2tlbiwgdG9rZW4ubmV4dCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIGRvU3RhdGVtZW50OgogIC8vLyAgICdkbycgc3RhdGVtZW50ICd3aGlsZScgJygnIGV4cHJlc3Npb24gJyknICc7JwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlRG9XaGlsZVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gZG9Ub2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2RvJywgZG9Ub2tlbikpOwogICAgbGlzdGVuZXIuYmVnaW5Eb1doaWxlU3RhdGVtZW50KGRvVG9rZW4pOwogICAgbGlzdGVuZXIuYmVnaW5Eb1doaWxlU3RhdGVtZW50Qm9keShkb1Rva2VuLm5leHQpOwogICAgTG9vcFN0YXRlIHNhdmVkTG9vcFN0YXRlID0gbG9vcFN0YXRlOwogICAgbG9vcFN0YXRlID0gTG9vcFN0YXRlLkluc2lkZUxvb3A7CiAgICB0b2tlbiA9IHBhcnNlU3RhdGVtZW50KGRvVG9rZW4pOwogICAgbG9vcFN0YXRlID0gc2F2ZWRMb29wU3RhdGU7CiAgICBsaXN0ZW5lci5lbmREb1doaWxlU3RhdGVtZW50Qm9keSh0b2tlbik7CiAgICBUb2tlbiB3aGlsZVRva2VuID0gdG9rZW4ubmV4dDsKICAgIGlmICghb3B0aW9uYWwoJ3doaWxlJywgd2hpbGVUb2tlbikpIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIHdoaWxlVG9rZW4sIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnd2hpbGUnKSk7CiAgICAgIHdoaWxlVG9rZW4gPSByZXdyaXRlci5pbnNlcnRUb2tlbih0b2tlbiwKICAgICAgICAgIG5ldyBTeW50aGV0aWNLZXl3b3JkVG9rZW4oS2V5d29yZC5XSElMRSwgd2hpbGVUb2tlbi5jaGFyT2Zmc2V0KSk7CiAgICB9CiAgICB0b2tlbiA9IGVuc3VyZVBhcmVudGhlc2l6ZWRDb25kaXRpb24od2hpbGVUb2tlbik7CiAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICBsaXN0ZW5lci5lbmREb1doaWxlU3RhdGVtZW50KGRvVG9rZW4sIHdoaWxlVG9rZW4sIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gYmxvY2s6CiAgLy8vICAgJ3snIHN0YXRlbWVudCogJ30nCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VCbG9jayhUb2tlbiB0b2tlbikgewogICAgVG9rZW4gYmVnaW4gPSB0b2tlbiA9IGVuc3VyZUJsb2NrKHRva2VuLCBudWxsKTsKICAgIGxpc3RlbmVyLmJlZ2luQmxvY2soYmVnaW4pOwogICAgaW50IHN0YXRlbWVudENvdW50ID0gMDsKICAgIFRva2VuIHN0YXJ0VG9rZW4gPSB0b2tlbi5uZXh0OwogICAgd2hpbGUgKG5vdEVvZk9yVmFsdWUoJ30nLCBzdGFydFRva2VuKSkgewogICAgICB0b2tlbiA9IHBhcnNlU3RhdGVtZW50KHRva2VuKTsKICAgICAgaWYgKGlkZW50aWNhbCh0b2tlbi5uZXh0LCBzdGFydFRva2VuKSkgewogICAgICAgIC8vIE5vIHByb2dyZXNzIHdhcyBtYWRlLCBzbyB3ZSByZXBvcnQgdGhlIGN1cnJlbnQgdG9rZW4gYXMgYmVpbmcgaW52YWxpZAogICAgICAgIC8vIGFuZCBtb3ZlIGZvcndhcmQuCiAgICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgIHRva2VuLCBmYXN0YS50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbi53aXRoQXJndW1lbnRzKHRva2VuKSk7CiAgICAgIH0KICAgICAgKytzdGF0ZW1lbnRDb3VudDsKICAgICAgc3RhcnRUb2tlbiA9IHRva2VuLm5leHQ7CiAgICB9CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ30nLCB0b2tlbikpOwogICAgbGlzdGVuZXIuZW5kQmxvY2soc3RhdGVtZW50Q291bnQsIGJlZ2luLCB0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZUludmFsaWRCbG9jayhUb2tlbiB0b2tlbikgewogICAgVG9rZW4gYmVnaW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCd7JywgYmVnaW4pKTsKICAgIC8vIFBhcnNlIGFuZCByZXBvcnQgdGhlIGludmFsaWQgYmxvY2ssIGJ1dCBzdXBwcmVzcyBlcnJvcnMKICAgIC8vIGJlY2F1c2UgYW4gZXJyb3IgaGFzIGFscmVhZHkgYmVlbiByZXBvcnRlZCBieSB0aGUgY2FsbGVyLgogICAgTGlzdGVuZXIgb3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RlbmVyOwogICAgbGlzdGVuZXIgPSBuZXcgRm9yd2FyZGluZ0xpc3RlbmVyKGxpc3RlbmVyKS4uZm9yd2FyZEVycm9ycyA9IGZhbHNlOwogICAgdG9rZW4gPSBwYXJzZUJsb2NrKHRva2VuKTsKICAgIGxpc3RlbmVyID0gb3JpZ2luYWxMaXN0ZW5lcjsKICAgIGxpc3RlbmVyLmhhbmRsZUludmFsaWRUb3BMZXZlbEJsb2NrKGJlZ2luKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBEZXRlcm1pbmUgaWYgdGhlIGZvbGxvd2luZyB0b2tlbnMgbG9vayBsaWtlIGFuICdhd2FpdCcgZXhwcmVzc2lvbgogIC8vLyBhbmQgbm90IGEgbG9jYWwgdmFyaWFibGUgb3IgbG9jYWwgZnVuY3Rpb24gZGVjbGFyYXRpb24uCiAgYm9vbCBsb29rc0xpa2VBd2FpdEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnYXdhaXQnLCB0b2tlbikpOwogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwoKICAgIC8vIFRPRE8oZGFucnViZWwpOiBDb25zaWRlciBwYXJzaW5nIHRoZSBwb3RlbnRpYWwgZXhwcmVzc2lvbiBmb2xsb3dpbmcKICAgIC8vIHRoZSBgYXdhaXRgIHRva2VuIG9uY2UgZG9pbmcgc28gZG9lcyBub3QgbW9kaWZ5IHRoZSB0b2tlbiBzdHJlYW0uCiAgICAvLyBGb3Igbm93LCB1c2Ugc2ltcGxlIGxvb2sgYWhlYWQgYW5kIGVuc3VyZSBubyBmYWxzZSBwb3NpdGl2ZXMuCgogICAgaWYgKHRva2VuLmlzSWRlbnRpZmllcikgewogICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICAgIGlmIChvcHRpb25hbCgnKCcsIHRva2VuKSkgewogICAgICAgIHRva2VuID0gdG9rZW4uZW5kR3JvdXAubmV4dDsKICAgICAgICBpZiAoaXNPbmVPZih0b2tlbiwgWyc7JywgJy4nLCAnLi4nLCAnPycsICc/LiddKSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGlzT25lT2YodG9rZW4sIFsnLicsICcpJywgJ10nXSkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8vIGBgYAogIC8vLyBhd2FpdEV4cHJlc3Npb246CiAgLy8vICAgJ2F3YWl0JyB1bmFyeUV4cHJlc3Npb24KICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUF3YWl0RXhwcmVzc2lvbihUb2tlbiB0b2tlbiwgYm9vbCBhbGxvd0Nhc2NhZGVzKSB7CiAgICBUb2tlbiBhd2FpdFRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnYXdhaXQnLCBhd2FpdFRva2VuKSk7CiAgICBsaXN0ZW5lci5iZWdpbkF3YWl0RXhwcmVzc2lvbihhd2FpdFRva2VuKTsKICAgIGlmICghaW5Bc3luYykgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKGF3YWl0VG9rZW4sIGZhc3RhLm1lc3NhZ2VBd2FpdE5vdEFzeW5jKTsKICAgIH0KICAgIHRva2VuID0gcGFyc2VQcmVjZWRlbmNlRXhwcmVzc2lvbigKICAgICAgICBhd2FpdFRva2VuLCBQT1NURklYX1BSRUNFREVOQ0UsIGFsbG93Q2FzY2FkZXMpOwogICAgbGlzdGVuZXIuZW5kQXdhaXRFeHByZXNzaW9uKGF3YWl0VG9rZW4sIHRva2VuLm5leHQpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyB0aHJvd0V4cHJlc3Npb246CiAgLy8vICAgJ3Rocm93JyBleHByZXNzaW9uCiAgLy8vIDsKICAvLy8KICAvLy8gdGhyb3dFeHByZXNzaW9uV2l0aG91dENhc2NhZGU6CiAgLy8vICAgJ3Rocm93JyBleHByZXNzaW9uV2l0aG91dENhc2NhZGUKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZVRocm93RXhwcmVzc2lvbihUb2tlbiB0b2tlbiwgYm9vbCBhbGxvd0Nhc2NhZGVzKSB7CiAgICBUb2tlbiB0aHJvd1Rva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgndGhyb3cnLCB0aHJvd1Rva2VuKSk7CiAgICBpZiAob3B0aW9uYWwoJzsnLCB0aHJvd1Rva2VuLm5leHQpKSB7CiAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBGaW5kIGEgYmV0dGVyIHdheSB0byBpbnRlcmNlcHQgdGhlIHBhcnNlRXhwcmVzc2lvbgogICAgICAvLyByZWNvdmVyeSB0byBnZW5lcmF0ZSB0aGlzIGVycm9yIG1lc3NhZ2UgcmF0aGVyIHRoYW4gZXhwbGljaXRseQogICAgICAvLyBjaGVja2luZyB0aGUgbmV4dCB0b2tlbiBhcyB3ZSBhcmUgZG9pbmcgaGVyZS4KICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIHRocm93VG9rZW4ubmV4dCwgZmFzdGEubWVzc2FnZU1pc3NpbmdFeHByZXNzaW9uSW5UaHJvdyk7CiAgICAgIHJld3JpdGVyLmluc2VydFRva2VuKAogICAgICAgICAgdGhyb3dUb2tlbiwKICAgICAgICAgIG5ldyBTeW50aGV0aWNTdHJpbmdUb2tlbigKICAgICAgICAgICAgICBUb2tlblR5cGUuU1RSSU5HLCAnIiInLCB0aHJvd1Rva2VuLm5leHQuY2hhck9mZnNldCwgMCkpOwogICAgfQogICAgdG9rZW4gPSBhbGxvd0Nhc2NhZGVzCiAgICAgICAgPyBwYXJzZUV4cHJlc3Npb24odGhyb3dUb2tlbikKICAgICAgICA6IHBhcnNlRXhwcmVzc2lvbldpdGhvdXRDYXNjYWRlKHRocm93VG9rZW4pOwogICAgbGlzdGVuZXIuaGFuZGxlVGhyb3dFeHByZXNzaW9uKHRocm93VG9rZW4sIHRva2VuLm5leHQpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyByZXRocm93U3RhdGVtZW50OgogIC8vLyAgICdyZXRocm93JyAnOycKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZVJldGhyb3dTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIHRocm93VG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdyZXRocm93JywgdGhyb3dUb2tlbikpOwogICAgbGlzdGVuZXIuYmVnaW5SZXRocm93U3RhdGVtZW50KHRocm93VG9rZW4pOwogICAgdG9rZW4gPSBlbnN1cmVTZW1pY29sb24odGhyb3dUb2tlbik7CiAgICBsaXN0ZW5lci5lbmRSZXRocm93U3RhdGVtZW50KHRocm93VG9rZW4sIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gdHJ5U3RhdGVtZW50OgogIC8vLyAgICd0cnknIGJsb2NrIChvblBhcnQrIGZpbmFsbHlQYXJ0PyB8IGZpbmFsbHlQYXJ0KQogIC8vLyA7CiAgLy8vCiAgLy8vIG9uUGFydDoKICAvLy8gICBjYXRjaFBhcnQgYmxvY2sgfAogIC8vLyAgICdvbicgdHlwZSBjYXRjaFBhcnQ/IGJsb2NrCiAgLy8vIDsKICAvLy8KICAvLy8gY2F0Y2hQYXJ0OgogIC8vLyAgICdjYXRjaCcgJygnIGlkZW50aWZpZXIgKCcsJyBpZGVudGlmaWVyKT8gJyknCiAgLy8vIDsKICAvLy8KICAvLy8gZmluYWxseVBhcnQ6CiAgLy8vICAgJ2ZpbmFsbHknIGJsb2NrCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VUcnlTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIHRyeUtleXdvcmQgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCd0cnknLCB0cnlLZXl3b3JkKSk7CiAgICBsaXN0ZW5lci5iZWdpblRyeVN0YXRlbWVudCh0cnlLZXl3b3JkKTsKICAgIFRva2VuIGxhc3RDb25zdW1lZCA9IHBhcnNlQmxvY2sodHJ5S2V5d29yZCk7CiAgICB0b2tlbiA9IGxhc3RDb25zdW1lZC5uZXh0OwogICAgaW50IGNhdGNoQ291bnQgPSAwOwoKICAgIFN0cmluZyB2YWx1ZSA9IHRva2VuLnN0cmluZ1ZhbHVlOwogICAgd2hpbGUgKGlkZW50aWNhbCh2YWx1ZSwgJ2NhdGNoJykgfHwgaWRlbnRpY2FsKHZhbHVlLCAnb24nKSkgewogICAgICBsaXN0ZW5lci5iZWdpbkNhdGNoQ2xhdXNlKHRva2VuKTsKICAgICAgVG9rZW4gb25LZXl3b3JkID0gbnVsbDsKICAgICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ29uJykpIHsKICAgICAgICAvLyAnb24nIHR5cGUgY2F0Y2hQYXJ0PwogICAgICAgIG9uS2V5d29yZCA9IHRva2VuOwogICAgICAgIGxhc3RDb25zdW1lZCA9IGNvbXB1dGVUeXBlKHRva2VuLCB0cnVlKS5lbnN1cmVUeXBlTm90Vm9pZCh0b2tlbiwgdGhpcyk7CiAgICAgICAgdG9rZW4gPSBsYXN0Q29uc3VtZWQubmV4dDsKICAgICAgICB2YWx1ZSA9IHRva2VuLnN0cmluZ1ZhbHVlOwogICAgICB9CiAgICAgIFRva2VuIGNhdGNoS2V5d29yZCA9IG51bGw7CiAgICAgIFRva2VuIGNvbW1hID0gbnVsbDsKICAgICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2NhdGNoJykpIHsKICAgICAgICBjYXRjaEtleXdvcmQgPSB0b2tlbjsKCiAgICAgICAgVG9rZW4gb3BlblBhcmVucyA9IGNhdGNoS2V5d29yZC5uZXh0OwogICAgICAgIGlmICghb3B0aW9uYWwoIigiLCBvcGVuUGFyZW5zKSkgewogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihvcGVuUGFyZW5zLCBmYXN0YS5tZXNzYWdlQ2F0Y2hTeW50YXgpOwogICAgICAgICAgb3BlblBhcmVucyA9IHJld3JpdGVyLmluc2VydFBhcmVucyhjYXRjaEtleXdvcmQsIHRydWUpOwogICAgICAgIH0KCiAgICAgICAgVG9rZW4gZXhjZXB0aW9uTmFtZSA9IG9wZW5QYXJlbnMubmV4dDsKICAgICAgICBpZiAoZXhjZXB0aW9uTmFtZS5raW5kICE9IElERU5USUZJRVJfVE9LRU4pIHsKICAgICAgICAgIGV4Y2VwdGlvbk5hbWUgPSBJZGVudGlmaWVyQ29udGV4dC5jYXRjaFBhcmFtZXRlcgogICAgICAgICAgICAgIC5lbnN1cmVJZGVudGlmaWVyKG9wZW5QYXJlbnMsIHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgaWYgKG9wdGlvbmFsKCIpIiwgZXhjZXB0aW9uTmFtZS5uZXh0KSkgewogICAgICAgICAgLy8gT0s6IGBjYXRjaCAoaWRlbnRpZmllcilgLgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb21tYSA9IGV4Y2VwdGlvbk5hbWUubmV4dDsKICAgICAgICAgIGlmICghb3B0aW9uYWwoIiwiLCBjb21tYSkpIHsKICAgICAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICAgICAgaWYgKCFleGNlcHRpb25OYW1lLmlzU3ludGhldGljKSB7CiAgICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihjb21tYSwgZmFzdGEubWVzc2FnZUNhdGNoU3ludGF4KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IENvbnNpZGVyIGluc2VydGluZyBgb25gIGNsYXVzZSBpZgogICAgICAgICAgICAvLyBleGNlcHRpb25OYW1lIGlzIHByZWNlZGVkIGJ5IHR5cGUgYW5kIGZvbGxvd2VkIGJ5IGEgY29tbWEuCiAgICAgICAgICAgIC8vIFRoZW4gdGhpcwogICAgICAgICAgICAvLyAgIH0gY2F0Y2ggKEUgZSwgdCkgewogICAgICAgICAgICAvLyB3aWxsIHJlY292ZXIgdG8KICAgICAgICAgICAgLy8gICB9IG9uIEUgY2F0Y2ggKGUsIHQpIHsKICAgICAgICAgICAgLy8gd2l0aCBhIGRldGFpbGVkIGV4cGxhaW5hdGlvbiBmb3IgdGhlIHVzZXIgaW4gdGhlIGVycm9yCiAgICAgICAgICAgIC8vIGluZGljYXRpbmcgd2hhdCB0aGV5IHNob3VsZCBkbyB0byBmaXggdGhlIGNvZGUuCgogICAgICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogQ29uc2lkZXIgaW5zZXJ0aW5nIHN5bnRoZXRpYyBpZGVudGlmaWVyIGlmCiAgICAgICAgICAgIC8vIGV4Y2VwdGlvbk5hbWUgaXMgYSBub24tc3ludGhldGljIGlkZW50aWZpZXIgZm9sbG93ZWQgYnkgYC5gLgogICAgICAgICAgICAvLyBUaGVuIHRoaXMKICAgICAgICAgICAgLy8gICB9IGNhdGNoICgKICAgICAgICAgICAgLy8gICBlLmYoKTsKICAgICAgICAgICAgLy8gd2lsbCByZWNvdmVyIHRvCiAgICAgICAgICAgIC8vICAgfSBjYXRjaCAoX3NfKSB7fQogICAgICAgICAgICAvLyAgIGUuZigpOwogICAgICAgICAgICAvLyByYXRoZXIgdGhhbgogICAgICAgICAgICAvLyAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgICAgIC8vICAgX3NfLmYoKTsKCiAgICAgICAgICAgIGlmIChvcGVuUGFyZW5zLmVuZEdyb3VwLmlzU3ludGhldGljKSB7CiAgICAgICAgICAgICAgLy8gVGhlIHNjYW5uZXIgZGlkIG5vdCBwbGFjZSB0aGUgc3ludGhldGljICcpJyBjb3JyZWN0bHkuCiAgICAgICAgICAgICAgcmV3cml0ZXIubW92ZVN5bnRoZXRpYyhleGNlcHRpb25OYW1lLCBvcGVuUGFyZW5zLmVuZEdyb3VwKTsKICAgICAgICAgICAgICBjb21tYSA9IG51bGw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgY29tbWEgPSByZXdyaXRlci5pbnNlcnRUb2tlbihleGNlcHRpb25OYW1lLAogICAgICAgICAgICAgICAgICBuZXcgU3ludGhldGljVG9rZW4oVG9rZW5UeXBlLkNPTU1BLCBjb21tYS5jaGFyT2Zmc2V0KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChjb21tYSAhPSBudWxsKSB7CiAgICAgICAgICAgIFRva2VuIHRyYWNlTmFtZSA9IGNvbW1hLm5leHQ7CiAgICAgICAgICAgIGlmICh0cmFjZU5hbWUua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKSB7CiAgICAgICAgICAgICAgdHJhY2VOYW1lID0gSWRlbnRpZmllckNvbnRleHQuY2F0Y2hQYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgLmVuc3VyZUlkZW50aWZpZXIoY29tbWEsIHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghb3B0aW9uYWwoIikiLCB0cmFjZU5hbWUubmV4dCkpIHsKICAgICAgICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgICAgICAgIGlmICghdHJhY2VOYW1lLmlzU3ludGhldGljKSB7CiAgICAgICAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgICAgICAgIHRyYWNlTmFtZS5uZXh0LCBmYXN0YS5tZXNzYWdlQ2F0Y2hTeW50YXhFeHRyYVBhcmFtZXRlcnMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAob3BlblBhcmVucy5lbmRHcm91cC5pc1N5bnRoZXRpYykgewogICAgICAgICAgICAgICAgLy8gVGhlIHNjYW5uZXIgZGlkIG5vdCBwbGFjZSB0aGUgc3ludGhldGljICcpJyBjb3JyZWN0bHkuCiAgICAgICAgICAgICAgICByZXdyaXRlci5tb3ZlU3ludGhldGljKHRyYWNlTmFtZSwgb3BlblBhcmVucy5lbmRHcm91cCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxhc3RDb25zdW1lZCA9IHBhcnNlRm9ybWFsUGFyYW1ldGVycyhjYXRjaEtleXdvcmQsIE1lbWJlcktpbmQuQ2F0Y2gpOwogICAgICAgIHRva2VuID0gbGFzdENvbnN1bWVkLm5leHQ7CiAgICAgIH0KICAgICAgbGlzdGVuZXIuZW5kQ2F0Y2hDbGF1c2UodG9rZW4pOwogICAgICBsYXN0Q29uc3VtZWQgPSBwYXJzZUJsb2NrKGxhc3RDb25zdW1lZCk7CiAgICAgIHRva2VuID0gbGFzdENvbnN1bWVkLm5leHQ7CiAgICAgICsrY2F0Y2hDb3VudDsKICAgICAgbGlzdGVuZXIuaGFuZGxlQ2F0Y2hCbG9jayhvbktleXdvcmQsIGNhdGNoS2V5d29yZCwgY29tbWEpOwogICAgICB2YWx1ZSA9IHRva2VuLnN0cmluZ1ZhbHVlOyAvLyB3aGlsZSBjb25kaXRpb24KICAgIH0KCiAgICBUb2tlbiBmaW5hbGx5S2V5d29yZCA9IG51bGw7CiAgICBpZiAob3B0aW9uYWwoJ2ZpbmFsbHknLCB0b2tlbikpIHsKICAgICAgZmluYWxseUtleXdvcmQgPSB0b2tlbjsKICAgICAgbGFzdENvbnN1bWVkID0gcGFyc2VCbG9jayh0b2tlbik7CiAgICAgIHRva2VuID0gbGFzdENvbnN1bWVkLm5leHQ7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUZpbmFsbHlCbG9jayhmaW5hbGx5S2V5d29yZCk7CiAgICB9IGVsc2UgewogICAgICBpZiAoY2F0Y2hDb3VudCA9PSAwKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0cnlLZXl3b3JkLCBmYXN0YS5tZXNzYWdlT25seVRyeSk7CiAgICAgIH0KICAgIH0KICAgIGxpc3RlbmVyLmVuZFRyeVN0YXRlbWVudChjYXRjaENvdW50LCB0cnlLZXl3b3JkLCBmaW5hbGx5S2V5d29yZCk7CiAgICByZXR1cm4gbGFzdENvbnN1bWVkOwogIH0KCiAgLy8vIGBgYAogIC8vLyBzd2l0Y2hTdGF0ZW1lbnQ6CiAgLy8vICAgJ3N3aXRjaCcgcGFyZW50aGVzaXplZEV4cHJlc3Npb24gc3dpdGNoQmxvY2sKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZVN3aXRjaFN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gc3dpdGNoS2V5d29yZCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ3N3aXRjaCcsIHN3aXRjaEtleXdvcmQpKTsKICAgIGxpc3RlbmVyLmJlZ2luU3dpdGNoU3RhdGVtZW50KHN3aXRjaEtleXdvcmQpOwogICAgdG9rZW4gPSBlbnN1cmVQYXJlbnRoZXNpemVkQ29uZGl0aW9uKHN3aXRjaEtleXdvcmQpOwogICAgTG9vcFN0YXRlIHNhdmVkTG9vcFN0YXRlID0gbG9vcFN0YXRlOwogICAgaWYgKGxvb3BTdGF0ZSA9PSBMb29wU3RhdGUuT3V0c2lkZUxvb3ApIHsKICAgICAgbG9vcFN0YXRlID0gTG9vcFN0YXRlLkluc2lkZVN3aXRjaDsKICAgIH0KICAgIHRva2VuID0gcGFyc2VTd2l0Y2hCbG9jayh0b2tlbik7CiAgICBsb29wU3RhdGUgPSBzYXZlZExvb3BTdGF0ZTsKICAgIGxpc3RlbmVyLmVuZFN3aXRjaFN0YXRlbWVudChzd2l0Y2hLZXl3b3JkLCB0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIHN3aXRjaEJsb2NrOgogIC8vLyAgICd7JyBzd2l0Y2hDYXNlKiBkZWZhdWx0Q2FzZT8gJ30nCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VTd2l0Y2hCbG9jayhUb2tlbiB0b2tlbikgewogICAgVG9rZW4gYmVnaW5Td2l0Y2ggPSB0b2tlbiA9IGVuc3VyZUJsb2NrKHRva2VuLCBudWxsKTsKICAgIGxpc3RlbmVyLmJlZ2luU3dpdGNoQmxvY2soYmVnaW5Td2l0Y2gpOwogICAgaW50IGNhc2VDb3VudCA9IDA7CiAgICBUb2tlbiBkZWZhdWx0S2V5d29yZCA9IG51bGw7CiAgICBUb2tlbiBjb2xvbkFmdGVyRGVmYXVsdCA9IG51bGw7CiAgICB3aGlsZSAobm90RW9mT3JWYWx1ZSgnfScsIHRva2VuLm5leHQpKSB7CiAgICAgIFRva2VuIGJlZ2luQ2FzZSA9IHRva2VuLm5leHQ7CiAgICAgIGludCBleHByZXNzaW9uQ291bnQgPSAwOwogICAgICBpbnQgbGFiZWxDb3VudCA9IDA7CiAgICAgIFRva2VuIHBlZWsgPSBwZWVrUGFzdExhYmVscyhiZWdpbkNhc2UpOwogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIC8vIExvb3AgdW50aWwgd2UgZmluZCBzb21ldGhpbmcgdGhhdCBjYW4ndCBiZSBwYXJ0IG9mIGEgc3dpdGNoIGNhc2UuCiAgICAgICAgU3RyaW5nIHZhbHVlID0gcGVlay5zdHJpbmdWYWx1ZTsKICAgICAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnZGVmYXVsdCcpKSB7CiAgICAgICAgICB3aGlsZSAoIWlkZW50aWNhbCh0b2tlbi5uZXh0LCBwZWVrKSkgewogICAgICAgICAgICB0b2tlbiA9IHBhcnNlTGFiZWwodG9rZW4pOwogICAgICAgICAgICBsYWJlbENvdW50Kys7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZGVmYXVsdEtleXdvcmQgIT0gbnVsbCkgewogICAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgICAgdG9rZW4ubmV4dCwgZmFzdGEubWVzc2FnZVN3aXRjaEhhc011bHRpcGxlRGVmYXVsdHMpOwogICAgICAgICAgfQogICAgICAgICAgZGVmYXVsdEtleXdvcmQgPSB0b2tlbi5uZXh0OwogICAgICAgICAgY29sb25BZnRlckRlZmF1bHQgPSB0b2tlbiA9IGVuc3VyZUNvbG9uKGRlZmF1bHRLZXl3b3JkKTsKICAgICAgICAgIHBlZWsgPSB0b2tlbi5uZXh0OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdjYXNlJykpIHsKICAgICAgICAgIHdoaWxlICghaWRlbnRpY2FsKHRva2VuLm5leHQsIHBlZWspKSB7CiAgICAgICAgICAgIHRva2VuID0gcGFyc2VMYWJlbCh0b2tlbik7CiAgICAgICAgICAgIGxhYmVsQ291bnQrKzsKICAgICAgICAgIH0KICAgICAgICAgIFRva2VuIGNhc2VLZXl3b3JkID0gdG9rZW4ubmV4dDsKICAgICAgICAgIGlmIChkZWZhdWx0S2V5d29yZCAhPSBudWxsKSB7CiAgICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgICAgICBjYXNlS2V5d29yZCwgZmFzdGEubWVzc2FnZVN3aXRjaEhhc0Nhc2VBZnRlckRlZmF1bHQpOwogICAgICAgICAgfQogICAgICAgICAgbGlzdGVuZXIuYmVnaW5DYXNlRXhwcmVzc2lvbihjYXNlS2V5d29yZCk7CiAgICAgICAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvbihjYXNlS2V5d29yZCk7CiAgICAgICAgICB0b2tlbiA9IGVuc3VyZUNvbG9uKHRva2VuKTsKICAgICAgICAgIGxpc3RlbmVyLmVuZENhc2VFeHByZXNzaW9uKHRva2VuKTsKICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZUNhc2VNYXRjaChjYXNlS2V5d29yZCwgdG9rZW4pOwogICAgICAgICAgZXhwcmVzc2lvbkNvdW50Kys7CiAgICAgICAgICBwZWVrID0gcGVla1Bhc3RMYWJlbHModG9rZW4ubmV4dCk7CiAgICAgICAgfSBlbHNlIGlmIChleHByZXNzaW9uQ291bnQgPiAwKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgICAgcGVlaywgZmFzdGEudGVtcGxhdGVFeHBlY3RlZFRva2VuLndpdGhBcmd1bWVudHMoImNhc2UiKSk7CiAgICAgICAgICBUb2tlbiBlbmRHcm91cCA9IGJlZ2luU3dpdGNoLmVuZEdyb3VwOwogICAgICAgICAgd2hpbGUgKHRva2VuLm5leHQgIT0gZW5kR3JvdXApIHsKICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICAgICAgfQogICAgICAgICAgcGVlayA9IHBlZWtQYXN0TGFiZWxzKHRva2VuLm5leHQpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRva2VuID0gcGFyc2VTdGF0ZW1lbnRzSW5Td2l0Y2hDYXNlKHRva2VuLCBwZWVrLCBiZWdpbkNhc2UsIGxhYmVsQ291bnQsCiAgICAgICAgICBleHByZXNzaW9uQ291bnQsIGRlZmF1bHRLZXl3b3JkLCBjb2xvbkFmdGVyRGVmYXVsdCk7CiAgICAgICsrY2FzZUNvdW50OwogICAgfQogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgbGlzdGVuZXIuZW5kU3dpdGNoQmxvY2soY2FzZUNvdW50LCBiZWdpblN3aXRjaCwgdG9rZW4pOwogICAgYXNzZXJ0KG9wdGlvbmFsKCd9JywgdG9rZW4pKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBQZWVrIGFmdGVyIHRoZSBmb2xsb3dpbmcgbGFiZWxzIChpZiBhbnkpLiBUaGUgZm9sbG93aW5nIHRva2VuCiAgLy8vIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBsYWJlbHMgYmVsb25nIHRvIGEgc3RhdGVtZW50IG9yIGEKICAvLy8gc3dpdGNoIGNhc2UuCiAgVG9rZW4gcGVla1Bhc3RMYWJlbHMoVG9rZW4gdG9rZW4pIHsKICAgIHdoaWxlICh0b2tlbi5pc0lkZW50aWZpZXIgJiYgb3B0aW9uYWwoJzonLCB0b2tlbi5uZXh0KSkgewogICAgICB0b2tlbiA9IHRva2VuLm5leHQubmV4dDsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBQYXJzZSBzdGF0ZW1lbnRzIGFmdGVyIGEgc3dpdGNoIGBjYXNlOmAgb3IgYGRlZmF1bHQ6YC4KICBUb2tlbiBwYXJzZVN0YXRlbWVudHNJblN3aXRjaENhc2UoCiAgICAgIFRva2VuIHRva2VuLAogICAgICBUb2tlbiBwZWVrLAogICAgICBUb2tlbiBiZWdpbiwKICAgICAgaW50IGxhYmVsQ291bnQsCiAgICAgIGludCBleHByZXNzaW9uQ291bnQsCiAgICAgIFRva2VuIGRlZmF1bHRLZXl3b3JkLAogICAgICBUb2tlbiBjb2xvbkFmdGVyRGVmYXVsdCkgewogICAgbGlzdGVuZXIuYmVnaW5Td2l0Y2hDYXNlKGxhYmVsQ291bnQsIGV4cHJlc3Npb25Db3VudCwgYmVnaW4pOwogICAgLy8gRmluYWxseSB6ZXJvIG9yIG1vcmUgc3RhdGVtZW50cy4KICAgIGludCBzdGF0ZW1lbnRDb3VudCA9IDA7CiAgICB3aGlsZSAoIWlkZW50aWNhbCh0b2tlbi5uZXh0LmtpbmQsIEVPRl9UT0tFTikpIHsKICAgICAgU3RyaW5nIHZhbHVlID0gcGVlay5zdHJpbmdWYWx1ZTsKICAgICAgaWYgKChpZGVudGljYWwodmFsdWUsICdjYXNlJykpIHx8CiAgICAgICAgICAoaWRlbnRpY2FsKHZhbHVlLCAnZGVmYXVsdCcpKSB8fAogICAgICAgICAgKChpZGVudGljYWwodmFsdWUsICd9JykpICYmIChpZGVudGljYWwodG9rZW4ubmV4dCwgcGVlaykpKSkgewogICAgICAgIC8vIEEgbGFiZWwganVzdCBiZWZvcmUgIn0iIHdpbGwgYmUgaGFuZGxlZCBhcyBhIHN0YXRlbWVudCBlcnJvci4KICAgICAgICBicmVhazsKICAgICAgfSBlbHNlIHsKICAgICAgICBUb2tlbiBzdGFydFRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgICB0b2tlbiA9IHBhcnNlU3RhdGVtZW50KHRva2VuKTsKICAgICAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICBpZiAoaWRlbnRpY2FsKG5leHQsIHN0YXJ0VG9rZW4pKSB7CiAgICAgICAgICAvLyBObyBwcm9ncmVzcyB3YXMgbWFkZSwgc28gd2UgcmVwb3J0IHRoZSBjdXJyZW50IHRva2VuIGFzIGJlaW5nCiAgICAgICAgICAvLyBpbnZhbGlkIGFuZCBtb3ZlIGZvcndhcmQuCiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgIG5leHQsIGZhc3RhLnRlbXBsYXRlVW5leHBlY3RlZFRva2VuLndpdGhBcmd1bWVudHMobmV4dCkpOwogICAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgIH0KICAgICAgICArK3N0YXRlbWVudENvdW50OwogICAgICB9CiAgICAgIHBlZWsgPSBwZWVrUGFzdExhYmVscyh0b2tlbi5uZXh0KTsKICAgIH0KICAgIGxpc3RlbmVyLmVuZFN3aXRjaENhc2UobGFiZWxDb3VudCwgZXhwcmVzc2lvbkNvdW50LCBkZWZhdWx0S2V5d29yZCwKICAgICAgICBjb2xvbkFmdGVyRGVmYXVsdCwgc3RhdGVtZW50Q291bnQsIGJlZ2luLCB0b2tlbi5uZXh0KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gYnJlYWtTdGF0ZW1lbnQ6CiAgLy8vICAgJ2JyZWFrJyBpZGVudGlmaWVyPyAnOycKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUJyZWFrU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBicmVha0tleXdvcmQgPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2JyZWFrJywgYnJlYWtLZXl3b3JkKSk7CiAgICBib29sIGhhc1RhcmdldCA9IGZhbHNlOwogICAgaWYgKHRva2VuLm5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgIHRva2VuID0gZW5zdXJlSWRlbnRpZmllcih0b2tlbiwgSWRlbnRpZmllckNvbnRleHQubGFiZWxSZWZlcmVuY2UpOwogICAgICBoYXNUYXJnZXQgPSB0cnVlOwogICAgfSBlbHNlIGlmICghaXNCcmVha0FsbG93ZWQpIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihicmVha0tleXdvcmQsIGZhc3RhLm1lc3NhZ2VCcmVha091dHNpZGVPZkxvb3ApOwogICAgfQogICAgdG9rZW4gPSBlbnN1cmVTZW1pY29sb24odG9rZW4pOwogICAgbGlzdGVuZXIuaGFuZGxlQnJlYWtTdGF0ZW1lbnQoaGFzVGFyZ2V0LCBicmVha0tleXdvcmQsIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gYXNzZXJ0aW9uOgogIC8vLyAgICdhc3NlcnQnICcoJyBleHByZXNzaW9uICgnLCcgZXhwcmVzc2lvbik/ICcsJz8gJyknCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VBc3NlcnQoVG9rZW4gdG9rZW4sIEFzc2VydCBraW5kKSB7CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2Fzc2VydCcsIHRva2VuKSk7CiAgICBsaXN0ZW5lci5iZWdpbkFzc2VydCh0b2tlbiwga2luZCk7CiAgICBUb2tlbiBhc3NlcnRLZXl3b3JkID0gdG9rZW47CiAgICBUb2tlbiBsZWZ0UGFyZW50aGVzaXMgPSB0b2tlbi5uZXh0OwogICAgaWYgKCFvcHRpb25hbCgnKCcsIGxlZnRQYXJlbnRoZXNpcykpIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIGxlZnRQYXJlbnRoZXNpcywgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCcoJykpOwogICAgICBsZWZ0UGFyZW50aGVzaXMgPSByZXdyaXRlci5pbnNlcnRQYXJlbnModG9rZW4sIHRydWUpOwogICAgfQogICAgdG9rZW4gPSBsZWZ0UGFyZW50aGVzaXM7CiAgICBUb2tlbiBjb21tYVRva2VuID0gbnVsbDsKICAgIGJvb2wgb2xkID0gbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zOwogICAgbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zID0gdHJ1ZTsKCiAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvbih0b2tlbik7CiAgICBpZiAob3B0aW9uYWwoJywnLCB0b2tlbi5uZXh0KSkgewogICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICAgIGlmICghb3B0aW9uYWwoJyknLCB0b2tlbi5uZXh0KSkgewogICAgICAgIGNvbW1hVG9rZW4gPSB0b2tlbjsKICAgICAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvbih0b2tlbik7CiAgICAgICAgaWYgKG9wdGlvbmFsKCcsJywgdG9rZW4ubmV4dCkpIHsKICAgICAgICAgIC8vIFRyYWlsaW5nIGNvbW1hIGlzIGlnbm9yZWQuCiAgICAgICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgVG9rZW4gZW5kR3JvdXAgPSBsZWZ0UGFyZW50aGVzaXMuZW5kR3JvdXA7CiAgICBpZiAodG9rZW4ubmV4dCA9PSBlbmRHcm91cCkgewogICAgICB0b2tlbiA9IGVuZEdyb3VwOwogICAgfSBlbHNlIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgaWYgKGVuZEdyb3VwLmlzU3ludGhldGljKSB7CiAgICAgICAgLy8gVGhlIHNjYW5uZXIgZGlkIG5vdCBwbGFjZSB0aGUgc3ludGhldGljICcpJyBjb3JyZWN0bHksIHNvIG1vdmUgaXQuCiAgICAgICAgdG9rZW4gPSByZXdyaXRlci5tb3ZlU3ludGhldGljKHRva2VuLCBlbmRHcm91cCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgICAgdG9rZW4ubmV4dCwgZmFzdGEudGVtcGxhdGVVbmV4cGVjdGVkVG9rZW4pOwogICAgICAgIHRva2VuID0gZW5kR3JvdXA7CiAgICAgIH0KICAgIH0KCiAgICBhc3NlcnQob3B0aW9uYWwoJyknLCB0b2tlbikpOwogICAgbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zID0gb2xkOwogICAgaWYgKGtpbmQgPT0gQXNzZXJ0LkV4cHJlc3Npb24pIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihhc3NlcnRLZXl3b3JkLCBmYXN0YS5tZXNzYWdlQXNzZXJ0QXNFeHByZXNzaW9uKTsKICAgIH0gZWxzZSBpZiAoa2luZCA9PSBBc3NlcnQuU3RhdGVtZW50KSB7CiAgICAgIGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICB9CiAgICBsaXN0ZW5lci5lbmRBc3NlcnQoCiAgICAgICAgYXNzZXJ0S2V5d29yZCwga2luZCwgbGVmdFBhcmVudGhlc2lzLCBjb21tYVRva2VuLCB0b2tlbi5uZXh0KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gYXNzZXJ0U3RhdGVtZW50OgogIC8vLyAgIGFzc2VydGlvbiAnOycKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUFzc2VydFN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgYXNzZXJ0KG9wdGlvbmFsKCdhc3NlcnQnLCB0b2tlbi5uZXh0KSk7CiAgICAvLyBwYXJzZUFzc2VydCBlbnN1cmVzIHRoYXQgdGhlcmUgaXMgYSB0cmFpbGluZyBzZW1pY29sb24uCiAgICByZXR1cm4gcGFyc2VBc3NlcnQodG9rZW4sIEFzc2VydC5TdGF0ZW1lbnQpLm5leHQ7CiAgfQoKICAvLy8gYGBgCiAgLy8vIGNvbnRpbnVlU3RhdGVtZW50OgogIC8vLyAgICdjb250aW51ZScgaWRlbnRpZmllcj8gJzsnCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VDb250aW51ZVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gY29udGludWVLZXl3b3JkID0gdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdjb250aW51ZScsIGNvbnRpbnVlS2V5d29yZCkpOwogICAgYm9vbCBoYXNUYXJnZXQgPSBmYWxzZTsKICAgIGlmICh0b2tlbi5uZXh0LmlzSWRlbnRpZmllcikgewogICAgICB0b2tlbiA9IGVuc3VyZUlkZW50aWZpZXIodG9rZW4sIElkZW50aWZpZXJDb250ZXh0LmxhYmVsUmVmZXJlbmNlKTsKICAgICAgaGFzVGFyZ2V0ID0gdHJ1ZTsKICAgICAgaWYgKCFpc0NvbnRpbnVlV2l0aExhYmVsQWxsb3dlZCkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgIGNvbnRpbnVlS2V5d29yZCwgZmFzdGEubWVzc2FnZUNvbnRpbnVlT3V0c2lkZU9mTG9vcCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoIWlzQ29udGludWVBbGxvd2VkKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBjb250aW51ZUtleXdvcmQsCiAgICAgICAgICBsb29wU3RhdGUgPT0gTG9vcFN0YXRlLkluc2lkZVN3aXRjaAogICAgICAgICAgICAgID8gZmFzdGEubWVzc2FnZUNvbnRpbnVlV2l0aG91dExhYmVsSW5DYXNlCiAgICAgICAgICAgICAgOiBmYXN0YS5tZXNzYWdlQ29udGludWVPdXRzaWRlT2ZMb29wKTsKICAgIH0KICAgIHRva2VuID0gZW5zdXJlU2VtaWNvbG9uKHRva2VuKTsKICAgIGxpc3RlbmVyLmhhbmRsZUNvbnRpbnVlU3RhdGVtZW50KGhhc1RhcmdldCwgY29udGludWVLZXl3b3JkLCB0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIGVtcHR5U3RhdGVtZW50OgogIC8vLyAgICc7JwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlRW1wdHlTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnOycsIHRva2VuKSk7CiAgICBsaXN0ZW5lci5oYW5kbGVFbXB0eVN0YXRlbWVudCh0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gR2l2ZW4gYSB0b2tlbiAoW2JlZm9yZVRva2VuXSkgdGhhdCBpcyBrbm93biB0byBiZSBiZWZvcmUgYW5vdGhlciBbdG9rZW5dLAogIC8vLyByZXR1cm4gdGhlIHRva2VuIHRoYXQgaXMgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBbdG9rZW5dLgogIFRva2VuIHByZXZpb3VzVG9rZW4oVG9rZW4gYmVmb3JlVG9rZW4sIFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBuZXh0ID0gYmVmb3JlVG9rZW4ubmV4dDsKICAgIHdoaWxlIChuZXh0ICE9IHRva2VuICYmIG5leHQgIT0gYmVmb3JlVG9rZW4pIHsKICAgICAgYmVmb3JlVG9rZW4gPSBuZXh0OwogICAgICBuZXh0ID0gYmVmb3JlVG9rZW4ubmV4dDsKICAgIH0KICAgIHJldHVybiBiZWZvcmVUb2tlbjsKICB9CgogIC8vLyBSZWNvdmVyIGZyb20gZmluZGluZyBhbiBvcGVyYXRvciBkZWNsYXJhdGlvbiBtaXNzaW5nIHRoZSBgb3BlcmF0b3JgCiAgLy8vIGtleXdvcmQuIFRoZSBtZXRhZGF0YSBmb3IgdGhlIG1lbWJlciwgaWYgYW55LCBoYXMgYWxyZWFkeSBiZWVuIHBhcnNlZAogIC8vLyAoYW5kIGV2ZW50cyBoYXZlIGFscmVhZHkgYmVlbiBnZW5lcmF0ZWQpLgogIFRva2VuIHBhcnNlSW52YWxpZE9wZXJhdG9yRGVjbGFyYXRpb24oCiAgICAgIFRva2VuIGJlZm9yZVN0YXJ0LAogICAgICBUb2tlbiBleHRlcm5hbFRva2VuLAogICAgICBUb2tlbiBzdGF0aWNUb2tlbiwKICAgICAgVG9rZW4gY292YXJpYW50VG9rZW4sCiAgICAgIFRva2VuIHZhckZpbmFsT3JDb25zdCwKICAgICAgVG9rZW4gYmVmb3JlVHlwZSkgewogICAgVHlwZUluZm8gdHlwZUluZm8gPSBjb21wdXRlVHlwZShiZWZvcmVUeXBlLCB0cnVlLCB0cnVlKTsKCiAgICBUb2tlbiBiZWZvcmVOYW1lID0gdHlwZUluZm8uc2tpcFR5cGUoYmVmb3JlVHlwZSk7CiAgICBUb2tlbiBuZXh0ID0gYmVmb3JlTmFtZS5uZXh0OwoKICAgIGlmIChvcHRpb25hbCgnb3BlcmF0b3InLCBuZXh0KSkgewogICAgICBuZXh0ID0gbmV4dC5uZXh0OwogICAgfSBlbHNlIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBmYXN0YS5tZXNzYWdlTWlzc2luZ09wZXJhdG9yS2V5d29yZCk7CiAgICAgIHJld3JpdGVyLmluc2VydFRva2VuKAogICAgICAgICAgYmVmb3JlTmFtZSwgbmV3IFN5bnRoZXRpY1Rva2VuKEtleXdvcmQuT1BFUkFUT1IsIG5leHQub2Zmc2V0KSk7CiAgICB9CgogICAgYXNzZXJ0KChuZXh0LmlzT3BlcmF0b3IgJiYgbmV4dC5lbmRHcm91cCA9PSBudWxsKSB8fAogICAgICAgIG9wdGlvbmFsKCc9PT0nLCBuZXh0KSB8fAogICAgICAgIG9wdGlvbmFsKCchPT0nLCBuZXh0KSk7CgogICAgVG9rZW4gdG9rZW4gPSBwYXJzZU1ldGhvZCgKICAgICAgICBiZWZvcmVTdGFydCwKICAgICAgICBleHRlcm5hbFRva2VuLAogICAgICAgIHN0YXRpY1Rva2VuLAogICAgICAgIGNvdmFyaWFudFRva2VuLAogICAgICAgIHZhckZpbmFsT3JDb25zdCwKICAgICAgICBiZWZvcmVUeXBlLAogICAgICAgIHR5cGVJbmZvLAogICAgICAgIG51bGwsCiAgICAgICAgYmVmb3JlTmFtZS5uZXh0KTsKICAgIGxpc3RlbmVyLmVuZE1lbWJlcigpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFJlY292ZXIgZnJvbSBmaW5kaW5nIGFuIGludmFsaWQgY2xhc3MgbWVtYmVyLiBUaGUgbWV0YWRhdGEgZm9yIHRoZSBtZW1iZXIsCiAgLy8vIGlmIGFueSwgaGFzIGFscmVhZHkgYmVlbiBwYXJzZWQgKGFuZCBldmVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gZ2VuZXJhdGVkKS4KICAvLy8gVGhlIG1lbWJlciB3YXMgZXhwZWN0ZWQgdG8gc3RhcnQgd2l0aCB0aGUgdG9rZW4gYWZ0ZXIgW3Rva2VuXS4KICBUb2tlbiByZWNvdmVyRnJvbUludmFsaWRDbGFzc01lbWJlcigKICAgICAgVG9rZW4gdG9rZW4sCiAgICAgIFRva2VuIGJlZm9yZVN0YXJ0LAogICAgICBUb2tlbiBleHRlcm5hbFRva2VuLAogICAgICBUb2tlbiBzdGF0aWNUb2tlbiwKICAgICAgVG9rZW4gY292YXJpYW50VG9rZW4sCiAgICAgIFRva2VuIHZhckZpbmFsT3JDb25zdCwKICAgICAgVG9rZW4gYmVmb3JlVHlwZSwKICAgICAgVHlwZUluZm8gdHlwZUluZm8sCiAgICAgIFRva2VuIGdldE9yU2V0KSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIFN0cmluZyB2YWx1ZSA9IG5leHQuc3RyaW5nVmFsdWU7CgogICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2NsYXNzJykpIHsKICAgICAgcmV0dXJuIHJlcG9ydEFuZFNraXBDbGFzc0luQ2xhc3MobmV4dCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2VudW0nKSkgewogICAgICByZXR1cm4gcmVwb3J0QW5kU2tpcEVudW1JbkNsYXNzKG5leHQpOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICd0eXBlZGVmJykpIHsKICAgICAgcmV0dXJuIHJlcG9ydEFuZFNraXBUeXBlZGVmSW5DbGFzcyhuZXh0KTsKICAgIH0gZWxzZSBpZiAobmV4dC5pc09wZXJhdG9yICYmIG5leHQuZW5kR3JvdXAgPT0gbnVsbCkgewogICAgICByZXR1cm4gcGFyc2VJbnZhbGlkT3BlcmF0b3JEZWNsYXJhdGlvbihiZWZvcmVTdGFydCwgZXh0ZXJuYWxUb2tlbiwKICAgICAgICAgIHN0YXRpY1Rva2VuLCBjb3ZhcmlhbnRUb2tlbiwgdmFyRmluYWxPckNvbnN0LCBiZWZvcmVUeXBlKTsKICAgIH0KCiAgICBpZiAoZ2V0T3JTZXQgIT0gbnVsbCB8fAogICAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJygnKSB8fAogICAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJz0+JykgfHwKICAgICAgICBpZGVudGljYWwodmFsdWUsICd7JykpIHsKICAgICAgdG9rZW4gPSBwYXJzZU1ldGhvZCgKICAgICAgICAgIGJlZm9yZVN0YXJ0LAogICAgICAgICAgZXh0ZXJuYWxUb2tlbiwKICAgICAgICAgIHN0YXRpY1Rva2VuLAogICAgICAgICAgY292YXJpYW50VG9rZW4sCiAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QsCiAgICAgICAgICBiZWZvcmVUeXBlLAogICAgICAgICAgdHlwZUluZm8sCiAgICAgICAgICBnZXRPclNldCwKICAgICAgICAgIHRva2VuLm5leHQpOwogICAgfSBlbHNlIGlmICh0b2tlbiA9PSBiZWZvcmVTdGFydCkgewogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogUHJvdmlkZSBhIG1vcmUgc3BlY2lmaWMgZXJyb3IgbWVzc2FnZSBmb3IgZXh0cmEgJzsnLgogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKG5leHQsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRDbGFzc01lbWJlcik7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUludmFsaWRNZW1iZXIobmV4dCk7CiAgICAgIGlmICghaWRlbnRpY2FsKHZhbHVlLCAnfScpKSB7CiAgICAgICAgLy8gRW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MuCiAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0b2tlbiA9IHBhcnNlRmllbGRzKAogICAgICAgICAgYmVmb3JlU3RhcnQsCiAgICAgICAgICBleHRlcm5hbFRva2VuLAogICAgICAgICAgc3RhdGljVG9rZW4sCiAgICAgICAgICBjb3ZhcmlhbnRUb2tlbiwKICAgICAgICAgIHZhckZpbmFsT3JDb25zdCwKICAgICAgICAgIGJlZm9yZVR5cGUsCiAgICAgICAgICB0eXBlSW5mbywKICAgICAgICAgIHRva2VuLm5leHQsCiAgICAgICAgICBmYWxzZSk7CiAgICB9CgogICAgbGlzdGVuZXIuZW5kTWVtYmVyKCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gUmVwb3J0IHRoYXQgdGhlIG5lc3RpbmcgZGVwdGggb2YgdGhlIGNvZGUgYmVpbmcgcGFyc2VkIGlzIHRvbyBsYXJnZSBmb3IKICAvLy8gdGhlIHBhcnNlciB0byBzYWZlbHkgaGFuZGxlLiBSZXR1cm4gdGhlIG5leHQgYH1gIG9yIEVPRi4KICBUb2tlbiByZWNvdmVyRnJvbVN0YWNrT3ZlcmZsb3coVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBmYXN0YS5tZXNzYWdlU3RhY2tPdmVyZmxvdyk7CgogICAgbmV4dCA9IG5ldyBTeW50aGV0aWNUb2tlbihUb2tlblR5cGUuU0VNSUNPTE9OLCB0b2tlbi5vZmZzZXQpOwogICAgcmV3cml0ZXIuaW5zZXJ0VG9rZW4odG9rZW4sIG5leHQpOwogICAgbGlzdGVuZXIuaGFuZGxlRW1wdHlTdGF0ZW1lbnQobmV4dCk7CgogICAgd2hpbGUgKG5vdEVvZk9yVmFsdWUoJ30nLCBuZXh0KSkgewogICAgICB0b2tlbiA9IG5leHQ7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgdm9pZCByZXBvcnRSZWNvdmVyYWJsZUVycm9yKFRva2VuIHRva2VuLCBNZXNzYWdlIG1lc3NhZ2UpIHsKICAgIC8vIEZpbmQgYSBub24tc3ludGhldGljIHRva2VuIG9uIHdoaWNoIHRvIHJlcG9ydCB0aGUgZXJyb3IuCiAgICB0b2tlbiA9IGZpbmROb25aZXJvTGVuZ3RoVG9rZW4odG9rZW4pOwogICAgaWYgKHRva2VuIGlzIEVycm9yVG9rZW4pIHsKICAgICAgcmVwb3J0RXJyb3JUb2tlbih0b2tlbik7CiAgICB9IGVsc2UgewogICAgICBsaXN0ZW5lci5oYW5kbGVSZWNvdmVyYWJsZUVycm9yKG1lc3NhZ2UsIHRva2VuLCB0b2tlbik7CiAgICB9CiAgfQoKICB2b2lkIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgIFRva2VuIHRva2VuLCBUZW1wbGF0ZTxfTWVzc2FnZVdpdGhBcmd1bWVudDxUb2tlbj4+IHRlbXBsYXRlKSB7CiAgICAvLyBGaW5kIGEgbm9uLXN5bnRoZXRpYyB0b2tlbiBvbiB3aGljaCB0byByZXBvcnQgdGhlIGVycm9yLgogICAgdG9rZW4gPSBmaW5kTm9uWmVyb0xlbmd0aFRva2VuKHRva2VuKTsKICAgIGlmICh0b2tlbiBpcyBFcnJvclRva2VuKSB7CiAgICAgIHJlcG9ydEVycm9yVG9rZW4odG9rZW4pOwogICAgfSBlbHNlIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlUmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIHRlbXBsYXRlLndpdGhBcmd1bWVudHModG9rZW4pLCB0b2tlbiwgdG9rZW4pOwogICAgfQogIH0KCiAgdm9pZCByZXBvcnRFcnJvclRva2VuKEVycm9yVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyLmhhbmRsZUVycm9yVG9rZW4odG9rZW4pOwogIH0KCiAgVG9rZW4gcGFyc2VJbnZhbGlkVG9wTGV2ZWxEZWNsYXJhdGlvbihUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgIG5leHQsCiAgICAgICAgb3B0aW9uYWwoJzsnLCBuZXh0KQogICAgICAgICAgICA/IGZhc3RhLnRlbXBsYXRlVW5leHBlY3RlZFRva2VuCiAgICAgICAgICAgIDogZmFzdGEudGVtcGxhdGVFeHBlY3RlZERlY2xhcmF0aW9uKTsKICAgIGlmIChvcHRpb25hbCgneycsIG5leHQpKSB7CiAgICAgIG5leHQgPSBwYXJzZUludmFsaWRCbG9jayh0b2tlbik7CiAgICB9CiAgICBsaXN0ZW5lci5oYW5kbGVJbnZhbGlkVG9wTGV2ZWxEZWNsYXJhdGlvbihuZXh0KTsKICAgIHJldHVybiBuZXh0OwogIH0KCiAgVG9rZW4gcmVwb3J0QW5kU2tpcENsYXNzSW5DbGFzcyhUb2tlbiB0b2tlbikgewogICAgYXNzZXJ0KG9wdGlvbmFsKCdjbGFzcycsIHRva2VuKSk7CiAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLCBmYXN0YS5tZXNzYWdlQ2xhc3NJbkNsYXNzKTsKICAgIGxpc3RlbmVyLmhhbmRsZUludmFsaWRNZW1iZXIodG9rZW4pOwogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICAvLyBJZiB0aGUgZGVjbGFyYXRpb24gYXBwZWFycyB0byBiZSBhIHZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uCiAgICAvLyB0aGVuIHNraXAgdGhlIGVudGlyZSBkZWNsYXJhdGlvbiBzbyB0aGF0IHdlIG9ubHkgZ2VuZXJhdGUgdGhlIG9uZQogICAgLy8gZXJyb3IgKGFib3ZlKSByYXRoZXIgdGhhbiBhIHBsZXRob3JhIG9mIHVuaGVscGZ1bCBlcnJvcnMuCiAgICBpZiAobmV4dC5pc0lkZW50aWZpZXIpIHsKICAgICAgLy8gc2tpcCBjbGFzcyBuYW1lCiAgICAgIHRva2VuID0gbmV4dDsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBjb25zaWRlciBwYXJzaW5nIChza2lwcGluZykgdGhlIGNsYXNzIGhlYWRlcgogICAgICAvLyB3aXRoIGEgcmVjb3ZlcnkgbGlzdGVuZXIgc28gdGhhdCBubyBldmVudHMgYXJlIGdlbmVyYXRlZAogICAgICBpZiAob3B0aW9uYWwoJ3snLCBuZXh0KSAmJiBuZXh0LmVuZEdyb3VwICE9IG51bGwpIHsKICAgICAgICAvLyBza2lwIGNsYXNzIGJvZHkKICAgICAgICB0b2tlbiA9IG5leHQuZW5kR3JvdXA7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHJlcG9ydEFuZFNraXBFbnVtSW5DbGFzcyhUb2tlbiB0b2tlbikgewogICAgYXNzZXJ0KG9wdGlvbmFsKCdlbnVtJywgdG9rZW4pKTsKICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4sIGZhc3RhLm1lc3NhZ2VFbnVtSW5DbGFzcyk7CiAgICBsaXN0ZW5lci5oYW5kbGVJbnZhbGlkTWVtYmVyKHRva2VuKTsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgLy8gSWYgdGhlIGRlY2xhcmF0aW9uIGFwcGVhcnMgdG8gYmUgYSB2YWxpZCBlbnVtIGRlY2xhcmF0aW9uCiAgICAvLyB0aGVuIHNraXAgdGhlIGVudGlyZSBkZWNsYXJhdGlvbiBzbyB0aGF0IHdlIG9ubHkgZ2VuZXJhdGUgdGhlIG9uZQogICAgLy8gZXJyb3IgKGFib3ZlKSByYXRoZXIgdGhhbiBhIHBsZXRob3JhIG9mIHVuaGVscGZ1bCBlcnJvcnMuCiAgICBpZiAobmV4dC5pc0lkZW50aWZpZXIpIHsKICAgICAgLy8gc2tpcCBlbnVtIG5hbWUKICAgICAgdG9rZW4gPSBuZXh0OwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKG9wdGlvbmFsKCd7JywgbmV4dCkgJiYgbmV4dC5lbmRHcm91cCAhPSBudWxsKSB7CiAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IENvbnNpZGVyIHJlcGxhY2luZyB0aGlzIGBza2lwIGVudW1gIGZ1bmN0aW9uYWxpdHkKICAgICAgICAvLyB3aXRoIHNvbWV0aGluZyB0aGF0IGNhbiBwYXJzZSBhbmQgcmVzb2x2ZSB0aGUgZGVjbGFyYXRpb24KICAgICAgICAvLyBldmVuIHRob3VnaCBpdCBpcyBpbiBhIGNsYXNzIGNvbnRleHQKICAgICAgICB0b2tlbiA9IG5leHQuZW5kR3JvdXA7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHJlcG9ydEFuZFNraXBUeXBlZGVmSW5DbGFzcyhUb2tlbiB0b2tlbikgewogICAgYXNzZXJ0KG9wdGlvbmFsKCd0eXBlZGVmJywgdG9rZW4pKTsKICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4sIGZhc3RhLm1lc3NhZ2VUeXBlZGVmSW5DbGFzcyk7CiAgICBsaXN0ZW5lci5oYW5kbGVJbnZhbGlkTWVtYmVyKHRva2VuKTsKICAgIC8vIFRPRE8oYnJpYW53aWxrZXJzb24pOiBJZiB0aGUgZGVjbGFyYXRpb24gYXBwZWFycyB0byBiZSBhIHZhbGlkIHR5cGVkZWYKICAgIC8vIHRoZW4gc2tpcCB0aGUgZW50aXJlIGRlY2xhcmF0aW9uIHNvIHRoYXQgd2UgZ2VuZXJhdGUgYSBzaW5nbGUgZXJyb3IKICAgIC8vIChhYm92ZSkgcmF0aGVyIHRoYW4gbWFueSB1bmhlbHBmdWwgZXJyb3JzLgogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIENyZWF0ZSBhIHNob3J0IHRva2VuIGNoYWluIGZyb20gdGhlIFtiZWdpblRva2VuXSBhbmQgW2VuZFRva2VuXSBhbmQgcmV0dXJuCiAgLy8vIHRoZSBbYmVnaW5Ub2tlbl0uCiAgVG9rZW4gbGluayhCZWdpblRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBiZWdpblRva2VuLnNldE5leHQoZW5kVG9rZW4pOwogICAgYmVnaW5Ub2tlbi5lbmRHcm91cCA9IGVuZFRva2VuOwogICAgcmV0dXJuIGJlZ2luVG9rZW47CiAgfQoKICAvLy8gQ3JlYXRlIGFuZCByZXR1cm4gYSB0b2tlbiB3aG9zZSBuZXh0IHRva2VuIGlzIHRoZSBnaXZlbiBbdG9rZW5dLgogIFRva2VuIHN5bnRoZXRpY1ByZXZpb3VzVG9rZW4oVG9rZW4gdG9rZW4pIHsKICAgIC8vIFJldHVybiB0aGUgcHJldmlvdXMgdG9rZW4gaWYgdGhlcmUgaXMgb25lIHNvIHRoYXQgYW55IHRva2VuIGluc2VydGVkCiAgICAvLyBiZWZvcmUgYHRva2VuYCB3aWxsIGJlIHByb3Blcmx5IGluc2VydGVkIGludG8gdGhlIHRva2VuIHN0cmVhbS4KICAgIC8vIFRPRE8oZGFucnViZWwpOiByZW1vdmUgdGhpcyBvbmNlIGFsbCBtZXRob2RzIGhhdmUgYmVlbiBjb252ZXJ0ZWQgdG8KICAgIC8vIHVzZSBhbmQgcmV0dXJuIHRoZSBsYXN0IHRva2VuIGNvbnN1bWVkIGFuZCB0aGUgYHByZXZpb3VzYCBmaWVsZAogICAgLy8gaGFzIGJlZW4gcmVtb3ZlZC4KICAgIGlmICh0b2tlbi5wcmV2aW91cyAhPSBudWxsKSB7CiAgICAgIHJldHVybiB0b2tlbi5wcmV2aW91czsKICAgIH0KICAgIFRva2VuIGJlZm9yZSA9IG5ldyBUb2tlbi5lb2YoLTEpOwogICAgYmVmb3JlLm5leHQgPSB0b2tlbjsKICAgIHJldHVybiBiZWZvcmU7CiAgfQoKICAvLy8gUmV0dXJuIHRoZSBmaXJzdCBkYXJ0ZG9jIGNvbW1lbnQgdG9rZW4gcHJlY2VkaW5nIHRoZSBnaXZlbiB0b2tlbgogIC8vLyBvciBgbnVsbGAgaWYgbm8gZGFydGRvYyB0b2tlbiBpcyBmb3VuZC4KICBUb2tlbiBmaW5kRGFydERvYyhUb2tlbiB0b2tlbikgewogICAgVG9rZW4gY29tbWVudHMgPSB0b2tlbi5wcmVjZWRpbmdDb21tZW50czsKICAgIFRva2VuIGRhcnRkb2MgPSBudWxsOwogICAgYm9vbCBpc011bHRpbGluZSA9IGZhbHNlOwogICAgd2hpbGUgKGNvbW1lbnRzICE9IG51bGwpIHsKICAgICAgU3RyaW5nIGxleGVtZSA9IGNvbW1lbnRzLmxleGVtZTsKICAgICAgaWYgKGxleGVtZS5zdGFydHNXaXRoKCcvLy8nKSkgewogICAgICAgIGlmICghaXNNdWx0aWxpbmUpIHsKICAgICAgICAgIGRhcnRkb2MgPSBjb21tZW50czsKICAgICAgICAgIGlzTXVsdGlsaW5lID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobGV4ZW1lLnN0YXJ0c1dpdGgoJy8qKicpKSB7CiAgICAgICAgZGFydGRvYyA9IGNvbW1lbnRzOwogICAgICAgIGlzTXVsdGlsaW5lID0gZmFsc2U7CiAgICAgIH0KICAgICAgY29tbWVudHMgPSBjb21tZW50cy5uZXh0OwogICAgfQogICAgcmV0dXJuIGRhcnRkb2M7CiAgfQoKICAvLy8gUGFyc2UgdGhlIGNvbW1lbnQgcmVmZXJlbmNlcyBpbiBhIHNlcXVlbmNlIG9mIGNvbW1lbnQgdG9rZW5zCiAgLy8vIHdoZXJlIFtkYXJ0ZG9jXSAobm90IG51bGwpIGlzIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgc2VxdWVuY2UuCiAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGNvbW1lbnQgcmVmZXJlbmNlcyBwYXJzZWQuCiAgaW50IHBhcnNlQ29tbWVudFJlZmVyZW5jZXMoVG9rZW4gZGFydGRvYykgewogICAgcmV0dXJuIGRhcnRkb2MubGV4ZW1lLnN0YXJ0c1dpdGgoJy8vLycpCiAgICAgICAgPyBwYXJzZVJlZmVyZW5jZXNJblNpbmdsZUxpbmVDb21tZW50cyhkYXJ0ZG9jKQogICAgICAgIDogcGFyc2VSZWZlcmVuY2VzSW5NdWx0aUxpbmVDb21tZW50KGRhcnRkb2MpOwogIH0KCiAgLy8vIFBhcnNlIHRoZSBjb21tZW50IHJlZmVyZW5jZXMgaW4gYSBtdWx0aS1saW5lIGNvbW1lbnQgdG9rZW4uCiAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGNvbW1lbnQgcmVmZXJlbmNlcyBwYXJzZWQuCiAgaW50IHBhcnNlUmVmZXJlbmNlc0luTXVsdGlMaW5lQ29tbWVudChUb2tlbiBtdWx0aUxpbmVEb2MpIHsKICAgIFN0cmluZyBjb21tZW50ID0gbXVsdGlMaW5lRG9jLmxleGVtZTsKICAgIGFzc2VydChjb21tZW50LnN0YXJ0c1dpdGgoJy8qKicpKTsKICAgIGludCBjb3VudCA9IDA7CiAgICBpbnQgbGVuZ3RoID0gY29tbWVudC5sZW5ndGg7CiAgICBpbnQgc3RhcnQgPSAzOwogICAgYm9vbCBpbkNvZGVCbG9jayA9IGZhbHNlOwogICAgaW50IGNvZGVCbG9jayA9IGNvbW1lbnQuaW5kZXhPZignYGBgJywgMyk7CiAgICBpZiAoY29kZUJsb2NrID09IC0xKSB7CiAgICAgIGNvZGVCbG9jayA9IGxlbmd0aDsKICAgIH0KICAgIHdoaWxlIChzdGFydCA8IGxlbmd0aCkgewogICAgICBpZiAoaXNXaGl0ZXNwYWNlKGNvbW1lbnQuY29kZVVuaXRBdChzdGFydCkpKSB7CiAgICAgICAgKytzdGFydDsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpbnQgZW5kID0gY29tbWVudC5pbmRleE9mKCdcbicsIHN0YXJ0KTsKICAgICAgaWYgKGVuZCA9PSAtMSkgewogICAgICAgIGVuZCA9IGxlbmd0aDsKICAgICAgfQogICAgICBpZiAoY29kZUJsb2NrIDwgZW5kKSB7CiAgICAgICAgaW5Db2RlQmxvY2sgPSAhaW5Db2RlQmxvY2s7CiAgICAgICAgY29kZUJsb2NrID0gY29tbWVudC5pbmRleE9mKCdgYGAnLCBlbmQpOwogICAgICAgIGlmIChjb2RlQmxvY2sgPT0gLTEpIHsKICAgICAgICAgIGNvZGVCbG9jayA9IGxlbmd0aDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFpbkNvZGVCbG9jayAmJiAhY29tbWVudC5zdGFydHNXaXRoKCcqICAgICAnLCBzdGFydCkpIHsKICAgICAgICBjb3VudCArPSBwYXJzZUNvbW1lbnRSZWZlcmVuY2VzSW5UZXh0KG11bHRpTGluZURvYywgc3RhcnQsIGVuZCk7CiAgICAgIH0KICAgICAgc3RhcnQgPSBlbmQgKyAxOwogICAgfQogICAgcmV0dXJuIGNvdW50OwogIH0KCiAgLy8vIFBhcnNlIHRoZSBjb21tZW50IHJlZmVyZW5jZXMgaW4gYSBzZXF1ZW5jZSBvZiBzaW5nbGUgbGluZSBjb21tZW50IHRva2VucwogIC8vLyB3aGVyZSBbdG9rZW5dIGlzIHRoZSBmaXJzdCBjb21tZW50IHRva2VuIGluIHRoZSBzZXF1ZW5jZS4KICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgY29tbWVudCByZWZlcmVuY2VzIHBhcnNlZC4KICBpbnQgcGFyc2VSZWZlcmVuY2VzSW5TaW5nbGVMaW5lQ29tbWVudHMoVG9rZW4gdG9rZW4pIHsKICAgIGludCBjb3VudCA9IDA7CiAgICBib29sIGluQ29kZUJsb2NrID0gZmFsc2U7CiAgICB3aGlsZSAodG9rZW4gIT0gbnVsbCAmJiAhdG9rZW4uaXNFb2YpIHsKICAgICAgU3RyaW5nIGNvbW1lbnQgPSB0b2tlbi5sZXhlbWU7CiAgICAgIGlmIChjb21tZW50LnN0YXJ0c1dpdGgoJy8vLycpKSB7CiAgICAgICAgaWYgKGNvbW1lbnQuaW5kZXhPZignYGBgJywgMykgIT0gLTEpIHsKICAgICAgICAgIGluQ29kZUJsb2NrID0gIWluQ29kZUJsb2NrOwogICAgICAgIH0KICAgICAgICBpZiAoIWluQ29kZUJsb2NrICYmICFjb21tZW50LnN0YXJ0c1dpdGgoJy8vLyAgICAnKSkgewogICAgICAgICAgY291bnQgKz0gcGFyc2VDb21tZW50UmVmZXJlbmNlc0luVGV4dCh0b2tlbiwgMywgY29tbWVudC5sZW5ndGgpOwogICAgICAgIH0KICAgICAgfQogICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICB9CiAgICByZXR1cm4gY291bnQ7CiAgfQoKICAvLy8gUGFyc2UgdGhlIGNvbW1lbnQgcmVmZXJlbmNlcyBpbiB0aGUgdGV4dCBiZXR3ZWVuIFtzdGFydF0gaW5jbHVzaXZlCiAgLy8vIGFuZCBbZW5kXSBleGNsdXNpdmUuIFJldHVybiBhIGNvdW50IGluZGljYXRpbmcgaG93IG1hbnkgd2VyZSBwYXJzZWQuCiAgaW50IHBhcnNlQ29tbWVudFJlZmVyZW5jZXNJblRleHQoVG9rZW4gY29tbWVudFRva2VuLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIFN0cmluZyBjb21tZW50ID0gY29tbWVudFRva2VuLmxleGVtZTsKICAgIGludCBjb3VudCA9IDA7CiAgICBpbnQgaW5kZXggPSBzdGFydDsKICAgIHdoaWxlIChpbmRleCA8IGVuZCkgewogICAgICBpbnQgY2ggPSBjb21tZW50LmNvZGVVbml0QXQoaW5kZXgpOwogICAgICBpZiAoY2ggPT0gMHg1QiAvKiBgW2AgKi8pIHsKICAgICAgICArK2luZGV4OwogICAgICAgIGlmIChpbmRleCA8IGVuZCAmJiBjb21tZW50LmNvZGVVbml0QXQoaW5kZXgpID09IDB4M0EgLyogYDpgICovKSB7CiAgICAgICAgICAvLyBTa2lwIG9sZC1zdHlsZSBjb2RlIGJsb2NrLgogICAgICAgICAgaW5kZXggPSBjb21tZW50LmluZGV4T2YoJzpdJywgaW5kZXggKyAxKSArIDE7CiAgICAgICAgICBpZiAoaW5kZXggPT0gMCB8fCBpbmRleCA+IGVuZCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW50IHJlZmVyZW5jZVN0YXJ0ID0gaW5kZXg7CiAgICAgICAgICBpbmRleCA9IGNvbW1lbnQuaW5kZXhPZignXScsIGluZGV4KTsKICAgICAgICAgIGlmIChpbmRleCA9PSAtMSB8fCBpbmRleCA+PSBlbmQpIHsKICAgICAgICAgICAgLy8gUmVjb3Zlcnk6IHRlcm1pbmF0aW5nICddJyBpcyBub3QgdHlwZWQgeWV0LgogICAgICAgICAgICBpbmRleCA9IGZpbmRSZWZlcmVuY2VFbmQoY29tbWVudCwgcmVmZXJlbmNlU3RhcnQsIGVuZCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoY2ggIT0gMHgyNyAvKiBgJ2AgKi8gJiYgY2ggIT0gMHgyMiAvKiBgImAgKi8pIHsKICAgICAgICAgICAgaWYgKGlzTGlua1RleHQoY29tbWVudCwgaW5kZXgpKSB7CiAgICAgICAgICAgICAgLy8gVE9ETyhicmlhbndpbGtlcnNvbikgSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZXJlJ3MgYSBsaWJyYXJ5CiAgICAgICAgICAgICAgLy8gVVJJIGluIHRoZSBsaW5rIHRleHQuCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbGlzdGVuZXIuaGFuZGxlQ29tbWVudFJlZmVyZW5jZVRleHQoCiAgICAgICAgICAgICAgICAgIGNvbW1lbnQuc3Vic3RyaW5nKHJlZmVyZW5jZVN0YXJ0LCBpbmRleCksCiAgICAgICAgICAgICAgICAgIGNvbW1lbnRUb2tlbi5jaGFyT2Zmc2V0ICsgcmVmZXJlbmNlU3RhcnQpOwogICAgICAgICAgICAgICsrY291bnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY2ggPT0gMHg2MCAvKiAnYCcgKi8pIHsKICAgICAgICAvLyBTa2lwIGlubGluZSBjb2RlIGJsb2NrIGlmIHRoZXJlIGlzIGJvdGggc3RhcnRpbmcgJ2AnIGFuZCBlbmRpbmcgJ2AnCiAgICAgICAgaW50IGVuZENvZGVCbG9jayA9IGNvbW1lbnQuaW5kZXhPZignYCcsIGluZGV4ICsgMSk7CiAgICAgICAgaWYgKGVuZENvZGVCbG9jayAhPSAtMSAmJiBlbmRDb2RlQmxvY2sgPCBlbmQpIHsKICAgICAgICAgIGluZGV4ID0gZW5kQ29kZUJsb2NrOwogICAgICAgIH0KICAgICAgfQogICAgICArK2luZGV4OwogICAgfQogICAgcmV0dXJuIGNvdW50OwogIH0KCiAgLy8vIEdpdmVuIGEgY29tbWVudCByZWZlcmVuY2Ugd2l0aG91dCBhIGNsb3NpbmcgYF1gLAogIC8vLyBzZWFyY2ggZm9yIGEgcG9zc2libGUgcGxhY2Ugd2hlcmUgYF1gIHNob3VsZCBiZS4KICBpbnQgZmluZFJlZmVyZW5jZUVuZChTdHJpbmcgY29tbWVudCwgaW50IGluZGV4LCBpbnQgZW5kKSB7CiAgICAvLyBGaW5kIHRoZSBlbmQgb2YgdGhlIGlkZW50aWZpZXIgaWYgdGhlcmUgaXMgb25lCiAgICBpZiAoaW5kZXggPj0gZW5kIHx8ICFpc0xldHRlcihjb21tZW50LmNvZGVVbml0QXQoaW5kZXgpKSkgewogICAgICByZXR1cm4gaW5kZXg7CiAgICB9CiAgICB3aGlsZSAoaW5kZXggPCBlbmQgJiYgaXNMZXR0ZXJPckRpZ2l0KGNvbW1lbnQuY29kZVVuaXRBdChpbmRleCkpKSB7CiAgICAgICsraW5kZXg7CiAgICB9CgogICAgLy8gQ2hlY2sgZm9yIGEgdHJhaWxpbmcgYC5gCiAgICBpZiAoaW5kZXggPj0gZW5kIHx8IGNvbW1lbnQuY29kZVVuaXRBdChpbmRleCkgIT0gMHgyRSAvKiBgLmAgKi8pIHsKICAgICAgcmV0dXJuIGluZGV4OwogICAgfQogICAgKytpbmRleDsKCiAgICAvLyBGaW5kIGVuZCBvZiB0aGUgaWRlbnRpZmllciBhZnRlciB0aGUgYC5gCiAgICBpZiAoaW5kZXggPj0gZW5kIHx8ICFpc0xldHRlcihjb21tZW50LmNvZGVVbml0QXQoaW5kZXgpKSkgewogICAgICByZXR1cm4gaW5kZXg7CiAgICB9CiAgICArK2luZGV4OwogICAgd2hpbGUgKGluZGV4IDwgZW5kICYmIGlzTGV0dGVyT3JEaWdpdChjb21tZW50LmNvZGVVbml0QXQoaW5kZXgpKSkgewogICAgICArK2luZGV4OwogICAgfQogICAgcmV0dXJuIGluZGV4OwogIH0KCiAgLy8vIFBhcnNlIHRoZSB0b2tlbnMgaW4gYSBzaW5nbGUgY29tbWVudCByZWZlcmVuY2UgYW5kIGdlbmVyYXRlIGVpdGhlciBhCiAgLy8vIGBoYW5kbGVDb21tZW50UmVmZXJlbmNlYCBvciBgaGFuZGxlTm9Db21tZW50UmVmZXJlbmNlYCBldmVudC4KICAvLy8gUmV0dXJuIGB0cnVlYCBpZiBhIGNvbW1lbnQgcmVmZXJlbmNlIHdhcyBzdWNjZXNzZnVsbHkgcGFyc2VkLgogIGJvb2wgcGFyc2VPbmVDb21tZW50UmVmZXJlbmNlKFRva2VuIHRva2VuLCBpbnQgcmVmZXJlbmNlT2Zmc2V0KSB7CiAgICBUb2tlbiBiZWdpbiA9IHRva2VuOwogICAgVG9rZW4gbmV3S2V5d29yZCA9IG51bGw7CiAgICBpZiAob3B0aW9uYWwoJ25ldycsIHRva2VuKSkgewogICAgICBuZXdLZXl3b3JkID0gdG9rZW47CiAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIH0KICAgIFRva2VuIHByZWZpeCwgcGVyaW9kOwogICAgaWYgKHRva2VuLmlzSWRlbnRpZmllciAmJiBvcHRpb25hbCgnLicsIHRva2VuLm5leHQpKSB7CiAgICAgIHByZWZpeCA9IHRva2VuOwogICAgICBwZXJpb2QgPSB0b2tlbi5uZXh0OwogICAgICB0b2tlbiA9IHBlcmlvZC5uZXh0OwogICAgfQogICAgaWYgKHRva2VuLmlzRW9mKSB7CiAgICAgIC8vIFJlY292ZXJ5OiBJbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciBmb3IgY29kZSBjb21wbGV0aW9uCiAgICAgIHRva2VuID0gcmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcigKICAgICAgICAgIHBlcmlvZCA/PyBuZXdLZXl3b3JkID8/IHN5bnRoZXRpY1ByZXZpb3VzVG9rZW4odG9rZW4pKTsKICAgICAgaWYgKGJlZ2luID09IHRva2VuLm5leHQpIHsKICAgICAgICBiZWdpbiA9IHRva2VuOwogICAgICB9CiAgICB9CiAgICBUb2tlbiBvcGVyYXRvcktleXdvcmQgPSBudWxsOwogICAgaWYgKG9wdGlvbmFsKCdvcGVyYXRvcicsIHRva2VuKSkgewogICAgICBvcGVyYXRvcktleXdvcmQgPSB0b2tlbjsKICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgfQogICAgaWYgKHRva2VuLmlzVXNlckRlZmluYWJsZU9wZXJhdG9yKSB7CiAgICAgIGlmICh0b2tlbi5uZXh0LmlzRW9mKSB7CiAgICAgICAgcGFyc2VPbmVDb21tZW50UmVmZXJlbmNlUmVzdCgKICAgICAgICAgICAgYmVnaW4sIHJlZmVyZW5jZU9mZnNldCwgbmV3S2V5d29yZCwgcHJlZml4LCBwZXJpb2QsIHRva2VuKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdG9rZW4gPSBvcGVyYXRvcktleXdvcmQgPz8gdG9rZW47CiAgICAgIGlmICh0b2tlbi5uZXh0LmlzRW9mKSB7CiAgICAgICAgaWYgKHRva2VuLmlzSWRlbnRpZmllcikgewogICAgICAgICAgcGFyc2VPbmVDb21tZW50UmVmZXJlbmNlUmVzdCgKICAgICAgICAgICAgICBiZWdpbiwgcmVmZXJlbmNlT2Zmc2V0LCBuZXdLZXl3b3JkLCBwcmVmaXgsIHBlcmlvZCwgdG9rZW4pOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIEtleXdvcmQga2V5d29yZCA9IHRva2VuLmtleXdvcmQ7CiAgICAgICAgaWYgKG5ld0tleXdvcmQgPT0gbnVsbCAmJgogICAgICAgICAgICBwcmVmaXggPT0gbnVsbCAmJgogICAgICAgICAgICAoa2V5d29yZCA9PSBLZXl3b3JkLlRISVMgfHwKICAgICAgICAgICAgICAgIGtleXdvcmQgPT0gS2V5d29yZC5OVUxMIHx8CiAgICAgICAgICAgICAgICBrZXl3b3JkID09IEtleXdvcmQuVFJVRSB8fAogICAgICAgICAgICAgICAga2V5d29yZCA9PSBLZXl3b3JkLkZBTFNFKSkgewogICAgICAgICAgLy8gVE9ETyhicmlhbndpbGtlcnNvbikgSWYgd2Ugd2FudCB0byBzdXBwb3J0IHRoaXMgd2Ugd2lsbCBuZWVkIHRvCiAgICAgICAgICAvLyBleHRlbmQgdGhlIGRlZmluaXRpb24gb2YgQ29tbWVudFJlZmVyZW5jZSB0byB0YWtlIGFuIGV4cHJlc3Npb24KICAgICAgICAgIC8vIHJhdGhlciB0aGFuIGFuIGlkZW50aWZpZXIuIEZvciBub3cgd2UganVzdCBpZ25vcmUgaXQgdG8gcmVkdWNlIHRoZQogICAgICAgICAgLy8gbnVtYmVyIG9mIGVycm9ycyBwcm9kdWNlZCwgYnV0IHRoYXQncyBwcm9iYWJseSBub3QgYSB2YWxpZCBsb25nCiAgICAgICAgICAvLyB0ZXJtIGFwcHJvYWNoLgogICAgICAgIH0KICAgICAgfQogICAgfQogICAgbGlzdGVuZXIuaGFuZGxlTm9Db21tZW50UmVmZXJlbmNlKCk7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICB2b2lkIHBhcnNlT25lQ29tbWVudFJlZmVyZW5jZVJlc3QoCiAgICAgIFRva2VuIGJlZ2luLAogICAgICBpbnQgcmVmZXJlbmNlT2Zmc2V0LAogICAgICBUb2tlbiBuZXdLZXl3b3JkLAogICAgICBUb2tlbiBwcmVmaXgsCiAgICAgIFRva2VuIHBlcmlvZCwKICAgICAgVG9rZW4gaWRlbnRpZmllck9yT3BlcmF0b3IpIHsKICAgIC8vIEFkanVzdCB0aGUgdG9rZW4gb2Zmc2V0cyB0byBtYXRjaCB0aGUgZW5jbG9zaW5nIGNvbW1lbnQgdG9rZW4uCiAgICBUb2tlbiB0b2tlbiA9IGJlZ2luOwogICAgZG8gewogICAgICB0b2tlbi5vZmZzZXQgKz0gcmVmZXJlbmNlT2Zmc2V0OwogICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICB9IHdoaWxlICghdG9rZW4uaXNFb2YpOwoKICAgIGxpc3RlbmVyLmhhbmRsZUNvbW1lbnRSZWZlcmVuY2UoCiAgICAgICAgbmV3S2V5d29yZCwgcHJlZml4LCBwZXJpb2QsIGlkZW50aWZpZXJPck9wZXJhdG9yKTsKICB9CgogIC8vLyBHaXZlbiB0aGF0IHdlIGhhdmUganVzdCBmb3VuZCBicmFja2V0ZWQgdGV4dCB3aXRoaW4gdGhlIGdpdmVuIFtjb21tZW50XSwKICAvLy8gbG9vayB0byBzZWUgd2hldGhlciB0aGF0IHRleHQgaXMgKGEpIGZvbGxvd2VkIGJ5IGEgcGFyZW50aGVzaXplZCBsaW5rCiAgLy8vIGFkZHJlc3MsIChiKSBmb2xsb3dlZCBieSBhIGNvbG9uLCBvciAoYykgZm9sbG93ZWQgYnkgb3B0aW9uYWwgd2hpdGVzcGFjZQogIC8vLyBhbmQgYW5vdGhlciBzcXVhcmUgYnJhY2tldC4gVGhlIFtyaWdodEluZGV4XSBpcyB0aGUgaW5kZXggb2YgdGhlIHJpZ2h0CiAgLy8vIGJyYWNrZXQuIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGJyYWNrZXRlZCB0ZXh0IGlzIGZvbGxvd2VkIGJ5IGEgbGluawogIC8vLyBhZGRyZXNzLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCB1c2VzIHRoZSBzeW50YXggZGVzY3JpYmVkIGJ5IHRoZQogIC8vLyA8YSBocmVmPSJodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duL3N5bnRheCI+bWFya2Rvd248L2E+CiAgLy8vIHByb2plY3QuCiAgYm9vbCBpc0xpbmtUZXh0KFN0cmluZyBjb21tZW50LCBpbnQgcmlnaHRJbmRleCkgewogICAgaW50IGxlbmd0aCA9IGNvbW1lbnQubGVuZ3RoOwogICAgaW50IGluZGV4ID0gcmlnaHRJbmRleCArIDE7CiAgICBpZiAoaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGludCBjaCA9IGNvbW1lbnQuY29kZVVuaXRBdChpbmRleCk7CiAgICBpZiAoY2ggPT0gMHgyOCB8fCBjaCA9PSAweDNBKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgd2hpbGUgKGlzV2hpdGVzcGFjZShjaCkpIHsKICAgICAgaW5kZXggPSBpbmRleCArIDE7CiAgICAgIGlmIChpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgY2ggPSBjb21tZW50LmNvZGVVbml0QXQoaW5kZXgpOwogICAgfQogICAgcmV0dXJuIGNoID09IDB4NUI7CiAgfQp9CgovLyBUT0RPKGFoZSk6IFJlbW92ZSB3aGVuIGFuYWx5emVyIHN1cHBvcnRzIGdlbmVyYWxpemVkIGZ1bmN0aW9uIHN5bnRheC4KdHlwZWRlZiBfTWVzc2FnZVdpdGhBcmd1bWVudDxUPiA9IE1lc3NhZ2UgRnVuY3Rpb24oVCk7CpmaAE5OPAEdATUBJwExASIJHxQcHREcGx8dHR8eGBMBKQkaFRYTGBIYFBsaExcSIhojGS8kFgEi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Jgo+SwoIGgYSBAFJS00qExcaKiIRSig4KxMMESYvLTtEDD4uTicVMzw9Fw4MCilPPDggCggPBhIEATc3PTZAFAZIDwYBIEcUBg0BMEAUBg1IDwYSBAFLREREGR0iGhoGGjsWGxsGF0UyQiEXCAYiJx8aBikeJkgVCA0oHiIoShcKKSIeKCsrLU1NUE0cCggGKRIEASUTGxgUFCRGGQknGhwBJTsEAU9MT01JDwYzUA80ISAbFAYoJBMGHxkdFggmBhcEAgFJNwEucGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci9wYXJzZXIuZGFydD1zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvcGFyc2VyL3BhcnNlcl9lcnJvci5kYXJ0g18vLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5wYXJzZXIucGFyc2VyX2Vycm9yOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JyBzaG93IE1lc3NhZ2U7CgppbXBvcnQgJy4uL3NjYW5uZXIuZGFydCcgc2hvdyBUb2tlbjsKCmNsYXNzIFBhcnNlckVycm9yIHsKICAvLy8gQ2hhcmFjdGVyIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgZmlsZSB3aGVyZSB0aGlzIGVycm9yIHN0YXJ0cy4KICBmaW5hbCBpbnQgYmVnaW5PZmZzZXQ7CgogIC8vLyBDaGFyYWN0ZXIgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiBmaWxlIHdoZXJlIHRoaXMgZXJyb3IgZW5kcy4KICBmaW5hbCBpbnQgZW5kT2Zmc2V0OwoKICBmaW5hbCBNZXNzYWdlIG1lc3NhZ2U7CgogIFBhcnNlckVycm9yKHRoaXMuYmVnaW5PZmZzZXQsIHRoaXMuZW5kT2Zmc2V0LCB0aGlzLm1lc3NhZ2UpOwoKICBQYXJzZXJFcnJvci5mcm9tVG9rZW5zKFRva2VuIGJlZ2luLCBUb2tlbiBlbmQsIE1lc3NhZ2UgbWVzc2FnZSkKICAgICAgOiB0aGlzKGJlZ2luLmNoYXJPZmZzZXQsIGVuZC5jaGFyT2Zmc2V0ICsgZW5kLmNoYXJDb3VudCwgbWVzc2FnZSk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJAJHtiZWdpbk9mZnNldH06ICR7bWVzc2FnZS5tZXNzYWdlfVxuJHttZXNzYWdlLnRpcH0iOwp9ChwATk48ASMBKwElARRLGQFJFwEZAT8BQkkBTgIBNHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvcGFyc2VyX2Vycm9yLmRhcnQ3c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3BhcnNlci9hc3NlcnQuZGFydIIkLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEucGFyc2VyLkFzc2VydDsKCi8vLyBTeW50YWN0aWMgZm9ybXMgb2YgYGFzc2VydGAuCi8vLwovLy8gQW4gYXNzZXJ0aW9uIGNhbiBsZWdhbGx5IG9jY3VyIGFzIGEgc3RhdGVtZW50LiBIb3dldmVyLCBhc3NlcnRpb25zIGFyZSBhbHNvCi8vLyBleHBlcmltZW50YWxseSBhbGxvd2VkIGluIGluaXRpYWxpemVycy4gRm9yIGltcHJvdmVkIGVycm9yIHJlY292ZXJ5LCB3ZQovLy8gYWxzbyBhdHRlbXB0IHRvIHBhcnNlIGFzc2VydHMgYXMgZXhwcmVzc2lvbnMuCmVudW0gQXNzZXJ0IHsKICBFeHByZXNzaW9uLAogIEluaXRpYWxpemVyLAogIFN0YXRlbWVudCwKfQoSAE5OPAEdASEEUEwyDg4PDQIBLnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvYXNzZXJ0LmRhcnRGc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3BhcnNlci9mb3JtYWxfcGFyYW1ldGVyX2tpbmQuZGFydILKLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEucGFyc2VyLmZvcm1hbF9wYXJhbWV0ZXJfa2luZDsKCmVudW0gRm9ybWFsUGFyYW1ldGVyS2luZCB7CiAgbWFuZGF0b3J5LAogIG9wdGlvbmFsTmFtZWQsCiAgb3B0aW9uYWxQb3NpdGlvbmFsLAp9Cgpib29sIGlzTWFuZGF0b3J5Rm9ybWFsUGFyYW1ldGVyS2luZChGb3JtYWxQYXJhbWV0ZXJLaW5kIHR5cGUpIHsKICByZXR1cm4gRm9ybWFsUGFyYW1ldGVyS2luZC5tYW5kYXRvcnkgPT0gdHlwZTsKfQoKYm9vbCBpc09wdGlvbmFsTmFtZWRGb3JtYWxQYXJhbWV0ZXJLaW5kKEZvcm1hbFBhcmFtZXRlcktpbmQgdHlwZSkgewogIHJldHVybiBGb3JtYWxQYXJhbWV0ZXJLaW5kLm9wdGlvbmFsTmFtZWQgPT0gdHlwZTsKfQoKYm9vbCBpc09wdGlvbmFsUG9zaXRpb25hbEZvcm1hbFBhcmFtZXRlcktpbmQoRm9ybWFsUGFyYW1ldGVyS2luZCB0eXBlKSB7CiAgcmV0dXJuIEZvcm1hbFBhcmFtZXRlcktpbmQub3B0aW9uYWxQb3NpdGlvbmFsID09IHR5cGU7Cn0KGQBOTjwBLAEbDREWAgFAMAIBRDQCAUk5AgE9cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci9mb3JtYWxfcGFyYW1ldGVyX2tpbmQuZGFydENzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvcGFyc2VyL2lkZW50aWZpZXJfY29udGV4dC5kYXJ0s3IvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW4sIFRva2VuVHlwZTsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcgc2hvdyBNZXNzYWdlLCBUZW1wbGF0ZSwgdGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXI7CgppbXBvcnQgJy4uL3NjYW5uZXIvdG9rZW5fY29uc3RhbnRzLmRhcnQnIHNob3cgSURFTlRJRklFUl9UT0tFTjsKCmltcG9ydCAnaWRlbnRpZmllcl9jb250ZXh0X2ltcGwuZGFydCc7CgppbXBvcnQgJ3BhcnNlci5kYXJ0JyBzaG93IFBhcnNlcjsKCmltcG9ydCAndXRpbC5kYXJ0JyBzaG93IGlzT25lT2ZPckVvZiwgb3B0aW9uYWw7CgovLy8gSW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhcnNlciBzdGF0ZSB0aGF0IGlzIHBhc3NlZCB0byB0aGUgbGlzdGVuZXIgYXQgdGhlCi8vLyB0aW1lIGFuIGlkZW50aWZpZXIgaXMgZW5jb3VudGVyZWQuIEl0IGlzIGFsc28gdXNlZCBieSB0aGUgcGFyc2VyIGZvciBlcnJvcgovLy8gcmVjb3Zlcnkgd2hlbiBhIHJlY292ZXJ5IHRlbXBsYXRlIGlzIGRlZmluZWQuCi8vLwovLy8gVGhpcyBjYW4gYmUgdXNlZCBieSB0aGUgbGlzdGVuZXIgdG8gZGV0ZXJtaW5lIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZQovLy8gaWRlbnRpZmllciBhcHBlYXJzOyB0aGF0IGluIHR1cm4gY2FuIGhlbHAgdGhlIGxpc3RlbmVyIGRlY2lkZSBob3cgdG8gcmVzb2x2ZQovLy8gdGhlIGlkZW50aWZpZXIgKGlmIHRoZSBsaXN0ZW5lciBpcyBkb2luZyByZXNvbHV0aW9uKS4KY2xhc3MgSWRlbnRpZmllckNvbnRleHQgewogIC8vLyBJZGVudGlmaWVyIGlzIGJlaW5nIGRlY2xhcmVkIGFzIHRoZSBuYW1lIG9mIGFuIGltcG9ydCBwcmVmaXggKGkuZS4gYEZvb2AKICAvLy8gaW4gYGltcG9ydCAiLi4uIiBhcyBGb287YCkKICBzdGF0aWMgY29uc3QgaW1wb3J0UHJlZml4RGVjbGFyYXRpb24gPSBjb25zdCBJbXBvcnRQcmVmaXhJZGVudGlmaWVyQ29udGV4dCgpOwoKICAvLy8gSWRlbnRpZmllciBpcyB0aGUgc3RhcnQgb2YgYSBkb3R0ZWQgbmFtZSBpbiBhIGNvbmRpdGlvbmFsIGltcG9ydCBvcgogIC8vLyBleHBvcnQuCiAgc3RhdGljIGNvbnN0IGRvdHRlZE5hbWUgPSBjb25zdCBEb3R0ZWROYW1lSWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgcGFydCBvZiBhIGRvdHRlZCBuYW1lIGluIGEgY29uZGl0aW9uYWwgaW1wb3J0IG9yIGV4cG9ydCwgYnV0CiAgLy8vIGl0J3Mgbm90IHRoZSBmaXJzdCBpZGVudGlmaWVyIG9mIHRoZSBkb3R0ZWQgbmFtZS4KICBzdGF0aWMgY29uc3QgZG90dGVkTmFtZUNvbnRpbnVhdGlvbiA9CiAgICAgIGNvbnN0IERvdHRlZE5hbWVJZGVudGlmaWVyQ29udGV4dC5jb250aW51YXRpb24oKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgb25lIG9mIHRoZSBzaG93bi9oaWRkZW4gbmFtZXMgaW4gYW4gaW1wb3J0L2V4cG9ydAogIC8vLyBjb21iaW5hdG9yLgogIHN0YXRpYyBjb25zdCBjb21iaW5hdG9yID0gY29uc3QgQ29tYmluYXRvcklkZW50aWZpZXJDb250ZXh0KCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIHRoZSBzdGFydCBvZiBhIG5hbWUgaW4gYW4gYW5ub3RhdGlvbiB0aGF0IHByZWNlZGVzIGEKICAvLy8gZGVjbGFyYXRpb24gKGkuZS4gaXQgYXBwZWFycyBkaXJlY3RseSBhZnRlciBhbiBgQGApLgogIHN0YXRpYyBjb25zdCBtZXRhZGF0YVJlZmVyZW5jZSA9IGNvbnN0IE1ldGFkYXRhUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgcGFydCBvZiBhIG5hbWUgaW4gYW4gYW5ub3RhdGlvbiB0aGF0IHByZWNlZGVzIGEgZGVjbGFyYXRpb24sCiAgLy8vIGJ1dCBpdCdzIG5vdCB0aGUgZmlyc3QgaWRlbnRpZmllciBpbiB0aGUgbmFtZS4KICBzdGF0aWMgY29uc3QgbWV0YWRhdGFDb250aW51YXRpb24gPQogICAgICBjb25zdCBNZXRhZGF0YVJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0LmNvbnRpbnVhdGlvbigpOwoKICAvLy8gSWRlbnRpZmllciBpcyBwYXJ0IG9mIGEgbmFtZSBpbiBhbiBhbm5vdGF0aW9uIHRoYXQgcHJlY2VkZXMgYSBkZWNsYXJhdGlvbiwKICAvLy8gYnV0IGl0IGFwcGVhcnMgYWZ0ZXIgdHlwZSBwYXJhbWV0ZXJzIChlLmcuIGBmb29gIGluIGBAWDxZPi5mb28oKWApLgogIHN0YXRpYyBjb25zdCBtZXRhZGF0YUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cyA9CiAgICAgIGNvbnN0IE1ldGFkYXRhUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQuY29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzKCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIHRoZSBuYW1lIGJlaW5nIGRlY2xhcmVkIGJ5IGEgdHlwZWRlZiBkZWNsYXJhdGlvbi4KICBzdGF0aWMgY29uc3QgdHlwZWRlZkRlY2xhcmF0aW9uID0gY29uc3QgVHlwZWRlZkRlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgYSBmaWVsZCBpbml0aWFsaXplciBpbiBhIGZvcm1hbCBwYXJhbWV0ZXIgbGlzdCAoaS5lLiBpdAogIC8vLyBhcHBlYXJzIGRpcmVjdGx5IGFmdGVyIGB0aGlzLmApLgogIHN0YXRpYyBjb25zdCBmaWVsZEluaXRpYWxpemVyID0gY29uc3QgRmllbGRJbml0aWFsaXplcklkZW50aWZpZXJDb250ZXh0KCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIGEgZm9ybWFsIHBhcmFtZXRlciBiZWluZyBkZWNsYXJlZCBhcyBwYXJ0IG9mIGEgZnVuY3Rpb24sCiAgLy8vIG1ldGhvZCwgb3IgdHlwZWRlZiBkZWNsYXJhdGlvbi4KICBzdGF0aWMgY29uc3QgZm9ybWFsUGFyYW1ldGVyRGVjbGFyYXRpb24gPQogICAgICBjb25zdCBGb3JtYWxQYXJhbWV0ZXJEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0KCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIGEgZm9ybWFsIHBhcmFtZXRlciBiZWluZyBkZWNsYXJlZCBhcyBwYXJ0IG9mIGEgY2F0Y2ggYmxvY2sKICAvLy8gaW4gYSB0cnkvY2F0Y2gvZmluYWxseSBzdGF0ZW1lbnQuCiAgc3RhdGljIGNvbnN0IGNhdGNoUGFyYW1ldGVyID0gY29uc3QgQ2F0Y2hQYXJhbWV0ZXJJZGVudGlmaWVyQ29udGV4dCgpOwoKICAvLy8gSWRlbnRpZmllciBpcyB0aGUgc3RhcnQgb2YgYSBsaWJyYXJ5IG5hbWUgKGUuZy4gYGZvb2AgaW4gdGhlIGRpcmVjdGl2ZQogIC8vLyAnbGlicmFyeSBmb287YCkuCiAgc3RhdGljIGNvbnN0IGxpYnJhcnlOYW1lID0gY29uc3QgTGlicmFyeUlkZW50aWZpZXJDb250ZXh0KCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIHBhcnQgb2YgYSBsaWJyYXJ5IG5hbWUsIGJ1dCBpdCdzIG5vdCB0aGUgZmlyc3QgaWRlbnRpZmllciBpbgogIC8vLyB0aGUgbmFtZS4KICBzdGF0aWMgY29uc3QgbGlicmFyeU5hbWVDb250aW51YXRpb24gPQogICAgICBjb25zdCBMaWJyYXJ5SWRlbnRpZmllckNvbnRleHQuY29udGludWF0aW9uKCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIHRoZSBzdGFydCBvZiBhIGxpYnJhcnkgbmFtZSByZWZlcmVuY2VkIGJ5IGEgYHBhcnQgb2ZgCiAgLy8vIGRpcmVjdGl2ZSAoZS5nLiBgZm9vYCBpbiB0aGUgZGlyZWN0aXZlIGBwYXJ0IG9mIGZvbztgKS4KICBzdGF0aWMgY29uc3QgcGFydE5hbWUgPSBjb25zdCBMaWJyYXJ5SWRlbnRpZmllckNvbnRleHQucGFydE5hbWUoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgcGFydCBvZiBhIGxpYnJhcnkgbmFtZSByZWZlcmVuY2VkIGJ5IGEgYHBhcnQgb2ZgIGRpcmVjdGl2ZSwKICAvLy8gYnV0IGl0J3Mgbm90IHRoZSBmaXJzdCBpZGVudGlmaWVyIGluIHRoZSBuYW1lLgogIHN0YXRpYyBjb25zdCBwYXJ0TmFtZUNvbnRpbnVhdGlvbiA9CiAgICAgIGNvbnN0IExpYnJhcnlJZGVudGlmaWVyQ29udGV4dC5wYXJ0TmFtZUNvbnRpbnVhdGlvbigpOwoKICAvLy8gSWRlbnRpZmllciBpcyB0aGUgdHlwZSBuYW1lIGJlaW5nIGRlY2xhcmVkIGJ5IGFuIGVudW0gZGVjbGFyYXRpb24uCiAgc3RhdGljIGNvbnN0IGVudW1EZWNsYXJhdGlvbiA9IGNvbnN0IEVudW1EZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0KCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIGFuIGVudW1lcmF0ZWQgdmFsdWUgbmFtZSBiZWluZyBkZWNsYXJlZCBieSBhbiBlbnVtCiAgLy8vIGRlY2xhcmF0aW9uLgogIHN0YXRpYyBjb25zdCBlbnVtVmFsdWVEZWNsYXJhdGlvbiA9CiAgICAgIGNvbnN0IEVudW1WYWx1ZURlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgdGhlIG5hbWUgYmVpbmcgZGVjbGFyZWQgYnkgYSBjbGFzcyBkZWNsYXJhdGlvbiwgYSBtaXhpbgogIC8vLyBkZWNsYXJhdGlvbiwgb3IgYSBuYW1lZCBtaXhpbiBhcHBsaWNhdGlvbiwgZm9yIGV4YW1wbGUsCiAgLy8vIGBGb29gIGluIGBjbGFzcyBGb28gPSBYIHdpdGggWTtgLgogIHN0YXRpYyBjb25zdCBjbGFzc09yTWl4aW5EZWNsYXJhdGlvbiA9IGNvbnN0IENsYXNzT3JNaXhpbklkZW50aWZpZXJDb250ZXh0KCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIHRoZSBuYW1lIG9mIGEgdHlwZSB2YXJpYWJsZSBiZWluZyBkZWNsYXJlZCAoZS5nLiBgRm9vYCBpbgogIC8vLyBgY2xhc3MgQzxGb28gZXh0ZW5kcyBudW0+IHt9YCkuCiAgc3RhdGljIGNvbnN0IHR5cGVWYXJpYWJsZURlY2xhcmF0aW9uID0KICAgICAgY29uc3QgVHlwZVZhcmlhYmxlRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgpOwoKICAvLy8gSWRlbnRpZmllciBpcyB0aGUgc3RhcnQgb2YgYSByZWZlcmVuY2UgdG8gYSB0eXBlIHRoYXQgc3RhcnRzIHdpdGggcHJlZml4LgogIHN0YXRpYyBjb25zdCBwcmVmaXhlZFR5cGVSZWZlcmVuY2UgPQogICAgICBjb25zdCBUeXBlUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQucHJlZml4ZWQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgdGhlIHN0YXJ0IG9mIGEgcmVmZXJlbmNlIHRvIGEgdHlwZSBkZWNsYXJlZCBlbHNld2hlcmUuCiAgc3RhdGljIGNvbnN0IHR5cGVSZWZlcmVuY2UgPSBjb25zdCBUeXBlUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgcGFydCBvZiBhIHJlZmVyZW5jZSB0byBhIHR5cGUgZGVjbGFyZWQgZWxzZXdoZXJlLCBidXQgaXQncwogIC8vLyBub3QgdGhlIGZpcnN0IGlkZW50aWZpZXIgb2YgdGhlIHJlZmVyZW5jZS4KICBzdGF0aWMgY29uc3QgdHlwZVJlZmVyZW5jZUNvbnRpbnVhdGlvbiA9CiAgICAgIGNvbnN0IFR5cGVSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dC5jb250aW51YXRpb24oKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgYSBuYW1lIGJlaW5nIGRlY2xhcmVkIGJ5IGEgdG9wIGxldmVsIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgogIHN0YXRpYyBjb25zdCB0b3BMZXZlbFZhcmlhYmxlRGVjbGFyYXRpb24gPQogICAgICBjb25zdCBUb3BMZXZlbERlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoCiAgICAgICAgICAndG9wTGV2ZWxWYXJpYWJsZURlY2xhcmF0aW9uJywgY29uc3QgWyc7JywgJz0nLCAnLCddKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgYSBuYW1lIGJlaW5nIGRlY2xhcmVkIGJ5IGEgZmllbGQgZGVjbGFyYXRpb24uCiAgc3RhdGljIGNvbnN0IGZpZWxkRGVjbGFyYXRpb24gPSBjb25zdCBGaWVsZERlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgdGhlIG5hbWUgYmVpbmcgZGVjbGFyZWQgYnkgYSB0b3AgbGV2ZWwgZnVuY3Rpb24gZGVjbGFyYXRpb24uCiAgc3RhdGljIGNvbnN0IHRvcExldmVsRnVuY3Rpb25EZWNsYXJhdGlvbiA9CiAgICAgIGNvbnN0IFRvcExldmVsRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgKICAgICAgICAgICd0b3BMZXZlbEZ1bmN0aW9uRGVjbGFyYXRpb24nLCBjb25zdCBbJzwnLCAnKCcsICd7JywgJz0+J10pOwoKICAvLy8gSWRlbnRpZmllciBpcyB0aGUgc3RhcnQgb2YgdGhlIG5hbWUgYmVpbmcgZGVjbGFyZWQgYnkgYSBtZXRob2QKICAvLy8gZGVjbGFyYXRpb24uCiAgc3RhdGljIGNvbnN0IG1ldGhvZERlY2xhcmF0aW9uID0gY29uc3QgTWV0aG9kRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgpOwoKICAvLy8gSWRlbnRpZmllciBpcyBwYXJ0IG9mIHRoZSBuYW1lIGJlaW5nIGRlY2xhcmVkIGJ5IGEgbWV0aG9kIGRlY2xhcmF0aW9uLAogIC8vLyBidXQgaXQncyBub3QgdGhlIGZpcnN0IGlkZW50aWZpZXIgb2YgdGhlIG5hbWUuCiAgLy8vCiAgLy8vIEluIHZhbGlkIERhcnQsIHRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHRoZSBpZGVudGlmaWVyIGlzIHRoZSBuYW1lIG9mIGEKICAvLy8gbmFtZWQgY29uc3RydWN0b3Igd2hpY2ggaXMgYmVpbmcgZGVjbGFyZWQsIGUuZy4gYGZvb2AgaW4KICAvLy8gYGNsYXNzIEMgeyBDLmZvbygpOyB9YC4KICBzdGF0aWMgY29uc3QgbWV0aG9kRGVjbGFyYXRpb25Db250aW51YXRpb24gPQogICAgICBjb25zdCBNZXRob2REZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0LmNvbnRpbnVhdGlvbigpOwoKICAvLy8gSWRlbnRpZmllciBhcHBlYXJzIGFmdGVyIHRoZSB3b3JkIGBvcGVyYXRvcmAgaW4gYSBtZXRob2QgZGVjbGFyYXRpb24uCiAgLy8vCiAgLy8vIFRPRE8ocGF1bGJlcnJ5LGFoZSk6IERvZXMgdGhpcyBldmVyIG9jY3VyIGluIHZhbGlkIERhcnQsIG9yIGRvZXMgaXQgb25seQogIC8vLyBvY2N1ciBhcyBwYXJ0IG9mIGVycm9yIHJlY292ZXJ5PyAgSWYgaXQncyBvbmx5IGFzIHBhcnQgb2YgZXJyb3IgcmVjb3ZlcnksCiAgLy8vIHBlcmhhcHMgd2Ugc2hvdWxkIGp1c3QgcmUtdXNlIG1ldGhvZERlY2xhcmF0aW9uLgogIHN0YXRpYyBjb25zdCBvcGVyYXRvck5hbWUgPQogICAgICBjb25zdCBNZXRob2REZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0LmNvbnRpbnVhdGlvbigpOwoKICAvLy8gSWRlbnRpZmllciBpcyB0aGUgc3RhcnQgb2YgdGhlIG5hbWUgYmVpbmcgZGVjbGFyZWQgYnkgYSBsb2NhbCBmdW5jdGlvbgogIC8vLyBkZWNsYXJhdGlvbi4KICBzdGF0aWMgY29uc3QgbG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uID0KICAgICAgY29uc3QgTG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgcGFydCBvZiB0aGUgbmFtZSBiZWluZyBkZWNsYXJlZCBieSBhIGxvY2FsIGZ1bmN0aW9uCiAgLy8vIGRlY2xhcmF0aW9uLCBidXQgaXQncyBub3QgdGhlIGZpcnN0IGlkZW50aWZpZXIgb2YgdGhlIG5hbWUuCiAgLy8vCiAgLy8vIFRPRE8ocGF1bGJlcnJ5LGFoZSk6IERvZXMgdGhpcyBldmVyIG9jY3VyIGluIHZhbGlkIERhcnQsIG9yIGRvZXMgaXQgb25seQogIC8vLyBvY2N1ciBhcyBwYXJ0IG9mIGVycm9yIHJlY292ZXJ5PwogIHN0YXRpYyBjb25zdCBsb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb25Db250aW51YXRpb24gPQogICAgICBjb25zdCBMb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dC5jb250aW51YXRpb24oKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgdGhlIHN0YXJ0IG9mIGEgcmVmZXJlbmNlIHRvIGEgY29uc3RydWN0b3IgZGVjbGFyZWQKICAvLy8gZWxzZXdoZXJlLgogIHN0YXRpYyBjb25zdCBjb25zdHJ1Y3RvclJlZmVyZW5jZSA9CiAgICAgIGNvbnN0IENvbnN0cnVjdG9yUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgcGFydCBvZiBhIHJlZmVyZW5jZSB0byBhIGNvbnN0cnVjdG9yIGRlY2xhcmVkIGVsc2V3aGVyZSwgYnV0CiAgLy8vIGl0J3Mgbm90IHRoZSBmaXJzdCBpZGVudGlmaWVyIG9mIHRoZSByZWZlcmVuY2UuCiAgc3RhdGljIGNvbnN0IGNvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uID0KICAgICAgY29uc3QgQ29uc3RydWN0b3JSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dC5jb250aW51YXRpb24oKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgcGFydCBvZiBhIHJlZmVyZW5jZSB0byBhIGNvbnN0cnVjdG9yIGRlY2xhcmVkIGVsc2V3aGVyZSwgYnV0CiAgLy8vIGl0IGFwcGVhcnMgYWZ0ZXIgdHlwZSBwYXJhbWV0ZXJzIChlLmcuIGBmb29gIGluIGBYPFk+LmZvb2ApLgogIHN0YXRpYyBjb25zdCBjb25zdHJ1Y3RvclJlZmVyZW5jZUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cyA9CiAgICAgIGNvbnN0IENvbnN0cnVjdG9yUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQKICAgICAgICAgIC5jb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHMoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgbGFiZWwgKGkuZS4gaXQgaXMgZm9sbG93ZWQgYnkgYDpgIGFuZAogIC8vLyB0aGVuIGEgc3RhdGVtZW50KS4KICBzdGF0aWMgY29uc3QgbGFiZWxEZWNsYXJhdGlvbiA9IGNvbnN0IExhYmVsRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgpOwoKICAvLy8gSWRlbnRpZmllciBpcyB0aGUgc3RhcnQgb2YgYSByZWZlcmVuY2Ugb2NjdXJyaW5nIGluIGEgbGl0ZXJhbCBzeW1ib2wgKGUuZy4KICAvLy8gYGZvb2AgaW4gYCNmb29gKS4KICBzdGF0aWMgY29uc3QgbGl0ZXJhbFN5bWJvbCA9IGNvbnN0IExpdGVyYWxTeW1ib2xJZGVudGlmaWVyQ29udGV4dCgpOwoKICAvLy8gSWRlbnRpZmllciBpcyBwYXJ0IG9mIGEgcmVmZXJlbmNlIG9jY3VycmluZyBpbiBhIGxpdGVyYWwgc3ltYm9sLCBidXQgaXQncwogIC8vLyBub3QgdGhlIGZpcnN0IGlkZW50aWZpZXIgb2YgdGhlIHJlZmVyZW5jZSAoZS5nLiBgZm9vYCBpbiBgI3ByZWZpeC5mb29gKS4KICBzdGF0aWMgY29uc3QgbGl0ZXJhbFN5bWJvbENvbnRpbnVhdGlvbiA9CiAgICAgIGNvbnN0IExpdGVyYWxTeW1ib2xJZGVudGlmaWVyQ29udGV4dC5jb250aW51YXRpb24oKTsKCiAgLy8vIElkZW50aWZpZXIgYXBwZWFycyBpbiBhbiBleHByZXNzaW9uLCBhbmQgaXQgZG9lcyBub3QgaW1tZWRpYXRlbHkgZm9sbG93IGEKICAvLy8gYC5gLgogIHN0YXRpYyBjb25zdCBleHByZXNzaW9uID0gY29uc3QgRXhwcmVzc2lvbklkZW50aWZpZXJDb250ZXh0KCk7CgogIC8vLyBJZGVudGlmaWVyIGFwcGVhcnMgaW4gYW4gZXhwcmVzc2lvbiwgYW5kIGl0IGltbWVkaWF0ZWx5IGZvbGxvd3MgYSBgLmAuCiAgc3RhdGljIGNvbnN0IGV4cHJlc3Npb25Db250aW51YXRpb24gPQogICAgICBjb25zdCBFeHByZXNzaW9uSWRlbnRpZmllckNvbnRleHQuY29udGludWF0aW9uKCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIGEgcmVmZXJlbmNlIHRvIGEgbmFtZWQgYXJndW1lbnQgb2YgYSBmdW5jdGlvbiBvciBtZXRob2QKICAvLy8gaW52b2NhdGlvbiAoZS5nLiBgZm9vYCBpbiBgZihmb286IDApO2AuCiAgc3RhdGljIGNvbnN0IG5hbWVkQXJndW1lbnRSZWZlcmVuY2UgPQogICAgICBjb25zdCBOYW1lZEFyZ3VtZW50UmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgYSBuYW1lIGJlaW5nIGRlY2xhcmVkIGJ5IGEgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24uCiAgc3RhdGljIGNvbnN0IGxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbiA9CiAgICAgIGNvbnN0IExvY2FsVmFyaWFibGVEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0KCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIGEgcmVmZXJlbmNlIHRvIGEgbGFiZWwgKGUuZy4gYGZvb2AgaW4gYGJyZWFrIGZvbztgKS4KICAvLy8gTGFiZWxzIGhhdmUgdGhlaXIgb3duIHNjb3BlLgogIHN0YXRpYyBjb25zdCBsYWJlbFJlZmVyZW5jZSA9IGNvbnN0IExhYmVsUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQoKTsKCiAgZmluYWwgU3RyaW5nIF9uYW1lOwoKICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGlkZW50aWZpZXIgcmVwcmVzZW50cyBhIG5hbWUgd2hpY2ggaXMgYmVpbmcKICAvLy8gZGVjbGFyZWQuCiAgZmluYWwgYm9vbCBpbkRlY2xhcmF0aW9uOwoKICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGlkZW50aWZpZXIgaXMgd2l0aGluIGEgYGxpYnJhcnlgIG9yIGBwYXJ0IG9mYAogIC8vLyBkZWNsYXJhdGlvbi4KICBmaW5hbCBib29sIGluTGlicmFyeU9yUGFydE9mRGVjbGFyYXRpb247CgogIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaWRlbnRpZmllciBpcyB3aXRoaW4gYSBzeW1ib2wgbGl0ZXJhbC4KICBmaW5hbCBib29sIGluU3ltYm9sOwoKICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGlkZW50aWZpZXIgZm9sbG93cyBhIGAuYC4KICBmaW5hbCBib29sIGlzQ29udGludWF0aW9uOwoKICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGlkZW50aWZpZXIgc2hvdWxkIGJlIGxvb2tlZCB1cCBpbiB0aGUgY3VycmVudCBzY29wZS4KICBmaW5hbCBib29sIGlzU2NvcGVSZWZlcmVuY2U7CgogIC8vLyBJbmRpY2F0ZXMgd2hldGhlciBidWlsdC1pbiBpZGVudGlmaWVycyBhcmUgYWxsb3dlZCBpbiB0aGlzIGNvbnRleHQuCiAgZmluYWwgYm9vbCBpc0J1aWx0SW5JZGVudGlmaWVyQWxsb3dlZDsKCiAgLy8vIEluZGljYXRlZCB3aGV0aGVyIHRoZSBpZGVudGlmaWVyIGlzIGFsbG93ZWQgaW4gYSBjb250ZXh0IHdoZXJlIGNvbnN0YW50CiAgLy8vIGV4cHJlc3Npb25zIGFyZSByZXF1aXJlZC4KICBmaW5hbCBib29sIGFsbG93ZWRJbkNvbnN0YW50RXhwcmVzc2lvbjsKCiAgZmluYWwgVGVtcGxhdGU8X01lc3NhZ2VXaXRoQXJndW1lbnQ8VG9rZW4+PiByZWNvdmVyeVRlbXBsYXRlOwoKICBjb25zdCBJZGVudGlmaWVyQ29udGV4dCh0aGlzLl9uYW1lLAogICAgICB7dGhpcy5pbkRlY2xhcmF0aW9uOiBmYWxzZSwKICAgICAgdGhpcy5pbkxpYnJhcnlPclBhcnRPZkRlY2xhcmF0aW9uOiBmYWxzZSwKICAgICAgdGhpcy5pblN5bWJvbDogZmFsc2UsCiAgICAgIHRoaXMuaXNDb250aW51YXRpb246IGZhbHNlLAogICAgICB0aGlzLmlzU2NvcGVSZWZlcmVuY2U6IGZhbHNlLAogICAgICB0aGlzLmlzQnVpbHRJbklkZW50aWZpZXJBbGxvd2VkOiB0cnVlLAogICAgICBib29sIGFsbG93ZWRJbkNvbnN0YW50RXhwcmVzc2lvbiwKICAgICAgdGhpcy5yZWNvdmVyeVRlbXBsYXRlOiB0ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcn0pCiAgICAgIDogdGhpcy5hbGxvd2VkSW5Db25zdGFudEV4cHJlc3Npb24gPQogICAgICAgICAgICAvLyBHZW5lcmFsbHksIGRlY2xhcmF0aW9ucyBhcmUgbGVnYWwgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMuICBBCiAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiBkb2Vzbid0IGFmZmVjdCBjb25zdGFudCBleHByZXNzaW9uczogaWYgd2hhdCBpdCdzCiAgICAgICAgICAgIC8vIGNvbnRpbnVpbmcgaXMgYSBwcm9ibGVtLCBpdCBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkLgogICAgICAgICAgICBhbGxvd2VkSW5Db25zdGFudEV4cHJlc3Npb24gPz8KICAgICAgICAgICAgICAgIChpbkRlY2xhcmF0aW9uIHx8IGlzQ29udGludWF0aW9uIHx8IGluU3ltYm9sKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gX25hbWU7CgogIC8vLyBFbnN1cmUgdGhhdCB0aGUgbmV4dCB0b2tlbiBpcyBhbiBpZGVudGlmaWVyIChvciBrZXl3b3JkIHdoaWNoIHNob3VsZCBiZQogIC8vLyB0cmVhdGVkIGFzIGFuIGlkZW50aWZpZXIpIGFuZCByZXR1cm4gdGhhdCBpZGVudGlmaWVyLgogIC8vLyBSZXBvcnQgZXJyb3JzIGFzIG5lY2Vzc2FyeSB2aWEgW3BhcnNlcl0uCiAgVG9rZW4gZW5zdXJlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgYXNzZXJ0KHRva2VuLm5leHQua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIC8vIFRPRE8oZGFucnViZWwpOiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgZm9yIGVhY2ggaWRlbnRpZmllciBjb250ZXh0CiAgICAvLyBzdWNoIHRoYXQgdGhleSByZXR1cm4gYSBub24tbnVsbCB2YWx1ZS4KICAgIHJldHVybiBudWxsOwogIH0KfQoKLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFt0b2tlbl0gc2hvdWxkIGJlIHRyZWF0ZWQgbGlrZSB0aGUgc3RhcnQgb2YKLy8vIGFuIGV4cHJlc3Npb24gZm9yIHRoZSBwdXJwb3NlcyBvZiByZWNvdmVyeS4KYm9vbCBsb29rc0xpa2VFeHByZXNzaW9uU3RhcnQoVG9rZW4gbmV4dCkgPT4KICAgIG5leHQuaXNJZGVudGlmaWVyIHx8CiAgICBuZXh0LmlzS2V5d29yZCAmJiAhbG9va3NMaWtlU3RhdGVtZW50U3RhcnQobmV4dCkgfHwKICAgIG5leHQudHlwZSA9PSBUb2tlblR5cGUuRE9VQkxFIHx8CiAgICBuZXh0LnR5cGUgPT0gVG9rZW5UeXBlLkhBU0ggfHwKICAgIG5leHQudHlwZSA9PSBUb2tlblR5cGUuSEVYQURFQ0lNQUwgfHwKICAgIG5leHQudHlwZSA9PSBUb2tlblR5cGUuSURFTlRJRklFUiB8fAogICAgbmV4dC50eXBlID09IFRva2VuVHlwZS5JTlQgfHwKICAgIG5leHQudHlwZSA9PSBUb2tlblR5cGUuU1RSSU5HIHx8CiAgICBvcHRpb25hbCgneycsIG5leHQpIHx8CiAgICBvcHRpb25hbCgnKCcsIG5leHQpIHx8CiAgICBvcHRpb25hbCgnWycsIG5leHQpIHx8CiAgICBvcHRpb25hbCgnW10nLCBuZXh0KSB8fAogICAgb3B0aW9uYWwoJzwnLCBuZXh0KSB8fAogICAgb3B0aW9uYWwoJyEnLCBuZXh0KSB8fAogICAgb3B0aW9uYWwoJy0nLCBuZXh0KSB8fAogICAgb3B0aW9uYWwoJ34nLCBuZXh0KSB8fAogICAgb3B0aW9uYWwoJysrJywgbmV4dCkgfHwKICAgIG9wdGlvbmFsKCctLScsIG5leHQpOwoKLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFt0b2tlbl0gc2hvdWxkIGJlIHRyZWF0ZWQgbGlrZSB0aGUgc3RhcnQgb2YKLy8vIGEgbmV3IHN0YXRlbWVudCBmb3IgdGhlIHB1cnBvc2VzIG9mIHJlY292ZXJ5Lgpib29sIGxvb2tzTGlrZVN0YXRlbWVudFN0YXJ0KFRva2VuIHRva2VuKSA9PiBpc09uZU9mT3JFb2YodG9rZW4sIGNvbnN0IFsKICAgICAgJ0AnLAogICAgICAnYXNzZXJ0JywgJ2JyZWFrJywgJ2NvbnRpbnVlJywgJ2RvJywgJ2Vsc2UnLCAnZmluYWwnLCAnZm9yJywgLy8KICAgICAgJ2lmJywgJ3JldHVybicsICdzd2l0Y2gnLCAndHJ5JywgJ3ZhcicsICd2b2lkJywgJ3doaWxlJywgLy8KICAgIF0pOwoKLy8gVE9ETyhhaGUpOiBSZW1vdmUgd2hlbiBhbmFseXplciBzdXBwb3J0cyBnZW5lcmFsaXplZCBmdW5jdGlvbiBzeW50YXguCnR5cGVkZWYgX01lc3NhZ2VXaXRoQXJndW1lbnQ8VD4gPSBNZXNzYWdlIEZ1bmN0aW9uKFQpOwqBMwBOTjwBOQFRAUABJwEiATABTU8yBEtROhpPIVABSg5BAVE4KDgBRhJBAUk7TwFRNSY/AVFKOFEBRlEBTCdNAU0mLDsBTyhJAU0XPwFRECk1AUo+RQFQNSY9AUlLAUcTJjUBTD4oUAFOJik4AVAnNwFLRwFPMSs7AU8tMkEBQk0BUS0yRwFFE08BTTUGTT8eLz8BTAZPUDcePwFNEyo5AUhCBk8nNkYBRxEmNQFRNjJCAVFDRDItAU8ZTQFRGEcBUE8rOwFQC0EBTSg4AUwuKDcBSyo5AUkjSQEWAUgQHAFKEysBQxcBNh0BUR8BSikBTiAqAUABJiIwHCIkLSg6K01ORis/AR4BTjwvNzFJLxEEAgFLMC0ZOCUjKikiJRsbGxwbGxsbHBoBSzJJC0ZCCAFJNwE6cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci9pZGVudGlmaWVyX2NvbnRleHQuZGFydDxzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvcGFyc2VyL21lbWJlcl9raW5kLmRhcnSDni8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnBhcnNlci5tZW1iZXJfa2luZDsKCmVudW0gTWVtYmVyS2luZCB7CiAgLy8vIEEgY2F0Y2ggYmxvY2ssIG5vdCBhIHJlYWwgbWVtYmVyLgogIENhdGNoLAoKICAvLy8gQSBmYWN0b3J5CiAgRmFjdG9yeSwKCiAgLy8vIE9sZC1zdHlsZSB0eXBlZGVmLgogIEZ1bmN0aW9uVHlwZUFsaWFzLAoKICAvLy8gT2xkLXN0eWxlIGZ1bmN0aW9uLXR5cGVkIHBhcmFtZXRlciwgbm90IGEgcmVhbCBtZW1iZXIuCiAgRnVuY3Rpb25UeXBlZFBhcmFtZXRlciwKCiAgLy8vIEEgZ2VuZXJhbGl6ZWQgZnVuY3Rpb24gdHlwZSwgbm90IGEgcmVhbCBtZW1iZXIuCiAgR2VuZXJhbGl6ZWRGdW5jdGlvblR5cGUsCgogIC8vLyBBIGxvY2FsIGZ1bmN0aW9uLgogIExvY2FsLAoKICAvLy8gQSBub24tc3RhdGljIG1ldGhvZCBpbiBhIGNsYXNzIChpbmNsdWRpbmcgY29uc3RydWN0b3JzKS4KICBOb25TdGF0aWNNZXRob2QsCgogIC8vLyBBIHN0YXRpYyBtZXRob2QgaW4gYSBjbGFzcy4KICBTdGF0aWNNZXRob2QsCgogIC8vLyBBIHRvcC1sZXZlbCBtZXRob2QuCiAgVG9wTGV2ZWxNZXRob2QsCgogIC8vLyBBbiBpbnN0YW5jZSBmaWVsZCBpbiBhIGNsYXNzLgogIE5vblN0YXRpY0ZpZWxkLAoKICAvLy8gQSBzdGF0aWMgZmllbGQgaW4gYSBjbGFzcy4KICBTdGF0aWNGaWVsZCwKCiAgLy8vIEEgdG9wLWxldmVsIGZpZWxkLgogIFRvcExldmVsRmllbGQsCn0KLQBOTjwBIgESKAkBEAsBGRUBPRoBNhsBGAkBPxMBIhABGhIBJBIBIQ8BGRECATNwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL21lbWJlcl9raW5kLmRhcnRBc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3BhcnNlci90b3BfbGV2ZWxfcGFyc2VyLmRhcnSCuS8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnBhcnNlci50b3BfbGV2ZWxfcGFyc2VyOwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJ2xpc3RlbmVyLmRhcnQnIHNob3cgTGlzdGVuZXI7CgppbXBvcnQgJ2NsYXNzX21lbWJlcl9wYXJzZXIuZGFydCcgc2hvdyBDbGFzc01lbWJlclBhcnNlcjsKCi8vLyBQYXJzZXIgd2hpY2ggb25seSBwYXJzZXMgdG9wLWxldmVsIGVsZW1lbnRzLCBidXQgaWdub3JlcyB0aGVpciBib2RpZXMuCi8vLyBVc2UgW1BhcnNlcl0gdG8gcGFyc2UgZXZlcnl0aGluZy4KY2xhc3MgVG9wTGV2ZWxQYXJzZXIgZXh0ZW5kcyBDbGFzc01lbWJlclBhcnNlciB7CiAgVG9wTGV2ZWxQYXJzZXIoTGlzdGVuZXIgbGlzdGVuZXIpIDogc3VwZXIobGlzdGVuZXIpOwoKICBUb2tlbiBwYXJzZUNsYXNzT3JNaXhpbkJvZHkoVG9rZW4gdG9rZW4pID0+IHNraXBDbGFzc09yTWl4aW5Cb2R5KHRva2VuKTsKfQoVAE5OPAEnAS4BJgE6AUsmMTcBSwIBOHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvdG9wX2xldmVsX3BhcnNlci5kYXJ0NXNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9wYXJzZXIvdXRpbC5kYXJ0m1YvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5wYXJzZXIudXRpbDsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgVHJlZU5vZGU7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnIHNob3cgbm9MZW5ndGg7CgppbXBvcnQgJy4uL3NjYW5uZXIuZGFydCcgc2hvdyBUb2tlbjsKCmltcG9ydCAnLi4vLi4vc2Nhbm5lci90b2tlbi5kYXJ0JwogICAgc2hvdyBCZWdpblRva2VuLCBTaW1wbGVUb2tlbiwgU3ludGhldGljVG9rZW4sIFRva2VuVHlwZTsKCi8vLyBSZXR1cm5zIHRydWUgaWYgW3Rva2VuXSBpcyB0aGUgc3ltYm9sIG9yIGtleXdvcmQgW3ZhbHVlXS4KYm9vbCBvcHRpb25hbChTdHJpbmcgdmFsdWUsIFRva2VuIHRva2VuKSB7CiAgcmV0dXJuIGlkZW50aWNhbCh2YWx1ZSwgdG9rZW4uc3RyaW5nVmFsdWUpOwp9CgovLy8gUmV0dXJucyB0aGUgdG9rZW4gYmVmb3JlIHRoZSBjbG9zZSBicmFjZSwgYnJhY2tldCwgb3IgcGFyZW50aGVzaXMKLy8vIGFzc29jaWF0ZWQgd2l0aCBbbGVmdF0uIEZvciAnPCcsIGl0IG1heSByZXR1cm4gYG51bGxgLgpUb2tlbiBiZWZvcmVDbG9zZUJyYWNlVG9rZW5Gb3IoQmVnaW5Ub2tlbiBsZWZ0KSB7CiAgVG9rZW4gZW5kVG9rZW4gPSBsZWZ0LmVuZFRva2VuOwogIGlmIChlbmRUb2tlbiA9PSBudWxsKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgVG9rZW4gdG9rZW4gPSBsZWZ0OwogIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogIHdoaWxlIChuZXh0ICE9IGVuZFRva2VuICYmIG5leHQgIT0gbmV4dC5uZXh0KSB7CiAgICB0b2tlbiA9IG5leHQ7CiAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICB9CiAgcmV0dXJuIHRva2VuOwp9CgovLy8gUmV0dXJuIFt0b2tlbl0gb3IgYSB0b2tlbiBiZWZvcmUgW3Rva2VuXSB3aGljaCBpcyBlaXRoZXIKLy8vIG5vdCBzeW50aGV0aWMgb3Igc3ludGhldGljIHdpdGggbm9uLXplcm8gbGVuZ3RoLgpUb2tlbiBmaW5kUHJldmlvdXNOb25aZXJvTGVuZ3RoVG9rZW4oVG9rZW4gdG9rZW4pIHsKICB3aGlsZSAodG9rZW4uaXNTeW50aGV0aWMgJiYgdG9rZW4ubGVuZ3RoID09IDApIHsKICAgIFRva2VuIHByZXZpb3VzID0gdG9rZW4uYmVmb3JlU3ludGhldGljOwogICAgaWYgKHByZXZpb3VzID09IG51bGwpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICB0b2tlbiA9IHByZXZpb3VzOwogIH0KICByZXR1cm4gdG9rZW47Cn0KCi8vLyBSZXR1cm4gW3Rva2VuXSBvciBhIHRva2VuIGFmdGVyIFt0b2tlbl0gd2hpY2ggaXMgZWl0aGVyCi8vLyBub3Qgc3ludGhldGljIG9yIHN5bnRoZXRpYyB3aXRoIG5vbi16ZXJvIGxlbmd0aC4KLy8vIFRoaXMgbWF5IHJldHVybiBFT0YgaWYgdGhlcmUgYXJlIG5vIG1vcmUgbm9uLXN5bnRoZXRpYyB0b2tlbnMgaW4gdGhlIHN0cmVhbS4KVG9rZW4gZmluZE5vblplcm9MZW5ndGhUb2tlbihUb2tlbiB0b2tlbikgewogIHdoaWxlICh0b2tlbi5pc1N5bnRoZXRpYyAmJiB0b2tlbi5sZW5ndGggPT0gMCAmJiAhdG9rZW4uaXNFb2YpIHsKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICB9CiAgcmV0dXJuIHRva2VuOwp9CgovLy8gQSBudWxsLWF3YXJlIGFsdGVybmF0aXZlIHRvIGB0b2tlbi5vZmZzZXRgLiAgSWYgW3Rva2VuXSBpcyBgbnVsbGAsIHJldHVybnMKLy8vIGBUcmVlTm9kZS5ub09mZnNldGAuCmludCBvZmZzZXRGb3JUb2tlbihUb2tlbiB0b2tlbikgewogIHJldHVybiB0b2tlbiA9PSBudWxsID8gVHJlZU5vZGUubm9PZmZzZXQgOiB0b2tlbi5vZmZzZXQ7Cn0KCmJvb2wgaXNEaWdpdChpbnQgYykgPT4gYyA+PSAweDMwICYmIGMgPD0gMHgzOTsKCmJvb2wgaXNMZXR0ZXIoaW50IGMpID0+IGMgPj0gMHg0MSAmJiBjIDw9IDB4NUEgfHwgYyA+PSAweDYxICYmIGMgPD0gMHg3QTsKCmJvb2wgaXNMZXR0ZXJPckRpZ2l0KGludCBjKSA9PiBpc0xldHRlcihjKSB8fCBpc0RpZ2l0KGMpOwoKYm9vbCBpc1doaXRlc3BhY2UoaW50IGMpID0+IGMgPT0gMHgyMCB8fCBjID09IDB4QSB8fCBjID09IDB4RCB8fCBjID09IDB4OTsKCi8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gdG9rZW4gbWF0Y2hlcyBvbmUgb2YgdGhlIGdpdmVuIHZhbHVlcy4KYm9vbCBpc09uZU9mKFRva2VuIHRva2VuLCBJdGVyYWJsZTxTdHJpbmc+IHZhbHVlcykgewogIGZvciAoU3RyaW5nIHRva2VuVmFsdWUgaW4gdmFsdWVzKSB7CiAgICBpZiAob3B0aW9uYWwodG9rZW5WYWx1ZSwgdG9rZW4pKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KICByZXR1cm4gZmFsc2U7Cn0KCi8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gdG9rZW4gbWF0Y2hlcyBvbmUgb2YgdGhlIGdpdmVuIHZhbHVlcyBvciBpcyBFT0YuCmJvb2wgaXNPbmVPZk9yRW9mKFRva2VuIHRva2VuLCBJdGVyYWJsZTxTdHJpbmc+IHZhbHVlcykgewogIGZvciAoU3RyaW5nIHRva2VuVmFsdWUgaW4gdmFsdWVzKSB7CiAgICBpZiAob3B0aW9uYWwodG9rZW5WYWx1ZSwgdG9rZW4pKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KICByZXR1cm4gdG9rZW4uaXNFb2Y7Cn0KCi8vLyBBIG51bGwtYXdhcmUgYWx0ZXJuYXRpdmUgdG8gYHRva2VuLmxlbmd0aGAuICBJZiBbdG9rZW5dIGlzIGBudWxsYCwgcmV0dXJucwovLy8gW25vTGVuZ3RoXS4KaW50IGxlbmd0aEZvclRva2VuKFRva2VuIHRva2VuKSB7CiAgcmV0dXJuIHRva2VuID09IG51bGwgPyBub0xlbmd0aCA6IHRva2VuLmxlbmd0aDsKfQoKLy8vIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgc3BhbiBmcm9tIFtiZWdpbl0gdG8gW2VuZF0gKGluY2x1c2l2ZSkuIElmIGJvdGgKLy8vIHRva2VucyBhcmUgbnVsbCwgcmV0dXJuIFtub0xlbmd0aF0uIElmIG9uZSBvZiB0aGUgdG9rZW5zIGFyZSBudWxsLCByZXR1cm4KLy8vIHRoZSBsZW5ndGggb2YgdGhlIG90aGVyIHRva2VuLgppbnQgbGVuZ3RoT2ZTcGFuKFRva2VuIGJlZ2luLCBUb2tlbiBlbmQpIHsKICBpZiAoYmVnaW4gPT0gbnVsbCkgcmV0dXJuIGxlbmd0aEZvclRva2VuKGVuZCk7CiAgaWYgKGVuZCA9PSBudWxsKSByZXR1cm4gbGVuZ3RoRm9yVG9rZW4oYmVnaW4pOwogIHJldHVybiBlbmQub2Zmc2V0ICsgZW5kLmxlbmd0aCAtIGJlZ2luLm9mZnNldDsKfQoKVG9rZW4gc2tpcE1ldGFkYXRhKFRva2VuIHRva2VuKSB7CiAgdG9rZW4gPSB0b2tlbi5uZXh0OwogIGFzc2VydChvcHRpb25hbCgnQCcsIHRva2VuKSk7CiAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgaWYgKG5leHQuaXNJZGVudGlmaWVyKSB7CiAgICB0b2tlbiA9IG5leHQ7CiAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIHdoaWxlIChvcHRpb25hbCgnLicsIG5leHQpKSB7CiAgICAgIHRva2VuID0gbmV4dDsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIGlmIChuZXh0LmlzSWRlbnRpZmllcikgewogICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgfQogICAgfQogICAgaWYgKG9wdGlvbmFsKCcoJywgbmV4dCkgJiYgIW5leHQuZW5kR3JvdXAuaXNTeW50aGV0aWMpIHsKICAgICAgdG9rZW4gPSBuZXh0LmVuZEdyb3VwOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIH0KICB9CiAgcmV0dXJuIHRva2VuOwp9CgovLy8gU3BsaXQgYD49YCBpbnRvIHR3byBzZXBhcmF0ZSB0b2tlbnMuCi8vLyBDYWxsIFtUb2tlbi5zZXROZXh0XSB0byBhZGQgdGhlIHRva2VuIHRvIHRoZSBzdHJlYW0uClRva2VuIHNwbGl0R3RFcShUb2tlbiB0b2tlbikgewogIGFzc2VydChvcHRpb25hbCgnPj0nLCB0b2tlbikpOwogIHJldHVybiBuZXcgU2ltcGxlVG9rZW4oCiAgICAgIFRva2VuVHlwZS5HVCwgdG9rZW4uY2hhck9mZnNldCwgdG9rZW4ucHJlY2VkaW5nQ29tbWVudHMpCiAgICAuLnNldE5leHQobmV3IFNpbXBsZVRva2VuKFRva2VuVHlwZS5FUSwgdG9rZW4uY2hhck9mZnNldCArIDEpCiAgICAgIC8vIFNldCBuZXh0IHJhdGhlciB0aGFuIGNhbGxpbmcgVG9rZW4uc2V0TmV4dAogICAgICAvLyBzbyB0aGF0IHRoZSBwcmV2aW91cyB0b2tlbiBpcyBub3Qgc2V0LgogICAgICAuLm5leHQgPSB0b2tlbi5uZXh0KTsKfQoKLy8vIFNwbGl0IGA+PmAgaW50byB0d28gc2VwYXJhdGUgdG9rZW5zLgovLy8gQ2FsbCBbVG9rZW4uc2V0TmV4dF0gdG8gYWRkIHRoZSB0b2tlbiB0byB0aGUgc3RyZWFtLgpTaW1wbGVUb2tlbiBzcGxpdEd0R3QoVG9rZW4gdG9rZW4pIHsKICBhc3NlcnQob3B0aW9uYWwoJz4+JywgdG9rZW4pKTsKICByZXR1cm4gbmV3IFNpbXBsZVRva2VuKAogICAgICBUb2tlblR5cGUuR1QsIHRva2VuLmNoYXJPZmZzZXQsIHRva2VuLnByZWNlZGluZ0NvbW1lbnRzKQogICAgLi5zZXROZXh0KG5ldyBTaW1wbGVUb2tlbihUb2tlblR5cGUuR1QsIHRva2VuLmNoYXJPZmZzZXQgKyAxKQogICAgICAvLyBTZXQgbmV4dCByYXRoZXIgdGhhbiBjYWxsaW5nIFRva2VuLnNldE5leHQKICAgICAgLy8gc28gdGhhdCB0aGUgcHJldmlvdXMgdG9rZW4gaXMgbm90IHNldC4KICAgICAgLi5uZXh0ID0gdG9rZW4ubmV4dCk7Cn0KCi8vLyBTcGxpdCBgPj49YCBpbnRvIHRocmVlIHNlcGFyYXRlIHRva2Vucy4KLy8vIENhbGwgW1Rva2VuLnNldE5leHRdIHRvIGFkZCB0aGUgdG9rZW4gdG8gdGhlIHN0cmVhbS4KVG9rZW4gc3BsaXRHdEd0RXEoVG9rZW4gdG9rZW4pIHsKICBhc3NlcnQob3B0aW9uYWwoJz4+PScsIHRva2VuKSk7CiAgcmV0dXJuIG5ldyBTaW1wbGVUb2tlbigKICAgICAgVG9rZW5UeXBlLkdULCB0b2tlbi5jaGFyT2Zmc2V0LCB0b2tlbi5wcmVjZWRpbmdDb21tZW50cykKICAgIC4uc2V0TmV4dChuZXcgU2ltcGxlVG9rZW4oVG9rZW5UeXBlLkdULCB0b2tlbi5jaGFyT2Zmc2V0ICsgMSkKICAgICAgLi5zZXROZXh0KG5ldyBTaW1wbGVUb2tlbihUb2tlblR5cGUuRVEsIHRva2VuLmNoYXJPZmZzZXQgKyAyKQogICAgICAgIC8vIFNldCBuZXh0IHJhdGhlciB0aGFuIGNhbGxpbmcgVG9rZW4uc2V0TmV4dAogICAgICAgIC8vIHNvIHRoYXQgdGhlIHByZXZpb3VzIHRva2VuIGlzIG5vdCBzZXQuCiAgICAgICAgLi5uZXh0ID0gdG9rZW4ubmV4dCkpOwp9CgovLy8gU3BsaXQgYD4+PWAgaW50byB0d28gc2VwYXJhdGUgdG9rZW5zLi4uIGA+YCBmb2xsb3dlZCBieSBgPj1gLgovLy8gQ2FsbCBbVG9rZW4uc2V0TmV4dF0gdG8gYWRkIHRoZSB0b2tlbiB0byB0aGUgc3RyZWFtLgpUb2tlbiBzcGxpdEd0RnJvbUd0R3RFcShUb2tlbiB0b2tlbikgewogIGFzc2VydChvcHRpb25hbCgnPj49JywgdG9rZW4pKTsKICByZXR1cm4gbmV3IFNpbXBsZVRva2VuKAogICAgICBUb2tlblR5cGUuR1QsIHRva2VuLmNoYXJPZmZzZXQsIHRva2VuLnByZWNlZGluZ0NvbW1lbnRzKQogICAgLi5zZXROZXh0KG5ldyBTaW1wbGVUb2tlbihUb2tlblR5cGUuR1RfRVEsIHRva2VuLmNoYXJPZmZzZXQgKyAxKQogICAgICAvLyBTZXQgbmV4dCByYXRoZXIgdGhhbiBjYWxsaW5nIFRva2VuLnNldE5leHQKICAgICAgLy8gc28gdGhhdCB0aGUgcHJldmlvdXMgdG9rZW4gaXMgbm90IHNldC4KICAgICAgLi5uZXh0ID0gdG9rZW4ubmV4dCk7Cn0KCi8vLyBTcGxpdCBgPj4+YCBpbnRvIHR3byBzZXBhcmF0ZSB0b2tlbnMuLi4gYD5gIGZvbGxvd2VkIGJ5IGA+PmAuCi8vLyBDYWxsIFtUb2tlbi5zZXROZXh0XSB0byBhZGQgdGhlIHRva2VuIHRvIHRoZSBzdHJlYW0uClRva2VuIHNwbGl0R3RGcm9tR3RHdEd0KFRva2VuIHRva2VuKSB7CiAgYXNzZXJ0KG9wdGlvbmFsKCc+Pj4nLCB0b2tlbikpOwogIHJldHVybiBuZXcgU2ltcGxlVG9rZW4oCiAgICAgIFRva2VuVHlwZS5HVCwgdG9rZW4uY2hhck9mZnNldCwgdG9rZW4ucHJlY2VkaW5nQ29tbWVudHMpCiAgICAuLnNldE5leHQobmV3IFNpbXBsZVRva2VuKFRva2VuVHlwZS5HVF9HVCwgdG9rZW4uY2hhck9mZnNldCArIDEpCiAgICAgIC8vIFNldCBuZXh0IHJhdGhlciB0aGFuIGNhbGxpbmcgVG9rZW4uc2V0TmV4dAogICAgICAvLyBzbyB0aGF0IHRoZSBwcmV2aW91cyB0b2tlbiBpcyBub3Qgc2V0LgogICAgICAuLm5leHQgPSB0b2tlbi5uZXh0KTsKfQoKLy8vIFNwbGl0IGA+Pj49YCBpbnRvIHR3byBzZXBhcmF0ZSB0b2tlbnMuLi4gYD5gIGZvbGxvd2VkIGJ5IGA+Pj1gLgovLy8gQ2FsbCBbVG9rZW4uc2V0TmV4dF0gdG8gYWRkIHRoZSB0b2tlbiB0byB0aGUgc3RyZWFtLgpUb2tlbiBzcGxpdEd0RnJvbUd0R3RHdEVxKFRva2VuIHRva2VuKSB7CiAgYXNzZXJ0KG9wdGlvbmFsKCc+Pj49JywgdG9rZW4pKTsKICByZXR1cm4gbmV3IFNpbXBsZVRva2VuKAogICAgICBUb2tlblR5cGUuR1QsIHRva2VuLmNoYXJPZmZzZXQsIHRva2VuLnByZWNlZGluZ0NvbW1lbnRzKQogICAgLi5zZXROZXh0KG5ldyBTaW1wbGVUb2tlbihUb2tlblR5cGUuR1RfR1RfRVEsIHRva2VuLmNoYXJPZmZzZXQgKyAxKQogICAgICAvLyBTZXQgbmV4dCByYXRoZXIgdGhhbiBjYWxsaW5nIFRva2VuLnNldE5leHQKICAgICAgLy8gc28gdGhhdCB0aGUgcHJldmlvdXMgdG9rZW4gaXMgbm90IHNldC4KICAgICAgLi5uZXh0ID0gdG9rZW4ubmV4dCk7Cn0KCi8vLyBSZXR1cm4gYSBzeW50aGV0aWMgYDxgIGZvbGxvd2VkIGJ5IFtuZXh0XS4KLy8vIENhbGwgW1Rva2VuLnNldE5leHRdIHRvIGFkZCB0aGUgdG9rZW4gdG8gdGhlIHN0cmVhbS4KVG9rZW4gc3ludGhldGljR3QoVG9rZW4gbmV4dCkgewogIHJldHVybiBuZXcgU3ludGhldGljVG9rZW4oVG9rZW5UeXBlLkdULCBuZXh0LmNoYXJPZmZzZXQpCiAgICAvLyBTZXQgbmV4dCByYXRoZXIgdGhhbiBjYWxsaW5nIFRva2VuLnNldE5leHQKICAgIC8vIHNvIHRoYXQgdGhlIHByZXZpb3VzIHRva2VuIGlzIG5vdCBzZXQuCiAgICAuLm5leHQgPSBuZXh0Owp9CoDWAE5OPAEbATABLAElASI9AT4rLgIBRjsyIhoRBBYbMhIXBBACAT01NDMsHA0GFgQQAgE8NVEsQxgEEAIBTxkiOwIBLwFKAToBSwFENSYnEwYEEAIBTjomJxMGBBYCAU8QIjICAU5OIysxMTECASIWIBsbEhciFBkfFhsIBj0dGQYEEAIBKTkfIRo/QjQwHAIBKTklIRo/QjQwHAIBLDkhIho/QkQ2Mh8CAUI5JyIaP0U0MBwCAUI5JyIaP0U0MBwCAUQ5KSMaP0g0MBwCAS85IDsyLhMCASxwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL3V0aWwuZGFydD9zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvaWdub3JlZF9wYXJzZXJfZXJyb3JzLmRhcnSCii8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmlnbm9yZWRfcGFyc2VyX2Vycm9yczsKCmltcG9ydCAnZmFzdGFfY29kZXMuZGFydCcgc2hvdyBDb2RlLCBjb2RlTm9uUGFydE9mRGlyZWN0aXZlSW5QYXJ0OwoKaW1wb3J0ICdwYXJzZXIuZGFydCcgc2hvdyBvcHRpb25hbDsKCmltcG9ydCAnc2Nhbm5lci5kYXJ0JyBzaG93IFRva2VuOwoKYm9vbCBpc0lnbm9yZWRQYXJzZXJFcnJvcihDb2RlPE9iamVjdD4gY29kZSwgVG9rZW4gdG9rZW4pIHsKICBpZiAoY29kZSA9PSBjb2RlTm9uUGFydE9mRGlyZWN0aXZlSW5QYXJ0KSB7CiAgICAvLyBJZ25vcmVkLiBUaGlzIGVycm9yIGlzIGhhbmRsZWQgaW4gdGhlIG91dGxpbmUgcGhhc2UgKHBhcnQgcmVzb2x1dGlvbikuCiAgICByZXR1cm4gb3B0aW9uYWwoInBhcnQiLCB0b2tlbik7CiAgfSBlbHNlIHsKICAgIHJldHVybiBmYWxzZTsKICB9Cn0KFgBOTjwBJQFDASQBIgE8Lk4kCxIEAgE2cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2lnbm9yZWRfcGFyc2VyX2Vycm9ycy5kYXJ0P3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zb3VyY2Uvc3RhY2tfbGlzdGVuZXIuZGFydLEpLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuc3RhY2tfbGlzdGVuZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdyBBc3luY01hcmtlciwgRXhwcmVzc2lvbiwgRnVuY3Rpb25Ob2RlLCBUcmVlTm9kZTsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cKICAgICAgICBDb2RlLAogICAgICAgIExvY2F0ZWRNZXNzYWdlLAogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgY29kZUNhdGNoU3ludGF4RXh0cmFQYXJhbWV0ZXJzLAogICAgICAgIGNvZGVOYXRpdmVDbGF1c2VTaG91bGRCZUFubm90YXRpb24sCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1TdGFja05vdEVtcHR5OwoKaW1wb3J0ICcuLi9wYXJzZXIuZGFydCcKICAgIHNob3cgTGlzdGVuZXIsIE1lbWJlcktpbmQsIFBhcnNlciwgbGVuZ3RoT2ZTcGFuLCBvZmZzZXRGb3JUb2tlbjsKCmltcG9ydCAnLi4vcGFyc2VyL2lkZW50aWZpZXJfY29udGV4dC5kYXJ0JyBzaG93IElkZW50aWZpZXJDb250ZXh0OwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JwogICAgc2hvdyBpbnRlcm5hbFByb2JsZW0sIHVuaGFuZGxlZCwgdW5pbXBsZW1lbnRlZCwgdW5zdXBwb3J0ZWQ7CgppbXBvcnQgJy4uL3F1b3RlLmRhcnQnIHNob3cgdW5lc2NhcGVTdHJpbmc7CgppbXBvcnQgJy4uL3NjYW5uZXIuZGFydCcgc2hvdyBUb2tlbjsKCmVudW0gTnVsbFZhbHVlIHsKICBBcmd1bWVudHMsCiAgQXMsCiAgQXdhaXRUb2tlbiwKICBCbG9jaywKICBCcmVha1RhcmdldCwKICBDYXNjYWRlUmVjZWl2ZXIsCiAgQ29tYmluYXRvcnMsCiAgQ29tbWVudHMsCiAgQ29uZGl0aW9uYWxVcmlzLAogIENvbmRpdGlvbmFsbHlTZWxlY3RlZEltcG9ydCwKICBDb25zdHJ1Y3RvckluaXRpYWxpemVyU2VwYXJhdG9yLAogIENvbnN0cnVjdG9ySW5pdGlhbGl6ZXJzLAogIENvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzLAogIENvbnRpbnVlVGFyZ2V0LAogIERlZmVycmVkLAogIERvY3VtZW50YXRpb25Db21tZW50LAogIEV4cHJlc3Npb24sCiAgRXh0ZW5kc0NsYXVzZSwKICBGaWVsZEluaXRpYWxpemVyLAogIEZvcm1hbFBhcmFtZXRlcnMsCiAgRnVuY3Rpb25Cb2R5LAogIEZ1bmN0aW9uQm9keUFzeW5jVG9rZW4sCiAgRnVuY3Rpb25Cb2R5U3RhclRva2VuLAogIElkZW50aWZpZXIsCiAgSWRlbnRpZmllckxpc3QsCiAgSW5pdGlhbGl6ZXJzLAogIExhYmVscywKICBNZXRhZGF0YSwKICBNb2RpZmllcnMsCiAgUGFyYW1ldGVyRGVmYXVsdFZhbHVlLAogIFByZWZpeCwKICBTdHJpbmdMaXRlcmFsLAogIFN3aXRjaFNjb3BlLAogIFR5cGUsCiAgVHlwZUFyZ3VtZW50cywKICBUeXBlQnVpbGRlckxpc3QsCiAgVHlwZUxpc3QsCiAgVHlwZVZhcmlhYmxlLAogIFR5cGVWYXJpYWJsZXMsCiAgVmFyRmluYWxPckNvbnN0VG9rZW4sCiAgV2l0aENsYXVzZSwKfQoKYWJzdHJhY3QgY2xhc3MgU3RhY2tMaXN0ZW5lciBleHRlbmRzIExpc3RlbmVyIHsKICBmaW5hbCBTdGFjayBzdGFjayA9IG5ldyBTdGFjaygpOwoKICBAb3ZlcnJpZGUKICBVcmkgZ2V0IHVyaTsKCiAgdm9pZCBkaXNjYXJkKGludCBuKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICBwb3AoKTsKICAgIH0KICB9CgogIC8vIFRPRE8oYWhlKTogVGhpcyBkb2Vzbid0IGJlbG9uZyBoZXJlLiBPbmx5IGltcGxlbWVudGVkIGJ5IGJvZHlfYnVpbGRlci5kYXJ0CiAgLy8gYW5kIGFzdF9idWlsZGVyLmRhcnQuCiAgdm9pZCBmaW5pc2hGdW5jdGlvbihjb3ZhcmlhbnQgTGlzdDxPYmplY3Q+IGFubm90YXRpb25zLCBjb3ZhcmlhbnQgZm9ybWFscywKICAgICAgQXN5bmNNYXJrZXIgYXN5bmNNb2RpZmllciwgY292YXJpYW50IGJvZHkpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiZmluaXNoRnVuY3Rpb24iLCAtMSwgdXJpKTsKICB9CgogIC8vIFRPRE8oYWhlKTogVGhpcyBkb2Vzbid0IGJlbG9uZyBoZXJlLiBPbmx5IGltcGxlbWVudGVkIGJ5IGJvZHlfYnVpbGRlci5kYXJ0CiAgLy8gYW5kIGFzdF9idWlsZGVyLmRhcnQuCiAgZHluYW1pYyBmaW5pc2hGaWVsZHMoKSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoImZpbmlzaEZpZWxkcyIsIC0xLCB1cmkpOwogIH0KCiAgLy8gVE9ETyhhaGUpOiBUaGlzIGRvZXNuJ3QgYmVsb25nIGhlcmUuIE9ubHkgaW1wbGVtZW50ZWQgYnkgYm9keV9idWlsZGVyLmRhcnQKICAvLyBhbmQgYXN0X2J1aWxkZXIuZGFydC4KICBMaXN0PEV4cHJlc3Npb24+IGZpbmlzaE1ldGFkYXRhKFRyZWVOb2RlIHBhcmVudCkgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCJmaW5pc2hNZXRhZGF0YSIsIC0xLCB1cmkpOwogIH0KCiAgLy8gVE9ETyhhaGUpOiBUaGlzIGRvZXNuJ3QgYmVsb25nIGhlcmUuIE9ubHkgaW1wbGVtZW50ZWQgYnkgYm9keV9idWlsZGVyLmRhcnQKICAvLyBhbmQgYXN0X2J1aWxkZXIuZGFydC4KICB2b2lkIGV4aXRMb2NhbFNjb3BlKCkgPT4gdW5zdXBwb3J0ZWQoImV4aXRMb2NhbFNjb3BlIiwgLTEsIHVyaSk7CgogIC8vIFRPRE8oYWhlKTogVGhpcyBkb2Vzbid0IGJlbG9uZyBoZXJlLiBPbmx5IGltcGxlbWVudGVkIGJ5IGJvZHlfYnVpbGRlci5kYXJ0LgogIGR5bmFtaWMgcGFyc2VTaW5nbGVFeHByZXNzaW9uKAogICAgICBQYXJzZXIgcGFyc2VyLCBUb2tlbiB0b2tlbiwgRnVuY3Rpb25Ob2RlIHBhcmFtZXRlcnMpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiZmluaXNoU2luZ2xlRXhwcmVzc2lvbiIsIC0xLCB1cmkpOwogIH0KCiAgdm9pZCBwdXNoKE9iamVjdCBub2RlKSB7CiAgICBpZiAobm9kZSA9PSBudWxsKSB1bmhhbmRsZWQoIm51bGwiLCAicHVzaCIsIC0xLCB1cmkpOwogICAgc3RhY2sucHVzaChub2RlKTsKICB9CgogIHZvaWQgcHVzaElmTnVsbChUb2tlbiB0b2tlbk9yTnVsbCwgTnVsbFZhbHVlIG51bGxWYWx1ZSkgewogICAgaWYgKHRva2VuT3JOdWxsID09IG51bGwpIHN0YWNrLnB1c2gobnVsbFZhbHVlKTsKICB9CgogIE9iamVjdCBwZWVrKCkgPT4gc3RhY2suaXNOb3RFbXB0eSA/IHN0YWNrLmxhc3QgOiBudWxsOwoKICBPYmplY3QgcG9wKFtOdWxsVmFsdWUgbnVsbFZhbHVlXSkgewogICAgcmV0dXJuIHN0YWNrLnBvcChudWxsVmFsdWUpOwogIH0KCiAgT2JqZWN0IHBvcElmTm90TnVsbChPYmplY3QgdmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gbnVsbCA6IHBvcCgpOwogIH0KCiAgdm9pZCBkZWJ1Z0V2ZW50KFN0cmluZyBuYW1lKSB7CiAgICAvLyBwcmludEV2ZW50KG5hbWUpOwogIH0KCiAgdm9pZCBwcmludEV2ZW50KFN0cmluZyBuYW1lKSB7CiAgICBwcmludCgnXG4tLS0tLS0tLS0tLS0tLS0tLS0nKTsKICAgIGZvciAoT2JqZWN0IG8gaW4gc3RhY2sudmFsdWVzKSB7CiAgICAgIFN0cmluZyBzID0gIiAgJG8iOwogICAgICBpbnQgaW5kZXggPSBzLmluZGV4T2YoIlxuIik7CiAgICAgIGlmIChpbmRleCAhPSAtMSkgewogICAgICAgIHMgPSBzLnN1YnN0cmluZygwLCBpbmRleCkgKyAiLi4uIjsKICAgICAgfQogICAgICBwcmludChzKTsKICAgIH0KICAgIHByaW50KCIgID4+ICRuYW1lIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGxvZ0V2ZW50KFN0cmluZyBuYW1lKSB7CiAgICBwcmludEV2ZW50KG5hbWUpOwogICAgdW5oYW5kbGVkKG5hbWUsICIkcnVudGltZVR5cGUiLCAtMSwgdXJpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgZGVidWdFdmVudCgiaGFuZGxlSWRlbnRpZmllciIpOwogICAgaWYgKCF0b2tlbi5pc1N5bnRoZXRpYykgewogICAgICBwdXNoKHRva2VuLmxleGVtZSk7CiAgICB9IGVsc2UgewogICAgICAvLyBUaGlzIGNvbWVzIGZyb20gYSBzeW50aGV0aWMgdG9rZW4gd2hpY2ggaXMgaW5zZXJ0ZWQgYnkgdGhlIHBhcnNlciBpbgogICAgICAvLyBhbiBhdHRlbXB0IHRvIHJlY292ZXIuICBUaGlzIGFsbW9zdCBhbHdheXMgbWVhbnMgdGhhdCB0aGUgcGFyc2VyIGhhcwogICAgICAvLyBnb3R0ZW4gdmVyeSBjb25mdXNlZCBhbmQgd2UgbmVlZCB0byBpZ25vcmUgdGhlIHJlc3VsdHMuCiAgICAgIHB1c2gobmV3IFBhcnNlclJlY292ZXJ5KHRva2VuLmNoYXJPZmZzZXQpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9OYW1lKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb05hbWUiKTsKICAgIHB1c2goTnVsbFZhbHVlLklkZW50aWZpZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRJbml0aWFsaXplcihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiSW5pdGlhbGl6ZXIiKTsKICB9CgogIHZvaWQgY2hlY2tFbXB0eShpbnQgY2hhck9mZnNldCkgewogICAgaWYgKHN0YWNrLmlzTm90RW1wdHkpIHsKICAgICAgaW50ZXJuYWxQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1TdGFja05vdEVtcHR5LndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgIiR7cnVudGltZVR5cGV9Iiwgc3RhY2sudmFsdWVzLmpvaW4oIlxuICAiKSksCiAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgdXJpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVG9wTGV2ZWxEZWNsYXJhdGlvbihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiVG9wTGV2ZWxEZWNsYXJhdGlvbiIpOwogICAgY2hlY2tFbXB0eSh0b2tlbi5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ29tcGlsYXRpb25Vbml0KGludCBjb3VudCwgVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkNvbXBpbGF0aW9uVW5pdCIpOwogICAgY2hlY2tFbXB0eSh0b2tlbi5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ2xhc3NFeHRlbmRzKFRva2VuIGV4dGVuZHNLZXl3b3JkKSB7CiAgICBkZWJ1Z0V2ZW50KCJDbGFzc0V4dGVuZHMiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTWl4aW5PbihUb2tlbiBvbktleXdvcmQsIGludCB0eXBlQ291bnQpIHsKICAgIGRlYnVnRXZlbnQoIk1peGluT24iKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ2xhc3NIZWFkZXIoVG9rZW4gYmVnaW4sIFRva2VuIGNsYXNzS2V5d29yZCwgVG9rZW4gbmF0aXZlVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkNsYXNzSGVhZGVyIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU1peGluSGVhZGVyKFRva2VuIG1peGluS2V5d29yZCkgewogICAgZGVidWdFdmVudCgiTWl4aW5IZWFkZXIiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlUmVjb3ZlckNsYXNzSGVhZGVyKCkgewogICAgZGVidWdFdmVudCgiUmVjb3ZlckNsYXNzSGVhZGVyIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVJlY292ZXJNaXhpbkhlYWRlcigpIHsKICAgIGRlYnVnRXZlbnQoIlJlY292ZXJNaXhpbkhlYWRlciIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDbGFzc09yTWl4aW5JbXBsZW1lbnRzKAogICAgICBUb2tlbiBpbXBsZW1lbnRzS2V5d29yZCwgaW50IGludGVyZmFjZXNDb3VudCkgewogICAgZGVidWdFdmVudCgiQ2xhc3NJbXBsZW1lbnRzIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vVHlwZUFyZ3VtZW50cyhUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTm9UeXBlQXJndW1lbnRzIik7CiAgICBwdXNoKE51bGxWYWx1ZS5UeXBlQXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9UeXBlVmFyaWFibGVzKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb1R5cGVWYXJpYWJsZXMiKTsKICAgIHB1c2goTnVsbFZhbHVlLlR5cGVWYXJpYWJsZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0NvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb0NvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vVHlwZShUb2tlbiBsYXN0Q29uc3VtZWQpIHsKICAgIGRlYnVnRXZlbnQoIk5vVHlwZSIpOwogICAgcHVzaChOdWxsVmFsdWUuVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vRm9ybWFsUGFyYW1ldGVycyhUb2tlbiB0b2tlbiwgTWVtYmVyS2luZCBraW5kKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb0Zvcm1hbFBhcmFtZXRlcnMiKTsKICAgIHB1c2goTnVsbFZhbHVlLkZvcm1hbFBhcmFtZXRlcnMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0FyZ3VtZW50cyhUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTm9Bcmd1bWVudHMiKTsKICAgIHB1c2goTnVsbFZhbHVlLkFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keShUb2tlbiBuYXRpdmVUb2tlbiwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJOYXRpdmVGdW5jdGlvbkJvZHkiKTsKICAgIHB1c2goTnVsbFZhbHVlLkZ1bmN0aW9uQm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keUlnbm9yZWQoVG9rZW4gbmF0aXZlVG9rZW4sIFRva2VuIHNlbWljb2xvbikgewogICAgZGVidWdFdmVudCgiTmF0aXZlRnVuY3Rpb25Cb2R5SWdub3JlZCIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHlTa2lwcGVkKFRva2VuIG5hdGl2ZVRva2VuLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGRlYnVnRXZlbnQoIk5hdGl2ZUZ1bmN0aW9uQm9keVNraXBwZWQiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9GdW5jdGlvbkJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIk5vRnVuY3Rpb25Cb2R5Iik7CiAgICBwdXNoKE51bGxWYWx1ZS5GdW5jdGlvbkJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0luaXRpYWxpemVycygpIHsKICAgIGRlYnVnRXZlbnQoIk5vSW5pdGlhbGl6ZXJzIik7CiAgICBwdXNoKE51bGxWYWx1ZS5Jbml0aWFsaXplcnMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVQYXJlbnRoZXNpemVkQ29uZGl0aW9uKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJoYW5kbGVQYXJlbnRoZXNpemVkQ29uZGl0aW9uIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkxpdGVyYWxTdHJpbmcoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luTGl0ZXJhbFN0cmluZyIpOwogICAgcHVzaCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZExpdGVyYWxTdHJpbmcoaW50IGludGVycG9sYXRpb25Db3VudCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZExpdGVyYWxTdHJpbmciKTsKICAgIGlmIChpbnRlcnBvbGF0aW9uQ291bnQgPT0gMCkgewogICAgICBUb2tlbiB0b2tlbiA9IHBvcCgpOwogICAgICBwdXNoKHVuZXNjYXBlU3RyaW5nKHRva2VuLmxleGVtZSwgdG9rZW4sIHRoaXMpKTsKICAgIH0gZWxzZSB7CiAgICAgIHVuaW1wbGVtZW50ZWQoInN0cmluZyBpbnRlcnBvbGF0aW9uIiwgZW5kVG9rZW4uY2hhck9mZnNldCwgdXJpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTmF0aXZlQ2xhdXNlKFRva2VuIG5hdGl2ZVRva2VuLCBib29sIGhhc05hbWUpIHsKICAgIGRlYnVnRXZlbnQoIk5hdGl2ZUNsYXVzZSIpOwogICAgaWYgKGhhc05hbWUpIHsKICAgICAgcG9wKCk7IC8vIFBvcCB0aGUgbmF0aXZlIG5hbWUgd2hpY2ggaXMgYSBTdHJpbmcuCiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZURpcmVjdGl2ZXNPbmx5KCkgewogICAgcG9wKCk7IC8vIERpc2NhcmQgdGhlIG1ldGFkYXRhLgogIH0KCiAgdm9pZCBoYW5kbGVFeHRyYW5lb3VzRXhwcmVzc2lvbihUb2tlbiB0b2tlbiwgTWVzc2FnZSBtZXNzYWdlKSB7CiAgICBkZWJ1Z0V2ZW50KCJFeHRyYW5lb3VzRXhwcmVzc2lvbiIpOwogICAgcG9wKCk7IC8vIERpc2NhcmQgdGhlIGV4dHJhbmVvdXMgZXhwcmVzc2lvbi4KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ2FzZUV4cHJlc3Npb24oVG9rZW4gY29sb24pIHsKICAgIGRlYnVnRXZlbnQoIkNhc2VFeHByZXNzaW9uIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENhdGNoQ2xhdXNlKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJDYXRjaENsYXVzZSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVSZWNvdmVyYWJsZUVycm9yKAogICAgICBNZXNzYWdlIG1lc3NhZ2UsIFRva2VuIHN0YXJ0VG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJFcnJvcjogJHttZXNzYWdlLm1lc3NhZ2V9Iik7CiAgICBpZiAoaXNJZ25vcmVkRXJyb3IobWVzc2FnZS5jb2RlLCBzdGFydFRva2VuKSkgcmV0dXJuOwogICAgYWRkUHJvYmxlbShtZXNzYWdlLCBvZmZzZXRGb3JUb2tlbihzdGFydFRva2VuKSwKICAgICAgICBsZW5ndGhPZlNwYW4oc3RhcnRUb2tlbiwgZW5kVG9rZW4pKTsKICB9CgogIGJvb2wgaXNJZ25vcmVkRXJyb3IoQ29kZSBjb2RlLCBUb2tlbiB0b2tlbikgewogICAgaWYgKGNvZGUgPT0gY29kZU5hdGl2ZUNsYXVzZVNob3VsZEJlQW5ub3RhdGlvbikgewogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogSWdub3JlIHRoaXMgZXJyb3IgdW50aWwgd2UgZGVwcmVjYXRlIGBuYXRpdmVgCiAgICAgIC8vIHN1cHBvcnQuCiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIGlmIChjb2RlID09IGNvZGVDYXRjaFN5bnRheEV4dHJhUGFyYW1ldGVycykgewogICAgICAvLyBJZ25vcmVkLiBUaGlzIGVycm9yIGlzIGhhbmRsZWQgYnkgdGhlIEJvZHlCdWlsZGVyLgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVW5lc2NhcGVFcnJvcigKICAgICAgTWVzc2FnZSBtZXNzYWdlLCBUb2tlbiB0b2tlbiwgaW50IHN0cmluZ09mZnNldCwgaW50IGxlbmd0aCkgewogICAgYWRkUHJvYmxlbShtZXNzYWdlLCB0b2tlbi5jaGFyT2Zmc2V0ICsgc3RyaW5nT2Zmc2V0LCBsZW5ndGgpOwogIH0KCiAgdm9pZCBhZGRQcm9ibGVtKE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgsCiAgICAgIHtib29sIHdhc0hhbmRsZWQ6IGZhbHNlLCBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0fSk7Cn0KCmNsYXNzIFN0YWNrIHsKICBMaXN0PE9iamVjdD4gYXJyYXkgPSBuZXcgTGlzdDxPYmplY3Q+KDgpOwogIGludCBhcnJheUxlbmd0aCA9IDA7CgogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gYXJyYXlMZW5ndGggPiAwOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBhcnJheUxlbmd0aDsKCiAgT2JqZWN0IGdldCBsYXN0IHsKICAgIGZpbmFsIHZhbHVlID0gYXJyYXlbYXJyYXlMZW5ndGggLSAxXTsKICAgIHJldHVybiB2YWx1ZSBpcyBOdWxsVmFsdWUgPyBudWxsIDogdmFsdWU7CiAgfQoKICB2b2lkIHB1c2goT2JqZWN0IHZhbHVlKSB7CiAgICBhcnJheVthcnJheUxlbmd0aCsrXSA9IHZhbHVlOwogICAgaWYgKGFycmF5Lmxlbmd0aCA9PSBhcnJheUxlbmd0aCkgewogICAgICBfZ3JvdygpOwogICAgfQogIH0KCiAgT2JqZWN0IHBvcChOdWxsVmFsdWUgbnVsbFZhbHVlKSB7CiAgICBhc3NlcnQoYXJyYXlMZW5ndGggPiAwKTsKICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGFycmF5Wy0tYXJyYXlMZW5ndGhdOwogICAgYXJyYXlbYXJyYXlMZW5ndGhdID0gbnVsbDsKICAgIGlmICh2YWx1ZSBpcyEgTnVsbFZhbHVlKSB7CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0gZWxzZSBpZiAobnVsbFZhbHVlID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbFZhbHVlKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQogIH0KCiAgTGlzdDxPYmplY3Q+IHBvcExpc3QoaW50IGNvdW50LCBMaXN0PE9iamVjdD4gbGlzdCwgTnVsbFZhbHVlIG51bGxWYWx1ZSkgewogICAgYXNzZXJ0KGFycmF5TGVuZ3RoID49IGNvdW50KTsKICAgIGZpbmFsIExpc3Q8T2JqZWN0PiBhcnJheSA9IHRoaXMuYXJyYXk7CiAgICBmaW5hbCBpbnQgbGVuZ3RoID0gYXJyYXlMZW5ndGg7CiAgICBmaW5hbCBpbnQgc3RhcnRJbmRleCA9IGxlbmd0aCAtIGNvdW50OwogICAgYm9vbCBpc1BhcnNlclJlY292ZXJ5ID0gZmFsc2U7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgaW50IGFycmF5SW5kZXggPSBzdGFydEluZGV4ICsgaTsKICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gYXJyYXlbYXJyYXlJbmRleF07CiAgICAgIGFycmF5W2FycmF5SW5kZXhdID0gbnVsbDsKICAgICAgaWYgKHZhbHVlIGlzIE51bGxWYWx1ZSAmJiBudWxsVmFsdWUgPT0gbnVsbCB8fAogICAgICAgICAgaWRlbnRpY2FsKHZhbHVlLCBudWxsVmFsdWUpKSB7CiAgICAgICAgbGlzdFtpXSA9IG51bGw7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgICBpc1BhcnNlclJlY292ZXJ5ID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAodmFsdWUgaXMgTnVsbFZhbHVlKSB7CiAgICAgICAgICBwcmludCh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGxpc3RbaV0gPSB2YWx1ZTsKICAgICAgfQogICAgfQogICAgYXJyYXlMZW5ndGggLT0gY291bnQ7CgogICAgcmV0dXJuIGlzUGFyc2VyUmVjb3ZlcnkgPyBudWxsIDogbGlzdDsKICB9CgogIExpc3Q8T2JqZWN0PiBnZXQgdmFsdWVzIHsKICAgIGZpbmFsIGludCBsZW5ndGggPSBhcnJheUxlbmd0aDsKICAgIGZpbmFsIExpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IExpc3Q8T2JqZWN0PihsZW5ndGgpOwogICAgbGlzdC5zZXRSYW5nZSgwLCBsZW5ndGgsIGFycmF5KTsKICAgIHJldHVybiBsaXN0OwogIH0KCiAgdm9pZCBfZ3JvdygpIHsKICAgIGZpbmFsIGludCBsZW5ndGggPSBhcnJheS5sZW5ndGg7CiAgICBmaW5hbCBMaXN0PE9iamVjdD4gbmV3QXJyYXkgPSBuZXcgTGlzdDxPYmplY3Q+KGxlbmd0aCAqIDIpOwogICAgbmV3QXJyYXkuc2V0UmFuZ2UoMCwgbGVuZ3RoLCBhcnJheSwgMCk7CiAgICBhcnJheSA9IG5ld0FycmF5OwogIH0KfQoKLy8vIEhlbHBlciBjb25zdGFudCBmb3IgcG9wcGluZyBhIGxpc3Qgb2YgdGhlIHRvcCBvZiBhIFtTdGFja10uICBUaGlzIGhlbHBlcgovLy8gcmV0dXJucyBudWxsIGluc3RlYWQgb2YgZW1wdHkgbGlzdHMsIGFuZCB0aGUgbGlzdHMgcmV0dXJuZWQgYXJlIG9mIGZpeGVkCi8vLyBsZW5ndGguCmNsYXNzIEZpeGVkTnVsbGFibGVMaXN0PFQ+IHsKICBjb25zdCBGaXhlZE51bGxhYmxlTGlzdCgpOwoKICBMaXN0PFQ+IHBvcChTdGFjayBzdGFjaywgaW50IGNvdW50LCBbTnVsbFZhbHVlIG51bGxWYWx1ZV0pIHsKICAgIGlmIChjb3VudCA9PSAwKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBzdGFjay5wb3BMaXN0KGNvdW50LCBuZXcgTGlzdDxUPihjb3VudCksIG51bGxWYWx1ZSk7CiAgfQoKICBMaXN0PFQ+IHBvcFBhZGRlZChTdGFjayBzdGFjaywgaW50IGNvdW50LCBpbnQgcGFkZGluZywKICAgICAgW051bGxWYWx1ZSBudWxsVmFsdWVdKSB7CiAgICBpZiAoY291bnQgKyBwYWRkaW5nID09IDApIHJldHVybiBudWxsOwogICAgcmV0dXJuIHN0YWNrLnBvcExpc3QoY291bnQsIG5ldyBMaXN0PFQ+KGNvdW50ICsgcGFkZGluZyksIG51bGxWYWx1ZSk7CiAgfQp9CgovLy8gSGVscGVyIGNvbnN0YW50IGZvciBwb3BwaW5nIGEgbGlzdCBvZiB0aGUgdG9wIG9mIGEgW1N0YWNrXS4gIFRoaXMgaGVscGVyCi8vLyByZXR1cm5zIGdyb3dhYmxlIGxpc3RzIChhbHNvIHdoZW4gZW1wdHkpLgpjbGFzcyBHcm93YWJsZUxpc3Q8VD4gewogIGNvbnN0IEdyb3dhYmxlTGlzdCgpOwoKICBMaXN0PFQ+IHBvcChTdGFjayBzdGFjaywgaW50IGNvdW50LCBbTnVsbFZhbHVlIG51bGxWYWx1ZV0pIHsKICAgIHJldHVybiBzdGFjay5wb3BMaXN0KAogICAgICAgIGNvdW50LCBuZXcgTGlzdDxUPi5maWxsZWQoY291bnQsIG51bGwsIGdyb3dhYmxlOiB0cnVlKSwgbnVsbFZhbHVlKTsKICB9Cn0KCmNsYXNzIFBhcnNlclJlY292ZXJ5IHsKICBmaW5hbCBpbnQgY2hhck9mZnNldDsKICBQYXJzZXJSZWNvdmVyeSh0aGlzLmNoYXJPZmZzZXQpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiUGFyc2VyUmVjb3ZlcnkoQCRjaGFyT2Zmc2V0KSI7Cn0KgfUATk48AR4BIToBHQkOGBEoLC4BGEUBQwEaQQEsASUBEQ0GDgkPEw8MEx8jGzYSDBgOERQUEBoZDhIQCgwNGQoRDwgREwwQERgOAgEwIwEMDwEYIg0GBAFQG00zMwQBUBsbMQQBUBs1MwQBUBtDAVEhPTsEARs6FgQBPDQEATkBJiEEASYpBAEhGQQBISMlGSMZKwgQBhkEAQwfFi4EAQxCJB4aDU5OQTIGBAEMIxogBAEMJR8EASQcFz48FhAGBAEMLSciBAEMNCMiBAEMMiAEAQw3GwQBDE8fBAEMLx8EAQwkJgQBDCQmBAEMJTYjBAEMLCMjBAEMLCMjBAEMUUgEAQwqGhoEAQxAJiYEAQwoHx8EAQxGJiIEAQxNLQQBDE0tBAEMKyIiBAEMICIiBAEMMzAEAQw0KwQBDCkmEQQBDEIkIxs3DUcGBAEMPSATNwYEAQwgJAQBQigxBAEMKCIEAQwlHwQBDB87LTo0LQQBMDZHEhM5PBMNFAYEAQwcREIEAT8/AgEOLBcBKgEhARQqLgQBHCInDwYEASQdLx8fFDoTDRQGBAFMIiskKyMmJy4gNSkYLCEPIhgKGQgGGgErBAEcJDglEQQBESVALBYEAgFNTQwdHQE/IUAEATkfK0oEAgFNLhgYAT8aTAQCARcYIwE3AgE2cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NvdXJjZS9zdGFja19saXN0ZW5lci5kYXJ0P3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zY2FubmVyL2tleXdvcmRfc3RhdGUuZGFydJCZLy8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuc2Nhbm5lci5rZXl3b3JkczsKCmltcG9ydCAnLi4vLi4vc2Nhbm5lci90b2tlbi5kYXJ0JyBhcyBhbmFseXplcjsKCmltcG9ydCAnY2hhcmFjdGVycy5kYXJ0JyBzaG93ICRhLCAkeiwgJEEsICRaOwoKLyoqCiAqIEFic3RyYWN0IHN0YXRlIGluIGEgc3RhdGUgbWFjaGluZSBmb3Igc2Nhbm5pbmcga2V5d29yZHMuCiAqLwphYnN0cmFjdCBjbGFzcyBLZXl3b3JkU3RhdGUgewogIEtleXdvcmRTdGF0ZSBuZXh0KGludCBjKTsKICBLZXl3b3JkU3RhdGUgbmV4dENhcGl0YWwoaW50IGMpOwoKICBhbmFseXplci5LZXl3b3JkIGdldCBrZXl3b3JkOwoKICBzdGF0aWMgS2V5d29yZFN0YXRlIF9LRVlXT1JEX1NUQVRFOwogIHN0YXRpYyBLZXl3b3JkU3RhdGUgZ2V0IEtFWVdPUkRfU1RBVEUgewogICAgaWYgKF9LRVlXT1JEX1NUQVRFID09IG51bGwpIHsKICAgICAgTGlzdDxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgTGlzdDxTdHJpbmc+KGFuYWx5emVyLktleXdvcmQudmFsdWVzLmxlbmd0aCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYW5hbHl6ZXIuS2V5d29yZC52YWx1ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBzdHJpbmdzW2ldID0gYW5hbHl6ZXIuS2V5d29yZC52YWx1ZXNbaV0ubGV4ZW1lOwogICAgICB9CiAgICAgIHN0cmluZ3Muc29ydCgoYSwgYikgPT4gYS5jb21wYXJlVG8oYikpOwogICAgICBfS0VZV09SRF9TVEFURSA9IGNvbXB1dGVLZXl3b3JkU3RhdGVUYWJsZSgwLCBzdHJpbmdzLCAwLCBzdHJpbmdzLmxlbmd0aCk7CiAgICB9CiAgICByZXR1cm4gX0tFWVdPUkRfU1RBVEU7CiAgfQoKICBzdGF0aWMgS2V5d29yZFN0YXRlIGNvbXB1dGVLZXl3b3JkU3RhdGVUYWJsZSgKICAgICAgaW50IHN0YXJ0LCBMaXN0PFN0cmluZz4gc3RyaW5ncywgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewogICAgYm9vbCBpc0xvd2VyY2FzZSA9IHRydWU7CgogICAgTGlzdDxLZXl3b3JkU3RhdGU+IHRhYmxlID0gbmV3IExpc3Q8S2V5d29yZFN0YXRlPigkeiAtICRBICsgMSk7CiAgICBhc3NlcnQobGVuZ3RoICE9IDApOwogICAgaW50IGNodW5rID0gMDsKICAgIGludCBjaHVua1N0YXJ0ID0gLTE7CiAgICBib29sIGlzTGVhZiA9IGZhbHNlOwogICAgZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IG9mZnNldCArIGxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChzdHJpbmdzW2ldLmxlbmd0aCA9PSBzdGFydCkgewogICAgICAgIGlzTGVhZiA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKHN0cmluZ3NbaV0ubGVuZ3RoID4gc3RhcnQpIHsKICAgICAgICBpbnQgYyA9IHN0cmluZ3NbaV0uY29kZVVuaXRBdChzdGFydCk7CiAgICAgICAgaWYgKCRBIDw9IGMgJiYgYyA8PSAkWikgewogICAgICAgICAgaXNMb3dlcmNhc2UgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKGNodW5rICE9IGMpIHsKICAgICAgICAgIGlmIChjaHVua1N0YXJ0ICE9IC0xKSB7CiAgICAgICAgICAgIGFzc2VydCh0YWJsZVtjaHVuayAtICRBXSA9PSBudWxsKTsKICAgICAgICAgICAgdGFibGVbY2h1bmsgLSAkQV0gPSBjb21wdXRlS2V5d29yZFN0YXRlVGFibGUoCiAgICAgICAgICAgICAgICBzdGFydCArIDEsIHN0cmluZ3MsIGNodW5rU3RhcnQsIGkgLSBjaHVua1N0YXJ0KTsKICAgICAgICAgIH0KICAgICAgICAgIGNodW5rU3RhcnQgPSBpOwogICAgICAgICAgY2h1bmsgPSBjOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGNodW5rU3RhcnQgIT0gLTEpIHsKICAgICAgYXNzZXJ0KHRhYmxlW2NodW5rIC0gJEFdID09IG51bGwpOwogICAgICB0YWJsZVtjaHVuayAtICRBXSA9IGNvbXB1dGVLZXl3b3JkU3RhdGVUYWJsZSgKICAgICAgICAgIHN0YXJ0ICsgMSwgc3RyaW5ncywgY2h1bmtTdGFydCwgb2Zmc2V0ICsgbGVuZ3RoIC0gY2h1bmtTdGFydCk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQobGVuZ3RoID09IDEpOwogICAgICByZXR1cm4gbmV3IExlYWZLZXl3b3JkU3RhdGUoc3RyaW5nc1tvZmZzZXRdKTsKICAgIH0KICAgIFN0cmluZyBzeW50YXggPSBpc0xlYWYgPyBzdHJpbmdzW29mZnNldF0gOiBudWxsOwogICAgaWYgKGlzTG93ZXJjYXNlKSB7CiAgICAgIHRhYmxlID0gdGFibGUuc3VibGlzdCgkYSAtICRBKTsKICAgICAgcmV0dXJuIG5ldyBMb3dlckNhc2VBcnJheUtleXdvcmRTdGF0ZSh0YWJsZSwgc3ludGF4KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgVXBwZXJDYXNlQXJyYXlLZXl3b3JkU3RhdGUodGFibGUsIHN5bnRheCk7CiAgICB9CiAgfQp9CgovKioKICogQSBzdGF0ZSB3aXRoIG11bHRpcGxlIG91dGdvaW5nIHRyYW5zaXRpb25zLgogKi8KYWJzdHJhY3QgY2xhc3MgQXJyYXlLZXl3b3JkU3RhdGUgaW1wbGVtZW50cyBLZXl3b3JkU3RhdGUgewogIGZpbmFsIExpc3Q8S2V5d29yZFN0YXRlPiB0YWJsZTsKICBmaW5hbCBhbmFseXplci5LZXl3b3JkIGtleXdvcmQ7CgogIEFycmF5S2V5d29yZFN0YXRlKHRoaXMudGFibGUsIFN0cmluZyBzeW50YXgpCiAgICAgIDoga2V5d29yZCA9ICgoc3ludGF4ID09IG51bGwpID8gbnVsbCA6IGFuYWx5emVyLktleXdvcmQua2V5d29yZHNbc3ludGF4XSk7CgogIEtleXdvcmRTdGF0ZSBuZXh0KGludCBjKTsKCiAgS2V5d29yZFN0YXRlIG5leHRDYXBpdGFsKGludCBjKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoIlsiKTsKICAgIGlmIChrZXl3b3JkICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoIioiKTsKICAgICAgc2Iud3JpdGUoa2V5d29yZCk7CiAgICAgIHNiLndyaXRlKCIgIik7CiAgICB9CiAgICBMaXN0PEtleXdvcmRTdGF0ZT4gZm9vID0gdGFibGU7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGZvby5sZW5ndGg7IGkrKykgewogICAgICBpZiAoZm9vW2ldICE9IG51bGwpIHsKICAgICAgICBzYi53cml0ZSgiJHtuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoW2kgKyAkYV0pfTogIgogICAgICAgICAgICAiJHtmb29baV19OyAiKTsKICAgICAgfQogICAgfQogICAgc2Iud3JpdGUoIl0iKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQoKY2xhc3MgTG93ZXJDYXNlQXJyYXlLZXl3b3JkU3RhdGUgZXh0ZW5kcyBBcnJheUtleXdvcmRTdGF0ZSB7CiAgTG93ZXJDYXNlQXJyYXlLZXl3b3JkU3RhdGUoTGlzdDxLZXl3b3JkU3RhdGU+IHRhYmxlLCBTdHJpbmcgc3ludGF4KQogICAgICA6IHN1cGVyKHRhYmxlLCBzeW50YXgpIHsKICAgIGFzc2VydCh0YWJsZS5sZW5ndGggPT0gJHogLSAkYSArIDEpOwogIH0KCiAgS2V5d29yZFN0YXRlIG5leHQoaW50IGMpID0+IHRhYmxlW2MgLSAkYV07CgogIEtleXdvcmRTdGF0ZSBuZXh0Q2FwaXRhbChpbnQgYykgPT4gbnVsbDsKfQoKY2xhc3MgVXBwZXJDYXNlQXJyYXlLZXl3b3JkU3RhdGUgZXh0ZW5kcyBBcnJheUtleXdvcmRTdGF0ZSB7CiAgVXBwZXJDYXNlQXJyYXlLZXl3b3JkU3RhdGUoTGlzdDxLZXl3b3JkU3RhdGU+IHRhYmxlLCBTdHJpbmcgc3ludGF4KQogICAgICA6IHN1cGVyKHRhYmxlLCBzeW50YXgpIHsKICAgIGFzc2VydCh0YWJsZS5sZW5ndGggPT0gJHogLSAkQSArIDEpOwogIH0KCiAgS2V5d29yZFN0YXRlIG5leHQoaW50IGMpID0+IHRhYmxlW2MgLSAkQV07CgogIEtleXdvcmRTdGF0ZSBuZXh0Q2FwaXRhbChpbnQgYykgPT4gdGFibGVbYyAtICRBXTsKfQoKLyoqCiAqIEEgc3RhdGUgdGhhdCBoYXMgbm8gb3V0Z29pbmcgdHJhbnNpdGlvbnMuCiAqLwpjbGFzcyBMZWFmS2V5d29yZFN0YXRlIGltcGxlbWVudHMgS2V5d29yZFN0YXRlIHsKICBmaW5hbCBhbmFseXplci5LZXl3b3JkIGtleXdvcmQ7CgogIExlYWZLZXl3b3JkU3RhdGUoU3RyaW5nIHN5bnRheCkgOiBrZXl3b3JkID0gYW5hbHl6ZXIuS2V5d29yZC5rZXl3b3Jkc1tzeW50YXhdOwoKICBLZXl3b3JkU3RhdGUgbmV4dChpbnQgYykgPT4gbnVsbDsKICBLZXl3b3JkU3RhdGUgbmV4dENhcGl0YWwoaW50IGMpID0+IG51bGw7CgogIFN0cmluZyB0b1N0cmluZygpID0+IGtleXdvcmQubGV4ZW1lOwp9CoCWAE5OPAEgAS8BLgEEPAQeHCMBIAEmKiJPQTgILlAGGwQBMEEdAUQZExkZNSgXCCcuIh8KGiIvOkEMGhUKCAYcKTRJDRs0BjUXJjwNPAYEAgEELwQ7IiIBL1EBHAEjARYqExsVGRUGJCscOxwIBhMaBAIBPUYfKQQBLQErAgE9Rh8pBAEtATQCAQQtBDEiAVEBJCsBJwIBNnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zY2FubmVyL2tleXdvcmRfc3RhdGUuZGFydD5zZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL2NvbnN0YW50X2VtaXR0ZXIuZGFydLwtLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JzsKaW1wb3J0ICcuLi9jb25zdGFudHMvY29uc3RhbnRfc3lzdGVtLmRhcnQnIGFzIGNvbnN0YW50X3N5c3RlbTsKaW1wb3J0ICcuLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2lvL2NvZGVfb3V0cHV0LmRhcnQnOwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIGFzIGpzQXN0OwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIHNob3cganM7CmltcG9ydCAnLi4vanNfZW1pdHRlci9jb2RlX2VtaXR0ZXJfdGFzay5kYXJ0JzsKaW1wb3J0ICcuLi9vcHRpb25zLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NvZGVnZW5fd29ybGRfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdmaWVsZF9hbmFseXNpcy5kYXJ0JyBzaG93IEpGaWVsZEFuYWx5c2lzOwppbXBvcnQgJ2pzX2JhY2tlbmQuZGFydCc7CmltcG9ydCAncnVudGltZV90eXBlcy5kYXJ0JzsKCnR5cGVkZWYganNBc3QuRXhwcmVzc2lvbiBfQ29uc3RhbnRSZWZlcmVuY2VHZW5lcmF0b3IoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCk7Cgp0eXBlZGVmIGpzQXN0LkV4cHJlc3Npb24gX0NvbnN0YW50TGlzdEdlbmVyYXRvcihqc0FzdC5FeHByZXNzaW9uIGFycmF5KTsKCi8vLyBHZW5lcmF0ZXMgdGhlIEphdmFTY3JpcHQgZXhwcmVzc2lvbnMgZm9yIGNvbnN0YW50cy4KLy8vCi8vLyBJdCB1c2VzIGEgZ2l2ZW4gW2NvbnN0YW50UmVmZXJlbmNlR2VuZXJhdG9yXSB0byByZWZlcmVuY2UgbmVzdGVkIGNvbnN0YW50cwovLy8gKGlmIHRoZXJlIGFyZSBzb21lKS4gSXQgaXMgaGVuY2UgdXAgdG8gdGhhdCBmdW5jdGlvbiB0byBkZWNpZGUgd2hpY2gKLy8vIGNvbnN0YW50cyBzaG91bGQgYmUgaW5saW5lZCBvciBub3QuCmNsYXNzIENvbnN0YW50RW1pdHRlciBpbXBsZW1lbnRzIENvbnN0YW50VmFsdWVWaXNpdG9yPGpzQXN0LkV4cHJlc3Npb24sIE51bGw+IHsKICAvLyBNYXRjaGVzIGJsYW5rIGxpbmVzLCBjb21tZW50IGxpbmVzIGFuZCB0cmFpbGluZyBjb21tZW50cyB0aGF0IGNhbid0IGJlIHBhcnQKICAvLyBvZiBhIHN0cmluZy4KICBzdGF0aWMgZmluYWwgUmVnRXhwIENPTU1FTlRfUkUgPQogICAgICBuZXcgUmVnRXhwKHInJydeICooLy8uKik/XG58ICAqLy9bXicnIlxuXSokJycnLCBtdWx0aUxpbmU6IHRydWUpOwoKICBmaW5hbCBDb21waWxlck9wdGlvbnMgX29wdGlvbnM7CiAgZmluYWwgSkNvbW1vbkVsZW1lbnRzIF9jb21tb25FbGVtZW50czsKICBmaW5hbCBDb2RlZ2VuV29ybGRCdWlsZGVyIF93b3JsZEJ1aWxkZXI7CiAgZmluYWwgUnVudGltZVR5cGVzTmVlZCBfcnRpTmVlZDsKICBmaW5hbCBSdW50aW1lVHlwZXNFbmNvZGVyIF9ydGlFbmNvZGVyOwogIGZpbmFsIEpGaWVsZEFuYWx5c2lzIF9maWVsZEFuYWx5c2lzOwogIGZpbmFsIENvZGVFbWl0dGVyVGFzayBfdGFzazsKICBmaW5hbCBfQ29uc3RhbnRSZWZlcmVuY2VHZW5lcmF0b3IgY29uc3RhbnRSZWZlcmVuY2VHZW5lcmF0b3I7CiAgZmluYWwgX0NvbnN0YW50TGlzdEdlbmVyYXRvciBtYWtlQ29uc3RhbnRMaXN0OwoKICAvLy8gVGhlIGdpdmVuIFtjb25zdGFudFJlZmVyZW5jZUdlbmVyYXRvcl0gZnVuY3Rpb24gbXVzdCwgd2hlbiBpbnZva2VkIHdpdGggYQogIC8vLyBjb25zdGFudCwgZWl0aGVyIHJldHVybiBhIHJlZmVyZW5jZSBvciByZXR1cm4gaXRzIGxpdGVyYWwgZXhwcmVzc2lvbiBpZiBpdAogIC8vLyBjYW4gYmUgaW5saW5lZC4KICBDb25zdGFudEVtaXR0ZXIoCiAgICAgIHRoaXMuX29wdGlvbnMsCiAgICAgIHRoaXMuX2NvbW1vbkVsZW1lbnRzLAogICAgICB0aGlzLl93b3JsZEJ1aWxkZXIsCiAgICAgIHRoaXMuX3J0aU5lZWQsCiAgICAgIHRoaXMuX3J0aUVuY29kZXIsCiAgICAgIHRoaXMuX2ZpZWxkQW5hbHlzaXMsCiAgICAgIHRoaXMuX3Rhc2ssCiAgICAgIHRoaXMuY29uc3RhbnRSZWZlcmVuY2VHZW5lcmF0b3IsCiAgICAgIHRoaXMubWFrZUNvbnN0YW50TGlzdCk7CgogIEVtaXR0ZXIgZ2V0IF9lbWl0dGVyID0+IF90YXNrLmVtaXR0ZXI7CgogIC8vLyBDb25zdHJ1Y3RzIGEgbGl0ZXJhbCBleHByZXNzaW9uIHRoYXQgZXZhbHVhdGVzIHRvIHRoZSBjb25zdGFudC4gVXNlcyBhCiAgLy8vIGNhbm9uaWNhbCBuYW1lIHVubGVzcyB0aGUgY29uc3RhbnQgY2FuIGJlIGVtaXR0ZWQgbXVsdGlwbGUgdGltZXMgKGFzIGZvcgogIC8vLyBudW1iZXJzIGFuZCBzdHJpbmdzKS4KICBqc0FzdC5FeHByZXNzaW9uIGdlbmVyYXRlKENvbnN0YW50VmFsdWUgY29uc3RhbnQpIHsKICAgIHJldHVybiBfdmlzaXQoY29uc3RhbnQpOwogIH0KCiAganNBc3QuRXhwcmVzc2lvbiBfdmlzaXQoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgcmV0dXJuIGNvbnN0YW50LmFjY2VwdCh0aGlzLCBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gdmlzaXRGdW5jdGlvbihGdW5jdGlvbkNvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgdGhyb3cgZmFpbGVkQXQoTk9fTE9DQVRJT05fU1BBTk5BQkxFLAogICAgICAgICJUaGUgZnVuY3Rpb24gY29uc3RhbnQgZG9lcyBub3QgbmVlZCBzcGVjaWZpYyBKUyBjb2RlLiIpOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiB2aXNpdE51bGwoTnVsbENvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgcmV0dXJuIG5ldyBqc0FzdC5MaXRlcmFsTnVsbCgpOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiB2aXNpdE5vbkNvbnN0YW50KE5vbkNvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgcmV0dXJuIG5ldyBqc0FzdC5MaXRlcmFsTnVsbCgpOwogIH0KCiAgc3RhdGljIGZpbmFsIF9leHBvbmVudGlhbFJFID0gbmV3IFJlZ0V4cCgnXicKICAgICAgJ1woWy0rXT9cKScgLy8gMTogc2lnbgogICAgICAnXChbMC05XStcKScgLy8gMjogbGVhZGluZyBkaWdpdChzKQogICAgICAnXChcLlwoWzAtOV0qXClcKT8nIC8vIDQ6IGZyYWN0aW9uIGRpZ2l0cwogICAgICAnZVwoWy0rXT9bMC05XStcKScgLy8gNTogZXhwb25lbnQgd2l0aCBzaWduCiAgICAgIHInJCcpOwoKICAvLy8gUmVkdWNlcyB0aGUgc2l6ZSBvZiBleHBvbmVudGlhbCByZXByZXNlbnRhdGlvbnMgd2hlbiBtaW5pZmljYXRpb24gaXMKICAvLy8gZW5hYmxlZC4KICAvLy8KICAvLy8gUmVtb3ZlcyB0aGUgIisiIGFmdGVyIHRoZSBleHBvbmVudGlhbCBzaWduLCBhbmQgcmVtb3ZlcyB0aGUgIi4iIGJlZm9yZSB0aGUKICAvLy8gImUiLiBGb3IgZXhhbXBsZSBgMS4yM2UrNWAgaXMgY2hhbmdlZCB0byBgMTIzZTNgLgogIFN0cmluZyBfc2hvcnRlbkV4cG9uZW50aWFsUmVwcmVzZW50YXRpb24oU3RyaW5nIG51bWJlclN0cmluZykgewogICAgTWF0Y2ggbWF0Y2ggPSBfZXhwb25lbnRpYWxSRS5maXJzdE1hdGNoKG51bWJlclN0cmluZyk7CiAgICBpZiAobWF0Y2ggPT0gbnVsbCkgcmV0dXJuIG51bWJlclN0cmluZzsKICAgIFN0cmluZyBzaWduID0gbWF0Y2hbMV07CiAgICBTdHJpbmcgbGVhZGluZ0RpZ2l0cyA9IG1hdGNoWzJdOwogICAgU3RyaW5nIGZyYWN0aW9uRGlnaXRzID0gbWF0Y2hbNF07CiAgICBpbnQgZXhwb25lbnQgPSBpbnQucGFyc2UobWF0Y2hbNV0pOwogICAgaWYgKGZyYWN0aW9uRGlnaXRzID09IG51bGwpIGZyYWN0aW9uRGlnaXRzID0gJyc7CiAgICBleHBvbmVudCAtPSBmcmFjdGlvbkRpZ2l0cy5sZW5ndGg7CiAgICBTdHJpbmcgcmVzdWx0ID0gJyR7c2lnbn0ke2xlYWRpbmdEaWdpdHN9JHtmcmFjdGlvbkRpZ2l0c31lJHtleHBvbmVudH0nOwogICAgYXNzZXJ0KGRvdWJsZS5wYXJzZShyZXN1bHQpID09IGRvdWJsZS5wYXJzZShudW1iZXJTdHJpbmcpKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5FeHByZXNzaW9uIHZpc2l0SW50KEludENvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgQmlnSW50IHZhbHVlID0gY29uc3RhbnQuaW50VmFsdWU7CiAgICAvLyBTaW5jZSB3ZSBhcmUgaW4gSmF2YVNjcmlwdCB3ZSBjYW4gc2hvcnRlbiBsb25nIGludGVnZXJzIHRvIHRoZWlyIHNob3J0ZXIKICAgIC8vIGV4cG9uZW50aWFsIHJlcHJlc2VudGF0aW9uLCBmb3IgZXhhbXBsZTogIjFlNCIgaXMgc2hvcnRlciB0aGFuICIxMDAwMCIuCiAgICAvLwogICAgLy8gTm90ZSB0aGF0IHRoaXMgc2hvcnRlbmluZyBhcHBhcmVudGx5IGxvc2VzIHByZWNpc2lvbiBmb3IgYmlnIG51bWJlcnMKICAgIC8vIChsaWtlIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDUgd2hpY2ggYmVjb21lcyAxMjM0NTY3ODkwMTIzNDU2OGU4KS4KICAgIC8vIEhvd2V2ZXIsIHNpbmNlIEphdmFTY3JpcHQgZW5naW5lcyByZXByZXNlbnQgYWxsIG51bWJlcnMgYXMgZG91YmxlcywgdGhlc2UKICAgIC8vIGRpZ2l0cyBhcmUgbG9zdCBhbnl3YXkuCiAgICBTdHJpbmcgcmVwcmVzZW50YXRpb24gPSB2YWx1ZS50b1N0cmluZygpOwogICAgU3RyaW5nIGFsdGVybmF0aXZlID0gbnVsbDsKICAgIGludCBjdXRvZmYgPSBfb3B0aW9ucy5lbmFibGVNaW5pZmljYXRpb24gPyAxMDAwMCA6IDFlMTAudG9JbnQoKTsKICAgIGlmICh2YWx1ZS5hYnMoKSA+PSBuZXcgQmlnSW50LmZyb20oY3V0b2ZmKSkgewogICAgICBhbHRlcm5hdGl2ZSA9IF9zaG9ydGVuRXhwb25lbnRpYWxSZXByZXNlbnRhdGlvbigKICAgICAgICAgIHZhbHVlLnRvRG91YmxlKCkudG9TdHJpbmdBc0V4cG9uZW50aWFsKCkpOwogICAgfQogICAgaWYgKGFsdGVybmF0aXZlICE9IG51bGwgJiYgYWx0ZXJuYXRpdmUubGVuZ3RoIDwgcmVwcmVzZW50YXRpb24ubGVuZ3RoKSB7CiAgICAgIHJlcHJlc2VudGF0aW9uID0gYWx0ZXJuYXRpdmU7CiAgICB9CiAgICByZXR1cm4gbmV3IGpzQXN0LkxpdGVyYWxOdW1iZXIocmVwcmVzZW50YXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiB2aXNpdERvdWJsZShEb3VibGVDb25zdGFudFZhbHVlIGNvbnN0YW50LCBbX10pIHsKICAgIGRvdWJsZSB2YWx1ZSA9IGNvbnN0YW50LmRvdWJsZVZhbHVlOwogICAgaWYgKHZhbHVlLmlzTmFOKSB7CiAgICAgIHJldHVybiBqcygiMC8wIik7CiAgICB9IGVsc2UgaWYgKHZhbHVlID09IGRvdWJsZS5pbmZpbml0eSkgewogICAgICByZXR1cm4ganMoIjEvMCIpOwogICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAtZG91YmxlLmluZmluaXR5KSB7CiAgICAgIHJldHVybiBqcygiLTEvMCIpOwogICAgfSBlbHNlIHsKICAgICAgU3RyaW5nIHNob3J0ZW5lZCA9IF9zaG9ydGVuRXhwb25lbnRpYWxSZXByZXNlbnRhdGlvbigiJHZhbHVlIik7CiAgICAgIHJldHVybiBuZXcganNBc3QuTGl0ZXJhbE51bWJlcihzaG9ydGVuZWQpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiB2aXNpdEJvb2woQm9vbENvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgaWYgKF9vcHRpb25zLmVuYWJsZU1pbmlmaWNhdGlvbikgewogICAgICBpZiAoY29uc3RhbnQuaXNUcnVlKSB7CiAgICAgICAgLy8gVXNlICEwIGZvciB0cnVlLgogICAgICAgIHJldHVybiBqcygiITAiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBVc2UgITEgZm9yIGZhbHNlLgogICAgICAgIHJldHVybiBqcygiITEiKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGNvbnN0YW50LmlzVHJ1ZSA/IGpzKCd0cnVlJykgOiBqcygnZmFsc2UnKTsKICAgIH0KICB9CgogIC8vLyBXcml0ZSB0aGUgY29udGVudHMgb2YgdGhlIHF1b3RlZCBzdHJpbmcgdG8gYSBbQ29kZUJ1ZmZlcl0gaW4KICAvLy8gYSBmb3JtIHRoYXQgaXMgdmFsaWQgYXMgSmF2YVNjcmlwdCBzdHJpbmcgbGl0ZXJhbCBjb250ZW50LgogIC8vLyBUaGUgc3RyaW5nIGlzIGFzc3VtZWQgcXVvdGVkIGJ5IGRvdWJsZSBxdW90ZSBjaGFyYWN0ZXJzLgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gdmlzaXRTdHJpbmcoU3RyaW5nQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICByZXR1cm4ganMuZXNjYXBlZFN0cmluZyhjb25zdGFudC5zdHJpbmdWYWx1ZSwgYXNjaWk6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiB2aXNpdExpc3QoTGlzdENvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgTGlzdDxqc0FzdC5FeHByZXNzaW9uPiBlbGVtZW50cyA9IGNvbnN0YW50LmVudHJpZXMKICAgICAgICAubWFwKGNvbnN0YW50UmVmZXJlbmNlR2VuZXJhdG9yKQogICAgICAgIC50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICAgIGpzQXN0LkFycmF5SW5pdGlhbGl6ZXIgYXJyYXkgPSBuZXcganNBc3QuQXJyYXlJbml0aWFsaXplcihlbGVtZW50cyk7CiAgICBqc0FzdC5FeHByZXNzaW9uIHZhbHVlID0gbWFrZUNvbnN0YW50TGlzdChhcnJheSk7CiAgICByZXR1cm4gbWF5YmVBZGRUeXBlQXJndW1lbnRzKGNvbnN0YW50LCBjb25zdGFudC50eXBlLCB2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5FeHByZXNzaW9uIHZpc2l0U2V0KGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0U2V0Q29uc3RhbnQgY29uc3RhbnQsCiAgICAgIFtfXSkgewogICAgSW50ZXJmYWNlVHlwZSBzb3VyY2VUeXBlID0gY29uc3RhbnQudHlwZTsKICAgIENsYXNzRW50aXR5IGNsYXNzRWxlbWVudCA9IHNvdXJjZVR5cGUuZWxlbWVudDsKICAgIFN0cmluZyBjbGFzc05hbWUgPSBjbGFzc0VsZW1lbnQubmFtZTsKICAgIGlmICghaWRlbnRpY2FsKGNsYXNzRWxlbWVudCwgX2NvbW1vbkVsZW1lbnRzLmNvbnN0U2V0TGl0ZXJhbENsYXNzKSkgewogICAgICBmYWlsZWRBdCgKICAgICAgICAgIGNsYXNzRWxlbWVudCwgIkNvbXBpbGVyIGVuY291dGVyZWQgdW5leHBlY3RlZCBzZXQgY2xhc3MgJGNsYXNzTmFtZSIpOwogICAgfQoKICAgIExpc3Q8anNBc3QuRXhwcmVzc2lvbj4gYXJndW1lbnRzID0gPGpzQXN0LkV4cHJlc3Npb24+WwogICAgICBjb25zdGFudFJlZmVyZW5jZUdlbmVyYXRvcihjb25zdGFudC5lbnRyaWVzKSwKICAgIF07CgogICAgaWYgKF9ydGlOZWVkLmNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKGNsYXNzRWxlbWVudCkpIHsKICAgICAgYXJndW1lbnRzLmFkZChfcmVpZmllZFR5cGVBcmd1bWVudHMoY29uc3RhbnQsIHNvdXJjZVR5cGUudHlwZUFyZ3VtZW50cykpOwogICAgfQoKICAgIGpzQXN0LkV4cHJlc3Npb24gY29uc3RydWN0b3IgPSBfZW1pdHRlci5jb25zdHJ1Y3RvckFjY2VzcyhjbGFzc0VsZW1lbnQpOwogICAgcmV0dXJuIG5ldyBqc0FzdC5OZXcoY29uc3RydWN0b3IsIGFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5FeHByZXNzaW9uIHZpc2l0TWFwKGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0TWFwQ29uc3RhbnQgY29uc3RhbnQsCiAgICAgIFtfXSkgewogICAganNBc3QuRXhwcmVzc2lvbiBqc01hcCgpIHsKICAgICAgTGlzdDxqc0FzdC5Qcm9wZXJ0eT4gcHJvcGVydGllcyA9IDxqc0FzdC5Qcm9wZXJ0eT5bXTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zdGFudC5sZW5ndGg7IGkrKykgewogICAgICAgIFN0cmluZ0NvbnN0YW50VmFsdWUga2V5ID0gY29uc3RhbnQua2V5c1tpXTsKICAgICAgICBpZiAoa2V5LnN0cmluZ1ZhbHVlID09CiAgICAgICAgICAgIGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0TWFwQ29uc3RhbnQuUFJPVE9fUFJPUEVSVFkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gS2V5cyBpbiBsaXRlcmFsIG1hcHMgbXVzdCBiZSBlbWl0dGVkIGluIHBsYWNlLgogICAgICAgIGpzQXN0LkxpdGVyYWwga2V5RXhwcmVzc2lvbiA9IF92aXNpdChrZXkpOwogICAgICAgIGpzQXN0LkV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uID0KICAgICAgICAgICAgY29uc3RhbnRSZWZlcmVuY2VHZW5lcmF0b3IoY29uc3RhbnQudmFsdWVzW2ldKTsKICAgICAgICBwcm9wZXJ0aWVzLmFkZChuZXcganNBc3QuUHJvcGVydHkoa2V5RXhwcmVzc2lvbiwgdmFsdWVFeHByZXNzaW9uKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBqc0FzdC5PYmplY3RJbml0aWFsaXplcihwcm9wZXJ0aWVzKTsKICAgIH0KCiAgICBqc0FzdC5FeHByZXNzaW9uIGpzR2VuZXJhbE1hcCgpIHsKICAgICAgTGlzdDxqc0FzdC5FeHByZXNzaW9uPiBkYXRhID0gPGpzQXN0LkV4cHJlc3Npb24+W107CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uc3RhbnQua2V5cy5sZW5ndGg7IGkrKykgewogICAgICAgIGpzQXN0LkV4cHJlc3Npb24ga2V5RXhwcmVzc2lvbiA9CiAgICAgICAgICAgIGNvbnN0YW50UmVmZXJlbmNlR2VuZXJhdG9yKGNvbnN0YW50LmtleXNbaV0pOwogICAgICAgIGpzQXN0LkV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uID0KICAgICAgICAgICAgY29uc3RhbnRSZWZlcmVuY2VHZW5lcmF0b3IoY29uc3RhbnQudmFsdWVzW2ldKTsKICAgICAgICBkYXRhLmFkZChrZXlFeHByZXNzaW9uKTsKICAgICAgICBkYXRhLmFkZCh2YWx1ZUV4cHJlc3Npb24pOwogICAgICB9CiAgICAgIHJldHVybiBuZXcganNBc3QuQXJyYXlJbml0aWFsaXplcihkYXRhKTsKICAgIH0KCiAgICBDbGFzc0VudGl0eSBjbGFzc0VsZW1lbnQgPSBjb25zdGFudC50eXBlLmVsZW1lbnQ7CiAgICBTdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NFbGVtZW50Lm5hbWU7CgogICAgTGlzdDxqc0FzdC5FeHByZXNzaW9uPiBhcmd1bWVudHMgPSA8anNBc3QuRXhwcmVzc2lvbj5bXTsKCiAgICAvLyBUaGUgYXJndW1lbnRzIG9mIHRoZSBKYXZhU2NyaXB0IGNvbnN0cnVjdG9yIGZvciBhbnkgZ2l2ZW4gRGFydCBjbGFzcwogICAgLy8gYXJlIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBtZW1iZXJzIG9mIHRoZSBjbGFzcyBlbGVtZW50LgogICAgaW50IGVtaXR0ZWRBcmd1bWVudENvdW50ID0gMDsKICAgIF93b3JsZEJ1aWxkZXIuZm9yRWFjaEluc3RhbmNlRmllbGQoY2xhc3NFbGVtZW50LAogICAgICAgIChDbGFzc0VudGl0eSBlbmNsb3NpbmcsIEZpZWxkRW50aXR5IGZpZWxkLCB7Ym9vbCBpc0VsaWRlZH0pIHsKICAgICAgaWYgKGlzRWxpZGVkKSByZXR1cm47CiAgICAgIGlmIChmaWVsZC5uYW1lID09IGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0TWFwQ29uc3RhbnQuTEVOR1RIX05BTUUpIHsKICAgICAgICBhcmd1bWVudHMKICAgICAgICAgICAgLmFkZChuZXcganNBc3QuTGl0ZXJhbE51bWJlcignJHtjb25zdGFudC5rZXlMaXN0LmVudHJpZXMubGVuZ3RofScpKTsKICAgICAgfSBlbHNlIGlmIChmaWVsZC5uYW1lID09CiAgICAgICAgICBjb25zdGFudF9zeXN0ZW0uSmF2YVNjcmlwdE1hcENvbnN0YW50LkpTX09CSkVDVF9OQU1FKSB7CiAgICAgICAgYXJndW1lbnRzLmFkZChqc01hcCgpKTsKICAgICAgfSBlbHNlIGlmIChmaWVsZC5uYW1lID09CiAgICAgICAgICBjb25zdGFudF9zeXN0ZW0uSmF2YVNjcmlwdE1hcENvbnN0YW50LktFWVNfTkFNRSkgewogICAgICAgIGFyZ3VtZW50cy5hZGQoY29uc3RhbnRSZWZlcmVuY2VHZW5lcmF0b3IoY29uc3RhbnQua2V5TGlzdCkpOwogICAgICB9IGVsc2UgaWYgKGZpZWxkLm5hbWUgPT0KICAgICAgICAgIGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0TWFwQ29uc3RhbnQuUFJPVE9fVkFMVUUpIHsKICAgICAgICBhc3NlcnQoY29uc3RhbnQucHJvdG9WYWx1ZSAhPSBudWxsKTsKICAgICAgICBhcmd1bWVudHMuYWRkKGNvbnN0YW50UmVmZXJlbmNlR2VuZXJhdG9yKGNvbnN0YW50LnByb3RvVmFsdWUpKTsKICAgICAgfSBlbHNlIGlmIChmaWVsZC5uYW1lID09CiAgICAgICAgICBjb25zdGFudF9zeXN0ZW0uSmF2YVNjcmlwdE1hcENvbnN0YW50LkpTX0RBVEFfTkFNRSkgewogICAgICAgIGFyZ3VtZW50cy5hZGQoanNHZW5lcmFsTWFwKCkpOwogICAgICB9IGVsc2UgewogICAgICAgIGZhaWxlZEF0KGZpZWxkLAogICAgICAgICAgICAiQ29tcGlsZXIgaGFzIHVuZXhwZWN0ZWQgZmllbGQgJHtmaWVsZC5uYW1lfSBmb3IgJHtjbGFzc05hbWV9LiIpOwogICAgICB9CiAgICAgIGVtaXR0ZWRBcmd1bWVudENvdW50Kys7CiAgICB9KTsKICAgIGlmICgoY2xhc3NOYW1lID09IGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0TWFwQ29uc3RhbnQuREFSVF9TVFJJTkdfQ0xBU1MgJiYKICAgICAgICAgICAgZW1pdHRlZEFyZ3VtZW50Q291bnQgIT0gMykgfHwKICAgICAgICAoY2xhc3NOYW1lID09IGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0TWFwQ29uc3RhbnQuREFSVF9QUk9UT19DTEFTUyAmJgogICAgICAgICAgICBlbWl0dGVkQXJndW1lbnRDb3VudCAhPSA0KSB8fAogICAgICAgIChjbGFzc05hbWUgPT0KICAgICAgICAgICAgICAgIGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0TWFwQ29uc3RhbnQuREFSVF9HRU5FUkFMX0NMQVNTICYmCiAgICAgICAgICAgIGVtaXR0ZWRBcmd1bWVudENvdW50ICE9IDEpKSB7CiAgICAgIGZhaWxlZEF0KGNsYXNzRWxlbWVudCwKICAgICAgICAgICJDb21waWxlciBhbmQgJHtjbGFzc05hbWV9IGRpc2FncmVlIG9uIG51bWJlciBvZiBmaWVsZHMuIik7CiAgICB9CgogICAgaWYgKF9ydGlOZWVkLmNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKGNsYXNzRWxlbWVudCkpIHsKICAgICAgYXJndW1lbnRzCiAgICAgICAgICAuYWRkKF9yZWlmaWVkVHlwZUFyZ3VtZW50cyhjb25zdGFudCwgY29uc3RhbnQudHlwZS50eXBlQXJndW1lbnRzKSk7CiAgICB9CgogICAganNBc3QuRXhwcmVzc2lvbiBjb25zdHJ1Y3RvciA9IF9lbWl0dGVyLmNvbnN0cnVjdG9yQWNjZXNzKGNsYXNzRWxlbWVudCk7CiAgICBqc0FzdC5FeHByZXNzaW9uIHZhbHVlID0gbmV3IGpzQXN0Lk5ldyhjb25zdHJ1Y3RvciwgYXJndW1lbnRzKTsKICAgIHJldHVybiB2YWx1ZTsKICB9CgogIGpzQXN0LlByb3BlcnR5QWNjZXNzIGdldEhlbHBlclByb3BlcnR5KEZ1bmN0aW9uRW50aXR5IGhlbHBlcikgewogICAgcmV0dXJuIF9lbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGhlbHBlcik7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5FeHByZXNzaW9uIHZpc2l0VHlwZShUeXBlQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICBEYXJ0VHlwZSB0eXBlID0gY29uc3RhbnQucmVwcmVzZW50ZWRUeXBlLnVuYWxpYXNlZDsKCiAgICBqc0FzdC5FeHByZXNzaW9uIHVuZXhwZWN0ZWQoVHlwZVZhcmlhYmxlVHlwZSBfdmFyaWFibGUpIHsKICAgICAgVHlwZVZhcmlhYmxlVHlwZSB2YXJpYWJsZSA9IF92YXJpYWJsZTsKICAgICAgdGhyb3cgZmFpbGVkQXQoCiAgICAgICAgICBOT19MT0NBVElPTl9TUEFOTkFCTEUsCiAgICAgICAgICAiVW5leHBlY3RlZCB0eXBlIHZhcmlhYmxlICcke3ZhcmlhYmxlfSciCiAgICAgICAgICAiIGluIGNvbnN0YW50ICcke2NvbnN0YW50LnRvRGFydFRleHQoKX0nIik7CiAgICB9CgogICAganNBc3QuRXhwcmVzc2lvbiBydGkgPQogICAgICAgIF9ydGlFbmNvZGVyLmdldFR5cGVSZXByZXNlbnRhdGlvbihfZW1pdHRlciwgdHlwZSwgdW5leHBlY3RlZCk7CgogICAgcmV0dXJuIG5ldyBqc0FzdC5DYWxsKAogICAgICAgIGdldEhlbHBlclByb3BlcnR5KF9jb21tb25FbGVtZW50cy5jcmVhdGVSdW50aW1lVHlwZSksIFtydGldKTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gdmlzaXRJbnRlcmNlcHRvcihJbnRlcmNlcHRvckNvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgQ2xhc3NFbnRpdHkgaW50ZXJjZXB0b3JDbGFzcyA9IGNvbnN0YW50LmNsczsKICAgIHJldHVybiBfdGFzay5pbnRlcmNlcHRvclByb3RvdHlwZUFjY2VzcyhpbnRlcmNlcHRvckNsYXNzKTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gdmlzaXRTeW50aGV0aWMoU3ludGhldGljQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICBzd2l0Y2ggKGNvbnN0YW50LnZhbHVlS2luZCkgewogICAgICBjYXNlIFN5bnRoZXRpY0NvbnN0YW50S2luZC5EVU1NWV9JTlRFUkNFUFRPUjoKICAgICAgY2FzZSBTeW50aGV0aWNDb25zdGFudEtpbmQuRU1QVFlfVkFMVUU6CiAgICAgICAgcmV0dXJuIG5ldyBqc0FzdC5MaXRlcmFsTnVtYmVyKCcwJyk7CiAgICAgIGNhc2UgU3ludGhldGljQ29uc3RhbnRLaW5kLlRZUEVWQVJJQUJMRV9SRUZFUkVOQ0U6CiAgICAgIGNhc2UgU3ludGhldGljQ29uc3RhbnRLaW5kLk5BTUU6CiAgICAgICAgcmV0dXJuIGNvbnN0YW50LnBheWxvYWQ7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgZmFpbGVkQXQoTk9fTE9DQVRJT05fU1BBTk5BQkxFLAogICAgICAgICAgICAiVW5leHBlY3RlZCBEdW1teUNvbnN0YW50S2luZCAke2NvbnN0YW50LmtpbmR9Iik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5FeHByZXNzaW9uIHZpc2l0Q29uc3RydWN0ZWQoQ29uc3RydWN0ZWRDb25zdGFudFZhbHVlIGNvbnN0YW50LCBbX10pIHsKICAgIENsYXNzRW50aXR5IGVsZW1lbnQgPSBjb25zdGFudC50eXBlLmVsZW1lbnQ7CiAgICBpZiAoZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMuanNDb25zdENsYXNzKSB7CiAgICAgIFN0cmluZ0NvbnN0YW50VmFsdWUgc3RyID0gY29uc3RhbnQuZmllbGRzLnZhbHVlcy5zaW5nbGU7CiAgICAgIFN0cmluZyB2YWx1ZSA9IHN0ci5zdHJpbmdWYWx1ZTsKICAgICAgcmV0dXJuIG5ldyBqc0FzdC5MaXRlcmFsRXhwcmVzc2lvbihzdHJpcENvbW1lbnRzKHZhbHVlKSk7CiAgICB9CiAgICBqc0FzdC5FeHByZXNzaW9uIGNvbnN0cnVjdG9yID0KICAgICAgICBfZW1pdHRlci5jb25zdHJ1Y3RvckFjY2Vzcyhjb25zdGFudC50eXBlLmVsZW1lbnQpOwogICAgTGlzdDxqc0FzdC5FeHByZXNzaW9uPiBmaWVsZHMgPSA8anNBc3QuRXhwcmVzc2lvbj5bXTsKICAgIF93b3JsZEJ1aWxkZXIuZm9yRWFjaEluc3RhbmNlRmllbGQoZWxlbWVudCwgKF8sIEZpZWxkRW50aXR5IGZpZWxkLAogICAgICAgIHtib29sIGlzRWxpZGVkfSkgewogICAgICBpZiAoaXNFbGlkZWQpIHJldHVybjsKICAgICAgaWYgKCFfZmllbGRBbmFseXNpcy5nZXRGaWVsZERhdGEoZmllbGQpLmlzSW5pdGlhbGl6ZWRJbkFsbG9jYXRvcikgewogICAgICAgIGZpZWxkcy5hZGQoY29uc3RhbnRSZWZlcmVuY2VHZW5lcmF0b3IoY29uc3RhbnQuZmllbGRzW2ZpZWxkXSkpOwogICAgICB9CiAgICB9KTsKICAgIGlmIChfcnRpTmVlZC5jbGFzc05lZWRzVHlwZUFyZ3VtZW50cyhjb25zdGFudC50eXBlLmVsZW1lbnQpKSB7CiAgICAgIGZpZWxkcy5hZGQoX3JlaWZpZWRUeXBlQXJndW1lbnRzKGNvbnN0YW50LCBjb25zdGFudC50eXBlLnR5cGVBcmd1bWVudHMpKTsKICAgIH0KICAgIHJldHVybiBuZXcganNBc3QuTmV3KGNvbnN0cnVjdG9yLCBmaWVsZHMpOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiB2aXNpdEluc3RhbnRpYXRpb24oSW5zdGFudGlhdGlvbkNvbnN0YW50VmFsdWUgY29uc3RhbnQsCiAgICAgIFtfXSkgewogICAgQ2xhc3NFbnRpdHkgY2xzID0KICAgICAgICBfY29tbW9uRWxlbWVudHMuZ2V0SW5zdGFudGlhdGlvbkNsYXNzKGNvbnN0YW50LnR5cGVBcmd1bWVudHMubGVuZ3RoKTsKICAgIExpc3Q8anNBc3QuRXhwcmVzc2lvbj4gZmllbGRzID0gPGpzQXN0LkV4cHJlc3Npb24+WwogICAgICBjb25zdGFudFJlZmVyZW5jZUdlbmVyYXRvcihjb25zdGFudC5mdW5jdGlvbiksCiAgICAgIF9yZWlmaWVkVHlwZUFyZ3VtZW50cyhjb25zdGFudCwgY29uc3RhbnQudHlwZUFyZ3VtZW50cykKICAgIF07CiAgICBqc0FzdC5FeHByZXNzaW9uIGNvbnN0cnVjdG9yID0gX2VtaXR0ZXIuY29uc3RydWN0b3JBY2Nlc3MoY2xzKTsKICAgIHJldHVybiBuZXcganNBc3QuTmV3KGNvbnN0cnVjdG9yLCBmaWVsZHMpOwogIH0KCiAgU3RyaW5nIHN0cmlwQ29tbWVudHMoU3RyaW5nIHJhd0phdmFTY3JpcHQpIHsKICAgIHJldHVybiByYXdKYXZhU2NyaXB0LnJlcGxhY2VBbGwoQ09NTUVOVF9SRSwgJycpOwogIH0KCiAganNBc3QuRXhwcmVzc2lvbiBtYXliZUFkZFR5cGVBcmd1bWVudHMoCiAgICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnQsIEludGVyZmFjZVR5cGUgdHlwZSwganNBc3QuRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgICF0eXBlLnRyZWF0QXNSYXcgJiYKICAgICAgICBfcnRpTmVlZC5jbGFzc05lZWRzVHlwZUFyZ3VtZW50cyh0eXBlLmVsZW1lbnQpKSB7CiAgICAgIHJldHVybiBuZXcganNBc3QuQ2FsbCgKICAgICAgICAgIGdldEhlbHBlclByb3BlcnR5KF9jb21tb25FbGVtZW50cy5zZXRSdW50aW1lVHlwZUluZm8pLAogICAgICAgICAgW3ZhbHVlLCBfcmVpZmllZFR5cGVBcmd1bWVudHMoY29uc3RhbnQsIHR5cGUudHlwZUFyZ3VtZW50cyldKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CgogIGpzQXN0LkV4cHJlc3Npb24gX3JlaWZpZWRUeXBlQXJndW1lbnRzKAogICAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50LCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICBqc0FzdC5FeHByZXNzaW9uIHVuZXhwZWN0ZWQoVHlwZVZhcmlhYmxlVHlwZSBfdmFyaWFibGUpIHsKICAgICAgVHlwZVZhcmlhYmxlVHlwZSB2YXJpYWJsZSA9IF92YXJpYWJsZTsKICAgICAgdGhyb3cgZmFpbGVkQXQoCiAgICAgICAgICBOT19MT0NBVElPTl9TUEFOTkFCTEUsCiAgICAgICAgICAiVW5leHBlY3RlZCB0eXBlIHZhcmlhYmxlICcke3ZhcmlhYmxlfSciCiAgICAgICAgICAiIGluIGNvbnN0YW50ICcke2NvbnN0YW50LnRvRGFydFRleHQoKX0nIik7CiAgICB9CgogICAgTGlzdDxqc0FzdC5FeHByZXNzaW9uPiBhcmd1bWVudHMgPSA8anNBc3QuRXhwcmVzc2lvbj5bXTsKICAgIGZvciAoRGFydFR5cGUgYXJndW1lbnQgaW4gdHlwZUFyZ3VtZW50cykgewogICAgICBhcmd1bWVudHMuYWRkKAogICAgICAgICAgX3J0aUVuY29kZXIuZ2V0VHlwZVJlcHJlc2VudGF0aW9uKF9lbWl0dGVyLCBhcmd1bWVudCwgdW5leHBlY3RlZCkpOwogICAgfQogICAgcmV0dXJuIG5ldyBqc0FzdC5BcnJheUluaXRpYWxpemVyKGFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5FeHByZXNzaW9uIHZpc2l0RGVmZXJyZWRHbG9iYWwoRGVmZXJyZWRHbG9iYWxDb25zdGFudFZhbHVlIGNvbnN0YW50LAogICAgICBbX10pIHsKICAgIHJldHVybiBjb25zdGFudFJlZmVyZW5jZUdlbmVyYXRvcihjb25zdGFudC5yZWZlcmVuY2VkKTsKICB9Cn0KgaMATk48ARkiPyMkISEhIC8aMTIaHQFOAUkBOARPSShQURIjSAEiKSsjKScfQDEBUFEWExUcGhUYGxInHgEpAU1PHDYdBAE0KAQBDEgqQgQBDEAkBAEMRiQEAS8dKjAyDQFLDwZROEI7LBwlJig1J0xAEwQBDD4mUE8HTEtRHy4fRTI3NQZNJAY0BAEMRCkXGCsYLBkNRjEGBAEMQCcdHBkPHRkIDTkGBAFDQT8MREAEAQxANykiSTZCBAEMTA0uMypKEFAGATs0BwE6UAYBTTIEAQxMDR88MjQfRBQKATozKzxMCDYGASY6Nyk6KzwhIwgvBgE2KgE9AUxCIjVGHE0SUR9CIB89RR8/LUgfQCcPGE4IHghRKlAqFkwqHUYGAToQTgYBTUQSBAFCMgQBDEA4AT4tFiEzNgYBG0cBG0YEAQxOMT8EAQxKIjQuLTknIQ8uPgYEAQxOMTM/JkAGIzs6RxscSkgICENQBi8EAQxLDRZOODU+B0QvBAEvNQQBKkwhHDodQUkGEgQBKj4+LRYhMzYGAT0vFU4GMgQBDE0NPAQCATVwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL2NvbnN0YW50X2VtaXR0ZXIuZGFydC5zZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9zc2EvY29kZWdlbi5kYXJ0wAHfXC8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6bWF0aCcgYXMgbWF0aDsKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nIHNob3cgUXVldWU7CgppbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfdW5zdGFibGUvZGFydDJqcy5kYXJ0JyBzaG93IExpbms7CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24vbmFtZXMuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uL2NvZGVnZW4uZGFydCcgc2hvdyBDb2RlZ2VuUmVnaXN0cnksIENvZGVnZW5Xb3JrSXRlbTsKaW1wb3J0ICcuLi9jb21tb24vdGFza3MuZGFydCcgc2hvdyBDb21waWxlclRhc2s7CmltcG9ydCAnLi4vY29uc3RhbnRzL2NvbnN0YW50X3N5c3RlbS5kYXJ0JyBhcyBjb25zdGFudF9zeXN0ZW07CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCcgc2hvdyBKQ29tbW9uRWxlbWVudHM7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvanVtcHMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJy4uL2lvL3NvdXJjZV9pbmZvcm1hdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBhcyBqczsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2ludGVyY2VwdG9yX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9iYWNrZW5kLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvY2hlY2tlZF9tb2RlX2hlbHBlcnMuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9uYXRpdmVfZGF0YS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL25hbWVyLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvcnVudGltZV90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9qc19lbWl0dGVyL2NvZGVfZW1pdHRlcl90YXNrLmRhcnQnOwppbXBvcnQgJy4uL2pzX21vZGVsL2VsZW1lbnRzLmRhcnQnIHNob3cgSkdlbmVyYXRvckJvZHk7CmltcG9ydCAnLi4vbmF0aXZlL2JlaGF2aW9yLmRhcnQnOwppbXBvcnQgJy4uL25hdGl2ZS9lbnF1ZXVlLmRhcnQnOwppbXBvcnQgJy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vdHJhY2VyLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NhbGxfc3RydWN0dXJlLmRhcnQnIHNob3cgQ2FsbFN0cnVjdHVyZTsKaW1wb3J0ICcuLi91bml2ZXJzZS9zZWxlY3Rvci5kYXJ0JyBzaG93IFNlbGVjdG9yOwppbXBvcnQgJy4uL3VuaXZlcnNlL3VzZS5kYXJ0JwogICAgc2hvdyBDb25zdGFudFVzZSwgQ29uc3RyYWluZWREeW5hbWljVXNlLCBTdGF0aWNVc2UsIFR5cGVVc2U7CmltcG9ydCAnLi4vd29ybGQuZGFydCcgc2hvdyBKQ2xvc2VkV29ybGQ7CmltcG9ydCAnY29kZWdlbl9oZWxwZXJzLmRhcnQnOwppbXBvcnQgJ25vZGVzLmRhcnQnOwppbXBvcnQgJ3ZhcmlhYmxlX2FsbG9jYXRvci5kYXJ0JzsKCmFic3RyYWN0IGNsYXNzIENvZGVnZW5QaGFzZSB7CiAgU3RyaW5nIGdldCBuYW1lID0+ICckcnVudGltZVR5cGUnOwogIHZvaWQgdmlzaXRHcmFwaChIR3JhcGggZ3JhcGgpOwp9CgpjbGFzcyBTc2FDb2RlR2VuZXJhdG9yVGFzayBleHRlbmRzIENvbXBpbGVyVGFzayB7CiAgZmluYWwgSmF2YVNjcmlwdEJhY2tlbmQgYmFja2VuZDsKICBmaW5hbCBTb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5IHNvdXJjZUluZm9ybWF0aW9uRmFjdG9yeTsKCiAgU3NhQ29kZUdlbmVyYXRvclRhc2soSmF2YVNjcmlwdEJhY2tlbmQgYmFja2VuZCwgdGhpcy5zb3VyY2VJbmZvcm1hdGlvbkZhY3RvcnkpCiAgICAgIDogdGhpcy5iYWNrZW5kID0gYmFja2VuZCwKICAgICAgICBzdXBlcihiYWNrZW5kLmNvbXBpbGVyLm1lYXN1cmVyKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+ICdTU0EgY29kZSBnZW5lcmF0b3InOwoKICBqcy5GdW4gYnVpbGRKYXZhU2NyaXB0RnVuY3Rpb24oYm9vbCBuZWVkc0FzeW5jUmV3cml0ZSwgRnVuY3Rpb25FbnRpdHkgZWxlbWVudCwKICAgICAgTGlzdDxqcy5QYXJhbWV0ZXI+IHBhcmFtZXRlcnMsIGpzLkJsb2NrIGJvZHkpIHsKICAgIGpzLkZ1biBmaW5pc2goanMuQXN5bmNNb2RpZmllciBhc3luY01vZGlmaWVyKSB7CiAgICAgIHJldHVybiBuZXcganMuRnVuKHBhcmFtZXRlcnMsIGJvZHksIGFzeW5jTW9kaWZpZXI6IGFzeW5jTW9kaWZpZXIpCiAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uRmFjdG9yeQogICAgICAgICAgICAgIC5jcmVhdGVCdWlsZGVyRm9yQ29udGV4dChlbGVtZW50KQogICAgICAgICAgICAgIC5idWlsZERlY2xhcmF0aW9uKGVsZW1lbnQpKTsKICAgIH0KCiAgICBpZiAobmVlZHNBc3luY1Jld3JpdGUpIHsKICAgICAgcmV0dXJuIGZpbmlzaChlbGVtZW50LmFzeW5jTWFya2VyLmlzQXN5bmMKICAgICAgICAgID8gKGVsZW1lbnQuYXN5bmNNYXJrZXIuaXNZaWVsZGluZwogICAgICAgICAgICAgID8gY29uc3QganMuQXN5bmNNb2RpZmllci5hc3luY1N0YXIoKQogICAgICAgICAgICAgIDogY29uc3QganMuQXN5bmNNb2RpZmllci5hc3luYygpKQogICAgICAgICAgOiAoZWxlbWVudC5hc3luY01hcmtlci5pc1lpZWxkaW5nCiAgICAgICAgICAgICAgPyBjb25zdCBqcy5Bc3luY01vZGlmaWVyLnN5bmNTdGFyKCkKICAgICAgICAgICAgICA6IGNvbnN0IGpzLkFzeW5jTW9kaWZpZXIuc3luYygpKSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmluaXNoKGNvbnN0IGpzLkFzeW5jTW9kaWZpZXIuc3luYygpKTsKICAgIH0KICB9CgogIGpzLkV4cHJlc3Npb24gZ2VuZXJhdGVDb2RlKAogICAgICBDb2RlZ2VuV29ya0l0ZW0gd29yaywgSEdyYXBoIGdyYXBoLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGlmICh3b3JrLmVsZW1lbnQuaXNGaWVsZCkgewogICAgICByZXR1cm4gZ2VuZXJhdGVMYXp5SW5pdGlhbGl6ZXIod29yaywgZ3JhcGgsIGNsb3NlZFdvcmxkKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBnZW5lcmF0ZU1ldGhvZCh3b3JrLCBncmFwaCwgY2xvc2VkV29ybGQpOwogICAgfQogIH0KCiAganMuRXhwcmVzc2lvbiBnZW5lcmF0ZUxhenlJbml0aWFsaXplcigKICAgICAgQ29kZWdlbldvcmtJdGVtIHdvcmssIEhHcmFwaCBncmFwaCwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gbWVhc3VyZSgoKSB7CiAgICAgIGJhY2tlbmQudHJhY2VyLnRyYWNlR3JhcGgoImNvZGVnZW4iLCBncmFwaCk7CiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb25GYWN0b3J5CiAgICAgICAgICAuY3JlYXRlQnVpbGRlckZvckNvbnRleHQod29yay5lbGVtZW50KQogICAgICAgICAgLmJ1aWxkRGVjbGFyYXRpb24od29yay5lbGVtZW50KTsKICAgICAgU3NhQ29kZUdlbmVyYXRvciBjb2RlZ2VuID0gbmV3IFNzYUNvZGVHZW5lcmF0b3IoCiAgICAgICAgICB0aGlzLAogICAgICAgICAgYmFja2VuZC5jb21waWxlci5vcHRpb25zLAogICAgICAgICAgYmFja2VuZC5lbWl0dGVyLAogICAgICAgICAgYmFja2VuZC5uYXRpdmVDb2RlZ2VuRW5xdWV1ZXIsCiAgICAgICAgICBiYWNrZW5kLmNoZWNrZWRNb2RlSGVscGVycywKICAgICAgICAgIGJhY2tlbmQub25lU2hvdEludGVyY2VwdG9yRGF0YSwKICAgICAgICAgIGJhY2tlbmQucnRpU3Vic3RpdHV0aW9ucywKICAgICAgICAgIGJhY2tlbmQucnRpRW5jb2RlciwKICAgICAgICAgIGJhY2tlbmQubmFtZXIsCiAgICAgICAgICBiYWNrZW5kLnN1cGVyTWVtYmVyRGF0YSwKICAgICAgICAgIGJhY2tlbmQudHJhY2VyLAogICAgICAgICAgY2xvc2VkV29ybGQsCiAgICAgICAgICB3b3JrKTsKICAgICAgY29kZWdlbi52aXNpdEdyYXBoKGdyYXBoKTsKICAgICAgcmV0dXJuIG5ldyBqcy5GdW4oY29kZWdlbi5wYXJhbWV0ZXJzLCBjb2RlZ2VuLmJvZHkpCiAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0pOwogIH0KCiAganMuRXhwcmVzc2lvbiBnZW5lcmF0ZU1ldGhvZCgKICAgICAgQ29kZWdlbldvcmtJdGVtIHdvcmssIEhHcmFwaCBncmFwaCwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gbWVhc3VyZSgoKSB7CiAgICAgIEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQgPSB3b3JrLmVsZW1lbnQ7CiAgICAgIGlmIChlbGVtZW50LmFzeW5jTWFya2VyICE9IEFzeW5jTWFya2VyLlNZTkMpIHsKICAgICAgICB3b3JrLnJlZ2lzdHJ5LnJlZ2lzdGVyQXN5bmNNYXJrZXIoZWxlbWVudC5hc3luY01hcmtlcik7CiAgICAgIH0KICAgICAgU3NhQ29kZUdlbmVyYXRvciBjb2RlZ2VuID0gbmV3IFNzYUNvZGVHZW5lcmF0b3IoCiAgICAgICAgICB0aGlzLAogICAgICAgICAgYmFja2VuZC5jb21waWxlci5vcHRpb25zLAogICAgICAgICAgYmFja2VuZC5lbWl0dGVyLAogICAgICAgICAgYmFja2VuZC5uYXRpdmVDb2RlZ2VuRW5xdWV1ZXIsCiAgICAgICAgICBiYWNrZW5kLmNoZWNrZWRNb2RlSGVscGVycywKICAgICAgICAgIGJhY2tlbmQub25lU2hvdEludGVyY2VwdG9yRGF0YSwKICAgICAgICAgIGJhY2tlbmQucnRpU3Vic3RpdHV0aW9ucywKICAgICAgICAgIGJhY2tlbmQucnRpRW5jb2RlciwKICAgICAgICAgIGJhY2tlbmQubmFtZXIsCiAgICAgICAgICBiYWNrZW5kLnN1cGVyTWVtYmVyRGF0YSwKICAgICAgICAgIGJhY2tlbmQudHJhY2VyLAogICAgICAgICAgY2xvc2VkV29ybGQsCiAgICAgICAgICB3b3JrKTsKICAgICAgY29kZWdlbi52aXNpdEdyYXBoKGdyYXBoKTsKICAgICAgYmFja2VuZC50cmFjZXIudHJhY2VHcmFwaCgiY29kZWdlbiIsIGdyYXBoKTsKICAgICAgcmV0dXJuIGJ1aWxkSmF2YVNjcmlwdEZ1bmN0aW9uKGdyYXBoLm5lZWRzQXN5bmNSZXdyaXRlLCB3b3JrLmVsZW1lbnQsCiAgICAgICAgICBjb2RlZ2VuLnBhcmFtZXRlcnMsIGNvZGVnZW4uYm9keSk7CiAgICB9KTsKICB9Cn0KCmNsYXNzIFNzYUNvZGVHZW5lcmF0b3IgaW1wbGVtZW50cyBIVmlzaXRvciwgSEJsb2NrSW5mb3JtYXRpb25WaXNpdG9yIHsKICAvLy8gUmV0dXJuZWQgYnkgW2V4cHJlc3Npb25UeXBlXSB0byB0ZWxsIGhvdyBjb2RlIGNhbiBiZSBnZW5lcmF0ZWQgZm9yCiAgLy8vIGEgc3ViZ3JhcGguCiAgLy8vIC0gW1RZUEVfU1RBVEVNRU5UXSBtZWFucyB0aGF0IHRoZSBncmFwaCBtdXN0IGJlIGdlbmVyYXRlZCBhcyBhIHN0YXRlbWVudCwKICAvLy8gd2hpY2ggaXMgYWx3YXlzIHBvc3NpYmxlLgogIC8vLyAtIFtUWVBFX0VYUFJFU1NJT05dIG1lYW5zIHRoYXQgdGhlIGdyYXBoIGNhbiBiZSBnZW5lcmF0ZWQgYXMgYW4gZXhwcmVzc2lvbiwKICAvLy8gb3IgcG9zc2libHkgc2V2ZXJhbCBjb21tYS1zZXBhcmF0ZWQgZXhwcmVzc2lvbnMuCiAgLy8vIC0gW1RZUEVfREVDTEFSQVRJT05dIG1lYW5zIHRoYXQgdGhlIGdyYXBoIGNhbiBiZSBnZW5lcmF0ZWQgYXMgYW4KICAvLy8gZXhwcmVzc2lvbiwgYW5kIHRoYXQgaXQgb25seSBnZW5lcmF0ZXMgZXhwcmVzc2lvbnMgb2YgdGhlIGZvcm0KICAvLy8gICB2YXJpYWJsZSA9IGV4cHJlc3Npb24KICAvLy8gd2hpY2ggYXJlIGFsc28gdmFsaWQgYXMgcGFydHMgb2YgYSAidmFyIiBkZWNsYXJhdGlvbi4KICBzdGF0aWMgY29uc3QgaW50IFRZUEVfU1RBVEVNRU5UID0gMDsKICBzdGF0aWMgY29uc3QgaW50IFRZUEVfRVhQUkVTU0lPTiA9IDE7CiAgc3RhdGljIGNvbnN0IGludCBUWVBFX0RFQ0xBUkFUSU9OID0gMjsKCiAgLy8vIFdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBnZW5lcmF0aW5nIGV4cHJlc3Npb25zIGluc3RlYWQgb2Ygc3RhdGVtZW50cy4KICAvLy8gVGhpcyBpbmNsdWRlcyBkZWNsYXJhdGlvbnMsIHdoaWNoIGFyZSBnZW5lcmF0ZWQgYXMgZXhwcmVzc2lvbnMuCiAgYm9vbCBpc0dlbmVyYXRpbmdFeHByZXNzaW9uID0gZmFsc2U7CgogIGZpbmFsIENvbXBpbGVyVGFzayBfY29kZWdlblRhc2s7CiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwogIGZpbmFsIENvZGVFbWl0dGVyVGFzayBfZW1pdHRlcjsKICBmaW5hbCBOYXRpdmVDb2RlZ2VuRW5xdWV1ZXIgX25hdGl2ZUVucXVldWVyOwogIGZpbmFsIENoZWNrZWRNb2RlSGVscGVycyBfY2hlY2tlZE1vZGVIZWxwZXJzOwogIGZpbmFsIE9uZVNob3RJbnRlcmNlcHRvckRhdGEgX29uZVNob3RJbnRlcmNlcHRvckRhdGE7CiAgZmluYWwgUnVudGltZVR5cGVzU3Vic3RpdHV0aW9ucyBfcnRpU3Vic3RpdHV0aW9uczsKICBmaW5hbCBSdW50aW1lVHlwZXNFbmNvZGVyIF9ydGlFbmNvZGVyOwogIGZpbmFsIE5hbWVyIF9uYW1lcjsKICBmaW5hbCBTdXBlck1lbWJlckRhdGEgX3N1cGVyTWVtYmVyRGF0YTsKICBmaW5hbCBUcmFjZXIgX3RyYWNlcjsKICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwogIGZpbmFsIENvZGVnZW5Xb3JrSXRlbSBfd29yazsKCiAgZmluYWwgU2V0PEhJbnN0cnVjdGlvbj4gZ2VuZXJhdGVBdFVzZVNpdGU7CiAgZmluYWwgU2V0PEhJbnN0cnVjdGlvbj4gY29udHJvbEZsb3dPcGVyYXRvcnM7CiAgZmluYWwgU2V0PEp1bXBUYXJnZXQ+IGJyZWFrQWN0aW9uOwogIGZpbmFsIFNldDxMYWJlbERlZmluaXRpb24+IGNvbnRpbnVlQWN0aW9uOwogIGZpbmFsIFNldDxKdW1wVGFyZ2V0PiBpbXBsaWNpdENvbnRpbnVlQWN0aW9uOwogIGZpbmFsIExpc3Q8anMuUGFyYW1ldGVyPiBwYXJhbWV0ZXJzOwoKICBqcy5CbG9jayBjdXJyZW50Q29udGFpbmVyOwogIGpzLkJsb2NrIGdldCBib2R5ID0+IGN1cnJlbnRDb250YWluZXI7CiAgTGlzdDxqcy5FeHByZXNzaW9uPiBleHByZXNzaW9uU3RhY2s7CiAgTGlzdDxqcy5CbG9jaz4gb2xkQ29udGFpbmVyU3RhY2s7CgogIC8vLyBDb250YWlucyB0aGUgbmFtZXMgb2YgdGhlIGluc3RydWN0aW9ucywgYXMgd2VsbCBhcyB0aGUgcGFyYWxsZWwKICAvLy8gY29waWVzIHRvIHBlcmZvcm0gb24gYmxvY2sgdHJhbnNpdGlvbmluZy4KICBWYXJpYWJsZU5hbWVzIHZhcmlhYmxlTmFtZXM7CgogIC8vLyBgdHJ1ZWAgd2hlbiB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgYHZhcmAgZGVjbGFyYXRpb24gYXQgZnVuY3Rpb24gZW50cnksCiAgLy8vIGBmYWxzZWAgaWYgd2UgY2FuIGdlbmVyYXRlIGEgYHZhcmAgZGVjbGFyYXRpb24gYXQgZmlyc3QgYXNzaWdubWVudCBpbiB0aGUKICAvLy8gbWlkZGxlIG9mIHRoZSBmdW5jdGlvbi4KICBib29sIHNob3VsZEdyb3VwVmFyRGVjbGFyYXRpb25zID0gZmFsc2U7CgogIC8vLyBXaGlsZSBnZW5lcmF0aW5nIGV4cHJlc3Npb25zLCB3ZSBjYW4ndCBpbnNlcnQgdmFyaWFibGUgZGVjbGFyYXRpb25zLgogIC8vLyBJbnN0ZWFkIHdlIGRlY2xhcmUgdGhlbSBhdCB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLiAgV2hlbiBtaW5pZnlpbmcKICAvLy8gd2UgZG8gdGhpcyBtb3N0IG9mIHRoZSB0aW1lLCBiZWNhdXNlIGl0IHJlZHVjZXMgdGhlIHNpemUgdW5sZXNzIHRoZXJlCiAgLy8vIGlzIG9ubHkgb25lIHZhcmlhYmxlLgogIGZpbmFsIFNldDxTdHJpbmc+IGNvbGxlY3RlZFZhcmlhYmxlRGVjbGFyYXRpb25zOwoKICAvLy8gU2V0IG9mIHZhcmlhYmxlcyBhbmQgcGFyYW1ldGVycyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGRlY2xhcmVkLgogIGZpbmFsIFNldDxTdHJpbmc+IGRlY2xhcmVkTG9jYWxzOwoKICBIR3JhcGggY3VycmVudEdyYXBoOwoKICAvLyBSZWNvcmRzIGEgYmxvY2staW5mb3JtYXRpb24gdGhhdCBpcyBiZWluZyBoYW5kbGVkIHNwZWNpYWxseS4KICAvLyBVc2VkIHRvIGJyZWFrIGJhZCByZWN1cnNpb24uCiAgSEJsb2NrSW5mb3JtYXRpb24gY3VycmVudEJsb2NrSW5mb3JtYXRpb247CiAgLy8gVGhlIHN1YmdyYXBoIGlzIHVzZWQgdG8gZGVsaW1pdCB0cmF2ZXJzYWwgZm9yIHNvbWUgY29uc3RydWN0aW9ucywgZS5nLiwKICAvLyBpZiBicmFuY2hlcy4KICBTdWJHcmFwaCBzdWJHcmFwaDsKCiAgLy8gUGVuZGluZyBibG9ja3MgdGhhbiBuZWVkIHRvIGJlIHZpc2l0ZWQgYXMgcGFydCBvZiBjdXJyZW50IHN1YmdyYXBoLgogIFF1ZXVlPEhCYXNpY0Jsb2NrPiBibG9ja1F1ZXVlOwoKICBTc2FDb2RlR2VuZXJhdG9yKAogICAgICB0aGlzLl9jb2RlZ2VuVGFzaywKICAgICAgdGhpcy5fb3B0aW9ucywKICAgICAgdGhpcy5fZW1pdHRlciwKICAgICAgdGhpcy5fbmF0aXZlRW5xdWV1ZXIsCiAgICAgIHRoaXMuX2NoZWNrZWRNb2RlSGVscGVycywKICAgICAgdGhpcy5fb25lU2hvdEludGVyY2VwdG9yRGF0YSwKICAgICAgdGhpcy5fcnRpU3Vic3RpdHV0aW9ucywKICAgICAgdGhpcy5fcnRpRW5jb2RlciwKICAgICAgdGhpcy5fbmFtZXIsCiAgICAgIHRoaXMuX3N1cGVyTWVtYmVyRGF0YSwKICAgICAgdGhpcy5fdHJhY2VyLAogICAgICB0aGlzLl9jbG9zZWRXb3JsZCwKICAgICAgdGhpcy5fd29yaywKICAgICAge1NvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9ufSkKICAgICAgOiBkZWNsYXJlZExvY2FscyA9IG5ldyBTZXQ8U3RyaW5nPigpLAogICAgICAgIGNvbGxlY3RlZFZhcmlhYmxlRGVjbGFyYXRpb25zID0gbmV3IFNldDxTdHJpbmc+KCksCiAgICAgICAgY3VycmVudENvbnRhaW5lciA9IG5ldyBqcy5CbG9jay5lbXB0eSgpLAogICAgICAgIHBhcmFtZXRlcnMgPSA8anMuUGFyYW1ldGVyPltdLAogICAgICAgIGV4cHJlc3Npb25TdGFjayA9IDxqcy5FeHByZXNzaW9uPltdLAogICAgICAgIG9sZENvbnRhaW5lclN0YWNrID0gPGpzLkJsb2NrPltdLAogICAgICAgIGdlbmVyYXRlQXRVc2VTaXRlID0gbmV3IFNldDxISW5zdHJ1Y3Rpb24+KCksCiAgICAgICAgY29udHJvbEZsb3dPcGVyYXRvcnMgPSBuZXcgU2V0PEhJbnN0cnVjdGlvbj4oKSwKICAgICAgICBicmVha0FjdGlvbiA9IG5ldyBTZXQ8SnVtcFRhcmdldD4oKSwKICAgICAgICBjb250aW51ZUFjdGlvbiA9IG5ldyBTZXQ8TGFiZWxEZWZpbml0aW9uPigpLAogICAgICAgIGltcGxpY2l0Q29udGludWVBY3Rpb24gPSBuZXcgU2V0PEp1bXBUYXJnZXQ+KCk7CgogIENvZGVnZW5SZWdpc3RyeSBnZXQgX3JlZ2lzdHJ5ID0+IF93b3JrLnJlZ2lzdHJ5OwoKICBKQ29tbW9uRWxlbWVudHMgZ2V0IF9jb21tb25FbGVtZW50cyA9PiBfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHM7CgogIE5hdGl2ZURhdGEgZ2V0IF9uYXRpdmVEYXRhID0+IF9jbG9zZWRXb3JsZC5uYXRpdmVEYXRhOwoKICBJbnRlcmNlcHRvckRhdGEgZ2V0IF9pbnRlcmNlcHRvckRhdGEgPT4gX2Nsb3NlZFdvcmxkLmludGVyY2VwdG9yRGF0YTsKCiAgQWJzdHJhY3RWYWx1ZURvbWFpbiBnZXQgX2Fic3RyYWN0VmFsdWVEb21haW4gPT4KICAgICAgX2Nsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CgogIGJvb2wgaXNHZW5lcmF0ZUF0VXNlU2l0ZShISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIHJldHVybiBnZW5lcmF0ZUF0VXNlU2l0ZS5jb250YWlucyhpbnN0cnVjdGlvbik7CiAgfQoKICBib29sIGhhc05vbkJpdE9wVXNlcihISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24sIFNldDxIUGhpPiBwaGlTZXQpIHsKICAgIGZvciAoSEluc3RydWN0aW9uIHVzZXIgaW4gaW5zdHJ1Y3Rpb24udXNlZEJ5KSB7CiAgICAgIGlmICh1c2VyIGlzIEhQaGkpIHsKICAgICAgICBpZiAoIXBoaVNldC5jb250YWlucyh1c2VyKSkgewogICAgICAgICAgcGhpU2V0LmFkZCh1c2VyKTsKICAgICAgICAgIGlmIChoYXNOb25CaXRPcFVzZXIodXNlciwgcGhpU2V0KSkgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHVzZXIgaXMhIEhCaXROb3QgJiYgdXNlciBpcyEgSEJpbmFyeUJpdE9wKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBiaXRzIG9jY3VwaWVkIGJ5IHRoZSB2YWx1ZSBjb21wdXRlZCBieSBbaW5zdHJ1Y3Rpb25dLgogIC8vIFJldHVybnMgYDMyYCBpZiB0aGUgdmFsdWUgaXMgbmVnYXRpdmUgb3IgZG9lcyBub3QgZml0IGluIGEgc21hbGxlciBudW1iZXIKICAvLyBvZiBiaXRzLgogIGludCBiaXRXaWR0aChISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGNvbnN0IGludCBNQVggPSAzMjsKICAgIGludCBjb25zdGFudChISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgICAgaWYgKGluc3RydWN0aW9uIGlzIEhDb25zdGFudCAmJiBpbnN0cnVjdGlvbi5pc0NvbnN0YW50SW50ZWdlcigpKSB7CiAgICAgICAgSW50Q29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IGluc3RydWN0aW9uLmNvbnN0YW50OwogICAgICAgIHJldHVybiBjb25zdGFudC5pbnRWYWx1ZS50b0ludCgpOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGlmIChpbnN0cnVjdGlvbi5pc0NvbnN0YW50SW50ZWdlcigpKSB7CiAgICAgIGludCB2YWx1ZSA9IGNvbnN0YW50KGluc3RydWN0aW9uKTsKICAgICAgaWYgKHZhbHVlIDwgMCkgcmV0dXJuIE1BWDsKICAgICAgaWYgKHZhbHVlID4gKCgxIDw8IDMxKSAtIDEpKSByZXR1cm4gTUFYOwogICAgICByZXR1cm4gdmFsdWUuYml0TGVuZ3RoOwogICAgfQogICAgaWYgKGluc3RydWN0aW9uIGlzIEhCaXRBbmQpIHsKICAgICAgcmV0dXJuIG1hdGgubWluKGJpdFdpZHRoKGluc3RydWN0aW9uLmxlZnQpLCBiaXRXaWR0aChpbnN0cnVjdGlvbi5yaWdodCkpOwogICAgfQogICAgaWYgKGluc3RydWN0aW9uIGlzIEhCaXRPciB8fCBpbnN0cnVjdGlvbiBpcyBIQml0WG9yKSB7CiAgICAgIEhCaW5hcnlCaXRPcCBiaXRPcCA9IGluc3RydWN0aW9uOwogICAgICBpbnQgbGVmdFdpZHRoID0gYml0V2lkdGgoYml0T3AubGVmdCk7CiAgICAgIGlmIChsZWZ0V2lkdGggPT0gTUFYKSByZXR1cm4gTUFYOwogICAgICByZXR1cm4gbWF0aC5tYXgobGVmdFdpZHRoLCBiaXRXaWR0aChiaXRPcC5yaWdodCkpOwogICAgfQogICAgaWYgKGluc3RydWN0aW9uIGlzIEhTaGlmdExlZnQpIHsKICAgICAgaW50IHNoaWZ0Q291bnQgPSBjb25zdGFudChpbnN0cnVjdGlvbi5yaWdodCk7CiAgICAgIGlmIChzaGlmdENvdW50ID09IG51bGwgfHwgc2hpZnRDb3VudCA8IDAgfHwgc2hpZnRDb3VudCA+IDMxKSByZXR1cm4gTUFYOwogICAgICBpbnQgbGVmdFdpZHRoID0gYml0V2lkdGgoaW5zdHJ1Y3Rpb24ubGVmdCk7CiAgICAgIGludCB3aWR0aCA9IGxlZnRXaWR0aCArIHNoaWZ0Q291bnQ7CiAgICAgIHJldHVybiBtYXRoLm1pbih3aWR0aCwgTUFYKTsKICAgIH0KICAgIGlmIChpbnN0cnVjdGlvbiBpcyBIU2hpZnRSaWdodCkgewogICAgICBpbnQgc2hpZnRDb3VudCA9IGNvbnN0YW50KGluc3RydWN0aW9uLnJpZ2h0KTsKICAgICAgaWYgKHNoaWZ0Q291bnQgPT0gbnVsbCB8fCBzaGlmdENvdW50IDwgMCB8fCBzaGlmdENvdW50ID4gMzEpIHJldHVybiBNQVg7CiAgICAgIGludCBsZWZ0V2lkdGggPSBiaXRXaWR0aChpbnN0cnVjdGlvbi5sZWZ0KTsKICAgICAgaWYgKGxlZnRXaWR0aCA+PSBNQVgpIHJldHVybiBNQVg7CiAgICAgIHJldHVybiBtYXRoLm1heChsZWZ0V2lkdGggLSBzaGlmdENvdW50LCAwKTsKICAgIH0KICAgIGlmIChpbnN0cnVjdGlvbiBpcyBIQWRkKSB7CiAgICAgIHJldHVybiBtYXRoLm1pbigKICAgICAgICAgIDEgKyBtYXRoLm1heChiaXRXaWR0aChpbnN0cnVjdGlvbi5sZWZ0KSwgYml0V2lkdGgoaW5zdHJ1Y3Rpb24ucmlnaHQpKSwKICAgICAgICAgIE1BWCk7CiAgICB9CiAgICByZXR1cm4gTUFYOwogIH0KCiAgYm9vbCByZXF1aXJlc1VpbnRDb252ZXJzaW9uKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgaWYgKGluc3RydWN0aW9uLmlzVUludDMxKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChiaXRXaWR0aChpbnN0cnVjdGlvbikgPD0gMzEpIHJldHVybiBmYWxzZTsKICAgIC8vIElmIHRoZSByZXN1bHQgb2YgYSBiaXQtb3BlcmF0aW9uIGlzIG9ubHkgdXNlZCBieSBvdGhlciBiaXQKICAgIC8vIG9wZXJhdGlvbnMsIHdlIGRvIG5vdCBoYXZlIHRvIGNvbnZlcnQgdG8gYW4gdW5zaWduZWQgaW50ZWdlci4KICAgIHJldHVybiBoYXNOb25CaXRPcFVzZXIoaW5zdHJ1Y3Rpb24sIG5ldyBTZXQ8SFBoaT4oKSk7CiAgfQoKICAvLy8gSWYgdGhlIFtpbnN0cnVjdGlvbl0gaXMgbm90IGBudWxsYCBpdCB3aWxsIGJlIHVzZWQgdG8gYXR0YWNoIHRoZSBwb3NpdGlvbgogIC8vLyB0byB0aGUgW3N0YXRlbWVudF0uCiAgdm9pZCBwdXNoU3RhdGVtZW50KGpzLlN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKICAgIGFzc2VydChleHByZXNzaW9uU3RhY2suaXNFbXB0eSk7CiAgICBjdXJyZW50Q29udGFpbmVyLnN0YXRlbWVudHMuYWRkKHN0YXRlbWVudCk7CiAgfQoKICB2b2lkIGluc2VydFN0YXRlbWVudEF0U3RhcnQoanMuU3RhdGVtZW50IHN0YXRlbWVudCkgewogICAgY3VycmVudENvbnRhaW5lci5zdGF0ZW1lbnRzLmluc2VydCgwLCBzdGF0ZW1lbnQpOwogIH0KCiAgLy8vIElmIHRoZSBbaW5zdHJ1Y3Rpb25dIGlzIG5vdCBgbnVsbGAgaXQgd2lsbCBiZSB1c2VkIHRvIGF0dGFjaCB0aGUgcG9zaXRpb24KICAvLy8gdG8gdGhlIFtleHByZXNzaW9uXS4KICBwdXNoRXhwcmVzc2lvbkFzU3RhdGVtZW50KAogICAgICBqcy5FeHByZXNzaW9uIGV4cHJlc3Npb24sIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBwdXNoU3RhdGVtZW50KG5ldyBqcy5FeHByZXNzaW9uU3RhdGVtZW50KGV4cHJlc3Npb24pCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgLy8vIElmIHRoZSBbaW5zdHJ1Y3Rpb25dIGlzIG5vdCBgbnVsbGAgaXQgd2lsbCBiZSB1c2VkIHRvIGF0dGFjaCB0aGUgcG9zaXRpb24KICAvLy8gdG8gdGhlIFtleHByZXNzaW9uXS4KICBwdXNoKGpzLkV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogICAgZXhwcmVzc2lvblN0YWNrLmFkZChleHByZXNzaW9uKTsKICB9CgogIGpzLkV4cHJlc3Npb24gcG9wKCkgewogICAgcmV0dXJuIGV4cHJlc3Npb25TdGFjay5yZW1vdmVMYXN0KCk7CiAgfQoKICB2b2lkIHByZUdlbmVyYXRlTWV0aG9kKEhHcmFwaCBncmFwaCkgewogICAgdm9pZCBydW5QaGFzZShDb2RlZ2VuUGhhc2UgcGhhc2UsIHtib29sIHRyYWNlR3JhcGggPSB0cnVlfSkgewogICAgICBfY29kZWdlblRhc2subWVhc3VyZVN1YnRhc2socGhhc2UubmFtZSwgKCkgPT4gcGhhc2UudmlzaXRHcmFwaChncmFwaCkpOwogICAgICBpZiAodHJhY2VHcmFwaCkgewogICAgICAgIF90cmFjZXIudHJhY2VHcmFwaChwaGFzZS5uYW1lLCBncmFwaCk7CiAgICAgIH0KICAgICAgYXNzZXJ0KGdyYXBoLmlzVmFsaWQoKSwgJ0dyYXBoIG5vdCB2YWxpZCBhZnRlciAke3BoYXNlLm5hbWV9Jyk7CiAgICB9CgogICAgcnVuUGhhc2UoCiAgICAgICAgbmV3IFNzYUluc3RydWN0aW9uU2VsZWN0aW9uKF9vcHRpb25zLCBfY2xvc2VkV29ybGQsIF9pbnRlcmNlcHRvckRhdGEpKTsKICAgIHJ1blBoYXNlKG5ldyBTc2FUeXBlS25vd25SZW1vdmVyKCkpOwogICAgcnVuUGhhc2UobmV3IFNzYVRydXN0ZWRDaGVja1JlbW92ZXIoX29wdGlvbnMpKTsKICAgIHJ1blBoYXNlKG5ldyBTc2FBc3NpZ25tZW50Q2hhaW5pbmcoX29wdGlvbnMsIF9jbG9zZWRXb3JsZCkpOwogICAgcnVuUGhhc2UobmV3IFNzYUluc3RydWN0aW9uTWVyZ2VyKAogICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLCBnZW5lcmF0ZUF0VXNlU2l0ZSwgX3N1cGVyTWVtYmVyRGF0YSkpOwogICAgcnVuUGhhc2UobmV3IFNzYUNvbmRpdGlvbk1lcmdlcihnZW5lcmF0ZUF0VXNlU2l0ZSwgY29udHJvbEZsb3dPcGVyYXRvcnMpKTsKICAgIHJ1blBoYXNlKG5ldyBTc2FTaGFyZVJlZ2lvbkNvbnN0YW50cyhfb3B0aW9ucykpOwoKICAgIFNzYUxpdmVJbnRlcnZhbEJ1aWxkZXIgaW50ZXJ2YWxCdWlsZGVyID0KICAgICAgICBuZXcgU3NhTGl2ZUludGVydmFsQnVpbGRlcihnZW5lcmF0ZUF0VXNlU2l0ZSwgY29udHJvbEZsb3dPcGVyYXRvcnMpOwogICAgcnVuUGhhc2UoaW50ZXJ2YWxCdWlsZGVyLCB0cmFjZUdyYXBoOiBmYWxzZSk7CiAgICBTc2FWYXJpYWJsZUFsbG9jYXRvciBhbGxvY2F0b3IgPSBuZXcgU3NhVmFyaWFibGVBbGxvY2F0b3IoCiAgICAgICAgX25hbWVyLAogICAgICAgIGludGVydmFsQnVpbGRlci5saXZlSW5zdHJ1Y3Rpb25zLAogICAgICAgIGludGVydmFsQnVpbGRlci5saXZlSW50ZXJ2YWxzLAogICAgICAgIGdlbmVyYXRlQXRVc2VTaXRlKTsKICAgIHJ1blBoYXNlKGFsbG9jYXRvciwgdHJhY2VHcmFwaDogZmFsc2UpOwogICAgdmFyaWFibGVOYW1lcyA9IGFsbG9jYXRvci5uYW1lczsKICAgIHNob3VsZEdyb3VwVmFyRGVjbGFyYXRpb25zID0gYWxsb2NhdG9yLm5hbWVzLm51bWJlck9mVmFyaWFibGVzID4gMTsKICB9CgogIHZvaWQgaGFuZGxlRGVsYXllZFZhcmlhYmxlRGVjbGFyYXRpb25zKFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICAvLyBDcmVhdGUgJ3ZhcicgbGlzdCBhdCB0aGUgc3RhcnQgb2YgZnVuY3Rpb24uICBNb3ZlIGFzc2lnbm1lbnQgc3RhdGVtZW50cwogICAgLy8gZnJvbSB0aGUgdG9wIG9mIHRoZSBib2R5IGludG8gdGhlIHZhcmlhYmxlIGluaXRpYWxpemVycy4KICAgIGlmIChjb2xsZWN0ZWRWYXJpYWJsZURlY2xhcmF0aW9ucy5pc0VtcHR5KSByZXR1cm47CgogICAgTGlzdDxqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uPiBkZWNsYXJhdGlvbnMgPSBbXTsKICAgIExpc3Q8anMuU3RhdGVtZW50PiBzdGF0ZW1lbnRzID0gY3VycmVudENvbnRhaW5lci5zdGF0ZW1lbnRzOwogICAgaW50IG5leHRTdGF0ZW1lbnQgPSAwOwoKICAgIHdoaWxlIChuZXh0U3RhdGVtZW50IDwgc3RhdGVtZW50cy5sZW5ndGgpIHsKICAgICAgaWYgKGNvbGxlY3RlZFZhcmlhYmxlRGVjbGFyYXRpb25zLmlzRW1wdHkpIGJyZWFrOwogICAgICBqcy5TdGF0ZW1lbnQgc3RhdGVtZW50ID0gc3RhdGVtZW50c1tuZXh0U3RhdGVtZW50XTsKICAgICAgaWYgKHN0YXRlbWVudCBpcyBqcy5FeHByZXNzaW9uU3RhdGVtZW50KSB7CiAgICAgICAganMuRXhwcmVzc2lvbiBleHByZXNzaW9uID0gc3RhdGVtZW50LmV4cHJlc3Npb247CiAgICAgICAgaWYgKGV4cHJlc3Npb24gaXMganMuQXNzaWdubWVudCAmJiAhZXhwcmVzc2lvbi5pc0NvbXBvdW5kKSB7CiAgICAgICAgICBqcy5FeHByZXNzaW9uIGxlZnQgPSBleHByZXNzaW9uLmxlZnRIYW5kU2lkZTsKICAgICAgICAgIGlmIChsZWZ0IGlzIGpzLlZhcmlhYmxlUmVmZXJlbmNlKSB7CiAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbGVmdC5uYW1lOwogICAgICAgICAgICBqcy5FeHByZXNzaW9uIHZhbHVlID0gZXhwcmVzc2lvbi52YWx1ZTsKICAgICAgICAgICAgaWYgKF9zYWZlSW5Jbml0aWFsaXplcih2YWx1ZSkgJiYKICAgICAgICAgICAgICAgIGNvbGxlY3RlZFZhcmlhYmxlRGVjbGFyYXRpb25zLnJlbW92ZShuYW1lKSkgewogICAgICAgICAgICAgIHZhciBpbml0aWFsaXphdGlvbiA9IG5ldyBqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uKAogICAgICAgICAgICAgICAgICAgICAgbmV3IGpzLlZhcmlhYmxlRGVjbGFyYXRpb24obmFtZSksIHZhbHVlKQogICAgICAgICAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKGV4cHJlc3Npb24uc291cmNlSW5mb3JtYXRpb24pOwogICAgICAgICAgICAgIGRlY2xhcmF0aW9ucy5hZGQoaW5pdGlhbGl6YXRpb24pOwogICAgICAgICAgICAgICsrbmV4dFN0YXRlbWVudDsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBicmVhazsKICAgIH0KCiAgICBMaXN0PGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24+IHVuaW5pdGlhbGl6ZWQgPSBbXTsKICAgIGZvciAoU3RyaW5nIG5hbWUgaW4gY29sbGVjdGVkVmFyaWFibGVEZWNsYXJhdGlvbnMpIHsKICAgICAgdW5pbml0aWFsaXplZC5hZGQobmV3IGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24oCiAgICAgICAgICBuZXcganMuVmFyaWFibGVEZWNsYXJhdGlvbihuYW1lKSwgbnVsbCkpOwogICAgfQogICAgdmFyIGRlY2xhcmF0aW9uTGlzdCA9CiAgICAgICAgbmV3IGpzLlZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KHVuaW5pdGlhbGl6ZWQgKyBkZWNsYXJhdGlvbnMpCiAgICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pOwogICAgc3RhdGVtZW50cy5yZXBsYWNlUmFuZ2UoCiAgICAgICAgMCwgbmV4dFN0YXRlbWVudCwgW25ldyBqcy5FeHByZXNzaW9uU3RhdGVtZW50KGRlY2xhcmF0aW9uTGlzdCldKTsKICB9CgogIC8vIEFuIGV4cHJlc3Npb24gaXMgc2FmZSB0byBiZSBwdWxsZWQgaW50byBhICd2YXInIGluaXRpYWxpemVyIGlmIGl0IGRvZXMgbm90CiAgLy8gY29udGFpbiBhc3NpZ25tZW50cyB0byBsb2NhbHMuIFdlIGRvbid0IGdlbmVyYXRlIGFzc2lnbm1lbnRzIHRvIGxvY2FscwogIC8vIGluc2lkZSBleHByZXNzaW9ucy4KICBib29sIF9zYWZlSW5Jbml0aWFsaXplcihqcy5FeHByZXNzaW9uIG5vZGUpID0+IHRydWU7CgogIHZpc2l0R3JhcGgoSEdyYXBoIGdyYXBoKSB7CiAgICBwcmVHZW5lcmF0ZU1ldGhvZChncmFwaCk7CiAgICBjdXJyZW50R3JhcGggPSBncmFwaDsKICAgIHZpc2l0U3ViR3JhcGgobmV3IFN1YkdyYXBoKGdyYXBoLmVudHJ5LCBncmFwaC5leGl0KSk7CiAgICBoYW5kbGVEZWxheWVkVmFyaWFibGVEZWNsYXJhdGlvbnMoZ3JhcGguc291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgdm9pZCB2aXNpdFN1YkdyYXBoKFN1YkdyYXBoIG5ld1N1YkdyYXBoKSB7CiAgICBTdWJHcmFwaCBvbGRTdWJHcmFwaCA9IHN1YkdyYXBoOwogICAgUXVldWU8SEJhc2ljQmxvY2s+IG9sZEJsb2NrUXVldWUgPSBibG9ja1F1ZXVlOwogICAgc3ViR3JhcGggPSBuZXdTdWJHcmFwaDsKICAgIGJsb2NrUXVldWUgPSBuZXcgUXVldWU8SEJhc2ljQmxvY2s+KCk7CiAgICBlbnRlclN1YkdyYXBoKHN1YkdyYXBoLnN0YXJ0KTsKICAgIGJsb2NrUXVldWUgPSBvbGRCbG9ja1F1ZXVlOwogICAgc3ViR3JhcGggPSBvbGRTdWJHcmFwaDsKICB9CgogIC8vLyBDaGVjayB3aGV0aGVyIGEgc3ViLWdyYXBoIGNhbiBiZSBnZW5lcmF0ZWQgYXMgYW4gZXhwcmVzc2lvbiwgb3IgZXZlbgogIC8vLyBhcyBhIGRlY2xhcmF0aW9uLCBvciBpZiBpdCBoYXMgdG8gZmFsbCBiYWNrIHRvIGJlaW5nIGdlbmVyYXRlZCBhcwogIC8vLyBhIHN0YXRlbWVudC4KICAvLy8gRXhwcmVzc2lvbnMgYXJlIGFueXRoaW5nIHRoYXQgZG9lc24ndCBnZW5lcmF0ZSBjb250cm9sIGZsb3cgY29uc3RydWN0cy4KICAvLy8gRGVjbGFyYXRpb25zIG11c3Qgb25seSBnZW5lcmF0ZSBhc3NpZ25tZW50cyBvbiB0aGUgZm9ybSAiaWQgPSBleHByZXNzaW9uIiwKICAvLy8gYW5kIG5vdCwgZS5nLiwgZXhwcmVzc2lvbnMgd2hlcmUgdGhlIHZhbHVlIGlzbid0IGFzc2lnbmVkLCBvciB3aGVyZSBpdCdzCiAgLy8vIGFzc2lnbmVkIHRvIHNvbWV0aGluZyB0aGF0J3Mgbm90IGEgc2ltcGxlIHZhcmlhYmxlLgogIGludCBleHByZXNzaW9uVHlwZShIRXhwcmVzc2lvbkluZm9ybWF0aW9uIGluZm8pIHsKICAgIC8vIFRoZSBvbmx5IEhFeHByZXNzaW9uSW5mb3JtYXRpb24gdXNlZCBhcyBwYXJ0IG9mIGEgSEJsb2NrSW5mb3JtYXRpb24gaXMKICAgIC8vIGN1cnJlbnQgSFN1YkV4cHJlc3Npb25CbG9ja0luZm9ybWF0aW9uLCBzbyBpdCdzIHRoZSBvbmx5IG9uZSByZWFjaGluZwogICAgLy8gaGVyZS4gSWYgd2Ugc3RhcnQgdXNpbmcgdGhlIG90aGVyIEhFeHByZXNzaW9uSW5mb3JtYXRpb24gdHlwZXMgdG9vLAogICAgLy8gdGhpcyBjb2RlIHNob3VsZCBiZSBnZW5lcmFsaXplZC4KICAgIGFzc2VydChpbmZvIGlzIEhTdWJFeHByZXNzaW9uQmxvY2tJbmZvcm1hdGlvbik7CiAgICBIU3ViRXhwcmVzc2lvbkJsb2NrSW5mb3JtYXRpb24gZXhwcmVzc2lvbkluZm8gPSBpbmZvOwogICAgU3ViR3JhcGggbGltaXRzID0gZXhwcmVzc2lvbkluZm8uc3ViRXhwcmVzc2lvbjsKCiAgICAvLyBTdGFydCBhc3N1bWluZyB0aGF0IHdlIGNhbiBnZW5lcmF0ZSBkZWNsYXJhdGlvbnMuIElmIHdlIGZpbmQgYQogICAgLy8gY291bnRlci1leGFtcGxlLCB3ZSBkZWdyYWRlIG91ciBhc3N1bXB0aW9uIHRvIGVpdGhlciBleHByZXNzaW9uIG9yCiAgICAvLyBzdGF0ZW1lbnQsIGFuZCBpbiB0aGUgbGF0dGVyIGNhc2UsIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHkgc2luY2UKICAgIC8vIGl0IGNhbid0IGdldCBhbnkgd29yc2UuIEUuZy4sIGEgZnVuY3Rpb24gY2FsbCB3aGVyZSB0aGUgcmV0dXJuIHZhbHVlCiAgICAvLyBpc24ndCB1c2VkIGNhbid0IGJlIGluIGEgZGVjbGFyYXRpb24uCiAgICBpbnQgcmVzdWx0ID0gVFlQRV9ERUNMQVJBVElPTjsKICAgIEhCYXNpY0Jsb2NrIGJhc2ljQmxvY2sgPSBsaW1pdHMuc3RhcnQ7CiAgICBkbyB7CiAgICAgIEhJbnN0cnVjdGlvbiBjdXJyZW50ID0gYmFzaWNCbG9jay5maXJzdDsKICAgICAgd2hpbGUgKGN1cnJlbnQgIT0gYmFzaWNCbG9jay5sYXN0KSB7CiAgICAgICAgLy8gRS5nLCBib3VuZHMgY2hlY2suCiAgICAgICAgaWYgKGN1cnJlbnQuaXNDb250cm9sRmxvdygpKSB7CiAgICAgICAgICByZXR1cm4gVFlQRV9TVEFURU1FTlQ7CiAgICAgICAgfQogICAgICAgIC8vIEhGaWVsZFNldCBnZW5lcmF0ZXMgY29kZSBvbiB0aGUgZm9ybSAieC55ID0gLi4uIiwgd2hpY2ggaXNuJ3QgdmFsaWQKICAgICAgICAvLyBpbiBhIGRlY2xhcmF0aW9uLgogICAgICAgIGlmIChjdXJyZW50LnVzZWRCeS5pc0VtcHR5IHx8IGN1cnJlbnQgaXMgSEZpZWxkU2V0KSB7CiAgICAgICAgICByZXN1bHQgPSBUWVBFX0VYUFJFU1NJT047CiAgICAgICAgfQogICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7CiAgICAgIH0KICAgICAgaWYgKGN1cnJlbnQgaXMgSEdvdG8pIHsKICAgICAgICBiYXNpY0Jsb2NrID0gYmFzaWNCbG9jay5zdWNjZXNzb3JzWzBdOwogICAgICB9IGVsc2UgaWYgKGN1cnJlbnQgaXMgSENvbmRpdGlvbmFsQnJhbmNoKSB7CiAgICAgICAgaWYgKGdlbmVyYXRlQXRVc2VTaXRlLmNvbnRhaW5zKGN1cnJlbnQpKSB7CiAgICAgICAgICAvLyBTaG9ydC1jaXJjdWl0IGNvbnRyb2wgZmxvdyBvcGVyYXRvciB0cmlja2VyeS4KICAgICAgICAgIC8vIENoZWNrIHRoZSBzZWNvbmQgaGFsZiwgd2hpY2ggd2lsbCBjb250aW51ZSBpbnRvIHRoZSBqb2luLgogICAgICAgICAgLy8gKFRoZSBmaXJzdCBoYWxmIGlzIFtpbnB1dHNbMF1dLCB0aGUgc2Vjb25kIGhhbGYgaXMgW3N1Y2Nlc3NvcnNbMF1dLAogICAgICAgICAgLy8gYW5kIFtzdWNjZXNzb3JzWzFdXSBpcyB0aGUgam9pbi1ibG9jaykuCiAgICAgICAgICBiYXNpY0Jsb2NrID0gYmFzaWNCbG9jay5zdWNjZXNzb3JzWzBdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBXZSBhbGxvdyBhbiBleHByZXNzaW9uIHRvIGVuZCBvbiBhbiBISWYgKGEgY29uZGl0aW9uIGV4cHJlc3Npb24pLgogICAgICAgICAgcmV0dXJuIGlkZW50aWNhbChiYXNpY0Jsb2NrLCBsaW1pdHMuZW5kKSA/IHJlc3VsdCA6IFRZUEVfU1RBVEVNRU5UOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBFeHByZXNzaW9uLWluY29tcGF0aWJsZSBjb250cm9sIGZsb3cuCiAgICAgICAgcmV0dXJuIFRZUEVfU1RBVEVNRU5UOwogICAgICB9CiAgICB9IHdoaWxlIChsaW1pdHMuY29udGFpbnMoYmFzaWNCbG9jaykpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGJvb2wgaXNKU0V4cHJlc3Npb24oSEV4cHJlc3Npb25JbmZvcm1hdGlvbiBpbmZvKSB7CiAgICByZXR1cm4gIWlkZW50aWNhbChleHByZXNzaW9uVHlwZShpbmZvKSwgVFlQRV9TVEFURU1FTlQpOwogIH0KCiAgYm9vbCBpc0pTQ29uZGl0aW9uKEhFeHByZXNzaW9uSW5mb3JtYXRpb24gaW5mbykgewogICAgSFN1YkV4cHJlc3Npb25CbG9ja0luZm9ybWF0aW9uIGdyYXBoID0gaW5mbzsKICAgIFN1YkV4cHJlc3Npb24gbGltaXRzID0gZ3JhcGguc3ViRXhwcmVzc2lvbjsKICAgIHJldHVybiAhaWRlbnRpY2FsKGV4cHJlc3Npb25UeXBlKGluZm8pLCBUWVBFX1NUQVRFTUVOVCkgJiYKICAgICAgICAobGltaXRzLmVuZC5sYXN0IGlzIEhDb25kaXRpb25hbEJyYW5jaCk7CiAgfQoKICAvLy8gR2VuZXJhdGUgc3RhdGVtZW50cyBmcm9tIGJsb2NrIGluZm9ybWF0aW9uLgogIC8vLyBJZiB0aGUgYmxvY2sgaW5mb3JtYXRpb24gY29udGFpbnMgZXhwcmVzc2lvbnMsIGdlbmVyYXRlIG9ubHkKICAvLy8gYXNzaWdubWVudHMsIGFuZCBpZiBpdCBlbmRzIGluIGEgY29uZGl0aW9uYWwgYnJhbmNoLCBkb24ndCBnZW5lcmF0ZQogIC8vLyB0aGUgY29uZGl0aW9uLgogIHZvaWQgZ2VuZXJhdGVTdGF0ZW1lbnRzKEhCbG9ja0luZm9ybWF0aW9uIGJsb2NrKSB7CiAgICBpZiAoYmxvY2sgaXMgSFN0YXRlbWVudEluZm9ybWF0aW9uKSB7CiAgICAgIGJsb2NrLmFjY2VwdCh0aGlzKTsKICAgIH0gZWxzZSB7CiAgICAgIEhTdWJFeHByZXNzaW9uQmxvY2tJbmZvcm1hdGlvbiBleHByZXNzaW9uID0gYmxvY2s7CiAgICAgIHZpc2l0U3ViR3JhcGgoZXhwcmVzc2lvbi5zdWJFeHByZXNzaW9uKTsKICAgIH0KICB9CgogIGpzLkJsb2NrIGdlbmVyYXRlU3RhdGVtZW50c0luTmV3QmxvY2soSEJsb2NrSW5mb3JtYXRpb24gYmxvY2spIHsKICAgIGpzLkJsb2NrIHJlc3VsdCA9IG5ldyBqcy5CbG9jay5lbXB0eSgpOwogICAganMuQmxvY2sgb2xkQ29udGFpbmVyID0gY3VycmVudENvbnRhaW5lcjsKICAgIGN1cnJlbnRDb250YWluZXIgPSByZXN1bHQ7CiAgICBnZW5lcmF0ZVN0YXRlbWVudHMoYmxvY2spOwogICAgY3VycmVudENvbnRhaW5lciA9IG9sZENvbnRhaW5lcjsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gSWYgdGhlIFtibG9ja10gb25seSBjb250YWlucyBvbmUgc3RhdGVtZW50IHJldHVybnMgdGhhdCBzdGF0ZW1lbnQuIElmIHRoZQogIC8vLyB0aGF0IHN0YXRlbWVudCBpdHNlbGYgaXMgYSBibG9jaywgcmVjdXJzaXZlbHkgY2FsbHMgdGhpcyBtZXRob2QuCiAgLy8vCiAgLy8vIElmIHRoZSBibG9jayBpcyBlbXB0eSwgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiBbanMuTk9QXS4KICBqcy5TdGF0ZW1lbnQgdW53cmFwU3RhdGVtZW50KGpzLkJsb2NrIGJsb2NrKSB7CiAgICBpbnQgbGVuID0gYmxvY2suc3RhdGVtZW50cy5sZW5ndGg7CiAgICBpZiAobGVuID09IDApIHJldHVybiBuZXcganMuRW1wdHlTdGF0ZW1lbnQoKTsKICAgIGlmIChsZW4gPT0gMSkgewogICAgICBqcy5TdGF0ZW1lbnQgcmVzdWx0ID0gYmxvY2suc3RhdGVtZW50c1swXTsKICAgICAgaWYgKHJlc3VsdCBpcyBqcy5CbG9jaykgcmV0dXJuIHVud3JhcFN0YXRlbWVudChyZXN1bHQpOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIGJsb2NrOwogIH0KCiAgLy8vIEdlbmVyYXRlIGV4cHJlc3Npb25zIGZyb20gYmxvY2sgaW5mb3JtYXRpb24uCiAganMuRXhwcmVzc2lvbiBnZW5lcmF0ZUV4cHJlc3Npb24oSEV4cHJlc3Npb25JbmZvcm1hdGlvbiBleHByZXNzaW9uKSB7CiAgICAvLyBDdXJyZW50bHkgd2Ugb25seSBoYW5kbGUgc3ViLWV4cHJlc3Npb24gZ3JhcGhzLgogICAgYXNzZXJ0KGV4cHJlc3Npb24gaXMgSFN1YkV4cHJlc3Npb25CbG9ja0luZm9ybWF0aW9uKTsKCiAgICBib29sIG9sZElzR2VuZXJhdGluZ0V4cHJlc3Npb24gPSBpc0dlbmVyYXRpbmdFeHByZXNzaW9uOwogICAgaXNHZW5lcmF0aW5nRXhwcmVzc2lvbiA9IHRydWU7CiAgICBMaXN0PGpzLkV4cHJlc3Npb24+IG9sZEV4cHJlc3Npb25TdGFjayA9IGV4cHJlc3Npb25TdGFjazsKICAgIExpc3Q8anMuRXhwcmVzc2lvbj4gc2VxdWVuY2VFbGVtZW50cyA9IDxqcy5FeHByZXNzaW9uPltdOwogICAgZXhwcmVzc2lvblN0YWNrID0gc2VxdWVuY2VFbGVtZW50czsKICAgIEhTdWJFeHByZXNzaW9uQmxvY2tJbmZvcm1hdGlvbiBleHByZXNzaW9uU3ViR3JhcGggPSBleHByZXNzaW9uOwogICAgdmlzaXRTdWJHcmFwaChleHByZXNzaW9uU3ViR3JhcGguc3ViRXhwcmVzc2lvbik7CiAgICBleHByZXNzaW9uU3RhY2sgPSBvbGRFeHByZXNzaW9uU3RhY2s7CiAgICBpc0dlbmVyYXRpbmdFeHByZXNzaW9uID0gb2xkSXNHZW5lcmF0aW5nRXhwcmVzc2lvbjsKICAgIGlmIChzZXF1ZW5jZUVsZW1lbnRzLmlzRW1wdHkpIHsKICAgICAgLy8gSGFwcGVucyB3aGVuIHRoZSBpbml0aWFsaXplciwgY29uZGl0aW9uIG9yIHVwZGF0ZSBvZiBhIGxvb3AgaXMgZW1wdHkuCiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIGlmIChzZXF1ZW5jZUVsZW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHJldHVybiBzZXF1ZW5jZUVsZW1lbnRzWzBdOwogICAgfSBlbHNlIHsKICAgICAganMuRXhwcmVzc2lvbiByZXN1bHQgPSBzZXF1ZW5jZUVsZW1lbnRzLnJlbW92ZUxhc3QoKTsKICAgICAgd2hpbGUgKHNlcXVlbmNlRWxlbWVudHMuaXNOb3RFbXB0eSkgewogICAgICAgIHJlc3VsdCA9IG5ldyBqcy5CaW5hcnkoJywnLCBzZXF1ZW5jZUVsZW1lbnRzLnJlbW92ZUxhc3QoKSwgcmVzdWx0KTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogIH0KCiAgLy8vIE9ubHkgdmlzaXRzIHRoZSBhcmd1bWVudHMgc3RhcnRpbmcgYXQgaW5wdXRzW0hJbnZva2UuQVJHVU1FTlRTX09GRlNFVF0uCiAgTGlzdDxqcy5FeHByZXNzaW9uPiB2aXNpdEFyZ3VtZW50cyhMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzLAogICAgICB7aW50IHN0YXJ0OiBISW52b2tlLkFSR1VNRU5UU19PRkZTRVR9KSB7CiAgICBhc3NlcnQoaW5wdXRzLmxlbmd0aCA+PSBzdGFydCk7CiAgICBMaXN0PGpzLkV4cHJlc3Npb24+IHJlc3VsdCA9IG5ldyBMaXN0PGpzLkV4cHJlc3Npb24+KGlucHV0cy5sZW5ndGggLSBzdGFydCk7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBpbnB1dHMubGVuZ3RoOyBpKyspIHsKICAgICAgdXNlKGlucHV0c1tpXSk7CiAgICAgIHJlc3VsdFtpIC0gc3RhcnRdID0gcG9wKCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgYm9vbCBpc1ZhcmlhYmxlRGVjbGFyZWQoU3RyaW5nIHZhcmlhYmxlTmFtZSkgewogICAgcmV0dXJuIGRlY2xhcmVkTG9jYWxzLmNvbnRhaW5zKHZhcmlhYmxlTmFtZSkgfHwKICAgICAgICBjb2xsZWN0ZWRWYXJpYWJsZURlY2xhcmF0aW9ucy5jb250YWlucyh2YXJpYWJsZU5hbWUpOwogIH0KCiAganMuRXhwcmVzc2lvbiBnZW5lcmF0ZUV4cHJlc3Npb25Bc3NpZ25tZW50KFN0cmluZyB2YXJpYWJsZU5hbWUsCiAgICAgIGpzLkV4cHJlc3Npb24gdmFsdWUsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBpZiAodmFsdWUgaXMganMuQmluYXJ5KSB7CiAgICAgIGpzLkJpbmFyeSBiaW5hcnkgPSB2YWx1ZTsKICAgICAgU3RyaW5nIG9wID0gYmluYXJ5Lm9wOwogICAgICBpZiAob3AgPT0gJysnIHx8CiAgICAgICAgICBvcCA9PSAnLScgfHwKICAgICAgICAgIG9wID09ICcvJyB8fAogICAgICAgICAgb3AgPT0gJyonIHx8CiAgICAgICAgICBvcCA9PSAnJScgfHwKICAgICAgICAgIG9wID09ICdeJyB8fAogICAgICAgICAgb3AgPT0gJyYnIHx8CiAgICAgICAgICBvcCA9PSAnfCcpIHsKICAgICAgICBpZiAoYmluYXJ5LmxlZnQgaXMganMuVmFyaWFibGVVc2UgJiYKICAgICAgICAgICAgKGJpbmFyeS5sZWZ0IGFzIGpzLlZhcmlhYmxlVXNlKS5uYW1lID09IHZhcmlhYmxlTmFtZSkgewogICAgICAgICAgLy8gV2Uga25vdyBub3csIHRoYXQgd2UgY2FuIHNob3J0ZW4geCA9IHggKyB5IGludG8geCArPSB5LgogICAgICAgICAgLy8gQWxzbyBjaGVjayBmb3IgdGhlIHNob3J0Y3V0IHdoZXJlIHkgZXF1YWxzIDE6IHgrKyBhbmQgeC0tLgogICAgICAgICAgaWYgKChvcCA9PSAnKycgfHwgb3AgPT0gJy0nKSAmJgogICAgICAgICAgICAgIGJpbmFyeS5yaWdodCBpcyBqcy5MaXRlcmFsTnVtYmVyICYmCiAgICAgICAgICAgICAgKGJpbmFyeS5yaWdodCBhcyBqcy5MaXRlcmFsTnVtYmVyKS52YWx1ZSA9PSAiMSIpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBqcy5QcmVmaXgob3AgPT0gJysnID8gJysrJyA6ICctLScsIGJpbmFyeS5sZWZ0KTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBuZXcganMuQXNzaWdubWVudC5jb21wb3VuZChiaW5hcnkubGVmdCwgb3AsIGJpbmFyeS5yaWdodCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IGpzLkFzc2lnbm1lbnQobmV3IGpzLlZhcmlhYmxlVXNlKHZhcmlhYmxlTmFtZSksIHZhbHVlKQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24odmFsdWUuc291cmNlSW5mb3JtYXRpb24gPz8gc291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgdm9pZCBhc3NpZ25WYXJpYWJsZShTdHJpbmcgdmFyaWFibGVOYW1lLCBqcy5FeHByZXNzaW9uIHZhbHVlLAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgaWYgKGlzR2VuZXJhdGluZ0V4cHJlc3Npb24pIHsKICAgICAgLy8gSWYgd2UgYXJlIGluIGFuIGV4cHJlc3Npb24gdGhlbiB3ZSBjYW4ndCBkZWNsYXJlIHRoZSB2YXJpYWJsZSBoZXJlLgogICAgICAvLyBXZSBoYXZlIG5vIGNob2ljZSwgYnV0IHRvIHVzZSBpdCBhbmQgdGhlbiBkZWNsYXJlIGl0IHNlcGFyYXRlbHkuCiAgICAgIGlmICghaXNWYXJpYWJsZURlY2xhcmVkKHZhcmlhYmxlTmFtZSkpIHsKICAgICAgICBjb2xsZWN0ZWRWYXJpYWJsZURlY2xhcmF0aW9ucy5hZGQodmFyaWFibGVOYW1lKTsKICAgICAgfQogICAgICBwdXNoKAogICAgICAgICAgZ2VuZXJhdGVFeHByZXNzaW9uQXNzaWdubWVudCh2YXJpYWJsZU5hbWUsIHZhbHVlLCBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICAvLyBPdGhlcndpc2UgaWYgd2UgYXJlIHRyeWluZyB0byBkZWNsYXJlIGlubGluZSBhbmQgd2UgYXJlIGluIGEgc3RhdGVtZW50CiAgICAgIC8vIHRoZW4gd2UgZGVjbGFyZSAodW5sZXNzIGl0IHdhcyBhbHJlYWR5IGRlY2xhcmVkKS4KICAgIH0gZWxzZSBpZiAoIXNob3VsZEdyb3VwVmFyRGVjbGFyYXRpb25zICYmCiAgICAgICAgIWRlY2xhcmVkTG9jYWxzLmNvbnRhaW5zKHZhcmlhYmxlTmFtZSkpIHsKICAgICAgLy8gSXQgbWF5IGJlIG5lY2Vzc2FyeSB0byByZW1vdmUgaXQgZnJvbSB0aGUgb25lcyB0byBiZSBkZWNsYXJlZCBsYXRlci4KICAgICAgY29sbGVjdGVkVmFyaWFibGVEZWNsYXJhdGlvbnMucmVtb3ZlKHZhcmlhYmxlTmFtZSk7CiAgICAgIGRlY2xhcmVkTG9jYWxzLmFkZCh2YXJpYWJsZU5hbWUpOwogICAgICBqcy5WYXJpYWJsZURlY2xhcmF0aW9uIGRlY2wgPSBuZXcganMuVmFyaWFibGVEZWNsYXJhdGlvbih2YXJpYWJsZU5hbWUpOwogICAgICBqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uIGluaXRpYWxpemF0aW9uID0KICAgICAgICAgIG5ldyBqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uKGRlY2wsIHZhbHVlKTsKCiAgICAgIHB1c2hFeHByZXNzaW9uQXNTdGF0ZW1lbnQoCiAgICAgICAgICBuZXcganMuVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoCiAgICAgICAgICAgICAgPGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24+W2luaXRpYWxpemF0aW9uXSksCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9IGVsc2UgewogICAgICAvLyBPdGhlcndpc2Ugd2UgYXJlIGp1c3QgZ29pbmcgdG8gdXNlIGl0LiAgSWYgd2UgaGF2ZSBub3QgYWxyZWFkeSBkZWNsYXJlZAogICAgICAvLyBpdCB0aGVuIHdlIG1ha2Ugc3VyZSB3ZSB3aWxsIGRlY2xhcmUgaXQgbGF0ZXIuCiAgICAgIGlmICghZGVjbGFyZWRMb2NhbHMuY29udGFpbnModmFyaWFibGVOYW1lKSkgewogICAgICAgIGNvbGxlY3RlZFZhcmlhYmxlRGVjbGFyYXRpb25zLmFkZCh2YXJpYWJsZU5hbWUpOwogICAgICB9CiAgICAgIHB1c2hFeHByZXNzaW9uQXNTdGF0ZW1lbnQoCiAgICAgICAgICBnZW5lcmF0ZUV4cHJlc3Npb25Bc3NpZ25tZW50KHZhcmlhYmxlTmFtZSwgdmFsdWUsIHNvdXJjZUluZm9ybWF0aW9uKSwKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0KICB9CgogIHZvaWQgZGVmaW5lKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgLy8gRm9yIHNpbXBsZSB0eXBlIGNoZWNrcyBsaWtlIGkgPSBpbnRUeXBlQ2hlY2soaSksIHdlIGRvbid0IGhhdmUgdG8KICAgIC8vIGVtaXQgYW4gYXNzaWdubWVudCwgYmVjYXVzZSB0aGUgaW50VHlwZUNoZWNrIGp1c3QgcmV0dXJucyBpdHMKICAgIC8vIGFyZ3VtZW50LgogICAgYm9vbCBuZWVkc0Fzc2lnbm1lbnQgPSB0cnVlOwogICAgaWYgKGluc3RydWN0aW9uIGlzIEhUeXBlQ29udmVyc2lvbikgewogICAgICBIVHlwZUNvbnZlcnNpb24gdHlwZUNvbnZlcnNpb24gPSBpbnN0cnVjdGlvbjsKICAgICAgU3RyaW5nIGlucHV0TmFtZSA9IHZhcmlhYmxlTmFtZXMuZ2V0TmFtZSh0eXBlQ29udmVyc2lvbi5jaGVja2VkSW5wdXQpOwogICAgICBpZiAodmFyaWFibGVOYW1lcy5nZXROYW1lKGluc3RydWN0aW9uKSA9PSBpbnB1dE5hbWUpIHsKICAgICAgICBuZWVkc0Fzc2lnbm1lbnQgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKGluc3RydWN0aW9uIGlzIEhMb2NhbFZhbHVlKSB7CiAgICAgIG5lZWRzQXNzaWdubWVudCA9IGZhbHNlOwogICAgfQoKICAgIGlmIChuZWVkc0Fzc2lnbm1lbnQgJiYKICAgICAgICAhaW5zdHJ1Y3Rpb24uaXNDb250cm9sRmxvdygpICYmCiAgICAgICAgdmFyaWFibGVOYW1lcy5oYXNOYW1lKGluc3RydWN0aW9uKSkgewogICAgICB2aXNpdEV4cHJlc3Npb24oaW5zdHJ1Y3Rpb24pOwogICAgICBhc3NpZ25WYXJpYWJsZSh2YXJpYWJsZU5hbWVzLmdldE5hbWUoaW5zdHJ1Y3Rpb24pLCBwb3AoKSwKICAgICAgICAgIGluc3RydWN0aW9uLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChpc0dlbmVyYXRpbmdFeHByZXNzaW9uKSB7CiAgICAgIHZpc2l0RXhwcmVzc2lvbihpbnN0cnVjdGlvbik7CiAgICB9IGVsc2UgewogICAgICB2aXNpdFN0YXRlbWVudChpbnN0cnVjdGlvbik7CiAgICB9CiAgfQoKICB2b2lkIHVzZShISW5zdHJ1Y3Rpb24gYXJndW1lbnQpIHsKICAgIGlmIChpc0dlbmVyYXRlQXRVc2VTaXRlKGFyZ3VtZW50KSkgewogICAgICB2aXNpdEV4cHJlc3Npb24oYXJndW1lbnQpOwogICAgfSBlbHNlIGlmIChhcmd1bWVudCBpcyBIQ2hlY2sgJiYgIXZhcmlhYmxlTmFtZXMuaGFzTmFtZShhcmd1bWVudCkpIHsKICAgICAgSENoZWNrIGNoZWNrID0gYXJndW1lbnQ7CiAgICAgIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHRoZSBjaGVja2VkIG5vZGUgZG9lcyBub3QgaGF2ZSBhIG5hbWUuCiAgICAgIGFzc2VydCghdmFyaWFibGVOYW1lcy5oYXNOYW1lKGNoZWNrLmNoZWNrZWRJbnB1dCkpOwogICAgICB1c2UoY2hlY2suY2hlY2tlZElucHV0KTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydCh2YXJpYWJsZU5hbWVzLmhhc05hbWUoYXJndW1lbnQpKTsKICAgICAgcHVzaChuZXcganMuVmFyaWFibGVVc2UodmFyaWFibGVOYW1lcy5nZXROYW1lKGFyZ3VtZW50KSkpOwogICAgfQogIH0KCiAgdmlzaXQoSEluc3RydWN0aW9uIG5vZGUpIHsKICAgIG5vZGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgdmlzaXRFeHByZXNzaW9uKEhJbnN0cnVjdGlvbiBub2RlKSB7CiAgICBib29sIG9sZElzR2VuZXJhdGluZ0V4cHJlc3Npb24gPSBpc0dlbmVyYXRpbmdFeHByZXNzaW9uOwogICAgaXNHZW5lcmF0aW5nRXhwcmVzc2lvbiA9IHRydWU7CiAgICB2aXNpdChub2RlKTsKICAgIGlzR2VuZXJhdGluZ0V4cHJlc3Npb24gPSBvbGRJc0dlbmVyYXRpbmdFeHByZXNzaW9uOwogIH0KCiAgdmlzaXRTdGF0ZW1lbnQoSEluc3RydWN0aW9uIG5vZGUpIHsKICAgIGFzc2VydCghaXNHZW5lcmF0aW5nRXhwcmVzc2lvbik7CiAgICB2aXNpdChub2RlKTsKICAgIGlmICghZXhwcmVzc2lvblN0YWNrLmlzRW1wdHkpIHsKICAgICAgYXNzZXJ0KGV4cHJlc3Npb25TdGFjay5sZW5ndGggPT0gMSk7CiAgICAgIGpzLkV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBvcCgpOwogICAgICBwdXNoRXhwcmVzc2lvbkFzU3RhdGVtZW50KGV4cHJlc3Npb24sIG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogICAgfQogIH0KCiAgdm9pZCBjb250aW51ZUFzQnJlYWsoTGFiZWxEZWZpbml0aW9uIHRhcmdldCkgewogICAgcHVzaFN0YXRlbWVudChuZXcganMuQnJlYWsoX25hbWVyLmNvbnRpbnVlTGFiZWxOYW1lKHRhcmdldCkpKTsKICB9CgogIHZvaWQgaW1wbGljaXRDb250aW51ZUFzQnJlYWsoSnVtcFRhcmdldCB0YXJnZXQpIHsKICAgIHB1c2hTdGF0ZW1lbnQobmV3IGpzLkJyZWFrKF9uYW1lci5pbXBsaWNpdENvbnRpbnVlTGFiZWxOYW1lKHRhcmdldCkpKTsKICB9CgogIHZvaWQgaW1wbGljaXRCcmVha1dpdGhMYWJlbChKdW1wVGFyZ2V0IHRhcmdldCkgewogICAgcHVzaFN0YXRlbWVudChuZXcganMuQnJlYWsoX25hbWVyLmltcGxpY2l0QnJlYWtMYWJlbE5hbWUodGFyZ2V0KSkpOwogIH0KCiAganMuU3RhdGVtZW50IHdyYXBJbnRvTGFiZWxzKAogICAgICBqcy5TdGF0ZW1lbnQgcmVzdWx0LCBMaXN0PExhYmVsRGVmaW5pdGlvbj4gbGFiZWxzKSB7CiAgICBmb3IgKExhYmVsRGVmaW5pdGlvbiBsYWJlbCBpbiBsYWJlbHMpIHsKICAgICAgaWYgKGxhYmVsLmlzVGFyZ2V0KSB7CiAgICAgICAgU3RyaW5nIGJyZWFrTGFiZWxTdHJpbmcgPSBfbmFtZXIuYnJlYWtMYWJlbE5hbWUobGFiZWwpOwogICAgICAgIHJlc3VsdCA9IG5ldyBqcy5MYWJlbGVkU3RhdGVtZW50KGJyZWFrTGFiZWxTdHJpbmcsIHJlc3VsdCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLyBUaGUgcmVndWxhciBbdmlzaXRJZl0gbWV0aG9kIGltcGxlbWVudHMgdGhlIG5lZWRlZCBsb2dpYy4KICBAb3ZlcnJpZGUKICBib29sIHZpc2l0SWZJbmZvKEhJZkJsb2NrSW5mb3JtYXRpb24gaW5mbykgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRTd2l0Y2hJbmZvKEhTd2l0Y2hCbG9ja0luZm9ybWF0aW9uIGluZm8pIHsKICAgIGJvb2wgaXNFeHByZXNzaW9uID0gaXNKU0V4cHJlc3Npb24oaW5mby5leHByZXNzaW9uKTsKICAgIGlmICghaXNFeHByZXNzaW9uKSB7CiAgICAgIGdlbmVyYXRlU3RhdGVtZW50cyhpbmZvLmV4cHJlc3Npb24pOwogICAgfQoKICAgIGlmIChpc0V4cHJlc3Npb24pIHsKICAgICAgcHVzaChnZW5lcmF0ZUV4cHJlc3Npb24oaW5mby5leHByZXNzaW9uKSk7CiAgICB9IGVsc2UgewogICAgICB1c2UoaW5mby5leHByZXNzaW9uLmNvbmRpdGlvbkV4cHJlc3Npb24pOwogICAgfQogICAganMuRXhwcmVzc2lvbiBrZXkgPSBwb3AoKTsKICAgIGJvb2wgaGFuZGxlZERlZmF1bHQgPSBmYWxzZTsKICAgIExpc3Q8anMuU3dpdGNoQ2xhdXNlPiBjYXNlcyA9IDxqcy5Td2l0Y2hDbGF1c2U+W107CiAgICBIU3dpdGNoIHN3aXRjaEluc3RydWN0aW9uID0gaW5mby5leHByZXNzaW9uLmVuZC5sYXN0OwogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cyA9IHN3aXRjaEluc3RydWN0aW9uLmlucHV0czsKICAgIExpc3Q8SEJhc2ljQmxvY2s+IHN1Y2Nlc3NvcnMgPSBzd2l0Y2hJbnN0cnVjdGlvbi5ibG9jay5zdWNjZXNzb3JzOwoKICAgIGpzLkJsb2NrIG9sZENvbnRhaW5lciA9IGN1cnJlbnRDb250YWluZXI7CiAgICBmb3IgKGludCBpbnB1dEluZGV4ID0gMSwgc3RhdGVtZW50SW5kZXggPSAwOwogICAgICAgIGlucHV0SW5kZXggPCBpbnB1dHMubGVuZ3RoOwogICAgICAgIHN0YXRlbWVudEluZGV4KyspIHsKICAgICAgSEJhc2ljQmxvY2sgc3VjY2Vzc29yID0gc3VjY2Vzc29yc1tpbnB1dEluZGV4IC0gMV07CiAgICAgIC8vIElmIGxpdmVuZXNzIGFuYWx5c2lzIGhhcyBmaWd1cmVkIG91dCB0aGF0IHRoaXMgY2FzZSBpcyBkZWFkLAogICAgICAvLyBvbWl0IHRoZSBjb2RlIGZvciBpdC4KICAgICAgaWYgKHN1Y2Nlc3Nvci5pc0xpdmUpIHsKICAgICAgICBkbyB7CiAgICAgICAgICB2aXNpdChpbnB1dHNbaW5wdXRJbmRleF0pOwogICAgICAgICAgY3VycmVudENvbnRhaW5lciA9IG5ldyBqcy5CbG9jay5lbXB0eSgpOwogICAgICAgICAgY2FzZXMuYWRkKG5ldyBqcy5DYXNlKHBvcCgpLCBjdXJyZW50Q29udGFpbmVyKSk7CiAgICAgICAgICBpbnB1dEluZGV4Kys7CiAgICAgICAgfSB3aGlsZSAoKHN1Y2Nlc3NvcnNbaW5wdXRJbmRleCAtIDFdID09IHN1Y2Nlc3NvcikgJiYKICAgICAgICAgICAgKGlucHV0SW5kZXggPCBpbnB1dHMubGVuZ3RoKSk7CgogICAgICAgIC8vIElmIHRoaXMgaXMgdGhlIGxhc3Qgc3RhdGVtZW50LCB0aGVuIHRoZXNlIGNhc2VzIGFsc28gYmVsb25nIHRvIHRoZQogICAgICAgIC8vIGRlZmF1bHQgYmxvY2suCiAgICAgICAgaWYgKHN0YXRlbWVudEluZGV4ID09IGluZm8uc3RhdGVtZW50cy5sZW5ndGggLSAxKSB7CiAgICAgICAgICBjdXJyZW50Q29udGFpbmVyID0gbmV3IGpzLkJsb2NrLmVtcHR5KCk7CiAgICAgICAgICBjYXNlcy5hZGQobmV3IGpzLkRlZmF1bHQoY3VycmVudENvbnRhaW5lcikpOwogICAgICAgICAgaGFuZGxlZERlZmF1bHQgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgZ2VuZXJhdGVTdGF0ZW1lbnRzKGluZm8uc3RhdGVtZW50c1tzdGF0ZW1lbnRJbmRleF0pOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFNraXAgYWxsIHRoZSBjYXNlIHN0YXRlbWVudHMgdGhhdCBiZWxvbmcgdG8gdGhpcwogICAgICAgIC8vIGJsb2NrLgogICAgICAgIHdoaWxlICgoc3VjY2Vzc29yc1tpbnB1dEluZGV4IC0gMV0gPT0gc3VjY2Vzc29yKSAmJgogICAgICAgICAgICAoaW5wdXRJbmRleCA8IGlucHV0cy5sZW5ndGgpKSB7CiAgICAgICAgICArK2lucHV0SW5kZXg7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gSWYgdGhlIGRlZmF1bHQgY2FzZSBpcyBkZWFkLCB3ZSBvbWl0IGl0LiBMaWtld2lzZSwgaWYgaXQgaXMgYW4KICAgIC8vIGVtcHR5IGJsb2NrLCB3ZSBvbWl0IGl0LCB0b28uCiAgICBpZiAoaW5mby5zdGF0ZW1lbnRzLmxhc3Quc3RhcnQuaXNMaXZlICYmICFoYW5kbGVkRGVmYXVsdCkgewogICAgICBjdXJyZW50Q29udGFpbmVyID0gbmV3IGpzLkJsb2NrLmVtcHR5KCk7CiAgICAgIGdlbmVyYXRlU3RhdGVtZW50cyhpbmZvLnN0YXRlbWVudHMubGFzdCk7CiAgICAgIGlmIChjdXJyZW50Q29udGFpbmVyLnN0YXRlbWVudHMuaXNOb3RFbXB0eSkgewogICAgICAgIGNhc2VzLmFkZChuZXcganMuRGVmYXVsdChjdXJyZW50Q29udGFpbmVyKSk7CiAgICAgIH0KICAgIH0KCiAgICBjdXJyZW50Q29udGFpbmVyID0gb2xkQ29udGFpbmVyOwoKICAgIGpzLlN0YXRlbWVudCByZXN1bHQgPQogICAgICAgIG5ldyBqcy5Td2l0Y2goa2V5LCBjYXNlcykud2l0aFNvdXJjZUluZm9ybWF0aW9uKGluZm8uc291cmNlSW5mb3JtYXRpb24pOwogICAgcHVzaFN0YXRlbWVudCh3cmFwSW50b0xhYmVscyhyZXN1bHQsIGluZm8ubGFiZWxzKSk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRTZXF1ZW5jZUluZm8oSFN0YXRlbWVudFNlcXVlbmNlSW5mb3JtYXRpb24gaW5mbykgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFN1YkdyYXBoSW5mbyhIU3ViR3JhcGhCbG9ja0luZm9ybWF0aW9uIGluZm8pIHsKICAgIHZpc2l0U3ViR3JhcGgoaW5mby5zdWJHcmFwaCk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRTdWJFeHByZXNzaW9uSW5mbyhIU3ViRXhwcmVzc2lvbkJsb2NrSW5mb3JtYXRpb24gaW5mbykgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEFuZE9ySW5mbyhIQW5kT3JCbG9ja0luZm9ybWF0aW9uIGluZm8pIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRUcnlJbmZvKEhUcnlCbG9ja0luZm9ybWF0aW9uIGluZm8pIHsKICAgIGpzLkJsb2NrIGJvZHkgPSBnZW5lcmF0ZVN0YXRlbWVudHNJbk5ld0Jsb2NrKGluZm8uYm9keSk7CiAgICBqcy5DYXRjaCBjYXRjaFBhcnQgPSBudWxsOwogICAganMuQmxvY2sgZmluYWxseVBhcnQgPSBudWxsOwogICAgaWYgKGluZm8uY2F0Y2hCbG9jayAhPSBudWxsKSB7CiAgICAgIHZvaWQgcmVnaXN0ZXIoQ2xhc3NFbnRpdHkgY2xhc3NFbGVtZW50KSB7CiAgICAgICAgaWYgKGNsYXNzRWxlbWVudCAhPSBudWxsKSB7CiAgICAgICAgICBfcmVnaXN0cnkKICAgICAgICAgICAgICAvLyBpZ25vcmU6ZGVwcmVjYXRlZF9tZW1iZXJfdXNlX2Zyb21fc2FtZV9wYWNrYWdlCiAgICAgICAgICAgICAgLnJlZ2lzdGVySW5zdGFudGlhdGVkQ2xhc3MoY2xhc3NFbGVtZW50KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJlZ2lzdGVyKF9jb21tb25FbGVtZW50cy5qc1BsYWluSmF2YVNjcmlwdE9iamVjdENsYXNzKTsKICAgICAgcmVnaXN0ZXIoX2NvbW1vbkVsZW1lbnRzLmpzVW5rbm93bkphdmFTY3JpcHRPYmplY3RDbGFzcyk7CgogICAgICBITG9jYWxWYWx1ZSBleGNlcHRpb24gPSBpbmZvLmNhdGNoVmFyaWFibGU7CiAgICAgIFN0cmluZyBuYW1lID0gdmFyaWFibGVOYW1lcy5nZXROYW1lKGV4Y2VwdGlvbik7CiAgICAgIGpzLlZhcmlhYmxlRGVjbGFyYXRpb24gZGVjbCA9IG5ldyBqcy5WYXJpYWJsZURlY2xhcmF0aW9uKG5hbWUpOwogICAgICBqcy5CbG9jayBjYXRjaEJsb2NrID0gZ2VuZXJhdGVTdGF0ZW1lbnRzSW5OZXdCbG9jayhpbmZvLmNhdGNoQmxvY2spOwogICAgICBjYXRjaFBhcnQgPSBuZXcganMuQ2F0Y2goZGVjbCwgY2F0Y2hCbG9jayk7CiAgICB9CiAgICBpZiAoaW5mby5maW5hbGx5QmxvY2sgIT0gbnVsbCkgewogICAgICBmaW5hbGx5UGFydCA9IGdlbmVyYXRlU3RhdGVtZW50c0luTmV3QmxvY2soaW5mby5maW5hbGx5QmxvY2spOwogICAgfQogICAgcHVzaFN0YXRlbWVudChuZXcganMuVHJ5KGJvZHksIGNhdGNoUGFydCwgZmluYWxseVBhcnQpKTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgdm9pZCB2aXNpdEJvZHlJZ25vcmVMYWJlbHMoSExvb3BCbG9ja0luZm9ybWF0aW9uIGluZm8pIHsKICAgIGlmIChpbmZvLmJvZHkuc3RhcnQuaXNMYWJlbGVkQmxvY2soKSkgewogICAgICBIQmxvY2tJbmZvcm1hdGlvbiBvbGRJbmZvID0gY3VycmVudEJsb2NrSW5mb3JtYXRpb247CiAgICAgIGN1cnJlbnRCbG9ja0luZm9ybWF0aW9uID0gaW5mby5ib2R5LnN0YXJ0LmJsb2NrRmxvdy5ib2R5OwogICAgICBnZW5lcmF0ZVN0YXRlbWVudHMoaW5mby5ib2R5KTsKICAgICAgY3VycmVudEJsb2NrSW5mb3JtYXRpb24gPSBvbGRJbmZvOwogICAgfSBlbHNlIHsKICAgICAgZ2VuZXJhdGVTdGF0ZW1lbnRzKGluZm8uYm9keSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0TG9vcEluZm8oSExvb3BCbG9ja0luZm9ybWF0aW9uIGluZm8pIHsKICAgIEhFeHByZXNzaW9uSW5mb3JtYXRpb24gY29uZGl0aW9uID0gaW5mby5jb25kaXRpb247CiAgICBib29sIGlzQ29uZGl0aW9uRXhwcmVzc2lvbiA9IGlzSlNDb25kaXRpb24oY29uZGl0aW9uKTsKCiAgICBqcy5Mb29wIGxvb3A7CgogICAgc3dpdGNoIChpbmZvLmtpbmQpIHsKICAgICAgLy8gVHJlYXQgYWxsIHRocmVlICJ0ZXN0LWZpcnN0IiBsb29wcyB0aGUgc2FtZSB3YXkuCiAgICAgIGNhc2UgSExvb3BCbG9ja0luZm9ybWF0aW9uLkZPUl9MT09QOgogICAgICBjYXNlIEhMb29wQmxvY2tJbmZvcm1hdGlvbi5XSElMRV9MT09QOgogICAgICBjYXNlIEhMb29wQmxvY2tJbmZvcm1hdGlvbi5GT1JfSU5fTE9PUDoKICAgICAgY2FzZSBITG9vcEJsb2NrSW5mb3JtYXRpb24uU1dJVENIX0NPTlRJTlVFX0xPT1A6CiAgICAgICAgSEJsb2NrSW5mb3JtYXRpb24gaW5pdGlhbGl6YXRpb24gPSBpbmZvLmluaXRpYWxpemVyOwogICAgICAgIGludCBpbml0aWFsaXphdGlvblR5cGUgPSBUWVBFX1NUQVRFTUVOVDsKICAgICAgICBpZiAoaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkgewogICAgICAgICAgaW5pdGlhbGl6YXRpb25UeXBlID0gZXhwcmVzc2lvblR5cGUoaW5pdGlhbGl6YXRpb24pOwogICAgICAgICAgaWYgKGluaXRpYWxpemF0aW9uVHlwZSA9PSBUWVBFX1NUQVRFTUVOVCkgewogICAgICAgICAgICBnZW5lcmF0ZVN0YXRlbWVudHMoaW5pdGlhbGl6YXRpb24pOwogICAgICAgICAgICBpbml0aWFsaXphdGlvbiA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBXZSBpbnNlcnRlZCBhIGJhc2ljIGJsb2NrIHRvIGF2b2lkIGNyaXRpY2FsIGVkZ2VzLiBUaGlzIGJsb2NrIGlzCiAgICAgICAgLy8gcGFydCBvZiB0aGUgTG9vcEJsb2NrSW5mb3JtYXRpb24gYW5kIG11c3QgdGhlcmVmb3JlIGJlIGhhbmRsZWQgaGVyZS4KICAgICAgICBqcy5CbG9jayBvbGRDb250YWluZXIgPSBjdXJyZW50Q29udGFpbmVyOwogICAgICAgIGpzLkJsb2NrIGF2b2lkQ29udGFpbmVyID0gbmV3IGpzLkJsb2NrLmVtcHR5KCk7CiAgICAgICAgY3VycmVudENvbnRhaW5lciA9IGF2b2lkQ29udGFpbmVyOwogICAgICAgIGFzc2lnblBoaXNPZlN1Y2Nlc3NvcnMoY29uZGl0aW9uLmVuZC5zdWNjZXNzb3JzLmxhc3QpOwogICAgICAgIGJvb2wgaGFzUGhpVXBkYXRlcyA9ICFhdm9pZENvbnRhaW5lci5zdGF0ZW1lbnRzLmlzRW1wdHk7CiAgICAgICAgY3VycmVudENvbnRhaW5lciA9IG9sZENvbnRhaW5lcjsKCiAgICAgICAgaWYgKGlzQ29uZGl0aW9uRXhwcmVzc2lvbiAmJgogICAgICAgICAgICAhaGFzUGhpVXBkYXRlcyAmJgogICAgICAgICAgICBpbmZvLnVwZGF0ZXMgIT0gbnVsbCAmJgogICAgICAgICAgICBpc0pTRXhwcmVzc2lvbihpbmZvLnVwZGF0ZXMpKSB7CiAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIHVwZGF0ZXMgZ3JhcGgsIGFuZCBpdCdzIGV4cHJlc3NpYmxlIGFzIGFuCiAgICAgICAgICAvLyBleHByZXNzaW9uLCBnZW5lcmF0ZSBhIGZvci1sb29wLgogICAgICAgICAganMuRXhwcmVzc2lvbiBqc0luaXRpYWxpemF0aW9uID0gbnVsbDsKICAgICAgICAgIGlmIChpbml0aWFsaXphdGlvbiAhPSBudWxsKSB7CiAgICAgICAgICAgIGludCBkZWxheWVkVmFyaWFibGVzQ291bnQgPSBjb2xsZWN0ZWRWYXJpYWJsZURlY2xhcmF0aW9ucy5sZW5ndGg7CiAgICAgICAgICAgIGpzSW5pdGlhbGl6YXRpb24gPSBnZW5lcmF0ZUV4cHJlc3Npb24oaW5pdGlhbGl6YXRpb24pOwogICAgICAgICAgICBpZiAoIXNob3VsZEdyb3VwVmFyRGVjbGFyYXRpb25zICYmCiAgICAgICAgICAgICAgICBkZWxheWVkVmFyaWFibGVzQ291bnQgPCBjb2xsZWN0ZWRWYXJpYWJsZURlY2xhcmF0aW9ucy5sZW5ndGgpIHsKICAgICAgICAgICAgICAvLyBXZSBqdXN0IGFkZGVkIGEgbmV3IGRlbGF5ZWQgdmFyaWFibGUtZGVjbGFyYXRpb24uIFNlZSBpZiB3ZSBjYW4KICAgICAgICAgICAgICAvLyBwdXQgaW4gYSAndmFyJyBpbiBmcm9udCBvZiB0aGUgaW5pdGlhbGl6YXRpb24gdG8gbWFrZSBpdCBnbwogICAgICAgICAgICAgIC8vIGF3YXkuIFdlIHdhbGsgdGhlICd0cmVlJyBvZiBjb21tYS1vcGVyYXRvcnMgdG8gZmluZCB0aGUKICAgICAgICAgICAgICAvLyBleHByZXNzaW9ucyBhbmQgc2VlIGlmIHRoZXkgYXJlIGFsbCBhc3NpZ25tZW50cyB0aGF0IGNhbiBiZQogICAgICAgICAgICAgIC8vIGNvbnZlcnRlZCBpbnRvIGRlY2xhcmF0aW9ucy4KCiAgICAgICAgICAgICAgTGlzdDxqcy5Bc3NpZ25tZW50PiBhc3NpZ25tZW50czsKCiAgICAgICAgICAgICAgYm9vbCBhbGxTaW1wbGVBc3NpZ25tZW50cyhqcy5FeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKICAgICAgICAgICAgICAgIGlmIChleHByZXNzaW9uIGlzIGpzLkFzc2lnbm1lbnQpIHsKICAgICAgICAgICAgICAgICAganMuQXNzaWdubWVudCBhc3NpZ25tZW50ID0gZXhwcmVzc2lvbjsKICAgICAgICAgICAgICAgICAgaWYgKGFzc2lnbm1lbnQubGVmdEhhbmRTaWRlIGlzIGpzLlZhcmlhYmxlVXNlICYmCiAgICAgICAgICAgICAgICAgICAgICAhYXNzaWdubWVudC5pc0NvbXBvdW5kKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFzc2lnbm1lbnRzID09IG51bGwpIGFzc2lnbm1lbnRzID0gPGpzLkFzc2lnbm1lbnQ+W107CiAgICAgICAgICAgICAgICAgICAgYXNzaWdubWVudHMuYWRkKGV4cHJlc3Npb24pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24uaXNDb21tYU9wZXJhdG9yKSB7CiAgICAgICAgICAgICAgICAgIGpzLkJpbmFyeSBiaW5hcnkgPSBleHByZXNzaW9uOwogICAgICAgICAgICAgICAgICByZXR1cm4gYWxsU2ltcGxlQXNzaWdubWVudHMoYmluYXJ5LmxlZnQpICYmCiAgICAgICAgICAgICAgICAgICAgICBhbGxTaW1wbGVBc3NpZ25tZW50cyhiaW5hcnkucmlnaHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKGFsbFNpbXBsZUFzc2lnbm1lbnRzKGpzSW5pdGlhbGl6YXRpb24pKSB7CiAgICAgICAgICAgICAgICBMaXN0PGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24+IGluaXRzID0KICAgICAgICAgICAgICAgICAgICA8anMuVmFyaWFibGVJbml0aWFsaXphdGlvbj5bXTsKICAgICAgICAgICAgICAgIGZvciAoanMuQXNzaWdubWVudCBhc3NpZ25tZW50IGluIGFzc2lnbm1lbnRzKSB7CiAgICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IChhc3NpZ25tZW50LmxlZnRIYW5kU2lkZSBhcyBqcy5WYXJpYWJsZVVzZSkubmFtZTsKICAgICAgICAgICAgICAgICAganMuTm9kZSBkZWNsYXJhdGlvbiA9IG5ldyBqcy5WYXJpYWJsZURlY2xhcmF0aW9uKGlkKTsKICAgICAgICAgICAgICAgICAgaW5pdHMuYWRkKG5ldyBqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uKAogICAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb24sIGFzc2lnbm1lbnQudmFsdWUpKTsKICAgICAgICAgICAgICAgICAgY29sbGVjdGVkVmFyaWFibGVEZWNsYXJhdGlvbnMucmVtb3ZlKGlkKTsKICAgICAgICAgICAgICAgICAgZGVjbGFyZWRMb2NhbHMuYWRkKGlkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGpzSW5pdGlhbGl6YXRpb24gPSBuZXcganMuVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoaW5pdHMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAganMuRXhwcmVzc2lvbiBqc0NvbmRpdGlvbiA9IGdlbmVyYXRlRXhwcmVzc2lvbihjb25kaXRpb24pOwogICAgICAgICAganMuRXhwcmVzc2lvbiBqc1VwZGF0ZXMgPSBnZW5lcmF0ZUV4cHJlc3Npb24oaW5mby51cGRhdGVzKTsKICAgICAgICAgIC8vIFRoZSBib2R5IG1pZ2h0IGJlIGxhYmVsZWQuIElnbm9yZSB0aGlzIHdoZW4gcmVjdXJzaW5nIG9uIHRoZQogICAgICAgICAgLy8gc3ViZ3JhcGguCiAgICAgICAgICAvLyBUT0RPKGxybik6IFJlbW92ZSB0aGlzIGV4dHJhIGxhYmVsaW5nIHdoZW4gaGFuZGxpbmcgYWxsIGxvb3BzCiAgICAgICAgICAvLyB1c2luZyBzdWJncmFwaHMuCiAgICAgICAgICBvbGRDb250YWluZXIgPSBjdXJyZW50Q29udGFpbmVyOwogICAgICAgICAganMuU3RhdGVtZW50IGJvZHkgPSBuZXcganMuQmxvY2suZW1wdHkoKTsKICAgICAgICAgIGN1cnJlbnRDb250YWluZXIgPSBib2R5OwogICAgICAgICAgdmlzaXRCb2R5SWdub3JlTGFiZWxzKGluZm8pOwogICAgICAgICAgY3VycmVudENvbnRhaW5lciA9IG9sZENvbnRhaW5lcjsKICAgICAgICAgIGJvZHkgPSB1bndyYXBTdGF0ZW1lbnQoYm9keSk7CiAgICAgICAgICBsb29wID0gbmV3IGpzLkZvcihqc0luaXRpYWxpemF0aW9uLCBqc0NvbmRpdGlvbiwganNVcGRhdGVzLCBib2R5KQogICAgICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oaW5mby5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFdlIGhhdmUgZWl0aGVyIG5vIHVwZGF0ZSBncmFwaCwgb3IgaXQncyB0b28gY29tcGxleCB0bwogICAgICAgICAgLy8gcHV0IGluIGFuIGV4cHJlc3Npb24uCiAgICAgICAgICBpZiAoaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkgewogICAgICAgICAgICBnZW5lcmF0ZVN0YXRlbWVudHMoaW5pdGlhbGl6YXRpb24pOwogICAgICAgICAgfQogICAgICAgICAganMuRXhwcmVzc2lvbiBqc0NvbmRpdGlvbjsKICAgICAgICAgIGpzLkJsb2NrIG9sZENvbnRhaW5lciA9IGN1cnJlbnRDb250YWluZXI7CiAgICAgICAgICBqcy5TdGF0ZW1lbnQgYm9keSA9IG5ldyBqcy5CbG9jay5lbXB0eSgpOwogICAgICAgICAgaWYgKGlzQ29uZGl0aW9uRXhwcmVzc2lvbiAmJiAhaGFzUGhpVXBkYXRlcykgewogICAgICAgICAgICBqc0NvbmRpdGlvbiA9IGdlbmVyYXRlRXhwcmVzc2lvbihjb25kaXRpb24pOwogICAgICAgICAgICBjdXJyZW50Q29udGFpbmVyID0gYm9keTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGpzQ29uZGl0aW9uID0gbmV3TGl0ZXJhbEJvb2wodHJ1ZSwgaW5mby5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgICAgICAgIGN1cnJlbnRDb250YWluZXIgPSBib2R5OwogICAgICAgICAgICBnZW5lcmF0ZVN0YXRlbWVudHMoY29uZGl0aW9uKTsKICAgICAgICAgICAgdXNlKGNvbmRpdGlvbi5jb25kaXRpb25FeHByZXNzaW9uKTsKICAgICAgICAgICAganMuRXhwcmVzc2lvbiBpZlRlc3QgPSBuZXcganMuUHJlZml4KCIhIiwgcG9wKCkpOwogICAgICAgICAgICBqcy5TdGF0ZW1lbnQganNCcmVhayA9IG5ldyBqcy5CcmVhayhudWxsKTsKICAgICAgICAgICAganMuU3RhdGVtZW50IGV4aXRMb29wOwogICAgICAgICAgICBpZiAoYXZvaWRDb250YWluZXIuc3RhdGVtZW50cy5pc0VtcHR5KSB7CiAgICAgICAgICAgICAgZXhpdExvb3AgPSBqc0JyZWFrOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGF2b2lkQ29udGFpbmVyLnN0YXRlbWVudHMuYWRkKGpzQnJlYWspOwogICAgICAgICAgICAgIGV4aXRMb29wID0gYXZvaWRDb250YWluZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHVzaFN0YXRlbWVudChuZXcganMuSWYubm9FbHNlKGlmVGVzdCwgZXhpdExvb3ApKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpbmZvLnVwZGF0ZXMgIT0gbnVsbCkgewogICAgICAgICAgICB3cmFwTG9vcEJvZHlGb3JDb250aW51ZShpbmZvKTsKICAgICAgICAgICAgZ2VuZXJhdGVTdGF0ZW1lbnRzKGluZm8udXBkYXRlcyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2aXNpdEJvZHlJZ25vcmVMYWJlbHMoaW5mbyk7CiAgICAgICAgICB9CiAgICAgICAgICBjdXJyZW50Q29udGFpbmVyID0gb2xkQ29udGFpbmVyOwogICAgICAgICAgYm9keSA9IHVud3JhcFN0YXRlbWVudChib2R5KTsKICAgICAgICAgIGxvb3AgPSBuZXcganMuV2hpbGUoanNDb25kaXRpb24sIGJvZHkpCiAgICAgICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihpbmZvLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSExvb3BCbG9ja0luZm9ybWF0aW9uLkRPX1dISUxFX0xPT1A6CiAgICAgICAgaWYgKGluZm8uaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgZ2VuZXJhdGVTdGF0ZW1lbnRzKGluZm8uaW5pdGlhbGl6ZXIpOwogICAgICAgIH0KICAgICAgICAvLyBXZSBpbnNlcnRlZCBhIGJhc2ljIGJsb2NrIHRvIGF2b2lkIGNyaXRpY2FsIGVkZ2VzLiBUaGlzIGJsb2NrIGlzCiAgICAgICAgLy8gcGFydCBvZiB0aGUgTG9vcEJsb2NrSW5mb3JtYXRpb24gYW5kIG11c3QgdGhlcmVmb3JlIGJlIGhhbmRsZWQgaGVyZS4KICAgICAgICBqcy5CbG9jayBvbGRDb250YWluZXIgPSBjdXJyZW50Q29udGFpbmVyOwogICAgICAgIGpzLkJsb2NrIGV4aXRBdm9pZENvbnRhaW5lciA9IG5ldyBqcy5CbG9jay5lbXB0eSgpOwogICAgICAgIGN1cnJlbnRDb250YWluZXIgPSBleGl0QXZvaWRDb250YWluZXI7CiAgICAgICAgYXNzaWduUGhpc09mU3VjY2Vzc29ycyhjb25kaXRpb24uZW5kLnN1Y2Nlc3NvcnMubGFzdCk7CiAgICAgICAgYm9vbCBoYXNFeGl0UGhpVXBkYXRlcyA9ICFleGl0QXZvaWRDb250YWluZXIuc3RhdGVtZW50cy5pc0VtcHR5OwogICAgICAgIGN1cnJlbnRDb250YWluZXIgPSBvbGRDb250YWluZXI7CgogICAgICAgIG9sZENvbnRhaW5lciA9IGN1cnJlbnRDb250YWluZXI7CiAgICAgICAganMuQmxvY2sgYm9keSA9IG5ldyBqcy5CbG9jay5lbXB0eSgpOwogICAgICAgIC8vIElmIHRoZXJlIGFyZSBwaGkgY29waWVzIGluIHRoZSBibG9jayB0aGF0IGp1bXBzIHRvIHRoZQogICAgICAgIC8vIGxvb3AgZW50cnksIHdlIG11c3QgZW1pdCB0aGUgY29uZGl0aW9uIGxpa2UgdGhpczoKICAgICAgICAvLyBkbyB7CiAgICAgICAgLy8gICBib2R5OwogICAgICAgIC8vICAgaWYgKGNvbmRpdGlvbikgewogICAgICAgIC8vICAgICBwaGkgdXBkYXRlczsKICAgICAgICAvLyAgICAgY29udGludWU7CiAgICAgICAgLy8gICB9IGVsc2UgewogICAgICAgIC8vICAgICBicmVhazsKICAgICAgICAvLyAgIH0KICAgICAgICAvLyB9IHdoaWxlICh0cnVlKTsKICAgICAgICBIQmFzaWNCbG9jayBhdm9pZEVkZ2UgPSBpbmZvLmVuZC5zdWNjZXNzb3JzWzBdOwogICAgICAgIGpzLkJsb2NrIHVwZGF0ZUJvZHkgPSBuZXcganMuQmxvY2suZW1wdHkoKTsKICAgICAgICBjdXJyZW50Q29udGFpbmVyID0gdXBkYXRlQm9keTsKICAgICAgICBhc3NpZ25QaGlzT2ZTdWNjZXNzb3JzKGF2b2lkRWRnZSk7CiAgICAgICAgYm9vbCBoYXNQaGlVcGRhdGVzID0gIXVwZGF0ZUJvZHkuc3RhdGVtZW50cy5pc0VtcHR5OwogICAgICAgIGN1cnJlbnRDb250YWluZXIgPSBib2R5OwogICAgICAgIHZpc2l0Qm9keUlnbm9yZUxhYmVscyhpbmZvKTsKICAgICAgICBpZiAoaW5mby51cGRhdGVzICE9IG51bGwpIHsKICAgICAgICAgIGdlbmVyYXRlU3RhdGVtZW50cyhpbmZvLnVwZGF0ZXMpOwogICAgICAgIH0KICAgICAgICBpZiAoaXNDb25kaXRpb25FeHByZXNzaW9uKSB7CiAgICAgICAgICBwdXNoKGdlbmVyYXRlRXhwcmVzc2lvbihjb25kaXRpb24pKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZ2VuZXJhdGVTdGF0ZW1lbnRzKGNvbmRpdGlvbik7CiAgICAgICAgICB1c2UoY29uZGl0aW9uLmNvbmRpdGlvbkV4cHJlc3Npb24pOwogICAgICAgIH0KICAgICAgICBqcy5FeHByZXNzaW9uIGpzQ29uZGl0aW9uID0gcG9wKCk7CiAgICAgICAgaWYgKGpzQ29uZGl0aW9uID09IG51bGwpIHsKICAgICAgICAgIC8vIElmIHRoZSBjb25kaXRpb24gaXMgZGVhZCBjb2RlLCB3ZSB0dXJuIHRoZSBkby13aGlsZSBpbnRvCiAgICAgICAgICAvLyBhIHNpbXBsZXIgd2hpbGUgYmVjYXVzZSB3ZSB3aWxsIG5ldmVyIHJlYWNoIHRoZSBjb25kaXRpb24KICAgICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGxvb3AgYW55d2F5LgogICAgICAgICAgbG9vcCA9IG5ldyBqcy5XaGlsZShuZXdMaXRlcmFsQm9vbCh0cnVlLCBpbmZvLnNvdXJjZUluZm9ybWF0aW9uKSwKICAgICAgICAgICAgICAgICAgdW53cmFwU3RhdGVtZW50KGJvZHkpKQogICAgICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oaW5mby5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChoYXNQaGlVcGRhdGVzIHx8IGhhc0V4aXRQaGlVcGRhdGVzKSB7CiAgICAgICAgICAgIHVwZGF0ZUJvZHkuc3RhdGVtZW50cy5hZGQobmV3IGpzLkNvbnRpbnVlKG51bGwpKTsKICAgICAgICAgICAganMuU3RhdGVtZW50IGpzQnJlYWsgPSBuZXcganMuQnJlYWsobnVsbCk7CiAgICAgICAgICAgIGpzLlN0YXRlbWVudCBleGl0TG9vcDsKICAgICAgICAgICAgaWYgKGV4aXRBdm9pZENvbnRhaW5lci5zdGF0ZW1lbnRzLmlzRW1wdHkpIHsKICAgICAgICAgICAgICBleGl0TG9vcCA9IGpzQnJlYWs7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZXhpdEF2b2lkQ29udGFpbmVyLnN0YXRlbWVudHMuYWRkKGpzQnJlYWspOwogICAgICAgICAgICAgIGV4aXRMb29wID0gZXhpdEF2b2lkQ29udGFpbmVyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJvZHkuc3RhdGVtZW50cy5hZGQobmV3IGpzLklmKGpzQ29uZGl0aW9uLCB1cGRhdGVCb2R5LCBleGl0TG9vcCkpOwogICAgICAgICAgICBqc0NvbmRpdGlvbiA9IG5ld0xpdGVyYWxCb29sKHRydWUsIGluZm8uc291cmNlSW5mb3JtYXRpb24pOwogICAgICAgICAgfQogICAgICAgICAgbG9vcCA9IG5ldyBqcy5Ebyh1bndyYXBTdGF0ZW1lbnQoYm9keSksIGpzQ29uZGl0aW9uKQogICAgICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oaW5mby5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgICAgfQogICAgICAgIGN1cnJlbnRDb250YWluZXIgPSBvbGRDb250YWluZXI7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgZmFpbGVkQXQoY29uZGl0aW9uLmNvbmRpdGlvbkV4cHJlc3Npb24sCiAgICAgICAgICAgICdVbmV4cGVjdGVkIGxvb3Aga2luZDogJHtpbmZvLmtpbmR9LicpOwogICAgfQogICAganMuU3RhdGVtZW50IHJlc3VsdCA9IGxvb3A7CiAgICBpZiAoaW5mby5raW5kID09IEhMb29wQmxvY2tJbmZvcm1hdGlvbi5TV0lUQ0hfQ09OVElOVUVfTE9PUCkgewogICAgICBTdHJpbmcgY29udGludWVMYWJlbFN0cmluZyA9CiAgICAgICAgICBfbmFtZXIuaW1wbGljaXRDb250aW51ZUxhYmVsTmFtZShpbmZvLnRhcmdldCk7CiAgICAgIHJlc3VsdCA9IG5ldyBqcy5MYWJlbGVkU3RhdGVtZW50KGNvbnRpbnVlTGFiZWxTdHJpbmcsIHJlc3VsdCk7CiAgICB9CiAgICBwdXNoU3RhdGVtZW50KHdyYXBJbnRvTGFiZWxzKHJlc3VsdCwgaW5mby5sYWJlbHMpKTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdExhYmVsZWRCbG9ja0luZm8oSExhYmVsZWRCbG9ja0luZm9ybWF0aW9uIGxhYmVsZWRCbG9ja0luZm8pIHsKICAgIExpbms8RW50aXR5PiBjb250aW51ZU92ZXJyaWRlcyA9IGNvbnN0IExpbms8RW50aXR5PigpOwoKICAgIGpzLkJsb2NrIG9sZENvbnRhaW5lciA9IGN1cnJlbnRDb250YWluZXI7CiAgICBqcy5CbG9jayBib2R5ID0gbmV3IGpzLkJsb2NrLmVtcHR5KCk7CiAgICBqcy5TdGF0ZW1lbnQgcmVzdWx0ID0gYm9keTsKCiAgICBjdXJyZW50Q29udGFpbmVyID0gYm9keTsKCiAgICAvLyBJZiBbbGFiZWxlZEJsb2NrSW5mby5pc0NvbnRpbnVlXSwgdGhlIGJsb2NrIGlzIGFuIGFydGlmaWNpYWwKICAgIC8vIGJsb2NrIGFyb3VuZCB0aGUgYm9keSBvZiBhIGxvb3Agd2l0aCBhbiB1cGRhdGUgYmxvY2ssIHNvIHRoYXQKICAgIC8vIGNvbnRpbnVlcyBvZiB0aGUgbG9vcCBjYW4gYmUgd3JpdHRlbiBhcyBicmVha3Mgb2YgdGhlIGJvZHkKICAgIC8vIGJsb2NrLgogICAgaWYgKGxhYmVsZWRCbG9ja0luZm8uaXNDb250aW51ZSkgewogICAgICBmb3IgKExhYmVsRGVmaW5pdGlvbiBsYWJlbCBpbiBsYWJlbGVkQmxvY2tJbmZvLmxhYmVscykgewogICAgICAgIGlmIChsYWJlbC5pc0NvbnRpbnVlVGFyZ2V0KSB7CiAgICAgICAgICBTdHJpbmcgbGFiZWxOYW1lID0gX25hbWVyLmNvbnRpbnVlTGFiZWxOYW1lKGxhYmVsKTsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBqcy5MYWJlbGVkU3RhdGVtZW50KGxhYmVsTmFtZSwgcmVzdWx0KTsKICAgICAgICAgIGNvbnRpbnVlQWN0aW9uLmFkZChsYWJlbCk7CiAgICAgICAgICBjb250aW51ZU92ZXJyaWRlcyA9IGNvbnRpbnVlT3ZlcnJpZGVzLnByZXBlbmQobGFiZWwpOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBGb3IgaGFuZGxpbmcgdW5sYWJlbGVkIGNvbnRpbnVlcyBmcm9tIHRoZSBib2R5IG9mIGEgbG9vcC4KICAgICAgLy8gVE9ETyhscm4pOiBDb25zaWRlciByZWNvcmRpbmcgd2hldGhlciB0aGUgdGFyZ2V0IGlzIGluIGZhY3QKICAgICAgLy8gYSB0YXJnZXQgb2YgYW4gdW5sYWJlbGVkIGNvbnRpbnVlLCBhbmQgbm90IGdlbmVyYXRlIHRoaXMgaWYgaXQgaXNuJ3QuCiAgICAgIEp1bXBUYXJnZXQgdGFyZ2V0ID0gbGFiZWxlZEJsb2NrSW5mby50YXJnZXQ7CiAgICAgIFN0cmluZyBsYWJlbE5hbWUgPSBfbmFtZXIuaW1wbGljaXRDb250aW51ZUxhYmVsTmFtZSh0YXJnZXQpOwogICAgICByZXN1bHQgPSBuZXcganMuTGFiZWxlZFN0YXRlbWVudChsYWJlbE5hbWUsIHJlc3VsdCk7CiAgICAgIGltcGxpY2l0Q29udGludWVBY3Rpb24uYWRkKHRhcmdldCk7CiAgICAgIGNvbnRpbnVlT3ZlcnJpZGVzID0gY29udGludWVPdmVycmlkZXMucHJlcGVuZCh0YXJnZXQpOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChMYWJlbERlZmluaXRpb24gbGFiZWwgaW4gbGFiZWxlZEJsb2NrSW5mby5sYWJlbHMpIHsKICAgICAgICBpZiAobGFiZWwuaXNCcmVha1RhcmdldCkgewogICAgICAgICAgU3RyaW5nIGxhYmVsTmFtZSA9IF9uYW1lci5icmVha0xhYmVsTmFtZShsYWJlbCk7CiAgICAgICAgICByZXN1bHQgPSBuZXcganMuTGFiZWxlZFN0YXRlbWVudChsYWJlbE5hbWUsIHJlc3VsdCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBKdW1wVGFyZ2V0IHRhcmdldCA9IGxhYmVsZWRCbG9ja0luZm8udGFyZ2V0OwogICAgaWYgKHRhcmdldC5pc1N3aXRjaCkgewogICAgICAvLyBUaGlzIGlzIGFuIGV4dHJhIGJsb2NrIGFyb3VuZCBhIHN3aXRjaCB0aGF0IGlzIGdlbmVyYXRlZAogICAgICAvLyBhcyBhIG5lc3RlZCBpZi9lbHNlIGNoYWluLiBXZSBhZGQgYW4gZXh0cmEgYnJlYWsgdGFyZ2V0CiAgICAgIC8vIHNvIHRoYXQgY2FzZSBjb2RlIGNhbiBicmVhay4KICAgICAgU3RyaW5nIGxhYmVsTmFtZSA9IF9uYW1lci5pbXBsaWNpdEJyZWFrTGFiZWxOYW1lKHRhcmdldCk7CiAgICAgIHJlc3VsdCA9IG5ldyBqcy5MYWJlbGVkU3RhdGVtZW50KGxhYmVsTmFtZSwgcmVzdWx0KTsKICAgICAgYnJlYWtBY3Rpb24uYWRkKHRhcmdldCk7CiAgICB9CgogICAgY3VycmVudENvbnRhaW5lciA9IGJvZHk7CiAgICBnZW5lcmF0ZVN0YXRlbWVudHMobGFiZWxlZEJsb2NrSW5mby5ib2R5KTsKCiAgICBpZiAobGFiZWxlZEJsb2NrSW5mby5pc0NvbnRpbnVlKSB7CiAgICAgIHdoaWxlICghY29udGludWVPdmVycmlkZXMuaXNFbXB0eSkgewogICAgICAgIGNvbnRpbnVlQWN0aW9uLnJlbW92ZShjb250aW51ZU92ZXJyaWRlcy5oZWFkKTsKICAgICAgICBpbXBsaWNpdENvbnRpbnVlQWN0aW9uLnJlbW92ZShjb250aW51ZU92ZXJyaWRlcy5oZWFkKTsKICAgICAgICBjb250aW51ZU92ZXJyaWRlcyA9IGNvbnRpbnVlT3ZlcnJpZGVzLnRhaWw7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGJyZWFrQWN0aW9uLnJlbW92ZShsYWJlbGVkQmxvY2tJbmZvLnRhcmdldCk7CiAgICB9CgogICAgY3VycmVudENvbnRhaW5lciA9IG9sZENvbnRhaW5lcjsKICAgIHB1c2hTdGF0ZW1lbnQocmVzdWx0KTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgLy8gV3JhcHMgYSBsb29wIGJvZHkgaW4gYSBibG9jayB0byBtYWtlIGNvbnRpbnVlcyBoYXZlIGEgdGFyZ2V0IHRvIGJyZWFrCiAgLy8gdG8gKGlmIG5lY2Vzc2FyeSkuCiAgdm9pZCB3cmFwTG9vcEJvZHlGb3JDb250aW51ZShITG9vcEJsb2NrSW5mb3JtYXRpb24gaW5mbykgewogICAgSnVtcFRhcmdldCB0YXJnZXQgPSBpbmZvLnRhcmdldDsKICAgIGlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQuaXNDb250aW51ZVRhcmdldCkgewogICAgICBqcy5CbG9jayBvbGRDb250YWluZXIgPSBjdXJyZW50Q29udGFpbmVyOwogICAgICBqcy5CbG9jayBib2R5ID0gbmV3IGpzLkJsb2NrLmVtcHR5KCk7CiAgICAgIGN1cnJlbnRDb250YWluZXIgPSBib2R5OwogICAgICBqcy5TdGF0ZW1lbnQgcmVzdWx0ID0gYm9keTsKICAgICAgZm9yIChMYWJlbERlZmluaXRpb24gbGFiZWwgaW4gaW5mby5sYWJlbHMpIHsKICAgICAgICBpZiAobGFiZWwuaXNDb250aW51ZVRhcmdldCkgewogICAgICAgICAgU3RyaW5nIGxhYmVsTmFtZSA9IF9uYW1lci5jb250aW51ZUxhYmVsTmFtZShsYWJlbCk7CiAgICAgICAgICByZXN1bHQgPSBuZXcganMuTGFiZWxlZFN0YXRlbWVudChsYWJlbE5hbWUsIHJlc3VsdCk7CiAgICAgICAgICBjb250aW51ZUFjdGlvbi5hZGQobGFiZWwpOwogICAgICAgIH0KICAgICAgfQogICAgICBTdHJpbmcgbGFiZWxOYW1lID0gX25hbWVyLmltcGxpY2l0Q29udGludWVMYWJlbE5hbWUodGFyZ2V0KTsKICAgICAgcmVzdWx0ID0gbmV3IGpzLkxhYmVsZWRTdGF0ZW1lbnQobGFiZWxOYW1lLCByZXN1bHQpOwogICAgICBpbXBsaWNpdENvbnRpbnVlQWN0aW9uLmFkZChpbmZvLnRhcmdldCk7CiAgICAgIHZpc2l0Qm9keUlnbm9yZUxhYmVscyhpbmZvKTsKICAgICAgaW1wbGljaXRDb250aW51ZUFjdGlvbi5yZW1vdmUoaW5mby50YXJnZXQpOwogICAgICBmb3IgKExhYmVsRGVmaW5pdGlvbiBsYWJlbCBpbiBpbmZvLmxhYmVscykgewogICAgICAgIGlmIChsYWJlbC5pc0NvbnRpbnVlVGFyZ2V0KSB7CiAgICAgICAgICBjb250aW51ZUFjdGlvbi5yZW1vdmUobGFiZWwpOwogICAgICAgIH0KICAgICAgfQogICAgICBjdXJyZW50Q29udGFpbmVyID0gb2xkQ29udGFpbmVyOwogICAgICBwdXNoU3RhdGVtZW50KHJlc3VsdCk7CiAgICB9IGVsc2UgewogICAgICAvLyBMb29wIGJvZHkgY29udGFpbnMgbm8gY29udGludWVzLCBzbyB3ZSBkb24ndCBuZWVkIGEgYnJlYWsgdGFyZ2V0LgogICAgICBnZW5lcmF0ZVN0YXRlbWVudHMoaW5mby5ib2R5KTsKICAgIH0KICB9CgogIGJvb2wgaGFuZGxlQmxvY2tGbG93KEhCbG9ja0Zsb3cgYmxvY2spIHsKICAgIEhCbG9ja0luZm9ybWF0aW9uIGluZm8gPSBibG9jay5ib2R5OwogICAgLy8gSWYgd2UgcmVhY2ggaGVyZSBhZ2FpbiB3aGlsZSBoYW5kbGluZyB0aGUgYXR0YWNoZWQgaW5mb3JtYXRpb24sCiAgICAvLyBlLmcuLCBiZWNhdXNlIHdlIGNhbGwgdmlzaXRTdWJHcmFwaCBvbiBhIHN1YmdyYXBoIHN0YXJ0aW5nIG9uCiAgICAvLyB0aGUgc2FtZSBibG9jaywgZG9uJ3QgaGFuZGxlIGl0IGFnYWluLgogICAgLy8gV2hlbiB0aGUgc3RydWN0dXJlIGdyYXBoIGlzIGNvbXBsZXRlLCB3ZSB3aWxsIGJlIGFibGUgdG8gaGF2ZQogICAgLy8gZGlmZmVyZW50IHN0cnVjdHVyZXMgc3RhcnRpbmcgb24gdGhlIHNhbWUgYmFzaWMgYmxvY2sgKGUuZy4sIGFuCiAgICAvLyAiaWYiIGFuZCBpdHMgY29uZGl0aW9uKS4KICAgIGlmIChpZGVudGljYWwoaW5mbywgY3VycmVudEJsb2NrSW5mb3JtYXRpb24pKSByZXR1cm4gZmFsc2U7CgogICAgSEJsb2NrSW5mb3JtYXRpb24gb2xkQmxvY2tJbmZvcm1hdGlvbiA9IGN1cnJlbnRCbG9ja0luZm9ybWF0aW9uOwogICAgY3VycmVudEJsb2NrSW5mb3JtYXRpb24gPSBpbmZvOwogICAgYm9vbCBzdWNjZXNzID0gaW5mby5hY2NlcHQodGhpcyk7CiAgICBjdXJyZW50QmxvY2tJbmZvcm1hdGlvbiA9IG9sZEJsb2NrSW5mb3JtYXRpb247CgogICAgaWYgKHN1Y2Nlc3MpIHsKICAgICAgSEJhc2ljQmxvY2sgY29udGludWF0aW9uID0gYmxvY2suY29udGludWF0aW9uOwogICAgICBpZiAoY29udGludWF0aW9uICE9IG51bGwpIHsKICAgICAgICBjb250aW51ZVN1YkdyYXBoKGNvbnRpbnVhdGlvbik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzdWNjZXNzOwogIH0KCiAgdm9pZCBlbnRlclN1YkdyYXBoKEhCYXNpY0Jsb2NrIG5vZGUpIHsKICAgIGFzc2VydChibG9ja1F1ZXVlLmlzRW1wdHkpOwogICAgYXNzZXJ0KG5vZGUgIT0gbnVsbCk7CiAgICBjb250aW51ZVN1YkdyYXBoKG5vZGUpOwogICAgd2hpbGUgKGJsb2NrUXVldWUuaXNOb3RFbXB0eSkgewogICAgICBub2RlID0gYmxvY2tRdWV1ZS5yZW1vdmVGaXJzdCgpOwogICAgICBhc3NlcnQobm9kZS5pc0xpdmUpOwogICAgICBhc3NlcnQoc3ViR3JhcGguY29udGFpbnMobm9kZSkpOwoKICAgICAgLy8gSWYgdGhpcyBub2RlIGhhcyBibG9jay1zdHJ1Y3R1cmUgYmFzZWQgaW5mb3JtYXRpb24gYXR0YWNoZWQsCiAgICAgIC8vIHRyeSB1c2luZyB0aGF0IHRvIHRyYXZlcnNlIGZyb20gaGVyZS4KICAgICAgaWYgKG5vZGUuYmxvY2tGbG93ICE9IG51bGwgJiYgaGFuZGxlQmxvY2tGbG93KG5vZGUuYmxvY2tGbG93KSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICBpdGVyYXRlQmFzaWNCbG9jayhub2RlKTsKICAgIH0KICB9CgogIHZvaWQgY29udGludWVTdWJHcmFwaChIQmFzaWNCbG9jayBub2RlKSB7CiAgICBpZiAoIW5vZGUuaXNMaXZlKSByZXR1cm47CiAgICAvLyBEb24ndCBmb2xsb3cgZWRnZXMgb3V0IG9mIHRoZSBjdXJyZW50IHN1Yi1ncmFwaC4KICAgIGlmICghc3ViR3JhcGguY29udGFpbnMobm9kZSkpIHJldHVybjsKICAgIGJsb2NrUXVldWUuYWRkKG5vZGUpOwogIH0KCiAgdm9pZCBlbWl0QXNzaWdubWVudCgKICAgICAgU3RyaW5nIGRlc3RpbmF0aW9uLCBTdHJpbmcgc291cmNlLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgYXNzaWduVmFyaWFibGUoZGVzdGluYXRpb24sIG5ldyBqcy5WYXJpYWJsZVVzZShzb3VyY2UpLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICAvLy8gU2VxdWVudGlhbGl6ZSBhIGxpc3Qgb2YgY29uY2VwdHVhbGx5IHBhcmFsbGVsIGNvcGllcy4gUGFyYWxsZWwKICAvLy8gY29waWVzIG1heSBjb250YWluIGN5Y2xlcywgdGhhdCB0aGlzIG1ldGhvZCBicmVha3MuCiAgdm9pZCBzZXF1ZW50aWFsaXplQ29waWVzKAogICAgICBJdGVyYWJsZTxDb3B5PEhJbnN0cnVjdGlvbj4+IGluc3RydWN0aW9uQ29waWVzLAogICAgICBTdHJpbmcgdGVtcE5hbWUsCiAgICAgIHZvaWQgZG9Bc3NpZ25tZW50KAogICAgICAgICAgU3RyaW5nIHRhcmdldCwgU3RyaW5nIHNvdXJjZSwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pKSB7CiAgICBNYXA8U3RyaW5nLCBTb3VyY2VJbmZvcm1hdGlvbj4gc291cmNlSW5mb3JtYXRpb25NYXAgPQogICAgICAgIDxTdHJpbmcsIFNvdXJjZUluZm9ybWF0aW9uPnt9OwoKICAgIC8vIE1hcCB0aGUgaW5zdHJ1Y3Rpb25zIHRvIHN0cmluZ3MuCiAgICBJdGVyYWJsZTxDb3B5PFN0cmluZz4+IGNvcGllcyA9CiAgICAgICAgaW5zdHJ1Y3Rpb25Db3BpZXMubWFwKChDb3B5PEhJbnN0cnVjdGlvbj4gY29weSkgewogICAgICBTdHJpbmcgc291cmNlTmFtZSA9IHZhcmlhYmxlTmFtZXMuZ2V0TmFtZShjb3B5LnNvdXJjZSk7CiAgICAgIHNvdXJjZUluZm9ybWF0aW9uTWFwW3NvdXJjZU5hbWVdID0gY29weS5zb3VyY2Uuc291cmNlSW5mb3JtYXRpb247CiAgICAgIFN0cmluZyBkZXN0aW5hdGlvbk5hbWUgPSB2YXJpYWJsZU5hbWVzLmdldE5hbWUoY29weS5kZXN0aW5hdGlvbik7CiAgICAgIHNvdXJjZUluZm9ybWF0aW9uTWFwW3NvdXJjZU5hbWVdID0gY29weS5kZXN0aW5hdGlvbi5zb3VyY2VJbmZvcm1hdGlvbjsKICAgICAgcmV0dXJuIG5ldyBDb3B5PFN0cmluZz4oc291cmNlTmFtZSwgZGVzdGluYXRpb25OYW1lKTsKICAgIH0pOwoKICAgIC8vIE1hcCB0byBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIChpZSB0aGUgdmFyaWFibGUgdGhhdAogICAgLy8gaG9sZHMgdGhlIGluaXRpYWwgdmFsdWUpIG9mIGEgdmFyaWFibGUuCiAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGN1cnJlbnRMb2NhdGlvbiA9IG5ldyBNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CgogICAgLy8gTWFwIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGluaXRpYWwgdmFsdWUgb2YgYSB2YXJpYWJsZS4KICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gaW5pdGlhbFZhbHVlID0gbmV3IE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKCiAgICAvLyBMaXN0IG9mIHZhcmlhYmxlcyB0byBhc3NpZ24gYSB2YWx1ZS4KICAgIExpc3Q8U3RyaW5nPiB3b3JrbGlzdCA9IDxTdHJpbmc+W107CgogICAgLy8gTGlzdCBvZiB2YXJpYWJsZXMgdGhhdCB3ZSBjYW4gYXNzaWduIGEgdmFsdWUgdG8gKGllIGFyZSBub3QKICAgIC8vIGJlaW5nIHVzZWQgYW55bW9yZSkuCiAgICBMaXN0PFN0cmluZz4gcmVhZHkgPSA8U3RyaW5nPltdOwoKICAgIC8vIFBydW5lIFtjb3BpZXNdIGJ5IHJlbW92aW5nIHNlbGYtY29waWVzLgogICAgTGlzdDxDb3B5PFN0cmluZz4+IHBydW5lZENvcGllcyA9IDxDb3B5PFN0cmluZz4+W107CiAgICBmb3IgKENvcHk8U3RyaW5nPiBjb3B5IGluIGNvcGllcykgewogICAgICBpZiAoY29weS5zb3VyY2UgIT0gY29weS5kZXN0aW5hdGlvbikgewogICAgICAgIHBydW5lZENvcGllcy5hZGQoY29weSk7CiAgICAgIH0KICAgIH0KICAgIGNvcGllcyA9IHBydW5lZENvcGllczsKCiAgICAvLyBGb3IgZWFjaCBjb3B5LCBzZXQgdGhlIGN1cnJlbnQgbG9jYXRpb24gb2YgdGhlIHNvdXJjZSB0bwogICAgLy8gaXRzZWxmLCBhbmQgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIGRlc3RpbmF0aW9uIHRvIHRoZSBzb3VyY2UuCiAgICAvLyBBZGQgdGhlIGRlc3RpbmF0aW9uIHRvIHRoZSBsaXN0IG9mIGNvcGllcyB0byBtYWtlLgogICAgZm9yIChDb3B5PFN0cmluZz4gY29weSBpbiBjb3BpZXMpIHsKICAgICAgY3VycmVudExvY2F0aW9uW2NvcHkuc291cmNlXSA9IGNvcHkuc291cmNlOwogICAgICBpbml0aWFsVmFsdWVbY29weS5kZXN0aW5hdGlvbl0gPSBjb3B5LnNvdXJjZTsKICAgICAgd29ya2xpc3QuYWRkKGNvcHkuZGVzdGluYXRpb24pOwogICAgfQoKICAgIC8vIEZvciBlYWNoIGNvcHksIGlmIHRoZSBkZXN0aW5hdGlvbiBkb2VzIG5vdCBoYXZlIGEgY3VycmVudAogICAgLy8gbG9jYXRpb24sIHRoZW4gd2UgY2FuIHNhZmVseSBhc3NpZ24gdG8gaXQuCiAgICBmb3IgKENvcHk8U3RyaW5nPiBjb3B5IGluIGNvcGllcykgewogICAgICBpZiAoY3VycmVudExvY2F0aW9uW2NvcHkuZGVzdGluYXRpb25dID09IG51bGwpIHsKICAgICAgICByZWFkeS5hZGQoY29weS5kZXN0aW5hdGlvbik7CiAgICAgIH0KICAgIH0KCiAgICB3aGlsZSAoIXdvcmtsaXN0LmlzRW1wdHkpIHsKICAgICAgd2hpbGUgKCFyZWFkeS5pc0VtcHR5KSB7CiAgICAgICAgU3RyaW5nIGRlc3RpbmF0aW9uID0gcmVhZHkucmVtb3ZlTGFzdCgpOwogICAgICAgIFN0cmluZyBzb3VyY2UgPSBpbml0aWFsVmFsdWVbZGVzdGluYXRpb25dOwogICAgICAgIC8vIFNpbmNlIFtzb3VyY2VdIG1pZ2h0IGhhdmUgYmVlbiB1cGRhdGVkLCB1c2UgdGhlIGN1cnJlbnQKICAgICAgICAvLyBsb2NhdGlvbiBvZiBbc291cmNlXQogICAgICAgIFN0cmluZyBjb3B5ID0gY3VycmVudExvY2F0aW9uW3NvdXJjZV07CiAgICAgICAgZG9Bc3NpZ25tZW50KGRlc3RpbmF0aW9uLCBjb3B5LAogICAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbk1hcFtjb3B5XSA/PyBzb3VyY2VJbmZvcm1hdGlvbk1hcFtkZXN0aW5hdGlvbl0pOwogICAgICAgIC8vIE5vdyBbZGVzdGluYXRpb25dIGlzIHRoZSBjdXJyZW50IGxvY2F0aW9uIG9mIFtzb3VyY2VdLgogICAgICAgIGN1cnJlbnRMb2NhdGlvbltzb3VyY2VdID0gZGVzdGluYXRpb247CiAgICAgICAgLy8gSWYgW3NvdXJjZV0gaGFzbid0IGJlZW4gdXBkYXRlZCBhbmQgbmVlZHMgdG8gaGF2ZSBhIHZhbHVlLAogICAgICAgIC8vIGFkZCBpdCB0byB0aGUgbGlzdCBvZiB2YXJpYWJsZXMgdGhhdCBjYW4gYmUgdXBkYXRlZC4gQ29waWVzCiAgICAgICAgLy8gb2YgW3NvdXJjZV0gd2lsbCBub3cgdXNlIFtkZXN0aW5hdGlvbl0uCiAgICAgICAgaWYgKHNvdXJjZSA9PSBjb3B5ICYmIGluaXRpYWxWYWx1ZVtzb3VyY2VdICE9IG51bGwpIHsKICAgICAgICAgIHJlYWR5LmFkZChzb3VyY2UpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIGN5Y2xlLgogICAgICBTdHJpbmcgY3VycmVudCA9IHdvcmtsaXN0LnJlbW92ZUxhc3QoKTsKICAgICAgLy8gSWYgW2N1cnJlbnRdIGlzIHVzZWQgYXMgYSBzb3VyY2UsIGFuZCB0aGUgYXNzaWdubWVudCBoYXMgYmVlbgogICAgICAvLyBkb25lLCB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgdmFyaWFibGUuIE90aGVyd2lzZSB0aGVyZSBpcyBhCiAgICAgIC8vIGN5Y2xlIHRoYXQgd2UgYnJlYWsgYnkgdXNpbmcgYSB0ZW1wb3JhcnkgbmFtZS4KICAgICAgaWYgKGN1cnJlbnRMb2NhdGlvbltjdXJyZW50XSAhPSBudWxsICYmCiAgICAgICAgICBjdXJyZW50ICE9IGN1cnJlbnRMb2NhdGlvbltpbml0aWFsVmFsdWVbY3VycmVudF1dKSB7CiAgICAgICAgZG9Bc3NpZ25tZW50KHRlbXBOYW1lLCBjdXJyZW50LCBzb3VyY2VJbmZvcm1hdGlvbk1hcFtjdXJyZW50XSk7CiAgICAgICAgY3VycmVudExvY2F0aW9uW2N1cnJlbnRdID0gdGVtcE5hbWU7CiAgICAgICAgLy8gW2N1cnJlbnRdIGNhbiBub3cgYmUgc2FmZWx5IHVwZGF0ZWQuIENvcGllcyBvZiBbY3VycmVudF0KICAgICAgICAvLyB3aWxsIG5vdyB1c2UgW3RlbXBOYW1lXS4KICAgICAgICByZWFkeS5hZGQoY3VycmVudCk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgYXNzaWduUGhpc09mU3VjY2Vzc29ycyhIQmFzaWNCbG9jayBub2RlKSB7CiAgICBDb3B5SGFuZGxlciBoYW5kbGVyID0gdmFyaWFibGVOYW1lcy5nZXRDb3B5SGFuZGxlcihub2RlKTsKICAgIGlmIChoYW5kbGVyID09IG51bGwpIHJldHVybjsKCiAgICBzZXF1ZW50aWFsaXplQ29waWVzKAogICAgICAgIGhhbmRsZXIuY29waWVzLCB2YXJpYWJsZU5hbWVzLmdldFN3YXBUZW1wKCksIGVtaXRBc3NpZ25tZW50KTsKCiAgICBmb3IgKENvcHk8SEluc3RydWN0aW9uPiBjb3B5IGluIGhhbmRsZXIuYXNzaWdubWVudHMpIHsKICAgICAgU3RyaW5nIG5hbWUgPSB2YXJpYWJsZU5hbWVzLmdldE5hbWUoY29weS5kZXN0aW5hdGlvbik7CiAgICAgIHVzZShjb3B5LnNvdXJjZSk7CiAgICAgIGFzc2lnblZhcmlhYmxlKG5hbWUsIHBvcCgpLAogICAgICAgICAgY29weS5zb3VyY2Uuc291cmNlSW5mb3JtYXRpb24gPz8gY29weS5kZXN0aW5hdGlvbi5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CiAgfQoKICB2b2lkIGl0ZXJhdGVCYXNpY0Jsb2NrKEhCYXNpY0Jsb2NrIG5vZGUpIHsKICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IG5vZGUuZmlyc3Q7CiAgICB3aGlsZSAoIWlkZW50aWNhbChpbnN0cnVjdGlvbiwgbm9kZS5sYXN0KSkgewogICAgICBpZiAoIWlzR2VuZXJhdGVBdFVzZVNpdGUoaW5zdHJ1Y3Rpb24pKSB7CiAgICAgICAgZGVmaW5lKGluc3RydWN0aW9uKTsKICAgICAgfQogICAgICBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uLm5leHQ7CiAgICB9CiAgICBhc3NpZ25QaGlzT2ZTdWNjZXNzb3JzKG5vZGUpOwogICAgdmlzaXQoaW5zdHJ1Y3Rpb24pOwogIH0KCiAgdm9pZCBoYW5kbGVJbnZva2VCaW5hcnkoCiAgICAgIEhJbnZva2VCaW5hcnkgbm9kZSwgU3RyaW5nIG9wLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgdXNlKG5vZGUubGVmdCk7CiAgICBqcy5FeHByZXNzaW9uIGpzTGVmdCA9IHBvcCgpOwogICAgdXNlKG5vZGUucmlnaHQpOwogICAgcHVzaChuZXcganMuQmluYXJ5KG9wLCBqc0xlZnQsIHBvcCgpKQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0TGF0ZVZhbHVlKEhMYXRlVmFsdWUgbm9kZSkgewogICAgdXNlKG5vZGUudGFyZ2V0KTsKICB9CgogIHZpc2l0SW52b2tlQmluYXJ5KEhJbnZva2VCaW5hcnkgbm9kZSwgU3RyaW5nIG9wKSB7CiAgICBoYW5kbGVJbnZva2VCaW5hcnkobm9kZSwgb3AsIG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgdmlzaXRSZWxhdGlvbmFsKEhSZWxhdGlvbmFsIG5vZGUsIFN0cmluZyBvcCkgewogICAgaGFuZGxlSW52b2tlQmluYXJ5KG5vZGUsIG9wLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIC8vIFdlIHdhbnQgdGhlIG91dGNvbWUgb2YgYml0LW9wZXJhdGlvbnMgdG8gYmUgcG9zaXRpdmUuIFdlIHVzZSB0aGUgdW5zaWduZWQKICAvLyBzaGlmdCBvcGVyYXRvciB0byBhY2hpZXZlIHRoaXMuCiAgdmlzaXRCaXRJbnZva2VCaW5hcnkoSEJpbmFyeUJpdE9wIG5vZGUsIFN0cmluZyBvcCkgewogICAgdmlzaXRJbnZva2VCaW5hcnkobm9kZSwgb3ApOwogICAgaWYgKG9wICE9ICc+Pj4nICYmIHJlcXVpcmVzVWludENvbnZlcnNpb24obm9kZSkpIHsKICAgICAgcHVzaChuZXcganMuQmluYXJ5KCI+Pj4iLCBwb3AoKSwgbmV3IGpzLkxpdGVyYWxOdW1iZXIoIjAiKSkKICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfQogIH0KCiAgdmlzaXRJbnZva2VVbmFyeShISW52b2tlVW5hcnkgbm9kZSwgU3RyaW5nIG9wKSB7CiAgICB1c2Uobm9kZS5vcGVyYW5kKTsKICAgIHB1c2goCiAgICAgICAgbmV3IGpzLlByZWZpeChvcCwgcG9wKCkpLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgfQoKICAvLyBXZSB3YW50IHRoZSBvdXRjb21lIG9mIGJpdC1vcGVyYXRpb25zIHRvIGJlIHBvc2l0aXZlLiBXZSB1c2UgdGhlIHVuc2lnbmVkCiAgLy8gc2hpZnQgb3BlcmF0b3IgdG8gYWNoaWV2ZSB0aGlzLgogIHZpc2l0Qml0SW52b2tlVW5hcnkoSEludm9rZVVuYXJ5IG5vZGUsIFN0cmluZyBvcCkgewogICAgdmlzaXRJbnZva2VVbmFyeShub2RlLCBvcCk7CiAgICBpZiAocmVxdWlyZXNVaW50Q29udmVyc2lvbihub2RlKSkgewogICAgICBwdXNoKG5ldyBqcy5CaW5hcnkoIj4+PiIsIHBvcCgpLCBuZXcganMuTGl0ZXJhbE51bWJlcigiMCIpKQogICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9CiAgfQoKICB2b2lkIGVtaXRJZGVudGl0eUNvbXBhcmlzb24oCiAgICAgIEhJZGVudGl0eSBpbnN0cnVjdGlvbiwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIHtib29sIGludmVyc2U6IGZhbHNlfSkgewogICAgU3RyaW5nIG9wID0gaW5zdHJ1Y3Rpb24uc2luZ2xlQ29tcGFyaXNvbk9wOwogICAgSEluc3RydWN0aW9uIGxlZnQgPSBpbnN0cnVjdGlvbi5sZWZ0OwogICAgSEluc3RydWN0aW9uIHJpZ2h0ID0gaW5zdHJ1Y3Rpb24ucmlnaHQ7CiAgICBpZiAob3AgIT0gbnVsbCkgewogICAgICB1c2UobGVmdCk7CiAgICAgIGpzLkV4cHJlc3Npb24ganNMZWZ0ID0gcG9wKCk7CiAgICAgIHVzZShyaWdodCk7CiAgICAgIHB1c2gobmV3IGpzLkJpbmFyeShtYXBSZWxhdGlvbmFsT3BlcmF0b3Iob3AsIGludmVyc2UpLCBqc0xlZnQsIHBvcCgpKQogICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KE51bGxDb25zdGFudFZhbHVlLkpzTnVsbCA9PSAnbnVsbCcpOwogICAgICB1c2UobGVmdCk7CiAgICAgIGpzLkJpbmFyeSBsZWZ0RXF1YWxzTnVsbCA9CiAgICAgICAgICBuZXcganMuQmluYXJ5KCI9PSIsIHBvcCgpLCBuZXcganMuTGl0ZXJhbE51bGwoKSk7CiAgICAgIHVzZShyaWdodCk7CiAgICAgIGpzLkJpbmFyeSByaWdodEVxdWFsc051bGwgPSBuZXcganMuQmluYXJ5KAogICAgICAgICAgbWFwUmVsYXRpb25hbE9wZXJhdG9yKCI9PSIsIGludmVyc2UpLCBwb3AoKSwgbmV3IGpzLkxpdGVyYWxOdWxsKCkpOwogICAgICB1c2UocmlnaHQpOwogICAgICB1c2UobGVmdCk7CiAgICAgIGpzLkJpbmFyeSB0cmlwbGVFcSA9CiAgICAgICAgICBuZXcganMuQmluYXJ5KG1hcFJlbGF0aW9uYWxPcGVyYXRvcigiPT09IiwgaW52ZXJzZSksIHBvcCgpLCBwb3AoKSk7CgogICAgICBwdXNoKG5ldyBqcy5Db25kaXRpb25hbChsZWZ0RXF1YWxzTnVsbCwgcmlnaHRFcXVhbHNOdWxsLCB0cmlwbGVFcSkKICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0SWRlbnRpdHkoSElkZW50aXR5IG5vZGUpIHsKICAgIGVtaXRJZGVudGl0eUNvbXBhcmlzb24obm9kZSwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbiwgaW52ZXJzZTogZmFsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRBZGQoSEFkZCBub2RlKSA9PiB2aXNpdEludm9rZUJpbmFyeShub2RlLCAnKycpOwogIEBvdmVycmlkZQogIHZpc2l0RGl2aWRlKEhEaXZpZGUgbm9kZSkgPT4gdmlzaXRJbnZva2VCaW5hcnkobm9kZSwgJy8nKTsKICBAb3ZlcnJpZGUKICB2aXNpdE11bHRpcGx5KEhNdWx0aXBseSBub2RlKSA9PiB2aXNpdEludm9rZUJpbmFyeShub2RlLCAnKicpOwogIEBvdmVycmlkZQogIHZpc2l0U3VidHJhY3QoSFN1YnRyYWN0IG5vZGUpID0+IHZpc2l0SW52b2tlQmluYXJ5KG5vZGUsICctJyk7CiAgQG92ZXJyaWRlCiAgdmlzaXRCaXRBbmQoSEJpdEFuZCBub2RlKSA9PiB2aXNpdEJpdEludm9rZUJpbmFyeShub2RlLCAnJicpOwogIEBvdmVycmlkZQogIHZpc2l0Qml0Tm90KEhCaXROb3Qgbm9kZSkgPT4gdmlzaXRCaXRJbnZva2VVbmFyeShub2RlLCAnficpOwogIEBvdmVycmlkZQogIHZpc2l0Qml0T3IoSEJpdE9yIG5vZGUpID0+IHZpc2l0Qml0SW52b2tlQmluYXJ5KG5vZGUsICd8Jyk7CiAgQG92ZXJyaWRlCiAgdmlzaXRCaXRYb3IoSEJpdFhvciBub2RlKSA9PiB2aXNpdEJpdEludm9rZUJpbmFyeShub2RlLCAnXicpOwogIEBvdmVycmlkZQogIHZpc2l0U2hpZnRMZWZ0KEhTaGlmdExlZnQgbm9kZSkgPT4gdmlzaXRCaXRJbnZva2VCaW5hcnkobm9kZSwgJzw8Jyk7CiAgQG92ZXJyaWRlCiAgdmlzaXRTaGlmdFJpZ2h0KEhTaGlmdFJpZ2h0IG5vZGUpID0+IHZpc2l0Qml0SW52b2tlQmluYXJ5KG5vZGUsICc+Pj4nKTsKCiAgQG92ZXJyaWRlCiAgdmlzaXRUcnVuY2F0aW5nRGl2aWRlKEhUcnVuY2F0aW5nRGl2aWRlIG5vZGUpIHsKICAgIGFzc2VydChub2RlLmlzVUludDMxKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKTsKICAgIC8vIFRPRE8oa2FybGtsb3NlKTogRW5hYmxlIHRoaXMgYXNzZXJ0aW9uIGFnYWluIHdoZW4gdHlwZSBwcm9wYWdhdGlvbiBpcwogICAgLy8gZml4ZWQuIElzc3VlIDIzNTU1LgovLyAgICBhc3NlcnQobm9kZS5sZWZ0LmlzVUludDMyKGNvbXBpbGVyKSk7CiAgICBhc3NlcnQobm9kZS5yaWdodC5pc1Bvc2l0aXZlSW50ZWdlcihfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSk7CiAgICB1c2Uobm9kZS5sZWZ0KTsKICAgIGpzLkV4cHJlc3Npb24ganNMZWZ0ID0gcG9wKCk7CiAgICB1c2Uobm9kZS5yaWdodCk7CiAgICBwdXNoKG5ldyBqcy5CaW5hcnkoJy8nLCBqc0xlZnQsIHBvcCgpKQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgcHVzaChuZXcganMuQmluYXJ5KCd8JywgcG9wKCksIG5ldyBqcy5MaXRlcmFsTnVtYmVyKCIwIikpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFJlbWFpbmRlcihIUmVtYWluZGVyIG5vZGUpIHsKICAgIHJldHVybiB2aXNpdEludm9rZUJpbmFyeShub2RlLCAnJScpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXROZWdhdGUoSE5lZ2F0ZSBub2RlKSA9PiB2aXNpdEludm9rZVVuYXJ5KG5vZGUsICctJyk7CgogIEBvdmVycmlkZQogIHZpc2l0QWJzKEhBYnMgbm9kZSkgewogICAgdXNlKG5vZGUub3BlcmFuZCk7CiAgICBwdXNoKGpzCiAgICAgICAgLmpzKCdNYXRoLmFicygjKScsIHBvcCgpKQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRMZXNzKEhMZXNzIG5vZGUpID0+IHZpc2l0UmVsYXRpb25hbChub2RlLCAnPCcpOwogIEBvdmVycmlkZQogIHZpc2l0TGVzc0VxdWFsKEhMZXNzRXF1YWwgbm9kZSkgPT4gdmlzaXRSZWxhdGlvbmFsKG5vZGUsICc8PScpOwogIEBvdmVycmlkZQogIHZpc2l0R3JlYXRlcihIR3JlYXRlciBub2RlKSA9PiB2aXNpdFJlbGF0aW9uYWwobm9kZSwgJz4nKTsKICBAb3ZlcnJpZGUKICB2aXNpdEdyZWF0ZXJFcXVhbChIR3JlYXRlckVxdWFsIG5vZGUpID0+IHZpc2l0UmVsYXRpb25hbChub2RlLCAnPj0nKTsKCiAgQG92ZXJyaWRlCiAgdmlzaXRCb29saWZ5KEhCb29saWZ5IG5vZGUpIHsKICAgIGFzc2VydChub2RlLmlucHV0cy5sZW5ndGggPT0gMSk7CiAgICB1c2Uobm9kZS5pbnB1dHNbMF0pOwogICAgcHVzaChuZXcganMuQmluYXJ5KAogICAgICAgICAgICAnPT09JywgcG9wKCksIG5ld0xpdGVyYWxCb29sKHRydWUsIG5vZGUuc291cmNlSW5mb3JtYXRpb24pKQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRFeGl0KEhFeGl0IG5vZGUpIHsKICAgIC8vIERvbid0IGRvIGFueXRoaW5nLgogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRHb3RvKEhHb3RvIG5vZGUpIHsKICAgIEhCYXNpY0Jsb2NrIGJsb2NrID0gbm9kZS5ibG9jazsKICAgIGFzc2VydChibG9jay5zdWNjZXNzb3JzLmxlbmd0aCA9PSAxKTsKICAgIExpc3Q8SEJhc2ljQmxvY2s+IGRvbWluYXRlZCA9IGJsb2NrLmRvbWluYXRlZEJsb2NrczsKICAgIC8vIFdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgZW50cnktbm9kZSB3aGljaCBkb21pbmF0ZXMgaXRzIHN1Y2Nlc3NvcgogICAgLy8gYW5kIHRoZSBleGl0IG5vZGUsIG5vIGJsb2NrIGZpbmlzaGluZyB3aXRoIGEgJ2dvdG8nIGNhbiBoYXZlIG1vcmUgdGhhbgogICAgLy8gb25lIGRvbWluYXRlZCBibG9jayAoc2luY2UgaXQgaGFzIG9ubHkgb25lIHN1Y2Nlc3NvcikuCiAgICAvLyBJZiB0aGUgc3VjY2Vzc29yIGlzIGRvbWluYXRlZCBieSBhbm90aGVyIGJsb2NrLCB0aGVuIHRoZSBvdGhlciBibG9jawogICAgLy8gaXMgcmVzcG9uc2libGUgZm9yIHZpc2l0aW5nIHRoZSBzdWNjZXNzb3IuCiAgICBpZiAoZG9taW5hdGVkLmlzRW1wdHkpIHJldHVybjsKICAgIGlmIChkb21pbmF0ZWQubGVuZ3RoID4gMikgewogICAgICBmYWlsZWRBdChub2RlLCAnZG9taW5hdGVkLmxlbmd0aCA9ICR7ZG9taW5hdGVkLmxlbmd0aH0nKTsKICAgIH0KICAgIGlmIChkb21pbmF0ZWQubGVuZ3RoID09IDIgJiYgYmxvY2sgIT0gY3VycmVudEdyYXBoLmVudHJ5KSB7CiAgICAgIGZhaWxlZEF0KG5vZGUsICdub2RlLmJsb2NrICE9IGN1cnJlbnRHcmFwaC5lbnRyeScpOwogICAgfQogICAgYXNzZXJ0KGRvbWluYXRlZFswXSA9PSBibG9jay5zdWNjZXNzb3JzWzBdKTsKICAgIGNvbnRpbnVlU3ViR3JhcGgoZG9taW5hdGVkLmZpcnN0KTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0TG9vcEJyYW5jaChITG9vcEJyYW5jaCBub2RlKSB7CiAgICBhc3NlcnQobm9kZS5ibG9jayA9PSBzdWJHcmFwaC5lbmQpOwogICAgLy8gV2UgYXJlIGdlbmVyYXRpbmcgY29kZSBmb3IgYSBsb29wIGNvbmRpdGlvbi4KICAgIC8vIElmIHdlIGFyZSBnZW5lcmF0aW5nIHRoZSBzdWJncmFwaCBhcyBhbiBleHByZXNzaW9uLCB0aGUKICAgIC8vIGNvbmRpdGlvbiB3aWxsIGJlIGdlbmVyYXRlZCBhcyB0aGUgZXhwcmVzc2lvbi4KICAgIC8vIE90aGVyd2lzZSwgd2UgZG9uJ3QgZ2VuZXJhdGUgdGhlIGV4cHJlc3Npb24sIGFuZCBsZWF2ZSB0aGF0CiAgICAvLyB0byB0aGUgY29kZSB0aGF0IGNhbGxlZCBbdmlzaXRTdWJHcmFwaF0uCiAgICBpZiAoaXNHZW5lcmF0aW5nRXhwcmVzc2lvbikgewogICAgICB1c2Uobm9kZS5pbnB1dHNbMF0pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRCcmVhayhIQnJlYWsgbm9kZSkgewogICAgYXNzZXJ0KG5vZGUuYmxvY2suc3VjY2Vzc29ycy5sZW5ndGggPT0gMSk7CiAgICBpZiAobm9kZS5sYWJlbCAhPSBudWxsKSB7CiAgICAgIExhYmVsRGVmaW5pdGlvbiBsYWJlbCA9IG5vZGUubGFiZWw7CiAgICAgIGlmIChicmVha0FjdGlvbi5jb250YWlucyhsYWJlbC50YXJnZXQpKSB7CiAgICAgICAgaW1wbGljaXRCcmVha1dpdGhMYWJlbChsYWJlbC50YXJnZXQpOwogICAgICB9IGVsc2UgewogICAgICAgIHB1c2hTdGF0ZW1lbnQobmV3IGpzLkJyZWFrKF9uYW1lci5icmVha0xhYmVsTmFtZShsYWJlbCkpCiAgICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBKdW1wVGFyZ2V0IHRhcmdldCA9IG5vZGUudGFyZ2V0OwogICAgICBpZiAoYnJlYWtBY3Rpb24uY29udGFpbnModGFyZ2V0KSkgewogICAgICAgIGltcGxpY2l0QnJlYWtXaXRoTGFiZWwodGFyZ2V0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAobm9kZS5icmVha1N3aXRjaENvbnRpbnVlTG9vcCkgewogICAgICAgICAgcHVzaFN0YXRlbWVudChuZXcganMuQnJlYWsoX25hbWVyLmltcGxpY2l0Q29udGludWVMYWJlbE5hbWUodGFyZ2V0KSkKICAgICAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcHVzaFN0YXRlbWVudCgKICAgICAgICAgICAgICBuZXcganMuQnJlYWsobnVsbCkud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q29udGludWUoSENvbnRpbnVlIG5vZGUpIHsKICAgIGFzc2VydChub2RlLmJsb2NrLnN1Y2Nlc3NvcnMubGVuZ3RoID09IDEpOwogICAgaWYgKG5vZGUubGFiZWwgIT0gbnVsbCkgewogICAgICBMYWJlbERlZmluaXRpb24gbGFiZWwgPSBub2RlLmxhYmVsOwogICAgICBpZiAoY29udGludWVBY3Rpb24uY29udGFpbnMobGFiZWwpKSB7CiAgICAgICAgY29udGludWVBc0JyZWFrKGxhYmVsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUT0RPKGZsb2l0c2NoKTogc2hvdWxkIHRoaXMgcmVhbGx5IGJlIHRoZSBicmVha0xhYmVsTmFtZT8KICAgICAgICBwdXNoU3RhdGVtZW50KG5ldyBqcy5Db250aW51ZShfbmFtZXIuYnJlYWtMYWJlbE5hbWUobGFiZWwpKQogICAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgSnVtcFRhcmdldCB0YXJnZXQgPSBub2RlLnRhcmdldDsKICAgICAgaWYgKGltcGxpY2l0Q29udGludWVBY3Rpb24uY29udGFpbnModGFyZ2V0KSkgewogICAgICAgIGltcGxpY2l0Q29udGludWVBc0JyZWFrKHRhcmdldCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHRhcmdldC5pc1N3aXRjaCkgewogICAgICAgICAgcHVzaFN0YXRlbWVudCgKICAgICAgICAgICAgICBuZXcganMuQ29udGludWUoX25hbWVyLmltcGxpY2l0Q29udGludWVMYWJlbE5hbWUodGFyZ2V0KSkKICAgICAgICAgICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHB1c2hTdGF0ZW1lbnQobmV3IGpzLkNvbnRpbnVlKG51bGwpCiAgICAgICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEV4aXRUcnkoSEV4aXRUcnkgbm9kZSkgewogICAgLy8gQW4gW0hFeGl0VHJ5XSBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgY29udHJvbCBmbG93IGdyYXBoIG9mIGEKICAgIC8vIHRyeS9jYXRjaCBibG9jaywgaWUgdGhlIHRyeSBib2R5IGlzIGFsd2F5cyBhIHByZWRlY2Vzc29yCiAgICAvLyBvZiB0aGUgY2F0Y2ggYW5kIGZpbmFsbHkuIEhlcmUsIHdlIGNvbnRpbnVlIHZpc2l0aW5nIHRoZSB0cnkKICAgIC8vIGJvZHkgYnkgdmlzaXRpbmcgdGhlIGJsb2NrIHRoYXQgY29udGFpbnMgdGhlIHVzZXItbGV2ZWwgY29udHJvbAogICAgLy8gZmxvdyBpbnN0cnVjdGlvbi4KICAgIGNvbnRpbnVlU3ViR3JhcGgobm9kZS5ib2R5VHJ5U3VjY2Vzc29yKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VHJ5KEhUcnkgbm9kZSkgewogICAgLy8gV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLiBUcnkvY2F0Y2gvZmluYWxseSBpcyBhbHdheXMgaGFuZGxlZCB1c2luZyBibG9jawogICAgLy8gaW5mb3JtYXRpb24gaW4gW3Zpc2l0VHJ5SW5mb10uCiAgICBmYWlsZWRBdChub2RlLCAndmlzaXRUcnkgc2hvdWxkIG5vdCBiZSBjYWxsZWQuJyk7CiAgfQoKICBib29sIHRyeUNvbnRyb2xGbG93T3BlcmF0aW9uKEhJZiBub2RlKSB7CiAgICBpZiAoIWNvbnRyb2xGbG93T3BlcmF0b3JzLmNvbnRhaW5zKG5vZGUpKSByZXR1cm4gZmFsc2U7CiAgICBIUGhpIHBoaSA9IG5vZGUuam9pbkJsb2NrLnBoaXMuZmlyc3Q7CiAgICBib29sIGF0VXNlU2l0ZSA9IGlzR2VuZXJhdGVBdFVzZVNpdGUocGhpKTsKICAgIC8vIERvbid0IGdlbmVyYXRlIGEgY29uZGl0aW9uYWwgb3BlcmF0b3IgaW4gdGhpcyBzaXR1YXRpb246CiAgICAvLyBpID0gY29uZGl0aW9uID8gYmFyKCkgOiBpOwogICAgLy8gQnV0IGdlbmVyYXRlIHRoaXMgaW5zdGVhZDoKICAgIC8vIGlmIChjb25kaXRpb24pIGkgPSBiYXIoKTsKICAgIC8vIFVzdWFsbHksIHRoZSB2YXJpYWJsZSBuYW1lIGlzIGxvbmdlciB0aGFuICdpZicgYW5kIGl0IHRha2VzIHVwCiAgICAvLyBtb3JlIHNwYWNlIHRvIGR1cGxpY2F0ZSB0aGUgbmFtZS4KICAgIGlmICghYXRVc2VTaXRlICYmCiAgICAgICAgdmFyaWFibGVOYW1lcy5nZXROYW1lKHBoaSkgPT0gdmFyaWFibGVOYW1lcy5nZXROYW1lKHBoaS5pbnB1dHNbMV0pKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICghYXRVc2VTaXRlKSBkZWZpbmUocGhpKTsKICAgIGNvbnRpbnVlU3ViR3JhcGgobm9kZS5qb2luQmxvY2spOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICB2b2lkIGdlbmVyYXRlSWYoSElmIG5vZGUsIEhJZkJsb2NrSW5mb3JtYXRpb24gaW5mbykgewogICAgSFN0YXRlbWVudEluZm9ybWF0aW9uIHRoZW5HcmFwaCA9IGluZm8udGhlbkdyYXBoOwogICAgSFN0YXRlbWVudEluZm9ybWF0aW9uIGVsc2VHcmFwaCA9IGluZm8uZWxzZUdyYXBoOwogICAgSEluc3RydWN0aW9uIGNvbmRpdGlvbiA9IG5vZGUuaW5wdXRzLnNpbmdsZTsKCiAgICBqcy5FeHByZXNzaW9uIHRlc3Q7CiAgICBqcy5TdGF0ZW1lbnQgdGhlblBhcnQ7CiAgICBqcy5TdGF0ZW1lbnQgZWxzZVBhcnQ7CgogICAgSEJhc2ljQmxvY2sgdGhlbkJsb2NrID0gbm9kZS5ibG9jay5zdWNjZXNzb3JzWzBdOwogICAgLy8gSWYgd2UgYmVsaWV2ZSB3ZSB3aWxsIGdlbmVyYXRlIFMxIGFzIGVtcHR5LCBpbnN0ZWFkIG9mCiAgICAvLwogICAgLy8gICAgIGlmIChlKSBTMTsgZWxzZSBTMjsKICAgIC8vCiAgICAvLyB0cnkgdG8gZ2VuZXJhdGUKICAgIC8vCiAgICAvLyAgICAgaWYgKCFlKSBTMjsgZWxzZSBTMTsKICAgIC8vCiAgICAvLyBJdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYCFlYCByYXRoZXIgdGhhbiB0cnkgYW5kIG5lZ2F0ZSBpdCBsYXRlci4KICAgIC8vIFJlY29nbml6ZSBhIHNpbmdsZSB0aGVuLWJsb2NrIHdpdGggbm8gY29kZSBhbmQgbm8gY29udHJvbGxlZCBwaGlzLgogICAgaWYgKGlzR2VuZXJhdGVBdFVzZVNpdGUoY29uZGl0aW9uKSAmJgogICAgICAgIHRoZW5CbG9jay5zdWNjZXNzb3JzLmxlbmd0aCA9PSAxICYmCiAgICAgICAgdGhlbkJsb2NrLnN1Y2Nlc3NvcnMuc2luZ2xlID09IG5vZGUuam9pbkJsb2NrICYmCiAgICAgICAgbm9kZS5qb2luQmxvY2sucGhpcy5pc0VtcHR5ICYmCiAgICAgICAgdGhlbkJsb2NrLmZpcnN0IGlzIEhHb3RvKSB7CiAgICAgIGdlbmVyYXRlTm90KGNvbmRpdGlvbiwgY29uZGl0aW9uLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgdGVzdCA9IHBvcCgpOwogICAgICAvLyBTd2FwIGJyYW5jaGVzIGJ1dCB2aXNpdCBpbiBzYW1lIG9yZGVyIGFzIHJlZ2lzdGVyIGFsbG9jYXRvci4KICAgICAgZWxzZVBhcnQgPSB1bndyYXBTdGF0ZW1lbnQoZ2VuZXJhdGVTdGF0ZW1lbnRzSW5OZXdCbG9jayh0aGVuR3JhcGgpKTsKICAgICAgdGhlblBhcnQgPSB1bndyYXBTdGF0ZW1lbnQoZ2VuZXJhdGVTdGF0ZW1lbnRzSW5OZXdCbG9jayhlbHNlR3JhcGgpKTsKICAgICAgYXNzZXJ0KGVsc2VQYXJ0IGlzIGpzLkVtcHR5U3RhdGVtZW50KTsKICAgIH0gZWxzZSB7CiAgICAgIHVzZShjb25kaXRpb24pOwogICAgICB0ZXN0ID0gcG9wKCk7CiAgICAgIHRoZW5QYXJ0ID0gdW53cmFwU3RhdGVtZW50KGdlbmVyYXRlU3RhdGVtZW50c0luTmV3QmxvY2sodGhlbkdyYXBoKSk7CiAgICAgIGVsc2VQYXJ0ID0gdW53cmFwU3RhdGVtZW50KGdlbmVyYXRlU3RhdGVtZW50c0luTmV3QmxvY2soZWxzZUdyYXBoKSk7CiAgICB9CgogICAganMuU3RhdGVtZW50IGNvZGUgPSBfYXNzZW1ibGVJZlRoZW5FbHNlKHRlc3QsIHRoZW5QYXJ0LCBlbHNlUGFydCk7CiAgICBwdXNoU3RhdGVtZW50KGNvZGUud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICB9CgogIGpzLlN0YXRlbWVudCBfYXNzZW1ibGVJZlRoZW5FbHNlKAogICAgICBqcy5FeHByZXNzaW9uIHRlc3QsIGpzLlN0YXRlbWVudCB0aGVuUGFydCwganMuU3RhdGVtZW50IGVsc2VQYXJ0KSB7CiAgICAvLyBQZWVwaG9sZSByZXdyaXRlczoKICAgIC8vCiAgICAvLyAgICAgaWYgKGUpOyBlbHNlIFM7ICAgLS0+ICAgaWYgKCFlKSBTOwogICAgLy8KICAgIC8vICAgICBpZiAoZSk7ICAgLS0+ICAgZTsKICAgIC8vCiAgICAvLyBUT0RPKHNyYSk6IFdlIG1pZ2h0IGJlIGFibGUgdG8gZG8gYmV0dGVyIHdpdGggcmVzaGFwaW5nIHRoZSBDRkcuCiAgICBpZiAodGhlblBhcnQgaXMganMuRW1wdHlTdGF0ZW1lbnQpIHsKICAgICAgaWYgKGVsc2VQYXJ0IGlzIGpzLkVtcHR5U3RhdGVtZW50KSB7CiAgICAgICAgcmV0dXJuIGpzLkV4cHJlc3Npb25TdGF0ZW1lbnQodGVzdCk7CiAgICAgIH0KICAgICAgdGVzdCA9IGpzLlByZWZpeCgnIScsIHRlc3QpOwogICAgICB2YXIgdGVtcCA9IHRoZW5QYXJ0OwogICAgICB0aGVuUGFydCA9IGVsc2VQYXJ0OwogICAgICBlbHNlUGFydCA9IHRlbXA7CiAgICB9CgogICAgaWYgKF9vcHRpb25zLmV4cGVyaW1lbnRUb0Jvb2xlYW4pIHsKICAgICAgaWYgKGVsc2VQYXJ0IGlzIGpzLkVtcHR5U3RhdGVtZW50ICYmCiAgICAgICAgICB0aGVuUGFydCBpcyBqcy5FeHByZXNzaW9uU3RhdGVtZW50ICYmCiAgICAgICAgICB0aGVuUGFydC5leHByZXNzaW9uIGlzIGpzLkNhbGwpIHsKICAgICAgICByZXR1cm4ganMuRXhwcmVzc2lvblN0YXRlbWVudCgKICAgICAgICAgICAganMuQmluYXJ5KCcmJicsIHRlc3QsIHRoZW5QYXJ0LmV4cHJlc3Npb24pKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBqcy5JZih0ZXN0LCB0aGVuUGFydCwgZWxzZVBhcnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRJZihISWYgbm9kZSkgewogICAgaWYgKHRyeUNvbnRyb2xGbG93T3BlcmF0aW9uKG5vZGUpKSByZXR1cm47CgogICAgSEluc3RydWN0aW9uIGNvbmRpdGlvbiA9IG5vZGUuaW5wdXRzWzBdOwogICAgSElmQmxvY2tJbmZvcm1hdGlvbiBpbmZvID0gbm9kZS5ibG9ja0luZm9ybWF0aW9uLmJvZHk7CgogICAgaWYgKGNvbmRpdGlvbi5pc0NvbnN0YW50KCkpIHsKICAgICAgSENvbnN0YW50IGNvbnN0YW50ID0gY29uZGl0aW9uOwogICAgICBpZiAoY29uc3RhbnQuY29uc3RhbnQuaXNUcnVlKSB7CiAgICAgICAgZ2VuZXJhdGVTdGF0ZW1lbnRzKGluZm8udGhlbkdyYXBoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBnZW5lcmF0ZVN0YXRlbWVudHMoaW5mby5lbHNlR3JhcGgpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBnZW5lcmF0ZUlmKG5vZGUsIGluZm8pOwogICAgfQoKICAgIEhCYXNpY0Jsb2NrIGpvaW5CbG9jayA9IG5vZGUuam9pbkJsb2NrOwogICAgaWYgKGpvaW5CbG9jayAhPSBudWxsICYmICFpZGVudGljYWwoam9pbkJsb2NrLmRvbWluYXRvciwgbm9kZS5ibG9jaykpIHsKICAgICAgLy8gVGhlIGpvaW4gYmxvY2sgaXMgZG9taW5hdGVkIGJ5IGEgYmxvY2sgaW4gb25lIG9mIHRoZSBicmFuY2hlcy4KICAgICAgLy8gVGhlIHN1YmdyYXBoIHRyYXZlcnNhbCBuZXZlciByZWFjaGVkIGl0LCBzbyB3ZSB2aXNpdCBpdCBoZXJlCiAgICAgIC8vIGluc3RlYWQuCiAgICAgIGNvbnRpbnVlU3ViR3JhcGgoam9pbkJsb2NrKTsKICAgIH0KCiAgICAvLyBWaXNpdCBhbGwgdGhlIGRvbWluYXRlZCBibG9ja3MgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIHRoZW4gb3IgZWxzZQogICAgLy8gYnJhbmNoZXMsIGFuZCBpcyBub3QgdGhlIGpvaW4gYmxvY2suCiAgICAvLyBEZXBlbmRpbmcgb24gaG93IHRoZSB0aGVuL2Vsc2UgYnJhbmNoZXMgdGVybWluYXRlCiAgICAvLyAoZS5nLiwgcmV0dXJuL3Rocm93L2JyZWFrKSB0aGVyZSBjYW4gYmUgYW55IG51bWJlciBvZiB0aGVzZS4KICAgIExpc3Q8SEJhc2ljQmxvY2s+IGRvbWluYXRlZCA9IG5vZGUuYmxvY2suZG9taW5hdGVkQmxvY2tzOwogICAgZm9yIChpbnQgaSA9IDI7IGkgPCBkb21pbmF0ZWQubGVuZ3RoOyBpKyspIHsKICAgICAgY29udGludWVTdWJHcmFwaChkb21pbmF0ZWRbaV0pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludGVyY2VwdG9yKEhJbnRlcmNlcHRvciBub2RlKSB7CiAgICBpZiAobm9kZS5pc0NvbmRpdGlvbmFsQ29uc3RhbnRJbnRlcmNlcHRvcikgewogICAgICBhc3NlcnQobm9kZS5pbnB1dHMubGVuZ3RoID09IDIpOwogICAgICB1c2Uobm9kZS5yZWNlaXZlcik7CiAgICAgIGpzLkV4cHJlc3Npb24gcmVjZWl2ZXJFeHByZXNzaW9uID0gcG9wKCk7CiAgICAgIHVzZShub2RlLmNvbmRpdGlvbmFsQ29uc3RhbnRJbnRlcmNlcHRvcik7CiAgICAgIGpzLkV4cHJlc3Npb24gY29uc3RhbnQgPSBwb3AoKTsKICAgICAgcHVzaChqcy5qcygnIyAmJiAjJywgW3JlY2VpdmVyRXhwcmVzc2lvbiwgY29uc3RhbnRdKSk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQobm9kZS5pbnB1dHMubGVuZ3RoID09IDEpOwogICAgICBfcmVnaXN0cnkucmVnaXN0ZXJTcGVjaWFsaXplZEdldEludGVyY2VwdG9yKG5vZGUuaW50ZXJjZXB0ZWRDbGFzc2VzKTsKICAgICAganMuTmFtZSBuYW1lID0gX25hbWVyLm5hbWVGb3JHZXRJbnRlcmNlcHRvcihub2RlLmludGVyY2VwdGVkQ2xhc3Nlcyk7CiAgICAgIHZhciBpc29sYXRlID0gbmV3IGpzLlZhcmlhYmxlVXNlKAogICAgICAgICAgX25hbWVyLmdsb2JhbE9iamVjdEZvckxpYnJhcnkoX2NvbW1vbkVsZW1lbnRzLmludGVyY2VwdG9yc0xpYnJhcnkpKTsKICAgICAgdXNlKG5vZGUucmVjZWl2ZXIpOwogICAgICBMaXN0PGpzLkV4cHJlc3Npb24+IGFyZ3VtZW50cyA9IDxqcy5FeHByZXNzaW9uPltwb3AoKV07CiAgICAgIHB1c2goanMKICAgICAgICAgIC5wcm9wZXJ0eUNhbGwoaXNvbGF0ZSwgbmFtZSwgYXJndW1lbnRzKQogICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICAgIF9yZWdpc3RyeS5yZWdpc3RlclVzZUludGVyY2VwdG9yKCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEludm9rZUR5bmFtaWNNZXRob2QoSEludm9rZUR5bmFtaWNNZXRob2Qgbm9kZSkgewogICAgdXNlKG5vZGUucmVjZWl2ZXIpOwogICAganMuRXhwcmVzc2lvbiBvYmplY3QgPSBwb3AoKTsKICAgIFN0cmluZyBtZXRob2ROYW1lOwogICAgTGlzdDxqcy5FeHByZXNzaW9uPiBhcmd1bWVudHMgPSB2aXNpdEFyZ3VtZW50cyhub2RlLmlucHV0cyk7CiAgICBNZW1iZXJFbnRpdHkgdGFyZ2V0ID0gbm9kZS5lbGVtZW50OwoKICAgIC8vIFRPRE8oaGVyaHV0KTogVGhlIG5hbWVyIHNob3VsZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGJhY2tlbmRuYW1lIGhlcmUuCiAgICBpZiAodGFyZ2V0ICE9IG51bGwgJiYgIW5vZGUuaXNJbnRlcmNlcHRlZENhbGwpIHsKICAgICAgaWYgKHRhcmdldCA9PSBfY29tbW9uRWxlbWVudHMuanNBcnJheUFkZCkgewogICAgICAgIG1ldGhvZE5hbWUgPSAncHVzaCc7CiAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ID09IF9jb21tb25FbGVtZW50cy5qc0FycmF5UmVtb3ZlTGFzdCkgewogICAgICAgIG1ldGhvZE5hbWUgPSAncG9wJzsKICAgICAgfSBlbHNlIGlmIChfY29tbW9uRWxlbWVudHMuaXNKc1N0cmluZ1NwbGl0KHRhcmdldCkpIHsKICAgICAgICBtZXRob2ROYW1lID0gJ3NwbGl0JzsKICAgICAgICAvLyBTcGxpdCByZXR1cm5zIGEgTGlzdCwgc28gd2UgbWFrZSBzdXJlIHRoZSBiYWNrZW5kIGtub3dzIHRoZQogICAgICAgIC8vIGxpc3QgY2xhc3MgaXMgaW5zdGFudGlhdGVkLgogICAgICAgIF9yZWdpc3RyeQogICAgICAgICAgICAvLyBpZ25vcmU6ZGVwcmVjYXRlZF9tZW1iZXJfdXNlX2Zyb21fc2FtZV9wYWNrYWdlCiAgICAgICAgICAgIC5yZWdpc3Rlckluc3RhbnRpYXRlZENsYXNzKF9jb21tb25FbGVtZW50cy5saXN0Q2xhc3MpOwogICAgICB9IGVsc2UgaWYgKF9uYXRpdmVEYXRhLmlzTmF0aXZlTWVtYmVyKHRhcmdldCkgJiYKICAgICAgICAgIHRhcmdldC5pc0Z1bmN0aW9uICYmCiAgICAgICAgICAhbm9kZS5pc0ludGVyY2VwdGVkQ2FsbCkgewogICAgICAgIC8vIEEgZGlyZWN0IChpLmUuIG5vbi1pbnRlcmNlcHRvcikgbmF0aXZlIGNhbGwgaXMgdGhlIHJlc3VsdCBvZgogICAgICAgIC8vIG9wdGltaXphdGlvbi4gIFRoZSBvcHRpbWl6YXRpb24gZW5zdXJlcyBhbnkgdHlwZSBjaGVja3Mgb3IKICAgICAgICAvLyBjb252ZXJzaW9ucyBoYXZlIGJlZW4gc2F0aXNmaWVkLgogICAgICAgIG1ldGhvZE5hbWUgPSBfbmF0aXZlRGF0YS5nZXRGaXhlZEJhY2tlbmROYW1lKHRhcmdldCk7CiAgICAgIH0KICAgIH0KCiAgICBqcy5OYW1lIG1ldGhvZExpdGVyYWw7CiAgICBpZiAobWV0aG9kTmFtZSA9PSBudWxsKSB7CiAgICAgIG1ldGhvZExpdGVyYWwgPSBfbmFtZXIuaW52b2NhdGlvbk5hbWUobm9kZS5zZWxlY3Rvcik7CiAgICAgIHJlZ2lzdGVyTWV0aG9kSW52b2tlKG5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgbWV0aG9kTGl0ZXJhbCA9IF9uYW1lci5hc05hbWUobWV0aG9kTmFtZSk7CiAgICB9CiAgICBwdXNoKGpzCiAgICAgICAgLnByb3BlcnR5Q2FsbChvYmplY3QsIG1ldGhvZExpdGVyYWwsIGFyZ3VtZW50cykKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnZva2VDb25zdHJ1Y3RvckJvZHkoSEludm9rZUNvbnN0cnVjdG9yQm9keSBub2RlKSB7CiAgICB1c2Uobm9kZS5pbnB1dHNbMF0pOwogICAganMuRXhwcmVzc2lvbiBvYmplY3QgPSBwb3AoKTsKICAgIGpzLk5hbWUgbWV0aG9kTmFtZSA9IF9uYW1lci5pbnN0YW5jZU1ldGhvZE5hbWUobm9kZS5lbGVtZW50KTsKICAgIExpc3Q8anMuRXhwcmVzc2lvbj4gYXJndW1lbnRzID0gdmlzaXRBcmd1bWVudHMobm9kZS5pbnB1dHMpOwogICAgcHVzaChqcwogICAgICAgIC5wcm9wZXJ0eUNhbGwob2JqZWN0LCBtZXRob2ROYW1lLCBhcmd1bWVudHMpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICBfcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5jb25zdHJ1Y3RvckJvZHlJbnZva2UoCiAgICAgICAgbm9kZS5lbGVtZW50LCBuZXcgQ2FsbFN0cnVjdHVyZS51bm5hbWVkKGFyZ3VtZW50cy5sZW5ndGgpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW52b2tlR2VuZXJhdG9yQm9keShISW52b2tlR2VuZXJhdG9yQm9keSBub2RlKSB7CiAgICBKR2VuZXJhdG9yQm9keSBlbGVtZW50ID0gbm9kZS5lbGVtZW50OwogICAgaWYgKGVsZW1lbnQuaXNJbnN0YW5jZU1lbWJlcikgewogICAgICB1c2Uobm9kZS5pbnB1dHNbMF0pOwogICAgICBqcy5FeHByZXNzaW9uIG9iamVjdCA9IHBvcCgpOwogICAgICBMaXN0PGpzLkV4cHJlc3Npb24+IGFyZ3VtZW50cyA9IHZpc2l0QXJndW1lbnRzKG5vZGUuaW5wdXRzKTsKICAgICAganMuTmFtZSBtZXRob2ROYW1lID0gX25hbWVyLmluc3RhbmNlTWV0aG9kTmFtZShlbGVtZW50KTsKICAgICAgcHVzaChqcwogICAgICAgICAgLnByb3BlcnR5Q2FsbChvYmplY3QsIG1ldGhvZE5hbWUsIGFyZ3VtZW50cykKICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChfZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2VzcyhlbGVtZW50KSk7CiAgICAgIExpc3Q8anMuRXhwcmVzc2lvbj4gYXJndW1lbnRzID0gdmlzaXRBcmd1bWVudHMobm9kZS5pbnB1dHMsIHN0YXJ0OiAwKTsKICAgICAgcHVzaChuZXcganMuQ2FsbChwb3AoKSwgYXJndW1lbnRzLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0KCiAgICBfcmVnaXN0cnkKICAgICAgICAucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5nZW5lcmF0b3JCb2R5SW52b2tlKG5vZGUuZWxlbWVudCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE9uZVNob3RJbnRlcmNlcHRvcihIT25lU2hvdEludGVyY2VwdG9yIG5vZGUpIHsKICAgIExpc3Q8anMuRXhwcmVzc2lvbj4gYXJndW1lbnRzID0gdmlzaXRBcmd1bWVudHMobm9kZS5pbnB1dHMpOwogICAgdmFyIGlzb2xhdGUgPSBuZXcganMuVmFyaWFibGVVc2UoCiAgICAgICAgX25hbWVyLmdsb2JhbE9iamVjdEZvckxpYnJhcnkoX2NvbW1vbkVsZW1lbnRzLmludGVyY2VwdG9yc0xpYnJhcnkpKTsKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gbm9kZS5zZWxlY3RvcjsKICAgIGpzLk5hbWUgbWV0aG9kTmFtZSA9IF9vbmVTaG90SW50ZXJjZXB0b3JEYXRhLnJlZ2lzdGVyT25lU2hvdEludGVyY2VwdG9yKAogICAgICAgIHNlbGVjdG9yLCBfbmFtZXIsIF9jbG9zZWRXb3JsZCk7CiAgICBwdXNoKGpzCiAgICAgICAgLnByb3BlcnR5Q2FsbChpc29sYXRlLCBtZXRob2ROYW1lLCBhcmd1bWVudHMpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICBpZiAoc2VsZWN0b3IuaXNHZXR0ZXIpIHsKICAgICAgcmVnaXN0ZXJHZXR0ZXIobm9kZSk7CiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmlzU2V0dGVyKSB7CiAgICAgIHJlZ2lzdGVyU2V0dGVyKG5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgcmVnaXN0ZXJNZXRob2RJbnZva2Uobm9kZSk7CiAgICB9CiAgICBfcmVnaXN0cnkucmVnaXN0ZXJVc2VJbnRlcmNlcHRvcigpOwogIH0KCiAgQWJzdHJhY3RWYWx1ZSBnZXRPcHRpbWl6ZWRTZWxlY3RvckZvcigKICAgICAgSEludm9rZUR5bmFtaWMgbm9kZSwgU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgbWFzaykgewogICAgaWYgKG5vZGUuZWxlbWVudCAhPSBudWxsKSB7CiAgICAgIC8vIENyZWF0ZSBhbiBhcnRpZmljaWFsIHR5cGUgbWFzayB0byBtYWtlIHN1cmUgb25seQogICAgICAvLyBbbm9kZS5lbGVtZW50XSB3aWxsIGJlIGVucXVldWVkLiBXZSdyZSBub3QgdXNpbmcgdGhlIHJlY2VpdmVyCiAgICAgIC8vIHR5cGUgYmVjYXVzZSBvdXIgb3B0aW1pemF0aW9ucyBtaWdodCBlbmQgdXAgaW4gYSBzdGF0ZSB3aGVyZSB0aGUKICAgICAgLy8gaW52b2tlIGR5bmFtaWMga25vd3MgbW9yZSB0aGFuIHRoZSByZWNlaXZlci4KICAgICAgQ2xhc3NFbnRpdHkgZW5jbG9zaW5nID0gbm9kZS5lbGVtZW50LmVuY2xvc2luZ0NsYXNzOwogICAgICBpZiAoX2Nsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmlzSW5zdGFudGlhdGVkKGVuY2xvc2luZykpIHsKICAgICAgICByZXR1cm4gX2Fic3RyYWN0VmFsdWVEb21haW4uY3JlYXRlTm9uTnVsbEV4YWN0KGVuY2xvc2luZyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgbWl4ZWQgaW4gc28gYSBub24tbnVsbCBzdWJ0eXBlIG1hc2sgaXMgdGhlIG1vc3QKICAgICAgICAvLyBwcmVjaXNlIHdlIGhhdmUuCiAgICAgICAgYXNzZXJ0KAogICAgICAgICAgICBfY2xvc2VkV29ybGQuaXNVc2VkQXNNaXhpbihlbmNsb3NpbmcpLAogICAgICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgICAgICAiRWxlbWVudCAke25vZGUuZWxlbWVudH0gZnJvbSAkZW5jbG9zaW5nIGV4cGVjdGVkICIKICAgICAgICAgICAgICAgICJ0byBiZSBtaXhlZCBpbi4iKSk7CiAgICAgICAgcmV0dXJuIF9hYnN0cmFjdFZhbHVlRG9tYWluLmNyZWF0ZU5vbk51bGxTdWJ0eXBlKGVuY2xvc2luZyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXNrID8/IF9hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlOwogIH0KCiAgdm9pZCByZWdpc3Rlck1ldGhvZEludm9rZShISW52b2tlRHluYW1pYyBub2RlKSB7CiAgICBTZWxlY3RvciBzZWxlY3RvciA9IG5vZGUuc2VsZWN0b3I7CgogICAgLy8gSWYgd2UgZG9uJ3Qga25vdyB3aGF0IHdlJ3JlIGNhbGxpbmcgb3IgaWYgd2UgYXJlIGNhbGxpbmcgYSBnZXR0ZXIsCiAgICAvLyB3ZSBuZWVkIHRvIHJlZ2lzdGVyIHRoYXQgZmFjdCB0aGF0IHdlIG1heSBiZSBjYWxsaW5nIGEgY2xvc3VyZQogICAgLy8gd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMuCiAgICBNZW1iZXJFbnRpdHkgdGFyZ2V0ID0gbm9kZS5lbGVtZW50OwogICAgaWYgKCh0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQuaXNHZXR0ZXIpICYmCiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMgd2hlbiBrZXJuZWwgYWRkcyBhbiBgaXNGdW5jdGlvbkNhbGxgCiAgICAgICAgLy8gZmxhZyB0byBbaXIuTWV0aG9kSW52b2NhdGlvbl0uIEN1cnJlbnRseSB3ZSBjYW4ndCB0ZWxsIHRoZSBkaWZmZXJlbmNlCiAgICAgICAgLy8gYmV0d2VlbiBhIGR5bmFtaWMgY2FsbCBhbmQgYSBmdW5jdGlvbiBjYWxsLCBidXQgd2UgYXQgbGVhc3Qga25vdyB0aGF0CiAgICAgICAgLy8gdG9TdHJpbmcgaXMgbm90IGEgZ2V0dGVyIChhIHBvdGVudGlhbCBmdW5jdGlvbiBjYWxsIHNob3VsZCBvdGhlcndpc2UKICAgICAgICAvLyBoYXZlIGJlZW4gcmVnaXN0ZXIgZm9yIHN0cmluZyBjb25jYXRlbmF0aW9uKS4KICAgICAgICBzZWxlY3RvciAhPSBTZWxlY3RvcnMudG9TdHJpbmdfKSB7CiAgICAgIC8vIFRPRE8oa2FzcGVybCk6IElmIHdlIGhhdmUgYSB0eXBlZCBzZWxlY3RvciBmb3IgdGhlIGNhbGwsIHdlCiAgICAgIC8vIG1heSBrbm93IHNvbWV0aGluZyBhYm91dCB0aGUgdHlwZXMgb2YgY2xvc3VyZXMgdGhhdCBuZWVkCiAgICAgIC8vIHRoZSBzcGVjaWZpYyBjbG9zdXJlIGNhbGwgbWV0aG9kLgogICAgICBTZWxlY3RvciBjYWxsID0gbmV3IFNlbGVjdG9yLmNhbGxDbG9zdXJlRnJvbShzZWxlY3Rvcik7CiAgICAgIF9yZWdpc3RyeS5yZWdpc3RlckR5bmFtaWNVc2UoCiAgICAgICAgICBuZXcgQ29uc3RyYWluZWREeW5hbWljVXNlKGNhbGwsIG51bGwsIG5vZGUudHlwZUFyZ3VtZW50cykpOwogICAgfQogICAgaWYgKHRhcmdldCAhPSBudWxsKSB7CiAgICAgIC8vIFRoaXMgaXMgYSBkeW5hbWljIGludm9jYXRpb24gd2hpY2ggd2UgaGF2ZSBmb3VuZCB0byBoYXZlIGEgc2luZ2xlCiAgICAgIC8vIHRhcmdldCBidXQgZm9yIHNvbWUgcmVhc29uIGhhdmVuJ3QgaW5saW5lZC4gV2UgYXJlIF9zdGlsbF8gYWNjZXNzaW5nCiAgICAgIC8vIHRoZSB0YXJnZXQgZHluYW1pY2FsbHkgYnV0IHdlIGRvbid0IG5lZWQgdG8gZW5xdWV1ZSBtb3JlIHRoYW4gdGFyZ2V0CiAgICAgIC8vIGZvciB0aGlzIHRvIHdvcmsuCiAgICAgIGFzc2VydChzZWxlY3Rvci5hcHBsaWVzKHRhcmdldCksCiAgICAgICAgICBmYWlsZWRBdChub2RlLCAnJHNlbGVjdG9yIGRvZXMgbm90IGFwcGx5IHRvICR0YXJnZXQnKSk7CiAgICAgIF9yZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLmRpcmVjdEludm9rZSgKICAgICAgICAgIHRhcmdldCwgc2VsZWN0b3IuY2FsbFN0cnVjdHVyZSwgbm9kZS50eXBlQXJndW1lbnRzKSk7CiAgICB9IGVsc2UgewogICAgICBBYnN0cmFjdFZhbHVlIG1hc2sgPSBnZXRPcHRpbWl6ZWRTZWxlY3RvckZvcihub2RlLCBzZWxlY3Rvciwgbm9kZS5tYXNrKTsKICAgICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyRHluYW1pY1VzZSgKICAgICAgICAgIG5ldyBDb25zdHJhaW5lZER5bmFtaWNVc2Uoc2VsZWN0b3IsIG1hc2ssIG5vZGUudHlwZUFyZ3VtZW50cykpOwogICAgfQogIH0KCiAgdm9pZCByZWdpc3RlclNldHRlcihISW52b2tlRHluYW1pYyBub2RlLCB7Ym9vbCBuZWVkc0NoZWNrOiBmYWxzZX0pIHsKICAgIGlmIChub2RlLmVsZW1lbnQgaXMgRmllbGRFbnRpdHkgJiYgIW5lZWRzQ2hlY2spIHsKICAgICAgLy8gVGhpcyBpcyBhIGR5bmFtaWMgdXBkYXRlIHdoaWNoIHdlIGhhdmUgZm91bmQgdG8gaGF2ZSBhIHNpbmdsZQogICAgICAvLyB0YXJnZXQgYnV0IGZvciBzb21lIHJlYXNvbiBoYXZlbid0IGlubGluZWQuIFdlIGFyZSBfc3RpbGxfIGFjY2Vzc2luZwogICAgICAvLyB0aGUgdGFyZ2V0IGR5bmFtaWNhbGx5IGJ1dCB3ZSBkb24ndCBuZWVkIHRvIGVucXVldWUgbW9yZSB0aGFuIHRhcmdldAogICAgICAvLyBmb3IgdGhpcyB0byB3b3JrLgogICAgICBfcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5kaXJlY3RTZXQobm9kZS5lbGVtZW50KSk7CiAgICB9IGVsc2UgewogICAgICBTZWxlY3RvciBzZWxlY3RvciA9IG5vZGUuc2VsZWN0b3I7CiAgICAgIEFic3RyYWN0VmFsdWUgbWFzayA9IGdldE9wdGltaXplZFNlbGVjdG9yRm9yKG5vZGUsIHNlbGVjdG9yLCBub2RlLm1hc2spOwogICAgICBfcmVnaXN0cnkucmVnaXN0ZXJEeW5hbWljVXNlKAogICAgICAgICAgbmV3IENvbnN0cmFpbmVkRHluYW1pY1VzZShzZWxlY3RvciwgbWFzaywgbm9kZS50eXBlQXJndW1lbnRzKSk7CiAgICB9CiAgfQoKICB2b2lkIHJlZ2lzdGVyR2V0dGVyKEhJbnZva2VEeW5hbWljIG5vZGUpIHsKICAgIGlmIChub2RlLmVsZW1lbnQgIT0gbnVsbCAmJgogICAgICAgIChub2RlLmVsZW1lbnQuaXNHZXR0ZXIgfHwgbm9kZS5lbGVtZW50LmlzRmllbGQpKSB7CiAgICAgIC8vIFRoaXMgaXMgYSBkeW5hbWljIHJlYWQgd2hpY2ggd2UgaGF2ZSBmb3VuZCB0byBoYXZlIGEgc2luZ2xlIHRhcmdldCBidXQKICAgICAgLy8gZm9yIHNvbWUgcmVhc29uIGhhdmVuJ3QgaW5saW5lZC4gV2UgYXJlIF9zdGlsbF8gYWNjZXNzaW5nIHRoZSB0YXJnZXQKICAgICAgLy8gZHluYW1pY2FsbHkgYnV0IHdlIGRvbid0IG5lZWQgdG8gZW5xdWV1ZSBtb3JlIHRoYW4gdGFyZ2V0IGZvciB0aGlzIHRvCiAgICAgIC8vIHdvcmsuIFRoZSB0ZXN0IGFib3ZlIGV4Y2x1ZGVzIG5vbi1nZXR0ZXIgZnVuY3Rpb25zIHNpbmNlIHRoZSBlbGVtZW50CiAgICAgIC8vIHJlcHJlc2VudHMgdHdvIHRhcmdldHMgLSBhIHRlYXJvZmYgZ2V0dGVyIGFuZCB0aGUgdG9ybi1vZmYgbWV0aG9kLgogICAgICBfcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5kaXJlY3RHZXQobm9kZS5lbGVtZW50KSk7CiAgICB9IGVsc2UgewogICAgICBTZWxlY3RvciBzZWxlY3RvciA9IG5vZGUuc2VsZWN0b3I7CiAgICAgIEFic3RyYWN0VmFsdWUgbWFzayA9IGdldE9wdGltaXplZFNlbGVjdG9yRm9yKG5vZGUsIHNlbGVjdG9yLCBub2RlLm1hc2spOwogICAgICBfcmVnaXN0cnkucmVnaXN0ZXJEeW5hbWljVXNlKAogICAgICAgICAgbmV3IENvbnN0cmFpbmVkRHluYW1pY1VzZShzZWxlY3RvciwgbWFzaywgbm9kZS50eXBlQXJndW1lbnRzKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEludm9rZUR5bmFtaWNTZXR0ZXIoSEludm9rZUR5bmFtaWNTZXR0ZXIgbm9kZSkgewogICAgdXNlKG5vZGUucmVjZWl2ZXIpOwogICAganMuTmFtZSBuYW1lID0gX25hbWVyLmludm9jYXRpb25OYW1lKG5vZGUuc2VsZWN0b3IpOwogICAgcHVzaChqcwogICAgICAgIC5wcm9wZXJ0eUNhbGwocG9wKCksIG5hbWUsIHZpc2l0QXJndW1lbnRzKG5vZGUuaW5wdXRzKSkKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgIHJlZ2lzdGVyU2V0dGVyKG5vZGUsIG5lZWRzQ2hlY2s6IG5vZGUubmVlZHNDaGVjayk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEludm9rZUR5bmFtaWNHZXR0ZXIoSEludm9rZUR5bmFtaWNHZXR0ZXIgbm9kZSkgewogICAgdXNlKG5vZGUucmVjZWl2ZXIpOwogICAganMuTmFtZSBuYW1lID0gX25hbWVyLmludm9jYXRpb25OYW1lKG5vZGUuc2VsZWN0b3IpOwogICAgcHVzaChqcwogICAgICAgIC5wcm9wZXJ0eUNhbGwocG9wKCksIG5hbWUsIHZpc2l0QXJndW1lbnRzKG5vZGUuaW5wdXRzKSkKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgIHJlZ2lzdGVyR2V0dGVyKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRJbnZva2VDbG9zdXJlKEhJbnZva2VDbG9zdXJlIG5vZGUpIHsKICAgIFNlbGVjdG9yIGNhbGwgPSBuZXcgU2VsZWN0b3IuY2FsbENsb3N1cmVGcm9tKG5vZGUuc2VsZWN0b3IpOwogICAgdXNlKG5vZGUucmVjZWl2ZXIpOwogICAgcHVzaChqcwogICAgICAgIC5wcm9wZXJ0eUNhbGwoCiAgICAgICAgICAgIHBvcCgpLCBfbmFtZXIuaW52b2NhdGlvbk5hbWUoY2FsbCksIHZpc2l0QXJndW1lbnRzKG5vZGUuaW5wdXRzKSkKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgIC8vIFRPRE8oa2FzcGVybCk6IElmIHdlIGhhdmUgYSB0eXBlZCBzZWxlY3RvciBmb3IgdGhlIGNhbGwsIHdlCiAgICAvLyBtYXkga25vdyBzb21ldGhpbmcgYWJvdXQgdGhlIHR5cGVzIG9mIGNsb3N1cmVzIHRoYXQgbmVlZAogICAgLy8gdGhlIHNwZWNpZmljIGNsb3N1cmUgY2FsbCBtZXRob2QuCiAgICBfcmVnaXN0cnkucmVnaXN0ZXJEeW5hbWljVXNlKAogICAgICAgIG5ldyBDb25zdHJhaW5lZER5bmFtaWNVc2UoY2FsbCwgbnVsbCwgbm9kZS50eXBlQXJndW1lbnRzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEludm9rZVN0YXRpYyhISW52b2tlU3RhdGljIG5vZGUpIHsKICAgIE1lbWJlckVudGl0eSBlbGVtZW50ID0gbm9kZS5lbGVtZW50OwogICAgbm9kZS5pbnN0YW50aWF0ZWRUeXBlcz8uZm9yRWFjaChfcmVnaXN0cnkucmVnaXN0ZXJJbnN0YW50aWF0aW9uKTsKCiAgICBMaXN0PGpzLkV4cHJlc3Npb24+IGFyZ3VtZW50cyA9IHZpc2l0QXJndW1lbnRzKG5vZGUuaW5wdXRzLCBzdGFydDogMCk7CgogICAgaWYgKGVsZW1lbnQgPT0gX2NvbW1vbkVsZW1lbnRzLmNoZWNrQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKSB7CiAgICAgIC8vIE1hbnVhbGx5IGlubGluZSB0aGUgW2NoZWNrQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yXSBmdW5jdGlvbi4gIFRoaXMKICAgICAgLy8gZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgZnJvbSBhIGZvci1sb29wIHVwZGF0ZS4gIElkZWFsbHkgd2Ugd291bGQganVzdAogICAgICAvLyBnZW5lcmF0ZSB0aGUgY29uZGl0aW9uYWxjb250cm9sIGZsb3cgaW4gdGhlIGJ1aWxkZXIgYnV0IGl0IGFkZHMgYmFzaWMKICAgICAgLy8gYmxvY2tzIGluIHRoZSBsb29wIHVwZGF0ZSB0aGF0IGludGVyZmVyZSB3aXRoIG90aGVyIG9wdGltaXphdGlvbnMgYW5kCiAgICAgIC8vIGNvbmZ1c2VzIGxvb3AgcmVjb2duaXRpb24uCgogICAgICBhc3NlcnQoYXJndW1lbnRzLmxlbmd0aCA9PSAyKTsKICAgICAgRnVuY3Rpb25FbnRpdHkgdGhyb3dGdW5jdGlvbiA9CiAgICAgICAgICBfY29tbW9uRWxlbWVudHMudGhyb3dDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3I7CiAgICAgIF9yZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZSgKICAgICAgICAgIG5ldyBTdGF0aWNVc2Uuc3RhdGljSW52b2tlKHRocm93RnVuY3Rpb24sIENhbGxTdHJ1Y3R1cmUuT05FX0FSRykpOwoKICAgICAgLy8gQ2FsbGluZyB1c2luZyBgKDAsICMpKCMpYCBpbnN0ZWFkIG9mIGAjKCMpYCBzZXBhcmF0ZXMgdGhlIHByb3BlcnR5IGxvYWQKICAgICAgLy8gb2YgdGhlIHN0YXRpYyBmdW5jdGlvbiBhY2Nlc3MgZnJvbSB0aGUgY2FsbC4gIEZvciBzb21lIHJlYXNvbiB0aGlzCiAgICAgIC8vIGhlbHBzIFY4IHNlZSB0aGF0IHRoZSBjYWxsIG5ldmVyIGhhcHBlbnMgc28gVjggbWFrZXMgdGhlIGNhbGwgYQogICAgICAvLyBkZW9wdGltaXphdGlvbi4gVGhpcyByZW1vdmVzIHRoZSBjYWxsIGZyb20gdGhlIG9wdGltaXplZCBsb29wLCBtYWtpbmcKICAgICAgLy8gbW9yZSBvcHRpbWl6YXRpb25zIGF2YWlsYWJsZSB0byB0aGUgbG9vcC4gIFRoaXMgZm9ybSBpcyA1MCUgZmFzdGVyIG9uCiAgICAgIC8vIHNvbWUgc21hbGwgbG9vcCwgYWxtb3N0IGFzIGZhc3QgYXMgbG9vcHMgd2l0aCBubyBjb25jdXJyZW50CiAgICAgIC8vIG1vZGlmaWNhdGlvbiBjaGVjay4KCiAgICAgIC8vIENyZWF0ZSBbcmlnaHRdIGFzIGEgc2VwYXJhdGUgSlMgbm9kZSB0byBnaXZlIHRoZSBjYWxsIGEgc291cmNlCiAgICAgIC8vIGxvY2F0aW9uLgogICAgICBqcy5FeHByZXNzaW9uIHJpZ2h0ID0ganMuanMoJygwLCAjKSgjKScsIFsKICAgICAgICBfZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2Vzcyh0aHJvd0Z1bmN0aW9uKSwKICAgICAgICBhcmd1bWVudHNbMV0KICAgICAgXSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogICAgICBwdXNoKGpzLmpzKCcjIHx8ICMnLCBbYXJndW1lbnRzWzBdLCByaWdodF0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbigKICAgICAgICAgIG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0gZWxzZSB7CiAgICAgIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSA9IG5ldyBDYWxsU3RydWN0dXJlLnVubmFtZWQoCiAgICAgICAgICBhcmd1bWVudHMubGVuZ3RoLCBub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoKTsKICAgICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyU3RhdGljVXNlKGVsZW1lbnQuaXNDb25zdHJ1Y3RvcgogICAgICAgICAgPyBuZXcgU3RhdGljVXNlLmNvbnN0cnVjdG9ySW52b2tlKGVsZW1lbnQsIGNhbGxTdHJ1Y3R1cmUpCiAgICAgICAgICA6IG5ldyBTdGF0aWNVc2Uuc3RhdGljSW52b2tlKAogICAgICAgICAgICAgIGVsZW1lbnQsIGNhbGxTdHJ1Y3R1cmUsIG5vZGUudHlwZUFyZ3VtZW50cykpOwogICAgICBwdXNoKF9lbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGVsZW1lbnQpKTsKICAgICAgcHVzaChuZXcganMuQ2FsbChwb3AoKSwgYXJndW1lbnRzLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0SW52b2tlU3VwZXIoSEludm9rZVN1cGVyIG5vZGUpIHsKICAgIE1lbWJlckVudGl0eSBzdXBlckVsZW1lbnQgPSBub2RlLmVsZW1lbnQ7CiAgICBDbGFzc0VudGl0eSBzdXBlckNsYXNzID0gc3VwZXJFbGVtZW50LmVuY2xvc2luZ0NsYXNzOwogICAgaWYgKHN1cGVyRWxlbWVudC5pc0ZpZWxkKSB7CiAgICAgIGpzLk5hbWUgZmllbGROYW1lID0gX25hbWVyLmluc3RhbmNlRmllbGRQcm9wZXJ0eU5hbWUoc3VwZXJFbGVtZW50KTsKICAgICAgdXNlKG5vZGUuaW5wdXRzWzBdKTsKICAgICAganMuUHJvcGVydHlBY2Nlc3MgYWNjZXNzID0gbmV3IGpzLlByb3BlcnR5QWNjZXNzKHBvcCgpLCBmaWVsZE5hbWUpCiAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogICAgICBpZiAobm9kZS5pc1NldHRlcikgewogICAgICAgIF9yZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZShzdXBlckVsZW1lbnQuaXNTZXR0ZXIKICAgICAgICAgICAgPyBuZXcgU3RhdGljVXNlLnN1cGVyU2V0dGVyU2V0KHN1cGVyRWxlbWVudCkKICAgICAgICAgICAgOiBuZXcgU3RhdGljVXNlLnN1cGVyRmllbGRTZXQoc3VwZXJFbGVtZW50KSk7CiAgICAgICAgdXNlKG5vZGUudmFsdWUpOwogICAgICAgIHB1c2gobmV3IGpzLkFzc2lnbm1lbnQoYWNjZXNzLCBwb3AoKSkKICAgICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3VwZXJHZXQoc3VwZXJFbGVtZW50KSk7CiAgICAgICAgcHVzaChhY2Nlc3MpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBTZWxlY3RvciBzZWxlY3RvciA9IG5vZGUuc2VsZWN0b3I7CiAgICAgIGlmICghX3N1cGVyTWVtYmVyRGF0YS5tYXliZVJlZ2lzdGVyQWxpYXNlZFN1cGVyTWVtYmVyKAogICAgICAgICAgc3VwZXJFbGVtZW50LCBzZWxlY3RvcikpIHsKICAgICAgICBqcy5OYW1lIG1ldGhvZE5hbWU7CiAgICAgICAgaWYgKHNlbGVjdG9yLmlzR2V0dGVyICYmICFzdXBlckVsZW1lbnQuaXNHZXR0ZXIpIHsKICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSB0ZWFyLW9mZiwgcmVnaXN0ZXIgdGhlIGZhY3QgdGhhdCBhIHRlYXItb2ZmIGNsb3N1cmUKICAgICAgICAgIC8vIHdpbGwgYmUgY3JlYXRlZCwgYW5kIHRoYXQgdGhpcyB0ZWFyLW9mZiBtdXN0IGJ5cGFzcyBvcmRpbmFyeQogICAgICAgICAgLy8gZGlzcGF0Y2ggdG8gZW5zdXJlIHRoZSBzdXBlciBtZXRob2QgaXMgaW52b2tlZC4KICAgICAgICAgIEZ1bmN0aW9uRW50aXR5IGhlbHBlciA9IF9jb21tb25FbGVtZW50cy5jbG9zdXJlRnJvbVRlYXJPZmY7CiAgICAgICAgICBfcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5zdGF0aWNJbnZva2UoCiAgICAgICAgICAgICAgaGVscGVyLAogICAgICAgICAgICAgIG5ldyBDYWxsU3RydWN0dXJlLnVubmFtZWQoCiAgICAgICAgICAgICAgICAgIG5vZGUuaW5wdXRzLmxlbmd0aCwgbm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aCksCiAgICAgICAgICAgICAgbm9kZS50eXBlQXJndW1lbnRzKSk7CiAgICAgICAgICBfcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5zdXBlclRlYXJPZmYobm9kZS5lbGVtZW50KSk7CiAgICAgICAgICBtZXRob2ROYW1lID0gX25hbWVyLmludm9jYXRpb25OYW1lKHNlbGVjdG9yKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbWV0aG9kTmFtZSA9IF9uYW1lci5pbnN0YW5jZU1ldGhvZE5hbWUoc3VwZXJFbGVtZW50KTsKICAgICAgICB9CiAgICAgICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3VwZXJJbnZva2UoCiAgICAgICAgICAgIHN1cGVyRWxlbWVudCwgbmV3IENhbGxTdHJ1Y3R1cmUudW5uYW1lZChub2RlLmlucHV0cy5sZW5ndGgpKSk7CiAgICAgICAgcHVzaChqcy5qcygnIy4jLmNhbGwoIyknLCBbCiAgICAgICAgICBfZW1pdHRlci5wcm90b3R5cGVBY2Nlc3Moc3VwZXJDbGFzcywgaGFzQmVlbkluc3RhbnRpYXRlZDogdHJ1ZSksCiAgICAgICAgICBtZXRob2ROYW1lLAogICAgICAgICAgdmlzaXRBcmd1bWVudHMobm9kZS5pbnB1dHMsIHN0YXJ0OiAwKQogICAgICAgIF0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdXNlKG5vZGUucmVjZWl2ZXIpOwogICAgICAgIF9yZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN1cGVySW52b2tlKAogICAgICAgICAgICBzdXBlckVsZW1lbnQsIG5ldyBDYWxsU3RydWN0dXJlLnVubmFtZWQobm9kZS5pbnB1dHMubGVuZ3RoIC0gMSkpKTsKICAgICAgICBwdXNoKGpzLmpzKCcjLiMoIyknLCBbCiAgICAgICAgICBwb3AoKSwKICAgICAgICAgIF9uYW1lci5hbGlhc2VkU3VwZXJNZW1iZXJQcm9wZXJ0eU5hbWUoc3VwZXJFbGVtZW50KSwKICAgICAgICAgIHZpc2l0QXJndW1lbnRzKG5vZGUuaW5wdXRzLCBzdGFydDogMSkKICAgICAgICBdKSAvLyBTa2lwIHJlY2VpdmVyIGFyZ3VtZW50LgogICAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGaWVsZEdldChIRmllbGRHZXQgbm9kZSkgewogICAgdXNlKG5vZGUucmVjZWl2ZXIpOwogICAgaWYgKG5vZGUuaXNOdWxsQ2hlY2spIHsKICAgICAgLy8gV2UgYWNjZXNzIGEgSmF2YVNjcmlwdCBtZW1iZXIgd2Uga25vdyBhbGwgb2JqZWN0cyBiZXNpZGVzCiAgICAgIC8vIG51bGwgYW5kIHVuZGVmaW5lZCBoYXZlOiBWOCBkb2VzIG5vdCBsaWtlIGFjY2Vzc2luZyBhIG1lbWJlcgogICAgICAvLyB0aGF0IGRvZXMgbm90IGV4aXN0LgogICAgICBwdXNoKG5ldyBqcy5Qcm9wZXJ0eUFjY2Vzcy5maWVsZChwb3AoKSwgJ3RvU3RyaW5nJykKICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfSBlbHNlIHsKICAgICAgRmllbGRFbnRpdHkgZmllbGQgPSBub2RlLmVsZW1lbnQ7CiAgICAgIGpzLk5hbWUgbmFtZSA9IF9uYW1lci5pbnN0YW5jZUZpZWxkUHJvcGVydHlOYW1lKGZpZWxkKTsKICAgICAgcHVzaChuZXcganMuUHJvcGVydHlBY2Nlc3MocG9wKCksIG5hbWUpCiAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2UuZmllbGRHZXQoZmllbGQpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0RmllbGRTZXQoSEZpZWxkU2V0IG5vZGUpIHsKICAgIEZpZWxkRW50aXR5IGVsZW1lbnQgPSBub2RlLmVsZW1lbnQ7CiAgICBfcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5maWVsZFNldChlbGVtZW50KSk7CiAgICBqcy5OYW1lIG5hbWUgPSBfbmFtZXIuaW5zdGFuY2VGaWVsZFByb3BlcnR5TmFtZShlbGVtZW50KTsKICAgIHVzZShub2RlLnJlY2VpdmVyKTsKICAgIGpzLkV4cHJlc3Npb24gcmVjZWl2ZXIgPSBwb3AoKTsKICAgIHVzZShub2RlLnZhbHVlKTsKICAgIHB1c2gobmV3IGpzLkFzc2lnbm1lbnQoCiAgICAgICAgICAgIG5ldyBqcy5Qcm9wZXJ0eUFjY2VzcyhyZWNlaXZlciwgbmFtZSkKICAgICAgICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbiksCiAgICAgICAgICAgIHBvcCgpKQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRHZXRMZW5ndGgoSEdldExlbmd0aCBub2RlKSB7CiAgICB1c2Uobm9kZS5yZWNlaXZlcik7CiAgICBwdXNoKG5ldyBqcy5Qcm9wZXJ0eUFjY2Vzcy5maWVsZChwb3AoKSwgJ2xlbmd0aCcpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFJlYWRNb2RpZnlXcml0ZShIUmVhZE1vZGlmeVdyaXRlIG5vZGUpIHsKICAgIEZpZWxkRW50aXR5IGVsZW1lbnQgPSBub2RlLmVsZW1lbnQ7CiAgICBfcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5maWVsZEdldChlbGVtZW50KSk7CiAgICBfcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5maWVsZFNldChlbGVtZW50KSk7CiAgICBqcy5OYW1lIG5hbWUgPSBfbmFtZXIuaW5zdGFuY2VGaWVsZFByb3BlcnR5TmFtZShlbGVtZW50KTsKICAgIHVzZShub2RlLnJlY2VpdmVyKTsKICAgIGpzLkV4cHJlc3Npb24gZmllbGRSZWZlcmVuY2UgPSBuZXcganMuUHJvcGVydHlBY2Nlc3MocG9wKCksIG5hbWUpOwogICAgaWYgKG5vZGUuaXNQcmVPcCkgewogICAgICBwdXNoKG5ldyBqcy5QcmVmaXgobm9kZS5qc09wLCBmaWVsZFJlZmVyZW5jZSkKICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfSBlbHNlIGlmIChub2RlLmlzUG9zdE9wKSB7CiAgICAgIHB1c2gobmV3IGpzLlBvc3RmaXgobm9kZS5qc09wLCBmaWVsZFJlZmVyZW5jZSkKICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfSBlbHNlIHsKICAgICAgdXNlKG5vZGUudmFsdWUpOwogICAgICBwdXNoKG5ldyBqcy5Bc3NpZ25tZW50LmNvbXBvdW5kKGZpZWxkUmVmZXJlbmNlLCBub2RlLmpzT3AsIHBvcCgpKQogICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdExvY2FsR2V0KEhMb2NhbEdldCBub2RlKSB7CiAgICB1c2Uobm9kZS5yZWNlaXZlcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdExvY2FsU2V0KEhMb2NhbFNldCBub2RlKSB7CiAgICB1c2Uobm9kZS52YWx1ZSk7CiAgICBhc3NpZ25WYXJpYWJsZSgKICAgICAgICB2YXJpYWJsZU5hbWVzLmdldE5hbWUobm9kZS5yZWNlaXZlciksIHBvcCgpLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJGb3JlaWduVHlwZXMoSEZvcmVpZ24gbm9kZSkgewogICAgTmF0aXZlQmVoYXZpb3IgbmF0aXZlQmVoYXZpb3IgPSBub2RlLm5hdGl2ZUJlaGF2aW9yOwogICAgaWYgKG5hdGl2ZUJlaGF2aW9yID09IG51bGwpIHJldHVybjsKICAgIF9uYXRpdmVFbnF1ZXVlci5yZWdpc3Rlck5hdGl2ZUJlaGF2aW9yKAogICAgICAgIF9yZWdpc3RyeS53b3JsZEltcGFjdCwgbmF0aXZlQmVoYXZpb3IsIG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGb3JlaWduQ29kZShIRm9yZWlnbkNvZGUgbm9kZSkgewogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cyA9IG5vZGUuaW5wdXRzOwogICAgaWYgKG5vZGUuaXNKc1N0YXRlbWVudCgpKSB7CiAgICAgIExpc3Q8anMuRXhwcmVzc2lvbj4gaW50ZXJwb2xhdGVkRXhwcmVzc2lvbnMgPSA8anMuRXhwcmVzc2lvbj5bXTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dHMubGVuZ3RoOyBpKyspIHsKICAgICAgICB1c2UoaW5wdXRzW2ldKTsKICAgICAgICBpbnRlcnBvbGF0ZWRFeHByZXNzaW9ucy5hZGQocG9wKCkpOwogICAgICB9CiAgICAgIHB1c2hTdGF0ZW1lbnQobm9kZS5jb2RlVGVtcGxhdGUKICAgICAgICAgIC5pbnN0YW50aWF0ZShpbnRlcnBvbGF0ZWRFeHByZXNzaW9ucykKICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfSBlbHNlIHsKICAgICAgTGlzdDxqcy5FeHByZXNzaW9uPiBpbnRlcnBvbGF0ZWRFeHByZXNzaW9ucyA9IDxqcy5FeHByZXNzaW9uPltdOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0cy5sZW5ndGg7IGkrKykgewogICAgICAgIHVzZShpbnB1dHNbaV0pOwogICAgICAgIGludGVycG9sYXRlZEV4cHJlc3Npb25zLmFkZChwb3AoKSk7CiAgICAgIH0KICAgICAgcHVzaChub2RlLmNvZGVUZW1wbGF0ZQogICAgICAgICAgLmluc3RhbnRpYXRlKGludGVycG9sYXRlZEV4cHJlc3Npb25zKQogICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9CgogICAgLy8gVE9ETyhzcmEpOiBUZWxsIHdvcmxkLm5hdGl2ZUVucXVldWVyIGFib3V0IHRoZSB0eXBlcyBjcmVhdGVkIGhlcmUuCiAgICByZWdpc3RlckZvcmVpZ25UeXBlcyhub2RlKTsKCiAgICBpZiAobm9kZS5mb3JlaWduRnVuY3Rpb24gIT0gbnVsbCkgewogICAgICBfcmVnaXN0cnk/LnJlZ2lzdGVyU3RhdGljVXNlKAogICAgICAgICAgbmV3IFN0YXRpY1VzZS5pbXBsaWNpdEludm9rZShub2RlLmZvcmVpZ25GdW5jdGlvbikpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDcmVhdGUoSENyZWF0ZSBub2RlKSB7CiAgICBqcy5FeHByZXNzaW9uIGpzQ2xhc3NSZWZlcmVuY2UgPSBfZW1pdHRlci5jb25zdHJ1Y3RvckFjY2Vzcyhub2RlLmVsZW1lbnQpOwogICAgTGlzdDxqcy5FeHByZXNzaW9uPiBhcmd1bWVudHMgPSB2aXNpdEFyZ3VtZW50cyhub2RlLmlucHV0cywgc3RhcnQ6IDApOwogICAgcHVzaChuZXcganMuTmV3KGpzQ2xhc3NSZWZlcmVuY2UsIGFyZ3VtZW50cykKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgIC8vIFdlIGFsc28gdXNlIEhDcmVhdGUgdG8gaW5zdGFudGlhdGUgY2xvc3VyZSBjbGFzc2VzIHRoYXQgYmVsb25nIHRvCiAgICAvLyBmdW5jdGlvbiBleHByZXNzaW9ucy4gV2UgaGF2ZSB0byByZWdpc3RlciB0aGVpciB1c2UgaGVyZSwgYXMgb3RoZXJ3aXNlCiAgICAvLyBjb2RlIGZvciB0aGVtIG1pZ2h0IG5vdCBiZSBlbWl0dGVkLgogICAgaWYgKG5vZGUuZWxlbWVudC5pc0Nsb3N1cmUpIHsKICAgICAgX3JlZ2lzdHJ5CiAgICAgICAgICAvLyBpZ25vcmU6ZGVwcmVjYXRlZF9tZW1iZXJfdXNlX2Zyb21fc2FtZV9wYWNrYWdlCiAgICAgICAgICAucmVnaXN0ZXJJbnN0YW50aWF0ZWRDbGFzcyhub2RlLmVsZW1lbnQpOwogICAgfQogICAgbm9kZS5pbnN0YW50aWF0ZWRUeXBlcz8uZm9yRWFjaChfcmVnaXN0cnkucmVnaXN0ZXJJbnN0YW50aWF0aW9uKTsKICAgIGlmIChub2RlLmNhbGxNZXRob2QgIT0gbnVsbCkgewogICAgICBfcmVnaXN0cnkKICAgICAgICAgID8ucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5pbXBsaWNpdEludm9rZShub2RlLmNhbGxNZXRob2QpKTsKICAgICAgX3JlZ2lzdHJ5Py5yZWdpc3Rlckluc3RhbnRpYXRlZENsb3N1cmUobm9kZS5jYWxsTWV0aG9kKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q3JlYXRlQm94KEhDcmVhdGVCb3ggbm9kZSkgewogICAgcHVzaChuZXcganMuT2JqZWN0SW5pdGlhbGl6ZXIoPGpzLlByb3BlcnR5PltdKSk7CiAgfQoKICBqcy5FeHByZXNzaW9uIG5ld0xpdGVyYWxCb29sKAogICAgICBib29sIHZhbHVlLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgaWYgKF9vcHRpb25zLmVuYWJsZU1pbmlmaWNhdGlvbikgewogICAgICAvLyBVc2UgITAgZm9yIHRydWUsICExIGZvciBmYWxzZS4KICAgICAgcmV0dXJuIG5ldyBqcy5QcmVmaXgoIiEiLCBuZXcganMuTGl0ZXJhbE51bWJlcih2YWx1ZSA/ICIwIiA6ICIxIikpCiAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcganMuTGl0ZXJhbEJvb2wodmFsdWUpLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CiAgfQoKICB2b2lkIGdlbmVyYXRlQ29uc3RhbnQoCiAgICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnQsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBqcy5FeHByZXNzaW9uIGV4cHJlc3Npb24gPSBfZW1pdHRlci5jb25zdGFudFJlZmVyZW5jZShjb25zdGFudCk7CiAgICBpZiAoIWNvbnN0YW50LmlzRHVtbXkpIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3VwcG9ydCBzb3VyY2UgaW5mb3JtYXRpb24gb24gc3ludGhldGljIGNvbnN0YW50cy4KICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24ud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0KICAgIHB1c2goZXhwcmVzc2lvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENvbnN0YW50KEhDb25zdGFudCBub2RlKSB7CiAgICBhc3NlcnQoaXNHZW5lcmF0ZUF0VXNlU2l0ZShub2RlKSk7CiAgICBnZW5lcmF0ZUNvbnN0YW50KG5vZGUuY29uc3RhbnQsIG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwoKICAgIF9yZWdpc3RyeS5yZWdpc3RlckNvbnN0YW50VXNlKG5ldyBDb25zdGFudFVzZS5saXRlcmFsKG5vZGUuY29uc3RhbnQpKTsKICAgIGlmIChub2RlLmNvbnN0YW50LmlzVHlwZSkgewogICAgICBUeXBlQ29uc3RhbnRWYWx1ZSB0eXBlQ29uc3RhbnQgPSBub2RlLmNvbnN0YW50OwogICAgICBfcmVnaXN0cnkucmVnaXN0ZXJUeXBlVXNlKAogICAgICAgICAgbmV3IFR5cGVVc2UuY29uc3RUeXBlTGl0ZXJhbCh0eXBlQ29uc3RhbnQucmVwcmVzZW50ZWRUeXBlKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdE5vdChITm90IG5vZGUpIHsKICAgIGFzc2VydChub2RlLmlucHV0cy5sZW5ndGggPT0gMSk7CiAgICBnZW5lcmF0ZU5vdChub2RlLmlucHV0c1swXSwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICBzdGF0aWMgU3RyaW5nIG1hcFJlbGF0aW9uYWxPcGVyYXRvcihTdHJpbmcgb3AsIGJvb2wgaW52ZXJzZSkgewogICAgTWFwPFN0cmluZywgU3RyaW5nPiBpbnZlcnNlT3BlcmF0b3IgPSBjb25zdCA8U3RyaW5nLCBTdHJpbmc+ewogICAgICAiPT0iOiAiIT0iLAogICAgICAiIT0iOiAiPT0iLAogICAgICAiPT09IjogIiE9PSIsCiAgICAgICIhPT0iOiAiPT09IiwKICAgICAgIjwiOiAiPj0iLAogICAgICAiPD0iOiAiPiIsCiAgICAgICI+IjogIjw9IiwKICAgICAgIj49IjogIjwiCiAgICB9OwogICAgcmV0dXJuIGludmVyc2UgPyBpbnZlcnNlT3BlcmF0b3Jbb3BdIDogb3A7CiAgfQoKICB2b2lkIGdlbmVyYXRlTm90KEhJbnN0cnVjdGlvbiBpbnB1dCwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIGJvb2wgY2FuR2VuZXJhdGVPcHRpbWl6ZWRDb21wYXJpc29uKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgICBpZiAoaW5zdHJ1Y3Rpb24gaXMhIEhSZWxhdGlvbmFsKSByZXR1cm4gZmFsc2U7CgogICAgICBIUmVsYXRpb25hbCByZWxhdGlvbmFsID0gaW5zdHJ1Y3Rpb247CgogICAgICBISW5zdHJ1Y3Rpb24gbGVmdCA9IHJlbGF0aW9uYWwubGVmdDsKICAgICAgSEluc3RydWN0aW9uIHJpZ2h0ID0gcmVsYXRpb25hbC5yaWdodDsKICAgICAgaWYgKGxlZnQuaXNTdHJpbmdPck51bGwoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICAgIHJpZ2h0LmlzU3RyaW5nT3JOdWxsKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KCiAgICAgIC8vIFRoaXMgb3B0aW1pemF0aW9uIGRvZXNuJ3Qgd29yayBmb3IgTmFOLCBzbyB3ZSBvbmx5IGRvIGl0IGlmIHRoZQogICAgICAvLyB0eXBlIGlzIGtub3duIHRvIGJlIGFuIGludGVnZXIuCiAgICAgIHJldHVybiBsZWZ0LmlzSW50ZWdlcihfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSAmJgogICAgICAgICAgcmlnaHQuaXNJbnRlZ2VyKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlOwogICAgfQoKICAgIGJvb2wgaGFuZGxlZEJ5U3BlY2lhbENhc2UgPSBmYWxzZTsKICAgIGlmIChpc0dlbmVyYXRlQXRVc2VTaXRlKGlucHV0KSkgewogICAgICBoYW5kbGVkQnlTcGVjaWFsQ2FzZSA9IHRydWU7CiAgICAgIGlmIChpbnB1dCBpcyBISXMpIHsKICAgICAgICBlbWl0SXMoaW5wdXQsICchPT0nLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIH0gZWxzZSBpZiAoaW5wdXQgaXMgSElzVmlhSW50ZXJjZXB0b3IpIHsKICAgICAgICBlbWl0SXNWaWFJbnRlcmNlcHRvcihpbnB1dCwgc291cmNlSW5mb3JtYXRpb24sIG5lZ2F0aXZlOiB0cnVlKTsKICAgICAgfSBlbHNlIGlmIChpbnB1dCBpcyBITm90KSB7CiAgICAgICAgdXNlKGlucHV0LmlucHV0c1swXSk7CiAgICAgIH0gZWxzZSBpZiAoaW5wdXQgaXMgSElkZW50aXR5KSB7CiAgICAgICAgZW1pdElkZW50aXR5Q29tcGFyaXNvbihpbnB1dCwgc291cmNlSW5mb3JtYXRpb24sIGludmVyc2U6IHRydWUpOwogICAgICB9IGVsc2UgaWYgKGlucHV0IGlzIEhCb29saWZ5KSB7CiAgICAgICAgdXNlKGlucHV0LmlucHV0c1swXSk7CiAgICAgICAgcHVzaChuZXcganMuQmluYXJ5KAogICAgICAgICAgICAgICAgIiE9PSIsIHBvcCgpLCBuZXdMaXRlcmFsQm9vbCh0cnVlLCBpbnB1dC5zb3VyY2VJbmZvcm1hdGlvbikpCiAgICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgfSBlbHNlIGlmIChjYW5HZW5lcmF0ZU9wdGltaXplZENvbXBhcmlzb24oaW5wdXQpKSB7CiAgICAgICAgSFJlbGF0aW9uYWwgcmVsYXRpb25hbCA9IGlucHV0OwogICAgICAgIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uID0gcmVsYXRpb25hbC5vcGVyYXRpb24oKTsKICAgICAgICBTdHJpbmcgb3AgPSBtYXBSZWxhdGlvbmFsT3BlcmF0b3Iob3BlcmF0aW9uLm5hbWUsIHRydWUpOwogICAgICAgIGhhbmRsZUludm9rZUJpbmFyeShpbnB1dCwgb3AsIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBoYW5kbGVkQnlTcGVjaWFsQ2FzZSA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICBpZiAoIWhhbmRsZWRCeVNwZWNpYWxDYXNlKSB7CiAgICAgIHVzZShpbnB1dCk7CiAgICAgIHB1c2gobmV3IGpzLlByZWZpeCgiISIsIHBvcCgpKS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0UGFyYW1ldGVyVmFsdWUoSFBhcmFtZXRlclZhbHVlIG5vZGUpIHsKICAgIGFzc2VydCghaXNHZW5lcmF0ZUF0VXNlU2l0ZShub2RlKSk7CiAgICBTdHJpbmcgbmFtZSA9IHZhcmlhYmxlTmFtZXMuZ2V0TmFtZShub2RlKTsKICAgIHBhcmFtZXRlcnMuYWRkKG5ldyBqcy5QYXJhbWV0ZXIobmFtZSkpOwogICAgZGVjbGFyZWRMb2NhbHMuYWRkKG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRMb2NhbFZhbHVlKEhMb2NhbFZhbHVlIG5vZGUpIHsKICAgIGFzc2VydCghaXNHZW5lcmF0ZUF0VXNlU2l0ZShub2RlKSk7CiAgICBTdHJpbmcgbmFtZSA9IHZhcmlhYmxlTmFtZXMuZ2V0TmFtZShub2RlKTsKICAgIGNvbGxlY3RlZFZhcmlhYmxlRGVjbGFyYXRpb25zLmFkZChuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0UGhpKEhQaGkgbm9kZSkgewogICAgLy8gVGhpcyBtZXRob2QgaXMgb25seSBjYWxsZWQgZm9yIHBoaXMgdGhhdCBhcmUgZ2VuZXJhdGVkIGF0IHVzZQogICAgLy8gc2l0ZS4gQSBwaGkgY2FuIGJlIGdlbmVyYXRlZCBhdCB1c2Ugc2l0ZSBvbmx5IGlmIGl0IGlzIHRoZQogICAgLy8gcmVzdWx0IG9mIGEgY29udHJvbCBmbG93IG9wZXJhdGlvbi4KICAgIEhCYXNpY0Jsb2NrIGlmQmxvY2sgPSBub2RlLmJsb2NrLmRvbWluYXRvcjsKICAgIGFzc2VydChjb250cm9sRmxvd09wZXJhdG9ycy5jb250YWlucyhpZkJsb2NrLmxhc3QpKTsKICAgIEhJbnN0cnVjdGlvbiBpbnB1dCA9IGlmQmxvY2subGFzdC5pbnB1dHNbMF07CiAgICBpZiAoaW5wdXQuaXNDb25zdGFudEZhbHNlKCkpIHsKICAgICAgdXNlKG5vZGUuaW5wdXRzWzFdKTsKICAgIH0gZWxzZSBpZiAoaW5wdXQuaXNDb25zdGFudFRydWUoKSkgewogICAgICB1c2Uobm9kZS5pbnB1dHNbMF0pOwogICAgfSBlbHNlIGlmIChub2RlLmlucHV0c1sxXS5pc0NvbnN0YW50Qm9vbGVhbigpKSB7CiAgICAgIFN0cmluZyBvcGVyYXRpb24gPSBub2RlLmlucHV0c1sxXS5pc0NvbnN0YW50RmFsc2UoKSA/ICcmJicgOiAnfHwnOwogICAgICBpZiAob3BlcmF0aW9uID09ICd8fCcpIHsKICAgICAgICBnZW5lcmF0ZU5vdChpbnB1dCwgaW5wdXQuc291cmNlSW5mb3JtYXRpb24pOwogICAgICB9IGVsc2UgewogICAgICAgIHVzZShpbnB1dCk7CiAgICAgIH0KICAgICAganMuRXhwcmVzc2lvbiBsZWZ0ID0gcG9wKCk7CiAgICAgIHVzZShub2RlLmlucHV0c1swXSk7CiAgICAgIHB1c2gobmV3IGpzLkJpbmFyeShvcGVyYXRpb24sIGxlZnQsIHBvcCgpKSk7CiAgICB9IGVsc2UgewogICAgICB1c2UoaW5wdXQpOwogICAgICBqcy5FeHByZXNzaW9uIHRlc3QgPSBwb3AoKTsKICAgICAgdXNlKG5vZGUuaW5wdXRzWzBdKTsKICAgICAganMuRXhwcmVzc2lvbiB0aGVuID0gcG9wKCk7CiAgICAgIHVzZShub2RlLmlucHV0c1sxXSk7CiAgICAgIHB1c2gobmV3IGpzLkNvbmRpdGlvbmFsKHRlc3QsIHRoZW4sIHBvcCgpKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFJldHVybihIUmV0dXJuIG5vZGUpIHsKICAgIGFzc2VydChub2RlLmlucHV0cy5sZW5ndGggPT0gMSk7CiAgICBISW5zdHJ1Y3Rpb24gaW5wdXQgPSBub2RlLmlucHV0c1swXTsKICAgIGlmIChpbnB1dC5pc0NvbnN0YW50TnVsbCgpKSB7CiAgICAgIHB1c2hTdGF0ZW1lbnQoCiAgICAgICAgICBuZXcganMuUmV0dXJuKCkud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0gZWxzZSB7CiAgICAgIHVzZShub2RlLmlucHV0c1swXSk7CiAgICAgIHB1c2hTdGF0ZW1lbnQoCiAgICAgICAgICBuZXcganMuUmV0dXJuKHBvcCgpKS53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRUaGlzKEhUaGlzIG5vZGUpIHsKICAgIHB1c2gobmV3IGpzLlRoaXMoKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFRocm93KEhUaHJvdyBub2RlKSB7CiAgICBpZiAobm9kZS5pc1JldGhyb3cpIHsKICAgICAgdXNlKG5vZGUuaW5wdXRzWzBdKTsKICAgICAgcHVzaFN0YXRlbWVudCgKICAgICAgICAgIG5ldyBqcy5UaHJvdyhwb3AoKSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0gZWxzZSB7CiAgICAgIGdlbmVyYXRlVGhyb3dXaXRoSGVscGVyKAogICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLndyYXBFeGNlcHRpb25IZWxwZXIsIG5vZGUuaW5wdXRzWzBdLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRBd2FpdChIQXdhaXQgbm9kZSkgewogICAgdXNlKG5vZGUuaW5wdXRzWzBdKTsKICAgIHB1c2gobmV3IGpzLkF3YWl0KHBvcCgpKS53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRZaWVsZChIWWllbGQgbm9kZSkgewogICAgdXNlKG5vZGUuaW5wdXRzWzBdKTsKICAgIHB1c2hTdGF0ZW1lbnQobmV3IGpzLkRhcnRZaWVsZChwb3AoKSwgbm9kZS5oYXNTdGFyKQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRSYW5nZUNvbnZlcnNpb24oSFJhbmdlQ29udmVyc2lvbiBub2RlKSB7CiAgICAvLyBSYW5nZSBjb252ZXJzaW9uIGluc3RydWN0aW9ucyBhcmUgcmVtb3ZlZCBieSB0aGUgdmFsdWUgcmFuZ2UKICAgIC8vIGFuYWx5emVyLgogICAgYXNzZXJ0KGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Qm91bmRzQ2hlY2soSEJvdW5kc0NoZWNrIG5vZGUpIHsKICAgIC8vIFRPRE8obmdlb2ZmcmF5KTogU2VwYXJhdGUgdGhlIHR3byBjaGVja3Mgb2YgdGhlIGJvdW5kcyBjaGVjaywgc28sCiAgICAvLyBlLmcuLCB0aGUgemVybyBjaGVja3MgY2FuIGJlIHNoYXJlZCBpZiBwb3NzaWJsZS4KCiAgICAvLyBJZiB0aGUgY2hlY2tzIGFsd2F5cyBzdWNjZWVkcywgd2Ugd291bGQgaGF2ZSByZW1vdmVkIHRoZSBib3VuZHMgY2hlY2sKICAgIC8vIGNvbXBsZXRlbHkuCiAgICBhc3NlcnQobm9kZS5zdGF0aWNDaGVja3MgIT0gSEJvdW5kc0NoZWNrLkFMV0FZU19UUlVFKTsKICAgIGlmIChub2RlLnN0YXRpY0NoZWNrcyAhPSBIQm91bmRzQ2hlY2suQUxXQVlTX0ZBTFNFKSB7CiAgICAgIGpzLkV4cHJlc3Npb24gdW5kZXI7CiAgICAgIGpzLkV4cHJlc3Npb24gb3ZlcjsKICAgICAgaWYgKG5vZGUuc3RhdGljQ2hlY2tzICE9IEhCb3VuZHNDaGVjay5BTFdBWVNfQUJPVkVfWkVSTykgewogICAgICAgIHVzZShub2RlLmluZGV4KTsKICAgICAgICBpZiAobm9kZS5pbmRleC5pc0ludGVnZXIoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICAgIHVuZGVyID0ganMuanMoIiMgPCAwIiwgcG9wKCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBqcy5FeHByZXNzaW9uIGpzSW5kZXggPSBwb3AoKTsKICAgICAgICAgIHVuZGVyID0ganMuanMoIiMgPj4+IDAgIT09ICMiLCBbanNJbmRleCwganNJbmRleF0pOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChub2RlLmluZGV4CiAgICAgICAgICAuaXNJbnRlZ2VyKF9hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgLmlzUG90ZW50aWFsbHlGYWxzZSkgewogICAgICAgIGNoZWNrSW50KG5vZGUuaW5kZXgsICchPT0nKTsKICAgICAgICB1bmRlciA9IHBvcCgpOwogICAgICB9CiAgICAgIGlmIChub2RlLnN0YXRpY0NoZWNrcyAhPSBIQm91bmRzQ2hlY2suQUxXQVlTX0JFTE9XX0xFTkdUSCkgewogICAgICAgIHZhciBpbmRleCA9IG5vZGUuaW5kZXg7CiAgICAgICAgdXNlKGluZGV4KTsKICAgICAgICBqcy5FeHByZXNzaW9uIGpzSW5kZXggPSBwb3AoKTsKICAgICAgICB1c2Uobm9kZS5sZW5ndGgpOwogICAgICAgIG92ZXIgPSBuZXcganMuQmluYXJ5KCI+PSIsIGpzSW5kZXgsIHBvcCgpKTsKICAgICAgfQogICAgICBhc3NlcnQob3ZlciAhPSBudWxsIHx8IHVuZGVyICE9IG51bGwpOwogICAgICBqcy5FeHByZXNzaW9uIHVuZGVyT3ZlciA9IHVuZGVyID09IG51bGwKICAgICAgICAgID8gb3ZlcgogICAgICAgICAgOiBvdmVyID09IG51bGwgPyB1bmRlciA6IG5ldyBqcy5CaW5hcnkoInx8IiwgdW5kZXIsIG92ZXIpOwogICAgICBqcy5TdGF0ZW1lbnQgdGhlbkJvZHkgPSBuZXcganMuQmxvY2suZW1wdHkoKTsKICAgICAganMuQmxvY2sgb2xkQ29udGFpbmVyID0gY3VycmVudENvbnRhaW5lcjsKICAgICAgY3VycmVudENvbnRhaW5lciA9IHRoZW5Cb2R5OwogICAgICBnZW5lcmF0ZVRocm93V2l0aEhlbHBlcihfY29tbW9uRWxlbWVudHMudGhyb3dJbmRleE91dE9mUmFuZ2VFeGNlcHRpb24sCiAgICAgICAgICBbbm9kZS5hcnJheSwgbm9kZS5yZXBvcnRlZEluZGV4XSwKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgY3VycmVudENvbnRhaW5lciA9IG9sZENvbnRhaW5lcjsKICAgICAgdGhlbkJvZHkgPSB1bndyYXBTdGF0ZW1lbnQodGhlbkJvZHkpOwogICAgICBwdXNoU3RhdGVtZW50KG5ldyBqcy5JZi5ub0Vsc2UodW5kZXJPdmVyLCB0aGVuQm9keSkKICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfSBlbHNlIHsKICAgICAgZ2VuZXJhdGVUaHJvd1dpdGhIZWxwZXIoX2NvbW1vbkVsZW1lbnRzLnRocm93SW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uLAogICAgICAgICAgW25vZGUuYXJyYXksIG5vZGUuaW5kZXhdKTsKICAgIH0KICB9CgogIHZvaWQgZ2VuZXJhdGVUaHJvd1dpdGhIZWxwZXIoRnVuY3Rpb25FbnRpdHkgaGVscGVyLCBhcmd1bWVudCwKICAgICAge1NvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9ufSkgewogICAganMuRXhwcmVzc2lvbiBqc0hlbHBlciA9IF9lbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGhlbHBlcik7CiAgICBMaXN0IGFyZ3VtZW50cyA9IDxqcy5FeHByZXNzaW9uPltdOwogICAgaWYgKGFyZ3VtZW50IGlzIExpc3QpIHsKICAgICAgYXJndW1lbnQuZm9yRWFjaCgoaW5zdHJ1Y3Rpb24pIHsKICAgICAgICB1c2UoaW5zdHJ1Y3Rpb24pOwogICAgICAgIGFyZ3VtZW50cy5hZGQocG9wKCkpOwogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIHVzZShhcmd1bWVudCk7CiAgICAgIGFyZ3VtZW50cy5hZGQocG9wKCkpOwogICAgfQogICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3RhdGljSW52b2tlKAogICAgICAgIGhlbHBlciwgbmV3IENhbGxTdHJ1Y3R1cmUudW5uYW1lZChhcmd1bWVudHMubGVuZ3RoKSkpOwogICAganMuQ2FsbCB2YWx1ZSA9IG5ldyBqcy5DYWxsKGpzSGVscGVyLCBhcmd1bWVudHMudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSksCiAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIC8vIEJVRyg0OTA2KTogVXNpbmcgdGhyb3cvcmV0dXJuIGhlcmUgYWRkcyB0byB0aGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUKICAgIC8vIGJ1dCBpdCBoYXMgdGhlIGFkdmFudGFnZSBvZiBleHBsaWNpdGx5IHRlbGxpbmcgdGhlIEpTIGVuZ2luZSB0aGF0CiAgICAvLyB0aGlzIGNvZGUgcGF0aCB3aWxsIHRlcm1pbmF0ZSBhYnJ1cHRseS4gTmVlZHMgbW9yZSB3b3JrLgogICAgaWYgKGhlbHBlciA9PSBfY29tbW9uRWxlbWVudHMud3JhcEV4Y2VwdGlvbkhlbHBlcikgewogICAgICBwdXNoU3RhdGVtZW50KAogICAgICAgICAgbmV3IGpzLlRocm93KHZhbHVlKS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2hTdGF0ZW1lbnQoCiAgICAgICAgICBuZXcganMuUmV0dXJuKHZhbHVlKS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0VGhyb3dFeHByZXNzaW9uKEhUaHJvd0V4cHJlc3Npb24gbm9kZSkgewogICAgSEluc3RydWN0aW9uIGFyZ3VtZW50ID0gbm9kZS5pbnB1dHNbMF07CiAgICB1c2UoYXJndW1lbnQpOwoKICAgIEZ1bmN0aW9uRW50aXR5IGhlbHBlciA9IF9jb21tb25FbGVtZW50cy50aHJvd0V4cHJlc3Npb25IZWxwZXI7CiAgICBfcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UoCiAgICAgICAgbmV3IFN0YXRpY1VzZS5zdGF0aWNJbnZva2UoaGVscGVyLCBDYWxsU3RydWN0dXJlLk9ORV9BUkcpKTsKCiAgICBqcy5FeHByZXNzaW9uIGpzSGVscGVyID0gX2VtaXR0ZXIuc3RhdGljRnVuY3Rpb25BY2Nlc3MoaGVscGVyKTsKICAgIGpzLkNhbGwgdmFsdWUgPSBuZXcganMuQ2FsbChqc0hlbHBlciwgW3BvcCgpXSkKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogICAgcHVzaCh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3dpdGNoKEhTd2l0Y2ggbm9kZSkgewogICAgLy8gU3dpdGNoZXMgYXJlIGhhbmRsZWQgdXNpbmcgW3Zpc2l0U3dpdGNoSW5mb10uCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RhdGljKEhTdGF0aWMgbm9kZSkgewogICAgTWVtYmVyRW50aXR5IGVsZW1lbnQgPSBub2RlLmVsZW1lbnQ7CiAgICBhc3NlcnQoZWxlbWVudC5pc0Z1bmN0aW9uIHx8IGVsZW1lbnQuaXNGaWVsZCk7CiAgICBpZiAoZWxlbWVudC5pc0Z1bmN0aW9uKSB7CiAgICAgIHB1c2goX2VtaXR0ZXIKICAgICAgICAgIC5pc29sYXRlU3RhdGljQ2xvc3VyZUFjY2VzcyhlbGVtZW50KQogICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICAgIF9yZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN0YXRpY1RlYXJPZmYoZWxlbWVudCkpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChfZW1pdHRlcgogICAgICAgICAgLnN0YXRpY0ZpZWxkQWNjZXNzKGVsZW1lbnQpCiAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3RhdGljR2V0KGVsZW1lbnQpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMYXp5U3RhdGljKEhMYXp5U3RhdGljIG5vZGUpIHsKICAgIEZpZWxkRW50aXR5IGVsZW1lbnQgPSBub2RlLmVsZW1lbnQ7CiAgICBfcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5zdGF0aWNJbml0KGVsZW1lbnQpKTsKICAgIGpzLkV4cHJlc3Npb24gbGF6eUdldHRlciA9IF9lbWl0dGVyLmlzb2xhdGVMYXp5SW5pdGlhbGl6ZXJBY2Nlc3MoZWxlbWVudCk7CiAgICBqcy5DYWxsIGNhbGwgPSBuZXcganMuQ2FsbChsYXp5R2V0dGVyLCA8anMuRXhwcmVzc2lvbj5bXSwKICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICBwdXNoKGNhbGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN0YXRpY1N0b3JlKEhTdGF0aWNTdG9yZSBub2RlKSB7CiAgICBfcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5zdGF0aWNTZXQobm9kZS5lbGVtZW50KSk7CiAgICBqcy5Ob2RlIHZhcmlhYmxlID0gX2VtaXR0ZXIuc3RhdGljRmllbGRBY2Nlc3Mobm9kZS5lbGVtZW50KTsKICAgIHVzZShub2RlLmlucHV0c1swXSk7CiAgICBwdXNoKG5ldyBqcy5Bc3NpZ25tZW50KHZhcmlhYmxlLCBwb3AoKSkKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdHJpbmdDb25jYXQoSFN0cmluZ0NvbmNhdCBub2RlKSB7CiAgICB1c2Uobm9kZS5sZWZ0KTsKICAgIGpzLkV4cHJlc3Npb24ganNMZWZ0ID0gcG9wKCk7CiAgICB1c2Uobm9kZS5yaWdodCk7CiAgICBwdXNoKG5ldyBqcy5CaW5hcnkoJysnLCBqc0xlZnQsIHBvcCgpKQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN0cmluZ2lmeShIU3RyaW5naWZ5IG5vZGUpIHsKICAgIEhJbnN0cnVjdGlvbiBpbnB1dCA9IG5vZGUuaW5wdXRzLmZpcnN0OwogICAgaWYgKGlucHV0LmlzU3RyaW5nKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHVzZShpbnB1dCk7CiAgICB9IGVsc2UgaWYgKGlucHV0LmlzSW50ZWdlcihfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSB8fAogICAgICAgIGlucHV0LmlzQm9vbGVhbihfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICAvLyBKYXZhU2NyaXB0J3MgKyBvcGVyYXRvciB3aXRoIGEgc3RyaW5nIGZvciB0aGUgbGVmdCBvcGVyYW5kIHdpbGwgY29udmVydAogICAgICAvLyB0aGUgcmlnaHQgb3BlcmFuZCB0byBhIHN0cmluZywgYW5kIHRoZSBjb252ZXJzaW9uIHJlc3VsdCBpcyBjb3JyZWN0LgogICAgICB1c2UoaW5wdXQpOwogICAgICBpZiAobm9kZS51c2VkQnkubGVuZ3RoID09IDEgJiYKICAgICAgICAgIG5vZGUudXNlZEJ5WzBdIGlzIEhTdHJpbmdDb25jYXQgJiYKICAgICAgICAgIG5vZGUudXNlZEJ5WzBdLmlucHV0c1sxXSA9PSBub2RlKSB7CiAgICAgICAgLy8gVGhlIGNvbnRleHQgaXMgYWxyZWFkeSA8c3RyaW5nPiArIHZhbHVlLgogICAgICB9IGVsc2UgewogICAgICAgIC8vIEZvcmNlIGFuIGVtcHR5IHN0cmluZyBmb3IgdGhlIGZpcnN0IG9wZXJhbmQuCiAgICAgICAgcHVzaChuZXcganMuQmluYXJ5KCcrJywganMuc3RyaW5nKCIiKSwgcG9wKCkpCiAgICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBGdW5jdGlvbkVudGl0eSBjb252ZXJ0VG9TdHJpbmcgPQogICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLnN0cmluZ0ludGVycG9sYXRpb25IZWxwZXI7CiAgICAgIF9yZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZSgKICAgICAgICAgIG5ldyBTdGF0aWNVc2Uuc3RhdGljSW52b2tlKGNvbnZlcnRUb1N0cmluZywgQ2FsbFN0cnVjdHVyZS5PTkVfQVJHKSk7CiAgICAgIGpzLkV4cHJlc3Npb24ganNIZWxwZXIgPSBfZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2Vzcyhjb252ZXJ0VG9TdHJpbmcpOwogICAgICB1c2UoaW5wdXQpOwogICAgICBwdXNoKG5ldyBqcy5DYWxsKGpzSGVscGVyLCA8anMuRXhwcmVzc2lvbj5bcG9wKCldLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaXRlcmFsTGlzdChITGl0ZXJhbExpc3Qgbm9kZSkgewogICAgX3JlZ2lzdHJ5CiAgICAgICAgLy8gaWdub3JlOmRlcHJlY2F0ZWRfbWVtYmVyX3VzZV9mcm9tX3NhbWVfcGFja2FnZQogICAgICAgIC5yZWdpc3Rlckluc3RhbnRpYXRlZENsYXNzKF9jb21tb25FbGVtZW50cy5saXN0Q2xhc3MpOwogICAgZ2VuZXJhdGVBcnJheUxpdGVyYWwobm9kZSk7CiAgfQoKICB2b2lkIGdlbmVyYXRlQXJyYXlMaXRlcmFsKEhMaXRlcmFsTGlzdCBub2RlKSB7CiAgICBMaXN0PGpzLkV4cHJlc3Npb24+IGVsZW1lbnRzID0gbm9kZS5pbnB1dHMubWFwKChISW5zdHJ1Y3Rpb24gaW5wdXQpIHsKICAgICAgdXNlKGlucHV0KTsKICAgICAgcmV0dXJuIHBvcCgpOwogICAgfSkudG9MaXN0KCk7CiAgICBwdXNoKG5ldyBqcy5BcnJheUluaXRpYWxpemVyKGVsZW1lbnRzKQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEluZGV4KEhJbmRleCBub2RlKSB7CiAgICB1c2Uobm9kZS5yZWNlaXZlcik7CiAgICBqcy5FeHByZXNzaW9uIHJlY2VpdmVyID0gcG9wKCk7CiAgICB1c2Uobm9kZS5pbmRleCk7CiAgICBwdXNoKG5ldyBqcy5Qcm9wZXJ0eUFjY2VzcyhyZWNlaXZlciwgcG9wKCkpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW5kZXhBc3NpZ24oSEluZGV4QXNzaWduIG5vZGUpIHsKICAgIHVzZShub2RlLnJlY2VpdmVyKTsKICAgIGpzLkV4cHJlc3Npb24gcmVjZWl2ZXIgPSBwb3AoKTsKICAgIHVzZShub2RlLmluZGV4KTsKICAgIGpzLkV4cHJlc3Npb24gaW5kZXggPSBwb3AoKTsKICAgIHVzZShub2RlLnZhbHVlKTsKICAgIHB1c2gobmV3IGpzLkFzc2lnbm1lbnQobmV3IGpzLlByb3BlcnR5QWNjZXNzKHJlY2VpdmVyLCBpbmRleCksIHBvcCgpKQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgdm9pZCBjaGVja0ludChISW5zdHJ1Y3Rpb24gaW5wdXQsIFN0cmluZyBjbXApIHsKICAgIHVzZShpbnB1dCk7CiAgICBqcy5FeHByZXNzaW9uIGxlZnQgPSBwb3AoKTsKICAgIHVzZShpbnB1dCk7CiAgICBqcy5FeHByZXNzaW9uIG9yMCA9IG5ldyBqcy5CaW5hcnkoInwiLCBwb3AoKSwgbmV3IGpzLkxpdGVyYWxOdW1iZXIoIjAiKSk7CiAgICBwdXNoKG5ldyBqcy5CaW5hcnkoY21wLCBsZWZ0LCBvcjApKTsKICB9CgogIHZvaWQgY2hlY2tCaWdJbnQoCiAgICAgIEhJbnN0cnVjdGlvbiBpbnB1dCwgU3RyaW5nIGNtcCwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIHVzZShpbnB1dCk7CiAgICBqcy5FeHByZXNzaW9uIGxlZnQgPSBwb3AoKTsKICAgIHVzZShpbnB1dCk7CiAgICBqcy5FeHByZXNzaW9uIHJpZ2h0ID0gcG9wKCk7CiAgICAvLyBUT0RPKDQ5ODQpOiBEZWFsIHdpdGggaW5maW5pdHkgYW5kIC0wLjAuCiAgICBqcy5FeHByZXNzaW9uIG1hdGhGbG9vckNhbGwgPSBqcy5qcygnTWF0aC5mbG9vcigjKScsCiAgICAgICAgPGpzLkV4cHJlc3Npb24+W2xlZnRdKS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pOwogICAgcHVzaChqcy5qcygnIyAkY21wICMnLCA8anMuRXhwcmVzc2lvbj5bCiAgICAgIG1hdGhGbG9vckNhbGwsCiAgICAgIHJpZ2h0CiAgICBdKS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICB9CgogIHZvaWQgY2hlY2tUeXBlT2YoSEluc3RydWN0aW9uIGlucHV0LCBTdHJpbmcgY21wLCBTdHJpbmcgdHlwZU5hbWUsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICB1c2UoaW5wdXQpOwogICAganMuRXhwcmVzc2lvbiB0eXBlT2YgPSBuZXcganMuUHJlZml4KCJ0eXBlb2YiLCBwb3AoKSk7CiAgICBwdXNoKG5ldyBqcy5CaW5hcnkoY21wLCB0eXBlT2YsIGpzLnN0cmluZyh0eXBlTmFtZSkpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgdm9pZCBjaGVja051bSgKICAgICAgSEluc3RydWN0aW9uIGlucHV0LCBTdHJpbmcgY21wLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgcmV0dXJuIGNoZWNrVHlwZU9mKGlucHV0LCBjbXAsICdudW1iZXInLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICB2b2lkIGNoZWNrRG91YmxlKAogICAgICBISW5zdHJ1Y3Rpb24gaW5wdXQsIFN0cmluZyBjbXAsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICByZXR1cm4gY2hlY2tOdW0oaW5wdXQsIGNtcCwgc291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgdm9pZCBjaGVja1N0cmluZygKICAgICAgSEluc3RydWN0aW9uIGlucHV0LCBTdHJpbmcgY21wLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgcmV0dXJuIGNoZWNrVHlwZU9mKGlucHV0LCBjbXAsICdzdHJpbmcnLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICB2b2lkIGNoZWNrQm9vbCgKICAgICAgSEluc3RydWN0aW9uIGlucHV0LCBTdHJpbmcgY21wLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgcmV0dXJuIGNoZWNrVHlwZU9mKGlucHV0LCBjbXAsICdib29sZWFuJywgc291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgdm9pZCBjaGVja09iamVjdCgKICAgICAgSEluc3RydWN0aW9uIGlucHV0LCBTdHJpbmcgY21wLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgYXNzZXJ0KE51bGxDb25zdGFudFZhbHVlLkpzTnVsbCA9PSAnbnVsbCcpOwogICAgaWYgKGNtcCA9PSAiPT09IikgewogICAgICBjaGVja1R5cGVPZihpbnB1dCwgJz09PScsICdvYmplY3QnLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIGpzLkV4cHJlc3Npb24gbGVmdCA9IHBvcCgpOwogICAgICB1c2UoaW5wdXQpOwogICAgICBqcy5FeHByZXNzaW9uIG5vdE51bGwgPSBuZXcganMuQmluYXJ5KCIhPT0iLCBwb3AoKSwgbmV3IGpzLkxpdGVyYWxOdWxsKCkpOwogICAgICBwdXNoKG5ldyBqcy5CaW5hcnkoIiYmIiwgbGVmdCwgbm90TnVsbCkKICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChjbXAgPT0gIiE9PSIpOwogICAgICBjaGVja1R5cGVPZihpbnB1dCwgJyE9PScsICdvYmplY3QnLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIGpzLkV4cHJlc3Npb24gbGVmdCA9IHBvcCgpOwogICAgICB1c2UoaW5wdXQpOwogICAgICBqcy5FeHByZXNzaW9uIGVxTnVsbCA9IG5ldyBqcy5CaW5hcnkoIj09PSIsIHBvcCgpLCBuZXcganMuTGl0ZXJhbE51bGwoKSk7CiAgICAgIHB1c2gobmV3IGpzLkJpbmFyeSgifHwiLCBsZWZ0LCBlcU51bGwpCiAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9CiAgfQoKICB2b2lkIGNoZWNrQXJyYXkoSEluc3RydWN0aW9uIGlucHV0LCBTdHJpbmcgY21wKSB7CiAgICB1c2UoaW5wdXQpOwogICAganMuUHJvcGVydHlBY2Nlc3MgY29uc3RydWN0b3IgPQogICAgICAgIG5ldyBqcy5Qcm9wZXJ0eUFjY2Vzcy5maWVsZChwb3AoKSwgJ2NvbnN0cnVjdG9yJyk7CiAgICBwdXNoKG5ldyBqcy5CaW5hcnkoY21wLCBjb25zdHJ1Y3RvciwgbmV3IGpzLlZhcmlhYmxlVXNlKCdBcnJheScpKSk7CiAgfQoKICB2b2lkIGNoZWNrRmllbGRFeGlzdHMoSEluc3RydWN0aW9uIGlucHV0LCBTdHJpbmcgZmllbGROYW1lKSB7CiAgICB1c2UoaW5wdXQpOwogICAganMuUHJvcGVydHlBY2Nlc3MgZmllbGQgPSBuZXcganMuUHJvcGVydHlBY2Nlc3MuZmllbGQocG9wKCksIGZpZWxkTmFtZSk7CiAgICAvLyBEb3VibGUgbmVnYXRlIHRvIGJvb2xpZnkgdGhlIHJlc3VsdC4KICAgIHB1c2gobmV3IGpzLlByZWZpeCgnIScsIG5ldyBqcy5QcmVmaXgoJyEnLCBmaWVsZCkpKTsKICB9CgogIHZvaWQgY2hlY2tGaWVsZERvZXNOb3RFeGlzdChISW5zdHJ1Y3Rpb24gaW5wdXQsIFN0cmluZyBmaWVsZE5hbWUpIHsKICAgIHVzZShpbnB1dCk7CiAgICBqcy5Qcm9wZXJ0eUFjY2VzcyBmaWVsZCA9IG5ldyBqcy5Qcm9wZXJ0eUFjY2Vzcy5maWVsZChwb3AoKSwgZmllbGROYW1lKTsKICAgIHB1c2gobmV3IGpzLlByZWZpeCgnIScsIGZpZWxkKSk7CiAgfQoKICB2b2lkIGNoZWNrSW1tdXRhYmxlQXJyYXkoSEluc3RydWN0aW9uIGlucHV0KSB7CiAgICBjaGVja0ZpZWxkRXhpc3RzKGlucHV0LCAnaW1tdXRhYmxlXCRsaXN0Jyk7CiAgfQoKICB2b2lkIGNoZWNrTXV0YWJsZUFycmF5KEhJbnN0cnVjdGlvbiBpbnB1dCkgewogICAgY2hlY2tGaWVsZERvZXNOb3RFeGlzdChpbnB1dCwgJ2ltbXV0YWJsZVwkbGlzdCcpOwogIH0KCiAgdm9pZCBjaGVja0V4dGVuZGFibGVBcnJheShISW5zdHJ1Y3Rpb24gaW5wdXQpIHsKICAgIGNoZWNrRmllbGREb2VzTm90RXhpc3QoaW5wdXQsICdmaXhlZFwkbGVuZ3RoJyk7CiAgfQoKICB2b2lkIGNoZWNrRml4ZWRBcnJheShISW5zdHJ1Y3Rpb24gaW5wdXQpIHsKICAgIGNoZWNrRmllbGRFeGlzdHMoaW5wdXQsICdmaXhlZFwkbGVuZ3RoJyk7CiAgfQoKICB2b2lkIGNoZWNrTnVsbChISW5zdHJ1Y3Rpb24gaW5wdXQpIHsKICAgIHVzZShpbnB1dCk7CiAgICBwdXNoKG5ldyBqcy5CaW5hcnkoJz09JywgcG9wKCksIG5ldyBqcy5MaXRlcmFsTnVsbCgpKSk7CiAgfQoKICB2b2lkIGNoZWNrTm9uTnVsbChISW5zdHJ1Y3Rpb24gaW5wdXQpIHsKICAgIHVzZShpbnB1dCk7CiAgICBwdXNoKG5ldyBqcy5CaW5hcnkoJyE9JywgcG9wKCksIG5ldyBqcy5MaXRlcmFsTnVsbCgpKSk7CiAgfQoKICB2b2lkIGNoZWNrVHlwZShISW5zdHJ1Y3Rpb24gaW5wdXQsIEhJbnN0cnVjdGlvbiBpbnRlcmNlcHRvciwgRGFydFR5cGUgdHlwZSwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIHtib29sIG5lZ2F0aXZlOiBmYWxzZX0pIHsKICAgIGlmICh0eXBlLmlzSW50ZXJmYWNlVHlwZSkgewogICAgICBJbnRlcmZhY2VUeXBlIGludGVyZmFjZVR5cGUgPSB0eXBlOwogICAgICBDbGFzc0VudGl0eSBlbGVtZW50ID0gaW50ZXJmYWNlVHlwZS5lbGVtZW50OwogICAgICBpZiAoZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMuanNBcnJheUNsYXNzKSB7CiAgICAgICAgY2hlY2tBcnJheShpbnB1dCwgbmVnYXRpdmUgPyAnIT09JyA6ICc9PT0nKTsKICAgICAgICByZXR1cm47CiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMuanNNdXRhYmxlQXJyYXlDbGFzcykgewogICAgICAgIGlmIChuZWdhdGl2ZSkgewogICAgICAgICAgY2hlY2tJbW11dGFibGVBcnJheShpbnB1dCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNoZWNrTXV0YWJsZUFycmF5KGlucHV0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPT0gX2NvbW1vbkVsZW1lbnRzLmpzRXh0ZW5kYWJsZUFycmF5Q2xhc3MpIHsKICAgICAgICBpZiAobmVnYXRpdmUpIHsKICAgICAgICAgIGNoZWNrRml4ZWRBcnJheShpbnB1dCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNoZWNrRXh0ZW5kYWJsZUFycmF5KGlucHV0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPT0gX2NvbW1vbkVsZW1lbnRzLmpzRml4ZWRBcnJheUNsYXNzKSB7CiAgICAgICAgaWYgKG5lZ2F0aXZlKSB7CiAgICAgICAgICBjaGVja0V4dGVuZGFibGVBcnJheShpbnB1dCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNoZWNrRml4ZWRBcnJheShpbnB1dCk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfSBlbHNlIGlmIChlbGVtZW50ID09IF9jb21tb25FbGVtZW50cy5qc1VubW9kaWZpYWJsZUFycmF5Q2xhc3MpIHsKICAgICAgICBpZiAobmVnYXRpdmUpIHsKICAgICAgICAgIGNoZWNrTXV0YWJsZUFycmF5KGlucHV0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY2hlY2tJbW11dGFibGVBcnJheShpbnB1dCk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgaWYgKGludGVyY2VwdG9yICE9IG51bGwpIHsKICAgICAgY2hlY2tUeXBlVmlhUHJvcGVydHkoaW50ZXJjZXB0b3IsIHR5cGUsIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICAgICAgbmVnYXRpdmU6IG5lZ2F0aXZlKTsKICAgIH0gZWxzZSB7CiAgICAgIGNoZWNrVHlwZVZpYVByb3BlcnR5KGlucHV0LCB0eXBlLCBzb3VyY2VJbmZvcm1hdGlvbiwgbmVnYXRpdmU6IG5lZ2F0aXZlKTsKICAgIH0KICB9CgogIHZvaWQgY2hlY2tUeXBlVmlhUHJvcGVydHkoCiAgICAgIEhJbnN0cnVjdGlvbiBpbnB1dCwgRGFydFR5cGUgdHlwZSwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIHtib29sIG5lZ2F0aXZlOiBmYWxzZX0pIHsKICAgIF9yZWdpc3RyeS5yZWdpc3RlclR5cGVVc2UobmV3IFR5cGVVc2UuaXNDaGVjayh0eXBlKSk7CgogICAgdXNlKGlucHV0KTsKCiAgICBqcy5Qcm9wZXJ0eUFjY2VzcyBmaWVsZCA9CiAgICAgICAgbmV3IGpzLlByb3BlcnR5QWNjZXNzKHBvcCgpLCBfbmFtZXIub3BlcmF0b3JJc1R5cGUodHlwZSkpCiAgICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pOwogICAgLy8gV2UgYWx3YXlzIG5lZ2F0ZSBhdCBsZWFzdCBvbmNlIHNvIHRoYXQgdGhlIHJlc3VsdCBpcyBib29saWZpZWQuCiAgICBwdXNoKG5ldyBqcy5QcmVmaXgoJyEnLCBmaWVsZCkud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIG5vdCBuZWdhdGVkLCBwdXQgYW5vdGhlciAnIScgaW4gZnJvbnQuCiAgICBpZiAoIW5lZ2F0aXZlKSB7CiAgICAgIHB1c2gobmV3IGpzLlByZWZpeCgnIScsIHBvcCgpKS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0KICB9CgogIHZvaWQgY2hlY2tUeXBlVmlhSW5zdGFuY2VvZihISW5zdHJ1Y3Rpb24gaW5wdXQsIEludGVyZmFjZVR5cGUgdHlwZSwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIHtib29sIG5lZ2F0aXZlOiBmYWxzZX0pIHsKICAgIF9yZWdpc3RyeS5yZWdpc3RlclR5cGVVc2UobmV3IFR5cGVVc2UuaW5zdGFuY2VDb25zdHJ1Y3Rvcih0eXBlKSk7CgogICAgdXNlKGlucHV0KTsKCiAgICBqcy5FeHByZXNzaW9uIGpzQ2xhc3NSZWZlcmVuY2UgPSBfZW1pdHRlci5jb25zdHJ1Y3RvckFjY2Vzcyh0eXBlLmVsZW1lbnQpOwogICAgcHVzaChqcy5qcygnIyBpbnN0YW5jZW9mICMnLAogICAgICAgIFtwb3AoKSwganNDbGFzc1JlZmVyZW5jZV0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgaWYgKG5lZ2F0aXZlKSB7CiAgICAgIHB1c2gobmV3IGpzLlByZWZpeCgnIScsIHBvcCgpKS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0KICB9CgogIHZvaWQgaGFuZGxlTnVtYmVyT3JTdHJpbmdTdXBlcnR5cGVDaGVjaygKICAgICAgSEluc3RydWN0aW9uIGlucHV0LAogICAgICBISW5zdHJ1Y3Rpb24gaW50ZXJjZXB0b3IsCiAgICAgIEludGVyZmFjZVR5cGUgdHlwZSwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIHtib29sIG5lZ2F0aXZlOiBmYWxzZX0pIHsKICAgIGFzc2VydCghaWRlbnRpY2FsKHR5cGUuZWxlbWVudCwgX2NvbW1vbkVsZW1lbnRzLmxpc3RDbGFzcykgJiYKICAgICAgICAhX2NvbW1vbkVsZW1lbnRzLmlzTGlzdFN1cGVydHlwZSh0eXBlLmVsZW1lbnQpICYmCiAgICAgICAgIV9jb21tb25FbGVtZW50cy5pc1N0cmluZ09ubHlTdXBlcnR5cGUodHlwZS5lbGVtZW50KSk7CiAgICBTdHJpbmcgcmVsYXRpb24gPSBuZWdhdGl2ZSA/ICchPT0nIDogJz09PSc7CiAgICBjaGVja051bShpbnB1dCwgcmVsYXRpb24sIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLkV4cHJlc3Npb24gbnVtYmVyVGVzdCA9IHBvcCgpOwogICAgY2hlY2tTdHJpbmcoaW5wdXQsIHJlbGF0aW9uLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBqcy5FeHByZXNzaW9uIHN0cmluZ1Rlc3QgPSBwb3AoKTsKICAgIGNoZWNrT2JqZWN0KGlucHV0LCByZWxhdGlvbiwgc291cmNlSW5mb3JtYXRpb24pOwogICAganMuRXhwcmVzc2lvbiBvYmplY3RUZXN0ID0gcG9wKCk7CiAgICBjaGVja1R5cGUoaW5wdXQsIGludGVyY2VwdG9yLCB0eXBlLCBzb3VyY2VJbmZvcm1hdGlvbiwgbmVnYXRpdmU6IG5lZ2F0aXZlKTsKICAgIFN0cmluZyBjb21iaW5lciA9IG5lZ2F0aXZlID8gJyYmJyA6ICd8fCc7CiAgICBTdHJpbmcgY29tYmluZXIyID0gbmVnYXRpdmUgPyAnfHwnIDogJyYmJzsKICAgIHB1c2gobmV3IGpzLkJpbmFyeSgKICAgICAgICAgICAgY29tYmluZXIsCiAgICAgICAgICAgIG5ldyBqcy5CaW5hcnkoY29tYmluZXIsIG51bWJlclRlc3QsIHN0cmluZ1Rlc3QpCiAgICAgICAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKSwKICAgICAgICAgICAgbmV3IGpzLkJpbmFyeShjb21iaW5lcjIsIG9iamVjdFRlc3QsIHBvcCgpKQogICAgICAgICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgdm9pZCBoYW5kbGVTdHJpbmdTdXBlcnR5cGVDaGVjayhISW5zdHJ1Y3Rpb24gaW5wdXQsIEhJbnN0cnVjdGlvbiBpbnRlcmNlcHRvciwKICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAge2Jvb2wgbmVnYXRpdmU6IGZhbHNlfSkgewogICAgYXNzZXJ0KCFpZGVudGljYWwodHlwZS5lbGVtZW50LCBfY29tbW9uRWxlbWVudHMubGlzdENsYXNzKSAmJgogICAgICAgICFfY29tbW9uRWxlbWVudHMuaXNMaXN0U3VwZXJ0eXBlKHR5cGUuZWxlbWVudCkgJiYKICAgICAgICAhX2NvbW1vbkVsZW1lbnRzLmlzTnVtYmVyT3JTdHJpbmdTdXBlcnR5cGUodHlwZS5lbGVtZW50KSk7CiAgICBTdHJpbmcgcmVsYXRpb24gPSBuZWdhdGl2ZSA/ICchPT0nIDogJz09PSc7CiAgICBjaGVja1N0cmluZyhpbnB1dCwgcmVsYXRpb24sIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLkV4cHJlc3Npb24gc3RyaW5nVGVzdCA9IHBvcCgpOwogICAgY2hlY2tPYmplY3QoaW5wdXQsIHJlbGF0aW9uLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBqcy5FeHByZXNzaW9uIG9iamVjdFRlc3QgPSBwb3AoKTsKICAgIGNoZWNrVHlwZShpbnB1dCwgaW50ZXJjZXB0b3IsIHR5cGUsIHNvdXJjZUluZm9ybWF0aW9uLCBuZWdhdGl2ZTogbmVnYXRpdmUpOwogICAgU3RyaW5nIGNvbWJpbmVyID0gbmVnYXRpdmUgPyAnfHwnIDogJyYmJzsKICAgIHB1c2gobmV3IGpzLkJpbmFyeShuZWdhdGl2ZSA/ICcmJicgOiAnfHwnLCBzdHJpbmdUZXN0LAogICAgICAgIG5ldyBqcy5CaW5hcnkoY29tYmluZXIsIG9iamVjdFRlc3QsIHBvcCgpKSkpOwogIH0KCiAgdm9pZCBoYW5kbGVMaXN0T3JTdXBlcnR5cGVDaGVjayhISW5zdHJ1Y3Rpb24gaW5wdXQsIEhJbnN0cnVjdGlvbiBpbnRlcmNlcHRvciwKICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAge2Jvb2wgbmVnYXRpdmU6IGZhbHNlfSkgewogICAgYXNzZXJ0KCFpZGVudGljYWwodHlwZS5lbGVtZW50LCBfY29tbW9uRWxlbWVudHMuc3RyaW5nQ2xhc3MpICYmCiAgICAgICAgIV9jb21tb25FbGVtZW50cy5pc1N0cmluZ09ubHlTdXBlcnR5cGUodHlwZS5lbGVtZW50KSAmJgogICAgICAgICFfY29tbW9uRWxlbWVudHMuaXNOdW1iZXJPclN0cmluZ1N1cGVydHlwZSh0eXBlLmVsZW1lbnQpKTsKICAgIFN0cmluZyByZWxhdGlvbiA9IG5lZ2F0aXZlID8gJyE9PScgOiAnPT09JzsKICAgIGNoZWNrT2JqZWN0KGlucHV0LCByZWxhdGlvbiwgc291cmNlSW5mb3JtYXRpb24pOwogICAganMuRXhwcmVzc2lvbiBvYmplY3RUZXN0ID0gcG9wKCk7CiAgICBjaGVja0FycmF5KGlucHV0LCByZWxhdGlvbik7CiAgICBqcy5FeHByZXNzaW9uIGFycmF5VGVzdCA9IHBvcCgpOwogICAgY2hlY2tUeXBlKGlucHV0LCBpbnRlcmNlcHRvciwgdHlwZSwgc291cmNlSW5mb3JtYXRpb24sIG5lZ2F0aXZlOiBuZWdhdGl2ZSk7CiAgICBTdHJpbmcgY29tYmluZXIgPSBuZWdhdGl2ZSA/ICcmJicgOiAnfHwnOwogICAgcHVzaChuZXcganMuQmluYXJ5KG5lZ2F0aXZlID8gJ3x8JyA6ICcmJicsIG9iamVjdFRlc3QsCiAgICAgICAgICAgIG5ldyBqcy5CaW5hcnkoY29tYmluZXIsIGFycmF5VGVzdCwgcG9wKCkpKQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJcyhISXMgbm9kZSkgewogICAgZW1pdElzKG5vZGUsICI9PT0iLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJc1ZpYUludGVyY2VwdG9yKEhJc1ZpYUludGVyY2VwdG9yIG5vZGUpIHsKICAgIGVtaXRJc1ZpYUludGVyY2VwdG9yKG5vZGUsIG5vZGUuc291cmNlSW5mb3JtYXRpb24sIG5lZ2F0aXZlOiBmYWxzZSk7CiAgfQoKICB2b2lkIGVtaXRJcyhISXMgbm9kZSwgU3RyaW5nIHJlbGF0aW9uLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgRGFydFR5cGUgdHlwZSA9IG5vZGUudHlwZUV4cHJlc3Npb247CiAgICBfcmVnaXN0cnkucmVnaXN0ZXJUeXBlVXNlKG5ldyBUeXBlVXNlLmlzQ2hlY2sodHlwZSkpOwogICAgSEluc3RydWN0aW9uIGlucHV0ID0gbm9kZS5leHByZXNzaW9uOwoKICAgIC8vIElmIHRoaXMgaXMgY2hhbmdlZCB0byBzaW5nbGUgPT0gdGhlcmUgYXJlIHNldmVyYWwgcGxhY2VzIGJlbG93IHRoYXQgbXVzdAogICAgLy8gYmUgY2hhbmdlZCB0byBtYXRjaC4KICAgIGFzc2VydChyZWxhdGlvbiA9PSAnPT09JyB8fCByZWxhdGlvbiA9PSAnIT09Jyk7CiAgICBib29sIG5lZ2F0aXZlID0gcmVsYXRpb24gPT0gJyE9PSc7CgogICAgaWYgKG5vZGUuaXNWYXJpYWJsZUNoZWNrIHx8IG5vZGUuaXNDb21wb3VuZENoZWNrKSB7CiAgICAgIHVzZShub2RlLmNoZWNrQ2FsbCk7CiAgICAgIGlmIChuZWdhdGl2ZSkgcHVzaChuZXcganMuUHJlZml4KCchJywgcG9wKCkpKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChub2RlLmlzUmF3Q2hlY2spOwogICAgICBISW5zdHJ1Y3Rpb24gaW50ZXJjZXB0b3IgPSBub2RlLmludGVyY2VwdG9yOwogICAgICBJbnRlcmZhY2VUeXBlIGludGVyZmFjZVR5cGUgPSB0eXBlOwogICAgICBDbGFzc0VudGl0eSBlbGVtZW50ID0gaW50ZXJmYWNlVHlwZS5lbGVtZW50OwogICAgICBpZiAoZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMubnVsbENsYXNzKSB7CiAgICAgICAgaWYgKG5lZ2F0aXZlKSB7CiAgICAgICAgICBjaGVja05vbk51bGwoaW5wdXQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjaGVja051bGwoaW5wdXQpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChlbGVtZW50ID09CiAgICAgICAgICBfY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MgLyogfHwgdHlwZS50cmVhdEFzRHluYW1pYyovKSB7CiAgICAgICAgLy8gVGhlIGNvbnN0YW50IGZvbGRlciBhbHNvIGRvZXMgdGhpcyBvcHRpbWl6YXRpb24sIGJ1dCB3ZSBtYWtlCiAgICAgICAgLy8gaXQgc2FmZSBieSBhc3N1bWluZyBpdCBtYXkgaGF2ZSBub3QgcnVuLgogICAgICAgIHB1c2gobmV3TGl0ZXJhbEJvb2woIW5lZ2F0aXZlLCBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPT0gX2NvbW1vbkVsZW1lbnRzLnN0cmluZ0NsYXNzKSB7CiAgICAgICAgY2hlY2tTdHJpbmcoaW5wdXQsIHJlbGF0aW9uLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMuZG91YmxlQ2xhc3MpIHsKICAgICAgICBjaGVja0RvdWJsZShpbnB1dCwgcmVsYXRpb24sIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgfSBlbHNlIGlmIChlbGVtZW50ID09IF9jb21tb25FbGVtZW50cy5udW1DbGFzcykgewogICAgICAgIGNoZWNrTnVtKGlucHV0LCByZWxhdGlvbiwgc291cmNlSW5mb3JtYXRpb24pOwogICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPT0gX2NvbW1vbkVsZW1lbnRzLmJvb2xDbGFzcykgewogICAgICAgIGNoZWNrQm9vbChpbnB1dCwgcmVsYXRpb24sIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgfSBlbHNlIGlmIChlbGVtZW50ID09IF9jb21tb25FbGVtZW50cy5pbnRDbGFzcykgewogICAgICAgIC8vIFRoZSBpcyBjaGVjayBpbiB0aGUgY29kZSB0ZWxscyB1cyB0aGF0IGl0IG1pZ2h0IG5vdCBiZSBhbgogICAgICAgIC8vIGludC4gU28gd2UgZG8gYSB0eXBlb2YgZmlyc3QgdG8gYXZvaWQgcG9zc2libGUKICAgICAgICAvLyBkZW9wdGltaXphdGlvbnMgb24gdGhlIEpTIGVuZ2luZSBkdWUgdG8gdGhlIE1hdGguZmxvb3IgY2hlY2suCiAgICAgICAgY2hlY2tOdW0oaW5wdXQsIHJlbGF0aW9uLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgICAganMuRXhwcmVzc2lvbiBudW1UZXN0ID0gcG9wKCk7CiAgICAgICAgY2hlY2tCaWdJbnQoaW5wdXQsIHJlbGF0aW9uLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgICAgcHVzaChuZXcganMuQmluYXJ5KG5lZ2F0aXZlID8gJ3x8JyA6ICcmJicsIG51bVRlc3QsIHBvcCgpKQogICAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICAgIH0gZWxzZSBpZiAobm9kZS51c2VJbnN0YW5jZU9mKSB7CiAgICAgICAgYXNzZXJ0KGludGVyY2VwdG9yID09IG51bGwpOwogICAgICAgIGNoZWNrVHlwZVZpYUluc3RhbmNlb2YoaW5wdXQsIHR5cGUsIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICAgICAgICBuZWdhdGl2ZTogbmVnYXRpdmUpOwogICAgICB9IGVsc2UgaWYgKF9jb21tb25FbGVtZW50cy5pc051bWJlck9yU3RyaW5nU3VwZXJ0eXBlKGVsZW1lbnQpKSB7CiAgICAgICAgaGFuZGxlTnVtYmVyT3JTdHJpbmdTdXBlcnR5cGVDaGVjaygKICAgICAgICAgICAgaW5wdXQsIGludGVyY2VwdG9yLCB0eXBlLCBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgICAgICAgbmVnYXRpdmU6IG5lZ2F0aXZlKTsKICAgICAgfSBlbHNlIGlmIChfY29tbW9uRWxlbWVudHMuaXNTdHJpbmdPbmx5U3VwZXJ0eXBlKGVsZW1lbnQpKSB7CiAgICAgICAgaGFuZGxlU3RyaW5nU3VwZXJ0eXBlQ2hlY2soaW5wdXQsIGludGVyY2VwdG9yLCB0eXBlLCBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgICAgICAgbmVnYXRpdmU6IG5lZ2F0aXZlKTsKICAgICAgfSBlbHNlIGlmIChlbGVtZW50ID09IF9jb21tb25FbGVtZW50cy5saXN0Q2xhc3MgfHwKICAgICAgICAgIF9jb21tb25FbGVtZW50cy5pc0xpc3RTdXBlcnR5cGUoZWxlbWVudCkpIHsKICAgICAgICBoYW5kbGVMaXN0T3JTdXBlcnR5cGVDaGVjayhpbnB1dCwgaW50ZXJjZXB0b3IsIHR5cGUsIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICAgICAgICBuZWdhdGl2ZTogbmVnYXRpdmUpOwogICAgICB9IGVsc2UgaWYgKHR5cGUuaXNGdW5jdGlvblR5cGUpIHsKICAgICAgICBjaGVja1R5cGUoaW5wdXQsIGludGVyY2VwdG9yLCB0eXBlLCBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgICAgICAgbmVnYXRpdmU6IG5lZ2F0aXZlKTsKICAgICAgfSBlbHNlIGlmICgoaW5wdXQuaXNQcmltaXRpdmUoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzUG90ZW50aWFsbHlUcnVlICYmCiAgICAgICAgICAgICAgaW5wdXQuaXNQcmltaXRpdmVBcnJheShfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5RmFsc2UpIHx8CiAgICAgICAgICBpbnB1dC5pc051bGwoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzUG90ZW50aWFsbHlUcnVlKSB7CiAgICAgICAgY2hlY2tPYmplY3QoaW5wdXQsIHJlbGF0aW9uLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgICBqcy5FeHByZXNzaW9uIG9iamVjdFRlc3QgPSBwb3AoKTsKICAgICAgICBjaGVja1R5cGUoaW5wdXQsIGludGVyY2VwdG9yLCB0eXBlLCBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgICAgICAgbmVnYXRpdmU6IG5lZ2F0aXZlKTsKICAgICAgICBwdXNoKG5ldyBqcy5CaW5hcnkobmVnYXRpdmUgPyAnfHwnIDogJyYmJywgb2JqZWN0VGVzdCwgcG9wKCkpCiAgICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjaGVja1R5cGUoaW5wdXQsIGludGVyY2VwdG9yLCB0eXBlLCBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgICAgICAgbmVnYXRpdmU6IG5lZ2F0aXZlKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBlbWl0SXNWaWFJbnRlcmNlcHRvcigKICAgICAgSElzVmlhSW50ZXJjZXB0b3Igbm9kZSwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIHtib29sIG5lZ2F0aXZlOiBmYWxzZX0pIHsKICAgIGNoZWNrVHlwZVZpYVByb3BlcnR5KAogICAgICAgIG5vZGUuaW50ZXJjZXB0b3IsIG5vZGUudHlwZUV4cHJlc3Npb24sIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICAgIG5lZ2F0aXZlOiBuZWdhdGl2ZSk7CiAgfQoKICBqcy5FeHByZXNzaW9uIGdlbmVyYXRlUmVjZWl2ZXJPckFyZ3VtZW50VHlwZVRlc3QoSFR5cGVDb252ZXJzaW9uIG5vZGUpIHsKICAgIERhcnRUeXBlIHR5cGUgPSBub2RlLnR5cGVFeHByZXNzaW9uOwogICAgSEluc3RydWN0aW9uIGlucHV0ID0gbm9kZS5jaGVja2VkSW5wdXQ7CiAgICBBYnN0cmFjdFZhbHVlIGNoZWNrZWRUeXBlID0gbm9kZS5jaGVja2VkVHlwZTsKICAgIC8vIFRoaXMgcGF0aCBpcyBubyBsb25nZXIgdXNlZCBmb3IgaW5kZXhhYmxlIHByaW1pdGl2ZSB0eXBlcy4KICAgIGFzc2VydChfYWJzdHJhY3RWYWx1ZURvbWFpbi5pc0pzSW5kZXhhYmxlKGNoZWNrZWRUeXBlKS5pc1BvdGVudGlhbGx5RmFsc2UpOwogICAgLy8gRmlndXJlIG91dCBpZiBpdCBpcyBiZW5lZmljaWFsIHRvIHVzZSBhIG51bGwgY2hlY2suICBWOCBnZW5lcmFsbHkgcHJlZmVycwogICAgLy8gJ3R5cGVvZicgY2hlY2tzLCBidXQgZm9yIGludGVnZXJzIHdlIGNhbm5vdCBjb21waWxlIHRoaXMgdGVzdCBpbnRvIGEKICAgIC8vIHNpbmdsZSB0eXBlb2YgY2hlY2sgc28gdGhlIG51bGwgY2hlY2sgaXMgY2hlYXBlci4KICAgIGlmICh0eXBlID09IF9jb21tb25FbGVtZW50cy5udW1UeXBlKSB7CiAgICAgIC8vIGlucHV0IGlzICFudW0KICAgICAgY2hlY2tOdW0oaW5wdXQsICchPT0nLCBpbnB1dC5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIHJldHVybiBwb3AoKTsKICAgIH0gZWxzZSBpZiAodHlwZSA9PSBfY29tbW9uRWxlbWVudHMuYm9vbFR5cGUpIHsKICAgICAgLy8gaW5wdXQgaXMgIWJvb2wKICAgICAgY2hlY2tCb29sKGlucHV0LCAnIT09JywgaW5wdXQuc291cmNlSW5mb3JtYXRpb24pOwogICAgICByZXR1cm4gcG9wKCk7CiAgICB9CiAgICB0aHJvdyBmYWlsZWRBdChpbnB1dCwgJ1VuZXhwZWN0ZWQgY2hlY2s6ICR0eXBlLicpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVDb252ZXJzaW9uKEhUeXBlQ29udmVyc2lvbiBub2RlKSB7CiAgICBpZiAobm9kZS5pc0FyZ3VtZW50VHlwZUNoZWNrIHx8IG5vZGUuaXNSZWNlaXZlclR5cGVDaGVjaykgewogICAgICBqcy5FeHByZXNzaW9uIHRlc3QgPSBnZW5lcmF0ZVJlY2VpdmVyT3JBcmd1bWVudFR5cGVUZXN0KG5vZGUpOwogICAgICBqcy5CbG9jayBvbGRDb250YWluZXIgPSBjdXJyZW50Q29udGFpbmVyOwogICAgICBqcy5TdGF0ZW1lbnQgYm9keSA9IG5ldyBqcy5CbG9jay5lbXB0eSgpOwogICAgICBjdXJyZW50Q29udGFpbmVyID0gYm9keTsKICAgICAgaWYgKG5vZGUuaXNBcmd1bWVudFR5cGVDaGVjaykgewogICAgICAgIGdlbmVyYXRlVGhyb3dXaXRoSGVscGVyKAogICAgICAgICAgICBfY29tbW9uRWxlbWVudHMudGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIG5vZGUuY2hlY2tlZElucHV0LAogICAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIH0gZWxzZSBpZiAobm9kZS5pc1JlY2VpdmVyVHlwZUNoZWNrKSB7CiAgICAgICAgdXNlKG5vZGUuY2hlY2tlZElucHV0KTsKICAgICAgICBqcy5OYW1lIG1ldGhvZE5hbWUgPQogICAgICAgICAgICBfbmFtZXIuaW52b2NhdGlvbk5hbWUobm9kZS5yZWNlaXZlclR5cGVDaGVja1NlbGVjdG9yKTsKICAgICAgICBqcy5FeHByZXNzaW9uIGNhbGwgPSBqcy5wcm9wZXJ0eUNhbGwocG9wKCksIG1ldGhvZE5hbWUsCiAgICAgICAgICAgIFtdKS53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgICAgcHVzaFN0YXRlbWVudCgKICAgICAgICAgICAgbmV3IGpzLlJldHVybihjYWxsKS53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICB9CiAgICAgIGN1cnJlbnRDb250YWluZXIgPSBvbGRDb250YWluZXI7CiAgICAgIGJvZHkgPSB1bndyYXBTdGF0ZW1lbnQoYm9keSk7CiAgICAgIHB1c2hTdGF0ZW1lbnQobmV3IGpzLklmLm5vRWxzZSh0ZXN0LCBib2R5KQogICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBhc3NlcnQobm9kZS5pc0NoZWNrZWRNb2RlQ2hlY2sgfHwgbm9kZS5pc0Nhc3RUeXBlQ2hlY2spOwogICAgRGFydFR5cGUgdHlwZSA9IG5vZGUudHlwZUV4cHJlc3Npb247CiAgICBhc3NlcnQoIXR5cGUuaXNUeXBlZGVmKTsKICAgIGFzc2VydCghdHlwZS5pc0R5bmFtaWMpOwogICAgYXNzZXJ0KCF0eXBlLmlzVm9pZCk7CiAgICBpZiAodHlwZS5pc0Z1bmN0aW9uVHlwZSkgewogICAgICAvLyBUT0RPKDUwMjIpOiBXZSBjdXJyZW50bHkgZ2VuZXJhdGUgJGlzRnVuY3Rpb24gY2hlY2tzIGZvcgogICAgICAvLyBmdW5jdGlvbiB0eXBlcy4KICAgICAgX3JlZ2lzdHJ5CiAgICAgICAgICAucmVnaXN0ZXJUeXBlVXNlKG5ldyBUeXBlVXNlLmlzQ2hlY2soX2NvbW1vbkVsZW1lbnRzLmZ1bmN0aW9uVHlwZSkpOwogICAgfQogICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyVHlwZVVzZShuZXcgVHlwZVVzZS5pc0NoZWNrKHR5cGUpKTsKCiAgICBDaGVja2VkTW9kZUhlbHBlciBoZWxwZXI7CiAgICBpZiAobm9kZS5pc0Jvb2xlYW5Db252ZXJzaW9uQ2hlY2spIHsKICAgICAgaGVscGVyID0gY29uc3QgQ2hlY2tlZE1vZGVIZWxwZXIoJ2Jvb2xDb252ZXJzaW9uQ2hlY2snKTsKICAgIH0gZWxzZSB7CiAgICAgIGhlbHBlciA9IF9jaGVja2VkTW9kZUhlbHBlcnMuZ2V0Q2hlY2tlZE1vZGVIZWxwZXIoCiAgICAgICAgICB0eXBlLCBfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMsCiAgICAgICAgICB0eXBlQ2FzdDogbm9kZS5pc0Nhc3RUeXBlQ2hlY2spOwogICAgfQoKICAgIFN0YXRpY1VzZSBzdGF0aWNVc2UgPSBoZWxwZXIuZ2V0U3RhdGljVXNlKF9jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cyk7CiAgICBfcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2Uoc3RhdGljVXNlKTsKICAgIExpc3Q8anMuRXhwcmVzc2lvbj4gYXJndW1lbnRzID0gPGpzLkV4cHJlc3Npb24+W107CiAgICB1c2Uobm9kZS5jaGVja2VkSW5wdXQpOwogICAgYXJndW1lbnRzLmFkZChwb3AoKSk7CiAgICBoZWxwZXIuZ2VuZXJhdGVBZGRpdGlvbmFsQXJndW1lbnRzKHRoaXMsIF9uYW1lciwgbm9kZSwgYXJndW1lbnRzKTsKICAgIHB1c2goCiAgICAgICAgbmV3IGpzLkNhbGwoX2VtaXR0ZXIuc3RhdGljRnVuY3Rpb25BY2Nlc3Moc3RhdGljVXNlLmVsZW1lbnQpLCBhcmd1bWVudHMpCiAgICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVLbm93bihIVHlwZUtub3duIG5vZGUpIHsKICAgIC8vIFtIVHlwZUtub3duXSBpbnN0cnVjdGlvbnMgYXJlIHJlbW92ZWQgYmVmb3JlIGdlbmVyYXRpbmcgY29kZS4KICAgIGFzc2VydChmYWxzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZUluZm9SZWFkUmF3KEhUeXBlSW5mb1JlYWRSYXcgbm9kZSkgewogICAgdXNlKG5vZGUuaW5wdXRzWzBdKTsKICAgIGpzLkV4cHJlc3Npb24gcmVjZWl2ZXIgPSBwb3AoKTsKICAgIHB1c2goanMuanMocicjLiMnLCBbcmVjZWl2ZXIsIF9uYW1lci5ydGlGaWVsZEpzTmFtZV0pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlSW5mb1JlYWRWYXJpYWJsZShIVHlwZUluZm9SZWFkVmFyaWFibGUgbm9kZSkgewogICAgVHlwZVZhcmlhYmxlRW50aXR5IGVsZW1lbnQgPSBub2RlLnZhcmlhYmxlLmVsZW1lbnQ7CiAgICBpbnQgaW5kZXggPSBlbGVtZW50LmluZGV4OwoKICAgIGpzLkV4cHJlc3Npb24gaW50ZXJjZXB0b3I7CiAgICBpZiAobm9kZS5pc0ludGVyY2VwdGVkKSB7CiAgICAgIHVzZShub2RlLmludGVyY2VwdG9yKTsKICAgICAgaW50ZXJjZXB0b3IgPSBwb3AoKTsKICAgIH0KICAgIEhJbnN0cnVjdGlvbiBvYmplY3QgPSBub2RlLm9iamVjdDsKICAgIHVzZShvYmplY3QpOwogICAganMuRXhwcmVzc2lvbiByZWNlaXZlciA9IHBvcCgpOwoKICAgIGlmICh0eXBlVmFyaWFibGVBY2Nlc3NOZWVkc1N1YnN0aXR1dGlvbihlbGVtZW50LCBvYmplY3QuaW5zdHJ1Y3Rpb25UeXBlKSkgewogICAgICBqcy5FeHByZXNzaW9uIHR5cGVOYW1lID0KICAgICAgICAgIGpzLnF1b3RlTmFtZShfbmFtZXIucnVudGltZVR5cGVOYW1lKGVsZW1lbnQudHlwZURlY2xhcmF0aW9uKSk7CiAgICAgIGlmIChub2RlLmlzSW50ZXJjZXB0ZWQpIHsKICAgICAgICBGdW5jdGlvbkVudGl0eSBoZWxwZXJFbGVtZW50ID0KICAgICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmdldFJ1bnRpbWVUeXBlQXJndW1lbnRJbnRlcmNlcHRlZDsKICAgICAgICBfcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UoCiAgICAgICAgICAgIG5ldyBTdGF0aWNVc2Uuc3RhdGljSW52b2tlKGhlbHBlckVsZW1lbnQsIENhbGxTdHJ1Y3R1cmUuRk9VUl9BUkdTKSk7CiAgICAgICAganMuRXhwcmVzc2lvbiBoZWxwZXIgPSBfZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2VzcyhoZWxwZXJFbGVtZW50KTsKICAgICAgICBwdXNoKGpzLmpzKHInIygjLCAjLCAjLCAjKScsIFsKICAgICAgICAgIGhlbHBlciwKICAgICAgICAgIGludGVyY2VwdG9yLAogICAgICAgICAgcmVjZWl2ZXIsCiAgICAgICAgICB0eXBlTmFtZSwKICAgICAgICAgIGpzLmpzLm51bWJlcihpbmRleCkKICAgICAgICBdKS53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICB9IGVsc2UgewogICAgICAgIEZ1bmN0aW9uRW50aXR5IGhlbHBlckVsZW1lbnQgPSBfY29tbW9uRWxlbWVudHMuZ2V0UnVudGltZVR5cGVBcmd1bWVudDsKICAgICAgICBfcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5zdGF0aWNJbnZva2UoCiAgICAgICAgICAgIGhlbHBlckVsZW1lbnQsIENhbGxTdHJ1Y3R1cmUuVEhSRUVfQVJHUykpOwogICAgICAgIGpzLkV4cHJlc3Npb24gaGVscGVyID0gX2VtaXR0ZXIuc3RhdGljRnVuY3Rpb25BY2Nlc3MoaGVscGVyRWxlbWVudCk7CiAgICAgICAgcHVzaChqcy5qcyhyJyMoIywgIywgIyknLCBbCiAgICAgICAgICBoZWxwZXIsCiAgICAgICAgICByZWNlaXZlciwKICAgICAgICAgIHR5cGVOYW1lLAogICAgICAgICAganMuanMubnVtYmVyKGluZGV4KQogICAgICAgIF0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIEZ1bmN0aW9uRW50aXR5IGhlbHBlckVsZW1lbnQgPSBfY29tbW9uRWxlbWVudHMuZ2V0VHlwZUFyZ3VtZW50QnlJbmRleDsKICAgICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyU3RhdGljVXNlKAogICAgICAgICAgbmV3IFN0YXRpY1VzZS5zdGF0aWNJbnZva2UoaGVscGVyRWxlbWVudCwgQ2FsbFN0cnVjdHVyZS5UV09fQVJHUykpOwogICAgICBqcy5FeHByZXNzaW9uIGhlbHBlciA9IF9lbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGhlbHBlckVsZW1lbnQpOwogICAgICBwdXNoKGpzLmpzKHInIygjLCAjKScsIFsKICAgICAgICBoZWxwZXIsCiAgICAgICAgcmVjZWl2ZXIsCiAgICAgICAganMuanMubnVtYmVyKGluZGV4KQogICAgICBdKS53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVJbmZvRXhwcmVzc2lvbihIVHlwZUluZm9FeHByZXNzaW9uIG5vZGUpIHsKICAgIERhcnRUeXBlIHR5cGUgPSBub2RlLmRhcnRUeXBlOwogICAgaWYgKG5vZGUuaXNUeXBlVmFyaWFibGVSZXBsYWNlbWVudCkgewogICAgICBfcmVnaXN0cnkucmVnaXN0ZXJUeXBlVXNlKG5ldyBUeXBlVXNlLnR5cGVBcmd1bWVudCh0eXBlKSk7CiAgICB9CgogICAgTGlzdDxqcy5FeHByZXNzaW9uPiBhcmd1bWVudHMgPSA8anMuRXhwcmVzc2lvbj5bXTsKICAgIGZvciAoSEluc3RydWN0aW9uIGlucHV0IGluIG5vZGUuaW5wdXRzKSB7CiAgICAgIHVzZShpbnB1dCk7CiAgICAgIGFyZ3VtZW50cy5hZGQocG9wKCkpOwogICAgfQoKICAgIHN3aXRjaCAobm9kZS5raW5kKSB7CiAgICAgIGNhc2UgVHlwZUluZm9FeHByZXNzaW9uS2luZC5DT01QTEVURToKICAgICAgICBpbnQgaW5kZXggPSAwOwogICAgICAgIGpzLkV4cHJlc3Npb24gcmVzdWx0ID0gX3J0aUVuY29kZXIuZ2V0VHlwZVJlcHJlc2VudGF0aW9uKAogICAgICAgICAgICBfZW1pdHRlci5lbWl0dGVyLAogICAgICAgICAgICB0eXBlLAogICAgICAgICAgICAoVHlwZVZhcmlhYmxlVHlwZSB2YXJpYWJsZSkgPT4gYXJndW1lbnRzW2luZGV4KytdKTsKICAgICAgICBhc3NlcnQoCiAgICAgICAgICAgIGluZGV4ID09IG5vZGUuaW5wdXRzLmxlbmd0aCwKICAgICAgICAgICAgIk5vdCBhbGwgaW5wdXQgaXMgcmVhZCBmb3IgdHlwZSAke3R5cGV9OiAiCiAgICAgICAgICAgICIkaW5kZXggb2YgJHtub2RlLmlucHV0c30uIik7CiAgICAgICAgcHVzaChyZXN1bHQpOwogICAgICAgIHJldHVybjsKCiAgICAgIGNhc2UgVHlwZUluZm9FeHByZXNzaW9uS2luZC5JTlNUQU5DRToKICAgICAgICAvLyBXZSBleHBlY3Qgb25seSBmbGF0IHR5cGVzIGZvciB0aGUgSU5TVEFOQ0UgcmVwcmVzZW50YXRpb24uCiAgICAgICAgYXNzZXJ0KAogICAgICAgICAgICAodHlwZSBhcyBJbnRlcmZhY2VUeXBlKS50eXBlQXJndW1lbnRzLmxlbmd0aCA9PSBhcmd1bWVudHMubGVuZ3RoKTsKICAgICAgICBfcmVnaXN0cnkKICAgICAgICAgICAgLy8gaWdub3JlOmRlcHJlY2F0ZWRfbWVtYmVyX3VzZV9mcm9tX3NhbWVfcGFja2FnZQogICAgICAgICAgICAucmVnaXN0ZXJJbnN0YW50aWF0ZWRDbGFzcyhfY29tbW9uRWxlbWVudHMubGlzdENsYXNzKTsKICAgICAgICBwdXNoKG5ldyBqcy5BcnJheUluaXRpYWxpemVyKGFyZ3VtZW50cykKICAgICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9CiAgfQoKICBib29sIHR5cGVWYXJpYWJsZUFjY2Vzc05lZWRzU3Vic3RpdHV0aW9uKAogICAgICBUeXBlVmFyaWFibGVFbnRpdHkgZWxlbWVudCwgQWJzdHJhY3RWYWx1ZSByZWNlaXZlck1hc2spIHsKICAgIENsYXNzRW50aXR5IGNscyA9IGVsZW1lbnQudHlwZURlY2xhcmF0aW9uOwoKICAgIC8vIFNlZSBpZiB0aGUgcmVjZWl2ZXIgdHlwZSBuYXJyb3dzIHRoZSBzZXQgb2YgY2xhc3NlcyB0byBvbmVzIHRoYXQgY2FuIGJlCiAgICAvLyBpbmRleGVkLgogICAgLy8gVE9ETyhzcmEpOiBDdXJyZW50bHkgdGhlIG9ubHkgY29udmVuaWVudCBxdWVyeSBpcyBbc2luZ2xlQ2xhc3NdLiBXZQogICAgLy8gc2hvdWxkIGl0ZXJhdGUgb3ZlciBhbGwgdGhlIGNvbmNyZXRlIGNsYXNzZXMgaW4gW3JlY2VpdmVyTWFza10uCiAgICBDbGFzc0VudGl0eSByZWNlaXZlckNsYXNzID0KICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRFeGFjdENsYXNzKHJlY2VpdmVyTWFzayk7CiAgICBpZiAocmVjZWl2ZXJDbGFzcyAhPSBudWxsKSB7CiAgICAgIGlmIChfcnRpU3Vic3RpdHV0aW9ucy5pc1RyaXZpYWxTdWJzdGl0dXRpb24ocmVjZWl2ZXJDbGFzcywgY2xzKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIGlmIChfY2xvc2VkV29ybGQuaXNVc2VkQXNNaXhpbihjbHMpKSByZXR1cm4gdHJ1ZTsKCiAgICByZXR1cm4gX2Nsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmFueVN0cmljdFN1YmNsYXNz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KGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uL2NvZGVnZW4uZGFydCcgc2hvdyBDb2RlZ2VuUmVnaXN0cnksIENvZGVnZW5Xb3JrSXRlbTsKaW1wb3J0ICcuLi9jb21tb24vbmFtZXMuZGFydCcgc2hvdyBTZWxlY3RvcnM7CmltcG9ydCAnLi4vY29tbW9uL3Rhc2tzLmRhcnQnIHNob3cgQ29tcGlsZXJUYXNrOwppbXBvcnQgJy4uL2NvbXBpbGVyLmRhcnQnIHNob3cgQ29tcGlsZXI7CmltcG9ydCAnLi4vY29uc3RhbnRzL2NvbnN0YW50X3N5c3RlbS5kYXJ0JyBhcyBjb25zdGFudF9zeXN0ZW07CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCcgc2hvdyBKQ29tbW9uRWxlbWVudHM7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJy4uL2luZmVycmVyL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvZmllbGRfYW5hbHlzaXMuZGFydCcKICAgIHNob3cgRmllbGRBbmFseXNpc0RhdGEsIEpGaWVsZEFuYWx5c2lzOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvYmFja2VuZC5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL25hdGl2ZV9kYXRhLmRhcnQnIHNob3cgTmF0aXZlRGF0YTsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vbmF0aXZlL2JlaGF2aW9yLmRhcnQnOwppbXBvcnQgJy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCcgc2hvdyBTZWxlY3RvcjsKaW1wb3J0ICcuLi91bml2ZXJzZS9zaWRlX2VmZmVjdHMuZGFydCcgc2hvdyBTaWRlRWZmZWN0czsKaW1wb3J0ICcuLi91bml2ZXJzZS91c2UuZGFydCcgc2hvdyBTdGF0aWNVc2U7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnOwppbXBvcnQgJy4uL3dvcmxkLmRhcnQnIHNob3cgSkNsb3NlZFdvcmxkOwppbXBvcnQgJ2ludGVyY2VwdG9yX3NpbXBsaWZpZXIuZGFydCc7CmltcG9ydCAnbG9nZ2luZy5kYXJ0JzsKaW1wb3J0ICdub2Rlcy5kYXJ0JzsKaW1wb3J0ICd0eXBlcy5kYXJ0JzsKaW1wb3J0ICd0eXBlc19wcm9wYWdhdGlvbi5kYXJ0JzsKaW1wb3J0ICd2YWx1ZV9yYW5nZV9hbmFseXplci5kYXJ0JzsKaW1wb3J0ICd2YWx1ZV9zZXQuZGFydCc7CgphYnN0cmFjdCBjbGFzcyBPcHRpbWl6YXRpb25QaGFzZSB7CiAgU3RyaW5nIGdldCBuYW1lOwogIHZvaWQgdmlzaXRHcmFwaChIR3JhcGggZ3JhcGgpOwp9CgpjbGFzcyBTc2FPcHRpbWl6ZXJUYXNrIGV4dGVuZHMgQ29tcGlsZXJUYXNrIHsKICBmaW5hbCBKYXZhU2NyaXB0QmFja2VuZCBfYmFja2VuZDsKCiAgTWFwPEhJbnN0cnVjdGlvbiwgUmFuZ2U+IHJhbmdlcyA9IDxISW5zdHJ1Y3Rpb24sIFJhbmdlPnt9OwoKICBNYXA8TWVtYmVyRW50aXR5LCBPcHRpbWl6YXRpb25UZXN0TG9nPiBsb2dnZXJzRm9yVGVzdGluZzsKCiAgU3NhT3B0aW1pemVyVGFzayh0aGlzLl9iYWNrZW5kKSA6IHN1cGVyKF9iYWNrZW5kLmNvbXBpbGVyLm1lYXN1cmVyKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+ICdTU0Egb3B0aW1pemVyJzsKCiAgQ29tcGlsZXIgZ2V0IF9jb21waWxlciA9PiBfYmFja2VuZC5jb21waWxlcjsKCiAgQ29tcGlsZXJPcHRpb25zIGdldCBfb3B0aW9ucyA9PiBfY29tcGlsZXIub3B0aW9uczsKCiAgUnVudGltZVR5cGVzU3Vic3RpdHV0aW9ucyBnZXQgX3J0aVN1YnN0aXR1dGlvbnMgPT4gX2JhY2tlbmQucnRpU3Vic3RpdHV0aW9uczsKCiAgdm9pZCBvcHRpbWl6ZShDb2RlZ2VuV29ya0l0ZW0gd29yaywgSEdyYXBoIGdyYXBoLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIGdsb2JhbEluZmVyZW5jZVJlc3VsdHMpIHsKICAgIHZvaWQgcnVuUGhhc2UoT3B0aW1pemF0aW9uUGhhc2UgcGhhc2UpIHsKICAgICAgbWVhc3VyZVN1YnRhc2socGhhc2UubmFtZSwgKCkgPT4gcGhhc2UudmlzaXRHcmFwaChncmFwaCkpOwogICAgICBfYmFja2VuZC50cmFjZXIudHJhY2VHcmFwaChwaGFzZS5uYW1lLCBncmFwaCk7CiAgICAgIGFzc2VydChncmFwaC5pc1ZhbGlkKCksICdHcmFwaCBub3QgdmFsaWQgYWZ0ZXIgJHtwaGFzZS5uYW1lfScpOwogICAgfQoKICAgIGJvb2wgdHJ1c3RQcmltaXRpdmVzID0gX29wdGlvbnMudHJ1c3RQcmltaXRpdmVzOwogICAgQ29kZWdlblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gd29yay5yZWdpc3RyeTsKICAgIFNldDxISW5zdHJ1Y3Rpb24+IGJvdW5kc0NoZWNrZWQgPSBuZXcgU2V0PEhJbnN0cnVjdGlvbj4oKTsKICAgIFNzYUNvZGVNb3Rpb24gY29kZU1vdGlvbjsKICAgIFNzYUxvYWRFbGltaW5hdGlvbiBsb2FkRWxpbWluYXRpb247CgogICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2c7CiAgICBpZiAocmV0YWluRGF0YUZvclRlc3RpbmcpIHsKICAgICAgbG9nZ2Vyc0ZvclRlc3RpbmcgPz89IHt9OwogICAgICBsb2dnZXJzRm9yVGVzdGluZ1t3b3JrLmVsZW1lbnRdID0gbG9nID0gbmV3IE9wdGltaXphdGlvblRlc3RMb2coKTsKICAgIH0KCiAgICBtZWFzdXJlKCgpIHsKICAgICAgTGlzdDxPcHRpbWl6YXRpb25QaGFzZT4gcGhhc2VzID0gPE9wdGltaXphdGlvblBoYXNlPlsKICAgICAgICAvLyBSdW4gdHJpdmlhbCBpbnN0cnVjdGlvbiBzaW1wbGlmaWNhdGlvbiBmaXJzdCB0byBvcHRpbWl6ZQogICAgICAgIC8vIHNvbWUgcGF0dGVybnMgdXNlZnVsIGZvciB0eXBlIGNvbnZlcnNpb24uCiAgICAgICAgbmV3IFNzYUluc3RydWN0aW9uU2ltcGxpZmllcihnbG9iYWxJbmZlcmVuY2VSZXN1bHRzLCBfb3B0aW9ucywKICAgICAgICAgICAgX3J0aVN1YnN0aXR1dGlvbnMsIGNsb3NlZFdvcmxkLCByZWdpc3RyeSwgbG9nKSwKICAgICAgICBuZXcgU3NhVHlwZUNvbnZlcnNpb25JbnNlcnRlcihjbG9zZWRXb3JsZCksCiAgICAgICAgbmV3IFNzYVJlZHVuZGFudFBoaUVsaW1pbmF0b3IoKSwKICAgICAgICBuZXcgU3NhRGVhZFBoaUVsaW1pbmF0b3IoKSwKICAgICAgICBuZXcgU3NhVHlwZVByb3BhZ2F0b3IoZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cywgX29wdGlvbnMsCiAgICAgICAgICAgIGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLCBjbG9zZWRXb3JsZCwgbG9nKSwKICAgICAgICAvLyBBZnRlciB0eXBlIHByb3BhZ2F0aW9uLCBtb3JlIGluc3RydWN0aW9ucyBjYW4gYmUKICAgICAgICAvLyBzaW1wbGlmaWVkLgogICAgICAgIG5ldyBTc2FJbnN0cnVjdGlvblNpbXBsaWZpZXIoZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cywgX29wdGlvbnMsCiAgICAgICAgICAgIF9ydGlTdWJzdGl0dXRpb25zLCBjbG9zZWRXb3JsZCwgcmVnaXN0cnksIGxvZyksCiAgICAgICAgbmV3IFNzYUNoZWNrSW5zZXJ0ZXIodHJ1c3RQcmltaXRpdmVzLCBjbG9zZWRXb3JsZCwgYm91bmRzQ2hlY2tlZCksCiAgICAgICAgbmV3IFNzYUluc3RydWN0aW9uU2ltcGxpZmllcihnbG9iYWxJbmZlcmVuY2VSZXN1bHRzLCBfb3B0aW9ucywKICAgICAgICAgICAgX3J0aVN1YnN0aXR1dGlvbnMsIGNsb3NlZFdvcmxkLCByZWdpc3RyeSwgbG9nKSwKICAgICAgICBuZXcgU3NhQ2hlY2tJbnNlcnRlcih0cnVzdFByaW1pdGl2ZXMsIGNsb3NlZFdvcmxkLCBib3VuZHNDaGVja2VkKSwKICAgICAgICBuZXcgU3NhVHlwZVByb3BhZ2F0b3IoZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cywgX29wdGlvbnMsCiAgICAgICAgICAgIGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLCBjbG9zZWRXb3JsZCwgbG9nKSwKICAgICAgICAvLyBSdW4gYSBkZWFkIGNvZGUgZWxpbWluYXRvciBiZWZvcmUgTElDTSBiZWNhdXNlIGRlYWQKICAgICAgICAvLyBpbnRlcmNlcHRvcnMgYXJlIG9mdGVuIGluIHRoZSB3YXkgb2YgTElDTSdhYmxlIGluc3RydWN0aW9ucy4KICAgICAgICBuZXcgU3NhRGVhZENvZGVFbGltaW5hdG9yKGNsb3NlZFdvcmxkLCB0aGlzKSwKICAgICAgICBuZXcgU3NhR2xvYmFsVmFsdWVOdW1iZXJlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKSwKICAgICAgICAvLyBBZnRlciBHVk4sIHNvbWUgaW5zdHJ1Y3Rpb25zIG1pZ2h0IG5lZWQgdGhlaXIgdHlwZSB0byBiZQogICAgICAgIC8vIHVwZGF0ZWQgYmVjYXVzZSB0aGV5IG5vdyBoYXZlIGRpZmZlcmVudCBpbnB1dHMuCiAgICAgICAgbmV3IFNzYVR5cGVQcm9wYWdhdG9yKGdsb2JhbEluZmVyZW5jZVJlc3VsdHMsIF9vcHRpb25zLAogICAgICAgICAgICBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cywgY2xvc2VkV29ybGQsIGxvZyksCiAgICAgICAgY29kZU1vdGlvbiA9IG5ldyBTc2FDb2RlTW90aW9uKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLAogICAgICAgIGxvYWRFbGltaW5hdGlvbiA9IG5ldyBTc2FMb2FkRWxpbWluYXRpb24oX2NvbXBpbGVyLCBjbG9zZWRXb3JsZCksCiAgICAgICAgbmV3IFNzYVJlZHVuZGFudFBoaUVsaW1pbmF0b3IoKSwKICAgICAgICBuZXcgU3NhRGVhZFBoaUVsaW1pbmF0b3IoKSwKICAgICAgICAvLyBBZnRlciBHVk4gYW5kIGxvYWQgZWxpbWluYXRpb24gdGhlIHNhbWUgdmFsdWUgbWF5IGJlIHVzZWQgaW4gY29kZQogICAgICAgIC8vIGNvbnRyb2xsZWQgYnkgYSB0ZXN0IG9uIHRoZSB2YWx1ZSwgc28gcmVkbyAnY29udmVyc2lvbiBpbnNlcnRpb24nIHRvCiAgICAgICAgLy8gbGVhcm4gZnJvbSB0aGUgcmVmaW5lZCB0eXBlLgogICAgICAgIG5ldyBTc2FUeXBlQ29udmVyc2lvbkluc2VydGVyKGNsb3NlZFdvcmxkKSwKICAgICAgICBuZXcgU3NhVHlwZVByb3BhZ2F0b3IoZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cywgX29wdGlvbnMsCiAgICAgICAgICAgIGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLCBjbG9zZWRXb3JsZCwgbG9nKSwKICAgICAgICBuZXcgU3NhVmFsdWVSYW5nZUFuYWx5emVyKGNsb3NlZFdvcmxkLCB0aGlzKSwKICAgICAgICAvLyBQcmV2aW91cyBvcHRpbWl6YXRpb25zIG1heSBoYXZlIGdlbmVyYXRlZCBuZXcKICAgICAgICAvLyBvcHBvcnR1bml0aWVzIGZvciBpbnN0cnVjdGlvbiBzaW1wbGlmaWNhdGlvbi4KICAgICAgICBuZXcgU3NhSW5zdHJ1Y3Rpb25TaW1wbGlmaWVyKGdsb2JhbEluZmVyZW5jZVJlc3VsdHMsIF9vcHRpb25zLAogICAgICAgICAgICBfcnRpU3Vic3RpdHV0aW9ucywgY2xvc2VkV29ybGQsIHJlZ2lzdHJ5LCBsb2cpLAogICAgICAgIG5ldyBTc2FDaGVja0luc2VydGVyKHRydXN0UHJpbWl0aXZlcywgY2xvc2VkV29ybGQsIGJvdW5kc0NoZWNrZWQpLAogICAgICBdOwogICAgICBwaGFzZXMuZm9yRWFjaChydW5QaGFzZSk7CgogICAgICAvLyBTaW1wbGlmeWluZyBpbnRlcmNlcHRvcnMgaXMgbm90IHN0cmljdGx5IGp1c3QgYW4gb3B0aW1pemF0aW9uLCBpdCBpcwogICAgICAvLyByZXF1aXJlZCBmb3IgaW1wbGVtZW50YXRpb24gY29ycmVjdG5lc3MgYmVjYXVzZSB0aGUgY29kZSBnZW5lcmF0b3IKICAgICAgLy8gYXNzdW1lcyBpdCBpcyBhbHdheXMgcGVyZm9ybWVkLgogICAgICBydW5QaGFzZShuZXcgU3NhU2ltcGxpZnlJbnRlcmNlcHRvcnMoCiAgICAgICAgICBjbG9zZWRXb3JsZCwgd29yay5lbGVtZW50LmVuY2xvc2luZ0NsYXNzKSk7CgogICAgICBTc2FEZWFkQ29kZUVsaW1pbmF0b3IgZGNlID0gbmV3IFNzYURlYWRDb2RlRWxpbWluYXRvcihjbG9zZWRXb3JsZCwgdGhpcyk7CiAgICAgIHJ1blBoYXNlKGRjZSk7CiAgICAgIGlmIChjb2RlTW90aW9uLm1vdmVkQ29kZSB8fAogICAgICAgICAgZGNlLmVsaW1pbmF0ZWRTaWRlRWZmZWN0cyB8fAogICAgICAgICAgbG9hZEVsaW1pbmF0aW9uLm5ld0d2bkNhbmRpZGF0ZXMpIHsKICAgICAgICBwaGFzZXMgPSA8T3B0aW1pemF0aW9uUGhhc2U+WwogICAgICAgICAgbmV3IFNzYVR5cGVQcm9wYWdhdG9yKGdsb2JhbEluZmVyZW5jZVJlc3VsdHMsIF9vcHRpb25zLAogICAgICAgICAgICAgIGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLCBjbG9zZWRXb3JsZCwgbG9nKSwKICAgICAgICAgIG5ldyBTc2FHbG9iYWxWYWx1ZU51bWJlcmVyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLAogICAgICAgICAgbmV3IFNzYUNvZGVNb3Rpb24oY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbiksCiAgICAgICAgICBuZXcgU3NhVmFsdWVSYW5nZUFuYWx5emVyKGNsb3NlZFdvcmxkLCB0aGlzKSwKICAgICAgICAgIG5ldyBTc2FJbnN0cnVjdGlvblNpbXBsaWZpZXIoZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cywgX29wdGlvbnMsCiAgICAgICAgICAgICAgX3J0aVN1YnN0aXR1dGlvbnMsIGNsb3NlZFdvcmxkLCByZWdpc3RyeSwgbG9nKSwKICAgICAgICAgIG5ldyBTc2FDaGVja0luc2VydGVyKHRydXN0UHJpbWl0aXZlcywgY2xvc2VkV29ybGQsIGJvdW5kc0NoZWNrZWQpLAogICAgICAgICAgbmV3IFNzYVNpbXBsaWZ5SW50ZXJjZXB0b3JzKGNsb3NlZFdvcmxkLCB3b3JrLmVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MpLAogICAgICAgICAgbmV3IFNzYURlYWRDb2RlRWxpbWluYXRvcihjbG9zZWRXb3JsZCwgdGhpcyksCiAgICAgICAgXTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwaGFzZXMgPSA8T3B0aW1pemF0aW9uUGhhc2U+WwogICAgICAgICAgbmV3IFNzYVR5cGVQcm9wYWdhdG9yKGdsb2JhbEluZmVyZW5jZVJlc3VsdHMsIF9vcHRpb25zLAogICAgICAgICAgICAgIGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLCBjbG9zZWRXb3JsZCwgbG9nKSwKICAgICAgICAgIC8vIFJ1biB0aGUgc2ltcGxpZmllciB0byByZW1vdmUgdW5uZWVkZWQgdHlwZSBjaGVja3MgaW5zZXJ0ZWQgYnkKICAgICAgICAgIC8vIHR5cGUgcHJvcGFnYXRpb24uCiAgICAgICAgICBuZXcgU3NhSW5zdHJ1Y3Rpb25TaW1wbGlmaWVyKGdsb2JhbEluZmVyZW5jZVJlc3VsdHMsIF9vcHRpb25zLAogICAgICAgICAgICAgIF9ydGlTdWJzdGl0dXRpb25zLCBjbG9zZWRXb3JsZCwgcmVnaXN0cnksIGxvZyksCiAgICAgICAgXTsKICAgICAgfQogICAgICBwaGFzZXMuZm9yRWFjaChydW5QaGFzZSk7CiAgICB9KTsKICB9Cn0KCi8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbbWFza10gcmVwcmVzZW50cyBvbmx5IHR5cGVzIHRoYXQgaGF2ZSBhIGxlbmd0aCB0aGF0Ci8vLyBjYW5ub3QgY2hhbmdlLiAgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgY29uc2VydmF0aXZlIGZvciB0aGUgcHVycG9zZQovLy8gb2YgaWRlbnRpZnlpbmcgZ3ZuLWFibGUgbGVuZ3RocyBhbmQgbWlzLWlkZW50aWZpZXMgc29tZSB1bmlvbnMgb2YgZml4ZWQKLy8vIGxlbmd0aCBpbmRleGFibGVzIChzZWUgVE9ETykgYXMgbm90IGZpeGVkIGxlbmd0aC4KYm9vbCBpc0ZpeGVkTGVuZ3RoKEFic3RyYWN0VmFsdWUgbWFzaywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluID0gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbjsKICBpZiAoYWJzdHJhY3RWYWx1ZURvbWFpbi5pc0NvbnRhaW5lcihtYXNrKSAmJgogICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmdldENvbnRhaW5lckxlbmd0aChtYXNrKSAhPSBudWxsKSB7CiAgICAvLyBBIGNvbnRhaW5lciBvbiB3aGljaCB3ZSBoYXZlIGluZmVycmVkIHRoZSBsZW5ndGguCiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgLy8gVE9ETyhzcmEpOiBSZWNvZ25pemUgYW55IGNvbWJpbmF0aW9uIG9mIGZpeGVkIGxlbmd0aCBpbmRleGFibGVzLgogIGlmIChhYnN0cmFjdFZhbHVlRG9tYWluLmlzRml4ZWRBcnJheShtYXNrKS5pc0RlZmluaXRlbHlUcnVlIHx8CiAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uaXNTdHJpbmdPck51bGwobWFzaykuaXNEZWZpbml0ZWx5VHJ1ZSB8fAogICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmlzVHlwZWRBcnJheShtYXNrKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CgovLy8gSWYgYm90aCBpbnB1dHMgdG8ga25vd24gb3BlcmF0aW9ucyBhcmUgYXZhaWxhYmxlIGV4ZWN1dGUgdGhlIG9wZXJhdGlvbiBhdAovLy8gY29tcGlsZS10aW1lLgpjbGFzcyBTc2FJbnN0cnVjdGlvblNpbXBsaWZpZXIgZXh0ZW5kcyBIQmFzZVZpc2l0b3IKICAgIGltcGxlbWVudHMgT3B0aW1pemF0aW9uUGhhc2UgewogIC8vIFdlIGRvbid0IHByb2R1Y2UgY29uc3RhbnQtZm9sZGVkIHN0cmluZ3MgbG9uZ2VyIHRoYW4gdGhpcyB1bmxlc3MgdGhleSBoYXZlCiAgLy8gYSBzaW5nbGUgdXNlLiAgVGhpcyBwcm90ZWN0cyBhZ2FpbnN0IGV4cG9uZW50aWFsbHkgbGFyZ2UgY29uc3RhbnQgZm9sZGVkCiAgLy8gc3RyaW5ncy4KICBzdGF0aWMgY29uc3QgTUFYX1NIQVJFRF9DT05TVEFOVF9GT0xERURfU1RSSU5HX0xFTkdUSCA9IDUxMjsKCiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAiU3NhSW5zdHJ1Y3Rpb25TaW1wbGlmaWVyIjsKICBmaW5hbCBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0czsKICBmaW5hbCBDb21waWxlck9wdGlvbnMgX29wdGlvbnM7CiAgZmluYWwgUnVudGltZVR5cGVzU3Vic3RpdHV0aW9ucyBfcnRpU3Vic3RpdHV0aW9uczsKICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwogIGZpbmFsIENvZGVnZW5SZWdpc3RyeSBfcmVnaXN0cnk7CiAgZmluYWwgT3B0aW1pemF0aW9uVGVzdExvZyBfbG9nOwogIEhHcmFwaCBfZ3JhcGg7CgogIFNzYUluc3RydWN0aW9uU2ltcGxpZmllcih0aGlzLl9nbG9iYWxJbmZlcmVuY2VSZXN1bHRzLCB0aGlzLl9vcHRpb25zLAogICAgICB0aGlzLl9ydGlTdWJzdGl0dXRpb25zLCB0aGlzLl9jbG9zZWRXb3JsZCwgdGhpcy5fcmVnaXN0cnksIHRoaXMuX2xvZyk7CgogIEpDb21tb25FbGVtZW50cyBnZXQgY29tbW9uRWxlbWVudHMgPT4gX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzOwoKICBBYnN0cmFjdFZhbHVlRG9tYWluIGdldCBfYWJzdHJhY3RWYWx1ZURvbWFpbiA9PgogICAgICBfY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbjsKCiAgTmF0aXZlRGF0YSBnZXQgX25hdGl2ZURhdGEgPT4gX2Nsb3NlZFdvcmxkLm5hdGl2ZURhdGE7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRHcmFwaChIR3JhcGggdmlzaXRlZSkgewogICAgX2dyYXBoID0gdmlzaXRlZTsKICAgIHZpc2l0RG9taW5hdG9yVHJlZSh2aXNpdGVlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0QmFzaWNCbG9jayhIQmFzaWNCbG9jayBibG9jaykgewogICAgc2ltcGxpZnlQaGlzKGJsb2NrKTsKICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IGJsb2NrLmZpcnN0OwogICAgd2hpbGUgKGluc3RydWN0aW9uICE9IG51bGwpIHsKICAgICAgSEluc3RydWN0aW9uIG5leHQgPSBpbnN0cnVjdGlvbi5uZXh0OwogICAgICBISW5zdHJ1Y3Rpb24gcmVwbGFjZW1lbnQgPSBpbnN0cnVjdGlvbi5hY2NlcHQodGhpcyk7CiAgICAgIGlmIChyZXBsYWNlbWVudCAhPSBpbnN0cnVjdGlvbikgewogICAgICAgIGJsb2NrLnJld3JpdGUoaW5zdHJ1Y3Rpb24sIHJlcGxhY2VtZW50KTsKCiAgICAgICAgLy8gVGhlIGludGVyc2VjdGlvbiBvZiBkb3VibGUgYW5kIGludCByZXR1cm4gY29uZmxpY3RpbmcsIGFuZAogICAgICAgIC8vIGJlY2F1c2Ugb2Ygb3VyIG51bWJlciBpbXBsZW1lbnRhdGlvbiBmb3IgSmF2YVNjcmlwdCwgaXQKICAgICAgICAvLyBtaWdodCBiZSB0aGF0IGFuIG9wZXJhdGlvbiB0aG91Z2h0IHRvIHJldHVybiBkb3VibGUsIGNhbiBiZQogICAgICAgIC8vIHNpbXBsaWZpZWQgdG8gYW4gaW50LiBGb3IgZXhhbXBsZToKICAgICAgICAvLyBgMi41ICogMTBgLgogICAgICAgIGlmICghKHJlcGxhY2VtZW50CiAgICAgICAgICAgICAgICAuaXNOdW1iZXJPck51bGwoX2Fic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSAmJgogICAgICAgICAgICBpbnN0cnVjdGlvbgogICAgICAgICAgICAgICAgLmlzTnVtYmVyT3JOdWxsKF9hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpKSB7CiAgICAgICAgICAvLyBJZiB3ZSBjYW4gcmVwbGFjZSBbaW5zdHJ1Y3Rpb25dIHdpdGggW3JlcGxhY2VtZW50XSwgdGhlbgogICAgICAgICAgLy8gW3JlcGxhY2VtZW50XSdzIHR5cGUgY2FuIGJlIG5hcnJvd2VkLgogICAgICAgICAgQWJzdHJhY3RWYWx1ZSBuZXdUeXBlID0gX2Fic3RyYWN0VmFsdWVEb21haW4uaW50ZXJzZWN0aW9uKAogICAgICAgICAgICAgIHJlcGxhY2VtZW50Lmluc3RydWN0aW9uVHlwZSwgaW5zdHJ1Y3Rpb24uaW5zdHJ1Y3Rpb25UeXBlKTsKICAgICAgICAgIHJlcGxhY2VtZW50Lmluc3RydWN0aW9uVHlwZSA9IG5ld1R5cGU7CiAgICAgICAgfQoKICAgICAgICAvLyBJZiB0aGUgcmVwbGFjZW1lbnQgaW5zdHJ1Y3Rpb24gZG9lcyBub3Qga25vdyBpdHMKICAgICAgICAvLyBzb3VyY2UgZWxlbWVudCwgdXNlIHRoZSBzb3VyY2UgZWxlbWVudCBvZiB0aGUKICAgICAgICAvLyBpbnN0cnVjdGlvbi4KICAgICAgICByZXBsYWNlbWVudC5zb3VyY2VFbGVtZW50ID8/PSBpbnN0cnVjdGlvbi5zb3VyY2VFbGVtZW50OwogICAgICAgIHJlcGxhY2VtZW50LnNvdXJjZUluZm9ybWF0aW9uID8/PSBpbnN0cnVjdGlvbi5zb3VyY2VJbmZvcm1hdGlvbjsKICAgICAgICBpZiAoIXJlcGxhY2VtZW50LmlzSW5CYXNpY0Jsb2NrKCkpIHsKICAgICAgICAgIC8vIFRoZSBjb25zdGFudCBmb2xkaW5nIGNhbiByZXR1cm4gYW4gaW5zdHJ1Y3Rpb24gdGhhdCBpcyBhbHJlYWR5CiAgICAgICAgICAvLyBwYXJ0IG9mIHRoZSBncmFwaCAobGlrZSBhbiBpbnB1dCksIHNvIHdlIG9ubHkgYWRkIHRoZSByZXBsYWNlbWVudAogICAgICAgICAgLy8gaWYgbmVjZXNzYXJ5LgogICAgICAgICAgYmxvY2suYWRkQWZ0ZXIoaW5zdHJ1Y3Rpb24sIHJlcGxhY2VtZW50KTsKICAgICAgICAgIC8vIFZpc2l0IHRoZSByZXBsYWNlbWVudCBhcyB0aGUgbmV4dCBpbnN0cnVjdGlvbiBpbiBjYXNlIGl0CiAgICAgICAgICAvLyBjYW4gYWxzbyBiZSBjb25zdGFudCBmb2xkZWQgYXdheS4KICAgICAgICAgIG5leHQgPSByZXBsYWNlbWVudDsKICAgICAgICB9CiAgICAgICAgYmxvY2sucmVtb3ZlKGluc3RydWN0aW9uKTsKICAgICAgfQogICAgICBpbnN0cnVjdGlvbiA9IG5leHQ7CiAgICB9CiAgfQoKICAvLyBTaW1wbGlmeSBzb21lIENGRyBkaWFtb25kcyB0byBlcXVpdmFsZW50IGV4cHJlc3Npb25zLgogIHNpbXBsaWZ5UGhpcyhIQmFzaWNCbG9jayBibG9jaykgewogICAgLy8gSXMgW2Jsb2NrXSB0aGUgam9pbiBwb2ludCBmb3IgYSBzaW1wbGUgZGlhbW9uZCB0aGF0IGdlbmVyYXRlcyBhIHNpbmdsZQogICAgLy8gcGhpIG5vZGU/CiAgICBpZiAoYmxvY2sucGhpcy5pc0VtcHR5KSByZXR1cm47CiAgICBIUGhpIHBoaSA9IGJsb2NrLnBoaXMuZmlyc3Q7CiAgICBpZiAocGhpLm5leHQgIT0gbnVsbCkgcmV0dXJuOwogICAgaWYgKGJsb2NrLnByZWRlY2Vzc29ycy5sZW5ndGggIT0gMikgcmV0dXJuOwogICAgYXNzZXJ0KHBoaS5pbnB1dHMubGVuZ3RoID09IDIpOwogICAgSEJhc2ljQmxvY2sgYjEgPSBibG9jay5wcmVkZWNlc3NvcnNbMF07CiAgICBIQmFzaWNCbG9jayBiMiA9IGJsb2NrLnByZWRlY2Vzc29yc1sxXTsKICAgIEhCYXNpY0Jsb2NrIGRvbWluYXRvciA9IGJsb2NrLmRvbWluYXRvcjsKICAgIGlmICghKGIxLmRvbWluYXRvciA9PSBkb21pbmF0b3IgJiYgYjIuZG9taW5hdG9yID09IGRvbWluYXRvcikpIHJldHVybjsKCiAgICAvLyBFeHRyYWN0IHRoZSBjb250cm9sbGluZyBjb25kaXRpb24uCiAgICBISW5zdHJ1Y3Rpb24gY29udHJvbEZsb3cgPSBkb21pbmF0b3IubGFzdDsKICAgIGlmIChjb250cm9sRmxvdyBpcyEgSElmKSByZXR1cm47CiAgICBISW5zdHJ1Y3Rpb24gdGVzdCA9IGNvbnRyb2xGbG93LmlucHV0cy5zaW5nbGU7CiAgICBpZiAodGVzdC51c2VkQnkubGVuZ3RoID4gMSkgcmV0dXJuOwoKICAgIGJvb2wgbmVnYXRlZCA9IGZhbHNlOwogICAgd2hpbGUgKHRlc3QgaXMgSE5vdCkgewogICAgICB0ZXN0ID0gdGVzdC5pbnB1dHMuc2luZ2xlOwogICAgICBpZiAodGVzdC51c2VkQnkubGVuZ3RoID4gMSkgcmV0dXJuOwogICAgICBuZWdhdGVkID0gIW5lZ2F0ZWQ7CiAgICB9CgogICAgaWYgKHRlc3QgaXMhIEhJZGVudGl0eSkgcmV0dXJuOwogICAgSEluc3RydWN0aW9uIHRlc3RlZDsKICAgIGlmICh0ZXN0LmlucHV0c1swXS5pc051bGwoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgdGVzdGVkID0gdGVzdC5pbnB1dHNbMV07CiAgICB9IGVsc2UgaWYgKHRlc3QuaW5wdXRzWzFdLmlzTnVsbChfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICB0ZXN0ZWQgPSB0ZXN0LmlucHV0c1swXTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBISW5zdHJ1Y3Rpb24gd2hlbk51bGxWYWx1ZSA9IHBoaS5pbnB1dHNbbmVnYXRlZCA/IDEgOiAwXTsKICAgIEhJbnN0cnVjdGlvbiB3aGVuTm90TnVsbFZhbHVlID0gcGhpLmlucHV0c1tuZWdhdGVkID8gMCA6IDFdOwogICAgSEJhc2ljQmxvY2sgd2hlbk51bGxCbG9jayA9IGJsb2NrLnByZWRlY2Vzc29yc1tuZWdhdGVkID8gMSA6IDBdOwogICAgSEJhc2ljQmxvY2sgd2hlbk5vdE51bGxCbG9jayA9IGJsb2NrLnByZWRlY2Vzc29yc1tuZWdhdGVkID8gMCA6IDFdOwoKICAgIC8vIElmICd4JyBpcyBudWxsYWJsZSBib29sZWFuLAogICAgLy8KICAgIC8vICAgICB4ID09IG51bGwgPyBmYWxzZSA6IHggIC0tLT4gIHggPT0gdHJ1ZQogICAgLy8KICAgIC8vIFRoaXMgb2ZlbiBjb21lcyBmcm9tIHRoZSBkYXJ0IGNvZGUgYHggPz8gZmFsc2VgLgogICAgaWYgKF9zYW1lT3JSZWZpbmVtZW50T2YodGVzdGVkLCB3aGVuTm90TnVsbFZhbHVlKSAmJgogICAgICAgIF9pc0Jvb2xDb25zdGFudCh3aGVuTnVsbFZhbHVlLCBmYWxzZSkgJiYKICAgICAgICB3aGVuTm90TnVsbFZhbHVlCiAgICAgICAgICAgIC5pc0Jvb2xlYW5Pck51bGwoX2Fic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgX21vc3RseUVtcHR5KHdoZW5OdWxsQmxvY2spICYmCiAgICAgICAgX21vc3RseUVtcHR5KHdoZW5Ob3ROdWxsQmxvY2spKSB7CiAgICAgIEhJbnN0cnVjdGlvbiB0cnVlQ29uc3RhbnQgPSBfZ3JhcGguYWRkQ29uc3RhbnRCb29sKHRydWUsIF9jbG9zZWRXb3JsZCk7CiAgICAgIEhJbnN0cnVjdGlvbiByZXBsYWNlbWVudCA9IG5ldyBISWRlbnRpdHkoCiAgICAgICAgICB0ZXN0ZWQsIHRydWVDb25zdGFudCwgbnVsbCwgX2Fic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUpCiAgICAgICAgLi5zb3VyY2VFbGVtZW50ID0gcGhpLnNvdXJjZUVsZW1lbnQKICAgICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gcGhpLnNvdXJjZUluZm9ybWF0aW9uOwogICAgICBibG9jay5yZXdyaXRlKHBoaSwgcmVwbGFjZW1lbnQpOwogICAgICBibG9jay5hZGRBdEVudHJ5KHJlcGxhY2VtZW50KTsKICAgICAgYmxvY2sucmVtb3ZlUGhpKHBoaSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIElmICd4J2lzIG51bGxhYmxlIGJvb2xlYW4sCiAgICAvLwogICAgLy8gICAgIHggPT0gbnVsbCA/IHRydWUgOiB4ICAtLS0+ICAhKHggPT0gZmFsc2UpCiAgICAvLwogICAgLy8gVGhpcyBvZmVuIGNvbWVzIGZyb20gdGhlIGRhcnQgY29kZSBgeCA/PyB0cnVlYC4KICAgIGlmIChfc2FtZU9yUmVmaW5lbWVudE9mKHRlc3RlZCwgd2hlbk5vdE51bGxWYWx1ZSkgJiYKICAgICAgICBfaXNCb29sQ29uc3RhbnQod2hlbk51bGxWYWx1ZSwgdHJ1ZSkgJiYKICAgICAgICB3aGVuTm90TnVsbFZhbHVlCiAgICAgICAgICAgIC5pc0Jvb2xlYW5Pck51bGwoX2Fic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgX21vc3RseUVtcHR5KHdoZW5OdWxsQmxvY2spICYmCiAgICAgICAgX21vc3RseUVtcHR5KHdoZW5Ob3ROdWxsQmxvY2spKSB7CiAgICAgIEhJbnN0cnVjdGlvbiBmYWxzZUNvbnN0YW50ID0gX2dyYXBoLmFkZENvbnN0YW50Qm9vbChmYWxzZSwgX2Nsb3NlZFdvcmxkKTsKICAgICAgSEluc3RydWN0aW9uIGNvbXBhcmUgPSBuZXcgSElkZW50aXR5KAogICAgICAgICAgdGVzdGVkLCBmYWxzZUNvbnN0YW50LCBudWxsLCBfYWJzdHJhY3RWYWx1ZURvbWFpbi5ib29sVHlwZSk7CiAgICAgIGJsb2NrLmFkZEF0RW50cnkoY29tcGFyZSk7CiAgICAgIEhJbnN0cnVjdGlvbiByZXBsYWNlbWVudCA9CiAgICAgICAgICBuZXcgSE5vdChjb21wYXJlLCBfYWJzdHJhY3RWYWx1ZURvbWFpbi5ib29sVHlwZSkKICAgICAgICAgICAgLi5zb3VyY2VFbGVtZW50ID0gcGhpLnNvdXJjZUVsZW1lbnQKICAgICAgICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IHBoaS5zb3VyY2VJbmZvcm1hdGlvbjsKICAgICAgYmxvY2sucmV3cml0ZShwaGksIHJlcGxhY2VtZW50KTsKICAgICAgYmxvY2suYWRkQWZ0ZXIoY29tcGFyZSwgcmVwbGFjZW1lbnQpOwogICAgICBibG9jay5yZW1vdmVQaGkocGhpKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIFRPRE8oc3JhKTogQ29uc2lkZXIgb3RoZXIgc2ltcGxlIGRpYW1vbmRzLCBlLmcuIHdpdGggdGhlIGFkZGl0aW9uIG9mIGEgc3BlY2lhbCBpbnN0cnVjdGlvbiwKICAgIC8vCiAgICAvLyAgICAgcyA9PSBudWxsID8gIiIgOiBzICAtLS0+ICBzIHx8ICIiLgogICAgcmV0dXJuOwogIH0KCiAgYm9vbCBfaXNCb29sQ29uc3RhbnQoSEluc3RydWN0aW9uIG5vZGUsIGJvb2wgdmFsdWUpIHsKICAgIGlmIChub2RlIGlzIEhDb25zdGFudCkgewogICAgICBDb25zdGFudFZhbHVlIGMgPSBub2RlLmNvbnN0YW50OwogICAgICBpZiAoYyBpcyBCb29sQ29uc3RhbnRWYWx1ZSkgewogICAgICAgIHJldHVybiBjLmJvb2xWYWx1ZSA9PSB2YWx1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgYm9vbCBfc2FtZU9yUmVmaW5lbWVudE9mKEhJbnN0cnVjdGlvbiBiYXNlLCBISW5zdHJ1Y3Rpb24gaW5zbikgewogICAgaWYgKGJhc2UgPT0gaW5zbikgcmV0dXJuIHRydWU7CiAgICBpZiAoaW5zbiBpcyBIVHlwZUtub3duKSByZXR1cm4gX3NhbWVPclJlZmluZW1lbnRPZihiYXNlLCBpbnNuLmNoZWNrZWRJbnB1dCk7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBib29sIF9tb3N0bHlFbXB0eShIQmFzaWNCbG9jayBibG9jaykgewogICAgZm9yIChISW5zdHJ1Y3Rpb24gaW5zbiA9IGJsb2NrLmZpcnN0OyBpbnNuICE9IG51bGw7IGluc24gPSBpbnNuLm5leHQpIHsKICAgICAgaWYgKGluc24gaXMgSFR5cGVLbm93bikgY29udGludWU7CiAgICAgIGlmIChpbnNuIGlzIEhHb3RvKSByZXR1cm4gdHJ1ZTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRJbnN0cnVjdGlvbihISW5zdHJ1Y3Rpb24gbm9kZSkgewogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBDb25zdGFudFZhbHVlIGdldENvbnN0YW50RnJvbVR5cGUoSEluc3RydWN0aW9uIG5vZGUpIHsKICAgIGlmIChub2RlLmlzVmFsdWUoX2Fic3RyYWN0VmFsdWVEb21haW4pICYmCiAgICAgICAgbm9kZS5pc051bGwoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseUZhbHNlKSB7CiAgICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPQogICAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4uZ2V0UHJpbWl0aXZlVmFsdWUobm9kZS5pbnN0cnVjdGlvblR5cGUpOwogICAgICBpZiAodmFsdWUuaXNCb29sKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9CiAgICAgIC8vIFRPRE8oaGV0KTogY29uc2lkZXIgc3VwcG9ydGluZyBvdGhlciB2YWx1ZXMgKHNob3J0IHN0cmluZ3M/KQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIHByb3BhZ2F0ZUNvbnN0YW50VmFsdWVUb1VzZXMoSEluc3RydWN0aW9uIG5vZGUpIHsKICAgIGlmIChub2RlLnVzZWRCeS5pc0VtcHR5KSByZXR1cm47CiAgICBDb25zdGFudFZhbHVlIHZhbHVlID0gZ2V0Q29uc3RhbnRGcm9tVHlwZShub2RlKTsKICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIEhDb25zdGFudCBjb25zdGFudCA9IF9ncmFwaC5hZGRDb25zdGFudCh2YWx1ZSwgX2Nsb3NlZFdvcmxkKTsKICAgICAgZm9yIChISW5zdHJ1Y3Rpb24gdXNlciBpbiBub2RlLnVzZWRCeS50b0xpc3QoKSkgewogICAgICAgIHVzZXIuY2hhbmdlVXNlKG5vZGUsIGNvbnN0YW50KTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0UGFyYW1ldGVyVmFsdWUoSFBhcmFtZXRlclZhbHVlIG5vZGUpIHsKICAgIC8vIFtIUGFyYW1ldGVyVmFsdWVdcyBhcmUgZWl0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyIChpbiBmdWxseSBTU0EKICAgIC8vIGNvbnZlcnRlZCBjb2RlKSwgb3IgdGhlIG11dGFibGUgdmFyaWFibGUgY29udGFpbmluZyB0aGUgdmFsdWUgKGluCiAgICAvLyBpbmNvbXBsZXRlbHkgU1NBIGNvbnZlcnRlZCBjb2RlLCBlLmcuIG1ldGhvZHMgY29udGFpbmluZyBleGNlcHRpb25zKS4KICAgIC8vCiAgICAvLyBJZiB0aGUgcGFyYW1ldGVyIGlzIHVzZWQgYXMgYSBtdXRhYmxlIHZhcmlhYmxlIHdlIGNhbm5vdCByZXBsYWNlIHRoZQogICAgLy8gdmFyaWFibGUgd2l0aCBhIHZhbHVlLgogICAgLy8KICAgIC8vIElmIHRoZSBwYXJhbWV0ZXIgaXMgdXNlZCBhcyBhIG11dGFibGUgdmFyaWFibGUgYnV0IG5ldmVyIHdyaXR0ZW4sIGZpcnN0CiAgICAvLyBjb252ZXJ0IHRvIGEgdmFsdWUgcGFyYW1ldGVyLgoKICAgIGlmIChub2RlLnVzZWRBc1ZhcmlhYmxlKCkpIHsKICAgICAgaWYgKCFub2RlLnVzZWRCeS5ldmVyeSgodXNlcikgPT4gdXNlciBpcyBITG9jYWxHZXQpKSByZXR1cm4gbm9kZTsKICAgICAgLy8gVHJpdmlhbCBTU0EtY29udmVyc2lvbi4gUmVwbGFjZSBhbGwgSExvY2FsR2V0IGluc3RydWN0aW9ucyB3aXRoIHRoZQogICAgICAvLyBwYXJhbWV0ZXIuCiAgICAgIGZvciAoSExvY2FsR2V0IHVzZXIgaW4gbm9kZS51c2VkQnkudG9MaXN0KCkpIHsKICAgICAgICB1c2VyLmJsb2NrLnJld3JpdGUodXNlciwgbm9kZSk7CiAgICAgICAgdXNlci5ibG9jay5yZW1vdmUodXNlcik7CiAgICAgIH0KICAgIH0KCiAgICBwcm9wYWdhdGVDb25zdGFudFZhbHVlVG9Vc2VzKG5vZGUpOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRCb29saWZ5KEhCb29saWZ5IG5vZGUpIHsKICAgIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMgPSBub2RlLmlucHV0czsKICAgIGFzc2VydChpbnB1dHMubGVuZ3RoID09IDEpOwogICAgSEluc3RydWN0aW9uIGlucHV0ID0gaW5wdXRzWzBdOwogICAgaWYgKGlucHV0LmlzQm9vbGVhbihfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICByZXR1cm4gaW5wdXQ7CiAgICB9CgogICAgLy8gSWYgdGhlIGNvZGUgaXMgdW5yZWFjaGFibGUsIHJlbW92ZSB0aGUgSEJvb2xpZnkuICBUaGlzIGNhbiBoYXBwZW4gd2hlbgogICAgLy8gdGhlcmUgaXMgYSB0aHJvdyBleHByZXNzaW9uIGluIGEgc2hvcnQtY2lyY3VpdCBjb25kaXRpb25hbC4gIFJlbW92aW5nIHRoZQogICAgLy8gdW5yZWFjaGFibGUgSEJvb2xpZnkgbWFrZXMgaXQgZWFzaWVyIHRvIHJlY29uc3RydWN0IHRoZSBzaG9ydC1jaXJjdWl0CiAgICAvLyBvcGVyYXRpb24uCiAgICBpZiAoX2Fic3RyYWN0VmFsdWVEb21haW4uaXNFbXB0eShpbnB1dC5pbnN0cnVjdGlvblR5cGUpLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcmV0dXJuIGlucHV0OwogICAgfQoKICAgIC8vIEFsbCB2YWx1ZXMgdGhhdCBjYW5ub3QgYmUgJ3RydWUnIGFyZSBib29saWZpZWQgdG8gZmFsc2UuCiAgICBBYnN0cmFjdFZhbHVlIG1hc2sgPSBpbnB1dC5pbnN0cnVjdGlvblR5cGU7CiAgICBpZiAoX2Fic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAuY29udGFpbnNUeXBlKG1hc2ssIGNvbW1vbkVsZW1lbnRzLmpzQm9vbENsYXNzKQogICAgICAgIC5pc1BvdGVudGlhbGx5RmFsc2UpIHsKICAgICAgcmV0dXJuIF9ncmFwaC5hZGRDb25zdGFudEJvb2woZmFsc2UsIF9jbG9zZWRXb3JsZCk7CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB2aXNpdE5vdChITm90IG5vZGUpIHsKICAgIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMgPSBub2RlLmlucHV0czsKICAgIGFzc2VydChpbnB1dHMubGVuZ3RoID09IDEpOwogICAgSEluc3RydWN0aW9uIGlucHV0ID0gaW5wdXRzWzBdOwogICAgaWYgKGlucHV0IGlzIEhDb25zdGFudCkgewogICAgICBIQ29uc3RhbnQgY29uc3RhbnQgPSBpbnB1dDsKICAgICAgYm9vbCBpc1RydWUgPSBjb25zdGFudC5jb25zdGFudC5pc1RydWU7CiAgICAgIHJldHVybiBfZ3JhcGguYWRkQ29uc3RhbnRCb29sKCFpc1RydWUsIF9jbG9zZWRXb3JsZCk7CiAgICB9IGVsc2UgaWYgKGlucHV0IGlzIEhOb3QpIHsKICAgICAgcmV0dXJuIGlucHV0LmlucHV0c1swXTsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0SW52b2tlVW5hcnkoSEludm9rZVVuYXJ5IG5vZGUpIHsKICAgIEhJbnN0cnVjdGlvbiBmb2xkZWQgPSBmb2xkVW5hcnkobm9kZS5vcGVyYXRpb24oKSwgbm9kZS5vcGVyYW5kKTsKICAgIHJldHVybiBmb2xkZWQgIT0gbnVsbCA/IGZvbGRlZCA6IG5vZGU7CiAgfQoKICBISW5zdHJ1Y3Rpb24gZm9sZFVuYXJ5KAogICAgICBjb25zdGFudF9zeXN0ZW0uVW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uLCBISW5zdHJ1Y3Rpb24gb3BlcmFuZCkgewogICAgaWYgKG9wZXJhbmQgaXMgSENvbnN0YW50KSB7CiAgICAgIEhDb25zdGFudCByZWNlaXZlciA9IG9wZXJhbmQ7CiAgICAgIENvbnN0YW50VmFsdWUgZm9sZGVkID0gb3BlcmF0aW9uLmZvbGQocmVjZWl2ZXIuY29uc3RhbnQpOwogICAgICBpZiAoZm9sZGVkICE9IG51bGwpIHJldHVybiBfZ3JhcGguYWRkQ29uc3RhbnQoZm9sZGVkLCBfY2xvc2VkV29ybGQpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBISW5zdHJ1Y3Rpb24gdHJ5T3B0aW1pemVMZW5ndGhJbnRlcmNlcHRlZEdldHRlcihISW52b2tlRHluYW1pYyBub2RlKSB7CiAgICBISW5zdHJ1Y3Rpb24gYWN0dWFsUmVjZWl2ZXIgPSBub2RlLmlucHV0c1sxXTsKICAgIGlmIChhY3R1YWxSZWNlaXZlcgogICAgICAgIC5pc0luZGV4YWJsZVByaW1pdGl2ZShfYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBpZiAoYWN0dWFsUmVjZWl2ZXIuaXNDb25zdGFudFN0cmluZygpKSB7CiAgICAgICAgSENvbnN0YW50IGNvbnN0YW50SW5wdXQgPSBhY3R1YWxSZWNlaXZlcjsKICAgICAgICBTdHJpbmdDb25zdGFudFZhbHVlIGNvbnN0YW50ID0gY29uc3RhbnRJbnB1dC5jb25zdGFudDsKICAgICAgICByZXR1cm4gX2dyYXBoLmFkZENvbnN0YW50SW50KGNvbnN0YW50Lmxlbmd0aCwgX2Nsb3NlZFdvcmxkKTsKICAgICAgfSBlbHNlIGlmIChhY3R1YWxSZWNlaXZlci5pc0NvbnN0YW50TGlzdCgpKSB7CiAgICAgICAgSENvbnN0YW50IGNvbnN0YW50SW5wdXQgPSBhY3R1YWxSZWNlaXZlcjsKICAgICAgICBMaXN0Q29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IGNvbnN0YW50SW5wdXQuY29uc3RhbnQ7CiAgICAgICAgcmV0dXJuIF9ncmFwaC5hZGRDb25zdGFudEludChjb25zdGFudC5sZW5ndGgsIF9jbG9zZWRXb3JsZCk7CiAgICAgIH0KICAgICAgYm9vbCBpc0ZpeGVkID0KICAgICAgICAgIGlzRml4ZWRMZW5ndGgoYWN0dWFsUmVjZWl2ZXIuaW5zdHJ1Y3Rpb25UeXBlLCBfY2xvc2VkV29ybGQpOwogICAgICBBYnN0cmFjdFZhbHVlIGFjdHVhbFR5cGUgPSBub2RlLmluc3RydWN0aW9uVHlwZTsKICAgICAgQWJzdHJhY3RWYWx1ZSByZXN1bHRUeXBlID0gX2Fic3RyYWN0VmFsdWVEb21haW4ucG9zaXRpdmVJbnRUeXBlOwogICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgY29tcHV0ZWQgYSBtb3JlIHNwZWNpZmljIHR5cGUsIGtlZXAgdGhhdCB0eXBlLgogICAgICBpZiAoX2Fic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAgIC5pc0luc3RhbmNlT2ZPck51bGwoYWN0dWFsVHlwZSwgY29tbW9uRWxlbWVudHMuanNVSW50MzFDbGFzcykKICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgICAgcmVzdWx0VHlwZSA9IF9hYnN0cmFjdFZhbHVlRG9tYWluLnVpbnQzMVR5cGU7CiAgICAgIH0gZWxzZSBpZiAoX2Fic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAgIC5pc0luc3RhbmNlT2ZPck51bGwoYWN0dWFsVHlwZSwgY29tbW9uRWxlbWVudHMuanNVSW50MzJDbGFzcykKICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgICAgcmVzdWx0VHlwZSA9IF9hYnN0cmFjdFZhbHVlRG9tYWluLnVpbnQzMlR5cGU7CiAgICAgIH0KICAgICAgSEdldExlbmd0aCByZXN1bHQgPQogICAgICAgICAgbmV3IEhHZXRMZW5ndGgoYWN0dWFsUmVjZWl2ZXIsIHJlc3VsdFR5cGUsIGlzQXNzaWduYWJsZTogIWlzRml4ZWQpOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfSBlbHNlIGlmIChhY3R1YWxSZWNlaXZlci5pc0NvbnN0YW50TWFwKCkpIHsKICAgICAgSENvbnN0YW50IGNvbnN0YW50SW5wdXQgPSBhY3R1YWxSZWNlaXZlcjsKICAgICAgTWFwQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IGNvbnN0YW50SW5wdXQuY29uc3RhbnQ7CiAgICAgIHJldHVybiBfZ3JhcGguYWRkQ29uc3RhbnRJbnQoY29uc3RhbnQubGVuZ3RoLCBfY2xvc2VkV29ybGQpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBISW5zdHJ1Y3Rpb24gaGFuZGxlSW50ZXJjZXB0ZWRDYWxsKEhJbnZva2VEeW5hbWljIG5vZGUpIHsKICAgIC8vIFRyeSBjb25zdGFudCBmb2xkaW5nIHRoZSBpbnN0cnVjdGlvbi4KICAgIGNvbnN0YW50X3N5c3RlbS5PcGVyYXRpb24gb3BlcmF0aW9uID0gbm9kZS5zcGVjaWFsaXplci5vcGVyYXRpb24oKTsKICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbCkgewogICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSBub2RlLmlucHV0cy5sZW5ndGggPT0gMgogICAgICAgICAgPyBmb2xkVW5hcnkob3BlcmF0aW9uLCBub2RlLmlucHV0c1sxXSkKICAgICAgICAgIDogZm9sZEJpbmFyeShvcGVyYXRpb24sIG5vZGUuaW5wdXRzWzFdLCBub2RlLmlucHV0c1syXSk7CiAgICAgIGlmIChpbnN0cnVjdGlvbiAhPSBudWxsKSByZXR1cm4gaW5zdHJ1Y3Rpb247CiAgICB9CgogICAgLy8gVHJ5IGNvbnZlcnRpbmcgdGhlIGluc3RydWN0aW9uIHRvIGEgYnVpbHRpbiBpbnN0cnVjdGlvbi4KICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IG5vZGUuc3BlY2lhbGl6ZXIudHJ5Q29udmVydFRvQnVpbHRpbigKICAgICAgICBub2RlLAogICAgICAgIF9ncmFwaCwKICAgICAgICBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cywKICAgICAgICBfb3B0aW9ucywKICAgICAgICBjb21tb25FbGVtZW50cywKICAgICAgICBfY2xvc2VkV29ybGQsCiAgICAgICAgX2xvZyk7CiAgICBpZiAoaW5zdHJ1Y3Rpb24gIT0gbnVsbCkgewogICAgICByZXR1cm4gaW5zdHJ1Y3Rpb247CiAgICB9CgogICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBub2RlLnNlbGVjdG9yOwogICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gbm9kZS5tYXNrOwogICAgSEluc3RydWN0aW9uIGlucHV0ID0gbm9kZS5pbnB1dHNbMV07CgogICAgYm9vbCBhcHBsaWVzKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICAgIHJldHVybiBzZWxlY3Rvci5hcHBsaWVzKGVsZW1lbnQpICYmCiAgICAgICAgICAobWFzayA9PSBudWxsIHx8CiAgICAgICAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAgICAgICAgICAgLmlzVGFyZ2V0aW5nTWVtYmVyKG1hc2ssIGVsZW1lbnQsIHNlbGVjdG9yLm1lbWJlck5hbWUpCiAgICAgICAgICAgICAgICAgIC5pc1BvdGVudGlhbGx5VHJ1ZSk7CiAgICB9CgogICAgaWYgKHNlbGVjdG9yLmlzQ2FsbCB8fCBzZWxlY3Rvci5pc09wZXJhdG9yKSB7CiAgICAgIEZ1bmN0aW9uRW50aXR5IHRhcmdldDsKICAgICAgaWYgKGlucHV0LmlzRXh0ZW5kYWJsZUFycmF5KF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgICAgaWYgKGFwcGxpZXMoY29tbW9uRWxlbWVudHMuanNBcnJheVJlbW92ZUxhc3QpKSB7CiAgICAgICAgICB0YXJnZXQgPSBjb21tb25FbGVtZW50cy5qc0FycmF5UmVtb3ZlTGFzdDsKICAgICAgICB9IGVsc2UgaWYgKGFwcGxpZXMoY29tbW9uRWxlbWVudHMuanNBcnJheUFkZCkpIHsKICAgICAgICAgIC8vIFRoZSBjb2RlZ2VuIHNwZWNpYWwgY2FzZXMgYXJyYXkgY2FsbHMsIGJ1dCBkb2VzIG5vdAogICAgICAgICAgLy8gaW5saW5lIGFyZ3VtZW50IHR5cGUgY2hlY2tzLgogICAgICAgICAgaWYgKCFfb3B0aW9ucy5wYXJhbWV0ZXJDaGVja1BvbGljeS5pc0VtaXR0ZWQgfHwKICAgICAgICAgICAgICBpbnB1dCBpcyBITGl0ZXJhbExpc3QpIHsKICAgICAgICAgICAgdGFyZ2V0ID0gY29tbW9uRWxlbWVudHMuanNBcnJheUFkZDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoaW5wdXQuaXNTdHJpbmdPck51bGwoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICBpZiAoY29tbW9uRWxlbWVudHMuYXBwbGllc1RvSnNTdHJpbmdTcGxpdCgKICAgICAgICAgICAgc2VsZWN0b3IsIG1hc2ssIF9hYnN0cmFjdFZhbHVlRG9tYWluKSkgewogICAgICAgICAgcmV0dXJuIGhhbmRsZVN0cmluZ1NwbGl0KG5vZGUpOwogICAgICAgIH0gZWxzZSBpZiAoYXBwbGllcyhjb21tb25FbGVtZW50cy5qc1N0cmluZ09wZXJhdG9yQWRkKSkgewogICAgICAgICAgLy8gYG9wZXJhdG9yK2AgaXMgdHVybmVkIGludG8gYSBKYXZhU2NyaXB0ICcrJyBzbyB3ZSBuZWVkIHRvCiAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHJlY2VpdmVyIGFuZCB0aGUgYXJndW1lbnQgYXJlIG5vdCBudWxsLgogICAgICAgICAgLy8gVE9ETyhzcmEpOiBEbyB0aGlzIHZpYSBbbm9kZS5zcGVjaWFsaXplcl0uCiAgICAgICAgICBISW5zdHJ1Y3Rpb24gYXJndW1lbnQgPSBub2RlLmlucHV0c1syXTsKICAgICAgICAgIGlmIChhcmd1bWVudC5pc1N0cmluZyhfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSAmJgogICAgICAgICAgICAgIGlucHV0LmlzTnVsbChfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5RmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBIU3RyaW5nQ29uY2F0KGlucHV0LCBhcmd1bWVudCwgbm9kZS5pbnN0cnVjdGlvblR5cGUpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoYXBwbGllcyhjb21tb25FbGVtZW50cy5qc1N0cmluZ1RvU3RyaW5nKSAmJgogICAgICAgICAgICBpbnB1dC5pc051bGwoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseUZhbHNlKSB7CiAgICAgICAgICByZXR1cm4gaW5wdXQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgewogICAgICAgIC8vIFRPRE8obmdlb2ZmcmF5KTogVGhlcmUgaXMgYSBzdHJvbmcgZGVwZW5kZW5jeSBiZXR3ZWVuIGNvZGVnZW4KICAgICAgICAvLyBhbmQgdGhpcyBvcHRpbWl6YXRpb24gdGhhdCB0aGUgZHluYW1pYyBpbnZva2UgZG9lcyBub3QgbmVlZCBhbgogICAgICAgIC8vIGludGVyY2VwdG9yLiBXZSBjdXJyZW50bHkgbmVlZCB0byBrZWVwIGEKICAgICAgICAvLyBISW52b2tlRHluYW1pY01ldGhvZCBhbmQgbm90IGNyZWF0ZSBhIEhGb3JlaWduIGJlY2F1c2UKICAgICAgICAvLyBIRm9yZWlnbiBpcyB0b28gb3BhcXVlIGZvciB0aGUgU3NhQ2hlY2tJbnNlcnRlciAodGhhdCBhZGRzIGEKICAgICAgICAvLyBib3VuZHMgY2hlY2sgb24gcmVtb3ZlTGFzdCkuIE9uY2Ugd2Ugc3RhcnQgaW5saW5pbmcsIHRoZQogICAgICAgIC8vIGJvdW5kcyBjaGVjayB3aWxsIGJlY29tZSBleHBsaWNpdCwgc28gd2Ugd29uJ3QgbmVlZCB0aGlzCiAgICAgICAgLy8gb3B0aW1pemF0aW9uLgogICAgICAgIEhJbnZva2VEeW5hbWljTWV0aG9kIHJlc3VsdCA9IG5ldyBISW52b2tlRHluYW1pY01ldGhvZCgKICAgICAgICAgICAgbm9kZS5zZWxlY3RvciwKICAgICAgICAgICAgbm9kZS5tYXNrLAogICAgICAgICAgICBub2RlLmlucHV0cy5zdWJsaXN0KDEpLCAvLyBEcm9wIGludGVyY2VwdG9yLgogICAgICAgICAgICBub2RlLmluc3RydWN0aW9uVHlwZSwKICAgICAgICAgICAgbm9kZS50eXBlQXJndW1lbnRzLAogICAgICAgICAgICBub2RlLnNvdXJjZUluZm9ybWF0aW9uLAogICAgICAgICAgICBpc0ludGVyY2VwdGVkOiBmYWxzZSk7CiAgICAgICAgcmVzdWx0LmVsZW1lbnQgPSB0YXJnZXQ7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pc0dldHRlcikgewogICAgICBpZiAoY29tbW9uRWxlbWVudHMuYXBwbGllc1RvSnNJbmRleGFibGVMZW5ndGgoc2VsZWN0b3IpKSB7CiAgICAgICAgSEluc3RydWN0aW9uIG9wdGltaXplZCA9IHRyeU9wdGltaXplTGVuZ3RoSW50ZXJjZXB0ZWRHZXR0ZXIobm9kZSk7CiAgICAgICAgaWYgKG9wdGltaXplZCAhPSBudWxsKSByZXR1cm4gb3B0aW1pemVkOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBISW5zdHJ1Y3Rpb24gaGFuZGxlU3RyaW5nU3BsaXQoSEludm9rZUR5bmFtaWMgbm9kZSkgewogICAgSEluc3RydWN0aW9uIGFyZ3VtZW50ID0gbm9kZS5pbnB1dHNbMl07CiAgICBpZiAoIWFyZ3VtZW50LmlzU3RyaW5nKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiBub2RlOwogICAgfQoKICAgIC8vIFJlcGxhY2UgYHMuc3BsaXQkMShwYXR0ZXJuKWAgd2l0aAogICAgLy8KICAgIC8vICAgICB0MSA9IHMuc3BsaXQocGF0dGVybik7CiAgICAvLyAgICAgdDIgPSBTdHJpbmc7CiAgICAvLyAgICAgdDMgPSBKU0FycmF5PHQyPjsKICAgIC8vICAgICB0NCA9IHNldFJ1bnRpbWVUeXBlSW5mbyh0MSwgdDMpOwogICAgLy8KCiAgICBBYnN0cmFjdFZhbHVlIHJlc3VsdE1hc2sgPSBfYWJzdHJhY3RWYWx1ZURvbWFpbi5ncm93YWJsZUxpc3RUeXBlOwoKICAgIEhJbnZva2VEeW5hbWljTWV0aG9kIHNwbGl0SW5zdHJ1Y3Rpb24gPSBuZXcgSEludm9rZUR5bmFtaWNNZXRob2QoCiAgICAgICAgbm9kZS5zZWxlY3RvciwKICAgICAgICBub2RlLm1hc2ssCiAgICAgICAgbm9kZS5pbnB1dHMuc3VibGlzdCgxKSwgLy8gRHJvcCBpbnRlcmNlcHRvci4KICAgICAgICByZXN1bHRNYXNrLAogICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgICBub2RlLnNvdXJjZUluZm9ybWF0aW9uLAogICAgICAgIGlzSW50ZXJjZXB0ZWQ6IGZhbHNlKQogICAgICAuLmVsZW1lbnQgPSBjb21tb25FbGVtZW50cy5qc1N0cmluZ1NwbGl0CiAgICAgIC4uc2V0QWxsb2NhdGlvbih0cnVlKTsKCiAgICBpZiAoIV9jbG9zZWRXb3JsZC5ydGlOZWVkCiAgICAgICAgLmNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKGNvbW1vbkVsZW1lbnRzLmpzQXJyYXlDbGFzcykpIHsKICAgICAgcmV0dXJuIHNwbGl0SW5zdHJ1Y3Rpb247CiAgICB9CgogICAgbm9kZS5ibG9jay5hZGRCZWZvcmUobm9kZSwgc3BsaXRJbnN0cnVjdGlvbik7CgogICAgSEluc3RydWN0aW9uIHN0cmluZ1R5cGVJbmZvID0gbmV3IEhUeXBlSW5mb0V4cHJlc3Npb24oCiAgICAgICAgVHlwZUluZm9FeHByZXNzaW9uS2luZC5DT01QTEVURSwKICAgICAgICBfY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50LmdldFRoaXNUeXBlKGNvbW1vbkVsZW1lbnRzLnN0cmluZ0NsYXNzKSwKICAgICAgICA8SEluc3RydWN0aW9uPltdLAogICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlKTsKICAgIG5vZGUuYmxvY2suYWRkQmVmb3JlKG5vZGUsIHN0cmluZ1R5cGVJbmZvKTsKCiAgICBISW5zdHJ1Y3Rpb24gdHlwZUluZm8gPSBuZXcgSFR5cGVJbmZvRXhwcmVzc2lvbigKICAgICAgICBUeXBlSW5mb0V4cHJlc3Npb25LaW5kLklOU1RBTkNFLAogICAgICAgIF9jbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQKICAgICAgICAgICAgLmdldFRoaXNUeXBlKGNvbW1vbkVsZW1lbnRzLmpzQXJyYXlDbGFzcyksCiAgICAgICAgPEhJbnN0cnVjdGlvbj5bc3RyaW5nVHlwZUluZm9dLAogICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlKTsKICAgIG5vZGUuYmxvY2suYWRkQmVmb3JlKG5vZGUsIHR5cGVJbmZvKTsKCiAgICBISW52b2tlU3RhdGljIHRhZ0luc3RydWN0aW9uID0gbmV3IEhJbnZva2VTdGF0aWMoCiAgICAgICAgY29tbW9uRWxlbWVudHMuc2V0UnVudGltZVR5cGVJbmZvLAogICAgICAgIDxISW5zdHJ1Y3Rpb24+W3NwbGl0SW5zdHJ1Y3Rpb24sIHR5cGVJbmZvXSwKICAgICAgICByZXN1bHRNYXNrLAogICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bXSk7CiAgICAvLyAnTGluZWFyIHR5cGluZycgdHJpY2s6IFt0YWdJbnN0cnVjdGlvbl0gaXMgdGhlIG9ubHkgdXNlIG9mIHRoZQogICAgLy8gW3NwbGl0SW5zdHJ1Y3Rpb25dLCBzbyBpdCBiZWNvbWVzIHRoZSBzb2xlIGFsaWFzLgogICAgLy8gVE9ETyhzcmEpOiBCdWlsZCB0aGlzIGtub3dsZWRnZSBpbnRvIGFsaWFzIGFuYWx5c2lzLgogICAgdGFnSW5zdHJ1Y3Rpb24uc2V0QWxsb2NhdGlvbih0cnVlKTsKCiAgICByZXR1cm4gdGFnSW5zdHJ1Y3Rpb247CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRJbnZva2VEeW5hbWljTWV0aG9kKEhJbnZva2VEeW5hbWljTWV0aG9kIG5vZGUpIHsKICAgIHByb3BhZ2F0ZUNvbnN0YW50VmFsdWVUb1VzZXMobm9kZSk7CiAgICBpZiAobm9kZS5pc0ludGVyY2VwdGVkQ2FsbCkgewogICAgICBISW5zdHJ1Y3Rpb24gZm9sZGVkID0gaGFuZGxlSW50ZXJjZXB0ZWRDYWxsKG5vZGUpOwogICAgICBpZiAoZm9sZGVkICE9IG5vZGUpIHJldHVybiBmb2xkZWQ7CiAgICB9CgogICAgSEluc3RydWN0aW9uIHJlY2VpdmVyID0gbm9kZS5nZXREYXJ0UmVjZWl2ZXIoX2Nsb3NlZFdvcmxkKTsKICAgIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXJUeXBlID0gcmVjZWl2ZXIuaW5zdHJ1Y3Rpb25UeXBlOwogICAgTWVtYmVyRW50aXR5IGVsZW1lbnQgPQogICAgICAgIF9jbG9zZWRXb3JsZC5sb2NhdGVTaW5nbGVNZW1iZXIobm9kZS5zZWxlY3RvciwgcmVjZWl2ZXJUeXBlKTsKICAgIC8vIFRPRE8obmdlb2ZmcmF5KTogQWxzbyBmb2xkIGlmIGl0J3MgYSBnZXR0ZXIgb3IgdmFyaWFibGUuCiAgICBpZiAoZWxlbWVudCAhPSBudWxsICYmCiAgICAgICAgZWxlbWVudC5pc0Z1bmN0aW9uICYmCiAgICAgICAgLy8gSWYgd2UgZm91bmQgb3V0IHRoYXQgdGhlIG9ubHkgdGFyZ2V0IGlzIGFuIGltcGxpY2l0bHkgY2FsbGVkCiAgICAgICAgLy8gWzpub1N1Y2hNZXRob2Q6XSB3ZSBqdXN0IGlnbm9yZSBpdC4KICAgICAgICBub2RlLnNlbGVjdG9yLmFwcGxpZXMoZWxlbWVudCkpIHsKICAgICAgRnVuY3Rpb25FbnRpdHkgbWV0aG9kID0gZWxlbWVudDsKCiAgICAgIGlmIChfbmF0aXZlRGF0YS5pc05hdGl2ZU1lbWJlcihtZXRob2QpKSB7CiAgICAgICAgSEluc3RydWN0aW9uIGZvbGRlZCA9IHRyeUlubGluZU5hdGl2ZU1ldGhvZChub2RlLCBtZXRob2QpOwogICAgICAgIGlmIChmb2xkZWQgIT0gbnVsbCkgcmV0dXJuIGZvbGRlZDsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUT0RPKG5nZW9mZnJheSk6IElmIHRoZSBtZXRob2QgaGFzIG9wdGlvbmFsIHBhcmFtZXRlcnMsCiAgICAgICAgLy8gd2Ugc2hvdWxkIHBhc3MgdGhlIGRlZmF1bHQgdmFsdWVzLgogICAgICAgIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJzID0gbWV0aG9kLnBhcmFtZXRlclN0cnVjdHVyZTsKICAgICAgICBpZiAocGFyYW1ldGVycy50b3RhbFBhcmFtZXRlcnMgPT0gbm9kZS5zZWxlY3Rvci5hcmd1bWVudENvdW50ICYmCiAgICAgICAgICAgIHBhcmFtZXRlcnMudHlwZVBhcmFtZXRlcnMgPT0KICAgICAgICAgICAgICAgIG5vZGUuc2VsZWN0b3IuY2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRDb3VudCkgewogICAgICAgICAgbm9kZS5lbGVtZW50ID0gbWV0aG9kOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbm9kZTsKICAgIH0KCiAgICAvLyBSZXBsYWNlIG1ldGhvZCBjYWxscyB0aHJvdWdoIGZpZWxkcyB3aXRoIGEgY2xvc3VyZSBjYWxsIG9uIHRoZSB2YWx1ZSBvZgogICAgLy8gdGhlIGZpZWxkLiBUaGlzIHVzdWFsbHkgcmVtb3ZlcyB0aGUgZGVtYW5kIGZvciB0aGUgY2FsbC10aHJvdWdoIHN0dWIgYW5kCiAgICAvLyBtYWtlcyB0aGUgZmllbGQgbG9hZCBhdmFpbGFibGUgdG8gZnVydGhlciBvcHRpbWl6YXRpb24sIGUuZy4gTElDTS4KCiAgICBpZiAoZWxlbWVudCAhPSBudWxsICYmCiAgICAgICAgZWxlbWVudC5pc0ZpZWxkICYmCiAgICAgICAgZWxlbWVudC5uYW1lID09IG5vZGUuc2VsZWN0b3IubmFtZSkgewogICAgICBGaWVsZEVudGl0eSBmaWVsZCA9IGVsZW1lbnQ7CiAgICAgIGlmICghX25hdGl2ZURhdGEuaXNOYXRpdmVNZW1iZXIoZmllbGQpICYmCiAgICAgICAgICAhbm9kZS5pc0NhbGxPbkludGVyY2VwdG9yKF9jbG9zZWRXb3JsZCkpIHsKICAgICAgICAvLyBJbnNlcnRpb24gcG9pbnQgZm9yIHRoZSBjbG9zdXJlIGNhbGwuCiAgICAgICAgSEluc3RydWN0aW9uIGluc2VydGlvblBvaW50ID0gbm9kZTsKICAgICAgICBISW5zdHJ1Y3Rpb24gbG9hZDsKICAgICAgICBGaWVsZEFuYWx5c2lzRGF0YSBmaWVsZERhdGEgPQogICAgICAgICAgICBfY2xvc2VkV29ybGQuZmllbGRBbmFseXNpcy5nZXRGaWVsZERhdGEoZmllbGQpOwogICAgICAgIGlmIChmaWVsZERhdGEuaXNFZmZlY3RpdmVseUNvbnN0YW50KSB7CiAgICAgICAgICAvLyBUaGUgZmllbGQgaXMgZWxpZGVkIGFuZCByZXBsYWNlIGl0IHdpdGggaXRzIGNvbnN0YW50IHZhbHVlLgogICAgICAgICAgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzTnVsbChyZWNlaXZlclR5cGUpLmlzUG90ZW50aWFsbHlUcnVlKSB7CiAgICAgICAgICAgIC8vIFRoZSByZWNlaXZlciBpcyBwb3RlbnRpYWxseSBgbnVsbGAgc28gd2UgaW5zZXJ0IGEgbnVsbCByZWNlaXZlcgogICAgICAgICAgICAvLyBndWFyZCB0byB0cmlnZ2VyIGEgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbi4KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gVGhpcyBjb3VsZCBiZSBpbnNlcnRlZCB1bmNvbmRpdGlvbmFsbHkgYW5kIHJlbW92ZWQgYnkgbGF0ZXIKICAgICAgICAgICAgLy8gb3B0aW1pemF0aW9ucyBpZiB1bm5lY2Vzc2FyeSwgYnV0IHBlcmZvcm1hbmNlIHdlIGRvIGl0CiAgICAgICAgICAgIC8vIGNvbmRpdGlvbmFsbHkgaGVyZS4KICAgICAgICAgICAgLy8gVE9ETygzNTk5Nik6IFJlcGxhY2Ugd2l0aCBudWxsIHJlY2VpdmVyIGd1YXJkIGluc3RydWN0aW9uLgogICAgICAgICAgICBISW5zdHJ1Y3Rpb24gZHVtbXlHZXQgPSBuZXcgSEZpZWxkR2V0KG51bGwsIHJlY2VpdmVyLAogICAgICAgICAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUsIG5vZGUuc291cmNlSW5mb3JtYXRpb24sCiAgICAgICAgICAgICAgICBpc0Fzc2lnbmFibGU6IGZhbHNlKTsKICAgICAgICAgICAgX2xvZz8ucmVnaXN0ZXJGaWVsZENhbGwobm9kZSwgZHVtbXlHZXQpOwogICAgICAgICAgICBub2RlLmJsb2NrLmFkZEJlZm9yZShub2RlLCBkdW1teUdldCk7CiAgICAgICAgICAgIGluc2VydGlvblBvaW50ID0gZHVtbXlHZXQ7CiAgICAgICAgICB9CiAgICAgICAgICBDb25zdGFudFZhbHVlIHZhbHVlID0gZmllbGREYXRhLmNvbnN0YW50VmFsdWU7CiAgICAgICAgICBsb2FkID0gX2dyYXBoLmFkZENvbnN0YW50KHZhbHVlLCBfY2xvc2VkV29ybGQsCiAgICAgICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogICAgICAgICAgX2xvZz8ucmVnaXN0ZXJDb25zdGFudEZpZWxkQ2FsbChub2RlLCBmaWVsZCwgbG9hZCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIEFic3RyYWN0VmFsdWUgdHlwZSA9IEFic3RyYWN0VmFsdWVGYWN0b3J5LmluZmVycmVkVHlwZUZvck1lbWJlcigKICAgICAgICAgICAgICBmaWVsZCwgX2dsb2JhbEluZmVyZW5jZVJlc3VsdHMpOwogICAgICAgICAgbG9hZCA9IG5ldyBIRmllbGRHZXQoZmllbGQsIHJlY2VpdmVyLCB0eXBlLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgICAgIF9sb2c/LnJlZ2lzdGVyRmllbGRDYWxsKG5vZGUsIGxvYWQpOwogICAgICAgICAgbm9kZS5ibG9jay5hZGRCZWZvcmUobm9kZSwgbG9hZCk7CiAgICAgICAgICBpbnNlcnRpb25Qb2ludCA9IGxvYWQ7CiAgICAgICAgfQogICAgICAgIFNlbGVjdG9yIGNhbGxTZWxlY3RvciA9IG5ldyBTZWxlY3Rvci5jYWxsQ2xvc3VyZUZyb20obm9kZS5zZWxlY3Rvcik7CiAgICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cyA9IDxISW5zdHJ1Y3Rpb24+W2xvYWRdCiAgICAgICAgICAuLmFkZEFsbChub2RlLmlucHV0cy5za2lwKG5vZGUuaXNJbnRlcmNlcHRlZENhbGwgPyAyIDogMSkpOwogICAgICAgIEhJbnN0cnVjdGlvbiBjbG9zdXJlQ2FsbCA9IG5ldyBISW52b2tlQ2xvc3VyZSgKICAgICAgICAgICAgY2FsbFNlbGVjdG9yLCBpbnB1dHMsIG5vZGUuaW5zdHJ1Y3Rpb25UeXBlLCBub2RlLnR5cGVBcmd1bWVudHMpCiAgICAgICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gbm9kZS5zb3VyY2VJbmZvcm1hdGlvbjsKICAgICAgICBub2RlLmJsb2NrLmFkZEFmdGVyKGluc2VydGlvblBvaW50LCBjbG9zdXJlQ2FsbCk7CiAgICAgICAgcmV0dXJuIGNsb3N1cmVDYWxsOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBISW5zdHJ1Y3Rpb24gdHJ5SW5saW5lTmF0aXZlTWV0aG9kKAogICAgICBISW52b2tlRHluYW1pY01ldGhvZCBub2RlLCBGdW5jdGlvbkVudGl0eSBtZXRob2QpIHsKICAgIC8vIFdlIGNhbiByZXBsYWNlIHRoZSBjYWxsIHRvIHRoZSBuYXRpdmUgY2xhc3MgaW50ZXJjZXB0b3IgbWV0aG9kICh0YXJnZXQpCiAgICAvLyBpZiB0aGUgdGFyZ2V0IGRvZXMgbm8gY29udmVyc2lvbnMgb3IgdXNlZnVsIHR5cGUgY2hlY2tzLgogICAgaWYgKF9vcHRpb25zLmRpc2FibGVJbmxpbmluZykgcmV0dXJuIG51bGw7CiAgICBpZiAoX2Nsb3NlZFdvcmxkLmFubm90YXRpb25zRGF0YS5oYXNOb0lubGluZShtZXRob2QpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKCFub2RlLmlzSW50ZXJjZXB0ZWRDYWxsKSByZXR1cm4gbnVsbDsKCiAgICBGdW5jdGlvblR5cGUgdHlwZSA9IF9jbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQuZ2V0RnVuY3Rpb25UeXBlKG1ldGhvZCk7CiAgICBpZiAodHlwZS5uYW1lZFBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgcmV0dXJuIG51bGw7CgogICAgLy8gVGhlIGNhbGwgc2l0ZSBtaWdodCBvbWl0IG9wdGlvbmFsIGFyZ3VtZW50cy4gVGhlIGlubGluZWQgY29kZSBtdXN0CiAgICAvLyBwcmVzZXJ2ZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cywgc28gY2hlY2sgb25seSB0aGUgYWN0dWFsIGFyZ3VtZW50cy4KCiAgICBib29sIGNhbklubGluZSA9IHRydWU7CiAgICBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzID0gbm9kZS5pbnB1dHM7CiAgICBpbnQgaW5wdXRQb3NpdGlvbiA9IDI7IC8vIFNraXAgaW50ZXJjZXB0b3IgYW5kIHJlY2VpdmVyLgoKICAgIHZvaWQgY2hlY2tQYXJhbWV0ZXJUeXBlKERhcnRUeXBlIHBhcmFtZXRlclR5cGUpIHsKICAgICAgaWYgKCFjYW5JbmxpbmUpIHJldHVybjsKICAgICAgaWYgKGlucHV0UG9zaXRpb24gPj0gaW5wdXRzLmxlbmd0aCkgcmV0dXJuOwogICAgICBISW5zdHJ1Y3Rpb24gaW5wdXQgPSBpbnB1dHNbaW5wdXRQb3NpdGlvbisrXTsKICAgICAgaWYgKHBhcmFtZXRlclR5cGUudW5hbGlhc2VkLmlzRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgLy8gTXVzdCBjYWxsIHRoZSB0YXJnZXQgc2luY2UgaXQgY29udGFpbnMgYSBmdW5jdGlvbiBjb252ZXJzaW9uLgogICAgICAgIGNhbklubGluZSA9IGZhbHNlOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgLy8gSWYgdGhlIHRhcmdldCBoYXMgbm8gY2hlY2tzIGRvbid0IGxldCBhIGJhZCB0eXBlIHN0b3AgdXMgaW5saW5pbmcuCiAgICAgIGlmICghX29wdGlvbnMucGFyYW1ldGVyQ2hlY2tQb2xpY3kuaXNFbWl0dGVkKSByZXR1cm47CgogICAgICBBYnN0cmFjdFZhbHVlIHBhcmFtZXRlckFic3RyYWN0VmFsdWUgPSBfYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgICAgLmdldEFic3RyYWN0VmFsdWVGb3JOYXRpdmVNZXRob2RQYXJhbWV0ZXJUeXBlKHBhcmFtZXRlclR5cGUpOwoKICAgICAgaWYgKHBhcmFtZXRlckFic3RyYWN0VmFsdWUgPT0gbnVsbCB8fAogICAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAgICAgICAuaXNJbihpbnB1dC5pbnN0cnVjdGlvblR5cGUsIHBhcmFtZXRlckFic3RyYWN0VmFsdWUpCiAgICAgICAgICAgICAgLmlzUG90ZW50aWFsbHlGYWxzZSkgewogICAgICAgIGNhbklubGluZSA9IGZhbHNlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQoKICAgIHR5cGUucGFyYW1ldGVyVHlwZXMuZm9yRWFjaChjaGVja1BhcmFtZXRlclR5cGUpOwogICAgdHlwZS5vcHRpb25hbFBhcmFtZXRlclR5cGVzLmZvckVhY2goY2hlY2tQYXJhbWV0ZXJUeXBlKTsKICAgIGFzc2VydCh0eXBlLm5hbWVkUGFyYW1ldGVyVHlwZXMuaXNFbXB0eSk7CgogICAgaWYgKCFjYW5JbmxpbmUpIHJldHVybiBudWxsOwoKICAgIC8vIFN0cmVuZ3RoZW4gaW5zdHJ1Y3Rpb24gdHlwZSBmcm9tIGFubm90YXRpb25zIHRvIGhlbHAgb3B0aW1pemUKICAgIC8vIGRlcGVuZGVudCBpbnN0cnVjdGlvbnMuCiAgICBOYXRpdmVCZWhhdmlvciBuYXRpdmVCZWhhdmlvciA9IF9uYXRpdmVEYXRhLmdldE5hdGl2ZU1ldGhvZEJlaGF2aW9yKG1ldGhvZCk7CiAgICBBYnN0cmFjdFZhbHVlIHJldHVyblR5cGUgPQogICAgICAgIEFic3RyYWN0VmFsdWVGYWN0b3J5LmZyb21OYXRpdmVCZWhhdmlvcihuYXRpdmVCZWhhdmlvciwgX2Nsb3NlZFdvcmxkKTsKICAgIEhJbnZva2VEeW5hbWljTWV0aG9kIHJlc3VsdCA9IG5ldyBISW52b2tlRHluYW1pY01ldGhvZCgKICAgICAgICBub2RlLnNlbGVjdG9yLAogICAgICAgIG5vZGUubWFzaywKICAgICAgICBpbnB1dHMuc3VibGlzdCgxKSwgLy8gRHJvcCBpbnRlcmNlcHRvci4KICAgICAgICByZXR1cm5UeXBlLAogICAgICAgIG5vZGUudHlwZUFyZ3VtZW50cywKICAgICAgICBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgIHJlc3VsdC5lbGVtZW50ID0gbWV0aG9kOwogICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2UubWV0aG9kSW5saW5pbmcobWV0aG9kLCBudWxsKSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0Qm91bmRzQ2hlY2soSEJvdW5kc0NoZWNrIG5vZGUpIHsKICAgIEhJbnN0cnVjdGlvbiBpbmRleCA9IG5vZGUuaW5kZXg7CiAgICBpZiAoaW5kZXguaXNJbnRlZ2VyKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiBub2RlOwogICAgfQogICAgaWYgKGluZGV4LmlzQ29uc3RhbnQoKSkgewogICAgICBIQ29uc3RhbnQgY29uc3RhbnRJbnN0cnVjdGlvbiA9IGluZGV4OwogICAgICBhc3NlcnQoIWNvbnN0YW50SW5zdHJ1Y3Rpb24uY29uc3RhbnQuaXNJbnQpOwogICAgICBpZiAoIWNvbnN0YW50X3N5c3RlbS5pc0ludChjb25zdGFudEluc3RydWN0aW9uLmNvbnN0YW50KSkgewogICAgICAgIC8vIC0wLjAgaXMgYSBkb3VibGUgYnV0IHdpbGwgcGFzcyB0aGUgcnVudGltZSBpbnRlZ2VyIGNoZWNrLgogICAgICAgIG5vZGUuc3RhdGljQ2hlY2tzID0gSEJvdW5kc0NoZWNrLkFMV0FZU19GQUxTRTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBISW5zdHJ1Y3Rpb24gZm9sZEJpbmFyeShjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbiwKICAgICAgSEluc3RydWN0aW9uIGxlZnQsIEhJbnN0cnVjdGlvbiByaWdodCkgewogICAgaWYgKGxlZnQgaXMgSENvbnN0YW50ICYmIHJpZ2h0IGlzIEhDb25zdGFudCkgewogICAgICBIQ29uc3RhbnQgb3AxID0gbGVmdDsKICAgICAgSENvbnN0YW50IG9wMiA9IHJpZ2h0OwogICAgICBDb25zdGFudFZhbHVlIGZvbGRlZCA9IG9wZXJhdGlvbi5mb2xkKG9wMS5jb25zdGFudCwgb3AyLmNvbnN0YW50KTsKICAgICAgaWYgKGZvbGRlZCAhPSBudWxsKSByZXR1cm4gX2dyYXBoLmFkZENvbnN0YW50KGZvbGRlZCwgX2Nsb3NlZFdvcmxkKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0QWRkKEhBZGQgbm9kZSkgewogICAgSEluc3RydWN0aW9uIGxlZnQgPSBub2RlLmxlZnQ7CiAgICBISW5zdHJ1Y3Rpb24gcmlnaHQgPSBub2RlLnJpZ2h0OwogICAgLy8gV2UgY2FuIG9ubHkgcGVyZm9ybSB0aGlzIHJld3JpdGluZyBvbiBJbnRlZ2VyLCBhcyBpdCBpcyBub3QKICAgIC8vIHZhbGlkIGZvciAtMC4wLgogICAgaWYgKGxlZnQuaXNJbnRlZ2VyKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgcmlnaHQuaXNJbnRlZ2VyKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIGlmIChsZWZ0IGlzIEhDb25zdGFudCAmJiBsZWZ0LmNvbnN0YW50LmlzWmVybykgcmV0dXJuIHJpZ2h0OwogICAgICBpZiAocmlnaHQgaXMgSENvbnN0YW50ICYmIHJpZ2h0LmNvbnN0YW50LmlzWmVybykgcmV0dXJuIGxlZnQ7CiAgICB9CiAgICByZXR1cm4gc3VwZXIudmlzaXRBZGQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRNdWx0aXBseShITXVsdGlwbHkgbm9kZSkgewogICAgSEluc3RydWN0aW9uIGxlZnQgPSBub2RlLmxlZnQ7CiAgICBISW5zdHJ1Y3Rpb24gcmlnaHQgPSBub2RlLnJpZ2h0OwogICAgaWYgKGxlZnQuaXNOdW1iZXIoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICByaWdodC5pc051bWJlcihfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBpZiAobGVmdCBpcyBIQ29uc3RhbnQgJiYgbGVmdC5jb25zdGFudC5pc09uZSkgcmV0dXJuIHJpZ2h0OwogICAgICBpZiAocmlnaHQgaXMgSENvbnN0YW50ICYmIHJpZ2h0LmNvbnN0YW50LmlzT25lKSByZXR1cm4gbGVmdDsKICAgIH0KICAgIHJldHVybiBzdXBlci52aXNpdE11bHRpcGx5KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0SW52b2tlQmluYXJ5KEhJbnZva2VCaW5hcnkgbm9kZSkgewogICAgSEluc3RydWN0aW9uIGxlZnQgPSBub2RlLmxlZnQ7CiAgICBISW5zdHJ1Y3Rpb24gcmlnaHQgPSBub2RlLnJpZ2h0OwogICAgY29uc3RhbnRfc3lzdGVtLkJpbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24gPSBub2RlLm9wZXJhdGlvbigpOwogICAgSENvbnN0YW50IGZvbGRlZCA9IGZvbGRCaW5hcnkob3BlcmF0aW9uLCBsZWZ0LCByaWdodCk7CiAgICBpZiAoZm9sZGVkICE9IG51bGwpIHJldHVybiBmb2xkZWQ7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIGJvb2wgYWxsVXNlcnNBcmVCb29saWZpZXMoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBMaXN0PEhJbnN0cnVjdGlvbj4gdXNlcnMgPSBpbnN0cnVjdGlvbi51c2VkQnk7CiAgICBpbnQgbGVuZ3RoID0gdXNlcnMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBpZiAodXNlcnNbaV0gaXMhIEhCb29saWZ5KSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB2aXNpdFJlbGF0aW9uYWwoSFJlbGF0aW9uYWwgbm9kZSkgewogICAgaWYgKGFsbFVzZXJzQXJlQm9vbGlmaWVzKG5vZGUpKSB7CiAgICAgIC8vIFRPRE8obmdlb2ZmcmF5KTogQ2FsbCBhIGJvb2xpZmllZCBzZWxlY3Rvci4KICAgICAgLy8gVGhpcyBub2RlIHN0YXlzIHRoZSBzYW1lLCBidXQgdGhlIEJvb2xpZnkgbm9kZSB3aWxsIGdvIGF3YXkuCiAgICB9CiAgICAvLyBOb3RlIHRoYXQgd2Ugc3RpbGwgaGF2ZSB0byBjYWxsIFtzdXBlcl0gdG8gbWFrZSBzdXJlIHRoYXQgd2UgZW5kIHVwCiAgICAvLyBpbiB0aGUgcmVtYWluaW5nIG9wdGltaXphdGlvbnMuCiAgICByZXR1cm4gc3VwZXIudmlzaXRSZWxhdGlvbmFsKG5vZGUpOwogIH0KCiAgSEluc3RydWN0aW9uIGhhbmRsZUlkZW50aXR5Q2hlY2soSFJlbGF0aW9uYWwgbm9kZSkgewogICAgSEluc3RydWN0aW9uIGxlZnQgPSBub2RlLmxlZnQ7CiAgICBISW5zdHJ1Y3Rpb24gcmlnaHQgPSBub2RlLnJpZ2h0OwogICAgQWJzdHJhY3RWYWx1ZSBsZWZ0VHlwZSA9IGxlZnQuaW5zdHJ1Y3Rpb25UeXBlOwogICAgQWJzdHJhY3RWYWx1ZSByaWdodFR5cGUgPSByaWdodC5pbnN0cnVjdGlvblR5cGU7CgogICAgSEluc3RydWN0aW9uIG1ha2VUcnVlKCkgPT4gX2dyYXBoLmFkZENvbnN0YW50Qm9vbCh0cnVlLCBfY2xvc2VkV29ybGQpOwogICAgSEluc3RydWN0aW9uIG1ha2VGYWxzZSgpID0+IF9ncmFwaC5hZGRDb25zdGFudEJvb2woZmFsc2UsIF9jbG9zZWRXb3JsZCk7CgogICAgLy8gSW50ZXJzZWN0aW9uIG9mIGludCBhbmQgZG91YmxlIHJldHVybiBjb25mbGljdGluZywgc28KICAgIC8vIHdlIGRvbid0IG9wdGltaXplIG9uIG51bWJlcnMgdG8gcHJlc2VydmUgdGhlIHJ1bnRpbWUgc2VtYW50aWNzLgogICAgaWYgKCEobGVmdC5pc051bWJlck9yTnVsbChfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSAmJgogICAgICAgIHJpZ2h0LmlzTnVtYmVyT3JOdWxsKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSkgewogICAgICBpZiAoX2Fic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAgIC5hcmVEaXNqb2ludChsZWZ0VHlwZSwgcmlnaHRUeXBlKQogICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICByZXR1cm4gbWFrZUZhbHNlKCk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAobGVmdC5pc051bGwoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICByaWdodC5pc051bGwoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcmV0dXJuIG1ha2VUcnVlKCk7CiAgICB9CgogICAgSEluc3RydWN0aW9uIGNvbXBhcmVDb25zdGFudChIQ29uc3RhbnQgY29uc3RhbnQsIEhJbnN0cnVjdGlvbiBpbnB1dCkgewogICAgICBpZiAoY29uc3RhbnQuY29uc3RhbnQuaXNUcnVlKSB7CiAgICAgICAgcmV0dXJuIGlucHV0OwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBuZXcgSE5vdChpbnB1dCwgX2Fic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUpOwogICAgICB9CiAgICB9CgogICAgaWYgKGxlZnQuaXNDb25zdGFudEJvb2xlYW4oKSAmJgogICAgICAgIHJpZ2h0LmlzQm9vbGVhbihfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICByZXR1cm4gY29tcGFyZUNvbnN0YW50KGxlZnQsIHJpZ2h0KTsKICAgIH0KCiAgICBpZiAocmlnaHQuaXNDb25zdGFudEJvb2xlYW4oKSAmJgogICAgICAgIGxlZnQuaXNCb29sZWFuKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiBjb21wYXJlQ29uc3RhbnQocmlnaHQsIGxlZnQpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobGVmdC5ub25DaGVjaygpLCByaWdodC5ub25DaGVjaygpKSkgewogICAgICAvLyBBdm9pZCBjb25zdGFudC1mb2xkaW5nIGBpZGVudGljYWwoeCwgeClgIHdoZW4gYHhgIG1pZ2h0IGJlIGRvdWJsZS4gIFRoZQogICAgICAvLyBkYXJ0MmpzIHJ1bnRpbWUgaGFzIG5vdCBhbHdheXMgYmVlbiBjb25zaXN0ZW50IHdpdGggdGhlIERhcnQKICAgICAgLy8gc3BlY2lmaWNhdGlvbiAoc2VjdGlvbiAxNi4wLjEpLCB3aGljaCBtYWtlcyBkaXN0aW5jdGlvbnMgb24gTmFOcyBhbmQKICAgICAgLy8gLTAuMCB0aGF0IGFyZSBoYXJkIHRvIGltcGxlbWVudCBlZmZpY2llbnRseS4KICAgICAgaWYgKGxlZnQuaXNJbnRlZ2VyT3JOdWxsKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgICAgcmV0dXJuIG1ha2VUcnVlKCk7CiAgICAgIH0KICAgICAgaWYgKGxlZnQuaXNQcmltaXRpdmVOdW1iZXIoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseUZhbHNlKSB7CiAgICAgICAgcmV0dXJuIG1ha2VUcnVlKCk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB2aXNpdElkZW50aXR5KEhJZGVudGl0eSBub2RlKSB7CiAgICBISW5zdHJ1Y3Rpb24gbmV3SW5zdHJ1Y3Rpb24gPSBoYW5kbGVJZGVudGl0eUNoZWNrKG5vZGUpOwogICAgcmV0dXJuIG5ld0luc3RydWN0aW9uID09IG51bGwgPyBzdXBlci52aXNpdElkZW50aXR5KG5vZGUpIDogbmV3SW5zdHJ1Y3Rpb247CiAgfQoKICB2b2lkIHNpbXBsaWZ5Q29uZGl0aW9uKAogICAgICBIQmFzaWNCbG9jayBibG9jaywgSEluc3RydWN0aW9uIGNvbmRpdGlvbiwgYm9vbCB2YWx1ZSkgewogICAgLy8gYGV4Y2x1ZGVQaGlPdXRFZGdlczogdHJ1ZWAgcHJldmVudHMgcmVwbGFjaW5nIGEgcGFydGlhbGx5IGRvbWluYXRlZCBwaGkKICAgIC8vIG5vZGUgaW5wdXQgd2l0aCBhIGNvbnN0YW50LiBUaGlzIHRlbmRzIHRvIGFkZCB1bm5lY2Vzc2FyeSBhc3NpZ25tZW50cywgYnkKICAgIC8vIHRyYW5zZm9ybWluZyB0aGUgZm9sbG93aW5nLCB3aGljaCBoYXMgcGhpKGZhbHNlLCB4KSwKICAgIC8vCiAgICAvLyAgICBpZiAoeCkgeyBpbml0KCk7IHggPSBmYWxzZTsgfQogICAgLy8KICAgIC8vIGludG8gdGhpcywgd2hpY2ggaGFzIHBoaShmYWxzZSwgZmFsc2UpCiAgICAvLwogICAgLy8gICAgaWYgKHgpIHsgaW5pdCgpOyB4ID0gZmFsc2U7IH0gZWxzZSB7IHggPSBmYWxzZTsgfQogICAgLy8KICAgIC8vIHdoaWNoIGlzIGZ1cnRoZXIgc2ltcGxpZmllZCB0bzoKICAgIC8vCiAgICAvLyAgICBpZiAoeCkgeyBpbml0KCk7IH0KICAgIC8vICAgIC4uLgogICAgLy8gICAgeCA9IGZhbHNlOwogICAgLy8KICAgIC8vIFRoaXMgaXMgbW9zdGx5IGhhcm1sZXNzIChpZiBhIGxpdHRsZSBjb25mdXNpbmcpIGJ1dCBkb2VzIGNhdXNlIGEgbG90IG9mCiAgICAvLyBgeCA9IGZhbHNlO2AgY29waWVzIHRvIGJlIGluc2VydGVkIHdoZW4gYSBsb29wIGJvZHkgaGFzIG1hbnkgY29udGludWUKICAgIC8vIHN0YXRlbWVudHMgb3IgZW5kcyB3aXRoIGEgc3dpdGNoLgogICAgRG9taW5hdGVkVXNlcyB1c2VzID0KICAgICAgICBEb21pbmF0ZWRVc2VzLm9mKGNvbmRpdGlvbiwgYmxvY2suZmlyc3QsIGV4Y2x1ZGVQaGlPdXRFZGdlczogdHJ1ZSk7CiAgICBpZiAodXNlcy5pc0VtcHR5KSByZXR1cm47CiAgICB1c2VzLnJlcGxhY2VXaXRoKF9ncmFwaC5hZGRDb25zdGFudEJvb2wodmFsdWUsIF9jbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0SWYoSElmIG5vZGUpIHsKICAgIEhJbnN0cnVjdGlvbiBjb25kaXRpb24gPSBub2RlLmNvbmRpdGlvbjsKICAgIGlmIChjb25kaXRpb24uaXNDb25zdGFudCgpKSByZXR1cm4gbm9kZTsKICAgIGJvb2wgaXNOZWdhdGVkID0gY29uZGl0aW9uIGlzIEhOb3Q7CgogICAgaWYgKGlzTmVnYXRlZCkgewogICAgICBjb25kaXRpb24gPSBjb25kaXRpb24uaW5wdXRzWzBdOwogICAgfSBlbHNlIHsKICAgICAgLy8gSXQgaXMgcG9zc2libGUgZm9yIExJQ00gdG8gbW92ZSBhIG5lZ2F0ZWQgdmVyc2lvbiBvZiB0aGUKICAgICAgLy8gY29uZGl0aW9uIG91dCBvZiB0aGUgbG9vcCB3aGVyZSBpdCB1c2VkLiBXZSBzdGlsbCB3YW50IHRvCiAgICAgIC8vIHNpbXBsaWZ5IHRoZSBuZXN0ZWQgdXNlIG9mIHRoZSBjb25kaXRpb24gaW4gdGhhdCBjYXNlLCBzbwogICAgICAvLyB3ZSBsb29rIGZvciBhbGwgZG9taW5hdGluZyBuZWdhdGVkIGNvbmRpdGlvbnMgYW5kIHJlcGxhY2UKICAgICAgLy8gbmVzdGVkIHVzZXMgb2YgdGhlbSB3aXRoIHRydWUgb3IgZmFsc2UuCiAgICAgIEl0ZXJhYmxlPEhJbnN0cnVjdGlvbj4gZG9taW5hdGluZyA9IGNvbmRpdGlvbi51c2VkQnkKICAgICAgICAgIC53aGVyZSgodXNlcikgPT4gdXNlciBpcyBITm90ICYmIHVzZXIuZG9taW5hdGVzKG5vZGUpKTsKICAgICAgZG9taW5hdGluZy5mb3JFYWNoKChob2lzdGVkKSB7CiAgICAgICAgc2ltcGxpZnlDb25kaXRpb24obm9kZS50aGVuQmxvY2ssIGhvaXN0ZWQsIGZhbHNlKTsKICAgICAgICBzaW1wbGlmeUNvbmRpdGlvbihub2RlLmVsc2VCbG9jaywgaG9pc3RlZCwgdHJ1ZSk7CiAgICAgIH0pOwogICAgfQogICAgc2ltcGxpZnlDb25kaXRpb24obm9kZS50aGVuQmxvY2ssIGNvbmRpdGlvbiwgIWlzTmVnYXRlZCk7CiAgICBzaW1wbGlmeUNvbmRpdGlvbihub2RlLmVsc2VCbG9jaywgY29uZGl0aW9uLCBpc05lZ2F0ZWQpOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRJcyhISXMgbm9kZSkgewogICAgRGFydFR5cGUgdHlwZSA9IG5vZGUudHlwZUV4cHJlc3Npb247CgogICAgaWYgKCFub2RlLmlzUmF3Q2hlY2spIHsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9IGVsc2UgaWYgKHR5cGUuaXNUeXBlZGVmKSB7CiAgICAgIHJldHVybiBub2RlOwogICAgfSBlbHNlIGlmICh0eXBlLmlzRnVuY3Rpb25UeXBlKSB7CiAgICAgIHJldHVybiBub2RlOwogICAgfSBlbHNlIGlmICh0eXBlLmlzRnV0dXJlT3IpIHsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgaWYgKHR5cGUgPT0gY29tbW9uRWxlbWVudHMub2JqZWN0VHlwZSB8fCB0eXBlLnRyZWF0QXNEeW5hbWljKSB7CiAgICAgIHJldHVybiBfZ3JhcGguYWRkQ29uc3RhbnRCb29sKHRydWUsIF9jbG9zZWRXb3JsZCk7CiAgICB9CiAgICBJbnRlcmZhY2VUeXBlIGludGVyZmFjZVR5cGUgPSB0eXBlOwogICAgQ2xhc3NFbnRpdHkgZWxlbWVudCA9IGludGVyZmFjZVR5cGUuZWxlbWVudDsKICAgIEhJbnN0cnVjdGlvbiBleHByZXNzaW9uID0gbm9kZS5leHByZXNzaW9uOwogICAgaWYgKGV4cHJlc3Npb24uaXNJbnRlZ2VyKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIGlmIChlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmludENsYXNzIHx8CiAgICAgICAgICBlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLm51bUNsYXNzIHx8CiAgICAgICAgICBjb21tb25FbGVtZW50cy5pc051bWJlck9yU3RyaW5nU3VwZXJ0eXBlKGVsZW1lbnQpKSB7CiAgICAgICAgcmV0dXJuIF9ncmFwaC5hZGRDb25zdGFudEJvb2wodHJ1ZSwgX2Nsb3NlZFdvcmxkKTsKICAgICAgfSBlbHNlIGlmIChlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmRvdWJsZUNsYXNzKSB7CiAgICAgICAgLy8gV2UgbGV0IHRoZSBKUyBzZW1hbnRpY3MgZGVjaWRlIGZvciB0aGF0IGNoZWNrLiBDdXJyZW50bHkKICAgICAgICAvLyB0aGUgY29kZSB3ZSBlbWl0IHdpbGwgYWx3YXlzIHJldHVybiB0cnVlLgogICAgICAgIHJldHVybiBub2RlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBfZ3JhcGguYWRkQ29uc3RhbnRCb29sKGZhbHNlLCBfY2xvc2VkV29ybGQpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24uaXNEb3VibGUoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgaWYgKGVsZW1lbnQgPT0gY29tbW9uRWxlbWVudHMuZG91YmxlQ2xhc3MgfHwKICAgICAgICAgIGVsZW1lbnQgPT0gY29tbW9uRWxlbWVudHMubnVtQ2xhc3MgfHwKICAgICAgICAgIGNvbW1vbkVsZW1lbnRzLmlzTnVtYmVyT3JTdHJpbmdTdXBlcnR5cGUoZWxlbWVudCkpIHsKICAgICAgICByZXR1cm4gX2dyYXBoLmFkZENvbnN0YW50Qm9vbCh0cnVlLCBfY2xvc2VkV29ybGQpOwogICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPT0gY29tbW9uRWxlbWVudHMuaW50Q2xhc3MpIHsKICAgICAgICAvLyBXZSBsZXQgdGhlIEpTIHNlbWFudGljcyBkZWNpZGUgZm9yIHRoYXQgY2hlY2suIEN1cnJlbnRseQogICAgICAgIC8vIHRoZSBjb2RlIHdlIGVtaXQgd2lsbCByZXR1cm4gdHJ1ZSBmb3IgYSBkb3VibGUgdGhhdCBjYW4gYmUKICAgICAgICAvLyByZXByZXNlbnRlZCBhcyBhIDMxLWJpdCBpbnRlZ2VyIGFuZCBmb3IgLTAuMC4KICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gX2dyYXBoLmFkZENvbnN0YW50Qm9vbChmYWxzZSwgX2Nsb3NlZFdvcmxkKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmlzTnVtYmVyKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIGlmIChlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLm51bUNsYXNzKSB7CiAgICAgICAgcmV0dXJuIF9ncmFwaC5hZGRDb25zdGFudEJvb2wodHJ1ZSwgX2Nsb3NlZFdvcmxkKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBXZSBjYW5ub3QganVzdCByZXR1cm4gZmFsc2UsIGJlY2F1c2UgdGhlIGV4cHJlc3Npb24gbWF5IGJlIG9mCiAgICAgICAgLy8gdHlwZSBpbnQgb3IgZG91YmxlLgogICAgICB9CiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24KICAgICAgICAgICAgLmlzUHJpbWl0aXZlTnVtYmVyKF9hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgICAuaXNQb3RlbnRpYWxseVRydWUgJiYKICAgICAgICBlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmludENsYXNzKSB7CiAgICAgIC8vIFdlIGxldCB0aGUgSlMgc2VtYW50aWNzIGRlY2lkZSBmb3IgdGhhdCBjaGVjay4KICAgICAgcmV0dXJuIG5vZGU7CiAgICAgIC8vIFdlIG5lZWQgdGhlIFs6aGFzVHlwZUFyZ3VtZW50czpdIGNoZWNrIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZQogICAgICAvLyB0aGUgbm90aW9uIG9mIGdlbmVyaWNzIGluIHRoZSBiYWNrZW5kLiBGb3IgZXhhbXBsZSwgWzp0aGlzOl0gaW4KICAgICAgLy8gYSBjbGFzcyBbOkE8VD46XSwgaXMgY3VycmVudGx5IGFsd2F5cyBjb25zaWRlcmVkIHRvIGhhdmUgdGhlCiAgICAgIC8vIHJhdyB0eXBlLgogICAgfSBlbHNlIGlmICghUnVudGltZVR5cGVzU3Vic3RpdHV0aW9ucy5oYXNUeXBlQXJndW1lbnRzKHR5cGUpKSB7CiAgICAgIEFic3RyYWN0VmFsdWUgZXhwcmVzc2lvbk1hc2sgPSBleHByZXNzaW9uLmluc3RydWN0aW9uVHlwZTsKICAgICAgQWJzdHJhY3RCb29sIGlzSW5zdGFuY2VPZiA9CiAgICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5pc0luc3RhbmNlT2YoZXhwcmVzc2lvbk1hc2ssIGVsZW1lbnQpOwogICAgICBpZiAoaXNJbnN0YW5jZU9mLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICByZXR1cm4gX2dyYXBoLmFkZENvbnN0YW50Qm9vbCh0cnVlLCBfY2xvc2VkV29ybGQpOwogICAgICB9IGVsc2UgaWYgKGlzSW5zdGFuY2VPZi5pc0RlZmluaXRlbHlGYWxzZSkgewogICAgICAgIHJldHVybiBfZ3JhcGguYWRkQ29uc3RhbnRCb29sKGZhbHNlLCBfY2xvc2VkV29ybGQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB2aXNpdFR5cGVDb252ZXJzaW9uKEhUeXBlQ29udmVyc2lvbiBub2RlKSB7CiAgICBpZiAobm9kZS5pc1JlZHVuZGFudChfY2xvc2VkV29ybGQpKSByZXR1cm4gbm9kZS5jaGVja2VkSW5wdXQ7CgogICAgLy8gU2ltcGxpZnkgJ2FzIFQnIHdoZXJlIFQgaXMgYSBzaW1wbGUgdHlwZS4KICAgIERhcnRUeXBlIGNoZWNrZWRUeXBlID0gbm9kZS50eXBlRXhwcmVzc2lvbjsKICAgIGlmIChjaGVja2VkVHlwZSBpcyBUeXBlVmFyaWFibGVUeXBlICYmIG5vZGUuaW5wdXRzLmxlbmd0aCA9PSAyKSB7CiAgICAgIEhJbnN0cnVjdGlvbiByZXAgPSBub2RlLnR5cGVSZXByZXNlbnRhdGlvbjsKICAgICAgaWYgKHJlcCBpcyBIVHlwZUluZm9FeHByZXNzaW9uICYmCiAgICAgICAgICByZXAua2luZCA9PSBUeXBlSW5mb0V4cHJlc3Npb25LaW5kLkNPTVBMRVRFICYmCiAgICAgICAgICByZXAuaW5wdXRzLmlzRW1wdHkpIHsKICAgICAgICBEYXJ0VHlwZSB0eXBlID0gcmVwLmRhcnRUeXBlOwogICAgICAgIGlmICh0eXBlLmlzSW50ZXJmYWNlVHlwZSAmJiB0eXBlLnRyZWF0QXNSYXcpIHsKICAgICAgICAgIHJldHVybiBub2RlLmNoZWNrZWRJbnB1dC5jb252ZXJ0VHlwZShfY2xvc2VkV29ybGQsIHR5cGUsIG5vZGUua2luZCkKICAgICAgICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IG5vZGUuc291cmNlSW5mb3JtYXRpb247CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRUeXBlS25vd24oSFR5cGVLbm93biBub2RlKSB7CiAgICByZXR1cm4gbm9kZS5pc1JlZHVuZGFudChfY2xvc2VkV29ybGQpID8gbm9kZS5jaGVja2VkSW5wdXQgOiBub2RlOwogIH0KCiAgRmllbGRFbnRpdHkgZmluZENvbmNyZXRlRmllbGRGb3JEeW5hbWljQWNjZXNzKAogICAgICBISW52b2tlRHluYW1pY0ZpZWxkIG5vZGUsIEhJbnN0cnVjdGlvbiByZWNlaXZlcikgewogICAgQWJzdHJhY3RWYWx1ZSByZWNlaXZlclR5cGUgPSByZWNlaXZlci5pbnN0cnVjdGlvblR5cGU7CiAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0gbm9kZS5lbGVtZW50IGlzIEZpZWxkRW50aXR5CiAgICAgICAgPyBub2RlLmVsZW1lbnQKICAgICAgICA6IF9jbG9zZWRXb3JsZC5sb2NhdGVTaW5nbGVNZW1iZXIobm9kZS5zZWxlY3RvciwgcmVjZWl2ZXJUeXBlKTsKICAgIHJldHVybiBtZW1iZXIgaXMgRmllbGRFbnRpdHkgPyBtZW1iZXIgOiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0RmllbGRHZXQoSEZpZWxkR2V0IG5vZGUpIHsKICAgIGlmIChub2RlLmlzTnVsbENoZWNrKSByZXR1cm4gbm9kZTsKICAgIHZhciByZWNlaXZlciA9IG5vZGUucmVjZWl2ZXI7CgogICAgLy8gSEZpZWxkR2V0IG9mIGEgY29uc3RydWN0ZWQgY29uc3RhbnQgY2FuIGJlIHJlcGxhY2VkIHdpdGggdGhlIGNvbnN0YW50J3MKICAgIC8vIGZpZWxkLgogICAgaWYgKHJlY2VpdmVyIGlzIEhDb25zdGFudCkgewogICAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50ID0gcmVjZWl2ZXIuY29uc3RhbnQ7CiAgICAgIGlmIChjb25zdGFudC5pc0NvbnN0cnVjdGVkT2JqZWN0KSB7CiAgICAgICAgQ29uc3RydWN0ZWRDb25zdGFudFZhbHVlIGNvbnN0cnVjdGVkQ29uc3RhbnQgPSBjb25zdGFudDsKICAgICAgICBNYXA8RmllbGRFbnRpdHksIENvbnN0YW50VmFsdWU+IGZpZWxkcyA9IGNvbnN0cnVjdGVkQ29uc3RhbnQuZmllbGRzOwogICAgICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBmaWVsZHNbbm9kZS5lbGVtZW50XTsKICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIF9ncmFwaC5hZGRDb25zdGFudCh2YWx1ZSwgX2Nsb3NlZFdvcmxkKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbm9kZTsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB2aXNpdEdldExlbmd0aChIR2V0TGVuZ3RoIG5vZGUpIHsKICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciA9IG5vZGUucmVjZWl2ZXI7CiAgICBpZiAoX2dyYXBoLmFsbG9jYXRlZEZpeGVkTGlzdHMuY29udGFpbnMocmVjZWl2ZXIpKSB7CiAgICAgIC8vIFRPRE8obmdlb2ZmcmF5KTogY2hlY2tpbmcgaWYgdGhlIHNlY29uZCBpbnB1dCBpcyBhbiBpbnRlZ2VyCiAgICAgIC8vIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IGJ1dCBpdCBjdXJyZW50bHkgbWFrZXMgaXQgZWFzaWVyIGZvcgogICAgICAvLyBvdGhlciBvcHRpbWl6YXRpb25zIHRvIHJlYXNvbiBhYm91dCBhIGZpeGVkIGxlbmd0aCBjb25zdHJ1Y3RvcgogICAgICAvLyB0aGF0IHdlIGtub3cgdGFrZXMgYW4gaW50LgogICAgICBpZiAocmVjZWl2ZXIuaW5wdXRzWzBdLmlzSW50ZWdlcihfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICAgIHJldHVybiByZWNlaXZlci5pbnB1dHNbMF07CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocmVjZWl2ZXIuaXNDb25zdGFudExpc3QoKSkgewogICAgICBIQ29uc3RhbnQgY29uc3RhbnRSZWNlaXZlciA9IHJlY2VpdmVyOwogICAgICBMaXN0Q29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IGNvbnN0YW50UmVjZWl2ZXIuY29uc3RhbnQ7CiAgICAgIHJldHVybiBfZ3JhcGguYWRkQ29uc3RhbnRJbnQoY29uc3RhbnQubGVuZ3RoLCBfY2xvc2VkV29ybGQpOwogICAgfSBlbHNlIGlmIChyZWNlaXZlci5pc0NvbnN0YW50U3RyaW5nKCkpIHsKICAgICAgSENvbnN0YW50IGNvbnN0YW50UmVjZWl2ZXIgPSByZWNlaXZlcjsKICAgICAgU3RyaW5nQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IGNvbnN0YW50UmVjZWl2ZXIuY29uc3RhbnQ7CiAgICAgIHJldHVybiBfZ3JhcGguYWRkQ29uc3RhbnRJbnQoY29uc3RhbnQubGVuZ3RoLCBfY2xvc2VkV29ybGQpOwogICAgfSBlbHNlIHsKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlID0gcmVjZWl2ZXIuaW5zdHJ1Y3Rpb25UeXBlOwogICAgICBpZiAoX2Fic3RyYWN0VmFsdWVEb21haW4uaXNDb250YWluZXIodHlwZSkgJiYKICAgICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmdldENvbnRhaW5lckxlbmd0aCh0eXBlKSAhPSBudWxsKSB7CiAgICAgICAgSEluc3RydWN0aW9uIGNvbnN0YW50ID0gX2dyYXBoLmFkZENvbnN0YW50SW50KAogICAgICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRDb250YWluZXJMZW5ndGgodHlwZSksIF9jbG9zZWRXb3JsZCk7CiAgICAgICAgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzTnVsbCh0eXBlKS5pc1BvdGVudGlhbGx5VHJ1ZSkgewogICAgICAgICAgLy8gSWYgdGhlIGNvbnRhaW5lciBjYW4gYmUgbnVsbCwgd2UgdXBkYXRlIGFsbCB1c2VzIG9mIHRoZSBsZW5ndGgKICAgICAgICAgIC8vIGFjY2VzcyB0byB1c2UgdGhlIGNvbnN0YW50IGluc3RlYWQsIGJ1dCBrZWVwIHRoZSBsZW5ndGggYWNjZXNzIGluCiAgICAgICAgICAvLyB0aGUgZ3JhcGgsIHRvIGVuc3VyZSB3ZSBzdGlsbCBoYXZlIGEgbnVsbCBjaGVjay4KICAgICAgICAgIG5vZGUuYmxvY2sucmV3cml0ZShub2RlLCBjb25zdGFudCk7CiAgICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGNvbnN0YW50OwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmIChub2RlLmlzQXNzaWduYWJsZSAmJgogICAgICAgIGlzRml4ZWRMZW5ndGgocmVjZWl2ZXIuaW5zdHJ1Y3Rpb25UeXBlLCBfY2xvc2VkV29ybGQpKSB7CiAgICAgIC8vIFRoZSBpbnB1dCB0eXBlIGhhcyBjaGFuZ2VkIHRvIGZpeGVkLWxlbmd0aCBzbyBjaGFuZ2UgdG8gYW4gdW5hc3NpZ25hYmxlCiAgICAgIC8vIEhHZXRMZW5ndGggdG8gYWxsb3cgbW9yZSBHVk4gb3B0aW1pemF0aW9ucy4KICAgICAgcmV0dXJuIG5ldyBIR2V0TGVuZ3RoKHJlY2VpdmVyLCBub2RlLmluc3RydWN0aW9uVHlwZSwKICAgICAgICAgIGlzQXNzaWduYWJsZTogZmFsc2UpOwogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRJbmRleChISW5kZXggbm9kZSkgewogICAgaWYgKG5vZGUucmVjZWl2ZXIuaXNDb25zdGFudExpc3QoKSAmJiBub2RlLmluZGV4LmlzQ29uc3RhbnRJbnRlZ2VyKCkpIHsKICAgICAgSENvbnN0YW50IGluc3RydWN0aW9uID0gbm9kZS5yZWNlaXZlcjsKICAgICAgTGlzdENvbnN0YW50VmFsdWUgbGlzdCA9IGluc3RydWN0aW9uLmNvbnN0YW50OwogICAgICBMaXN0PENvbnN0YW50VmFsdWU+IGVudHJpZXMgPSBsaXN0LmVudHJpZXM7CiAgICAgIEhDb25zdGFudCBpbmRleEluc3RydWN0aW9uID0gbm9kZS5pbmRleDsKICAgICAgSW50Q29uc3RhbnRWYWx1ZSBpbmRleENvbnN0YW50ID0gaW5kZXhJbnN0cnVjdGlvbi5jb25zdGFudDsKICAgICAgaW50IGluZGV4ID0gaW5kZXhDb25zdGFudC5pbnRWYWx1ZS50b0ludCgpOwogICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IGVudHJpZXMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIF9ncmFwaC5hZGRDb25zdGFudChlbnRyaWVzW2luZGV4XSwgX2Nsb3NlZFdvcmxkKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRJbnZva2VEeW5hbWljR2V0dGVyKEhJbnZva2VEeW5hbWljR2V0dGVyIG5vZGUpIHsKICAgIHByb3BhZ2F0ZUNvbnN0YW50VmFsdWVUb1VzZXMobm9kZSk7CiAgICBpZiAobm9kZS5pc0ludGVyY2VwdGVkQ2FsbCkgewogICAgICBISW5zdHJ1Y3Rpb24gZm9sZGVkID0gaGFuZGxlSW50ZXJjZXB0ZWRDYWxsKG5vZGUpOwogICAgICBpZiAoZm9sZGVkICE9IG5vZGUpIHJldHVybiBmb2xkZWQ7CiAgICB9CiAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIgPSBub2RlLmdldERhcnRSZWNlaXZlcihfY2xvc2VkV29ybGQpOwogICAgQWJzdHJhY3RWYWx1ZSByZWNlaXZlclR5cGUgPSByZWNlaXZlci5pbnN0cnVjdGlvblR5cGU7CiAgICBGaWVsZEVudGl0eSBmaWVsZCA9IG5vZGUuZWxlbWVudCBpcyBGaWVsZEVudGl0eQogICAgICAgID8gbm9kZS5lbGVtZW50CiAgICAgICAgOiBmaW5kQ29uY3JldGVGaWVsZEZvckR5bmFtaWNBY2Nlc3Mobm9kZSwgcmVjZWl2ZXIpOwogICAgaWYgKGZpZWxkICE9IG51bGwpIHsKICAgICAgRmllbGRBbmFseXNpc0RhdGEgZmllbGREYXRhID0KICAgICAgICAgIF9jbG9zZWRXb3JsZC5maWVsZEFuYWx5c2lzLmdldEZpZWxkRGF0YShmaWVsZCk7CiAgICAgIGlmIChmaWVsZERhdGEuaXNFZmZlY3RpdmVseUNvbnN0YW50KSB7CiAgICAgICAgLy8gVGhlIGZpZWxkIGlzIGVsaWRlZCBhbmQgcmVwbGFjZSBpdCB3aXRoIGl0cyBjb25zdGFudCB2YWx1ZS4KICAgICAgICBpZiAoX2Fic3RyYWN0VmFsdWVEb21haW4uaXNOdWxsKHJlY2VpdmVyVHlwZSkuaXNQb3RlbnRpYWxseVRydWUpIHsKICAgICAgICAgIC8vIFRoZSByZWNlaXZlciBpcyBwb3RlbnRpYWxseSBgbnVsbGAgc28gd2UgaW5zZXJ0IGEgbnVsbCByZWNlaXZlcgogICAgICAgICAgLy8gZ3VhcmQgdG8gdHJpZ2dlciBhIG51bGwgcG9pbnRlciBleGNlcHRpb24uCiAgICAgICAgICAvLwogICAgICAgICAgLy8gVGhpcyBjb3VsZCBiZSBpbnNlcnRlZCB1bmNvbmRpdGlvbmFsbHkgYW5kIHJlbW92ZWQgYnkgbGF0ZXIKICAgICAgICAgIC8vIG9wdGltaXphdGlvbnMgaWYgdW5uZWNlc3NhcnksIGJ1dCBwZXJmb3JtYW5jZSB3ZSBkbyBpdAogICAgICAgICAgLy8gY29uZGl0aW9uYWxseSBoZXJlLgogICAgICAgICAgLy8gVE9ETygzNTk5Nik6IFJlcGxhY2Ugd2l0aCBudWxsIHJlY2VpdmVyIGd1YXJkIGluc3RydWN0aW9uLgogICAgICAgICAgSEluc3RydWN0aW9uIGR1bW15R2V0ID0gbmV3IEhGaWVsZEdldChudWxsLCByZWNlaXZlciwKICAgICAgICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgICAgICAgICBpc0Fzc2lnbmFibGU6IGZhbHNlKTsKICAgICAgICAgIF9sb2c/LnJlZ2lzdGVyRmllbGRHZXQobm9kZSwgZHVtbXlHZXQpOwogICAgICAgICAgbm9kZS5ibG9jay5hZGRCZWZvcmUobm9kZSwgZHVtbXlHZXQpOwogICAgICAgIH0KICAgICAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50ID0gZmllbGREYXRhLmNvbnN0YW50VmFsdWU7CiAgICAgICAgSENvbnN0YW50IHJlc3VsdCA9IF9ncmFwaC5hZGRDb25zdGFudChjb25zdGFudCwgX2Nsb3NlZFdvcmxkLAogICAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgICAgX2xvZz8ucmVnaXN0ZXJDb25zdGFudEZpZWxkR2V0KG5vZGUsIGZpZWxkLCByZXN1bHQpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgSEZpZWxkR2V0IHJlc3VsdCA9IF9kaXJlY3RGaWVsZEdldChyZWNlaXZlciwgZmllbGQsIG5vZGUpOwogICAgICAgIF9sb2c/LnJlZ2lzdGVyRmllbGRHZXQobm9kZSwgcmVzdWx0KTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICB9CgogICAgbm9kZS5lbGVtZW50ID8/PQogICAgICAgIF9jbG9zZWRXb3JsZC5sb2NhdGVTaW5nbGVNZW1iZXIobm9kZS5zZWxlY3RvciwgcmVjZWl2ZXJUeXBlKTsKICAgIGlmIChub2RlLmVsZW1lbnQgIT0gbnVsbCAmJgogICAgICAgIG5vZGUuZWxlbWVudC5uYW1lID09IG5vZGUuc2VsZWN0b3IubmFtZSAmJgogICAgICAgIG5vZGUuZWxlbWVudC5pc0Z1bmN0aW9uKSB7CiAgICAgIC8vIEEgcHJvcGVydHkgZXh0cmFjdGlvbiBnZXR0ZXIsIGFrYSBhIHRlYXItb2ZmLgogICAgICBub2RlLnNpZGVFZmZlY3RzLmNsZWFyQWxsRGVwZW5kZW5jaWVzKCk7CiAgICAgIG5vZGUuc2lkZUVmZmVjdHMuY2xlYXJBbGxTaWRlRWZmZWN0cygpOwogICAgICBub2RlLnNldFVzZUd2bigpOyAvLyBXZSBkb24ndCBjYXJlIGFib3V0IGlkZW50aXR5IG9mIHRlYXItb2Zmcy4KICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgSEluc3RydWN0aW9uIF9kaXJlY3RGaWVsZEdldCgKICAgICAgSEluc3RydWN0aW9uIHJlY2VpdmVyLCBGaWVsZEVudGl0eSBmaWVsZCwgSEluc3RydWN0aW9uIG5vZGUpIHsKICAgIGJvb2wgaXNBc3NpZ25hYmxlID0gIV9jbG9zZWRXb3JsZC5maWVsZE5ldmVyQ2hhbmdlcyhmaWVsZCk7CgogICAgQWJzdHJhY3RWYWx1ZSB0eXBlOwogICAgaWYgKF9uYXRpdmVEYXRhLmlzTmF0aXZlQ2xhc3MoZmllbGQuZW5jbG9zaW5nQ2xhc3MpKSB7CiAgICAgIHR5cGUgPSBBYnN0cmFjdFZhbHVlRmFjdG9yeS5mcm9tTmF0aXZlQmVoYXZpb3IoCiAgICAgICAgICBfbmF0aXZlRGF0YS5nZXROYXRpdmVGaWVsZExvYWRCZWhhdmlvcihmaWVsZCksIF9jbG9zZWRXb3JsZCk7CiAgICB9IGVsc2UgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2UgdGhlIHBvdGVudGlhbGx5IG1vcmUgcHJlY2lzZSB0eXBlIG9mIHRoZQogICAgICAvLyBub2RlICsgZmluZCBhIHRlc3QgdGhhdCBzaG93cyBpdHMgdXNlZnVsbmVzcy4KICAgICAgLy8gdHlwZSA9IF9hYnN0cmFjdFZhbHVlRG9tYWluLmludGVyc2VjdGlvbigKICAgICAgLy8gICAgIG5vZGUuaW5zdHJ1Y3Rpb25UeXBlLAogICAgICAvLyAgICAgQWJzdHJhY3RWYWx1ZUZhY3RvcnkuaW5mZXJyZWRUeXBlRm9yTWVtYmVyKAogICAgICAvLyAgICAgICAgIGZpZWxkLCBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cykpOwogICAgICB0eXBlID0gQWJzdHJhY3RWYWx1ZUZhY3RvcnkuaW5mZXJyZWRUeXBlRm9yTWVtYmVyKAogICAgICAgICAgZmllbGQsIF9nbG9iYWxJbmZlcmVuY2VSZXN1bHRzKTsKICAgIH0KCiAgICByZXR1cm4gbmV3IEhGaWVsZEdldChmaWVsZCwgcmVjZWl2ZXIsIHR5cGUsIG5vZGUuc291cmNlSW5mb3JtYXRpb24sCiAgICAgICAgaXNBc3NpZ25hYmxlOiBpc0Fzc2lnbmFibGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0SW52b2tlRHluYW1pY1NldHRlcihISW52b2tlRHluYW1pY1NldHRlciBub2RlKSB7CiAgICBpZiAobm9kZS5pc0ludGVyY2VwdGVkQ2FsbCkgewogICAgICBISW5zdHJ1Y3Rpb24gZm9sZGVkID0gaGFuZGxlSW50ZXJjZXB0ZWRDYWxsKG5vZGUpOwogICAgICBpZiAoZm9sZGVkICE9IG5vZGUpIHJldHVybiBmb2xkZWQ7CiAgICB9CgogICAgSEluc3RydWN0aW9uIHJlY2VpdmVyID0gbm9kZS5nZXREYXJ0UmVjZWl2ZXIoX2Nsb3NlZFdvcmxkKTsKICAgIEZpZWxkRW50aXR5IGZpZWxkID0gZmluZENvbmNyZXRlRmllbGRGb3JEeW5hbWljQWNjZXNzKG5vZGUsIHJlY2VpdmVyKTsKICAgIGlmIChmaWVsZCA9PSBudWxsIHx8ICFmaWVsZC5pc0Fzc2lnbmFibGUpIHJldHVybiBub2RlOwogICAgLy8gVXNlIGBub2RlLmlucHV0cy5sYXN0YCBpbiBjYXNlIHRoZSBjYWxsIGZvbGxvd3MgdGhlIGludGVyY2VwdG9yIGNhbGxpbmcKICAgIC8vIGNvbnZlbnRpb24sIGJ1dCBpcyBub3QgYSBjYWxsIG9uIGFuIGludGVyY2VwdG9yLgogICAgSEluc3RydWN0aW9uIHZhbHVlID0gbm9kZS5pbnB1dHMubGFzdDsKICAgIGlmIChfb3B0aW9ucy5wYXJhbWV0ZXJDaGVja1BvbGljeS5pc0VtaXR0ZWQpIHsKICAgICAgRGFydFR5cGUgdHlwZSA9IF9jbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQuZ2V0RmllbGRUeXBlKGZpZWxkKTsKICAgICAgaWYgKCF0eXBlLnRyZWF0QXNSYXcgfHwKICAgICAgICAgIHR5cGUuaXNUeXBlVmFyaWFibGUgfHwKICAgICAgICAgIHR5cGUudW5hbGlhc2VkLmlzRnVuY3Rpb25UeXBlIHx8CiAgICAgICAgICB0eXBlLnVuYWxpYXNlZC5pc0Z1dHVyZU9yKSB7CiAgICAgICAgLy8gV2UgY2Fubm90IGdlbmVyYXRlIHRoZSBjb3JyZWN0IHR5cGUgcmVwcmVzZW50YXRpb24gaGVyZSwgc28gZG9uJ3QKICAgICAgICAvLyBpbmxpbmUgdGhpcyBhY2Nlc3MuCiAgICAgICAgLy8gVE9ETyhzcmEpOiBJZiB0aGUgaW5wdXQgaXMgc3VjaCB0aGF0IHdlIGRvbid0IG5lZWQgYSB0eXBlIGNoZWNrLCB3ZQogICAgICAgIC8vIGNhbiBza2lwIHRoZSB0ZXN0IGFuIGdlbmVyYXRlIHRoZSBIRmllbGRTZXQuCiAgICAgICAgbm9kZS5uZWVkc0NoZWNrID0gdHJ1ZTsKICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgfQogICAgICBISW5zdHJ1Y3Rpb24gb3RoZXIgPSB2YWx1ZS5jb252ZXJ0VHlwZSgKICAgICAgICAgIF9jbG9zZWRXb3JsZCwgdHlwZSwgSFR5cGVDb252ZXJzaW9uLkNIRUNLRURfTU9ERV9DSEVDSyk7CiAgICAgIGlmIChvdGhlciAhPSB2YWx1ZSkgewogICAgICAgIG5vZGUuYmxvY2suYWRkQmVmb3JlKG5vZGUsIG90aGVyKTsKICAgICAgICB2YWx1ZSA9IG90aGVyOwogICAgICB9CiAgICB9CiAgICBpZiAoX2Nsb3NlZFdvcmxkLmZpZWxkQW5hbHlzaXMuZ2V0RmllbGREYXRhKGZpZWxkKS5pc0VsaWRlZCkgewogICAgICBfbG9nPy5yZWdpc3RlckZpZWxkU2V0KG5vZGUpOwogICAgICByZXR1cm4gdmFsdWU7CiAgICB9IGVsc2UgewogICAgICBIRmllbGRTZXQgcmVzdWx0ID0KICAgICAgICAgIG5ldyBIRmllbGRTZXQoX2Fic3RyYWN0VmFsdWVEb21haW4sIGZpZWxkLCByZWNlaXZlciwgdmFsdWUpCiAgICAgICAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBub2RlLnNvdXJjZUluZm9ybWF0aW9uOwogICAgICBfbG9nPy5yZWdpc3RlckZpZWxkU2V0KG5vZGUsIHJlc3VsdCk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRJbnZva2VDbG9zdXJlKEhJbnZva2VDbG9zdXJlIG5vZGUpIHsKICAgIEhJbnN0cnVjdGlvbiBjbG9zdXJlID0gbm9kZS5nZXREYXJ0UmVjZWl2ZXIoX2Nsb3NlZFdvcmxkKTsKCiAgICAvLyBSZXBsYWNlIGluZGlyZWN0IGNhbGwgdG8gc3RhdGljIG1ldGhvZCB0ZWFyLW9mZiBjbG9zdXJlIHdpdGggZGlyZWN0IGNhbGwKICAgIC8vIHRvIHN0YXRpYyBtZXRob2QuCiAgICBpZiAoY2xvc3VyZSBpcyBIQ29uc3RhbnQpIHsKICAgICAgQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IGNsb3N1cmUuY29uc3RhbnQ7CiAgICAgIGlmIChjb25zdGFudCBpcyBGdW5jdGlvbkNvbnN0YW50VmFsdWUpIHsKICAgICAgICBGdW5jdGlvbkVudGl0eSB0YXJnZXQgPSBjb25zdGFudC5lbGVtZW50OwogICAgICAgIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUgPSB0YXJnZXQucGFyYW1ldGVyU3RydWN0dXJlOwogICAgICAgIGlmIChwYXJhbWV0ZXJTdHJ1Y3R1cmUuY2FsbFN0cnVjdHVyZSA9PSBub2RlLnNlbGVjdG9yLmNhbGxTdHJ1Y3R1cmUpIHsKICAgICAgICAgIC8vIFRPRE8oc3JhKTogSGFuZGxlIGFkZGluZyBvcHRpb25hbCBhcmd1bWVudHMgZGVmYXVsdCB2YWx1ZXMuCiAgICAgICAgICBhc3NlcnQoIW5vZGUuaXNJbnRlcmNlcHRlZENhbGwpOwogICAgICAgICAgcmV0dXJuIG5ldyBISW52b2tlU3RhdGljKHRhcmdldCwgbm9kZS5pbnB1dHMuc2tpcCgxKS50b0xpc3QoKSwKICAgICAgICAgICAgICBub2RlLmluc3RydWN0aW9uVHlwZSwgbm9kZS50eXBlQXJndW1lbnRzKQogICAgICAgICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gbm9kZS5zb3VyY2VJbmZvcm1hdGlvbjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0SW52b2tlU3RhdGljKEhJbnZva2VTdGF0aWMgbm9kZSkgewogICAgcHJvcGFnYXRlQ29uc3RhbnRWYWx1ZVRvVXNlcyhub2RlKTsKICAgIE1lbWJlckVudGl0eSBlbGVtZW50ID0gbm9kZS5lbGVtZW50OwoKICAgIGlmIChlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmlkZW50aWNhbEZ1bmN0aW9uKSB7CiAgICAgIGlmIChub2RlLmlucHV0cy5sZW5ndGggPT0gMikgewogICAgICAgIHJldHVybiBuZXcgSElkZW50aXR5KAogICAgICAgICAgICBub2RlLmlucHV0c1swXSwgbm9kZS5pbnB1dHNbMV0sIG51bGwsIF9hYnN0cmFjdFZhbHVlRG9tYWluLmJvb2xUeXBlKQogICAgICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IG5vZGUuc291cmNlSW5mb3JtYXRpb247CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5zZXRSdW50aW1lVHlwZUluZm8pIHsKICAgICAgaWYgKG5vZGUuaW5wdXRzLmxlbmd0aCA9PSAyKSB7CiAgICAgICAgcmV0dXJuIGhhbmRsZUFycmF5VHlwZUluZm8obm9kZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5jaGVja0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcikgewogICAgICBpZiAobm9kZS5pbnB1dHMubGVuZ3RoID09IDIpIHsKICAgICAgICBISW5zdHJ1Y3Rpb24gZmlyc3RBcmd1bWVudCA9IG5vZGUuaW5wdXRzWzBdOwogICAgICAgIGlmIChmaXJzdEFyZ3VtZW50IGlzIEhDb25zdGFudCkgewogICAgICAgICAgSENvbnN0YW50IGNvbnN0YW50ID0gZmlyc3RBcmd1bWVudDsKICAgICAgICAgIGlmIChjb25zdGFudC5jb25zdGFudC5pc1RydWUpIHJldHVybiBjb25zdGFudDsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY29tbW9uRWxlbWVudHMuaXNDaGVja0ludChlbGVtZW50KSkgewogICAgICBpZiAobm9kZS5pbnB1dHMubGVuZ3RoID09IDEpIHsKICAgICAgICBISW5zdHJ1Y3Rpb24gYXJndW1lbnQgPSBub2RlLmlucHV0c1swXTsKICAgICAgICBpZiAoYXJndW1lbnQuaXNJbnRlZ2VyKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgICAgICByZXR1cm4gYXJndW1lbnQ7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKGNvbW1vbkVsZW1lbnRzLmlzQ2hlY2tOdW0oZWxlbWVudCkpIHsKICAgICAgaWYgKG5vZGUuaW5wdXRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgSEluc3RydWN0aW9uIGFyZ3VtZW50ID0gbm9kZS5pbnB1dHNbMF07CiAgICAgICAgaWYgKGFyZ3VtZW50LmlzTnVtYmVyKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgICAgICByZXR1cm4gYXJndW1lbnQ7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKGNvbW1vbkVsZW1lbnRzLmlzQ2hlY2tTdHJpbmcoZWxlbWVudCkpIHsKICAgICAgaWYgKG5vZGUuaW5wdXRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgSEluc3RydWN0aW9uIGFyZ3VtZW50ID0gbm9kZS5pbnB1dHNbMF07CiAgICAgICAgaWYgKGFyZ3VtZW50LmlzU3RyaW5nKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgICAgICByZXR1cm4gYXJndW1lbnQ7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPT0gY29tbW9uRWxlbWVudHMuYXNzZXJ0SGVscGVyIHx8CiAgICAgICAgZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5hc3NlcnRUZXN0KSB7CiAgICAgIGlmIChub2RlLmlucHV0cy5sZW5ndGggPT0gMSkgewogICAgICAgIEhJbnN0cnVjdGlvbiBhcmd1bWVudCA9IG5vZGUuaW5wdXRzWzBdOwogICAgICAgIGlmIChhcmd1bWVudCBpcyBIQ29uc3RhbnQpIHsKICAgICAgICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnQgPSBhcmd1bWVudC5jb25zdGFudDsKICAgICAgICAgIGlmIChjb25zdGFudC5pc0Jvb2wpIHsKICAgICAgICAgICAgYm9vbCB2YWx1ZSA9IGNvbnN0YW50LmlzVHJ1ZTsKICAgICAgICAgICAgaWYgKGVsZW1lbnQgPT0gY29tbW9uRWxlbWVudHMuYXNzZXJ0VGVzdCkgewogICAgICAgICAgICAgIC8vIGBhc3NlcnRUZXN0KGFyZ3VtZW50KWAgZWZmZWN0aXZlbHkgbmVnYXRlcyB0aGUgYXJndW1lbnQuCiAgICAgICAgICAgICAgcmV0dXJuIF9ncmFwaC5hZGRDb25zdGFudEJvb2woIXZhbHVlLCBfY2xvc2VkV29ybGQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGBhc3NlcnRIZWxwZXIodHJ1ZSlgIGlzIGEgbm8tb3AsIG90aGVyIHZhbHVlcyB0aHJvdy4KICAgICAgICAgICAgaWYgKHZhbHVlKSByZXR1cm4gYXJndW1lbnQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBISW5zdHJ1Y3Rpb24gaGFuZGxlQXJyYXlUeXBlSW5mbyhISW52b2tlU3RhdGljIG5vZGUpIHsKICAgIC8vIElmIHR5cGUgaW5mb3JtYXRpb24gaXMgbm90IG5lZWRlZCwgdXNlIHRoZSByYXcgQXJyYXkuCiAgICBISW5zdHJ1Y3Rpb24gc291cmNlID0gbm9kZS5pbnB1dHNbMF07CiAgICBpZiAoc291cmNlLnVzZWRCeS5sZW5ndGggIT0gMSkgcmV0dXJuIG5vZGU7CiAgICBpZiAoc291cmNlLmlzQXJyYXkoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzUG90ZW50aWFsbHlGYWxzZSkgewogICAgICByZXR1cm4gbm9kZTsKICAgIH0KICAgIGZvciAoSEluc3RydWN0aW9uIHVzZXIgaW4gbm9kZS51c2VkQnkpIHsKICAgICAgaWYgKHVzZXIgaXMgSEdldExlbmd0aCkgY29udGludWU7CiAgICAgIGlmICh1c2VyIGlzIEhJbmRleCkgY29udGludWU7CiAgICAgIC8vIEJvdW5kcyBjaGVjayBlc2NhcGVzIHRoZSBhcnJheSwgYnV0IHdlIGRvbid0IGNhcmUuCiAgICAgIGlmICh1c2VyIGlzIEhCb3VuZHNDaGVjaykgY29udGludWU7CiAgICAgIC8vIEludGVyY2VwdG9yIG9ubHkgZXNjYXBlcyB0aGUgQXJyYXkgaWYgYXJyYXkgcGFzc2VkIHRvIGFuIGludGVyY2VwdGVkCiAgICAgIC8vIG1ldGhvZC4KICAgICAgaWYgKHVzZXIgaXMgSEludGVyY2VwdG9yKSBjb250aW51ZTsKICAgICAgaWYgKHVzZXIgaXMgSEludm9rZVN0YXRpYykgewogICAgICAgIE1lbWJlckVudGl0eSBlbGVtZW50ID0gdXNlci5lbGVtZW50OwogICAgICAgIGlmIChlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmNoZWNrQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKSB7CiAgICAgICAgICAvLyBDTUUgY2hlY2sgZXNjYXBlcyB0aGUgYXJyYXksIGJ1dCB3ZSBkb24ndCBjYXJlLgogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh1c2VyIGlzIEhJbnZva2VEeW5hbWljR2V0dGVyKSB7CiAgICAgICAgU3RyaW5nIG5hbWUgPSB1c2VyLnNlbGVjdG9yLm5hbWU7CiAgICAgICAgLy8gVGhlc2UgZ2V0dGVycyBkb24ndCB1c2UgdGhlIEFycmF5IHR5cGUuCiAgICAgICAgaWYgKG5hbWUgPT0gJ2xhc3QnKSBjb250aW51ZTsKICAgICAgICBpZiAobmFtZSA9PSAnZmlyc3QnKSBjb250aW51ZTsKICAgICAgfQogICAgICAvLyBUT0RPKHNyYSk6IEltcGxlbWVudCBhIG1vcmUgZ2VuZXJhbCBhbGdvcml0aG0gLSBtYW55IG1ldGhvZHMgZG9uJ3QgdXNlCiAgICAgIC8vIHRoZSBlbGVtZW50IHR5cGUuCiAgICAgIHJldHVybiBub2RlOwogICAgfQogICAgcmV0dXJuIHNvdXJjZTsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB2aXNpdFN0cmluZ0NvbmNhdChIU3RyaW5nQ29uY2F0IG5vZGUpIHsKICAgIC8vIFNpbXBsaWZ5IHN0cmluZyBjb25jYXQ6CiAgICAvLwogICAgLy8gICAgICIiICsgUiAgICAgICAgICAgICAgICAtPiAgUgogICAgLy8gICAgIEwgKyAiIiAgICAgICAgICAgICAgICAtPiAgTAogICAgLy8gICAgICJMIiArICJSIiAgICAgICAgICAgICAtPiAgIkxSIgogICAgLy8gICAgIChwcmVmaXggKyAiTCIpICsgIlIiICAtPiAgcHJlZml4ICsgIkxSIgogICAgLy8KICAgIFN0cmluZ0NvbnN0YW50VmFsdWUgZ2V0U3RyaW5nKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgICBpZiAoIWluc3RydWN0aW9uLmlzQ29uc3RhbnRTdHJpbmcoKSkgcmV0dXJuIG51bGw7CiAgICAgIEhDb25zdGFudCBjb25zdGFudCA9IGluc3RydWN0aW9uOwogICAgICByZXR1cm4gY29uc3RhbnQuY29uc3RhbnQ7CiAgICB9CgogICAgU3RyaW5nQ29uc3RhbnRWYWx1ZSBsZWZ0U3RyaW5nID0gZ2V0U3RyaW5nKG5vZGUubGVmdCk7CiAgICBpZiAobGVmdFN0cmluZyAhPSBudWxsICYmIGxlZnRTdHJpbmcuc3RyaW5nVmFsdWUubGVuZ3RoID09IDApIHsKICAgICAgcmV0dXJuIG5vZGUucmlnaHQ7CiAgICB9CgogICAgU3RyaW5nQ29uc3RhbnRWYWx1ZSByaWdodFN0cmluZyA9IGdldFN0cmluZyhub2RlLnJpZ2h0KTsKICAgIGlmIChyaWdodFN0cmluZyA9PSBudWxsKSByZXR1cm4gbm9kZTsKICAgIGlmIChyaWdodFN0cmluZy5zdHJpbmdWYWx1ZS5sZW5ndGggPT0gMCkgcmV0dXJuIG5vZGUubGVmdDsKCiAgICBISW5zdHJ1Y3Rpb24gcHJlZml4ID0gbnVsbDsKICAgIGlmIChsZWZ0U3RyaW5nID09IG51bGwpIHsKICAgICAgaWYgKG5vZGUubGVmdCBpcyEgSFN0cmluZ0NvbmNhdCkgcmV0dXJuIG5vZGU7CiAgICAgIEhTdHJpbmdDb25jYXQgbGVmdENvbmNhdCA9IG5vZGUubGVmdDsKICAgICAgLy8gRG9uJ3QgdW5kbyBDU0UuCiAgICAgIGlmIChsZWZ0Q29uY2F0LnVzZWRCeS5sZW5ndGggIT0gMSkgcmV0dXJuIG5vZGU7CiAgICAgIHByZWZpeCA9IGxlZnRDb25jYXQubGVmdDsKICAgICAgbGVmdFN0cmluZyA9IGdldFN0cmluZyhsZWZ0Q29uY2F0LnJpZ2h0KTsKICAgICAgaWYgKGxlZnRTdHJpbmcgPT0gbnVsbCkgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgaWYgKGxlZnRTdHJpbmcuc3RyaW5nVmFsdWUubGVuZ3RoICsgcmlnaHRTdHJpbmcuc3RyaW5nVmFsdWUubGVuZ3RoID4KICAgICAgICBNQVhfU0hBUkVEX0NPTlNUQU5UX0ZPTERFRF9TVFJJTkdfTEVOR1RIKSB7CiAgICAgIGlmIChub2RlLnVzZWRCeS5sZW5ndGggPiAxKSByZXR1cm4gbm9kZTsKICAgIH0KCiAgICBISW5zdHJ1Y3Rpb24gZm9sZGVkID0gX2dyYXBoLmFkZENvbnN0YW50KAogICAgICAgIGNvbnN0YW50X3N5c3RlbQogICAgICAgICAgICAuY3JlYXRlU3RyaW5nKGxlZnRTdHJpbmcuc3RyaW5nVmFsdWUgKyByaWdodFN0cmluZy5zdHJpbmdWYWx1ZSksCiAgICAgICAgX2Nsb3NlZFdvcmxkKTsKICAgIGlmIChwcmVmaXggPT0gbnVsbCkgcmV0dXJuIGZvbGRlZDsKICAgIHJldHVybiBuZXcgSFN0cmluZ0NvbmNhdChwcmVmaXgsIGZvbGRlZCwgX2Fic3RyYWN0VmFsdWVEb21haW4uc3RyaW5nVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRTdHJpbmdpZnkoSFN0cmluZ2lmeSBub2RlKSB7CiAgICBISW5zdHJ1Y3Rpb24gaW5wdXQgPSBub2RlLmlucHV0c1swXTsKICAgIGlmIChpbnB1dC5pc1N0cmluZyhfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICByZXR1cm4gaW5wdXQ7CiAgICB9CgogICAgSEluc3RydWN0aW9uIGFzU3RyaW5nKFN0cmluZyBzdHJpbmcpID0+CiAgICAgICAgX2dyYXBoLmFkZENvbnN0YW50KGNvbnN0YW50X3N5c3RlbS5jcmVhdGVTdHJpbmcoc3RyaW5nKSwgX2Nsb3NlZFdvcmxkKTsKCiAgICBISW5zdHJ1Y3Rpb24gdHJ5Q29uc3RhbnQoKSB7CiAgICAgIGlmICghaW5wdXQuaXNDb25zdGFudCgpKSByZXR1cm4gbnVsbDsKICAgICAgSENvbnN0YW50IGNvbnN0YW50ID0gaW5wdXQ7CiAgICAgIGlmICghY29uc3RhbnQuY29uc3RhbnQuaXNQcmltaXRpdmUpIHJldHVybiBudWxsOwogICAgICBQcmltaXRpdmVDb25zdGFudFZhbHVlIHZhbHVlID0gY29uc3RhbnQuY29uc3RhbnQ7CiAgICAgIGlmICh2YWx1ZSBpcyBJbnRDb25zdGFudFZhbHVlKSB7CiAgICAgICAgLy8gT25seSBjb25zdGFudC1mb2xkIGludC50b1N0cmluZygpIHdoZW4gRGFydCBhbmQgSlMgcmVzdWx0cyB0aGUgc2FtZS4KICAgICAgICAvLyBUT0RPKDE4MTAzKTogV2Ugc2hvdWxkIGJlIGFibGUgdG8gcmVtb3ZlIHRoaXMgd29yay1hcm91bmQgd2hlbiBpc3N1ZQogICAgICAgIC8vIDE4MTAzIGlzIHJlc29sdmVkIGJ5IHByb3ZpZGluZyB0aGUgY29ycmVjdCBzdHJpbmcuCiAgICAgICAgaWYgKCF2YWx1ZS5pc1VJbnQzMigpKSByZXR1cm4gbnVsbDsKICAgICAgICByZXR1cm4gYXNTdHJpbmcoJyR7dmFsdWUuaW50VmFsdWV9Jyk7CiAgICAgIH0KICAgICAgaWYgKHZhbHVlIGlzIEJvb2xDb25zdGFudFZhbHVlKSB7CiAgICAgICAgcmV0dXJuIGFzU3RyaW5nKHZhbHVlLmJvb2xWYWx1ZSA/ICd0cnVlJyA6ICdmYWxzZScpOwogICAgICB9CiAgICAgIGlmICh2YWx1ZSBpcyBOdWxsQ29uc3RhbnRWYWx1ZSkgewogICAgICAgIHJldHVybiBhc1N0cmluZygnbnVsbCcpOwogICAgICB9CiAgICAgIGlmICh2YWx1ZSBpcyBEb3VibGVDb25zdGFudFZhbHVlKSB7CiAgICAgICAgLy8gVE9ETyhzcmEpOiBJdCBzZWVtcyB1bmxpa2VseSB0aGF0IGFsbCBkYXJ0MmpzIGhvc3QgaW1wbGVtZW50YXRpb25zCiAgICAgICAgLy8gcHJvZHVjZSBleGFjdGx5IHRoZSBzYW1lIGNoYXJhY3RlcnMgYXMgYWxsIEphdmFTY3JpcHQgdGFyZ2V0cy4KICAgICAgICByZXR1cm4gYXNTdHJpbmcoJyR7dmFsdWUuZG91YmxlVmFsdWV9Jyk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgSEluc3RydWN0aW9uIHRyeVRvU3RyaW5nKCkgewogICAgICAvLyBJZiB0aGUgYHRvU3RyaW5nYCBtZXRob2QgaXMgZ3VhcmFudGVlZCB0byByZXR1cm4gYSBzdHJpbmcgd2UgY2FuIGNhbGwKICAgICAgLy8gaXQgZGlyZWN0bHkuIEtlZXAgdGhlIHN0cmluZ2lmaWVyIGZvciBwcmltaXRpdmVzIChzaW5jZSB0aGV5IGhhdmUgZmFzdAogICAgICAvLyBwYXRoIGNvZGUgaW4gdGhlIHN0cmluZ2lmaWVyKSBhbmQgZm9yIGNsYXNzZXMgcmVxdWlyaW5nIGludGVyY2VwdG9ycwogICAgICAvLyAoc2luY2UgU3NhSW5zdHJ1Y3Rpb25TaW1wbGlmaWVyIHJ1bnMgYWZ0ZXIgU3NhU2ltcGxpZnlJbnRlcmNlcHRvcnMpLgogICAgICBpZiAoaW5wdXQuaXNQcmltaXRpdmUoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzUG90ZW50aWFsbHlUcnVlKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgaWYgKGlucHV0LmlzTnVsbChfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNQb3RlbnRpYWxseVRydWUpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBTZWxlY3RvciBzZWxlY3RvciA9IFNlbGVjdG9ycy50b1N0cmluZ187CiAgICAgIEFic3RyYWN0VmFsdWUgdG9TdHJpbmdUeXBlID0gQWJzdHJhY3RWYWx1ZUZhY3RvcnkuaW5mZXJyZWRUeXBlRm9yU2VsZWN0b3IoCiAgICAgICAgICBzZWxlY3RvciwgaW5wdXQuaW5zdHJ1Y3Rpb25UeXBlLCBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cyk7CiAgICAgIGlmIChfYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgICAgLmNvbnRhaW5zT25seVR5cGUoCiAgICAgICAgICAgICAgdG9TdHJpbmdUeXBlLCBfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuanNTdHJpbmdDbGFzcykKICAgICAgICAgIC5pc1BvdGVudGlhbGx5RmFsc2UpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICAvLyBBbGwgaW50ZXJjZXB0ZWQgY2xhc3NlcyBleHRlbmQgYEludGVyY2VwdG9yYCwgc28gaWYgdGhlIHJlY2VpdmVyIGNhbid0CiAgICAgIC8vIGJlIGEgY2xhc3MgZXh0ZW5kaW5nIGBJbnRlcmNlcHRvcmAgdGhlbiBpdCBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5LgogICAgICBpZiAoX2Fic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAgIC5pc0ludGVyY2VwdG9yKGlucHV0Lmluc3RydWN0aW9uVHlwZSkKICAgICAgICAgIC5pc0RlZmluaXRlbHlGYWxzZSkgewogICAgICAgIHZhciBpbnB1dHMgPSA8SEluc3RydWN0aW9uPltpbnB1dCwgaW5wdXRdOyAvLyBbaW50ZXJjZXB0b3IsIHJlY2VpdmVyXS4KICAgICAgICBISW5zdHJ1Y3Rpb24gcmVzdWx0ID0gbmV3IEhJbnZva2VEeW5hbWljTWV0aG9kKAogICAgICAgICAgICBzZWxlY3RvciwKICAgICAgICAgICAgaW5wdXQuaW5zdHJ1Y3Rpb25UeXBlLCAvLyByZWNlaXZlciBtYXNrLgogICAgICAgICAgICBpbnB1dHMsCiAgICAgICAgICAgIHRvU3RyaW5nVHlwZSwKICAgICAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgICAgICBub2RlLnNvdXJjZUluZm9ybWF0aW9uLAogICAgICAgICAgICBpc0ludGVyY2VwdGVkOiB0cnVlKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHJldHVybiB0cnlDb25zdGFudCgpID8/IHRyeVRvU3RyaW5nKCkgPz8gbm9kZTsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB2aXNpdE9uZVNob3RJbnRlcmNlcHRvcihIT25lU2hvdEludGVyY2VwdG9yIG5vZGUpIHsKICAgIHJldHVybiBoYW5kbGVJbnRlcmNlcHRlZENhbGwobm9kZSk7CiAgfQoKICBib29sIG5lZWRzU3Vic3RpdHV0aW9uRm9yVHlwZVZhcmlhYmxlQWNjZXNzKENsYXNzRW50aXR5IGNscykgewogICAgaWYgKF9jbG9zZWRXb3JsZC5pc1VzZWRBc01peGluKGNscykpIHJldHVybiB0cnVlOwoKICAgIHJldHVybiBfY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuYW55U3RyaWN0U3ViY2xhc3NPZihjbHMsCiAgICAgICAgKENsYXNzRW50aXR5IHN1YmNsYXNzKSB7CiAgICAgIHJldHVybiAhX3J0aVN1YnN0aXR1dGlvbnMuaXNUcml2aWFsU3Vic3RpdHV0aW9uKHN1YmNsYXNzLCBjbHMpOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRUeXBlSW5mb0V4cHJlc3Npb24oSFR5cGVJbmZvRXhwcmVzc2lvbiBub2RlKSB7CiAgICAvLyBJZGVudGlmeSB0aGUgY2FzZSB3aGVyZSB0aGUgdHlwZSBpbmZvIGV4cHJlc3Npb24gd291bGQgYmUgb2YgdGhlIGZvcm06CiAgICAvLwogICAgLy8gIFtnZXRUeXBlQXJndW1lbnRCeUluZGV4KHRoaXMsIDApLCAuLiwgZ2V0VHlwZUFyZ3VtZW50QnlJbmRleCh0aGlzLCBrKV0KICAgIC8vCiAgICAvLyBhbmQgayBpcyB0aGUgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzIG9mICd0aGlzJy4gIFdlIGNhbiBzaW1wbHkgY29weSB0aGUKICAgIC8vIGxpc3QgZnJvbSAndGhpcycuCiAgICBISW5zdHJ1Y3Rpb24gdHJ5Q29weUluZm8oKSB7CiAgICAgIGlmIChub2RlLmtpbmQgIT0gVHlwZUluZm9FeHByZXNzaW9uS2luZC5JTlNUQU5DRSkgcmV0dXJuIG51bGw7CgogICAgICBISW5zdHJ1Y3Rpb24gc291cmNlOwogICAgICBpbnQgZXhwZWN0ZWRJbmRleCA9IDA7CgogICAgICBmb3IgKEhJbnN0cnVjdGlvbiBhcmd1bWVudCBpbiBub2RlLmlucHV0cykgewogICAgICAgIGlmIChhcmd1bWVudCBpcyBIVHlwZUluZm9SZWFkVmFyaWFibGUpIHsKICAgICAgICAgIEhJbnN0cnVjdGlvbiBuZXh0U291cmNlID0gYXJndW1lbnQub2JqZWN0OwogICAgICAgICAgaWYgKG5leHRTb3VyY2UgaXMgSFRoaXMpIHsKICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgc291cmNlID0gbmV4dFNvdXJjZTsKICAgICAgICAgICAgICBDbGFzc0VudGl0eSBjb250ZXh0Q2xhc3MgPQogICAgICAgICAgICAgICAgICBuZXh0U291cmNlLnNvdXJjZUVsZW1lbnQuZW5jbG9zaW5nQ2xhc3M7CiAgICAgICAgICAgICAgaWYgKG5vZGUuaW5wdXRzLmxlbmd0aCAhPQogICAgICAgICAgICAgICAgICBfY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50CiAgICAgICAgICAgICAgICAgICAgICAuZ2V0VGhpc1R5cGUoY29udGV4dENsYXNzKQogICAgICAgICAgICAgICAgICAgICAgLnR5cGVBcmd1bWVudHMKICAgICAgICAgICAgICAgICAgICAgIC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobmVlZHNTdWJzdGl0dXRpb25Gb3JUeXBlVmFyaWFibGVBY2Nlc3MoY29udGV4dENsYXNzKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXh0U291cmNlICE9IHNvdXJjZSkgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIGluZGV4IGlzIHRoZSBvbmUgd2UgZXhwZWN0LgogICAgICAgICAgICBpbnQgaW5kZXggPSBhcmd1bWVudC52YXJpYWJsZS5lbGVtZW50LmluZGV4OwogICAgICAgICAgICBpZiAoaW5kZXggIT0gZXhwZWN0ZWRJbmRleCsrKSByZXR1cm4gbnVsbDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIFRPRE8oc3JhKTogSGFuZGxlIG5vbi10aGlzIGNhc2VzIChpLmUuIGlubGluZWQgY29kZSkuIFNvbWUKICAgICAgICAgICAgLy8gbm9uLXRoaXMgY2FzZXMgd2lsbCBoYXZlIGEgVHlwZU1hc2sgdGhhdCBkb2VzIG5vdCBuZWVkCiAgICAgICAgICAgIC8vIHN1YnN0aXR1dGlvbiwgZXZlbiB0aG91Z2ggdGhlIGdlbmVyYWwgY2FzZSBkb2VzLCBlLmcuIGlubGluaW5nIGEKICAgICAgICAgICAgLy8gbWV0aG9kIG9uIGFuIGV4YWN0IGNsYXNzLgogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiBudWxsOwogICAgICByZXR1cm4gbmV3IEhUeXBlSW5mb1JlYWRSYXcoc291cmNlLCBfYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSk7CiAgICB9CgogICAgLy8gVE9ETyhzcmEpOiBDb25zaWRlciBmdXNpbmcgdHlwZSBleHByZXNzaW9uIHRyZWVzIHdpdGggbm8gdHlwZSB2YXJpYWJsZXMsCiAgICAvLyBhcyB0aGVzZSBjb3VsZCBiZSByZXByZXNlbnRlZCBsaWtlIGNvbnN0YW50cy4KCiAgICByZXR1cm4gdHJ5Q29weUluZm8oKSA/PyBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0VHlwZUluZm9SZWFkVmFyaWFibGUoSFR5cGVJbmZvUmVhZFZhcmlhYmxlIG5vZGUpIHsKICAgIFR5cGVWYXJpYWJsZVR5cGUgdmFyaWFibGUgPSBub2RlLnZhcmlhYmxlOwogICAgQ2xhc3NFbnRpdHkgY29udGV4dENsYXNzID0gdmFyaWFibGUuZWxlbWVudC50eXBlRGVjbGFyYXRpb247CiAgICBISW5zdHJ1Y3Rpb24gb2JqZWN0ID0gbm9kZS5vYmplY3Q7CgogICAgSEluc3RydWN0aW9uIGZpbmlzaEdyb3VuZFR5cGUoSW50ZXJmYWNlVHlwZSBncm91bmRUeXBlKSB7CiAgICAgIEludGVyZmFjZVR5cGUgdHlwZUF0VmFyaWFibGUgPQogICAgICAgICAgX2Nsb3NlZFdvcmxkLmRhcnRUeXBlcy5hc0luc3RhbmNlT2YoZ3JvdW5kVHlwZSwgY29udGV4dENsYXNzKTsKICAgICAgaWYgKHR5cGVBdFZhcmlhYmxlICE9IG51bGwpIHsKICAgICAgICBpbnQgaW5kZXggPSB2YXJpYWJsZS5lbGVtZW50LmluZGV4OwogICAgICAgIERhcnRUeXBlIHR5cGVBcmd1bWVudCA9IHR5cGVBdFZhcmlhYmxlLnR5cGVBcmd1bWVudHNbaW5kZXhdOwogICAgICAgIEhJbnN0cnVjdGlvbiByZXBsYWNlbWVudCA9IG5ldyBIVHlwZUluZm9FeHByZXNzaW9uKAogICAgICAgICAgICBUeXBlSW5mb0V4cHJlc3Npb25LaW5kLkNPTVBMRVRFLAogICAgICAgICAgICB0eXBlQXJndW1lbnQsCiAgICAgICAgICAgIGNvbnN0IDxISW5zdHJ1Y3Rpb24+W10sCiAgICAgICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlLAogICAgICAgICAgICBpc1R5cGVWYXJpYWJsZVJlcGxhY2VtZW50OiB0cnVlKTsKICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgLy8vIFJlYWQgdGhlIHR5cGUgdmFyaWFibGUgZnJvbSBhbiBhbGxvY2F0aW9uIG9mIHR5cGUgW2NyZWF0ZWRDbGFzc10sIHdoZXJlCiAgICAvLy8gW3NlbGVjdFR5cGVBcmd1bWVudEZyb21PYmplY3RDcmVhdGlvbl0gZXh0cmFjdHMgdGhlIHR5cGUgYXJndW1lbnQgZnJvbQogICAgLy8vIHRoZSBhbGxvY2F0aW9uIGZvciBmYWN0b3J5IGNvbnN0cnVjdG9yIGNhbGwuCiAgICBISW5zdHJ1Y3Rpb24gZmluaXNoU3Vic3RpdHV0ZWQoQ2xhc3NFbnRpdHkgY3JlYXRlZENsYXNzLAogICAgICAgIEhJbnN0cnVjdGlvbiBzZWxlY3RUeXBlQXJndW1lbnRGcm9tT2JqZWN0Q3JlYXRpb24oaW50IGluZGV4KSkgewogICAgICBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlID0gX2Nsb3NlZFdvcmxkLmRhcnRUeXBlcy5nZXRUaGlzVHlwZShjcmVhdGVkQ2xhc3MpOwoKICAgICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uRm9yVHlwZVZhcmlhYmxlKFR5cGVWYXJpYWJsZVR5cGUgdHYpIHsKICAgICAgICByZXR1cm4gc2VsZWN0VHlwZUFyZ3VtZW50RnJvbU9iamVjdENyZWF0aW9uKAogICAgICAgICAgICB0aGlzVHlwZS50eXBlQXJndW1lbnRzLmluZGV4T2YodHYpKTsKICAgICAgfQoKICAgICAgRGFydFR5cGUgdHlwZSA9IF9jbG9zZWRXb3JsZC5kYXJ0VHlwZXMKICAgICAgICAgIC5hc0luc3RhbmNlT2YodGhpc1R5cGUsIGNvbnRleHRDbGFzcykKICAgICAgICAgIC50eXBlQXJndW1lbnRzW3ZhcmlhYmxlLmVsZW1lbnQuaW5kZXhdOwogICAgICBpZiAodHlwZSBpcyBUeXBlVmFyaWFibGVUeXBlKSB7CiAgICAgICAgcmV0dXJuIGluc3RydWN0aW9uRm9yVHlwZVZhcmlhYmxlKHR5cGUpOwogICAgICB9CiAgICAgIExpc3Q8SEluc3RydWN0aW9uPiBhcmd1bWVudHMgPSA8SEluc3RydWN0aW9uPltdOwogICAgICB0eXBlLmZvckVhY2hUeXBlVmFyaWFibGUoKHYpIHsKICAgICAgICBhcmd1bWVudHMuYWRkKGluc3RydWN0aW9uRm9yVHlwZVZhcmlhYmxlKHYpKTsKICAgICAgfSk7CiAgICAgIEhJbnN0cnVjdGlvbiByZXBsYWNlbWVudCA9IG5ldyBIVHlwZUluZm9FeHByZXNzaW9uKAogICAgICAgICAgVHlwZUluZm9FeHByZXNzaW9uS2luZC5DT01QTEVURSwKICAgICAgICAgIHR5cGUsCiAgICAgICAgICBhcmd1bWVudHMsCiAgICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSwKICAgICAgICAgIGlzVHlwZVZhcmlhYmxlUmVwbGFjZW1lbnQ6IHRydWUpOwogICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7CiAgICB9CgogICAgLy8gVHlwZSB2YXJpYWJsZSBldmFsdWF0ZWQgaW4gdGhlIGNvbnRleHQgb2YgYSBjb25zdGFudCBjYW4gYmUgcmVwbGFjZWQgd2l0aAogICAgLy8gYSBncm91bmQgdGVybSB0eXBlLgogICAgaWYgKG9iamVjdCBpcyBIQ29uc3RhbnQpIHsKICAgICAgQ29uc3RhbnRWYWx1ZSB2YWx1ZSA9IG9iamVjdC5jb25zdGFudDsKICAgICAgaWYgKHZhbHVlIGlzIENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZSkgewogICAgICAgIHJldHVybiBmaW5pc2hHcm91bmRUeXBlKHZhbHVlLnR5cGUpOwogICAgICB9CiAgICAgIHJldHVybiBub2RlOwogICAgfQoKICAgIC8vIExvb2sgZm9yIGFuIGFsbG9jYXRpb24gd2l0aCB0eXBlIGluZm9ybWF0aW9uIGFuZCByZS13cml0ZSB0eXBlIHZhcmlhYmxlCiAgICAvLyBhcyBhIGZ1bmN0aW9uIG9mIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgdGhlIGFsbG9jYXRpb24uICBUaGlzIGVmZmVjdGl2ZWx5CiAgICAvLyBzdG9yZS1mb3J3YXJkcyBhIHR5cGUgdmFyaWFibGUgcmVhZCB0aHJvdWdoIGFuIGFsbG9jYXRpb24uCgogICAgLy8gTWF0Y2g6CiAgICAvLwogICAgLy8gICAgIEhDcmVhdGUoQ2xhc3NFbGVtZW50LAogICAgLy8gICAgICAgW2FyZ19pLAogICAgLy8gICAgICAgIC4uLiwKICAgIC8vICAgICAgICBIVHlwZUluZm9FeHByZXNzaW9uKHRfMCwgdF8xLCB0XzIsIC4uLildKTsKICAgIC8vCiAgICAvLyBUaGUgYHRfaWAgYXJlIHRoZSB2YWx1ZXMgb2YgdGhlIHR5cGUgcGFyYW1ldGVycyBvZiBDbGFzc0VsZW1lbnQuCgogICAgaWYgKG9iamVjdCBpcyBIQ3JlYXRlKSB7CiAgICAgIHZvaWQgcmVnaXN0ZXJJbnN0YW50aWF0aW9ucygpIHsKICAgICAgICAvLyBGb3J3YXJkaW5nIHRoZSB0eXBlIHZhcmlhYmxlIHJlZmVyZW5jZXMgbWlnaHQgY2F1c2UgdGhlIEhDcmVhdGUgdG8KICAgICAgICAvLyBiZWNvbWUgZGVhZC4gVGhpcyBicmVha3MgdGhlIGFsZ29yaXRobSBmb3IgZ2VuZXJhdGluZyB0aGUgcGVyLXR5cGUKICAgICAgICAvLyBydW50aW1lIHR5cGUgaW5mb3JtYXRpb24sIHNvIHdlIGluc3RhbnRpYXRlIHRoZW0gaGVyZSBpbiBjYXNlIHRoZQogICAgICAgIC8vIEhDcmVhdGUgYmVjb21lcyBkZWFkLgogICAgICAgIG9iamVjdC5pbnN0YW50aWF0ZWRUeXBlcz8uZm9yRWFjaChfcmVnaXN0cnkucmVnaXN0ZXJJbnN0YW50aWF0aW9uKTsKICAgICAgfQoKICAgICAgaWYgKG9iamVjdC5oYXNSdGlJbnB1dCkgewogICAgICAgIEhJbnN0cnVjdGlvbiB0eXBlSW5mbyA9IG9iamVjdC5ydGlJbnB1dDsKICAgICAgICBpZiAodHlwZUluZm8gaXMgSFR5cGVJbmZvRXhwcmVzc2lvbikgewogICAgICAgICAgcmVnaXN0ZXJJbnN0YW50aWF0aW9ucygpOwogICAgICAgICAgcmV0dXJuIGZpbmlzaFN1YnN0aXR1dGVkKAogICAgICAgICAgICAgIG9iamVjdC5lbGVtZW50LCAoaW50IGluZGV4KSA9PiB0eXBlSW5mby5pbnB1dHNbaW5kZXhdKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gTm9uLWdlbmVyaWMgdHlwZSAod2hpY2ggZXh0ZW5kcyBvciBtaXhlcyBpbiBhIGdlbmVyaWMgdHlwZSwgZm9yCiAgICAgICAgLy8gZXhhbXBsZSBDb2RlVW5pdHMgZXh0ZW5kcyBVbm1vZGlmaWFibGVMaXN0QmFzZTxpbnQ+KS4gIEFsc28gdXNlZCBmb3IKICAgICAgICAvLyByYXctdHlwZSB3aGVuIHRoZSB0eXBlIHBhcmFtZXRlcnMgYXJlIGVsaWRlZC4KICAgICAgICByZWdpc3Rlckluc3RhbnRpYXRpb25zKCk7CiAgICAgICAgcmV0dXJuIGZpbmlzaFN1YnN0aXR1dGVkKAogICAgICAgICAgICBvYmplY3QuZWxlbWVudCwKICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIHR5cGUgYXJndW1lbnRzLCBhbGwgdHlwZSBhcmd1bWVudHMgYXJlICdkeW5hbWljJy4KICAgICAgICAgICAgKGludCBpKSA9PiBfZ3JhcGguYWRkQ29uc3RhbnROdWxsKF9jbG9zZWRXb3JsZCkpOwogICAgICB9CiAgICB9CgogICAgLy8gVE9ETyhzcmEpOiBGYWN0b3J5IGNvbnN0cnVjdG9ycyBwYXNzIHR5cGUgYXJndW1lbnRzIGFmdGVyIHRoZSB2YWx1ZQogICAgLy8gYXJndW1lbnRzLiBUaGUgW3NlbGVjdFR5cGVBcmd1bWVudEZyb21PYmplY3RDcmVhdGlvbl0gYXJndW1lbnQgb2YKICAgIC8vIFtmaW5pc2hTdWJzdGl0dXRlZF0gaW5kZXhlcyBpbnRvIHRoZXNlIHR5cGUgYXJndW1lbnRzLgoKICAgIC8vIFRyeSB0byByZW1vdmUgdGhlIGludGVyY2VwdG9yLiBUaGUgaW50ZXJjZXB0b3IgaXMgdXNlZCBmb3IgYWNjZXNzaW5nIHRoZQogICAgLy8gc3Vic3RpdHV0aW9uIG1ldGhvZHMuCiAgICBpZiAobm9kZS5pc0ludGVyY2VwdGVkKSB7CiAgICAgIC8vIElmIHdlIGRvbid0IG5lZWQgdGhlIHN1YnN0aXR1dGlvbiBtZXRob2RzIHRoZW4gd2UgZG9uJ3QgbmVlZCB0aGUKICAgICAgLy8gaW50ZXJjZXB0b3IgdG8gYWNjZXNzIHRoZW0uCiAgICAgIGlmICghbmVlZHNTdWJzdGl0dXRpb25Gb3JUeXBlVmFyaWFibGVBY2Nlc3MoY29udGV4dENsYXNzKSkgewogICAgICAgIHJldHVybiBuZXcgSFR5cGVJbmZvUmVhZFZhcmlhYmxlLm5vSW50ZXJjZXB0b3IoCiAgICAgICAgICAgIHZhcmlhYmxlLCBvYmplY3QsIG5vZGUuaW5zdHJ1Y3Rpb25UeXBlKTsKICAgICAgfQogICAgICAvLyBBbGwgaW50ZXJjZXB0ZWQgY2xhc3NlcyBleHRlbmQgYEludGVyY2VwdG9yYCwgc28gaWYgdGhlIHJlY2VpdmVyIGNhbid0CiAgICAgIC8vIGJlIGEgY2xhc3MgZXh0ZW5kaW5nIGBJbnRlcmNlcHRvcmAgdGhlbiB0aGUgc3Vic3RpdHV0aW9uIG1ldGhvZHMgY2FuIGJlCiAgICAgIC8vIGNhbGxlZCBkaXJlY3RseS4gKFdlIGRvbid0IGNhcmUgYWJvdXQgTnVsbCBzaW5jZSBjb250ZXh0cyByZWFkaW5nIGNsYXNzCiAgICAgIC8vIHR5cGUgdmFyaWFibGVzIG9yaWdpbmF0ZSBmcm9tIGluc3RhbmNlIG1ldGhvZHMuKQogICAgICBpZiAoX2Fic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAgIC5pc0ludGVyY2VwdG9yKG9iamVjdC5pbnN0cnVjdGlvblR5cGUpCiAgICAgICAgICAuaXNEZWZpbml0ZWx5RmFsc2UpIHsKICAgICAgICByZXR1cm4gbmV3IEhUeXBlSW5mb1JlYWRWYXJpYWJsZS5ub0ludGVyY2VwdG9yKAogICAgICAgICAgICB2YXJpYWJsZSwgb2JqZWN0LCBub2RlLmluc3RydWN0aW9uVHlwZSk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbm9kZTsKICB9Cn0KCmNsYXNzIFNzYUNoZWNrSW5zZXJ0ZXIgZXh0ZW5kcyBIQmFzZVZpc2l0b3IgaW1wbGVtZW50cyBPcHRpbWl6YXRpb25QaGFzZSB7CiAgZmluYWwgU2V0PEhJbnN0cnVjdGlvbj4gYm91bmRzQ2hlY2tlZDsKICBmaW5hbCBib29sIHRydXN0UHJpbWl0aXZlczsKICBmaW5hbCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQ7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAiU3NhQ2hlY2tJbnNlcnRlciI7CiAgSEdyYXBoIGdyYXBoOwoKICBTc2FDaGVja0luc2VydGVyKHRoaXMudHJ1c3RQcmltaXRpdmVzLCB0aGlzLmNsb3NlZFdvcmxkLCB0aGlzLmJvdW5kc0NoZWNrZWQpOwoKICBBYnN0cmFjdFZhbHVlRG9tYWluIGdldCBfYWJzdHJhY3RWYWx1ZURvbWFpbiA9PgogICAgICBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0R3JhcGgoSEdyYXBoIGdyYXBoKSB7CiAgICB0aGlzLmdyYXBoID0gZ3JhcGg7CgogICAgLy8gSW4gLS10cnVzdC1wcmltaXRpdmVzIG1vZGUgd2UgZG9uJ3QgYWRkIGJvdW5kcyBjaGVja3MuICBUaGlzIGlzIGJldHRlcgogICAgLy8gdGhhbiB0cnlpbmcgdG8gcmVtb3ZlIHRoZW0gbGF0ZXIgYXMgdGhlIGxpbWl0IGV4cHJlc3Npb24gd291bGQgYmVjb21lCiAgICAvLyBkZWFkIGFuZCByZXF1aXJlIERDRS4KICAgIGlmICh0cnVzdFByaW1pdGl2ZXMpIHJldHVybjsKCiAgICB2aXNpdERvbWluYXRvclRyZWUoZ3JhcGgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJhc2ljQmxvY2soSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IGJsb2NrLmZpcnN0OwogICAgd2hpbGUgKGluc3RydWN0aW9uICE9IG51bGwpIHsKICAgICAgSEluc3RydWN0aW9uIG5leHQgPSBpbnN0cnVjdGlvbi5uZXh0OwogICAgICBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uLmFjY2VwdCh0aGlzKTsKICAgICAgaW5zdHJ1Y3Rpb24gPSBuZXh0OwogICAgfQogIH0KCiAgSEJvdW5kc0NoZWNrIGluc2VydEJvdW5kc0NoZWNrKAogICAgICBISW5zdHJ1Y3Rpb24gaW5kZXhOb2RlLCBISW5zdHJ1Y3Rpb24gYXJyYXksIEhJbnN0cnVjdGlvbiBpbmRleEFyZ3VtZW50KSB7CiAgICBIR2V0TGVuZ3RoIGxlbmd0aCA9IG5ldyBIR2V0TGVuZ3RoKAogICAgICAgIGFycmF5LCBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLnBvc2l0aXZlSW50VHlwZSwKICAgICAgICBpc0Fzc2lnbmFibGU6ICFpc0ZpeGVkTGVuZ3RoKGFycmF5Lmluc3RydWN0aW9uVHlwZSwgY2xvc2VkV29ybGQpKTsKICAgIGluZGV4Tm9kZS5ibG9jay5hZGRCZWZvcmUoaW5kZXhOb2RlLCBsZW5ndGgpOwoKICAgIEFic3RyYWN0VmFsdWUgdHlwZSA9CiAgICAgICAgaW5kZXhBcmd1bWVudC5pc1Bvc2l0aXZlSW50ZWdlcihfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZQogICAgICAgICAgICA/IGluZGV4QXJndW1lbnQuaW5zdHJ1Y3Rpb25UeXBlCiAgICAgICAgICAgIDogY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5wb3NpdGl2ZUludFR5cGU7CiAgICBIQm91bmRzQ2hlY2sgY2hlY2sgPSBuZXcgSEJvdW5kc0NoZWNrKGluZGV4QXJndW1lbnQsIGxlbmd0aCwgYXJyYXksIHR5cGUpCiAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBpbmRleE5vZGUuc291cmNlSW5mb3JtYXRpb247CiAgICBpbmRleE5vZGUuYmxvY2suYWRkQmVmb3JlKGluZGV4Tm9kZSwgY2hlY2spOwogICAgLy8gSWYgdGhlIGluZGV4IGlucHV0IHRvIHRoZSBib3VuZHMgY2hlY2sgd2FzIG5vdCBrbm93biB0byBiZSBhbiBpbnRlZ2VyCiAgICAvLyB0aGVuIHdlIHJlcGxhY2UgaXRzIHVzZXMgd2l0aCB0aGUgYm91bmRzIGNoZWNrLCB3aGljaCBpcyBrbm93biB0byBiZSBhbgogICAgLy8gaW50ZWdlci4gIEhvd2V2ZXIsIGlmIHRoZSBpbnB1dCB3YXMgYWxyZWFkeSBhbiBpbnRlZ2VyIHdlIGRvbid0IGRvIHRoaXMKICAgIC8vIGJlY2F1c2UgcHV0dGluZyBpbiBhIGNoZWNrIGluc3RydWN0aW9uIG1pZ2h0IG9ic2N1cmUgdGhlIHJlYWwgbmF0dXJlIG9mCiAgICAvLyB0aGUgaW5kZXggZWcuIGlmIGl0IGlzIGEgY29uc3RhbnQuICBUaGUgcmFuZ2UgaW5mb3JtYXRpb24gZnJvbSB0aGUKICAgIC8vIEJvdW5kc0NoZWNrIGluc3RydWN0aW9uIGlzIGF0dGFjaGVkIHRvIHRoZSBpbnB1dCBkaXJlY3RseSBieQogICAgLy8gdmlzaXRCb3VuZHNDaGVjayBpbiB0aGUgU3NhVmFsdWVSYW5nZUFuYWx5emVyLgogICAgaWYgKGluZGV4QXJndW1lbnQuaXNJbnRlZ2VyKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc1BvdGVudGlhbGx5RmFsc2UpIHsKICAgICAgaW5kZXhBcmd1bWVudC5yZXBsYWNlQWxsVXNlcnNEb21pbmF0ZWRCeShpbmRleE5vZGUsIGNoZWNrKTsKICAgIH0KICAgIGJvdW5kc0NoZWNrZWQuYWRkKGluZGV4Tm9kZSk7CiAgICByZXR1cm4gY2hlY2s7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW5kZXgoSEluZGV4IG5vZGUpIHsKICAgIGlmIChib3VuZHNDaGVja2VkLmNvbnRhaW5zKG5vZGUpKSByZXR1cm47CiAgICBISW5zdHJ1Y3Rpb24gaW5kZXggPSBub2RlLmluZGV4OwogICAgaW5kZXggPSBpbnNlcnRCb3VuZHNDaGVjayhub2RlLCBub2RlLnJlY2VpdmVyLCBpbmRleCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW5kZXhBc3NpZ24oSEluZGV4QXNzaWduIG5vZGUpIHsKICAgIGlmIChib3VuZHNDaGVja2VkLmNvbnRhaW5zKG5vZGUpKSByZXR1cm47CiAgICBISW5zdHJ1Y3Rpb24gaW5kZXggPSBub2RlLmluZGV4OwogICAgaW5kZXggPSBpbnNlcnRCb3VuZHNDaGVjayhub2RlLCBub2RlLnJlY2VpdmVyLCBpbmRleCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW52b2tlRHluYW1pY01ldGhvZChISW52b2tlRHluYW1pY01ldGhvZCBub2RlKSB7CiAgICBNZW1iZXJFbnRpdHkgZWxlbWVudCA9IG5vZGUuZWxlbWVudDsKICAgIGlmIChub2RlLmlzSW50ZXJjZXB0ZWRDYWxsKSByZXR1cm47CiAgICBpZiAoZWxlbWVudCAhPSBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5qc0FycmF5UmVtb3ZlTGFzdCkgcmV0dXJuOwogICAgaWYgKGJvdW5kc0NoZWNrZWQuY29udGFpbnMobm9kZSkpIHJldHVybjsKICAgIC8vIGAwYCBpcyB0aGUgaW5kZXggd2Ugd2FudCB0byBjaGVjaywgYnV0IHdlIHdhbnQgdG8gcmVwb3J0IGAtMWAsIGFzIGlmIHdlCiAgICAvLyBleGVjdXRlZCBgYVthLmxlbmd0aC0xXWAKICAgIEhCb3VuZHNDaGVjayBjaGVjayA9IGluc2VydEJvdW5kc0NoZWNrKAogICAgICAgIG5vZGUsIG5vZGUucmVjZWl2ZXIsIGdyYXBoLmFkZENvbnN0YW50SW50KDAsIGNsb3NlZFdvcmxkKSk7CiAgICBISW5zdHJ1Y3Rpb24gbWludXNPbmUgPSBncmFwaC5hZGRDb25zdGFudEludCgtMSwgY2xvc2VkV29ybGQpOwogICAgY2hlY2suaW5wdXRzLmFkZChtaW51c09uZSk7CiAgICBtaW51c09uZS51c2VkQnkuYWRkKGNoZWNrKTsKICB9Cn0KCmNsYXNzIFNzYURlYWRDb2RlRWxpbWluYXRvciBleHRlbmRzIEhHcmFwaFZpc2l0b3IgaW1wbGVtZW50cyBPcHRpbWl6YXRpb25QaGFzZSB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAiU3NhRGVhZENvZGVFbGltaW5hdG9yIjsKCiAgZmluYWwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkOwogIGZpbmFsIFNzYU9wdGltaXplclRhc2sgb3B0aW1pemVyOwogIEhHcmFwaCBfZ3JhcGg7CiAgU3NhTGl2ZUJsb2NrQW5hbHl6ZXIgYW5hbHl6ZXI7CiAgTWFwPEhJbnN0cnVjdGlvbiwgYm9vbD4gdHJpdmlhbERlYWRTdG9yZVJlY2VpdmVycyA9CiAgICAgIG5ldyBNYXBsZXQ8SEluc3RydWN0aW9uLCBib29sPigpOwogIGJvb2wgZWxpbWluYXRlZFNpZGVFZmZlY3RzID0gZmFsc2U7CgogIFNzYURlYWRDb2RlRWxpbWluYXRvcih0aGlzLmNsb3NlZFdvcmxkLCB0aGlzLm9wdGltaXplcik7CgogIEFic3RyYWN0VmFsdWVEb21haW4gZ2V0IF9hYnN0cmFjdFZhbHVlRG9tYWluID0+CiAgICAgIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CgogIEhJbnN0cnVjdGlvbiB6YXBJbnN0cnVjdGlvbkNhY2hlOwogIEhJbnN0cnVjdGlvbiBnZXQgemFwSW5zdHJ1Y3Rpb24gewogICAgaWYgKHphcEluc3RydWN0aW9uQ2FjaGUgPT0gbnVsbCkgewogICAgICAvLyBBIGNvbnN0YW50IHdpdGggbm8gdHlwZSBkb2VzIG5vdCBwb2xsdXRlIHR5cGVzIGF0IHBoaSBub2Rlcy4KICAgICAgQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IG5ldyBTeW50aGV0aWNDb25zdGFudFZhbHVlKAogICAgICAgICAgU3ludGhldGljQ29uc3RhbnRLaW5kLkVNUFRZX1ZBTFVFLCBfYWJzdHJhY3RWYWx1ZURvbWFpbi5lbXB0eVR5cGUpOwogICAgICB6YXBJbnN0cnVjdGlvbkNhY2hlID0gYW5hbHl6ZXIuZ3JhcGguYWRkQ29uc3RhbnQoY29uc3RhbnQsIGNsb3NlZFdvcmxkKTsKICAgIH0KICAgIHJldHVybiB6YXBJbnN0cnVjdGlvbkNhY2hlOwogIH0KCiAgLy8vIFJldHVybnMgdHJ1ZSBvZiBbZm9yZWlnbl0gd2lsbCB0aHJvdyBhbiBub1N1Y2hNZXRob2QgZXJyb3IgaWYKICAvLy8gcmVjZWl2ZXIgaXMgYG51bGxgIGJlZm9yZSBoYXZpbmcgYW55IG90aGVyIHNpZGUtZWZmZWN0cy4KICBib29sIHRlbXBsYXRlVGhyb3dzTlNNb25OdWxsKEhGb3JlaWduQ29kZSBmb3JlaWduLCBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIpIHsKICAgIGlmIChmb3JlaWduLmlucHV0cy5sZW5ndGggPCAxKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoZm9yZWlnbi5pbnB1dHMuZmlyc3QgIT0gcmVjZWl2ZXIpIHJldHVybiBmYWxzZTsKICAgIGlmIChmb3JlaWduLnRocm93QmVoYXZpb3IuaXNOdWxsTlNNR3VhcmQpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8vIFJldHVybnMgd2hldGhlciB0aGUgbmV4dCB0aHJvd2luZyBpbnN0cnVjdGlvbiB0aGF0IG1heSBoYXZlIHNpZGUKICAvLy8gZWZmZWN0cyBhZnRlciBbaW5zdHJ1Y3Rpb25dLCB0aHJvd3MgW05vU3VjaE1ldGhvZEVycm9yXSBvbiB0aGUKICAvLy8gc2FtZSByZWNlaXZlciBvZiBbaW5zdHJ1Y3Rpb25dLgogIGJvb2wgaGFzRm9sbG93aW5nVGhyb3dpbmdOU00oSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIgPSBpbnN0cnVjdGlvbi5nZXREYXJ0UmVjZWl2ZXIoY2xvc2VkV29ybGQpOwogICAgSEluc3RydWN0aW9uIGN1cnJlbnQgPSBpbnN0cnVjdGlvbi5uZXh0OwogICAgZG8gewogICAgICBpZiAoKGN1cnJlbnQuZ2V0RGFydFJlY2VpdmVyKGNsb3NlZFdvcmxkKSA9PSByZWNlaXZlcikgJiYKICAgICAgICAgIGN1cnJlbnQuY2FuVGhyb3coX2Fic3RyYWN0VmFsdWVEb21haW4pKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKGN1cnJlbnQgaXMgSEZvcmVpZ25Db2RlICYmCiAgICAgICAgICB0ZW1wbGF0ZVRocm93c05TTW9uTnVsbChjdXJyZW50LCByZWNlaXZlcikpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoY3VycmVudC5jYW5UaHJvdyhfYWJzdHJhY3RWYWx1ZURvbWFpbikgfHwKICAgICAgICAgIGN1cnJlbnQuc2lkZUVmZmVjdHMuaGFzU2lkZUVmZmVjdHMoKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBISW5zdHJ1Y3Rpb24gbmV4dCA9IGN1cnJlbnQubmV4dDsKICAgICAgaWYgKG5leHQgPT0gbnVsbCkgewogICAgICAgIC8vIFdlIGRvIG5vdCBtZXJnZSBibG9ja3MgaW4gb3VyIFNTQSBncmFwaCwgc28gaWYgdGhpcyBibG9jayBqdXN0IGp1bXBzCiAgICAgICAgLy8gdG8gYSBzaW5nbGUgc3VjY2Vzc29yLCB2aXNpdCB0aGUgc3VjY2Vzc29yLCBhdm9pZGluZyBiYWNrLWVkZ2VzLgogICAgICAgIEhCYXNpY0Jsb2NrIHN1Y2Nlc3NvcjsKICAgICAgICBpZiAoY3VycmVudCBpcyBIR290bykgewogICAgICAgICAgc3VjY2Vzc29yID0gY3VycmVudC5ibG9jay5zdWNjZXNzb3JzLnNpbmdsZTsKICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnQgaXMgSElmKSB7CiAgICAgICAgICAvLyBXZSBhbHNvIGxlYXZlIEhJZiBub2RlcyBpbiBwbGFjZSB3aGVuIG9uZSBicmFuY2ggaXMgZGVhZC4KICAgICAgICAgIEhJbnN0cnVjdGlvbiBjb25kaXRpb24gPSBjdXJyZW50LmlucHV0cy5maXJzdDsKICAgICAgICAgIGlmIChjb25kaXRpb24gaXMgSENvbnN0YW50KSB7CiAgICAgICAgICAgIGJvb2wgaXNUcnVlID0gY29uZGl0aW9uLmNvbnN0YW50LmlzVHJ1ZTsKICAgICAgICAgICAgc3VjY2Vzc29yID0gaXNUcnVlID8gY3VycmVudC50aGVuQmxvY2sgOiBjdXJyZW50LmVsc2VCbG9jazsKICAgICAgICAgICAgYXNzZXJ0KCFhbmFseXplci5pc0RlYWRCbG9jayhzdWNjZXNzb3IpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHN1Y2Nlc3NvciAhPSBudWxsICYmIHN1Y2Nlc3Nvci5pZCA+IGN1cnJlbnQuYmxvY2suaWQpIHsKICAgICAgICAgIG5leHQgPSBzdWNjZXNzb3IuZmlyc3Q7CiAgICAgICAgfQogICAgICB9CiAgICAgIGN1cnJlbnQgPSBuZXh0OwogICAgfSB3aGlsZSAoY3VycmVudCAhPSBudWxsKTsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGJvb2wgaXNUcml2aWFsRGVhZFN0b3JlUmVjZWl2ZXIoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICAvLyBGb3IgYW4gYWxsb2NhdGlvbiwgaWYgYWxsIHRoZSBsb2FkcyBhcmUgZGVhZCAoYXdhaXRpbmcgcmVtb3ZhbCBhZnRlcgogICAgLy8gU3NhTG9hZEVsaW1pbmF0aW9uKSBhbmQgdGhlIG9ubHkgb3RoZXIgdXNlcyBhcmUgc3RvcmVzLCB0aGVuIHRoZQogICAgLy8gYWxsb2NhdGlvbiBkb2VzIG5vdCBlc2NhcGUgd2hpY2ggbWFrZXMgYWxsIHRoZSBzdG9yZXMgZGVhZCB0b28uCiAgICBib29sIGlzRGVhZFVzZShISW5zdHJ1Y3Rpb24gdXNlKSB7CiAgICAgIGlmICh1c2UgaXMgSEZpZWxkU2V0KSB7CiAgICAgICAgLy8gVGhlIHVzZSBtdXN0IGJlIHRoZSByZWNlaXZlci4gIEV2ZW4gaWYgdGhlIHVzZSBpcyBhbHNvIHRoZSBhcmd1bWVudCwKICAgICAgICAvLyBpLmUuICBhLnggPSBhLCB0aGUgc3RvcmUgaXMgc3RpbGwgZGVhZCBpZiBhbGwgb3RoZXIgdXNlcyBhcmUgZGVhZC4KICAgICAgICBpZiAodXNlLmdldERhcnRSZWNlaXZlcihjbG9zZWRXb3JsZCkgPT0gaW5zdHJ1Y3Rpb24pIHJldHVybiB0cnVlOwogICAgICB9IGVsc2UgaWYgKHVzZSBpcyBIRmllbGRHZXQpIHsKICAgICAgICBhc3NlcnQodXNlLmdldERhcnRSZWNlaXZlcihjbG9zZWRXb3JsZCkgPT0gaW5zdHJ1Y3Rpb24pOwogICAgICAgIGlmIChpc0RlYWRDb2RlKHVzZSkpIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICByZXR1cm4gaW5zdHJ1Y3Rpb24uaXNBbGxvY2F0aW9uKF9hYnN0cmFjdFZhbHVlRG9tYWluKSAmJgogICAgICAgIGluc3RydWN0aW9uLmlzUHVyZShfYWJzdHJhY3RWYWx1ZURvbWFpbikgJiYKICAgICAgICB0cml2aWFsRGVhZFN0b3JlUmVjZWl2ZXJzLnB1dElmQWJzZW50KAogICAgICAgICAgICBpbnN0cnVjdGlvbiwgKCkgPT4gaW5zdHJ1Y3Rpb24udXNlZEJ5LmV2ZXJ5KGlzRGVhZFVzZSkpOwogIH0KCiAgYm9vbCBpc1RyaXZpYWxEZWFkU3RvcmUoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb24gaXMgSEZpZWxkU2V0ICYmCiAgICAgICAgaXNUcml2aWFsRGVhZFN0b3JlUmVjZWl2ZXIoaW5zdHJ1Y3Rpb24uZ2V0RGFydFJlY2VpdmVyKGNsb3NlZFdvcmxkKSk7CiAgfQoKICBib29sIGlzRGVhZENvZGUoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBpZiAoIWluc3RydWN0aW9uLnVzZWRCeS5pc0VtcHR5KSByZXR1cm4gZmFsc2U7CiAgICBpZiAoaXNUcml2aWFsRGVhZFN0b3JlKGluc3RydWN0aW9uKSkgcmV0dXJuIHRydWU7CiAgICBpZiAoaW5zdHJ1Y3Rpb24uc2lkZUVmZmVjdHMuaGFzU2lkZUVmZmVjdHMoKSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKGluc3RydWN0aW9uLmNhblRocm93KF9hYnN0cmFjdFZhbHVlRG9tYWluKSkgewogICAgICBpZiAoaW5zdHJ1Y3Rpb24ub25seVRocm93c05TTSgpICYmIGhhc0ZvbGxvd2luZ1Rocm93aW5nTlNNKGluc3RydWN0aW9uKSkgewogICAgICAgIC8vIFtpbnN0cnVjdGlvbl0gaXMgYSBudWxsIHJlY2lldmVyIGd1YXJkIHRoYXQgaXMgZm9sbG93ZWQgYnkgYW4KICAgICAgICAvLyBpbnN0cnVjdGlvbiB0aGF0IGZhaWxzIHRoZSBzYW1lIHdheSAoYnkgYWNjZXNzaW5nIGEgcHJvcGVydHkgb2YKICAgICAgICAvLyBgbnVsbGAgb3IgYHVuZGVmaW5lZGApLgogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChpbnN0cnVjdGlvbiBpcyBIUGFyYW1ldGVyVmFsdWUpIHJldHVybiBmYWxzZTsKICAgIGlmIChpbnN0cnVjdGlvbiBpcyBITG9jYWxTZXQpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEdyYXBoKEhHcmFwaCBncmFwaCkgewogICAgX2dyYXBoID0gZ3JhcGg7CiAgICBhbmFseXplciA9IG5ldyBTc2FMaXZlQmxvY2tBbmFseXplcihncmFwaCwgY2xvc2VkV29ybGQsIG9wdGltaXplcik7CiAgICBhbmFseXplci5hbmFseXplKCk7CiAgICB2aXNpdFBvc3REb21pbmF0b3JUcmVlKGdyYXBoKTsKICAgIGNsZWFuUGhpcygpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJhc2ljQmxvY2soSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIGJvb2wgaXNEZWFkQmxvY2sgPSBhbmFseXplci5pc0RlYWRCbG9jayhibG9jayk7CiAgICBibG9jay5pc0xpdmUgPSAhaXNEZWFkQmxvY2s7CiAgICBzaW1wbGlmeUNvbnRyb2xGbG93KGJsb2NrKTsKICAgIC8vIFN0YXJ0IGZyb20gdGhlIGxhc3Qgbm9uLWNvbnRyb2wgZmxvdyBpbnN0cnVjdGlvbiBpbiB0aGUgYmxvY2suCiAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSBibG9jay5sYXN0LnByZXZpb3VzOwogICAgd2hpbGUgKGluc3RydWN0aW9uICE9IG51bGwpIHsKICAgICAgdmFyIHByZXZpb3VzID0gaW5zdHJ1Y3Rpb24ucHJldmlvdXM7CiAgICAgIGlmIChpc0RlYWRCbG9jaykgewogICAgICAgIGVsaW1pbmF0ZWRTaWRlRWZmZWN0cyA9CiAgICAgICAgICAgIGVsaW1pbmF0ZWRTaWRlRWZmZWN0cyB8fCBpbnN0cnVjdGlvbi5zaWRlRWZmZWN0cy5oYXNTaWRlRWZmZWN0cygpOwogICAgICAgIHJlbW92ZVVzZXJzKGluc3RydWN0aW9uKTsKICAgICAgICBibG9jay5yZW1vdmUoaW5zdHJ1Y3Rpb24pOwogICAgICB9IGVsc2UgaWYgKGlzRGVhZENvZGUoaW5zdHJ1Y3Rpb24pKSB7CiAgICAgICAgYmxvY2sucmVtb3ZlKGluc3RydWN0aW9uKTsKICAgICAgfQogICAgICBpbnN0cnVjdGlvbiA9IHByZXZpb3VzOwogICAgfQogICAgYmxvY2suZm9yRWFjaFBoaShzaW1wbGlmeVBoaSk7CiAgICBldmFjdWF0ZVRha2VuQnJhbmNoKGJsb2NrKTsKICB9CgogIHZvaWQgc2ltcGxpZnlQaGkoSFBoaSBwaGkpIHsKICAgIC8vIElmIHRoZSBwaGkgaXMgb2YgdGhlIGZvcm0gYHBoaSh4LCBIVHlwZUtub3duKHgpKWAsIGl0IGRvZXMgbm90IHN0cmVuZ3RoZW4KICAgIC8vIGB4YC4gIFdlIGNhbiByZXBsYWNlIHRoZSBwaGkgd2l0aCBgeGAgdG8gcG90ZW50aWFsbHkgbWFrZSB0aGUgSFR5cGVLbm93bgogICAgLy8gcmVmaW5lbWVudCBub2RlIGRlYWQgYW5kIHBvdGVudGlhbGx5IG1ha2UgYSBISWYgY29udHJvbCBubyBIUGhpcy4KCiAgICAvLyBUT0RPKHNyYSk6IEltcGxlbWVudCB2ZXJzaW9uIG9mIHRoaXMgdGVzdCB0aGF0IHdvcmtzIGZvciBhIHN1YmdyYXBoIG9mCiAgICAvLyBIUGhpIG5vZGVzLgogICAgSEluc3RydWN0aW9uIGJhc2UgPSBudWxsOwogICAgYm9vbCBzZWVuVW5yZWZpbmVkQmFzZSA9IGZhbHNlOwogICAgZm9yIChISW5zdHJ1Y3Rpb24gaW5wdXQgaW4gcGhpLmlucHV0cykgewogICAgICBISW5zdHJ1Y3Rpb24gdmFsdWUgPSBpbnB1dDsKICAgICAgd2hpbGUgKHZhbHVlIGlzIEhUeXBlS25vd24pIHsKICAgICAgICBIVHlwZUtub3duIHJlZmluZW1lbnQgPSB2YWx1ZTsKICAgICAgICB2YWx1ZSA9IHJlZmluZW1lbnQuY2hlY2tlZElucHV0OwogICAgICB9CiAgICAgIGlmICh2YWx1ZSA9PSBpbnB1dCkgc2VlblVucmVmaW5lZEJhc2UgPSB0cnVlOwogICAgICBiYXNlID8/PSB2YWx1ZTsKICAgICAgaWYgKGJhc2UgIT0gdmFsdWUpIHJldHVybjsKICAgIH0KCiAgICBpZiAoc2VlblVucmVmaW5lZEJhc2UpIHsKICAgICAgSEJhc2ljQmxvY2sgYmxvY2sgPSBwaGkuYmxvY2s7CiAgICAgIGJsb2NrLnJld3JpdGUocGhpLCBiYXNlKTsKICAgICAgYmxvY2sucmVtb3ZlUGhpKHBoaSk7CiAgICB9CiAgfQoKICB2b2lkIHNpbXBsaWZ5Q29udHJvbEZsb3coSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIEhDb250cm9sRmxvdyBpbnN0cnVjdGlvbiA9IGJsb2NrLmxhc3Q7CiAgICBpZiAoaW5zdHJ1Y3Rpb24gaXMgSElmKSB7CiAgICAgIEhJbnN0cnVjdGlvbiBjb25kaXRpb24gPSBpbnN0cnVjdGlvbi5jb25kaXRpb247CiAgICAgIGlmIChjb25kaXRpb24uaXNDb25zdGFudCgpKSByZXR1cm47CgogICAgICAvLyBXZSB3YW50IHRvIHJlbW92ZSBhbiBpZi10aGVuLWVsc2UgZGlhbW9uZCB3aGVuIHRoZSB0aGVuLSBhbmQgZWxzZS0KICAgICAgLy8gYnJhbmNoZXMgYXJlIGVtcHR5IGFuZCB0aGUgY29uZGl0aW9uIGRvZXMgbm90IGNvbnRyb2wgYSBIUGhpLiBXZSBjYW5ub3QKICAgICAgLy8gY2hhbmdlIHRoZSBDRkcgc3RydWN0dXJlIHNvIHdlIHJlcGxhY2UgdGhlIEhJZiBjb25kaXRpb24gd2l0aCBhCiAgICAgIC8vIGNvbnN0YW50LiBUaGlzIG1heSBsZWF2ZSB0aGUgb3JpZ2luYWwgY29uZGl0aW9uIHVudXNlZC4gaS5lLiBhCiAgICAgIC8vIGNhbmRpZGF0ZSBmb3IgYmVpbmcgZGVhZCBjb2RlLgoKICAgICAgTGlzdDxIQmFzaWNCbG9jaz4gZG9taW5hdGVkID0gYmxvY2suZG9taW5hdGVkQmxvY2tzOwogICAgICAvLyBEaWFtb25kLWxpa2UgY29udHJvbCBmbG93IGRvbWluYXRlcyB0aGUgdGhlbi0sIGVsc2UtIGFuZCBqb2luLSBibG9ja3MuCiAgICAgIGlmIChkb21pbmF0ZWQubGVuZ3RoICE9IDMpIHJldHVybjsKICAgICAgSEJhc2ljQmxvY2sgam9pbiA9IGRvbWluYXRlZC5sYXN0OwogICAgICBpZiAoIWpvaW4ucGhpcy5pc0VtcHR5KSByZXR1cm47IC8vIGNvbmRpdGlvbiBjb250cm9scyBhIHBoaS4KICAgICAgLy8gSWdub3JlIGV4aXQgYmxvY2sgLSB1c3VhbGx5IHRoZSBqb2luIGluIGBpZiAoLi4uKSByZXR1cm4gLi4uYAogICAgICBpZiAoam9pbi5pc0V4aXRCbG9jaygpKSByZXR1cm47CgogICAgICBpbnQgdGhlblNpemUgPSBtZWFzdXJlRW1wdHlJbnRlcnZhbChpbnN0cnVjdGlvbi50aGVuQmxvY2ssIGpvaW4pOwogICAgICBpZiAodGhlblNpemUgPT0gbnVsbCkgcmV0dXJuOwogICAgICBpbnQgZWxzZVNpemUgPSBtZWFzdXJlRW1wdHlJbnRlcnZhbChpbnN0cnVjdGlvbi5lbHNlQmxvY2ssIGpvaW4pOwogICAgICBpZiAoZWxzZVNpemUgPT0gbnVsbCkgcmV0dXJuOwoKICAgICAgLy8gUGljayB0aGUgJ2xpdmUnIGJyYW5jaCB0byBiZSB0aGUgc21hbGxlc3Qgc3ViZ3JhcGguCiAgICAgIGJvb2wgdmFsdWUgPSB0aGVuU2l6ZSA8PSBlbHNlU2l6ZTsKICAgICAgSEluc3RydWN0aW9uIG5ld0NvbmRpdGlvbiA9IF9ncmFwaC5hZGRDb25zdGFudEJvb2wodmFsdWUsIGNsb3NlZFdvcmxkKTsKICAgICAgaW5zdHJ1Y3Rpb24uaW5wdXRzWzBdID0gbmV3Q29uZGl0aW9uOwogICAgICBjb25kaXRpb24udXNlZEJ5LnJlbW92ZShpbnN0cnVjdGlvbik7CiAgICAgIG5ld0NvbmRpdGlvbi51c2VkQnkuYWRkKGluc3RydWN0aW9uKTsKICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYmxvY2tzIGZyb20gW3N0YXJ0XSB1cCB0byBidXQgbm90IGluY2x1ZGluZyBbZW5kXS4KICAvLy8gUmV0dXJucyBgbnVsbGAgaWYgYW55IG9mIHRoZSBibG9ja3MgaXMgbm9uLWVtcHR5IChvdGhlciB0aGFuIGNvbnRyb2wKICAvLy8gZmxvdykuICBSZXR1cm5zIGBudWxsYCBpZiB0aGVyZSBpcyBhbiBleGl0IGZyb20gdGhlIHJlZ2lvbiBvdGhlciB0aGFuCiAgLy8vIFtlbmRdIG9yIHZpYSBjb250cm9sIGZsb3cgb3RoZXIgdGhhbiBIR290byBhbmQgSElmLgogIGludCBtZWFzdXJlRW1wdHlJbnRlcnZhbChIQmFzaWNCbG9jayBzdGFydCwgSEJhc2ljQmxvY2sgZW5kKSB7CiAgICBpZiAoc3RhcnQuZmlyc3QgIT0gc3RhcnQubGFzdCkgcmV0dXJuIG51bGw7IC8vIHN0YXJ0IGlzIG5vdCBlbXB0eS4KICAgIC8vIERvIGEgc2ltcGxlIHNpbmdsZS1ibG9jayByZWdpb24gdGVzdCBmaXJzdC4KICAgIGlmIChzdGFydC5sYXN0IGlzIEhHb3RvICYmCiAgICAgICAgc3RhcnQuc3VjY2Vzc29ycy5sZW5ndGggPT0gMSAmJgogICAgICAgIHN0YXJ0LnN1Y2Nlc3NvcnMuc2luZ2xlID09IGVuZCkgewogICAgICByZXR1cm4gMTsKICAgIH0KICAgIC8vIFRPRE8oc3JhKTogSW1wbGVtZW50IGZ1bGxlciB0ZXN0LgogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLy8gSWYgW2Jsb2NrXSBpcyBhbiBhbHdheXMtdGFrZW4gYnJhbmNoLCBtb3ZlIHRoZSBjb2RlIGZyb20gdGhlIHRha2VuIGJyYW5jaAogIC8vLyBpbnRvIFtibG9ja10uIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgbWFraW5nIHRoZSBpbnN0cnVjdGlvbnMgYXZhaWxhYmxlIGZvcgogIC8vLyBmdXJ0aGVyIG9wdGltaXphdGlvbnMgYnkgbW92aW5nIHRoZW0gdG8gYSBwb3NpdGlvbiB0aGF0IGRvbWluYXRlcyB0aGUgam9pbgogIC8vLyBwb2ludCBvZiB0aGUgaWYtdGhlbi1lbHNlLgogIC8vIFRPRE8oMjk0NzUpOiBEZWxldGUgZGVhZCBibG9ja3MgaW5zdGVhZC4KICB2b2lkIGV2YWN1YXRlVGFrZW5CcmFuY2goSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIGlmICghYmxvY2suaXNMaXZlKSByZXR1cm47CiAgICBIQ29udHJvbEZsb3cgYnJhbmNoID0gYmxvY2subGFzdDsKICAgIGlmIChicmFuY2ggaXMgSElmKSB7CiAgICAgIGlmIChicmFuY2gudGhlbkJsb2NrLmlzTGl2ZSA9PSBicmFuY2guZWxzZUJsb2NrLmlzTGl2ZSkgcmV0dXJuOwogICAgICBhc3NlcnQoYnJhbmNoLmNvbmRpdGlvbi5pc0NvbnN0YW50KCkpOwogICAgICBIQmFzaWNCbG9jayB0YXJnZXQgPQogICAgICAgICAgYnJhbmNoLnRoZW5CbG9jay5pc0xpdmUgPyBicmFuY2gudGhlbkJsb2NrIDogYnJhbmNoLmVsc2VCbG9jazsKICAgICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gdGFyZ2V0LmZpcnN0OwogICAgICB3aGlsZSAoIWluc3RydWN0aW9uLmlzQ29udHJvbEZsb3coKSkgewogICAgICAgIEhJbnN0cnVjdGlvbiBuZXh0ID0gaW5zdHJ1Y3Rpb24ubmV4dDsKICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24gaXMgSFR5cGVLbm93biAmJiBpbnN0cnVjdGlvbi5pc1Bpbm5lZCkgYnJlYWs7CiAgICAgICAgaW5zdHJ1Y3Rpb24uYmxvY2suZGV0YWNoKGluc3RydWN0aW9uKTsKICAgICAgICBibG9jay5tb3ZlQXRFeGl0KGluc3RydWN0aW9uKTsKICAgICAgICBpbnN0cnVjdGlvbiA9IG5leHQ7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgY2xlYW5QaGlzKCkgewogICAgTDoKICAgIGZvciAoSEJhc2ljQmxvY2sgYmxvY2sgaW4gX2dyYXBoLmJsb2NrcykgewogICAgICBMaXN0PEhCYXNpY0Jsb2NrPiBwcmVkZWNlc3NvcnMgPSBibG9jay5wcmVkZWNlc3NvcnM7CiAgICAgIC8vIFphcCBhbGwgaW5wdXRzIHRvIHBoaXMgdGhhdCBjb3JyZXNwb25kIHRvIGRlYWQgYmxvY2tzLgogICAgICBibG9jay5mb3JFYWNoUGhpKChIUGhpIHBoaSkgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhpLmlucHV0cy5sZW5ndGg7ICsraSkgewogICAgICAgICAgaWYgKCFwcmVkZWNlc3NvcnNbaV0uaXNMaXZlICYmIHBoaS5pbnB1dHNbaV0gIT0gemFwSW5zdHJ1Y3Rpb24pIHsKICAgICAgICAgICAgcmVwbGFjZUlucHV0KGksIHBoaSwgemFwSW5zdHJ1Y3Rpb24pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGlmIChwcmVkZWNlc3NvcnMubGVuZ3RoIDwgMikgY29udGludWUgTDsKICAgICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHNpbmdsZSBsaXZlIHByZWRlY2Vzc29yIGlmIGl0IGV4aXN0cy4KICAgICAgaW50IGluZGV4T2ZMaXZlID0gLTE7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJlZGVjZXNzb3JzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKHByZWRlY2Vzc29yc1tpXS5pc0xpdmUpIHsKICAgICAgICAgIGlmIChpbmRleE9mTGl2ZSA+PSAwKSBjb250aW51ZSBMOwogICAgICAgICAgaW5kZXhPZkxpdmUgPSBpOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBSdW4gdGhyb3VnaCB0aGUgcGhpcyBvZiB0aGUgYmxvY2sgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZWlyIGlucHV0CiAgICAgIC8vIHRoYXQgY29tZXMgZnJvbSB0aGUgb25seSBsaXZlIHByZWRlY2Vzc29yIGlmIHRoYXQgZG9taW5hdGVzIHRoZSBwaGkuCiAgICAgIC8vCiAgICAgIC8vIFRPRE8oc3JhKTogSWYgdGhlIGlucHV0IGlzIGRpcmVjdGx5IGluIHRoZSBvbmx5IGxpdmUgcHJlZGVjZXNzb3IsIGl0CiAgICAgIC8vIG1pZ2h0IGJlIHBvc3NpYmxlIHRvIG1vdmUgaXQgaW50byBbYmxvY2tdIChlLmcuIGFsbCBpdHMgaW5wdXRzIGFyZQogICAgICAvLyBkb21pbmF0aW5nLikKICAgICAgYmxvY2suZm9yRWFjaFBoaSgoSFBoaSBwaGkpIHsKICAgICAgICBISW5zdHJ1Y3Rpb24gcmVwbGFjZW1lbnQgPQogICAgICAgICAgICAoaW5kZXhPZkxpdmUgPj0gMCkgPyBwaGkuaW5wdXRzW2luZGV4T2ZMaXZlXSA6IHphcEluc3RydWN0aW9uOwogICAgICAgIGlmIChyZXBsYWNlbWVudC5kb21pbmF0ZXMocGhpKSkgewogICAgICAgICAgYmxvY2sucmV3cml0ZShwaGksIHJlcGxhY2VtZW50KTsKICAgICAgICAgIGJsb2NrLnJlbW92ZVBoaShwaGkpOwogICAgICAgICAgaWYgKHJlcGxhY2VtZW50LnNvdXJjZUVsZW1lbnQgPT0gbnVsbCAmJgogICAgICAgICAgICAgIHBoaS5zb3VyY2VFbGVtZW50ICE9IG51bGwgJiYKICAgICAgICAgICAgICByZXBsYWNlbWVudCBpcyEgSFRoaXMpIHsKICAgICAgICAgICAgcmVwbGFjZW1lbnQuc291cmNlRWxlbWVudCA9IHBoaS5zb3VyY2VFbGVtZW50OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfQoKICB2b2lkIHJlcGxhY2VJbnB1dChpbnQgaSwgSEluc3RydWN0aW9uIGZyb20sIEhJbnN0cnVjdGlvbiBieSkgewogICAgZnJvbS5pbnB1dHNbaV0udXNlZEJ5LnJlbW92ZShmcm9tKTsKICAgIGZyb20uaW5wdXRzW2ldID0gYnk7CiAgICBieS51c2VkQnkuYWRkKGZyb20pOwogIH0KCiAgdm9pZCByZW1vdmVVc2VycyhISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGluc3RydWN0aW9uLnVzZWRCeS5mb3JFYWNoKCh1c2VyKSB7CiAgICAgIHJlbW92ZUlucHV0KHVzZXIsIGluc3RydWN0aW9uKTsKICAgIH0pOwogICAgaW5zdHJ1Y3Rpb24udXNlZEJ5LmNsZWFyKCk7CiAgfQoKICB2b2lkIHJlbW92ZUlucHV0KEhJbnN0cnVjdGlvbiB1c2VyLCBISW5zdHJ1Y3Rpb24gaW5wdXQpIHsKICAgIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMgPSB1c2VyLmlucHV0czsKICAgIGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBpbnB1dHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGlucHV0ID09IGlucHV0c1tpXSkgewogICAgICAgIHVzZXIuaW5wdXRzW2ldID0gemFwSW5zdHJ1Y3Rpb247CiAgICAgICAgemFwSW5zdHJ1Y3Rpb24udXNlZEJ5LmFkZCh1c2VyKTsKICAgICAgfQogICAgfQogIH0KfQoKY2xhc3MgU3NhTGl2ZUJsb2NrQW5hbHl6ZXIgZXh0ZW5kcyBIQmFzZVZpc2l0b3IgewogIGZpbmFsIEhHcmFwaCBncmFwaDsKICBmaW5hbCBTZXQ8SEJhc2ljQmxvY2s+IGxpdmUgPSBuZXcgU2V0PEhCYXNpY0Jsb2NrPigpOwogIGZpbmFsIExpc3Q8SEJhc2ljQmxvY2s+IHdvcmtsaXN0ID0gPEhCYXNpY0Jsb2NrPltdOwogIGZpbmFsIFNzYU9wdGltaXplclRhc2sgb3B0aW1pemVyOwogIGZpbmFsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZDsKCiAgU3NhTGl2ZUJsb2NrQW5hbHl6ZXIodGhpcy5ncmFwaCwgdGhpcy5jbG9zZWRXb3JsZCwgdGhpcy5vcHRpbWl6ZXIpOwoKICBBYnN0cmFjdFZhbHVlRG9tYWluIGdldCBfYWJzdHJhY3RWYWx1ZURvbWFpbiA9PgogICAgICBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluOwoKICBNYXA8SEluc3RydWN0aW9uLCBSYW5nZT4gZ2V0IHJhbmdlcyA9PiBvcHRpbWl6ZXIucmFuZ2VzOwoKICBib29sIGlzRGVhZEJsb2NrKEhCYXNpY0Jsb2NrIGJsb2NrKSA9PiAhbGl2ZS5jb250YWlucyhibG9jayk7CgogIHZvaWQgYW5hbHl6ZSgpIHsKICAgIG1hcmtCbG9ja0xpdmUoZ3JhcGguZW50cnkpOwogICAgd2hpbGUgKCF3b3JrbGlzdC5pc0VtcHR5KSB7CiAgICAgIEhCYXNpY0Jsb2NrIGxpdmUgPSB3b3JrbGlzdC5yZW1vdmVMYXN0KCk7CiAgICAgIGxpdmUubGFzdC5hY2NlcHQodGhpcyk7CiAgICB9CiAgfQoKICB2b2lkIG1hcmtCbG9ja0xpdmUoSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIGlmICghbGl2ZS5jb250YWlucyhibG9jaykpIHsKICAgICAgd29ya2xpc3QuYWRkKGJsb2NrKTsKICAgICAgbGl2ZS5hZGQoYmxvY2spOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbnRyb2xGbG93KEhDb250cm9sRmxvdyBpbnN0cnVjdGlvbikgewogICAgaW5zdHJ1Y3Rpb24uYmxvY2suc3VjY2Vzc29ycy5mb3JFYWNoKG1hcmtCbG9ja0xpdmUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdElmKEhJZiBpbnN0cnVjdGlvbikgewogICAgSEluc3RydWN0aW9uIGNvbmRpdGlvbiA9IGluc3RydWN0aW9uLmNvbmRpdGlvbjsKICAgIGlmIChjb25kaXRpb24uaXNDb25zdGFudCgpKSB7CiAgICAgIGlmIChjb25kaXRpb24uaXNDb25zdGFudFRydWUoKSkgewogICAgICAgIG1hcmtCbG9ja0xpdmUoaW5zdHJ1Y3Rpb24udGhlbkJsb2NrKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBtYXJrQmxvY2tMaXZlKGluc3RydWN0aW9uLmVsc2VCbG9jayk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHZpc2l0Q29udHJvbEZsb3coaW5zdHJ1Y3Rpb24pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN3aXRjaChIU3dpdGNoIG5vZGUpIHsKICAgIGlmIChub2RlLmV4cHJlc3Npb24uaXNJbnRlZ2VyKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIFJhbmdlIHN3aXRjaFJhbmdlID0gcmFuZ2VzW25vZGUuZXhwcmVzc2lvbl07CiAgICAgIGlmIChzd2l0Y2hSYW5nZSAhPSBudWxsICYmCiAgICAgICAgICBzd2l0Y2hSYW5nZS5sb3dlciBpcyBJbnRWYWx1ZSAmJgogICAgICAgICAgc3dpdGNoUmFuZ2UudXBwZXIgaXMgSW50VmFsdWUpIHsKICAgICAgICBJbnRWYWx1ZSBsb3dlclZhbHVlID0gc3dpdGNoUmFuZ2UubG93ZXI7CiAgICAgICAgSW50VmFsdWUgdXBwZXJWYWx1ZSA9IHN3aXRjaFJhbmdlLnVwcGVyOwogICAgICAgIEJpZ0ludCBsb3dlciA9IGxvd2VyVmFsdWUudmFsdWU7CiAgICAgICAgQmlnSW50IHVwcGVyID0gdXBwZXJWYWx1ZS52YWx1ZTsKICAgICAgICBTZXQ8QmlnSW50PiBsaXZlTGFiZWxzID0gbmV3IFNldDxCaWdJbnQ+KCk7CiAgICAgICAgZm9yIChpbnQgcG9zID0gMTsgcG9zIDwgbm9kZS5pbnB1dHMubGVuZ3RoOyBwb3MrKykgewogICAgICAgICAgSENvbnN0YW50IGlucHV0ID0gbm9kZS5pbnB1dHNbcG9zXTsKICAgICAgICAgIGlmICghaW5wdXQuaXNDb25zdGFudEludGVnZXIoKSkgY29udGludWU7CiAgICAgICAgICBJbnRDb25zdGFudFZhbHVlIGNvbnN0YW50ID0gaW5wdXQuY29uc3RhbnQ7CiAgICAgICAgICBCaWdJbnQgbGFiZWwgPSBjb25zdGFudC5pbnRWYWx1ZTsKICAgICAgICAgIGlmICghbGl2ZUxhYmVscy5jb250YWlucyhsYWJlbCkgJiYgbGFiZWwgPD0gdXBwZXIgJiYgbGFiZWwgPj0gbG93ZXIpIHsKICAgICAgICAgICAgbWFya0Jsb2NrTGl2ZShub2RlLmJsb2NrLnN1Y2Nlc3NvcnNbcG9zIC0gMV0pOwogICAgICAgICAgICBsaXZlTGFiZWxzLmFkZChsYWJlbCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChuZXcgQmlnSW50LmZyb20obGl2ZUxhYmVscy5sZW5ndGgpICE9IHVwcGVyIC0gbG93ZXIgKyBCaWdJbnQub25lKSB7CiAgICAgICAgICBtYXJrQmxvY2tMaXZlKG5vZGUuZGVmYXVsdFRhcmdldCk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgdmlzaXRDb250cm9sRmxvdyhub2RlKTsKICB9Cn0KCmNsYXNzIFNzYURlYWRQaGlFbGltaW5hdG9yIGltcGxlbWVudHMgT3B0aW1pemF0aW9uUGhhc2UgewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gIlNzYURlYWRQaGlFbGltaW5hdG9yIjsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEdyYXBoKEhHcmFwaCBncmFwaCkgewogICAgZmluYWwgTGlzdDxIUGhpPiB3b3JrbGlzdCA9IDxIUGhpPltdOwogICAgLy8gQSBzZXQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGl2ZSBwaGlzIHRoYXQgd2UgZm91bmQuCiAgICBmaW5hbCBTZXQ8SFBoaT4gbGl2ZVBoaXMgPSBuZXcgU2V0PEhQaGk+KCk7CgogICAgLy8gQWRkIHRvIHRoZSB3b3JrbGlzdCBhbGwgbGl2ZSBwaGlzOiBwaGlzIHJlZmVyZW5jZWQgYnkgbm9uLXBoaQogICAgLy8gaW5zdHJ1Y3Rpb25zLgogICAgZm9yIChmaW5hbCBibG9jayBpbiBncmFwaC5ibG9ja3MpIHsKICAgICAgYmxvY2suZm9yRWFjaFBoaSgoSFBoaSBwaGkpIHsKICAgICAgICBmb3IgKGZpbmFsIHVzZXIgaW4gcGhpLnVzZWRCeSkgewogICAgICAgICAgaWYgKHVzZXIgaXMhIEhQaGkpIHsKICAgICAgICAgICAgd29ya2xpc3QuYWRkKHBoaSk7CiAgICAgICAgICAgIGxpdmVQaGlzLmFkZChwaGkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIC8vIFByb2Nlc3MgdGhlIHdvcmtsaXN0IGJ5IHByb3BhZ2F0aW5nIGxpdmVuZXNzIHRvIHBoaSBpbnB1dHMuCiAgICB3aGlsZSAoIXdvcmtsaXN0LmlzRW1wdHkpIHsKICAgICAgSFBoaSBwaGkgPSB3b3JrbGlzdC5yZW1vdmVMYXN0KCk7CiAgICAgIGZvciAoZmluYWwgaW5wdXQgaW4gcGhpLmlucHV0cykgewogICAgICAgIGlmIChpbnB1dCBpcyBIUGhpICYmICFsaXZlUGhpcy5jb250YWlucyhpbnB1dCkpIHsKICAgICAgICAgIHdvcmtsaXN0LmFkZChpbnB1dCk7CiAgICAgICAgICBsaXZlUGhpcy5hZGQoaW5wdXQpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIFJlbW92ZSBwaGlzIHRoYXQgYXJlIG5vdCBsaXZlLgogICAgLy8gVHJhdmVyc2UgaW4gcmV2ZXJzZSBvcmRlciB0byByZW1vdmUgcGhpcyB3aXRoIG5vIHVzZXMgYmVmb3JlIHRoZQogICAgLy8gcGhpcyB0aGF0IHRoZXkgbWlnaHQgdXNlLgogICAgLy8gTk9USUNFOiBEb2Vzbid0IGhhbmRsZSBjaXJjdWxhciByZWZlcmVuY2VzLCBidXQgd2UgZG9uJ3QgY3VycmVudGx5CiAgICAvLyBjcmVhdGUgYW55LgogICAgTGlzdDxIQmFzaWNCbG9jaz4gYmxvY2tzID0gZ3JhcGguYmxvY2tzOwogICAgZm9yIChpbnQgaSA9IGJsb2Nrcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICBIQmFzaWNCbG9jayBibG9jayA9IGJsb2Nrc1tpXTsKICAgICAgSFBoaSBjdXJyZW50ID0gYmxvY2sucGhpcy5maXJzdDsKICAgICAgSFBoaSBuZXh0ID0gbnVsbDsKICAgICAgd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkgewogICAgICAgIG5leHQgPSBjdXJyZW50Lm5leHQ7CiAgICAgICAgaWYgKCFsaXZlUGhpcy5jb250YWlucyhjdXJyZW50KQogICAgICAgICAgICAvLyBUT0RPKGFoZSk6IE5vdCBzdXJlIHRoZSBmb2xsb3dpbmcgaXMgY29ycmVjdC4KICAgICAgICAgICAgJiYKICAgICAgICAgICAgY3VycmVudC51c2VkQnkuaXNFbXB0eSkgewogICAgICAgICAgYmxvY2sucmVtb3ZlUGhpKGN1cnJlbnQpOwogICAgICAgIH0KICAgICAgICBjdXJyZW50ID0gbmV4dDsKICAgICAgfQogICAgfQogIH0KfQoKY2xhc3MgU3NhUmVkdW5kYW50UGhpRWxpbWluYXRvciBpbXBsZW1lbnRzIE9wdGltaXphdGlvblBoYXNlIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZSA9ICJTc2FSZWR1bmRhbnRQaGlFbGltaW5hdG9yIjsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEdyYXBoKEhHcmFwaCBncmFwaCkgewogICAgZmluYWwgTGlzdDxIUGhpPiB3b3JrbGlzdCA9IDxIUGhpPltdOwoKICAgIC8vIEFkZCBhbGwgcGhpcyBpbiB0aGUgd29ya2xpc3QuCiAgICBmb3IgKGZpbmFsIGJsb2NrIGluIGdyYXBoLmJsb2NrcykgewogICAgICBibG9jay5mb3JFYWNoUGhpKChIUGhpIHBoaSkgPT4gd29ya2xpc3QuYWRkKHBoaSkpOwogICAgfQoKICAgIHdoaWxlICghd29ya2xpc3QuaXNFbXB0eSkgewogICAgICBIUGhpIHBoaSA9IHdvcmtsaXN0LnJlbW92ZUxhc3QoKTsKCiAgICAgIC8vIElmIHRoZSBwaGkgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQsIGNvbnRpbnVlLgogICAgICBpZiAoIXBoaS5pc0luQmFzaWNCbG9jaygpKSBjb250aW51ZTsKCiAgICAgIC8vIEZpbmQgaWYgdGhlIGlucHV0cyBvZiB0aGUgcGhpIGFyZSB0aGUgc2FtZSBpbnN0cnVjdGlvbi4KICAgICAgLy8gVGhlIGJ1aWxkZXIgZW5zdXJlcyB0aGF0IHBoaS5pbnB1dHNbMF0gY2Fubm90IGJlIHRoZSBwaGkKICAgICAgLy8gaXRzZWxmLgogICAgICBhc3NlcnQoIWlkZW50aWNhbChwaGkuaW5wdXRzWzBdLCBwaGkpKTsKICAgICAgSEluc3RydWN0aW9uIGNhbmRpZGF0ZSA9IHBoaS5pbnB1dHNbMF07CiAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcGhpLmlucHV0cy5sZW5ndGg7IGkrKykgewogICAgICAgIEhJbnN0cnVjdGlvbiBpbnB1dCA9IHBoaS5pbnB1dHNbaV07CiAgICAgICAgLy8gSWYgdGhlIGlucHV0IGlzIHRoZSBwaGksIHRoZSBwaGkgaXMgc3RpbGwgY2FuZGlkYXRlIGZvcgogICAgICAgIC8vIGVsaW1pbmF0aW9uLgogICAgICAgIGlmICghaWRlbnRpY2FsKGlucHV0LCBjYW5kaWRhdGUpICYmICFpZGVudGljYWwoaW5wdXQsIHBoaSkpIHsKICAgICAgICAgIGNhbmRpZGF0ZSA9IG51bGw7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIElmIHRoZSBpbnB1dHMgYXJlIG5vdCB0aGUgc2FtZSwgY29udGludWUuCiAgICAgIGlmIChjYW5kaWRhdGUgPT0gbnVsbCkgY29udGludWU7CgogICAgICAvLyBCZWNhdXNlIHdlJ3JlIHVwZGF0aW5nIHRoZSB1c2VycyBvZiB0aGlzIHBoaSwgd2UgbWF5IGhhdmUgbmV3CiAgICAgIC8vIHBoaXMgY2FuZGlkYXRlIGZvciBlbGltaW5hdGlvbi4gQWRkIHBoaXMgdGhhdCB1c2VkIHRoaXMgcGhpCiAgICAgIC8vIHRvIHRoZSB3b3JrbGlzdC4KICAgICAgZm9yIChmaW5hbCB1c2VyIGluIHBoaS51c2VkQnkpIHsKICAgICAgICBpZiAodXNlciBpcyBIUGhpKSB3b3JrbGlzdC5hZGQodXNlcik7CiAgICAgIH0KICAgICAgcGhpLmJsb2NrLnJld3JpdGUocGhpLCBjYW5kaWRhdGUpOwogICAgICBwaGkuYmxvY2sucmVtb3ZlUGhpKHBoaSk7CiAgICAgIGlmIChjYW5kaWRhdGUuc291cmNlRWxlbWVudCA9PSBudWxsICYmCiAgICAgICAgICBwaGkuc291cmNlRWxlbWVudCAhPSBudWxsICYmCiAgICAgICAgICBjYW5kaWRhdGUgaXMhIEhUaGlzKSB7CiAgICAgICAgY2FuZGlkYXRlLnNvdXJjZUVsZW1lbnQgPSBwaGkuc291cmNlRWxlbWVudDsKICAgICAgfQogICAgfQogIH0KfQoKY2xhc3MgR3ZuV29ya0l0ZW0gewogIGZpbmFsIEhCYXNpY0Jsb2NrIGJsb2NrOwogIGZpbmFsIFZhbHVlU2V0IHZhbHVlU2V0OwogIEd2bldvcmtJdGVtKHRoaXMuYmxvY2ssIHRoaXMudmFsdWVTZXQpOwp9CgpjbGFzcyBTc2FHbG9iYWxWYWx1ZU51bWJlcmVyIGltcGxlbWVudHMgT3B0aW1pemF0aW9uUGhhc2UgewogIGZpbmFsIEFic3RyYWN0VmFsdWVEb21haW4gX2Fic3RyYWN0VmFsdWVEb21haW47CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAiU3NhR2xvYmFsVmFsdWVOdW1iZXJlciI7CiAgZmluYWwgU2V0PGludD4gdmlzaXRlZDsKCiAgTGlzdDxpbnQ+IGJsb2NrQ2hhbmdlc0ZsYWdzOwogIExpc3Q8aW50PiBsb29wQ2hhbmdlc0ZsYWdzOwoKICBTc2FHbG9iYWxWYWx1ZU51bWJlcmVyKHRoaXMuX2Fic3RyYWN0VmFsdWVEb21haW4pIDogdmlzaXRlZCA9IG5ldyBTZXQ8aW50PigpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0R3JhcGgoSEdyYXBoIGdyYXBoKSB7CiAgICBjb21wdXRlQ2hhbmdlc0ZsYWdzKGdyYXBoKTsKICAgIG1vdmVMb29wSW52YXJpYW50Q29kZShncmFwaCk7CiAgICBMaXN0PEd2bldvcmtJdGVtPiB3b3JrUXVldWUgPSA8R3ZuV29ya0l0ZW0+WwogICAgICBuZXcgR3ZuV29ya0l0ZW0oZ3JhcGguZW50cnksIG5ldyBWYWx1ZVNldCgpKQogICAgXTsKICAgIGRvIHsKICAgICAgR3ZuV29ya0l0ZW0gaXRlbSA9IHdvcmtRdWV1ZS5yZW1vdmVMYXN0KCk7CiAgICAgIHZpc2l0QmFzaWNCbG9jayhpdGVtLmJsb2NrLCBpdGVtLnZhbHVlU2V0LCB3b3JrUXVldWUpOwogICAgfSB3aGlsZSAoIXdvcmtRdWV1ZS5pc0VtcHR5KTsKICB9CgogIHZvaWQgbW92ZUxvb3BJbnZhcmlhbnRDb2RlKEhHcmFwaCBncmFwaCkgewogICAgZm9yIChpbnQgaSA9IGdyYXBoLmJsb2Nrcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICBIQmFzaWNCbG9jayBibG9jayA9IGdyYXBoLmJsb2Nrc1tpXTsKICAgICAgaWYgKGJsb2NrLmlzTG9vcEhlYWRlcigpKSB7CiAgICAgICAgaW50IGNoYW5nZXNGbGFncyA9IGxvb3BDaGFuZ2VzRmxhZ3NbYmxvY2suaWRdOwogICAgICAgIEhMb29wSW5mb3JtYXRpb24gaW5mbyA9IGJsb2NrLmxvb3BJbmZvcm1hdGlvbjsKICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIGJsb2NrcyBvZiB0aGlzIGxvb3AuIE5vdGUgdGhhdCBibG9ja3MgaW4KICAgICAgICAvLyBpbm5lciBsb29wcyBhcmUgbm90IHZpc2l0ZWQgaGVyZSwgYnV0IHdlIGtub3cgdGhleQogICAgICAgIC8vIHdlcmUgdmlzaXRlZCBiZWZvcmUgYmVjYXVzZSB3ZSBhcmUgaXRlcmF0aW5nIGluIHBvc3Qtb3JkZXIuCiAgICAgICAgLy8gU28gaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIEdWTidlZCBpbiBhbiBpbm5lciBsb29wIGFyZSBpbiB0aGVpcgogICAgICAgIC8vIGxvb3AgZW50cnksIGFuZCBbaW5mby5ibG9ja3NdIGNvbnRhaW5zIHRoaXMgbG9vcCBlbnRyeS4KICAgICAgICBtb3ZlTG9vcEludmFyaWFudENvZGVGcm9tQmxvY2soYmxvY2ssIGJsb2NrLCBjaGFuZ2VzRmxhZ3MpOwogICAgICAgIGZvciAoSEJhc2ljQmxvY2sgb3RoZXIgaW4gaW5mby5ibG9ja3MpIHsKICAgICAgICAgIG1vdmVMb29wSW52YXJpYW50Q29kZUZyb21CbG9jayhvdGhlciwgYmxvY2ssIGNoYW5nZXNGbGFncyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIG1vdmVMb29wSW52YXJpYW50Q29kZUZyb21CbG9jaygKICAgICAgSEJhc2ljQmxvY2sgYmxvY2ssIEhCYXNpY0Jsb2NrIGxvb3BIZWFkZXIsIGludCBjaGFuZ2VzRmxhZ3MpIHsKICAgIGFzc2VydChibG9jay5wYXJlbnRMb29wSGVhZGVyID09IGxvb3BIZWFkZXIgfHwgYmxvY2sgPT0gbG9vcEhlYWRlcik7CiAgICBIQmFzaWNCbG9jayBwcmVoZWFkZXIgPSBsb29wSGVhZGVyLnByZWRlY2Vzc29yc1swXTsKICAgIGludCBkZXBlbmRzRmxhZ3MgPSBTaWRlRWZmZWN0cy5jb21wdXRlRGVwZW5kc09uRmxhZ3MoY2hhbmdlc0ZsYWdzKTsKICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IGJsb2NrLmZpcnN0OwogICAgYm9vbCBpc0xvb3BBbHdheXNUYWtlbigpIHsKICAgICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gbG9vcEhlYWRlci5sYXN0OwogICAgICBhc3NlcnQoaW5zdHJ1Y3Rpb24gaXMgSEdvdG8gfHwgaW5zdHJ1Y3Rpb24gaXMgSExvb3BCcmFuY2gpOwogICAgICByZXR1cm4gaW5zdHJ1Y3Rpb24gaXMgSEdvdG8gfHwgaW5zdHJ1Y3Rpb24uaW5wdXRzWzBdLmlzQ29uc3RhbnRUcnVlKCk7CiAgICB9CgogICAgYm9vbCBmaXJzdEluc3RydWN0aW9uSW5Mb29wID0gYmxvY2sgPT0gbG9vcEhlYWRlcgogICAgICAgIC8vIENvbXBlbnNhdGUgZm9yIGxhY2sgb2YgY29kZSBtb3Rpb24uCiAgICAgICAgfHwKICAgICAgICAoYmxvY2tDaGFuZ2VzRmxhZ3NbbG9vcEhlYWRlci5pZF0gPT0gMCAmJgogICAgICAgICAgICBpc0xvb3BBbHdheXNUYWtlbigpICYmCiAgICAgICAgICAgIGxvb3BIZWFkZXIuc3VjY2Vzc29yc1swXSA9PSBibG9jayk7CiAgICB3aGlsZSAoaW5zdHJ1Y3Rpb24gIT0gbnVsbCkgewogICAgICBISW5zdHJ1Y3Rpb24gbmV4dCA9IGluc3RydWN0aW9uLm5leHQ7CiAgICAgIGlmIChpbnN0cnVjdGlvbi51c2VHdm4oKSAmJgogICAgICAgICAgaW5zdHJ1Y3Rpb24uaXNNb3ZhYmxlICYmCiAgICAgICAgICAoIWluc3RydWN0aW9uLmNhblRocm93KF9hYnN0cmFjdFZhbHVlRG9tYWluKSB8fAogICAgICAgICAgICAgIGZpcnN0SW5zdHJ1Y3Rpb25Jbkxvb3ApICYmCiAgICAgICAgICAhaW5zdHJ1Y3Rpb24uc2lkZUVmZmVjdHMuZGVwZW5kc09uKGRlcGVuZHNGbGFncykpIHsKICAgICAgICBib29sIGxvb3BJbnZhcmlhbnRJbnB1dHMgPSB0cnVlOwogICAgICAgIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMgPSBpbnN0cnVjdGlvbi5pbnB1dHM7CiAgICAgICAgZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGlucHV0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKGlzSW5wdXREZWZpbmVkQWZ0ZXJEb21pbmF0b3IoaW5wdXRzW2ldLCBwcmVoZWFkZXIpKSB7CiAgICAgICAgICAgIGxvb3BJbnZhcmlhbnRJbnB1dHMgPSBmYWxzZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBJZiB0aGUgaW5wdXRzIGFyZSBsb29wIGludmFyaWFudCwgd2UgY2FuIG1vdmUgdGhlCiAgICAgICAgLy8gaW5zdHJ1Y3Rpb24gZnJvbSB0aGUgY3VycmVudCBibG9jayB0byB0aGUgcHJlLWhlYWRlciBibG9jay4KICAgICAgICBpZiAobG9vcEludmFyaWFudElucHV0cykgewogICAgICAgICAgYmxvY2suZGV0YWNoKGluc3RydWN0aW9uKTsKICAgICAgICAgIHByZWhlYWRlci5tb3ZlQXRFeGl0KGluc3RydWN0aW9uKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZmlyc3RJbnN0cnVjdGlvbkluTG9vcCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICBpbnQgb2xkQ2hhbmdlc0ZsYWdzID0gY2hhbmdlc0ZsYWdzOwogICAgICBjaGFuZ2VzRmxhZ3MgfD0gaW5zdHJ1Y3Rpb24uc2lkZUVmZmVjdHMuZ2V0Q2hhbmdlc0ZsYWdzKCk7CiAgICAgIGlmIChvbGRDaGFuZ2VzRmxhZ3MgIT0gY2hhbmdlc0ZsYWdzKSB7CiAgICAgICAgZGVwZW5kc0ZsYWdzID0gU2lkZUVmZmVjdHMuY29tcHV0ZURlcGVuZHNPbkZsYWdzKGNoYW5nZXNGbGFncyk7CiAgICAgIH0KICAgICAgaW5zdHJ1Y3Rpb24gPSBuZXh0OwogICAgfQogIH0KCiAgYm9vbCBpc0lucHV0RGVmaW5lZEFmdGVyRG9taW5hdG9yKEhJbnN0cnVjdGlvbiBpbnB1dCwgSEJhc2ljQmxvY2sgZG9taW5hdG9yKSB7CiAgICByZXR1cm4gaW5wdXQuYmxvY2suaWQgPiBkb21pbmF0b3IuaWQ7CiAgfQoKICB2b2lkIHZpc2l0QmFzaWNCbG9jaygKICAgICAgSEJhc2ljQmxvY2sgYmxvY2ssIFZhbHVlU2V0IHZhbHVlcywgTGlzdDxHdm5Xb3JrSXRlbT4gd29ya1F1ZXVlKSB7CiAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSBibG9jay5maXJzdDsKICAgIGlmIChibG9jay5pc0xvb3BIZWFkZXIoKSkgewogICAgICBpbnQgZmxhZ3MgPSBsb29wQ2hhbmdlc0ZsYWdzW2Jsb2NrLmlkXTsKICAgICAgdmFsdWVzLmtpbGwoZmxhZ3MpOwogICAgfQogICAgd2hpbGUgKGluc3RydWN0aW9uICE9IG51bGwpIHsKICAgICAgSEluc3RydWN0aW9uIG5leHQgPSBpbnN0cnVjdGlvbi5uZXh0OwogICAgICBpbnQgZmxhZ3MgPSBpbnN0cnVjdGlvbi5zaWRlRWZmZWN0cy5nZXRDaGFuZ2VzRmxhZ3MoKTsKICAgICAgYXNzZXJ0KGZsYWdzID09IDAgfHwgIWluc3RydWN0aW9uLnVzZUd2bigpKTsKICAgICAgdmFsdWVzLmtpbGwoZmxhZ3MpOwogICAgICBpZiAoaW5zdHJ1Y3Rpb24udXNlR3ZuKCkpIHsKICAgICAgICBISW5zdHJ1Y3Rpb24gb3RoZXIgPSB2YWx1ZXMubG9va3VwKGluc3RydWN0aW9uKTsKICAgICAgICBpZiAob3RoZXIgIT0gbnVsbCkgewogICAgICAgICAgYXNzZXJ0KG90aGVyLmd2bkVxdWFscyhpbnN0cnVjdGlvbikgJiYgaW5zdHJ1Y3Rpb24uZ3ZuRXF1YWxzKG90aGVyKSk7CiAgICAgICAgICBibG9jay5yZXdyaXRlV2l0aEJldHRlclVzZXIoaW5zdHJ1Y3Rpb24sIG90aGVyKTsKICAgICAgICAgIGJsb2NrLnJlbW92ZShpbnN0cnVjdGlvbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhbHVlcy5hZGQoaW5zdHJ1Y3Rpb24pOwogICAgICAgIH0KICAgICAgfQogICAgICBpbnN0cnVjdGlvbiA9IG5leHQ7CiAgICB9CgogICAgTGlzdDxIQmFzaWNCbG9jaz4gZG9taW5hdGVkQmxvY2tzID0gYmxvY2suZG9taW5hdGVkQmxvY2tzOwogICAgZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGRvbWluYXRlZEJsb2Nrcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBIQmFzaWNCbG9jayBkb21pbmF0ZWQgPSBkb21pbmF0ZWRCbG9ja3NbaV07CiAgICAgIC8vIE5vIG5lZWQgdG8gY29weSB0aGUgdmFsdWUgc2V0IGZvciB0aGUgbGFzdCBjaGlsZC4KICAgICAgVmFsdWVTZXQgc3VjY2Vzc29yVmFsdWVzID0gKGkgPT0gbGVuZ3RoIC0gMSkgPyB2YWx1ZXMgOiB2YWx1ZXMuY29weSgpOwogICAgICAvLyBJZiB3ZSBoYXZlIG5vIHZhbHVlcyBpbiBvdXIgc2V0LCB3ZSBkbyBub3QgaGF2ZSB0byBraWxsCiAgICAgIC8vIGFueXRoaW5nLiBBbHNvLCBpZiB0aGUgcmFuZ2Ugb2YgYmxvY2sgaWRzIGZyb20gdGhlIGN1cnJlbnQKICAgICAgLy8gYmxvY2sgdG8gdGhlIGRvbWluYXRlZCBibG9jayBpcyBlbXB0eSwgdGhlcmUgaXMgbm8gYmxvY2tzIG9uCiAgICAgIC8vIGFueSBwYXRoIGZyb20gdGhlIGN1cnJlbnQgYmxvY2sgdG8gdGhlIGRvbWluYXRlZCBibG9jayBzbyB3ZQogICAgICAvLyBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGVpdGhlci4KICAgICAgYXNzZXJ0KGJsb2NrLmlkIDwgZG9taW5hdGVkLmlkKTsKICAgICAgaWYgKCFzdWNjZXNzb3JWYWx1ZXMuaXNFbXB0eSAmJiBibG9jay5pZCArIDEgPCBkb21pbmF0ZWQuaWQpIHsKICAgICAgICB2aXNpdGVkLmNsZWFyKCk7CiAgICAgICAgTGlzdDxIQmFzaWNCbG9jaz4gd29ya1F1ZXVlID0gPEhCYXNpY0Jsb2NrPltkb21pbmF0ZWRdOwogICAgICAgIGludCBjaGFuZ2VzRmxhZ3MgPSAwOwogICAgICAgIGRvIHsKICAgICAgICAgIEhCYXNpY0Jsb2NrIGN1cnJlbnQgPSB3b3JrUXVldWUucmVtb3ZlTGFzdCgpOwogICAgICAgICAgY2hhbmdlc0ZsYWdzIHw9CiAgICAgICAgICAgICAgZ2V0Q2hhbmdlc0ZsYWdzRm9yRG9taW5hdGVkQmxvY2soYmxvY2ssIGN1cnJlbnQsIHdvcmtRdWV1ZSk7CiAgICAgICAgfSB3aGlsZSAoIXdvcmtRdWV1ZS5pc0VtcHR5KTsKICAgICAgICBzdWNjZXNzb3JWYWx1ZXMua2lsbChjaGFuZ2VzRmxhZ3MpOwogICAgICB9CiAgICAgIHdvcmtRdWV1ZS5hZGQobmV3IEd2bldvcmtJdGVtKGRvbWluYXRlZCwgc3VjY2Vzc29yVmFsdWVzKSk7CiAgICB9CiAgfQoKICB2b2lkIGNvbXB1dGVDaGFuZ2VzRmxhZ3MoSEdyYXBoIGdyYXBoKSB7CiAgICAvLyBDcmVhdGUgdGhlIGNoYW5nZXMgZmxhZ3MgbGlzdHMuIE1ha2Ugc3VyZSB0byBpbml0aWFsaXplIHRoZQogICAgLy8gbG9vcCBjaGFuZ2VzIGZsYWdzIGxpc3QgdG8gemVybyBzbyB3ZSBjYW4gdXNlIGJpdHdpc2Ugb3Igd2hlbgogICAgLy8gcHJvcGFnYXRpbmcgbG9vcCBjaGFuZ2VzIHVwd2FyZHMuCiAgICBmaW5hbCBpbnQgbGVuZ3RoID0gZ3JhcGguYmxvY2tzLmxlbmd0aDsKICAgIGJsb2NrQ2hhbmdlc0ZsYWdzID0gbmV3IExpc3Q8aW50PihsZW5ndGgpOwogICAgbG9vcENoYW5nZXNGbGFncyA9IG5ldyBMaXN0PGludD4obGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIGxvb3BDaGFuZ2VzRmxhZ3NbaV0gPSAwOwoKICAgIC8vIFJ1biB0aHJvdWdoIGFsbCB0aGUgYmFzaWMgYmxvY2tzIGluIHRoZSBncmFwaCBhbmQgZmlsbCBpbiB0aGUKICAgIC8vIGNoYW5nZXMgZmxhZ3MgbGlzdHMuCiAgICBmb3IgKGludCBpID0gbGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgZmluYWwgSEJhc2ljQmxvY2sgYmxvY2sgPSBncmFwaC5ibG9ja3NbaV07CiAgICAgIGZpbmFsIGludCBpZCA9IGJsb2NrLmlkOwoKICAgICAgLy8gQ29tcHV0ZSBibG9jayBjaGFuZ2VzIGZsYWdzIGZvciB0aGUgYmxvY2suCiAgICAgIGludCBjaGFuZ2VzRmxhZ3MgPSAwOwogICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSBibG9jay5maXJzdDsKICAgICAgd2hpbGUgKGluc3RydWN0aW9uICE9IG51bGwpIHsKICAgICAgICBjaGFuZ2VzRmxhZ3MgfD0gaW5zdHJ1Y3Rpb24uc2lkZUVmZmVjdHMuZ2V0Q2hhbmdlc0ZsYWdzKCk7CiAgICAgICAgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbi5uZXh0OwogICAgICB9CiAgICAgIGFzc2VydChibG9ja0NoYW5nZXNGbGFnc1tpZF0gPT0gbnVsbCk7CiAgICAgIGJsb2NrQ2hhbmdlc0ZsYWdzW2lkXSA9IGNoYW5nZXNGbGFnczsKCiAgICAgIC8vIExvb3AgaGVhZGVycyBhcmUgcGFydCBvZiB0aGVpciBsb29wLCBzbyB1cGRhdGUgdGhlIGxvb3AKICAgICAgLy8gY2hhbmdlcyBmbGFncyBhY2NvcmRpbmdseS4KICAgICAgaWYgKGJsb2NrLmlzTG9vcEhlYWRlcigpKSB7CiAgICAgICAgbG9vcENoYW5nZXNGbGFnc1tpZF0gfD0gY2hhbmdlc0ZsYWdzOwogICAgICB9CgogICAgICAvLyBQcm9wYWdhdGUgbG9vcCBjaGFuZ2VzIGZsYWdzIHVwd2FyZHMuCiAgICAgIEhCYXNpY0Jsb2NrIHBhcmVudExvb3BIZWFkZXIgPSBibG9jay5wYXJlbnRMb29wSGVhZGVyOwogICAgICBpZiAocGFyZW50TG9vcEhlYWRlciAhPSBudWxsKSB7CiAgICAgICAgbG9vcENoYW5nZXNGbGFnc1twYXJlbnRMb29wSGVhZGVyLmlkXSB8PQogICAgICAgICAgICAoYmxvY2suaXNMb29wSGVhZGVyKCkpID8gbG9vcENoYW5nZXNGbGFnc1tpZF0gOiBjaGFuZ2VzRmxhZ3M7CiAgICAgIH0KICAgIH0KICB9CgogIGludCBnZXRDaGFuZ2VzRmxhZ3NGb3JEb21pbmF0ZWRCbG9jayhIQmFzaWNCbG9jayBkb21pbmF0b3IsCiAgICAgIEhCYXNpY0Jsb2NrIGRvbWluYXRlZCwgTGlzdDxIQmFzaWNCbG9jaz4gd29ya1F1ZXVlKSB7CiAgICBpbnQgY2hhbmdlc0ZsYWdzID0gMDsKICAgIExpc3Q8SEJhc2ljQmxvY2s+IHByZWRlY2Vzc29ycyA9IGRvbWluYXRlZC5wcmVkZWNlc3NvcnM7CiAgICBmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcHJlZGVjZXNzb3JzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIEhCYXNpY0Jsb2NrIGJsb2NrID0gcHJlZGVjZXNzb3JzW2ldOwogICAgICBpbnQgaWQgPSBibG9jay5pZDsKICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgcHJlZGVjZXNzb3IgYmxvY2sgaXMgb24gdGhlIHBhdGggZnJvbSB0aGUKICAgICAgLy8gZG9taW5hdG9yIHRvIHRoZSBkb21pbmF0ZWQsIGl0IG11c3QgaGF2ZSBhbiBpZCB0aGF0IGlzIGluIHRoZQogICAgICAvLyByYW5nZSBmcm9tIHRoZSBkb21pbmF0b3IgdG8gdGhlIGRvbWluYXRlZC4KICAgICAgaWYgKGRvbWluYXRvci5pZCA8IGlkICYmIGlkIDwgZG9taW5hdGVkLmlkICYmICF2aXNpdGVkLmNvbnRhaW5zKGlkKSkgewogICAgICAgIHZpc2l0ZWQuYWRkKGlkKTsKICAgICAgICBjaGFuZ2VzRmxhZ3MgfD0gYmxvY2tDaGFuZ2VzRmxhZ3NbaWRdOwogICAgICAgIC8vIExvb3AgYm9kaWVzIG1pZ2h0IG5vdCBiZSBvbiB0aGUgcGF0aCBmcm9tIGRvbWluYXRvciB0byBkb21pbmF0ZWQsCiAgICAgICAgLy8gYnV0IHRoZXkgY2FuIGludmFsaWRhdGUgdmFsdWVzLgogICAgICAgIGNoYW5nZXNGbGFncyB8PSBsb29wQ2hhbmdlc0ZsYWdzW2lkXTsKICAgICAgICB3b3JrUXVldWUuYWRkKGJsb2NrKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNoYW5nZXNGbGFnczsKICB9Cn0KCi8vIFRoaXMgcGhhc2UgbWVyZ2VzIGVxdWl2YWxlbnQgaW5zdHJ1Y3Rpb25zIG9uIGRpZmZlcmVudCBwYXRocyBpbnRvCi8vIG9uZSBpbnN0cnVjdGlvbiBpbiBhIGRvbWluYXRvciBibG9jay4gSXQgcnVucyB0aHJvdWdoIHRoZSBncmFwaAovLyBwb3N0IGRvbWluYXRvciBvcmRlciBhbmQgY29tcHV0ZXMgYSBWYWx1ZVNldCBmb3IgZWFjaCBibG9jayBvZgovLyBpbnN0cnVjdGlvbnMgdGhhdCBjYW4gYmUgbW92ZWQgdG8gYSBkb21pbmF0b3IgYmxvY2suIFRoZXNlCi8vIGluc3RydWN0aW9ucyBhcmUgdGhlIG9uZXMgdGhhdDoKLy8gMSkgY2FuIGJlIHVzZWQgZm9yIEdWTiwgYW5kCi8vIDIpIGRvIG5vdCB1c2UgZGVmaW5pdGlvbnMgb2YgdGhlaXIgb3duIGJsb2NrLgovLwovLyBBIGJhc2ljIGJsb2NrIGxvb2tzIGF0IGl0cyBzdWNlc3NvcnMgYW5kIGZpbmRzIHRoZSBpbnRlcnNlY3Rpb24gb2YKLy8gdGhlc2UgY29tcHV0ZWQgVmFsdWVTZXQuIEl0IG1vdmVzIGFsbCBpbnN0cnVjdGlvbnMgb2YgdGhlCi8vIGludGVyc2VjdGlvbiBpbnRvIGl0cyBvd24gbGlzdCBvZiBpbnN0cnVjdGlvbnMuCmNsYXNzIFNzYUNvZGVNb3Rpb24gZXh0ZW5kcyBIQmFzZVZpc2l0b3IgaW1wbGVtZW50cyBPcHRpbWl6YXRpb25QaGFzZSB7CiAgZmluYWwgQWJzdHJhY3RWYWx1ZURvbWFpbiBfYWJzdHJhY3RWYWx1ZURvbWFpbjsKCiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAiU3NhQ29kZU1vdGlvbiI7CgogIGJvb2wgbW92ZWRDb2RlID0gZmFsc2U7CiAgTGlzdDxWYWx1ZVNldD4gdmFsdWVzOwoKICBTc2FDb2RlTW90aW9uKHRoaXMuX2Fic3RyYWN0VmFsdWVEb21haW4pOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0R3JhcGgoSEdyYXBoIGdyYXBoKSB7CiAgICB2YWx1ZXMgPSBuZXcgTGlzdDxWYWx1ZVNldD4oZ3JhcGguYmxvY2tzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyYXBoLmJsb2Nrcy5sZW5ndGg7IGkrKykgewogICAgICB2YWx1ZXNbZ3JhcGguYmxvY2tzW2ldLmlkXSA9IG5ldyBWYWx1ZVNldCgpOwogICAgfQogICAgdmlzaXRQb3N0RG9taW5hdG9yVHJlZShncmFwaCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QmFzaWNCbG9jayhIQmFzaWNCbG9jayBibG9jaykgewogICAgTGlzdDxIQmFzaWNCbG9jaz4gc3VjY2Vzc29ycyA9IGJsb2NrLnN1Y2Nlc3NvcnM7CgogICAgLy8gUGhhc2UgMTogZ2V0IHRoZSBWYWx1ZVNldCBvZiBhbGwgc3VjY2Vzc29ycyAoaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUpLAogICAgLy8gY29tcHV0ZSB0aGUgaW50ZXJzZWN0aW9uIGFuZCBtb3ZlIHRoZSBpbnN0cnVjdGlvbnMgb2YgdGhlIGludGVyc2VjdGlvbgogICAgLy8gaW50byB0aGlzIGJsb2NrLgogICAgaWYgKHN1Y2Nlc3NvcnMubGVuZ3RoID4gMSkgewogICAgICBWYWx1ZVNldCBpbnN0cnVjdGlvbnMgPSB2YWx1ZXNbc3VjY2Vzc29yc1swXS5pZF07CiAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc3VjY2Vzc29ycy5sZW5ndGg7IGkrKykgewogICAgICAgIFZhbHVlU2V0IG90aGVyID0gdmFsdWVzW3N1Y2Nlc3NvcnNbaV0uaWRdOwogICAgICAgIGluc3RydWN0aW9ucyA9IGluc3RydWN0aW9ucy5pbnRlcnNlY3Rpb24ob3RoZXIpOwogICAgICB9CgogICAgICBpZiAoIWluc3RydWN0aW9ucy5pc0VtcHR5KSB7CiAgICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGxpc3QgPSBpbnN0cnVjdGlvbnMudG9MaXN0KCk7CiAgICAgICAgLy8gU29ydCBieSBpbnN0cnVjdGlvbiAnaWQnIGZvciBtb3JlIHN0YWJsZSBvcmRlcmluZyB1bmRlciBjaGFuZ2VzIHRvCiAgICAgICAgLy8gdW5yZWxhdGVkIHNvdXJjZSBjb2RlLiAnaWQnIGlzIGEgZnVuY3Rpb24gb2YgdGhlIG9wZXJhdGlvbnMgb2YKICAgICAgICAvLyBjb21waWxpbmcgdGhlIGN1cnJlbnQgbWV0aG9kLCB3aGVyZWFzIHRoZSBWYWx1ZVNldCBvcmRlciBpcyBkZXBlbmRlbnQKICAgICAgICAvLyBoYXNoQ29kZXMgdGhhdCBhcmUgYSBmdW5jdGlvbiBvZiB0aGUgd2hvbGUgcHJvZ3JhbS4KICAgICAgICBsaXN0LnNvcnQoKGluc24xLCBpbnNuMikgPT4gaW5zbjEuaWQuY29tcGFyZVRvKGluc24yLmlkKSk7CiAgICAgICAgZm9yIChISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gaW4gbGlzdCkgewogICAgICAgICAgLy8gTW92ZSB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIGN1cnJlbnQgYmxvY2suCiAgICAgICAgICBpbnN0cnVjdGlvbi5ibG9jay5kZXRhY2goaW5zdHJ1Y3Rpb24pOwogICAgICAgICAgYmxvY2subW92ZUF0RXhpdChpbnN0cnVjdGlvbik7CiAgICAgICAgICAvLyBHbyB0aHJvdWdoIGFsbCBzdWNjZXNzb3JzIGFuZCByZXdyaXRlIHRoZWlyIGluc3RydWN0aW9uCiAgICAgICAgICAvLyB0byB0aGUgc2hhcmVkIG9uZS4KICAgICAgICAgIGZvciAoZmluYWwgc3VjY2Vzc29yIGluIHN1Y2Nlc3NvcnMpIHsKICAgICAgICAgICAgSEluc3RydWN0aW9uIHRvUmV3cml0ZSA9IHZhbHVlc1tzdWNjZXNzb3IuaWRdLmxvb2t1cChpbnN0cnVjdGlvbik7CiAgICAgICAgICAgIGlmICh0b1Jld3JpdGUgIT0gaW5zdHJ1Y3Rpb24pIHsKICAgICAgICAgICAgICBzdWNjZXNzb3IucmV3cml0ZVdpdGhCZXR0ZXJVc2VyKHRvUmV3cml0ZSwgaW5zdHJ1Y3Rpb24pOwogICAgICAgICAgICAgIHN1Y2Nlc3Nvci5yZW1vdmUodG9SZXdyaXRlKTsKICAgICAgICAgICAgICBtb3ZlZENvZGUgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIFRPRE8oc3JhKTogVGhlcmUgYXJlIHNvbWUgbm9uLWd2bi1hYmxlIGluc3RydWN0aW9ucyB0aGF0IHdlIGNvdWxkIG1vdmUsCiAgICAgIC8vIGUuZy4gYWxsb2NhdGlvbnMuIFdlIHNob3VsZCBwcm9iYWJseSBub3QgbW92ZSBpbnN0cnVjdGlvbnMgdGhhdCBjYW4KICAgICAgLy8gZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdyBzaW5jZSB0aGUgcmVwb3J0ZWQgbG9jYXRpb24gbWlnaHQgYmUgaW4KICAgICAgLy8gdGhlICd3cm9uZycgYnJhbmNoLgogICAgfQoKICAgIC8vIERvbid0IHRyeSB0byBtZXJnZSBpbnN0cnVjdGlvbnMgdG8gYSBkb21pbmF0b3IgaWYgd2UgaGF2ZQogICAgLy8gbXVsdGlwbGUgcHJlZGVjZXNzb3JzLgogICAgaWYgKGJsb2NrLnByZWRlY2Vzc29ycy5sZW5ndGggIT0gMSkgcmV0dXJuOwoKICAgIC8vIFBoYXNlIDI6IEdvIHRocm91Z2ggYWxsIGluc3RydWN0aW9ucyBvZiB0aGlzIGJsb2NrIGFuZCBmaW5kCiAgICAvLyB3aGljaCBpbnN0cnVjdGlvbnMgY2FuIGJlIG1vdmVkIHRvIGEgZG9taW5hdG9yIGJsb2NrLgogICAgVmFsdWVTZXQgc2V0XyA9IHZhbHVlc1tibG9jay5pZF07CiAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSBibG9jay5maXJzdDsKICAgIGludCBmbGFncyA9IDA7CiAgICB3aGlsZSAoaW5zdHJ1Y3Rpb24gIT0gbnVsbCkgewogICAgICBpbnQgZGVwZW5kc0ZsYWdzID0gU2lkZUVmZmVjdHMuY29tcHV0ZURlcGVuZHNPbkZsYWdzKGZsYWdzKTsKICAgICAgZmxhZ3MgfD0gaW5zdHJ1Y3Rpb24uc2lkZUVmZmVjdHMuZ2V0Q2hhbmdlc0ZsYWdzKCk7CgogICAgICBISW5zdHJ1Y3Rpb24gY3VycmVudCA9IGluc3RydWN0aW9uOwogICAgICBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uLm5leHQ7CiAgICAgIGlmICghY3VycmVudC51c2VHdm4oKSB8fCAhY3VycmVudC5pc01vdmFibGUpIGNvbnRpbnVlOwogICAgICAvLyBUT0RPKHNyYSk6IFdlIGNvdWxkIG1vdmUgdGhyb3dpbmcgaW5zdHJ1Y3Rpb25zIHByb3ZpZGVkIHdlIGtlZXAgdGhlCiAgICAgIC8vIGV4Y2VwdGlvbnMgaW4gdGhlIHNhbWUgb3JkZXIuICBUaGlzIHJlcXVpcmVzIHRoZXkgYXJlIGluIHRoZSBzYW1lIG9yZGVyCiAgICAgIC8vIGluIGFsbCBzdWNjZXNzb3JzLCB3aGljaCBpcyBub3QgdHJhY2tlZCBieSB0aGUgVmFsdWVTZXQuCiAgICAgIGlmIChjdXJyZW50LmNhblRocm93KF9hYnN0cmFjdFZhbHVlRG9tYWluKSkgY29udGludWU7CiAgICAgIGlmIChjdXJyZW50LnNpZGVFZmZlY3RzLmRlcGVuZHNPbihkZXBlbmRzRmxhZ3MpKSBjb250aW51ZTsKCiAgICAgIGJvb2wgY2FuQmVNb3ZlZCA9IHRydWU7CiAgICAgIGZvciAoZmluYWwgSEluc3RydWN0aW9uIGlucHV0IGluIGN1cnJlbnQuaW5wdXRzKSB7CiAgICAgICAgaWYgKGlucHV0LmJsb2NrID09IGJsb2NrKSB7CiAgICAgICAgICBjYW5CZU1vdmVkID0gZmFsc2U7CiAgICAgICAgICBicmVhazsKICAgICAgICAgIC8vIFRPRE8oc3JhKTogV2UgY291bGQgbW92ZSB0cmVlcyBvZiBpbnN0cnVjdGlvbnMgcHJvdmlkZWQgd2UgbW92ZSB0aGUKICAgICAgICAgIC8vIHJvb3RzIGJlZm9yZSB0aGUgbGVhdmVzLgogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIWNhbkJlTW92ZWQpIGNvbnRpbnVlOwoKICAgICAgSEluc3RydWN0aW9uIGV4aXN0aW5nID0gc2V0Xy5sb29rdXAoY3VycmVudCk7CiAgICAgIGlmIChleGlzdGluZyA9PSBudWxsKSB7CiAgICAgICAgc2V0Xy5hZGQoY3VycmVudCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYmxvY2sucmV3cml0ZVdpdGhCZXR0ZXJVc2VyKGN1cnJlbnQsIGV4aXN0aW5nKTsKICAgICAgICBibG9jay5yZW1vdmUoY3VycmVudCk7CiAgICAgICAgbW92ZWRDb2RlID0gdHJ1ZTsKICAgICAgfQogICAgfQogIH0KfQoKY2xhc3MgU3NhVHlwZUNvbnZlcnNpb25JbnNlcnRlciBleHRlbmRzIEhCYXNlVmlzaXRvcgogICAgaW1wbGVtZW50cyBPcHRpbWl6YXRpb25QaGFzZSB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAiU3NhVHlwZWNvbnZlcnNpb25JbnNlcnRlciI7CiAgZmluYWwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkOwoKICBTc2FUeXBlQ29udmVyc2lvbkluc2VydGVyKHRoaXMuY2xvc2VkV29ybGQpOwoKICBBYnN0cmFjdFZhbHVlRG9tYWluIGdldCBfYWJzdHJhY3RWYWx1ZURvbWFpbiA9PgogICAgICBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0R3JhcGgoSEdyYXBoIGdyYXBoKSB7CiAgICB2aXNpdERvbWluYXRvclRyZWUoZ3JhcGgpOwogIH0KCiAgLy8gVXBkYXRlIHVzZXJzIG9mIFtpbnB1dF0gdGhhdCBhcmUgZG9taW5hdGVkIGJ5IFs6ZG9taW5hdG9yLmZpcnN0Ol0KICAvLyB0byB1c2UgW1R5cGVLbm93bl0gb2YgW2lucHV0XSBpbnN0ZWFkLiBBcyB0aGUgdHlwZSBpbmZvcm1hdGlvbiBkZXBlbmRzCiAgLy8gb24gdGhlIGNvbnRyb2wgZmxvdywgd2UgbWFyayB0aGUgaW5zZXJ0ZWQgW0hUeXBlS25vd25dIG5vZGVzIGFzCiAgLy8gbm9uLW1vdmFibGUuCiAgdm9pZCBpbnNlcnRUeXBlUHJvcGFnYXRpb25Gb3JEb21pbmF0ZWRVc2VycygKICAgICAgSEJhc2ljQmxvY2sgZG9taW5hdG9yLCBISW5zdHJ1Y3Rpb24gaW5wdXQsIEFic3RyYWN0VmFsdWUgY29udmVydGVkVHlwZSkgewogICAgRG9taW5hdGVkVXNlcyBkb21pbmF0ZWRVc2VzID0gRG9taW5hdGVkVXNlcy5vZihpbnB1dCwgZG9taW5hdG9yLmZpcnN0KTsKICAgIGlmIChkb21pbmF0ZWRVc2VzLmlzRW1wdHkpIHJldHVybjsKCiAgICAvLyBDaGVjayB0byBhdm9pZCBhZGRpbmcgYSBkdXBsaWNhdGUgSFR5cGVLbm93biBub2RlLgogICAgaWYgKGRvbWluYXRlZFVzZXMuaXNTaW5nbGV0b24pIHsKICAgICAgSEluc3RydWN0aW9uIHVzZXIgPSBkb21pbmF0ZWRVc2VzLnNpbmdsZTsKICAgICAgaWYgKHVzZXIgaXMgSFR5cGVLbm93biAmJgogICAgICAgICAgdXNlci5pc1Bpbm5lZCAmJgogICAgICAgICAgdXNlci5rbm93blR5cGUgPT0gY29udmVydGVkVHlwZSAmJgogICAgICAgICAgdXNlci5jaGVja2VkSW5wdXQgPT0gaW5wdXQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICBIVHlwZUtub3duIG5ld0lucHV0ID0gbmV3IEhUeXBlS25vd24ucGlubmVkKGNvbnZlcnRlZFR5cGUsIGlucHV0KTsKICAgIGRvbWluYXRvci5hZGRCZWZvcmUoZG9taW5hdG9yLmZpcnN0LCBuZXdJbnB1dCk7CiAgICBkb21pbmF0ZWRVc2VzLnJlcGxhY2VXaXRoKG5ld0lucHV0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJcyhISXMgaW5zdHJ1Y3Rpb24pIHsKICAgIERhcnRUeXBlIHR5cGUgPSBpbnN0cnVjdGlvbi50eXBlRXhwcmVzc2lvbjsKICAgIGlmICghaW5zdHJ1Y3Rpb24uaXNSYXdDaGVjaykgewogICAgICByZXR1cm47CiAgICB9IGVsc2UgaWYgKHR5cGUuaXNUeXBlZGVmKSB7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZiAodHlwZS5pc0Z1dHVyZU9yKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIEludGVyZmFjZVR5cGUgaW50ZXJmYWNlVHlwZSA9IHR5cGU7CiAgICBDbGFzc0VudGl0eSBjbHMgPSBpbnRlcmZhY2VUeXBlLmVsZW1lbnQ7CgogICAgTGlzdDxIQmFzaWNCbG9jaz4gdHJ1ZVRhcmdldHMgPSA8SEJhc2ljQmxvY2s+W107CiAgICBMaXN0PEhCYXNpY0Jsb2NrPiBmYWxzZVRhcmdldHMgPSA8SEJhc2ljQmxvY2s+W107CgogICAgY29sbGVjdFRhcmdldHMoaW5zdHJ1Y3Rpb24sIHRydWVUYXJnZXRzLCBmYWxzZVRhcmdldHMpOwoKICAgIGlmICh0cnVlVGFyZ2V0cy5pc0VtcHR5ICYmIGZhbHNlVGFyZ2V0cy5pc0VtcHR5KSByZXR1cm47CgogICAgQWJzdHJhY3RWYWx1ZSBjb252ZXJ0ZWRUeXBlID0KICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5jcmVhdGVOb25OdWxsU3VidHlwZShjbHMpOwogICAgSEluc3RydWN0aW9uIGlucHV0ID0gaW5zdHJ1Y3Rpb24uZXhwcmVzc2lvbjsKCiAgICBmb3IgKEhCYXNpY0Jsb2NrIGJsb2NrIGluIHRydWVUYXJnZXRzKSB7CiAgICAgIGluc2VydFR5cGVQcm9wYWdhdGlvbkZvckRvbWluYXRlZFVzZXJzKGJsb2NrLCBpbnB1dCwgY29udmVydGVkVHlwZSk7CiAgICB9CiAgICAvLyBUT0RPKHNyYSk6IEFsc28gc3RyZW5ndGhlbiB1c2VzIGZvciB3aGVuIHRoZSBjb25kaXRpb24gaXMga25vd24KICAgIC8vIGZhbHNlLiBBdm9pZCBzdHJlbmd0aGVuaW5nIHRvIGBudWxsYC4KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJZGVudGl0eShISWRlbnRpdHkgaW5zdHJ1Y3Rpb24pIHsKICAgIC8vIEF0IEhJZihISWRlbnRpdHkoeCwgbnVsbCkpIHN0cmVuZ3RoZW5zIHggdG8gbm9uLW51bGwgb24gZWxzZSBicmFuY2guCiAgICBISW5zdHJ1Y3Rpb24gbGVmdCA9IGluc3RydWN0aW9uLmxlZnQ7CiAgICBISW5zdHJ1Y3Rpb24gcmlnaHQgPSBpbnN0cnVjdGlvbi5yaWdodDsKICAgIEhJbnN0cnVjdGlvbiBpbnB1dDsKCiAgICBpZiAobGVmdC5pc0NvbnN0YW50TnVsbCgpKSB7CiAgICAgIGlucHV0ID0gcmlnaHQ7CiAgICB9IGVsc2UgaWYgKHJpZ2h0LmlzQ29uc3RhbnROdWxsKCkpIHsKICAgICAgaW5wdXQgPSBsZWZ0OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChfYWJzdHJhY3RWYWx1ZURvbWFpbi5pc051bGwoaW5wdXQuaW5zdHJ1Y3Rpb25UeXBlKS5pc0RlZmluaXRlbHlGYWxzZSkgewogICAgICByZXR1cm47CiAgICB9CgogICAgTGlzdDxIQmFzaWNCbG9jaz4gdHJ1ZVRhcmdldHMgPSA8SEJhc2ljQmxvY2s+W107CiAgICBMaXN0PEhCYXNpY0Jsb2NrPiBmYWxzZVRhcmdldHMgPSA8SEJhc2ljQmxvY2s+W107CgogICAgY29sbGVjdFRhcmdldHMoaW5zdHJ1Y3Rpb24sIHRydWVUYXJnZXRzLCBmYWxzZVRhcmdldHMpOwoKICAgIGlmICh0cnVlVGFyZ2V0cy5pc0VtcHR5ICYmIGZhbHNlVGFyZ2V0cy5pc0VtcHR5KSByZXR1cm47CgogICAgQWJzdHJhY3RWYWx1ZSBub25OdWxsVHlwZSA9CiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4uZXhjbHVkZU51bGwoaW5wdXQuaW5zdHJ1Y3Rpb25UeXBlKTsKCiAgICBmb3IgKEhCYXNpY0Jsb2NrIGJsb2NrIGluIGZhbHNlVGFyZ2V0cykgewogICAgICBpbnNlcnRUeXBlUHJvcGFnYXRpb25Gb3JEb21pbmF0ZWRVc2VycyhibG9jaywgaW5wdXQsIG5vbk51bGxUeXBlKTsKICAgIH0KICAgIC8vIFdlIGRvbid0IHN0cmVuZ3RoZW4gdGhlIGtub3duLXRydWUgcmVmZXJlbmNlcy4gSXQgZG9lc24ndCBoYXBwZW4gb2Z0ZW4KICAgIC8vIGFuZCB3ZSBkb24ndCB3YW50ICJpZiAoeD09bnVsbCkgcmV0dXJuIHg7IiB0byBjb252ZXJ0IGJldHdlZW4gSmF2YVNjcmlwdAogICAgLy8gJ251bGwnIGFuZCAndW5kZWZpbmVkJy4KICB9CgogIGNvbGxlY3RUYXJnZXRzKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiwgTGlzdDxIQmFzaWNCbG9jaz4gdHJ1ZVRhcmdldHMsCiAgICAgIExpc3Q8SEJhc2ljQmxvY2s+IGZhbHNlVGFyZ2V0cykgewogICAgZm9yIChISW5zdHJ1Y3Rpb24gdXNlciBpbiBpbnN0cnVjdGlvbi51c2VkQnkpIHsKICAgICAgaWYgKHVzZXIgaXMgSElmKSB7CiAgICAgICAgdHJ1ZVRhcmdldHM/LmFkZCh1c2VyLnRoZW5CbG9jayk7CiAgICAgICAgZmFsc2VUYXJnZXRzPy5hZGQodXNlci5lbHNlQmxvY2spOwogICAgICB9IGVsc2UgaWYgKHVzZXIgaXMgSExvb3BCcmFuY2gpIHsKICAgICAgICB0cnVlVGFyZ2V0cz8uYWRkKHVzZXIuYmxvY2suc3VjY2Vzc29ycy5maXJzdCk7CiAgICAgICAgLy8gRG9uJ3QgaW5zZXJ0IHJlZmluZW1lbnRzIG9uIGVsc2UtYnJhbmNoIC0gbWF5IGJlIGEgY3JpdGljYWwgZWRnZQogICAgICAgIC8vIGJsb2NrIHdoaWNoIHdlIGN1cnJlbnRseSBuZWVkIHRvIGtlZXAgZW1wdHkgKGV4Y2VwdCBmb3IgcGhpcykuCiAgICAgIH0gZWxzZSBpZiAodXNlciBpcyBITm90KSB7CiAgICAgICAgY29sbGVjdFRhcmdldHModXNlciwgZmFsc2VUYXJnZXRzLCB0cnVlVGFyZ2V0cyk7CiAgICAgIH0gZWxzZSBpZiAodXNlciBpcyBIUGhpKSB7CiAgICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cyA9IHVzZXIuaW5wdXRzOwogICAgICAgIGlmIChpbnB1dHMubGVuZ3RoID09IDIpIHsKICAgICAgICAgIGFzc2VydChpbnB1dHMuY29udGFpbnMoaW5zdHJ1Y3Rpb24pKTsKICAgICAgICAgIEhJbnN0cnVjdGlvbiBvdGhlciA9IGlucHV0c1soaW5wdXRzWzBdID09IGluc3RydWN0aW9uKSA/IDEgOiAwXTsKICAgICAgICAgIGlmIChvdGhlci5pc0NvbnN0YW50VHJ1ZSgpKSB7CiAgICAgICAgICAgIC8vIFRoZSBjb25kaXRpb24gZmxvd3MgdG8gYSBIUGhpKHRydWUsIHVzZXIpLCB3aGljaCBtZWFucyB0aGF0IGEKICAgICAgICAgICAgLy8gZG93bnN0cmVhbSBISWYgaGFzIHRydWUtYnJhbmNoIGNvbnRyb2wgZmxvdyB0aGF0IGRvZXMgbm90IGRlcGVuZAogICAgICAgICAgICAvLyBvbiB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24sIHNvIHN0b3AgY29sbGVjdGluZyBbdHJ1ZVRhcmdldHNdLgogICAgICAgICAgICBjb2xsZWN0VGFyZ2V0cyh1c2VyLCBudWxsLCBmYWxzZVRhcmdldHMpOwogICAgICAgICAgfSBlbHNlIGlmIChvdGhlci5pc0NvbnN0YW50RmFsc2UoKSkgewogICAgICAgICAgICAvLyBEaXR0byBmb3IgZmFsc2UuCiAgICAgICAgICAgIGNvbGxlY3RUYXJnZXRzKHVzZXIsIHRydWVUYXJnZXRzLCBudWxsKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodXNlciBpcyBIQm9vbGlmeSkgewogICAgICAgIC8vIFdlIGNvbGxlY3QgdGFyZ2V0cyBmb3Igc3RyaWN0bHkgYm9vbGVhbiBvcGVyYXRpb25zIHNvIEhCb29saWZ5IGNhbm5vdAogICAgICAgIC8vIGNoYW5nZSB0aGUgcmVzdWx0LgogICAgICAgIGNvbGxlY3RUYXJnZXRzKHVzZXIsIHRydWVUYXJnZXRzLCBmYWxzZVRhcmdldHMpOwogICAgICB9CiAgICB9CiAgfQp9CgovLy8gT3B0aW1pemF0aW9uIHBoYXNlIHRoYXQgdHJpZXMgdG8gZWxpbWluYXRlIG1lbW9yeSBsb2FkcyAoZm9yIGV4YW1wbGUKLy8vIFtIRmllbGRHZXRdKSwgd2hlbiBpdCBrbm93cyB0aGUgdmFsdWUgc3RvcmVkIGluIHRoYXQgbWVtb3J5IGxvY2F0aW9uLCBhbmQKLy8vIHN0b3JlcyB0aGF0IG92ZXJ3cml0ZSB3aXRoIHRoZSBzYW1lIHZhbHVlLgpjbGFzcyBTc2FMb2FkRWxpbWluYXRpb24gZXh0ZW5kcyBIQmFzZVZpc2l0b3IgaW1wbGVtZW50cyBPcHRpbWl6YXRpb25QaGFzZSB7CiAgZmluYWwgQ29tcGlsZXIgY29tcGlsZXI7CiAgZmluYWwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkOwogIGZpbmFsIEpGaWVsZEFuYWx5c2lzIF9maWVsZEFuYWx5c2lzOwogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gIlNzYUxvYWRFbGltaW5hdGlvbiI7CiAgTWVtb3J5U2V0IG1lbW9yeVNldDsKICBMaXN0PE1lbW9yeVNldD4gbWVtb3JpZXM7CiAgYm9vbCBuZXdHdm5DYW5kaWRhdGVzID0gZmFsc2U7CiAgSEdyYXBoIF9ncmFwaDsKCiAgU3NhTG9hZEVsaW1pbmF0aW9uKHRoaXMuY29tcGlsZXIsIHRoaXMuY2xvc2VkV29ybGQpCiAgICAgIDogX2ZpZWxkQW5hbHlzaXMgPSBjbG9zZWRXb3JsZC5maWVsZEFuYWx5c2lzOwoKICBBYnN0cmFjdFZhbHVlRG9tYWluIGdldCBfYWJzdHJhY3RWYWx1ZURvbWFpbiA9PgogICAgICBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0R3JhcGgoSEdyYXBoIGdyYXBoKSB7CiAgICBfZ3JhcGggPSBncmFwaDsKICAgIG1lbW9yaWVzID0gbmV3IExpc3Q8TWVtb3J5U2V0PihncmFwaC5ibG9ja3MubGVuZ3RoKTsKICAgIExpc3Q8SEJhc2ljQmxvY2s+IGJsb2NrcyA9IGdyYXBoLmJsb2NrczsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgIEhCYXNpY0Jsb2NrIGJsb2NrID0gYmxvY2tzW2ldOwogICAgICB2aXNpdEJhc2ljQmxvY2soYmxvY2spOwogICAgICBpZiAoYmxvY2suc3VjY2Vzc29ycy5pc05vdEVtcHR5ICYmIGJsb2NrLnN1Y2Nlc3NvcnNbMF0uaXNMb29wSGVhZGVyKCkpIHsKICAgICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmRpbmcgYmxvY2sgb2YgYSBsb29wLiBJdGVyYXRlIG92ZXIgdGhlCiAgICAgICAgLy8gYmxvY2tzIG9mIHRoZSBsb29wIGFnYWluIHRvIHRha2UgdmFsdWVzIHRoYXQgZmxvdyBmcm9tIHRoYXQKICAgICAgICAvLyBlbmRpbmcgYmxvY2sgaW50byBhY2NvdW50LgogICAgICAgIGZvciAoaW50IGogPSBibG9jay5zdWNjZXNzb3JzWzBdLmlkOyBqIDw9IGJsb2NrLmlkOyBqKyspIHsKICAgICAgICAgIHZpc2l0QmFzaWNCbG9jayhibG9ja3Nbal0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJhc2ljQmxvY2soSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIGlmIChibG9jay5wcmVkZWNlc3NvcnMubGVuZ3RoID09IDApIHsKICAgICAgLy8gRW50cnkgYmxvY2suCiAgICAgIG1lbW9yeVNldCA9IG5ldyBNZW1vcnlTZXQoY2xvc2VkV29ybGQpOwogICAgfSBlbHNlIGlmIChibG9jay5wcmVkZWNlc3NvcnMubGVuZ3RoID09IDEgJiYKICAgICAgICBibG9jay5wcmVkZWNlc3NvcnNbMF0uc3VjY2Vzc29ycy5sZW5ndGggPT0gMSkgewogICAgICAvLyBObyBuZWVkIHRvIGNsb25lLCB0aGVyZSBpcyBubyBvdGhlciBzdWNjZXNzb3IgZm9yCiAgICAgIC8vIGBibG9jay5wcmVkZWNlc3NvcnNbMF1gLCBhbmQgdGhpcyBibG9jayBoYXMgb25seSBvbmUKICAgICAgLy8gcHJlZGVjZXNzb3IuIFNpbmNlIHdlIGFyZSBub3QgZ29pbmcgdG8gdmlzaXQKICAgICAgLy8gYGJsb2NrLnByZWRlY2Vzc29yc1swXWAgYWdhaW4sIHdlIGNhbiBqdXN0IHJlLXVzZSBpdHMKICAgICAgLy8gW21lbW9yeVNldF0uCiAgICAgIG1lbW9yeVNldCA9IG1lbW9yaWVzW2Jsb2NrLnByZWRlY2Vzc29yc1swXS5pZF07CiAgICB9IGVsc2UgaWYgKGJsb2NrLnByZWRlY2Vzc29ycy5sZW5ndGggPT0gMSkgewogICAgICAvLyBDbG9uZSB0aGUgbWVtb3J5U2V0IG9mIHRoZSBwcmVkZWNlc3NvciwgYmVjYXVzZSBpdCBpcyBhbHNvIHVzZWQKICAgICAgLy8gYnkgb3RoZXIgc3VjY2Vzc29ycyBvZiBpdC4KICAgICAgbWVtb3J5U2V0ID0gbWVtb3JpZXNbYmxvY2sucHJlZGVjZXNzb3JzWzBdLmlkXS5jbG9uZSgpOwogICAgfSBlbHNlIHsKICAgICAgLy8gQ29tcHV0ZSB0aGUgaW50ZXJzZWN0aW9uIG9mIGFsbCBwcmVkZWNlc3NvcnMuCiAgICAgIG1lbW9yeVNldCA9IG1lbW9yaWVzW2Jsb2NrLnByZWRlY2Vzc29yc1swXS5pZF07CiAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYmxvY2sucHJlZGVjZXNzb3JzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbWVtb3J5U2V0ID0gbWVtb3J5U2V0LmludGVyc2VjdGlvbkZvcigKICAgICAgICAgICAgbWVtb3JpZXNbYmxvY2sucHJlZGVjZXNzb3JzW2ldLmlkXSwgYmxvY2ssIGkpOwogICAgICB9CiAgICB9CgogICAgbWVtb3JpZXNbYmxvY2suaWRdID0gbWVtb3J5U2V0OwogICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gYmxvY2suZmlyc3Q7CiAgICB3aGlsZSAoaW5zdHJ1Y3Rpb24gIT0gbnVsbCkgewogICAgICBISW5zdHJ1Y3Rpb24gbmV4dCA9IGluc3RydWN0aW9uLm5leHQ7CiAgICAgIGluc3RydWN0aW9uLmFjY2VwdCh0aGlzKTsKICAgICAgaW5zdHJ1Y3Rpb24gPSBuZXh0OwogICAgfQogIH0KCiAgdm9pZCBjaGVja05ld0d2bkNhbmRpZGF0ZXMoSEluc3RydWN0aW9uIGluc3RydWN0aW9uLCBISW5zdHJ1Y3Rpb24gZXhpc3RpbmcpIHsKICAgIGlmIChuZXdHdm5DYW5kaWRhdGVzKSByZXR1cm47CiAgICBib29sIGhhc1VzZUd2bihISW5zdHJ1Y3Rpb24gaW5zbikgPT4gaW5zbi5ub25DaGVjaygpLnVzZUd2bigpOwogICAgaWYgKGluc3RydWN0aW9uLnVzZWRCeS5hbnkoaGFzVXNlR3ZuKSAmJiBleGlzdGluZy51c2VkQnkuYW55KGhhc1VzZUd2bikpIHsKICAgICAgbmV3R3ZuQ2FuZGlkYXRlcyA9IHRydWU7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RmllbGRHZXQoSEZpZWxkR2V0IGluc3RydWN0aW9uKSB7CiAgICBpZiAoaW5zdHJ1Y3Rpb24uaXNOdWxsQ2hlY2spIHJldHVybjsKICAgIEZpZWxkRW50aXR5IGVsZW1lbnQgPSBpbnN0cnVjdGlvbi5lbGVtZW50OwogICAgSEluc3RydWN0aW9uIHJlY2VpdmVyID0gaW5zdHJ1Y3Rpb24uZ2V0RGFydFJlY2VpdmVyKGNsb3NlZFdvcmxkKS5ub25DaGVjaygpOwogICAgX3Zpc2l0RmllbGRHZXQoZWxlbWVudCwgcmVjZWl2ZXIsIGluc3RydWN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRHZXRMZW5ndGgoSEdldExlbmd0aCBpbnN0cnVjdGlvbikgewogICAgSEluc3RydWN0aW9uIHJlY2VpdmVyID0gaW5zdHJ1Y3Rpb24ucmVjZWl2ZXIubm9uQ2hlY2soKTsKICAgIEhJbnN0cnVjdGlvbiBleGlzdGluZyA9CiAgICAgICAgbWVtb3J5U2V0Lmxvb2t1cEZpZWxkVmFsdWUoTWVtb3J5RmVhdHVyZS5sZW5ndGgsIHJlY2VpdmVyKTsKICAgIGlmIChleGlzdGluZyAhPSBudWxsKSB7CiAgICAgIGNoZWNrTmV3R3ZuQ2FuZGlkYXRlcyhpbnN0cnVjdGlvbiwgZXhpc3RpbmcpOwogICAgICBpbnN0cnVjdGlvbi5ibG9jay5yZXdyaXRlV2l0aEJldHRlclVzZXIoaW5zdHJ1Y3Rpb24sIGV4aXN0aW5nKTsKICAgICAgaW5zdHJ1Y3Rpb24uYmxvY2sucmVtb3ZlKGluc3RydWN0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIG1lbW9yeVNldC5yZWdpc3RlckZpZWxkVmFsdWUoTWVtb3J5RmVhdHVyZS5sZW5ndGgsIHJlY2VpdmVyLCBpbnN0cnVjdGlvbik7CiAgICB9CiAgfQoKICB2b2lkIF92aXNpdEZpZWxkR2V0KAogICAgICBGaWVsZEVudGl0eSBlbGVtZW50LCBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIsIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgSEluc3RydWN0aW9uIGV4aXN0aW5nID0gbWVtb3J5U2V0Lmxvb2t1cEZpZWxkVmFsdWUoZWxlbWVudCwgcmVjZWl2ZXIpOwogICAgaWYgKGV4aXN0aW5nICE9IG51bGwpIHsKICAgICAgY2hlY2tOZXdHdm5DYW5kaWRhdGVzKGluc3RydWN0aW9uLCBleGlzdGluZyk7CiAgICAgIGluc3RydWN0aW9uLmJsb2NrLnJld3JpdGVXaXRoQmV0dGVyVXNlcihpbnN0cnVjdGlvbiwgZXhpc3RpbmcpOwogICAgICBpbnN0cnVjdGlvbi5ibG9jay5yZW1vdmUoaW5zdHJ1Y3Rpb24pOwogICAgfSBlbHNlIHsKICAgICAgbWVtb3J5U2V0LnJlZ2lzdGVyRmllbGRWYWx1ZShlbGVtZW50LCByZWNlaXZlciwgaW5zdHJ1Y3Rpb24pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZpZWxkU2V0KEhGaWVsZFNldCBpbnN0cnVjdGlvbikgewogICAgRmllbGRFbnRpdHkgZWxlbWVudCA9IGluc3RydWN0aW9uLmVsZW1lbnQ7CiAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIgPSBpbnN0cnVjdGlvbi5nZXREYXJ0UmVjZWl2ZXIoY2xvc2VkV29ybGQpLm5vbkNoZWNrKCk7CiAgICBpZiAobWVtb3J5U2V0LnJlZ2lzdGVyRmllbGRWYWx1ZVVwZGF0ZSgKICAgICAgICBlbGVtZW50LCByZWNlaXZlciwgaW5zdHJ1Y3Rpb24udmFsdWUpKSB7CiAgICAgIGluc3RydWN0aW9uLmJsb2NrLnJlbW92ZShpbnN0cnVjdGlvbik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q3JlYXRlKEhDcmVhdGUgaW5zdHJ1Y3Rpb24pIHsKICAgIG1lbW9yeVNldC5yZWdpc3RlckFsbG9jYXRpb24oaW5zdHJ1Y3Rpb24pOwogICAgaWYgKHNob3VsZFRyYWNrSW5pdGlhbFZhbHVlcyhpbnN0cnVjdGlvbikpIHsKICAgICAgaW50IGFyZ3VtZW50SW5kZXggPSAwOwogICAgICBjb21waWxlci5jb2RlZ2VuV29ybGRCdWlsZGVyLmZvckVhY2hJbnN0YW5jZUZpZWxkKGluc3RydWN0aW9uLmVsZW1lbnQsCiAgICAgICAgICAoXywgRmllbGRFbnRpdHkgbWVtYmVyLCB7Ym9vbCBpc0VsaWRlZH0pIHsKICAgICAgICBpZiAoaXNFbGlkZWQpIHJldHVybjsKICAgICAgICBpZiAoY29tcGlsZXIuZWxlbWVudEhhc0NvbXBpbGVUaW1lRXJyb3IoCiAgICAgICAgICAgIC8vIGlnbm9yZTogVU5ORUNFU1NBUllfQ0FTVAogICAgICAgICAgICBtZW1iZXIgYXMgRW50aXR5KSkgcmV0dXJuOwogICAgICAgIEZpZWxkQW5hbHlzaXNEYXRhIGZpZWxkRGF0YSA9IF9maWVsZEFuYWx5c2lzLmdldEZpZWxkRGF0YShtZW1iZXIpOwogICAgICAgIGlmIChmaWVsZERhdGEuaXNJbml0aWFsaXplZEluQWxsb2NhdG9yKSB7CiAgICAgICAgICAvLyBUT0RPKHNyYSk6IENhbiB3ZSBhdm9pZCBjYWxsaW5nIEhHcmFwaC5hZGRDb25zdGFudD8KICAgICAgICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBmaWVsZERhdGEuaW5pdGlhbFZhbHVlOwogICAgICAgICAgSENvbnN0YW50IGNvbnN0YW50ID0gX2dyYXBoLmFkZENvbnN0YW50KHZhbHVlLCBjbG9zZWRXb3JsZCk7CiAgICAgICAgICBtZW1vcnlTZXQucmVnaXN0ZXJGaWVsZFZhbHVlKG1lbWJlciwgaW5zdHJ1Y3Rpb24sIGNvbnN0YW50KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbWVtb3J5U2V0LnJlZ2lzdGVyRmllbGRWYWx1ZSgKICAgICAgICAgICAgICBtZW1iZXIsIGluc3RydWN0aW9uLCBpbnN0cnVjdGlvbi5pbnB1dHNbYXJndW1lbnRJbmRleCsrXSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIC8vIEluIGNhc2UgdGhpcyBpbnN0cnVjdGlvbiBoYXMgYXMgaW5wdXQgbm9uLWVzY2FwaW5nIG9iamVjdHMsIHdlCiAgICAvLyBuZWVkIHRvIG1hcmsgdGhlc2Ugb2JqZWN0cyBhcyBlc2NhcGluZy4KICAgIG1lbW9yeVNldC5raWxsQWZmZWN0ZWRCeShpbnN0cnVjdGlvbik7CiAgfQoKICBib29sIHNob3VsZFRyYWNrSW5pdGlhbFZhbHVlcyhIQ3JlYXRlIGluc3RydWN0aW9uKSB7CiAgICAvLyBEb24ndCB0cmFjayBpbml0aWFsIGZpZWxkIHZhbHVlcyBvZiBhbiBhbGxvY2F0aW9uIHRoYXQgYXJlCiAgICAvLyB1bnByb2ZpdGFibGUuIFdlIHNlYXJjaCB0aGUgY2hhaW4gb2Ygc2luZ2xlIHVzZXMgaW4gYWxsb2NhdGlvbnMgZm9yIGEKICAgIC8vIGxpbWl0ZWQgZGVwdGguCgogICAgY29uc3QgTUFYX0hFQVBfREVQVEggPSA1OwoKICAgIGJvb2wgaW50ZXJlc3RpbmdVc2UoSEluc3RydWN0aW9uIGluc3RydWN0aW9uLCBpbnQgaGVhcERlcHRoKSB7CiAgICAgIC8vIEhldXJpc3RpYzogaWYgdGhlIGFsbG9jYXRpb24gaXMgdG9vIGRlZXAgaW4gaGVhcCBpdCBpcyB1bmxpa2VseSB3ZSB3aWxsCiAgICAgIC8vIHJlY292ZXIgYSBmaWVsZCBieSBsb2FkLWVsaW1pbmF0aW9uLgogICAgICAvLyBUT0RPKHNyYSk6IFdlIGNhbiBtZWFzdXJlIHRoaXMgZGVwdGggYnkgbG9va2luZyBhdCBsb2FkIGNoYWlucy4KICAgICAgaWYgKGhlYXBEZXB0aCA9PSBNQVhfSEVBUF9ERVBUSCkgcmV0dXJuIGZhbHNlOwogICAgICAvLyBUaGVyZSBhcmUgbXVsdGlwbGUgdXNlcyBzbyBkbyB0aGUgZnVsbCBzdG9yZSBhbmFseXNpcy4KICAgICAgaWYgKGluc3RydWN0aW9uLnVzZWRCeS5sZW5ndGggIT0gMSkgcmV0dXJuIHRydWU7CiAgICAgIEhJbnN0cnVjdGlvbiB1c2UgPSBpbnN0cnVjdGlvbi51c2VkQnkuc2luZ2xlOwogICAgICAvLyBXaGVuIHRoZSBvbmx5IHVzZSBpcyBhbiBhbGxvY2F0aW9uLCB0aGUgYWxsb2NhdGlvbiBiZWNvbWVzIHRoZSBvbmx5CiAgICAgIC8vIGhlYXAgYWxpYXMgZm9yIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLgogICAgICBpZiAodXNlIGlzIEhDcmVhdGUpIHJldHVybiBpbnRlcmVzdGluZ1VzZSh1c2UsIGhlYXBEZXB0aCArIDEpOwogICAgICBpZiAodXNlIGlzIEhMaXRlcmFsTGlzdCkgcmV0dXJuIGludGVyZXN0aW5nVXNlKHVzZSwgaGVhcERlcHRoICsgMSk7CiAgICAgIGlmICh1c2UgaXMgSEludm9rZVN0YXRpYykgewogICAgICAgIC8vIEFzc3VtZSB0aGUgYXJndW1lbnQgZXNjYXBlcy4gQWxsIHdlIGRvIHdpdGggb3VyIGluaXRpYWwgYWxsb2NhdGlvbiBpcwogICAgICAgIC8vIGhhdmUgaXQgZXNjYXBlIG9yIHN0b3JlIGl0IGludG8gYW4gb2JqZWN0IHRoYXQgZXNjYXBlcy4KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgLy8gVE9ETyhzcmEpOiBIYW5kbGUgbGlicmFyeSBmdW5jdGlvbnMgdGhhdCB3ZSBrbm93IGRvIG5vdCBtb2RpZnkgb3IKICAgICAgICAvLyBsZWFrIHRoZSBpbnB1dHMuIEZvciBleGFtcGxlIGBzZXRSdW50aW1lVHlwZUluZm9gIGlzIHVzZWQgdG8gbWFyawogICAgICAgIC8vIGxpc3QgbGl0ZXJhbHMgd2l0aCB0eXBlIGluZm9ybWF0aW9uLgogICAgICB9CiAgICAgIGlmICh1c2UgaXMgSFBoaSkgewogICAgICAgIC8vIFRoZSBpbml0aWFsIGFsbG9jYXRpb24gKGl0J3Mgb25seSBhbGlhcykgZ2V0cyBtZXJnZWQgb3V0IG9mIHRoZSBtb2RlbAogICAgICAgIC8vIG9mIHRoZSBoZWFwIGJlZm9yZSBsb2FkLgogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICByZXR1cm4gaW50ZXJlc3RpbmdVc2UoaW5zdHJ1Y3Rpb24sIDApOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEluc3RydWN0aW9uKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgaWYgKGluc3RydWN0aW9uLmlzQWxsb2NhdGlvbihfYWJzdHJhY3RWYWx1ZURvbWFpbikpIHsKICAgICAgbWVtb3J5U2V0LnJlZ2lzdGVyQWxsb2NhdGlvbihpbnN0cnVjdGlvbik7CiAgICB9CiAgICBtZW1vcnlTZXQua2lsbEFmZmVjdGVkQnkoaW5zdHJ1Y3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExhenlTdGF0aWMoSExhenlTdGF0aWMgaW5zdHJ1Y3Rpb24pIHsKICAgIEZpZWxkRW50aXR5IGZpZWxkID0gaW5zdHJ1Y3Rpb24uZWxlbWVudDsKICAgIGhhbmRsZVN0YXRpY0xvYWQoZmllbGQsIGluc3RydWN0aW9uKTsKICB9CgogIHZvaWQgaGFuZGxlU3RhdGljTG9hZChNZW1iZXJFbnRpdHkgZWxlbWVudCwgSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBISW5zdHJ1Y3Rpb24gZXhpc3RpbmcgPSBtZW1vcnlTZXQubG9va3VwRmllbGRWYWx1ZShlbGVtZW50LCBudWxsKTsKICAgIGlmIChleGlzdGluZyAhPSBudWxsKSB7CiAgICAgIGNoZWNrTmV3R3ZuQ2FuZGlkYXRlcyhpbnN0cnVjdGlvbiwgZXhpc3RpbmcpOwogICAgICBpbnN0cnVjdGlvbi5ibG9jay5yZXdyaXRlV2l0aEJldHRlclVzZXIoaW5zdHJ1Y3Rpb24sIGV4aXN0aW5nKTsKICAgICAgaW5zdHJ1Y3Rpb24uYmxvY2sucmVtb3ZlKGluc3RydWN0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIG1lbW9yeVNldC5yZWdpc3RlckZpZWxkVmFsdWUoZWxlbWVudCwgbnVsbCwgaW5zdHJ1Y3Rpb24pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN0YXRpYyhIU3RhdGljIGluc3RydWN0aW9uKSB7CiAgICBoYW5kbGVTdGF0aWNMb2FkKGluc3RydWN0aW9uLmVsZW1lbnQsIGluc3RydWN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdGF0aWNTdG9yZShIU3RhdGljU3RvcmUgaW5zdHJ1Y3Rpb24pIHsKICAgIGlmIChtZW1vcnlTZXQucmVnaXN0ZXJGaWVsZFZhbHVlVXBkYXRlKAogICAgICAgIGluc3RydWN0aW9uLmVsZW1lbnQsIG51bGwsIGluc3RydWN0aW9uLmlucHV0cy5sYXN0KSkgewogICAgICBpbnN0cnVjdGlvbi5ibG9jay5yZW1vdmUoaW5zdHJ1Y3Rpb24pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExpdGVyYWxMaXN0KEhMaXRlcmFsTGlzdCBpbnN0cnVjdGlvbikgewogICAgbWVtb3J5U2V0LnJlZ2lzdGVyQWxsb2NhdGlvbihpbnN0cnVjdGlvbik7CiAgICBtZW1vcnlTZXQua2lsbEFmZmVjdGVkQnkoaW5zdHJ1Y3Rpb24pOwogICAgLy8gVE9ETyhzcmEpOiBTZXQgaW5pdGlhbCBrZXllZCB2YWx1ZXMuCiAgICAvLyBUT0RPKHNyYSk6IFNldCBpbml0aWFsIGxlbmd0aC4KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbmRleChISW5kZXggaW5zdHJ1Y3Rpb24pIHsKICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciA9IGluc3RydWN0aW9uLnJlY2VpdmVyLm5vbkNoZWNrKCk7CiAgICBISW5zdHJ1Y3Rpb24gZXhpc3RpbmcgPQogICAgICAgIG1lbW9yeVNldC5sb29rdXBLZXllZFZhbHVlKHJlY2VpdmVyLCBpbnN0cnVjdGlvbi5pbmRleCk7CiAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkgewogICAgICBjaGVja05ld0d2bkNhbmRpZGF0ZXMoaW5zdHJ1Y3Rpb24sIGV4aXN0aW5nKTsKICAgICAgaW5zdHJ1Y3Rpb24uYmxvY2sucmV3cml0ZVdpdGhCZXR0ZXJVc2VyKGluc3RydWN0aW9uLCBleGlzdGluZyk7CiAgICAgIGluc3RydWN0aW9uLmJsb2NrLnJlbW92ZShpbnN0cnVjdGlvbik7CiAgICB9IGVsc2UgewogICAgICBtZW1vcnlTZXQucmVnaXN0ZXJLZXllZFZhbHVlKHJlY2VpdmVyLCBpbnN0cnVjdGlvbi5pbmRleCwgaW5zdHJ1Y3Rpb24pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEluZGV4QXNzaWduKEhJbmRleEFzc2lnbiBpbnN0cnVjdGlvbikgewogICAgSEluc3RydWN0aW9uIHJlY2VpdmVyID0gaW5zdHJ1Y3Rpb24ucmVjZWl2ZXIubm9uQ2hlY2soKTsKICAgIG1lbW9yeVNldC5yZWdpc3RlcktleWVkVmFsdWVVcGRhdGUoCiAgICAgICAgcmVjZWl2ZXIsIGluc3RydWN0aW9uLmluZGV4LCBpbnN0cnVjdGlvbi52YWx1ZSk7CiAgfQoKICAvLyBQdXJlIG9wZXJhdGlvbnMgdGhhdCBkbyBub3QgZXNjYXBlIHRoZWlyIGlucHV0cy4KICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QmluYXJ5QXJpdGhtZXRpYyhIQmluYXJ5QXJpdGhtZXRpYyBpbnN0cnVjdGlvbikge30KICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Qm91bmRzQ2hlY2soSEJvdW5kc0NoZWNrIGluc3RydWN0aW9uKSB7fQogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDb25zdGFudChIQ29uc3RhbnQgaW5zdHJ1Y3Rpb24pIHt9CiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdElmKEhJZiBpbnN0cnVjdGlvbikge30KICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW50ZXJjZXB0b3IoSEludGVyY2VwdG9yIGluc3RydWN0aW9uKSB7fQogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJcyhISXMgaW5zdHJ1Y3Rpb24pIHt9CiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdElzVmlhSW50ZXJjZXB0b3IoSElzVmlhSW50ZXJjZXB0b3IgaW5zdHJ1Y3Rpb24pIHt9CiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE5vdChITm90IGluc3RydWN0aW9uKSB7fQogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRQYXJhbWV0ZXJWYWx1ZShIUGFyYW1ldGVyVmFsdWUgaW5zdHJ1Y3Rpb24pIHt9CiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFJlbGF0aW9uYWwoSFJlbGF0aW9uYWwgaW5zdHJ1Y3Rpb24pIHt9CiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN0cmluZ0NvbmNhdChIU3RyaW5nQ29uY2F0IGluc3RydWN0aW9uKSB7fQogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlS25vd24oSFR5cGVLbm93biBpbnN0cnVjdGlvbikge30KICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZUluZm9SZWFkUmF3KEhUeXBlSW5mb1JlYWRSYXcgaW5zdHJ1Y3Rpb24pIHt9CiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVJbmZvUmVhZFZhcmlhYmxlKEhUeXBlSW5mb1JlYWRWYXJpYWJsZSBpbnN0cnVjdGlvbikge30KICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZUluZm9FeHByZXNzaW9uKEhUeXBlSW5mb0V4cHJlc3Npb24gaW5zdHJ1Y3Rpb24pIHt9Cn0KCi8vLyBBIG5vbi1maWVsZCBiYXNlZCBmZWF0dXJlIG9mIGFuIG9iamVjdC4KZW51bSBNZW1vcnlGZWF0dXJlIHsKICAvLyBBY2Nlc3MgdG8gdGhlIGBsZW5ndGhgIHByb3BlcnR5IG9mIGEgYEpTSW5kZXhhYmxlYC4KICBsZW5ndGgsCn0KCi8vLyBIb2xkcyB2YWx1ZXMgb2YgbWVtb3J5IHBsYWNlcy4KLy8vCi8vLyBHZW5lcmFsbHksIHZhbHVlcyB0aGF0IG5hbWUgYSBwbGFjZSAoYSByZWNlaXZlcikgaGF2ZSB0eXBlIHJlZmluZW1lbnRzIGFuZAovLy8gb3RoZXIgY2hlY2tzIHJlbW92ZWQgdG8gZW5zdXJlIHRoYXQgY2hlY2tzIGFuZCB0eXBlIHJlZmluZW1lbnRzIGRvIG5vdAovLy8gY29uZnVzZSBhbGlhc2luZy4gIFZhbHVlcyBzdG9yZWQgaW50byBhIG1lbW9yeSBwbGFjZSBrZWVwIHRoZSB0eXBlCi8vLyByZWZpbmVtZW50cyB0byBoZWxwIGZ1cnRoZXIgb3B0aW1pemF0aW9ucy4KY2xhc3MgTWVtb3J5U2V0IHsKICBmaW5hbCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQ7CgogIC8vLyBNYXBzIGEgZmllbGQgdG8gYSBtYXAgb2YgcmVjZWl2ZXJzIHRvIHRoZWlyIGN1cnJlbnQgZmllbGQgdmFsdWVzLgogIC8vLwogIC8vLyBUaGUgZmllbGQgaXMgZWl0aGVyIGEgW0ZpZWxkRW50aXR5XSwgYSBbRnVuY3Rpb25FbnRpdHldIGluIGNhc2Ugb2YKICAvLy8gaW5zdGFuY2UgbWV0aG9kcywgb3IgYSBbTWVtb3J5RmVhdHVyZV0gZm9yIGBsZW5ndGhgIGFjY2VzcyBvbgogIC8vLyBgSlNJbmRleGFibGVgLgogIC8vLwogIC8vIFRPRE8oMjU1NDQpOiBTcGxpdCBsZW5ndGggZWZmZWN0cyBmcm9tIG90aGVyIGVmZmVjdHMgYW5kIG1vZGVsIGxlbmd0aHMKICAvLyBzZXBhcmF0ZWx5LgogIGZpbmFsIE1hcDxPYmplY3QgLypNZW1iZXJFbnRpdHl8TWVtb3J5RmVhdHVyZSovLAogICAgICAgICAgTWFwPEhJbnN0cnVjdGlvbiwgSEluc3RydWN0aW9uPj4KICAgICAgZmllbGRWYWx1ZXMgPSA8T2JqZWN0LCBNYXA8SEluc3RydWN0aW9uLCBISW5zdHJ1Y3Rpb24+Pnt9OwoKICAvLy8gTWFwcyBhIHJlY2VpdmVyIHRvIGEgbWFwIG9mIGtleXMgdG8gdmFsdWUuCiAgZmluYWwgTWFwPEhJbnN0cnVjdGlvbiwgTWFwPEhJbnN0cnVjdGlvbiwgSEluc3RydWN0aW9uPj4ga2V5ZWRWYWx1ZXMgPQogICAgICA8SEluc3RydWN0aW9uLCBNYXA8SEluc3RydWN0aW9uLCBISW5zdHJ1Y3Rpb24+Pnt9OwoKICAvLy8gU2V0IG9mIG9iamVjdHMgdGhhdCB3ZSBrbm93IGRvbid0IGVzY2FwZSB0aGUgY3VycmVudCBmdW5jdGlvbi4KICBmaW5hbCBTZXRsZXQ8SEluc3RydWN0aW9uPiBub25Fc2NhcGluZ1JlY2VpdmVycyA9IG5ldyBTZXRsZXQ8SEluc3RydWN0aW9uPigpOwoKICBNZW1vcnlTZXQodGhpcy5jbG9zZWRXb3JsZCk7CgogIEFic3RyYWN0VmFsdWVEb21haW4gZ2V0IF9hYnN0cmFjdFZhbHVlRG9tYWluID0+CiAgICAgIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgW2ZpcnN0XSBhbmQgW3NlY29uZF0gYWx3YXlzIGFsaWFzIHRvIHRoZSBzYW1lIG9iamVjdC4KICBib29sIG11c3RBbGlhcyhISW5zdHJ1Y3Rpb24gZmlyc3QsIEhJbnN0cnVjdGlvbiBzZWNvbmQpIHsKICAgIHJldHVybiBmaXJzdCA9PSBzZWNvbmQ7CiAgfQoKICAvLy8gUmV0dXJucyB3aGV0aGVyIFtmaXJzdF0gYW5kIFtzZWNvbmRdIG1heSBhbGlhcyB0byB0aGUgc2FtZSBvYmplY3QuCiAgYm9vbCBtYXlBbGlhcyhISW5zdHJ1Y3Rpb24gZmlyc3QsIEhJbnN0cnVjdGlvbiBzZWNvbmQpIHsKICAgIGlmIChtdXN0QWxpYXMoZmlyc3QsIHNlY29uZCkpIHJldHVybiB0cnVlOwogICAgaWYgKGlzQ29uY3JldGUoZmlyc3QpICYmIGlzQ29uY3JldGUoc2Vjb25kKSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKG5vbkVzY2FwaW5nUmVjZWl2ZXJzLmNvbnRhaW5zKGZpcnN0KSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKG5vbkVzY2FwaW5nUmVjZWl2ZXJzLmNvbnRhaW5zKHNlY29uZCkpIHJldHVybiBmYWxzZTsKICAgIC8vIFR5cGVkIGFycmF5cyBvZiBkaWZmZXJlbnQgdHlwZXMgbWlnaHQgaGF2ZSBhIHNoYXJlZCBidWZmZXIuCiAgICBpZiAoY291bGRCZVR5cGVkQXJyYXkoZmlyc3QpICYmIGNvdWxkQmVUeXBlZEFycmF5KHNlY29uZCkpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIF9hYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgLmFyZURpc2pvaW50KGZpcnN0Lmluc3RydWN0aW9uVHlwZSwgc2Vjb25kLmluc3RydWN0aW9uVHlwZSkKICAgICAgICAuaXNQb3RlbnRpYWxseUZhbHNlOwogIH0KCiAgYm9vbCBpc0ZpbmFsKE9iamVjdCBlbGVtZW50KSB7CiAgICByZXR1cm4gZWxlbWVudCBpcyBNZW1iZXJFbnRpdHkgJiYgY2xvc2VkV29ybGQuZmllbGROZXZlckNoYW5nZXMoZWxlbWVudCk7CiAgfQoKICBib29sIGlzQ29uY3JldGUoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb24gaXMgSENyZWF0ZSB8fAogICAgICAgIGluc3RydWN0aW9uIGlzIEhDb25zdGFudCB8fAogICAgICAgIGluc3RydWN0aW9uIGlzIEhMaXRlcmFsTGlzdDsKICB9CgogIGJvb2wgY291bGRCZVR5cGVkQXJyYXkoSEluc3RydWN0aW9uIHJlY2VpdmVyKSB7CiAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgIC5jb3VsZEJlVHlwZWRBcnJheShyZWNlaXZlci5pbnN0cnVjdGlvblR5cGUpCiAgICAgICAgLmlzUG90ZW50aWFsbHlUcnVlOwogIH0KCiAgLy8vIFJldHVybnMgd2hldGhlciBbcmVjZWl2ZXJdIGVzY2FwZXMgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCiAgYm9vbCBlc2NhcGVzKEhJbnN0cnVjdGlvbiByZWNlaXZlcikgewogICAgYXNzZXJ0KHJlY2VpdmVyID09IG51bGwgfHwgcmVjZWl2ZXIgPT0gcmVjZWl2ZXIubm9uQ2hlY2soKSk7CiAgICByZXR1cm4gIW5vbkVzY2FwaW5nUmVjZWl2ZXJzLmNvbnRhaW5zKHJlY2VpdmVyKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJBbGxvY2F0aW9uKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgYXNzZXJ0KGluc3RydWN0aW9uID09IGluc3RydWN0aW9uLm5vbkNoZWNrKCkpOwogICAgbm9uRXNjYXBpbmdSZWNlaXZlcnMuYWRkKGluc3RydWN0aW9uKTsKICB9CgogIC8vLyBTZXRzIHRoZSBbZmllbGRdIG9uIFtyZWNlaXZlcl0gdG8gY29udGFpbiBbdmFsdWVdLiBLaWxscyBhbGwgcG90ZW50aWFsCiAgLy8vIHBsYWNlcyB0aGF0IG1heSBiZSBhZmZlY3RlZCBieSB0aGlzIHVwZGF0ZS4gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHVwZGF0ZQogIC8vLyBpcyByZWR1bmRhbnQuCiAgYm9vbCByZWdpc3RlckZpZWxkVmFsdWVVcGRhdGUoCiAgICAgIE9iamVjdCBmaWVsZCwgSEluc3RydWN0aW9uIHJlY2VpdmVyLCBISW5zdHJ1Y3Rpb24gdmFsdWUpIHsKICAgIGFzc2VydChmaWVsZCBpcyBNZW1iZXJFbnRpdHkgfHwgZmllbGQgaXMgTWVtb3J5RmVhdHVyZSwKICAgICAgICAiVW5leHBlY3RlZCBtZW1iZXIvZmVhdHVyZTogJGZpZWxkIik7CiAgICBhc3NlcnQocmVjZWl2ZXIgPT0gbnVsbCB8fCByZWNlaXZlciA9PSByZWNlaXZlci5ub25DaGVjaygpKTsKICAgIGlmIChjbG9zZWRXb3JsZC5uYXRpdmVEYXRhLmlzTmF0aXZlTWVtYmVyKGZpZWxkKSkgewogICAgICByZXR1cm4gZmFsc2U7IC8vIFRPRE8oMTQ5NTUpOiBSZW1vdmUgdGhpcyByZXN0cmljdGlvbj8KICAgIH0KICAgIC8vIFt2YWx1ZV0gaXMgYmVpbmcgc2V0IGluIHNvbWUgcGxhY2UgaW4gbWVtb3J5LCB3ZSByZW1vdmUgaXQgZnJvbSB0aGUKICAgIC8vIG5vbi1lc2NhcGluZyBzZXQuCiAgICBub25Fc2NhcGluZ1JlY2VpdmVycy5yZW1vdmUodmFsdWUubm9uQ2hlY2soKSk7CiAgICBNYXA8SEluc3RydWN0aW9uLCBISW5zdHJ1Y3Rpb24+IG1hcCA9CiAgICAgICAgZmllbGRWYWx1ZXMucHV0SWZBYnNlbnQoZmllbGQsICgpID0+IDxISW5zdHJ1Y3Rpb24sIEhJbnN0cnVjdGlvbj57fSk7CiAgICBib29sIGlzUmVkdW5kYW50ID0gbWFwW3JlY2VpdmVyXSA9PSB2YWx1ZTsKICAgIG1hcC5mb3JFYWNoKChrZXksIHZhbHVlKSB7CiAgICAgIGlmIChtYXlBbGlhcyhyZWNlaXZlciwga2V5KSkgbWFwW2tleV0gPSBudWxsOwogICAgfSk7CiAgICBtYXBbcmVjZWl2ZXJdID0gdmFsdWU7CiAgICByZXR1cm4gaXNSZWR1bmRhbnQ7CiAgfQoKICAvLy8gUmVnaXN0ZXJzIHRoYXQgdGhlIFtmaWVsZF0gb24gW3JlY2VpdmVyXSBpcyBub3cgW3ZhbHVlXS4KICB2b2lkIHJlZ2lzdGVyRmllbGRWYWx1ZSgKICAgICAgT2JqZWN0IGZpZWxkLCBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIsIEhJbnN0cnVjdGlvbiB2YWx1ZSkgewogICAgYXNzZXJ0KGZpZWxkIGlzIE1lbWJlckVudGl0eSB8fCBmaWVsZCBpcyBNZW1vcnlGZWF0dXJlLAogICAgICAgICJVbmV4cGVjdGVkIG1lbWJlci9mZWF0dXJlOiAkZmllbGQiKTsKICAgIGFzc2VydChyZWNlaXZlciA9PSBudWxsIHx8IHJlY2VpdmVyID09IHJlY2VpdmVyLm5vbkNoZWNrKCkpOwogICAgaWYgKGZpZWxkIGlzIE1lbWJlckVudGl0eSAmJiBjbG9zZWRXb3JsZC5uYXRpdmVEYXRhLmlzTmF0aXZlTWVtYmVyKGZpZWxkKSkgewogICAgICByZXR1cm47IC8vIFRPRE8oMTQ5NTUpOiBSZW1vdmUgdGhpcyByZXN0cmljdGlvbj8KICAgIH0KICAgIE1hcDxISW5zdHJ1Y3Rpb24sIEhJbnN0cnVjdGlvbj4gbWFwID0KICAgICAgICBmaWVsZFZhbHVlcy5wdXRJZkFic2VudChmaWVsZCwgKCkgPT4gPEhJbnN0cnVjdGlvbiwgSEluc3RydWN0aW9uPnt9KTsKICAgIG1hcFtyZWNlaXZlcl0gPSB2YWx1ZTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBzdG9yZWQgZm9yIFtmaWVsZF0gb24gW3JlY2VpdmVyXS4gUmV0dXJucyBgbnVsbGAgaWYgd2UKICAvLy8gZG9uJ3Qga25vdy4KICBISW5zdHJ1Y3Rpb24gbG9va3VwRmllbGRWYWx1ZShPYmplY3QgZmllbGQsIEhJbnN0cnVjdGlvbiByZWNlaXZlcikgewogICAgYXNzZXJ0KGZpZWxkIGlzIE1lbWJlckVudGl0eSB8fCBmaWVsZCBpcyBNZW1vcnlGZWF0dXJlLAogICAgICAgICJVbmV4cGVjdGVkIG1lbWJlci9mZWF0dXJlOiAkZmllbGQiKTsKICAgIGFzc2VydChyZWNlaXZlciA9PSBudWxsIHx8IHJlY2VpdmVyID09IHJlY2VpdmVyLm5vbkNoZWNrKCkpOwogICAgTWFwPEhJbnN0cnVjdGlvbiwgSEluc3RydWN0aW9uPiBtYXAgPSBmaWVsZFZhbHVlc1tmaWVsZF07CiAgICByZXR1cm4gKG1hcCA9PSBudWxsKSA/IG51bGwgOiBtYXBbcmVjZWl2ZXJdOwogIH0KCiAgLy8vIEtpbGwgYWxsIHBsYWNlcyB0aGF0IG1heSBiZSBhZmZlY3RlZCBieSB0aGlzIFtpbnN0cnVjdGlvbl0uIEFsc28gdXBkYXRlCiAgLy8vIHRoZSBzZXQgb2Ygbm9uLWVzY2FwaW5nIG9iamVjdHMgaW4gY2FzZSBbaW5zdHJ1Y3Rpb25dIGhhcyBub24tZXNjYXBpbmcKICAvLy8gb2JqZWN0cyBpbiBpdHMgaW5wdXRzLgogIHZvaWQga2lsbEFmZmVjdGVkQnkoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICAvLyBFdmVuIGlmIFtpbnN0cnVjdGlvbl0gZG9lcyBub3QgaGF2ZSBzaWRlIGVmZmVjdHMsIGl0IG1heSB1c2Ugbm9uLWVzY2FwaW5nCiAgICAvLyBvYmplY3RzIGFuZCBzdG9yZSB0aGVtIGluIGEgbmV3IG9iamVjdCwgd2hpY2ggbWFrZSB0aGVzZSBvYmplY3RzCiAgICAvLyBlc2NhcGluZy4KICAgIGluc3RydWN0aW9uLmlucHV0cy5mb3JFYWNoKChpbnB1dCkgewogICAgICBub25Fc2NhcGluZ1JlY2VpdmVycy5yZW1vdmUoaW5wdXQubm9uQ2hlY2soKSk7CiAgICB9KTsKCiAgICBpZiAoaW5zdHJ1Y3Rpb24uc2lkZUVmZmVjdHMuY2hhbmdlc0luc3RhbmNlUHJvcGVydHkoKSB8fAogICAgICAgIGluc3RydWN0aW9uLnNpZGVFZmZlY3RzLmNoYW5nZXNTdGF0aWNQcm9wZXJ0eSgpKSB7CiAgICAgIExpc3Q8SEluc3RydWN0aW9uPiByZWNlaXZlcnNUb1JlbW92ZSA9IDxISW5zdHJ1Y3Rpb24+W107CgogICAgICBMaXN0PE9iamVjdD4gZmllbGRzVG9SZW1vdmU7CiAgICAgIGZpZWxkVmFsdWVzLmZvckVhY2goKE9iamVjdCBlbGVtZW50LCBtYXApIHsKICAgICAgICBpZiAoaXNGaW5hbChlbGVtZW50KSkgcmV0dXJuOwogICAgICAgIG1hcC5mb3JFYWNoKChyZWNlaXZlciwgdmFsdWUpIHsKICAgICAgICAgIGlmIChlc2NhcGVzKHJlY2VpdmVyKSkgewogICAgICAgICAgICByZWNlaXZlcnNUb1JlbW92ZS5hZGQocmVjZWl2ZXIpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGlmIChyZWNlaXZlcnNUb1JlbW92ZS5sZW5ndGggPT0gbWFwLmxlbmd0aCkgewogICAgICAgICAgLy8gUmVtb3ZlIHRoZW0gYWxsIGJ5IHJlbW92aW5nIHRoZSBlbnRpcmUgbWFwLgogICAgICAgICAgKGZpZWxkc1RvUmVtb3ZlID8/PSA8T2JqZWN0PltdKS5hZGQoZWxlbWVudCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlY2VpdmVyc1RvUmVtb3ZlLmZvckVhY2gobWFwLnJlbW92ZSk7CiAgICAgICAgfQogICAgICAgIHJlY2VpdmVyc1RvUmVtb3ZlLmNsZWFyKCk7CiAgICAgIH0pOwogICAgICBmaWVsZHNUb1JlbW92ZT8uZm9yRWFjaChmaWVsZFZhbHVlcy5yZW1vdmUpOwogICAgfQoKICAgIGlmIChpbnN0cnVjdGlvbi5zaWRlRWZmZWN0cy5jaGFuZ2VzSW5kZXgoKSkgewogICAgICBrZXllZFZhbHVlcy5mb3JFYWNoKChyZWNlaXZlciwgbWFwKSB7CiAgICAgICAgaWYgKGVzY2FwZXMocmVjZWl2ZXIpKSB7CiAgICAgICAgICBtYXAuZm9yRWFjaCgoaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgIG1hcFtpbmRleF0gPSBudWxsOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBzdG9yZWQgaW4gYHJlY2VpdmVyW2luZGV4XWAuIFJldHVybnMgbnVsbCBpZiB3ZSBkb24ndAogIC8vLyBrbm93LgogIEhJbnN0cnVjdGlvbiBsb29rdXBLZXllZFZhbHVlKEhJbnN0cnVjdGlvbiByZWNlaXZlciwgSEluc3RydWN0aW9uIGluZGV4KSB7CiAgICBNYXA8SEluc3RydWN0aW9uLCBISW5zdHJ1Y3Rpb24+IG1hcCA9IGtleWVkVmFsdWVzW3JlY2VpdmVyXTsKICAgIHJldHVybiAobWFwID09IG51bGwpID8gbnVsbCA6IG1hcFtpbmRleF07CiAgfQoKICAvLy8gUmVnaXN0ZXJzIHRoYXQgYHJlY2VpdmVyW2luZGV4XWAgaXMgbm93IFt2YWx1ZV0uCiAgdm9pZCByZWdpc3RlcktleWVkVmFsdWUoCiAgICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciwgSEluc3RydWN0aW9uIGluZGV4LCBISW5zdHJ1Y3Rpb24gdmFsdWUpIHsKICAgIE1hcDxISW5zdHJ1Y3Rpb24sIEhJbnN0cnVjdGlvbj4gbWFwID0KICAgICAgICBrZXllZFZhbHVlcy5wdXRJZkFic2VudChyZWNlaXZlciwgKCkgPT4gPEhJbnN0cnVjdGlvbiwgSEluc3RydWN0aW9uPnt9KTsKICAgIG1hcFtpbmRleF0gPSB2YWx1ZTsKICB9CgogIC8vLyBTZXRzIGByZWNlaXZlcltpbmRleF1gIHRvIGNvbnRhaW4gW3ZhbHVlXS4gS2lsbHMgYWxsIHBvdGVudGlhbCBwbGFjZXMgdGhhdAogIC8vLyBtYXkgYmUgYWZmZWN0ZWQgYnkgdGhpcyB1cGRhdGUuCiAgdm9pZCByZWdpc3RlcktleWVkVmFsdWVVcGRhdGUoCiAgICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciwgSEluc3RydWN0aW9uIGluZGV4LCBISW5zdHJ1Y3Rpb24gdmFsdWUpIHsKICAgIG5vbkVzY2FwaW5nUmVjZWl2ZXJzLnJlbW92ZSh2YWx1ZS5ub25DaGVjaygpKTsKICAgIGtleWVkVmFsdWVzLmZvckVhY2goKGtleSwgdmFsdWVzKSB7CiAgICAgIGlmIChtYXlBbGlhcyhyZWNlaXZlciwga2V5KSkgewogICAgICAgIC8vIFR5cGVkIGFycmF5cyB0aGF0IGFyZSB2aWV3cyBvZiB0aGUgc2FtZSBidWZmZXIgbWF5IGhhdmUgZGlmZmVyZW50CiAgICAgICAgLy8gb2Zmc2V0cyBvciBlbGVtZW50IHNpemVzLCB1bmxlc3MgdGhleSBhcmUgdGhlIHNhbWUgdHlwZWQgYXJyYXkuCiAgICAgICAgYm9vbCB3ZWFrSW5kZXggPSBjb3VsZEJlVHlwZWRBcnJheShrZXkpICYmICFtdXN0QWxpYXMocmVjZWl2ZXIsIGtleSk7CiAgICAgICAgdmFsdWVzLmZvckVhY2goKG90aGVySW5kZXgsIG90aGVyVmFsdWUpIHsKICAgICAgICAgIGlmICh3ZWFrSW5kZXggfHwgbWF5QWxpYXMoaW5kZXgsIG90aGVySW5kZXgpKSB7CiAgICAgICAgICAgIHZhbHVlc1tvdGhlckluZGV4XSA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwoKICAgIC8vIFR5cGVkIGFycmF5cyBtYXkgbmFycm93IGluY29taW5nIHZhbHVlcy4KICAgIGlmIChjb3VsZEJlVHlwZWRBcnJheShyZWNlaXZlcikpIHJldHVybjsKCiAgICBNYXA8SEluc3RydWN0aW9uLCBISW5zdHJ1Y3Rpb24+IG1hcCA9CiAgICAgICAga2V5ZWRWYWx1ZXMucHV0SWZBYnNlbnQocmVjZWl2ZXIsICgpID0+IDxISW5zdHJ1Y3Rpb24sIEhJbnN0cnVjdGlvbj57fSk7CiAgICBtYXBbaW5kZXhdID0gdmFsdWU7CiAgfQoKICAvLy8gUmV0dXJucyBhIGNvbW1vbiBpbnN0cnVjdGlvbiBmb3IgW2ZpcnN0XSBhbmQgW3NlY29uZF0uCiAgLy8vCiAgLy8vIFJldHVybnMgYG51bGxgIGlmIGVpdGhlciBbZmlyc3RdIG9yIFtzZWNvbmRdIGlzIG51bGwuIFJldHVybnMgW2ZpcnN0XSBpZgogIC8vLyBbZmlyc3RdIGFuZCBbc2Vjb25kXSBhcmUgZXF1YWwuIE90aGVyd2lzZSBjcmVhdGVzIG9yIHJlLXVzZXMgYSBwaGkgaW4KICAvLy8gW2Jsb2NrXSB0aGF0IGhvbGRzIFtmaXJzdF0gYW5kIFtzZWNvbmRdLgogIEhJbnN0cnVjdGlvbiBmaW5kQ29tbW9uSW5zdHJ1Y3Rpb24oSEluc3RydWN0aW9uIGZpcnN0LCBISW5zdHJ1Y3Rpb24gc2Vjb25kLAogICAgICBIQmFzaWNCbG9jayBibG9jaywgaW50IHByZWRlY2Vzc29ySW5kZXgpIHsKICAgIGlmIChmaXJzdCA9PSBudWxsIHx8IHNlY29uZCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGlmIChmaXJzdCA9PSBzZWNvbmQpIHJldHVybiBmaXJzdDsKICAgIGlmIChzZWNvbmQgaXMgSEdldExlbmd0aCkgewogICAgICAvLyBEb24ndCBhbHdheXMgY3JlYXRlIHBoaXMgZm9yIEhHZXRMZW5ndGguIFRoZSBwaGkgY29uZnVzZXMgYXJyYXkgYm91bmRzCiAgICAgIC8vIGNoZWNrIGVsaW1pbmF0aW9uIGFuZCB0aGUgcmVzdWx0aW5nIHZhcmlhYmxlLWhlYXZ5IGNvZGUgcHJvYmFibHkgaXMKICAgICAgLy8gY29uZnVzaW5nIGZvciBKYXZhU2NyaXB0IFZNcy4gSW4gcHJhY3RpY2UsIHRoaXMgbW9zdGx5IGFmZmVjdHMgdGhlCiAgICAgIC8vIGV4cGFuc2lvbiBvZiBmb3ItaW4gbG9vcHMgb24gQXJyYXlzLCBzbyB3ZSBtYXRjaCB0aGUgZXhwcmVzc2lvbgogICAgICAvLwogICAgICAvLyAgICAgY2hlY2tDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IoYXJyYXkubGVuZ3RoID09IF9lbmQsIGFycmF5KQogICAgICAvLwogICAgICAvLyBzdGFydGluZyB3aXRoIHRoZSBIR2V0TGVuZ3RoIG9mIHRoZSBgYXJyYXkubGVuZ3RoYCwgaW4gdGhlIGNhc2Ugd2hlcmUKICAgICAgLy8gYGFycmF5Lmxlbmd0aGAgaXMgbm90IHVzZWQgZWxzZXdoZXJlIChpLmUuIG5vdCBhbHJlYWR5IG9wdGltaXplZCB0byB1c2UKICAgICAgLy8gYSBwcmV2aW91cyB1c2UsIGluIHRoZSBsb29wIGNvbmRpdGlvbikuCiAgICAgIC8vCiAgICAgIC8vIFRPRE8oc3JhKTogRmlndXJlIG91dCBhIGJldHRlciB3YXkgZW5zdXJlICduaWNlJyBsb29wIGNvZGUuCiAgICAgIC8vIFRPRE8oMjI0MDcpOiBUaGUgcGhpIHdvdWxkIG5vdCBiZSBzbyBiYWQgaWYgaXQgZGlkIG5vdCBjb25mdXNlIGJvdW5kcwogICAgICAvLyBjaGVjayBlbGltaW5hdGlvbi4KICAgICAgLy8gVE9ETygyNTQzNyk6IFdlIGNvdWxkIGFkZCBhIHBoaSBpZiB3ZSB1bmRpZCB0aGUgaGFybWZ1bCBjYXNlcy4KICAgICAgaWYgKHNlY29uZC51c2VkQnkubGVuZ3RoID09IDEpIHsKICAgICAgICB2YXIgdXNlciA9IHNlY29uZC51c2VkQnkuc2luZ2xlOwogICAgICAgIGlmICh1c2VyIGlzIEhJZGVudGl0eSAmJiB1c2VyLnVzZWRCeS5sZW5ndGggPT0gMSkgewogICAgICAgICAgSEluc3RydWN0aW9uIHVzZXIyID0gdXNlci51c2VkQnkuc2luZ2xlOwogICAgICAgICAgaWYgKHVzZXIyIGlzIEhJbnZva2VTdGF0aWMgJiYKICAgICAgICAgICAgICB1c2VyMi5lbGVtZW50ID09CiAgICAgICAgICAgICAgICAgIGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmNoZWNrQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgQWJzdHJhY3RWYWx1ZSBwaGlUeXBlID0gX2Fic3RyYWN0VmFsdWVEb21haW4udW5pb24oCiAgICAgICAgc2Vjb25kLmluc3RydWN0aW9uVHlwZSwgZmlyc3QuaW5zdHJ1Y3Rpb25UeXBlKTsKICAgIGlmIChmaXJzdCBpcyBIUGhpICYmIGZpcnN0LmJsb2NrID09IGJsb2NrKSB7CiAgICAgIEhQaGkgcGhpID0gZmlyc3Q7CiAgICAgIHBoaS5hZGRJbnB1dChzZWNvbmQpOwogICAgICBwaGkuaW5zdHJ1Y3Rpb25UeXBlID0gcGhpVHlwZTsKICAgICAgcmV0dXJuIHBoaTsKICAgIH0gZWxzZSB7CiAgICAgIEhQaGkgcGhpID0gbmV3IEhQaGkubm9JbnB1dHMobnVsbCwgcGhpVHlwZSk7CiAgICAgIGJsb2NrLmFkZFBoaShwaGkpOwogICAgICAvLyBQcmV2aW91cyBwcmVkZWNlc3NvcnMgaGFkIHRoZSBzYW1lIGlucHV0LiBBIHBoaSBtdXN0IGhhdmUKICAgICAgLy8gdGhlIHNhbWUgbnVtYmVyIG9mIGlucHV0cyBhcyBpdHMgYmxvY2sgaGFzIHByZWRlY2Vzc29ycy4KICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVkZWNlc3NvckluZGV4OyBpKyspIHsKICAgICAgICBwaGkuYWRkSW5wdXQoZmlyc3QpOwogICAgICB9CiAgICAgIHBoaS5hZGRJbnB1dChzZWNvbmQpOwogICAgICByZXR1cm4gcGhpOwogICAgfQogIH0KCiAgLy8vIFJldHVybnMgdGhlIGludGVyc2VjdGlvbiBiZXR3ZWVuIFt0aGlzXSBhbmQgdGhlIFtvdGhlcl0gbWVtb3J5IHNldC4KICBNZW1vcnlTZXQgaW50ZXJzZWN0aW9uRm9yKAogICAgICBNZW1vcnlTZXQgb3RoZXIsIEhCYXNpY0Jsb2NrIGJsb2NrLCBpbnQgcHJlZGVjZXNzb3JJbmRleCkgewogICAgTWVtb3J5U2V0IHJlc3VsdCA9IG5ldyBNZW1vcnlTZXQoY2xvc2VkV29ybGQpOwogICAgaWYgKG90aGVyID09IG51bGwpIHsKICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdmlzaXQgdG8gYSBsb29wIGhlYWRlciAoW290aGVyXSBpcyBgbnVsbGAgYmVjYXVzZSB3ZQogICAgICAvLyBoYXZlIG5vdCB2aXNpdGVkIHRoZSBiYWNrIGVkZ2UpLiBDb3B5IHRoZSBub25Fc2NhcGluZ1JlY2VpdmVycyB0aGF0IGFyZQogICAgICAvLyBndWFyYW50ZWVkIHRvIHN1cnZpdmUgdGhlIGxvb3AgYmVjYXVzZSB0aGV5IGFyZSBub3QgZXNjYXBlZCBiZWZvcmUKICAgICAgLy8gbWV0aG9kIGV4aXQuCiAgICAgIC8vIFRPRE8oc3JhKTogV2Ugc2hvdWxkIGRvIGEgcHJvcGVyIGRhdGFmbG93IHRvIGZpbmQgdGhlIG1heGltYWwKICAgICAgLy8gbm9uRXNjYXBpbmdSZWNlaXZlcnMgKGEgdmFyaWFudCBvZiBBdmFpbGFibGUtRXhwcmVzc2lvbnMpLCB3aGljaCBtdXN0CiAgICAgIC8vIGNvbnZlcmdlIGJlZm9yZSB3ZSBlZGl0IHRoZSBwcm9ncmFtIGluIFtmaW5kQ29tbW9uSW5zdHJ1Y3Rpb25dLgogICAgICBmb3IgKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiBpbiBub25Fc2NhcGluZ1JlY2VpdmVycykgewogICAgICAgIGJvb2wgaXNOb25Fc2NhcGluZ1VzZShISW5zdHJ1Y3Rpb24gdXNlKSB7CiAgICAgICAgICBpZiAodXNlIGlzIEhSZXR1cm4pIHJldHVybiB0cnVlOyAvLyBFc2NhcGVzLCBidXQgc28gZG9lcyBjb250cm9sLgogICAgICAgICAgaWYgKHVzZSBpcyBIRmllbGRHZXQpIHJldHVybiB0cnVlOwogICAgICAgICAgaWYgKHVzZSBpcyBIRmllbGRTZXQpIHsKICAgICAgICAgICAgcmV0dXJuIHVzZS52YWx1ZS5ub25DaGVjaygpICE9IGluc3RydWN0aW9uOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHVzZSBpcyBIVHlwZUluZm9SZWFkVmFyaWFibGUpIHJldHVybiB0cnVlOwogICAgICAgICAgaWYgKHVzZSBpcyBIR2V0TGVuZ3RoKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgIGlmICh1c2UgaXMgSEJvdW5kc0NoZWNrKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgIGlmICh1c2UgaXMgSEluZGV4KSByZXR1cm4gdHJ1ZTsKICAgICAgICAgIGlmICh1c2UgaXMgSEluZGV4QXNzaWduKSB7CiAgICAgICAgICAgIHJldHVybiB1c2UudmFsdWUubm9uQ2hlY2soKSAhPSBpbnN0cnVjdGlvbjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh1c2UgaXMgSEludGVyY2VwdG9yKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgIGlmICh1c2UgaXMgSEludm9rZUR5bmFtaWNNZXRob2QpIHsKICAgICAgICAgICAgTWVtYmVyRW50aXR5IGVsZW1lbnQgPSB1c2UuZWxlbWVudDsKICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgIGlmIChlbGVtZW50ID09IGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmpzQXJyYXlBZGQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1c2UuaW5wdXRzLmxhc3QgIT0gaW5zdHJ1Y3Rpb247CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodXNlIGlzIEhJbnZva2VTdGF0aWMpIHsKICAgICAgICAgICAgaWYgKHVzZS5lbGVtZW50ID09CiAgICAgICAgICAgICAgICBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5jaGVja0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcikKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24udXNlZEJ5LmV2ZXJ5KGlzTm9uRXNjYXBpbmdVc2UpKSB7CiAgICAgICAgICByZXN1bHQubm9uRXNjYXBpbmdSZWNlaXZlcnMuYWRkKGluc3RydWN0aW9uKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBmaWVsZFZhbHVlcy5mb3JFYWNoKChlbGVtZW50LCB2YWx1ZXMpIHsKICAgICAgdmFyIG90aGVyVmFsdWVzID0gb3RoZXIuZmllbGRWYWx1ZXNbZWxlbWVudF07CiAgICAgIGlmIChvdGhlclZhbHVlcyA9PSBudWxsKSByZXR1cm47CiAgICAgIHZhbHVlcy5mb3JFYWNoKChyZWNlaXZlciwgdmFsdWUpIHsKICAgICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSBmaW5kQ29tbW9uSW5zdHJ1Y3Rpb24oCiAgICAgICAgICAgIHZhbHVlLCBvdGhlclZhbHVlc1tyZWNlaXZlcl0sIGJsb2NrLCBwcmVkZWNlc3NvckluZGV4KTsKICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24gIT0gbnVsbCkgewogICAgICAgICAgcmVzdWx0LnJlZ2lzdGVyRmllbGRWYWx1ZShlbGVtZW50LCByZWNlaXZlciwgaW5zdHJ1Y3Rpb24pOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKCiAgICBrZXllZFZhbHVlcy5mb3JFYWNoKChyZWNlaXZlciwgdmFsdWVzKSB7CiAgICAgIHZhciBvdGhlclZhbHVlcyA9IG90aGVyLmtleWVkVmFsdWVzW3JlY2VpdmVyXTsKICAgICAgaWYgKG90aGVyVmFsdWVzID09IG51bGwpIHJldHVybjsKICAgICAgdmFsdWVzLmZvckVhY2goKGluZGV4LCB2YWx1ZSkgewogICAgICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IGZpbmRDb21tb25JbnN0cnVjdGlvbigKICAgICAgICAgICAgdmFsdWUsIG90aGVyVmFsdWVzW2luZGV4XSwgYmxvY2ssIHByZWRlY2Vzc29ySW5kZXgpOwogICAgICAgIGlmIChpbnN0cnVjdGlvbiAhPSBudWxsKSB7CiAgICAgICAgICByZXN1bHQucmVnaXN0ZXJLZXllZFZhbHVlKHJlY2VpdmVyLCBpbmRleCwgaW5zdHJ1Y3Rpb24pOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKCiAgICBub25Fc2NhcGluZ1JlY2VpdmVycy5mb3JFYWNoKChyZWNlaXZlcikgewogICAgICBpZiAob3RoZXIubm9uRXNjYXBpbmdSZWNlaXZlcnMuY29udGFpbnMocmVjZWl2ZXIpKSB7CiAgICAgICAgcmVzdWx0Lm5vbkVzY2FwaW5nUmVjZWl2ZXJzLmFkZChyZWNlaXZlcik7CiAgICAgIH0K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ZW1lbnRzIGRlcml2ZWQgZnJvbSBLZXJuZWwgSVIuCgppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwoKYWJzdHJhY3QgY2xhc3MgX0luZGV4ZWQgewogIGludCBfaW5kZXg7Cn0KCmFic3RyYWN0IGNsYXNzIEluZGV4ZWRMaWJyYXJ5IGV4dGVuZHMgX0luZGV4ZWQgaW1wbGVtZW50cyBMaWJyYXJ5RW50aXR5IHsKICAvLy8gTGlicmFyeSBpbmRleCB1c2VkIGZvciBmYXN0IGxvb2t1cCBpbiBbS2VybmVsVG9FbGVtZW50TWFwQmFzZV0uCiAgaW50IGdldCBsaWJyYXJ5SW5kZXggPT4gX2luZGV4OwogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gNyAqIF9pbmRleCArIDI7Cn0KCmFic3RyYWN0IGNsYXNzIEluZGV4ZWRDbGFzcyBleHRlbmRzIF9JbmRleGVkIGltcGxlbWVudHMgQ2xhc3NFbnRpdHkgewogIC8vLyBDbGFzcyBpbmRleCB1c2VkIGZvciBmYXN0IGxvb2t1cCBpbiBbS2VybmVsVG9FbGVtZW50TWFwQmFzZV0uCiAgaW50IGdldCBjbGFzc0luZGV4ID0+IF9pbmRleDsKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IDcgKiBfaW5kZXggKyAxOwp9CgphYnN0cmFjdCBjbGFzcyBJbmRleGVkTWVtYmVyIGV4dGVuZHMgX0luZGV4ZWQgaW1wbGVtZW50cyBNZW1iZXJFbnRpdHkgewogIC8vLyBNZW1iZXIgaW5kZXggdXNlZCBmb3IgZmFzdCBsb29rdXAgaW4gW0tlcm5lbFRvRWxlbWVudE1hcEJhc2VdLgogIGludCBnZXQgbWVtYmVySW5kZXggPT4gX2luZGV4OwogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gNyAqIF9pbmRleDsKfQoKYWJzdHJhY3QgY2xhc3MgSW5kZXhlZEZ1bmN0aW9uIGV4dGVuZHMgX0luZGV4ZWQKICAgIGltcGxlbWVudHMgSW5kZXhlZE1lbWJlciwgRnVuY3Rpb25FbnRpdHkge30KCmFic3RyYWN0IGNsYXNzIEluZGV4ZWRDb25zdHJ1Y3RvcgogICAgaW1wbGVtZW50cyBJbmRleGVkRnVuY3Rpb24sIENvbnN0cnVjdG9yRW50aXR5IHt9CgphYnN0cmFjdCBjbGFzcyBJbmRleGVkRmllbGQgaW1wbGVtZW50cyBJbmRleGVkTWVtYmVyLCBGaWVsZEVudGl0eSB7fQoKYWJzdHJhY3QgY2xhc3MgSW5kZXhlZFR5cGVWYXJpYWJsZSBleHRlbmRzIF9JbmRleGVkCiAgICBpbXBsZW1lbnRzIFR5cGVWYXJpYWJsZUVudGl0eSB7CiAgLy8vIFR5cGUgdmFyaWFibGUgaW5kZXggdXNlZCBmb3IgZmFzdCBsb29rdXAgaW4gW0tlcm5lbFRvRWxlbWVudE1hcEJhc2VdLgogIGludCBnZXQgdHlwZVZhcmlhYmxlSW5kZXggPT4gX2luZGV4Owp9CgphYnN0cmFjdCBjbGFzcyBJbmRleGVkVHlwZWRlZiBleHRlbmRzIF9JbmRleGVkIGltcGxlbWVudHMgVHlwZWRlZkVudGl0eSB7CiAgLy8vIFR5cGVkZWYgaW5kZXggdXNlZCBmb3IgZmFzdCBsb29rdXAgaW4gW0tlcm5lbFRvRWxlbWVudE1hcEJhc2VdLgogIGludCBnZXQgdHlwZWRlZkluZGV4ID0+IF9pbmRleDsKfQoKYWJzdHJhY3QgY2xhc3MgSW5kZXhlZExvY2FsIGV4dGVuZHMgX0luZGV4ZWQgaW1wbGVtZW50cyBMb2NhbCB7CiAgaW50IGdldCBsb2NhbEluZGV4ID0+IF9pbmRleDsKfQoKLy8vIEJhc2UgaW1wbGVtZW50YXRpb24gZm9yIGFuIGluZGV4IGJhc2VkIG1hcCBvZiBlbnRpdGllcyBvZiB0eXBlIFtFXS4KYWJzdHJhY3QgY2xhc3MgRW50aXR5TWFwQmFzZTxFIGV4dGVuZHMgX0luZGV4ZWQ+IHsKICBpbnQgX3NpemUgPSAwOwogIExpc3Q8RT4gX2xpc3QgPSA8RT5bXTsKCiAgLy8vIFJldHVybnMgdGhlIFtpbmRleF10aCBlbnRpdHkgaW4gdGhlIG1hcC4KICBFIGdldEVudGl0eShpbnQgaW5kZXgpID0+IF9saXN0W2luZGV4XTsKCiAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBub24tbnVsbCBlbnRpdGllcyBpbiB0aGUgbWFwLgogIGludCBnZXQgc2l6ZSA9PiBfc2l6ZTsKCiAgLy8vIFJldHVybnMgdGhlIG51bWJlciAobnVsbCBhbmQgbm9uLW51bGwpIGVudGl0aWVzIGluIHRoZSBtYXAuCiAgaW50IGdldCBsZW5ndGggPT4gX2xpc3QubGVuZ3RoOwp9CgovLy8gSW5kZXggYmFzZWQgbWFwIG9mIGVudGl0aWVzIG9mIHR5cGUgW0VdLgpjbGFzcyBFbnRpdHlNYXA8RSBleHRlbmRzIF9JbmRleGVkPiBleHRlbmRzIEVudGl0eU1hcEJhc2U8RT4gewogIC8vLyBSZWdpc3RlcnMgYSBuZXcgW2VudGl0eV0uCiAgLy8vCiAgLy8vIFRoZSBpbmRleCBvZiBbZW50aXR5XSBpcyBzZXQgdG8gbWF0Y2ggaXRzIGluZGV4IGluIHRoZSBlbnRpdHkgbGlzdCBpbiB0aGlzCiAgLy8vIG1hcC4KICBFMCByZWdpc3RlcjxFMCBleHRlbmRzIEU+KEUwIGVudGl0eSkgewogICAgYXNzZXJ0KGVudGl0eSAhPSBudWxsKTsKICAgIGFzc2VydChlbnRpdHkuX2luZGV4ID09IG51bGwpOwogICAgZW50aXR5Ll9pbmRleCA9IF9saXN0Lmxlbmd0aDsKICAgIF9saXN0LmFkZChlbnRpdHkpOwogICAgX3NpemUrKzsKICAgIHJldHVybiBlbnRpdHk7CiAgfQoKICAvLy8gUmVnaXN0ZXJzIGEgbmV3IFtlbnRpdHldIGJ5IHRoZSBnaXZlbiBbaW5kZXhdLgogIEUwIHJlZ2lzdGVyQnlJbmRleDxFMCBleHRlbmRzIEU+KGludCBpbmRleCwgRTAgZW50aXR5KSB7CiAgICBhc3NlcnQoaW5kZXggPj0gX2xpc3QubGVuZ3RoKTsKICAgIF9saXN0Lmxlbmd0aCA9IGluZGV4OwogICAgcmV0dXJuIHJlZ2lzdGVyKGVudGl0eSk7CiAgfQoKICAvLy8gQ2FsbHMgW2ZdIGZvciBlYWNoIG5vbi1udWxsIGVudGl0eS4KICB2b2lkIGZvckVhY2g8RTAgZXh0ZW5kcyBFPih2b2lkIGYoRTAgZW50aXR5KSkgewogICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IF9saXN0Lmxlbmd0aDsgaW5kZXgrKykgewogICAgICBFIGVudGl0eSA9IF9saXN0W2luZGV4XTsKICAgICAgaWYgKGVudGl0eSAhPSBudWxsKSB7CiAgICAgICAgZihlbnRpdHkpOwogICAgICB9CiAgICB9CiAgfQp9CgovLy8gQmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBhbiBpbmRleCBiYXNlZCBtYXAgb2YgZW50aXRpZXMgb2YgdHlwZSBbRV0gd2l0aCBhCi8vLyBjb3JyZXNwb25kaW5nIGRhdGEgb2JqZWN0IG9mIHR5cGUgW0RdLgphYnN0cmFjdCBjbGFzcyBFbnRpdHlEYXRhTWFwQmFzZTxFIGV4dGVuZHMgX0luZGV4ZWQsIEQ+CiAgICBleHRlbmRzIEVudGl0eU1hcEJhc2U8RT4gewogIExpc3Q8RD4gX2RhdGEgPSA8RD5bXTsKCiAgLy8vIFJldHVybnMgdGhlIGRhdGEgb2JqZWN0IHN0b3JlZCBmb3IgdGhlIFtpbmRleF10aCBlbnRpdHkuCiAgRCBnZXREYXRhKEUgZW50aXR5KSB7CiAgICBpbnQgaW5kZXggPSBlbnRpdHkuX2luZGV4OwogICAgaWYgKGluZGV4IDwgX2xpc3QubGVuZ3RoICYmIGluZGV4ID49IF9kYXRhLmxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigKICAgICAgICAgICdEYXRhIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGNyZWF0ZWQgZm9yICR7X2xpc3RbaW5kZXhdfS4nKTsKICAgIH0KICAgIHJldHVybiBfZGF0YVtpbmRleF07CiAgfQp9CgovLy8gSW5kZXggYmFzZWQgbWFwIG9mIGVudGl0aWVzIG9mIHR5cGUgW0VdIHdpdGggYSBjb3JyZXNwb25kaW5nIGRhdGEgb2JqZWN0Ci8vLyBvZiB0eXBlIFtEXS4KY2xhc3MgRW50aXR5RGF0YU1hcDxFIGV4dGVuZHMgX0luZGV4ZWQsIEQ+IGV4dGVuZHMgRW50aXR5RGF0YU1hcEJhc2U8RSwgRD4gewogIC8vLyBNYXJrIGVudGl0eSBbaW5kZXhdIGFzIG1pc3NpbmcKICB2b2lkIHNraXBJbmRleChpbnQgaW5kZXgpIHsKICAgIGFzc2VydChpbmRleCA9PSBfbGlzdC5sZW5ndGgpOwogICAgX2xpc3QuYWRkKG51bGwpOwogICAgX2RhdGEuYWRkKG51bGwpOwogIH0KCiAgLy8vIFJlZ2lzdGVycyBhIG5ldyBbZW50aXR5XSB3aXRoIGFuIGFzc29jaWF0ZWQgW2RhdGFdIG9iamVjdC4KICAvLy8KICAvLy8gVGhlIGluZGV4IG9mIFtlbnRpdHldIGlzIHNldCB0byBtYXRjaCBpdHMgaW5kZXggaW4gdGhlIGVudGl0eSBhbmQgZGF0YQogIC8vLyBsaXN0cyBpbiB0aGlzIG1hcC4KICBFMCByZWdpc3RlcjxFMCBleHRlbmRzIEUsIEQwIGV4dGVuZHMgRD4oRTAgZW50aXR5LCBEMCBkYXRhKSB7CiAgICBhc3NlcnQoZW50aXR5ICE9IG51bGwpOwogICAgYXNzZXJ0KGVudGl0eS5faW5kZXggPT0gbnVsbCk7CiAgICBhc3NlcnQoCiAgICAgICAgX2xpc3QubGVuZ3RoID09IF9kYXRhLmxlbmd0aCwKICAgICAgICAnRGF0YSBsaXN0IGxlbmd0aCAke19kYXRhLmxlbmd0aH0gaW5jb25zaXN0ZW50ICcKICAgICAgICAnd2l0aCBlbnRpdHkgbGlzdCBsZW5ndGggJHtfbGlzdC5sZW5ndGh9LicpOwogICAgZW50aXR5Ll9pbmRleCA9IF9saXN0Lmxlbmd0aDsKICAgIF9saXN0LmFkZChlbnRpdHkpOwogICAgX3NpemUrKzsKICAgIGFzc2VydChkYXRhICE9IG51bGwpOwogICAgX2RhdGEuYWRkKGRhdGEpOwogICAgcmV0dXJuIGVudGl0eTsKICB9CgogIC8vLyBSZWdpc3RlcnMgYSBuZXcgW2VudGl0eV0gd2l0aCBhbiBhc3NvY2lhdGVkIFtkYXRhXSBvYmplY3QgYnkgdGhlIGdpdmVuCiAgLy8vIFtpbmRleF0uCiAgRTAgcmVnaXN0ZXJCeUluZGV4PEUwIGV4dGVuZHMgRSwgRDAgZXh0ZW5kcyBEPigKICAgICAgaW50IGluZGV4LCBFMCBlbnRpdHksIEQwIGRhdGEpIHsKICAgIGFzc2VydChpbmRleCA+PSBfbGlzdC5sZW5ndGgpOwogICAgX2xpc3QubGVuZ3RoID0gX2RhdGEubGVuZ3RoID0gaW5kZXg7CiAgICByZXR1cm4gcmVnaXN0ZXIoZW50aXR5LCBkYXRhKTsKICB9CgogIC8vLyBDYWxscyBbZl0gZm9yIGVhY2ggbm9uLW51bGwgZW50aXR5IHdpdGggaXRzIGNvcnJlc3BvbmRpbmcgZGF0YSBvYmplY3QuCiAgdm9pZCBmb3JFYWNoPEUwIGV4dGVuZHMgRSwgRDAgZXh0ZW5kcyBEPih2b2lkIGYoRTAgZW50aXR5LCBEMCBkYXRhKSkgewogICAgaWYgKF9saXN0Lmxlbmd0aCAhPSBfZGF0YS5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoJ0RhdGEgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgY3JlYXRlZC4nKTsKICAgIH0KICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBfbGlzdC5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgRSBlbnRpdHkgPSBfbGlzdFtpbmRleF07CiAgICAgIGlmIChlbnRpdHkgIT0gbnVsbCkgewogICAgICAgIGYoZW50aXR5LCBfZGF0YVtpbmRleF0pOwogICAgICB9CiAgICB9CiAgfQp9CgovLy8gQmFzZSBpbXBsZW1lbnRhdGlvbiBmb3IgYW4gaW5kZXggYmFzZWQgb2YgZW50aXRpZXMgb2YgdHlwZSBbRV0gd2l0aCBhCi8vLyBjb3JyZXNwb25kaW5nIGRhdGEgb2JqZWN0IG9mIHR5cGUgW0RdIGFuZCBhbiBlbnZpcm9ubWVudCBvZiB0eXBlIFtWXS4KYWJzdHJhY3QgY2xhc3MgRW50aXR5RGF0YUVudk1hcEJhc2U8RSBleHRlbmRzIF9JbmRleGVkLCBELCBWPgogICAgZXh0ZW5kcyBFbnRpdHlEYXRhTWFwQmFzZTxFLCBEPiB7CiAgTGlzdDxWPiBfZW52ID0gPFY+W107CgogIC8vLyBSZXR1cm5zIHRoZSBlbnZpcm9ubWVudCBvYmplY3Qgc3RvcmVkIGZvciB0aGUgW2luZGV4XXRoIGVudGl0eS4KICBWIGdldEVudihFIGVudGl0eSkgewogICAgaW50IGluZGV4ID0gZW50aXR5Ll9pbmRleDsKICAgIGlmIChpbmRleCA8IF9saXN0Lmxlbmd0aCAmJiBpbmRleCA+PSBfZW52Lmxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigKICAgICAgICAgICdFbnYgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgY3JlYXRlZCBmb3IgJHtfbGlzdFtpbmRleF19LicpOwogICAgfQogICAgcmV0dXJuIF9lbnZbaW5kZXhdOwogIH0KfQoKLy8vIEluZGV4IGJhc2VkIG9mIGVudGl0aWVzIG9mIHR5cGUgW0VdIHdpdGggYSBjb3JyZXNwb25kaW5nIGRhdGEgb2JqZWN0IG9mCi8vLyB0eXBlIFtEXSBhbmQgYW4gZW52aXJvbm1lbnQgb2YgdHlwZSBbVl0uCmNsYXNzIEVudGl0eURhdGFFbnZNYXA8RSBleHRlbmRzIF9JbmRleGVkLCBELCBWPgogICAgZXh0ZW5kcyBFbnRpdHlEYXRhRW52TWFwQmFzZTxFLCBELCBWPiB7CiAgLy8vIFJlZ2lzdGVycyBhIG5ldyBbZW50aXR5XSB3aXRoIGFuIGFzc29jaWF0ZWQgW2RhdGFdIG9iamVjdCBhbmQgZW52aXJvbm1lbnQKICAvLy8gW2Vudl0uCiAgLy8vCiAgLy8vIFRoZSBpbmRleCBvZiBbZW50aXR5XSBpcyBzZXQgdG8gbWF0Y2ggaXRzIGluZGV4IGluIHRoZSBlbnRpdHksIGRhdGEgYW5kCiAgLy8vIGVudmlyb25tZW50IGxpc3RzIGluIHRoaXMgbWFwLgogIEUwIHJlZ2lzdGVyPEUwIGV4dGVuZHMgRSwgRDAgZXh0ZW5kcyBELCBWMCBleHRlbmRzIFY+KAogICAgICBFMCBlbnRpdHksIEQwIGRhdGEsIFYwIGVudikgewogICAgYXNzZXJ0KGVudGl0eSAhPSBudWxsKTsKICAgIGFzc2VydChlbnRpdHkuX2luZGV4ID09IG51bGwpOwogICAgYXNzZXJ0KAogICAgICAgIF9saXN0Lmxlbmd0aCA9PSBfZGF0YS5sZW5ndGgsCiAgICAgICAgJ0RhdGEgbGlzdCBsZW5ndGggJHtfZGF0YS5sZW5ndGh9IGluY29uc2lzdGVudCAnCiAgICAgICAgJ3dpdGggZW50aXR5IGxpc3QgbGVuZ3RoICR7X2xpc3QubGVuZ3RofS4nKTsKICAgIGFzc2VydCgKICAgICAgICBfbGlzdC5sZW5ndGggPT0gX2Vudi5sZW5ndGgsCiAgICAgICAgJ0VudiBsaXN0IGxlbmd0aCAke19lbnYubGVuZ3RofSBpbmNvbnNpc3RlbnQgJwogICAgICAgICd3aXRoIGVudGl0eSBsaXN0IGxlbmd0aCAke19saXN0Lmxlbmd0aH0uJyk7CiAgICBlbnRpdHkuX2luZGV4ID0gX2xpc3QubGVuZ3RoOwogICAgX2xpc3QuYWRkKGVudGl0eSk7CiAgICBfc2l6ZSsrOwogICAgYXNzZXJ0KGRhdGEgIT0gbnVsbCk7CiAgICBfZGF0YS5hZGQoZGF0YSk7CiAgICBhc3NlcnQoZW52ICE9IG51bGwpOwogICAgX2Vudi5hZGQoZW52KTsKICAgIHJldHVybiBlbnRpdHk7CiAgfQoKICAvLy8gUmVnaXN0ZXJzIGEgbmV3IFtlbnRpdHldIHdpdGggYW4gYXNzb2NpYXRlZCBbZGF0YV0gb2JqZWN0IGFuZCBlbnZpcm9ubWVudAogIC8vLyBbZW52XSBieSB0aGUgZ2l2ZW4gW2luZGV4XS4KICBFMCByZWdpc3RlckJ5SW5kZXg8RTAgZXh0ZW5kcyBFLCBEMCBleHRlbmRzIEQsIFYwIGV4dGVuZHMgVj4oCiAgICAgIGludCBpbmRleCwgRTAgZW50aXR5LCBEMCBkYXRhLCBWMCBlbnYpIHsKICAgIGFzc2VydChpbmRleCA+PSBfbGlzdC5sZW5ndGgpOwogICAgX2xpc3QubGVuZ3RoID0gX2RhdGEubGVuZ3RoID0gX2Vudi5sZW5ndGggPSBpbmRleDsKICAgIHJldHVybiByZWdpc3RlcihlbnRpdHksIGRhdGEsIGVudik7CiAgfQoKICAvLy8gQ2FsbHMgW2ZdIGZvciBlYWNoIG5vbi1udWxsIGVudGl0eSB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGRhdGEgb2JqZWN0IGFuZAogIC8vLyBlbnZpcm9ubWVudC4KICB2b2lkIGZvckVhY2g8RTAgZXh0ZW5kcyBFLCBEMCBleHRlbmRzIEQsIFYwIGV4dGVuZHMgVj4oCiAgICAgIHZvaWQgZihFMCBlbnRpdHksIEQwIGRhdGEsIFYwIGVudikpIHsKICAgIGlmIChfbGlzdC5sZW5ndGggIT0gX2RhdGEubGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCdEYXRhIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGNyZWF0ZWQuJyk7CiAgICB9CiAgICBpZiAoX2xpc3QubGVuZ3RoICE9IF9lbnYubGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCdFbnYgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgY3JlYXRlZC4nKTsKICAgIH0KICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBfbGlzdC5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgRSBlbnRpdHkgPSBfbGlzdFtpbmRleF07CiAgICAgIGlmIChlbnRpdHkgIT0gbnVsbCkgewogICAgICAgIGYoZW50aXR5LCBfZGF0YVtpbmRleF0sIF9lbnZbaW5kZXhdKTsKICAgICAgfQogICAgfQogIH0KfQqA+gBOTjwBTAEkARoOAgFKRiIMJgIBRkQgDCYCAUhFIQwiAgEwMAEiNQFFATQkTCcCAUpGIgIBQCACAUgzERkBLyoBOhkBQiICAS0/IAZRCykcIyIXDRMEATU7IxodBAEqMjkfHBMIBgQCAU0rOB8ZAT8YHzkcSwYZBAIBTRFNJR4jFRUEAUEGTRlAHCMMJjk1IhcNGhUTBAFNDzInIykjBAFNSShIBjkfHCEIBgQCAUpKPiYYAUYXHzgcSgYYBAIBTC0xLFANBk4lOSQcIwwmOTUMJTc1IhcNGhUZExMEAVAiQC8jNygEAVATOiwoSAYnRwY5HxwuCAYEAgEqcGFja2FnZTpjb21waWxlci9zcmMvZWxlbWVudHMvaW5kZXhlZC5kYXJ0L3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2lyL2NvbnN0YW50cy5kYXJ0lhUvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS9jb25zdGFudF9ldmFsdWF0b3IuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV91bnN0YWJsZS9kYXJ0MmpzLmRhcnQnIGFzIGlyOwoKaW1wb3J0ICcuLi9rZXJuZWwvZGFydDJqc190YXJnZXQuZGFydCc7Cgp0eXBlZGVmIFJlcG9ydEVycm9yRnVuY3Rpb24gPSB2b2lkIEZ1bmN0aW9uKAogICAgaXIuTG9jYXRlZE1lc3NhZ2UgbWVzc2FnZSwgTGlzdDxpci5Mb2NhdGVkTWVzc2FnZT4gY29udGV4dCk7CgpjbGFzcyBEYXJ0MmpzQ29uc3RhbnRFdmFsdWF0b3IgZXh0ZW5kcyBpci5Db25zdGFudEV2YWx1YXRvciB7CiAgZmluYWwgYm9vbCBfc3VwcG9ydFJlZXZhbHVhdGlvbkZvclRlc3Rpbmc7CgogIGJvb2wgcmVxdWlyZXNDb25zdGFudDsKCiAgRGFydDJqc0NvbnN0YW50RXZhbHVhdG9yKAogICAgICBpci5UeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LCBSZXBvcnRFcnJvckZ1bmN0aW9uIHJlcG9ydEVycm9yLAogICAgICB7Ym9vbCBlbmFibGVBc3NlcnRzLAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50OiBjb25zdCB7fSwKICAgICAgYm9vbCBzdXBwb3J0UmVldmFsdWF0aW9uRm9yVGVzdGluZzogZmFsc2V9KQogICAgICA6IF9zdXBwb3J0UmVldmFsdWF0aW9uRm9yVGVzdGluZyA9IHN1cHBvcnRSZWV2YWx1YXRpb25Gb3JUZXN0aW5nLAogICAgICAgIHN1cGVyKGNvbnN0IERhcnQyanNDb25zdGFudHNCYWNrZW5kKCksIGVudmlyb25tZW50LCB0eXBlRW52aXJvbm1lbnQsCiAgICAgICAgICAgIGVuYWJsZUFzc2VydHMsIG5ldyBFcnJvclJlcG9ydGVyKHJlcG9ydEVycm9yKSk7CgogIEBvdmVycmlkZQogIEVycm9yUmVwb3J0ZXIgZ2V0IGVycm9yUmVwb3J0ZXIgPT4gc3VwZXIuZXJyb3JSZXBvcnRlcjsKCiAgQG92ZXJyaWRlCiAgaXIuQ29uc3RhbnQgZXZhbHVhdGUoaXIuRXhwcmVzc2lvbiBub2RlLCB7Ym9vbCByZXF1aXJlQ29uc3RhbnQ6IHRydWV9KSB7CiAgICBlcnJvclJlcG9ydGVyLnJlcXVpcmVzQ29uc3RhbnQgPSByZXF1aXJlQ29uc3RhbnQ7CiAgICBpZiAobm9kZSBpcyBpci5Db25zdGFudEV4cHJlc3Npb24pIHsKICAgICAgaXIuQ29uc3RhbnQgY29uc3RhbnQgPSBub2RlLmNvbnN0YW50OwogICAgICBpZiAoY29uc3RhbnQgaXMgaXIuVW5ldmFsdWF0ZWRDb25zdGFudCkgewogICAgICAgIGlyLkNvbnN0YW50IHJlc3VsdCA9IHN1cGVyLmV2YWx1YXRlKGNvbnN0YW50LmV4cHJlc3Npb24pOwogICAgICAgIGFzc2VydCgKICAgICAgICAgICAgcmVzdWx0IGlzIGlyLlVuZXZhbHVhdGVkQ29uc3RhbnQgfHwKICAgICAgICAgICAgICAgICFyZXN1bHQuYWNjZXB0KGNvbnN0IFVuZXZhbHVhdGVkQ29uc3RhbnRGaW5kZXIoKSksCiAgICAgICAgICAgICJJbnZhbGlkIGNvbnN0YW50IHJlc3VsdCAkcmVzdWx0IGZyb20gJHtjb25zdGFudC5leHByZXNzaW9ufS4iKTsKICAgICAgICBpZiAoIV9zdXBwb3J0UmVldmFsdWF0aW9uRm9yVGVzdGluZykgewogICAgICAgICAgbm9kZS5jb25zdGFudCA9IHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICByZXR1cm4gY29uc3RhbnQ7CiAgICB9CiAgICBpZiAocmVxdWlyZUNvbnN0YW50KSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEhhbmRsZSByZXBvcnRpbmcgb2YgY29tcGlsZS10aW1lIGNvbnN0YW50CiAgICAgIC8vIGV2YWx1YXRpb24gZXJyb3JzLgogICAgICByZXR1cm4gc3VwZXIuZXZhbHVhdGUobm9kZSk7CiAgICB9IGVsc2UgewogICAgICB0cnkgewogICAgICAgIHJldHVybiBzdXBlci5ldmFsdWF0ZShub2RlKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgfQp9CgpjbGFzcyBFcnJvclJlcG9ydGVyIGltcGxlbWVudHMgaXIuRXJyb3JSZXBvcnRlciB7CiAgZmluYWwgUmVwb3J0RXJyb3JGdW5jdGlvbiBfcmVwb3J0RXJyb3I7CiAgYm9vbCByZXF1aXJlc0NvbnN0YW50OwoKICBFcnJvclJlcG9ydGVyKHRoaXMuX3JlcG9ydEVycm9yKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCByZXBvcnRJbnZhbGlkRXhwcmVzc2lvbihpci5JbnZhbGlkRXhwcmVzc2lvbiBub2RlKSB7CiAgICAvLyBJZ25vcmUuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlcG9ydChpci5Mb2NhdGVkTWVzc2FnZSBtZXNzYWdlLCBMaXN0PGlyLkxvY2F0ZWRNZXNzYWdlPiBjb250ZXh0KSB7CiAgICBpZiAocmVxdWlyZXNDb25zdGFudCkgewogICAgICBfcmVwb3J0RXJyb3IobWVzc2FnZSwgY29udGV4dCk7CiAgICB9CiAgfQp9CgovLy8gW2lyLkNvbnN0YW50XSB2aXNpdG9yIHRoYXQgcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZpc2l0b3IgY29uc3RhbnQgY29udGFpbnMKLy8vIGFuIFtpci5VbmV2YWx1YXRlZENvbnN0YW50XS4KY2xhc3MgVW5ldmFsdWF0ZWRDb25zdGFudEZpbmRlciBleHRlbmRzIGlyLkNvbnN0YW50VmlzaXRvcjxib29sPiB7CiAgY29uc3QgVW5ldmFsdWF0ZWRDb25zdGFudEZpbmRlcigpOwoKICBAb3ZlcnJpZGUKICBib29sIGRlZmF1bHRDb25zdGFudChpci5Db25zdGFudCBub2RlKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFVuZXZhbHVhdGVkQ29uc3RhbnQoaXIuVW5ldmFsdWF0ZWRDb25zdGFudCBub2RlKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudChpci5QYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50IG5vZGUpIHsKICAgIHJldHVybiBub2RlLnRlYXJPZmZDb25zdGFudC5hY2NlcHQodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0SW5zdGFuY2VDb25zdGFudChpci5JbnN0YW5jZUNvbnN0YW50IG5vZGUpIHsKICAgIGZvciAoaXIuQ29uc3RhbnQgdmFsdWUgaW4gbm9kZS5maWVsZFZhbHVlcy52YWx1ZXMpIHsKICAgICAgaWYgKHZhbHVlLmFjY2VwdCh0aGlzKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0U2V0Q29uc3RhbnQoaXIuU2V0Q29uc3RhbnQgbm9kZSkgewogICAgZm9yIChpci5Db25zdGFudCB2YWx1ZSBpbiBub2RlLmVudHJpZXMpIHsKICAgICAgaWYgKHZhbHVlLmFjY2VwdCh0aGlzKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0TGlzdENvbnN0YW50KGlyLkxpc3RDb25zdGFudCBub2RlKSB7CiAgICBmb3IgKGlyLkNvbnN0YW50IHZhbHVlIGluIG5vZGUuZW50cmllcykgewogICAgICBpZiAodmFsdWUuYWNjZXB0KHRoaXMpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRNYXBDb25zdGFudChpci5NYXBDb25zdGFudCBub2RlKSB7CiAgICBmb3IgKGlyLkNvbnN0YW50TWFwRW50cnkgZW50cnkgaW4gbm9kZS5lbnRyaWVzKSB7CiAgICAgIGlmIChlbnRyeS5rZXkuYWNjZXB0KHRoaXMpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKGVudHJ5LnZhbHVlLmFjY2VwdCh0aGlzKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CgovLy8gQ2xhc3MgdG8gcmVwcmVzZW50IGEgcmVmZXJlbmNlIHRvIGEgY29uc3RhbnQgaW4gYWxsb2NhdGlvbiBub2Rlcy4KLy8vCi8vLyBUaGlzIGNsYXNzIGlzIG5lZWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHNlcmlhbGl6YXRpb24gb2YgcmVmZXJlbmNlcyB0bwovLy8gY29uc3RhbnQgbm9kZXMuIFNpbmNlIHRoZSBjb25zdGFudCBub2RlcyBhcmUgbm90IFtpci5UcmVlTm9kZV1zIHdlIGNhbiBvbmx5Ci8vLyBzZXJpYWxpemUgdGhlIGNvbnN0YW50cyBhcyB2YWx1ZXMgd2hpY2ggd291bGQgYnlwYXNzIGJ5IHRoZSBjYW5vbmljYWxpemF0aW9uCi8vLyBwZXJmb3JtZWQgYnkgdGhlIENGRS4gVGhpcyBjbGFzcyBleHRlbmRzIG9ubHkgYXMgYSB0cmljayB0byBlYXNpbHkgcGFzcwovLy8gaXQgdGhyb3VnaCBzZXJpYWxpemF0aW9uLgovLy8KLy8vIEJ5IGFkZGluZyBhIHJlZmVyZW5jZSB0byB0aGUgY29uc3RhbnQgZXhwcmVzc2lvbiBpbiB3aGljaCB0aGUgY29uc3RhbnQKLy8vIG9jY3VycmVkLCB3ZSBjYW4gc2VyaWFsaXplIHJlZmVyZW5jZXMgdG8gY29uc3RhbnRzIGluIHR3byBzdGVwczogYSByZWZlcmVuY2UKLy8vIHRvIHRoZSBjb25zdGFudCBleHByZXNzaW9uIGZvbGxvd2VkIGJ5IGFuIGluZGV4IG9mIHRoZSByZWZlcnJlZCBjb25zdGFudAovLy8gaW4gdGhlIHRyYXZlcnNhbCBvcmRlciBvZiB0aGUgY29uc3RhbnQgaGVsZCBieSB0aGUgY29uc3RhbnQgZXhwcmVzc2lvbi4KLy8vCi8vLyBUaGlzIGlzIHVzZWQgZm9yIGxpc3QsIG1hcCwgYW5kIHNldCBsaXRlcmFscy4KY2xhc3MgQ29uc3RhbnRSZWZlcmVuY2UgZXh0ZW5kcyBpci5UcmVlTm9kZSB7CiAgZmluYWwgaXIuQ29uc3RhbnRFeHByZXNzaW9uIGV4cHJlc3Npb247CiAgZmluYWwgaXIuQ29uc3RhbnQgY29uc3RhbnQ7CgogIENvbnN0YW50UmVmZXJlbmNlKHRoaXMuZXhwcmVzc2lvbiwgdGhpcy5jb25zdGFudCk7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDaGlsZHJlbihpci5WaXNpdG9yIHYpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDb25zdGFudFJlZmVyZW5jZS52aXNpdENoaWxkcmVuIik7CiAgfQoKICBAb3ZlcnJpZGUKICBhY2NlcHQoaXIuVHJlZVZpc2l0b3IgdikgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNvbnN0YW50UmVmZXJlbmNlLmFjY2VwdCIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdHJhbnNmb3JtQ2hpbGRyZW4oaXIuVHJhbnNmb3JtZXIgdikgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNvbnN0YW50UmVmZXJlbmNlLnRyYW5zZm9ybUNoaWxkcmVuIik7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IDEzICogY29uc3RhbnQuaGFzaENvZGU7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gb3RoZXIgaXMgQ29uc3RhbnRSZWZlcmVuY2UgJiYgY29uc3RhbnQgPT0gb3RoZXIuY29uc3RhbnQ7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnQ29uc3RhbnRSZWZlcmVuY2UoY29uc3RhbnQ9JGNvbnN0YW50KSc7Cn0KgL8ATk48ASg1TEABKAEtQQE+LQEZARxLGzEySE08AQw6AQxLNiksMEIQMENNLyIKFwgXBhtIHCMNDCUUFQgGBAIBMioZASQBDDwPBAEMTBwmBgQCAU8hQyUBDDMBDEYBDFEuBAEMOTkgFQgGEgQBDC8uIBUIBhIEAQwxLiAVCAYSBAEMLzYkFQgmFQgGEgQCAUYETFBRTB4ES1FNTAQyLioeATUBDCVDBAEMHTwEAQwoRwQBDC4BDCMtRQQBDEACASZwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci9jb25zdGFudHMuZGFydDZzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pci9zdGF0aWNfdHlwZV9iYXNlLmRhcnSaRy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JyBhcyBpcjsKCi8vLyBTcGVjaWFsIGJvdHRvbSB0eXBlIHVzZWQgdG8gc2lnbmFsIHRoYXQgYW4gZXhwcmVzc2lvbiBvciBzdGF0ZW1lbnQgZG9lcwovLy8gbm90IGNvbXBsZXRlIG5vcm1hbGx5LiBUaGlzIGlzIHRoZSBjYXNlIGZvciBpbnN0YW5jZSBvZiB0aHJvdyBleHByZXNzaW9ucwovLy8gYW5kIHJldHVybiBzdGF0ZW1lbnRzLgpjbGFzcyBEb2VzTm90Q29tcGxldGVUeXBlIGV4dGVuZHMgaXIuQm90dG9tVHlwZSB7CiAgY29uc3QgRG9lc05vdENvbXBsZXRlVHlwZSgpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnRG9lc05vdENvbXBsZXRlVHlwZSgpJzsKfQoKLy8vIFNwZWNpYWwgaW50ZXJmYWNlIHR5cGUgdXNlZCB0byBzaWduYWwgdGhhdCB0aGUgc3RhdGljIHR5cGUgb2YgYW4gZXhwcmVzc2lvbgovLy8gaGFzIHByZWNpc2lvbiBvZiBhIHRoaXMtZXhwcmVzc2lvbi4KY2xhc3MgVGhpc0ludGVyZmFjZVR5cGUgZXh0ZW5kcyBpci5JbnRlcmZhY2VUeXBlIHsKICBUaGlzSW50ZXJmYWNlVHlwZShpci5DbGFzcyBjbGFzc05vZGUsIFtMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzXSkKICAgICAgOiBzdXBlcihjbGFzc05vZGUsIHR5cGVBcmd1bWVudHMpOwoKICBmYWN0b3J5IFRoaXNJbnRlcmZhY2VUeXBlLmZyb20oaXIuSW50ZXJmYWNlVHlwZSB0eXBlKSA9PiB0eXBlICE9IG51bGwKICAgICAgPyBuZXcgVGhpc0ludGVyZmFjZVR5cGUodHlwZS5jbGFzc05vZGUsIHR5cGUudHlwZUFyZ3VtZW50cykKICAgICAgOiBudWxsOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAndGhpczoke3N1cGVyLnRvU3RyaW5nKCl9JzsKfQoKLy8vIFNwZWNpYWwgaW50ZXJmYWNlIHR5cGUgdXNlZCB0byBzaWduYWwgdGhhdCB0aGUgc3RhdGljIHR5cGUgb2YgYW4gZXhwcmVzc2lvbgovLy8gaXMgZXhhY3QsIGkuZS4gdGhlIHJ1bnRpbWUgdHlwZSBpcyBub3QgYSBzdWJ0eXBlIG9yIHN1YmNsYXNzIG9mIHRoZSB0eXBlLgpjbGFzcyBFeGFjdEludGVyZmFjZVR5cGUgZXh0ZW5kcyBpci5JbnRlcmZhY2VUeXBlIHsKICBFeGFjdEludGVyZmFjZVR5cGUoaXIuQ2xhc3MgY2xhc3NOb2RlLCBbTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50c10pCiAgICAgIDogc3VwZXIoY2xhc3NOb2RlLCB0eXBlQXJndW1lbnRzKTsKCiAgZmFjdG9yeSBFeGFjdEludGVyZmFjZVR5cGUuZnJvbShpci5JbnRlcmZhY2VUeXBlIHR5cGUpID0+IHR5cGUgIT0gbnVsbAogICAgICA/IG5ldyBFeGFjdEludGVyZmFjZVR5cGUodHlwZS5jbGFzc05vZGUsIHR5cGUudHlwZUFyZ3VtZW50cykKICAgICAgOiBudWxsOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnZXhhY3Q6JHtzdXBlci50b1N0cmluZygpfSc7Cn0KCi8vLyBCYXNlIGNsYXNzIGZvciBjb21wdXRpbmcgc3RhdGljIHR5cGVzLgovLy8KLy8vIFRoaXMgY2xhc3MgdXNlcyB0aGUgdmlzaXRvciBwYXR0ZXJuIHRvIGNvbXB1dGUgdGhlIHN0YXRpYyB0eXBlIHRoYXQgYXJlCi8vLyBkaXJlY3RseSBkZWZpbmVkIGJ5IHRoZSBleHByZXNzaW9uIGtpbmQuCi8vLwovLy8gU3ViY2xhc3NlcyB3aWxsIGNvbXB1dGUgdGhlIHN0YXRpYyB0eXBlIG9yIHVzZSBhIGNhY2hlIHRvIGxvb2sgdXAgdGhlIHN0YXRpYwovLy8gdHlwZSBvZiBleHByZXNzaW9uIHdob3NlIHN0YXRpYyB0eXBlIGlzIG5vdCBkaXJlY3RseSBkZWZpbmVkIGJ5IHRoZQovLy8gZXhwcmVzc2lvbiBraW5kLiBGb3IgaW5zdGFuY2UgbWV0aG9kIGludm9jYXRpb25zIHdob3NlIHN0YXRpYyB0eXBlIGRlcGVuZAovLy8gb24gdGhlIHN0YXRpYyB0eXBlcyBvZiB0aGUgcmVjZWl2ZXIgYW5kIHR5cGUgYXJndW1lbnRzIGFuZCB0aGUgc2lnbmF0dXJlCi8vLyBvZiB0aGUgdGFyZ2V0ZWQgcHJvY2VkdXJlLgphYnN0cmFjdCBjbGFzcyBTdGF0aWNUeXBlQmFzZSBleHRlbmRzIGlyLlZpc2l0b3I8aXIuRGFydFR5cGU+IHsKICBmaW5hbCBpci5UeXBlRW52aXJvbm1lbnQgX3R5cGVFbnZpcm9ubWVudDsKCiAgU3RhdGljVHlwZUJhc2UodGhpcy5fdHlwZUVudmlyb25tZW50KTsKCiAgZmFpbChTdHJpbmcgbWVzc2FnZSkgPT4gbWVzc2FnZTsKCiAgaXIuVHlwZUVudmlyb25tZW50IGdldCB0eXBlRW52aXJvbm1lbnQgPT4gX3R5cGVFbnZpcm9ubWVudDsKCiAgVGhpc0ludGVyZmFjZVR5cGUgZ2V0IHRoaXNUeXBlOwoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSBkZWZhdWx0Tm9kZShpci5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiBudWxsOwogIH0KCiAgaXIuRGFydFR5cGUgdmlzaXROb2RlKGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIG5vZGU/LmFjY2VwdCh0aGlzKTsKICB9CgogIE51bGwgdmlzaXROb2RlcyhMaXN0PGlyLk5vZGU+IG5vZGVzKSB7CiAgICBmb3IgKGlyLk5vZGUgbm9kZSBpbiBub2RlcykgewogICAgICB2aXNpdE5vZGUobm9kZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSBkZWZhdWx0RXhwcmVzc2lvbihpci5FeHByZXNzaW9uIG5vZGUpIHsKICAgIHRocm93IGZhaWwoJ1VuaGFuZGxlZCBub2RlICRub2RlICgke25vZGUucnVudGltZVR5cGV9KScpOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRBc0V4cHJlc3Npb24oaXIuQXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBub2RlLnR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdEF3YWl0RXhwcmVzc2lvbihpci5Bd2FpdEV4cHJlc3Npb24gbm9kZSkgewogICAgcmV0dXJuIHR5cGVFbnZpcm9ubWVudC51bmZ1dHVyZVR5cGUodmlzaXROb2RlKG5vZGUub3BlcmFuZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRCb29sTGl0ZXJhbChpci5Cb29sTGl0ZXJhbCBub2RlKSA9PiB0eXBlRW52aXJvbm1lbnQuYm9vbFR5cGU7CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0Q2hlY2tMaWJyYXJ5SXNMb2FkZWQoaXIuQ2hlY2tMaWJyYXJ5SXNMb2FkZWQgbm9kZSkgPT4KICAgICAgdHlwZUVudmlyb25tZW50Lm9iamVjdFR5cGU7CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0U3RyaW5nTGl0ZXJhbChpci5TdHJpbmdMaXRlcmFsIG5vZGUpID0+CiAgICAgIHR5cGVFbnZpcm9ubWVudC5zdHJpbmdUeXBlOwoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oaXIuU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICByZXR1cm4gdHlwZUVudmlyb25tZW50LnN0cmluZ1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdE51bGxMaXRlcmFsKGlyLk51bGxMaXRlcmFsIG5vZGUpID0+IHR5cGVFbnZpcm9ubWVudC5udWxsVHlwZTsKCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRJbnRMaXRlcmFsKGlyLkludExpdGVyYWwgbm9kZSkgPT4gdHlwZUVudmlyb25tZW50LmludFR5cGU7CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0RG91YmxlTGl0ZXJhbChpci5Eb3VibGVMaXRlcmFsIG5vZGUpID0+CiAgICAgIHR5cGVFbnZpcm9ubWVudC5kb3VibGVUeXBlOwoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFN5bWJvbExpdGVyYWwoaXIuU3ltYm9sTGl0ZXJhbCBub2RlKSA9PgogICAgICB0eXBlRW52aXJvbm1lbnQuc3ltYm9sVHlwZTsKCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRMaXN0TGl0ZXJhbChpci5MaXN0TGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gdHlwZUVudmlyb25tZW50LmxpdGVyYWxMaXN0VHlwZShub2RlLnR5cGVBcmd1bWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFNldExpdGVyYWwoaXIuU2V0TGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gdHlwZUVudmlyb25tZW50LmxpdGVyYWxTZXRUeXBlKG5vZGUudHlwZUFyZ3VtZW50KTsKICB9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0TWFwTGl0ZXJhbChpci5NYXBMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiB0eXBlRW52aXJvbm1lbnQubGl0ZXJhbE1hcFR5cGUobm9kZS5rZXlUeXBlLCBub2RlLnZhbHVlVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFZhcmlhYmxlU2V0KGlyLlZhcmlhYmxlU2V0IG5vZGUpIHsKICAgIHJldHVybiB2aXNpdE5vZGUobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFByb3BlcnR5U2V0KGlyLlByb3BlcnR5U2V0IG5vZGUpIHsKICAgIHJldHVybiB2aXNpdE5vZGUobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdERpcmVjdFByb3BlcnR5U2V0KGlyLkRpcmVjdFByb3BlcnR5U2V0IG5vZGUpIHsKICAgIHJldHVybiB2aXNpdE5vZGUobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUaGlzSW50ZXJmYWNlVHlwZSB2aXNpdFRoaXNFeHByZXNzaW9uKGlyLlRoaXNFeHByZXNzaW9uIG5vZGUpID0+IHRoaXNUeXBlOwoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFN0YXRpY0dldChpci5TdGF0aWNHZXQgbm9kZSkgPT4gbm9kZS50YXJnZXQuZ2V0dGVyVHlwZTsKCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRTdGF0aWNTZXQoaXIuU3RhdGljU2V0IG5vZGUpIHsKICAgIHJldHVybiB2aXNpdE5vZGUobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFN1cGVyUHJvcGVydHlTZXQoaXIuU3VwZXJQcm9wZXJ0eVNldCBub2RlKSB7CiAgICByZXR1cm4gdmlzaXROb2RlKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRUaHJvdyhpci5UaHJvdyBub2RlKSA9PiBjb25zdCBEb2VzTm90Q29tcGxldGVUeXBlKCk7CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0UmV0aHJvdyhpci5SZXRocm93IG5vZGUpID0+IGNvbnN0IERvZXNOb3RDb21wbGV0ZVR5cGUoKTsKCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRMb2dpY2FsRXhwcmVzc2lvbihpci5Mb2dpY2FsRXhwcmVzc2lvbiBub2RlKSA9PgogICAgICB0eXBlRW52aXJvbm1lbnQuYm9vbFR5cGU7CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0Tm90KGlyLk5vdCBub2RlKSB7CiAgICByZXR1cm4gdHlwZUVudmlyb25tZW50LmJvb2xUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRDb25kaXRpb25hbEV4cHJlc3Npb24oaXIuQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBub2RlLnN0YXRpY1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdElzRXhwcmVzc2lvbihpci5Jc0V4cHJlc3Npb24gbm9kZSkgewogICAgcmV0dXJuIHR5cGVFbnZpcm9ubWVudC5ib29sVHlwZTsKICB9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0VHlwZUxpdGVyYWwoaXIuVHlwZUxpdGVyYWwgbm9kZSkgPT4gdHlwZUVudmlyb25tZW50LnR5cGVUeXBlOwoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbihpci5GdW5jdGlvbkV4cHJlc3Npb24gbm9kZSkgewogICAgcmV0dXJuIG5vZGUuZnVuY3Rpb24uZnVuY3Rpb25UeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRMZXQoaXIuTGV0IG5vZGUpIHsKICAgIHJldHVybiB2aXNpdE5vZGUobm9kZS5ib2R5KTsKICB9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0QmxvY2tFeHByZXNzaW9uKGlyLkJsb2NrRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gdmlzaXROb2RlKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRJbnZhbGlkRXhwcmVzc2lvbihpci5JbnZhbGlkRXhwcmVzc2lvbiBub2RlKSA9PgogICAgICBjb25zdCBEb2VzTm90Q29tcGxldGVUeXBlKCk7CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0TG9hZExpYnJhcnkoaXIuTG9hZExpYnJhcnkgbm9kZSkgewogICAgcmV0dXJuIHR5cGVFbnZpcm9ubWVudC5mdXR1cmVUeXBlKGNvbnN0IGlyLkR5bmFtaWNUeXBlKCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRDb25zdGFudEV4cHJlc3Npb24oaXIuQ29uc3RhbnRFeHByZXNzaW9uIG5vZGUpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEluY2x1ZGUgaW50ZXJmYWNlIGV4YWN0bmVzcyB3aGVyZSBhcHBsaWNhYmxlLgogICAgcmV0dXJuIG5vZGUuZ2V0U3RhdGljVHlwZSh0eXBlRW52aXJvbm1lbnQpOwogIH0KfQqA6wBOTjwBKDQvMTUBTE4bMh8BDDACAVAoM0spAUhCDgEMMwIBUE40TCkBSUMOAQw0AgErBEwtBFFITk0fQC0BKQEjAT4BIgEMKhEEASgfBAEpIhcGBAEMNj4EAQw4FgQBDD5CBAEMUQEMSSIBDDsiAQxGJwQBDFEBDE4BDDsiAQw7IgEMNj8EAQw0PgQBDDRJBAEMNiIEAQw2IgQBDEIiBAEMTQEMSwEMMiIEAQxAIgQBDEgBDEwBDEMgAQwmJQQBDEocBAEMOCUEAQxRAQxEJwQBDCYhBAEMPiIEAQxDIwEMNj8EAQxESjAEAgEtcGFja2FnZTpjb21waWxlci9zcmMvaXIvc3RhdGljX3R5cGVfYmFzZS5kYXJ0N3Nka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jb2xsZWN0aW9uL2xpYi9jb2xsZWN0aW9uLmRhcnSDOi8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpleHBvcnQgInNyYy9hbGdvcml0aG1zLmRhcnQiOwpleHBvcnQgInNyYy9jYW5vbmljYWxpemVkX21hcC5kYXJ0IjsKZXhwb3J0ICJzcmMvY29tYmluZWRfd3JhcHBlcnMvY29tYmluZWRfaXRlcmFibGUuZGFydCI7CmV4cG9ydCAic3JjL2NvbWJpbmVkX3dyYXBwZXJzL2NvbWJpbmVkX2xpc3QuZGFydCI7CmV4cG9ydCAic3JjL2NvbWJpbmVkX3dyYXBwZXJzL2NvbWJpbmVkX21hcC5kYXJ0IjsKZXhwb3J0ICJzcmMvY29tcGFyYXRvcnMuZGFydCI7CmV4cG9ydCAic3JjL2VxdWFsaXR5LmRhcnQiOwpleHBvcnQgInNyYy9lcXVhbGl0eV9tYXAuZGFydCI7CmV4cG9ydCAic3JjL2VxdWFsaXR5X3NldC5kYXJ0IjsKZXhwb3J0ICJzcmMvZnVuY3Rpb25zLmRhcnQiOwpleHBvcnQgInNyYy9pdGVyYWJsZV96aXAuZGFydCI7CmV4cG9ydCAic3JjL3ByaW9yaXR5X3F1ZXVlLmRhcnQiOwpleHBvcnQgInNyYy9xdWV1ZV9saXN0LmRhcnQiOwpleHBvcnQgInNyYy91bmlvbl9zZXQuZGFydCI7CmV4cG9ydCAic3JjL3VuaW9uX3NldF9jb250cm9sbGVyLmRhcnQiOwpleHBvcnQgInNyYy91bm1vZGlmaWFibGVfd3JhcHBlcnMuZGFydCI7CmV4cG9ydCAic3JjL3dyYXBwZXJzLmRhcnQiOwoXAE5OPAEeJTczMh8cICAdICIeHSgpHAEicGFja2FnZTpjb2xsZWN0aW9uL2NvbGxlY3Rpb24uZGFydDdzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvZGFydDJqc19pbmZvL2xpYi9zcmMvdXRpbC5kYXJ0jK0vLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzX2luZm8uc3JjLnV0aWw7CgppbXBvcnQgJ3BhY2thZ2U6ZGFydDJqc19pbmZvL2luZm8uZGFydCc7CgppbXBvcnQgJ2dyYXBoLmRhcnQnOwoKLy8vIENvbXB1dGVzIGEgZ3JhcGggb2YgZGVwZW5kZW5jaWVzIGZyb20gW2luZm9dLgpHcmFwaDxJbmZvPiBncmFwaEZyb21JbmZvKEFsbEluZm8gaW5mbykgewogIHByaW50KCcgIGluZm86IGRlcGVuZGVuY3kgZ3JhcGggaW5mb3JtYXRpb24gaXMgd29yayBpbiBwcm9ncmVzcyBhbmQnCiAgICAgICcgbWlnaHQgYmUgaW5jb21wbGV0ZScpOwogIC8vIE5vdGU6IHdlIGFyZSBjb21iaW5pbmcgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiB0aGF0IGlzIGNvbXB1dGVkIGluIHR3byB3YXlzCiAgLy8gKGZ1bmN0aW9uSW5mby51c2VzIHZzIGFsbEluZm8uZGVwZW5kZW5jaWVzKS4KICAvLyBUT0RPKHNpZ211bmQpOiBmaXggaW5jb25zaXN0ZW5jaWVzIGJldHdlZW4gdGhlc2UgdHdvIHdheXMsIHN0aWNrIHdpdGggb25lCiAgLy8gb2YgdGhlbS4KICAvLyBUT0RPKHNpZ211bmQpOiBjcmVhdGUgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBJbmZvR3JhcGgsIGluc3RlYWQgb2YKICAvLyB1c2luZyB0aGUgRWRnZUxpc3RHcmFwaC4KICB2YXIgZ3JhcGggPSBuZXcgRWRnZUxpc3RHcmFwaDxJbmZvPigpOwogIGZvciAodmFyIGYgaW4gaW5mby5mdW5jdGlvbnMpIHsKICAgIGdyYXBoLmFkZE5vZGUoZik7CiAgICBmb3IgKHZhciBnIGluIGYudXNlcykgewogICAgICBncmFwaC5hZGRFZGdlKGYsIGcudGFyZ2V0KTsKICAgIH0KICAgIGlmIChpbmZvLmRlcGVuZGVuY2llc1tmXSAhPSBudWxsKSB7CiAgICAgIGZvciAodmFyIGcgaW4gaW5mby5kZXBlbmRlbmNpZXNbZl0pIHsKICAgICAgICBncmFwaC5hZGRFZGdlKGYsIGcpOwogICAgICB9CiAgICB9CiAgfQoKICBmb3IgKHZhciBmIGluIGluZm8uZmllbGRzKSB7CiAgICBncmFwaC5hZGROb2RlKGYpOwogICAgZm9yICh2YXIgZyBpbiBmLnVzZXMpIHsKICAgICAgZ3JhcGguYWRkRWRnZShmLCBnLnRhcmdldCk7CiAgICB9CiAgICBpZiAoaW5mby5kZXBlbmRlbmNpZXNbZl0gIT0gbnVsbCkgewogICAgICBmb3IgKHZhciBnIGluIGluZm8uZGVwZW5kZW5jaWVzW2ZdKSB7CiAgICAgICAgZ3JhcGguYWRkRWRnZShmLCBnKTsKICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIGdyYXBoOwp9CgovLy8gUHJvdmlkZSBhIHVuaXF1ZSBsb25nIG5hbWUgYXNzb2NpYXRlZCB3aXRoIFtpbmZvXS4KLy8gVE9ETyhzaWdtdW5kKTogZ3VhcmFudGVlIHRoYXQgdGhlIG5hbWUgaXMgYWN0dWFsbHkgdW5pcXVlLgpTdHJpbmcgbG9uZ05hbWUoSW5mbyBpbmZvLCB7Ym9vbCB1c2VMaWJyYXJ5VXJpOiBmYWxzZSwgYm9vbCBmb3JJZDogZmFsc2V9KSB7CiAgdmFyIGluZm9QYXRoID0gW107CiAgd2hpbGUgKGluZm8gIT0gbnVsbCkgewogICAgaW5mb1BhdGguYWRkKGluZm8pOwogICAgaW5mbyA9IGluZm8ucGFyZW50OwogIH0KICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgdmFyIGZpcnN0ID0gdHJ1ZTsKICBmb3IgKHZhciBzZWdtZW50IGluIGluZm9QYXRoLnJldmVyc2VkKSB7CiAgICBpZiAoIWZpcnN0KSBzYi53cml0ZSgnLicpOwogICAgLy8gVE9ETyhzaWdtdW5kKTogZW5zdXJlIHRoYXQgdGhlIGZpcnN0IHNlZ21lbnQgaXMgYSBMaWJyYXJ5SW5mby4KICAgIC8vIGFzc2VydCghZmlyc3QgfHwgc2VnbWVudCBpcyBMaWJyYXJ5SW5mbyk7CiAgICAvLyAodG9kYXkgbWlnaHQgbm90IGJlIHRydWUgZm9yIGZvciBjbG9zdXJlIGNsYXNzZXMpLgogICAgaWYgKHNlZ21lbnQgaXMgTGlicmFyeUluZm8pIHsKICAgICAgLy8gVE9ETyhrZXZtb28pOiBSZW1vdmUgdGhpcyB3aGVuIGRhcnQyanMgY2FuIGJlIGludm9rZWQgd2l0aCBhbiBhcHAtcm9vdAogICAgICAvLyBjdXN0b20gVVJJCiAgICAgIGlmICh1c2VMaWJyYXJ5VXJpICYmIGZvcklkICYmIHNlZ21lbnQudXJpLmlzU2NoZW1lKCdmaWxlJykpIHsKICAgICAgICBhc3NlcnQoVXJpLmJhc2UuaXNTY2hlbWUoJ2ZpbGUnKSk7CiAgICAgICAgdmFyIGN1cnJlbnRCYXNlID0gVXJpLmJhc2UucGF0aDsKICAgICAgICB2YXIgc2VnbWVudFN0cmluZyA9IHNlZ21lbnQudXJpLnBhdGg7CgogICAgICAgIC8vIElmIGxvbmdOYW1lIGlzIGJlaW5nIGNhbGxlZCB0byBjYWxjdWxhdGUgYW4gZWxlbWVudCBJRCAoZm9ySWQgPSB0cnVlKQogICAgICAgIC8vIHRoZW4gdXNlIGEgcmVsYXRpdmUgcGF0aCBmb3IgdGhlIGxvbmdOYW1lIGNhbGN1bGF0aW9uCiAgICAgICAgLy8gVGhpcyBhbGxvd3MgYSBtb3JlIHN0YWJsZSBJRCBmb3IgY2FzZXMgd2hlbiBmaWxlcyBhcmUgZ2VuZXJhdGVkIGludG8KICAgICAgICAvLyB0ZW1wIGRpcmVjdG9yaWVzIOKAkyBlLmcuIHdpdGggcGtnOmJ1aWxkX3dlYl9jb21waWxlcnMKICAgICAgICBpZiAoc2VnbWVudFN0cmluZy5zdGFydHNXaXRoKGN1cnJlbnRCYXNlKSkgewogICAgICAgICAgc2VnbWVudFN0cmluZyA9IHNlZ21lbnRTdHJpbmcuc3Vic3RyaW5nKGN1cnJlbnRCYXNlLmxlbmd0aCk7CiAgICAgICAgfQoKICAgICAgICBzYi53cml0ZShzZWdtZW50U3RyaW5nKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzYi53cml0ZSh1c2VMaWJyYXJ5VXJpID8gc2VnbWVudC51cmkgOiBzZWdtZW50Lm5hbWUpOwogICAgICB9CiAgICAgIHNiLndyaXRlKCc6OicpOwogICAgfSBlbHNlIHsKICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgc2Iud3JpdGUoc2VnbWVudC5uYW1lKTsKICAgIH0KICB9CiAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Cn0KCi8vLyBQcm9kdWNlIGEgc3RyaW5nIGNvbnRhaW5pbmcgW3ZhbHVlXSBwYWRkZWQgd2l0aCB3aGl0ZSBzcGFjZSB1cCB0byBbbl0gY2hhcnMuCnBhZCh2YWx1ZSwgbiwge2Jvb2wgcmlnaHQ6IGZhbHNlfSkgewogIHZhciBzID0gJyR2YWx1ZSc7CiAgaWYgKHMubGVuZ3RoID49IG4pIHJldHVybiBzOwogIHZhciBwYWQgPSAnICcgKiAobiAtIHMubGVuZ3RoKTsKICByZXR1cm4gcmlnaHQgPyAnJHMkcGFkJyA6ICckcGFkJHMnOwp9CmUATk48AR8BKQEVATIqRx9QMk8OTh4pIhYcIgYoLB0IBgQBHxYcIgYoLB0IBgQBEAIBNz5NFRkYGAQfFCsfRjE6IlAURCspLgFRQVBANUcKASEPPggWDRUeBgQYAgFRJRQfIiYCASJwYWNrYWdlOmRhcnQyanNfaW5mby9zcmMvdXRpbC5kYXJ0PnNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9kYXJ0MmpzX2luZm8vbGliL3NyYy9iaW5hcnkvc2luay5kYXJ0rCkvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CgovLy8gSW50ZXJmYWNlIGZvciBzZXJpYWxpemF0aW9uLgovLyBUT0RPKHNpZ211bmQpOiBzaGFyZSB0aGlzIHdpdGggcGtnOmNvbXBpbGVyL3NyYy9zZXJpYWxpemF0aW9uLyoKYWJzdHJhY3QgY2xhc3MgRGF0YVNpbmsgewogIC8vLyBUaGUgYW1vdW50IG9mIGRhdGEgd3JpdHRlbiB0byB0aGlzIGRhdGEgc2luay4KICAvLy8KICAvLy8gVGhlIHVuaXRzIGlzIGJhc2VkIG9uIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlIGZvciB0aGlzIGRhdGEgc2luay4KICBpbnQgZ2V0IGxlbmd0aDsKCiAgLy8vIEZsdXNoZXMgYW55IHBlbmRpbmcgZGF0YSBhbmQgY2xvc2VzIHRoaXMgZGF0YSBzaW5rLgogIC8vLwogIC8vLyBUaGUgZGF0YSBzaW5rIGNhbiBubyBsb25nZXIgYmUgd3JpdHRlbiB0byBhZnRlciBjbG9zaW5nLgogIHZvaWQgY2xvc2UoKTsKCiAgLy8vIFdyaXRlcyBhIHJlZmVyZW5jZSB0byBbdmFsdWVdIHRvIHRoaXMgZGF0YSBzaW5rLiBJZiBbdmFsdWVdIGhhcyBub3QgeWV0CiAgLy8vIGJlZW4gc2VyaWFsaXplZCwgW2ZdIGlzIGNhbGxlZCB0byBzZXJpYWxpemUgdGhlIHZhbHVlIGl0c2VsZi4KICB2b2lkIHdyaXRlQ2FjaGVkPEU+KEUgdmFsdWUsIHZvaWQgZihFIHZhbHVlKSk7CgogIC8vLyBXcml0ZXMgdGhlIHBvdGVudGlhbGx5IGBudWxsYCBbdmFsdWVdIHRvIHRoaXMgZGF0YSBzaW5rLiBJZiBbdmFsdWVdIGlzCiAgLy8vIG5vbi1udWxsIFtmXSBpcyBjYWxsZWQgdG8gd3JpdGUgdGhlIG5vbi1udWxsIHZhbHVlIHRvIHRoZSBkYXRhIHNpbmsuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRWYWx1ZU9yTnVsbF0uCiAgdm9pZCB3cml0ZVZhbHVlT3JOdWxsPEU+KEUgdmFsdWUsIHZvaWQgZihFIHZhbHVlKSk7CgogIC8vLyBXcml0ZXMgdGhlIFt2YWx1ZXNdIHRvIHRoaXMgZGF0YSBzaW5rIGNhbGxpbmcgW2ZdIHRvIHdyaXRlIGVhY2ggdmFsdWUgdG8KICAvLy8gdGhlIGRhdGEgc2luay4gSWYgW2FsbG93TnVsbF0gaXMgYHRydWVgLCBbdmFsdWVzXSBpcyBhbGxvd2VkIHRvIGJlIGBudWxsYC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTb3VyY2UucmVhZExpc3RdLgogIHZvaWQgd3JpdGVMaXN0PEU+KEl0ZXJhYmxlPEU+IHZhbHVlcywgdm9pZCBmKEUgdmFsdWUpLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSk7CgogIC8vLyBXcml0ZXMgdGhlIGJvb2xlYW4gW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4KICB2b2lkIHdyaXRlQm9vbChib29sIHZhbHVlKTsKCiAgLy8vIFdyaXRlcyB0aGUgbm9uLW5lZ2F0aXZlIGludGVnZXIgW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4KICB2b2lkIHdyaXRlSW50KGludCB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgdGhlIHBvdGVudGlhbGx5IGBudWxsYCBub24tbmVnYXRpdmUgW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTb3VyY2UucmVhZEludE9yTnVsbF0uCiAgdm9pZCB3cml0ZUludE9yTnVsbChpbnQgdmFsdWUpOwoKICAvLy8gV3JpdGVzIHRoZSBzdHJpbmcgW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4KICB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgdGhlIHBvdGVudGlhbGx5IGBudWxsYCBzdHJpbmcgW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTb3VyY2UucmVhZFN0cmluZ09yTnVsbF0uCiAgdm9pZCB3cml0ZVN0cmluZ09yTnVsbChTdHJpbmcgdmFsdWUpOwoKICAvLy8gV3JpdGVzIHRoZSBzdHJpbmcgW3ZhbHVlc10gdG8gdGhpcyBkYXRhIHNpbmsuIElmIFthbGxvd051bGxdIGlzIGB0cnVlYCwKICAvLy8gW3ZhbHVlc10gaXMgYWxsb3dlZCB0byBiZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRTdHJpbmdzXS4KICB2b2lkIHdyaXRlU3RyaW5ncyhJdGVyYWJsZTxTdHJpbmc+IHZhbHVlcywge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pOwoKICAvLy8gV3JpdGVzIHRoZSBbbWFwXSBmcm9tIHN0cmluZyB0byBbVl0gdmFsdWVzIHRvIHRoaXMgZGF0YSBzaW5rLCBjYWxsaW5nIFtmXQogIC8vLyB0byB3cml0ZSBlYWNoIHZhbHVlIHRvIHRoZSBkYXRhIHNpbmsuIElmIFthbGxvd051bGxdIGlzIGB0cnVlYCwgW21hcF0gaXMKICAvLy8gYWxsb3dlZCB0byBiZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRTdHJpbmdNYXBdLgogIHZvaWQgd3JpdGVTdHJpbmdNYXA8Vj4oTWFwPFN0cmluZywgVj4gbWFwLCB2b2lkIGYoViB2YWx1ZSksCiAgICAgIHtib29sIGFsbG93TnVsbDogZmFsc2V9KTsKCiAgLy8vIFdyaXRlcyB0aGUgZW51bSB2YWx1ZSBbdmFsdWVdIHRvIHRoaXMgZGF0YSBzaW5rLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENoYW5nZSB0aGUgc2lnbmF0dXJlIHRvCiAgLy8gYHZvaWQgd3JpdGVFbnVtPEUgZXh0ZW5kcyBFbnVtPEU+PihFIHZhbHVlKTtgIHdoZW4gYW4gaW50ZXJmYWNlIGZvciBlbnVtcwogIC8vIGlzIGFkZGVkIHRvIHRoZSBsYW5ndWFnZS4KICB2b2lkIHdyaXRlRW51bShkeW5hbWljIHZhbHVlKTsKCiAgLy8vIFdyaXRlcyB0aGUgVVJJIFt2YWx1ZV0gdG8gdGhpcyBkYXRhIHNpbmsuCiAgdm9pZCB3cml0ZVVyaShVcmkgdmFsdWUpOwp9CgovLy8gTWl4aW4gdGhhdCBpbXBsZW1lbnRzIGFsbCBjb252ZW5pZW5jZSBtZXRob2RzIG9mIFtEYXRhU2lua10uCmFic3RyYWN0IGNsYXNzIERhdGFTaW5rTWl4aW4gaW1wbGVtZW50cyBEYXRhU2luayB7CiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUludE9yTnVsbChpbnQgdmFsdWUpIHsKICAgIHdyaXRlQm9vbCh2YWx1ZSAhPSBudWxsKTsKICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlSW50KHZhbHVlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVTdHJpbmdPck51bGwoU3RyaW5nIHZhbHVlKSB7CiAgICB3cml0ZUJvb2wodmFsdWUgIT0gbnVsbCk7CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICB3cml0ZVN0cmluZyh2YWx1ZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlU3RyaW5ncyhJdGVyYWJsZTxTdHJpbmc+IHZhbHVlcywge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewogICAgICBhc3NlcnQoYWxsb3dOdWxsKTsKICAgICAgd3JpdGVJbnQoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUludCh2YWx1ZXMubGVuZ3RoKTsKICAgICAgZm9yIChTdHJpbmcgdmFsdWUgaW4gdmFsdWVzKSB7CiAgICAgICAgd3JpdGVTdHJpbmcodmFsdWUpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlU3RyaW5nTWFwPFY+KE1hcDxTdHJpbmcsIFY+IG1hcCwgdm9pZCBmKFYgdmFsdWUpLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgaWYgKG1hcCA9PSBudWxsKSB7CiAgICAgIGFzc2VydChhbGxvd051bGwpOwogICAgICB3cml0ZUludCgwKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlSW50KG1hcC5sZW5ndGgpOwogICAgICBtYXAuZm9yRWFjaCgoU3RyaW5nIGtleSwgViB2YWx1ZSkgewogICAgICAgIHdyaXRlU3RyaW5nKGtleSk7CiAgICAgICAgZih2YWx1ZSk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUxpc3Q8RT4oSXRlcmFibGU8RT4gdmFsdWVzLCB2b2lkIGYoRSB2YWx1ZSksCiAgICAgIHtib29sIGFsbG93TnVsbDogZmFsc2V9KSB7CiAgICBpZiAodmFsdWVzID09IG51bGwpIHsKICAgICAgYXNzZXJ0KGFsbG93TnVsbCk7CiAgICAgIHdyaXRlSW50KDApOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVJbnQodmFsdWVzLmxlbmd0aCk7CiAgICAgIHZhbHVlcy5mb3JFYWNoKGYpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVZhbHVlT3JOdWxsPEU+KEUgdmFsdWUsIHZvaWQgZihFIHZhbHVlKSkgewogICAgd3JpdGVCb29sKHZhbHVlICE9IG51bGwpOwogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgZih2YWx1ZSk7CiAgICB9CiAgfQp9CgovLy8gRGF0YSBzaW5rIGhlbHBlciB0aGF0IGNhbm9uaWNhbGl6ZXMgW0VdIHZhbHVlcyB1c2luZyBpbmRpY2VzLgpjbGFzcyBJbmRleGVkU2luazxFPiB7CiAgZmluYWwgdm9pZCBGdW5jdGlvbihpbnQpIF93cml0ZUludDsKICBmaW5hbCBNYXA8RSwgaW50PiBfY2FjaGUgPSB7fTsKCiAgSW5kZXhlZFNpbmsodGhpcy5fd3JpdGVJbnQpOwoKICAvLy8gV3JpdGUgYSByZWZlcmVuY2UgdG8gW3ZhbHVlXSB0byB0aGUgZGF0YSBzaW5rLgogIC8vLwogIC8vLyBJZiBbdmFsdWVdIGhhcyBub3QgYmVlbiBjYW5vbmljYWxpemVkIHlldCwgW3dyaXRlVmFsdWVdIGlzIGNhbGxlZCB0bwogIC8vLyBzZXJpYWxpemUgdGhlIFt2YWx1ZV0gaXRzZWxmLgogIHZvaWQgd3JpdGUoRSB2YWx1ZSwgdm9pZCB3cml0ZVZhbHVlKEUgdmFsdWUpKSB7CiAgICBpbnQgaW5kZXggPSBfY2FjaGVbdmFsdWVdOwogICAgaWYgKGluZGV4ID09IG51bGwpIHsKICAgICAgaW5kZXggPSBfY2FjaGUubGVuZ3RoOwogICAgICBfY2FjaGVbdmFsdWVdID0gaW5kZXg7CiAgICAgIF93cml0ZUludChpbmRleCk7CiAgICAgIHdyaXRlVmFsdWUodmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgX3dyaXRlSW50KGluZGV4KTsKICAgIH0KICB9Cn0KCi8vLyBCYXNlIGltcGxlbWVudGF0aW9uIG9mIFtEYXRhU2lua10gdXNpbmcgW0RhdGFTaW5rTWl4aW5dIHRvIGltcGxlbWVudAovLy8gY29udmVuaWVuY2UgbWV0aG9kcy4KYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REYXRhU2luayBleHRlbmRzIERhdGFTaW5rTWl4aW4gaW1wbGVtZW50cyBEYXRhU2luayB7CiAgSW5kZXhlZFNpbms8U3RyaW5nPiBfc3RyaW5nSW5kZXg7CiAgSW5kZXhlZFNpbms8VXJpPiBfdXJpSW5kZXg7CiAgTWFwPFR5cGUsIEluZGV4ZWRTaW5rPiBfZ2VuZXJhbENhY2hlcyA9IHt9OwoKICBBYnN0cmFjdERhdGFTaW5rKCkgewogICAgX3N0cmluZ0luZGV4ID0gbmV3IEluZGV4ZWRTaW5rPFN0cmluZz4oX3dyaXRlSW50SW50ZXJuYWwpOwogICAgX3VyaUluZGV4ID0gbmV3IEluZGV4ZWRTaW5rPFVyaT4oX3dyaXRlSW50SW50ZXJuYWwpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUNhY2hlZDxFPihFIHZhbHVlLCB2b2lkIGYoRSB2YWx1ZSkpIHsKICAgIEluZGV4ZWRTaW5rIHNpbmsgPQogICAgICAgIF9nZW5lcmFsQ2FjaGVzW0VdID8/PSBuZXcgSW5kZXhlZFNpbms8RT4oX3dyaXRlSW50SW50ZXJuYWwpOwogICAgc2luay53cml0ZSh2YWx1ZSwgKHYpID0+IGYodikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUVudW0oZHluYW1pYyB2YWx1ZSkgewogICAgX3dyaXRlRW51bUludGVybmFsKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVCb29sKGJvb2wgdmFsdWUpIHsKICAgIGFzc2VydCh2YWx1ZSAhPSBudWxsKTsKICAgIF93cml0ZUludEludGVybmFsKHZhbHVlID8gMSA6IDApOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVVyaShVcmkgdmFsdWUpIHsKICAgIGFzc2VydCh2YWx1ZSAhPSBudWxsKTsKICAgIF93cml0ZVVyaSh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyB2YWx1ZSkgewogICAgYXNzZXJ0KHZhbHVlICE9IG51bGwpOwogICAgX3dyaXRlU3RyaW5nKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVJbnQoaW50IHZhbHVlKSB7CiAgICBhc3NlcnQodmFsdWUgIT0gbnVsbCk7CiAgICBhc3NlcnQodmFsdWUgPj0gMCAmJiB2YWx1ZSA+PiAzMCA9PSAwKTsKICAgIF93cml0ZUludEludGVybmFsKHZhbHVlKTsKICB9CgogIHZvaWQgX3dyaXRlU3RyaW5nKFN0cmluZyB2YWx1ZSkgewogICAgX3N0cmluZ0luZGV4LndyaXRlKHZhbHVlLCBfd3JpdGVTdHJpbmdJbnRlcm5hbCk7CiAgfQoKICB2b2lkIF93cml0ZVVyaShVcmkgdmFsdWUpIHsKICAgIF91cmlJbmRleC53cml0ZSh2YWx1ZSwgX3dyaXRlVXJpSW50ZXJuYWwpOwogIH0KCiAgLy8vIEFjdHVhbCBzZXJpYWxpemF0aW9uIG9mIGEgVVJJIHZhbHVlLCBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzLgogIHZvaWQgX3dyaXRlVXJpSW50ZXJuYWwoVXJpIHZhbHVlKTsKCiAgLy8vIEFjdHVhbCBzZXJpYWxpemF0aW9uIG9mIGEgU3RyaW5nIHZhbHVlLCBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzLgogIHZvaWQgX3dyaXRlU3RyaW5nSW50ZXJuYWwoU3RyaW5nIHZhbHVlKTsKCiAgLy8vIEFjdHVhbCBzZXJpYWxpemF0aW9uIG9mIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgdmFsdWUsIGltcGxlbWVudGVkIGJ5CiAgLy8vIHN1YmNsYXNzZXMuCiAgdm9pZCBfd3JpdGVJbnRJbnRlcm5hbChpbnQgdmFsdWUpOwoKICAvLy8gQWN0dWFsIHNlcmlhbGl6YXRpb24gb2YgYW4gZW51bSB2YWx1ZSwgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy4KICB2b2lkIF93cml0ZUVudW1JbnRlcm5hbChkeW5hbWljIHZhbHVlKTsKfQoKLy8vIFtEYXRhU2lua10gdGhhdCB3cml0ZXMgZGF0YSBhcyBhIHNlcXVlbmNlIG9mIGJ5dGVzLgovLy8KLy8vIFRoaXMgZGF0YSBzaW5rIHdvcmtzIHRvZ2V0aGVyIHdpdGggW0JpbmFyeVNvdXJjZV0uCmNsYXNzIEJpbmFyeVNpbmsgZXh0ZW5kcyBBYnN0cmFjdERhdGFTaW5rIHsKICBmaW5hbCBTaW5rPExpc3Q8aW50Pj4gc2luazsKICBCdWZmZXJlZFNpbmsgX2J1ZmZlcmVkU2luazsKICBpbnQgX2xlbmd0aCA9IDA7CgogIEJpbmFyeVNpbmsodGhpcy5zaW5rKSA6IF9idWZmZXJlZFNpbmsgPSBuZXcgQnVmZmVyZWRTaW5rKHNpbmspOwoKICBAb3ZlcnJpZGUKICB2b2lkIF93cml0ZVVyaUludGVybmFsKFVyaSB2YWx1ZSkgewogICAgX3dyaXRlU3RyaW5nKHZhbHVlLnRvU3RyaW5nKCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfd3JpdGVTdHJpbmdJbnRlcm5hbChTdHJpbmcgdmFsdWUpIHsKICAgIExpc3Q8aW50PiBieXRlcyA9IHV0ZjguZW5jb2RlKHZhbHVlKTsKICAgIF93cml0ZUludEludGVybmFsKGJ5dGVzLmxlbmd0aCk7CiAgICBfYnVmZmVyZWRTaW5rLmFkZEJ5dGVzKGJ5dGVzKTsKICAgIF9sZW5ndGggKz0gYnl0ZXMubGVuZ3RoOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfd3JpdGVJbnRJbnRlcm5hbChpbnQgdmFsdWUpIHsKICAgIGFzc2VydCh2YWx1ZSA+PSAwICYmIHZhbHVlID4+IDMwID09IDApOwogICAgaWYgKHZhbHVlIDwgMHg4MCkgewogICAgICBfYnVmZmVyZWRTaW5rLmFkZEJ5dGUodmFsdWUpOwogICAgICBfbGVuZ3RoICs9IDE7CiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMHg0MDAwKSB7CiAgICAgIF9idWZmZXJlZFNpbmsuYWRkQnl0ZTIoKHZhbHVlID4+IDgpIHwgMHg4MCwgdmFsdWUgJiAweEZGKTsKICAgICAgX2xlbmd0aCArPSAyOwogICAgfSBlbHNlIHsKICAgICAgX2J1ZmZlcmVkU2luay5hZGRCeXRlNCgodmFsdWUgPj4gMjQpIHwgMHhDMCwgKHZhbHVlID4+IDE2KSAmIDB4RkYsCiAgICAgICAgICAodmFsdWUgPj4gOCkgJiAweEZGLCB2YWx1ZSAmIDB4RkYpOwogICAgICBfbGVuZ3RoICs9IDQ7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF93cml0ZUVudW1JbnRlcm5hbChkeW5hbWljIHZhbHVlKSB7CiAgICBfd3JpdGVJbnRJbnRlcm5hbCh2YWx1ZS5pbmRleCk7CiAgfQoKICB2b2lkIGNsb3NlKCkgewogICAgX2J1ZmZlcmVkU2luay5mbHVzaEFuZERlc3Ryb3koKTsKICAgIF9idWZmZXJlZFNpbmsgPSBudWxsOwogICAgc2luay5jbG9zZSgpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIHRoaXMgZGF0YSBzaW5rLgogIGludCBnZXQgbGVuZ3RoID0+IF9sZW5ndGg7Cn0KCi8vLyBQdXRzIGEgYnVmZmVyIGluIGZyb250IG9mIGEgW1Npbms8TGlzdDxpbnQ+Pl0uCi8vIFRPRE8oc2lnbXVuZCk6IHNoYXJlIHdpdGggdGhlIGltcGxlbWVudGF0aW9uIGluCi8vIHBhY2thZ2U6a2VybmVsL2JpbmFyeS9hc3RfdG9fYmluYXJ5LmRhcnQKY2xhc3MgQnVmZmVyZWRTaW5rIHsKICBzdGF0aWMgY29uc3QgaW50IFNJWkUgPSAxMDAwMDA7CiAgc3RhdGljIGNvbnN0IGludCBTQUZFX1NJWkUgPSBTSVpFIC0gNTsKICBzdGF0aWMgY29uc3QgaW50IFNNQUxMID0gMTAwMDA7CiAgZmluYWwgU2luazxMaXN0PGludD4+IF9zaW5rOwogIFVpbnQ4TGlzdCBfYnVmZmVyID0gbmV3IFVpbnQ4TGlzdChTSVpFKTsKICBpbnQgbGVuZ3RoID0gMDsKICBpbnQgZmx1c2hlZExlbmd0aCA9IDA7CgogIEZsb2F0NjRMaXN0IF9kb3VibGVCdWZmZXIgPSBuZXcgRmxvYXQ2NExpc3QoMSk7CiAgVWludDhMaXN0IF9kb3VibGVCdWZmZXJVaW50ODsKCiAgaW50IGdldCBvZmZzZXQgPT4gbGVuZ3RoICsgZmx1c2hlZExlbmd0aDsKCiAgQnVmZmVyZWRTaW5rKHRoaXMuX3NpbmspOwoKICB2b2lkIGFkZERvdWJsZShkb3VibGUgZCkgewogICAgX2RvdWJsZUJ1ZmZlclVpbnQ4ID8/PSBfZG91YmxlQnVmZmVyLmJ1ZmZlci5hc1VpbnQ4TGlzdCgpOwogICAgX2RvdWJsZUJ1ZmZlclswXSA9IGQ7CiAgICBhZGRCeXRlNChfZG91YmxlQnVmZmVyVWludDhbMF0sIF9kb3VibGVCdWZmZXJVaW50OFsxXSwKICAgICAgICBfZG91YmxlQnVmZmVyVWludDhbMl0sIF9kb3VibGVCdWZmZXJVaW50OFszXSk7CiAgICBhZGRCeXRlNChfZG91YmxlQnVmZmVyVWludDhbNF0sIF9kb3VibGVCdWZmZXJVaW50OFs1XSwKICAgICAgICBfZG91YmxlQnVmZmVyVWludDhbNl0sIF9kb3VibGVCdWZmZXJVaW50OFs3XSk7CiAgfQoKICB2b2lkIGFkZEJ5dGUoaW50IGJ5dGUpIHsKICAgIF9idWZmZXJbbGVuZ3RoKytdID0gYnl0ZTsKICAgIGlmIChsZW5ndGggPT0gU0laRSkgewogICAgICBfc2luay5hZGQoX2J1ZmZlcik7CiAgICAgIF9idWZmZXIgPSBuZXcgVWludDhMaXN0KFNJWkUpOwogICAgICBsZW5ndGggPSAwOwogICAgICBmbHVzaGVkTGVuZ3RoICs9IFNJWkU7CiAgICB9CiAgfQoKICB2b2lkIGFkZEJ5dGUyKGludCBieXRlMSwgaW50IGJ5dGUyKSB7CiAgICBpZiAobGVuZ3RoIDwgU0FGRV9TSVpFKSB7CiAgICAgIF9idWZmZXJbbGVuZ3RoKytdID0gYnl0ZTE7CiAgICAgIF9idWZmZXJbbGVuZ3RoKytdID0gYnl0ZTI7CiAgICB9IGVsc2UgewogICAgICBhZGRCeXRlKGJ5dGUxKTsKICAgICAgYWRkQnl0ZShieXRlMik7CiAgICB9CiAgfQoKICB2b2lkIGFkZEJ5dGU0KGludCBieXRlMSwgaW50IGJ5dGUyLCBpbnQgYnl0ZTMsIGludCBieXRlNCkgewogICAgaWYgKGxlbmd0aCA8IFNBRkVfU0laRSkgewogICAgICBfYnVmZmVyW2xlbmd0aCsrXSA9IGJ5dGUxOwogICAgICBfYnVmZmVyW2xlbmd0aCsrXSA9IGJ5dGUyOwogICAgICBfYnVmZmVyW2xlbmd0aCsrXSA9IGJ5dGUzOwogICAgICBfYnVmZmVyW2xlbmd0aCsrXSA9IGJ5dGU0OwogICAgfSBlbHNlIHsKICAgICAgYWRkQnl0ZShieXRlMSk7CiAgICAgIGFkZEJ5dGUoYnl0ZTIpOwogICAgICBhZGRCeXRlKGJ5dGUzKTsKICAgICAgYWRkQnl0ZShieXRlNCk7CiAgICB9CiAgfQoKICB2b2lkIGFkZEJ5dGVzKExpc3Q8aW50PiBieXRlcykgewogICAgLy8gQXZvaWQgY29weWluZyBhIGxhcmdlIGJ1ZmZlciBpbnRvIHRoZSBhbm90aGVyIGxhcmdlIGJ1ZmZlci4gQWxzbywgaWYKICAgIC8vIHRoZSBieXRlcyBidWZmZXIgaXMgdG9vIGxhcmdlIHRvIGZpdCBpbiBvdXIgb3duIGJ1ZmZlciwganVzdCBlbWl0IGJvdGguCiAgICBpZiAobGVuZ3RoICsgYnl0ZXMubGVuZ3RoIDwgU0laRSAmJgogICAgICAgIChieXRlcy5sZW5ndGggPCBTTUFMTCB8fCBsZW5ndGggPCBTTUFMTCkpIHsKICAgICAgX2J1ZmZlci5zZXRSYW5nZShsZW5ndGgsIGxlbmd0aCArIGJ5dGVzLmxlbmd0aCwgYnl0ZXMpOwogICAgICBsZW5ndGggKz0gYnl0ZXMubGVuZ3RoOwogICAgfSBlbHNlIGlmIChieXRlcy5sZW5ndGggPCBTTUFMTCkgewogICAgICAvLyBGbHVzaCBhcyBtdWNoIGFzIHdlIGNhbiBpbiB0aGUgY3VycmVudCBidWZmZXIuCiAgICAgIF9idWZmZXIuc2V0UmFuZ2UobGVuZ3RoLCBTSVpFLCBieXRlcyk7CiAgICAgIF9zaW5rLmFkZChfYnVmZmVyKTsKICAgICAgLy8gQ29weSBvdmVyIHRoZSByZW1haW5kZXIgaW50byBhIG5ldyBidWZmZXIuIEl0IGlzIGd1YXJhbnRlZWQgdG8gZml0CiAgICAgIC8vIGJlY2F1c2UgdGhlIGlucHV0IGJ5dGUgYXJyYXkgaXMgc21hbGwuCiAgICAgIGludCBhbHJlYWR5RW1pdHRlZCA9IFNJWkUgLSBsZW5ndGg7CiAgICAgIGludCByZW1haW5kZXIgPSBieXRlcy5sZW5ndGggLSBhbHJlYWR5RW1pdHRlZDsKICAgICAgX2J1ZmZlciA9IG5ldyBVaW50OExpc3QoU0laRSk7CiAgICAgIF9idWZmZXIuc2V0UmFuZ2UoMCwgcmVtYWluZGVyLCBieXRlcywgYWxyZWFkeUVtaXR0ZWQpOwogICAgICBsZW5ndGggPSByZW1haW5kZXI7CiAgICAgIGZsdXNoZWRMZW5ndGggKz0gU0laRTsKICAgIH0gZWxzZSB7CiAgICAgIGZsdXNoKCk7CiAgICAgIF9zaW5rLmFkZChieXRlcyk7CiAgICAgIGZsdXNoZWRMZW5ndGggKz0gYnl0ZXMubGVuZ3RoOwogICAgfQogIH0KCiAgdm9pZCBmbHVzaCgpIHsKICAgIF9zaW5rLmFkZChfYnVmZmVyLnN1Ymxpc3QoMCwgbGVuZ3RoKSk7CiAgICBfYnVmZmVyID0gbmV3IFVpbnQ4TGlzdChTSVpFKTsKICAgIGZsdXNoZWRMZW5ndGggKz0gbGVuZ3RoOwogICAgbGVuZ3RoID0gMDsKICB9CgogIHZvaWQgZmx1c2hBbmREZXN0cm95KCkgewogICAgX3NpbmsuYWRkKF9idWZmZXIuc3VibGlzdCgwLCBsZW5ndGgpKTsKICB9Cn0KgZMATk48ARcaASFDGjQGThIBOgY/EAFORDEBTUsGPCQ2AU9RBjwdOSABNB4BQRwBTAY8IiIBMyIBRgY8JSgBTigGPCBHAVBPHAY8Ij4gATcyTx8hATAcAgFBMwwjHhkXBgQBDCkeGRoGBAEMSBoZEw0fJRwIBgQBDD4hFxkTDRwqGhIKBgQBDDkhGhkTDR8ZBgQBDDceGRAGBAIBQhcmIQEfATUGSyQyHxkdHRgZDRgGBAIBSRlMJB4uARc/OQQBDDIXRSQEAQwiHwQBDB8bJgQBDB0bFgQBDCMbGQQBDB0bLB4EASQ1BAEeLwQBRiUBSSsBSxIlAUgqAgE4BDcsHh4TAUIBDCYkBAEMLColIx0EAQwmLBgkFCFBFA1JLhQGBAEMKyQEARElGhIEAT0dAgEzMywVIikiHysSGQEyIAEsARwBHT8aOzc7NwQBGx4aGiUSHQYEASgeISENFhYGBAE+HiEhISENFhYWFgYEASNMTyg0Ph4nOC0aTDAqNSU9Gh0NDxglBgQBESsjHRAEARsrBAIBKXBhY2thZ2U6ZGFydDJqc19pbmZvL3NyYy9iaW5hcnkvc2luay5kYXJ0QHNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9kYXJ0MmpzX2luZm8vbGliL3NyYy9iaW5hcnkvc291cmNlLmRhcnSfci8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CmltcG9ydCAnZGFydDpjb252ZXJ0JzsKCi8vLyBJbnRlcmZhY2UgZm9yIGRlc2VyaWFsaXphdGlvbi4KLy8gVE9ETyhzaWdtdW5kKTogc2hhcmUgdGhpcyB3aXRoIHBrZzpjb21waWxlci9zcmMvc2VyaWFsaXphdGlvbi8qCmFic3RyYWN0IGNsYXNzIERhdGFTb3VyY2UgewogIC8vLyBSZWFkcyBhIHJlZmVyZW5jZSB0byBhbiBbRV0gdmFsdWUgZnJvbSB0aGlzIGRhdGEgc291cmNlLiBJZiB0aGUgdmFsdWUgaGFzCiAgLy8vIG5vdCB5ZXQgYmVlbiBkZXNlcmlhbGl6ZWQsIFtmXSBpcyBjYWxsZWQgdG8gZGVzZXJpYWxpemUgdGhlIHZhbHVlIGl0c2VsZi4KICBFIHJlYWRDYWNoZWQ8RT4oRSBmKCkpOwoKICAvLy8gUmVhZHMgYSBwb3RlbnRpYWxseSBgbnVsbGAgW0VdIHZhbHVlIGZyb20gdGhpcyBkYXRhIHNvdXJjZSwgY2FsbGluZyBbZl0gdG8KICAvLy8gcmVhZCB0aGUgbm9uLW51bGwgdmFsdWUgZnJvbSB0aGUgZGF0YSBzb3VyY2UuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU2luay53cml0ZVZhbHVlT3JOdWxsXS4KICBFIHJlYWRWYWx1ZU9yTnVsbDxFPihFIGYoKSk7CgogIC8vLyBSZWFkcyBhIGxpc3Qgb2YgW0VdIHZhbHVlcyBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuIElmIFtlbXB0eUFzTnVsbF0gaXMKICAvLy8gYHRydWVgLCBgbnVsbGAgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBlbXB0eSBsaXN0LgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNpbmsud3JpdGVMaXN0XS4KICBMaXN0PEU+IHJlYWRMaXN0PEU+KEUgZigpLCB7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KTsKCiAgLy8vIFJlYWRzIGEgYm9vbGVhbiB2YWx1ZSBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgYm9vbCByZWFkQm9vbCgpOwoKICAvLy8gUmVhZHMgYSBub24tbmVnYXRpdmUgaW50ZWdlciB2YWx1ZSBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgaW50IHJlYWRJbnQoKTsKCiAgLy8vIFJlYWRzIGEgcG90ZW50aWFsbHkgYG51bGxgIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHZhbHVlIGZyb20gdGhpcyBkYXRhCiAgLy8vIHNvdXJjZS4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTaW5rLndyaXRlSW50T3JOdWxsXS4KICBpbnQgcmVhZEludE9yTnVsbCgpOwoKICAvLy8gUmVhZHMgYSBzdHJpbmcgdmFsdWUgZnJvbSB0aGlzIGRhdGEgc291cmNlLgogIFN0cmluZyByZWFkU3RyaW5nKCk7CgogIC8vLyBSZWFkcyBhIHBvdGVudGlhbGx5IGBudWxsYCBzdHJpbmcgdmFsdWUgZnJvbSB0aGlzIGRhdGEgc291cmNlLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNpbmsud3JpdGVTdHJpbmdPck51bGxdLgogIFN0cmluZyByZWFkU3RyaW5nT3JOdWxsKCk7CgogIC8vLyBSZWFkcyBhIGxpc3Qgb2Ygc3RyaW5nIHZhbHVlcyBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuIElmIFtlbXB0eUFzTnVsbF0gaXMKICAvLy8gYHRydWVgLCBgbnVsbGAgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBlbXB0eSBsaXN0LgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNpbmsud3JpdGVTdHJpbmdzXS4KICBMaXN0PFN0cmluZz4gcmVhZFN0cmluZ3Moe2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSk7CgogIC8vLyBSZWFkcyBhIG1hcCBmcm9tIHN0cmluZyB2YWx1ZXMgdG8gW1ZdIHZhbHVlcyBmcm9tIHRoaXMgZGF0YSBzb3VyY2UsCiAgLy8vIGNhbGxpbmcgW2ZdIHRvIHJlYWQgZWFjaCB2YWx1ZSBmcm9tIHRoZSBkYXRhIHNvdXJjZS4gSWYgW2VtcHR5QXNOdWxsXSBpcwogIC8vLyBgdHJ1ZWAsIGBudWxsYCBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFuIGVtcHR5IG1hcC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTaW5rLndyaXRlU3RyaW5nTWFwXS4KICBNYXA8U3RyaW5nLCBWPiByZWFkU3RyaW5nTWFwPFY+KFYgZigpLCB7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KTsKCiAgLy8vIFJlYWRzIGFuIGVudW0gdmFsdWUgZnJvbSB0aGUgbGlzdCBvZiBlbnVtIFt2YWx1ZXNdIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICAvLy8KICAvLy8gVGhlIFt2YWx1ZXNdIGFyZ3VtZW50IGlzIGludGVuZGVkIHRvIGJlIHRoZSBzdGF0aWMgYC52YWx1ZXNgIGZpZWxkIG9uCiAgLy8vIGVudW0gY2xhc3NlcywgZm9yIGluc3RhbmNlOgogIC8vLwogIC8vLyAgICBlbnVtIEZvbyB7IGJhciwgYmF6IH0KICAvLy8gICAgLi4uCiAgLy8vICAgIEZvbyBmb28gPSBzb3VyY2UucmVhZEVudW0oRm9vLnZhbHVlcyk7CiAgLy8vCiAgRSByZWFkRW51bTxFPihMaXN0PEU+IHZhbHVlcyk7CgogIC8vLyBSZWFkcyBhIFVSSSB2YWx1ZSBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgVXJpIHJlYWRVcmkoKTsKfQoKLy8vIE1peGluIHRoYXQgaW1wbGVtZW50cyBhbGwgY29udmVuaWVuY2UgbWV0aG9kcyBvZiBbRGF0YVNvdXJjZV0uCmFic3RyYWN0IGNsYXNzIERhdGFTb3VyY2VNaXhpbiBpbXBsZW1lbnRzIERhdGFTb3VyY2UgewogIEBvdmVycmlkZQogIEUgcmVhZFZhbHVlT3JOdWxsPEU+KEUgZigpKSB7CiAgICBib29sIGhhc1ZhbHVlID0gcmVhZEJvb2woKTsKICAgIGlmIChoYXNWYWx1ZSkgewogICAgICByZXR1cm4gZigpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PEU+IHJlYWRMaXN0PEU+KEUgZigpLCB7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBpZiAoY291bnQgPT0gMCAmJiBlbXB0eUFzTnVsbCkgcmV0dXJuIG51bGw7CiAgICBMaXN0PEU+IGxpc3QgPSBuZXcgTGlzdDxFPihjb3VudCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgbGlzdFtpXSA9IGYoKTsKICAgIH0KICAgIHJldHVybiBsaXN0OwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHJlYWRJbnRPck51bGwoKSB7CiAgICBib29sIGhhc1ZhbHVlID0gcmVhZEJvb2woKTsKICAgIGlmIChoYXNWYWx1ZSkgewogICAgICByZXR1cm4gcmVhZEludCgpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgcmVhZFN0cmluZ09yTnVsbCgpIHsKICAgIGJvb2wgaGFzVmFsdWUgPSByZWFkQm9vbCgpOwogICAgaWYgKGhhc1ZhbHVlKSB7CiAgICAgIHJldHVybiByZWFkU3RyaW5nKCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8U3RyaW5nPiByZWFkU3RyaW5ncyh7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBpZiAoY291bnQgPT0gMCAmJiBlbXB0eUFzTnVsbCkgcmV0dXJuIG51bGw7CiAgICBMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBMaXN0PFN0cmluZz4oY291bnQpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIGxpc3RbaV0gPSByZWFkU3RyaW5nKCk7CiAgICB9CiAgICByZXR1cm4gbGlzdDsKICB9CgogIEBvdmVycmlkZQogIE1hcDxTdHJpbmcsIFY+IHJlYWRTdHJpbmdNYXA8Vj4oViBmKCksIHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pIHsKICAgIGludCBjb3VudCA9IHJlYWRJbnQoKTsKICAgIGlmIChjb3VudCA9PSAwICYmIGVtcHR5QXNOdWxsKSByZXR1cm4gbnVsbDsKICAgIE1hcDxTdHJpbmcsIFY+IG1hcCA9IHt9OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIFN0cmluZyBrZXkgPSByZWFkU3RyaW5nKCk7CiAgICAgIFYgdmFsdWUgPSBmKCk7CiAgICAgIG1hcFtrZXldID0gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gbWFwOwogIH0KfQoKLy8vIERhdGEgc291cmNlIGhlbHBlciByZWFkcyBjYW5vbmljYWxpemVkIFtFXSB2YWx1ZXMgdGhyb3VnaCBpbmRpY2VzLgpjbGFzcyBJbmRleGVkU291cmNlPEU+IHsKICBmaW5hbCBpbnQgRnVuY3Rpb24oKSBfcmVhZEludDsKICBmaW5hbCBMaXN0PEU+IF9jYWNoZSA9IFtdOwogIGZpbmFsIFNldDxpbnQ+IF9wZW5kaW5nID0gbmV3IFNldCgpOwoKICBJbmRleGVkU291cmNlKHRoaXMuX3JlYWRJbnQpOwoKICAvLy8gUmVhZHMgYSByZWZlcmVuY2UgdG8gYW4gW0VdIHZhbHVlIGZyb20gdGhlIGRhdGEgc291cmNlLgogIC8vLwogIC8vLyBJZiB0aGUgdmFsdWUgaGFzbid0IHlldCBiZWVuIHJlYWQsIFtyZWFkVmFsdWVdIGlzIGNhbGxlZCB0byBkZXNlcmlhbGl6ZQogIC8vLyB0aGUgdmFsdWUgaXRzZWxmLgogIEUgcmVhZChFIHJlYWRWYWx1ZSgpKSB7CiAgICBpbnQgaW5kZXggPSBfcmVhZEludCgpOwogICAgaWYgKF9wZW5kaW5nLmNvbnRhaW5zKGluZGV4KSkgdGhyb3cgInNlcmlhbGl6YXRpb24gY3ljbGVzIG5vdCBzdXBwb3J0ZWQiOwogICAgaWYgKGluZGV4ID49IF9jYWNoZS5sZW5ndGgpIHsKICAgICAgX3BlbmRpbmcuYWRkKGluZGV4KTsKICAgICAgX2NhY2hlLmFkZChudWxsKTsKICAgICAgRSB2YWx1ZSA9IHJlYWRWYWx1ZSgpOwogICAgICBfcGVuZGluZy5yZW1vdmUoaW5kZXgpOwogICAgICBfY2FjaGVbaW5kZXhdID0gdmFsdWU7CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfY2FjaGVbaW5kZXhdOwogICAgfQogIH0KfQoKLy8vIEJhc2UgaW1wbGVtZW50YXRpb24gb2YgW0RhdGFTb3VyY2VdIHVzaW5nIFtEYXRhU291cmNlTWl4aW5dIHRvIGltcGxlbWVudAovLy8gY29udmVuaWVuY2UgbWV0aG9kcy4KYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REYXRhU291cmNlIGV4dGVuZHMgRGF0YVNvdXJjZU1peGluCiAgICBpbXBsZW1lbnRzIERhdGFTb3VyY2UgewogIEluZGV4ZWRTb3VyY2U8U3RyaW5nPiBfc3RyaW5nSW5kZXg7CiAgSW5kZXhlZFNvdXJjZTxVcmk+IF91cmlJbmRleDsKICBNYXA8VHlwZSwgSW5kZXhlZFNvdXJjZT4gX2dlbmVyYWxDYWNoZXMgPSB7fTsKCiAgQWJzdHJhY3REYXRhU291cmNlKCkgewogICAgX3N0cmluZ0luZGV4ID0gbmV3IEluZGV4ZWRTb3VyY2U8U3RyaW5nPihfcmVhZEludEludGVybmFsKTsKICAgIF91cmlJbmRleCA9IG5ldyBJbmRleGVkU291cmNlPFVyaT4oX3JlYWRJbnRJbnRlcm5hbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFIHJlYWRDYWNoZWQ8RT4oRSBmKCkpIHsKICAgIEluZGV4ZWRTb3VyY2Ugc291cmNlID0KICAgICAgICBfZ2VuZXJhbENhY2hlc1tFXSA/Pz0gbmV3IEluZGV4ZWRTb3VyY2U8RT4oX3JlYWRJbnRJbnRlcm5hbCk7CiAgICByZXR1cm4gc291cmNlLnJlYWQoZik7CiAgfQoKICBAb3ZlcnJpZGUKICBFIHJlYWRFbnVtPEU+KExpc3Q8RT4gdmFsdWVzKSB7CiAgICByZXR1cm4gX3JlYWRFbnVtSW50ZXJuYWwodmFsdWVzKTsKICB9CgogIEBvdmVycmlkZQogIFVyaSByZWFkVXJpKCkgewogICAgcmV0dXJuIF9yZWFkVXJpKCk7CiAgfQoKICBVcmkgX3JlYWRVcmkoKSB7CiAgICByZXR1cm4gX3VyaUluZGV4LnJlYWQoX3JlYWRVcmlJbnRlcm5hbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHJlYWRCb29sKCkgewogICAgaW50IHZhbHVlID0gX3JlYWRJbnRJbnRlcm5hbCgpOwogICAgYXNzZXJ0KHZhbHVlID09IDAgfHwgdmFsdWUgPT0gMSk7CiAgICByZXR1cm4gdmFsdWUgPT0gMTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyByZWFkU3RyaW5nKCkgewogICAgcmV0dXJuIF9yZWFkU3RyaW5nKCk7CiAgfQoKICBTdHJpbmcgX3JlYWRTdHJpbmcoKSB7CiAgICByZXR1cm4gX3N0cmluZ0luZGV4LnJlYWQoX3JlYWRTdHJpbmdJbnRlcm5hbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgcmVhZEludCgpIHsKICAgIHJldHVybiBfcmVhZEludEludGVybmFsKCk7CiAgfQoKICAvLy8gQWN0dWFsIGRlc2VyaWFsaXphdGlvbiBvZiBhIHN0cmluZyB2YWx1ZSwgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy4KICBTdHJpbmcgX3JlYWRTdHJpbmdJbnRlcm5hbCgpOwoKICAvLy8gQWN0dWFsIGRlc2VyaWFsaXphdGlvbiBvZiBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHZhbHVlLCBpbXBsZW1lbnRlZCBieQogIC8vLyBzdWJjbGFzc2VzLgogIGludCBfcmVhZEludEludGVybmFsKCk7CgogIC8vLyBBY3R1YWwgZGVzZXJpYWxpemF0aW9uIG9mIGEgVVJJIHZhbHVlLCBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzLgogIFVyaSBfcmVhZFVyaUludGVybmFsKCk7CgogIC8vLyBBY3R1YWwgZGVzZXJpYWxpemF0aW9uIG9mIGFuIGVudW0gdmFsdWUgaW4gW3ZhbHVlc10sIGltcGxlbWVudGVkIGJ5CiAgLy8vIHN1YmNsYXNzZXMuCiAgRSBfcmVhZEVudW1JbnRlcm5hbDxFPihMaXN0PEU+IHZhbHVlcyk7Cn0KCi8vLyBbRGF0YVNvdXJjZV0gdGhhdCByZWFkcyBkYXRhIGZyb20gYSBzZXF1ZW5jZSBvZiBieXRlcy4KLy8vCi8vLyBUaGlzIGRhdGEgc291cmNlIHdvcmtzIHRvZ2V0aGVyIHdpdGggW0JpbmFyeVNpbmtdLgpjbGFzcyBCaW5hcnlTb3VyY2UgZXh0ZW5kcyBBYnN0cmFjdERhdGFTb3VyY2UgewogIGludCBfYnl0ZU9mZnNldCA9IDA7CiAgZmluYWwgTGlzdDxpbnQ+IF9ieXRlczsKCiAgQmluYXJ5U291cmNlKHRoaXMuX2J5dGVzKTsKICBpbnQgX3JlYWRCeXRlKCkgPT4gX2J5dGVzW19ieXRlT2Zmc2V0KytdOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgX3JlYWRTdHJpbmdJbnRlcm5hbCgpIHsKICAgIGludCBsZW5ndGggPSBfcmVhZEludEludGVybmFsKCk7CiAgICBMaXN0PGludD4gYnl0ZXMgPSBuZXcgVWludDhMaXN0KGxlbmd0aCk7CiAgICBieXRlcy5zZXRSYW5nZSgwLCBieXRlcy5sZW5ndGgsIF9ieXRlcywgX2J5dGVPZmZzZXQpOwogICAgX2J5dGVPZmZzZXQgKz0gYnl0ZXMubGVuZ3RoOwogICAgcmV0dXJuIHV0ZjguZGVjb2RlKGJ5dGVzKTsKICB9CgogIEBvdmVycmlkZQogIGludCBfcmVhZEludEludGVybmFsKCkgewogICAgdmFyIGJ5dGUgPSBfcmVhZEJ5dGUoKTsKICAgIGlmIChieXRlICYgMHg4MCA9PSAwKSB7CiAgICAgIC8vIDB4eHh4eHh4CiAgICAgIHJldHVybiBieXRlOwogICAgfSBlbHNlIGlmIChieXRlICYgMHg0MCA9PSAwKSB7CiAgICAgIC8vIDEweHh4eHh4CiAgICAgIHJldHVybiAoKGJ5dGUgJiAweDNGKSA8PCA4KSB8IF9yZWFkQnl0ZSgpOwogICAgfSBlbHNlIHsKICAgICAgLy8gMTF4eHh4eHgKICAgICAgcmV0dXJuICgoYnl0ZSAmIDB4M0YpIDw8IDI0KSB8CiAgICAgICAgICAoX3JlYWRCeXRlKCkgPDwgMTYpIHwKICAgICAgICAgIChfcmVhZEJ5dGUoKSA8PCA4KSB8CiAgICAgICAgICBfcmVhZEJ5dGUoKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFVyaSBfcmVhZFVyaUludGVybmFsKCkgewogICAgU3RyaW5nIHRleHQgPSBfcmVhZFN0cmluZygpOwogICAgcmV0dXJuIFVyaS5wYXJzZSh0ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIEUgX3JlYWRFbnVtSW50ZXJuYWw8RT4oTGlzdDxFPiB2YWx1ZXMpIHsKICAgIGludCBpbmRleCA9IF9yZWFkSW50SW50ZXJuYWwoKTsKICAgIGFzc2VydCgKICAgICAgICAwIDw9IGluZGV4ICYmIGluZGV4IDwgdmFsdWVzLmxlbmd0aCwKICAgICAgICAiSW52YWxpZCBkYXRhIGtpbmQgaW5kZXguICIKICAgICAgICAiRXhwZWN0ZWQgb25lIG9mICR2YWx1ZXMsIGZvdW5kIGluZGV4ICRpbmRleC4iKTsKICAgIHJldHVybiB2YWx1ZXNbaW5kZXhdOwogIH0KfQqBKgBOTjwBGhcBI0McUFAaAVE0BjwjHwFMOwY8HDkBMxMBQBEBSw4GPCEXATIXAUUGPCQdAU87BjwfNwFKTzoGPCFFAVAGTCIGHw0wBiEBLxECAUM3DCAgFBIGEQQBDDobMCcmFQYRBAEMGCAUGAYRBAEMHiAUGwYRBAEMOBswMSYeBhEEAQxGGzAdJiEVGAYQBAIBRxkhHScBIAE+Bk4YGhxOIhsYHR4dFA0cBgQCAU0ZOhwmIDABGUA6BAEMGxtGGwQBDCImBAEMEhcEARMtBAEMFCQmFwQBDBgaBAEZMwQBDBIfBAFLIAFNEhoBSBoBShIqAgE7BDcwFxoBHSwBDCElLTohHwQBDBscHBITIxIxDRIlIB8XBgQBDBshHAQBDCskDC0kORoEAgErcGFja2FnZTpkYXJ0MmpzX2luZm8vc3JjL2JpbmFyeS9zb3VyY2UuZGFydCNzZGtyb290Oi9wa2cvanNfYXN0L2xpYi9qc19hc3QuZGFydIHoLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkganNfYXN0OwoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nIHNob3cgSXRlcmFibGVCYXNlOwppbXBvcnQgJ3NyYy9wcmVjZWRlbmNlLmRhcnQnOwppbXBvcnQgJ3NyYy9jaGFyYWN0ZXJzLmRhcnQnIGFzIGNoYXJDb2RlczsKCnBhcnQgJ3NyYy9ub2Rlcy5kYXJ0JzsKcGFydCAnc3JjL2J1aWxkZXIuZGFydCc7CnBhcnQgJ3NyYy9wcmludGVyLmRhcnQnOwpwYXJ0ICdzcmMvdGVtcGxhdGUuZGFydCc7CnBhcnQgJ3NyYy9lcXVpdmFsZW5jZV92aXNpdG9yLmRhcnQnOwoRAE5OPAEQASweKwEXGRkaJQEacGFja2FnZTpqc19hc3QvanNfYXN0LmRhcnQoc2Rrcm9vdDovcGtnL2pzX2FzdC9saWIvc3JjL3ByaW50ZXIuZGFydMAAsB4vLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBqc19hc3Q7Cgp0eXBlZGVmIFN0cmluZyBSZW5hbWVyKE5hbWUgbmFtZSk7CgpjbGFzcyBKYXZhU2NyaXB0UHJpbnRpbmdPcHRpb25zIHsKICBmaW5hbCBib29sIHNob3VsZENvbXByZXNzT3V0cHV0OwogIGZpbmFsIGJvb2wgbWluaWZ5TG9jYWxWYXJpYWJsZXM7CiAgZmluYWwgYm9vbCBwcmVmZXJTZW1pY29sb25Ub05ld2xpbmVJbk1pbmlmaWVkT3V0cHV0OwogIGZpbmFsIFJlbmFtZXIgcmVuYW1lckZvck5hbWVzOwoKICBKYXZhU2NyaXB0UHJpbnRpbmdPcHRpb25zKAogICAgICB7dGhpcy5zaG91bGRDb21wcmVzc091dHB1dDogZmFsc2UsCiAgICAgIHRoaXMubWluaWZ5TG9jYWxWYXJpYWJsZXM6IGZhbHNlLAogICAgICB0aGlzLnByZWZlclNlbWljb2xvblRvTmV3bGluZUluTWluaWZpZWRPdXRwdXQ6IGZhbHNlLAogICAgICB0aGlzLnJlbmFtZXJGb3JOYW1lczogaWRlbnRpdHlSZW5hbWVyfSk7CgogIHN0YXRpYyBTdHJpbmcgaWRlbnRpdHlSZW5hbWVyKE5hbWUgbmFtZSkgPT4gbmFtZS5uYW1lOwp9CgovLy8gQW4gZW52aXJvbm1lbnQgaW4gd2hpY2ggSmF2YVNjcmlwdCBwcmludGluZyBpcyBkb25lLiAgUHJvdmlkZXMgZW1pdHRpbmcgb2YKLy8vIHRleHQgYW5kIHByZS0gYW5kIHBvc3QtdmlzaXQgY2FsbGJhY2tzLgphYnN0cmFjdCBjbGFzcyBKYXZhU2NyaXB0UHJpbnRpbmdDb250ZXh0IHsKICAvLy8gU2lnbmFscyBhbiBlcnJvci4gIFRoaXMgc2hvdWxkIGhhcHBlbiBvbmx5IGZvciBzZXJpb3VzIGludGVybmFsIGVycm9ycy4KICB2b2lkIGVycm9yKFN0cmluZyBtZXNzYWdlKSB7CiAgICB0aHJvdyBtZXNzYWdlOwogIH0KCiAgLy8vIEFkZHMgW3N0cmluZ10gdG8gdGhlIG91dHB1dC4KICB2b2lkIGVtaXQoU3RyaW5nIHN0cmluZyk7CgogIC8vLyBDYWxsYmFjayBmb3IgdGhlIHN0YXJ0IG9mIHByaW50aW5nIG9mIFtub2RlXS4gW3N0YXJ0UG9zaXRpb25dIGlzIHRoZQogIC8vLyBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIG9mIFtub2RlXS4KICAvLy8KICAvLy8gW2VudGVyTm9kZV0gaXMgY2FsbGVkIGluIHByZS10cmF2ZXJzYWwgb3JkZXIuCiAgdm9pZCBlbnRlck5vZGUoTm9kZSBub2RlLCBpbnQgc3RhcnRQb3NpdGlvbikge30KCiAgLy8vIENhbGxiYWNrIGZvciB0aGUgZW5kIG9mIHByaW50aW5nIG9mIFtub2RlXS4gW3N0YXJ0UG9zaXRpb25dIGlzIHRoZQogIC8vLyBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIG9mIFtub2RlXSAoYWxzbyBwcm92aWRlZAogIC8vLyBpbiB0aGUgW2VudGVyTm9kZV0gY2FsbGJhY2spLCBbZW5kUG9zaXRpb25dIGlzIHRoZSBwb3NpdGlvbiBpbW1lZGlhdGVseQogIC8vLyBmb2xsb3dpbmcgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIFtub2RlXS4gW2Nsb3NpbmdQb3NpdGlvbl0gaXMgdGhlCiAgLy8vIHBvc2l0aW9uIG9mIHRoZSBlbmRpbmcgZGVsaW1pdGVyIG9mIFtub2RlXS4gVGhpcyBpcyBvbmx5IHByb3ZpZGVkIGZvcgogIC8vLyBbRnVuXSBub2RlcyBhbmQgaXMgYG51bGxgIG90aGVyd2lzZS4KICAvLy8KICAvLy8gW2VudGVyTm9kZV0gaXMgY2FsbGVkIGluIHBvc3QtdHJhdmVyc2FsIG9yZGVyLgogIHZvaWQgZXhpdE5vZGUoCiAgICAgIE5vZGUgbm9kZSwgaW50IHN0YXJ0UG9zaXRpb24sIGludCBlbmRQb3NpdGlvbiwgaW50IGNsb3NpbmdQb3NpdGlvbikge30KfQoKLy8vIEEgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIFtKYXZhU2NyaXB0UHJpbnRpbmdDb250ZXh0XSBzdWl0YWJsZSBmb3IgdGVzdHMuCmNsYXNzIFNpbXBsZUphdmFTY3JpcHRQcmludGluZ0NvbnRleHQgZXh0ZW5kcyBKYXZhU2NyaXB0UHJpbnRpbmdDb250ZXh0IHsKICBmaW5hbCBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwoKICB2b2lkIGVtaXQoU3RyaW5nIHN0cmluZykgewogICAgYnVmZmVyLndyaXRlKHN0cmluZyk7CiAgfQoKICBTdHJpbmcgZ2V0VGV4dCgpID0+IGJ1ZmZlci50b1N0cmluZygpOwp9CgpTdHJpbmcgRGVidWdQcmludChOb2RlIG5vZGUpIHsKICBKYXZhU2NyaXB0UHJpbnRpbmdPcHRpb25zIG9wdGlvbnMgPSBuZXcgSmF2YVNjcmlwdFByaW50aW5nT3B0aW9ucygpOwogIFNpbXBsZUphdmFTY3JpcHRQcmludGluZ0NvbnRleHQgY29udGV4dCA9CiAgICAgIG5ldyBTaW1wbGVKYXZhU2NyaXB0UHJpbnRpbmdDb250ZXh0KCk7CiAgUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIob3B0aW9ucywgY29udGV4dCk7CiAgcHJpbnRlci52aXNpdChub2RlKTsKICByZXR1cm4gY29udGV4dC5nZXRUZXh0KCk7Cn0KCmNsYXNzIFByaW50ZXIgaW1wbGVtZW50cyBOb2RlVmlzaXRvciB7CiAgZmluYWwgSmF2YVNjcmlwdFByaW50aW5nT3B0aW9ucyBvcHRpb25zOwogIGZpbmFsIEphdmFTY3JpcHRQcmludGluZ0NvbnRleHQgY29udGV4dDsKICBmaW5hbCBib29sIHNob3VsZENvbXByZXNzT3V0cHV0OwogIGZpbmFsIERhbmdsaW5nRWxzZVZpc2l0b3IgZGFuZ2xpbmdFbHNlVmlzaXRvcjsKICBmaW5hbCBMb2NhbE5hbWVyIGxvY2FsTmFtZXI7CgogIGludCBfY2hhckNvdW50ID0gMDsKICBib29sIGluRm9ySW5pdCA9IGZhbHNlOwogIGJvb2wgYXRTdGF0ZW1lbnRCZWdpbiA9IGZhbHNlOwogIGJvb2wgcGVuZGluZ1NlbWljb2xvbiA9IGZhbHNlOwogIGJvb2wgcGVuZGluZ1NwYWNlID0gZmFsc2U7CgogIC8vIFRoZSBjdXJyZW50IGluZGVudGF0aW9uIGxldmVsLgogIGludCBfaW5kZW50TGV2ZWwgPSAwOwogIC8vIEEgY2FjaGUgb2YgYWxsIGluZGVudGF0aW9uIHN0cmluZ3MgdXNlZCBzbyBmYXIuCiAgTGlzdDxTdHJpbmc+IF9pbmRlbnRMaXN0ID0gPFN0cmluZz5bIiJdOwoKICBzdGF0aWMgZmluYWwgaWRlbnRpZmllckNoYXJhY3RlclJlZ0V4cCA9IG5ldyBSZWdFeHAocideW2EtekEtWl8wLTkkXScpOwogIHN0YXRpYyBmaW5hbCBleHByZXNzaW9uQ29udGludWF0aW9uUmVnRXhwID0gbmV3IFJlZ0V4cChyJ15bLSsoW10nKTsKCiAgUHJpbnRlcihKYXZhU2NyaXB0UHJpbnRpbmdPcHRpb25zIG9wdGlvbnMsIEphdmFTY3JpcHRQcmludGluZ0NvbnRleHQgY29udGV4dCkKICAgICAgOiBvcHRpb25zID0gb3B0aW9ucywKICAgICAgICBjb250ZXh0ID0gY29udGV4dCwKICAgICAgICBzaG91bGRDb21wcmVzc091dHB1dCA9IG9wdGlvbnMuc2hvdWxkQ29tcHJlc3NPdXRwdXQsCiAgICAgICAgZGFuZ2xpbmdFbHNlVmlzaXRvciA9IG5ldyBEYW5nbGluZ0Vsc2VWaXNpdG9yKGNvbnRleHQpLAogICAgICAgIGxvY2FsTmFtZXIgPSBkZXRlcm1pbmVSZW5hbWVyKAogICAgICAgICAgICBvcHRpb25zLnNob3VsZENvbXByZXNzT3V0cHV0LCBvcHRpb25zLm1pbmlmeUxvY2FsVmFyaWFibGVzKTsKCiAgc3RhdGljIExvY2FsTmFtZXIgZGV0ZXJtaW5lUmVuYW1lcigKICAgICAgYm9vbCBzaG91bGRDb21wcmVzc091dHB1dCwgYm9vbCBhbGxvd1ZhcmlhYmxlTWluaWZpY2F0aW9uKSB7CiAgICByZXR1cm4gKHNob3VsZENvbXByZXNzT3V0cHV0ICYmIGFsbG93VmFyaWFibGVNaW5pZmljYXRpb24pCiAgICAgICAgPyBuZXcgTWluaWZ5UmVuYW1lcigpCiAgICAgICAgOiBuZXcgSWRlbnRpdHlOYW1lcigpOwogIH0KCiAgLy8gVGhlIGN1cnJlbnQgaW5kZW50YXRpb24gc3RyaW5nLgogIFN0cmluZyBnZXQgaW5kZW50YXRpb24gewogICAgLy8gTGF6aWx5IGFkZCBuZXcgaW5kZW50YXRpb24gc3RyaW5ncyBhcyByZXF1aXJlZC4KICAgIHdoaWxlIChfaW5kZW50TGlzdC5sZW5ndGggPD0gX2luZGVudExldmVsKSB7CiAgICAgIF9pbmRlbnRMaXN0LmFkZChfaW5kZW50TGlzdC5sYXN0ICsgIiAgIik7CiAgICB9CiAgICByZXR1cm4gX2luZGVudExpc3RbX2luZGVudExldmVsXTsKICB9CgogIHZvaWQgaW5kZW50TW9yZSgpIHsKICAgIF9pbmRlbnRMZXZlbCsrOwogIH0KCiAgdm9pZCBpbmRlbnRMZXNzKCkgewogICAgX2luZGVudExldmVsLS07CiAgfQoKICAvLy8gQWx3YXlzIGVtaXQgYSBuZXdsaW5lLCBldmVuIHVuZGVyIGBlbmFibGVNaW5pZmljYXRpb25gLgogIHZvaWQgZm9yY2VMaW5lKCkgewogICAgb3V0KCJcbiIsIGlzV2hpdGVzcGFjZTogdHJ1ZSk7CiAgfQoKICAvLy8gRW1pdHMgYSBuZXdsaW5lIGZvciByZWFkYWJpbGl0eS4KICB2b2lkIGxpbmVPdXQoKSB7CiAgICBpZiAoIXNob3VsZENvbXByZXNzT3V0cHV0KSBmb3JjZUxpbmUoKTsKICB9CgogIHZvaWQgc3BhY2VPdXQoKSB7CiAgICBpZiAoIXNob3VsZENvbXByZXNzT3V0cHV0KSBvdXQoIiAiLCBpc1doaXRlc3BhY2U6IHRydWUpOwogIH0KCiAgU3RyaW5nIGxhc3RBZGRlZFN0cmluZyA9IG51bGw7CgogIGludCBnZXQgbGFzdENoYXJDb2RlIHsKICAgIGlmIChsYXN0QWRkZWRTdHJpbmcgPT0gbnVsbCkgcmV0dXJuIDA7CiAgICBhc3NlcnQobGFzdEFkZGVkU3RyaW5nLmxlbmd0aCAhPSAwKTsKICAgIHJldHVybiBsYXN0QWRkZWRTdHJpbmcuY29kZVVuaXRBdChsYXN0QWRkZWRTdHJpbmcubGVuZ3RoIC0gMSk7CiAgfQoKICB2b2lkIG91dChTdHJpbmcgc3RyLCB7Ym9vbCBpc1doaXRlc3BhY2U6IGZhbHNlfSkgewogICAgaWYgKHN0ciAhPSAiIikgewogICAgICBpZiAocGVuZGluZ1NlbWljb2xvbikgewogICAgICAgIGlmICghc2hvdWxkQ29tcHJlc3NPdXRwdXQpIHsKICAgICAgICAgIF9lbWl0KCI7Iik7CiAgICAgICAgfSBlbHNlIGlmIChzdHIgIT0gIn0iKSB7CiAgICAgICAgICAvLyBXZSB3YW50IHRvIG91dHB1dCBuZXdsaW5lIGluc3RlYWQgb2Ygc2VtaWNvbG9uIGJlY2F1c2UgaXQgbWFrZXMKICAgICAgICAgIC8vIHRoZSByYXcgc3RhY2sgdHJhY2VzIG11Y2ggZWFzaWVyIHRvIHJlYWQgYW5kIGl0IGFsc28gbWFrZXMgbGluZS0KICAgICAgICAgIC8vIGJhc2VkIHRvb2xzIGxpa2UgZGlmZiB3b3JrIG11Y2ggYmV0dGVyLiAgSmF2YVNjcmlwdCB3aWxsCiAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGluc2VydCB0aGUgc2VtaWNvbG9uIGF0IHRoZSBuZXdsaW5lIGlmIGl0IG1lYW5zIGEKICAgICAgICAgIC8vIHBhcnNpbmcgZXJyb3IgaXMgYXZvaWRlZCwgc28gd2UgY2FuIG9ubHkgZG8gdGhpcyB0cmljayBpZiB0aGUKICAgICAgICAgIC8vIG5leHQgbGluZSBpcyBub3Qgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGdsdWVkIG9udG8gYSB2YWxpZAogICAgICAgICAgLy8gZXhwcmVzc2lvbiB0byBtYWtlIGEgbmV3IHZhbGlkIGV4cHJlc3Npb24uCgogICAgICAgICAgLy8gSWYgd2UncmUgdXNpbmcgdGhlIG5ldyBlbWl0dGVyIHdoZXJlIG1vc3QgcHJldHR5IHByaW50ZWQgY29kZQogICAgICAgICAgLy8gaXMgZXNjYXBlZCBpbiBzdHJpbmdzLCBpdCBpcyBhIGxvdCBlYXNpZXIgdG8gZGVhbCB3aXRoIHNlbWljb2xvbnMKICAgICAgICAgIC8vIHRoYW4gbmV3bGluZXMgYmVjYXVzZSB0aGUgZm9ybWVyIGRvZXNuJ3QgbmVlZCBlc2NhcGluZy4KICAgICAgICAgIGlmIChvcHRpb25zLnByZWZlclNlbWljb2xvblRvTmV3bGluZUluTWluaWZpZWRPdXRwdXQgfHwKICAgICAgICAgICAgICBleHByZXNzaW9uQ29udGludWF0aW9uUmVnRXhwLmhhc01hdGNoKHN0cikpIHsKICAgICAgICAgICAgX2VtaXQoIjsiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9lbWl0KCJcbiIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAocGVuZGluZ1NwYWNlICYmCiAgICAgICAgICAoIXNob3VsZENvbXByZXNzT3V0cHV0IHx8IGlkZW50aWZpZXJDaGFyYWN0ZXJSZWdFeHAuaGFzTWF0Y2goc3RyKSkpIHsKICAgICAgICBfZW1pdCgiICIpOwogICAgICB9CiAgICAgIHBlbmRpbmdTcGFjZSA9IGZhbHNlOwogICAgICBwZW5kaW5nU2VtaWNvbG9uID0gZmFsc2U7CiAgICAgIGlmICghaXNXaGl0ZXNwYWNlKSB7CiAgICAgICAgZW50ZXJOb2RlKCk7CiAgICAgIH0KICAgICAgX2VtaXQoc3RyKTsKICAgICAgbGFzdEFkZGVkU3RyaW5nID0gc3RyOwogICAgfQogIH0KCiAgdm9pZCBvdXRMbihTdHJpbmcgc3RyKSB7CiAgICBvdXQoc3RyKTsKICAgIGxpbmVPdXQoKTsKICB9CgogIHZvaWQgb3V0U2VtaWNvbG9uTG4oKSB7CiAgICBpZiAoc2hvdWxkQ29tcHJlc3NPdXRwdXQpIHsKICAgICAgcGVuZGluZ1NlbWljb2xvbiA9IHRydWU7CiAgICB9IGVsc2UgewogICAgICBvdXQoIjsiKTsKICAgICAgZm9yY2VMaW5lKCk7CiAgICB9CiAgfQoKICB2b2lkIG91dEluZGVudChTdHJpbmcgc3RyKSB7CiAgICBpbmRlbnQoKTsKICAgIG91dChzdHIpOwogIH0KCiAgdm9pZCBvdXRJbmRlbnRMbihTdHJpbmcgc3RyKSB7CiAgICBpbmRlbnQoKTsKICAgIG91dExuKHN0cik7CiAgfQoKICB2b2lkIGluZGVudCgpIHsKICAgIGlmICghc2hvdWxkQ29tcHJlc3NPdXRwdXQpIHsKICAgICAgb3V0KGluZGVudGF0aW9uLCBpc1doaXRlc3BhY2U6IHRydWUpOwogICAgfQogIH0KCiAgRW50ZXJFeGl0Tm9kZSBjdXJyZW50Tm9kZTsKCiAgdm9pZCBfZW1pdChTdHJpbmcgdGV4dCkgewogICAgY29udGV4dC5lbWl0KHRleHQpOwogICAgX2NoYXJDb3VudCArPSB0ZXh0Lmxlbmd0aDsKICB9CgogIHZvaWQgc3RhcnROb2RlKE5vZGUgbm9kZSkgewogICAgY3VycmVudE5vZGUgPSBuZXcgRW50ZXJFeGl0Tm9kZShjdXJyZW50Tm9kZSwgbm9kZSk7CiAgfQoKICB2b2lkIGVudGVyTm9kZSgpIHsKICAgIGN1cnJlbnROb2RlLmFkZFRvTm9kZShjb250ZXh0LCBfY2hhckNvdW50KTsKICB9CgogIHZvaWQgZW5kTm9kZShOb2RlIG5vZGUpIHsKICAgIGFzc2VydChjdXJyZW50Tm9kZS5ub2RlID09IG5vZGUpOwogICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5leGl0Tm9kZShjb250ZXh0LCBfY2hhckNvdW50KTsKICB9CgogIHZvaWQgdmlzaXQoTm9kZSBub2RlKSB7CiAgICBzdGFydE5vZGUobm9kZSk7CiAgICBub2RlLmFjY2VwdCh0aGlzKTsKICAgIGVuZE5vZGUobm9kZSk7CiAgfQoKICB2b2lkIHZpc2l0Q29tbWFTZXBhcmF0ZWQoTGlzdDxOb2RlPiBub2RlcywgaW50IGhhc1JlcXVpcmVkVHlwZSwKICAgICAge2Jvb2wgbmV3SW5Gb3JJbml0LCBib29sIG5ld0F0U3RhdGVtZW50QmVnaW59KSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChpICE9IDApIHsKICAgICAgICBhdFN0YXRlbWVudEJlZ2luID0gZmFsc2U7CiAgICAgICAgb3V0KCIsIik7CiAgICAgICAgc3BhY2VPdXQoKTsKICAgICAgfQogICAgICB2aXNpdE5lc3RlZEV4cHJlc3Npb24obm9kZXNbaV0sIGhhc1JlcXVpcmVkVHlwZSwKICAgICAgICAgIG5ld0luRm9ySW5pdDogbmV3SW5Gb3JJbml0LCBuZXdBdFN0YXRlbWVudEJlZ2luOiBuZXdBdFN0YXRlbWVudEJlZ2luKTsKICAgIH0KICB9CgogIHZvaWQgdmlzaXRBbGwoTGlzdDxOb2RlPiBub2RlcykgewogICAgbm9kZXMuZm9yRWFjaCh2aXNpdCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UHJvZ3JhbShQcm9ncmFtIHByb2dyYW0pIHsKICAgIGlmIChwcm9ncmFtLmJvZHkuaXNOb3RFbXB0eSkgewogICAgICB2aXNpdEFsbChwcm9ncmFtLmJvZHkpOwogICAgfQogIH0KCiAgU3RhdGVtZW50IHVud3JhcEJsb2NrSWZTaW5nbGVTdGF0ZW1lbnQoU3RhdGVtZW50IGJvZHkpIHsKICAgIFN0YXRlbWVudCByZXN1bHQgPSBib2R5OwogICAgd2hpbGUgKHJlc3VsdCBpcyBCbG9jaykgewogICAgICBCbG9jayBibG9jayA9IHJlc3VsdDsKICAgICAgaWYgKGJsb2NrLnN0YXRlbWVudHMubGVuZ3RoICE9IDEpIGJyZWFrOwogICAgICByZXN1bHQgPSBibG9jay5zdGF0ZW1lbnRzLnNpbmdsZTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBib29sIGJsb2NrQm9keShTdGF0ZW1lbnQgYm9keSwge2Jvb2wgbmVlZHNTZXBhcmF0aW9uLCBib29sIG5lZWRzTmV3bGluZX0pIHsKICAgIGlmIChib2R5IGlzIEJsb2NrKSB7CiAgICAgIHNwYWNlT3V0KCk7CiAgICAgIGJsb2NrT3V0KGJvZHksIHNob3VsZEluZGVudDogZmFsc2UsIG5lZWRzTmV3bGluZTogbmVlZHNOZXdsaW5lKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoc2hvdWxkQ29tcHJlc3NPdXRwdXQgJiYgbmVlZHNTZXBhcmF0aW9uKSB7CiAgICAgIC8vIElmIFtzaG91bGRDb21wcmVzc091dHB1dF0gaXMgZmFsc2UsIHRoZW4gdGhlICdsaW5lT3V0JyB3aWxsIGluc2VydAogICAgICAvLyB0aGUgc2VwYXJhdGlvbi4KICAgICAgb3V0KCIgIiwgaXNXaGl0ZXNwYWNlOiB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIGxpbmVPdXQoKTsKICAgIH0KICAgIGluZGVudE1vcmUoKTsKICAgIHZpc2l0KGJvZHkpOwogICAgaW5kZW50TGVzcygpOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgdm9pZCBibG9ja091dFdpdGhvdXRCcmFjZXMoTm9kZSBub2RlKSB7CiAgICBpZiAobm9kZSBpcyBCbG9jaykgewogICAgICBzdGFydE5vZGUobm9kZSk7CiAgICAgIEJsb2NrIGJsb2NrID0gbm9kZTsKICAgICAgYmxvY2suc3RhdGVtZW50cy5mb3JFYWNoKGJsb2NrT3V0V2l0aG91dEJyYWNlcyk7CiAgICAgIGVuZE5vZGUobm9kZSk7CiAgICB9IGVsc2UgewogICAgICB2aXNpdChub2RlKTsKICAgIH0KICB9CgogIGludCBibG9ja091dChCbG9jayBub2RlLCB7Ym9vbCBzaG91bGRJbmRlbnQsIGJvb2wgbmVlZHNOZXdsaW5lfSkgewogICAgaWYgKHNob3VsZEluZGVudCkgaW5kZW50KCk7CiAgICBzdGFydE5vZGUobm9kZSk7CiAgICBvdXQoInsiKTsKICAgIGxpbmVPdXQoKTsKICAgIGluZGVudE1vcmUoKTsKICAgIG5vZGUuc3RhdGVtZW50cy5mb3JFYWNoKGJsb2NrT3V0V2l0aG91dEJyYWNlcyk7CiAgICBpbmRlbnRMZXNzKCk7CiAgICBpbmRlbnQoKTsKICAgIG91dCgifSIpOwogICAgaW50IGNsb3NpbmdQb3NpdGlvbiA9IF9jaGFyQ291bnQgLSAxOwogICAgZW5kTm9kZShub2RlKTsKICAgIGlmIChuZWVkc05ld2xpbmUpIGxpbmVPdXQoKTsKICAgIHJldHVybiBjbG9zaW5nUG9zaXRpb247CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QmxvY2soQmxvY2sgYmxvY2spIHsKICAgIGJsb2NrT3V0KGJsb2NrLCBzaG91bGRJbmRlbnQ6IHRydWUsIG5lZWRzTmV3bGluZTogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpIHsKICAgIGluZGVudCgpOwogICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKG5vZGUuZXhwcmVzc2lvbiwgRVhQUkVTU0lPTiwKICAgICAgICBuZXdJbkZvckluaXQ6IGZhbHNlLCBuZXdBdFN0YXRlbWVudEJlZ2luOiB0cnVlKTsKICAgIG91dFNlbWljb2xvbkxuKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RW1wdHlTdGF0ZW1lbnQoRW1wdHlTdGF0ZW1lbnQgbm9kZSkgewogICAgb3V0SW5kZW50TG4oIjsiKTsKICB9CgogIHZvaWQgaWZPdXQoSWYgbm9kZSwgYm9vbCBzaG91bGRJbmRlbnQpIHsKICAgIFN0YXRlbWVudCB0aGVuID0gdW53cmFwQmxvY2tJZlNpbmdsZVN0YXRlbWVudChub2RlLnRoZW4pOwogICAgU3RhdGVtZW50IGVsc2VQYXJ0ID0gbm9kZS5vdGhlcndpc2U7CiAgICBib29sIGhhc0Vsc2UgPSBub2RlLmhhc0Vsc2U7CgogICAgLy8gSGFuZGxlIGRhbmdsaW5nIGVsc2VzIGFuZCBhIHdvcmstYXJvdW5kIGZvciBBbmRyb2lkIDQuMCBzdG9jayBicm93c2VyLgogICAgLy8gQW5kcm9pZCA0LjAgcmVxdWlyZXMgYnJhY2VzIGZvciBhIHNpbmdsZSBkby13aGlsZSBpbiB0aGUgYHRoZW5gIGJyYW5jaC4KICAgIC8vIFNlZSBpc3N1ZSAxMDkyMy4KICAgIGlmIChoYXNFbHNlKSB7CiAgICAgIGJvb2wgbmVlZHNCcmFjZXMgPSB0aGVuLmFjY2VwdChkYW5nbGluZ0Vsc2VWaXNpdG9yKSB8fCB0aGVuIGlzIERvOwogICAgICBpZiAobmVlZHNCcmFjZXMpIHsKICAgICAgICB0aGVuID0gbmV3IEJsb2NrKDxTdGF0ZW1lbnQ+W3RoZW5dKTsKICAgICAgfQogICAgfQogICAgaWYgKHNob3VsZEluZGVudCkgaW5kZW50KCk7CiAgICBvdXQoImlmIik7CiAgICBzcGFjZU91dCgpOwogICAgb3V0KCIoIik7CiAgICB2aXNpdE5lc3RlZEV4cHJlc3Npb24obm9kZS5jb25kaXRpb24sIEVYUFJFU1NJT04sCiAgICAgICAgbmV3SW5Gb3JJbml0OiBmYWxzZSwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgb3V0KCIpIik7CiAgICBib29sIHRoZW5XYXNCbG9jayA9CiAgICAgICAgYmxvY2tCb2R5KHRoZW4sIG5lZWRzU2VwYXJhdGlvbjogZmFsc2UsIG5lZWRzTmV3bGluZTogIWhhc0Vsc2UpOwogICAgaWYgKGhhc0Vsc2UpIHsKICAgICAgaWYgKHRoZW5XYXNCbG9jaykgewogICAgICAgIHNwYWNlT3V0KCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW5kZW50KCk7CiAgICAgIH0KICAgICAgb3V0KCJlbHNlIik7CiAgICAgIGlmIChlbHNlUGFydCBpcyBJZikgewogICAgICAgIHBlbmRpbmdTcGFjZSA9IHRydWU7CiAgICAgICAgc3RhcnROb2RlKGVsc2VQYXJ0KTsKICAgICAgICBpZk91dChlbHNlUGFydCwgZmFsc2UpOwogICAgICAgIGVuZE5vZGUoZWxzZVBhcnQpOwogICAgICB9IGVsc2UgewogICAgICAgIGJsb2NrQm9keSh1bndyYXBCbG9ja0lmU2luZ2xlU3RhdGVtZW50KGVsc2VQYXJ0KSwKICAgICAgICAgICAgbmVlZHNTZXBhcmF0aW9uOiB0cnVlLCBuZWVkc05ld2xpbmU6IHRydWUpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SWYoSWYgbm9kZSkgewogICAgaWZPdXQobm9kZSwgdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Rm9yKEZvciBsb29wKSB7CiAgICBvdXRJbmRlbnQoImZvciIpOwogICAgc3BhY2VPdXQoKTsKICAgIG91dCgiKCIpOwogICAgaWYgKGxvb3AuaW5pdCAhPSBudWxsKSB7CiAgICAgIHZpc2l0TmVzdGVkRXhwcmVzc2lvbihsb29wLmluaXQsIEVYUFJFU1NJT04sCiAgICAgICAgICBuZXdJbkZvckluaXQ6IHRydWUsIG5ld0F0U3RhdGVtZW50QmVnaW46IGZhbHNlKTsKICAgIH0KICAgIG91dCgiOyIpOwogICAgaWYgKGxvb3AuY29uZGl0aW9uICE9IG51bGwpIHsKICAgICAgc3BhY2VPdXQoKTsKICAgICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKGxvb3AuY29uZGl0aW9uLCBFWFBSRVNTSU9OLAogICAgICAgICAgbmV3SW5Gb3JJbml0OiBmYWxzZSwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgfQogICAgb3V0KCI7Iik7CiAgICBpZiAobG9vcC51cGRhdGUgIT0gbnVsbCkgewogICAgICBzcGFjZU91dCgpOwogICAgICB2aXNpdE5lc3RlZEV4cHJlc3Npb24obG9vcC51cGRhdGUsIEVYUFJFU1NJT04sCiAgICAgICAgICBuZXdJbkZvckluaXQ6IGZhbHNlLCBuZXdBdFN0YXRlbWVudEJlZ2luOiBmYWxzZSk7CiAgICB9CiAgICBvdXQoIikiKTsKICAgIGJsb2NrQm9keSh1bndyYXBCbG9ja0lmU2luZ2xlU3RhdGVtZW50KGxvb3AuYm9keSksCiAgICAgICAgbmVlZHNTZXBhcmF0aW9uOiBmYWxzZSwgbmVlZHNOZXdsaW5lOiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGb3JJbihGb3JJbiBsb29wKSB7CiAgICBvdXRJbmRlbnQoImZvciIpOwogICAgc3BhY2VPdXQoKTsKICAgIG91dCgiKCIpOwogICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKGxvb3AubGVmdEhhbmRTaWRlLCBFWFBSRVNTSU9OLAogICAgICAgIG5ld0luRm9ySW5pdDogdHJ1ZSwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgb3V0KCIgaW4iKTsKICAgIHBlbmRpbmdTcGFjZSA9IHRydWU7CiAgICB2aXNpdE5lc3RlZEV4cHJlc3Npb24obG9vcC5vYmplY3QsIEVYUFJFU1NJT04sCiAgICAgICAgbmV3SW5Gb3JJbml0OiBmYWxzZSwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgb3V0KCIpIik7CiAgICBibG9ja0JvZHkodW53cmFwQmxvY2tJZlNpbmdsZVN0YXRlbWVudChsb29wLmJvZHkpLAogICAgICAgIG5lZWRzU2VwYXJhdGlvbjogZmFsc2UsIG5lZWRzTmV3bGluZTogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0V2hpbGUoV2hpbGUgbG9vcCkgewogICAgb3V0SW5kZW50KCJ3aGlsZSIpOwogICAgc3BhY2VPdXQoKTsKICAgIG91dCgiKCIpOwogICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKGxvb3AuY29uZGl0aW9uLCBFWFBSRVNTSU9OLAogICAgICAgIG5ld0luRm9ySW5pdDogZmFsc2UsIG5ld0F0U3RhdGVtZW50QmVnaW46IGZhbHNlKTsKICAgIG91dCgiKSIpOwogICAgYmxvY2tCb2R5KHVud3JhcEJsb2NrSWZTaW5nbGVTdGF0ZW1lbnQobG9vcC5ib2R5KSwKICAgICAgICBuZWVkc1NlcGFyYXRpb246IGZhbHNlLCBuZWVkc05ld2xpbmU6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERvKERvIGxvb3ApIHsKICAgIG91dEluZGVudCgiZG8iKTsKICAgIGlmIChibG9ja0JvZHkodW53cmFwQmxvY2tJZlNpbmdsZVN0YXRlbWVudChsb29wLmJvZHkpLAogICAgICAgIG5lZWRzU2VwYXJhdGlvbjogdHJ1ZSwgbmVlZHNOZXdsaW5lOiBmYWxzZSkpIHsKICAgICAgc3BhY2VPdXQoKTsKICAgIH0gZWxzZSB7CiAgICAgIGluZGVudCgpOwogICAgfQogICAgb3V0KCJ3aGlsZSIpOwogICAgc3BhY2VPdXQoKTsKICAgIG91dCgiKCIpOwogICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKGxvb3AuY29uZGl0aW9uLCBFWFBSRVNTSU9OLAogICAgICAgIG5ld0luRm9ySW5pdDogZmFsc2UsIG5ld0F0U3RhdGVtZW50QmVnaW46IGZhbHNlKTsKICAgIG91dCgiKSIpOwogICAgb3V0U2VtaWNvbG9uTG4oKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDb250aW51ZShDb250aW51ZSBub2RlKSB7CiAgICBpZiAobm9kZS50YXJnZXRMYWJlbCA9PSBudWxsKSB7CiAgICAgIG91dEluZGVudCgiY29udGludWUiKTsKICAgIH0gZWxzZSB7CiAgICAgIG91dEluZGVudCgiY29udGludWUgJHtub2RlLnRhcmdldExhYmVsfSIpOwogICAgfQogICAgb3V0U2VtaWNvbG9uTG4oKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCcmVhayhCcmVhayBub2RlKSB7CiAgICBpZiAobm9kZS50YXJnZXRMYWJlbCA9PSBudWxsKSB7CiAgICAgIG91dEluZGVudCgiYnJlYWsiKTsKICAgIH0gZWxzZSB7CiAgICAgIG91dEluZGVudCgiYnJlYWsgJHtub2RlLnRhcmdldExhYmVsfSIpOwogICAgfQogICAgb3V0U2VtaWNvbG9uTG4oKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRSZXR1cm4oUmV0dXJuIG5vZGUpIHsKICAgIGlmIChub2RlLnZhbHVlID09IG51bGwpIHsKICAgICAgb3V0SW5kZW50KCJyZXR1cm4iKTsKICAgIH0gZWxzZSB7CiAgICAgIG91dEluZGVudCgicmV0dXJuIik7CiAgICAgIHBlbmRpbmdTcGFjZSA9IHRydWU7CiAgICAgIHZpc2l0TmVzdGVkRXhwcmVzc2lvbihub2RlLnZhbHVlLCBFWFBSRVNTSU9OLAogICAgICAgICAgbmV3SW5Gb3JJbml0OiBmYWxzZSwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgfQogICAgLy8gU2V0IHRoZSBjbG9zaW5nIHBvc2l0aW9uIHRvIGJlIGJlZm9yZSB0aGUgb3B0aW9uYWwgc2VtaWNvbG9uLgogICAgY3VycmVudE5vZGUuY2xvc2luZ1Bvc2l0aW9uID0gX2NoYXJDb3VudDsKICAgIG91dFNlbWljb2xvbkxuKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RGFydFlpZWxkKERhcnRZaWVsZCBub2RlKSB7CiAgICBpZiAobm9kZS5oYXNTdGFyKSB7CiAgICAgIG91dEluZGVudCgieWllbGQqIik7CiAgICB9IGVsc2UgewogICAgICBvdXRJbmRlbnQoInlpZWxkIik7CiAgICB9CiAgICBwZW5kaW5nU3BhY2UgPSB0cnVlOwogICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKG5vZGUuZXhwcmVzc2lvbiwgRVhQUkVTU0lPTiwKICAgICAgICBuZXdJbkZvckluaXQ6IGZhbHNlLCBuZXdBdFN0YXRlbWVudEJlZ2luOiBmYWxzZSk7CiAgICBvdXRTZW1pY29sb25MbigpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFRocm93KFRocm93IG5vZGUpIHsKICAgIG91dEluZGVudCgidGhyb3ciKTsKICAgIHBlbmRpbmdTcGFjZSA9IHRydWU7CiAgICB2aXNpdE5lc3RlZEV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uLCBFWFBSRVNTSU9OLAogICAgICAgIG5ld0luRm9ySW5pdDogZmFsc2UsIG5ld0F0U3RhdGVtZW50QmVnaW46IGZhbHNlKTsKICAgIG91dFNlbWljb2xvbkxuKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHJ5KFRyeSBub2RlKSB7CiAgICBvdXRJbmRlbnQoInRyeSIpOwogICAgYmxvY2tCb2R5KG5vZGUuYm9keSwgbmVlZHNTZXBhcmF0aW9uOiB0cnVlLCBuZWVkc05ld2xpbmU6IGZhbHNlKTsKICAgIGlmIChub2RlLmNhdGNoUGFydCAhPSBudWxsKSB7CiAgICAgIHZpc2l0KG5vZGUuY2F0Y2hQYXJ0KTsKICAgIH0KICAgIGlmIChub2RlLmZpbmFsbHlQYXJ0ICE9IG51bGwpIHsKICAgICAgc3BhY2VPdXQoKTsKICAgICAgb3V0KCJmaW5hbGx5Iik7CiAgICAgIGJsb2NrQm9keShub2RlLmZpbmFsbHlQYXJ0LCBuZWVkc1NlcGFyYXRpb246IHRydWUsIG5lZWRzTmV3bGluZTogdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBsaW5lT3V0KCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2F0Y2goQ2F0Y2ggbm9kZSkgewogICAgc3BhY2VPdXQoKTsKICAgIG91dCgiY2F0Y2giKTsKICAgIHNwYWNlT3V0KCk7CiAgICBvdXQoIigiKTsKICAgIHZpc2l0TmVzdGVkRXhwcmVzc2lvbihub2RlLmRlY2xhcmF0aW9uLCBFWFBSRVNTSU9OLAogICAgICAgIG5ld0luRm9ySW5pdDogZmFsc2UsIG5ld0F0U3RhdGVtZW50QmVnaW46IGZhbHNlKTsKICAgIG91dCgiKSIpOwogICAgYmxvY2tCb2R5KG5vZGUuYm9keSwgbmVlZHNTZXBhcmF0aW9uOiBmYWxzZSwgbmVlZHNOZXdsaW5lOiBmYWxzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3dpdGNoKFN3aXRjaCBub2RlKSB7CiAgICBvdXRJbmRlbnQoInN3aXRjaCIpOwogICAgc3BhY2VPdXQoKTsKICAgIG91dCgiKCIpOwogICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKG5vZGUua2V5LCBFWFBSRVNTSU9OLAogICAgICAgIG5ld0luRm9ySW5pdDogZmFsc2UsIG5ld0F0U3RhdGVtZW50QmVnaW46IGZhbHNlKTsKICAgIG91dCgiKSIpOwogICAgc3BhY2VPdXQoKTsKICAgIG91dExuKCJ7Iik7CiAgICBpbmRlbnRNb3JlKCk7CiAgICB2aXNpdEFsbChub2RlLmNhc2VzKTsKICAgIGluZGVudExlc3MoKTsKICAgIG91dEluZGVudExuKCJ9Iik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2FzZShDYXNlIG5vZGUpIHsKICAgIG91dEluZGVudCgiY2FzZSIpOwogICAgcGVuZGluZ1NwYWNlID0gdHJ1ZTsKICAgIHZpc2l0TmVzdGVkRXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb24sIEVYUFJFU1NJT04sCiAgICAgICAgbmV3SW5Gb3JJbml0OiBmYWxzZSwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgb3V0TG4oIjoiKTsKICAgIGlmICghbm9kZS5ib2R5LnN0YXRlbWVudHMuaXNFbXB0eSkgewogICAgICBpbmRlbnRNb3JlKCk7CiAgICAgIGJsb2NrT3V0V2l0aG91dEJyYWNlcyhub2RlLmJvZHkpOwogICAgICBpbmRlbnRMZXNzKCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RGVmYXVsdChEZWZhdWx0IG5vZGUpIHsKICAgIG91dEluZGVudExuKCJkZWZhdWx0OiIpOwogICAgaWYgKCFub2RlLmJvZHkuc3RhdGVtZW50cy5pc0VtcHR5KSB7CiAgICAgIGluZGVudE1vcmUoKTsKICAgICAgYmxvY2tPdXRXaXRob3V0QnJhY2VzKG5vZGUuYm9keSk7CiAgICAgIGluZGVudExlc3MoKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMYWJlbGVkU3RhdGVtZW50KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgewogICAgU3RhdGVtZW50IGJvZHkgPSB1bndyYXBCbG9ja0lmU2luZ2xlU3RhdGVtZW50KG5vZGUuYm9keSk7CiAgICAvLyBgbGFiZWw6IGJyZWFrIGxhYmVsO2AKICAgIC8vIERvZXMgbm90IHdvcmsgb24gSUUuIFRoZSBzdGF0ZW1lbnQgaXMgYSBub3AsIHNvIHJlcGxhY2UgaXQgYnkgYW4gZW1wdHkKICAgIC8vIHN0YXRlbWVudC4KICAgIC8vIFNlZToKICAgIC8vIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvODkxODg5L3BhcnNlci1idWdzCiAgICBpZiAoYm9keSBpcyBCcmVhayAmJiBib2R5LnRhcmdldExhYmVsID09IG5vZGUubGFiZWwpIHsKICAgICAgdmlzaXQobmV3IEVtcHR5U3RhdGVtZW50KCkpOwogICAgICByZXR1cm47CiAgICB9CiAgICBvdXRJbmRlbnQoIiR7bm9kZS5sYWJlbH06Iik7CiAgICBibG9ja0JvZHkoYm9keSwgbmVlZHNTZXBhcmF0aW9uOiBmYWxzZSwgbmVlZHNOZXdsaW5lOiB0cnVlKTsKICB9CgogIGludCBmdW5jdGlvbk91dChGdW4gZnVuLCBOb2RlIG5hbWUsIFZhckNvbGxlY3RvciB2YXJzKSB7CiAgICBvdXQoImZ1bmN0aW9uIik7CiAgICBpZiAobmFtZSAhPSBudWxsKSB7CiAgICAgIG91dCgiICIpOwogICAgICAvLyBOYW1lIG11c3QgYmUgYSBbRGVjbF0uIFRoZXJlZm9yZSBvbmx5IHRlc3QgZm9yIHByaW1hcnkgZXhwcmVzc2lvbnMuCiAgICAgIHZpc2l0TmVzdGVkRXhwcmVzc2lvbihuYW1lLCBQUklNQVJZLAogICAgICAgICAgbmV3SW5Gb3JJbml0OiBmYWxzZSwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgfQogICAgbG9jYWxOYW1lci5lbnRlclNjb3BlKHZhcnMpOwogICAgb3V0KCIoIik7CiAgICBpZiAoZnVuLnBhcmFtcyAhPSBudWxsKSB7CiAgICAgIHZpc2l0Q29tbWFTZXBhcmF0ZWQoZnVuLnBhcmFtcywgUFJJTUFSWSwKICAgICAgICAgIG5ld0luRm9ySW5pdDogZmFsc2UsIG5ld0F0U3RhdGVtZW50QmVnaW46IGZhbHNlKTsKICAgIH0KICAgIG91dCgiKSIpOwogICAgc3dpdGNoIChmdW4uYXN5bmNNb2RpZmllcikgewogICAgICBjYXNlIGNvbnN0IEFzeW5jTW9kaWZpZXIuc3luYygpOgogICAgICAgIGJyZWFrOwogICAgICBjYXNlIGNvbnN0IEFzeW5jTW9kaWZpZXIuYXN5bmMoKToKICAgICAgICBvdXQoJyAnLCBpc1doaXRlc3BhY2U6IHRydWUpOwogICAgICAgIG91dCgnYXN5bmMnKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBjb25zdCBBc3luY01vZGlmaWVyLnN5bmNTdGFyKCk6CiAgICAgICAgb3V0KCcgJywgaXNXaGl0ZXNwYWNlOiB0cnVlKTsKICAgICAgICBvdXQoJ3N5bmMqJyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgY29uc3QgQXN5bmNNb2RpZmllci5hc3luY1N0YXIoKToKICAgICAgICBvdXQoJyAnLCBpc1doaXRlc3BhY2U6IHRydWUpOwogICAgICAgIG91dCgnYXN5bmMqJyk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBzcGFjZU91dCgpOwogICAgaW50IGNsb3NpbmdQb3NpdGlvbiA9CiAgICAgICAgYmxvY2tPdXQoZnVuLmJvZHksIHNob3VsZEluZGVudDogZmFsc2UsIG5lZWRzTmV3bGluZTogZmFsc2UpOwogICAgbG9jYWxOYW1lci5sZWF2ZVNjb3BlKCk7CiAgICByZXR1cm4gY2xvc2luZ1Bvc2l0aW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKEZ1bmN0aW9uRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKICAgIFZhckNvbGxlY3RvciB2YXJzID0gbmV3IFZhckNvbGxlY3RvcigpOwogICAgdmFycy52aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24oZGVjbGFyYXRpb24pOwogICAgaW5kZW50KCk7CiAgICBzdGFydE5vZGUoZGVjbGFyYXRpb24uZnVuY3Rpb24pOwogICAgY3VycmVudE5vZGUuY2xvc2luZ1Bvc2l0aW9uID0KICAgICAgICBmdW5jdGlvbk91dChkZWNsYXJhdGlvbi5mdW5jdGlvbiwgZGVjbGFyYXRpb24ubmFtZSwgdmFycyk7CiAgICBlbmROb2RlKGRlY2xhcmF0aW9uLmZ1bmN0aW9uKTsKICAgIGxpbmVPdXQoKTsKICB9CgogIHZpc2l0TmVzdGVkRXhwcmVzc2lvbihFeHByZXNzaW9uIG5vZGUsIGludCByZXF1aXJlZFByZWNlZGVuY2UsCiAgICAgIHtib29sIG5ld0luRm9ySW5pdCwgYm9vbCBuZXdBdFN0YXRlbWVudEJlZ2lufSkgewogICAgYm9vbCBuZWVkc1BhcmVudGhlc2VzID0KICAgICAgICAvLyBhIC0gKGIgKyBjKS4KICAgICAgICAocmVxdWlyZWRQcmVjZWRlbmNlICE9IEVYUFJFU1NJT04gJiYKICAgICAgICAgICAgICAgIG5vZGUucHJlY2VkZW5jZUxldmVsIDwgcmVxdWlyZWRQcmVjZWRlbmNlKSB8fAogICAgICAgICAgICAvLyBmb3IgKGEgPSAoeCBpbiBvKTsgLi4uIDsgLi4uICkgeyAuLi4gfQogICAgICAgICAgICAobmV3SW5Gb3JJbml0ICYmIG5vZGUgaXMgQmluYXJ5ICYmIG5vZGUub3AgPT0gImluIikgfHwKICAgICAgICAgICAgLy8gKGZ1bmN0aW9uKCkgeyAuLi4gfSkoKS4KICAgICAgICAgICAgLy8gKHthOiAyLCBiOiAzfS50b1N0cmluZygpKS4KICAgICAgICAgICAgKG5ld0F0U3RhdGVtZW50QmVnaW4gJiYKICAgICAgICAgICAgICAgIChub2RlIGlzIE5hbWVkRnVuY3Rpb24gfHwKICAgICAgICAgICAgICAgICAgICBub2RlIGlzIEZ1biB8fAogICAgICAgICAgICAgICAgICAgIG5vZGUgaXMgT2JqZWN0SW5pdGlhbGl6ZXIpKTsKICAgIGlmIChuZWVkc1BhcmVudGhlc2VzKSB7CiAgICAgIGluRm9ySW5pdCA9IGZhbHNlOwogICAgICBhdFN0YXRlbWVudEJlZ2luID0gZmFsc2U7CiAgICAgIG91dCgiKCIpOwogICAgICB2aXNpdChub2RlKTsKICAgICAgb3V0KCIpIik7CiAgICB9IGVsc2UgewogICAgICBpbkZvckluaXQgPSBuZXdJbkZvckluaXQ7CiAgICAgIGF0U3RhdGVtZW50QmVnaW4gPSBuZXdBdFN0YXRlbWVudEJlZ2luOwogICAgICB2aXNpdChub2RlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QgbGlzdCkgewogICAgb3V0KCJ2YXIgIik7CiAgICBMaXN0PE5vZGU+IG5vZGVzID0gbGlzdC5kZWNsYXJhdGlvbnM7CiAgICBpZiAoaW5Gb3JJbml0KSB7CiAgICAgIHZpc2l0Q29tbWFTZXBhcmF0ZWQobm9kZXMsIEFTU0lHTk1FTlQsCiAgICAgICAgICBuZXdJbkZvckluaXQ6IGluRm9ySW5pdCwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgfSBlbHNlIHsKICAgICAgLy8gUHJpbnQgJ2JpZycgZGVjbGFyYXRpb25zIG9uIHRoZWlyIG93biBsaW5lLCB3aGlsZSBrZWVwaW5nIGFkamFjZW50CiAgICAgIC8vIHNtYWxsIGFuZCB1bmluaXRpYWxpemVkIGRlY2xhcmF0aW9ucyBvbiB0aGUgc2FtZSBsaW5lLgogICAgICBib29sIHVzZUluZGVudCA9IG5vZGVzLmxlbmd0aCA+IDEgJiYgbGlzdC5pbmRlbnRTcGxpdHM7CiAgICAgIGlmICh1c2VJbmRlbnQpIHsKICAgICAgICBpbmRlbnRNb3JlKCk7CiAgICAgIH0KICAgICAgYm9vbCBsYXN0V2FzQmlnID0gZmFsc2U7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBOb2RlIG5vZGUgPSBub2Rlc1tpXTsKICAgICAgICBib29sIHRoaXNJc0JpZyA9ICFfaXNTbWFsbEluaXRpYWxpemF0aW9uKG5vZGUpOwogICAgICAgIGlmIChpID4gMCkgewogICAgICAgICAgYXRTdGF0ZW1lbnRCZWdpbiA9IGZhbHNlOwogICAgICAgICAgb3V0KCIsIik7CiAgICAgICAgICBpZiAobGFzdFdhc0JpZyB8fCB0aGlzSXNCaWcpIHsKICAgICAgICAgICAgbGluZU91dCgpOwogICAgICAgICAgICBpbmRlbnQoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNwYWNlT3V0KCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZpc2l0TmVzdGVkRXhwcmVzc2lvbihub2RlLCBBU1NJR05NRU5ULAogICAgICAgICAgICBuZXdJbkZvckluaXQ6IGluRm9ySW5pdCwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgICAgIGxhc3RXYXNCaWcgPSB0aGlzSXNCaWc7CiAgICAgIH0KICAgICAgaWYgKHVzZUluZGVudCkgewogICAgICAgIGluZGVudExlc3MoKTsKICAgICAgfQogICAgfQogIH0KCiAgc3RhdGljIGJvb2wgX2lzU21hbGxJbml0aWFsaXphdGlvbihOb2RlIG5vZGUpIHsKICAgIGlmIChub2RlIGlzIFZhcmlhYmxlSW5pdGlhbGl6YXRpb24pIHsKICAgICAgTm9kZSB2YWx1ZSA9IG5vZGUudmFsdWU7CiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKHZhbHVlIGlzIFRoaXMpIHJldHVybiB0cnVlOwogICAgICBpZiAodmFsdWUgaXMgTGl0ZXJhbE51bGwpIHJldHVybiB0cnVlOwogICAgICBpZiAodmFsdWUgaXMgTGl0ZXJhbE51bWJlcikgcmV0dXJuIHRydWU7CiAgICAgIGlmICh2YWx1ZSBpcyBMaXRlcmFsU3RyaW5nICYmIHZhbHVlLnZhbHVlLmxlbmd0aCA8PSA4KSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKHZhbHVlIGlzIE9iamVjdEluaXRpYWxpemVyICYmIHZhbHVlLnByb3BlcnRpZXMuaXNFbXB0eSkgcmV0dXJuIHRydWU7CiAgICAgIGlmICh2YWx1ZSBpcyBBcnJheUluaXRpYWxpemVyICYmIHZhbHVlLmVsZW1lbnRzLmlzRW1wdHkpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRBc3NpZ25tZW50KEFzc2lnbm1lbnQgYXNzaWdubWVudCkgewogICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKGFzc2lnbm1lbnQubGVmdEhhbmRTaWRlLCBDQUxMLAogICAgICAgIG5ld0luRm9ySW5pdDogaW5Gb3JJbml0LCBuZXdBdFN0YXRlbWVudEJlZ2luOiBhdFN0YXRlbWVudEJlZ2luKTsKICAgIGlmIChhc3NpZ25tZW50LnZhbHVlICE9IG51bGwpIHsKICAgICAgc3BhY2VPdXQoKTsKICAgICAgU3RyaW5nIG9wID0gYXNzaWdubWVudC5vcDsKICAgICAgaWYgKG9wICE9IG51bGwpIG91dChvcCk7CiAgICAgIG91dCgiPSIpOwogICAgICBzcGFjZU91dCgpOwogICAgICB2aXNpdE5lc3RlZEV4cHJlc3Npb24oYXNzaWdubWVudC52YWx1ZSwgQVNTSUdOTUVOVCwKICAgICAgICAgIG5ld0luRm9ySW5pdDogaW5Gb3JJbml0LCBuZXdBdFN0YXRlbWVudEJlZ2luOiBmYWxzZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFZhcmlhYmxlSW5pdGlhbGl6YXRpb24oVmFyaWFibGVJbml0aWFsaXphdGlvbiBpbml0aWFsaXphdGlvbikgewogICAgdmlzaXRBc3NpZ25tZW50KGluaXRpYWxpemF0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q29uZGl0aW9uYWwoQ29uZGl0aW9uYWwgY29uZCkgewogICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKGNvbmQuY29uZGl0aW9uLCBMT0dJQ0FMX09SLAogICAgICAgIG5ld0luRm9ySW5pdDogaW5Gb3JJbml0LCBuZXdBdFN0YXRlbWVudEJlZ2luOiBhdFN0YXRlbWVudEJlZ2luKTsKICAgIHNwYWNlT3V0KCk7CiAgICBvdXQoIj8iKTsKICAgIHNwYWNlT3V0KCk7CiAgICAvLyBUaGUgdGhlbiBwYXJ0IGlzIGFsbG93ZWQgdG8gaGF2ZSBhbiAnaW4nLgogICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKGNvbmQudGhlbiwgQVNTSUdOTUVOVCwKICAgICAgICBuZXdJbkZvckluaXQ6IGZhbHNlLCBuZXdBdFN0YXRlbWVudEJlZ2luOiBmYWxzZSk7CiAgICBzcGFjZU91dCgpOwogICAgb3V0KCI6Iik7CiAgICBzcGFjZU91dCgpOwogICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKGNvbmQub3RoZXJ3aXNlLCBBU1NJR05NRU5ULAogICAgICAgIG5ld0luRm9ySW5pdDogaW5Gb3JJbml0LCBuZXdBdFN0YXRlbWVudEJlZ2luOiBmYWxzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdE5ldyhOZXcgbm9kZSkgewogICAgb3V0KCJuZXcgIik7CiAgICB2aXNpdE5lc3RlZEV4cHJlc3Npb24obm9kZS50YXJnZXQsIExFRlRfSEFORF9TSURFLAogICAgICAgIG5ld0luRm9ySW5pdDogaW5Gb3JJbml0LCBuZXdBdFN0YXRlbWVudEJlZ2luOiBmYWxzZSk7CiAgICBvdXQoIigiKTsKICAgIHZpc2l0Q29tbWFTZXBhcmF0ZWQobm9kZS5hcmd1bWVudHMsIEFTU0lHTk1FTlQsCiAgICAgICAgbmV3SW5Gb3JJbml0OiBmYWxzZSwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgb3V0KCIpIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENhbGwoQ2FsbCBjYWxsKSB7CiAgICB2aXNpdE5lc3RlZEV4cHJlc3Npb24oY2FsbC50YXJnZXQsIENBTEwsCiAgICAgICAgbmV3SW5Gb3JJbml0OiBpbkZvckluaXQsIG5ld0F0U3RhdGVtZW50QmVnaW46IGF0U3RhdGVtZW50QmVnaW4pOwogICAgb3V0KCIoIik7CiAgICB2aXNpdENvbW1hU2VwYXJhdGVkKGNhbGwuYXJndW1lbnRzLCBBU1NJR05NRU5ULAogICAgICAgIG5ld0luRm9ySW5pdDogZmFsc2UsIG5ld0F0U3RhdGVtZW50QmVnaW46IGZhbHNlKTsKICAgIG91dCgiKSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJpbmFyeShCaW5hcnkgYmluYXJ5KSB7CiAgICBFeHByZXNzaW9uIGxlZnQgPSBiaW5hcnkubGVmdDsKICAgIEV4cHJlc3Npb24gcmlnaHQgPSBiaW5hcnkucmlnaHQ7CiAgICBTdHJpbmcgb3AgPSBiaW5hcnkub3A7CiAgICBpbnQgbGVmdFByZWNlZGVuY2VSZXF1aXJlbWVudDsKICAgIGludCByaWdodFByZWNlZGVuY2VSZXF1aXJlbWVudDsKICAgIGJvb2wgbGVmdFNwYWNlID0gdHJ1ZTsgLy8gbGVmdDxIRVJFPm9wIHJpZ2h0CiAgICBzd2l0Y2ggKG9wKSB7CiAgICAgIGNhc2UgJywnOgogICAgICAgIC8vICB4LCAoeSwgeikgPD0+ICh4LCB5KSwgei4KICAgICAgICBsZWZ0UHJlY2VkZW5jZVJlcXVpcmVtZW50ID0gRVhQUkVTU0lPTjsKICAgICAgICByaWdodFByZWNlZGVuY2VSZXF1aXJlbWVudCA9IEVYUFJFU1NJT047CiAgICAgICAgbGVmdFNwYWNlID0gZmFsc2U7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInx8IjoKICAgICAgICBsZWZ0UHJlY2VkZW5jZVJlcXVpcmVtZW50ID0gTE9HSUNBTF9PUjsKICAgICAgICAvLyB4IHx8ICh5IHx8IHopIDw9PiAoeCB8fCB5KSB8fCB6LgogICAgICAgIHJpZ2h0UHJlY2VkZW5jZVJlcXVpcmVtZW50ID0gTE9HSUNBTF9PUjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiJiYiOgogICAgICAgIGxlZnRQcmVjZWRlbmNlUmVxdWlyZW1lbnQgPSBMT0dJQ0FMX0FORDsKICAgICAgICAvLyB4ICYmICh5ICYmIHopIDw9PiAoeCAmJiB5KSAmJiB6LgogICAgICAgIHJpZ2h0UHJlY2VkZW5jZVJlcXVpcmVtZW50ID0gTE9HSUNBTF9BTkQ7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInwiOgogICAgICAgIGxlZnRQcmVjZWRlbmNlUmVxdWlyZW1lbnQgPSBCSVRfT1I7CiAgICAgICAgLy8geCB8ICh5IHwgeikgPD0+ICh4IHwgeSkgfCB6LgogICAgICAgIHJpZ2h0UHJlY2VkZW5jZVJlcXVpcmVtZW50ID0gQklUX09SOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJeIjoKICAgICAgICBsZWZ0UHJlY2VkZW5jZVJlcXVpcmVtZW50ID0gQklUX1hPUjsKICAgICAgICAvLyB4IF4gKHkgXiB6KSA8PT4gKHggXiB5KSBeIHouCiAgICAgICAgcmlnaHRQcmVjZWRlbmNlUmVxdWlyZW1lbnQgPSBCSVRfWE9SOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICImIjoKICAgICAgICBsZWZ0UHJlY2VkZW5jZVJlcXVpcmVtZW50ID0gQklUX0FORDsKICAgICAgICAvLyB4ICYgKHkgJiB6KSA8PT4gKHggJiB5KSAmIHouCiAgICAgICAgcmlnaHRQcmVjZWRlbmNlUmVxdWlyZW1lbnQgPSBCSVRfQU5EOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICI9PSI6CiAgICAgIGNhc2UgIiE9IjoKICAgICAgY2FzZSAiPT09IjoKICAgICAgY2FzZSAiIT09IjoKICAgICAgICBsZWZ0UHJlY2VkZW5jZVJlcXVpcmVtZW50ID0gRVFVQUxJVFk7CiAgICAgICAgcmlnaHRQcmVjZWRlbmNlUmVxdWlyZW1lbnQgPSBSRUxBVElPTkFMOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICI8IjoKICAgICAgY2FzZSAiPiI6CiAgICAgIGNhc2UgIjw9IjoKICAgICAgY2FzZSAiPj0iOgogICAgICBjYXNlICJpbnN0YW5jZW9mIjoKICAgICAgY2FzZSAiaW4iOgogICAgICAgIGxlZnRQcmVjZWRlbmNlUmVxdWlyZW1lbnQgPSBSRUxBVElPTkFMOwogICAgICAgIHJpZ2h0UHJlY2VkZW5jZVJlcXVpcmVtZW50ID0gU0hJRlQ7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIj4+IjoKICAgICAgY2FzZSAiPDwiOgogICAgICBjYXNlICI+Pj4iOgogICAgICAgIGxlZnRQcmVjZWRlbmNlUmVxdWlyZW1lbnQgPSBTSElGVDsKICAgICAgICByaWdodFByZWNlZGVuY2VSZXF1aXJlbWVudCA9IEFERElUSVZFOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICIrIjoKICAgICAgY2FzZSAiLSI6CiAgICAgICAgbGVmdFByZWNlZGVuY2VSZXF1aXJlbWVudCA9IEFERElUSVZFOwogICAgICAgIC8vIFdlIGNhbm5vdCByZW1vdmUgcGFyZW50aGVzaXMgZm9yICIrIiBiZWNhdXNlCiAgICAgICAgLy8gICB4ICsgKHkgKyB6KSA8IT0+ICh4ICsgeSkgKyB6OgogICAgICAgIC8vIEV4YW1wbGU6CiAgICAgICAgLy8gICAiYSIgKyAoMSArIDIpID0+ICJhMyI7CiAgICAgICAgLy8gICAoImEiICsgMSkgKyAyID0+ICJhMTIiOwogICAgICAgIHJpZ2h0UHJlY2VkZW5jZVJlcXVpcmVtZW50ID0gTVVMVElQTElDQVRJVkU7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIioiOgogICAgICBjYXNlICIvIjoKICAgICAgY2FzZSAiJSI6CiAgICAgICAgbGVmdFByZWNlZGVuY2VSZXF1aXJlbWVudCA9IE1VTFRJUExJQ0FUSVZFOwogICAgICAgIC8vIFdlIGNhbm5vdCByZW1vdmUgcGFyZW50aGVzaXMgZm9yICIqIiBiZWNhdXNlIG9mIHByZWNpc2lvbiBpc3N1ZXMuCiAgICAgICAgcmlnaHRQcmVjZWRlbmNlUmVxdWlyZW1lbnQgPSBVTkFSWTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBjb250ZXh0LmVycm9yKCJGb3Jnb3Qgb3BlcmF0b3I6ICRvcCIpOwogICAgfQoKICAgIHZpc2l0TmVzdGVkRXhwcmVzc2lvbihsZWZ0LCBsZWZ0UHJlY2VkZW5jZVJlcXVpcmVtZW50LAogICAgICAgIG5ld0luRm9ySW5pdDogaW5Gb3JJbml0LCBuZXdBdFN0YXRlbWVudEJlZ2luOiBhdFN0YXRlbWVudEJlZ2luKTsKCiAgICBpZiAob3AgPT0gImluIiB8fCBvcCA9PSAiaW5zdGFuY2VvZiIpIHsKICAgICAgLy8gVGhlcmUgYXJlIGNhc2VzIHdoZXJlIHRoZSBzcGFjZSBpcyBub3QgcmVxdWlyZWQgYnV0IHdpdGhvdXQgZnVydGhlcgogICAgICAvLyBhbmFseXNpcyB3ZSBjYW5ub3Qga25vdy4KICAgICAgb3V0KCIgIiwgaXNXaGl0ZXNwYWNlOiB0cnVlKTsKICAgICAgb3V0KG9wKTsKICAgICAgb3V0KCIgIiwgaXNXaGl0ZXNwYWNlOiB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChsZWZ0U3BhY2UpIHNwYWNlT3V0KCk7CiAgICAgIG91dChvcCk7CiAgICAgIHNwYWNlT3V0KCk7CiAgICB9CiAgICB2aXNpdE5lc3RlZEV4cHJlc3Npb24ocmlnaHQsIHJpZ2h0UHJlY2VkZW5jZVJlcXVpcmVtZW50LAogICAgICAgIG5ld0luRm9ySW5pdDogaW5Gb3JJbml0LCBuZXdBdFN0YXRlbWVudEJlZ2luOiBmYWxzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UHJlZml4KFByZWZpeCB1bmFyeSkgewogICAgU3RyaW5nIG9wID0gdW5hcnkub3A7CiAgICBzd2l0Y2ggKG9wKSB7CiAgICAgIGNhc2UgImRlbGV0ZSI6CiAgICAgIGNhc2UgInZvaWQiOgogICAgICBjYXNlICJ0eXBlb2YiOgogICAgICAgIC8vIFRoZXJlIGFyZSBjYXNlcyB3aGVyZSB0aGUgc3BhY2UgaXMgbm90IHJlcXVpcmVkIGJ1dCB3aXRob3V0IGZ1cnRoZXIKICAgICAgICAvLyBhbmFseXNpcyB3ZSBjYW5ub3Qga25vdy4KICAgICAgICBvdXQob3ApOwogICAgICAgIG91dCgiICIsIGlzV2hpdGVzcGFjZTogdHJ1ZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIisiOgogICAgICBjYXNlICIrKyI6CiAgICAgICAgaWYgKGxhc3RDaGFyQ29kZSA9PSBjaGFyQ29kZXMuJFBMVVMpIG91dCgiICIsIGlzV2hpdGVzcGFjZTogdHJ1ZSk7CiAgICAgICAgb3V0KG9wKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiLSI6CiAgICAgIGNhc2UgIi0tIjoKICAgICAgICBpZiAobGFzdENoYXJDb2RlID09IGNoYXJDb2Rlcy4kTUlOVVMpIG91dCgiICIsIGlzV2hpdGVzcGFjZTogdHJ1ZSk7CiAgICAgICAgb3V0KG9wKTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBvdXQob3ApOwogICAgfQogICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKHVuYXJ5LmFyZ3VtZW50LCBVTkFSWSwKICAgICAgICBuZXdJbkZvckluaXQ6IGluRm9ySW5pdCwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFBvc3RmaXgoUG9zdGZpeCBwb3N0Zml4KSB7CiAgICB2aXNpdE5lc3RlZEV4cHJlc3Npb24ocG9zdGZpeC5hcmd1bWVudCwgQ0FMTCwKICAgICAgICBuZXdJbkZvckluaXQ6IGluRm9ySW5pdCwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogYXRTdGF0ZW1lbnRCZWdpbik7CiAgICBvdXQocG9zdGZpeC5vcCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VmFyaWFibGVVc2UoVmFyaWFibGVVc2UgcmVmKSB7CiAgICBvdXQobG9jYWxOYW1lci5nZXROYW1lKHJlZi5uYW1lKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VGhpcyhUaGlzIG5vZGUpIHsKICAgIG91dCgidGhpcyIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsKSB7CiAgICBvdXQobG9jYWxOYW1lci5nZXROYW1lKGRlY2wubmFtZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW0pIHsKICAgIG91dChsb2NhbE5hbWVyLmdldE5hbWUocGFyYW0ubmFtZSkpOwogIH0KCiAgYm9vbCBpc0RpZ2l0KGludCBjaGFyQ29kZSkgewogICAgcmV0dXJuIGNoYXJDb2Rlcy4kMCA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBjaGFyQ29kZXMuJDk7CiAgfQoKICBib29sIGlzVmFsaWRKYXZhU2NyaXB0SWQoU3RyaW5nIGZpZWxkKSB7CiAgICBpZiAoZmllbGQubGVuZ3RoIDwgMykgcmV0dXJuIGZhbHNlOwogICAgLy8gSWdub3JlIHRoZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzdHJpbmctZGVsaW1pdGVyLgogICAgZm9yIChpbnQgaSA9IDE7IGkgPCBmaWVsZC5sZW5ndGggLSAxOyBpKyspIHsKICAgICAgLy8gVE9ETyhmbG9pdHNjaCk6IGFsbG93IG1vcmUgY2hhcmFjdGVycy4KICAgICAgaW50IGNoYXJDb2RlID0gZmllbGQuY29kZVVuaXRBdChpKTsKICAgICAgaWYgKCEoY2hhckNvZGVzLiRhIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IGNoYXJDb2Rlcy4keiB8fAogICAgICAgICAgY2hhckNvZGVzLiRBIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IGNoYXJDb2Rlcy4kWiB8fAogICAgICAgICAgY2hhckNvZGUgPT0gY2hhckNvZGVzLiQkIHx8CiAgICAgICAgICBjaGFyQ29kZSA9PSBjaGFyQ29kZXMuJF8gfHwKICAgICAgICAgIGkgIT0gMSAmJiBpc0RpZ2l0KGNoYXJDb2RlKSkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIC8vIFRPRE8oZmxvaXRzY2gpOiBub3JtYWxseSB3ZSBzaG91bGQgYWxzbyBjaGVjayB0aGF0IHRoZSBmaWVsZCBpcyBub3QgYQogICAgLy8gcmVzZXJ2ZWQgd29yZC4gIFdlIGRvbid0IGdlbmVyYXRlIGZpZWxkcyB3aXRoIHJlc2VydmVkIHdvcmQgbmFtZXMgZXhjZXB0CiAgICAvLyBmb3IgJ3N1cGVyJy4KICAgIGlmIChmaWVsZCA9PSAnInN1cGVyIicpIHJldHVybiBmYWxzZTsKICAgIGlmIChmaWVsZCA9PSAnImNhdGNoIicpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEFjY2VzcyhQcm9wZXJ0eUFjY2VzcyBhY2Nlc3MpIHsKICAgIHZpc2l0TmVzdGVkRXhwcmVzc2lvbihhY2Nlc3MucmVjZWl2ZXIsIENBTEwsCiAgICAgICAgbmV3SW5Gb3JJbml0OiBpbkZvckluaXQsIG5ld0F0U3RhdGVtZW50QmVnaW46IGF0U3RhdGVtZW50QmVnaW4pOwogICAgTm9kZSBzZWxlY3RvciA9IGFjY2Vzcy5zZWxlY3RvcjsKICAgIGlmIChzZWxlY3RvciBpcyBMaXRlcmFsU3RyaW5nKSB7CiAgICAgIExpdGVyYWxTdHJpbmcgc2VsZWN0b3JTdHJpbmcgPSBzZWxlY3RvcjsKICAgICAgU3RyaW5nIGZpZWxkV2l0aFF1b3RlcyA9IHNlbGVjdG9yU3RyaW5nLnZhbHVlOwogICAgICBpZiAoaXNWYWxpZEphdmFTY3JpcHRJZChmaWVsZFdpdGhRdW90ZXMpKSB7CiAgICAgICAgaWYgKGFjY2Vzcy5yZWNlaXZlciBpcyBMaXRlcmFsTnVtYmVyICYmCiAgICAgICAgICAgIGxhc3RDaGFyQ29kZSAhPSBjaGFyQ29kZXMuJENMT1NFX1BBUkVOKSB7CiAgICAgICAgICBvdXQoIiAiLCBpc1doaXRlc3BhY2U6IHRydWUpOwogICAgICAgIH0KICAgICAgICBvdXQoIi4iKTsKICAgICAgICBzdGFydE5vZGUoc2VsZWN0b3IpOwogICAgICAgIG91dChmaWVsZFdpdGhRdW90ZXMuc3Vic3RyaW5nKDEsIGZpZWxkV2l0aFF1b3Rlcy5sZW5ndGggLSAxKSk7CiAgICAgICAgZW5kTm9kZShzZWxlY3Rvcik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yIGlzIE5hbWUpIHsKICAgICAgaWYgKGFjY2Vzcy5yZWNlaXZlciBpcyBMaXRlcmFsTnVtYmVyICYmCiAgICAgICAgICBsYXN0Q2hhckNvZGUgIT0gY2hhckNvZGVzLiRDTE9TRV9QQVJFTikgewogICAgICAgIG91dCgiICIsIGlzV2hpdGVzcGFjZTogdHJ1ZSk7CiAgICAgIH0KICAgICAgb3V0KCIuIik7CiAgICAgIHN0YXJ0Tm9kZShzZWxlY3Rvcik7CiAgICAgIHNlbGVjdG9yLmFjY2VwdCh0aGlzKTsKICAgICAgZW5kTm9kZShzZWxlY3Rvcik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIG91dCgiWyIpOwogICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKHNlbGVjdG9yLCBFWFBSRVNTSU9OLAogICAgICAgIG5ld0luRm9ySW5pdDogZmFsc2UsIG5ld0F0U3RhdGVtZW50QmVnaW46IGZhbHNlKTsKICAgIG91dCgiXSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE5hbWVkRnVuY3Rpb24oTmFtZWRGdW5jdGlvbiBuYW1lZEZ1bmN0aW9uKSB7CiAgICBWYXJDb2xsZWN0b3IgdmFycyA9IG5ldyBWYXJDb2xsZWN0b3IoKTsKICAgIHZhcnMudmlzaXROYW1lZEZ1bmN0aW9uKG5hbWVkRnVuY3Rpb24pOwogICAgc3RhcnROb2RlKG5hbWVkRnVuY3Rpb24uZnVuY3Rpb24pOwogICAgaW50IGNsb3NpbmdQb3NpdGlvbiA9IGN1cnJlbnROb2RlLmNsb3NpbmdQb3NpdGlvbiA9CiAgICAgICAgZnVuY3Rpb25PdXQobmFtZWRGdW5jdGlvbi5mdW5jdGlvbiwgbmFtZWRGdW5jdGlvbi5uYW1lLCB2YXJzKTsKICAgIGVuZE5vZGUobmFtZWRGdW5jdGlvbi5mdW5jdGlvbik7CiAgICAvLyBVc2UgY2xvc2luZyBwb3NpdGlvbiBvZiBgbmFtZWRGdW5jdGlvbi5mdW5jdGlvbmAgYXMgdGhlIGNsb3NpbmcgcG9zaXRpb24KICAgIC8vIG9mIHRoZSBuYW1lZCBmdW5jdGlvbiBpdHNlbGYuCiAgICBjdXJyZW50Tm9kZS5jbG9zaW5nUG9zaXRpb24gPSBjbG9zaW5nUG9zaXRpb247CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RnVuKEZ1biBmdW4pIHsKICAgIFZhckNvbGxlY3RvciB2YXJzID0gbmV3IFZhckNvbGxlY3RvcigpOwogICAgdmFycy52aXNpdEZ1bihmdW4pOwogICAgY3VycmVudE5vZGUuY2xvc2luZ1Bvc2l0aW9uID0gZnVuY3Rpb25PdXQoZnVuLCBudWxsLCB2YXJzKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RGVmZXJyZWRFeHByZXNzaW9uKERlZmVycmVkRXhwcmVzc2lvbiBub2RlKSB7CiAgICAvLyBDb250aW51ZSBwcmludGluZyB3aXRoIHRoZSBleHByZXNzaW9uIHZhbHVlLgogICAgYXNzZXJ0KG5vZGUucHJlY2VkZW5jZUxldmVsID09IG5vZGUudmFsdWUucHJlY2VkZW5jZUxldmVsKTsKICAgIG5vZGUudmFsdWUuYWNjZXB0KHRoaXMpOwogIH0KCiAgb3V0cHV0TnVtYmVyV2l0aFJlcXVpcmVkV2hpdGVzcGFjZShTdHJpbmcgbnVtYmVyKSB7CiAgICBpbnQgY2hhckNvZGUgPSBudW1iZXIuY29kZVVuaXRBdCgwKTsKICAgIGlmIChjaGFyQ29kZSA9PSBjaGFyQ29kZXMuJE1JTlVTICYmIGxhc3RDaGFyQ29kZSA9PSBjaGFyQ29kZXMuJE1JTlVTKSB7CiAgICAgIG91dCgiICIsIGlzV2hpdGVzcGFjZTogdHJ1ZSk7CiAgICB9CiAgICBvdXQobnVtYmVyKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RGVmZXJyZWROdW1iZXIoRGVmZXJyZWROdW1iZXIgbm9kZSkgewogICAgb3V0cHV0TnVtYmVyV2l0aFJlcXVpcmVkV2hpdGVzcGFjZSgiJHtub2RlLnZhbHVlfSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXREZWZlcnJlZFN0cmluZyhEZWZlcnJlZFN0cmluZyBub2RlKSB7CiAgICBvdXQobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdExpdGVyYWxCb29sKExpdGVyYWxCb29sIG5vZGUpIHsKICAgIG91dChub2RlLnZhbHVlID8gInRydWUiIDogImZhbHNlIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGl0ZXJhbFN0cmluZyhMaXRlcmFsU3RyaW5nIG5vZGUpIHsKICAgIG91dChub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0U3RyaW5nQ29uY2F0ZW5hdGlvbihTdHJpbmdDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0TmFtZShOYW1lIG5vZGUpIHsKICAgIG91dChvcHRpb25zLnJlbmFtZXJGb3JOYW1lcyhub2RlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFBhcmVudGhlc2VzKFBhcmVudGhlc2VzIG5vZGUpIHsKICAgIG91dCgiKCIpOwogICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKG5vZGUuZW5jbG9zZWQsIEVYUFJFU1NJT04sCiAgICAgICAgbmV3SW5Gb3JJbml0OiBmYWxzZSwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgb3V0KCIpIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdExpdGVyYWxOdW1iZXIoTGl0ZXJhbE51bWJlciBub2RlKSB7CiAgICBvdXRwdXROdW1iZXJXaXRoUmVxdWlyZWRXaGl0ZXNwYWNlKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExpdGVyYWxOdWxsKExpdGVyYWxOdWxsIG5vZGUpIHsKICAgIG91dCgibnVsbCIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEFycmF5SW5pdGlhbGl6ZXIoQXJyYXlJbml0aWFsaXplciBub2RlKSB7CiAgICBvdXQoIlsiKTsKICAgIExpc3Q8RXhwcmVzc2lvbj4gZWxlbWVudHMgPSBub2RlLmVsZW1lbnRzOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBFeHByZXNzaW9uIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKICAgICAgaWYgKGVsZW1lbnQgaXMgQXJyYXlIb2xlKSB7CiAgICAgICAgLy8gTm90ZSB0aGF0IGFycmF5IGhvbGVzIG11c3QgaGF2ZSBhIHRyYWlsaW5nICIsIiBldmVuIGlmIHRoZXkgYXJlCiAgICAgICAgLy8gaW4gbGFzdCBwb3NpdGlvbi4gT3RoZXJ3aXNlIGBbLF1gIChoYXZpbmcgbGVuZ3RoIDEpIHdvdWxkIGJlY29tZQogICAgICAgIC8vIGVxdWFsIHRvIGBbXWAgKHRoZSBlbXB0eSBhcnJheSkKICAgICAgICAvLyBhbmQgWzEsLF0gKGFycmF5IHdpdGggMSBhbmQgYSBob2xlKSB3b3VsZCBiZWNvbWUgWzEsXSA9IFsxXS4KICAgICAgICBzdGFydE5vZGUoZWxlbWVudCk7CiAgICAgICAgb3V0KCIsIik7CiAgICAgICAgZW5kTm9kZShlbGVtZW50KTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoaSAhPSAwKSBzcGFjZU91dCgpOwogICAgICB2aXNpdE5lc3RlZEV4cHJlc3Npb24oZWxlbWVudCwgQVNTSUdOTUVOVCwKICAgICAgICAgIG5ld0luRm9ySW5pdDogZmFsc2UsIG5ld0F0U3RhdGVtZW50QmVnaW46IGZhbHNlKTsKICAgICAgLy8gV2UgY2FuIHNraXAgdGhlIHRyYWlsaW5nICIsIiBmb3IgdGhlIGxhc3QgZWxlbWVudCAoc2luY2UgaXQncyBub3QKICAgICAgLy8gYW4gYXJyYXkgaG9sZSkuCiAgICAgIGlmIChpICE9IGVsZW1lbnRzLmxlbmd0aCAtIDEpIG91dCgiLCIpOwogICAgfQogICAgb3V0KCJdIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXJyYXlIb2xlKEFycmF5SG9sZSBub2RlKSB7CiAgICBjb250ZXh0LmVycm9yKCJVbnJlYWNoYWJsZSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE9iamVjdEluaXRpYWxpemVyKE9iamVjdEluaXRpYWxpemVyIG5vZGUpIHsKICAgIC8vIFByaW50IGFsbCB0aGUgcHJvcGVydGllcyBvbiBvbmUgbGluZSB1bnRpbCB3ZSBzZWUgYSBmdW5jdGlvbi12YWx1ZWQKICAgIC8vIHByb3BlcnR5LiAgSWRlYWxseSwgd2Ugd291bGQgdXNlIGEgcHJvcGVyIHByZXR0eS1wcmludGVyIHRvIG1ha2UgdGhlCiAgICAvLyBkZWNpc2lvbiBiYXNlZCBvbiBsYXlvdXQuCiAgICBib29sIGV4aXRPbmVMaW5lck1vZGUoRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgICByZXR1cm4gdmFsdWUgaXMgRnVuIHx8CiAgICAgICAgICB2YWx1ZSBpcyBBcnJheUluaXRpYWxpemVyICYmIHZhbHVlLmVsZW1lbnRzLmFueSgoZSkgPT4gZSBpcyBGdW4pOwogICAgfQoKICAgIGJvb2wgaXNPbmVMaW5lciA9IG5vZGUuaXNPbmVMaW5lciB8fCBzaG91bGRDb21wcmVzc091dHB1dDsKICAgIExpc3Q8UHJvcGVydHk+IHByb3BlcnRpZXMgPSBub2RlLnByb3BlcnRpZXM7CiAgICBvdXQoInsiKTsKICAgIGluZGVudE1vcmUoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykgewogICAgICBOb2RlIHZhbHVlID0gcHJvcGVydGllc1tpXS52YWx1ZTsKICAgICAgaWYgKGlzT25lTGluZXIgJiYgZXhpdE9uZUxpbmVyTW9kZSh2YWx1ZSkpIGlzT25lTGluZXIgPSBmYWxzZTsKICAgICAgaWYgKGkgIT0gMCkgewogICAgICAgIG91dCgiLCIpOwogICAgICAgIGlmIChpc09uZUxpbmVyKSBzcGFjZU91dCgpOwogICAgICB9CiAgICAgIGlmICghaXNPbmVMaW5lcikgewogICAgICAgIGZvcmNlTGluZSgpOwogICAgICAgIGluZGVudCgpOwogICAgICB9CiAgICAgIHZpc2l0KHByb3BlcnRpZXNbaV0pOwogICAgfQogICAgaW5kZW50TGVzcygpOwogICAgaWYgKCFpc09uZUxpbmVyICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkpIHsKICAgICAgbGluZU91dCgpOwogICAgICBpbmRlbnQoKTsKICAgIH0KICAgIG91dCgifSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFByb3BlcnR5KFByb3BlcnR5IG5vZGUpIHsKICAgIHN0YXJ0Tm9kZShub2RlLm5hbWUpOwogICAgaWYgKG5vZGUubmFtZSBpcyBMaXRlcmFsU3RyaW5nKSB7CiAgICAgIExpdGVyYWxTdHJpbmcgbmFtZVN0cmluZyA9IG5vZGUubmFtZTsKICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lU3RyaW5nLnZhbHVlOwogICAgICBpZiAoaXNWYWxpZEphdmFTY3JpcHRJZChuYW1lKSkgewogICAgICAgIG91dChuYW1lLnN1YnN0cmluZygxLCBuYW1lLmxlbmd0aCAtIDEpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvdXQobmFtZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobm9kZS5uYW1lIGlzIE5hbWUpIHsKICAgICAgbm9kZS5uYW1lLmFjY2VwdCh0aGlzKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChub2RlLm5hbWUgaXMgTGl0ZXJhbE51bWJlcik7CiAgICAgIExpdGVyYWxOdW1iZXIgbmFtZU51bWJlciA9IG5vZGUubmFtZTsKICAgICAgb3V0KG5hbWVOdW1iZXIudmFsdWUpOwogICAgfQogICAgZW5kTm9kZShub2RlLm5hbWUpOwogICAgb3V0KCI6Iik7CiAgICBzcGFjZU91dCgpOwogICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKG5vZGUudmFsdWUsIEFTU0lHTk1FTlQsCiAgICAgICAgbmV3SW5Gb3JJbml0OiBmYWxzZSwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFJlZ0V4cExpdGVyYWwoUmVnRXhwTGl0ZXJhbCBub2RlKSB7CiAgICBvdXQobm9kZS5wYXR0ZXJuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaXRlcmFsRXhwcmVzc2lvbihMaXRlcmFsRXhwcmVzc2lvbiBub2RlKSB7CiAgICBTdHJpbmcgdGVtcGxhdGUgPSBub2RlLnRlbXBsYXRlOwogICAgTGlzdDxFeHByZXNzaW9uPiBpbnB1dHMgPSBub2RlLmlucHV0czsKCiAgICBMaXN0PFN0cmluZz4gcGFydHMgPSB0ZW1wbGF0ZS5zcGxpdCgnIycpOwogICAgaW50IGlucHV0c0xlbmd0aCA9IGlucHV0cyA9PSBudWxsID8gMCA6IGlucHV0cy5sZW5ndGg7CiAgICBpZiAocGFydHMubGVuZ3RoICE9IGlucHV0c0xlbmd0aCArIDEpIHsKICAgICAgY29udGV4dC5lcnJvcignV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgSlM6ICR0ZW1wbGF0ZScpOwogICAgfQogICAgLy8gQ29kZSB0aGF0IHVzZXMgSlMgbXVzdCB0YWtlIGNhcmUgb2Ygb3BlcmF0b3IgcHJlY2VkZW5jZXMsIGFuZAogICAgLy8gcHV0IHBhcmVudGhlc2lzIGlmIG5lZWRlZC4KICAgIG91dChwYXJ0c1swXSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0c0xlbmd0aDsgaSsrKSB7CiAgICAgIHZpc2l0KGlucHV0c1tpXSk7CiAgICAgIG91dChwYXJ0c1tpICsgMV0pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExpdGVyYWxTdGF0ZW1lbnQoTGl0ZXJhbFN0YXRlbWVudCBub2RlKSB7CiAgICBvdXRMbihub2RlLmNvZGUpOwogIH0KCiAgdm9pZCB2aXNpdEludGVycG9sYXRlZE5vZGUoSW50ZXJwb2xhdGVkTm9kZSBub2RlKSB7CiAgICBvdXQoJyMke25vZGUubmFtZU9yUG9zaXRpb259Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW50ZXJwb2xhdGVkRXhwcmVzc2lvbihJbnRlcnBvbGF0ZWRFeHByZXNzaW9uIG5vZGUpID0+CiAgICAgIHZpc2l0SW50ZXJwb2xhdGVkTm9kZShub2RlKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludGVycG9sYXRlZExpdGVyYWwoSW50ZXJwb2xhdGVkTGl0ZXJhbCBub2RlKSA9PgogICAgICB2aXNpdEludGVycG9sYXRlZE5vZGUobm9kZSk7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnRlcnBvbGF0ZWRQYXJhbWV0ZXIoSW50ZXJwb2xhdGVkUGFyYW1ldGVyIG5vZGUpID0+CiAgICAgIHZpc2l0SW50ZXJwb2xhdGVkTm9kZShub2RlKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludGVycG9sYXRlZFNlbGVjdG9yKEludGVycG9sYXRlZFNlbGVjdG9yIG5vZGUpID0+CiAgICAgIHZpc2l0SW50ZXJwb2xhdGVkTm9kZShub2RlKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludGVycG9sYXRlZFN0YXRlbWVudChJbnRlcnBvbGF0ZWRTdGF0ZW1lbnQgbm9kZSkgewogICAgb3V0TG4oJyMke25vZGUubmFtZU9yUG9zaXRpb259Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW50ZXJwb2xhdGVkRGVjbGFyYXRpb24oSW50ZXJwb2xhdGVkRGVjbGFyYXRpb24gbm9kZSkgewogICAgdmlzaXRJbnRlcnBvbGF0ZWROb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbW1lbnQoQ29tbWVudCBub2RlKSB7CiAgICBpZiAoc2hvdWxkQ29tcHJlc3NPdXRwdXQpIHJldHVybjsKICAgIFN0cmluZyBjb21tZW50ID0gbm9kZS5jb21tZW50LnRyaW0oKTsKICAgIGlmIChjb21tZW50LmlzRW1wdHkpIHJldHVybjsKICAgIGZvciAodmFyIGxpbmUgaW4gY29tbWVudC5zcGxpdCgnXG4nKSkgewogICAgICBpZiAoY29tbWVudC5zdGFydHNXaXRoKCcvLycpKSB7CiAgICAgICAgb3V0SW5kZW50TG4obGluZS50cmltKCkpOwogICAgICB9IGVsc2UgewogICAgICAgIG91dEluZGVudExuKCcvLyAke2xpbmUudHJpbSgpfScpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXdhaXQoQXdhaXQgbm9kZSkgewogICAgb3V0KCJhd2FpdCAiKTsKICAgIHZpc2l0KG5vZGUuZXhwcmVzc2lvbik7CiAgfQp9CgpjbGFzcyBPcmRlcmVkU2V0PFQ+IHsKICBmaW5hbCBTZXQ8VD4gc2V0OwogIGZpbmFsIExpc3Q8VD4gbGlzdDsKCiAgT3JkZXJlZFNldCgpCiAgICAgIDogc2V0ID0gbmV3IFNldDxUPigpLAogICAgICAgIGxpc3QgPSA8VD5bXTsKCiAgdm9pZCBhZGQoVCB4KSB7CiAgICBpZiAoc2V0LmFkZCh4KSkgewogICAgICAvLyBbU2V0LmFkZF0gcmV0dXJucyBgdHJ1ZWAgaWYgJ3gnIHdhcyBhZGRlZC4KICAgICAgbGlzdC5hZGQoeCk7CiAgICB9CiAgfQoKICB2b2lkIGZvckVhY2godm9pZCBmdW4oVCB4KSkgewogICAgbGlzdC5mb3JFYWNoKGZ1bik7CiAgfQp9CgovLyBDb2xsZWN0cyBhbGwgdGhlIHZhciBkZWNsYXJhdGlvbnMgaW4gdGhlIGZ1bmN0aW9uLiAgV2UgbmVlZCB0byBkbyB0aGlzIGluIGEKLy8gc2VwYXJhdGUgcGFzcyBiZWNhdXNlIEpTIHZhcnMgYXJlIGxpZnRlZCB0byB0aGUgdG9wIG9mIHRoZSBmdW5jdGlvbi4KY2xhc3MgVmFyQ29sbGVjdG9yIGV4dGVuZHMgQmFzZVZpc2l0b3IgewogIGJvb2wgbmVzdGVkOwogIGJvb2wgZW5hYmxlUmVuYW1pbmcgPSB0cnVlOwogIGZpbmFsIE9yZGVyZWRTZXQ8U3RyaW5nPiB2YXJzOwogIGZpbmFsIE9yZGVyZWRTZXQ8U3RyaW5nPiBwYXJhbXM7CgogIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGlzYWJsZVZhcmlhYmxlTWluaWZpY2F0aW9uUGF0dGVybiA9ICI6Om5vcmVuYW1pbmc6OiI7CiAgc3RhdGljIGZpbmFsIFN0cmluZyBlbmFibGVWYXJpYWJsZU1pbmlmaWNhdGlvblBhdHRlcm4gPSAiOjpkb3JlbmFtaW5nOjoiOwoKICBWYXJDb2xsZWN0b3IoKQogICAgICA6IG5lc3RlZCA9IGZhbHNlLAogICAgICAgIHZhcnMgPSBuZXcgT3JkZXJlZFNldDxTdHJpbmc+KCksCiAgICAgICAgcGFyYW1zID0gbmV3IE9yZGVyZWRTZXQ8U3RyaW5nPigpOwoKICB2b2lkIGZvckVhY2hWYXIodm9pZCBmbihTdHJpbmcgdikpID0+IHZhcnMuZm9yRWFjaChmbik7CiAgdm9pZCBmb3JFYWNoUGFyYW0odm9pZCBmbihTdHJpbmcgcCkpID0+IHBhcmFtcy5mb3JFYWNoKGZuKTsKCiAgdm9pZCBjb2xsZWN0VmFyc0luRnVuY3Rpb24oRnVuIGZ1bikgewogICAgaWYgKCFuZXN0ZWQpIHsKICAgICAgbmVzdGVkID0gdHJ1ZTsKICAgICAgaWYgKGZ1bi5wYXJhbXMgIT0gbnVsbCkgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnVuLnBhcmFtcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgcGFyYW1zLmFkZChmdW4ucGFyYW1zW2ldLm5hbWUpOwogICAgICAgIH0KICAgICAgfQogICAgICB2aXNpdEJsb2NrKGZ1bi5ib2R5KTsKICAgICAgbmVzdGVkID0gZmFsc2U7CiAgICB9CiAgfQoKICB2b2lkIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CiAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgYm90aGVyIGNvbGxlY3RpbmcgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLgogICAgY29sbGVjdFZhcnNJbkZ1bmN0aW9uKGRlY2xhcmF0aW9uLmZ1bmN0aW9uKTsKICB9CgogIHZvaWQgdmlzaXROYW1lZEZ1bmN0aW9uKE5hbWVkRnVuY3Rpb24gbmFtZWRGdW5jdGlvbikgewogICAgLy8gTm90ZSB0aGF0IHdlIGRvbid0IGJvdGhlciBjb2xsZWN0aW5nIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi4KICAgIGNvbGxlY3RWYXJzSW5GdW5jdGlvbihuYW1lZEZ1bmN0aW9uLmZ1bmN0aW9uKTsKICB9CgogIHZvaWQgdmlzaXRGdW4oRnVuIGZ1bikgewogICAgY29sbGVjdFZhcnNJbkZ1bmN0aW9uKGZ1bik7CiAgfQoKICB2b2lkIHZpc2l0VGhpcyhUaGlzIG5vZGUpIHt9CgogIHZvaWQgdmlzaXRDb21tZW50KENvbW1lbnQgbm9kZSkgewogICAgaWYgKG5vZGUuY29tbWVudC5jb250YWlucyhkaXNhYmxlVmFyaWFibGVNaW5pZmljYXRpb25QYXR0ZXJuKSkgewogICAgICBlbmFibGVSZW5hbWluZyA9IGZhbHNlOwogICAgfSBlbHNlIGlmIChub2RlLmNvbW1lbnQuY29udGFpbnMoZW5hYmxlVmFyaWFibGVNaW5pZmljYXRpb25QYXR0ZXJuKSkgewogICAgICBlbmFibGVSZW5hbWluZyA9IHRydWU7CiAgICB9CiAgfQoKICB2b2lkIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihWYXJpYWJsZURlY2xhcmF0aW9uIGRlY2wpIHsKICAgIGlmIChlbmFibGVSZW5hbWluZyAmJiBkZWNsLmFsbG93UmVuYW1lKSB2YXJzLmFkZChkZWNsLm5hbWUpOwogIH0KfQoKLyoqCiAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlIGdpdmVuIG5vZGUgbXVzdCBiZSB3cmFwcGVkIGludG8gYnJhY2VzIHdoZW4gdXNlZAogKiBhcyB0aGVuLXN0YXRlbWVudCBpbiBhbiBbSWZdIHRoYXQgaGFzIGFuIGVsc2UgYnJhbmNoLgogKi8KY2xhc3MgRGFuZ2xpbmdFbHNlVmlzaXRvciBleHRlbmRzIEJhc2VWaXNpdG9yPGJvb2w+IHsKICBKYXZhU2NyaXB0UHJpbnRpbmdDb250ZXh0IGNvbnRleHQ7CgogIERhbmdsaW5nRWxzZVZpc2l0b3IodGhpcy5jb250ZXh0KTsKCiAgYm9vbCB2aXNpdFByb2dyYW0oUHJvZ3JhbSBub2RlKSA9PiBmYWxzZTsKCiAgYm9vbCB2aXNpdE5vZGUoTm9kZSBub2RlKSB7CiAgICBjb250ZXh0LmVycm9yKCJGb3Jnb3Qgbm9kZTogJG5vZGUiKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgYm9vbCB2aXNpdEJsb2NrKEJsb2NrIG5vZGUpID0+IGZhbHNlOwogIGJvb2wgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgPT4gZmFsc2U7CiAgYm9vbCB2aXNpdEVtcHR5U3RhdGVtZW50KEVtcHR5U3RhdGVtZW50IG5vZGUpID0+IGZhbHNlOwogIGJvb2wgdmlzaXRJZihJZiBub2RlKSB7CiAgICBpZiAoIW5vZGUuaGFzRWxzZSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gbm9kZS5vdGhlcndpc2UuYWNjZXB0KHRoaXMpOwogIH0KCiAgYm9vbCB2aXNpdEZvcihGb3Igbm9kZSkgPT4gbm9kZS5ib2R5LmFjY2VwdCh0aGlzKTsKICBib29sIHZpc2l0Rm9ySW4oRm9ySW4gbm9kZSkgPT4gbm9kZS5ib2R5LmFjY2VwdCh0aGlzKTsKICBib29sIHZpc2l0V2hpbGUoV2hpbGUgbm9kZSkgPT4gbm9kZS5ib2R5LmFjY2VwdCh0aGlzKTsKICBib29sIHZpc2l0RG8oRG8gbm9kZSkgPT4gZmFsc2U7CiAgYm9vbCB2aXNpdENvbnRpbnVlKENvbnRpbnVlIG5vZGUpID0+IGZhbHNlOwogIGJvb2wgdmlzaXRCcmVhayhCcmVhayBub2RlKSA9PiBmYWxzZTsKICBib29sIHZpc2l0UmV0dXJuKFJldHVybiBub2RlKSA9PiBmYWxzZTsKICBib29sIHZpc2l0VGhyb3coVGhyb3cgbm9kZSkgPT4gZmFsc2U7CiAgYm9vbCB2aXNpdFRyeShUcnkgbm9kZSkgewogICAgaWYgKG5vZGUuZmluYWxseVBhcnQgIT0gbnVsbCkgewogICAgICByZXR1cm4gbm9kZS5maW5hbGx5UGFydC5hY2NlcHQodGhpcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbm9kZS5jYXRjaFBhcnQuYWNjZXB0KHRoaXMpOwogICAgfQogIH0KCiAgYm9vbCB2aXNpdENhdGNoKENhdGNoIG5vZGUpID0+IG5vZGUuYm9keS5hY2NlcHQodGhpcyk7CiAgYm9vbCB2aXNpdFN3aXRjaChTd2l0Y2ggbm9kZSkgPT4gZmFsc2U7CiAgYm9vbCB2aXNpdENhc2UoQ2FzZSBub2RlKSA9PiBmYWxzZTsKICBib29sIHZpc2l0RGVmYXVsdChEZWZhdWx0IG5vZGUpID0+IGZhbHNlOwogIGJvb2wgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKEZ1bmN0aW9uRGVjbGFyYXRpb24gbm9kZSkgPT4gZmFsc2U7CiAgYm9vbCB2aXNpdExhYmVsZWRTdGF0ZW1lbnQoTGFiZWxlZFN0YXRlbWVudCBub2RlKSA9PiBub2RlLmJvZHkuYWNjZXB0KHRoaXMpOwogIGJvb2wgdmlzaXRMaXRlcmFsU3RhdGVtZW50KExpdGVyYWxTdGF0ZW1lbnQgbm9kZSkgPT4gdHJ1ZTsKCiAgYm9vbCB2aXNpdEV4cHJlc3Npb24oRXhwcmVzc2lvbiBub2RlKSA9PiBmYWxzZTsKfQoKYWJzdHJhY3QgY2xhc3MgTG9jYWxOYW1lciB7CiAgU3RyaW5nIGdldE5hbWUoU3RyaW5nIG9sZE5hbWUpOwogIFN0cmluZyBkZWNsYXJlVmFyaWFibGUoU3RyaW5nIG9sZE5hbWUpOwogIFN0cmluZyBkZWNsYXJlUGFyYW1ldGVyKFN0cmluZyBvbGROYW1lKTsKICB2b2lkIGVudGVyU2NvcGUoVmFyQ29sbGVjdG9yIHZhcnMpOwogIHZvaWQgbGVhdmVTY29wZSgpOwp9CgpjbGFzcyBJZGVudGl0eU5hbWVyIGltcGxlbWVudHMgTG9jYWxOYW1lciB7CiAgU3RyaW5nIGdldE5hbWUoU3RyaW5nIG9sZE5hbWUpID0+IG9sZE5hbWU7CiAgU3RyaW5nIGRlY2xhcmVWYXJpYWJsZShTdHJpbmcgb2xkTmFtZSkgPT4gb2xkTmFtZTsKICBTdHJpbmcgZGVjbGFyZVBhcmFtZXRlcihTdHJpbmcgb2xkTmFtZSkgPT4gb2xkTmFtZTsKICB2b2lkIGVudGVyU2NvcGUoVmFyQ29sbGVjdG9yIHZhcnMpIHt9CiAgdm9pZCBsZWF2ZVNjb3BlKCkge30KfQoKY2xhc3MgTWluaWZ5UmVuYW1lciBpbXBsZW1lbnRzIExvY2FsTmFtZXIgewogIGZpbmFsIExpc3Q8TWFwPFN0cmluZywgU3RyaW5nPj4gbWFwcyA9IFtdOwogIGZpbmFsIExpc3Q8aW50PiBwYXJhbWV0ZXJOdW1iZXJTdGFjayA9IFtdOwogIGZpbmFsIExpc3Q8aW50PiB2YXJpYWJsZU51bWJlclN0YWNrID0gW107CiAgaW50IHBhcmFtZXRlck51bWJlciA9IDA7CiAgaW50IHZhcmlhYmxlTnVtYmVyID0gMDsKCiAgTWluaWZ5UmVuYW1lcigpOwoKICB2b2lkIGVudGVyU2NvcGUoVmFyQ29sbGVjdG9yIHZhcnMpIHsKICAgIG1hcHMuYWRkKG5ldyBNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOwogICAgdmFyaWFibGVOdW1iZXJTdGFjay5hZGQodmFyaWFibGVOdW1iZXIpOwogICAgcGFyYW1ldGVyTnVtYmVyU3RhY2suYWRkKHBhcmFtZXRlck51bWJlcik7CiAgICB2YXJzLmZvckVhY2hWYXIoZGVjbGFyZVZhcmlhYmxlKTsKICAgIHZhcnMuZm9yRWFjaFBhcmFtKGRlY2xhcmVQYXJhbWV0ZXIpOwogIH0KCiAgdm9pZCBsZWF2ZVNjb3BlKCkgewogICAgbWFwcy5yZW1vdmVMYXN0KCk7CiAgICB2YXJpYWJsZU51bWJlciA9IHZhcmlhYmxlTnVtYmVyU3RhY2sucmVtb3ZlTGFzdCgpOwogICAgcGFyYW1ldGVyTnVtYmVyID0gcGFyYW1ldGVyTnVtYmVyU3RhY2sucmVtb3ZlTGFzdCgpOwogIH0KCiAgU3RyaW5nIGdldE5hbWUoU3RyaW5nIG9sZE5hbWUpIHsKICAgIC8vIEdvIGZyb20gaW5uZXIgc2NvcGUgdG8gb3V0ZXIgbG9va2luZyBmb3IgbWFwcGluZyBvZiBuYW1lLgogICAgZm9yIChpbnQgaSA9IG1hcHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgdmFyIG1hcCA9IG1hcHNbaV07CiAgICAgIHZhciByZXBsYWNlbWVudCA9IG1hcFtvbGROYW1lXTsKICAgICAgaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHJldHVybiByZXBsYWNlbWVudDsKICAgIH0KICAgIHJldHVybiBvbGROYW1lOwogIH0KCiAgc3RhdGljIGNvbnN0IExPV0VSX0NBU0VfTEVUVEVSUyA9IDI2OwogIHN0YXRpYyBjb25zdCBMRVRURVJTID0gTE9XRVJfQ0FTRV9MRVRURVJTOwogIHN0YXRpYyBjb25zdCBESUdJVFMgPSAxMDsKCiAgc3RhdGljIGludCBudGhMZXR0ZXIoaW50IG4pIHsKICAgIHJldHVybiAobiA8IExPV0VSX0NBU0VfTEVUVEVSUykKICAgICAgICA/IGNoYXJDb2Rlcy4kYSArIG4KICAgICAgICA6IGNoYXJDb2Rlcy4kQSArIG4gLSBMT1dFUl9DQVNFX0xFVFRFUlM7CiAgfQoKICAvLyBQYXJhbWV0ZXJzIGdvIGZyb20gYSB0byB6IGFuZCB2YXJpYWJsZXMgZ28gZnJvbSB6IHRvIGEuICBUaGlzIG1ha2VzIGVhY2gKICAvLyBhcmd1bWVudCBsaXN0IGFuZCBlYWNoIHRvcC1vZi1mdW5jdGlvbiB2YXIgZGVjbGFyYXRpb24gbG9vayBzaW1pbGFyIGFuZAogIC8vIGhlbHBzIGd6aXAgY29tcHJlc3MgdGhlIGZpbGUuICBJZiB3ZSBoYXZlIG1vcmUgdGhhbiAyNiBhcmd1bWVudHMgYW5kCiAgLy8gdmFyaWFibGVzIHRoZW4gd2UgbWVldCBzb21ld2hlcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgYWxwaGFiZXQuICBBZnRlcgogIC8vIHRoYXQgd2UgZ2l2ZSB1cCB0cnlpbmcgdG8gYmUgbmljZSB0byB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIGFuZCBqdXN0CiAgLy8gdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSBmb3IgYXJndW1lbnRzIGFuZCB2YXJpYWJsZXMsIHN0YXJ0aW5nIHdpdGggQSwgYW5kCiAgLy8gbW92aW5nIG9uIHRvIGEwLCBhMSwgZXRjLgogIFN0cmluZyBkZWNsYXJlVmFyaWFibGUoU3RyaW5nIG9sZE5hbWUpIHsKICAgIGlmIChhdm9pZFJlbmFtaW5nKG9sZE5hbWUpKSByZXR1cm4gb2xkTmFtZTsKICAgIHZhciBuZXdOYW1lOwogICAgaWYgKHZhcmlhYmxlTnVtYmVyICsgcGFyYW1ldGVyTnVtYmVyIDwgTE9XRVJfQ0FTRV9MRVRURVJTKSB7CiAgICAgIC8vIFZhcmlhYmxlcyBzdGFydCBmcm9tIHogYW5kIGdvIGJhY2t3YXJkcywgZm9yIGJldHRlciBnemlwYWJpbGl0eS4KICAgICAgbmV3TmFtZSA9IGdldE5hbWVOdW1iZXIob2xkTmFtZSwgTE9XRVJfQ0FTRV9MRVRURVJTIC0gMSAtIHZhcmlhYmxlTnVtYmVyKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIEFmdGVyIDI2IHZhcmlhYmxlcyBhbmQgcGFyYW1ldGVycyB3ZSBhbGxvY2F0ZSB0aGVtIGluIHRoZSBzYW1lIG9yZGVyLgogICAgICBuZXdOYW1lID0gZ2V0TmFtZU51bWJlcihvbGROYW1lLCB2YXJpYWJsZU51bWJlciArIHBhcmFtZXRlck51bWJlcik7CiAgICB9CiAgICB2YXJpYWJsZU51bWJlcisrOwogICAgcmV0dXJuIG5ld05hbWU7CiAgfQoKICBTdHJpbmcgZGVjbGFyZVBhcmFtZXRlcihTdHJpbmcgb2xkTmFtZSkgewogICAgaWYgKGF2b2lkUmVuYW1pbmcob2xkTmFtZSkpIHJldHVybiBvbGROYW1lOwogICAgdmFyIG5ld05hbWU7CiAgICBpZiAodmFyaWFibGVOdW1iZXIgKyBwYXJhbWV0ZXJOdW1iZXIgPCBMT1dFUl9DQVNFX0xFVFRFUlMpIHsKICAgICAgbmV3TmFtZSA9IGdldE5hbWVOdW1iZXIob2xkTmFtZSwgcGFyYW1ldGVyTnVtYmVyKTsKICAgIH0gZWxzZSB7CiAgICAgIG5ld05hbWUgPSBnZXROYW1lTnVtYmVyKG9sZE5hbWUsIHZhcmlhYmxlTnVtYmVyICsgcGFyYW1ldGVyTnVtYmVyKTsKICAgIH0KICAgIHBhcmFtZXRlck51bWJlcisrOwogICAgcmV0dXJuIG5ld05hbWU7CiAgfQoKICBib29sIGF2b2lkUmVuYW1pbmcoU3RyaW5nIG9sZE5hbWUpIHsKICAgIC8vIFZhcmlhYmxlcyBvZiB0aGlzICRmb3JtJCBhcmUgdXNlZCBpbiBwYXR0ZXJuIG1hdGNoaW5nIHRoZSBtZXNzYWdlIG9mIEpTCiAgICAvLyBleGNlcHRpb25zLCBzbyBzaG91bGQgbm90IGJlIHJlbmFtZWQuCiAgICAvLyBUT0RPKHNyYSk6IEludHJvZHVjZSBhIHdheSBmb3IgaW5kaWNhdGluZyBpbiB0aGUgSlMgdGV4dCB3aGljaCB2YXJpYWJsZXMKICAgIC8vIHNob3VsZCBub3QgYmUgcmVuYW1lZC4KICAgIHJldHVybiBvbGROYW1lLnN0YXJ0c1dpdGgocickJykgJiYgb2xkTmFtZS5lbmRzV2l0aChyJyQnKTsKICB9CgogIFN0cmluZyBnZXROYW1lTnVtYmVyKFN0cmluZyBvbGROYW1lLCBpbnQgbikgewogICAgaWYgKG1hcHMuaXNFbXB0eSkgcmV0dXJuIG9sZE5hbWU7CgogICAgU3RyaW5nIG5ld05hbWU7CiAgICBpZiAobiA8IExFVFRFUlMpIHsKICAgICAgLy8gU3RhcnQgbmFtaW5nIHZhcmlhYmxlcyBhLCBiLCBjLCAuLi4sIHosIEEsIEIsIEMsIC4uLiwgWi4KICAgICAgbmV3TmFtZSA9IG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhbbnRoTGV0dGVyKG4pXSk7CiAgICB9IGVsc2UgewogICAgICAvLyBUaGVuIG5hbWUgdmFyaWFibGVzIGEwLCBhMSwgYTIsIC4uLiwgYTksIGIwLCBiMSwgLi4uLCBaOSwgYWEwLCBhYTEsIC4uLgogICAgICAvLyBGb3IgYWxsIGZ1bmN0aW9ucyB3aXRoIGZld2VyIHRoYW4gNTAwIGxvY2FscyB0aGlzIGlzIGp1c3QgYXMgY29tcGFjdAogICAgICAvLyBhcyB1c2luZyBhYSwgYWIsIGV0Yy4gYnV0IGF2b2lkcyBjbGFzaGVzIHdpdGgga2V5d29yZHMuCiAgICAgIG4gLT0gTEVUVEVSUzsKICAgICAgaW50IGRpZ2l0ID0gbiAlIERJR0lUUzsKICAgICAgbiB+Lz0gRElHSVRTOwogICAgICBpbnQgYWxwaGFDaGFycyA9IDE7CiAgICAgIGludCBuYW1lU3BhY2VTaXplID0gTEVUVEVSUzsKICAgICAgLy8gRmluZCBvdXQgd2hldGhlciB3ZSBzaG91bGQgdXNlIHRoZSAxLWNoYXJhY3RlciBuYW1lc3BhY2UgKHNpemUgNTIpLCB0aGUKICAgICAgLy8gMi1jaGFyYWN0ZXIgbmFtZXNwYWNlIChzaXplIDUyKjUyKSwgZXRjLgogICAgICB3aGlsZSAobiA+PSBuYW1lU3BhY2VTaXplKSB7CiAgICAgICAgbiAtPSBuYW1lU3BhY2VTaXplOwogICAgICAgIGFscGhhQ2hhcnMrKzsKICAgICAgICBuYW1lU3BhY2VTaXplICo9IExFVFRFUlM7CiAgICAgIH0KICAgICAgdmFyIGNvZGVzID0gPGludD5bXTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbHBoYUNoYXJzOyBpKyspIHsKICAgICAgICBuYW1lU3BhY2VTaXplIH4vPSBMRVRURVJTOwogICAgICAgIGNvZGVzLmFkZChudGhMZXR0ZXIoKG4gfi8gbmFtZVNwYWNlU2l6ZSkgJSBMRVRURVJTKSk7CiAgICAgIH0KICAgICAgY29kZXMuYWRkKGNoYXJDb2Rlcy4kMCArIGRpZ2l0KTsKICAgICAgbmV3TmFtZSA9IG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2Rlcyk7CiAgICB9CiAgICBhc3NlcnQobmV3IFJlZ0V4cChyJ1thLXpBLVpdW2EtekEtWjAtOV0qJykuaGFzTWF0Y2gobmV3TmFtZSkpOwogICAgbWFwcy5sYXN0W29sZE5hbWVdID0gbmV3TmFtZTsKICAgIHJldHVybiBuZXdOYW1lOwogIH0KfQoKLy8vIEluZm9ybWF0aW9uIHBlcnRhaW5pbmcgdGhlIGVudGVyIGFuZCBleGl0IGNhbGxiYWNrcyBmb3IgW25vZGVdLgpjbGFzcyBFbnRlckV4aXROb2RlIHsKICBmaW5hbCBFbnRlckV4aXROb2RlIHBhcmVudDsKICBmaW5hbCBOb2RlIG5vZGU7CgogIGludCBzdGFydFBvc2l0aW9uOwogIGludCBjbG9zaW5nUG9zaXRpb247CgogIEVudGVyRXhpdE5vZGUodGhpcy5wYXJlbnQsIHRoaXMubm9kZSk7CgogIHZvaWQgYWRkVG9Ob2RlKEphdmFTY3JpcHRQcmludGluZ0NvbnRleHQgY29udGV4dCwgaW50IHBvc2l0aW9uKSB7CiAgICBpZiAoc3RhcnRQb3NpdGlvbiA9PSBudWxsKSB7CiAgICAgIC8vIFtwb3NpdGlvbl0gaXMgdGhlIHN0YXJ0IHBvc2l0aW9uIG9m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RjEEATlGMwQBGyAEAR8BJEUeSx0GBAE8QQQCAQRJOQQ2JQElASwBHikRBAEoRDoaJCgEATU5OSIuKCooHCQsDSoGBAE5KiYsRE89ATICARwiKismFQIBLC01NigXAgEsLS0sGxoBEwEnKS0vJikEARYXNzkEASNBMRkmMwYUBAEoLRwBICQbMQQBTk1KTE1OHyswEUFKUQ1PSgYWFAQBLDARQTkNSgYXFAQBJ08tUB4/BAEwJgEUF0I6DVFOQRQeFBojUTIjHBYiCBstIz4IJzEGQyIUBAIBRBYeEwEVFwEpAUQhNRxDLQggKQYEAUwmIkYTBAIBH3BhY2thZ2U6anNfYXN0L3NyYy9wcmludGVyLmRhcnQpc2Rrcm9vdDovcGtnL2pzX2FzdC9saWIvc3JjL3RlbXBsYXRlLmRhcnTAAGT0Ly8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YganNfYXN0OwoKY2xhc3MgVGVtcGxhdGVNYW5hZ2VyIHsKICBNYXA8U3RyaW5nLCBUZW1wbGF0ZT4gZXhwcmVzc2lvblRlbXBsYXRlcyA9IG5ldyBNYXA8U3RyaW5nLCBUZW1wbGF0ZT4oKTsKICBNYXA8U3RyaW5nLCBUZW1wbGF0ZT4gc3RhdGVtZW50VGVtcGxhdGVzID0gbmV3IE1hcDxTdHJpbmcsIFRlbXBsYXRlPigpOwoKICBUZW1wbGF0ZU1hbmFnZXIoKTsKCiAgVGVtcGxhdGUgbG9va3VwRXhwcmVzc2lvblRlbXBsYXRlKFN0cmluZyBzb3VyY2UpIHsKICAgIHJldHVybiBleHByZXNzaW9uVGVtcGxhdGVzW3NvdXJjZV07CiAgfQoKICBUZW1wbGF0ZSBkZWZpbmVFeHByZXNzaW9uVGVtcGxhdGUoU3RyaW5nIHNvdXJjZSwgTm9kZSBhc3QpIHsKICAgIFRlbXBsYXRlIHRlbXBsYXRlID0KICAgICAgICBuZXcgVGVtcGxhdGUoc291cmNlLCBhc3QsIGlzRXhwcmVzc2lvbjogdHJ1ZSwgZm9yY2VDb3B5OiBmYWxzZSk7CiAgICBleHByZXNzaW9uVGVtcGxhdGVzW3NvdXJjZV0gPSB0ZW1wbGF0ZTsKICAgIHJldHVybiB0ZW1wbGF0ZTsKICB9CgogIFRlbXBsYXRlIGxvb2t1cFN0YXRlbWVudFRlbXBsYXRlKFN0cmluZyBzb3VyY2UpIHsKICAgIHJldHVybiBzdGF0ZW1lbnRUZW1wbGF0ZXNbc291cmNlXTsKICB9CgogIFRlbXBsYXRlIGRlZmluZVN0YXRlbWVudFRlbXBsYXRlKFN0cmluZyBzb3VyY2UsIE5vZGUgYXN0KSB7CiAgICBUZW1wbGF0ZSB0ZW1wbGF0ZSA9CiAgICAgICAgbmV3IFRlbXBsYXRlKHNvdXJjZSwgYXN0LCBpc0V4cHJlc3Npb246IGZhbHNlLCBmb3JjZUNvcHk6IGZhbHNlKTsKICAgIHN0YXRlbWVudFRlbXBsYXRlc1tzb3VyY2VdID0gdGVtcGxhdGU7CiAgICByZXR1cm4gdGVtcGxhdGU7CiAgfQp9CgovKioKICogQSBUZW1wbGF0ZSBpcyBjcmVhdGVkIHdpdGggSmF2YVNjcmlwdCBBU1QgY29udGFpbmluZyBwbGFjZWhvbGRlcnMgKGludGVyZmFjZQogKiBJbnRlcnBvbGF0ZWROb2RlKS4gIFRoZSBbaW5zdGFudGlhdGVdIG1ldGhvZCBjcmVhdGVzIGFuIEFTVCB0aGF0IGxvb2tzIGxpa2UKICogdGhlIG9yaWdpbmFsIHdpdGggdGhlIHBsYWNlaG9sZGVycyByZXBsYWNlZCBieSB0aGUgYXJndW1lbnRzIHRvCiAqIFtpbnN0YW50aWF0ZV0uCiAqLwpjbGFzcyBUZW1wbGF0ZSB7CiAgZmluYWwgU3RyaW5nIHNvdXJjZTsKICBmaW5hbCBib29sIGlzRXhwcmVzc2lvbjsKICBmaW5hbCBib29sIGZvcmNlQ29weTsKICBmaW5hbCBOb2RlIGFzdDsKCiAgSW5zdGFudGlhdG9yIGluc3RhbnRpYXRvcjsKCiAgaW50IHBvc2l0aW9uYWxBcmd1bWVudENvdW50ID0gLTE7CgogIC8vIE51bGwsIHVubGVzcyB0aGVyZSBhcmUgbmFtZWQgaG9sZXMuCiAgTGlzdDxTdHJpbmc+IGhvbGVOYW1lczsKICBib29sIGdldCBpc1Bvc2l0aW9uYWwgPT4gaG9sZU5hbWVzID09IG51bGw7CgogIFRlbXBsYXRlKHRoaXMuc291cmNlLCB0aGlzLmFzdCwKICAgICAge3RoaXMuaXNFeHByZXNzaW9uOiB0cnVlLCB0aGlzLmZvcmNlQ29weTogZmFsc2V9KSB7CiAgICBhc3NlcnQodGhpcy5pc0V4cHJlc3Npb24gPyBhc3QgaXMgRXhwcmVzc2lvbiA6IGFzdCBpcyBTdGF0ZW1lbnQpOwogICAgX2NvbXBpbGUoKTsKICB9CgogIFRlbXBsYXRlLndpdGhFeHByZXNzaW9uUmVzdWx0KHRoaXMuYXN0KQogICAgICA6IHNvdXJjZSA9IG51bGwsCiAgICAgICAgaXNFeHByZXNzaW9uID0gdHJ1ZSwKICAgICAgICBmb3JjZUNvcHkgPSBmYWxzZSB7CiAgICBhc3NlcnQoYXN0IGlzIEV4cHJlc3Npb24pOwogICAgYXNzZXJ0KF9jaGVja05vUGxhY2Vob2xkZXJzKCkpOwogICAgcG9zaXRpb25hbEFyZ3VtZW50Q291bnQgPSAwOwogICAgaW5zdGFudGlhdG9yID0gKGFyZ3VtZW50cykgPT4gYXN0OwogIH0KCiAgVGVtcGxhdGUud2l0aFN0YXRlbWVudFJlc3VsdCh0aGlzLmFzdCkKICAgICAgOiBzb3VyY2UgPSBudWxsLAogICAgICAgIGlzRXhwcmVzc2lvbiA9IGZhbHNlLAogICAgICAgIGZvcmNlQ29weSA9IGZhbHNlIHsKICAgIGFzc2VydChhc3QgaXMgU3RhdGVtZW50KTsKICAgIGFzc2VydChfY2hlY2tOb1BsYWNlaG9sZGVycygpKTsKICAgIHBvc2l0aW9uYWxBcmd1bWVudENvdW50ID0gMDsKICAgIGluc3RhbnRpYXRvciA9IChhcmd1bWVudHMpID0+IGFzdDsKICB9CgogIGJvb2wgX2NoZWNrTm9QbGFjZWhvbGRlcnMoKSB7CiAgICBJbnN0YW50aWF0b3JHZW5lcmF0b3JWaXNpdG9yIGdlbmVyYXRvciA9CiAgICAgICAgbmV3IEluc3RhbnRpYXRvckdlbmVyYXRvclZpc2l0b3IoZmFsc2UpOwogICAgZ2VuZXJhdG9yLmNvbXBpbGUoYXN0KTsKICAgIHJldHVybiBnZW5lcmF0b3IuYW5hbHlzaXMuY291bnQgPT0gMDsKICB9CgogIHZvaWQgX2NvbXBpbGUoKSB7CiAgICBJbnN0YW50aWF0b3JHZW5lcmF0b3JWaXNpdG9yIGdlbmVyYXRvciA9CiAgICAgICAgbmV3IEluc3RhbnRpYXRvckdlbmVyYXRvclZpc2l0b3IoZm9yY2VDb3B5KTsKICAgIGluc3RhbnRpYXRvciA9IGdlbmVyYXRvci5jb21waWxlKGFzdCk7CiAgICBwb3NpdGlvbmFsQXJndW1lbnRDb3VudCA9IGdlbmVyYXRvci5hbmFseXNpcy5jb3VudDsKICAgIFNldDxTdHJpbmc+IG5hbWVzID0gZ2VuZXJhdG9yLmFuYWx5c2lzLmhvbGVOYW1lczsKICAgIGhvbGVOYW1lcyA9IG5hbWVzLnRvTGlzdChncm93YWJsZTogZmFsc2UpOwogIH0KCiAgLy8vIEluc3RhbnRpYXRlcyB0aGUgdGVtcGxhdGUgd2l0aCB0aGUgZ2l2ZW4gW2FyZ3VtZW50c10uCiAgLy8vCiAgLy8vIFRoaXMgbWV0aG9kIGZpbGxzIGluIHRoZSBob2xlcyB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIFRoZSBbYXJndW1lbnRzXQogIC8vLyBtdXN0IGJlIGVpdGhlciBhIFtMaXN0XSBvciBhIFtNYXBdLgogIE5vZGUgaW5zdGFudGlhdGUodmFyIGFyZ3VtZW50cykgewogICAgaWYgKGFyZ3VtZW50cyBpcyBMaXN0KSB7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICE9IHBvc2l0aW9uYWxBcmd1bWVudENvdW50KSB7CiAgICAgICAgdGhyb3cgJ1dyb25nIG51bWJlciBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMsIGdpdmVuICR7YXJndW1lbnRzLmxlbmd0aH0sICcKICAgICAgICAgICAgJ2V4cGVjdGVkICRwb3NpdGlvbmFsQXJndW1lbnRDb3VudCcKICAgICAgICAgICAgJywgc291cmNlOiAiJHNvdXJjZSInOwogICAgICB9CiAgICAgIHJldHVybiBpbnN0YW50aWF0b3IoYXJndW1lbnRzKTsKICAgIH0KICAgIGFzc2VydChhcmd1bWVudHMgaXMgTWFwKTsKICAgIGlmIChob2xlTmFtZXMubGVuZ3RoIDwgYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAvLyBUaGlzIHNlYXJjaCBpcyBpbiBPKG4pLCBidXQgd2Ugb25seSBkbyBpdCBpbiBjYXNlIG9mIGFuIGVycm9yLCBhbmQgdGhlCiAgICAgIC8vIG51bWJlciBvZiBob2xlcyBzaG91bGQgYmUgcXVpdGUgbGltaXRlZC4KICAgICAgU3RyaW5nIHVudXNlZE5hbWVzID0KICAgICAgICAgIGFyZ3VtZW50cy5rZXlzLndoZXJlKChuYW1lKSA9PiAhaG9sZU5hbWVzLmNvbnRhaW5zKG5hbWUpKS5qb2luKCIsICIpOwogICAgICB0aHJvdyAiVGVtcGxhdGUgYXJndW1lbnRzIGhhcyB1bnVzZWQgbWFwcGluZ3M6ICR1bnVzZWROYW1lcyI7CiAgICB9CiAgICBpZiAoIWhvbGVOYW1lcy5ldmVyeSgoU3RyaW5nIG5hbWUpID0+IGFyZ3VtZW50cy5jb250YWluc0tleShuYW1lKSkpIHsKICAgICAgU3RyaW5nIG5vdEZvdW5kID0KICAgICAgICAgIGhvbGVOYW1lcy53aGVyZSgobmFtZSkgPT4gIWFyZ3VtZW50cy5jb250YWluc0tleShuYW1lKSkuam9pbigiLCAiKTsKICAgICAgdGhyb3cgIlRlbXBsYXRlIGFyZ3VtZW50cyBpcyBtaXNzaW5nIG1hcHBpbmdzIGZvcjogJG5vdEZvdW5kIjsKICAgIH0KICAgIHJldHVybiBpbnN0YW50aWF0b3IoYXJndW1lbnRzKTsKICB9Cn0KCi8qKgogKiBBbiBJbnN0YW50aWF0b3IgaXMgYSBGdW5jdGlvbiB0aGF0IGdlbmVyYXRlcyBhIEpTIEFTVCB0cmVlIG9yIExpc3Qgb2YKICogdHJlZXMuIFthcmd1bWVudHNdIGlzIGEgTGlzdCBmb3IgcG9zaXRpb25hbCB0ZW1wbGF0ZXMsIG9yIE1hcCBmb3IKICogbmFtZWQgdGVtcGxhdGVzLgogKi8KdHlwZWRlZiAvKk5vZGV8SXRlcmFibGU8Tm9kZT4qLyBJbnN0YW50aWF0b3IodmFyIGFyZ3VtZW50cyk7CgovKioKICogSW5zdGFudGlhdG9yR2VuZXJhdG9yVmlzaXRvciBjb21waWxlcyBhIHRlbXBsYXRlLiAgVGhpcyBjbGFzcyBjb21waWxlcyBhIHRyZWUKICogY29udGFpbmluZyBbSW50ZXJwb2xhdGVkTm9kZV1zIGludG8gYSBmdW5jdGlvbiB0aGF0IHdpbGwgY3JlYXRlIGEgY29weSBvZiB0aGUKICogdHJlZSB3aXRoIHRoZSBpbnRlcnBvbGF0ZWQgbm9kZXMgc3Vic3RpdHV0ZWQgd2l0aCBwcm92aWRlZCB2YWx1ZXMuCiAqLwpjbGFzcyBJbnN0YW50aWF0b3JHZW5lcmF0b3JWaXNpdG9yIGltcGxlbWVudHMgTm9kZVZpc2l0b3I8SW5zdGFudGlhdG9yPiB7CiAgZmluYWwgYm9vbCBmb3JjZUNvcHk7CgogIEludGVycG9sYXRlZE5vZGVBbmFseXNpcyBhbmFseXNpcyA9IG5ldyBJbnRlcnBvbGF0ZWROb2RlQW5hbHlzaXMoKTsKCiAgLyoqCiAgICogVGhlIGVudGlyZSB0cmVlIGlzIGNsb25lZCBpZiBbZm9yY2VDb3B5XSBpcyB0cnVlLgogICAqLwogIEluc3RhbnRpYXRvckdlbmVyYXRvclZpc2l0b3IodGhpcy5mb3JjZUNvcHkpOwoKICBJbnN0YW50aWF0b3IgY29tcGlsZShOb2RlIG5vZGUpIHsKICAgIGFuYWx5c2lzLnZpc2l0KG5vZGUpOwogICAgSW5zdGFudGlhdG9yIHJlc3VsdCA9IHZpc2l0KG5vZGUpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBlcnJvcihTdHJpbmcgbWVzc2FnZSkgewogICAgdGhyb3cgbWVzc2FnZTsKICB9CgogIHN0YXRpYyBJbnN0YW50aWF0b3Igc2FtZShOb2RlIG5vZGUpID0+IChhcmd1bWVudHMpID0+IG5vZGU7CiAgc3RhdGljIE5vZGUgbWFrZU51bGwoYXJndW1lbnRzKSA9PiBudWxsOwoKICBJbnN0YW50aWF0b3IgdmlzaXQoTm9kZSBub2RlKSB7CiAgICBpZiAoZm9yY2VDb3B5IHx8IGFuYWx5c2lzLmNvbnRhaW5zSW50ZXJwb2xhdGVkTm9kZXMobm9kZSkpIHsKICAgICAgcmV0dXJuIG5vZGUuYWNjZXB0KHRoaXMpOwogICAgfQogICAgcmV0dXJuIHNhbWUobm9kZSk7CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXROdWxsYWJsZShOb2RlIG5vZGUpIHsKICAgIGlmIChub2RlID09IG51bGwpIHJldHVybiBtYWtlTnVsbDsKICAgIHJldHVybiB2aXNpdChub2RlKTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdFNwbGF5YWJsZShOb2RlIG5vZGUpIHsKICAgIC8vIFRPRE8oc3JhKTogUHJvY2VzcyBpbW1lZGlhdGUgW0ludGVycG9sYXRlZE5vZGVdcywgcGVybWl0dGluZyBzcGxheWluZy4KICAgIHJldHVybiB2aXNpdChub2RlKTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdE5vZGUoTm9kZSBub2RlKSB7CiAgICB0aHJvdyAnVW5pbXBsZW1lbnRlZCBJbnN0YW50aWF0b3JHZW5lcmF0b3JWaXNpdG9yIGZvciAkbm9kZSc7CiAgfQoKICBzdGF0aWMgUmVnRXhwIGlkZW50aWZpZXJSRSA9IG5ldyBSZWdFeHAocideW0EtWmEtel8kXVtBLVphLXpfJDAtOV0qJCcpOwoKICBzdGF0aWMgRXhwcmVzc2lvbiBjb252ZXJ0U3RyaW5nVG9WYXJpYWJsZVVzZShTdHJpbmcgdmFsdWUpIHsKICAgIGFzc2VydChpZGVudGlmaWVyUkUuaGFzTWF0Y2godmFsdWUpKTsKICAgIHJldHVybiBuZXcgVmFyaWFibGVVc2UodmFsdWUpOwogIH0KCiAgc3RhdGljIEV4cHJlc3Npb24gY29udmVydFN0cmluZ1RvVmFyaWFibGVEZWNsYXJhdGlvbihTdHJpbmcgdmFsdWUpIHsKICAgIGFzc2VydChpZGVudGlmaWVyUkUuaGFzTWF0Y2godmFsdWUpKTsKICAgIHJldHVybiBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbih2YWx1ZSk7CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRJbnRlcnBvbGF0ZWRFeHByZXNzaW9uKEludGVycG9sYXRlZEV4cHJlc3Npb24gbm9kZSkgewogICAgdmFyIG5hbWVPclBvc2l0aW9uID0gbm9kZS5uYW1lT3JQb3NpdGlvbjsKICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50c1tuYW1lT3JQb3NpdGlvbl07CiAgICAgIGlmICh2YWx1ZSBpcyBFeHByZXNzaW9uKSByZXR1cm4gdmFsdWU7CiAgICAgIGlmICh2YWx1ZSBpcyBTdHJpbmcpIHJldHVybiBjb252ZXJ0U3RyaW5nVG9WYXJpYWJsZVVzZSh2YWx1ZSk7CiAgICAgIGVycm9yKCdJbnRlcnBvbGF0ZWQgdmFsdWUgIyRuYW1lT3JQb3NpdGlvbiBpcyBub3QgYW4gRXhwcmVzc2lvbjogJHZhbHVlJyk7CiAgICB9OwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0SW50ZXJwb2xhdGVkRGVjbGFyYXRpb24oSW50ZXJwb2xhdGVkRGVjbGFyYXRpb24gbm9kZSkgewogICAgdmFyIG5hbWVPclBvc2l0aW9uID0gbm9kZS5uYW1lT3JQb3NpdGlvbjsKICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50c1tuYW1lT3JQb3NpdGlvbl07CiAgICAgIGlmICh2YWx1ZSBpcyBEZWNsYXJhdGlvbikgcmV0dXJuIHZhbHVlOwogICAgICBpZiAodmFsdWUgaXMgU3RyaW5nKSByZXR1cm4gY29udmVydFN0cmluZ1RvVmFyaWFibGVEZWNsYXJhdGlvbih2YWx1ZSk7CiAgICAgIGVycm9yKCdJbnRlcnBvbGF0ZWQgdmFsdWUgIyRuYW1lT3JQb3NpdGlvbiBpcyBub3QgYSBkZWNsYXJhdGlvbjogJHZhbHVlJyk7CiAgICB9OwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0U3BsYXlhYmxlRXhwcmVzc2lvbihOb2RlIG5vZGUpIHsKICAgIGlmIChub2RlIGlzIEludGVycG9sYXRlZEV4cHJlc3Npb24pIHsKICAgICAgdmFyIG5hbWVPclBvc2l0aW9uID0gbm9kZS5uYW1lT3JQb3NpdGlvbjsKICAgICAgcmV0dXJuIChhcmd1bWVudHMpIHsKICAgICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHNbbmFtZU9yUG9zaXRpb25dOwogICAgICAgIEV4cHJlc3Npb24gdG9FeHByZXNzaW9uKGl0ZW0pIHsKICAgICAgICAgIGlmIChpdGVtIGlzIEV4cHJlc3Npb24pIHJldHVybiBpdGVtOwogICAgICAgICAgaWYgKGl0ZW0gaXMgU3RyaW5nKSByZXR1cm4gY29udmVydFN0cmluZ1RvVmFyaWFibGVVc2UoaXRlbSk7CiAgICAgICAgICByZXR1cm4gZXJyb3IoJ0ludGVycG9sYXRlZCB2YWx1ZSAjJG5hbWVPclBvc2l0aW9uIGlzIG5vdCAnCiAgICAgICAgICAgICAgJ2FuIEV4cHJlc3Npb24gb3IgTGlzdCBvZiBFeHByZXNzaW9uczogJHZhbHVlJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAodmFsdWUgaXMgSXRlcmFibGUpIHJldHVybiB2YWx1ZS5tYXAodG9FeHByZXNzaW9uKTsKICAgICAgICByZXR1cm4gdG9FeHByZXNzaW9uKHZhbHVlKTsKICAgICAgfTsKICAgIH0KICAgIHJldHVybiB2aXNpdChub2RlKTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdEludGVycG9sYXRlZExpdGVyYWwoSW50ZXJwb2xhdGVkTGl0ZXJhbCBub2RlKSB7CiAgICB2YXIgbmFtZU9yUG9zaXRpb24gPSBub2RlLm5hbWVPclBvc2l0aW9uOwogICAgcmV0dXJuIChhcmd1bWVudHMpIHsKICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzW25hbWVPclBvc2l0aW9uXTsKICAgICAgaWYgKHZhbHVlIGlzIExpdGVyYWwpIHJldHVybiB2YWx1ZTsKICAgICAgZXJyb3IoJ0ludGVycG9sYXRlZCB2YWx1ZSAjJG5hbWVPclBvc2l0aW9uIGlzIG5vdCBhIExpdGVyYWw6ICR2YWx1ZScpOwogICAgfTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdEludGVycG9sYXRlZFBhcmFtZXRlcihJbnRlcnBvbGF0ZWRQYXJhbWV0ZXIgbm9kZSkgewogICAgdmFyIG5hbWVPclBvc2l0aW9uID0gbm9kZS5uYW1lT3JQb3NpdGlvbjsKICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50c1tuYW1lT3JQb3NpdGlvbl07CgogICAgICBQYXJhbWV0ZXIgdG9QYXJhbWV0ZXIoaXRlbSkgewogICAgICAgIGlmIChpdGVtIGlzIFBhcmFtZXRlcikgcmV0dXJuIGl0ZW07CiAgICAgICAgaWYgKGl0ZW0gaXMgU3RyaW5nKSByZXR1cm4gbmV3IFBhcmFtZXRlcihpdGVtKTsKICAgICAgICByZXR1cm4gZXJyb3IoJ0ludGVycG9sYXRlZCB2YWx1ZSAjJG5hbWVPclBvc2l0aW9uIGlzIG5vdCBhIFBhcmFtZXRlciBvcicKICAgICAgICAgICAgJyBMaXN0IG9mIFBhcmFtZXRlcnM6ICR2YWx1ZScpOwogICAgICB9CgogICAgICBpZiAodmFsdWUgaXMgSXRlcmFibGUpIHJldHVybiB2YWx1ZS5tYXAodG9QYXJhbWV0ZXIpOwogICAgICByZXR1cm4gdG9QYXJhbWV0ZXIodmFsdWUpOwogICAgfTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdEludGVycG9sYXRlZFNlbGVjdG9yKEludGVycG9sYXRlZFNlbGVjdG9yIG5vZGUpIHsKICAgIC8vIEEgc2VsZWN0b3IgaXMgYW4gZXhwcmVzc2lvbiwgYXMgaW4gYGFbc2VsZWN0b3JdYC4KICAgIC8vIEEgU3RyaW5nIGFyZ3VtZW50IGNvbnZlcnRlZCBpbnRvIGEgTGl0ZXJhbFN0cmluZywgc28gYGEuI2Agd2l0aCBhcmd1bWVudAogICAgLy8gJ2ZvbycgZ2VuZXJhdGVzIGBhWyJmb28iXWAgd2hpY2ggcHJpbnRzIGFzIGBhLmZvb2AuCiAgICB2YXIgbmFtZU9yUG9zaXRpb24gPSBub2RlLm5hbWVPclBvc2l0aW9uOwogICAgcmV0dXJuIChhcmd1bWVudHMpIHsKICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzW25hbWVPclBvc2l0aW9uXTsKICAgICAgaWYgKHZhbHVlIGlzIEV4cHJlc3Npb24pIHJldHVybiB2YWx1ZTsKICAgICAgaWYgKHZhbHVlIGlzIFN0cmluZykgcmV0dXJuIG5ldyBMaXRlcmFsU3RyaW5nKCciJHZhbHVlIicpOwogICAgICBlcnJvcignSW50ZXJwb2xhdGVkIHZhbHVlICMkbmFtZU9yUG9zaXRpb24gaXMgbm90IGEgc2VsZWN0b3I6ICR2YWx1ZScpOwogICAgfTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdEludGVycG9sYXRlZFN0YXRlbWVudChJbnRlcnBvbGF0ZWRTdGF0ZW1lbnQgbm9kZSkgewogICAgdmFyIG5hbWVPclBvc2l0aW9uID0gbm9kZS5uYW1lT3JQb3NpdGlvbjsKICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50c1tuYW1lT3JQb3NpdGlvbl07CiAgICAgIGlmICh2YWx1ZSBpcyBOb2RlKSByZXR1cm4gdmFsdWUudG9TdGF0ZW1lbnQoKTsKICAgICAgZXJyb3IoJ0ludGVycG9sYXRlZCB2YWx1ZSAjJG5hbWVPclBvc2l0aW9uIGlzIG5vdCBhIFN0YXRlbWVudDogJHZhbHVlJyk7CiAgICB9OwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0U3BsYXlhYmxlU3RhdGVtZW50KE5vZGUgbm9kZSkgewogICAgaWYgKG5vZGUgaXMgSW50ZXJwb2xhdGVkU3RhdGVtZW50KSB7CiAgICAgIHZhciBuYW1lT3JQb3NpdGlvbiA9IG5vZGUubmFtZU9yUG9zaXRpb247CiAgICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzW25hbWVPclBvc2l0aW9uXTsKICAgICAgICBTdGF0ZW1lbnQgdG9TdGF0ZW1lbnQoaXRlbSkgewogICAgICAgICAgaWYgKGl0ZW0gaXMgU3RhdGVtZW50KSByZXR1cm4gaXRlbTsKICAgICAgICAgIGlmIChpdGVtIGlzIEV4cHJlc3Npb24pIHJldHVybiBpdGVtLnRvU3RhdGVtZW50KCk7CiAgICAgICAgICByZXR1cm4gZXJyb3IoJ0ludGVycG9sYXRlZCB2YWx1ZSAjJG5hbWVPclBvc2l0aW9uIGlzIG5vdCAnCiAgICAgICAgICAgICAgJ2EgU3RhdGVtZW50IG9yIExpc3Qgb2YgU3RhdGVtZW50czogJHZhbHVlJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAodmFsdWUgaXMgSXRlcmFibGUpIHJldHVybiB2YWx1ZS5tYXAodG9TdGF0ZW1lbnQpOwogICAgICAgIHJldHVybiB0b1N0YXRlbWVudCh2YWx1ZSk7CiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gdmlzaXQobm9kZSk7CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRQcm9ncmFtKFByb2dyYW0gbm9kZSkgewogICAgTGlzdDxJbnN0YW50aWF0b3I+IGluc3RhbnRpYXRvcnMgPQogICAgICAgIG5vZGUuYm9keS5tYXAodmlzaXRTcGxheWFibGVTdGF0ZW1lbnQpLnRvTGlzdCgpOwogICAgcmV0dXJuIChhcmd1bWVudHMpIHsKICAgICAgTGlzdDxTdGF0ZW1lbnQ+IHN0YXRlbWVudHMgPSA8U3RhdGVtZW50PltdOwogICAgICB2b2lkIGFkZChub2RlKSB7CiAgICAgICAgaWYgKG5vZGUgaXMgRW1wdHlTdGF0ZW1lbnQpIHJldHVybjsKICAgICAgICBpZiAobm9kZSBpcyBJdGVyYWJsZSkgewogICAgICAgICAgc3RhdGVtZW50cy5hZGRBbGwobm9kZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0YXRlbWVudHMuYWRkKG5vZGUudG9TdGF0ZW1lbnQoKSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3IgKEluc3RhbnRpYXRvciBpbnN0YW50aWF0b3IgaW4gaW5zdGFudGlhdG9ycykgewogICAgICAgIGFkZChpbnN0YW50aWF0b3IoYXJndW1lbnRzKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBQcm9ncmFtKHN0YXRlbWVudHMpOwogICAgfTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdEJsb2NrKEJsb2NrIG5vZGUpIHsKICAgIExpc3Q8SW5zdGFudGlhdG9yPiBpbnN0YW50aWF0b3JzID0KICAgICAgICBub2RlLnN0YXRlbWVudHMubWFwKHZpc2l0U3BsYXlhYmxlU3RhdGVtZW50KS50b0xpc3QoKTsKICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgIExpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzID0gPFN0YXRlbWVudD5bXTsKICAgICAgdm9pZCBhZGQobm9kZSkgewogICAgICAgIGlmIChub2RlIGlzIEVtcHR5U3RhdGVtZW50KSByZXR1cm47CiAgICAgICAgaWYgKG5vZGUgaXMgSXRlcmFibGUpIHsKICAgICAgICAgIHN0YXRlbWVudHMuYWRkQWxsKG5vZGUpOwogICAgICAgIH0gZWxzZSBpZiAobm9kZSBpcyBCbG9jaykgewogICAgICAgICAgc3RhdGVtZW50cy5hZGRBbGwobm9kZS5zdGF0ZW1lbnRzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdGVtZW50cy5hZGQobm9kZS50b1N0YXRlbWVudCgpKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvciAoSW5zdGFudGlhdG9yIGluc3RhbnRpYXRvciBpbiBpbnN0YW50aWF0b3JzKSB7CiAgICAgICAgYWRkKGluc3RhbnRpYXRvcihhcmd1bWVudHMpKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IEJsb2NrKHN0YXRlbWVudHMpOwogICAgfTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoRXhwcmVzc2lvblN0YXRlbWVudCBub2RlKSB7CiAgICBJbnN0YW50aWF0b3IgYnVpbGRFeHByZXNzaW9uID0gdmlzaXQobm9kZS5leHByZXNzaW9uKTsKICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgIHJldHVybiBidWlsZEV4cHJlc3Npb24oYXJndW1lbnRzKS50b1N0YXRlbWVudCgpOwogICAgfTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdEVtcHR5U3RhdGVtZW50KEVtcHR5U3RhdGVtZW50IG5vZGUpID0+CiAgICAgIChhcmd1bWVudHMpID0+IG5ldyBFbXB0eVN0YXRlbWVudCgpOwoKICBJbnN0YW50aWF0b3IgdmlzaXRJZihJZiBub2RlKSB7CiAgICBpZiAobm9kZS5jb25kaXRpb24gaXMgSW50ZXJwb2xhdGVkRXhwcmVzc2lvbikgewogICAgICByZXR1cm4gdmlzaXRJZkNvbmRpdGlvbmFsQ29tcGlsYXRpb24obm9kZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdmlzaXRJZk5vcm1hbChub2RlKTsKICAgIH0KICB9CgogIEluc3RhbnRpYXRvciB2aXNpdElmQ29uZGl0aW9uYWxDb21waWxhdGlvbihJZiBub2RlKSB7CiAgICAvLyBTcGVjaWFsIHZlcnNpb24gb2YgdmlzaXRJbnRlcnBvbGF0ZWRFeHByZXNzaW9uIHRoYXQgcGVybWl0cyBib29scy4KICAgIGNvbXBpbGVDb25kaXRpb24oSW50ZXJwb2xhdGVkRXhwcmVzc2lvbiBub2RlKSB7CiAgICAgIHZhciBuYW1lT3JQb3NpdGlvbiA9IG5vZGUubmFtZU9yUG9zaXRpb247CiAgICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzW25hbWVPclBvc2l0aW9uXTsKICAgICAgICBpZiAodmFsdWUgaXMgYm9vbCkgcmV0dXJuIHZhbHVlOwogICAgICAgIGlmICh2YWx1ZSBpcyBFeHByZXNzaW9uKSByZXR1cm4gdmFsdWU7CiAgICAgICAgaWYgKHZhbHVlIGlzIFN0cmluZykgcmV0dXJuIGNvbnZlcnRTdHJpbmdUb1ZhcmlhYmxlVXNlKHZhbHVlKTsKICAgICAgICBlcnJvcignSW50ZXJwb2xhdGVkIHZhbHVlICMkbmFtZU9yUG9zaXRpb24gJwogICAgICAgICAgICAnaXMgbm90IGFuIEV4cHJlc3Npb246ICR2YWx1ZScpOwogICAgICB9OwogICAgfQoKICAgIHZhciBtYWtlQ29uZGl0aW9uID0gY29tcGlsZUNvbmRpdGlvbihub2RlLmNvbmRpdGlvbik7CiAgICBJbnN0YW50aWF0b3IgbWFrZVRoZW4gPSB2aXNpdChub2RlLnRoZW4pOwogICAgSW5zdGFudGlhdG9yIG1ha2VPdGhlcndpc2UgPSB2aXNpdChub2RlLm90aGVyd2lzZSk7CiAgICByZXR1cm4gKGFyZ3VtZW50cykgewogICAgICB2YXIgY29uZGl0aW9uID0gbWFrZUNvbmRpdGlvbihhcmd1bWVudHMpOwogICAgICBpZiAoY29uZGl0aW9uIGlzIGJvb2wpIHsKICAgICAgICBpZiAoY29uZGl0aW9uID09IHRydWUpIHsKICAgICAgICAgIHJldHVybiBtYWtlVGhlbihhcmd1bWVudHMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbWFrZU90aGVyd2lzZShhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbmV3IElmKGNvbmRpdGlvbiwgbWFrZVRoZW4oYXJndW1lbnRzKSwgbWFrZU90aGVyd2lzZShhcmd1bWVudHMpKTsKICAgIH07CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRJZk5vcm1hbChJZiBub2RlKSB7CiAgICBJbnN0YW50aWF0b3IgbWFrZUNvbmRpdGlvbiA9IHZpc2l0KG5vZGUuY29uZGl0aW9uKTsKICAgIEluc3RhbnRpYXRvciBtYWtlVGhlbiA9IHZpc2l0KG5vZGUudGhlbik7CiAgICBJbnN0YW50aWF0b3IgbWFrZU90aGVyd2lzZSA9IHZpc2l0KG5vZGUub3RoZXJ3aXNlKTsKICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgIHJldHVybiBuZXcgSWYobWFrZUNvbmRpdGlvbihhcmd1bWVudHMpLCBtYWtlVGhlbihhcmd1bWVudHMpLAogICAgICAgICAgbWFrZU90aGVyd2lzZShhcmd1bWVudHMpKTsKICAgIH07CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRGb3IoRm9yIG5vZGUpIHsKICAgIEluc3RhbnRpYXRvciBtYWtlSW5pdCA9IHZpc2l0TnVsbGFibGUobm9kZS5pbml0KTsKICAgIEluc3RhbnRpYXRvciBtYWtlQ29uZGl0aW9uID0gdmlzaXROdWxsYWJsZShub2RlLmNvbmRpdGlvbik7CiAgICBJbnN0YW50aWF0b3IgbWFrZVVwZGF0ZSA9IHZpc2l0TnVsbGFibGUobm9kZS51cGRhdGUpOwogICAgSW5zdGFudGlhdG9yIG1ha2VCb2R5ID0gdmlzaXQobm9kZS5ib2R5KTsKICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgIHJldHVybiBuZXcgRm9yKG1ha2VJbml0KGFyZ3VtZW50cyksIG1ha2VDb25kaXRpb24oYXJndW1lbnRzKSwKICAgICAgICAgIG1ha2VVcGRhdGUoYXJndW1lbnRzKSwgbWFrZUJvZHkoYXJndW1lbnRzKSk7CiAgICB9OwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0Rm9ySW4oRm9ySW4gbm9kZSkgewogICAgSW5zdGFudGlhdG9yIG1ha2VMZWZ0SGFuZFNpZGUgPSB2aXNpdChub2RlLmxlZnRIYW5kU2lkZSk7CiAgICBJbnN0YW50aWF0b3IgbWFrZU9iamVjdCA9IHZpc2l0KG5vZGUub2JqZWN0KTsKICAgIEluc3RhbnRpYXRvciBtYWtlQm9keSA9IHZpc2l0KG5vZGUuYm9keSk7CiAgICByZXR1cm4gKGFyZ3VtZW50cykgewogICAgICByZXR1cm4gbmV3IEZvckluKG1ha2VMZWZ0SGFuZFNpZGUoYXJndW1lbnRzKSwgbWFrZU9iamVjdChhcmd1bWVudHMpLAogICAgICAgICAgbWFrZUJvZHkoYXJndW1lbnRzKSk7CiAgICB9OwogIH0KCiAgVE9ETyhTdHJpbmcgbmFtZSkgewogICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcignJHRoaXMuJG5hbWUnKTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdFdoaWxlKFdoaWxlIG5vZGUpIHsKICAgIEluc3RhbnRpYXRvciBtYWtlQ29uZGl0aW9uID0gdmlzaXQobm9kZS5jb25kaXRpb24pOwogICAgSW5zdGFudGlhdG9yIG1ha2VCb2R5ID0gdmlzaXQobm9kZS5ib2R5KTsKICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgIHJldHVybiBuZXcgV2hpbGUobWFrZUNvbmRpdGlvbihhcmd1bWVudHMpLCBtYWtlQm9keShhcmd1bWVudHMpKTsKICAgIH07CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXREbyhEbyBub2RlKSB7CiAgICBJbnN0YW50aWF0b3IgbWFrZUJvZHkgPSB2aXNpdChub2RlLmJvZHkpOwogICAgSW5zdGFudGlhdG9yIG1ha2VDb25kaXRpb24gPSB2aXNpdChub2RlLmNvbmRpdGlvbik7CiAgICByZXR1cm4gKGFyZ3VtZW50cykgewogICAgICByZXR1cm4gbmV3IERvKG1ha2VCb2R5KGFyZ3VtZW50cyksIG1ha2VDb25kaXRpb24oYXJndW1lbnRzKSk7CiAgICB9OwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0Q29udGludWUoQ29udGludWUgbm9kZSkgPT4KICAgICAgKGFyZ3VtZW50cykgPT4gbmV3IENvbnRpbnVlKG5vZGUudGFyZ2V0TGFiZWwpOwoKICBJbnN0YW50aWF0b3IgdmlzaXRCcmVhayhCcmVhayBub2RlKSA9PgogICAgICAoYXJndW1lbnRzKSA9PiBuZXcgQnJlYWsobm9kZS50YXJnZXRMYWJlbCk7CgogIEluc3RhbnRpYXRvciB2aXNpdFJldHVybihSZXR1cm4gbm9kZSkgewogICAgSW5zdGFudGlhdG9yIG1ha2VFeHByZXNzaW9uID0gdmlzaXROdWxsYWJsZShub2RlLnZhbHVlKTsKICAgIHJldHVybiAoYXJndW1lbnRzKSA9PiBuZXcgUmV0dXJuKG1ha2VFeHByZXNzaW9uKGFyZ3VtZW50cykpOwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0RGFydFlpZWxkKERhcnRZaWVsZCBub2RlKSB7CiAgICBJbnN0YW50aWF0b3IgbWFrZUV4cHJlc3Npb24gPSB2aXNpdChub2RlLmV4cHJlc3Npb24pOwogICAgcmV0dXJuIChhcmd1bWVudHMpID0+CiAgICAgICAgbmV3IERhcnRZaWVsZChtYWtlRXhwcmVzc2lvbihhcmd1bWVudHMpLCBub2RlLmhhc1N0YXIpOwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0VGhyb3coVGhyb3cgbm9kZSkgewogICAgSW5zdGFudGlhdG9yIG1ha2VFeHByZXNzaW9uID0gdmlzaXQobm9kZS5leHByZXNzaW9uKTsKICAgIHJldHVybiAoYXJndW1lbnRzKSA9PiBuZXcgVGhyb3cobWFrZUV4cHJlc3Npb24oYXJndW1lbnRzKSk7CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRUcnkoVHJ5IG5vZGUpIHsKICAgIEluc3RhbnRpYXRvciBtYWtlQm9keSA9IHZpc2l0KG5vZGUuYm9keSk7CiAgICBJbnN0YW50aWF0b3IgbWFrZUNhdGNoID0gdmlzaXROdWxsYWJsZShub2RlLmNhdGNoUGFydCk7CiAgICBJbnN0YW50aWF0b3IgbWFrZUZpbmFsbHkgPSB2aXNpdE51bGxhYmxlKG5vZGUuZmluYWxseVBhcnQpOwogICAgcmV0dXJuIChhcmd1bWVudHMpID0+IG5ldyBUcnkoCiAgICAgICAgbWFrZUJvZHkoYXJndW1lbnRzKSwgbWFrZUNhdGNoKGFyZ3VtZW50cyksIG1ha2VGaW5hbGx5KGFyZ3VtZW50cykpOwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0Q2F0Y2goQ2F0Y2ggbm9kZSkgewogICAgSW5zdGFudGlhdG9yIG1ha2VEZWNsYXJhdGlvbiA9IHZpc2l0KG5vZGUuZGVjbGFyYXRpb24pOwogICAgSW5zdGFudGlhdG9yIG1ha2VCb2R5ID0gdmlzaXQobm9kZS5ib2R5KTsKICAgIHJldHVybiAoYXJndW1lbnRzKSA9PgogICAgICAgIG5ldyBDYXRjaChtYWtlRGVjbGFyYXRpb24oYXJndW1lbnRzKSwgbWFrZUJvZHkoYXJndW1lbnRzKSk7CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRTd2l0Y2goU3dpdGNoIG5vZGUpIHsKICAgIEluc3RhbnRpYXRvciBtYWtlS2V5ID0gdmlzaXQobm9kZS5rZXkpOwogICAgSXRlcmFibGU8SW5zdGFudGlhdG9yPiBtYWtlQ2FzZXMgPSBub2RlLmNhc2VzLm1hcCh2aXNpdCk7CiAgICByZXR1cm4gKGFyZ3VtZW50cykgewogICAgICByZXR1cm4gbmV3IFN3aXRjaCgKICAgICAgICAgIG1ha2VLZXkoYXJndW1lbnRzKSwKICAgICAgICAgIG1ha2VDYXNlcwogICAgICAgICAgICAgIC5tYXA8U3dpdGNoQ2xhdXNlPigoSW5zdGFudGlhdG9yIG1ha2VDYXNlKSA9PiBtYWtlQ2FzZShhcmd1bWVudHMpKQogICAgICAgICAgICAgIC50b0xpc3QoKSk7CiAgICB9OwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0Q2FzZShDYXNlIG5vZGUpIHsKICAgIEluc3RhbnRpYXRvciBtYWtlRXhwcmVzc2lvbiA9IHZpc2l0KG5vZGUuZXhwcmVzc2lvbik7CiAgICBJbnN0YW50aWF0b3IgbWFrZUJvZHkgPSB2aXNpdChub2RlLmJvZHkpOwogICAgcmV0dXJuIChhcmd1bWVudHMpIHsKICAgICAgcmV0dXJuIG5ldyBDYXNlKG1ha2VFeHByZXNzaW9uKGFyZ3VtZW50cyksIG1ha2VCb2R5KGFyZ3VtZW50cykpOwogICAgfTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdERlZmF1bHQoRGVmYXVsdCBub2RlKSB7CiAgICBJbnN0YW50aWF0b3IgbWFrZUJvZHkgPSB2aXNpdChub2RlLmJvZHkpOwogICAgcmV0dXJuIChhcmd1bWVudHMpIHsKICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0KG1ha2VCb2R5KGFyZ3VtZW50cykpOwogICAgfTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24oRnVuY3Rpb25EZWNsYXJhdGlvbiBub2RlKSB7CiAgICBJbnN0YW50aWF0b3IgbWFrZU5hbWUgPSB2aXNpdChub2RlLm5hbWUpOwogICAgSW5zdGFudGlhdG9yIG1ha2VGdW5jdGlvbiA9IHZpc2l0KG5vZGUuZnVuY3Rpb24pOwogICAgcmV0dXJuIChhcmd1bWVudHMpID0+CiAgICAgICAgbmV3IEZ1bmN0aW9uRGVjbGFyYXRpb24obWFrZU5hbWUoYXJndW1lbnRzKSwgbWFrZUZ1bmN0aW9uKGFyZ3VtZW50cykpOwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0TGFiZWxlZFN0YXRlbWVudChMYWJlbGVkU3RhdGVtZW50IG5vZGUpIHsKICAgIEluc3RhbnRpYXRvciBtYWtlQm9keSA9IHZpc2l0KG5vZGUuYm9keSk7CiAgICByZXR1cm4gKGFyZ3VtZW50cykgPT4gbmV3IExhYmVsZWRTdGF0ZW1lbnQobm9kZS5sYWJlbCwgbWFrZUJvZHkoYXJndW1lbnRzKSk7CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRMaXRlcmFsU3RhdGVtZW50KExpdGVyYWxTdGF0ZW1lbnQgbm9kZSkgPT4KICAgICAgVE9ETygndmlzaXRMaXRlcmFsU3RhdGVtZW50Jyk7CiAgSW5zdGFudGlhdG9yIHZpc2l0TGl0ZXJhbEV4cHJlc3Npb24oTGl0ZXJhbEV4cHJlc3Npb24gbm9kZSkgPT4KICAgICAgVE9ETygndmlzaXRMaXRlcmFsRXhwcmVzc2lvbicpOwoKICBJbnN0YW50aWF0b3IgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCBub2RlKSB7CiAgICBMaXN0PEluc3RhbnRpYXRvcj4gZGVjbGFyYXRpb25NYWtlcnMgPQogICAgICAgIG5vZGUuZGVjbGFyYXRpb25zLm1hcCh2aXNpdCkudG9MaXN0KCk7CiAgICByZXR1cm4gKGFyZ3VtZW50cykgewogICAgICBMaXN0PFZhcmlhYmxlSW5pdGlhbGl6YXRpb24+IGRlY2xhcmF0aW9ucyA9IDxWYXJpYWJsZUluaXRpYWxpemF0aW9uPltdOwogICAgICBmb3IgKEluc3RhbnRpYXRvciBpbnN0YW50aWF0b3IgaW4gZGVjbGFyYXRpb25NYWtlcnMpIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaW5zdGFudGlhdG9yKGFyZ3VtZW50cyk7CiAgICAgICAgZGVjbGFyYXRpb25zLmFkZChyZXN1bHQpOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoZGVjbGFyYXRpb25zKTsKICAgIH07CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRBc3NpZ25tZW50KEFzc2lnbm1lbnQgbm9kZSkgewogICAgSW5zdGFudGlhdG9yIG1ha2VMZWZ0SGFuZFNpZGUgPSB2aXNpdChub2RlLmxlZnRIYW5kU2lkZSk7CiAgICBTdHJpbmcgb3AgPSBub2RlLm9wOwogICAgSW5zdGFudGlhdG9yIG1ha2VWYWx1ZSA9IHZpc2l0TnVsbGFibGUobm9kZS52YWx1ZSk7CiAgICByZXR1cm4gKGFyZ3VtZW50cykgewogICAgICByZXR1cm4gbmV3IEFzc2lnbm1lbnQuY29tcG91bmQoCiAgICAgICAgICBtYWtlTGVmdEhhbmRTaWRlKGFyZ3VtZW50cyksIG9wLCBtYWtlVmFsdWUoYXJndW1lbnRzKSk7CiAgICB9OwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0VmFyaWFibGVJbml0aWFsaXphdGlvbihWYXJpYWJsZUluaXRpYWxpemF0aW9uIG5vZGUpIHsKICAgIEluc3RhbnRpYXRvciBtYWtlRGVjbGFyYXRpb24gPSB2aXNpdChub2RlLmRlY2xhcmF0aW9uKTsKICAgIEluc3RhbnRpYXRvciBtYWtlVmFsdWUgPSB2aXNpdE51bGxhYmxlKG5vZGUudmFsdWUpOwogICAgcmV0dXJuIChhcmd1bWVudHMpIHsKICAgICAgcmV0dXJuIG5ldyBWYXJpYWJsZUluaXRpYWxpemF0aW9uKAogICAgICAgICAgbWFrZURlY2xhcmF0aW9uKGFyZ3VtZW50cyksIG1ha2VWYWx1ZShhcmd1bWVudHMpKTsKICAgIH07CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRDb25kaXRpb25hbChDb25kaXRpb25hbCBjb25kKSB7CiAgICBJbnN0YW50aWF0b3IgbWFrZUNvbmRpdGlvbiA9IHZpc2l0KGNvbmQuY29uZGl0aW9uKTsKICAgIEluc3RhbnRpYXRvciBtYWtlVGhlbiA9IHZpc2l0KGNvbmQudGhlbik7CiAgICBJbnN0YW50aWF0b3IgbWFrZU90aGVyd2lzZSA9IHZpc2l0KGNvbmQub3RoZXJ3aXNlKTsKICAgIHJldHVybiAoYXJndW1lbnRzKSA9PiBuZXcgQ29uZGl0aW9uYWwobWFrZUNvbmRpdGlvbihhcmd1bWVudHMpLAogICAgICAgIG1ha2VUaGVuKGFyZ3VtZW50cyksIG1ha2VPdGhlcndpc2UoYXJndW1lbnRzKSk7CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXROZXcoTmV3IG5vZGUpID0+CiAgICAgIGhhbmRsZUNhbGxPck5ldyhub2RlLCAodGFyZ2V0LCBhcmd1bWVudHMpID0+IG5ldyBOZXcodGFyZ2V0LCBhcmd1bWVudHMpKTsKCiAgSW5zdGFudGlhdG9yIHZpc2l0Q2FsbChDYWxsIG5vZGUpID0+CiAgICAgIGhhbmRsZUNhbGxPck5ldyhub2RlLCAodGFyZ2V0LCBhcmd1bWVudHMpID0+IG5ldyBDYWxsKHRhcmdldCwgYXJndW1lbnRzKSk7CgogIEluc3RhbnRpYXRvciBoYW5kbGVDYWxsT3JOZXcoQ2FsbCBub2RlLCBmaW5pc2godGFyZ2V0LCBhcmd1bWVudHMpKSB7CiAgICBJbnN0YW50aWF0b3IgbWFrZVRhcmdldCA9IHZpc2l0KG5vZGUudGFyZ2V0KTsKICAgIEl0ZXJhYmxlPEluc3RhbnRpYXRvcj4gYXJndW1lbnRNYWtlcnMgPQogICAgICAgIG5vZGUuYXJndW1lbnRzLm1hcCh2aXNpdFNwbGF5YWJsZUV4cHJlc3Npb24pLnRvTGlzdCgpOwoKICAgIC8vIFRPRE8oc3JhKTogQXZvaWQgY29weWluZyBjYWxsIGFyZ3VtZW50cyBpZiBubyBpbnRlcnBvbGF0aW9uIG9yIGZvcmNlZAogICAgLy8gY29weWluZy4KICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgIE5vZGUgdGFyZ2V0ID0gbWFrZVRhcmdldChhcmd1bWVudHMpOwogICAgICBMaXN0PEV4cHJlc3Npb24+IGNhbGxBcmd1bWVudHMgPSA8RXhwcmVzc2lvbj5bXTsKICAgICAgZm9yIChJbnN0YW50aWF0b3IgaW5zdGFudGlhdG9yIGluIGFyZ3VtZW50TWFrZXJzKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IGluc3RhbnRpYXRvcihhcmd1bWVudHMpOwogICAgICAgIGlmIChyZXN1bHQgaXMgSXRlcmFibGUpIHsKICAgICAgICAgIGNhbGxBcmd1bWVudHMuYWRkQWxsKHJlc3VsdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNhbGxBcmd1bWVudHMuYWRkKHJlc3VsdCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBmaW5pc2godGFyZ2V0LCBjYWxsQXJndW1lbnRzLnRvTGlzdChncm93YWJsZTogZmFsc2UpKTsKICAgIH07CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRCaW5hcnkoQmluYXJ5IG5vZGUpIHsKICAgIEluc3RhbnRpYXRvciBtYWtlTGVmdCA9IHZpc2l0KG5vZGUubGVmdCk7CiAgICBJbnN0YW50aWF0b3IgbWFrZVJpZ2h0ID0gdmlzaXQobm9kZS5yaWdodCk7CiAgICBTdHJpbmcgb3AgPSBub2RlLm9wOwogICAgcmV0dXJuIChhcmd1bWVudHMpID0+CiAgICAgICAgbmV3IEJpbmFyeShvcCwgbWFrZUxlZnQoYXJndW1lbnRzKSwgbWFrZVJpZ2h0KGFyZ3VtZW50cykpOwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0UHJlZml4KFByZWZpeCBub2RlKSB7CiAgICBJbnN0YW50aWF0b3IgbWFrZU9wZXJhbmQgPSB2aXNpdChub2RlLmFyZ3VtZW50KTsKICAgIFN0cmluZyBvcCA9IG5vZGUub3A7CiAgICByZXR1cm4gKGFyZ3VtZW50cykgPT4gbmV3IFByZWZpeChvcCwgbWFrZU9wZXJhbmQoYXJndW1lbnRzKSk7CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRQb3N0Zml4KFBvc3RmaXggbm9kZSkgewogICAgSW5zdGFudGlhdG9yIG1ha2VPcGVyYW5kID0gdmlzaXQobm9kZS5hcmd1bWVudCk7CiAgICBTdHJpbmcgb3AgPSBub2RlLm9wOwogICAgcmV0dXJuIChhcmd1bWVudHMpID0+IG5ldyBQb3N0Zml4KG9wLCBtYWtlT3BlcmFuZChhcmd1bWVudHMpKTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdFZhcmlhYmxlVXNlKFZhcmlhYmxlVXNlIG5vZGUpID0+CiAgICAgIChhcmd1bWVudHMpID0+IG5ldyBWYXJpYWJsZVVzZShub2RlLm5hbWUpOwoKICBJbnN0YW50aWF0b3IgdmlzaXRUaGlzKFRoaXMgbm9kZSkgPT4gKGFyZ3VtZW50cykgPT4gbmV3IFRoaXMoKTsKCiAgSW5zdGFudGlhdG9yIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpID0+CiAgICAgIChhcmd1bWVudHMpID0+IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUubmFtZSk7CgogIEluc3RhbnRpYXRvciB2aXNpdFBhcmFtZXRlcihQYXJhbWV0ZXIgbm9kZSkgPT4KICAgICAgKGFyZ3VtZW50cykgPT4gbmV3IFBhcmFtZXRlcihub2RlLm5hbWUpOwoKICBJbnN0YW50aWF0b3IgdmlzaXRBY2Nlc3MoUHJvcGVydHlBY2Nlc3Mgbm9kZSkgewogICAgSW5zdGFudGlhdG9yIG1ha2VSZWNlaXZlciA9IHZpc2l0KG5vZGUucmVjZWl2ZXIpOwogICAgSW5zdGFudGlhdG9yIG1ha2VTZWxlY3RvciA9IHZpc2l0KG5vZGUuc2VsZWN0b3IpOwogICAgcmV0dXJuIChhcmd1bWVudHMpID0+CiAgICAgICAgbmV3IFByb3BlcnR5QWNjZXNzKG1ha2VSZWNlaXZlcihhcmd1bWVudHMpLCBtYWtlU2VsZWN0b3IoYXJndW1lbnRzKSk7CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXROYW1lZEZ1bmN0aW9uKE5hbWVkRnVuY3Rpb24gbm9kZSkgewogICAgSW5zdGFudGlhdG9yIG1ha2VEZWNsYXJhdGlvbiA9IHZpc2l0KG5vZGUubmFtZSk7CiAgICBJbnN0YW50aWF0b3IgbWFrZUZ1bmN0aW9uID0gdmlzaXQobm9kZS5mdW5jdGlvbik7CiAgICByZXR1cm4gKGFyZ3VtZW50cykgPT4KICAgICAgICBuZXcgTmFtZWRGdW5jdGlvbihtYWtlRGVjbGFyYXRpb24oYXJndW1lbnRzKSwgbWFrZUZ1bmN0aW9uKGFyZ3VtZW50cykpOwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0RnVuKEZ1biBub2RlKSB7CiAgICBMaXN0PEluc3RhbnRpYXRvcj4gcGFyYW1NYWtlcnMgPSBub2RlLnBhcmFtcy5tYXAodmlzaXRTcGxheWFibGUpLnRvTGlzdCgpOwogICAgSW5zdGFudGlhdG9yIG1ha2VCb2R5ID0gdmlzaXQobm9kZS5ib2R5KTsKICAgIC8vIFRPRE8oc3JhKTogQXZvaWQgY29weWluZyBwYXJhbXMgaWYgbm8gaW50ZXJwb2xhdGlvbiBvciBmb3JjZWQgY29weWluZy4KICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgIExpc3Q8UGFyYW1ldGVyPiBwYXJhbXMgPSA8UGFyYW1ldGVyPltdOwogICAgICBmb3IgKEluc3RhbnRpYXRvciBpbnN0YW50aWF0b3IgaW4gcGFyYW1NYWtlcnMpIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaW5zdGFudGlhdG9yKGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKHJlc3VsdCBpcyBJdGVyYWJsZSkgewogICAgICAgICAgcGFyYW1zLmFkZEFsbChyZXN1bHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwYXJhbXMuYWRkKHJlc3VsdCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIFN0YXRlbWVudCBib2R5ID0gbWFrZUJvZHkoYXJndW1lbnRzKTsKICAgICAgcmV0dXJuIG5ldyBGdW4ocGFyYW1zLCBib2R5KTsKICAgIH07CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXREZWZlcnJlZEV4cHJlc3Npb24oRGVmZXJyZWRFeHByZXNzaW9uIG5vZGUpID0+IHNhbWUobm9kZSk7CgogIEluc3RhbnRpYXRvciB2aXNpdERlZmVycmVkTnVtYmVyKERlZmVycmVkTnVtYmVyIG5vZGUpID0+IHNhbWUobm9kZSk7CgogIEluc3RhbnRpYXRvciB2aXNpdERlZmVycmVkU3RyaW5nKERlZmVycmVkU3RyaW5nIG5vZGUpID0+IChhcmd1bWVudHMpID0+IG5vZGU7CgogIEluc3RhbnRpYXRvciB2aXNpdExpdGVyYWxCb29sKExpdGVyYWxCb29sIG5vZGUpID0+CiAgICAgIChhcmd1bWVudHMpID0+IG5ldyBMaXRlcmFsQm9vbChub2RlLnZhbHVlKTsKCiAgSW5zdGFudGlhdG9yIHZpc2l0TGl0ZXJhbFN0cmluZyhMaXRlcmFsU3RyaW5nIG5vZGUpID0+CiAgICAgIChhcmd1bWVudHMpID0+IG5ldyBMaXRlcmFsU3RyaW5nKG5vZGUudmFsdWUpOwoKICBJbnN0YW50aWF0b3IgdmlzaXRMaXRlcmFsTnVtYmVyKExpdGVyYWxOdW1iZXIgbm9kZSkgPT4KICAgICAgKGFyZ3VtZW50cykgPT4gbmV3IExpdGVyYWxOdW1iZXIobm9kZS52YWx1ZSk7CgogIEluc3RhbnRpYXRvciB2aXNpdExpdGVyYWxOdWxsKExpdGVyYWxOdWxsIG5vZGUpID0+CiAgICAgIChhcmd1bWVudHMpID0+IG5ldyBMaXRlcmFsTnVsbCgpOwoKICBJbnN0YW50aWF0b3IgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKFN0cmluZ0NvbmNhdGVuYXRpb24gbm9kZSkgewogICAgTGlzdDxJbnN0YW50aWF0b3I+IHBhcnRNYWtlcnMgPQogICAgICAgIG5vZGUucGFydHMubWFwKHZpc2l0KS50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgIExpc3Q8TGl0ZXJhbD4gcGFydHMgPSBwYXJ0TWFrZXJzCiAgICAgICAgICAubWFwKChJbnN0YW50aWF0b3IgaW5zdGFudGlhdG9yKSA9PiBpbnN0YW50aWF0b3IoYXJndW1lbnRzKSkKICAgICAgICAgIC50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICAgICAgcmV0dXJuIG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKHBhcnRzKTsKICAgIH07CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXROYW1lKE5hbWUgbm9kZSkgPT4gc2FtZShub2RlKTsKCiAgSW5zdGFudGlhdG9yIHZpc2l0UGFyZW50aGVzZXMoUGFyZW50aGVzZXMgbm9kZSkgewogICAgSW5zdGFudGlhdG9yIG1ha2VFbmNsb3NlZCA9IHZpc2l0KG5vZGUuZW5jbG9zZWQpOwogICAgcmV0dXJuIChhcmd1bWVudHMpIHsKICAgICAgRXhwcmVzc2lvbiBlbmNsb3NlZCA9IG1ha2VFbmNsb3NlZChhcmd1bWVudHMpOwogICAgICByZXR1cm4gUGFyZW50aGVzZXMoZW5jbG9zZWQpOwogICAgfTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdEFycmF5SW5pdGlhbGl6ZXIoQXJyYXlJbml0aWFsaXplciBub2RlKSB7CiAgICAvLyBUT0RPKHNyYSk6IEltcGxlbWVudCBzcGxpY2luZz8KICAgIExpc3Q8SW5zdGFudGlhdG9yPiBlbGVtZW50TWFrZXJzID0KICAgICAgICBub2RlLmVsZW1lbnRzLm1hcCh2aXNpdCkudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICByZXR1cm4gKGFyZ3VtZW50cykgewogICAgICBMaXN0PEV4cHJlc3Npb24+IGVsZW1lbnRzID0gZWxlbWVudE1ha2VycwogICAgICAgICAgLm1hcDxFeHByZXNzaW9uPigKICAgICAgICAgICAgICAoSW5zdGFudGlhdG9yIGluc3RhbnRpYXRvcikgPT4gaW5zdGFudGlhdG9yKGFyZ3VtZW50cykpCiAgICAgICAgICAudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICAgIHJldHVybiBuZXcgQXJyYXlJbml0aWFsaXplcihlbGVtZW50cyk7CiAgICB9OwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0QXJyYXlIb2xlKEFycmF5SG9sZSBub2RlKSB7CiAgICByZXR1cm4gKGFyZ3VtZW50cykgPT4gbmV3IEFycmF5SG9sZSgpOwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0T2JqZWN0SW5pdGlhbGl6ZXIoT2JqZWN0SW5pdGlhbGl6ZXIgbm9kZSkgewogICAgTGlzdDxJbnN0YW50aWF0b3I+IHByb3BlcnR5TWFrZXJzID0KICAgICAgICBub2RlLnByb3BlcnRpZXMubWFwKHZpc2l0U3BsYXlhYmxlKS50b0xpc3QoKTsKICAgIGJvb2wgaXNPbmVMaW5lciA9IG5vZGUuaXNPbmVMaW5lcjsKICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgIExpc3Q8UHJvcGVydHk+IHByb3BlcnRpZXMgPSA8UHJvcGVydHk+W107CiAgICAgIGZvciAoSW5zdGFudGlhdG9yIGluc3RhbnRpYXRvciBpbiBwcm9wZXJ0eU1ha2VycykgewogICAgICAgIHZhciByZXN1bHQgPSBpbnN0YW50aWF0b3IoYXJndW1lbnRzKTsKICAgICAgICBpZiAocmVzdWx0IGlzIEl0ZXJhYmxlKSB7CiAgICAgICAgICBwcm9wZXJ0aWVzLmFkZEFsbChyZXN1bHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcm9wZXJ0aWVzLmFkZChyZXN1bHQpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbmV3IE9iamVjdEluaXRpYWxpemVyKHByb3BlcnRpZXMsIGlzT25lTGluZXI6IGlzT25lTGluZXIpOwogICAgfTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdFByb3BlcnR5KFByb3BlcnR5IG5vZGUpIHsKICAgIEluc3RhbnRpYXRvciBtYWtlTmFtZSA9IHZpc2l0KG5vZGUubmFtZSk7CiAgICBJbnN0YW50aWF0b3IgbWFrZVZhbHVlID0gdmlzaXQobm9kZS52YWx1ZSk7CiAgICByZXR1cm4gKGFyZ3VtZW50cykgewogICAgICByZXR1cm4gbmV3IFByb3BlcnR5KG1ha2VOYW1lKGFyZ3VtZW50cyksIG1ha2VWYWx1ZShhcmd1bWVudHMpKTsKICAgIH07CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRSZWdFeHBMaXRlcmFsKFJlZ0V4cExpdGVyYWwgbm9kZSkgPT4KICAgICAgKGFyZ3VtZW50cykgPT4gbmV3IFJlZ0V4cExpdGVyYWwobm9kZS5wYXR0ZXJuKTsKCiAgSW5zdGFudGlhdG9yIHZpc2l0Q29tbWVudChDb21tZW50IG5vZGUpID0+IFRPRE8oJ3Zpc2l0Q29tbWVudCcpOwoKICBJbnN0YW50aWF0b3IgdmlzaXRBd2FpdChBd2FpdCBub2RlKSB7CiAgICBJbnN0YW50aWF0b3IgbWFrZUV4cHJlc3Npb24gPSB2aXNpdChub2RlLmV4cHJlc3Npb24pOwogICAgcmV0dXJuIChhcmd1bWVudHMpIHsKICAgICAgcmV0dXJuIG5ldyBBd2FpdChtYWtlRXhwcmVzc2lvbihhcmd1bWVudHMpKTsKICAgIH07CiAgfQp9CgovKioKICogSW50ZXJwb2xhdGVkTm9kZUFuYWx5c2lzIGRldGVybWluZXMgd2hpY2ggQVNUIHRyZWVzIGNvbnRhaW4KICogW0ludGVycG9sYXRlZE5vZGVdcywgYW5kIHRoZSBuYW1lcyBvZiB0aGUgbmFtZWQgaW50ZXJwb2xhdGVkIG5vZGVzLgogKi8KY2xhc3MgSW50ZXJwb2xhdGVkTm9kZUFuYWx5c2lzIGV4dGVuZHMgQmFzZVZpc2l0b3IgewogIGZpbmFsIFNldDxOb2RlPiBjb250YWluc0ludGVycG9sYXRlZE5vZGUgPSBuZXcgU2V0PE5vZGU+KCk7CiAgZmluYWwgU2V0PFN0cmluZz4gaG9sZU5hbWVzID0gbmV3IFNldDxTdHJpbmc+KCk7CiAgaW50IGNvdW50ID0gMDsKCiAgSW50ZXJwb2xhdGVkTm9kZUFuYWx5c2lzKCk7CgogIGJvb2wgY29udGFpbnNJbnRlcnBvbGF0ZWROb2RlcyhOb2RlIG5vZGUpID0+CiAgICAgIGNvbnRhaW5zSW50ZXJwb2xhdGVkTm9kZS5jb250YWlucyhub2RlKTsKCiAgdm9pZCB2aXNpdChOb2RlIG5vZGUpIHsKICAgIG5vZGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgdm9pZCB2aXNpdE5vZGUoTm9kZSBub2RlKSB7CiAgICBpbnQgYmVmb3JlID0gY291bnQ7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgICBpZiAoY291bnQgIT0gYmVmb3JlKSBjb250YWluc0ludGVycG9sYXRlZE5vZGUuYWRkKG5vZGUpOwogIH0KCiAgdmlzaXRJbnRlcnBvbGF0ZWROb2RlKEludGVycG9sYXRlZE5vZGUgbm9kZSkgewogICAgY29udGFpbnNJbnRlcnBvbGF0ZWROb2RlLmFkZChub2RlKTsKICAgIGlmIChub2RlLmlzTmFtZWQpIGhvbGVOYW1lcy5hZGQobm9kZS5uYW1lT3JQb3NpdGlvbik7CiAgICArK2NvdW50OwogIH0KfQqDEABOTjwBEAEYS0oBFQE1KAQBPxhJLBUEATQnBAE+GEorFQQCAQRQT0MSBBEXGxgSAR0BJAEpGi4BIjpGEAQBKhcdHB8kIScEASkXHhweJCEnBAEgLTEcKgQBFC01Kzg2LwQBPAZPKiQdOVAwIwgmBh4vUDIbUEQGShhORQYkBAIBBElFFAQ9AQRRUUYEShgBRgEGNwYwASQaJxMEASETBAE+KwEiQSAGFwQBKicYBAErThgEASZCBAFKAT8qIwQBRyorBAFKLhktLUVRBwQBTC4ZLS5NUQcEATUqMBsvKC9HRT8KAT8kCQYYBAFELhktKk0HBAFILhktASQsOFEsCAE8IQcEAUY5UDsuGS0tQU4HBAFILhktNU8HBAE0KTAbLyYuPUU8CgE+IwkGGAQBLCc5GTIXLCAjES4KCAE5JggmBwQBKCc/GTIXLCAjJC4RLgoIATkmCCQHBAFEOxk3BwQBOysBIjQyDSIGBAE4SjQwGy8pL0c1LQkGATouOBkwHyEmESsKCE8HBAEoOC44GUMlBwQBJDZAOi4ZRDcHBAEoPjIuGUsgBwQBFjEEASg4LhlHBwQBIi44GUQHBAEvNQEpMgEqPUEEATA6GkAEASg6QAQBJC48QCNMBAEoPC4aRAQBKiw+GRkeFFEaBwQBJjouGUcHBAEsLhkvBwQBRC42Gk8EAT4uUQQBPyVBJgFMKy8ZTj0uIgg4BwQBMj4ZOBkmQgcEAUo8OBkpPQcEATQ4LjhEOAQBJVABJ1EBRzIsPwFNEBkrNzouIigRJQoIRAcEASouMBkaQwQBKjUZQgQBLDUZQwQBNTEBQgFFOQExLwEyNjYaTgQBODU2GlAEASRPLk4ZLjcuIiERHgoILCQHBAFPAUcBUAE1MgE5NAE5NAE1KAFEJDcZJ0ckLQcEATMBNDYZNSQHBAE+Jic6GTAcRiQtBwQBMCsEAUAoNicZMDouIiURIgoISAcEAS4uMBlGBwQBOTYBQwEoOhkzBwQCAQQ/RwQ1PjMRAR4BLy8BGhcEAR4YHj0EATEoOg0EAgEgcGFja2FnZTpqc19hc3Qvc3JjL3RlbXBsYXRlLmRhcnQoc2Rrcm9vdDovcGtnL2pzX2FzdC9saWIvc3JjL2J1aWxkZXIuZGFydMAAybEvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gVXRpbGl0aWVzIGZvciBidWlsZGluZyBKUyBBU1RzIGF0IHJ1bnRpbWUuICBDb250YWlucyBhIGJ1aWxkZXIgY2xhc3MKLy8gYW5kIGEgcGFyc2VyIHRoYXQgcGFyc2VzIHBhcnQgb2YgdGhlIGxhbmd1YWdlLgoKcGFydCBvZiBqc19hc3Q7CgovKioKICogR2xvYmFsIHRlbXBsYXRlIG1hbmFnZXIuICBXZSBzaG91bGQgYWltIHRvIGhhdmUgYSBmaXhlZCBudW1iZXIgb2YKICogdGVtcGxhdGVzLiBUaGlzIGltcGxpZXMgdGhhdCB3ZSBkbyBub3QgdXNlIGpzKCd4eHgnKSB0byBwYXJzZSB0ZXh0IHRoYXQgaXMKICogY29uc3RydWN0ZWQgZnJvbSB2YWx1ZXMgdGhhdCBkZXBlbmQgb24gbmFtZXMgaW4gdGhlIERhcnQgcHJvZ3JhbS4KICoKICogVE9ETyhzcmEpOiBGaW5kIHRoZSByZW1haW5pbmcgcGxhY2VzIHdoZXJlIGpzKCd4eHgnKSB1c2VkIHRvIHBhcnNlIGFuCiAqIHVuYm91bmRlZCBudW1iZXIgb2YgZXhwcmVzc2lvbiwgb3IgaW5zdGl0dXRlIGEgY2FjaGUgcG9saWN5LgogKi8KVGVtcGxhdGVNYW5hZ2VyIHRlbXBsYXRlTWFuYWdlciA9IG5ldyBUZW1wbGF0ZU1hbmFnZXIoKTsKCi8qKgoKW2pzXSBpcyBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBKc0J1aWxkZXIuICBKc0J1aWxkZXIgaXMgYSBzZXQgb2YgY29udmVuaWVuY2VzCmZvciBjb25zdHJ1Y3RpbmcgSmF2YVNjcmlwdCBBU1RzLgoKW3N0cmluZ10gYW5kIFtudW1iZXJdIGFyZSB1c2VkIHRvIGNyZWF0ZSBsZWFmIEFTVCBub2RlczoKCiAgICB2YXIgcyA9IGpzLnN0cmluZygnaGVsbG8nKTsgICAgLy8gIHMgPSBuZXcgTGl0ZXJhbFN0cmluZygnImhlbGxvIicpCiAgICB2YXIgbiA9IGpzLm51bWJlcigxMjMpOyAgICAgICAgLy8gIG4gPSBuZXcgTGl0ZXJhbE51bWJlcigxMjMpCgpJbiB0aGUgbGluZSBhYm92ZSBgYSAtLT4gYmAgbWVhbnMgRGFydCBleHByZXNzaW9uIGBhYCBldmFsdWF0ZXMgdG8gYSBKYXZhU2NyaXB0CkFTVCB0aGF0IHdvdWxkIHByZXR0eS1wcmludCBhcyBgYmAuCgpUaGUgW2NhbGxdIG1ldGhvZCBjb25zdHJ1Y3RzIGFuIEV4cHJlc3Npb24gQVNULgoKTm8gYXJndW1lbnQKCiAgICBqcygnd2luZG93LmFsZXJ0KCJoZWxsbyIpJykgIC0tPiAgd2luZG93LmFsZXJ0KCJoZWxsbyIpCgpUaGUgaW5wdXQgdGV4dCBjYW4gY29udGFpbiBwbGFjZWhvbGRlcnMgYCNgIHRoYXQgYXJlIHJlcGxhY2VkIHdpdGggcHJvdmlkZWQKYXJndW1lbnRzLiAgQSBzaW5nbGUgYXJndW1lbnQgY2FuIGJlIHBhc3NlZCBkaXJlY3RseToKCiAgICBqcygnd2luZG93LmFsZXJ0KCMpJywgcykgICAtLT4gIHdpbmRvdy5hbGVydCgiaGVsbG8iKQoKTXVsdGlwbGUgYXJndW1lbnRzIGFyZSBwYXNzZWQgYXMgYSBsaXN0OgoKICAgIGpzKCcjICsgIycsIFtzLCBzXSkgIC0tPiAgImhlbGxvIiArICJoZWxsbyIKClRoZSBbc3RhdGVtZW50XSBtZXRob2QgY29uc3RydWN0cyBhIFN0YXRlbWVudCBBU1QsIGJ1dCBpcyBvdGhlcndpc2UgbGlrZSB0aGUKW2NhbGxdIG1ldGhvZC4gIFRoaXMgY29uc3RydWN0cyBhIFJldHVybiBBU1Q6CgogICAgdmFyIHJldCA9IGpzLnN0YXRlbWVudCgncmV0dXJuICM7Jywgbik7ICAtLT4gIHJldHVybiAxMjM7CgpBIHBsYWNlaG9sZGVyIGluIGEgU3RhdGVtZW50IGNvbnRleHQgbXVzdCBiZSBmb2xsb3dlZCBieSBhIHNlbWljb2xvbiAnOycuICBZb3UKY2FuIHRoaW5rIG9mIGEgc3RhdGVtZW50IHBsYWNlaG9sZGVyIGFzIGJlaW5nIGAjO2AgdG8gZXhwbGFpbiB3aHkgdGhlIG91dHB1dApzdGlsbCBoYXMgb25lIHNlbWljb2xvbjoKCiAgICBqcy5zdGF0ZW1lbnQoJ2lmIChoYXBweSkgIzsnLCByZXQpCiAgICAtLT4KICAgIGlmIChoYXBweSkKICAgICAgcmV0dXJuIDEyMzsKCklmIHRoZSBwbGFjZWhvbGRlciBpcyBub3QgZm9sbG93ZWQgYnkgYSBzZW1pY29sb24sIGl0IGlzIHBhcnQgb2YgYW4gZXhwcmVzc2lvbi4KSGVyZSB0aGUgcGxhY2Vob2xkZXIgaXMgaW4gdGhlIHBvc2l0aW9uIG9mIHRoZSBmdW5jdGlvbiBpbiBhIGZ1bmN0aW9uIGNhbGw6CgogICAgdmFyIHZGb28gPSBuZXcgVmFyaWFibGVVc2UoJ2ZvbycpOwogICAganMuc3RhdGVtZW50KCdpZiAoaGFwcHkpICMoIkhhcHB5ISIpJywgdkZvbykKICAgIC0tPgogICAgaWYgKGhhcHB5KQogICAgICBmb28oIkhhcHB5ISIpOwoKR2VuZXJhbGx5LCBhIHBsYWNlaG9sZGVyIGluIGFuIGV4cHJlc3Npb24gcG9zaXRpb24gcmVxdWlyZXMgYW4gRXhwcmVzc2lvbiBBU1QgYXMKYW4gYXJndW1lbnQgYW5kIGEgcGxhY2Vob2xkZXIgaW4gYSBzdGF0ZW1lbnQgcG9zaXRpb24gcmVxdWlyZXMgYSBTdGF0ZW1lbnQgQVNULgpBbiBleHByZXNzaW9uIHdpbGwgYmUgY29udmVydGVkIHRvIGEgU3RhdGVtZW50IGlmIG5lZWRlZCBieSBjcmVhdGluZyBhbgpFeHByZXNzaW9uU3RhdGVtZW50LiAgQSBTdHJpbmcgYXJndW1lbnQgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBhIFZhcmlhYmxlVXNlIGFuZApyZXF1aXJlcyB0aGF0IHRoZSBzdHJpbmcgaXMgYSBKYXZhU2NyaXB0IGlkZW50aWZpZXIuCgogICAganMoJyMgKyAxJywgdkZvbykgICAgICAgLS0+ICBmb28gKyAxCiAgICBqcygnIyArIDEnLCAnZm9vJykgICAgICAtLT4gIGZvbyArIDEKICAgIGpzKCcjICsgMScsICdmb28uYmFyJykgIC0tPiAgYXNzZXJ0aW9uIGZhaWx1cmUKClNvbWUgcGxhY2Vob2xkZXIgcG9zaXRpb25zIGFyZSBfc3BsaWNpbmcgY29udGV4dHNfLiAgQSBmdW5jdGlvbiBhcmd1bWVudCBsaXN0IGlzCmEgc3BsaWNpbmcgZXhwcmVzc2lvbiBjb250ZXh0LiAgQSBwbGFjZWhvbGRlciBpbiBhIHNwbGljaW5nIGV4cHJlc3Npb24gY29udGV4dApjYW4gdGFrZSBhIHNpbmdsZSBFeHByZXNzaW9uIChvciBTdHJpbmcsIGNvbnZlcnRlZCB0byBWYXJpYWJsZVVzZSkgb3IgYW4KSXRlcmFibGUgb2YgRXhwcmVzc2lvbnMgKGFuZC9vciBTdHJpbmdzKS4KCiAgICAvLyBub24tc3BsaWNpbmcgYXJndW1lbnQ6CiAgICBqcygnIygjKScsIFsnc2F5Jywgc10pICAgICAgICAtLT4gIHNheSgiaGVsbG8iKQogICAgLy8gc3BsaWNpbmcgYXJndW1lbnRzOgogICAganMoJyMoIyknLCBbJ3NheScsIFtdXSkgICAgICAgLS0+ICBzYXkoKQogICAganMoJyMoIyknLCBbJ3NheScsIFtzXV0pICAgICAgLS0+ICBzYXkoImhlbGxvIikKICAgIGpzKCcjKCMpJywgWydzYXknLCBbcywgbl1dKSAgIC0tPiAgc2F5KCJoZWxsbyIsIDEyMykKCkEgc3BsaWNpbmcgY29udGV4dCBjYW4gYmUgdXNlZCB0byBhcHBlbmQgJ2xpc3RzJyBhbmQgYWRkIGV4dHJhIGVsZW1lbnRzOgoKICAgIGpzKCdmb28oIywgIywgMSknLCBbIFsnYScsIG5dLCBzXSkgICAgICAgLS0+ICBmb28oYSwgMTIzLCAiaGVsbG8iLCAxKQogICAganMoJ2ZvbygjLCAjLCAxKScsIFsgWydhJywgbl0sIFtzLCBuXV0pICAtLT4gIGZvbyhhLCAxMjMsICJoZWxsbyIsIDEyMywgMSkKICAgIGpzKCdmb28oIywgIywgMSknLCBbIFtdLCBbcywgbl1dKSAgICAgICAgLS0+ICBmb28oImhlbGxvIiwgMTIzLCAxKQogICAganMoJ2ZvbygjLCAjLCAxKScsIFsgW10sIFtdIF0pICAgICAgICAgICAtLT4gIGZvbygxKQoKVGhlIGdlbmVyYXRpb24gb2YgYSBjb21waWxlLXRpbWUgb3B0aW9uYWwgYXJndW1lbnQgZXhwcmVzc2lvbiBjYW4gYmUgY2hvc2VuIGJ5CnByb3ZpZGluZyBhbiBlbXB0eSBvciBzaW5nbGV0b24gbGlzdC4KCkluIGFkZGl0aW9uIHRvIEV4cHJlc3Npb25zIGFuZCBTdGF0ZW1lbnRzLCB0aGVyZSBhcmUgUGFyYW1ldGVycywgd2hpY2ggb2NjdXIKb25seSBpbiB0aGUgcGFyYW1ldGVyIGxpc3Qgb2YgYSBmdW5jdGlvbiBleHByZXNzaW9uIG9yIGRlY2xhcmF0aW9uLgpQbGFjZWhvbGRlcnMgaW4gcGFyYW1ldGVyIHBvc2l0aW9ucyBiZWhhdmUgbGlrZSBwbGFjZWhvbGRlcnMgaW4gRXhwcmVzc2lvbgpwb3NpdGlvbnMsIGV4Y2VwdCBvbmx5IFBhcmFtZXRlciBBU1Qgbm9kZXMgYXJlIHBlcm1pdHRlZC4gIFN0cmluZyBhcmd1bWVudHMgZm9yCnBhcmFtZXRlciBwbGFjZWhvbGRlcnMgYXJlIGNvbnZlcnRlZCB0byBQYXJhbWV0ZXIgQVNUIG5vZGVzLgoKICAgIHZhciBwRm9vID0gbmV3IFBhcmFtZXRlcignZm9vJykKICAgIGpzKCdmdW5jdGlvbigjKSB7IHJldHVybiAjOyB9JywgW3BGb28sIHZGb29dKQogICAgLS0+CiAgICBmdW5jdGlvbihmb28pIHsgcmV0dXJuIGZvbzsgfQoKRXhwcmVzc2lvbnMgYW5kIFBhcmFtZXRlcnMgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggZWFjaCBvdGhlcidzIGNvbnRleHQ6CgogICAganMoJ2Z1bmN0aW9uKCMpIHsgcmV0dXJuICM7IH0nLCBbdkZvbywgdkZvb10pIC0tPiBlcnJvcgogICAganMoJ2Z1bmN0aW9uKCMpIHsgcmV0dXJuICM7IH0nLCBbcEZvbywgcEZvb10pIC0tPiBlcnJvcgoKVGhlIHBhcmFtZXRlciBjb250ZXh0IGlzIGEgc3BsaWNpbmcgY29udGV4dC4gIFdoZW4gY29tYmluZWQgd2l0aCB0aGUKY29udGV4dC1zZW5zaXRpdmUgY29udmVyc2lvbiBvZiBTdHJpbmdzLCB0aGlzIHNpbXBsaWZpZXMgdGhlIGNvbnN0cnVjdGlvbiBvZgp0cmFtcG9saW5lLWxpa2UgZnVuY3Rpb25zOgoKICAgIHZhciBhcmdzID0gWydhJywgJ2InXTsKICAgIGpzKCdmdW5jdGlvbigjKSB7IHJldHVybiBmKHRoaXMsICMpOyB9JywgW2FyZ3MsIGFyZ3NdKQogICAgLS0+CiAgICBmdW5jdGlvbihhLCBiKSB7IHJldHVybiBmKHRoaXMsIGEsIGIpOyB9CgpBIHN0YXRlbWVudCBwbGFjZWhvbGRlciBpbiBhIEJsb2NrIGlzIGFsc28gaW4gYSBzcGxpY2luZyBjb250ZXh0LiAgSW4gYWRkaXRpb24KdG8gc3BsaWNpbmcgSXRlcmFibGVzLCBzdGF0ZW1lbnQgcGxhY2Vob2xkZXJzIGluIGEgQmxvY2sgd2lsbCBhbHNvIHNwbGljZSBhCkJsb2NrIG9yIGFuIEVtcHR5U3RhdGVtZW50LiAgVGhpcyBmbGF0dGVucyBuZXN0ZWQgYmxvY2tzIGFuZCBhbGxvd3MgYmxvY2tzIHRvIGJlCmFwcGVuZGVkLgoKICAgIHZhciBiMSA9IGpzLnN0YXRlbWVudCgneyAxOyAyOyB9Jyk7CiAgICB2YXIgc0VtcHR5ID0gbmV3IEVtcHR5c3RhdGVtZW50KCk7CiAgICBqcy5zdGF0ZW1lbnQoJ3sgIzsgIzsgIzsgIzsgfScsIFtzRW1wdHksIGIxLCBiMSwgc0VtcHR5XSkKICAgIC0tPgogICAgeyAxOyAyOyAxOyAyOyB9CgpBIHBsYWNlaG9sZGVyIGluIHRoZSBjb250ZXh0IG9mIGFuIGlmLXN0YXRlbWVudCBjb25kaXRpb24gYWxzbyBhY2NlcHRzIGEgRGFydApib29sIGFyZ3VtZW50LCB3aGljaCBzZWxlY3RzIHRoZSB0aGVuLXBhcnQgb3IgZWxzZS1wYXJ0IG9mIHRoZSBpZi1zdGF0ZW1lbnQ6CgogICAganMuc3RhdGVtZW50KCdpZiAoIykgcmV0dXJuOycsIHZGb28pICAgLS0+ICBpZiAoZm9vKSByZXR1cm47CiAgICBqcy5zdGF0ZW1lbnQoJ2lmICgjKSByZXR1cm47JywgdHJ1ZSkgICAtLT4gIHJldHVybjsKICAgIGpzLnN0YXRlbWVudCgnaWYgKCMpIHJldHVybjsnLCBmYWxzZSkgIC0tPiAgOyAgIC8vIGVtcHR5IHN0YXRlbWVudAogICAgdmFyIGVUcnVlID0gbmV3IExpdGVyYWxCb29sKHRydWUpOwogICAganMuc3RhdGVtZW50KCdpZiAoIykgcmV0dXJuOycsIGVUcnVlKSAgLS0+ICBpZiAodHJ1ZSkgcmV0dXJuOwoKQ29tYmluZWQgd2l0aCBibG9jayBzcGxpY2luZywgaWYtc3RhdGVtZW50IGNvbmRpdGlvbiBjb250ZXh0IHBsYWNlaG9sZGVycyBhbGxvd3MKdGhlIGNyZWF0aW9uIG9mIHRlbXBsYXRlcyB0aGF0IHNlbGVjdCBjb2RlIGRlcGVuZGluZyBvbiB2YXJpYWJsZXMuCgogICAganMuc3RhdGVtZW50KCd7IDE7IGlmICgjKSAyOyBlbHNlIHsgMzsgNDsgfSA1O30nLCB0cnVlKQogICAgLS0+IHsgMTsgMjsgNTsgfQoKICAgIGpzLnN0YXRlbWVudCgneyAxOyBpZiAoIykgMjsgZWxzZSB7IDM7IDQ7IH0gNTt9JywgZmFsc2UpCiAgICAtLT4geyAxOyAzOyA0OyA1OyB9CgpBIHBsYWNlaG9sZGVyIGZvbGxvd2luZyBhIHBlcmlvZCBpbiBhIHByb3BlcnR5IGFjY2VzcyBpcyBpbiBhIHByb3BlcnR5IGFjY2Vzcwpjb250ZXh0LiAgVGhpcyBpcyBqdXN0IGxpa2UgYW4gZXhwcmVzc2lvbiBjb250ZXh0LCBleGNlcHQgU3RyaW5nIGFyZ3VtZW50cyBhcmUKY29udmVydGVkIHRvIEphdmFTY3JpcHQgcHJvcGVydHkgYWNjZXNzZXMuICBJbiBKYXZhU2NyaXB0LCBgYS5iYCBpcyBzaG9ydC1oYW5kCmZvciBgYVsiYiJdYDoKCiAgICBqcygnYVsjXScsIHZGb28pICAtLT4gIGFbZm9vXQogICAganMoJ2FbI10nLCBzKSAgICAgLS0+ICBhLmhlbGxvICAgIChpLmUuIGFbImhlbGxvIl0pLgogICAganMoJ2FbI10nLCAneCcpICAgLS0+ICBhW3hdCgogICAganMoJ2EuIycsIHZGb28pICAgLS0+ICBhW2Zvb10KICAgIGpzKCdhLiMnLCBzKSAgICAgIC0tPiAgYS5oZWxsbyAgICAoaS5lLiBhWyJoZWxsbyJdKQogICAganMoJ2EuIycsICd4JykgICAgLS0+ICBhLnggICAgICAgIChpLmUuIGFbIngiXSkKCihRdWVzdGlvbiAtIHNob3VsZCBgLiNgIGJlIHJlc3RyaWN0ZWQgdG8gcGVybWl0IG9ubHkgU3RyaW5nIGFyZ3VtZW50cz8gVGhlCnRlbXBsYXRlIHNob3VsZCBwcm9iYWJseSBiZSB3cml0dGVuIHdpdGggYFtdYCBpZiBub24tc3RyaW5ncyBhcmUgYWNjZXB0ZWQuKQoKCk9iamVjdCBpbml0aWFsaXplcnMgYWxsb3cgcGxhY2Vob2xkZXJzIGluIHRoZSBrZXkgcHJvcGVydHkgbmFtZSBwb3NpdGlvbjoKCiAgICBqcygneyM6MSwgIzoyfScsICBbcywgJ2J5ZSddKSAgICAtLT4gIHtoZWxsbzogMSwgYnllOiAyfQoKCldoYXQgaXMgbm90IGltcGxlbWVudGVkOgoKIC0gIEFycmF5IGluaXRpYWxpemVycyBhbmQgb2JqZWN0IGluaXRpYWxpemVycyBjb3VsZCBzdXBwb3J0IHNwbGljaW5nLiAgSW4gdGhlCiAgICBhcnJheSBjYXNlLCB3ZSB3b3VsZCBuZWVkIHNvbWUgd2F5IHRvIGtub3cgaWYgYW4gQXJyYXlJbml0aWFsaXplciBhcmd1bWVudAogICAgc2hvdWxkIGJlIHNwbGljZSBvciBpcyBpbnRlbmRlZCBhcyBhIHNpbmdsZSB2YWx1ZS4KCiovCmNvbnN0IEpzQnVpbGRlciBqcyA9IGNvbnN0IEpzQnVpbGRlcigpOwoKY2xhc3MgSnNCdWlsZGVyIHsKICBjb25zdCBKc0J1aWxkZXIoKTsKCiAgLyoqCiAgICogUGFyc2VzIGEgYml0IG9mIEphdmFTY3JpcHQsIGFuZCByZXR1cm5zIGFuIGV4cHJlc3Npb24uCiAgICoKICAgKiBTZWUgdGhlIE1pbmlKc1BhcnNlciBjbGFzcy4KICAgKgogICAqIFthcmd1bWVudHNdIGNhbiBiZSBhIHNpbmdsZSBbTm9kZV0gKGUuZy4gYW4gW0V4cHJlc3Npb25dIG9yIFtTdGF0ZW1lbnRdKSBvcgogICAqIGEgbGlzdCBvZiBbTm9kZV1zLCB3aGljaCB3aWxsIGJlIGludGVycG9sYXRlZCBpbnRvIHRoZSBzb3VyY2UgYXQgdGhlICcjJwogICAqIHNpZ25zLgogICAqLwogIEV4cHJlc3Npb24gY2FsbChTdHJpbmcgc291cmNlLCBbdmFyIGFyZ3VtZW50c10pIHsKICAgIFRlbXBsYXRlIHRlbXBsYXRlID0gX2ZpbmRFeHByZXNzaW9uVGVtcGxhdGUoc291cmNlKTsKICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCkgcmV0dXJuIHRlbXBsYXRlLmluc3RhbnRpYXRlKFtdKTsKICAgIC8vIFdlIGFsbG93IGEgc2luZ2xlIGFyZ3VtZW50IHRvIGJlIGdpdmVuIGRpcmVjdGx5LgogICAgaWYgKGFyZ3VtZW50cyBpcyEgTGlzdCAmJiBhcmd1bWVudHMgaXMhIE1hcCkgYXJndW1lbnRzID0gW2FyZ3VtZW50c107CiAgICByZXR1cm4gdGVtcGxhdGUuaW5zdGFudGlhdGUoYXJndW1lbnRzKTsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhIEphdmFTY3JpcHQgU3RhdGVtZW50LCBvdGhlcndpc2UganVzdCBsaWtlIFtjYWxsXS4KICAgKi8KICBTdGF0ZW1lbnQgc3RhdGVtZW50KFN0cmluZyBzb3VyY2UsIFt2YXIgYXJndW1lbnRzXSkgewogICAgVGVtcGxhdGUgdGVtcGxhdGUgPSBfZmluZFN0YXRlbWVudFRlbXBsYXRlKHNvdXJjZSk7CiAgICBpZiAoYXJndW1lbnRzID09IG51bGwpIHJldHVybiB0ZW1wbGF0ZS5pbnN0YW50aWF0ZShbXSk7CiAgICAvLyBXZSBhbGxvdyBhIHNpbmdsZSBhcmd1bWVudCB0byBiZSBnaXZlbiBkaXJlY3RseS4KICAgIGlmIChhcmd1bWVudHMgaXMhIExpc3QgJiYgYXJndW1lbnRzIGlzISBNYXApIGFyZ3VtZW50cyA9IFthcmd1bWVudHNdOwogICAgcmV0dXJuIHRlbXBsYXRlLmluc3RhbnRpYXRlKGFyZ3VtZW50cyk7CiAgfQoKICAvKioKICAgKiBQYXJzZXMgSmF2YVNjcmlwdCB3cml0dGVuIGluIHRoZSBgSlNgIGZvcmVpZ24gaW5zdHJ1Y3Rpb24uCiAgICoKICAgKiBUaGUgW3NvdXJjZV0gbXVzdCBiZSBhIEphdmFTY3JpcHQgZXhwcmVzc2lvbiBvciBhIEphdmFTY3JpcHQgdGhyb3cKICAgKiBzdGF0ZW1lbnQuCiAgICovCiAgVGVtcGxhdGUgcGFyc2VGb3JlaWduSlMoU3RyaW5nIHNvdXJjZSkgewogICAgLy8gVE9ETyhzcmEpOiBQYXJzZSB3aXRoIGV4dHJhIHZhbGlkYXRpb24gdG8gZm9yYmlkIGAjYCBpbnRlcnBvbGF0aW9uIGluCiAgICAvLyBmdW5jdGlvbnMsIGFzIHRoaXMgbGVhZHMgdG8gdW5hbnRpY2lwYXRlZCBjYXB0dXJlIG9mIHRlbXBvcmFyaWVzIHRoYXQgYXJlCiAgICAvLyByZXVzZWQgYWZ0ZXIgY2FwdHVyZS4KICAgIGlmIChzb3VyY2Uuc3RhcnRzV2l0aCgidGhyb3cgIikpIHsKICAgICAgcmV0dXJuIF9maW5kU3RhdGVtZW50VGVtcGxhdGUoc291cmNlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfZmluZEV4cHJlc3Npb25UZW1wbGF0ZShzb3VyY2UpOwogICAgfQogIH0KCiAgVGVtcGxhdGUgX2ZpbmRFeHByZXNzaW9uVGVtcGxhdGUoU3RyaW5nIHNvdXJjZSkgewogICAgVGVtcGxhdGUgdGVtcGxhdGUgPSB0ZW1wbGF0ZU1hbmFnZXIubG9va3VwRXhwcmVzc2lvblRlbXBsYXRlKHNvdXJjZSk7CiAgICBpZiAodGVtcGxhdGUgPT0gbnVsbCkgewogICAgICBNaW5pSnNQYXJzZXIgcGFyc2VyID0gbmV3IE1pbmlKc1BhcnNlcihzb3VyY2UpOwogICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBwYXJzZXIuZXhwcmVzc2lvbigpOwogICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlTWFuYWdlci5kZWZpbmVFeHByZXNzaW9uVGVtcGxhdGUoc291cmNlLCBleHByZXNzaW9uKTsKICAgIH0KICAgIHJldHVybiB0ZW1wbGF0ZTsKICB9CgogIFRlbXBsYXRlIF9maW5kU3RhdGVtZW50VGVtcGxhdGUoU3RyaW5nIHNvdXJjZSkgewogICAgVGVtcGxhdGUgdGVtcGxhdGUgPSB0ZW1wbGF0ZU1hbmFnZXIubG9va3VwU3RhdGVtZW50VGVtcGxhdGUoc291cmNlKTsKICAgIGlmICh0ZW1wbGF0ZSA9PSBudWxsKSB7CiAgICAgIE1pbmlKc1BhcnNlciBwYXJzZXIgPSBuZXcgTWluaUpzUGFyc2VyKHNvdXJjZSk7CiAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBwYXJzZXIuc3RhdGVtZW50KCk7CiAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGVNYW5hZ2VyLmRlZmluZVN0YXRlbWVudFRlbXBsYXRlKHNvdXJjZSwgc3RhdGVtZW50KTsKICAgIH0KICAgIHJldHVybiB0ZW1wbGF0ZTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYW4gRXhwcmVzc2lvbiB0ZW1wbGF0ZSBmb3IgdGhlIGdpdmVuIFtzb3VyY2VdLgogICAqCiAgICogVGhlIHJldHVybmVkIHRlbXBsYXRlIGlzIGNhY2hlZC4KICAgKi8KICBUZW1wbGF0ZSBleHByZXNzaW9uVGVtcGxhdGVGb3IoU3RyaW5nIHNvdXJjZSkgewogICAgcmV0dXJuIF9maW5kRXhwcmVzc2lvblRlbXBsYXRlKHNvdXJjZSk7CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGFuIEV4cHJlc3Npb24gdGVtcGxhdGUgd2l0aG91dCBjYWNoaW5nIHRoZSByZXN1bHQuCiAgICovCiAgVGVtcGxhdGUgdW5jYWNoZWRFeHByZXNzaW9uVGVtcGxhdGUoU3RyaW5nIHNvdXJjZSkgewogICAgTWluaUpzUGFyc2VyIHBhcnNlciA9IG5ldyBNaW5pSnNQYXJzZXIoc291cmNlKTsKICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBhcnNlci5leHByZXNzaW9uKCk7CiAgICByZXR1cm4gbmV3IFRlbXBsYXRlKHNvdXJjZSwgZXhwcmVzc2lvbiwKICAgICAgICBpc0V4cHJlc3Npb246IHRydWUsIGZvcmNlQ29weTogZmFsc2UpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIFN0YXRlbWVudCB0ZW1wbGF0ZSB3aXRob3V0IGNhY2hpbmcgdGhlIHJlc3VsdC4KICAgKi8KICBUZW1wbGF0ZSB1bmNhY2hlZFN0YXRlbWVudFRlbXBsYXRlKFN0cmluZyBzb3VyY2UpIHsKICAgIE1pbmlKc1BhcnNlciBwYXJzZXIgPSBuZXcgTWluaUpzUGFyc2VyKHNvdXJjZSk7CiAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gcGFyc2VyLnN0YXRlbWVudCgpOwogICAgcmV0dXJuIG5ldyBUZW1wbGF0ZShzb3VyY2UsIHN0YXRlbWVudCwKICAgICAgICBpc0V4cHJlc3Npb246IGZhbHNlLCBmb3JjZUNvcHk6IGZhbHNlKTsKICB9CgogIC8qKgogICAqIENyZWF0ZSBhbiBFeHByZXNzaW9uIHRlbXBsYXRlIHdoaWNoIGhhcyBbYXN0XSBhcyB0aGUgcmVzdWx0LiAgVGhpcyBpcyB1c2VkCiAgICogdG8gd3JhcCBhIGdlbmVyYXRlZCBBU1QgaW4gYSB6ZXJvLWFyZ3VtZW50IFRlbXBsYXRlIHNvIGl0IGNhbiBiZSBwYXNzZWQgdG8KICAgKiBjb250ZXh0IHRoYXQgZXhwZWN0cyBhIHRlbXBsYXRlLgogICAqLwogIFRlbXBsYXRlIGV4cHJlc3Npb25UZW1wbGF0ZVlpZWxkaW5nKE5vZGUgYXN0KSB7CiAgICByZXR1cm4gbmV3IFRlbXBsYXRlLndpdGhFeHByZXNzaW9uUmVzdWx0KGFzdCk7CiAgfQoKICBUZW1wbGF0ZSBzdGF0ZW1lbnRUZW1wbGF0ZVlpZWxkaW5nKE5vZGUgYXN0KSB7CiAgICByZXR1cm4gbmV3IFRlbXBsYXRlLndpdGhTdGF0ZW1lbnRSZXN1bHQoYXN0KTsKICB9CgogIC8vLyBDcmVhdGVzIGEgbGl0ZXJhbCBqcyBzdHJpbmcgZnJvbSBbdmFsdWVdLgogIExpdGVyYWxTdHJpbmcgX2xlZ2FjeUVzY2FwZWRTdHJpbmcoU3RyaW5nIHZhbHVlKSB7CiAgICAvLyBTdGFydCBieSBlc2NhcGluZyB0aGUgYmFja3NsYXNoZXMuCiAgICBTdHJpbmcgZXNjYXBlZCA9IHZhbHVlLnJlcGxhY2VBbGwoJ1xcJywgJ1xcXFwnKTsKICAgIC8vIERvIG5vdCBlc2NhcGUgdW5pY29kZSBjaGFyYWN0ZXJzIGFuZCAnIGJlY2F1c2UgdGhleSBhcmUgYWxsb3dlZCBpbiB0aGUKICAgIC8vIHN0cmluZyBsaXRlcmFsIGFueXdheS4KICAgIGVzY2FwZWQgPSBlc2NhcGVkLnJlcGxhY2VBbGxNYXBwZWQobmV3IFJlZ0V4cCgnXG58InxcYnxcdHxcdnxccicpLCAobWF0Y2gpIHsKICAgICAgc3dpdGNoIChtYXRjaC5ncm91cCgwKSkgewogICAgICAgIGNhc2UgIlxuIjoKICAgICAgICAgIHJldHVybiByIlxuIjsKICAgICAgICBjYXNlICJcIiI6CiAgICAgICAgICByZXR1cm4gcidcIic7CiAgICAgICAgY2FzZSAiXGIiOgogICAgICAgICAgcmV0dXJuIHIiXGIiOwogICAgICAgIGNhc2UgIlx0IjoKICAgICAgICAgIHJldHVybiByIlx0IjsKICAgICAgICBjYXNlICJcZiI6CiAgICAgICAgICByZXR1cm4gciJcZiI7CiAgICAgICAgY2FzZSAiXHIiOgogICAgICAgICAgcmV0dXJuIHIiXHIiOwogICAgICAgIGNhc2UgIlx2IjoKICAgICAgICAgIHJldHVybiByIlx2IjsKICAgICAgfQogICAgfSk7CiAgICBMaXRlcmFsU3RyaW5nIHJlc3VsdCA9IHN0cmluZyhlc2NhcGVkKTsKICAgIC8vIFdlIGRvbid0IGVzY2FwZSAnIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHN0cmluZyBpcyB3cmFwcGVkCiAgICAvLyBpbnRvICIuIFZlcmlmeSB0aGF0IGFzc3VtcHRpb24uCiAgICBhc3NlcnQocmVzdWx0LnZhbHVlLmNvZGVVbml0QXQoMCkgPT0gJyInLmNvZGVVbml0QXQoMCkpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBDcmVhdGVzIGEgbGl0ZXJhbCBqcyBzdHJpbmcgZnJvbSBbdmFsdWVdLgogIExpdGVyYWxTdHJpbmcgZXNjYXBlZFN0cmluZyhTdHJpbmcgdmFsdWUsCiAgICAgIHtib29sIHV0Zjg6IGZhbHNlLCBib29sIGFzY2lpOiBmYWxzZX0pIHsKICAgIGlmICh1dGY4ID09IGZhbHNlICYmIGFzY2lpID09IGZhbHNlKSByZXR1cm4gX2xlZ2FjeUVzY2FwZWRTdHJpbmcodmFsdWUpOwogICAgaWYgKHV0ZjggJiYgYXNjaWkpIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdDYW5ub3QgYmUgYm90aCBVVEY4IGFuZCBBU0NJSScpOwoKICAgIGludCBzaW5nbGVRdW90ZXMgPSAwOwogICAgaW50IGRvdWJsZVF1b3RlcyA9IDA7CiAgICBpbnQgb3RoZXJFc2NhcGVzID0gMDsKICAgIGludCB1bnBhaXJlZFN1cnJvZ2F0ZXMgPSAwOwoKICAgIGZvciAoaW50IHJ1bmUgaW4gdmFsdWUucnVuZXMpIHsKICAgICAgaWYgKHJ1bmUgPT0gY2hhckNvZGVzLiRCQUNLU0xBU0gpIHsKICAgICAgICArK290aGVyRXNjYXBlczsKICAgICAgfSBlbHNlIGlmIChydW5lID09IGNoYXJDb2Rlcy4kU1EpIHsKICAgICAgICArK3NpbmdsZVF1b3RlczsKICAgICAgfSBlbHNlIGlmIChydW5lID09IGNoYXJDb2Rlcy4kRFEpIHsKICAgICAgICArK2RvdWJsZVF1b3RlczsKICAgICAgfSBlbHNlIGlmIChydW5lID09IGNoYXJDb2Rlcy4kTEYgfHwKICAgICAgICAgIHJ1bmUgPT0gY2hhckNvZGVzLiRDUiB8fAogICAgICAgICAgcnVuZSA9PSBjaGFyQ29kZXMuJExTIHx8CiAgICAgICAgICBydW5lID09IGNoYXJDb2Rlcy4kUFMpIHsKICAgICAgICAvLyBMaW5lIHRlcm1pbmF0b3JzLgogICAgICAgICsrb3RoZXJFc2NhcGVzOwogICAgICB9IGVsc2UgaWYgKHJ1bmUgPT0gY2hhckNvZGVzLiRCUyB8fAogICAgICAgICAgcnVuZSA9PSBjaGFyQ29kZXMuJFRBQiB8fAogICAgICAgICAgcnVuZSA9PSBjaGFyQ29kZXMuJFZUQUIgfHwKICAgICAgICAgIHJ1bmUgPT0gY2hhckNvZGVzLiRGRikgewogICAgICAgICsrb3RoZXJFc2NhcGVzOwogICAgICB9IGVsc2UgaWYgKF9pc1VucGFpcmVkU3Vycm9nYXRlKHJ1bmUpKSB7CiAgICAgICAgKyt1bnBhaXJlZFN1cnJvZ2F0ZXM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGFzY2lpICYmIChydW5lIDwgY2hhckNvZGVzLiRTUEFDRSB8fCBydW5lID49IGNoYXJDb2Rlcy4kREVMKSkgewogICAgICAgICAgKytvdGhlckVzY2FwZXM7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgTGl0ZXJhbFN0cmluZyBmaW5pc2goU3RyaW5nIHF1b3RlLCBTdHJpbmcgY29udGVudHMpIHsKICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsU3RyaW5nKCckcXVvdGUkY29udGVudHMkcXVvdGUnKTsKICAgIH0KCiAgICBpZiAob3RoZXJFc2NhcGVzID09IDAgJiYgdW5wYWlyZWRTdXJyb2dhdGVzID09IDApIHsKICAgICAgaWYgKGRvdWJsZVF1b3RlcyA9PSAwKSByZXR1cm4gZmluaXNoKCciJywgdmFsdWUpOwogICAgICBpZiAoc2luZ2xlUXVvdGVzID09IDApIHJldHVybiBmaW5pc2goIiciLCB2YWx1ZSk7CiAgICB9CgogICAgYm9vbCB1c2VTaW5nbGVRdW90ZXMgPSBzaW5nbGVRdW90ZXMgPCBkb3VibGVRdW90ZXM7CgogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwoKICAgIGZvciAoaW50IHJ1bmUgaW4gdmFsdWUucnVuZXMpIHsKICAgICAgU3RyaW5nIGVzY2FwZSA9IF9pcnJlZ3VsYXJFc2NhcGUocnVuZSwgdXNlU2luZ2xlUXVvdGVzKTsKICAgICAgaWYgKGVzY2FwZSAhPSBudWxsKSB7CiAgICAgICAgc2Iud3JpdGUoZXNjYXBlKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAocnVuZSA9PSBjaGFyQ29kZXMuJExTIHx8CiAgICAgICAgICBydW5lID09IGNoYXJDb2Rlcy4kUFMgfHwKICAgICAgICAgIF9pc1VucGFpcmVkU3Vycm9nYXRlKHJ1bmUpIHx8CiAgICAgICAgICBhc2NpaSAmJiAocnVuZSA8IGNoYXJDb2Rlcy4kU1BBQ0UgfHwgcnVuZSA+PSBjaGFyQ29kZXMuJERFTCkpIHsKICAgICAgICBpZiAocnVuZSA8IDB4MTAwKSB7CiAgICAgICAgICBzYi53cml0ZShyJ1x4Jyk7CiAgICAgICAgICBzYi53cml0ZShydW5lLnRvUmFkaXhTdHJpbmcoMTYpLnBhZExlZnQoMiwgJzAnKSk7CiAgICAgICAgfSBlbHNlIGlmIChydW5lIDwgMHgxMDAwMCkgewogICAgICAgICAgc2Iud3JpdGUocidcdScpOwogICAgICAgICAgc2Iud3JpdGUocnVuZS50b1JhZGl4U3RyaW5nKDE2KS5wYWRMZWZ0KDQsICcwJykpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBOb3QgYWxsIGJyb3dzZXJzIGFjY2VwdCB0aGUgRVM2IFx1e3p6enp6en0gZW5jb2RpbmcsIHNvIGVtaXQgdHdvCiAgICAgICAgICAvLyBzdXJyb2dhdGUgcGFpcnMuCiAgICAgICAgICB2YXIgYml0cyA9IHJ1bmUgLSAweDEwMDAwOwogICAgICAgICAgdmFyIGxlYWRpbmcgPSAweEQ4MDAgfCAoYml0cyA+PiAxMCk7CiAgICAgICAgICB2YXIgdHJhaWxpbmcgPSAweERDMDAgfCAoYml0cyAmIDB4M2ZmKTsKICAgICAgICAgIHNiLndyaXRlKHInXHUnKTsKICAgICAgICAgIHNiLndyaXRlKGxlYWRpbmcudG9SYWRpeFN0cmluZygxNikpOwogICAgICAgICAgc2Iud3JpdGUocidcdScpOwogICAgICAgICAgc2Iud3JpdGUodHJhaWxpbmcudG9SYWRpeFN0cmluZygxNikpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBzYi53cml0ZUNoYXJDb2RlKHJ1bmUpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGZpbmlzaCh1c2VTaW5nbGVRdW90ZXMgPyAiJyIgOiAnIicsIHNiLnRvU3RyaW5nKCkpOwogIH0KCiAgc3RhdGljIGJvb2wgX2lzVW5wYWlyZWRTdXJyb2dhdGUoaW50IGNvZGUpID0+IChjb2RlICYgMHhGRkZGRjgwMCkgPT0gMHhEODAwOwoKICBzdGF0aWMgU3RyaW5nIF9pcnJlZ3VsYXJFc2NhcGUoaW50IGNvZGUsIGJvb2wgdXNlU2luZ2xlUXVvdGVzKSB7CiAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgY2FzZSBjaGFyQ29kZXMuJFNROgogICAgICAgIHJldHVybiB1c2VTaW5nbGVRdW90ZXMgPyByIlwnIiA6IHIiJyI7CiAgICAgIGNhc2UgY2hhckNvZGVzLiREUToKICAgICAgICByZXR1cm4gdXNlU2luZ2xlUXVvdGVzID8gciciJyA6IHInXCInOwogICAgICBjYXNlIGNoYXJDb2Rlcy4kQkFDS1NMQVNIOgogICAgICAgIHJldHVybiByJ1xcJzsKICAgICAgY2FzZSBjaGFyQ29kZXMuJEJTOgogICAgICAgIHJldHVybiByJ1xiJzsKICAgICAgY2FzZSBjaGFyQ29kZXMuJFRBQjoKICAgICAgICByZXR1cm4gcidcdCc7CiAgICAgIGNhc2UgY2hhckNvZGVzLiRMRjoKICAgICAgICByZXR1cm4gcidcbic7CiAgICAgIGNhc2UgY2hhckNvZGVzLiRWVEFCOgogICAgICAgIHJldHVybiByJ1x2JzsKICAgICAgY2FzZSBjaGFyQ29kZXMuJEZGOgogICAgICAgIHJldHVybiByJ1xmJzsKICAgICAgY2FzZSBjaGFyQ29kZXMuJENSOgogICAgICAgIHJldHVybiByJ1xyJzsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgLy8vIENyZWF0ZXMgYSBsaXRlcmFsIGpzIHN0cmluZyBmcm9tIFt2YWx1ZV0uCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgcHV0cyBxdW90ZXMgYXJvdW5kIFt2YWx1ZV0uIEl0IGRvZXMgbm90IGRvCiAgLy8vIGFueSBlc2NhcGluZywgc28gdXNlIG9ubHkgd2hlbiB5b3UgY2FuIGd1YXJhbnRlZSB0aGF0IFt2YWx1ZV0gZG9lcyBub3QKICAvLy8gY29udGFpbiBuZXdsaW5lcyBvciBiYWNrc2xhc2hlcy4gRm9yIGVzY2FwaW5nIHRoZSBzdHJpbmcgdXNlCiAgLy8vIFtlc2NhcGVkU3RyaW5nXS4KICBMaXRlcmFsU3RyaW5nIHN0cmluZyhTdHJpbmcgdmFsdWUpID0+IG5ldyBMaXRlcmFsU3RyaW5nKCciJHZhbHVlIicpOwoKICAvLy8gQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBbTGl0ZXJhbFN0cmluZ10gZnJvbSBbdmFsdWVdLgogIC8vLwogIC8vLyBEb2VzIG5vdCBhZGQgcXVvdGVzIG9yIGRvIGFueSBlc2NhcGluZy4KICBMaXRlcmFsU3RyaW5nIHN0cmluZ1BhcnQoU3RyaW5nIHZhbHVlKSA9PiBuZXcgTGl0ZXJhbFN0cmluZyh2YWx1ZSk7CgogIFN0cmluZ0NvbmNhdGVuYXRpb24gY29uY2F0ZW5hdGVTdHJpbmdzKEl0ZXJhYmxlPExpdGVyYWw+IHBhcnRzLAogICAgICB7YWRkUXVvdGVzOiBmYWxzZX0pIHsKICAgIExpc3Q8TGl0ZXJhbD4gX3BhcnRzOwogICAgaWYgKGFkZFF1b3RlcykgewogICAgICBMaXRlcmFsIHF1b3RlID0gc3RyaW5nUGFydCgnIicpOwogICAgICBfcGFydHMgPSA8TGl0ZXJhbD5bcXVvdGVdCiAgICAgICAgLi5hZGRBbGwocGFydHMpCiAgICAgICAgLi5hZGQocXVvdGUpOwogICAgfSBlbHNlIHsKICAgICAgX3BhcnRzID0gbmV3IExpc3QuZnJvbShwYXJ0cywgZ3Jvd2FibGU6IGZhbHNlKTsKICAgIH0KICAgIHJldHVybiBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbihfcGFydHMpOwogIH0KCiAgSXRlcmFibGU8TGl0ZXJhbD4gam9pbkxpdGVyYWxzKEl0ZXJhYmxlPExpdGVyYWw+IGxpc3QsIExpdGVyYWwgc2VwYXJhdG9yKSB7CiAgICByZXR1cm4gbmV3IF9JbnRlcmxlYXZlSXRlcmFibGU8TGl0ZXJhbD4obGlzdCwgc2VwYXJhdG9yKTsKICB9CgogIExpdGVyYWxTdHJpbmcgcXVvdGVOYW1lKE5hbWUgbmFtZSwge2FsbG93TnVsbDogZmFsc2V9KSB7CiAgICBpZiAobmFtZSA9PSBudWxsKSB7CiAgICAgIGFzc2VydChhbGxvd051bGwpOwogICAgICByZXR1cm4gbmV3IExpdGVyYWxTdHJpbmcoJyIiJyk7CiAgICB9CiAgICByZXR1cm4gbmV3IExpdGVyYWxTdHJpbmdGcm9tTmFtZShuYW1lKTsKICB9CgogIExpdGVyYWxOdW1iZXIgbnVtYmVyKG51bSB2YWx1ZSkgPT4gbmV3IExpdGVyYWxOdW1iZXIoJyR2YWx1ZScpOwoKICBMaXRlcmFsQm9vbCBib29sZWFuKGJvb2wgdmFsdWUpID0+IG5ldyBMaXRlcmFsQm9vbCh2YWx1ZSk7CgogIEFycmF5SW5pdGlhbGl6ZXIgbnVtQXJyYXkoSXRlcmFibGU8aW50PiBsaXN0KSA9PgogICAgICBuZXcgQXJyYXlJbml0aWFsaXplcihsaXN0Lm1hcChudW1iZXIpLnRvTGlzdCgpKTsKCiAgQXJyYXlJbml0aWFsaXplciBzdHJpbmdBcnJheShJdGVyYWJsZTxTdHJpbmc+IGxpc3QpID0+CiAgICAgIG5ldyBBcnJheUluaXRpYWxpemVyKGxpc3QubWFwKHN0cmluZykudG9MaXN0KCkpOwoKICBDb21tZW50IGNvbW1lbnQoU3RyaW5nIHRleHQpID0+IG5ldyBDb21tZW50KHRleHQpOwoKICBDYWxsIHByb3BlcnR5Q2FsbCgKICAgICAgRXhwcmVzc2lvbiByZWNlaXZlciwgRXhwcmVzc2lvbiBmaWVsZE5hbWUsIExpc3Q8RXhwcmVzc2lvbj4gYXJndW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IENhbGwobmV3IFByb3BlcnR5QWNjZXNzKHJlY2VpdmVyLCBmaWVsZE5hbWUpLCBhcmd1bWVudHMpOwogIH0KCiAgT2JqZWN0SW5pdGlhbGl6ZXIgb2JqZWN0TGl0ZXJhbChNYXA8U3RyaW5nLCBFeHByZXNzaW9uPiBtYXApIHsKICAgIExpc3Q8UHJvcGVydHk+IHByb3BlcnRpZXMgPSA8UHJvcGVydHk+W107CiAgICBtYXAuZm9yRWFjaCgobmFtZSwgdmFsdWUpIHsKICAgICAgcHJvcGVydGllcy5hZGQobmV3IFByb3BlcnR5KHN0cmluZyhuYW1lKSwgdmFsdWUpKTsKICAgIH0pOwogICAgcmV0dXJuIG5ldyBPYmplY3RJbml0aWFsaXplcihwcm9wZXJ0aWVzKTsKICB9Cn0KCkxpdGVyYWxTdHJpbmcgc3RyaW5nKFN0cmluZyB2YWx1ZSkgPT4ganMuc3RyaW5nKHZhbHVlKTsKTGl0ZXJhbFN0cmluZyBxdW90ZU5hbWUoTmFtZSBuYW1lLCB7YWxsb3dOdWxsOiBmYWxzZX0pIHsKICByZXR1cm4ganMucXVvdGVOYW1lKG5hbWUsIGFsbG93TnVsbDogYWxsb3dOdWxsKTsKfQoKTGl0ZXJhbFN0cmluZyBzdHJpbmdQYXJ0KFN0cmluZyB2YWx1ZSkgPT4ganMuc3RyaW5nUGFydCh2YWx1ZSk7Ckl0ZXJhYmxlPExpdGVyYWw+IGpvaW5MaXRlcmFscyhJdGVyYWJsZTxMaXRlcmFsPiBsaXN0LCBMaXRlcmFsIHNlcGFyYXRvcikgewogIHJldHVybiBqcy5qb2luTGl0ZXJhbHMobGlzdCwgc2VwYXJhdG9yKTsKfQoKU3RyaW5nQ29uY2F0ZW5hdGlvbiBjb25jYXRlbmF0ZVN0cmluZ3MoSXRlcmFibGU8TGl0ZXJhbD4gcGFydHMsCiAgICB7YWRkUXVvdGVzOiBmYWxzZX0pIHsKICByZXR1cm4ganMuY29uY2F0ZW5hdGVTdHJpbmdzKHBhcnRzLCBhZGRRdW90ZXM6IGFkZFF1b3Rlcyk7Cn0KCkxpdGVyYWxOdW1iZXIgbnVtYmVyKG51bSB2YWx1ZSkgPT4ganMubnVtYmVyKHZhbHVlKTsKQXJyYXlJbml0aWFsaXplciBudW1BcnJheShJdGVyYWJsZTxpbnQ+IGxpc3QpID0+IGpzLm51bUFycmF5KGxpc3QpOwpBcnJheUluaXRpYWxpemVyIHN0cmluZ0FycmF5KEl0ZXJhYmxlPFN0cmluZz4gbGlzdCkgPT4ganMuc3RyaW5nQXJyYXkobGlzdCk7CkNhbGwgcHJvcGVydHlDYWxsKAogICAgRXhwcmVzc2lvbiByZWNlaXZlciwgRXhwcmVzc2lvbiBmaWVsZE5hbWUsIExpc3Q8RXhwcmVzc2lvbj4gYXJndW1lbnRzKSB7CiAgcmV0dXJuIGpzLnByb3BlcnR5Q2FsbChyZWNlaXZlciwgZmllbGROYW1lLCBhcmd1bWVudHMpOwp9CgpPYmplY3RJbml0aWFsaXplciBvYmplY3RMaXRlcmFsKE1hcDxTdHJpbmcsIEV4cHJlc3Npb24+IG1hcCkgewogIHJldHVybiBqcy5vYmplY3RMaXRlcmFsKG1hcCk7Cn0KCmNsYXNzIE1pbmlKc1BhcnNlckVycm9yIHsKICBNaW5pSnNQYXJzZXJFcnJvcih0aGlzLnBhcnNlciwgdGhpcy5tZXNzYWdlKSB7fQoKICBmaW5hbCBNaW5pSnNQYXJzZXIgcGFyc2VyOwogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBpbnQgcG9zID0gcGFyc2VyLmxhc3RQb3NpdGlvbjsKCiAgICAvLyBEaXNjYXJkIGxpbmVzIGZvbGxvd2luZyB0aGUgbGluZSBjb250YWluaW5nIGxhc3RQb3NpdGlvbi4KICAgIFN0cmluZyBzcmMgPSBwYXJzZXIuc3JjOwogICAgaW50IG5ld2xpbmVQb3MgPSBzcmMuaW5kZXhPZignXG4nLCBwb3MpOwogICAgaWYgKG5ld2xpbmVQb3MgPj0gcG9zKSBzcmMgPSBzcmMuc3Vic3RyaW5nKDAsIG5ld2xpbmVQb3MpOwoKICAgIC8vIEV4dHJhY3QgdGhlIHByZWZpeCBvZiB0aGUgZXJyb3IgbGluZSBiZWZvcmUgbGFzdFBvc2l0aW9uLgogICAgU3RyaW5nIGxpbmUgPSBzcmM7CiAgICBpbnQgbGFzdExpbmVTdGFydCA9IGxpbmUubGFzdEluZGV4T2YoJ1xuJyk7CiAgICBpZiAobGFzdExpbmVTdGFydCA+PSAwKSBsaW5lID0gbGluZS5zdWJzdHJpbmcobGFzdExpbmVTdGFydCArIDEpOwogICAgU3RyaW5nIHByZWZpeCA9IGxpbmUuc3Vic3RyaW5nKDAsIHBvcyAtIChzcmMubGVuZ3RoIC0gbGluZS5sZW5ndGgpKTsKCiAgICAvLyBSZXBsYWNlIG5vbi10YWJzIHdpdGggc3BhY2VzLCBnaXZpbmcgYSBwcmludCBpbmRlbnQgdGhhdCBtYXRjaGVzIHRoZSB0ZXh0CiAgICAvLyBmb3IgdGFiYmluZy4KICAgIFN0cmluZyBzcGFjZXMgPSBwcmVmaXgucmVwbGFjZUFsbChuZXcgUmVnRXhwKHInW15cdF0nKSwgJyAnKTsKICAgIHJldHVybiAnRXJyb3IgaW4gTWluaUpzUGFyc2VyOlxuJHtzcmN9XG4kc3BhY2VzXlxuJHNwYWNlcyRtZXNzYWdlXG4nOwogIH0KfQoKLy8vIE1pbmkgSmF2YVNjcmlwdCBwYXJzZXIgZm9yIHRpbnkgc25pcHBldHMgb2YgY29kZSB0aGF0IHdlIHdhbnQgdG8gbWFrZSBpbnRvCi8vLyBBU1Qgbm9kZXMuICBIYW5kbGVzOgovLy8gKiBpZGVudGlmaWVycy4KLy8vICogZG90IGFjY2Vzcy4KLy8vICogbWV0aG9kIGNhbGxzLgovLy8gKiBbXSBhY2Nlc3MuCi8vLyAqIGFycmF5LCBzdHJpbmcsIHJlZ2V4cCwgYm9vbGVhbiwgbnVsbCBhbmQgbnVtZXJpYyBsaXRlcmFscy4KLy8vICogbW9zdCBvcGVyYXRvcnMuCi8vLyAqIGJyYWNrZXRzLgovLy8gKiB2YXIgZGVjbGFyYXRpb25zLgovLy8gKiBvcGVyYXRvciBwcmVjZWRlbmNlLgovLy8gKiBhbm9ueW1vdXMgZnVuY3Rpb25zIGFuZCBuYW1lZCBmdW5jdGlvbiBleHByZXNzaW9ucyBhbmQgZGVjbGFyYXRpb25zLgovLy8gTm90YWJsZSB0aGluZ3MgaXQgY2FuJ3QgZG8geWV0IGluY2x1ZGU6Ci8vLyAqIHNvbWUgc3RhdGVtZW50cyBhcmUgc3RpbGwgbWlzc2luZyAoZG8td2hpbGUsIHdoaWxlLCBzd2l0Y2gpLgovLy8KLy8vIEl0J3MgYSBmYWlybHkgc3RhbmRhcmQgcmVjdXJzaXZlIGRlc2NlbnQgcGFyc2VyLgovLy8KLy8vIExpdGVyYWwgc3RyaW5ncyBhcmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGZpbmFsIEpTIHNvdXJjZSBjb2RlIHVuY2hhbmdlZCwKLy8vIGluY2x1ZGluZyB0aGUgY2hvaWNlIG9mIHN1cnJvdW5kaW5nIHF1b3Rlcywgc28gaWYgeW91IHBhcnNlCi8vLyByJ3ZhciB4ID0gImZvb1xuXCJiYXJcIiInIHlvdSB3aWxsIGVuZCB1cCB3aXRoCi8vLyAgIHZhciB4ID0gImZvb1xuXCJiYXJcIiIgaW4gdGhlIGZpbmFsIHByb2dyYW0uICBceCBhbmQgXHUgZXNjYXBlcyBhcmUgbm90Ci8vLyBhbGxvd2VkIGluIHN0cmluZyBhbmQgcmVnZXhwIGxpdGVyYWxzIGJlY2F1c2UgdGhlIG1hY2hpbmVyeSBmb3IgY2hlY2tpbmcKLy8vIHRoZWlyIGNvcnJlY3RuZXNzIGlzIHJhdGhlciBpbnZvbHZlZC4KY2xhc3MgTWluaUpzUGFyc2VyIHsKICBNaW5pSnNQYXJzZXIodGhpcy5zcmMpCiAgICAgIDogbGFzdENhdGVnb3J5ID0gTk9ORSwKICAgICAgICBsYXN0VG9rZW4gPSBudWxsLAogICAgICAgIGxhc3RQb3NpdGlvbiA9IDAsCiAgICAgICAgcG9zaXRpb24gPSAwIHsKICAgIGdldFRva2VuKCk7CiAgfQoKICBpbnQgbGFzdENhdGVnb3J5ID0gTk9ORTsKICBTdHJpbmcgbGFzdFRva2VuID0gbnVsbDsKICBpbnQgbGFzdFBvc2l0aW9uID0gMDsKICBpbnQgcG9zaXRpb24gPSAwOwogIGJvb2wgc2tpcHBlZE5ld2xpbmUgPSBmYWxzZTsgLy8gc2tpcHBlZCBuZXdsaW5lIGluIGxhc3QgZ2V0VG9rZW4/CiAgZmluYWwgU3RyaW5nIHNyYzsKCiAgZmluYWwgTGlzdDxJbnRlcnBvbGF0ZWROb2RlPiBpbnRlcnBvbGF0ZWRWYWx1ZXMgPSA8SW50ZXJwb2xhdGVkTm9kZT5bXTsKICBib29sIGdldCBoYXNOYW1lZEhvbGVzID0+CiAgICAgIGludGVycG9sYXRlZFZhbHVlcy5pc05vdEVtcHR5ICYmIGludGVycG9sYXRlZFZhbHVlcy5maXJzdC5pc05hbWVkOwogIGJvb2wgZ2V0IGhhc1Bvc2l0aW9uYWxIb2xlcyA9PgogICAgICBpbnRlcnBvbGF0ZWRWYWx1ZXMuaXNOb3RFbXB0eSAmJiBpbnRlcnBvbGF0ZWRWYWx1ZXMuZmlyc3QuaXNQb3NpdGlvbmFsOwoKICBzdGF0aWMgY29uc3QgTk9ORSA9IC0xOwogIHN0YXRpYyBjb25zdCBBTFBIQSA9IDA7CiAgc3RhdGljIGNvbnN0IE5VTUVSSUMgPSAxOwogIHN0YXRpYyBjb25zdCBTVFJJTkcgPSAyOwogIHN0YXRpYyBjb25zdCBTWU1CT0wgPSAzOwogIHN0YXRpYyBjb25zdCBBU1NJR05NRU5UID0gNDsKICBzdGF0aWMgY29uc3QgRE9UID0gNTsKICBzdGF0aWMgY29uc3QgTFBBUkVOID0gNjsKICBzdGF0aWMgY29uc3QgUlBBUkVOID0gNzsKICBzdGF0aWMgY29uc3QgTEJSQUNFID0gODsKICBzdGF0aWMgY29uc3QgUkJSQUNFID0gOTsKICBzdGF0aWMgY29uc3QgTFNRVUFSRSA9IDEwOwogIHN0YXRpYyBjb25zdCBSU1FVQVJFID0gMTE7CiAgc3RhdGljIGNvbnN0IENPTU1BID0gMTI7CiAgc3RhdGljIGNvbnN0IFFVRVJZID0gMTM7CiAgc3RhdGljIGNvbnN0IENPTE9OID0gMTQ7CiAgc3RhdGljIGNvbnN0IFNFTUlDT0xPTiA9IDE1OwogIHN0YXRpYyBjb25zdCBIQVNIID0gMTY7CiAgc3RhdGljIGNvbnN0IFdISVRFU1BBQ0UgPSAxNzsKICBzdGF0aWMgY29uc3QgT1RIRVIgPSAxODsKCiAgLy8gTWFrZSBzdXJlIHRoYXQgXV0gaXMgdHdvIHN5bWJvbHMuCiAgYm9vbCBzaW5nbGVDaGFyQ2F0ZWdvcnkoaW50IGNhdGVnb3J5KSA9PiBjYXRlZ29yeSA+PSBET1Q7CgogIHN0YXRpYyBTdHJpbmcgY2F0ZWdvcnlUb1N0cmluZyhpbnQgY2F0KSB7CiAgICBzd2l0Y2ggKGNhdCkgewogICAgICBjYXNlIE5PTkU6CiAgICAgICAgcmV0dXJuICJOT05FIjsKICAgICAgY2FzZSBBTFBIQToKICAgICAgICByZXR1cm4gIkFMUEhBIjsKICAgICAgY2FzZSBOVU1FUklDOgogICAgICAgIHJldHVybiAiTlVNRVJJQyI7CiAgICAgIGNhc2UgU1lNQk9MOgogICAgICAgIHJldHVybiAiU1lNQk9MIjsKICAgICAgY2FzZSBBU1NJR05NRU5UOgogICAgICAgIHJldHVybiAiQVNTSUdOTUVOVCI7CiAgICAgIGNhc2UgRE9UOgogICAgICAgIHJldHVybiAiRE9UIjsKICAgICAgY2FzZSBMUEFSRU46CiAgICAgICAgcmV0dXJuICJMUEFSRU4iOwogICAgICBjYXNlIFJQQVJFTjoKICAgICAgICByZXR1cm4gIlJQQVJFTiI7CiAgICAgIGNhc2UgTEJSQUNFOgogICAgICAgIHJldHVybiAiTEJSQUNFIjsKICAgICAgY2FzZSBSQlJBQ0U6CiAgICAgICAgcmV0dXJuICJSQlJBQ0UiOwogICAgICBjYXNlIExTUVVBUkU6CiAgICAgICAgcmV0dXJuICJMU1FVQVJFIjsKICAgICAgY2FzZSBSU1FVQVJFOgogICAgICAgIHJldHVybiAiUlNRVUFSRSI7CiAgICAgIGNhc2UgU1RSSU5HOgogICAgICAgIHJldHVybiAiU1RSSU5HIjsKICAgICAgY2FzZSBDT01NQToKICAgICAgICByZXR1cm4gIkNPTU1BIjsKICAgICAgY2FzZSBRVUVSWToKICAgICAgICByZXR1cm4gIlFVRVJZIjsKICAgICAgY2FzZSBDT0xPTjoKICAgICAgICByZXR1cm4gIkNPTE9OIjsKICAgICAgY2FzZSBTRU1JQ09MT046CiAgICAgICAgcmV0dXJuICJTRU1JQ09MT04iOwogICAgICBjYXNlIEhBU0g6CiAgICAgICAgcmV0dXJuICJIQVNIIjsKICAgICAgY2FzZSBXSElURVNQQUNFOgogICAgICAgIHJldHVybiAiV0hJVEVTUEFDRSI7CiAgICAgIGNhc2UgT1RIRVI6CiAgICAgICAgcmV0dXJuICJPVEhFUiI7CiAgICB9CiAgICByZXR1cm4gIlVua25vd246ICRjYXQiOwogIH0KCiAgc3RhdGljIGNvbnN0IENBVEVHT1JJRVMgPSBjb25zdCA8aW50PlsKICAgIE9USEVSLCBPVEhFUiwgT1RIRVIsIE9USEVSLCBPVEhFUiwgT1RIRVIsIE9USEVSLCBPVEhFUiwgLy8gMC03CiAgICBPVEhFUiwgV0hJVEVTUEFDRSwgV0hJVEVTUEFDRSwgT1RIRVIsIE9USEVSLCBXSElURVNQQUNFLCAvLyA4LTEzCiAgICBPVEhFUiwgT1RIRVIsIE9USEVSLCBPVEhFUiwgT1RIRVIsIE9USEVSLCBPVEhFUiwgT1RIRVIsIC8vIDE0LTIxCiAgICBPVEhFUiwgT1RIRVIsIE9USEVSLCBPVEhFUiwgT1RIRVIsIE9USEVSLCBPVEhFUiwgT1RIRVIsIC8vIDIyLTI5CiAgICBPVEhFUiwgT1RIRVIsIFdISVRFU1BBQ0UsIC8vIDMwLTMyCiAgICBTWU1CT0wsIE9USEVSLCBIQVNILCBBTFBIQSwgU1lNQk9MLCBTWU1CT0wsIE9USEVSLCAvLyAhIiMkJSbCtAogICAgTFBBUkVOLCBSUEFSRU4sIFNZTUJPTCwgU1lNQk9MLCBDT01NQSwgU1lNQk9MLCBET1QsIFNZTUJPTCwgLy8gKCkqKywtLi8KICAgIE5VTUVSSUMsIE5VTUVSSUMsIE5VTUVSSUMsIE5VTUVSSUMsIE5VTUVSSUMsIC8vIDAxMjM0CiAgICBOVU1FUklDLCBOVU1FUklDLCBOVU1FUklDLCBOVU1FUklDLCBOVU1FUklDLCAvLyA1Njc4OQogICAgQ09MT04sIFNFTUlDT0xPTiwgU1lNQk9MLCBTWU1CT0wsIFNZTUJPTCwgUVVFUlksIE9USEVSLCAvLyA6Ozw9Pj9ACiAgICBBTFBIQSwgQUxQSEEsIEFMUEhBLCBBTFBIQSwgQUxQSEEsIEFMUEhBLCBBTFBIQSwgQUxQSEEsIC8vIEFCQ0RFRkdICiAgICBBTFBIQSwgQUxQSEEsIEFMUEhBLCBBTFBIQSwgQUxQSEEsIEFMUEhBLCBBTFBIQSwgQUxQSEEsIC8vIElKS0xNTk9QCiAgICBBTFBIQSwgQUxQSEEsIEFMUEhBLCBBTFBIQSwgQUxQSEEsIEFMUEhBLCBBTFBIQSwgQUxQSEEsIC8vIFFSU1RVVldYCiAgICBBTFBIQSwgQUxQSEEsIExTUVVBUkUsIE9USEVSLCBSU1FVQVJFLCBTWU1CT0wsIEFMUEhBLCBPVEhFUiwgLy8gWVpbXF1eXycKICAgIEFMUEhBLCBBTFBIQSwgQUxQSEEsIEFMUEhBLCBBTFBIQSwgQUxQSEEsIEFMUEhBLCBBTFBIQSwgLy8gYWJjZGVmZ2gKICAgIEFMUEhBLCBBTFBIQSwgQUxQSEEsIEFMUEhBLCBBTFBIQSwgQUxQSEEsIEFMUEhBLCBBTFBIQSwgLy8gaWprbG1ub3AKICAgIEFMUEhBLCBBTFBIQSwgQUxQSEEsIEFMUEhBLCBBTFBIQSwgQUxQSEEsIEFMUEhBLCBBTFBIQSwgLy8gcXJzdHV2d3gKICAgIEFMUEhBLCBBTFBIQSwgTEJSQUNFLCBTWU1CT0wsIFJCUkFDRSwgU1lNQk9MCiAgXTsgLy8geXp7fH1+CgogIC8vIFRoaXMgbXVzdCBiZSBhID49IHRoZSBoaWdoZXN0IHByZWNlZGVuY2UgbnVtYmVyIGhhbmRsZWQgYnkgcGFyc2VCaW5hcnkuCiAgc3RhdGljIHZhciBISUdIRVNUX1BBUlNFX0JJTkFSWV9QUkVDRURFTkNFID0gMTY7CiAgc3RhdGljIGJvb2wgaXNBc3NpZ25tZW50KFN0cmluZyBzeW1ib2wpID0+IEJJTkFSWV9QUkVDRURFTkNFW3N5bWJvbF0gPT0gMTc7CgogIC8vIEZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PcGVyYXRvcnMvT3BlcmF0b3JfUHJlY2VkZW5jZQogIHN0YXRpYyBmaW5hbCBCSU5BUllfUFJFQ0VERU5DRSA9IHsKICAgICcrPSc6IDE3LAogICAgJy09JzogMTcsCiAgICAnKj0nOiAxNywKICAgICcvPSc6IDE3LAogICAgJyU9JzogMTcsCiAgICAnXj0nOiAxNywKICAgICd8PSc6IDE3LAogICAgJyY9JzogMTcsCiAgICAnPDw9JzogMTcsCiAgICAnPj49JzogMTcsCiAgICAnPj4+PSc6IDE3LAogICAgJz0nOiAxNywKICAgICd8fCc6IDE0LAogICAgJyYmJzogMTMsCiAgICAnfCc6IDEyLAogICAgJ14nOiAxMSwKICAgICcmJzogMTAsCiAgICAnIT0nOiA5LAogICAgJz09JzogOSwKICAgICchPT0nOiA5LAogICAgJz09PSc6IDksCiAgICAnPCc6IDgsCiAgICAnPD0nOiA4LAogICAgJz49JzogOCwKICAgICc+JzogOCwKICAgICdpbic6IDgsCiAgICAnaW5zdGFuY2VvZic6IDgsCiAgICAnPDwnOiA3LAogICAgJz4+JzogNywKICAgICc+Pj4nOiA3LAogICAgJysnOiA2LAogICAgJy0nOiA2LAogICAgJyonOiA1LAogICAgJy8nOiA1LAogICAgJyUnOiA1CiAgfTsKICBzdGF0aWMgZmluYWwgVU5BUllfT1BFUkFUT1JTID0gWwogICAgJysrJywKICAgICctLScsCiAgICAnKycsCiAgICAnLScsCiAgICAnficsCiAgICAnIScsCiAgICAndHlwZW9mJywKICAgICd2b2lkJywKICAgICdkZWxldGUnLAogICAgJ2F3YWl0JwogIF0udG9TZXQoKTsKCiAgc3RhdGljIGZpbmFsIE9QRVJBVE9SU19USEFUX0xPT0tfTElLRV9JREVOVElGSUVSUyA9CiAgICAgIFsndHlwZW9mJywgJ3ZvaWQnLCAnZGVsZXRlJywgJ2luJywgJ2luc3RhbmNlb2YnLCAnYXdhaXQnXS50b1NldCgpOwoKICBzdGF0aWMgaW50IGNhdGVnb3J5KGludCBjb2RlKSB7CiAgICBpZiAoY29kZSA+PSBDQVRFR09SSUVTLmxlbmd0aCkgcmV0dXJuIE9USEVSOwogICAgcmV0dXJuIENBVEVHT1JJRVNbY29kZV07CiAgfQoKICBTdHJpbmcgZ2V0RGVsaW1pdGVkKGludCBzdGFydFBvc2l0aW9uKSB7CiAgICBwb3NpdGlvbiA9IHN0YXJ0UG9zaXRpb247CiAgICBpbnQgZGVsaW1pdGVyID0gc3JjLmNvZGVVbml0QXQoc3RhcnRQb3NpdGlvbik7CiAgICBpbnQgY3VycmVudENvZGU7CiAgICBkbyB7CiAgICAgIHBvc2l0aW9uKys7CiAgICAgIGlmIChwb3NpdGlvbiA+PSBzcmMubGVuZ3RoKSBlcnJvcigiVW50ZXJtaW5hdGVkIGxpdGVyYWwiKTsKICAgICAgY3VycmVudENvZGUgPSBzcmMuY29kZVVuaXRBdChwb3NpdGlvbik7CiAgICAgIGlmIChjdXJyZW50Q29kZSA9PSBjaGFyQ29kZXMuJExGKSBlcnJvcigiVW50ZXJtaW5hdGVkIGxpdGVyYWwiKTsKICAgICAgaWYgKGN1cnJlbnRDb2RlID09IGNoYXJDb2Rlcy4kQkFDS1NMQVNIKSB7CiAgICAgICAgaWYgKCsrcG9zaXRpb24gPj0gc3JjLmxlbmd0aCkgZXJyb3IoIlVudGVybWluYXRlZCBsaXRlcmFsIik7CiAgICAgICAgaW50IGVzY2FwZWQgPSBzcmMuY29kZVVuaXRBdChwb3NpdGlvbik7CiAgICAgICAgaWYgKGVzY2FwZWQgPT0gY2hhckNvZGVzLiR4IHx8CiAgICAgICAgICAgIGVzY2FwZWQgPT0gY2hhckNvZGVzLiRYIHx8CiAgICAgICAgICAgIGVzY2FwZWQgPT0gY2hhckNvZGVzLiR1IHx8CiAgICAgICAgICAgIGVzY2FwZWQgPT0gY2hhckNvZGVzLiRVIHx8CiAgICAgICAgICAgIGNhdGVnb3J5KGVzY2FwZWQpID09IE5VTUVSSUMpIHsKICAgICAgICAgIGVycm9yKCdOdW1lcmljIGFuZCBoZXggZXNjYXBlcyBhcmUgbm90IGFsbG93ZWQgaW4gbGl0ZXJhbHMnKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gd2hpbGUgKGN1cnJlbnRDb2RlICE9IGRlbGltaXRlcik7CiAgICBwb3NpdGlvbisrOwogICAgcmV0dXJuIHNyYy5zdWJzdHJpbmcobGFzdFBvc2l0aW9uLCBwb3NpdGlvbik7CiAgfQoKICB2b2lkIGdldFRva2VuKCkgewogICAgc2tpcHBlZE5ld2xpbmUgPSBmYWxzZTsKICAgIGZvciAoOzspIHsKICAgICAgaWYgKHBvc2l0aW9uID49IHNyYy5sZW5ndGgpIGJyZWFrOwogICAgICBpbnQgY29kZSA9IHNyYy5jb2RlVW5pdEF0KHBvc2l0aW9uKTsKICAgICAgLy8gIFNraXAgJy8vJyBhbmQgJy8qJyBzdHlsZSBjb21tZW50cy4KICAgICAgaWYgKGNvZGUgPT0gY2hhckNvZGVzLiRTTEFTSCAmJiBwb3NpdGlvbiArIDEgPCBzcmMubGVuZ3RoKSB7CiAgICAgICAgaWYgKHNyYy5jb2RlVW5pdEF0KHBvc2l0aW9uICsgMSkgPT0gY2hhckNvZGVzLiRTTEFTSCkgewogICAgICAgICAgaW50IG5leHRQb3NpdGlvbiA9IHNyYy5pbmRleE9mKCdcbicsIHBvc2l0aW9uKTsKICAgICAgICAgIGlmIChuZXh0UG9zaXRpb24gPT0gLTEpIG5leHRQb3NpdGlvbiA9IHNyYy5sZW5ndGg7CiAgICAgICAgICBwb3NpdGlvbiA9IG5leHRQb3NpdGlvbjsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0gZWxzZSBpZiAoc3JjLmNvZGVVbml0QXQocG9zaXRpb24gKyAxKSA9PSBjaGFyQ29kZXMuJFNUQVIpIHsKICAgICAgICAgIGludCBuZXh0UG9zaXRpb24gPSBzcmMuaW5kZXhPZignKi8nLCBwb3NpdGlvbiArIDIpOwogICAgICAgICAgaWYgKG5leHRQb3NpdGlvbiA9PSAtMSkgZXJyb3IoJ1VudGVybWluYXRlZCBjb21tZW50Jyk7CiAgICAgICAgICBwb3NpdGlvbiA9IG5leHRQb3NpdGlvbiArIDI7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGNhdGVnb3J5KGNvZGUpICE9IFdISVRFU1BBQ0UpIGJyZWFrOwogICAgICBpZiAoY29kZSA9PSBjaGFyQ29kZXMuJExGKSBza2lwcGVkTmV3bGluZSA9IHRydWU7CiAgICAgICsrcG9zaXRpb247CiAgICB9CgogICAgaWYgKHBvc2l0aW9uID09IHNyYy5sZW5ndGgpIHsKICAgICAgbGFzdENhdGVnb3J5ID0gTk9ORTsKICAgICAgbGFzdFRva2VuID0gbnVsbDsKICAgICAgbGFzdFBvc2l0aW9uID0gcG9zaXRpb247CiAgICAgIHJldHVybjsKICAgIH0KICAgIGludCBjb2RlID0gc3JjLmNvZGVVbml0QXQocG9zaXRpb24pOwogICAgbGFzdFBvc2l0aW9uID0gcG9zaXRpb247CiAgICBpZiAoY29kZSA9PSBjaGFyQ29kZXMuJFNRIHx8IGNvZGUgPT0gY2hhckNvZGVzLiREUSkgewogICAgICAvLyBTdHJpbmcgbGl0ZXJhbC4KICAgICAgbGFzdENhdGVnb3J5ID0gU1RSSU5HOwogICAgICBsYXN0VG9rZW4gPSBnZXREZWxpbWl0ZWQocG9zaXRpb24pOwogICAgfSBlbHNlIGlmIChjb2RlID09IGNoYXJDb2Rlcy4kMCAmJgogICAgICAgIHBvc2l0aW9uICsgMiA8IHNyYy5sZW5ndGggJiYKICAgICAgICBzcmMuY29kZVVuaXRBdChwb3NpdGlvbiArIDEpID09IGNoYXJDb2Rlcy4keCkgewogICAgICAvLyBIZXggbGl0ZXJhbC4KICAgICAgZm9yIChwb3NpdGlvbiArPSAyOyBwb3NpdGlvbiA8IHNyYy5sZW5ndGg7IHBvc2l0aW9uKyspIHsKICAgICAgICBpbnQgY2F0ID0gY2F0ZWdvcnkoc3JjLmNvZGVVbml0QXQocG9zaXRpb24pKTsKICAgICAgICBpZiAoY2F0ICE9IE5VTUVSSUMgJiYgY2F0ICE9IEFMUEhBKSBicmVhazsKICAgICAgfQogICAgICBsYXN0Q2F0ZWdvcnkgPSBOVU1FUklDOwogICAgICBsYXN0VG9rZW4gPSBzcmMuc3Vic3RyaW5nKGxhc3RQb3NpdGlvbiwgcG9zaXRpb24pOwogICAgICBpZiAoaW50LnRyeVBhcnNlKGxhc3RUb2tlbikgPT0gbnVsbCkgewogICAgICAgIGVycm9yKCJVbnBhcnNlYWJsZSBudW1iZXIiKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChjb2RlID09IGNoYXJDb2Rlcy4kU0xBU0gpIHsKICAgICAgLy8gVG9rZW5zIHRoYXQgc3RhcnQgd2l0aCAvIGFyZSBzcGVjaWFsIGR1ZSB0byByZWdleHAgbGl0ZXJhbHMuCiAgICAgIGxhc3RDYXRlZ29yeSA9IFNZTUJPTDsKICAgICAgcG9zaXRpb24rKzsKICAgICAgaWYgKHBvc2l0aW9uIDwgc3JjLmxlbmd0aCAmJiBzcmMuY29kZVVuaXRBdChwb3NpdGlvbikgPT0gY2hhckNvZGVzLiRFUSkgewogICAgICAgIHBvc2l0aW9uKys7CiAgICAgIH0KICAgICAgbGFzdFRva2VuID0gc3JjLnN1YnN0cmluZyhsYXN0UG9zaXRpb24sIHBvc2l0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIEFsbCBvdGhlciB0b2tlbnMgaGFuZGxlZCBoZXJlLgogICAgICBpbnQgY2F0ID0gY2F0ZWdvcnkoc3JjLmNvZGVVbml0QXQocG9zaXRpb24pKTsKICAgICAgaW50IG5ld0NhdDsKICAgICAgZG8gewogICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgaWYgKHBvc2l0aW9uID09IHNyYy5sZW5ndGgpIGJyZWFrOwogICAgICAgIGludCBjb2RlID0gc3JjLmNvZGVVbml0QXQocG9zaXRpb24pOwogICAgICAgIC8vIFNwZWNpYWwgY29kZSB0byBkaXNhbGxvdyAhLCB+IGFuZCAvIGluIG5vbi1maXJzdCBwb3NpdGlvbiBpbiB0b2tlbiwKICAgICAgICAvLyBzbyB0aGF0ICEhIGFuZCB+fiBwYXJzZSBhcyB0d28gdG9rZW5zIGFuZCAhPSBwYXJzZXMgYXMgb25lLCB3aGlsZSA9LwogICAgICAgIC8vIHBhcnNlcyBhcyBhIGFuIGVxdWFscyB0b2tlbiBmb2xsb3dlZCBieSBhIHJlZ2V4cCBsaXRlcmFsIHN0YXJ0LgogICAgICAgIG5ld0NhdCA9IChjb2RlID09IGNoYXJDb2Rlcy4kQkFORyB8fAogICAgICAgICAgICAgICAgY29kZSA9PSBjaGFyQ29kZXMuJFNMQVNIIHx8CiAgICAgICAgICAgICAgICBjb2RlID09IGNoYXJDb2Rlcy4kVElMREUpCiAgICAgICAgICAgID8gTk9ORQogICAgICAgICAgICA6IGNhdGVnb3J5KGNvZGUpOwogICAgICB9IHdoaWxlICghc2luZ2xlQ2hhckNhdGVnb3J5KGNhdCkgJiYKICAgICAgICAgIChjYXQgPT0gbmV3Q2F0IHx8CiAgICAgICAgICAgICAgKGNhdCA9PSBBTFBIQSAmJiBuZXdDYXQgPT0gTlVNRVJJQykgfHwgLy8gZWcuIGxldmVsNDIuCiAgICAgICAgICAgICAgKGNhdCA9PSBOVU1FUklDICYmIG5ld0NhdCA9PSBET1QpKSk7IC8vIGVnLiAzLjE0MTUKICAgICAgbGFzdENhdGVnb3J5ID0gY2F0OwogICAgICBsYXN0VG9rZW4gPSBzcmMuc3Vic3RyaW5nKGxhc3RQb3NpdGlvbiwgcG9zaXRpb24pOwogICAgICBpZiAoY2F0ID09IE5VTUVSSUMpIHsKICAgICAgICBpZiAoZG91YmxlLnRyeVBhcnNlKGxhc3RUb2tlbikgPT0gbnVsbCkgewogICAgICAgICAgZXJyb3IoIlVucGFyc2VhYmxlIG51bWJlciIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjYXQgPT0gU1lNQk9MKSB7CiAgICAgICAgaW50IGJpbmFyeVByZWNlbmRlbmNlID0gQklOQVJZX1BSRUNFREVOQ0VbbGFzdFRva2VuXTsKICAgICAgICBpZiAoYmluYXJ5UHJlY2VuZGVuY2UgPT0gbnVsbCAmJiAhVU5BUllfT1BFUkFUT1JTLmNvbnRhaW5zKGxhc3RUb2tlbikpIHsKICAgICAgICAgIGVycm9yKCJVbmtub3duIG9wZXJhdG9yIik7CiAgICAgICAgfQogICAgICAgIGlmIChpc0Fzc2lnbm1lbnQobGFzdFRva2VuKSkgbGFzdENhdGVnb3J5ID0gQVNTSUdOTUVOVDsKICAgICAgfSBlbHNlIGlmIChjYXQgPT0gQUxQSEEpIHsKICAgICAgICBpZiAoT1BFUkFUT1JTX1RIQVRfTE9PS19MSUtFX0lERU5USUZJRVJTLmNvbnRhaW5zKGxhc3RUb2tlbikpIHsKICAgICAgICAgIGxhc3RDYXRlZ29yeSA9IFNZTUJPTDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgZXhwZWN0Q2F0ZWdvcnkoaW50IGNhdCkgewogICAgaWYgKGNhdCAhPSBsYXN0Q2F0ZWdvcnkpIGVycm9yKCJFeHBlY3RlZCAke2NhdGVnb3J5VG9TdHJpbmcoY2F0KX0iKTsKICAgIGdldFRva2VuKCk7CiAgfQoKICBib29sIGFjY2VwdENhdGVnb3J5KGludCBjYXQpIHsKICAgIGlmIChjYXQgPT0gbGFzdENhdGVnb3J5KSB7CiAgICAgIGdldFRva2VuKCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgdm9pZCBleHBlY3RTZW1pY29sb24oKSB7CiAgICBpZiAoYWNjZXB0U2VtaWNvbG9uKCkpIHJldHVybjsKICAgIGVycm9yKCdFeHBlY3RlZCBTRU1JQ09MT04nKTsKICB9CgogIGJvb2wgYWNjZXB0U2VtaWNvbG9uKCkgewogICAgLy8gQWNjZXB0IHNlbWljb2xvbiBvciBhdXRvbWF0aWNhbGx5IGluc2VydGVkIHNlbWljb2xvbiBiZWZvcmUgY2xvc2UgYnJhY2UuCiAgICAvLyBNaW5pcGFyc2VyIGZvcmJpZHMgb3RoZXIga2luZHMgb2Ygc2VtaWNvbG9uIGluc2VydGlvbi4KICAgIGlmIChSQlJBQ0UgPT0gbGFzdENhdGVnb3J5KSByZXR1cm4gdHJ1ZTsKICAgIGlmIChOT05FID09IGxhc3RDYXRlZ29yeSkgcmV0dXJuIHRydWU7IC8vIGVuZCBvZiBpbnB1dAogICAgaWYgKHNraXBwZWROZXdsaW5lKSB7CiAgICAgIGVycm9yKCdObyBhdXRvbWF0aWMgc2VtaWNvbG9uIGluc2VydGlvbiBhdCBwcmVjZWRpbmcgbmV3bGluZScpOwogICAgfQogICAgcmV0dXJuIGFjY2VwdENhdGVnb3J5KFNFTUlDT0xPTik7CiAgfQoKICBib29sIGFjY2VwdFN0cmluZyhTdHJpbmcgc3RyaW5nKSB7CiAgICBpZiAobGFzdFRva2VuID09IHN0cmluZykgewogICAgICBnZXRUb2tlbigpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIHZvaWQgZXJyb3IobWVzc2FnZSkgewogICAgdGhyb3cgbmV3IE1pbmlKc1BhcnNlckVycm9yKHRoaXMsIG1lc3NhZ2UpOwogIH0KCiAgLy8vIFJldHVybnMgZWl0aGVyIHRoZSBuYW1lIGZvciB0aGUgaG9sZSwgb3IgaXRzIGludGVnZXIgcG9zaXRpb24uCiAgcGFyc2VIYXNoKCkgewogICAgU3RyaW5nIGhvbGVOYW1lID0gbGFzdFRva2VuOwogICAgaWYgKGFjY2VwdENhdGVnb3J5KEFMUEhBKSkgewogICAgICAvLyBOYW1lZCBob2xlLiBFeGFtcGxlOiAnZnVuY3Rpb24gI2Z1bk5hbWUoKSB7IC4uLiB9JwogICAgICBpZiAoaGFzUG9zaXRpb25hbEhvbGVzKSB7CiAgICAgICAgZXJyb3IoJ0hvbGVzIG11c3QgYWxsIGJlIHBvc2l0aW9uYWwgb3IgbmFtZWQuICRob2xlTmFtZScpOwogICAgICB9CiAgICAgIHJldHVybiBob2xlTmFtZTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChoYXNOYW1lZEhvbGVzKSB7CiAgICAgICAgZXJyb3IoJ0hvbGVzIG11c3QgYWxsIGJlIHBvc2l0aW9uYWwgb3IgbmFtZWQuICRob2xlTmFtZScpOwogICAgICB9CiAgICAgIGludCBwb3NpdGlvbiA9IGludGVycG9sYXRlZFZhbHVlcy5sZW5ndGg7CiAgICAgIHJldHVybiBwb3NpdGlvbjsKICAgIH0KICB9CgogIEV4cHJlc3Npb24gcGFyc2VQcmltYXJ5KCkgewogICAgU3RyaW5nIGxhc3QgPSBsYXN0VG9rZW47CiAgICBpZiAoYWNjZXB0Q2F0ZWdvcnkoQUxQSEEpKSB7CiAgICAgIGlmIChsYXN0ID09ICJ0cnVlIikgewogICAgICAgIHJldHVybiBuZXcgTGl0ZXJhbEJvb2wodHJ1ZSk7CiAgICAgIH0gZWxzZSBpZiAobGFzdCA9PSAiZmFsc2UiKSB7CiAgICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsQm9vbChmYWxzZSk7CiAgICAgIH0gZWxzZSBpZiAobGFzdCA9PSAibnVsbCIpIHsKICAgICAgICByZXR1cm4gbmV3IExpdGVyYWxOdWxsKCk7CiAgICAgIH0gZWxzZSBpZiAobGFzdCA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlRnVuY3Rpb25FeHByZXNzaW9uKCk7CiAgICAgIH0gZWxzZSBpZiAobGFzdCA9PSAidGhpcyIpIHsKICAgICAgICByZXR1cm4gbmV3IFRoaXMoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbmV3IFZhcmlhYmxlVXNlKGxhc3QpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGFjY2VwdENhdGVnb3J5KExQQVJFTikpIHsKICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcGFyc2VFeHByZXNzaW9uKCk7CiAgICAgIGV4cGVjdENhdGVnb3J5KFJQQVJFTik7CiAgICAgIHJldHVybiBleHByZXNzaW9uOwogICAgfSBlbHNlIGlmIChhY2NlcHRDYXRlZ29yeShTVFJJTkcpKSB7CiAgICAgIHJldHVybiBuZXcgTGl0ZXJhbFN0cmluZyhsYXN0KTsKICAgIH0gZWxzZSBpZiAoYWNjZXB0Q2F0ZWdvcnkoTlVNRVJJQykpIHsKICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsTnVtYmVyKGxhc3QpOwogICAgfSBlbHNlIGlmIChhY2NlcHRDYXRlZ29yeShMQlJBQ0UpKSB7CiAgICAgIHJldHVybiBwYXJzZU9iamVjdEluaXRpYWxpemVyKCk7CiAgICB9IGVsc2UgaWYgKGFjY2VwdENhdGVnb3J5KExTUVVBUkUpKSB7CiAgICAgIHZhciB2YWx1ZXMgPSA8RXhwcmVzc2lvbj5bXTsKCiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgaWYgKGFjY2VwdENhdGVnb3J5KENPTU1BKSkgewogICAgICAgICAgdmFsdWVzLmFkZChuZXcgQXJyYXlIb2xlKCkpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChhY2NlcHRDYXRlZ29yeShSU1FVQVJFKSkgYnJlYWs7CiAgICAgICAgdmFsdWVzLmFkZChwYXJzZUFzc2lnbm1lbnQoKSk7CiAgICAgICAgaWYgKGFjY2VwdENhdGVnb3J5KFJTUVVBUkUpKSBicmVhazsKICAgICAgICBleHBlY3RDYXRlZ29yeShDT01NQSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBBcnJheUluaXRpYWxpemVyKHZhbHVlcyk7CiAgICB9IGVsc2UgaWYgKGxhc3QgIT0gbnVsbCAmJiBsYXN0LnN0YXJ0c1dpdGgoIi8iKSkgewogICAgICBTdHJpbmcgcmVnZXhwID0gZ2V0RGVsaW1pdGVkKGxhc3RQb3NpdGlvbik7CiAgICAgIGdldFRva2VuKCk7CiAgICAgIFN0cmluZyBmbGFncyA9IGxhc3RUb2tlbjsKICAgICAgaWYgKCFhY2NlcHRDYXRlZ29yeShBTFBIQSkpIGZsYWdzID0gIiI7CiAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG5ldyBSZWdFeHBMaXRlcmFsKHJlZ2V4cCArIGZsYWdzKTsKICAgICAgcmV0dXJuIGV4cHJlc3Npb247CiAgICB9IGVsc2UgaWYgKGFjY2VwdENhdGVnb3J5KEhBU0gpKSB7CiAgICAgIHZhciBuYW1lT3JQb3NpdGlvbiA9IHBhcnNlSGFzaCgpOwogICAgICBJbnRlcnBvbGF0ZWRFeHByZXNzaW9uIGV4cHJlc3Npb24gPQogICAgICAgICAgbmV3IEludGVycG9sYXRlZEV4cHJlc3Npb24obmFtZU9yUG9zaXRpb24pOwogICAgICBpbnRlcnBvbGF0ZWRWYWx1ZXMuYWRkKGV4cHJlc3Npb24pOwogICAgICByZXR1cm4gZXhwcmVzc2lvbjsKICAgIH0gZWxzZSB7CiAgICAgIGVycm9yKCJFeHBlY3RlZCBwcmltYXJ5IGV4cHJlc3Npb24iKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICBFeHByZXNzaW9uIHBhcnNlRnVuY3Rpb25FeHByZXNzaW9uKCkgewogICAgaWYgKGxhc3RDYXRlZ29yeSA9PSBBTFBIQSB8fCBsYXN0Q2F0ZWdvcnkgPT0gSEFTSCkgewogICAgICBEZWNsYXJhdGlvbiBuYW1lID0gcGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uKCk7CiAgICAgIHJldHVybiBuZXcgTmFtZWRGdW5jdGlvbihuYW1lLCBwYXJzZUZ1bigpKTsKICAgIH0KICAgIHJldHVybiBwYXJzZUZ1bigpOwogIH0KCiAgRXhwcmVzc2lvbiBwYXJzZUZ1bigpIHsKICAgIExpc3Q8UGFyYW1ldGVyPiBwYXJhbXMgPSA8UGFyYW1ldGVyPltdOwoKICAgIGV4cGVjdENhdGVnb3J5KExQQVJFTik7CiAgICBpZiAoIWFjY2VwdENhdGVnb3J5KFJQQVJFTikpIHsKICAgICAgZm9yICg7OykgewogICAgICAgIGlmIChhY2NlcHRDYXRlZ29yeShIQVNIKSkgewogICAgICAgICAgdmFyIG5hbWVPclBvc2l0aW9uID0gcGFyc2VIYXNoKCk7CiAgICAgICAgICBJbnRlcnBvbGF0ZWRQYXJhbWV0ZXIgcGFyYW1ldGVyID0KICAgICAgICAgICAgICBuZXcgSW50ZXJwb2xhdGVkUGFyYW1ldGVyKG5hbWVPclBvc2l0aW9uKTsKICAgICAgICAgIGludGVycG9sYXRlZFZhbHVlcy5hZGQocGFyYW1ldGVyKTsKICAgICAgICAgIHBhcmFtcy5hZGQocGFyYW1ldGVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgU3RyaW5nIGFyZ3VtZW50TmFtZSA9IGxhc3RUb2tlbjsKICAgICAgICAgIGV4cGVjdENhdGVnb3J5KEFMUEhBKTsKICAgICAgICAgIHBhcmFtcy5hZGQobmV3IFBhcmFtZXRlcihhcmd1bWVudE5hbWUpKTsKICAgICAgICB9CiAgICAgICAgaWYgKGFjY2VwdENhdGVnb3J5KENPTU1BKSkgY29udGludWU7CiAgICAgICAgZXhwZWN0Q2F0ZWdvcnkoUlBBUkVOKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgQXN5bmNNb2RpZmllciBhc3luY01vZGlmaWVyOwogICAgaWYgKGFjY2VwdFN0cmluZygnYXN5bmMnKSkgewogICAgICBpZiAoYWNjZXB0U3RyaW5nKCcqJykpIHsKICAgICAgICBhc3luY01vZGlmaWVyID0gY29uc3QgQXN5bmNNb2RpZmllci5hc3luY1N0YXIoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3luY01vZGlmaWVyID0gY29uc3QgQXN5bmNNb2RpZmllci5hc3luYygpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGFjY2VwdFN0cmluZygnc3luYycpKSB7CiAgICAgIGlmICghYWNjZXB0U3RyaW5nKCcqJykpIGVycm9yKCJPbmx5IHN5bmMqIGlzIHZhbGlkIC0gc3luYyBpcyBpbXBsaWVkIik7CiAgICAgIGFzeW5jTW9kaWZpZXIgPSBjb25zdCBBc3luY01vZGlmaWVyLnN5bmNTdGFyKCk7CiAgICB9IGVsc2UgewogICAgICBhc3luY01vZGlmaWVyID0gY29uc3QgQXN5bmNNb2RpZmllci5zeW5jKCk7CiAgICB9CiAgICBleHBlY3RDYXRlZ29yeShMQlJBQ0UpOwogICAgQmxvY2sgYmxvY2sgPSBwYXJzZUJsb2NrKCk7CiAgICByZXR1cm4gbmV3IEZ1bihwYXJhbXMsIGJsb2NrLCBhc3luY01vZGlmaWVyOiBhc3luY01vZGlmaWVyKTsKICB9CgogIEV4cHJlc3Npb24gcGFyc2VPYmplY3RJbml0aWFsaXplcigpIHsKICAgIExpc3Q8UHJvcGVydHk+IHByb3BlcnRpZXMgPSA8UHJvcGVydHk+W107CiAgICBmb3IgKDs7KSB7CiAgICAgIGlmIChhY2NlcHRDYXRlZ29yeShSQlJBQ0UpKSBicmVhazsKICAgICAgLy8gTGltaXRlZCBzdWJzZXQ6IGtleXMgYXJlIGlkZW50aWZpZXJzLCBubyAnZ2V0JyBvciAnc2V0JyBwcm9wZXJ0aWVzLgogICAgICBMaXRlcmFsIHByb3BlcnR5TmFtZTsKICAgICAgU3RyaW5nIGlkZW50aWZpZXIgPSBsYXN0VG9rZW47CiAgICAgIGlmIChhY2NlcHRDYXRlZ29yeShBTFBIQSkpIHsKICAgICAgICBwcm9wZXJ0eU5hbWUgPSBuZXcgTGl0ZXJhbFN0cmluZygnIiRpZGVudGlmaWVyIicpOwogICAgICB9IGVsc2UgaWYgKGFjY2VwdENhdGVnb3J5KFNUUklORykpIHsKICAgICAgICBwcm9wZXJ0eU5hbWUgPSBuZXcgTGl0ZXJhbFN0cmluZyhpZGVudGlmaWVyKTsKICAgICAgfSBlbHNlIGlmIChhY2NlcHRDYXRlZ29yeShTWU1CT0wpKSB7CiAgICAgICAgLy8gZS5nLiB2b2lkCiAgICAgICAgcHJvcGVydHlOYW1lID0gbmV3IExpdGVyYWxTdHJpbmcoJyIkaWRlbnRpZmllciInKTsKICAgICAgfSBlbHNlIGlmIChhY2NlcHRDYXRlZ29yeShIQVNIKSkgewogICAgICAgIHZhciBuYW1lT3JQb3NpdGlvbiA9IHBhcnNlSGFzaCgpOwogICAgICAgIEludGVycG9sYXRlZExpdGVyYWwgaW50ZXJwb2xhdGVkTGl0ZXJhbCA9CiAgICAgICAgICAgIG5ldyBJbnRlcnBvbGF0ZWRMaXRlcmFsKG5hbWVPclBvc2l0aW9uKTsKICAgICAgICBpbnRlcnBvbGF0ZWRWYWx1ZXMuYWRkKGludGVycG9sYXRlZExpdGVyYWwpOwogICAgICAgIHByb3BlcnR5TmFtZSA9IGludGVycG9sYXRlZExpdGVyYWw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZXJyb3IoJ0V4cGVjdGVkIHByb3BlcnR5IG5hbWUnKTsKICAgICAgfQogICAgICBleHBlY3RDYXRlZ29yeShDT0xPTik7CiAgICAgIEV4cHJlc3Npb24gdmFsdWUgPSBwYXJzZUFzc2lnbm1lbnQoKTsKICAgICAgcHJvcGVydGllcy5hZGQobmV3IFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUpKTsKICAgICAgaWYgKGFjY2VwdENhdGVnb3J5KFJCUkFDRSkpIGJyZWFrOwogICAgICBleHBlY3RDYXRlZ29yeShDT01NQSk7CiAgICB9CiAgICByZXR1cm4gbmV3IE9iamVjdEluaXRpYWxpemVyKHByb3BlcnRpZXMpOwogIH0KCiAgRXhwcmVzc2lvbiBwYXJzZU1lbWJlcigpIHsKICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIgPSBwYXJzZVByaW1hcnkoKTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmIChhY2NlcHRDYXRlZ29yeShET1QpKSB7CiAgICAgICAgcmVjZWl2ZXIgPSBnZXREb3RSaHMocmVjZWl2ZXIpOwogICAgICB9IGVsc2UgaWYgKGFjY2VwdENhdGVnb3J5KExTUVVBUkUpKSB7CiAgICAgICAgRXhwcmVzc2lvbiBpbkJyYWNlcyA9IHBhcnNlRXhwcmVzc2lvbigpOwogICAgICAgIGV4cGVjdENhdGVnb3J5KFJTUVVBUkUpOwogICAgICAgIHJlY2VpdmVyID0gbmV3IFByb3BlcnR5QWNjZXNzKHJlY2VpdmVyLCBpbkJyYWNlcyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZWNlaXZlcjsKICB9CgogIEV4cHJlc3Npb24gcGFyc2VDYWxsKCkgewogICAgYm9vbCBjb25zdHJ1Y3RvciA9IGFjY2VwdFN0cmluZygibmV3Iik7CiAgICBFeHByZXNzaW9uIHJlY2VpdmVyID0gcGFyc2VNZW1iZXIoKTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmIChhY2NlcHRDYXRlZ29yeShMUEFSRU4pKSB7CiAgICAgICAgZmluYWwgYXJndW1lbnRzID0gPEV4cHJlc3Npb24+W107CiAgICAgICAgaWYgKCFhY2NlcHRDYXRlZ29yeShSUEFSRU4pKSB7CiAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICBFeHByZXNzaW9uIGFyZ3VtZW50ID0gcGFyc2VBc3NpZ25tZW50KCk7CiAgICAgICAgICAgIGFyZ3VtZW50cy5hZGQoYXJndW1lbnQpOwogICAgICAgICAgICBpZiAoYWNjZXB0Q2F0ZWdvcnkoUlBBUkVOKSkgYnJlYWs7CiAgICAgICAgICAgIGV4cGVjdENhdGVnb3J5KENPTU1BKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmVjZWl2ZXIgPSBjb25zdHJ1Y3RvcgogICAgICAgICAgICA/IG5ldyBOZXcocmVjZWl2ZXIsIGFyZ3VtZW50cykKICAgICAgICAgICAgOiBuZXcgQ2FsbChyZWNlaXZlciwgYXJndW1lbnRzKTsKICAgICAgICBjb25zdHJ1Y3RvciA9IGZhbHNlOwogICAgICB9IGVsc2UgaWYgKCFjb25zdHJ1Y3RvciAmJiBhY2NlcHRDYXRlZ29yeShMU1FVQVJFKSkgewogICAgICAgIEV4cHJlc3Npb24gaW5CcmFjZXMgPSBwYXJzZUV4cHJlc3Npb24oKTsKICAgICAgICBleHBlY3RDYXRlZ29yeShSU1FVQVJFKTsKICAgICAgICByZWNlaXZlciA9IG5ldyBQcm9wZXJ0eUFjY2VzcyhyZWNlaXZlciwgaW5CcmFjZXMpOwogICAgICB9IGVsc2UgaWYgKCFjb25zdHJ1Y3RvciAmJiBhY2NlcHRDYXRlZ29yeShET1QpKSB7CiAgICAgICAgcmVjZWl2ZXIgPSBnZXREb3RSaHMocmVjZWl2ZXIpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEpTIGFsbG93cyBuZXcgd2l0aG91dCAoKSwgYnV0IHdlIGRvbid0LgogICAgICAgIGlmIChjb25zdHJ1Y3RvcikgZXJyb3IoIlBhcmVudGhlc2VzIGFyZSByZXF1aXJlZCBmb3IgbmV3Iik7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZWNlaXZlcjsKICB9CgogIEV4cHJlc3Npb24gZ2V0RG90UmhzKEV4cHJlc3Npb24gcmVjZWl2ZXIpIHsKICAgIGlmIChhY2NlcHRDYXRlZ29yeShIQVNIKSkgewogICAgICB2YXIgbmFtZU9yUG9zaXRpb24gPSBwYXJzZUhhc2goKTsKICAgICAgSW50ZXJwb2xhdGVkU2VsZWN0b3IgcHJvcGVydHkgPSBuZXcgSW50ZXJwb2xhdGVkU2VsZWN0b3IobmFtZU9yUG9zaXRpb24pOwogICAgICBpbnRlcnBvbGF0ZWRWYWx1ZXMuYWRkKHByb3BlcnR5KTsKICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUFjY2VzcyhyZWNlaXZlciwgcHJvcGVydHkpOwogICAgfQogICAgU3RyaW5nIGlkZW50aWZpZXIgPSBsYXN0VG9rZW47CiAgICAvLyBJbiBFUzUga2V5d29yZHMgbGlrZSBkZWxldGUgYW5kIGNvbnRpbnVlIGFyZSBhbGxvd2VkIGFzIHByb3BlcnR5CiAgICAvLyBuYW1lcywgYW5kIHRoZSBJbmRleGVkREIgQVBJIHVzZXMgdGhhdCwgc28gd2UgbmVlZCB0byBhbGxvdyBpdCBoZXJlLgogICAgaWYgKGFjY2VwdENhdGVnb3J5KFNZTUJPTCkpIHsKICAgICAgaWYgKCFPUEVSQVRPUlNfVEhBVF9MT09LX0xJS0VfSURFTlRJRklFUlMuY29udGFpbnMoaWRlbnRpZmllcikpIHsKICAgICAgICBlcnJvcigiRXhwZWN0ZWQgYWxwaGFudW1lcmljIGlkZW50aWZpZXIiKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZXhwZWN0Q2F0ZWdvcnkoQUxQSEEpOwogICAgfQogICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUFjY2Vzcy5maWVsZChyZWNlaXZlciwgaWRlbnRpZmllcik7CiAgfQoKICBFeHByZXNzaW9uIHBhcnNlUG9zdGZpeCgpIHsKICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBhcnNlQ2FsbCgpOwogICAgU3RyaW5nIG9wZXJhdG9yID0gbGFzdFRva2VuOwogICAgLy8gSmF2YVNjcmlwdCBncmFtbWFyIGlzOgogICAgLy8gICAgIExlZnRIYW5kU2lkZUV4cHJlc3Npb24gW25vIExpbmVUZXJtaW5hdG9yIGhlcmVdICsrCiAgICBpZiAobGFzdENhdGVnb3J5ID09IFNZTUJPTCAmJgogICAgICAgICFza2lwcGVkTmV3bGluZSAmJgogICAgICAgIChhY2NlcHRTdHJpbmcoIisrIikgfHwgYWNjZXB0U3RyaW5nKCItLSIpKSkgewogICAgICByZXR1cm4gbmV3IFBvc3RmaXgob3BlcmF0b3IsIGV4cHJlc3Npb24pOwogICAgfQogICAgLy8gSWYgd2UgZG9uJ3QgYWNjZXB0ICcrKycgb3IgJy0tJyBkdWUgdG8gc2tpcHBlZE5ld2xpbmUgYSBuZXdsaW5lLCBubyBvdGhlcgogICAgLy8gcGFydCBvZiB0aGUgcGFyc2VyIHdpbGwgYWNjZXB0IHRoZSB0b2tlbiBhbmQgd2Ugd2lsbCBnZXQgYW4gZXJyb3IgYXQgdGhlCiAgICAvLyB3aG9sZSBleHByZXNzaW9uIGxldmVsLgogICAgcmV0dXJuIGV4cHJlc3Npb247CiAgfQoKICBFeHByZXNzaW9uIHBhcnNlVW5hcnlIaWdoKCkgewogICAgU3RyaW5nIG9wZXJhdG9yID0gbGFzdFRva2VuOwogICAgaWYgKGxhc3RDYXRlZ29yeSA9PSBTWU1CT0wgJiYKICAgICAgICBVTkFSWV9PUEVSQVRPUlMuY29udGFpbnMob3BlcmF0b3IpICYmCiAgICAgICAgKGFjY2VwdFN0cmluZygiKysiKSB8fCBhY2NlcHRTdHJpbmcoIi0tIikgfHwgYWNjZXB0U3RyaW5nKCdhd2FpdCcpKSkgewogICAgICBpZiAob3BlcmF0b3IgPT0gImF3YWl0IikgcmV0dXJuIG5ldyBBd2FpdChwYXJzZVBvc3RmaXgoKSk7CiAgICAgIHJldHVybiBuZXcgUHJlZml4KG9wZXJhdG9yLCBwYXJzZVBvc3RmaXgoKSk7CiAgICB9CiAgICByZXR1cm4gcGFyc2VQb3N0Zml4KCk7CiAgfQoKICBFeHByZXNzaW9uIHBhcnNlVW5hcnlMb3coKSB7CiAgICBTdHJpbmcgb3BlcmF0b3IgPSBsYXN0VG9rZW47CiAgICBpZiAobGFzdENhdGVnb3J5ID09IFNZTUJPTCAmJgogICAgICAgIFVOQVJZX09QRVJBVE9SUy5jb250YWlucyhvcGVyYXRvcikgJiYKICAgICAgICBvcGVyYXRvciAhPSAiKysiICYmCiAgICAgICAgb3BlcmF0b3IgIT0gIi0tIikgewogICAgICBleHBlY3RDYXRlZ29yeShTWU1CT0wpOwogICAgICBpZiAob3BlcmF0b3IgPT0gImF3YWl0IikgcmV0dXJuIG5ldyBBd2FpdChwYXJzZVBvc3RmaXgoKSk7CiAgICAgIHJldHVybiBuZXcgUHJlZml4KG9wZXJhdG9yLCBwYXJzZVVuYXJ5TG93KCkpOwogICAgfQogICAgcmV0dXJuIHBhcnNlVW5hcnlIaWdoKCk7CiAgfQoKICBFeHByZXNzaW9uIHBhcnNlQmluYXJ5KGludCBtYXhQcmVjZWRlbmNlKSB7CiAgICBFeHByZXNzaW9uIGxocyA9IHBhcnNlVW5hcnlMb3coKTsKICAgIGludCBtaW5QcmVjZWRlbmNlOwogICAgU3RyaW5nIGxhc3RTeW1ib2w7CiAgICBFeHByZXNzaW9uIHJoczsgLy8gVGhpcyBpcyBudWxsIGZpcnN0IHRpbWUgYXJvdW5kLgogICAgd2hpbGUgKHRydWUpIHsKICAgICAgU3RyaW5nIHN5bWJvbCA9IGxhc3RUb2tlbjsKICAgICAgaWYgKGxhc3RDYXRlZ29yeSAhPSBTWU1CT0wgfHwKICAgICAgICAgICFCSU5BUllfUFJFQ0VERU5DRS5jb250YWluc0tleShzeW1ib2wpIHx8CiAgICAgICAgICBCSU5BUllfUFJFQ0VERU5DRVtzeW1ib2xdID4gbWF4UHJlY2VkZW5jZSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGV4cGVjdENhdGVnb3J5KFNZTUJPTCk7CiAgICAgIGlmIChyaHMgPT0gbnVsbCB8fCBCSU5BUllfUFJFQ0VERU5DRVtzeW1ib2xdID49IG1pblByZWNlZGVuY2UpIHsKICAgICAgICBpZiAocmhzICE9IG51bGwpIGxocyA9IG5ldyBCaW5hcnkobGFzdFN5bWJvbCwgbGhzLCByaHMpOwogICAgICAgIG1pblByZWNlZGVuY2UgPSBCSU5BUllfUFJFQ0VERU5DRVtzeW1ib2xdOwogICAgICAgIHJocyA9IHBhcnNlVW5hcnlMb3coKTsKICAgICAgICBsYXN0U3ltYm9sID0gc3ltYm9sOwogICAgICB9IGVsc2UgewogICAgICAgIEV4cHJlc3Npb24gaGlnaGVyID0gcGFyc2VCaW5hcnkoQklOQVJZX1BSRUNFREVOQ0Vbc3ltYm9sXSk7CiAgICAgICAgcmhzID0gbmV3IEJpbmFyeShzeW1ib2wsIHJocywgaGlnaGVyKTsKICAgICAgfQogICAgfQogICAgaWYgKHJocyA9PSBudWxsKSByZXR1cm4gbGhzOwogICAgcmV0dXJuIG5ldyBCaW5hcnkobGFzdFN5bWJvbCwgbGhzLCByaHMpOwogIH0KCiAgRXhwcmVzc2lvbiBwYXJzZUNvbmRpdGlvbmFsKCkgewogICAgRXhwcmVzc2lvbiBsaHMgPSBwYXJzZUJpbmFyeShISUdIRVNUX1BBUlNFX0JJTkFSWV9QUkVDRURFTkNFKTsKICAgIGlmICghYWNjZXB0Q2F0ZWdvcnkoUVVFUlkpKSByZXR1cm4gbGhzOwogICAgRXhwcmVzc2lvbiBpZlRydWUgPSBwYXJzZUFzc2lnbm1lbnQoKTsKICAgIGV4cGVjdENhdGVnb3J5KENPTE9OKTsKICAgIEV4cHJlc3Npb24gaWZGYWxzZSA9IHBhcnNlQXNzaWdubWVudCgpOwogICAgcmV0dXJuIG5ldyBDb25kaXRpb25hbChsaHMsIGlmVHJ1ZSwgaWZGYWxzZSk7CiAgfQoKICBFeHByZXNzaW9uIHBhcnNlQXNzaWdubWVudCgpIHsKICAgIEV4cHJlc3Npb24gbGhzID0gcGFyc2VDb25kaXRpb25hbCgpOwogICAgU3RyaW5nIGFzc2lnbm1lbnRPcGVyYXRvciA9IGxhc3RUb2tlbjsKICAgIGlmIChhY2NlcHRDYXRlZ29yeShBU1NJR05NRU5UKSkgewogICAgICBFeHByZXNzaW9uIHJocyA9IHBhcnNlQXNzaWdubWVudCgpOwogICAgICBpZiAoYXNzaWdubWVudE9wZXJhdG9yID09ICI9IikgewogICAgICAgIHJldHVybiBuZXcgQXNzaWdubWVudChsaHMsIHJocyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gSGFuZGxlICs9LCAtPSwgZXRjLgogICAgICAgIFN0cmluZyBvcGVyYXRvciA9CiAgICAgICAgICAgIGFzc2lnbm1lbnRPcGVyYXRvci5zdWJzdHJpbmcoMCwgYXNzaWdubWVudE9wZXJhdG9yLmxlbmd0aCAtIDEpOwogICAgICAgIHJldHVybiBuZXcgQXNzaWdubWVudC5jb21wb3VuZChsaHMsIG9wZXJhdG9yLCByaHMpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbGhzOwogIH0KCiAgRXhwcmVzc2lvbiBwYXJzZUV4cHJlc3Npb24oKSB7CiAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBwYXJzZUFzc2lnbm1lbnQoKTsKICAgIHdoaWxlIChhY2NlcHRDYXRlZ29yeShDT01NQSkpIHsKICAgICAgRXhwcmVzc2lvbiByaWdodCA9IHBhcnNlQXNzaWdubWVudCgpOwogICAgICBleHByZXNzaW9uID0gbmV3IEJpbmFyeSgnLCcsIGV4cHJlc3Npb24sIHJpZ2h0KTsKICAgIH0KICAgIHJldHVybiBleHByZXNzaW9uOwogIH0KCiAgVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QgcGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCgpIHsKICAgIERlY2xhcmF0aW9uIGZpcnN0VmFyaWFibGUgPSBwYXJzZVZhcmlhYmxlRGVjbGFyYXRpb24oKTsKICAgIHJldHVybiBmaW5pc2hWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChmaXJzdFZhcmlhYmxlKTsKICB9CgogIFZhcmlhYmxlRGVjbGFyYXRpb25MaXN0IGZpbmlzaFZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KAogICAgICBEZWNsYXJhdGlvbiBmaXJzdFZhcmlhYmxlKSB7CiAgICB2YXIgaW5pdGlhbGl6YXRpb24gPSA8VmFyaWFibGVJbml0aWFsaXphdGlvbj5bXTsKCiAgICB2b2lkIGRlY2xhcmUoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKICAgICAgRXhwcmVzc2lvbiBpbml0aWFsaXplciA9IG51bGw7CiAgICAgIGlmIChhY2NlcHRTdHJpbmcoIj0iKSkgewogICAgICAgIGluaXRpYWxpemVyID0gcGFyc2VBc3NpZ25tZW50KCk7CiAgICAgIH0KICAgICAgaW5pdGlhbGl6YXRpb24uYWRkKG5ldyBWYXJpYWJsZUluaXRpYWxpemF0aW9uKGRlY2xhcmF0aW9uLCBpbml0aWFsaXplcikpOwogICAgfQoKICAgIGRlY2xhcmUoZmlyc3RWYXJpYWJsZSk7CiAgICB3aGlsZSAoYWNjZXB0Q2F0ZWdvcnkoQ09NTUEpKSB7CiAgICAgIERlY2xhcmF0aW9uIHZhcmlhYmxlID0gcGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uKCk7CiAgICAgIGRlY2xhcmUodmFyaWFibGUpOwogICAgfQogICAgcmV0dXJuIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChpbml0aWFsaXphdGlvbik7CiAgfQoKICBFeHByZXNzaW9uIHBhcnNlVmFyRGVjbGFyYXRpb25PckV4cHJlc3Npb24oKSB7CiAgICBpZiAoYWNjZXB0U3RyaW5nKCJ2YXIiKSkgewogICAgICByZXR1cm4gcGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCgpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvbigpOwogICAgfQogIH0KCiAgRXhwcmVzc2lvbiBleHByZXNzaW9uKCkgewogICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcGFyc2VWYXJEZWNsYXJhdGlvbk9yRXhwcmVzc2lvbigpOwogICAgaWYgKGxhc3RDYXRlZ29yeSAhPSBOT05FIHx8IHBvc2l0aW9uICE9IHNyYy5sZW5ndGgpIHsKICAgICAgZXJyb3IoIlVucGFyc2VkIGp1bms6ICR7Y2F0ZWdvcnlUb1N0cmluZyhsYXN0Q2F0ZWdvcnkpfSIpOwogICAgfQogICAgcmV0dXJuIGV4cHJlc3Npb247CiAgfQoKICBTdGF0ZW1lbnQgc3RhdGVtZW50KCkgewogICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IHBhcnNlU3RhdGVtZW50KCk7CiAgICBpZiAobGFzdENhdGVnb3J5ICE9IE5PTkUgfHwgcG9zaXRpb24gIT0gc3JjLmxlbmd0aCkgewogICAgICBlcnJvcigiVW5wYXJzZWQganVuazogJHtjYXRlZ29yeVRvU3RyaW5nKGxhc3RDYXRlZ29yeSl9Iik7CiAgICB9CiAgICAvLyBUT0RPKHNyYSk6IGludGVycG9sYXRlZCBjYXB0dXJlIGhlcmU/CiAgICByZXR1cm4gc3RhdGVtZW50OwogIH0KCiAgQmxvY2sgcGFyc2VCbG9jaygpIHsKICAgIExpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzID0gPFN0YXRlbWVudD5bXTsKCiAgICB3aGlsZSAoIWFjY2VwdENhdGVnb3J5KFJCUkFDRSkpIHsKICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IHBhcnNlU3RhdGVtZW50KCk7CiAgICAgIHN0YXRlbWVudHMuYWRkKHN0YXRlbWVudCk7CiAgICB9CiAgICByZXR1cm4gbmV3IEJsb2NrKHN0YXRlbWVudHMpOwogIH0KCiAgU3RhdGVtZW50IHBhcnNlU3RhdGVtZW50KCkgewogICAgaWYgKGFjY2VwdENhdGVnb3J5KExCUkFDRSkpIHJldHVybiBwYXJzZUJsb2NrKCk7CgogICAgaWYgKGFjY2VwdENhdGVnb3J5KFNFTUlDT0xPTikpIHJldHVybiBuZXcgRW1wdHlTdGF0ZW1lbnQoKTsKCiAgICBpZiAobGFzdENhdGVnb3J5ID09IEFMUEhBKSB7CiAgICAgIGlmIChhY2NlcHRTdHJpbmcoJ3JldHVybicpKSByZXR1cm4gcGFyc2VSZXR1cm4oKTsKCiAgICAgIGlmIChhY2NlcHRTdHJpbmcoJ3Rocm93JykpIHJldHVybiBwYXJzZVRocm93KCk7CgogICAgICBpZiAoYWNjZXB0U3RyaW5nKCdicmVhaycpKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlQnJlYWtPckNvbnRpbnVlKChsYWJlbCkgPT4gbmV3IEJyZWFrKGxhYmVsKSk7CiAgICAgIH0KCiAgICAgIGlmIChhY2NlcHRTdHJpbmcoJ2NvbnRpbnVlJykpIHsKICAgICAgICByZXR1cm4gcGFyc2VCcmVha09yQ29udGludWUoKGxhYmVsKSA9PiBuZXcgQ29udGludWUobGFiZWwpKTsKICAgICAgfQoKICAgICAgaWYgKGFjY2VwdFN0cmluZygnaWYnKSkgcmV0dXJuIHBhcnNlSWZUaGVuRWxzZSgpOwoKICAgICAgaWYgKGFjY2VwdFN0cmluZygnZm9yJykpIHJldHVybiBwYXJzZUZvcigpOwoKICAgICAgaWYgKGFjY2VwdFN0cmluZygnZnVuY3Rpb24nKSkgcmV0dXJuIHBhcnNlRnVuY3Rpb25EZWNsYXJhdGlvbigpOwoKICAgICAgaWYgKGFjY2VwdFN0cmluZygndHJ5JykpIHJldHVybiBwYXJzZVRyeSgpOwoKICAgICAgaWYgKGFjY2VwdFN0cmluZygndmFyJykpIHsKICAgICAgICBFeHByZXNzaW9uIGRlY2xhcmF0aW9ucyA9IHBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoKTsKICAgICAgICBleHBlY3RTZW1pY29sb24oKTsKICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoZGVjbGFyYXRpb25zKTsKICAgICAgfQoKICAgICAgaWYgKGFjY2VwdFN0cmluZygnd2hpbGUnKSkgcmV0dXJuIHBhcnNlV2hpbGUoKTsKCiAgICAgIGlmIChhY2NlcHRTdHJpbmcoJ2RvJykpIHJldHVybiBwYXJzZURvKCk7CgogICAgICBpZiAoYWNjZXB0U3RyaW5nKCdzd2l0Y2gnKSkgcmV0dXJuIHBhcnNlU3dpdGNoKCk7CgogICAgICBpZiAobGFzdFRva2VuID09ICdjYXNlJykgZXJyb3IoIkNhc2Ugb3V0c2lkZSBzd2l0Y2guIik7CgogICAgICBpZiAobGFzdFRva2VuID09ICdkZWZhdWx0JykgZXJyb3IoIkRlZmF1bHQgb3V0c2lkZSBzd2l0Y2guIik7CgogICAgICBpZiAobGFzdFRva2VuID09ICd5aWVsZCcpIHJldHVybiBwYXJzZVlpZWxkKCk7CgogICAgICBpZiAobGFzdFRva2VuID09ICd3aXRoJykgewogICAgICAgIGVycm9yKCdOb3QgaW1wbGVtZW50ZWQgaW4gbWluaSBwYXJzZXInKTsKICAgICAgfQogICAgfQoKICAgIGJvb2wgY2hlY2tGb3JJbnRlcnBvbGF0ZWRTdGF0ZW1lbnQgPSBsYXN0Q2F0ZWdvcnkgPT0gSEFTSDsKCiAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBwYXJzZUV4cHJlc3Npb24oKTsKCiAgICBpZiAoZXhwcmVzc2lvbiBpcyBWYXJpYWJsZVVzZSAmJiBhY2NlcHRDYXRlZ29yeShDT0xPTikpIHsKICAgICAgcmV0dXJuIG5ldyBMYWJlbGVkU3RhdGVtZW50KGV4cHJlc3Npb24ubmFtZSwgcGFyc2VTdGF0ZW1lbnQoKSk7CiAgICB9CgogICAgZXhwZWN0U2VtaWNvbG9uKCk7CgogICAgaWYgKGNoZWNrRm9ySW50ZXJwb2xhdGVkU3RhdGVtZW50KSB7CiAgICAgIC8vICdQcm9tb3RlJyB0aGUgaW50ZXJwb2xhdGVkIGV4cHJlc3Npb24gYCM7YCB0byBhbiBpbnRlcnBvbGF0ZWQKICAgICAgLy8gc3RhdGVtZW50LgogICAgICBpZiAoZXhwcmVzc2lvbiBpcyBJbnRlcnBvbGF0ZWRFeHByZXNzaW9uKSB7CiAgICAgICAgYXNzZXJ0KGlkZW50aWNhbChpbnRlcnBvbGF0ZWRWYWx1ZXMubGFzdCwgZXhwcmVzc2lvbikpOwogICAgICAgIEludGVycG9sYXRlZFN0YXRlbWVudCBzdGF0ZW1lbnQgPQogICAgICAgICAgICBuZXcgSW50ZXJwb2xhdGVkU3RhdGVtZW50KGV4cHJlc3Npb24ubmFtZU9yUG9zaXRpb24pOwogICAgICAgIGludGVycG9sYXRlZFZhbHVlc1tpbnRlcnBvbGF0ZWRWYWx1ZXMubGVuZ3RoIC0gMV0gPSBzdGF0ZW1lbnQ7CiAgICAgICAgcmV0dXJuIHN0YXRlbWVudDsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBuZXcgRXhwcmVzc2lvblN0YXRlbWVudChleHByZXNzaW9uKTsKICB9CgogIFN0YXRlbWVudCBwYXJzZVJldHVybigpIHsKICAgIGlmIChhY2NlcHRTZW1pY29sb24oKSkgcmV0dXJuIG5ldyBSZXR1cm4oKTsKICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBhcnNlRXhwcmVzc2lvbigpOwogICAgZXhwZWN0U2VtaWNvbG9uKCk7CiAgICByZXR1cm4gbmV3IFJldHVybihleHByZXNzaW9uKTsKICB9CgogIFN0YXRlbWVudCBwYXJzZVlpZWxkKCkgewogICAgYm9vbCBoYXNTdGFyID0gYWNjZXB0U3RyaW5nKCcqJyk7CiAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBwYXJzZUV4cHJlc3Npb24oKTsKICAgIGV4cGVjdFNlbWljb2xvbigpOwogICAgcmV0dXJuIG5ldyBEYXJ0WWllbGQoZXhwcmVzc2lvbiwgaGFzU3Rhcik7CiAgfQoKICBTdGF0ZW1lbnQgcGFyc2VUaHJvdygpIHsKICAgIGlmIChza2lwcGVkTmV3bGluZSkgZXJyb3IoJ3Rocm93IGV4cHJlc3Npb24gbXVzdCBiZSBvbiBzYW1lIGxpbmUnKTsKICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBhcnNlRXhwcmVzc2lvbigpOwogICAgZXhwZWN0U2VtaWNvbG9uKCk7CiAgICByZXR1cm4gbmV3IFRocm93KGV4cHJlc3Npb24pOwogIH0KCiAgU3RhdGVtZW50IHBhcnNlQnJlYWtPckNvbnRpbnVlKGNvbnN0cnVjdG9yKSB7CiAgICB2YXIgaWRlbnRpZmllciA9IGxhc3RUb2tlbjsKICAgIGlmICghc2tpcHBlZE5ld2xpbmUgJiYgYWNjZXB0Q2F0ZWdvcnkoQUxQSEEpKSB7CiAgICAgIGV4cGVjdFNlbWljb2xvbigpOwogICAgICByZXR1cm4gY29uc3RydWN0b3IoaWRlbnRpZmllcik7CiAgICB9CiAgICBleHBlY3RTZW1pY29sb24oKTsKICAgIHJldHVybiBjb25zdHJ1Y3RvcihudWxsKTsKICB9CgogIFN0YXRlbWVudCBwYXJzZUlmVGhlbkVsc2UoKSB7CiAgICBleHBlY3RDYXRlZ29yeShMUEFSRU4pOwogICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPSBwYXJzZUV4cHJlc3Npb24oKTsKICAgIGV4cGVjdENhdGVnb3J5KFJQQVJFTik7CiAgICBTdGF0ZW1lbnQgdGhlblN0YXRlbWVudCA9IHBhcnNlU3RhdGVtZW50KCk7CiAgICBpZiAoYWNjZXB0U3RyaW5nKCdlbHNlJykpIHsKICAgICAgLy8gUmVzb2x2ZXMgZGFuZ2xpbmcgZWxzZSBieSBiaW5kaW5nICdlbHNlJyB0byBjbG9zZXN0ICdpZicuCiAgICAgIFN0YXRlbWVudCBlbHNlU3RhdGVtZW50ID0gcGFyc2VTdGF0ZW1lbnQoKTsKICAgICAgcmV0dXJuIG5ldyBJZihjb25kaXRpb24sIHRoZW5TdGF0ZW1lbnQsIGVsc2VTdGF0ZW1lbnQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBJZi5ub0Vsc2UoY29uZGl0aW9uLCB0aGVuU3RhdGVtZW50KTsKICAgIH0KICB9CgogIFN0YXRlbWVudCBwYXJzZUZvcigpIHsKICAgIC8vIEZvci1pbml0LWNvbmRpdGlvbi1pbmNyZW1lbnQgc3R5bGUgbG9vcHMgYXJlIGZ1bGx5IHN1cHBvcnRlZC4KICAgIC8vCiAgICAvLyBPbmx5IG9uZSBmb3ItaW4gdmFyaWFudCBpcyBjdXJyZW50bHkgaW1wbGVtZW50ZWQ6CiAgICAvLwogICAgLy8gICAgIGZvciAodmFyIHZhcmlhYmxlIGluIEV4cHJlc3Npb24pIFN0YXRlbWVudAogICAgLy8KICAgIFN0YXRlbWVudCBmaW5pc2hGb3IoRXhwcmVzc2lvbiBpbml0KSB7CiAgICAgIEV4cHJlc3Npb24gY29uZGl0aW9uID0gbnVsbDsKICAgICAgaWYgKCFhY2NlcHRDYXRlZ29yeShTRU1JQ09MT04pKSB7CiAgICAgICAgY29uZGl0aW9uID0gcGFyc2VFeHByZXNzaW9uKCk7CiAgICAgICAgZXhwZWN0Q2F0ZWdvcnkoU0VNSUNPTE9OKTsKICAgICAgfQogICAgICBFeHByZXNzaW9uIHVwZGF0ZSA9IG51bGw7CiAgICAgIGlmICghYWNjZXB0Q2F0ZWdvcnkoUlBBUkVOKSkgewogICAgICAgIHVwZGF0ZSA9IHBhcnNlRXhwcmVzc2lvbigpOwogICAgICAgIGV4cGVjdENhdGVnb3J5KFJQQVJFTik7CiAgICAgIH0KICAgICAgU3RhdGVtZW50IGJvZHkgPSBwYXJzZVN0YXRlbWVudCgpOwogICAgICByZXR1cm4gbmV3IEZvcihpbml0LCBjb25kaXRpb24sIHVwZGF0ZSwgYm9keSk7CiAgICB9CgogICAgZXhwZWN0Q2F0ZWdvcnkoTFBBUkVOKTsKICAgIGlmIChhY2NlcHRDYXRlZ29yeShTRU1JQ09MT04pKSB7CiAgICAgIHJldHVybiBmaW5pc2hGb3IobnVsbCk7CiAgICB9CgogICAgaWYgKGFjY2VwdFN0cmluZygndmFyJykpIHsKICAgICAgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBwYXJzZVZhcmlhYmxlRGVjbGFyYXRpb24oKTsKICAgICAgaWYgKGFjY2VwdFN0cmluZygnaW4nKSkgewogICAgICAgIEV4cHJlc3Npb24gb2JqZWN0RXhwcmVzc2lvbiA9IHBhcnNlRXhwcmVzc2lvbigpOwogICAgICAgIGV4cGVjdENhdGVnb3J5KFJQQVJFTik7CiAgICAgICAgU3RhdGVtZW50IGJvZHkgPSBwYXJzZVN0YXRlbWVudCgpOwogICAgICAgIHJldHVybiBuZXcgRm9ySW4oCiAgICAgICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCgKICAgICAgICAgICAgICAgIFtuZXcgVmFyaWFibGVJbml0aWFsaXphdGlvbihkZWNsYXJhdGlvbiwgbnVsbCldKSwKICAgICAgICAgICAgb2JqZWN0RXhwcmVzc2lvbiwKICAgICAgICAgICAgYm9keSk7CiAgICAgIH0KICAgICAgRXhwcmVzc2lvbiBkZWNsYXJhdGlvbnMgPSBmaW5pc2hWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChkZWNsYXJhdGlvbik7CiAgICAgIGV4cGVjdENhdGVnb3J5KFNFTUlDT0xPTik7CiAgICAgIHJldHVybiBmaW5pc2hGb3IoZGVjbGFyYXRpb25zKTsKICAgIH0KCiAgICBFeHByZXNzaW9uIGluaXQgPSBwYXJzZUV4cHJlc3Npb24oKTsKICAgIGV4cGVjdENhdGVnb3J5KFNFTUlDT0xPTik7CiAgICByZXR1cm4gZmluaXNoRm9yKGluaXQpOwogIH0KCiAgRGVjbGFyYXRpb24gcGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uKCkgewogICAgaWYgKGFjY2VwdENhdGVnb3J5KEhBU0gpKSB7CiAgICAgIHZhciBuYW1lT3JQb3NpdGlvbiA9IHBhcnNlSGFzaCgpOwogICAgICBJbnRlcnBvbGF0ZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9CiAgICAgICAgICBuZXcgSW50ZXJwb2xhdGVkRGVjbGFyYXRpb24obmFtZU9yUG9zaXRpb24pOwogICAgICBpbnRlcnBvbGF0ZWRWYWx1ZXMuYWRkKGRlY2xhcmF0aW9uKTsKICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uOwogICAgfSBlbHNlIHsKICAgICAgU3RyaW5nIHRva2VuID0gbGFzdFRva2VuOwogICAgICBleHBlY3RDYXRlZ29yeShBTFBIQSk7CiAgICAgIHJldHVybiBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbih0b2tlbik7CiAgICB9CiAgfQoKICBTdGF0ZW1lbnQgcGFyc2VGdW5jdGlvbkRlY2xhcmF0aW9uKCkgewogICAgRGVjbGFyYXRpb24gbmFtZSA9IHBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbigpOwogICAgRXhwcmVzc2lvbiBmdW4gPSBwYXJzZUZ1bigpOwogICAgcmV0dXJuIG5ldyBGdW5jdGlvbkRlY2xhcmF0aW9uKG5hbWUsIGZ1bik7CiAgfQoKICBTdGF0ZW1lbnQgcGFyc2VUcnkoKSB7CiAgICBleHBlY3RDYXRlZ29yeShMQlJBQ0UpOwogICAgQmxvY2sgYm9keSA9IHBhcnNlQmxvY2soKTsKICAgIENhdGNoIGNhdGNoUGFydCA9IG51bGw7CiAgICBpZiAoYWNjZXB0U3RyaW5nKCdjYXRjaCcpKSBjYXRjaFBhcnQgPSBwYXJzZUNhdGNoKCk7CiAgICBCbG9jayBmaW5hbGx5UGFydCA9IG51bGw7CiAgICBpZiAoYWNjZXB0U3RyaW5nKCdmaW5hbGx5JykpIHsKICAgICAgZXhwZWN0Q2F0ZWdvcnkoTEJSQUNFKTsKICAgICAgZmluYWxseVBhcnQgPSBwYXJzZUJsb2NrKCk7CiAgICB9IGVsc2UgewogICAgICBpZiAoY2F0Y2hQYXJ0ID09IG51bGwpIGVycm9yKCJleHBlY3RlZCAnZmluYWxseSciKTsKICAgIH0KICAgIHJldHVybiBuZXcgVHJ5KGJvZHksIGNhdGNoUGFydCwgZmluYWxseVBhcnQpOwogIH0KCiAgU3dpdGNoQ2xhdXNlIHBhcnNlU3dpdGNoQ2xhdXNlKCkgewogICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gbnVsbDsKICAgIGlmIChhY2NlcHRTdHJpbmcoJ2Nhc2UnKSkgewogICAgICBleHByZXNzaW9uID0gcGFyc2VFeHByZXNzaW9uKCk7CiAgICAgIGV4cGVjdENhdGVnb3J5KENPTE9OKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICghYWNjZXB0U3RyaW5nKCdkZWZhdWx0JykpIHsKICAgICAgICBlcnJvcignZXhwZWN0ZWQgY2FzZSBvciBkZWZhdWx0Jyk7CiAgICAgIH0KICAgICAgZXhwZWN0Q2F0ZWdvcnkoQ09MT04pOwogICAgfQogICAgTGlzdCBzdGF0ZW1lbnRzID0gbmV3IExpc3Q8U3RhdGVtZW50PigpOwogICAgd2hpbGUgKGxhc3RDYXRlZ29yeSAhPSBSQlJBQ0UgJiYKICAgICAgICBsYXN0VG9rZW4gIT0gJ2Nhc2UnICYmCiAgICAgICAgbGFzdFRva2VuICE9ICdkZWZhdWx0JykgewogICAgICBzdGF0ZW1lbnRzLmFkZChwYXJzZVN0YXRlbWVudCgpKTsKICAgIH0KICAgIHJldHVybiBleHByZXNzaW9uID09IG51bGwKICAgICAgICA/IG5ldyBEZWZhdWx0KG5ldyBCbG9jayhzdGF0ZW1lbnRzKSkKICAgICAgICA6IG5ldyBDYXNlKGV4cHJlc3Npb24sIG5ldyBCbG9jayhzdGF0ZW1lbnRzKSk7CiAgfQoKICBTdGF0ZW1lbnQgcGFyc2VXaGlsZSgpIHsKICAgIGV4cGVjdENhdGVnb3J5KExQQVJFTik7CiAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiA9IHBhcnNlRXhwcmVzc2lvbigpOwogICAgZXhwZWN0Q2F0ZWdvcnkoUlBBUkVOKTsKICAgIFN0YXRlbWVudCBib2R5ID0gcGFyc2VTdGF0ZW1lbnQoKTsKICAgIHJldHVybiBuZXcgV2hpbGUoY29uZGl0aW9uLCBib2R5KTsKICB9CgogIFN0YXRlbWVudCBwYXJzZURvKCkgewogICAgU3RhdGVtZW50IGJvZHkgPSBwYXJzZVN0YXRlbWVudCgpOwogICAgaWYgKGxhc3RUb2tlbiAhPSAid2hpbGUiKSBlcnJvcigiTWlzc2luZyB3aGlsZSBhZnRlciBkbyBib2R5LiIpOwogICAgZ2V0VG9rZW4oKTsKICAgIGV4cGVjdENhdGVnb3J5KExQQVJFTik7CiAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiA9IHBhcnNlRXhwcmVzc2lvbigpOwogICAgZXhwZWN0Q2F0ZWdvcnkoUlBBUkVOKTsKICAgIGV4cGVjdFNlbWljb2xvbigpOwogICAgcmV0dXJuIG5ldyBEbyhib2R5LCBjb25kaXRpb24pOwogIH0KCiAgU3RhdGVtZW50IHBhcnNlU3dpdGNoKCkgewogICAgZXhwZWN0Q2F0ZWdvcnkoTFBBUkVOKTsKICAgIEV4cHJlc3Npb24ga2V5ID0gcGFyc2VFeHByZXNzaW9uKCk7CiAgICBleHBlY3RDYXRlZ29yeShSUEFSRU4pOwogICAgZXhwZWN0Q2F0ZWdvcnkoTEJSQUNFKTsKICAgIExpc3Q8U3dpdGNoQ2xhdXNlPiBjbGF1c2VzID0gbmV3IExpc3Q8U3dpdGNoQ2xhdXNlPigpOwogICAgd2hpbGUgKGxhc3RDYXRlZ29yeSAhPSBSQlJBQ0UpIHsKICAgICAgY2xhdXNlcy5hZGQocGFyc2VTd2l0Y2hDbGF1c2UoKSk7CiAgICB9CiAgICBleHBlY3RDYXRlZ29yeShSQlJBQ0UpOwogICAgcmV0dXJuIG5ldyBTd2l0Y2goa2V5LCBjbGF1c2VzKTsKICB9CgogIENhdGNoIHBhcnNlQ2F0Y2goKSB7CiAgICBleHBlY3RDYXRlZ29yeShMUEFSRU4pOwogICAgRGVjbGFyYXRpb24gZXJyb3JOYW1lID0gcGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uKCk7CiAgICBleHBlY3RDYXRlZ29yeShSUEFSRU4pOwogICAgZXhwZWN0Q2F0ZWdvcnkoTEJSQUNFKTsKICAgIEJsb2NrIGJvZHkgPSBwYXJzZUJsb2NrKCk7CiAgICByZXR1cm4gbmV3IENhdGNoKGVycm9yTmFtZSwgYm9keSk7CiAgfQp9CgpjbGFzcyBfSW50ZXJsZWF2ZUl0ZXJhdG9yPFQgZXh0ZW5kcyBOb2RlPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPFQ+IHsKICBJdGVyYXRvcjxUPiBzb3VyY2U7CiAgVCBzZXBhcmF0b3I7CiAgYm9vbCBpc05leHRTZXBhcmF0b3IgPSBmYWxzZTsKICBib29sIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKCiAgX0ludGVybGVhdmVJdGVyYXRvcih0aGlzLnNvdXJjZSwgdGhpcy5zZXBhcmF0b3IpOwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKCFpc0luaXRpYWxpemVkKSB7CiAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICByZXR1cm4gc291cmNlLm1vdmVOZXh0KCk7CiAgICB9IGVsc2UgaWYgKGlzTmV4dFNlcGFyYXRvcikgewogICAgICBpc05leHRTZXBhcmF0b3IgPSBmYWxzZTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gaXNOZXh0U2VwYXJhdG9yID0gc291cmNlLm1vdmVOZXh0KCk7CiAg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BzYHKyMoJyMIICUkIAgpNQYBHCUeBgEfPCA5ICsaKUIeEwhMISYGASkfHAQBKyAoLDcrGg0gHS0GBAEpMyEvBAEZHB8cOR4jHiINOgYyBAElIiAmHQ0mKwgdBi0lHyIoBh4tNwQBGxwuHCcnBAEYJ0UQHC4cFyQEARwcKBwcOyUoBhwlBAEXHDgcHB8nBAIBQxYPIB4BNAEUGhwgIh8TDTIGBAESKxsEAgFEFg8BNAEdQwQCAR9wYWNrYWdlOmpzX2FzdC9zcmMvYnVpbGRlci5kYXJ0NHNka3Jvb3Q6L3BrZy9qc19hc3QvbGliL3NyYy9lcXVpdmFsZW5jZV92aXNpdG9yLmRhcnTAAEAhLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YganNfYXN0OwoKLy8vIFZpc2l0b3IgdGhhdCBjb21wdXRlcyB3aGV0aGVyIHR3byBbTm9kZV1zIGFyZSBzdHJ1Y3R1cmFsbHkgZXF1aXZhbGVudC4KY2xhc3MgRXF1aXZhbGVuY2VWaXNpdG9yIGltcGxlbWVudHMgTm9kZVZpc2l0b3IxPGJvb2wsIE5vZGU+IHsKICBjb25zdCBFcXVpdmFsZW5jZVZpc2l0b3IoKTsKCiAgLy8vIENhbGxlZCB3aGVuIFtub2RlMV0gYW5kIFtub2RlMl0gYXJlIG5vdCBlcXVpdmFsZW50LgogIC8vLwogIC8vLyBPdmVycmlkZSB0aGlzIHRvIGNvbGxlY3Qgb3IgcmVwb3J0IGluZm9ybWF0aW9uIG9uIHRoZSBpbmVxdWl2YWxlbnQgbm9kZXMuCiAgYm9vbCBmYWlsQXQoTm9kZSBub2RlMSwgTm9kZSBub2RlMikgPT4gZmFsc2U7CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgdGhlIG5vbi1ub2RlIHZhbHVlcyBbdmFsdWUxXSBhbmQgW3ZhbHVlMl0gYXJlIGVxdWl2YWxlbnQuCiAgYm9vbCB0ZXN0VmFsdWVzKE5vZGUgbm9kZTEsIE9iamVjdCB2YWx1ZTEsIE5vZGUgbm9kZTIsIE9iamVjdCB2YWx1ZTIpID0+CiAgICAgIHZhbHVlMSA9PSB2YWx1ZTI7CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgdGhlIGxhYmVscyBbbGFiZWwxXSBhbmQgW2xhYmVsMl0gYXJlIGVxdWl2YWxlbnQuCiAgYm9vbCB0ZXN0TGFiZWxzKE5vZGUgbm9kZTEsIFN0cmluZyBsYWJlbDEsIE5vZGUgbm9kZTIsIFN0cmluZyBsYWJlbDIpID0+CiAgICAgIGxhYmVsMSA9PSBsYWJlbDI7CgogIGJvb2wgdGVzdE5vZGVzKE5vZGUgbm9kZTEsIE5vZGUgbm9kZTIpIHsKICAgIGlmIChpZGVudGljYWwobm9kZTEsIG5vZGUyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAobm9kZTEgPT0gbnVsbCB8fCBub2RlMiA9PSBudWxsKSByZXR1cm4gZmFpbEF0KG5vZGUxLCBub2RlMik7CiAgICByZXR1cm4gbm9kZTEuYWNjZXB0MSh0aGlzLCBub2RlMik7CiAgfQoKICBib29sIHRlc3ROb2RlTGlzdHMoTGlzdDxOb2RlPiBsaXN0MSwgTGlzdDxOb2RlPiBsaXN0MikgewogICAgaW50IGluZGV4ID0gMDsKICAgIHdoaWxlIChpbmRleCA8IGxpc3QxLmxlbmd0aCAmJiBpbmRleCA8IGxpc3QyLmxlbmd0aCkgewogICAgICBpZiAoIXRlc3ROb2RlcyhsaXN0MVtpbmRleF0sIGxpc3QyW2luZGV4XSkpIHJldHVybiBmYWxzZTsKICAgICAgaW5kZXgrKzsKICAgIH0KICAgIGlmIChpbmRleCA8IGxpc3QxLmxlbmd0aCkgewogICAgICByZXR1cm4gZmFpbEF0KGxpc3QxW2luZGV4XSwgbnVsbCk7CiAgICB9IGVsc2UgaWYgKGluZGV4IDwgbGlzdDIubGVuZ3RoKSB7CiAgICAgIHJldHVybiBmYWlsQXQobGlzdDJbaW5kZXhdLCBudWxsKTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFByb2dyYW0oUHJvZ3JhbSBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgUHJvZ3JhbSkgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgUHJvZ3JhbSBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0Tm9kZUxpc3RzKG5vZGUuYm9keSwgb3RoZXIuYm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0SW50ZXJwb2xhdGVkRGVjbGFyYXRpb24oSW50ZXJwb2xhdGVkRGVjbGFyYXRpb24gbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIEludGVycG9sYXRlZERlY2xhcmF0aW9uKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBJbnRlcnBvbGF0ZWREZWNsYXJhdGlvbiBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0VmFsdWVzKG5vZGUsIG5vZGUubmFtZU9yUG9zaXRpb24sIG90aGVyLCBvdGhlci5uYW1lT3JQb3NpdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0SW50ZXJwb2xhdGVkU3RhdGVtZW50KEludGVycG9sYXRlZFN0YXRlbWVudCBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgSW50ZXJwb2xhdGVkU3RhdGVtZW50KSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBJbnRlcnBvbGF0ZWRTdGF0ZW1lbnQgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdFZhbHVlcyhub2RlLCBub2RlLm5hbWVPclBvc2l0aW9uLCBvdGhlciwgb3RoZXIubmFtZU9yUG9zaXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEludGVycG9sYXRlZFNlbGVjdG9yKEludGVycG9sYXRlZFNlbGVjdG9yIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBJbnRlcnBvbGF0ZWRTZWxlY3RvcikgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgSW50ZXJwb2xhdGVkU2VsZWN0b3Igb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdFZhbHVlcyhub2RlLCBub2RlLm5hbWVPclBvc2l0aW9uLCBvdGhlciwgb3RoZXIubmFtZU9yUG9zaXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEludGVycG9sYXRlZFBhcmFtZXRlcihJbnRlcnBvbGF0ZWRQYXJhbWV0ZXIgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIEludGVycG9sYXRlZFBhcmFtZXRlcikgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgSW50ZXJwb2xhdGVkUGFyYW1ldGVyIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3RWYWx1ZXMobm9kZSwgbm9kZS5uYW1lT3JQb3NpdGlvbiwgb3RoZXIsIG90aGVyLm5hbWVPclBvc2l0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJbnRlcnBvbGF0ZWRMaXRlcmFsKEludGVycG9sYXRlZExpdGVyYWwgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIEludGVycG9sYXRlZExpdGVyYWwpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIEludGVycG9sYXRlZExpdGVyYWwgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdFZhbHVlcyhub2RlLCBub2RlLm5hbWVPclBvc2l0aW9uLCBvdGhlciwgb3RoZXIubmFtZU9yUG9zaXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEludGVycG9sYXRlZEV4cHJlc3Npb24oSW50ZXJwb2xhdGVkRXhwcmVzc2lvbiBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgSW50ZXJwb2xhdGVkRXhwcmVzc2lvbikgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgSW50ZXJwb2xhdGVkRXhwcmVzc2lvbiBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0VmFsdWVzKG5vZGUsIG5vZGUubmFtZU9yUG9zaXRpb24sIG90aGVyLCBvdGhlci5uYW1lT3JQb3NpdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0Q29tbWVudChDb21tZW50IG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBDb21tZW50KSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBDb21tZW50IG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3RWYWx1ZXMobm9kZSwgbm9kZS5jb21tZW50LCBvdGhlciwgb3RoZXIuY29tbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0QXdhaXQoQXdhaXQgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIEF3YWl0KSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBBd2FpdCBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0Tm9kZXMobm9kZS5leHByZXNzaW9uLCBvdGhlci5leHByZXNzaW9uKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRSZWdFeHBMaXRlcmFsKFJlZ0V4cExpdGVyYWwgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIFJlZ0V4cExpdGVyYWwpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIFJlZ0V4cExpdGVyYWwgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdFZhbHVlcyhub2RlLCBub2RlLnBhdHRlcm4sIG90aGVyLCBvdGhlci5wYXR0ZXJuKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRQcm9wZXJ0eShQcm9wZXJ0eSBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgUHJvcGVydHkpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIFByb3BlcnR5IG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3ROb2Rlcyhub2RlLm5hbWUsIG90aGVyLm5hbWUpICYmCiAgICAgICAgdGVzdE5vZGVzKG5vZGUudmFsdWUsIG90aGVyLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRPYmplY3RJbml0aWFsaXplcihPYmplY3RJbml0aWFsaXplciBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgT2JqZWN0SW5pdGlhbGl6ZXIpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIE9iamVjdEluaXRpYWxpemVyIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3ROb2RlTGlzdHMobm9kZS5wcm9wZXJ0aWVzLCBvdGhlci5wcm9wZXJ0aWVzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRBcnJheUhvbGUoQXJyYXlIb2xlIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBBcnJheUhvbGUpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEFycmF5SW5pdGlhbGl6ZXIoQXJyYXlJbml0aWFsaXplciBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgQXJyYXlJbml0aWFsaXplcikgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgQXJyYXlJbml0aWFsaXplciBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0Tm9kZUxpc3RzKG5vZGUuZWxlbWVudHMsIG90aGVyLmVsZW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXROYW1lKE5hbWUgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIE5hbWUpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIE5hbWUgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdFZhbHVlcyhub2RlLCBub2RlLmtleSwgb3RoZXIsIG90aGVyLmtleSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0UGFyZW50aGVzZXMoUGFyZW50aGVzZXMgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIFBhcmVudGhlc2VzKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBQYXJlbnRoZXNlcyBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0VmFsdWVzKG5vZGUsIG5vZGUuZW5jbG9zZWQsIG90aGVyLCBvdGhlci5lbmNsb3NlZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0U3RyaW5nQ29uY2F0ZW5hdGlvbihTdHJpbmdDb25jYXRlbmF0aW9uIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBTdHJpbmdDb25jYXRlbmF0aW9uKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBTdHJpbmdDb25jYXRlbmF0aW9uIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3ROb2RlTGlzdHMobm9kZS5wYXJ0cywgb3RoZXIucGFydHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdExpdGVyYWxOdWxsKExpdGVyYWxOdWxsIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBMaXRlcmFsTnVsbCkgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0TGl0ZXJhbE51bWJlcihMaXRlcmFsTnVtYmVyIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBMaXRlcmFsTnVtYmVyKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBMaXRlcmFsTnVtYmVyIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3RWYWx1ZXMobm9kZSwgbm9kZS52YWx1ZSwgb3RoZXIsIG90aGVyLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRMaXRlcmFsU3RyaW5nKExpdGVyYWxTdHJpbmcgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIExpdGVyYWxTdHJpbmcpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIExpdGVyYWxTdHJpbmcgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdFZhbHVlcyhub2RlLCBub2RlLnZhbHVlLCBvdGhlciwgb3RoZXIudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdExpdGVyYWxCb29sKExpdGVyYWxCb29sIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBMaXRlcmFsQm9vbCkgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgTGl0ZXJhbEJvb2wgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdFZhbHVlcyhub2RlLCBub2RlLnZhbHVlLCBvdGhlciwgb3RoZXIudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdERlZmVycmVkU3RyaW5nKERlZmVycmVkU3RyaW5nIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBEZWZlcnJlZFN0cmluZykgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgRGVmZXJyZWRTdHJpbmcgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdFZhbHVlcyhub2RlLCBub2RlLnZhbHVlLCBvdGhlciwgb3RoZXIudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdERlZmVycmVkTnVtYmVyKERlZmVycmVkTnVtYmVyIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBEZWZlcnJlZE51bWJlcikgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgRGVmZXJyZWROdW1iZXIgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdFZhbHVlcyhub2RlLCBub2RlLnZhbHVlLCBvdGhlciwgb3RoZXIudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdERlZmVycmVkRXhwcmVzc2lvbihEZWZlcnJlZEV4cHJlc3Npb24gbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIERlZmVycmVkRXhwcmVzc2lvbikgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgRGVmZXJyZWRFeHByZXNzaW9uIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3ROb2Rlcyhub2RlLnZhbHVlLCBvdGhlci52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RnVuKEZ1biBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgRnVuKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBGdW4gb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdE5vZGVMaXN0cyhub2RlLnBhcmFtcywgb3RoZXIucGFyYW1zKSAmJgogICAgICAgIHRlc3ROb2Rlcyhub2RlLmJvZHksIG90aGVyLmJvZHkpICYmCiAgICAgICAgdGVzdFZhbHVlcyhub2RlLCBub2RlLmFzeW5jTW9kaWZpZXIsIG90aGVyLCBvdGhlci5hc3luY01vZGlmaWVyKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXROYW1lZEZ1bmN0aW9uKE5hbWVkRnVuY3Rpb24gbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIE5hbWVkRnVuY3Rpb24pIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIE5hbWVkRnVuY3Rpb24gb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdE5vZGVzKG5vZGUubmFtZSwgb3RoZXIubmFtZSkgJiYKICAgICAgICB0ZXN0Tm9kZXMobm9kZS5mdW5jdGlvbiwgb3RoZXIuZnVuY3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEFjY2VzcyhQcm9wZXJ0eUFjY2VzcyBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgUHJvcGVydHlBY2Nlc3MpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIFByb3BlcnR5QWNjZXNzIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3ROb2Rlcyhub2RlLnJlY2VpdmVyLCBvdGhlci5yZWNlaXZlcikgJiYKICAgICAgICB0ZXN0Tm9kZXMobm9kZS5zZWxlY3Rvciwgb3RoZXIuc2VsZWN0b3IpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFBhcmFtZXRlcihQYXJhbWV0ZXIgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIFBhcmFtZXRlcikgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgUGFyYW1ldGVyIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3RWYWx1ZXMobm9kZSwgbm9kZS5uYW1lLCBvdGhlciwgb3RoZXIubmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBWYXJpYWJsZURlY2xhcmF0aW9uKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3RWYWx1ZXMobm9kZSwgbm9kZS5uYW1lLCBvdGhlciwgb3RoZXIubmFtZSkgJiYKICAgICAgICB0ZXN0VmFsdWVzKG5vZGUsIG5vZGUuYWxsb3dSZW5hbWUsIG90aGVyLCBvdGhlci5hbGxvd1JlbmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VGhpcyhUaGlzIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBUaGlzKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRWYXJpYWJsZVVzZShWYXJpYWJsZVVzZSBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgVmFyaWFibGVVc2UpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIFZhcmlhYmxlVXNlIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3RWYWx1ZXMobm9kZSwgbm9kZS5uYW1lLCBvdGhlciwgb3RoZXIubmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0UG9zdGZpeChQb3N0Zml4IG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBQb3N0Zml4KSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBQb3N0Zml4IG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3RWYWx1ZXMobm9kZSwgbm9kZS5vcCwgb3RoZXIsIG90aGVyLm9wKSAmJgogICAgICAgIHRlc3ROb2Rlcyhub2RlLmFyZ3VtZW50LCBvdGhlci5hcmd1bWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0UHJlZml4KFByZWZpeCBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgUHJlZml4KSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBQcmVmaXggb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdFZhbHVlcyhub2RlLCBub2RlLm9wLCBvdGhlciwgb3RoZXIub3ApICYmCiAgICAgICAgdGVzdE5vZGVzKG5vZGUuYXJndW1lbnQsIG90aGVyLmFyZ3VtZW50KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRCaW5hcnkoQmluYXJ5IG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBCaW5hcnkpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIEJpbmFyeSBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0Tm9kZXMobm9kZS5sZWZ0LCBvdGhlci5sZWZ0KSAmJgogICAgICAgIHRlc3RWYWx1ZXMobm9kZSwgbm9kZS5vcCwgb3RoZXIsIG90aGVyLm9wKSAmJgogICAgICAgIHRlc3ROb2Rlcyhub2RlLnJpZ2h0LCBvdGhlci5yaWdodCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0Q2FsbChDYWxsIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBDYWxsKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBDYWxsIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3ROb2Rlcyhub2RlLnRhcmdldCwgb3RoZXIudGFyZ2V0KSAmJgogICAgICAgIHRlc3ROb2RlTGlzdHMobm9kZS5hcmd1bWVudHMsIG90aGVyLmFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0TmV3KE5ldyBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgTmV3KSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBOZXcgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdE5vZGVzKG5vZGUudGFyZ2V0LCBvdGhlci50YXJnZXQpICYmCiAgICAgICAgdGVzdE5vZGVMaXN0cyhub2RlLmFyZ3VtZW50cywgb3RoZXIuYXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRDb25kaXRpb25hbChDb25kaXRpb25hbCBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgQ29uZGl0aW9uYWwpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIENvbmRpdGlvbmFsIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3ROb2Rlcyhub2RlLmNvbmRpdGlvbiwgb3RoZXIuY29uZGl0aW9uKSAmJgogICAgICAgIHRlc3ROb2Rlcyhub2RlLnRoZW4sIG90aGVyLnRoZW4pICYmCiAgICAgICAgdGVzdE5vZGVzKG5vZGUub3RoZXJ3aXNlLCBvdGhlci5vdGhlcndpc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFZhcmlhYmxlSW5pdGlhbGl6YXRpb24oVmFyaWFibGVJbml0aWFsaXphdGlvbiBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgVmFyaWFibGVJbml0aWFsaXphdGlvbikgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgVmFyaWFibGVJbml0aWFsaXphdGlvbiBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0Tm9kZXMobm9kZS5kZWNsYXJhdGlvbiwgb3RoZXIuZGVjbGFyYXRpb24pICYmCiAgICAgICAgdGVzdE5vZGVzKG5vZGUubGVmdEhhbmRTaWRlLCBvdGhlci5sZWZ0SGFuZFNpZGUpICYmCiAgICAgICAgdGVzdFZhbHVlcyhub2RlLCBub2RlLm9wLCBvdGhlciwgb3RoZXIub3ApICYmCiAgICAgICAgdGVzdE5vZGVzKG5vZGUudmFsdWUsIG90aGVyLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRBc3NpZ25tZW50KEFzc2lnbm1lbnQgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIEFzc2lnbm1lbnQpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIEFzc2lnbm1lbnQgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdE5vZGVzKG5vZGUubGVmdEhhbmRTaWRlLCBvdGhlci5sZWZ0SGFuZFNpZGUpICYmCiAgICAgICAgdGVzdFZhbHVlcyhub2RlLCBub2RlLm9wLCBvdGhlciwgb3RoZXIub3ApICYmCiAgICAgICAgdGVzdE5vZGVzKG5vZGUudmFsdWUsIG90aGVyLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIFZhcmlhYmxlRGVjbGFyYXRpb25MaXN0IG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3ROb2RlTGlzdHMobm9kZS5kZWNsYXJhdGlvbnMsIG90aGVyLmRlY2xhcmF0aW9ucyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0TGl0ZXJhbEV4cHJlc3Npb24oTGl0ZXJhbEV4cHJlc3Npb24gbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIExpdGVyYWxFeHByZXNzaW9uKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBMaXRlcmFsRXhwcmVzc2lvbiBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0VmFsdWVzKG5vZGUsIG5vZGUudGVtcGxhdGUsIG90aGVyLCBvdGhlci50ZW1wbGF0ZSkgJiYKICAgICAgICB0ZXN0Tm9kZUxpc3RzKG5vZGUuaW5wdXRzLCBvdGhlci5pbnB1dHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdERhcnRZaWVsZChEYXJ0WWllbGQgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIERhcnRZaWVsZCkgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgRGFydFlpZWxkIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3ROb2Rlcyhub2RlLmV4cHJlc3Npb24sIG90aGVyLmV4cHJlc3Npb24pICYmCiAgICAgICAgdGVzdFZhbHVlcyhub2RlLCBub2RlLmhhc1N0YXIsIG90aGVyLCBvdGhlci5oYXNTdGFyKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRMaXRlcmFsU3RhdGVtZW50KExpdGVyYWxTdGF0ZW1lbnQgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIExpdGVyYWxTdGF0ZW1lbnQpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIExpdGVyYWxTdGF0ZW1lbnQgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdFZhbHVlcyhub2RlLCBub2RlLmNvZGUsIG90aGVyLCBvdGhlci5jb2RlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRMYWJlbGVkU3RhdGVtZW50KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIExhYmVsZWRTdGF0ZW1lbnQpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIExhYmVsZWRTdGF0ZW1lbnQgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdExhYmVscyhub2RlLCBub2RlLmxhYmVsLCBvdGhlciwgb3RoZXIubGFiZWwpICYmCiAgICAgICAgdGVzdE5vZGVzKG5vZGUuYm9keSwgb3RoZXIuYm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBGdW5jdGlvbkRlY2xhcmF0aW9uKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBGdW5jdGlvbkRlY2xhcmF0aW9uIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3ROb2Rlcyhub2RlLm5hbWUsIG90aGVyLm5hbWUpICYmCiAgICAgICAgdGVzdE5vZGVzKG5vZGUuZnVuY3Rpb24sIG90aGVyLmZ1bmN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXREZWZhdWx0KERlZmF1bHQgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIERlZmF1bHQpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIERlZmF1bHQgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdE5vZGVzKG5vZGUuYm9keSwgb3RoZXIuYm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0Q2FzZShDYXNlIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBDYXNlKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBDYXNlIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3ROb2Rlcyhub2RlLmV4cHJlc3Npb24sIG90aGVyLmV4cHJlc3Npb24pICYmCiAgICAgICAgdGVzdE5vZGVzKG5vZGUuYm9keSwgb3RoZXIuYm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0U3dpdGNoKFN3aXRjaCBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgU3dpdGNoKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBTd2l0Y2ggb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdE5vZGVzKG5vZGUua2V5LCBvdGhlci5rZXkpICYmCiAgICAgICAgdGVzdE5vZGVMaXN0cyhub2RlLmNhc2VzLCBvdGhlci5jYXNlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0Q2F0Y2goQ2F0Y2ggbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIENhdGNoKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBDYXRjaCBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0Tm9kZXMobm9kZS5kZWNsYXJhdGlvbiwgb3RoZXIuZGVjbGFyYXRpb24pICYmCiAgICAgICAgdGVzdE5vZGVzKG5vZGUuYm9keSwgb3RoZXIuYm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VHJ5KFRyeSBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgVHJ5KSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBUcnkgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdE5vZGVzKG5vZGUuYm9keSwgb3RoZXIuYm9keSkgJiYKICAgICAgICB0ZXN0Tm9kZXMobm9kZS5jYXRjaFBhcnQsIG90aGVyLmNhdGNoUGFydCkgJiYKICAgICAgICB0ZXN0Tm9kZXMobm9kZS5maW5hbGx5UGFydCwgb3RoZXIuZmluYWxseVBhcnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFRocm93KFRocm93IG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBUaHJvdykgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgVGhyb3cgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdE5vZGVzKG5vZGUuZXhwcmVzc2lvbiwgb3RoZXIuZXhwcmVzc2lvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0UmV0dXJuKFJldHVybiBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgUmV0dXJuKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBSZXR1cm4gb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdE5vZGVzKG5vZGUudmFsdWUsIG90aGVyLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRCcmVhayhCcmVhayBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgQnJlYWspIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIEJyZWFrIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3RMYWJlbHMobm9kZSwgbm9kZS50YXJnZXRMYWJlbCwgb3RoZXIsIG90aGVyLnRhcmdldExhYmVsKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRDb250aW51ZShDb250aW51ZSBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgQ29udGludWUpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIENvbnRpbnVlIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3RMYWJlbHMobm9kZSwgbm9kZS50YXJnZXRMYWJlbCwgb3RoZXIsIG90aGVyLnRhcmdldExhYmVsKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXREbyhEbyBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgRG8pIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIERvIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3ROb2Rlcyhub2RlLmNvbmRpdGlvbiwgb3RoZXIuY29uZGl0aW9uKSAmJgogICAgICAgIHRlc3ROb2Rlcyhub2RlLmJvZHksIG90aGVyLmJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFdoaWxlKFdoaWxlIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBXaGlsZSkgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgV2hpbGUgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdE5vZGVzKG5vZGUuY29uZGl0aW9uLCBvdGhlci5jb25kaXRpb24pICYmCiAgICAgICAgdGVzdE5vZGVzKG5vZGUuYm9keSwgb3RoZXIuYm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0Rm9ySW4oRm9ySW4gbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIEZvckluKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBGb3JJbiBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0Tm9kZXMobm9kZS5sZWZ0SGFuZFNpZGUsIG90aGVyLmxlZnRIYW5kU2lkZSkgJiYKICAgICAgICB0ZXN0Tm9kZXMobm9kZS5vYmplY3QsIG90aGVyLm9iamVjdCkgJiYKICAgICAgICB0ZXN0Tm9kZXMobm9kZS5ib2R5LCBvdGhlci5ib2R5KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRGb3IoRm9yIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBGb3IpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIEZvciBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0Tm9kZXMobm9kZS5pbml0LCBvdGhlci5pbml0KSAmJgogICAgICAgIHRlc3ROb2Rlcyhub2RlLmNvbmRpdGlvbiwgb3RoZXIuY29uZGl0aW9uKSAmJgogICAgICAgIHRlc3ROb2Rlcyhub2RlLnVwZGF0ZSwgb3RoZXIudXBkYXRlKSAmJgogICAgICAgIHRlc3ROb2Rlcyhub2RlLmJvZHksIG90aGVyLmJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdElmKElmIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBJZikgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgSWYgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdE5vZGVzKG5vZGUuY29uZGl0aW9uLCBvdGhlci5jb25kaXRpb24pICYmCiAgICAgICAgdGVzdE5vZGVzKG5vZGUudGhlbiwgb3RoZXIudGhlbikgJiYKICAgICAgICB0ZXN0Tm9kZXMobm9kZS5vdGhlcndpc2UsIG90aGVyLm90aGVyd2lzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RW1wdHlTdGF0ZW1lbnQoRW1wdHlTdGF0ZW1lbnQgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIEVtcHR5U3RhdGVtZW50KSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIEV4cHJlc3Npb25TdGF0ZW1lbnQpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdE5vZGVzKG5vZGUuZXhwcmVzc2lvbiwgb3RoZXIuZXhwcmVzc2lvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0QmxvY2soQmxvY2sgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIEJsb2NrKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBCbG9jayBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0Tm9kZUxpc3RzKG5vZGUuc3RhdGVtZW50cywgb3RoZXIuc3RhdGVtZW50cyk7CiAgfQp9CoIAAE5OPAEQAUs/HgE6BlAwAVBLGAFHSxgBKy5FJwQBOxM7QA8GICknKQYRBAEMLjMZMQQBDE5DKU8EAQxKQSdPBAEMSEAmTwQBDEpBJ08EAQxGPyVPBAEMTEIoTwQBDC4zGUEEAQwqMRc5BAEMOjkfQQQBDDA0Gi8sBAEMQj0jPQQBDDI1EQQBDEA8IjkEAQwoMBY5BAEMNjcdQwQBDEY/JTMEAQw2NxEEAQw6OR89BAEMOjkfPQQBDDY3HT0EAQw8OiA9BAEMPDogPQQBDEQ+JC8EAQwmLxU3LEoEAQw6OR8vMgQBDDQ6IDcyBAEMMjUbOwQBDEY/JT1GBAEMKDARBAEMNjcdOwQBDC4zGTkyBAEMLDIYOTIEAQwsMhgvNiwEAQwoMBYzOAQBDCYvFTM4BAEMNjcdOSw0BAEMTEIoPTw2LAQBDDQ2HD82LAQBDE5DKUEEAQxCPSNFMgQBDDI1Gzs+BAEMQDwiOwQBDEA8Ij8qBAEMRj8lLzIEAQwuMxktBAEMKDAWOyoEAQwsMhgtMAQBDCoxFz0qBAEMJi8VLzY4BAEMKjEXOQQBDCwyGC8EAQwqMRdJBAEMMDQaSQQBDCQuFDkqBAEMKjEXOSoEAQwqMRc/MCoEAQwmLxUvNjAqBAEMJC4UOSw0BAEMPDoRBAEMRj8lOQQBDCoxFz0EAgErcGFja2FnZTpqc19hc3Qvc3JjL2VxdWl2YWxlbmNlX3Zpc2l0b3IuZGFydC5zZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qcy9qc19kZWJ1Zy5kYXJ0iEsvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIEhlbHBlciBmb3IgZGVidWcgSlMgbm9kZXMuCgpsaWJyYXJ5IGpzLmRlYnVnOwoKaW1wb3J0ICdwYWNrYWdlOmpzX2FzdC9qc19hc3QuZGFydCc7CgppbXBvcnQgJy4uL2lvL2NvZGVfb3V0cHV0LmRhcnQnIHNob3cgQnVmZmVyZWRDb2RlT3V0cHV0OwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JyBzaG93IEluZGVudGF0aW9uLCBUYWdnaW5nOwoKLy8vIFVucGFyc2UgdGhlIEphdmFTY3JpcHQgW25vZGVdLgpTdHJpbmcgbm9kZVRvU3RyaW5nKE5vZGUgbm9kZSwge2Jvb2wgcHJldHR5OiBmYWxzZX0pIHsKICBKYXZhU2NyaXB0UHJpbnRpbmdPcHRpb25zIG9wdGlvbnMgPSBuZXcgSmF2YVNjcmlwdFByaW50aW5nT3B0aW9ucygKICAgICAgc2hvdWxkQ29tcHJlc3NPdXRwdXQ6ICFwcmV0dHksCiAgICAgIHByZWZlclNlbWljb2xvblRvTmV3bGluZUluTWluaWZpZWRPdXRwdXQ6ICFwcmV0dHkpOwogIExlbmllbnRQcmludGluZ0NvbnRleHQgcHJpbnRpbmdDb250ZXh0ID0gbmV3IExlbmllbnRQcmludGluZ0NvbnRleHQoKTsKICBuZXcgUHJpbnRlcihvcHRpb25zLCBwcmludGluZ0NvbnRleHQpLnZpc2l0KG5vZGUpOwogIHJldHVybiBwcmludGluZ0NvbnRleHQuZ2V0VGV4dCgpOwp9CgovLy8gVmlzaXRvciB0aGF0IGNyZWF0ZXMgYW4gWE1MLWxpa2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0cnVjdHVyZSBvZiBhCi8vLyBKYXZhU2NyaXB0IFtOb2RlXS4KY2xhc3MgRGVidWdQcmludGVyIGV4dGVuZHMgQmFzZVZpc2l0b3Igd2l0aCBJbmRlbnRhdGlvbiwgVGFnZ2luZzxOb2RlPiB7CiAgQG92ZXJyaWRlCiAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwoKICB2b2lkIHZpc2l0Tm9kZVdpdGhDaGlsZHJlbihOb2RlIG5vZGUsIFN0cmluZyB0eXBlLCBbTWFwIHBhcmFtc10pIHsKICAgIG9wZW5Ob2RlKG5vZGUsIHR5cGUsIHBhcmFtcyk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgICBjbG9zZU5vZGUoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXROb2RlKE5vZGUgbm9kZSkgewogICAgdmlzaXROb2RlV2l0aENoaWxkcmVuKG5vZGUsICcke25vZGUucnVudGltZVR5cGV9Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TmFtZShOYW1lIG5vZGUpIHsKICAgIG9wZW5BbmRDbG9zZU5vZGUobm9kZSwgJyR7bm9kZS5ydW50aW1lVHlwZX0nLCB7J25hbWUnOiBub2RlLm5hbWV9KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCaW5hcnkoQmluYXJ5IG5vZGUpIHsKICAgIHZpc2l0Tm9kZVdpdGhDaGlsZHJlbihub2RlLCAnJHtub2RlLnJ1bnRpbWVUeXBlfScsIHsnb3AnOiBub2RlLm9wfSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGl0ZXJhbFN0cmluZyhMaXRlcmFsU3RyaW5nIG5vZGUpIHsKICAgIG9wZW5BbmRDbG9zZU5vZGUobm9kZSwgJyR7bm9kZS5ydW50aW1lVHlwZX0nLCB7J3ZhbHVlJzogbm9kZS52YWx1ZX0pOwogIH0KCiAgLy8vIFByZXR0eS1wcmludHMgZ2l2ZW4gbm9kZSB0cmVlIGludG8gc3RyaW5nLgogIHN0YXRpYyBTdHJpbmcgcHJldHR5UHJpbnQoTm9kZSBub2RlKSB7CiAgICB2YXIgcCA9IG5ldyBEZWJ1Z1ByaW50ZXIoKTsKICAgIG5vZGUuYWNjZXB0KHApOwogICAgcmV0dXJuIHAuc2IudG9TdHJpbmcoKTsKICB9Cn0KCi8vLyBTaW1wbGUgcHJpbnRpbmcgY29udGV4dCB0aGF0IGRvZXNuJ3QgdGhyb3cgb24gZXJyb3JzLgpjbGFzcyBMZW5pZW50UHJpbnRpbmdDb250ZXh0IGV4dGVuZHMgU2ltcGxlSmF2YVNjcmlwdFByaW50aW5nQ29udGV4dAogICAgaW1wbGVtZW50cyBCdWZmZXJlZENvZGVPdXRwdXQgewogIEBvdmVycmlkZQogIHZvaWQgZXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKICAgIGJ1ZmZlci53cml0ZSgnPj4kbWVzc2FnZTw8Jyk7CiAgfQp9CkkATk48AR8BEgElATk2ASM3RSU6STUkAgFKF0kMKAFFIh4RBAEMHjgEAQweSAQBDCJJBAEMMEoEATEpIBQcBAIBOkUkDB8iBAIBJXBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzL2pzX2RlYnVnLmRhcnQzc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaXIvc2NvcGVfdmlzaXRvci5kYXJ0wACe2S8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS9jb25zdGFudF9ldmFsdWF0b3IuZGFydCcgYXMgaXI7CgppbXBvcnQgJ2Nsb3N1cmUuZGFydCc7CmltcG9ydCAnc2NvcGUuZGFydCc7CgovLy8gVGhpcyBidWlsZGVyIHdhbGtzIHRoZSBjb2RlIHRvIGRldGVybWluZSB3aGF0IHZhcmlhYmxlcyBhcmUKLy8vIGFzc2lnbmVkL2NhcHR1cmVkL2ZyZWUgYXQgdmFyaW91cyBwb2ludHMgdG8gYnVpbGQgYSBbQ2xvc3VyZVNjb3BlTW9kZWxdIGFuZAovLy8gYSBbVmFyaWFibGVTY29wZU1vZGVsXSB0aGF0IGNhbiByZXNwb25kIHRvIHF1ZXJpZXMgYWJvdXQgaG93IGEgcGFydGljdWxhcgovLy8gdmFyaWFibGUgaXMgYmVpbmcgdXNlZCBhdCBhbnkgcG9pbnQgaW4gdGhlIGNvZGUuCmNsYXNzIFNjb3BlTW9kZWxCdWlsZGVyIGV4dGVuZHMgaXIuVmlzaXRvcjxJbml0aWFsaXplckNvbXBsZXhpdHk+CiAgICB3aXRoIFZhcmlhYmxlQ29sbGVjdG9yTWl4aW4gewogIGZpbmFsIGlyLkNvbnN0YW50RXZhbHVhdG9yIF9jb25zdGFudEV2YWx1YXRvcjsKCiAgZmluYWwgQ2xvc3VyZVNjb3BlTW9kZWwgX21vZGVsID0gbmV3IENsb3N1cmVTY29wZU1vZGVsKCk7CgogIC8vLyBBIG1hcCBvZiBlYWNoIHZpc2l0ZWQgY2FsbCBub2RlIHdpdGggdGhlIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gYWJvdXQgd2hhdAogIC8vLyB2YXJpYWJsZXMgYXJlIGNhcHR1cmVkL3VzZWQuIEVhY2ggaXIuTm9kZSBrZXkgY29ycmVzcG9uZHMgdG8gYSBzY29wZSB0aGF0CiAgLy8vIHdhcyBlbmNvdW50ZXJlZCB3aGlsZSB2aXNpdGluZyBhIGNsb3N1cmUgKGluaXRpYWxseSBjYWxsZWQgdGhyb3VnaAogIC8vLyBbdHJhbnNsYXRlTGF6eUluaXRpYWxpemVyXSBvciBbdHJhbnNsYXRlQ29uc3RydWN0b3JPclByb2NlZHVyZV0pLgogIE1hcDxpci5Ob2RlLCBLZXJuZWxDYXB0dXJlZFNjb3BlPiBnZXQgX3Njb3Blc0NhcHR1cmVkSW5DbG9zdXJlTWFwID0+CiAgICAgIF9tb2RlbC5jYXB0dXJlZFNjb3Blc01hcDsKCiAgLy8vIEEgbWFwIG9mIHRoZSBub2RlcyB0aGF0IHdlIGhhdmUgZmxhZ2dlZCBhcyBuZWNlc3NhcnkgdG8gZ2VuZXJhdGUgY2xvc3VyZQogIC8vLyBjbGFzc2VzIGZvciBpbiBhIGxhdGVyIHN0YWdlLiBXZSBtYXAgdGhhdCBub2RlIHRvIGluZm9ybWF0aW9uIGFzY2VydGFpbmVkCiAgLy8vIGFib3V0IHZhcmlhYmxlIHVzYWdlIGluIHRoZSBzdXJyb3VuZGluZyBzY29wZS4KICBNYXA8aXIuVHJlZU5vZGUsIEtlcm5lbFNjb3BlSW5mbz4gZ2V0IF9jbG9zdXJlc1RvR2VuZXJhdGUgPT4KICAgICAgX21vZGVsLmNsb3N1cmVzVG9HZW5lcmF0ZTsKCiAgLy8vIFRoZSBsb2NhbCB2YXJpYWJsZXMgdGhhdCBoYXZlIGJlZW4gZGVjbGFyZWQgaW4gdGhlIGN1cnJlbnQgc2NvcGUuCiAgTGlzdDxpci5Ob2RlIC8qIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gfCBUeXBlUGFyYW1ldGVyVHlwZVdpdGhDb250ZXh0ICovID4KICAgICAgX3Njb3BlVmFyaWFibGVzOwoKICAvLy8gUG9pbnRlciB0byB0aGUgY29udGV4dCBpbiB3aGljaCB0aGlzIGNsb3N1cmUgaXMgZXhlY3V0ZWQuCiAgLy8vIEZvciBleGFtcGxlLCBpbiB0aGUgZXhwcmVzc2lvbiBgdmFyIGZvbyA9ICgpID0+IDMgKyBpO2AsIHRoZSBleGVjdXRhYmxlCiAgLy8vIGNvbnRleHQgYXMgd2Ugd2FsayB0aGUgbm9kZXMgaW4gdGhhdCBleHByZXNzaW9uIGlzIHRoZSBpci5GaWVsZCBgZm9vYC4KICBpci5UcmVlTm9kZSBfZXhlY3V0YWJsZUNvbnRleHQ7CgogIC8vLyBBIGZsYWcgdG8gaW5kaWNhdGUgaWYgd2UgYXJlIGN1cnJlbnRseSBpbnNpZGUgYSBjbG9zdXJlLgogIGJvb2wgX2lzSW5zaWRlQ2xvc3VyZSA9IGZhbHNlOwoKICAvLy8gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgbm9kZSB3aGVyZSB0aGlzIGNsb3N1cmUgYnVpbGRlciBzdGFydGVkLgogIGlyLk5vZGUgX291dGVybW9zdE5vZGU7CgogIC8vLyBLZWVwIHRyYWNrIG9mIHRoZSBtdXRhdGVkIGxvY2FsIHZhcmlhYmxlcyBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gYm94CiAgLy8vIG5vbi1tdXRhdGVkIHZhcmlhYmxlcy4gV2Uga25vdyB0aGVzZSBhcmUgb25seSBWYXJpYWJsZURlY2xhcmF0aW9ucyBiZWNhdXNlCiAgLy8vIHR5cGUgdmFyaWFibGUgdHlwZXMgYW5kIGB0aGlzYCB0eXBlcyBjYW4ndCBiZSBtdXRhdGVkIQogIFNldDxpci5WYXJpYWJsZURlY2xhcmF0aW9uPiBfbXV0YXRlZFZhcmlhYmxlcyA9CiAgICAgIG5ldyBTZXQ8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4oKTsKCiAgLy8vIFRoZSBzZXQgb2YgdmFyaWFibGVzIHRoYXQgYXJlIGFjY2Vzc2VkIGluIHNvbWUgZm9ybSwgd2hldGhlciB0aGV5IGFyZQogIC8vLyBtdXRhdGVkIG9yIG5vdC4KICBTZXQ8aXIuTm9kZSAvKiBpci5WYXJpYWJsZURlY2xhcmF0aW9uIHwgVHlwZVBhcmFtZXRlclR5cGVXaXRoQ29udGV4dCAqLyA+CiAgICAgIF9jYXB0dXJlZFZhcmlhYmxlcyA9IG5ldyBTZXQ8aXIuTm9kZT4oKTsKCiAgLy8vIElmIHRydWUsIHRoZSB2aXNpdG9yIGlzIGN1cnJlbnRseSB0cmF2ZXJzaW5nIHNvbWUgbm9kZXMgdGhhdCBhcmUgaW5zaWRlIGEKICAvLy8gdHJ5IGJsb2NrLgogIGJvb2wgX2luVHJ5ID0gZmFsc2U7CgogIC8vLyBUaGUgY3VycmVudCBzY29wZSB3ZSBhcmUgaW4uCiAgS2VybmVsU2NvcGVJbmZvIF9jdXJyZW50U2NvcGVJbmZvOwoKICBib29sIF9oYXNUaGlzTG9jYWw7CgogIC8vLyBLZWVwcyB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIGJveGVzIHRoYXQgd2UndmUgY3JlYXRlZCBzbyB0aGF0IHRoZXkgZWFjaAogIC8vLyBoYXZlIHVuaXF1ZSBuYW1lcy4KICBpbnQgX2JveENvdW50ZXIgPSAwOwoKICAvLy8gVGhlIGN1cnJlbnQgdXNhZ2Ugb2YgYSB0eXBlIGFubm90YXRpb24uCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXBkYXRlZCBpbiB0aGUgdmlzaXRvciB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHVuY29uZGl0aW9uYWwKICAvLy8gdHlwZSB2YXJpYWJsZSB1c2FnZSwgc3VjaCBhcyB0eXBlIGxpdGVyYWxzIGFuZCBpcyB0ZXN0cywgYW5kIGNvbmRpdGlvbmFsCiAgLy8vIHR5cGUgdmFyaWFibGUgdXNhZ2UsIHN1Y2ggYXMgdHlwZSBhcmd1bWVudCBpbiBtZXRob2QgaW52b2NhdGlvbnMuCiAgVmFyaWFibGVVc2UgX2N1cnJlbnRUeXBlVXNhZ2U7CgogIFNjb3BlTW9kZWxCdWlsZGVyKHRoaXMuX2NvbnN0YW50RXZhbHVhdG9yKTsKCiAgU2NvcGVNb2RlbCBjb21wdXRlTW9kZWwoaXIuTWVtYmVyIG5vZGUpIHsKICAgIGlmIChub2RlLmlzQWJzdHJhY3QgJiYgIW5vZGUuaXNFeHRlcm5hbCkgewogICAgICByZXR1cm4gY29uc3QgU2NvcGVNb2RlbCgKICAgICAgICAgIGluaXRpYWxpemVyQ29tcGxleGl0eTogY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKSk7CiAgICB9CgogICAgaWYgKG5vZGUgaXMgaXIuQ29uc3RydWN0b3IpIHsKICAgICAgX2hhc1RoaXNMb2NhbCA9IHRydWU7CiAgICB9IGVsc2UgaWYgKG5vZGUgaXMgaXIuUHJvY2VkdXJlICYmIG5vZGUua2luZCA9PSBpci5Qcm9jZWR1cmVLaW5kLkZhY3RvcnkpIHsKICAgICAgX2hhc1RoaXNMb2NhbCA9IGZhbHNlOwogICAgfSBlbHNlIGlmIChub2RlLmlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgX2hhc1RoaXNMb2NhbCA9IHRydWU7CiAgICB9IGVsc2UgewogICAgICBfaGFzVGhpc0xvY2FsID0gZmFsc2U7CiAgICB9CgogICAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IGluaXRpYWxpemVyQ29tcGxleGl0eSA9CiAgICAgICAgY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICAgIGlmIChub2RlIGlzIGlyLkZpZWxkKSB7CiAgICAgIGlmIChub2RlLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgICBpbml0aWFsaXplckNvbXBsZXhpdHkgPSBub2RlLmFjY2VwdCh0aGlzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbml0aWFsaXplckNvbXBsZXhpdHkgPSBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkuY29uc3RhbnQoKTsKICAgICAgICBfbW9kZWwuc2NvcGVJbmZvID0gbmV3IEtlcm5lbFNjb3BlSW5mbyhfaGFzVGhpc0xvY2FsKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KG5vZGUgaXMgaXIuUHJvY2VkdXJlIHx8IG5vZGUgaXMgaXIuQ29uc3RydWN0b3IpOwogICAgICBub2RlLmFjY2VwdCh0aGlzKTsKICAgIH0KICAgIHJldHVybiBuZXcgU2NvcGVNb2RlbCgKICAgICAgICBjbG9zdXJlU2NvcGVNb2RlbDogX21vZGVsLAogICAgICAgIHZhcmlhYmxlU2NvcGVNb2RlbDogdmFyaWFibGVTY29wZU1vZGVsLAogICAgICAgIGluaXRpYWxpemVyQ29tcGxleGl0eTogaW5pdGlhbGl6ZXJDb21wbGV4aXR5KTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSBkZWZhdWx0Tm9kZShpci5Ob2RlIG5vZGUpID0+CiAgICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoJ1VuaGFuZGxlZCBub2RlICRub2RlICgke25vZGUucnVudGltZVR5cGV9KScpOwoKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXROb2RlKGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIG5vZGU/LmFjY2VwdCh0aGlzKTsKICB9CgogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdE5vZGVzKExpc3Q8aXIuTm9kZT4gbm9kZXMpIHsKICAgIEluaXRpYWxpemVyQ29tcGxleGl0eSBjb21wbGV4aXR5ID0gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmNvbnN0YW50KCk7CiAgICBmb3IgKGlyLk5vZGUgbm9kZSBpbiBub2RlcykgewogICAgICBjb21wbGV4aXR5ID0gY29tcGxleGl0eS5jb21iaW5lKHZpc2l0Tm9kZShub2RlKSk7CiAgICB9CiAgICByZXR1cm4gY29tcGxleGl0eTsKICB9CgogIC8vLyBVcGRhdGUgdGhlIFtDYXB0dXJlZFNjb3BlXSBvYmplY3QgY29ycmVzcG9uZGluZyB0bwogIC8vLyB0aGlzIG5vZGUgaWYgYW55IHZhcmlhYmxlcyBhcmUgY2FwdHVyZWQuCiAgdm9pZCBhdHRhY2hDYXB0dXJlZFNjb3BlVmFyaWFibGVzKGlyLlRyZWVOb2RlIG5vZGUpIHsKICAgIFNldDxpci5WYXJpYWJsZURlY2xhcmF0aW9uPiBjYXB0dXJlZFZhcmlhYmxlc0ZvclNjb3BlID0KICAgICAgICBuZXcgU2V0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+KCk7CgogICAgZm9yIChpci5Ob2RlIHZhcmlhYmxlIGluIF9zY29wZVZhcmlhYmxlcykgewogICAgICAvLyBObyBuZWVkIHRvIGJveCBub24tYXNzaWduYWJsZSBlbGVtZW50cy4KICAgICAgaWYgKHZhcmlhYmxlIGlzIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24pIHsKICAgICAgICBpZiAodmFyaWFibGUuaXNGaW5hbCB8fCB2YXJpYWJsZS5pc0NvbnN0KSBjb250aW51ZTsKICAgICAgICBpZiAoIV9tdXRhdGVkVmFyaWFibGVzLmNvbnRhaW5zKHZhcmlhYmxlKSkgY29udGludWU7CiAgICAgICAgaWYgKF9jYXB0dXJlZFZhcmlhYmxlcy5jb250YWlucyh2YXJpYWJsZSkpIHsKICAgICAgICAgIGNhcHR1cmVkVmFyaWFibGVzRm9yU2NvcGUuYWRkKHZhcmlhYmxlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmICghY2FwdHVyZWRWYXJpYWJsZXNGb3JTY29wZS5pc0VtcHR5KSB7CiAgICAgIGFzc2VydChfbW9kZWwuc2NvcGVJbmZvICE9IG51bGwpOwogICAgICBLZXJuZWxTY29wZUluZm8gZnJvbSA9IF9tb2RlbC5zY29wZUluZm87CgogICAgICBLZXJuZWxDYXB0dXJlZFNjb3BlIGNhcHR1cmVkU2NvcGU7CiAgICAgIHZhciBub2RlQm94ID0gbmV3IE5vZGVCb3goZ2V0Qm94TmFtZSgpLCBfZXhlY3V0YWJsZUNvbnRleHQpOwogICAgICBpZiAobm9kZSBpcyBpci5Gb3JTdGF0ZW1lbnQgfHwKICAgICAgICAgIG5vZGUgaXMgaXIuRm9ySW5TdGF0ZW1lbnQgfHwKICAgICAgICAgIG5vZGUgaXMgaXIuV2hpbGVTdGF0ZW1lbnQgfHwKICAgICAgICAgIG5vZGUgaXMgaXIuRG9TdGF0ZW1lbnQpIHsKICAgICAgICBjYXB0dXJlZFNjb3BlID0gbmV3IEtlcm5lbENhcHR1cmVkTG9vcFNjb3BlKAogICAgICAgICAgICBjYXB0dXJlZFZhcmlhYmxlc0ZvclNjb3BlLAogICAgICAgICAgICBub2RlQm94LAogICAgICAgICAgICBbXSwKICAgICAgICAgICAgZnJvbS5sb2NhbHNVc2VkSW5UcnlPclN5bmMsCiAgICAgICAgICAgIGZyb20uZnJlZVZhcmlhYmxlcywKICAgICAgICAgICAgZnJvbS5mcmVlVmFyaWFibGVzRm9yUnRpLAogICAgICAgICAgICBmcm9tLnRoaXNVc2VkQXNGcmVlVmFyaWFibGUsCiAgICAgICAgICAgIGZyb20udGhpc1VzZWRBc0ZyZWVWYXJpYWJsZUlmTmVlZHNSdGksCiAgICAgICAgICAgIF9oYXNUaGlzTG9jYWwpOwogICAgICB9IGVsc2UgewogICAgICAgIGNhcHR1cmVkU2NvcGUgPSBuZXcgS2VybmVsQ2FwdHVyZWRTY29wZSgKICAgICAgICAgICAgY2FwdHVyZWRWYXJpYWJsZXNGb3JTY29wZSwKICAgICAgICAgICAgbm9kZUJveCwKICAgICAgICAgICAgZnJvbS5sb2NhbHNVc2VkSW5UcnlPclN5bmMsCiAgICAgICAgICAgIGZyb20uZnJlZVZhcmlhYmxlcywKICAgICAgICAgICAgZnJvbS5mcmVlVmFyaWFibGVzRm9yUnRpLAogICAgICAgICAgICBmcm9tLnRoaXNVc2VkQXNGcmVlVmFyaWFibGUsCiAgICAgICAgICAgIGZyb20udGhpc1VzZWRBc0ZyZWVWYXJpYWJsZUlmTmVlZHNSdGksCiAgICAgICAgICAgIF9oYXNUaGlzTG9jYWwpOwogICAgICB9CiAgICAgIF9tb2RlbC5zY29wZUluZm8gPSBfc2NvcGVzQ2FwdHVyZWRJbkNsb3N1cmVNYXBbbm9kZV0gPSBjYXB0dXJlZFNjb3BlOwogICAgfQogIH0KCiAgLy8vIEdlbmVyYXRlIGEgdW5pcXVlIG5hbWUgZm9yIHRoZSBbX2JveENvdW50ZXJddGggYm94IGZpZWxkLgogIC8vLwogIC8vLyBUaGUgcmVzdWx0IGlzIHVzZWQgYXMgdGhlIG5hbWUgb2YgW05vZGVCb3hdcyBhbmQgW0JveExvY2FsXXMsIGFuZCBtdXN0CiAgLy8vIHRoZXJlZm9yZSBiZSB1bmlxdWUgdG8gYXZvaWQgYnJlYWtpbmcgYW4gaW52YXJpYW50IGluIHRoZSBlbGVtZW50IG1vZGVsCiAgLy8vIChjbGFzc2VzIGNhbm5vdCBkZWNsYXJlIG11bHRpcGxlIGZpZWxkcyB3aXRoIHRoZSBzYW1lIG5hbWUpLgogIC8vLwogIC8vLyBBbHNvLCB0aGUgbmFtZXMgc2hvdWxkIGJlIGRpc3RpbmN0IGZyb20gcmVhbCBmaWVsZCBuYW1lcyB0byBwcmV2ZW50CiAgLy8vIGNsYXNoZXMgd2l0aCBzZWxlY3RvcnMgZm9yIHRob3NlIGZpZWxkcy4KICAvLy8KICAvLy8gVGhlc2UgbmFtZXMgYXJlIG5vdCB1c2VkIGluIGdlbmVyYXRlZCBjb2RlLCBqdXN0IGFzIGVsZW1lbnQgbmFtZS4KICBTdHJpbmcgZ2V0Qm94TmFtZSgpIHsKICAgIHJldHVybiAiX2JveF8ke19ib3hDb3VudGVyKyt9IjsKICB9CgogIC8vLyBQZXJmb3JtIGJvb2sta2VlcGluZyB3aXRoIHRoZSBjdXJyZW50IHNldCBvZiBsb2NhbCB2YXJpYWJsZXMgdGhhdCBoYXZlCiAgLy8vIGJlZW4gc2VlbiB0aHVzIGZhciBiZWZvcmUgZW50ZXJpbmcgdGhpcyBuZXcgc2NvcGUuCiAgdm9pZCBlbnRlck5ld1Njb3BlKGlyLk5vZGUgbm9kZSwgdm9pZCB2aXNpdE5ld1Njb3BlKCkpIHsKICAgIExpc3Q8aXIuTm9kZT4gb2xkU2NvcGVWYXJpYWJsZXMgPSBfc2NvcGVWYXJpYWJsZXM7CiAgICBfc2NvcGVWYXJpYWJsZXMgPSA8aXIuTm9kZT5bXTsKICAgIHZpc2l0TmV3U2NvcGUoKTsKICAgIGF0dGFjaENhcHR1cmVkU2NvcGVWYXJpYWJsZXMobm9kZSk7CiAgICBfbXV0YXRlZFZhcmlhYmxlcy5yZW1vdmVBbGwoX3Njb3BlVmFyaWFibGVzKTsKICAgIF9zY29wZVZhcmlhYmxlcyA9IG9sZFNjb3BlVmFyaWFibGVzOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0TmFtZWRFeHByZXNzaW9uKGlyLk5hbWVkRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gdmlzaXROb2RlKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0VHJ5Q2F0Y2goaXIuVHJ5Q2F0Y2ggbm9kZSkgewogICAgYm9vbCBvbGRJblRyeSA9IF9pblRyeTsKICAgIF9pblRyeSA9IHRydWU7CiAgICB2aXNpdEluVmFyaWFibGVTY29wZShub2RlLCAoKSB7CiAgICAgIHZpc2l0Tm9kZShub2RlLmJvZHkpOwogICAgfSk7CiAgICB2aXNpdE5vZGVzKG5vZGUuY2F0Y2hlcyk7CiAgICBfaW5UcnkgPSBvbGRJblRyeTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0VHJ5RmluYWxseShpci5UcnlGaW5hbGx5IG5vZGUpIHsKICAgIGJvb2wgb2xkSW5UcnkgPSBfaW5Ucnk7CiAgICBfaW5UcnkgPSB0cnVlOwogICAgdmlzaXRJblZhcmlhYmxlU2NvcGUobm9kZSwgKCkgewogICAgICB2aXNpdE5vZGUobm9kZS5ib2R5KTsKICAgIH0pOwogICAgdmlzaXROb2RlKG5vZGUuZmluYWxpemVyKTsKICAgIF9pblRyeSA9IG9sZEluVHJ5OwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRWYXJpYWJsZUdldChpci5WYXJpYWJsZUdldCBub2RlKSB7CiAgICBfbWFya1ZhcmlhYmxlQXNVc2VkKG5vZGUudmFyaWFibGUsIFZhcmlhYmxlVXNlLmV4cGxpY2l0KTsKICAgIC8vIERvbid0IHZpc2l0IGBub2RlLnByb21vdGVkVHlwZWAuCiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdFZhcmlhYmxlU2V0KGlyLlZhcmlhYmxlU2V0IG5vZGUpIHsKICAgIF9tdXRhdGVkVmFyaWFibGVzLmFkZChub2RlLnZhcmlhYmxlKTsKICAgIF9tYXJrVmFyaWFibGVBc1VzZWQobm9kZS52YXJpYWJsZSwgVmFyaWFibGVVc2UuZXhwbGljaXQpOwogICAgdmlzaXRJbkNvbnRleHQobm9kZS52YXJpYWJsZS50eXBlLCBWYXJpYWJsZVVzZS5sb2NhbFR5cGUpOwogICAgdmlzaXROb2RlKG5vZGUudmFsdWUpOwogICAgcmVnaXN0ZXJBc3NpZ25lZFZhcmlhYmxlKG5vZGUudmFyaWFibGUpOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICB2b2lkIF9oYW5kbGVWYXJpYWJsZURlY2xhcmF0aW9uKAogICAgICBpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUsIFZhcmlhYmxlVXNlIHVzYWdlKSB7CiAgICBpZiAoIW5vZGUuaXNGaWVsZEZvcm1hbCkgewogICAgICBfc2NvcGVWYXJpYWJsZXMuYWRkKG5vZGUpOwogICAgfQoKICAgIHZpc2l0SW5Db250ZXh0KG5vZGUudHlwZSwgdXNhZ2UpOwogICAgdmlzaXROb2RlKG5vZGUuaW5pdGlhbGl6ZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIF9oYW5kbGVWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUsIFZhcmlhYmxlVXNlLmxvY2FsVHlwZSk7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIC8vLyBBZGQgdGhpcyB2YXJpYWJsZSB0byB0aGUgc2V0IG9mIGZyZWUgdmFyaWFibGVzIGlmIGFwcHJvcHJpYXRlIGFuZCBhZGQgdG8KICAvLy8gdGhlIHRhbGx5IG9mIHZhcmlhYmxlcyB1c2VkIGluIHRyeSBvciBzeW5jIGJsb2Nrcy4KICAvLy8gSWYgW29ubHlGb3JSdGlDaGVja3NdIGlzIHRydWUsIGFkZCB0byB0aGUgZnJlZVZhcmlhYmxlc0ZvclJ0aSBzZXQgaW5zdGVhZAogIC8vLyBvZiBmcmVlVmFyaWFibGVzIGFzIHdlIHdpbGwgb25seSB1c2UgaXQgaWYgcnVudGltZSB0eXBlIGluZm9ybWF0aW9uIGlzCiAgLy8vIGNoZWNrZWQuCiAgdm9pZCBfbWFya1ZhcmlhYmxlQXNVc2VkKAogICAgICBpci5Ob2RlIC8qIFZhcmlhYmxlRGVjbGFyYXRpb24gfCBUeXBlUGFyYW1ldGVyVHlwZVdpdGhDb250ZXh0ICovIHZhcmlhYmxlLAogICAgICBWYXJpYWJsZVVzZSB1c2FnZSkgewogICAgYXNzZXJ0KHZhcmlhYmxlIGlzIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gfHwKICAgICAgICB2YXJpYWJsZSBpcyBUeXBlVmFyaWFibGVUeXBlV2l0aENvbnRleHQpOwogICAgYXNzZXJ0KHVzYWdlICE9IG51bGwpOwogICAgaWYgKF9pc0luc2lkZUNsb3N1cmUgJiYgIV9pbkN1cnJlbnRDb250ZXh0KHZhcmlhYmxlKSkgewogICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBub3QgZGVjbGFyZWQgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24gYW5kIHRoZSBlbGVtZW50CiAgICAgIC8vIGlzIG5vdCB0aGUgY2xvc3VyZSBpdHNlbGYgd2UgbmVlZCB0byBtYXJrIHRoZSBlbGVtZW50IGFzIGZyZWUgdmFyaWFibGUuCiAgICAgIC8vIE5vdGUgdGhhdCB0aGUgY2hlY2sgb24gW2luc2lkZUNsb3N1cmVdIGlzIG5vdCBqdXN0IGFuCiAgICAgIC8vIG9wdGltaXphdGlvbjogZmFjdG9yaWVzIGhhdmUgdHlwZSBwYXJhbWV0ZXJzIGFzIGZ1bmN0aW9uCiAgICAgIC8vIHBhcmFtZXRlcnMsIGFuZCB0eXBlIHBhcmFtZXRlcnMgYXJlIGRlY2xhcmVkIGluIHRoZSBjbGFzcywgbm90CiAgICAgIC8vIHRoZSBmYWN0b3J5LgogICAgICBpZiAodXNhZ2UgPT0gVmFyaWFibGVVc2UuZXhwbGljaXQpIHsKICAgICAgICBfY3VycmVudFNjb3BlSW5mby5mcmVlVmFyaWFibGVzLmFkZCh2YXJpYWJsZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2N1cnJlbnRTY29wZUluZm8uZnJlZVZhcmlhYmxlc0ZvclJ0aQogICAgICAgICAgICAucHV0SWZBYnNlbnQodmFyaWFibGUsICgpID0+IG5ldyBTZXQ8VmFyaWFibGVVc2U+KCkpCiAgICAgICAgICAgIC5hZGQodXNhZ2UpOwogICAgICB9CiAgICB9CiAgICBpZiAoX2luVHJ5ICYmIHZhcmlhYmxlIGlzIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24pIHsKICAgICAgX2N1cnJlbnRTY29wZUluZm8ubG9jYWxzVXNlZEluVHJ5T3JTeW5jLmFkZCh2YXJpYWJsZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRUaGlzRXhwcmVzc2lvbihpci5UaGlzRXhwcmVzc2lvbiB0aGlzRXhwcmVzc2lvbikgewogICAgaWYgKF9oYXNUaGlzTG9jYWwpIHsKICAgICAgX3JlZ2lzdGVyTmVlZHNUaGlzKFZhcmlhYmxlVXNlLmV4cGxpY2l0KTsKICAgIH0KICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0VHlwZVBhcmFtZXRlcihpci5UeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIpIHsKICAgIGlyLlRyZWVOb2RlIGNvbnRleHQgPSBfZXhlY3V0YWJsZUNvbnRleHQ7CiAgICBUeXBlVmFyaWFibGVUeXBlV2l0aENvbnRleHQgdHlwZVZhcmlhYmxlID0gbmV3IFR5cGVWYXJpYWJsZVR5cGVXaXRoQ29udGV4dCgKICAgICAgICBuZXcgaXIuVHlwZVBhcmFtZXRlclR5cGUodHlwZVBhcmFtZXRlciksCiAgICAgICAgLy8gSWYgdGhpcyB0eXBlUGFyYW1ldGVyIGlzIHBhcnQgb2YgYSB0eXBlZGVmIHRoZW4gaXRzIHBhcmVudCBpcwogICAgICAgIC8vIG51bGwgYmVjYXVzZSBpdCBoYXMgbm8gY29udGV4dC4gSnVzdCBwYXNzIGluIG51bGwgZm9yIHRoZQogICAgICAgIC8vIGNvbnRleHQgaW4gdGhhdCBjYXNlLgogICAgICAgIHR5cGVQYXJhbWV0ZXIucGFyZW50ICE9IG51bGwgPyB0eXBlUGFyYW1ldGVyLnBhcmVudC5wYXJlbnQgOiBudWxsKTsKICAgIGlmIChfaXNJbnNpZGVDbG9zdXJlICYmIGNvbnRleHQgaXMgaXIuUHJvY2VkdXJlICYmIGNvbnRleHQuaXNGYWN0b3J5KSB7CiAgICAgIC8vIFRoaXMgaXMgYSBjbG9zdXJlIGluIGEgZmFjdG9yeSBjb25zdHJ1Y3Rvci4gIFNpbmNlIHRoZXJlIGlzIG5vCiAgICAgIC8vIFs6dGhpczpdLCB3ZSBoYXZlIHRvIG1hcmsgdGhlIHR5cGUgYXJndW1lbnRzIGFzIGZyZWUgdmFyaWFibGVzIHRvCiAgICAgIC8vIGNhcHR1cmUgdGhlbSBpbiB0aGUgY2xvc3VyZS4KICAgICAgX3VzZVR5cGVWYXJpYWJsZUFzTG9jYWwodHlwZVZhcmlhYmxlLCBfY3VycmVudFR5cGVVc2FnZSk7CiAgICB9CgogICAgaWYgKF9leGVjdXRhYmxlQ29udGV4dCBpcyBpci5NZW1iZXIgJiYgX2V4ZWN1dGFibGVDb250ZXh0IGlzISBpci5GaWVsZCkgewogICAgICAvLyBJbiBjaGVja2VkIG1vZGUsIHVzaW5nIGEgdHlwZSB2YXJpYWJsZSBpbiBhIHR5cGUgYW5ub3RhdGlvbiBtYXkgbGVhZAogICAgICAvLyB0byBhIHJ1bnRpbWUgdHlwZSBjaGVjayB0aGF0IG5lZWRzIHRvIGFjY2VzcyB0aGUgdHlwZSBhcmd1bWVudCBhbmQKICAgICAgLy8gdGhlcmVmb3JlIHRoZSBjbG9zdXJlIG5lZWRzIGEgdGhpcy1lbGVtZW50LCBpZiBpdCBpcyBub3QgaW4gYSBmaWVsZAogICAgICAvLyBpbml0aWFsaXplcjsgZmllbGQgaW5pdGlhbGl6ZXJzIGFyZSBldmFsdWF0ZWQgaW4gYSBjb250ZXh0IHdoZXJlCiAgICAgIC8vIHRoZSB0eXBlIGFyZ3VtZW50cyBhcmUgYXZhaWxhYmxlIGluIGxvY2Fscy4KCiAgICAgIGlmIChfaGFzVGhpc0xvY2FsKSB7CiAgICAgICAgX3JlZ2lzdGVyTmVlZHNUaGlzKF9jdXJyZW50VHlwZVVzYWdlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfdXNlVHlwZVZhcmlhYmxlQXNMb2NhbCh0eXBlVmFyaWFibGUsIF9jdXJyZW50VHlwZVVzYWdlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5jb25zdGFudCgpOwogIH0KCiAgLy8vIEFkZCBgdGhpc2AgYXMgYSB2YXJpYWJsZSB0aGF0IG5lZWRzIHRvIGJlIGFjY2Vzc2VkIChhbmQgdGh1cyBtYXkgYmVjb21lIGEKICAvLy8gZnJlZS9jYXB0dXJlZCB2YXJpYWJsZS4KICAvLy8gSWYgW29ubHlJZk5lZWRzUnRpXSBpcyB0cnVlLCBzZXQgdGhpc1VzZWRBc0ZyZWVWYXJpYWJsZUlmTmVlZHNSdGkgdG8gdHJ1ZQogIC8vLyBpbnN0ZWFkIG9mIHRoaXNVc2VkQXNGcmVlVmFyaWFibGUgYXMgd2Ugd2lsbCBvbmx5IHVzZSBgdGhpc2AgaWYgcnVudGltZQogIC8vLyB0eXBlIGluZm9ybWF0aW9uIGlzIGNoZWNrZWQuCiAgdm9pZCBfcmVnaXN0ZXJOZWVkc1RoaXMoVmFyaWFibGVVc2UgdXNhZ2UpIHsKICAgIGlmIChfaXNJbnNpZGVDbG9zdXJlKSB7CiAgICAgIGlmICh1c2FnZSA9PSBWYXJpYWJsZVVzZS5leHBsaWNpdCkgewogICAgICAgIF9jdXJyZW50U2NvcGVJbmZvLnRoaXNVc2VkQXNGcmVlVmFyaWFibGUgPSB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIF9jdXJyZW50U2NvcGVJbmZvLnRoaXNVc2VkQXNGcmVlVmFyaWFibGVJZk5lZWRzUnRpLmFkZCh1c2FnZSk7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdEZvckluU3RhdGVtZW50KGlyLkZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIC8vIFdlIG5lZWQgdG8gc2V0IGBpblRyeWAgdG8gdHJ1ZSBpZiB0aGlzIGlzIGFuIGFzeW5jIGZvci1pbiBiZWNhdXNlIHdlCiAgICAvLyBkZXN1Z2FyIGl0IGludG8gYSB0cnktZmluYWxseSBpbiB0aGUgU1NBIHBoYXNlLgogICAgYm9vbCBvbGRJblRyeSA9IF9pblRyeTsKICAgIGlmIChub2RlLmlzQXN5bmMpIHsKICAgICAgX2luVHJ5ID0gdHJ1ZTsKICAgIH0KICAgIGVudGVyTmV3U2NvcGUobm9kZSwgKCkgewogICAgICB2aXNpdE5vZGUobm9kZS52YXJpYWJsZSk7CiAgICAgIHZpc2l0SW5WYXJpYWJsZVNjb3BlKG5vZGUsICgpIHsKICAgICAgICB2aXNpdE5vZGUobm9kZS5pdGVyYWJsZSk7CiAgICAgICAgdmlzaXROb2RlKG5vZGUuYm9keSk7CiAgICAgIH0pOwogICAgfSk7CiAgICBpZiAobm9kZS5pc0FzeW5jKSB7CiAgICAgIF9pblRyeSA9IG9sZEluVHJ5OwogICAgfQogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRXaGlsZVN0YXRlbWVudChpci5XaGlsZVN0YXRlbWVudCBub2RlKSB7CiAgICBlbnRlck5ld1Njb3BlKG5vZGUsICgpIHsKICAgICAgdmlzaXRJblZhcmlhYmxlU2NvcGUobm9kZSwgKCkgewogICAgICAgIHZpc2l0Tm9kZShub2RlLmNvbmRpdGlvbik7CiAgICAgICAgdmlzaXROb2RlKG5vZGUuYm9keSk7CiAgICAgIH0pOwogICAgfSk7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdERvU3RhdGVtZW50KGlyLkRvU3RhdGVtZW50IG5vZGUpIHsKICAgIGVudGVyTmV3U2NvcGUobm9kZSwgKCkgewogICAgICB2aXNpdEluVmFyaWFibGVTY29wZShub2RlLCAoKSB7CiAgICAgICAgdmlzaXROb2RlKG5vZGUuYm9keSk7CiAgICAgICAgdmlzaXROb2RlKG5vZGUuY29uZGl0aW9uKTsKICAgICAgfSk7CiAgICB9KTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0Rm9yU3RhdGVtZW50KGlyLkZvclN0YXRlbWVudCBub2RlKSB7CiAgICBMaXN0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+IGJveGVkTG9vcFZhcmlhYmxlcyA9CiAgICAgICAgPGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+W107CiAgICBlbnRlck5ld1Njb3BlKG5vZGUsICgpIHsKICAgICAgLy8gRmlyc3QgdmlzaXQgaW5pdGlhbGl6ZWQgdmFyaWFibGVzIGFuZCB1cGRhdGUgc3RlcHMgc28gd2UgY2FuIGVhc2lseQogICAgICAvLyBjaGVjayBpZiBhIGxvb3AgdmFyaWFibGUgd2FzIGNhcHR1cmVkIGluIG9uZSBvZiB0aGVzZSBzdWJleHByZXNzaW9ucy4KICAgICAgdmlzaXROb2Rlcyhub2RlLnZhcmlhYmxlcyk7CiAgICAgIHZpc2l0SW5WYXJpYWJsZVNjb3BlKG5vZGUsICgpIHsKICAgICAgICB2aXNpdE5vZGVzKG5vZGUudXBkYXRlcyk7CiAgICAgIH0pOwoKICAgICAgLy8gTG9vcCB2YXJpYWJsZXMgdGhhdCBoYXZlIG5vdCBiZWVuIGNhcHR1cmVkIHlldCBjYW4gc2FmZWx5IGJlIGZsYWdnZWQgYXMKICAgICAgLy8gbm9uLW11dGF0ZWQsIGJlY2F1c2Ugbm8gbmVzdGVkIGZ1bmN0aW9uIGNhbiBvYnNlcnZlIHRoZSBtdXRhdGlvbi4KICAgICAgZm9yIChpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlIGluIG5vZGUudmFyaWFibGVzKSB7CiAgICAgICAgaWYgKCFfY2FwdHVyZWRWYXJpYWJsZXMuY29udGFpbnModmFyaWFibGUpKSB7CiAgICAgICAgICBfbXV0YXRlZFZhcmlhYmxlcy5yZW1vdmUodmFyaWFibGUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gVmlzaXQgY29uZGl0aW9uIGFuZCBib2R5LgogICAgICAvLyBUaGlzIG11c3QgaGFwcGVuIGFmdGVyIHRoZSBhYm92ZSwgc28gYW55IGxvb3AgdmFyaWFibGVzIG11dGF0ZWQgaW4gdGhlCiAgICAgIC8vIGNvbmRpdGlvbiBvciBib2R5IGFyZSBpbmRlZWQgZmxhZ2dlZCBhcyBtdXRhdGVkLgogICAgICB2aXNpdEluVmFyaWFibGVTY29wZShub2RlLCAoKSB7CiAgICAgICAgdmlzaXROb2RlKG5vZGUuY29uZGl0aW9uKTsKICAgICAgICB2aXNpdE5vZGUobm9kZS5ib2R5KTsKICAgICAgfSk7CgogICAgICAvLyBTZWUgaWYgd2UgaGF2ZSBkZWNsYXJlZCBsb29wIHZhcmlhYmxlcyB0aGF0IG5lZWQgdG8gYmUgYm94ZWQuCiAgICAgIGZvciAoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSBpbiBub2RlLnZhcmlhYmxlcykgewogICAgICAgIC8vIE5vbi1tdXRhdGVkIHZhcmlhYmxlcyBzaG91bGQgbm90IGJlIGJveGVkLiAgVGhlIF9tdXRhdGVkVmFyaWFibGVzIHNldAogICAgICAgIC8vIGdldHMgY2xlYXJlZCB3aGVuIGBlbnRlck5ld1Njb3BlYCByZXR1cm5zLCBzbyBjaGVjayBpdCBoZXJlLgogICAgICAgIGlmIChfY2FwdHVyZWRWYXJpYWJsZXMuY29udGFpbnModmFyaWFibGUpICYmCiAgICAgICAgICAgIF9tdXRhdGVkVmFyaWFibGVzLmNvbnRhaW5zKHZhcmlhYmxlKSkgewogICAgICAgICAgYm94ZWRMb29wVmFyaWFibGVzLmFkZCh2YXJpYWJsZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIEtlcm5lbENhcHR1cmVkU2NvcGUgc2NvcGUgPSBfc2NvcGVzQ2FwdHVyZWRJbkNsb3N1cmVNYXBbbm9kZV07CiAgICBpZiAoc2NvcGUgIT0gbnVsbCkgewogICAgICBfc2NvcGVzQ2FwdHVyZWRJbkNsb3N1cmVNYXBbbm9kZV0gPSBuZXcgS2VybmVsQ2FwdHVyZWRMb29wU2NvcGUoCiAgICAgICAgICBzY29wZS5ib3hlZFZhcmlhYmxlcywKICAgICAgICAgIHNjb3BlLmNhcHR1cmVkVmFyaWFibGVzQWNjZXNzb3IsCiAgICAgICAgICBib3hlZExvb3BWYXJpYWJsZXMsCiAgICAgICAgICBzY29wZS5sb2NhbHNVc2VkSW5UcnlPclN5bmMsCiAgICAgICAgICBzY29wZS5mcmVlVmFyaWFibGVzLAogICAgICAgICAgc2NvcGUuZnJlZVZhcmlhYmxlc0ZvclJ0aSwKICAgICAgICAgIHNjb3BlLnRoaXNVc2VkQXNGcmVlVmFyaWFibGUsCiAgICAgICAgICBzY29wZS50aGlzVXNlZEFzRnJlZVZhcmlhYmxlSWZOZWVkc1J0aSwKICAgICAgICAgIHNjb3BlLmhhc1RoaXNMb2NhbCk7CiAgICB9CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbigKICAgICAgaXIuU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGlmIChfaGFzVGhpc0xvY2FsKSB7CiAgICAgIF9yZWdpc3Rlck5lZWRzVGhpcyhWYXJpYWJsZVVzZS5leHBsaWNpdCk7CiAgICB9CiAgICBpZiAobm9kZS5hcmd1bWVudHMudHlwZXMuaXNOb3RFbXB0eSkgewogICAgICB2aXNpdE5vZGVzSW5Db250ZXh0KG5vZGUuYXJndW1lbnRzLnR5cGVzLAogICAgICAgICAgbmV3IFZhcmlhYmxlVXNlLnN0YXRpY1R5cGVBcmd1bWVudChub2RlLmludGVyZmFjZVRhcmdldCkpOwogICAgfQogICAgdmlzaXROb2Rlcyhub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsKTsKICAgIHZpc2l0Tm9kZXMobm9kZS5hcmd1bWVudHMubmFtZWQpOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRTdXBlclByb3BlcnR5U2V0KGlyLlN1cGVyUHJvcGVydHlTZXQgbm9kZSkgewogICAgaWYgKF9oYXNUaGlzTG9jYWwpIHsKICAgICAgX3JlZ2lzdGVyTmVlZHNUaGlzKFZhcmlhYmxlVXNlLmV4cGxpY2l0KTsKICAgIH0KICAgIHZpc2l0Tm9kZShub2RlLnZhbHVlKTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0U3VwZXJQcm9wZXJ0eUdldChpci5TdXBlclByb3BlcnR5R2V0IG5vZGUpIHsKICAgIGlmIChfaGFzVGhpc0xvY2FsKSB7CiAgICAgIF9yZWdpc3Rlck5lZWRzVGhpcyhWYXJpYWJsZVVzZS5leHBsaWNpdCk7CiAgICB9CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIHZvaWQgdmlzaXRJbnZva2FibGUoaXIuVHJlZU5vZGUgbm9kZSwgdm9pZCBmKCkpIHsKICAgIGFzc2VydChub2RlIGlzIGlyLk1lbWJlciB8fAogICAgICAgIG5vZGUgaXMgaXIuRnVuY3Rpb25FeHByZXNzaW9uIHx8CiAgICAgICAgbm9kZSBpcyBpci5GdW5jdGlvbkRlY2xhcmF0aW9uKTsKICAgIGJvb2wgb2xkSXNJbnNpZGVDbG9zdXJlID0gX2lzSW5zaWRlQ2xvc3VyZTsKICAgIGlyLlRyZWVOb2RlIG9sZEV4ZWN1dGFibGVDb250ZXh0ID0gX2V4ZWN1dGFibGVDb250ZXh0OwogICAgS2VybmVsU2NvcGVJbmZvIG9sZFNjb3BlSW5mbyA9IF9jdXJyZW50U2NvcGVJbmZvOwoKICAgIC8vIF9vdXRlcm1vc3ROb2RlIGlzIG9ubHkgbnVsbCB0aGUgZmlyc3QgdGltZSB3ZSBlbnRlciB0aGUgYm9keSBvZiB0aGUKICAgIC8vIGZpZWxkLCBjb25zdHJ1Y3Rvciwgb3IgbWV0aG9kIHRoYXQgaXMgYmVpbmcgYW5hbHl6ZWQuCiAgICBfaXNJbnNpZGVDbG9zdXJlID0gX291dGVybW9zdE5vZGUgIT0gbnVsbDsKICAgIF9leGVjdXRhYmxlQ29udGV4dCA9IG5vZGU7CgogICAgX2N1cnJlbnRTY29wZUluZm8gPSBuZXcgS2VybmVsU2NvcGVJbmZvKF9oYXNUaGlzTG9jYWwpOwoKICAgIGlmIChfaXNJbnNpZGVDbG9zdXJlKSB7CiAgICAgIF9jbG9zdXJlc1RvR2VuZXJhdGVbbm9kZV0gPSBfY3VycmVudFNjb3BlSW5mbzsKICAgIH0gZWxzZSB7CiAgICAgIF9vdXRlcm1vc3ROb2RlID0gbm9kZTsKICAgICAgX21vZGVsLnNjb3BlSW5mbyA9IF9jdXJyZW50U2NvcGVJbmZvOwogICAgfQoKICAgIGVudGVyTmV3U2NvcGUobm9kZSwgZik7CgogICAgS2VybmVsU2NvcGVJbmZvIHNhdmVkU2NvcGVJbmZvID0gX2N1cnJlbnRTY29wZUluZm87CiAgICBib29sIHNhdmVkSXNJbnNpZGVDbG9zdXJlID0gX2lzSW5zaWRlQ2xvc3VyZTsKCiAgICAvLyBSZXN0b3JlIG9sZCB2YWx1ZXMuCiAgICBfaXNJbnNpZGVDbG9zdXJlID0gb2xkSXNJbnNpZGVDbG9zdXJlOwogICAgX2N1cnJlbnRTY29wZUluZm8gPSBvbGRTY29wZUluZm87CiAgICBfZXhlY3V0YWJsZUNvbnRleHQgPSBvbGRFeGVjdXRhYmxlQ29udGV4dDsKCiAgICAvLyBNYXJrIGFsbCBmcmVlIHZhcmlhYmxlcyBhcyBjYXB0dXJlZCBhbmQgZXhwZWN0IHRvIGVuY291bnRlciB0aGVtIGluIHRoZQogICAgLy8gb3V0ZXIgZnVuY3Rpb24uCiAgICBJdGVyYWJsZTxpci5Ob2RlPiBmcmVlVmFyaWFibGVzID0gc2F2ZWRTY29wZUluZm8uZnJlZVZhcmlhYmxlczsKICAgIGFzc2VydChmcmVlVmFyaWFibGVzLmlzRW1wdHkgfHwgc2F2ZWRJc0luc2lkZUNsb3N1cmUpOwogICAgZm9yIChpci5Ob2RlIGZyZWVWYXJpYWJsZSBpbiBmcmVlVmFyaWFibGVzKSB7CiAgICAgIF9jYXB0dXJlZFZhcmlhYmxlcy5hZGQoZnJlZVZhcmlhYmxlKTsKICAgICAgX21hcmtWYXJpYWJsZUFzVXNlZChmcmVlVmFyaWFibGUsIFZhcmlhYmxlVXNlLmV4cGxpY2l0KTsKICAgIH0KICAgIHNhdmVkU2NvcGVJbmZvLmZyZWVWYXJpYWJsZXNGb3JSdGkuZm9yRWFjaCgKICAgICAgICAoVHlwZVZhcmlhYmxlVHlwZVdpdGhDb250ZXh0IGZyZWVWYXJpYWJsZUZvclJ0aSwKICAgICAgICAgICAgU2V0PFZhcmlhYmxlVXNlPiB1c2VTZXQpIHsKICAgICAgZm9yIChWYXJpYWJsZVVzZSB1c2FnZSBpbiB1c2VTZXQpIHsKICAgICAgICBfbWFya1ZhcmlhYmxlQXNVc2VkKGZyZWVWYXJpYWJsZUZvclJ0aSwgdXNhZ2UpOwogICAgICB9CiAgICB9KTsKICAgIGlmIChfaXNJbnNpZGVDbG9zdXJlICYmIHNhdmVkU2NvcGVJbmZvLnRoaXNVc2VkQXNGcmVlVmFyaWFibGUpIHsKICAgICAgX2N1cnJlbnRTY29wZUluZm8udGhpc1VzZWRBc0ZyZWVWYXJpYWJsZSA9IHRydWU7CiAgICB9CiAgICBpZiAoX2lzSW5zaWRlQ2xvc3VyZSkgewogICAgICBfY3VycmVudFNjb3BlSW5mby50aGlzVXNlZEFzRnJlZVZhcmlhYmxlSWZOZWVkc1J0aQogICAgICAgICAgLmFkZEFsbChzYXZlZFNjb3BlSW5mby50aGlzVXNlZEFzRnJlZVZhcmlhYmxlSWZOZWVkc1J0aSk7CiAgICB9CiAgfQoKICAvLy8gUmV0dXJuIHRydWUgaWYgW3ZhcmlhYmxlXSdzIGNvbnRleHQgaXMgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgZXhlY3V0YWJsZQogIC8vLyBjb250ZXh0LgogIGJvb2wgX2luQ3VycmVudENvbnRleHQoaXIuTm9kZSB2YXJpYWJsZSkgewogICAgYXNzZXJ0KHZhcmlhYmxlIGlzIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gfHwKICAgICAgICB2YXJpYWJsZSBpcyBUeXBlVmFyaWFibGVUeXBlV2l0aENvbnRleHQpOwogICAgaWYgKHZhcmlhYmxlIGlzIFR5cGVWYXJpYWJsZVR5cGVXaXRoQ29udGV4dCkgewogICAgICByZXR1cm4gdmFyaWFibGUuY29udGV4dCA9PSBfZXhlY3V0YWJsZUNvbnRleHQ7CiAgICB9CiAgICBpci5UcmVlTm9kZSBub2RlID0gdmFyaWFibGU7CiAgICB3aGlsZSAobm9kZSAhPSBfb3V0ZXJtb3N0Tm9kZSAmJiBub2RlICE9IF9leGVjdXRhYmxlQ29udGV4dCkgewogICAgICBub2RlID0gbm9kZS5wYXJlbnQ7CiAgICB9CiAgICByZXR1cm4gbm9kZSA9PSBfZXhlY3V0YWJsZUNvbnRleHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRGaWVsZChpci5GaWVsZCBub2RlKSB7CiAgICBfY3VycmVudFR5cGVVc2FnZSA9IFZhcmlhYmxlVXNlLmZpZWxkVHlwZTsKICAgIEluaXRpYWxpemVyQ29tcGxleGl0eSBjb21wbGV4aXR5OwogICAgdmlzaXRJbnZva2FibGUobm9kZSwgKCkgewogICAgICBjb21wbGV4aXR5ID0gdmlzaXROb2RlKG5vZGUuaW5pdGlhbGl6ZXIpOwogICAgfSk7CiAgICBfY3VycmVudFR5cGVVc2FnZSA9IG51bGw7CiAgICByZXR1cm4gY29tcGxleGl0eTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdENvbnN0cnVjdG9yKGlyLkNvbnN0cnVjdG9yIG5vZGUpIHsKICAgIHZpc2l0SW52b2thYmxlKG5vZGUsICgpIHsKICAgICAgdmlzaXROb2Rlcyhub2RlLmluaXRpYWxpemVycyk7CiAgICAgIHZpc2l0Tm9kZShub2RlLmZ1bmN0aW9uKTsKICAgIH0pOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRQcm9jZWR1cmUoaXIuUHJvY2VkdXJlIG5vZGUpIHsKICAgIHZpc2l0SW52b2thYmxlKG5vZGUsICgpIHsKICAgICAgdmlzaXROb2RlKG5vZGUuZnVuY3Rpb24pOwogICAgfSk7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbihpci5GdW5jdGlvbkV4cHJlc3Npb24gbm9kZSkgewogICAgdmlzaXRJbnZva2FibGUobm9kZSwgKCkgewogICAgICB2aXNpdEluVmFyaWFibGVTY29wZShub2RlLCAoKSB7CiAgICAgICAgdmlzaXROb2RlKG5vZGUuZnVuY3Rpb24pOwogICAgICB9KTsKICAgIH0pOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24gbm9kZSkgewogICAgdmlzaXRJbnZva2FibGUobm9kZSwgKCkgewogICAgICB2aXNpdEluVmFyaWFibGVTY29wZShub2RlLCAoKSB7CiAgICAgICAgdmlzaXROb2RlKG5vZGUuZnVuY3Rpb24pOwogICAgICB9KTsKICAgIH0pOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXREeW5hbWljVHlwZShpci5EeW5hbWljVHlwZSBub2RlKSA9PgogICAgICBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkuY29uc3RhbnQoKTsKCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0Qm90dG9tVHlwZShpci5Cb3R0b21UeXBlIG5vZGUpID0+CiAgICAgIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdEludmFsaWRUeXBlKGlyLkludmFsaWRUeXBlIG5vZGUpID0+CiAgICAgIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdFZvaWRUeXBlKGlyLlZvaWRUeXBlIG5vZGUpID0+CiAgICAgIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5jb25zdGFudCgpOwoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRJbnRlcmZhY2VUeXBlKGlyLkludGVyZmFjZVR5cGUgbm9kZSkgewogICAgcmV0dXJuIHZpc2l0Tm9kZXMobm9kZS50eXBlQXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdEZ1bmN0aW9uVHlwZShpci5GdW5jdGlvblR5cGUgbm9kZSkgewogICAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IGNvbXBsZXhpdHkgPSB2aXNpdE5vZGUobm9kZS5yZXR1cm5UeXBlKTsKICAgIGNvbXBsZXhpdHkgPSBjb21wbGV4aXR5LmNvbWJpbmUodmlzaXROb2Rlcyhub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSk7CiAgICBjb21wbGV4aXR5ID0gY29tcGxleGl0eS5jb21iaW5lKHZpc2l0Tm9kZXMobm9kZS5uYW1lZFBhcmFtZXRlcnMpKTsKICAgIHJldHVybiBjb21wbGV4aXR5LmNvbWJpbmUodmlzaXROb2Rlcyhub2RlLnR5cGVQYXJhbWV0ZXJzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXROYW1lZFR5cGUoaXIuTmFtZWRUeXBlIG5vZGUpIHsKICAgIHJldHVybiB2aXNpdE5vZGUobm9kZS50eXBlKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKGlyLlR5cGVQYXJhbWV0ZXJUeXBlIG5vZGUpIHsKICAgIF9hbmFseXplVHlwZVZhcmlhYmxlKG5vZGUsIF9jdXJyZW50VHlwZVVzYWdlKTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0SW5Db250ZXh0KGlyLk5vZGUgbm9kZSwgVmFyaWFibGVVc2UgdXNlKSB7CiAgICBWYXJpYWJsZVVzZSBvbGRDdXJyZW50VHlwZVVzYWdlID0gX2N1cnJlbnRUeXBlVXNhZ2U7CiAgICBfY3VycmVudFR5cGVVc2FnZSA9IHVzZTsKICAgIEluaXRpYWxpemVyQ29tcGxleGl0eSBjb21wbGV4aXR5ID0gdmlzaXROb2RlKG5vZGUpOwogICAgX2N1cnJlbnRUeXBlVXNhZ2UgPSBvbGRDdXJyZW50VHlwZVVzYWdlOwogICAgcmV0dXJuIGNvbXBsZXhpdHk7CiAgfQoKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXROb2Rlc0luQ29udGV4dCgKICAgICAgTGlzdDxpci5Ob2RlPiBub2RlcywgVmFyaWFibGVVc2UgdXNlKSB7CiAgICBWYXJpYWJsZVVzZSBvbGRDdXJyZW50VHlwZVVzYWdlID0gX2N1cnJlbnRUeXBlVXNhZ2U7CiAgICBfY3VycmVudFR5cGVVc2FnZSA9IHVzZTsKICAgIEluaXRpYWxpemVyQ29tcGxleGl0eSBjb21wbGV4aXR5ID0gdmlzaXROb2Rlcyhub2Rlcyk7CiAgICBfY3VycmVudFR5cGVVc2FnZSA9IG9sZEN1cnJlbnRUeXBlVXNhZ2U7CiAgICByZXR1cm4gY29tcGxleGl0eTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdFR5cGVMaXRlcmFsKGlyLlR5cGVMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiB2aXNpdEluQ29udGV4dChub2RlLnR5cGUsIFZhcmlhYmxlVXNlLmV4cGxpY2l0KTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdElzRXhwcmVzc2lvbihpci5Jc0V4cHJlc3Npb24gbm9kZSkgewogICAgdmlzaXROb2RlKG5vZGUub3BlcmFuZCk7CiAgICB2aXNpdEluQ29udGV4dChub2RlLnR5cGUsIFZhcmlhYmxlVXNlLmV4cGxpY2l0KTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0QXNFeHByZXNzaW9uKGlyLkFzRXhwcmVzc2lvbiBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS5vcGVyYW5kKTsKICAgIHZpc2l0SW5Db250ZXh0KG5vZGUudHlwZSwKICAgICAgICBub2RlLmlzVHlwZUVycm9yID8gVmFyaWFibGVVc2UuaW1wbGljaXRDYXN0IDogVmFyaWFibGVVc2UuZXhwbGljaXQpOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRBd2FpdEV4cHJlc3Npb24oaXIuQXdhaXRFeHByZXNzaW9uIG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLm9wZXJhbmQpOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRZaWVsZFN0YXRlbWVudChpci5ZaWVsZFN0YXRlbWVudCBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS5leHByZXNzaW9uKTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0TG9hZExpYnJhcnkoaXIuTG9hZExpYnJhcnkgbm9kZSkgewogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRDaGVja0xpYnJhcnlJc0xvYWRlZCgKICAgICAgaXIuQ2hlY2tMaWJyYXJ5SXNMb2FkZWQgbm9kZSkgewogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRGdW5jdGlvbk5vZGUoaXIuRnVuY3Rpb25Ob2RlIG5vZGUpIHsKICAgIFZhcmlhYmxlVXNlIHBhcmFtZXRlclVzYWdlID0gbm9kZS5wYXJlbnQgaXMgaXIuTWVtYmVyCiAgICAgICAgPyBuZXcgVmFyaWFibGVVc2UubWVtYmVyUGFyYW1ldGVyKG5vZGUucGFyZW50KQogICAgICAgIDogbmV3IFZhcmlhYmxlVXNlLmxvY2FsUGFyYW1ldGVyKG5vZGUucGFyZW50KTsKICAgIHZpc2l0Tm9kZXNJbkNvbnRleHQobm9kZS50eXBlUGFyYW1ldGVycywgcGFyYW1ldGVyVXNhZ2UpOwogICAgZm9yIChpci5WYXJpYWJsZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIGluIG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMpIHsKICAgICAgX2hhbmRsZVZhcmlhYmxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb24sIHBhcmFtZXRlclVzYWdlKTsKICAgIH0KICAgIGZvciAoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiBpbiBub2RlLm5hbWVkUGFyYW1ldGVycykgewogICAgICBfaGFuZGxlVmFyaWFibGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbiwgcGFyYW1ldGVyVXNhZ2UpOwogICAgfQogICAgdmlzaXRJbkNvbnRleHQoCiAgICAgICAgbm9kZS5yZXR1cm5UeXBlLAogICAgICAgIG5vZGUucGFyZW50IGlzIGlyLk1lbWJlcgogICAgICAgICAgICA/IG5ldyBWYXJpYWJsZVVzZS5tZW1iZXJSZXR1cm5UeXBlKG5vZGUucGFyZW50KQogICAgICAgICAgICA6IG5ldyBWYXJpYWJsZVVzZS5sb2NhbFJldHVyblR5cGUobm9kZS5wYXJlbnQpKTsKICAgIHZpc2l0Tm9kZShub2RlLmJvZHkpOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRMaXN0TGl0ZXJhbChpci5MaXN0TGl0ZXJhbCBub2RlKSB7CiAgICBJbml0aWFsaXplckNvbXBsZXhpdHkgY29tcGxleGl0eSA9CiAgICAgICAgdmlzaXRJbkNvbnRleHQobm9kZS50eXBlQXJndW1lbnQsIFZhcmlhYmxlVXNlLmxpc3RMaXRlcmFsKTsKICAgIGNvbXBsZXhpdHkgPSBjb21wbGV4aXR5LmNvbWJpbmUodmlzaXROb2Rlcyhub2RlLmV4cHJlc3Npb25zKSk7CiAgICBpZiAobm9kZS5pc0NvbnN0KSB7CiAgICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkuY29uc3RhbnQoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBjb21wbGV4aXR5Lm1ha2VFYWdlcigpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0U2V0TGl0ZXJhbChpci5TZXRMaXRlcmFsIG5vZGUpIHsKICAgIEluaXRpYWxpemVyQ29tcGxleGl0eSBjb21wbGV4aXR5ID0KICAgICAgICB2aXNpdEluQ29udGV4dChub2RlLnR5cGVBcmd1bWVudCwgVmFyaWFibGVVc2Uuc2V0TGl0ZXJhbCk7CiAgICBjb21wbGV4aXR5ID0gY29tcGxleGl0eS5jb21iaW5lKHZpc2l0Tm9kZXMobm9kZS5leHByZXNzaW9ucykpOwogICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmNvbnN0YW50KCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gY29tcGxleGl0eS5tYWtlRWFnZXIoKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdE1hcExpdGVyYWwoaXIuTWFwTGl0ZXJhbCBub2RlKSB7CiAgICBJbml0aWFsaXplckNvbXBsZXhpdHkgY29tcGxleGl0eSA9CiAgICAgICAgdmlzaXRJbkNvbnRleHQobm9kZS5rZXlUeXBlLCBWYXJpYWJsZVVzZS5tYXBMaXRlcmFsKTsKICAgIGNvbXBsZXhpdHkgPSBjb21wbGV4aXR5CiAgICAgICAgLmNvbWJpbmUodmlzaXRJbkNvbnRleHQobm9kZS52YWx1ZVR5cGUsIFZhcmlhYmxlVXNlLm1hcExpdGVyYWwpKTsKICAgIGNvbXBsZXhpdHkgPSBjb21wbGV4aXR5LmNvbWJpbmUodmlzaXROb2Rlcyhub2RlLmVudHJpZXMpKTsKICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5jb25zdGFudCgpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGNvbXBsZXhpdHkubWFrZUVhZ2VyKCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRNYXBFbnRyeShpci5NYXBFbnRyeSBub2RlKSB7CiAgICBJbml0aWFsaXplckNvbXBsZXhpdHkgY29tcGxleGl0eSA9IHZpc2l0Tm9kZShub2RlLmtleSk7CiAgICByZXR1cm4gY29tcGxleGl0eS5jb21iaW5lKHZpc2l0Tm9kZShub2RlLnZhbHVlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXROdWxsTGl0ZXJhbChpci5OdWxsTGl0ZXJhbCBub2RlKSA9PgogICAgICBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkuY29uc3RhbnQoKTsKCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0U3RyaW5nTGl0ZXJhbChpci5TdHJpbmdMaXRlcmFsIG5vZGUpID0+CiAgICAgIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5jb25zdGFudCgpOwoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRJbnRMaXRlcmFsKGlyLkludExpdGVyYWwgbm9kZSkgPT4KICAgICAgY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmNvbnN0YW50KCk7CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdERvdWJsZUxpdGVyYWwoaXIuRG91YmxlTGl0ZXJhbCBub2RlKSA9PgogICAgICBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkuY29uc3RhbnQoKTsKCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0U3ltYm9sTGl0ZXJhbChpci5TeW1ib2xMaXRlcmFsIG5vZGUpID0+CiAgICAgIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5jb25zdGFudCgpOwoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRCb29sTGl0ZXJhbChpci5Cb29sTGl0ZXJhbCBub2RlKSA9PgogICAgICBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkuY29uc3RhbnQoKTsKCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0U3RyaW5nQ29uY2F0ZW5hdGlvbihpci5TdHJpbmdDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIHZpc2l0Tm9kZXMobm9kZS5leHByZXNzaW9ucyk7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdFN0YXRpY0dldChpci5TdGF0aWNHZXQgbm9kZSkgewogICAgaXIuTWVtYmVyIHRhcmdldCA9IG5vZGUudGFyZ2V0OwogICAgaWYgKHRhcmdldCBpcyBpci5GaWVsZCkgewogICAgICByZXR1cm4gdGFyZ2V0LmlzQ29uc3QKICAgICAgICAgID8gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmNvbnN0YW50KCkKICAgICAgICAgIDogbmV3IEluaXRpYWxpemVyQ29tcGxleGl0eS5lYWdlcihmaWVsZHM6IDxpci5GaWVsZD57dGFyZ2V0fSk7CiAgICB9IGVsc2UgaWYgKHRhcmdldCBpcyBpci5Qcm9jZWR1cmUgJiYKICAgICAgICB0YXJnZXQua2luZCA9PSBpci5Qcm9jZWR1cmVLaW5kLk1ldGhvZCkgewogICAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmNvbnN0YW50KCk7CiAgICB9CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdFN0YXRpY1NldChpci5TdGF0aWNTZXQgbm9kZSkgewogICAgdmlzaXROb2RlKG5vZGUudmFsdWUpOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKGlyLlN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgaWYgKG5vZGUuYXJndW1lbnRzLnR5cGVzLmlzTm90RW1wdHkpIHsKICAgICAgVmFyaWFibGVVc2UgdXNhZ2U7CiAgICAgIGlmIChub2RlLnRhcmdldC5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuRmFjdG9yeSkgewogICAgICAgIHVzYWdlID0gbmV3IFZhcmlhYmxlVXNlLmNvbnN0cnVjdG9yVHlwZUFyZ3VtZW50KG5vZGUudGFyZ2V0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB1c2FnZSA9IG5ldyBWYXJpYWJsZVVzZS5zdGF0aWNUeXBlQXJndW1lbnQobm9kZS50YXJnZXQpOwogICAgICB9CgogICAgICB2aXNpdE5vZGVzSW5Db250ZXh0KG5vZGUuYXJndW1lbnRzLnR5cGVzLCB1c2FnZSk7CiAgICB9CiAgICB2aXNpdE5vZGVzKG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwpOwogICAgdmlzaXROb2Rlcyhub2RlLmFyZ3VtZW50cy5uYW1lZCk7CiAgICByZXR1cm4gbm9kZS5pc0NvbnN0CiAgICAgICAgPyBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkuY29uc3RhbnQoKQogICAgICAgIDogY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgaXIuQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGlmIChub2RlLmFyZ3VtZW50cy50eXBlcy5pc05vdEVtcHR5KSB7CiAgICAgIHZpc2l0Tm9kZXNJbkNvbnRleHQobm9kZS5hcmd1bWVudHMudHlwZXMsCiAgICAgICAgICBuZXcgVmFyaWFibGVVc2UuY29uc3RydWN0b3JUeXBlQXJndW1lbnQobm9kZS50YXJnZXQpKTsKICAgIH0KICAgIHZpc2l0Tm9kZXMobm9kZS5hcmd1bWVudHMucG9zaXRpb25hbCk7CiAgICB2aXNpdE5vZGVzKG5vZGUuYXJndW1lbnRzLm5hbWVkKTsKICAgIHJldHVybiBub2RlLmlzQ29uc3QKICAgICAgICA/IGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5jb25zdGFudCgpCiAgICAgICAgOiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uKAogICAgICBpci5Db25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgewogICAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IGNvbXBsZXhpdHkgPSB2aXNpdE5vZGUobm9kZS5jb25kaXRpb24pOwogICAgY29tcGxleGl0eSA9IGNvbXBsZXhpdHkuY29tYmluZSh2aXNpdE5vZGUobm9kZS50aGVuKSk7CiAgICByZXR1cm4gY29tcGxleGl0eS5jb21iaW5lKHZpc2l0Tm9kZShub2RlLm90aGVyd2lzZSkpOwogICAgLy8gRG9uJ3QgdmlzaXQgYG5vZGUuc3RhdGljVHlwZWAuCiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRNZXRob2RJbnZvY2F0aW9uKGlyLk1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgaXIuVHJlZU5vZGUgcmVjZWl2ZXIgPSBub2RlLnJlY2VpdmVyOwogICAgdmlzaXROb2RlKHJlY2VpdmVyKTsKICAgIGlmIChub2RlLmFyZ3VtZW50cy50eXBlcy5pc05vdEVtcHR5KSB7CiAgICAgIFZhcmlhYmxlVXNlIHVzYWdlOwogICAgICBpZiAocmVjZWl2ZXIgaXMgaXIuVmFyaWFibGVHZXQgJiYKICAgICAgICAgIChyZWNlaXZlci52YXJpYWJsZS5wYXJlbnQgaXMgaXIuRnVuY3Rpb25EZWNsYXJhdGlvbiB8fAogICAgICAgICAgICAgIHJlY2VpdmVyLnZhcmlhYmxlLnBhcmVudCBpcyBpci5GdW5jdGlvbkV4cHJlc3Npb24pKSB7CiAgICAgICAgdXNhZ2UgPQogICAgICAgICAgICBuZXcgVmFyaWFibGVVc2UubG9jYWxUeXBlQXJndW1lbnQocmVjZWl2ZXIudmFyaWFibGUucGFyZW50LCBub2RlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB1c2FnZSA9IG5ldyBWYXJpYWJsZVVzZS5pbnN0YW5jZVR5cGVBcmd1bWVudChub2RlKTsKICAgICAgfQogICAgICB2aXNpdE5vZGVzSW5Db250ZXh0KG5vZGUuYXJndW1lbnRzLnR5cGVzLCB1c2FnZSk7CiAgICB9CiAgICB2aXNpdE5vZGVzKG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwpOwogICAgdmlzaXROb2Rlcyhub2RlLmFyZ3VtZW50cy5uYW1lZCk7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZWNvZ25pemUgY29uc3RhbnQgb3BlcmF0aW9ucy4KICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0UHJvcGVydHlHZXQoaXIuUHJvcGVydHlHZXQgbm9kZSkgewogICAgdmlzaXROb2RlKG5vZGUucmVjZWl2ZXIpOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRQcm9wZXJ0eVNldChpci5Qcm9wZXJ0eVNldCBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS5yZWNlaXZlcik7CiAgICB2aXNpdE5vZGUobm9kZS52YWx1ZSk7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdERpcmVjdFByb3BlcnR5R2V0KGlyLkRpcmVjdFByb3BlcnR5R2V0IG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLnJlY2VpdmVyKTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0RGlyZWN0UHJvcGVydHlTZXQoaXIuRGlyZWN0UHJvcGVydHlTZXQgbm9kZSkgewogICAgdmlzaXROb2RlKG5vZGUucmVjZWl2ZXIpOwogICAgdmlzaXROb2RlKG5vZGUudmFsdWUpOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXROb3QoaXIuTm90IG5vZGUpIHsKICAgIHJldHVybiB2aXNpdE5vZGUobm9kZS5vcGVyYW5kKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdExvZ2ljYWxFeHByZXNzaW9uKGlyLkxvZ2ljYWxFeHByZXNzaW9uIG5vZGUpIHsKICAgIEluaXRpYWxpemVyQ29tcGxleGl0eSBjb21wbGV4aXR5ID0gdmlzaXROb2RlKG5vZGUubGVmdCk7CiAgICByZXR1cm4gY29tcGxleGl0eS5jb21iaW5lKHZpc2l0Tm9kZShub2RlLnJpZ2h0KSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRMZXQoaXIuTGV0IG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLnZhcmlhYmxlKTsKICAgIHZpc2l0Tm9kZShub2RlLmJvZHkpOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRCbG9ja0V4cHJlc3Npb24oaXIuQmxvY2tFeHByZXNzaW9uIG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLmJvZHkpOwogICAgdmlzaXROb2RlKG5vZGUudmFsdWUpOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRDYXRjaChpci5DYXRjaCBub2RlKSB7CiAgICB2aXNpdEluQ29udGV4dChub2RlLmd1YXJkLCBWYXJpYWJsZVVzZS5leHBsaWNpdCk7CiAgICB2aXNpdE5vZGUobm9kZS5leGNlcHRpb24pOwogICAgdmlzaXROb2RlKG5vZGUuc3RhY2tUcmFjZSk7CiAgICB2aXNpdEluVmFyaWFibGVTY29wZShub2RlLCAoKSB7CiAgICAgIHZpc2l0Tm9kZShub2RlLmJvZHkpOwogICAgfSk7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdEluc3RhbnRpYXRpb24oaXIuSW5zdGFudGlhdGlvbiBub2RlKSB7CiAgICBJbml0aWFsaXplckNvbXBsZXhpdHkgY29tcGxleGl0eSA9IHZpc2l0Tm9kZXNJbkNvbnRleHQoCiAgICAgICAgbm9kZS50eXBlQXJndW1lbnRzLCBuZXcgVmFyaWFibGVVc2UuaW5zdGFudGlhdGlvblR5cGVBcmd1bWVudChub2RlKSk7CiAgICByZXR1cm4gY29tcGxleGl0eS5jb21iaW5lKHZpc2l0Tm9kZShub2RlLmV4cHJlc3Npb24pKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdFRocm93KGlyLlRocm93IG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLmV4cHJlc3Npb24pOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRSZXRocm93KGlyLlJldGhyb3cgbm9kZSkgPT4KICAgICAgY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0QmxvY2soaXIuQmxvY2sgbm9kZSkgewogICAgdmlzaXROb2Rlcyhub2RlLnN0YXRlbWVudHMpOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRBc3NlcnRTdGF0ZW1lbnQoaXIuQXNzZXJ0U3RhdGVtZW50IG5vZGUpIHsKICAgIHZpc2l0SW5WYXJpYWJsZVNjb3BlKG5vZGUsICgpIHsKICAgICAgdmlzaXROb2RlKG5vZGUuY29uZGl0aW9uKTsKICAgICAgdmlzaXROb2RlKG5vZGUubWVzc2FnZSk7CiAgICB9KTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0UmV0dXJuU3RhdGVtZW50KGlyLlJldHVyblN0YXRlbWVudCBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS5leHByZXNzaW9uKTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0RW1wdHlTdGF0ZW1lbnQoaXIuRW1wdHlTdGF0ZW1lbnQgbm9kZSkgewogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KGlyLkV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgewogICAgdmlzaXROb2RlKG5vZGUuZXhwcmVzc2lvbik7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdFN3aXRjaFN0YXRlbWVudChpci5Td2l0Y2hTdGF0ZW1lbnQgbm9kZSkgewogICAgdmlzaXROb2RlKG5vZGUuZXhwcmVzc2lvbik7CiAgICB2aXNpdEluVmFyaWFibGVTY29wZShub2RlLCAoKSB7CiAgICAgIHZpc2l0Tm9kZXMobm9kZS5jYXNlcyk7CiAgICB9KTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0U3dpdGNoQ2FzZShpci5Td2l0Y2hDYXNlIG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLmJvZHkpOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRDb250aW51ZVN3aXRjaFN0YXRlbWVudCgKICAgICAgaXIuQ29udGludWVTd2l0Y2hTdGF0ZW1lbnQgbm9kZSkgewogICAgcmVnaXN0ZXJDb250aW51ZVN3aXRjaCgpOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRCcmVha1N0YXRlbWVudChpci5CcmVha1N0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdExhYmVsZWRTdGF0ZW1lbnQoaXIuTGFiZWxlZFN0YXRlbWVudCBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS5ib2R5KTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0RmllbGRJbml0aWFsaXplcihpci5GaWVsZEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLnZhbHVlKTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0TG9jYWxJbml0aWFsaXplcihpci5Mb2NhbEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLnZhcmlhYmxlLmluaXRpYWxpemVyKTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0U3VwZXJJbml0aWFsaXplcihpci5TdXBlckluaXRpYWxpemVyIG5vZGUpIHsKICAgIGlmIChub2RlLmFyZ3VtZW50cy50eXBlcy5pc05vdEVtcHR5KSB7CiAgICAgIHZpc2l0Tm9kZXNJbkNvbnRleHQobm9kZS5hcmd1bWVudHMudHlwZXMsCiAgICAgICAgICBuZXcgVmFyaWFibGVVc2UuY29uc3RydWN0b3JUeXBlQXJndW1lbnQobm9kZS50YXJnZXQpKTsKICAgIH0KICAgIHZpc2l0Tm9kZXMobm9kZS5hcmd1bWVudHMucG9zaXRpb25hbCk7CiAgICB2aXNpdE5vZGVzKG5vZGUuYXJndW1lbnRzLm5hbWVkKTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0UmVkaXJlY3RpbmdJbml0aWFsaXplcigKICAgICAgaXIuUmVkaXJlY3RpbmdJbml0aWFsaXplciBub2RlKSB7CiAgICBpZiAobm9kZS5hcmd1bWVudHMudHlwZXMuaXNOb3RFbXB0eSkgewogICAgICB2aXNpdE5vZGVzSW5Db250ZXh0KG5vZGUuYXJndW1lbnRzLnR5cGVzLAogICAgICAgICAgbmV3IFZhcmlhYmxlVXNlLmNvbnN0cnVjdG9yVHlwZUFyZ3VtZW50KG5vZGUudGFyZ2V0KSk7CiAgICB9CiAgICB2aXNpdE5vZGVzKG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwpOwogICAgdmlzaXROb2Rlcyhub2RlLmFyZ3VtZW50cy5uYW1lZCk7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdEFzc2VydEluaXRpYWxpemVyKGlyLkFzc2VydEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLnN0YXRlbWVudCk7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdElmU3RhdGVtZW50KGlyLklmU3RhdGVtZW50IG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLmNvbmRpdGlvbik7CiAgICB2aXNpdE5vZGUobm9kZS50aGVuKTsKICAgIHZpc2l0Tm9kZShub2RlLm90aGVyd2lzZSk7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdENvbnN0YW50RXhwcmVzc2lvbihpci5Db25zdGFudEV4cHJlc3Npb24gbm9kZSkgewogICAgaWYgKG5vZGUuY29uc3RhbnQgaXMgaXIuVW5ldmFsdWF0ZWRDb25zdGFudCkgewogICAgICBub2RlLmNvbnN0YW50ID0gX2NvbnN0YW50RXZhbHVhdG9yLmV2YWx1YXRlKG5vZGUpOwogICAgfQogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5jb25zdGFudCgpOwogIH0KCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbm9kZSBpcyBhIGZpZWxkLCBvciBhIGNvbnN0cnVjdG9yIChmYWN0b3J5IG9yCiAgLy8vIGdlbmVyYXRpdmUpLgogIGJvb2wgX2lzRmllbGRPckNvbnN0cnVjdG9yKGlyLk5vZGUgbm9kZSkgPT4KICAgICAgbm9kZSBpcyBpci5Db25zdHJ1Y3RvciB8fAogICAgICBub2RlIGlzIGlyLkZpZWxkIHx8CiAgICAgIChub2RlIGlzIGlyLlByb2NlZHVyZSAmJiBub2RlLmlzRmFjdG9yeSk7CgogIHZvaWQgX2FuYWx5emVUeXBlVmFyaWFibGUoaXIuVHlwZVBhcmFtZXRlclR5cGUgdHlwZSwgVmFyaWFibGVVc2UgdXNhZ2UpIHsKICAgIGFzc2VydCh1c2FnZSAhPSBudWxsKTsKICAgIGlmIChfb3V0ZXJtb3N0Tm9kZSBpcyBpci5NZW1iZXIpIHsKICAgICAgVHlwZVZhcmlhYmxlVHlwZVdpdGhDb250ZXh0IHR5cGVWYXJpYWJsZSA9CiAgICAgICAgICBuZXcgVHlwZVZhcmlhYmxlVHlwZVdpdGhDb250ZXh0KHR5cGUsIF9vdXRlcm1vc3ROb2RlKTsKICAgICAgc3dpdGNoICh0eXBlVmFyaWFibGUua2luZCkgewogICAgICAgIGNhc2UgVHlwZVZhcmlhYmxlS2luZC5jbHM6CiAgICAgICAgICBpZiAoX2lzRmllbGRPckNvbnN0cnVjdG9yKF9vdXRlcm1vc3ROb2RlKSkgewogICAgICAgICAgICAvLyBDbGFzcyB0eXBlIHZhcmlhYmxlIHVzZWQgaW4gYSBmaWVsZCBvciBjb25zdHJ1Y3Rvci4KICAgICAgICAgICAgX3VzZVR5cGVWYXJpYWJsZUFzTG9jYWwodHlwZVZhcmlhYmxlLCB1c2FnZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBDbGFzcyB0eXBlIHZhcmlhYmxlIHVzZWQgaW4gYSBtZXRob2QuCiAgICAgICAgICAgIF9yZWdpc3Rlck5lZWRzVGhpcyh1c2FnZSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFR5cGVWYXJpYWJsZUtpbmQubWV0aG9kOgogICAgICAgIGNhc2UgVHlwZVZhcmlhYmxlS2luZC5sb2NhbDoKICAgICAgICAgIF91c2VUeXBlVmFyaWFibGVBc0xvY2FsKHR5cGVWYXJpYWJsZSwgdXNhZ2UpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUeXBlVmFyaWFibGVLaW5kLmZ1bmN0aW9uOgogICAgICAgIC8vIFRoZSB0eXBlIHZhcmlhYmxlIGlzIGEgZnVuY3Rpb24gdHlwZSB2YXJpYWJsZSwgbGlrZSBgVGAgaW4KICAgICAgICAvLwogICAgICAgIC8vICAgICBMaXN0PHZvaWQgRnVuY3Rpb248VD4oVCk+IGxpc3Q7CiAgICAgICAgLy8KICAgICAgICAvLyB3aGljaCBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gYSBjYXB0dXJlZCBsb2NhbCB2YXJpYWJsZS4KICAgICAgfQogICAgfQogIH0KCiAgLy8vIElmIFtvbmx5Rm9yUnRpQ2hlY2tzXSBpcyB0cnVlLCB0aGUgdmFyaWFibGUgd2lsbCBiZSBhZGRlZCB0byBhIGxpc3QKICAvLy8gaW5kaWNhdGluZyBpdCAqbWF5KiBiZSB1c2VkIG9ubHkgaWYgcnVudGltZSB0eXBlIGluZm9ybWF0aW9uIGlzIGNoZWNrZWQuCiAgdm9pZCBfdXNlVHlwZVZhcmlhYmxlQXNMb2NhbCgKICAgICAgVHlwZVZhcmlhYmxlVHlwZVdpdGhDb250ZXh0IHR5cGVWYXJpYWJsZSwgVmFyaWFibGVVc2UgdXNhZ2UpIHsKICAgIF9tYXJrVmFyaWFibGVBc1VzZWQodHlwZVZhcmlhYmxlLCB1c2FnZSk7CiAgfQp9CgplbnVtIENvbXBsZXhpdHlMZXZlbCB7CiAgY29uc3RhbnQsCiAgcG90ZW50aWFsbHlFYWdlciwKICBkZWZpbml0ZWx5TGF6eSwKfQoKY2xhc3MgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHsKICBmaW5hbCBDb21wbGV4aXR5TGV2ZWwgbGV2ZWw7CiAgZmluYWwgU2V0PGlyLkZpZWxkPiBmaWVsZHM7CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFRoaXMgc2hvdWxkIGhvbGQgdGhlIGNvbnN0YW50IGxpdGVyYWwgZnJvbSBDRkUgd2hlbgogIC8vIHByb3ZpZGVkLgogIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5jb25zdGFudCgpCiAgICAgIDogbGV2ZWwgPSBDb21wbGV4aXR5TGV2ZWwuY29uc3RhbnQsCiAgICAgICAgZmllbGRzID0gbnVsbDsKCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVXNlIHRoaXMgdG8gY29sbGVjdCBkYXRhIG9uIHRoZSBzaXplIG9mIHRoZQogIC8vICBpbml0aWFsaXplci4KICBJbml0aWFsaXplckNvbXBsZXhpdHkuZWFnZXIoe3RoaXMuZmllbGRzfSkKICAgICAgOiBsZXZlbCA9IENvbXBsZXhpdHlMZXZlbC5wb3RlbnRpYWxseUVhZ2VyOwoKICBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpCiAgICAgIDogbGV2ZWwgPSBDb21wbGV4aXR5TGV2ZWwuZGVmaW5pdGVseUxhenksCiAgICAgICAgZmllbGRzID0gbnVsbDsKCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IGNvbWJpbmUoSW5pdGlhbGl6ZXJDb21wbGV4aXR5IG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0gZWxzZSBpZiAoaXNMYXp5IHx8IG90aGVyLmlzTGF6eSkgewogICAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICAgIH0gZWxzZSBpZiAoaXNFYWdlciB8fCBvdGhlci5pc0VhZ2VyKSB7CiAgICAgIGlmIChmaWVsZHMgIT0gbnVsbCAmJiBvdGhlci5maWVsZHMgIT0gbnVsbCkgewogICAgICAgIGZpZWxkcy5hZGRBbGwob3RoZXIuZmllbGRzKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSBlbHNlIGlmIChmaWVsZHMgIT0gbnVsbCkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBvdGhlcjsKICAgICAgfQogICAgfSBlbHNlIGlmIChpc0NvbnN0YW50ICYmIG90aGVyLmlzQ29uc3RhbnQpIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVGhpcyBpcyBjYXNlIGRvZXNuJ3Qgd29yayBpZiBJbml0aWFsaXplckNvbXBsZXhpdHkKICAgICAgLy8gb2JqZWN0cyBvZiBjb25zdGFudCBjb21wbGV4aXR5IGhvbGQgdGhlIGNvbnN0YW50IGxpdGVyYWwuCiAgICAgIHJldHVybiB0aGlzOwogICAgfSBlbHNlIGlmIChpc0VhZ2VyKSB7CiAgICAgIGFzc2VydChvdGhlci5pc0NvbnN0YW50KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoaXNDb25zdGFudCk7CiAgICAgIGFzc2VydChvdGhlci5pc0VhZ2VyKTsKICAgICAgcmV0dXJuIG90aGVyOwogICAgfQogIH0KCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IG1ha2VFYWdlcigpIHsKICAgIGlmIChpc0xhenkgfHwgaXNFYWdlcikgewogICAgICByZXR1cm4gdGhpczsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmVhZ2VyKCk7CiAgICB9CiAgfQoKICBib29sIGdldCBpc0NvbnN0YW50ID0+IGxldmVsID09IENvbXBsZXhpdHlMZXZlbC5jb25zdGFudDsKCiAgYm9vbCBnZXQgaXNFYWdlciA9PiBsZXZlbCA9PSBDb21wbGV4aXR5TGV2ZWwucG90ZW50aWFsbHlFYWdlcjsKCiAgYm9vbCBnZXQgaXNMYXp5ID0+IGxldmVsID09IENvbXBsZXhpdHlMZXZlbC5kZWZpbml0ZWx5TGF6eTsKCiAgLy8vIFJldHVybnMgYSBzaG9ydCB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIHVzZWQgZm9yIHRlc3RpbmcuCiAgU3RyaW5nIGdldCBzaG9ydFRleHQgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc3dpdGNoIChsZXZlbCkgewogICAgICBjYXNlIENvbXBsZXhpdHlMZXZlbC5jb25zdGFudDoKICAgICAgICBzYi53cml0ZSgnY29uc3RhbnQnKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb21wbGV4aXR5TGV2ZWwucG90ZW50aWFsbHlFYWdlcjoKICAgICAgICBzYi53cml0ZSgnZWFnZXInKTsKICAgICAgICBpZiAoZmllbGRzICE9IG51bGwpIHsKICAgICAgICAgIHNiLndyaXRlKCcmZmllbGRzPVsnKTsKICAgICAgICAgIExpc3Q8U3RyaW5nPiBuYW1lcyA9IGZpZWxkcy5tYXAoKGYpID0+IGYubmFtZS5uYW1lKS50b0xpc3QoKS4uc29ydCgpOwogICAgICAgICAgc2Iud3JpdGUobmFtZXMuam9pbignLCcpKTsKICAgICAgICAgIHNiLndyaXRlKCddJyk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENvbXBsZXhpdHlMZXZlbC5kZWZpbml0ZWx5TGF6eToKICAgICAgICBzYi53cml0ZSgnbGF6eScpOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmV4cGVjdGVkIGNvbXBsZXhpdHkgbGV2ZWwgJGxldmVsIik7CiAgICB9CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdJbml0aWFsaXplckNvbXBsZXhpdHkoJHNob3J0VGV4dCknOwp9CoTJAE5OPAEoTAEXFQFAUE41QiIxATwBUVBJSEcgAU9QNT8hAUhNFwFATk0iAT8hAUcaAU1RPTIpAUwWTC8BUBEXASMlARYBThkXAS4GSk9IIQEuASwvH0YGASIcUB0oHA0dBgEyLBwmMw9IPwgNPhkGGyMwNwQBDDVMATIfBAE6TyI4BhcEATkvODwrATAxMDw9NTMKCAYuKC8BKUMlJyckNScVECggJikzHA8xJxUoICYpMxwITAYEAUAGTU5DBkovBkgYJAQBTTk7NyMVKDIpBAEMSCIEAQw6HBMkHAgeFy8EAQw+HBMkHAgfFy8EAQxAPigvBAEMQCo+PxstLwQBIzgfIQYBJiEEAQxQPS8EAU85UE0PHFEbMTIbPFBRP0JIFis3Dy5BGQgGOD0GBAEMUBkwBi8EAQxNLlAxSUUhTExISyZABgFOTkxNSjUBGy8PQggGMwQBUB5QTiMvHCs5D0cIBgQBDEZMNxwYFQYdICYiHgoIGBkGLwQBDEYdJiMeCggvBAEMQB0mHiMKCC8EAQxCNiQdTU8iJiIKAVFLQDYuCggBI1A6JiMeCgFHQFFINTQsCggIQxlHICseJx8lKDIfBi8EAQw0JxkwBiswRQYrJi8EAQxKGTAGGy8EAQxKGTAGLwQBNCApKTA7NgFLPS8fATwBHDUNHSwGARwBODIBGysmLwFPF0Q7Miw/BjA5Jyo4CAhFNwYcOUQGBAFQDy0xMjM1BiFDGgYnBAEMNC8mHjAIHhcEAQxAHiUgCC8EAQw8HiAILwQBDE4eJiIKCC8EAQxQHiYiCggvBAEMQS4BDD8qAQxBKgEMOy4BDEQrBAEMQkNMR0AEAQw8IQQBDEwzLwQBSDkdOC0XBAEtLjkdOi0XBAEMQDwEAQxCHTUvBAEMQh0eTS8EAQxIHS8EAQxGIC8EAQxALwQBDDMmLwQBDEI6Nzc+TD8GRz8GFBkhPD0aLwQBDEAnREMYNQ0lBgQBDD4nQ0MYNQ0lBgQBDD4nPhxKPxg1DSUGBAEMOjw2BAEMQS4BDEUuAQw/LgEMRS4BDEUuAQxBLgEMUCIvBAEMPCQeHDNJKTI1Bi8EAQw8Gy8EAQxKKxk6Rg9BCAE4BismGDEuBAEMNCcrMEEGKyYYMS4EAQw0J0I7OiYEAQxKKhkrGShBRBBPDzwIOAYrJjsvBAEMQB4vBAEMQB4bLwQBDEweLwQBDEweGy8EAQwwJAQBDEw9NgQBDDAeGi8EAQxIGhsvBAEMNDYfICQcCC8EAQxEPE47BAEMNCAvBAEMOSoBDDQhLwQBDEgkIR8ILwQBDEggLwQBDEYvBAEMUCAvBAEMSCAkHggvBAEMPhovBAEMNikeLwQBDEYvBAEMShovBAEMShsvBAEMSiovBAEMSiswQQYrJi8EAQw1KCswQQYrJi8EAQxMHy8EAQxAHxofLwQBDE4zOQYzBAFIEy4gGjABTBsnMUEjIzdDOhM1JwwRJiU4EShGCy8LQggGBAFKTyBFLgQCARcMFBICAR4fHgFODykqFwFGEy0yASUwFwE/IhMpMSs0JRUjFQ8WCDFRQxMaIBMNGh0UBgQBJh0TDTAGBAE8AUEBPgE/GSoVJR4PLRseIVAlGQoPKxoPD0oGGgQBDDwCASpwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci9zY29wZV92aXNpdG9yLmRhcnQqc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaXIvdXRpbC5kYXJ0muUvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwoKLy8vIFJldHVybnMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIFtub2RlXSB0aGF0IGluY2x1ZGUgdGhlIHJ1bnRpbWUgdHlwZSBhbmQKLy8vIGhhc2ggY29kZSBvZiB0aGUgbm9kZSBhbmQgYSBvbmUgbGluZSBwcmVmaXggb2YgdGhlIG5vZGUgdG9TdHJpbmcgdGV4dC4KU3RyaW5nIG5vZGVUb0RlYnVnU3RyaW5nKGlyLk5vZGUgbm9kZSwgW2ludCB0ZXh0TGVuZ3RoID0gNDBdKSB7CiAgU3RyaW5nIGJsb2NrVGV4dCA9IG5vZGUudG9TdHJpbmcoKS5yZXBsYWNlQWxsKCdcbicsICcgJyk7CiAgaWYgKGJsb2NrVGV4dC5sZW5ndGggPiB0ZXh0TGVuZ3RoKSB7CiAgICBibG9ja1RleHQgPSBibG9ja1RleHQuc3Vic3RyaW5nKDAsIHRleHRMZW5ndGggLSAzKSArICcuLi4nOwogIH0KICByZXR1cm4gJygke25vZGUucnVudGltZVR5cGV9OiR7bm9kZS5oYXNoQ29kZX0pJHtibG9ja1RleHR9JzsKfQoKLy8vIENvbXBhcmF0b3IgZm9yIHRoZSBjYW5vbmljYWwgb3JkZXIgb3IgbmFtZWQgcGFyYW1ldGVycy4KLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMgd2hlbiBuYW1lZCBwYXJhbWV0ZXJzIGFyZSBzb3J0ZWQgaW4gZGlsbC4KaW50IG5hbWVkT3JkZXJpbmcoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBhLCBpci5WYXJpYWJsZURlY2xhcmF0aW9uIGIpIHsKICByZXR1cm4gYS5uYW1lLmNvbXBhcmVUbyhiLm5hbWUpOwp9CgovLy8gQ29tcGFyYXRvciBmb3IgdGhlIGRlY2xhcmF0aW9uIG9yZGVyIG9mIHBhcmFtZXRlcnMuCmludCBuYXRpdmVPcmRlcmluZyhpci5WYXJpYWJsZURlY2xhcmF0aW9uIGEsIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gYikgewogIHJldHVybiBhLmZpbGVPZmZzZXQuY29tcGFyZVRvKGIuZmlsZU9mZnNldCk7Cn0KClNvdXJjZVNwYW4gY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUoaXIuVHJlZU5vZGUgbm9kZSkgewogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSBbaXIuTG9jYXRpb25dIGRpcmVjdGx5IGFzIGEgW1NvdXJjZVNwYW5dLgogIFVyaSB1cmk7CiAgaW50IG9mZnNldDsKICB3aGlsZSAobm9kZSAhPSBudWxsKSB7CiAgICBpZiAobm9kZS5maWxlT2Zmc2V0ICE9IGlyLlRyZWVOb2RlLm5vT2Zmc2V0KSB7CiAgICAgIG9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKICAgICAgLy8gQHBhdGNoIGFubm90YXRpb25zIGhhdmUgbm8gbG9jYXRpb24uCiAgICAgIHVyaSA9IG5vZGUubG9jYXRpb24/LmZpbGU7CiAgICAgIGJyZWFrOwogICAgfQogICAgbm9kZSA9IG5vZGUucGFyZW50OwogIH0KICBpZiAodXJpICE9IG51bGwpIHsKICAgIHJldHVybiBuZXcgU291cmNlU3Bhbih1cmksIG9mZnNldCwgb2Zmc2V0ICsgMSk7CiAgfQogIHJldHVybiBudWxsOwp9CgovLy8gUmV0dXJucyB0aGUgYEFzeW5jTWFya2VyYCBjb3JyZXNwb25kaW5nIHRvIGBub2RlLmFzeW5jTWFya2VyYC4KQXN5bmNNYXJrZXIgZ2V0QXN5bmNNYXJrZXIoaXIuRnVuY3Rpb25Ob2RlIG5vZGUpIHsKICBzd2l0Y2ggKG5vZGUuYXN5bmNNYXJrZXIpIHsKICAgIGNhc2UgaXIuQXN5bmNNYXJrZXIuQXN5bmM6CiAgICAgIHJldHVybiBBc3luY01hcmtlci5BU1lOQzsKICAgIGNhc2UgaXIuQXN5bmNNYXJrZXIuQXN5bmNTdGFyOgogICAgICByZXR1cm4gQXN5bmNNYXJrZXIuQVNZTkNfU1RBUjsKICAgIGNhc2UgaXIuQXN5bmNNYXJrZXIuU3luYzoKICAgICAgcmV0dXJuIEFzeW5jTWFya2VyLlNZTkM7CiAgICBjYXNlIGlyLkFzeW5jTWFya2VyLlN5bmNTdGFyOgogICAgICByZXR1cm4gQXN5bmNNYXJrZXIuU1lOQ19TVEFSOwogICAgY2FzZSBpci5Bc3luY01hcmtlci5TeW5jWWllbGRpbmc6CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICJBc3luYyBtYXJrZXIgJHtub2RlLmFzeW5jTWFya2VyfSBpcyBub3Qgc3VwcG9ydGVkLiIpOwogIH0KfQoKLy8vIEtlcm5lbCBlbmNvZGVzIGEgbnVsbC1hd2FyZSBleHByZXNzaW9uIGBhPy5iYCBhcwovLy8KLy8vICAgICBsZXQgZmluYWwgIzEgPSBhIGluICMxID09IG51bGwgPyBudWxsIDogIzEuYgovLy8KLy8vIFtnZXROdWxsQXdhcmVFeHByZXNzaW9uXSByZWNvZ25pemVzIHN1Y2ggZXhwcmVzc2lvbnMgc3RvcmluZyB0aGUgcmVzdWx0IGluCi8vLyBhIFtOdWxsQXdhcmVFeHByZXNzaW9uXSBvYmplY3QuCi8vLwovLy8gW3N5bnRoZXRpY1ZhcmlhYmxlXSBob2xkcyB0aGUgc3ludGhlc2l6ZWQgYCMxYCB2YXJpYWJsZS4gW2V4cHJlc3Npb25dIGhvbGRzCi8vLyB0aGUgYCMxLmJgIGV4cHJlc3Npb24uIFtyZWNlaXZlcl0gcmV0dXJucyBgYWAgZXhwcmVzc2lvbi4gW3BhcmVudF0gcmV0dXJucwovLy8gdGhlIHBhcmVudCBvZiB0aGUgbGV0IG5vZGUsIGkuZS4gdGhlIHBhcmVudCBub2RlIG9mIHRoZSBvcmlnaW5hbCBudWxsLWF3YXJlCi8vLyBleHByZXNzaW9uLiBbbGV0XSByZXR1cm5zIHRoZSBsZXQgbm9kZSBjcmVhdGVkIGZvciB0aGUgZW5jb2RpbmcuCmNsYXNzIE51bGxBd2FyZUV4cHJlc3Npb24gewogIGZpbmFsIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gc3ludGhldGljVmFyaWFibGU7CiAgZmluYWwgaXIuRXhwcmVzc2lvbiBleHByZXNzaW9uOwoKICBOdWxsQXdhcmVFeHByZXNzaW9uKHRoaXMuc3ludGhldGljVmFyaWFibGUsIHRoaXMuZXhwcmVzc2lvbik7CgogIGlyLkV4cHJlc3Npb24gZ2V0IHJlY2VpdmVyID0+IHN5bnRoZXRpY1ZhcmlhYmxlLmluaXRpYWxpemVyOwoKICBpci5UcmVlTm9kZSBnZXQgcGFyZW50ID0+IHN5bnRoZXRpY1ZhcmlhYmxlLnBhcmVudC5wYXJlbnQ7CgogIGlyLkxldCBnZXQgbGV0ID0+IHN5bnRoZXRpY1ZhcmlhYmxlLnBhcmVudDsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gbGV0LnRvU3RyaW5nKCk7Cn0KCk51bGxBd2FyZUV4cHJlc3Npb24gZ2V0TnVsbEF3YXJlRXhwcmVzc2lvbihpci5UcmVlTm9kZSBub2RlKSB7CiAgaWYgKG5vZGUgaXMgaXIuTGV0KSB7CiAgICBpci5FeHByZXNzaW9uIGJvZHkgPSBub2RlLmJvZHk7CiAgICBpZiAobm9kZS52YXJpYWJsZS5uYW1lID09IG51bGwgJiYKICAgICAgICBub2RlLnZhcmlhYmxlLmlzRmluYWwgJiYKICAgICAgICBib2R5IGlzIGlyLkNvbmRpdGlvbmFsRXhwcmVzc2lvbiAmJgogICAgICAgIGJvZHkuY29uZGl0aW9uIGlzIGlyLk1ldGhvZEludm9jYXRpb24gJiYKICAgICAgICBib2R5LnRoZW4gaXMgaXIuTnVsbExpdGVyYWwpIHsKICAgICAgaXIuTWV0aG9kSW52b2NhdGlvbiBpbnZvY2F0aW9uID0gYm9keS5jb25kaXRpb247CiAgICAgIGlyLkV4cHJlc3Npb24gcmVjZWl2ZXIgPSBpbnZvY2F0aW9uLnJlY2VpdmVyOwogICAgICBpZiAoaW52b2NhdGlvbi5uYW1lLm5hbWUgPT0gJz09JyAmJgogICAgICAgICAgcmVjZWl2ZXIgaXMgaXIuVmFyaWFibGVHZXQgJiYKICAgICAgICAgIHJlY2VpdmVyLnZhcmlhYmxlID09IG5vZGUudmFyaWFibGUgJiYKICAgICAgICAgIGludm9jYXRpb24uYXJndW1lbnRzLnBvc2l0aW9uYWwuc2luZ2xlIGlzIGlyLk51bGxMaXRlcmFsKSB7CiAgICAgICAgLy8gV2UgaGF2ZQogICAgICAgIC8vICAgbGV0ICN0MSA9IGUwIGluICN0MSA9PSBudWxsID8gbnVsbCA6IGUxCiAgICAgICAgcmV0dXJuIG5ldyBOdWxsQXdhcmVFeHByZXNzaW9uKG5vZGUudmFyaWFibGUsIGJvZHkub3RoZXJ3aXNlKTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gbnVsbDsKfQoKLy8vIENoZWNrIHdoZXRoZXIgW25vZGVdIGlzIGltbWVkaWF0ZWx5IGd1YXJkZWQgYnkgYQovLy8gW2lyLkNoZWNrTGlicmFyeUlzTG9hZGVkXSwgYW5kIGhlbmNlIHRoZSBub2RlIGlzIGEgZGVmZXJyZWQgYWNjZXNzLgppci5MaWJyYXJ5RGVwZW5kZW5jeSBnZXREZWZlcnJlZEltcG9ydChpci5UcmVlTm9kZSBub2RlKSB7CiAgLy8gTm90ZTogdGhpcyBjb2RlIHJlbGllcyBvbiB0aGUgQ0ZFIGdlbmVyYXRpbmcgdGhlIGNvZGUgYXMgd2UgZXhwZWN0IGl0IGhlcmUuCiAgLy8gSWYgb25lIGRheSB3ZSBvcHRpbWl6ZSBhd2F5IHJlZHVuZGFudCBDaGVja0xpYnJhcnlJc0xvYWRlZCBpbnN0cnVjdGlvbnMsCiAgLy8gd2UnZCBuZWVkIHRvIGRlcml2ZSB0aGlzIGluZm9ybWF0aW9uIGRpcmVjdGx5IGZyb20gdGhlIENGRSAoU2VlICMzNTAwNSksCiAgaXIuVHJlZU5vZGUgcGFyZW50ID0gbm9kZS5wYXJlbnQ7CgogIC8vIFRPRE8oc2lnbXVuZCk6IHJlbW92ZSB3aGVuIENGRSBnZW5lcmF0ZXMgdGhlIGNvcnJlY3QgdHJlZSAoIzM1MzIwKS4gRm9yCiAgLy8gaW5zdGFuY2UsIGl0IGN1cnJlbnRseSBnZW5lcmF0ZXMKICAvLwogIC8vICAgbGV0IF8gPSBjaGVjayhwcmVmaXgpIGluIChwcmVmaXg6OmZpZWxkLnByb3BlcnR5KQogIC8vCiAgLy8gaW5zdGVhZCBvZjoKICAvLwogIC8vICAgKGxldCBfID0gY2hlY2socHJlZml4KSBpbiBwcmVmaXg6OmZpZWxkKS5wcm9wZXJ0eQogIGlmIChub2RlIGlzIGlyLlN0YXRpY0dldCB8fCBub2RlIGlzIGlyLkNvbnN0YW50RXhwcmVzc2lvbikgewogICAgd2hpbGUgKHBhcmVudCBpcyBpci5Qcm9wZXJ0eUdldCB8fCBwYXJlbnQgaXMgaXIuTWV0aG9kSW52b2NhdGlvbikgewogICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50OwogICAgfQogIH0KCiAgaWYgKHBhcmVudCBpcyBpci5MZXQpIHsKICAgIHZhciBpbml0aWFsaXplciA9IHBhcmVudC52YXJpYWJsZS5pbml0aWFsaXplcjsKICAgIGlmIChpbml0aWFsaXplciBpcyBpci5DaGVja0xpYnJhcnlJc0xvYWRlZCkgewogICAgICByZXR1cm4gaW5pdGlhbGl6ZXIuaW1wb3J0OwogICAgfQogIH0KICByZXR1cm4gbnVsbDsKfQoKY2xhc3MgX0ZyZWVWYXJpYWJsZVZpc2l0b3IgaW1wbGVtZW50cyBpci5EYXJ0VHlwZVZpc2l0b3I8Ym9vbD4gewogIGNvbnN0IF9GcmVlVmFyaWFibGVWaXNpdG9yKCk7CgogIGJvb2wgdmlzaXQoaXIuRGFydFR5cGUgdHlwZSkgewogICAgaWYgKHR5cGUgIT0gbnVsbCkgcmV0dXJuIHR5cGUuYWNjZXB0KHRoaXMpOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgYm9vbCB2aXNpdExpc3QoTGlzdDxpci5EYXJ0VHlwZT4gdHlwZXMpIHsKICAgIGZvciAoaXIuRGFydFR5cGUgdHlwZSBpbiB0eXBlcykgewogICAgICBpZiAodmlzaXQodHlwZSkpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFR5cGVkZWZUeXBlKGlyLlR5cGVkZWZUeXBlIG5vZGUpIHsKICAgIHJldHVybiB2aXNpdExpc3Qobm9kZS50eXBlQXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZShpci5UeXBlUGFyYW1ldGVyVHlwZSBub2RlKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRGdW5jdGlvblR5cGUoaXIuRnVuY3Rpb25UeXBlIG5vZGUpIHsKICAgIGlmICh2aXNpdChub2RlLnJldHVyblR5cGUpKSByZXR1cm4gdHJ1ZTsKICAgIGlmICh2aXNpdExpc3Qobm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycykpIHJldHVybiB0cnVlOwogICAgZm9yIChpci5OYW1lZFR5cGUgbmFtZWRUeXBlIGluIG5vZGUubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgIGlmICh2aXNpdChuYW1lZFR5cGUudHlwZSkpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEludGVyZmFjZVR5cGUoaXIuSW50ZXJmYWNlVHlwZSBub2RlKSB7CiAgICByZXR1cm4gdmlzaXRMaXN0KG5vZGUudHlwZUFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0Qm90dG9tVHlwZShpci5Cb3R0b21UeXBlIG5vZGUpID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0Vm9pZFR5cGUoaXIuVm9pZFR5cGUgbm9kZSkgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXREeW5hbWljVHlwZShpci5EeW5hbWljVHlwZSBub2RlKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEludmFsaWRUeXBlKGlyLkludmFsaWRUeXBlIG5vZGUpID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGRlZmF1bHREYXJ0VHlwZShpci5EYXJ0VHlwZSBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiRnJlZVZhcmlhYmxlVmlzaXRvci5kZWZhdWx0VHlwZU5vZGUiKTsKICB9Cn0KCi8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbdHlwZV0gY29udGFpbnMgYSB0eXBlIHZhcmlhYmxlLgovLy8KLy8vIEFsbCB0eXBlIHZhcmlhYmxlcyAoY2xhc3MgdHlwZSB2YXJpYWJsZXMsIGdlbmVyaWMgbWV0aG9kIHR5cGUgdmFyaWFibGVzLAovLy8gYW5kIGZ1bmN0aW9uIHR5cGUgdmFyaWFibGVzKSBhcmUgY29uc2lkZXJlZC4KYm9vbCBjb250YWluc0ZyZWVWYXJpYWJsZXMoaXIuRGFydFR5cGUgdHlwZSkgPT4KICAgIHR5cGUuYWNjZXB0KGNvbnN0IF9GcmVlVmFyaWFibGVWaXNpdG9yKCkpOwqA2QBOTjwBKDQvNQEZJAFRS0A8J0AEPwIBPE5IIwIBOEkvAgE9SAsOGTMgLiENBhgEFTQEDwIBQzMeHyAjJR4fIiQmDSJBBAIBNQQ1BE8kBFBPUEUcMiIBQAE/AT0BLgEMJwIBPxgkJiEsMSc3NCooMEYTNUcIBgQPAgE1SDtRTk4kAU0mBTkFEQU5P0geBgQBGjMyIQYEDwIBQSABITASBAEsJiQGEgQBDC8qBAEMOxEEAQwxLTs7LgYSBAEMMyoEAQw1AQwxAQw3AQw3AQwrRwQCATcETTEwLwEhcGFja2FnZTpjb21waWxlci9zcmMvaXIvdXRpbC5kYXJ0O3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2lyL3J1bnRpbWVfdHlwZV9hbmFseXNpcy5kYXJ0uc4vLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CgppbXBvcnQgJy4uL2NvbW1vbi9uYW1lcy5kYXJ0JzsKaW1wb3J0ICd1dGlsLmRhcnQnOwoKLy8vIEVudW0gZm9yIHJlY29nbml6ZWQgdXNlIGtpbmRzIG9mIGBPYmplY3QucnVudGltZVR5cGVgLgplbnVtIFJ1bnRpbWVUeXBlVXNlS2luZCB7CiAgLy8vIFVua25vd24gdXNlIG9mIGBPYmplY3QucnVudGltZVR5cGVgLiBUaGlzIGlzIHRoZSBmYWxsYmFjayB2YWx1ZSBpZiB0aGUKICAvLy8gdXNhZ2UgZGlkbid0IG1hdGNoIGFueSBvZiB0aGUgcmVjb2duaXplZCBwYXR0ZXJucy4KICB1bmtub3duLAoKICAvLy8gYE9iamVjdC5ydW50aW1lVHlwZWAgdXNlZCBpbiBhIHBhdHRlcm4gbGlrZQogIC8vLyBgYS5ydW50aW1lVHlwZSA9PSBiLnJ1bnRpbWVUeXBlYC4KICBlcXVhbHMsCgogIC8vLyBgT2JqZWN0LnJ1bnRpbWVUeXBlYCB1c2VkIGluIGEgcGF0dGVybiBsaWtlIGAnJHtlLnJ1bnRpbWVUeXBlfSdgIG9yCiAgLy8vIGBlLnJ1bnRpbWVUeXBlLnRvU3RyaW5nKClgLgogIHN0cmluZywKfQoKLy8vIERhdGEgb2JqZWN0IHVzZSBmb3IgY29tcHV0aW5nIHN0YXRpYyB0eXBlIGluZm9ybWF0aW9uIG9uIHVzZXMgb2YKLy8vIGBPYmplY3QucnVudGltZVR5cGVgLgpjbGFzcyBSdW50aW1lVHlwZVVzZURhdGEgewogIC8vLyBUaGUgdXNlIGtpbmQgb2YgYE9iamVjdC5ydW50aW1lVHlwZWAuCiAgZmluYWwgUnVudGltZVR5cGVVc2VLaW5kIGtpbmQ7CgogIC8vLyBUaGUgcHJvcGVydHkgZ2V0IGZvciB0aGUgbGVmdCAob3Igc2luZ2xlKSBvY2N1cnJlbmNlIG9mIGAucnVudGltZVR5cGVgLgogIGZpbmFsIGlyLlByb3BlcnR5R2V0IGxlZnRSdW50aW1lVHlwZUV4cHJlc3Npb247CgogIC8vLyBUaGUgcmVjZWl2ZXIgZXhwcmVzc2lvbi4KICBmaW5hbCBpci5FeHByZXNzaW9uIHJlY2VpdmVyOwoKICAvLy8gVGhlIHN0YXRpYyB0eXBlIG9mIHRoZSByZWNlaXZlciBleHByZXNzaW9uLiBUaGlzIGlzIHNldCBpbiB0aGUgc3RhdGljIHR5cGUKICAvLy8gdmlzaXRvci4KICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGU7CgogIC8vLyBUaGUgcHJvcGVydHkgZ2V0IGZvciB0aGUgcmlnaHQgb2NjdXJyZW5jZSBvZiBgLnJ1bnRpbWVUeXBlYCB3aGVuIFtraW5kXQogIC8vLyBpcyBgUnVudGltZVR5cGVVc2VLaW5kLmVxdWFsc2AuCiAgZmluYWwgaXIuUHJvcGVydHlHZXQgcmlnaHRSdW50aW1lVHlwZUV4cHJlc3Npb247CgogIC8vLyBUaGUgYXJndW1lbnQgZXhwcmVzc2lvbiBpZiBba2luZF0gaXMgYFJ1bnRpbWVUeXBlVXNlS2luZC5lcXVhbHNgLgogIGZpbmFsIGlyLkV4cHJlc3Npb24gYXJndW1lbnQ7CgogIC8vLyBUaGUgc3RhdGljIHR5cGUgb2YgdGhlIGFyZ3VtZW50IGV4cHJlc3Npb24uIFRoaXMgaXMgc2V0IGluIHRoZSBzdGF0aWMgdHlwZQogIC8vLyB2aXNpdG9yLgogIGlyLkRhcnRUeXBlIGFyZ3VtZW50VHlwZTsKCiAgUnVudGltZVR5cGVVc2VEYXRhKHRoaXMua2luZCwgdGhpcy5sZWZ0UnVudGltZVR5cGVFeHByZXNzaW9uLCB0aGlzLnJlY2VpdmVyLAogICAgICB0aGlzLnJpZ2h0UnVudGltZVR5cGVFeHByZXNzaW9uLCB0aGlzLmFyZ3VtZW50KTsKCiAgYm9vbCBnZXQgaXNDb21wbGV0ZSB7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBSdW50aW1lVHlwZVVzZUtpbmQudW5rbm93bjoKICAgICAgY2FzZSBSdW50aW1lVHlwZVVzZUtpbmQuc3RyaW5nOgogICAgICAgIHJldHVybiByZWNlaXZlclR5cGUgIT0gbnVsbDsKICAgICAgY2FzZSBSdW50aW1lVHlwZVVzZUtpbmQuZXF1YWxzOgogICAgICAgIHJldHVybiByZWNlaXZlclR5cGUgIT0gbnVsbCAmJiBhcmd1bWVudFR5cGUgIT0gbnVsbDsKICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmV4cGVjdGVkIFJ1bnRpbWVUeXBlVXNlS2luZCAka2luZC4iKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAiUnVudGltZVR5cGVVc2VEYXRhKGtpbmQ9JGtpbmQsIgogICAgICAgICJyZWNlaXZlckdldD0kbGVmdFJ1bnRpbWVUeXBlRXhwcmVzc2lvbixyZWNlaXZlcj0kcmVjZWl2ZXIsIgogICAgICAgICJyZWNlaXZlclR5cGU9JHJlY2VpdmVyVHlwZSxhcmd1bWVudEdldD0kcmlnaHRSdW50aW1lVHlwZUV4cHJlc3Npb24sIgogICAgICAgICJhcmd1bWVudD0kYXJndW1lbnQsYXJndW1lbnRUeXBlPSRhcmd1bWVudFR5cGUpIjsKICB9Cn0KCi8vLyBDb21wdXRlcyB0aGUgW1J1bnRpbWVUeXBlVXNlRGF0YV0gY29ycmVzcG9uZGluZyB0byB0aGUgYGUucnVudGltZVR5cGVgCi8vLyBbbm9kZV0uCi8vLwovLy8gW2NhY2hlXSBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IG9ubHkgb25lIFtSdW50aW1lVHlwZVVzZURhdGFdIG9iamVjdCBpcwovLy8gY3JlYXRlZCBwZXIgY2FzZSwgZXZlbiBmb3IgdGhlIGA9PWAgY2FzZS4KUnVudGltZVR5cGVVc2VEYXRhIGNvbXB1dGVSdW50aW1lVHlwZVVzZSgKICAgIE1hcDxpci5Qcm9wZXJ0eUdldCwgUnVudGltZVR5cGVVc2VEYXRhPiBjYWNoZSwgaXIuUHJvcGVydHlHZXQgbm9kZSkgewogIFJ1bnRpbWVUeXBlVXNlRGF0YSByZWNlaXZlckRhdGEgPSBjYWNoZVtub2RlXTsKICBpZiAocmVjZWl2ZXJEYXRhICE9IG51bGwpIHJldHVybiByZWNlaXZlckRhdGE7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbbm9kZV0gaXMgb2YgdGhlIGZvcm0gYGUucnVudGltZVR5cGVgLgogIGJvb2wgaXNHZXRSdW50aW1lVHlwZShpci5UcmVlTm9kZSBub2RlKSB7CiAgICByZXR1cm4gbm9kZSBpcyBpci5Qcm9wZXJ0eUdldCAmJiBub2RlLm5hbWUubmFtZSA9PSBJZGVudGlmaWVycy5ydW50aW1lVHlwZV87CiAgfQoKICAvLy8gUmV0dXJucyBbbm9kZV0gaWYgW25vZGVdIGlzIG9mIHRoZSBmb3JtIGBlLnJ1bnRpbWVUeXBlYCBhbmQgYG51bGxgCiAgLy8vIG90aGVyd2lzZS4KICBpci5Qcm9wZXJ0eUdldCBhc0dldFJ1bnRpbWVUeXBlKGlyLlRyZWVOb2RlIG5vZGUpIHsKICAgIHJldHVybiBpc0dldFJ1bnRpbWVUeXBlKG5vZGUpID8gbm9kZSA6IG51bGw7CiAgfQoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW25vZGVdIGlzIG9mIHRoZSBmb3JtIGBlLnRvU3RyaW5nKClgLgogIGJvb2wgaXNJbnZva2VUb1N0cmluZyhpci5UcmVlTm9kZSBub2RlKSB7CiAgICByZXR1cm4gbm9kZSBpcyBpci5NZXRob2RJbnZvY2F0aW9uICYmIG5vZGUubmFtZS5uYW1lID09ICd0b1N0cmluZyc7CiAgfQoKICBhc3NlcnQoaXNHZXRSdW50aW1lVHlwZShub2RlKSk7CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFNwZWNpYWwtY2FzZSBgdGhpcy5ydW50aW1lVHlwZWAuCiAgaXIuUHJvcGVydHlHZXQgcmVjZWl2ZXJHZXQ7CiAgaXIuRXhwcmVzc2lvbiByZWNlaXZlcjsKICBpci5Qcm9wZXJ0eUdldCBhcmd1bWVudEdldDsKICBpci5FeHByZXNzaW9uIGFyZ3VtZW50OwogIFJ1bnRpbWVUeXBlVXNlS2luZCBraW5kOwoKICBpZiAobm9kZS5yZWNlaXZlciBpcyBpci5WYXJpYWJsZUdldCAmJgogICAgICBub2RlLnBhcmVudCBpcyBpci5Db25kaXRpb25hbEV4cHJlc3Npb24gJiYKICAgICAgbm9kZS5wYXJlbnQucGFyZW50IGlzIGlyLkxldCkgewogICAgTnVsbEF3YXJlRXhwcmVzc2lvbiBudWxsQXdhcmUgPSBnZXROdWxsQXdhcmVFeHByZXNzaW9uKG5vZGUucGFyZW50LnBhcmVudCk7CiAgICBpZiAobnVsbEF3YXJlICE9IG51bGwpIHsKICAgICAgLy8gVGhlIG5vZGUgaXMgb2YgdGhlIGZvcm06CiAgICAgIC8vCiAgICAgIC8vICAgICBsZXQgI3QxID0gZSBpbiAjdDEgPT0gbnVsbCA/IG51bGwgOiAjdDEucnVudGltZVR5cGUKICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCgogICAgICBpZiAobnVsbEF3YXJlLnBhcmVudCBpcyBpci5WYXJpYWJsZURlY2xhcmF0aW9uICYmCiAgICAgICAgICBudWxsQXdhcmUucGFyZW50LnBhcmVudCBpcyBpci5MZXQpIHsKICAgICAgICBOdWxsQXdhcmVFeHByZXNzaW9uIG91dGVyID0KICAgICAgICAgICAgZ2V0TnVsbEF3YXJlRXhwcmVzc2lvbihudWxsQXdhcmUucGFyZW50LnBhcmVudCk7CiAgICAgICAgaWYgKG91dGVyICE9IG51bGwgJiYKICAgICAgICAgICAgb3V0ZXIucmVjZWl2ZXIgPT0gbnVsbEF3YXJlLmxldCAmJgogICAgICAgICAgICBpc0ludm9rZVRvU3RyaW5nKG91dGVyLmV4cHJlc3Npb24pKSB7CiAgICAgICAgICAvLyBEZXRlY3RlZAogICAgICAgICAgLy8KICAgICAgICAgIC8vICAgICBlPy5ydW50aW1lVHlwZT8udG9TdHJpbmcoKQogICAgICAgICAgLy8gICAgICAgIF4KICAgICAgICAgIC8vIGVuY29kZWQgYXMKICAgICAgICAgIC8vCiAgICAgICAgICAvLyAgICAgbGV0ICN0MiA9IChsZXQgI3QxID0gZSBpbiAjdDEgPT0gbnVsbCA/IG51bGwgOiAjdDEucnVudGltZVR5cGUpCiAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgogICAgICAgICAgLy8gICAgICAgIGluICN0MiA9PSBudWxsID8gbnVsbCA6ICN0Mi50b1N0cmluZygpCiAgICAgICAgICAvLwogICAgICAgICAga2luZCA9IFJ1bnRpbWVUeXBlVXNlS2luZC5zdHJpbmc7CiAgICAgICAgICByZWNlaXZlciA9IG51bGxBd2FyZS5yZWNlaXZlcjsKICAgICAgICAgIHJlY2VpdmVyR2V0ID0gbm9kZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobnVsbEF3YXJlLnBhcmVudCBpcyBpci5NZXRob2RJbnZvY2F0aW9uKSB7CiAgICAgICAgaXIuTWV0aG9kSW52b2NhdGlvbiBtZXRob2RJbnZvY2F0aW9uID0gbnVsbEF3YXJlLnBhcmVudDsKICAgICAgICBpZiAobWV0aG9kSW52b2NhdGlvbi5yZWNlaXZlciA9PSBudWxsQXdhcmUubGV0ICYmCiAgICAgICAgICAgIG1ldGhvZEludm9jYXRpb24ubmFtZS5uYW1lID09ICc9PScpIHsKICAgICAgICAgIC8vIERldGVjdGVkCiAgICAgICAgICAvLwogICAgICAgICAgLy8gIGUwPy5ydW50aW1lVHlwZSA9PSBvdGhlcgogICAgICAgICAgaXIuUHJvcGVydHlHZXQgb3RoZXJHZXRSdW50aW1lVHlwZSA9CiAgICAgICAgICAgICAgYXNHZXRSdW50aW1lVHlwZShtZXRob2RJbnZvY2F0aW9uLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmZpcnN0KTsKICAgICAgICAgIGlmIChvdGhlckdldFJ1bnRpbWVUeXBlICE9IG51bGwpIHsKICAgICAgICAgICAgLy8gRGV0ZWN0ZWQKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gICAgIGUwPy5ydW50aW1lVHlwZSA9PSBlMS5ydW50aW1lVHlwZQogICAgICAgICAgICAvLyAgICAgICAgIF4KICAgICAgICAgICAgLy8gZW5jb2RlZCBhcwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyAgICAgKGxldCAjdDEgPSBlMCBpbiAjdDEgPT0gbnVsbCA/IG51bGwgOiAjdDEucnVudGltZVR5cGUpCiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCiAgICAgICAgICAgIC8vICAgICAgICAuPT0oZTEucnVudGltZVR5cGUpCiAgICAgICAgICAgIGtpbmQgPSBSdW50aW1lVHlwZVVzZUtpbmQuZXF1YWxzOwogICAgICAgICAgICByZWNlaXZlciA9IG51bGxBd2FyZS5yZWNlaXZlcjsKICAgICAgICAgICAgcmVjZWl2ZXJHZXQgPSBub2RlOwogICAgICAgICAgICBhcmd1bWVudCA9IG90aGVyR2V0UnVudGltZVR5cGUucmVjZWl2ZXI7CiAgICAgICAgICAgIGFyZ3VtZW50R2V0ID0gbWV0aG9kSW52b2NhdGlvbi5hcmd1bWVudHMucG9zaXRpb25hbC5maXJzdDsKICAgICAgICAgIH0KCiAgICAgICAgICBOdWxsQXdhcmVFeHByZXNzaW9uIG90aGVyTnVsbEF3YXJlID0gZ2V0TnVsbEF3YXJlRXhwcmVzc2lvbigKICAgICAgICAgICAgICBtZXRob2RJbnZvY2F0aW9uLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmZpcnN0KTsKICAgICAgICAgIGlmIChvdGhlck51bGxBd2FyZSAhPSBudWxsICYmCiAgICAgICAgICAgICAgaXNHZXRSdW50aW1lVHlwZShvdGhlck51bGxBd2FyZS5leHByZXNzaW9uKSkgewogICAgICAgICAgICAvLyBEZXRlY3RlZAogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyAgICAgZTA/LnJ1bnRpbWVUeXBlID09IGUxPy5ydW50aW1lVHlwZQogICAgICAgICAgICAvLyAgICAgICAgIF4KICAgICAgICAgICAgLy8gZW5jb2RlZCBhcwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyAgICAgKGxldCAjdDEgPSBlMCBpbiAjdDEgPT0gbnVsbCA/IG51bGwgOiAjdDEucnVudGltZVR5cGUpCiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCiAgICAgICAgICAgIC8vICAgICAgICAgLj09KGxldCAjdDIgPSBlMSBpbiAjdDIgPT0gbnVsbCA/IG51bGwgOiAjdDIucnVudGltZVR5cGUpCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIGtpbmQgPSBSdW50aW1lVHlwZVVzZUtpbmQuZXF1YWxzOwogICAgICAgICAgICByZWNlaXZlciA9IG51bGxBd2FyZS5yZWNlaXZlcjsKICAgICAgICAgICAgcmVjZWl2ZXJHZXQgPSBub2RlOwogICAgICAgICAgICBhcmd1bWVudCA9IG90aGVyTnVsbEF3YXJlLnJlY2VpdmVyOwogICAgICAgICAgICBhcmd1bWVudEdldCA9IG90aGVyTnVsbEF3YXJlLmV4cHJlc3Npb247CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChpc0ludm9rZVRvU3RyaW5nKG51bGxBd2FyZS5wYXJlbnQpKSB7CiAgICAgICAgICAvLyBEZXRlY3RlZAogICAgICAgICAgLy8KICAgICAgICAgIC8vICAgICBlPy5ydW50aW1lVHlwZS50b1N0cmluZygpCiAgICAgICAgICAvLyAgICAgICAgXgogICAgICAgICAgLy8gZW5jb2RlZCBhcwogICAgICAgICAgLy8KICAgICAgICAgIC8vICAgICAobGV0ICN0MSA9IGUgaW4gI3QxID09IG51bGwgPyBudWxsIDogI3QxLnJ1bnRpbWVUeXBlKQogICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCiAgICAgICAgICAvLyAgICAgICAgIC50b1N0cmluZygpCiAgICAgICAgICAvLwogICAgICAgICAga2luZCA9IFJ1bnRpbWVUeXBlVXNlS2luZC5zdHJpbmc7CiAgICAgICAgICByZWNlaXZlciA9IG51bGxBd2FyZS5yZWNlaXZlcjsKICAgICAgICAgIHJlY2VpdmVyR2V0ID0gbm9kZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobnVsbEF3YXJlLnBhcmVudCBpcyBpci5Bcmd1bWVudHMgJiYKICAgICAgICAgIG51bGxBd2FyZS5wYXJlbnQucGFyZW50IGlzIGlyLk1ldGhvZEludm9jYXRpb24pIHsKICAgICAgICBpci5NZXRob2RJbnZvY2F0aW9uIG1ldGhvZEludm9jYXRpb24gPSBudWxsQXdhcmUucGFyZW50LnBhcmVudDsKICAgICAgICBpZiAobWV0aG9kSW52b2NhdGlvbi5uYW1lLm5hbWUgPT0gJz09JyAmJgogICAgICAgICAgICBtZXRob2RJbnZvY2F0aW9uLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmZpcnN0ID09IG51bGxBd2FyZS5sZXQpIHsKICAgICAgICAgIC8vIFtudWxsQXdhcmVdIGlzIHRoZSByaWdodCBoYW5kIHNpZGUgb2YgPT0uCgogICAgICAgICAgaXIuUHJvcGVydHlHZXQgb3RoZXJHZXRSdW50aW1lVHlwZSA9CiAgICAgICAgICAgICAgYXNHZXRSdW50aW1lVHlwZShtZXRob2RJbnZvY2F0aW9uLnJlY2VpdmVyKTsKICAgICAgICAgIE51bGxBd2FyZUV4cHJlc3Npb24gb3RoZXJOdWxsQXdhcmUgPQogICAgICAgICAgICAgIGdldE51bGxBd2FyZUV4cHJlc3Npb24obWV0aG9kSW52b2NhdGlvbi5yZWNlaXZlcik7CgogICAgICAgICAgaWYgKG90aGVyR2V0UnVudGltZVR5cGUgIT0gbnVsbCkgewogICAgICAgICAgICAvLyBEZXRlY3RlZAogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyAgICAgZTAucnVudGltZVR5cGUgPT0gZTE/LnJ1bnRpbWVUeXBlCiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgXgogICAgICAgICAgICAvLyBlbmNvZGVkIGFzCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vICAgICBlMC5ydW50aW1lVHlwZS49PSgKICAgICAgICAgICAgLy8gICAgICAgICBsZXQgI3QxID0gZTEgaW4gI3QxID09IG51bGwgPyBudWxsIDogI3QxLnJ1bnRpbWVUeXBlKQogICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgogICAgICAgICAgICBraW5kID0gUnVudGltZVR5cGVVc2VLaW5kLmVxdWFsczsKICAgICAgICAgICAgcmVjZWl2ZXIgPSBvdGhlckdldFJ1bnRpbWVUeXBlLnJlY2VpdmVyOwogICAgICAgICAgICByZWNlaXZlckdldCA9IG90aGVyR2V0UnVudGltZVR5cGU7CiAgICAgICAgICAgIGFyZ3VtZW50ID0gbnVsbEF3YXJlLnJlY2VpdmVyOwogICAgICAgICAgICBhcmd1bWVudEdldCA9IG5vZGU7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKG90aGVyTnVsbEF3YXJlICE9IG51bGwgJiYKICAgICAgICAgICAgICBpc0dldFJ1bnRpbWVUeXBlKG90aGVyTnVsbEF3YXJlLmV4cHJlc3Npb24pKSB7CiAgICAgICAgICAgIC8vIERldGVjdGVkCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vICAgICBlMD8ucnVudGltZVR5cGUgPT0gZTE/LnJ1bnRpbWVUeXBlCiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KICAgICAgICAgICAgLy8gZW5jb2RlZCBhcwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyAgICAgKGxldCAjdDEgPSBlMCBpbiAjdDEgPT0gbnVsbCA/IG51bGwgOiAjdDEucnVudGltZVR5cGUpCiAgICAgICAgICAgIC8vICAgICAgICAgLj09KGxldCAjdDIgPSBlMSBpbiAjdDIgPT0gbnVsbCA/IG51bGwgOiAjdDIucnVudGltZVR5cGUpCiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgogICAgICAgICAgICBraW5kID0gUnVudGltZVR5cGVVc2VLaW5kLmVxdWFsczsKICAgICAgICAgICAgcmVjZWl2ZXIgPSBvdGhlck51bGxBd2FyZS5yZWNlaXZlcjsKICAgICAgICAgICAgcmVjZWl2ZXJHZXQgPSBvdGhlck51bGxBd2FyZS5leHByZXNzaW9uOwogICAgICAgICAgICBhcmd1bWVudCA9IG51bGxBd2FyZS5yZWNlaXZlcjsKICAgICAgICAgICAgYXJndW1lbnRHZXQgPSBub2RlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChudWxsQXdhcmUucGFyZW50IGlzIGlyLlN0cmluZ0NvbmNhdGVuYXRpb24pIHsKICAgICAgICAvLyBEZXRlY3RlZAogICAgICAgIC8vCiAgICAgICAgLy8gICAgICcke2U/LnJ1bnRpbWVUeXBlfScKICAgICAgICAvLyAgICAgICAgICAgXgogICAgICAgIC8vIGVuY29kZWQgYXMKICAgICAgICAvLwogICAgICAgIC8vICAgICAnJHtsZXQgI3QxID0gZSBpbiAjdDEgPT0gbnVsbCA/IG51bGwgOiAjdDEucnVudGltZVR5cGV9JwogICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgogICAgICAgIGtpbmQgPSBSdW50aW1lVHlwZVVzZUtpbmQuc3RyaW5nOwogICAgICAgIHJlY2VpdmVyID0gbnVsbEF3YXJlLnJlY2VpdmVyOwogICAgICAgIHJlY2VpdmVyR2V0ID0gbm9kZTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBEZWZhdWx0IHRvIHVua25vd24KICAgICAgICAvLwogICAgICAgIC8vICAgICBlPy5ydW50aW1lVHlwZQogICAgICAgIC8vICAgICAgICBeCiAgICAgICAgLy8gZW5jb2RlZCBhcwogICAgICAgIC8vCiAgICAgICAgLy8gICAgIGxldCAjdDEgPSBlIGluICN0MSA9PSBudWxsID8gbnVsbCA6ICN0MS5ydW50aW1lVHlwZQogICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCiAgICAgICAga2luZCA9IFJ1bnRpbWVUeXBlVXNlS2luZC51bmtub3duOwogICAgICAgIHJlY2VpdmVyID0gbnVsbEF3YXJlLnJlY2VpdmVyOwogICAgICAgIHJlY2VpdmVyR2V0ID0gbm9kZTsKICAgICAgfQogICAgfQogIH0gZWxzZSBpZiAobm9kZS5wYXJlbnQgaXMgaXIuVmFyaWFibGVEZWNsYXJhdGlvbiAmJgogICAgICBub2RlLnBhcmVudC5wYXJlbnQgaXMgaXIuTGV0KSB7CiAgICBOdWxsQXdhcmVFeHByZXNzaW9uIG51bGxBd2FyZSA9IGdldE51bGxBd2FyZUV4cHJlc3Npb24obm9kZS5wYXJlbnQucGFyZW50KTsKICAgIGlmIChudWxsQXdhcmUgIT0gbnVsbCAmJiBpc0ludm9rZVRvU3RyaW5nKG51bGxBd2FyZS5leHByZXNzaW9uKSkgewogICAgICAvLyBEZXRlY3RlZAogICAgICAvLwogICAgICAvLyAgICAgZS5ydW50aW1lVHlwZT8udG9TdHJpbmcoKQogICAgICAvLyAgICAgICBeCiAgICAgIC8vIGVuY29kZWQgYXMKICAgICAgLy8KICAgICAgLy8gICAgIGxldCAjdDEgPSBlLnJ1bnRpbWVUeXBlIGluICN0MSA9PSBudWxsID8gbnVsbCA6ICN0MS50b1N0cmluZygpCiAgICAgIC8vICAgICAgICAgICAgICAgICBeCiAgICAgIGtpbmQgPSBSdW50aW1lVHlwZVVzZUtpbmQuc3RyaW5nOwogICAgICByZWNlaXZlciA9IG5vZGUucmVjZWl2ZXI7CiAgICAgIHJlY2VpdmVyR2V0ID0gbm9kZTsKICAgIH0KICB9IGVsc2UgaWYgKG5vZGUucGFyZW50IGlzIGlyLk1ldGhvZEludm9jYXRpb24pIHsKICAgIGlyLk1ldGhvZEludm9jYXRpb24gbWV0aG9kSW52b2NhdGlvbiA9IG5vZGUucGFyZW50OwogICAgaWYgKG1ldGhvZEludm9jYXRpb24ubmFtZS5uYW1lID09ICc9PScgJiYKICAgICAgICBtZXRob2RJbnZvY2F0aW9uLnJlY2VpdmVyID09IG5vZGUpIHsKICAgICAgLy8gW25vZGVdIGlzIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiA9PS4KCiAgICAgIGlyLlByb3BlcnR5R2V0IG90aGVyR2V0UnVudGltZVR5cGUgPQogICAgICAgICAgYXNHZXRSdW50aW1lVHlwZShtZXRob2RJbnZvY2F0aW9uLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmZpcnN0KTsKICAgICAgTnVsbEF3YXJlRXhwcmVzc2lvbiBudWxsQXdhcmUgPQogICAgICAgICAgZ2V0TnVsbEF3YXJlRXhwcmVzc2lvbihtZXRob2RJbnZvY2F0aW9uLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmZpcnN0KTsKICAgICAgaWYgKG90aGVyR2V0UnVudGltZVR5cGUgIT0gbnVsbCkgewogICAgICAgIC8vIERldGVjdGVkCiAgICAgICAgLy8KICAgICAgICAvLyAgICAgZTAucnVudGltZVR5cGUgPT0gZTEucnVudGltZVR5cGUKICAgICAgICAvLyAgICAgICAgXgogICAgICAgIC8vIGVuY29kZWQgYXMKICAgICAgICAvLwogICAgICAgIC8vICAgICBlMC5ydW50aW1lVHlwZS49PShlMS5ydW50aW1lVHlwZSkKICAgICAgICAvLyAgICAgICAgXgogICAgICAgIGtpbmQgPSBSdW50aW1lVHlwZVVzZUtpbmQuZXF1YWxzOwogICAgICAgIHJlY2VpdmVyID0gbm9kZS5yZWNlaXZlcjsKICAgICAgICByZWNlaXZlckdldCA9IG5vZGU7CiAgICAgICAgYXJndW1lbnQgPSBvdGhlckdldFJ1bnRpbWVUeXBlLnJlY2VpdmVyOwogICAgICAgIGFyZ3VtZW50R2V0ID0gb3RoZXJHZXRSdW50aW1lVHlwZTsKICAgICAgfSBlbHNlIGlmIChudWxsQXdhcmUgIT0gbnVsbCAmJiBpc0dldFJ1bnRpbWVUeXBlKG51bGxBd2FyZS5leHByZXNzaW9uKSkgewogICAgICAgIC8vIERldGVjdGVkCiAgICAgICAgLy8KICAgICAgICAvLyAgICAgZTAucnVudGltZVR5cGUgPT0gZTE/LnJ1bnRpbWVUeXBlCiAgICAgICAgLy8gICAgICAgIF4KICAgICAgICAvLyBlbmNvZGVkIGFzCiAgICAgICAgLy8KICAgICAgICAvLyAgICAgZTAucnVudGltZVR5cGUuPT0oCiAgICAgICAgLy8gICAgICAgIF4KICAgICAgICAvLyAgICAgICAgIGxldCAjdDEgPSBlMSBpbiAjdDEgPT0gbnVsbCA/IG51bGwgOiAjdDEucnVudGltZVR5cGUpCiAgICAgICAga2luZCA9IFJ1bnRpbWVUeXBlVXNlS2luZC5lcXVhbHM7CiAgICAgICAgcmVjZWl2ZXIgPSBub2RlLnJlY2VpdmVyOwogICAgICAgIHJlY2VpdmVyR2V0ID0gbm9kZTsKICAgICAgICBhcmd1bWVudCA9IG51bGxBd2FyZS5yZWNlaXZlcjsKICAgICAgICBhcmd1bWVudEdldCA9IG51bGxBd2FyZS5leHByZXNzaW9uOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzSW52b2tlVG9TdHJpbmcobm9kZS5wYXJlbnQpKSB7CiAgICAgIC8vIERldGVjdGVkCiAgICAgIC8vCiAgICAgIC8vICAgICBlLnJ1bnRpbWVUeXBlLnRvU3RyaW5nKCkKICAgICAgLy8gICAgICAgXgogICAgICBraW5kID0gUnVudGltZVR5cGVVc2VLaW5kLnN0cmluZzsKICAgICAgcmVjZWl2ZXIgPSBub2RlLnJlY2VpdmVyOwogICAgICByZWNlaXZlckdldCA9IG5vZGU7CiAgICB9CiAgfSBlbHNlIGlmIChub2RlLnBhcmVudCBpcyBpci5Bcmd1bWVudHMgJiYKICAgICAgbm9kZS5wYXJlbnQucGFyZW50IGlzIGlyLk1ldGhvZEludm9jYXRpb24pIHsKICAgIGlyLk1ldGhvZEludm9jYXRpb24gbWV0aG9kSW52b2NhdGlvbiA9IG5vZGUucGFyZW50LnBhcmVudDsKICAgIGlmIChtZXRob2RJbnZvY2F0aW9uLm5hbWUubmFtZSA9PSAnPT0nICYmCiAgICAgICAgbWV0aG9kSW52b2NhdGlvbi5hcmd1bWVudHMucG9zaXRpb25hbC5maXJzdCA9PSBub2RlKSB7CiAgICAgIC8vIFtub2RlXSBpcyB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mID09LgogICAgICBpci5Qcm9wZXJ0eUdldCBvdGhlckdldFJ1bnRpbWVUeXBlID0KICAgICAgICAgIGFzR2V0UnVudGltZVR5cGUobWV0aG9kSW52b2NhdGlvbi5yZWNlaXZlcik7CiAgICAgIE51bGxBd2FyZUV4cHJlc3Npb24gbnVsbEF3YXJlID0KICAgICAgICAgIGdldE51bGxBd2FyZUV4cHJlc3Npb24obWV0aG9kSW52b2NhdGlvbi5yZWNlaXZlcik7CgogICAgICBpZiAob3RoZXJHZXRSdW50aW1lVHlwZSAhPSBudWxsKSB7CiAgICAgICAgLy8gRGV0ZWN0ZWQKICAgICAgICAvLwogICAgICAgIC8vICAgICBlMC5ydW50aW1lVHlwZSA9PSBlMS5ydW50aW1lVHlwZQogICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBeCiAgICAgICAgLy8gZW5jb2RlZCBhcwogICAgICAgIC8vCiAgICAgICAgLy8gICAgIGUwLnJ1bnRpbWVUeXBlLj09KGUxLnJ1bnRpbWVUeXBlKQogICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBeCiAgICAgICAga2luZCA9IFJ1bnRpbWVUeXBlVXNlS2luZC5lcXVhbHM7CiAgICAgICAgcmVjZWl2ZXIgPSBvdGhlckdldFJ1bnRpbWVUeXBlLnJlY2VpdmVyOwogICAgICAgIHJlY2VpdmVyR2V0ID0gb3RoZXJHZXRSdW50aW1lVHlwZTsKICAgICAgICBhcmd1bWVudCA9IG5vZGUucmVjZWl2ZXI7CiAgICAgICAgYXJndW1lbnRHZXQgPSBub2RlOwogICAgICB9IGVsc2UgaWYgKG51bGxBd2FyZSAhPSBudWxsICYmIGlzR2V0UnVudGltZVR5cGUobnVsbEF3YXJlLmV4cHJlc3Npb24pKSB7CiAgICAgICAgLy8gRGV0ZWN0ZWQKICAgICAgICAvLwogICAgICAgIC8vICAgICBlMD8ucnVudGltZVR5cGUgPT0gZTEucnVudGltZVR5cGUKICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KICAgICAgICAvLyBlbmNvZGVkIGFzCiAgICAgICAgLy8KICAgICAgICAvLyAgICAgKGxldCAjdDEgPSBlMCBpbiAjdDEgPT0gbnVsbCA/IG51bGwgOiAjdDEucnVudGltZVR5cGUpCiAgICAgICAgLy8gICAgICAgICAuPT0oZTEucnVudGltZVR5cGUpCiAgICAgICAgLy8gICAgICAgICAgICAgICAgXgogICAgICAgIGtpbmQgPSBSdW50aW1lVHlwZVVzZUtpbmQuZXF1YWxzOwogICAgICAgIHJlY2VpdmVyID0gbnVsbEF3YXJlLnJlY2VpdmVyOwogICAgICAgIHJlY2VpdmVyR2V0ID0gbnVsbEF3YXJlLmV4cHJlc3Npb247CiAgICAgICAgYXJndW1lbnQgPSBub2RlLnJlY2VpdmVyOwogICAgICAgIGFyZ3VtZW50R2V0ID0gbm9kZTsKICAgICAgfQogICAgfQogIH0gZWxzZSBpZiAobm9kZS5wYXJlbnQgaXMgaXIuU3RyaW5nQ29uY2F0ZW5hdGlvbikgewogICAgLy8gRGV0ZWN0ZWQKICAgIC8vCiAgICAvLyAgICAgJyR7ZS5ydW50aW1lVHlwZX0nCiAgICAvLyAgICAgICAgICBeCiAgICBraW5kID0gUnVudGltZVR5cGVVc2VLaW5kLnN0cmluZzsKICAgIHJlY2VpdmVyID0gbm9kZS5yZWNlaXZlcjsKICAgIHJlY2VpdmVyR2V0ID0gbm9kZTsKICB9CgogIGlmIChraW5kID09IG51bGwpIHsKICAgIC8vIERlZmF1bHQgdG8gdW5rbm93bgogICAgLy8KICAgIC8vICAgICBlLnJ1bnRpbWVUeXBlCiAgICAvLyAgICAgICBeCiAgICBraW5kID0gUnVudGltZVR5cGVVc2VLaW5kLnVua25vd247CiAgICByZWNlaXZlciA9IG5vZGUucmVjZWl2ZXI7CiAgICByZWNlaXZlckdldCA9IG5vZGU7CiAgfQoKICBSdW50aW1lVHlwZVVzZURhdGEgZGF0YSA9IG5ldyBSdW50aW1lVHlwZVVzZURhdGEoCiAgICAgIGtpbmQsIHJlY2VpdmVyR2V0LCByZWNlaXZlciwgYXJndW1lbnRHZXQsIGFyZ3VtZW50KTsKICBjYWNoZVtyZWNlaXZlckdldF0gPSBkYXRhOwogIGlmIChhcmd1bWVudEdldCAhPSBudWxsKSB7CiAgICBjYWNoZVthcmd1bWVudEdldF0gPSBkYXRhOwogIH0KCiAgYXNzZXJ0KHJlY2VpdmVyR2V0ICE9IG51bGwsICJNaXNzaW5nIHJlY2VpdmVyR2V0IGluICRkYXRhIGZvciAkbm9kZS4iKTsKICBhc3NlcnQoIShhcmd1bWVudCAhPSBudWxsICYmIGFyZ3VtZW50R2V0ID09IG51bGwpLAogICAgICAiTWlzc2luZyBhcmd1bWVudEdldCBpbiAkZGF0YSBmb3IgJG5vZGUuIik7CiAgYXNzZXJ0KAogICAgICByZWNlaXZlckdldCAhPSBhcmd1bWVudEdldCwgIkR1cGxpY2F0ZSBwcm9wZXJ0eSBnZXQgaW4gJGRhdGEgZm9yICRub2RlLiIpOwogIHJldHVybiBkYXRhOwp9CoGhAE5OPAEoAR8UATsaTTkLATIoCgFKIgoCAUUaGywhAU4yAR8gAVEPHAFOJjMBSCABUQ8cAU83ARgUJyYlJj0GSAQBDBYsRU46BAIBSwwESy4qSjExAT8sUQQBSRE2MQQBPixIBAEiATseGh4aGwEpMSZQHSIJQTcBOC8kPR0vMhYNLBYYDVFGOw0sKR4KPEE6MhYNJy9NLRgPNRkaD0o/Ki4rIDVHDAFHPCg9GA82GRoPSj9RDy4rIDA1DDkWDSsWGA1HOCENLCkeCjU8SDJMNwEvOy9BAS0YDzUrGg8mTUIuNS8rIAwBKD0YDzYsGg9KUUYuMDUrIAwKPxQLIxcWC0g8KiccDx4LHhQWC0M1KyccCAY2JlBHEgknERQJTBsoIBoGMzguLS0BK0kmTykUCzAUFgsxFCoiHDErUBQLMRQWCyIUSSoiHCcsCDASCSYRKCAaBiwzPy4/Lis3Jj0BKRQLMCYWCzEmKjErIhxQFAsxJxYLRiccKicsIhwIBjYQBx4SJh4YBAEWGgcZDyceGAQBNDsdHR8EAUo1MgpRDwIBMnBhY2thZ2U6Y29tcGlsZXIvc3JjL2lyL3J1bnRpbWVfdHlwZV9hbmFseXNpcy5kYXJ0M3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3VuaXZlcnNlL2ZlYXR1cmUuZGFydJx+Ly8gVE9ETyhzaWdtdW5kKTogcmVuYW1lIHVuaXZlcnNlID0+IHdvcmxkCi8vLyBEZXNjcmliZXMgaW5kaXZpZHVhbCBmZWF0dXJlcyB0aGF0IG1heSBiZSBzZWVuIGluIGEgcHJvZ3JhbS4gTW9zdCBmZWF0dXJlcwovLy8gY2FuIGJlIGRlc2NyaWJlZCBvbmx5IGJ5IG5hbWUgdXNpbmcgdGhlIFtGZWF0dXJlXSBlbnVtLCBzb21lIGZlYXR1cmVzIGFyZQovLy8gZXhwcmVzc2VkIGluY2x1ZGluZyBkZXRhaWxzIG9uIGhvdyB0aGV5IGFyZSB1c2VkLiBGb3IgZXhhbXBsZSwgd2hldGhlciBhCi8vLyBsaXN0IGxpdGVyYWwgd2FzIGNvbnN0YW50IG9yIGVtcHR5LgovLy8KLy8vIFRoZSB1c2Ugb2YgdGhlc2UgZmVhdHVyZXMgaXMgdHlwaWNhbGx5IGRpc2NvdmVyZWQgaW4gYW4gZWFybHkgcGhhc2Ugb2YgdGhlCi8vLyBjb21waWxhdGlvbiBwaXBlbGluZSwgZm9yIGV4YW1wbGUgZHVyaW5nIHJlc29sdXRpb24uCmxpYnJhcnkgY29tcGlsZXIudW5pdmVyc2UuZmVhdHVyZTsKCmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vaXIvcnVudGltZV90eXBlX2FuYWx5c2lzLmRhcnQnOwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JzsKCi8vLyBBIGxhbmd1YWdlIGZlYXR1cmUgdGhhdCBtYXkgYmUgc2VlbiBpbiB0aGUgcHJvZ3JhbS4KLy8gVE9ETyhqb2hubml3aW50aGVyKTogU2hvdWxkIG1pcnJvciB1c2FnZSBiZSBwYXJ0IG9mIHRoaXM/CmVudW0gRmVhdHVyZSB7CiAgLy8vIEludm9jYXRpb24gb2YgYSBnZW5lcmF0aXZlIGNvbnN0cnVjdGlvbiBvbiBhbiBhYnN0cmFjdCBjbGFzcy4KICBBQlNUUkFDVF9DTEFTU19JTlNUQU5USUFUSU9OLAoKICAvLy8gQW4gYXNzZXJ0IHN0YXRlbWVudCB3aXRoIG5vIG1lc3NhZ2UuCiAgQVNTRVJULAoKICAvLy8gQW4gYXNzZXJ0IHN0YXRlbWVudCB3aXRoIGEgbWVzc2FnZS4KICBBU1NFUlRfV0lUSF9NRVNTQUdFLAoKICAvLy8gQSBtZXRob2Qgd2l0aCBhbiBgYXN5bmNgIGJvZHkgbW9kaWZpZXIuCiAgQVNZTkMsCgogIC8vLyBBbiBhc3luY2hyb25vdXMgZm9yIGluIHN0YXRlbWVudCBsaWtlIGBhd2FpdCBmb3IgKHZhciBlIGluIGkpIHt9YC4KICBBU1lOQ19GT1JfSU4sCgogIC8vLyBBIG1ldGhvZCB3aXRoIGFuIGBhc3luYypgIGJvZHkgbW9kaWZpZXIuCiAgQVNZTkNfU1RBUiwKCiAgLy8vIEEgY2F0Y2ggc3RhdGVtZW50LgogIENBVENIX1NUQVRFTUVOVCwKCiAgLy8vIEEgY29tcGlsZSB0aW1lIGVycm9yLgogIENPTVBJTEVfVElNRV9FUlJPUiwKCiAgLy8vIEEgZmFsbCB0aHJvdWdoIGluIGEgc3dpdGNoIGNhc2UuCiAgRkFMTF9USFJPVUdIX0VSUk9SLAoKICAvLy8gQSBmaWVsZCB3aXRob3V0IGFuIGluaXRpYWxpemVyLgogIEZJRUxEX1dJVEhPVVRfSU5JVElBTElaRVIsCgogIC8vLyBBIGZpZWxkIHdob3NlIGluaXRpYWxpemF0aW9uIGlzIG5vdCBhIGNvbnN0YW50LgogIExBWllfRklFTEQsCgogIC8vLyBBIGxvY2FsIHZhcmlhYmxlIHdpdGhvdXQgYW4gaW5pdGlhbGl6ZXIuCiAgTE9DQUxfV0lUSE9VVF9JTklUSUFMSVpFUiwKCiAgLy8vIEFjY2VzcyB0byBgbG9hZExpYnJhcnlgIG9uIGEgZGVmZXJyZWQgaW1wb3J0LgogIExPQURfTElCUkFSWSwKCiAgLy8vIEEgY2F0Y2ggY2xhdXNlIHdpdGggYSB2YXJpYWJsZSBmb3IgdGhlIHN0YWNrIHRyYWNlLgogIFNUQUNLX1RSQUNFX0lOX0NBVENILAoKICAvLy8gU3RyaW5nIGludGVycG9sYXRpb24uCiAgU1RSSU5HX0lOVEVSUE9MQVRJT04sCgogIC8vLyBTdHJpbmcganV4dGFwb3NpdGlvbi4KICBTVFJJTkdfSlVYVEFQT1NJVElPTiwKCiAgLy8vIEFuIGltcGxpY2l0IGNhbGwgdG8gYHN1cGVyLm5vU3VjaE1ldGhvZGAsIGxpa2UgY2FsbGluZyBhbiB1bnJlc29sdmVkCiAgLy8vIHN1cGVyIG1ldGhvZC4KICBTVVBFUl9OT19TVUNIX01FVEhPRCwKCiAgLy8vIEEgcmVkaXJlY3Rpb24gdG8gdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yLgogIFNZTUJPTF9DT05TVFJVQ1RPUiwKCiAgLy8vIEFuIHN5bmNocm9ub3VzIGZvciBpbiBzdGF0ZW1lbnQsIGxpa2UgYGZvciAodmFyIGUgaW4gaSkge31gLgogIFNZTkNfRk9SX0lOLAoKICAvLy8gQSBtZXRob2Qgd2l0aCBhIGBzeW5jKmAgYm9keSBtb2RpZmllci4KICBTWU5DX1NUQVIsCgogIC8vLyBBIHRocm93IGV4cHJlc3Npb24uCiAgVEhST1dfRVhQUkVTU0lPTiwKCiAgLy8vIEFuIGltcGxpY2l0IHRocm93IG9mIGEgYE5vU3VjaE1ldGhvZEVycm9yYCwgbGlrZSBjYWxsaW5nIGFuIHVucmVzb2x2ZWQKICAvLy8gc3RhdGljIG1ldGhvZC4KICBUSFJPV19OT19TVUNIX01FVEhPRCwKCiAgLy8vIEFuIGltcGxpY2l0IHRocm93IG9mIGEgcnVudGltZSBlcnJvciwgbGlrZSBpbiBhIHJ1bnRpbWUgdHlwZSBjaGVjay4KICBUSFJPV19SVU5USU1FX0VSUk9SLAoKICAvLy8gQW4gaW1wbGljaXQgdGhyb3cgb2YgYSBgVW5zdXBwb3J0ZWRFcnJvcmAsIGxpa2UgY2FsbGluZyBgbmV3CiAgLy8vIGJvb2wuZnJvbUVudmlyb25tZW50YC4KICBUSFJPV19VTlNVUFBPUlRFRF9FUlJPUiwKCiAgLy8vIFRoZSBuZWVkIGZvciBhIHR5cGUgdmFyaWFibGUgYm91bmQgY2hlY2ssIGxpa2UgaW5zdGFudGlhdGlvbiBvZiBhIGdlbmVyaWMKICAvLy8gdHlwZSB3aG9zZSB0eXBlIHZhcmlhYmxlIGhhdmUgbm9uLXRyaXZpYWwgYm91bmRzLgogIFRZUEVfVkFSSUFCTEVfQk9VTkRTX0NIRUNLLAp9CgovLy8gRGVzY3JpYmVzIGEgdXNlIG9mIGEgbWFwIGxpdGVyYWwgaW4gdGhlIHByb2dyYW0uCmNsYXNzIE1hcExpdGVyYWxVc2UgewogIGZpbmFsIEludGVyZmFjZVR5cGUgdHlwZTsKICBmaW5hbCBib29sIGlzQ29uc3RhbnQ7CiAgZmluYWwgYm9vbCBpc0VtcHR5OwoKICBNYXBMaXRlcmFsVXNlKHRoaXMudHlwZSwge3RoaXMuaXNDb25zdGFudDogZmFsc2UsIHRoaXMuaXNFbXB0eTogZmFsc2V9KTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICByZXR1cm4gdHlwZS5oYXNoQ29kZSAqIDEzICsKICAgICAgICBpc0NvbnN0YW50Lmhhc2hDb2RlICogMTcgKwogICAgICAgIGlzRW1wdHkuaGFzaENvZGUgKiAxOTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgTWFwTGl0ZXJhbFVzZSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHR5cGUgPT0gb3RoZXIudHlwZSAmJgogICAgICAgIGlzQ29uc3RhbnQgPT0gb3RoZXIuaXNDb25zdGFudCAmJgogICAgICAgIGlzRW1wdHkgPT0gb3RoZXIuaXNFbXB0eTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnTWFwTGl0ZXJhbFVzZSgkdHlwZSxpc0NvbnN0YW50OiRpc0NvbnN0YW50LGlzRW1wdHk6JGlzRW1wdHkpJzsKICB9Cn0KCi8vLyBEZXNjcmliZXMgYSB1c2Ugb2YgYSBzZXQgbGl0ZXJhbCBpbiB0aGUgcHJvZ3JhbS4KY2xhc3MgU2V0TGl0ZXJhbFVzZSB7CiAgZmluYWwgSW50ZXJmYWNlVHlwZSB0eXBlOwogIGZpbmFsIGJvb2wgaXNDb25zdGFudDsKICBmaW5hbCBib29sIGlzRW1wdHk7CgogIFNldExpdGVyYWxVc2UodGhpcy50eXBlLCB7dGhpcy5pc0NvbnN0YW50OiBmYWxzZSwgdGhpcy5pc0VtcHR5OiBmYWxzZX0pOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+CiAgICAgIHR5cGUuaGFzaENvZGUgKiAxMyArIGlzQ29uc3RhbnQuaGFzaENvZGUgKiAxNyArIGlzRW1wdHkuaGFzaENvZGUgKiAxOTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzISBTZXRMaXRlcmFsVXNlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHlwZSA9PSBvdGhlci50eXBlICYmCiAgICAgICAgaXNDb25zdGFudCA9PSBvdGhlci5pc0NvbnN0YW50ICYmCiAgICAgICAgaXNFbXB0eSA9PSBvdGhlci5pc0VtcHR5OwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4KICAgICAgJ1NldExpdGVyYWxVc2UoJHR5cGUsaXNDb25zdGFudDokaXNDb25zdGFudCxpc0VtcHR5OiRpc0VtcHR5KSc7Cn0KCi8vLyBEZXNjcmliZXMgdGhlIHVzZSBvZiBhIGxpc3QgbGl0ZXJhbCBpbiB0aGUgcHJvZ3JhbS4KY2xhc3MgTGlzdExpdGVyYWxVc2UgewogIGZpbmFsIEludGVyZmFjZVR5cGUgdHlwZTsKICBmaW5hbCBib29sIGlzQ29uc3RhbnQ7CiAgZmluYWwgYm9vbCBpc0VtcHR5OwoKICBMaXN0TGl0ZXJhbFVzZSh0aGlzLnR5cGUsIHt0aGlzLmlzQ29uc3RhbnQ6IGZhbHNlLCB0aGlzLmlzRW1wdHk6IGZhbHNlfSk7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgewogICAgcmV0dXJuIHR5cGUuaGFzaENvZGUgKiAxMyArCiAgICAgICAgaXNDb25zdGFudC5oYXNoQ29kZSAqIDE3ICsKICAgICAgICBpc0VtcHR5Lmhhc2hDb2RlICogMTk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIExpc3RMaXRlcmFsVXNlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHlwZSA9PSBvdGhlci50eXBlICYmCiAgICAgICAgaXNDb25zdGFudCA9PSBvdGhlci5pc0NvbnN0YW50ICYmCiAgICAgICAgaXNFbXB0eSA9PSBvdGhlci5pc0VtcHR5OwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICdMaXN0TGl0ZXJhbFVzZSgkdHlwZSxpc0NvbnN0YW50OiRpc0NvbnN0YW50LGlzRW1wdHk6JGlzRW1wdHkpJzsKICB9Cn0KCi8vLyBBIHVzZSBvZiBgT2JqZWN0LnJ1bnRpbWVUeXBlYC4KY2xhc3MgUnVudGltZVR5cGVVc2UgewogIC8vLyBUaGUgdXNlIGtpbmQgb2YgYE9iamVjdC5ydW50aW1lVHlwZWAuCiAgZmluYWwgUnVudGltZVR5cGVVc2VLaW5kIGtpbmQ7CgogIC8vLyBUaGUgc3RhdGljIHR5cGUgb2YgdGhlIHJlY2VpdmVyLgogIGZpbmFsIERhcnRUeXBlIHJlY2VpdmVyVHlwZTsKCiAgLy8vIFRoZSBzdGF0aWMgdHlwZSBvZiB0aGUgYXJndW1lbnQgaWYgW2tpbmRdIGlzIGBSdW50aW1lVHlwZVVzZUtpbmQuZXF1YWxzYC4KICBmaW5hbCBEYXJ0VHlwZSBhcmd1bWVudFR5cGU7CgogIFJ1bnRpbWVUeXBlVXNlKHRoaXMua2luZCwgdGhpcy5yZWNlaXZlclR5cGUsIHRoaXMuYXJndW1lbnRUeXBlKTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PgogICAgICBraW5kLmhhc2hDb2RlICogMTMgKwogICAgICByZWNlaXZlclR5cGUuaGFzaENvZGUgKiAxNyArCiAgICAgIGFyZ3VtZW50VHlwZS5oYXNoQ29kZSAqIDE5OwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIFJ1bnRpbWVUeXBlVXNlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4ga2luZCA9PSBvdGhlci5raW5kICYmCiAgICAgICAgcmVjZWl2ZXJUeXBlID09IG90aGVyLnJlY2VpdmVyVHlwZSAmJgogICAgICAgIGFyZ3VtZW50VHlwZSA9PSBvdGhlci5hcmd1bWVudFR5cGU7CiAgfQoKICAvLy8gU2hvcnQgdGV4dHVhbCByZXByZXNlbnRhdGlvbiB1c2UgZm9yIHRlc3RpbmcuCiAgU3RyaW5nIGdldCBzaG9ydFRleHQgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgUnVudGltZVR5cGVVc2VLaW5kLnN0cmluZzoKICAgICAgICBzYi53cml0ZSgnc3RyaW5nOicpOwogICAgICAgIHNiLndyaXRlKHJlY2VpdmVyVHlwZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgUnVudGltZVR5cGVVc2VLaW5kLmVxdWFsczoKICAgICAgICBzYi53cml0ZSgnZXF1YWxzOicpOwogICAgICAgIHNiLndyaXRlKHJlY2VpdmVyVHlwZSk7CiAgICAgICAgc2Iud3JpdGUoJy8nKTsKICAgICAgICBzYi53cml0ZShhcmd1bWVudFR5cGUpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFJ1bnRpbWVUeXBlVXNlS2luZC51bmtub3duOgogICAgICAgIHNiLndyaXRlKCd1bmtub3duOicpOwogICAgICAgIHNiLndyaXRlKHJlY2VpdmVyVHlwZSk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdSdW50aW1lVHlwZVVzZShraW5kPSRraW5kLHJlY2VpdmVyPSRyZWNlaXZlclR5cGUnCiAgICAgICcsYXJndW1lbnQ9JGFyZ3VtZW50VHlwZSknOwp9CgovLy8gQSBnZW5lcmljIGluc3RhbnRpYXRpb24gb2YgYW4gZXhwcmVzc2lvbiBvZiB0eXBlIFtmdW5jdGlvblR5cGVdIHdpdGggdGhlCi8vLyBnaXZlbiBbdHlwZUFyZ3VtZW50c10uCmNsYXNzIEdlbmVyaWNJbnN0YW50aWF0aW9uIHsKICAvLy8gVGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBpbnN0YW50aWF0ZWQgZXhwcmVzc2lvbi4KICBmaW5hbCBEYXJ0VHlwZSBmdW5jdGlvblR5cGU7CgogIC8vLyBUaGUgdHlwZSBhcmd1bWVudHMgb2YgdGhlIGluc3RhbnRpYXRpb24uCiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKCiAgR2VuZXJpY0luc3RhbnRpYXRpb24odGhpcy5mdW5jdGlvblR5cGUsIHRoaXMudHlwZUFyZ3VtZW50cyk7CgogIC8vLyBTaG9ydCB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIHVzZSBmb3IgdGVzdGluZy4KICBTdHJpbmcgZ2V0IHNob3J0VGV4dCA9PiAnPCR7dHlwZUFyZ3VtZW50cy5qb2luKCcsJyl9Pic7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4KICAgICAgSGFzaGluZy5saXN0SGFzaCh0eXBlQXJndW1lbnRzLCBIYXNoaW5nLm9iamVjdEhhc2goZnVuY3Rpb25UeXBlKSk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgR2VuZXJpY0luc3RhbnRpYXRpb24pIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBmdW5jdGlvblR5cGUgPT0gb3RoZXIuZnVuY3Rpb25UeXBlICYmCiAgICAgICAgZXF1YWxFbGVtZW50cyh0eXBlQXJndW1lbnRzLCBvdGhlci50eXBlQXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnR2VuZXJpY0luc3RhbnRpYXRpb24oZnVuY3Rpb25UeXBlOiRmdW5jdGlvblR5cGUsJwogICAgICAgICd0eXBlQXJndW1lbnRzOiR0eXBlQXJndW1lbnRzKSc7CiAgfQp9CoEQACtPTk0oBE85IwEhKxwBOD0PRCABKwoBKhcBLgkBSRABLw4BGRMBHBYBJxYBJh0BNg4BLx0BNBABOhgBHBgBHBgBSxQYATEWAUMPAS0NARoUAU0VGAFKFwFDHRsBUDgeAgE1FhwZFgFLAQwVICMfBAEMHC0vISoiBAEMFksEAgE1FhwZFgFLAQwWTQEMHC0vISoiBAEMF0YCATgXHBkWAUwBDBUgIx8EAQwcLTAhKiIEAQwWTAQCASMXLCEBJx8BUB8BQwEMFhsjIgEMHC0wIS4sBAE0GSoUJh0gDyYdIBcgDyceIA8GGgQBDEoiAgFNGx02HwEvJgE/ATQ6AQwWSQEMHC02MTsEAQwWPikEAgEqcGFja2FnZTpjb21waWxlci9zcmMvdW5pdmVyc2UvZmVhdHVyZS5kYXJ0PHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2luZmVycmVyL3R5cGVfZ3JhcGhfbm9kZXMuZGFydMABFOAvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBjb21waWxlci5zcmMuaW5mZXJyZXIudHlwZV9ncmFwaF9ub2RlczsKCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJyBzaG93IEl0ZXJhYmxlQmFzZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwoKaW1wb3J0ICcuLi9jb21tb24vbmFtZXMuZGFydCcgc2hvdyBJZGVudGlmaWVyczsKaW1wb3J0ICcuLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3I7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnIHNob3cgSW1tdXRhYmxlRW1wdHlTZXQsIFNldGxldDsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKaW1wb3J0ICdhYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydCc7CmltcG9ydCAnZGVidWcuZGFydCcgYXMgZGVidWc7CmltcG9ydCAnbG9jYWxzX2hhbmRsZXIuZGFydCcgc2hvdyBBcmd1bWVudHNUeXBlczsKaW1wb3J0ICdpbmZlcnJlcl9lbmdpbmUuZGFydCc7CmltcG9ydCAndHlwZV9zeXN0ZW0uZGFydCc7CgovLy8gQ29tbW9uIGNsYXNzIGZvciBhbGwgbm9kZXMgaW4gdGhlIGdyYXBoLiBUaGUgY3VycmVudCBub2RlcyBhcmU6Ci8vLwovLy8gLSBDb25jcmV0ZSB0eXBlcwovLy8gLSBFbGVtZW50cwovLy8gLSBDYWxsIHNpdGVzCi8vLyAtIE5hcnJvd2luZyBpbnN0cnVjdGlvbnMKLy8vIC0gUGhpIGluc3RydWN0aW9ucwovLy8gLSBDb250YWluZXJzIChmb3IgbGlzdHMpCi8vLyAtIFR5cGUgb2YgdGhlIGVsZW1lbnQgaW4gYSBjb250YWluZXIKLy8vCi8vLyBBIG5vZGUgaGFzIGEgc2V0IG9mIGFzc2lnbm1lbnRzIGFuZCB1c2Vycy4gQXNzaWdubWVudHMgYXJlIHVzZWQgdG8KLy8vIGNvbXB1dGUgdGhlIHR5cGUgb2YgdGhlIG5vZGUgKFtUeXBlSW5mb3JtYXRpb24uY29tcHV0ZVR5cGVdKS4gVXNlcnMgYXJlCi8vLyBhZGRlZCB0byB0aGUgaW5mZXJyZXIncyB3b3JrIHF1ZXVlIHdoZW4gdGhlIHR5cGUgb2YgdGhlIG5vZGUKLy8vIGNoYW5nZXMuCmFic3RyYWN0IGNsYXNzIFR5cGVJbmZvcm1hdGlvbiB7CiAgU2V0PFR5cGVJbmZvcm1hdGlvbj4gdXNlcnM7CiAgdmFyIC8qIExpc3R8UGFyYW1ldGVyQXNzaWdubWVudHMgKi8gX2Fzc2lnbm1lbnRzOwoKICAvLy8gVGhlIHR5cGUgdGhlIGluZmVycmVyIGhhcyBmb3VuZCBmb3IgdGhpcyBbVHlwZUluZm9ybWF0aW9uXS4KICAvLy8gSW5pdGlhbGx5IGVtcHR5LgogIEFic3RyYWN0VmFsdWUgdHlwZTsKCiAgLy8vIFRoZSBncmFwaCBub2RlIG9mIHRoZSBtZW1iZXIgdGhpcyBbVHlwZUluZm9ybWF0aW9uXSBub2RlIGJlbG9uZ3MgdG8uCiAgZmluYWwgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGNvbnRleHQ7CgogIC8vLyBUaGUgZWxlbWVudCB0aGlzIFtUeXBlSW5mb3JtYXRpb25dIG5vZGUgYmVsb25ncyB0by4KICBNZW1iZXJFbnRpdHkgZ2V0IGNvbnRleHRNZW1iZXIgPT4gY29udGV4dCA9PSBudWxsID8gbnVsbCA6IGNvbnRleHQubWVtYmVyOwoKICBJdGVyYWJsZTxUeXBlSW5mb3JtYXRpb24+IGdldCBhc3NpZ25tZW50cyA9PiBfYXNzaWdubWVudHM7CgogIC8vLyBXZSBhYmFuZG9uIGluZmVyZW5jZSBpbiBjZXJ0YWluIGNhc2VzIChjb21wbGV4IGN5Y2xpYyBmbG93LCBuYXRpdmUKICAvLy8gYmVoYXZpb3VycywgZXRjLikuIEluIHNvbWUgY2FzZSwgd2UgbWlnaHQgcmVzdW1lIGluZmVyZW5jZSBpbiB0aGUKICAvLy8gY2xvc3VyZSB0cmFjZXIsIHdoaWNoIGlzIGhhbmRsZWQgYnkgY2hlY2tpbmcgd2hldGhlciBbYXNzaWdubWVudHNdIGhhcwogIC8vLyBiZWVuIHNldCB0byBbU1RPUF9UUkFDS0lOR19BU1NJR05NRU5UU19NQVJLRVJdLgogIGJvb2wgYWJhbmRvbkluZmVyZW5jaW5nID0gZmFsc2U7CiAgYm9vbCBnZXQgbWlnaHRSZXN1bWUgPT4KICAgICAgIWlkZW50aWNhbChhc3NpZ25tZW50cywgU1RPUF9UUkFDS0lOR19BU1NJR05NRU5UU19NQVJLRVIpOwoKICAvLy8gTnVtYmVyIG9mIHRpbWVzIHRoaXMgW1R5cGVJbmZvcm1hdGlvbl0gaGFzIGNoYW5nZWQgdHlwZS4KICBpbnQgcmVmaW5lQ291bnQgPSAwOwoKICAvLy8gV2hldGhlciB0aGlzIFtUeXBlSW5mb3JtYXRpb25dIGlzIGN1cnJlbnRseSBpbiB0aGUgaW5mZXJyZXIncwogIC8vLyB3b3JrIHF1ZXVlLgogIGJvb2wgaW5RdWV1ZSA9IGZhbHNlOwoKICAvLy8gVXNlZCB0byBkaXNhYmxlIGVucXVldWVpbmcgb2YgdHlwZSBpbmZvcm1hdGlvbnMgd2hlcmUgd2Uga25vdyB0aGF0IHRoZWlyCiAgLy8vIHR5cGUgd2lsbCBub3QgY2hhbmdlIGZvciBvdGhlciByZWFzb25zIHRoYW4gYmVpbmcgc3RhYmxlLiBGb3IgZXhhbXBsZSwKICAvLy8gaWYgaW5mZXJlbmNlIGlzIGRpc2FibGVkIGZvciBhIHR5cGUgYW5kIGl0IGlzIGhhcmR3aXJlZCB0byBkeW5hbWljLCB0aGlzCiAgLy8vIGlzIHNldCB0byB0cnVlIHRvIHNwYXJlIHJlY29tcHV0aW5nIGR5bmFtaWMgYWdhaW4gYW5kIGFnYWluLiBDaGFuZ2luZyB0aGlzCiAgLy8vIHRvIGZhbHNlIHNob3VsZCBuZXZlciBjaGFuZ2UgaW5mZXJlbmNlIG91dGNvbWUsIGp1c3QgbWFrZSBpcyBzbG93ZXIuCiAgYm9vbCBkb05vdEVucXVldWUgPSBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgdGhpcyBbVHlwZUluZm9ybWF0aW9uXSBoYXMgYSBzdGFibGUgW3R5cGVdIHRoYXQgd2lsbCBub3QKICAvLy8gY2hhbmdlLgogIGJvb2wgaXNTdGFibGUgPSBmYWxzZTsKCiAgLy8gVHlwZUluZm9ybWF0aW9ucyBhcmUgdW5pcXVlLiBTdG9yZSBhbiBhcmJpdHJhcnkgaWRlbnRpdHkgaGFzaCBjb2RlLgogIHN0YXRpYyBpbnQgX3N0YXRpY0hhc2hDb2RlID0gMDsKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgaGFzaENvZGUgPSBfc3RhdGljSGFzaENvZGUgPSAoX3N0YXRpY0hhc2hDb2RlICsgMSkudG9VbnNpZ25lZCgzMCk7CgogIGJvb2wgZ2V0IGlzQ29uY3JldGUgPT4gZmFsc2U7CgogIFR5cGVJbmZvcm1hdGlvbih0aGlzLnR5cGUsIHRoaXMuY29udGV4dCkKICAgICAgOiBfYXNzaWdubWVudHMgPSA8VHlwZUluZm9ybWF0aW9uPltdLAogICAgICAgIHVzZXJzID0gbmV3IFNldGxldDxUeXBlSW5mb3JtYXRpb24+KCk7CgogIFR5cGVJbmZvcm1hdGlvbi5ub0Fzc2lnbm1lbnRzKHRoaXMudHlwZSwgdGhpcy5jb250ZXh0KQogICAgICA6IF9hc3NpZ25tZW50cyA9IGNvbnN0IDxUeXBlSW5mb3JtYXRpb24+W10sCiAgICAgICAgdXNlcnMgPSBuZXcgU2V0bGV0PFR5cGVJbmZvcm1hdGlvbj4oKTsKCiAgVHlwZUluZm9ybWF0aW9uLnVudHJhY2tlZCh0aGlzLnR5cGUpCiAgICAgIDogX2Fzc2lnbm1lbnRzID0gY29uc3QgPFR5cGVJbmZvcm1hdGlvbj5bXSwKICAgICAgICB1c2VycyA9IGNvbnN0IEltbXV0YWJsZUVtcHR5U2V0KCksCiAgICAgICAgY29udGV4dCA9IG51bGw7CgogIFR5cGVJbmZvcm1hdGlvbi53aXRoQXNzaWdubWVudHModGhpcy50eXBlLCB0aGlzLmNvbnRleHQsIHRoaXMuX2Fzc2lnbm1lbnRzKQogICAgICA6IHVzZXJzID0gbmV3IFNldGxldDxUeXBlSW5mb3JtYXRpb24+KCk7CgogIHZvaWQgYWRkVXNlcihUeXBlSW5mb3JtYXRpb24gdXNlcikgewogICAgYXNzZXJ0KCF1c2VyLmlzQ29uY3JldGUpOwogICAgdXNlcnMuYWRkKHVzZXIpOwogIH0KCiAgdm9pZCBhZGRVc2Vyc09mKFR5cGVJbmZvcm1hdGlvbiBvdGhlcikgewogICAgdXNlcnMuYWRkQWxsKG90aGVyLnVzZXJzKTsKICB9CgogIHZvaWQgcmVtb3ZlVXNlcihUeXBlSW5mb3JtYXRpb24gdXNlcikgewogICAgYXNzZXJ0KCF1c2VyLmlzQ29uY3JldGUpOwogICAgdXNlcnMucmVtb3ZlKHVzZXIpOwogIH0KCiAgLy8gVGhlIGJlbG93IGlzIG5vdCBhIGNvbXBpbGUgdGltZSBjb25zdGFudCB0byBtYWtlIGl0IGRpZmZlcmVudGlhYmxlCiAgLy8gZnJvbSBvdGhlciBlbXB0eSBsaXN0cyBvZiBbVHlwZUluZm9ybWF0aW9uXS4KICBzdGF0aWMgZmluYWwgU1RPUF9UUkFDS0lOR19BU1NJR05NRU5UU19NQVJLRVIgPSBuZXcgTGlzdDxUeXBlSW5mb3JtYXRpb24+KDApOwoKICBib29sIGFyZUFzc2lnbm1lbnRzVHJhY2tlZCgpIHsKICAgIHJldHVybiBhc3NpZ25tZW50cyAhPSBTVE9QX1RSQUNLSU5HX0FTU0lHTk1FTlRTX01BUktFUjsKICB9CgogIHZvaWQgYWRkQXNzaWdubWVudChUeXBlSW5mb3JtYXRpb24gYXNzaWdubWVudCkgewogICAgLy8gQ2hlYXAgb25lLWxldmVsIGN5Y2xlIGRldGVjdGlvbi4KICAgIGlmIChhc3NpZ25tZW50ID09IHRoaXMpIHJldHVybjsKICAgIGlmIChhcmVBc3NpZ25tZW50c1RyYWNrZWQoKSkgewogICAgICBfYXNzaWdubWVudHMuYWRkKGFzc2lnbm1lbnQpOwogICAgfQogICAgLy8gRXZlbiBpZiB3ZSBhYmFuZG9uIGluZmVyZW5jaW5nIG9uIHRoaXMgW1R5cGVJbmZvcm1hdGlvbl0gd2UKICAgIC8vIG5lZWQgdG8gY29sbGVjdCB0aGUgdXNlcnMsIHNvIHRoYXQgcGhhc2VzIHRoYXQgdHJhY2sgd2hlcmUKICAgIC8vIGVsZW1lbnRzIGZsb3cgaW4gc3RpbGwgd29yay4KICAgIGFzc2lnbm1lbnQuYWRkVXNlcih0aGlzKTsKICB9CgogIHZvaWQgcmVtb3ZlQXNzaWdubWVudChUeXBlSW5mb3JtYXRpb24gYXNzaWdubWVudCkgewogICAgaWYgKCFhYmFuZG9uSW5mZXJlbmNpbmcgfHwgbWlnaHRSZXN1bWUpIHsKICAgICAgX2Fzc2lnbm1lbnRzLnJlbW92ZShhc3NpZ25tZW50KTsKICAgIH0KICAgIC8vIFdlIGNhbiBoYXZlIG11bHRpcGxlIGFzc2lnbm1lbnRzIG9mIHRoZSBzYW1lIFtUeXBlSW5mb3JtYXRpb25dLgogICAgaWYgKCFhc3NpZ25tZW50cy5jb250YWlucyhhc3NpZ25tZW50KSkgewogICAgICBhc3NpZ25tZW50LnJlbW92ZVVzZXIodGhpcyk7CiAgICB9CiAgfQoKICBBYnN0cmFjdFZhbHVlIHJlZmluZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgcmV0dXJuIGFiYW5kb25JbmZlcmVuY2luZyA/IHNhZmVUeXBlKGluZmVycmVyKSA6IGNvbXB1dGVUeXBlKGluZmVycmVyKTsKICB9CgogIC8vLyBDb21wdXRlcyBhIG5ldyB0eXBlIGZvciB0aGlzIFtUeXBlSW5mb3JtYXRpb25dIG5vZGUgZGVwZW5kaW5nIG9uIGl0cwogIC8vLyBwb3RlbnRpYWxseSB1cGRhdGVkIGlucHV0cy4KICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKTsKCiAgLy8vIFJldHVybnMgYW4gYXBwcm94aW1hdGlvbiBmb3IgdGhpcyBbVHlwZUluZm9ybWF0aW9uXSBub2RlIHRoYXQgaXMgYWx3YXlzCiAgLy8vIHNhZmUgdG8gdXNlLiBVc2VkIHdoZW4gYWJhbmRvbmluZyBpbmZlcmVuY2Ugb24gYSBub2RlLgogIEFic3RyYWN0VmFsdWUgc2FmZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIHJldHVybiBpbmZlcnJlci50eXBlcy5keW5hbWljVHlwZS50eXBlOwogIH0KCiAgdm9pZCBnaXZlVXAoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIsIHtib29sIGNsZWFyQXNzaWdubWVudHM6IHRydWV9KSB7CiAgICBhYmFuZG9uSW5mZXJlbmNpbmcgPSB0cnVlOwogICAgLy8gRG8gbm90IHJlbW92ZSBbdGhpc10gYXMgYSB1c2VyIG9mIG5vZGVzIGluIFthc3NpZ25tZW50c10sCiAgICAvLyBiZWNhdXNlIG91ciB0cmFjaW5nIGFuYWx5c2lzIGNvdWxkIGJlIGludGVyZXN0ZWQgaW4gdHJhY2luZwogICAgLy8gdGhpcyBub2RlLgogICAgaWYgKGNsZWFyQXNzaWdubWVudHMpIF9hc3NpZ25tZW50cyA9IFNUT1BfVFJBQ0tJTkdfQVNTSUdOTUVOVFNfTUFSS0VSOwogICAgLy8gRG8gbm90IHJlbW92ZSB1c2VycyBiZWNhdXNlIG91ciB0cmFjaW5nIGFuYWx5c2lzIGNvdWxkIGJlCiAgICAvLyBpbnRlcmVzdGVkIGluIHRyYWNpbmcgdGhlIHVzZXJzIG9mIHRoaXMgbm9kZS4KICB9CgogIHZvaWQgY2xlYXIoKSB7CiAgICBfYXNzaWdubWVudHMgPSBTVE9QX1RSQUNLSU5HX0FTU0lHTk1FTlRTX01BUktFUjsKICAgIHVzZXJzID0gY29uc3QgSW1tdXRhYmxlRW1wdHlTZXQoKTsKICB9CgogIC8vLyBSZXNldCB0aGUgYW5hbHlzaXMgb2YgdGhpcyBub2RlIGJ5IG1ha2luZyBpdHMgdHlwZSBlbXB0eS4KCiAgYm9vbCByZXNldChJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgaWYgKGFiYW5kb25JbmZlcmVuY2luZykgcmV0dXJuIGZhbHNlOwogICAgdHlwZSA9IGluZmVycmVyLmFic3RyYWN0VmFsdWVEb21haW4uZW1wdHlUeXBlOwogICAgcmVmaW5lQ291bnQgPSAwOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBhY2NlcHQoVHlwZUluZm9ybWF0aW9uVmlzaXRvciB2aXNpdG9yKTsKCiAgLy8vIFRoZSBbRWxlbWVudF0gd2hlcmUgdGhpcyBbVHlwZUluZm9ybWF0aW9uXSB3YXMgY3JlYXRlZC4gTWF5IGJlIGBudWxsYAogIC8vLyBmb3Igc29tZSBbVHlwZUluZm9ybWF0aW9uXSBub2Rlcywgd2hlcmUgd2UgZG8gbm90IG5lZWQgdG8gc3RvcmUKICAvLy8gdGhlIGluZm9ybWF0aW9uLgogIE1lbWJlckVudGl0eSBnZXQgb3duZXIgPT4gKGNvbnRleHQgIT0gbnVsbCkgPyBjb250ZXh0Lm1lbWJlciA6IG51bGw7CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgdGhlIHR5cGUgY2Fubm90IGNoYW5nZSBhZnRlciBpdCBoYXMgYmVlbgogIC8vLyBpbmZlcnJlZC4KICBib29sIGhhc1N0YWJsZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIHJldHVybiAhbWlnaHRSZXN1bWUgJiYgYXNzaWdubWVudHMuZXZlcnkoKGUpID0+IGUuaXNTdGFibGUpOwogIH0KCiAgdm9pZCByZW1vdmVBbmRDbGVhclJlZmVyZW5jZXMoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIGFzc2lnbm1lbnRzLmZvckVhY2goKGluZm8pIHsKICAgICAgaW5mby5yZW1vdmVVc2VyKHRoaXMpOwogICAgfSk7CiAgfQoKICB2b2lkIHN0YWJpbGl6ZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgcmVtb3ZlQW5kQ2xlYXJSZWZlcmVuY2VzKGluZmVycmVyKTsKICAgIC8vIERvIG5vdCByZW1vdmUgdXNlcnMgYmVjYXVzZSB0aGUgdHJhY2luZyBhbmFseXNpcyBjb3VsZCBiZSBpbnRlcmVzdGVkCiAgICAvLyBpbiB0cmFjaW5nIHRoZSB1c2VycyBvZiB0aGlzIG5vZGUuCiAgICBfYXNzaWdubWVudHMgPSBTVE9QX1RSQUNLSU5HX0FTU0lHTk1FTlRTX01BUktFUjsKICAgIGFiYW5kb25JbmZlcmVuY2luZyA9IHRydWU7CiAgICBpc1N0YWJsZSA9IHRydWU7CiAgfQoKICB2b2lkIG1heWJlUmVzdW1lKCkgewogICAgaWYgKCFtaWdodFJlc3VtZSkgcmV0dXJuOwogICAgYWJhbmRvbkluZmVyZW5jaW5nID0gZmFsc2U7CiAgICBkb05vdEVucXVldWUgPSBmYWxzZTsKICB9CgogIC8vLyBEZXN0cm95cyBpbmZvcm1hdGlvbiBub3QgbmVlZGVkIGFmdGVyIHR5cGUgaW5mZXJlbmNlLgogIHZvaWQgY2xlYW51cCgpIHsKICAgIHVzZXJzID0gbnVsbDsKICAgIF9hc3NpZ25tZW50cyA9IG51bGw7CiAgfQoKICBTdHJpbmcgdG9TdHJ1Y3R1cmVkVGV4dChTdHJpbmcgaW5kZW50KSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBfdG9TdHJ1Y3R1cmVkVGV4dChzYiwgaW5kZW50LCBuZXcgU2V0PFR5cGVJbmZvcm1hdGlvbj4oKSk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIHZvaWQgX3RvU3RydWN0dXJlZFRleHQoCiAgICAgIFN0cmluZ0J1ZmZlciBzYiwgU3RyaW5nIGluZGVudCwgU2V0PFR5cGVJbmZvcm1hdGlvbj4gc2VlbikgewogICAgc2Iud3JpdGUodG9TdHJpbmcoKSk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBBcHBseWFibGVUeXBlSW5mb3JtYXRpb24gaW1wbGVtZW50cyBUeXBlSW5mb3JtYXRpb24gewogIGJvb2wgbWlnaHRCZVBhc3NlZFRvRnVuY3Rpb25BcHBseSA9IGZhbHNlOwp9CgovLy8gTWFya2VyIG5vZGUgdXNlZCBvbmx5IGR1cmluZyB0cmVlIGNvbnN0cnVjdGlvbiBidXQgbm90IGR1cmluZyBhY3R1YWwgdHlwZQovLy8gcmVmaW5lbWVudC4KLy8vCi8vLyBDdXJyZW50bHksIHRoaXMgaXMgdXNlZCB0byBnaXZlIGEgdHlwZSB0byBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgZXZlbiBiZWZvcmUKLy8vIHRoZSBjb3JyZXNwb25kaW5nIGRlZmF1bHQgZXhwcmVzc2lvbiBoYXMgYmVlbiBhbmFseXplZC4gU2VlCi8vLyBbZ2V0RGVmYXVsdFR5cGVPZlBhcmFtZXRlcl0gYW5kIFtzZXREZWZhdWx0VHlwZU9mUGFyYW1ldGVyXSBmb3IgZGV0YWlscy4KY2xhc3MgUGxhY2Vob2xkZXJUeXBlSW5mb3JtYXRpb24gZXh0ZW5kcyBUeXBlSW5mb3JtYXRpb24gewogIFBsYWNlaG9sZGVyVHlwZUluZm9ybWF0aW9uKAogICAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4sIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBjb250ZXh0KQogICAgICA6IHN1cGVyKGFic3RyYWN0VmFsdWVEb21haW4uZW1wdHlUeXBlLCBjb250ZXh0KTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHQoVHlwZUluZm9ybWF0aW9uVmlzaXRvciB2aXNpdG9yKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHZpc2l0IHBsYWNlaG9sZGVyIik7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlZmluZSBwbGFjZWhvbGRlciIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAiUGxhY2Vob2xkZXIgWyRoYXNoQ29kZV0iOwp9CgovLy8gUGFyYW1ldGVycyBvZiBpbnN0YW5jZSBmdW5jdGlvbnMgYmVoYXZlIGRpZmZlcmVudGx5IHRoYW4gb3RoZXIKLy8vIGVsZW1lbnRzIGJlY2F1c2UgdGhlIGluZmVycmVyIG1heSByZW1vdmUgYXNzaWdubWVudHMuIFRoaXMgaGFwcGVucwovLy8gd2hlbiB0aGUgcmVjZWl2ZXIgb2YgYSBkeW5hbWljIGNhbGwgc2l0ZSBjYW4gYmUgcmVmaW5lZAovLy8gdG8gYSB0eXBlIHdoZXJlIHdlIGtub3cgbW9yZSBhYm91dCB3aGljaCBpbnN0YW5jZSBtZXRob2QgaXMgYmVpbmcKLy8vIGNhbGxlZC4KY2xhc3MgUGFyYW1ldGVyQXNzaWdubWVudHMgZXh0ZW5kcyBJdGVyYWJsZUJhc2U8VHlwZUluZm9ybWF0aW9uPiB7CiAgZmluYWwgTWFwPFR5cGVJbmZvcm1hdGlvbiwgaW50PiBhc3NpZ25tZW50cyA9IG5ldyBNYXA8VHlwZUluZm9ybWF0aW9uLCBpbnQ+KCk7CgogIHZvaWQgcmVtb3ZlKFR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBpbnQgZXhpc3RpbmcgPSBhc3NpZ25tZW50c1tpbmZvXTsKICAgIGlmIChleGlzdGluZyA9PSBudWxsKSByZXR1cm47CiAgICBpZiAoZXhpc3RpbmcgPT0gMSkgewogICAgICBhc3NpZ25tZW50cy5yZW1vdmUoaW5mbyk7CiAgICB9IGVsc2UgewogICAgICBhc3NpZ25tZW50c1tpbmZvXSA9IGV4aXN0aW5nIC0gMTsKICAgIH0KICB9CgogIHZvaWQgYWRkKFR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBpbnQgZXhpc3RpbmcgPSBhc3NpZ25tZW50c1tpbmZvXTsKICAgIGlmIChleGlzdGluZyA9PSBudWxsKSB7CiAgICAgIGFzc2lnbm1lbnRzW2luZm9dID0gMTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2lnbm1lbnRzW2luZm9dID0gZXhpc3RpbmcgKyAxOwogICAgfQogIH0KCiAgdm9pZCByZXBsYWNlKFR5cGVJbmZvcm1hdGlvbiBvbGQsIFR5cGVJbmZvcm1hdGlvbiByZXBsYWNlbWVudCkgewogICAgaW50IGV4aXN0aW5nID0gYXNzaWdubWVudHNbb2xkXTsKICAgIGlmIChleGlzdGluZyAhPSBudWxsKSB7CiAgICAgIGludCBvdGhlciA9IGFzc2lnbm1lbnRzW3JlcGxhY2VtZW50XTsKICAgICAgaWYgKG90aGVyICE9IG51bGwpIGV4aXN0aW5nICs9IG90aGVyOwogICAgICBhc3NpZ25tZW50c1tyZXBsYWNlbWVudF0gPSBleGlzdGluZzsKICAgICAgYXNzaWdubWVudHMucmVtb3ZlKG9sZCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYXRvcjxUeXBlSW5mb3JtYXRpb24+IGdldCBpdGVyYXRvciA9PiBhc3NpZ25tZW50cy5rZXlzLml0ZXJhdG9yOwogIEBvdmVycmlkZQogIEl0ZXJhYmxlPFR5cGVJbmZvcm1hdGlvbj4gd2hlcmUoRnVuY3Rpb24gZikgPT4gYXNzaWdubWVudHMua2V5cy53aGVyZShmKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWlucyhPYmplY3QgaW5mbykgPT4gYXNzaWdubWVudHMuY29udGFpbnNLZXkoaW5mbyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IGFzc2lnbm1lbnRzLmtleXMudG9MaXN0KCkudG9TdHJpbmcoKTsKfQoKLy8vIEEgbm9kZSByZXByZXNlbnRpbmcgYSByZXNvbHZlZCBlbGVtZW50IG9mIHRoZSBjb21wb25lbnQuIFRoZSBraW5kIG9mCi8vLyBlbGVtZW50cyB0aGF0IG5lZWQgYW4gW0VsZW1lbnRUeXBlSW5mb3JtYXRpb25dIGFyZToKLy8vCi8vLyAtIEZ1bmN0aW9ucyAoaW5jbHVkaW5nIGdldHRlcnMgYW5kIHNldHRlcnMpCi8vLyAtIENvbnN0cnVjdG9ycyAoZmFjdG9yeSBvciBnZW5lcmF0aXZlKQovLy8gLSBGaWVsZHMKLy8vIC0gUGFyYW1ldGVycwovLy8gLSBMb2NhbCB2YXJpYWJsZXMgbXV0YXRlZCBpbiBjbG9zdXJlcwovLy8KLy8vIFRoZSBbRWxlbWVudFR5cGVJbmZvcm1hdGlvbl0gb2YgYSBmdW5jdGlvbiBhbmQgYSBjb25zdHJ1Y3RvciBpcyBpdHMKLy8vIHJldHVybiB0eXBlLgovLy8KLy8vIE5vdGUgdGhhdCBhIGZldyBlbGVtZW50cyBvZiB0aGVzZSBraW5kcyBtdXN0IGJlIHRyZWF0ZWQgc3BlY2lhbGx5LAovLy8gYW5kIHRoZXkgYXJlIGRlYWx0IGluIFtFbGVtZW50VHlwZUluZm9ybWF0aW9uLmhhbmRsZVNwZWNpYWxDYXNlc106Ci8vLwovLy8gLSBQYXJhbWV0ZXJzIG9mIGNsb3N1cmVzLCBgbm9TdWNoTWV0aG9kYCBhbmQgYGNhbGxgIGluc3RhbmNlCi8vLyAgIG1ldGhvZHM6IHdlIGN1cnJlbnRseSBkbyBub3QgaW5mZXIgdHlwZXMgZm9yIHRob3NlLgovLy8KLy8vIC0gRmllbGRzIGFuZCBwYXJhbWV0ZXJzIGJlaW5nIGFzc2lnbmVkIGJ5IHN5bnRoZXNpemVkIGNhbGxzIGRvbmUgYnkKLy8vICAgdGhlIGJhY2tlbmQ6IHdlIGRvIG5vdCBrbm93IHdoYXQgdHlwZXMgdGhlIGJhY2tlbmQgd2lsbCB1c2UuCi8vLwovLy8gLSBOYXRpdmUgZnVuY3Rpb25zIGFuZCBmaWVsZHM6IGJlY2F1c2UgbmF0aXZlIG1ldGhvZHMgY29udGFpbiBubyBEYXJ0Ci8vLyAgIGNvZGUsIGFuZCBuYXRpdmUgZmllbGRzIGRvIG5vdCBoYXZlIERhcnQgYXNzaWdubWVudHMsIHdlIGp1c3QKLy8vICAgdHJ1c3QgdGhlaXIgdHlwZSBhbm5vdGF0aW9uLgovLy8KYWJzdHJhY3QgY2xhc3MgRWxlbWVudFR5cGVJbmZvcm1hdGlvbiBleHRlbmRzIFR5cGVJbmZvcm1hdGlvbiB7CiAgLy8vIE1hcmtlciB0byBkaXNhYmxlIGluZmVyZW5jZSBmb3IgY2xvc3VyZXMgaW4gW2hhbmRsZVNwZWNpYWxDYXNlc10uCiAgYm9vbCBkaXNhYmxlSW5mZXJlbmNlRm9yQ2xvc3VyZXMgPSB0cnVlOwoKICBFbGVtZW50VHlwZUluZm9ybWF0aW9uLl9pbnRlcm5hbCgKICAgICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluLCBNZW1iZXJUeXBlSW5mb3JtYXRpb24gY29udGV4dCkKICAgICAgOiBzdXBlcihhYnN0cmFjdFZhbHVlRG9tYWluLmVtcHR5VHlwZSwgY29udGV4dCk7CiAgRWxlbWVudFR5cGVJbmZvcm1hdGlvbi5fd2l0aEFzc2lnbm1lbnRzKAogICAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4sCiAgICAgIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBjb250ZXh0LAogICAgICBQYXJhbWV0ZXJBc3NpZ25tZW50cyBhc3NpZ25tZW50cykKICAgICAgOiBzdXBlci53aXRoQXNzaWdubWVudHMoCiAgICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uZW1wdHlUeXBlLCBjb250ZXh0LCBhc3NpZ25tZW50cyk7CgogIFN0cmluZyBnZXRJbmZlcnJlZFNpZ25hdHVyZShUeXBlU3lzdGVtIHR5cGVzKTsKCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWU7Cn0KCi8vLyBBIG5vZGUgcmVwcmVzZW50aW5nIG1lbWJlcnMgaW4gdGhlIGJyb2FkZXN0IHNlbnNlOgovLy8KLy8vIC0gRnVuY3Rpb25zCi8vLyAtIENvbnN0cnVjdG9ycwovLy8gLSBGaWVsZHMgKGFsc28gc3ludGhldGljIG9uZXMgZHVlIHRvIGNsb3N1cmVzKQovLy8gLSBMb2NhbCBmdW5jdGlvbnMgKGNsb3N1cmVzKQovLy8KLy8vIFRoZXNlIHNob3VsZCBuZXZlciBiZSBjcmVhdGVkIGRpcmVjdGx5IGJ1dCBpbnN0ZWFkIGFyZSBjb25zdHJ1Y3RlZCBieQovLy8gdGhlIFtFbGVtZW50VHlwZUluZm9ybWF0aW9uXSBmYWN0b3J5LgphYnN0cmFjdCBjbGFzcyBNZW1iZXJUeXBlSW5mb3JtYXRpb24gZXh0ZW5kcyBFbGVtZW50VHlwZUluZm9ybWF0aW9uCiAgICB3aXRoIEFwcGx5YWJsZVR5cGVJbmZvcm1hdGlvbiB7CiAgZmluYWwgTWVtYmVyRW50aXR5IF9tZW1iZXI7CgogIC8vLyBJZiBbZWxlbWVudF0gaXMgYSBmdW5jdGlvbiwgW2Nsb3N1cml6ZWRDb3VudF0gaXMgdGhlIG51bWJlciBvZgogIC8vLyB0aW1lcyBpdCBpcyBjbG9zdXJpemVkLiBUaGUgdmFsdWUgZ2V0cyB1cGRhdGVkIHdoaWxlIGluZmVycmluZy4KICBpbnQgY2xvc3VyaXplZENvdW50ID0gMDsKCiAgLy8gU3RyaWN0IGBib29sYCB2YWx1ZSBpcyBjb21wdXRlZCBpbiBjbGVhbnVwKCkuIEFsc28gdXNlZCBhcyBhIGZsYWcgdG8gc2VlIGlmCiAgLy8gY2xlYW51cCBoYXMgYmVlbiBjYWxsZWQuCiAgYm9vbCBfaXNDYWxsZWRPbmNlID0gbnVsbDsKCiAgLy8vIFRoaXMgbWFwIGNvbnRhaW5zIHRoZSBjYWxsZXJzIG9mIFtlbGVtZW50XS4gSXQgc3RvcmVzIGFsbCB1bmlxdWUgY2FsbAogIC8vLyBzaXRlcyB0byBlbmFibGUgY291bnRpbmcgdGhlIGdsb2JhbCBudW1iZXIgb2YgY2FsbCBzaXRlcyBvZiBbZWxlbWVudF0uCiAgLy8vCiAgLy8vIEEgY2FsbCBzaXRlIGlzIGVpdGhlciBhbiBBU1QgW2FzdC5Ob2RlXSwgYW4gW0VsZW1lbnRdIChzZWUgdXNlcyBvZgogIC8vLyBbc3ludGhlc2l6ZUZvcndhcmRpbmdDYWxsXSBpbiBbU2ltcGxlVHlwZUluZmVycmVyVmlzaXRvcl0pIG9yIGFuIElSCiAgLy8vIFtpci5Ob2RlXS4KICAvLy8KICAvLy8gVGhlIGdsb2JhbCBpbmZvcm1hdGlvbiBpcyBzdW1tYXJpemVkIGluIFtjbGVhbnVwXSwgYWZ0ZXIgd2hpY2ggW19jYWxsZXJzXQogIC8vLyBpcyBzZXQgdG8gYG51bGxgLgogIE1hcDxNZW1iZXJFbnRpdHksIFNldGxldDxPYmplY3Q+PiBfY2FsbGVyczsKCiAgTWVtYmVyVHlwZUluZm9ybWF0aW9uLl9pbnRlcm5hbCgKICAgICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluLCB0aGlzLl9tZW1iZXIpCiAgICAgIDogc3VwZXIuX2ludGVybmFsKGFic3RyYWN0VmFsdWVEb21haW4sIG51bGwpOwoKICBNZW1iZXJFbnRpdHkgZ2V0IG1lbWJlciA9PiBfbWVtYmVyOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAnJG1lbWJlcic7CgogIHZvaWQgYWRkQ2FsbChNZW1iZXJFbnRpdHkgY2FsbGVyLCBPYmplY3Qgbm9kZSkgewogICAgX2NhbGxlcnMgPz89IDxNZW1iZXJFbnRpdHksIFNldGxldDxPYmplY3Q+Pnt9OwogICAgX2NhbGxlcnMucHV0SWZBYnNlbnQoY2FsbGVyLCAoKSA9PiBuZXcgU2V0bGV0KCkpLmFkZChub2RlKTsKICB9CgogIHZvaWQgcmVtb3ZlQ2FsbChNZW1iZXJFbnRpdHkgY2FsbGVyLCBPYmplY3Qgbm9kZSkgewogICAgaWYgKF9jYWxsZXJzID09IG51bGwpIHJldHVybjsKICAgIFNldGxldCBjYWxscyA9IF9jYWxsZXJzW2NhbGxlcl07CiAgICBpZiAoY2FsbHMgPT0gbnVsbCkgcmV0dXJuOwogICAgY2FsbHMucmVtb3ZlKG5vZGUpOwogICAgaWYgKGNhbGxzLmlzRW1wdHkpIHsKICAgICAgX2NhbGxlcnMucmVtb3ZlKGNhbGxlcik7CiAgICB9CiAgfQoKICBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IGdldCBjYWxsZXJzRm9yVGVzdGluZyB7CiAgICByZXR1cm4gX2NhbGxlcnM/LmtleXM7CiAgfQoKICBib29sIGlzQ2FsbGVkT25jZSgpIHsKICAgIC8vIElmIHRoaXMgYXNzZXJ0IGZpcmVzIGl0IG1lYW5zIHRoYXQgdGhpcyBNZW1iZXJUeXBlSW5mb3JtYXRpb24gZm9yIHRoZQogICAgLy8gZWxlbWVudCB3YXMgbm90IHBhcnQgb2YgdHlwZSBpbmZlcmVuY2UuIFRoaXMgaGFwcGVucyBmb3IKICAgIC8vIENvbnN0cnVjdG9yQm9keUVsZW1lbnRzLCBzbyBndWFyZCB0aGUgY2FsbCB3aXRoIGEgdGVzdCBmb3IKICAgIC8vIENvbnN0cnVjdG9yQm9keUVsZW1lbnQuIEZvciBvdGhlciBlbGVtZW50cywgaW52ZXN0aWdhdGUgd2h5IHRoZSBlbGVtZW50CiAgICAvLyB3YXMgbm90IHByZXNlbnQgZm9yIHR5cGUgaW5mZXJlbmNlLgogICAgYXNzZXJ0KF9pc0NhbGxlZE9uY2UgIT0gbnVsbCk7CiAgICByZXR1cm4gX2lzQ2FsbGVkT25jZSA/PyBmYWxzZTsKICB9CgogIGJvb2wgX2NvbXB1dGVJc0NhbGxlZE9uY2UoKSB7CiAgICBpZiAoX2NhbGxlcnMgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgaW50IGNvdW50ID0gMDsKICAgIGZvciAodmFyIHNldCBpbiBfY2FsbGVycy52YWx1ZXMpIHsKICAgICAgY291bnQgKz0gc2V0Lmxlbmd0aDsKICAgICAgaWYgKGNvdW50ID4gMSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIGNvdW50ID09IDE7CiAgfQoKICB2b2lkIGNvbXB1dGVJc0NhbGxlZE9uY2UoKSB7CiAgICBhc3NlcnQoX2lzQ2FsbGVkT25jZSA9PSBudWxsLCAiaXNDYWxsZWRPbmNlIGhhcyBhbHJlYWR5IGJlZW4gY29tcHV0ZWQuIik7CiAgICBfaXNDYWxsZWRPbmNlID0gX2NvbXB1dGVJc0NhbGxlZE9uY2UoKTsKICB9CgogIGJvb2wgZ2V0IGlzQ2xvc3VyaXplZCA9PiBjbG9zdXJpemVkQ291bnQgPiAwOwoKICAvLyBDbG9zdXJpemVkIG1ldGhvZHMgbmV2ZXIgYmVjb21lIHN0YWJsZSB0byBlbnN1cmUgdGhhdCB0aGUgaW5mb3JtYXRpb24gaW4KICAvLyBbdXNlcnNdIGlzIGFjY3VyYXRlLiBUaGUgaW5mZXJlbmNlIHN0b3BzIHRyYWNraW5nIHVzZXJzIGZvciBzdGFibGUgdHlwZXMuCiAgLy8gTm90ZSB0aGF0IHdlIG9ubHkgb3ZlcnJpZGUgdGhlIGdldHRlciwgdGhlIHNldHRlciB3aWxsIHN0aWxsIG1vZGlmeSB0aGUKICAvLyBzdGF0ZSBvZiB0aGUgW2lzU3RhYmxlXSBmaWVsZCBpbmhlcml0ZWQgZnJvbSBbVHlwZUluZm9ybWF0aW9uXS4KICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1N0YWJsZSA9PiBzdXBlci5pc1N0YWJsZSAmJiAhaXNDbG9zdXJpemVkOwoKICBBYnN0cmFjdFZhbHVlIGhhbmRsZVNwZWNpYWxDYXNlcyhJbmZlcnJlckVuZ2luZSBpbmZlcnJlcik7CgogIEFic3RyYWN0VmFsdWUgX2hhbmRsZUZ1bmN0aW9uQ2FzZSgKICAgICAgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24sIEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICBpZiAoaW5mZXJyZXIuY2xvc2VkV29ybGQubmF0aXZlRGF0YS5pc05hdGl2ZU1lbWJlcihmdW5jdGlvbikpIHsKICAgICAgLy8gVXNlIHRoZSB0eXBlIGFubm90YXRpb24gYXMgdGhlIHR5cGUgZm9yIG5hdGl2ZSBlbGVtZW50cy4gV2UKICAgICAgLy8gYWxzbyBnaXZlIHVwIG9uIGluZmVycmluZyB0byBtYWtlIHN1cmUgdGhpcyBlbGVtZW50IG5ldmVyCiAgICAgIC8vIGdvZXMgaW4gdGhlIHdvcmsgcXVldWUuCiAgICAgIGdpdmVVcChpbmZlcnJlcik7CiAgICAgIHJldHVybiBpbmZlcnJlcgogICAgICAgICAgLnR5cGVPZk5hdGl2ZUJlaGF2aW9yKAogICAgICAgICAgICAgIGluZmVycmVyLmNsb3NlZFdvcmxkLm5hdGl2ZURhdGEuZ2V0TmF0aXZlTWV0aG9kQmVoYXZpb3IoZnVuY3Rpb24pKQogICAgICAgICAgLnR5cGU7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEFic3RyYWN0VmFsdWUgcG90ZW50aWFsbHlOYXJyb3dUeXBlKAogICAgICBBYnN0cmFjdFZhbHVlIG1hc2ssIEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICBpZiAoaW5mZXJyZXIub3B0aW9ucy5hc3NpZ25tZW50Q2hlY2tQb2xpY3kuaXNUcnVzdGVkIHx8CiAgICAgICAgaW5mZXJyZXIub3B0aW9ucy5hc3NpZ25tZW50Q2hlY2tQb2xpY3kuaXNFbWl0dGVkKSB7CiAgICAgIHJldHVybiBfcG90ZW50aWFsbHlOYXJyb3dUeXBlKG1hc2ssIGluZmVycmVyKTsKICAgIH0KICAgIHJldHVybiBtYXNrOwogIH0KCiAgQWJzdHJhY3RWYWx1ZSBfcG90ZW50aWFsbHlOYXJyb3dUeXBlKAogICAgICBBYnN0cmFjdFZhbHVlIG1hc2ssIEluZmVycmVyRW5naW5lIGluZmVycmVyKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgQWJzdHJhY3RWYWx1ZSBzcGVjaWFsID0gaGFuZGxlU3BlY2lhbENhc2VzKGluZmVycmVyKTsKICAgIGlmIChzcGVjaWFsICE9IG51bGwpIHJldHVybiBwb3RlbnRpYWxseU5hcnJvd1R5cGUoc3BlY2lhbCwgaW5mZXJyZXIpOwogICAgcmV0dXJuIHBvdGVudGlhbGx5TmFycm93VHlwZSgKICAgICAgICBpbmZlcnJlci50eXBlcy5jb21wdXRlVHlwZU1hc2soYXNzaWdubWVudHMpLCBpbmZlcnJlcik7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHNhZmVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICByZXR1cm4gcG90ZW50aWFsbHlOYXJyb3dUeXBlKHN1cGVyLnNhZmVUeXBlKGluZmVycmVyKSwgaW5mZXJyZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ01lbWJlciAkX21lbWJlciAkdHlwZSc7CgogIEBvdmVycmlkZQogIGFjY2VwdChUeXBlSW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TWVtYmVyVHlwZUluZm9ybWF0aW9uKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjbGVhbnVwKCkgewogICAgX2NhbGxlcnMgPSBudWxsOwogICAgc3VwZXIuY2xlYW51cCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldEluZmVycmVkU2lnbmF0dXJlKFR5cGVTeXN0ZW0gdHlwZXMpIHsKICAgIHJldHVybiB0eXBlcy5nZXRJbmZlcnJlZFNpZ25hdHVyZU9mTWV0aG9kKF9tZW1iZXIpOwogIH0KfQoKY2xhc3MgRmllbGRUeXBlSW5mb3JtYXRpb24gZXh0ZW5kcyBNZW1iZXJUeXBlSW5mb3JtYXRpb24gewogIEZpZWxkRW50aXR5IGdldCBfZmllbGQgPT4gX21lbWJlcjsKICBmaW5hbCBEYXJ0VHlwZSBfdHlwZTsKCiAgRmllbGRUeXBlSW5mb3JtYXRpb24oCiAgICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwgRmllbGRFbnRpdHkgZWxlbWVudCwgdGhpcy5fdHlwZSkKICAgICAgOiBzdXBlci5faW50ZXJuYWwoYWJzdHJhY3RWYWx1ZURvbWFpbiwgZWxlbWVudCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgaGFuZGxlU3BlY2lhbENhc2VzKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICBpZiAoIWluZmVycmVyLmNhbkZpZWxkQmVVc2VkRm9yR2xvYmFsT3B0aW1pemF0aW9ucyhfZmllbGQpIHx8CiAgICAgICAgaW5mZXJyZXIuYXNzdW1lRHluYW1pYyhfZmllbGQpKSB7CiAgICAgIC8vIERvIG5vdCBpbmZlciB0eXBlcyBmb3IgZmllbGRzIHRoYXQgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgYW5ub3RhdGlvbiBvcgogICAgICAvLyBhcmUgYXNzaWduZWQgYnkgc3ludGhlc2l6ZWQgY2FsbHMKCiAgICAgIGdpdmVVcChpbmZlcnJlcik7CiAgICAgIHJldHVybiBzYWZlVHlwZShpbmZlcnJlcik7CiAgICB9CiAgICBpZiAoaW5mZXJyZXIuY2xvc2VkV29ybGQubmF0aXZlRGF0YS5pc05hdGl2ZU1lbWJlcihfZmllbGQpKSB7CiAgICAgIC8vIFVzZSB0aGUgdHlwZSBhbm5vdGF0aW9uIGFzIHRoZSB0eXBlIGZvciBuYXRpdmUgZWxlbWVudHMuIFdlCiAgICAgIC8vIGFsc28gZ2l2ZSB1cCBvbiBpbmZlcnJpbmcgdG8gbWFrZSBzdXJlIHRoaXMgZWxlbWVudCBuZXZlcgogICAgICAvLyBnb2VzIGluIHRoZSB3b3JrIHF1ZXVlLgogICAgICBnaXZlVXAoaW5mZXJyZXIpOwogICAgICByZXR1cm4gaW5mZXJyZXIKICAgICAgICAgIC50eXBlT2ZOYXRpdmVCZWhhdmlvcihpbmZlcnJlci5jbG9zZWRXb3JsZC5uYXRpdmVEYXRhCiAgICAgICAgICAgICAgLmdldE5hdGl2ZUZpZWxkTG9hZEJlaGF2aW9yKF9maWVsZCkpCiAgICAgICAgICAudHlwZTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBfcG90ZW50aWFsbHlOYXJyb3dUeXBlKAogICAgICBBYnN0cmFjdFZhbHVlIG1hc2ssIEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICByZXR1cm4gX25hcnJvd1R5cGUoaW5mZXJyZXIuY2xvc2VkV29ybGQsIG1hc2ssIF90eXBlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaGFzU3RhYmxlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgLy8gVGhlIG51bWJlciBvZiBhc3NpZ25tZW50cyBvZiBub24tZmluYWwgZmllbGRzIGlzCiAgICAvLyBub3Qgc3RhYmxlLiBUaGVyZWZvcmUgc3VjaCBhIGZpZWxkIGNhbm5vdCBiZSBzdGFibGUuCiAgICBpZiAoIV9maWVsZC5pc0Fzc2lnbmFibGUpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHN1cGVyLmhhc1N0YWJsZVR5cGUoaW5mZXJyZXIpOwogIH0KfQoKY2xhc3MgR2V0dGVyVHlwZUluZm9ybWF0aW9uIGV4dGVuZHMgTWVtYmVyVHlwZUluZm9ybWF0aW9uIHsKICBGdW5jdGlvbkVudGl0eSBnZXQgX2dldHRlciA9PiBfbWVtYmVyOwogIGZpbmFsIEZ1bmN0aW9uVHlwZSBfdHlwZTsKCiAgR2V0dGVyVHlwZUluZm9ybWF0aW9uKEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwKICAgICAgRnVuY3Rpb25FbnRpdHkgZWxlbWVudCwgdGhpcy5fdHlwZSkKICAgICAgOiBzdXBlci5faW50ZXJuYWwoYWJzdHJhY3RWYWx1ZURvbWFpbiwgZWxlbWVudCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgaGFuZGxlU3BlY2lhbENhc2VzKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICByZXR1cm4gX2hhbmRsZUZ1bmN0aW9uQ2FzZShfZ2V0dGVyLCBpbmZlcnJlcik7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIF9wb3RlbnRpYWxseU5hcnJvd1R5cGUoCiAgICAgIEFic3RyYWN0VmFsdWUgbWFzaywgSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIHJldHVybiBfbmFycm93VHlwZShpbmZlcnJlci5jbG9zZWRXb3JsZCwgbWFzaywgX3R5cGUucmV0dXJuVHlwZSk7CiAgfQp9CgpjbGFzcyBTZXR0ZXJUeXBlSW5mb3JtYXRpb24gZXh0ZW5kcyBNZW1iZXJUeXBlSW5mb3JtYXRpb24gewogIEZ1bmN0aW9uRW50aXR5IGdldCBfc2V0dGVyID0+IF9tZW1iZXI7CgogIFNldHRlclR5cGVJbmZvcm1hdGlvbigKICAgICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluLCBGdW5jdGlvbkVudGl0eSBlbGVtZW50KQogICAgICA6IHN1cGVyLl9pbnRlcm5hbChhYnN0cmFjdFZhbHVlRG9tYWluLCBlbGVtZW50KTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBoYW5kbGVTcGVjaWFsQ2FzZXMoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIHJldHVybiBfaGFuZGxlRnVuY3Rpb25DYXNlKF9zZXR0ZXIsIGluZmVycmVyKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgX3BvdGVudGlhbGx5TmFycm93VHlwZSgKICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrLCBJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgcmV0dXJuIG1hc2s7CiAgfQp9CgpjbGFzcyBNZXRob2RUeXBlSW5mb3JtYXRpb24gZXh0ZW5kcyBNZW1iZXJUeXBlSW5mb3JtYXRpb24gewogIEZ1bmN0aW9uRW50aXR5IGdldCBfbWV0aG9kID0+IF9tZW1iZXI7CiAgZmluYWwgRnVuY3Rpb25UeXBlIF90eXBlOwoKICBNZXRob2RUeXBlSW5mb3JtYXRpb24oQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICBGdW5jdGlvbkVudGl0eSBlbGVtZW50LCB0aGlzLl90eXBlKQogICAgICA6IHN1cGVyLl9pbnRlcm5hbChhYnN0cmFjdFZhbHVlRG9tYWluLCBlbGVtZW50KTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBoYW5kbGVTcGVjaWFsQ2FzZXMoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIHJldHVybiBfaGFuZGxlRnVuY3Rpb25DYXNlKF9tZXRob2QsIGluZmVycmVyKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgX3BvdGVudGlhbGx5TmFycm93VHlwZSgKICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrLCBJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgcmV0dXJuIF9uYXJyb3dUeXBlKGluZmVycmVyLmNsb3NlZFdvcmxkLCBtYXNrLCBfdHlwZS5yZXR1cm5UeXBlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaGFzU3RhYmxlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgPT4gZmFsc2U7Cn0KCmNsYXNzIEZhY3RvcnlDb25zdHJ1Y3RvclR5cGVJbmZvcm1hdGlvbiBleHRlbmRzIE1lbWJlclR5cGVJbmZvcm1hdGlvbiB7CiAgQ29uc3RydWN0b3JFbnRpdHkgZ2V0IF9jb25zdHJ1Y3RvciA9PiBfbWVtYmVyOwogIGZpbmFsIEZ1bmN0aW9uVHlwZSBfdHlwZTsKCiAgRmFjdG9yeUNvbnN0cnVjdG9yVHlwZUluZm9ybWF0aW9uKEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwKICAgICAgQ29uc3RydWN0b3JFbnRpdHkgZWxlbWVudCwgdGhpcy5fdHlwZSkKICAgICAgOiBzdXBlci5faW50ZXJuYWwoYWJzdHJhY3RWYWx1ZURvbWFpbiwgZWxlbWVudCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgaGFuZGxlU3BlY2lhbENhc2VzKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4gPSBpbmZlcnJlci5hYnN0cmFjdFZhbHVlRG9tYWluOwogICAgaWYgKF9jb25zdHJ1Y3Rvci5pc0Zyb21FbnZpcm9ubWVudENvbnN0cnVjdG9yKSB7CiAgICAgIGlmIChfY29uc3RydWN0b3IuZW5jbG9zaW5nQ2xhc3MgPT0gaW5mZXJyZXIuY29tbW9uRWxlbWVudHMuaW50Q2xhc3MpIHsKICAgICAgICBnaXZlVXAoaW5mZXJyZXIpOwogICAgICAgIHJldHVybiBhYnN0cmFjdFZhbHVlRG9tYWluLmluY2x1ZGVOdWxsKGFic3RyYWN0VmFsdWVEb21haW4uaW50VHlwZSk7CiAgICAgIH0gZWxzZSBpZiAoX2NvbnN0cnVjdG9yLmVuY2xvc2luZ0NsYXNzID09CiAgICAgICAgICBpbmZlcnJlci5jb21tb25FbGVtZW50cy5ib29sQ2xhc3MpIHsKICAgICAgICBnaXZlVXAoaW5mZXJyZXIpOwogICAgICAgIHJldHVybiBhYnN0cmFjdFZhbHVlRG9tYWluLmluY2x1ZGVOdWxsKGFic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUpOwogICAgICB9IGVsc2UgaWYgKF9jb25zdHJ1Y3Rvci5lbmNsb3NpbmdDbGFzcyA9PQogICAgICAgICAgaW5mZXJyZXIuY29tbW9uRWxlbWVudHMuc3RyaW5nQ2xhc3MpIHsKICAgICAgICBnaXZlVXAoaW5mZXJyZXIpOwogICAgICAgIHJldHVybiBhYnN0cmFjdFZhbHVlRG9tYWluLmluY2x1ZGVOdWxsKGFic3RyYWN0VmFsdWVEb21haW4uc3RyaW5nVHlwZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfaGFuZGxlRnVuY3Rpb25DYXNlKF9jb25zdHJ1Y3RvciwgaW5mZXJyZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBfcG90ZW50aWFsbHlOYXJyb3dUeXBlKAogICAgICBBYnN0cmFjdFZhbHVlIG1hc2ssIEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICByZXR1cm4gX25hcnJvd1R5cGUoaW5mZXJyZXIuY2xvc2VkV29ybGQsIG1hc2ssIF90eXBlLnJldHVyblR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNTdGFibGVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICByZXR1cm4gc3VwZXIuaGFzU3RhYmxlVHlwZShpbmZlcnJlcik7CiAgfQp9CgpjbGFzcyBHZW5lcmF0aXZlQ29uc3RydWN0b3JUeXBlSW5mb3JtYXRpb24gZXh0ZW5kcyBNZW1iZXJUeXBlSW5mb3JtYXRpb24gewogIENvbnN0cnVjdG9yRW50aXR5IGdldCBfY29uc3RydWN0b3IgPT4gX21lbWJlcjsKCiAgR2VuZXJhdGl2ZUNvbnN0cnVjdG9yVHlwZUluZm9ybWF0aW9uKAogICAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4sIENvbnN0cnVjdG9yRW50aXR5IGVsZW1lbnQpCiAgICAgIDogc3VwZXIuX2ludGVybmFsKGFic3RyYWN0VmFsdWVEb21haW4sIGVsZW1lbnQpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGhhbmRsZVNwZWNpYWxDYXNlcyhJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgcmV0dXJuIF9oYW5kbGVGdW5jdGlvbkNhc2UoX2NvbnN0cnVjdG9yLCBpbmZlcnJlcik7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIF9wb3RlbnRpYWxseU5hcnJvd1R5cGUoCiAgICAgIEFic3RyYWN0VmFsdWUgbWFzaywgSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIHJldHVybiBtYXNrOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNTdGFibGVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICByZXR1cm4gc3VwZXIuaGFzU3RhYmxlVHlwZShpbmZlcnJlcik7CiAgfQp9CgovLy8gQSBub2RlIHJlcHJlc2VudGluZyBwYXJhbWV0ZXJzOgovLy8KLy8vIC0gUGFyYW1ldGVycwovLy8gLSBJbml0aWFsaXppbmcgZm9ybWFscwovLy8KLy8vIFRoZXNlIHNob3VsZCBuZXZlciBiZSBjcmVhdGVkIGRpcmVjdGx5IGJ1dCBpbnN0ZWFkIGFyZSBjb25zdHJ1Y3RlZCBieQovLy8gdGhlIFtFbGVtZW50VHlwZUluZm9ybWF0aW9uXSBmYWN0b3J5LgpjbGFzcyBQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24gZXh0ZW5kcyBFbGVtZW50VHlwZUluZm9ybWF0aW9uIHsKICBmaW5hbCBMb2NhbCBfcGFyYW1ldGVyOwogIGZpbmFsIERhcnRUeXBlIF90eXBlOwogIGZpbmFsIEZ1bmN0aW9uRW50aXR5IF9tZXRob2Q7CiAgZmluYWwgYm9vbCBfaXNJbnN0YW5jZU1lbWJlclBhcmFtZXRlcjsKICBmaW5hbCBib29sIF9pc0Nsb3N1cmVQYXJhbWV0ZXI7CiAgZmluYWwgYm9vbCBfaXNJbml0aWFsaXppbmdGb3JtYWw7CiAgYm9vbCBfaXNUZWFyT2ZmQ2xvc3VyZVBhcmFtZXRlciA9IGZhbHNlOwoKICBQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24ubG9jYWxGdW5jdGlvbigKICAgICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICBNZW1iZXJUeXBlSW5mb3JtYXRpb24gY29udGV4dCwKICAgICAgdGhpcy5fcGFyYW1ldGVyLAogICAgICB0aGlzLl90eXBlLAogICAgICB0aGlzLl9tZXRob2QpCiAgICAgIDogX2lzSW5zdGFuY2VNZW1iZXJQYXJhbWV0ZXIgPSBmYWxzZSwKICAgICAgICBfaXNDbG9zdXJlUGFyYW1ldGVyID0gdHJ1ZSwKICAgICAgICBfaXNJbml0aWFsaXppbmdGb3JtYWwgPSBmYWxzZSwKICAgICAgICBzdXBlci5faW50ZXJuYWwoYWJzdHJhY3RWYWx1ZURvbWFpbiwgY29udGV4dCk7CgogIFBhcmFtZXRlclR5cGVJbmZvcm1hdGlvbi5zdGF0aWMoQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICBNZW1iZXJUeXBlSW5mb3JtYXRpb24gY29udGV4dCwgdGhpcy5fcGFyYW1ldGVyLCB0aGlzLl90eXBlLCB0aGlzLl9tZXRob2QsCiAgICAgIHtib29sIGlzSW5pdGlhbGl6aW5nRm9ybWFsOiBmYWxzZX0pCiAgICAgIDogX2lzSW5zdGFuY2VNZW1iZXJQYXJhbWV0ZXIgPSBmYWxzZSwKICAgICAgICBfaXNDbG9zdXJlUGFyYW1ldGVyID0gZmFsc2UsCiAgICAgICAgX2lzSW5pdGlhbGl6aW5nRm9ybWFsID0gaXNJbml0aWFsaXppbmdGb3JtYWwsCiAgICAgICAgc3VwZXIuX2ludGVybmFsKGFic3RyYWN0VmFsdWVEb21haW4sIGNvbnRleHQpOwoKICBQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24uaW5zdGFuY2VNZW1iZXIoCiAgICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwKICAgICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGNvbnRleHQsCiAgICAgIHRoaXMuX3BhcmFtZXRlciwKICAgICAgdGhpcy5fdHlwZSwKICAgICAgdGhpcy5fbWV0aG9kLAogICAgICBQYXJhbWV0ZXJBc3NpZ25tZW50cyBhc3NpZ25tZW50cykKICAgICAgOiBfaXNJbnN0YW5jZU1lbWJlclBhcmFtZXRlciA9IHRydWUsCiAgICAgICAgX2lzQ2xvc3VyZVBhcmFtZXRlciA9IGZhbHNlLAogICAgICAgIF9pc0luaXRpYWxpemluZ0Zvcm1hbCA9IGZhbHNlLAogICAgICAgIHN1cGVyLl93aXRoQXNzaWdubWVudHMoYWJzdHJhY3RWYWx1ZURvbWFpbiwgY29udGV4dCwgYXNzaWdubWVudHMpOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgbWV0aG9kID0+IF9tZXRob2Q7CgogIExvY2FsIGdldCBwYXJhbWV0ZXIgPT4gX3BhcmFtZXRlcjsKCiAgYm9vbCBnZXQgaXNSZWd1bGFyUGFyYW1ldGVyID0+ICFfaXNJbml0aWFsaXppbmdGb3JtYWw7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZGVidWdOYW1lID0+ICckcGFyYW1ldGVyJzsKCiAgdm9pZCB0YWdBc1RlYXJPZmZDbG9zdXJlUGFyYW1ldGVyKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICBhc3NlcnQoIV9pc0luaXRpYWxpemluZ0Zvcm1hbCk7CiAgICBfaXNUZWFyT2ZmQ2xvc3VyZVBhcmFtZXRlciA9IHRydWU7CiAgICAvLyBXZSBoYXZlIHRvIGFkZCBhIGZsb3ctZWRnZSBmb3IgdGhlIGRlZmF1bHQgdmFsdWUgKGlmIGl0IGV4aXN0cyksIGFzIHdlCiAgICAvLyBtaWdodCBub3Qgc2VlIGFsbCBjYWxsLXNpdGVzIGFuZCB0aHVzIG1pc3MgdGhlIHVzZSBvZiBpdC4KICAgIFR5cGVJbmZvcm1hdGlvbiBkZWZhdWx0VHlwZSA9CiAgICAgICAgaW5mZXJyZXIuZ2V0RGVmYXVsdFR5cGVPZlBhcmFtZXRlcihfcGFyYW1ldGVyKTsKICAgIGlmIChkZWZhdWx0VHlwZSAhPSBudWxsKSBkZWZhdWx0VHlwZS5hZGRVc2VyKHRoaXMpOwogIH0KCiAgLy8gVE9ETyhoZXJodXQpOiBDbGVhbnVwIGludG8gb25lIGNvbmRpdGlvbmFsLgogIEFic3RyYWN0VmFsdWUgaGFuZGxlU3BlY2lhbENhc2VzKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICBpZiAoIWluZmVycmVyLmNhbkZ1bmN0aW9uUGFyYW1ldGVyc0JlVXNlZEZvckdsb2JhbE9wdGltaXphdGlvbnMoX21ldGhvZCkgfHwKICAgICAgICBpbmZlcnJlci5hc3N1bWVEeW5hbWljKF9tZXRob2QpKSB7CiAgICAgIC8vIERvIG5vdCBpbmZlciB0eXBlcyBmb3IgcGFyYW1ldGVycyB0aGF0IGhhdmUgYSBjb3JyZXNwb25kaW5nIGFubm90YXRpb24KICAgICAgLy8gb3IgdGhhdCBhcmUgYXNzaWduZWQgYnkgc3ludGhlc2l6ZWQgY2FsbHMuCiAgICAgIGdpdmVVcChpbmZlcnJlcik7CiAgICAgIHJldHVybiBzYWZlVHlwZShpbmZlcnJlcik7CiAgICB9CgogICAgLy8gVGhlIGJlbG93IGRvIG5vdCBhcHBseSB0byBwYXJhbWV0ZXJzIG9mIGNvbnN0cnVjdG9ycywgc28gc2tpcAogICAgLy8gaW5pdGlhbGl6aW5nIGZvcm1hbHMuCiAgICBpZiAoX2lzSW5pdGlhbGl6aW5nRm9ybWFsKSByZXR1cm4gbnVsbDsKCiAgICBpZiAoKF9pc1RlYXJPZmZDbG9zdXJlUGFyYW1ldGVyIHx8IF9pc0Nsb3N1cmVQYXJhbWV0ZXIpICYmCiAgICAgICAgZGlzYWJsZUluZmVyZW5jZUZvckNsb3N1cmVzKSB7CiAgICAgIC8vIERvIG5vdCBpbmZlciB0eXBlcyBmb3IgcGFyYW1ldGVycyBvZiBjbG9zdXJlcy4gV2UgZG8gbm90CiAgICAgIC8vIGNsZWFyIHRoZSBhc3NpZ25tZW50cyBpbiBjYXNlIHRoZSBjbG9zdXJlIGlzIHN1Y2Nlc3NmdWxseQogICAgICAvLyB0cmFjZWQuCiAgICAgIGdpdmVVcChpbmZlcnJlciwgY2xlYXJBc3NpZ25tZW50czogZmFsc2UpOwogICAgICByZXR1cm4gc2FmZVR5cGUoaW5mZXJyZXIpOwogICAgfQogICAgaWYgKF9pc0luc3RhbmNlTWVtYmVyUGFyYW1ldGVyICYmCiAgICAgICAgKF9tZXRob2QubmFtZSA9PSBJZGVudGlmaWVycy5ub1N1Y2hNZXRob2RfIHx8CiAgICAgICAgICAgIChfbWV0aG9kLm5hbWUgPT0gSWRlbnRpZmllcnMuY2FsbCAmJgogICAgICAgICAgICAgICAgZGlzYWJsZUluZmVyZW5jZUZvckNsb3N1cmVzKSkpIHsKICAgICAgLy8gRG8gbm90IGluZmVyIHR5cGVzIGZvciBwYXJhbWV0ZXJzIG9mIFtub1N1Y2hNZXRob2RdIGFuZCBbY2FsbF0gaW5zdGFuY2UKICAgICAgLy8gbWV0aG9kcy4KICAgICAgZ2l2ZVVwKGluZmVycmVyKTsKICAgICAgcmV0dXJuIHNhZmVUeXBlKGluZmVycmVyKTsKICAgIH0KICAgIGlmIChpbmZlcnJlci5pbmZlcnJlZERhdGFCdWlsZGVyCiAgICAgICAgLmdldEN1cnJlbnRseUtub3duTWlnaHRCZVBhc3NlZFRvQXBwbHkoX21ldGhvZCkpIHsKICAgICAgZ2l2ZVVwKGluZmVycmVyKTsKICAgICAgcmV0dXJuIHNhZmVUeXBlKGluZmVycmVyKTsKICAgIH0KICAgIGlmIChfbWV0aG9kID09IGluZmVycmVyLm1haW5FbGVtZW50KSB7CiAgICAgIC8vIFRoZSBpbXBsaWNpdCBjYWxsIHRvIG1haW4gaXMgbm90IHNlZW4gYnkgdGhlIGluZmVycmVyLAogICAgICAvLyB0aGVyZWZvcmUgd2UgZXhwbGljaXRseSBzZXQgdGhlIHR5cGUgb2YgaXRzIHBhcmFtZXRlcnMgYXMKICAgICAgLy8gZHluYW1pYy4KICAgICAgLy8gVE9ETygxNDU2Nik6IHN5bnRoZXNpemUgYSBjYWxsIGluc3RlYWQgdG8gZ2V0IHRoZSBleGFjdAogICAgICAvLyB0eXBlcy4KICAgICAgZ2l2ZVVwKGluZmVycmVyKTsKICAgICAgcmV0dXJuIHNhZmVUeXBlKGluZmVycmVyKTsKICAgIH0KCiAgICByZXR1cm4gbnVsbDsKICB9CgogIEFic3RyYWN0VmFsdWUgcG90ZW50aWFsbHlOYXJyb3dUeXBlKAogICAgICBBYnN0cmFjdFZhbHVlIG1hc2ssIEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICBpZiAoaW5mZXJyZXIub3B0aW9ucy5wYXJhbWV0ZXJDaGVja1BvbGljeS5pc1RydXN0ZWQpIHsKICAgICAgLy8gSW4gY2hlY2tlZCBvciBzdHJvbmcgbW9kZSB3ZSBkb24ndCB0cnVzdCB0aGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cwogICAgICAvLyBwYXNzZWQgdG8gYSBwYXJhbWV0ZXIuIFRoZSBtZWFucyB0aGF0IHRoZSBjaGVja2luZyBvZiBhIHBhcmFtZXRlciBpcwogICAgICAvLyBiYXNlZCBvbiB0aGUgYWN0dWFsIGFyZ3VtZW50cy4KICAgICAgLy8KICAgICAgLy8gV2l0aCAtLXRydXN0LXR5cGUtYW5ub3RhdGlvbnMgb3IgLS1vbWl0LWltcGxpY2l0LWNoZWNrcyB3ZSBfZG9fIHRydXN0CiAgICAgIC8vIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIGEgcGFyYW1ldGVyIC0gYW5kIHdlIG5ldmVyIGNoZWNrIHRoZW0uCiAgICAgIC8vCiAgICAgIC8vIEluIGFsbCB0aGVzZSBjYXNlcyB3ZSBfZG9fIHRydXN0IHRoZSBzdGF0aWMgdHlwZSBvZiBhIHBhcmFtZXRlciB3aXRoaW4KICAgICAgLy8gdGhlIG1ldGhvZCBpdHNlbGYuIEZvciBpbnN0YW5jZToKICAgICAgLy8KICAgICAgLy8gICAgIG1ldGhvZChpbnQgaSkgPT4gaTsKICAgICAgLy8gICAgIG1haW4oKSB7CiAgICAgIC8vICAgICAgIGR5bmFtaWMgZiA9IG1ldGhvZDsKICAgICAgLy8gICAgICAgZigwKTsgLy8gdmFsaWQgY2FsbAogICAgICAvLyAgICAgICBmKCcnKTsgLy8gaW52YWxpZCBjYWxsCiAgICAgIC8vICAgICB9CiAgICAgIC8vCiAgICAgIC8vIEhlcmUsIGluIGFsbCBjYXNlcywgd2UgaW5mZXIgdGhlIHJldHVybmVkIHZhbHVlIG9mIGBtZXRob2RgIHRvIGJlIGFuCiAgICAgIC8vIGBpbnRgLiBJbiBjaGVja2VkIGFuZCBzdHJvbmcgbW9kZSB3ZSBpbmZlciB0aGUgcGFyYW1ldGVyIG9mIGBtZXRob2RgIHRvCiAgICAgIC8vIGJlIGVpdGhlciBgaW50YCBvciBgU3RyaW5nYCBhbmQgdGhlcmVmb3JlIGluc2VydCBhIGNoZWNrIGF0IHRoZSBlbnRyeQogICAgICAvLyBvZiAnbWV0aG9kJy4gV2l0aCAtLXRydXN0LXR5cGUtYW5ub3RhdGlvbnMgb3IgLS1vbWl0LWltcGxpY2l0LWNoZWNrcyB3ZQogICAgICAvLyAodW5zb3VuZGx5KSBpbmZlciB0aGUgcGFyYW1ldGVyIHRvIGJlIGBpbnRgIGFuZCBsZWF2ZSB0aGUgcGFyYW1ldGVyCiAgICAgIC8vIHVuY2hlY2tlZCwgYW5kIGBtZXRob2RgIHdpbGwgYXQgcnVudGltZSBhY3R1YWxseSByZXR1cm4gYSBgU3RyaW5nYCBmcm9tCiAgICAgIC8vIHRoZSBzZWNvbmQgaW52b2NhdGlvbi4KICAgICAgLy8KICAgICAgLy8gVGhlIHRydXN0aW5nIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZXMgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBtZXRob2QgaXMKICAgICAgLy8gaXMgZG9uZSB0aHJvdWdoIGBMb2NhbHNIYW5kbGVyLnVwZGF0ZWAgY2FsbGVkIGluCiAgICAgIC8vIGBLZXJuZWxUeXBlR3JhcGhCdWlsZGVyLmhhbmRsZVBhcmFtZXRlcmAuCiAgICAgIHJldHVybiBfbmFycm93VHlwZShpbmZlcnJlci5jbG9zZWRXb3JsZCwgbWFzaywgX3R5cGUpOwogICAgfQogICAgcmV0dXJuIG1hc2s7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICBBYnN0cmFjdFZhbHVlIHNwZWNpYWwgPSBoYW5kbGVTcGVjaWFsQ2FzZXMoaW5mZXJyZXIpOwogICAgaWYgKHNwZWNpYWwgIT0gbnVsbCkgcmV0dXJuIHNwZWNpYWw7CiAgICByZXR1cm4gcG90ZW50aWFsbHlOYXJyb3dUeXBlKAogICAgICAgIGluZmVycmVyLnR5cGVzLmNvbXB1dGVUeXBlTWFzayhhc3NpZ25tZW50cyksIGluZmVycmVyKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgc2FmZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIHJldHVybiBwb3RlbnRpYWxseU5hcnJvd1R5cGUoc3VwZXIuc2FmZVR5cGUoaW5mZXJyZXIpLCBpbmZlcnJlcik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGhhc1N0YWJsZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIC8vIFRoZSBudW1iZXIgb2YgYXNzaWdubWVudHMgb2YgcGFyYW1ldGVycyBvZiBpbnN0YW5jZSBtZXRob2RzIGlzCiAgICAvLyBub3Qgc3RhYmxlLiBUaGVyZWZvcmUgc3VjaCBhIHBhcmFtZXRlciBjYW5ub3QgYmUgc3RhYmxlLgogICAgaWYgKF9pc0luc3RhbmNlTWVtYmVyUGFyYW1ldGVyKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiBzdXBlci5oYXNTdGFibGVUeXBlKGluZmVycmVyKTsKICB9CgogIEBvdmVycmlkZQogIGFjY2VwdChUeXBlSW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0UGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1BhcmFtZXRlciAkX3BhcmFtZXRlciAkdHlwZSc7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXRJbmZlcnJlZFNpZ25hdHVyZShUeXBlU3lzdGVtIHR5cGVzKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uLmdldEluZmVycmVkU2lnbmF0dXJlJyk7CiAgfQp9CgplbnVtIENhbGxUeXBlIHsKICBhY2Nlc3MsCiAgZm9ySW4sCn0KCmJvb2wgdmFsaWRDYWxsVHlwZShDYWxsVHlwZSBjYWxsVHlwZSwgT2JqZWN0IGNhbGwpIHsKICBzd2l0Y2ggKGNhbGxUeXBlKSB7CiAgICBjYXNlIENhbGxUeXBlLmFjY2VzczoKICAgICAgcmV0dXJuIGNhbGwgaXMgaXIuTm9kZTsKICAgIGNhc2UgQ2FsbFR5cGUuZm9ySW46CiAgICAgIHJldHVybiBjYWxsIGlzIGlyLkZvckluU3RhdGVtZW50OwogIH0KICB0aHJvdyBuZXcgU3RhdGVFcnJvcignVW5leHBlY3RlZCBjYWxsIHR5cGUgJGNhbGxUeXBlLicpOwp9CgovLy8gQSBbQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb25dIGlzIGEgY2FsbCBmb3VuZCBpbiB0aGUgQVNULCBvciBhCi8vLyBzeW50aGVzaXplZCBjYWxsIGZvciBpbXBsaWNpdCBjYWxscyBpbiBEYXJ0IChzdWNoIGFzIGZvcndhcmRpbmcKLy8vIGZhY3RvcmllcykuIFRoZSBbX2NhbGxdIGZpZWxkIGlzIGEgW2FzdC5Ob2RlXSBmb3IgdGhlIGZvcm1lciwgYW5kIGFuCi8vLyBbRWxlbWVudF0gZm9yIHRoZSBsYXR0ZXIuCi8vLwovLy8gSW4gdGhlIGluZmVycmVyIGdyYXBoLCBbQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb25dIG5vZGVzIGRvIG5vdCBoYXZlCi8vLyBhbnkgYXNzaWdubWVudC4gVGhleSByZWx5IG9uIHRoZSBbY2FsbGVyXSBmaWVsZCBmb3Igc3RhdGljIGNhbGxzLAovLy8gYW5kIFtzZWxlY3Rvcl0gYW5kIFtyZWNlaXZlcl0gZmllbGRzIGZvciBkeW5hbWljIGNhbGxzLgphYnN0cmFjdCBjbGFzcyBDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbiBleHRlbmRzIFR5cGVJbmZvcm1hdGlvbgogICAgd2l0aCBBcHBseWFibGVUeXBlSW5mb3JtYXRpb24gewogIGZpbmFsIE9iamVjdCBfY2FsbDsKICBmaW5hbCBNZW1iZXJFbnRpdHkgY2FsbGVyOwogIGZpbmFsIFNlbGVjdG9yIHNlbGVjdG9yOwogIGZpbmFsIEFic3RyYWN0VmFsdWUgbWFzazsKICBmaW5hbCBBcmd1bWVudHNUeXBlcyBhcmd1bWVudHM7CiAgZmluYWwgYm9vbCBpbkxvb3A7CgogIENhbGxTaXRlVHlwZUluZm9ybWF0aW9uKAogICAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4sCiAgICAgIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBjb250ZXh0LAogICAgICB0aGlzLl9jYWxsLAogICAgICB0aGlzLmNhbGxlciwKICAgICAgdGhpcy5zZWxlY3RvciwKICAgICAgdGhpcy5tYXNrLAogICAgICB0aGlzLmFyZ3VtZW50cywKICAgICAgdGhpcy5pbkxvb3ApCiAgICAgIDogc3VwZXIubm9Bc3NpZ25tZW50cyhhYnN0cmFjdFZhbHVlRG9tYWluLmVtcHR5VHlwZSwgY29udGV4dCkgewogICAgYXNzZXJ0KF9jYWxsIGlzIGlyLk5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0NhbGwgc2l0ZSAkZGVidWdOYW1lICR0eXBlJzsKCiAgLy8vIEFkZCBbdGhpc10gdG8gdGhlIGdyYXBoIGJlaW5nIGNvbXB1dGVkIGJ5IFtlbmdpbmVdLgogIHZvaWQgYWRkVG9HcmFwaChJbmZlcnJlckVuZ2luZSBlbmdpbmUpOwoKICAvLy8gUmV0dXJuIGFuIGl0ZXJhYmxlIG92ZXIgdGhlIHRhcmdldHMgb2YgdGhpcyBjYWxsLgogIEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gZ2V0IGNhbGxlZXM7CgogIFN0cmluZyBnZXQgZGVidWdOYW1lID0+ICckX2NhbGwnOwp9CgpjbGFzcyBTdGF0aWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbiBleHRlbmRzIENhbGxTaXRlVHlwZUluZm9ybWF0aW9uIHsKICBmaW5hbCBNZW1iZXJFbnRpdHkgY2FsbGVkRWxlbWVudDsKCiAgU3RhdGljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24oCiAgICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwKICAgICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGNvbnRleHQsCiAgICAgIE9iamVjdCBjYWxsLAogICAgICBNZW1iZXJFbnRpdHkgZW5jbG9zaW5nLAogICAgICB0aGlzLmNhbGxlZEVsZW1lbnQsCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBBYnN0cmFjdFZhbHVlIG1hc2ssCiAgICAgIEFyZ3VtZW50c1R5cGVzIGFyZ3VtZW50cywKICAgICAgYm9vbCBpbkxvb3ApCiAgICAgIDogc3VwZXIoYWJzdHJhY3RWYWx1ZURvbWFpbiwgY29udGV4dCwgY2FsbCwgZW5jbG9zaW5nLCBzZWxlY3RvciwgbWFzaywKICAgICAgICAgICAgYXJndW1lbnRzLCBpbkxvb3ApOwoKICBNZW1iZXJUeXBlSW5mb3JtYXRpb24gX2dldENhbGxlZFR5cGVJbmZvKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICByZXR1cm4gaW5mZXJyZXIudHlwZXMuZ2V0SW5mZXJyZWRUeXBlT2ZNZW1iZXIoY2FsbGVkRWxlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZFRvR3JhcGgoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBjYWxsZWUgPSBfZ2V0Q2FsbGVkVHlwZUluZm8oaW5mZXJyZXIpOwogICAgY2FsbGVlLmFkZENhbGwoY2FsbGVyLCBfY2FsbCk7CiAgICBjYWxsZWUuYWRkVXNlcih0aGlzKTsKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBhcmd1bWVudHMuZm9yRWFjaCgoaW5mbykgPT4gaW5mby5hZGRVc2VyKHRoaXMpKTsKICAgIH0KICAgIGluZmVycmVyLnVwZGF0ZVBhcmFtZXRlckFzc2lnbm1lbnRzKAogICAgICAgIHRoaXMsIGNhbGxlZEVsZW1lbnQsIGFyZ3VtZW50cywgc2VsZWN0b3IsIG1hc2ssCiAgICAgICAgcmVtb3ZlOiBmYWxzZSwgYWRkVG9RdWV1ZTogZmFsc2UpOwogIH0KCiAgYm9vbCBnZXQgaXNTeW50aGVzaXplZCB7CiAgICAvLyBTb21lIGNhbGxzIGRvIG5vdCBoYXZlIGEgY29ycmVzcG9uZGluZyBzZWxlY3RvciwgZm9yIGV4YW1wbGUKICAgIC8vIGZvcndhcmRpbmcgZmFjdG9yeSBjb25zdHJ1Y3RvcnMsIG9yIHN5bnRoZXNpemVkIHN1cGVyCiAgICAvLyBjb25zdHJ1Y3RvciBjYWxscy4gV2Ugc3ludGhlc2l6ZSB0aGVzZSBjYWxscyBidXQgZG8KICAgIC8vIG5vdCBjcmVhdGUgYSBzZWxlY3RvciBmb3IgdGhlbS4KICAgIHJldHVybiBzZWxlY3RvciA9PSBudWxsOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIF9nZXRDYWxsZWRUeXBlSW5mb1dpdGhTZWxlY3RvcihJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgcmV0dXJuIGluZmVycmVyLnR5cGVPZk1lbWJlcldpdGhTZWxlY3RvcihjYWxsZWRFbGVtZW50LCBzZWxlY3Rvcik7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICBpZiAoaXNTeW50aGVzaXplZCkgewogICAgICBhc3NlcnQoYXJndW1lbnRzICE9IG51bGwpOwogICAgICByZXR1cm4gX2dldENhbGxlZFR5cGVJbmZvKGluZmVycmVyKS50eXBlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9nZXRDYWxsZWRUeXBlSW5mb1dpdGhTZWxlY3RvcihpbmZlcnJlcikudHlwZTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gZ2V0IGNhbGxlZXMgPT4gW2NhbGxlZEVsZW1lbnRdOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoVHlwZUluZm9ybWF0aW9uVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNTdGFibGVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICBib29sIGlzU3RhYmxlID0gX2dldENhbGxlZFR5cGVJbmZvKGluZmVycmVyKS5pc1N0YWJsZTsKICAgIHJldHVybiBpc1N0YWJsZSAmJgogICAgICAgIChhcmd1bWVudHMgPT0gbnVsbCB8fCBhcmd1bWVudHMuZXZlcnkoKGluZm8pID0+IGluZm8uaXNTdGFibGUpKSAmJgogICAgICAgIHN1cGVyLmhhc1N0YWJsZVR5cGUoaW5mZXJyZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZW1vdmVBbmRDbGVhclJlZmVyZW5jZXMoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIEVsZW1lbnRUeXBlSW5mb3JtYXRpb24gY2FsbGVlID0gX2dldENhbGxlZFR5cGVJbmZvKGluZmVycmVyKTsKICAgIGNhbGxlZS5yZW1vdmVVc2VyKHRoaXMpOwogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGFyZ3VtZW50cy5mb3JFYWNoKChpbmZvKSA9PiBpbmZvLnJlbW92ZVVzZXIodGhpcykpOwogICAgfQogICAgc3VwZXIucmVtb3ZlQW5kQ2xlYXJSZWZlcmVuY2VzKGluZmVycmVyKTsKICB9Cn0KCmNsYXNzIER5bmFtaWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbjxUPiBleHRlbmRzIENhbGxTaXRlVHlwZUluZm9ybWF0aW9uIHsKICBmaW5hbCBDYWxsVHlwZSBfY2FsbFR5cGU7CiAgZmluYWwgVHlwZUluZm9ybWF0aW9uIHJlY2VpdmVyOwogIGZpbmFsIGJvb2wgaXNDb25kaXRpb25hbDsKICBib29sIF9oYXNDbG9zdXJlQ2FsbFRhcmdldHM7CgogIC8vLyBDYWNoZWQgY29uY3JldGUgdGFyZ2V0cyBvZiB0aGlzIGNhbGwuCiAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBfY29uY3JldGVUYXJnZXRzOwoKICBEeW5hbWljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24oCiAgICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwKICAgICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGNvbnRleHQsCiAgICAgIHRoaXMuX2NhbGxUeXBlLAogICAgICBUIGNhbGwsCiAgICAgIE1lbWJlckVudGl0eSBlbmNsb3NpbmcsCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBBYnN0cmFjdFZhbHVlIG1hc2ssCiAgICAgIHRoaXMucmVjZWl2ZXIsCiAgICAgIEFyZ3VtZW50c1R5cGVzIGFyZ3VtZW50cywKICAgICAgYm9vbCBpbkxvb3AsCiAgICAgIHRoaXMuaXNDb25kaXRpb25hbCkKICAgICAgOiBzdXBlcihhYnN0cmFjdFZhbHVlRG9tYWluLCBjb250ZXh0LCBjYWxsLCBlbmNsb3NpbmcsIHNlbGVjdG9yLCBtYXNrLAogICAgICAgICAgICBhcmd1bWVudHMsIGluTG9vcCkgewogICAgYXNzZXJ0KHZhbGlkQ2FsbFR5cGUoX2NhbGxUeXBlLCBfY2FsbCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRUb0dyYXBoKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICBhc3NlcnQocmVjZWl2ZXIgIT0gbnVsbCk7CiAgICBBYnN0cmFjdFZhbHVlIHR5cGVNYXNrID0gY29tcHV0ZVR5cGVkU2VsZWN0b3IoaW5mZXJyZXIpOwogICAgX2hhc0Nsb3N1cmVDYWxsVGFyZ2V0cyA9CiAgICAgICAgaW5mZXJyZXIuY2xvc2VkV29ybGQuaW5jbHVkZXNDbG9zdXJlQ2FsbChzZWxlY3RvciwgdHlwZU1hc2spOwogICAgX2NvbmNyZXRlVGFyZ2V0cyA9IGluZmVycmVyLmNsb3NlZFdvcmxkLmxvY2F0ZU1lbWJlcnMoc2VsZWN0b3IsIHR5cGVNYXNrKTsKICAgIHJlY2VpdmVyLmFkZFVzZXIodGhpcyk7CiAgICBpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgYXJndW1lbnRzLmZvckVhY2goKGluZm8pID0+IGluZm8uYWRkVXNlcih0aGlzKSk7CiAgICB9CiAgICBmb3IgKE1lbWJlckVudGl0eSBlbGVtZW50IGluIF9jb25jcmV0ZVRhcmdldHMpIHsKICAgICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGNhbGxlZSA9CiAgICAgICAgICBpbmZlcnJlci50eXBlcy5nZXRJbmZlcnJlZFR5cGVPZk1lbWJlcihlbGVtZW50KTsKICAgICAgY2FsbGVlLmFkZENhbGwoY2FsbGVyLCBfY2FsbCk7CiAgICAgIGNhbGxlZS5hZGRVc2VyKHRoaXMpOwogICAgICBpbmZlcnJlci51cGRhdGVQYXJhbWV0ZXJBc3NpZ25tZW50cygKICAgICAgICAgIHRoaXMsIGVsZW1lbnQsIGFyZ3VtZW50cywgc2VsZWN0b3IsIHR5cGVNYXNrLAogICAgICAgICAgcmVtb3ZlOiBmYWxzZSwgYWRkVG9RdWV1ZTogZmFsc2UpOwogICAgfQogIH0KCiAgLy8vIGB0cnVlYCBpZiB0aGlzIGludm9jYXRpb24gY2FuIGhpdCBhICdjYWxsJyBtZXRob2Qgb24gYSBjbG9zdXJlLgogIGJvb2wgZ2V0IGhhc0Nsb3N1cmVDYWxsVGFyZ2V0cyA9PiBfaGFzQ2xvc3VyZUNhbGxUYXJnZXRzOwoKICAvLy8gQWxsIGNvbmNyZXRlIHRhcmdldHMgb2YgdGhpcyBpbnZvY2F0aW9uLiBJZiBbaGFzQ2xvc3VyZUNhbGxUYXJnZXRzXSBpcwogIC8vLyBgdHJ1ZWAgdGhlIGludm9jYXRpb24gY2FuIGFkZGl0aW9uYWwgdGFyZ2V0IGFuIHVua25vd24gc2V0IG9mICdjYWxsJwogIC8vLyBtZXRob2RzIG9uIGNsb3N1cmVzLgogIEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gZ2V0IGNvbmNyZXRlVGFyZ2V0cyA9PiBfY29uY3JldGVUYXJnZXRzOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IGdldCBjYWxsZWVzID0+IF9jb25jcmV0ZVRhcmdldHM7CgogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGVkU2VsZWN0b3IoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXJUeXBlID0gcmVjZWl2ZXIudHlwZTsKCiAgICBpZiAobWFzayAhPSByZWNlaXZlclR5cGUpIHsKICAgICAgcmV0dXJuIHJlY2VpdmVyVHlwZSA9PSBpbmZlcnJlci5hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlCiAgICAgICAgICA/IG51bGwKICAgICAgICAgIDogcmVjZWl2ZXJUeXBlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG1hc2s7CiAgICB9CiAgfQoKICBib29sIHRhcmdldHNJbmNsdWRlQ29tcGxleE5vU3VjaE1ldGhvZChJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgcmV0dXJuIF9jb25jcmV0ZVRhcmdldHMuYW55KChNZW1iZXJFbnRpdHkgZSkgewogICAgICByZXR1cm4gZS5pc0Z1bmN0aW9uICYmCiAgICAgICAgICBlLmlzSW5zdGFuY2VNZW1iZXIgJiYKICAgICAgICAgIGUubmFtZSA9PSBJZGVudGlmaWVycy5ub1N1Y2hNZXRob2RfICYmCiAgICAgICAgICBpbmZlcnJlci5ub1N1Y2hNZXRob2REYXRhLmlzQ29tcGxleChlKTsKICAgIH0pOwogIH0KCiAgLy8vIFdlIG9wdGltaXplIGNlcnRhaW4gb3BlcmF0aW9ucyBvbiB0aGUgW2ludF0gY2xhc3MgYmVjYXVzZSB3ZSBrbm93IG1vcmUKICAvLy8gYWJvdXQgdGhlaXIgcmV0dXJuIHR5cGUgdGhhbiB0aGUgYWN0dWFsIERhcnQgY29kZS4gRm9yIGV4YW1wbGUsIHdlIGtub3cKICAvLy8gaW50ICsgaW50IHJldHVybnMgYW4gaW50LiBUaGUgRGFydCBsaWJyYXJ5IGNvZGUgZm9yIFtpbnQub3BlcmF0b3IrXSBvbmx5CiAgLy8vIHNheXMgaXQgcmV0dXJucyBhIFtudW1dLgogIC8vLwogIC8vLyBSZXR1cm5zIHRoZSBtb3JlIHByZWNpc2UgVHlwZUluZm9ybWF0aW9uLCBvciBgbnVsbGAgdG8gZGVmZXIgdG8gdGhlCiAgLy8vIGxpYnJhcnkgY29kZS4KICBUeXBlSW5mb3JtYXRpb24gaGFuZGxlSW50cmlzaWZpZWRTZWxlY3RvcigKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgbWFzaywgSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCA9IGluZmVycmVyLmNsb3NlZFdvcmxkOwogICAgaWYgKG1hc2sgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBpZiAoaW5mZXJyZXIuYWJzdHJhY3RWYWx1ZURvbWFpbi5pc0ludGVnZXJPck51bGwobWFzaykuaXNQb3RlbnRpYWxseUZhbHNlKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKCFzZWxlY3Rvci5pc0NhbGwgJiYgIXNlbGVjdG9yLmlzT3BlcmF0b3IpIHJldHVybiBudWxsOwogICAgaWYgKCFhcmd1bWVudHMubmFtZWQuaXNFbXB0eSkgcmV0dXJuIG51bGw7CiAgICBpZiAoYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoID4gMSkgcmV0dXJuIG51bGw7CgogICAgQ2xhc3NFbnRpdHkgdWludDMxSW1wbGVtZW50YXRpb24gPSBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5qc1VJbnQzMUNsYXNzOwogICAgYm9vbCBpc0ludChpbmZvKSA9PiBpbmZvLnR5cGUuY29udGFpbnNPbmx5SW50KGNsb3NlZFdvcmxkKTsKICAgIGJvb2wgaXNFbXB0eShpbmZvKSA9PiBpbmZvLnR5cGUuaXNFbXB0eTsKICAgIGJvb2wgaXNVSW50MzEoaW5mbykgewogICAgICByZXR1cm4gaW5mby50eXBlLnNhdGlzZmllcyh1aW50MzFJbXBsZW1lbnRhdGlvbiwgY2xvc2VkV29ybGQpOwogICAgfQoKICAgIGJvb2wgaXNQb3NpdGl2ZUludChpbmZvKSB7CiAgICAgIHJldHVybiBpbmZvLnR5cGUuc2F0aXNmaWVzKAogICAgICAgICAgY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuanNQb3NpdGl2ZUludENsYXNzLCBjbG9zZWRXb3JsZCk7CiAgICB9CgogICAgVHlwZUluZm9ybWF0aW9uIHRyeUxhdGVyKCkgPT4gaW5mZXJyZXIudHlwZXMubm9uTnVsbEVtcHR5VHlwZTsKCiAgICBUeXBlSW5mb3JtYXRpb24gYXJndW1lbnQgPQogICAgICAgIGFyZ3VtZW50cy5pc0VtcHR5ID8gbnVsbCA6IGFyZ3VtZW50cy5wb3NpdGlvbmFsLmZpcnN0OwoKICAgIFN0cmluZyBuYW1lID0gc2VsZWN0b3IubmFtZTsKICAgIC8vIFRoZXNlIGFyZSB0eXBlIGluZmVyZW5jZSBydWxlcyBvbmx5IGZvciB1c2VmdWwgY2FzZXMgdGhhdCBhcmUgbm90CiAgICAvLyBleHByZXNzZWQgaW4gdGhlIGxpYnJhcnkgY29kZSwgZm9yIGV4YW1wbGU6CiAgICAvLwogICAgLy8gICAgIGludCArIGludCAgICAgICAgLT4gIGludAogICAgLy8gICAgIHVpbnQzMSB8IHVpbnQzMSAgLT4gIHVpbnQzMQogICAgLy8KICAgIHN3aXRjaCAobmFtZSkgewogICAgICBjYXNlICcqJzoKICAgICAgY2FzZSAnKyc6CiAgICAgIGNhc2UgJyUnOgogICAgICBjYXNlICdyZW1haW5kZXInOgogICAgICBjYXNlICd+Lyc6CiAgICAgICAgaWYgKGlzRW1wdHkoYXJndW1lbnQpKSByZXR1cm4gdHJ5TGF0ZXIoKTsKICAgICAgICBpZiAoaXNQb3NpdGl2ZUludChyZWNlaXZlcikgJiYgaXNQb3NpdGl2ZUludChhcmd1bWVudCkpIHsKICAgICAgICAgIC8vIHVpbnQzMSArIHVpbnQzMSAtPiB1aW50MzIKICAgICAgICAgIGlmIChuYW1lID09ICcrJyAmJiBpc1VJbnQzMShyZWNlaXZlcikgJiYgaXNVSW50MzEoYXJndW1lbnQpKSB7CiAgICAgICAgICAgIHJldHVybiBpbmZlcnJlci50eXBlcy51aW50MzJUeXBlOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGluZmVycmVyLnR5cGVzLnBvc2l0aXZlSW50VHlwZTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzSW50KGFyZ3VtZW50KSkgewogICAgICAgICAgcmV0dXJuIGluZmVycmVyLnR5cGVzLmludFR5cGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwoKICAgICAgY2FzZSAnfCc6CiAgICAgIGNhc2UgJ14nOgogICAgICAgIGlmIChpc0VtcHR5KGFyZ3VtZW50KSkgcmV0dXJuIHRyeUxhdGVyKCk7CiAgICAgICAgaWYgKGlzVUludDMxKHJlY2VpdmVyKSAmJiBpc1VJbnQzMShhcmd1bWVudCkpIHsKICAgICAgICAgIHJldHVybiBpbmZlcnJlci50eXBlcy51aW50MzFUeXBlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgIGNhc2UgJz4+JzoKICAgICAgICBpZiAoaXNFbXB0eShhcmd1bWVudCkpIHJldHVybiB0cnlMYXRlcigpOwogICAgICAgIGlmIChpc1VJbnQzMShyZWNlaXZlcikpIHsKICAgICAgICAgIHJldHVybiBpbmZlcnJlci50eXBlcy51aW50MzFUeXBlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgIGNhc2UgJyYnOgogICAgICAgIGlmIChpc0VtcHR5KGFyZ3VtZW50KSkgcmV0dXJuIHRyeUxhdGVyKCk7CiAgICAgICAgaWYgKGlzVUludDMxKHJlY2VpdmVyKSB8fCBpc1VJbnQzMShhcmd1bWVudCkpIHsKICAgICAgICAgIHJldHVybiBpbmZlcnJlci50eXBlcy51aW50MzFUeXBlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgIGNhc2UgJy0nOgogICAgICAgIGlmIChpc0VtcHR5KGFyZ3VtZW50KSkgcmV0dXJuIHRyeUxhdGVyKCk7CiAgICAgICAgaWYgKGlzSW50KGFyZ3VtZW50KSkgewogICAgICAgICAgcmV0dXJuIGluZmVycmVyLnR5cGVzLmludFR5cGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwoKICAgICAgY2FzZSAndW5hcnktJzoKICAgICAgICAvLyBUaGUgcmVjZWl2ZXIgYmVpbmcgYW4gaW50LCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYWxzbyBiZSBhbiBpbnQuCiAgICAgICAgcmV0dXJuIGluZmVycmVyLnR5cGVzLmludFR5cGU7CgogICAgICBjYXNlICdhYnMnOgogICAgICAgIHJldHVybiBhcmd1bWVudHMuaGFzTm9Bcmd1bWVudHMoKQogICAgICAgICAgICA/IGluZmVycmVyLnR5cGVzLnBvc2l0aXZlSW50VHlwZQogICAgICAgICAgICA6IG51bGw7CgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkID0gaW5mZXJyZXIuY2xvc2VkV29ybGQ7CiAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4gPSBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluOwogICAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBvbGRUYXJnZXRzID0gX2NvbmNyZXRlVGFyZ2V0czsKICAgIEFic3RyYWN0VmFsdWUgdHlwZU1hc2sgPSBjb21wdXRlVHlwZWRTZWxlY3RvcihpbmZlcnJlcik7CiAgICBpbmZlcnJlci51cGRhdGVTZWxlY3RvckluTWVtYmVyKAogICAgICAgIGNhbGxlciwgX2NhbGxUeXBlLCBfY2FsbCwgc2VsZWN0b3IsIHR5cGVNYXNrKTsKCiAgICBfaGFzQ2xvc3VyZUNhbGxUYXJnZXRzID0KICAgICAgICBjbG9zZWRXb3JsZC5pbmNsdWRlc0Nsb3N1cmVDYWxsKHNlbGVjdG9yLCB0eXBlTWFzayk7CiAgICBfY29uY3JldGVUYXJnZXRzID0gY2xvc2VkV29ybGQubG9jYXRlTWVtYmVycyhzZWxlY3RvciwgdHlwZU1hc2spOwoKICAgIC8vIFVwZGF0ZSB0aGUgY2FsbCBncmFwaCBpZiB0aGUgdGFyZ2V0cyBjb3VsZCBoYXZlIGNoYW5nZWQuCiAgICBpZiAoIWlkZW50aWNhbChfY29uY3JldGVUYXJnZXRzLCBvbGRUYXJnZXRzKSkgewogICAgICAvLyBBZGQgY2FsbHMgdG8gbmV3IHRhcmdldHMgdG8gdGhlIGdyYXBoLgogICAgICBfY29uY3JldGVUYXJnZXRzCiAgICAgICAgICAud2hlcmUoKHRhcmdldCkgPT4gIW9sZFRhcmdldHMuY29udGFpbnModGFyZ2V0KSkKICAgICAgICAgIC5mb3JFYWNoKChNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgICAgIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBjYWxsZWUgPQogICAgICAgICAgICBpbmZlcnJlci50eXBlcy5nZXRJbmZlcnJlZFR5cGVPZk1lbWJlcihlbGVtZW50KTsKICAgICAgICBjYWxsZWUuYWRkQ2FsbChjYWxsZXIsIF9jYWxsKTsKICAgICAgICBjYWxsZWUuYWRkVXNlcih0aGlzKTsKICAgICAgICBpbmZlcnJlci51cGRhdGVQYXJhbWV0ZXJBc3NpZ25tZW50cygKICAgICAgICAgICAgdGhpcywgZWxlbWVudCwgYXJndW1lbnRzLCBzZWxlY3RvciwgdHlwZU1hc2ssCiAgICAgICAgICAgIHJlbW92ZTogZmFsc2UsIGFkZFRvUXVldWU6IHRydWUpOwogICAgICB9KTsKCiAgICAgIC8vIFdhbGsgb3ZlciB0aGUgb2xkIHRhcmdldHMsIGFuZCByZW1vdmUgY2FsbHMgdGhhdCBjYW5ub3QgaGFwcGVuIGFueW1vcmUuCiAgICAgIG9sZFRhcmdldHMKICAgICAgICAgIC53aGVyZSgodGFyZ2V0KSA9PiAhX2NvbmNyZXRlVGFyZ2V0cy5jb250YWlucyh0YXJnZXQpKQogICAgICAgICAgLmZvckVhY2goKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICAgICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGNhbGxlZSA9CiAgICAgICAgICAgIGluZmVycmVyLnR5cGVzLmdldEluZmVycmVkVHlwZU9mTWVtYmVyKGVsZW1lbnQpOwogICAgICAgIGNhbGxlZS5yZW1vdmVDYWxsKGNhbGxlciwgX2NhbGwpOwogICAgICAgIGNhbGxlZS5yZW1vdmVVc2VyKHRoaXMpOwogICAgICAgIGluZmVycmVyLnVwZGF0ZVBhcmFtZXRlckFzc2lnbm1lbnRzKAogICAgICAgICAgICB0aGlzLCBlbGVtZW50LCBhcmd1bWVudHMsIHNlbGVjdG9yLCB0eXBlTWFzaywKICAgICAgICAgICAgcmVtb3ZlOiB0cnVlLCBhZGRUb1F1ZXVlOiB0cnVlKTsKICAgICAgfSk7CiAgICB9CgogICAgLy8gV2FsayBvdmVyIHRoZSBmb3VuZCB0YXJnZXRzLCBhbmQgY29tcHV0ZSB0aGUgam9pbmVkIHVuaW9uIHR5cGUgbWFzawogICAgLy8gZm9yIGFsbCB0aGVzZSB0YXJnZXRzLgogICAgQWJzdHJhY3RWYWx1ZSByZXN1bHQ7CiAgICBpZiAoX2hhc0Nsb3N1cmVDYWxsVGFyZ2V0cykgewogICAgICByZXN1bHQgPSBhYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0ID0gaW5mZXJyZXIudHlwZXMKICAgICAgICAgIC5qb2luVHlwZU1hc2tzKF9jb25jcmV0ZVRhcmdldHMubWFwKChNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgICAgIGlmIChpbmZlcnJlci5yZXR1cm5zTGlzdEVsZW1lbnRUeXBlKHNlbGVjdG9yLCB0eXBlTWFzaykpIHsKICAgICAgICAgIHJldHVybiBhYnN0cmFjdFZhbHVlRG9tYWluLmdldENvbnRhaW5lckVsZW1lbnRUeXBlKHJlY2VpdmVyLnR5cGUpOwogICAgICAgIH0gZWxzZSBpZiAoaW5mZXJyZXIucmV0dXJuc01hcFZhbHVlVHlwZShzZWxlY3RvciwgdHlwZU1hc2spKSB7CiAgICAgICAgICBpZiAoYWJzdHJhY3RWYWx1ZURvbWFpbi5pc0RpY3Rpb25hcnkodHlwZU1hc2spKSB7CiAgICAgICAgICAgIEFic3RyYWN0VmFsdWUgYXJnID0gYXJndW1lbnRzLnBvc2l0aW9uYWxbMF0udHlwZTsKICAgICAgICAgICAgQ29uc3RhbnRWYWx1ZSB2YWx1ZSA9IGFic3RyYWN0VmFsdWVEb21haW4uZ2V0UHJpbWl0aXZlVmFsdWUoYXJnKTsKICAgICAgICAgICAgaWYgKHZhbHVlIGlzIFN0cmluZ0NvbnN0YW50VmFsdWUpIHsKICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gdmFsdWUuc3RyaW5nVmFsdWU7CiAgICAgICAgICAgICAgaWYgKGFic3RyYWN0VmFsdWVEb21haW4uY29udGFpbnNEaWN0aW9uYXJ5S2V5KHR5cGVNYXNrLCBrZXkpKSB7CiAgICAgICAgICAgICAgICBpZiAoZGVidWcuVkVSQk9TRSkgewogICAgICAgICAgICAgICAgICBwcmludCgiRGljdGlvbmFyeSBsb29rdXAgZm9yICRrZXkgeWllbGRzICIKICAgICAgICAgICAgICAgICAgICAgICIke2Fic3RyYWN0VmFsdWVEb21haW4uZ2V0RGljdGlvbmFyeVZhbHVlRm9yS2V5KHR5cGVNYXNrLCBrZXkpfS4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBhYnN0cmFjdFZhbHVlRG9tYWluLmdldERpY3Rpb25hcnlWYWx1ZUZvcktleSgKICAgICAgICAgICAgICAgICAgICB0eXBlTWFzaywga2V5KTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gVGhlIHR5cGVNYXAgaXMgcHJlY2lzZSwgc28gaWYgd2UgZG8gbm90IGZpbmQgdGhlIGtleSwgdGhlCiAgICAgICAgICAgICAgICAvLyBsb29rdXAgd2lsbCBiZSBbbnVsbF0gYXQgcnVudGltZS4KICAgICAgICAgICAgICAgIGlmIChkZWJ1Zy5WRVJCT1NFKSB7CiAgICAgICAgICAgICAgICAgIHByaW50KCJEaWN0aW9uYXJ5IGxvb2t1cCBmb3IgJGtleSB5aWVsZHMgW251bGxdLiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGluZmVycmVyLnR5cGVzLm51bGxUeXBlLnR5cGU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBhc3NlcnQoYWJzdHJhY3RWYWx1ZURvbWFpbi5pc01hcCh0eXBlTWFzaykpOwogICAgICAgICAgaWYgKGRlYnVnLlZFUkJPU0UpIHsKICAgICAgICAgICAgcHJpbnQoIk1hcCBsb29rdXAgZm9yICRzZWxlY3RvciB5aWVsZHMgIgogICAgICAgICAgICAgICAgIiR7YWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRNYXBWYWx1ZVR5cGUodHlwZU1hc2spfS4iKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBhYnN0cmFjdFZhbHVlRG9tYWluLmdldE1hcFZhbHVlVHlwZSh0eXBlTWFzayk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIFR5cGVJbmZvcm1hdGlvbiBpbmZvID0KICAgICAgICAgICAgICBoYW5kbGVJbnRyaXNpZmllZFNlbGVjdG9yKHNlbGVjdG9yLCB0eXBlTWFzaywgaW5mZXJyZXIpOwogICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgcmV0dXJuIGluZm8udHlwZTsKICAgICAgICAgIHJldHVybiBpbmZlcnJlci50eXBlT2ZNZW1iZXJXaXRoU2VsZWN0b3IoZWxlbWVudCwgc2VsZWN0b3IpLnR5cGU7CiAgICAgICAgfQogICAgICB9KSk7CiAgICB9CiAgICBpZiAoaXNDb25kaXRpb25hbCAmJgogICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uaXNOdWxsKHJlY2VpdmVyLnR5cGUpLmlzUG90ZW50aWFsbHlUcnVlKSB7CiAgICAgIC8vIENvbmRpdGlvbmFsIGNhbGwgc2l0ZXMgKGUuZy4gYGE/LmJgKSBtYXkgYmUgbnVsbCBpZiB0aGUgcmVjZWl2ZXIgaXMKICAgICAgLy8gbnVsbC4KICAgICAgcmVzdWx0ID0gYWJzdHJhY3RWYWx1ZURvbWFpbi5pbmNsdWRlTnVsbChyZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZ2l2ZVVwKEluZmVycmVyRW5naW5lIGluZmVycmVyLCB7Ym9vbCBjbGVhckFzc2lnbm1lbnRzOiB0cnVlfSkgewogICAgaWYgKCFhYmFuZG9uSW5mZXJlbmNpbmcpIHsKICAgICAgaW5mZXJyZXIudXBkYXRlU2VsZWN0b3JJbk1lbWJlcihjYWxsZXIsIF9jYWxsVHlwZSwgX2NhbGwsIHNlbGVjdG9yLCBtYXNrKTsKICAgICAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBvbGRUYXJnZXRzID0gX2NvbmNyZXRlVGFyZ2V0czsKICAgICAgX2hhc0Nsb3N1cmVDYWxsVGFyZ2V0cyA9CiAgICAgICAgICBpbmZlcnJlci5jbG9zZWRXb3JsZC5pbmNsdWRlc0Nsb3N1cmVDYWxsKHNlbGVjdG9yLCBtYXNrKTsKICAgICAgX2NvbmNyZXRlVGFyZ2V0cyA9IGluZmVycmVyLmNsb3NlZFdvcmxkLmxvY2F0ZU1lbWJlcnMoc2VsZWN0b3IsIG1hc2spOwogICAgICBmb3IgKE1lbWJlckVudGl0eSBlbGVtZW50IGluIF9jb25jcmV0ZVRhcmdldHMpIHsKICAgICAgICBpZiAoIW9sZFRhcmdldHMuY29udGFpbnMoZWxlbWVudCkpIHsKICAgICAgICAgIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBjYWxsZWUgPQogICAgICAgICAgICAgIGluZmVycmVyLnR5cGVzLmdldEluZmVycmVkVHlwZU9mTWVtYmVyKGVsZW1lbnQpOwogICAgICAgICAgY2FsbGVlLmFkZENhbGwoY2FsbGVyLCBfY2FsbCk7CiAgICAgICAgICBpbmZlcnJlci51cGRhdGVQYXJhbWV0ZXJBc3NpZ25tZW50cygKICAgICAgICAgICAgICB0aGlzLCBlbGVtZW50LCBhcmd1bWVudHMsIHNlbGVjdG9yLCBtYXNrLAogICAgICAgICAgICAgIHJlbW92ZTogZmFsc2UsIGFkZFRvUXVldWU6IHRydWUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgc3VwZXIuZ2l2ZVVwKGluZmVycmVyLCBjbGVhckFzc2lnbm1lbnRzOiBjbGVhckFzc2lnbm1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVtb3ZlQW5kQ2xlYXJSZWZlcmVuY2VzKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICBmb3IgKE1lbWJlckVudGl0eSBlbGVtZW50IGluIF9jb25jcmV0ZVRhcmdldHMpIHsKICAgICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGNhbGxlZSA9CiAgICAgICAgICBpbmZlcnJlci50eXBlcy5nZXRJbmZlcnJlZFR5cGVPZk1lbWJlcihlbGVtZW50KTsKICAgICAgY2FsbGVlLnJlbW92ZVVzZXIodGhpcyk7CiAgICB9CiAgICBpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgYXJndW1lbnRzLmZvckVhY2goKGluZm8pID0+IGluZm8ucmVtb3ZlVXNlcih0aGlzKSk7CiAgICB9CiAgICBzdXBlci5yZW1vdmVBbmRDbGVhclJlZmVyZW5jZXMoaW5mZXJyZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0NhbGwgc2l0ZSAkZGVidWdOYW1lIG9uICR7cmVjZWl2ZXIudHlwZX0gJHR5cGUnOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoVHlwZUluZm9ybWF0aW9uVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdER5bmFtaWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaGFzU3RhYmxlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgcmV0dXJuIHJlY2VpdmVyLmlzU3RhYmxlICYmCiAgICAgICAgX2NvbmNyZXRlVGFyZ2V0cy5ldmVyeSgoTWVtYmVyRW50aXR5IGVsZW1lbnQpID0+CiAgICAgICAgICAgIGluZmVycmVyLnR5cGVzLmdldEluZmVycmVkVHlwZU9mTWVtYmVyKGVsZW1lbnQpLmlzU3RhYmxlKSAmJgogICAgICAgIChhcmd1bWVudHMgPT0gbnVsbCB8fCBhcmd1bWVudHMuZXZlcnkoKGluZm8pID0+IGluZm8uaXNTdGFibGUpKSAmJgogICAgICAgIHN1cGVyLmhhc1N0YWJsZVR5cGUoaW5mZXJyZXIpOwogIH0KfQoKY2xhc3MgQ2xvc3VyZUNhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGV4dGVuZHMgQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24gewogIGZpbmFsIFR5cGVJbmZvcm1hdGlvbiBjbG9zdXJlOwoKICBDbG9zdXJlQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24oCiAgICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwKICAgICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGNvbnRleHQsCiAgICAgIE9iamVjdCBjYWxsLAogICAgICBNZW1iZXJFbnRpdHkgZW5jbG9zaW5nLAogICAgICBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrLAogICAgICB0aGlzLmNsb3N1cmUsCiAgICAgIEFyZ3VtZW50c1R5cGVzIGFyZ3VtZW50cywKICAgICAgYm9vbCBpbkxvb3ApCiAgICAgIDogc3VwZXIoYWJzdHJhY3RWYWx1ZURvbWFpbiwgY29udGV4dCwgY2FsbCwgZW5jbG9zaW5nLCBzZWxlY3RvciwgbWFzaywKICAgICAgICAgICAgYXJndW1lbnRzLCBpbkxvb3ApOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZFRvR3JhcGgoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIGFyZ3VtZW50cy5mb3JFYWNoKChpbmZvKSA9PiBpbmZvLmFkZFVzZXIodGhpcykpOwogICAgY2xvc3VyZS5hZGRVc2VyKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgPT4gc2FmZVR5cGUoaW5mZXJyZXIpOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IGdldCBjYWxsZWVzIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgY29tcHV0ZSBjYWxsZWVzIG9mIGEgY2xvc3VyZSBjYWxsLiIpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0Nsb3N1cmUgY2FsbCAkZGVidWdOYW1lIG9uICRjbG9zdXJlJzsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KFR5cGVJbmZvcm1hdGlvblZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRDbG9zdXJlQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlbW92ZUFuZENsZWFyUmVmZXJlbmNlcyhJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgLy8gVGhpcyBtZXRob2QgaXMgYSBwbGFjZWhvbGRlciBmb3IgdGhlIGZvbGxvd2luZyBjb21tZW50OgogICAgLy8gV2Ugc2hvdWxkIG1haW50YWluIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBjbG9zdXJlIGlzIGEgdXNlcgogICAgLy8gb2YgaXRzIGFyZ3VtZW50cyBiZWNhdXNlIHdlIGRvIG5vdCBjaGVjayB0aGF0IHRoZSBhcmd1bWVudHMKICAgIC8vIGhhdmUgYSBzdGFibGUgdHlwZSBmb3IgYSBjbG9zdXJlIGNhbGwgdG8gYmUgc3RhYmxlOyBvdXIgdHJhY2luZwogICAgLy8gYW5hbHlzaXMgd2FudCB0byBrbm93IHdoZXRoZXIgYW4gKG5vbi1zdGFibGUpIGFyZ3VtZW50IGlzCiAgICAvLyBwYXNzZWQgdG8gYSBjbG9zdXJlLgogICAgcmV0dXJuIHN1cGVyLnJlbW92ZUFuZENsZWFyUmVmZXJlbmNlcyhpbmZlcnJlcik7CiAgfQp9CgovLy8gQSBbQ29uY3JldGVUeXBlSW5mb3JtYXRpb25dIHJlcHJlc2VudHMgYSB0eXBlIHRoYXQgbmVlZGVkCi8vLyB0byBiZSBtYXRlcmlhbGl6ZWQgZHVyaW5nIHRoZSBjcmVhdGlvbiBvZiB0aGUgZ3JhcGguIEZvciBleGFtcGxlLAovLy8gbGl0ZXJhbHMsIFs6dGhpczpdIG9yIFs6c3VwZXI6XSBuZWVkIGEgW0NvbmNyZXRlVHlwZUluZm9ybWF0aW9uXS4KLy8vCi8vLyBbQ29uY3JldGVUeXBlSW5mb3JtYXRpb25dIG5vZGVzIGhhdmUgbm8gYXNzaWdubWVudC4gQWxzbywgdG8gc2F2ZQovLy8gb24gbWVtb3J5LCB3ZSBkbyBub3QgYWRkIHVzZXJzIHRvIFtDb25jcmV0ZVR5cGVJbmZvcm1hdGlvbl0gbm9kZXMsCi8vLyBiZWNhdXNlIHdlIGtub3cgc3VjaCBub2RlIHdpbGwgbmV2ZXIgYmUgcmVmaW5lZCB0byBhIGRpZmZlcmVudAovLy8gdHlwZS4KY2xhc3MgQ29uY3JldGVUeXBlSW5mb3JtYXRpb24gZXh0ZW5kcyBUeXBlSW5mb3JtYXRpb24gewogIENvbmNyZXRlVHlwZUluZm9ybWF0aW9uKEFic3RyYWN0VmFsdWUgdHlwZSkgOiBzdXBlci51bnRyYWNrZWQodHlwZSkgewogICAgdGhpcy5pc1N0YWJsZSA9IHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0NvbmNyZXRlID0+IHRydWU7CgogIEBvdmVycmlkZQogIHZvaWQgYWRkVXNlcihUeXBlSW5mb3JtYXRpb24gdXNlcikgewogICAgLy8gTm90aGluZyB0byBkbywgYSBjb25jcmV0ZSB0eXBlIGRvZXMgbm90IGdldCB1cGRhdGVkIHNvIG5ldmVyCiAgICAvLyBuZWVkcyB0byBub3RpZnkgaXRzIHVzZXJzLgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRVc2Vyc09mKFR5cGVJbmZvcm1hdGlvbiBvdGhlcikgewogICAgLy8gTm90aGluZyB0byBkbywgYSBjb25jcmV0ZSB0eXBlIGRvZXMgbm90IGdldCB1cGRhdGVkIHNvIG5ldmVyCiAgICAvLyBuZWVkcyB0byBub3RpZnkgaXRzIHVzZXJzLgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZW1vdmVVc2VyKFR5cGVJbmZvcm1hdGlvbiB1c2VyKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZEFzc2lnbm1lbnQoVHlwZUluZm9ybWF0aW9uIGFzc2lnbm1lbnQpIHsKICAgIHRocm93ICJOb3Qgc3VwcG9ydGVkIjsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVtb3ZlQXNzaWdubWVudChUeXBlSW5mb3JtYXRpb24gYXNzaWdubWVudCkgewogICAgdGhyb3cgIk5vdCBzdXBwb3J0ZWQiOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgPT4gdHlwZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCByZXNldChJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgdGhyb3cgIk5vdCBzdXBwb3J0ZWQiOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1R5cGUgJHR5cGUnOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoVHlwZUluZm9ybWF0aW9uVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdENvbmNyZXRlVHlwZUluZm9ybWF0aW9uKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNTdGFibGVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKSA9PiB0cnVlOwp9CgpjbGFzcyBTdHJpbmdMaXRlcmFsVHlwZUluZm9ybWF0aW9uIGV4dGVuZHMgQ29uY3JldGVUeXBlSW5mb3JtYXRpb24gewogIGZpbmFsIFN0cmluZyB2YWx1ZTsKCiAgU3RyaW5nTGl0ZXJhbFR5cGVJbmZvcm1hdGlvbigKICAgICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluLCB0aGlzLnZhbHVlLCBBYnN0cmFjdFZhbHVlIG1hc2spCiAgICAgIDogc3VwZXIoYWJzdHJhY3RWYWx1ZURvbWFpbi5jcmVhdGVQcmltaXRpdmVWYWx1ZSgKICAgICAgICAgICAgbWFzaywgbmV3IFN0cmluZ0NvbnN0YW50VmFsdWUodmFsdWUpKSk7CgogIFN0cmluZyBhc1N0cmluZygpID0+IHZhbHVlOwogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdUeXBlICR0eXBlIHZhbHVlICR7dmFsdWV9JzsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KFR5cGVJbmZvcm1hdGlvblZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRTdHJpbmdMaXRlcmFsVHlwZUluZm9ybWF0aW9uKHRoaXMpOwogIH0KfQoKY2xhc3MgQm9vbExpdGVyYWxUeXBlSW5mb3JtYXRpb24gZXh0ZW5kcyBDb25jcmV0ZVR5cGVJbmZvcm1hdGlvbiB7CiAgZmluYWwgYm9vbCB2YWx1ZTsKCiAgQm9vbExpdGVyYWxUeXBlSW5mb3JtYXRpb24oCiAgICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwgdGhpcy52YWx1ZSwgQWJzdHJhY3RWYWx1ZSBtYXNrKQogICAgICA6IHN1cGVyKGFic3RyYWN0VmFsdWVEb21haW4uY3JlYXRlUHJpbWl0aXZlVmFsdWUoCiAgICAgICAgICAgIG1hc2ssIHZhbHVlID8gbmV3IFRydWVDb25zdGFudFZhbHVlKCkgOiBuZXcgRmFsc2VDb25zdGFudFZhbHVlKCkpKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1R5cGUgJHR5cGUgdmFsdWUgJHt2YWx1ZX0nOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoVHlwZUluZm9ybWF0aW9uVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEJvb2xMaXRlcmFsVHlwZUluZm9ybWF0aW9uKHRoaXMpOwogIH0KfQoKLy8vIEEgW05hcnJvd1R5cGVJbmZvcm1hdGlvbl0gbmFycm93cyBhIFtUeXBlSW5mb3JtYXRpb25dIHRvIGEgdHlwZSwKLy8vIHJlcHJlc2VudGVkIGluIFt0eXBlQW5ub3RhdGlvbl0uCi8vLwovLy8gQSBbTmFycm93VHlwZUluZm9ybWF0aW9uXSBub2RlIGhhcyBvbmx5IG9uZSBhc3NpZ25tZW50OiB0aGUKLy8vIFtUeXBlSW5mb3JtYXRpb25dIGl0IG5hcnJvd3MuCi8vLwovLy8gW05hcnJvd1R5cGVJbmZvcm1hdGlvbl0gbm9kZXMgYXJlIGNyZWF0ZWQgZm9yOgovLy8KLy8vIC0gQ29kZSBhZnRlciBgaXNgIGFuZCBgYXNgIGNoZWNrcywgd2hlcmUgd2UgaGF2ZSBtb3JlIGluZm9ybWF0aW9uCi8vLyAgIG9uIHRoZSB0eXBlIG9mIHRoZSByaWdodCBoYW5kIHNpZGUgb2YgdGhlIGV4cHJlc3Npb24uCi8vLwovLy8gLSBDb2RlIGFmdGVyIGEgZHluYW1pYyBjYWxsLCB3aGVyZSB3ZSBoYXZlIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlCi8vLyAgIHR5cGUgb2YgdGhlIHJlY2VpdmVyOiBpdCBjYW4gb25seSBiZSBvZiBhIGNsYXNzIHRoYXQgaG9sZHMgYQovLy8gICBwb3RlbnRpYWwgdGFyZ2V0IG9mIHRoaXMgZHluYW1pYyBjYWxsLgovLy8KLy8vIC0gSW4gY2hlY2tlZCBtb2RlLCBhZnRlciBhIHR5cGUgYW5ub3RhdGlvbiwgd2UgaGF2ZSBtb3JlCi8vLyAgIGluZm9ybWF0aW9uIG9uIHRoZSB0eXBlIG9mIGEgbG9jYWwuCmNsYXNzIE5hcnJvd1R5cGVJbmZvcm1hdGlvbiBleHRlbmRzIFR5cGVJbmZvcm1hdGlvbiB7CiAgZmluYWwgQWJzdHJhY3RWYWx1ZSB0eXBlQW5ub3RhdGlvbjsKCiAgTmFycm93VHlwZUluZm9ybWF0aW9uKEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwKICAgICAgVHlwZUluZm9ybWF0aW9uIG5hcnJvd2VkVHlwZSwgdGhpcy50eXBlQW5ub3RhdGlvbikKICAgICAgOiBzdXBlcihhYnN0cmFjdFZhbHVlRG9tYWluLmVtcHR5VHlwZSwgbmFycm93ZWRUeXBlLmNvbnRleHQpIHsKICAgIGFkZEFzc2lnbm1lbnQobmFycm93ZWRUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIGFkZEFzc2lnbm1lbnQoVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIHN1cGVyLmFkZEFzc2lnbm1lbnQoaW5mbyk7CiAgICBhc3NlcnQoYXNzaWdubWVudHMubGVuZ3RoID09IDEpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluID0gaW5mZXJyZXIuYWJzdHJhY3RWYWx1ZURvbWFpbjsKICAgIEFic3RyYWN0VmFsdWUgaW5wdXQgPSBhc3NpZ25tZW50cy5maXJzdC50eXBlOwogICAgQWJzdHJhY3RWYWx1ZSBpbnRlcnNlY3Rpb24gPQogICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uaW50ZXJzZWN0aW9uKGlucHV0LCB0eXBlQW5ub3RhdGlvbik7CiAgICBpZiAoZGVidWcuQU5PTUFMWV9XQVJOKSB7CiAgICAgIGlmIChhYnN0cmFjdFZhbHVlRG9tYWluLmNvbnRhaW5zKGlucHV0LCBpbnRlcnNlY3Rpb24pLmlzRGVmaW5pdGVseUZhbHNlIHx8CiAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgICAgICAgLmNvbnRhaW5zKHR5cGVBbm5vdGF0aW9uLCBpbnRlcnNlY3Rpb24pCiAgICAgICAgICAgICAgLmlzRGVmaW5pdGVseUZhbHNlKSB7CiAgICAgICAgcHJpbnQoIkFOT01BTFkgV0FSTklORzogbmFycm93ZWQgJGlucHV0IHRvICRpbnRlcnNlY3Rpb24gdmlhICIKICAgICAgICAgICAgIiR0eXBlQW5ub3RhdGlvbiIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaW50ZXJzZWN0aW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICdOYXJyb3cgdG8gJHR5cGVBbm5vdGF0aW9uICR0eXBlJzsKICB9CgogIEBvdmVycmlkZQogIGFjY2VwdChUeXBlSW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TmFycm93VHlwZUluZm9ybWF0aW9uKHRoaXMpOwogIH0KfQoKLy8vIEFuIFtJbmZlcnJlZFR5cGVJbmZvcm1hdGlvbl0gaXMgYSBbVHlwZUluZm9ybWF0aW9uXSB0aGF0Ci8vLyBkZWZhdWx0cyB0byB0aGUgZHluYW1pYyB0eXBlIHVudGlsIGl0IGlzIG1hcmtlZCBhcyBiZWluZwovLy8gaW5mZXJyZWQsIGF0IHdoaWNoIHBvaW50IGl0IGNvbXB1dGVzIGl0cyB0eXBlIGJhc2VkIG9uCi8vLyBpdHMgYXNzaWdubWVudHMuCmFic3RyYWN0IGNsYXNzIEluZmVycmVkVHlwZUluZm9ybWF0aW9uIGV4dGVuZHMgVHlwZUluZm9ybWF0aW9uIHsKICAvLy8gV2hldGhlciB0aGUgZWxlbWVudCB0eXBlIGluIHRoYXQgY29udGFpbmVyIGhhcyBiZWVuIGluZmVycmVkLgogIGJvb2wgaW5mZXJyZWQgPSBmYWxzZTsKCiAgSW5mZXJyZWRUeXBlSW5mb3JtYXRpb24oQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICBNZW1iZXJUeXBlSW5mb3JtYXRpb24gY29udGV4dCwgVHlwZUluZm9ybWF0aW9uIHBhcmVudFR5cGUpCiAgICAgIDogc3VwZXIoYWJzdHJhY3RWYWx1ZURvbWFpbi5lbXB0eVR5cGUsIGNvbnRleHQpIHsKICAgIGlmIChwYXJlbnRUeXBlICE9IG51bGwpIGFkZEFzc2lnbm1lbnQocGFyZW50VHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICBpZiAoIWluZmVycmVkKSByZXR1cm4gc2FmZVR5cGUoaW5mZXJyZXIpOwogICAgcmV0dXJuIGluZmVycmVyLnR5cGVzLmNvbXB1dGVUeXBlTWFzayhhc3NpZ25tZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGhhc1N0YWJsZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIHJldHVybiBpbmZlcnJlZCAmJiBzdXBlci5oYXNTdGFibGVUeXBlKGluZmVycmVyKTsKICB9Cn0KCi8vLyBBIFtMaXN0VHlwZUluZm9ybWF0aW9uXSBpcyBhIFtUeXBlSW5mb3JtYXRpb25dIGNyZWF0ZWQKLy8vIGZvciBlYWNoIGBMaXN0YCBpbnN0YW50aWF0aW9ucy4KY2xhc3MgTGlzdFR5cGVJbmZvcm1hdGlvbiBleHRlbmRzIFR5cGVJbmZvcm1hdGlvbiB3aXRoIFRyYWNlZFR5cGVJbmZvcm1hdGlvbiB7CiAgZmluYWwgRWxlbWVudEluQ29udGFpbmVyVHlwZUluZm9ybWF0aW9uIGVsZW1lbnRUeXBlOwoKICAvLy8gVGhlIGNvbnRhaW5lciB0eXBlIGJlZm9yZSBpdCBpcyBpbmZlcnJlZC4KICBmaW5hbCBBYnN0cmFjdFZhbHVlIG9yaWdpbmFsVHlwZTsKCiAgLy8vIFRoZSBsZW5ndGggYXQgdGhlIGFsbG9jYXRpb24gc2l0ZS4KICBmaW5hbCBpbnQgb3JpZ2luYWxMZW5ndGg7CgogIC8vLyBUaGUgbGVuZ3RoIGFmdGVyIHRoZSBjb250YWluZXIgaGFzIGJlZW4gdHJhY2VkLgogIGludCBpbmZlcnJlZExlbmd0aDsKCiAgLy8vIFdoZXRoZXIgdGhpcyBsaXN0IGdvZXMgdGhyb3VnaCBhIGdyb3dhYmxlIGNoZWNrLgogIC8vLyBXZSBjb25zZXJ2YXRpdmVseSBhc3N1bWUgaXQgZG9lcy4KICBib29sIGNoZWNrc0dyb3dhYmxlID0gdHJ1ZTsKCiAgTGlzdFR5cGVJbmZvcm1hdGlvbigKICAgICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICBNZW1iZXJUeXBlSW5mb3JtYXRpb24gY29udGV4dCwKICAgICAgdGhpcy5vcmlnaW5hbFR5cGUsCiAgICAgIHRoaXMuZWxlbWVudFR5cGUsCiAgICAgIHRoaXMub3JpZ2luYWxMZW5ndGgpCiAgICAgIDogc3VwZXIob3JpZ2luYWxUeXBlLCBjb250ZXh0KSB7CiAgICBpbmZlcnJlZExlbmd0aCA9IGFic3RyYWN0VmFsdWVEb21haW4uZ2V0Q29udGFpbmVyTGVuZ3RoKG9yaWdpbmFsVHlwZSk7CiAgICBlbGVtZW50VHlwZS5hZGRVc2VyKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0xpc3QgdHlwZSAkdHlwZSc7CgogIEBvdmVycmlkZQogIGFjY2VwdChUeXBlSW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TGlzdFR5cGVJbmZvcm1hdGlvbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaGFzU3RhYmxlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgcmV0dXJuIGVsZW1lbnRUeXBlLmlzU3RhYmxlICYmIHN1cGVyLmhhc1N0YWJsZVR5cGUoaW5mZXJyZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluID0gaW5mZXJyZXIuYWJzdHJhY3RWYWx1ZURvbWFpbjsKICAgIEFic3RyYWN0VmFsdWUgbWFzayA9IHR5cGU7CiAgICBpZiAoIWFic3RyYWN0VmFsdWVEb21haW4uaXNDb250YWluZXIodHlwZSkgfHwKICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmdldENvbnRhaW5lckVsZW1lbnRUeXBlKHR5cGUpICE9IGVsZW1lbnRUeXBlLnR5cGUgfHwKICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmdldENvbnRhaW5lckxlbmd0aCh0eXBlKSAhPSBpbmZlcnJlZExlbmd0aCkgewogICAgICByZXR1cm4gYWJzdHJhY3RWYWx1ZURvbWFpbi5jcmVhdGVDb250YWluZXJWYWx1ZSgKICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uZ2V0R2VuZXJhbGl6YXRpb24ob3JpZ2luYWxUeXBlKSwKICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uZ2V0QWxsb2NhdGlvbk5vZGUob3JpZ2luYWxUeXBlKSwKICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uZ2V0QWxsb2NhdGlvbkVsZW1lbnQob3JpZ2luYWxUeXBlKSwKICAgICAgICAgIGVsZW1lbnRUeXBlLnR5cGUsCiAgICAgICAgICBpbmZlcnJlZExlbmd0aCk7CiAgICB9CiAgICByZXR1cm4gbWFzazsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgc2FmZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpID0+IG9yaWdpbmFsVHlwZTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBjbGVhbnVwKCkgewogICAgc3VwZXIuY2xlYW51cCgpOwogICAgZWxlbWVudFR5cGUuY2xlYW51cCgpOwogICAgX2Zsb3dzSW50byA9IG51bGw7CiAgfQp9CgovLy8gQW4gW0VsZW1lbnRJbkNvbnRhaW5lclR5cGVJbmZvcm1hdGlvbl0gaG9sZHMgdGhlIGNvbW1vbiB0eXBlIG9mIHRoZQovLy8gZWxlbWVudHMgaW4gYSBbTGlzdFR5cGVJbmZvcm1hdGlvbl0uCmNsYXNzIEVsZW1lbnRJbkNvbnRhaW5lclR5cGVJbmZvcm1hdGlvbiBleHRlbmRzIEluZmVycmVkVHlwZUluZm9ybWF0aW9uIHsKICBFbGVtZW50SW5Db250YWluZXJUeXBlSW5mb3JtYXRpb24oQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICBNZW1iZXJUeXBlSW5mb3JtYXRpb24gY29udGV4dCwgZWxlbWVudFR5cGUpCiAgICAgIDogc3VwZXIoYWJzdHJhY3RWYWx1ZURvbWFpbiwgY29udGV4dCwgZWxlbWVudFR5cGUpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnRWxlbWVudCBpbiBjb250YWluZXIgJHR5cGUnOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoVHlwZUluZm9ybWF0aW9uVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEVsZW1lbnRJbkNvbnRhaW5lclR5cGVJbmZvcm1hdGlvbih0aGlzKTsKICB9Cn0KCi8vLyBBIFtTZXRUeXBlSW5mb3JtYXRpb25dIGlzIGEgW1R5cGVJbmZvcm1hdGlvbl0gY3JlYXRlZCBmb3Igc2V0cy4KY2xhc3MgU2V0VHlwZUluZm9ybWF0aW9uIGV4dGVuZHMgVHlwZUluZm9ybWF0aW9uIHdpdGggVHJhY2VkVHlwZUluZm9ybWF0aW9uIHsKICBmaW5hbCBFbGVtZW50SW5TZXRUeXBlSW5mb3JtYXRpb24gZWxlbWVudFR5cGU7CgogIGZpbmFsIEFic3RyYWN0VmFsdWUgb3JpZ2luYWxUeXBlOwoKICBTZXRUeXBlSW5mb3JtYXRpb24oCiAgICAgIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBjb250ZXh0LCB0aGlzLm9yaWdpbmFsVHlwZSwgdGhpcy5lbGVtZW50VHlwZSkKICAgICAgOiBzdXBlcihvcmlnaW5hbFR5cGUsIGNvbnRleHQpIHsKICAgIGVsZW1lbnRUeXBlLmFkZFVzZXIodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnU2V0IHR5cGUgJHR5cGUnOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoVHlwZUluZm9ybWF0aW9uVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFNldFR5cGVJbmZvcm1hdGlvbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiA9IGluZmVycmVyLmFic3RyYWN0VmFsdWVEb21haW47CiAgICBBYnN0cmFjdFZhbHVlIG1hc2sgPSB0eXBlOwogICAgaWYgKCFhYnN0cmFjdFZhbHVlRG9tYWluLmlzU2V0KHR5cGUpIHx8CiAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRTZXRFbGVtZW50VHlwZSh0eXBlKSAhPSBlbGVtZW50VHlwZS50eXBlKSB7CiAgICAgIHJldHVybiBhYnN0cmFjdFZhbHVlRG9tYWluLmNyZWF0ZVNldFZhbHVlKAogICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRHZW5lcmFsaXphdGlvbihvcmlnaW5hbFR5cGUpLAogICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRBbGxvY2F0aW9uTm9kZShvcmlnaW5hbFR5cGUpLAogICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRBbGxvY2F0aW9uRWxlbWVudChvcmlnaW5hbFR5cGUpLAogICAgICAgICAgZWxlbWVudFR5cGUudHlwZSk7CiAgICB9CiAgICByZXR1cm4gbWFzazsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgc2FmZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpID0+IG9yaWdpbmFsVHlwZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNTdGFibGVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICByZXR1cm4gZWxlbWVudFR5cGUuaXNTdGFibGUgJiYgc3VwZXIuaGFzU3RhYmxlVHlwZShpbmZlcnJlcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNsZWFudXAoKSB7CiAgICBzdXBlci5jbGVhbnVwKCk7CiAgICBlbGVtZW50VHlwZS5jbGVhbnVwKCk7CiAgICBfZmxvd3NJbnRvID0gbnVsbDsKICB9Cn0KCi8vLyBBbiBbRWxlbWVudEluU2V0VHlwZUluZm9ybWF0aW9uXSBob2xkcyB0aGUgY29tbW9uIHR5cGUgb2YgdGhlIGVsZW1lbnRzIGluIGEKLy8vIFtTZXRUeXBlSW5mb3JtYXRpb25dLgpjbGFzcyBFbGVtZW50SW5TZXRUeXBlSW5mb3JtYXRpb24gZXh0ZW5kcyBJbmZlcnJlZFR5cGVJbmZvcm1hdGlvbiB7CiAgRWxlbWVudEluU2V0VHlwZUluZm9ybWF0aW9uKEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwKICAgICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGNvbnRleHQsIGVsZW1lbnRUeXBlKQogICAgICA6IHN1cGVyKGFic3RyYWN0VmFsdWVEb21haW4sIGNvbnRleHQsIGVsZW1lbnRUeXBlKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0VsZW1lbnQgaW4gc2V0ICR0eXBlJzsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KFR5cGVJbmZvcm1hdGlvblZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRFbGVtZW50SW5TZXRUeXBlSW5mb3JtYXRpb24odGhpcyk7CiAgfQp9CgovLy8gQSBbTWFwVHlwZUluZm9ybWF0aW9uXSBpcyBhIFtUeXBlSW5mb3JtYXRpb25dIGNyZWF0ZWQKLy8vIGZvciBtYXBzLgpjbGFzcyBNYXBUeXBlSW5mb3JtYXRpb24gZXh0ZW5kcyBUeXBlSW5mb3JtYXRpb24gd2l0aCBUcmFjZWRUeXBlSW5mb3JtYXRpb24gewogIC8vIFdoZW4gaW4gRGljdGlvbmFyeSBtb2RlLCB0aGlzIG1hcCB0cmFja3MgdGhlIHR5cGUgb2YgdGhlIHZhbHVlcyB0aGF0CiAgLy8gaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIGEgc3BlY2lmaWMgW1N0cmluZ10ga2V5LgogIGZpbmFsIE1hcDxTdHJpbmcsIFZhbHVlSW5NYXBUeXBlSW5mb3JtYXRpb24+IHR5cGVJbmZvTWFwID0ge307CiAgLy8gVGhlc2UgZmllbGRzIHRyYWNrIHRoZSBvdmVyYWxsIHR5cGUgb2YgdGhlIGtleXMvdmFsdWVzIGluIHRoZSBtYXAuCiAgZmluYWwgS2V5SW5NYXBUeXBlSW5mb3JtYXRpb24ga2V5VHlwZTsKICBmaW5hbCBWYWx1ZUluTWFwVHlwZUluZm9ybWF0aW9uIHZhbHVlVHlwZTsKICBmaW5hbCBBYnN0cmFjdFZhbHVlIG9yaWdpbmFsVHlwZTsKCiAgLy8gU2V0IHRvIGZhbHNlIGlmIGEgc3RhdGljYWxseSB1bmtub3duIGtleSBmbG93cyBpbnRvIHRoaXMgbWFwLgogIGJvb2wgX2FsbEtleXNBcmVTdHJpbmdzID0gdHJ1ZTsKCiAgYm9vbCBnZXQgaW5EaWN0aW9uYXJ5TW9kZSA9PiAhYmFpbGVkT3V0ICYmIF9hbGxLZXlzQXJlU3RyaW5nczsKCiAgTWFwVHlwZUluZm9ybWF0aW9uKE1lbWJlclR5cGVJbmZvcm1hdGlvbiBjb250ZXh0LCB0aGlzLm9yaWdpbmFsVHlwZSwKICAgICAgdGhpcy5rZXlUeXBlLCB0aGlzLnZhbHVlVHlwZSkKICAgICAgOiBzdXBlcihvcmlnaW5hbFR5cGUsIGNvbnRleHQpIHsKICAgIGtleVR5cGUuYWRkVXNlcih0aGlzKTsKICAgIHZhbHVlVHlwZS5hZGRVc2VyKHRoaXMpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGFkZEVudHJ5QXNzaWdubWVudChBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4sCiAgICAgIFR5cGVJbmZvcm1hdGlvbiBrZXksIFR5cGVJbmZvcm1hdGlvbiB2YWx1ZSwKICAgICAgW2Jvb2wgbm9uTnVsbCA9IGZhbHNlXSkgewogICAgVHlwZUluZm9ybWF0aW9uIG5ld0luZm8gPSBudWxsOwogICAgaWYgKF9hbGxLZXlzQXJlU3RyaW5ncyAmJiBrZXkgaXMgU3RyaW5nTGl0ZXJhbFR5cGVJbmZvcm1hdGlvbikgewogICAgICBTdHJpbmcga2V5U3RyaW5nID0ga2V5LmFzU3RyaW5nKCk7CiAgICAgIHR5cGVJbmZvTWFwLnB1dElmQWJzZW50KGtleVN0cmluZywgKCkgewogICAgICAgIG5ld0luZm8gPSBuZXcgVmFsdWVJbk1hcFR5cGVJbmZvcm1hdGlvbigKICAgICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbiwgY29udGV4dCwgbnVsbCwgbm9uTnVsbCk7CiAgICAgICAgcmV0dXJuIG5ld0luZm87CiAgICAgIH0pOwogICAgICB0eXBlSW5mb01hcFtrZXlTdHJpbmddLmFkZEFzc2lnbm1lbnQodmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgX2FsbEtleXNBcmVTdHJpbmdzID0gZmFsc2U7CiAgICAgIHR5cGVJbmZvTWFwLmNsZWFyKCk7CiAgICB9CiAgICBrZXlUeXBlLmFkZEFzc2lnbm1lbnQoa2V5KTsKICAgIHZhbHVlVHlwZS5hZGRBc3NpZ25tZW50KHZhbHVlKTsKICAgIGlmIChuZXdJbmZvICE9IG51bGwpIG5ld0luZm8uYWRkVXNlcih0aGlzKTsKCiAgICByZXR1cm4gbmV3SW5mbzsKICB9CgogIExpc3Q8VHlwZUluZm9ybWF0aW9uPiBhZGRNYXBBc3NpZ25tZW50KAogICAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4sIE1hcFR5cGVJbmZvcm1hdGlvbiBvdGhlcikgewogICAgTGlzdDxUeXBlSW5mb3JtYXRpb24+IG5ld0luZm9zID0gPFR5cGVJbmZvcm1hdGlvbj5bXTsKICAgIGlmIChfYWxsS2V5c0FyZVN0cmluZ3MgJiYgb3RoZXIuaW5EaWN0aW9uYXJ5TW9kZSkgewogICAgICBvdGhlci50eXBlSW5mb01hcC5mb3JFYWNoKChrZXlTdHJpbmcsIHZhbHVlKSB7CiAgICAgICAgdHlwZUluZm9NYXAucHV0SWZBYnNlbnQoa2V5U3RyaW5nLCAoKSB7CiAgICAgICAgICBUeXBlSW5mb3JtYXRpb24gbmV3SW5mbyA9IG5ldyBWYWx1ZUluTWFwVHlwZUluZm9ybWF0aW9uKAogICAgICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4sIGNvbnRleHQsIG51bGwsIGZhbHNlKTsKICAgICAgICAgIG5ld0luZm9zLmFkZChuZXdJbmZvKTsKICAgICAgICAgIHJldHVybiBuZXdJbmZvOwogICAgICAgIH0pOwogICAgICAgIHR5cGVJbmZvTWFwW2tleVN0cmluZ10uYWRkQXNzaWdubWVudCh2YWx1ZSk7CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgX2FsbEtleXNBcmVTdHJpbmdzID0gZmFsc2U7CiAgICAgIHR5cGVJbmZvTWFwLmNsZWFyKCk7CiAgICB9CiAgICBrZXlUeXBlLmFkZEFzc2lnbm1lbnQob3RoZXIua2V5VHlwZSk7CiAgICB2YWx1ZVR5cGUuYWRkQXNzaWdubWVudChvdGhlci52YWx1ZVR5cGUpOwoKICAgIHJldHVybiBuZXdJbmZvczsKICB9CgogIG1hcmtBc0luZmVycmVkKCkgewogICAga2V5VHlwZS5pbmZlcnJlZCA9IHZhbHVlVHlwZS5pbmZlcnJlZCA9IHRydWU7CiAgICB0eXBlSW5mb01hcC52YWx1ZXMuZm9yRWFjaCgodikgPT4gdi5pbmZlcnJlZCA9IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYWRkQXNzaWdubWVudChUeXBlSW5mb3JtYXRpb24gb3RoZXIpIHsKICAgIHRocm93ICJub3Qgc3VwcG9ydGVkIjsKICB9CgogIEBvdmVycmlkZQogIGFjY2VwdChUeXBlSW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TWFwVHlwZUluZm9ybWF0aW9uKHRoaXMpOwogIH0KCiAgQWJzdHJhY3RWYWx1ZSB0b1R5cGVNYXNrKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4gPSBpbmZlcnJlci5hYnN0cmFjdFZhbHVlRG9tYWluOwogICAgaWYgKGluRGljdGlvbmFyeU1vZGUpIHsKICAgICAgTWFwPFN0cmluZywgQWJzdHJhY3RWYWx1ZT4gbWFwcGluZ3MgPSBuZXcgTWFwPFN0cmluZywgQWJzdHJhY3RWYWx1ZT4oKTsKICAgICAgZm9yICh2YXIga2V5IGluIHR5cGVJbmZvTWFwLmtleXMpIHsKICAgICAgICBtYXBwaW5nc1trZXldID0gdHlwZUluZm9NYXBba2V5XS50eXBlOwogICAgICB9CiAgICAgIHJldHVybiBpbmZlcnJlci5hYnN0cmFjdFZhbHVlRG9tYWluLmNyZWF0ZURpY3Rpb25hcnlWYWx1ZSgKICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uZ2V0R2VuZXJhbGl6YXRpb24ob3JpZ2luYWxUeXBlKSwKICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uZ2V0QWxsb2NhdGlvbk5vZGUob3JpZ2luYWxUeXBlKSwKICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uZ2V0QWxsb2NhdGlvbkVsZW1lbnQob3JpZ2luYWxUeXBlKSwKICAgICAgICAgIGtleVR5cGUudHlwZSwKICAgICAgICAgIHZhbHVlVHlwZS50eXBlLAogICAgICAgICAgbWFwcGluZ3MpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGluZmVycmVyLmFic3RyYWN0VmFsdWVEb21haW4uY3JlYXRlTWFwVmFsdWUoCiAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmdldEdlbmVyYWxpemF0aW9uKG9yaWdpbmFsVHlwZSksCiAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmdldEFsbG9jYXRpb25Ob2RlKG9yaWdpbmFsVHlwZSksCiAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmdldEFsbG9jYXRpb25FbGVtZW50KG9yaWdpbmFsVHlwZSksCiAgICAgICAgICBrZXlUeXBlLnR5cGUsCiAgICAgICAgICB2YWx1ZVR5cGUudHlwZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4gPSBpbmZlcnJlci5hYnN0cmFjdFZhbHVlRG9tYWluOwogICAgaWYgKGFic3RyYWN0VmFsdWVEb21haW4uaXNEaWN0aW9uYXJ5KHR5cGUpICE9IGluRGljdGlvbmFyeU1vZGUpIHsKICAgICAgcmV0dXJuIHRvVHlwZU1hc2soaW5mZXJyZXIpOwogICAgfSBlbHNlIGlmIChhYnN0cmFjdFZhbHVlRG9tYWluLmlzRGljdGlvbmFyeSh0eXBlKSkgewogICAgICBhc3NlcnQoaW5EaWN0aW9uYXJ5TW9kZSk7CiAgICAgIGZvciAoU3RyaW5nIGtleSBpbiB0eXBlSW5mb01hcC5rZXlzKSB7CiAgICAgICAgVHlwZUluZm9ybWF0aW9uIHZhbHVlID0gdHlwZUluZm9NYXBba2V5XTsKICAgICAgICBpZiAoIWFic3RyYWN0VmFsdWVEb21haW4uY29udGFpbnNEaWN0aW9uYXJ5S2V5KHR5cGUsIGtleSkgJiYKICAgICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5jb250YWluc0FsbCh2YWx1ZS50eXBlKS5pc0RlZmluaXRlbHlGYWxzZSAmJgogICAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmlzTnVsbCh2YWx1ZS50eXBlKS5pc0RlZmluaXRlbHlGYWxzZSkgewogICAgICAgICAgcmV0dXJuIHRvVHlwZU1hc2soaW5mZXJyZXIpOwogICAgICAgIH0KICAgICAgICBpZiAoYWJzdHJhY3RWYWx1ZURvbWFpbi5nZXREaWN0aW9uYXJ5VmFsdWVGb3JLZXkodHlwZSwga2V5KSAhPQogICAgICAgICAgICB0eXBlSW5mb01hcFtrZXldLnR5cGUpIHsKICAgICAgICAgIHJldHVybiB0b1R5cGVNYXNrKGluZmVycmVyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoYWJzdHJhY3RWYWx1ZURvbWFpbi5pc01hcCh0eXBlKSkgewogICAgICBpZiAoYWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRNYXBLZXlUeXBlKHR5cGUpICE9IGtleVR5cGUudHlwZSB8fAogICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRNYXBWYWx1ZVR5cGUodHlwZSkgIT0gdmFsdWVUeXBlLnR5cGUpIHsKICAgICAgICByZXR1cm4gdG9UeXBlTWFzayhpbmZlcnJlcik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0b1R5cGVNYXNrKGluZmVycmVyKTsKICAgIH0KCiAgICByZXR1cm4gdHlwZTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgc2FmZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpID0+IG9yaWdpbmFsVHlwZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNTdGFibGVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICByZXR1cm4ga2V5VHlwZS5pc1N0YWJsZSAmJgogICAgICAgIHZhbHVlVHlwZS5pc1N0YWJsZSAmJgogICAgICAgIHN1cGVyLmhhc1N0YWJsZVR5cGUoaW5mZXJyZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjbGVhbnVwKCkgewogICAgc3VwZXIuY2xlYW51cCgpOwogICAga2V5VHlwZS5jbGVhbnVwKCk7CiAgICB2YWx1ZVR5cGUuY2xlYW51cCgpOwogICAgZm9yIChUeXBlSW5mb3JtYXRpb24gaW5mbyBpbiB0eXBlSW5mb01hcC52YWx1ZXMpIHsKICAgICAgaW5mby5jbGVhbnVwKCk7CiAgICB9CiAgICBfZmxvd3NJbnRvID0gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnTWFwICR0eXBlIChLOiRrZXlUeXBlLCBWOiR2YWx1ZVR5cGUpIGNvbnRlbnRzICR0eXBlSW5mb01hcCc7CiAgfQp9CgovLy8gQSBbS2V5SW5NYXBUeXBlSW5mb3JtYXRpb25dIGhvbGRzIHRoZSBjb21tb24gdHlwZQovLy8gZm9yIHRoZSBrZXlzIGluIGEgW01hcFR5cGVJbmZvcm1hdGlvbl0KY2xhc3MgS2V5SW5NYXBUeXBlSW5mb3JtYXRpb24gZXh0ZW5kcyBJbmZlcnJlZFR5cGVJbmZvcm1hdGlvbiB7CiAgS2V5SW5NYXBUeXBlSW5mb3JtYXRpb24oQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICBNZW1iZXJUeXBlSW5mb3JtYXRpb24gY29udGV4dCwgVHlwZUluZm9ybWF0aW9uIGtleVR5cGUpCiAgICAgIDogc3VwZXIoYWJzdHJhY3RWYWx1ZURvbWFpbiwgY29udGV4dCwga2V5VHlwZSk7CgogIEBvdmVycmlkZQogIGFjY2VwdChUeXBlSW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0S2V5SW5NYXBUeXBlSW5mb3JtYXRpb24odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnS2V5IGluIE1hcCAkdHlwZSc7Cn0KCi8vLyBBIFtWYWx1ZUluTWFwVHlwZUluZm9ybWF0aW9uXSBob2xkcyB0aGUgY29tbW9uIHR5cGUKLy8vIGZvciB0aGUgdmFsdWVzIGluIGEgW01hcFR5cGVJbmZvcm1hdGlvbl0KY2xhc3MgVmFsdWVJbk1hcFR5cGVJbmZvcm1hdGlvbiBleHRlbmRzIEluZmVycmVkVHlwZUluZm9ybWF0aW9uIHsKICAvLyBbbm9uTnVsbF0gaXMgc2V0IHRvIHRydWUgaWYgdGhpcyB2YWx1ZSBpcyBrbm93biB0byBiZSBwYXJ0IG9mIHRoZSBtYXAuCiAgLy8gTm90ZSB0aGF0IG9ubHkgdmFsdWVzIGFzc2lnbmVkIHRvIGEgc3BlY2lmaWMga2V5IHZhbHVlIGluIGRpY3Rpb25hcnkKICAvLyBtb2RlIGNhbiBldmVyIGJlIG1hcmtlZCBhcyBbbm9uTnVsbF0uCiAgZmluYWwgYm9vbCBub25OdWxsOwoKICBWYWx1ZUluTWFwVHlwZUluZm9ybWF0aW9uKEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwKICAgICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGNvbnRleHQsIFR5cGVJbmZvcm1hdGlvbiB2YWx1ZVR5cGUsCiAgICAgIFt0aGlzLm5vbk51bGwgPSBmYWxzZV0pCiAgICAgIDogc3VwZXIoYWJzdHJhY3RWYWx1ZURvbWFpbiwgY29udGV4dCwgdmFsdWVUeXBlKTsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KFR5cGVJbmZvcm1hdGlvblZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRWYWx1ZUluTWFwVHlwZUluZm9ybWF0aW9uKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgcmV0dXJuIG5vbk51bGwKICAgICAgICA/IHN1cGVyLmNvbXB1dGVUeXBlKGluZmVycmVyKQogICAgICAgIDogaW5mZXJyZXIuYWJzdHJhY3RWYWx1ZURvbWFpbi5pbmNsdWRlTnVsbChzdXBlci5jb21wdXRlVHlwZShpbmZlcnJlcikpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1ZhbHVlIGluIE1hcCAkdHlwZSc7Cn0KCi8vLyBBIFtQaGlFbGVtZW50VHlwZUluZm9ybWF0aW9uXSBpcyBhbiB1bmlvbiBvZgovLy8gW0VsZW1lbnRUeXBlSW5mb3JtYXRpb25dLCB0aGF0IGlzIGxvY2FsIHRvIGEgbWV0aG9kLgpjbGFzcyBQaGlFbGVtZW50VHlwZUluZm9ybWF0aW9uIGV4dGVuZHMgVHlwZUluZm9ybWF0aW9uIHsKICBmaW5hbCBpci5Ob2RlIGJyYW5jaE5vZGU7CiAgZmluYWwgTG9jYWwgdmFyaWFibGU7CiAgZmluYWwgYm9vbCBpc1RyeTsKCiAgUGhpRWxlbWVudFR5cGVJbmZvcm1hdGlvbihBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4sCiAgICAgIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBjb250ZXh0LCB0aGlzLmJyYW5jaE5vZGUsIHRoaXMudmFyaWFibGUsCiAgICAgIHt0aGlzLmlzVHJ5fSkKICAgICAgOiBzdXBlcihhYnN0cmFjdFZhbHVlRG9tYWluLmVtcHR5VHlwZSwgY29udGV4dCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIHJldHVybiBpbmZlcnJlci50eXBlcy5jb21wdXRlVHlwZU1hc2soYXNzaWdubWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1BoaSgkaGFzaENvZGUpICR2YXJpYWJsZSAkdHlwZSc7CgogIEBvdmVycmlkZQogIHZvaWQgX3RvU3RydWN0dXJlZFRleHQoCiAgICAgIFN0cmluZ0J1ZmZlciBzYiwgU3RyaW5nIGluZGVudCwgU2V0PFR5cGVJbmZvcm1hdGlvbj4gc2VlbikgewogICAgaWYgKHNlZW4uYWRkKHRoaXMpKSB7CiAgICAgIHNiLndyaXRlKCcke3RvU3RyaW5nKCl9IFsnKTsKICAgICAgZm9yIChUeXBlSW5mb3JtYXRpb24gYXNzaWdubWVudCBpbiBhc3NpZ25tZW50cykgewogICAgICAgIHNiLndyaXRlKCdcbiRpbmRlbnQgICcpOwogICAgICAgIGFzc2lnbm1lbnQuX3RvU3RydWN0dXJlZFRleHQoc2IsICckaW5kZW50ICAnLCBzZWVuKTsKICAgICAgfQogICAgICBzYi53cml0ZSgnIF0nKTsKICAgIH0gZWxzZSB7CiAgICAgIHNiLndyaXRlKCcke3RvU3RyaW5nKCl9IFsgLi4uIF0nKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGFjY2VwdChUeXBlSW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0UGhpRWxlbWVudFR5cGVJbmZvcm1hdGlvbih0aGlzKTsKICB9Cn0KCmNsYXNzIENsb3N1cmVUeXBlSW5mb3JtYXRpb24gZXh0ZW5kcyBUeXBlSW5mb3JtYXRpb24KICAgIHdpdGggQXBwbHlhYmxlVHlwZUluZm9ybWF0aW9uIHsKICBmaW5hbCBGdW5jdGlvbkVudGl0eSBfZWxlbWVudDsKCiAgQ2xvc3VyZVR5cGVJbmZvcm1hdGlvbihBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4sCiAgICAgIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBjb250ZXh0LCB0aGlzLl9lbGVtZW50KQogICAgICA6IHN1cGVyKGFic3RyYWN0VmFsdWVEb21haW4uZW1wdHlUeXBlLCBjb250ZXh0KTsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGNsb3N1cmUgPT4gX2VsZW1lbnQ7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpID0+IHNhZmVUeXBlKGluZmVycmVyKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBzYWZlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgcmV0dXJuIGluZmVycmVyLnR5cGVzLmZ1bmN0aW9uVHlwZS50eXBlOwogIH0KCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gJyRjbG9zdXJlJzsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0Nsb3N1cmUgJF9lbGVtZW50JzsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KFR5cGVJbmZvcm1hdGlvblZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRDbG9zdXJlVHlwZUluZm9ybWF0aW9uKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNTdGFibGVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBTdHJpbmcgZ2V0SW5mZXJyZWRTaWduYXR1cmUoVHlwZVN5c3RlbSB0eXBlcykgewogICAgcmV0dXJuIHR5cGVzLmdldEluZmVycmVkU2lnbmF0dXJlT2ZNZXRob2QoX2VsZW1lbnQpOwogIH0KfQoKLy8vIE1peGluIGZvciBbVHlwZUluZm9ybWF0aW9uXSBub2RlcyB0aGF0IGNhbiBiYWlsIG91dCBkdXJpbmcgdHJhY2luZy4KYWJzdHJhY3QgY2xhc3MgVHJhY2VkVHlwZUluZm9ybWF0aW9uIGltcGxlbWVudHMgVHlwZUluZm9ybWF0aW9uIHsKICAvLy8gU2V0IHRvIGZhbHNlIG9uY2UgYW5hbHlzaXMgaGFzIHN1Y2NlZWRlZC4KICBib29sIGJhaWxlZE91dCA9IHRydWU7CgogIC8vLyBTZXQgdG8gdHJ1ZSBvbmNlIGFuYWx5c2lzIGlzIGNvbXBsZXRlZC4KICBib29sIGFuYWx5emVkID0gZmFsc2U7CgogIFNldDxUeXBlSW5mb3JtYXRpb24+IF9mbG93c0ludG87CgogIC8vLyBUaGUgc2V0IG9mIFtUeXBlSW5mb3JtYXRpb25dIG5vZGVzIHdoZXJlIHZhbHVlcyBmcm9tIHRoZSB0cmFjZWQgbm9kZSBjb3VsZAogIC8vLyBmbG93IGluLgogIFNldDxUeXBlSW5mb3JtYXRpb24+IGdldCBmbG93c0ludG8gewogICAgcmV0dXJuIChfZmxvd3NJbnRvID09IG51bGwpCiAgICAgICAgPyBjb25zdCBJbW11dGFibGVFbXB0eVNldDxUeXBlSW5mb3JtYXRpb24+KCkKICAgICAgICA6IF9mbG93c0ludG87CiAgfQoKICAvLy8gQWRkcyBbbm9kZXNdIHRvIHRoZSBzZXRzIG9mIHZhbHVlcyB0aGlzIFtUcmFjZWRUeXBlSW5mb3JtYXRpb25dIGZsb3dzCiAgLy8vIGludG8uCiAgdm9pZCBhZGRGbG93c0ludG9UYXJnZXRzKEl0ZXJhYmxlPFR5cGVJbmZvcm1hdGlvbj4gbm9kZXMpIHsKICAgIGlmIChfZmxvd3NJbnRvID09IG51bGwpIHsKICAgICAgX2Zsb3dzSW50byA9IG5vZGVzLnRvU2V0KCk7CiAgICB9IGVsc2UgewogICAgICBfZmxvd3NJbnRvLmFkZEFsbChub2Rlcyk7CiAgICB9CiAgfQp9CgpjbGFzcyBBd2FpdFR5cGVJbmZvcm1hdGlvbiBleHRlbmRzIFR5cGVJbmZvcm1hdGlvbiB7CiAgZmluYWwgaXIuTm9kZSBfbm9kZTsKCiAgQXdhaXRUeXBlSW5mb3JtYXRpb24oQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICBNZW1iZXJUeXBlSW5mb3JtYXRpb24gY29udGV4dCwgdGhpcy5fbm9kZSkKICAgICAgOiBzdXBlcihhYnN0cmFjdFZhbHVlRG9tYWluLmVtcHR5VHlwZSwgY29udGV4dCk7CgogIC8vIFRPRE8oMjI4OTQpOiBDb21wdXRlIGEgYmV0dGVyIHR5cGUgaGVyZS4KICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKSA9PiBzYWZlVHlwZShpbmZlcnJlcik7CgogIFN0cmluZyBnZXQgZGVidWdOYW1lID0+ICckX25vZGUnOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnQXdhaXQnOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoVHlwZUluZm9ybWF0aW9uVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEF3YWl0VHlwZUluZm9ybWF0aW9uKHRoaXMpOwogIH0KfQoKY2xhc3MgWWllbGRUeXBlSW5mb3JtYXRpb24gZXh0ZW5kcyBUeXBlSW5mb3JtYXRpb24gewogIGZpbmFsIGlyLk5vZGUgX25vZGU7CgogIFlpZWxkVHlwZUluZm9ybWF0aW9uKEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwKICAgICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGNvbnRleHQsIHRoaXMuX25vZGUpCiAgICAgIDogc3VwZXIoYWJzdHJhY3RWYWx1ZURvbWFpbi5lbXB0eVR5cGUsIGNvbnRleHQpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKSA9PiBzYWZlVHlwZShpbmZlcnJlcik7CgogIFN0cmluZyBnZXQgZGVidWdOYW1lID0+ICckX25vZGUnOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnWWllbGQnOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoVHlwZUluZm9ybWF0aW9uVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFlpZWxkVHlwZUluZm9ybWF0aW9uKHRoaXMpOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgVHlwZUluZm9ybWF0aW9uVmlzaXRvcjxUPiB7CiAgVCB2aXNpdE5hcnJvd1R5cGVJbmZvcm1hdGlvbihOYXJyb3dUeXBlSW5mb3JtYXRpb24gaW5mbyk7CiAgVCB2aXNpdFBoaUVsZW1lbnRUeXBlSW5mb3JtYXRpb24oUGhpRWxlbWVudFR5cGVJbmZvcm1hdGlvbiBpbmZvKTsKICBUIHZpc2l0RWxlbWVudEluQ29udGFpbmVyVHlwZUluZm9ybWF0aW9uKAogICAgICBFbGVtZW50SW5Db250YWluZXJUeXBlSW5mb3JtYXRpb24gaW5mbyk7CiAgVCB2aXNpdEVsZW1lbnRJblNldFR5cGVJbmZvcm1hdGlvbihFbGVtZW50SW5TZXRUeXBlSW5mb3JtYXRpb24gaW5mbyk7CiAgVCB2aXNpdEtleUluTWFwVHlwZUluZm9ybWF0aW9uKEtleUluTWFwVHlwZUluZm9ybWF0aW9uIGluZm8pOwogIFQgdmlzaXRWYWx1ZUluTWFwVHlwZUluZm9ybWF0aW9uKFZhbHVlSW5NYXBUeXBlSW5mb3JtYXRpb24gaW5mbyk7CiAgVCB2aXNpdExpc3RUeXBlSW5mb3JtYXRpb24oTGlzdFR5cGVJbmZvcm1hdGlvbiBpbmZvKTsKICBUIHZpc2l0U2V0VHlwZUluZm9ybWF0aW9uKFNldFR5cGVJbmZvcm1hdGlvbiBpbmZvKTsKICBUIHZpc2l0TWFwVHlwZUluZm9ybWF0aW9uKE1hcFR5cGVJbmZvcm1hdGlvbiBpbmZvKTsKICBUIHZpc2l0Q29uY3JldGVUeXBlSW5mb3JtYXRpb24oQ29uY3JldGVUeXBlSW5mb3JtYXRpb24gaW5mbyk7CiAgVCB2aXNpdFN0cmluZ0xpdGVyYWxUeXBlSW5mb3JtYXRpb24oU3RyaW5nTGl0ZXJhbFR5cGVJbmZvcm1hdGlvbiBpbmZvKTsKICBUIHZpc2l0Qm9vbExpdGVyYWxUeXBlSW5mb3JtYXRpb24oQm9vbExpdGVyYWxUeXBlSW5mb3JtYXRpb24gaW5mbyk7CiAgVCB2aXNpdENsb3N1cmVDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbihDbG9zdXJlQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24gaW5mbyk7CiAgVCB2aXNpdFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pOwogIFQgdmlzaXREeW5hbWljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24oRHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pOwogIFQgdmlzaXRNZW1iZXJUeXBlSW5mb3JtYXRpb24oTWVtYmVyVHlwZUluZm9ybWF0aW9uIGluZm8pOwogIFQgdmlzaXRQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24oUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uIGluZm8pOwogIFQgdmlzaXRDbG9zdXJlVHlwZUluZm9ybWF0aW9uKENsb3N1cmVUeXBlSW5mb3JtYXRpb24gaW5mbyk7CiAgVCB2aXNpdEF3YWl0VHlwZUluZm9ybWF0aW9uKEF3YWl0VHlwZUluZm9ybWF0aW9uIGluZm8pOwogIFQgdmlzaXRZaWVsZFR5cGVJbmZvcm1hdGlvbihZaWVsZFR5cGVJbmZvcm1hdGlvbiBpbmZvKTsKfQoKQWJzdHJhY3RWYWx1ZSBfbmFycm93VHlwZSgKICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwgQWJzdHJhY3RWYWx1ZSB0eXBlLCBEYXJ0VHlwZSBhbm5vdGF0aW9uLAogICAge2Jvb2wgaXNOdWxsYWJsZTogdHJ1ZX0pIHsKICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4gPSBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluOwogIEFic3RyYWN0VmFsdWUgb3RoZXJUeXBlOwogIGlmIChhbm5vdGF0aW9uLnRyZWF0QXNEeW5hbWljKSB7CiAgICByZXR1cm4gdHlwZTsKICB9IGVsc2UgaWYgKGFubm90YXRpb24uaXNJbnRlcmZhY2VUeXBlKSB7CiAgICBJbnRlcmZhY2VUeXBlIGludGVyZmFjZVR5cGUgPSBhbm5vdGF0aW9uOwogICAgaWYgKGludGVyZmFjZVR5cGUuZWxlbWVudCA9PSBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5vYmplY3RDbGFzcykgewogICAgICByZXR1cm4gdHlwZTsKICAgIH0KICAgIG90aGVyVHlwZSA9IGFic3RyYWN0VmFsdWVEb21haW4uY3JlYXRlTm9uTnVsbFN1YnR5cGUoaW50ZXJmYWNlVHlwZS5lbGVtZW50KTsKICB9IGVsc2UgaWYgKGFubm90YXRpb24uaXNWb2lkKSB7CiAgICByZXR1cm4gdHlwZTsKICB9IGVsc2UgaWYgKGFubm90YXRpb24uaXNUeXBlZGVmIHx8IGFubm90YXRpb24uaXNGdW5jdGlvblR5cGUpIHsKICAgIG90aGVyVHlwZSA9IGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uZnVuY3Rpb25UeXBlOwogIH0gZWxzZSBpZiAoYW5ub3RhdGlvbi5pc0Z1dHVyZU9yKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBOYXJyb3cgRnV0dXJlT3IgdHlwZXMuCiAgICByZXR1cm4gdHlwZTsKICB9IGVsc2UgewogICAgYXNzZXJ0KGFubm90YXRpb24uaXNUeXBlVmFyaWFibGUgfHwgYW5ub3RhdGlvbi5pc0Z1bmN0aW9uVHlwZVZhcmlhYmxlKTsKICAgIC8vIFRPRE8obmdlb2ZmcmF5KTogTmFycm93IHRvIGJvdW5kLgogICAgcmV0dXJuIHR5cGU7CiAgfQogIGlmIChpc051bGxhYmxlKSB7CiAgICBvdGhlclR5cGUgPSBhYnN0cmFjdFZhbHVlRG9tYWluLmluY2x1ZGVOdWxsKG90aGVyVHlwZSk7CiAgfQogIGlmICh0eXBlID09IG51bGwpIHsKICAgIHJldHVybiBvdGhlclR5cGU7CiAgfQogIHJldHVybiBhYnN0cmFjdFZhbHVlRG9tYWluLmludGVyc2VjdGlvbih0eXBlLCBvdGhlclR5cGUpOwp9CohtAE5OPAEwASwBKAEwIyQhMjsqJR4yHxsBRAQVDxEdFx0pBEdMQQ0hHjQBQhcWAUsnATpNAT0BSUhNNiMaQQE/FwFEEhgBT01PUUsdAUcOGQFJIgxPASABKywvATkyLwEnMisYAU4vASceFQQBKx8EASoeGAQBSDJQASE8BAEzKCQjJAZDQiQeBAE2LicGRy0jBgQBMkwEAUsiNgFOPTQsBAFIH0FDEktBNQQBETUnBAFAASgqMxURBAEqAUxGF0cBPxAwQQQBOyEdCAQBLChMKjUfFQQBFx4gGgQBPBMSGQQBKyo/GgQBGkMaBAIBRS0CAU4QBFBATTseTjcBDDA8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ATUXAUAxNwEuDEwBJAEMIAEMKzQEAgE1FwFAMTcBDEwBJAEMIAEMKzQEAgErPEQsL0hARDg2NkBKRk5MTjxCPjo6AgEbRx9NGyMRKy5LEwZRIhFCPiYzEQtMKREEFDwEFhYEPAIBM3BhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL3R5cGVfZ3JhcGhfbm9kZXMuZGFydDpzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pbmZlcnJlci9idWlsZGVyX2tlcm5lbC5kYXJ0wAExQy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAnLi4vY2xvc3VyZS5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy9jb25zdGFudF9zeXN0ZW0uZGFydCcgYXMgY29uc3RhbnRfc3lzdGVtOwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvanVtcHMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJy4uL2luZmVycmVyL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2lyL2NvbnN0YW50cy5kYXJ0JzsKaW1wb3J0ICcuLi9pci9zdGF0aWNfdHlwZV9wcm92aWRlci5kYXJ0JzsKaW1wb3J0ICcuLi9pci91dGlsLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvYmFja2VuZC5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2ZpZWxkX2FuYWx5c2lzLmRhcnQnOwppbXBvcnQgJy4uL2pzX21vZGVsL2VsZW1lbnRfbWFwLmRhcnQnOwppbXBvcnQgJy4uL2pzX21vZGVsL2xvY2Fscy5kYXJ0JyBzaG93IEp1bXBWaXNpdG9yOwppbXBvcnQgJy4uL2pzX21vZGVsL2pzX3dvcmxkLmRhcnQnOwppbXBvcnQgJy4uL25hdGl2ZS9iZWhhdmlvci5kYXJ0JzsKaW1wb3J0ICcuLi9vcHRpb25zLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NpZGVfZWZmZWN0cy5kYXJ0JzsKaW1wb3J0ICcuLi91dGlsL3V0aWwuZGFydCc7CmltcG9ydCAnaW5mZXJyZXJfZW5naW5lLmRhcnQnOwppbXBvcnQgJ2xvY2Fsc19oYW5kbGVyLmRhcnQnOwppbXBvcnQgJ3R5cGVfZ3JhcGhfbm9kZXMuZGFydCc7CmltcG9ydCAndHlwZV9zeXN0ZW0uZGFydCc7CgovLy8gW0tlcm5lbFR5cGVHcmFwaEJ1aWxkZXJdIGNvbnN0cnVjdHMgYSB0eXBlLWluZmVyZW5jZSBncmFwaCBmb3IgYSBwYXJ0aWN1bGFyCi8vLyBlbGVtZW50LgovLy8KLy8vIENhbGxpbmcgW3J1bl0gd2lsbCBzdGFydCB0aGUgd29yayBvZiB2aXNpdGluZyB0aGUgYm9keSBvZiB0aGUgY29kZSB0bwovLy8gY29uc3RydWN0IGEgc2V0IG9mIGluZmVyZW5jZS1ub2RlcyB0aGF0IGFic3RyYWN0bHkgcmVwcmVzZW50IHdoYXQgdGhlIGNvZGUKLy8vIGlzIGRvaW5nLgpjbGFzcyBLZXJuZWxUeXBlR3JhcGhCdWlsZGVyIGV4dGVuZHMgaXIuVmlzaXRvcjxUeXBlSW5mb3JtYXRpb24+IHsKICBmaW5hbCBDb21waWxlck9wdGlvbnMgX29wdGlvbnM7CiAgZmluYWwgSnNDbG9zZWRXb3JsZCBfY2xvc2VkV29ybGQ7CiAgZmluYWwgSW5mZXJyZXJFbmdpbmUgX2luZmVycmVyOwogIGZpbmFsIFR5cGVTeXN0ZW0gX3R5cGVzOwogIGZpbmFsIE1lbWJlckVudGl0eSBfYW5hbHl6ZWRNZW1iZXI7CiAgZmluYWwgaXIuTm9kZSBfYW5hbHl6ZWROb2RlOwogIGZpbmFsIEtlcm5lbFRvTG9jYWxzTWFwIF9sb2NhbHNNYXA7CiAgZmluYWwgR2xvYmFsVHlwZUluZmVyZW5jZUVsZW1lbnREYXRhIF9tZW1iZXJEYXRhOwogIGZpbmFsIGJvb2wgX2luR2VuZXJhdGl2ZUNvbnN0cnVjdG9yOwoKICBMb2NhbFN0YXRlIF9zdGF0ZUludGVybmFsOwogIExvY2FsU3RhdGUgX3N0YXRlQWZ0ZXJXaGVuVHJ1ZUludGVybmFsOwogIExvY2FsU3RhdGUgX3N0YXRlQWZ0ZXJXaGVuRmFsc2VJbnRlcm5hbDsKCiAgLy8vIFJldHVybnMgdGhlIGN1cnJlbnQgbG9jYWwgc3RhdGUgZm9yIHdoZW4gdGhlIGJvb2xlYW4gdmFsdWUgb2YgdGhlIG1vc3QKICAvLy8gcmVjZW50bHkgdmlzaXRlZCBub2RlIGlzIG5vdCB0YWtlbiBpbnRvIGFjY291bnQKICBMb2NhbFN0YXRlIGdldCBfc3RhdGUgewogICAgcmV0dXJuIF9zdGF0ZUludGVybmFsOwogIH0KCiAgLy8vIFNldHMgdGhlIGN1cnJlbnQgbG9jYWwgc3RhdGUgZm9yIHdoZW4gdGhlIGJvb2xlYW4gdmFsdWUgb2YgdGhlIG1vc3QKICAvLy8gcmVjZW50bHkgdmlzaXRlZCBub2RlIGlzIG5vdCB0YWtlbiBpbnRvIGFjY291bnQKICAvLy8KICAvLy8gVGhpcyB1c2VkIGZvciB3aGVuIHRoZSBtb3N0IHJlY2VudGx5IHZpc2l0ZWQgbm9kZSBpcyBub3QgYSBib29sZWFuCiAgLy8vIGV4cHJlc3Npb24gYW5kIHRoZXJlIGZvciBhbHNvIHJlc2V0cyBbX3N0YXRlQWZ0ZXJXaGVuVHJ1ZV0gYW5kCiAgLy8vIFtfc3RhdGVBZnRlcldoZW5GYWxzZV0gdG8gdGhlIHNhbWUgdmFsdWUuCiAgdm9pZCBzZXQgX3N0YXRlKExvY2FsU3RhdGUgdmFsdWUpIHsKICAgIF9zdGF0ZUludGVybmFsID0gdmFsdWU7CiAgICBfc3RhdGVBZnRlcldoZW5UcnVlSW50ZXJuYWwgPSBfc3RhdGVBZnRlcldoZW5GYWxzZUludGVybmFsID0gbnVsbDsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBjdXJyZW50IGxvY2FsIHN0YXRlIGZvciB3aGVuIHRoZSBtb3N0IHJlY2VudGx5IHZpc2l0ZWQgbm9kZQogIC8vLyBoYXMgZXZhbHVhdGVkIHRvIGB0cnVlYC4KICAvLy8KICAvLy8gSWYgdGhlIG1vc3QgcmVjZW50bHkgdmlzaXRlZCBub2RlIGlzIG5vdCBhIGJvb2xlYW4gZXhwcmVzc2lvbiB0aGVuIHRoaXMgaXMKICAvLy8gdGhlIHNhbWUgYXMgW19zdGF0ZV0uCiAgTG9jYWxTdGF0ZSBnZXQgX3N0YXRlQWZ0ZXJXaGVuVHJ1ZSA9PgogICAgICBfc3RhdGVBZnRlcldoZW5UcnVlSW50ZXJuYWwgPz8gX3N0YXRlSW50ZXJuYWw7CgogIC8vLyBSZXR1cm5zIHRoZSBjdXJyZW50IGxvY2FsIHN0YXRlIGZvciB3aGVuIHRoZSBtb3N0IHJlY2VudGx5IHZpc2l0ZWQgbm9kZQogIC8vLyBoYXMgZXZhbHVhdGVkIHRvIGBmYWxzZWAuCiAgLy8vCiAgLy8vIElmIHRoZSBtb3N0IHJlY2VudGx5IHZpc2l0ZWQgbm9kZSBpcyBub3QgYSBib29sZWFuIGV4cHJlc3Npb24gdGhlbiB0aGlzIGlzCiAgLy8vIHRoZSBzYW1lIGFzIFtfc3RhdGVdLgogIExvY2FsU3RhdGUgZ2V0IF9zdGF0ZUFmdGVyV2hlbkZhbHNlID0+CiAgICAgIF9zdGF0ZUFmdGVyV2hlbkZhbHNlSW50ZXJuYWwgPz8gX3N0YXRlSW50ZXJuYWw7CgogIC8vLyBTZXRzIHRoZSBjdXJyZW50IGxvY2FsIHN0YXRlLiBbYmFzZV0gaXMgdGhlIGxvY2FsIHN0YXRlIGZvciB3aGVuIHRoZQogIC8vLyBib29sZWFuIHZhbHVlIG9mIHRoZSBtb3N0IHJlY2VudGx5IHZpc2l0ZWQgbm9kZSBpcyBub3QgdGFrZW4gaW50byBhY2NvdW50LgogIC8vLyBbd2hlblRydWVdIGFuZCBbd2hlbkZhbHNlXSBhcmUgdGhlIGxvY2FsIHN0YXRlIGZvciB3aGVuIHRoZSBib29sZWFuIHZhbHVlCiAgLy8vIG9mIHRoZSBtb3N0IHJlY2VudGx5IHZpc2l0ZWQgbm9kZSBpcyBgdHJ1ZWAgb3IgYGZhbHNlYCwgcmVzcGVjdGl2ZWx5LgogIHZvaWQgX3NldFN0YXRlQWZ0ZXIoCiAgICAgIExvY2FsU3RhdGUgYmFzZSwgTG9jYWxTdGF0ZSB3aGVuVHJ1ZSwgTG9jYWxTdGF0ZSB3aGVuRmFsc2UpIHsKICAgIF9zdGF0ZUludGVybmFsID0gYmFzZTsKICAgIF9zdGF0ZUFmdGVyV2hlblRydWVJbnRlcm5hbCA9IHdoZW5UcnVlOwogICAgX3N0YXRlQWZ0ZXJXaGVuRmFsc2VJbnRlcm5hbCA9IHdoZW5GYWxzZTsKICB9CgogIGZpbmFsIFNpZGVFZmZlY3RzQnVpbGRlciBfc2lkZUVmZmVjdHNCdWlsZGVyOwogIGZpbmFsIE1hcDxKdW1wVGFyZ2V0LCBMaXN0PExvY2FsU3RhdGU+PiBfYnJlYWtzRm9yID0KICAgICAgPEp1bXBUYXJnZXQsIExpc3Q8TG9jYWxTdGF0ZT4+e307CiAgZmluYWwgTWFwPEp1bXBUYXJnZXQsIExpc3Q8TG9jYWxTdGF0ZT4+IF9jb250aW51ZXNGb3IgPQogICAgICA8SnVtcFRhcmdldCwgTGlzdDxMb2NhbFN0YXRlPj57fTsKICBUeXBlSW5mb3JtYXRpb24gX3JldHVyblR5cGU7CiAgZmluYWwgU2V0PExvY2FsPiBfY2FwdHVyZWRWYXJpYWJsZXMgPSBuZXcgU2V0PExvY2FsPigpOwogIGZpbmFsIE1hcDxMb2NhbCwgRmllbGRFbnRpdHk+IF9jYXB0dXJlZEFuZEJveGVkOwoKICBmaW5hbCBTdGF0aWNUeXBlUHJvdmlkZXIgX3N0YXRpY1R5cGVQcm92aWRlcjsKCiAgLy8vIFdoZXRoZXIgd2UgY3VycmVudGx5IHRha2VuIHRoZSBib29sZWFuIHJlc3VsdCBvZiBpcy1jaGVja3Mgb3IgbnVsbC1jaGVja3MKICAvLy8gaW50byBhY2NvdW50IGluIHRoZSBsb2NhbCBzdGF0ZS4KICBib29sIF9hY2N1bXVsYXRlSXNDaGVja3MgPSBmYWxzZTsKCiAgS2VybmVsVHlwZUdyYXBoQnVpbGRlcigKICAgICAgdGhpcy5fb3B0aW9ucywKICAgICAgdGhpcy5fY2xvc2VkV29ybGQsCiAgICAgIHRoaXMuX2luZmVycmVyLAogICAgICB0aGlzLl9hbmFseXplZE1lbWJlciwKICAgICAgdGhpcy5fYW5hbHl6ZWROb2RlLAogICAgICB0aGlzLl9sb2NhbHNNYXAsCiAgICAgIHRoaXMuX3N0YXRpY1R5cGVQcm92aWRlciwKICAgICAgW3RoaXMuX3N0YXRlSW50ZXJuYWwsCiAgICAgIE1hcDxMb2NhbCwgRmllbGRFbnRpdHk+IGNhcHR1cmVkQW5kQm94ZWRdKQogICAgICA6IHRoaXMuX3R5cGVzID0gX2luZmVycmVyLnR5cGVzLAogICAgICAgIHRoaXMuX21lbWJlckRhdGEgPSBfaW5mZXJyZXIuZGF0YU9mTWVtYmVyKF9hbmFseXplZE1lbWJlciksCiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU2hvdWxkIHNpZGUgZWZmZWN0cyBhbHNvIGJlIHRyYWNrZWQgZm9yIGZpZWxkCiAgICAgICAgLy8gaW5pdGlhbGl6ZXJzPwogICAgICAgIHRoaXMuX3NpZGVFZmZlY3RzQnVpbGRlciA9IF9hbmFseXplZE1lbWJlciBpcyBGdW5jdGlvbkVudGl0eQogICAgICAgICAgICA/IF9pbmZlcnJlci5pbmZlcnJlZERhdGFCdWlsZGVyCiAgICAgICAgICAgICAgICAuZ2V0U2lkZUVmZmVjdHNCdWlsZGVyKF9hbmFseXplZE1lbWJlcikKICAgICAgICAgICAgOiBuZXcgU2lkZUVmZmVjdHNCdWlsZGVyLmZyZWUoX2FuYWx5emVkTWVtYmVyKSwKICAgICAgICB0aGlzLl9pbkdlbmVyYXRpdmVDb25zdHJ1Y3RvciA9IF9hbmFseXplZE5vZGUgaXMgaXIuQ29uc3RydWN0b3IsCiAgICAgICAgdGhpcy5fY2FwdHVyZWRBbmRCb3hlZCA9IGNhcHR1cmVkQW5kQm94ZWQgIT0gbnVsbAogICAgICAgICAgICA/IG5ldyBNYXA8TG9jYWwsIEZpZWxkRW50aXR5Pi5mcm9tKGNhcHR1cmVkQW5kQm94ZWQpCiAgICAgICAgICAgIDogPExvY2FsLCBGaWVsZEVudGl0eT57fSB7CiAgICBpZiAoX3N0YXRlICE9IG51bGwpIHJldHVybjsKCiAgICBfc3RhdGUgPSBuZXcgTG9jYWxTdGF0ZS5pbml0aWFsKAogICAgICAgIGluR2VuZXJhdGl2ZUNvbnN0cnVjdG9yOiBfaW5HZW5lcmF0aXZlQ29uc3RydWN0b3IpOwogIH0KCiAgSnNUb0VsZW1lbnRNYXAgZ2V0IF9lbGVtZW50TWFwID0+IF9jbG9zZWRXb3JsZC5lbGVtZW50TWFwOwoKICBDbG9zdXJlRGF0YSBnZXQgX2Nsb3N1cmVEYXRhTG9va3VwID0+IF9jbG9zZWRXb3JsZC5jbG9zdXJlRGF0YUxvb2t1cDsKCiAgRGFydFR5cGUgX2dldFN0YXRpY1R5cGUoaXIuRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gX2VsZW1lbnRNYXAuZ2V0RGFydFR5cGUoX3N0YXRpY1R5cGVQcm92aWRlci5nZXRTdGF0aWNUeXBlKG5vZGUpKTsKICB9CgogIGludCBfbG9vcExldmVsID0gMDsKCiAgYm9vbCBnZXQgaW5Mb29wID0+IF9sb29wTGV2ZWwgPiAwOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW21lbWJlcl0gaXMgZGVmaW5lZCBpbiBhIHN1YmNsYXNzIG9mIHRoZSBjdXJyZW50IHRoaXMKICAvLy8gdHlwZS4KICBib29sIF9pc0luQ2xhc3NPclN1YmNsYXNzKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIENsYXNzRW50aXR5IGNscyA9IF9lbGVtZW50TWFwLmdldE1lbWJlclRoaXNUeXBlKF9hbmFseXplZE1lbWJlcik/LmVsZW1lbnQ7CiAgICBpZiAoY2xzID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBfY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNTdWJjbGFzc09mKG1lbWJlci5lbmNsb3NpbmdDbGFzcywgY2xzKTsKICB9CgogIC8vLyBDaGVja3Mgd2hldGhlciB0aGUgYWNjZXNzIG9yIHVwZGF0ZSBvZiBbc2VsZWN0b3JdIG9uIFttYXNrXSBwb3RlbnRpYWxseQogIC8vLyBleHBvc2VzIGB0aGlzYC4KICAvLy8KICAvLy8gSWYgYWxsIG1hdGNoaW5nIG1lbWJlcnMgYXJlIGluc3RhbmNlIGZpZWxkcyBvbiB0aGUgY3VycmVudCBgdGhpc2AKICAvLy8gY2xhc3Mgb3Igc3ViY2xhc3NlcywgYHRoaXNgIGlzIG5vdCBjb25zaWRlcmVkIHRvIGJlIGV4cG9zZWQuCiAgLy8vCiAgLy8vIElmIGFuIGluc3RhbmNlIGZpZWxkIG1hdGNoZWQgd2l0aCBhIFtzZWxlY3Rvcl0gdGhhdCBpcyBfbm90XyBhIHNldHRlciwgdGhlCiAgLy8vIGZpZWxkIGlzIGNvbnNpZGVyZWQgdG8gaGF2ZSBiZWVuIHJlYWQgYmVmb3JlIGluaXRpYWxpemF0aW9uIGFuZCB0aGUgZmllbGQKICAvLy8gaXMgYXNzdW1lZCB0byBiZSBwb3RlbnRpYWxseSBgbnVsbGAuCiAgdm9pZCBfY2hlY2tJZkV4cG9zZXNUaGlzKFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIG1hc2spIHsKICAgIGlmIChfc3RhdGUuaXNUaGlzRXhwb3NlZCkgewogICAgICAvLyBXZSBhbHJlYWR5IGNvbnNpZGVyIGB0aGlzYCB0byBoYXZlIGJlZW4gZXhwb3NlZC4KICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKF9pbmZlcnJlci5jbG9zZWRXb3JsZC5pbmNsdWRlc0Nsb3N1cmVDYWxsKHNlbGVjdG9yLCBtYXNrKSkgewogICAgICAvLyBUT0RPKG5nZW9mZnJheSk6IFdlIGNvdWxkIGRvIGJldHRlciBoZXJlIGlmIHdlIGtuZXcgd2hhdCB3ZQogICAgICAvLyBhcmUgY2FsbGluZyBkb2VzIG5vdCBleHBvc2UgdGhpcy4KICAgICAgX3N0YXRlLm1hcmtUaGlzQXNFeHBvc2VkKCk7CiAgICB9IGVsc2UgewogICAgICBfaW5mZXJyZXIuZm9yRWFjaEVsZW1lbnRNYXRjaGluZyhzZWxlY3RvciwgbWFzaywgKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50LmlzRmllbGQpIHsKICAgICAgICAgIEZpZWxkRW50aXR5IGZpZWxkID0gZWxlbWVudDsKICAgICAgICAgIGlmICghc2VsZWN0b3IuaXNTZXR0ZXIgJiYKICAgICAgICAgICAgICBfaXNJbkNsYXNzT3JTdWJjbGFzcyhmaWVsZCkgJiYKICAgICAgICAgICAgICBmaWVsZC5pc0Fzc2lnbmFibGUgJiYKICAgICAgICAgICAgICBfc3RhdGUucmVhZEZpZWxkKGZpZWxkKSA9PSBudWxsICYmCiAgICAgICAgICAgICAgZ2V0RmllbGRJbml0aWFsaXplcihfZWxlbWVudE1hcCwgZmllbGQpID09IG51bGwpIHsKICAgICAgICAgICAgLy8gSWYgdGhlIGZpZWxkIGlzIGJlaW5nIHVzZWQgYmVmb3JlIHRoaXMgY29uc3RydWN0b3IKICAgICAgICAgICAgLy8gYWN0dWFsbHkgaGFkIGEgY2hhbmNlIHRvIGluaXRpYWxpemUgaXQsIHNheSBpdCBjYW4gYmUKICAgICAgICAgICAgLy8gbnVsbC4KICAgICAgICAgICAgX2luZmVycmVyLnJlY29yZFR5cGVPZkZpZWxkKGZpZWxkLCBfdHlwZXMubnVsbFR5cGUpOwogICAgICAgICAgfQogICAgICAgICAgLy8gQWNjZXNzaW5nIGEgZmllbGQgZG9lcyBub3QgZXhwb3NlIGB0aGlzYC4KICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICAvLyBUT0RPKG5nZW9mZnJheSk6IFdlIGNvdWxkIGRvIGJldHRlciBoZXJlIGlmIHdlIGtuZXcgd2hhdCB3ZQogICAgICAgIC8vIGFyZSBjYWxsaW5nIGRvZXMgbm90IGV4cG9zZSB0aGlzLgogICAgICAgIF9zdGF0ZS5tYXJrVGhpc0FzRXhwb3NlZCgpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfSk7CiAgICB9CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gcnVuKCkgewogICAgaWYgKF9hbmFseXplZE1lbWJlci5pc0ZpZWxkKSB7CiAgICAgIGlmIChfYW5hbHl6ZWROb2RlID09IG51bGwgfHwgX2FuYWx5emVkTm9kZSBpcyBpci5OdWxsTGl0ZXJhbCkgewogICAgICAgIC8vIEVhZ2VybHkgYmFpbG91dCwgYmVjYXVzZSBjb21wdXRpbmcgdGhlIGNsb3N1cmUgZGF0YSBvbmx5CiAgICAgICAgLy8gd29ya3MgZm9yIGZ1bmN0aW9ucyBhbmQgZmllbGQgYXNzaWdubWVudHMuCiAgICAgICAgcmV0dXJuIF90eXBlcy5udWxsVHlwZTsKICAgICAgfQogICAgfQoKICAgIC8vIFVwZGF0ZSB0aGUgbG9jYWxzIHRoYXQgYXJlIGJveGVkIGluIFtsb2NhbHNdLiBUaGVzZSBsb2NhbHMgd2lsbAogICAgLy8gYmUgaGFuZGxlZCBzcGVjaWFsbHksIGluIHRoYXQgd2UgYXJlIGNvbXB1dGluZyB0aGVpciBMVUIgYXQKICAgIC8vIGVhY2ggdXBkYXRlLCBhbmQgcmVhZGluZyB0aGVtIHlpZWxkcyB0aGUgdHlwZSB0aGF0IHdhcyBmb3VuZCBpbiBhCiAgICAvLyBwcmV2aW91cyBhbmFseXNpcyBvZiBbb3V0ZXJtb3N0RWxlbWVudF0uCiAgICBTY29wZUluZm8gc2NvcGVJbmZvID0gX2Nsb3N1cmVEYXRhTG9va3VwLmdldFNjb3BlSW5mbyhfYW5hbHl6ZWRNZW1iZXIpOwogICAgc2NvcGVJbmZvLmZvckVhY2hCb3hlZFZhcmlhYmxlKCh2YXJpYWJsZSwgZmllbGQpIHsKICAgICAgX2NhcHR1cmVkQW5kQm94ZWRbdmFyaWFibGVdID0gZmllbGQ7CiAgICB9KTsKCiAgICByZXR1cm4gdmlzaXQoX2FuYWx5emVkTm9kZSk7CiAgfQoKICBib29sIGlzSW5jb21wYXRpYmxlSW52b2tlKEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uLCBBcmd1bWVudHNUeXBlcyBhcmd1bWVudHMpIHsKICAgIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUgPSBmdW5jdGlvbi5wYXJhbWV0ZXJTdHJ1Y3R1cmU7CgogICAgcmV0dXJuIGFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA8CiAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZS5yZXF1aXJlZFBhcmFtZXRlcnMgfHwKICAgICAgICBhcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGggPiBwYXJhbWV0ZXJTdHJ1Y3R1cmUucG9zaXRpb25hbFBhcmFtZXRlcnMgfHwKICAgICAgICBhcmd1bWVudHMubmFtZWQua2V5cwogICAgICAgICAgICAuYW55KChuYW1lKSA9PiAhcGFyYW1ldGVyU3RydWN0dXJlLm5hbWVkUGFyYW1ldGVycy5jb250YWlucyhuYW1lKSk7CiAgfQoKICB2b2lkIHJlY29yZFJldHVyblR5cGUoVHlwZUluZm9ybWF0aW9uIHR5cGUpIHsKICAgIEZ1bmN0aW9uRW50aXR5IGFuYWx5emVkTWV0aG9kID0gX2FuYWx5emVkTWVtYmVyOwogICAgX3JldHVyblR5cGUgPQogICAgICAgIF9pbmZlcnJlci5hZGRSZXR1cm5UeXBlRm9yTWV0aG9kKGFuYWx5emVkTWV0aG9kLCBfcmV0dXJuVHlwZSwgdHlwZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gX3RoaXNUeXBlOwogIFR5cGVJbmZvcm1hdGlvbiBnZXQgdGhpc1R5cGUgewogICAgaWYgKF90aGlzVHlwZSAhPSBudWxsKSByZXR1cm4gX3RoaXNUeXBlOwogICAgQ2xhc3NFbnRpdHkgY2xzID0gX2VsZW1lbnRNYXAuZ2V0TWVtYmVyVGhpc1R5cGUoX2FuYWx5emVkTWVtYmVyKT8uZWxlbWVudDsKICAgIGlmIChfY2xvc2VkV29ybGQuaXNVc2VkQXNNaXhpbihjbHMpKSB7CiAgICAgIHJldHVybiBfdGhpc1R5cGUgPSBfdHlwZXMubm9uTnVsbFN1YnR5cGUoY2xzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfdGhpc1R5cGUgPSBfdHlwZXMubm9uTnVsbFN1YmNsYXNzKGNscyk7CiAgICB9CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gdmlzaXQoaXIuTm9kZSBub2RlLCB7Ym9vbCBjb25kaXRpb25Db250ZXh0OiBmYWxzZX0pIHsKICAgIHZhciBvbGRBY2N1bXVsYXRlSXNDaGVja3MgPSBfYWNjdW11bGF0ZUlzQ2hlY2tzOwogICAgX2FjY3VtdWxhdGVJc0NoZWNrcyA9IGNvbmRpdGlvbkNvbnRleHQ7CiAgICB2YXIgcmVzdWx0ID0gbm9kZT8uYWNjZXB0KHRoaXMpOwogICAgX2FjY3VtdWxhdGVJc0NoZWNrcyA9IG9sZEFjY3VtdWxhdGVJc0NoZWNrczsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIHZpc2l0TGlzdChMaXN0PGlyLk5vZGU+IG5vZGVzKSB7CiAgICBpZiAobm9kZXMgPT0gbnVsbCkgcmV0dXJuOwogICAgbm9kZXMuZm9yRWFjaCh2aXNpdCk7CiAgfQoKICB2b2lkIGhhbmRsZVBhcmFtZXRlcihpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUsIHtib29sIGlzT3B0aW9uYWx9KSB7CiAgICBMb2NhbCBsb2NhbCA9IF9sb2NhbHNNYXAuZ2V0TG9jYWxWYXJpYWJsZShub2RlKTsKICAgIERhcnRUeXBlIHR5cGUgPSBfbG9jYWxzTWFwLmdldExvY2FsVHlwZShfZWxlbWVudE1hcCwgbG9jYWwpOwogICAgX3N0YXRlLnVwZGF0ZUxvY2FsKF9pbmZlcnJlciwgX2NhcHR1cmVkQW5kQm94ZWQsIGxvY2FsLAogICAgICAgIF9pbmZlcnJlci50eXBlT2ZQYXJhbWV0ZXIobG9jYWwpLCBub2RlLCB0eXBlKTsKICAgIGlmIChpc09wdGlvbmFsKSB7CiAgICAgIFR5cGVJbmZvcm1hdGlvbiB0eXBlOwogICAgICBpZiAobm9kZS5pbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgICAgdHlwZSA9IHZpc2l0KG5vZGUuaW5pdGlhbGl6ZXIpOwogICAgICB9IGVsc2UgewogICAgICAgIHR5cGUgPSBfdHlwZXMubnVsbFR5cGU7CiAgICAgIH0KICAgICAgX2luZmVycmVyLnNldERlZmF1bHRUeXBlT2ZQYXJhbWV0ZXIobG9jYWwsIHR5cGUsCiAgICAgICAgICBpc0luc3RhbmNlTWVtYmVyOiBfYW5hbHl6ZWRNZW1iZXIuaXNJbnN0YW5jZU1lbWJlcik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRDb25zdHJ1Y3Rvcihpci5Db25zdHJ1Y3RvciBub2RlKSB7CiAgICBoYW5kbGVQYXJhbWV0ZXJzKG5vZGUuZnVuY3Rpb24pOwogICAgbm9kZS5pbml0aWFsaXplcnMuZm9yRWFjaCh2aXNpdCk7CiAgICB2aXNpdChub2RlLmZ1bmN0aW9uLmJvZHkpOwoKICAgIENsYXNzRW50aXR5IGNscyA9IF9hbmFseXplZE1lbWJlci5lbmNsb3NpbmdDbGFzczsKICAgIGlmICghKG5vZGUuaW5pdGlhbGl6ZXJzLmlzTm90RW1wdHkgJiYKICAgICAgICBub2RlLmluaXRpYWxpemVycy5maXJzdCBpcyBpci5SZWRpcmVjdGluZ0luaXRpYWxpemVyKSkgewogICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIGluc3RhbmNlIGZpZWxkcywgYW5kIGdpdmUgYSBudWxsIHR5cGUgdG8KICAgICAgLy8gZmllbGRzIHRoYXQgd2UgaGF2ZW4ndCBpbml0aWFsaXplZCBmb3Igc3VyZS4KICAgICAgX2VsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hMb2NhbENsYXNzTWVtYmVyKGNscywKICAgICAgICAgIChNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAgICAgaWYgKG1lbWJlci5pc0ZpZWxkICYmIG1lbWJlci5pc0luc3RhbmNlTWVtYmVyICYmIG1lbWJlci5pc0Fzc2lnbmFibGUpIHsKICAgICAgICAgIFR5cGVJbmZvcm1hdGlvbiB0eXBlID0gX3N0YXRlLnJlYWRGaWVsZChtZW1iZXIpOwogICAgICAgICAgTWVtYmVyRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gX2VsZW1lbnRNYXAuZ2V0TWVtYmVyRGVmaW5pdGlvbihtZW1iZXIpOwogICAgICAgICAgYXNzZXJ0KGRlZmluaXRpb24ua2luZCA9PSBNZW1iZXJLaW5kLnJlZ3VsYXIpOwogICAgICAgICAgaXIuRmllbGQgbm9kZSA9IGRlZmluaXRpb24ubm9kZTsKICAgICAgICAgIGlmICh0eXBlID09IG51bGwgJiYKICAgICAgICAgICAgICAobm9kZS5pbml0aWFsaXplciA9PSBudWxsIHx8CiAgICAgICAgICAgICAgICAgIG5vZGUuaW5pdGlhbGl6ZXIgaXMgaXIuTnVsbExpdGVyYWwpKSB7CiAgICAgICAgICAgIF9pbmZlcnJlci5yZWNvcmRUeXBlT2ZGaWVsZChtZW1iZXIsIF90eXBlcy5udWxsVHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIF9pbmZlcnJlci5yZWNvcmRFeHBvc2VzVGhpcyhfYW5hbHl6ZWRNZW1iZXIsIF9zdGF0ZS5pc1RoaXNFeHBvc2VkKTsKCiAgICBpZiAoY2xzLmlzQWJzdHJhY3QpIHsKICAgICAgaWYgKF9jbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc0luc3RhbnRpYXRlZChjbHMpKSB7CiAgICAgICAgX3JldHVyblR5cGUgPSBfdHlwZXMubm9uTnVsbFN1YmNsYXNzKGNscyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQXZvaWQgYW5hbHl6aW5nIFtfYW5hbHl6ZWRNZW1iZXJdIGluIHRoaXMKICAgICAgICAvLyBjYXNlOyBpdCdzIG5ldmVyIGNhbGxlZC4KICAgICAgICBfcmV0dXJuVHlwZSA9IF90eXBlcy5ub25OdWxsRW1wdHkoKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgX3JldHVyblR5cGUgPSBfdHlwZXMubm9uTnVsbEV4YWN0KGNscyk7CiAgICB9CiAgICBhc3NlcnQoX2JyZWFrc0Zvci5pc0VtcHR5KTsKICAgIGFzc2VydChfY29udGludWVzRm9yLmlzRW1wdHkpOwogICAgcmV0dXJuIF9yZXR1cm5UeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGaWVsZEluaXRpYWxpemVyKGlyLkZpZWxkSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgVHlwZUluZm9ybWF0aW9uIHJoc1R5cGUgPSB2aXNpdChub2RlLnZhbHVlKTsKICAgIEZpZWxkRW50aXR5IGZpZWxkID0gX2VsZW1lbnRNYXAuZ2V0RmllbGQobm9kZS5maWVsZCk7CiAgICBfc3RhdGUudXBkYXRlRmllbGQoZmllbGQsIHJoc1R5cGUpOwogICAgX2luZmVycmVyLnJlY29yZFR5cGVPZkZpZWxkKGZpZWxkLCByaHNUeXBlKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRTdXBlckluaXRpYWxpemVyKGlyLlN1cGVySW5pdGlhbGl6ZXIgbm9kZSkgewogICAgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IgPSBfZWxlbWVudE1hcC5nZXRDb25zdHJ1Y3Rvcihub2RlLnRhcmdldCk7CiAgICBBcmd1bWVudHNUeXBlcyBhcmd1bWVudHMgPSBhbmFseXplQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKTsKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFNlbGVjdG9yKFNlbGVjdG9yS2luZC5DQUxMLCBjb25zdHJ1Y3Rvci5tZW1iZXJOYW1lLAogICAgICAgIF9lbGVtZW50TWFwLmdldENhbGxTdHJ1Y3R1cmUobm9kZS5hcmd1bWVudHMpKTsKICAgIEFic3RyYWN0VmFsdWUgbWFzayA9IF9tZW1iZXJEYXRhLnR5cGVPZlNlbmQobm9kZSk7CiAgICBoYW5kbGVDb25zdHJ1Y3Rvckludm9rZSgKICAgICAgICBub2RlLCBub2RlLmFyZ3VtZW50cywgc2VsZWN0b3IsIG1hc2ssIGNvbnN0cnVjdG9yLCBhcmd1bWVudHMpOwoKICAgIF9pbmZlcnJlci5hbmFseXplKGNvbnN0cnVjdG9yKTsKICAgIGlmIChfaW5mZXJyZXIuY2hlY2tJZkV4cG9zZXNUaGlzKGNvbnN0cnVjdG9yKSkgewogICAgICBfc3RhdGUubWFya1RoaXNBc0V4cG9zZWQoKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRSZWRpcmVjdGluZ0luaXRpYWxpemVyKGlyLlJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IgPSBfZWxlbWVudE1hcC5nZXRDb25zdHJ1Y3Rvcihub2RlLnRhcmdldCk7CiAgICBBcmd1bWVudHNUeXBlcyBhcmd1bWVudHMgPSBhbmFseXplQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKTsKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFNlbGVjdG9yKFNlbGVjdG9yS2luZC5DQUxMLCBjb25zdHJ1Y3Rvci5tZW1iZXJOYW1lLAogICAgICAgIF9lbGVtZW50TWFwLmdldENhbGxTdHJ1Y3R1cmUobm9kZS5hcmd1bWVudHMpKTsKICAgIEFic3RyYWN0VmFsdWUgbWFzayA9IF9tZW1iZXJEYXRhLnR5cGVPZlNlbmQobm9kZSk7CiAgICBoYW5kbGVDb25zdHJ1Y3Rvckludm9rZSgKICAgICAgICBub2RlLCBub2RlLmFyZ3VtZW50cywgc2VsZWN0b3IsIG1hc2ssIGNvbnN0cnVjdG9yLCBhcmd1bWVudHMpOwoKICAgIF9pbmZlcnJlci5hbmFseXplKGNvbnN0cnVjdG9yKTsKICAgIGlmIChfaW5mZXJyZXIuY2hlY2tJZkV4cG9zZXNUaGlzKGNvbnN0cnVjdG9yKSkgewogICAgICBfc3RhdGUubWFya1RoaXNBc0V4cG9zZWQoKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRMb2NhbEluaXRpYWxpemVyKGlyLkxvY2FsSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgdmlzaXQobm9kZS52YXJpYWJsZSk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgaGFuZGxlUGFyYW1ldGVycyhpci5GdW5jdGlvbk5vZGUgbm9kZSkgewogICAgaW50IHBvc2l0aW9uID0gMDsKICAgIGZvciAoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgaW4gbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICBoYW5kbGVQYXJhbWV0ZXIocGFyYW1ldGVyLAogICAgICAgICAgaXNPcHRpb25hbDogcG9zaXRpb24gPj0gbm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50KTsKICAgICAgcG9zaXRpb24rKzsKICAgIH0KICAgIGZvciAoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgaW4gbm9kZS5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgaGFuZGxlUGFyYW1ldGVyKHBhcmFtZXRlciwgaXNPcHRpb25hbDogdHJ1ZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRGdW5jdGlvbk5vZGUoaXIuRnVuY3Rpb25Ob2RlIG5vZGUpIHsKICAgIGhhbmRsZVBhcmFtZXRlcnMobm9kZSk7CgogICAgaWYgKF9jbG9zZWRXb3JsZC5uYXRpdmVEYXRhLmlzTmF0aXZlTWVtYmVyKF9hbmFseXplZE1lbWJlcikpIHsKICAgICAgLy8gTmF0aXZlIG1ldGhvZHMgZG8gbm90IGhhdmUgYSBib2R5LCBhbmQgd2UgY3VycmVudGx5IGp1c3Qgc2F5CiAgICAgIC8vIHRoZXkgcmV0dXJuIGR5bmFtaWMuCiAgICAgIHJldHVybiBfdHlwZXMuZHluYW1pY1R5cGU7CiAgICB9CgogICAgdmlzaXQobm9kZS5ib2R5KTsKICAgIHN3aXRjaCAobm9kZS5hc3luY01hcmtlcikgewogICAgICBjYXNlIGlyLkFzeW5jTWFya2VyLlN5bmM6CiAgICAgICAgaWYgKF9yZXR1cm5UeXBlID09IG51bGwpIHsKICAgICAgICAgIC8vIE5vIHJldHVybiBpbiB0aGUgYm9keS4KICAgICAgICAgIF9yZXR1cm5UeXBlID0gX3N0YXRlLnNlZW5SZXR1cm5PclRocm93CiAgICAgICAgICAgICAgPyBfdHlwZXMubm9uTnVsbEVtcHR5KCkgLy8gQm9keSBhbHdheXMgdGhyb3dzLgogICAgICAgICAgICAgIDogX3R5cGVzLm51bGxUeXBlOwogICAgICAgIH0gZWxzZSBpZiAoIV9zdGF0ZS5zZWVuUmV0dXJuT3JUaHJvdykgewogICAgICAgICAgLy8gV2UgaGF2ZW4nVHlwZUluZm9ybWF0aW9uIHNlZW4gcmV0dXJucyBvbiBhbGwgYnJhbmNoZXMuIFNvIHRoZQogICAgICAgICAgLy8gbWV0aG9kIG1heSBhbHNvIHJldHVybiBudWxsLgogICAgICAgICAgcmVjb3JkUmV0dXJuVHlwZShfdHlwZXMubnVsbFR5cGUpOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgaXIuQXN5bmNNYXJrZXIuU3luY1N0YXI6CiAgICAgICAgLy8gVE9ETyhhc2dlcmYpOiBNYXliZSBtYWtlIGEgQ29udGFpbmVyVHlwZU1hc2sgZm9yIHRoZXNlPyBUaGUgdHlwZQogICAgICAgIC8vICAgICAgICAgICAgICAgY29udGFpbmVkIGlzIHRoZSBtZXRob2QgYm9keSdzIHJldHVybiB0eXBlLgogICAgICAgIHJlY29yZFJldHVyblR5cGUoX3R5cGVzLnN5bmNTdGFySXRlcmFibGVUeXBlKTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgaXIuQXN5bmNNYXJrZXIuQXN5bmM6CiAgICAgICAgcmVjb3JkUmV0dXJuVHlwZShfdHlwZXMuYXN5bmNGdXR1cmVUeXBlKTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgaXIuQXN5bmNNYXJrZXIuQXN5bmNTdGFyOgogICAgICAgIHJlY29yZFJldHVyblR5cGUoX3R5cGVzLmFzeW5jU3RhclN0cmVhbVR5cGUpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIGlyLkFzeW5jTWFya2VyLlN5bmNZaWVsZGluZzoKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgX2FuYWx5emVkTWVtYmVyLCAiVW5leHBlY3RlZCBhc3luYyBtYXJrZXI6ICR7bm9kZS5hc3luY01hcmtlcn0iKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIGFzc2VydChfYnJlYWtzRm9yLmlzRW1wdHkpOwogICAgYXNzZXJ0KF9jb250aW51ZXNGb3IuaXNFbXB0eSk7CiAgICByZXR1cm4gX3JldHVyblR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRJbnN0YW50aWF0aW9uKGlyLkluc3RhbnRpYXRpb24gbm9kZSkgewogICAgcmV0dXJuIGNyZWF0ZUluc3RhbnRpYXRpb25UeXBlSW5mb3JtYXRpb24odmlzaXQobm9kZS5leHByZXNzaW9uKSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gY3JlYXRlSW5zdGFudGlhdGlvblR5cGVJbmZvcm1hdGlvbigKICAgICAgVHlwZUluZm9ybWF0aW9uIGV4cHJlc3Npb25UeXBlKSB7CiAgICAvLyBUT0RPKHNyYSk6IEFkZCBhIFR5cGVJbmZvcm1hdGlvbiBmb3IgSW5zdGFudGlhdGlvbnMuICBJbnN0YW50aWF0ZWQKICAgIC8vIGdlbmVyaWMgbWV0aG9kcyB3aWxsIG5lZWQgdG8gYmUgdHJhY2VkIHNlcGFyYXRlbHksIGFuZCBoYXZlIHRoZQogICAgLy8gaW5mb3JtYXRpb24gZ2F0aGVyZWQgaW4gdHJhY2luZyByZWZsZWN0ZWQgYmFjayB0byB0aGUgZ2VuZXJpYyBtZXRob2QuIEZvcgogICAgLy8gbm93LCBwYXNzIGFsb25nIHRoZSB1bmluc3RhbnRpYXRlZCBtZXRob2QuCiAgICByZXR1cm4gZXhwcmVzc2lvblR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gZGVmYXVsdEV4cHJlc3Npb24oaXIuRXhwcmVzc2lvbiBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKAogICAgICAgICdVbmhhbmRsZWQgZXhwcmVzc2lvbjogJHtub2RlfSAoJHtub2RlLnJ1bnRpbWVUeXBlfSknKTsKICB9CgogIEBvdmVycmlkZQogIGRlZmF1bHRTdGF0ZW1lbnQoaXIuU3RhdGVtZW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgJ1VuaGFuZGxlZCBzdGF0ZW1lbnQ6ICR7bm9kZX0gKCR7bm9kZS5ydW50aW1lVHlwZX0pJyk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXROdWxsTGl0ZXJhbChpci5OdWxsTGl0ZXJhbCBsaXRlcmFsKSB7CiAgICByZXR1cm4gY3JlYXRlTnVsbFR5cGVJbmZvcm1hdGlvbigpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGNyZWF0ZU51bGxUeXBlSW5mb3JtYXRpb24oKSB7CiAgICByZXR1cm4gX3R5cGVzLm51bGxUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRCbG9jayhpci5CbG9jayBibG9jaykgewogICAgZm9yIChpci5TdGF0ZW1lbnQgc3RhdGVtZW50IGluIGJsb2NrLnN0YXRlbWVudHMpIHsKICAgICAgdmlzaXQoc3RhdGVtZW50KTsKICAgICAgaWYgKF9zdGF0ZS5hYm9ydHMpIGJyZWFrOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoaXIuRXhwcmVzc2lvblN0YXRlbWVudCBub2RlKSB7CiAgICB2aXNpdChub2RlLmV4cHJlc3Npb24pOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEVtcHR5U3RhdGVtZW50KGlyLkVtcHR5U3RhdGVtZW50IG5vZGUpIHsKICAgIC8vIE5vdGhpbmcgdG8gZG8uCiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0QXNzZXJ0U3RhdGVtZW50KGlyLkFzc2VydFN0YXRlbWVudCBub2RlKSB7CiAgICAvLyBBdm9pZCBwb2xsdXRpb24gZnJvbSBhc3NlcnQgc3RhdGVtZW50IHVubGVzcyBlbmFibGVkLgogICAgaWYgKCFfb3B0aW9ucy5lbmFibGVVc2VyQXNzZXJ0aW9ucykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFNob3VsZCBhc3NlcnQgYmUgdXNlZCB3aXRoIC0tdHJ1c3QtdHlwZS1hbm5vdGF0aW9ucz8KICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFRyYWNrIHJlYWNoYWJsZSBmb3IgYXNzZXJ0aW9ucyBrbm93biB0byBmYWlsLgogICAgTG9jYWxTdGF0ZSBzdGF0ZUJlZm9yZSA9IF9zdGF0ZTsKICAgIGhhbmRsZUNvbmRpdGlvbihub2RlLmNvbmRpdGlvbik7CiAgICBMb2NhbFN0YXRlIGFmdGVyQ29uZGl0aW9uV2hlblRydWUgPSBfc3RhdGVBZnRlcldoZW5UcnVlOwogICAgTG9jYWxTdGF0ZSBhZnRlckNvbmRpdGlvbldoZW5GYWxzZSA9IF9zdGF0ZUFmdGVyV2hlbkZhbHNlOwogICAgX3N0YXRlID0gbmV3IExvY2FsU3RhdGUuY2hpbGRQYXRoKGFmdGVyQ29uZGl0aW9uV2hlbkZhbHNlKTsKICAgIHZpc2l0KG5vZGUubWVzc2FnZSk7CiAgICBMb2NhbFN0YXRlIHN0YXRlQWZ0ZXJNZXNzYWdlID0gX3N0YXRlOwogICAgc3RhdGVBZnRlck1lc3NhZ2Uuc2VlblJldHVybk9yVGhyb3cgPSB0cnVlOwogICAgX3N0YXRlID0gc3RhdGVCZWZvcmUubWVyZ2VEaWFtb25kRmxvdygKICAgICAgICBfaW5mZXJyZXIsIGFmdGVyQ29uZGl0aW9uV2hlblRydWUsIHN0YXRlQWZ0ZXJNZXNzYWdlKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRCcmVha1N0YXRlbWVudChpci5CcmVha1N0YXRlbWVudCBub2RlKSB7CiAgICBKdW1wVGFyZ2V0IHRhcmdldCA9IF9sb2NhbHNNYXAuZ2V0SnVtcFRhcmdldEZvckJyZWFrKG5vZGUpOwogICAgX3N0YXRlLnNlZW5CcmVha09yQ29udGludWUgPSB0cnVlOwogICAgLy8gRG8gYSBkZWVwLWNvcHkgb2YgdGhlIGxvY2FscywgYmVjYXVzZSB0aGUgY29kZSBmb2xsb3dpbmcgdGhlCiAgICAvLyBicmVhayB3aWxsIGNoYW5nZSB0aGVtLgogICAgaWYgKF9sb2NhbHNNYXAuZ2VuZXJhdGVDb250aW51ZUZvckJyZWFrKG5vZGUpKSB7CiAgICAgIF9jb250aW51ZXNGb3JbdGFyZ2V0XS5hZGQobmV3IExvY2FsU3RhdGUuZGVlcENvcHlPZihfc3RhdGUpKTsKICAgIH0gZWxzZSB7CiAgICAgIF9icmVha3NGb3JbdGFyZ2V0XS5hZGQobmV3IExvY2FsU3RhdGUuZGVlcENvcHlPZihfc3RhdGUpKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRMYWJlbGVkU3RhdGVtZW50KGlyLkxhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgewogICAgaXIuU3RhdGVtZW50IGJvZHkgPSBub2RlLmJvZHk7CiAgICBpZiAoSnVtcFZpc2l0b3IuY2FuQmVCcmVha1RhcmdldChib2R5KSkgewogICAgICAvLyBMb29wcyBhbmQgc3dpdGNoZXMgaGFuZGxlIHRoZWlyIG93biBsYWJlbHMuCiAgICAgIHZpc2l0KGJvZHkpOwogICAgfSBlbHNlIHsKICAgICAgSnVtcFRhcmdldCBqdW1wVGFyZ2V0ID0gX2xvY2Fsc01hcC5nZXRKdW1wVGFyZ2V0Rm9yTGFiZWwobm9kZSk7CiAgICAgIF9zZXR1cEJyZWFrc0FuZENvbnRpbnVlcyhqdW1wVGFyZ2V0KTsKICAgICAgdmlzaXQoYm9keSk7CiAgICAgIF9zdGF0ZS5tZXJnZUFmdGVyQnJlYWtzKF9pbmZlcnJlciwgX2dldEJyZWFrcyhqdW1wVGFyZ2V0KSk7CiAgICAgIF9jbGVhckJyZWFrc0FuZENvbnRpbnVlcyhqdW1wVGFyZ2V0KTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRTd2l0Y2hTdGF0ZW1lbnQoaXIuU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIHZpc2l0KG5vZGUuZXhwcmVzc2lvbik7CgogICAgSnVtcFRhcmdldCBqdW1wVGFyZ2V0ID0gX2xvY2Fsc01hcC5nZXRKdW1wVGFyZ2V0Rm9yU3dpdGNoKG5vZGUpOwogICAgX3NldHVwQnJlYWtzQW5kQ29udGludWVzKGp1bXBUYXJnZXQpOwoKICAgIExpc3Q8SnVtcFRhcmdldD4gY29udGludWVUYXJnZXRzID0gPEp1bXBUYXJnZXQ+W107CiAgICBmb3IgKGlyLlN3aXRjaENhc2Ugc3dpdGNoQ2FzZSBpbiBub2RlLmNhc2VzKSB7CiAgICAgIEp1bXBUYXJnZXQgY29udGludWVUYXJnZXQgPQogICAgICAgICAgX2xvY2Fsc01hcC5nZXRKdW1wVGFyZ2V0Rm9yU3dpdGNoQ2FzZShzd2l0Y2hDYXNlKTsKICAgICAgaWYgKGNvbnRpbnVlVGFyZ2V0ICE9IG51bGwpIHsKICAgICAgICBjb250aW51ZVRhcmdldHMuYWRkKGNvbnRpbnVlVGFyZ2V0KTsKICAgICAgfQogICAgfQogICAgaWYgKGNvbnRpbnVlVGFyZ2V0cy5pc05vdEVtcHR5KSB7CiAgICAgIGNvbnRpbnVlVGFyZ2V0cy5mb3JFYWNoKF9zZXR1cEJyZWFrc0FuZENvbnRpbnVlcyk7CgogICAgICAvLyBJZiB0aGUgc3dpdGNoIHN0YXRlbWVudCBoYXMgYSBjb250aW51ZSwgd2UgY29uc2VydmF0aXZlbHkKICAgICAgLy8gdmlzaXQgYWxsIGNhc2VzIGFuZCB1cGRhdGUgW2xvY2Fsc10gdW50aWwgd2UgaGF2ZSByZWFjaGVkIGEKICAgICAgLy8gZml4ZWQgcG9pbnQuCiAgICAgIGJvb2wgY2hhbmdlZDsKICAgICAgX3N0YXRlLnN0YXJ0TG9vcChfaW5mZXJyZXIsIG5vZGUpOwogICAgICBkbyB7CiAgICAgICAgY2hhbmdlZCA9IGZhbHNlOwogICAgICAgIGZvciAoaXIuU3dpdGNoQ2FzZSBzd2l0Y2hDYXNlIGluIG5vZGUuY2FzZXMpIHsKICAgICAgICAgIExvY2FsU3RhdGUgc3RhdGVCZWZvcmVDYXNlID0gX3N0YXRlOwogICAgICAgICAgX3N0YXRlID0gbmV3IExvY2FsU3RhdGUuY2hpbGRQYXRoKHN0YXRlQmVmb3JlQ2FzZSk7CiAgICAgICAgICB2aXNpdChzd2l0Y2hDYXNlKTsKICAgICAgICAgIExvY2FsU3RhdGUgc3RhdGVBZnRlckNhc2UgPSBfc3RhdGU7CiAgICAgICAgICBjaGFuZ2VkID0KICAgICAgICAgICAgICBzdGF0ZUJlZm9yZUNhc2UubWVyZ2VBbGwoX2luZmVycmVyLCBbc3RhdGVBZnRlckNhc2VdKSB8fCBjaGFuZ2VkOwogICAgICAgICAgX3N0YXRlID0gc3RhdGVCZWZvcmVDYXNlOwogICAgICAgIH0KICAgICAgfSB3aGlsZSAoY2hhbmdlZCk7CiAgICAgIF9zdGF0ZS5lbmRMb29wKF9pbmZlcnJlciwgbm9kZSk7CgogICAgICBjb250aW51ZVRhcmdldHMuZm9yRWFjaChfY2xlYXJCcmVha3NBbmRDb250aW51ZXMpOwogICAgfSBlbHNlIHsKICAgICAgTG9jYWxTdGF0ZSBzdGF0ZUJlZm9yZUNhc2UgPSBfc3RhdGU7CiAgICAgIExpc3Q8TG9jYWxTdGF0ZT4gc3RhdGVzVG9NZXJnZSA9IDxMb2NhbFN0YXRlPltdOwogICAgICBib29sIGhhc0RlZmF1bHRDYXNlID0gZmFsc2U7CgogICAgICBmb3IgKGlyLlN3aXRjaENhc2Ugc3dpdGNoQ2FzZSBpbiBub2RlLmNhc2VzKSB7CiAgICAgICAgaWYgKHN3aXRjaENhc2UuaXNEZWZhdWx0KSB7CiAgICAgICAgICBoYXNEZWZhdWx0Q2FzZSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIF9zdGF0ZSA9IG5ldyBMb2NhbFN0YXRlLmNoaWxkUGF0aChzdGF0ZUJlZm9yZUNhc2UpOwogICAgICAgIHZpc2l0KHN3aXRjaENhc2UpOwogICAgICAgIHN0YXRlc1RvTWVyZ2UuYWRkKF9zdGF0ZSk7CiAgICAgIH0KICAgICAgc3RhdGVCZWZvcmVDYXNlLm1lcmdlQWZ0ZXJCcmVha3MoX2luZmVycmVyLCBzdGF0ZXNUb01lcmdlLAogICAgICAgICAga2VlcE93bkxvY2FsczogIWhhc0RlZmF1bHRDYXNlKTsKICAgICAgX3N0YXRlID0gc3RhdGVCZWZvcmVDYXNlOwogICAgfQogICAgX2NsZWFyQnJlYWtzQW5kQ29udGludWVzKGp1bXBUYXJnZXQpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN3aXRjaENhc2UoaXIuU3dpdGNoQ2FzZSBub2RlKSB7CiAgICB2aXNpdChub2RlLmJvZHkpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENvbnRpbnVlU3dpdGNoU3RhdGVtZW50KGlyLkNvbnRpbnVlU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIEp1bXBUYXJnZXQgdGFyZ2V0ID0gX2xvY2Fsc01hcC5nZXRKdW1wVGFyZ2V0Rm9yQ29udGludWVTd2l0Y2gobm9kZSk7CiAgICBfc3RhdGUuc2VlbkJyZWFrT3JDb250aW51ZSA9IHRydWU7CiAgICAvLyBEbyBhIGRlZXAtY29weSBvZiB0aGUgbG9jYWxzLCBiZWNhdXNlIHRoZSBjb2RlIGZvbGxvd2luZyB0aGUKICAgIC8vIGJyZWFrIHdpbGwgY2hhbmdlIHRoZW0uCiAgICBfY29udGludWVzRm9yW3RhcmdldF0uYWRkKG5ldyBMb2NhbFN0YXRlLmRlZXBDb3B5T2YoX3N0YXRlKSk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdExpc3RMaXRlcmFsKGlyLkxpc3RMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBjcmVhdGVMaXN0VHlwZUluZm9ybWF0aW9uKAogICAgICAgIG5vZGUsIG5vZGUuZXhwcmVzc2lvbnMubWFwKChlKSA9PiB2aXNpdChlKSksCiAgICAgICAgaXNDb25zdDogbm9kZS5pc0NvbnN0KTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiBjcmVhdGVMaXN0VHlwZUluZm9ybWF0aW9uKAogICAgICBpci5UcmVlTm9kZSBub2RlLCBJdGVyYWJsZTxUeXBlSW5mb3JtYXRpb24+IGVsZW1lbnRUeXBlcywKICAgICAge2Jvb2wgaXNDb25zdH0pIHsKICAgIC8vIFdlIG9ubHkgc2V0IHRoZSB0eXBlIG9uY2UuIFdlIGRvbid0IG5lZWQgdG8gcmUtdmlzaXQgdGhlIGNoaWxkcmVuCiAgICAvLyB3aGVuIHJlLWFuYWx5emluZyB0aGUgbm9kZS4KICAgIHJldHVybiBfaW5mZXJyZXIuY29uY3JldGVUeXBlcy5wdXRJZkFic2VudChub2RlLCAoKSB7CiAgICAgIFR5cGVJbmZvcm1hdGlvbiBlbGVtZW50VHlwZTsKICAgICAgaW50IGxlbmd0aCA9IDA7CiAgICAgIGZvciAoVHlwZUluZm9ybWF0aW9uIHR5cGUgaW4gZWxlbWVudFR5cGVzKSB7CiAgICAgICAgZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZSA9PSBudWxsCiAgICAgICAgICAgID8gX3R5cGVzLmFsbG9jYXRlUGhpKG51bGwsIG51bGwsIHR5cGUsIGlzVHJ5OiBmYWxzZSkKICAgICAgICAgICAgOiBfdHlwZXMuYWRkUGhpSW5wdXQobnVsbCwgZWxlbWVudFR5cGUsIHR5cGUpOwogICAgICAgIGxlbmd0aCsrOwogICAgICB9CiAgICAgIGVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGUgPT0gbnVsbAogICAgICAgICAgPyBfdHlwZXMubm9uTnVsbEVtcHR5KCkKICAgICAgICAgIDogX3R5cGVzLnNpbXBsaWZ5UGhpKG51bGwsIG51bGwsIGVsZW1lbnRUeXBlKTsKICAgICAgVHlwZUluZm9ybWF0aW9uIGNvbnRhaW5lclR5cGUgPQogICAgICAgICAgaXNDb25zdCA/IF90eXBlcy5jb25zdExpc3RUeXBlIDogX3R5cGVzLmdyb3dhYmxlTGlzdFR5cGU7CiAgICAgIHJldHVybiBfdHlwZXMuYWxsb2NhdGVMaXN0KAogICAgICAgICAgY29udGFpbmVyVHlwZSwgbm9kZSwgX2FuYWx5emVkTWVtYmVyLCBlbGVtZW50VHlwZSwgbGVuZ3RoKTsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0U2V0TGl0ZXJhbChpci5TZXRMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBjcmVhdGVTZXRUeXBlSW5mb3JtYXRpb24obm9kZSwgbm9kZS5leHByZXNzaW9ucy5tYXAoKGUpID0+IHZpc2l0KGUpKSwKICAgICAgICBpc0NvbnN0OiBub2RlLmlzQ29uc3QpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGNyZWF0ZVNldFR5cGVJbmZvcm1hdGlvbigKICAgICAgaXIuVHJlZU5vZGUgbm9kZSwgSXRlcmFibGU8VHlwZUluZm9ybWF0aW9uPiBlbGVtZW50VHlwZXMsCiAgICAgIHtib29sIGlzQ29uc3R9KSB7CiAgICByZXR1cm4gX2luZmVycmVyLmNvbmNyZXRlVHlwZXMucHV0SWZBYnNlbnQobm9kZSwgKCkgewogICAgICBUeXBlSW5mb3JtYXRpb24gZWxlbWVudFR5cGU7CiAgICAgIGZvciAoVHlwZUluZm9ybWF0aW9uIHR5cGUgaW4gZWxlbWVudFR5cGVzKSB7CiAgICAgICAgZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZSA9PSBudWxsCiAgICAgICAgICAgID8gX3R5cGVzLmFsbG9jYXRlUGhpKG51bGwsIG51bGwsIHR5cGUsIGlzVHJ5OiBmYWxzZSkKICAgICAgICAgICAgOiBfdHlwZXMuYWRkUGhpSW5wdXQobnVsbCwgZWxlbWVudFR5cGUsIHR5cGUpOwogICAgICB9CiAgICAgIGVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGUgPT0gbnVsbAogICAgICAgICAgPyBfdHlwZXMubm9uTnVsbEVtcHR5KCkKICAgICAgICAgIDogX3R5cGVzLnNpbXBsaWZ5UGhpKG51bGwsIG51bGwsIGVsZW1lbnRUeXBlKTsKICAgICAgVHlwZUluZm9ybWF0aW9uIGNvbnRhaW5lclR5cGUgPQogICAgICAgICAgaXNDb25zdCA/IF90eXBlcy5jb25zdFNldFR5cGUgOiBfdHlwZXMuc2V0VHlwZTsKICAgICAgcmV0dXJuIF90eXBlcy5hbGxvY2F0ZVNldCgKICAgICAgICAgIGNvbnRhaW5lclR5cGUsIG5vZGUsIF9hbmFseXplZE1lbWJlciwgZWxlbWVudFR5cGUpOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRNYXBMaXRlcmFsKGlyLk1hcExpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIGNyZWF0ZU1hcFR5cGVJbmZvcm1hdGlvbigKICAgICAgICBub2RlLCBub2RlLmVudHJpZXMubWFwKChlKSA9PiBuZXcgUGFpcih2aXNpdChlLmtleSksIHZpc2l0KGUudmFsdWUpKSksCiAgICAgICAgaXNDb25zdDogbm9kZS5pc0NvbnN0KTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiBjcmVhdGVNYXBUeXBlSW5mb3JtYXRpb24oaXIuVHJlZU5vZGUgbm9kZSwKICAgICAgSXRlcmFibGU8UGFpcjxUeXBlSW5mb3JtYXRpb24sIFR5cGVJbmZvcm1hdGlvbj4+IGVudHJ5VHlwZXMsCiAgICAgIHtib29sIGlzQ29uc3R9KSB7CiAgICByZXR1cm4gX2luZmVycmVyLmNvbmNyZXRlVHlwZXMucHV0SWZBYnNlbnQobm9kZSwgKCkgewogICAgICBMaXN0IGtleVR5cGVzID0gPFR5cGVJbmZvcm1hdGlvbj5bXTsKICAgICAgTGlzdCB2YWx1ZVR5cGVzID0gPFR5cGVJbmZvcm1hdGlvbj5bXTsKCiAgICAgIGZvciAoUGFpcjxUeXBlSW5mb3JtYXRpb24sIFR5cGVJbmZvcm1hdGlvbj4gZW50cnlUeXBlIGluIGVudHJ5VHlwZXMpIHsKICAgICAgICBrZXlUeXBlcy5hZGQoZW50cnlUeXBlLmEpOwogICAgICAgIHZhbHVlVHlwZXMuYWRkKGVudHJ5VHlwZS5iKTsKICAgICAgfQoKICAgICAgVHlwZUluZm9ybWF0aW9uIHR5cGUgPSBpc0NvbnN0ID8gX3R5cGVzLmNvbnN0TWFwVHlwZSA6IF90eXBlcy5tYXBUeXBlOwogICAgICByZXR1cm4gX3R5cGVzLmFsbG9jYXRlTWFwKAogICAgICAgICAgdHlwZSwgbm9kZSwgX2FuYWx5emVkTWVtYmVyLCBrZXlUeXBlcywgdmFsdWVUeXBlcyk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdFJldHVyblN0YXRlbWVudChpci5SZXR1cm5TdGF0ZW1lbnQgbm9kZSkgewogICAgaXIuTm9kZSBleHByZXNzaW9uID0gbm9kZS5leHByZXNzaW9uOwogICAgcmVjb3JkUmV0dXJuVHlwZShleHByZXNzaW9uID09IG51bGwgPyBfdHlwZXMubnVsbFR5cGUgOiB2aXNpdChleHByZXNzaW9uKSk7CiAgICBfc3RhdGUuc2VlblJldHVybk9yVGhyb3cgPSB0cnVlOwogICAgX3N0YXRlLm1hcmtJbml0aWFsaXphdGlvbkFzSW5kZWZpbml0ZSgpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRCb29sTGl0ZXJhbChpci5Cb29sTGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gY3JlYXRlQm9vbFR5cGVJbmZvcm1hdGlvbihub2RlLnZhbHVlKTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiBjcmVhdGVCb29sVHlwZUluZm9ybWF0aW9uKGJvb2wgdmFsdWUpIHsKICAgIHJldHVybiBfdHlwZXMuYm9vbExpdGVyYWxUeXBlKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdEludExpdGVyYWwoaXIuSW50TGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gY3JlYXRlSW50VHlwZUluZm9ybWF0aW9uKG5vZGUudmFsdWUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGNyZWF0ZUludFR5cGVJbmZvcm1hdGlvbihpbnQgdmFsdWUpIHsKICAgIC8vIFRoZSBKYXZhU2NyaXB0IGJhY2tlbmQgbWF5IHR1cm4gdGhpcyBsaXRlcmFsIGludG8gYSBkb3VibGUgYXQKICAgIC8vIHJ1bnRpbWUuCiAgICByZXR1cm4gX3R5cGVzLmdldENvbmNyZXRlVHlwZUZvcihfY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgIC5jb21wdXRlQWJzdHJhY3RWYWx1ZUZvckNvbnN0YW50KAogICAgICAgICAgICBjb25zdGFudF9zeXN0ZW0uY3JlYXRlSW50RnJvbUludCh2YWx1ZSkpKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdERvdWJsZUxpdGVyYWwoaXIuRG91YmxlTGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gY3JlYXRlRG91YmxlVHlwZUluZm9ybWF0aW9uKG5vZGUudmFsdWUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGNyZWF0ZURvdWJsZVR5cGVJbmZvcm1hdGlvbihkb3VibGUgdmFsdWUpIHsKICAgIC8vIFRoZSBKYXZhU2NyaXB0IGJhY2tlbmQgbWF5IHR1cm4gdGhpcyBsaXRlcmFsIGludG8gYSBkb3VibGUgYXQKICAgIC8vIHJ1bnRpbWUuCiAgICByZXR1cm4gX3R5cGVzLmdldENvbmNyZXRlVHlwZUZvcihfY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgIC5jb21wdXRlQWJzdHJhY3RWYWx1ZUZvckNvbnN0YW50KGNvbnN0YW50X3N5c3RlbS5jcmVhdGVEb3VibGUodmFsdWUpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRTdHJpbmdMaXRlcmFsKGlyLlN0cmluZ0xpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIGNyZWF0ZVN0cmluZ1R5cGVJbmZvcm1hdGlvbihub2RlLnZhbHVlKTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiBjcmVhdGVTdHJpbmdUeXBlSW5mb3JtYXRpb24oU3RyaW5nIHZhbHVlKSB7CiAgICByZXR1cm4gX3R5cGVzLnN0cmluZ0xpdGVyYWxUeXBlKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oaXIuU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICAvLyBJbnRlcnBvbGF0aW9uIGNvdWxkIGhhdmUgYW55IGVmZmVjdHMgc2luY2UgaXQgY291bGQgY2FsbCBhbnkgdG9TdHJpbmcoKQogICAgLy8gbWV0aG9kLgogICAgLy8gVE9ETyhzcmEpOiBUaGlzIGNvdWxkIGJlIG1vZGVsbGVkIGJ5IGEgY2FsbCB0byB0b1N0cmluZygpIGJ1dCB3aXRoIGEKICAgIC8vIGd1YXJhbnRlZWQgU3RyaW5nIHJldHVybiB0eXBlLiAgSW50ZXJwb2xhdGlvbiBvZiBrbm93biB0eXBlcyB3b3VsZCBnZXQKICAgIC8vIHNwZWNpYWxpemVkIGVmZmVjdHMuICBUaGlzIHdvdWxkIG5vdCBjdXJyZW50bHkgYmUgZWZmZWN0aXZlIHNpbmNlIHRoZSBKUwogICAgLy8gY29kZSBpbiB0aGUgdG9TdHJpbmcgbWV0aG9kcyBmb3IgaW50ZXJjZXB0ZWQgcHJpbWl0aXZlIHR5cGVzIGlzIGFzc3VtZWQKICAgIC8vIHRvIGhhdmUgYWxsIGVmZmVjdHMuICBFZmZlY3QgYW5ub3RhdGlvbnMgb24gSlMgY29kZSB3b3VsZCBiZSBuZWVkZWQgdG8KICAgIC8vIGdldCB0aGUgYmVuZWZpdC4KICAgIF9zaWRlRWZmZWN0c0J1aWxkZXIuc2V0QWxsU2lkZUVmZmVjdHMoKTsKCiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgICByZXR1cm4gX3R5cGVzLnN0cmluZ1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRTeW1ib2xMaXRlcmFsKGlyLlN5bWJvbExpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIGNyZWF0ZVN5bWJvbExpdGVyYWxUeXBlSW5mb3JtYXRpb24oKTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiBjcmVhdGVTeW1ib2xMaXRlcmFsVHlwZUluZm9ybWF0aW9uKCkgewogICAgcmV0dXJuIF90eXBlcwogICAgICAgIC5ub25OdWxsU3VidHlwZShfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuc3ltYm9sSW1wbGVtZW50YXRpb25DbGFzcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRUeXBlTGl0ZXJhbChpci5UeXBlTGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gY3JlYXRlVHlwZUxpdGVyYWxJbmZvcm1hdGlvbigpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGNyZWF0ZVR5cGVMaXRlcmFsSW5mb3JtYXRpb24oKSB7CiAgICByZXR1cm4gX3R5cGVzLnR5cGVUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIGFzc2VydCgKICAgICAgICBub2RlLnBhcmVudCBpcyEgaXIuRnVuY3Rpb25Ob2RlLCAiVW5leHBlY3RlZCBwYXJhbWV0ZXIgZGVjbGFyYXRpb24uIik7CiAgICBMb2NhbCBsb2NhbCA9IF9sb2NhbHNNYXAuZ2V0TG9jYWxWYXJpYWJsZShub2RlKTsKICAgIERhcnRUeXBlIHR5cGUgPSBfbG9jYWxzTWFwLmdldExvY2FsVHlwZShfZWxlbWVudE1hcCwgbG9jYWwpOwogICAgaWYgKG5vZGUuaW5pdGlhbGl6ZXIgPT0gbnVsbCkgewogICAgICBfc3RhdGUudXBkYXRlTG9jYWwoCiAgICAgICAgICBfaW5mZXJyZXIsIF9jYXB0dXJlZEFuZEJveGVkLCBsb2NhbCwgX3R5cGVzLm51bGxUeXBlLCBub2RlLCB0eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIF9zdGF0ZS51cGRhdGVMb2NhbChfaW5mZXJyZXIsIF9jYXB0dXJlZEFuZEJveGVkLCBsb2NhbCwKICAgICAgICAgIHZpc2l0KG5vZGUuaW5pdGlhbGl6ZXIpLCBub2RlLCB0eXBlKTsKICAgIH0KICAgIGlmIChub2RlLmluaXRpYWxpemVyIGlzIGlyLlRoaXNFeHByZXNzaW9uKSB7CiAgICAgIF9zdGF0ZS5tYXJrVGhpc0FzRXhwb3NlZCgpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRWYXJpYWJsZUdldChpci5WYXJpYWJsZUdldCBub2RlKSB7CiAgICBMb2NhbCBsb2NhbCA9IF9sb2NhbHNNYXAuZ2V0TG9jYWxWYXJpYWJsZShub2RlLnZhcmlhYmxlKTsKICAgIFR5cGVJbmZvcm1hdGlvbiB0eXBlID0KICAgICAgICBfc3RhdGUucmVhZExvY2FsKF9pbmZlcnJlciwgX2NhcHR1cmVkQW5kQm94ZWQsIGxvY2FsKTsKICAgIGFzc2VydCh0eXBlICE9IG51bGwsICJNaXNzaW5nIHR5cGUgaW5mb3JtYXRpb24gZm9yICRsb2NhbC4iKTsKICAgIHJldHVybiB0eXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0VmFyaWFibGVTZXQoaXIuVmFyaWFibGVTZXQgbm9kZSkgewogICAgVHlwZUluZm9ybWF0aW9uIHJoc1R5cGUgPSB2aXNpdChub2RlLnZhbHVlKTsKICAgIGlmIChub2RlLnZhbHVlIGlzIGlyLlRoaXNFeHByZXNzaW9uKSB7CiAgICAgIF9zdGF0ZS5tYXJrVGhpc0FzRXhwb3NlZCgpOwogICAgfQogICAgTG9jYWwgbG9jYWwgPSBfbG9jYWxzTWFwLmdldExvY2FsVmFyaWFibGUobm9kZS52YXJpYWJsZSk7CiAgICBEYXJ0VHlwZSB0eXBlID0gX2xvY2Fsc01hcC5nZXRMb2NhbFR5cGUoX2VsZW1lbnRNYXAsIGxvY2FsKTsKICAgIF9zdGF0ZS51cGRhdGVMb2NhbCgKICAgICAgICBfaW5mZXJyZXIsIF9jYXB0dXJlZEFuZEJveGVkLCBsb2NhbCwgcmhzVHlwZSwgbm9kZSwgdHlwZSk7CiAgICByZXR1cm4gcmhzVHlwZTsKICB9CgogIEFyZ3VtZW50c1R5cGVzIGFuYWx5emVBcmd1bWVudHMoaXIuQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgTGlzdDxUeXBlSW5mb3JtYXRpb24+IHBvc2l0aW9uYWwgPSA8VHlwZUluZm9ybWF0aW9uPltdOwogICAgTWFwPFN0cmluZywgVHlwZUluZm9ybWF0aW9uPiBuYW1lZDsKICAgIGZvciAoaXIuRXhwcmVzc2lvbiBhcmd1bWVudCBpbiBhcmd1bWVudHMucG9zaXRpb25hbCkgewogICAgICAvLyBUT0RPKG5nZW9mZnJheSk6IFdlIGNvdWxkIGRvIGJldHRlciBoZXJlIGlmIHdlIGtuZXcgd2hhdCB3ZQogICAgICAvLyBhcmUgY2FsbGluZyBkb2VzIG5vdCBleHBvc2UgdGhpcy4KICAgICAgaWYgKGFyZ3VtZW50IGlzIGlyLlRoaXNFeHByZXNzaW9uKSB7CiAgICAgICAgX3N0YXRlLm1hcmtUaGlzQXNFeHBvc2VkKCk7CiAgICAgIH0KICAgICAgcG9zaXRpb25hbC5hZGQodmlzaXQoYXJndW1lbnQpKTsKICAgIH0KICAgIGZvciAoaXIuTmFtZWRFeHByZXNzaW9uIGFyZ3VtZW50IGluIGFyZ3VtZW50cy5uYW1lZCkgewogICAgICBuYW1lZCA/Pz0gPFN0cmluZywgVHlwZUluZm9ybWF0aW9uPnt9OwogICAgICBpci5FeHByZXNzaW9uIHZhbHVlID0gYXJndW1lbnQudmFsdWU7CiAgICAgIC8vIFRPRE8obmdlb2ZmcmF5KTogV2UgY291bGQgZG8gYmV0dGVyIGhlcmUgaWYgd2Uga25ldyB3aGF0IHdlCiAgICAgIC8vIGFyZSBjYWxsaW5nIGRvZXMgbm90IGV4cG9zZSB0aGlzLgogICAgICBpZiAodmFsdWUgaXMgaXIuVGhpc0V4cHJlc3Npb24pIHsKICAgICAgICBfc3RhdGUubWFya1RoaXNBc0V4cG9zZWQoKTsKICAgICAgfQogICAgICBuYW1lZFthcmd1bWVudC5uYW1lXSA9IHZpc2l0KHZhbHVlKTsKICAgIH0KCiAgICByZXR1cm4gbmV3IEFyZ3VtZW50c1R5cGVzKHBvc2l0aW9uYWwsIG5hbWVkKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdE1ldGhvZEludm9jYXRpb24oaXIuTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICBTZWxlY3RvciBzZWxlY3RvciA9IF9lbGVtZW50TWFwLmdldFNlbGVjdG9yKG5vZGUpOwogICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gX21lbWJlckRhdGEudHlwZU9mU2VuZChub2RlKTsKCiAgICBpci5UcmVlTm9kZSByZWNlaXZlciA9IG5vZGUucmVjZWl2ZXI7CiAgICBpZiAocmVjZWl2ZXIgaXMgaXIuVmFyaWFibGVHZXQgJiYKICAgICAgICByZWNlaXZlci52YXJpYWJsZS5wYXJlbnQgaXMgaXIuRnVuY3Rpb25EZWNsYXJhdGlvbikgewogICAgICAvLyBUaGlzIGlzIGFuIGludm9jYXRpb24gb2YgYSBuYW1lZCBsb2NhbCBmdW5jdGlvbi4KICAgICAgQXJndW1lbnRzVHlwZXMgYXJndW1lbnRzID0gYW5hbHl6ZUFyZ3VtZW50cyhub2RlLmFyZ3VtZW50cyk7CiAgICAgIENsb3N1cmVSZXByZXNlbnRhdGlvbkluZm8gaW5mbyA9CiAgICAgICAgICBfY2xvc3VyZURhdGFMb29rdXAuZ2V0Q2xvc3VyZUluZm8ocmVjZWl2ZXIudmFyaWFibGUucGFyZW50KTsKICAgICAgaWYgKGlzSW5jb21wYXRpYmxlSW52b2tlKGluZm8uY2FsbE1ldGhvZCwgYXJndW1lbnRzKSkgewogICAgICAgIHJldHVybiBfdHlwZXMuZHluYW1pY1R5cGU7CiAgICAgIH0KCiAgICAgIFR5cGVJbmZvcm1hdGlvbiB0eXBlID0KICAgICAgICAgIGhhbmRsZVN0YXRpY0ludm9rZShub2RlLCBzZWxlY3RvciwgbWFzaywgaW5mby5jYWxsTWV0aG9kLCBhcmd1bWVudHMpOwogICAgICBGdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlID0KICAgICAgICAgIF9lbGVtZW50TWFwLmVsZW1lbnRFbnZpcm9ubWVudC5nZXRGdW5jdGlvblR5cGUoaW5mby5jYWxsTWV0aG9kKTsKICAgICAgaWYgKGZ1bmN0aW9uVHlwZS5yZXR1cm5UeXBlLmNvbnRhaW5zRnJlZVR5cGVWYXJpYWJsZXMpIHsKICAgICAgICAvLyBUaGUgcmV0dXJuIHR5cGUgdmFyaWVzIHdpdGggdGhlIGNhbGwgc2l0ZSBzbyB3ZSBuYXJyb3cgdGhlIHN0YXRpYwogICAgICAgIC8vIHJldHVybiB0eXBlLgogICAgICAgIHR5cGUgPSBfdHlwZXMubmFycm93VHlwZSh0eXBlLCBfZ2V0U3RhdGljVHlwZShub2RlKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHR5cGU7CiAgICB9CgogICAgVHlwZUluZm9ybWF0aW9uIHJlY2VpdmVyVHlwZSA9IHZpc2l0KHJlY2VpdmVyKTsKICAgIEFyZ3VtZW50c1R5cGVzIGFyZ3VtZW50cyA9IGFuYWx5emVBcmd1bWVudHMobm9kZS5hcmd1bWVudHMpOwogICAgaWYgKHNlbGVjdG9yLm5hbWUgPT0gJz09JykgewogICAgICBpZiAoX3R5cGVzLmlzTnVsbChyZWNlaXZlclR5cGUpKSB7CiAgICAgICAgLy8gbnVsbCA9PSBvCiAgICAgICAgX3BvdGVudGlhbGx5QWRkTnVsbENoZWNrKG5vZGUsIG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwuZmlyc3QpOwogICAgICAgIHJldHVybiBfdHlwZXMuYm9vbFR5cGU7CiAgICAgIH0gZWxzZSBpZiAoX3R5cGVzLmlzTnVsbChhcmd1bWVudHMucG9zaXRpb25hbFswXSkpIHsKICAgICAgICAvLyBvID09IG51bGwKICAgICAgICBfcG90ZW50aWFsbHlBZGROdWxsQ2hlY2sobm9kZSwgbm9kZS5yZWNlaXZlcik7CiAgICAgICAgcmV0dXJuIF90eXBlcy5ib29sVHlwZTsKICAgICAgfQogICAgfQogICAgaWYgKG5vZGUucmVjZWl2ZXIgaXMgaXIuVGhpc0V4cHJlc3Npb24pIHsKICAgICAgX2NoZWNrSWZFeHBvc2VzVGhpcygKICAgICAgICAgIHNlbGVjdG9yLCBfdHlwZXMubmV3VHlwZWRTZWxlY3RvcihyZWNlaXZlclR5cGUsIG1hc2spKTsKICAgIH0KICAgIFR5cGVJbmZvcm1hdGlvbiB0eXBlID0gaGFuZGxlRHluYW1pY0ludm9rZSgKICAgICAgICBDYWxsVHlwZS5hY2Nlc3MsIG5vZGUsIHNlbGVjdG9yLCBtYXNrLCByZWNlaXZlclR5cGUsIGFyZ3VtZW50cyk7CiAgICBpci5NZW1iZXIgaW50ZXJmYWNlVGFyZ2V0ID0gbm9kZS5pbnRlcmZhY2VUYXJnZXQ7CiAgICBpZiAoaW50ZXJmYWNlVGFyZ2V0ICE9IG51bGwpIHsKICAgICAgaWYgKGludGVyZmFjZVRhcmdldCBpcyBpci5Qcm9jZWR1cmUgJiYKICAgICAgICAgIChpbnRlcmZhY2VUYXJnZXQua2luZCA9PSBpci5Qcm9jZWR1cmVLaW5kLk1ldGhvZCB8fAogICAgICAgICAgICAgIGludGVyZmFjZVRhcmdldC5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuT3BlcmF0b3IpKSB7CiAgICAgICAgLy8gUHVsbCB0aGUgdHlwZSBmcm9tIGtlcm5lbCAoaW5zdGVhZCBvZiBmcm9tIHRoZSBKLW1vZGVsKSBiZWNhdXNlIHRoZQogICAgICAgIC8vIGludGVyZmFjZSB0YXJnZXQgbWlnaHQgYmUgYWJzdHJhY3QgYW5kIHRoZXJlZm9yZSBub3QgcGFydCBvZiB0aGUKICAgICAgICAvLyBKLW1vZGVsLgogICAgICAgIGlyLkRhcnRUeXBlIHJldHVyblR5cGUgPSBpbnRlcmZhY2VUYXJnZXQuZnVuY3Rpb24ucmV0dXJuVHlwZTsKICAgICAgICAvLyBUaGUgcmV0dXJuIHR5cGUgdmFyaWVzIHdpdGggdGhlIGNhbGwgc2l0ZSBzbyB3ZSBuYXJyb3cgdGhlIHN0YXRpYwogICAgICAgIC8vIHJldHVybiB0eXBlLgogICAgICAgIGlmIChjb250YWluc0ZyZWVWYXJpYWJsZXMocmV0dXJuVHlwZSkpIHsKICAgICAgICAgIHR5cGUgPSBfdHlwZXMubmFycm93VHlwZSh0eXBlLCBfZ2V0U3RhdGljVHlwZShub2RlKSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRoZSByZXR1cm4gdHlwZSBpcyB0aHJvd24gYXdheSB3aGVuIHVzaW5nIFtUeXBlTWFza11zOyBuYXJyb3cgdG8gdGhlCiAgICAgICAgLy8gc3RhdGljIHJldHVybiB0eXBlLgogICAgICAgIHR5cGUgPSBfdHlwZXMubmFycm93VHlwZSh0eXBlLCBfZ2V0U3RhdGljVHlwZShub2RlKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIFdlIGRvbid0IGhhdmUgYSBrbm93biB0YXJnZXQgYnV0IHRoZSBzdGF0aWMgdHlwZSBob2xkIHNvbWUgaW5mb3JtYXRpb24KICAgICAgLy8gaWYgaXQgaXMgYSBmdW5jdGlvbiB0eXBlLgogICAgICB0eXBlID0gX3R5cGVzLm5hcnJvd1R5cGUodHlwZSwgX2dldFN0YXRpY1R5cGUobm9kZSkpOwogICAgfQogICAgcmV0dXJuIHR5cGU7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gX2hhbmRsZUR5bmFtaWMoCiAgICAgIENhbGxUeXBlIGNhbGxUeXBlLAogICAgICBpci5Ob2RlIG5vZGUsCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBBYnN0cmFjdFZhbHVlIG1hc2ssCiAgICAgIFR5cGVJbmZvcm1hdGlvbiByZWNlaXZlclR5cGUsCiAgICAgIEFyZ3VtZW50c1R5cGVzIGFyZ3VtZW50cykgewogICAgYXNzZXJ0KHJlY2VpdmVyVHlwZSAhPSBudWxsKTsKICAgIGlmIChfdHlwZXMuc2VsZWN0b3JOZWVkc1VwZGF0ZShyZWNlaXZlclR5cGUsIG1hc2spKSB7CiAgICAgIG1hc2sgPSByZWNlaXZlclR5cGUgPT0gX3R5cGVzLmR5bmFtaWNUeXBlCiAgICAgICAgICA/IG51bGwKICAgICAgICAgIDogX3R5cGVzLm5ld1R5cGVkU2VsZWN0b3IocmVjZWl2ZXJUeXBlLCBtYXNrKTsKICAgICAgX2luZmVycmVyLnVwZGF0ZVNlbGVjdG9ySW5NZW1iZXIoCiAgICAgICAgICBfYW5hbHl6ZWRNZW1iZXIsIGNhbGxUeXBlLCBub2RlLCBzZWxlY3RvciwgbWFzayk7CiAgICB9CgogICAgaXIuVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZTsKICAgIGlmIChub2RlIGlzIGlyLk1ldGhvZEludm9jYXRpb24gJiYgbm9kZS5yZWNlaXZlciBpcyBpci5WYXJpYWJsZUdldCkgewogICAgICBpci5WYXJpYWJsZUdldCBnZXQgPSBub2RlLnJlY2VpdmVyOwogICAgICB2YXJpYWJsZSA9IGdldC52YXJpYWJsZTsKICAgIH0gZWxzZSBpZiAobm9kZSBpcyBpci5Qcm9wZXJ0eUdldCAmJiBub2RlLnJlY2VpdmVyIGlzIGlyLlZhcmlhYmxlR2V0KSB7CiAgICAgIGlyLlZhcmlhYmxlR2V0IGdldCA9IG5vZGUucmVjZWl2ZXI7CiAgICAgIHZhcmlhYmxlID0gZ2V0LnZhcmlhYmxlOwogICAgfSBlbHNlIGlmIChub2RlIGlzIGlyLlByb3BlcnR5U2V0ICYmIG5vZGUucmVjZWl2ZXIgaXMgaXIuVmFyaWFibGVHZXQpIHsKICAgICAgaXIuVmFyaWFibGVHZXQgZ2V0ID0gbm9kZS5yZWNlaXZlcjsKICAgICAgdmFyaWFibGUgPSBnZXQudmFyaWFibGU7CiAgICB9CgogICAgaWYgKHZhcmlhYmxlICE9IG51bGwpIHsKICAgICAgTG9jYWwgbG9jYWwgPSBfbG9jYWxzTWFwLmdldExvY2FsVmFyaWFibGUodmFyaWFibGUpOwogICAgICBpZiAoIV9jYXB0dXJlZFZhcmlhYmxlcy5jb250YWlucyhsb2NhbCkpIHsKICAgICAgICBEYXJ0VHlwZSB0eXBlID0gX2xvY2Fsc01hcC5nZXRMb2NhbFR5cGUoX2VsZW1lbnRNYXAsIGxvY2FsKTsKICAgICAgICBfc3RhdGUudXBkYXRlTG9jYWwoCiAgICAgICAgICAgIF9pbmZlcnJlciwgX2NhcHR1cmVkQW5kQm94ZWQsIGxvY2FsLCByZWNlaXZlclR5cGUsIG5vZGUsIHR5cGUsCiAgICAgICAgICAgIGlzTnVsbGFibGU6IHNlbGVjdG9yLmFwcGxpZXNUb051bGxXaXRob3V0VGhyb3coKSk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gX2luZmVycmVyLnJlZ2lzdGVyQ2FsbGVkU2VsZWN0b3IoY2FsbFR5cGUsIG5vZGUsIHNlbGVjdG9yLCBtYXNrLAogICAgICAgIHJlY2VpdmVyVHlwZSwgX2FuYWx5emVkTWVtYmVyLCBhcmd1bWVudHMsIF9zaWRlRWZmZWN0c0J1aWxkZXIsCiAgICAgICAgaW5Mb29wOiBpbkxvb3AsIGlzQ29uZGl0aW9uYWw6IGZhbHNlKTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiBoYW5kbGVEeW5hbWljR2V0KGlyLk5vZGUgbm9kZSwgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgbWFzaywgVHlwZUluZm9ybWF0aW9uIHJlY2VpdmVyVHlwZSkgewogICAgcmV0dXJuIF9oYW5kbGVEeW5hbWljKAogICAgICAgIENhbGxUeXBlLmFjY2Vzcywgbm9kZSwgc2VsZWN0b3IsIG1hc2ssIHJlY2VpdmVyVHlwZSwgbnVsbCk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gaGFuZGxlRHluYW1pY1NldCgKICAgICAgaXIuTm9kZSBub2RlLAogICAgICBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrLAogICAgICBUeXBlSW5mb3JtYXRpb24gcmVjZWl2ZXJUeXBlLAogICAgICBUeXBlSW5mb3JtYXRpb24gcmhzVHlwZSkgewogICAgQXJndW1lbnRzVHlwZXMgYXJndW1lbnRzID0gbmV3IEFyZ3VtZW50c1R5cGVzKFtyaHNUeXBlXSwgbnVsbCk7CiAgICByZXR1cm4gX2hhbmRsZUR5bmFtaWMoCiAgICAgICAgQ2FsbFR5cGUuYWNjZXNzLCBub2RlLCBzZWxlY3RvciwgbWFzaywgcmVjZWl2ZXJUeXBlLCBhcmd1bWVudHMpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGhhbmRsZUR5bmFtaWNJbnZva2UoCiAgICAgIENhbGxUeXBlIGNhbGxUeXBlLAogICAgICBpci5Ob2RlIG5vZGUsCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBBYnN0cmFjdFZhbHVlIG1hc2ssCiAgICAgIFR5cGVJbmZvcm1hdGlvbiByZWNlaXZlclR5cGUsCiAgICAgIEFyZ3VtZW50c1R5cGVzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIF9oYW5kbGVEeW5hbWljKAogICAgICAgIGNhbGxUeXBlLCBub2RlLCBzZWxlY3RvciwgbWFzaywgcmVjZWl2ZXJUeXBlLCBhcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0TGV0KGlyLkxldCBub2RlKSB7CiAgICB2aXNpdChub2RlLnZhcmlhYmxlKTsKICAgIHJldHVybiB2aXNpdChub2RlLmJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0QmxvY2tFeHByZXNzaW9uKGlyLkJsb2NrRXhwcmVzc2lvbiBub2RlKSB7CiAgICB2aXNpdChub2RlLmJvZHkpOwogICAgcmV0dXJuIHZpc2l0KG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0Rm9ySW5TdGF0ZW1lbnQoaXIuRm9ySW5TdGF0ZW1lbnQgbm9kZSkgewogICAgaWYgKG5vZGUuaXRlcmFibGUgaXMgaXIuVGhpc0V4cHJlc3Npb24pIHsKICAgICAgLy8gQW55IHJlYXNvbmFibGUgaW1wbGVtZW50YXRpb24gb2YgYW4gaXRlcmF0b3Igd291bGQgZXhwb3NlCiAgICAgIC8vIHRoaXMsIHNvIHdlIHBsYXkgaXQgc2FmZSBhbmQgYXNzdW1lIGl0IHdpbGwuCiAgICAgIF9zdGF0ZS5tYXJrVGhpc0FzRXhwb3NlZCgpOwogICAgfQoKICAgIEFic3RyYWN0VmFsdWUgY3VycmVudE1hc2s7CiAgICBBYnN0cmFjdFZhbHVlIG1vdmVOZXh0TWFzazsKICAgIFR5cGVJbmZvcm1hdGlvbiBpdGVyYXRvclR5cGU7CiAgICBpZiAobm9kZS5pc0FzeW5jKSB7CiAgICAgIFR5cGVJbmZvcm1hdGlvbiBleHByZXNzaW9uVHlwZSA9IHZpc2l0KG5vZGUuaXRlcmFibGUpOwoKICAgICAgY3VycmVudE1hc2sgPSBfbWVtYmVyRGF0YS50eXBlT2ZJdGVyYXRvckN1cnJlbnQobm9kZSk7CiAgICAgIG1vdmVOZXh0TWFzayA9IF9tZW1iZXJEYXRhLnR5cGVPZkl0ZXJhdG9yTW92ZU5leHQobm9kZSk7CgogICAgICBDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvciA9CiAgICAgICAgICBfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuc3RyZWFtSXRlcmF0b3JDb25zdHJ1Y3RvcjsKCiAgICAgIC8vLyBTeW50aGVzaXplIGEgY2FsbCB0byB0aGUgW1N0cmVhbUl0ZXJhdG9yXSBjb25zdHJ1Y3Rvci4KICAgICAgaXRlcmF0b3JUeXBlID0gaGFuZGxlU3RhdGljSW52b2tlKG5vZGUsIG51bGwsIG51bGwsIGNvbnN0cnVjdG9yLAogICAgICAgICAgbmV3IEFyZ3VtZW50c1R5cGVzKFtleHByZXNzaW9uVHlwZV0sIG51bGwpKTsKICAgIH0gZWxzZSB7CiAgICAgIFR5cGVJbmZvcm1hdGlvbiBleHByZXNzaW9uVHlwZSA9IHZpc2l0KG5vZGUuaXRlcmFibGUpOwogICAgICBTZWxlY3RvciBpdGVyYXRvclNlbGVjdG9yID0gU2VsZWN0b3JzLml0ZXJhdG9yOwogICAgICBBYnN0cmFjdFZhbHVlIGl0ZXJhdG9yTWFzayA9IF9tZW1iZXJEYXRhLnR5cGVPZkl0ZXJhdG9yKG5vZGUpOwogICAgICBjdXJyZW50TWFzayA9IF9tZW1iZXJEYXRhLnR5cGVPZkl0ZXJhdG9yQ3VycmVudChub2RlKTsKICAgICAgbW92ZU5leHRNYXNrID0gX21lbWJlckRhdGEudHlwZU9mSXRlcmF0b3JNb3ZlTmV4dChub2RlKTsKCiAgICAgIGl0ZXJhdG9yVHlwZSA9IGhhbmRsZUR5bmFtaWNJbnZva2UoQ2FsbFR5cGUuZm9ySW4sIG5vZGUsIGl0ZXJhdG9yU2VsZWN0b3IsCiAgICAgICAgICBpdGVyYXRvck1hc2ssIGV4cHJlc3Npb25UeXBlLCBuZXcgQXJndW1lbnRzVHlwZXMuZW1wdHkoKSk7CiAgICB9CgogICAgaGFuZGxlRHluYW1pY0ludm9rZShDYWxsVHlwZS5mb3JJbiwgbm9kZSwgU2VsZWN0b3JzLm1vdmVOZXh0LCBtb3ZlTmV4dE1hc2ssCiAgICAgICAgaXRlcmF0b3JUeXBlLCBuZXcgQXJndW1lbnRzVHlwZXMuZW1wdHkoKSk7CiAgICBUeXBlSW5mb3JtYXRpb24gY3VycmVudFR5cGUgPSBoYW5kbGVEeW5hbWljSW52b2tlKAogICAgICAgIENhbGxUeXBlLmZvckluLAogICAgICAgIG5vZGUsCiAgICAgICAgU2VsZWN0b3JzLmN1cnJlbnQsCiAgICAgICAgY3VycmVudE1hc2ssCiAgICAgICAgaXRlcmF0b3JUeXBlLAogICAgICAgIG5ldyBBcmd1bWVudHNUeXBlcy5lbXB0eSgpKTsKCiAgICBMb2NhbCB2YXJpYWJsZSA9IF9sb2NhbHNNYXAuZ2V0TG9jYWxWYXJpYWJsZShub2RlLnZhcmlhYmxlKTsKICAgIERhcnRUeXBlIHZhcmlhYmxlVHlwZSA9IF9sb2NhbHNNYXAuZ2V0TG9jYWxUeXBlKF9lbGVtZW50TWFwLCB2YXJpYWJsZSk7CiAgICBfc3RhdGUudXBkYXRlTG9jYWwoX2luZmVycmVyLCBfY2FwdHVyZWRBbmRCb3hlZCwgdmFyaWFibGUsIGN1cnJlbnRUeXBlLAogICAgICAgIG5vZGUudmFyaWFibGUsIHZhcmlhYmxlVHlwZSk7CgogICAgSnVtcFRhcmdldCB0YXJnZXQgPSBfbG9jYWxzTWFwLmdldEp1bXBUYXJnZXRGb3JGb3JJbihub2RlKTsKICAgIHJldHVybiBoYW5kbGVMb29wKG5vZGUsIHRhcmdldCwgKCkgewogICAgICB2aXNpdChub2RlLmJvZHkpOwogICAgfSk7CiAgfQoKICB2b2lkIF9zZXR1cEJyZWFrc0FuZENvbnRpbnVlcyhKdW1wVGFyZ2V0IHRhcmdldCkgewogICAgaWYgKHRhcmdldCA9PSBudWxsKSByZXR1cm47CiAgICBpZiAodGFyZ2V0LmlzQ29udGludWVUYXJnZXQpIHsKICAgICAgX2NvbnRpbnVlc0Zvclt0YXJnZXRdID0gPExvY2FsU3RhdGU+W107CiAgICB9CiAgICBpZiAodGFyZ2V0LmlzQnJlYWtUYXJnZXQpIHsKICAgICAgX2JyZWFrc0Zvclt0YXJnZXRdID0gPExvY2FsU3RhdGU+W107CiAgICB9CiAgfQoKICB2b2lkIF9jbGVhckJyZWFrc0FuZENvbnRpbnVlcyhKdW1wVGFyZ2V0IGVsZW1lbnQpIHsKICAgIF9jb250aW51ZXNGb3IucmVtb3ZlKGVsZW1lbnQpOwogICAgX2JyZWFrc0Zvci5yZW1vdmUoZWxlbWVudCk7CiAgfQoKICBMaXN0PExvY2FsU3RhdGU+IF9nZXRCcmVha3MoSnVtcFRhcmdldCB0YXJnZXQpIHsKICAgIExpc3Q8TG9jYWxTdGF0ZT4gbGlzdCA9IDxMb2NhbFN0YXRlPltfc3RhdGVdOwogICAgaWYgKHRhcmdldCA9PSBudWxsKSByZXR1cm4gbGlzdDsKICAgIGlmICghdGFyZ2V0LmlzQnJlYWtUYXJnZXQpIHJldHVybiBsaXN0OwogICAgcmV0dXJuIGxpc3QuLmFkZEFsbChfYnJlYWtzRm9yW3RhcmdldF0pOwogIH0KCiAgTGlzdDxMb2NhbFN0YXRlPiBfZ2V0TG9vcEJhY2tFZGdlcyhKdW1wVGFyZ2V0IHRhcmdldCkgewogICAgTGlzdDxMb2NhbFN0YXRlPiBsaXN0ID0gPExvY2FsU3RhdGU+W19zdGF0ZV07CiAgICBpZiAodGFyZ2V0ID09IG51bGwpIHJldHVybiBsaXN0OwogICAgaWYgKCF0YXJnZXQuaXNDb250aW51ZVRhcmdldCkgcmV0dXJuIGxpc3Q7CiAgICByZXR1cm4gbGlzdC4uYWRkQWxsKF9jb250aW51ZXNGb3JbdGFyZ2V0XSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gaGFuZGxlTG9vcChpci5Ob2RlIG5vZGUsIEp1bXBUYXJnZXQgdGFyZ2V0LCB2b2lkIGxvZ2ljKCkpIHsKICAgIF9sb29wTGV2ZWwrKzsKICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOwogICAgTG9jYWxTdGF0ZSBzdGF0ZUJlZm9yZSA9IF9zdGF0ZTsKICAgIHN0YXRlQmVmb3JlLnN0YXJ0TG9vcChfaW5mZXJyZXIsIG5vZGUpOwogICAgZG8gewogICAgICAvLyBTZXR1cCAoYW5kIGNsZWFyIGluIGNhc2Ugb2YgbXVsdGlwbGUgaXRlcmF0aW9ucyBvZiB0aGUgbG9vcCkKICAgICAgLy8gdGhlIGxpc3RzIG9mIGJyZWFrcyBhbmQgY29udGludWVzIHNlZW4gaW4gdGhlIGxvb3AuCiAgICAgIF9zZXR1cEJyZWFrc0FuZENvbnRpbnVlcyh0YXJnZXQpOwogICAgICBfc3RhdGUgPSBuZXcgTG9jYWxTdGF0ZS5jaGlsZFBhdGgoc3RhdGVCZWZvcmUpOwogICAgICBsb2dpYygpOwogICAgICBjaGFuZ2VkID0gc3RhdGVCZWZvcmUubWVyZ2VBbGwoX2luZmVycmVyLCBfZ2V0TG9vcEJhY2tFZGdlcyh0YXJnZXQpKTsKICAgIH0gd2hpbGUgKGNoYW5nZWQpOwogICAgX2xvb3BMZXZlbC0tOwogICAgc3RhdGVCZWZvcmUuZW5kTG9vcChfaW5mZXJyZXIsIG5vZGUpOwogICAgYm9vbCBrZWVwT3duTG9jYWxzID0gbm9kZSBpcyEgaXIuRG9TdGF0ZW1lbnQ7CiAgICBfc3RhdGUgPSBzdGF0ZUJlZm9yZS5tZXJnZUFmdGVyQnJlYWtzKF9pbmZlcnJlciwgX2dldEJyZWFrcyh0YXJnZXQpLAogICAgICAgIGtlZXBPd25Mb2NhbHM6IGtlZXBPd25Mb2NhbHMpOwogICAgX2NsZWFyQnJlYWtzQW5kQ29udGludWVzKHRhcmdldCk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihpci5Db25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewogICAgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IgPSBfZWxlbWVudE1hcC5nZXRDb25zdHJ1Y3Rvcihub2RlLnRhcmdldCk7CiAgICBBcmd1bWVudHNUeXBlcyBhcmd1bWVudHMgPSBhbmFseXplQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKTsKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gX2VsZW1lbnRNYXAuZ2V0U2VsZWN0b3Iobm9kZSk7CiAgICBBYnN0cmFjdFZhbHVlIG1hc2sgPSBfbWVtYmVyRGF0YS50eXBlT2ZTZW5kKG5vZGUpOwogICAgcmV0dXJuIGhhbmRsZUNvbnN0cnVjdG9ySW52b2tlKAogICAgICAgIG5vZGUsIG5vZGUuYXJndW1lbnRzLCBzZWxlY3RvciwgbWFzaywgY29uc3RydWN0b3IsIGFyZ3VtZW50cyk7CiAgfQoKICAvLy8gVHJ5IHRvIGZpbmQgdGhlIGxlbmd0aCBnaXZlbiB0byBhIGZpeGVkIGFycmF5IGNvbnN0cnVjdG9yIGNhbGwuCiAgaW50IF9maW5kTGVuZ3RoKGlyLkFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIGlyLkV4cHJlc3Npb24gZmlyc3RBcmd1bWVudCA9IGFyZ3VtZW50cy5wb3NpdGlvbmFsLmZpcnN0OwogICAgaWYgKGZpcnN0QXJndW1lbnQgaXMgaXIuQ29uc3RhbnRFeHByZXNzaW9uICYmCiAgICAgICAgZmlyc3RBcmd1bWVudC5jb25zdGFudCBpcyBpci5Eb3VibGVDb25zdGFudCkgewogICAgICBpci5Eb3VibGVDb25zdGFudCBjb25zdGFudCA9IGZpcnN0QXJndW1lbnQuY29uc3RhbnQ7CiAgICAgIGRvdWJsZSBkb3VibGVWYWx1ZSA9IGNvbnN0YW50LnZhbHVlOwogICAgICBpbnQgdHJ1bmNhdGVkVmFsdWUgPSBkb3VibGVWYWx1ZS50cnVuY2F0ZSgpOwogICAgICBpZiAoZG91YmxlVmFsdWUgPT0gdHJ1bmNhdGVkVmFsdWUpIHsKICAgICAgICByZXR1cm4gdHJ1bmNhdGVkVmFsdWU7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZmlyc3RBcmd1bWVudCBpcyBpci5JbnRMaXRlcmFsKSB7CiAgICAgIHJldHVybiBmaXJzdEFyZ3VtZW50LnZhbHVlOwogICAgfSBlbHNlIGlmIChmaXJzdEFyZ3VtZW50IGlzIGlyLlN0YXRpY0dldCkgewogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0gX2VsZW1lbnRNYXAuZ2V0TWVtYmVyKGZpcnN0QXJndW1lbnQudGFyZ2V0KTsKICAgICAgaWYgKG1lbWJlci5pc0ZpZWxkKSB7CiAgICAgICAgRmllbGRBbmFseXNpc0RhdGEgZmllbGREYXRhID0KICAgICAgICAgICAgX2Nsb3NlZFdvcmxkLmZpZWxkQW5hbHlzaXMuZ2V0RmllbGREYXRhKG1lbWJlcik7CiAgICAgICAgaWYgKGZpZWxkRGF0YS5pc0VmZmVjdGl2ZWx5Q29uc3RhbnQgJiYgZmllbGREYXRhLmNvbnN0YW50VmFsdWUuaXNJbnQpIHsKICAgICAgICAgIEludENvbnN0YW50VmFsdWUgaW50VmFsdWUgPSBmaWVsZERhdGEuY29uc3RhbnRWYWx1ZTsKICAgICAgICAgIHJldHVybiBpbnRWYWx1ZS5pbnRWYWx1ZS50b0ludCgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYKICBib29sIF9pc0NvbnN0cnVjdG9yT2ZUeXBlZEFycmF5U3ViY2xhc3MoQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IpIHsKICAgIENsYXNzRW50aXR5IGNscyA9IGNvbnN0cnVjdG9yLmVuY2xvc2luZ0NsYXNzOwogICAgcmV0dXJuIGNscy5saWJyYXJ5LmNhbm9uaWNhbFVyaSA9PSBVcmlzLmRhcnRfX25hdGl2ZV90eXBlZF9kYXRhICYmCiAgICAgICAgX2Nsb3NlZFdvcmxkLm5hdGl2ZURhdGEuaXNOYXRpdmVDbGFzcyhjbHMpICYmCiAgICAgICAgX2Nsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5CiAgICAgICAgICAgIC5pc1N1YnR5cGVPZihjbHMsIF9jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy50eXBlZERhdGFDbGFzcykgJiYKICAgICAgICBfY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkKICAgICAgICAgICAgLmlzU3VidHlwZU9mKGNscywgX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmxpc3RDbGFzcykgJiYKICAgICAgICBjb25zdHJ1Y3Rvci5uYW1lID09ICcnOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGhhbmRsZUNvbnN0cnVjdG9ySW52b2tlKAogICAgICBpci5Ob2RlIG5vZGUsCiAgICAgIGlyLkFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBBYnN0cmFjdFZhbHVlIG1hc2ssCiAgICAgIENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yLAogICAgICBBcmd1bWVudHNUeXBlcyBhcmd1bWVudHNUeXBlcykgewogICAgVHlwZUluZm9ybWF0aW9uIHJldHVyblR5cGUgPQogICAgICAgIGhhbmRsZVN0YXRpY0ludm9rZShub2RlLCBzZWxlY3RvciwgbWFzaywgY29uc3RydWN0b3IsIGFyZ3VtZW50c1R5cGVzKTsKICAgIGlmIChfZWxlbWVudE1hcC5jb21tb25FbGVtZW50cy5pc1VubmFtZWRMaXN0Q29uc3RydWN0b3IoY29uc3RydWN0b3IpKSB7CiAgICAgIC8vIFdlIGhhdmUgYG5ldyBMaXN0KC4uLilgLgogICAgICBpZiAoYXJndW1lbnRzLnBvc2l0aW9uYWwuaXNFbXB0eSAmJiBhcmd1bWVudHMubmFtZWQuaXNFbXB0eSkgewogICAgICAgIC8vIFdlIGhhdmUgYG5ldyBMaXN0KClgLgogICAgICAgIHJldHVybiBfaW5mZXJyZXIuY29uY3JldGVUeXBlcy5wdXRJZkFic2VudCgKICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgKCkgPT4gX3R5cGVzLmFsbG9jYXRlTGlzdChfdHlwZXMuZ3Jvd2FibGVMaXN0VHlwZSwgbm9kZSwKICAgICAgICAgICAgICAgIF9hbmFseXplZE1lbWJlciwgX3R5cGVzLm5vbk51bGxFbXB0eSgpLCAwKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gV2UgaGF2ZSBgbmV3IExpc3QobGVuKWAuCiAgICAgICAgaW50IGxlbmd0aCA9IF9maW5kTGVuZ3RoKGFyZ3VtZW50cyk7CiAgICAgICAgcmV0dXJuIF9pbmZlcnJlci5jb25jcmV0ZVR5cGVzLnB1dElmQWJzZW50KAogICAgICAgICAgICBub2RlLAogICAgICAgICAgICAoKSA9PiBfdHlwZXMuYWxsb2NhdGVMaXN0KF90eXBlcy5maXhlZExpc3RUeXBlLCBub2RlLAogICAgICAgICAgICAgICAgX2FuYWx5emVkTWVtYmVyLCBfdHlwZXMubnVsbFR5cGUsIGxlbmd0aCkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKF9lbGVtZW50TWFwLmNvbW1vbkVsZW1lbnRzCiAgICAgICAgLmlzRmlsbGVkTGlzdENvbnN0cnVjdG9yKGNvbnN0cnVjdG9yKSkgewogICAgICAvLyBXZSBoYXZlIGBuZXcgVWludDMyTGlzdChsZW4sIGZpbGwpYC4KICAgICAgaW50IGxlbmd0aCA9IF9maW5kTGVuZ3RoKGFyZ3VtZW50cyk7CiAgICAgIFR5cGVJbmZvcm1hdGlvbiBlbGVtZW50VHlwZSA9IGFyZ3VtZW50c1R5cGVzLnBvc2l0aW9uYWxbMV07CgogICAgICByZXR1cm4gX2luZmVycmVyLmNvbmNyZXRlVHlwZXMucHV0SWZBYnNlbnQoCiAgICAgICAgICBub2RlLAogICAgICAgICAgKCkgPT4gX3R5cGVzLmFsbG9jYXRlTGlzdChfdHlwZXMuZml4ZWRMaXN0VHlwZSwgbm9kZSwgX2FuYWx5emVkTWVtYmVyLAogICAgICAgICAgICAgIGVsZW1lbnRUeXBlLCBsZW5ndGgpKTsKICAgIH0gZWxzZSBpZiAoX2lzQ29uc3RydWN0b3JPZlR5cGVkQXJyYXlTdWJjbGFzcyhjb25zdHJ1Y3RvcikpIHsKICAgICAgLy8gV2UgaGF2ZSBzb21ldGhpbmcgbGlrZSBgbmV3IExpc3QuZmlsbGVkKGxlbiwgZmlsbClgLgogICAgICBpbnQgbGVuZ3RoID0gX2ZpbmRMZW5ndGgoYXJndW1lbnRzKTsKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IF9lbGVtZW50TWFwLmVsZW1lbnRFbnZpcm9ubWVudAogICAgICAgICAgLmxvb2t1cENsYXNzTWVtYmVyKGNvbnN0cnVjdG9yLmVuY2xvc2luZ0NsYXNzLCAnW10nKTsKICAgICAgVHlwZUluZm9ybWF0aW9uIGVsZW1lbnRUeXBlID0gX2luZmVycmVyLnJldHVyblR5cGVPZk1lbWJlcihtZW1iZXIpOwogICAgICByZXR1cm4gX2luZmVycmVyLmNvbmNyZXRlVHlwZXMucHV0SWZBYnNlbnQoCiAgICAgICAgICBub2RlLAogICAgICAgICAgKCkgPT4gX3R5cGVzLmFsbG9jYXRlTGlzdCgKICAgICAgICAgICAgICBfdHlwZXMubm9uTnVsbEV4YWN0KGNvbnN0cnVjdG9yLmVuY2xvc2luZ0NsYXNzKSwKICAgICAgICAgICAgICBub2RlLAogICAgICAgICAgICAgIF9hbmFseXplZE1lbWJlciwKICAgICAgICAgICAgICBlbGVtZW50VHlwZSwKICAgICAgICAgICAgICBsZW5ndGgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiByZXR1cm5UeXBlOwogICAgfQogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGhhbmRsZVN0YXRpY0ludm9rZShpci5Ob2RlIG5vZGUsIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBBYnN0cmFjdFZhbHVlIG1hc2ssIE1lbWJlckVudGl0eSBlbGVtZW50LCBBcmd1bWVudHNUeXBlcyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBfaW5mZXJyZXIucmVnaXN0ZXJDYWxsZWRNZW1iZXIobm9kZSwgc2VsZWN0b3IsIG1hc2ssIF9hbmFseXplZE1lbWJlciwKICAgICAgICBlbGVtZW50LCBhcmd1bWVudHMsIF9zaWRlRWZmZWN0c0J1aWxkZXIsIGluTG9vcCk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gaGFuZGxlQ2xvc3VyZUNhbGwoaXIuTm9kZSBub2RlLCBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrLCBNZW1iZXJFbnRpdHkgbWVtYmVyLCBBcmd1bWVudHNUeXBlcyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBfaW5mZXJyZXIucmVnaXN0ZXJDYWxsZWRDbG9zdXJlKAogICAgICAgIG5vZGUsCiAgICAgICAgc2VsZWN0b3IsCiAgICAgICAgbWFzaywKICAgICAgICBfaW5mZXJyZXIudHlwZU9mTWVtYmVyKG1lbWJlciksCiAgICAgICAgX2FuYWx5emVkTWVtYmVyLAogICAgICAgIGFyZ3VtZW50cywKICAgICAgICBfc2lkZUVmZmVjdHNCdWlsZGVyLAogICAgICAgIGluTG9vcDogaW5Mb29wKTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiBoYW5kbGVGb3JlaWduSW52b2tlKAogICAgICBpci5TdGF0aWNJbnZvY2F0aW9uIG5vZGUsCiAgICAgIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uLAogICAgICBBcmd1bWVudHNUeXBlcyBhcmd1bWVudHMsCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBBYnN0cmFjdFZhbHVlIG1hc2spIHsKICAgIFN0cmluZyBuYW1lID0gZnVuY3Rpb24ubmFtZTsKICAgIGhhbmRsZVN0YXRpY0ludm9rZShub2RlLCBzZWxlY3RvciwgbWFzaywgZnVuY3Rpb24sIGFyZ3VtZW50cyk7CiAgICBpZiAobmFtZSA9PSBKYXZhU2NyaXB0QmFja2VuZC5KUykgewogICAgICBOYXRpdmVCZWhhdmlvciBuYXRpdmVCZWhhdmlvciA9CiAgICAgICAgICBfZWxlbWVudE1hcC5nZXROYXRpdmVCZWhhdmlvckZvckpzQ2FsbChub2RlKTsKICAgICAgX3NpZGVFZmZlY3RzQnVpbGRlci5hZGQobmF0aXZlQmVoYXZpb3Iuc2lkZUVmZmVjdHMpOwogICAgICByZXR1cm4gX2luZmVycmVyLnR5cGVPZk5hdGl2ZUJlaGF2aW9yKG5hdGl2ZUJlaGF2aW9yKTsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSBKYXZhU2NyaXB0QmFja2VuZC5KU19FTUJFRERFRF9HTE9CQUwpIHsKICAgICAgTmF0aXZlQmVoYXZpb3IgbmF0aXZlQmVoYXZpb3IgPQogICAgICAgICAgX2VsZW1lbnRNYXAuZ2V0TmF0aXZlQmVoYXZpb3JGb3JKc0VtYmVkZGVkR2xvYmFsQ2FsbChub2RlKTsKICAgICAgX3NpZGVFZmZlY3RzQnVpbGRlci5hZGQobmF0aXZlQmVoYXZpb3Iuc2lkZUVmZmVjdHMpOwogICAgICByZXR1cm4gX2luZmVycmVyLnR5cGVPZk5hdGl2ZUJlaGF2aW9yKG5hdGl2ZUJlaGF2aW9yKTsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSBKYXZhU2NyaXB0QmFja2VuZC5KU19CVUlMVElOKSB7CiAgICAgIE5hdGl2ZUJlaGF2aW9yIG5hdGl2ZUJlaGF2aW9yID0KICAgICAgICAgIF9lbGVtZW50TWFwLmdldE5hdGl2ZUJlaGF2aW9yRm9ySnNCdWlsdGluQ2FsbChub2RlKTsKICAgICAgX3NpZGVFZmZlY3RzQnVpbGRlci5hZGQobmF0aXZlQmVoYXZpb3Iuc2lkZUVmZmVjdHMpOwogICAgICByZXR1cm4gX2luZmVycmVyLnR5cGVPZk5hdGl2ZUJlaGF2aW9yKG5hdGl2ZUJlaGF2aW9yKTsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSBKYXZhU2NyaXB0QmFja2VuZC5KU19TVFJJTkdfQ09OQ0FUKSB7CiAgICAgIHJldHVybiBfdHlwZXMuc3RyaW5nVHlwZTsKICAgIH0gZWxzZSB7CiAgICAgIF9zaWRlRWZmZWN0c0J1aWxkZXIuc2V0QWxsU2lkZUVmZmVjdHMoKTsKICAgICAgcmV0dXJuIF90eXBlcy5keW5hbWljVHlwZTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdFN0YXRpY0ludm9jYXRpb24oaXIuU3RhdGljSW52b2NhdGlvbiBub2RlKSB7CiAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0gX2VsZW1lbnRNYXAuZ2V0TWVtYmVyKG5vZGUudGFyZ2V0KTsKICAgIEFyZ3VtZW50c1R5cGVzIGFyZ3VtZW50cyA9IGFuYWx5emVBcmd1bWVudHMobm9kZS5hcmd1bWVudHMpOwogICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBfZWxlbWVudE1hcC5nZXRTZWxlY3Rvcihub2RlKTsKICAgIEFic3RyYWN0VmFsdWUgbWFzayA9IF9tZW1iZXJEYXRhLnR5cGVPZlNlbmQobm9kZSk7CiAgICBpZiAoX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmlzRm9yZWlnbihtZW1iZXIpKSB7CiAgICAgIHJldHVybiBoYW5kbGVGb3JlaWduSW52b2tlKG5vZGUsIG1lbWJlciwgYXJndW1lbnRzLCBzZWxlY3RvciwgbWFzayk7CiAgICB9IGVsc2UgaWYgKG1lbWJlci5pc0NvbnN0cnVjdG9yKSB7CiAgICAgIHJldHVybiBoYW5kbGVDb25zdHJ1Y3Rvckludm9rZSgKICAgICAgICAgIG5vZGUsIG5vZGUuYXJndW1lbnRzLCBzZWxlY3RvciwgbWFzaywgbWVtYmVyLCBhcmd1bWVudHMpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KG1lbWJlci5pc0Z1bmN0aW9uLCAiVW5leHBlY3RlZCBzdGF0aWMgaW52b2NhdGlvbiB0YXJnZXQ6ICRtZW1iZXIiKTsKICAgICAgVHlwZUluZm9ybWF0aW9uIHR5cGUgPQogICAgICAgICAgaGFuZGxlU3RhdGljSW52b2tlKG5vZGUsIHNlbGVjdG9yLCBtYXNrLCBtZW1iZXIsIGFyZ3VtZW50cyk7CiAgICAgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUgPQogICAgICAgICAgX2VsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZShtZW1iZXIpOwogICAgICBpZiAoZnVuY3Rpb25UeXBlLnJldHVyblR5cGUuY29udGFpbnNGcmVlVHlwZVZhcmlhYmxlcykgewogICAgICAgIC8vIFRoZSByZXR1cm4gdHlwZSB2YXJpZXMgd2l0aCB0aGUgY2FsbCBzaXRlIHNvIHdlIG5hcnJvdyB0aGUgc3RhdGljCiAgICAgICAgLy8gcmV0dXJuIHR5cGUuCiAgICAgICAgdHlwZSA9IF90eXBlcy5uYXJyb3dUeXBlKHR5cGUsIF9nZXRTdGF0aWNUeXBlKG5vZGUpKTsKICAgICAgfQogICAgICByZXR1cm4gdHlwZTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdExvYWRMaWJyYXJ5KGlyLkxvYWRMaWJyYXJ5IG5vZGUpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEltcHJvdmUgdGhpcyBieSByZXR1cm5pbmcgYSBGdXR1cmUgdHlwZSBpbnN0ZWFkLgogICAgcmV0dXJuIF90eXBlcy5keW5hbWljVHlwZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdFN0YXRpY0dldChpci5TdGF0aWNHZXQgbm9kZSkgewogICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gX21lbWJlckRhdGEudHlwZU9mU2VuZChub2RlKTsKICAgIGFzc2VydChtYXNrID09IG51bGwpOwogICAgcmV0dXJuIGNyZWF0ZVN0YXRpY0dldFR5cGVJbmZvcm1hdGlvbihub2RlLCBub2RlLnRhcmdldCwgbWFzazogbWFzayk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gY3JlYXRlU3RhdGljR2V0VHlwZUluZm9ybWF0aW9uKGlyLk5vZGUgbm9kZSwgaXIuTWVtYmVyIHRhcmdldCwKICAgICAge0Fic3RyYWN0VmFsdWUgbWFza30pIHsKICAgIE1lbWJlckVudGl0eSBtZW1iZXIgPSBfZWxlbWVudE1hcC5nZXRNZW1iZXIodGFyZ2V0KTsKICAgIHJldHVybiBoYW5kbGVTdGF0aWNJbnZva2UoCiAgICAgICAgbm9kZSwgbmV3IFNlbGVjdG9yLmdldHRlcihtZW1iZXIubWVtYmVyTmFtZSksIG1hc2ssIG1lbWJlciwgbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRTdGF0aWNTZXQoaXIuU3RhdGljU2V0IG5vZGUpIHsKICAgIFR5cGVJbmZvcm1hdGlvbiByaHNUeXBlID0gdmlzaXQobm9kZS52YWx1ZSk7CiAgICBpZiAobm9kZS52YWx1ZSBpcyBpci5UaGlzRXhwcmVzc2lvbikgewogICAgICBfc3RhdGUubWFya1RoaXNBc0V4cG9zZWQoKTsKICAgIH0KICAgIE1lbWJlckVudGl0eSBtZW1iZXIgPSBfZWxlbWVudE1hcC5nZXRNZW1iZXIobm9kZS50YXJnZXQpOwogICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gX21lbWJlckRhdGEudHlwZU9mU2VuZChub2RlKTsKICAgIGhhbmRsZVN0YXRpY0ludm9rZShub2RlLCBuZXcgU2VsZWN0b3Iuc2V0dGVyKG1lbWJlci5tZW1iZXJOYW1lKSwgbWFzaywKICAgICAgICBtZW1iZXIsIG5ldyBBcmd1bWVudHNUeXBlcyhbcmhzVHlwZV0sIG51bGwpKTsKICAgIHJldHVybiByaHNUeXBlOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGhhbmRsZVByb3BlcnR5R2V0KAogICAgICBpci5UcmVlTm9kZSBub2RlLCBUeXBlSW5mb3JtYXRpb24gcmVjZWl2ZXJUeXBlLCBpci5NZW1iZXIgaW50ZXJmYWNlVGFyZ2V0LAogICAgICB7Ym9vbCBpc1RoaXN9KSB7CiAgICBTZWxlY3RvciBzZWxlY3RvciA9IF9lbGVtZW50TWFwLmdldFNlbGVjdG9yKG5vZGUpOwogICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gX21lbWJlckRhdGEudHlwZU9mU2VuZChub2RlKTsKICAgIGlmIChpc1RoaXMpIHsKICAgICAgX2NoZWNrSWZFeHBvc2VzVGhpcygKICAgICAgICAgIHNlbGVjdG9yLCBfdHlwZXMubmV3VHlwZWRTZWxlY3RvcihyZWNlaXZlclR5cGUsIG1hc2spKTsKICAgIH0KICAgIFR5cGVJbmZvcm1hdGlvbiB0eXBlID0gaGFuZGxlRHluYW1pY0dldChub2RlLCBzZWxlY3RvciwgbWFzaywgcmVjZWl2ZXJUeXBlKTsKICAgIGlmIChpbnRlcmZhY2VUYXJnZXQgIT0gbnVsbCkgewogICAgICAvLyBQdWxsIHRoZSB0eXBlIGZyb20ga2VybmVsIChpbnN0ZWFkIG9mIGZyb20gdGhlIEotbW9kZWwpIGJlY2F1c2UgdGhlCiAgICAgIC8vIGludGVyZmFjZSB0YXJnZXQgbWlnaHQgYmUgYWJzdHJhY3QgYW5kIHRoZXJlZm9yZSBub3QgcGFydCBvZiB0aGUKICAgICAgLy8gSi1tb2RlbC4KICAgICAgaXIuRGFydFR5cGUgcmVzdWx0VHlwZSA9IGludGVyZmFjZVRhcmdldC5nZXR0ZXJUeXBlOwogICAgICAvLyBUaGUgcmVzdWx0IHR5cGUgdmFyaWVzIHdpdGggdGhlIGNhbGwgc2l0ZSBzbyB3ZSBuYXJyb3cgdGhlIHN0YXRpYwogICAgICAvLyByZXN1bHQgdHlwZS4KICAgICAgaWYgKGNvbnRhaW5zRnJlZVZhcmlhYmxlcyhyZXN1bHRUeXBlKSkgewogICAgICAgIHR5cGUgPSBfdHlwZXMubmFycm93VHlwZSh0eXBlLCBfZ2V0U3RhdGljVHlwZShub2RlKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0eXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0UHJvcGVydHlHZXQoaXIuUHJvcGVydHlHZXQgbm9kZSkgewogICAgVHlwZUluZm9ybWF0aW9uIHJlY2VpdmVyVHlwZSA9IHZpc2l0KG5vZGUucmVjZWl2ZXIpOwogICAgcmV0dXJuIGhhbmRsZVByb3BlcnR5R2V0KG5vZGUsIHJlY2VpdmVyVHlwZSwgbm9kZS5pbnRlcmZhY2VUYXJnZXQsCiAgICAgICAgaXNUaGlzOiBub2RlLnJlY2VpdmVyIGlzIGlyLlRoaXNFeHByZXNzaW9uKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdERpcmVjdFByb3BlcnR5R2V0KGlyLkRpcmVjdFByb3BlcnR5R2V0IG5vZGUpIHsKICAgIFR5cGVJbmZvcm1hdGlvbiByZWNlaXZlclR5cGUgPSB0aGlzVHlwZTsKICAgIHJldHVybiBoYW5kbGVQcm9wZXJ0eUdldChub2RlLCByZWNlaXZlclR5cGUsIG5vZGUudGFyZ2V0LCBpc1RoaXM6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0UHJvcGVydHlTZXQoaXIuUHJvcGVydHlTZXQgbm9kZSkgewogICAgVHlwZUluZm9ybWF0aW9uIHJlY2VpdmVyVHlwZSA9IHZpc2l0KG5vZGUucmVjZWl2ZXIpOwogICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBfZWxlbWVudE1hcC5nZXRTZWxlY3Rvcihub2RlKTsKICAgIEFic3RyYWN0VmFsdWUgbWFzayA9IF9tZW1iZXJEYXRhLnR5cGVPZlNlbmQobm9kZSk7CgogICAgVHlwZUluZm9ybWF0aW9uIHJoc1R5cGUgPSB2aXNpdChub2RlLnZhbHVlKTsKICAgIGlmIChub2RlLnZhbHVlIGlzIGlyLlRoaXNFeHByZXNzaW9uKSB7CiAgICAgIF9zdGF0ZS5tYXJrVGhpc0FzRXhwb3NlZCgpOwogICAgfQoKICAgIGlmIChfaW5HZW5lcmF0aXZlQ29uc3RydWN0b3IgJiYgbm9kZS5yZWNlaXZlciBpcyBpci5UaGlzRXhwcmVzc2lvbikgewogICAgICBBYnN0cmFjdFZhbHVlIHR5cGVkTWFzayA9IF90eXBlcy5uZXdUeXBlZFNlbGVjdG9yKHJlY2VpdmVyVHlwZSwgbWFzayk7CiAgICAgIGlmICghX2Nsb3NlZFdvcmxkLmluY2x1ZGVzQ2xvc3VyZUNhbGwoc2VsZWN0b3IsIHR5cGVkTWFzaykpIHsKICAgICAgICBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IHRhcmdldHMgPQogICAgICAgICAgICBfY2xvc2VkV29ybGQubG9jYXRlTWVtYmVycyhzZWxlY3RvciwgdHlwZWRNYXNrKTsKICAgICAgICAvLyBXZSBqdXN0IHJlY29nbml6ZWQgYSBmaWVsZCBpbml0aWFsaXphdGlvbiBvZiB0aGUgZm9ybToKICAgICAgICAvLyBgdGhpcy5mb28gPSA0MmAuIElmIHRoZXJlIGlzIG9ubHkgb25lIHRhcmdldCwgd2UgY2FuIHVwZGF0ZQogICAgICAgIC8vIGl0cyB0eXBlLgogICAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICBNZW1iZXJFbnRpdHkgc2luZ2xlID0gdGFyZ2V0cy5maXJzdDsKICAgICAgICAgIGlmIChzaW5nbGUuaXNGaWVsZCkgewogICAgICAgICAgICBGaWVsZEVudGl0eSBmaWVsZCA9IHNpbmdsZTsKICAgICAgICAgICAgX3N0YXRlLnVwZGF0ZUZpZWxkKGZpZWxkLCByaHNUeXBlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChub2RlLnJlY2VpdmVyIGlzIGlyLlRoaXNFeHByZXNzaW9uKSB7CiAgICAgIF9jaGVja0lmRXhwb3Nlc1RoaXMoCiAgICAgICAgICBzZWxlY3RvciwgX3R5cGVzLm5ld1R5cGVkU2VsZWN0b3IocmVjZWl2ZXJUeXBlLCBtYXNrKSk7CiAgICB9CiAgICBoYW5kbGVEeW5hbWljU2V0KG5vZGUsIHNlbGVjdG9yLCBtYXNrLCByZWNlaXZlclR5cGUsIHJoc1R5cGUpOwogICAgcmV0dXJuIHJoc1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRUaGlzRXhwcmVzc2lvbihpci5UaGlzRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gdGhpc1R5cGU7CiAgfQoKICB2b2lkIGhhbmRsZUNvbmRpdGlvbihpci5Ob2RlIG5vZGUpIHsKICAgIGJvb2wgb2xkQWNjdW11bGF0ZUlzQ2hlY2tzID0gX2FjY3VtdWxhdGVJc0NoZWNrczsKICAgIF9hY2N1bXVsYXRlSXNDaGVja3MgPSB0cnVlOwogICAgdmlzaXQobm9kZSwgY29uZGl0aW9uQ29udGV4dDogdHJ1ZSk7CiAgICBfYWNjdW11bGF0ZUlzQ2hlY2tzID0gb2xkQWNjdW11bGF0ZUlzQ2hlY2tzOwogIH0KCiAgdm9pZCBfcG90ZW50aWFsbHlBZGRJc0NoZWNrKGlyLklzRXhwcmVzc2lvbiBub2RlKSB7CiAgICBpZiAoIV9hY2N1bXVsYXRlSXNDaGVja3MpIHJldHVybjsKICAgIGlyLkV4cHJlc3Npb24gb3BlcmFuZCA9IG5vZGUub3BlcmFuZDsKICAgIGlmIChvcGVyYW5kIGlzIGlyLlZhcmlhYmxlR2V0KSB7CiAgICAgIExvY2FsIGxvY2FsID0gX2xvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKG9wZXJhbmQudmFyaWFibGUpOwogICAgICBEYXJ0VHlwZSB0eXBlID0gX2VsZW1lbnRNYXAuZ2V0RGFydFR5cGUobm9kZS50eXBlKTsKICAgICAgTG9jYWxTdGF0ZSBzdGF0ZUFmdGVyQ2hlY2tXaGVuVHJ1ZSA9IG5ldyBMb2NhbFN0YXRlLmNoaWxkUGF0aChfc3RhdGUpOwogICAgICBMb2NhbFN0YXRlIHN0YXRlQWZ0ZXJDaGVja1doZW5GYWxzZSA9IG5ldyBMb2NhbFN0YXRlLmNoaWxkUGF0aChfc3RhdGUpOwogICAgICBzdGF0ZUFmdGVyQ2hlY2tXaGVuVHJ1ZS5uYXJyb3dMb2NhbCgKICAgICAgICAgIF9pbmZlcnJlciwgX2NhcHR1cmVkQW5kQm94ZWQsIGxvY2FsLCB0eXBlLCBub2RlKTsKICAgICAgX3NldFN0YXRlQWZ0ZXIoX3N0YXRlLCBzdGF0ZUFmdGVyQ2hlY2tXaGVuVHJ1ZSwgc3RhdGVBZnRlckNoZWNrV2hlbkZhbHNlKTsKICAgIH0KICB9CgogIHZvaWQgX3BvdGVudGlhbGx5QWRkTnVsbENoZWNrKAogICAgICBpci5NZXRob2RJbnZvY2F0aW9uIG5vZGUsIGlyLkV4cHJlc3Npb24gcmVjZWl2ZXIpIHsKICAgIGlmICghX2FjY3VtdWxhdGVJc0NoZWNrcykgcmV0dXJuOwogICAgaWYgKHJlY2VpdmVyIGlzIGlyLlZhcmlhYmxlR2V0KSB7CiAgICAgIExvY2FsIGxvY2FsID0gX2xvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKHJlY2VpdmVyLnZhcmlhYmxlKTsKICAgICAgRGFydFR5cGUgbG9jYWxUeXBlID0gX2xvY2Fsc01hcC5nZXRMb2NhbFR5cGUoX2VsZW1lbnRNYXAsIGxvY2FsKTsKICAgICAgTG9jYWxTdGF0ZSBzdGF0ZUFmdGVyQ2hlY2tXaGVuVHJ1ZSA9IG5ldyBMb2NhbFN0YXRlLmNoaWxkUGF0aChfc3RhdGUpOwogICAgICBMb2NhbFN0YXRlIHN0YXRlQWZ0ZXJDaGVja1doZW5GYWxzZSA9IG5ldyBMb2NhbFN0YXRlLmNoaWxkUGF0aChfc3RhdGUpOwogICAgICBzdGF0ZUFmdGVyQ2hlY2tXaGVuVHJ1ZS51cGRhdGVMb2NhbChfaW5mZXJyZXIsIF9jYXB0dXJlZEFuZEJveGVkLCBsb2NhbCwKICAgICAgICAgIF90eXBlcy5udWxsVHlwZSwgbm9kZSwgbG9jYWxUeXBlKTsKICAgICAgc3RhdGVBZnRlckNoZWNrV2hlbkZhbHNlLm5hcnJvd0xvY2FsKF9pbmZlcnJlciwgX2NhcHR1cmVkQW5kQm94ZWQsIGxvY2FsLAogICAgICAgICAgX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLm9iamVjdFR5cGUsIG5vZGUpOwogICAgICBfc2V0U3RhdGVBZnRlcihfc3RhdGUsIHN0YXRlQWZ0ZXJDaGVja1doZW5UcnVlLCBzdGF0ZUFmdGVyQ2hlY2tXaGVuRmFsc2UpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0SWZTdGF0ZW1lbnQoaXIuSWZTdGF0ZW1lbnQgbm9kZSkgewogICAgTG9jYWxTdGF0ZSBzdGF0ZUJlZm9yZSA9IF9zdGF0ZTsKICAgIGhhbmRsZUNvbmRpdGlvbihub2RlLmNvbmRpdGlvbik7CiAgICBMb2NhbFN0YXRlIHN0YXRlQWZ0ZXJDb25kaXRpb25XaGVuVHJ1ZSA9IF9zdGF0ZUFmdGVyV2hlblRydWU7CiAgICBMb2NhbFN0YXRlIHN0YXRlQWZ0ZXJDb25kaXRpb25XaGVuRmFsc2UgPSBfc3RhdGVBZnRlcldoZW5GYWxzZTsKICAgIF9zdGF0ZSA9IG5ldyBMb2NhbFN0YXRlLmNoaWxkUGF0aChzdGF0ZUFmdGVyQ29uZGl0aW9uV2hlblRydWUpOwogICAgdmlzaXQobm9kZS50aGVuKTsKICAgIExvY2FsU3RhdGUgc3RhdGVBZnRlclRoZW4gPSBfc3RhdGU7CiAgICBfc3RhdGUgPSBuZXcgTG9jYWxTdGF0ZS5jaGlsZFBhdGgoc3RhdGVBZnRlckNvbmRpdGlvbldoZW5GYWxzZSk7CiAgICB2aXNpdChub2RlLm90aGVyd2lzZSk7CiAgICBMb2NhbFN0YXRlIHN0YXRlQWZ0ZXJFbHNlID0gX3N0YXRlOwogICAgX3N0YXRlID0KICAgICAgICBzdGF0ZUJlZm9yZS5tZXJnZURpYW1vbmRGbG93KF9pbmZlcnJlciwgc3RhdGVBZnRlclRoZW4sIHN0YXRlQWZ0ZXJFbHNlKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0SXNFeHByZXNzaW9uKGlyLklzRXhwcmVzc2lvbiBub2RlKSB7CiAgICB2aXNpdChub2RlLm9wZXJhbmQpOwogICAgX3BvdGVudGlhbGx5QWRkSXNDaGVjayhub2RlKTsKICAgIHJldHVybiBfdHlwZXMuYm9vbFR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXROb3QoaXIuTm90IG5vZGUpIHsKICAgIHZpc2l0KG5vZGUub3BlcmFuZCwgY29uZGl0aW9uQ29udGV4dDogX2FjY3VtdWxhdGVJc0NoZWNrcyk7CiAgICBMb2NhbFN0YXRlIHN0YXRlQWZ0ZXJPcGVyYW5kV2hlblRydWUgPSBfc3RhdGVBZnRlcldoZW5UcnVlOwogICAgTG9jYWxTdGF0ZSBzdGF0ZUFmdGVyT3BlcmFuZFdoZW5GYWxzZSA9IF9zdGF0ZUFmdGVyV2hlbkZhbHNlOwogICAgX3NldFN0YXRlQWZ0ZXIoCiAgICAgICAgX3N0YXRlLCBzdGF0ZUFmdGVyT3BlcmFuZFdoZW5GYWxzZSwgc3RhdGVBZnRlck9wZXJhbmRXaGVuVHJ1ZSk7CiAgICByZXR1cm4gX3R5cGVzLmJvb2xUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0TG9naWNhbEV4cHJlc3Npb24oaXIuTG9naWNhbEV4cHJlc3Npb24gbm9kZSkgewogICAgaWYgKG5vZGUub3BlcmF0b3IgPT0gJyYmJykgewogICAgICBMb2NhbFN0YXRlIHN0YXRlQmVmb3JlID0gX3N0YXRlOwogICAgICBfc3RhdGUgPSBuZXcgTG9jYWxTdGF0ZS5jaGlsZFBhdGgoc3RhdGVCZWZvcmUpOwogICAgICBoYW5kbGVDb25kaXRpb24obm9kZS5sZWZ0KTsKICAgICAgTG9jYWxTdGF0ZSBzdGF0ZUFmdGVyTGVmdFdoZW5UcnVlID0gX3N0YXRlQWZ0ZXJXaGVuVHJ1ZTsKICAgICAgTG9jYWxTdGF0ZSBzdGF0ZUFmdGVyTGVmdFdoZW5GYWxzZSA9IF9zdGF0ZUFmdGVyV2hlbkZhbHNlOwogICAgICBfc3RhdGUgPSBuZXcgTG9jYWxTdGF0ZS5jaGlsZFBhdGgoc3RhdGVBZnRlckxlZnRXaGVuVHJ1ZSk7CiAgICAgIGhhbmRsZUNvbmRpdGlvbihub2RlLnJpZ2h0KTsKICAgICAgTG9jYWxTdGF0ZSBzdGF0ZUFmdGVyUmlnaHRXaGVuVHJ1ZSA9IF9zdGF0ZUFmdGVyV2hlblRydWU7CiAgICAgIExvY2FsU3RhdGUgc3RhdGVBZnRlclJpZ2h0V2hlbkZhbHNlID0gX3N0YXRlQWZ0ZXJXaGVuRmFsc2U7CiAgICAgIExvY2FsU3RhdGUgc3RhdGVBZnRlcldoZW5UcnVlID0gc3RhdGVBZnRlclJpZ2h0V2hlblRydWU7CiAgICAgIExvY2FsU3RhdGUgc3RhdGVBZnRlcldoZW5GYWxzZSA9IG5ldyBMb2NhbFN0YXRlLmNoaWxkUGF0aChzdGF0ZUJlZm9yZSkKICAgICAgICAgIC5tZXJnZURpYW1vbmRGbG93KAogICAgICAgICAgICAgIF9pbmZlcnJlciwgc3RhdGVBZnRlckxlZnRXaGVuRmFsc2UsIHN0YXRlQWZ0ZXJSaWdodFdoZW5GYWxzZSk7CiAgICAgIExvY2FsU3RhdGUgYWZ0ZXIgPSBzdGF0ZUJlZm9yZS5tZXJnZURpYW1vbmRGbG93KAogICAgICAgICAgX2luZmVycmVyLCBzdGF0ZUFmdGVyV2hlblRydWUsIHN0YXRlQWZ0ZXJXaGVuRmFsc2UpOwogICAgICBfc2V0U3RhdGVBZnRlcihhZnRlciwgc3RhdGVBZnRlcldoZW5UcnVlLCBzdGF0ZUFmdGVyV2hlbkZhbHNlKTsKICAgICAgcmV0dXJuIF90eXBlcy5ib29sVHlwZTsKICAgIH0gZWxzZSBpZiAobm9kZS5vcGVyYXRvciA9PSAnfHwnKSB7CiAgICAgIExvY2FsU3RhdGUgc3RhdGVCZWZvcmUgPSBfc3RhdGU7CiAgICAgIF9zdGF0ZSA9IG5ldyBMb2NhbFN0YXRlLmNoaWxkUGF0aChzdGF0ZUJlZm9yZSk7CiAgICAgIGhhbmRsZUNvbmRpdGlvbihub2RlLmxlZnQpOwogICAgICBMb2NhbFN0YXRlIHN0YXRlQWZ0ZXJMZWZ0V2hlblRydWUgPSBfc3RhdGVBZnRlcldoZW5UcnVlOwogICAgICBMb2NhbFN0YXRlIHN0YXRlQWZ0ZXJMZWZ0V2hlbkZhbHNlID0gX3N0YXRlQWZ0ZXJXaGVuRmFsc2U7CiAgICAgIF9zdGF0ZSA9IG5ldyBMb2NhbFN0YXRlLmNoaWxkUGF0aChzdGF0ZUFmdGVyTGVmdFdoZW5GYWxzZSk7CiAgICAgIGhhbmRsZUNvbmRpdGlvbihub2RlLnJpZ2h0KTsKICAgICAgTG9jYWxTdGF0ZSBzdGF0ZUFmdGVyUmlnaHRXaGVuVHJ1ZSA9IF9zdGF0ZUFmdGVyV2hlblRydWU7CiAgICAgIExvY2FsU3RhdGUgc3RhdGVBZnRlclJpZ2h0V2hlbkZhbHNlID0gX3N0YXRlQWZ0ZXJXaGVuRmFsc2U7CiAgICAgIExvY2FsU3RhdGUgc3RhdGVBZnRlcldoZW5UcnVlID0gbmV3IExvY2FsU3RhdGUuY2hpbGRQYXRoKHN0YXRlQmVmb3JlKQogICAgICAgICAgLm1lcmdlRGlhbW9uZEZsb3coCiAgICAgICAgICAgICAgX2luZmVycmVyLCBzdGF0ZUFmdGVyTGVmdFdoZW5UcnVlLCBzdGF0ZUFmdGVyUmlnaHRXaGVuVHJ1ZSk7CiAgICAgIExvY2FsU3RhdGUgc3RhdGVBZnRlcldoZW5GYWxzZSA9IHN0YXRlQWZ0ZXJSaWdodFdoZW5GYWxzZTsKICAgICAgTG9jYWxTdGF0ZSBzdGF0ZUFmdGVyID0gc3RhdGVCZWZvcmUubWVyZ2VEaWFtb25kRmxvdygKICAgICAgICAgIF9pbmZlcnJlciwgc3RhdGVBZnRlcldoZW5UcnVlLCBzdGF0ZUFmdGVyV2hlbkZhbHNlKTsKICAgICAgX3NldFN0YXRlQWZ0ZXIoc3RhdGVBZnRlciwgc3RhdGVBZnRlcldoZW5UcnVlLCBzdGF0ZUFmdGVyV2hlbkZhbHNlKTsKICAgICAgcmV0dXJuIF90eXBlcy5ib29sVHlwZTsKICAgIH0KICAgIGZhaWxlZEF0KENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgIlVuZXhwZWN0ZWQgbG9naWNhbCBvcGVyYXRvciAnJHtub2RlLm9wZXJhdG9yfScuIik7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdENvbmRpdGlvbmFsRXhwcmVzc2lvbihpci5Db25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgewogICAgTG9jYWxTdGF0ZSBzdGF0ZUJlZm9yZSA9IF9zdGF0ZTsKICAgIGhhbmRsZUNvbmRpdGlvbihub2RlLmNvbmRpdGlvbik7CiAgICBMb2NhbFN0YXRlIHN0YXRlQWZ0ZXJXaGVuVHJ1ZSA9IF9zdGF0ZUFmdGVyV2hlblRydWU7CiAgICBMb2NhbFN0YXRlIHN0YXRlQWZ0ZXJXaGVuRmFsc2UgPSBfc3RhdGVBZnRlcldoZW5GYWxzZTsKICAgIF9zdGF0ZSA9IG5ldyBMb2NhbFN0YXRlLmNoaWxkUGF0aChzdGF0ZUFmdGVyV2hlblRydWUpOwogICAgVHlwZUluZm9ybWF0aW9uIGZpcnN0VHlwZSA9IHZpc2l0KG5vZGUudGhlbik7CiAgICBMb2NhbFN0YXRlIHN0YXRlQWZ0ZXJUaGVuID0gX3N0YXRlOwogICAgX3N0YXRlID0gbmV3IExvY2FsU3RhdGUuY2hpbGRQYXRoKHN0YXRlQWZ0ZXJXaGVuRmFsc2UpOwogICAgVHlwZUluZm9ybWF0aW9uIHNlY29uZFR5cGUgPSB2aXNpdChub2RlLm90aGVyd2lzZSk7CiAgICBMb2NhbFN0YXRlIHN0YXRlQWZ0ZXJFbHNlID0gX3N0YXRlOwogICAgX3N0YXRlID0KICAgICAgICBzdGF0ZUJlZm9yZS5tZXJnZURpYW1vbmRGbG93KF9pbmZlcnJlciwgc3RhdGVBZnRlclRoZW4sIHN0YXRlQWZ0ZXJFbHNlKTsKICAgIHJldHVybiBfdHlwZXMuYWxsb2NhdGVEaWFtb25kUGhpKGZpcnN0VHlwZSwgc2Vjb25kVHlwZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gaGFuZGxlTG9jYWxGdW5jdGlvbigKICAgICAgaXIuVHJlZU5vZGUgbm9kZSwgaXIuRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uTm9kZSwKICAgICAgW2lyLlZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGVdKSB7CiAgICAvLyBXZSBsb29zZSB0cmFjayBvZiBbdGhpc10gaW4gY2xvc3VyZXMgKHNlZSBpc3N1ZSAyMDg0MCkuIFRvIGJlIG9uCiAgICAvLyB0aGUgc2FmZSBzaWRlLCB3ZSBtYXJrIFt0aGlzXSBhcyBleHBvc2VkIGhlcmUuIFdlIGNvdWxkIGRvIGJldHRlciBieQogICAgLy8gYW5hbHl6aW5nIHRoZSBjbG9zdXJlLgogICAgLy8gVE9ETyhoZXJodXQpOiBBbmFseXplIHdoZXRoZXIgY2xvc3VyZSBleHBvc2VzIHRoaXMuIFBvc3NpYmx5IHVzaW5nCiAgICAvLyB3aGV0aGVyIHRoZSBjcmVhdGVkIGNsb3N1cmUgYXMgYSBgdGhpc0xvY2FsYC4KICAgIF9zdGF0ZS5tYXJrVGhpc0FzRXhwb3NlZCgpOwoKICAgIENsb3N1cmVSZXByZXNlbnRhdGlvbkluZm8gaW5mbyA9IF9jbG9zdXJlRGF0YUxvb2t1cC5nZXRDbG9zdXJlSW5mbyhub2RlKTsKCiAgICAvLyBSZWNvcmQgdGhlIHR5cGVzIG9mIGNhcHR1cmVkIG5vbi1ib3hlZCB2YXJpYWJsZXMuIFR5cGVzIG9mCiAgICAvLyB0aGVzZSB2YXJpYWJsZXMgbWF5IGFscmVhZHkgYmUgdGhlcmUsIGJlY2F1c2Ugb2YgYW4gYW5hbHlzaXMgb2YKICAgIC8vIGEgcHJldmlvdXMgY2xvc3VyZS4KICAgIGluZm8uZm9yRWFjaEZyZWVWYXJpYWJsZSgoTG9jYWwgdmFyaWFibGUsIEZpZWxkRW50aXR5IGZpZWxkKSB7CiAgICAgIGlmICghaW5mby5pc0JveGVkVmFyaWFibGUodmFyaWFibGUpKSB7CiAgICAgICAgaWYgKHZhcmlhYmxlID09IGluZm8udGhpc0xvY2FsKSB7CiAgICAgICAgICBfaW5mZXJyZXIucmVjb3JkVHlwZU9mRmllbGQoZmllbGQsIHRoaXNUeXBlKTsKICAgICAgICB9CiAgICAgICAgVHlwZUluZm9ybWF0aW9uIGxvY2FsVHlwZSA9CiAgICAgICAgICAgIF9zdGF0ZS5yZWFkTG9jYWwoX2luZmVycmVyLCBfY2FwdHVyZWRBbmRCb3hlZCwgdmFyaWFibGUpOwogICAgICAgIC8vIFRoZSB0eXBlIGlzIG51bGwgZm9yIHR5cGUgcGFyYW1ldGVycy4KICAgICAgICBpZiAobG9jYWxUeXBlICE9IG51bGwpIHsKICAgICAgICAgIF9pbmZlcnJlci5yZWNvcmRUeXBlT2ZGaWVsZChmaWVsZCwgbG9jYWxUeXBlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgX2NhcHR1cmVkVmFyaWFibGVzLmFkZCh2YXJpYWJsZSk7CiAgICB9KTsKCiAgICBUeXBlSW5mb3JtYXRpb24gbG9jYWxGdW5jdGlvblR5cGUgPQogICAgICAgIF9pbmZlcnJlci5jb25jcmV0ZVR5cGVzLnB1dElmQWJzZW50KG5vZGUsICgpIHsKICAgICAgcmV0dXJuIF90eXBlcy5hbGxvY2F0ZUNsb3N1cmUoaW5mby5jYWxsTWV0aG9kKTsKICAgIH0pOwogICAgaWYgKHZhcmlhYmxlICE9IG51bGwpIHsKICAgICAgTG9jYWwgbG9jYWwgPSBfbG9jYWxzTWFwLmdldExvY2FsVmFyaWFibGUodmFyaWFibGUpOwogICAgICBEYXJ0VHlwZSB0eXBlID0gX2xvY2Fsc01hcC5nZXRMb2NhbFR5cGUoX2VsZW1lbnRNYXAsIGxvY2FsKTsKICAgICAgX3N0YXRlLnVwZGF0ZUxvY2FsKAogICAgICAgICAgX2luZmVycmVyLCBfY2FwdHVyZWRBbmRCb3hlZCwgbG9jYWwsIGxvY2FsRnVuY3Rpb25UeXBlLCBub2RlLCB0eXBlLAogICAgICAgICAgaXNOdWxsYWJsZTogZmFsc2UpOwogICAgfQoKICAgIC8vIFdlIGRvbid0IHB1dCB0aGUgY2xvc3VyZSBpbiB0aGUgd29yayBxdWV1ZSBvZiB0aGUKICAgIC8vIGluZmVycmVyLCBiZWNhdXNlIGl0IHdpbGwgc2hhcmUgaW5mb3JtYXRpb24gd2l0aCBpdHMgZW5jbG9zaW5nCiAgICAvLyBtZXRob2QsIGxpa2UgZm9yIGV4YW1wbGUgdGhlIHR5cGVzIG9mIGxvY2FsIHZhcmlhYmxlcy4KICAgIExvY2FsU3RhdGUgY2xvc3VyZVN0YXRlID0gbmV3IExvY2FsU3RhdGUuY2xvc3VyZShfc3RhdGUpOwogICAgS2VybmVsVHlwZUdyYXBoQnVpbGRlciB2aXNpdG9yID0gbmV3IEtlcm5lbFR5cGVHcmFwaEJ1aWxkZXIoCiAgICAgICAgX29wdGlvbnMsCiAgICAgICAgX2Nsb3NlZFdvcmxkLAogICAgICAgIF9pbmZlcnJlciwKICAgICAgICBpbmZvLmNhbGxNZXRob2QsCiAgICAgICAgZnVuY3Rpb25Ob2RlLAogICAgICAgIF9sb2NhbHNNYXAsCiAgICAgICAgX3N0YXRpY1R5cGVQcm92aWRlciwKICAgICAgICBjbG9zdXJlU3RhdGUsCiAgICAgICAgX2NhcHR1cmVkQW5kQm94ZWQpOwogICAgdmlzaXRvci5ydW4oKTsKICAgIF9pbmZlcnJlci5yZWNvcmRSZXR1cm5UeXBlKGluZm8uY2FsbE1ldGhvZCwgdmlzaXRvci5fcmV0dXJuVHlwZSk7CgogICAgcmV0dXJuIGxvY2FsRnVuY3Rpb25UeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihpci5GdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpIHsKICAgIHJldHVybiBoYW5kbGVMb2NhbEZ1bmN0aW9uKG5vZGUsIG5vZGUuZnVuY3Rpb24sIG5vZGUudmFyaWFibGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKGlyLkZ1bmN0aW9uRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gaGFuZGxlTG9jYWxGdW5jdGlvbihub2RlLCBub2RlLmZ1bmN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0V2hpbGVTdGF0ZW1lbnQoaXIuV2hpbGVTdGF0ZW1lbnQgbm9kZSkgewogICAgcmV0dXJuIGhhbmRsZUxvb3Aobm9kZSwgX2xvY2Fsc01hcC5nZXRKdW1wVGFyZ2V0Rm9yV2hpbGUobm9kZSksICgpIHsKICAgICAgaGFuZGxlQ29uZGl0aW9uKG5vZGUuY29uZGl0aW9uKTsKICAgICAgX3N0YXRlID0gbmV3IExvY2FsU3RhdGUuY2hpbGRQYXRoKF9zdGF0ZUFmdGVyV2hlblRydWUpOwogICAgICB2aXNpdChub2RlLmJvZHkpOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdERvU3RhdGVtZW50KGlyLkRvU3RhdGVtZW50IG5vZGUpIHsKICAgIHJldHVybiBoYW5kbGVMb29wKG5vZGUsIF9sb2NhbHNNYXAuZ2V0SnVtcFRhcmdldEZvckRvKG5vZGUpLCAoKSB7CiAgICAgIHZpc2l0KG5vZGUuYm9keSk7CiAgICAgIGhhbmRsZUNvbmRpdGlvbihub2RlLmNvbmRpdGlvbik7CiAgICAgIC8vIFRPRE8oMjkzMDkpOiBUaGlzIGNvbmRpdGlvbiBhcHBlYXJzIHRvIHN0cmVuZ3RoZW4gYm90aCB0aGUgYmFjay1lZGdlCiAgICAgIC8vIGFuZCBleGl0LWVkZ2UuIEZvciBub3csIGF2b2lkIHN0cmVuZ3RoZW5pbmcgb24gdGhlIGNvbmRpdGlvbiB1bnRpbCB0aGUKICAgICAgLy8gcHJvcGVyIGZpeCBpcyBmb3VuZC4KICAgICAgLy8KICAgICAgLy8gICAgIF9zdGF0ZSA9IG5ldyBMb2NhbFN0YXRlLmNoaWxkUGF0aChfc3RhdGVBZnRlcldoZW5UcnVlLCBub2RlLmJvZHkpOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEZvclN0YXRlbWVudChpci5Gb3JTdGF0ZW1lbnQgbm9kZSkgewogICAgZm9yIChpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlIGluIG5vZGUudmFyaWFibGVzKSB7CiAgICAgIHZpc2l0KHZhcmlhYmxlKTsKICAgIH0KICAgIHJldHVybiBoYW5kbGVMb29wKG5vZGUsIF9sb2NhbHNNYXAuZ2V0SnVtcFRhcmdldEZvckZvcihub2RlKSwgKCkgewogICAgICBoYW5kbGVDb25kaXRpb24obm9kZS5jb25kaXRpb24pOwogICAgICBfc3RhdGUgPSBuZXcgTG9jYWxTdGF0ZS5jaGlsZFBhdGgoX3N0YXRlQWZ0ZXJXaGVuVHJ1ZSk7CiAgICAgIHZpc2l0KG5vZGUuYm9keSk7CiAgICAgIGZvciAoaXIuRXhwcmVzc2lvbiB1cGRhdGUgaW4gbm9kZS51cGRhdGVzKSB7CiAgICAgICAgdmlzaXQodXBkYXRlKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFRyeUNhdGNoKGlyLlRyeUNhdGNoIG5vZGUpIHsKICAgIExvY2FsU3RhdGUgc3RhdGVCZWZvcmUgPSBfc3RhdGU7CiAgICBfc3RhdGUgPSBuZXcgTG9jYWxTdGF0ZS50cnlCbG9jayhzdGF0ZUJlZm9yZSwgbm9kZSk7CiAgICBfc3RhdGUubWFya0luaXRpYWxpemF0aW9uQXNJbmRlZmluaXRlKCk7CiAgICB2aXNpdChub2RlLmJvZHkpOwogICAgTG9jYWxTdGF0ZSBzdGF0ZUFmdGVyQm9keSA9IF9zdGF0ZTsKICAgIF9zdGF0ZSA9IHN0YXRlQmVmb3JlLm1lcmdlRmxvdyhfaW5mZXJyZXIsIHN0YXRlQWZ0ZXJCb2R5KTsKICAgIGZvciAoaXIuQ2F0Y2ggY2F0Y2hCbG9jayBpbiBub2RlLmNhdGNoZXMpIHsKICAgICAgTG9jYWxTdGF0ZSBzdGF0ZUJlZm9yZUNhdGNoID0gX3N0YXRlOwogICAgICBfc3RhdGUgPSBuZXcgTG9jYWxTdGF0ZS5jaGlsZFBhdGgoc3RhdGVCZWZvcmVDYXRjaCk7CiAgICAgIHZpc2l0KGNhdGNoQmxvY2spOwogICAgICBMb2NhbFN0YXRlIHN0YXRlQWZ0ZXJDYXRjaCA9IF9zdGF0ZTsKICAgICAgX3N0YXRlID0gc3RhdGVCZWZvcmVDYXRjaC5tZXJnZUZsb3coX2luZmVycmVyLCBzdGF0ZUFmdGVyQ2F0Y2gpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFRyeUZpbmFsbHkoaXIuVHJ5RmluYWxseSBub2RlKSB7CiAgICBMb2NhbFN0YXRlIHN0YXRlQmVmb3JlID0gX3N0YXRlOwogICAgX3N0YXRlID0gbmV3IExvY2FsU3RhdGUudHJ5QmxvY2soc3RhdGVCZWZvcmUsIG5vZGUpOwogICAgX3N0YXRlLm1hcmtJbml0aWFsaXphdGlvbkFzSW5kZWZpbml0ZSgpOwogICAgdmlzaXQobm9kZS5ib2R5KTsKICAgIExvY2FsU3RhdGUgc3RhdGVBZnRlckJvZHkgPSBfc3RhdGU7CiAgICBfc3RhdGUgPSBzdGF0ZUJlZm9yZS5tZXJnZUZsb3coX2luZmVycmVyLCBzdGF0ZUFmdGVyQm9keSk7CiAgICB2aXNpdChub2RlLmZpbmFsaXplcik7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q2F0Y2goaXIuQ2F0Y2ggbm9kZSkgewogICAgaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBleGNlcHRpb24gPSBub2RlLmV4Y2VwdGlvbjsKICAgIGlmIChleGNlcHRpb24gIT0gbnVsbCkgewogICAgICBUeXBlSW5mb3JtYXRpb24gbWFzazsKICAgICAgRGFydFR5cGUgdHlwZSA9IG5vZGUuZ3VhcmQgIT0gbnVsbAogICAgICAgICAgPyBfZWxlbWVudE1hcC5nZXREYXJ0VHlwZShub2RlLmd1YXJkKQogICAgICAgICAgOiBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgICBpZiAodHlwZS5pc0ludGVyZmFjZVR5cGUpIHsKICAgICAgICBJbnRlcmZhY2VUeXBlIGludGVyZmFjZVR5cGUgPSB0eXBlOwogICAgICAgIG1hc2sgPSBfdHlwZXMubm9uTnVsbFN1YnR5cGUoaW50ZXJmYWNlVHlwZS5lbGVtZW50KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBtYXNrID0gX3R5cGVzLmR5bmFtaWNUeXBlOwogICAgICB9CiAgICAgIExvY2FsIGxvY2FsID0gX2xvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKGV4Y2VwdGlvbik7CiAgICAgIF9zdGF0ZS51cGRhdGVMb2NhbCgKICAgICAgICAgIF9pbmZlcnJlciwgX2NhcHR1cmVkQW5kQm94ZWQsIGxvY2FsLCBtYXNrLCBub2RlLCBjb25zdCBEeW5hbWljVHlwZSgpLAogICAgICAgICAgaXNOdWxsYWJsZTogZmFsc2UgLyogYHRocm93IG51bGxgIHByb2R1Y2VzIGEgTnVsbFRocm93bkVycm9yICovKTsKICAgIH0KICAgIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gc3RhY2tUcmFjZSA9IG5vZGUuc3RhY2tUcmFjZTsKICAgIGlmIChzdGFja1RyYWNlICE9IG51bGwpIHsKICAgICAgTG9jYWwgbG9jYWwgPSBfbG9jYWxzTWFwLmdldExvY2FsVmFyaWFibGUoc3RhY2tUcmFjZSk7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSBhIG1hc2sgYmFzZWQgb24gW1N0YWNrVHJhY2VdLgogICAgICAvLyBOb3RlOiBzdGFjayB0cmFjZSBtYXkgYmUgbnVsbCBpZiB1c2VycyBvbWl0IGEgc3RhY2sgaW4KICAgICAgLy8gYGNvbXBsZXRlci5jb21wbGV0ZUVycm9yYC4KICAgICAgX3N0YXRlLnVwZGF0ZUxvY2FsKF9pbmZlcnJlciwgX2NhcHR1cmVkQW5kQm94ZWQsIGxvY2FsLAogICAgICAgICAgX3R5cGVzLmR5bmFtaWNUeXBlLCBub2RlLCBjb25zdCBEeW5hbWljVHlwZSgpKTsKICAgIH0KICAgIHZpc2l0KG5vZGUuYm9keSk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdFRocm93KGlyLlRocm93IG5vZGUpIHsKICAgIHZpc2l0KG5vZGUuZXhwcmVzc2lvbik7CiAgICBfc3RhdGUuc2VlblJldHVybk9yVGhyb3cgPSB0cnVlOwogICAgcmV0dXJuIF90eXBlcy5ub25OdWxsRW1wdHkoKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdFJldGhyb3coaXIuUmV0aHJvdyBub2RlKSB7CiAgICBfc3RhdGUuc2VlblJldHVybk9yVGhyb3cgPSB0cnVlOwogICAgcmV0dXJuIF90eXBlcy5ub25OdWxsRW1wdHkoKTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiBoYW5kbGVTdXBlck5vU3VjaE1ldGhvZChpci5Ob2RlIG5vZGUsIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBBYnN0cmFjdFZhbHVlIG1hc2ssIEFyZ3VtZW50c1R5cGVzIGFyZ3VtZW50cykgewogICAgLy8gRW5zdXJlIHdlIGNyZWF0ZSBhIG5vZGUsIHRvIG1ha2UgZXhwbGljaXQgdGhlIGNhbGwgdG8gdGhlCiAgICAvLyBgbm9TdWNoTWV0aG9kYCBoYW5kbGVyLgogICAgRnVuY3Rpb25FbnRpdHkgbm9TdWNoTWV0aG9kID0KICAgICAgICBfZWxlbWVudE1hcC5nZXRTdXBlck5vU3VjaE1ldGhvZChfYW5hbHl6ZWRNZW1iZXIuZW5jbG9zaW5nQ2xhc3MpOwogICAgcmV0dXJuIGhhbmRsZVN0YXRpY0ludm9rZShub2RlLCBzZWxlY3RvciwgbWFzaywgbm9TdWNoTWV0aG9kLCBhcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0U3VwZXJQcm9wZXJ0eUdldChpci5TdXBlclByb3BlcnR5R2V0IG5vZGUpIHsKICAgIC8vIFRPRE8oaGVyaHV0KTogV2UgY291bGQgZG8gYmV0dGVyIGhlcmUgaWYgd2Uga25ldyB3aGF0IHdlCiAgICAvLyBhcmUgY2FsbGluZyBkb2VzIG5vdCBleHBvc2UgdGhpcy4KICAgIF9zdGF0ZS5tYXJrVGhpc0FzRXhwb3NlZCgpOwoKICAgIE1lbWJlckVudGl0eSBtZW1iZXIgPQogICAgICAgIF9lbGVtZW50TWFwLmdldFN1cGVyTWVtYmVyKF9hbmFseXplZE1lbWJlciwgbm9kZS5uYW1lKTsKICAgIGFzc2VydChtZW1iZXIgIT0gbnVsbCwgIk5vIG1lbWJlciBmb3VuZCBmb3Igc3VwZXIgcHJvcGVydHkgZ2V0OiAkbm9kZSIpOwogICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gX21lbWJlckRhdGEudHlwZU9mU2VuZChub2RlKTsKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFNlbGVjdG9yLmdldHRlcihfZWxlbWVudE1hcC5nZXROYW1lKG5vZGUubmFtZSkpOwogICAgVHlwZUluZm9ybWF0aW9uIHR5cGUgPQogICAgICAgIGhhbmRsZVN0YXRpY0ludm9rZShub2RlLCBzZWxlY3RvciwgbWFzaywgbWVtYmVyLCBudWxsKTsKICAgIGlmIChtZW1iZXIuaXNHZXR0ZXIpIHsKICAgICAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZSA9CiAgICAgICAgICBfZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQuZ2V0RnVuY3Rpb25UeXBlKG1lbWJlcik7CiAgICAgIGlmIChmdW5jdGlvblR5cGUucmV0dXJuVHlwZS5jb250YWluc0ZyZWVUeXBlVmFyaWFibGVzKSB7CiAgICAgICAgLy8gVGhlIHJlc3VsdCB0eXBlIHZhcmllcyB3aXRoIHRoZSBjYWxsIHNpdGUgc28gd2UgbmFycm93IHRoZSBzdGF0aWMKICAgICAgICAvLyByZXN1bHQgdHlwZS4KICAgICAgICB0eXBlID0gX3R5cGVzLm5hcnJvd1R5cGUodHlwZSwgX2dldFN0YXRpY1R5cGUobm9kZSkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKG1lbWJlci5pc0ZpZWxkKSB7CiAgICAgIERhcnRUeXBlIGZpZWxkVHlwZSA9IF9lbGVtZW50TWFwLmVsZW1lbnRFbnZpcm9ubWVudC5nZXRGaWVsZFR5cGUobWVtYmVyKTsKICAgICAgaWYgKGZpZWxkVHlwZS5jb250YWluc0ZyZWVUeXBlVmFyaWFibGVzKSB7CiAgICAgICAgLy8gVGhlIHJlc3VsdCB0eXBlIHZhcmllcyB3aXRoIHRoZSBjYWxsIHNpdGUgc28gd2UgbmFycm93IHRoZSBzdGF0aWMKICAgICAgICAvLyByZXN1bHQgdHlwZS4KICAgICAgICB0eXBlID0gX3R5cGVzLm5hcnJvd1R5cGUodHlwZSwgX2dldFN0YXRpY1R5cGUobm9kZSkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHlwZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdFN1cGVyUHJvcGVydHlTZXQoaXIuU3VwZXJQcm9wZXJ0eVNldCBub2RlKSB7CiAgICAvLyBUT0RPKGhlcmh1dCk6IFdlIGNvdWxkIGRvIGJldHRlciBoZXJlIGlmIHdlIGtuZXcgd2hhdCB3ZQogICAgLy8gYXJlIGNhbGxpbmcgZG9lcyBub3QgZXhwb3NlIHRoaXMuCiAgICBfc3RhdGUubWFya1RoaXNBc0V4cG9zZWQoKTsKCiAgICBUeXBlSW5mb3JtYXRpb24gcmhzVHlwZSA9IHZpc2l0KG5vZGUudmFsdWUpOwogICAgTWVtYmVyRW50aXR5IG1lbWJlciA9CiAgICAgICAgX2VsZW1lbnRNYXAuZ2V0U3VwZXJNZW1iZXIoX2FuYWx5emVkTWVtYmVyLCBub2RlLm5hbWUsIHNldHRlcjogdHJ1ZSk7CiAgICBhc3NlcnQobWVtYmVyICE9IG51bGwsICJObyBtZW1iZXIgZm91bmQgZm9yIHN1cGVyIHByb3BlcnR5IHNldDogJG5vZGUiKTsKICAgIEFic3RyYWN0VmFsdWUgbWFzayA9IF9tZW1iZXJEYXRhLnR5cGVPZlNlbmQobm9kZSk7CiAgICBTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBTZWxlY3Rvci5zZXR0ZXIoX2VsZW1lbnRNYXAuZ2V0TmFtZShub2RlLm5hbWUpKTsKICAgIEFyZ3VtZW50c1R5cGVzIGFyZ3VtZW50cyA9IG5ldyBBcmd1bWVudHNUeXBlcyhbcmhzVHlwZV0sIG51bGwpOwogICAgaGFuZGxlU3RhdGljSW52b2tlKG5vZGUsIHNlbGVjdG9yLCBtYXNrLCBtZW1iZXIsIGFyZ3VtZW50cyk7CiAgICByZXR1cm4gcmhzVHlwZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbihpci5TdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgLy8gVE9ETyhoZXJodXQpOiBXZSBjb3VsZCBkbyBiZXR0ZXIgaGVyZSBpZiB3ZSBrbmV3IHdoYXQgd2UKICAgIC8vIGFyZSBjYWxsaW5nIGRvZXMgbm90IGV4cG9zZSB0aGlzLgogICAgX3N0YXRlLm1hcmtUaGlzQXNFeHBvc2VkKCk7CgogICAgTWVtYmVyRW50aXR5IG1lbWJlciA9CiAgICAgICAgX2VsZW1lbnRNYXAuZ2V0U3VwZXJNZW1iZXIoX2FuYWx5emVkTWVtYmVyLCBub2RlLm5hbWUpOwogICAgQXJndW1lbnRzVHlwZXMgYXJndW1lbnRzID0gYW5hbHl6ZUFyZ3VtZW50cyhub2RlLmFyZ3VtZW50cyk7CiAgICBTZWxlY3RvciBzZWxlY3RvciA9IF9lbGVtZW50TWFwLmdldFNlbGVjdG9yKG5vZGUpOwogICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gX21lbWJlckRhdGEudHlwZU9mU2VuZChub2RlKTsKICAgIGlmIChtZW1iZXIgPT0gbnVsbCkgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGlzIHNob3VsZG4ndCBiZSBuZWNlc3NhcnkuCiAgICAgIHJldHVybiBoYW5kbGVTdXBlck5vU3VjaE1ldGhvZChub2RlLCBzZWxlY3RvciwgbWFzaywgYXJndW1lbnRzKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChtZW1iZXIuaXNGdW5jdGlvbiwgIlVuZXhwZWN0ZWQgc3VwZXIgaW52b2NhdGlvbiB0YXJnZXQ6ICRtZW1iZXIiKTsKICAgICAgaWYgKGlzSW5jb21wYXRpYmxlSW52b2tlKG1lbWJlciwgYXJndW1lbnRzKSkgewogICAgICAgIHJldHVybiBoYW5kbGVTdXBlck5vU3VjaE1ldGhvZChub2RlLCBzZWxlY3RvciwgbWFzaywgYXJndW1lbnRzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBUeXBlSW5mb3JtYXRpb24gdHlwZSA9CiAgICAgICAgICAgIGhhbmRsZVN0YXRpY0ludm9rZShub2RlLCBzZWxlY3RvciwgbWFzaywgbWVtYmVyLCBhcmd1bWVudHMpOwogICAgICAgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUgPQogICAgICAgICAgICBfZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQuZ2V0RnVuY3Rpb25UeXBlKG1lbWJlcik7CiAgICAgICAgaWYgKGZ1bmN0aW9uVHlwZS5yZXR1cm5UeXBlLmNvbnRhaW5zRnJlZVR5cGVWYXJpYWJsZXMpIHsKICAgICAgICAgIC8vIFRoZSByZXR1cm4gdHlwZSB2YXJpZXMgd2l0aCB0aGUgY2FsbCBzaXRlIHNvIHdlIG5hcnJvdyB0aGUgc3RhdGljCiAgICAgICAgICAvLyByZXR1cm4gdHlwZS4KICAgICAgICAgIHR5cGUgPSBfdHlwZXMubmFycm93VHlwZSh0eXBlLCBfZ2V0U3RhdGljVHlwZShub2RlKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0eXBlOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRBc0V4cHJlc3Npb24oaXIuQXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIFR5cGVJbmZvcm1hdGlvbiBvcGVyYW5kVHlwZSA9IHZpc2l0KG5vZGUub3BlcmFuZCk7CiAgICByZXR1cm4gX3R5cGVzLm5hcnJvd1R5cGUob3BlcmFuZFR5cGUsIF9lbGVtZW50TWFwLmdldERhcnRUeXBlKG5vZGUudHlwZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0QXdhaXRFeHByZXNzaW9uKGlyLkF3YWl0RXhwcmVzc2lvbiBub2RlKSB7CiAgICBUeXBlSW5mb3JtYXRpb24gZnV0dXJlVHlwZSA9IHZpc2l0KG5vZGUub3BlcmFuZCk7CiAgICByZXR1cm4gX2luZmVycmVyLnJlZ2lzdGVyQXdhaXQobm9kZSwgZnV0dXJlVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRZaWVsZFN0YXRlbWVudChpci5ZaWVsZFN0YXRlbWVudCBub2RlKSB7CiAgICBUeXBlSW5mb3JtYXRpb24gb3BlcmFuZFR5cGUgPSB2aXNpdChub2RlLmV4cHJlc3Npb24pOwogICAgcmV0dXJuIF9pbmZlcnJlci5yZWdpc3RlcllpZWxkKG5vZGUsIG9wZXJhbmRUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdENoZWNrTGlicmFyeUlzTG9hZGVkKGlyLkNoZWNrTGlicmFyeUlzTG9hZGVkIG5vZGUpIHsKICAgIHJldHVybiBfdHlwZXMubm9uTnVsbEVtcHR5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRJbnZhbGlkRXhwcmVzc2lvbihpci5JbnZhbGlkRXhwcmVzc2lvbiBub2RlKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNYXliZSB0aGlzIHNob3VsZCBiZSBbZW1wdHldIGluc3RlYWQ/CiAgICByZXR1cm4gX3R5cGVzLmR5bmFtaWNUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0Q29uc3RhbnRFeHByZXNzaW9uKGlyLkNvbnN0YW50RXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gbm9kZS5jb25zdGFudC5hY2NlcHQobmV3IFR5cGVJbmZvcm1hdGlvbkNvbnN0YW50VmlzaXRvcih0aGlzLCBub2RlKSk7CiAgfQp9CgpjbGFzcyBUeXBlSW5mb3JtYXRpb25Db25zdGFudFZpc2l0b3IKICAgIGltcGxlbWVudHMgaXIuQ29uc3RhbnRWaXNpdG9yPFR5cGVJbmZvcm1hdGlvbj4gewogIGZpbmFsIEtlcm5lbFR5cGVHcmFwaEJ1aWxkZXIgYnVpbGRlcjsKICBmaW5hbCBpci5Db25zdGFudEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKCiAgVHlwZUluZm9ybWF0aW9uQ29uc3RhbnRWaXNpdG9yKHRoaXMuYnVpbGRlciwgdGhpcy5leHByZXNzaW9uKTsKCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIGRlZmF1bHRDb25zdGFudChpci5Db25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5leHBlY3RlZCBjb25zdGFudDogIgogICAgICAgICIke25vZGV9ICgke25vZGUucnVudGltZVR5cGV9KSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0TnVsbENvbnN0YW50KGlyLk51bGxDb25zdGFudCBub2RlKSB7CiAgICByZXR1cm4gYnVpbGRlci5jcmVhdGVOdWxsVHlwZUluZm9ybWF0aW9uKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRCb29sQ29uc3RhbnQoaXIuQm9vbENvbnN0YW50IG5vZGUpIHsKICAgIHJldHVybiBidWlsZGVyLmNyZWF0ZUJvb2xUeXBlSW5mb3JtYXRpb24obm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRJbnRDb25zdGFudChpci5JbnRDb25zdGFudCBub2RlKSB7CiAgICByZXR1cm4gYnVpbGRlci5jcmVhdGVJbnRUeXBlSW5mb3JtYXRpb24obm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXREb3VibGVDb25zdGFudChpci5Eb3VibGVDb25zdGFudCBub2RlKSB7CiAgICByZXR1cm4gYnVpbGRlci5jcmVhdGVEb3VibGVUeXBlSW5mb3JtYXRpb24obm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRTdHJpbmdDb25zdGFudChpci5TdHJpbmdDb25zdGFudCBub2RlKSB7CiAgICByZXR1cm4gYnVpbGRlci5jcmVhdGVTdHJpbmdUeXBlSW5mb3JtYXRpb24obm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRTeW1ib2xDb25zdGFudChpci5TeW1ib2xDb25zdGFudCBub2RlKSB7CiAgICByZXR1cm4gYnVpbGRlci5jcmVhdGVTeW1ib2xMaXRlcmFsVHlwZUluZm9ybWF0aW9uKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRNYXBDb25zdGFudChpci5NYXBDb25zdGFudCBub2RlKSB7CiAgICByZXR1cm4gYnVpbGRlci5jcmVhdGVNYXBUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgbmV3IENvbnN0YW50UmVmZXJlbmNlKGV4cHJlc3Npb24sIG5vZGUpLAogICAgICAgIG5vZGUuZW50cmllcwogICAgICAgICAgICAubWFwKChlKSA9PiBuZXcgUGFpcihlLmtleS5hY2NlcHQodGhpcyksIGUudmFsdWUuYWNjZXB0KHRoaXMpKSksCiAgICAgICAgaXNDb25zdDogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRMaXN0Q29uc3RhbnQoaXIuTGlzdENvbnN0YW50IG5vZGUpIHsKICAgIHJldHVybiBidWlsZGVyLmNyZWF0ZUxpc3RUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgbmV3IENvbnN0YW50UmVmZXJlbmNlKGV4cHJlc3Npb24sIG5vZGUpLAogICAgICAgIG5vZGUuZW50cmllcy5tYXAoKGUpID0+IGUuYWNjZXB0KHRoaXMpKSwKICAgICAgICBpc0NvbnN0OiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdFNldENvbnN0YW50KGlyLlNldENvbnN0YW50IG5vZGUpIHsKICAgIHJldHVybiBidWlsZGVyLmNyZWF0ZVNldFR5cGVJbmZvcm1hdGlvbigKICAgICAgICBuZXcgQ29uc3RhbnRSZWZlcmVuY2UoZXhwcmVzc2lvbiwgbm9kZSksCiAgICAgICAgbm9kZS5lbnRyaWVzLm1hcCgoZSkgPT4gZS5hY2NlcHQodGhpcykpLAogICAgICAgIGlzQ29uc3Q6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0SW5zdGFuY2VDb25zdGFudChpci5JbnN0YW5jZUNvbnN0YW50IG5vZGUpIHsKICAgIG5vZGUuZmllbGRWYWx1ZXMuZm9yRWFjaCgoaXIuUmVmZXJlbmNlIHJlZmVyZW5jZSwgaXIuQ29uc3RhbnQgdmFsdWUpIHsKICAgICAgYnVpbGRlci5faW5mZXJyZXIucmVjb3JkVHlwZU9mRmllbGQoCiAgICAgICAgICBidWlsZGVyLl9lbGVtZW50TWFwLmdldEZpZWxkKHJlZmVyZW5jZS5hc0ZpZWxkKSwgdmFsdWUuYWNjZXB0KHRoaXMpKTsKICAgIH0pOwogICAgcmV0dXJuIGJ1aWxkZXIuX3R5cGVzLmdldENvbmNyZXRlVHlwZUZvcihidWlsZGVyCiAgICAgICAgLl9jbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgLmNyZWF0ZU5vbk51bGxFeGFjdChidWlsZGVyLl9lbGVtZW50TWFwLmdldENsYXNzKG5vZGUuY2xhc3NOb2RlKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCgKICAgICAgaXIuUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCBub2RlKSB7CiAgICByZXR1cm4gYnVpbGRlcgogICAgICAgIC5jcmVhdGVJbnN0YW50aWF0aW9uVHlwZUluZm9ybWF0aW9uKG5vZGUudGVhck9mZkNvbnN0YW50LmFjY2VwdCh0aGlzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRUZWFyT2ZmQ29uc3RhbnQoaXIuVGVhck9mZkNvbnN0YW50IG5vZGUpIHsKICAgIHJldHVybiBidWlsZGVyLmNyZWF0ZVN0YXRpY0dldFR5cGVJbmZvcm1hdGlvbihub2RlLCBub2RlLnByb2NlZHVyZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRUeXBlTGl0ZXJhbENvbnN0YW50KGlyLlR5cGVMaXRlcmFsQ29uc3RhbnQgbm9kZSkgewogICAgcmV0dXJuIGJ1aWxkZXIuY3JlYXRlVHlwZUxpdGVyYWxJbmZvcm1hdGlvbigpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0VW5ldmFsdWF0ZWRDb25zdGFudChpci5VbmV2YWx1YXRlZENvbnN0YW50IG5vZGUpIHsKICAgIGFzc2VydChmYWxzZSwgIlVuZXhwZWN0ZWQgdW5ldmFsdWF0ZWQgY29uc3RhbnQ6ICRub2RlIik7CiAgICByZXR1cm4gYnVpbGRlci5fdHlwZXMuZHluYW1pY1R5cGU7CiAgfQp9CgpjbGFzcyBSZWZpbmVtZW50IHsKICBmaW5hbCBTZWxlY3RvciBzZWxlY3RvcjsKICBmaW5hbCBBYnN0cmFjdFZhbHVlIG1hc2s7CgogIFJlZmluZW1lbnQodGhpcy5zZWxlY3RvciwgdGhpcy5tYXNrKTsKfQoKY2xhc3MgTG9jYWxTdGF0ZSB7CiAgZmluYWwgTG9jYWxzSGFuZGxlciBfbG9jYWxzOwogIGZpbmFsIEZpZWxkSW5pdGlhbGl6YXRpb25TY29wZSBfZmllbGRzOwogIGJvb2wgc2VlblJldHVybk9yVGhyb3cgPSBmYWxzZTsKICBib29sIHNlZW5CcmVha09yQ29udGludWUgPSBmYWxzZTsKICBMb2NhbHNIYW5kbGVyIF90cnlCbG9jazsKCiAgTG9jYWxTdGF0ZS5pbml0aWFsKHtib29sIGluR2VuZXJhdGl2ZUNvbnN0cnVjdG9yfSkKICAgICAgOiB0aGlzLmludGVybmFsKAogICAgICAgICAgICBuZXcgTG9jYWxzSGFuZGxlcigpLAogICAgICAgICAgICBpbkdlbmVyYXRpdmVDb25zdHJ1Y3RvciA/IG5ldyBGaWVsZEluaXRpYWxpemF0aW9uU2NvcGUoKSA6IG51bGwsCiAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgIHNlZW5SZXR1cm5PclRocm93OiBmYWxzZSwKICAgICAgICAgICAgc2VlbkJyZWFrT3JDb250aW51ZTogZmFsc2UpOwoKICBMb2NhbFN0YXRlLmNoaWxkUGF0aChMb2NhbFN0YXRlIG90aGVyKQogICAgICA6IHRoaXMuaW50ZXJuYWwobmV3IExvY2Fsc0hhbmRsZXIuZnJvbShvdGhlci5fbG9jYWxzKSwKICAgICAgICAgICAgbmV3IEZpZWxkSW5pdGlhbGl6YXRpb25TY29wZS5mcm9tKG90aGVyLl9maWVsZHMpLCBvdGhlci5fdHJ5QmxvY2ssCiAgICAgICAgICAgIHNlZW5SZXR1cm5PclRocm93OiBmYWxzZSwgc2VlbkJyZWFrT3JDb250aW51ZTogZmFsc2UpOwoKICBMb2NhbFN0YXRlLmNsb3N1cmUoTG9jYWxTdGF0ZSBvdGhlcikKICAgICAgOiB0aGlzLmludGVybmFsKG5ldyBMb2NhbHNIYW5kbGVyLmZyb20ob3RoZXIuX2xvY2FscyksCiAgICAgICAgICAgIG5ldyBGaWVsZEluaXRpYWxpemF0aW9uU2NvcGUuZnJvbShvdGhlci5fZmllbGRzKSwgbnVsbCwKICAgICAgICAgICAgc2VlblJldHVybk9yVGhyb3c6IGZhbHNlLCBzZWVuQnJlYWtPckNvbnRpbnVlOiBmYWxzZSk7CgogIGZhY3RvcnkgTG9jYWxTdGF0ZS50cnlCbG9jayhMb2NhbFN0YXRlIG90aGVyLCBpci5UcmVlTm9kZSBub2RlKSB7CiAgICBMb2NhbHNIYW5kbGVyIGxvY2FscyA9IG5ldyBMb2NhbHNIYW5kbGVyLnRyeUJsb2NrKG90aGVyLl9sb2NhbHMsIG5vZGUpOwogICAgRmllbGRJbml0aWFsaXphdGlvblNjb3BlIGZpZWxkU2NvcGUgPQogICAgICAgIG5ldyBGaWVsZEluaXRpYWxpemF0aW9uU2NvcGUuZnJvbShvdGhlci5fZmllbGRzKTsKICAgIExvY2Fsc0hhbmRsZXIgdHJ5QmxvY2sgPSBsb2NhbHM7CiAgICByZXR1cm4gbmV3IExvY2FsU3RhdGUuaW50ZXJuYWwobG9jYWxzLCBmaWVsZFNjb3BlLCB0cnlCbG9jaywKICAgICAgICBzZWVuUmV0dXJuT3JUaHJvdzogZmFsc2UsIHNlZW5CcmVha09yQ29udGludWU6IGZhbHNlKTsKICB9CgogIExvY2FsU3RhdGUuZGVlcENvcHlPZihMb2NhbFN0YXRlIG90aGVyKQogICAgICA6IF9sb2NhbHMgPSBuZXcgTG9jYWxzSGFuZGxlci5kZWVwQ29weU9mKG90aGVyLl9sb2NhbHMpLAogICAgICAgIF90cnlCbG9jayA9IG90aGVyLl90cnlCbG9jaywKICAgICAgICBfZmllbGRzID0gb3RoZXIuX2ZpZWxkczsKCiAgTG9jYWxTdGF0ZS5pbnRlcm5hbCh0aGlzLl9sb2NhbHMsIHRoaXMuX2ZpZWxkcywgdGhpcy5fdHJ5QmxvY2ssCiAgICAgIHt0aGlzLnNlZW5SZXR1cm5PclRocm93LCB0aGlzLnNlZW5CcmVha09yQ29udGludWV9KTsKCiAgYm9vbCBnZXQgYWJvcnRzIHsKICAgIHJldHVybiBzZWVuUmV0dXJuT3JUaHJvdyB8fCBzZWVuQnJlYWtPckNvbnRpbnVlOwogIH0KCiAgYm9vbCBnZXQgaXNUaGlzRXhwb3NlZCB7CiAgICByZXR1cm4gX2ZpZWxkcyA9PSBudWxsIHx8IF9maWVsZHMuaXNUaGlzRXhwb3NlZDsKICB9CgogIHZvaWQgbWFya1RoaXNBc0V4cG9zZWQoKSB7CiAgICBfZmllbGRzPy5pc1RoaXNFeHBvc2VkID0gdHJ1ZTsKICB9CgogIHZvaWQgbWFya0luaXRpYWxpemF0aW9uQXNJbmRlZmluaXRlKCkgewogICAgX2ZpZWxkcz8uaXNJbmRlZmluaXRlID0gdHJ1ZTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiByZWFkRmllbGQoRmllbGRFbnRpdHkgZmllbGQpIHsKICAgIHJldHVybiBfZmllbGRzLnJlYWRGaWVsZChmaWVsZCk7CiAgfQoKICB2b2lkIHVwZGF0ZUZpZWxkKEZpZWxkRW50aXR5IGZpZWxkLCBUeXBlSW5mb3JtYXRpb24gdHlwZSkgewogICAgX2ZpZWxkcy51cGRhdGVGaWVsZChmaWVsZCwgdHlwZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gcmVhZExvY2FsKEluZmVycmVyRW5naW5lIGluZmVycmVyLAogICAgICBNYXA8TG9jYWwsIEZpZWxkRW50aXR5PiBjYXB0dXJlZEFuZEJveGVkLCBMb2NhbCBsb2NhbCkgewogICAgRmllbGRFbnRpdHkgZmllbGQgPSBjYXB0dXJlZEFuZEJveGVkW2xvY2FsXTsKICAgIGlmIChmaWVsZCAhPSBudWxsKSB7CiAgICAgIHJldHVybiBpbmZlcnJlci50eXBlT2ZNZW1iZXIoZmllbGQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9sb2NhbHMudXNlKGluZmVycmVyLCBsb2NhbCk7CiAgICB9CiAgfQoKICB2b2lkIHVwZGF0ZUxvY2FsKAogICAgICBJbmZlcnJlckVuZ2luZSBpbmZlcnJlciwKICAgICAgTWFwPExvY2FsLCBGaWVsZEVudGl0eT4gY2FwdHVyZWRBbmRCb3hlZCwKICAgICAgTG9jYWwgbG9jYWwsCiAgICAgIFR5cGVJbmZvcm1hdGlvbiB0eXBlLAogICAgICBpci5Ob2RlIG5vZGUsCiAgICAgIERhcnRUeXBlIHN0YXRpY1R5cGUsCiAgICAgIHtpc051bGxhYmxlOiB0cnVlfSkgewogICAgYXNzZXJ0KHR5cGUgIT0gbnVsbCk7CiAgICB0eXBlID0gaW5mZXJyZXIudHlwZXMubmFycm93VHlwZSh0eXBlLCBzdGF0aWNUeXBlLCBpc051bGxhYmxlOiBpc051bGxhYmxlKTsKCiAgICBGaWVsZEVudGl0eSBmaWVsZCA9IGNhcHR1cmVkQW5kQm94ZWRbbG9jYWxdOwogICAgaWYgKGZpZWxkICE9IG51bGwpIHsKICAgICAgaW5mZXJyZXIucmVjb3JkVHlwZU9mRmllbGQoZmllbGQsIHR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgX2xvY2Fscy51cGRhdGUoaW5mZXJyZXIsIGxvY2FsLCB0eXBlLCBub2RlLCBzdGF0aWNUeXBlLCBfdHJ5QmxvY2spOwogICAgfQogIH0KCiAgdm9pZCBuYXJyb3dMb2NhbCgKICAgICAgSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIsCiAgICAgIE1hcDxMb2NhbCwgRmllbGRFbnRpdHk+IGNhcHR1cmVkQW5kQm94ZWQsCiAgICAgIExvY2FsIGxvY2FsLAogICAgICBEYXJ0VHlwZSB0eXBlLAogICAgICBpci5Ob2RlIG5vZGUpIHsKICAgIFR5cGVJbmZvcm1hdGlvbiBjdXJyZW50VHlwZSA9IHJlYWRMb2NhbChpbmZlcnJlciwgY2FwdHVyZWRBbmRCb3hlZCwgbG9jYWwpOwogICAgdXBkYXRlTG9jYWwoaW5mZXJyZXIsIGNhcHR1cmVkQW5kQm94ZWQsIGxvY2FsLCBjdXJyZW50VHlwZSwgbm9kZSwgdHlwZSwKICAgICAgICBpc051bGxhYmxlOiBmYWxzZSk7CiAgfQoKICBMb2NhbFN0YXRlIG1lcmdlRmxvdyhJbmZlcnJlckVuZ2luZSBpbmZlcnJlciwgTG9jYWxTdGF0ZSBvdGhlcikgewogICAgc2VlblJldHVybk9yVGhyb3cgPSBmYWxzZTsKICAgIHNlZW5CcmVha09yQ29udGludWUgPSBmYWxzZTsKCiAgICBpZiAob3RoZXIuYWJvcnRzKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgTG9jYWxzSGFuZGxlciBsb2NhbHMgPSBfbG9jYWxzLm1lcmdlRmxvdyhpbmZlcnJlciwgb3RoZXIuX2xvY2Fscyk7CiAgICByZXR1cm4gbmV3IExvY2FsU3RhdGUuaW50ZXJuYWwobG9jYWxzLCBfZmllbGRzLCBfdHJ5QmxvY2ssCiAgICAgICAgc2VlblJldHVybk9yVGhyb3c6IHNlZW5SZXR1cm5PclRocm93LAogICAgICAgIHNlZW5CcmVha09yQ29udGludWU6IHNlZW5CcmVha09yQ29udGludWUpOwogIH0KCiAgTG9jYWxTdGF0ZSBtZXJnZURpYW1vbmRGbG93KAogICAgICBJbmZlcnJlckVuZ2luZSBpbmZlcnJlciwgTG9jYWxTdGF0ZSB0aGVuQnJhbmNoLCBMb2NhbFN0YXRlIGVsc2VCcmFuY2gpIHsKICAgIHNlZW5SZXR1cm5PclRocm93ID0KICAgICAgICB0aGVuQnJhbmNoLnNlZW5SZXR1cm5PclRocm93ICYmIGVsc2VCcmFuY2guc2VlblJldHVybk9yVGhyb3c7CiAgICBzZWVuQnJlYWtPckNvbnRpbnVlID0KICAgICAgICB0aGVuQnJhbmNoLnNlZW5CcmVha09yQ29udGludWUgJiYgZWxzZUJyYW5jaC5zZWVuQnJlYWtPckNvbnRpbnVlOwoKICAgIExvY2Fsc0hhbmRsZXIgbG9jYWxzOwogICAgaWYgKGFib3J0cykgewogICAgICBsb2NhbHMgPSBfbG9jYWxzOwogICAgfSBlbHNlIGlmICh0aGVuQnJhbmNoLmFib3J0cykgewogICAgICBsb2NhbHMgPSBfbG9jYWxzLm1lcmdlRmxvdyhpbmZlcnJlciwgZWxzZUJyYW5jaC5fbG9jYWxzLCBpblBsYWNlOiB0cnVlKTsKICAgIH0gZWxzZSBpZiAoZWxzZUJyYW5jaC5hYm9ydHMpIHsKICAgICAgbG9jYWxzID0gX2xvY2Fscy5tZXJnZUZsb3coaW5mZXJyZXIsIHRoZW5CcmFuY2guX2xvY2FscywgaW5QbGFjZTogdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBsb2NhbHMgPSBfbG9jYWxzLm1lcmdlRGlhbW9uZEZsb3coCiAgICAgICAgICBpbmZlcnJlciwgdGhlbkJyYW5jaC5fbG9jYWxzLCBlbHNlQnJhbmNoLl9sb2NhbHMpOwogICAgfQoKICAgIEZpZWxkSW5pdGlhbGl6YXRpb25TY29wZSBmaWVsZFNjb3BlID0gX2ZpZWxkcz8ubWVyZ2VEaWFtb25kRmxvdygKICAgICAgICBpbmZlcnJlciwgdGhlbkJyYW5jaC5fZmllbGRzLCBlbHNlQnJhbmNoLl9maWVsZHMpOwogICAgcmV0dXJuIG5ldyBMb2NhbFN0YXRlLmludGVybmFsKGxvY2FscywgZmllbGRTY29wZSwgX3RyeUJsb2NrLAogICAgICAgIHNlZW5SZXR1cm5PclRocm93OiBzZWVuUmV0dXJuT3JUaHJvdywKICAgICAgICBzZWVuQnJlYWtPckNvbnRpbnVlOiBzZWVuQnJlYWtPckNvbnRpbnVlKTsKICB9CgogIExvY2FsU3RhdGUgbWVyZ2VBZnRlckJyZWFrcyhJbmZlcnJlckVuZ2luZSBpbmZlcnJlciwgTGlzdDxMb2NhbFN0YXRlPiBzdGF0ZXMsCiAgICAgIHtib29sIGtlZXBPd25Mb2NhbHM6IHRydWV9KSB7CiAgICBib29sIGFsbEJyYW5jaGVzQWJvcnQgPSB0cnVlOwogICAgZm9yIChMb2NhbFN0YXRlIHN0YXRlIGluIHN0YXRlcykgewogICAgICBhbGxCcmFuY2hlc0Fib3J0ID0gYWxsQnJhbmNoZXNBYm9ydCAmJiBzdGF0ZS5zZWVuUmV0dXJuT3JUaHJvdzsKICAgIH0KCiAgICBrZWVwT3duTG9jYWxzID0ga2VlcE93bkxvY2FscyAmJiAhc2VlblJldHVybk9yVGhyb3c7CgogICAgTG9jYWxzSGFuZGxlciBsb2NhbHMgPSBfbG9jYWxzLm1lcmdlQWZ0ZXJCcmVha3MoCiAgICAgICAgaW5mZXJyZXIsCiAgICAgICAgc3RhdGVzCiAgICAgICAgICAgIC53aGVyZSgoTG9jYWxTdGF0ZSBzdGF0ZSkgPT4gIXN0YXRlLnNlZW5SZXR1cm5PclRocm93KQogICAgICAgICAgICAubWFwKChMb2NhbFN0YXRlIHN0YXRlKSA9PiBzdGF0ZS5fbG9jYWxzKSwKICAgICAgICBrZWVwT3duTG9jYWxzOiBrZWVwT3duTG9jYWxzKTsKICAgIHNlZW5SZXR1cm5PclRocm93ID0gYWxsQnJhbmNoZXNBYm9ydCAmJiAha2VlcE93bkxvY2FsczsKICAgIHJldHVybiBuZXcgTG9jYWxTdGF0ZS5pbnRlcm5hbChsb2NhbHMsIF9maWVsZHMsIF90cnlCbG9jaywKICAgICAgICBzZWVuUmV0dXJuT3JUaHJvdzogc2VlblJldHVybk9yVGhyb3csCiAgICAgICAgc2VlbkJyZWFrT3JDb250aW51ZTogc2VlbkJyZWFrT3JDb250aW51ZSk7CiAgfQoKICBib29sIG1lcmdlQWxsKEluZmVycmVyRW5naW5lIGluZmVycmVyLCBMaXN0PExvY2FsU3RhdGU+IHN0YXRlcykgewogICAgYXNzZXJ0KCFzZWVuUmV0dXJuT3JUaHJvdyk7CiAgICByZXR1cm4gX2xvY2Fscy5tZXJnZUFsbCgKICAgICAgICBpbmZlcnJlciwKICAgICAgICBzdGF0ZXMKICAgICAgICAgICAgLndoZXJlKChMb2NhbFN0YXRlIHN0YXRlKSA9PiAhc3RhdGUuc2VlblJldHVybk9yVGhyb3cpCiAgICAgICAgICAgIC5tYXAoKExvY2FsU3RhdGUgc3RhdGUpID0+IHN0YXRlLl9sb2NhbHMpKTsKICB9CgogIHZvaWQgc3RhcnRMb29wKEluZmVycmVyRW5naW5lIGluZmVycmVyLCBpci5Ob2RlIGxvb3ApIHsKICAgIF9sb2NhbHMuc3RhcnRMb29wKGluZmVycmVyLCBsb29wKTsKICB9CgogIHZvaWQgZW5kTG9vcChJbmZlcnJlckVuZ2luZSBpbmZlcnJlciwgaXIuTm9kZSBsb29wKSB7CiAgICBfbG9jYWxzLmVuZExvb3AoaW5mZXJyZXIsIGxvb3ApOwogIH0KCiAgU3RyaW5nIHRvU3RydWN0dXJlZFRleHQoU3RyaW5nIGluZGVudCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgX3RvU3RydWN0dXJlZFRleHQoc2IsIGluZGVudCk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIHZvaWQgX3RvU3RydWN0dXJlZFRleHQoU3RyaW5nQnVmZmVyIHNiLCBTdHJpbmcgaW5kZW50KSB7CiAgICBzYi53cml0ZSgnTG9jYWxTdGF0ZSgkaGFzaENvZGUpIFsnKTsKICAgIHNiLndyaXRlKCdcbiR7aW5kZW50fSAgbG9jYWxzOicpOwogICAgc2Iud3JpdGUoX2xvY2Fscy50b1N0cnVjdHVyZWRUZXh0KCcke2luZGVudH0gICAgJykpOwogICAgc2Iud3JpdGUoJ1xuXScpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJ0xvY2FsU3RhdGUoJyk7CiAgICBzYi53cml0ZSgnbG9jYWxzPSRfbG9jYWxzJyk7CiAgICBpZiAoX2ZpZWxkcyAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCcsZmllbGRzPSRfZmllbGRzJyk7CiAgICB9CiAgICBpZiAoc2VlblJldHVybk9yVGhyb3cpIHsKICAgICAgc2Iud3JpdGUoJyxzZWVuUmV0dXJuT3JUaHJvdycpOwogICAgfQogICAgaWYgKHNlZW5CcmVha09yQ29udGludWUpIHsKICAgICAgc2Iud3JpdGUoJyxzZWVuQnJlYWtPckNvbnRp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Jy4uL2pzX2JhY2tlbmQvYmFja2VuZC5kYXJ0JyBzaG93IEphdmFTY3JpcHRCYWNrZW5kOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3I7CmltcG9ydCAnYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJ2RlYnVnLmRhcnQnIGFzIGRlYnVnOwppbXBvcnQgJ2luZmVycmVyX2VuZ2luZS5kYXJ0JzsKaW1wb3J0ICdub2RlX3RyYWNlci5kYXJ0JzsKaW1wb3J0ICd0eXBlX2dyYXBoX25vZGVzLmRhcnQnOwoKY2xhc3MgQ2xvc3VyZVRyYWNlclZpc2l0b3IgZXh0ZW5kcyBUcmFjZXJWaXNpdG9yIHsKICBmaW5hbCBJdGVyYWJsZTxGdW5jdGlvbkVudGl0eT4gdHJhY2VkRWxlbWVudHM7CiAgZmluYWwgTGlzdDxDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbj4gX2NhbGxzVG9BbmFseXplID0KICAgICAgbmV3IExpc3Q8Q2FsbFNpdGVUeXBlSW5mb3JtYXRpb24+KCk7CgogIENsb3N1cmVUcmFjZXJWaXNpdG9yKHRoaXMudHJhY2VkRWxlbWVudHMsIEFwcGx5YWJsZVR5cGVJbmZvcm1hdGlvbiB0cmFjZWRUeXBlLAogICAgICBJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikKICAgICAgOiBzdXBlcih0cmFjZWRUeXBlLCBpbmZlcnJlcikgewogICAgYXNzZXJ0KAogICAgICAgIHRyYWNlZEVsZW1lbnRzLmV2ZXJ5KChmKSA9PiAhZi5pc0Fic3RyYWN0KSwKICAgICAgICAiVHJhY2luZyBhYnN0cmFjdCBtZXRob2RzOiAiCiAgICAgICAgIiR7dHJhY2VkRWxlbWVudHMud2hlcmUoKGYpID0+IGYuaXNBYnN0cmFjdCl9Iik7CiAgfQoKICBAb3ZlcnJpZGUKICBBcHBseWFibGVUeXBlSW5mb3JtYXRpb24gZ2V0IHRyYWNlZFR5cGUgPT4gc3VwZXIudHJhY2VkVHlwZTsKCiAgdm9pZCBydW4oKSB7CiAgICBhbmFseXplKCk7CiAgICBpZiAoIWNvbnRpbnVlQW5hbHl6aW5nKSByZXR1cm47CiAgICBfY2FsbHNUb0FuYWx5emUuZm9yRWFjaChfYW5hbHl6ZUNhbGwpOwogICAgZm9yIChGdW5jdGlvbkVudGl0eSBlbGVtZW50IGluIHRyYWNlZEVsZW1lbnRzKSB7CiAgICAgIGluZmVycmVyLnR5cGVzLnN0cmF0ZWd5LmZvckVhY2hQYXJhbWV0ZXIoZWxlbWVudCwgKExvY2FsIHBhcmFtZXRlcikgewogICAgICAgIEVsZW1lbnRUeXBlSW5mb3JtYXRpb24gaW5mbyA9CiAgICAgICAgICAgIGluZmVycmVyLnR5cGVzLmdldEluZmVycmVkVHlwZU9mUGFyYW1ldGVyKHBhcmFtZXRlcik7CiAgICAgICAgaW5mby5kaXNhYmxlSW5mZXJlbmNlRm9yQ2xvc3VyZXMgPSBmYWxzZTsKICAgICAgfSk7CiAgICB9CiAgfQoKICB2b2lkIF90YWdBc0Z1bmN0aW9uQXBwbHlUYXJnZXQoW1N0cmluZyByZWFzb25dKSB7CiAgICB0cmFjZWRUeXBlLm1pZ2h0QmVQYXNzZWRUb0Z1bmN0aW9uQXBwbHkgPSB0cnVlOwogICAgaWYgKGRlYnVnLlZFUkJPU0UpIHsKICAgICAgcHJpbnQoIkNsb3N1cmUgJHRyYWNlZFR5cGUgbWlnaHQgYmUgcGFzc2VkIHRvIGFwcGx5OiAkcmVhc29uIik7CiAgICB9CiAgfQoKICB2b2lkIF9yZWdpc3RlckNhbGxGb3JMYXRlckFuYWx5c2lzKENhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIF9jYWxsc1RvQW5hbHl6ZS5hZGQoaW5mbyk7CiAgfQoKICB2b2lkIF9hbmFseXplQ2FsbChDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBTZWxlY3RvciBzZWxlY3RvciA9IGluZm8uc2VsZWN0b3I7CiAgICBBYnN0cmFjdFZhbHVlIG1hc2sgPSBpbmZvLm1hc2s7CiAgICB0cmFjZWRFbGVtZW50cy5mb3JFYWNoKChGdW5jdGlvbkVudGl0eSBmdW5jdGlvbkVsZW1lbnQpIHsKICAgICAgaWYgKCFzZWxlY3Rvci5jYWxsU3RydWN0dXJlCiAgICAgICAgICAuc2lnbmF0dXJlQXBwbGllcyhmdW5jdGlvbkVsZW1lbnQucGFyYW1ldGVyU3RydWN0dXJlKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpbmZlcnJlci51cGRhdGVQYXJhbWV0ZXJBc3NpZ25tZW50cygKICAgICAgICAgIGluZm8sIGZ1bmN0aW9uRWxlbWVudCwgaW5mby5hcmd1bWVudHMsIHNlbGVjdG9yLCBtYXNrLAogICAgICAgICAgcmVtb3ZlOiBmYWxzZSwgYWRkVG9RdWV1ZTogZmFsc2UpOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENsb3N1cmVDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbihDbG9zdXJlQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgc3VwZXIudmlzaXRDbG9zdXJlQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24oaW5mbyk7CiAgICBpZiAoaW5mby5jbG9zdXJlID09IGN1cnJlbnRVc2VyKSB7CiAgICAgIF9yZWdpc3RlckNhbGxGb3JMYXRlckFuYWx5c2lzKGluZm8pOwogICAgfSBlbHNlIHsKICAgICAgYmFpbG91dCgnUGFzc2VkIHRvIGEgY2xvc3VyZScpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRTdGF0aWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbihTdGF0aWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBzdXBlci52aXNpdFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKGluZm8pOwogICAgTWVtYmVyRW50aXR5IGNhbGxlZCA9IGluZm8uY2FsbGVkRWxlbWVudDsKICAgIGlmIChpbmZlcnJlci5jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5pc0ZvcmVpZ24oY2FsbGVkKSkgewogICAgICBTdHJpbmcgbmFtZSA9IGNhbGxlZC5uYW1lOwogICAgICBpZiAobmFtZSA9PSBKYXZhU2NyaXB0QmFja2VuZC5KUyB8fCBuYW1lID09ICdEQVJUX0NMT1NVUkVfVE9fSlMnKSB7CiAgICAgICAgYmFpbG91dCgnVXNlZCBpbiBKUyAke2luZm8uZGVidWdOYW1lfScpOwogICAgICB9CiAgICB9CiAgICBpZiAoY2FsbGVkLmlzR2V0dGVyICYmCiAgICAgICAgaW5mby5zZWxlY3RvciAhPSBudWxsICYmCiAgICAgICAgaW5mby5zZWxlY3Rvci5pc0NhbGwgJiYKICAgICAgICBpbmZlcnJlci50eXBlcy5nZXRJbmZlcnJlZFR5cGVPZk1lbWJlcihjYWxsZWQpID09IGN1cnJlbnRVc2VyKSB7CiAgICAgIC8vIFRoaXMgbm9kZSBjYW4gYmUgYSBjbG9zdXJlIGNhbGwgYXMgd2VsbC4gRm9yIGV4YW1wbGUsIGBmb28oKWAKICAgICAgLy8gd2hlcmUgYGZvb2AgaXMgYSBnZXR0ZXIuCiAgICAgIF9yZWdpc3RlckNhbGxGb3JMYXRlckFuYWx5c2lzKGluZm8pOwogICAgfQogICAgaWYgKF9jaGVja0lmRnVuY3Rpb25BcHBseShjYWxsZWQpICYmCiAgICAgICAgaW5mby5hcmd1bWVudHMgIT0gbnVsbCAmJgogICAgICAgIGluZm8uYXJndW1lbnRzLmNvbnRhaW5zKGN1cnJlbnRVc2VyKSkgewogICAgICBfdGFnQXNGdW5jdGlvbkFwcGx5VGFyZ2V0KCJzdGF0aWMgY2FsbCIpOwogICAgfQogIH0KCiAgYm9vbCBfY2hlY2tJZkN1cnJlbnRVc2VyKE1lbWJlckVudGl0eSBlbGVtZW50KSA9PgogICAgICBpbmZlcnJlci50eXBlcy5nZXRJbmZlcnJlZFR5cGVPZk1lbWJlcihlbGVtZW50KSA9PSBjdXJyZW50VXNlcjsKCiAgYm9vbCBfY2hlY2tJZkZ1bmN0aW9uQXBwbHkoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBpbmZlcnJlci5jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5pc0Z1bmN0aW9uQXBwbHlNZXRob2QoZWxlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdER5bmFtaWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbihEeW5hbWljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgc3VwZXIudmlzaXREeW5hbWljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24oaW5mbyk7CiAgICBpZiAoaW5mby5zZWxlY3Rvci5pc0NhbGwpIHsKICAgICAgaWYgKGluZm8uYXJndW1lbnRzLmNvbnRhaW5zKGN1cnJlbnRVc2VyKSkgewogICAgICAgIGlmIChpbmZvLmhhc0Nsb3N1cmVDYWxsVGFyZ2V0cyB8fAogICAgICAgICAgICBpbmZvLmNvbmNyZXRlVGFyZ2V0cy5hbnkoKGVsZW1lbnQpID0+ICFlbGVtZW50LmlzRnVuY3Rpb24pKSB7CiAgICAgICAgICBiYWlsb3V0KCdQYXNzZWQgdG8gYSBjbG9zdXJlJyk7CiAgICAgICAgfQogICAgICAgIGlmIChpbmZvLmNvbmNyZXRlVGFyZ2V0cy5hbnkoX2NoZWNrSWZGdW5jdGlvbkFwcGx5KSkgewogICAgICAgICAgX3RhZ0FzRnVuY3Rpb25BcHBseVRhcmdldCgiZHluYW1pYyBjYWxsIik7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGluZm8uY29uY3JldGVUYXJnZXRzLmFueShfY2hlY2tJZkN1cnJlbnRVc2VyKSkgewogICAgICAgIF9yZWdpc3RlckNhbGxGb3JMYXRlckFuYWx5c2lzKGluZm8pOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGluZm8uc2VsZWN0b3IuaXNHZXR0ZXIgJiYKICAgICAgICBpbmZvLnNlbGVjdG9yLm1lbWJlck5hbWUgPT0gTmFtZXMuY2FsbCkgewogICAgICAvLyBXZSBhcmUgcG90ZW50aWFsbHkgdGVhcmluZyBvZmYgb3Vyc2VsZiBoZXJlCiAgICAgIGFkZE5ld0VzY2FwZUluZm9ybWF0aW9uKGluZm8pOwogICAgfQogIH0KfQoKY2xhc3MgU3RhdGljVGVhck9mZkNsb3N1cmVUcmFjZXJWaXNpdG9yIGV4dGVuZHMgQ2xvc3VyZVRyYWNlclZpc2l0b3IgewogIFN0YXRpY1RlYXJPZmZDbG9zdXJlVHJhY2VyVmlzaXRvcigKICAgICAgRnVuY3Rpb25FbnRpdHkgdHJhY2VkRWxlbWVudCwgdHJhY2VkVHlwZSwgaW5mZXJyZXIpCiAgICAgIDogc3VwZXIoW3RyYWNlZEVsZW1lbnRdLCB0cmFjZWRUeXBlLCBpbmZlcnJlcik7CgogIEBvdmVycmlkZQogIHZpc2l0U3RhdGljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24oU3RhdGljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgc3VwZXIudmlzaXRTdGF0aWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbihpbmZvKTsKICAgIGlmIChpbmZvLmNhbGxlZEVsZW1lbnQgPT0gdHJhY2VkRWxlbWVudHMuZmlyc3QgJiYKICAgICAgICBpbmZvLnNlbGVjdG9yICE9IG51bGwgJiYKICAgICAgICBpbmZvLnNlbGVjdG9yLmlzR2V0dGVyKSB7CiAgICAgIGFkZE5ld0VzY2FwZUluZm9ybWF0aW9uKGluZm8pOwogICAgfQogIH0KfQqAmQBOTjwBLgEqJDwyJR4fGyABMzE4KwFRHyYMNCU5BAEMPwEPDyQrNUwmQjIKBgQBNDQZRgYEAUUfBAE0JyQ+IkMQCCtBLQgEAQxNNScrDSYGBAEMSzQuQSFKMQgGGyEgSUciKwYpIjAwBgQBNEYBNU8EAQxNNSAyKkoqCj81CkItCCkyNSUGBAIBRyU6NgEMSzQ2ISIlBgQCATFwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci9jbG9zdXJlX3RyYWNlci5kYXJ0MXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2luZmVycmVyL2RlYnVnLmRhcnSB6S8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gVmFsdWVzIHVzZWQgb25seSBmb3IgZGVidWdnaW5nIHR5cGUgaW5mZXJlbmNlLgpsaWJyYXJ5IGNvbXBpbGVyLnNyYy5pbmZlcnJlci5kZWJ1ZzsKCmNvbnN0IGJvb2wgVkVSQk9TRSA9IGZhbHNlOwpjb25zdCBib29sIFBSSU5UX1NVTU1BUlkgPSBmYWxzZTsKY29uc3QgYm9vbCBBTk9NQUxZX1dBUk4gPSBmYWxzZTsKYm9vbCBQUklOVF9HUkFQSCA9IGZhbHNlOwpib29sIFBSSU5UX0dSQVBIX0FMTF9OT0RFUyA9IGZhbHNlOyAvLyBJbmNsdWRlIHVzZWxlc3Mgbm9kZXM/Cg4ATk48ATMlARwiIRo+AShwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci9kZWJ1Zy5kYXJ0OnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2luZmVycmVyL2xvY2Fsc19oYW5kbGVyLmRhcnTAAFGOLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgbG9jYWxzX2hhbmRsZXI7CgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbicgc2hvdyBJdGVyYWJsZU1peGluOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pci91dGlsLmRhcnQnOwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JzsKaW1wb3J0ICdpbmZlcnJlcl9lbmdpbmUuZGFydCc7CmltcG9ydCAndHlwZV9ncmFwaF9ub2Rlcy5kYXJ0JzsKCi8vLyBBIHZhcmlhYmxlIHNjb3BlIGhvbGRzIHR5cGVzIGZvciB2YXJpYWJsZXMuIEl0IGhhcyBhIGxpbmsgdG8gYQovLy8gcGFyZW50IHNjb3BlLCBidXQgbmV2ZXIgY2hhbmdlcyB0aGUgdHlwZXMgaW4gdGhhdCBwYXJlbnQuIEluc3RlYWQsCi8vLyB1cGRhdGVzIHRvIGxvY2FscyBvZiBhIHBhcmVudCBzY29wZSBhcmUgcHV0IGluIHRoZSBjdXJyZW50IHNjb3BlLgovLy8gVGhlIGluZmVycmVyIG1ha2VzIHN1cmUgdXBkYXRlcyBnZXQgbWVyZ2VkIGludG8gdGhlIHBhcmVudCBzY29wZSwKLy8vIG9uY2UgdGhlIGNvbnRyb2wgZmxvdyBibG9jayBoYXMgYmVlbiB2aXNpdGVkLgpjbGFzcyBWYXJpYWJsZVNjb3BlIHsKICAvLy8gVGhlIG51bWJlciBvZiBwYXJlbnQgc2NvcGVzIG9mIHRoaXMgc2NvcGUuCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCBmb3IgY29tcHV0aW5nIGNvbW1vbiBwYXJlbnRzIGVmZmljaWVudGx5LgogIGZpbmFsIGludCBfbGV2ZWw7CgogIE1hcDxMb2NhbCwgVHlwZUluZm9ybWF0aW9uPiB2YXJpYWJsZXM7CgogIC8vLyBUaGUgcGFyZW50IG9mIHRoaXMgc2NvcGUuIE51bGwgZm9yIHRoZSByb290IHNjb3BlLgogIGZpbmFsIFZhcmlhYmxlU2NvcGUgcGFyZW50OwoKICAvLy8gVGhlIFtpci5Ob2RlXSB0aGF0IGNyZWF0ZWQgdGhpcyBzY29wZS4KICBmaW5hbCBpci5Ob2RlIHRyeUJsb2NrOwoKICBmaW5hbCBWYXJpYWJsZVNjb3BlIGNvcHlPZjsKCiAgVmFyaWFibGVTY29wZSh7dGhpcy5wYXJlbnR9KQogICAgICA6IHRoaXMudmFyaWFibGVzID0gbnVsbCwKICAgICAgICB0aGlzLmNvcHlPZiA9IG51bGwsCiAgICAgICAgdGhpcy50cnlCbG9jayA9IG51bGwsCiAgICAgICAgX2xldmVsID0gKHBhcmVudD8uX2xldmVsID8/IC0xKSArIDE7CgogIFZhcmlhYmxlU2NvcGUudHJ5QmxvY2sodGhpcy50cnlCbG9jaywge3RoaXMucGFyZW50fSkKICAgICAgOiB0aGlzLnZhcmlhYmxlcyA9IG51bGwsCiAgICAgICAgdGhpcy5jb3B5T2YgPSBudWxsLAogICAgICAgIF9sZXZlbCA9IChwYXJlbnQ/Ll9sZXZlbCA/PyAtMSkgKyAxIHsKICAgIGFzc2VydCh0cnlCbG9jayBpcyBpci5UcnlDYXRjaCB8fCB0cnlCbG9jayBpcyBpci5UcnlGaW5hbGx5LAogICAgICAgICJVbmV4cGVjdGVkIGJsb2NrICR0cnlCbG9jayBmb3IgVmFyaWFibGVTY29wZS50cnlCbG9jayIpOwogIH0KCiAgVmFyaWFibGVTY29wZS5kZWVwQ29weU9mKFZhcmlhYmxlU2NvcGUgb3RoZXIpCiAgICAgIDogdmFyaWFibGVzID0gb3RoZXIudmFyaWFibGVzID09IG51bGwKICAgICAgICAgICAgPyBudWxsCiAgICAgICAgICAgIDogbmV3IE1hcDxMb2NhbCwgVHlwZUluZm9ybWF0aW9uPi5mcm9tKG90aGVyLnZhcmlhYmxlcyksCiAgICAgICAgdHJ5QmxvY2sgPSBvdGhlci50cnlCbG9jaywKICAgICAgICBjb3B5T2YgPSBvdGhlci5jb3B5T2YgPz8gb3RoZXIsCiAgICAgICAgX2xldmVsID0gb3RoZXIuX2xldmVsLAogICAgICAgIHBhcmVudCA9IG90aGVyLnBhcmVudCA9PSBudWxsCiAgICAgICAgICAgID8gbnVsbAogICAgICAgICAgICA6IG5ldyBWYXJpYWJsZVNjb3BlLmRlZXBDb3B5T2Yob3RoZXIucGFyZW50KTsKCiAgLy8vIGB0cnVlYCBpZiB0aGlzIHNjb3BlIGlzIGZvciBhIHRyeSBibG9jay4KICBib29sIGdldCBpc1RyeSA9PiB0cnlCbG9jayAhPSBudWxsOwoKICAvLy8gUmV0dXJucyB0aGUgW1ZhcmlhYmxlU2NvcGVdIHRoYXQgZGVmaW5lcyB0aGUgaWRlbnRpdHkgb2YgdGhpcyBzY29wZS4KICAvLy8KICAvLy8gSWYgdGhpcyBzY29wZSBpcyBhIGNvcHkgb2YgYW5vdGhlciBzY29wZSwgdGhlIGlkZW50aXR5IGlzIHRoZSBpZGVudGl0eQogIC8vLyBvZiB0aGUgb3RoZXIgc2NvcGUsIG90aGVyd2lzZSB0aGUgaWRlbnRpdHkgaXMgdGhlIHNjb3BlIGl0c2VsZi4KICBWYXJpYWJsZVNjb3BlIGdldCBpZGVudGl0eSA9PiBjb3B5T2YgPz8gdGhpczsKCiAgLy8vIFJldHVybnMgdGhlIGNvbW1vbiBwYXJlbnQgYmV0d2VlbiB0aGlzIGFuZCBbb3RoZXJdIGJhc2VkIG9uIFtpZGVudGl0eV0uCiAgVmFyaWFibGVTY29wZSBjb21tb25QYXJlbnQoVmFyaWFibGVTY29wZSBvdGhlcikgewogICAgaWYgKGlkZW50aXR5ID09IG90aGVyLmlkZW50aXR5KSB7CiAgICAgIHJldHVybiBpZGVudGl0eTsKICAgIH0gZWxzZSBpZiAoX2xldmVsID4gb3RoZXIuX2xldmVsKSB7CiAgICAgIHJldHVybiBwYXJlbnQuY29tbW9uUGFyZW50KG90aGVyKTsKICAgIH0gZWxzZSBpZiAoX2xldmVsIDwgb3RoZXIuX2xldmVsKSB7CiAgICAgIHJldHVybiBjb21tb25QYXJlbnQob3RoZXIucGFyZW50KTsKICAgIH0gZWxzZSBpZiAoX2xldmVsID4gMCkgewogICAgICByZXR1cm4gcGFyZW50LmNvbW1vblBhcmVudChvdGhlci5wYXJlbnQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gb3BlcmF0b3IgW10oTG9jYWwgdmFyaWFibGUpIHsKICAgIFR5cGVJbmZvcm1hdGlvbiByZXN1bHQ7CiAgICBpZiAodmFyaWFibGVzID09IG51bGwgfHwgKHJlc3VsdCA9IHZhcmlhYmxlc1t2YXJpYWJsZV0pID09IG51bGwpIHsKICAgICAgcmV0dXJuIHBhcmVudCA9PSBudWxsID8gbnVsbCA6IHBhcmVudFt2YXJpYWJsZV07CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oTG9jYWwgdmFyaWFibGUsIFR5cGVJbmZvcm1hdGlvbiBtYXNrKSB7CiAgICBhc3NlcnQobWFzayAhPSBudWxsKTsKICAgIGlmICh2YXJpYWJsZXMgPT0gbnVsbCkgewogICAgICB2YXJpYWJsZXMgPSBuZXcgTWFwPExvY2FsLCBUeXBlSW5mb3JtYXRpb24+KCk7CiAgICB9CiAgICB2YXJpYWJsZXNbdmFyaWFibGVdID0gbWFzazsKICB9CgogIC8vLyBDYWxscyBbZl0gZm9yIGFsbCB2YXJpYWJsZXMgaW4gdGhpcyBhbmQgcGFyZW50IHNjb3BlcyB1bnRpbCBhbmQgaW5jbHVkaW5nCiAgLy8vIFtzY29wZV0uIFtmXSBpcyBjYWxsZWQgYXQgbW9zdCBvbmNlIGZvciBlYWNoIHZhcmlhYmxlLgogIHZvaWQgZm9yRWFjaExvY2FsVW50aWxTY29wZSgKICAgICAgVmFyaWFibGVTY29wZSBzY29wZSwgdm9pZCBmKExvY2FsIHZhcmlhYmxlLCBUeXBlSW5mb3JtYXRpb24gdHlwZSkpIHsKICAgIF9mb3JFYWNoTG9jYWxVbnRpbFNjb3BlKHNjb3BlLCBmLCBuZXcgU2V0bGV0PExvY2FsPigpLCB0aGlzKTsKICB9CgogIHZvaWQgX2ZvckVhY2hMb2NhbFVudGlsU2NvcGUoCiAgICAgIFZhcmlhYmxlU2NvcGUgc2NvcGUsCiAgICAgIHZvaWQgZihMb2NhbCB2YXJpYWJsZSwgVHlwZUluZm9ybWF0aW9uIHR5cGUpLAogICAgICBTZXRsZXQ8TG9jYWw+IHNlZW5Mb2NhbHMsCiAgICAgIFZhcmlhYmxlU2NvcGUgb3JpZ2luKSB7CiAgICBpZiAodmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgdmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlLCB0eXBlKSB7CiAgICAgICAgaWYgKHNlZW5Mb2NhbHMuY29udGFpbnModmFyaWFibGUpKSByZXR1cm47CiAgICAgICAgc2VlbkxvY2Fscy5hZGQodmFyaWFibGUpOwogICAgICAgIGYodmFyaWFibGUsIHR5cGUpOwogICAgICB9KTsKICAgIH0KICAgIGlmIChzY29wZT8uaWRlbnRpdHkgPT0gaWRlbnRpdHkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHBhcmVudCAhPSBudWxsKSB7CiAgICAgIHBhcmVudC5fZm9yRWFjaExvY2FsVW50aWxTY29wZShzY29wZSwgZiwgc2VlbkxvY2Fscywgb3JpZ2luKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydCgKICAgICAgICAgIHNjb3BlID09IG51bGwsCiAgICAgICAgICAiU2NvcGUgbm90IGZvdW5kOiBcbiIKICAgICAgICAgICJvcmlnaW49JHtvcmlnaW4udG9TdHJ1Y3R1cmVkVGV4dCgnJyl9XG4iCiAgICAgICAgICAic2NvcGU9JHtzY29wZS50b1N0cnVjdHVyZWRUZXh0KCcnKX0iKTsKICAgIH0KICB9CgogIHZvaWQgZm9yRWFjaExvY2FsKHZvaWQgZihMb2NhbCB2YXJpYWJsZSwgVHlwZUluZm9ybWF0aW9uIHR5cGUpKSB7CiAgICBmb3JFYWNoTG9jYWxVbnRpbFNjb3BlKG51bGwsIGYpOwogIH0KCiAgYm9vbCB1cGRhdGVzKExvY2FsIHZhcmlhYmxlKSB7CiAgICBpZiAodmFyaWFibGVzID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB2YXJpYWJsZXMuY29udGFpbnNLZXkodmFyaWFibGUpOwogIH0KCiAgU3RyaW5nIHRvU3RydWN0dXJlZFRleHQoU3RyaW5nIGluZGVudCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgX3RvU3RydWN0dXJlZFRleHQoc2IsIGluZGVudCk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIHZvaWQgX3RvU3RydWN0dXJlZFRleHQoU3RyaW5nQnVmZmVyIHNiLCBTdHJpbmcgaW5kZW50KSB7CiAgICBzYi53cml0ZSgnVmFyaWFibGVTY29wZSgkaGFzaENvZGUpIFsnKTsKICAgIHNiLndyaXRlKCdcbiR7aW5kZW50fSAgbGV2ZWw6JF9sZXZlbCcpOwogICAgaWYgKGNvcHlPZiAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCdcbiR7aW5kZW50fSAgY29weU9mOlZhcmlhYmxlU2NvcGUoJHtjb3B5T2YuaGFzaENvZGV9KScpOwogICAgfQogICAgaWYgKHRyeUJsb2NrICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJ1xuJHtpbmRlbnR9ICB0cnlCbG9jazogJHtub2RlVG9EZWJ1Z1N0cmluZyh0cnlCbG9jayl9Jyk7CiAgICB9CiAgICBpZiAodmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJ1xuJHtpbmRlbnR9ICB2YXJpYWJsZXM6Jyk7CiAgICAgIHZhcmlhYmxlcy5mb3JFYWNoKChMb2NhbCBsb2NhbCwgVHlwZUluZm9ybWF0aW9uIHR5cGUpIHsKICAgICAgICBzYi53cml0ZSgnXG4ke2luZGVudH0gICAgJGxvY2FsOiAnKTsKICAgICAgICBzYi53cml0ZSh0eXBlLnRvU3RydWN0dXJlZFRleHQoJyR7aW5kZW50fSAgICAgICcpKTsKICAgICAgfSk7CiAgICB9CiAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJ1xuJHtpbmRlbnR9ICBwYXJlbnQ6Jyk7CiAgICAgIHBhcmVudC5fdG9TdHJ1Y3R1cmVkVGV4dChzYiwgJyR7aW5kZW50fSAgICAgJyk7CiAgICB9CiAgICBzYi53cml0ZSgnXScpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nIHJlc3QgPSBwYXJlbnQgPT0gbnVsbCA/ICJudWxsIiA6IHBhcmVudC50b1N0cmluZygpOwogICAgcmV0dXJuICd7JHZhcmlhYmxlc30gJHJlc3QnOwogIH0KfQoKLy8vIFRyYWNrcyBpbml0aWFsaXplcnMgdmlhIGluaXRpYWxpemF0aW9ucyBhbmQgYXNzaWdubWVudHMuCmNsYXNzIEZpZWxkSW5pdGlhbGl6YXRpb25TY29wZSB7CiAgTWFwPEZpZWxkRW50aXR5LCBUeXBlSW5mb3JtYXRpb24+IGZpZWxkczsKICBib29sIGlzVGhpc0V4cG9zZWQ7CgogIC8vLyBgdHJ1ZWAgd2hlbiBjb250cm9sIGZsb3cgcHJldmVudHMgYWNjdW11bGF0aW5nIGRlZmluaXRlIGFzc2lnbm1lbnRzLAogIC8vLyBlLmcuIGFuIGVhcmx5IHJldHVybiBvciBjYXVnaHQgZXhjZXB0aW9uLgogIGJvb2wgaXNJbmRlZmluaXRlOwoKICBGaWVsZEluaXRpYWxpemF0aW9uU2NvcGUoKQogICAgICA6IGlzVGhpc0V4cG9zZWQgPSBmYWxzZSwKICAgICAgICBpc0luZGVmaW5pdGUgPSBmYWxzZTsKCiAgRmllbGRJbml0aWFsaXphdGlvblNjb3BlLmludGVybmFsRnJvbShGaWVsZEluaXRpYWxpemF0aW9uU2NvcGUgb3RoZXIpCiAgICAgIDogaXNUaGlzRXhwb3NlZCA9IG90aGVyLmlzVGhpc0V4cG9zZWQsCiAgICAgICAgaXNJbmRlZmluaXRlID0gb3RoZXIuaXNJbmRlZmluaXRlOwoKICBmYWN0b3J5IEZpZWxkSW5pdGlhbGl6YXRpb25TY29wZS5mcm9tKEZpZWxkSW5pdGlhbGl6YXRpb25TY29wZSBvdGhlcikgewogICAgaWYgKG90aGVyID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIG5ldyBGaWVsZEluaXRpYWxpemF0aW9uU2NvcGUuaW50ZXJuYWxGcm9tKG90aGVyKTsKICB9CgogIHZvaWQgdXBkYXRlRmllbGQoRmllbGRFbnRpdHkgZmllbGQsIFR5cGVJbmZvcm1hdGlvbiB0eXBlKSB7CiAgICBpZiAoaXNUaGlzRXhwb3NlZCkgcmV0dXJuOwogICAgaWYgKGlzSW5kZWZpbml0ZSkgcmV0dXJuOwogICAgZmllbGRzID8/PSBuZXcgTWFwPEZpZWxkRW50aXR5LCBUeXBlSW5mb3JtYXRpb24+KCk7CiAgICBmaWVsZHNbZmllbGRdID0gdHlwZTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiByZWFkRmllbGQoRmllbGRFbnRpdHkgZmllbGQpIHsKICAgIHJldHVybiBmaWVsZHMgPT0gbnVsbCA/IG51bGwgOiBmaWVsZHNbZmllbGRdOwogIH0KCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihGaWVsZEVudGl0eSBlbGVtZW50LCBUeXBlSW5mb3JtYXRpb24gdHlwZSkpIHsKICAgIGZpZWxkcz8uZm9yRWFjaChmKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBqb2luIGJldHdlZW4gW3RoZW5TY29wZV0gYW5kIFtlbHNlU2NvcGVdIHdoaWNoIG1vZGVscyB0aGUKICAvLy8gZmxvdyB0aHJvdWdoIGVpdGhlciBbdGhlblNjb3BlXSBvciBbZWxzZVNjb3BlXS4KICBGaWVsZEluaXRpYWxpemF0aW9uU2NvcGUgbWVyZ2VEaWFtb25kRmxvdyhJbmZlcnJlckVuZ2luZSBpbmZlcnJlciwKICAgICAgRmllbGRJbml0aWFsaXphdGlvblNjb3BlIHRoZW5TY29wZSwgRmllbGRJbml0aWFsaXphdGlvblNjb3BlIGVsc2VTY29wZSkgewogICAgYXNzZXJ0KGVsc2VTY29wZSAhPSBudWxsKTsKCiAgICAvLyBRdWljayBiYWlsb3V0IGNoZWNrLiBJZiBbaXNUaGlzRXhwb3NlZF0gb3IgW2lzSW5kZWZpbml0ZV0gaXMgdHJ1ZSwgd2UKICAgIC8vIGtub3cgdGhlIGNvZGUgZm9sbG93aW5nIHdvbidUeXBlSW5mb3JtYXRpb24gZG8gYW55dGhpbmcuCiAgICBpZiAoaXNUaGlzRXhwb3NlZCkgcmV0dXJuIHRoaXM7CiAgICBpZiAoaXNJbmRlZmluaXRlKSByZXR1cm4gdGhpczsKCiAgICBGaWVsZEluaXRpYWxpemF0aW9uU2NvcGUgb3RoZXJTY29wZSA9CiAgICAgICAgZWxzZVNjb3BlLmZpZWxkcyA9PSBudWxsID8gdGhpcyA6IGVsc2VTY29wZTsKCiAgICB0aGVuU2NvcGUuZm9yRWFjaCgoRmllbGRFbnRpdHkgZmllbGQsIFR5cGVJbmZvcm1hdGlvbiB0eXBlKSB7CiAgICAgIFR5cGVJbmZvcm1hdGlvbiBvdGhlclR5cGUgPSBvdGhlclNjb3BlLnJlYWRGaWVsZChmaWVsZCk7CiAgICAgIGlmIChvdGhlclR5cGUgPT0gbnVsbCkgcmV0dXJuOwogICAgICB1cGRhdGVGaWVsZChmaWVsZCwgaW5mZXJyZXIudHlwZXMuYWxsb2NhdGVEaWFtb25kUGhpKHR5cGUsIG90aGVyVHlwZSkpOwogICAgfSk7CgogICAgaXNUaGlzRXhwb3NlZCA9IHRoZW5TY29wZS5pc1RoaXNFeHBvc2VkIHx8IGVsc2VTY29wZS5pc1RoaXNFeHBvc2VkOwogICAgaXNJbmRlZmluaXRlID0gdGhlblNjb3BlLmlzSW5kZWZpbml0ZSB8fCBlbHNlU2NvcGUuaXNJbmRlZmluaXRlOwogICAgcmV0dXJuIHRoaXM7CiAgfQp9CgovLy8gUGxhY2Vob2xkZXIgZm9yIGluZmVycmVkIGFyZ3VtZW50cyB0eXBlcyBvbiBzZW5kcy4KY2xhc3MgQXJndW1lbnRzVHlwZXMgZXh0ZW5kcyBJdGVyYWJsZU1peGluPFR5cGVJbmZvcm1hdGlvbj4gewogIGZpbmFsIExpc3Q8VHlwZUluZm9ybWF0aW9uPiBwb3NpdGlvbmFsOwogIGZpbmFsIE1hcDxTdHJpbmcsIFR5cGVJbmZvcm1hdGlvbj4gbmFtZWQ7CiAgQXJndW1lbnRzVHlwZXModGhpcy5wb3NpdGlvbmFsLCBuYW1lZCkKICAgICAgOiB0aGlzLm5hbWVkID0gKG5hbWVkID09IG51bGwgfHwgbmFtZWQuaXNFbXB0eSkgPyBjb25zdCB7fSA6IG5hbWVkIHsKICAgIGFzc2VydCh0aGlzLnBvc2l0aW9uYWwuZXZlcnkoKFR5cGVJbmZvcm1hdGlvbiB0eXBlKSA9PiB0eXBlICE9IG51bGwpKTsKICAgIGFzc2VydCh0aGlzLm5hbWVkLnZhbHVlcy5ldmVyeSgoVHlwZUluZm9ybWF0aW9uIHR5cGUpID0+IHR5cGUgIT0gbnVsbCkpOwogIH0KCiAgQXJndW1lbnRzVHlwZXMuZW1wdHkoKQogICAgICA6IHBvc2l0aW9uYWwgPSBjb25zdCBbXSwKICAgICAgICBuYW1lZCA9IGNvbnN0IHt9OwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGxlbmd0aCA9PiBwb3NpdGlvbmFsLmxlbmd0aCArIG5hbWVkLmxlbmd0aDsKCiAgQG92ZXJyaWRlCiAgSXRlcmF0b3I8VHlwZUluZm9ybWF0aW9uPiBnZXQgaXRlcmF0b3IgPT4gbmV3IEFyZ3VtZW50c1R5cGVzSXRlcmF0b3IodGhpcyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICJ7IHBvc2l0aW9uYWwgPSAkcG9zaXRpb25hbCwgbmFtZWQgPSAkbmFtZWQgfSI7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChwb3NpdGlvbmFsLmxlbmd0aCAhPSBvdGhlci5wb3NpdGlvbmFsLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogICAgaWYgKG5hbWVkLmxlbmd0aCAhPSBvdGhlci5uYW1lZC5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9zaXRpb25hbC5sZW5ndGg7IGkrKykgewogICAgICBpZiAocG9zaXRpb25hbFtpXSAhPSBvdGhlci5wb3NpdGlvbmFsW2ldKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gdHJ1ZTsKICAgIG5hbWVkLmZvckVhY2goKG5hbWUsIHR5cGUpIHsKICAgICAgaWYgKG90aGVyLm5hbWVkW25hbWVdICE9IHR5cGUpIHJlc3VsdCA9IGZhbHNlOwogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignQXJndW1lbnRzVHlwZXMuaGFzaENvZGUnKTsKCiAgYm9vbCBoYXNOb0FyZ3VtZW50cygpID0+IHBvc2l0aW9uYWwuaXNFbXB0eSAmJiBuYW1lZC5pc0VtcHR5OwoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2godm9pZCBmKFR5cGVJbmZvcm1hdGlvbiB0eXBlKSkgewogICAgcG9zaXRpb25hbC5mb3JFYWNoKGYpOwogICAgbmFtZWQudmFsdWVzLmZvckVhY2goZik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGV2ZXJ5KGJvb2wgZihUeXBlSW5mb3JtYXRpb24gdHlwZSkpIHsKICAgIHJldHVybiBwb3NpdGlvbmFsLmV2ZXJ5KGYpICYmIG5hbWVkLnZhbHVlcy5ldmVyeShmKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnMoT2JqZWN0IHR5cGUpIHsKICAgIHJldHVybiBwb3NpdGlvbmFsLmNvbnRhaW5zKHR5cGUpIHx8IG5hbWVkLmNvbnRhaW5zVmFsdWUodHlwZSk7CiAgfQp9CgpjbGFzcyBBcmd1bWVudHNUeXBlc0l0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8VHlwZUluZm9ybWF0aW9uPiB7CiAgZmluYWwgSXRlcmF0b3I8VHlwZUluZm9ybWF0aW9uPiBwb3NpdGlvbmFsOwogIGZpbmFsIEl0ZXJhdG9yPFR5cGVJbmZvcm1hdGlvbj4gbmFtZWQ7CiAgYm9vbCBfaXRlcmF0ZVBvc2l0aW9uYWwgPSB0cnVlOwoKICBBcmd1bWVudHNUeXBlc0l0ZXJhdG9yKEFyZ3VtZW50c1R5cGVzIGl0ZXJhdGVlKQogICAgICA6IHBvc2l0aW9uYWwgPSBpdGVyYXRlZS5wb3NpdGlvbmFsLml0ZXJhdG9yLAogICAgICAgIG5hbWVkID0gaXRlcmF0ZWUubmFtZWQudmFsdWVzLml0ZXJhdG9yOwoKICBJdGVyYXRvcjxUeXBlSW5mb3JtYXRpb24+IGdldCBfY3VycmVudEl0ZXJhdG9yID0+CiAgICAgIF9pdGVyYXRlUG9zaXRpb25hbCA/IHBvc2l0aW9uYWwgOiBuYW1lZDsKCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIGdldCBjdXJyZW50ID0+IF9jdXJyZW50SXRlcmF0b3IuY3VycmVudDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmIChfaXRlcmF0ZVBvc2l0aW9uYWwgJiYgcG9zaXRpb25hbC5tb3ZlTmV4dCgpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgX2l0ZXJhdGVQb3NpdGlvbmFsID0gZmFsc2U7CiAgICByZXR1cm4gbmFtZWQubW92ZU5leHQoKTsKICB9Cn0KCi8vLyBQbGFjZWhvbGRlciBmb3IgaW5mZXJyZWQgdHlwZXMgb2YgbG9jYWwgdmFyaWFibGVzLgpjbGFzcyBMb2NhbHNIYW5kbGVyIHsKICBmaW5hbCBWYXJpYWJsZVNjb3BlIF9sb2NhbHM7CgogIExvY2Fsc0hhbmRsZXIoKSA6IF9sb2NhbHMgPSBuZXcgVmFyaWFibGVTY29wZSgpOwoKICBMb2NhbHNIYW5kbGVyLmZyb20oTG9jYWxzSGFuZGxlciBvdGhlcikKICAgICAgOiBfbG9jYWxzID0gbmV3IFZhcmlhYmxlU2NvcGUocGFyZW50OiBvdGhlci5fbG9jYWxzKTsKCiAgTG9jYWxzSGFuZGxlci50cnlCbG9jayhMb2NhbHNIYW5kbGVyIG90aGVyLCBpci5UcmVlTm9kZSBibG9jaykKICAgICAgOiBfbG9jYWxzID0gbmV3IFZhcmlhYmxlU2NvcGUudHJ5QmxvY2soYmxvY2ssIHBhcmVudDogb3RoZXIuX2xvY2Fscyk7CgogIExvY2Fsc0hhbmRsZXIuZGVlcENvcHlPZihMb2NhbHNIYW5kbGVyIG90aGVyKQogICAgICA6IF9sb2NhbHMgPSBuZXcgVmFyaWFibGVTY29wZS5kZWVwQ29weU9mKG90aGVyLl9sb2NhbHMpOwoKICBUeXBlSW5mb3JtYXRpb24gdXNlKEluZmVycmVyRW5naW5lIGluZmVycmVyLCBMb2NhbCBsb2NhbCkgewogICAgcmV0dXJuIF9sb2NhbHNbbG9jYWxdOwogIH0KCiAgdm9pZCB1cGRhdGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIsIExvY2FsIGxvY2FsLCBUeXBlSW5mb3JtYXRpb24gdHlwZSwKICAgICAgaXIuTm9kZSBub2RlLCBEYXJ0VHlwZSBzdGF0aWNUeXBlLCBMb2NhbHNIYW5kbGVyIHRyeUJsb2NrKSB7CiAgICBpZiAodHJ5QmxvY2sgIT0gbnVsbCkgewogICAgICAvLyBXZSBkb24ndCBrbm93IGlmIGFuIGFzc2lnbm1lbnQgaW4gYSB0cnkgYmxvY2sKICAgICAgLy8gd2lsbCBiZSBleGVjdXRlZCwgc28gYWxsIGFzc2lnbm1lbnRzIGluIHRoYXQgYmxvY2sgYXJlCiAgICAgIC8vIHBvdGVudGlhbCB0eXBlcyBhZnRlciB3ZSBoYXZlIGxlZnQgaXQuIFdlIHVwZGF0ZSB0aGUgcGFyZW50CiAgICAgIC8vIG9mIHRoZSB0cnkgYmxvY2sgc28gdGhhdCwgYXQgZXhpdCBvZiB0aGUgdHJ5IGJsb2NrLCB3ZSBnZXQKICAgICAgLy8gdGhlIHJpZ2h0IHBoaSBmb3IgaXQuCiAgICAgIFR5cGVJbmZvcm1hdGlvbiBleGlzdGluZyA9IHRyeUJsb2NrLl9sb2NhbHMucGFyZW50W2xvY2FsXTsKICAgICAgaWYgKGV4aXN0aW5nICE9IG51bGwpIHsKICAgICAgICBUeXBlSW5mb3JtYXRpb24gcGhpVHlwZSA9IGluZmVycmVyLnR5cGVzLmFsbG9jYXRlUGhpKAogICAgICAgICAgICB0cnlCbG9jay5fbG9jYWxzLnRyeUJsb2NrLCBsb2NhbCwgZXhpc3RpbmcsCiAgICAgICAgICAgIGlzVHJ5OiB0cnlCbG9jay5fbG9jYWxzLmlzVHJ5KTsKICAgICAgICBUeXBlSW5mb3JtYXRpb24gaW5wdXRUeXBlID0KICAgICAgICAgICAgaW5mZXJyZXIudHlwZXMuYWRkUGhpSW5wdXQobG9jYWwsIHBoaVR5cGUsIHR5cGUpOwogICAgICAgIHRyeUJsb2NrLl9sb2NhbHMucGFyZW50W2xvY2FsXSA9IGlucHV0VHlwZTsKICAgICAgfQogICAgICAvLyBVcGRhdGUgdGhlIGN1cnJlbnQgaGFuZGxlciB1bmNvbmRpdGlvbmFsbHkgd2l0aCB0aGUgbmV3CiAgICAgIC8vIHR5cGUuCiAgICAgIF9sb2NhbHNbbG9jYWxdID0gdHlwZTsKICAgIH0gZWxzZSB7CiAgICAgIF9sb2NhbHNbbG9jYWxdID0gdHlwZTsKICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIHRoZSBqb2luIGJldHdlZW4gdGhpcyBsb2NhbHMgaGFuZGxlciBhbmQgW290aGVyXSB3aGljaCBtb2RlbHMgdGhlCiAgLy8vIGZsb3cgdGhyb3VnaCBlaXRoZXIgdGhpcyBvciBbb3RoZXJdLgogIC8vLwogIC8vLyBJZiBbaW5QbGFjZV0gaXMgYHRydWVgLCB0aGUgdmFyaWFibGUgdHlwZXMgaW4gdGhpcyBsb2NhbHMgaGFuZGxlciBhcmUKICAvLy8gcmVwbGFjZWQgYnkgdGhlIHZhcmlhYmxlcyB0eXBlcyBpbiBbb3RoZXJdLiBPdGhlcndpc2UgdGhlIHZhcmlhYmxlIHR5cGVzCiAgLy8vIGZyb20gYm90aCBhcmUgbWVyZ2VkIHdpdGggYSBwaGkgdHlwZS4KICBMb2NhbHNIYW5kbGVyIG1lcmdlRmxvdyhJbmZlcnJlckVuZ2luZSBpbmZlcnJlciwgTG9jYWxzSGFuZGxlciBvdGhlciwKICAgICAge2Jvb2wgaW5QbGFjZTogZmFsc2V9KSB7CiAgICBWYXJpYWJsZVNjb3BlIGNvbW1vbiA9IF9sb2NhbHMuY29tbW9uUGFyZW50KG90aGVyLl9sb2NhbHMpOwogICAgYXNzZXJ0KAogICAgICAgIGNvbW1vbiAhPSBudWxsLAogICAgICAgICJObyBjb21tb24gcGFyZW50IGZvclxuIgogICAgICAgICIxOiR7X2xvY2Fscy50b1N0cnVjdHVyZWRUZXh0KCcgICcpfVxuIgogICAgICAgICIyOiR7b3RoZXIuX2xvY2Fscy50b1N0cnVjdHVyZWRUZXh0KCcgICcpfSIpOwogICAgYXNzZXJ0KAogICAgICAgIGNvbW1vbiA9PSBfbG9jYWxzIHx8IF9sb2NhbHMudmFyaWFibGVzID09IG51bGwsCiAgICAgICAgIk5vbi1lbXB0eSBjb21tb24gcGFyZW50IGZvclxuIgogICAgICAgICIxOiR7Y29tbW9uLnRvU3RydWN0dXJlZFRleHQoJyAgJyl9XG4iCiAgICAgICAgIjI6JHtfbG9jYWxzLnRvU3RydWN0dXJlZFRleHQoJyAgJyl9Iik7CiAgICBvdGhlci5fbG9jYWxzLmZvckVhY2hMb2NhbFVudGlsU2NvcGUoY29tbW9uLAogICAgICAgIChMb2NhbCBsb2NhbCwgVHlwZUluZm9ybWF0aW9uIHR5cGUpIHsKICAgICAgVHlwZUluZm9ybWF0aW9uIG15VHlwZSA9IF9sb2NhbHNbbG9jYWxdOwogICAgICBpZiAobXlUeXBlID09IG51bGwpIHJldHVybjsgLy8gVmFyaWFibGUgaXMgb25seSBkZWZpbmVkIGluIFtvdGhlcl0uCiAgICAgIGlmICh0eXBlID09IG15VHlwZSkgcmV0dXJuOwogICAgICBfbG9jYWxzW2xvY2FsXSA9CiAgICAgICAgICBpblBsYWNlID8gdHlwZSA6IGluZmVycmVyLnR5cGVzLmFsbG9jYXRlRGlhbW9uZFBoaShteVR5cGUsIHR5cGUpOwogICAgfSk7CiAgICByZXR1cm4gdGhpczsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBqb2luIGJldHdlZW4gW3RoZW5CcmFuY2hdIGFuZCBbZWxzZUJyYW5jaF0gd2hpY2ggbW9kZWxzIHRoZQogIC8vLyBmbG93IHRocm91Z2ggZWl0aGVyIFt0aGVuQnJhbmNoXSBvciBbZWxzZUJyYW5jaF0uCiAgTG9jYWxzSGFuZGxlciBtZXJnZURpYW1vbmRGbG93KEluZmVycmVyRW5naW5lIGluZmVycmVyLAogICAgICBMb2NhbHNIYW5kbGVyIHRoZW5CcmFuY2gsIExvY2Fsc0hhbmRsZXIgZWxzZUJyYW5jaCkgewogICAgYXNzZXJ0KGVsc2VCcmFuY2ggIT0gbnVsbCk7CgogICAgdm9pZCBtZXJnZUxvY2FsKExvY2FsIGxvY2FsKSB7CiAgICAgIFR5cGVJbmZvcm1hdGlvbiBteVR5cGUgPSBfbG9jYWxzW2xvY2FsXTsKICAgICAgaWYgKG15VHlwZSA9PSBudWxsKSByZXR1cm47CiAgICAgIFR5cGVJbmZvcm1hdGlvbiBlbHNlVHlwZSA9IGVsc2VCcmFuY2guX2xvY2Fsc1tsb2NhbF07CiAgICAgIFR5cGVJbmZvcm1hdGlvbiB0aGVuVHlwZSA9IHRoZW5CcmFuY2guX2xvY2Fsc1tsb2NhbF07CiAgICAgIGlmICh0aGVuVHlwZSA9PSBlbHNlVHlwZSkgewogICAgICAgIF9sb2NhbHNbbG9jYWxdID0gdGhlblR5cGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2xvY2Fsc1tsb2NhbF0gPSBpbmZlcnJlci50eXBlcy5hbGxvY2F0ZURpYW1vbmRQaGkodGhlblR5cGUsIGVsc2VUeXBlKTsKICAgICAgfQogICAgfQoKICAgIFZhcmlhYmxlU2NvcGUgY29tbW9uID0gX2xvY2Fscy5jb21tb25QYXJlbnQodGhlbkJyYW5jaC5fbG9jYWxzKTsKICAgIGFzc2VydCgKICAgICAgICBjb21tb24gIT0gbnVsbCwKICAgICAgICAiTm8gY29tbW9uIHBhcmVudCBmb3JcbiIKICAgICAgICAiMToke19sb2NhbHMudG9TdHJ1Y3R1cmVkVGV4dCgnICAnKX1cbiIKICAgICAgICAiMjoke3RoZW5CcmFuY2guX2xvY2Fscy50b1N0cnVjdHVyZWRUZXh0KCcgICcpfSIpOwogICAgYXNzZXJ0KAogICAgICAgIF9sb2NhbHMuY29tbW9uUGFyZW50KGVsc2VCcmFuY2guX2xvY2FscykgPT0gY29tbW9uLAogICAgICAgICJEaWZmIGNvbW1vbiBwYXJlbnQgZm9yXG4iCiAgICAgICAgIjE6JHtjb21tb24udG9TdHJ1Y3R1cmVkVGV4dCgnICAnKX1cbjI6IgogICAgICAgICIke19sb2NhbHMuY29tbW9uUGFyZW50KGVsc2VCcmFuY2guX2xvY2Fscyk/LnRvU3RydWN0dXJlZFRleHQoJyAgJyl9Iik7CiAgICBhc3NlcnQoCiAgICAgICAgY29tbW9uID09IF9sb2NhbHMgfHwgX2xvY2Fscy52YXJpYWJsZXMgPT0gbnVsbCwKICAgICAgICAiTm9uLWVtcHR5IGNvbW1vbiBwYXJlbnQgZm9yXG4iCiAgICAgICAgImNvbW1vbjoke2NvbW1vbi50b1N0cnVjdHVyZWRUZXh0KCcgICcpfVxuIgogICAgICAgICIxOiR7X2xvY2Fscy50b1N0cnVjdHVyZWRUZXh0KCcgICcpfVxuIgogICAgICAgICIyOiR7dGhlbkJyYW5jaC5fbG9jYWxzLnRvU3RydWN0dXJlZFRleHQoJyAgJyl9Iik7CiAgICB0aGVuQnJhbmNoLl9sb2NhbHMuZm9yRWFjaExvY2FsVW50aWxTY29wZShjb21tb24sIChMb2NhbCBsb2NhbCwgXykgewogICAgICBtZXJnZUxvY2FsKGxvY2FsKTsKICAgIH0pOwogICAgZWxzZUJyYW5jaC5fbG9jYWxzLmZvckVhY2hMb2NhbFVudGlsU2NvcGUoY29tbW9uLCAoTG9jYWwgbG9jYWwsIF8pIHsKICAgICAgLy8gRGlzY2FyZCBsb2NhbHMgd2UgYWxyZWFkeSBwcm9jZXNzZWQgd2hlbiBpdGVyYXRpbmcgb3ZlcgogICAgICAvLyBbdGhlbkJyYW5jaF0ncyBsb2NhbHMuCiAgICAgIGlmICghdGhlbkJyYW5jaC5fbG9jYWxzLnVwZGF0ZXMobG9jYWwpKSBtZXJnZUxvY2FsKGxvY2FsKTsKICAgIH0pOwogICAgcmV0dXJuIHRoaXM7CiAgfQoKICAvLy8gTWVyZ2UgYWxsIFtMb2NhbHNIYW5kbGVyXSBpbiBbaGFuZGxlcnNdIGludG8gWzp0aGlzOl0uCiAgLy8vCiAgLy8vIElmIFtrZWVwT3duTG9jYWxzXSBpcyB0cnVlLCB0aGUgdHlwZXMgb2YgbG9jYWxzIGluIHRoaXMKICAvLy8gW0xvY2Fsc0hhbmRsZXJdIGFyZSBiZWluZyB1c2VkIGluIHRoZSBtZXJnZS4gW2tlZXBPd25Mb2NhbHNdCiAgLy8vIHNob3VsZCBiZSB0cnVlIGlmIHRoaXMgW0xvY2Fsc0hhbmRsZXJdLCB0aGUgZG9taW5hdG9yIG9mCiAgLy8vIGFsbCBbaGFuZGxlcnNdLCBhbHNvIGRpcmVjdGx5IGZsb3dzIGludG8gdGhlIGpvaW4gcG9pbnQsCiAgLy8vIHRoYXQgaXMgdGhlIGNvZGUgYWZ0ZXIgYWxsIFtoYW5kbGVyc10uIEZvciBleGFtcGxlLCBjb25zaWRlcjoKICAvLy8KICAvLy8gWzogc3dpdGNoICguLi4pIHsKICAvLy8gICAgICBjYXNlIDE6IC4uLjsgYnJlYWs7CiAgLy8vICAgIH0KICAvLy8gOl0KICAvLy8KICAvLy8gVGhlIFtMb2NhbHNIYW5kbGVyXSBhdCBlbnRyeSBvZiB0aGUgc3dpdGNoIGFsc28gZmxvd3MgaW50byB0aGUKICAvLy8gZXhpdCBvZiB0aGUgc3dpdGNoLCBiZWNhdXNlIHRoZXJlIGlzIG5vIGRlZmF1bHQgY2FzZS4gU28gdGhlCiAgLy8vIHR5cGVzIG9mIGxvY2FscyBhdCBlbnRyeSBvZiB0aGUgc3dpdGNoIGhhdmUgdG8gdGFrZSBwYXJ0IHRvIHRoZQogIC8vLyBtZXJnZS4KICAvLy8KICAvLy8gVGhlIGFib3ZlIHNpdHVhdGlvbiBpcyBhbHNvIHRydWUgZm9yIGxhYmVsZWQgc3RhdGVtZW50cyBsaWtlCiAgLy8vCiAgLy8vIFs6IEw6IHsKICAvLy8gICAgICBpZiAoLi4uKSBicmVhazsKICAvLy8gICAgICAuLi4KICAvLy8gICAgfQogIC8vLyA6XQogIC8vLwogIC8vLyB3aGVyZSBbOnRoaXM6XSBpcyB0aGUgW0xvY2Fsc0hhbmRsZXJdIGZvciB0aGUgcGF0aHMgdGhyb3VnaCB0aGUKICAvLy8gbGFiZWxlZCBzdGF0ZW1lbnQgdGhhdCBkbyBub3QgYnJlYWsgb3V0LgogIExvY2Fsc0hhbmRsZXIgbWVyZ2VBZnRlckJyZWFrcygKICAgICAgSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIsIEl0ZXJhYmxlPExvY2Fsc0hhbmRsZXI+IGhhbmRsZXJzLAogICAgICB7Ym9vbCBrZWVwT3duTG9jYWxzOiB0cnVlfSkgewogICAgaXIuTm9kZSB0cnlCbG9jayA9IF9sb2NhbHMudHJ5QmxvY2s7CiAgICAvLyBVc2UgYSBzZXBhcmF0ZSBsb2NhbHMgaGFuZGxlciB0byBwZXJmb3JtIHRoZSBtZXJnZSBpbiwgc28gdGhhdCBQaGkKICAgIC8vIGNyZWF0aW9uIGRvZXMgbm90IGludmFsaWRhdGUgcHJldmlvdXMgdHlwZSBrbm93bGVkZ2Ugd2hpbGUgd2UgbWlnaHQKICAgIC8vIHN0aWxsIGxvb2sgaXQgdXAuCiAgICBWYXJpYWJsZVNjb3BlIG1lcmdlZCA9IHRyeUJsb2NrICE9IG51bGwKICAgICAgICA/IG5ldyBWYXJpYWJsZVNjb3BlLnRyeUJsb2NrKHRyeUJsb2NrLCBwYXJlbnQ6IF9sb2NhbHMpCiAgICAgICAgOiBuZXcgVmFyaWFibGVTY29wZShwYXJlbnQ6IF9sb2NhbHMpOwogICAgU2V0PExvY2FsPiBzZWVuTG9jYWxzID0gbmV3IFNldGxldDxMb2NhbD4oKTsKICAgIC8vIE1lcmdlIGFsbCBvdGhlciBoYW5kbGVycy4KICAgIGZvciAoTG9jYWxzSGFuZGxlciBoYW5kbGVyIGluIGhhbmRsZXJzKSB7CiAgICAgIFZhcmlhYmxlU2NvcGUgY29tbW9uID0gX2xvY2Fscy5jb21tb25QYXJlbnQoaGFuZGxlci5fbG9jYWxzKTsKICAgICAgYXNzZXJ0KAogICAgICAgICAgY29tbW9uICE9IG51bGwsCiAgICAgICAgICAiTm8gY29tbW9uIHBhcmVudCBmb3JcbiIKICAgICAgICAgICIxOiR7X2xvY2Fscy50b1N0cnVjdHVyZWRUZXh0KCcgICcpfVxuIgogICAgICAgICAgIjI6JHtoYW5kbGVyLl9sb2NhbHMudG9TdHJ1Y3R1cmVkVGV4dCgnICAnKX0iKTsKICAgICAgYXNzZXJ0KAogICAgICAgICAgY29tbW9uID09IF9sb2NhbHMgfHwgX2xvY2Fscy52YXJpYWJsZXMgPT0gbnVsbCwKICAgICAgICAgICJOb24tZW1wdHkgY29tbW9uIHBhcmVudCBmb3JcbiIKICAgICAgICAgICJjb21tb246JHtjb21tb24udG9TdHJ1Y3R1cmVkVGV4dCgnICAnKX1cbiIKICAgICAgICAgICIxOiR7X2xvY2Fscy50b1N0cnVjdHVyZWRUZXh0KCcgICcpfVxuIgogICAgICAgICAgIjI6JHtoYW5kbGVyLl9sb2NhbHMudG9TdHJ1Y3R1cmVkVGV4dCgnICAnKX0iKTsKICAgICAgaGFuZGxlci5fbG9jYWxzLmZvckVhY2hMb2NhbFVudGlsU2NvcGUoY29tbW9uLCAobG9jYWwsIG90aGVyVHlwZSkgewogICAgICAgIFR5cGVJbmZvcm1hdGlvbiBteVR5cGUgPSBtZXJnZWRbbG9jYWxdOwogICAgICAgIGlmIChteVR5cGUgPT0gbnVsbCkgcmV0dXJuOwogICAgICAgIFR5cGVJbmZvcm1hdGlvbiBuZXdUeXBlOwogICAgICAgIGlmICghc2VlbkxvY2Fscy5jb250YWlucyhsb2NhbCkpIHsKICAgICAgICAgIG5ld1R5cGUgPSBpbmZlcnJlci50eXBlcy5hbGxvY2F0ZVBoaSgKICAgICAgICAgICAgICBtZXJnZWQudHJ5QmxvY2ssIGxvY2FsLCBvdGhlclR5cGUsCiAgICAgICAgICAgICAgaXNUcnk6IG1lcmdlZC5pc1RyeSk7CiAgICAgICAgICBzZWVuTG9jYWxzLmFkZChsb2NhbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5ld1R5cGUgPSBpbmZlcnJlci50eXBlcy5hZGRQaGlJbnB1dChsb2NhbCwgbXlUeXBlLCBvdGhlclR5cGUpOwogICAgICAgIH0KICAgICAgICBpZiAobmV3VHlwZSAhPSBteVR5cGUpIHsKICAgICAgICAgIG1lcmdlZFtsb2NhbF0gPSBuZXdUeXBlOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICAvLyBJZiB3ZSB3YW50IHRvIGtlZXAgb3duIGxvY2Fscywgd2UgbWVyZ2UgW3NlZW5Mb2NhbHNdIGZyb20gW3RoaXNdIGludG8KICAgIC8vIFttZXJnZWRdIHRvIHVwZGF0ZSB0aGUgUGhpIG5vZGVzIHdpdGggb3JpZ2luYWwgdmFsdWVzLgogICAgaWYgKGtlZXBPd25Mb2NhbHMpIHsKICAgICAgZm9yIChMb2NhbCB2YXJpYWJsZSBpbiBzZWVuTG9jYWxzKSB7CiAgICAgICAgVHlwZUluZm9ybWF0aW9uIG9yaWdpbmFsVHlwZSA9IF9sb2NhbHNbdmFyaWFibGVdOwogICAgICAgIGlmIChvcmlnaW5hbFR5cGUgIT0gbnVsbCkgewogICAgICAgICAgbWVyZ2VkW3ZhcmlhYmxlXSA9IGluZmVycmVyLnR5cGVzCiAgICAgICAgICAgICAgLmFkZFBoaUlucHV0KHZhcmlhYmxlLCBtZXJnZWRbdmFyaWFibGVdLCBvcmlnaW5hbFR5cGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy8gQ2xlYW4gdXAgUGhpIG5vZGVzIHdpdGggc2luZ2xlIGlucHV0IGFuZCBzdG9yZSBiYWNrIHJlc3VsdCBpbnRvCiAgICAvLyBhY3R1YWwgbG9jYWxzIGhhbmRsZXIuCiAgICBtZXJnZWQuZm9yRWFjaExvY2FsVW50aWxTY29wZShtZXJnZWQsCiAgICAgICAgKExvY2FsIHZhcmlhYmxlLCBUeXBlSW5mb3JtYXRpb24gdHlwZSkgewogICAgICBfbG9jYWxzW3ZhcmlhYmxlXSA9IGluZmVycmVyLnR5cGVzLnNpbXBsaWZ5UGhpKHRyeUJsb2NrLCB2YXJpYWJsZSwgdHlwZSk7CiAgICB9KTsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgLy8vIE1lcmdlIGFsbCBbTG9jYWxzSGFuZGxlcl0gaW4gW2hhbmRsZXJzXSBpbnRvIHRoaXMgaGFuZGxlci4KICAvLy8gUmV0dXJucyB3aGV0aGVyIGEgbG9jYWwgaW4gdGhpcyBoYW5kbGVyIGhhcyBjaGFuZ2VkLgogIGJvb2wgbWVyZ2VBbGwoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIsIEl0ZXJhYmxlPExvY2Fsc0hhbmRsZXI+IGhhbmRsZXJzKSB7CiAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKICAgIGhhbmRsZXJzLmZvckVhY2goKExvY2Fsc0hhbmRsZXIgb3RoZXIpIHsKICAgICAgVmFyaWFibGVTY29wZSBjb21tb24gPSBfbG9jYWxzLmNvbW1vblBhcmVudChvdGhlci5fbG9jYWxzKTsKICAgICAgYXNzZXJ0KAogICAgICAgICAgY29tbW9uICE9IG51bGwsCiAgICAgICAgICAiTm8gY29tbW9uIHBhcmVudCBmb3JcbiIKICAgICAgICAgICIxOiR7X2xvY2Fscy50b1N0cnVjdHVyZWRUZXh0KCcgICcpfVxuIgogICAgICAgICAgIjI6JHtvdGhlci5fbG9jYWxzLnRvU3RydWN0dXJlZFRleHQoJyAgJyl9Iik7CiAgICAgIGFzc2VydCgKICAgICAgICAgIGNvbW1vbiA9PSBfbG9jYWxzIHx8IF9sb2NhbHMudmFyaWFibGVzID09IG51bGwsCiAgICAgICAgICAiTm9uLWVtcHR5IGNvbW1vbiBwYXJlbnQgZm9yXG4iCiAgICAgICAgICAiY29tbW9uOiR7Y29tbW9uLnRvU3RydWN0dXJlZFRleHQoJyAgJyl9XG4iCiAgICAgICAgICAiMToke19sb2NhbHMudG9TdHJ1Y3R1cmVkVGV4dCgnICAnKX1cbiIKICAgICAgICAgICIyOiR7b3RoZXIuX2xvY2Fscy50b1N0cnVjdHVyZWRUZXh0KCcgICcpfSIpOwogICAgICBvdGhlci5fbG9jYWxzLmZvckVhY2hMb2NhbFVudGlsU2NvcGUoY29tbW9uLCAobG9jYWwsIG90aGVyVHlwZSkgewogICAgICAgIFR5cGVJbmZvcm1hdGlvbiBteVR5cGUgPSBfbG9jYWxzW2xvY2FsXTsKICAgICAgICBpZiAobXlUeXBlID09IG51bGwpIHJldHVybjsKICAgICAgICBUeXBlSW5mb3JtYXRpb24gbmV3VHlwZSA9CiAgICAgICAgICAgIGluZmVycmVyLnR5cGVzLmFkZFBoaUlucHV0KGxvY2FsLCBteVR5cGUsIG90aGVyVHlwZSk7CiAgICAgICAgaWYgKG5ld1R5cGUgIT0gbXlUeXBlKSB7CiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgIF9sb2NhbHNbbG9jYWxdID0gbmV3VHlwZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgICByZXR1cm4gY2hhbmdlZDsKICB9CgogIHZvaWQgc3RhcnRMb29wKEluZmVycmVyRW5naW5lIGluZmVycmVyLCBpci5Ob2RlIGxvb3ApIHsKICAgIF9sb2NhbHMuZm9yRWFjaExvY2FsKChMb2NhbCB2YXJpYWJsZSwgVHlwZUluZm9ybWF0aW9uIHR5cGUpIHsKICAgICAgVHlwZUluZm9ybWF0aW9uIG5ld1R5cGUgPQogICAgICAgICAgaW5mZXJyZXIudHlwZXMuYWxsb2NhdGVMb29wUGhpKGxvb3AsIHZhcmlhYmxlLCB0eXBlLCBpc1RyeTogZmFsc2UpOwogICAgICBpZiAobmV3VHlwZSAhPSB0eXBlKSB7CiAgICAgICAgX2xvY2Fsc1t2YXJpYWJsZV0gPSBuZXdUeXBlOwogICAgICB9CiAgICB9KTsKICB9CgogIHZvaWQgZW5kTG9vcChJbmZlcnJlckVuZ2luZSBpbmZlcnJlciwgaXIuTm9kZSBsb29wKSB7CiAgICBfbG9jYWxzLmZvckVhY2hMb2NhbCgoTG9jYWwgdmFyaWFibGUsIFR5cGVJbmZvcm1hdGlvbiB0eXBlKSB7CiAgICAgIFR5cGVJbmZvcm1hdGlvbiBuZXdUeXBlID0KICAgICAgICAgIGluZmVycmVyLnR5cGVzLnNpbXBsaWZ5UGhpKGxvb3AsIHZhcmlhYmxlLCB0eXBlKTsKICAgICAgaWYgKG5ld1R5cGUgIT0gdHlwZSkgewogICAgICAgIF9sb2NhbHNbdmFyaWFibGVdID0gbmV3VHlwZTsKICAgICAgfQogICAgfSk7CiAgfQoKICBTdHJpbmcgdG9TdHJ1Y3R1cmVkVGV4dChTdHJpbmcgaW5kZW50KSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBfdG9TdHJ1Y3R1cmVkVGV4dChzYiwgaW5kZW50KTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgdm9pZCBfdG9TdHJ1Y3R1cmVkVGV4dChTdHJpbmdCdWZmZXIgc2IsIFN0cmluZyBpbmRlbnQpIHsKICAgIHNiLndyaXRlKCdMb2NhbHNIYW5kbGVyKCRoYXNoQ29kZSkgWycpOwogICAgc2Iud3JpdGUoJ1xuJHtpbmRlbnR9ICBsb2NhbHM6Jyk7CiAgICBfbG9jYWxzLl90b1N0cnVjdHVyZWRUZXh0KHNiLCAnJHtpbmRlbnR9ICAgICcpOwogICAgc2Iud3JpdGUoJ1xuXScpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJ0xvY2Fsc0hhbmRsZXIoJyk7CiAgICBzYi53cml0ZSgnbG9jYWxzPSRfbG9jYWxzJyk7CiAgICBzYi53cml0ZSgnKScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CoJjAE5OPAEYAS0oJCEaHB8gAUNHRkYyFjEGPRQBKQE5HgEtGgEeAR8fHB4tATcfHC5BQgQBMCwTRSMoHyYTOgEvJgFLBk1GMAFONCYXKCkoKR0wDRMGBAEwHEc3BhMEATwaHTUGIAQBUD0fS0IEASAbNCAeHSszIhsKBicOBhpEDQ4ZIDQyBgQBRCUEASEpLAQBKyojGgQBOywsGkkGHEkGHSs+LTwKBhooNgYTBAEMFj8hBAIBPSEsFgFLMBUBHR8eAUgtKwFKJD0EAT4fHjgaBAExMgQBRBgEAUw2RVAfAU1AJCMBKjUBQj8lTggBSEURBAIBNz4qLClLS00EARkfGgEMNgEMTgEMRwEMHEQ6Mj4GFyE1CBMEAQxNAUABDC8bHQQBDC05BAEMH0MEAgFELikiATIzMAE0LwEMOwEMFDcTBiAdBAIBNxYfATMBKjwBQUwBMD8BPhsEAUpDHDdARUQfQR4+OCwkPjQIQQ8dDR0GBAFQKwZMTyxIH0AMGCEwNgw4KC8wMS4vSiIXTAgRBAFOODo8IAEjLyI8PCIjD1AIBgFFDBghMDsMPCMxUAw4KDQwO0kZCElBIEEIEQQBPQY+Qz8/RAYYHwsJBkVDRg0GQwYOGw8LCQZGLyJBJClKSxksQC4xIS5EDhojMjoOOio2MjpKMCQhKzAxJCERSgohIwoKBk0+GSs6JCxGCggGRx4qMVAIEQQBQTtNGi1CDhojMjgOOio2MjhIMSQiQiEaJAoKCBQEATpCIE4dJQgIBAE4QiA8HSUICAQBKyojGgQBOywmNBUEAQwWKiAhExoEAgExcGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvbG9jYWxzX2hhbmRsZXIuZGFydDdzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pbmZlcnJlci9saXN0X3RyYWNlci5kYXJ0lA8vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBjb21waWxlci5zcmMuaW5mZXJyZXIubGlzdF90cmFjZXI7CgppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvYmFja2VuZC5kYXJ0JyBzaG93IEphdmFTY3JpcHRCYWNrZW5kOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3I7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnIHNob3cgU2V0bGV0OwppbXBvcnQgJ25vZGVfdHJhY2VyLmRhcnQnOwppbXBvcnQgJ3R5cGVfZ3JhcGhfbm9kZXMuZGFydCc7CgovLy8gQSBzZXQgb2Ygc2VsZWN0b3IgbmFtZXMgdGhhdCBbTGlzdF0gaW1wbGVtZW50cywgdGhhdCB3ZSBrbm93IGRvIG5vdAovLy8gY2hhbmdlIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIGxpc3QsIG9yIGxldCB0aGUgbGlzdCBlc2NhcGUgdG8gY29kZQovLy8gdGhhdCBtaWdodCBjaGFuZ2UgdGhlIGVsZW1lbnQgdHlwZS4KU2V0PFN0cmluZz4gb2tMaXN0U2VsZWN0b3JzU2V0ID0gbmV3IFNldDxTdHJpbmc+LmZyb20oY29uc3QgPFN0cmluZz5bCiAgLy8gRnJvbSBPYmplY3QuCiAgJz09JywKICAnaGFzaENvZGUnLAogICd0b1N0cmluZycsCiAgJ25vU3VjaE1ldGhvZCcsCiAgJ3J1bnRpbWVUeXBlJywKCiAgLy8gRnJvbSBJdGVyYWJsZS4KICAnaXRlcmF0b3InLAogICdtYXAnLAogICd3aGVyZScsCiAgJ2V4cGFuZCcsCiAgJ2NvbnRhaW5zJywKICAnZm9yRWFjaCcsCiAgJ3JlZHVjZScsCiAgJ2ZvbGQnLAogICdldmVyeScsCiAgJ2pvaW4nLAogICdhbnknLAogICd0b0xpc3QnLAogICd0b1NldCcsCiAgJ2xlbmd0aCcsCiAgJ2lzRW1wdHknLAogICdpc05vdEVtcHR5JywKICAndGFrZScsCiAgJ3Rha2VXaGlsZScsCiAgJ3NraXAnLAogICdza2lwV2hpbGUnLAogICdmaXJzdCcsCiAgJ2xhc3QnLAogICdzaW5nbGUnLAogICdmaXJzdFdoZXJlJywKICAnbGFzdFdoZXJlJywKICAnc2luZ2xlV2hlcmUnLAogICdlbGVtZW50QXQnLAoKICAvLyBGcm9tIExpc3QuCiAgJ1tdJywKICAnbGVuZ3RoJywKICAncmV2ZXJzZWQnLAogICdzb3J0JywKICAnaW5kZXhPZicsCiAgJ2xhc3RJbmRleE9mJywKICAnY2xlYXInLAogICdyZW1vdmUnLAogICdyZW1vdmVBdCcsCiAgJ3JlbW92ZUxhc3QnLAogICdyZW1vdmVXaGVyZScsCiAgJ3JldGFpbldoZXJlJywKICAnc3VibGlzdCcsCiAgJ2dldFJhbmdlJywKICAncmVtb3ZlUmFuZ2UnLAogICdhc01hcCcsCgogIC8vIEZyb20gSlNBcnJheS4KICAnY2hlY2tNdXRhYmxlJywKICAnY2hlY2tHcm93YWJsZScsCl0pOwoKU2V0PFN0cmluZz4gZG9Ob3RDaGFuZ2VMZW5ndGhTZWxlY3RvcnNTZXQgPSBuZXcgU2V0PFN0cmluZz4uZnJvbShjb25zdCA8U3RyaW5nPlsKICAvLyBGcm9tIE9iamVjdC4KICAnPT0nLAogICdoYXNoQ29kZScsCiAgJ3RvU3RyaW5nJywKICAnbm9TdWNoTWV0aG9kJywKICAncnVudGltZVR5cGUnLAoKICAvLyBGcm9tIEl0ZXJhYmxlLgogICdpdGVyYXRvcicsCiAgJ21hcCcsCiAgJ3doZXJlJywKICAnZXhwYW5kJywKICAnY29udGFpbnMnLAogICdmb3JFYWNoJywKICAncmVkdWNlJywKICAnZm9sZCcsCiAgJ2V2ZXJ5JywKICAnam9pbicsCiAgJ2FueScsCiAgJ3RvTGlzdCcsCiAgJ3RvU2V0JywKICAnbGVuZ3RoJywKICAnaXNFbXB0eScsCiAgJ2lzTm90RW1wdHknLAogICd0YWtlJywKICAndGFrZVdoaWxlJywKICAnc2tpcCcsCiAgJ3NraXBXaGlsZScsCiAgJ2ZpcnN0JywKICAnbGFzdCcsCiAgJ3NpbmdsZScsCiAgJ2ZpcnN0V2hlcmUnLAogICdsYXN0V2hlcmUnLAogICdzaW5nbGVXaGVyZScsCiAgJ2VsZW1lbnRBdCcsCgogIC8vIEZyb20gTGlzdC4KICAnW10nLAogICdbXT0nLAogICdsZW5ndGgnLAogICdyZXZlcnNlZCcsCiAgJ3NvcnQnLAogICdpbmRleE9mJywKICAnbGFzdEluZGV4T2YnLAogICdzdWJsaXN0JywKICAnZ2V0UmFuZ2UnLAogICdhc01hcCcsCgogIC8vIEZyb20gSlNBcnJheS4KICAnY2hlY2tNdXRhYmxlJywKICAnY2hlY2tHcm93YWJsZScsCl0pOwoKY2xhc3MgTGlzdFRyYWNlclZpc2l0b3IgZXh0ZW5kcyBUcmFjZXJWaXNpdG9yIHsKICAvLyBUaGUgW1NldF0gb2YgZm91bmQgYXNzaWdubWVudHMgdG8gdGhlIGxpc3QuCiAgU2V0PFR5cGVJbmZvcm1hdGlvbj4gYXNzaWdubWVudHMgPSBuZXcgU2V0bGV0PFR5cGVJbmZvcm1hdGlvbj4oKTsKICBib29sIGNhbGxzR3Jvd2FibGVNZXRob2QgPSBmYWxzZTsKCiAgTGlzdFRyYWNlclZpc2l0b3IodHJhY2VkVHlwZSwgaW5mZXJyZXIpIDogc3VwZXIodHJhY2VkVHlwZSwgaW5mZXJyZXIpOwoKICAvLy8gUmV0dXJucyBbdHJ1ZV0gaWYgdGhlIGFuYWx5c2lzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIFtmYWxzZV0gaWYgaXQKICAvLy8gYmFpbGVkIG91dC4gSW4gdGhlIGZvcm1lciBjYXNlLCBbYXNzaWdubWVudHNdIGhvbGRzIGEgbGlzdCBvZgogIC8vLyBbVHlwZUluZm9ybWF0aW9uXSBub2RlcyB0aGF0IGZsb3cgaW50byB0aGUgZWxlbWVudCB0eXBlIG9mIHRoaXMgbGlzdC4KICBib29sIHJ1bigpIHsKICAgIGFuYWx5emUoKTsKICAgIExpc3RUeXBlSW5mb3JtYXRpb24gbGlzdCA9IHRyYWNlZFR5cGU7CiAgICBpZiAoY29udGludWVBbmFseXppbmcpIHsKICAgICAgaWYgKCFjYWxsc0dyb3dhYmxlTWV0aG9kICYmIGxpc3QuaW5mZXJyZWRMZW5ndGggPT0gbnVsbCkgewogICAgICAgIGxpc3QuaW5mZXJyZWRMZW5ndGggPSBsaXN0Lm9yaWdpbmFsTGVuZ3RoOwogICAgICB9CiAgICAgIGxpc3QuYWRkRmxvd3NJbnRvVGFyZ2V0cyhmbG93c0ludG8pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGNhbGxzR3Jvd2FibGVNZXRob2QgPSB0cnVlOwogICAgICBhc3NpZ25tZW50cyA9IG51bGw7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q2xvc3VyZUNhbGxTaXRlVHlwZUluZm9ybWF0aW9uKENsb3N1cmVDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBiYWlsb3V0KCdQYXNzZWQgdG8gYSBjbG9zdXJlJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIHN1cGVyLnZpc2l0U3RhdGljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24oaW5mbyk7CiAgICBNZW1iZXJFbnRpdHkgY2FsbGVkID0gaW5mby5jYWxsZWRFbGVtZW50OwogICAgaWYgKGluZmVycmVyLmNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmlzRm9yZWlnbihjYWxsZWQpICYmCiAgICAgICAgY2FsbGVkLm5hbWUgPT0gSmF2YVNjcmlwdEJhY2tlbmQuSlMpIHsKICAgICAgYmFpbG91dCgnVXNlZCBpbiBKUyAke2luZm8uZGVidWdOYW1lfScpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXREeW5hbWljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24oRHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIHN1cGVyLnZpc2l0RHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKGluZm8pOwogICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBpbmZvLnNlbGVjdG9yOwogICAgU3RyaW5nIHNlbGVjdG9yTmFtZSA9IHNlbGVjdG9yLm5hbWU7CiAgICBpZiAoY3VycmVudFVzZXIgPT0gaW5mby5yZWNlaXZlcikgewogICAgICBpZiAoIW9rTGlzdFNlbGVjdG9yc1NldC5jb250YWlucyhzZWxlY3Rvck5hbWUpKSB7CiAgICAgICAgaWYgKHNlbGVjdG9yLmlzQ2FsbCkgewogICAgICAgICAgaW50IHBvc2l0aW9uYWxMZW5ndGggPSBpbmZvLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aDsKICAgICAgICAgIGlmIChzZWxlY3Rvck5hbWUgPT0gJ2FkZCcpIHsKICAgICAgICAgICAgaWYgKHBvc2l0aW9uYWxMZW5ndGggPT0gMSkgewogICAgICAgICAgICAgIGFzc2lnbm1lbnRzLmFkZChpbmZvLmFyZ3VtZW50cy5wb3NpdGlvbmFsWzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rvck5hbWUgPT0gJ2luc2VydCcpIHsKICAgICAgICAgICAgaWYgKHBvc2l0aW9uYWxMZW5ndGggPT0gMikgewogICAgICAgICAgICAgIGFzc2lnbm1lbnRzLmFkZChpbmZvLmFyZ3VtZW50cy5wb3NpdGlvbmFsWzFdKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYmFpbG91dCgnVXNlZCBpbiBhIG5vdC1vayBzZWxlY3RvcicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pc0luZGV4U2V0KSB7CiAgICAgICAgICBhc3NpZ25tZW50cy5hZGQoaW5mby5hcmd1bWVudHMucG9zaXRpb25hbFsxXSk7CiAgICAgICAgfSBlbHNlIGlmICghc2VsZWN0b3IuaXNJbmRleCkgewogICAgICAgICAgYmFpbG91dCgnVXNlZCBpbiBhIG5vdC1vayBzZWxlY3RvcicpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIWRvTm90Q2hhbmdlTGVuZ3RoU2VsZWN0b3JzU2V0LmNvbnRhaW5zKHNlbGVjdG9yTmFtZSkpIHsKICAgICAgICBjYWxsc0dyb3dhYmxlTWV0aG9kID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoc2VsZWN0b3JOYW1lID09ICdsZW5ndGgnICYmIHNlbGVjdG9yLmlzU2V0dGVyKSB7CiAgICAgICAgY2FsbHNHcm93YWJsZU1ldGhvZCA9IHRydWU7CiAgICAgICAgYXNzaWdubWVudHMuYWRkKGluZmVycmVyLnR5cGVzLm51bGxUeXBlKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pc0NhbGwgJiYKICAgICAgICAoaW5mby5oYXNDbG9zdXJlQ2FsbFRhcmdldHMgfHwKICAgICAgICAgICAgaW5mby5jb25jcmV0ZVRhcmdldHMuYW55KChlbGVtZW50KSA9PiAhZWxlbWVudC5pc0Z1bmN0aW9uKSkpIHsKICAgICAgYmFpbG91dCgnUGFzc2VkIHRvIGEgY2xvc3VyZScpOwogICAgICByZXR1cm47CiAgICB9CiAgfQp9CoDYAE5OPAErASQ8MigbIAFISChGEggODhIRARQOCQsMDg0MCgsKCQwLDA0QCg8KDwsKDBAPEQ8BEAgMDgoNEQsMDhAREQ0OEQsBExITBAFREggODhIRARQOCQsMDg0MCgsKCQwLDA0QCg8KDwsKDBAPEQ8BEAgJDA4KDRENDgsBExITBAEwMUQkAUkBS0RMDw8rHUEzCCsTDSIaFAYEAQxNJAQBDEs0LkEvLwYEAQxNNScpKDgfQycpPQ4xKT0OEzIUDCo5KDASCghDJAg7JDIIIidLJg4GBAIBLnBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL2xpc3RfdHJhY2VyLmRhcnQ2c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaW5mZXJyZXIvbWFwX3RyYWNlci5kYXJ0k0EvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBjb21waWxlci5zcmMuaW5mZXJyZXIubWFwX3RyYWNlcjsKCmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9iYWNrZW5kLmRhcnQnIHNob3cgSmF2YVNjcmlwdEJhY2tlbmQ7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCcgc2hvdyBTZWxlY3RvcjsKaW1wb3J0ICdub2RlX3RyYWNlci5kYXJ0JzsKaW1wb3J0ICd0eXBlX2dyYXBoX25vZGVzLmRhcnQnOwoKU2V0PFN0cmluZz4gb2tNYXBTZWxlY3RvcnNTZXQgPSBuZXcgU2V0LmZyb20oY29uc3QgPFN0cmluZz5bCiAgLy8gRnJvbSBPYmplY3QuCiAgIj09IiwKICAiaGFzaENvZGUiLAogICJ0b1N0cmluZyIsCiAgIm5vU3VjaE1ldGhvZCIsCiAgInJ1bnRpbWVUeXBlIiwKICAvLyBGcm9tIE1hcAogICJbXSIsCiAgImlzRW1wdHkiLAogICJpc05vdEVtcHR5IiwKICAia2V5cyIsCiAgImxlbmd0aCIsCiAgInZhbHVlcyIsCiAgImNsZWFyIiwKICAiY29udGFpbnNLZXkiLAogICJjb250YWluc1ZhbHVlIiwKICAiZm9yRWFjaCIsCiAgInJlbW92ZSIKXSk7CgpjbGFzcyBNYXBUcmFjZXJWaXNpdG9yIGV4dGVuZHMgVHJhY2VyVmlzaXRvciB7CiAgLy8gVGhlc2UgbGlzdHMgYXJlIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBuZXdseSBkaXNjb3ZlcmVkIGFzc2lnbm1lbnRzIHRvCiAgLy8gdGhlIG1hcC4gTm90ZSB0aGF0IGVsZW1lbnRzIGF0IGNvcnJlc3BvbmRpbmcgaW5kaWNlcyBhcmUgZXhwZWN0ZWQgdG8KICAvLyBiZWxvbmcgdG8gdGhlIHNhbWUgYXNzaWdubWVudCBvcGVyYXRpb24uCiAgTGlzdDxUeXBlSW5mb3JtYXRpb24+IGtleUFzc2lnbm1lbnRzID0gPFR5cGVJbmZvcm1hdGlvbj5bXTsKICBMaXN0PFR5cGVJbmZvcm1hdGlvbj4gdmFsdWVBc3NpZ25tZW50cyA9IDxUeXBlSW5mb3JtYXRpb24+W107CiAgLy8gVGhpcyBsaXN0IGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBhc3NpZ25tZW50cyBvZiBlbnRpcmUgbWFwcyB0bwogIC8vIHRoaXMgbWFwLgogIExpc3Q8TWFwVHlwZUluZm9ybWF0aW9uPiBtYXBBc3NpZ25tZW50cyA9IDxNYXBUeXBlSW5mb3JtYXRpb24+W107CgogIE1hcFRyYWNlclZpc2l0b3IodHJhY2VkVHlwZSwgaW5mZXJyZXIpIDogc3VwZXIodHJhY2VkVHlwZSwgaW5mZXJyZXIpOwoKICAvLy8gUmV0dXJucyBbdHJ1ZV0gaWYgdGhlIGFuYWx5c2lzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIFtmYWxzZV0KICAvLy8gaWYgaXQgYmFpbGVkIG91dC4gSW4gdGhlIGZvcm1lciBjYXNlLCBba2V5QXNzaWdubWVudHNdIGFuZAogIC8vLyBbdmFsdWVBc3NpZ25tZW50c10gaG9sZCBhIGxpc3Qgb2YgW1R5cGVJbmZvcm1hdGlvbl0gbm9kZXMgdGhhdAogIC8vLyBmbG93IGludG8gdGhlIGtleSBhbmQgdmFsdWUgdHlwZXMgb2YgdGhpcyBtYXAuCiAgYm9vbCBydW4oKSB7CiAgICBhbmFseXplKCk7CiAgICBNYXBUeXBlSW5mb3JtYXRpb24gbWFwID0gdHJhY2VkVHlwZTsKICAgIGlmIChjb250aW51ZUFuYWx5emluZykgewogICAgICBtYXAuYWRkRmxvd3NJbnRvVGFyZ2V0cyhmbG93c0ludG8pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGtleUFzc2lnbm1lbnRzID0gdmFsdWVBc3NpZ25tZW50cyA9IG1hcEFzc2lnbm1lbnRzID0gbnVsbDsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q2xvc3VyZUNhbGxTaXRlVHlwZUluZm9ybWF0aW9uKENsb3N1cmVDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBiYWlsb3V0KCdQYXNzZWQgdG8gYSBjbG9zdXJlJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIHN1cGVyLnZpc2l0U3RhdGljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24oaW5mbyk7CiAgICBNZW1iZXJFbnRpdHkgY2FsbGVkID0gaW5mby5jYWxsZWRFbGVtZW50OwogICAgaWYgKGluZmVycmVyLmNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmlzRm9yZWlnbihjYWxsZWQpICYmCiAgICAgICAgY2FsbGVkLm5hbWUgPT0gSmF2YVNjcmlwdEJhY2tlbmQuSlMpIHsKICAgICAgYmFpbG91dCgnVXNlZCBpbiBKUyAke2luZm8uZGVidWdOYW1lfScpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXREeW5hbWljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24oRHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIHN1cGVyLnZpc2l0RHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKGluZm8pOwogICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBpbmZvLnNlbGVjdG9yOwogICAgU3RyaW5nIHNlbGVjdG9yTmFtZSA9IHNlbGVjdG9yLm5hbWU7CiAgICBpZiAoY3VycmVudFVzZXIgPT0gaW5mby5yZWNlaXZlcikgewogICAgICBpZiAoIW9rTWFwU2VsZWN0b3JzU2V0LmNvbnRhaW5zKHNlbGVjdG9yTmFtZSkpIHsKICAgICAgICBpZiAoc2VsZWN0b3IuaXNDYWxsKSB7CiAgICAgICAgICBpZiAoc2VsZWN0b3JOYW1lID09ICdhZGRBbGwnKSB7CiAgICAgICAgICAgIC8vIEFsbCBrZXlzIGFuZCB2YWx1ZXMgZnJvbSB0aGUgYXJndW1lbnQgZmxvdyBpbnRvCiAgICAgICAgICAgIC8vIHRoZSBtYXAuCiAgICAgICAgICAgIFR5cGVJbmZvcm1hdGlvbiBtYXAgPSBpbmZvLmFyZ3VtZW50cy5wb3NpdGlvbmFsWzBdOwogICAgICAgICAgICBpZiAobWFwIGlzIE1hcFR5cGVJbmZvcm1hdGlvbikgewogICAgICAgICAgICAgIGluZmVycmVyLmFuYWx5emVNYXBBbmRFbnF1ZXVlKG1hcCk7CiAgICAgICAgICAgICAgbWFwQXNzaWdubWVudHMuYWRkKG1hcCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy8gSWYgd2UgY291bGQgc2VsZWN0IGEgY29tcG9uZW50IGZyb20gYSBbVHlwZUluZm9ybWF0aW9uXSwKICAgICAgICAgICAgICAvLyBsaWtlIHRoZSBrZXl0eXBlIG9yIHZhbHVldHlwZSBpbiB0aGlzIGNhc2UsIHdlIGNvdWxkCiAgICAgICAgICAgICAgLy8gcHJvcGFnYXRlIG1vcmUgaGVyZS4KICAgICAgICAgICAgICAvLyBUT0RPKGhlcmh1dCk6IGltcGxlbWVudCBzZWxlY3Rpb24gb24gW1R5cGVJbmZvcm1hdGlvbl0uCiAgICAgICAgICAgICAgYmFpbG91dCgnQWRkaW5nIG1hcCB3aXRoIHVua25vd24gdHlwZWluZm8gdG8gY3VycmVudCBtYXAnKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rvck5hbWUgPT0gJ3B1dElmQWJzZW50JykgewogICAgICAgICAgICAvLyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgYSBuZXcga2V5LCB0aGUgcmVzdWx0IHR5cGUgb2YKICAgICAgICAgICAgLy8gdGhlIHNlY29uZCBhcmd1bWVudCBiZWNvbWVzIGEgbmV3IHZhbHVlLgogICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCB0aGUgdHlwZSBpbmZvcm1hdGlvbiBkb2VzIG5vdAogICAgICAgICAgICAvLyBleHBsaWNpdGx5IHRyYWNrIHRoZSByZXR1cm4gdHlwZSwgeWV0LCBzbyB3ZSBoYXZlCiAgICAgICAgICAgIC8vIHRvIGdvIHRvIGR5bmFtaWMuCiAgICAgICAgICAgIC8vIFRPRE8oaGVyaHV0LDE2NTA3KTogVXNlIHJldHVybiB0eXBlIG9mIGNsb3N1cmUgaW4KICAgICAgICAgICAgLy8gTWFwLnB1dElmQWJzZW50LgogICAgICAgICAgICBrZXlBc3NpZ25tZW50cy5hZGQoaW5mby5hcmd1bWVudHMucG9zaXRpb25hbFswXSk7CiAgICAgICAgICAgIHZhbHVlQXNzaWdubWVudHMuYWRkKGluZmVycmVyLnR5cGVzLmR5bmFtaWNUeXBlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEl0IHdvdWxkIGJlIG5pY2UgdG8gaGFuZGxlIFtNYXAua2V5c10gYW5kIFtNYXAudmFsdWVzXSwgdG9vLgogICAgICAgICAgICAvLyBIb3dldmVyLCBjdXJyZW50bHkgdGhvc2UgY2FsbHMgZG8gbm90IHRyaWdnZXIgdGhlIGNyZWF0aW9uCiAgICAgICAgICAgIC8vIG9mIGEgW0xpc3RUeXBlSW5mb3JtYXRpb25dLCBzbyBJIGhhdmUgbm93aGVyZSB0byBwcm9wYWdhdGUKICAgICAgICAgICAgLy8gdGhhdCBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgLy8gVE9ETyhoZXJodXQpOiBhZGQgc3VwcG9ydCBmb3IgTWFwLmtleXMgYW5kIE1hcC52YWx1ZXMuCiAgICAgICAgICAgIGJhaWxvdXQoJ01hcCB1c2VkIGluIGEgbm90LW9rIHNlbGVjdG9yIFskc2VsZWN0b3JOYW1lXScpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pc0luZGV4U2V0KSB7CiAgICAgICAgICBrZXlBc3NpZ25tZW50cy5hZGQoaW5mby5hcmd1bWVudHMucG9zaXRpb25hbFswXSk7CiAgICAgICAgICB2YWx1ZUFzc2lnbm1lbnRzLmFkZChpbmZvLmFyZ3VtZW50cy5wb3NpdGlvbmFsWzFdKTsKICAgICAgICB9IGVsc2UgaWYgKCFzZWxlY3Rvci5pc0luZGV4KSB7CiAgICAgICAgICBiYWlsb3V0KCdNYXAgdXNlZCBpbiBhIG5vdC1vayBzZWxlY3RvciBbJHNlbGVjdG9yTmFtZV0nKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaXNDYWxsICYmCiAgICAgICAgKGluZm8uaGFzQ2xvc3VyZUNhbGxUYXJnZXRzIHx8CiAgICAgICAgICAgIGluZm8uY29uY3JldGVUYXJnZXRzLmFueSgoZWxlbWVudCkgPT4gIWVsZW1lbnQuaXNGdW5jdGlvbikpKSB7CiAgICAgIGJhaWxvdXQoJ1Bhc3NlZCB0byBhIGNsb3N1cmUnKTsKICAgICAgcmV0dXJuOwogICAgfQogIH0KfQqAhgBOTjwBKgEkPDIbIAE9EggODhIRDggNEAoMDAsREw0LBAEvS0ouPkBGD0QBSAFFQUU1Dw8pHSoTBj8SBAEMTSQEAQxLNC5BLy8GBAEMTTUnKSg3Hyo/GEAtMicVSkYmSUoONkM4PEEhQSA+PhNMSkohRkYUDCo8PihEEgoIIidLJg4GBAIBLXBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL21hcF90cmFjZXIuZGFydDZzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pbmZlcnJlci9zZXRfdHJhY2VyLmRhcnSNtC8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGNvbXBpbGVyLnNyYy5pbmZlcnJlci5zZXRfdHJhY2VyOwoKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2JhY2tlbmQuZGFydCcgc2hvdyBKYXZhU2NyaXB0QmFja2VuZDsKaW1wb3J0ICcuLi91bml2ZXJzZS9zZWxlY3Rvci5kYXJ0JyBzaG93IFNlbGVjdG9yOwppbXBvcnQgJ25vZGVfdHJhY2VyLmRhcnQnOwppbXBvcnQgJ3R5cGVfZ3JhcGhfbm9kZXMuZGFydCc7CgovLy8gQSBzZXQgb2Ygc2VsZWN0b3IgbmFtZXMgdGhhdCBbU2V0XSBpbXBsZW1lbnRzIGFuZCB3aGljaCB3ZSBrbm93IGRvIG5vdAovLy8gY2hhbmdlIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIHNldCBvciBsZXQgdGhlIHNldCBlc2NhcGUgdG8gY29kZSB0aGF0IG1pZ2h0Ci8vLyBjaGFuZ2UgdGhlIGVsZW1lbnQgdHlwZS4KU2V0PFN0cmluZz4gb2tTZXRTZWxlY3RvclNldCA9IG5ldyBTZXQ8U3RyaW5nPi5mcm9tKGNvbnN0IDxTdHJpbmc+WwogIC8vIEZyb20gT2JqZWN0LgogICc9PScsCiAgJ2hhc2hDb2RlJywKICAndG9TdHJpbmcnLAogICdub1N1Y2hNZXRob2QnLAogICdydW50aW1lVHlwZScsCgogIC8vIEZyb20gSXRlcmFibGUuCiAgJ2l0ZXJhdG9yJywKICAnbWFwJywKICAnd2hlcmUnLAogICdleHBhbmQnLAogICdjb250YWlucycsCiAgJ2ZvckVhY2gnLAogICdyZWR1Y2UnLAogICdmb2xkJywKICAnZXZlcnknLAogICdqb2luJywKICAnYW55JywKICAndG9MaXN0JywKICAndG9TZXQnLAogICdsZW5ndGgnLAogICdpc0VtcHR5JywKICAnaXNOb3RFbXB0eScsCiAgJ3Rha2UnLAogICd0YWtlV2hpbGUnLAogICdza2lwJywKICAnc2tpcFdoaWxlJywKICAnZmlyc3QnLAogICdsYXN0JywKICAnc2luZ2xlJywKICAnZmlyc3RXaGVyZScsCiAgJ2xhc3RXaGVyZScsCiAgJ3NpbmdsZVdoZXJlJywKICAnZWxlbWVudEF0JywKCiAgLy8gRnJvbSBTZXQuCiAgJ2NsZWFyJywKICAnY29udGFpbnNBbGwnLAogICdkaWZmZXJlbmNlJywKICAnaW50ZXJzZWN0aW9uJywKICAnbG9va3VwJywKICAncmVtb3ZlJywKICAncmVtb3ZlQWxsJywKICAncmVtb3ZlV2hlcmUnLAogICdyZXRhaW5BbGwnLAogICdyZXRhaW5XaGVyZScsCiAgJ3VuaW9uJywKXSk7CgpjbGFzcyBTZXRUcmFjZXJWaXNpdG9yIGV4dGVuZHMgVHJhY2VyVmlzaXRvciB7CiAgTGlzdDxUeXBlSW5mb3JtYXRpb24+IGFzc2lnbm1lbnRzID0gPFR5cGVJbmZvcm1hdGlvbj5bXTsKCiAgU2V0VHJhY2VyVmlzaXRvcih0cmFjZWRUeXBlLCBpbmZlcnJlcikgOiBzdXBlcih0cmFjZWRUeXBlLCBpbmZlcnJlcik7CgogIC8vLyBSZXR1cm5zIFt0cnVlXSBpZiB0aGUgYW5hbHlzaXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgW2ZhbHNlXSBpZiBpdAogIC8vLyBiYWlsZWQgb3V0LiBJbiB0aGUgZm9ybWVyIGNhc2UsIFthc3NpZ25tZW50c10gaG9sZHMgYSBsaXN0IG9mCiAgLy8vIFtUeXBlSW5mb3JtYXRpb25dIG5vZGVzIHRoYXQgZmxvdyBpbnRvIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhpcyBzZXQuCiAgYm9vbCBydW4oKSB7CiAgICBhbmFseXplKCk7CiAgICBTZXRUeXBlSW5mb3JtYXRpb24gc2V0ID0gdHJhY2VkVHlwZTsKICAgIGlmIChjb250aW51ZUFuYWx5emluZykgewogICAgICBzZXQuYWRkRmxvd3NJbnRvVGFyZ2V0cyhmbG93c0ludG8pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGFzc2lnbm1lbnRzID0gbnVsbDsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q2xvc3VyZUNhbGxTaXRlVHlwZUluZm9ybWF0aW9uKENsb3N1cmVDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBiYWlsb3V0KCdQYXNzZWQgdG8gYSBjbG9zdXJlJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIHN1cGVyLnZpc2l0U3RhdGljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24oaW5mbyk7CiAgICBNZW1iZXJFbnRpdHkgY2FsbGVkID0gaW5mby5jYWxsZWRFbGVtZW50OwogICAgaWYgKGluZmVycmVyLmNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmlzRm9yZWlnbihjYWxsZWQpICYmCiAgICAgICAgY2FsbGVkLm5hbWUgPT0gSmF2YVNjcmlwdEJhY2tlbmQuSlMpIHsKICAgICAgYmFpbG91dCgnVXNlZCBpbiBKUyAke2luZm8uZGVidWdOYW1lfScpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXREeW5hbWljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24oRHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIHN1cGVyLnZpc2l0RHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKGluZm8pOwogICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBpbmZvLnNlbGVjdG9yOwogICAgU3RyaW5nIHNlbGVjdG9yTmFtZSA9IHNlbGVjdG9yLm5hbWU7CiAgICBpZiAoY3VycmVudFVzZXIgPT0gaW5mby5yZWNlaXZlcikgewogICAgICBpZiAoIW9rU2V0U2VsZWN0b3JTZXQuY29udGFpbnMoc2VsZWN0b3JOYW1lKSkgewogICAgICAgIGlmIChzZWxlY3Rvci5pc0NhbGwpIHsKICAgICAgICAgIHN3aXRjaCAoc2VsZWN0b3JOYW1lKSB7CiAgICAgICAgICAgIGNhc2UgJ2FkZCc6CiAgICAgICAgICAgICAgYXNzaWdubWVudHMuYWRkKGluZm8uYXJndW1lbnRzLnBvc2l0aW9uYWxbMF0pOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdhZGRBbGwnOgogICAgICAgICAgICAgIC8vIFRPRE8oZmlzaHl0aGVmaXNoKTogRXh0cmFjdCB0eXBlIGFyZ3VtZW50IGZyb20gdHlwZQogICAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uLgogICAgICAgICAgICAgIGJhaWxvdXQoJ0FkZGluZyBpdGVyYWJsZSB3aXRoIHVua25vd24gdHlwZWluZm8gdG8gY3VycmVudCBzZXQnKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBiYWlsb3V0KCdTZXQgdXNlZCBpbiBhIG5vdC1vayBzZWxlY3RvciBbJHNlbGVjdG9yTmFtZV0nKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaXNDYWxsICYmCiAgICAgICAgKGluZm8uaGFzQ2xvc3VyZUNhbGxUYXJnZXRzIHx8CiAgICAgICAgICAgIGluZm8uY29uY3JldGVUYXJnZXRzLmFueSgoZWxlbWVudCkgPT4gIWVsZW1lbnQuaXNGdW5jdGlvbikpKSB7CiAgICAgIGJhaWxvdXQoJ1Bhc3NlZCB0byBhIGNsb3N1cmUnKTsKICAgICAgcmV0dXJuOwogICAgfQogIH0KfQqAhQBOTjwBKgEkPDIbIAFLUB1EEggODhIRARQOCQsMDg0MCgsKCQwLDA0QCg8KDwsKDBAPEQ8BDwsREBIMDA8RDxELBAEvOwFIAUtESw8PKR0qEwYYEgQBDE0kBAEMSzQuQS8vBgQBDE01JykoNh8iGD0VG0UeTxUVSAwSCggiJ0smDgYEAgEtcGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvc2V0X3RyYWNlci5kYXJ0O3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2luZmVycmVyL3R5cGVfZ3JhcGhfZHVtcC5kYXJ0uq8vLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgpsaWJyYXJ5IGRhcnQyanMuaW5mZXJyZXIudHlwZV9ncmFwaF9kdW1wOwoKaW1wb3J0ICcuLi8uLi9jb21waWxlcl9uZXcuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXR5X3V0aWxzLmRhcnQnIGFzIHV0aWxzOwppbXBvcnQgJ2Fic3RyYWN0X3ZhbHVlX2RvbWFpbi5kYXJ0JzsKaW1wb3J0ICdpbmZlcnJlcl9lbmdpbmUuZGFydCc7CmltcG9ydCAndHlwZV9ncmFwaF9ub2Rlcy5kYXJ0JzsKaW1wb3J0ICdkZWJ1Zy5kYXJ0JzsKCi8vLyBEdW1wcyB0aGUgdHlwZSBpbmZlcmVuY2UgZ3JhcGggaW4gR3JhcGh2aXogRG90IGZvcm1hdCBpbnRvIHRoZSBgdHlwZWdyYXBoYAovLy8gc3ViZm9sZGVyIG9mIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBFYWNoIGZ1bmN0aW9uIGJvZHkgaXMgZHVtcGVkIGluCi8vLyBhIHNlcGFyYXRlIGZpbGUuCi8vLwovLy8gVGhlIHJlc3VsdGluZyAuZG90IGZpbGVzIG11c3QgYmUgcHJvY2Vzc2VkIHVzaW5nIHRoZSBHcmFwaHZpeiBgZG90YCBjb21tYW5kLAovLy8gd2hpY2ggY2FuIGJlIG9idGFpbmVkIGZyb20gYGh0dHA6Ly93d3cuZ3JhcGh2aXoub3JnYCwgb3IgaW5zdGFsbGVkIHVzaW5nCi8vLyBtb3N0IHBhY2thZ2UgbWFuYWdlcnMgKHNlYXJjaCBmb3IgYGdyYXBodml6YCBvciBgZG90YCkuCi8vLwovLy8gRXhhbXBsZSBjb21tYW5kczoKLy8vCi8vLyAgICAgZG90IC1UcG5nIC1PIHR5cGVncmFwaC9tYWluLmRvdAovLy8gICAgIG9wZW4gdHlwZWdyYXBoL21haW4uZG90LnBuZwovLy8KLy8vICAgICBkb3QgLVRwbmcgLU8gdHlwZWdyYXBoL2RhcnQuX2ludGVybmFsLlNvcnQuX2R1YWxQaXZvdFF1aWNrc29ydC5kb3QKLy8vICAgICBvcGVuIHR5cGVncmFwaC9kYXJ0Ll9pbnRlcm5hbC5Tb3J0Ll9kdWFsUGl2b3RRdWlja3NvcnQuZG90LnBuZwovLy8KY2xhc3MgVHlwZUdyYXBoRHVtcCB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBvdXRwdXREaXIgPSAndHlwZWdyYXBoJzsKCiAgZmluYWwgQ29tcGlsZXJPdXRwdXQgY29tcGlsZXJPdXRwdXQ7CiAgZmluYWwgSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXI7CiAgZmluYWwgTWFwPFR5cGVJbmZvcm1hdGlvbiwgU2V0PFR5cGVJbmZvcm1hdGlvbj4+IGFzc2lnbm1lbnRzQmVmb3JlQW5hbHlzaXMgPQogICAgICA8VHlwZUluZm9ybWF0aW9uLCBTZXQ8VHlwZUluZm9ybWF0aW9uPj57fTsKICBmaW5hbCBNYXA8VHlwZUluZm9ybWF0aW9uLCBTZXQ8VHlwZUluZm9ybWF0aW9uPj4gYXNzaWdubWVudHNCZWZvcmVUcmFjaW5nID0KICAgICAgPFR5cGVJbmZvcm1hdGlvbiwgU2V0PFR5cGVJbmZvcm1hdGlvbj4+e307CiAgZmluYWwgU2V0PFN0cmluZz4gdXNlZEZpbGVuYW1lcyA9IG5ldyBTZXQ8U3RyaW5nPigpOwoKICBUeXBlR3JhcGhEdW1wKHRoaXMuY29tcGlsZXJPdXRwdXQsIHRoaXMuaW5mZXJyZXIpOwoKICAvLy8gVGFrZSBhIGNvcHkgb2YgdGhlIGFzc2lnbm1lbnQgc2V0IGZvciBlYWNoIG5vZGUsIHNpbmNlIHRoYXQgbWF5IGNoYW5nZQogIC8vLyBkdXJpbmcgdGhlIGFuYWx5c2lzLgogIHZvaWQgYmVmb3JlQW5hbHlzaXMoKSB7CiAgICBmb3IgKFR5cGVJbmZvcm1hdGlvbiBub2RlIGluIGluZmVycmVyLnR5cGVzLmFsbFR5cGVzKSB7CiAgICAgIFNldDxUeXBlSW5mb3JtYXRpb24+IGNvcHkgPSBub2RlLmFzc2lnbm1lbnRzLnRvU2V0KCk7CiAgICAgIGlmICghY29weS5pc0VtcHR5KSB7CiAgICAgICAgYXNzaWdubWVudHNCZWZvcmVBbmFseXNpc1tub2RlXSA9IGNvcHk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBMaWtlIFtiZWZvcmVBbmFseXNpc10sIHRha2VzIGEgY29weSBvZiB0aGUgYXNzaWdubWVudCBzZXRzLgogIHZvaWQgYmVmb3JlVHJhY2luZygpIHsKICAgIGZvciAoVHlwZUluZm9ybWF0aW9uIG5vZGUgaW4gaW5mZXJyZXIudHlwZXMuYWxsVHlwZXMpIHsKICAgICAgU2V0PFR5cGVJbmZvcm1hdGlvbj4gY29weSA9IG5vZGUuYXNzaWdubWVudHMudG9TZXQoKTsKICAgICAgaWYgKCFjb3B5LmlzRW1wdHkpIHsKICAgICAgICBhc3NpZ25tZW50c0JlZm9yZVRyYWNpbmdbbm9kZV0gPSBjb3B5OwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gRHVtcHMgdGhlIGVudGlyZSBncmFwaC4KICB2b2lkIGFmdGVyQW5hbHlzaXMoKSB7CiAgICAvLyBHcm91cCBhbGwgdGhlIHR5cGUgbm9kZXMgYnkgdGhlaXIgY29udGV4dCBtZW1iZXIuCiAgICBNYXA8TWVtYmVyRW50aXR5LCBMaXN0PFR5cGVJbmZvcm1hdGlvbj4+IG5vZGVzID0KICAgICAgICA8TWVtYmVyRW50aXR5LCBMaXN0PFR5cGVJbmZvcm1hdGlvbj4+e307CiAgICBmb3IgKFR5cGVJbmZvcm1hdGlvbiBub2RlIGluIGluZmVycmVyLnR5cGVzLmFsbFR5cGVzKSB7CiAgICAgIGlmIChub2RlLmNvbnRleHRNZW1iZXIgIT0gbnVsbCkgewogICAgICAgIG5vZGVzCiAgICAgICAgICAgIC5wdXRJZkFic2VudChub2RlLmNvbnRleHRNZW1iZXIsICgpID0+IDxUeXBlSW5mb3JtYXRpb24+W10pCiAgICAgICAgICAgIC5hZGQobm9kZSk7CiAgICAgIH0KICAgIH0KICAgIC8vIFByaW50IGV2ZXJ5IGdyb3VwIHNlcGFyYXRlbHkuCiAgICBmb3IgKE1lbWJlckVudGl0eSBlbGVtZW50IGluIG5vZGVzLmtleXMpIHsKICAgICAgT3V0cHV0U2luayBvdXRwdXQ7CiAgICAgIHRyeSB7CiAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWxlbmFtZUZyb21FbGVtZW50KGVsZW1lbnQpOwogICAgICAgIG91dHB1dCA9IGNvbXBpbGVyT3V0cHV0LmNyZWF0ZU91dHB1dFNpbmsoCiAgICAgICAgICAgICckb3V0cHV0RGlyLyRuYW1lJywgJ2RvdCcsIE91dHB1dFR5cGUuZGVidWcpOwogICAgICAgIF9HcmFwaEdlbmVyYXRvciB2aXNpdG9yID0gbmV3IF9HcmFwaEdlbmVyYXRvcigKICAgICAgICAgICAgdGhpcywgZWxlbWVudCwgb3V0cHV0LCBpbmZlcnJlci5hYnN0cmFjdFZhbHVlRG9tYWluLmdldENvbXBhY3RUZXh0KTsKICAgICAgICBmb3IgKFR5cGVJbmZvcm1hdGlvbiBub2RlIGluIG5vZGVzW2VsZW1lbnRdKSB7CiAgICAgICAgICB2aXNpdG9yLnZpc2l0KG5vZGUpOwogICAgICAgIH0KICAgICAgICB2aXNpdG9yLmFkZE1pc3NpbmdOb2RlcygpOwogICAgICAgIHZpc2l0b3IuZmluaXNoKCk7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKSB7CiAgICAgICAgICBvdXRwdXQuY2xvc2UoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIHRoZSBmaWxlbmFtZSAod2l0aG91dCBleHRlbnNpb24pIGluIHdoaWNoIHRvIGR1bXAgdGhlIHR5cGUKICAvLy8gZ3JhcGggZm9yIFtlbGVtZW50XS4KICAvLy8KICAvLy8gV2lsbCBuZXZlciByZXR1cm4gdGhlIGEgZ2l2ZW4gZmlsZW5hbWUgbW9yZSB0aGFuIG9uY2UsIGV2ZW4gaWYgY2FsbGVkIHdpdGgKICAvLy8gdGhlIHNhbWUgZWxlbWVudC4KICBTdHJpbmcgZmlsZW5hbWVGcm9tRWxlbWVudChNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgLy8gVGhlIHRvU3RyaW5nIG1ldGhvZCBvZiBlbGVtZW50cyBpbmNsdWRlIGNoYXJhY3RlcnMgdGhhdCBhcmUgdW5zdWl0YWJsZQogICAgLy8gZm9yIFVSSXMgYW5kIGZpbGUgc3lzdGVtcy4KICAgIExpc3Q8U3RyaW5nPiBwYXJ0cyA9IDxTdHJpbmc+W107CiAgICBwYXJ0cy5hZGQoZWxlbWVudC5saWJyYXJ5LmNhbm9uaWNhbFVyaS5wYXRoU2VnbWVudHMubGFzdCk7CiAgICBwYXJ0cy5hZGQoZWxlbWVudC5lbmNsb3NpbmdDbGFzcz8ubmFtZSk7CiAgICBpZiAoZWxlbWVudC5pc0dldHRlcikgewogICAgICBwYXJ0cy5hZGQoJ2dldC0ke2VsZW1lbnQubmFtZX0nKTsKICAgIH0gZWxzZSBpZiAoZWxlbWVudC5pc1NldHRlcikgewogICAgICBwYXJ0cy5hZGQoJ3NldC0ke2VsZW1lbnQubmFtZX0nKTsKICAgIH0gZWxzZSBpZiAoZWxlbWVudC5pc0NvbnN0cnVjdG9yKSB7CiAgICAgIGlmIChlbGVtZW50Lm5hbWUuaXNFbXB0eSkgewogICAgICAgIHBhcnRzLmFkZCgnLWNvbnN0cnVjdG9yJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGFydHMuYWRkKGVsZW1lbnQubmFtZSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHBhcnRzLmFkZCgKICAgICAgICAgIHV0aWxzLm9wZXJhdG9yTmFtZVRvSWRlbnRpZmllcihlbGVtZW50Lm5hbWUpLnJlcGxhY2VBbGwocickJywgJy0nKSk7CiAgICB9CiAgICBTdHJpbmcgZmlsZW5hbWUgPSBwYXJ0cy53aGVyZSgoeCkgPT4geCAhPSBudWxsICYmIHggIT0gJycpLmpvaW4oJy4nKTsKICAgIGlmICh1c2VkRmlsZW5hbWVzLmFkZChmaWxlbmFtZSkpIHJldHVybiBmaWxlbmFtZTsKICAgIC8vIFRoZSBmaWxlbmFtZSBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgYnkgYW5vdGhlciBtZXRob2QuIEFwcGVuZCBhIHNlcmlhbAogICAgLy8gbnVtYmVyIHRvIGVuc3VyZSB3ZSBkb24ndCBvdmVyd3JpdGUgaXQuCiAgICBpbnQgc2VyaWFsTnVtYmVyID0gMjsKICAgIHdoaWxlICghdXNlZEZpbGVuYW1lcy5hZGQoJyRmaWxlbmFtZS0kc2VyaWFsTnVtYmVyJykpIHsKICAgICAgKytzZXJpYWxOdW1iZXI7CiAgICB9CiAgICByZXR1cm4gJyRmaWxlbmFtZS0kc2VyaWFsTnVtYmVyJzsKICB9Cn0KCi8vLyBCdWlsZHMgdGhlIEdyYXBodml6IERvdCBmaWxlIGZvciBvbmUgZnVuY3Rpb24gYm9keS4KY2xhc3MgX0dyYXBoR2VuZXJhdG9yIGV4dGVuZHMgVHlwZUluZm9ybWF0aW9uVmlzaXRvciB7CiAgZmluYWwgVHlwZUdyYXBoRHVtcCBnbG9iYWw7CiAgZmluYWwgU2V0PFR5cGVJbmZvcm1hdGlvbj4gc2VlbiA9IG5ldyBTZXQ8VHlwZUluZm9ybWF0aW9uPigpOwogIGZpbmFsIExpc3Q8VHlwZUluZm9ybWF0aW9uPiB3b3JrbGlzdCA9IG5ldyBMaXN0PFR5cGVJbmZvcm1hdGlvbj4oKTsKICBmaW5hbCBNYXA8VHlwZUluZm9ybWF0aW9uLCBpbnQ+IG5vZGVJZCA9IDxUeXBlSW5mb3JtYXRpb24sIGludD57fTsKICBmaW5hbCBTdHJpbmcgRnVuY3Rpb24oQWJzdHJhY3RWYWx1ZSkgZm9ybWF0VHlwZTsKICBpbnQgdXNlZElkcyA9IDA7CiAgZmluYWwgT3V0cHV0U2luayBvdXRwdXQ7CiAgZmluYWwgTWVtYmVyRW50aXR5IGVsZW1lbnQ7CiAgVHlwZUluZm9ybWF0aW9uIHJldHVyblZhbHVlOwoKICBfR3JhcGhHZW5lcmF0b3IodGhpcy5nbG9iYWwsIHRoaXMuZWxlbWVudCwgdGhpcy5vdXRwdXQsIHRoaXMuZm9ybWF0VHlwZSkgewogICAgcmV0dXJuVmFsdWUgPSBnbG9iYWwuaW5mZXJyZXIudHlwZXMuZ2V0SW5mZXJyZWRUeXBlT2ZNZW1iZXIoZWxlbWVudCk7CiAgICBnZXROb2RlKHJldHVyblZhbHVlKTsgLy8gRW5zdXJlIHJldHVybiB2YWx1ZSBpcyBwYXJ0IG9mIGdyYXBoLgogICAgYXBwZW5kKCdkaWdyYXBoIHsnKTsKICB9CgogIHZvaWQgZmluaXNoKCkgewogICAgYXBwZW5kKCd9Jyk7CiAgfQoKICAvLy8gRW5zdXJlcyB0aGF0IGFsbCBub2RlcyB3aGljaCBoYXZlIGJlZW4gcmVmZXJlbmNlZCBhcmUgZ2VuZXJhdGVkLgogIC8vLwogIC8vLyBTb21ldGltZXMgYW4gaW5wdXQgdG8gYSBUeXBlSW5mb3JtYXRpb24gbm9kZSBkb2VzIG5vdCBiZWxvbmcgdG8gdGhlIHNhbWUKICAvLy8gZnVuY3Rpb24gYm9keSwgYW5kIHRoZSBncmFwaCBsb29rcyBjb25mdXNpbmcgaWYgdGhleSBhcmUgbWlzc2luZy4KICB2b2lkIGFkZE1pc3NpbmdOb2RlcygpIHsKICAgIHdoaWxlICh3b3JrbGlzdC5pc05vdEVtcHR5KSB7CiAgICAgIFR5cGVJbmZvcm1hdGlvbiBub2RlID0gd29ya2xpc3QucmVtb3ZlTGFzdCgpOwogICAgICBhc3NlcnQobm9kZUlkLmNvbnRhaW5zS2V5KG5vZGUpKTsKICAgICAgdmlzaXQobm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHZpc2l0KFR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBpZiAoc2Vlbi5jb250YWlucyhpbmZvKSkgcmV0dXJuOwogICAgaW5mby5hY2NlcHQodGhpcyk7CiAgfQoKICB2b2lkIGFwcGVuZChTdHJpbmcgc3RyaW5nKSB7CiAgICBvdXRwdXQuLmFkZChzdHJpbmcpLi5hZGQoJ1xuJyk7CiAgfQoKICBTdHJpbmcgc2hvcnRlbihTdHJpbmcgdGV4dCkgewogICAgaWYgKHRleHQubGVuZ3RoID4gNDApIHsKICAgICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKDAsIDE5KSArICcuLi4nICsgdGV4dC5zdWJzdHJpbmcodGV4dC5sZW5ndGggLSAxOCk7CiAgICB9CiAgICByZXR1cm4gdGV4dDsKICB9CgogIGludCBnZXRGcmVzaElkKCkgPT4gKyt1c2VkSWRzOwoKICAvLy8gT2J0YWlucyBhIHVuaXF1ZSBJRCBmb3IgdGhlIG5vZGUgcmVwcmVzZW50aW5nIFtpbmZvXS4KICBTdHJpbmcgZ2V0Tm9kZShUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgaW50IGlkID0gbm9kZUlkLnB1dElmQWJzZW50KGluZm8sICgpIHsKICAgICAgd29ya2xpc3QuYWRkKGluZm8pOyAvLyBFbnN1cmUgdGhhdCB0aGUgcmVmZXJlbmNlZCBub2RlIGlzIGdlbmVyYXRlZC4KICAgICAgcmV0dXJuIGdldEZyZXNoSWQoKTsKICAgIH0pOwogICAgcmV0dXJuICckaWQnOwogIH0KCiAgZmluYWwgUmVnRXhwIGVzY2FwZVJlZ2V4cCA9IG5ldyBSZWdFeHAoJ1sie308PnxdJyk7CgogIC8vLyBFc2NhcGVzIGNoYXJhY3RlcnMgaW4gW3RleHRdIHNvIGl0IGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgYSBsYWJlbC4KICBTdHJpbmcgZXNjYXBlTGFiZWwoU3RyaW5nIHRleHQpIHsKICAgIHJldHVybiB0ZXh0LnJlcGxhY2VBbGxNYXBwZWQoZXNjYXBlUmVnZXhwLCAobSkgPT4gJ1xcJHttLmdyb3VwKDApfScpOwogIH0KCiAgLy8vIENyZWF0ZXMgYW4gZWRnZSBmcm9tIFtzcmNdIHRvIFtkc3RdLgogIC8vLwogIC8vLyBJZiBbZHN0XSBpcyBhIHJlY29yZCB0eXBlIG5vZGUsIFtwb3J0XSBtYXkgcmVmZXIgdG8gb25lIG9mIHRoZSBmaWVsZHMKICAvLy8gZGVmaW5lZCBpbiB0aGF0IHJlY29yZCAoZS5nLiBgb2JqYCwgYGFyZzBgLCBgYXJnMWAsIGV0YykKICB2b2lkIGFkZEVkZ2UoVHlwZUluZm9ybWF0aW9uIHNyYywgVHlwZUluZm9ybWF0aW9uIGRzdCwKICAgICAge1N0cmluZyBwb3J0LCBTdHJpbmcgY29sb3I6ICdibGFjayd9KSB7CiAgICBpZiAoaXNFeHRlcm5hbChzcmMpICYmIGlzRXh0ZXJuYWwoZHN0KSkgewogICAgICByZXR1cm47IC8vIERvIG5vdCBhZGQgZWRnZXMgYmV0d2VlbiBleHRlcm5hbCBub2Rlcy4KICAgIH0KICAgIFN0cmluZyBkc3RUZXh0ID0gZ2V0Tm9kZShkc3QpOwogICAgaWYgKHBvcnQgIT0gbnVsbCkgewogICAgICBkc3RUZXh0ICs9ICc6JHBvcnQnOwogICAgfQogICAgaWYgKHNyYyBpcyBDb25jcmV0ZVR5cGVJbmZvcm1hdGlvbikgewogICAgICAvLyBDb25jcmV0ZSB0eXBlcyBjYW4gaGF2ZSBhIGh1Z2UgbnVtYmVyIG9mIHVzZXMgd2hpY2ggd2lsbCBmbG9vZCB0aGUKICAgICAgLy8gZ3JhcGggd2l0aCB2ZXJ5IGxvbmcgaGFyZC10by1mb2xsb3cgZWRnZXMuIENvcHkgdGhlIGNvbmNyZXRlIG5vZGVzCiAgICAgIC8vIGZvciBldmVyeSB1c2UgdG8gZW5oYW5jZSByZWFkYWJpbGl0eS4KICAgICAgaW50IGlkID0gZ2V0RnJlc2hJZCgpOwogICAgICBTdHJpbmcgdHlwZSA9IGVzY2FwZUxhYmVsKCcke2Zvcm1hdFR5cGUoc3JjLnR5cGUpfScpOwogICAgICBTdHJpbmcgdGV4dCA9ICdDb25jcmV0ZSc7CiAgICAgIFN0cmluZyBsYWJlbCA9ICd7JHRleHR8PHJldHVyblR5cGU+ICR0eXBlfSc7CiAgICAgIGFwcGVuZCgnJGlkIFtzaGFwZT1yZWNvcmQsc3R5bGU9ZG90dGVkLGxhYmVsPSIkbGFiZWwiXScpOwogICAgICBhcHBlbmQoJyRpZCAtPiAkZHN0VGV4dCBbY29sb3I9IiRjb2xvciJdJyk7CiAgICB9IGVsc2UgewogICAgICBhcHBlbmQoJyR7Z2V0Tm9kZShzcmMpfTpyZXR1cm5UeXBlIC0+ICRkc3RUZXh0IFtjb2xvcj0iJGNvbG9yIl0nKTsKICAgIH0KICB9CgogIC8vIFNvbWUgZ3JhcGhzIGFyZSBmbG9vZGVkIGJ5IGEgaHVnZSBudW1iZXIgb2YgcGhpIGFuZCBuYXJyb3cgbm9kZXMuCiAgLy8gV2UgY29sb3IgdGhlIG5vZGVzIHNvIHRoZSAiaW50ZXJlc3RpbmciIG5vZGVzIHN0YW5kIG91dCBtb3JlLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgZGVmYXVsdE5vZGVDb2xvciA9ICcjZWVmZmVlJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHBoaUNvbG9yID0gJyNlZWZmZmYnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgbmFycm93Q29sb3IgPSBwaGlDb2xvcjsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGNhbGxDb2xvciA9ICcjZmZmZmVlJzsKCiAgLy8gQ29sb3JzIGZvciBlZGdlcyBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgd2VyZSBhZGRlZCBvciByZW1vdmVkIGR1cmluZyB0aGUKICAvLyBhbmFseXNpcy4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHVuY2hhbmdlZEVkZ2UgPSAnYmxhY2snOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgYWRkZWRFZGdlID0gJ2dyZWVuNCc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyByZW1vdmVkRWRnZSA9ICdyZWQzJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRlbXBvcmFyeUVkZ2UgPSAnb3JhbmdlJzsgLy8gQWRkZWQgYW5kIHRoZW4gcmVtb3ZlZCBhZ2Fpbi4KCiAgYm9vbCBpc0V4dGVybmFsKFR5cGVJbmZvcm1hdGlvbiBub2RlKSB7CiAgICByZXR1cm4gbm9kZSAhPSByZXR1cm5WYWx1ZSAmJiBub2RlLmNvbnRleHRNZW1iZXIgIT0gZWxlbWVudDsKICB9CgogIFN0cmluZyBnZXRTdHlsZUZvck5vZGUoVHlwZUluZm9ybWF0aW9uIG5vZGUsIFN0cmluZyBjb2xvcikgewogICAgcmV0dXJuIGlzRXh0ZXJuYWwobm9kZSkKICAgICAgICA/ICdzdHlsZT1kb3R0ZWQnCiAgICAgICAgOiAnc3R5bGU9ZmlsbGVkLGZpbGxjb2xvcj0iJGNvbG9yIic7CiAgfQoKICAvLy8gQWRkcyBkZXRhaWxzIHRoYXQgYXJlIG5vdCBzcGVjaWZpYyB0byBhIHN1YmNsYXNzIG9mIFtUeXBlSW5mb3JtYXRpb25dLgogIFN0cmluZyBhcHBlbmREZXRhaWxzKFR5cGVJbmZvcm1hdGlvbiBub2RlLCBTdHJpbmcgdGV4dCkgewogICAgaWYgKG5vZGUgPT0gcmV0dXJuVmFsdWUpIHsKICAgICAgcmV0dXJuICckdGV4dFxuKHJldHVybiB2YWx1ZSknOwogICAgfQogICAgaWYgKG5vZGUuY29udGV4dE1lbWJlciAhPSBudWxsICYmIG5vZGUuY29udGV4dE1lbWJlciAhPSBlbGVtZW50KSB7CiAgICAgIHJldHVybiAnJHRleHRcbihmcm9tICR7bm9kZS5jb250ZXh0TWVtYmVyfSknOwogICAgfQogICAgcmV0dXJuIHRleHQ7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIG5vZGUgZm9yIFtub2RlXSBkaXNwbGF5aW5nIHRoZSBnaXZlbiBbdGV4dF0gaW4gaXRzIGJveC4KICAvLy8KICAvLy8gW2lucHV0c10gc3BlY2lmeSBuYW1lZCBpbnB1dHMgdG8gdGhlIG5vZGUuIElmIG9taXR0ZWQsIGVkZ2VzIHdpbGwgYmUKICAvLy8gYmFzZWQgb24gW25vZGUuYXNzaWdubWVudHNdLgogIHZvaWQgYWRkTm9kZShUeXBlSW5mb3JtYXRpb24gbm9kZSwgU3RyaW5nIHRleHQsCiAgICAgIHtTdHJpbmcgY29sb3I6IGRlZmF1bHROb2RlQ29sb3IsIE1hcDxTdHJpbmcsIFR5cGVJbmZvcm1hdGlvbj4gaW5wdXRzfSkgewogICAgc2Vlbi5hZGQobm9kZSk7CiAgICBTdHJpbmcgc3R5bGUgPSBnZXRTdHlsZUZvck5vZGUobm9kZSwgY29sb3IpOwogICAgdGV4dCA9IGFwcGVuZERldGFpbHMobm9kZSwgdGV4dCk7CiAgICB0ZXh0ID0gZXNjYXBlTGFiZWwodGV4dCk7CiAgICBTdHJpbmcgaWQgPSBnZXROb2RlKG5vZGUpOwogICAgU3RyaW5nIHJldHVyblR5cGUgPSBlc2NhcGVMYWJlbChmb3JtYXRUeXBlKG5vZGUudHlwZSkpOwogICAgaWYgKGlucHV0cyAhPSBudWxsKSB7CiAgICAgIEl0ZXJhYmxlPFN0cmluZz4ga2V5cyA9IGlucHV0cy5rZXlzLndoZXJlKChrZXkpID0+IGlucHV0c1trZXldICE9IG51bGwpOwogICAgICBTdHJpbmcgaGVhZGVyID0ga2V5cy5tYXAoKGtleSkgPT4gJzxhJGtleT4gJGtleScpLmpvaW4oJ3wnKTsKICAgICAgU3RyaW5nIGxhYmVsID0gJ3t7JGhlYWRlcn18JHRleHR8PHJldHVyblR5cGU+ICRyZXR1cm5UeXBlfSc7CiAgICAgIGFwcGVuZCgnJGlkIFtzaGFwZT1yZWNvcmQsbGFiZWw9IiRsYWJlbCIsJHN0eWxlXScpOwogICAgICBmb3IgKFN0cmluZyBrZXkgaW4ga2V5cykgewogICAgICAgIGFkZEVkZ2UoaW5wdXRzW2tleV0sIG5vZGUsIHBvcnQ6ICdhJGtleScpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBTdHJpbmcgbGFiZWwgPSAneyR0ZXh0fDxyZXR1cm5UeXBlPiAkcmV0dXJuVHlwZX0nOwogICAgICBhcHBlbmQoJyRpZCBbc2hhcGU9cmVjb3JkLGxhYmVsPSIkbGFiZWwiLCRzdHlsZV0nKTsKICAgICAgLy8gQWRkIGFzc2lnbm1lbnQgZWRnZXMuIENvbG9yIHRoZSBlZGdlcyBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgd2VyZQogICAgICAvLyBhZGRlZCwgcmVtb3ZlZCwgdGVtcG9yYXJ5LCBvciB1bmNoYW5nZWQuCiAgICAgIGR5bmFtaWMgb3JpZ2luYWxTZXQgPSBnbG9iYWwuYXNzaWdubWVudHNCZWZvcmVBbmFseXNpc1tub2RlXSA/PyBjb25zdCBbXTsKICAgICAgdmFyIHRyYWNlclNldCA9IGdsb2JhbC5hc3NpZ25tZW50c0JlZm9yZVRyYWNpbmdbbm9kZV0gPz8gY29uc3QgW107CiAgICAgIHZhciBjdXJyZW50U2V0ID0gbm9kZS5hc3NpZ25tZW50cy50b1NldCgpOwogICAgICBmb3IgKFR5cGVJbmZvcm1hdGlvbiBhc3NpZ25tZW50IGluIGN1cnJlbnRTZXQpIHsKICAgICAgICBTdHJpbmcgY29sb3IgPQogICAgICAgICAgICBvcmlnaW5hbFNldC5jb250YWlucyhhc3NpZ25tZW50KSA/IHVuY2hhbmdlZEVkZ2UgOiBhZGRlZEVkZ2U7CiAgICAgICAgYWRkRWRnZShhc3NpZ25tZW50LCBub2RlLCBjb2xvcjogY29sb3IpOwogICAgICB9CiAgICAgIGZvciAoVHlwZUluZm9ybWF0aW9uIGFzc2lnbm1lbnQgaW4gb3JpZ2luYWxTZXQpIHsKICAgICAgICBpZiAoIWN1cnJlbnRTZXQuY29udGFpbnMoYXNzaWdubWVudCkpIHsKICAgICAgICAgIGFkZEVkZ2UoYXNzaWdubWVudCwgbm9kZSwgY29sb3I6IHJlbW92ZWRFZGdlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yIChUeXBlSW5mb3JtYXRpb24gYXNzaWdubWVudCBpbiB0cmFjZXJTZXQpIHsKICAgICAgICBpZiAoIWN1cnJlbnRTZXQuY29udGFpbnMoYXNzaWdubWVudCkgJiYKICAgICAgICAgICAgIW9yaWdpbmFsU2V0LmNvbnRhaW5zKGFzc2lnbm1lbnQpKSB7CiAgICAgICAgICBhZGRFZGdlKGFzc2lnbm1lbnQsIG5vZGUsIGNvbG9yOiB0ZW1wb3JhcnlFZGdlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChQUklOVF9HUkFQSF9BTExfTk9ERVMpIHsKICAgICAgZm9yIChUeXBlSW5mb3JtYXRpb24gdXNlciBpbiBub2RlLnVzZXJzKSB7CiAgICAgICAgaWYgKCFpc0V4dGVybmFsKHVzZXIpKSB7CiAgICAgICAgICB2aXNpdCh1c2VyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXROYXJyb3dUeXBlSW5mb3JtYXRpb24oTmFycm93VHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIC8vIE9taXQgdW51c2VkIE5hcnJvd3MuCiAgICBpZiAoIVBSSU5UX0dSQVBIX0FMTF9OT0RFUyAmJiBpbmZvLnVzZXJzLmlzRW1wdHkpIHJldHVybjsKICAgIGFkZE5vZGUoaW5mbywgJ05hcnJvd1xuJHtmb3JtYXRUeXBlKGluZm8udHlwZUFubm90YXRpb24pfScsCiAgICAgICAgY29sb3I6IG5hcnJvd0NvbG9yKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRQaGlFbGVtZW50VHlwZUluZm9ybWF0aW9uKFBoaUVsZW1lbnRUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgLy8gT21pdCB1bnVzZWQgUGhpcy4KICAgIGlmICghUFJJTlRfR1JBUEhfQUxMX05PREVTICYmIGluZm8udXNlcnMuaXNFbXB0eSkgcmV0dXJuOwogICAgYWRkTm9kZShpbmZvLCAnUGhpICR7aW5mby52YXJpYWJsZT8ubmFtZSA/PyAnJ30nLCBjb2xvcjogcGhpQ29sb3IpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEVsZW1lbnRJbkNvbnRhaW5lclR5cGVJbmZvcm1hdGlvbigKICAgICAgRWxlbWVudEluQ29udGFpbmVyVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIGFkZE5vZGUoaW5mbywgJ0VsZW1lbnRJbkNvbnRhaW5lcicpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEVsZW1lbnRJblNldFR5cGVJbmZvcm1hdGlvbihFbGVtZW50SW5TZXRUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgYWRkTm9kZShpbmZvLCAnRWxlbWVudEluU2V0Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0S2V5SW5NYXBUeXBlSW5mb3JtYXRpb24oS2V5SW5NYXBUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgYWRkTm9kZShpbmZvLCAnS2V5SW5NYXAnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRWYWx1ZUluTWFwVHlwZUluZm9ybWF0aW9uKFZhbHVlSW5NYXBUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgYWRkTm9kZShpbmZvLCAnVmFsdWVJbk1hcCcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExpc3RUeXBlSW5mb3JtYXRpb24oTGlzdFR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBhZGROb2RlKGluZm8sICdMaXN0Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U2V0VHlwZUluZm9ybWF0aW9uKFNldFR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBhZGROb2RlKGluZm8sICdTZXQnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRNYXBUeXBlSW5mb3JtYXRpb24oTWFwVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIGFkZE5vZGUoaW5mbywgJ01hcCcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbmNyZXRlVHlwZUluZm9ybWF0aW9uKENvbmNyZXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIGFkZE5vZGUoaW5mbywgJ0NvbmNyZXRlJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RyaW5nTGl0ZXJhbFR5cGVJbmZvcm1hdGlvbihTdHJpbmdMaXRlcmFsVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIFN0cmluZyB0ZXh0ID0gc2hvcnRlbihpbmZvLnZhbHVlKS5yZXBsYWNlQWxsKCdcbicsICdcXG4nKTsKICAgIGFkZE5vZGUoaW5mbywgJ1N0cmluZ0xpdGVyYWxcbiIkdGV4dCInKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCb29sTGl0ZXJhbFR5cGVJbmZvcm1hdGlvbihCb29sTGl0ZXJhbFR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBhZGROb2RlKGluZm8sICdCb29sTGl0ZXJhbFxuJHtpbmZvLnZhbHVlfScpOwogIH0KCiAgdm9pZCBoYW5kbGVDYWxsKENhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8sIFN0cmluZyB0ZXh0LAogICAgICBNYXA8U3RyaW5nLCBUeXBlSW5mb3JtYXRpb24+IGlucHV0cykgewogICAgU3RyaW5nIHNvdXJjZUNvZGUgPSBzaG9ydGVuKCcke2luZm8uZGVidWdOYW1lfScpOwogICAgdGV4dCA9ICckdGV4dFxuJHNvdXJjZUNvZGUnOwogICAgaWYgKGluZm8uYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aDsgKytpKSB7CiAgICAgICAgaW5wdXRzWydhcmckaSddID0gaW5mby5hcmd1bWVudHMucG9zaXRpb25hbFtpXTsKICAgICAgfQogICAgICBmb3IgKFN0cmluZyBhcmdOYW1lIGluIGluZm8uYXJndW1lbnRzLm5hbWVkLmtleXMpIHsKICAgICAgICBpbnB1dHNbYXJnTmFtZV0gPSBpbmZvLmFyZ3VtZW50cy5uYW1lZFthcmdOYW1lXTsKICAgICAgfQogICAgfQogICAgYWRkTm9kZShpbmZvLCB0ZXh0LCBjb2xvcjogY2FsbENvbG9yLCBpbnB1dHM6IGlucHV0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2xvc3VyZUNhbGxTaXRlVHlwZUluZm9ybWF0aW9uKAogICAgICBDbG9zdXJlQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgaGFuZGxlQ2FsbChpbmZvLCAnQ2xvc3VyZUNhbGxTaXRlJywge30pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIGhhbmRsZUNhbGwoaW5mbywgJ1N0YXRpY0NhbGxTaXRlJywge30pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdER5bmFtaWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbigKICAgICAgRHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIGhhbmRsZUNhbGwoaW5mbywgJ0R5bmFtaWNDYWxsU2l0ZScsIHsnb2JqJzogaW5mby5yZWNlaXZlcn0pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE1lbWJlclR5cGVJbmZvcm1hdGlvbihNZW1iZXJUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgYWRkTm9kZShpbmZvLCAnTWVtYmVyXG4ke2luZm8uZGVidWdOYW1lfScpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFBhcmFtZXRlclR5cGVJbmZvcm1hdGlvbihQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgYWRkTm9kZShpbmZvLCAnUGFyYW1ldGVyICR7aW5mby5kZWJ1Z05hbWV9Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2xvc3VyZVR5cGVJbmZvcm1hdGlvbihDbG9zdXJlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIFN0cmluZyB0ZXh0ID0gc2hvcnRlbignJHtpbmZvLmRlYnVnTmFtZX0nKTsKICAgIGFkZE5vZGUoaW5mbywgJ0Nsb3N1cmVcbiR0ZXh0Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXdhaXRUeXBlSW5mb3JtYXRpb24oQXdhaXRUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgU3RyaW5nIHRleHQgPSBzaG9ydGVuKCcke2luZm8uZGVidWdOYW1lfScpOwogICAgYWRkTm9kZShpbmZvLCAnQXdhaXRcbiR0ZXh0Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0WWllbGRUeXBlSW5mb3JtYXRpb24oWWllbGRUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgU3RyaW5nIHRleHQgPSBzaG9ydGVuKCcke2luZm8uZGVidWdOYW1lfScpOwogICAgYWRkTm9kZShpbmZvLCAnWWllbGRcbiR0ZXh0Jyk7CiAgfQp9CoHAAE5OPCoBIiQxJR8gFQFPUBUEUU08BBYEKCQES0cEFi8BJyFPMU4xNwE1AU0bGjw8GzAIBgQBQhk8PBsvCAYEAR4ZOTUxPCgOSBgIBiUvGQw0Mjo3UTcfCiMaEh4aCggGBAFJGwZRGDVOIiU/LRwoIygoIiMPIQgNEU8GSjZNLxo8FgYmBAIBODceQEZFMxMbHh8BTUpDGQQBEhEEAUcGT0gbIjQoEwYEASUlFwQBHyQEASAcTwYRBAEhATwpK0sbCBIEATYBSSRKBAErBkw/OS4uOgYjGBsGKkxMLx08IDNAMg1JBgQBR0M0LC4tAU0PLywsUQEqQQQBPxwZLQQBTTwfJgZHNAYRBAFIBksjMk8UMSYeHzwaT0NDOiEzCA05OkoyUEkxNxdKMQg4MDkKCDYwMTsKCAYhMSEXCggGBAEMQBw+QB0EAQxIGT5IBAEMLzApBAEMTCMEAQxEHwQBDEghBAEMPBsEAQw6GgQBDDoaBAEMRB8EAQxOPy0EAQxKMQQBPS02ISJDOAg6OQgGOwQBDCwtLQQBDFAsBAEMLC1BBAEMQDAEAQxGMgQBDEIwJQQBDD4wIwQBDD4wIwQCATJwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci90eXBlX2dyYXBoX2R1bXAuZGFydDdzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pbmZlcnJlci90eXBlX3N5c3RlbS5kYXJ0wABh4C8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vd29ybGQuZGFydCc7CmltcG9ydCAnYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJ3R5cGVfZ3JhcGhfbm9kZXMuZGFydCc7CgovLy8gU3RyYXRlZ3kgZm9yIGNyZWF0aW5nIHR5cGUgaW5mb3JtYXRpb24gZnJvbSBtZW1iZXJzIGFuZCBwYXJhbWV0ZXJzIGFuZCB0eXBlCi8vLyBpbmZvcm1hdGlvbiBmb3Igbm9kZXMuCmFic3RyYWN0IGNsYXNzIFR5cGVTeXN0ZW1TdHJhdGVneSB7CiAgLy8vIENyZWF0ZXMgW01lbWJlclR5cGVJbmZvcm1hdGlvbl0gZm9yIFttZW1iZXJdLgogIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBjcmVhdGVNZW1iZXJUeXBlSW5mb3JtYXRpb24oCiAgICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwgTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIC8vLyBDcmVhdGVzIFtQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb25dIGZvciBbcGFyYW1ldGVyXS4KICBQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24gY3JlYXRlUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uKAogICAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4sCiAgICAgIExvY2FsIHBhcmFtZXRlciwKICAgICAgVHlwZVN5c3RlbSB0eXBlcyk7CgogIC8vLyBDYWxscyBbZl0gZm9yIGVhY2ggcGFyYW1ldGVyIGluIFtmdW5jdGlvbl0uCiAgdm9pZCBmb3JFYWNoUGFyYW1ldGVyKEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uLCB2b2lkIGYoTG9jYWwgcGFyYW1ldGVyKSk7CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgW25vZGVdIGlzIHZhbGlkIGFzIGEgZ2VuZXJhbCBwaGkgbm9kZS4KICBib29sIGNoZWNrUGhpTm9kZShpci5Ob2RlIG5vZGUpOwoKICAvLy8gUmV0dXJucyB3aGV0aGVyIFtub2RlXSBpcyB2YWxpZCBhcyBhIGxvb3AgcGhpIG5vZGUuCiAgYm9vbCBjaGVja0xvb3BQaGlOb2RlKGlyLk5vZGUgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgW25vZGVdIGlzIHZhbGlkIGFzIGEgbGlzdCBhbGxvY2F0aW9uIG5vZGUuCiAgYm9vbCBjaGVja0xpc3ROb2RlKGlyLk5vZGUgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgW25vZGVdIGlzIHZhbGlkIGFzIGEgc2V0IGFsbG9jYXRpb24gbm9kZS4KICBib29sIGNoZWNrU2V0Tm9kZShpci5Ob2RlIG5vZGUpOwoKICAvLy8gUmV0dXJucyB3aGV0aGVyIFtub2RlXSBpcyB2YWxpZCBhcyBhIG1hcCBhbGxvY2F0aW9uIG5vZGUuCiAgYm9vbCBjaGVja01hcE5vZGUoaXIuTm9kZSBub2RlKTsKCiAgLy8vIFJldHVybnMgd2hldGhlciBbY2xzXSBpcyB2YWxpZCBhcyBhIHR5cGUgbWFzayBiYXNlIGNsYXNzLgogIGJvb2wgY2hlY2tDbGFzc0VudGl0eShDbGFzc0VudGl0eSBjbHMpOwp9CgovLy8gVGhlIGNsYXNzIFtTaW1wbGVJbmZlcnJlclZpc2l0b3JdIHdpbGwgdXNlIHdoZW4gd29ya2luZyBvbiB0eXBlcy4KY2xhc3MgVHlwZVN5c3RlbSB7CiAgZmluYWwgSkNsb3NlZFdvcmxkIF9jbG9zZWRXb3JsZDsKICBmaW5hbCBUeXBlU3lzdGVtU3RyYXRlZ3kgc3RyYXRlZ3k7CgogIC8vLyBbcGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uc10gYW5kIFttZW1iZXJUeXBlSW5mb3JtYXRpb25zXSBvcmRlcmVkIGJ5CiAgLy8vIGNyZWF0aW9uIHRpbWUuIFRoaXMgaXMgdXNlZCBhcyB0aGUgaW5mZXJlbmNlIGVucXVldWVpbmcgb3JkZXIuCiAgZmluYWwgTGlzdDxUeXBlSW5mb3JtYXRpb24+IF9vcmRlcmVkVHlwZUluZm9ybWF0aW9ucyA9IDxUeXBlSW5mb3JtYXRpb24+W107CgogIC8vLyBbUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uXXMgZm9yIHBhcmFtZXRlcnMuCiAgZmluYWwgTWFwPExvY2FsLCBQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24+IHBhcmFtZXRlclR5cGVJbmZvcm1hdGlvbnMgPQogICAgICBuZXcgTWFwPExvY2FsLCBQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24+KCk7CgogIC8vLyBbTWVtYmVyVHlwZUluZm9ybWF0aW9uXXMgZm9yIG1lbWJlcnMuCiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwgTWVtYmVyVHlwZUluZm9ybWF0aW9uPiBtZW1iZXJUeXBlSW5mb3JtYXRpb25zID0KICAgICAgbmV3IE1hcDxNZW1iZXJFbnRpdHksIE1lbWJlclR5cGVJbmZvcm1hdGlvbj4oKTsKCiAgLy8vIFtMaXN0VHlwZUluZm9ybWF0aW9uXSBmb3IgYWxsb2NhdGVkIGxpc3RzLgogIGZpbmFsIE1hcDxpci5UcmVlTm9kZSwgTGlzdFR5cGVJbmZvcm1hdGlvbj4gYWxsb2NhdGVkTGlzdHMgPQogICAgICBuZXcgTWFwPGlyLlRyZWVOb2RlLCBMaXN0VHlwZUluZm9ybWF0aW9uPigpOwoKICAvLy8gW1NldFR5cGVJbmZvcm1hdGlvbl0gZm9yIGFsbG9jYXRlZCBTZXRzLgogIGZpbmFsIE1hcDxpci5UcmVlTm9kZSwgU2V0VHlwZUluZm9ybWF0aW9uPiBhbGxvY2F0ZWRTZXRzID0KICAgICAgbmV3IE1hcDxpci5UcmVlTm9kZSwgU2V0VHlwZUluZm9ybWF0aW9uPigpOwoKICAvLy8gW01hcFR5cGVJbmZvcm1hdGlvbl0gZm9yIGFsbG9jYXRlZCBNYXBzLgogIGZpbmFsIE1hcDxpci5UcmVlTm9kZSwgVHlwZUluZm9ybWF0aW9uPiBhbGxvY2F0ZWRNYXBzID0KICAgICAgbmV3IE1hcDxpci5UcmVlTm9kZSwgVHlwZUluZm9ybWF0aW9uPigpOwoKICAvLy8gQ2xvc3VyZXMgZm91bmQgZHVyaW5nIHRoZSBhbmFseXNpcy4KICBmaW5hbCBTZXQ8VHlwZUluZm9ybWF0aW9uPiBhbGxvY2F0ZWRDbG9zdXJlcyA9IG5ldyBTZXQ8VHlwZUluZm9ybWF0aW9uPigpOwoKICAvLy8gQ2FjaGUgb2YgW0NvbmNyZXRlVHlwZUluZm9ybWF0aW9uXS4KICBmaW5hbCBNYXA8QWJzdHJhY3RWYWx1ZSwgVHlwZUluZm9ybWF0aW9uPiBjb25jcmV0ZVR5cGVzID0KICAgICAgbmV3IE1hcDxBYnN0cmFjdFZhbHVlLCBUeXBlSW5mb3JtYXRpb24+KCk7CgogIC8vLyBMaXN0IG9mIFtUeXBlSW5mb3JtYXRpb25dcyBmb3IgY2FsbHMgaW5zaWRlIG1ldGhvZCBib2RpZXMuCiAgZmluYWwgTGlzdDxDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbj4gYWxsb2NhdGVkQ2FsbHMgPQogICAgICA8Q2FsbFNpdGVUeXBlSW5mb3JtYXRpb24+W107CgogIC8vLyBMaXN0IG9mIFtUeXBlSW5mb3JtYXRpb25dcyBhbGxvY2F0ZWQgaW5zaWRlIG1ldGhvZCBib2RpZXMgKG5hcnJvd2luZywKICAvLy8gcGhpcywgYW5kIGNvbnRhaW5lcnMpLgogIGZpbmFsIExpc3Q8VHlwZUluZm9ybWF0aW9uPiBhbGxvY2F0ZWRUeXBlcyA9IDxUeXBlSW5mb3JtYXRpb24+W107CgogIC8vLyBbcGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uc10gYW5kIFttZW1iZXJUeXBlSW5mb3JtYXRpb25zXSBvcmRlcmVkIGJ5CiAgLy8vIGNyZWF0aW9uIHRpbWUuIFRoaXMgaXMgdXNlZCBhcyB0aGUgaW5mZXJlbmNlIGVucXVldWVpbmcgb3JkZXIuCiAgSXRlcmFibGU8VHlwZUluZm9ybWF0aW9uPiBnZXQgb3JkZXJlZFR5cGVJbmZvcm1hdGlvbnMgPT4KICAgICAgX29yZGVyZWRUeXBlSW5mb3JtYXRpb25zOwoKICBJdGVyYWJsZTxUeXBlSW5mb3JtYXRpb24+IGdldCBhbGxUeXBlcyA9PiBbCiAgICAgICAgcGFyYW1ldGVyVHlwZUluZm9ybWF0aW9ucy52YWx1ZXMsCiAgICAgICAgbWVtYmVyVHlwZUluZm9ybWF0aW9ucy52YWx1ZXMsCiAgICAgICAgYWxsb2NhdGVkTGlzdHMudmFsdWVzLAogICAgICAgIGFsbG9jYXRlZFNldHMudmFsdWVzLAogICAgICAgIGFsbG9jYXRlZE1hcHMudmFsdWVzLAogICAgICAgIGFsbG9jYXRlZENsb3N1cmVzLAogICAgICAgIGNvbmNyZXRlVHlwZXMudmFsdWVzLAogICAgICAgIGFsbG9jYXRlZENhbGxzLAogICAgICAgIGFsbG9jYXRlZFR5cGVzCiAgICAgIF0uZXhwYW5kKCh4KSA9PiB4KTsKCiAgVHlwZVN5c3RlbSh0aGlzLl9jbG9zZWRXb3JsZCwgdGhpcy5zdHJhdGVneSkgewogICAgbm9uTnVsbEVtcHR5VHlwZSA9IGdldENvbmNyZXRlVHlwZUZvcihfYWJzdHJhY3RWYWx1ZURvbWFpbi5lbXB0eVR5cGUpOwogIH0KCiAgQWJzdHJhY3RWYWx1ZURvbWFpbiBnZXQgX2Fic3RyYWN0VmFsdWVEb21haW4gPT4KICAgICAgX2Nsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CgogIC8vLyBVc2VkIHRvIGdyb3VwIFtUeXBlSW5mb3JtYXRpb25dIG5vZGVzIGJ5IHRoZSBlbGVtZW50IHRoYXQgdHJpZ2dlcmVkIHRoZWlyCiAgLy8vIGNyZWF0aW9uLgogIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBfY3VycmVudE1lbWJlciA9IG51bGw7CiAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGdldCBjdXJyZW50TWVtYmVyID0+IF9jdXJyZW50TWVtYmVyOwoKICB2b2lkIHdpdGhNZW1iZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQsIHZvaWQgYWN0aW9uKCkpIHsKICAgIGFzc2VydChfY3VycmVudE1lbWJlciA9PSBudWxsLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsICJBbHJlYWR5IGNvbnN0cnVjdGluZyBncmFwaCBmb3IgJF9jdXJyZW50TWVtYmVyLiIpKTsKICAgIF9jdXJyZW50TWVtYmVyID0gZ2V0SW5mZXJyZWRUeXBlT2ZNZW1iZXIoZWxlbWVudCk7CiAgICBhY3Rpb24oKTsKICAgIF9jdXJyZW50TWVtYmVyID0gbnVsbDsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiBudWxsVHlwZUNhY2hlOwogIFR5cGVJbmZvcm1hdGlvbiBnZXQgbnVsbFR5cGUgewogICAgaWYgKG51bGxUeXBlQ2FjaGUgIT0gbnVsbCkgcmV0dXJuIG51bGxUeXBlQ2FjaGU7CiAgICByZXR1cm4gbnVsbFR5cGVDYWNoZSA9IGdldENvbmNyZXRlVHlwZUZvcihfYWJzdHJhY3RWYWx1ZURvbWFpbi5udWxsVHlwZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gaW50VHlwZUNhY2hlOwogIFR5cGVJbmZvcm1hdGlvbiBnZXQgaW50VHlwZSB7CiAgICBpZiAoaW50VHlwZUNhY2hlICE9IG51bGwpIHJldHVybiBpbnRUeXBlQ2FjaGU7CiAgICByZXR1cm4gaW50VHlwZUNhY2hlID0gZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLmludFR5cGUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIHVpbnQzMlR5cGVDYWNoZTsKICBUeXBlSW5mb3JtYXRpb24gZ2V0IHVpbnQzMlR5cGUgewogICAgaWYgKHVpbnQzMlR5cGVDYWNoZSAhPSBudWxsKSByZXR1cm4gdWludDMyVHlwZUNhY2hlOwogICAgcmV0dXJuIHVpbnQzMlR5cGVDYWNoZSA9CiAgICAgICAgZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLnVpbnQzMlR5cGUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIHVpbnQzMVR5cGVDYWNoZTsKICBUeXBlSW5mb3JtYXRpb24gZ2V0IHVpbnQzMVR5cGUgewogICAgaWYgKHVpbnQzMVR5cGVDYWNoZSAhPSBudWxsKSByZXR1cm4gdWludDMxVHlwZUNhY2hlOwogICAgcmV0dXJuIHVpbnQzMVR5cGVDYWNoZSA9CiAgICAgICAgZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLnVpbnQzMVR5cGUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIHBvc2l0aXZlSW50VHlwZUNhY2hlOwogIFR5cGVJbmZvcm1hdGlvbiBnZXQgcG9zaXRpdmVJbnRUeXBlIHsKICAgIGlmIChwb3NpdGl2ZUludFR5cGVDYWNoZSAhPSBudWxsKSByZXR1cm4gcG9zaXRpdmVJbnRUeXBlQ2FjaGU7CiAgICByZXR1cm4gcG9zaXRpdmVJbnRUeXBlQ2FjaGUgPQogICAgICAgIGdldENvbmNyZXRlVHlwZUZvcihfYWJzdHJhY3RWYWx1ZURvbWFpbi5wb3NpdGl2ZUludFR5cGUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGRvdWJsZVR5cGVDYWNoZTsKICBUeXBlSW5mb3JtYXRpb24gZ2V0IGRvdWJsZVR5cGUgewogICAgaWYgKGRvdWJsZVR5cGVDYWNoZSAhPSBudWxsKSByZXR1cm4gZG91YmxlVHlwZUNhY2hlOwogICAgcmV0dXJuIGRvdWJsZVR5cGVDYWNoZSA9CiAgICAgICAgZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLmRvdWJsZVR5cGUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIG51bVR5cGVDYWNoZTsKICBUeXBlSW5mb3JtYXRpb24gZ2V0IG51bVR5cGUgewogICAgaWYgKG51bVR5cGVDYWNoZSAhPSBudWxsKSByZXR1cm4gbnVtVHlwZUNhY2hlOwogICAgcmV0dXJuIG51bVR5cGVDYWNoZSA9IGdldENvbmNyZXRlVHlwZUZvcihfYWJzdHJhY3RWYWx1ZURvbWFpbi5udW1UeXBlKTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiBib29sVHlwZUNhY2hlOwogIFR5cGVJbmZvcm1hdGlvbiBnZXQgYm9vbFR5cGUgewogICAgaWYgKGJvb2xUeXBlQ2FjaGUgIT0gbnVsbCkgcmV0dXJuIGJvb2xUeXBlQ2FjaGU7CiAgICByZXR1cm4gYm9vbFR5cGVDYWNoZSA9IGdldENvbmNyZXRlVHlwZUZvcihfYWJzdHJhY3RWYWx1ZURvbWFpbi5ib29sVHlwZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gZnVuY3Rpb25UeXBlQ2FjaGU7CiAgVHlwZUluZm9ybWF0aW9uIGdldCBmdW5jdGlvblR5cGUgewogICAgaWYgKGZ1bmN0aW9uVHlwZUNhY2hlICE9IG51bGwpIHJldHVybiBmdW5jdGlvblR5cGVDYWNoZTsKICAgIHJldHVybiBmdW5jdGlvblR5cGVDYWNoZSA9CiAgICAgICAgZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLmZ1bmN0aW9uVHlwZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gbGlzdFR5cGVDYWNoZTsKICBUeXBlSW5mb3JtYXRpb24gZ2V0IGxpc3RUeXBlIHsKICAgIGlmIChsaXN0VHlwZUNhY2hlICE9IG51bGwpIHJldHVybiBsaXN0VHlwZUNhY2hlOwogICAgcmV0dXJuIGxpc3RUeXBlQ2FjaGUgPSBnZXRDb25jcmV0ZVR5cGVGb3IoX2Fic3RyYWN0VmFsdWVEb21haW4ubGlzdFR5cGUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGNvbnN0TGlzdFR5cGVDYWNoZTsKICBUeXBlSW5mb3JtYXRpb24gZ2V0IGNvbnN0TGlzdFR5cGUgewogICAgaWYgKGNvbnN0TGlzdFR5cGVDYWNoZSAhPSBudWxsKSByZXR1cm4gY29uc3RMaXN0VHlwZUNhY2hlOwogICAgcmV0dXJuIGNvbnN0TGlzdFR5cGVDYWNoZSA9CiAgICAgICAgZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLmNvbnN0TGlzdFR5cGUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGZpeGVkTGlzdFR5cGVDYWNoZTsKICBUeXBlSW5mb3JtYXRpb24gZ2V0IGZpeGVkTGlzdFR5cGUgewogICAgaWYgKGZpeGVkTGlzdFR5cGVDYWNoZSAhPSBudWxsKSByZXR1cm4gZml4ZWRMaXN0VHlwZUNhY2hlOwogICAgcmV0dXJuIGZpeGVkTGlzdFR5cGVDYWNoZSA9CiAgICAgICAgZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLmZpeGVkTGlzdFR5cGUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGdyb3dhYmxlTGlzdFR5cGVDYWNoZTsKICBUeXBlSW5mb3JtYXRpb24gZ2V0IGdyb3dhYmxlTGlzdFR5cGUgewogICAgaWYgKGdyb3dhYmxlTGlzdFR5cGVDYWNoZSAhPSBudWxsKSByZXR1cm4gZ3Jvd2FibGVMaXN0VHlwZUNhY2hlOwogICAgcmV0dXJuIGdyb3dhYmxlTGlzdFR5cGVDYWNoZSA9CiAgICAgICAgZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLmdyb3dhYmxlTGlzdFR5cGUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIHNldFR5cGVDYWNoZTsKICBUeXBlSW5mb3JtYXRpb24gZ2V0IHNldFR5cGUgPT4KICAgICAgc2V0VHlwZUNhY2hlID8/PSBnZXRDb25jcmV0ZVR5cGVGb3IoX2Fic3RyYWN0VmFsdWVEb21haW4uc2V0VHlwZSk7CgogIFR5cGVJbmZvcm1hdGlvbiBjb25zdFNldFR5cGVDYWNoZTsKICBUeXBlSW5mb3JtYXRpb24gZ2V0IGNvbnN0U2V0VHlwZSA9PiBjb25zdFNldFR5cGVDYWNoZSA/Pz0KICAgICAgZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLmNvbnN0U2V0VHlwZSk7CgogIFR5cGVJbmZvcm1hdGlvbiBtYXBUeXBlQ2FjaGU7CiAgVHlwZUluZm9ybWF0aW9uIGdldCBtYXBUeXBlIHsKICAgIGlmIChtYXBUeXBlQ2FjaGUgIT0gbnVsbCkgcmV0dXJuIG1hcFR5cGVDYWNoZTsKICAgIHJldHVybiBtYXBUeXBlQ2FjaGUgPSBnZXRDb25jcmV0ZVR5cGVGb3IoX2Fic3RyYWN0VmFsdWVEb21haW4ubWFwVHlwZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gY29uc3RNYXBUeXBlQ2FjaGU7CiAgVHlwZUluZm9ybWF0aW9uIGdldCBjb25zdE1hcFR5cGUgewogICAgaWYgKGNvbnN0TWFwVHlwZUNhY2hlICE9IG51bGwpIHJldHVybiBjb25zdE1hcFR5cGVDYWNoZTsKICAgIHJldHVybiBjb25zdE1hcFR5cGVDYWNoZSA9CiAgICAgICAgZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLmNvbnN0TWFwVHlwZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gc3RyaW5nVHlwZUNhY2hlOwogIFR5cGVJbmZvcm1hdGlvbiBnZXQgc3RyaW5nVHlwZSB7CiAgICBpZiAoc3RyaW5nVHlwZUNhY2hlICE9IG51bGwpIHJldHVybiBzdHJpbmdUeXBlQ2FjaGU7CiAgICByZXR1cm4gc3RyaW5nVHlwZUNhY2hlID0KICAgICAgICBnZXRDb25jcmV0ZVR5cGVGb3IoX2Fic3RyYWN0VmFsdWVEb21haW4uc3RyaW5nVHlwZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gdHlwZVR5cGVDYWNoZTsKICBUeXBlSW5mb3JtYXRpb24gZ2V0IHR5cGVUeXBlIHsKICAgIGlmICh0eXBlVHlwZUNhY2hlICE9IG51bGwpIHJldHVybiB0eXBlVHlwZUNhY2hlOwogICAgcmV0dXJuIHR5cGVUeXBlQ2FjaGUgPSBnZXRDb25jcmV0ZVR5cGVGb3IoX2Fic3RyYWN0VmFsdWVEb21haW4udHlwZVR5cGUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGR5bmFtaWNUeXBlQ2FjaGU7CiAgVHlwZUluZm9ybWF0aW9uIGdldCBkeW5hbWljVHlwZSB7CiAgICBpZiAoZHluYW1pY1R5cGVDYWNoZSAhPSBudWxsKSByZXR1cm4gZHluYW1pY1R5cGVDYWNoZTsKICAgIHJldHVybiBkeW5hbWljVHlwZUNhY2hlID0KICAgICAgICBnZXRDb25jcmV0ZVR5cGVGb3IoX2Fic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGFzeW5jRnV0dXJlVHlwZUNhY2hlOwogIC8vIFN1YnR5cGUgb2YgRnV0dXJlIHJldHVybmVkIGJ5IGFzeW5jIG1ldGhvZHMuCiAgVHlwZUluZm9ybWF0aW9uIGdldCBhc3luY0Z1dHVyZVR5cGUgewogICAgaWYgKGFzeW5jRnV0dXJlVHlwZUNhY2hlICE9IG51bGwpIHJldHVybiBhc3luY0Z1dHVyZVR5cGVDYWNoZTsKICAgIHJldHVybiBhc3luY0Z1dHVyZVR5cGVDYWNoZSA9CiAgICAgICAgZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLmFzeW5jRnV0dXJlVHlwZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gc3luY1N0YXJJdGVyYWJsZVR5cGVDYWNoZTsKICBUeXBlSW5mb3JtYXRpb24gZ2V0IHN5bmNTdGFySXRlcmFibGVUeXBlIHsKICAgIGlmIChzeW5jU3Rhckl0ZXJhYmxlVHlwZUNhY2hlICE9IG51bGwpIHJldHVybiBzeW5jU3Rhckl0ZXJhYmxlVHlwZUNhY2hlOwogICAgcmV0dXJuIHN5bmNTdGFySXRlcmFibGVUeXBlQ2FjaGUgPQogICAgICAgIGdldENvbmNyZXRlVHlwZUZvcihfYWJzdHJhY3RWYWx1ZURvbWFpbi5zeW5jU3Rhckl0ZXJhYmxlVHlwZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gYXN5bmNTdGFyU3RyZWFtVHlwZUNhY2hlOwogIFR5cGVJbmZvcm1hdGlvbiBnZXQgYXN5bmNTdGFyU3RyZWFtVHlwZSB7CiAgICBpZiAoYXN5bmNTdGFyU3RyZWFtVHlwZUNhY2hlICE9IG51bGwpIHJldHVybiBhc3luY1N0YXJTdHJlYW1UeXBlQ2FjaGU7CiAgICByZXR1cm4gYXN5bmNTdGFyU3RyZWFtVHlwZUNhY2hlID0KICAgICAgICBnZXRDb25jcmV0ZVR5cGVGb3IoX2Fic3RyYWN0VmFsdWVEb21haW4uYXN5bmNTdGFyU3RyZWFtVHlwZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gbm9uTnVsbEVtcHR5VHlwZTsKCiAgVHlwZUluZm9ybWF0aW9uIHN0cmluZ0xpdGVyYWxUeXBlKFN0cmluZyB2YWx1ZSkgewogICAgcmV0dXJuIG5ldyBTdHJpbmdMaXRlcmFsVHlwZUluZm9ybWF0aW9uKAogICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLCB2YWx1ZSwgX2Fic3RyYWN0VmFsdWVEb21haW4uc3RyaW5nVHlwZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gYm9vbExpdGVyYWxUeXBlKGJvb2wgdmFsdWUpIHsKICAgIHJldHVybiBuZXcgQm9vbExpdGVyYWxUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4sIHZhbHVlLCBfYWJzdHJhY3RWYWx1ZURvbWFpbi5ib29sVHlwZSk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgYmV0d2VlbiBbZmlyc3RUeXBlXSBhbmQKICAvLy8gW3NlY29uZFR5cGVdLgogIFR5cGVJbmZvcm1hdGlvbiBjb21wdXRlTFVCKAogICAgICBUeXBlSW5mb3JtYXRpb24gZmlyc3RUeXBlLCBUeXBlSW5mb3JtYXRpb24gc2Vjb25kVHlwZSkgewogICAgaWYgKGZpcnN0VHlwZSA9PSBudWxsKSByZXR1cm4gc2Vjb25kVHlwZTsKICAgIGlmIChmaXJzdFR5cGUgPT0gc2Vjb25kVHlwZSkgcmV0dXJuIGZpcnN0VHlwZTsKICAgIGlmIChmaXJzdFR5cGUgPT0gbm9uTnVsbEVtcHR5VHlwZSkgcmV0dXJuIHNlY29uZFR5cGU7CiAgICBpZiAoc2Vjb25kVHlwZSA9PSBub25OdWxsRW1wdHlUeXBlKSByZXR1cm4gZmlyc3RUeXBlOwogICAgaWYgKGZpcnN0VHlwZSA9PSBkeW5hbWljVHlwZSB8fCBzZWNvbmRUeXBlID09IGR5bmFtaWNUeXBlKSB7CiAgICAgIHJldHVybiBkeW5hbWljVHlwZTsKICAgIH0KICAgIHJldHVybiBnZXRDb25jcmV0ZVR5cGVGb3IoCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4udW5pb24oZmlyc3RUeXBlLnR5cGUsIHNlY29uZFR5cGUudHlwZSkpOwogIH0KCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIGBzZWxlY3RvcmAgc2hvdWxkIGJlIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgbmV3CiAgLy8vIGByZWNlaXZlclR5cGVgLgogIGJvb2wgc2VsZWN0b3JOZWVkc1VwZGF0ZShUeXBlSW5mb3JtYXRpb24gaW5mbywgQWJzdHJhY3RWYWx1ZSBtYXNrKSB7CiAgICByZXR1cm4gaW5mby50eXBlICE9IG1hc2s7CiAgfQoKICBib29sIF9pc05vbk51bGxOYXJyb3coVHlwZUluZm9ybWF0aW9uIHR5cGUpID0+CiAgICAgIHR5cGUgaXMgTmFycm93VHlwZUluZm9ybWF0aW9uICYmCiAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzTnVsbCh0eXBlLnR5cGVBbm5vdGF0aW9uKS5pc0RlZmluaXRlbHlGYWxzZTsKCiAgLy8vIFJldHVybnMgdGhlIGludGVyc2VjdGlvbiBiZXR3ZWVuIFt0eXBlXSBhbmQgW2Fubm90YXRpb25dLgogIC8vLyBbaXNOdWxsYWJsZV0gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFubm90YXRpb24gaW1wbGllcyBhIG51bGwKICAvLy8gdHlwZS4KICBUeXBlSW5mb3JtYXRpb24gbmFycm93VHlwZShUeXBlSW5mb3JtYXRpb24gdHlwZSwgRGFydFR5cGUgYW5ub3RhdGlvbiwKICAgICAge2Jvb2wgaXNOdWxsYWJsZTogdHJ1ZX0pIHsKICAgIEFic3RyYWN0VmFsdWUgb3RoZXJUeXBlOwogICAgaWYgKGFubm90YXRpb24uaXNWb2lkKSByZXR1cm4gdHlwZTsKICAgIGlmIChhbm5vdGF0aW9uLnRyZWF0QXNEeW5hbWljKSB7CiAgICAgIGlmIChpc051bGxhYmxlKSByZXR1cm4gdHlwZTsKICAgICAgLy8gSWYgdGhlIGlucHV0IGlzIGFscmVhZHkgbmFycm93ZWQgdG8gYmUgbm90LW51bGwsIHRoZXJlIGlzIG5vIHZhbHVlCiAgICAgIC8vIGluIGFkZGluZyBhbm90aGVyIG5hcnJvd2luZyBub2RlLgogICAgICBpZiAoX2lzTm9uTnVsbE5hcnJvdyh0eXBlKSkgcmV0dXJuIHR5cGU7CiAgICAgIG90aGVyVHlwZSA9IF9hYnN0cmFjdFZhbHVlRG9tYWluLmV4Y2x1ZGVOdWxsKGR5bmFtaWNUeXBlLnR5cGUpOwogICAgfSBlbHNlIGlmIChhbm5vdGF0aW9uLmlzSW50ZXJmYWNlVHlwZSkgewogICAgICBJbnRlcmZhY2VUeXBlIGludGVyZmFjZSA9IGFubm90YXRpb247CiAgICAgIGlmIChpbnRlcmZhY2UuZWxlbWVudCA9PSBfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MpIHsKICAgICAgICBpZiAoaXNOdWxsYWJsZSkgcmV0dXJuIHR5cGU7CiAgICAgICAgaWYgKF9pc05vbk51bGxOYXJyb3codHlwZSkpIHJldHVybiB0eXBlOwogICAgICAgIG90aGVyVHlwZSA9IF9hYnN0cmFjdFZhbHVlRG9tYWluLmV4Y2x1ZGVOdWxsKGR5bmFtaWNUeXBlLnR5cGUpOwogICAgICB9IGVsc2UgewogICAgICAgIG90aGVyVHlwZSA9CiAgICAgICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmNyZWF0ZU5vbk51bGxTdWJ0eXBlKGludGVyZmFjZS5lbGVtZW50KTsKICAgICAgfQogICAgfSBlbHNlIGlmIChhbm5vdGF0aW9uLmlzVHlwZWRlZiB8fCBhbm5vdGF0aW9uLmlzRnVuY3Rpb25UeXBlKSB7CiAgICAgIG90aGVyVHlwZSA9IGZ1bmN0aW9uVHlwZS50eXBlOwogICAgfSBlbHNlIGlmIChhbm5vdGF0aW9uLmlzRnV0dXJlT3IpIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3VwcG9ydCBuYXJyb3dpbmcgb2YgRnV0dXJlT3IuCiAgICAgIHJldHVybiB0eXBlOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KGFubm90YXRpb24uaXNUeXBlVmFyaWFibGUpOwogICAgICAvLyBUT0RPKG5nZW9mZnJheSk6IE5hcnJvdyB0byBib3VuZC4KICAgICAgcmV0dXJuIHR5cGU7CiAgICB9CiAgICBpZiAoaXNOdWxsYWJsZSkgewogICAgICBvdGhlclR5cGUgPSBfYWJzdHJhY3RWYWx1ZURvbWFpbi5pbmNsdWRlTnVsbChvdGhlclR5cGUpOwogICAgfQogICAgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzRXhhY3QodHlwZS50eXBlKS5pc0RlZmluaXRlbHlUcnVlKSByZXR1cm4gdHlwZTsKICAgIFR5cGVJbmZvcm1hdGlvbiBuZXdUeXBlID0KICAgICAgICBuZXcgTmFycm93VHlwZUluZm9ybWF0aW9uKF9hYnN0cmFjdFZhbHVlRG9tYWluLCB0eXBlLCBvdGhlclR5cGUpOwogICAgYWxsb2NhdGVkVHlwZXMuYWRkKG5ld1R5cGUpOwogICAgcmV0dXJuIG5ld1R5cGU7CiAgfQoKICBQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24gZ2V0SW5mZXJyZWRUeXBlT2ZQYXJhbWV0ZXIoTG9jYWwgcGFyYW1ldGVyKSB7CiAgICByZXR1cm4gcGFyYW1ldGVyVHlwZUluZm9ybWF0aW9ucy5wdXRJZkFic2VudChwYXJhbWV0ZXIsICgpIHsKICAgICAgUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uIHR5cGVJbmZvcm1hdGlvbiA9CiAgICAgICAgICBzdHJhdGVneS5jcmVhdGVQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4sIHBhcmFtZXRlciwgdGhpcyk7CiAgICAgIF9vcmRlcmVkVHlwZUluZm9ybWF0aW9ucy5hZGQodHlwZUluZm9ybWF0aW9uKTsKICAgICAgcmV0dXJuIHR5cGVJbmZvcm1hdGlvbjsKICAgIH0pOwogIH0KCiAgdm9pZCBmb3JFYWNoUGFyYW1ldGVyVHlwZSgKICAgICAgdm9pZCBmKExvY2FsIHBhcmFtZXRlciwgUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uIHR5cGVJbmZvcm1hdGlvbikpIHsKICAgIHBhcmFtZXRlclR5cGVJbmZvcm1hdGlvbnMuZm9yRWFjaChmKTsKICB9CgogIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBnZXRJbmZlcnJlZFR5cGVPZk1lbWJlcihNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICBhc3NlcnQoIW1lbWJlci5pc0Fic3RyYWN0LAogICAgICAgIGZhaWxlZEF0KG1lbWJlciwgIlVuZXhwZWN0ZWQgYWJzdHJhY3QgbWVtYmVyICRtZW1iZXIuIikpOwogICAgcmV0dXJuIG1lbWJlclR5cGVJbmZvcm1hdGlvbnNbbWVtYmVyXSA/Pz0gX2dldEluZmVycmVkVHlwZU9mTWVtYmVyKG1lbWJlcik7CiAgfQoKICB2b2lkIGZvckVhY2hNZW1iZXJUeXBlKAogICAgICB2b2lkIGYoTWVtYmVyRW50aXR5IG1lbWJlciwgTWVtYmVyVHlwZUluZm9ybWF0aW9uIHR5cGVJbmZvcm1hdGlvbikpIHsKICAgIG1lbWJlclR5cGVJbmZvcm1hdGlvbnMuZm9yRWFjaChmKTsKICB9CgogIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBfZ2V0SW5mZXJyZWRUeXBlT2ZNZW1iZXIoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIHR5cGVJbmZvcm1hdGlvbiA9CiAgICAgICAgc3RyYXRlZ3kuY3JlYXRlTWVtYmVyVHlwZUluZm9ybWF0aW9uKF9hYnN0cmFjdFZhbHVlRG9tYWluLCBtZW1iZXIpOwogICAgX29yZGVyZWRUeXBlSW5mb3JtYXRpb25zLmFkZCh0eXBlSW5mb3JtYXRpb24pOwogICAgcmV0dXJuIHR5cGVJbmZvcm1hdGlvbjsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBpbnRlcm5hbCBpbmZlcnJlciByZXByZXNlbnRhdGlvbiBmb3IgW21hc2tdLgogIENvbmNyZXRlVHlwZUluZm9ybWF0aW9uIGdldENvbmNyZXRlVHlwZUZvcihBYnN0cmFjdFZhbHVlIG1hc2spIHsKICAgIGFzc2VydChtYXNrICE9IG51bGwpOwogICAgcmV0dXJuIGNvbmNyZXRlVHlwZXMucHV0SWZBYnNlbnQobWFzaywgKCkgewogICAgICByZXR1cm4gbmV3IENvbmNyZXRlVHlwZUluZm9ybWF0aW9uKG1hc2spOwogICAgfSk7CiAgfQoKICBTdHJpbmcgZ2V0SW5mZXJyZWRTaWduYXR1cmVPZk1ldGhvZChGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikgewogICAgRWxlbWVudFR5cGVJbmZvcm1hdGlvbiBpbmZvID0gZ2V0SW5mZXJyZWRUeXBlT2ZNZW1iZXIoZnVuY3Rpb24pOwogICAgdmFyIHJlcyA9ICIiOwogICAgc3RyYXRlZ3kuZm9yRWFjaFBhcmFtZXRlcihmdW5jdGlvbiwgKExvY2FsIHBhcmFtZXRlcikgewogICAgICBUeXBlSW5mb3JtYXRpb24gdHlwZSA9IGdldEluZmVycmVkVHlwZU9mUGFyYW1ldGVyKHBhcmFtZXRlcik7CiAgICAgIHJlcyArPSAiJHtyZXMuaXNFbXB0eSA/ICcoJyA6ICcsICd9JHt0eXBlLnR5cGV9ICR7cGFyYW1ldGVyLm5hbWV9IjsKICAgIH0pOwogICAgcmVzICs9ICIpIC0+ICR7aW5mby50eXBlfSI7CiAgICByZXR1cm4gcmVzOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIG5vbk51bGxTdWJ0eXBlKENsYXNzRW50aXR5IGNscykgewogICAgYXNzZXJ0KHN0cmF0ZWd5LmNoZWNrQ2xhc3NFbnRpdHkoY2xzKSk7CiAgICByZXR1cm4gZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLmNyZWF0ZU5vbk51bGxTdWJ0eXBlKGNscykpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIG5vbk51bGxTdWJjbGFzcyhDbGFzc0VudGl0eSBjbHMpIHsKICAgIGFzc2VydChzdHJhdGVneS5jaGVja0NsYXNzRW50aXR5KGNscykpOwogICAgcmV0dXJuIGdldENvbmNyZXRlVHlwZUZvcihfYWJzdHJhY3RWYWx1ZURvbWFpbi5jcmVhdGVOb25OdWxsU3ViY2xhc3MoY2xzKSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gbm9uTnVsbEV4YWN0KENsYXNzRW50aXR5IGNscykgewogICAgYXNzZXJ0KHN0cmF0ZWd5LmNoZWNrQ2xhc3NFbnRpdHkoY2xzKSk7CiAgICByZXR1cm4gZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLmNyZWF0ZU5vbk51bGxFeGFjdChjbHMpKTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiBub25OdWxsRW1wdHkoKSB7CiAgICByZXR1cm4gbm9uTnVsbEVtcHR5VHlwZTsKICB9CgogIGJvb2wgaXNOdWxsKFR5cGVJbmZvcm1hdGlvbiB0eXBlKSB7CiAgICByZXR1cm4gdHlwZSA9PSBudWxsVHlwZTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiBhbGxvY2F0ZUxpc3QoCiAgICAgIFR5cGVJbmZvcm1hdGlvbiB0eXBlLCBpci5UcmVlTm9kZSBub2RlLCBNZW1iZXJFbnRpdHkgZW5jbG9zaW5nLAogICAgICBbVHlwZUluZm9ybWF0aW9uIGVsZW1lbnRUeXBlLCBpbnQgbGVuZ3RoXSkgewogICAgYXNzZXJ0KHN0cmF0ZWd5LmNoZWNrTGlzdE5vZGUobm9kZSkpOwogICAgQ2xhc3NFbnRpdHkgdHlwZWREYXRhQ2xhc3MgPSBfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMudHlwZWREYXRhQ2xhc3M7CiAgICBib29sIGlzVHlwZWRBcnJheSA9IHR5cGVkRGF0YUNsYXNzICE9IG51bGwgJiYKICAgICAgICBfY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNJbnN0YW50aWF0ZWQodHlwZWREYXRhQ2xhc3MpICYmCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAgICAgLmlzSW5zdGFuY2VPZk9yTnVsbCh0eXBlLnR5cGUsIHR5cGVkRGF0YUNsYXNzKQogICAgICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZTsKICAgIGJvb2wgaXNDb25zdCA9ICh0eXBlLnR5cGUgPT0gX2Fic3RyYWN0VmFsdWVEb21haW4uY29uc3RMaXN0VHlwZSk7CiAgICBib29sIGlzRml4ZWQgPSAodHlwZS50eXBlID09IF9hYnN0cmFjdFZhbHVlRG9tYWluLmZpeGVkTGlzdFR5cGUpIHx8CiAgICAgICAgaXNDb25zdCB8fAogICAgICAgIGlzVHlwZWRBcnJheTsKICAgIGJvb2wgaXNFbGVtZW50SW5mZXJyZWQgPSBpc0NvbnN0IHx8IGlzVHlwZWRBcnJheTsKCiAgICBpbnQgaW5mZXJyZWRMZW5ndGggPSBpc0ZpeGVkID8gbGVuZ3RoIDogbnVsbDsKICAgIEFic3RyYWN0VmFsdWUgZWxlbWVudFR5cGVNYXNrID0KICAgICAgICBpc0VsZW1lbnRJbmZlcnJlZCA/IGVsZW1lbnRUeXBlLnR5cGUgOiBkeW5hbWljVHlwZS50eXBlOwogICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gX2Fic3RyYWN0VmFsdWVEb21haW4uY3JlYXRlQ29udGFpbmVyVmFsdWUoCiAgICAgICAgdHlwZS50eXBlLCBub2RlLCBlbmNsb3NpbmcsIGVsZW1lbnRUeXBlTWFzaywgaW5mZXJyZWRMZW5ndGgpOwogICAgRWxlbWVudEluQ29udGFpbmVyVHlwZUluZm9ybWF0aW9uIGVsZW1lbnQgPQogICAgICAgIG5ldyBFbGVtZW50SW5Db250YWluZXJUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLCBjdXJyZW50TWVtYmVyLCBlbGVtZW50VHlwZSk7CiAgICBlbGVtZW50LmluZmVycmVkID0gaXNFbGVtZW50SW5mZXJyZWQ7CgogICAgYWxsb2NhdGVkVHlwZXMuYWRkKGVsZW1lbnQpOwogICAgcmV0dXJuIGFsbG9jYXRlZExpc3RzW25vZGVdID0gbmV3IExpc3RUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4sIGN1cnJlbnRNZW1iZXIsIG1hc2ssIGVsZW1lbnQsIGxlbmd0aCk7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIFtUeXBlSW5mb3JtYXRpb25dIG9iamVjdCBlaXRoZXIgZm9yIHRoZSBjbG9zdXJpemF0aW9uIG9mIGEKICAvLy8gc3RhdGljIG9yIHRvcC1sZXZlbCBtZXRob2QgW2VsZW1lbnRdIHVzZWQgYXMgYSBmdW5jdGlvbiBjb25zdGFudCBvciBmb3IKICAvLy8gdGhlIHN5bnRoZXNpemVkICdjYWxsJyBtZXRob2QgW2VsZW1lbnRdIGNyZWF0ZWQgZm9yIGEgbG9jYWwgZnVuY3Rpb24uCiAgVHlwZUluZm9ybWF0aW9uIGFsbG9jYXRlQ2xvc3VyZShGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICBUeXBlSW5mb3JtYXRpb24gcmVzdWx0ID0gbmV3IENsb3N1cmVUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4sIGN1cnJlbnRNZW1iZXIsIGVsZW1lbnQpOwogICAgYWxsb2NhdGVkQ2xvc3VyZXMuYWRkKHJlc3VsdCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGFsbG9jYXRlU2V0KAogICAgICBUeXBlSW5mb3JtYXRpb24gdHlwZSwgaXIuVHJlZU5vZGUgbm9kZSwgTWVtYmVyRW50aXR5IGVuY2xvc2luZywKICAgICAgW1R5cGVJbmZvcm1hdGlvbiBlbGVtZW50VHlwZV0pIHsKICAgIGFzc2VydChzdHJhdGVneS5jaGVja1NldE5vZGUobm9kZSkpOwogICAgYm9vbCBpc0NvbnN0ID0gdHlwZS50eXBlID09IF9hYnN0cmFjdFZhbHVlRG9tYWluLmNvbnN0U2V0VHlwZTsKCiAgICBBYnN0cmFjdFZhbHVlIGVsZW1lbnRUeXBlTWFzayA9CiAgICAgICAgaXNDb25zdCA/IGVsZW1lbnRUeXBlLnR5cGUgOiBkeW5hbWljVHlwZS50eXBlOwogICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gX2Fic3RyYWN0VmFsdWVEb21haW4uY3JlYXRlU2V0VmFsdWUoCiAgICAgICAgdHlwZS50eXBlLCBub2RlLCBlbmNsb3NpbmcsIGVsZW1lbnRUeXBlTWFzayk7CiAgICBFbGVtZW50SW5TZXRUeXBlSW5mb3JtYXRpb24gZWxlbWVudCA9IG5ldyBFbGVtZW50SW5TZXRUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4sIGN1cnJlbnRNZW1iZXIsIGVsZW1lbnRUeXBlKTsKICAgIGVsZW1lbnQuaW5mZXJyZWQgPSBpc0NvbnN0OwoKICAgIGFsbG9jYXRlZFR5cGVzLmFkZChlbGVtZW50KTsKICAgIHJldHVybiBhbGxvY2F0ZWRTZXRzW25vZGVdID0KICAgICAgICBuZXcgU2V0VHlwZUluZm9ybWF0aW9uKGN1cnJlbnRNZW1iZXIsIG1hc2ssIGVsZW1lbnQpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGFsbG9jYXRlTWFwKAogICAgICBDb25jcmV0ZVR5cGVJbmZvcm1hdGlvbiB0eXBlLCBpci5UcmVlTm9kZSBub2RlLCBNZW1iZXJFbnRpdHkgZWxlbWVudCwKICAgICAgW0xpc3Q8VHlwZUluZm9ybWF0aW9uPiBrZXlUeXBlcywgTGlzdDxUeXBlSW5mb3JtYXRpb24+IHZhbHVlVHlwZXNdKSB7CiAgICBhc3NlcnQoc3RyYXRlZ3kuY2hlY2tNYXBOb2RlKG5vZGUpKTsKICAgIGFzc2VydChrZXlUeXBlcy5sZW5ndGggPT0gdmFsdWVUeXBlcy5sZW5ndGgpOwogICAgYm9vbCBpc0ZpeGVkID0gKHR5cGUudHlwZSA9PSBfYWJzdHJhY3RWYWx1ZURvbWFpbi5jb25zdE1hcFR5cGUpOwoKICAgIFR5cGVJbmZvcm1hdGlvbiBrZXlUeXBlLCB2YWx1ZVR5cGU7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleVR5cGVzLmxlbmd0aDsgKytpKSB7CiAgICAgIFR5cGVJbmZvcm1hdGlvbiB0eXBlID0ga2V5VHlwZXNbaV07CiAgICAgIGtleVR5cGUgPSBrZXlUeXBlID09IG51bGwKICAgICAgICAgID8gYWxsb2NhdGVQaGkobnVsbCwgbnVsbCwgdHlwZSwgaXNUcnk6IGZhbHNlKQogICAgICAgICAgOiBhZGRQaGlJbnB1dChudWxsLCBrZXlUeXBlLCB0eXBlKTsKCiAgICAgIHR5cGUgPSB2YWx1ZVR5cGVzW2ldOwogICAgICB2YWx1ZVR5cGUgPSB2YWx1ZVR5cGUgPT0gbnVsbAogICAgICAgICAgPyBhbGxvY2F0ZVBoaShudWxsLCBudWxsLCB0eXBlLCBpc1RyeTogZmFsc2UpCiAgICAgICAgICA6IGFkZFBoaUlucHV0KG51bGwsIHZhbHVlVHlwZSwgdHlwZSk7CiAgICB9CgogICAga2V5VHlwZSA9CiAgICAgICAga2V5VHlwZSA9PSBudWxsID8gbm9uTnVsbEVtcHR5KCkgOiBzaW1wbGlmeVBoaShudWxsLCBudWxsLCBrZXlUeXBlKTsKICAgIHZhbHVlVHlwZSA9CiAgICAgICAgdmFsdWVUeXBlID09IG51bGwgPyBub25OdWxsRW1wdHkoKSA6IHNpbXBsaWZ5UGhpKG51bGwsIG51bGwsIHZhbHVlVHlwZSk7CgogICAgQWJzdHJhY3RWYWx1ZSBrZXlUeXBlTWFzaywgdmFsdWVUeXBlTWFzazsKICAgIGlmIChpc0ZpeGVkKSB7CiAgICAgIGtleVR5cGVNYXNrID0ga2V5VHlwZS50eXBlOwogICAgICB2YWx1ZVR5cGVNYXNrID0gdmFsdWVUeXBlLnR5cGU7CiAgICB9IGVsc2UgewogICAgICBrZXlUeXBlTWFzayA9IHZhbHVlVHlwZU1hc2sgPSBkeW5hbWljVHlwZS50eXBlOwogICAgfQogICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gX2Fic3RyYWN0VmFsdWVEb21haW4uY3JlYXRlTWFwVmFsdWUoCiAgICAgICAgdHlwZS50eXBlLCBub2RlLCBlbGVtZW50LCBrZXlUeXBlTWFzaywgdmFsdWVUeXBlTWFzayk7CgogICAgVHlwZUluZm9ybWF0aW9uIGtleVR5cGVJbmZvID0gbmV3IEtleUluTWFwVHlwZUluZm9ybWF0aW9uKAogICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLCBjdXJyZW50TWVtYmVyLCBrZXlUeXBlKTsKICAgIFR5cGVJbmZvcm1hdGlvbiB2YWx1ZVR5cGVJbmZvID0gbmV3IFZhbHVlSW5NYXBUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4sIGN1cnJlbnRNZW1iZXIsIHZhbHVlVHlwZSk7CiAgICBhbGxvY2F0ZWRUeXBlcy5hZGQoa2V5VHlwZUluZm8pOwogICAgYWxsb2NhdGVkVHlwZXMuYWRkKHZhbHVlVHlwZUluZm8pOwoKICAgIE1hcFR5cGVJbmZvcm1hdGlvbiBtYXAgPQogICAgICAgIG5ldyBNYXBUeXBlSW5mb3JtYXRpb24oY3VycmVudE1lbWJlciwgbWFzaywga2V5VHlwZUluZm8sIHZhbHVlVHlwZUluZm8pOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5VHlwZXMubGVuZ3RoOyArK2kpIHsKICAgICAgVHlwZUluZm9ybWF0aW9uIG5ld1R5cGUgPSBtYXAuYWRkRW50cnlBc3NpZ25tZW50KAogICAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4sIGtleVR5cGVzW2ldLCB2YWx1ZVR5cGVzW2ldLCB0cnVlKTsKICAgICAgaWYgKG5ld1R5cGUgIT0gbnVsbCkgYWxsb2NhdGVkVHlwZXMuYWRkKG5ld1R5cGUpOwogICAgfQoKICAgIC8vIFNob3J0Y3V0OiBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBmaXJzdCBhcHByb3hpbWF0aW9uIG9mIHRoZSBrZXkvdmFsdWUgdHlwZSwKICAgIC8vIHN0YXJ0IHByb3BhZ2F0aW5nIGl0IGVhcmx5LgogICAgaWYgKGlzRml4ZWQpIG1hcC5tYXJrQXNJbmZlcnJlZCgpOwoKICAgIGFsbG9jYXRlZE1hcHNbbm9kZV0gPSBtYXA7CiAgICByZXR1cm4gbWFwOwogIH0KCiAgQWJzdHJhY3RWYWx1ZSBuZXdUeXBlZFNlbGVjdG9yKFR5cGVJbmZvcm1hdGlvbiBpbmZvLCBBYnN0cmFjdFZhbHVlIG1hc2spIHsKICAgIC8vIE9ubHkgdHlwZSB0aGUgc2VsZWN0b3IgaWYgW2luZm9dIGlzIGNvbmNyZXRlLCBiZWNhdXNlIHRoZSBvdGhlcgogICAgLy8ga2luZHMgb2YgW1R5cGVJbmZvcm1hdGlvbl0gaGF2ZSB0aGUgZW1wdHkgdHlwZSBhdCB0aGlzIHBvaW50IG9mCiAgICAvLyBhbmFseXNpcy4KICAgIHJldHVybiBpbmZvLmlzQ29uY3JldGUgPyBpbmZvLnR5cGUgOiBtYXNrOwogIH0KCiAgLy8vIFJldHVybnMgYSBuZXcgdHlwZSB0aGF0IHVuaW9ucyBbZmlyc3RJbnB1dF0gYW5kIFtzZWNvbmRJbnB1dF0uCiAgVHlwZUluZm9ybWF0aW9uIGFsbG9jYXRlRGlhbW9uZFBoaSgKICAgICAgVHlwZUluZm9ybWF0aW9uIGZpcnN0SW5wdXQsIFR5cGVJbmZvcm1hdGlvbiBzZWNvbmRJbnB1dCkgewogICAgUGhpRWxlbWVudFR5cGVJbmZvcm1hdGlvbiByZXN1bHQgPSBuZXcgUGhpRWxlbWVudFR5cGVJbmZvcm1hdGlvbigKICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbiwgY3VycmVudE1lbWJlciwgbnVsbCwgbnVsbCwKICAgICAgICBpc1RyeTogZmFsc2UpOwogICAgcmVzdWx0LmFkZEFzc2lnbm1lbnQoZmlyc3RJbnB1dCk7CiAgICByZXN1bHQuYWRkQXNzaWdubWVudChzZWNvbmRJbnB1dCk7CiAgICBhbGxvY2F0ZWRUeXBlcy5hZGQocmVzdWx0KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBQaGlFbGVtZW50VHlwZUluZm9ybWF0aW9uIF9hZGRQaGkoCiAgICAgIGlyLk5vZGUgbm9kZSwgTG9jYWwgdmFyaWFibGUsIFR5cGVJbmZvcm1hdGlvbiBpbnB1dFR5cGUsIGJvb2wgaXNUcnkpIHsKICAgIFBoaUVsZW1lbnRUeXBlSW5mb3JtYXRpb24gcmVzdWx0ID0gbmV3IFBoaUVsZW1lbnRUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4sIGN1cnJlbnRNZW1iZXIsIG5vZGUsIHZhcmlhYmxlLAogICAgICAgIGlzVHJ5OiBpc1RyeSk7CiAgICBhbGxvY2F0ZWRUeXBlcy5hZGQocmVzdWx0KTsKICAgIHJlc3VsdC5hZGRBc3NpZ25tZW50KGlucHV0VHlwZSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIFJldHVybnMgYSBuZXcgdHlwZSBmb3IgaG9sZGluZyB0aGUgcG90ZW50aWFsIHR5cGVzIG9mIFtlbGVtZW50XS4KICAvLy8gW2lucHV0VHlwZV0gaXMgdGhlIGZpcnN0IGluY29taW5nIHR5cGUgb2YgdGhlIHBoaS4KICBQaGlFbGVtZW50VHlwZUluZm9ybWF0aW9uIGFsbG9jYXRlUGhpKAogICAgICBpci5Ob2RlIG5vZGUsIExvY2FsIHZhcmlhYmxlLCBUeXBlSW5mb3JtYXRpb24gaW5wdXRUeXBlLAogICAgICB7Ym9vbCBpc1RyeX0pIHsKICAgIGFzc2VydChzdHJhdGVneS5jaGVja1BoaU5vZGUobm9kZSkpOwogICAgLy8gQ2hlY2sgaWYgW2lucHV0VHlwZV0gaXMgYSBwaGkgZm9yIGEgbG9jYWwgdXBkYXRlZCBpbgogICAgLy8gdGhlIHRyeS9jYXRjaCBibG9jayBbbm9kZV0uIElmIGl0IGlzLCBubyBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3CiAgICAvLyBwaGkuCiAgICBpZiAoaW5wdXRUeXBlIGlzIFBoaUVsZW1lbnRUeXBlSW5mb3JtYXRpb24gJiYKICAgICAgICBpbnB1dFR5cGUuYnJhbmNoTm9kZSA9PSBub2RlICYmCiAgICAgICAgaW5wdXRUeXBlLmlzVHJ5KSB7CiAgICAgIHJldHVybiBpbnB1dFR5cGU7CiAgICB9CiAgICByZXR1cm4gX2FkZFBoaShub2RlLCB2YXJpYWJsZSwgaW5wdXRUeXBlLCBpc1RyeSk7CiAgfQoKICAvLy8gUmV0dXJucyBhIG5ldyB0eXBlIGZvciBob2xkaW5nIHRoZSBwb3RlbnRpYWwgdHlwZXMgb2YgW2VsZW1lbnRdLgogIC8vLyBbaW5wdXRUeXBlXSBpcyB0aGUgZmlyc3QgaW5jb21pbmcgdHlwZSBvZiB0aGUgcGhpLiBbYWxsb2NhdGVMb29wUGhpXQogIC8vLyBvbmx5IGRpZmZlcnMgZnJvbSBbYWxsb2NhdGVQaGldIGluIHRoYXQgaXQgYWxsb3dzIHRoZSB1bmRlcmx5aW5nCiAgLy8vIGltcGxlbWVudGF0aW9uIG9mIFtUeXBlU3lzdGVtXSB0byBkaWZmZXJlbnRpYXRlIFBoaSBub2RlcyBkdWUgdG8gbG9vcHMKICAvLy8gZnJvbSBvdGhlciBtZXJnaW5nIHVzZXMuCiAgUGhpRWxlbWVudFR5cGVJbmZvcm1hdGlvbiBhbGxvY2F0ZUxvb3BQaGkoCiAgICAgIGlyLk5vZGUgbm9kZSwgTG9jYWwgdmFyaWFibGUsIFR5cGVJbmZvcm1hdGlvbiBpbnB1dFR5cGUsCiAgICAgIHtib29sIGlzVHJ5fSkgewogICAgYXNzZXJ0KHN0cmF0ZWd5LmNoZWNrTG9vcFBoaU5vZGUobm9kZSkpOwogICAgcmV0dXJuIF9hZGRQaGkobm9kZSwgdmFyaWFibGUsIGlucHV0VHlwZSwgaXNUcnkpOwogIH0KCiAgLy8vIFNpbXBsaWVzIHRoZSBwaGkgcmVwcmVzZW50aW5nIFtlbGVtZW50XSBhbmQgb2YgdGhlIHR5cGUKICAvLy8gW3BoaVR5cGVdLiBGb3IgZXhhbXBsZSwgaWYgdGhpcyBwaGkgaGFzIG9uZSBpbmNvbWluZyBpbnB1dCwgYW4KICAvLy8gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgY291bGQganVzdCByZXR1cm4gdGhhdCBpbmNvbWluZwogIC8vLyBpbnB1dCB0eXBlLgogIFR5cGVJbmZvcm1hdGlvbiBzaW1wbGlmeVBoaSgKICAgICAgaXIuTm9kZSBub2RlLCBMb2NhbCB2YXJpYWJsZSwgUGhpRWxlbWVudFR5cGVJbmZvcm1hdGlvbiBwaGlUeXBlKSB7CiAgICBhc3NlcnQocGhpVHlwZS5icmFuY2hOb2RlID09IG5vZGUpOwogICAgaWYgKHBoaVR5cGUuYXNzaWdubWVudHMubGVuZ3RoID09IDEpIHJldHVybiBwaGlUeXBlLmFzc2lnbm1lbnRzLmZpcnN0OwogICAgcmV0dXJuIHBoaVR5cGU7CiAgfQoKICAvLy8gQWRkcyBbbmV3VHlwZV0gYXMgYW4gaW5wdXQgb2YgW3BoaVR5cGVdLgogIFBoaUVsZW1lbnRUeXBlSW5mb3JtYXRpb24gYWRkUGhpSW5wdXQoTG9jYWwgdmFyaWFibGUsCiAgICAgIFBoaUVsZW1lbnRUeXBlSW5mb3JtYXRpb24gcGhpVHlwZSwgVHlwZUluZm9ybWF0aW9uIG5ld1R5cGUpIHsKICAgIHBoaVR5cGUuYWRkQXNzaWdubWVudChuZXdUeXBlKTsKICAgIHJldHVybiBwaGlUeXBlOwogIH0KCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlVHlwZU1hc2soSXRlcmFibGU8VHlwZUluZm9ybWF0aW9uPiBhc3NpZ25tZW50cykgewogICAgcmV0dXJuIGpvaW5UeXBlTWFza3MoYXNzaWdubWVudHMubWFwKChlKSA9PiBlLnR5cGUpKTsKICB9CgogIEFic3RyYWN0VmFsdWUgam9pblR5cGVNYXNrcyhJdGVyYWJsZTxBYnN0cmFjdFZhbHVlPiBtYXNrcykgewogICAgdmFyIGR5bmFtaWNUeXBlID0gX2Fic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGU7CiAgICAvLyBPcHRpbWl6YXRpb246IHdlIGFyZSBpdGVyYXRpbmcgb3ZlciBtYXNrcyB0d2ljZSwgYnV0IGJlY2F1c2UgYG1hc2tzYCBpcyBhCiAgICAvLyBtYXBwZWQgaXRlcmFibGUsIHdlIHNhdmUgdGhlIGludGVybWVkaWF0ZSByZXN1bHRzIHRvIGF2b2lkIGNvbXB1dGluZyB0aGVtCiAgICAvLyBhZ2Fpbi4KICAgIHZhciBsaXN0ID0gW107CiAgICBib29sIGlzRHluYW1pY0luZ29yaW5nTnVsbCA9IGZhbHNlOwogICAgYm9vbCBtYXlCZU51bGwgPSBmYWxzZTsKICAgIGZvciAoQWJzdHJhY3RWYWx1ZSBtYXNrIGluIG1hc2tzKSB7CiAgICAgIC8vIERvbid0IGRvIGFueSB3b3JrIG9uIGNvbXB1dGluZyB1bmlvbnMgaWYgd2Uga25vdyB0aGF0IGFmdGVyIGFsbCB0aGF0CiAgICAgIC8vIHdvcmsgdGhlIHJlc3VsdCB3aWxsIGJlIGBkeW5hbWljYC4KICAgICAgLy8gVE9ETyhzaWdtdW5kKTogY2hhbmdlIHRvIGBtYXNrID09IGR5bmFtaWNUeXBlYCBzbyB3ZSBjYW4gY29udGludWUgdG8KICAgICAgLy8gdHJhY2sgdGhlIG5vbi1udWxsYWJsZSBiaXQuCiAgICAgIGlmIChfYWJzdHJhY3RWYWx1ZURvbWFpbi5jb250YWluc0FsbChtYXNrKS5pc1BvdGVudGlhbGx5VHJ1ZSkgewogICAgICAgIGlzRHluYW1pY0luZ29yaW5nTnVsbCA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzTnVsbChtYXNrKS5pc1BvdGVudGlhbGx5VHJ1ZSkgewogICAgICAgIG1heUJlTnVsbCA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKGlzRHluYW1pY0luZ29yaW5nTnVsbCAmJiBtYXlCZU51bGwpIHJldHVybiBkeW5hbWljVHlwZTsKICAgICAgbGlzdC5hZGQobWFzayk7CiAgICB9CgogICAgQWJzdHJhY3RWYWx1ZSBuZXdUeXBlID0gbnVsbDsKICAgIGZvciAoQWJzdHJhY3RWYWx1ZSBtYXNrIGluIGxpc3QpIHsKICAgICAgbmV3VHlwZSA9CiAgICAgICAgICBuZXdUeXBlID09IG51bGwgPyBtYXNrIDogX2Fic3RyYWN0VmFsdWVEb21haW4udW5pb24obmV3VHlwZSwgbWFzayk7CiAgICAgIC8vIExpa2V3aXNlIC0gc3RvcCBlYXJseSBpZiB3ZSBhbHJlYWR5IHJlYWNoIGR5bmFtaWMuCiAgICAgIGlmIChfYWJzdHJhY3RWYWx1ZURvbWFpbi5jb250YWluc0FsbChuZXdUeXBlKS5pc1BvdGVudGlhbGx5VHJ1ZSkgewogICAgICAgIGlzRHluYW1pY0luZ29yaW5nTnVsbCA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzTnVsbChuZXdUeXBlKS5pc1BvdGVudGlhbGx5VHJ1ZSkgewogICAgICAgIG1heUJlTnVsbCA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKGlzRHluYW1pY0luZ29yaW5nTnVsbCAmJiBtYXlCZU51bGwpIHJldHVybiBkeW5hbWljVHlwZTsKICAgIH0KCiAgICByZXR1cm4gbmV3VHlwZSA/PyBfYWJzdHJhY3RWYWx1ZURvbWFpbi5lbXB0eVR5cGU7CiAgfQp9CoKhAE5OPAEoGSQhGCUgAVAbJDQ1RQE6Oy8XGQEySwE9IwE6JwFBJAFAIwFAIwFAKgIBRhMjJQFKRU4BMkkyASxKNgExPzMBLz0yAS86LwEqTQEqPDEBQTcjAUwdRAFKRTsgAS4qJx8eHhseGBcaATFLBAEyKAFQEC89ATkjTzcOGwQBISE1TgQBICAzTAQBIyM5HT0EASMjOR09BAEoKEMiQgQBIyM5HT0EASAgM0wEASEhNU4EASUlPR8/BAEhITVOBAEmJj8gQAQBJiY/IEAEASkpRSNDBAEgIUkBJTw9ASAgM0wEASUlPR8/BAEjIzkdPQQBISE1TgQBJCQ7Hj4EASgyKEMiQgQBLS1NJ0cEASwsSyZGBAEkATQtRwQBMCtFBAE8FB4/LjM6OkEaBh9GBAFIFkceBAExJ0oBQEMMSCEdKCUjTCsvRi0sSiUxSA8USghEJSg9Ew0pKxMGFj8GTx5KIRQEAUlBMTM2NR4IBAEdSyoEAUcfQlAEARpMJwQBSCxMMxwEAT9DGjAwCAQBQUUSPERKCCAQBAE0LE8EATUsUAQBMixNBAEjHQQBJh0EASBGMypNMkYdOx9GSBMWNgEyJEFERjAvPyoBITtFBAFLTkw8OTcjEwQBH0YnKUMBJDc+Nks7IAEhIT4EAR9MTCkyRQEoMCogOC4BHCQ4MAYBDk0QUQEuEyImDTYGPj8BPzdDOSUnAR1RATA4QzgGAVEjJwEfEAQBTUdHES8EAUUmQUY5FyYnIBMEASVNRj0XICUTBAFHOSk/Fik8RwwyKBsYBjYEAUdLR00fLT8WLTYEAT5FRBIfSShLFAQBLzhEJBQEAUk6BAE/OFFRDhMoHChOLE4lRiYIQRoIQhYGASInEE48SSYIRBoIQgYBNgQCAS5wYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci90eXBlX3N5c3RlbS5kYXJ0TXNka3Jvb3Q6L3Nkay9saWIvX2ludGVybmFsL2pzX3J1bnRpbWUvbGliL3NoYXJlZC9hc3luY19hd2FpdF9lcnJvcl9jb2Rlcy5kYXJ0gZsvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIENvbnRhaW5zIGVycm9yIGNvZGVzIHRoYXQgdHJhbnNmb3JtZWQgYXN5bmMvYXN5bmMqIGZ1bmN0aW9ucyB1c2UgdG8KLy8vIGNvbW11bmljYXRlIHdpdGgganNfaGVscGVyIGZ1bmN0aW9ucy4KCmNvbnN0IGludCBTVUNDRVNTID0gMDsKY29uc3QgaW50IEVSUk9SID0gMTsKY29uc3QgaW50IFNUUkVBTV9XQVNfQ0FOQ0VMRUQgPSAyOwoMAE5OPAFIKgEXFSMBNnBhY2thZ2U6anNfcnVudGltZS9zaGFyZWQvYXN5bmNfYXdhaXRfZXJyb3JfY29kZXMuZGFydEJzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19lbWl0dGVyL2NsYXNzX3N0dWJfZ2VuZXJhdG9yLmRhcnS5TC8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuanNfZW1pdHRlci5jbGFzc19zdHViX2dlbmVyYXRvcjsKCmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnIHNob3cgSWRlbnRpZmllcnMsIFNlbGVjdG9yczsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCcgc2hvdyBDb21tb25FbGVtZW50czsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBhcyBqc0FzdDsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBzaG93IGpzOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvZmllbGRfYW5hbHlzaXMuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9uYW1lci5kYXJ0JyBzaG93IE5hbWVyOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvaW50ZXJjZXB0b3JfZGF0YS5kYXJ0JyBzaG93IEludGVyY2VwdG9yRGF0YTsKaW1wb3J0ICcuLi9vcHRpb25zLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NvZGVnZW5fd29ybGRfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9zZWxlY3Rvci5kYXJ0JyBzaG93IFNlbGVjdG9yOwppbXBvcnQgJy4uL3VuaXZlcnNlL3dvcmxkX2J1aWxkZXIuZGFydCcgc2hvdyBTZWxlY3RvckNvbnN0cmFpbnRzOwppbXBvcnQgJy4uL3dvcmxkLmRhcnQnIHNob3cgSkNsb3NlZFdvcmxkOwoKaW1wb3J0ICdjb2RlX2VtaXR0ZXJfdGFzay5kYXJ0JzsKaW1wb3J0ICdtb2RlbC5kYXJ0JzsKCmNsYXNzIENsYXNzU3R1YkdlbmVyYXRvciB7CiAgZmluYWwgTmFtZXIgX25hbWVyOwogIGZpbmFsIENvZGVnZW5Xb3JsZEJ1aWxkZXIgX3dvcmxkQnVpbGRlcjsKICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwogIGZpbmFsIGJvb2wgZW5hYmxlTWluaWZpY2F0aW9uOwogIGZpbmFsIEVtaXR0ZXIgX2VtaXR0ZXI7CiAgZmluYWwgQ29tbW9uRWxlbWVudHMgX2NvbW1vbkVsZW1lbnRzOwoKICBDbGFzc1N0dWJHZW5lcmF0b3IodGhpcy5fZW1pdHRlciwgdGhpcy5fY29tbW9uRWxlbWVudHMsIHRoaXMuX25hbWVyLAogICAgICB0aGlzLl93b3JsZEJ1aWxkZXIsIHRoaXMuX2Nsb3NlZFdvcmxkLAogICAgICB7dGhpcy5lbmFibGVNaW5pZmljYXRpb259KTsKCiAgSW50ZXJjZXB0b3JEYXRhIGdldCBfaW50ZXJjZXB0b3JEYXRhID0+IF9jbG9zZWRXb3JsZC5pbnRlcmNlcHRvckRhdGE7CgogIGpzQXN0LkV4cHJlc3Npb24gZ2VuZXJhdGVDbGFzc0NvbnN0cnVjdG9yKAogICAgICBDbGFzc0VudGl0eSBjbGFzc0VsZW1lbnQsIExpc3Q8anNBc3QuTmFtZT4gZmllbGRzLCBib29sIGhhc1J0aUZpZWxkKSB7CiAgICAvLyBUT0RPKHNyYSk6IEltcGxlbWVudCBwbGFjZWhvbGRlcnMgaW4gVmFyaWFibGVEZWNsYXJhdGlvbiBwb3NpdGlvbjoKICAgIC8vCiAgICAvLyAgICAgU3RyaW5nIGNvbnN0cnVjdG9yTmFtZSA9IG5hbWVyLmdldE5hbWVPZkNsYXNzKGNsYXNzRWxlbWVudCk7CiAgICAvLyAgICAgcmV0dXJuIGpzLnN0YXRlbWVudCgnZnVuY3Rpb24gIygjKSB7ICM7IH0nLAogICAgLy8gICAgICAgIFsgY29uc3RydWN0b3JOYW1lLCBmaWVsZHMsCiAgICAvLyAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAvLyAgICAgICAgICAgICAgICAobmFtZSkgPT4ganMoJ3RoaXMuIyA9ICMnLCBbbmFtZSwgbmFtZV0pKV0pKTsKICAgIGR5bmFtaWMgdHlwZVBhcmFtZXRlcnMgPSBjb25zdCA8anNBc3QuUGFyYW1ldGVyPltdOwogICAgZHluYW1pYyB0eXBlSW5pdHMgPSBjb25zdCA8anNBc3QuRXhwcmVzc2lvbj5bXTsKICAgIGlmIChoYXNSdGlGaWVsZCkgewogICAgICBkeW5hbWljIHJ0aU5hbWUgPSBfbmFtZXIucnRpRmllbGRKc05hbWU7CiAgICAgIHR5cGVQYXJhbWV0ZXJzID0gcnRpTmFtZTsKICAgICAgdHlwZUluaXRzID0ganMoJ3RoaXMuIyA9ICMnLCBbcnRpTmFtZSwgcnRpTmFtZV0pOwogICAgfQogICAgTGlzdDxqc0FzdC5QYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBuZXcgTGlzdDxqc0FzdC5QYXJhbWV0ZXI+LmdlbmVyYXRlKAogICAgICAgIGZpZWxkcy5sZW5ndGgsIChpKSA9PiBuZXcganNBc3QuUGFyYW1ldGVyKCd0JGknKSk7CiAgICBMaXN0PGpzQXN0LkV4cHJlc3Npb24+IGZpZWxkSW5pdGlhbGl6ZXJzID0KICAgICAgICBuZXcgTGlzdDxqc0FzdC5FeHByZXNzaW9uPi5nZW5lcmF0ZShmaWVsZHMubGVuZ3RoLCAoaSkgewogICAgICByZXR1cm4ganMoJ3RoaXMuIyA9ICMnLCBbZmllbGRzW2ldLCBwYXJhbWV0ZXJzW2ldXSk7CiAgICB9KTsKICAgIHJldHVybiBqcygnZnVuY3Rpb24oIywgIykgeyAjOyAjOyB0aGlzLiMoKTt9JywgWwogICAgICBwYXJhbWV0ZXJzLAogICAgICB0eXBlUGFyYW1ldGVycywKICAgICAgZmllbGRJbml0aWFsaXplcnMsCiAgICAgIHR5cGVJbml0cywKICAgICAgX25hbWVyLmRlZmVycmVkQWN0aW9uCiAgICBdKTsKICB9CgogIGpzQXN0LkV4cHJlc3Npb24gZ2VuZXJhdGVHZXR0ZXIoTWVtYmVyRW50aXR5IG1lbWJlciwganNBc3QuTmFtZSBmaWVsZE5hbWUpIHsKICAgIENsYXNzRW50aXR5IGNscyA9IG1lbWJlci5lbmNsb3NpbmdDbGFzczsKICAgIFN0cmluZyByZWNlaXZlciA9CiAgICAgICAgX2ludGVyY2VwdG9yRGF0YS5pc0ludGVyY2VwdGVkQ2xhc3MoY2xzKSA/ICdyZWNlaXZlcicgOiAndGhpcyc7CiAgICBMaXN0PFN0cmluZz4gYXJncyA9CiAgICAgICAgX2ludGVyY2VwdG9yRGF0YS5pc0ludGVyY2VwdGVkTWV0aG9kKG1lbWJlcikgPyBbJ3JlY2VpdmVyJ10gOiBbXTsKICAgIHJldHVybiBqcygnZnVuY3Rpb24oIykgeyByZXR1cm4gIy4jIH0nLCBbYXJncywgcmVjZWl2ZXIsIGZpZWxkTmFtZV0pOwogIH0KCiAganNBc3QuRXhwcmVzc2lvbiBnZW5lcmF0ZVNldHRlcihNZW1iZXJFbnRpdHkgbWVtYmVyLCBqc0FzdC5OYW1lIGZpZWxkTmFtZSkgewogICAgQ2xhc3NFbnRpdHkgY2xzID0gbWVtYmVyLmVuY2xvc2luZ0NsYXNzOwogICAgU3RyaW5nIHJlY2VpdmVyID0KICAgICAgICBfaW50ZXJjZXB0b3JEYXRhLmlzSW50ZXJjZXB0ZWRDbGFzcyhjbHMpID8gJ3JlY2VpdmVyJyA6ICd0aGlzJzsKICAgIExpc3Q8U3RyaW5nPiBhcmdzID0KICAgICAgICBfaW50ZXJjZXB0b3JEYXRhLmlzSW50ZXJjZXB0ZWRNZXRob2QobWVtYmVyKSA/IFsncmVjZWl2ZXInXSA6IFtdOwogICAgLy8gVE9ETyhmbG9pdHNjaCk6IHJlbW92ZSAncmV0dXJuJz8KICAgIHJldHVybiBqcygKICAgICAgICAnZnVuY3Rpb24oIywgdikgeyByZXR1cm4gIy4jID0gdjsgfScsIFthcmdzLCByZWNlaXZlciwgZmllbGROYW1lXSk7CiAgfQoKICAvLy8gRG9jdW1lbnRhdGlvbiB3YW50ZWQgLS0gam9obm5pd2ludGhlcgogIC8vLwogIC8vLyBJbnZhcmlhbnQ6IFttZW1iZXJdIG11c3QgYmUgYSBkZWNsYXJhdGlvbiBlbGVtZW50LgogIE1hcDxqc0FzdC5OYW1lLCBqc0FzdC5FeHByZXNzaW9uPiBnZW5lcmF0ZUNhbGxTdHVic0ZvckdldHRlcigKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciwgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPiBzZWxlY3RvcnMpIHsKICAgIC8vIElmIHRoZSBtZXRob2QgaXMgaW50ZXJjZXB0ZWQsIHRoZSBzdHViIGdldHMgdGhlCiAgICAvLyByZWNlaXZlciBleHBsaWNpdGx5IGFuZCB3ZSBuZWVkIHRvIHBhc3MgaXQgdG8gdGhlIGdldHRlciBjYWxsLgogICAgYm9vbCBpc0ludGVyY2VwdGVkTWV0aG9kID0gX2ludGVyY2VwdG9yRGF0YS5pc0ludGVyY2VwdGVkTWV0aG9kKG1lbWJlcik7CiAgICBib29sIGlzSW50ZXJjZXB0ZWRDbGFzcyA9CiAgICAgICAgX2ludGVyY2VwdG9yRGF0YS5pc0ludGVyY2VwdGVkQ2xhc3MobWVtYmVyLmVuY2xvc2luZ0NsYXNzKTsKCiAgICBjb25zdCBTdHJpbmcgcmVjZWl2ZXJBcmd1bWVudE5hbWUgPSByJyRyZWNlaXZlcic7CgogICAganNBc3QuRXhwcmVzc2lvbiBidWlsZEdldHRlcigpIHsKICAgICAganNBc3QuRXhwcmVzc2lvbiByZWNlaXZlciA9CiAgICAgICAgICBqcyhpc0ludGVyY2VwdGVkQ2xhc3MgPyByZWNlaXZlckFyZ3VtZW50TmFtZSA6ICd0aGlzJyk7CiAgICAgIGlmIChtZW1iZXIuaXNHZXR0ZXIpIHsKICAgICAgICBqc0FzdC5OYW1lIGdldHRlck5hbWUgPSBfbmFtZXIuZ2V0dGVyRm9yRWxlbWVudChtZW1iZXIpOwogICAgICAgIGlmIChpc0ludGVyY2VwdGVkTWV0aG9kKSB7CiAgICAgICAgICByZXR1cm4ganMoJ3RoaXMuIygjKScsIFtnZXR0ZXJOYW1lLCByZWNlaXZlcl0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4ganMoJyMuIygpJywgW3JlY2VpdmVyLCBnZXR0ZXJOYW1lXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgRmllbGRBbmFseXNpc0RhdGEgZmllbGREYXRhID0KICAgICAgICAgICAgX2Nsb3NlZFdvcmxkLmZpZWxkQW5hbHlzaXMuZ2V0RmllbGREYXRhKG1lbWJlcik7CiAgICAgICAgaWYgKGZpZWxkRGF0YS5pc0VmZmVjdGl2ZWx5Q29uc3RhbnQpIHsKICAgICAgICAgIHJldHVybiBfZW1pdHRlci5jb25zdGFudFJlZmVyZW5jZShmaWVsZERhdGEuY29uc3RhbnRWYWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGpzQXN0Lk5hbWUgZmllbGROYW1lID0gX25hbWVyLmluc3RhbmNlRmllbGRQcm9wZXJ0eU5hbWUobWVtYmVyKTsKICAgICAgICAgIHJldHVybiBqcygnIy4jJywgW3JlY2VpdmVyLCBmaWVsZE5hbWVdKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBNYXA8anNBc3QuTmFtZSwganNBc3QuRXhwcmVzc2lvbj4gZ2VuZXJhdGVkU3R1YnMgPQogICAgICAgIDxqc0FzdC5OYW1lLCBqc0FzdC5FeHByZXNzaW9uPnt9OwoKICAgIC8vIFR3byBzZWxlY3RvcnMgbWF5IG1hdGNoIGJ1dCBkaWZmZXIgb25seSBpbiB0eXBlLiAgVG8gYXZvaWQgZ2VuZXJhdGluZwogICAgLy8gaWRlbnRpY2FsIHN0dWJzIGZvciBlYWNoIHdlIHRyYWNrIHVudHlwZWQgc2VsZWN0b3JzIHdoaWNoIGFscmVhZHkgaGF2ZQogICAgLy8gc3R1YnMuCiAgICBTZXQ8U2VsZWN0b3I+IGdlbmVyYXRlZFNlbGVjdG9ycyA9IG5ldyBTZXQ8U2VsZWN0b3I+KCk7CiAgICBmb3IgKFNlbGVjdG9yIHNlbGVjdG9yIGluIHNlbGVjdG9ycy5rZXlzKSB7CiAgICAgIGlmIChnZW5lcmF0ZWRTZWxlY3RvcnMuY29udGFpbnMoc2VsZWN0b3IpKSBjb250aW51ZTsKICAgICAgaWYgKCFzZWxlY3Rvci5hcHBsaWVzVW5uYW1lZChtZW1iZXIpKSBjb250aW51ZTsKICAgICAgaWYgKHNlbGVjdG9yc1tzZWxlY3Rvcl0KICAgICAgICAgIC5jYW5IaXQobWVtYmVyLCBzZWxlY3Rvci5tZW1iZXJOYW1lLCBfY2xvc2VkV29ybGQpKSB7CiAgICAgICAgZ2VuZXJhdGVkU2VsZWN0b3JzLmFkZChzZWxlY3Rvcik7CgogICAgICAgIGpzQXN0Lk5hbWUgaW52b2NhdGlvbk5hbWUgPSBfbmFtZXIuaW52b2NhdGlvbk5hbWUoc2VsZWN0b3IpOwogICAgICAgIFNlbGVjdG9yIGNhbGxTZWxlY3RvciA9IG5ldyBTZWxlY3Rvci5jYWxsQ2xvc3VyZUZyb20oc2VsZWN0b3IpOwogICAgICAgIGpzQXN0Lk5hbWUgY2xvc3VyZUNhbGxOYW1lID0gX25hbWVyLmludm9jYXRpb25OYW1lKGNhbGxTZWxlY3Rvcik7CgogICAgICAgIExpc3Q8anNBc3QuUGFyYW1ldGVyPiBwYXJhbWV0ZXJzID0gPGpzQXN0LlBhcmFtZXRlcj5bXTsKICAgICAgICBMaXN0PGpzQXN0LkV4cHJlc3Npb24+IGFyZ3VtZW50cyA9IDxqc0FzdC5FeHByZXNzaW9uPltdOwogICAgICAgIGlmIChpc0ludGVyY2VwdGVkTWV0aG9kKSB7CiAgICAgICAgICBwYXJhbWV0ZXJzLmFkZChuZXcganNBc3QuUGFyYW1ldGVyKHJlY2VpdmVyQXJndW1lbnROYW1lKSk7CiAgICAgICAgfQoKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdG9yLmFyZ3VtZW50Q291bnQ7IGkrKykgewogICAgICAgICAgU3RyaW5nIG5hbWUgPSAnYXJnJGknOwogICAgICAgICAgcGFyYW1ldGVycy5hZGQobmV3IGpzQXN0LlBhcmFtZXRlcihuYW1lKSk7CiAgICAgICAgICBhcmd1bWVudHMuYWRkKGpzKCcjJywgbmFtZSkpOwogICAgICAgIH0KCiAgICAgICAganNBc3QuRnVuIGZ1bmN0aW9uID0ganMoJ2Z1bmN0aW9uKCMpIHsgcmV0dXJuICMuIygjKTsgfScsCiAgICAgICAgICAgIFtwYXJhbWV0ZXJzLCBidWlsZEdldHRlcigpLCBjbG9zdXJlQ2FsbE5hbWUsIGFyZ3VtZW50c10pOwoKICAgICAgICBnZW5lcmF0ZWRTdHVic1tpbnZvY2F0aW9uTmFtZV0gPSBmdW5jdGlvbjsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBnZW5lcmF0ZWRTdHViczsKICB9CgogIE1hcDxqc0FzdC5OYW1lLCBTZWxlY3Rvcj4gY29tcHV0ZVNlbGVjdG9yc0Zvck5zbUhhbmRsZXJzKCkgewogICAgTWFwPGpzQXN0Lk5hbWUsIFNlbGVjdG9yPiBqc05hbWVzID0gPGpzQXN0Lk5hbWUsIFNlbGVjdG9yPnt9OwoKICAgIC8vIERvIG5vdCBnZW5lcmF0ZSBubyBzdWNoIG1ldGhvZCBoYW5kbGVycyBpZiB0aGVyZSBpcyBubyBjbGFzcy4KICAgIGlmIChfd29ybGRCdWlsZGVyLmRpcmVjdGx5SW5zdGFudGlhdGVkQ2xhc3Nlcy5pc0VtcHR5KSB7CiAgICAgIHJldHVybiBqc05hbWVzOwogICAgfQoKICAgIHZvaWQgYWRkTm9TdWNoTWV0aG9kSGFuZGxlcnMoCiAgICAgICAgU3RyaW5nIGlnbm9yZSwgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPiBzZWxlY3RvcnMpIHsKICAgICAgZm9yIChTZWxlY3RvciBzZWxlY3RvciBpbiBzZWxlY3RvcnMua2V5cykgewogICAgICAgIGlmIChzZWxlY3RvciA9PSBTZWxlY3RvcnMucnVudGltZVR5cGVfIHx8CiAgICAgICAgICAgIHNlbGVjdG9yID09IFNlbGVjdG9ycy5lcXVhbHMgfHwKICAgICAgICAgICAgc2VsZWN0b3IgPT0gU2VsZWN0b3JzLnRvU3RyaW5nXyB8fAogICAgICAgICAgICBzZWxlY3RvciA9PSBTZWxlY3RvcnMuaGFzaENvZGVfIHx8CiAgICAgICAgICAgIHNlbGVjdG9yID09IFNlbGVjdG9ycy5ub1N1Y2hNZXRob2RfKSB7CiAgICAgICAgICAvLyBTa2lwIE9iamVjdCBtZXRob2RzIHNpbmNlIHRoZXNlIG5lZWQgbm8gbm9TdWNoTWV0aG9kIGhhbmRsaW5nCiAgICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHRoZSBwcmVjaXNpb24gb2YgdGhlIHNlbGVjdG9yIGNvbnN0cmFpbnRzLgogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBTZWxlY3RvckNvbnN0cmFpbnRzIG1hc2tTZXQgPSBzZWxlY3RvcnNbc2VsZWN0b3JdOwogICAgICAgIGlmIChtYXNrU2V0Lm5lZWRzTm9TdWNoTWV0aG9kSGFuZGxpbmcoc2VsZWN0b3IsIF9jbG9zZWRXb3JsZCkpIHsKICAgICAgICAgIGpzQXN0Lk5hbWUganNOYW1lID0gX25hbWVyLmludm9jYXRpb25NaXJyb3JJbnRlcm5hbE5hbWUoc2VsZWN0b3IpOwogICAgICAgICAganNOYW1lc1tqc05hbWVdID0gc2VsZWN0b3I7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgX3dvcmxkQnVpbGRlci5mb3JFYWNoSW52b2tlZE5hbWUoYWRkTm9TdWNoTWV0aG9kSGFuZGxlcnMpOwogICAgX3dvcmxkQnVpbGRlci5mb3JFYWNoSW52b2tlZEdldHRlcihhZGROb1N1Y2hNZXRob2RIYW5kbGVycyk7CiAgICBfd29ybGRCdWlsZGVyLmZvckVhY2hJbnZva2VkU2V0dGVyKGFkZE5vU3VjaE1ldGhvZEhhbmRsZXJzKTsKICAgIHJldHVybiBqc05hbWVzOwogIH0KCiAgU3R1Yk1ldGhvZCBnZW5lcmF0ZVN0dWJGb3JOb1N1Y2hNZXRob2QoanNBc3QuTmFtZSBuYW1lLCBTZWxlY3RvciBzZWxlY3RvcikgewogICAgLy8gVmFsdWVzIG1hdGNoIEpTSW52b2NhdGlvbk1pcnJvciBpbiBqcy1oZWxwZXIgbGlicmFyeS4KICAgIGludCB0eXBlID0gc2VsZWN0b3IuaW52b2NhdGlvbk1pcnJvcktpbmQ7CiAgICBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTmFtZXMgPQogICAgICAgIG5ldyBMaXN0LmdlbmVyYXRlKHNlbGVjdG9yLmFyZ3VtZW50Q291bnQsIChpKSA9PiAnXCQkaScpICsKICAgICAgICAgICAgbmV3IExpc3QuZ2VuZXJhdGUoc2VsZWN0b3IudHlwZUFyZ3VtZW50Q291bnQsIChpKSA9PiAnXCRUJHtpICsgMX0nKTsKCiAgICBMaXN0PGpzQXN0LkV4cHJlc3Npb24+IGFyZ05hbWVzID0gc2VsZWN0b3IuY2FsbFN0cnVjdHVyZQogICAgICAgIC5nZXRPcmRlcmVkTmFtZWRBcmd1bWVudHMoKQogICAgICAgIC5tYXAoKFN0cmluZyBuYW1lKSA9PiBqcy5zdHJpbmcobmFtZSkpCiAgICAgICAgLnRvTGlzdCgpOwoKICAgIGpzQXN0Lk5hbWUgbWV0aG9kTmFtZSA9IF9uYW1lci5hc05hbWUoc2VsZWN0b3IuaW52b2NhdGlvbk1pcnJvck1lbWJlck5hbWUpOwogICAganNBc3QuTmFtZSBpbnRlcm5hbE5hbWUgPSBfbmFtZXIuaW52b2NhdGlvbk1pcnJvckludGVybmFsTmFtZShzZWxlY3Rvcik7CgogICAgYXNzZXJ0KF9pbnRlcmNlcHRvckRhdGEuaXNJbnRlcmNlcHRlZE5hbWUoSWRlbnRpZmllcnMubm9TdWNoTWV0aG9kXykpOwogICAgYm9vbCBpc0ludGVyY2VwdGVkID0gX2ludGVyY2VwdG9yRGF0YS5pc0ludGVyY2VwdGVkTmFtZShzZWxlY3Rvci5uYW1lKTsKICAgIGpzQXN0LkV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGpzKCcnJ3RoaXMuI25vU3VjaE1ldGhvZE5hbWUoI3JlY2VpdmVyLAogICAgICAgICAgICAgICAgICAgICNjcmVhdGVJbnZvY2F0aW9uTWlycm9yKCNtZXRob2ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpbnRlcm5hbE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2FyZ3VtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjbmFtZWRBcmd1bWVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3R5cGVBcmd1bWVudENvdW50KSknJycsIHsKICAgICAgJ3JlY2VpdmVyJzogaXNJbnRlcmNlcHRlZCA/IHInJHJlY2VpdmVyJyA6ICd0aGlzJywKICAgICAgJ25vU3VjaE1ldGhvZE5hbWUnOiBfbmFtZXIubm9TdWNoTWV0aG9kTmFtZSwKICAgICAgJ2NyZWF0ZUludm9jYXRpb25NaXJyb3InOgogICAgICAgICAgX2VtaXR0ZXIuc3RhdGljRnVuY3Rpb25BY2Nlc3MoX2NvbW1vbkVsZW1lbnRzLmNyZWF0ZUludm9jYXRpb25NaXJyb3IpLAogICAgICAnbWV0aG9kTmFtZSc6CiAgICAgICAgICBqcy5xdW90ZU5hbWUoZW5hYmxlTWluaWZpY2F0aW9uID8gaW50ZXJuYWxOYW1lIDogbWV0aG9kTmFtZSksCiAgICAgICdpbnRlcm5hbE5hbWUnOiBqcy5xdW90ZU5hbWUoaW50ZXJuYWxOYW1lKSwKICAgICAgJ3R5cGUnOiBqcy5udW1iZXIodHlwZSksCiAgICAgICdhcmd1bWVudHMnOiBuZXcganNBc3QuQXJyYXlJbml0aWFsaXplcigKICAgICAgICAgIHBhcmFtZXRlck5hbWVzLm1hcDxqc0FzdC5FeHByZXNzaW9uPihqcykudG9MaXN0KCkpLAogICAgICAnbmFtZWRBcmd1bWVudHMnOiBuZXcganNBc3QuQXJyYXlJbml0aWFsaXplcihhcmdOYW1lcyksCiAgICAgICd0eXBlQXJndW1lbnRDb3VudCc6IGpzLm51bWJlcihzZWxlY3Rvci50eXBlQXJndW1lbnRDb3VudCkKICAgIH0pOwoKICAgIGpzQXN0LkV4cHJlc3Npb24gZnVuY3Rpb247CiAgICBpZiAoaXNJbnRlcmNlcHRlZCkgewogICAgICBmdW5jdGlvbiA9IGpzKAogICAgICAgICAgcidmdW5jdGlvbigkcmVjZWl2ZXIsICMpIHsgcmV0dXJuICMgfScsIFtwYXJhbWV0ZXJOYW1lcywgZXhwcmVzc2lvbl0pOwogICAgfSBlbHNlIHsKICAgICAgZnVuY3Rpb24gPSBqcyhyJ2Z1bmN0aW9uKCMpIHsgcmV0dXJuICMgfScsIFtwYXJhbWV0ZXJOYW1lcywgZXhwcmVzc2lvbl0pOwogICAgfQogICAgcmV0dXJuIG5ldyBTdHViTWV0aG9kKG5hbWUsIGZ1bmN0aW9uKTsKICB9Cn0KCi8vLyBDcmVhdGVzIHR3byBKYXZhU2NyaXB0IGZ1bmN0aW9uczogYHRlYXJPZmZHZXR0ZXJgIGFuZCBgdGVhck9mZmAuCi8vLwovLy8gYHRlYXJPZmZHZXR0ZXJgIGlzIGludGVybmFsIGFuZCBvbmx5IHVzZWQgYnkgYHRlYXJPZmZgLgovLy8KLy8vIGB0ZWFyT2ZmYCB0YWtlcyB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czoKLy8vICAgKiBgZnVuY3NgOiBhIGxpc3Qgb2YgZnVuY3Rpb25zLiBUaGVzZSBhcmUgdGhlIGZ1bmN0aW9ucyByZXByZXNlbnRpbmcgdGhlCi8vLyAgICAgbWVtYmVyIHRoYXQgaXMgdG9ybiBvZmYuIFRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lLCBzaW5jZSBhIG1lbWJlcgovLy8gICAgIGNhbiBoYXZlIHNldmVyYWwgc3R1YnMuCi8vLyAgICAgRWFjaCBmdW5jdGlvbiBtdXN0IGhhdmUgdGhlIGAkY2FsbE5hbWVgIHByb3BlcnR5IHNldC4KLy8vICAgKiBgYXBwbHlUcmFtcG9saW5lSW5kZXhgIGlzIHRoZSBpbmRleCBvZiB0aGUgc3R1YiB0byBiZSB1c2VkIGZvcgovLy8gICAgIEZ1bmN0aW9uLmFwcGx5Ci8vLyAgICogYHJlZmxlY3Rpb25JbmZvYDogY29udGFpbnMgcmVmbGVjdGl2ZSBpbmZvcm1hdGlvbiwgYW5kIHRoZSBmdW5jdGlvbgovLy8gICAgIHR5cGUuIFRPRE8oZmxvaXRzY2gpOiBwb2ludCB0byB3aGVyZSB0aGlzIGlzIHNwZWNpZmllZC4KLy8vICAgKiBgaXNTdGF0aWNgLgovLy8gICAqIGBuYW1lYC4KLy8vICAgKiBgaXNJbnRlcmNlcHRlZC4KTGlzdDxqc0FzdC5TdGF0ZW1lbnQ+IGJ1aWxkVGVhck9mZkNvZGUoQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsIEVtaXR0ZXIgZW1pdHRlciwKICAgIE5hbWVyIG5hbWVyLCBDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cykgewogIEZ1bmN0aW9uRW50aXR5IGNsb3N1cmVGcm9tVGVhck9mZiA9IGNvbW1vbkVsZW1lbnRzLmNsb3N1cmVGcm9tVGVhck9mZjsKICBqc0FzdC5FeHByZXNzaW9uIHRlYXJPZmZBY2Nlc3NFeHByZXNzaW9uOwogIGpzQXN0LkV4cHJlc3Npb24gdGVhck9mZkdsb2JhbE9iamVjdFN0cmluZzsKICBqc0FzdC5FeHByZXNzaW9uIHRlYXJPZmZHbG9iYWxPYmplY3Q7CiAgaWYgKGNsb3N1cmVGcm9tVGVhck9mZiAhPSBudWxsKSB7CiAgICB0ZWFyT2ZmQWNjZXNzRXhwcmVzc2lvbiA9IGVtaXR0ZXIuc3RhdGljRnVuY3Rpb25BY2Nlc3MoY2xvc3VyZUZyb21UZWFyT2ZmKTsKICAgIHRlYXJPZmZHbG9iYWxPYmplY3QgPQogICAgICAgIGpzLnN0cmluZ1BhcnQobmFtZXIuZ2xvYmFsT2JqZWN0Rm9yTWVtYmVyKGNsb3N1cmVGcm9tVGVhck9mZikpOwogICAgdGVhck9mZkdsb2JhbE9iamVjdFN0cmluZyA9CiAgICAgICAganMuc3RyaW5nKG5hbWVyLmdsb2JhbE9iamVjdEZvck1lbWJlcihjbG9zdXJlRnJvbVRlYXJPZmYpKTsKICB9IGVsc2UgewogICAgLy8gRGVmYXVsdCB2YWx1ZXMgZm9yIG1vY2tlZC11cCB0ZXN0IGxpYnJhcmllcy4KICAgIHRlYXJPZmZBY2Nlc3NFeHByZXNzaW9uID0KICAgICAgICBqcyhyJycnZnVuY3Rpb24oKSB7IHRocm93ICJIZWxwZXIgJ2Nsb3N1cmVGcm9tVGVhck9mZicgbWlzc2luZy4iIH0nJycpOwogICAgdGVhck9mZkdsb2JhbE9iamVjdFN0cmluZyA9IGpzLnN0cmluZygnTWlzc2luZ0hlbHBlckZ1bmN0aW9uJyk7CiAgICB0ZWFyT2ZmR2xvYmFsT2JqZWN0ID0ganMoCiAgICAgICAgcicnJyhmdW5jdGlvbigpIHsgdGhyb3cgIkhlbHBlciAnY2xvc3VyZUZyb21UZWFyT2ZmJyBtaXNzaW5nLiIgfSkoKScnJyk7CiAgfQoKICBqc0FzdC5TdGF0ZW1lbnQgdGVhck9mZkdldHRlcjsKICBpZiAoIW9wdGlvbnMudXNlQ29udGVudFNlY3VyaXR5UG9saWN5KSB7CiAgICBqc0FzdC5FeHByZXNzaW9uIHRlYXJPZmZBY2Nlc3NUZXh0ID0gbmV3IGpzQXN0LlVucGFyc2VkTm9kZSgKICAgICAgICB0ZWFyT2ZmQWNjZXNzRXhwcmVzc2lvbiwgb3B0aW9ucy5lbmFibGVNaW5pZmljYXRpb24sIGZhbHNlKTsKICAgIHRlYXJPZmZHZXR0ZXIgPSBqcy5zdGF0ZW1lbnQoJycnCmZ1bmN0aW9uIHRlYXJPZmZHZXR0ZXIoZnVuY3MsIGFwcGx5VHJhbXBvbGluZUluZGV4LCByZWZsZWN0aW9uSW5mbywgbmFtZSwgaXNJbnRlcmNlcHRlZCkgewogIHJldHVybiBpc0ludGVyY2VwdGVkCiAgICAgID8gbmV3IEZ1bmN0aW9uKCJmdW5jcyIsICJhcHBseVRyYW1wb2xpbmVJbmRleCIsICJyZWZsZWN0aW9uSW5mbyIsICJuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgI3RlYXJPZmZHbG9iYWxPYmplY3RTdHJpbmcsICJjIiwKICAgICAgICAgICJyZXR1cm4gZnVuY3Rpb24gdGVhck9mZl8iICsgbmFtZSArIChmdW5jdGlvbkNvdW50ZXIrKykgKyAiKHJlY2VpdmVyKSB7IiArCiAgICAgICAgICAgICJpZiAoYyA9PT0gbnVsbCkgYyA9ICIgKyAjdGVhck9mZkFjY2Vzc1RleHQgKyAiKCIgKwogICAgICAgICAgICAgICAgInRoaXMsIGZ1bmNzLCBhcHBseVRyYW1wb2xpbmVJbmRleCwgcmVmbGVjdGlvbkluZm8sIGZhbHNlLCB0cnVlLCBuYW1lKTsiICsKICAgICAgICAgICAgICAgICJyZXR1cm4gbmV3IGModGhpcywgZnVuY3NbMF0sIHJlY2VpdmVyLCBuYW1lKTsiICsKICAgICAgICAgICAifSIpKGZ1bmNzLCBhcHBseVRyYW1wb2xpbmVJbmRleCwgcmVmbGVjdGlvbkluZm8sIG5hbWUsICN0ZWFyT2ZmR2xvYmFsT2JqZWN0LCBudWxsKQogICAgICA6IG5ldyBGdW5jdGlvbigiZnVuY3MiLCAiYXBwbHlUcmFtcG9saW5lSW5kZXgiLCAicmVmbGVjdGlvbkluZm8iLCAibmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICN0ZWFyT2ZmR2xvYmFsT2JqZWN0U3RyaW5nLCAiYyIsCiAgICAgICAgICAicmV0dXJuIGZ1bmN0aW9uIHRlYXJPZmZfIiArIG5hbWUgKyAoZnVuY3Rpb25Db3VudGVyKyspKyAiKCkgeyIgKwogICAgICAgICAgICAiaWYgKGMgPT09IG51bGwpIGMgPSAiICsgI3RlYXJPZmZBY2Nlc3NUZXh0ICsgIigiICsKICAgICAgICAgICAgICAgICJ0aGlzLCBmdW5jcywgYXBwbHlUcmFtcG9saW5lSW5kZXgsIHJlZmxlY3Rpb25JbmZvLCBmYWxzZSwgZmFsc2UsIG5hbWUpOyIgKwogICAgICAgICAgICAgICAgInJldHVybiBuZXcgYyh0aGlzLCBmdW5jc1swXSwgbnVsbCwgbmFtZSk7IiArCiAgICAgICAgICAgICAifSIpKGZ1bmNzLCBhcHBseVRyYW1wb2xpbmVJbmRleCwgcmVmbGVjdGlvbkluZm8sIG5hbWUsICN0ZWFyT2ZmR2xvYmFsT2JqZWN0LCBudWxsKTsKfScnJywgewogICAgICAndGVhck9mZkFjY2Vzc1RleHQnOiB0ZWFyT2ZmQWNjZXNzVGV4dCwKICAgICAgJ3RlYXJPZmZHbG9iYWxPYmplY3QnOiB0ZWFyT2ZmR2xvYmFsT2JqZWN0LAogICAgICAndGVhck9mZkdsb2JhbE9iamVjdFN0cmluZyc6IHRlYXJPZmZHbG9iYWxPYmplY3RTdHJpbmcKICAgIH0pOwogIH0gZWxzZSB7CiAgICB0ZWFyT2ZmR2V0dGVyID0ganMuc3RhdGVtZW50KCcnJwogICAgICBmdW5jdGlvbiB0ZWFyT2ZmR2V0dGVyKGZ1bmNzLCBhcHBseVRyYW1wb2xpbmVJbmRleCwgcmVmbGVjdGlvbkluZm8sIG5hbWUsIGlzSW50ZXJjZXB0ZWQpIHsKICAgICAgICB2YXIgY2FjaGUgPSBudWxsOwogICAgICAgIHJldHVybiBpc0ludGVyY2VwdGVkCiAgICAgICAgICAgID8gZnVuY3Rpb24ocmVjZWl2ZXIpIHsKICAgICAgICAgICAgICAgIGlmIChjYWNoZSA9PT0gbnVsbCkgY2FjaGUgPSAjKAogICAgICAgICAgICAgICAgICAgIHRoaXMsIGZ1bmNzLCBhcHBseVRyYW1wb2xpbmVJbmRleCwgcmVmbGVjdGlvbkluZm8sIGZhbHNlLCB0cnVlLCBuYW1lKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgY2FjaGUodGhpcywgZnVuY3NbMF0sIHJlY2VpdmVyLCBuYW1lKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGUgPT09IG51bGwpIGNhY2hlID0gIygKICAgICAgICAgICAgICAgICAgICB0aGlzLCBmdW5jcywgYXBwbHlUcmFtcG9saW5lSW5kZXgsIHJlZmxlY3Rpb25JbmZvLCBmYWxzZSwgZmFsc2UsIG5hbWUpOwogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBjYWNoZSh0aGlzLCBmdW5jc1swXSwgbnVsbCwgbmFtZSk7CiAgICAgICAgICAgICAgfTsKICAgICAgfScnJywgW3RlYXJPZmZBY2Nlc3NFeHByZXNzaW9uLCB0ZWFyT2ZmQWNjZXNzRXhwcmVzc2lvbl0pOwogIH0KCiAganNBc3QuU3RhdGVtZW50IHRlYXJPZmYgPSBqcy5zdGF0ZW1lbnQoJycnCiAgICAgIGZ1bmN0aW9uIHRlYXJPZmYoZnVuY3MsIGFwcGx5VHJhbXBvbGluZUluZGV4LAogICAgICAgICAgcmVmbGVjdGlvbkluZm8sIGlzU3RhdGljLCBuYW1lLCBpc0ludGVyY2VwdGVkKSB7CiAgICAgIHZhciBjYWNoZSA9IG51bGw7CiAgICAgIHJldHVybiBpc1N0YXRpYwogICAgICAgICAgPyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBpZiAoY2FjaGUgPT09IG51bGwpIGNhY2hlID0gI3RlYXJPZmYoCiAgICAgICAgICAgICAgICAgIHRoaXMsIGZ1bmNzLCBhcHBseVRyYW1wb2xpbmVJbmRleCwKICAgICAgICAgICAgICAgICAgcmVmbGVjdGlvbkluZm8sIHRydWUsIGZhbHNlLCBuYW1lKS5wcm90b3R5cGU7CiAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlOwogICAgICAgICAgICB9CiAgICAgICAgICA6IHRlYXJPZmZHZXR0ZXIoZnVuY3MsIGFwcGx5VHJhbXBvbGluZUluZGV4LAogICAgICAgICAgICAgIHJlZmxlY3Rpb25JbmZvLCBuYW1lLCBpc0ludGVyY2VwdGVkKTsKICAgIH0nJycsIHsndGVhck9mZic6IHRlYXJPZmZBY2Nlc3NFeHByZXNzaW9ufSk7CgogIHJldHVybiA8anNBc3QuU3RhdGVtZW50Plt0ZWFyT2ZmR2V0dGVyLCB0ZWFyT2ZmXTsKfQqBWgBOTjwBMQE7NiQhICwuQxoxMkIqASEVARsWKyMhGigBRy0iAUgBLU1KB0g3KR5EODQXLyA4Bks7L0E7CDUSFhkRHAgEAU8tFkgYSkoEAU8tFkgYSigPTAQBLAY5QEs3Rk0eRAE2ASUiQh1BIzoKNA8mPS9GEUszCggGATcqAU1ODjwwOzYeQCoBRUhKAUBBI0UKATshNSgKAUJGATMIBgEbBAE/QgFFPRYGASJHMjIsLy8zS0YUCgE7SU0mCggGAT9BQRQEAU89LiJDUQE9JC8TAVBNAUtMSjk7Mzg9RzkzIFEUSDIfLz4+QQgBHxkVUQ1QBisEAgFFBDwELU9MID5HF0xAFBAYUTJJLC4oJFAaSCBECzQeUEQeUQQBIStBRSVbF1A2VUBbQl9QNkxAXD5iCC4yPQgLJWEaHSMvW0IQGy9cPhFBBAEtNDsYFhk0NUAcDjc0MQE0AgE5cGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9jbGFzc19zdHViX2dlbmVyYXRvci5kYXJ0P3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2VtaXR0ZXIvY29kZV9lbWl0dGVyX3Rhc2suZGFydKzoLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5qc19lbWl0dGVyLmNvZGVfZW1pdHRlcl90YXNrOwoKaW1wb3J0ICdwYWNrYWdlOmpzX3J1bnRpbWUvc2hhcmVkL2VtYmVkZGVkX25hbWVzLmRhcnQnIHNob3cgSnNCdWlsdGluOwoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uL3Rhc2tzLmRhcnQnIHNob3cgQ29tcGlsZXJUYXNrOwppbXBvcnQgJy4uL2NvbXBpbGVyLmRhcnQnIHNob3cgQ29tcGlsZXI7CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9kZWZlcnJlZF9sb2FkLmRhcnQnIHNob3cgT3V0cHV0VW5pdDsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBhcyBqc0FzdDsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2pzX2JhY2tlbmQuZGFydCcgc2hvdyBKYXZhU2NyaXB0QmFja2VuZCwgTmFtZXI7CmltcG9ydCAnLi4vanNfYmFja2VuZC9pbmZlcnJlZF9kYXRhLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NvZGVnZW5fd29ybGRfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKaW1wb3J0ICdwcm9ncmFtX2J1aWxkZXIvcHJvZ3JhbV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3N0YXJ0dXBfZW1pdHRlci9lbWl0dGVyLmRhcnQnIGFzIHN0YXJ0dXBfanNfZW1pdHRlcjsKCmltcG9ydCAnbWV0YWRhdGFfY29sbGVjdG9yLmRhcnQnIHNob3cgTWV0YWRhdGFDb2xsZWN0b3I7CmltcG9ydCAnbW9kZWwuZGFydCc7CmltcG9ydCAnbmF0aXZlX2VtaXR0ZXIuZGFydCcgc2hvdyBOYXRpdmVFbWl0dGVyOwppbXBvcnQgJ3R5cGVfdGVzdF9yZWdpc3RyeS5kYXJ0JyBzaG93IFR5cGVUZXN0UmVnaXN0cnk7CmltcG9ydCAnc29ydGVyLmRhcnQnOwoKLy8vIEdlbmVyYXRlcyB0aGUgY29kZSBmb3IgYWxsIHVzZWQgY2xhc3NlcyBpbiB0aGUgcHJvZ3JhbS4gU3RhdGljIGZpZWxkcyAoZXZlbgovLy8gaW4gY2xhc3NlcykgYXJlIGlnbm9yZWQsIHNpbmNlIHRoZXkgY2FuIGJlIHRyZWF0ZWQgYXMgbm9uLWNsYXNzIGVsZW1lbnRzLgovLy8KLy8vIFRoZSBjb2RlIGZvciB0aGUgY29udGFpbmluZyAodXNlZCkgbWV0aG9kcyBtdXN0IGV4aXN0IGluIHRoZSBgdW5pdmVyc2VgLgpjbGFzcyBDb2RlRW1pdHRlclRhc2sgZXh0ZW5kcyBDb21waWxlclRhc2sgewogIFR5cGVUZXN0UmVnaXN0cnkgdHlwZVRlc3RSZWdpc3RyeTsKICBOYXRpdmVFbWl0dGVyIF9uYXRpdmVFbWl0dGVyOwogIE1ldGFkYXRhQ29sbGVjdG9yIG1ldGFkYXRhQ29sbGVjdG9yOwogIGZpbmFsIEVtaXR0ZXJGYWN0b3J5IF9lbWl0dGVyRmFjdG9yeTsKICBFbWl0dGVyIF9lbWl0dGVyOwogIGZpbmFsIENvbXBpbGVyIGNvbXBpbGVyOwoKICBKYXZhU2NyaXB0QmFja2VuZCBnZXQgYmFja2VuZCA9PiBjb21waWxlci5iYWNrZW5kOwoKICBAZGVwcmVjYXRlZAogIC8vIFRoaXMgZmllbGQgc2hvdWxkIGJlIHJlbW92ZWQuIEl0J3MgY3VycmVudGx5IG9ubHkgbmVlZGVkIGZvciBkdW1wLWluZm8gYW5kCiAgLy8gdGVzdHMuCiAgLy8gVGhlIGZpZWxkIGlzIHNldCBhZnRlciB0aGUgcHJvZ3JhbSBoYXMgYmVlbiBlbWl0dGVkLgogIC8vLyBDb250YWlucyBhIGxpc3Qgb2YgYWxsIGNsYXNzZXMgdGhhdCBhcmUgZW1pdHRlZC4KICBTZXQ8Q2xhc3NFbnRpdHk+IG5lZWRlZENsYXNzZXM7CgogIENvZGVFbWl0dGVyVGFzayhDb21waWxlciBjb21waWxlciwgYm9vbCBnZW5lcmF0ZVNvdXJjZU1hcCkKICAgICAgOiBjb21waWxlciA9IGNvbXBpbGVyLAogICAgICAgIF9lbWl0dGVyRmFjdG9yeSA9IHN0YXJ0dXBfanNfZW1pdHRlci5FbWl0dGVyRmFjdG9yeSgKICAgICAgICAgICAgZ2VuZXJhdGVTb3VyY2VNYXA6IGdlbmVyYXRlU291cmNlTWFwKSwKICAgICAgICBzdXBlcihjb21waWxlci5tZWFzdXJlcik7CgogIE5hdGl2ZUVtaXR0ZXIgZ2V0IG5hdGl2ZUVtaXR0ZXIgewogICAgYXNzZXJ0KAogICAgICAgIF9uYXRpdmVFbWl0dGVyICE9IG51bGwsCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwgIk5hdGl2ZUVtaXR0ZXIgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0LiIpKTsKICAgIHJldHVybiBfbmF0aXZlRW1pdHRlcjsKICB9CgogIEVtaXR0ZXIgZ2V0IGVtaXR0ZXIgewogICAgYXNzZXJ0KF9lbWl0dGVyICE9IG51bGwsCiAgICAgICAgZmFpbGVkQXQoTk9fTE9DQVRJT05fU1BBTk5BQkxFLCAiRW1pdHRlciBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQuIikpOwogICAgcmV0dXJuIF9lbWl0dGVyOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+ICdDb2RlIGVtaXR0ZXInOwoKICAvLy8gUmV0dXJucyB0cnVlLCBpZiB0aGUgZW1pdHRlciBzdXBwb3J0cyByZWZsZWN0aW9uLgogIGJvb2wgZ2V0IHN1cHBvcnRzUmVmbGVjdGlvbiA9PiBfZW1pdHRlckZhY3Rvcnkuc3VwcG9ydHNSZWZsZWN0aW9uOwoKICAvLy8gUmV0dXJucyB0aGUgY2xvc3VyZSBleHByZXNzaW9uIG9mIGEgc3RhdGljIGZ1bmN0aW9uLgogIGpzQXN0LkV4cHJlc3Npb24gaXNvbGF0ZVN0YXRpY0Nsb3N1cmVBY2Nlc3MoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIGVtaXR0ZXIuaXNvbGF0ZVN0YXRpY0Nsb3N1cmVBY2Nlc3MoZWxlbWVudCk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgSlMgZnVuY3Rpb24gdGhhdCBtdXN0IGJlIGludm9rZWQgdG8gZ2V0IHRoZSB2YWx1ZSBvZiB0aGUKICAvLy8gbGF6aWx5IGluaXRpYWxpemVkIHN0YXRpYy4KICBqc0FzdC5FeHByZXNzaW9uIGlzb2xhdGVMYXp5SW5pdGlhbGl6ZXJBY2Nlc3MoRmllbGRFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIGVtaXR0ZXIuaXNvbGF0ZUxhenlJbml0aWFsaXplckFjY2VzcyhlbGVtZW50KTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBKUyBjb2RlIGZvciBhY2Nlc3NpbmcgdGhlIGVtYmVkZGVkIFtnbG9iYWxdLgogIGpzQXN0LkV4cHJlc3Npb24gZ2VuZXJhdGVFbWJlZGRlZEdsb2JhbEFjY2VzcyhTdHJpbmcgZ2xvYmFsKSB7CiAgICByZXR1cm4gZW1pdHRlci5nZW5lcmF0ZUVtYmVkZGVkR2xvYmFsQWNjZXNzKGdsb2JhbCk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgSlMgY29kZSBmb3IgYWNjZXNzaW5nIHRoZSBnaXZlbiBbY29uc3RhbnRdLgogIGpzQXN0LkV4cHJlc3Npb24gY29uc3RhbnRSZWZlcmVuY2UoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgcmV0dXJuIGVtaXR0ZXIuY29uc3RhbnRSZWZlcmVuY2UoY29uc3RhbnQpOwogIH0KCiAganNBc3QuRXhwcmVzc2lvbiBzdGF0aWNGaWVsZEFjY2VzcyhGaWVsZEVudGl0eSBlKSB7CiAgICByZXR1cm4gZW1pdHRlci5zdGF0aWNGaWVsZEFjY2VzcyhlKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBKUyBmdW5jdGlvbiByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGZ1bmN0aW9uLgogIC8vLwogIC8vLyBUaGUgZnVuY3Rpb24gbXVzdCBiZSBpbnZva2VkIGFuZCBjYW4gbm90IGJlIHVzZWQgYXMgY2xvc3VyZS4KICBqc0FzdC5FeHByZXNzaW9uIHN0YXRpY0Z1bmN0aW9uQWNjZXNzKEZ1bmN0aW9uRW50aXR5IGUpIHsKICAgIHJldHVybiBlbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGUpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIEpTIGNvbnN0cnVjdG9yIG9mIHRoZSBnaXZlbiBlbGVtZW50LgogIC8vLwogIC8vLyBUaGUgcmV0dXJuZWQgZXhwcmVzc2lvbiBtdXN0IG9ubHkgYmUgdXNlZCBpbiBhIEpTIGBuZXdgIGV4cHJlc3Npb24uCiAganNBc3QuRXhwcmVzc2lvbiBjb25zdHJ1Y3RvckFjY2VzcyhDbGFzc0VudGl0eSBlKSB7CiAgICByZXR1cm4gZW1pdHRlci5jb25zdHJ1Y3RvckFjY2VzcyhlKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBKUyBwcm90b3R5cGUgb2YgdGhlIGdpdmVuIGNsYXNzIFtlXS4KICBqc0FzdC5FeHByZXNzaW9uIHByb3RvdHlwZUFjY2VzcyhDbGFzc0VudGl0eSBlLAogICAgICB7Ym9vbCBoYXNCZWVuSW5zdGFudGlhdGVkOiBmYWxzZX0pIHsKICAgIHJldHVybiBlbWl0dGVyLnByb3RvdHlwZUFjY2VzcyhlLCBoYXNCZWVuSW5zdGFudGlhdGVkKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBKUyBwcm90b3R5cGUgb2YgdGhlIGdpdmVuIGludGVyY2VwdG9yIGNsYXNzIFtlXS4KICBqc0FzdC5FeHByZXNzaW9uIGludGVyY2VwdG9yUHJvdG90eXBlQWNjZXNzKENsYXNzRW50aXR5IGUpIHsKICAgIHJldHVybiBqc0FzdC5qcygnIy5wcm90b3R5cGUnLCBpbnRlcmNlcHRvckNsYXNzQWNjZXNzKGUpKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBKUyBjb25zdHJ1Y3RvciBvZiB0aGUgZ2l2ZW4gaW50ZXJjZXB0b3IgY2xhc3MgW2VdLgogIGpzQXN0LkV4cHJlc3Npb24gaW50ZXJjZXB0b3JDbGFzc0FjY2VzcyhDbGFzc0VudGl0eSBlKSB7CiAgICByZXR1cm4gZW1pdHRlci5pbnRlcmNlcHRvckNsYXNzQWNjZXNzKGUpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIEpTIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSB0eXBlIFtlXS4KICAvLy8KICAvLy8gVGhlIGdpdmVuIHR5cGUgW2VdIG1pZ2h0IGJlIGEgVHlwZWRlZi4KICBqc0FzdC5FeHByZXNzaW9uIHR5cGVBY2Nlc3MoRW50aXR5IGUpIHsKICAgIHJldHVybiBlbWl0dGVyLnR5cGVBY2Nlc3MoZSk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgSlMgdGVtcGxhdGUgZm9yIHRoZSBnaXZlbiBbYnVpbHRpbl0uCiAganNBc3QuVGVtcGxhdGUgYnVpbHRpblRlbXBsYXRlRm9yKEpzQnVpbHRpbiBidWlsdGluKSB7CiAgICByZXR1cm4gZW1pdHRlci50ZW1wbGF0ZUZvckJ1aWx0aW4oYnVpbHRpbik7CiAgfQoKICB2b2lkIF9maW5hbGl6ZVJ0aSgpIHsKICAgIC8vIENvbXB1dGUgdGhlIHJlcXVpcmVkIHR5cGUgY2hlY2tzIHRvIGtub3cgd2hpY2ggY2xhc3NlcyBuZWVkIGEKICAgIC8vICdpcyQnIG1ldGhvZC4KICAgIHR5cGVUZXN0UmVnaXN0cnkuY29tcHV0ZVJlcXVpcmVkVHlwZUNoZWNrcyhiYWNrZW5kLnJ0aUNoZWNrc0J1aWxkZXIpOwogICAgLy8gQ29tcHV0ZSB0aGUgY2xhc3NlcyBuZWVkZWQgYnkgUlRJLgogICAgdHlwZVRlc3RSZWdpc3RyeS5jb21wdXRlUnRpTmVlZGVkQ2xhc3NlcygKICAgICAgICBiYWNrZW5kLnJ0aVN1YnN0aXR1dGlvbnMsIGJhY2tlbmQuZ2VuZXJhdGVkQ29kZS5rZXlzKTsKICB9CgogIC8vLyBDcmVhdGVzIHRoZSBbRW1pdHRlcl0gZm9yIHRoaXMgdGFzay4KICB2b2lkIGNyZWF0ZUVtaXR0ZXIoTmFtZXIgbmFtZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwKICAgICAgQ29kZWdlbldvcmxkQnVpbGRlciBjb2RlZ2VuV29ybGRCdWlsZGVyLCBTb3J0ZXIgc29ydGVyKSB7CiAgICBtZWFzdXJlKCgpIHsKICAgICAgX25hdGl2ZUVtaXR0ZXIgPSBuZXcgTmF0aXZlRW1pdHRlcih0aGlzLCBjbG9zZWRXb3JsZCwgY29kZWdlbldvcmxkQnVpbGRlciwKICAgICAgICAgIGJhY2tlbmQubmF0aXZlQ29kZWdlbkVucXVldWVyKTsKICAgICAgX2VtaXR0ZXIgPQogICAgICAgICAgX2VtaXR0ZXJGYWN0b3J5LmNyZWF0ZUVtaXR0ZXIodGhpcywgbmFtZXIsIGNsb3NlZFdvcmxkLCBzb3J0ZXIpOwogICAgICBtZXRhZGF0YUNvbGxlY3RvciA9IG5ldyBNZXRhZGF0YUNvbGxlY3Rvcihjb21waWxlci5vcHRpb25zLAogICAgICAgICAgY29tcGlsZXIucmVwb3J0ZXIsIF9lbWl0dGVyLCBiYWNrZW5kLnJ0aUVuY29kZXIsIGNvZGVnZW5Xb3JsZEJ1aWxkZXIpOwogICAgICB0eXBlVGVzdFJlZ2lzdHJ5ID0gbmV3IFR5cGVUZXN0UmVnaXN0cnkoY29tcGlsZXIub3B0aW9ucywKICAgICAgICAgIGNvZGVnZW5Xb3JsZEJ1aWxkZXIsIGNsb3NlZFdvcmxkLmVsZW1lbnRFbnZpcm9ubWVudCk7CiAgICB9KTsKICB9CgogIGludCBhc3NlbWJsZVByb2dyYW0oCiAgICAgIE5hbWVyIG5hbWVyLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsIEluZmVycmVkRGF0YSBpbmZlcnJlZERhdGEpIHsKICAgIHJldHVybiBtZWFzdXJlKCgpIHsKICAgICAgX2ZpbmFsaXplUnRpKCk7CiAgICAgIFByb2dyYW1CdWlsZGVyIHByb2dyYW1CdWlsZGVyID0gbmV3IFByb2dyYW1CdWlsZGVyKAogICAgICAgICAgY29tcGlsZXIub3B0aW9ucywKICAgICAgICAgIGNvbXBpbGVyLnJlcG9ydGVyLAogICAgICAgICAgY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50LAogICAgICAgICAgY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMsCiAgICAgICAgICBjbG9zZWRXb3JsZC5vdXRwdXRVbml0RGF0YSwKICAgICAgICAgIGNvbXBpbGVyLmNvZGVnZW5Xb3JsZEJ1aWxkZXIsCiAgICAgICAgICBiYWNrZW5kLm5hdGl2ZUNvZGVnZW5FbnF1ZXVlciwKICAgICAgICAgIGNsb3NlZFdvcmxkLmJhY2tlbmRVc2FnZSwKICAgICAgICAgIGJhY2tlbmQuY29uc3RhbnRzLAogICAgICAgICAgY2xvc2VkV29ybGQubmF0aXZlRGF0YSwKICAgICAgICAgIGNsb3NlZFdvcmxkLnJ0aU5lZWQsCiAgICAgICAgICBjbG9zZWRXb3JsZC5pbnRlcmNlcHRvckRhdGEsCiAgICAgICAgICBiYWNrZW5kLnN1cGVyTWVtYmVyRGF0YSwKICAgICAgICAgIHR5cGVUZXN0UmVnaXN0cnkucnRpQ2hlY2tzLAogICAgICAgICAgYmFja2VuZC5ydGlFbmNvZGVyLAogICAgICAgICAgYmFja2VuZC5vbmVTaG90SW50ZXJjZXB0b3JEYXRhLAogICAgICAgICAgYmFja2VuZC5jdXN0b21FbGVtZW50c0NvZGVnZW5BbmFseXNpcywKICAgICAgICAgIGJhY2tlbmQuZ2VuZXJhdGVkQ29kZSwKICAgICAgICAgIG5hbWVyLAogICAgICAgICAgdGhpcywKICAgICAgICAgIGNsb3NlZFdvcmxkLAogICAgICAgICAgY2xvc2VkV29ybGQuZmllbGRBbmFseXNpcywKICAgICAgICAgIGluZmVycmVkRGF0YSwKICAgICAgICAgIGJhY2tlbmQuc291cmNlSW5mb3JtYXRpb25TdHJhdGVneSwKICAgICAgICAgIGNsb3NlZFdvcmxkLnNvcnRlciwKICAgICAgICAgIHR5cGVUZXN0UmVnaXN0cnkucnRpTmVlZGVkQ2xhc3NlcywKICAgICAgICAgIGNsb3NlZFdvcmxkLmVsZW1lbnRFbnZpcm9ubWVudC5tYWluRnVuY3Rpb24pOwogICAgICBpbnQgc2l6ZSA9IGVtaXR0ZXIuZW1pdFByb2dyYW0ocHJvZ3JhbUJ1aWxkZXIpOwogICAgICAvLyBUT0RPKGZsb2l0c2NoKTogd2Ugc2hvdWxkbid0IG5lZWQgdGhlIGBuZWVkZWRDbGFzc2VzYCBhbnltb3JlLgogICAgICBuZWVkZWRDbGFzc2VzID0gcHJvZ3JhbUJ1aWxkZXIuY29sbGVjdG9yLm5lZWRlZENsYXNzZXM7CiAgICAgIHJldHVybiBzaXplOwogICAgfSk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBFbWl0dGVyRmFjdG9yeSB7CiAgLy8vIFJldHVybnMgdHJ1ZSwgaWYgdGhlIGVtaXR0ZXIgc3VwcG9ydHMgcmVmbGVjdGlvbi4KICBib29sIGdldCBzdXBwb3J0c1JlZmxlY3Rpb247CgogIC8vLyBDcmVhdGUgdGhlIFtFbWl0dGVyXSBmb3IgdGhlIGVtaXR0ZXIgW3Rhc2tdIHRoYXQgdXNlcyB0aGUgZ2l2ZW4gW25hbWVyXS4KICBFbWl0dGVyIGNyZWF0ZUVtaXR0ZXIoQ29kZUVtaXR0ZXJUYXNrIHRhc2ssIE5hbWVyIG5hbWVyLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsIFNvcnRlciBzb3J0ZXIpOwp9CgphYnN0cmFjdCBjbGFzcyBFbWl0dGVyIHsKICBQcm9ncmFtIGdldCBwcm9ncmFtRm9yVGVzdGluZzsKCiAgLy8vIFVzZXMgdGhlIFtwcm9ncmFtQnVpbGRlcl0gdG8gZ2VuZXJhdGUgYSBtb2RlbCBvZiB0aGUgcHJvZ3JhbSwgZW1pdHMKICAvLy8gdGhlIHByb2dyYW0sIGFuZCByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LgogIGludCBlbWl0UHJvZ3JhbShQcm9ncmFtQnVpbGRlciBwcm9ncmFtQnVpbGRlcik7CgogIC8vLyBSZXR1cm5zIHRoZSBKUyBmdW5jdGlvbiB0aGF0IG11c3QgYmUgaW52b2tlZCB0byBnZXQgdGhlIHZhbHVlIG9mIHRoZQogIC8vLyBsYXppbHkgaW5pdGlhbGl6ZWQgc3RhdGljLgogIGpzQXN0LkV4cHJlc3Npb24gaXNvbGF0ZUxhenlJbml0aWFsaXplckFjY2Vzcyhjb3ZhcmlhbnQgRmllbGRFbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZXR1cm5zIHRoZSBjbG9zdXJlIGV4cHJlc3Npb24gb2YgYSBzdGF0aWMgZnVuY3Rpb24uCiAganNBc3QuRXhwcmVzc2lvbiBpc29sYXRlU3RhdGljQ2xvc3VyZUFjY2Vzcyhjb3ZhcmlhbnQgRnVuY3Rpb25FbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZXR1cm5zIHRoZSBKUyBjb2RlIGZvciBhY2Nlc3NpbmcgdGhlIGVtYmVkZGVkIFtnbG9iYWxdLgogIGpzQXN0LkV4cHJlc3Npb24gZ2VuZXJhdGVFbWJlZGRlZEdsb2JhbEFjY2VzcyhTdHJpbmcgZ2xvYmFsKTsKCiAgLy8vIFJldHVybnMgdGhlIEpTIGZ1bmN0aW9uIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gZnVuY3Rpb24uCiAgLy8vCiAgLy8vIFRoZSBmdW5jdGlvbiBtdXN0IGJlIGludm9rZWQgYW5kIGNhbiBub3QgYmUgdXNlZCBhcyBjbG9zdXJlLgogIGpzQXN0LkV4cHJlc3Npb24gc3RhdGljRnVuY3Rpb25BY2Nlc3MoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCk7CgogIGpzQXN0LkV4cHJlc3Npb24gc3RhdGljRmllbGRBY2Nlc3MoRmllbGRFbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZXR1cm5zIHRoZSBKUyBjb25zdHJ1Y3RvciBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KICAvLy8KICAvLy8gVGhlIHJldHVybmVkIGV4cHJlc3Npb24gbXVzdCBvbmx5IGJlIHVzZWQgaW4gYSBKUyBgbmV3YCBleHByZXNzaW9uLgogIGpzQXN0LkV4cHJlc3Npb24gY29uc3RydWN0b3JBY2Nlc3MoQ2xhc3NFbnRpdHkgZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBKUyBwcm90b3R5cGUgb2YgdGhlIGdpdmVuIGNsYXNzIFtlXS4KICBqc0FzdC5FeHByZXNzaW9uIHByb3RvdHlwZUFjY2VzcygKICAgICAgY292YXJpYW50IENsYXNzRW50aXR5IGUsIGJvb2wgaGFzQmVlbkluc3RhbnRpYXRlZCk7CgogIC8vLyBSZXR1cm5zIHRoZSBKUyBjb25zdHJ1Y3RvciBvZiB0aGUgZ2l2ZW4gaW50ZXJjZXB0b3IgY2xhc3MgW2VdLgogIGpzQXN0LkV4cHJlc3Npb24gaW50ZXJjZXB0b3JDbGFzc0FjY2VzcyhDbGFzc0VudGl0eSBlKTsKCiAgLy8vIFJldHVybnMgdGhlIEpTIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSB0eXBlIFtlXS4KICBqc0FzdC5FeHByZXNzaW9uIHR5cGVBY2Nlc3MoRW50aXR5IGUpOwoKICAvLy8gUmV0dXJucyB0aGUgSlMgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgJ251bGwnCiAganNBc3QuRXhwcmVzc2lvbiBnZW5lcmF0ZUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsKCk7CgogIGludCBjb21wYXJlQ29uc3RhbnRzKENvbnN0YW50VmFsdWUgYSwgQ29uc3RhbnRWYWx1ZSBiKTsKICBib29sIGlzQ29uc3RhbnRJbmxpbmVkT3JBbHJlYWR5RW1pdHRlZChDb25zdGFudFZhbHVlIGNvbnN0YW50KTsKCiAgLy8vIFJldHVybnMgdGhlIEpTIGNvZGUgZm9yIGFjY2Vzc2luZyB0aGUgZ2l2ZW4gW2NvbnN0YW50XS4KICBqc0FzdC5FeHByZXNzaW9uIGNvbnN0YW50UmVmZXJlbmNlKENvbnN0YW50VmFsdWUgY29uc3RhbnQpOwoKICAvLy8gUmV0dXJucyB0aGUgSlMgdGVtcGxhdGUgZm9yIHRoZSBnaXZlbiBbYnVpbHRpbl0uCiAganNBc3QuVGVtcGxhdGUgdGVtcGxhdGVGb3JCdWlsdGluKEpzQnVpbHRpbiBidWlsdGluKTsKCiAgLy8vIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGNvZGUgZ2VuZXJhdGVkIGZvciBhIGdpdmVuIG91dHB1dCBbdW5pdF0uCiAgaW50IGdlbmVyYXRlZFNpemUoT3V0cHV0VW5pdCB1bml0KTsKfQoKYWJzdHJhY3QgY2xhc3MgRW1pdHRlckJhc2UgaW1wbGVtZW50cyBFbWl0dGVyIHsKICBAb3ZlcnJpZGUKICBQcm9ncmFtIHByb2dyYW1Gb3JUZXN0aW5nOwogIE5hbWVyIGdldCBuYW1lcjsKCiAganNBc3QuUHJvcGVydHlBY2Nlc3MgZ2xvYmFsUHJvcGVydHlBY2Nlc3NGb3JNZW1iZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIGpzQXN0Lk5hbWUgbmFtZSA9IG5hbWVyLmdsb2JhbFByb3BlcnR5TmFtZUZvck1lbWJlcihlbGVtZW50KTsKICAgIGpzQXN0LlByb3BlcnR5QWNjZXNzIHBhID0gbmV3IGpzQXN0LlByb3BlcnR5QWNjZXNzKAogICAgICAgIG5ldyBqc0FzdC5WYXJpYWJsZVVzZShuYW1lci5nbG9iYWxPYmplY3RGb3JNZW1iZXIoZWxlbWVudCkpLCBuYW1lKTsKICAgIHJldHVybiBwYTsKICB9CgogIGpzQXN0LlByb3BlcnR5QWNjZXNzIGdsb2JhbFByb3BlcnR5QWNjZXNzRm9yQ2xhc3MoQ2xhc3NFbnRpdHkgZWxlbWVudCkgewogICAganNBc3QuTmFtZSBuYW1lID0gbmFtZXIuZ2xvYmFsUHJvcGVydHlOYW1lRm9yQ2xhc3MoZWxlbWVudCk7CiAgICBqc0FzdC5Qcm9wZXJ0eUFjY2VzcyBwYSA9IG5ldyBqc0FzdC5Qcm9wZXJ0eUFjY2VzcygKICAgICAgICBuZXcganNBc3QuVmFyaWFibGVVc2UobmFtZXIuZ2xvYmFsT2JqZWN0Rm9yQ2xhc3MoZWxlbWVudCkpLCBuYW1lKTsKICAgIHJldHVybiBwYTsKICB9CgogIGpzQXN0LlByb3BlcnR5QWNjZXNzIGdsb2JhbFByb3BlcnR5QWNjZXNzRm9yVHlwZShFbnRpdHkgZWxlbWVudCkgewogICAganNBc3QuTmFtZSBuYW1lID0gbmFtZXIuZ2xvYmFsUHJvcGVydHlOYW1lRm9yVHlwZShlbGVtZW50KTsKICAgIGpzQXN0LlByb3BlcnR5QWNjZXNzIHBhID0gbmV3IGpzQXN0LlByb3BlcnR5QWNjZXNzKAogICAgICAgIG5ldyBqc0FzdC5WYXJpYWJsZVVzZShuYW1lci5nbG9iYWxPYmplY3RGb3JUeXBlKGVsZW1lbnQpKSwgbmFtZSk7CiAgICByZXR1cm4gcGE7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5Qcm9wZXJ0eUFjY2VzcyBzdGF0aWNGaWVsZEFjY2VzcyhGaWVsZEVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gZ2xvYmFsUHJvcGVydHlBY2Nlc3NGb3JNZW1iZXIoZWxlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5Qcm9wZXJ0eUFjY2VzcyBzdGF0aWNGdW5jdGlvbkFjY2VzcyhGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gZ2xvYmFsUHJvcGVydHlBY2Nlc3NGb3JNZW1iZXIoZWxlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5Qcm9wZXJ0eUFjY2VzcyBjb25zdHJ1Y3RvckFjY2VzcyhDbGFzc0VudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gZ2xvYmFsUHJvcGVydHlBY2Nlc3NGb3JDbGFzcyhlbGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gaW50ZXJjZXB0b3JDbGFzc0FjY2VzcyhDbGFzc0VudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gZ2xvYmFsUHJvcGVydHlBY2Nlc3NGb3JDbGFzcyhlbGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gdHlwZUFjY2VzcyhFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIGdsb2JhbFByb3BlcnR5QWNjZXNzRm9yVHlwZShlbGVtZW50KTsKICB9Cn0KgUMATk48AS4BRwEZMSkjMCQhRisxKi89ATkVMTgWAVBOBE0tJSAnKBQbATUBDlAMOjciAT0dPTMiASQMIBJQGwQBGB1PFQQBDCUBOEUBO0g4BAFLIUc6BAE/QTkEAT4/MAQBNikEAT8GQzwsBAE3Bko2KQQBNzIrPAQBQz8/BAFFOy4EATsGLSoiBAE3OTAEARhFFUoqLj8EASs8QBFRKhFLQlFAQAgEARdKGBY6HB0qJiYoKSQdIh8nIyYeKjEhERAXJRgtHi04Nkg+EwgEAgEgOB8BTzswAgEZIQFKQTIBSyFQATtRAT9AAT8GQ0EBOwE3Bko1ATckOgFFOgE7KQFMNgE6QgE+PgE3OAFIJgIBMAwdEwFNQjhMDwQBS0E4Sw8EAUVAOEoPBAEMQDMEAQxGMwQBDEAyBAEMQTIEAQwwMQQCATZwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL2NvZGVfZW1pdHRlcl90YXNrLmRhcnRKc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfZW1pdHRlci9pbnN0YW50aWF0aW9uX3N0dWJfZ2VuZXJhdG9yLmRhcnSd4y8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuanNfZW1pdHRlci5pbnN0YW50aWF0aW9uX3N0dWJfZ2VuZXJhdG9yOwoKaW1wb3J0ICcuLi9jb21tb24vbmFtZXMuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgQ29tbW9uRWxlbWVudHM7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vaW8vc291cmNlX2luZm9ybWF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIGFzIGpzQXN0OwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIHNob3cganM7CmltcG9ydCAnLi4vanNfYmFja2VuZC9uYW1lci5kYXJ0JyBzaG93IE5hbWVyOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NhbGxfc3RydWN0dXJlLmRhcnQnIHNob3cgQ2FsbFN0cnVjdHVyZTsKaW1wb3J0ICcuLi91bml2ZXJzZS9jb2RlZ2VuX3dvcmxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCcgc2hvdyBTZWxlY3RvcjsKaW1wb3J0ICcuLi91bml2ZXJzZS93b3JsZF9idWlsZGVyLmRhcnQnIHNob3cgU2VsZWN0b3JDb25zdHJhaW50czsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKCmltcG9ydCAnbW9kZWwuZGFydCc7CgppbXBvcnQgJ2NvZGVfZW1pdHRlcl90YXNrLmRhcnQnIHNob3cgQ29kZUVtaXR0ZXJUYXNrLCBFbWl0dGVyOwoKLy8gR2VuZXJhdG9yIG9mIHN0dWJzIHJlcXVpcmVkIGZvciBJbnN0YW50aWF0aW9uIGNsYXNzZXMuCmNsYXNzIEluc3RhbnRpYXRpb25TdHViR2VuZXJhdG9yIHsKICBmaW5hbCBDb2RlRW1pdHRlclRhc2sgX2VtaXR0ZXJUYXNrOwogIGZpbmFsIENvbW1vbkVsZW1lbnRzIF9jb21tb25FbGVtZW50czsKICBmaW5hbCBOYW1lciBfbmFtZXI7CiAgZmluYWwgQ29kZWdlbldvcmxkQnVpbGRlciBfY29kZWdlbldvcmxkQnVpbGRlcjsKICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwogIC8vIGlnbm9yZTogVU5VU0VEX0ZJRUxECiAgZmluYWwgU291cmNlSW5mb3JtYXRpb25TdHJhdGVneSBfc291cmNlSW5mb3JtYXRpb25TdHJhdGVneTsKCiAgSW5zdGFudGlhdGlvblN0dWJHZW5lcmF0b3IoCiAgICAgIHRoaXMuX2VtaXR0ZXJUYXNrLAogICAgICB0aGlzLl9jb21tb25FbGVtZW50cywKICAgICAgdGhpcy5fbmFtZXIsCiAgICAgIHRoaXMuX2NvZGVnZW5Xb3JsZEJ1aWxkZXIsCiAgICAgIHRoaXMuX2Nsb3NlZFdvcmxkLAogICAgICB0aGlzLl9zb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5KTsKCiAgRW1pdHRlciBnZXQgX2VtaXR0ZXIgPT4gX2VtaXR0ZXJUYXNrLmVtaXR0ZXI7CgogIC8vLyBHZW5lcmF0ZXMgYSBzdHViIHRvIGZvcndhcmQgYSBjYWxsIHNlbGVjdG9yIHdpdGggbm8gdHlwZSBhcmd1bWVudHMgdG8gYQogIC8vLyBjYWxsIHNlbGVjdG9yIHdpdGggc3RvcmVkIHR5cGVzLgogIC8vLwogIC8vLyBbaW5zdGFudGlhdGlvbkNsYXNzXSBpcyB0aGUgY2xhc3MgY29udGFpbmluZyB0aGUgY2FwdHVyZWQgdHlwZSBhcmd1bWVudHMuCiAgLy8vIFtjYWxsU2VsZWN0b3JdIGlzIHRoZSBzZWxlY3RvciB3aXRoIG5vIHR5cGUgYXJndW1lbnRzLiBbdGFyZ2V0U2VsZWN0b3JdIGlzCiAgLy8vIHRoZSBzZWxlY3RvciBhY2NlcHRpbmcgdGhlIHR5cGUgYXJndW1lbnRzLgogIFBhcmFtZXRlclN0dWJNZXRob2QgX2dlbmVyYXRlU3R1YigKICAgICAgQ2xhc3NFbnRpdHkgaW5zdGFudGlhdGlvbkNsYXNzLAogICAgICBGaWVsZEVudGl0eSBmdW5jdGlvbkZpZWxkLAogICAgICBTZWxlY3RvciBjYWxsU2VsZWN0b3IsCiAgICAgIFNlbGVjdG9yIHRhcmdldFNlbGVjdG9yKSB7CiAgICAvLyBUT0RPKHNyYSk6IEdlbmVyYXRlIHNvdXJjZSBpbmZvcm1hdGlvbiBmb3Igc3R1YiB0aGF0IGhhcyBubyBtZW1iZXIuCiAgICAvLwogICAgLy9Tb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIgc291cmNlSW5mb3JtYXRpb25CdWlsZGVyID0KICAgIC8vICAgIF9zb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5LmNyZWF0ZUJ1aWxkZXJGb3JDb250ZXh0KG1lbWJlcik7CiAgICAvL1NvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0KICAgIC8vICAgIHNvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZFN0dWIobWVtYmVyLCBjYWxsU3RydWN0dXJlKTsKCiAgICBhc3NlcnQoY2FsbFNlbGVjdG9yLnR5cGVBcmd1bWVudENvdW50ID09IDApOwogICAgaW50IHR5cGVBcmd1bWVudENvdW50ID0gdGFyZ2V0U2VsZWN0b3IudHlwZUFyZ3VtZW50Q291bnQ7CiAgICBhc3NlcnQodHlwZUFyZ3VtZW50Q291bnQgPiAwKTsKCiAgICAvLyBUaGUgZm9yd2FyZGluZyBzdHViIGZvciB0aHJlZSBhcmd1bWVudHMgb2YgYW4gaW5zdGFudGlhdGlvbiB3aXRoIHR3byB0eXBlCiAgICAvLyBhcmd1bWVudHMgbG9va3MgbGlrZSB0aGlzOgogICAgLy8KICAgIC8vIGBgYAogICAgLy8gY2FsbCQzOiBmdW5jdGlvbihhMCwgYTEsIGEyKSB7CiAgICAvLyAgIHJldHVybiB0aGlzLl9mLmNhbGwkMiQzKGEwLCBhMSwgYTIsIHRoaXMuJHRpWzBdLCB0aGlzLiR0aVsxXSk7CiAgICAvLyB9CiAgICAvLyBgYGAKCiAgICBMaXN0PGpzQXN0LlBhcmFtZXRlcj4gcGFyYW1ldGVycyA9IDxqc0FzdC5QYXJhbWV0ZXI+W107CiAgICBMaXN0PGpzQXN0LkV4cHJlc3Npb24+IGFyZ3VtZW50cyA9IDxqc0FzdC5FeHByZXNzaW9uPltdOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbFNlbGVjdG9yLmFyZ3VtZW50Q291bnQ7IGkrKykgewogICAgICBTdHJpbmcganNOYW1lID0gJ2EkaSc7CiAgICAgIGFyZ3VtZW50cy5hZGQoanMoJyMnLCBqc05hbWUpKTsKICAgICAgcGFyYW1ldGVycy5hZGQobmV3IGpzQXN0LlBhcmFtZXRlcihqc05hbWUpKTsKICAgIH0KCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhcmdldFNlbGVjdG9yLnR5cGVBcmd1bWVudENvdW50OyBpKyspIHsKICAgICAgYXJndW1lbnRzLmFkZChqcygndGhpcy4jWyNdJywgW19uYW1lci5ydGlGaWVsZEpzTmFtZSwganMubnVtYmVyKGkpXSkpOwogICAgfQoKICAgIGpzQXN0LkZ1biBmdW5jdGlvbiA9IGpzKCdmdW5jdGlvbigjKSB7IHJldHVybiB0aGlzLiMuIygjKTsgfScsIFsKICAgICAgcGFyYW1ldGVycywKICAgICAgX25hbWVyLmZpZWxkUHJvcGVydHlOYW1lKGZ1bmN0aW9uRmllbGQpLAogICAgICBfbmFtZXIuaW52b2NhdGlvbk5hbWUodGFyZ2V0U2VsZWN0b3IpLAogICAgICBhcmd1bWVudHMsCiAgICBdKTsKICAgIC8vIFRPRE8oc3JhKTogLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7CgogICAganNBc3QuTmFtZSBuYW1lID0gX25hbWVyLmludm9jYXRpb25OYW1lKGNhbGxTZWxlY3Rvcik7CiAgICByZXR1cm4gbmV3IFBhcmFtZXRlclN0dWJNZXRob2QobmFtZSwgbnVsbCwgZnVuY3Rpb24pOwogIH0KCiAgLy8vIEdlbmVyYXRlcyBhIHN0dWIgZm9yIGEgJ3NpZ25hdHVyZScgc2VsZWN0b3IuIFRoZSBzdHViIGNhbGxzIHRoZSB1bmRlcmx5aW5nCiAgLy8vIGZ1bmN0aW9uJ3MgJ3NpZ25hdHVyZScgbWV0aG9kIGFuZCBjYWxscyBhIGhlbHBlciB0byBzdWJzaXR1dGUgdGhlIHR5cGUKICAvLy8gcGFyYW1ldGVycyBpbiB0aGUgdHlwZSB0ZXJtLiBUaGUgc3R1YiBsb29rcyBsaWtlIHRoaXM6CiAgLy8vCiAgLy8vIGBgYAogIC8vLyAkc2lnbmF0dXJlOjogZnVuY3Rpb24oKSB7CiAgLy8vICAgcmV0dXJuIEguaW5zdGFudGlhdGVkR2VuZXJpY0Z1bmN0aW9uVHlwZSgKICAvLy8gICAgICAgSC5leHRyYWN0RnVuY3Rpb25UeXBlT2JqZWN0RnJvbUludGVybmFsKHRoaXMuX2dlbmVyaWNDbG9zdXJlKSwKICAvLy8gICAgICAgdGhpcy4kdGkpOwogIC8vLyB9CiAgLy8vIGBgYAogIFBhcmFtZXRlclN0dWJNZXRob2QgX2dlbmVyYXRlU2lnbmF0dXJlU3R1YihGaWVsZEVudGl0eSBmdW5jdGlvbkZpZWxkKSB7CiAgICBqc0FzdC5OYW1lIG9wZXJhdG9yU2lnbmF0dXJlID0gX25hbWVyLmFzTmFtZShfbmFtZXIub3BlcmF0b3JTaWduYXR1cmUpOwoKICAgIGpzQXN0LkZ1biBmdW5jdGlvbiA9IGpzKCdmdW5jdGlvbigpIHsgcmV0dXJuICMoIyh0aGlzLiMpLCB0aGlzLiMpOyB9JywgWwogICAgICBfZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2VzcygKICAgICAgICAgIF9jb21tb25FbGVtZW50cy5pbnN0YW50aWF0ZWRHZW5lcmljRnVuY3Rpb25UeXBlKSwKICAgICAgX2VtaXR0ZXIuc3RhdGljRnVuY3Rpb25BY2Nlc3MoCiAgICAgICAgICBfY29tbW9uRWxlbWVudHMuZXh0cmFjdEZ1bmN0aW9uVHlwZU9iamVjdEZyb21JbnRlcm5hbCksCiAgICAgIF9uYW1lci5maWVsZFByb3BlcnR5TmFtZShmdW5jdGlvbkZpZWxkKSwKICAgICAgX25hbWVyLnJ0aUZpZWxkSnNOYW1lLAogICAgXSk7CiAgICAvLyBUT0RPKHNyYSk6IEdlbmVyYXRlIHNvdXJjZSBpbmZvcm1hdGlvbiBmb3Igc3R1YiB0aGF0IGhhcyBubyBtZW1iZXIuCiAgICAvLyBUT0RPKHNyYSk6IC53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pOwoKICAgIHJldHVybiBuZXcgUGFyYW1ldGVyU3R1Yk1ldGhvZChvcGVyYXRvclNpZ25hdHVyZSwgbnVsbCwgZnVuY3Rpb24pOwogIH0KCiAgLy8gUmV0dXJucyBhbGwgc3R1YnMgZm9yIGFuIGluc3RhbnRpYXRpb24gY2xhc3MuCiAgLy8KICBMaXN0PFN0dWJNZXRob2Q+IGdlbmVyYXRlU3R1YnMoCiAgICAgIENsYXNzRW50aXR5IGluc3RhbnRpYXRpb25DbGFzcywgRnVuY3Rpb25FbnRpdHkgbWVtYmVyKSB7CiAgICAvLyAxLiBGaW5kIHRoZSBudW1iZXIgb2YgdHlwZSBwYXJhbWV0ZXJzIGluIFtpbnN0YW50aWF0aW9uQ2xhc3NdLgogICAgaW50IHR5cGVBcmd1bWVudENvdW50ID0gX2Nsb3NlZFdvcmxkLmRhcnRUeXBlcwogICAgICAgIC5nZXRUaGlzVHlwZShpbnN0YW50aWF0aW9uQ2xhc3MpCiAgICAgICAgLnR5cGVBcmd1bWVudHMKICAgICAgICAubGVuZ3RoOwogICAgYXNzZXJ0KHR5cGVBcmd1bWVudENvdW50ID4gMCk7CgogICAgLy8gMi4gRmluZCB0aGUgZnVuY3Rpb24gZmllbGQgYWNjZXNzIHBhdGguCiAgICBGaWVsZEVudGl0eSBmdW5jdGlvbkZpZWxkOwogICAgX2NvZGVnZW5Xb3JsZEJ1aWxkZXIuZm9yRWFjaEluc3RhbmNlRmllbGQoaW5zdGFudGlhdGlvbkNsYXNzLAogICAgICAgIChDbGFzc0VudGl0eSBlbmNsb3NpbmcsIEZpZWxkRW50aXR5IGZpZWxkLCB7Ym9vbCBpc0VsaWRlZH0pIHsKICAgICAgaWYgKGlzRWxpZGVkKSByZXR1cm47CiAgICAgIGlmIChmaWVsZC5uYW1lID09ICdfZ2VuZXJpY0Nsb3N1cmUnKSBmdW5jdGlvbkZpZWxkID0gZmllbGQ7CiAgICB9KTsKICAgIGFzc2VydChmdW5jdGlvbkZpZWxkICE9IG51bGwsCiAgICAgICAgIkNhbid0IGZpbmQgQ2xvc3VyZSBmaWVsZCBvZiAkaW5zdGFudGlhdGlvbkNsYXNzIik7CgogICAgU3RyaW5nIGNhbGwgPSBfbmFtZXIuY2xvc3VyZUludm9jYXRpb25TZWxlY3Rvck5hbWU7CiAgICBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+IGNhbGxTZWxlY3RvcnMgPQogICAgICAgIF9jb2RlZ2VuV29ybGRCdWlsZGVyLmludm9jYXRpb25zQnlOYW1lKGNhbGwpOwoKICAgIFNldDxQYXJhbWV0ZXJTdHJ1Y3R1cmU+IGNvbXB1dGVMaXZlUGFyYW1ldGVyU3RydWN0dXJlcygpIHsKICAgICAgU2V0PFBhcmFtZXRlclN0cnVjdHVyZT4gcGFyYW1ldGVyU3RydWN0dXJlcyA9CiAgICAgICAgICBuZXcgU2V0PFBhcmFtZXRlclN0cnVjdHVyZT4oKTsKCiAgICAgIHZvaWQgcHJvY2VzcyhJdGVyYWJsZTxGdW5jdGlvbkVudGl0eT4gZnVuY3Rpb25zKSB7CiAgICAgICAgZm9yIChGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiBpbiBmdW5jdGlvbnMpIHsKICAgICAgICAgIGlmIChmdW5jdGlvbi5wYXJhbWV0ZXJTdHJ1Y3R1cmUudHlwZVBhcmFtZXRlcnMgPT0gdHlwZUFyZ3VtZW50Q291bnQpIHsKICAgICAgICAgICAgcGFyYW1ldGVyU3RydWN0dXJlcy5hZGQoZnVuY3Rpb24ucGFyYW1ldGVyU3RydWN0dXJlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHByb2Nlc3MoX2NvZGVnZW5Xb3JsZEJ1aWxkZXIuY2xvc3VyaXplZFN0YXRpY3MpOwogICAgICBwcm9jZXNzKF9jb2RlZ2VuV29ybGRCdWlsZGVyLmNsb3N1cml6ZWRNZW1iZXJzKTsKICAgICAgcHJvY2VzcyhfY29kZWdlbldvcmxkQnVpbGRlci5nZW5lcmljSW5zdGFuY2VNZXRob2RzLndoZXJlKAogICAgICAgICAgKEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uKSA9PgogICAgICAgICAgICAgIGZ1bmN0aW9uLm5hbWUgPT0gSWRlbnRpZmllcnMuY2FsbCAmJgogICAgICAgICAgICAgIGZ1bmN0aW9uLmVuY2xvc2luZ0NsYXNzLmlzQ2xvc3VyZSkpOwoKICAgICAgcmV0dXJuIHBhcmFtZXRlclN0cnVjdHVyZXM7CiAgICB9CgogICAgTGlzdDxTdHViTWV0aG9kPiBzdHVicyA9IDxTdHViTWV0aG9kPltdOwoKICAgIC8vIEZvciBldmVyeSBjYWxsLXNlbGVjdG9yIGdlbmVyYXRlIGEgc3R1YiB0byB0aGUgY29ycmVzcG9uZGluZyBzZWxlY3RvcgogICAgLy8gd2l0aCBmaWxsZWQtaW4gdHlwZSBhcmd1bWVudHMuCgogICAgaWYgKGNhbGxTZWxlY3RvcnMgIT0gbnVsbCkgewogICAgICBTZXQ8UGFyYW1ldGVyU3RydWN0dXJlPiBwYXJhbWV0ZXJTdHJ1Y3R1cmVzOwogICAgICBmb3IgKFNlbGVjdG9yIHNlbGVjdG9yIGluIGNhbGxTZWxlY3RvcnMua2V5cykgewogICAgICAgIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSA9IHNlbGVjdG9yLmNhbGxTdHJ1Y3R1cmU7CiAgICAgICAgaWYgKGNhbGxTdHJ1Y3R1cmUudHlwZUFyZ3VtZW50Q291bnQgIT0gMCkgY29udGludWU7CiAgICAgICAgQ2FsbFN0cnVjdHVyZSBnZW5lcmljQ2FsbFN0cnVjdHVyZSA9CiAgICAgICAgICAgIGNhbGxTdHJ1Y3R1cmUud2l0aFR5cGVBcmd1bWVudENvdW50KHR5cGVBcmd1bWVudENvdW50KTsKICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID8/PSBjb21wdXRlTGl2ZVBhcmFtZXRlclN0cnVjdHVyZXMoKTsKICAgICAgICBmb3IgKFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUgaW4gcGFyYW1ldGVyU3RydWN0dXJlcykgewogICAgICAgICAgaWYgKGdlbmVyaWNDYWxsU3RydWN0dXJlLnNpZ25hdHVyZUFwcGxpZXMocGFyYW1ldGVyU3RydWN0dXJlKSkgewogICAgICAgICAgICBTZWxlY3RvciBnZW5lcmljU2VsZWN0b3IgPQogICAgICAgICAgICAgICAgbmV3IFNlbGVjdG9yLmNhbGwoc2VsZWN0b3IubWVtYmVyTmFtZSwgZ2VuZXJpY0NhbGxTdHJ1Y3R1cmUpOwogICAgICAgICAgICBzdHVicy5hZGQoX2dlbmVyYXRlU3R1YigKICAgICAgICAgICAgICAgIGluc3RhbnRpYXRpb25DbGFzcywgZnVuY3Rpb25GaWVsZCwgc2VsZWN0b3IsIGdlbmVyaWNTZWxlY3RvcikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBzdHVicy5hZGQoX2dlbmVyYXRlU2lnbmF0dXJlU3R1YihmdW5jdGlvbkZpZWxkKSk7CgogICAgcmV0dXJuIHN0dWJzOwogIH0KfQqAzgBOTjwBOQEfNiQoISAuPTEyQioBFQE/ATojJigWMiMaPgEeGRwTIRkoATABTicGUFExJSYhHSFLBzpGLEUBMT4jAVEiBwsmSAkLATw9ATsdJjMGAUFNBgFFEi8tEQg9ATs6BAFRTT0GCiAySxcICkpMAU0lPCVCLx0ISz0BRwQBMwUiP0YzKRcRIwEvH0JGHEIIIjwBODc2AT80KQE5NVFCDAoIATc3QSczMwEiBgEtAU0mASEzNj48LURCTUsnTiVQEwwKCAYBNgESBAIBQXBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvaW5zdGFudGlhdGlvbl9zdHViX2dlbmVyYXRvci5kYXJ0SHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2VtaXR0ZXIvaW50ZXJjZXB0b3Jfc3R1Yl9nZW5lcmF0b3IuZGFydMAAQ2YvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmpzX2VtaXR0ZXIuaW50ZXJjZXB0b3Jfc3R1Yl9nZW5lcmF0b3I7CgppbXBvcnQgJ3BhY2thZ2U6anNfcnVudGltZS9zaGFyZWQvZW1iZWRkZWRfbmFtZXMuZGFydCcgYXMgZW1iZWRkZWROYW1lczsKCmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCcgc2hvdyBJbnRlcmZhY2VUeXBlOwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIGFzIGpzQXN0OwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIHNob3cganM7CmltcG9ydCAnLi4vanNfYmFja2VuZC9uYW1lci5kYXJ0JyBzaG93IE5hbWVyOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvY3VzdG9tX2VsZW1lbnRzX2FuYWx5c2lzLmRhcnQnCiAgICBzaG93IEN1c3RvbUVsZW1lbnRzQ29kZWdlbkFuYWx5c2lzOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9pbnRlcmNlcHRvcl9kYXRhLmRhcnQnOwppbXBvcnQgJy4uL25hdGl2ZS9lbnF1ZXVlLmRhcnQnOwppbXBvcnQgJy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY29kZWdlbl93b3JsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3I7CmltcG9ydCAnLi4vd29ybGQuZGFydCcgc2hvdyBKQ2xvc2VkV29ybGQ7CgppbXBvcnQgJ2NvZGVfZW1pdHRlcl90YXNrLmRhcnQnIHNob3cgQ29kZUVtaXR0ZXJUYXNrLCBFbWl0dGVyOwoKY2xhc3MgSW50ZXJjZXB0b3JTdHViR2VuZXJhdG9yIHsKICBmaW5hbCBDb21waWxlck9wdGlvbnMgX29wdGlvbnM7CiAgZmluYWwgQ29tbW9uRWxlbWVudHMgX2NvbW1vbkVsZW1lbnRzOwogIGZpbmFsIENvZGVFbWl0dGVyVGFzayBfZW1pdHRlclRhc2s7CiAgZmluYWwgTmF0aXZlQ29kZWdlbkVucXVldWVyIF9uYXRpdmVDb2RlZ2VuRW5xdWV1ZXI7CiAgZmluYWwgTmFtZXIgX25hbWVyOwogIGZpbmFsIE9uZVNob3RJbnRlcmNlcHRvckRhdGEgX29uZVNob3RJbnRlcmNlcHRvckRhdGE7CiAgZmluYWwgQ3VzdG9tRWxlbWVudHNDb2RlZ2VuQW5hbHlzaXMgX2N1c3RvbUVsZW1lbnRzQ29kZWdlbkFuYWx5c2lzOwogIGZpbmFsIENvZGVnZW5Xb3JsZEJ1aWxkZXIgX2NvZGVnZW5Xb3JsZEJ1aWxkZXI7CiAgZmluYWwgSkNsb3NlZFdvcmxkIF9jbG9zZWRXb3JsZDsKCiAgSW50ZXJjZXB0b3JTdHViR2VuZXJhdG9yKAogICAgICB0aGlzLl9vcHRpb25zLAogICAgICB0aGlzLl9jb21tb25FbGVtZW50cywKICAgICAgdGhpcy5fZW1pdHRlclRhc2ssCiAgICAgIHRoaXMuX25hdGl2ZUNvZGVnZW5FbnF1ZXVlciwKICAgICAgdGhpcy5fbmFtZXIsCiAgICAgIHRoaXMuX29uZVNob3RJbnRlcmNlcHRvckRhdGEsCiAgICAgIHRoaXMuX2N1c3RvbUVsZW1lbnRzQ29kZWdlbkFuYWx5c2lzLAogICAgICB0aGlzLl9jb2RlZ2VuV29ybGRCdWlsZGVyLAogICAgICB0aGlzLl9jbG9zZWRXb3JsZCk7CgogIE5hdGl2ZURhdGEgZ2V0IF9uYXRpdmVEYXRhID0+IF9jbG9zZWRXb3JsZC5uYXRpdmVEYXRhOwoKICBJbnRlcmNlcHRvckRhdGEgZ2V0IF9pbnRlcmNlcHRvckRhdGEgPT4gX2Nsb3NlZFdvcmxkLmludGVyY2VwdG9yRGF0YTsKCiAgRW1pdHRlciBnZXQgX2VtaXR0ZXIgPT4gX2VtaXR0ZXJUYXNrLmVtaXR0ZXI7CgogIGpzQXN0LkV4cHJlc3Npb24gZ2VuZXJhdGVHZXRJbnRlcmNlcHRvck1ldGhvZChTZXQ8Q2xhc3NFbnRpdHk+IGNsYXNzZXMpIHsKICAgIGpzQXN0LkV4cHJlc3Npb24gaW50ZXJjZXB0b3JGb3IoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICAgIHJldHVybiBfZW1pdHRlclRhc2suaW50ZXJjZXB0b3JQcm90b3R5cGVBY2Nlc3MoY2xzKTsKICAgIH0KCiAgICAvLy8gQnVpbGQgYSBKYXZhU2NyaXB0IEFTVCBub2RlIGZvciBkb2luZyBhIHR5cGUgY2hlY2sgb24KICAgIC8vLyBbY2xzXS4gW2Nsc10gbXVzdCBiZSBhIG5vbi1uYXRpdmUgaW50ZXJjZXB0b3IgY2xhc3MuCiAgICBqc0FzdC5TdGF0ZW1lbnQgYnVpbGRJbnRlcmNlcHRvckNoZWNrKENsYXNzRW50aXR5IGNscykgewogICAgICBqc0FzdC5FeHByZXNzaW9uIGNvbmRpdGlvbjsKICAgICAgYXNzZXJ0KF9pbnRlcmNlcHRvckRhdGEuaXNJbnRlcmNlcHRlZENsYXNzKGNscykpOwogICAgICBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5qc0Jvb2xDbGFzcykgewogICAgICAgIGNvbmRpdGlvbiA9IGpzKCcodHlwZW9mIHJlY2VpdmVyKSA9PSAiYm9vbGVhbiInKTsKICAgICAgfSBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzSW50Q2xhc3MgfHwKICAgICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNEb3VibGVDbGFzcyB8fAogICAgICAgICAgY2xzID09IF9jb21tb25FbGVtZW50cy5qc051bWJlckNsYXNzKSB7CiAgICAgICAgdGhyb3cgJ2ludGVybmFsIGVycm9yJzsKICAgICAgfSBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzQXJyYXlDbGFzcyB8fAogICAgICAgICAgY2xzID09IF9jb21tb25FbGVtZW50cy5qc011dGFibGVBcnJheUNsYXNzIHx8CiAgICAgICAgICBjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzRml4ZWRBcnJheUNsYXNzIHx8CiAgICAgICAgICBjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzRXh0ZW5kYWJsZUFycmF5Q2xhc3MpIHsKICAgICAgICBjb25kaXRpb24gPSBqcygncmVjZWl2ZXIuY29uc3RydWN0b3IgPT0gQXJyYXknKTsKICAgICAgfSBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzU3RyaW5nQ2xhc3MpIHsKICAgICAgICBjb25kaXRpb24gPSBqcygnKHR5cGVvZiByZWNlaXZlcikgPT0gInN0cmluZyInKTsKICAgICAgfSBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzTnVsbENsYXNzKSB7CiAgICAgICAgY29uZGl0aW9uID0ganMoJ3JlY2VpdmVyID09IG51bGwnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyAnaW50ZXJuYWwgZXJyb3InOwogICAgICB9CiAgICAgIHJldHVybiBqcy5zdGF0ZW1lbnQoJ2lmICgjKSByZXR1cm4gIycsIFtjb25kaXRpb24sIGludGVyY2VwdG9yRm9yKGNscyldKTsKICAgIH0KCiAgICBib29sIGhhc0FycmF5ID0gZmFsc2U7CiAgICBib29sIGhhc0Jvb2wgPSBmYWxzZTsKICAgIGJvb2wgaGFzRG91YmxlID0gZmFsc2U7CiAgICBib29sIGhhc0ludCA9IGZhbHNlOwogICAgYm9vbCBoYXNOdWxsID0gZmFsc2U7CiAgICBib29sIGhhc051bWJlciA9IGZhbHNlOwogICAgYm9vbCBoYXNTdHJpbmcgPSBmYWxzZTsKICAgIGJvb2wgaGFzTmF0aXZlID0gZmFsc2U7CiAgICBib29sIGFueU5hdGl2ZUNsYXNzZXMgPSBfbmF0aXZlQ29kZWdlbkVucXVldWVyLmhhc0luc3RhbnRpYXRlZE5hdGl2ZUNsYXNzZXM7CgogICAgZm9yIChDbGFzc0VudGl0eSBjbHMgaW4gY2xhc3NlcykgewogICAgICBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5qc0FycmF5Q2xhc3MgfHwKICAgICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNNdXRhYmxlQXJyYXlDbGFzcyB8fAogICAgICAgICAgY2xzID09IF9jb21tb25FbGVtZW50cy5qc0ZpeGVkQXJyYXlDbGFzcyB8fAogICAgICAgICAgY2xzID09IF9jb21tb25FbGVtZW50cy5qc0V4dGVuZGFibGVBcnJheUNsYXNzKQogICAgICAgIGhhc0FycmF5ID0gdHJ1ZTsKICAgICAgZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5qc0Jvb2xDbGFzcykKICAgICAgICBoYXNCb29sID0gdHJ1ZTsKICAgICAgZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5qc0RvdWJsZUNsYXNzKQogICAgICAgIGhhc0RvdWJsZSA9IHRydWU7CiAgICAgIGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNJbnRDbGFzcykKICAgICAgICBoYXNJbnQgPSB0cnVlOwogICAgICBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzTnVsbENsYXNzKQogICAgICAgIGhhc051bGwgPSB0cnVlOwogICAgICBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzTnVtYmVyQ2xhc3MpCiAgICAgICAgaGFzTnVtYmVyID0gdHJ1ZTsKICAgICAgZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5qc1N0cmluZ0NsYXNzKQogICAgICAgIGhhc1N0cmluZyA9IHRydWU7CiAgICAgIGVsc2UgewogICAgICAgIC8vIFRoZSBzZXQgb2YgY2xhc3NlcyBpbmNsdWRlcyBjbGFzc2VzIG1peGVkLWluIHRvIGludGVyY2VwdG9yIGNsYXNzZXMKICAgICAgICAvLyBhbmQgdXNlciBleHRlbnNpb25zIG9mIG5hdGl2ZSBjbGFzc2VzLgogICAgICAgIC8vCiAgICAgICAgLy8gVGhlIHNldCBvZiBjbGFzc2VzIGFsc28gaW5jbHVkZXMgdGhlICdwcmltaXRpdmUnIGludGVyY2VwdG9yCiAgICAgICAgLy8gUGxhaW5KYXZhU2NyaXB0T2JqZWN0IGV2ZW4gd2hlbiBpdCBoYXMgbm90IGJlZW4gcmVzb2x2ZWQsIHNpbmNlIGl0IGlzCiAgICAgICAgLy8gb25seSByZXNvbHZlZCB0aHJvdWdoIHRoZSByZWZlcmVuY2UgaW4gZ2V0TmF0aXZlSW50ZXJjZXB0b3Igd2hlbgogICAgICAgIC8vIGdldE5hdGl2ZUludGVyY2VwdG9yIGlzIG1hcmtlZCBhcyB1c2VkLiAgR3VhcmQgYWdhaW5zdCBwcm9iaW5nCiAgICAgICAgLy8gdW5yZXNvbHZlZCBQbGFpbkphdmFTY3JpcHRPYmplY3QgYnkgdGVzdGluZyBmb3IgYW55TmF0aXZlQ2xhc3Nlcy4KCiAgICAgICAgaWYgKGFueU5hdGl2ZUNsYXNzZXMpIHsKICAgICAgICAgIGlmIChfbmF0aXZlRGF0YS5pc05hdGl2ZU9yRXh0ZW5kc05hdGl2ZShjbHMpKSBoYXNOYXRpdmUgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGhhc0RvdWJsZSkgewogICAgICBoYXNOdW1iZXIgPSB0cnVlOwogICAgfQogICAgaWYgKGhhc0ludCkgaGFzTnVtYmVyID0gdHJ1ZTsKCiAgICBpZiAoY2xhc3Nlcy5jb250YWluc0FsbChfaW50ZXJjZXB0b3JEYXRhLmludGVyY2VwdGVkQ2xhc3NlcykpIHsKICAgICAgLy8gSS5lLiB0aGlzIGlzIHRoZSBnZW5lcmFsIGludGVyY2VwdG9yLgogICAgICBoYXNOYXRpdmUgPSBhbnlOYXRpdmVDbGFzc2VzOwogICAgfQoKICAgIExpc3Q8anNBc3QuU3RhdGVtZW50PiBzdGF0ZW1lbnRzID0gPGpzQXN0LlN0YXRlbWVudD5bXTsKCiAgICBpZiAoaGFzTnVtYmVyKSB7CiAgICAgIGpzQXN0LlN0YXRlbWVudCB3aGVuTnVtYmVyOwoKICAgICAgLy8vIE5vdGU6IHRoZXJlIGFyZSB0d28gbnVtYmVyIGNsYXNzZXMgaW4gcGxheTogRGFydCdzIFtudW1dLAogICAgICAvLy8gYW5kIEphdmFTY3JpcHQncyBOdW1iZXIgKHR5cGVvZiByZWNlaXZlciA9PSAnbnVtYmVyJykuICBUaGlzCiAgICAgIC8vLyBpcyB0aGUgZmFsbGJhY2sgdXNlZCB3aGVuIHdlIGhhdmUgZGV0ZXJtaW5lZCB0aGF0IHJlY2VpdmVyCiAgICAgIC8vLyBpcyBhIEphdmFTY3JpcHQgTnVtYmVyLgogICAgICBqc0FzdC5FeHByZXNzaW9uIGludGVyY2VwdG9yRm9yTnVtYmVyID0gaW50ZXJjZXB0b3JGb3IoaGFzRG91YmxlCiAgICAgICAgICA/IF9jb21tb25FbGVtZW50cy5qc0RvdWJsZUNsYXNzCiAgICAgICAgICA6IF9jb21tb25FbGVtZW50cy5qc051bWJlckNsYXNzKTsKCiAgICAgIGlmIChoYXNJbnQpIHsKICAgICAgICB3aGVuTnVtYmVyID0ganMuc3RhdGVtZW50KCcnJ3sKICAgICAgICAgICAgaWYgKE1hdGguZmxvb3IocmVjZWl2ZXIpID09IHJlY2VpdmVyKSByZXR1cm4gIzsKICAgICAgICAgICAgcmV0dXJuICM7CiAgICAgICAgfScnJywKICAgICAgICAgICAgW2ludGVyY2VwdG9yRm9yKF9jb21tb25FbGVtZW50cy5qc0ludENsYXNzKSwgaW50ZXJjZXB0b3JGb3JOdW1iZXJdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3aGVuTnVtYmVyID0ganMuc3RhdGVtZW50KCdyZXR1cm4gIycsIGludGVyY2VwdG9yRm9yTnVtYmVyKTsKICAgICAgfQogICAgICBzdGF0ZW1lbnRzCiAgICAgICAgICAuYWRkKGpzLnN0YXRlbWVudCgnaWYgKHR5cGVvZiByZWNlaXZlciA9PSAibnVtYmVyIikgIzsnLCB3aGVuTnVtYmVyKSk7CiAgICB9CgogICAgaWYgKGhhc1N0cmluZykgewogICAgICBzdGF0ZW1lbnRzLmFkZChidWlsZEludGVyY2VwdG9yQ2hlY2soX2NvbW1vbkVsZW1lbnRzLmpzU3RyaW5nQ2xhc3MpKTsKICAgIH0KICAgIGlmIChoYXNOdWxsKSB7CiAgICAgIHN0YXRlbWVudHMuYWRkKGJ1aWxkSW50ZXJjZXB0b3JDaGVjayhfY29tbW9uRWxlbWVudHMuanNOdWxsQ2xhc3MpKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFJldHVybmluZyAidW5kZWZpbmVkIiBvciAibnVsbCIgaGVyZSB3aWxsIHByb3Zva2UgYSBKYXZhU2NyaXB0CiAgICAgIC8vIFR5cGVFcnJvciB3aGljaCBpcyBsYXRlciBpZGVudGlmaWVkIGFzIGEgbnVsbC1lcnJvciBieQogICAgICAvLyBbdW53cmFwRXhjZXB0aW9uXSBpbiBqc19oZWxwZXIuZGFydC4KICAgICAgc3RhdGVtZW50cy5hZGQoanMuc3RhdGVtZW50KCdpZiAocmVjZWl2ZXIgPT0gbnVsbCkgcmV0dXJuIHJlY2VpdmVyJykpOwogICAgfQogICAgaWYgKGhhc0Jvb2wpIHsKICAgICAgc3RhdGVtZW50cy5hZGQoYnVpbGRJbnRlcmNlcHRvckNoZWNrKF9jb21tb25FbGVtZW50cy5qc0Jvb2xDbGFzcykpOwogICAgfQogICAgLy8gVE9ETyhhaGUpOiBJdCBtaWdodCBiZSBmYXN0ZXIgdG8gY2hlY2sgZm9yIEFycmF5IGJlZm9yZQogICAgLy8gZnVuY3Rpb24gYW5kIGJvb2wuCiAgICBpZiAoaGFzQXJyYXkpIHsKICAgICAgc3RhdGVtZW50cy5hZGQoYnVpbGRJbnRlcmNlcHRvckNoZWNrKF9jb21tb25FbGVtZW50cy5qc0FycmF5Q2xhc3MpKTsKICAgIH0KCiAgICBpZiAoaGFzTmF0aXZlKSB7CiAgICAgIHN0YXRlbWVudHMuYWRkKGpzLnN0YXRlbWVudChyJycnewogICAgICAgICAgaWYgKHR5cGVvZiByZWNlaXZlciAhPSAib2JqZWN0IikgewogICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVjZWl2ZXIgPT0gImZ1bmN0aW9uIiApIHJldHVybiAjOwogICAgICAgICAgICAgIHJldHVybiByZWNlaXZlcjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChyZWNlaXZlciBpbnN0YW5jZW9mICMpIHJldHVybiByZWNlaXZlcjsKICAgICAgICAgIHJldHVybiAjKHJlY2VpdmVyKTsKICAgICAgfScnJywgWwogICAgICAgIGludGVyY2VwdG9yRm9yKF9jb21tb25FbGVtZW50cy5qc0phdmFTY3JpcHRGdW5jdGlvbkNsYXNzKSwKICAgICAgICBfZW1pdHRlci5jb25zdHJ1Y3RvckFjY2VzcyhfY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MpLAogICAgICAgIF9lbWl0dGVyCiAgICAgICAgICAgIC5zdGF0aWNGdW5jdGlvbkFjY2VzcyhfY29tbW9uRWxlbWVudHMuZ2V0TmF0aXZlSW50ZXJjZXB0b3JNZXRob2QpCiAgICAgIF0pKTsKICAgIH0gZWxzZSB7CiAgICAgIENsYXNzRW50aXR5IGpzVW5rbm93biA9IF9jb21tb25FbGVtZW50cy5qc1Vua25vd25KYXZhU2NyaXB0T2JqZWN0Q2xhc3M7CiAgICAgIGlmIChfY29kZWdlbldvcmxkQnVpbGRlci5kaXJlY3RseUluc3RhbnRpYXRlZENsYXNzZXMKICAgICAgICAgIC5jb250YWlucyhqc1Vua25vd24pKSB7CiAgICAgICAgc3RhdGVtZW50cy5hZGQoanMuc3RhdGVtZW50KCdpZiAoIShyZWNlaXZlciBpbnN0YW5jZW9mICMpKSByZXR1cm4gIzsnLCBbCiAgICAgICAgICBfZW1pdHRlci5jb25zdHJ1Y3RvckFjY2VzcyhfY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MpLAogICAgICAgICAgaW50ZXJjZXB0b3JGb3IoanNVbmtub3duKQogICAgICAgIF0pKTsKICAgICAgfQoKICAgICAgc3RhdGVtZW50cy5hZGQoanMuc3RhdGVtZW50KCdyZXR1cm4gcmVjZWl2ZXInKSk7CiAgICB9CgogICAgcmV0dXJuIGpzKCcnJ2Z1bmN0aW9uKHJlY2VpdmVyKSB7ICM7IH0nJycsIG5ldyBqc0FzdC5CbG9jayhzdGF0ZW1lbnRzKSk7CiAgfQoKICBqc0FzdC5DYWxsIF9nZW5lcmF0ZUlzSnNJbmRleGFibGVDYWxsKAogICAgICBqc0FzdC5FeHByZXNzaW9uIHVzZTEsIGpzQXN0LkV4cHJlc3Npb24gdXNlMikgewogICAgU3RyaW5nIGRpc3BhdGNoUHJvcGVydHlOYW1lID0gZW1iZWRkZWROYW1lcy5ESVNQQVRDSF9QUk9QRVJUWV9OQU1FOwogICAganNBc3QuRXhwcmVzc2lvbiBkaXNwYXRjaFByb3BlcnR5ID0KICAgICAgICBfZW1pdHRlci5nZW5lcmF0ZUVtYmVkZGVkR2xvYmFsQWNjZXNzKGRpc3BhdGNoUHJvcGVydHlOYW1lKTsKCiAgICAvLyBXZSBwYXNzIHRoZSBkaXNwYXRjaCBwcm9wZXJ0eSByZWNvcmQgdG8gdGhlIGlzSnNJbmRleGFibGUKICAgIC8vIGhlbHBlciByYXRoZXIgdGhhbiByZWFkaW5nIGl0IGluc2lkZSB0aGUgaGVscGVyIHRvIGluY3JlYXNlIHRoZQogICAgLy8gY2hhbmNlIG9mIG1ha2luZyB0aGUgZGlzcGF0Y2ggcmVjb3JkIGFjY2VzcyBtb25vbW9ycGhpYy4KICAgIGpzQXN0LlByb3BlcnR5QWNjZXNzIHJlY29yZCA9CiAgICAgICAgbmV3IGpzQXN0LlByb3BlcnR5QWNjZXNzKHVzZTIsIGRpc3BhdGNoUHJvcGVydHkpOwoKICAgIExpc3Q8anNBc3QuRXhwcmVzc2lvbj4gYXJndW1lbnRzID0gPGpzQXN0LkV4cHJlc3Npb24+W3VzZTEsIHJlY29yZF07CiAgICBGdW5jdGlvbkVudGl0eSBoZWxwZXIgPSBfY29tbW9uRWxlbWVudHMuaXNKc0luZGV4YWJsZTsKICAgIGpzQXN0LkV4cHJlc3Npb24gaGVscGVyRXhwcmVzc2lvbiA9IF9lbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGhlbHBlcik7CiAgICByZXR1cm4gbmV3IGpzQXN0LkNhbGwoaGVscGVyRXhwcmVzc2lvbiwgYXJndW1lbnRzKTsKICB9CgogIC8vIFJldHVybnMgYSBzdGF0ZW1lbnQgdGhhdCB0YWtlcyBjYXJlIG9mIHBlcmZvcm1hbmNlIGNyaXRpY2FsCiAgLy8gY29tbW9uIGNhc2UgZm9yIGEgb25lLXNob3QgaW50ZXJjZXB0b3IsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8KICAvLyBmYXN0IHBhdGguCiAganNBc3QuU3RhdGVtZW50IF9mYXN0UGF0aEZvck9uZVNob3RJbnRlcmNlcHRvcigKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsIFNldDxDbGFzc0VudGl0eT4gY2xhc3NlcykgewogICAgaWYgKHNlbGVjdG9yLmlzT3BlcmF0b3IpIHsKICAgICAgU3RyaW5nIG5hbWUgPSBzZWxlY3Rvci5uYW1lOwogICAgICBpZiAobmFtZSA9PSAnPT0nKSB7CiAgICAgICAgcmV0dXJuIGpzLnN0YXRlbWVudCgnJyd7CiAgICAgICAgICBpZiAocmVjZWl2ZXIgPT0gbnVsbCkgcmV0dXJuIGEwID09IG51bGw7CiAgICAgICAgICBpZiAodHlwZW9mIHJlY2VpdmVyICE9ICJvYmplY3QiKQogICAgICAgICAgICByZXR1cm4gYTAgIT0gbnVsbCAmJiByZWNlaXZlciA9PT0gYTA7CiAgICAgICAgfScnJyk7CiAgICAgIH0KICAgICAgaWYgKCFjbGFzc2VzLmNvbnRhaW5zKF9jb21tb25FbGVtZW50cy5qc0ludENsYXNzKSAmJgogICAgICAgICAgIWNsYXNzZXMuY29udGFpbnMoX2NvbW1vbkVsZW1lbnRzLmpzTnVtYmVyQ2xhc3MpICYmCiAgICAgICAgICAhY2xhc3Nlcy5jb250YWlucyhfY29tbW9uRWxlbWVudHMuanNEb3VibGVDbGFzcykpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBpZiAoc2VsZWN0b3IuYXJndW1lbnRDb3VudCA9PSAxKSB7CiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBvcGVyYXRvcnMgZG8gbm90IG1hcCB0byBhIEphdmFTY3JpcHQgb3BlcmF0b3IuCiAgICAgICAgaWYgKG5hbWUgPT0gJ34vJyB8fCBuYW1lID09ICc8PCcgfHwgbmFtZSA9PSAnJScgfHwgbmFtZSA9PSAnPj4nKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAganNBc3QuRXhwcmVzc2lvbiByZXN1bHQgPSBqcygncmVjZWl2ZXIgJG5hbWUgYTAnKTsKICAgICAgICBpZiAobmFtZSA9PSAnJicgfHwgbmFtZSA9PSAnfCcgfHwgbmFtZSA9PSAnXicpIHsKICAgICAgICAgIHJlc3VsdCA9IGpzKCcjID4+PiAwJywgcmVzdWx0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGpzLnN0YXRlbWVudCgKICAgICAgICAgICAgJ2lmICh0eXBlb2YgcmVjZWl2ZXIgPT0gIm51bWJlciIgJiYgdHlwZW9mIGEwID09ICJudW1iZXIiKScKICAgICAgICAgICAgJyAgcmV0dXJuICM7JywKICAgICAgICAgICAgcmVzdWx0KTsKICAgICAgfSBlbHNlIGlmIChuYW1lID09ICd1bmFyeS0nKSB7CiAgICAgICAgcmV0dXJuIGpzCiAgICAgICAgICAgIC5zdGF0ZW1lbnQoJ2lmICh0eXBlb2YgcmVjZWl2ZXIgPT0gIm51bWJlciIpIHJldHVybiAtcmVjZWl2ZXInKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQobmFtZSA9PSAnficpOwogICAgICAgIHJldHVybiBqcy5zdGF0ZW1lbnQoJycnCiAgICAgICAgICBpZiAodHlwZW9mIHJlY2VpdmVyID09ICJudW1iZXIiICYmIE1hdGguZmxvb3IocmVjZWl2ZXIpID09IHJlY2VpdmVyKQogICAgICAgICAgICByZXR1cm4gKH5yZWNlaXZlcikgPj4+IDA7CiAgICAgICAgICAnJycpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmlzSW5kZXggfHwgc2VsZWN0b3IuaXNJbmRleFNldCkgewogICAgICAvLyBGb3IgYW4gaW5kZXggb3BlcmF0aW9uLCB0aGlzIGNvZGUgZ2VuZXJhdGVzOgogICAgICAvLwogICAgICAvLyAgICBpZiAodHlwZW9mIGEwID09PSAibnVtYmVyIikgewogICAgICAvLyAgICAgIGlmIChyZWNlaXZlci5jb25zdHJ1Y3RvciA9PSBBcnJheSB8fAogICAgICAvLyAgICAgICAgICB0eXBlb2YgcmVjZWl2ZXIgPT0gInN0cmluZyIpIHsKICAgICAgLy8gICAgICAgIGlmIChhMCA+Pj4gMCA9PT0gYTAgJiYgYTAgPCByZWNlaXZlci5sZW5ndGgpIHsKICAgICAgLy8gICAgICAgICAgcmV0dXJuIHJlY2VpdmVyW2EwXTsKICAgICAgLy8gICAgICAgIH0KICAgICAgLy8gICAgICB9CiAgICAgIC8vICAgIH0KICAgICAgLy8KICAgICAgLy8gRm9yIGFuIGluZGV4IHNldCBvcGVyYXRpb24sIHRoaXMgY29kZSBnZW5lcmF0ZXM6CiAgICAgIC8vCiAgICAgIC8vICAgIGlmICh0eXBlb2YgYTAgPT09ICJudW1iZXIiKSB7CiAgICAgIC8vICAgICAgaWYgKHJlY2VpdmVyLmNvbnN0cnVjdG9yID09IEFycmF5ICYmICFyZWNlaXZlci5pbW11dGFibGUkbGlzdCkgewogICAgICAvLyAgICAgICAgaWYgKGEwID4+PiAwID09PSBhMCAmJiBhMCA8IHJlY2VpdmVyLmxlbmd0aCkgewogICAgICAvLyAgICAgICAgICByZXR1cm4gcmVjZWl2ZXJbYTBdID0gYTE7CiAgICAgIC8vICAgICAgICB9CiAgICAgIC8vICAgICAgfQogICAgICAvLyAgICB9CiAgICAgIGJvb2wgY29udGFpbnNBcnJheSA9IGNsYXNzZXMuY29udGFpbnMoX2NvbW1vbkVsZW1lbnRzLmpzQXJyYXlDbGFzcyk7CiAgICAgIGJvb2wgY29udGFpbnNTdHJpbmcgPSBjbGFzc2VzLmNvbnRhaW5zKF9jb21tb25FbGVtZW50cy5qc1N0cmluZ0NsYXNzKTsKICAgICAgYm9vbCBjb250YWluc0pzSW5kZXhhYmxlID0gX2Nsb3NlZFdvcmxkCiAgICAgICAgICAgICAgLmlzSW1wbGVtZW50ZWQoX2NvbW1vbkVsZW1lbnRzLmpzSW5kZXhpbmdCZWhhdmlvckludGVyZmFjZSkgJiYKICAgICAgICAgIGNsYXNzZXMuYW55KChjbHMpIHsKICAgICAgICAgICAgcmV0dXJuIF9jbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeQogICAgICAgICAgICAgICAgLmlzU3VidHlwZU9mKGNscywgX2NvbW1vbkVsZW1lbnRzLmpzSW5kZXhpbmdCZWhhdmlvckludGVyZmFjZSk7CiAgICAgICAgICB9KTsKICAgICAgLy8gVGhlIGluZGV4IHNldCBvcGVyYXRvciByZXF1aXJlcyBhIGNoZWNrIG9uIGl0cyBzZXQgdmFsdWUgaW4KICAgICAgLy8gY2hlY2tlZCBtb2RlLCBzbyB3ZSBkb24ndCBvcHRpbWl6ZSB0aGUgaW50ZXJjZXB0b3IgaWYgdGhlCiAgICAgIC8vIF9jb21waWxlciBoYXMgdHlwZSBhc3NlcnRpb25zIGVuYWJsZWQuCiAgICAgIGlmIChzZWxlY3Rvci5pc0luZGV4U2V0ICYmCiAgICAgICAgICAoX29wdGlvbnMucGFyYW1ldGVyQ2hlY2tQb2xpY3kuaXNFbWl0dGVkIHx8ICFjb250YWluc0FycmF5KSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlmICghY29udGFpbnNBcnJheSAmJiAhY29udGFpbnNTdHJpbmcpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBqc0FzdC5FeHByZXNzaW9uIGFycmF5Q2hlY2sgPSBqcygncmVjZWl2ZXIuY29uc3RydWN0b3IgPT0gQXJyYXknKTsKCiAgICAgIC8vIExhenkgZ2VuZXJhdGlvbiBvZiB0aGUgaW5kZXhhYmxlIGNoZWNrLiBJZiBpbmRleGFibGUgYmVoYXZpb3IgaXNuJ3QKICAgICAgLy8gdXNlZCwgdGhlIGlzSnNJbmRleGFibGUgZnVuY3Rpb24gaXNuJ3QgcGFydCBvZiB0aGUgY2xvc2VkIHdvcmxkLgogICAgICBqc0FzdC5FeHByZXNzaW9uIGdlbmVyaWNJbmRleGFibGVDaGVjaygpID0+CiAgICAgICAgICBfZ2VuZXJhdGVJc0pzSW5kZXhhYmxlQ2FsbChqcygncmVjZWl2ZXInKSwganMoJ3JlY2VpdmVyJykpOwoKICAgICAganNBc3QuRXhwcmVzc2lvbiBvckV4cChsZWZ0LCByaWdodCkgewogICAgICAgIHJldHVybiBsZWZ0ID09IG51bGwgPyByaWdodCA6IGpzKCcjIHx8ICMnLCBbbGVmdCwgcmlnaHRdKTsKICAgICAgfQoKICAgICAgaWYgKHNlbGVjdG9yLmlzSW5kZXgpIHsKICAgICAgICBqc0FzdC5FeHByZXNzaW9uIHR5cGVDaGVjazsKICAgICAgICBpZiAoY29udGFpbnNBcnJheSkgewogICAgICAgICAgdHlwZUNoZWNrID0gYXJyYXlDaGVjazsKICAgICAgICB9CgogICAgICAgIGlmIChjb250YWluc1N0cmluZykgewogICAgICAgICAgdHlwZUNoZWNrID0gb3JFeHAodHlwZUNoZWNrLCBqcygndHlwZW9mIHJlY2VpdmVyID09ICJzdHJpbmciJykpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGNvbnRhaW5zSnNJbmRleGFibGUpIHsKICAgICAgICAgIHR5cGVDaGVjayA9IG9yRXhwKHR5cGVDaGVjaywgZ2VuZXJpY0luZGV4YWJsZUNoZWNrKCkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGpzLnN0YXRlbWVudCgnJycKICAgICAgICAgIGlmICh0eXBlb2YgYTAgPT09ICJudW1iZXIiKQogICAgICAgICAgICBpZiAoIykKICAgICAgICAgICAgICBpZiAoKGEwID4+PiAwKSA9PT0gYTAgJiYgYTAgPCByZWNlaXZlci5sZW5ndGgpCiAgICAgICAgICAgICAgICByZXR1cm4gcmVjZWl2ZXJbYTBdOwogICAgICAgICAgJycnLCB0eXBlQ2hlY2spOwogICAgICB9IGVsc2UgewogICAgICAgIGpzQXN0LkV4cHJlc3Npb24gdHlwZUNoZWNrOwogICAgICAgIGlmIChjb250YWluc0FycmF5KSB7CiAgICAgICAgICB0eXBlQ2hlY2sgPSBhcnJheUNoZWNrOwogICAgICAgIH0KCiAgICAgICAgaWYgKGNvbnRhaW5zSnNJbmRleGFibGUpIHsKICAgICAgICAgIHR5cGVDaGVjayA9IG9yRXhwKHR5cGVDaGVjaywgZ2VuZXJpY0luZGV4YWJsZUNoZWNrKCkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGpzLnN0YXRlbWVudChyJycnCiAgICAgICAgICBpZiAodHlwZW9mIGEwID09PSAibnVtYmVyIikKICAgICAgICAgICAgaWYgKCMgJiYgIXJlY2VpdmVyLmltbXV0YWJsZSRsaXN0ICYmCiAgICAgICAgICAgICAgICAoYTAgPj4+IDApID09PSBhMCAmJiBhMCA8IHJlY2VpdmVyLmxlbmd0aCkKICAgICAgICAgICAgICByZXR1cm4gcmVjZWl2ZXJbYTBdID0gYTE7CiAgICAgICAgICAnJycsIHR5cGVDaGVjayk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaXNDYWxsKSB7CiAgICAgIGlmIChzZWxlY3Rvci5uYW1lID09ICdhYnMnICYmIHNlbGVjdG9yLmFyZ3VtZW50Q291bnQgPT0gMCkgewogICAgICAgIHJldHVybiBqcy5zdGF0ZW1lbnQocicnJwogICAgICAgICAgaWYgKHR5cGVvZiByZWNlaXZlciA9PT0gIm51bWJlciIpIHJldHVybiBNYXRoLmFicyhyZWNlaXZlcik7CiAgICAgICAgJycnKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pc0dldHRlcikgewogICAgICBpZiAoc2VsZWN0b3IubmFtZSA9PSAnc2lnbicpIHsKICAgICAgICByZXR1cm4ganMuc3RhdGVtZW50KHInJycKICAgICAgICAgIGlmICh0eXBlb2YgcmVjZWl2ZXIgPT09ICJudW1iZXIiKQogICAgICAgICAgICAgcmV0dXJuIHJlY2VpdmVyID4gMCA/IDEgOiByZWNlaXZlciA8IDAgPyAtMSA6IHJlY2VpdmVyOwogICAgICAgICcnJyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAganNBc3QuRXhwcmVzc2lvbiBnZW5lcmF0ZU9uZVNob3RJbnRlcmNlcHRvcihqc0FzdC5OYW1lIG5hbWUpIHsKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0KICAgICAgICBfb25lU2hvdEludGVyY2VwdG9yRGF0YS5nZXRPbmVTaG90SW50ZXJjZXB0b3JTZWxlY3RvcihuYW1lKTsKICAgIFNldDxDbGFzc0VudGl0eT4gY2xhc3NlcyA9CiAgICAgICAgX2ludGVyY2VwdG9yRGF0YS5nZXRJbnRlcmNlcHRlZENsYXNzZXNPbihzZWxlY3Rvci5uYW1lLCBfY2xvc2VkV29ybGQpOwogICAganNBc3QuTmFtZSBnZXRJbnRlcmNlcHRvck5hbWUgPSBfbmFtZXIubmFtZUZvckdldEludGVyY2VwdG9yKGNsYXNzZXMpOwoKICAgIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJOYW1lcyA9IDxTdHJpbmc+W107CiAgICBwYXJhbWV0ZXJOYW1lcy5hZGQoJ3JlY2VpdmVyJyk7CgogICAgaWYgKHNlbGVjdG9yLmlzU2V0dGVyKSB7CiAgICAgIHBhcmFtZXRlck5hbWVzLmFkZCgndmFsdWUnKTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0b3IuYXJndW1lbnRDb3VudDsgaSsrKSB7CiAgICAgICAgcGFyYW1ldGVyTmFtZXMuYWRkKCdhJGknKTsKICAgICAgfQogICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBzZWxlY3Rvci50eXBlQXJndW1lbnRDb3VudDsgaSsrKSB7CiAgICAgICAgcGFyYW1ldGVyTmFtZXMuYWRkKCdcJFQkaScpOwogICAgICB9CiAgICB9CgogICAganNBc3QuTmFtZSBpbnZvY2F0aW9uTmFtZSA9IF9uYW1lci5pbnZvY2F0aW9uTmFtZShzZWxlY3Rvcik7CiAgICBTdHJpbmcgZ2xvYmFsT2JqZWN0ID0KICAgICAgICBfbmFtZXIuZ2xvYmFsT2JqZWN0Rm9yTGlicmFyeShfY29tbW9uRWxlbWVudHMuaW50ZXJjZXB0b3JzTGlicmFyeSk7CgogICAganNBc3QuU3RhdGVtZW50IG9wdGltaXplZFBhdGggPQogICAgICAgIF9mYXN0UGF0aEZvck9uZVNob3RJbnRlcmNlcHRvcihzZWxlY3RvciwgY2xhc3Nlcyk7CiAgICBpZiAob3B0aW1pemVkUGF0aCA9PSBudWxsKSBvcHRpbWl6ZWRQYXRoID0ganMuc3RhdGVtZW50KCc7Jyk7CgogICAgcmV0dXJuIGpzKCdmdW5jdGlvbigjKSB7ICM7IHJldHVybiAjLiMocmVjZWl2ZXIpLiMoIykgfScsIFsKICAgICAgcGFyYW1ldGVyTmFtZXMsCiAgICAgIG9wdGltaXplZFBhdGgsCiAgICAgIGdsb2JhbE9iamVjdCwKICAgICAgZ2V0SW50ZXJjZXB0b3JOYW1lLAogICAgICBpbnZvY2F0aW9uTmFtZSwKICAgICAgcGFyYW1ldGVyTmFtZXMKICAgIF0pOwogIH0KCiAganNBc3QuQXJyYXlJbml0aWFsaXplciBnZW5lcmF0ZVR5cGVUb0ludGVyY2VwdG9yTWFwKCkgewogICAgLy8gVE9ETyhzcmEpOiBQZXJoYXBzIGluamVjdCBhIGNvbnN0YW50IGluc3RlYWQ/CiAgICBDdXN0b21FbGVtZW50c0NvZGVnZW5BbmFseXNpcyBhbmFseXNpcyA9IF9jdXN0b21FbGVtZW50c0NvZGVnZW5BbmFseXNpczsKICAgIGlmICghYW5hbHlzaXMubmVlZHNUYWJsZSkgcmV0dXJuIG51bGw7CgogICAgTGlzdDxqc0FzdC5FeHByZXNzaW9uPiBlbGVtZW50cyA9IDxqc0FzdC5FeHByZXNzaW9uPltdOwogICAgTGlzdDxDb25zdGFudFZhbHVlPiBjb25zdGFudHMgPQogICAgICAgIF9jb2RlZ2VuV29ybGRCdWlsZGVyLmdldENvbnN0YW50c0ZvckVtaXNzaW9uKF9lbWl0dGVyLmNvbXBhcmVDb25zdGFudHMpOwogICAgZm9yIChDb25zdGFudFZhbHVlIGNvbnN0YW50IGluIGNvbnN0YW50cykgewogICAgICBpZiAoY29uc3RhbnQgaXMgVHlwZUNvbnN0YW50VmFsdWUgJiYKICAgICAgICAgIGNvbnN0YW50LnJlcHJlc2VudGVkVHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlID0gY29uc3RhbnQucmVwcmVzZW50ZWRUeXBlOwogICAgICAgIENsYXNzRW50aXR5IGNsYXNzRWxlbWVudCA9IHR5cGUuZWxlbWVudDsKICAgICAgICBpZiAoIWFuYWx5c2lzLm5lZWRzQ2xhc3MoY2xhc3NFbGVtZW50KSkgY29udGludWU7CgogICAgICAgIGVsZW1lbnRzLmFkZChfZW1pdHRlci5jb25zdGFudFJlZmVyZW5jZShjb25zdGFudCkpOwogICAgICAgIGVsZW1lbnRzLmFkZChfZW1pdHRlci5pbnRlcmNlcHRvckNsYXNzQWNjZXNzKGNsYXNzRWxlbWVudCkpOwoKICAgICAgICAvLyBDcmVhdGUgSmF2YVNjcmlwdCBPYmplY3QgbWFwIGZvciBieS1uYW1lIGxvb2t1cCBvZiBnZW5lcmF0aXZlCiAgICAgICAgLy8gY29uc3RydWN0b3JzLiAgRm9yIGV4YW1wbGUsIHRoZSBjbGFzcyBBIGhhcyB0aHJlZSBnZW5lcmF0aXZlCiAgICAgICAgLy8gY29uc3RydWN0b3JzCiAgICAgICAgLy8KICAgICAgICAvLyAgICAgY2xhc3MgQSB7CiAgICAgICAgLy8gICAgICAgQSgpIHt9CiAgICAgICAgLy8gICAgICAgQS5mb28oKSB7fQogICAgICAgIC8vICAgICAgIEEuYmFyKCkge30KICAgICAgICAvLyAgICAgfQogICAgICAgIC8vCiAgICAgICAgLy8gV2hpY2ggYXJlIGRlc2NyaWJlZCBieSB0aGUgbWFwCiAgICAgICAgLy8KICAgICAgICAvLyAgICAgeyIiOiBBLkEkLCAiZm9vIjogQS5BJGZvbywgImJhciI6IEEuQSRiYXJ9CiAgICAgICAgLy8KICAgICAgICAvLyBXZSBleHBlY3QgbW9zdCBvZiB0aGUgdGltZSB0aGUgbWFwIHdpbGwgYmUgYSBzaW5nbGV0b24uCiAgICAgICAgdmFyIHByb3BlcnRpZXMgPSA8anNBc3QuUHJvcGVydHk+W107CiAgICAgICAgZm9yIChDb25zdHJ1Y3RvckVudGl0eSBtZW1iZXIgaW4gYW5hbHlzaXMuY29uc3RydWN0b3JzKGNsYXNzRWxlbWVudCkpIHsKICAgICAgICAgIHByb3BlcnRpZXMuYWRkKG5ldyBqc0FzdC5Qcm9wZXJ0eSgKICAgICAgICAgICAgICBqcy5zdHJpbmcobWVtYmVyLm5hbWUpLCBfZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2VzcyhtZW1iZXIpKSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgbWFwID0gbmV3IGpzQXN0Lk9iamVjdEluaXRpYWxpemVyKHByb3BlcnRpZXMpOwogICAgICAgIGVsZW1lbnRzLmFkZChtYXApOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIG5ldyBqc0FzdC5BcnJheUluaXRpYWxpemVyKGVsZW1lbnRzKTsKICB9Cn0KgdMATk48ATcBSQEiIyQ0ISAuNSgpLiEaMTIqAT8BISIoJjYWOEYyIwEcFRwZIxMkKyEaATkBSAEwAUw3OwYBPj09IjgwOjYyMiA4ODY7OTk5NywPIAhQBgEbGhwZGhwcHFEBJzE4NjkZMxg1GjIXMxg1GjUaDU8yC0hRTEpNASBKCggGFRgGIgFELyQGATwBFSIBREdFIkcqLAEUJzwWDlEPRQgRUQYBFUwGE0oNSEAuTQYTSgY/GhRLBgEVKC08Hww2Hg5DQRFOCw1OOyJRQyQNCAE3BgFNBAEpNkgoRQFBR0AiOgFJO084BAFBRBAyNR8jGiEzKzIPCDs+PhUIKUhLFwo7OSoKHUgbFSUSTQ8dIE8mEAg6NgkqMzE/JxIQDgk6CSpPPywSEA5LTS5NHi9QDkVDMCFJFQgvFQhJAU1KMkYBLEMIAR4kHSIKAR5LCgEjQQoBICYTPSUbDyQdIgoBI0EKASEmMTsoGwgiQyFHDggkJSEsRQ4IBhEEAUEYRR9PSwEuJAEdIw05Iwg+JQgGAUEaTAEkO0IBQBYVFBoWFQgEATo1TSsBPCRRMCs3NzE6ATxFAUlIGAsZGBwcEQsqCzoLQy1QLU8KATsbCAYBMQQCAT9wYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL2ludGVyY2VwdG9yX3N0dWJfZ2VuZXJhdG9yLmRhcnRGc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfZW1pdHRlci9tYWluX2NhbGxfc3R1Yl9nZW5lcmF0b3IuZGFydIizLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5qc19lbWl0dGVyLm1haW5fY2FsbF9zdHViX2dlbmVyYXRvcjsKCmltcG9ydCAncGFja2FnZTpqc19ydW50aW1lL3NoYXJlZC9lbWJlZGRlZF9uYW1lcy5kYXJ0JyBhcyBlbWJlZGRlZE5hbWVzOwoKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBhcyBqc0FzdDsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBzaG93IGpzOwoKaW1wb3J0ICdjb2RlX2VtaXR0ZXJfdGFzay5kYXJ0JyBzaG93IEVtaXR0ZXI7CgpjbGFzcyBNYWluQ2FsbFN0dWJHZW5lcmF0b3IgewogIHN0YXRpYyBqc0FzdC5TdGF0ZW1lbnQgZ2VuZXJhdGVJbnZva2VNYWluKAogICAgICBFbWl0dGVyIGVtaXR0ZXIsIEZ1bmN0aW9uRW50aXR5IG1haW4pIHsKICAgIGpzQXN0LkV4cHJlc3Npb24gbWFpbkNhbGxDbG9zdXJlID0gZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2VzcyhtYWluKTsKICAgIGpzQXN0LkV4cHJlc3Npb24gY3VycmVudFNjcmlwdEFjY2VzcyA9CiAgICAgICAgZW1pdHRlci5nZW5lcmF0ZUVtYmVkZGVkR2xvYmFsQWNjZXNzKGVtYmVkZGVkTmFtZXMuQ1VSUkVOVF9TQ1JJUFQpOwoKICAgIC8vIFRoaXMgY29kZSBmaW5kcyB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBzY3JpcHQgYnkgbGlzdGVuaW5nIHRvIHRoZQogICAgLy8gb25sb2FkIGV2ZW50IG9mIGFsbCBzY3JpcHQgdGFncyBhbmQgZ2V0dGluZyB0aGUgZmlyc3Qgc2NyaXB0IHdoaWNoCiAgICAvLyBmaW5pc2hlcy4gU2luY2Ugb25sb2FkIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBleGVjdXRpb24gdGhpcyBzaG91bGQKICAgIC8vIG5vdCBzdWJzdGFudGlhbGx5IGNoYW5nZSBleGVjdXRpb24gb3JkZXIuCiAgICByZXR1cm4ganMuc3RhdGVtZW50KCcnJwogICAgICAoZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgIGNhbGxiYWNrKG51bGwpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvLyBXaGVuIHJ1bm5pbmcgYXMgYSBjb250ZW50LXNjcmlwdCBvZiBhIGNocm9tZS1leHRlbnNpb24gdGhlCiAgICAgICAgLy8gJ2N1cnJlbnRTY3JpcHQnIGlzIGBudWxsYCAoYnV0IG5vdCB1bmRlZmluZWQpLgogICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQuY3VycmVudFNjcmlwdCAhPSAndW5kZWZpbmVkJykgewogICAgICAgICAgY2FsbGJhY2soZG9jdW1lbnQuY3VycmVudFNjcmlwdCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB2YXIgc2NyaXB0cyA9IGRvY3VtZW50LnNjcmlwdHM7CiAgICAgICAgZnVuY3Rpb24gb25Mb2FkKGV2ZW50KSB7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNjcmlwdHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgc2NyaXB0c1tpXS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIiwgb25Mb2FkLCBmYWxzZSk7CiAgICAgICAgICB9CiAgICAgICAgICBjYWxsYmFjayhldmVudC50YXJnZXQpOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNjcmlwdHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgIHNjcmlwdHNbaV0uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIG9uTG9hZCwgZmFsc2UpOwogICAgICAgIH0KICAgICAgfSkoZnVuY3Rpb24oY3VycmVudFNjcmlwdCkgewogICAgICAgICNjdXJyZW50U2NyaXB0ID0gY3VycmVudFNjcmlwdDsKCiAgICAgICAgaWYgKHR5cGVvZiBkYXJ0TWFpblJ1bm5lciA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgZGFydE1haW5SdW5uZXIoI21haW5DYWxsQ2xvc3VyZSwgW10pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAjbWFpbkNhbGxDbG9zdXJlKFtdKTsKICAgICAgICB9CiAgICAgIH0pJycnLCB7CiAgICAgICdjdXJyZW50U2NyaXB0JzogY3VycmVudFNjcmlwdEFjY2VzcywKICAgICAgJ21haW5DYWxsQ2xvc3VyZSc6IG1haW5DYWxsQ2xvc3VyZQogICAgfSk7CiAgfQp9CkAATk48ATUBSQEkISABLgEeLS5LK0wBSkpQMRwdLxoSCkY6PCwSCgEoITVDDCIKMz4KIygBNDARIAoPLCkIBAIBPXBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvbWFpbl9jYWxsX3N0dWJfZ2VuZXJhdG9yLmRhcnRAc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfZW1pdHRlci9tZXRhZGF0YV9jb2xsZWN0b3IuZGFydKA/Ly8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5qc19lbWl0dGVyLm1ldGFkYXRhX2NvbGxlY3RvcjsKCmltcG9ydCAncGFja2FnZTpqc19hc3Qvc3JjL3ByZWNlZGVuY2UuZGFydCcgYXMganNfcHJlY2VkZW5jZTsKCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZGVmZXJyZWRfbG9hZC5kYXJ0JyBzaG93IE91dHB1dFVuaXQ7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCcgc2hvdyBGdW5jdGlvbkVudGl0eTsKCmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vanMvanMuZGFydCcgYXMganNBc3Q7CmltcG9ydCAnLi4vanMvanMuZGFydCcgc2hvdyBqczsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXMuZGFydCcgc2hvdyBSdW50aW1lVHlwZXNFbmNvZGVyOwppbXBvcnQgJy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY29kZWdlbl93b3JsZF9idWlsZGVyLmRhcnQnOwoKaW1wb3J0ICdjb2RlX2VtaXR0ZXJfdGFzay5kYXJ0JyBzaG93IEVtaXR0ZXI7CgovLy8gUmVwcmVzZW50cyBhbiBlbnRyeSdzIHBvc2l0aW9uIGluIG9uZSBvZiB0aGUgZ2xvYmFsIG1ldGFkYXRhIGFycmF5cy4KLy8vCi8vLyBbX3JjXSBpcyB1c2VkIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgcmVmZXJlbmNlcyBvZiB0aGUgdG9rZW4gaW4gdGhlCi8vLyBhc3QgZm9yIGEgcHJvZ3JhbS4KLy8vIFt2YWx1ZV0gaXMgdGhlIGFjdHVhbCBwb3NpdGlvbiwgb25jZSB0aGV5IGhhdmUgYmVlbiBmaW5hbGl6ZWQuCmFic3RyYWN0IGNsYXNzIF9NZXRhZGF0YUVudHJ5IGV4dGVuZHMganNBc3QuRGVmZXJyZWROdW1iZXIKICAgIGltcGxlbWVudHMgQ29tcGFyYWJsZSwganNBc3QuUmVmZXJlbmNlQ291bnRlZEFzdE5vZGUgewogIGpzQXN0LkV4cHJlc3Npb24gZ2V0IGVudHJ5OwogIEBvdmVycmlkZQogIGludCBnZXQgdmFsdWU7CiAgaW50IGdldCBfcmM7CgogIC8vIE1hcmsgdGhpcyBlbnRyeSBhcyBzZWVuLiBPbiB0aGUgZmlyc3QgdGltZSB0aGlzIGlzIHNlZW4sIHRoZSB2aXNpdG9yCiAgLy8gd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBbZW50cnldIHRvIGFsc28gbWFyayBwb3RlbnRpYWwgW19NZXRhZGF0YUVudHJ5XQogIC8vIGluc3RhbmNlcyBpbiB0aGUgW2VudHJ5XSBhcyBzZWVuLgogIEBvdmVycmlkZQogIG1hcmtTZWVuKGpzQXN0LlRva2VuQ291bnRlciB2aXNpdG9yKTsKfQoKY2xhc3MgX0JvdW5kTWV0YWRhdGFFbnRyeSBleHRlbmRzIF9NZXRhZGF0YUVudHJ5IHsKICBpbnQgX3ZhbHVlID0gLTE7CiAgQG92ZXJyaWRlCiAgaW50IF9yYyA9IDA7CiAgQG92ZXJyaWRlCiAgZmluYWwganNBc3QuRXhwcmVzc2lvbiBlbnRyeTsKCiAgX0JvdW5kTWV0YWRhdGFFbnRyeSh0aGlzLmVudHJ5KTsKCiAgYm9vbCBnZXQgaXNGaW5hbGl6ZWQgPT4gX3ZhbHVlICE9IC0xOwoKICBmaW5hbGl6ZShpbnQgdmFsdWUpIHsKICAgIGFzc2VydCghaXNGaW5hbGl6ZWQpOwogICAgX3ZhbHVlID0gdmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IHZhbHVlIHsKICAgIGFzc2VydChpc0ZpbmFsaXplZCk7CiAgICByZXR1cm4gX3ZhbHVlOwogIH0KCiAgYm9vbCBnZXQgaXNVc2VkID0+IF9yYyA+IDA7CgogIEBvdmVycmlkZQogIG1hcmtTZWVuKGpzQXN0LkJhc2VWaXNpdG9yIHZpc2l0b3IpIHsKICAgIF9yYysrOwogICAgaWYgKF9yYyA9PSAxKSBlbnRyeS5hY2NlcHQodmlzaXRvcik7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgY29tcGFyZVRvKGNvdmFyaWFudCBfTWV0YWRhdGFFbnRyeSBvdGhlcikgPT4gb3RoZXIuX3JjIC0gdGhpcy5fcmM7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdfQm91bmRNZXRhZGF0YUVudHJ5KCRoYXNoQ29kZSxyYz0kX3JjLF92YWx1ZT0kX3ZhbHVlKSc7Cn0KCmNsYXNzIF9NZXRhZGF0YUxpc3QgZXh0ZW5kcyBqc0FzdC5EZWZlcnJlZEV4cHJlc3Npb24gewogIGpzQXN0LkV4cHJlc3Npb24gX3ZhbHVlOwoKICB2b2lkIHNldEV4cHJlc3Npb24oanNBc3QuRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgYXNzZXJ0KF92YWx1ZSA9PSBudWxsKTsKICAgIGFzc2VydCh2YWx1ZS5wcmVjZWRlbmNlTGV2ZWwgPT0gdGhpcy5wcmVjZWRlbmNlTGV2ZWwpOwogICAgX3ZhbHVlID0gdmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5FeHByZXNzaW9uIGdldCB2YWx1ZSB7CiAgICBhc3NlcnQoX3ZhbHVlICE9IG51bGwpOwogICAgcmV0dXJuIF92YWx1ZTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgcHJlY2VkZW5jZUxldmVsID0+IGpzX3ByZWNlZGVuY2UuUFJJTUFSWTsKfQoKY2xhc3MgTWV0YWRhdGFDb2xsZWN0b3IgaW1wbGVtZW50cyBqc0FzdC5Ub2tlbkZpbmFsaXplciB7CiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwogIGZpbmFsIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlcjsKICBmaW5hbCBFbWl0dGVyIF9lbWl0dGVyOwogIGZpbmFsIFJ1bnRpbWVUeXBlc0VuY29kZXIgX3J0aUVuY29kZXI7CiAgZmluYWwgQ29kZWdlbldvcmxkQnVpbGRlciBfY29kZWdlbldvcmxkQnVpbGRlcjsKCiAgLy8vIEEgbWFwIHdpdGggYSB0b2tlbiBwZXIgb3V0cHV0IHVuaXQgZm9yIGEgbGlzdCBvZiBleHByZXNzaW9ucyB0aGF0CiAgLy8vIHJlcHJlc2VudCBtZXRhZGF0YSwgcGFyYW1ldGVyIG5hbWVzIGFuZCB0eXBlIHZhcmlhYmxlIHR5cGVzLgogIE1hcDxPdXRwdXRVbml0LCBfTWV0YWRhdGFMaXN0PiBfbWV0YWRhdGFUb2tlbnMgPQogICAgICBuZXcgTWFwPE91dHB1dFVuaXQsIF9NZXRhZGF0YUxpc3Q+KCk7CgogIGpzQXN0LkV4cHJlc3Npb24gZ2V0TWV0YWRhdGFGb3JPdXRwdXRVbml0KE91dHB1dFVuaXQgb3V0cHV0VW5pdCkgewogICAgcmV0dXJuIF9tZXRhZGF0YVRva2Vucy5wdXRJZkFic2VudChvdXRwdXRVbml0LCAoKSA9PiBuZXcgX01ldGFkYXRhTGlzdCgpKTsKICB9CgogIC8vLyBBIG1hcCB1c2VkIHRvIGNhbm9uaWNhbGl6ZSB0aGUgZW50cmllcyBvZiBtZXRhZGF0YS4KICBNYXA8T3V0cHV0VW5pdCwgTWFwPFN0cmluZywgX0JvdW5kTWV0YWRhdGFFbnRyeT4+IF9tZXRhZGF0YU1hcCA9CiAgICAgIDxPdXRwdXRVbml0LCBNYXA8U3RyaW5nLCBfQm91bmRNZXRhZGF0YUVudHJ5Pj57fTsKCiAgLy8vIEEgbWFwIHdpdGggYSB0b2tlbiBmb3IgYSBsaXN0cyBvZiBKUyBleHByZXNzaW9ucywgb25lIHRva2VuIGZvciBlYWNoCiAgLy8vIG91dHB1dCB1bml0LiBPbmNlIGZpbmFsaXplZCwgdGhlIGVudHJpZXMgcmVwcmVzZW50IHR5cGVzIGluY2x1ZGluZwogIC8vLyBmdW5jdGlvbiB0eXBlcyBhbmQgdHlwZWRlZnMuCiAgTWFwPE91dHB1dFVuaXQsIF9NZXRhZGF0YUxpc3Q+IF90eXBlc1Rva2VucyA9CiAgICAgIG5ldyBNYXA8T3V0cHV0VW5pdCwgX01ldGFkYXRhTGlzdD4oKTsKCiAganNBc3QuRXhwcmVzc2lvbiBnZXRUeXBlc0Zvck91dHB1dFVuaXQoT3V0cHV0VW5pdCBvdXRwdXRVbml0KSB7CiAgICByZXR1cm4gX3R5cGVzVG9rZW5zLnB1dElmQWJzZW50KG91dHB1dFVuaXQsICgpID0+IG5ldyBfTWV0YWRhdGFMaXN0KCkpOwogIH0KCiAgLy8vIEEgbWFwIHVzZWQgdG8gY2Fub25pY2FsaXplIHRoZSBlbnRyaWVzIG9mIHR5cGVzLgogIE1hcDxPdXRwdXRVbml0LCBNYXA8RGFydFR5cGUsIF9Cb3VuZE1ldGFkYXRhRW50cnk+PiBfdHlwZXNNYXAgPQogICAgICA8T3V0cHV0VW5pdCwgTWFwPERhcnRUeXBlLCBfQm91bmRNZXRhZGF0YUVudHJ5Pj57fTsKCiAgTWV0YWRhdGFDb2xsZWN0b3IodGhpcy5fb3B0aW9ucywgdGhpcy5yZXBvcnRlciwgdGhpcy5fZW1pdHRlciwKICAgICAgdGhpcy5fcnRpRW5jb2RlciwgdGhpcy5fY29kZWdlbldvcmxkQnVpbGRlcik7CgogIExpc3Q8anNBc3QuRGVmZXJyZWROdW1iZXI+IHJlaWZ5RGVmYXVsdEFyZ3VtZW50cygKICAgICAgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24sIE91dHB1dFVuaXQgb3V0cHV0VW5pdCkgewogICAgLy8gVE9ETyhzcmEpOiBUaGVzZSBhcmUgc3RvcmVkIG9uIHRoZSBJbnN0YW5jZU1ldGhvZCBvciBTdGF0aWNEYXJ0TWV0aG9kLgogICAgTGlzdDxqc0FzdC5EZWZlcnJlZE51bWJlcj4gZGVmYXVsdFZhbHVlcyA9IDxqc0FzdC5EZWZlcnJlZE51bWJlcj5bXTsKICAgIF9jb2RlZ2VuV29ybGRCdWlsZGVyLmZvckVhY2hQYXJhbWV0ZXIoZnVuY3Rpb24sCiAgICAgICAgKF8sIFN0cmluZyBuYW1lLCBDb25zdGFudFZhbHVlIGNvbnN0YW50KSB7CiAgICAgIGlmIChjb25zdGFudCA9PSBudWxsKSByZXR1cm47CiAgICAgIGpzQXN0LkV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IF9lbWl0dGVyLmNvbnN0YW50UmVmZXJlbmNlKGNvbnN0YW50KTsKICAgICAgZGVmYXVsdFZhbHVlcy5hZGQoX2FkZEdsb2JhbE1ldGFkYXRhKGV4cHJlc3Npb24sIG91dHB1dFVuaXQpKTsKICAgIH0pOwogICAgcmV0dXJuIGRlZmF1bHRWYWx1ZXM7CiAgfQoKICBqc0FzdC5FeHByZXNzaW9uIHJlaWZ5VHlwZShEYXJ0VHlwZSB0eXBlLCBPdXRwdXRVbml0IG91dHB1dFVuaXQpIHsKICAgIHJldHVybiBhZGRUeXBlSW5PdXRwdXRVbml0KHR5cGUsIG91dHB1dFVuaXQpOwogIH0KCiAganNBc3QuRXhwcmVzc2lvbiByZWlmeU5hbWUoU3RyaW5nIG5hbWUsIE91dHB1dFVuaXQgb3V0cHV0VW5pdCkgewogICAgcmV0dXJuIF9hZGRHbG9iYWxNZXRhZGF0YShqcy5zdHJpbmcobmFtZSksIG91dHB1dFVuaXQpOwogIH0KCiAganNBc3QuRXhwcmVzc2lvbiByZWlmeUV4cHJlc3Npb24oCiAgICAgIGpzQXN0LkV4cHJlc3Npb24gZXhwcmVzc2lvbiwgT3V0cHV0VW5pdCBvdXRwdXRVbml0KSB7CiAgICByZXR1cm4gX2FkZEdsb2JhbE1ldGFkYXRhKGV4cHJlc3Npb24sIG91dHB1dFVuaXQpOwogIH0KCiAgX01ldGFkYXRhRW50cnkgX2FkZEdsb2JhbE1ldGFkYXRhKGpzQXN0Lk5vZGUgbm9kZSwgT3V0cHV0VW5pdCBvdXRwdXRVbml0KSB7CiAgICBTdHJpbmcgbmFtZVRvS2V5KGpzQXN0Lk5hbWUgbmFtZSkgPT4gIiR7bmFtZS5rZXl9IjsKICAgIFN0cmluZyBwcmludGVkID0ganNBc3QucHJldHR5UHJpbnQobm9kZSwKICAgICAgICBlbmFibGVNaW5pZmljYXRpb246IF9vcHRpb25zLmVuYWJsZU1pbmlmaWNhdGlvbiwKICAgICAgICByZW5hbWVyRm9yTmFtZXM6IG5hbWVUb0tleSk7CiAgICBfbWV0YWRhdGFNYXBbb3V0cHV0VW5pdF0gPz89IG5ldyBNYXA8U3RyaW5nLCBfQm91bmRNZXRhZGF0YUVudHJ5PigpOwogICAgcmV0dXJuIF9tZXRhZGF0YU1hcFtvdXRwdXRVbml0XS5wdXRJZkFic2VudChwcmludGVkLCAoKSB7CiAgICAgIHJldHVybiBuZXcgX0JvdW5kTWV0YWRhdGFFbnRyeShub2RlKTsKICAgIH0pOwogIH0KCiAganNBc3QuRXhwcmVzc2lvbiBfY29tcHV0ZVR5cGVSZXByZXNlbnRhdGlvbihEYXJ0VHlwZSB0eXBlKSB7CiAgICBqc0FzdC5FeHByZXNzaW9uIHJlcHJlc2VudGF0aW9uID0KICAgICAgICBfcnRpRW5jb2Rlci5nZXRUeXBlUmVwcmVzZW50YXRpb24oX2VtaXR0ZXIsIHR5cGUsICh2YXJpYWJsZSkgewogICAgICBmYWlsZWRBdCgKICAgICAgICAgIE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwKICAgICAgICAgICJUeXBlIHJlcHJlc2VudGF0aW9uIGZvciB0eXBlIHZhcmlhYmxlICR2YXJpYWJsZSBpbiAiCiAgICAgICAgICAiJHR5cGUgaXMgbm90IHN1cHBvcnRlZC4iKTsKICAgICAgcmV0dXJuIGpzQXN0LkxpdGVyYWxOdWxsKCk7CiAgICB9LCAoVHlwZWRlZlR5cGUgdHlwZWRlZikgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKCiAgICBpZiAocmVwcmVzZW50YXRpb24gaXMganNBc3QuTGl0ZXJhbFN0cmluZykgewogICAgICAvLyBXZSBkb24ndCB3YW50IHRoZSByZXByZXNlbnRhdGlvbiB0byBiZSBhIHN0cmluZywgc2luY2Ugd2UgdXNlCiAgICAgIC8vIHN0cmluZ3MgYXMgaW5kaWNhdG9yIGZvciBub24taW5pdGlhbGl6ZWQgdHlwZXMgaW4gdGhlIGxhenkgZW1pdHRlci4KICAgICAgcmVwb3J0ZXIuaW50ZXJuYWxFcnJvcigKICAgICAgICAgIE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwgJ3JlaWZpZWQgdHlwZXMgc2hvdWxkIG5vdCBiZSBzdHJpbmdzLicpOwogICAgfQoKICAgIHJldHVybiByZXByZXNlbnRhdGlvbjsKICB9CgogIGpzQXN0LkV4cHJlc3Npb24gYWRkVHlwZUluT3V0cHV0VW5pdChEYXJ0VHlwZSB0eXBlLCBPdXRwdXRVbml0IG91dHB1dFVuaXQpIHsKICAgIF90eXBlc01hcFtvdXRwdXRVbml0XSA/Pz0gbmV3IE1hcDxEYXJ0VHlwZSwgX0JvdW5kTWV0YWRhdGFFbnRyeT4oKTsKICAgIHJldHVybiBfdHlwZXNNYXBbb3V0cHV0VW5pdF0ucHV0SWZBYnNlbnQodHlwZSwgKCkgewogICAgICByZXR1cm4gbmV3IF9Cb3VuZE1ldGFkYXRhRW50cnkoX2NvbXB1dGVUeXBlUmVwcmVzZW50YXRpb24odHlwZSkpOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZpbmFsaXplVG9rZW5zKCkgewogICAgdm9pZCBjb3VudFRva2Vuc0luVHlwZXMoSXRlcmFibGU8X0JvdW5kTWV0YWRhdGFFbnRyeT4gZW50cmllcykgewogICAgICBqc0FzdC5Ub2tlbkNvdW50ZXIgY291bnRlciA9IG5ldyBqc0FzdC5Ub2tlbkNvdW50ZXIoKTsKICAgICAgZW50cmllcwogICAgICAgICAgLndoZXJlKChfQm91bmRNZXRhZGF0YUVudHJ5IGUpID0+IGUuX3JjID4gMCkKICAgICAgICAgIC5tYXAoKF9Cb3VuZE1ldGFkYXRhRW50cnkgZSkgPT4gZS5lbnRyeSkKICAgICAgICAgIC5mb3JFYWNoKGNvdW50ZXIuY291bnRUb2tlbnMpOwogICAgfQoKICAgIGpzQXN0LkFycmF5SW5pdGlhbGl6ZXIgZmluYWxpemVNYXAoTWFwPGR5bmFtaWMsIF9Cb3VuZE1ldGFkYXRhRW50cnk+IG1hcCkgewogICAgICBib29sIGlzVXNlZChfQm91bmRNZXRhZGF0YUVudHJ5IGVudHJ5KSA9PiBlbnRyeS5pc1VzZWQ7CiAgICAgIExpc3Q8X0JvdW5kTWV0YWRhdGFFbnRyeT4gZW50cmllcyA9IG1hcC52YWx1ZXMud2hlcmUoaXNVc2VkKS50b0xpc3QoKTsKICAgICAgZW50cmllcy5zb3J0KCk7CgogICAgICAvLyBUT0RPKGhlcmh1dCk6IEJ1Y2tldCBlbnRyaWVzIGJ5IGluZGV4IGxlbmd0aCBhbmQgdXNlIGEgc3RhYmxlCiAgICAgIC8vICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uIHdpdGhpbiBidWNrZXRzLgogICAgICBpbnQgY291bnQgPSAwOwogICAgICBmb3IgKF9Cb3VuZE1ldGFkYXRhRW50cnkgZW50cnkgaW4gZW50cmllcykgewogICAgICAgIGVudHJ5LmZpbmFsaXplKGNvdW50KyspOwogICAgICB9CgogICAgICBMaXN0PGpzQXN0Lk5vZGU+IHZhbHVlcyA9CiAgICAgICAgICBlbnRyaWVzLm1hcCgoX0JvdW5kTWV0YWRhdGFFbnRyeSBlKSA9PiBlLmVudHJ5KS50b0xpc3QoKTsKCiAgICAgIHJldHVybiBuZXcganNBc3QuQXJyYXlJbml0aWFsaXplcih2YWx1ZXMpOwogICAgfQoKICAgIF9tZXRhZGF0YVRva2Vucy5mb3JFYWNoKChPdXRwdXRVbml0IG91dHB1dFVuaXQsIF9NZXRhZGF0YUxpc3QgdG9rZW4pIHsKICAgICAgTWFwIG1ldGFkYXRhTWFwID0gX21ldGFkYXRhTWFwW291dHB1dFVuaXRdOwogICAgICBpZiAobWV0YWRhdGFNYXAgIT0gbnVsbCkgewogICAgICAgIHRva2VuLnNldEV4cHJlc3Npb24oZmluYWxpemVNYXAobWV0YWRhdGFNYXApKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0b2tlbi5zZXRFeHByZXNzaW9uKG5ldyBqc0FzdC5BcnJheUluaXRpYWxpemVyKFtdKSk7CiAgICAgIH0KICAgIH0pOwoKICAgIF90eXBlc1Rva2Vucy5mb3JFYWNoKChPdXRwdXRVbml0IG91dHB1dFVuaXQsIF9NZXRhZGF0YUxpc3QgdG9rZW4pIHsKICAgICAgTWFwIHR5cGVzTWFwID0gX3R5cGVzTWFwW291dHB1dFVuaXRdOwogICAgICBpZiAodHlwZXNNYXAgIT0gbnVsbCkgewogICAgICAgIGNvdW50VG9rZW5zSW5UeXBlcyh0eXBlc01hcC52YWx1ZXMpOwogICAgICAgIHRva2VuLnNldEV4cHJlc3Npb24oZmluYWxpemVNYXAodHlwZXNNYXApKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0b2tlbi5zZXRFeHByZXNzaW9uKG5ldyBqc0FzdC5BcnJheUluaXRpYWxpemVyKFtdKSk7CiAgICAgIH0KICAgIH0pOwogIH0KfQqA+wBOTjwBLwE+ARkjMDgBJCEhIEQaMQEuAUkESBdDOzseDBEPAUpMJwwoAgEzEwwPDCABIwEoARgaFAQBDBIZEwQBHgEMKAspBAEMSQEMUAIBNxsBLxw7FAQBDB8cEwQBDDQCAToiJRopMgFIQzMsAUVPBAE6QzgBS0kjMCwBQkwEATdCOgFBNAE0OE5JNDMkSkUIGgQBRTIEAUM8BAEkPDcEAU44LTklST4sCAQBPyZHECFAJiIfFAgBMUdNHkoGARsEAU9IOEgIBAEMGkU9DjczKQYBUD5NFgFHNBUzIQgBIEQBMQYBSzIhNw89CAgBSCweLTQPPQgIBAIBN3BhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvbWV0YWRhdGFfY29sbGVjdG9yLmRhcnQ8c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfZW1pdHRlci9uYXRpdmVfZW1pdHRlci5kYXJ0td0vLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmpzX2VtaXR0ZXIubmF0aXZlX2VtaXR0ZXI7CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCcgc2hvdyBDb21tb25FbGVtZW50czsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JyBzaG93IERhcnRUeXBlLCBGdW5jdGlvblR5cGU7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vanMvanMuZGFydCcgYXMganNBc3Q7CmltcG9ydCAnLi4vanMvanMuZGFydCcgc2hvdyBqczsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2ludGVyY2VwdG9yX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9uYXRpdmVfZGF0YS5kYXJ0JzsKaW1wb3J0ICcuLi9uYXRpdmUvZW5xdWV1ZS5kYXJ0JyBzaG93IE5hdGl2ZUNvZGVnZW5FbnF1ZXVlcjsKaW1wb3J0ICcuLi91bml2ZXJzZS9jb2RlZ2VuX3dvcmxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vd29ybGQuZGFydCcgc2hvdyBKQ2xvc2VkV29ybGQ7CgppbXBvcnQgJ2NvZGVfZW1pdHRlcl90YXNrLmRhcnQnIHNob3cgQ29kZUVtaXR0ZXJUYXNrOwppbXBvcnQgJ21vZGVsLmRhcnQnOwoKY2xhc3MgTmF0aXZlRW1pdHRlciB7CiAgZmluYWwgQ29kZUVtaXR0ZXJUYXNrIF9lbWl0dGVyVGFzazsKICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwogIGZpbmFsIENvZGVnZW5Xb3JsZEJ1aWxkZXIgX3dvcmxkQnVpbGRlcjsKICBmaW5hbCBOYXRpdmVDb2RlZ2VuRW5xdWV1ZXIgX25hdGl2ZUNvZGVnZW5FbnF1ZXVlcjsKCiAgLy8gV2hldGhlciB0aGUgYXBwbGljYXRpb24gY29udGFpbnMgbmF0aXZlIGNsYXNzZXMuCiAgYm9vbCBoYXNOYXRpdmVDbGFzc2VzID0gZmFsc2U7CgogIC8vIENhY2hlcyB0aGUgbmF0aXZlIHN1YnR5cGVzIG9mIGEgbmF0aXZlIGNsYXNzLgogIE1hcDxDbGFzc0VudGl0eSwgTGlzdDxDbGFzc0VudGl0eT4+IHN1YnR5cGVzID0KICAgICAgPENsYXNzRW50aXR5LCBMaXN0PENsYXNzRW50aXR5Pj57fTsKCiAgLy8gQ2FjaGVzIHRoZSBkaXJlY3QgbmF0aXZlIHN1YnR5cGVzIG9mIGEgbmF0aXZlIGNsYXNzLgogIE1hcDxDbGFzc0VudGl0eSwgTGlzdDxDbGFzc0VudGl0eT4+IGRpcmVjdFN1YnR5cGVzID0KICAgICAgPENsYXNzRW50aXR5LCBMaXN0PENsYXNzRW50aXR5Pj57fTsKCiAgLy8gQ2FjaGVzIHRoZSBtZXRob2RzIHRoYXQgaGF2ZSBhIG5hdGl2ZSBib2R5LgogIFNldDxGdW5jdGlvbkVudGl0eT4gbmF0aXZlTWV0aG9kcyA9IG5ldyBTZXQ8RnVuY3Rpb25FbnRpdHk+KCk7CgogIE5hdGl2ZUVtaXR0ZXIodGhpcy5fZW1pdHRlclRhc2ssIHRoaXMuX2Nsb3NlZFdvcmxkLCB0aGlzLl93b3JsZEJ1aWxkZXIsCiAgICAgIHRoaXMuX25hdGl2ZUNvZGVnZW5FbnF1ZXVlcik7CgogIENvbW1vbkVsZW1lbnRzIGdldCBfY29tbW9uRWxlbWVudHMgPT4gX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzOwogIE5hdGl2ZURhdGEgZ2V0IF9uYXRpdmVEYXRhID0+IF9jbG9zZWRXb3JsZC5uYXRpdmVEYXRhOwogIEludGVyY2VwdG9yRGF0YSBnZXQgX2ludGVyY2VwdG9yRGF0YSA9PiBfY2xvc2VkV29ybGQuaW50ZXJjZXB0b3JEYXRhOwoKICAvLy8gUHJlcGFyZXMgbmF0aXZlIGNsYXNzZXMgZm9yIGVtaXNzaW9uLiBSZXR1cm5zIHRoZSB1bm5lZWRlZCBjbGFzc2VzLgogIC8vLwogIC8vLyBSZW1vdmVzIHRyaXZpYWwgY2xhc3NlcyAodGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgYSBzdXBlciB0eXBlKSBhbmQKICAvLy8gZ2VuZXJhdGVzIHByb3BlcnRpZXMgdGhhdCBoYXZlIHRvIGJlIGFkZGVkIHRvIGNsYXNzZXMgKG5hdGl2ZSBvciBub3QpLgogIC8vLwogIC8vLyBVcGRhdGVzIHRoZSBgbmF0aXZlTGVhZlRhZ3NgLCBgbmF0aXZlTm9uTGVhZlRhZ3NgIGFuZCBgbmF0aXZlRXh0ZW5zaW9uc2AKICAvLy8gZmllbGRzIG9mIHRoZSBnaXZlbiBjbGFzc2VzLiBUaGlzIGRhdGEgbXVzdCBiZSBlbWl0dGVkIHdpdGggdGhlCiAgLy8vIGNvcnJlc3BvbmRpbmcgY2xhc3Nlcy4KICAvLy8KICAvLy8gVGhlIGludGVyY2VwdG9ycyBhcmUgZmlsdGVyZWQgdG8gYXZvaWQgZW1pdHRpbmcgdHJpdmlhbCBpbnRlcmNlcHRvcnMuICBGb3IKICAvLy8gZXhhbXBsZSwgaWYgdGhlIHByb2dyYW0gY29udGFpbnMgbm8gY29kZSB0aGF0IGNhbiBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZQogIC8vLyBudW1lcm91cyBzdWJjbGFzc2VzIG9mIGBFbGVtZW50YCB0aGVuIHdlIGNhbiBwcmV0ZW5kIHRoYXQgYEVsZW1lbnRgIGlzIGEKICAvLy8gbGVhZiBjbGFzcywgYW5kIGFsbCBpbnN0YW5jZXMgb2Ygc3ViY2xhc3NlcyBvZiBgRWxlbWVudGAgYXJlIGluc3RhbmNlcyBvZgogIC8vLyBgRWxlbWVudGAuCiAgLy8vCiAgLy8vIFRoZXJlIGlzIGFsc28gYSBwZXJmb3JtYW5jZSBiZW5lZml0IChpbiBhZGRpdGlvbiB0byB0aGUgb2J2aW91cyBjb2RlIHNpemUKICAvLy8gYmVuZWZpdCksIGR1ZSB0byBob3cgW2dldE5hdGl2ZUludGVyY2VwdG9yXSB3b3Jrcy4gIEZpbmRpbmcgdGhlCiAgLy8vIGludGVyY2VwdG9yIG9mIGEgbGVhZiBjbGFzcyBpbiB0aGUgaGllcmFyY2h5IGlzIG1vcmUgZWZmaWNpZW50IHRoYXQgYQogIC8vLyBub24tbGVhZiwgc28gaXQgaW1wcm92ZXMgcGVyZm9ybWFuY2Ugd2hlbiBtb3JlIGNsYXNzZXMgY2FuIGJlIHRyZWF0ZWQgYXMKICAvLy8gbGVhdmVzLgogIC8vLwogIC8vLyBbY2xhc3Nlc10gY29udGFpbnMgbmF0aXZlIGNsYXNzZXMsIG1peGluIGFwcGxpY2F0aW9ucywgYW5kIHVzZXIgc3ViY2xhc3NlcwogIC8vLyBvZiBuYXRpdmUgY2xhc3Nlcy4KICAvLy8KICAvLy8gW2ludGVyY2VwdG9yQ2xhc3Nlc05lZWRlZEJ5Q29uc3RhbnRzXSBjb250YWlucyB0aGUgaW50ZXJjZXB0b3JzIHRoYXQgYXJlCiAgLy8vIHJlZmVyZW5jZWQgYnkgY29uc3RhbnRzLgogIC8vLwogIC8vLyBbY2xhc3Nlc01vZGlmaWVkQnlFbWl0UlRJU3VwcG9ydF0gY29udGFpbnMgdGhlIGxpc3Qgb2YgY2xhc3NlcyB0aGF0IG11c3QKICAvLy8gZXhpc3QsIGJlY2F1c2UgcnVudGltZS10eXBlIHN1cHBvcnQgYWRkcyBpbmZvcm1hdGlvbiB0byB0aGUgY2xhc3MuCiAgU2V0PENsYXNzPiBwcmVwYXJlTmF0aXZlQ2xhc3NlcygKICAgICAgTGlzdDxDbGFzcz4gY2xhc3NlcywKICAgICAgU2V0PENsYXNzRW50aXR5PiBpbnRlcmNlcHRvckNsYXNzZXNOZWVkZWRCeUNvbnN0YW50cywKICAgICAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGNsYXNzZXNOZWVkZWRGb3JSdGkpIHsKICAgIGFzc2VydChjbGFzc2VzLmV2ZXJ5KChDbGFzcyBjbHMpID0+IGNscyAhPSBudWxsKSk7CgogICAgaGFzTmF0aXZlQ2xhc3NlcyA9IGNsYXNzZXMuaXNOb3RFbXB0eTsKCiAgICAvLyBDb21wdXRlIGEgcHJlLW9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgc3ViY2xhc3MgZm9yZXN0LiAgV2UgYWN0dWFsbHkgd2FudCBhCiAgICAvLyBwb3N0LW9yZGVyIHRyYXZlcnNhbCBidXQgaXQgaXMgZWFzaWVyIHRvIGNvbXB1dGUgdGhlIHByZS1vcmRlciBhbmQgdXNlIGl0CiAgICAvLyBpbiByZXZlcnNlLgogICAgTGlzdDxDbGFzcz4gcHJlT3JkZXIgPSA8Q2xhc3M+W107CiAgICBTZXQ8Q2xhc3M+IHNlZW4gPSBuZXcgU2V0PENsYXNzPigpOwoKICAgIENsYXNzIG9iamVjdENsYXNzID0gbnVsbDsKICAgIENsYXNzIGpzSW50ZXJjZXB0b3JDbGFzcyA9IG51bGw7CgogICAgdm9pZCB3YWxrKENsYXNzIGNscykgewogICAgICBpZiAoY2xzLmVsZW1lbnQgPT0gX2NvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKSB7CiAgICAgICAgb2JqZWN0Q2xhc3MgPSBjbHM7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChjbHMuZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMuanNJbnRlcmNlcHRvckNsYXNzKSB7CiAgICAgICAganNJbnRlcmNlcHRvckNsYXNzID0gY2xzOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoc2Vlbi5jb250YWlucyhjbHMpKSByZXR1cm47CiAgICAgIHNlZW4uYWRkKGNscyk7CiAgICAgIHdhbGsoY2xzLnN1cGVyY2xhc3MpOwogICAgICBwcmVPcmRlci5hZGQoY2xzKTsKICAgIH0KCiAgICBjbGFzc2VzLmZvckVhY2god2Fsayk7CgogICAgLy8gRmluZCB3aGljaCBjbGFzc2VzIGFyZSBuZWVkZWQgYW5kIHdoaWNoIGFyZSBub24tbGVhZiBjbGFzc2VzLiAgQW55IGNsYXNzCiAgICAvLyB0aGF0IGlzIG5vdCBuZWVkZWQgY2FuIGJlIHRyZWF0ZWQgYXMgYSBsZWFmIGNsYXNzIGVxdWl2YWxlbnQgdG8gc29tZQogICAgLy8gbmVlZGVkIGNsYXNzLgoKICAgIFNldDxDbGFzcz4gbmVlZGVkQ2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3M+KCk7CiAgICBTZXQ8Q2xhc3M+IG5vbkxlYWZDbGFzc2VzID0gbmV3IFNldDxDbGFzcz4oKTsKCiAgICBNYXA8Q2xhc3MsIExpc3Q8Q2xhc3M+PiBleHRlbnNpb25Qb2ludHMgPSBjb21wdXRlRXh0ZW5zaW9uUG9pbnRzKHByZU9yZGVyKTsKCiAgICBuZWVkZWRDbGFzc2VzLmFkZChvYmplY3RDbGFzcyk7CgogICAgZm9yIChDbGFzcyBjbHMgaW4gcHJlT3JkZXIucmV2ZXJzZWQpIHsKICAgICAgQ2xhc3NFbnRpdHkgY2xhc3NFbGVtZW50ID0gY2xzLmVsZW1lbnQ7CiAgICAgIC8vIFBvc3Qtb3JkZXIgdHJhdmVyc2FsIGVuc3VyZXMgd2UgdmlzaXQgdGhlIHN1YmNsYXNzZXMgYmVmb3JlIHRoZWlyCiAgICAgIC8vIHN1cGVyY2xhc3MuICBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVsbCBpZiBhIGNsYXNzIGlzIG5lZWRlZCBiZWNhdXNlIGEKICAgICAgLy8gc3ViY2xhc3MgaXMgbmVlZGVkLgogICAgICBib29sIG5lZWRlZCA9IGZhbHNlOwogICAgICBpZiAoIWNscy5pc05hdGl2ZSkgewogICAgICAgIC8vIE1peGluIGFwcGxpY2F0aW9ucyAobmF0aXZlK21peGluKSBhcmUgbm9uLW5hdGl2ZSwgc28gW2NsYXNzRWxlbWVudF0KICAgICAgICAvLyBoYXMgYWxyZWFkeSBiZWVuIGVtaXR0ZWQgYXMgYSByZWd1bGFyIGNsYXNzLiAgTWFyayBbY2xhc3NFbGVtZW50XSBhcwogICAgICAgIC8vICduZWVkZWQnIHRvIGVuc3VyZSB0aGUgbmF0aXZlIHN1cGVyY2xhc3MgaXMgbmVlZGVkLgogICAgICAgIG5lZWRlZCA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAoIWlzVHJpdmlhbENsYXNzKGNscykpIHsKICAgICAgICBuZWVkZWQgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKGludGVyY2VwdG9yQ2xhc3Nlc05lZWRlZEJ5Q29uc3RhbnRzLmNvbnRhaW5zKGNsYXNzRWxlbWVudCkpIHsKICAgICAgICBuZWVkZWQgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKGNsYXNzZXNOZWVkZWRGb3JSdGkuY29udGFpbnMoY2xhc3NFbGVtZW50KSkgewogICAgICAgIG5lZWRlZCA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAoZXh0ZW5zaW9uUG9pbnRzLmNvbnRhaW5zS2V5KGNscykpIHsKICAgICAgICBuZWVkZWQgPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChfbmF0aXZlRGF0YS5pc0pzSW50ZXJvcENsYXNzKGNsYXNzRWxlbWVudCkpIHsKICAgICAgICBuZWVkZWQgPSB0cnVlOyAvLyBUT0RPKGphY29icik6IHdlIGRvbid0IG5lZWQgYWxsIGludGVyb3AgY2xhc3Nlcy4KICAgICAgfSBlbHNlIGlmIChjbHMuaXNOYXRpdmUgJiYKICAgICAgICAgIF9uYXRpdmVEYXRhLmhhc05hdGl2ZVRhZ3NGb3JjZWROb25MZWFmKGNsYXNzRWxlbWVudCkpIHsKICAgICAgICBuZWVkZWQgPSB0cnVlOwogICAgICAgIG5vbkxlYWZDbGFzc2VzLmFkZChjbHMpOwogICAgICB9CgogICAgICBpZiAobmVlZGVkIHx8IG5lZWRlZENsYXNzZXMuY29udGFpbnMoY2xzKSkgewogICAgICAgIG5lZWRlZENsYXNzZXMuYWRkKGNscyk7CiAgICAgICAgbmVlZGVkQ2xhc3Nlcy5hZGQoY2xzLnN1cGVyY2xhc3MpOwogICAgICAgIG5vbkxlYWZDbGFzc2VzLmFkZChjbHMuc3VwZXJjbGFzcyk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBDb2xsZWN0IGFsbCB0aGUgdGFncyB0aGF0IG1hcCB0byBlYWNoIG5hdGl2ZSBjbGFzcy4KCiAgICBNYXA8Q2xhc3MsIFNldDxTdHJpbmc+PiBsZWFmVGFncyA9IG5ldyBNYXA8Q2xhc3MsIFNldDxTdHJpbmc+PigpOwogICAgTWFwPENsYXNzLCBTZXQ8U3RyaW5nPj4gbm9ubGVhZlRhZ3MgPSBuZXcgTWFwPENsYXNzLCBTZXQ8U3RyaW5nPj4oKTsKCiAgICBmb3IgKENsYXNzIGNscyBpbiBjbGFzc2VzKSB7CiAgICAgIGlmICghY2xzLmlzTmF0aXZlKSBjb250aW51ZTsKICAgICAgQ2xhc3NFbnRpdHkgZWxlbWVudCA9IGNscy5lbGVtZW50OwogICAgICBpZiAoX25hdGl2ZURhdGEuaXNKc0ludGVyb3BDbGFzcyhlbGVtZW50KSkgY29udGludWU7CiAgICAgIExpc3Q8U3RyaW5nPiBuYXRpdmVUYWdzID0gX25hdGl2ZURhdGEuZ2V0TmF0aXZlVGFnc09mQ2xhc3MoY2xzLmVsZW1lbnQpOwoKICAgICAgaWYgKG5vbkxlYWZDbGFzc2VzLmNvbnRhaW5zKGNscykgfHwgZXh0ZW5zaW9uUG9pbnRzLmNvbnRhaW5zS2V5KGNscykpIHsKICAgICAgICBub25sZWFmVGFncwogICAgICAgICAgICAucHV0SWZBYnNlbnQoY2xzLCAoKSA9PiBuZXcgU2V0PFN0cmluZz4oKSkKICAgICAgICAgICAgLmFkZEFsbChuYXRpdmVUYWdzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBDbGFzcyBzdWZmaWNpbmdJbnRlcmNlcHRvciA9IGNsczsKICAgICAgICB3aGlsZSAoIW5lZWRlZENsYXNzZXMuY29udGFpbnMoc3VmZmljaW5nSW50ZXJjZXB0b3IpKSB7CiAgICAgICAgICBzdWZmaWNpbmdJbnRlcmNlcHRvciA9IHN1ZmZpY2luZ0ludGVyY2VwdG9yLnN1cGVyY2xhc3M7CiAgICAgICAgfQogICAgICAgIGlmIChzdWZmaWNpbmdJbnRlcmNlcHRvciA9PSBvYmplY3RDbGFzcykgewogICAgICAgICAgc3VmZmljaW5nSW50ZXJjZXB0b3IgPSBqc0ludGVyY2VwdG9yQ2xhc3M7CiAgICAgICAgfQogICAgICAgIGxlYWZUYWdzCiAgICAgICAgICAgIC5wdXRJZkFic2VudChzdWZmaWNpbmdJbnRlcmNlcHRvciwgKCkgPT4gbmV3IFNldDxTdHJpbmc+KCkpCiAgICAgICAgICAgIC5hZGRBbGwobmF0aXZlVGFncyk7CiAgICAgIH0KICAgIH0KCiAgICB2b2lkIGZpbGxOYXRpdmVJbmZvKENsYXNzIGNscykgewogICAgICBhc3NlcnQoY2xzLm5hdGl2ZUxlYWZUYWdzID09IG51bGwgJiYKICAgICAgICAgIGNscy5uYXRpdmVOb25MZWFmVGFncyA9PSBudWxsICYmCiAgICAgICAgICBjbHMubmF0aXZlRXh0ZW5zaW9ucyA9PSBudWxsKTsKICAgICAgaWYgKGxlYWZUYWdzW2Nsc10gIT0gbnVsbCkgewogICAgICAgIGNscy5uYXRpdmVMZWFmVGFncyA9IGxlYWZUYWdzW2Nsc10udG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICAgIH0KICAgICAgaWYgKG5vbmxlYWZUYWdzW2Nsc10gIT0gbnVsbCkgewogICAgICAgIGNscy5uYXRpdmVOb25MZWFmVGFncyA9IG5vbmxlYWZUYWdzW2Nsc10udG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICAgIH0KICAgICAgY2xzLm5hdGl2ZUV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludHNbY2xzXTsKICAgIH0KCiAgICAvLyBBZGQgcHJvcGVydGllcyBjb250YWluaW5nIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gY29uc3RydWN0IG1hcHMgdXNlZAogICAgLy8gYnkgZ2V0TmF0aXZlSW50ZXJjZXB0b3IgYW5kIGN1c3RvbSBlbGVtZW50cy4KICAgIGlmIChfbmF0aXZlQ29kZWdlbkVucXVldWVyLmhhc0luc3RhbnRpYXRlZE5hdGl2ZUNsYXNzZXMpIHsKICAgICAgZmlsbE5hdGl2ZUluZm8oanNJbnRlcmNlcHRvckNsYXNzKTsKICAgICAgZm9yIChDbGFzcyBjbHMgaW4gY2xhc3NlcykgewogICAgICAgIGlmICghY2xzLmlzTmF0aXZlIHx8IG5lZWRlZENsYXNzZXMuY29udGFpbnMoY2xzKSkgewogICAgICAgICAgZmlsbE5hdGl2ZUluZm8oY2xzKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBUT0RPKHNyYSk6IElzc3VlICMxMzczMS0gdGhpcyBpcyBjb21tZW50ZWQgb3V0IGFzIHBhcnQgb2YgY3VzdG9tCiAgICAvLyBlbGVtZW50IGNvbnN0cnVjdG9yIHdvcmsuCiAgICAvLyAoZmxvaXRzY2g6IHdhcyBydW4gb24gZXZlcnkgbmF0aXZlIGNsYXNzLikKICAgIC8vYXNzZXJ0KCFjbGFzc0VsZW1lbnQuaGFzQmFja2VuZE1lbWJlcnMpOwoKICAgIHJldHVybiBjbGFzc2VzCiAgICAgICAgLndoZXJlKChDbGFzcyBjbHMpID0+IGNscy5pc05hdGl2ZSAmJiAhbmVlZGVkQ2xhc3Nlcy5jb250YWlucyhjbHMpKQogICAgICAgIC50b1NldCgpOwogIH0KCiAgLy8vIENvbXB1dGVzIHRoZSBuYXRpdmUgY2xhc3NlcyB0aGF0IGFyZSBleHRlbmRlZCAoc3ViY2xhc3NlZCkgYnkgbm9uLW5hdGl2ZQogIC8vLyBjbGFzc2VzIGFuZCB0aGUgc2V0IG5vbi1tYXRpdmUgY2xhc3NlcyB0aGF0IGV4dGVuZCB0aGVtLiAgKEEgTGlzdCBpcyB1c2VkCiAgLy8vIGluc3RlYWQgb2YgYSBTZXQgZm9yIG91dCBzdGFiaWxpdHkpLgogIE1hcDxDbGFzcywgTGlzdDxDbGFzcz4+IGNvbXB1dGVFeHRlbnNpb25Qb2ludHMoTGlzdDxDbGFzcz4gY2xhc3NlcykgewogICAgQ2xhc3MgbmF0aXZlU3VwZXJjbGFzc09mKENsYXNzIGNscykgewogICAgICBpZiAoY2xzID09IG51bGwpIHJldHVybiBudWxsOwogICAgICBpZiAoY2xzLmlzTmF0aXZlKSByZXR1cm4gY2xzOwogICAgICByZXR1cm4gbmF0aXZlU3VwZXJjbGFzc09mKGNscy5zdXBlcmNsYXNzKTsKICAgIH0KCiAgICBDbGFzcyBuYXRpdmVBbmNlc3Rvck9mKENsYXNzIGNscykgewogICAgICByZXR1cm4gbmF0aXZlU3VwZXJjbGFzc09mKGNscy5zdXBlcmNsYXNzKTsKICAgIH0KCiAgICBNYXA8Q2xhc3MsIExpc3Q8Q2xhc3M+PiBtYXAgPSBuZXcgTWFwPENsYXNzLCBMaXN0PENsYXNzPj4oKTsKCiAgICBmb3IgKENsYXNzIGNscyBpbiBjbGFzc2VzKSB7CiAgICAgIGlmIChjbHMuaXNOYXRpdmUpIGNvbnRpbnVlOwogICAgICBDbGFzcyBuYXRpdmVBbmNlc3RvciA9IG5hdGl2ZUFuY2VzdG9yT2YoY2xzKTsKICAgICAgaWYgKG5hdGl2ZUFuY2VzdG9yICE9IG51bGwpIHsKICAgICAgICBtYXAucHV0SWZBYnNlbnQobmF0aXZlQW5jZXN0b3IsICgpID0+IDxDbGFzcz5bXSkuYWRkKGNscyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXA7CiAgfQoKICBib29sIGlzVHJpdmlhbENsYXNzKENsYXNzIGNscykgewogICAgYm9vbCBuZWVkc0FjY2Vzc29yKEZpZWxkIGZpZWxkKSB7CiAgICAgIHJldHVybiBmaWVsZC5uZWVkc0dldHRlciB8fAogICAgICAgICAgZmllbGQubmVlZHNVbmNoZWNrZWRTZXR0ZXIgfHwKICAgICAgICAgIGZpZWxkLm5lZWRzQ2hlY2tlZFNldHRlcjsKICAgIH0KCiAgICByZXR1cm4gY2xzLm1ldGhvZHMuaXNFbXB0eSAmJgogICAgICAgIGNscy5pc0NoZWNrcy5pc0VtcHR5ICYmCiAgICAgICAgY2xzLmNhbGxTdHVicy5pc0VtcHR5ICYmCiAgICAgICAgIWNscy5zdXBlcmNsYXNzLmlzU2ltcGxlTWl4aW5BcHBsaWNhdGlvbiAmJgogICAgICAgICFjbHMuZmllbGRzLmFueShuZWVkc0FjY2Vzc29yKTsKICB9CgogIHZvaWQgcG90ZW50aWFsbHlDb252ZXJ0RGFydENsb3N1cmVzVG9KcyhMaXN0PGpzQXN0LlN0YXRlbWVudD4gc3RhdGVtZW50cywKICAgICAgRnVuY3Rpb25FbnRpdHkgbWVtYmVyLCBMaXN0PGpzQXN0LlBhcmFtZXRlcj4gc3R1YlBhcmFtZXRlcnMpIHsKICAgIGpzQXN0LkV4cHJlc3Npb24gY2xvc3VyZUNvbnZlcnRlcjsKICAgIF93b3JsZEJ1aWxkZXIuZm9yRWFjaFBhcmFtZXRlcihtZW1iZXIsIChEYXJ0VHlwZSB0eXBlLCBTdHJpbmcgbmFtZSwgXykgewogICAgICAvLyBJZiBbbmFtZV0gaXMgbm90IGluIFtzdHViUGFyYW1ldGVyc10sIHRoZW4gdGhlIHBhcmFtZXRlciBpcyBhbiBvcHRpb25hbAogICAgICAvLyBwYXJhbWV0ZXIgdGhhdCB3YXMgbm90IHByb3ZpZGVkIGZvciB0aGlzIHN0dWIuCiAgICAgIGZvciAoanNBc3QuUGFyYW1ldGVyIHN0dWJQYXJhbWV0ZXIgaW4gc3R1YlBhcmFtZXRlcnMpIHsKICAgICAgICBpZiAoc3R1YlBhcmFtZXRlci5uYW1lID09IG5hbWUpIHsKICAgICAgICAgIHR5cGUgPSB0eXBlLnVuYWxpYXNlZDsKICAgICAgICAgIGlmICh0eXBlLmlzRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgICAgIGNsb3N1cmVDb252ZXJ0ZXIgPz89IF9lbWl0dGVyVGFzawogICAgICAgICAgICAgICAgLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKF9jb21tb25FbGVtZW50cy5jbG9zdXJlQ29udmVydGVyKTsKCiAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgdHlwZSBpcyBhIGZ1bmN0aW9uIHR5cGUgZWl0aGVyIGRpcmVjdGx5IG9yIHRocm91Z2gKICAgICAgICAgICAgLy8gdHlwZWRlZihzKS4KICAgICAgICAgICAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZSA9IHR5cGU7CiAgICAgICAgICAgIGludCBhcml0eSA9IGZ1bmN0aW9uVHlwZS5wYXJhbWV0ZXJUeXBlcy5sZW5ndGg7CiAgICAgICAgICAgIHN0YXRlbWVudHMuYWRkKGpzCiAgICAgICAgICAgICAgICAuc3RhdGVtZW50KCcjID0gIygjLCAkYXJpdHkpJywgW25hbWUsIGNsb3N1cmVDb252ZXJ0ZXIsIG5hbWVdKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgfQoKICBMaXN0PGpzQXN0LlN0YXRlbWVudD4gZ2VuZXJhdGVQYXJhbWV0ZXJTdHViU3RhdGVtZW50cygKICAgICAgRnVuY3Rpb25FbnRpdHkgbWVtYmVyLAogICAgICBib29sIGlzSW50ZXJjZXB0ZWRNZXRob2QsCiAgICAgIGpzQXN0Lk5hbWUgaW52b2NhdGlvbk5hbWUsCiAgICAgIExpc3Q8anNBc3QuUGFyYW1ldGVyPiBzdHViUGFyYW1ldGVycywKICAgICAgTGlzdDxqc0FzdC5FeHByZXNzaW9uPiBhcmd1bWVudHNCdWZmZXIsCiAgICAgIGludCBpbmRleE9mTGFzdE9wdGlvbmFsQXJndW1lbnRJblBhcmFtZXRlcnMpIHsKICAgIC8vIFRoZSB0YXJnZXQgSlMgZnVuY3Rpb24gbWF5IGNoZWNrIGFyZ3VtZW50cy5sZW5ndGggc28gd2UgbmVlZCB0bwogICAgLy8gbWFrZSBzdXJlIG5vdCB0byBwYXNzIGFueSB1bnNwZWNpZmllZCBvcHRpb25hbCBhcmd1bWVudHMgdG8gaXQuCiAgICAvLyBGb3IgZXhhbXBsZSwgZm9yIHRoZSBmb2xsb3dpbmcgRGFydCBtZXRob2Q6CiAgICAvLyAgIGZvbyh7eCwgeSwgen0pOwogICAgLy8gVGhlIGNhbGw6CiAgICAvLyAgIGZvbyh5OiAxKQogICAgLy8gbXVzdCBiZSB0dXJuZWQgaW50byBhIEpTIGNhbGwgdG86CiAgICAvLyAgIGZvbyhudWxsLCB5KS4KCiAgICBMaXN0PGpzQXN0LlN0YXRlbWVudD4gc3RhdGVtZW50cyA9IDxqc0FzdC5TdGF0ZW1lbnQ+W107CiAgICBwb3RlbnRpYWxseUNvbnZlcnREYXJ0Q2xvc3VyZXNUb0pzKHN0YXRlbWVudHMsIG1lbWJlciwgc3R1YlBhcmFtZXRlcnMpOwoKICAgIFN0cmluZyB0YXJnZXQ7CiAgICBqc0FzdC5FeHByZXNzaW9uIHJlY2VpdmVyOwogICAgTGlzdDxqc0FzdC5FeHByZXNzaW9uPiBhcmd1bWVudHM7CgogICAgYXNzZXJ0KG5hdGl2ZU1ldGhvZHMuY29udGFpbnMobWVtYmVyKSwgZmFpbGVkQXQobWVtYmVyKSk7CiAgICAvLyBXaGVuIGNhbGxpbmcgYSBKUyBtZXRob2QsIHdlIGNhbGwgaXQgd2l0aCB0aGUgbmF0aXZlIG5hbWUsIGFuZCBvbmx5IHRoZQogICAgLy8gYXJndW1lbnRzIHVwIHVudGlsIHRoZSBsYXN0IG9uZSBwcm92aWRlZC4KICAgIHRhcmdldCA9IF9uYXRpdmVEYXRhLmdldEZpeGVkQmFja2VuZE5hbWUobWVtYmVyKTsKCiAgICBpZiAoaXNJbnRlcmNlcHRlZE1ldGhvZCkgewogICAgICByZWNlaXZlciA9IGFyZ3VtZW50c0J1ZmZlclswXTsKICAgICAgYXJndW1lbnRzID0gYXJndW1lbnRzQnVmZmVyLnN1Ymxpc3QoCiAgICAgICAgICAxLCBpbmRleE9mTGFzdE9wdGlvbmFsQXJndW1lbnRJblBhcmFtZXRlcnMgKyAxKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE5hdGl2ZSBtZXRob2RzIHRoYXQgYXJlIG5vdCBpbnRlcmNlcHRlZCBtdXN0IGJlIHN0YXRpYy4KICAgICAgYXNzZXJ0KG1lbWJlci5pc1N0YXRpYywgZmFpbGVkQXQobWVtYmVyKSk7CiAgICAgIGFyZ3VtZW50cyA9IGFyZ3VtZW50c0J1ZmZlci5zdWJsaXN0KAogICAgICAgICAgMCwgaW5kZXhPZkxhc3RPcHRpb25hbEFyZ3VtZW50SW5QYXJhbWV0ZXJzICsgMSk7CiAgICAgIGlmIChfbmF0aXZlRGF0YS5pc0pzSW50ZXJvcE1lbWJlcihtZW1iZXIpKSB7CiAgICAgICAgLy8gZml4ZWRCYWNrZW5kUGF0aCBpcyBhbGxvd2VkIHRvIGhhdmUgdGhlIGZvcm0gZm9vLmJhci5iYXogZm9yCiAgICAgICAgLy8gaW50ZXJvcC4gVGhpcyB0ZW1wbGF0ZSBpcyB1bmNhY2hlZCB0byBhdm9pZCBwb3NzaWJseSBydW5uaW5nIG91dCBvZgogICAgICAgIC8vIG1lbW9yeSB3aGVuIERhcnQySnMgaXMgcnVuIGluIHNlcnZlciBtb2RlLiBJbiByZWFsaXR5IHRoZSByaXNrIG9mCiAgICAgICAgLy8gY2FjaGluZyB0aGVzZSB0ZW1wbGF0ZXMgY2F1c2luZyBhbiBpc3N1ZSAgaXMgdmVyeSBsb3cgYXMgZWFjaCBjbGFzcwogICAgICAgIC8vIGFuZCBsaWJyYXJ5IHRoYXQgdXNlcyB0eXBlZCBKYXZhU2NyaXB0IGludGVyb3Agd2lsbCBjcmVhdGUgb25seSAxCiAgICAgICAgLy8gdW5pcXVlIHRlbXBsYXRlLgogICAgICAgIHJlY2VpdmVyID0ganMKICAgICAgICAgICAgLnVuY2FjaGVkRXhwcmVzc2lvblRlbXBsYXRlKAogICAgICAgICAgICAgICAgX25hdGl2ZURhdGEuZ2V0Rml4ZWRCYWNrZW5kTWV0aG9kUGF0aChtZW1iZXIpKQogICAgICAgICAgICAuaW5zdGFudGlhdGUoW10pOwogICAgICB9IGVsc2UgewogICAgICAgIHJlY2VpdmVyID0ganMoJ3RoaXMnKTsKICAgICAgfQogICAgfQogICAgc3RhdGVtZW50cwogICAgICAgIC5hZGQoanMuc3RhdGVtZW50KCdyZXR1cm4gIy4jKCMpJywgW3JlY2VpdmVyLCB0YXJnZXQsIGFyZ3VtZW50c10pKTsKCiAgICByZXR1cm4gc3RhdGVtZW50czsKICB9CgogIGJvb2wgaXNTdXBlcnR5cGVPZk5hdGl2ZUNsYXNzKENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIGlmIChfaW50ZXJjZXB0b3JEYXRhLmlzTWl4ZWRJbnRvSW50ZXJjZXB0ZWRDbGFzcyhlbGVtZW50KSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICByZXR1cm4gc3VidHlwZXNbZWxlbWVudF0gIT0gbnVsbDsKICB9CgogIGJvb2wgcmVxdWlyZXNOYXRpdmVJc0NoZWNrKENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIC8vIFRPRE8oc3JhKTogUmVtb3ZlIHRoaXMgZnVuY3Rpb24uICBJdCBkZXRlcm1pbmVzIGlmIGEgbmF0aXZlIHR5cGUgbWF5CiAgICAvLyBzYXRpc2Z5IGEgY2hlY2sgYWdhaW5zdCBbZWxlbWVudF0sIGluIHdoaWNoIGNhc2UgYW4gaW50ZXJjZXB0b3IgbXVzdCBiZQogICAgLy8gdXNlZC4gIFdlIHNob3VsZCBhbHNvIHVzZSBhbiBpbnRlcmNlcHRvciBpZiB0aGUgY2hlY2sgY2FuJ3QgYmUgc2F0aXNmaWVkCiAgICAvLyBieSBhIG5hdGl2ZSBjbGFzcyBpbiBjYXNlIHdlIGdldCBhIG5hdGl2ZSBpbnN0YW5jZSB0aGF0IHRyaWVzIHRvIHNwb29mCiAgICAvLyB0aGUgdHlwZSBpbmZvLiAgaS5lIHRoZSBjcml0ZXJpYSBmb3Igd2hldGhlciBvciBub3QgdG8gdXNlIGFuIGludGVyY2VwdG9yCiAgICAvLyBpcyB3aGV0aGVyIHRoZSByZWNlaXZlciBjYW4gYmUgbmF0aXZlLCBub3QgdGhlIHR5cGUgb2YgdGhlIHRlc3QuCiAgICBDbGFzc0VudGl0eSBjbHMgPSBlbGVtZW50OwogICAgaWYgKF9uYXRpdmVEYXRhLmlzTmF0aXZlT3JFeHRlbmRzTmF0aXZlKGNscykpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGlzU3VwZXJ0eXBlT2ZOYXRpdmVDbGFzcyhlbGVtZW50KTsKICB9Cn0KgW4ATk48ASsBGTY9JCEgLik8MSoBNhUBFiYjKzYBNiEBMzEqATo3KgExQQFKJAFFOUgBSgZMTQZPRh0GUVBPUBEGUEZMTw4GURkGTx8GT0kjGzwzNwErAVFREyYoAR4lARs4GxAIPyIQCCYVHBkGARsBUEwVATEyAVABJAErLktQHRsbT1A/FykXTxc/FzUXCDhLIUIXIQgBMyArLAgGATsBRkkBISMpO08BThQ3IQ8qQEIKMzUKEUghCAYBJSsrKSNECCZKCDMGAU80PyojPB8KCAYBSCEyLwETTBIEAU9QK0gqJCQxBgEoMQYBQQEhIjQkQwgGEAQBIyYiKCQGASIgITQoBAFMRSdNUTg+KiElLkkBUBsuPB5REwwKCAgEATkdICEsLjVHRzMZERMpFwE8TAETHyYBPk8xNgEfJSs7DUExKzszSE9NT00cFik/Hg8fCAYPTAEXBAE3QRMGASYEATRMT1BOUUgfPy4EAgEzcGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9uYXRpdmVfZW1pdHRlci5kYXJ0PnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2VtaXR0ZXIvbmF0aXZlX2dlbmVyYXRvci5kYXJ0oSEvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmpzX2VtaXR0ZXIubmF0aXZlX2dlbmVyYXRvcjsKCmltcG9ydCAncGFja2FnZTpqc19ydW50aW1lL3NoYXJlZC9lbWJlZGRlZF9uYW1lcy5kYXJ0JyBhcyBlbWJlZGRlZE5hbWVzOwoKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBhcyBqc0FzdDsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBzaG93IGpzOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvYmFja2VuZF91c2FnZS5kYXJ0JyBzaG93IEJhY2tlbmRVc2FnZTsKCmltcG9ydCAnbW9kZWwuZGFydCc7CgpjbGFzcyBOYXRpdmVHZW5lcmF0b3IgewogIHN0YXRpYyBib29sIG5lZWRzSXNvbGF0ZUFmZmluaXR5VGFnSW5pdGlhbGl6YXRpb24oQmFja2VuZFVzYWdlIGJhY2tlbmRVc2FnZSkgewogICAgcmV0dXJuIGJhY2tlbmRVc2FnZS5uZWVkVG9Jbml0aWFsaXplSXNvbGF0ZUFmZmluaXR5VGFnOwogIH0KCiAgLy8vIEdlbmVyYXRlcyB0aGUgY29kZSBmb3IgaXNvbGF0ZSBhZmZpbml0eSB0YWdzLgogIC8vLwogIC8vLyBJbmRlcGVuZGVudGx5IERhcnQgcHJvZ3JhbXMgb24gdGhlIHNhbWUgcGFnZSBtdXN0IG5vdCBpbnRlcmZlcmUgYW5kCiAgLy8vIHRoaXMgY29kZSBzZXRzIHVwIHRoZSB2YXJpYWJsZXMgbmVlZGVkIHRvIGd1YXJhbnRlZSB0aGF0IGJlaGF2aW9yLgogIHN0YXRpYyBqc0FzdC5TdGF0ZW1lbnQgZ2VuZXJhdGVJc29sYXRlQWZmaW5pdHlUYWdJbml0aWFsaXphdGlvbigKICAgICAgQmFja2VuZFVzYWdlIGJhY2tlbmRVc2FnZSwKICAgICAganNBc3QuRXhwcmVzc2lvbiBnZW5lcmF0ZUVtYmVkZGVkR2xvYmFsQWNjZXNzKFN0cmluZyBnbG9iYWwpLAogICAgICBqc0FzdC5FeHByZXNzaW9uIGludGVyblN0cmluZ0Z1bmN0aW9uKSB7CiAgICBhc3NlcnQoYmFja2VuZFVzYWdlLm5lZWRUb0luaXRpYWxpemVJc29sYXRlQWZmaW5pdHlUYWcpOwoKICAgIGpzQXN0LkV4cHJlc3Npb24gZ2V0SXNvbGF0ZVRhZ0FjY2VzcyA9CiAgICAgICAgZ2VuZXJhdGVFbWJlZGRlZEdsb2JhbEFjY2VzcyhlbWJlZGRlZE5hbWVzLkdFVF9JU09MQVRFX1RBRyk7CiAgICBqc0FzdC5FeHByZXNzaW9uIGlzb2xhdGVUYWdBY2Nlc3MgPQogICAgICAgIGdlbmVyYXRlRW1iZWRkZWRHbG9iYWxBY2Nlc3MoZW1iZWRkZWROYW1lcy5JU09MQVRFX1RBRyk7CiAgICBqc0FzdC5FeHByZXNzaW9uIGRpc3BhdGNoUHJvcGVydHlOYW1lQWNjZXNzID0KICAgICAgICBnZW5lcmF0ZUVtYmVkZGVkR2xvYmFsQWNjZXNzKGVtYmVkZGVkTmFtZXMuRElTUEFUQ0hfUFJPUEVSVFlfTkFNRSk7CgogICAgcmV0dXJuIGpzLnN0YXRlbWVudCgnJycKICAgICAgIWZ1bmN0aW9uKCkgewogICAgICAgIHZhciBpbnRlcm4gPSAjaW50ZXJuU3RyaW5nRnVuY3Rpb247CgogICAgICAgICNnZXRJc29sYXRlVGFnID0gZnVuY3Rpb24obmFtZSkgewogICAgICAgICAgcmV0dXJuIGludGVybigiX19fZGFydF8iICsgbmFtZSArICNpc29sYXRlVGFnKTsKICAgICAgICB9OwoKICAgICAgICAvLyBUbyBlbnN1cmUgdGhhdCBkaWZmZXJlbnQgcHJvZ3JhbXMgbG9hZGVkIGludG8gdGhlIHNhbWUgY29udGV4dCAocGFnZSkKICAgICAgICAvLyB1c2UgZGlzdGluY3QgZGlzcGF0Y2ggcHJvcGVyaWVzLCB3ZSBwbGFjZSBhbiBvYmplY3Qgb24gYE9iamVjdGAgdG8KICAgICAgICAvLyBjb250YWluIHRoZSBuYW1lcyBhbHJlYWR5IGluIHVzZS4KICAgICAgICB2YXIgdGFibGVQcm9wZXJ0eSA9ICJfX19kYXJ0X2lzb2xhdGVfdGFnc18iOwogICAgICAgIHZhciB1c2VkUHJvcGVydGllcyA9IE9iamVjdFt0YWJsZVByb3BlcnR5XSB8fAogICAgICAgICAgICAoT2JqZWN0W3RhYmxlUHJvcGVydHldID0gT2JqZWN0LmNyZWF0ZShudWxsKSk7CgogICAgICAgIHZhciByb290UHJvcGVydHkgPSAiXyR7Z2VuZXJhdGVJc29sYXRlVGFnUm9vdCgpfSI7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IDsgaSsrKSB7CiAgICAgICAgICB2YXIgcHJvcGVydHkgPSBpbnRlcm4ocm9vdFByb3BlcnR5ICsgIl8iICsgaSArICJfIik7CiAgICAgICAgICBpZiAoIShwcm9wZXJ0eSBpbiB1c2VkUHJvcGVydGllcykpIHsKICAgICAgICAgICAgdXNlZFByb3BlcnRpZXNbcHJvcGVydHldID0gMTsKICAgICAgICAgICAgI2lzb2xhdGVUYWcgPSBwcm9wZXJ0eTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgjaW5pdGlhbGl6ZURpc3BhdGNoUHJvcGVydHkpIHsKICAgICAgICAgICNkaXNwYXRjaFByb3BlcnR5TmFtZSA9ICNnZXRJc29sYXRlVGFnKCJkaXNwYXRjaF9yZWNvcmQiKTsKICAgICAgICB9CiAgICAgIH0oKTsKICAgICcnJywgewogICAgICAnaW5pdGlhbGl6ZURpc3BhdGNoUHJvcGVydHknOgogICAgICAgICAgYmFja2VuZFVzYWdlLm5lZWRUb0luaXRpYWxpemVEaXNwYXRjaFByb3BlcnR5LAogICAgICAnaW50ZXJuU3RyaW5nRnVuY3Rpb24nOiBpbnRlcm5TdHJpbmdGdW5jdGlvbiwKICAgICAgJ2dldElzb2xhdGVUYWcnOiBnZXRJc29sYXRlVGFnQWNjZXNzLAogICAgICAnaXNvbGF0ZVRhZyc6IGlzb2xhdGVUYWdBY2Nlc3MsCiAgICAgICdkaXNwYXRjaFByb3BlcnR5TmFtZSc6IGRpc3BhdGNoUHJvcGVydHlOYW1lQWNjZXNzCiAgICB9KTsKICB9CgogIHN0YXRpYyBTdHJpbmcgZ2VuZXJhdGVJc29sYXRlVGFnUm9vdCgpIHsKICAgIC8vIFRPRE8oc3JhKTogTUQ1IG9mIGNvbnRyaWJ1dGluZyBzb3VyY2UgY29kZSBvciBVUklzPwogICAgcmV0dXJuICdaeFl4WCc7CiAgfQoKICAvLy8gRW5jb2RlcyB0aGUgY29sbGVjdGVkIG5hdGl2ZSBpbmZvcm1hdGlvbiBzbyB0aGF0IGl0IGNhbiBiZSB0cmVhdGVkIGJ5CiAgLy8vIHRoZSBuYXRpdmUgaW5mby1oYW5kbGVyIGJlbG93LgogIC8vLwogIC8vLyBUaGUgZW5jb2RlZCBpbmZvcm1hdGlvbiBoYXMgdGhlIGZvcm06CiAgLy8vCiAgLy8gICAgIiUiOiAibGVhZlRhZzF8bGVhZlRhZzJ8Li4uO25vbmxlYWZUYWcxfC4uLjtDbGFzczF8Q2xhc3MyfC4uLiIsCiAgLy8KICAvLyBJZiB0aGVyZSBpcyBubyBkYXRhIGZvbGxvd2luZyBhIHNlbWljb2xvbiwgdGhlIHNlbWljb2xvbiBjYW4gYmUgb21pdHRlZC4KICBzdGF0aWMganNBc3QuRXhwcmVzc2lvbiBlbmNvZGVOYXRpdmVJbmZvKENsYXNzIGNscykgewogICAgTGlzdDxTdHJpbmc+IGxlYWZUYWdzID0gY2xzLm5hdGl2ZUxlYWZUYWdzOwogICAgTGlzdDxTdHJpbmc+IG5vbkxlYWZUYWdzID0gY2xzLm5hdGl2ZU5vbkxlYWZUYWdzOwogICAgTGlzdDxDbGFzcz4gZXh0ZW5zaW9ucyA9IGNscy5uYXRpdmVFeHRlbnNpb25zOwoKICAgIFN0cmluZyBmb3JtYXRUYWdzKEl0ZXJhYmxlPFN0cmluZz4gdGFncykgewogICAgICBpZiAodGFncyA9PSBudWxsKSByZXR1cm4gJyc7CiAgICAgIHJldHVybiAodGFncy50b0xpc3QoKS4uc29ydCgpKS5qb2luKCd8Jyk7CiAgICB9CgogICAgU3RyaW5nIGxlYWZTdHIgPSBmb3JtYXRUYWdzKGxlYWZUYWdzKTsKICAgIFN0cmluZyBub25MZWFmU3RyID0gZm9ybWF0VGFncyhub25MZWFmVGFncyk7CgogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihsZWFmU3RyKTsKICAgIGlmIChub25MZWFmU3RyICE9ICcnKSB7CiAgICAgIHNiLi53cml0ZSgnOycpLi53cml0ZShub25MZWFmU3RyKTsKICAgIH0KCiAgICBTdHJpbmcgZW5jb2RpbmcgPSBzYi50b1N0cmluZygpOwoKICAgIGlmIChjbHMuaXNOYXRpdmUgfHwgZW5jb2RpbmcgIT0gJycgfHwgZXh0ZW5zaW9ucyAhPSBudWxsKSB7CiAgICAgIExpc3Q8anNBc3QuTGl0ZXJhbD4gcGFydHMgPSA8anNBc3QuTGl0ZXJhbD5banMuc3RyaW5nUGFydChlbmNvZGluZyldOwogICAgICBpZiAoZXh0ZW5zaW9ucyAhPSBudWxsKSB7CiAgICAgICAgcGFydHMKICAgICAgICAgIC4uYWRkKGpzLnN0cmluZ1BhcnQoJzsnKSkKICAgICAgICAgIC4uYWRkQWxsKGpzLmpvaW5MaXRlcmFscygKICAgICAgICAgICAgICBleHRlbnNpb25zLm1hcCgoQ2xhc3MgY2xzKSA9PiBjbHMubmFtZSksIGpzLnN0cmluZ1BhcnQoJ3wnKSkpOwogICAgICB9CiAgICAgIHJldHVybiBqc0FzdC5jb25jYXRlbmF0ZVN0cmluZ3MocGFydHMsIGFkZFF1b3RlczogdHJ1ZSk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vLyBSZXR1cm5zIGEgSmF2YVNjcmlwdCB0ZW1wbGF0ZSB0aGF0IGZpbGxzIHRoZSBlbWJlZGRlZCBnbG9iYWxzIHJlZmVyZW5jZWQKICAvLy8gYnkgW2ludGVyY2VwdG9yc0J5VGFnQWNjZXNzXSBhbmQgW2xlYWZUYWdzQWNjZXNzXS4KICAvLy8KICAvLy8gVGhpcyBjb2RlIG11c3QgYmUgaW52b2tlZCBmb3IgZXZlcnkgY2xhc3MgdGhhdCBoYXMgYSBuYXRpdmUgaW5mbyBiZWZvcmUKICAvLy8gdGhlIHByb2dyYW0gc3RhcnRzLgogIC8vLwogIC8vLyBUaGUgW2luZm9BY2Nlc3NdIHBhcmFtZXRlciBtdXN0IGV2YWx1YXRlIHRvIGFuIGV4cHJlc3Npb24gdGhhdCBjb250YWlucwogIC8vLyB0aGUgaW5mbyAoYXMgYSBKYXZhU2NyaXB0IHN0cmluZykuCiAgLy8vCiAgLy8vIFRoZSBbY29uc3RydWN0b3JBY2Nlc3NdIHBhcmFtZXRlciBtdXN0IGV2YWx1YXRlIHRvIGFuIGV4cHJlc3Npb24gdGhhdAogIC8vLyBjb250YWlucyB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGNsYXNzLiBUaGUgY29uc3RydWN0b3IncyBwcm90b3R5cGUgbXVzdAogIC8vLyBiZSBzZXQgdXAuCiAgLy8vCiAgLy8vIFRoZSBbc3ViY2xhc3NSZWFkR2VuZXJhdG9yXSBmdW5jdGlvbiBtdXN0IGV2YWx1YXRlIHRvIGEgSlMgZXhwcmVzc2lvbgogIC8vLyB0aGF0IHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGNvbnN0cnVjdG9yICh3aXRoIGV2YWx1YXRlZCBwcm90b3R5cGUpCiAgLy8vIG9mIHRoZSBnaXZlbiBKUyBleHByZXNzaW9uLgogIC8vLwogIC8vLyBUaGUgW2ludGVyY2VwdG9yc0J5VGFnQWNjZXNzXSBtdXN0IHBvaW50IHRvIHRoZSBlbWJlZGRlZCBnbG9iYWwKICAvLy8gW2VtYmVkZGVkTmFtZXMuSU5URVJDRVBUT1JTX0JZX1RBR10gYW5kIG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhbiBlbXB0eQogIC8vLyBKUyBPYmplY3QgKHVzZWQgYXMgYSBtYXApLgogIC8vLwogIC8vLyBTaW1pbGFybHksIHRoZSBbbGVhZlRhZ3NBY2Nlc3NdIG11c3QgcG9pbnQgdG8gdGhlIGVtYmVkZGVkIGdsb2JhbAogIC8vLyBbZW1iZWRkZWROYW1lcy5MRUFGX1RBR1NdIGFuZCBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYW4gZW1wdHkgSlMgT2JqZWN0CiAgLy8vICh1c2VkIGFzIGEgbWFwKS4KICAvLy8KICAvLy8gQm90aCB2YXJpYWJsZXMgYXJlIHBhc3NlZCBpbiAoaW5zdGVhZCBvZiBjcmVhdGluZyB0aGUgYWNjZXNzIGhlcmUpIHRvCiAgLy8vIG1ha2Ugc3VyZSB0aGUgY2FsbGVyIGlzIGF3YXJlIG9mIHRoZXNlIGdsb2JhbHMuCiAgc3RhdGljIGpzQXN0LlN0YXRlbWVudCBidWlsZE5hdGl2ZUluZm9IYW5kbGVyKAogICAgICBqc0FzdC5FeHByZXNzaW9uIGluZm9BY2Nlc3MsCiAgICAgIGpzQXN0LkV4cHJlc3Npb24gY29uc3RydWN0b3JBY2Nlc3MsCiAgICAgIGpzQXN0LkV4cHJlc3Npb24gc3ViY2xhc3NSZWFkR2VuZXJhdG9yKGpzQXN0LkV4cHJlc3Npb24gc3ViY2xhc3MpLAogICAgICBqc0FzdC5FeHByZXNzaW9uIGludGVyY2VwdG9yc0J5VGFnQWNjZXNzLAogICAgICBqc0FzdC5FeHByZXNzaW9uIGxlYWZUYWdzQWNjZXNzKSB7CiAgICBqc0FzdC5FeHByZXNzaW9uIHN1YmNsYXNzUmVhZCA9CiAgICAgICAgc3ViY2xhc3NSZWFkR2VuZXJhdG9yKGpzKCdzdWJjbGFzc2VzW2ldJywgW10pKTsKICAgIHJldHVybiBqcy5zdGF0ZW1lbnQoJycnCiAgICAgICAgICAvLyBUaGUgbmF0aXZlIGluZm8gbG9va3MgbGlrZSB0aGlzOgogICAgICAgICAgLy8KICAgICAgICAgIC8vIEh0bWxFbGVtZW50OiB7CiAgICAgICAgICAvLyAgICAgIiUiOiAiSFRNTERpdkVsZW1lbnR8SFRNTEFuY2hvckVsZW1lbnQ7SFRNTEVsZW1lbnQ7RmFuY3lCdXR0b24iCiAgICAgICAgICAvLwogICAgICAgICAgLy8gVGhlIGZpcnN0IHR3byBzZW1pY29sb24tc2VwYXJhdGVkIHBhcnRzIGNvbnRhaW4gZGlzcGF0Y2ggdGFncywgdGhlCiAgICAgICAgICAvLyB0aGlyZCBjb250YWlucyB0aGUgSmF2YVNjcmlwdCBuYW1lcyBmb3IgY2xhc3Nlcy4KICAgICAgICAgIC8vCiAgICAgICAgICAvLyBUaGUgdGFncyBpbmRpY2F0ZSB0aGF0IEphdmFTY3JpcHQgb2JqZWN0cyB3aXRoIHRoZSBkaXNwYXRjaCB0YWdzCiAgICAgICAgICAvLyAodXN1YWxseSBjb25zdHJ1Y3RvciBuYW1lcykgSFRNTERpdkVsZW1lbnQsIEhUTUxBbmNob3JFbGVtZW50IGFuZAogICAgICAgICAgLy8gSFRNTEVsZW1lbnQgYWxsIG1hcCB0byB0aGUgRGFydCBuYXRpdmUgY2xhc3MgbmFtZWQgSHRtbEVsZW1lbnQuCiAgICAgICAgICAvLyBUaGUgZmlyc3Qgc2V0IGlzIGZvciBlZmZlY3RpdmUgbGVhZiBub2RlcyBpbiB0aGUgaGllcmFyY2h5LCB0aGUKICAgICAgICAgIC8vIHNlY29uZCBzZXQgaXMgbm9uLWxlYWYgbm9kZXMuCiAgICAgICAgICAvLwogICAgICAgICAgLy8gVGhlIHRoaXJkIHBhcnQgY29udGFpbnMgdGhlIEphdmFTY3JpcHQgbmFtZXMgb2YgRGFydCBjbGFzc2VzIHRoYXQKICAgICAgICAgIC8vIGV4dGVuZCB0aGUgbmF0aXZlIGNsYXNzLiBIZXJlLCBGYW5jeUJ1dHRvbiBleHRlbmRzIEh0bWxFbGVtZW50LCBzbwogICAgICAgICAgLy8gdGhlIHJ1bnRpbWUgbmVlZHMgdG8ga25vdyB0aGF0IHdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5cGUgaXMgdGhlCiAgICAgICAgICAvLyBwcm90b3R5cGUgdGhhdCBuZWVkcyB0byBiZSBleHRlbmRlZCBpbiBjcmVhdGluZyB0aGUgY3VzdG9tIGVsZW1lbnQuCiAgICAgICAgICAvLwogICAgICAgICAgLy8gVGhlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gYnVpbGQgdGFibGVzIHJlZmVyZW5jZWQgYnkKICAgICAgICAgIC8vIGdldE5hdGl2ZUludGVyY2VwdG9yIGFuZCBjdXN0b20gZWxlbWVudCBzdXBwb3J0LgogICAgICAgICAgewogICAgICAgICAgICB2YXIgbmF0aXZlU3BlYyA9ICNpbmZvLnNwbGl0KCI7Iik7CiAgICAgICAgICAgIGlmIChuYXRpdmVTcGVjWzBdKSB7CiAgICAgICAgICAgICAgdmFyIHRhZ3MgPSBuYXRpdmVTcGVjWzBdLnNwbGl0KCJ8Iik7CiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0YWdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAjaW50ZXJjZXB0b3JzQnlUYWdBY2Nlc3NbdGFnc1tpXV0gPSAjY29uc3RydWN0b3I7CiAgICAgICAgICAgICAgICAjbGVhZlRhZ3NBY2Nlc3NbdGFnc1tpXV0gPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobmF0aXZlU3BlY1sxXSkgewogICAgICAgICAgICAgIHRhZ3MgPSBuYXRpdmVTcGVjWzFdLnNwbGl0KCJ8Iik7CiAgICAgICAgICAgICAgaWYgKCNhbGxvd05hdGl2ZXNTdWJjbGFzc2luZykgewogICAgICAgICAgICAgICAgaWYgKG5hdGl2ZVNwZWNbMl0pIHsKICAgICAgICAgICAgICAgICAgdmFyIHN1YmNsYXNzZXMgPSBuYXRpdmVTcGVjWzJdLnNwbGl0KCJ8Iik7CiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3ViY2xhc3Nlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBzdWJjbGFzcyA9ICNzdWJjbGFzc1JlYWQ7CiAgICAgICAgICAgICAgICAgICAgc3ViY2xhc3MuI25hdGl2ZVN1cGVyY2xhc3NUYWdOYW1lID0gdGFnc1swXTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRhZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgI2ludGVyY2VwdG9yc0J5VGFnQWNjZXNzW3RhZ3NbaV1dID0gI2NvbnN0cnVjdG9yOwogICAgICAgICAgICAgICAgICAjbGVhZlRhZ3NBY2Nlc3NbdGFnc1tpXV0gPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICcnJywgewogICAgICAnaW5mbyc6IGluZm9BY2Nlc3MsCiAgICAgICdjb25zdHJ1Y3Rvcic6IGNvbnN0cnVjdG9yQWNjZXNzLAogICAgICAnc3ViY2xhc3NSZWFkJzogc3ViY2xhc3NSZWFkLAogICAgICAnaW50ZXJjZXB0b3JzQnlUYWdBY2Nlc3MnOiBpbnRlcmNlcHRvcnNCeVRhZ0FjY2VzcywKICAgICAgJ2xlYWZUYWdzQWNjZXNzJzogbGVhZlRhZ3NBY2Nlc3MsCiAgICAgICduYXRpdmVTdXBlcmNsYXNzVGFnTmFtZSc6IGVtYmVkZGVkTmFtZXMuTkFUSVZFX1NVUEVSQ0xBU1NfVEFHX05BTUUsCiAgICAgICdhbGxvd05hdGl2ZXNTdWJjbGFzc2luZyc6IHRydWUKICAgIH0pOwogIH0KfQqA2ABOTjwBLQFJASEgPQEVARhRPAQBNAZKSUMhRC89AStFKEEyTAEcFCwBKjoLAVFOLTU2OwE7IT8vKiQTDAorRQoLCyQ5NCwmOQgEASs7FAQBTCUGLAZIBU44MDYzAS8jMAYBKzEBMRwpBgElAUBMIA4kJE0IPwYRBAFPOQZOGgZOKQZMThEGTE0iBkZQIQZIUBcGTDYxIypJMCkkOBwuDRxRDVA+DU5PTU0rDU9QUFENQz4MLyEzNkIxEA4hLy4lPUAyQRQSNEQ0EhAODAsaKCQ6KEsmCAQCATVwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL25hdGl2ZV9nZW5lcmF0b3IuZGFydEZzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19lbWl0dGVyL3BhcmFtZXRlcl9zdHViX2dlbmVyYXRvci5kYXJ0wABBDC8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuanNfZW1pdHRlci5wYXJhbWV0ZXJfc3R1Yl9nZW5lcmF0b3I7CgppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vaW8vc291cmNlX2luZm9ybWF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIGFzIGpzQXN0OwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIHNob3cganM7CmltcG9ydCAnLi4vanNfYmFja2VuZC9uYW1lci5kYXJ0JyBzaG93IE5hbWVyOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9pbnRlcmNlcHRvcl9kYXRhLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvcnVudGltZV90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jYWxsX3N0cnVjdHVyZS5kYXJ0JyBzaG93IENhbGxTdHJ1Y3R1cmU7CmltcG9ydCAnLi4vdW5pdmVyc2UvY29kZWdlbl93b3JsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3I7CmltcG9ydCAnLi4vdW5pdmVyc2Uvd29ybGRfYnVpbGRlci5kYXJ0JyBzaG93IFNlbGVjdG9yQ29uc3RyYWludHM7CmltcG9ydCAnLi4vd29ybGQuZGFydCcgc2hvdyBKQ2xvc2VkV29ybGQ7CgppbXBvcnQgJ21vZGVsLmRhcnQnOwoKaW1wb3J0ICdjb2RlX2VtaXR0ZXJfdGFzay5kYXJ0JyBzaG93IENvZGVFbWl0dGVyVGFzaywgRW1pdHRlcjsKCmNsYXNzIFBhcmFtZXRlclN0dWJHZW5lcmF0b3IgewogIHN0YXRpYyBmaW5hbCBTZXQ8U2VsZWN0b3I+IGVtcHR5U2VsZWN0b3JTZXQgPSBuZXcgU2V0PFNlbGVjdG9yPigpOwoKICBmaW5hbCBDb2RlRW1pdHRlclRhc2sgX2VtaXR0ZXJUYXNrOwogIGZpbmFsIE5hbWVyIF9uYW1lcjsKICBmaW5hbCBSdW50aW1lVHlwZXNFbmNvZGVyIF9ydGlFbmNvZGVyOwogIGZpbmFsIE5hdGl2ZURhdGEgX25hdGl2ZURhdGE7CiAgZmluYWwgSW50ZXJjZXB0b3JEYXRhIF9pbnRlcmNlcHRvckRhdGE7CiAgZmluYWwgQ29kZWdlbldvcmxkQnVpbGRlciBfY29kZWdlbldvcmxkQnVpbGRlcjsKICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwogIGZpbmFsIFNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kgX3NvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3k7CgogIFBhcmFtZXRlclN0dWJHZW5lcmF0b3IoCiAgICAgIHRoaXMuX2VtaXR0ZXJUYXNrLAogICAgICB0aGlzLl9uYW1lciwKICAgICAgdGhpcy5fcnRpRW5jb2RlciwKICAgICAgdGhpcy5fbmF0aXZlRGF0YSwKICAgICAgdGhpcy5faW50ZXJjZXB0b3JEYXRhLAogICAgICB0aGlzLl9jb2RlZ2VuV29ybGRCdWlsZGVyLAogICAgICB0aGlzLl9jbG9zZWRXb3JsZCwKICAgICAgdGhpcy5fc291cmNlSW5mb3JtYXRpb25TdHJhdGVneSk7CgogIEVtaXR0ZXIgZ2V0IF9lbWl0dGVyID0+IF9lbWl0dGVyVGFzay5lbWl0dGVyOwoKICBib29sIG5lZWRzU3VwZXJHZXR0ZXIoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgPT4KICAgICAgX2NvZGVnZW5Xb3JsZEJ1aWxkZXIubWV0aG9kc05lZWRpbmdTdXBlckdldHRlci5jb250YWlucyhlbGVtZW50KTsKCiAgLy8vIEdlbmVyYXRlcyBzdHVicyB0byBmaWxsIGluIG1pc3Npbmcgb3B0aW9uYWwgbmFtZWQgb3IgcG9zaXRpb25hbCBhcmd1bWVudHMKICAvLy8gYW5kIG1pc3NpbmcgdHlwZSBhcmd1bWVudHMuICBSZXR1cm5zIGBudWxsYCBpZiBubyBzdHViIGlzIG5lZWRlZC4KICAvLy8KICAvLy8gTWV0aG9kcyBsaWtlIGBmb28oW3hdKWAgYW5kIGBiYXIoe3h9KWAgbWF5IGJlIGludm9rZWQgYnkgdGhlIGZvbGxvd2luZwogIC8vLyBjYWxsczogYGZvbygpLCBmb28oMSksIGJhcigpLCBiYXIoeDogMSlgLiBUaGlzIG1ldGhvZCBnZW5lcmF0ZXMgdGhlIHN0dWIKICAvLy8gZm9yIHRoZSBnaXZlbiBbc2VsZWN0b3JdIGFuZCByZXR1cm5zIHRoZSBnZW5lcmF0ZWQgW1BhcmFtZXRlclN0dWJNZXRob2RdLgogIC8vLwogIC8vLyBNZW1iZXJzIG1heSBiZSBpbnZva2VkIGluIHR3byB3YXlzOiBkaXJlY3RseSwgb3IgdGhyb3VnaCBhIGNsb3N1cmUuIEluIHRoZQogIC8vLyBsYXR0ZXIgY2FzZSB0aGUgY2FsbGVyIGludm9rZXMgdGhlIHRlYXItb2ZmIGNsb3N1cmUncyBgY2FsbGAgbWV0aG9kLiBUaGlzCiAgLy8vIG1ldGhvZCBbZ2VuZXJhdGVQYXJhbWV0ZXJTdHViXSBhY2NlcHRzIHR3byBzZWxlY3RvcnMuIFRoZSByZXR1cm5lZCBzdHViCiAgLy8vIG1ldGhvZCBoYXMgdGhlIGNvcnJlc3BvbmRpbmcgbmFtZSBbUGFyYW1ldGVyU3R1Yk1ldGhvZC5uYW1lXSBhbmQKICAvLy8gW1BhcmFtZXRlclN0dWJNZXRob2QuY2FsbE5hbWVdIHNldCBpZiB0aGUgaW5wdXQgc2VsZWN0b3IgaXMgbm9uLW51bGwgKGFuZAogIC8vLyB0aGUgbWVtYmVyIG5lZWRzIGEgc3R1YikuCiAgUGFyYW1ldGVyU3R1Yk1ldGhvZCBnZW5lcmF0ZVBhcmFtZXRlclN0dWIoCiAgICAgIEZ1bmN0aW9uRW50aXR5IG1lbWJlciwgU2VsZWN0b3Igc2VsZWN0b3IsIFNlbGVjdG9yIGNhbGxTZWxlY3RvcikgewogICAgLy8gVGhlIG5hbWluZyBoZXJlIGNhbiBiZSBhIGJpdCBjb25mdXNpbmcuIFRoZXJlIGlzIGEgY2FsbCBzaXRlIHNvbWV3aGVyZQogICAgLy8gdGhhdCBjYWxscyB0aGUgc3R1YiB2aWEgdGhlIFtzZWxlY3Rvcl0sIHdoaWNoIGhhcyBhIFtDYWxsU3RydWN0dXJlXSwgc28KICAgIC8vIHRoZSAqQ2FsbCpTdHJ1Y3R1cmUgZGV0ZXJtaW5lcyB0aGUgKnBhcmFtZXRlcnMqIG9mIHRoZSBzdHViLiBUaGUgYm9keSBvZgogICAgLy8gdGhlIHN0dWIgY2FsbHMgdGhlIG1lbWJlciB3aGljaCBoYXMgYSBbUGFyYW1ldGVyU3RydWN0dXJlXSwgc28gdGhlCiAgICAvLyAqUGFyYW1ldGVyKlN0cnVjdHVyZSBkZXRlcm1pbmVzIHRoZSAqYXJndW1lbnRzKiBvZiB0aGUgZm9yd2FyZGluZyBjYWxsLgoKICAgIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSA9IHNlbGVjdG9yLmNhbGxTdHJ1Y3R1cmU7CiAgICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlID0gbWVtYmVyLnBhcmFtZXRlclN0cnVjdHVyZTsKICAgIGludCBwb3NpdGlvbmFsQXJndW1lbnRDb3VudCA9IGNhbGxTdHJ1Y3R1cmUucG9zaXRpb25hbEFyZ3VtZW50Q291bnQ7CiAgICBhc3NlcnQoY2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRDb3VudCA9PSAwIHx8CiAgICAgICAgY2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRDb3VudCA9PSBwYXJhbWV0ZXJTdHJ1Y3R1cmUudHlwZVBhcmFtZXRlcnMpOwoKICAgIC8vIFdlIGRvbid0IG5lZWQgYSBzdHViIGlmIHRoZSBhcmd1bWVudHMgbWF0Y2ggdGhlIHRhcmdldCBwYXJhbWV0ZXJzLAogICAgLy8gaS5lLiB0aGVyZSBhcmUgbm8gbWlzc2luZyBvcHRpb25hbCBhcmd1bWVudHMgb3IgdHlwZXMuIFRoZSBzZWxlY3RvcgogICAgLy8gYXBwbGllcyB0byB0aGUgbWVtYmVyLCBzbyB3ZSBjYW4gY2hlY2sgdXNpbmcgY291bnRzLgogICAgaWYgKGNhbGxTdHJ1Y3R1cmUudHlwZUFyZ3VtZW50Q291bnQgPT0gcGFyYW1ldGVyU3RydWN0dXJlLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgIGlmIChwb3NpdGlvbmFsQXJndW1lbnRDb3VudCA9PSBwYXJhbWV0ZXJTdHJ1Y3R1cmUudG90YWxQYXJhbWV0ZXJzKSB7CiAgICAgICAgLy8gUG9zaXRpb25hbCBvcHRpb25hbCBhcmd1bWVudHMgYXJlIGFsbCBwcm92aWRlZC4KICAgICAgICBhc3NlcnQoY2FsbFN0cnVjdHVyZS5pc1VubmFtZWQpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlmIChwYXJhbWV0ZXJTdHJ1Y3R1cmUubmFtZWRQYXJhbWV0ZXJzLmlzTm90RW1wdHkgJiYKICAgICAgICAgIGNhbGxTdHJ1Y3R1cmUubmFtZWRBcmd1bWVudENvdW50ID09CiAgICAgICAgICAgICAgcGFyYW1ldGVyU3RydWN0dXJlLm5hbWVkUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgICAvLyBOYW1lZCBvcHRpb25hbCBhcmd1bWVudHMgYXJlIGFsbCBwcm92aWRlZC4KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQoKICAgIExpc3Q8U3RyaW5nPiBuYW1lcyA9IGNhbGxTdHJ1Y3R1cmUuZ2V0T3JkZXJlZE5hbWVkQXJndW1lbnRzKCk7CgogICAgYm9vbCBpc0ludGVyY2VwdGVkTWV0aG9kID0gX2ludGVyY2VwdG9yRGF0YS5pc0ludGVyY2VwdGVkTWV0aG9kKG1lbWJlcik7CgogICAgLy8gSWYgdGhlIG1ldGhvZCBpcyBpbnRlcmNlcHRlZCwgd2UgbmVlZCB0byBhbHNvIHBhc3MgdGhlIGFjdHVhbCByZWNlaXZlci4KICAgIGludCBleHRyYUFyZ3VtZW50Q291bnQgPSBpc0ludGVyY2VwdGVkTWV0aG9kID8gMSA6IDA7CiAgICAvLyBVc2UgJyRyZWNlaXZlcicgdG8gYXZvaWQgY2xhc2hlcyB3aXRoIG90aGVyIHBhcmFtZXRlciBuYW1lcy4gVXNpbmcKICAgIC8vICckcmVjZWl2ZXInIHdvcmtzIGJlY2F1c2UgbmFtZXIuc2FmZVZhcmlhYmxlTmFtZSB1c2VkIGZvciBnZXR0aW5nCiAgICAvLyBwYXJhbWV0ZXIgbmFtZXMgbmV2ZXIgcmV0dXJucyBhIG5hbWUgYmVnaW5uaW5nIHdpdGggYSBzaW5nbGUgJyQnLgogICAgU3RyaW5nIHJlY2VpdmVyQXJndW1lbnROYW1lID0gcickcmVjZWl2ZXInOwoKICAgIC8vIFRoZSBwYXJhbWV0ZXJzIHRoYXQgdGhpcyBzdHViIHRha2VzLgogICAgTGlzdDxqc0FzdC5QYXJhbWV0ZXI+IHN0dWJQYXJhbWV0ZXJzID0gbmV3IExpc3Q8anNBc3QuUGFyYW1ldGVyPigKICAgICAgICBleHRyYUFyZ3VtZW50Q291bnQgKwogICAgICAgICAgICBzZWxlY3Rvci5hcmd1bWVudENvdW50ICsKICAgICAgICAgICAgc2VsZWN0b3IudHlwZUFyZ3VtZW50Q291bnQpOwogICAgLy8gVGhlIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSByZWFsIG1ldGhvZC4KICAgIExpc3Q8anNBc3QuRXhwcmVzc2lvbj4gdGFyZ2V0QXJndW1lbnRzID0gbmV3IExpc3Q8anNBc3QuRXhwcmVzc2lvbj4oCiAgICAgICAgZXh0cmFBcmd1bWVudENvdW50ICsKICAgICAgICAgICAgcGFyYW1ldGVyU3RydWN0dXJlLnRvdGFsUGFyYW1ldGVycyArCiAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZS50eXBlUGFyYW1ldGVycyk7CgogICAgaW50IGNvdW50ID0gMDsKICAgIGlmIChpc0ludGVyY2VwdGVkTWV0aG9kKSB7CiAgICAgIGNvdW50Kys7CiAgICAgIHN0dWJQYXJhbWV0ZXJzWzBdID0gbmV3IGpzQXN0LlBhcmFtZXRlcihyZWNlaXZlckFyZ3VtZW50TmFtZSk7CiAgICAgIHRhcmdldEFyZ3VtZW50c1swXSA9IGpzKCcjJywgcmVjZWl2ZXJBcmd1bWVudE5hbWUpOwogICAgfQoKICAgIGludCBvcHRpb25hbFBhcmFtZXRlclN0YXJ0ID0gcG9zaXRpb25hbEFyZ3VtZW50Q291bnQgKyBleHRyYUFyZ3VtZW50Q291bnQ7CiAgICAvLyBJbmNsdWRlcyBleHRyYSByZWNlaXZlciBhcmd1bWVudCB3aGVuIHVzaW5nIGludGVyY2VwdG9yIGNvbnZlbnRpb24KICAgIGludCBpbmRleE9mTGFzdE9wdGlvbmFsQXJndW1lbnRJblBhcmFtZXRlcnMgPSBvcHRpb25hbFBhcmFtZXRlclN0YXJ0IC0gMTsKCiAgICBfY29kZWdlbldvcmxkQnVpbGRlci5mb3JFYWNoUGFyYW1ldGVyKG1lbWJlciwKICAgICAgICAoXywgU3RyaW5nIG5hbWUsIENvbnN0YW50VmFsdWUgdmFsdWUpIHsKICAgICAgU3RyaW5nIGpzTmFtZSA9IF9uYW1lci5zYWZlVmFyaWFibGVOYW1lKG5hbWUpOwogICAgICBhc3NlcnQoanNOYW1lICE9IHJlY2VpdmVyQXJndW1lbnROYW1lKTsKICAgICAgaWYgKGNvdW50IDwgb3B0aW9uYWxQYXJhbWV0ZXJTdGFydCkgewogICAgICAgIHN0dWJQYXJhbWV0ZXJzW2NvdW50XSA9IG5ldyBqc0FzdC5QYXJhbWV0ZXIoanNOYW1lKTsKICAgICAgICB0YXJnZXRBcmd1bWVudHNbY291bnRdID0ganMoJyMnLCBqc05hbWUpOwogICAgICB9IGVsc2UgewogICAgICAgIGludCBpbmRleCA9IG5hbWVzLmluZGV4T2YobmFtZSk7CiAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7CiAgICAgICAgICBpbmRleE9mTGFzdE9wdGlvbmFsQXJndW1lbnRJblBhcmFtZXRlcnMgPSBjb3VudDsKICAgICAgICAgIC8vIFRoZSBvcmRlciBvZiB0aGUgbmFtZWQgYXJndW1lbnRzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUKICAgICAgICAgIC8vIG9uZSBpbiB0aGUgcmVhbCBtZXRob2QgKHdoaWNoIGlzIGluIERhcnQgc291cmNlIG9yZGVyKS4KICAgICAgICAgIHRhcmdldEFyZ3VtZW50c1tjb3VudF0gPSBqcygnIycsIGpzTmFtZSk7CiAgICAgICAgICBzdHViUGFyYW1ldGVyc1tvcHRpb25hbFBhcmFtZXRlclN0YXJ0ICsgaW5kZXhdID0KICAgICAgICAgICAgICBuZXcganNBc3QuUGFyYW1ldGVyKGpzTmFtZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgICAgIHRhcmdldEFyZ3VtZW50c1tjb3VudF0gPQogICAgICAgICAgICAgICAgX2VtaXR0ZXIuY29uc3RhbnRSZWZlcmVuY2UobmV3IE51bGxDb25zdGFudFZhbHVlKCkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCF2YWx1ZS5pc051bGwpIHsKICAgICAgICAgICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgdGhlIG51bGwgY29uc3RhbnQsIHdlIHNob3VsZCBub3QgcGFzcyBpdAogICAgICAgICAgICAgIC8vIGRvd24gdG8gdGhlIG5hdGl2ZSBtZXRob2QuCiAgICAgICAgICAgICAgaW5kZXhPZkxhc3RPcHRpb25hbEFyZ3VtZW50SW5QYXJhbWV0ZXJzID0gY291bnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGFyZ2V0QXJndW1lbnRzW2NvdW50XSA9IF9lbWl0dGVyLmNvbnN0YW50UmVmZXJlbmNlKHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY291bnQrKzsKICAgIH0pOwoKICAgIGlmIChwYXJhbWV0ZXJTdHJ1Y3R1cmUudHlwZVBhcmFtZXRlcnMgPiAwKSB7CiAgICAgIGludCBwYXJhbWV0ZXJJbmRleCA9CiAgICAgICAgICBzdHViUGFyYW1ldGVycy5sZW5ndGggLSBwYXJhbWV0ZXJTdHJ1Y3R1cmUudHlwZVBhcmFtZXRlcnM7CiAgICAgIGZvciAoVHlwZVZhcmlhYmxlVHlwZSB0eXBlVmFyaWFibGUKICAgICAgICAgIGluIF9jbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQuZ2V0RnVuY3Rpb25UeXBlVmFyaWFibGVzKG1lbWJlcikpIHsKICAgICAgICBpZiAoc2VsZWN0b3IudHlwZUFyZ3VtZW50Q291bnQgPT0gMCkgewogICAgICAgICAgdGFyZ2V0QXJndW1lbnRzW2NvdW50KytdID0gX3J0aUVuY29kZXIuZ2V0VHlwZVJlcHJlc2VudGF0aW9uKAogICAgICAgICAgICAgIF9lbWl0dGVyLAogICAgICAgICAgICAgIF9jbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQKICAgICAgICAgICAgICAgICAgLmdldFR5cGVWYXJpYWJsZURlZmF1bHRUeXBlKHR5cGVWYXJpYWJsZS5lbGVtZW50KSwKICAgICAgICAgICAgICAoXykgPT4gX2VtaXR0ZXIuY29uc3RhbnRSZWZlcmVuY2UoCiAgICAgICAgICAgICAgICAgIC8vIFRPRE8oMzM0MjIpOiBTdXBwb3J0IHR5cGUgdmFyaWFibGVzIGluIGRlZmF1bHQKICAgICAgICAgICAgICAgICAgLy8gdHlwZXMuIFRlbXBvcmFyaWx5IHVzaW5nIHRoZSAiYW55IiB0eXBlIChlbmNvZGVkIGFzIC0yKSB0bwogICAgICAgICAgICAgICAgICAvLyBhdm9pZCBmYWlsaW5nIG9uIGJvdW5kcyBjaGVja3MuCiAgICAgICAgICAgICAgICAgIG5ldyBJbnRDb25zdGFudFZhbHVlKG5ldyBCaWdJbnQuZnJvbSgtMikpKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIFN0cmluZyBqc05hbWUgPSAnXCQke3R5cGVWYXJpYWJsZS5lbGVtZW50Lm5hbWV9JzsKICAgICAgICAgIHN0dWJQYXJhbWV0ZXJzW3BhcmFtZXRlckluZGV4KytdID0gbmV3IGpzQXN0LlBhcmFtZXRlcihqc05hbWUpOwogICAgICAgICAgdGFyZ2V0QXJndW1lbnRzW2NvdW50KytdID0ganMoJyMnLCBqc05hbWUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHZhciBib2R5OyAvLyBMaXN0IG9yIGpzQXN0LlN0YXRlbWVudC4KICAgIGlmIChfbmF0aXZlRGF0YS5oYXNGaXhlZEJhY2tlbmROYW1lKG1lbWJlcikpIHsKICAgICAgYm9keSA9IF9lbWl0dGVyVGFzay5uYXRpdmVFbWl0dGVyLmdlbmVyYXRlUGFyYW1ldGVyU3R1YlN0YXRlbWVudHMoCiAgICAgICAgICBtZW1iZXIsCiAgICAgICAgICBpc0ludGVyY2VwdGVkTWV0aG9kLAogICAgICAgICAgX25hbWVyLmludm9jYXRpb25OYW1lKHNlbGVjdG9yKSwKICAgICAgICAgIHN0dWJQYXJhbWV0ZXJzLAogICAgICAgICAgdGFyZ2V0QXJndW1lbnRzLAogICAgICAgICAgaW5kZXhPZkxhc3RPcHRpb25hbEFyZ3VtZW50SW5QYXJhbWV0ZXJzKTsKICAgIH0gZWxzZSBpZiAobWVtYmVyLmlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgaWYgKG5lZWRzU3VwZXJHZXR0ZXIobWVtYmVyKSkgewogICAgICAgIENsYXNzRW50aXR5IHN1cGVyQ2xhc3MgPSBtZW1iZXIuZW5jbG9zaW5nQ2xhc3M7CiAgICAgICAganNBc3QuTmFtZSBtZXRob2ROYW1lID0gX25hbWVyLmluc3RhbmNlTWV0aG9kTmFtZShtZW1iZXIpOwogICAgICAgIC8vIFdoZW4gcmVkaXJlY3RpbmcsIHdlIG11c3QgZW5zdXJlIHRoYXQgd2UgZG9uJ3QgZW5kIHVwIGluIGEgc3ViY2xhc3MuCiAgICAgICAgLy8gV2UgdGh1cyBjYW4ndCBqdXN0IGludm9rZSBgdGhpcy5mb28kMS5jYWxsKGZpbGxlZEluQXJndW1lbnRzKWAuCiAgICAgICAgLy8gSW5zdGVhZCB3ZSBuZWVkIHRvIGNhbGwgdGhlIHN0YXRpY2FsbHkgcmVzb2x2ZWQgdGFyZ2V0LgogICAgICAgIC8vICAgYDxjbGFzcz4ucHJvdG90eXBlLmJhciQxLmNhbGwodGhpcywgYXJndW1lbnQwLCAuLi4pYC4KICAgICAgICBib2R5ID0ganMuc3RhdGVtZW50KCdyZXR1cm4gIy4jLmNhbGwodGhpcywgIyk7JywgWwogICAgICAgICAgX2VtaXR0ZXJUYXNrLnByb3RvdHlwZUFjY2VzcyhzdXBlckNsYXNzLCBoYXNCZWVuSW5zdGFudGlhdGVkOiB0cnVlKSwKICAgICAgICAgIG1ldGhvZE5hbWUsCiAgICAgICAgICB0YXJnZXRBcmd1bWVudHMKICAgICAgICBdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBib2R5ID0ganMuc3RhdGVtZW50KCdyZXR1cm4gdGhpcy4jKCMpOycsCiAgICAgICAgICAgIFtfbmFtZXIuaW5zdGFuY2VNZXRob2ROYW1lKG1lbWJlciksIHRhcmdldEFyZ3VtZW50c10pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBib2R5ID0ganMuc3RhdGVtZW50KCdyZXR1cm4gIygjKScsCiAgICAgICAgICBbX2VtaXR0ZXIuc3RhdGljRnVuY3Rpb25BY2Nlc3MobWVtYmVyKSwgdGFyZ2V0QXJndW1lbnRzXSk7CiAgICB9CgogICAgU291cmNlSW5mb3JtYXRpb25CdWlsZGVyIHNvdXJjZUluZm9ybWF0aW9uQnVpbGRlciA9CiAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kuY3JlYXRlQnVpbGRlckZvckNvbnRleHQobWVtYmVyKTsKICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0KICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRTdHViKG1lbWJlciwgY2FsbFN0cnVjdHVyZSk7CgogICAganNBc3QuRnVuIGZ1bmN0aW9uID0ganMoJ2Z1bmN0aW9uKCMpIHsgIzsgfScsIFtzdHViUGFyYW1ldGVycywgYm9keV0pCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7CgogICAganNBc3QuTmFtZSBuYW1lID0gbWVtYmVyLmlzU3RhdGljID8gbnVsbCA6IF9uYW1lci5pbnZvY2F0aW9uTmFtZShzZWxlY3Rvcik7CiAgICBqc0FzdC5OYW1lIGNhbGxOYW1lID0KICAgICAgICAoY2FsbFNlbGVjdG9yICE9IG51bGwpID8gX25hbWVyLmludm9jYXRpb25OYW1lKGNhbGxTZWxlY3RvcikgOiBudWxsOwogICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJTdHViTWV0aG9kKG5hbWUsIGNhbGxOYW1lLCBmdW5jdGlvbiwgZWxlbWVudDogbWVtYmVyKTsKICB9CgogIC8vIFdlIGZpbGwgdGhlIGxpc3RzIGRlcGVuZGluZyBvbiBwb3NzaWJsZS9pbnZva2VkIHNlbGVjdG9ycy4gRm9yIGV4YW1wbGUsCiAgLy8gdGFrZSBtZXRob2QgZm9vOgogIC8vICAgIGZvbyhhLCBiLCB7YywgZH0pOwogIC8vCiAgLy8gV2UgbWF5IGhhdmUgbXVsdGlwbGUgd2F5cyBvZiBjYWxsaW5nIGZvbzoKICAvLyAoMSkgZm9vKDEsIDIpOwogIC8vICgyKSBmb28oMSwgMiwgYzogMyk7CiAgLy8gKDMpIGZvbygxLCAyLCBkOiA0KTsKICAvLyAoNCkgZm9vKDEsIDIsIGM6IDMsIGQ6IDQpOwogIC8vICg1KSBmb28oMSwgMiwgZDogNCwgYzogMyk7CiAgLy8KICAvLyBXaGF0IHdlIGdlbmVyYXRlIGF0IHRoZSBjYWxsIHNpdGVzIGFyZToKICAvLyAoMSkgZm9vJDIoMSwgMik7CiAgLy8gKDIpIGZvbyQzJGMoMSwgMiwgMyk7CiAgLy8gKDMpIGZvbyQzJGQoMSwgMiwgNCk7CiAgLy8gKDQpIGZvbyQ0JGMkZCgxLCAyLCAzLCA0KTsKICAvLyAoNSkgZm9vJDQkYyRkKDEsIDIsIDMsIDQpOwogIC8vCiAgLy8gVGhlIHN0dWJzIHdlIGdlbmVyYXRlIGFyZSAoZXhwcmVzc2VkIGluIERhcnQpOgogIC8vICgxKSBmb28kMihhLCBiKSA9PiBmb28kNCRjJGQoYSwgYiwgbnVsbCwgbnVsbCkKICAvLyAoMikgZm9vJDMkYyhhLCBiLCBjKSA9PiBmb28kNCRjJGQoYSwgYiwgYywgbnVsbCk7CiAgLy8gKDMpIGZvbyQzJGQoYSwgYiwgZCkgPT4gZm9vJDQkYyRkKGEsIGIsIG51bGwsIGQpOwogIC8vICg0KSBObyBzdHViIGdlbmVyYXRlZCwgY2FsbCBpcyBkaXJlY3QuCiAgLy8gKDUpIE5vIHN0dWIgZ2VuZXJhdGVkLCBjYWxsIGlzIGRpcmVjdC4KICAvLwogIC8vIFdlIG5lZWQgdG8gcGF5IGF0dGVudGlvbiBpZiB0aGlzIHN0dWIgaXMgZm9yIGEgZnVuY3Rpb24gdGhhdCBoYXMgYmVlbgogIC8vIGludm9rZWQgZnJvbSBhIHN1YmNsYXNzLiBUaGVuIHdlIGNhbm5vdCBqdXN0IHJlZGlyZWN0LCBzaW5jZSB0aGF0CiAgLy8gd291bGQgaW52b2tlIHRoZSBtZXRob2RzIG9mIHRoZSBzdWJjbGFzcy4gV2UgaGF2ZSB0byBjb21waWxlIHRvOgogIC8vICgxKSBmb28kMihhLCBiKSA9PiBNeUNsYXNzLmZvbyQ0JGMkZC5jYWxsKHRoaXMsIGEsIGIsIG51bGwsIG51bGwpCiAgLy8gKDIpIGZvbyQzJGMoYSwgYiwgYykgPT4gTXlDbGFzcy5mb28kNCRjJGQodGhpcywgYSwgYiwgYywgbnVsbCk7CiAgLy8gKDMpIGZvbyQzJGQoYSwgYiwgZCkgPT4gTXlDbGFzcy5mb28kNCRjJGQodGhpcywgYSwgYiwgbnVsbCwgZCk7CiAgTGlzdDxQYXJhbWV0ZXJTdHViTWV0aG9kPiBnZW5lcmF0ZVBhcmFtZXRlclN0dWJzKEZ1bmN0aW9uRW50aXR5IG1lbWJlciwKICAgICAge2Jvb2wgY2FuVGVhck9mZiwgYm9vbCBjYW5CZUFwcGxpZWR9KSB7CiAgICBhc3NlcnQoY2FuVGVhck9mZiAhPSBudWxsKTsKICAgIGFzc2VydChjYW5CZUFwcGxpZWQgIT0gbnVsbCk7CiAgICAvLyBUaGUgc2V0IG9mIHNlbGVjdG9ycyB0aGF0IGFwcGx5IHRvIGBtZW1iZXJgLiBGb3IgZXhhbXBsZSwgZm9yCiAgICAvLyBhIG1lbWJlciBgZm9vKHgsIFt5XSlgIHRoZSBmb2xsb3dpbmcgc2VsZWN0b3JzIG1heSBhcHBseToKICAgIC8vIGBmb28oeClgLCBhbmQgYGZvbyh4LCB5KWAuCiAgICBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+IGxpdmVTZWxlY3RvcnM7CiAgICAvLyBUaGUgc2V0IG9mIHNlbGVjdG9ycyB0aGF0IGFwcGx5IHRvIGBtZW1iZXJgIGlmIGl0J3MgbmFtZSB3YXMgYGNhbGxgLgogICAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gYSBtZW1iZXIgaXMgdG9ybiBvZmYuIEluIHRoYXQgY2FzZSBjYWxscyB0byB0aGUKICAgIC8vIGZ1bmN0aW9uIHVzZSB0aGUgbmFtZSBgY2FsbGAsIGFuZCB3ZSBtdXN0IGJlIGFibGUgdG8gaGFuZGxlIGV2ZXJ5CiAgICAvLyBgY2FsbGAgaW52b2NhdGlvbiB0aGF0IG1hdGNoZXMgdGhlIHNpZ25hdHVyZS4gRm9yIGV4YW1wbGUsIGZvcgogICAgLy8gYSBtZW1iZXIgYGZvbyh4LCBbeV0pYCB0aGUgZm9sbG93aW5nIHNlbGVjdG9ycyB3b3VsZCBiZSBwb3NzaWJsZQogICAgLy8gY2FsbC1zZWxlY3RvcnM6IGBjYWxsKHgpYCwgYW5kIGBjYWxsKHgsIHkpYC4KICAgIE1hcDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4gY2FsbFNlbGVjdG9yczsKCiAgICBpbnQgbWVtYmVyVHlwZVBhcmFtZXRlcnMgPSBtZW1iZXIucGFyYW1ldGVyU3RydWN0dXJlLnR5cGVQYXJhbWV0ZXJzOwoKICAgIC8vIE9ubHkgaW5zdGFuY2UgbWVtYmVycyAobm90IHN0YXRpYyBtZXRob2RzKSBuZWVkIHN0dWJzLgogICAgaWYgKG1lbWJlci5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgIGxpdmVTZWxlY3RvcnMgPSBfY29kZWdlbldvcmxkQnVpbGRlci5pbnZvY2F0aW9uc0J5TmFtZShtZW1iZXIubmFtZSk7CiAgICB9CgogICAgaWYgKGNhblRlYXJPZmYpIHsKICAgICAgU3RyaW5nIGNhbGwgPSBfbmFtZXIuY2xvc3VyZUludm9jYXRpb25TZWxlY3Rvck5hbWU7CiAgICAgIGNhbGxTZWxlY3RvcnMgPSBfY29kZWdlbldvcmxkQnVpbGRlci5pbnZvY2F0aW9uc0J5TmFtZShjYWxsKTsKICAgIH0KCiAgICBhc3NlcnQoZW1wdHlTZWxlY3RvclNldC5pc0VtcHR5KTsKICAgIGxpdmVTZWxlY3RvcnMgPz89IGNvbnN0IDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz57fTsKICAgIGNhbGxTZWxlY3RvcnMgPz89IGNvbnN0IDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz57fTsKCiAgICBMaXN0PFBhcmFtZXRlclN0dWJNZXRob2Q+IHN0dWJzID0gPFBhcmFtZXRlclN0dWJNZXRob2Q+W107CgogICAgaWYgKGxpdmVTZWxlY3RvcnMuaXNFbXB0eSAmJgogICAgICAgIGNhbGxTZWxlY3RvcnMuaXNFbXB0eSAmJgogICAgICAgIC8vIEZ1bmN0aW9uLmFwcGx5IG1pZ2h0IG5lZWQgYSBzdHViIHRvIGRlZmF1bHQgdGhlIHR5cGUgcGFyYW1ldGVyLgogICAgICAgICEoY2FuQmVBcHBsaWVkICYmIG1lbWJlclR5cGVQYXJhbWV0ZXJzID4gMCkpIHsKICAgICAgcmV0dXJuIHN0dWJzOwogICAgfQoKICAgIC8vIEZvciBldmVyeSBjYWxsLXNlbGVjdG9yIHRoZSBjb3JyZXNwb25kaW5nIHNlbGVjdG9yIHdpdGggdGhlIG5hbWUgb2YgdGhlCiAgICAvLyBtZW1iZXIuCiAgICAvLwogICAgLy8gRm9yIGV4YW1wbGUsIGZvciB0aGUgY2FsbC1zZWxlY3RvciBgY2FsbCh4LCB5KWAgdGhlIHJlbmFtZWQgc2VsZWN0b3IKICAgIC8vIGZvciBtZW1iZXIgYGZvb2Agd291bGQgYmUgYGZvbyh4LCB5KWAuCiAgICBTZXQ8U2VsZWN0b3I+IHJlbmFtZWRDYWxsU2VsZWN0b3JzID0gbmV3IFNldDxTZWxlY3Rvcj4oKTsKCiAgICBTZXQ8U2VsZWN0b3I+IHN0dWJTZWxlY3RvcnMgPSBuZXcgU2V0PFNlbGVjdG9yPigpOwoKICAgIC8vIFN0YXJ0IHdpdGggY2xvc3VyZS1jYWxsIHNlbGVjdG9ycywgc2luY2Ugc2luY2UgdGhleSBpbXBseSB0aGUgZ2VuZXJhdGlvbgogICAgLy8gb2YgdGhlIG5vbi1jYWxsIHZlcnNpb24uCiAgICBpZiAoY2FuQmVBcHBsaWVkICYmIG1lbWJlclR5cGVQYXJhbWV0ZXJzID4gMCkgewogICAgICAvLyBGdW5jdGlvbi5hcHBseSBjYWxscyB0aGUgZnVuY3Rpb24gd2l0aCBubyB0eXBlIGFyZ3VtZW50cywgc28gZ2VuZXJpYwogICAgICAvLyBtZXRob2RzIG5lZWQgdGhlIHN0dWIgdG8gZGVmYXVsdCB0aGUgdHlwZSBhcmd1bWVudHMuCiAgICAgIC8vIFRoaXMgaGFzIHRvIGJlIHRoZSBmaXJzdCBzdHViLgogICAgICBTZWxlY3RvciBuYW1lZFNlbGVjdG9yID0gbmV3IFNlbGVjdG9yLmZyb21FbGVtZW50KG1lbWJlcikudG9Ob25HZW5lcmljKCk7CiAgICAgIFNlbGVjdG9yIGNsb3N1cmVTZWxlY3RvciA9CiAgICAgICAgICBuYW1lZFNlbGVjdG9yLmlzQ2xvc3VyZUNhbGwgPyBudWxsIDogbmFtZWRTZWxlY3Rvci50b0NhbGxTZWxlY3RvcigpOwoKICAgICAgcmVuYW1lZENhbGxTZWxlY3RvcnMuYWRkKG5hbWVkU2VsZWN0b3IpOwogICAgICBzdHViU2VsZWN0b3JzLmFkZChuYW1lZFNlbGVjdG9yKTsKICAgICAgUGFyYW1ldGVyU3R1Yk1ldGhvZCBzdHViID0KICAgICAgICAgIGdlbmVyYXRlUGFyYW1ldGVyU3R1YihtZW1iZXIsIG5hbWVkU2VsZWN0b3IsIGNsb3N1cmVTZWxlY3Rvcik7CiAgICAgIGFzc2VydChzdHViICE9IG51bGwpOwogICAgICBzdHVicy5hZGQoc3R1Yik7CiAgICB9CgogICAgZm9yIChTZWxlY3RvciBzZWxlY3RvciBpbiBjYWxsU2VsZWN0b3JzLmtleXMpIHsKICAgICAgU2VsZWN0b3IgcmVuYW1lZFNlbGVjdG9yID0KICAgICAgICAgIG5ldyBTZWxlY3Rvci5jYWxsKG1lbWJlci5tZW1iZXJOYW1lLCBzZWxlY3Rvci5jYWxsU3RydWN0dXJlKTsKICAgICAgcmVuYW1lZENhbGxTZWxlY3RvcnMuYWRkKHJlbmFtZWRTZWxlY3Rvcik7CgogICAgICBpZiAoIXJlbmFtZWRTZWxlY3Rvci5hcHBsaWVzVW5uYW1lZChtZW1iZXIpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIGlmIChzdHViU2VsZWN0b3JzLmFkZChyZW5hbWVkU2VsZWN0b3IpKSB7CiAgICAgICAgUGFyYW1ldGVyU3R1Yk1ldGhvZCBzdHViID0KICAgICAgICAgICAgZ2VuZXJhdGVQYXJhbWV0ZXJTdHViKG1lbWJlciwgcmVuYW1lZFNlbGVjdG9yLCBzZWxlY3Rvcik7CiAgICAgICAgaWYgKHN0dWIgIT0gbnVsbCkgewogICAgICAgICAgc3R1YnMuYWRkKHN0dWIpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gQSBnZW5lcmljIG1ldGhvZCBtaWdodCBuZWVkIHRvIHN1cHBvcnQgYGNhbGw8VD4oeClgIGZvciBhIGdlbmVyaWMKICAgICAgLy8gaW5zdGFudGlhdGlvbiBzdHViIHdpdGhvdXQgYGNhbGw8VD4oeClgIGJlaW5nIGluIFtjYWxsU2VsZWN0b3JzXS4KICAgICAgLy8gW3NlbGVjdG9yXSB3aWxsIGJlIGBjYWxsKHgpYCAodGhhdCBhbHJlYWR5IHBhc3NlcyB0aGUgYXBwbGllc1VubmFtZWQKICAgICAgLy8gY2hlY2sgYnkgZGVmYXVsdGluZyB0eXBlIGFyZ3VtZW50cyksIGFuZCB0aGUgbWV0aG9kIHdpbGwgYmUgZ2VuZXJpYy4KICAgICAgLy8KICAgICAgLy8gVGhpcyBpcyBiYXNpY2FsbHkgdGhlIHNhbWUgbG9naWMgYXMgYWJvdmUsIGJ1dCB3aXRoIHR5cGUgYXJndW1lbnRzLgogICAgICBpZiAoc2VsZWN0b3IuY2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRDb3VudCA9PSAwKSB7CiAgICAgICAgaWYgKG1lbWJlclR5cGVQYXJhbWV0ZXJzID4gMCkgewogICAgICAgICAgU2VsZWN0b3IgcmVuYW1lZFNlbGVjdG9yV2l0aFR5cGVBcmd1bWVudHMgPSBuZXcgU2VsZWN0b3IuY2FsbCgKICAgICAgICAgICAgICBtZW1iZXIubWVtYmVyTmFtZSwKICAgICAgICAgICAgICBzZWxlY3Rvci5jYWxsU3RydWN0dXJlCiAgICAgICAgICAgICAgICAgIC53aXRoVHlwZUFyZ3VtZW50Q291bnQobWVtYmVyVHlwZVBhcmFtZXRlcnMpKTsKICAgICAgICAgIHJlbmFtZWRDYWxsU2VsZWN0b3JzLmFkZChyZW5hbWVkU2VsZWN0b3JXaXRoVHlwZUFyZ3VtZW50cyk7CgogICAgICAgICAgaWYgKHN0dWJTZWxlY3RvcnMuYWRkKHJlbmFtZWRTZWxlY3RvcldpdGhUeXBlQXJndW1lbnRzKSkgewogICAgICAgICAgICBTZWxlY3RvciBjbG9zdXJlU2VsZWN0b3IgPQogICAgICAgICAgICAgICAgbmV3IFNlbGVjdG9yLmNhbGxDbG9zdXJlRnJvbShyZW5hbWVkU2VsZWN0b3JXaXRoVHlwZUFyZ3VtZW50cyk7CiAgICAgICAgICAgIFBhcmFtZXRlclN0dWJNZXRob2Qgc3R1YiA9IGdlbmVyYXRlUGFyYW1ldGVyU3R1YigKICAgICAgICAgICAgICAgIG1lbWJlciwgcmVuYW1lZFNlbGVjdG9yV2l0aFR5cGVBcmd1bWVudHMsIGNsb3N1cmVTZWxlY3Rvcik7CiAgICAgICAgICAgIGlmIChzdHViICE9IG51bGwpIHsKICAgICAgICAgICAgICBzdHVicy5hZGQoc3R1Yik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBOb3cgcnVuIHRocm91Z2ggdGhlIGFjdHVhbCBtZW1iZXIgc2VsZWN0b3JzIChlZy4gYGZvbyQyKHgsIHkpYCBhbmQgbm90CiAgICAvLyBgY2FsbCQyKHgsIHkpYCkuIFNvbWUgb2YgdGhlbSBoYXZlIGFscmVhZHkgYmVlbiBnZW5lcmF0ZWQgYmVjYXVzZSBvZiB0aGUKICAgIC8vIGNhbGwtc2VsZWN0b3JzIGFuZCB0aGV5IGFyZSBpbiB0aGUgcmVuYW1lZENhbGxTZWxlY3RvcnMgc2V0LgogICAgZm9yIChTZWxlY3RvciBzZWxlY3RvciBpbiBsaXZlU2VsZWN0b3JzLmtleXMpIHsKICAgICAgaWYgKHJlbmFtZWRDYWxsU2VsZWN0b3JzLmNvbnRhaW5zKHNlbGVjdG9yKSkgY29udGludWU7CiAgICAgIGlmICghc2VsZWN0b3IuYXBwbGllc1VubmFtZWQobWVtYmVyKSkgY29udGludWU7CiAgICAgIGlmICghbGl2ZVNlbGVjdG9yc1tzZWxlY3Rvcl0KICAgICAgICAgIC5jYW5IaXQobWVtYmVyLCBzZWxlY3Rvci5tZW1iZXJOYW1lLCBfY2xvc2VkV29ybGQpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIGlmIChzdHViU2VsZWN0b3JzLmFkZChzZWxlY3RvcikpIHsKICAgICAgICBQYXJhbWV0ZXJTdHViTWV0aG9kIHN0dWIgPQogICAgICAgICAgICBnZW5lcmF0ZVBhcmFtZXRlclN0dWIobWVtYmVyLCBzZWxlY3RvciwgbnVsbCk7CiAgICAgICAgaWYgKHN0dWIgIT0gbnVsbCkgewogICAgICAgICAgc3R1YnMuYWRkKHN0dWIpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHJldHVybiBzdHViczsKICB9Cn0KgY8ATk48ATUBIyQhKCEgLikuKz0xMkIqARUBPwEfRQEmFikgKjIjPgEaGRMYGB0hGSgBMAEzSAFQSAZNT1AGUVBOR1AgLUlOT1BKTwE6R0kzTwFKSzxQSzspFQg7Ljs2FQgGAUMBTQFPOkpJSTABLEYdJSk9SR0xMAETHw9FOgYBT0pOATIwNS4sPTIPKRs7RUU0OysRHyVFEyFKLD8OSAwKCA8IATEbRSlRL0gYLkUxRFA1PxE8SjYKCAYBKjNJEh8rGhs0KiY4Q1BLQ0M7TxYaDA8xQwgNKUUGAThEKkMBSjMBUBpNTwQBTRYbBS8UGhogIAUtFhsbICAFNDQ3NywsBUtHRkdFRUouICJFQSI2TElJRkg0NgFJAT4jSwYBFjpEBgEmPz8BPwEhIUs3FAYBTw8HTC4+ATcBUCA0Tj4oUCFPAS8oIUkcFwYBNCFIMQE1EggBMCNGHBsKCAFLS05OCU07KEkhJUFGAUUnUD5MIB8ODAoIBgFOUEQ0PTYjQBIIASkjOxwbCggGARIEAgE9cGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9wYXJhbWV0ZXJfc3R1Yl9nZW5lcmF0b3IuZGFydERzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19lbWl0dGVyL3J1bnRpbWVfdHlwZV9nZW5lcmF0b3IuZGFydKypLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5qc19lbWl0dGVyLnJ1bnRpbWVfdHlwZV9nZW5lcmF0b3I7CgppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JyBzaG93IENvbW1vbkVsZW1lbnRzOwppbXBvcnQgJy4uL2RlZmVycmVkX2xvYWQuZGFydCcgc2hvdyBPdXRwdXRVbml0LCBPdXRwdXRVbml0RGF0YTsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBhcyBqc0FzdDsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBzaG93IGpzOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvanNfaW50ZXJvcF9hbmFseXNpcy5kYXJ0JyBhcyBqc0ludGVyb3BBbmFseXNpczsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL25hbWVyLmRhcnQnIHNob3cgTmFtZXI7CmltcG9ydCAnLi4vanNfYmFja2VuZC9ydW50aW1lX3R5cGVzLmRhcnQnCiAgICBzaG93CiAgICAgICAgQ2xhc3NDaGVja3MsCiAgICAgICAgQ2xhc3NGdW5jdGlvblR5cGUsCiAgICAgICAgUnVudGltZVR5cGVzQ2hlY2tzLAogICAgICAgIFJ1bnRpbWVUeXBlc0VuY29kZXIsCiAgICAgICAgU3Vic3RpdHV0aW9uLAogICAgICAgIFR5cGVDaGVjazsKaW1wb3J0ICcuLi9qc19lbWl0dGVyL3NvcnRlci5kYXJ0JzsKaW1wb3J0ICcuLi91dGlsL3V0aWwuZGFydCcgc2hvdyBTZXRsZXQ7CgppbXBvcnQgJ2NvZGVfZW1pdHRlcl90YXNrLmRhcnQnIHNob3cgQ29kZUVtaXR0ZXJUYXNrOwoKLy8gRnVuY3Rpb24gc2lnbmF0dXJlcyB1c2VkIGluIHRoZSBnZW5lcmF0aW9uIG9mIHJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbi4KdHlwZWRlZiB2b2lkIEZ1bmN0aW9uVHlwZVNpZ25hdHVyZUVtaXR0ZXIoQ2xhc3NGdW5jdGlvblR5cGUgY2xhc3NGdW5jdGlvblR5cGUpOwoKY2xhc3MgVHlwZVRlc3QgewogIGZpbmFsIGpzQXN0Lk5hbWUgbmFtZTsKICBmaW5hbCBqc0FzdC5Ob2RlIGV4cHJlc3Npb247CgogIFR5cGVUZXN0KHRoaXMubmFtZSwgdGhpcy5leHByZXNzaW9uKTsKfQoKY2xhc3MgVHlwZVRlc3RzIHsKICBUeXBlVGVzdCBpc1Rlc3Q7CiAgVHlwZVRlc3Qgc3Vic3RpdHV0aW9uOwogIFR5cGVUZXN0IHNpZ25hdHVyZTsKfQoKY2xhc3MgVHlwZVRlc3RQcm9wZXJ0aWVzIHsKICAvLy8gVGhlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiB0eXBlIGludG8gdGhlIG1ldGFkYXRhLgogIC8vLwogIC8vLyBJZiB0aGUgY2xhc3MgZG9lc24ndCBoYXZlIGEgZnVuY3Rpb24gdHlwZSB0aGlzIGZpZWxkIGlzIGBudWxsYC4KICAvLy8KICAvLy8gSWYgdGhlIGlzIHRlc3RzIHdlcmUgZ2VuZXJhdGVkIHdpdGggYHN0b3JlRnVuY3Rpb25UeXBlSW5NZXRhZGF0YWAgc2V0IHRvCiAgLy8vIGBmYWxzZWAsIHRoaXMgZmllbGQgaXMgYG51bGxgLCBhbmQgdGhlIFtwcm9wZXJ0aWVzXSBjb250YWluIGEgcHJvcGVydHkKICAvLy8gdGhhdCBlbmNvZGVzIHRoZSBmdW5jdGlvbiB0eXBlLgogIGpzQXN0LkV4cHJlc3Npb24gZnVuY3Rpb25UeXBlSW5kZXg7CgogIC8vLyBUaGUgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgaW5zdGFsbGVkIG9uIHRoZSBwcm90b3R5cGUgb2YgdGhlCiAgLy8vIEpTIGNvbnN0cnVjdG9yIG9mIHRoZSBbQ2xhc3NFbnRpdHldIGZvciB3aGljaCB0aGUgaXMgY2hlY2tzIHdlcmUKICAvLy8gZ2VuZXJhdGVkLgogIGZpbmFsIE1hcDxDbGFzc0VudGl0eSwgVHlwZVRlc3RzPiBfcHJvcGVydGllcyA9IDxDbGFzc0VudGl0eSwgVHlwZVRlc3RzPnt9OwoKICB2b2lkIGFkZElzVGVzdChDbGFzc0VudGl0eSBjbHMsIGpzQXN0Lk5hbWUgbmFtZSwganNBc3QuTm9kZSBleHByZXNzaW9uKSB7CiAgICBUeXBlVGVzdHMgdHlwZVRlc3RzID0gX3Byb3BlcnRpZXMucHV0SWZBYnNlbnQoY2xzLCAoKSA9PiBuZXcgVHlwZVRlc3RzKCkpOwogICAgdHlwZVRlc3RzLmlzVGVzdCA9IG5ldyBUeXBlVGVzdChuYW1lLCBleHByZXNzaW9uKTsKICB9CgogIHZvaWQgYWRkU3Vic3RpdHV0aW9uKAogICAgICBDbGFzc0VudGl0eSBjbHMsIGpzQXN0Lk5hbWUgbmFtZSwganNBc3QuTm9kZSBleHByZXNzaW9uKSB7CiAgICBUeXBlVGVzdHMgdHlwZVRlc3RzID0gX3Byb3BlcnRpZXMucHV0SWZBYnNlbnQoY2xzLCAoKSA9PiBuZXcgVHlwZVRlc3RzKCkpOwogICAgdHlwZVRlc3RzLnN1YnN0aXR1dGlvbiA9IG5ldyBUeXBlVGVzdChuYW1lLCBleHByZXNzaW9uKTsKICB9CgogIHZvaWQgYWRkU2lnbmF0dXJlKENsYXNzRW50aXR5IGNscywganNBc3QuTmFtZSBuYW1lLCBqc0FzdC5Ob2RlIGV4cHJlc3Npb24pIHsKICAgIFR5cGVUZXN0cyB0eXBlVGVzdHMgPSBfcHJvcGVydGllcy5wdXRJZkFic2VudChjbHMsICgpID0+IG5ldyBUeXBlVGVzdHMoKSk7CiAgICB0eXBlVGVzdHMuc2lnbmF0dXJlID0gbmV3IFR5cGVUZXN0KG5hbWUsIGV4cHJlc3Npb24pOwogIH0KCiAgdm9pZCBmb3JFYWNoUHJvcGVydHkoCiAgICAgIFNvcnRlciBzb3J0ZXIsIHZvaWQgZihqc0FzdC5OYW1lIG5hbWUsIGpzQXN0Lk5vZGUgZXhwcmVzc2lvbikpIHsKICAgIHZvaWQgaGFuZGxlVHlwZVRlc3QoVHlwZVRlc3QgdHlwZVRlc3QpIHsKICAgICAgaWYgKHR5cGVUZXN0ID09IG51bGwpIHJldHVybjsKICAgICAgZih0eXBlVGVzdC5uYW1lLCB0eXBlVGVzdC5leHByZXNzaW9uKTsKICAgIH0KCiAgICBmb3IgKENsYXNzRW50aXR5IGNscyBpbiBzb3J0ZXIuc29ydENsYXNzZXMoX3Byb3BlcnRpZXMua2V5cykpIHsKICAgICAgVHlwZVRlc3RzIHR5cGVUZXN0cyA9IF9wcm9wZXJ0aWVzW2Nsc107CiAgICAgIGhhbmRsZVR5cGVUZXN0KHR5cGVUZXN0cy5pc1Rlc3QpOwogICAgICBoYW5kbGVUeXBlVGVzdCh0eXBlVGVzdHMuc3Vic3RpdHV0aW9uKTsKICAgICAgaGFuZGxlVHlwZVRlc3QodHlwZVRlc3RzLnNpZ25hdHVyZSk7CiAgICB9CiAgfQp9CgpjbGFzcyBSdW50aW1lVHlwZUdlbmVyYXRvciB7CiAgZmluYWwgQ29tbW9uRWxlbWVudHMgX2NvbW1vbkVsZW1lbnRzOwogIGZpbmFsIE91dHB1dFVuaXREYXRhIF9vdXRwdXRVbml0RGF0YTsKICBmaW5hbCBDb2RlRW1pdHRlclRhc2sgZW1pdHRlclRhc2s7CiAgZmluYWwgTmFtZXIgX25hbWVyOwogIGZpbmFsIFJ1bnRpbWVUeXBlc0NoZWNrcyBfcnRpQ2hlY2tzOwogIGZpbmFsIFJ1bnRpbWVUeXBlc0VuY29kZXIgX3J0aUVuY29kZXI7CiAgZmluYWwgX1R5cGVDb250YWluZWRJbk91dHB1dFVuaXRWaXNpdG9yIF9vdXRwdXRVbml0VmlzaXRvcjsKCiAgUnVudGltZVR5cGVHZW5lcmF0b3IodGhpcy5fY29tbW9uRWxlbWVudHMsIHRoaXMuX291dHB1dFVuaXREYXRhLAogICAgICB0aGlzLmVtaXR0ZXJUYXNrLCB0aGlzLl9uYW1lciwgdGhpcy5fcnRpQ2hlY2tzLCB0aGlzLl9ydGlFbmNvZGVyKQogICAgICA6IF9vdXRwdXRVbml0VmlzaXRvciA9IG5ldyBfVHlwZUNvbnRhaW5lZEluT3V0cHV0VW5pdFZpc2l0b3IoCiAgICAgICAgICAgIF9jb21tb25FbGVtZW50cywgX291dHB1dFVuaXREYXRhKTsKCiAgLy8vIEdlbmVyYXRlICJpcyB0ZXN0cyIgZm9yIFtjbHNdIGl0c2VsZiwgYW5kIHRoZSAiaXMgdGVzdHMiIGZvciB0aGUKICAvLy8gY2xhc3NlcyBpdCBpbXBsZW1lbnRzIGFuZCB0eXBlIGFyZ3VtZW50IHN1YnN0aXR1dGlvbiBmdW5jdGlvbnMgZm9yIHRoZXNlCiAgLy8vIHRlc3RzLiAgIFdlIGRvbid0IG5lZWQgdG8gYWRkIHRoZSAiaXMgdGVzdHMiIG9mIHRoZSBzdXBlciBjbGFzcyBiZWNhdXNlCiAgLy8vIHRoZXkgd2lsbCBiZSBpbmhlcml0ZWQgYXQgcnVudGltZSwgYnV0IHdlIG1heSBuZWVkIHRvIGdlbmVyYXRlIHRoZQogIC8vLyBzdWJzdGl0dXRpb25zLCBiZWNhdXNlIHRoZXkgbWF5IGhhdmUgY2hhbmdlZC4KCiAgLy8vIEdlbmVyYXRlcyBhbGwgcHJvcGVydGllcyBuZWNlc3NhcnkgZm9yIGlzLWNoZWNrcyBvbiB0aGUgW2NsYXNzRWxlbWVudF0uCiAgLy8vCiAgLy8vIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgW1R5cGVUZXN0UHJvcGVydGllc10gdGhhdCBjb250YWlucyB0aGUgcHJvcGVydGllcwogIC8vLyB0aGF0IG11c3QgYmUgaW5zdGFsbGVkIG9uIHRoZSBwcm90b3R5cGUgb2YgdGhlIEpTIGNvbnN0cnVjdG9yIG9mIHRoZQogIC8vLyBbY2xhc3NFbGVtZW50XS4KICAvLy8KICAvLy8gSWYgW3N0b3JlRnVuY3Rpb25UeXBlSW5NZXRhZGF0YV0gaXMgYHRydWVgLCBzdG9yZXMgdGhlIHJlaWZpZWQgZnVuY3Rpb24KICAvLy8gdHlwZSAoaWYgY2xhc3MgaGFzIG9uZSkgaW4gdGhlIG1ldGFkYXRhIG9iamVjdCBhbmQgc3RvcmVzIGl0cyBpbmRleCBpbgogIC8vLyB0aGUgcmVzdWx0LiBUaGlzIGlzIG9ubHkgcG9zc2libGUgZm9yIGZ1bmN0aW9uIHR5cGVzIHRoYXQgZG8gbm90IGNvbnRhaW4KICAvLy8gdHlwZSB2YXJpYWJsZXMuCiAgVHlwZVRlc3RQcm9wZXJ0aWVzIGdlbmVyYXRlSXNUZXN0cyhDbGFzc0VudGl0eSBjbGFzc0VsZW1lbnQsCiAgICAgIE1hcDxNZW1iZXJFbnRpdHksIGpzQXN0LkV4cHJlc3Npb24+IGdlbmVyYXRlZENvZGUsCiAgICAgIHtib29sIHN0b3JlRnVuY3Rpb25UeXBlSW5NZXRhZGF0YTogdHJ1ZX0pIHsKICAgIFR5cGVUZXN0UHJvcGVydGllcyByZXN1bHQgPSBuZXcgVHlwZVRlc3RQcm9wZXJ0aWVzKCk7CgogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogSW5jbHVkZSBmdW5jdGlvbiBzaWduYXR1cmVzIGluIFtDbGFzc0NoZWNrc10uCiAgICB2b2lkIGdlbmVyYXRlRnVuY3Rpb25UeXBlU2lnbmF0dXJlKENsYXNzRnVuY3Rpb25UeXBlIGNsYXNzRnVuY3Rpb25UeXBlKSB7CiAgICAgIEZ1bmN0aW9uRW50aXR5IG1ldGhvZCA9IGNsYXNzRnVuY3Rpb25UeXBlLmNhbGxGdW5jdGlvbjsKICAgICAgRnVuY3Rpb25UeXBlIHR5cGUgPSBjbGFzc0Z1bmN0aW9uVHlwZS5jYWxsVHlwZTsKCiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEF2b2lkIHVubmVlZGVkIGZ1bmN0aW9uIHR5cGUgaW5kaWNlcyBvcgogICAgICAvLyBzaWduYXR1cmVzLiBXZSBlaXRoZXIgbmVlZCB0aGVtIGZvciBtaXJyb3JzIG9yIGJlY2F1c2UgW3R5cGVdIGlzCiAgICAgIC8vIHBvdGVudGlhbGx5IGEgc3VidHlwZSBvZiBhIGNoZWNrZWQgZnVuY3Rpb24uIEN1cnJlbnRseSB3ZSBlYWdlcmx5CiAgICAgIC8vIGdlbmVyYXRlIGEgZnVuY3Rpb24gdHlwZSBpbmRleCBvciBzaWduYXR1cmUgZm9yIGFsbCBjYWxsYWJsZSBjbGFzc2VzLgogICAgICBqc0FzdC5FeHByZXNzaW9uIGZ1bmN0aW9uVHlwZUluZGV4OwogICAgICBib29sIGlzRGVmZXJyZWQgPSBmYWxzZTsKICAgICAgaWYgKCF0eXBlLmNvbnRhaW5zVHlwZVZhcmlhYmxlcykgewogICAgICAgIC8vIFRPRE8oc2lnbXVuZCk6IHVzZSBvdXRwdXQgdW5pdCBvZiBbbWV0aG9kXSB3aGVuIHRoZSBjbGFzc2VzIG1lbnRpb25lZAogICAgICAgIC8vIGluIFt0eXBlXSBhcmVuJ3QgaW4gdGhlIG1haW4gb3V0cHV0IHVuaXQuIChJc3N1ZSAjMzEwMzIpCiAgICAgICAgT3V0cHV0VW5pdCBtYWluT3V0cHV0VW5pdCA9IF9vdXRwdXRVbml0RGF0YS5tYWluT3V0cHV0VW5pdDsKICAgICAgICBpZiAoX291dHB1dFVuaXRWaXNpdG9yLmlzVHlwZUNvbnRhaW5lZEluKHR5cGUsIG1haW5PdXRwdXRVbml0KSkgewogICAgICAgICAgZnVuY3Rpb25UeXBlSW5kZXggPQogICAgICAgICAgICAgIGVtaXR0ZXJUYXNrLm1ldGFkYXRhQ29sbGVjdG9yLnJlaWZ5VHlwZSh0eXBlLCBtYWluT3V0cHV0VW5pdCk7CiAgICAgICAgfSBlbHNlIGlmICghc3RvcmVGdW5jdGlvblR5cGVJbk1ldGFkYXRhKSB7CiAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTdXBwb3J0IHNoYXJpbmcgZGVmZXJyZWQgc2lnbmF0dXJlcyB3aXRoIHRoZQogICAgICAgICAgLy8gZnVsbCBlbWl0dGVyLgogICAgICAgICAgaXNEZWZlcnJlZCA9IHRydWU7CiAgICAgICAgICBmdW5jdGlvblR5cGVJbmRleCA9IGVtaXR0ZXJUYXNrLm1ldGFkYXRhQ29sbGVjdG9yCiAgICAgICAgICAgICAgLnJlaWZ5VHlwZSh0eXBlLCBfb3V0cHV0VW5pdERhdGEub3V0cHV0VW5pdEZvck1lbWJlcihtZXRob2QpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHN0b3JlRnVuY3Rpb25UeXBlSW5NZXRhZGF0YSAmJiBmdW5jdGlvblR5cGVJbmRleCAhPSBudWxsKSB7CiAgICAgICAgcmVzdWx0LmZ1bmN0aW9uVHlwZUluZGV4ID0gZnVuY3Rpb25UeXBlSW5kZXg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAganNBc3QuRXhwcmVzc2lvbiBlbmNvZGluZyA9CiAgICAgICAgICAgIGdlbmVyYXRlZENvZGVbY2xhc3NGdW5jdGlvblR5cGUuc2lnbmF0dXJlRnVuY3Rpb25dOwogICAgICAgIGlmIChjbGFzc0Z1bmN0aW9uVHlwZS5zaWduYXR1cmVGdW5jdGlvbiA9PSBudWxsKSB7CiAgICAgICAgICAvLyBUaGUgc2lnbmF0dXJlIGZ1bmN0aW9uIGlzbid0IGxpdmUuCiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChmdW5jdGlvblR5cGVJbmRleCAhPSBudWxsKSB7CiAgICAgICAgICBpZiAoaXNEZWZlcnJlZCkgewogICAgICAgICAgICAvLyBUaGUgZnVuY3Rpb24gdHlwZSBpbmRleCBtdXN0IGJlIG9mZnNldCBieSB0aGUgbnVtYmVyIG9mIHR5cGVzCiAgICAgICAgICAgIC8vIGFscmVhZHkgbG9hZGVkLgogICAgICAgICAgICBlbmNvZGluZyA9IG5ldyBqc0FzdC5CaW5hcnkoCiAgICAgICAgICAgICAgICAnKycsCiAgICAgICAgICAgICAgICBuZXcganNBc3QuVmFyaWFibGVVc2UoX25hbWVyLnR5cGVzT2Zmc2V0TmFtZSksCiAgICAgICAgICAgICAgICBmdW5jdGlvblR5cGVJbmRleCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlbmNvZGluZyA9IGZ1bmN0aW9uVHlwZUluZGV4OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewogICAgICAgICAganNBc3QuTmFtZSBvcGVyYXRvclNpZ25hdHVyZSA9CiAgICAgICAgICAgICAgX25hbWVyLmFzTmFtZShfbmFtZXIub3BlcmF0b3JTaWduYXR1cmUpOwogICAgICAgICAgcmVzdWx0LmFkZFNpZ25hdHVyZShjbGFzc0VsZW1lbnQsIG9wZXJhdG9yU2lnbmF0dXJlLCBlbmNvZGluZyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgdm9pZCBnZW5lcmF0ZVR5cGVDaGVjayhUeXBlQ2hlY2sgY2hlY2spIHsKICAgICAgQ2xhc3NFbnRpdHkgY2hlY2tlZENsYXNzID0gY2hlY2suY2xzOwogICAgICBpZiAoY2hlY2submVlZHNJcykgewogICAgICAgIHJlc3VsdC5hZGRJc1Rlc3QoCiAgICAgICAgICAgIGNoZWNrZWRDbGFzcywgX25hbWVyLm9wZXJhdG9ySXMoY2hlY2tlZENsYXNzKSwganMoJzEnKSk7CiAgICAgIH0KICAgICAgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiA9IGNoZWNrLnN1YnN0aXR1dGlvbjsKICAgICAgaWYgKHN1YnN0aXR1dGlvbiAhPSBudWxsKSB7CiAgICAgICAganNBc3QuRXhwcmVzc2lvbiBib2R5ID0KICAgICAgICAgICAgX3J0aUVuY29kZXIuZ2V0U3Vic3RpdHV0aW9uQ29kZShlbWl0dGVyVGFzay5lbWl0dGVyLCBzdWJzdGl0dXRpb24pOwogICAgICAgIHJlc3VsdC5hZGRTdWJzdGl0dXRpb24oCiAgICAgICAgICAgIGNoZWNrZWRDbGFzcywgX25hbWVyLnN1YnN0aXR1dGlvbk5hbWUoY2hlY2tlZENsYXNzKSwgYm9keSk7CiAgICAgIH0KICAgIH0KCiAgICBfZ2VuZXJhdGVJc1Rlc3RzT24oCiAgICAgICAgY2xhc3NFbGVtZW50LCBnZW5lcmF0ZUZ1bmN0aW9uVHlwZVNpZ25hdHVyZSwgZ2VuZXJhdGVUeXBlQ2hlY2spOwoKICAgIGlmIChjbGFzc0VsZW1lbnQgPT0gX2NvbW1vbkVsZW1lbnRzLmpzSmF2YVNjcmlwdEZ1bmN0aW9uQ2xhc3MpIHsKICAgICAgdmFyIHR5cGUgPSBqc0ludGVyb3BBbmFseXNpcy5idWlsZEpzRnVuY3Rpb25UeXBlKCk7CiAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKICAgICAgICBqc0FzdC5FeHByZXNzaW9uIHRoaXNBY2Nlc3MgPSBuZXcganNBc3QuVGhpcygpOwogICAgICAgIGpzQXN0LkV4cHJlc3Npb24gZW5jb2RpbmcgPSBfcnRpRW5jb2Rlci5nZXRTaWduYXR1cmVFbmNvZGluZygKICAgICAgICAgICAgZW1pdHRlclRhc2suZW1pdHRlciwgdHlwZSwgdGhpc0FjY2Vzcyk7CiAgICAgICAganNBc3QuTmFtZSBvcGVyYXRvclNpZ25hdHVyZSA9IF9uYW1lci5hc05hbWUoX25hbWVyLm9wZXJhdG9yU2lnbmF0dXJlKTsKICAgICAgICByZXN1bHQuYWRkU2lnbmF0dXJlKGNsYXNzRWxlbWVudCwgb3BlcmF0b3JTaWduYXR1cmUsIGVuY29kaW5nKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgX2dlbmVyYXRlSXNUZXN0c09uKAogICAgICBDbGFzc0VudGl0eSBjbHMsCiAgICAgIEZ1bmN0aW9uVHlwZVNpZ25hdHVyZUVtaXR0ZXIgZ2VuZXJhdGVGdW5jdGlvblR5cGVTaWduYXR1cmUsCiAgICAgIHZvaWQgZW1pdFR5cGVDaGVjayhUeXBlQ2hlY2sgY2hlY2spKSB7CiAgICBTZXRsZXQ8Q2xhc3NFbnRpdHk+IGdlbmVyYXRlZCA9IG5ldyBTZXRsZXQ8Q2xhc3NFbnRpdHk+KCk7CgogICAgLy8gUHJlY29tcHV0ZWQgaXMgY2hlY2tzLgogICAgQ2xhc3NDaGVja3MgY2xhc3NDaGVja3MgPSBfcnRpQ2hlY2tzLnJlcXVpcmVkQ2hlY2tzW2Nsc107CiAgICBJdGVyYWJsZTxUeXBlQ2hlY2s+IHR5cGVDaGVja3MgPSBjbGFzc0NoZWNrcy5jaGVja3M7CiAgICBpZiAodHlwZUNoZWNrcyAhPSBudWxsKSB7CiAgICAgIGZvciAoVHlwZUNoZWNrIHR5cGVDaGVjayBpbiB0eXBlQ2hlY2tzKSB7CiAgICAgICAgaWYgKCFnZW5lcmF0ZWQuY29udGFpbnModHlwZUNoZWNrLmNscykpIHsKICAgICAgICAgIGVtaXRUeXBlQ2hlY2sodHlwZUNoZWNrKTsKICAgICAgICAgIGdlbmVyYXRlZC5hZGQodHlwZUNoZWNrLmNscyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKGNsYXNzQ2hlY2tzLmZ1bmN0aW9uVHlwZSAhPSBudWxsKSB7CiAgICAgIGdlbmVyYXRlRnVuY3Rpb25UeXBlU2lnbmF0dXJlKGNsYXNzQ2hlY2tzLmZ1bmN0aW9uVHlwZSk7CiAgICB9CiAgfQp9CgovLy8gVmlzaXRvciB0aGF0IGNoZWNrcyB3aGV0aGVyIGEgdHlwZSBpcyBjb250YWluZWQgd2l0aGluIG9uZSBvdXRwdXQgdW5pdC4KY2xhc3MgX1R5cGVDb250YWluZWRJbk91dHB1dFVuaXRWaXNpdG9yCiAgICBpbXBsZW1lbnRzIERhcnRUeXBlVmlzaXRvcjxib29sLCBPdXRwdXRVbml0PiB7CiAgZmluYWwgQ29tbW9uRWxlbWVudHMgX2NvbW1vbkVsZW1lbnRzOwogIGZpbmFsIE91dHB1dFVuaXREYXRhIF9vdXRwdXRVbml0RGF0YTsKCiAgX1R5cGVDb250YWluZWRJbk91dHB1dFVuaXRWaXNpdG9yKHRoaXMuX2NvbW1vbkVsZW1lbnRzLCB0aGlzLl9vdXRwdXRVbml0RGF0YSk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgY2xhc3NlcyBtZW50aW9uZWQgaW4gW3R5cGVdIGFyZSBpbiBbb3V0cHV0VW5pdF0uCiAgYm9vbCBpc1R5cGVDb250YWluZWRJbihEYXJ0VHlwZSB0eXBlLCBPdXRwdXRVbml0IG91dHB1dFVuaXQpID0+CiAgICAgIHZpc2l0KHR5cGUsIG91dHB1dFVuaXQpOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0KERhcnRUeXBlIHR5cGUsIE91dHB1dFVuaXQgYXJndW1lbnQpID0+IHR5cGUuYWNjZXB0KHRoaXMsIGFyZ3VtZW50KTsKCiAgYm9vbCB2aXNpdExpc3QoTGlzdDxEYXJ0VHlwZT4gdHlwZXMsIE91dHB1dFVuaXQgYXJndW1lbnQpIHsKICAgIGZvciAoRGFydFR5cGUgdHlwZSBpbiB0eXBlcykgewogICAgICBpZiAoIXZpc2l0KHR5cGUsIGFyZ3VtZW50KSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RnV0dXJlT3JUeXBlKEZ1dHVyZU9yVHlwZSB0eXBlLCBPdXRwdXRVbml0IGFyZ3VtZW50KSB7CiAgICBpZiAoX291dHB1dFVuaXREYXRhLm91dHB1dFVuaXRGb3JDbGFzcyhfY29tbW9uRWxlbWVudHMuZnVuY3Rpb25DbGFzcykgIT0KICAgICAgICBhcmd1bWVudCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdmlzaXQodHlwZS50eXBlQXJndW1lbnQsIGFyZ3VtZW50KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXREeW5hbWljVHlwZShEeW5hbWljVHlwZSB0eXBlLCBPdXRwdXRVbml0IGFyZ3VtZW50KSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgdHlwZSwgT3V0cHV0VW5pdCBhcmd1bWVudCkgewogICAgcmV0dXJuIHZpc2l0KHR5cGUudW5hbGlhc2VkLCBhcmd1bWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIHR5cGUsIE91dHB1dFVuaXQgYXJndW1lbnQpIHsKICAgIGlmIChfb3V0cHV0VW5pdERhdGEub3V0cHV0VW5pdEZvckNsYXNzKHR5cGUuZWxlbWVudCkgIT0gYXJndW1lbnQpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHZpc2l0TGlzdCh0eXBlLnR5cGVBcmd1bWVudHMsIGFyZ3VtZW50KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIHR5cGUsIE91dHB1dFVuaXQgYXJndW1lbnQpIHsKICAgIGJvb2wgcmVzdWx0ID0gdmlzaXQodHlwZS5yZXR1cm5UeXBlLCBhcmd1bWVudCkgJiYKICAgICAgICB2aXNpdExpc3QodHlwZS5wYXJhbWV0ZXJUeXBlcywgYXJndW1lbnQpICYmCiAgICAgICAgdmlzaXRMaXN0KHR5cGUub3B0aW9uYWxQYXJhbWV0ZXJUeXBlcywgYXJndW1lbnQpICYmCiAgICAgICAgdmlzaXRMaXN0KHR5cGUubmFtZWRQYXJhbWV0ZXJUeXBlcywgYXJndW1lbnQpOwogICAgaWYgKCFyZXN1bHQpIHJldHVybiBmYWxzZTsKICAgIGZvciAoRnVuY3Rpb25UeXBlVmFyaWFibGUgdHlwZVZhcmlhYmxlIGluIHR5cGUudHlwZVZhcmlhYmxlcykgewogICAgICBpZiAoIXZpc2l0KHR5cGVWYXJpYWJsZS5ib3VuZCwgYXJndW1lbnQpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRGdW5jdGlvblR5cGVWYXJpYWJsZSgKICAgICAgRnVuY3Rpb25UeXBlVmFyaWFibGUgdHlwZSwgT3V0cHV0VW5pdCBhcmd1bWVudCkgewogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VHlwZVZhcmlhYmxlVHlwZShUeXBlVmFyaWFibGVUeXBlIHR5cGUsIE91dHB1dFVuaXQgYXJndW1lbnQpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSB0eXBlLCBPdXRwdXRVbml0IGFyZ3VtZW50KSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn0KgT0ATk48ATMBNkAkISEgRi4qCRUbHB0WEyQoATYBS1ABERkfASgCARITGRYCARs4BkYGT00mJgFERxFOAUxPNwQBGEFPPQQBT086BAEYRy0kLQYBRC4oLisGBAIBHSgoJRYnKT4BQ0hELwFHT05JNAFOBk9LFgZOTU8WPzkyOgFKTj42AUZKS08qHylRRERKHk0zTxsdPE0KCEY2DyRAOzASCikcTR8pFT8kEyoMCiApN0oKCAYBLiwbGkUINiIgUCBICAYBGEkBRToaOEY0UEgIBhMEARsXQi0/AR4+OR4wMiQoCggGASw/BgQCAUwoMygoAVEBTUIfAQxRAT4jJBYIBhEEAQxDTRQUBi8EAQxIAQxBLAQBDEVIFAY0BAEMQzY0PDcfRDIWCAYRBAEMIjgRBAEMSxIEAQw7EQQCATtwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL3J1bnRpbWVfdHlwZV9nZW5lcmF0b3IuZGFydEBzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19lbWl0dGVyL3R5cGVfdGVzdF9yZWdpc3RyeS5kYXJ0iZUvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmpzX2VtaXR0ZXIudHlwZV90ZXN0X3JlZ2lzdHJ5OwoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvcnVudGltZV90eXBlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIFJ1bnRpbWVUeXBlc0NoZWNrcywKICAgICAgICBSdW50aW1lVHlwZXNDaGVja3NCdWlsZGVyLAogICAgICAgIFJ1bnRpbWVUeXBlc1N1YnN0aXR1dGlvbnM7CmltcG9ydCAnLi4vb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jb2RlZ2VuX3dvcmxkX2J1aWxkZXIuZGFydCc7CgpjbGFzcyBUeXBlVGVzdFJlZ2lzdHJ5IHsKICBmaW5hbCBFbGVtZW50RW52aXJvbm1lbnQgX2VsZW1lbnRFbnZpcm9ubWVudDsKCiAgLy8vIEFmdGVyIFtjb21wdXRlTmVlZGVkQ2xhc3Nlc10gdGhpcyBzZXQgb25seSBjb250YWlucyBjbGFzc2VzIHRoYXQgYXJlIG9ubHkKICAvLy8gdXNlZCBmb3IgUlRJLgogIFNldDxDbGFzc0VudGl0eT4gX3J0aU5lZWRlZENsYXNzZXM7CgogIGZpbmFsIENvbXBpbGVyT3B0aW9ucyBfb3B0aW9uczsKICBmaW5hbCBDb2RlZ2VuV29ybGRCdWlsZGVyIF9jb2RlZ2VuV29ybGRCdWlsZGVyOwoKICBSdW50aW1lVHlwZXNDaGVja3MgX3J0aUNoZWNrczsKCiAgVHlwZVRlc3RSZWdpc3RyeSgKICAgICAgdGhpcy5fb3B0aW9ucywgdGhpcy5fY29kZWdlbldvcmxkQnVpbGRlciwgdGhpcy5fZWxlbWVudEVudmlyb25tZW50KTsKCiAgUnVudGltZVR5cGVzQ2hlY2tzIGdldCBydGlDaGVja3MgewogICAgYXNzZXJ0KAogICAgICAgIF9ydGlDaGVja3MgIT0gbnVsbCwKICAgICAgICBmYWlsZWRBdChOT19MT0NBVElPTl9TUEFOTkFCTEUsCiAgICAgICAgICAgICJSdW50aW1lVHlwZXNDaGVja3MgaGFzIG5vdCBiZWVuIGNvbXB1dGVkIHlldC4iKSk7CiAgICByZXR1cm4gX3J0aUNoZWNrczsKICB9CgogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBnZXQgcnRpTmVlZGVkQ2xhc3NlcyB7CiAgICBhc3NlcnQoCiAgICAgICAgX3J0aU5lZWRlZENsYXNzZXMgIT0gbnVsbCwKICAgICAgICBmYWlsZWRBdChOT19MT0NBVElPTl9TUEFOTkFCTEUsCiAgICAgICAgICAgICJydGlOZWVkZWRDbGFzc2VzIGhhcyBub3QgYmVlbiBjb21wdXRlZCB5ZXQuIikpOwogICAgcmV0dXJuIF9ydGlOZWVkZWRDbGFzc2VzOwogIH0KCiAgdm9pZCBjb21wdXRlUnRpTmVlZGVkQ2xhc3NlcyhSdW50aW1lVHlwZXNTdWJzdGl0dXRpb25zIHJ0aVN1YnN0aXR1dGlvbnMsCiAgICAgIEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gbGl2ZU1lbWJlcnMpIHsKICAgIF9ydGlOZWVkZWRDbGFzc2VzID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKCiAgICB2b2lkIGFkZENsYXNzV2l0aFN1cGVyY2xhc3NlcyhDbGFzc0VudGl0eSBjbHMpIHsKICAgICAgX3J0aU5lZWRlZENsYXNzZXMuYWRkKGNscyk7CiAgICAgIGZvciAoQ2xhc3NFbnRpdHkgc3VwZXJjbGFzcyA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0U3VwZXJDbGFzcyhjbHMpOwogICAgICAgICAgc3VwZXJjbGFzcyAhPSBudWxsOwogICAgICAgICAgc3VwZXJjbGFzcyA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0U3VwZXJDbGFzcyhzdXBlcmNsYXNzKSkgewogICAgICAgIF9ydGlOZWVkZWRDbGFzc2VzLmFkZChzdXBlcmNsYXNzKTsKICAgICAgfQogICAgfQoKICAgIHZvaWQgYWRkQ2xhc3Nlc1dpdGhTdXBlcmNsYXNzZXMoSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGNsYXNzZXMpIHsKICAgICAgZm9yIChDbGFzc0VudGl0eSBjbHMgaW4gY2xhc3NlcykgewogICAgICAgIGFkZENsYXNzV2l0aFN1cGVyY2xhc3NlcyhjbHMpOwogICAgICB9CiAgICB9CgogICAgLy8gQWRkIGNsYXNzZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBieSB0eXBlIGFyZ3VtZW50cyBvciBzdWJzdGl0dXRpb25zIGluCiAgICAvLyBhcmd1bWVudCBjaGVja3MuCiAgICBhZGRDbGFzc2VzV2l0aFN1cGVyY2xhc3NlcyhydGlDaGVja3MucmVxdWlyZWRDbGFzc2VzKTsKICB9CgogIHZvaWQgY29tcHV0ZVJlcXVpcmVkVHlwZUNoZWNrcyhSdW50aW1lVHlwZXNDaGVja3NCdWlsZGVyIHJ0aUNoZWNrc0J1aWxkZXIpIHsKICAgIF9ydGlDaGVja3MgPQogICAgICAgIHJ0aUNoZWNrc0J1aWxkZXIuY29tcHV0ZVJlcXVpcmVkQ2hlY2tzKF9jb2RlZ2VuV29ybGRCdWlsZGVyLCBfb3B0aW9ucyk7CiAgfQp9Ck8ATk48AS8BGSIkKgkcIyMaMQEZMAFQFCYBIjIBIQEUSwElDBwoPxcEAS8MIyg9HgQBSywwATUiTB5IKwgGAUUpJwgGAU0YOwQBTxFQBAIBN3BhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvdHlwZV90ZXN0X3JlZ2lzdHJ5LmRhcnQxc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvc3NhL3NzYV90cmFjZXIuZGFydMAATpUvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBzc2EudHJhY2VyOwoKaW1wb3J0ICcuLi8uLi9jb21waWxlcl9uZXcuZGFydCcgc2hvdyBPdXRwdXRTaW5rOwppbXBvcnQgJy4uL2RpYWdub3N0aWNzL2ludmFyaWFudC5kYXJ0JyBzaG93IERFQlVHX01PREU7CmltcG9ydCAnLi4vaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmFtZXIuZGFydCcgc2hvdyBOYW1lcjsKaW1wb3J0ICcuLi90cmFjZXIuZGFydCc7CmltcG9ydCAnLi4vd29ybGQuZGFydCcgc2hvdyBKQ2xvc2VkV29ybGQ7CmltcG9ydCAnbm9kZXMuZGFydCc7CgovLy8gT3V0cHV0cyBTU0EgY29kZSBpbiBhIGZvcm1hdCByZWFkYWJsZSBieSBIeWRyYSBJUi4KLy8vIFRyYWNpbmcgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCwgc2VlIC4uL3RyYWNlci5kYXJ0IGZvciBob3cKLy8vIHRvIGVuYWJsZSBpdC4KY2xhc3MgSFRyYWNlciBleHRlbmRzIEhHcmFwaFZpc2l0b3Igd2l0aCBUcmFjZXJVdGlsIHsKICBmaW5hbCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQ7CiAgZmluYWwgTmFtZXIgbmFtZXI7CiAgQG92ZXJyaWRlCiAgZmluYWwgT3V0cHV0U2luayBvdXRwdXQ7CgogIEhUcmFjZXIodGhpcy5vdXRwdXQsIHRoaXMuY2xvc2VkV29ybGQsIHRoaXMubmFtZXIpOwoKICB2b2lkIHRyYWNlR3JhcGgoU3RyaW5nIG5hbWUsIEhHcmFwaCBncmFwaCkgewogICAgREVCVUdfTU9ERSA9IHRydWU7CiAgICB0YWcoImNmZyIsICgpIHsKICAgICAgcHJpbnRQcm9wZXJ0eSgibmFtZSIsIG5hbWUpOwogICAgICB2aXNpdERvbWluYXRvclRyZWUoZ3JhcGgpOwogICAgfSk7CiAgfQoKICB2b2lkIGFkZFByZWRlY2Vzc29ycyhIQmFzaWNCbG9jayBibG9jaykgewogICAgaWYgKGJsb2NrLnByZWRlY2Vzc29ycy5pc0VtcHR5KSB7CiAgICAgIHByaW50RW1wdHlQcm9wZXJ0eSgicHJlZGVjZXNzb3JzIik7CiAgICB9IGVsc2UgewogICAgICBhZGRJbmRlbnQoKTsKICAgICAgYWRkKCJwcmVkZWNlc3NvcnMiKTsKICAgICAgZm9yIChIQmFzaWNCbG9jayBwcmVkZWNlc3NvciBpbiBibG9jay5wcmVkZWNlc3NvcnMpIHsKICAgICAgICBhZGQoJyAiQiR7cHJlZGVjZXNzb3IuaWR9IicpOwogICAgICB9CiAgICAgIGFkZCgiXG4iKTsKICAgIH0KICB9CgogIHZvaWQgYWRkU3VjY2Vzc29ycyhIQmFzaWNCbG9jayBibG9jaykgewogICAgaWYgKGJsb2NrLnN1Y2Nlc3NvcnMuaXNFbXB0eSkgewogICAgICBwcmludEVtcHR5UHJvcGVydHkoInN1Y2Nlc3NvcnMiKTsKICAgIH0gZWxzZSB7CiAgICAgIGFkZEluZGVudCgpOwogICAgICBhZGQoInN1Y2Nlc3NvcnMiKTsKICAgICAgZm9yIChIQmFzaWNCbG9jayBzdWNjZXNzb3IgaW4gYmxvY2suc3VjY2Vzc29ycykgewogICAgICAgIGFkZCgnICJCJHtzdWNjZXNzb3IuaWR9IicpOwogICAgICB9CiAgICAgIGFkZCgiXG4iKTsKICAgIH0KICB9CgogIHZvaWQgYWRkSW5zdHJ1Y3Rpb25zKAogICAgICBISW5zdHJ1Y3Rpb25TdHJpbmdpZmllciBzdHJpbmdpZmllciwgSEluc3RydWN0aW9uTGlzdCBsaXN0KSB7CiAgICBmb3IgKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IGxpc3QuZmlyc3Q7CiAgICAgICAgaW5zdHJ1Y3Rpb24gIT0gbnVsbDsKICAgICAgICBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uLm5leHQpIHsKICAgICAgaW50IGJjaSA9IDA7CiAgICAgIGludCB1c2VzID0gaW5zdHJ1Y3Rpb24udXNlZEJ5Lmxlbmd0aDsKICAgICAgU3RyaW5nIGNoYW5nZXMgPSBpbnN0cnVjdGlvbi5zaWRlRWZmZWN0cy5oYXNTaWRlRWZmZWN0cygpID8gJyEnIDogJyAnOwogICAgICBTdHJpbmcgZGVwZW5kcyA9IGluc3RydWN0aW9uLnNpZGVFZmZlY3RzLmRlcGVuZHNPblNvbWV0aGluZygpID8gJz8nIDogJyc7CiAgICAgIGFkZEluZGVudCgpOwogICAgICBTdHJpbmcgdGVtcG9yYXJ5SWQgPSBzdHJpbmdpZmllci50ZW1wb3JhcnlJZChpbnN0cnVjdGlvbik7CiAgICAgIFN0cmluZyBpbnN0cnVjdGlvblN0cmluZyA9IHN0cmluZ2lmaWVyLnZpc2l0KGluc3RydWN0aW9uKTsKICAgICAgYWRkKCIkYmNpICR1c2VzICR0ZW1wb3JhcnlJZCAkaW5zdHJ1Y3Rpb25TdHJpbmcgJGNoYW5nZXMgJGRlcGVuZHMgPHxAXG4iKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCYXNpY0Jsb2NrKEhCYXNpY0Jsb2NrIGJsb2NrKSB7CiAgICBISW5zdHJ1Y3Rpb25TdHJpbmdpZmllciBzdHJpbmdpZmllciA9CiAgICAgICAgbmV3IEhJbnN0cnVjdGlvblN0cmluZ2lmaWVyKGJsb2NrLCBjbG9zZWRXb3JsZCwgbmFtZXIpOwogICAgYXNzZXJ0KGJsb2NrLmlkICE9IG51bGwpOwogICAgdGFnKCJibG9jayIsICgpIHsKICAgICAgcHJpbnRQcm9wZXJ0eSgibmFtZSIsICJCJHtibG9jay5pZH0iKTsKICAgICAgcHJpbnRQcm9wZXJ0eSgiZnJvbV9iY2kiLCAtMSk7CiAgICAgIHByaW50UHJvcGVydHkoInRvX2JjaSIsIC0xKTsKICAgICAgYWRkUHJlZGVjZXNzb3JzKGJsb2NrKTsKICAgICAgYWRkU3VjY2Vzc29ycyhibG9jayk7CiAgICAgIHByaW50RW1wdHlQcm9wZXJ0eSgieGhhbmRsZXJzIik7CiAgICAgIHByaW50RW1wdHlQcm9wZXJ0eSgiZmxhZ3MiKTsKICAgICAgaWYgKGJsb2NrLmRvbWluYXRvciAhPSBudWxsKSB7CiAgICAgICAgcHJpbnRQcm9wZXJ0eSgiZG9taW5hdG9yIiwgIkIke2Jsb2NrLmRvbWluYXRvci5pZH0iKTsKICAgICAgfQogICAgICB0YWcoInN0YXRlcyIsICgpIHsKICAgICAgICB0YWcoImxvY2FscyIsICgpIHsKICAgICAgICAgIHByaW50UHJvcGVydHkoInNpemUiLCAwKTsKICAgICAgICAgIHByaW50UHJvcGVydHkoIm1ldGhvZCIsICJOb25lIik7CiAgICAgICAgICBibG9jay5mb3JFYWNoUGhpKChwaGkpIHsKICAgICAgICAgICAgU3RyaW5nIHBoaUlkID0gc3RyaW5naWZpZXIudGVtcG9yYXJ5SWQocGhpKTsKICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGlucHV0SWRzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBoaS5pbnB1dHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBpbnB1dElkcy53cml0ZShzdHJpbmdpZmllci50ZW1wb3JhcnlJZChwaGkuaW5wdXRzW2ldKSk7CiAgICAgICAgICAgICAgaW5wdXRJZHMud3JpdGUoIiAiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludGxuKCIke3BoaS5pZH0gJHBoaUlkIFsgJGlucHV0SWRzXSIpOwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgICB0YWcoIkhJUiIsICgpIHsKICAgICAgICBhZGRJbnN0cnVjdGlvbnMoc3RyaW5naWZpZXIsIGJsb2NrLnBoaXMpOwogICAgICAgIGFkZEluc3RydWN0aW9ucyhzdHJpbmdpZmllciwgYmxvY2spOwogICAgICB9KTsKICAgIH0pOwogIH0KfQoKY2xhc3MgSEluc3RydWN0aW9uU3RyaW5naWZpZXIgaW1wbGVtZW50cyBIVmlzaXRvcjxTdHJpbmc+IHsKICBmaW5hbCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQ7CiAgZmluYWwgTmFtZXIgbmFtZXI7CiAgZmluYWwgSEJhc2ljQmxvY2sgY3VycmVudEJsb2NrOwoKICBISW5zdHJ1Y3Rpb25TdHJpbmdpZmllcih0aGlzLmN1cnJlbnRCbG9jaywgdGhpcy5jbG9zZWRXb3JsZCwgdGhpcy5uYW1lcik7CgogIEFic3RyYWN0VmFsdWVEb21haW4gZ2V0IF9hYnN0cmFjdFZhbHVlRG9tYWluID0+CiAgICAgIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CgogIHZpc2l0KEhJbnN0cnVjdGlvbiBub2RlKSA9PiAnJHtub2RlLmFjY2VwdCh0aGlzKX0gJHtub2RlLmluc3RydWN0aW9uVHlwZX0nOwoKICBTdHJpbmcgdGVtcG9yYXJ5SWQoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBTdHJpbmcgcHJlZml4OwogICAgaWYgKGluc3RydWN0aW9uLmlzTnVsbChfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBwcmVmaXggPSAndSc7CiAgICB9IGVsc2UgaWYgKGluc3RydWN0aW9uCiAgICAgICAgLmlzQ29uZmxpY3RpbmcoX2Fic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcHJlZml4ID0gJ2MnOwogICAgfSBlbHNlIGlmIChpbnN0cnVjdGlvbgogICAgICAgIC5pc0V4dGVuZGFibGVBcnJheShfYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBwcmVmaXggPSAnZSc7CiAgICB9IGVsc2UgaWYgKGluc3RydWN0aW9uCiAgICAgICAgLmlzRml4ZWRBcnJheShfYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBwcmVmaXggPSAnZic7CiAgICB9IGVsc2UgaWYgKGluc3RydWN0aW9uCiAgICAgICAgLmlzTXV0YWJsZUFycmF5KF9hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgIC5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHByZWZpeCA9ICdtJzsKICAgIH0gZWxzZSBpZiAoaW5zdHJ1Y3Rpb24uaXNBcnJheShfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBwcmVmaXggPSAnYSc7CiAgICB9IGVsc2UgaWYgKGluc3RydWN0aW9uLmlzU3RyaW5nKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHByZWZpeCA9ICdzJzsKICAgIH0gZWxzZSBpZiAoaW5zdHJ1Y3Rpb24KICAgICAgICAuaXNJbmRleGFibGVQcmltaXRpdmUoX2Fic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcHJlZml4ID0gJ3InOwogICAgfSBlbHNlIGlmIChpbnN0cnVjdGlvbi5pc0Jvb2xlYW4oX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcHJlZml4ID0gJ2InOwogICAgfSBlbHNlIGlmIChpbnN0cnVjdGlvbi5pc0ludGVnZXIoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcHJlZml4ID0gJ2knOwogICAgfSBlbHNlIGlmIChpbnN0cnVjdGlvbi5pc0RvdWJsZShfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBwcmVmaXggPSAnZCc7CiAgICB9IGVsc2UgaWYgKGluc3RydWN0aW9uLmlzTnVtYmVyKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHByZWZpeCA9ICduJzsKICAgIH0gZWxzZSBpZiAoX2Fic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAuY29udGFpbnNBbGwoaW5zdHJ1Y3Rpb24uaW5zdHJ1Y3Rpb25UeXBlKQogICAgICAgIC5pc1BvdGVudGlhbGx5VHJ1ZSkgewogICAgICBwcmVmaXggPSAndic7CiAgICB9IGVsc2UgewogICAgICBwcmVmaXggPSAnVSc7CiAgICB9CiAgICByZXR1cm4gIiRwcmVmaXgke2luc3RydWN0aW9uLmlkfSI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRMYXRlVmFsdWUoSExhdGVWYWx1ZSBub2RlKSB7CiAgICByZXR1cm4gIkxhdGVWYWx1ZTogJHt0ZW1wb3JhcnlJZChub2RlLmlucHV0c1swXSl9IjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdEJvb2xpZnkoSEJvb2xpZnkgbm9kZSkgewogICAgcmV0dXJuICJCb29saWZ5OiAke3RlbXBvcmFyeUlkKG5vZGUuaW5wdXRzWzBdKX0iOwogIH0KCiAgU3RyaW5nIGhhbmRsZUludm9rZUJpbmFyeShISW52b2tlQmluYXJ5IG5vZGUsIFN0cmluZyBvcGNvZGUpIHsKICAgIFN0cmluZyBsZWZ0ID0gdGVtcG9yYXJ5SWQobm9kZS5sZWZ0KTsKICAgIFN0cmluZyByaWdodCA9IHRlbXBvcmFyeUlkKG5vZGUucmlnaHQpOwogICAgcmV0dXJuICckb3Bjb2RlOiAkbGVmdCAkcmlnaHQnOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0QWJzKEhBYnMgbm9kZSkgewogICAgU3RyaW5nIG9wZXJhbmQgPSB0ZW1wb3JhcnlJZChub2RlLm9wZXJhbmQpOwogICAgcmV0dXJuICJBYnM6ICRvcGVyYW5kIjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdEFkZChIQWRkIG5vZGUpID0+IGhhbmRsZUludm9rZUJpbmFyeShub2RlLCAnQWRkJyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdEJpdEFuZChIQml0QW5kIG5vZGUpID0+IGhhbmRsZUludm9rZUJpbmFyeShub2RlLCAnQml0QW5kJyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdEJpdE5vdChIQml0Tm90IG5vZGUpIHsKICAgIFN0cmluZyBvcGVyYW5kID0gdGVtcG9yYXJ5SWQobm9kZS5vcGVyYW5kKTsKICAgIHJldHVybiAiQml0Tm90OiAkb3BlcmFuZCI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRCaXRPcihIQml0T3Igbm9kZSkgPT4gaGFuZGxlSW52b2tlQmluYXJ5KG5vZGUsICdCaXRPcicpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRCaXRYb3IoSEJpdFhvciBub2RlKSA9PiBoYW5kbGVJbnZva2VCaW5hcnkobm9kZSwgJ0JpdFhvcicpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRCb3VuZHNDaGVjayhIQm91bmRzQ2hlY2sgbm9kZSkgewogICAgU3RyaW5nIGxlbmd0aElkID0gdGVtcG9yYXJ5SWQobm9kZS5sZW5ndGgpOwogICAgU3RyaW5nIGluZGV4SWQgPSB0ZW1wb3JhcnlJZChub2RlLmluZGV4KTsKICAgIHJldHVybiAiQm91bmRzQ2hlY2s6IGxlbmd0aCA9ICRsZW5ndGhJZCwgaW5kZXggPSAkaW5kZXhJZCI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRCcmVhayhIQnJlYWsgbm9kZSkgewogICAgSEJhc2ljQmxvY2sgdGFyZ2V0ID0gY3VycmVudEJsb2NrLnN1Y2Nlc3NvcnNbMF07CiAgICBpZiAobm9kZS5sYWJlbCAhPSBudWxsKSB7CiAgICAgIHJldHVybiAiQnJlYWsgJHtub2RlLmxhYmVsLmxhYmVsTmFtZX06IChCJHt0YXJnZXQuaWR9KSI7CiAgICB9CiAgICByZXR1cm4gIkJyZWFrOiAoQiR7dGFyZ2V0LmlkfSkiOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0Q29uc3RhbnQoSENvbnN0YW50IGNvbnN0YW50KSA9PiAiQ29uc3RhbnQ6ICR7Y29uc3RhbnQuY29uc3RhbnR9IjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0Q29udGludWUoSENvbnRpbnVlIG5vZGUpIHsKICAgIEhCYXNpY0Jsb2NrIHRhcmdldCA9IGN1cnJlbnRCbG9jay5zdWNjZXNzb3JzWzBdOwogICAgaWYgKG5vZGUubGFiZWwgIT0gbnVsbCkgewogICAgICByZXR1cm4gIkNvbnRpbnVlICR7bm9kZS5sYWJlbC5sYWJlbE5hbWV9OiAoQiR7dGFyZ2V0LmlkfSkiOwogICAgfQogICAgcmV0dXJuICJDb250aW51ZTogKEIke3RhcmdldC5pZH0pIjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdENyZWF0ZShIQ3JlYXRlIG5vZGUpIHsKICAgIHJldHVybiBoYW5kbGVHZW5lcmljSW52b2tlKCJDcmVhdGUiLCAiJHtub2RlLmVsZW1lbnQubmFtZX0iLCBub2RlLmlucHV0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRDcmVhdGVCb3goSENyZWF0ZUJveCBub2RlKSB7CiAgICByZXR1cm4gaGFuZGxlR2VuZXJpY0ludm9rZSgiQ3JlYXRlQm94IiwgIiIsIG5vZGUuaW5wdXRzKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdERpdmlkZShIRGl2aWRlIG5vZGUpID0+IGhhbmRsZUludm9rZUJpbmFyeShub2RlLCAnRGl2aWRlJyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdEV4aXQoSEV4aXQgbm9kZSkgPT4gIkV4aXQiOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRGaWVsZEdldChIRmllbGRHZXQgbm9kZSkgewogICAgaWYgKG5vZGUuaXNOdWxsQ2hlY2spIHsKICAgICAgcmV0dXJuICdGaWVsZEdldDogTnVsbENoZWNrICR7dGVtcG9yYXJ5SWQobm9kZS5yZWNlaXZlcil9JzsKICAgIH0KICAgIFN0cmluZyBmaWVsZE5hbWUgPSBub2RlLmVsZW1lbnQubmFtZTsKICAgIHJldHVybiAnRmllbGRHZXQ6ICR7dGVtcG9yYXJ5SWQobm9kZS5yZWNlaXZlcil9LiRmaWVsZE5hbWUnOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0RmllbGRTZXQoSEZpZWxkU2V0IG5vZGUpIHsKICAgIFN0cmluZyB2YWx1ZUlkID0gdGVtcG9yYXJ5SWQobm9kZS52YWx1ZSk7CiAgICBTdHJpbmcgZmllbGROYW1lID0gbm9kZS5lbGVtZW50Lm5hbWU7CiAgICByZXR1cm4gJ0ZpZWxkU2V0OiAke3RlbXBvcmFyeUlkKG5vZGUucmVjZWl2ZXIpfS4kZmllbGROYW1lIHRvICR2YWx1ZUlkJzsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdFJlYWRNb2RpZnlXcml0ZShIUmVhZE1vZGlmeVdyaXRlIG5vZGUpIHsKICAgIFN0cmluZyBmaWVsZE5hbWUgPSBub2RlLmVsZW1lbnQubmFtZTsKICAgIFN0cmluZyByZWNlaXZlcklkID0gdGVtcG9yYXJ5SWQobm9kZS5yZWNlaXZlcik7CiAgICBTdHJpbmcgb3AgPSBub2RlLmpzT3A7CiAgICBpZiAobm9kZS5pc0Fzc2lnbk9wKSB7CiAgICAgIFN0cmluZyB2YWx1ZUlkID0gdGVtcG9yYXJ5SWQobm9kZS52YWx1ZSk7CiAgICAgIHJldHVybiAnUmVhZE1vZGlmeVdyaXRlOiAkcmVjZWl2ZXJJZC4kZmllbGROYW1lICRvcD0gJHZhbHVlSWQnOwogICAgfSBlbHNlIGlmIChub2RlLmlzUHJlT3ApIHsKICAgICAgcmV0dXJuICdSZWFkTW9kaWZ5V3JpdGU6ICRvcCRyZWNlaXZlcklkLiRmaWVsZE5hbWUnOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICdSZWFkTW9kaWZ5V3JpdGU6ICRyZWNlaXZlcklkLiRmaWVsZE5hbWUkb3AnOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0R2V0TGVuZ3RoKEhHZXRMZW5ndGggbm9kZSkgewogICAgcmV0dXJuICdHZXRMZW5ndGg6ICR7dGVtcG9yYXJ5SWQobm9kZS5yZWNlaXZlcil9JzsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdExvY2FsR2V0KEhMb2NhbEdldCBub2RlKSB7CiAgICBTdHJpbmcgbG9jYWxOYW1lID0gbm9kZS52YXJpYWJsZS5uYW1lOwogICAgcmV0dXJuICdMb2NhbEdldDogJHt0ZW1wb3JhcnlJZChub2RlLmxvY2FsKX0uJGxvY2FsTmFtZSc7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRMb2NhbFNldChITG9jYWxTZXQgbm9kZSkgewogICAgU3RyaW5nIHZhbHVlSWQgPSB0ZW1wb3JhcnlJZChub2RlLnZhbHVlKTsKICAgIFN0cmluZyBsb2NhbE5hbWUgPSBub2RlLnZhcmlhYmxlLm5hbWU7CiAgICByZXR1cm4gJ0xvY2FsU2V0OiAke3RlbXBvcmFyeUlkKG5vZGUubG9jYWwpfS4kbG9jYWxOYW1lIHRvICR2YWx1ZUlkJzsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdEdvdG8oSEdvdG8gbm9kZSkgewogICAgSEJhc2ljQmxvY2sgdGFyZ2V0ID0gY3VycmVudEJsb2NrLnN1Y2Nlc3NvcnNbMF07CiAgICByZXR1cm4gIkdvdG86IChCJHt0YXJnZXQuaWR9KSI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRHcmVhdGVyKEhHcmVhdGVyIG5vZGUpID0+IGhhbmRsZUludm9rZUJpbmFyeShub2RlLCAnR3JlYXRlcicpOwogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdEdyZWF0ZXJFcXVhbChIR3JlYXRlckVxdWFsIG5vZGUpIHsKICAgIHJldHVybiBoYW5kbGVJbnZva2VCaW5hcnkobm9kZSwgJ0dyZWF0ZXJFcXVhbCcpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0SWRlbnRpdHkoSElkZW50aXR5IG5vZGUpID0+IGhhbmRsZUludm9rZUJpbmFyeShub2RlLCAnSWRlbnRpdHknKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0SWYoSElmIG5vZGUpIHsKICAgIEhCYXNpY0Jsb2NrIHRoZW5CbG9jayA9IGN1cnJlbnRCbG9jay5zdWNjZXNzb3JzWzBdOwogICAgSEJhc2ljQmxvY2sgZWxzZUJsb2NrID0gY3VycmVudEJsb2NrLnN1Y2Nlc3NvcnNbMV07CiAgICBTdHJpbmcgY29uZGl0aW9uSWQgPSB0ZW1wb3JhcnlJZChub2RlLmlucHV0c1swXSk7CiAgICByZXR1cm4gIklmICgkY29uZGl0aW9uSWQpOiAoQiR7dGhlbkJsb2NrLmlkfSkgZWxzZSAoQiR7ZWxzZUJsb2NrLmlkfSkiOwogIH0KCiAgU3RyaW5nIGhhbmRsZUdlbmVyaWNJbnZva2UoCiAgICAgIFN0cmluZyBpbnZva2VUeXBlLCBTdHJpbmcgZnVuY3Rpb25OYW1lLCBMaXN0PEhJbnN0cnVjdGlvbj4gYXJndW1lbnRzKSB7CiAgICBTdHJpbmdCdWZmZXIgYXJndW1lbnRzU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGkgIT0gMCkgYXJndW1lbnRzU3RyaW5nLndyaXRlKCIsICIpOwogICAgICBhcmd1bWVudHNTdHJpbmcud3JpdGUodGVtcG9yYXJ5SWQoYXJndW1lbnRzW2ldKSk7CiAgICB9CiAgICByZXR1cm4gIiRpbnZva2VUeXBlOiAkZnVuY3Rpb25OYW1lKCRhcmd1bWVudHNTdHJpbmcpIjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdEluZGV4KEhJbmRleCBub2RlKSB7CiAgICBTdHJpbmcgcmVjZWl2ZXIgPSB0ZW1wb3JhcnlJZChub2RlLnJlY2VpdmVyKTsKICAgIFN0cmluZyBpbmRleCA9IHRlbXBvcmFyeUlkKG5vZGUuaW5kZXgpOwogICAgcmV0dXJuICJJbmRleDogJHJlY2VpdmVyWyRpbmRleF0iOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0SW5kZXhBc3NpZ24oSEluZGV4QXNzaWduIG5vZGUpIHsKICAgIFN0cmluZyByZWNlaXZlciA9IHRlbXBvcmFyeUlkKG5vZGUucmVjZWl2ZXIpOwogICAgU3RyaW5nIGluZGV4ID0gdGVtcG9yYXJ5SWQobm9kZS5pbmRleCk7CiAgICBTdHJpbmcgdmFsdWUgPSB0ZW1wb3JhcnlJZChub2RlLnZhbHVlKTsKICAgIHJldHVybiAiSW5kZXhBc3NpZ246ICRyZWNlaXZlclskaW5kZXhdID0gJHZhbHVlIjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdEludGVyY2VwdG9yKEhJbnRlcmNlcHRvciBub2RlKSB7CiAgICBTdHJpbmcgdmFsdWUgPSB0ZW1wb3JhcnlJZChub2RlLmlucHV0c1swXSk7CiAgICBpZiAobm9kZS5pbnRlcmNlcHRlZENsYXNzZXMgIT0gbnVsbCkgewogICAgICBTdHJpbmcgY2xzID0gbmFtZXIuc3VmZml4Rm9yR2V0SW50ZXJjZXB0b3Iobm9kZS5pbnRlcmNlcHRlZENsYXNzZXMpOwogICAgICByZXR1cm4gIkludGVyY2VwdG9yICgkY2xzKTogJHZhbHVlIjsKICAgIH0KICAgIHJldHVybiAiSW50ZXJjZXB0b3I6ICR2YWx1ZSI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRJbnZva2VDbG9zdXJlKEhJbnZva2VDbG9zdXJlIG5vZGUpID0+CiAgICAgIGhhbmRsZUludm9rZUR5bmFtaWMobm9kZSwgIkludm9rZUNsb3N1cmUiKTsKCiAgU3RyaW5nIGhhbmRsZUludm9rZUR5bmFtaWMoSEludm9rZUR5bmFtaWMgaW52b2tlLCBTdHJpbmcga2luZCkgewogICAgU3RyaW5nIHJlY2VpdmVyID0gdGVtcG9yYXJ5SWQoaW52b2tlLnJlY2VpdmVyKTsKICAgIFN0cmluZyBuYW1lID0gaW52b2tlLnNlbGVjdG9yLm5hbWU7CiAgICBTdHJpbmcgdGFyZ2V0ID0gIiRyZWNlaXZlci4kbmFtZSI7CiAgICBpbnQgb2Zmc2V0ID0gSEludm9rZS5BUkdVTUVOVFNfT0ZGU0VUOwogICAgTGlzdCBhcmd1bWVudHMgPSBpbnZva2UuaW5wdXRzLnN1Ymxpc3Qob2Zmc2V0KTsKICAgIHJldHVybiBoYW5kbGVHZW5lcmljSW52b2tlKGtpbmQsIHRhcmdldCwgYXJndW1lbnRzKSArICIoJHtpbnZva2UubWFza30pIjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdEludm9rZUR5bmFtaWNNZXRob2QoSEludm9rZUR5bmFtaWNNZXRob2Qgbm9kZSkgPT4KICAgICAgaGFuZGxlSW52b2tlRHluYW1pYyhub2RlLCAiSW52b2tlRHluYW1pY01ldGhvZCIpOwogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdEludm9rZUR5bmFtaWNHZXR0ZXIoSEludm9rZUR5bmFtaWNHZXR0ZXIgbm9kZSkgPT4KICAgICAgaGFuZGxlSW52b2tlRHluYW1pYyhub2RlLCAiSW52b2tlRHluYW1pY0dldHRlciIpOwogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdEludm9rZUR5bmFtaWNTZXR0ZXIoSEludm9rZUR5bmFtaWNTZXR0ZXIgbm9kZSkgPT4KICAgICAgaGFuZGxlSW52b2tlRHluYW1pYyhub2RlLCAiSW52b2tlRHluYW1pY1NldHRlciIpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRJbnZva2VTdGF0aWMoSEludm9rZVN0YXRpYyBpbnZva2UpIHsKICAgIFN0cmluZyB0YXJnZXQgPSBpbnZva2UuZWxlbWVudC5uYW1lOwogICAgcmV0dXJuIGhhbmRsZUdlbmVyaWNJbnZva2UoIkludm9rZVN0YXRpYyIsIHRhcmdldCwgaW52b2tlLmlucHV0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRJbnZva2VTdXBlcihISW52b2tlU3VwZXIgaW52b2tlKSB7CiAgICBTdHJpbmcgdGFyZ2V0ID0gaW52b2tlLmVsZW1lbnQubmFtZTsKICAgIHJldHVybiBoYW5kbGVHZW5lcmljSW52b2tlKCJJbnZva2VTdXBlciIsIHRhcmdldCwgaW52b2tlLmlucHV0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRJbnZva2VDb25zdHJ1Y3RvckJvZHkoSEludm9rZUNvbnN0cnVjdG9yQm9keSBpbnZva2UpIHsKICAgIFN0cmluZyB0YXJnZXQgPSBpbnZva2UuZWxlbWVudC5uYW1lOwogICAgcmV0dXJuIGhhbmRsZUdlbmVyaWNJbnZva2UoIkludm9rZUNvbnN0cnVjdG9yQm9keSIsIHRhcmdldCwgaW52b2tlLmlucHV0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRJbnZva2VHZW5lcmF0b3JCb2R5KEhJbnZva2VHZW5lcmF0b3JCb2R5IGludm9rZSkgewogICAgU3RyaW5nIHRhcmdldCA9IGludm9rZS5lbGVtZW50Lm5hbWU7CiAgICByZXR1cm4gaGFuZGxlR2VuZXJpY0ludm9rZSgiSW52b2tlR2VuZXJhdG9yQm9keSIsIHRhcmdldCwgaW52b2tlLmlucHV0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRGb3JlaWduQ29kZShIRm9yZWlnbkNvZGUgbm9kZSkgewogICAgdmFyIHRlbXBsYXRlID0gbm9kZS5jb2RlVGVtcGxhdGU7CiAgICBTdHJpbmcgY29kZSA9ICcke3RlbXBsYXRlLmFzdH0nOwogICAgdmFyIGlucHV0cyA9IG5vZGUuaW5wdXRzLm1hcCh0ZW1wb3JhcnlJZCkuam9pbignLCAnKTsKICAgIHJldHVybiAiRm9yZWlnbkNvZGU6ICRjb2RlICgkaW5wdXRzKSI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRMZXNzKEhMZXNzIG5vZGUpID0+IGhhbmRsZUludm9rZUJpbmFyeShub2RlLCAnTGVzcycpOwogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdExlc3NFcXVhbChITGVzc0VxdWFsIG5vZGUpID0+CiAgICAgIGhhbmRsZUludm9rZUJpbmFyeShub2RlLCAnTGVzc0VxdWFsJyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdExpdGVyYWxMaXN0KEhMaXRlcmFsTGlzdCBub2RlKSB7CiAgICBTdHJpbmdCdWZmZXIgZWxlbWVudHNTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGUuaW5wdXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChpICE9IDApIGVsZW1lbnRzU3RyaW5nLndyaXRlKCIsICIpOwogICAgICBlbGVtZW50c1N0cmluZy53cml0ZSh0ZW1wb3JhcnlJZChub2RlLmlucHV0c1tpXSkpOwogICAgfQogICAgcmV0dXJuICJMaXRlcmFsTGlzdDogWyRlbGVtZW50c1N0cmluZ10iOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0TG9vcEJyYW5jaChITG9vcEJyYW5jaCBicmFuY2gpIHsKICAgIEhCYXNpY0Jsb2NrIGJvZHlCbG9jayA9IGN1cnJlbnRCbG9jay5zdWNjZXNzb3JzWzBdOwogICAgSEJhc2ljQmxvY2sgZXhpdEJsb2NrID0gY3VycmVudEJsb2NrLnN1Y2Nlc3NvcnNbMV07CiAgICBTdHJpbmcgY29uZGl0aW9uSWQgPSB0ZW1wb3JhcnlJZChicmFuY2guaW5wdXRzWzBdKTsKICAgIHJldHVybiAiTG9vcEJyYW5jaCAoJGNvbmRpdGlvbklkKTogKEIke2JvZHlCbG9jay5pZH0pIHRoZW4gKEIke2V4aXRCbG9jay5pZH0pIjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdE11bHRpcGx5KEhNdWx0aXBseSBub2RlKSA9PiBoYW5kbGVJbnZva2VCaW5hcnkobm9kZSwgJ011bHRpcGx5Jyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdE5lZ2F0ZShITmVnYXRlIG5vZGUpIHsKICAgIFN0cmluZyBvcGVyYW5kID0gdGVtcG9yYXJ5SWQobm9kZS5vcGVyYW5kKTsKICAgIHJldHVybiAiTmVnYXRlOiAkb3BlcmFuZCI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXROb3QoSE5vdCBub2RlKSA9PiAiTm90OiAke3RlbXBvcmFyeUlkKG5vZGUuaW5wdXRzWzBdKX0iOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRQYXJhbWV0ZXJWYWx1ZShIUGFyYW1ldGVyVmFsdWUgbm9kZSkgewogICAgcmV0dXJuICJQYXJhbWV0ZXJWYWx1ZTogJHtub2RlLnNvdXJjZUVsZW1lbnQubmFtZX0iOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0TG9jYWxWYWx1ZShITG9jYWxWYWx1ZSBub2RlKSB7CiAgICByZXR1cm4gIkxvY2FsVmFsdWU6ICR7bm9kZS5zb3VyY2VFbGVtZW50Lm5hbWV9IjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdFBoaShIUGhpIHBoaSkgewogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGJ1ZmZlci53cml0ZSgiUGhpOiAiKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhpLmlucHV0cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaSA+IDApIGJ1ZmZlci53cml0ZSgiLCAiKTsKICAgICAgYnVmZmVyLndyaXRlKHRlbXBvcmFyeUlkKHBoaS5pbnB1dHNbaV0pKTsKICAgIH0KICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdFJlZihIUmVmIG5vZGUpIHsKICAgIHJldHVybiAnUmVmOiAke3RlbXBvcmFyeUlkKG5vZGUudmFsdWUpfSc7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRSZXR1cm4oSFJldHVybiBub2RlKSA9PiAiUmV0dXJuOiAke3RlbXBvcmFyeUlkKG5vZGUuaW5wdXRzWzBdKX0iOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRTaGlmdExlZnQoSFNoaWZ0TGVmdCBub2RlKSA9PgogICAgICBoYW5kbGVJbnZva2VCaW5hcnkobm9kZSwgJ1NoaWZ0TGVmdCcpOwogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdFNoaWZ0UmlnaHQoSFNoaWZ0UmlnaHQgbm9kZSkgPT4KICAgICAgaGFuZGxlSW52b2tlQmluYXJ5KG5vZGUsICdTaGlmdFJpZ2h0Jyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdFN0YXRpYyhIU3RhdGljIG5vZGUpID0+ICJTdGF0aWM6ICR7bm9kZS5lbGVtZW50Lm5hbWV9IjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0TGF6eVN0YXRpYyhITGF6eVN0YXRpYyBub2RlKSA9PgogICAgICAiTGF6eVN0YXRpYzogJHtub2RlLmVsZW1lbnQubmFtZX0iOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRPbmVTaG90SW50ZXJjZXB0b3IoSE9uZVNob3RJbnRlcmNlcHRvciBub2RlKSA9PgogICAgICBoYW5kbGVJbnZva2VEeW5hbWljKG5vZGUsICJPbmVTaG90SW50ZXJjZXB0b3IiKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0U3RhdGljU3RvcmUoSFN0YXRpY1N0b3JlIG5vZGUpIHsKICAgIFN0cmluZyBsaHMgPSBub2RlLmVsZW1lbnQubmFtZTsKICAgIHJldHVybiAiU3RhdGljU3RvcmU6ICRsaHMgPSAke3RlbXBvcmFyeUlkKG5vZGUuaW5wdXRzWzBdKX0iOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0U3RyaW5nQ29uY2F0KEhTdHJpbmdDb25jYXQgbm9kZSkgewogICAgdmFyIGxlZnRJZCA9IHRlbXBvcmFyeUlkKG5vZGUubGVmdCk7CiAgICB2YXIgcmlnaHRJZCA9IHRlbXBvcmFyeUlkKG5vZGUucmlnaHQpOwogICAgcmV0dXJuICJTdHJpbmdDb25jYXQ6ICRsZWZ0SWQgKyAkcmlnaHRJZCI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRTdHJpbmdpZnkoSFN0cmluZ2lmeSBub2RlKSB7CiAgICByZXR1cm4gIlN0cmluZ2lmeTogJHt0ZW1wb3JhcnlJZChub2RlLmlucHV0c1swXSl9IjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdFN1YnRyYWN0KEhTdWJ0cmFjdCBub2RlKSA9PiBoYW5kbGVJbnZva2VCaW5hcnkobm9kZSwgJ1N1YnRyYWN0Jyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdFN3aXRjaChIU3dpdGNoIG5vZGUpIHsKICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBidWYud3JpdGUoIlN3aXRjaDogKCIpOwogICAgYnVmLndyaXRlKHRlbXBvcmFyeUlkKG5vZGUuaW5wdXRzWzBdKSk7CiAgICBidWYud3JpdGUoIikgIik7CiAgICBmb3IgKGludCBpID0gMTsgaSA8IG5vZGUuaW5wdXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGJ1Zi53cml0ZSh0ZW1wb3JhcnlJZChub2RlLmlucHV0c1tpXSkpOwogICAgICBidWYud3JpdGUoIjogQiIpOwogICAgICBidWYud3JpdGUobm9kZS5ibG9jay5zdWNjZXNzb3JzW2kgLSAxXS5pZCk7CiAgICAgIGJ1Zi53cml0ZSgiLCAiKTsKICAgIH0KICAgIGJ1Zi53cml0ZSgiZGVmYXVsdDogQiIpOwogICAgYnVmLndyaXRlKG5vZGUuZGVmYXVsdFRhcmdldC5pZCk7CiAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRUaGlzKEhUaGlzIG5vZGUpID0+ICJUaGlzIjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0VGhyb3coSFRocm93IG5vZGUpID0+ICJUaHJvdzogJHt0ZW1wb3JhcnlJZChub2RlLmlucHV0c1swXSl9IjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0VGhyb3dFeHByZXNzaW9uKEhUaHJvd0V4cHJlc3Npb24gbm9kZSkgewogICAgcmV0dXJuICJUaHJvd0V4cHJlc3Npb246ICR7dGVtcG9yYXJ5SWQobm9kZS5pbnB1dHNbMF0pfSI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRUcnVuY2F0aW5nRGl2aWRlKEhUcnVuY2F0aW5nRGl2aWRlIG5vZGUpIHsKICAgIHJldHVybiBoYW5kbGVJbnZva2VCaW5hcnkobm9kZSwgJ1RydW5jYXRpbmdEaXZpZGUnKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdFJlbWFpbmRlcihIUmVtYWluZGVyIG5vZGUpIHsKICAgIHJldHVybiBoYW5kbGVJbnZva2VCaW5hcnkobm9kZSwgJ1JlbWFpbmRlcicpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0RXhpdFRyeShIRXhpdFRyeSBub2RlKSB7CiAgICByZXR1cm4gIkV4aXRUcnkiOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0VHJ5KEhUcnkgbm9kZSkgewogICAgTGlzdDxIQmFzaWNCbG9jaz4gc3VjY2Vzc29ycyA9IGN1cnJlbnRCbG9jay5zdWNjZXNzb3JzOwogICAgU3RyaW5nIHRyeUJsb2NrID0gJ0Ike3N1Y2Nlc3NvcnNbMF0uaWR9JzsKICAgIFN0cmluZyBjYXRjaEJsb2NrID0gJ25vbmUnOwogICAgaWYgKG5vZGUuY2F0Y2hCbG9jayAhPSBudWxsKSB7CiAgICAgIGNhdGNoQmxvY2sgPSAnQiR7c3VjY2Vzc29yc1sxXS5pZH0nOwogICAgfQoKICAgIFN0cmluZyBmaW5hbGx5QmxvY2sgPSAnbm9uZSc7CiAgICBpZiAobm9kZS5maW5hbGx5QmxvY2sgIT0gbnVsbCkgewogICAgICBmaW5hbGx5QmxvY2sgPSAnQiR7bm9kZS5maW5hbGx5QmxvY2suaWR9JzsKICAgIH0KCiAgICByZXR1cm4gIlRyeTogJHRyeUJsb2NrLCBDYXRjaDogJGNhdGNoQmxvY2ssIEZpbmFsbHk6ICRmaW5hbGx5QmxvY2ssICIKICAgICAgICAiSm9pbjogQiR7c3VjY2Vzc29ycy5sYXN0LmlkfSI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRJcyhISXMgbm9kZSkgewogICAgU3RyaW5nIHR5cGUgPSBub2RlLnR5cGVFeHByZXNzaW9uLnRvU3RyaW5nKCk7CiAgICByZXR1cm4gIklzOiAke3RlbXBvcmFyeUlkKG5vZGUuZXhwcmVzc2lvbil9IGlzICR0eXBlIjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdElzVmlhSW50ZXJjZXB0b3IoSElzVmlhSW50ZXJjZXB0b3Igbm9kZSkgewogICAgU3RyaW5nIHR5cGUgPSBub2RlLnR5cGVFeHByZXNzaW9uLnRvU3RyaW5nKCk7CiAgICByZXR1cm4gIklzVmlhSW50ZXJjZXB0b3I6ICR7dGVtcG9yYXJ5SWQobm9kZS5pbnB1dHNbMF0pfSBpcyAkdHlwZSI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRUeXBlQ29udmVyc2lvbihIVHlwZUNvbnZlcnNpb24gbm9kZSkgewogICAgU3RyaW5nIGNoZWNrZWRJbnB1dCA9IHRlbXBvcmFyeUlkKG5vZGUuY2hlY2tlZElucHV0KTsKICAgIFN0cmluZyByZXN0OwogICAgaWYgKG5vZGUuaW5wdXRzLmxlbmd0aCA9PSAyKSB7CiAgICAgIHJlc3QgPSAiICR7dGVtcG9yYXJ5SWQobm9kZS5pbnB1dHMubGFzdCl9IjsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChub2RlLmlucHV0cy5sZW5ndGggPT0gMSk7CiAgICAgIHJlc3QgPSAiIjsKICAgIH0KICAgIFN0cmluZyBraW5kID0gX3R5cGVDb252ZXJzaW9uS2luZChub2RlKTsKICAgIHJldHVybiAiVHlwZUNvbnZlcnNpb246ICRraW5kICRjaGVja2VkSW5wdXQgdG8gJHtub2RlLmluc3RydWN0aW9uVHlwZX0kcmVzdCI7CiAgfQoKICBTdHJpbmcgX3R5cGVDb252ZXJzaW9uS2luZChIVHlwZUNvbnZlcnNpb24gbm9kZSkgewogICAgc3dpdGNoIChub2RlLmtpbmQpIHsKICAgICAgY2FzZSBIVHlwZUNvbnZlcnNpb24uQ0hFQ0tFRF9NT0RFX0NIRUNLOgogICAgICAgIHJldHVybiAnQ0hFQ0tFRF9NT0RFJzsKICAgICAgY2FzZSBIVHlwZUNvbnZlcnNpb24uQVJHVU1FTlRfVFlQRV9DSEVDSzoKICAgICAgICByZXR1cm4gJ0FSR1VNRU5UJzsKICAgICAgY2FzZSBIVHlwZUNvbnZlcnNpb24uQ0FTVF9UWVBFX0NIRUNLOgogICAgICAgIHJldHVybiAnQ0FTVCc7CiAgICAgIGNhc2UgSFR5cGVDb252ZXJzaW9uLkJPT0xFQU5fQ09OVkVSU0lPTl9DSEVDSzoKICAgICAgICByZXR1cm4gJ0JPT0xFQU5fQ09OVkVSU0lPTic7CiAgICAgIGNhc2UgSFR5cGVDb252ZXJzaW9uLlJFQ0VJVkVSX1RZUEVfQ0hFQ0s6CiAgICAgICAgcmV0dXJuICdSRUNFSVZFUic7CiAgICB9CiAgICByZXR1cm4gJz8nOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0VHlwZUtub3duKEhUeXBlS25vd24gbm9kZSkgewogICAgYXNzZXJ0KG5vZGUuaW5wdXRzLmxlbmd0aCA8PSAyKTsKICAgIFN0cmluZyByZXN1bHQgPQogICAgICAgICJUeXBlS25vd246ICR7dGVtcG9yYXJ5SWQobm9kZS5jaGVja2VkSW5wdXQpfSBpcyAke25vZGUua25vd25UeXBlfSI7CiAgICBpZiAobm9kZS53aXRuZXNzICE9IG51bGwpIHsKICAgICAgcmVzdWx0ICs9ICIgd2l0bmVzc2VkIGJ5ICR7dGVtcG9yYXJ5SWQobm9kZS53aXRuZXNzKX0iOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdFJhbmdlQ29udmVyc2lvbihIUmFuZ2VDb252ZXJzaW9uIG5vZGUpIHsKICAgIHJldHVybiAiUmFuZ2VDb252ZXJzaW9uOiAke25vZGUuY2hlY2tlZElucHV0fSI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRUeXBlSW5mb1JlYWRSYXcoSFR5cGVJbmZvUmVhZFJhdyBub2RlKSB7CiAgICB2YXIgaW5wdXRzID0gbm9kZS5pbnB1dHMubWFwKHRlbXBvcmFyeUlkKS5qb2luKCcsICcpOwogICAgcmV0dXJuICJUeXBlSW5mb1JlYWRSYXc6ICRpbnB1dHMiOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0VHlwZUluZm9SZWFkVmFyaWFibGUoSFR5cGVJbmZvUmVhZFZhcmlhYmxlIG5vZGUpIHsKICAgIHZhciBpbnB1dHMgPSBub2RlLmlucHV0cy5tYXAodGVtcG9yYXJ5SWQpLmpvaW4oJywgJyk7CiAgICByZXR1cm4gIlR5cGVJbmZvUmVhZFZhcmlhYmxlOiAke25vZGUudmFyaWFibGV9ICAkaW5wdXRzIjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdFR5cGVJbmZvRXhwcmVzc2lvbihIVHlwZUluZm9FeHByZXNzaW9uIG5vZGUpIHsKICAgIHZhciBpbnB1dHMgPSBub2RlLmlucHV0cy5tYXAodGVtcG9yYXJ5SWQpLmpvaW4oJywgJyk7CiAgICByZXR1cm4gIlR5cGVJbmZvRXhwcmVzc2lvbjogJHtub2RlLmtpbmRBc1N0cmluZ30gJHtub2RlLmRhcnRUeXBlfSIKICAgICAgICAiICgkaW5wdXRzKSI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRBd2FpdChIQXdhaXQgbm9kZSkgewogICAgcmV0dXJuICJBd2FpdDogJHt0ZW1wb3JhcnlJZChub2RlLmlucHV0c1swXSl9IjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdFlpZWxkKEhZaWVsZCBub2RlKSB7CiAgICByZXR1cm4gIllpZWxkJHtub2RlLmhhc1N0YXIgPyAiKiIgOiAiIn06ICR7dGVtcG9yYXJ5SWQobm9kZS5pbnB1dHNbMF0pfSI7CiAgfQp9CoKhAE5OPAEUATI4MS4ZKhUBNz8SNiIVDBsBNgEvFxQjIQgEASwmKg0TGzwmCBEGBAEqJCgNExk4JAgRBgQBGEQwHSoTLE1QE0FBUQYEAQwsKkAeFi0lIx4cJyMlPggZGyQrIzk4OkYjDjYODAoWMi0KCAQCATwiFSIBTAEyJwFOATETRRQbLR0UGzEdFBssHRQbLh0UTRROFBs0HRRPFE8UThROFCQyHhQNFAYnBAEMKzgEAQwnNgQBQSosJAQBDB8wHAQBDEEBDEoBDCUwHwQBDEcBDEoBDC8wLkAEAQwjNR4/BiUEAQxQAQwpNR5CBigEAQwlTwQBDCs+BAEMSgEMKgEMKRxCBipBBAEMKS4qTQQBDDcqNBsbMEYfOw07BgQBDCs3BAEMKSs+BAEMKS4rSgQBDCE1JAQBDE0MMTUEAQxQAQwdODg2TAQBHk43MS84BjsEAQwjMiwnBAEMLzIsLDYEAQwvMCtLKwYiBAEMNDIBQzQoJys0TgQBDEA4DEA4DEA4AQwzKUcEAQwxKUYEAQxFKVAEAQxBKU4EAQwvJiU6KwQBDEQMLC0BDC82My45Bi0EAQwvODg4VAQBDFABDCUwHwQBDEcBDDU5BAEMLTUEAQweLhsyJTAGHgQBDB8uBAEMUAEMLC0MLi4BDEYBDC4qAQw+NwEMLyRBBAEMMSkrLwQBDCs4BAEMUAEMJSscLBUzLhgyFwYdJhsEAQwqAQxNAQw3PgQBDDk5BAEMKzIEAQwnFgQBDB88LiAjKwYBIiUxBgFKKAQBDB0yOwQBDDkySAQBDDU6ESMyDScRBi1SBAE1GS8fMBssFzUlMBsGEAQBDCslFE0gPgYTBAEMNzQEAQw3OicEAQxBOj4EAQw9OkcWBAEMIzQEAQwjTgQCAShwYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2Evc3NhX3RyYWNlci5kYXJ0RHNka3Jvb3Q6L3Nkay9saWIvX2ludGVybmFsL2pzX3J1bnRpbWUvbGliL3NoYXJlZC9lbWJlZGRlZF9uYW1lcy5kYXJ0ujcvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIENvbnRhaW5zIHRoZSBuYW1lcyBvZiBnbG9iYWxzIHRoYXQgYXJlIGVtYmVkZGVkIGludG8gdGhlIG91dHB1dCBieSB0aGUKLy8vIGNvbXBpbGVyLgovLy8KLy8vIFZhcmlhYmxlcyBlbWJlZGRlZCB0aGlzIHdheSBzaG91bGQgYmUgYWNjZXNzIHdpdGggYEpTX0VNQkVEREVEX0dMT0JBTGAgZnJvbQovLy8gdGhlIGBfZm9yZWlnbl9oZWxwZXJgIGxpYnJhcnkuCi8vLwovLy8gVGhpcyBsaWJyYXJ5IGlzIHNoYXJlZCBiZXR3ZWVuIHRoZSBjb21waWxlciBhbmQgdGhlIHJ1bnRpbWUgc3lzdGVtLgpsaWJyYXJ5IGRhcnQyanMuX2VtYmVkZGVkX25hbWVzOwoKLy8vIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGlzIHVzZWQgdG8gbWFyayBhIHR5cGUgYXMgdHlwZWRlZi4KLy8vCi8vLyBXaXRob3V0IHJlZmxlY3Rpb24gdHlwZWRlZnMgYXJlIHJlbW92ZWQgKGV4cGFuZGVkIHRvIHRoZWlyIGZ1bmN0aW9uIHR5cGUpCi8vLyBidXQgd2l0aCByZWZsZWN0aW9uIGFuIG9iamVjdCBpcyBuZWVkZWQgdG8gaGF2ZSB0aGUgdHlwZWRlZidzIG5hbWUuIFRoZQovLy8gb2JqZWN0IGlzIG1hcmtlZCB3aXRoIHRoaXMgcHJvcGVydHkuCi8vLwovLy8gVGhpcyBwcm9wZXJ0eSBuYW1lIG9ubHkgbGl2ZXMgb24gaW50ZXJuYWwgdHlwZS1vYmplY3RzIGFuZCBpcyBvbmx5IHVzZWQKLy8vIHdoZW4gcmVmbGVjdGlvbiBpcyBlbmFibGVkLgpjb25zdCBUWVBFREVGX1BSRURJQ0FURV9QUk9QRVJUWV9OQU1FID0gciIkJGlzVHlwZWRlZiI7CgovLy8gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgaXMgdXNlZCB0byBmaW5kIHRoZSBmdW5jdGlvbiB0eXBlIG9mIGEKLy8vIHR5cGVkZWYuCi8vLwovLy8gV2l0aG91dCByZWZsZWN0aW9uIHR5cGVkZWZzIGFyZSByZW1vdmVkIChleHBhbmRlZCB0byB0aGVpciBmdW5jdGlvbiB0eXBlKQovLy8gYnV0IHdpdGggcmVmbGVjdGlvbiBhbiBvYmplY3QgaXMgbmVlZGVkIHRvIGhhdmUgdGhlIHR5cGVkZWYncyBuYW1lLgovLy8KLy8vIFRoZSB0eXBlZGVmJ3Mgb2JqZWN0IGNvbnRhaW5zIGEgcG9pbnRlciB0byBpdHMgZnVuY3Rpb24gdHlwZSAoYXMgYW4gaW5kZXgKLy8vIGludG8gdGhlIGVtYmVkZGVkIGdsb2JhbCBbVFlQRVNdKSBpbiB0aGlzIHByb3BlcnR5LgovLy8KLy8vIFRoaXMgcHJvcGVydHkgbmFtZSBvbmx5IGxpdmVzIG9uIGludGVybmFsIHR5cGUtb2JqZWN0cyBhbmQgaXMgb25seSB1c2VkCi8vLyB3aGVuIHJlZmxlY3Rpb24gaXMgZW5hYmxlZC4KY29uc3QgVFlQRURFRl9UWVBFX1BST1BFUlRZX05BTUUgPSByIiR0eXBlZGVmVHlwZSI7CgovLy8gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgaXMgdXNlZCB0byBmaW5kIHRoZSBuYXRpdmUgc3VwZXJjbGFzcyBvZgovLy8gYW4gZXh0ZW5kZWQgY2xhc3MuCi8vLwovLy8gRXZlcnkgY2xhc3MgdGhhdCBleHRlbmRzIGEgbmF0aXZlIGNsYXNzIGhhcyB0aGlzIHByb3BlcnR5IHNldCBvbiBpdHMKLy8vIG5hdGl2ZSBjbGFzcy4KY29uc3QgTkFUSVZFX1NVUEVSQ0xBU1NfVEFHX05BTUUgPSByIiRuYXRpdmVTdXBlcmNsYXNzVGFnIjsKCi8vLyBUaGUgbmFtZSBvZiB0aGUgc3RhdGljLWZ1bmN0aW9uIHByb3BlcnR5IG5hbWUuCi8vLwovLy8gVGhpcyBwcm9wZXJ0eSBpcyBzZXQgZm9yIGFsbCB0ZWFyLW9mZnMgb2Ygc3RhdGljIGZ1bmN0aW9ucywgYW5kIHByb3ZpZGVzCi8vLyB0aGUgc3RhdGljIGZ1bmN0aW9uJ3MgdW5pcXVlIChwb3RlbnRpYWxseSBtaW5pZmllZCkgbmFtZS4KY29uc3QgU1RBVElDX0ZVTkNUSU9OX05BTUVfUFJPUEVSVFlfTkFNRSA9IHInJHN0YXRpY19uYW1lJzsKCi8vLyBUaGUgbmFtZSBvZiB0aGUgZW1iZWRkZWQgZ2xvYmFsIGZvciBtZXRhZGF0YS4KLy8vCi8vLyBVc2UgW0pzQnVpbHRpbi5nZXRNZXRhZGF0YV0gaW5zdGVhZCBvZiBkaXJlY3RseSBhY2Nlc3NpbmcgdGhpcyBlbWJlZGRlZAovLy8gZ2xvYmFsLgpjb25zdCBNRVRBREFUQSA9ICdtZXRhZGF0YSc7CgovLy8gQSBsaXN0IG9mIHR5cGVzIHVzZWQgaW4gdGhlIHByb2dyYW0gZS5nLiBmb3IgcmVmbGVjdGlvbiBvciBlbmNvZGluZyBvZgovLy8gZnVuY3Rpb24gdHlwZXMuCi8vLwovLy8gVXNlIFtKc0J1aWx0aW4uZ2V0VHlwZV0gaW5zdGVhZCBvZiBkaXJlY3RseSBhY2Nlc3NpbmcgdGhpcyBlbWJlZGRlZCBnbG9iYWwuCmNvbnN0IFRZUEVTID0gJ3R5cGVzJzsKCi8vLyBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBtYXBzIGEgbmFtZSBvZiBhIGNsYXNzIHRvIGl0cyB0eXBlLgovLy8KLy8vIFRoaXMgZW1iZWRkZWQgZ2xvYmFsIGlzIHVzZWQgYnkgdGhlIHJ1bnRpbWUgd2hlbiBjb21wdXRpbmcgdGhlIGludGVybmFsCi8vLyBydW50aW1lLXR5cGUtaW5mb3JtYXRpb24gKHJ0aSkgb2JqZWN0Lgpjb25zdCBHRVRfVFlQRV9GUk9NX05BTUUgPSAnZ2V0VHlwZUZyb21OYW1lJzsKCi8vLyBBIEpTIG1hcCBmcm9tIG1hbmdsZWQgZ2xvYmFsIG5hbWVzIHRvIHRoZWlyIHVubWFuZ2xlZCBuYW1lcy4KLy8vCi8vLyBJZiB0aGUgcHJvZ3JhbSBkb2VzIG5vdCB1c2UgcmVmbGVjdGlvbiwgdGhpcyBlbWJlZGRlZCBnbG9iYWwgbWF5IGJlIGVtcHR5Ci8vLyAoYnV0IG5vdCBudWxsIG9yIHVuZGVmaW5lZCkuCmNvbnN0IE1BTkdMRURfR0xPQkFMX05BTUVTID0gJ21hbmdsZWRHbG9iYWxOYW1lcyc7CgovLy8gQSBKUyBtYXAgZnJvbSBtYW5nbGVkIGluc3RhbmNlIG5hbWVzIHRvIHRoZWlyIHVubWFuZ2xlZCBuYW1lcy4KLy8vCi8vLyBUaGlzIGVtYmVkZGVkIGdsb2JhbCBpcyBtYWlubHkgdXNlZCBmb3IgcmVmbGVjdGlvbiwgYnV0IGlzIGFsc28gdXNlZCB0bwovLy8gbWFwIGNvbnN0LXN5bWJvbHMgKGBjb25zdCBTeW1ib2woJ3gnKWApIHRvIHRoZSBtYW5nbGVkIGluc3RhbmNlIG5hbWVzLgovLy8KLy8vIFRoaXMgZW1iZWRkZWQgZ2xvYmFsIG1heSBiZSBlbXB0eSAoYnV0IG5vdCBudWxsIG9yIHVuZGVmaW5lZCkuCmNvbnN0IE1BTkdMRURfTkFNRVMgPSAnbWFuZ2xlZE5hbWVzJzsKCi8vLyBBIEpTIG1hcCBmcm9tIGRpc3BhdGNoIHRhZ3MgKHVzdWFsbHkgY29uc3RydWN0b3IgbmFtZXMgb2YgRE9NIGNsYXNzZXMpIHRvCi8vLyBpbnRlcmNlcHRvciBjbGFzcy4gVGhpcyBtYXAgaXMgdXNlZCB0byBmaW5kIHRoZSBjb3JyZWN0IGludGVyY2VwdG9yIGZvcgovLy8gbmF0aXZlIGNsYXNzZXMuCi8vLwovLy8gVGhpcyBlbWJlZGRlZCBnbG9iYWwgaXMgdXNlZCBmb3IgbmF0aXZlcy4KY29uc3QgSU5URVJDRVBUT1JTX0JZX1RBRyA9ICdpbnRlcmNlcHRvcnNCeVRhZyc7CgovLy8gQSBKUyBtYXAgZnJvbSBkaXNwYXRjaCB0YWdzICh1c3VhbGx5IGNvbnN0cnVjdG9yIG5hbWVzIG9mIERPTSBjbGFzc2VzKSB0bwovLy8gYm9vbGVhbnMuIEV2ZXJ5IHRhZyBlbnRyeSBvZiBbSU5URVJDRVBUT1JTX0JZX1RBR10gaGFzIGEgY29ycmVzcG9uZGluZwovLy8gZW50cnkgaW4gdGhlIGxlYWYtdGFncyBtYXAuCi8vLwovLy8gQSB0YWctZW50cnkgaXMgdHJ1ZSwgd2hlbiBhIGNsYXNzIGNhbiBiZSB0cmVhdGVkIGFzIGxlYWYgY2xhc3MgaW4gdGhlCi8vLyBoaWVyYXJjaHkuIFRoYXQgaXMsIGV2ZW4gdGhvdWdoIGl0IG1pZ2h0IGhhdmUgc3ViY2xhc3NlcywgYWxsIHN1YmNsYXNzZXMKLy8vIGhhdmUgdGhlIHNhbWUgY29kZSBmb3IgdGhlIHVzZWQgbWV0aG9kcy4KLy8vCi8vLyBUaGlzIGVtYmVkZGVkIGdsb2JhbCBpcyB1c2VkIGZvciBuYXRpdmVzLgpjb25zdCBMRUFGX1RBR1MgPSAnbGVhZlRhZ3MnOwoKLy8vIEEgSlMgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBpc29sYXRlIHRhZyBmb3IgYSBnaXZlbiBuYW1lLgovLy8KLy8vIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgW0lTT0xBVEVfVEFHXSAoYmVsb3cpIHRvIGNvbnN0cnVjdCBhIG5hbWUgdGhhdCBpcwovLy8gdW5pcXVlIHBlciBpc29sYXRlLgovLy8KLy8vIFRoaXMgZW1iZWRkZWQgZ2xvYmFsIGlzIHVzZWQgZm9yIG5hdGl2ZXMuCi8vIFRPRE8oZmxvaXRzY2gpOiBzaG91bGQgd2UgcmVuYW1lIHRoaXMgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW9uIHdpdGgKLy8gICAgW0lOVEVSQ0VQVE9SU19CWV9UQUddIGFuZCBbTEVBRl9UQUdTXS4KY29uc3QgR0VUX0lTT0xBVEVfVEFHID0gJ2dldElzb2xhdGVUYWcnOwoKLy8vIEEgc3RyaW5nIHRoYXQgaXMgZGlmZmVyZW50IGZvciBlYWNoIHJ1bm5pbmcgaXNvbGF0ZS4KLy8vCi8vLyBXaGVuIHRoaXMgZW1iZWRkZWQgZ2xvYmFsIGlzIGluaXRpYWxpemVkIGEgZ2xvYmFsIHZhcmlhYmxlIGlzIHVzZWQgdG8KLy8vIGVuc3VyZSB0aGF0IG5vIG90aGVyIHJ1bm5pbmcgaXNvbGF0ZSB1c2VzIHRoZSBzYW1lIGlzb2xhdGUtdGFnIHN0cmluZy4KLy8vCi8vLyBUaGlzIGVtYmVkZGVkIGdsb2JhbCBpcyB1c2VkIGZvciBuYXRpdmVzLgovLyBUT0RPKGZsb2l0c2NoKTogc2hvdWxkIHdlIHJlbmFtZSB0aGlzIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2lvbiB3aXRoCi8vICAgIFtJTlRFUkNFUFRPUlNfQllfVEFHXSBhbmQgW0xFQUZfVEFHU10uCmNvbnN0IElTT0xBVEVfVEFHID0gJ2lzb2xhdGVUYWcnOwoKLy8vIFRoaXMgZW1iZWRkZWQgZ2xvYmFsIChhIGZ1bmN0aW9uKSByZXR1cm5zIHRoZSBpc29sYXRlLXNwZWNpZmljIGRpc3BhdGNoLXRhZwovLy8gdGhhdCBpcyB1c2VkIHRvIGFjY2VsZXJhdGUgaW50ZXJjZXB0b3IgY2FsbHMuCmNvbnN0IERJU1BBVENIX1BST1BFUlRZX05BTUUgPSAiZGlzcGF0Y2hQcm9wZXJ0eU5hbWUiOwoKLy8vIEFuIGVtYmVkZGVkIGdsb2JhbCB0aGF0IG1hcHMgYSBbVHlwZV0gdG8gdGhlIFtJbnRlcmNlcHRvcl0gYW5kIGNvbnN0cnVjdG9ycwovLy8gZm9yIHRoYXQgdHlwZS4KLy8vCi8vLyBNb3JlIGRvY3VtZW50YXRpb24gY2FuIGJlIGZvdW5kIGluIHRoZSBpbnRlcmNlcHRvcnMgbGlicmFyeSAoY2xvc2UgdG8gaXRzCi8vLyB1c2UpLgpjb25zdCBUWVBFX1RPX0lOVEVSQ0VQVE9SX01BUCA9ICJ0eXBlVG9JbnRlcmNlcHRvck1hcCI7CgovLy8gVGhlIGN1cnJlbnQgc2NyaXB0J3MgVVJJIHdoZW4gdGhlIHByb2dyYW0gd2FzIGxvYWRlZC4KLy8vCi8vLyBUaGlzIGVtYmVkZGVkIGdsb2JhbCBpcyBzZXQgYXQgc3RhcnR1cCwganVzdCBiZWZvcmUgaW52b2tpbmcgYG1haW5gLgpjb25zdCBDVVJSRU5UX1NDUklQVCA9ICdjdXJyZW50U2NyaXB0JzsKCi8vLyBDb250YWlucyBhIG1hcCBmcm9tIGxvYWQtaWRzIHRvIGxpc3RzIG9mIHBhcnQgaW5kZXhlcy4KLy8vCi8vLyBUbyBsb2FkIHRoZSBkZWZlcnJlZCBsaWJyYXJ5IHRoYXQgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIGxvYWQtaWQsIHRoZSBydW50aW1lCi8vLyBtdXN0IGxvYWQgYWxsIGFzc29jaWF0ZWQgVVJJcyAobmFtZWQgaW4gREVGRVJSRURfUEFSVF9VUklTKSBhbmQgaW5pdGlhbGl6ZQovLy8gYWxsIHRoZSBsb2FkZWQgaHVua3MgKERFRkVSUkVEX1BBUlRfSEFTSEVTKS4KLy8vCi8vLyBUaGlzIGVtYmVkZGVkIGdsb2JhbCBpcyBvbmx5IHVzZWQgZm9yIGRlZmVycmVkIGxvYWRpbmcuCmNvbnN0IERFRkVSUkVEX0xJQlJBUllfUEFSVFMgPSAnZGVmZXJyZWRMaWJyYXJ5UGFydHMnOwoKLy8vIENvbnRhaW5zIGEgbGlzdCBvZiBVUklzIChTdHJpbmdzKSwgaW5kZXhlZCBieSBwYXJ0LgovLy8KLy8vIFRoZSBsaXN0cyBpbiB0aGUgREVGRVJSRURfTElCUkFSWV9QQVJUUyBtYXAgY29udGFpbiBpbmRleGVzIGludG8gdGhpcyBsaXN0LgovLy8KLy8vIFRoaXMgZW1iZWRkZWQgZ2xvYmFsIGlzIG9ubHkgdXNlZCBmb3IgZGVmZXJyZWQgbG9hZGluZy4KY29uc3QgREVGRVJSRURfUEFSVF9VUklTID0gJ2RlZmVycmVkUGFydFVyaXMnOwoKLy8vIENvbnRhaW5zIGEgbGlzdCBvZiBoYXNoZXMsIGluZGV4ZWQgYnkgcGFydC4KLy8vCi8vLyBUaGUgbGlzdHMgaW4gdGhlIERFRkVSUkVEX0xJQlJBUllfUEFSVFMgbWFwIGNvbnRhaW4gaW5kZXhlcyBpbnRvIHRoaXMgbGlzdC4KLy8vCi8vLyBUaGUgaGFzaGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIFVSSXMgb2YgdGhlIGxvYWQtaWRzIChzZWUKLy8vIFtERUZFUlJFRF9QQVJUX1VSSVNdKS4gVGhleSBhcmUgU0hBMSAob3Igc2ltaWxhcikgaGFzaGVzIG9mIHRoZSBjb2RlIHRoYXQKLy8vIG11c3QgYmUgbG9hZGVkLiBCeSB1c2luZyBjcnlwdG9ncmFwaGljIGhhc2hlcyB3ZSBjYW4gKDEpIGhhbmRsZSBsb2FkaW5nIGluCi8vLyB0aGUgc2FtZSB3ZWIgcGFnZSB0aGUgcGFydHMgZnJvbSBtdWx0aXBsZSBEYXJ0IGFwcGxpY2F0aW9ucyAoMikgYXZvaWQKLy8vIGxvYWRpbmcgc2ltaWxhciBjb2RlIG11bHRpcGxlIHRpbWVzLgovLy8KLy8vIFRoaXMgZW1iZWRkZWQgZ2xvYmFsIGlzIG9ubHkgdXNlZCBmb3IgZGVmZXJyZWQgbG9hZGluZy4KY29uc3QgREVGRVJSRURfUEFSVF9IQVNIRVMgPSAnZGVmZXJyZWRQYXJ0SGFzaGVzJzsKCi8vLyBJbml0aWFsaXplIGEgbG9hZGVkIGh1bmsuCi8vLwovLy8gT25jZSBhIGh1bmsgKHRoZSBjb2RlIGZyb20gYSBkZWZlcnJlZCBVUkkpIGhhcyBiZWVuIGxvYWRlZCBpdCBtdXN0IGJlCi8vLyBpbml0aWFsaXplZC4gQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgaGFzaCAoc2VlCi8vLyBbREVGRVJSRURfTElCUkFSWV9IQVNIRVNdKSBpbml0aWFsaXplcyB0aGUgY29kZS4KLy8vCi8vLyBUaGlzIGVtYmVkZGVkIGdsb2JhbCBpcyBvbmx5IHVzZWQgZm9yIGRlZmVycmVkIGxvYWRpbmcuCmNvbnN0IElOSVRJQUxJWkVfTE9BREVEX0hVTksgPSAnaW5pdGlhbGl6ZUxvYWRlZEh1bmsnOwoKLy8vIFJldHVybnMsIHdoZXRoZXIgYSBodW5rIChpZGVudGlmaWVkIGJ5IGl0cyBoYXNoKSBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZC4KLy8vCi8vLyBUaGlzIGVtYmVkZGVkIGdsb2JhbCBpcyBvbmx5IHVzZWQgZm9yIGRlZmVycmVkIGxvYWRpbmcuCmNvbnN0IElTX0hVTktfTE9BREVEID0gJ2lzSHVua0xvYWRlZCc7CgovLy8gUmV0dXJucywgd2hldGhlciBhIGh1bmsgKGlkZW50aWZpZWQgYnkgaXRzIGhhc2gpIGhhcyBhbHJlYWR5IGJlZW4KLy8vIGluaXRpYWxpemVkLgovLy8KLy8vIFRoaXMgZW1iZWRkZWQgZ2xvYmFsIGlzIG9ubHkgdXNlZCBmb3IgZGVmZXJyZWQgbG9hZGluZy4KY29uc3QgSVNfSFVOS19JTklUSUFMSVpFRCA9ICdpc0h1bmtJbml0aWFsaXplZCc7CgovLy8gQSBzZXQgKGltcGxlbWVudGVkIGFzIG1hcCB0byBib29sZWFucykgb2YgaHVua3MgKGlkZW50aWZpZWQgYnkgaGFzaGVzKSB0aGF0Ci8vLyBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLy8vCi8vLyBUaGlzIGVtYmVkZGVkIGdsb2JhbCBpcyBvbmx5IHVzZWQgZm9yIGRlZmVycmVkIGxvYWRpbmcuCi8vLwovLy8gVGhpcyBnbG9iYWwgaXMgYW4gZW1pdHRlci1pbnRlcm5hbCBlbWJlZGRlZCBnbG9iYWwsIGFuZCBub3QgdXNlZCBieSB0aGUKLy8vIHJ1bnRpbWUuIFRoZSBjb25zdGFudCByZW1haW5zIGluIHRoaXMgZmlsZSB0byBtYWtlIHN1cmUgdGhhdCBvdGhlciBlbWJlZGRlZAovLy8gZ2xvYmFscyBkb24ndCBjbGFzaCB3aXRoIGl0Lgpjb25zdCBERUZFUlJFRF9JTklUSUFMSVpFRCA9ICdkZWZlcnJlZEluaXRpYWxpemVkJzsKCi8vLyBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFsbCBwcmVjb21waWxlZCBmdW5jdGlvbnMgKGluIHBhcnRpY3VsYXIKLy8vIGNvbnN0cnVjdG9ycykuCi8vLwovLy8gVGhhdCBpcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFycmF5IHRoYXQgdGhlIGZ1bGwgZW1pdHRlciB3b3VsZAovLy8gb3RoZXJ3aXNlIGJ1aWxkIGR5bmFtaWNhbGx5IHdoZW4gaXQgZmluaXNoZXMgYWxsIGNsYXNzZXMuCi8vLwovLy8gVGhpcyBjb25zdGFudCBpcyBvbmx5IHVzZWQgaW4gQ1NQIG1vZGUuCi8vLwovLy8gVGhpcyBnbG9iYWwgaXMgYW4gZW1pdHRlci1pbnRlcm5hbCBlbWJlZGRlZCBnbG9iYWwsIGFuZCBub3QgdXNlZCBieSB0aGUKLy8vIHJ1bnRpbWUuIFRoZSBjb25zdGFudCByZW1haW5zIGluIHRoaXMgZmlsZSB0byBtYWtlIHN1cmUgdGhhdCBvdGhlciBlbWJlZGRlZAovLy8gZ2xvYmFscyBkb24ndCBjbGFzaCB3aXRoIGl0Lgpjb25zdCBQUkVDT01QSUxFRCA9ICdwcmVjb21waWxlZCc7CgovLy8gQW4gZW1pdHRlci1pbnRlcm5hbCBlbWJlZGRlZCBnbG9iYWwuIFRoaXMgZ2xvYmFsIGlzIG5vdCB1c2VkIGJ5IHRoZSBydW50aW1lLgpjb25zdCBGSU5JU0hFRF9DTEFTU0VTID0gJ2ZpbmlzaGVkQ2xhc3Nlcyc7CgovLy8gQSBKYXZhU2NyaXB0IG9iamVjdCBsaXRlcmFsIHRoYXQgbWFwcyB0aGUgKG1pbmlmaWVkKSBKYXZhU2NyaXB0IGNvbnN0cnVjdG9yCi8vLyBuYW1lIChhcyBnaXZlbiBieSBbSnNCdWlsdGluLnJhd1J0aVRvSnNDb25zdHJ1Y3Rvck5hbWVdIHRvIHRoZQovLy8gSmF2YVNjcmlwdCBjb25zdHJ1Y3Rvci4KLy8vCi8vLyBUaGlzIGVtYmVkZGVkIGdsb2JhbCBpcyBvbmx5IHVzZWQgYnkgcmVmbGVjdGlvbi4KY29uc3QgQUxMX0NMQVNTRVMgPSAnYWxsQ2xhc3Nlcyc7CgovLy8gQSBtYXAgZnJvbSBlbGVtZW50IHRvIHR5cGUgaW5mb3JtYXRpb24uCi8vLwovLy8gVGhpcyBlbWJlZGRlZCBnbG9iYWwgaXMgb25seSB1c2VkIGJ5IHJlZmxlY3Rpb24uCmNvbnN0IFRZUEVfSU5GT1JNQVRJT04gPSAndHlwZUluZm9ybWF0aW9uJzsKCi8vLyBBIG1hcCBmcm9tIHN0YXRpY3MgdG8gdGhlaXIgZGVzY3JpcHRvcnMuCi8vLwovLy8gVGhpcyBlbWJlZGRlZCBnbG9iYWwgaXMgb25seSB1c2VkIGJ5IHJlZmxlY3Rpb24uCmNvbnN0IFNUQVRJQ1MgPSAnc3RhdGljcyc7CgovLy8gQW4gYXJyYXkgb2YgbGlicmFyeSBkZXNjcmlwdG9ycy4KLy8vCi8vLyBUaGUgZGVzY3JpcHRvciBjb250YWlucyBpbmZvcm1hdGlvbiBzdWNoIGFzIG5hbWUsIHVyaSwgY2xhc3NlcywgLi4uCi8vLwovLy8gVGhpcyBlbWJlZGRlZCBnbG9iYWwgaXMgb25seSB1c2VkIGJ5IHJlZmxlY3Rpb24uCmNvbnN0IExJQlJBUklFUyA9ICdsaWJyYXJpZXMnOwoKLy8vIEEgbWFwIGZyb20gbGF6eSBzdGF0aWNzIHRvIHRoZWlyIGluaXRpYWxpemVycy4KLy8vCi8vLyBUaGlzIGVtYmVkZGVkIGdsb2JhbCBpcyBvbmx5IHVzZWQgYnkgcmVmbGVjdGlvbi4KY29uc3QgTEFaSUVTID0gJ2xhemllcyc7CgovLy8gTmFtZXMgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IFtKU19HRVRfTkFNRV0uCi8vIFRPRE8oaGVyaHV0KTogTWFrZSBlbnRyaWVzIGxvd2VyIGNhc2UgKGFzIGluIGZpZWxkcykgYW5kIGZpbmQgYSBiZXR0ZXIgbmFtZS4KZW51bSBKc0dldE5hbWUgewogIEdFVFRFUl9QUkVGSVgsCiAgU0VUVEVSX1BSRUZJWCwKICBDQUxMX1BSRUZJWCwKICBDQUxMX1BSRUZJWDAsCiAgQ0FMTF9QUkVGSVgxLAogIENBTExfUFJFRklYMiwKICBDQUxMX1BSRUZJWDMsCiAgQ0FMTF9QUkVGSVg0LAogIENBTExfUFJFRklYNSwKICBDQUxMX0NBVENIX0FMTCwKICBSRUZMRUNUQUJMRSwKICBDTEFTU19ERVNDUklQVE9SX1BST1BFUlRZLAogIFJFUVVJUkVEX1BBUkFNRVRFUl9QUk9QRVJUWSwKICBERUZBVUxUX1ZBTFVFU19QUk9QRVJUWSwKICBDQUxMX05BTUVfUFJPUEVSVFksCiAgREVGRVJSRURfQUNUSU9OX1BST1BFUlRZLAoKICAvLy8gUHJlZml4IHVzZWQgZm9yIGdlbmVyYXRlZCB0eXBlIGFyZ3VtZW50IHN1YnN0aXR1dGlvbnMgb24gY2xhc3Nlcy4KICBPUEVSQVRPUl9BU19QUkVGSVgsCgogIC8vLyBOYW1lIHVzZWQgZm9yIGdlbmVyYXRlZCBmdW5jdGlvbiB0eXBlcyBvbiBjbGFzc2VzIGFuZCBtZXRob2RzLgogIFNJR05BVFVSRV9OQU1FLAoKICAvLy8gTmFtZSBvZiBKYXZhU2NyaXB0IHByb3BlcnR5IHVzZWQgdG8gc3RvcmUgcnVudGltZS10eXBlIGluZm9ybWF0aW9uIG9uCiAgLy8vIGluc3RhbmNlcyBvZiBwYXJhbWV0ZXJpemVkIGNsYXNzZXMuCiAgUlRJX05BTUUsCgogIC8vLyBOYW1lIHVzZWQgdG8gdGFnIHR5cGVkZWZzLgogIFRZUEVERUZfVEFHLAoKICAvLy8gTmFtZSB1c2VkIHRvIHRhZyBhIGZ1bmN0aW9uIHR5cGUuCiAgRlVOQ1RJT05fVFlQRV9UQUcsCgogIC8vLyBOYW1lIHVzZWQgdG8gdGFnIGJvdW5kcyBvZiBhIGdlbmVyaWMgZnVuY3Rpb24gdHlwZS4gSWYgYm91bmRzIGFyZSBwcmVzZW50LAogIC8vLyB0aGUgcHJvcGVydHkgdmFsdWUgaXMgYW4gQXJyYXkgb2YgYm91bmRzICh0aGUgbGVuZ3RoIGdpdmVzIHRoZSBudW1iZXIgb2YKICAvLy8gdHlwZSBwYXJhbWV0ZXJzKS4gSWYgYWJzZW50LCB0aGUgdHlwZSBpcyBub3QgYSBnZW5lcmljIGZ1bmN0aW9uIHR5cGUuCiAgRlVOQ1RJT05fVFlQRV9HRU5FUklDX0JPVU5EU19UQUcsCgogIC8vLyBOYW1lIHVzZWQgdG8gdGFnIHZvaWQgcmV0dXJuIGluIGZ1bmN0aW9uIHR5cGUgcmVwcmVzZW50YXRpb25zIGluCiAgLy8vIEphdmFTY3JpcHQuCiAgRlVOQ1RJT05fVFlQRV9WT0lEX1JFVFVSTl9UQUcsCgogIC8vLyBOYW1lIHVzZWQgdG8gdGFnIHJldHVybiB0eXBlcyBpbiBmdW5jdGlvbiB0eXBlIHJlcHJlc2VudGF0aW9ucyBpbgogIC8vLyBKYXZhU2NyaXB0LgogIEZVTkNUSU9OX1RZUEVfUkVUVVJOX1RZUEVfVEFHLAoKICAvLy8gTmFtZSB1c2VkIHRvIHRhZyByZXF1aXJlZCBwYXJhbWV0ZXJzIGluIGZ1bmN0aW9uIHR5cGUgcmVwcmVzZW50YXRpb25zCiAgLy8vIGluIEphdmFTY3JpcHQuCiAgRlVOQ1RJT05fVFlQRV9SRVFVSVJFRF9QQVJBTUVURVJTX1RBRywKCiAgLy8vIE5hbWUgdXNlZCB0byB0YWcgb3B0aW9uYWwgcGFyYW1ldGVycyBpbiBmdW5jdGlvbiB0eXBlIHJlcHJlc2VudGF0aW9ucwogIC8vLyBpbiBKYXZhU2NyaXB0LgogIEZVTkNUSU9OX1RZUEVfT1BUSU9OQUxfUEFSQU1FVEVSU19UQUcsCgogIC8vLyBOYW1lIHVzZWQgdG8gdGFnIG5hbWVkIHBhcmFtZXRlcnMgaW4gZnVuY3Rpb24gdHlwZSByZXByZXNlbnRhdGlvbnMgaW4KICAvLy8gSmF2YVNjcmlwdC4KICBGVU5DVElPTl9UWVBFX05BTUVEX1BBUkFNRVRFUlNfVEFHLAoKICAvLy8gTmFtZSB1c2VkIHRvIHRhZyBhIEZ1dHVyZU9yIHR5cGUuCiAgRlVUVVJFX09SX1RBRywKCiAgLy8vIE5hbWUgdXNlZCB0byB0YWcgdHlwZSBhcmd1bWVudHMgdHlwZXMgaW4gRnV0dXJlT3IgdHlwZSByZXByZXNlbnRhdGlvbnMgaW4KICAvLy8gSmF2YVNjcmlwdC4KICBGVVRVUkVfT1JfVFlQRV9BUkdVTUVOVF9UQUcsCgogIC8vLyBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHR5cGUgb2YgdGhlIEZ1dHVyZSBjbGFzcy4KICBGVVRVUkVfQ0xBU1NfVFlQRV9OQU1FLAoKICAvLy8gRmllbGQgbmFtZSB1c2VkIGZvciBkZXRlcm1pbmluZyBpZiBhbiBvYmplY3Qgb3IgaXRzIGludGVyY2VwdG9yIGhhcwogIC8vLyBKYXZhU2NyaXB0IGluZGV4aW5nIGJlaGF2aW9yLgogIElTX0lOREVYQUJMRV9GSUVMRF9OQU1FLAoKICAvLy8gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0eXBlIG9mIHRoZSBudWxsIGNsYXNzLgogIE5VTExfQ0xBU1NfVFlQRV9OQU1FLAoKICAvLy8gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgY2xhc3MuCiAgT0JKRUNUX0NMQVNTX1RZUEVfTkFNRSwKCiAgLy8vIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24gY2xhc3MuCiAgRlVOQ1RJT05fQ0xBU1NfVFlQRV9OQU1FLAp9CgplbnVtIEpzQnVpbHRpbiB7CiAgLy8vIFJldHVybnMgdGhlIEphdmFTY3JpcHQgY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIERhcnQncyBPYmplY3QgY2xhc3MuCiAgLy8vIFRoaXMgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdHMsIGFzIGluCiAgLy8vCiAgLy8vICAgICB2YXIgY29uc3RydWN0b3IgPSBKU19CVUlMVElOKCcnLCBKc0J1aWx0aW4uZGFydE9iamVjdENvbnN0cnVjdG9yKTsKICAvLy8gICAgIGlmIChKUygnYm9vbCcsICcjIGluc3RhbmNlb2YgIycsIG9iaiwgY29uc3RydWN0b3IpKQogIC8vLyAgICAgICAuLi4KICBkYXJ0T2JqZWN0Q29uc3RydWN0b3IsCgogIC8vLyBSZXR1cm5zIHRoZSBKYXZhU2NyaXB0LWNvbnN0cnVjdG9yIG5hbWUgZ2l2ZW4gYW4gW2lzQ2hlY2tQcm9wZXJ0eV0uCiAgLy8vCiAgLy8vIFRoaXMgcmVsaWVzIG9uIGEgZGV0ZXJtaW5pc3RpYyBlbmNvZGluZyBvZiBpcy1jaGVjayBwcm9wZXJ0aWVzIChmb3IKICAvLy8gZXhhbXBsZSBgJGlzRm9vYCBmb3IgYSBjbGFzcyBgRm9vYCkuIEluIG1pbmlmaWVkIGNvZGUgdGhlIHJldHVybmVkCiAgLy8vIGNsYXNzbmFtZSBpcyB0aGUgbWluaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MuCiAgLy8vCiAgLy8vICAgICBKU19CVUlMVElOKCdyZXR1cm5zOlN0cmluZztkZXBlbmRzOm5vbmU7ZWZmZWN0czpub25lJywKICAvLy8gICAgICAgICAgICAgICAgSnNCdWlsdGluLmlzQ2hlY2tQcm9wZXJ0eVRvSnNDb25zdHJ1Y3Rvck5hbWUsCiAgLy8vICAgICAgICAgICAgICAgIGlzQ2hlY2tQcm9wZXJ0eSk7CiAgaXNDaGVja1Byb3BlcnR5VG9Kc0NvbnN0cnVjdG9yTmFtZSwKCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdHlwZSBpcyBhIGZ1bmN0aW9uIHR5cGUuIFJldHVybnMgZmFsc2UgZm9yCiAgLy8vIHRoZSBvbmUgYEZ1bmN0aW9uYCB0eXBlIHNpbmdsZXRvbi4gKFNlZSBbaXNGdW5jdGlvblR5cGVTaW5nbGV0b25dKS4KICAvLy8KICAvLy8gICAgIEpTX0JVSUxUSU4oJ2Jvb2wnLCBKc0J1aWx0aW4uaXNGdW5jdGlvblR5cGUsIG8pCiAgaXNGdW5jdGlvblR5cGUsCgogIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHR5cGUgaXMgYSBGdXR1cmVPciB0eXBlLgogIC8vLwogIC8vLyAgICAgSlNfQlVJTFRJTignYm9vbCcsIEpzQnVpbHRpbi5pc0Z1dHVyZU9yVHlwZSwgbykKICBpc0Z1dHVyZU9yVHlwZSwKCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdHlwZSBpcyB0aGUgYHZvaWRgIHR5cGUuCiAgLy8vCiAgLy8vICAgICBKU19CVUlMVElOKCdib29sJywgSnNCdWlsdGluLmlzVm9pZFR5cGUsIG8pCiAgaXNWb2lkVHlwZSwKCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdHlwZSBpcyB0aGUgYGR5bmFtaWNgIHR5cGUuCiAgLy8vCiAgLy8vICAgICBKU19CVUlMVElOKCdib29sJywgSnNCdWlsdGluLmlzRHluYW1pY1R5cGUsIG8pCiAgaXNEeW5hbWljVHlwZSwKCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdHlwZSBpcyBhIHR5cGUgYXJndW1lbnQgb2YgYSBqcy1pbnRlcm9wIGNsYXNzCiAgLy8vIG9yIGEgc3VwZXJ0eXBlIG9mIGEganMtaW50ZXJvcCBjbGFzcy4KICAvLy8KICAvLy8gICAgIEpTX0JVSUxUSU4oJ2Jvb2wnLCBKc0J1aWx0aW4uaXNKc0ludGVyb3BUeXBlQXJndW1lbnQsIG8pCiAgaXNKc0ludGVyb3BUeXBlQXJndW1lbnQsCgogIC8vLyBSZXR1cm5zIHRoZSBKYXZhU2NyaXB0LWNvbnN0cnVjdG9yIG5hbWUgZ2l2ZW4gYW4gcnRpIGVuY29kaW5nLgogIC8vLwogIC8vLyAgICAgSlNfQlVJTFRJTignU3RyaW5nJywgSnNCdWlsdGluLnJhd1J0aVRvSnNDb25zdHJ1Y3Rvck5hbWUsIHJ0aSkKICByYXdSdGlUb0pzQ29uc3RydWN0b3JOYW1lLAoKICAvLy8gUmV0dXJucyB0aGUgcmF3IHJ1bnRpbWUgdHlwZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LiBUaGUgZ2l2ZW4gYXJndW1lbnQKICAvLy8gW29dIHNob3VsZCBiZSB0aGUgaW50ZXJjZXB0b3IgKGZvciBub24tRGFydCBvYmplY3RzKS4KICAvLy8KICAvLy8gICAgIEpTX0JVSUxUSU4oJycsIEpzQnVpbHRpbi5yYXdSdW50aW1lVHlwZSwgbykKICByYXdSdW50aW1lVHlwZSwKCiAgLy8vIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gdHlwZSBpcyBhIHN1YnR5cGUgb2Ygb3RoZXIuCiAgLy8vCiAgLy8vIFRoZSBhcmd1bWVudCBgb3RoZXJgIGlzIHRoZSBuYW1lIG9mIHRoZSBwb3RlbnRpYWwgc3VwZXJ0eXBlLiBJdCBpcwogIC8vLyBjb21wdXRlZCBieSBgcnVudGltZVR5cGVUb1N0cmluZ2A7CiAgLy8vCiAgLy8vICpUaGUgYG90aGVyYCBuYW1lIG11c3QgYmUgcGFzc2VkIGluIGJlZm9yZSB0aGUgYHR5cGVgLioKICAvLy8KICAvLy8gICAgIEpTX0JVSUxUSU4oJ3JldHVybnM6Ym9vbDtlZmZlY3RzOm5vbmU7ZGVwZW5kczpub25lJywKICAvLy8gICAgICAgICAgICAgICAgSnNCdWlsdGluLmlzU3VidHlwZSwgb3RoZXIsIHR5cGUpOwogIGlzU3VidHlwZSwKCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdHlwZSBlcXVhbHMgdGhlIHR5cGUgZ2l2ZW4gYXMgc2Vjb25kCiAgLy8vIGFyZ3VtZW50LiBVc2UgdGhlIEpTX0dFVF9OQU1FIGhlbHBlcnMgdG8gZ2V0IHRoZSB0eXBlIHJlcHJlc2VudGF0aW9uCiAgLy8vIGZvciB2YXJpb3VzIERhcnQgY2xhc3Nlcy4KICAvLy8KICAvLy8gICAgIEpTX0JVSUxUSU4oJ3JldHVybnM6Ym9vbDtlZmZlY3RzOm5vbmU7ZGVwZW5kczpub25lJywKICAvLy8gICAgICAgICAgICAgICAgSnNCdWlsdGluLmlzRnVuY3Rpb25UeXBlTGl0ZXJhbCwgdHlwZSwgbmFtZSk7CiAgaXNHaXZlblR5cGVSdGksCgogIC8vLyBSZXR1cm5zIHRoZSBtZXRhZGF0YSBvZiB0aGUgZ2l2ZW4gW2luZGV4XS4KICAvLy8KICAvLy8gICAgIEpTX0JVSUxUSU4oJ3JldHVybnM6dmFyO2VmZmVjdHM6bm9uZTtkZXBlbmRzOm5vbmUnLAogIC8vLyAgICAgICAgICAgICAgICBKc0J1aWx0aW4uZ2V0TWV0YWRhdGEsIGluZGV4KTsKICBnZXRNZXRhZGF0YSwKCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGdpdmVuIFtpbmRleF0uCiAgLy8vCiAgLy8vICAgICBKU19CVUlMVElOKCdyZXR1cm5zOnZhcjtlZmZlY3RzOm5vbmU7ZGVwZW5kczpub25lJywKICAvLy8gICAgICAgICAgICAgICAgSnNCdWlsdGluLmdldFR5cGUsIGluZGV4KTsKICBnZXRUeXBlLAp9CoGfAE5OPAFLDgRQIwRIIQFFBE5MKQRMIDgBSQ0ETkgETjgETCA0AUsXBEkSPAEzBE0+PAEyBEwMHQFLFARQFwFABEwrLgFBBE4hMwFDBExLBEMmAU5MFAQuMQFOSyAESk0tBC4eAUEETRgELkotKQE5BEpLBC5KLSIBUDI3AVATBE4KOAE6BEkoATsEUU8xBDw3ATgEUAQ8LwEwBFAEQU5PSikEPDMBHgRKSDUEPDcBTgQ8JwFGEQQ8MQFQIwQ8BExQITQBTRMESD4ELARMUCEjAVEsAVBDHAQ1IgEsBDUsAS0ENRsBJQRIBDUfATMENRkBL1AREREPEBAQEBAQEg8dHxsWHAFIFgFFEgFMKgwBIQ8BKBUBUU9MJAFHEiEBSBIhAUwVKQFMFSkBTBImASgRAVASHwE9GgFKJBsBOxgBPRoBPxwCARFLLQZNPhAZAUoGSkkzBkFDJyYBS0oGOhIBOQY6EgE5BjYOATwGOREBTiwGQxsBRQZJHQFLPAY2EgE8BkkpBj4GPzgNAUVLIAY/QxIBMQY+NA8BLQY+MAsCAS1wYWNrYWdlOmpzX3J1bnRpbWUvc2hhcmVkL2VtYmVkZGVkX25hbWVzLmRhcnQ6c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaW8vcG9zaXRpb25faW5mb3JtYXRpb24uZGFydMAArDUvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIFNvdXJjZSBpbmZvcm1hdGlvbiBzeXN0ZW0gbWFwcGluZyB0aGF0IGF0dGVtcHRzIGEgc2VtYW50aWMgbWFwcGluZyBiZXR3ZWVuCi8vLyBvZmZzZXRzIG9mIEphdmFTY3JpcHQgY29kZSBwb2ludHMgdG8gb2Zmc2V0cyBvZiBEYXJ0IGNvZGUgcG9pbnRzLgoKbGlicmFyeSBkYXJ0MmpzLnNvdXJjZV9pbmZvcm1hdGlvbi5wb3NpdGlvbjsKCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIGFzIGpzOwppbXBvcnQgJy4uL2pzL2pzX2RlYnVnLmRhcnQnOwppbXBvcnQgJy4uL2pzL2pzX3NvdXJjZV9tYXBwaW5nLmRhcnQnOwppbXBvcnQgJ2NvZGVfb3V0cHV0LmRhcnQnIHNob3cgQnVmZmVyZWRDb2RlT3V0cHV0OwppbXBvcnQgJ3NvdXJjZV9pbmZvcm1hdGlvbi5kYXJ0JzsKCi8vLyBbU291cmNlSW5mb3JtYXRpb25dIHRoYXQgY29uc2lzdHMgb2YgYW4gb2Zmc2V0IHBvc2l0aW9uIGludG8gdGhlIHNvdXJjZQovLy8gY29kZS4KY2xhc3MgUG9zaXRpb25Tb3VyY2VJbmZvcm1hdGlvbiBleHRlbmRzIFNvdXJjZUluZm9ybWF0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTb3VyY2VMb2NhdGlvbiBzdGFydFBvc2l0aW9uOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTb3VyY2VMb2NhdGlvbiBpbm5lclBvc2l0aW9uOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBMaXN0PEZyYW1lQ29udGV4dD4gaW5saW5pbmdDb250ZXh0OwoKICBQb3NpdGlvblNvdXJjZUluZm9ybWF0aW9uKAogICAgICB0aGlzLnN0YXJ0UG9zaXRpb24sIHRoaXMuaW5uZXJQb3NpdGlvbiwgdGhpcy5pbmxpbmluZ0NvbnRleHQpOwoKICBAb3ZlcnJpZGUKICBMaXN0PFNvdXJjZUxvY2F0aW9uPiBnZXQgc291cmNlTG9jYXRpb25zIHsKICAgIExpc3Q8U291cmNlTG9jYXRpb24+IGxpc3QgPSA8U291cmNlTG9jYXRpb24+W107CiAgICBpZiAoc3RhcnRQb3NpdGlvbiAhPSBudWxsKSB7CiAgICAgIGxpc3QuYWRkKHN0YXJ0UG9zaXRpb24pOwogICAgfQogICAgaWYgKGlubmVyUG9zaXRpb24gIT0gbnVsbCkgewogICAgICBsaXN0LmFkZChpbm5lclBvc2l0aW9uKTsKICAgIH0KICAgIHJldHVybiBsaXN0OwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlU3BhbiBnZXQgc291cmNlU3BhbiB7CiAgICBTb3VyY2VMb2NhdGlvbiBsb2NhdGlvbiA9CiAgICAgICAgc3RhcnRQb3NpdGlvbiAhPSBudWxsID8gc3RhcnRQb3NpdGlvbiA6IGlubmVyUG9zaXRpb247CiAgICBVcmkgdXJpID0gbG9jYXRpb24uc291cmNlVXJpOwogICAgaW50IG9mZnNldCA9IGxvY2F0aW9uLm9mZnNldDsKICAgIHJldHVybiBuZXcgU291cmNlU3Bhbih1cmksIG9mZnNldCwgb2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgewogICAgcmV0dXJuIDB4N0ZGRkZGRkYgJgogICAgICAgIChzdGFydFBvc2l0aW9uLmhhc2hDb2RlICogMTcgKyBpbm5lclBvc2l0aW9uLmhhc2hDb2RlICogMTkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzISBQb3NpdGlvblNvdXJjZUluZm9ybWF0aW9uKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gc3RhcnRQb3NpdGlvbiA9PSBvdGhlci5zdGFydFBvc2l0aW9uICYmCiAgICAgICAgaW5uZXJQb3NpdGlvbiA9PSBvdGhlci5pbm5lclBvc2l0aW9uOwogIH0KCiAgLy8vIENyZWF0ZSBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNvdXJjZSBpbmZvcm1hdGlvbiB1c2luZyBbdXJpVGV4dF0KICAvLy8gYXMgdGhlIFVyaSByZXByZXNlbnRhdGlvbi4KICBTdHJpbmcgX2NvbXB1dGVUZXh0KFN0cmluZyB1cmlUZXh0KSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnJHVyaVRleHQ6Jyk7CiAgICAvLyBVc2UgMS1iYXNlZCBsaW5lL2NvbHVtbiBpbmZvIHRvIG1hdGNoIHVzdWFsIGRhcnQgdG9vbCBvdXRwdXQuCiAgICBpZiAoc3RhcnRQb3NpdGlvbiAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCdbJHtzdGFydFBvc2l0aW9uLmxpbmV9LCcKICAgICAgICAgICcke3N0YXJ0UG9zaXRpb24uY29sdW1ufV0nKTsKICAgIH0KICAgIGlmIChpbm5lclBvc2l0aW9uICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJy1bJHtpbm5lclBvc2l0aW9uLmxpbmV9LCcKICAgICAgICAgICcke2lubmVyUG9zaXRpb24uY29sdW1ufV0nKTsKICAgIH0KICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBzaG9ydFRleHQgewogICAgaWYgKHN0YXJ0UG9zaXRpb24gIT0gbnVsbCkgewogICAgICByZXR1cm4gX2NvbXB1dGVUZXh0KHN0YXJ0UG9zaXRpb24uc291cmNlVXJpLnBhdGhTZWdtZW50cy5sYXN0KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfY29tcHV0ZVRleHQoaW5uZXJQb3NpdGlvbi5zb3VyY2VVcmkucGF0aFNlZ21lbnRzLmxhc3QpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgaWYgKHN0YXJ0UG9zaXRpb24gIT0gbnVsbCkgewogICAgICByZXR1cm4gX2NvbXB1dGVUZXh0KCcke3N0YXJ0UG9zaXRpb24uc291cmNlVXJpfScpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9jb21wdXRlVGV4dCgnJHtpbm5lclBvc2l0aW9uLnNvdXJjZVVyaX0nKTsKICAgIH0KICB9Cn0KCmFic3RyYWN0IGNsYXNzIEFic3RyYWN0UG9zaXRpb25Tb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5CiAgICBpbXBsZW1lbnRzIEphdmFTY3JpcHRTb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5IHsKICBjb25zdCBBYnN0cmFjdFBvc2l0aW9uU291cmNlSW5mb3JtYXRpb25TdHJhdGVneSgpOwoKICBAb3ZlcnJpZGUKICBTb3VyY2VJbmZvcm1hdGlvblByb2Nlc3NvciBjcmVhdGVQcm9jZXNzb3IoCiAgICAgIFNvdXJjZU1hcHBlclByb3ZpZGVyIHByb3ZpZGVyLCBTb3VyY2VJbmZvcm1hdGlvblJlYWRlciByZWFkZXIpIHsKICAgIHJldHVybiBuZXcgUG9zaXRpb25Tb3VyY2VJbmZvcm1hdGlvblByb2Nlc3Nvcihwcm92aWRlciwgcmVhZGVyKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgb25Db21wbGV0ZSgpIHt9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkU291cmNlTWFwcGVkTWFya2VyKCkgewogICAgcmV0dXJuIGNvbnN0IFNvdXJjZU1hcHBlZE1hcmtlcigpOwogIH0KfQoKLy8vIE1hcmtlciB1c2VkIHRvIHRhZyB0aGUgcm9vdCBub2RlcyBvZiBzb3VyY2UtbWFwcGVkIGNvZGUuCi8vLwovLy8gVGhpcyBpcyBuZWVkZWQgdG8gYmUgYWJsZSB0byBkaXN0aW5ndWlzaCBKYXZhU2NyaXB0IG5vZGVzIHRoYXQgc2hvdWxkbid0Ci8vLyBoYXZlIHNvdXJjZSBsb2NhdGlvbnMgKGxpa2UgdGhlIHByZW1hYmxlKSBmcm9tIHRoZSBub2RlcyB0aGF0IHNob3VsZAovLy8gKGxpa2UgZnVuY3Rpb25zIGNvbXBpbGVkIGZyb20gRGFydCBjb2RlKS4KY2xhc3MgU291cmNlTWFwcGVkTWFya2VyIGV4dGVuZHMgU291cmNlSW5mb3JtYXRpb24gewogIGNvbnN0IFNvdXJjZU1hcHBlZE1hcmtlcigpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IHNob3J0VGV4dCA9PiAnJzsKCiAgQG92ZXJyaWRlCiAgTGlzdDxTb3VyY2VMb2NhdGlvbj4gZ2V0IHNvdXJjZUxvY2F0aW9ucyA9PiBjb25zdCA8U291cmNlTG9jYXRpb24+W107CgogIEBvdmVycmlkZQogIFNvdXJjZVNwYW4gZ2V0IHNvdXJjZVNwYW4gPT4gbmV3IFNvdXJjZVNwYW4obnVsbCwgbnVsbCwgbnVsbCk7Cn0KCi8vLyBUaGUgc3RhcnQsIGVuZCBhbmQgY2xvc2luZyBvZmZzZXRzIGZvciBhIFtqcy5Ob2RlXS4KY2xhc3MgQ29kZVBvc2l0aW9uIHsKICBmaW5hbCBpbnQgc3RhcnRQb3NpdGlvbjsKICBmaW5hbCBpbnQgZW5kUG9zaXRpb247CiAgZmluYWwgaW50IGNsb3NpbmdQb3NpdGlvbjsKCiAgQ29kZVBvc2l0aW9uKHRoaXMuc3RhcnRQb3NpdGlvbiwgdGhpcy5lbmRQb3NpdGlvbiwgdGhpcy5jbG9zaW5nUG9zaXRpb24pOwoKICAvLyBpZ25vcmU6IE1JU1NJTkdfUkVUVVJOCiAgaW50IGdldFBvc2l0aW9uKENvZGVQb3NpdGlvbktpbmQga2luZCkgewogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgQ29kZVBvc2l0aW9uS2luZC5TVEFSVDoKICAgICAgICByZXR1cm4gc3RhcnRQb3NpdGlvbjsKICAgICAgY2FzZSBDb2RlUG9zaXRpb25LaW5kLkVORDoKICAgICAgICByZXR1cm4gZW5kUG9zaXRpb247CiAgICAgIGNhc2UgQ29kZVBvc2l0aW9uS2luZC5DTE9TSU5HOgogICAgICAgIHJldHVybiBjbG9zaW5nUG9zaXRpb247CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gJ0NvZGVQb3NpdGlvbihzdGFydD0kc3RhcnRQb3NpdGlvbiwnCiAgICAgICAgJ2VuZD0kZW5kUG9zaXRpb24sY2xvc2luZz0kY2xvc2luZ1Bvc2l0aW9uKSc7CiAgfQp9CgovLy8gQSBtYXAgZnJvbSBhIFtqcy5Ob2RlXSB0byBpdHMgW0NvZGVQb3NpdGlvbl0uCmFic3RyYWN0IGNsYXNzIENvZGVQb3NpdGlvbk1hcCB7CiAgQ29kZVBvc2l0aW9uIG9wZXJhdG9yIFtdKGpzLk5vZGUgbm9kZSk7Cn0KCi8vLyBSZWdpc3RyeSBmb3IgbWFwcGluZyBbanMuTm9kZV1zIHRvIHRoZWlyIFtDb2RlUG9zaXRpb25dLgpjbGFzcyBDb2RlUG9zaXRpb25SZWNvcmRlciBpbXBsZW1lbnRzIENvZGVQb3NpdGlvbk1hcCB7CiAgTWFwPGpzLk5vZGUsIENvZGVQb3NpdGlvbj4gX2NvZGVQb3NpdGlvbk1hcCA9CiAgICAgIG5ldyBNYXA8anMuTm9kZSwgQ29kZVBvc2l0aW9uPi5pZGVudGl0eSgpOwoKICB2b2lkIHJlZ2lzdGVyUG9zaXRpb25zKAogICAgICBqcy5Ob2RlIG5vZGUsIGludCBzdGFydFBvc2l0aW9uLCBpbnQgZW5kUG9zaXRpb24sIGludCBjbG9zaW5nUG9zaXRpb24pIHsKICAgIHJlZ2lzdGVyQ29kZVBvc2l0aW9uKAogICAgICAgIG5vZGUsIG5ldyBDb2RlUG9zaXRpb24oc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24sIGNsb3NpbmdQb3NpdGlvbikpOwogIH0KCiAgdm9pZCByZWdpc3RlckNvZGVQb3NpdGlvbihqcy5Ob2RlIG5vZGUsIENvZGVQb3NpdGlvbiBjb2RlUG9zaXRpb24pIHsKICAgIF9jb2RlUG9zaXRpb25NYXBbbm9kZV0gPSBjb2RlUG9zaXRpb247CiAgfQoKICBAb3ZlcnJpZGUKICBDb2RlUG9zaXRpb24gb3BlcmF0b3IgW10oanMuTm9kZSBub2RlKSA9PiBfY29kZVBvc2l0aW9uTWFwW25vZGVdOwp9CgovLy8gRW51bSB2YWx1ZXMgZm9yIHRoZSBwYXJ0IG9mIGEgRGFydCBub2RlIHVzZWQgZm9yIHRoZSBzb3VyY2UgbG9jYXRpb24gb2Zmc2V0LgplbnVtIFNvdXJjZVBvc2l0aW9uS2luZCB7CiAgLy8vIFRoZSBzb3VyY2UgbWFwcGluZyBzaG91bGQgcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBEYXJ0IG5vZGUuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZSB0aGUgZmlyc3QgJygnIGZvciB0aGUgYCgqKSgpYCBjYWxsIGFuZCAnZicgb2YgYm90aCB0aGUKICAvLy8gYGZvbygpYCBhbmQgdGhlIGAqLmJhcigpYCBjYWxsOgogIC8vLwogIC8vLyAgICAgKGZvbygpLmJhcigpKSgpCiAgLy8vICAgICBeICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RhcnQgb2YgdGhlIGAoKikoKWAgbm9kZQogIC8vLyAgICAgIF4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YXJ0IG9mIHRoZSBgZm9vKClgIG5vZGUKICAvLy8gICAgICBeICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBvZiB0aGUgYCouYmFyKClgIG5vZGUKICAvLy8KICBTVEFSVCwKCiAgLy8vIFRoZSBzb3VyY2UgbWFwcGluZyBzaG91bGQgcG9pbnQgYW4gaW5uZXIgcG9zaXRpb24gb2YgdGhlIERhcnQgbm9kZS4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlIHRoZSBzZWNvbmQgJygnIG9mIHRoZSBgKCopKClgIGNhbGwsIHRoZSAnZicgb2YgdGhlIGBmb28oKWAKICAvLy8gY2FsbCBhbmQgdGhlICdiJyBvZiB0aGUgYCouYmFyKClgIGNhbGw6CiAgLy8vCiAgLy8vICAgICAoZm9vKCkuYmFyKCkpKCkKICAvLy8gICAgICAgICAgICAgICAgICBeICAgICAgICAgIC8vIHRoZSBpbm5lciBwb3NpdGlvbiBvZiB0aGUgYCgqKSgpYCBub2RlCiAgLy8vICAgICAgXiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5uZXIgcG9zaXRpb24gb2YgdGhlIGBmb28oKWAgbm9kZQogIC8vLyAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgLy8gdGhlIGlubmVyIHBvc2l0aW9uIG9mIHRoZSBgKi5iYXIoKWAgbm9kZQogIC8vLwogIC8vLyBGb3IgZnVuY3Rpb24gZXhwcmVzc2lvbnMgdGhlIGlubmVyIHBvc2l0aW9uIGlzIHRoZSBjbG9zaW5nIGJyYWNlIG9yIHRoZQogIC8vLyBhcnJvdzoKICAvLy8KICAvLy8gICAgIGZvbygpID0+ICgpIHt9CiAgLy8vICAgICAgICAgICBeICAgICAgICAgICAgICAgICAvLyB0aGUgaW5uZXIgcG9zaXRpb24gb2YgdGhlICdmb28nIGZ1bmN0aW9uCiAgLy8vICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAvLyB0aGUgaW5uZXIgcG9zaXRpb24gb2YgdGhlIGNsb3N1cmUKICAvLy8KICBJTk5FUiwKfQoKLy8gaWdub3JlOiBNSVNTSU5HX1JFVFVSTgpTb3VyY2VMb2NhdGlvbiBnZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiwKICAgIFtTb3VyY2VQb3NpdGlvbktpbmQgc291cmNlUG9zaXRpb25LaW5kID0gU291cmNlUG9zaXRpb25LaW5kLlNUQVJUXSkgewogIGlmIChzb3VyY2VJbmZvcm1hdGlvbiA9PSBudWxsKSByZXR1cm4gbnVsbDsKICBzd2l0Y2ggKHNvdXJjZVBvc2l0aW9uS2luZCkgewogICAgY2FzZSBTb3VyY2VQb3NpdGlvbktpbmQuU1RBUlQ6CiAgICAgIHJldHVybiBzb3VyY2VJbmZvcm1hdGlvbi5zdGFydFBvc2l0aW9uOwogICAgY2FzZSBTb3VyY2VQb3NpdGlvbktpbmQuSU5ORVI6CiAgICAgIHJldHVybiBzb3VyY2VJbmZvcm1hdGlvbi5pbm5lclBvc2l0aW9uID8/IHNvdXJjZUluZm9ybWF0aW9uLnN0YXJ0UG9zaXRpb247CiAgfQp9CgovLy8gRW51bSB2YWx1ZXMgZm9yIHRoZSBwYXJ0IG9mIHRoZSBKYXZhU2NyaXB0IG5vZGUgdXNlZCBmb3IgdGhlIEphdmFTY3JpcHQKLy8vIGNvZGUgb2Zmc2V0IG9mIGEgc291cmNlIG1hcHBpbmcuCmVudW0gQ29kZVBvc2l0aW9uS2luZCB7CiAgLy8vIFRoZSBzb3VyY2UgbWFwcGluZyBpcyBwdXQgb24gbGVmdC1tb3N0IG9mZnNldCBvZiB0aGUgbm9kZS4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlIG9uIHRoZSAnZicgb2YgYSBmdW5jdGlvbiBvciAncicgb2YgYSByZXR1cm4gc3RhdGVtZW50OgogIC8vLwogIC8vLyAgICAgZm9vOiBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH0KICAvLy8gICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmdW5jdGlvbiBzdGFydCBwb3NpdGlvbgogIC8vLyAgICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgLy8gdGhlIHJldHVybiBzdGFydCBwb3NpdGlvbgogIFNUQVJULAoKICAvLy8gVGhlIHNvdXJjZSBtYXBwaW5nIGlzIHB1dCBvbiB0aGUgY2xvc2luZyB0b2tlbi4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlIG9uIHRoZSAnfScgb2YgYSBmdW5jdGlvbiBvciB0aGUgJzsnIG9mIGEgcmV0dXJuIHN0YXRlbWVudDoKICAvLy8KICAvLy8gICAgIGZvbzogZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9CiAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAvLyB0aGUgZnVuY3Rpb24gY2xvc2luZyBwb3NpdGlvbgogIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICAgICAgICAgLy8gdGhlIHJldHVybiBjbG9zaW5nIHBvc2l0aW9uCiAgLy8vCiAgQ0xPU0lORywKCiAgLy8vIFRoZSBzb3VyY2UgbWFwcGluZyBpcyBwdXQgYXQgdGhlIGVuZCBvZiB0aGUgY29kZSBmb3IgdGhlIG5vZGUuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZSBhZnRlciAnfScgb2YgYSBmdW5jdGlvbiBvciBhZnRlciB0aGUgJzsnIG9mIGEgcmV0dXJuCiAgLy8vIHN0YXRlbWVudDoKICAvLy8KICAvLy8gICAgIGZvbzogZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9CiAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gICAgICAgLy8gdGhlIGZ1bmN0aW9uIGVuZCBwb3NpdGlvbgogIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgIC8vIHRoZSByZXR1cm4gZW5kIHBvc2l0aW9uCiAgLy8vCiAgRU5ELAp9CgovLy8gUHJvY2Vzc29yIHRoYXQgYXNzb2NpYXRlcyBbU291cmNlTG9jYXRpb25dcyBmcm9tIFtTb3VyY2VJbmZvcm1hdGlvbl0gb24KLy8vIFtqcy5Ob2RlXXMgd2l0aCB0aGUgdGFyZ2V0IG9mZnNldHMgaW4gYSBbU291cmNlTWFwcGVyXS4KY2xhc3MgUG9zaXRpb25Tb3VyY2VJbmZvcm1hdGlvblByb2Nlc3NvciBleHRlbmRzIFNvdXJjZUluZm9ybWF0aW9uUHJvY2Vzc29yIHsKICAvLy8gVGhlIGlkIGZvciB0aGlzIHNvdXJjZSBpbmZvcm1hdGlvbiBlbmdpbmUuCiAgLy8vCiAgLy8vIFRoZSBpZCBpcyBhZGRlZCB0byB0aGUgc291cmNlIG1hcCBmaWxlIGluIGFuIGV4dHJhICJlbmdpbmUiIHByb3BlcnR5IGFuZAogIC8vLyBzZXJ2ZXMgYXMgYSB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIGVuZ2luZS4KICAvLy8KICAvLy8gVGhlIHZlcnNpb24gaGlzdG9yeSBvZiB0aGlzIGVuZ2luZSBpczoKICAvLy8KICAvLy8gICB2MjogVGhlIGluaXRpYWwgdmVyc2lvbiB3aXRoIGFuIGlkLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgaWQgPSAndjInOwoKICBmaW5hbCBDb2RlUG9zaXRpb25SZWNvcmRlciBjb2RlUG9zaXRpb25SZWNvcmRlciA9IG5ldyBDb2RlUG9zaXRpb25SZWNvcmRlcigpOwogIGZpbmFsIFNvdXJjZUluZm9ybWF0aW9uUmVhZGVyIHJlYWRlcjsKICBDb2RlUG9zaXRpb25NYXAgY29kZVBvc2l0aW9uTWFwOwogIExpc3Q8VHJhY2VMaXN0ZW5lcj4gdHJhY2VMaXN0ZW5lcnM7CiAgSW5saW5pbmdUcmFjZUxpc3RlbmVyIGlubGluaW5nTGlzdGVuZXI7CgogIFBvc2l0aW9uU291cmNlSW5mb3JtYXRpb25Qcm9jZXNzb3IoU291cmNlTWFwcGVyUHJvdmlkZXIgcHJvdmlkZXIsIHRoaXMucmVhZGVyLAogICAgICBbQ292ZXJhZ2UgY292ZXJhZ2VdKSB7CiAgICBjb2RlUG9zaXRpb25NYXAgPSBjb3ZlcmFnZSAhPSBudWxsCiAgICAgICAgPyBuZXcgQ29kZVBvc2l0aW9uQ292ZXJhZ2UoY29kZVBvc2l0aW9uUmVjb3JkZXIsIGNvdmVyYWdlKQogICAgICAgIDogY29kZVBvc2l0aW9uUmVjb3JkZXI7CiAgICB2YXIgc291cmNlTWFwcGVyID0gcHJvdmlkZXIuY3JlYXRlU291cmNlTWFwcGVyKGlkKTsKICAgIHRyYWNlTGlzdGVuZXJzID0gWwogICAgICBuZXcgUG9zaXRpb25UcmFjZUxpc3RlbmVyKHNvdXJjZU1hcHBlciwgcmVhZGVyKSwKICAgICAgaW5saW5pbmdMaXN0ZW5lciA9IG5ldyBJbmxpbmluZ1RyYWNlTGlzdGVuZXIoc291cmNlTWFwcGVyLCByZWFkZXIpLAogICAgXTsKICAgIGlmIChjb3ZlcmFnZSAhPSBudWxsKSB7CiAgICAgIHRyYWNlTGlzdGVuZXJzLmFkZChuZXcgQ292ZXJhZ2VMaXN0ZW5lcihjb3ZlcmFnZSwgcmVhZGVyKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHByb2Nlc3MoanMuTm9kZSBub2RlLCBCdWZmZXJlZENvZGVPdXRwdXQgY29kZSkgewogICAgbmV3IEphdmFTY3JpcHRUcmFjZXIoY29kZVBvc2l0aW9uTWFwLCByZWFkZXIsIHRyYWNlTGlzdGVuZXJzKS5hcHBseShub2RlKTsKICAgIGlubGluaW5nTGlzdGVuZXI/LmZpbmlzaCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBvblBvc2l0aW9ucygKICAgICAganMuTm9kZSBub2RlLCBpbnQgc3RhcnRQb3NpdGlvbiwgaW50IGVuZFBvc2l0aW9uLCBpbnQgY2xvc2luZ1Bvc2l0aW9uKSB7CiAgICBjb2RlUG9zaXRpb25SZWNvcmRlci5yZWdpc3RlclBvc2l0aW9ucygKICAgICAgICBub2RlLCBzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbiwgY2xvc2luZ1Bvc2l0aW9uKTsKICB9Cn0KCi8vLyBWaXNpdG9yIHRoYXQgY29tcHV0ZXMgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgYSBbanMuTm9kZV0gdXNpbmcgaW5mb3JtYXRpb24KLy8vIGF0dGFjaGVkIHRvIHRoZSBub2RlIGl0c2VsZiBvciBhbHRlcm5hdGl2ZWx5IGZyb20gY2hpbGQgbm9kZXMuCmNsYXNzIE5vZGVTb3VyY2VJbmZvcm1hdGlvbiBleHRlbmRzIGpzLkJhc2VWaXNpdG9yPFNvdXJjZUluZm9ybWF0aW9uPiB7CiAgZmluYWwgU291cmNlSW5mb3JtYXRpb25SZWFkZXIgcmVhZGVyOwoKICBjb25zdCBOb2RlU291cmNlSW5mb3JtYXRpb24odGhpcy5yZWFkZXIpOwoKICBTb3VyY2VJbmZvcm1hdGlvbiB2aXNpdChqcy5Ob2RlIG5vZGUpID0+IG5vZGU/LmFjY2VwdCh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gdmlzaXROb2RlKGpzLk5vZGUgbm9kZSkgPT4KICAgICAgcmVhZGVyLmdldFNvdXJjZUluZm9ybWF0aW9uKG5vZGUpOwoKICBAb3ZlcnJpZGUKICBTb3VyY2VJbmZvcm1hdGlvbiB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoanMuRXhwcmVzc2lvblN0YXRlbWVudCBub2RlKSB7CiAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9IHJlYWRlci5nZXRTb3VyY2VJbmZvcm1hdGlvbihub2RlKTsKICAgIGlmIChzb3VyY2VJbmZvcm1hdGlvbiAhPSBudWxsKSB7CiAgICAgIHJldHVybiBzb3VyY2VJbmZvcm1hdGlvbjsKICAgIH0KICAgIHJldHVybiB2aXNpdChub2RlLmV4cHJlc3Npb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCgKICAgICAganMuVmFyaWFibGVEZWNsYXJhdGlvbkxpc3Qgbm9kZSkgewogICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPSByZWFkZXIuZ2V0U291cmNlSW5mb3JtYXRpb24obm9kZSk7CiAgICBpZiAoc291cmNlSW5mb3JtYXRpb24gIT0gbnVsbCkgewogICAgICByZXR1cm4gc291cmNlSW5mb3JtYXRpb247CiAgICB9CiAgICBmb3IgKGpzLk5vZGUgZGVjbGFyYXRpb24gaW4gbm9kZS5kZWNsYXJhdGlvbnMpIHsKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPSB2aXNpdChkZWNsYXJhdGlvbik7CiAgICAgIGlmIChzb3VyY2VJbmZvcm1hdGlvbiAhPSBudWxsKSB7CiAgICAgICAgcmV0dXJuIHNvdXJjZUluZm9ybWF0aW9uOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIHZpc2l0VmFyaWFibGVJbml0aWFsaXphdGlvbigKICAgICAganMuVmFyaWFibGVJbml0aWFsaXphdGlvbiBub2RlKSB7CiAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9IHJlYWRlci5nZXRTb3VyY2VJbmZvcm1hdGlvbihub2RlKTsKICAgIGlmIChzb3VyY2VJbmZvcm1hdGlvbiAhPSBudWxsKSB7CiAgICAgIHJldHVybiBzb3VyY2VJbmZvcm1hdGlvbjsKICAgIH0KICAgIHJldHVybiB2aXNpdChub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIHZpc2l0QXNzaWdubWVudChqcy5Bc3NpZ25tZW50IG5vZGUpIHsKICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0gcmVhZGVyLmdldFNvdXJjZUluZm9ybWF0aW9uKG5vZGUpOwogICAgaWYgKHNvdXJjZUluZm9ybWF0aW9uICE9IG51bGwpIHsKICAgICAgcmV0dXJuIHNvdXJjZUluZm9ybWF0aW9uOwogICAgfQogICAgcmV0dXJuIHZpc2l0KG5vZGUudmFsdWUpOwogIH0KfQoKLy8vIE1peGluIHRoYXQgYWRkIHN1cHBvcnQgZm9yIGNvbXB1dGluZyBbU291cmNlSW5mb3JtYXRpb25dIGZvciBhIFtqcy5Ob2RlXS4KYWJzdHJhY3QgY2xhc3MgTm9kZVRvU291cmNlSW5mb3JtYXRpb25NaXhpbiB7CiAgU291cmNlSW5mb3JtYXRpb25SZWFkZXIgZ2V0IHJlYWRlcjsKCiAgU291cmNlSW5mb3JtYXRpb24gY29tcHV0ZVNvdXJjZUluZm9ybWF0aW9uKGpzLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIG5ldyBOb2RlU291cmNlSW5mb3JtYXRpb24ocmVhZGVyKS52aXNpdChub2RlKTsKICB9Cn0KCi8vLyBbVHJhY2VMaXN0ZW5lcl0gdGhhdCByZWdpc3RlciBpbmxpbmluZyBjb250ZXh0LWRhdGEgd2l0aCBhIFtTb3VyY2VNYXBwZXJdLgpjbGFzcyBJbmxpbmluZ1RyYWNlTGlzdGVuZXIgZXh0ZW5kcyBUcmFjZUxpc3RlbmVyCiAgICB3aXRoIE5vZGVUb1NvdXJjZUluZm9ybWF0aW9uTWl4aW4gewogIGZpbmFsIFNvdXJjZU1hcHBlciBzb3VyY2VNYXBwZXI7CiAgQG92ZXJyaWRlCiAgZmluYWwgU291cmNlSW5mb3JtYXRpb25SZWFkZXIgcmVhZGVyOwogIGZpbmFsIE1hcDxpbnQsIExpc3Q8RnJhbWVDb250ZXh0Pj4gX2ZyYW1lcyA9IHt9OwoKICBJbmxpbmluZ1RyYWNlTGlzdGVuZXIodGhpcy5zb3VyY2VNYXBwZXIsIHRoaXMucmVhZGVyKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBvblN0ZXAoanMuTm9kZSBub2RlLCBPZmZzZXQgb2Zmc2V0LCBTdGVwS2luZCBraW5kKSB7CiAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9IGNvbXB1dGVTb3VyY2VJbmZvcm1hdGlvbihub2RlKTsKICAgIGlmIChzb3VyY2VJbmZvcm1hdGlvbiA9PSBudWxsKSByZXR1cm47CiAgICAvLyBUT0RPKHNpZ211bmQpOiBlbmFibGUgdGhpcyBhc3NlcnRpb24uCiAgICAvLyBhc3NlcnQob2Zmc2V0LnZhbHVlICE9IG51bGwsICJFeHBlY3RlZCBhIHZhbGlkIG9mZnNldDogJG5vZGUgJG9mZnNldCIpOwogICAgaWYgKG9mZnNldC52YWx1ZSA9PSBudWxsKSByZXR1cm47CgogICAgLy8gVE9ETyhzaWdtdW5kKTogZW5hYmxlIHRoaXMgYXNzZXJ0aW9uCiAgICAvL2Fzc2VydChfZnJhbWVzW29mZnNldC52YWx1ZV0gPT0gbnVsbCwKICAgIC8vICAgICAiRXhwZWN0IGEgc2luZ2xlIGVudHJ5IHBlciBvZmZzZXQ6ICRvZmZzZXQgJG5vZGUiKTsKICAgIGlmIChfZnJhbWVzW29mZnNldC52YWx1ZV0gIT0gbnVsbCkgcmV0dXJuOwoKICAgIC8vIER1cmluZyB0cmFjaW5nIHdlIG9ubHkgY29sbGVjdCBpbmZvcm1hdGlvbiBwZXIgb2Zmc2V0IGJlY2F1c2UgdGhlIHRyYWNlcgogICAgLy8gdmlzaXRzIG5vZGVzIGluIHRyZWUgb3JkZXIuIFdlJ2xsIGxhdGVyIHNvcnQgdGhlIGRhdGEgYnkgb2Zmc2V0IGJlZm9yZQogICAgLy8gcmVnaXN0ZXJpbmcgdGhlIGZyYW1lIGRhdGEgd2l0aCBbU291cmNlTWFwcGVyXS4KICAgIGlmIChraW5kID09IFN0ZXBLaW5kLkZVTl9FWElUKSB7CiAgICAgIF9mcmFtZXNbb2Zmc2V0LnZhbHVlXSA9IG51bGw7CiAgICB9IGVsc2UgewogICAgICBfZnJhbWVzW29mZnNldC52YWx1ZV0gPSBzb3VyY2VJbmZvcm1hdGlvbi5pbmxpbmluZ0NvbnRleHQ7CiAgICB9CiAgfQoKICAvLy8gQ29udmVydHMgdGhlIGlubGluaW5nIGNvbnRleHQgZGF0YSBjb2xsZWN0ZWQgZHVyaW5nIHRyYWNpbmcgaW50byBwdXNoL3BvcAogIC8vLyBzdGFjayBvcGVyYXRpb25zIHRoYXQgd2lsbCBiZSBlbWl0dGVkIHdpdGggdGhlIHNvdXJjZS1tYXAgZmlsZXMuCiAgdm9pZCBmaW5pc2goKSB7CiAgICBMaXN0PEZyYW1lQ29udGV4dD4gbGFzdElubGluaW5nQ29udGV4dDsKICAgIGZvciAodmFyIG9mZnNldCBpbiBfZnJhbWVzLmtleXMudG9MaXN0KCkuLnNvcnQoKSkgewogICAgICB2YXIgbmV3SW5saW5pbmdDb250ZXh0ID0gX2ZyYW1lc1tvZmZzZXRdOwoKICAgICAgLy8gTm90ZTogdGhpcyByZWxpZXMgb24gdGhlIGludmFyaWFudCB0aGF0LCB3aGVuIHdlIGJ1aWx0IHRoZSBpbmxpbmluZwogICAgICAvLyBjb250ZXh0IGxpc3RzIGR1cmluZyBTU0EsIHdlIGtlcHQgbGlzdHMgaWRlbnRpY2FsIHdoZW5ldmVyIHRoZXJlIHdlcmUKICAgICAgLy8gbm8gaW5saW5pbmcgY2hhbmdlcy4KICAgICAgaWYgKGxhc3RJbmxpbmluZ0NvbnRleHQgPT0gbmV3SW5saW5pbmdDb250ZXh0KSBjb250aW51ZTsKCiAgICAgIGJvb2wgaXNFbXB0eSA9IGZhbHNlOwogICAgICBpbnQgcG9wQ291bnQgPSAwOwogICAgICBMaXN0PEZyYW1lQ29udGV4dD4gcHVzaGVzID0gY29uc3QgW107CiAgICAgIGlmIChuZXdJbmxpbmluZ0NvbnRleHQgPT0gbnVsbCkgewogICAgICAgIHBvcENvdW50ID0gbGFzdElubGluaW5nQ29udGV4dC5sZW5ndGg7CiAgICAgICAgaXNFbXB0eSA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAobGFzdElubGluaW5nQ29udGV4dCA9PSBudWxsKSB7CiAgICAgICAgcHVzaGVzID0gbmV3SW5saW5pbmdDb250ZXh0OwogICAgICB9IGVsc2UgewogICAgICAgIGludCBtaW4gPSBuZXdJbmxpbmluZ0NvbnRleHQubGVuZ3RoOwogICAgICAgIGlmIChtaW4gPiBsYXN0SW5saW5pbmdDb250ZXh0Lmxlbmd0aCkgbWluID0gbGFzdElubGluaW5nQ29udGV4dC5sZW5ndGg7CiAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSB0b3RhbCBudW1iZXIgb2YgY29tbW9uIGZyYW1lcywgdG8gcHJvZHVjZSB0aGUgbWluaW1hbAogICAgICAgIC8vIHNldCBvZiBwb3AgYW5kIHB1c2ggb3BlcmF0aW9ucy4KICAgICAgICBpbnQgaSA9IDA7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG1pbjsgaSsrKSB7CiAgICAgICAgICBpZiAoIWlkZW50aWNhbChuZXdJbmxpbmluZ0NvbnRleHRbaV0sIGxhc3RJbmxpbmluZ0NvbnRleHRbaV0pKSBicmVhazsKICAgICAgICB9CiAgICAgICAgaXNFbXB0eSA9IGkgPT0gMDsKICAgICAgICBwb3BDb3VudCA9IGxhc3RJbmxpbmluZ0NvbnRleHQubGVuZ3RoIC0gaTsKICAgICAgICBpZiAoaSA8IG5ld0lubGluaW5nQ29udGV4dC5sZW5ndGgpIHsKICAgICAgICAgIHB1c2hlcyA9IG5ld0lubGluaW5nQ29udGV4dC5zdWJsaXN0KGkpOwogICAgICAgIH0KICAgICAgfQogICAgICBsYXN0SW5saW5pbmdDb250ZXh0ID0gbmV3SW5saW5pbmdDb250ZXh0OwoKICAgICAgd2hpbGUgKHBvcENvdW50LS0gPiAwKSB7CiAgICAgICAgc291cmNlTWFwcGVyLnJlZ2lzdGVyUG9wKG9mZnNldCwgaXNFbXB0eTogcG9wQ291bnQgPT0gMCAmJiBpc0VtcHR5KTsKICAgICAgfQogICAgICBmb3IgKEZyYW1lQ29udGV4dCBwdXNoIGluIHB1c2hlcykgewogICAgICAgIHNvdXJjZU1hcHBlci5yZWdpc3RlclB1c2gob2Zmc2V0LAogICAgICAgICAgICBnZXRTb3VyY2VMb2NhdGlvbihwdXNoLmNhbGxJbmZvcm1hdGlvbiksIHB1c2guaW5saW5lZE1ldGhvZE5hbWUpOwogICAgICB9CiAgICB9CiAgfQp9CgovLy8gW1RyYWNlTGlzdGVuZXJdIHRoYXQgcmVnaXN0ZXIgW1NvdXJjZUxvY2F0aW9uXXMgd2l0aCBhIFtTb3VyY2VNYXBwZXJdLgpjbGFzcyBQb3NpdGlvblRyYWNlTGlzdGVuZXIgZXh0ZW5kcyBUcmFjZUxpc3RlbmVyCiAgICB3aXRoIE5vZGVUb1NvdXJjZUluZm9ybWF0aW9uTWl4aW4gewogIGZpbmFsIFNvdXJjZU1hcHBlciBzb3VyY2VNYXBwZXI7CiAgQG92ZXJyaWRlCiAgZmluYWwgU291cmNlSW5mb3JtYXRpb25SZWFkZXIgcmVhZGVyOwoKICBQb3NpdGlvblRyYWNlTGlzdGVuZXIodGhpcy5zb3VyY2VNYXBwZXIsIHRoaXMucmVhZGVyKTsKCiAgLy8vIFJlZ2lzdGVycyBzb3VyY2UgaW5mb3JtYXRpb24gZm9yIFtub2RlXSBvbiB0aGUgW29mZnNldF0gaW4gdGhlIEphdmFTY3JpcHQKICAvLy8gY29kZSB1c2luZyBba2luZF0gdG8gZGV0ZXJtaW5lIHdoYXQgaW5mb3JtYXRpb24gdG8gdXNlLgogIC8vLwogIC8vLyBGb3IgbW9zdCBub2RlcyB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHNvdXJjZSBpbmZvcm1hdGlvbiBpcyB1c2VkLgogIC8vLyBGb3IgaW5zdGFuY2UgYSByZXR1cm4gZXhwcmVzc2lvbiBwb2ludHMgdG8gdGhlIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUKICAvLy8gc291cmNlIGluZm9ybWF0aW9uLCB0eXBpY2FsbHkgdGhlIHN0YXJ0IG9mIHRoZSByZXR1cm4gc3RhdGVtZW50IHRoYXQKICAvLy8gY3JlYXRlZCB0aGUgSmF2YVNjcmlwdCByZXR1cm4gbm9kZToKICAvLy8KICAvLy8gICAgIEphdmFTY3JpcHQ6ICAgICAgICAgICAgICAgICAgICBEYXJ0OgogIC8vLwogIC8vLyAgICAgQHJldHVybiAiZm9vIjsgICAgICAgICAgICAgICAgIHJldHVybiAiZm9vIjsKICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCiAgLy8vIChAIG1hcmtzIHRoZSBjdXJyZW50IEphdmFTY3JpcHQgcG9zaXRpb24gYW5kIF4gcG9pbnQgdG8gdGhlIG1hcHBlZCBEYXJ0CiAgLy8vIGNvZGUgcG9zaXRpb24uKQogIC8vLwogIC8vLwogIC8vLyBGb3IgW1N0ZXBLaW5kLkNBTExdIHRoZSBgQ2FsbFBvc2l0aW9uLmdldFNlbWFudGljUG9zaXRpb25Gb3JDYWxsYCBtZXRob2QKICAvLy8gaXMgY2FsbGVkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBzdGFydCBvciB0aGUgaW5uZXIgcG9zaXRpb24gc2hvdWxkIGJlCiAgLy8vIHVzZWQuIEZvciBpbnN0YW5jZSBpZiB0aGUgcmVjZWl2ZXIgb2YgdGhlIEphdmFTY3JpcHQgY2FsbCBpcyBhICJzaW1wbGUiCiAgLy8vIGV4cHJlc3Npb24gdGhlbiB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHNvdXJjZSBpbmZvcm1hdGlvbiBpcyB1c2VkOgogIC8vLwogIC8vLyAgICAgSmF2YVNjcmlwdDogICAgICAgICAgICAgICAgICAgIERhcnQ6CiAgLy8vCiAgLy8vICAgICB0MS5AZm9vJDAoKSAgICAgICAgICAgICAgICAgICAgbG9jYWwuZm9vKCkKICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCiAgLy8vCiAgLy8vIElmIHRoZSByZWNlaXZlciBvZiB0aGUgSmF2YVNjcmlwdCBjYWxsIGlzICJjb21wbGV4IiB0aGVuIHRoZSBpbm5lcgogIC8vLyBwb3NpdGlvbiBvZiB0aGUgc291cmNlIGluZm9ybWF0aW9uIGlzIHVzZWQ6CiAgLy8vCiAgLy8vICAgICBKYXZhU2NyaXB0OiAgICAgICAgICAgICAgICAgICAgRGFydDoKICAvLy8KICAvLy8gICAgIGdldCRiYXIoKS5AZm9vKCkgICAgICAgICAgICAgICBiYXIuZm9vKCkKICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgogIC8vLwogIC8vLyBGb3IgW1N0ZXBLaW5kLkZVTl9FWElUXSB0aGUgaW5uZXIgcG9zaXRpb24gb2YgdGhlIHNvdXJjZSBpbmZvcm1hdGlvbgogIC8vLyBpcyB1c2VkLiBGb3IgYSBKYXZhU2NyaXB0IGZ1bmN0aW9uIHdpdGhvdXQgYSByZXR1cm4gc3RhdGVtZW50IHRoaXMgbWFwcwogIC8vLyB0aGUgZW5kIGJyYWNlIHRvIHRoZSBlbmQgYnJhY2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmcgRGFydCBmdW5jdGlvbi4gRm9yIGEKICAvLy8gSmF2YVNjcmlwdCBmdW5jdGlvbiBleGl0ZWQgdGhyb3VnaCBhIHJldHVybiBzdGF0ZW1lbnQgdGhpcyBtYXBzIHRoZSBlbmQgb2YKICAvLy8gdGhlIHJldHVybiBzdGF0ZW1lbnQgdG8gdGhlIGVuZCBicmFjZSBvZiB0aGUgRGFydCBmdW5jdGlvbjoKICAvLy8KICAvLy8gICAgIEphdmFTY3JpcHQ6ICAgICAgICAgICAgICAgICAgICBEYXJ0OgogIC8vLwogIC8vLyAgICAgZm9vOiBmdW5jdGlvbigpIHsgICAgICAgICAgICAgIGZvbygpIHsKICAvLy8gICAgIEB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgogIC8vLyAgICAgZm9vOiBmdW5jdGlvbigpIHsgICAgICAgICAgICAgIGZvbygpIHsKICAvLy8gICAgICAgcmV0dXJuIDA7QCAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogIC8vLyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCiAgQG92ZXJyaWRlCiAgdm9pZCBvblN0ZXAoanMuTm9kZSBub2RlLCBPZmZzZXQgb2Zmc2V0LCBTdGVwS2luZCBraW5kKSB7CiAgICBpbnQgY29kZUxvY2F0aW9uID0gb2Zmc2V0LnZhbHVlOwogICAgaWYgKGNvZGVMb2NhdGlvbiA9PSBudWxsKSByZXR1cm47CgogICAgaWYgKGtpbmQgPT0gU3RlcEtpbmQuTk9fSU5GTykgewogICAgICBzb3VyY2VNYXBwZXIucmVnaXN0ZXIobm9kZSwgY29kZUxvY2F0aW9uLCBjb25zdCBOb1NvdXJjZUxvY2F0aW9uTWFya2VyKCkpOwogICAgICByZXR1cm47CiAgICB9CgogICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPSBjb21wdXRlU291cmNlSW5mb3JtYXRpb24obm9kZSk7CiAgICBpZiAoc291cmNlSW5mb3JtYXRpb24gPT0gbnVsbCkgcmV0dXJuOwoKICAgIHZvaWQgcmVnaXN0ZXJQb3NpdGlvbihTb3VyY2VQb3NpdGlvbktpbmQgc291cmNlUG9zaXRpb25LaW5kKSB7CiAgICAgIFNvdXJjZUxvY2F0aW9uIHNvdXJjZUxvY2F0aW9uID0KICAgICAgICAgIGdldFNvdXJjZUxvY2F0aW9uKHNvdXJjZUluZm9ybWF0aW9uLCBzb3VyY2VQb3NpdGlvbktpbmQpOwogICAgICBpZiAoc291cmNlTG9jYXRpb24gIT0gbnVsbCkgewogICAgICAgIHNvdXJjZU1hcHBlci5yZWdpc3Rlcihub2RlLCBjb2RlTG9jYXRpb24sIHNvdXJjZUxvY2F0aW9uKTsKICAgICAgfQogICAgfQoKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIFN0ZXBLaW5kLkZVTl9FTlRSWToKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhpcyB3aGVuIGZ1bGx5IHRyYW5zaXRpb25lZCB0byB0aGUKICAgICAgICAvLyBuZXcgc291cmNlIGluZm8gc3lzdGVtLiBWZXJpZnkgdGhhdCB0b29scyBubyBsb25nZXIgZXhwZWN0IEpTCiAgICAgICAgLy8gZnVuY3Rpb24gc2lnbmF0dXJlcyB0byBtYXAgdG8gdGhlIG9yaWdpbi4gVGhlIG1haW4gbWV0aG9kIG1heSBzdGlsbAogICAgICAgIC8vIG5lZWQgbWFwcGluZyB0byBlbmFibGUgYnJlYWtwb2ludHMgYmVmb3JlIGNhbGxpbmcgbWFpbi4KICAgICAgICByZWdpc3RlclBvc2l0aW9uKFNvdXJjZVBvc2l0aW9uS2luZC5TVEFSVCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RlcEtpbmQuRlVOX0VYSVQ6CiAgICAgICAgcmVnaXN0ZXJQb3NpdGlvbihTb3VyY2VQb3NpdGlvbktpbmQuSU5ORVIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0ZXBLaW5kLkNBTEw6CiAgICAgICAgQ2FsbFBvc2l0aW9uIGNhbGxQb3NpdGlvbiA9CiAgICAgICAgICAgIENhbGxQb3NpdGlvbi5nZXRTZW1hbnRpY1Bvc2l0aW9uRm9yQ2FsbChub2RlKTsKICAgICAgICByZWdpc3RlclBvc2l0aW9uKGNhbGxQb3NpdGlvbi5zb3VyY2VQb3NpdGlvbktpbmQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0ZXBLaW5kLkFDQ0VTUzoKICAgICAgY2FzZSBTdGVwS2luZC5ORVc6CiAgICAgIGNhc2UgU3RlcEtpbmQuUkVUVVJOOgogICAgICBjYXNlIFN0ZXBLaW5kLkJSRUFLOgogICAgICBjYXNlIFN0ZXBLaW5kLkNPTlRJTlVFOgogICAgICBjYXNlIFN0ZXBLaW5kLlRIUk9XOgogICAgICBjYXNlIFN0ZXBLaW5kLkVYUFJFU1NJT05fU1RBVEVNRU5UOgogICAgICBjYXNlIFN0ZXBLaW5kLklGX0NPTkRJVElPTjoKICAgICAgY2FzZSBTdGVwS2luZC5GT1JfSU5JVElBTElaRVI6CiAgICAgIGNhc2UgU3RlcEtpbmQuRk9SX0NPTkRJVElPTjoKICAgICAgY2FzZSBTdGVwS2luZC5GT1JfVVBEQVRFOgogICAgICBjYXNlIFN0ZXBLaW5kLldISUxFX0NPTkRJVElPTjoKICAgICAgY2FzZSBTdGVwS2luZC5ET19DT05ESVRJT046CiAgICAgIGNhc2UgU3RlcEtpbmQuU1dJVENIX0VYUFJFU1NJT046CiAgICAgICAgcmVnaXN0ZXJQb3NpdGlvbihTb3VyY2VQb3NpdGlvbktpbmQuU1RBUlQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0ZXBLaW5kLk5PX0lORk86CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQp9CgovLy8gVGhlIHBvc2l0aW9uIG9mIGEgW2pzLkNhbGxdIG5vZGUuCmNsYXNzIENhbGxQb3NpdGlvbiB7CiAgLy8vIFRoZSBjYWxsIG5vZGUgZm9yIHdoaWNoIHRoZSBwb3NpdGlvbnMgaGF2ZSBiZWVuIGNvbXB1dGVkLgogIGZpbmFsIGpzLk5vZGUgbm9kZTsKCiAgLy8vIFRoZSBwb3NpdGlvbiBmb3IgW25vZGVdIHVzZWQgYXMgdGhlIG9mZnNldCBpbiB0aGUgSmF2YVNjcmlwdCBjb2RlLgogIC8vLwogIC8vLyBUaGlzIGlzIGVpdGhlciBgQ29kZVBvc2l0aW9uS2luZC5TVEFSVGAgZm9yIGNvZGUgbGlrZQogIC8vLwogIC8vLyAgICAgdDEuZm9vJDAoKQogIC8vLyAgICAgXgogIC8vLyB3aGVyZSB0aGUgbGVmdC1tb3N0IG9mZnNldCBvZiB0aGUgcmVjZWl2ZXIgc2hvdWxkIGJlIHVzZWQsIG9yCiAgLy8vIGBDb2RlUG9zaXRpb25LaW5kLkNMT1NJTkdgIGZvciBjb2RlIGxpa2UKICAvLy8KICAvLy8gICAgIGdldCRiYXIoKS5mb28kMCgpCiAgLy8vICAgICAgICAgICAgICAgXgogIC8vLwogIC8vLyB3aGVyZSB0aGUgbmFtZSBvZiB0aGUgY2FsbGVkIG1ldGhvZCBzaG91bGQgYmUgdXNlZCAoaGVyZSB0aGUgbWV0aG9kCiAgLy8vICdmb28kMCcpLgogIGZpbmFsIENvZGVQb3NpdGlvbktpbmQgY29kZVBvc2l0aW9uS2luZDsKCiAgLy8vIFRoZSBwb3NpdGlvbiBmcm9tIHRoZSBbU291cmNlSW5mb3JtYXRpb25dIHVzZWQgaW4gdGhlIG1hcHBlZCBEYXJ0IGNvZGUuCiAgLy8vCiAgLy8vIFRoaXMgaXMgZWl0aGVyIGBTb3VyY2VQb3NpdGlvbktpbmQuU1RBUlRgIGZvciBjb2RlIGxpa2UKICAvLy8KICAvLy8gICAgIEphdmFTY3JpcHQ6ICAgICAgICAgICAgICAgICAgICBEYXJ0OgogIC8vLwogIC8vLyAgICAgdDEuQGZvbyQwKCkgICAgICAgICAgICAgICAgICAgIGxvY2FsLmZvbygpCiAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgogIC8vLwogIC8vLyB3aGVyZSB0aGUgSmF2YVNjcmlwdCByZWNlaXZlciBpcyBhICJzaW1wbGUiIGV4cHJlc3Npb24sIG9yCiAgLy8vIGBTb3VyY2VQb3NpdGlvbktpbmQuQ0xPU0lOR2AgZm9yIGNvZGUgbGlrZQogIC8vLwogIC8vLyAgICAgSmF2YVNjcmlwdDogICAgICAgICAgICAgICAgICAgIERhcnQ6CiAgLy8vCiAgLy8vICAgICBnZXQkYmFyKCkuQGZvbygpICAgICAgICAgICAgICAgYmFyLmZvbygpCiAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KICAvLy8KICAvLy8gd2hlcmUgdGhlIEphdmFTY3JpcHQgcmVjZWl2ZXIgaXMgYSAiY29tcGxleCIgZXhwcmVzc2lvbi4KICAvLy8KICAvLy8gKEAgbWFya3MgdGhlIGN1cnJlbnQgSmF2YVNjcmlwdCBwb3NpdGlvbiBhbmQgXiBwb2ludCB0byB0aGUgbWFwcGVkIERhcnQKICAvLy8gY29kZSBwb3NpdGlvbi4pCiAgZmluYWwgU291cmNlUG9zaXRpb25LaW5kIHNvdXJjZVBvc2l0aW9uS2luZDsKCiAgQ2FsbFBvc2l0aW9uKHRoaXMubm9kZSwgdGhpcy5jb2RlUG9zaXRpb25LaW5kLCB0aGlzLnNvdXJjZVBvc2l0aW9uS2luZCk7CgogIC8vLyBDb21wdXRlcyB0aGUgW0NhbGxQb3NpdGlvbl0gZm9yIHRoZSBjYWxsIFtub2RlXS4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlIGlmIHRoZSByZWNlaXZlciBvZiB0aGUgSmF2YVNjcmlwdCBjYWxsIGlzIGEgInNpbXBsZSIKICAvLy8gZXhwcmVzc2lvbiB0aGVuIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgc291cmNlIGluZm9ybWF0aW9uIGlzIHVzZWQ6CiAgLy8vCiAgLy8vICAgICBKYXZhU2NyaXB0OiAgICAgICAgICAgICAgICAgICAgRGFydDoKICAvLy8KICAvLy8gICAgIHQxLkBmb28kMCgpICAgICAgICAgICAgICAgICAgICBsb2NhbC5mb28oKQogIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KICAvLy8KICAvLy8gSWYgdGhlIHJlY2VpdmVyIG9mIHRoZSBKYXZhU2NyaXB0IGNhbGwgaXMgImNvbXBsZXgiIHRoZW4gdGhlIGlubmVyCiAgLy8vIHBvc2l0aW9uIG9mIHRoZSBzb3VyY2UgaW5mb3JtYXRpb24gaXMgdXNlZDoKICAvLy8KICAvLy8gICAgIEphdmFTY3JpcHQ6ICAgICAgICAgICAgICAgICAgICBEYXJ0OgogIC8vLwogIC8vLyAgICAgZ2V0JGJhcigpLkBmb28oKSAgICAgICAgICAgICAgIGJhci5mb28oKQogIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCiAgLy8vIChAIG1hcmtzIHRoZSBjdXJyZW50IEphdmFTY3JpcHQgcG9zaXRpb24gYW5kIF4gcG9pbnQgdG8gdGhlIG1hcHBlZCBEYXJ0CiAgLy8vIGNvZGUgcG9zaXRpb24uKQogIHN0YXRpYyBDYWxsUG9zaXRpb24gZ2V0U2VtYW50aWNQb3NpdGlvbkZvckNhbGwoanMuQ2FsbCBub2RlKSB7CiAgICBpZiAobm9kZS50YXJnZXQgaXMganMuUHJvcGVydHlBY2Nlc3MpIHsKICAgICAganMuUHJvcGVydHlBY2Nlc3MgYWNjZXNzID0gbm9kZS50YXJnZXQ7CiAgICAgIGpzLk5vZGUgdGFyZ2V0ID0gYWNjZXNzOwogICAgICBib29sIHB1cmVBY2Nlc3MgPSBmYWxzZTsKICAgICAgd2hpbGUgKHRhcmdldCBpcyBqcy5Qcm9wZXJ0eUFjY2VzcykgewogICAgICAgIGpzLlByb3BlcnR5QWNjZXNzIHRhcmdldEFjY2VzcyA9IHRhcmdldDsKICAgICAgICBpZiAodGFyZ2V0QWNjZXNzLnJlY2VpdmVyIGlzIGpzLlZhcmlhYmxlVXNlIHx8CiAgICAgICAgICAgIHRhcmdldEFjY2Vzcy5yZWNlaXZlciBpcyBqcy5UaGlzKSB7CiAgICAgICAgICBwdXJlQWNjZXNzID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0YXJnZXQgPSB0YXJnZXRBY2Nlc3MucmVjZWl2ZXI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwdXJlQWNjZXNzKSB7CiAgICAgICAgLy8gYS5tKCkgICB0aGlzLm0oKSAgYS5iLmMuZC5tKCkKICAgICAgICAvLyBeICAgICAgIF4gICAgICAgICBeCiAgICAgICAgcmV0dXJuIG5ldyBDYWxsUG9zaXRpb24oCiAgICAgICAgICAgIG5vZGUsIENvZGVQb3NpdGlvbktpbmQuU1RBUlQsIFNvdXJjZVBvc2l0aW9uS2luZC5TVEFSVCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gKi5tKCkgICouYS5iLmMuZC5tKCkKICAgICAgICAvLyAgIF4gICAgICAgICAgICAgIF4KICAgICAgICByZXR1cm4gbmV3IENhbGxQb3NpdGlvbigKICAgICAgICAgICAgYWNjZXNzLnNlbGVjdG9yLCBDb2RlUG9zaXRpb25LaW5kLlNUQVJULCBTb3VyY2VQb3NpdGlvbktpbmQuSU5ORVIpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKG5vZGUudGFyZ2V0IGlzIGpzLlZhcmlhYmxlVXNlIHx8IG5vZGUudGFyZ2V0IGlzIGpzLlRoaXMpIHsKICAgICAgLy8gbSgpICAgdGhpcygpCiAgICAgIC8vIF4gICAgIF4KICAgICAgcmV0dXJuIG5ldyBDYWxsUG9zaXRpb24oCiAgICAgICAgICBub2RlLCBDb2RlUG9zaXRpb25LaW5kLlNUQVJULCBTb3VyY2VQb3NpdGlvbktpbmQuU1RBUlQpOwogICAgfSBlbHNlIGlmIChub2RlLnRhcmdldCBpcyBqcy5GdW4gfHwKICAgICAgICBub2RlLnRhcmdldCBpcyBqcy5OZXcgfHwKICAgICAgICBub2RlLnRhcmdldCBpcyBqcy5OYW1lZEZ1bmN0aW9uKSB7CiAgICAgIC8vIGZ1bmN0aW9uKCl7fSgpICBuZXcgRnVuY3Rpb24oIi4uLiIpKCkgICBmdW5jdGlvbiBmb28oKXt9KCkKICAgICAgLy8gICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICBeCiAgICAgIHJldHVybiBuZXcgQ2FsbFBvc2l0aW9uKAogICAgICAgICAgbm9kZS50YXJnZXQsIENvZGVQb3NpdGlvbktpbmQuRU5ELCBTb3VyY2VQb3NpdGlvbktpbmQuSU5ORVIpOwogICAgfSBlbHNlIGlmIChub2RlLnRhcmdldCBpcyBqcy5CaW5hcnkgfHwgbm9kZS50YXJnZXQgaXMganMuQ2FsbCkgewogICAgICAvLyAoMCxhKSgpICAgbSgpKCkKICAgICAgLy8gICAgICBeICAgICAgIF4KICAgICAgcmV0dXJuIG5ldyBDYWxsUG9zaXRpb24oCiAgICAgICAgICBub2RlLnRhcmdldCwgQ29kZVBvc2l0aW9uS2luZC5FTkQsIFNvdXJjZVBvc2l0aW9uS2luZC5JTk5FUik7CiAgICB9IGVsc2UgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNYXliZSByZW1vdmUgdGhpcyBhc3NlcnRpb24uCiAgICAgIGFzc2VydCgKICAgICAgICAgIGZhbHNlLAogICAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgICAgTk9fTE9DQVRJT05fU1BBTk5BQkxFLAogICAgICAgICAgICAgICJVbmV4cGVjdGVkIHByb3BlcnR5IGFjY2VzcyAke25vZGVUb1N0cmluZyhub2RlKX06XG4iCiAgICAgICAgICAgICAgIiR7RGVidWdQcmludGVyLnByZXR0eVByaW50KG5vZGUpfSIpKTsKICAgICAgLy8gRG9uJ3Qga25vdy4uLi4KICAgICAgcmV0dXJuIG5ldyBDYWxsUG9zaXRpb24oCiAgICAgICAgICBub2RlLCBDb2RlUG9zaXRpb25LaW5kLlNUQVJULCBTb3VyY2VQb3NpdGlvbktpbmQuU1RBUlQpOwogICAgfQogIH0KfQoKLy8vIEFuIG9mZnNldCBvZiBhIEphdmFTY3JpcHQgbm9kZSB3aXRoaW4gdGhlIG91dHB1dCBjb2RlLgovLy8KLy8vIFRoaXMgb2JqZWN0IGhvbGRzIHRocmVlIGRpZmZlcmVudCB2YWx1ZXMgZm9yIHRoZSBvZmZzZXQgY29ycmVzcG9uZGluZyB0bwovLy8gdGhyZWUgZGlmZmVyZW50IHdheXMgYnJvd3NlcnMgY2FuIGNvbXB1dGUgdGhlIG9mZnNldCBvZiBhIEphdmFTY3JpcHQgbm9kZS4KLy8vCi8vLyBDdXJyZW50bHkgW3N1YmV4cHJlc3Npb25PZmZzZXRdIGlzIHVzZWQgc2luY2UgaXQgY29ycmVzcG9uZHMgdGhlIG1vc3QgdG8gdGhlCi8vLyBvZmZzZXQgdXNlZCBieSBtb3N0IGJyb3dzZXJzLgpjbGFzcyBPZmZzZXQgewogIC8vLyBUaGUgb2Zmc2V0IG9mIHRoZSBlbmNsb3Npbmcgc3RhdGVtZW50IHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCiAgLy8vIGZpbGUuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZToKICAvLy8KICAvLy8gICAgIGZvbygpLmJhcihiYXooKSk7CiAgLy8vICAgICBeICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YXRlbWVudCBvZmZzZXQgb2YgdGhlIGBmb28oKWAgY2FsbAogIC8vLyAgICAgXiAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGF0ZW1lbnQgb2Zmc2V0IG9mIHRoZSBgKi5iYXIoKWAgY2FsbAogIC8vLyAgICAgXiAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGF0ZW1lbnQgb2Zmc2V0IG9mIHRoZSBgYmF6KClgIGNhbGwKICAvLy8KICBmaW5hbCBpbnQgc3RhdGVtZW50T2Zmc2V0OwoKICAvLy8gVGhlIGBzdWJleHByZXNzaW9uYCBvZmZzZXQgb2YgdGhlIHN0ZXAuIFRoaXMgaXMgdGhlIChtb3N0bHkpIHVuaXF1ZQogIC8vLyBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSwgdGhhdCBpZGVudGlmaWVzIHRoZQogIC8vLyBjdXJyZW50IG9mIGV4ZWN1dGlvbi4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlOgogIC8vLwogIC8vLyAgICAgZm9vKCkuYmFyKGJheigpKTsKICAvLy8gICAgIF4gICAgICAgICAgICAgICAgICAgLy8gdGhlIHN1YmV4cHJlc3Npb24gb2Zmc2V0IG9mIHRoZSBgZm9vKClgIGNhbGwKICAvLy8gICAgICAgICAgIF4gICAgICAgICAgICAgLy8gdGhlIHN1YmV4cHJlc3Npb24gb2Zmc2V0IG9mIHRoZSBgKi5iYXIoKWAgY2FsbAogIC8vLyAgICAgICAgICAgICAgIF4gICAgICAgICAvLyB0aGUgc3ViZXhwcmVzc2lvbiBvZmZzZXQgb2YgdGhlIGBiYXooKWAgY2FsbAogIC8vLwogIC8vLyBIZXJlLCBldmVuIHRob3VnaCB0aGUgSmF2YVNjcmlwdCBub2RlIGZvciB0aGUgYCouYmFyKClgIGNhbGwgY29udGFpbnMKICAvLy8gdGhlIGBmb28oKWAgaXRzIGV4ZWN1dGlvbiBpcyBpZGVudGlmaWVkIGJ5IHRoZSBgYmFyYCBpZGVudGlmaWVyIG1vcmUgdGhhbgogIC8vLyB0aGUgZm9vIGlkZW50aWZpZXIuCiAgLy8vCiAgZmluYWwgaW50IHN1YmV4cHJlc3Npb25PZmZzZXQ7CgogIC8vLyBUaGUgYGxlZnQtdG8tcmlnaHRgIG9mZnNldCBvZiB0aGUgc3RlcC4gVGhpcyBpcyBsaWtlIFtzdWJleHByZXNzaW9uT2Zmc2V0XQogIC8vLyBidXQgcmVzdHJpY3RlZCBzbyB0aGF0IHRoZSBvZmZzZXQgb2YgZWFjaCBzdWJleHByZXNzaW9uIGluIGV4ZWN1dGlvbgogIC8vLyBvcmRlciBpcyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZToKICAvLy8KICAvLy8gICAgIGZvbygpLmJhcihiYXooKSk7CiAgLy8vICAgICBeICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsZWZ0LXRvLXJpZ2h0IG9mZnNldCBvZiB0aGUgYGZvbygpYCBjYWxsCiAgLy8vICAgICAgICAgICBeICAgICAgICAgICAgIC8vIHRoZSBsZWZ0LXRvLXJpZ2h0IG9mZnNldCBvZiB0aGUgYCouYmFyKClgIGNhbGwKICAvLy8gICAgIF4gICAgICAgICAgICAgICAgICAgLy8gdGhlIGxlZnQtdG8tcmlnaHQgb2Zmc2V0IG9mIHRoZSBgYmF6KClgIGNhbGwKICAvLy8KICAvLy8gSGVyZSwgYGJheigpYCBpcyBleGVjdXRlZCBiZWZvcmUgYGZvbygpYCBzbyB3ZSBuZWVkIHRvIHVzZSAnZicgYXMgaXRzIGJlc3QKICAvLy8gcG9zaXRpb24gdW5kZXIgdGhlIHJlc3RyaWN0aW9uLgogIC8vLwogIGZpbmFsIGludCBsZWZ0VG9SaWdodE9mZnNldDsKCiAgT2Zmc2V0KAogICAgICB0aGlzLnN0YXRlbWVudE9mZnNldCwgdGhpcy5sZWZ0VG9SaWdodE9mZnNldCwgdGhpcy5zdWJleHByZXNzaW9uT2Zmc2V0KTsKCiAgaW50IGdldCB2YWx1ZSA9PiBzdWJleHByZXNzaW9uT2Zmc2V0OwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gJ09mZnNldFtzdGF0ZW1lbnRPZmZzZXQ9JHN0YXRlbWVudE9mZnNldCwnCiAgICAgICAgJ2xlZnRUb1JpZ2h0T2Zmc2V0PSRsZWZ0VG9SaWdodE9mZnNldCwnCiAgICAgICAgJ3N1YmV4cHJlc3Npb25PZmZzZXQ9JHN1YmV4cHJlc3Npb25PZmZzZXRdJzsKICB9Cn0KCmVudW0gQnJhbmNoS2luZCB7CiAgQ09ORElUSU9OLAogIExPT1AsCiAgQ0FUQ0gsCiAgRklOQUxMWSwKICBDQVNFLAp9CgplbnVtIFN0ZXBLaW5kIHsKICBGVU5fRU5UUlksCiAgRlVOX0VYSVQsCiAgQ0FMTCwKICBORVcsCiAgQUNDRVNTLAogIFJFVFVSTiwKICBCUkVBSywKICBDT05USU5VRSwKICBUSFJPVywKICBFWFBSRVNTSU9OX1NUQVRFTUVOVCwKICBJRl9DT05ESVRJT04sCiAgRk9SX0lOSVRJQUxJWkVSLAogIEZPUl9DT05ESVRJT04sCiAgRk9SX1VQREFURSwKICBXSElMRV9DT05ESVRJT04sCiAgRE9fQ09ORElUSU9OLAogIFNXSVRDSF9FWFBSRVNTSU9OLAogIE5PX0lORk8sCn0KCi8vLyBMaXN0ZW5lciBmb3IgdGhlIFtKYXZhU2NyaXB0VHJhY2VyXS4KYWJzdHJhY3QgY2xhc3MgVHJhY2VMaXN0ZW5lciB7CiAgLy8vIENhbGxlZCBiZWZvcmUgW3Jvb3RdIG5vZGUgaXMgcHJvY2VzZWQgYnkgdGhlIFtKYXZhU2NyaXB0VHJhY2VyXS4KICB2b2lkIG9uU3RhcnQoanMuTm9kZSByb290KSB7fQoKICAvLy8gQ2FsbGVkIGFmdGVyIFtyb290XSBub2RlIGhhcyBiZWVuIHByb2Nlc2VkIGJ5IHRoZSBbSmF2YVNjcmlwdFRyYWNlcl0uCiAgdm9pZCBvbkVuZChqcy5Ob2RlIHJvb3QpIHt9CgogIC8vLyBDYWxsZWQgd2hlbiBhIGJyYW5jaCBvZiB0aGUgZ2l2ZW4gW2tpbmRdIGlzIHN0YXJ0ZWQuIFt2YWx1ZV0gaXMgcHJvdmlkZWQKICAvLy8gdG8gZGlzdGluZ3Vpc2ggdHJ1ZS9mYWxzZSBicmFuY2hlcyBvZiBbQnJhbmNoS2luZC5DT05ESVRJT05dIGFuZCBjYXNlcyBvZgogIC8vLyBbQnJhbmNoLkNBU0VdLgogIHZvaWQgcHVzaEJyYW5jaChCcmFuY2hLaW5kIGtpbmQsIFt2YWx1ZV0pIHt9CgogIC8vLyBDYWxsZWQgd2hlbiB0aGUgY3VycmVudCBicmFuY2ggZW5kcy4KICB2b2lkIHBvcEJyYW5jaCgpIHt9CgogIC8vLyBDYWxsZWQgd2hlbiBbbm9kZV0gZGVmaW5lcyBhIHN0ZXAgb2YgdGhlIGdpdmVuIFtraW5kXSBhdCB0aGUgZ2l2ZW4KICAvLy8gW29mZnNldF0gd2hlbiB0aGUgZ2VuZXJhdGVkIEphdmFTY3JpcHQgY29kZS4KICB2b2lkIG9uU3RlcChqcy5Ob2RlIG5vZGUsIE9mZnNldCBvZmZzZXQsIFN0ZXBLaW5kIGtpbmQpIHt9Cn0KCi8vLyBWaXNpdG9yIHRoYXQgY29tcHV0ZXMgdGhlIFtqcy5Ob2RlXXMgdGhlIGFyZSBwYXJ0IG9mIHRoZSBKYXZhU2NyaXB0Ci8vLyBzdGVwcGFibGUgZXhlY3V0aW9uIGFuZCB0aHVzIG5lZWRzIHNvdXJjZSBtYXBwaW5nIGxvY2F0aW9ucy4KY2xhc3MgSmF2YVNjcmlwdFRyYWNlciBleHRlbmRzIGpzLkJhc2VWaXNpdG9yIHsKICBmaW5hbCBDb2RlUG9zaXRpb25NYXAgY29kZVBvc2l0aW9uczsKICBmaW5hbCBTb3VyY2VJbmZvcm1hdGlvblJlYWRlciByZWFkZXI7CiAgZmluYWwgTGlzdDxUcmFjZUxpc3RlbmVyPiBsaXN0ZW5lcnM7CgogIC8vLyBUaGUgc3RlcHMgYWRkZWQgYnkgc3ViZXhwcmVzc2lvbnMuCiAgTGlzdCBzdGVwcyA9IFtdOwoKICAvLy8gVGhlIG9mZnNldCBvZiB0aGUgY3VycmVudCBzdGF0ZW1lbnQuCiAgaW50IHN0YXRlbWVudE9mZnNldDsKCiAgLy8vIFRoZSBjdXJyZW50IG9mZnNldCBpbiBsZWZ0LXRvLXJpZ2h0IHByb2dyZXNzaW9uLgogIGludCBsZWZ0VG9SaWdodE9mZnNldDsKCiAgLy8vIFRoZSBvZmZzZXQgb2YgdGhlIHN1cnJvdW5kaW5nIHN0YXRlbWVudCwgdXNlZCBmb3IgdGhlIGZpcnN0IHN1YmV4cHJlc3Npb24uCiAgaW50IG9mZnNldFBvc2l0aW9uOwoKICBib29sIGFjdGl2ZTsKCiAgSmF2YVNjcmlwdFRyYWNlcih0aGlzLmNvZGVQb3NpdGlvbnMsIHRoaXMucmVhZGVyLCB0aGlzLmxpc3RlbmVycywKICAgICAge3RoaXMuYWN0aXZlOiBmYWxzZX0pOwoKICB2b2lkIG5vdGlmeVN0YXJ0KGpzLk5vZGUgbm9kZSkgewogICAgbGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lci5vblN0YXJ0KG5vZGUpKTsKICB9CgogIHZvaWQgbm90aWZ5RW5kKGpzLk5vZGUgbm9kZSkgewogICAgbGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lci5vbkVuZChub2RlKSk7CiAgfQoKICB2b2lkIG5vdGlmeVB1c2hCcmFuY2goQnJhbmNoS2luZCBraW5kLCBbdmFsdWVdKSB7CiAgICBpZiAoYWN0aXZlKSB7CiAgICAgIGxpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4gbGlzdGVuZXIucHVzaEJyYW5jaChraW5kLCB2YWx1ZSkpOwogICAgfQogIH0KCiAgdm9pZCBub3RpZnlQb3BCcmFuY2goKSB7CiAgICBpZiAoYWN0aXZlKSB7CiAgICAgIGxpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4gbGlzdGVuZXIucG9wQnJhbmNoKCkpOwogICAgfQogIH0KCiAgdm9pZCBub3RpZnlTdGVwKGpzLk5vZGUgbm9kZSwgT2Zmc2V0IG9mZnNldCwgU3RlcEtpbmQga2luZCwKICAgICAge2Jvb2wgZm9yY2U6IGZhbHNlfSkgewogICAgaWYgKGFjdGl2ZSB8fCBmb3JjZSkgewogICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IGxpc3RlbmVyLm9uU3RlcChub2RlLCBvZmZzZXQsIGtpbmQpKTsKICAgIH0KICB9CgogIHZvaWQgYXBwbHkoanMuTm9kZSBub2RlKSB7CiAgICBub3RpZnlTdGFydChub2RlKTsKCiAgICBpbnQgc3RhcnRQb3NpdGlvbiA9IGdldFN5bnRheE9mZnNldChub2RlLCBraW5kOiBDb2RlUG9zaXRpb25LaW5kLlNUQVJUKTsKICAgIE9mZnNldCBzdGFydE9mZnNldCA9IGdldE9mZnNldEZvck5vZGUobm9kZSwgc3RhcnRQb3NpdGlvbik7CiAgICBub3RpZnlTdGVwKG5vZGUsIHN0YXJ0T2Zmc2V0LCBTdGVwS2luZC5OT19JTkZPLCBmb3JjZTogdHJ1ZSk7CgogICAgbm9kZS5hY2NlcHQodGhpcyk7CiAgICBub3RpZnlFbmQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdE5vZGUoanMuTm9kZSBub2RlKSB7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICB2aXNpdChqcy5Ob2RlIG5vZGUsIFtCcmFuY2hLaW5kIGJyYW5jaCwgdmFsdWVdKSB7CiAgICBpZiAobm9kZSAhPSBudWxsKSB7CiAgICAgIGlmIChicmFuY2ggIT0gbnVsbCkgewogICAgICAgIG5vdGlmeVB1c2hCcmFuY2goYnJhbmNoLCB2YWx1ZSk7CiAgICAgICAgbm9kZS5hY2NlcHQodGhpcyk7CiAgICAgICAgbm90aWZ5UG9wQnJhbmNoKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbm9kZS5hY2NlcHQodGhpcyk7CiAgICAgIH0KICAgIH0KICB9CgogIHZpc2l0TGlzdChMaXN0PGpzLk5vZGU+IG5vZGVMaXN0KSB7CiAgICBpZiAobm9kZUxpc3QgIT0gbnVsbCkgewogICAgICBmb3IgKGpzLk5vZGUgbm9kZSBpbiBub2RlTGlzdCkgewogICAgICAgIHZpc2l0KG5vZGUpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIF9oYW5kbGVGdW5jdGlvbihqcy5Ob2RlIG5vZGUsIGpzLk5vZGUgYm9keSkgewogICAgYm9vbCBhY3RpdmVCZWZvcmUgPSBhY3RpdmU7CiAgICBpZiAoIWFjdGl2ZSkgewogICAgICBhY3RpdmUgPSByZWFkZXIuZ2V0U291cmNlSW5mb3JtYXRpb24obm9kZSkgIT0gbnVsbDsKICAgIH0KICAgIGxlZnRUb1JpZ2h0T2Zmc2V0ID0KICAgICAgICBzdGF0ZW1lbnRPZmZzZXQgPSBnZXRTeW50YXhPZmZzZXQobm9kZSwga2luZDogQ29kZVBvc2l0aW9uS2luZC5TVEFSVCk7CiAgICBPZmZzZXQgZW50cnlPZmZzZXQgPSBnZXRPZmZzZXRGb3JOb2RlKG5vZGUsIHN0YXRlbWVudE9mZnNldCk7CiAgICBub3RpZnlTdGVwKG5vZGUsIGVudHJ5T2Zmc2V0LCBTdGVwS2luZC5GVU5fRU5UUlkpOwoKICAgIHZpc2l0KGJvZHkpOwoKICAgIGxlZnRUb1JpZ2h0T2Zmc2V0ID0KICAgICAgICBzdGF0ZW1lbnRPZmZzZXQgPSBnZXRTeW50YXhPZmZzZXQobm9kZSwga2luZDogQ29kZVBvc2l0aW9uS2luZC5DTE9TSU5HKTsKICAgIE9mZnNldCBleGl0T2Zmc2V0ID0gZ2V0T2Zmc2V0Rm9yTm9kZShub2RlLCBzdGF0ZW1lbnRPZmZzZXQpOwogICAgbm90aWZ5U3RlcChub2RlLCBleGl0T2Zmc2V0LCBTdGVwS2luZC5GVU5fRVhJVCk7CiAgICBpZiAoYWN0aXZlICYmICFhY3RpdmVCZWZvcmUpIHsKICAgICAgaW50IGVuZFBvc2l0aW9uID0gZ2V0U3ludGF4T2Zmc2V0KG5vZGUsIGtpbmQ6IENvZGVQb3NpdGlvbktpbmQuRU5EKTsKICAgICAgT2Zmc2V0IGVuZE9mZnNldCA9IGdldE9mZnNldEZvck5vZGUobm9kZSwgZW5kUG9zaXRpb24pOwogICAgICBub3RpZnlTdGVwKG5vZGUsIGVuZE9mZnNldCwgU3RlcEtpbmQuTk9fSU5GTyk7CiAgICB9CiAgICBhY3RpdmUgPSBhY3RpdmVCZWZvcmU7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEZ1bihqcy5GdW4gbm9kZSkgewogICAgX2hhbmRsZUZ1bmN0aW9uKG5vZGUsIG5vZGUuYm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdE5hbWVkRnVuY3Rpb24oanMuTmFtZWRGdW5jdGlvbiBub2RlKSB7CiAgICBfaGFuZGxlRnVuY3Rpb24obm9kZSwgbm9kZS5mdW5jdGlvbi5ib2R5KTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0QmxvY2soanMuQmxvY2sgbm9kZSkgewogICAgZm9yIChqcy5TdGF0ZW1lbnQgc3RhdGVtZW50IGluIG5vZGUuc3RhdGVtZW50cykgewogICAgICB2aXNpdChzdGF0ZW1lbnQpOwogICAgfQogIH0KCiAgaW50IGdldFN5bnRheE9mZnNldChqcy5Ob2RlIG5vZGUsCiAgICAgIHtDb2RlUG9zaXRpb25LaW5kIGtpbmQ6IENvZGVQb3NpdGlvbktpbmQuU1RBUlR9KSB7CiAgICBDb2RlUG9zaXRpb24gY29kZVBvc2l0aW9uID0gY29kZVBvc2l0aW9uc1tub2RlXTsKICAgIGlmIChjb2RlUG9zaXRpb24gIT0gbnVsbCkgewogICAgICByZXR1cm4gY29kZVBvc2l0aW9uLmdldFBvc2l0aW9uKGtpbmQpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2aXNpdFN1YmV4cHJlc3Npb24oCiAgICAgIGpzLk5vZGUgcGFyZW50LCBqcy5FeHByZXNzaW9uIGNoaWxkLCBpbnQgY29kZU9mZnNldCwgU3RlcEtpbmQga2luZCkgewogICAgdmFyIG9sZFN0ZXBzID0gc3RlcHM7CiAgICBzdGVwcyA9IFtdOwogICAgb2Zmc2V0UG9zaXRpb24gPSBjb2RlT2Zmc2V0OwogICAgdmlzaXQoY2hpbGQpOwogICAgaWYgKHN0ZXBzLmlzRW1wdHkpIHsKICAgICAgbm90aWZ5U3RlcChwYXJlbnQsIGdldE9mZnNldEZvck5vZGUocGFyZW50LCBvZmZzZXRQb3NpdGlvbiksIGtpbmQpOwogICAgICAvLyBUaGUgW29mZnNldFBvc2l0aW9uXSBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHRoZSBmaXJzdCBzdWJleHByZXNzaW9uLgogICAgICBvZmZzZXRQb3NpdGlvbiA9IG51bGw7CiAgICB9CiAgICBzdGVwcyA9IG9sZFN0ZXBzOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KGpzLkV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgewogICAgc3RhdGVtZW50T2Zmc2V0ID0gZ2V0U3ludGF4T2Zmc2V0KG5vZGUpOwogICAgdmlzaXRTdWJleHByZXNzaW9uKAogICAgICAgIG5vZGUsIG5vZGUuZXhwcmVzc2lvbiwgc3RhdGVtZW50T2Zmc2V0LCBTdGVwS2luZC5FWFBSRVNTSU9OX1NUQVRFTUVOVCk7CiAgICBzdGF0ZW1lbnRPZmZzZXQgPSBudWxsOwogICAgbGVmdFRvUmlnaHRPZmZzZXQgPSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRFbXB0eVN0YXRlbWVudChqcy5FbXB0eVN0YXRlbWVudCBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICB2aXNpdENhbGwoanMuQ2FsbCBub2RlKSB7CiAgICB2aXNpdChub2RlLnRhcmdldCk7CiAgICBpbnQgb2xkUG9zaXRpb24gPSBvZmZzZXRQb3NpdGlvbjsKICAgIG9mZnNldFBvc2l0aW9uID0gbnVsbDsKICAgIHZpc2l0TGlzdChub2RlLmFyZ3VtZW50cyk7CiAgICBvZmZzZXRQb3NpdGlvbiA9IG9sZFBvc2l0aW9uOwogICAgQ2FsbFBvc2l0aW9uIGNhbGxQb3NpdGlvbiA9IENhbGxQb3NpdGlvbi5nZXRTZW1hbnRpY1Bvc2l0aW9uRm9yQ2FsbChub2RlKTsKICAgIGpzLk5vZGUgcG9zaXRpb25Ob2RlID0gY2FsbFBvc2l0aW9uLm5vZGU7CiAgICBpbnQgY2FsbE9mZnNldCA9CiAgICAgICAgZ2V0U3ludGF4T2Zmc2V0KHBvc2l0aW9uTm9kZSwga2luZDogY2FsbFBvc2l0aW9uLmNvZGVQb3NpdGlvbktpbmQpOwogICAgaWYgKG9mZnNldFBvc2l0aW9uID09IG51bGwpIHsKICAgICAgLy8gVXNlIHRoZSBjYWxsIG9mZnNldCBpZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3Qgc3ViZXhwcmVzc2lvbi4KICAgICAgb2Zmc2V0UG9zaXRpb24gPSBjYWxsT2Zmc2V0OwogICAgfQogICAgT2Zmc2V0IG9mZnNldCA9IGdldE9mZnNldEZvck5vZGUocG9zaXRpb25Ob2RlLCBvZmZzZXRQb3NpdGlvbik7CiAgICBub3RpZnlTdGVwKG5vZGUsIG9mZnNldCwgU3RlcEtpbmQuQ0FMTCk7CiAgICBzdGVwcy5hZGQobm9kZSk7CiAgICBvZmZzZXRQb3NpdGlvbiA9IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdE5ldyhqcy5OZXcgbm9kZSkgewogICAgdmlzaXQobm9kZS50YXJnZXQpOwogICAgaW50IG9sZFBvc2l0aW9uID0gb2Zmc2V0UG9zaXRpb247CiAgICBvZmZzZXRQb3NpdGlvbiA9IG51bGw7CiAgICB2aXNpdExpc3Qobm9kZS5hcmd1bWVudHMpOwogICAgb2Zmc2V0UG9zaXRpb24gPSBvbGRQb3NpdGlvbjsKICAgIGlmIChvZmZzZXRQb3NpdGlvbiA9PSBudWxsKSB7CiAgICAgIC8vIFVzZSB0aGUgc3ludGF4IG9mZnNldCBpZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3Qgc3ViZXhwcmVzc2lvbi4KICAgICAgb2Zmc2V0UG9zaXRpb24gPSBnZXRTeW50YXhPZmZzZXQobm9kZSk7CiAgICB9CiAgICBub3RpZnlTdGVwKG5vZGUsIGdldE9mZnNldEZvck5vZGUobm9kZSwgb2Zmc2V0UG9zaXRpb24pLCBTdGVwS2luZC5ORVcpOwogICAgc3RlcHMuYWRkKG5vZGUpOwogICAgb2Zmc2V0UG9zaXRpb24gPSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRBY2Nlc3MoanMuUHJvcGVydHlBY2Nlc3Mgbm9kZSkgewogICAgdmlzaXQobm9kZS5yZWNlaXZlcik7CiAgICBub3RpZnlTdGVwKAogICAgICAgIG5vZGUsCiAgICAgICAgLy8gVGVjaG5pY2FsbHkgd2UnZCBsaWtlIHRvIHVzZSB0aGUgb2Zmc2V0IG9mIHRoZSBgLmAgaW4gdGhlIHByb3BlcnR5CiAgICAgICAgLy8gYWNjZXNzLCBidXQgdGhlIGpzX2FzdCBkb2Vzbid0IGV4cG9zZSBpdC4gU2luY2UgdGhpcyBpcyBvbmx5IHVzZWQgdG8KICAgICAgICAvLyBzZWFyY2ggYmFja3dhcmRzIGZvciBpbmxpbmVkIGZyYW1lcywgd2UgdXNlIHRoZSByZWNlaXZlcidzIEVORCBvZmZzZXQKICAgICAgICAvLyBpbnN0ZWFkIGFzIGFuIGFwcHJveGltYXRpb24uIE5vdGUgdGhhdCB0aGUgRU5EIG9mZnNldCBwb2ludHMgb25lCiAgICAgICAgLy8gY2hhcmFjdGVyIGFmdGVyIHRoZSBlbmQgb2YgdGhlIG5vZGUsIHNvIGl0IGlzIGxpa2VseSBhbHdheXMgdGhlCiAgICAgICAgLy8gb2Zmc2V0IHdlIHdhbnQuCiAgICAgICAgZ2V0T2Zmc2V0Rm9yTm9kZSgKICAgICAgICAgICAgbm9kZSwgZ2V0U3ludGF4T2Zmc2V0KG5vZGUucmVjZWl2ZXIsIGtpbmQ6IENvZGVQb3NpdGlvbktpbmQuRU5EKSksCiAgICAgICAgU3RlcEtpbmQuQUNDRVNTKTsKICAgIHN0ZXBzLmFkZChub2RlKTsKICAgIHZpc2l0KG5vZGUuc2VsZWN0b3IpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRWYXJpYWJsZVVzZShqcy5WYXJpYWJsZVVzZSBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICB2aXNpdExpdGVyYWxCb29sKGpzLkxpdGVyYWxCb29sIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIHZpc2l0TGl0ZXJhbFN0cmluZyhqcy5MaXRlcmFsU3RyaW5nIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIHZpc2l0TGl0ZXJhbE51bWJlcihqcy5MaXRlcmFsTnVtYmVyIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIHZpc2l0TGl0ZXJhbE51bGwoanMuTGl0ZXJhbE51bGwgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgdmlzaXROYW1lKGpzLk5hbWUgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChqcy5WYXJpYWJsZURlY2xhcmF0aW9uTGlzdCBub2RlKSB7CiAgICB2aXNpdExpc3Qobm9kZS5kZWNsYXJhdGlvbnMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKGpzLlZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgdmlzaXRWYXJpYWJsZUluaXRpYWxpemF0aW9uKGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24gbm9kZSkgewogICAgdmlzaXQobm9kZS5sZWZ0SGFuZFNpZGUpOwogICAgdmlzaXQobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEFzc2lnbm1lbnQoanMuQXNzaWdubWVudCBub2RlKSB7CiAgICB2aXNpdChub2RlLmxlZnRIYW5kU2lkZSk7CiAgICB2aXNpdChub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0SWYoanMuSWYgbm9kZSkgewogICAgc3RhdGVtZW50T2Zmc2V0ID0gZ2V0U3ludGF4T2Zmc2V0KG5vZGUpOwogICAgdmlzaXRTdWJleHByZXNzaW9uKAogICAgICAgIG5vZGUsIG5vZGUuY29uZGl0aW9uLCBzdGF0ZW1lbnRPZmZzZXQsIFN0ZXBLaW5kLklGX0NPTkRJVElPTik7CiAgICBzdGF0ZW1lbnRPZmZzZXQgPSBudWxsOwogICAgdmlzaXQobm9kZS50aGVuLCBCcmFuY2hLaW5kLkNPTkRJVElPTiwgdHJ1ZSk7CiAgICB2aXNpdChub2RlLm90aGVyd2lzZSwgQnJhbmNoS2luZC5DT05ESVRJT04sIGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Rm9yKGpzLkZvciBub2RlKSB7CiAgICBpbnQgb2Zmc2V0ID0gc3RhdGVtZW50T2Zmc2V0ID0gZ2V0U3ludGF4T2Zmc2V0KG5vZGUpOwogICAgc3RhdGVtZW50T2Zmc2V0ID0gb2Zmc2V0OwogICAgbGVmdFRvUmlnaHRPZmZzZXQgPSBudWxsOwogICAgaWYgKG5vZGUuaW5pdCAhPSBudWxsKSB7CiAgICAgIHZpc2l0U3ViZXhwcmVzc2lvbigKICAgICAgICAgIG5vZGUsIG5vZGUuaW5pdCwgZ2V0U3ludGF4T2Zmc2V0KG5vZGUpLCBTdGVwS2luZC5GT1JfSU5JVElBTElaRVIpOwogICAgfQoKICAgIGlmIChub2RlLmNvbmRpdGlvbiAhPSBudWxsKSB7CiAgICAgIHZpc2l0U3ViZXhwcmVzc2lvbihub2RlLCBub2RlLmNvbmRpdGlvbiwgZ2V0U3ludGF4T2Zmc2V0KG5vZGUuY29uZGl0aW9uKSwKICAgICAgICAgIFN0ZXBLaW5kLkZPUl9DT05ESVRJT04pOwogICAgfQoKICAgIG5vdGlmeVB1c2hCcmFuY2goQnJhbmNoS2luZC5MT09QKTsKICAgIHZpc2l0KG5vZGUuYm9keSk7CgogICAgc3RhdGVtZW50T2Zmc2V0ID0gb2Zmc2V0OwogICAgaWYgKG5vZGUudXBkYXRlICE9IG51bGwpIHsKICAgICAgdmlzaXRTdWJleHByZXNzaW9uKAogICAgICAgICAgbm9kZSwgbm9kZS51cGRhdGUsIGdldFN5bnRheE9mZnNldChub2RlLnVwZGF0ZSksIFN0ZXBLaW5kLkZPUl9VUERBVEUpOwogICAgfQoKICAgIG5vdGlmeVBvcEJyYW5jaCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRXaGlsZShqcy5XaGlsZSBub2RlKSB7CiAgICBzdGF0ZW1lbnRPZmZzZXQgPSBnZXRTeW50YXhPZmZzZXQobm9kZSk7CiAgICBpZiAobm9kZS5jb25kaXRpb24gIT0gbnVsbCkgewogICAgICB2aXNpdFN1YmV4cHJlc3Npb24obm9kZSwgbm9kZS5jb25kaXRpb24sIGdldFN5bnRheE9mZnNldChub2RlKSwKICAgICAgICAgIFN0ZXBLaW5kLldISUxFX0NPTkRJVElPTik7CiAgICB9CiAgICBzdGF0ZW1lbnRPZmZzZXQgPSBudWxsOwogICAgbGVmdFRvUmlnaHRPZmZzZXQgPSBudWxsOwoKICAgIHZpc2l0KG5vZGUuYm9keSwgQnJhbmNoS2luZC5MT09QKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RG8oanMuRG8gbm9kZSkgewogICAgc3RhdGVtZW50T2Zmc2V0ID0gZ2V0U3ludGF4T2Zmc2V0KG5vZGUpOwogICAgdmlzaXQobm9kZS5ib2R5KTsKICAgIGlmIChub2RlLmNvbmRpdGlvbiAhPSBudWxsKSB7CiAgICAgIHZpc2l0U3ViZXhwcmVzc2lvbihub2RlLCBub2RlLmNvbmRpdGlvbiwgZ2V0U3ludGF4T2Zmc2V0KG5vZGUuY29uZGl0aW9uKSwKICAgICAgICAgIFN0ZXBLaW5kLkRPX0NPTkRJVElPTik7CiAgICB9CiAgICBzdGF0ZW1lbnRPZmZzZXQgPSBudWxsOwogICAgbGVmdFRvUmlnaHRPZmZzZXQgPSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRCaW5hcnkoanMuQmluYXJ5IG5vZGUpIHsKICAgIHZpc2l0KG5vZGUubGVmdCk7CiAgICB2aXNpdChub2RlLnJpZ2h0KTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VGhpcyhqcy5UaGlzIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIHZpc2l0UmV0dXJuKGpzLlJldHVybiBub2RlKSB7CiAgICBzdGF0ZW1lbnRPZmZzZXQgPSBnZXRTeW50YXhPZmZzZXQobm9kZSk7CiAgICB2aXNpdChub2RlLnZhbHVlKTsKICAgIG5vdGlmeVN0ZXAoCiAgICAgICAgbm9kZSwgZ2V0T2Zmc2V0Rm9yTm9kZShub2RlLCBnZXRTeW50YXhPZmZzZXQobm9kZSkpLCBTdGVwS2luZC5SRVRVUk4pOwogICAgT2Zmc2V0IGV4aXRPZmZzZXQgPSBnZXRPZmZzZXRGb3JOb2RlKAogICAgICAgIG5vZGUsIGdldFN5bnRheE9mZnNldChub2RlLCBraW5kOiBDb2RlUG9zaXRpb25LaW5kLkNMT1NJTkcpKTsKICAgIG5vdGlmeVN0ZXAobm9kZSwgZXhpdE9mZnNldCwgU3RlcEtpbmQuRlVOX0VYSVQpOwogICAgc3RhdGVtZW50T2Zmc2V0ID0gbnVsbDsKICAgIGxlZnRUb1JpZ2h0T2Zmc2V0ID0gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VGhyb3coanMuVGhyb3cgbm9kZSkgewogICAgc3RhdGVtZW50T2Zmc2V0ID0gZ2V0U3ludGF4T2Zmc2V0KG5vZGUpOwogICAgLy8gRG8gbm90IHVzZSBbb2Zmc2V0UG9zaXRpb25dIGZvciB0aGUgc3ViZXhwcmVzc2lvbi4KICAgIG9mZnNldFBvc2l0aW9uID0gbnVsbDsKICAgIHZpc2l0KG5vZGUuZXhwcmVzc2lvbik7CiAgICBub3RpZnlTdGVwKAogICAgICAgIG5vZGUsIGdldE9mZnNldEZvck5vZGUobm9kZSwgZ2V0U3ludGF4T2Zmc2V0KG5vZGUpKSwgU3RlcEtpbmQuVEhST1cpOwogICAgc3RhdGVtZW50T2Zmc2V0ID0gbnVsbDsKICAgIGxlZnRUb1JpZ2h0T2Zmc2V0ID0gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q29udGludWUoanMuQ29udGludWUgbm9kZSkgewogICAgc3RhdGVtZW50T2Zmc2V0ID0gZ2V0U3ludGF4T2Zmc2V0KG5vZGUpOwogICAgbm90aWZ5U3RlcCgKICAgICAgICBub2RlLCBnZXRPZmZzZXRGb3JOb2RlKG5vZGUsIGdldFN5bnRheE9mZnNldChub2RlKSksIFN0ZXBLaW5kLkNPTlRJTlVFKTsKICAgIHN0YXRlbWVudE9mZnNldCA9IG51bGw7CiAgICBsZWZ0VG9SaWdodE9mZnNldCA9IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEJyZWFrKGpzLkJyZWFrIG5vZGUpIHsKICAgIHN0YXRlbWVudE9mZnNldCA9IGdldFN5bnRheE9mZnNldChub2RlKTsKICAgIG5vdGlmeVN0ZXAoCiAgICAgICAgbm9kZSwgZ2V0T2Zmc2V0Rm9yTm9kZShub2RlLCBnZXRTeW50YXhPZmZzZXQobm9kZSkpLCBTdGVwS2luZC5CUkVBSyk7CiAgICBzdGF0ZW1lbnRPZmZzZXQgPSBudWxsOwogICAgbGVmdFRvUmlnaHRPZmZzZXQgPSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRUcnkoanMuVHJ5IG5vZGUpIHsKICAgIHZpc2l0KG5vZGUuYm9keSk7CiAgICB2aXNpdChub2RlLmNhdGNoUGFydCwgQnJhbmNoS2luZC5DQVRDSCk7CiAgICB2aXNpdChub2RlLmZpbmFsbHlQYXJ0LCBCcmFuY2hLaW5kLkZJTkFMTFkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDYXRjaChqcy5DYXRjaCBub2RlKSB7CiAgICB2aXNpdChub2RlLmJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDb25kaXRpb25hbChqcy5Db25kaXRpb25hbCBub2RlKSB7CiAgICB2aXNpdChub2RlLmNvbmRpdGlvbik7CiAgICB2aXNpdChub2RlLnRoZW4sIEJyYW5jaEtpbmQuQ09ORElUSU9OLCB0cnVlKTsKICAgIHZpc2l0KG5vZGUub3RoZXJ3aXNlLCBCcmFuY2hLaW5kLkNPTkRJVElPTiwgZmFsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRQcmVmaXgoanMuUHJlZml4IG5vZGUpIHsKICAgIHZpc2l0KG5vZGUuYXJndW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRQb3N0Zml4KGpzLlBvc3RmaXggbm9kZSkgewogICAgdmlzaXQobm9kZS5hcmd1bWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdE9iamVjdEluaXRpYWxpemVyKGpzLk9iamVjdEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHZpc2l0TGlzdChub2RlLnByb3BlcnRpZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRQcm9wZXJ0eShqcy5Qcm9wZXJ0eSBub2RlKSB7CiAgICB2aXNpdChub2RlLm5hbWUpOwogICAgdmlzaXQobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFJlZ0V4cExpdGVyYWwoanMuUmVnRXhwTGl0ZXJhbCBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICB2aXNpdFN3aXRjaChqcy5Td2l0Y2ggbm9kZSkgewogICAgc3RhdGVtZW50T2Zmc2V0ID0gZ2V0U3ludGF4T2Zmc2V0KG5vZGUpOwogICAgdmlzaXRTdWJleHByZXNzaW9uKAogICAgICAgIG5vZGUsIG5vZGUua2V5LCBnZXRTeW50YXhPZmZzZXQobm9kZSksIFN0ZXBLaW5kLlNXSVRDSF9FWFBSRVNTSU9OKTsKICAgIHN0YXRlbWVudE9mZnNldCA9IG51bGw7CiAgICBsZWZ0VG9SaWdodE9mZnNldCA9IG51bGw7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGUuY2FzZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmlzaXQobm9kZS5jYXNlc1tpXSwgQnJhbmNoS2luZC5DQVNFLCBpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q2FzZShqcy5DYXNlIG5vZGUpIHsKICAgIHZpc2l0KG5vZGUuZXhwcmVzc2lvbik7CiAgICB2aXNpdChub2RlLmJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXREZWZhdWx0KGpzLkRlZmF1bHQgbm9kZSkgewogICAgdmlzaXQobm9kZS5ib2R5KTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0QXJyYXlJbml0aWFsaXplcihqcy5BcnJheUluaXRpYWxpemVyIG5vZGUpIHsKICAgIHZpc2l0TGlzdChub2RlLmVsZW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0QXJyYXlIb2xlKGpzLkFycmF5SG9sZSBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICB2aXNpdExhYmVsZWRTdGF0ZW1lbnQoanMuTGFiZWxlZFN0YXRlbWVudCBub2RlKSB7CiAgICBzdGF0ZW1lbnRPZmZzZXQgPSBnZXRTeW50YXhPZmZzZXQobm9kZSk7CiAgICB2aXNpdChub2RlLmJvZHkpOwogICAgc3RhdGVtZW50T2Zmc2V0ID0gbnVsbDsKICB9CgogIE9mZnNldCBnZXRPZmZzZXRGb3JOb2RlKGpzLk5vZGUgbm9kZSwgaW50IGNvZGVPZmZzZXQpIHsKICAgIGlmIChjb2RlT2Zmc2V0ID09IG51bGwpIHsKICAgICAgQ29kZVBvc2l0aW9uIGNvZGVQb3NpdGlvbiA9IGNvZGVQb3NpdGlvbnNbbm9kZV07CiAgICAgIGlmIChjb2RlUG9zaXRpb24gIT0gbnVsbCkgewogICAgICAgIGNvZGVPZmZzZXQgPSBjb2RlUG9zaXRpb24uc3RhcnRQb3NpdGlvbjsKICAgICAgfQogICAgfQogICAgaWYgKGxlZnRUb1JpZ2h0T2Zmc2V0ICE9IG51bGwgJiYKICAgICAgICBjb2RlT2Zmc2V0ICE9IG51bGwgJiYKICAgICAgICBsZWZ0VG9SaWdodE9mZnNldCA8IGNvZGVPZmZzZXQpIHsKICAgICAgbGVmdFRvUmlnaHRPZmZzZXQgPSBjb2RlT2Zmc2V0OwogICAgfQogICAgaWYgKGxlZnRUb1JpZ2h0T2Zmc2V0ID09IG51bGwpIHsKICAgICAgbGVmdFRvUmlnaHRPZmZzZXQgPSBzdGF0ZW1lbnRPZmZzZXQ7CiAgICB9CiAgICByZXR1cm4gbmV3IE9mZnNldChzdGF0ZW1lbnRPZmZzZXQsIGxlZnRUb1JpZ2h0T2Zmc2V0LCBjb2RlT2Zmc2V0KTsKICB9Cn0KCmNsYXNzIENvdmVyYWdlIHsKICBTZXQ8anMuTm9kZT4gX25vZGVzV2l0aEluZm8gPSBuZXcgU2V0PGpzLk5vZGU+KCk7CiAgaW50IF9ub2Rlc1dpdGhJbmZvQ291bnQgPSAwOwogIFNldDxqcy5Ob2RlPiBfbm9kZXNXaXRob3V0SW5mbyA9IG5ldyBTZXQ8anMuTm9kZT4oKTsKICBpbnQgX25vZGVzV2l0aG91dEluZm9Db3VudCA9IDA7CiAgTWFwPFR5cGUsIGludD4gX25vZGVzV2l0aG91dEluZm9Db3VudEJ5VHlwZSA9IDxUeXBlLCBpbnQ+e307CiAgU2V0PGpzLk5vZGU+IF9ub2Rlc1dpdGhvdXRPZmZzZXQgPSBuZXcgU2V0PGpzLk5vZGU+KCk7CiAgaW50IF9ub2Rlc1dpdGhvdXRPZmZzZXRDb3VudCA9IDA7CgogIHZvaWQgcmVnaXN0ZXJOb2RlV2l0aEluZm8oanMuTm9kZSBub2RlKSB7CiAgICBfbm9kZXNXaXRoSW5mby5hZGQobm9kZSk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyTm9kZVdpdGhvdXRJbmZvKGpzLk5vZGUgbm9kZSkgewogICAgX25vZGVzV2l0aG91dEluZm8uYWRkKG5vZGUpOwogIH0KCiAgdm9pZCByZWdpc3Rlck5vZGVzV2l0aG91dE9mZnNldChqcy5Ob2RlIG5vZGUpIHsKICAgIF9ub2Rlc1dpdGhvdXRPZmZzZXQuYWRkKG5vZGUpOwogIH0KCiAgdm9pZCBjb2xsYXBzZSgpIHsKICAgIF9ub2Rlc1dpdGhJbmZvQ291bnQgKz0gX25vZGVzV2l0aEluZm8ubGVuZ3RoOwogICAgX25vZGVzV2l0aEluZm8uY2xlYXIoKTsKICAgIF9ub2Rlc1dpdGhvdXRPZmZzZXRDb3VudCArPSBfbm9kZXNXaXRob3V0T2Zmc2V0Lmxlbmd0aDsKICAgIF9ub2Rlc1dpdGhvdXRPZmZzZXQuY2xlYXIoKTsKCiAgICBfbm9kZXNXaXRob3V0SW5mb0NvdW50ICs9IF9ub2Rlc1dpdGhvdXRJbmZvLmxlbmd0aDsKICAgIGZvciAoanMuTm9kZSBub2RlIGluIF9ub2Rlc1dpdGhvdXRJbmZvKSB7CiAgICAgIGlmIChub2RlIGlzIGpzLkV4cHJlc3Npb25TdGF0ZW1lbnQpIHsKICAgICAgICBfbm9kZXNXaXRob3V0SW5mb0NvdW50QnlUeXBlLnB1dElmQWJzZW50KAogICAgICAgICAgICBub2RlLmV4cHJlc3Npb24ucnVudGltZVR5cGUsICgpID0+IDApOwogICAgICAgIF9ub2Rlc1dpdGhvdXRJbmZvQ291bnRCeVR5cGVbbm9kZS5leHByZXNzaW9uLnJ1bnRpbWVUeXBlXSsrOwogICAgICB9IGVsc2UgewogICAgICAgIF9ub2Rlc1dpdGhvdXRJbmZvQ291bnRCeVR5cGUucHV0SWZBYnNlbnQobm9kZS5ydW50aW1lVHlwZSwgKCkgPT4gMCk7CiAgICAgICAgX25vZGVzV2l0aG91dEluZm9Db3VudEJ5VHlwZVtub2RlLnJ1bnRpbWVUeXBlXSsrOwogICAgICB9CiAgICB9CiAgICBfbm9kZXNXaXRob3V0SW5mby5jbGVhcigpOwogIH0KCiAgU3RyaW5nIGdldENvdmVyYWdlUmVwb3J0KCkgewogICAgY29sbGFwc2UoKTsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGludCB0b3RhbCA9IF9ub2Rlc1dpdGhJbmZvQ291bnQgKyBfbm9kZXNXaXRob3V0SW5mb0NvdW50OwogICAgaWYgKHRvdGFsID4gMCkgewogICAgICBzYi53cml0ZShfbm9kZXNXaXRoSW5mb0NvdW50KTsKICAgICAgc2Iud3JpdGUoJy8nKTsKICAgICAgc2Iud3JpdGUodG90YWwpOwogICAgICBzYi53cml0ZSgnICgnKTsKICAgICAgc2Iud3JpdGUoKDEwMC4wICogX25vZGVzV2l0aEluZm9Db3VudCAvIHRvdGFsKS50b1N0cmluZ0FzRml4ZWQoMikpOwogICAgICBzYi53cml0ZSgnJSkgbm9kZXMgd2l0aCBpbmZvLicpOwogICAgfSBlbHNlIHsKICAgICAgc2Iud3JpdGUoJ05vIG5vZGVzLicpOwogICAgfQogICAgaWYgKF9ub2Rlc1dpdGhvdXRPZmZzZXRDb3VudCA+IDApIHsKICAgICAgc2Iud3JpdGUoJyAnKTsKICAgICAgc2Iud3JpdGUoX25vZGVzV2l0aG91dE9mZnNldENvdW50KTsKICAgICAgc2Iud3JpdGUoJyBub2RlJyk7CiAgICAgIGlmIChfbm9kZXNXaXRob3V0T2Zmc2V0Q291bnQgPiAxKSB7CiAgICAgICAgc2Iud3JpdGUoJ3MnKTsKICAgICAgfQogICAgICBzYi53cml0ZSgnIHdpdGhvdXQgb2Zmc2V0LicpOwogICAgfQogICAgaWYgKF9ub2Rlc1dpdGhvdXRJbmZvQ291bnQgPiAwKSB7CiAgICAgIHNiLndyaXRlKCdcbk5vZGVzIHdpdGhvdXQgaW5mbyAoJyk7CiAgICAgIHNiLndyaXRlKF9ub2Rlc1dpdGhvdXRJbmZvQ291bnQpOwogICAgICBzYi53cml0ZSgnKSBieSBydW50aW1lIHR5cGU6Jyk7CiAgICAgIExpc3Q8VHlwZT4gdHlwZXMgPSBfbm9kZXNXaXRob3V0SW5mb0NvdW50QnlUeXBlLmtleXMudG9MaXN0KCk7CiAgICAgIHR5cGVzLnNvcnQoKGEsIGIpIHsKICAgICAgICByZXR1cm4gLV9ub2Rlc1dpdGhvdXRJbmZvQ291bnRCeVR5cGVbYV0KICAgICAgICAgICAgLmNvbXBhcmVUbyhfbm9kZXNXaXRob3V0SW5mb0NvdW50QnlUeXBlW2JdKTsKICAgICAgfSk7CgogICAgICB0eXBlcy5mb3JFYWNoKChUeXBlIHR5cGUpIHsKICAgICAgICBpbnQgY291bnQgPSBfbm9kZXNXaXRob3V0SW5mb0NvdW50QnlUeXBlW3R5cGVdOwogICAgICAgIHNiLndyaXRlKCdcbiAnKTsKICAgICAgICBzYi53cml0ZShjb3VudCk7CiAgICAgICAgc2Iud3JpdGUoJyAnKTsKICAgICAgICBzYi53cml0ZSh0eXBlKTsKICAgICAgICBzYi53cml0ZSgnIG5vZGUnKTsKICAgICAgICBpZiAoY291bnQgPiAxKSB7CiAgICAgICAgICBzYi53cml0ZSgncycpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHNiLndyaXRlKCdcbicpOwogICAgfQogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBnZXRDb3ZlcmFnZVJlcG9ydCgpOwp9CgovLy8gW1RyYWNlTGlzdGVuZXJdIHRoYXQgcmVnaXN0ZXJzIFtvblN0ZXBdIGNhbGxiYWNrcyB3aXRoIFtjb3ZlcmFnZV0uCmNsYXNzIENvdmVyYWdlTGlzdGVuZXIgZXh0ZW5kcyBUcmFjZUxpc3RlbmVyIHdpdGggTm9kZVRvU291cmNlSW5mb3JtYXRpb25NaXhpbiB7CiAgZmluYWwgQ292ZXJhZ2UgY292ZXJhZ2U7CiAgQG92ZXJyaWRlCiAgZmluYWwgU291cmNlSW5mb3JtYXRpb25SZWFkZXIgcmVhZGVyOwoKICBDb3ZlcmFnZUxpc3RlbmVyKHRoaXMuY292ZXJhZ2UsIHRoaXMucmVhZGVyKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBvblN0ZXAoanMuTm9kZSBub2RlLCBPZmZzZXQgb2Zmc2V0LCBTdGVwS2luZCBraW5kKSB7CiAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9IGNvbXB1dGVTb3VyY2VJbmZvcm1hdGlvbihub2RlKTsKICAgIGlmIChzb3VyY2VJbmZvcm1hdGlvbiAhPSBudWxsKSB7CiAgICAgIGNvdmVyYWdlLnJlZ2lzdGVyTm9kZVdpdGhJbmZvKG5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgY292ZXJhZ2UucmVnaXN0ZXJOb2RlV2l0aG91dEluZm8obm9kZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIG9uRW5kKGpzLk5vZGUgbm9kZSkgewogICAgY292ZXJhZ2UuY29sbGFwc2UoKTsKICB9Cn0KCi8vLyBbQ29kZVBvc2l0aW9uTWFwXSB0aGF0IHJlZ2lzdGVycyBjYWxscyB3aXRoIFtDb3ZlcmFnZV0uCmNsYXNzIENvZGVQb3NpdGlvbkNvdmVyYWdlIGltcGxlbWVudHMgQ29kZVBvc2l0aW9uTWFwIHsKICBmaW5h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by9wb3NpdGlvbl9pbmZvcm1hdGlvbi5kYXJ0LHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL25hdGl2ZS9qcy5kYXJ0pG0vLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBhcyBqczsKaW1wb3J0ICcuLi91bml2ZXJzZS9zaWRlX2VmZmVjdHMuZGFydCcgc2hvdyBTaWRlRWZmZWN0czsKaW1wb3J0ICdiZWhhdmlvci5kYXJ0JzsKCmNsYXNzIEhhc0NhcHR1cmVkUGxhY2Vob2xkZXJzIGV4dGVuZHMganMuQmFzZVZpc2l0b3IgewogIEhhc0NhcHR1cmVkUGxhY2Vob2xkZXJzLl8oKTsKCiAgc3RhdGljIGJvb2wgY2hlY2soanMuTm9kZSBub2RlKSB7CiAgICBIYXNDYXB0dXJlZFBsYWNlaG9sZGVycyB2aXNpdG9yID0gbmV3IEhhc0NhcHR1cmVkUGxhY2Vob2xkZXJzLl8oKTsKICAgIG5vZGUuYWNjZXB0KHZpc2l0b3IpOwogICAgcmV0dXJuIHZpc2l0b3IuZm91bmQ7CiAgfQoKICBpbnQgZW5jbG9zaW5nRnVuY3Rpb25zID0gMDsKICBib29sIGZvdW5kID0gZmFsc2U7CgogIEBvdmVycmlkZQogIHZpc2l0RnVuKGpzLkZ1biBub2RlKSB7CiAgICArK2VuY2xvc2luZ0Z1bmN0aW9uczsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICAgIC0tZW5jbG9zaW5nRnVuY3Rpb25zOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRJbnRlcnBvbGF0ZWROb2RlKGpzLkludGVycG9sYXRlZE5vZGUgbm9kZSkgewogICAgaWYgKGVuY2xvc2luZ0Z1bmN0aW9ucyA+IDApIHsKICAgICAgZm91bmQgPSB0cnVlOwogICAgfQogIH0KfQoKY2xhc3MgU2lkZUVmZmVjdHNWaXNpdG9yIGV4dGVuZHMganMuQmFzZVZpc2l0b3IgewogIGZpbmFsIFNpZGVFZmZlY3RzIHNpZGVFZmZlY3RzOwogIFNpZGVFZmZlY3RzVmlzaXRvcih0aGlzLnNpZGVFZmZlY3RzKTsKCiAgdm9pZCB2aXNpdChqcy5Ob2RlIG5vZGUpIHsKICAgIG5vZGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExpdGVyYWxFeHByZXNzaW9uKGpzLkxpdGVyYWxFeHByZXNzaW9uIG5vZGUpIHsKICAgIHNpZGVFZmZlY3RzLnNldEFsbFNpZGVFZmZlY3RzKCk7CiAgICBzaWRlRWZmZWN0cy5zZXREZXBlbmRzT25Tb21ldGhpbmcoKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaXRlcmFsU3RhdGVtZW50KGpzLkxpdGVyYWxTdGF0ZW1lbnQgbm9kZSkgewogICAgc2lkZUVmZmVjdHMuc2V0QWxsU2lkZUVmZmVjdHMoKTsKICAgIHNpZGVFZmZlY3RzLnNldERlcGVuZHNPblNvbWV0aGluZygpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEFzc2lnbm1lbnQoanMuQXNzaWdubWVudCBub2RlKSB7CiAgICBzaWRlRWZmZWN0cy5zZXRDaGFuZ2VzU3RhdGljUHJvcGVydHkoKTsKICAgIHNpZGVFZmZlY3RzLnNldENoYW5nZXNJbnN0YW5jZVByb3BlcnR5KCk7CiAgICBzaWRlRWZmZWN0cy5zZXRDaGFuZ2VzSW5kZXgoKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRWYXJpYWJsZUluaXRpYWxpemF0aW9uKGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24gbm9kZSkgewogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENhbGwoanMuQ2FsbCBub2RlKSB7CiAgICBzaWRlRWZmZWN0cy5zZXRBbGxTaWRlRWZmZWN0cygpOwogICAgc2lkZUVmZmVjdHMuc2V0RGVwZW5kc09uU29tZXRoaW5nKCk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QmluYXJ5KGpzLkJpbmFyeSBub2RlKSB7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VGhyb3coanMuVGhyb3cgbm9kZSkgewogICAgLy8gVE9ETyhuZ2VvZmZyYXkpOiBJbmNvcnBvcmF0ZSBhIG1heVRocm93IGZsYWcgaW4gdGhlCiAgICAvLyBbU2lkZUVmZmVjdHNdIGNsYXNzLgogICAgc2lkZUVmZmVjdHMuc2V0QWxsU2lkZUVmZmVjdHMoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXROZXcoanMuTmV3IG5vZGUpIHsKICAgIHNpZGVFZmZlY3RzLnNldEFsbFNpZGVFZmZlY3RzKCk7CiAgICBzaWRlRWZmZWN0cy5zZXREZXBlbmRzT25Tb21ldGhpbmcoKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRQcmVmaXgoanMuUHJlZml4IG5vZGUpIHsKICAgIGlmIChub2RlLm9wID09ICdkZWxldGUnKSB7CiAgICAgIHNpZGVFZmZlY3RzLnNldENoYW5nZXNTdGF0aWNQcm9wZXJ0eSgpOwogICAgICBzaWRlRWZmZWN0cy5zZXRDaGFuZ2VzSW5zdGFuY2VQcm9wZXJ0eSgpOwogICAgICBzaWRlRWZmZWN0cy5zZXRDaGFuZ2VzSW5kZXgoKTsKICAgIH0KICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRWYXJpYWJsZVVzZShqcy5WYXJpYWJsZVVzZSBub2RlKSB7CiAgICBzaWRlRWZmZWN0cy5zZXREZXBlbmRzT25TdGF0aWNQcm9wZXJ0eVN0b3JlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UG9zdGZpeChqcy5Qb3N0Zml4IG5vZGUpIHsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRBY2Nlc3MoanMuUHJvcGVydHlBY2Nlc3Mgbm9kZSkgewogICAgc2lkZUVmZmVjdHMuc2V0RGVwZW5kc09uSW5kZXhTdG9yZSgpOwogICAgc2lkZUVmZmVjdHMuc2V0RGVwZW5kc09uSW5zdGFuY2VQcm9wZXJ0eVN0b3JlKCk7CiAgICBzaWRlRWZmZWN0cy5zZXREZXBlbmRzT25TdGF0aWNQcm9wZXJ0eVN0b3JlKCk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQp9CgovLy8gVGhyb3dCZWhhdmlvclZpc2l0b3IgZ2VuZXJhdGVzIGEgTmF0aXZlVGhyb3dCZWhhdmlvciBkZXNjcmliaW5nIHRoZQovLy8gZXhjZXB0aW9uIGJlaGF2aW9yIG9mIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uLgovLy8KLy8vIFRoZSByZXN1bHQgaXMgc2VtaS1jb25zZXJ2YXRpdmUsIGdpdmluZyByZWFzb25hYmxlIHJlc3VsdHMgZm9yIG1hbnkgc2ltcGxlCi8vLyBKUyBmcmFnbWVudHMuIFRoZSBub24tY29uc2VydmF0aXZlIHBhcnQgaXMgdGhlIGFzc3VtcHRpb24gdGhhdCBiaW5hcnkKLy8vIG9wZXJhdG9ycyBhcmUgdXNlZCBvbiAnZ29vZCcgb3BlcmFuZHMgdGhhdCBkbyBub3QgZm9yY2UgYXJiaXRyYXJ5IGNvZGUgdG8gYmUKLy8vIGV4ZWN1dGVkIHZpYSBjb252ZXJzaW9ucyAodmFsdWVPZigpIGFuZCB0b1N0cmluZygpIG1ldGhvZHMpLgovLy8KLy8vIEluIG1hbnkgY2FzZXMgYSBKUyBmcmFnbWVudCBoYXMgbW9yZSBwcmVjaXNlIGJlaGF2aW9yLiBJbiB0aGVzZSBjYXNlcyB0aGUKLy8vIGJlaGF2aW9yIHNob3VsZCBiZSBkZXNjcmliZWQgYXMgYSBwcm9wZXJ0eSBvZiB0aGUgSlMgZnJhZ21lbnQuIEZvciBleGFtcGxlLAovLy8gT2JqZWN0LmtleXMoIykgaGFzIGEgVHlwZUVycm9yIG9uIG51bGwgLyB1bmRlZmluZWQsIHdoaWNoIGNhbiBvbmx5IGJlIGtub3duCi8vLyBpbiB0aGUgY2FsbGluZyBjb250ZXh0LgovLy8KY2xhc3MgVGhyb3dCZWhhdmlvclZpc2l0b3IgZXh0ZW5kcyBqcy5CYXNlVmlzaXRvcjxOYXRpdmVUaHJvd0JlaGF2aW9yPiB7CiAgVGhyb3dCZWhhdmlvclZpc2l0b3IoKTsKCiAgTmF0aXZlVGhyb3dCZWhhdmlvciBhbmFseXplKGpzLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIHZpc2l0KG5vZGUpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIGNvbWJpbmVkIGJlaGF2aW9yIG9mIHNlcXVlbnRpYWwgZXhlY3V0aW9uIG9mIGNvZGUgaGF2aW5nCiAgLy8vIGJlaGF2aW9yIFtmaXJzdF0gZm9sbG93ZWQgYnkgY29kZSBoYXZpbmcgYmVoYXZpb3IgW3NlY29uZF0uCiAgc3RhdGljIE5hdGl2ZVRocm93QmVoYXZpb3Igc2VxdWVuY2UoCiAgICAgIE5hdGl2ZVRocm93QmVoYXZpb3IgZmlyc3QsIE5hdGl2ZVRocm93QmVoYXZpb3Igc2Vjb25kKSB7CiAgICByZXR1cm4gZmlyc3QudGhlbihzZWNvbmQpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIGNvbWJpbmVkIGJlaGF2aW9yIG9mIGEgY2hvaWNlIGJldHdlZW4gdHdvIHBhdGhzIHdpdGggYmVoYXZpb3JzCiAgLy8vIFtmaXJzdF0gYW5kIFtzZWNvbmRdLgogIHN0YXRpYyBOYXRpdmVUaHJvd0JlaGF2aW9yIGNob2ljZSgKICAgICAgTmF0aXZlVGhyb3dCZWhhdmlvciBmaXJzdCwgTmF0aXZlVGhyb3dCZWhhdmlvciBzZWNvbmQpIHsKICAgIHJldHVybiBmaXJzdC5vcihzZWNvbmQpOwogIH0KCiAgTmF0aXZlVGhyb3dCZWhhdmlvciB2aXNpdChqcy5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiBub2RlLmFjY2VwdCh0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIE5hdGl2ZVRocm93QmVoYXZpb3IgdmlzaXROb2RlKGpzLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIE5hdGl2ZVRocm93QmVoYXZpb3IuTUFZOwogIH0KCiAgQG92ZXJyaWRlCiAgTmF0aXZlVGhyb3dCZWhhdmlvciB2aXNpdExpdGVyYWwoanMuTGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gTmF0aXZlVGhyb3dCZWhhdmlvci5ORVZFUjsKICB9CgogIEBvdmVycmlkZQogIE5hdGl2ZVRocm93QmVoYXZpb3IgdmlzaXRJbnRlcnBvbGF0ZWRFeHByZXNzaW9uKGpzLkludGVycG9sYXRlZE5vZGUgbm9kZSkgewogICAgcmV0dXJuIE5hdGl2ZVRocm93QmVoYXZpb3IuTkVWRVI7CiAgfQoKICBAb3ZlcnJpZGUKICBOYXRpdmVUaHJvd0JlaGF2aW9yIHZpc2l0SW50ZXJwb2xhdGVkU2VsZWN0b3IoanMuSW50ZXJwb2xhdGVkTm9kZSBub2RlKSB7CiAgICByZXR1cm4gTmF0aXZlVGhyb3dCZWhhdmlvci5ORVZFUjsKICB9CgogIEBvdmVycmlkZQogIE5hdGl2ZVRocm93QmVoYXZpb3IgdmlzaXRBcnJheUluaXRpYWxpemVyKGpzLkFycmF5SW5pdGlhbGl6ZXIgbm9kZSkgewogICAgcmV0dXJuIG5vZGUuZWxlbWVudHMubWFwKHZpc2l0KS5mb2xkKE5hdGl2ZVRocm93QmVoYXZpb3IuTkVWRVIsIHNlcXVlbmNlKTsKICB9CgogIEBvdmVycmlkZQogIE5hdGl2ZVRocm93QmVoYXZpb3IgdmlzaXRBcnJheUhvbGUoanMuQXJyYXlIb2xlIG5vZGUpIHsKICAgIHJldHVybiBOYXRpdmVUaHJvd0JlaGF2aW9yLk5FVkVSOwogIH0KCiAgQG92ZXJyaWRlCiAgTmF0aXZlVGhyb3dCZWhhdmlvciB2aXNpdE9iamVjdEluaXRpYWxpemVyKGpzLk9iamVjdEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHJldHVybiBub2RlLnByb3BlcnRpZXMubWFwKHZpc2l0KS5mb2xkKE5hdGl2ZVRocm93QmVoYXZpb3IuTkVWRVIsIHNlcXVlbmNlKTsKICB9CgogIEBvdmVycmlkZQogIE5hdGl2ZVRocm93QmVoYXZpb3IgdmlzaXRQcm9wZXJ0eShqcy5Qcm9wZXJ0eSBub2RlKSB7CiAgICByZXR1cm4gc2VxdWVuY2UodmlzaXQobm9kZS5uYW1lKSwgdmlzaXQobm9kZS52YWx1ZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgTmF0aXZlVGhyb3dCZWhhdmlvciB2aXNpdEFzc2lnbm1lbnQoanMuQXNzaWdubWVudCBub2RlKSB7CiAgICAvLyBUT0RPKHNyYSk6IENhbiB3ZSBtYWtlICIjLnAgPSAjIiBiZSBudWxsKDEpPwogICAgcmV0dXJuIE5hdGl2ZVRocm93QmVoYXZpb3IuTUFZOwogIH0KCiAgQG92ZXJyaWRlCiAgTmF0aXZlVGhyb3dCZWhhdmlvciB2aXNpdENhbGwoanMuQ2FsbCBub2RlKSB7CiAgICBqcy5FeHByZXNzaW9uIHRhcmdldCA9IG5vZGUudGFyZ2V0OwogICAgaWYgKHRhcmdldCBpcyBqcy5Qcm9wZXJ0eUFjY2VzcyAmJiBfaXNGaXJzdEludGVycG9sYXRlZFByb3BlcnR5KHRhcmdldCkpIHsKICAgICAgLy8gIy5mKC4uLik6IEV2YWx1YXRlIHNlbGVjdG9yICdmJywgZGVyZWZlcmVuY2UsIGV2YWx1YXRlIGFyZ3VtZW50cywgYW5kCiAgICAgIC8vIGZpbmFsbHkgY2FsbCB0YXJnZXQuCiAgICAgIE5hdGl2ZVRocm93QmVoYXZpb3IgcmVzdWx0ID0KICAgICAgICAgIHNlcXVlbmNlKHZpc2l0KHRhcmdldC5zZWxlY3RvciksIE5hdGl2ZVRocm93QmVoYXZpb3IuTlVMTF9OU00pOwogICAgICBmb3IgKGpzLkV4cHJlc3Npb24gYXJndW1lbnQgaW4gbm9kZS5hcmd1bWVudHMpIHsKICAgICAgICByZXN1bHQgPSBzZXF1ZW5jZShyZXN1bHQsIHZpc2l0KGFyZ3VtZW50KSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHNlcXVlbmNlKHJlc3VsdCwgTmF0aXZlVGhyb3dCZWhhdmlvci5NQVkpOyAvLyBUYXJnZXQgbWF5IHRocm93LgogICAgfQogICAgcmV0dXJuIE5hdGl2ZVRocm93QmVoYXZpb3IuTUFZOwogIH0KCiAgQG92ZXJyaWRlCiAgTmF0aXZlVGhyb3dCZWhhdmlvciB2aXNpdE5ldyhqcy5OZXcgbm9kZSkgewogICAgLy8gVE9ETyhzcmEpOiBgbmV3IEFycmF5KHgpYCB3aGVyZSBgeGAgaXMgYSBzbWFsbCBudW1iZXIuCiAgICByZXR1cm4gTmF0aXZlVGhyb3dCZWhhdmlvci5NQVk7CiAgfQoKICBAb3ZlcnJpZGUKICBOYXRpdmVUaHJvd0JlaGF2aW9yIHZpc2l0QmluYXJ5KGpzLkJpbmFyeSBub2RlKSB7CiAgICBOYXRpdmVUaHJvd0JlaGF2aW9yIGxlZnQgPSB2aXNpdChub2RlLmxlZnQpOwogICAgTmF0aXZlVGhyb3dCZWhhdmlvciByaWdodCA9IHZpc2l0KG5vZGUucmlnaHQpOwogICAgc3dpdGNoIChub2RlLm9wKSB7CiAgICAgIC8vIFdlIG1ha2UgdGhlIG5vbi1jb25zZXJ2YXRpdmUgYXNzdW1wdGlvbiB0aGF0IHRoZXNlIG9wZXJhdGlvbnMgYXJlIG5vdAogICAgICAvLyB1c2VkIGluIHdheXMgdGhhdCBmb3JjZSBjYWxsaW5nIGFyYml0cmFyeSBjb2RlIHZpYSB2YWx1ZU9mIG9yCiAgICAgIC8vIHRvU3RyaW5nKCkuCiAgICAgIGNhc2UgIioiOgogICAgICBjYXNlICIvIjoKICAgICAgY2FzZSAiJSI6CiAgICAgIGNhc2UgIisiOgogICAgICBjYXNlICItIjoKICAgICAgY2FzZSAiPDwiOgogICAgICBjYXNlICI+PiI6CiAgICAgIGNhc2UgIj4+PiI6CiAgICAgIGNhc2UgIjwiOgogICAgICBjYXNlICI+IjoKICAgICAgY2FzZSAiPD0iOgogICAgICBjYXNlICI+PSI6CiAgICAgIGNhc2UgIj09IjoKICAgICAgY2FzZSAiPT09IjoKICAgICAgY2FzZSAiIT0iOgogICAgICBjYXNlICIhPT0iOgogICAgICBjYXNlICImIjoKICAgICAgY2FzZSAiXiI6CiAgICAgIGNhc2UgInwiOgogICAgICAgIHJldHVybiBzZXF1ZW5jZShsZWZ0LCByaWdodCk7CgogICAgICBjYXNlICcsJzoKICAgICAgICByZXR1cm4gc2VxdWVuY2UobGVmdCwgcmlnaHQpOwoKICAgICAgY2FzZSAiJiYiOgogICAgICBjYXNlICJ8fCI6CiAgICAgICAgcmV0dXJuIGNob2ljZShsZWZ0LCBzZXF1ZW5jZShsZWZ0LCByaWdodCkpOwoKICAgICAgY2FzZSAiaW5zdGFuY2VvZiI6CiAgICAgIGNhc2UgImluIjoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gTmF0aXZlVGhyb3dCZWhhdmlvci5NQVk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBOYXRpdmVUaHJvd0JlaGF2aW9yIHZpc2l0VGhyb3coanMuVGhyb3cgbm9kZSkgewogICAgcmV0dXJuIHNlcXVlbmNlKHZpc2l0KG5vZGUuZXhwcmVzc2lvbiksIE5hdGl2ZVRocm93QmVoYXZpb3IuTUFZKTsKICB9CgogIEBvdmVycmlkZQogIE5hdGl2ZVRocm93QmVoYXZpb3IgdmlzaXRQcmVmaXgoanMuUHJlZml4IG5vZGUpIHsKICAgIGlmIChub2RlLm9wID09ICd0eXBlb2YnICYmIG5vZGUuYXJndW1lbnQgaXMganMuVmFyaWFibGVVc2UpCiAgICAgIHJldHVybiBOYXRpdmVUaHJvd0JlaGF2aW9yLk5FVkVSOwogICAgTmF0aXZlVGhyb3dCZWhhdmlvciByZXN1bHQgPSB2aXNpdChub2RlLmFyZ3VtZW50KTsKICAgIHN3aXRjaCAobm9kZS5vcCkgewogICAgICBjYXNlICcrJzoKICAgICAgY2FzZSAnLSc6CiAgICAgIGNhc2UgJyEnOgogICAgICBjYXNlICd+JzoKICAgICAgY2FzZSAndm9pZCc6CiAgICAgIGNhc2UgJ3R5cGVvZic6CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gTmF0aXZlVGhyb3dCZWhhdmlvci5NQVk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBOYXRpdmVUaHJvd0JlaGF2aW9yIHZpc2l0VmFyaWFibGVVc2UoanMuVmFyaWFibGVVc2Ugbm9kZSkgewogICAgLy8gV2UgY291bGQgZ2V0IGEgUmVmZXJlbmNlRXJyb3IgdW5sZXNzIHRoZSB2YXJpYWJsZSBpcyBpbiBzY29wZS4gVGhlIEFTVAogICAgLy8gY291bGQgZGlzdGluZ3Vpc2ggaW4tc2NvcGUgYW5kIG91dC1vZiBzY29wZSByZWZlcmVuY2VzLiBGb3IgSlMgZnJhZ21lbnRzLAogICAgLy8gdGhlIG9ubHkgdXNlIG9mIFZhcmlhYmxlVXNlIHNob3VsZCBiZSBmb3IgZ2xvYmFsIHJlZmVyZW5jZXMuIENlcnRhaW4KICAgIC8vIGdsb2JhbCBuYW1lcyBhcmUgYWxtb3N0IGNlcnRhaW5seSBub3QgcmVmZXJlbmNlIGVycm9ycywgZS5nICdBcnJheScuCiAgICBzd2l0Y2ggKG5vZGUubmFtZSkgewogICAgICBjYXNlICdBcnJheSc6CiAgICAgIGNhc2UgJ01hdGgnOgogICAgICBjYXNlICdPYmplY3QnOgogICAgICAgIHJldHVybiBOYXRpdmVUaHJvd0JlaGF2aW9yLk5FVkVSOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBOYXRpdmVUaHJvd0JlaGF2aW9yLk1BWTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIE5hdGl2ZVRocm93QmVoYXZpb3IgdmlzaXRBY2Nlc3MoanMuUHJvcGVydHlBY2Nlc3Mgbm9kZSkgewogICAganMuTm9kZSByZWNlaXZlciA9IG5vZGUucmVjZWl2ZXI7CiAgICBOYXRpdmVUaHJvd0JlaGF2aW9yIGZpcnN0ID0gdmlzaXQocmVjZWl2ZXIpOwogICAgTmF0aXZlVGhyb3dCZWhhdmlvciBzZWNvbmQgPSB2aXNpdChub2RlLnNlbGVjdG9yKTsKCiAgICBpZiAoX2lzRmlyc3RJbnRlcnBvbGF0ZWRQcm9wZXJ0eShub2RlKSkgewogICAgICBmaXJzdCA9IE5hdGl2ZVRocm93QmVoYXZpb3IuTlVMTF9OU007CiAgICB9IGVsc2UgewogICAgICBmaXJzdCA9IE5hdGl2ZVRocm93QmVoYXZpb3IuTUFZOwogICAgfQoKICAgIHJldHVybiBzZXF1ZW5jZShmaXJzdCwgc2Vjb25kKTsKICB9CgogIGJvb2wgX2lzRmlyc3RJbnRlcnBvbGF0ZWRQcm9wZXJ0eShqcy5Qcm9wZXJ0eUFjY2VzcyBub2RlKSB7CiAgICBqcy5Ob2RlIHJlY2VpdmVyID0gbm9kZS5yZWNlaXZlcjsKICAgIGlmIChyZWNlaXZlciBpcyBqcy5JbnRlcnBvbGF0ZWRFeHByZXNzaW9uICYmCiAgICAgICAgcmVjZWl2ZXIuaXNQb3NpdGlvbmFsICYmCiAgICAgICAgcmVjZWl2ZXIubmFtZU9yUG9zaXRpb24gPT0gMCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9Cn0KgVQATk48AR45GAE3HwEkRxoaBAEeFgEMGhoeGgQBDDQiFAYEAgEyISgBHRcEAQw7JSkeBAEMOSUpHgQBDC0sLiMeBAEMRR4EAQwhJSkeBAEMJR4EAQwjOxwlBAEMHyUpHgQBDCUfLjAlBh4EAQwvMwQBDCceBAEMLSo1Mx4EAgFIMwRPSlFBBE5QUBwESRoBLhgEAUtCJz8fBAFRHCU/HQQBLB4EAQwwJAQBDDYmBAEMTiYEAQxMJgQBDEhPBAEMOiYEAQxKUQQBDDg6BAEMPDQkBAEMMChPTx4jSjc0CE0GJAQBDC4+JAQBDDQxMxdPRxUQEBAQEBEREhAQEREREhESEBAQJgEQJgERETQBGREPKAYEAQwyRgQBDDRAKDcXEBAQEBMVFw8oBgQBDD5OUUxMGRQTFSoPKAYEAQw8JjE3AS4sDScGASQEAT4mMSEoEwYSBAIBI3BhY2thZ2U6Y29tcGlsZXIvc3JjL25hdGl2ZS9qcy5kYXJ0OnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2lyL3N0YXRpY190eXBlX3Byb3ZpZGVyLmRhcnSCWy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JyBhcyBpcjsKCi8vLyBJbnRlcmZhY2UgZm9yIGFjY2Vzc2luZyBzdGF0aWMgdHlwZXMgb24gZXhwcmVzc2lvbnMuCmFic3RyYWN0IGNsYXNzIFN0YXRpY1R5cGVQcm92aWRlciB7CiAgaXIuRGFydFR5cGUgZ2V0U3RhdGljVHlwZShpci5FeHByZXNzaW9uIG5vZGUpOwp9ChAATk48ASg0LzE1ATkkMQIBMXBhY2thZ2U6Y29tcGlsZXIvc3JjL2lyL3N0YXRpY190eXBlX3Byb3ZpZGVyLmRhcnQ5c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvdW5pdmVyc2UvdGFyZ2V0X2NoZWNrcy5kYXJ0iFcvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLnRhcmdldF9jaGVja3M7CgovLy8gQSBzdW1tYXJ5IG9mIHRoZSBjaGVja3MgcmVxdWlyZWQgd2hlbiBlbnRlcmluZyBhIHRhcmdldCBtZXRob2QuCi8vLwovLy8gVGhlIHRhcmdldCBjaGVja3MgYXJlIHVzZWQgdG8gYW5ub3RhdGUgY2FsbCBzaXRlcyB3aXRoIHRoZSBjaGVja2luZyByZXF1aXJlZAovLy8gZnJvbSB0aGF0IGNhbGwgc2l0ZS4KLy8vCi8vLyBUaGUgdGFyZ2V0IGNhbiBlaXRoZXIgcGVyZm9ybSB3b3JzdC1jYXNlIGNoZWNrcyBvdmVyIGFsbCBjYWxsIHNpdGVzLCBvciBjYW4KLy8vIGJlIGdlbmVyYXRlZCBhcyBtdWx0aXBsZSBlbnRyeSBwb2ludHMgZm9yIGRpZmZlcmVudCBUYXJnZXRDaGVja3MuCi8vLwovLy8gVGhlIFRhcmdldENoZWNrcyBhdCBhIGNhbGwgc2l0ZSBjYW4gYmUgcmVmaW5lZCBieSBhbmFseXNpcy4gIEZvciBleGFtcGxlLAovLy8gdGhlIGdlbmVyaWMgY292YXJpYW50IGNoZWNrIGZvciB3cml0aW5nIGludG8gYSBMaXN0IG1pZ2h0IG5vdCBiZSByZXF1aXJlZAovLy8gd2hlbiBjb3B5aW5nIHZhbHVlcyBmcm9tIGEgTGlzdCBhbGxvY2F0ZWQgd2l0aCB0aGUgc2FtZSB0eXBlIHZhcmlhYmxlIHZhbHVlLgovLy8KLy8vIFRoZSBUYXJnZXRDaGVja3MgYXQgYSBjYWxsIHNpdGUgY2FuIGJlIHVzZWQgdG8gaW5mb3JtIG9wdGltaXphdGlvbnMsIGZvcgovLy8gZXhhbXBsZSwgb25seSBsb3dlcmluZyB0byBzaW1wbGVyIGluc3RydWN0aW9ucyB3aGVuIGdlbmVyaWMgY292YXJpYW50IGNoZWNrCi8vLyBpcyByZXF1aXJlZC4KLy8vCi8vLyBVbnNvdW5kIG1vZGVzIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiBhIHNjb3BlZCBtYW5uZXIgYnkgdXNpbmcgYSBUYXJnZXRDaGVja3MKLy8vIHRoYXQgaGFzIGZld2VyIGNoZWNrcyB0aGFuIHJlcXVpcmVkIChvciBubyBjaGVja3MpIGluIHRoZSB1bnNvdW5kIHJlZ2lvbi4KY2xhc3MgVGFyZ2V0Q2hlY2tzIHsKICAvLyBUeXBpY2FsIG9mIGRpcmVjdCBzdGF0aWMgY2FsbCBzaXRlcy4KICAvLyBUeXBpY2FsIG9mIHN0YXRpYyBtZXRob2QgdGFyZ2V0cyB3aXRoIG5vIHRlYXItb2Zmcy4KICBzdGF0aWMgZmluYWwgVGFyZ2V0Q2hlY2tzIG5vbmUgPSBjb25zdCBUYXJnZXRDaGVja3MuXyhmYWxzZSwgZmFsc2UsIGZhbHNlKTsKCiAgLy8gVHlwaWNhbCBvZiBjbG9zdXJlIGNhbGxzIGFuZCBkeW5hbWljIGNhbGxzLgogIHN0YXRpYyBmaW5hbCBUYXJnZXRDaGVja3MgZHluYW1pY0NoZWNrcyA9CiAgICAgIGNvbnN0IFRhcmdldENoZWNrcy5fKHRydWUsIHRydWUsIHRydWUpOwoKICAvLyBUeXBpY2FsIG9mIG1ldGhvZCBjYWxscy4KICBzdGF0aWMgZmluYWwgVGFyZ2V0Q2hlY2tzIGNvdmFyaWFudENoZWNrcyA9CiAgICAgIGNvbnN0IFRhcmdldENoZWNrcy5fKGZhbHNlLCB0cnVlLCBmYWxzZSk7CgogIC8vIFRPRE8oc3JhKTogVGhpcyBjYW4gYmUgbW9yZSBmaW5lLWdyYWluZWQsIHRhbGtpbmcgYWJvdXQgaW5kaXZpZHVhbAogIC8vIHBhcmFtZXRlcnMuCiAgZmluYWwgYm9vbCBfY2hlY2tPdGhlclBhcmFtZXRlcnM7CiAgZmluYWwgYm9vbCBfY2hlY2tDb3ZhcmlhbnRQYXJhbWV0ZXJzOwogIGZpbmFsIGJvb2wgX2NoZWNrVHlwZVBhcmFtZXRlcnM7CiAgY29uc3QgVGFyZ2V0Q2hlY2tzLl8oCiAgICB0aGlzLl9jaGVja090aGVyUGFyYW1ldGVycywKICAgIHRoaXMuX2NoZWNrQ292YXJpYW50UGFyYW1ldGVycywKICAgIHRoaXMuX2NoZWNrVHlwZVBhcmFtZXRlcnMsCiAgKTsKCiAgYm9vbCBnZXQgY2hlY2tUeXBlUGFyYW1ldGVycyA9PiBfY2hlY2tUeXBlUGFyYW1ldGVyczsKICBib29sIGdldCBjaGVja0NvdmFyaWFudFBhcmFtZXRlcnMgPT4gX2NoZWNrQ292YXJpYW50UGFyYW1ldGVyczsKICBib29sIGdldCBjaGVja0FsbFBhcmFtZXRlcnMgPT4gX2NoZWNrT3RoZXJQYXJhbWV0ZXJzOwp9CjYATk48AR8BRARRGQRQRgROTlEETVARBFBOFSo5TgExLC4BHi4wAUgRJCgjGCAkHwUBOEI4AgEwcGFja2FnZTpjb21waWxlci9zcmMvdW5pdmVyc2UvdGFyZ2V0X2NoZWNrcy5kYXJ0M3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3NzYS9qdW1wX2hhbmRsZXIuZGFydJ8ULy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2p1bXBzLmRhcnQnOwppbXBvcnQgJy4uL2lvL3NvdXJjZV9pbmZvcm1hdGlvbi5kYXJ0JzsKCmltcG9ydCAnZ3JhcGhfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdsb2NhbHNfaGFuZGxlci5kYXJ0JzsKaW1wb3J0ICdub2Rlcy5kYXJ0JzsKCi8vLyBBIHNpbmdsZSBicmVhay9jb250aW51ZSBpbnN0cnVjdGlvbi4KY2xhc3MgX0p1bXBIYW5kbGVyRW50cnkgewogIGZpbmFsIEhKdW1wIGp1bXBJbnN0cnVjdGlvbjsKICBmaW5hbCBMb2NhbHNIYW5kbGVyIGxvY2FsczsKICBib29sIGlzQnJlYWsoKSA9PiBqdW1wSW5zdHJ1Y3Rpb24gaXMgSEJyZWFrOwogIGJvb2wgaXNDb250aW51ZSgpID0+IGp1bXBJbnN0cnVjdGlvbiBpcyBIQ29udGludWU7CiAgX0p1bXBIYW5kbGVyRW50cnkodGhpcy5qdW1wSW5zdHJ1Y3Rpb24sIHRoaXMubG9jYWxzKTsKfQoKYWJzdHJhY3QgY2xhc3MgSnVtcEhhbmRsZXIgewogIGZhY3RvcnkgSnVtcEhhbmRsZXIoR3JhcGhCdWlsZGVyIGJ1aWxkZXIsIEp1bXBUYXJnZXQgdGFyZ2V0KSB7CiAgICByZXR1cm4gbmV3IFRhcmdldEp1bXBIYW5kbGVyKGJ1aWxkZXIsIHRhcmdldCk7CiAgfQogIHZvaWQgZ2VuZXJhdGVCcmVhayhTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgW0xhYmVsRGVmaW5pdGlvbiBsYWJlbF0pOwogIHZvaWQgZ2VuZXJhdGVDb250aW51ZShTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgW0xhYmVsRGVmaW5pdGlvbiBsYWJlbF0pOwogIHZvaWQgZm9yRWFjaEJyZWFrKHZvaWQgYWN0aW9uKEhCcmVhayBpbnN0cnVjdGlvbiwgTG9jYWxzSGFuZGxlciBsb2NhbHMpKTsKICB2b2lkIGZvckVhY2hDb250aW51ZSgKICAgICAgdm9pZCBhY3Rpb24oSENvbnRpbnVlIGluc3RydWN0aW9uLCBMb2NhbHNIYW5kbGVyIGxvY2FscykpOwogIGJvb2wgaGFzQW55Q29udGludWUoKTsKICBib29sIGhhc0FueUJyZWFrKCk7CiAgdm9pZCBjbG9zZSgpOwogIGZpbmFsIEp1bXBUYXJnZXQgdGFyZ2V0OwogIExpc3Q8TGFiZWxEZWZpbml0aW9uPiBnZXQgbGFiZWxzOwp9CgovLy8gSnVtcCBoYW5kbGVyIHVzZWQgdG8gYXZvaWQgbnVsbCBjaGVja3Mgd2hlbiBhIHRhcmdldCBpc24ndCB1c2VkIGFzIHRoZQovLy8gdGFyZ2V0IG9mIGEgYnJlYWssIGFuZCB0aGVyZWZvcmUgZG9lc24ndCBuZWVkIGEgYnJlYWsgaGFuZGxlciBhc3NvY2lhdGVkCi8vLyB3aXRoIGl0LgpjbGFzcyBOdWxsSnVtcEhhbmRsZXIgaW1wbGVtZW50cyBKdW1wSGFuZGxlciB7CiAgZmluYWwgRGlhZ25vc3RpY1JlcG9ydGVyIHJlcG9ydGVyOwoKICBOdWxsSnVtcEhhbmRsZXIodGhpcy5yZXBvcnRlcik7CgogIEBvdmVycmlkZQogIHZvaWQgZ2VuZXJhdGVCcmVhayhTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgW0xhYmVsRGVmaW5pdGlvbiBsYWJlbF0pIHsKICAgIHJlcG9ydGVyLmludGVybmFsRXJyb3IoQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICAnTnVsbEp1bXBIYW5kbGVyLmdlbmVyYXRlQnJlYWsgc2hvdWxkIG5vdCBiZSBjYWxsZWQuJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGdlbmVyYXRlQ29udGludWUoU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIFtMYWJlbERlZmluaXRpb24gbGFiZWxdKSB7CiAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgJ051bGxKdW1wSGFuZGxlci5nZW5lcmF0ZUNvbnRpbnVlIHNob3VsZCBub3QgYmUgY2FsbGVkLicpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoQnJlYWsoRnVuY3Rpb24gaWdub3JlZCkge30KICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hDb250aW51ZShGdW5jdGlvbiBpZ25vcmVkKSB7fQogIEBvdmVycmlkZQogIHZvaWQgY2xvc2UoKSB7fQogIEBvdmVycmlkZQogIGJvb2wgaGFzQW55Q29udGludWUoKSA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBib29sIGhhc0FueUJyZWFrKCkgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIExpc3Q8TGFiZWxEZWZpbml0aW9uPiBnZXQgbGFiZWxzID0+IGNvbnN0IDxMYWJlbERlZmluaXRpb24+W107CiAgQG92ZXJyaWRlCiAgSnVtcFRhcmdldCBnZXQgdGFyZ2V0ID0+IG51bGw7Cn0KCi8vLyBKdW1wIGhhbmRsZXIgdGhhdCByZWNvcmRzIGJyZWFrcyB1bnRpbCBhIHRhcmdldCBibG9jayBpcyBhdmFpbGFibGUuCi8vLwovLy8gQnJlYWtzIGFyZSBhbHdheXMgZm9yd2FyZCBqdW1wcy4gQ29udGludWVzIGluIGxvb3BzIGFyZSBpbXBsZW1lbnRlZCBhcwovLy8gYnJlYWtzIG9mIHRoZSBib2R5LiBDb250aW51ZXMgaW4gc3dpdGNoZXMgaXMgY3VycmVudGx5IG5vdCBoYW5kbGVkLgpjbGFzcyBUYXJnZXRKdW1wSGFuZGxlciBpbXBsZW1lbnRzIEp1bXBIYW5kbGVyIHsKICBmaW5hbCBHcmFwaEJ1aWxkZXIgYnVpbGRlcjsKICBAb3ZlcnJpZGUKICBmaW5hbCBKdW1wVGFyZ2V0IHRhcmdldDsKICBmaW5hbCBMaXN0PF9KdW1wSGFuZGxlckVudHJ5PiBqdW1wczsKCiAgVGFyZ2V0SnVtcEhhbmRsZXIoR3JhcGhCdWlsZGVyIGJ1aWxkZXIsIHRoaXMudGFyZ2V0KQogICAgICA6IHRoaXMuYnVpbGRlciA9IGJ1aWxkZXIsCiAgICAgICAganVtcHMgPSA8X0p1bXBIYW5kbGVyRW50cnk+W10gewogICAgYXNzZXJ0KGJ1aWxkZXIuanVtcFRhcmdldHNbdGFyZ2V0XSA9PSBudWxsKTsKICAgIGJ1aWxkZXIuanVtcFRhcmdldHNbdGFyZ2V0XSA9IHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGdlbmVyYXRlQnJlYWsoU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIFtMYWJlbERlZmluaXRpb24gbGFiZWxdKSB7CiAgICBISW5zdHJ1Y3Rpb24gYnJlYWtJbnN0cnVjdGlvbjsKICAgIGlmIChsYWJlbCA9PSBudWxsKSB7CiAgICAgIGJyZWFrSW5zdHJ1Y3Rpb24gPQogICAgICAgICAgbmV3IEhCcmVhayhidWlsZGVyLmFic3RyYWN0VmFsdWVEb21haW4sIHRhcmdldCwgc291cmNlSW5mb3JtYXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgYnJlYWtJbnN0cnVjdGlvbiA9IG5ldyBIQnJlYWsudG9MYWJlbCgKICAgICAgICAgIGJ1aWxkZXIuYWJzdHJhY3RWYWx1ZURvbWFpbiwgbGFiZWwsIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0KICAgIExvY2Fsc0hhbmRsZXIgbG9jYWxzID0gbmV3IExvY2Fsc0hhbmRsZXIuZnJvbShidWlsZGVyLmxvY2Fsc0hhbmRsZXIpOwogICAgYnVpbGRlci5jbG9zZShicmVha0luc3RydWN0aW9uKTsKICAgIGp1bXBzLmFkZChuZXcgX0p1bXBIYW5kbGVyRW50cnkoYnJlYWtJbnN0cnVjdGlvbiwgbG9jYWxzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGdlbmVyYXRlQ29udGludWUoU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIFtMYWJlbERlZmluaXRpb24gbGFiZWxdKSB7CiAgICBISW5zdHJ1Y3Rpb24gY29udGludWVJbnN0cnVjdGlvbjsKICAgIGlmIChsYWJlbCA9PSBudWxsKSB7CiAgICAgIGNvbnRpbnVlSW5zdHJ1Y3Rpb24gPQogICAgICAgICAgbmV3IEhDb250aW51ZShidWlsZGVyLmFic3RyYWN0VmFsdWVEb21haW4sIHRhcmdldCwgc291cmNlSW5mb3JtYXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgY29udGludWVJbnN0cnVjdGlvbiA9IG5ldyBIQ29udGludWUudG9MYWJlbCgKICAgICAgICAgIGJ1aWxkZXIuYWJzdHJhY3RWYWx1ZURvbWFpbiwgbGFiZWwsIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgLy8gU3dpdGNoIGNhc2UgY29udGludWUgc3RhdGVtZW50cyBtdXN0IGJlIGhhbmRsZWQgYnkgdGhlCiAgICAgIC8vIFtTd2l0Y2hDYXNlSnVtcEhhbmRsZXJdLgogICAgICBhc3NlcnQoIWxhYmVsLnRhcmdldC5pc1N3aXRjaENhc2UpOwogICAgfQogICAgTG9jYWxzSGFuZGxlciBsb2NhbHMgPSBuZXcgTG9jYWxzSGFuZGxlci5mcm9tKGJ1aWxkZXIubG9jYWxzSGFuZGxlcik7CiAgICBidWlsZGVyLmNsb3NlKGNvbnRpbnVlSW5zdHJ1Y3Rpb24pOwogICAganVtcHMuYWRkKG5ldyBfSnVtcEhhbmRsZXJFbnRyeShjb250aW51ZUluc3RydWN0aW9uLCBsb2NhbHMpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaEJyZWFrKEZ1bmN0aW9uIGFjdGlvbikgewogICAgZm9yIChfSnVtcEhhbmRsZXJFbnRyeSBlbnRyeSBpbiBqdW1wcykgewogICAgICBpZiAoZW50cnkuaXNCcmVhaygpKSBhY3Rpb24oZW50cnkuanVtcEluc3RydWN0aW9uLCBlbnRyeS5sb2NhbHMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoQ29udGludWUoRnVuY3Rpb24gYWN0aW9uKSB7CiAgICBmb3IgKF9KdW1wSGFuZGxlckVudHJ5IGVudHJ5IGluIGp1bXBzKSB7CiAgICAgIGlmIChlbnRyeS5pc0NvbnRpbnVlKCkpIGFjdGlvbihlbnRyeS5qdW1wSW5zdHJ1Y3Rpb24sIGVudHJ5LmxvY2Fscyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGhhc0FueUNvbnRpbnVlKCkgewogICAgZm9yIChfSnVtcEhhbmRsZXJFbnRyeSBlbnRyeSBpbiBqdW1wcykgewogICAgICBpZiAoZW50cnkuaXNDb250aW51ZSgpKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaGFzQW55QnJlYWsoKSB7CiAgICBmb3IgKF9KdW1wSGFuZGxlckVudHJ5IGVudHJ5IGluIGp1bXBzKSB7CiAgICAgIGlmIChlbnRyeS5pc0JyZWFrKCkpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjbG9zZSgpIHsKICAgIC8vIFRoZSBtYXBwaW5nIGZyb20gVGFyZ2V0RWxlbWVudCB0byBKdW1wSGFuZGxlciBpcyBubyBsb25nZXIgbmVlZGVkLgogICAgYnVpbGRlci5qdW1wVGFyZ2V0cy5yZW1vdmUodGFyZ2V0KTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8TGFiZWxEZWZpbml0aW9uPiBnZXQgbGFiZWxzIHsKICAgIExpc3Q8TGFiZWxEZWZpbml0aW9uPiByZXN1bHQgPSBudWxsOwogICAgZm9yIChMYWJlbERlZmluaXRpb24gZWxlbWVudCBpbiB0YXJnZXQubGFiZWxzKSB7CiAgICAgIHJlc3VsdCA/Pz0gPExhYmVsRGVmaW5pdGlvbj5bXTsKICAgICAgcmVzdWx0LmFkZChlbGVtZW50KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQgPz8gY29uc3QgPExhYmVsRGVmaW5pdGlvbj5bXTsKICB9Cn0KCi8vLyBTcGVjaWFsIFtKdW1wSGFuZGxlcl0gaW1wbGVtZW50YXRpb24gdXNlZCB0byBoYW5kbGUgY29udGludWUgc3RhdGVtZW50cwovLy8gdGFyZ2V0aW5nIHN3aXRjaCBjYXNlcy4KYWJzdHJhY3QgY2xhc3MgU3dpdGNoQ2FzZUp1bXBIYW5kbGVyIGV4dGVuZHMgVGFyZ2V0SnVtcEhhbmRsZXIgewogIC8vLyBNYXAgZnJvbSBzd2l0Y2ggY2FzZSB0YXJnZXRzIHRvIGluZGljZXMgdXNlZCB0byBlbmNvZGUgdGhlIGZsb3cgb2YgdGhlCiAgLy8vIHN3aXRjaCBjYXNlIGxvb3AuCiAgZmluYWwgTWFwPEp1bXBUYXJnZXQsIGludD4gdGFyZ2V0SW5kZXhNYXAgPSBuZXcgTWFwPEp1bXBUYXJnZXQsIGludD4oKTsKCiAgU3dpdGNoQ2FzZUp1bXBIYW5kbGVyKEdyYXBoQnVpbGRlciBidWlsZGVyLCBKdW1wVGFyZ2V0IHRhcmdldCkKICAgICAgOiBzdXBlcihidWlsZGVyLCB0YXJnZXQpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGdlbmVyYXRlQnJlYWsoU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIFtMYWJlbERlZmluaXRpb24gbGFiZWxdKSB7CiAgICBpZiAobGFiZWwgPT0gbnVsbCkgewogICAgICAvLyBDcmVhdGVzIGEgc3BlY2lhbCBicmVhayBpbnN0cnVjdGlvbiBmb3IgdGhlIHN5bnRoZXRpYyBsb29wIGdlbmVyYXRlZAogICAgICAvLyBmb3IgYSBzd2l0Y2ggc3RhdGVtZW50IHdpdGggY29udGludWUgc3RhdGVtZW50cy4gU2VlCiAgICAgIC8vIFtTc2FGcm9tQXN0TWl4aW4uYnVpbGRDb21wbGV4U3dpdGNoU3RhdGVtZW50XSBmb3IgZGV0YWlsLgoKICAgICAgSEluc3RydWN0aW9uIGJyZWFrSW5zdHJ1Y3Rpb24gPSBuZXcgSEJyZWFrKAogICAgICAgICAgYnVpbGRlci5hYnN0cmFjdFZhbHVlRG9tYWluLCB0YXJnZXQsIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICAgICAgYnJlYWtTd2l0Y2hDb250aW51ZUxvb3A6IHRydWUpOwogICAgICBMb2NhbHNIYW5kbGVyIGxvY2FscyA9IG5ldyBMb2NhbHNIYW5kbGVyLmZyb20oYnVpbGRlci5sb2NhbHNIYW5kbGVyKTsKICAgICAgYnVpbGRlci5jbG9zZShicmVha0luc3RydWN0aW9uKTsKICAgICAganVtcHMuYWRkKG5ldyBfSnVtcEhhbmRsZXJFbnRyeShicmVha0luc3RydWN0aW9uLCBsb2NhbHMpKTsKICAgIH0gZWxzZSB7CiAgICAgIHN1cGVyLmdlbmVyYXRlQnJlYWsoc291cmNlSW5mb3JtYXRpb24sIGxhYmVsKTsKICAgIH0KICB9CgogIGJvb2wgaXNDb250aW51ZVRvU3dpdGNoQ2FzZShMYWJlbERlZmluaXRpb24gbGFiZWwpIHsKICAgIHJldHVybiBsYWJlbCAhPSBudWxsICYmIHRhcmdldEluZGV4TWFwLmNvbnRhaW5zS2V5KGxhYmVsLnRhcmdldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGdlbmVyYXRlQ29udGludWUoU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIFtMYWJlbERlZmluaXRpb24gbGFiZWxdKSB7CiAgICBpZiAoaXNDb250aW51ZVRvU3dpdGNoQ2FzZShsYWJlbCkpIHsKICAgICAgLy8gQ3JlYXRlcyB0aGUgc3BlY2lhbCBpbnN0cnVjdGlvbnMgJ2xhYmVsID0gaTsgY29udGludWUgbDsnIHVzZWQgaW4KICAgICAgLy8gc3dpdGNoIHN0YXRlbWVudHMgd2l0aCBjb250aW51ZSBzdGF0ZW1lbnRzLiBTZWUKICAgICAgLy8gW1NzYUZyb21Bc3RNaXhpbi5idWlsZENvbXBsZXhTd2l0Y2hTdGF0ZW1lbnRdIGZvciBkZXRhaWwuCgogICAgICBhc3NlcnQobGFiZWwgIT0gbnVsbCk7CiAgICAgIEhJbnN0cnVjdGlvbiB2YWx1ZSA9IGJ1aWxkZXIuZ3JhcGgKICAgICAgICAgIC5hZGRDb25zdGFudEludCh0YXJnZXRJbmRleE1hcFtsYWJlbC50YXJnZXRdLCBidWlsZGVyLmNsb3NlZFdvcmxkKTsKICAgICAgYnVpbGRlci5sb2NhbHNIYW5kbGVyLnVwZGF0ZUxvY2FsKHRhcmdldCwgdmFsdWUpOwoKICAgICAgYXNzZXJ0KGxhYmVsLnRhcmdldC5sYWJlbHMuY29udGFpbnMobGFiZWwpKTsKICAgICAgSEluc3RydWN0aW9uIGNvbnRpbnVlSW5zdHJ1Y3Rpb24gPQogICAgICAgICAgbmV3IEhDb250aW51ZShidWlsZGVyLmFic3RyYWN0VmFsdWVEb21haW4sIHRhcmdldCwgc291cmNlSW5mb3JtYXRpb24pOwogICAgICBMb2NhbHNIYW5kbGVyIGxvY2FscyA9IG5ldyBMb2NhbHNIYW5kbGVyLmZyb20oYnVpbGRlci5sb2NhbHNIYW5kbGVyKTsKICAgICAgYnVpbGRlci5jbG9zZShjb250aW51ZUluc3RydWN0aW9uKTsKICAgICAganVtcHMuYWRkKG5ldyBfSnVtcEhhbmRsZXJFbnRyeShjb250aW51ZUluc3RydWN0aW9uLCBsb2NhbHMpKTsKICAgIH0gZWxzZSB7CiAgICAgIHN1cGVyLmdlbmVyYXRlQ29udGludWUoc291cmNlSW5mb3JtYXRpb24sIGxhYmVsKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2xvc2UoKSB7CiAgICAvLyBUaGUgbWFwcGluZyBmcm9tIFRhcmdldEVsZW1lbnQgdG8gSnVtcEhhbmRsZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KICAgIGZvciAoSnVtcFRhcmdldCB0YXJnZXQgaW4gdGFyZ2V0SW5kZXhNYXAua2V5cykgewogICAgICBidWlsZGVyLmp1bXBUYXJnZXRzLnJlbW92ZSh0YXJnZXQpOwogICAgfQogICAgc3VwZXIuY2xvc2UoKTsKICB9Cn0KgPUATk48ARkhKAEdHhUBKRofHi81OAIBHUEzBDogPSBMGEEZFhAbJAIBS00NLyUBIgEMOiE2QAQBDD0hNkMEAQwpDCwMEgwiDB8BDEEMIQIBSARLSDEeDBsnATcgKDEoBAEMOiEjGRlODS1CBkolQAQBDD0hJhkcUQ0zQkAiKgZKKEMEAQwnLUgGBAEMKi1LBgQBDBotKwYSBAEMFy0oBhIEAQwRSigEAQwlKTUmGwYwBAIBTBxBTRhKAUEgAQw6IRlOPkMBMkIqTCdCDTUGBAE3RgQBDD0hKUs5QwEdKU44ATMpUUwqRQ04BgQBDBFKNSoGEwQCASpwYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2EvanVtcF9oYW5kbGVyLmRhcnQ8c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvc3NhL2tlcm5lbF9zdHJpbmdfYnVpbGRlci5kYXJ0iWMvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICdidWlsZGVyX2tlcm5lbC5kYXJ0JzsKaW1wb3J0ICdub2Rlcy5kYXJ0JzsKCi8vLyBWaXNpdHMgYW5kIGNvbmNhdGVuYXRlcyB0aGUgZXhwcmVzc2lvbnMgaW4gYSBzdHJpbmcgY29uY2F0ZW5hdGlvbi4KY2xhc3MgS2VybmVsU3RyaW5nQnVpbGRlciBleHRlbmRzIGlyLlZpc2l0b3IgewogIGZpbmFsIEtlcm5lbFNzYUdyYXBoQnVpbGRlciBidWlsZGVyOwoKICAvLy8gVGhlIHN0cmluZyB2YWx1ZSBnZW5lcmF0ZWQgc28gZmFyLgogIEhJbnN0cnVjdGlvbiByZXN1bHQgPSBudWxsOwoKICBLZXJuZWxTdHJpbmdCdWlsZGVyKHRoaXMuYnVpbGRlcik7CgogIEBvdmVycmlkZQogIHZvaWQgZGVmYXVsdE5vZGUoaXIuTm9kZSBub2RlKSB7CiAgICBmYWlsZWRBdChDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLCAnVW5leHBlY3RlZCBub2RlOiAkbm9kZScpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBkZWZhdWx0RXhwcmVzc2lvbihpci5FeHByZXNzaW9uIG5vZGUpIHsKICAgIG5vZGUuYWNjZXB0KGJ1aWxkZXIpOwogICAgSEluc3RydWN0aW9uIGV4cHJlc3Npb24gPSBidWlsZGVyLnBvcCgpOwoKICAgIC8vIFdlIHdhbnQgdG8gdXNlIEhTdHJpbmdpZnkgd2hlbjoKICAgIC8vICAgMS4gVGhlIHZhbHVlIGlzIGtub3duIHRvIGJlIGEgcHJpbWl0aXZlIHR5cGUsIGJlY2F1c2UgaXQgbWlnaHQgZ2V0CiAgICAvLyAgICAgIGNvbnN0YW50LWZvbGRlZCBhbmQgY29kZWdlbiBoYXMgc29tZSB0cmlja3Mgd2l0aCBKYXZhU2NyaXB0CiAgICAvLyAgICAgIGNvbnZlcnNpb25zLgogICAgLy8gICAyLiBUaGUgdmFsdWUgY2FuIGJlIHByaW1pdGl2ZSwgYmVjYXVzZSB0aGUgbGlicmFyeSBzdHJpbmdpZmllciBoYXMKICAgIC8vICAgICAgZmFzdC1wYXRoIGNvZGUgZm9yIG1vc3QgcHJpbWl0aXZlcy4KICAgIGlmIChleHByZXNzaW9uLmlzUHJpbWl0aXZlKGJ1aWxkZXIuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNQb3RlbnRpYWxseVRydWUpIHsKICAgICAgYXBwZW5kKHN0cmluZ2lmeShleHByZXNzaW9uKSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBUT0RPKGVmb3J0dW5hKTogSWYgd2UgZGVjaWRlIHRvIGRvIGlubGluaW5nIGJlZm9yZSBmaW5pc2hpbmcgY29uc3RydWN0aW5nCiAgICAvLyB0aGUgY29udHJvbCBmbG93IGdyYXBoLCB3ZSdkIHdhbnQgdG8gZG8gdGhlIG9wdGltaXphdGlvbiBvZgogICAgLy8gY2FsbGluZyB0b1N0cmluZyBoZXJlIGlmIHRoZSB0eXBlIGlzIHByb3ZhYmx5IGEgc3RyaW5nIHJhdGhlciB0aGFuIGluIHRoZQogICAgLy8gb3B0aW1pemF0aW9uIHBoYXNlICh3aGljaCBpcyB3aGVyZSB3ZSBjdXJyZW50bHkgZG8gaXQpLgoKICAgIGFwcGVuZChzdHJpbmdpZnkoZXhwcmVzc2lvbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oaXIuU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICB2b2lkIGFwcGVuZChISW5zdHJ1Y3Rpb24gZXhwcmVzc2lvbikgewogICAgcmVzdWx0ID0gKHJlc3VsdCA9PSBudWxsKSA/IGV4cHJlc3Npb24gOiBjb25jYXQocmVzdWx0LCBleHByZXNzaW9uKTsKICB9CgogIEhJbnN0cnVjdGlvbiBjb25jYXQoSEluc3RydWN0aW9uIGxlZnQsIEhJbnN0cnVjdGlvbiByaWdodCkgewogICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0KICAgICAgICBuZXcgSFN0cmluZ0NvbmNhdChsZWZ0LCByaWdodCwgYnVpbGRlci5hYnN0cmFjdFZhbHVlRG9tYWluLnN0cmluZ1R5cGUpOwogICAgYnVpbGRlci5hZGQoaW5zdHJ1Y3Rpb24pOwogICAgcmV0dXJuIGluc3RydWN0aW9uOwogIH0KCiAgSEluc3RydWN0aW9uIHN0cmluZ2lmeShISW5zdHJ1Y3Rpb24gZXhwcmVzc2lvbikgewogICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0KICAgICAgICBuZXcgSFN0cmluZ2lmeShleHByZXNzaW9uLCBidWlsZGVyLmFic3RyYWN0VmFsdWVEb21haW4uc3RyaW5nVHlwZSkKICAgICAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBleHByZXNzaW9uLnNvdXJjZUluZm9ybWF0aW9uOwogICAgYnVpbGRlci5hZGQoaW5zdHJ1Y3Rpb24pOwogICAgcmV0dXJuIGluc3RydWN0aW9uOwogIH0KfQpKAE5OPAEoARkeFQFHLycBKR4BJQEMI0MEAQwvGi0BJ0xIGUwwUSUOBgFRQ1E/ASMEAQw/HgQBKUkEAT8fUB4YBAE0H0s+HhgEAgEzcGFja2FnZTpjb21waWxlci9zcmMvc3NhL2tlcm5lbF9zdHJpbmdfYnVpbGRlci5kYXJ0NXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3NzYS9sb2NhbHNfaGFuZGxlci5kYXJ0wABxsS8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uL2Nsb3N1cmUuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2luZmVycmVyL2Fic3RyYWN0X3ZhbHVlX2RvbWFpbi5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pby9zb3VyY2VfaW5mb3JtYXRpb24uZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9uYXRpdmVfZGF0YS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2ludGVyY2VwdG9yX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vanNfbW9kZWwvY2xvc3VyZS5kYXJ0JyBzaG93IEpSZWNvcmRGaWVsZCwgSkNsb3N1cmVGaWVsZDsKaW1wb3J0ICcuLi9qc19tb2RlbC9sb2NhbHMuZGFydCcgc2hvdyBKTG9jYWw7CmltcG9ydCAnLi4vd29ybGQuZGFydCcgc2hvdyBKQ2xvc2VkV29ybGQ7CgppbXBvcnQgJ2dyYXBoX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnbm9kZXMuZGFydCc7CmltcG9ydCAndHlwZXMuZGFydCc7CgovLy8gS2VlcHMgdHJhY2sgb2YgbG9jYWxzIChpbmNsdWRpbmcgcGFyYW1ldGVycyBhbmQgcGhpcykgd2hlbiBidWlsZGluZy4gVGhlCi8vLyAndGhpcycgcmVmZXJlbmNlIGlzIHRyZWF0ZWQgYXMgcGFyYW1ldGVyIGFuZCBoZW5jZSBoYW5kbGVkIGJ5IHRoaXMgY2xhc3MsCi8vLyB0b28uCmNsYXNzIExvY2Fsc0hhbmRsZXIgewogIC8vLyBUaGUgdmFsdWVzIG9mIGxvY2FscyB0aGF0IGNhbiBiZSBkaXJlY3RseSBhY2Nlc3NlZCAod2l0aG91dCByZWRpcmVjdGlvbnMKICAvLy8gdG8gYm94ZXMgb3IgY2xvc3VyZS1maWVsZHMpLgogIC8vLwogIC8vLyBbZGlyZWN0TG9jYWxzXSBpcyBpdGVyYXRlZCwgc28gaXQgaXMgImluc2VydGlvbiBvcmRlcmVkIiB0byBtYWtlIHRoZQogIC8vLyBpdGVyYXRpb24gb3JkZXIgYSBmdW5jdGlvbiBvbmx5IG9mIGluc2VydGlvbnMgYW5kIG5vdCBhIGZ1bmN0aW9uIG9mCiAgLy8vIGUuZy4gRWxlbWVudCBoYXNoIGNvZGVzLiAgSSdkIHByZWZlciB0byB1c2UgYSBTb3J0ZWRNYXAgYnV0IHNvbWUgZWxlbWVudHMKICAvLy8gZG9uJ3QgaGF2ZSBzb3VyY2UgbG9jYXRpb25zIGZvciBbRWxlbWVudHMuY29tcGFyZUJ5UG9zaXRpb25dLgogIE1hcDxMb2NhbCwgSEluc3RydWN0aW9uPiBkaXJlY3RMb2NhbHMgPSBuZXcgTWFwPExvY2FsLCBISW5zdHJ1Y3Rpb24+KCk7CiAgTWFwPExvY2FsLCBGaWVsZEVudGl0eT4gcmVkaXJlY3Rpb25NYXBwaW5nID0gbmV3IE1hcDxMb2NhbCwgRmllbGRFbnRpdHk+KCk7CiAgZmluYWwgR3JhcGhCdWlsZGVyIGJ1aWxkZXI7CiAgU2NvcGVJbmZvIHNjb3BlSW5mbzsKICBNYXA8VHlwZVZhcmlhYmxlVHlwZSwgVHlwZVZhcmlhYmxlTG9jYWw+IHR5cGVWYXJpYWJsZUxvY2FscyA9CiAgICAgIG5ldyBNYXA8VHlwZVZhcmlhYmxlVHlwZSwgVHlwZVZhcmlhYmxlTG9jYWw+KCk7CiAgZmluYWwgRW50aXR5IGV4ZWN1dGFibGVDb250ZXh0OwogIGZpbmFsIE1lbWJlckVudGl0eSBtZW1iZXJDb250ZXh0OwoKICAvLy8gVGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UuIGBudWxsYCBpZiBpbiBhIHN0YXRpYyBjb250ZXh0LgogIC8vLwogIC8vLyBUaGlzIGlzIHRoZSB0eXBlIG9mIGB0aGlzYCBpcyB0aGUgY3VycmVudCBjb250ZXh0LCBhbmQgaXMgb2Z0ZW4gdGhlCiAgLy8vICd0aGlzIHR5cGUnIG9mIHRoZSBlbmNsb3NpbmcgY2xhc3Mgb2YgYSBtZW1iZXIuCiAgLy8vCiAgLy8vIElmIHRoZSBjdXJyZW50IGluc3RhbmNlIGlzIGNvbmNyZXRlLCB3ZSBjYW4gaGFuZGxlIGZpeGVkIHR5cGUgYXJndW1lbnQgaW4KICAvLy8gY2FzZSBvZiBpbmxpbmluZy4gRm9yIGluc3RhbmNlLCBjaGVja2luZyBgJ2ZvbydgIGFnYWluc3QgYFN0cmluZ2AgaW5zdGVhZAogIC8vLyBvZiBgVGAgaW4gYG1haW5gOgogIC8vLwogIC8vLyAgICAgY2xhc3MgRm9vPFQ+IHsKICAvLy8gICAgICAgVCBmaWVsZDsKICAvLy8gICAgICAgRm9vKHRoaXMuZmllbGQpOwogIC8vLyAgICAgfQogIC8vLyAgICAgbWFpbigpIHsKICAvLy8gICAgICAgbmV3IEZvbzxTdHJpbmc+KCdmb28nKTsKICAvLy8gICAgIH0KICAvLy8KICBmaW5hbCBJbnRlcmZhY2VUeXBlIGluc3RhbmNlVHlwZTsKCiAgZmluYWwgTmF0aXZlRGF0YSBfbmF0aXZlRGF0YTsKCiAgZmluYWwgSW50ZXJjZXB0b3JEYXRhIF9pbnRlcmNlcHRvckRhdGE7CgogIExvY2Fsc0hhbmRsZXIodGhpcy5idWlsZGVyLCB0aGlzLmV4ZWN1dGFibGVDb250ZXh0LCB0aGlzLm1lbWJlckNvbnRleHQsCiAgICAgIHRoaXMuaW5zdGFuY2VUeXBlLCB0aGlzLl9uYXRpdmVEYXRhLCB0aGlzLl9pbnRlcmNlcHRvckRhdGEpOwoKICBKQ2xvc2VkV29ybGQgZ2V0IGNsb3NlZFdvcmxkID0+IGJ1aWxkZXIuY2xvc2VkV29ybGQ7CgogIEFic3RyYWN0VmFsdWVEb21haW4gZ2V0IF9hYnN0cmFjdFZhbHVlRG9tYWluID0+CiAgICAgIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CgogIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIGdldCBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cyA9PgogICAgICBidWlsZGVyLmdsb2JhbEluZmVyZW5jZVJlc3VsdHM7CgogIC8vLyBTdWJzdGl0dXRlZCB0eXBlIHZhcmlhYmxlcyBvY2N1cnJpbmcgaW4gW3R5cGVdIGludG8gdGhlIGNvbnRleHQgb2YKICAvLy8gW2NvbnRleHRDbGFzc10uCiAgRGFydFR5cGUgc3Vic3RJbkNvbnRleHQoRGFydFR5cGUgdHlwZSkgewogICAgRGFydFR5cGUgbmV3VHlwZSA9IHR5cGU7CiAgICBpZiAoaW5zdGFuY2VUeXBlICE9IG51bGwpIHsKICAgICAgQ2xhc3NFbnRpdHkgdHlwZUNvbnRleHQgPSBEYXJ0VHlwZXMuZ2V0Q2xhc3NDb250ZXh0KG5ld1R5cGUpOwogICAgICBpZiAodHlwZUNvbnRleHQgIT0gbnVsbCkgewogICAgICAgIG5ld1R5cGUgPSBidWlsZGVyLnR5cGVzLnN1YnN0QnlDb250ZXh0KAogICAgICAgICAgICBuZXdUeXBlLAogICAgICAgICAgICBidWlsZGVyLnR5cGVzLmFzSW5zdGFuY2VPZigKICAgICAgICAgICAgICAgIGJ1aWxkZXIudHlwZXMuZ2V0VGhpc1R5cGUoaW5zdGFuY2VUeXBlLmVsZW1lbnQpLCB0eXBlQ29udGV4dCkpOwogICAgICB9CiAgICAgIGlmICghaW5zdGFuY2VUeXBlLmNvbnRhaW5zVHlwZVZhcmlhYmxlcykgewogICAgICAgIG5ld1R5cGUgPSBidWlsZGVyLnR5cGVzLnN1YnN0QnlDb250ZXh0KG5ld1R5cGUsIGluc3RhbmNlVHlwZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXdUeXBlOwogIH0KCiAgLy8vIENyZWF0ZXMgYSBuZXcgW0xvY2Fsc0hhbmRsZXJdIGJhc2VkIG9uIFtvdGhlcl0uIFdlIG9ubHkgbmVlZCB0bwogIC8vLyBjb3B5IHRoZSBbZGlyZWN0TG9jYWxzXSwgc2luY2UgdGhlIG90aGVyIGZpZWxkcyBjYW4gYmUgc2hhcmVkCiAgLy8vIHRocm91Z2hvdXQgdGhlIEFTVCB2aXNpdC4KICBMb2NhbHNIYW5kbGVyLmZyb20oTG9jYWxzSGFuZGxlciBvdGhlcikKICAgICAgOiBkaXJlY3RMb2NhbHMgPSBuZXcgTWFwPExvY2FsLCBISW5zdHJ1Y3Rpb24+LmZyb20ob3RoZXIuZGlyZWN0TG9jYWxzKSwKICAgICAgICByZWRpcmVjdGlvbk1hcHBpbmcgPSBvdGhlci5yZWRpcmVjdGlvbk1hcHBpbmcsCiAgICAgICAgZXhlY3V0YWJsZUNvbnRleHQgPSBvdGhlci5leGVjdXRhYmxlQ29udGV4dCwKICAgICAgICBtZW1iZXJDb250ZXh0ID0gb3RoZXIubWVtYmVyQ29udGV4dCwKICAgICAgICBpbnN0YW5jZVR5cGUgPSBvdGhlci5pbnN0YW5jZVR5cGUsCiAgICAgICAgYnVpbGRlciA9IG90aGVyLmJ1aWxkZXIsCiAgICAgICAgc2NvcGVJbmZvID0gb3RoZXIuc2NvcGVJbmZvLAogICAgICAgIF9uYXRpdmVEYXRhID0gb3RoZXIuX25hdGl2ZURhdGEsCiAgICAgICAgX2ludGVyY2VwdG9yRGF0YSA9IG90aGVyLl9pbnRlcmNlcHRvckRhdGEsCiAgICAgICAgYWN0aXZhdGlvblZhcmlhYmxlcyA9IG90aGVyLmFjdGl2YXRpb25WYXJpYWJsZXMsCiAgICAgICAgY2FjaGVkVHlwZU9mVGhpcyA9IG90aGVyLmNhY2hlZFR5cGVPZlRoaXMsCiAgICAgICAgY2FjaGVkVHlwZXNPZkNhcHR1cmVkVmFyaWFibGVzID0gb3RoZXIuY2FjaGVkVHlwZXNPZkNhcHR1cmVkVmFyaWFibGVzOwoKICAvLy8gUmVkaXJlY3RzIGFjY2Vzc2VzIGZyb20gZWxlbWVudCBbZnJvbV0gdG8gZWxlbWVudCBbdG9dLiBUaGUgW3RvXSBlbGVtZW50CiAgLy8vIG11c3QgYmUgYSBib3hlZCB2YXJpYWJsZSBvciBhIHZhcmlhYmxlIHRoYXQgaXMgc3RvcmVkIGluIGEgY2xvc3VyZS1maWVsZC4KICB2b2lkIHJlZGlyZWN0RWxlbWVudChMb2NhbCBmcm9tLCBGaWVsZEVudGl0eSB0bykgewogICAgYXNzZXJ0KHJlZGlyZWN0aW9uTWFwcGluZ1tmcm9tXSA9PSBudWxsKTsKICAgIHJlZGlyZWN0aW9uTWFwcGluZ1tmcm9tXSA9IHRvOwogICAgYXNzZXJ0KGlzU3RvcmVkSW5DbG9zdXJlRmllbGQoZnJvbSkgfHwgaXNCb3hlZChmcm9tKSk7CiAgfQoKICBISW5zdHJ1Y3Rpb24gY3JlYXRlQm94KFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBISW5zdHJ1Y3Rpb24gYm94ID0gbmV3IEhDcmVhdGVCb3goX2Fic3RyYWN0VmFsdWVEb21haW4ubm9uTnVsbFR5cGUpCiAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKICAgIGJ1aWxkZXIuYWRkKGJveCk7CiAgICByZXR1cm4gYm94OwogIH0KCiAgLy8vIElmIHRoZSBzY29wZSAoZnVuY3Rpb24gb3IgbG9vcCkgW25vZGVdIGhhcyBjYXB0dXJlZCB2YXJpYWJsZXMgdGhlbiB0aGlzCiAgLy8vIG1ldGhvZCBjcmVhdGVzIGEgYm94IGFuZCBzZXRzIHVwIHRoZSByZWRpcmVjdGlvbnMuCiAgdm9pZCBlbnRlclNjb3BlKAogICAgICBDYXB0dXJlZFNjb3BlIGNsb3N1cmVJbmZvLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAge2Jvb2wgZm9yR2VuZXJhdGl2ZUNvbnN0cnVjdG9yQm9keTogZmFsc2UsIEhJbnN0cnVjdGlvbiBpbmxpbmVkQm94fSkgewogICAgLy8gU2VlIGlmIGFueSB2YXJpYWJsZSBpbiB0aGUgdG9wLXNjb3BlIG9mIHRoZSBmdW5jdGlvbiBpcyBjYXB0dXJlZC4gSWYgeWVzCiAgICAvLyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIGJveC1vYmplY3QuCiAgICBpZiAoIWNsb3N1cmVJbmZvLnJlcXVpcmVzQ29udGV4dEJveCkgcmV0dXJuOwogICAgSEluc3RydWN0aW9uIGJveDsKICAgIC8vIFRoZSBzY29wZSBoYXMgY2FwdHVyZWQgdmFyaWFibGVzLgogICAgaWYgKGZvckdlbmVyYXRpdmVDb25zdHJ1Y3RvckJvZHkpIHsKICAgICAgLy8gVGhlIGJveCBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgdG8gYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yIGJvZHkuCiAgICAgIGJveCA9IGlubGluZWRCb3ggPz8KICAgICAgICAgIGJ1aWxkZXIuYWRkUGFyYW1ldGVyKAogICAgICAgICAgICAgIGNsb3N1cmVJbmZvLmNvbnRleHQsIF9hYnN0cmFjdFZhbHVlRG9tYWluLm5vbk51bGxUeXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIGJveCA9IGNyZWF0ZUJveChzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CiAgICAvLyBBZGQgdGhlIGJveCB0byB0aGUga25vd24gbG9jYWxzLgogICAgZGlyZWN0TG9jYWxzW2Nsb3N1cmVJbmZvLmNvbnRleHRdID0gYm94OwogICAgLy8gTWFrZSBzdXJlIHRoYXQgYWNjZXNzZXMgdG8gdGhlIGJveGVkIGxvY2FscyBnbyBpbnRvIHRoZSBib3guIFdlIGFsc28KICAgIC8vIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgcGFyYW1ldGVycyBhcmUgY29waWVkIGludG8gdGhlIGJveCBpZiBuZWNlc3NhcnkuCiAgICBjbG9zdXJlSW5mby5mb3JFYWNoQm94ZWRWYXJpYWJsZSgoTG9jYWwgZnJvbSwgRmllbGRFbnRpdHkgdG8pIHsKICAgICAgLy8gVGhlIFtmcm9tXSBjYW4gb25seSBiZSBhIHBhcmFtZXRlciBmb3IgZnVuY3Rpb24tc2NvcGVzIGFuZCBub3QKICAgICAgLy8gbG9vcCBzY29wZXMuCiAgICAgIEpMb2NhbCBqRnJvbSA9IGZyb207CiAgICAgIGJvb2wgaXNQYXJhbWV0ZXIgPSBqRnJvbS5pc1JlZ3VsYXJQYXJhbWV0ZXI7CiAgICAgIGFzc2VydChpc1BhcmFtZXRlciAhPSBudWxsKTsKICAgICAgaWYgKGlzUGFyYW1ldGVyICYmICFmb3JHZW5lcmF0aXZlQ29uc3RydWN0b3JCb2R5KSB7CiAgICAgICAgLy8gTm93IHRoYXQgdGhlIHJlZGlyZWN0aW9uIGlzIHNldCB1cCwgdGhlIHVwZGF0ZSB0byB0aGUgbG9jYWwgd2lsbAogICAgICAgIC8vIHdyaXRlIHRoZSBwYXJhbWV0ZXIgdmFsdWUgaW50byB0aGUgYm94LgogICAgICAgIC8vIFN0b3JlIHRoZSBjYXB0dXJlZCBwYXJhbWV0ZXIgaW4gdGhlIGJveC4gR2V0IHRoZSBjdXJyZW50IHZhbHVlCiAgICAgICAgLy8gYmVmb3JlIHdlIHB1dCB0aGUgcmVkaXJlY3Rpb24gaW4gcGxhY2UuCiAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byB1cGRhdGUgdGhlIGxvY2FsIGZvciBhIGdlbmVyYXRpdmUKICAgICAgICAvLyBjb25zdHJ1Y3RvciBib2R5LCBiZWNhdXNlIGl0IHJlY2VpdmVzIGEgYm94IHRoYXQgYWxyZWFkeQogICAgICAgIC8vIGNvbnRhaW5zIHRoZSB1cGRhdGVzIGFzIHRoZSBsYXN0IHBhcmFtZXRlci4KICAgICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSByZWFkTG9jYWwoZnJvbSk7CiAgICAgICAgcmVkaXJlY3RFbGVtZW50KGZyb20sIHRvKTsKICAgICAgICB1cGRhdGVMb2NhbChmcm9tLCBpbnN0cnVjdGlvbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVkaXJlY3RFbGVtZW50KGZyb20sIHRvKTsKICAgICAgfQogICAgfSk7CiAgfQoKICAvLy8gUmVwbGFjZXMgdGhlIGN1cnJlbnQgYm94IHdpdGggYSBuZXcgYm94IGFuZCBjb3BpZXMgb3ZlciB0aGUgZ2l2ZW4gbGlzdAogIC8vLyBvZiBlbGVtZW50cyBmcm9tIHRoZSBvbGQgYm94IGludG8gdGhlIG5ldyBib3guCiAgdm9pZCB1cGRhdGVDYXB0dXJlQm94KExvY2FsIGN1cnJlbnRCb3gsIExpc3Q8TG9jYWw+IHRvQmVDb3BpZWRFbGVtZW50cywKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIC8vIENyZWF0ZSBhIG5ldyBib3ggYW5kIGNvcHkgb3ZlciB0aGUgdmFsdWVzIGZyb20gdGhlIG9sZCBib3ggaW50byB0aGUKICAgIC8vIG5ldyBvbmUuCiAgICBISW5zdHJ1Y3Rpb24gb2xkQm94ID0gcmVhZExvY2FsKGN1cnJlbnRCb3gpOwogICAgSEluc3RydWN0aW9uIG5ld0JveCA9IGNyZWF0ZUJveChzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBmb3IgKExvY2FsIGJveGVkVmFyaWFibGUgaW4gdG9CZUNvcGllZEVsZW1lbnRzKSB7CiAgICAgIC8vIFtyZWFkTG9jYWxdIHVzZXMgdGhlIFtjdXJyZW50Qm94XSB0byBmaW5kIGl0cyBib3guIEJ5IHJlcGxhY2luZyBpdAogICAgICAvLyBiZWhpbmQgaXRzIGJhY2sgd2UgY2FuIHN0aWxsIGdldCB0byB0aGUgb2xkIHZhbHVlcy4KICAgICAgdXBkYXRlTG9jYWwoY3VycmVudEJveCwgb2xkQm94KTsKICAgICAgSEluc3RydWN0aW9uIG9sZFZhbHVlID0gcmVhZExvY2FsKGJveGVkVmFyaWFibGUpOwogICAgICB1cGRhdGVMb2NhbChjdXJyZW50Qm94LCBuZXdCb3gpOwogICAgICB1cGRhdGVMb2NhbChib3hlZFZhcmlhYmxlLCBvbGRWYWx1ZSk7CiAgICB9CiAgICB1cGRhdGVMb2NhbChjdXJyZW50Qm94LCBuZXdCb3gpOwogIH0KCiAgLy8vIERvY3VtZW50YXRpb24gd2FudGVkIC0tIGpvaG5uaXdpbnRoZXIKICAvLy8KICAvLy8gSW52YXJpYW50OiBbZnVuY3Rpb25dIG11c3QgYmUgYW4gaW1wbGVtZW50YXRpb24gZWxlbWVudC4KICB2b2lkIHN0YXJ0RnVuY3Rpb24oCiAgICAgIE1lbWJlckVudGl0eSBlbGVtZW50LAogICAgICBTY29wZUluZm8gc2NvcGVJbmZvLAogICAgICBDYXB0dXJlZFNjb3BlIHNjb3BlRGF0YSwKICAgICAgTWFwPExvY2FsLCBBYnN0cmFjdFZhbHVlPiBwYXJhbWV0ZXJzLAogICAgICBTZXQ8TG9jYWw+IGVsaWRlZFBhcmFtZXRlcnMsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICB7Ym9vbCBpc0dlbmVyYXRpdmVDb25zdHJ1Y3RvckJvZHl9KSB7CiAgICB0aGlzLnNjb3BlSW5mbyA9IHNjb3BlSW5mbzsKCiAgICBwYXJhbWV0ZXJzLmZvckVhY2goKExvY2FsIGxvY2FsLCBBYnN0cmFjdFZhbHVlIHR5cGVNYXNrKSB7CiAgICAgIGlmIChpc0dlbmVyYXRpdmVDb25zdHJ1Y3RvckJvZHkpIHsKICAgICAgICBpZiAoc2NvcGVEYXRhLmlzQm94ZWRWYXJpYWJsZShsb2NhbCkpIHsKICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgd2lsbCBiZSBhIGZpZWxkIGluIHRoZSBib3ggcGFzc2VkIGFzIHRoZQogICAgICAgICAgLy8gbGFzdCBwYXJhbWV0ZXIuIFNvIG5vIG5lZWQgdG8gaGF2ZSBpdC4KICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgICAgSEluc3RydWN0aW9uIHBhcmFtZXRlciA9IGJ1aWxkZXIuYWRkUGFyYW1ldGVyKGxvY2FsLCB0eXBlTWFzaywKICAgICAgICAgIGlzRWxpZGVkOiBlbGlkZWRQYXJhbWV0ZXJzLmNvbnRhaW5zKGxvY2FsKSk7CiAgICAgIGJ1aWxkZXIucGFyYW1ldGVyc1tsb2NhbF0gPSBwYXJhbWV0ZXI7CiAgICAgIGRpcmVjdExvY2Fsc1tsb2NhbF0gPSBwYXJhbWV0ZXI7CiAgICB9KTsKICAgIGJ1aWxkZXIuZWxpZGVkUGFyYW1ldGVycyA9IGVsaWRlZFBhcmFtZXRlcnM7CgogICAgZW50ZXJTY29wZShzY29wZURhdGEsIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICAgIGZvckdlbmVyYXRpdmVDb25zdHJ1Y3RvckJvZHk6IGlzR2VuZXJhdGl2ZUNvbnN0cnVjdG9yQm9keSk7CgogICAgLy8gV2hlbiB3ZSByZW1vdmUgdGhlIGVsZW1lbnQgbW9kZWwsIHdlIGNhbiBqdXN0IHVzZSB0aGUgZmlyc3QgY2hlY2sKICAgIC8vIChiZWNhdXNlIHRoZSB1bmRlcmx5aW5nIGVsZW1lbnRzIHdvbid0IGFsbCBiZSAqYm90aCogU2NvcGVJbmZvcyBhbmQKICAgIC8vIENsb3N1cmVSZXByZXNlbnRhdGlvbkluZm9zKS4KICAgIGlmIChzY29wZUluZm8gaXMgQ2xvc3VyZVJlcHJlc2VudGF0aW9uSW5mbyAmJiBzY29wZUluZm8uaXNDbG9zdXJlKSB7CiAgICAgIENsb3N1cmVSZXByZXNlbnRhdGlvbkluZm8gY2xvc3VyZURhdGEgPSBzY29wZUluZm87CiAgICAgIC8vIElmIHRoZSBmcmVlVmFyaWFibGVNYXBwaW5nIGlzIG5vdCBlbXB0eSwgdGhlbiB0aGlzIGZ1bmN0aW9uIHdhcyBhCiAgICAgIC8vIG5lc3RlZCBjbG9zdXJlIHRoYXQgY2FwdHVyZXMgdmFyaWFibGVzLiBSZWRpcmVjdCB0aGUgY2FwdHVyZWQKICAgICAgLy8gdmFyaWFibGVzIHRvIGZpZWxkcyBpbiB0aGUgY2xvc3VyZS4KICAgICAgY2xvc3VyZURhdGEuZm9yRWFjaEZyZWVWYXJpYWJsZSgoTG9jYWwgZnJvbSwgRmllbGRFbnRpdHkgdG8pIHsKICAgICAgICByZWRpcmVjdEVsZW1lbnQoZnJvbSwgdG8pOwogICAgICB9KTsKICAgICAgLy8gSW5zaWRlIGNsb3N1cmUgcmVkaXJlY3QgcmVmZXJlbmNlcyB0byBpdHNlbGYgdG8gWzp0aGlzOl0uCiAgICAgIEhUaGlzIHRoaXNJbnN0cnVjdGlvbiA9CiAgICAgICAgICBuZXcgSFRoaXMoY2xvc3VyZURhdGEudGhpc0xvY2FsLCBfYWJzdHJhY3RWYWx1ZURvbWFpbi5ub25OdWxsVHlwZSk7CiAgICAgIGJ1aWxkZXIuZ3JhcGgudGhpc0luc3RydWN0aW9uID0gdGhpc0luc3RydWN0aW9uOwogICAgICBidWlsZGVyLmdyYXBoLmVudHJ5LmFkZEF0RW50cnkodGhpc0luc3RydWN0aW9uKTsKICAgICAgdXBkYXRlTG9jYWwoY2xvc3VyZURhdGEuY2xvc3VyZUVudGl0eSwgdGhpc0luc3RydWN0aW9uKTsKICAgIH0gZWxzZSBpZiAoZWxlbWVudC5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgIC8vIE9uY2UgY2xvc3VyZXMgaGF2ZSBiZWVuIG1hcHBlZCB0byBjbGFzc2VzIHRoZWlyIGluc3RhbmNlIG1lbWJlcnMgbWlnaHQKICAgICAgLy8gbm90IGhhdmUgYW55IHRoaXNFbGVtZW50IGlmIHRoZSBjbG9zdXJlIHdhcyBjcmVhdGVkIGluc2lkZSBhIHN0YXRpYwogICAgICAvLyBjb250ZXh0LgogICAgICBIVGhpcyB0aGlzSW5zdHJ1Y3Rpb24gPSBuZXcgSFRoaXMoc2NvcGVJbmZvLnRoaXNMb2NhbCwgZ2V0VHlwZU9mVGhpcygpKTsKICAgICAgYnVpbGRlci5ncmFwaC50aGlzSW5zdHJ1Y3Rpb24gPSB0aGlzSW5zdHJ1Y3Rpb247CiAgICAgIGJ1aWxkZXIuZ3JhcGguZW50cnkuYWRkQXRFbnRyeSh0aGlzSW5zdHJ1Y3Rpb24pOwogICAgICBkaXJlY3RMb2NhbHNbc2NvcGVJbmZvLnRoaXNMb2NhbF0gPSB0aGlzSW5zdHJ1Y3Rpb247CiAgICB9CgogICAgLy8gSWYgdGhpcyBtZXRob2QgaXMgYW4gaW50ZXJjZXB0ZWQgbWV0aG9kLCBhZGQgdGhlIGV4dHJhCiAgICAvLyBwYXJhbWV0ZXIgdG8gaXQsIHRoYXQgaXMgdGhlIGFjdHVhbCByZWNlaXZlciBmb3IgaW50ZXJjZXB0ZWQKICAgIC8vIGNsYXNzZXMsIG9yIHRoZSBzYW1lIGFzIFs6dGhpczpdIGZvciBub24taW50ZXJjZXB0ZWQgY2xhc3Nlcy4KICAgIENsYXNzRW50aXR5IGNscyA9IGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3M7CgogICAgLy8gV2hlbiB0aGUgY2xhc3MgZXh0ZW5kcyBhIG5hdGl2ZSBjbGFzcywgdGhlIGluc3RhbmNlIGlzIHByZS1jb25zdHJ1Y3RlZAogICAgLy8gYW5kIHBhc3NlZCB0byB0aGUgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvciBmYWN0b3J5IGZ1bmN0aW9uIGFzIGEgcGFyYW1ldGVyLgogICAgLy8gSW5zdGVhZCBvZiBhbGxvY2F0aW5nIGFuZCBpbml0aWFsaXppbmcgdGhlIG9iamVjdCwgdGhlIGNvbnN0cnVjdG9yCiAgICAvLyAndXBncmFkZXMnIHRoZSBuYXRpdmUgc3ViY2xhc3Mgb2JqZWN0IGJ5IGluaXRpYWxpemluZyB0aGUgRGFydCBmaWVsZHMuCiAgICBib29sIGlzTmF0aXZlVXBncmFkZUZhY3RvcnkgPSBlbGVtZW50IGlzIENvbnN0cnVjdG9yRW50aXR5ICYmCiAgICAgICAgZWxlbWVudC5pc0dlbmVyYXRpdmVDb25zdHJ1Y3RvciAmJgogICAgICAgIF9uYXRpdmVEYXRhLmlzTmF0aXZlT3JFeHRlbmRzTmF0aXZlKGNscyk7CiAgICBpZiAoX2ludGVyY2VwdG9yRGF0YS5pc0ludGVyY2VwdGVkTWV0aG9kKGVsZW1lbnQpKSB7CiAgICAgIGJvb2wgaXNJbnRlcmNlcHRlZENsYXNzID0gX2ludGVyY2VwdG9yRGF0YS5pc0ludGVyY2VwdGVkQ2xhc3MoY2xzKTsKICAgICAgU3RyaW5nIG5hbWUgPSBpc0ludGVyY2VwdGVkQ2xhc3MgPyAncmVjZWl2ZXInIDogJ18nOwogICAgICBTeW50aGV0aWNMb2NhbCBwYXJhbWV0ZXIgPSBjcmVhdGVMb2NhbChuYW1lKTsKICAgICAgSFBhcmFtZXRlclZhbHVlIHZhbHVlID0gbmV3IEhQYXJhbWV0ZXJWYWx1ZShwYXJhbWV0ZXIsIGdldFR5cGVPZlRoaXMoKSk7CiAgICAgIGJ1aWxkZXIuZ3JhcGguZXhwbGljaXRSZWNlaXZlclBhcmFtZXRlciA9IHZhbHVlOwogICAgICBidWlsZGVyLmdyYXBoLmVudHJ5LmFkZEFmdGVyKGRpcmVjdExvY2Fsc1tzY29wZUluZm8udGhpc0xvY2FsXSwgdmFsdWUpOwogICAgICBpZiAoYnVpbGRlci5sYXN0QWRkZWRQYXJhbWV0ZXIgPT0gbnVsbCkgewogICAgICAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IHBhcmFtZXRlciBpbnNlcnRlZCwgbWFrZSBzdXJlIGl0IHN0YXlzIGZpcnN0LgogICAgICAgIGJ1aWxkZXIubGFzdEFkZGVkUGFyYW1ldGVyID0gdmFsdWU7CiAgICAgIH0KICAgICAgaWYgKGlzSW50ZXJjZXB0ZWRDbGFzcykgewogICAgICAgIC8vIE9ubHkgdXNlIHRoZSBleHRyYSBwYXJhbWV0ZXIgaW4gaW50ZXJjZXB0ZWQgY2xhc3Nlcy4KICAgICAgICBkaXJlY3RMb2NhbHNbc2NvcGVJbmZvLnRoaXNMb2NhbF0gPSB2YWx1ZTsKICAgICAgfQogICAgfSBlbHNlIGlmIChpc05hdGl2ZVVwZ3JhZGVGYWN0b3J5KSB7CiAgICAgIFN5bnRoZXRpY0xvY2FsIHBhcmFtZXRlciA9IGNyZWF0ZUxvY2FsKCdyZWNlaXZlcicpOwogICAgICAvLyBVbmxpa2UgYHRoaXNgLCByZWNlaXZlciBpcyBudWxsYWJsZSBzaW5jZSBkaXJlY3QgY2FsbHMgdG8gZ2VuZXJhdGl2ZQogICAgICAvLyBjb25zdHJ1Y3RvciBjYWxsIHRoZSBjb25zdHJ1Y3RvciB3aXRoIGBudWxsYC4KICAgICAgSFBhcmFtZXRlclZhbHVlIHZhbHVlID0gbmV3IEhQYXJhbWV0ZXJWYWx1ZSgKICAgICAgICAgIHBhcmFtZXRlciwgY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5jcmVhdGVOdWxsYWJsZUV4YWN0KGNscykpOwogICAgICBidWlsZGVyLmdyYXBoLmV4cGxpY2l0UmVjZWl2ZXJQYXJhbWV0ZXIgPSB2YWx1ZTsKICAgICAgYnVpbGRlci5ncmFwaC5lbnRyeS5hZGRBdEVudHJ5KHZhbHVlKTsKICAgICAgaWYgKGJ1aWxkZXIubGFzdEFkZGVkUGFyYW1ldGVyID09IG51bGwpIHsKICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaW5zZXJ0ZWQsIG1ha2Ugc3VyZSBpdCBzdGF5cyBmaXJzdC4KICAgICAgICBidWlsZGVyLmxhc3RBZGRlZFBhcmFtZXRlciA9IHZhbHVlOwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBsb2NhbCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkuIEJveGVkIHZhcmlhYmxlcyBvcgogIC8vLyBjYXB0dXJlZCB2YXJpYWJsZXMgdGhhdCBhcmUgc3RvcmVkIGluIHRoZSBjbG9zdXJlLWZpZWxkIHJldHVybiBbOmZhbHNlOl0uCiAgYm9vbCBpc0FjY2Vzc2VkRGlyZWN0bHkoTG9jYWwgbG9jYWwpIHsKICAgIGFzc2VydChsb2NhbCAhPSBudWxsKTsKICAgIHJldHVybiAhcmVkaXJlY3Rpb25NYXBwaW5nLmNvbnRhaW5zS2V5KGxvY2FsKSAmJgogICAgICAgICFzY29wZUluZm8ubG9jYWxJc1VzZWRJblRyeU9yU3luYyhsb2NhbCk7CiAgfQoKICBib29sIGlzU3RvcmVkSW5DbG9zdXJlRmllbGQoTG9jYWwgbG9jYWwpIHsKICAgIGFzc2VydChsb2NhbCAhPSBudWxsKTsKICAgIGlmIChpc0FjY2Vzc2VkRGlyZWN0bHkobG9jYWwpKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoc2NvcGVJbmZvIGlzISBDbG9zdXJlUmVwcmVzZW50YXRpb25JbmZvKSByZXR1cm4gZmFsc2U7CiAgICBGaWVsZEVudGl0eSByZWRpcmVjdFRhcmdldCA9IHJlZGlyZWN0aW9uTWFwcGluZ1tsb2NhbF07CiAgICBpZiAocmVkaXJlY3RUYXJnZXQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHJlZGlyZWN0VGFyZ2V0IGlzIEpDbG9zdXJlRmllbGQ7CiAgfQoKICBib29sIGlzQm94ZWQoTG9jYWwgbG9jYWwpIHsKICAgIGlmIChpc0FjY2Vzc2VkRGlyZWN0bHkobG9jYWwpKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoaXNTdG9yZWRJbkNsb3N1cmVGaWVsZChsb2NhbCkpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiByZWRpcmVjdGlvbk1hcHBpbmcuY29udGFpbnNLZXkobG9jYWwpOwogIH0KCiAgYm9vbCBfaXNVc2VkSW5UcnlPckdlbmVyYXRvcihMb2NhbCBsb2NhbCkgewogICAgcmV0dXJuIHNjb3BlSW5mby5sb2NhbElzVXNlZEluVHJ5T3JTeW5jKGxvY2FsKTsKICB9CgogIC8vLyBSZXR1cm5zIGFuIFtISW5zdHJ1Y3Rpb25dIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgaXMKICAvLy8gYm94ZWQgb3Igc3RvcmVkIGluIGEgY2xvc3VyZSB0aGVuIHRoZSBtZXRob2QgZ2VuZXJhdGVzIGNvZGUgdG8gcmV0cmlldmUKICAvLy8gdGhlIHZhbHVlLgogIEhJbnN0cnVjdGlvbiByZWFkTG9jYWwoTG9jYWwgbG9jYWwsIHtTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbn0pIHsKICAgIGlmIChpc0FjY2Vzc2VkRGlyZWN0bHkobG9jYWwpKSB7CiAgICAgIGlmIChkaXJlY3RMb2NhbHNbbG9jYWxdID09IG51bGwpIHsKICAgICAgICBpZiAobG9jYWwgaXMgVHlwZVZhcmlhYmxlTG9jYWwpIHsKICAgICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgICAgICAgIlJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbiBub3QgYXZhaWxhYmxlIGZvciAkbG9jYWwgIgogICAgICAgICAgICAgICJpbiAke2RpcmVjdExvY2Fscy5rZXlzfSBmb3IgJGV4ZWN1dGFibGVDb250ZXh0LiIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgICBsb2NhbCwKICAgICAgICAgICAgICAiQ2Fubm90IGZpbmQgdmFsdWUgJGxvY2FsIGluICR7ZGlyZWN0TG9jYWxzLmtleXN9IGZvciAiCiAgICAgICAgICAgICAgIiRleGVjdXRhYmxlQ29udGV4dC4iKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgSEluc3RydWN0aW9uIHZhbHVlID0gZGlyZWN0TG9jYWxzW2xvY2FsXTsKICAgICAgaWYgKHNvdXJjZUluZm9ybWF0aW9uICE9IG51bGwpIHsKICAgICAgICB2YWx1ZSA9IG5ldyBIUmVmKHZhbHVlLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgICAgYnVpbGRlci5hZGQodmFsdWUpOwogICAgICB9CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0gZWxzZSBpZiAoaXNTdG9yZWRJbkNsb3N1cmVGaWVsZChsb2NhbCkpIHsKICAgICAgQ2xvc3VyZVJlcHJlc2VudGF0aW9uSW5mbyBjbG9zdXJlRGF0YSA9IHNjb3BlSW5mbzsKICAgICAgRmllbGRFbnRpdHkgcmVkaXJlY3QgPSByZWRpcmVjdGlvbk1hcHBpbmdbbG9jYWxdOwogICAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIgPSByZWFkTG9jYWwoY2xvc3VyZURhdGEuY2xvc3VyZUVudGl0eSk7CiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZSA9IGxvY2FsIGlzIEJveExvY2FsCiAgICAgICAgICA/IF9hYnN0cmFjdFZhbHVlRG9tYWluLm5vbk51bGxUeXBlCiAgICAgICAgICA6IGdldFR5cGVPZkNhcHR1cmVkVmFyaWFibGUocmVkaXJlY3QpOwogICAgICBISW5zdHJ1Y3Rpb24gZmllbGRHZXQgPQogICAgICAgICAgbmV3IEhGaWVsZEdldChyZWRpcmVjdCwgcmVjZWl2ZXIsIHR5cGUsIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgYnVpbGRlci5hZGQoZmllbGRHZXQpOwogICAgICByZXR1cm4gZmllbGRHZXQ7CiAgICB9IGVsc2UgaWYgKGlzQm94ZWQobG9jYWwpKSB7CiAgICAgIEZpZWxkRW50aXR5IHJlZGlyZWN0ID0gcmVkaXJlY3Rpb25NYXBwaW5nW2xvY2FsXTsKICAgICAgQm94TG9jYWwgbG9jYWxCb3g7CiAgICAgIC8vIEluIHRoZSBmdW5jdGlvbiB0aGF0IGRlY2xhcmVzIHRoZSBjYXB0dXJlZCB2YXJpYWJsZSB0aGUgYm94IGlzCiAgICAgIC8vIGFjY2Vzc2VkIGFzIGRpcmVjdCBsb2NhbC4gSW5zaWRlIHRoZSBuZXN0ZWQgY2xvc3VyZSB0aGUgYm94IGlzCiAgICAgIC8vIGFjY2Vzc2VkIHRocm91Z2ggYSBjbG9zdXJlLWZpZWxkLgogICAgICAvLyBDYWxsaW5nIFtyZWFkTG9jYWxdIG1ha2VzIHN1cmUgd2UgZ2VuZXJhdGUgdGhlIGNvcnJlY3QgY29kZSB0byBnZXQKICAgICAgLy8gdGhlIGJveC4KICAgICAgaWYgKHJlZGlyZWN0IGlzIEpSZWNvcmRGaWVsZCkgewogICAgICAgIGxvY2FsQm94ID0gcmVkaXJlY3QuYm94OwogICAgICB9CiAgICAgIGFzc2VydChsb2NhbEJveCAhPSBudWxsKTsKCiAgICAgIEhJbnN0cnVjdGlvbiBib3ggPSByZWFkTG9jYWwobG9jYWxCb3gpOwogICAgICBISW5zdHJ1Y3Rpb24gbG9va3VwID0gbmV3IEhGaWVsZEdldChyZWRpcmVjdCwgYm94LAogICAgICAgICAgZ2V0VHlwZU9mQ2FwdHVyZWRWYXJpYWJsZShyZWRpcmVjdCksIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgYnVpbGRlci5hZGQobG9va3VwKTsKICAgICAgcmV0dXJuIGxvb2t1cDsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChfaXNVc2VkSW5UcnlPckdlbmVyYXRvcihsb2NhbCkpOwogICAgICBITG9jYWxWYWx1ZSBsb2NhbFZhbHVlID0gZ2V0TG9jYWwobG9jYWwpOwogICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSBuZXcgSExvY2FsR2V0KGxvY2FsLCBsb2NhbFZhbHVlLAogICAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUsIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgYnVpbGRlci5hZGQoaW5zdHJ1Y3Rpb24pOwogICAgICByZXR1cm4gaW5zdHJ1Y3Rpb247CiAgICB9CiAgfQoKICBISW5zdHJ1Y3Rpb24gcmVhZFRoaXMoe1NvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9ufSkgewogICAgSEluc3RydWN0aW9uIHJlcyA9CiAgICAgICAgcmVhZExvY2FsKHNjb3BlSW5mby50aGlzTG9jYWwsIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBpZiAocmVzLmluc3RydWN0aW9uVHlwZSA9PSBudWxsKSB7CiAgICAgIHJlcy5pbnN0cnVjdGlvblR5cGUgPSBnZXRUeXBlT2ZUaGlzKCk7CiAgICB9CiAgICByZXR1cm4gcmVzOwogIH0KCiAgSExvY2FsVmFsdWUgZ2V0TG9jYWwoTG9jYWwgbG9jYWwsIHtTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbn0pIHsKICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIGEgcGFyYW1ldGVyLCB3ZSBhbHJlYWR5IGhhdmUgYQogICAgLy8gSFBhcmFtZXRlclZhbHVlIGZvciBpdC4gV2UgY2Fubm90IGNyZWF0ZSBhbm90aGVyIG9uZSBiZWNhdXNlCiAgICAvLyBpdCBjb3VsZCB0aGVuIGhhdmUgYW5vdGhlciBuYW1lIHRoYW4gdGhlIHJlYWwgcGFyYW1ldGVyLiBBbmQKICAgIC8vIHRoZSBvdGhlciBvbmUgd291bGQgbm90IGtub3cgaXQgaXMganVzdCBhIGNvcHkgb2YgdGhlIHJlYWwKICAgIC8vIHBhcmFtZXRlci4KICAgIGlmIChidWlsZGVyLnBhcmFtZXRlcnMuY29udGFpbnNLZXkobG9jYWwpKSB7CiAgICAgIHJldHVybiBidWlsZGVyLnBhcmFtZXRlcnNbbG9jYWxdOwogICAgfQoKICAgIHJldHVybiBhY3RpdmF0aW9uVmFyaWFibGVzLnB1dElmQWJzZW50KGxvY2FsLCAoKSB7CiAgICAgIEhMb2NhbFZhbHVlIGxvY2FsVmFsdWUgPQogICAgICAgICAgbmV3IEhMb2NhbFZhbHVlKGxvY2FsLCBfYWJzdHJhY3RWYWx1ZURvbWFpbi5ub25OdWxsVHlwZSkKICAgICAgICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogICAgICBidWlsZGVyLmdyYXBoLmVudHJ5LmFkZEF0RXhpdChsb2NhbFZhbHVlKTsKICAgICAgcmV0dXJuIGxvY2FsVmFsdWU7CiAgICB9KTsKICB9CgogIExvY2FsIGdldFR5cGVWYXJpYWJsZUFzTG9jYWwoVHlwZVZhcmlhYmxlVHlwZSB0eXBlKSB7CiAgICByZXR1cm4gdHlwZVZhcmlhYmxlTG9jYWxzLnB1dElmQWJzZW50KHR5cGUsICgpIHsKICAgICAgcmV0dXJuIG5ldyBUeXBlVmFyaWFibGVMb2NhbCh0eXBlKTsKICAgIH0pOwogIH0KCiAgLy8vIFNldHMgdGhlIFtlbGVtZW50XSB0byBbdmFsdWVdLiBJZiB0aGUgZWxlbWVudCBpcyBib3hlZCBvciBzdG9yZWQgaW4gYQogIC8vLyBjbG9zdXJlIHRoZW4gdGhlIG1ldGhvZCBnZW5lcmF0ZXMgY29kZSB0byBzZXQgdGhlIHZhbHVlLgogIHZvaWQgdXBkYXRlTG9jYWwoTG9jYWwgbG9jYWwsIEhJbnN0cnVjdGlvbiB2YWx1ZSwKICAgICAge1NvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9ufSkgewogICAgaWYgKHZhbHVlIGlzIEhSZWYpIHsKICAgICAgSFJlZiByZWYgPSB2YWx1ZTsKICAgICAgdmFsdWUgPSByZWYudmFsdWU7CiAgICB9CiAgICBhc3NlcnQoIWlzU3RvcmVkSW5DbG9zdXJlRmllbGQobG9jYWwpLAogICAgICAgICJMb2NhbCAkbG9jYWwgaXMgc3RvcmVkIGluIGEgY2xvc3VyZSBmaWVsZC4iKTsKICAgIGlmIChpc0FjY2Vzc2VkRGlyZWN0bHkobG9jYWwpKSB7CiAgICAgIGRpcmVjdExvY2Fsc1tsb2NhbF0gPSB2YWx1ZTsKICAgIH0gZWxzZSBpZiAoaXNCb3hlZChsb2NhbCkpIHsKICAgICAgRmllbGRFbnRpdHkgcmVkaXJlY3QgPSByZWRpcmVjdGlvbk1hcHBpbmdbbG9jYWxdOwogICAgICBhc3NlcnQocmVkaXJlY3QgIT0gbnVsbCk7CiAgICAgIEJveExvY2FsIGxvY2FsQm94OwogICAgICBpZiAocmVkaXJlY3QgaXMgSlJlY29yZEZpZWxkKSB7CiAgICAgICAgbG9jYWxCb3ggPSByZWRpcmVjdC5ib3g7CiAgICAgIH0KICAgICAgYXNzZXJ0KGxvY2FsQm94ICE9IG51bGwpOwoKICAgICAgLy8gVGhlIGJveCBpdHNlbGYgY291bGQgYmUgY2FwdHVyZWQsIG9yIGJlIGxvY2FsLiBBIGxvY2FsIHZhcmlhYmxlIHRoYXQKICAgICAgLy8gaXMgY2FwdHVyZWQgd2lsbCBiZSBib3hlZCwgYnV0IHRoZSBib3ggaXRzZWxmIHdpbGwgYmUgYSBsb2NhbC4KICAgICAgLy8gSW5zaWRlIHRoZSBjbG9zdXJlIHRoZSBib3ggaXMgc3RvcmVkIGluIGEgY2xvc3VyZS1maWVsZCBhbmQgY2Fubm90CiAgICAgIC8vIGJlIGFjY2Vzc2VkIGRpcmVjdGx5LgogICAgICBISW5zdHJ1Y3Rpb24gYm94ID0gcmVhZExvY2FsKGxvY2FsQm94KTsKICAgICAgYnVpbGRlci5hZGQoCiAgICAgICAgICBuZXcgSEZpZWxkU2V0KGJ1aWxkZXIuYWJzdHJhY3RWYWx1ZURvbWFpbiwgcmVkaXJlY3QsIGJveCwgdmFsdWUpCiAgICAgICAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoX2lzVXNlZEluVHJ5T3JHZW5lcmF0b3IobG9jYWwpKTsKICAgICAgSExvY2FsVmFsdWUgbG9jYWxWYWx1ZSA9IGdldExvY2FsKGxvY2FsKTsKICAgICAgYnVpbGRlci5hZGQoCiAgICAgICAgICBuZXcgSExvY2FsU2V0KGJ1aWxkZXIuYWJzdHJhY3RWYWx1ZURvbWFpbiwgbG9jYWwsIGxvY2FsVmFsdWUsIHZhbHVlKQogICAgICAgICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb24pOwogICAgfQogIH0KCiAgLy8vIFRoaXMgZnVuY3Rpb24sIHN0YXJ0TG9vcCwgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHZpc2l0aW5nIGFueSBjaGlsZHJlbiBvZgogIC8vLyB0aGUgbG9vcC4gSW4gcGFydGljdWxhciBpdCBuZWVkcyB0byBiZSBjYWxsZWQgYmVmb3JlIGV4ZWN1dGluZyB0aGUKICAvLy8gaW5pdGlhbGl6ZXJzLgogIC8vLwogIC8vLyBUaGUgW0xvY2Fsc0hhbmRsZXJdIHdpbGwgbWFrZSB0aGUgYm94ZXMgYW5kIHVwZGF0ZXMgYXQgdGhlIHJpZ2h0IG1vbWVudC4KICAvLy8gVGhlIGJ1aWxkZXIganVzdCBuZWVkcyB0byBjYWxsIFtlbnRlckxvb3BCb2R5XSBhbmQgW2VudGVyTG9vcFVwZGF0ZXNdCiAgLy8vIChmb3IgW2FzdC5Gb3JdIGxvb3BzKSBhdCB0aGUgY29ycmVjdCBwbGFjZXMuIEZvciBwaGktaGFuZGxpbmcKICAvLy8gW2JlZ2luTG9vcEhlYWRlcl0gYW5kIFtlbmRMb29wXSBtdXN0IGFsc28gYmUgY2FsbGVkLgogIC8vLwogIC8vLyBUaGUgY29ycmVjdCBwbGFjZSBmb3IgdGhlIGJveCBkZXBlbmRzIG9uIHRoZSBnaXZlbiBsb29wLiBJbiBtb3N0IGNhc2VzCiAgLy8vIHRoZSBib3ggd2lsbCBiZSBjcmVhdGVkIHdoZW4gZW50ZXJpbmcgdGhlIGxvb3AtYm9keTogd2hpbGUsIGRvLXdoaWxlLCBhbmQKICAvLy8gZm9yLWluIChhc3N1bWluZyB0aGUgY2FsbCB0byBbOm5leHQ6XSBpcyBpbnNpZGUgdGhlIGJvZHkpIGNhbiBhbHdheXMgYmUKICAvLy8gY29uc3RydWN0ZWQgdGhpcyB3YXkuCiAgLy8vCiAgLy8vIFRoaW5ncyBhcmUgc2xpZ2h0bHkgbW9yZSBjb21wbGljYXRlZCBmb3IgW2FzdC5Gb3JdIGxvb3BzLiBJZiBubyBkZWNsYXJlZAogIC8vLyBsb29wIHZhcmlhYmxlIGlzIGJveGVkIHRoZW4gdGhlIGxvb3AtYm9keSBhcHByb2FjaCB3b3JrcyBoZXJlIHRvby4gSWYgYQogIC8vLyBsb29wLXZhcmlhYmxlIGlzIGJveGVkIHdlIG5lZWQgdG8gaW50cm9kdWNlIGEgbmV3IGJveCBmb3IgdGhlCiAgLy8vIGxvb3AtdmFyaWFibGUgYmVmb3JlIHdlIGVudGVyIHRoZSBpbml0aWFsaXplciBzbyB0aGF0IHRoZSBpbml0aWFsaXplcgogIC8vLyB3cml0ZXMgdGhlIHZhbHVlcyBpbnRvIHRoZSBib3guIEluIGFueSBjYXNlIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSBib3gKICAvLy8gYmVmb3JlIHRoZSBjb25kaXRpb24gc2luY2UgdGhlIGNvbmRpdGlvbiBjb3VsZCBib3ggdGhlIHZhcmlhYmxlLgogIC8vLyBTaW5jZSB0aGUgZmlyc3QgYm94IGlzIGNyZWF0ZWQgb3V0c2lkZSB0aGUgYWN0dWFsIGxvb3Agd2UgaGF2ZSBhIHNlY29uZAogIC8vLyBsb2NhdGlvbiB3aGVyZSBhIGJveCBpcyBjcmVhdGVkOiBqdXN0IGJlZm9yZSB0aGUgdXBkYXRlcy4gVGhpcyBpcwogIC8vLyBuZWNlc3Nhcnkgc2luY2UgdXBkYXRlcyBhcmUgY29uc2lkZXJlZCB0byBiZSBwYXJ0IG9mIHRoZSBuZXh0IGl0ZXJhdGlvbgogIC8vLyAoYW5kIGNhbiBhZ2FpbiBjYXB0dXJlIHZhcmlhYmxlcykuCiAgLy8vCiAgLy8vIEZvciBleGFtcGxlIHRoZSBmb2xsb3dpbmcgRGFydCBjb2RlIHByaW50cyAxIDMgLS0gMyA0LgogIC8vLwogIC8vLyAgICAgdmFyIGZzID0gW107CiAgLy8vICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDM7IChmKCkgeyBmcy5hZGQoZik7IHByaW50KGkpOyBpKys7IH0pKCkpIHsKICAvLy8gICAgICAgaSsrOwogIC8vLyAgICAgfQogIC8vLyAgICAgcHJpbnQoIi0tIik7CiAgLy8vICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI7IGkrKykgZnNbaV0oKTsKICAvLy8KICAvLy8gV2Ugc29sdmUgdGhpcyBieSBlbWl0dGluZyB0aGUgZm9sbG93aW5nIGNvZGUgKG9ubHkgZm9yIFthc3QuRm9yXSBsb29wcyk6CiAgLy8vICA8Q3JlYXRlIGJveD4gICAgPD09IG1vdmUgdGhlIGZpcnN0IGJveCBjcmVhdGlvbiBvdXRzaWRlIHRoZSBsb29wLgogIC8vLyAgPGluaXRpYWxpemVyPjsKICAvLy8gIGxvb3AtZW50cnk6CiAgLy8vICAgIGlmICghPGNvbmRpdGlvbj4pIGdvdG8gbG9vcC1leGl0OwogIC8vLyAgICA8Ym9keT4KICAvLy8gICAgPHVwZGF0ZSBib3g+ICAvLyBjcmVhdGUgYSBuZXcgYm94IGFuZCBjb3B5IHRoZSBjYXB0dXJlZCBsb29wLXZhcmlhYmxlcy4KICAvLy8gICAgPHVwZGF0ZXM+CiAgLy8vICAgIGdvdG8gbG9vcC1lbnRyeTsKICAvLy8gIGxvb3AtZXhpdDoKICB2b2lkIHN0YXJ0TG9vcCgKICAgICAgQ2FwdHVyZWRMb29wU2NvcGUgbG9vcEluZm8sIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBpZiAobG9vcEluZm8uaGFzQm94ZWRMb29wVmFyaWFibGVzKSB7CiAgICAgIC8vIElmIHRoZXJlIGFyZSBib3hlZCBsb29wIHZhcmlhYmxlcyB0aGVuIHdlIHNldCB1cCB0aGUgYm94IGFuZAogICAgICAvLyByZWRpcmVjdGlvbnMgYWxyZWFkeSBub3cuIFRoaXMgd2F5IHRoZSBpbml0aWFsaXplciBjYW4gd3JpdGUgaXRzCiAgICAgIC8vIHZhbHVlcyBpbnRvIHRoZSBib3guCiAgICAgIC8vIEZvciBvdGhlciBsb29wcyB0aGUgYm94IHdpbGwgYmUgY3JlYXRlZCB3aGVuIGVudGVyaW5nIHRoZSBib2R5LgogICAgICBlbnRlclNjb3BlKGxvb3BJbmZvLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CiAgfQoKICAvLy8gQ3JlYXRlIHBoaXMgYXQgdGhlIGxvb3AgZW50cnkgZm9yIGxvY2FsIHZhcmlhYmxlcyAocmVhZHkgZm9yIHRoZSB2YWx1ZXMKICAvLy8gZnJvbSB0aGUgYmFjayBlZGdlKS4gIFBvcHVsYXRlIHRoZSBwaGlzIHdpdGggdGhlIGN1cnJlbnQgdmFsdWVzLgogIHZvaWQgYmVnaW5Mb29wSGVhZGVyKEhCYXNpY0Jsb2NrIGxvb3BFbnRyeSkgewogICAgLy8gQ3JlYXRlIGEgY29weSBiZWNhdXNlIHdlIG1vZGlmeSB0aGUgbWFwIHdoaWxlIGl0ZXJhdGluZyBvdmVyIGl0LgogICAgTWFwPExvY2FsLCBISW5zdHJ1Y3Rpb24+IHNhdmVkRGlyZWN0TG9jYWxzID0KICAgICAgICBuZXcgTWFwPExvY2FsLCBISW5zdHJ1Y3Rpb24+LmZyb20oZGlyZWN0TG9jYWxzKTsKCiAgICAvLyBDcmVhdGUgcGhpcyBmb3IgYWxsIGVsZW1lbnRzIGluIHRoZSBkZWZpbml0aW9ucyBlbnZpcm9ubWVudC4KICAgIHNhdmVkRGlyZWN0TG9jYWxzLmZvckVhY2goKExvY2FsIGxvY2FsLCBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgICAgaWYgKGlzQWNjZXNzZWREaXJlY3RseShsb2NhbCkpIHsKICAgICAgICAvLyBXZSBrbm93ICd0aGlzJyBjYW5ub3QgYmUgbW9kaWZpZWQuCiAgICAgICAgaWYgKGxvY2FsICE9IHNjb3BlSW5mby50aGlzTG9jYWwpIHsKICAgICAgICAgIEhQaGkgcGhpID0gbmV3IEhQaGkuc2luZ2xlSW5wdXQoCiAgICAgICAgICAgICAgbG9jYWwsIGluc3RydWN0aW9uLCBfYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSk7CiAgICAgICAgICBsb29wRW50cnkuYWRkUGhpKHBoaSk7CiAgICAgICAgICBkaXJlY3RMb2NhbHNbbG9jYWxdID0gcGhpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkaXJlY3RMb2NhbHNbbG9jYWxdID0gaW5zdHJ1Y3Rpb247CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9CgogIHZvaWQgZW50ZXJMb29wQm9keSgKICAgICAgQ2FwdHVyZWRMb29wU2NvcGUgbG9vcEluZm8sIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICAvLyBJZiB0aGVyZSBhcmUgbm8gZGVjbGFyZWQgYm94ZWQgbG9vcCB2YXJpYWJsZXMgdGhlbiB3ZSBkaWQgbm90IGNyZWF0ZSB0aGUKICAgIC8vIGJveCBiZWZvcmUgdGhlIGluaXRpYWxpemVyIGFuZCB3ZSBoYXZlIHRvIGNyZWF0ZSB0aGUgYm94IG5vdy4KICAgIGlmICghbG9vcEluZm8uaGFzQm94ZWRMb29wVmFyaWFibGVzKSB7CiAgICAgIGVudGVyU2NvcGUobG9vcEluZm8sIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0KICB9CgogIHZvaWQgZW50ZXJMb29wVXBkYXRlcygKICAgICAgQ2FwdHVyZWRMb29wU2NvcGUgbG9vcEluZm8sIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICAvLyBJZiB0aGVyZSBhcmUgZGVjbGFyZWQgYm94ZWQgbG9vcCB2YXJpYWJsZXMgdGhlbiB0aGUgdXBkYXRlcyBtaWdodCBoYXZlCiAgICAvLyBhY2Nlc3MgdG8gdGhlIGJveCBhbmQgd2UgbXVzdCBzd2l0Y2ggdG8gYSBuZXcgYm94IGJlZm9yZSBleGVjdXRpbmcgdGhlCiAgICAvLyB1cGRhdGVzLgogICAgLy8gSW4gYWxsIG90aGVyIGNhc2VzIGEgbmV3IGJveCB3aWxsIGJlIGNyZWF0ZWQgd2hlbiBlbnRlcmluZyB0aGUgYm9keSBvZgogICAgLy8gdGhlIG5leHQgaXRlcmF0aW9uLgogICAgaWYgKGxvb3BJbmZvLmhhc0JveGVkTG9vcFZhcmlhYmxlcykgewogICAgICB1cGRhdGVDYXB0dXJlQm94KAogICAgICAgICAgbG9vcEluZm8uY29udGV4dCwgbG9vcEluZm8uYm94ZWRMb29wVmFyaWFibGVzLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CiAgfQoKICAvLy8gR29lcyB0aHJvdWdoIHRoZSBwaGlzIGNyZWF0ZWQgaW4gYmVnaW5Mb29wSGVhZGVyIGVudHJ5IGFuZCBhZGRzIHRoZQogIC8vLyBpbnB1dCBmcm9tIHRoZSBiYWNrIGVkZ2UgKGZyb20gdGhlIGN1cnJlbnQgdmFsdWUgb2YgZGlyZWN0TG9jYWxzKSB0byB0aGVtLgogIHZvaWQgZW5kTG9vcChIQmFzaWNCbG9jayBsb29wRW50cnkpIHsKICAgIC8vIElmIHRoZSBsb29wIGhhcyBhbiBhYm9ydGluZyBib2R5LCB3ZSBkb24ndCB1cGRhdGUgdGhlIGxvb3AKICAgIC8vIHBoaXMuCiAgICBpZiAobG9vcEVudHJ5LnByZWRlY2Vzc29ycy5sZW5ndGggPT0gMSkgcmV0dXJuOwogICAgbG9vcEVudHJ5LmZvckVhY2hQaGkoKEhQaGkgcGhpKSB7CiAgICAgIExvY2FsIGVsZW1lbnQgPSBwaGkuc291cmNlRWxlbWVudDsKICAgICAgSEluc3RydWN0aW9uIHBvc3RMb29wRGVmaW5pdGlvbiA9IGRpcmVjdExvY2Fsc1tlbGVtZW50XTsKICAgICAgcGhpLmFkZElucHV0KHBvc3RMb29wRGVmaW5pdGlvbik7CiAgICB9KTsKICB9CgogIC8vLyBNZXJnZSBbb3RoZXJMb2NhbHNdIGludG8gdGhpcyBsb2NhbHMgaGFuZGxlciwgY3JlYXRpbmcgcGhpLW5vZGVzIHdoZW4KICAvLy8gdGhlcmUgaXMgYSBjb25mbGljdC4KICAvLy8gSWYgYSBwaGkgbm9kZSBpcyBuZWNlc3NhcnksIGl0IHdpbGwgdXNlIHRoaXMgaGFuZGxlcidzIGluc3RydWN0aW9uIGFzIHRoZQogIC8vLyBmaXJzdCBpbnB1dCwgYW5kIHRoZSBvdGhlckxvY2FscyBpbnN0cnVjdGlvbiBhcyB0aGUgc2Vjb25kLgogIHZvaWQgbWVyZ2VXaXRoKExvY2Fsc0hhbmRsZXIgb3RoZXJMb2NhbHMsIEhCYXNpY0Jsb2NrIGpvaW5CbG9jaykgewogICAgLy8gSWYgYW4gZWxlbWVudCBpcyBpbiBvbmUgbWFwIGJ1dCBub3QgdGhlIG90aGVyIHdlIGNhbiBzYWZlbHkKICAgIC8vIGlnbm9yZSBpdC4gSXQgbWVhbnMgdGhhdCBhIHZhcmlhYmxlIHdhcyBkZWNsYXJlZCBpbiB0aGUKICAgIC8vIGJsb2NrLiBTaW5jZSB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgYXJlIHNjb3BlZCB0aGUgZGVjbGFyZWQKICAgIC8vIHZhcmlhYmxlIGNhbm5vdCBiZSBhbGl2ZSBvdXRzaWRlIHRoZSBibG9jay4gTm90ZTogdGhpcyBpcyBvbmx5CiAgICAvLyB0cnVlIGZvciBub2RlcyB3aGVyZSB3ZSBkbyBqb2lucy4KICAgIE1hcDxMb2NhbCwgSEluc3RydWN0aW9uPiBqb2luZWRMb2NhbHMgPSBuZXcgTWFwPExvY2FsLCBISW5zdHJ1Y3Rpb24+KCk7CiAgICBvdGhlckxvY2Fscy5kaXJlY3RMb2NhbHMuZm9yRWFjaCgoTG9jYWwgbG9jYWwsIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgICAvLyBXZSBrbm93ICd0aGlzJyBjYW5ub3QgYmUgbW9kaWZpZWQuCiAgICAgIGlmIChsb2NhbCA9PSBzY29wZUluZm8udGhpc0xvY2FsKSB7CiAgICAgICAgYXNzZXJ0KGRpcmVjdExvY2Fsc1tsb2NhbF0gPT0gaW5zdHJ1Y3Rpb24pOwogICAgICAgIGpvaW5lZExvY2Fsc1tsb2NhbF0gPSBpbnN0cnVjdGlvbjsKICAgICAgfSBlbHNlIHsKICAgICAgICBISW5zdHJ1Y3Rpb24gbWluZSA9IGRpcmVjdExvY2Fsc1tsb2NhbF07CiAgICAgICAgaWYgKG1pbmUgPT0gbnVsbCkgcmV0dXJuOwogICAgICAgIGlmIChpZGVudGljYWwoaW5zdHJ1Y3Rpb24sIG1pbmUpKSB7CiAgICAgICAgICBqb2luZWRMb2NhbHNbbG9jYWxdID0gaW5zdHJ1Y3Rpb247CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIEhJbnN0cnVjdGlvbiBwaGkgPSBuZXcgSFBoaS5tYW55SW5wdXRzKAogICAgICAgICAgICAgIGxvY2FsLAogICAgICAgICAgICAgIDxISW5zdHJ1Y3Rpb24+W21pbmUsIGluc3RydWN0aW9uXSwKICAgICAgICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSk7CiAgICAgICAgICBqb2luQmxvY2suYWRkUGhpKHBoaSk7CiAgICAgICAgICBqb2luZWRMb2NhbHNbbG9jYWxdID0gcGhpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICBkaXJlY3RMb2NhbHMgPSBqb2luZWRMb2NhbHM7CiAgfQoKICAvLy8gV2hlbiBjb250cm9sIGZsb3cgbWVyZ2VzLCB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBtZXJnZSBzZXZlcmFsCiAgLy8vIGxvY2Fsc0hhbmRsZXJzIGludG8gYSBuZXcgb25lIHVzaW5nIHBoaXMuICBUaGUgbmV3IGxvY2Fsc0hhbmRsZXIgaXMKICAvLy8gcmV0dXJuZWQuICBVbmxlc3MgaXQgaXMgYWxzbyBpbiB0aGUgbGlzdCwgdGhlIGN1cnJlbnQgbG9jYWxzSGFuZGxlciBpcyBub3QKICAvLy8gdXNlZCBmb3IgaXRzIHZhbHVlcywgb25seSBmb3IgaXRzIGRlY2xhcmVkIHZhcmlhYmxlcy4gVGhpcyBpcyBhIHdheSB0bwogIC8vLyBleGNsdWRlIGxvY2FsIHZhbHVlcyBmcm9tIHRoZSByZXN1bHQgd2hlbiB0aGV5IGFyZSBubyBsb25nZXIgaW4gc2NvcGUuCiAgTG9jYWxzSGFuZGxlciBtZXJnZU11bHRpcGxlKAogICAgICBMaXN0PExvY2Fsc0hhbmRsZXI+IGxvY2Fsc0hhbmRsZXJzLCBIQmFzaWNCbG9jayBqb2luQmxvY2spIHsKICAgIGFzc2VydChsb2NhbHNIYW5kbGVycy5sZW5ndGggPiAwKTsKICAgIGlmIChsb2NhbHNIYW5kbGVycy5sZW5ndGggPT0gMSkgcmV0dXJuIGxvY2Fsc0hhbmRsZXJzLnNpbmdsZTsKICAgIE1hcDxMb2NhbCwgSEluc3RydWN0aW9uPiBqb2luZWRMb2NhbHMgPSBuZXcgTWFwPExvY2FsLCBISW5zdHJ1Y3Rpb24+KCk7CiAgICBISW5zdHJ1Y3Rpb24gdGhpc1ZhbHVlID0gbnVsbDsKICAgIGRpcmVjdExvY2Fscy5mb3JFYWNoKChMb2NhbCBsb2NhbCwgSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICAgIGlmIChsb2NhbCAhPSBzY29wZUluZm8udGhpc0xvY2FsKSB7CiAgICAgICAgSFBoaSBwaGkgPSBuZXcgSFBoaS5ub0lucHV0cyhsb2NhbCwgX2Fic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUpOwogICAgICAgIGpvaW5lZExvY2Fsc1tsb2NhbF0gPSBwaGk7CiAgICAgICAgam9pbkJsb2NrLmFkZFBoaShwaGkpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFdlIGtub3cgdGhhdCAidGhpcyIgbmV2ZXIgY2hhbmdlcywgaWYgaXQncyB0aGVyZS4KICAgICAgICAvLyBTYXZlIGl0IGZvciBsYXRlci4gV2hpbGUgbWVyZ2luZywgdGhlcmUgaXMgbm8gcGhpIGZvciAidGhpcyIsCiAgICAgICAgLy8gc28gd2UgZG9uJ3QgaGF2ZSB0byBzcGVjaWFsIGNhc2UgaXQgaW4gdGhlIG1lcmdlIGxvb3AuCiAgICAgICAgdGhpc1ZhbHVlID0gaW5zdHJ1Y3Rpb247CiAgICAgIH0KICAgIH0pOwogICAgZm9yIChMb2NhbHNIYW5kbGVyIGhhbmRsZXIgaW4gbG9jYWxzSGFuZGxlcnMpIHsKICAgICAgaGFuZGxlci5kaXJlY3RMb2NhbHMuZm9yRWFjaCgoTG9jYWwgbG9jYWwsIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgICAgIEhQaGkgcGhpID0gam9pbmVkTG9jYWxzW2xvY2FsXTsKICAgICAgICBpZiAocGhpICE9IG51bGwpIHsKICAgICAgICAgIHBoaS5hZGRJbnB1dChpbnN0cnVjdGlvbik7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIGlmICh0aGlzVmFsdWUgIT0gbnVsbCkgewogICAgICAvLyBJZiB0aGVyZSB3YXMgYSAidGhpcyIgZm9yIHRoZSBzY29wZSwgYWRkIGl0IHRvIHRoZSBuZXcgbG9jYWxzLgogICAgICBqb2luZWRMb2NhbHNbc2NvcGVJbmZvLnRoaXNMb2NhbF0gPSB0aGlzVmFsdWU7CiAgICB9CgogICAgLy8gUmVtb3ZlIGxvY2FscyB0aGF0IGFyZSBub3QgaW4gYWxsIGhhbmRsZXJzLgogICAgZGlyZWN0TG9jYWxzID0gbmV3IE1hcDxMb2NhbCwgSEluc3RydWN0aW9uPigpOwogICAgam9pbmVkTG9jYWxzLmZvckVhY2goKExvY2FsIGxvY2FsLCBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgICAgaWYgKGxvY2FsICE9IHNjb3BlSW5mby50aGlzTG9jYWwgJiYKICAgICAgICAgIGluc3RydWN0aW9uLmlucHV0cy5sZW5ndGggIT0gbG9jYWxzSGFuZGxlcnMubGVuZ3RoKSB7CiAgICAgICAgam9pbkJsb2NrLnJlbW92ZVBoaShpbnN0cnVjdGlvbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGlyZWN0TG9jYWxzW2xvY2FsXSA9IGluc3RydWN0aW9uOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgQWJzdHJhY3RWYWx1ZSBjYWNoZWRUeXBlT2ZUaGlzOwoKICBBYnN0cmFjdFZhbHVlIGdldFR5cGVPZlRoaXMoKSB7CiAgICBBYnN0cmFjdFZhbHVlIHJlc3VsdCA9IGNhY2hlZFR5cGVPZlRoaXM7CiAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKICAgICAgVGhpc0xvY2FsIGxvY2FsID0gc2NvcGVJbmZvLnRoaXNMb2NhbDsKICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gbG9jYWwuZW5jbG9zaW5nQ2xhc3M7CiAgICAgIGlmIChjbG9zZWRXb3JsZC5pc1VzZWRBc01peGluKGNscykpIHsKICAgICAgICAvLyBJZiB0aGUgZW5jbG9zaW5nIGNsYXNzIGlzIHVzZWQgYXMgYSBtaXhpbiwgWzp0aGlzOl0gY2FuIGJlCiAgICAgICAgLy8gb2YgdGhlIGNsYXNzIHRoYXQgbWl4aW5zIHRoZSBlbmNsb3NpbmcgY2xhc3MuIFRoZXNlIHR3bwogICAgICAgIC8vIGNsYXNzZXMgZG8gbm90IGhhdmUgYSBzdWJjbGFzcyByZWxhdGlvbnNoaXAsIHNvLCBmb3IKICAgICAgICAvLyBzaW1wbGljaXR5LCB3ZSBtYXJrIHRoZSB0eXBlIGFzIGFuIGludGVyZmFjZSB0eXBlLgogICAgICAgIHJlc3VsdCA9IF9hYnN0cmFjdFZhbHVlRG9tYWluLmNyZWF0ZU5vbk51bGxTdWJ0eXBlKGNscyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0ID0gX2Fic3RyYWN0VmFsdWVEb21haW4uY3JlYXRlTm9uTnVsbFN1YmNsYXNzKGNscyk7CiAgICAgIH0KICAgICAgY2FjaGVkVHlwZU9mVGhpcyA9IHJlc3VsdDsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBNYXA8RmllbGRFbnRpdHksIEFic3RyYWN0VmFsdWU+IGNhY2hlZFR5cGVzT2ZDYXB0dXJlZFZhcmlhYmxlcyA9CiAgICAgIG5ldyBNYXA8RmllbGRFbnRpdHksIEFic3RyYWN0VmFsdWU+KCk7CgogIEFic3RyYWN0VmFsdWUgZ2V0VHlwZU9mQ2FwdHVyZWRWYXJpYWJsZShGaWVsZEVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gY2FjaGVkVHlwZXNPZkNhcHR1cmVkVmFyaWFibGVzLnB1dElmQWJzZW50KGVsZW1lbnQsICgpIHsKICAgICAgcmV0dXJuIEFic3RyYWN0VmFsdWVGYWN0b3J5LmluZmVycmVkVHlwZUZvck1lbWJlcigKICAgICAgICAgIGVsZW1lbnQsIF9nbG9iYWxJbmZlcmVuY2VSZXN1bHRzKTsKICAgIH0pOwogIH0KCiAgLy8vIFZhcmlhYmxlcyBzdG9yZWQgaW4gdGhlIGN1cnJlbnQgYWN0aXZhdGlvbi4gVGhlc2UgdmFyaWFibGVzIGFyZQogIC8vLyBiZWluZyB1cGRhdGVkIGluIHRyeS9jYXRjaCBibG9ja3MsIGFuZCBzaG91bGQgYmUKICAvLy8gYWNjZXNzZWQgaW5kaXJlY3RseSB0aHJvdWdoIFtITG9jYWxHZXRdIGFuZCBbSExvY2FsU2V0XS4KICBNYXA8TG9jYWwsIEhMb2NhbFZhbHVlPiBhY3RpdmF0aW9uVmFyaWFibGVzID0gPExvY2FsLCBITG9jYWxWYWx1ZT57fTsKCiAgU3ludGhldGljTG9jYWwgY3JlYXRlTG9jYWwoU3RyaW5nIG5hbWUpIHsKICAgIHJldHVybiBuZXcgU3ludGhldGljTG9jYWwobmFtZSwgZXhlY3V0YWJsZUNvbnRleHQsIG1lbWJlckNvbnRleHQpOwogIH0KfQoKLy8vIEEgc3ludGhldGljIGxvY2FsIHZhcmlhYmxlIG9ubHkgdXNlZCB3aXRoIHRoZSBTU0EgZ3JhcGguCi8vLwovLy8gRm9yIGluc3RhbmNlIHVzZWQgZm9yIGhvbGRpbmcgcmV0dXJuIHZhbHVlIG9mIGZ1bmN0aW9uIG9yIHRoZSBleGNlcHRpb24gb2YgYQovLy8gdHJ5LWNhdGNoIHN0YXRlbWVudC4KY2xhc3MgU3ludGhldGljTG9jYWwgZXh0ZW5kcyBMb2NhbCB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgZmluYWwgRW50aXR5IGV4ZWN1dGFibGVDb250ZXh0OwogIGZpbmFsIE1lbWJlckVudGl0eSBtZW1iZXJDb250ZXh0OwoKICAvLyBBdm9pZCBzbG93IE9iamVjdC5oYXNoQ29kZS4KICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgaGFzaENvZGUgPSBfbmV4dEhhc2hDb2RlID0gKF9uZXh0SGFzaENvZGUgKyAxKS50b1Vuc2lnbmVkKDMwKTsKICBzdGF0aWMgaW50IF9uZXh0SGFzaENvZGUgPSAwOwoKICBTeW50aGV0aWNMb2NhbCh0aGlzLm5hbWUsIHRoaXMuZXhlY3V0YWJsZUNvbnRleHQsIHRoaXMubWVtYmVyQ29udGV4dCk7CgogIEBvdmVycmlkZQogIHRvU3RyaW5nKCkgPT4gJ1N5bnRoZXRpY0xvY2FsKCRuYW1lKSc7Cn0KgscATk48ARoZJCExISgpLkQuKgEdFRUBTU4JFk8jBktKUERKTh4XQDYiJAFHBko2BlBQGAYZFR0MEyQMBiQBIAEqAUpDATcBMicBPCYBSRYrHSBEITAVKFAIMUcIBhQEAUZEICpONzUtKyElKTM5M08BT1A1LiM7BAFASC8WEAQBTjkTRk1QJzEWKShMGiBGDSoGKC1MT0RIFhszIzpMM0ozPkQ3NCMoDyMICAQBTTVKLUsQMTg2TD0nOCcsBiUEASwGPxYcGx8sIyssIAE/KTBENBIKCEU3LScIMQEtRAFJSyRJOUtHLUUjCkMeTjc3PytQTRJPNzc7BgE+REUuAU5RSk5CKzI5Sjs0TzdOME4sCCBAMwgpOk43M1A3LTBOLAgGBAFNUCkbNTIEAS0bMT88LiwEAR4xNTIEAS40BAFJThFPJSkqFClDQhEUFUYmCggwJzQcCBQwOThELS0xHkYdFyE4GUhIK0wSJiEIIAEuOUMbFQ0uMEJAIBoGBAFBF04nLQYQBAFNOEREQhIxKAYBNx9DNTEZCAQBODUqCAQBTD80LxkYGQYrNyUjITggGSYhCCABTkhMHy4TSzYNLjATTzYGBAFPSRQGT0xEOwZNUE4cBk9ORExMR05ITikGPQYXShEMFy8GT0kWEysQURMaEhJJKkZKHkkvBgQBTkcwSDE5AURIJy4sK0UhJREtCggIBAEWSVBFKy8GBAEZSU5OEE4bKhhNBgQBSlEoQg00Jik/KAgEAUwbUEJFQz9CRilMTywqNCsPMSIsLREyFTExISUKCAghBAFJSlFNTR9DJ0JMI0MqTyMfDz1JQiEICDRNKBslCgoGHUg1BgEzM0MqQCoPKwgIEQQBIgEiLRotLixGQ0A+QQ9CCCEGEwQBQy0BQUQ5LQgEAUY3P0gBLEcEAgE9BFEZJQwVIiQBIQxLIAFJAQwpAgEscGFja2FnZTpjb21waWxlci9zcmMvc3NhL2xvY2Fsc19oYW5kbGVyLmRhcnQzc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvc3NhL2xvb3BfaGFuZGxlci5kYXJ0tMMvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CgppbXBvcnQgJy4uL2Nsb3N1cmUuZGFydCcgc2hvdyBDYXB0dXJlZExvb3BTY29wZTsKaW1wb3J0ICcuLi9lbGVtZW50cy9qdW1wcy5kYXJ0JzsKaW1wb3J0ICcuLi9pby9zb3VyY2VfaW5mb3JtYXRpb24uZGFydCc7CgppbXBvcnQgJ2J1aWxkZXJfa2VybmVsLmRhcnQnOwppbXBvcnQgJ2dyYXBoX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnanVtcF9oYW5kbGVyLmRhcnQnOwppbXBvcnQgJ2xvY2Fsc19oYW5kbGVyLmRhcnQnOwppbXBvcnQgJ25vZGVzLmRhcnQnOwoKLy8vIEJ1aWxkcyB0aGUgU1NBIGdyYXBoIGZvciBsb29wIG5vZGVzLgphYnN0cmFjdCBjbGFzcyBMb29wSGFuZGxlciB7CiAgZmluYWwgR3JhcGhCdWlsZGVyIGJ1aWxkZXI7CgogIExvb3BIYW5kbGVyKHRoaXMuYnVpbGRlcik7CgogIC8vLyBCdWlsZHMgYSBncmFwaCBmb3IgdGhlIGdpdmVuIFtsb29wXSBub2RlLgogIC8vLwogIC8vLyBGb3Igd2hpbGUgbG9vcHMsIFtpbml0aWFsaXplXSBhbmQgW3VwZGF0ZV0gYXJlIG51bGwuCiAgLy8vIFRoZSBbY29uZGl0aW9uXSBmdW5jdGlvbiBtdXN0IHJldHVybiBhIGJvb2xlYW4gcmVzdWx0LgogIC8vLyBOb25lIG9mIHRoZSBmdW5jdGlvbnMgbXVzdCBsZWF2ZSBhbnl0aGluZyBvbiB0aGUgc3RhY2suCiAgdm9pZCBoYW5kbGVMb29wKAogICAgICBpci5Ob2RlIGxvb3AsCiAgICAgIENhcHR1cmVkTG9vcFNjb3BlIGxvb3BDbG9zdXJlSW5mbywKICAgICAgSnVtcFRhcmdldCBqdW1wVGFyZ2V0LAogICAgICB2b2lkIGluaXRpYWxpemUoKSwKICAgICAgSEluc3RydWN0aW9uIGNvbmRpdGlvbigpLAogICAgICB2b2lkIHVwZGF0ZSgpLAogICAgICB2b2lkIGJvZHkoKSwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIC8vIEdlbmVyYXRlOgogICAgLy8gIDxpbml0aWFsaXplcj4KICAgIC8vICBsb29wLWVudHJ5OgogICAgLy8gICAgaWYgKCE8Y29uZGl0aW9uPikgZ290byBsb29wLWV4aXQ7CiAgICAvLyAgICA8Ym9keT4KICAgIC8vICAgIDx1cGRhdGVzPgogICAgLy8gICAgZ290byBsb29wLWVudHJ5OwogICAgLy8gIGxvb3AtZXhpdDoKCiAgICBidWlsZGVyLmxvY2Fsc0hhbmRsZXIuc3RhcnRMb29wKGxvb3BDbG9zdXJlSW5mbywgc291cmNlSW5mb3JtYXRpb24pOwoKICAgIC8vIFRoZSBpbml0aWFsaXplci4KICAgIFN1YkV4cHJlc3Npb24gaW5pdGlhbGl6ZXJHcmFwaCA9IG51bGw7CiAgICBIQmFzaWNCbG9jayBzdGFydEJsb2NrOwogICAgaWYgKGluaXRpYWxpemUgIT0gbnVsbCkgewogICAgICBIQmFzaWNCbG9jayBpbml0aWFsaXplckJsb2NrID0gYnVpbGRlci5vcGVuTmV3QmxvY2soKTsKICAgICAgc3RhcnRCbG9jayA9IGluaXRpYWxpemVyQmxvY2s7CiAgICAgIGluaXRpYWxpemUoKTsKICAgICAgYXNzZXJ0KCFidWlsZGVyLmlzQWJvcnRlZCgpKTsKICAgICAgaW5pdGlhbGl6ZXJHcmFwaCA9IG5ldyBTdWJFeHByZXNzaW9uKGluaXRpYWxpemVyQmxvY2ssIGJ1aWxkZXIuY3VycmVudCk7CiAgICB9CgogICAgYnVpbGRlci5sb29wRGVwdGgrKzsKICAgIEp1bXBIYW5kbGVyIGp1bXBIYW5kbGVyID0gYmVnaW5Mb29wSGVhZGVyKGxvb3AsIGp1bXBUYXJnZXQpOwogICAgSExvb3BJbmZvcm1hdGlvbiBsb29wSW5mbyA9IGJ1aWxkZXIuY3VycmVudC5sb29wSW5mb3JtYXRpb247CiAgICBIQmFzaWNCbG9jayBjb25kaXRpb25CbG9jayA9IGJ1aWxkZXIuY3VycmVudDsKICAgIGlmIChzdGFydEJsb2NrID09IG51bGwpIHN0YXJ0QmxvY2sgPSBjb25kaXRpb25CbG9jazsKCiAgICBISW5zdHJ1Y3Rpb24gY29uZGl0aW9uSW5zdHJ1Y3Rpb24gPSBjb25kaXRpb24oKTsKICAgIEhCYXNpY0Jsb2NrIGNvbmRpdGlvbkVuZEJsb2NrID0gYnVpbGRlci5jbG9zZSgKICAgICAgICBuZXcgSExvb3BCcmFuY2goYnVpbGRlci5hYnN0cmFjdFZhbHVlRG9tYWluLCBjb25kaXRpb25JbnN0cnVjdGlvbikpOwogICAgU3ViRXhwcmVzc2lvbiBjb25kaXRpb25FeHByZXNzaW9uID0KICAgICAgICBuZXcgU3ViRXhwcmVzc2lvbihjb25kaXRpb25CbG9jaywgY29uZGl0aW9uRW5kQmxvY2spOwoKICAgIC8vIFNhdmUgdGhlIHZhbHVlcyBvZiB0aGUgbG9jYWwgdmFyaWFibGVzIGF0IHRoZSBlbmQgb2YgdGhlIGNvbmRpdGlvbgogICAgLy8gYmxvY2suICBUaGVzZSBhcmUgdGhlIHZhbHVlcyB0aGF0IHdpbGwgZmxvdyB0byB0aGUgbG9vcCBleGl0IGlmIHRoZQogICAgLy8gY29uZGl0aW9uIGZhaWxzLgogICAgTG9jYWxzSGFuZGxlciBzYXZlZExvY2FscyA9IG5ldyBMb2NhbHNIYW5kbGVyLmZyb20oYnVpbGRlci5sb2NhbHNIYW5kbGVyKTsKCiAgICAvLyBUaGUgYm9keS4KICAgIEhCYXNpY0Jsb2NrIGJlZ2luQm9keUJsb2NrID0gYnVpbGRlci5hZGROZXdCbG9jaygpOwogICAgY29uZGl0aW9uRW5kQmxvY2suYWRkU3VjY2Vzc29yKGJlZ2luQm9keUJsb2NrKTsKICAgIGJ1aWxkZXIub3BlbihiZWdpbkJvZHlCbG9jayk7CgogICAgYnVpbGRlci5sb2NhbHNIYW5kbGVyLmVudGVyTG9vcEJvZHkobG9vcENsb3N1cmVJbmZvLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBib2R5KCk7CgogICAgU3ViR3JhcGggYm9keUdyYXBoID0gbmV3IFN1YkdyYXBoKGJlZ2luQm9keUJsb2NrLCBidWlsZGVyLmxhc3RPcGVuZWRCbG9jayk7CiAgICBIQmFzaWNCbG9jayBib2R5QmxvY2sgPSBidWlsZGVyLmN1cnJlbnQ7CiAgICBpZiAoYnVpbGRlci5jdXJyZW50ICE9IG51bGwpCiAgICAgIGJ1aWxkZXIuY2xvc2UobmV3IEhHb3RvKGJ1aWxkZXIuYWJzdHJhY3RWYWx1ZURvbWFpbikpOwoKICAgIFN1YkV4cHJlc3Npb24gdXBkYXRlR3JhcGg7CgogICAgYm9vbCBsb29wSXNEZWdlbmVyYXRlID0gIWp1bXBIYW5kbGVyLmhhc0FueUNvbnRpbnVlKCkgJiYgYm9keUJsb2NrID09IG51bGw7CiAgICBpZiAoIWxvb3BJc0RlZ2VuZXJhdGUpIHsKICAgICAgLy8gVXBkYXRlLgogICAgICAvLyBXZSBjcmVhdGUgYW4gdXBkYXRlIGJsb2NrLCBldmVuIHdoZW4gd2UgYXJlIGluIGEgd2hpbGUgbG9vcC4gVGhlcmUgdGhlCiAgICAgIC8vIHVwZGF0ZSBibG9jayBpcyB0aGUganVtcC10YXJnZXQgZm9yIGNvbnRpbnVlIHN0YXRlbWVudHMuIFdlIGNvdWxkIGF2b2lkCiAgICAgIC8vIHRoZSBjcmVhdGlvbiBpZiB0aGVyZSBpcyBubyBjb250aW51ZSwgYnV0IGZvciBub3cgd2UgYWx3YXlzIGNyZWF0ZSBpdC4KICAgICAgSEJhc2ljQmxvY2sgdXBkYXRlQmxvY2sgPSBidWlsZGVyLmFkZE5ld0Jsb2NrKCk7CgogICAgICBMaXN0PExvY2Fsc0hhbmRsZXI+IGNvbnRpbnVlSGFuZGxlcnMgPSA8TG9jYWxzSGFuZGxlcj5bXTsKICAgICAganVtcEhhbmRsZXIKICAgICAgICAgIC5mb3JFYWNoQ29udGludWUoKEhDb250aW51ZSBpbnN0cnVjdGlvbiwgTG9jYWxzSGFuZGxlciBsb2NhbHMpIHsKICAgICAgICBpbnN0cnVjdGlvbi5ibG9jay5hZGRTdWNjZXNzb3IodXBkYXRlQmxvY2spOwogICAgICAgIGNvbnRpbnVlSGFuZGxlcnMuYWRkKGxvY2Fscyk7CiAgICAgIH0pOwoKICAgICAgaWYgKGJvZHlCbG9jayAhPSBudWxsKSB7CiAgICAgICAgY29udGludWVIYW5kbGVycy5hZGQoYnVpbGRlci5sb2NhbHNIYW5kbGVyKTsKICAgICAgICBib2R5QmxvY2suYWRkU3VjY2Vzc29yKHVwZGF0ZUJsb2NrKTsKICAgICAgfQoKICAgICAgYnVpbGRlci5vcGVuKHVwZGF0ZUJsb2NrKTsKICAgICAgYnVpbGRlci5sb2NhbHNIYW5kbGVyID0KICAgICAgICAgIGNvbnRpbnVlSGFuZGxlcnNbMF0ubWVyZ2VNdWx0aXBsZShjb250aW51ZUhhbmRsZXJzLCB1cGRhdGVCbG9jayk7CgogICAgICBMaXN0PExhYmVsRGVmaW5pdGlvbj4gbGFiZWxzID0ganVtcEhhbmRsZXIubGFiZWxzOwogICAgICBpZiAobGFiZWxzLmlzTm90RW1wdHkpIHsKICAgICAgICBiZWdpbkJvZHlCbG9jay5zZXRCbG9ja0Zsb3coCiAgICAgICAgICAgIG5ldyBITGFiZWxlZEJsb2NrSW5mb3JtYXRpb24oCiAgICAgICAgICAgICAgICBuZXcgSFN1YkdyYXBoQmxvY2tJbmZvcm1hdGlvbihib2R5R3JhcGgpLCBqdW1wSGFuZGxlci5sYWJlbHMsCiAgICAgICAgICAgICAgICBpc0NvbnRpbnVlOiB0cnVlKSwKICAgICAgICAgICAgdXBkYXRlQmxvY2spOwogICAgICB9IGVsc2UgaWYgKGp1bXBUYXJnZXQgIT0gbnVsbCAmJiBqdW1wVGFyZ2V0LmlzQ29udGludWVUYXJnZXQpIHsKICAgICAgICBiZWdpbkJvZHlCbG9jay5zZXRCbG9ja0Zsb3coCiAgICAgICAgICAgIG5ldyBITGFiZWxlZEJsb2NrSW5mb3JtYXRpb24uaW1wbGljaXQoCiAgICAgICAgICAgICAgICBuZXcgSFN1YkdyYXBoQmxvY2tJbmZvcm1hdGlvbihib2R5R3JhcGgpLCBqdW1wVGFyZ2V0LAogICAgICAgICAgICAgICAgaXNDb250aW51ZTogdHJ1ZSksCiAgICAgICAgICAgIHVwZGF0ZUJsb2NrKTsKICAgICAgfQoKICAgICAgYnVpbGRlci5sb2NhbHNIYW5kbGVyCiAgICAgICAgICAuZW50ZXJMb29wVXBkYXRlcyhsb29wQ2xvc3VyZUluZm8sIHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgICAgIHVwZGF0ZSgpOwoKICAgICAgSEJhc2ljQmxvY2sgdXBkYXRlRW5kQmxvY2sgPQogICAgICAgICAgYnVpbGRlci5jbG9zZShuZXcgSEdvdG8oYnVpbGRlci5hYnN0cmFjdFZhbHVlRG9tYWluKSk7CiAgICAgIC8vIFRoZSBiYWNrLWVkZ2UgY29tcGxldGluZyB0aGUgY3ljbGUuCiAgICAgIHVwZGF0ZUVuZEJsb2NrLmFkZFN1Y2Nlc3Nvcihjb25kaXRpb25CbG9jayk7CiAgICAgIHVwZGF0ZUdyYXBoID0gbmV3IFN1YkV4cHJlc3Npb24odXBkYXRlQmxvY2ssIHVwZGF0ZUVuZEJsb2NrKTsKCiAgICAgIC8vIEF2b2lkIGEgY3JpdGljYWwgZWRnZSBmcm9tIHRoZSBjb25kaXRpb24gdG8gdGhlIGxvb3AtZXhpdCBib2R5LgogICAgICBIQmFzaWNCbG9jayBjb25kaXRpb25FeGl0QmxvY2sgPSBidWlsZGVyLmFkZE5ld0Jsb2NrKCk7CiAgICAgIGJ1aWxkZXIub3Blbihjb25kaXRpb25FeGl0QmxvY2spOwogICAgICBidWlsZGVyLmNsb3NlKG5ldyBIR290byhidWlsZGVyLmFic3RyYWN0VmFsdWVEb21haW4pKTsKICAgICAgY29uZGl0aW9uRW5kQmxvY2suYWRkU3VjY2Vzc29yKGNvbmRpdGlvbkV4aXRCbG9jayk7CgogICAgICBlbmRMb29wKGNvbmRpdGlvbkJsb2NrLCBjb25kaXRpb25FeGl0QmxvY2ssIGp1bXBIYW5kbGVyLCBzYXZlZExvY2Fscyk7CgogICAgICBjb25kaXRpb25CbG9jay5wb3N0UHJvY2Vzc0xvb3BIZWFkZXIoKTsKICAgICAgSExvb3BCbG9ja0luZm9ybWF0aW9uIGluZm8gPSBuZXcgSExvb3BCbG9ja0luZm9ybWF0aW9uKAogICAgICAgICAgbG9vcEtpbmQobG9vcCksCiAgICAgICAgICBidWlsZGVyLndyYXBFeHByZXNzaW9uR3JhcGgoaW5pdGlhbGl6ZXJHcmFwaCksCiAgICAgICAgICBidWlsZGVyLndyYXBFeHByZXNzaW9uR3JhcGgoY29uZGl0aW9uRXhwcmVzc2lvbiksCiAgICAgICAgICBidWlsZGVyLndyYXBTdGF0ZW1lbnRHcmFwaChib2R5R3JhcGgpLAogICAgICAgICAgYnVpbGRlci53cmFwRXhwcmVzc2lvbkdyYXBoKHVwZGF0ZUdyYXBoKSwKICAgICAgICAgIGNvbmRpdGlvbkJsb2NrLmxvb3BJbmZvcm1hdGlvbi50YXJnZXQsCiAgICAgICAgICBjb25kaXRpb25CbG9jay5sb29wSW5mb3JtYXRpb24ubGFiZWxzLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb24pOwoKICAgICAgc3RhcnRCbG9jay5zZXRCbG9ja0Zsb3coaW5mbywgYnVpbGRlci5jdXJyZW50KTsKICAgICAgbG9vcEluZm8ubG9vcEJsb2NrSW5mb3JtYXRpb24gPSBpbmZvOwogICAgfSBlbHNlIHsKICAgICAgLy8gVGhlIGJvZHkgb2YgdGhlIGZvci93aGlsZSBsb29wIGFsd2F5cyBhYm9ydHMsIHNvIHRoZXJlIGlzIG5vIGJhY2sgZWRnZS4KICAgICAgLy8gV2UgdHVybiB0aGUgY29kZSBpbnRvOgogICAgICAvLyBpZiAoY29uZGl0aW9uKSB7CiAgICAgIC8vICAgYm9keTsKICAgICAgLy8gfSBlbHNlIHsKICAgICAgLy8gICAvLyBXZSBhbHdheXMgY3JlYXRlIGFuIGVtcHR5IGVsc2UgYmxvY2sgdG8gYXZvaWQgY3JpdGljYWwgZWRnZXMuCiAgICAgIC8vIH0KICAgICAgLy8KICAgICAgLy8gSWYgdGhlcmUgaXMgYW55IGJyZWFrIGluIHRoZSBib2R5LCB3ZSBhdHRhY2ggYSBzeW50aGV0aWMKICAgICAgLy8gbGFiZWwgdG8gdGhlIGlmLgogICAgICBIQmFzaWNCbG9jayBlbHNlQmxvY2sgPSBidWlsZGVyLmFkZE5ld0Jsb2NrKCk7CiAgICAgIGJ1aWxkZXIub3BlbihlbHNlQmxvY2spOwogICAgICBidWlsZGVyLmNsb3NlKG5ldyBIR290byhidWlsZGVyLmFic3RyYWN0VmFsdWVEb21haW4pKTsKICAgICAgLy8gUGFzcyB0aGUgZWxzZUJsb2NrIGFzIHRoZSBicmFuY2hCbG9jaywgYmVjYXVzZSB0aGF0J3MgdGhlIGJsb2NrIHdlIGdvCiAgICAgIC8vIHRvIGp1c3QgYmVmb3JlIGxlYXZpbmcgdGhlICdsb29wJy4KICAgICAgZW5kTG9vcChjb25kaXRpb25CbG9jaywgZWxzZUJsb2NrLCBqdW1wSGFuZGxlciwgc2F2ZWRMb2NhbHMpOwoKICAgICAgU3ViR3JhcGggZWxzZUdyYXBoID0gbmV3IFN1YkdyYXBoKGVsc2VCbG9jaywgZWxzZUJsb2NrKTsKICAgICAgLy8gUmVtb3ZlIHRoZSBsb29wIGluZm9ybWF0aW9uIGF0dGFjaGVkIHRvIHRoZSBoZWFkZXIuCiAgICAgIGNvbmRpdGlvbkJsb2NrLmxvb3BJbmZvcm1hdGlvbiA9IG51bGw7CgogICAgICAvLyBSZW1vdmUgdGhlIFtITG9vcEJyYW5jaF0gaW5zdHJ1Y3Rpb24gYW5kIHJlcGxhY2UgaXQgd2l0aAogICAgICAvLyBbSElmXS4KICAgICAgSEluc3RydWN0aW9uIGNvbmRpdGlvbiA9IGNvbmRpdGlvbkVuZEJsb2NrLmxhc3QuaW5wdXRzWzBdOwogICAgICBjb25kaXRpb25FbmRCbG9jawogICAgICAgICAgLmFkZEF0RXhpdChuZXcgSElmKGJ1aWxkZXIuYWJzdHJhY3RWYWx1ZURvbWFpbiwgY29uZGl0aW9uKSk7CiAgICAgIGNvbmRpdGlvbkVuZEJsb2NrLmFkZFN1Y2Nlc3NvcihlbHNlQmxvY2spOwogICAgICBjb25kaXRpb25FbmRCbG9jay5yZW1vdmUoY29uZGl0aW9uRW5kQmxvY2subGFzdCk7CiAgICAgIEhJZkJsb2NrSW5mb3JtYXRpb24gaW5mbyA9IG5ldyBISWZCbG9ja0luZm9ybWF0aW9uKAogICAgICAgICAgYnVpbGRlci53cmFwRXhwcmVzc2lvbkdyYXBoKGNvbmRpdGlvbkV4cHJlc3Npb24pLAogICAgICAgICAgYnVpbGRlci53cmFwU3RhdGVtZW50R3JhcGgoYm9keUdyYXBoKSwKICAgICAgICAgIGJ1aWxkZXIud3JhcFN0YXRlbWVudEdyYXBoKGVsc2VHcmFwaCkpOwoKICAgICAgY29uZGl0aW9uRW5kQmxvY2suc2V0QmxvY2tGbG93KGluZm8sIGJ1aWxkZXIuY3VycmVudCk7CiAgICAgIEhJZiBpZkJsb2NrID0gY29uZGl0aW9uRW5kQmxvY2subGFzdDsKICAgICAgaWZCbG9jay5ibG9ja0luZm9ybWF0aW9uID0gY29uZGl0aW9uRW5kQmxvY2suYmxvY2tGbG93OwoKICAgICAgLy8gSWYgdGhlIGJvZHkgaGFzIGFueSBicmVhaywgYXR0YWNoIGEgc3ludGhlc2l6ZWQgbGFiZWwgdG8gdGhlCiAgICAgIC8vIGlmIGJsb2NrLgogICAgICBpZiAoanVtcEhhbmRsZXIuaGFzQW55QnJlYWsoKSkgewogICAgICAgIExhYmVsRGVmaW5pdGlvbiBsYWJlbCA9CiAgICAgICAgICAgIGp1bXBUYXJnZXQuYWRkTGFiZWwoJ2xvb3AnLCBpc0JyZWFrVGFyZ2V0OiB0cnVlKTsKICAgICAgICBTdWJHcmFwaCBsYWJlbEdyYXBoID0gbmV3IFN1YkdyYXBoKGNvbmRpdGlvbkJsb2NrLCBidWlsZGVyLmN1cnJlbnQpOwogICAgICAgIEhMYWJlbGVkQmxvY2tJbmZvcm1hdGlvbiBsYWJlbEluZm8gPSBuZXcgSExhYmVsZWRCbG9ja0luZm9ybWF0aW9uKAogICAgICAgICAgICBuZXcgSFN1YkdyYXBoQmxvY2tJbmZvcm1hdGlvbihsYWJlbEdyYXBoKSwKICAgICAgICAgICAgPExhYmVsRGVmaW5pdGlvbj5bbGFiZWxdKTsKCiAgICAgICAgY29uZGl0aW9uQmxvY2suc2V0QmxvY2tGbG93KGxhYmVsSW5mbywgYnVpbGRlci5jdXJyZW50KTsKCiAgICAgICAganVtcEhhbmRsZXIuZm9yRWFjaEJyZWFrKChIQnJlYWsgYnJlYWtJbnN0cnVjdGlvbiwgXykgewogICAgICAgICAgSEJhc2ljQmxvY2sgYmxvY2sgPSBicmVha0luc3RydWN0aW9uLmJsb2NrOwogICAgICAgICAgYmxvY2suYWRkQXRFeGl0KG5ldyBIQnJlYWsudG9MYWJlbCgKICAgICAgICAgICAgICBidWlsZGVyLmFic3RyYWN0VmFsdWVEb21haW4sIGxhYmVsLCBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICAgICAgYmxvY2sucmVtb3ZlKGJyZWFrSW5zdHJ1Y3Rpb24pOwogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICBqdW1wSGFuZGxlci5jbG9zZSgpOwogICAgYnVpbGRlci5sb29wRGVwdGgtLTsKICB9CgogIC8vLyBDcmVhdGVzIGEgbmV3IGxvb3AtaGVhZGVyIGJsb2NrLiBUaGUgcHJldmlvdXMgW2N1cnJlbnRdIGJsb2NrCiAgLy8vIGlzIGNsb3NlZCB3aXRoIGFuIFtIR290b10gYW5kIHJlcGxhY2VkIGJ5IHRoZSBuZXdseSBjcmVhdGVkIGJsb2NrLgogIC8vLyBBbHNvIG5vdGlmaWVzIHRoZSBsb2NhbHMgaGFuZGxlciB0aGF0IHdlJ3JlIGVudGVyaW5nIGEgbG9vcC4KICBKdW1wSGFuZGxlciBiZWdpbkxvb3BIZWFkZXIoaXIuVHJlZU5vZGUgbm9kZSwgSnVtcFRhcmdldCBqdW1wVGFyZ2V0KSB7CiAgICBhc3NlcnQoIWJ1aWxkZXIuaXNBYm9ydGVkKCkpOwogICAgSEJhc2ljQmxvY2sgcHJldmlvdXNCbG9jayA9CiAgICAgICAgYnVpbGRlci5jbG9zZShuZXcgSEdvdG8oYnVpbGRlci5hYnN0cmFjdFZhbHVlRG9tYWluKSk7CgogICAgSnVtcEhhbmRsZXIganVtcEhhbmRsZXIgPQogICAgICAgIGNyZWF0ZUp1bXBIYW5kbGVyKG5vZGUsIGp1bXBUYXJnZXQsIGlzTG9vcEp1bXA6IHRydWUpOwogICAgSEJhc2ljQmxvY2sgbG9vcEVudHJ5ID0gYnVpbGRlci5ncmFwaAogICAgICAgIC5hZGROZXdMb29wSGVhZGVyQmxvY2soanVtcEhhbmRsZXIudGFyZ2V0LCBqdW1wSGFuZGxlci5sYWJlbHMpOwogICAgcHJldmlvdXNCbG9jay5hZGRTdWNjZXNzb3IobG9vcEVudHJ5KTsKICAgIGJ1aWxkZXIub3Blbihsb29wRW50cnkpOwoKICAgIGJ1aWxkZXIubG9jYWxzSGFuZGxlci5iZWdpbkxvb3BIZWFkZXIobG9vcEVudHJ5KTsKICAgIHJldHVybiBqdW1wSGFuZGxlcjsKICB9CgogIC8vLyBFbmRzIHRoZSBsb29wLgogIC8vLwogIC8vLyBJdCBkb2VzIHRoaXMgYnk6CiAgLy8vIC0gY3JlYXRpbmcgYSBuZXcgYmxvY2sgYW5kIGFkZGluZyBpdCBhcyBzdWNjZXNzb3IgdG8gdGhlIFticmFuY2hFeGl0QmxvY2tdCiAgLy8vICAgYW5kIGFueSBibG9ja3MgdGhhdCBlbmQgaW4gYnJlYWsuCiAgLy8vIC0gb3BlbmluZyB0aGUgbmV3IGJsb2NrIChzZXR0aW5nIGFzIFtjdXJyZW50XSkuCiAgLy8vIC0gbm90aWZ5aW5nIHRoZSBsb2NhbHMgaGFuZGxlciB0aGF0IHdlJ3JlIGV4aXRpbmcgYSBsb29wLgogIC8vLwogIC8vLyBbc2F2ZWRMb2NhbHNdIGFyZSB0aGUgbG9jYWxzIGZyb20gdGhlIGVuZCBvZiB0aGUgbG9vcCBjb25kaXRpb24uCiAgLy8vCiAgLy8vIFticmFuY2hFeGl0QmxvY2tdIGlzIHRoZSBleGl0IChicmFuY2hpbmcpIGJsb2NrIG9mIHRoZSBjb25kaXRpb24uCiAgLy8vIEdlbmVyYWxseSB0aGlzIGlzIG5vdCB0aGUgdG9wIG9mIHRoZSBsb29wLCBzaW5jZSB0aGlzIHdvdWxkIGxlYWQgdG8KICAvLy8gY3JpdGljYWwgZWRnZXMuIEl0IGlzIG51bGwgZm9yIGRlZ2VuZXJhdGUgZG8td2hpbGUgbG9vcHMgdGhhdCBoYXZlIG5vIGJhY2sKICAvLy8gZWRnZSBiZWNhdXNlIHRoZXkgYWJvcnQgKHRocm93L3JldHVybi9icmVhayBpbiB0aGUgYm9keSBhbmQgaGF2ZSBubwogIC8vLyBjb250aW51ZXMpLgogIHZvaWQgZW5kTG9vcChIQmFzaWNCbG9jayBsb29wRW50cnksIEhCYXNpY0Jsb2NrIGJyYW5jaEV4aXRCbG9jaywKICAgICAgSnVtcEhhbmRsZXIganVtcEhhbmRsZXIsIExvY2Fsc0hhbmRsZXIgc2F2ZWRMb2NhbHMpIHsKICAgIEhCYXNpY0Jsb2NrIGxvb3BFeGl0QmxvY2sgPSBidWlsZGVyLmFkZE5ld0Jsb2NrKCk7CgogICAgTGlzdDxMb2NhbHNIYW5kbGVyPiBicmVha0hhbmRsZXJzID0gPExvY2Fsc0hhbmRsZXI+W107CiAgICAvLyBDb2xsZWN0IGRhdGEgZm9yIHRoZSBzdWNjZXNzb3JzIGFuZCB0aGUgcGhpcyBhdCBlYWNoIGJyZWFrLgogICAganVtcEhhbmRsZXIuZm9yRWFjaEJyZWFrKChIQnJlYWsgYnJlYWtJbnN0cnVjdGlvbiwgTG9jYWxzSGFuZGxlciBsb2NhbHMpIHsKICAgICAgYnJlYWtJbnN0cnVjdGlvbi5ibG9jay5hZGRTdWNjZXNzb3IobG9vcEV4aXRCbG9jayk7CiAgICAgIGJyZWFrSGFuZGxlcnMuYWRkKGxvY2Fscyk7CiAgICB9KTsKCiAgICAvLyBUaGUgZXhpdCBibG9jayBpcyBhIHN1Y2Nlc3NvciBvZiB0aGUgbG9vcCBjb25kaXRpb24gaWYgaXQgaXMgcmVhY2hlZC4KICAgIC8vIFdlIGRvbid0IGFkZCB0aGUgc3VjY2Vzc29yIGluIHRoZSBjYXNlIG9mIGEgd2hpbGUvZm9yIGxvb3AgdGhhdCBhYm9ydHMKICAgIC8vIGJlY2F1c2UgdGhlIGNhbGxlciBvZiBlbmRMb29wIHdpbGwgYmUgd2lyaW5nIHVwIGEgc3BlY2lhbCBlbXB0eSBlbHNlCiAgICAvLyBibG9jayBpbnN0ZWFkLgogICAgaWYgKGJyYW5jaEV4aXRCbG9jayAhPSBudWxsKSB7CiAgICAgIGJyYW5jaEV4aXRCbG9jay5hZGRTdWNjZXNzb3IobG9vcEV4aXRCbG9jayk7CiAgICB9CiAgICAvLyBVcGRhdGUgdGhlIHBoaXMgYXQgdGhlIGxvb3AgZW50cnkgd2l0aCB0aGUgY3VycmVudCB2YWx1ZXMgb2YgbG9jYWxzLgogICAgYnVpbGRlci5sb2NhbHNIYW5kbGVyLmVuZExvb3AobG9vcEVudHJ5KTsKCiAgICAvLyBTdGFydCBnZW5lcmF0aW5nIGNvZGUgZm9yIHRoZSBleGl0IGJsb2NrLgogICAgYnVpbGRlci5vcGVuKGxvb3BFeGl0QmxvY2spOwoKICAgIC8vIENyZWF0ZSBhIG5ldyBsb2NhbHNIYW5kbGVyIGZvciB0aGUgbG9vcEV4aXRCbG9jayB3aXRoIHRoZSBjb3JyZWN0IHBoaXMuCiAgICBpZiAoIWJyZWFrSGFuZGxlcnMuaXNFbXB0eSkgewogICAgICBpZiAoYnJhbmNoRXhpdEJsb2NrICE9IG51bGwpIHsKICAgICAgICAvLyBBZGQgdGhlIHZhbHVlcyBvZiB0aGUgbG9jYWxzIGF0IHRoZSBlbmQgb2YgdGhlIGNvbmRpdGlvbiBibG9jayB0bwogICAgICAgIC8vIHRoZSBwaGlzLiAgVGhlc2UgYXJlIHRoZSB2YWx1ZXMgdGhhdCBmbG93IHRvIHRoZSBleGl0IGlmIHRoZQogICAgICAgIC8vIGNvbmRpdGlvbiBmYWlscy4KICAgICAgICBicmVha0hhbmRsZXJzLmFkZChzYXZlZExvY2Fscyk7CiAgICAgIH0KICAgICAgYnVpbGRlci5sb2NhbHNIYW5kbGVyID0KICAgICAgICAgIHNhdmVkTG9jYWxzLm1lcmdlTXVsdGlwbGUoYnJlYWtIYW5kbGVycywgbG9vcEV4aXRCbG9jayk7CiAgICB9IGVsc2UgewogICAgICBidWlsZGVyLmxvY2Fsc0hhbmRsZXIgPSBzYXZlZExvY2FsczsKICAgIH0KICB9CgogIC8vLyBEZXRlcm1pbmUgd2hhdCBraW5kIG9mIGxvb3AgW25vZGVdIHJlcHJlc2VudHMuCiAgLy8vCiAgLy8vIFRoZSByZXN1bHQgaXMgb25lIG9mIHRoZSBraW5kcyBkZWZpbmVkIGluIFtITG9vcEJsb2NrSW5mb3JtYXRpb25dLgogIGludCBsb29wS2luZChpci5UcmVlTm9kZSBub2RlKTsKCiAgLy8vIENyZWF0ZXMgYSBbSnVtcEhhbmRsZXJdIGZvciBhIHN0YXRlbWVudC4gVGhlIG5vZGUgbXVzdCBiZSBhIGp1bXAKICAvLy8gdGFyZ2V0LiBJZiB0aGVyZSBhcmUgbm8gYnJlYWtzIG9yIGNvbnRpbnVlcyB0YXJnZXRpbmcgdGhlIHN0YXRlbWVudCwKICAvLy8gYSBzcGVjaWFsICJudWxsIGhhbmRsZXIiIGlzIHJldHVybmVkLgogIC8vLwogIC8vLyBbaXNMb29wSnVtcF0gaXMgWzp0cnVlOl0gd2hlbiB0aGUganVtcCBoYW5kbGVyIGlzIGZvciBhIGxvb3AuIFRoaXMgaXMgdXNlZAogIC8vLyB0byBkaXN0aW5ndWlzaCB0aGUgc3ludGhlc2l6ZWQgbG9vcCBjcmVhdGVkIGZvciBhIHN3aXRjaCBzdGF0ZW1lbnQgd2l0aAogIC8vLyBjb250aW51ZSBzdGF0ZW1lbnRzIGZyb20gc2ltcGxlIHN3aXRjaCBzdGF0ZW1lbnRzLgogIEp1bXBIYW5kbGVyIGNyZWF0ZUp1bXBIYW5kbGVyKGlyLlRyZWVOb2RlIG5vZGUsIEp1bXBUYXJnZXQganVtcFRhcmdldCwKICAgICAge2Jvb2wgaXNMb29wSnVtcH0pOwp9CgovLyBUT0RPKGhldCk6IFNpbmNlIGtlcm5lbCBzaW1wbGlmaWVzIGxvb3AgYnJlYWtzIGFuZCBjb250aW51ZXMsIHdlIHNob3VsZAovLyByZXdyaXRlIHRoZSBsb29wIGhhbmRsZXIgZnJvbSBzY3JhdGNoIHRvIGFjY291bnQgZm9yIHRoZSBzaW1wbGlmaWVkIHN0cnVjdHVyZQpjbGFzcyBLZXJuZWxMb29wSGFuZGxlciBleHRlbmRzIExvb3BIYW5kbGVyIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBLZXJuZWxTc2FHcmFwaEJ1aWxkZXIgYnVpbGRlcjsKCiAgS2VybmVsTG9vcEhhbmRsZXIoS2VybmVsU3NhR3JhcGhCdWlsZGVyIGJ1aWxkZXIpCiAgICAgIDogdGhpcy5idWlsZGVyID0gYnVpbGRlciwKICAgICAgICBzdXBlcihidWlsZGVyKTsKCiAgQG92ZXJyaWRlCiAgSnVtcEhhbmRsZXIgY3JlYXRlSnVtcEhhbmRsZXIoaXIuVHJlZU5vZGUgbm9kZSwgSnVtcFRhcmdldCBqdW1wVGFyZ2V0LAogICAgICAgICAge2Jvb2wgaXNMb29wSnVtcH0pID0+CiAgICAgIGJ1aWxkZXIuY3JlYXRlSnVtcEhhbmRsZXIobm9kZSwganVtcFRhcmdldCwgaXNMb29wSnVtcDogaXNMb29wSnVtcCk7CgogIEBvdmVycmlkZQogIGludCBsb29wS2luZChpci5UcmVlTm9kZSBub2RlKSA9PiBub2RlLmFjY2VwdChuZXcgX0tlcm5lbExvb3BUeXBlVmlzaXRvcigpKTsKfQoKY2xhc3MgX0tlcm5lbExvb3BUeXBlVmlzaXRvciBleHRlbmRzIGlyLlZpc2l0b3I8aW50PiB7CiAgQG92ZXJyaWRlCiAgaW50IGRlZmF1bHROb2RlKGlyLk5vZGUgbm9kZSkgPT4gSExvb3BCbG9ja0luZm9ybWF0aW9uLk5PVF9BX0xPT1A7CgogIEBvdmVycmlkZQogIGludCB2aXNpdFdoaWxlU3RhdGVtZW50KGlyLldoaWxlU3RhdGVtZW50IG5vZGUpID0+CiAgICAgIEhMb29wQmxvY2tJbmZvcm1hdGlvbi5XSElMRV9MT09QOwoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRGb3JTdGF0ZW1lbnQoaXIuRm9yU3RhdGVtZW50IG5vZGUpID0+IEhMb29wQmxvY2tJbmZvcm1hdGlvbi5GT1JfTE9PUDsKCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0RG9TdGF0ZW1lbnQoaXIuRG9TdGF0ZW1lbnQgbm9kZSkgPT4KICAgICAgSExvb3BCbG9ja0luZm9ybWF0aW9uLkRPX1dISUxFX0xPT1A7CgogIEBvdmVycmlkZQogIGludCB2aXNpdEZvckluU3RhdGVtZW50KGlyLkZvckluU3RhdGVtZW50IG5vZGUpID0+CiAgICAgIEhMb29wQmxvY2tJbmZvcm1hdGlvbi5GT1JfSU5fTE9PUDsKCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0U3dpdGNoU3RhdGVtZW50KGlyLlN3aXRjaFN0YXRlbWVudCBub2RlKSA9PgogICAgICBITG9vcEJsb2NrSW5mb3JtYXRpb24uU1dJVENIX0NPTlRJTlVFX0xPT1A7Cn0KgWQATk48ASgBMSEoAR4dHB4VASkdHgEdATAGOz0+ExQpHRkgFRMtERYULBEUGxMBSQEYKxwePSUUJE8GARlBQTI5ATUzTSg+AUpLGE8BETg0IgFNDAFQLSE9AR8BUB0RUFFQNwFAEks1JgoBHzUtCAEhHkwBOR8lKk4jGkYlM0YjGggBHEEBEAEjQS0zRAFJPig9OgFNAS4+Gjk8MTQxMR4BNiwNUSAaERJMCwlCGjUfPU8sRAE/PS0BQhBBGEcxODo8MTIBPSw+AUYTJyA+TUs3JwFBAUA2LkcqDAgGGRkEAURJQ0kiID8BHj8qSCsdATYYBAEVBhdRKjZABkcGSEpRShJDPDcBO0NPOiEIAU1OTBYjMwZMLgExIQFPIiVNSBwoCB5DDSsGBAE1BkkiAUdLLAZRTjlJGgIBS1EuDCcBMyAYAQxJIEsBDE8CATcMRQEMNSgBDFEBDC8rAQw1KQEMNzICASpwYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2EvbG9vcF9oYW5kbGVyLmRhcnQ5c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvc3NhL3NzYV9icmFuY2hfYnVpbGRlci5kYXJ0njUvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vaW8vc291cmNlX2luZm9ybWF0aW9uLmRhcnQnOwoKaW1wb3J0ICdncmFwaF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2xvY2Fsc19oYW5kbGVyLmRhcnQnOwppbXBvcnQgJ25vZGVzLmRhcnQnOwoKY2xhc3MgU3NhQnJhbmNoIHsKICBmaW5hbCBTc2FCcmFuY2hCdWlsZGVyIGJyYW5jaEJ1aWxkZXI7CiAgZmluYWwgSEJhc2ljQmxvY2sgYmxvY2s7CiAgTG9jYWxzSGFuZGxlciBzdGFydExvY2FsczsKICBMb2NhbHNIYW5kbGVyIGV4aXRMb2NhbHM7CiAgU3ViR3JhcGggZ3JhcGg7CgogIFNzYUJyYW5jaCh0aGlzLmJyYW5jaEJ1aWxkZXIpIDogYmxvY2sgPSBuZXcgSEJhc2ljQmxvY2soKTsKfQoKY2xhc3MgU3NhQnJhbmNoQnVpbGRlciB7CiAgZmluYWwgR3JhcGhCdWlsZGVyIGJ1aWxkZXI7CiAgZmluYWwgU3Bhbm5hYmxlIGRpYWdub3N0aWNOb2RlOwoKICBTc2FCcmFuY2hCdWlsZGVyKHRoaXMuYnVpbGRlciwgW3RoaXMuZGlhZ25vc3RpY05vZGVdKTsKCiAgdm9pZCBjaGVja05vdEFib3J0ZWQoKSB7CiAgICBpZiAoYnVpbGRlci5pc0Fib3J0ZWQoKSkgewogICAgICBmYWlsZWRBdChkaWFnbm9zdGljTm9kZSwgImFib3J0ZWQgY29udHJvbCBmbG93Iik7CiAgICB9CiAgfQoKICB2b2lkIGJ1aWxkQ29uZGl0aW9uKAogICAgICB2b2lkIHZpc2l0Q29uZGl0aW9uKCksCiAgICAgIFNzYUJyYW5jaCBjb25kaXRpb25CcmFuY2gsCiAgICAgIFNzYUJyYW5jaCB0aGVuQnJhbmNoLAogICAgICBTc2FCcmFuY2ggZWxzZUJyYW5jaCwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIHN0YXJ0QnJhbmNoKGNvbmRpdGlvbkJyYW5jaCk7CiAgICB2aXNpdENvbmRpdGlvbigpOwogICAgY2hlY2tOb3RBYm9ydGVkKCk7CiAgICBhc3NlcnQoaWRlbnRpY2FsKGJ1aWxkZXIuY3VycmVudCwgYnVpbGRlci5sYXN0T3BlbmVkQmxvY2spKTsKICAgIEhJbnN0cnVjdGlvbiBjb25kaXRpb25WYWx1ZSA9IGJ1aWxkZXIucG9wQm9vbGlmaWVkKCk7CiAgICBISWYgYnJhbmNoID0gbmV3IEhJZihidWlsZGVyLmFic3RyYWN0VmFsdWVEb21haW4sIGNvbmRpdGlvblZhbHVlKQogICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgICBIQmFzaWNCbG9jayBjb25kaXRpb25FeGl0QmxvY2sgPSBidWlsZGVyLmN1cnJlbnQ7CiAgICBidWlsZGVyLmNsb3NlKGJyYW5jaCk7CiAgICBjb25kaXRpb25CcmFuY2guZXhpdExvY2FscyA9IGJ1aWxkZXIubG9jYWxzSGFuZGxlcjsKICAgIGNvbmRpdGlvbkV4aXRCbG9jay5hZGRTdWNjZXNzb3IodGhlbkJyYW5jaC5ibG9jayk7CiAgICBjb25kaXRpb25FeGl0QmxvY2suYWRkU3VjY2Vzc29yKGVsc2VCcmFuY2guYmxvY2spOwogICAgYm9vbCBjb25kaXRpb25CcmFuY2hMb2NhbHNDYW5CZVJldXNlZCA9CiAgICAgICAgbWVyZ2VMb2NhbHMoY29uZGl0aW9uQnJhbmNoLCB0aGVuQnJhbmNoLCBtYXlSZXVzZUZyb21Mb2NhbHM6IHRydWUpOwogICAgbWVyZ2VMb2NhbHMoY29uZGl0aW9uQnJhbmNoLCBlbHNlQnJhbmNoLAogICAgICAgIG1heVJldXNlRnJvbUxvY2FsczogY29uZGl0aW9uQnJhbmNoTG9jYWxzQ2FuQmVSZXVzZWQpOwoKICAgIGNvbmRpdGlvbkJyYW5jaC5ncmFwaCA9CiAgICAgICAgbmV3IFN1YkV4cHJlc3Npb24oY29uZGl0aW9uQnJhbmNoLmJsb2NrLCBjb25kaXRpb25FeGl0QmxvY2spOwogIH0KCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbG9jYWxzIG9mIHRoZSBbZnJvbUJyYW5jaF0gbWF5IGJlIHJldXNlZC4gQSBbOnRydWU6XQogIC8vLyByZXR1cm4gdmFsdWUgaW1wbGllcyB0aGF0IFttYXlSZXVzZUZyb21Mb2NhbHNdIHdhcyBzZXQgdG8gWzp0cnVlOl0uCiAgYm9vbCBtZXJnZUxvY2FscyhTc2FCcmFuY2ggZnJvbUJyYW5jaCwgU3NhQnJhbmNoIHRvQnJhbmNoLAogICAgICB7Ym9vbCBtYXlSZXVzZUZyb21Mb2NhbHN9KSB7CiAgICBMb2NhbHNIYW5kbGVyIGZyb21Mb2NhbHMgPSBmcm9tQnJhbmNoLmV4aXRMb2NhbHM7CiAgICBpZiAodG9CcmFuY2guc3RhcnRMb2NhbHMgPT0gbnVsbCkgewogICAgICBpZiAobWF5UmV1c2VGcm9tTG9jYWxzKSB7CiAgICAgICAgdG9CcmFuY2guc3RhcnRMb2NhbHMgPSBmcm9tTG9jYWxzOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0b0JyYW5jaC5zdGFydExvY2FscyA9IG5ldyBMb2NhbHNIYW5kbGVyLmZyb20oZnJvbUxvY2Fscyk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRvQnJhbmNoLnN0YXJ0TG9jYWxzLm1lcmdlV2l0aChmcm9tTG9jYWxzLCB0b0JyYW5jaC5ibG9jayk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KCiAgdm9pZCBzdGFydEJyYW5jaChTc2FCcmFuY2ggYnJhbmNoKSB7CiAgICBidWlsZGVyLmdyYXBoLmFkZEJsb2NrKGJyYW5jaC5ibG9jayk7CiAgICBidWlsZGVyLmxvY2Fsc0hhbmRsZXIgPSBicmFuY2guc3RhcnRMb2NhbHM7CiAgICBidWlsZGVyLm9wZW4oYnJhbmNoLmJsb2NrKTsKICB9CgogIEhJbnN0cnVjdGlvbiBidWlsZEJyYW5jaChTc2FCcmFuY2ggYnJhbmNoLCB2b2lkIHZpc2l0QnJhbmNoKCksCiAgICAgIFNzYUJyYW5jaCBqb2luQnJhbmNoLCBib29sIGlzRXhwcmVzc2lvbikgewogICAgc3RhcnRCcmFuY2goYnJhbmNoKTsKICAgIHZpc2l0QnJhbmNoKCk7CiAgICBicmFuY2guZ3JhcGggPSBuZXcgU3ViR3JhcGgoYnJhbmNoLmJsb2NrLCBidWlsZGVyLmxhc3RPcGVuZWRCbG9jayk7CiAgICBicmFuY2guZXhpdExvY2FscyA9IGJ1aWxkZXIubG9jYWxzSGFuZGxlcjsKICAgIGlmICghYnVpbGRlci5pc0Fib3J0ZWQoKSkgewogICAgICBidWlsZGVyLmdvdG8oYnVpbGRlci5jdXJyZW50LCBqb2luQnJhbmNoLmJsb2NrKTsKICAgICAgbWVyZ2VMb2NhbHMoYnJhbmNoLCBqb2luQnJhbmNoLCBtYXlSZXVzZUZyb21Mb2NhbHM6IHRydWUpOwogICAgfQogICAgaWYgKGlzRXhwcmVzc2lvbikgewogICAgICBjaGVja05vdEFib3J0ZWQoKTsKICAgICAgcmV0dXJuIGJ1aWxkZXIucG9wKCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGhhbmRsZUlmKHZvaWQgdmlzaXRDb25kaXRpb24oKSwgdm9pZCB2aXNpdFRoZW4oKSwgdm9pZCB2aXNpdEVsc2UoKSwKICAgICAge1NvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9ufSkgewogICAgaWYgKHZpc2l0RWxzZSA9PSBudWxsKSB7CiAgICAgIC8vIE1ha2Ugc3VyZSB0byBoYXZlIGFuIGVsc2UgcGFydCB0byBhdm9pZCBhIGNyaXRpY2FsIGVkZ2UuIEEKICAgICAgLy8gY3JpdGljYWwgZWRnZSBpcyBhbiBlZGdlIHRoYXQgY29ubmVjdHMgYSBibG9jayB3aXRoIG11bHRpcGxlCiAgICAgIC8vIHN1Y2Nlc3NvcnMgdG8gYSBibG9jayB3aXRoIG11bHRpcGxlIHByZWRlY2Vzc29ycy4gV2UgYXZvaWQKICAgICAgLy8gc3VjaCBlZGdlcyBiZWNhdXNlIHRoZXkgcHJldmVudCBpbnNlcnRpbmcgY29waWVzIGR1cmluZyBjb2RlCiAgICAgIC8vIGdlbmVyYXRpb24gb2YgcGhpIGluc3RydWN0aW9ucy4KICAgICAgdmlzaXRFbHNlID0gKCkge307CiAgICB9CgogICAgX2hhbmRsZURpYW1vbmRCcmFuY2godmlzaXRDb25kaXRpb24sIHZpc2l0VGhlbiwgdmlzaXRFbHNlLAogICAgICAgIGlzRXhwcmVzc2lvbjogZmFsc2UsIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICBoYW5kbGVDb25kaXRpb25hbCh2b2lkIHZpc2l0Q29uZGl0aW9uKCksIHZvaWQgdmlzaXRUaGVuKCksIHZvaWQgdmlzaXRFbHNlKCkpIHsKICAgIGFzc2VydCh2aXNpdEVsc2UgIT0gbnVsbCk7CiAgICBfaGFuZGxlRGlhbW9uZEJyYW5jaCh2aXNpdENvbmRpdGlvbiwgdmlzaXRUaGVuLCB2aXNpdEVsc2UsCiAgICAgICAgaXNFeHByZXNzaW9uOiB0cnVlKTsKICB9CgogIGhhbmRsZUlmTnVsbCh2b2lkIGxlZnQoKSwgdm9pZCByaWdodCgpKSB7CiAgICAvLyB4ID8/IHkgaXMgdHJhbnNmb3JtZWQgaW50bzogeCA9PSBudWxsID8geSA6IHgKICAgIEhJbnN0cnVjdGlvbiBsZWZ0RXhwcmVzc2lvbjsKICAgIGhhbmRsZUNvbmRpdGlvbmFsKCgpIHsKICAgICAgbGVmdCgpOwogICAgICBsZWZ0RXhwcmVzc2lvbiA9IGJ1aWxkZXIucG9wKCk7CiAgICAgIGJ1aWxkZXIucHVzaENoZWNrTnVsbChsZWZ0RXhwcmVzc2lvbik7CiAgICB9LCByaWdodCwgKCkgPT4gYnVpbGRlci5zdGFjay5hZGQobGVmdEV4cHJlc3Npb24pKTsKICB9CgogIC8vLyBDcmVhdGVzIHRoZSBncmFwaCBmb3IgJyYmJyBvciAnfHwnIG9wZXJhdG9ycy4KICAvLy8KICAvLy8geCAmJiB5IGlzIHRyYW5zZm9ybWVkIGludG86CiAgLy8vCiAgLy8vICAgICB0MCA9IGJvb2xpZnkoeCk7CiAgLy8vICAgICBpZiAodDApIHsKICAvLy8gICAgICAgdDEgPSBib29saWZ5KHkpOwogIC8vLyAgICAgfQogIC8vLyAgICAgcmVzdWx0ID0gcGhpKHQxLCBmYWxzZSk7CiAgLy8vCiAgLy8vIHggfHwgeSBpcyB0cmFuc2Zvcm1lZCBpbnRvOgogIC8vLwogIC8vLyAgICAgdDAgPSBib29saWZ5KHgpOwogIC8vLyAgICAgaWYgKG5vdCh0MCkpIHsKICAvLy8gICAgICAgdDEgPSBib29saWZ5KHkpOwogIC8vLyAgICAgfQogIC8vLyAgICAgcmVzdWx0ID0gcGhpKHQxLCB0cnVlKTsKICB2b2lkIGhhbmRsZUxvZ2ljYWxCaW5hcnkoCiAgICAgIHZvaWQgbGVmdCgpLCB2b2lkIHJpZ2h0KCksIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICB7Ym9vbCBpc0FuZH0pIHsKICAgIEhJbnN0cnVjdGlvbiBib29saWZpZWRMZWZ0OwogICAgSEluc3RydWN0aW9uIGJvb2xpZmllZFJpZ2h0OwoKICAgIHZvaWQgdmlzaXRDb25kaXRpb24oKSB7CiAgICAgIGxlZnQoKTsKICAgICAgYm9vbGlmaWVkTGVmdCA9IGJ1aWxkZXIucG9wQm9vbGlmaWVkKCk7CiAgICAgIGJ1aWxkZXIuc3RhY2suYWRkKGJvb2xpZmllZExlZnQpOwogICAgICBpZiAoIWlzQW5kKSB7CiAgICAgICAgYnVpbGRlci5wdXNoKAogICAgICAgICAgICBuZXcgSE5vdChidWlsZGVyLnBvcCgpLCBidWlsZGVyLmFic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUpCiAgICAgICAgICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgfQogICAgfQoKICAgIHZvaWQgdmlzaXRUaGVuKCkgewogICAgICByaWdodCgpOwogICAgICBib29saWZpZWRSaWdodCA9IGJ1aWxkZXIucG9wQm9vbGlmaWVkKCk7CiAgICB9CgogICAgaGFuZGxlSWYodmlzaXRDb25kaXRpb24sIHZpc2l0VGhlbiwgbnVsbCwKICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pOwogICAgSENvbnN0YW50IG5vdElzQW5kID0KICAgICAgICBidWlsZGVyLmdyYXBoLmFkZENvbnN0YW50Qm9vbCghaXNBbmQsIGJ1aWxkZXIuY2xvc2VkV29ybGQpOwogICAgSFBoaSByZXN1bHQgPSBuZXcgSFBoaS5tYW55SW5wdXRzKAogICAgICAgIG51bGwsCiAgICAgICAgPEhJbnN0cnVjdGlvbj5bYm9vbGlmaWVkUmlnaHQsIG5vdElzQW5kXSwKICAgICAgICBidWlsZGVyLmFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUpCiAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKICAgIGJ1aWxkZXIuY3VycmVudC5hZGRQaGkocmVzdWx0KTsKICAgIGJ1aWxkZXIuc3RhY2suYWRkKHJlc3VsdCk7CiAgfQoKICB2b2lkIF9oYW5kbGVEaWFtb25kQnJhbmNoKAogICAgICB2b2lkIHZpc2l0Q29uZGl0aW9uKCksIHZvaWQgdmlzaXRUaGVuKCksIHZvaWQgdmlzaXRFbHNlKCksCiAgICAgIHtib29sIGlzRXhwcmVzc2lvbiwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb259KSB7CiAgICBTc2FCcmFuY2ggY29uZGl0aW9uQnJhbmNoID0gbmV3IFNzYUJyYW5jaCh0aGlzKTsKICAgIFNzYUJyYW5jaCB0aGVuQnJhbmNoID0gbmV3IFNzYUJyYW5jaCh0aGlzKTsKICAgIFNzYUJyYW5jaCBlbHNlQnJhbmNoID0gbmV3IFNzYUJyYW5jaCh0aGlzKTsKICAgIFNzYUJyYW5jaCBqb2luQnJhbmNoID0gbmV3IFNzYUJyYW5jaCh0aGlzKTsKCiAgICBjb25kaXRpb25CcmFuY2guc3RhcnRMb2NhbHMgPSBidWlsZGVyLmxvY2Fsc0hhbmRsZXI7CiAgICBidWlsZGVyLmdvdG8oYnVpbGRlci5jdXJyZW50LCBjb25kaXRpb25CcmFuY2guYmxvY2spOwoKICAgIGJ1aWxkQ29uZGl0aW9uKHZpc2l0Q29uZGl0aW9uLCBjb25kaXRpb25CcmFuY2gsIHRoZW5CcmFuY2gsIGVsc2VCcmFuY2gsCiAgICAgICAgc291cmNlSW5mb3JtYXRpb24pOwogICAgSEluc3RydWN0aW9uIHRoZW5WYWx1ZSA9CiAgICAgICAgYnVpbGRCcmFuY2godGhlbkJyYW5jaCwgdmlzaXRUaGVuLCBqb2luQnJhbmNoLCBpc0V4cHJlc3Npb24pOwogICAgSEluc3RydWN0aW9uIGVsc2VWYWx1ZSA9CiAgICAgICAgYnVpbGRCcmFuY2goZWxzZUJyYW5jaCwgdmlzaXRFbHNlLCBqb2luQnJhbmNoLCBpc0V4cHJlc3Npb24pOwoKICAgIGlmIChpc0V4cHJlc3Npb24pIHsKICAgICAgYXNzZXJ0KHRoZW5WYWx1ZSAhPSBudWxsICYmIGVsc2VWYWx1ZSAhPSBudWxsKTsKICAgICAgSFBoaSBwaGkgPSBuZXcgSFBoaS5tYW55SW5wdXRzKG51bGwsIDxISW5zdHJ1Y3Rpb24+W3RoZW5WYWx1ZSwgZWxzZVZhbHVlXSwKICAgICAgICAgIGJ1aWxkZXIuYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSk7CiAgICAgIGpvaW5CcmFuY2guYmxvY2suYWRkUGhpKHBoaSk7CiAgICAgIGJ1aWxkZXIuc3RhY2suYWRkKHBoaSk7CiAgICB9CgogICAgSEJhc2ljQmxvY2sgam9pbkJsb2NrOwogICAgLy8gSWYgYXQgbGVhc3Qgb25lIGJyYW5jaCBkaWQgbm90IGFib3J0LCBvcGVuIHRoZSBqb2luQnJhbmNoLgogICAgaWYgKCFqb2luQnJhbmNoLmJsb2NrLnByZWRlY2Vzc29ycy5pc0VtcHR5KSB7CiAgICAgIHN0YXJ0QnJhbmNoKGpvaW5CcmFuY2gpOwogICAgICBqb2luQmxvY2sgPSBqb2luQnJhbmNoLmJsb2NrOwogICAgfQoKICAgIEhJZkJsb2NrSW5mb3JtYXRpb24gaW5mbyA9IG5ldyBISWZCbG9ja0luZm9ybWF0aW9uKAogICAgICAgIG5ldyBIU3ViRXhwcmVzc2lvbkJsb2NrSW5mb3JtYXRpb24oY29uZGl0aW9uQnJhbmNoLmdyYXBoKSwKICAgICAgICBuZXcgSFN1YkdyYXBoQmxvY2tJbmZvcm1hdGlvbih0aGVuQnJhbmNoLmdyYXBoKSwKICAgICAgICBuZXcgSFN1YkdyYXBoQmxvY2tJbmZvcm1hdGlvbihlbHNlQnJhbmNoLmdyYXBoKSk7CgogICAgSEJhc2ljQmxvY2sgY29uZGl0aW9uU3RhcnRCbG9jayA9IGNvbmRpdGlvbkJyYW5jaC5ibG9jazsKICAgIGNvbmRpdGlvblN0YXJ0QmxvY2suc2V0QmxvY2tGbG93KGluZm8sIGpvaW5CbG9jayk7CiAgICBTdWJHcmFwaCBjb25kaXRpb25HcmFwaCA9IGNvbmRpdGlvbkJyYW5jaC5ncmFwaDsKICAgIEhJZiBicmFuY2ggPSBjb25kaXRpb25HcmFwaC5lbmQubGFzdDsKICAgIGFzc2VydChicmFuY2ggaXMgSElmKTsKICAgIGJyYW5jaC5ibG9ja0luZm9ybWF0aW9uID0gY29uZGl0aW9uU3RhcnRCbG9jay5ibG9ja0Zsb3c7CiAgfQp9CoDpAE5OPAEZKAEdHhUBEigbHRwSAT0CARkeIgE5ARsfOAYEARcdIRwcLSIWF0E6Ri82Gzg3NyxMLT8BHEYEAU9KPSM2KCArFg9DFQgNQhMGBAEnKjAgBAFBMRkTSC8gN0EGGBkcBhEEAUYvHURGREYpGQYBP0QEAVEfPx0EASw1IRsOJi04BAE0BiIGGxQdDCMGIgYbGR0MIhxGFiAhARwOLigUFko4CAYBFw8vBgEuLxlEJw4yMS8kHwQBHUFCNTAwMAE5OgFMHB1GHUYBGDZRNCQeBgEbQjIfJAYBOEM5OgE9NzUqGz0EAgEwcGFja2FnZTpjb21waWxlci9zcmMvc3NhL3NzYV9icmFuY2hfYnVpbGRlci5kYXJ0P3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3NzYS9zd2l0Y2hfY29udGludWVfYW5hbHlzaXMuZGFydI1ZaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CgovLy8gSGVscGVyIGNsYXNzIHRoYXQgdHJhdmVyc2VzIGEga2VybmVsIEFTVCBzdWJ0cmVlIHRvIHNlZSBpZiBpdCBoYXMgYW55Ci8vLyBjb250aW51ZSBzdGF0ZW1lbnRzIGluIHRoZSBib2R5IG9mIGFueSBzd2l0Y2ggY2FzZXMgKGhhdmluZyBjb250aW51ZQovLy8gc3RhdGVtZW50cyByZXN1bHRzIGluIGEgbW9yZSBjb21wbGV4IGdlbmVyYXRlZCBjb2RlKS4KY2xhc3MgU3dpdGNoQ29udGludWVBbmFseXNpcyBleHRlbmRzIGlyLlZpc2l0b3I8Ym9vbD4gewogIFN3aXRjaENvbnRpbnVlQW5hbHlzaXMuXygpOwoKICBzdGF0aWMgYm9vbCBjb250YWluc0NvbnRpbnVlKGlyLlN0YXRlbWVudCBzd2l0Y2hDYXNlQm9keSkgewogICAgcmV0dXJuIHN3aXRjaENhc2VCb2R5LmFjY2VwdChuZXcgU3dpdGNoQ29udGludWVBbmFseXNpcy5fKCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdENvbnRpbnVlU3dpdGNoU3RhdGVtZW50KGlyLkNvbnRpbnVlU3dpdGNoU3RhdGVtZW50IGNvbnRpbnVlU3RtdCkgewogICAgLy8gVE9ETyhlZm9ydHVuYSk6IENoZWNrIHdoYXQgdGhlIHRhcmdldCBvZiB0aGlzIGNvbnRpbnVlIHN0YXRlbWVudCBhY3R1YWxseQogICAgLy8gSVMsIGJlY2F1c2UgZGVwZW5kaW5nIG9uIHdoZXJlIHRoZSBsYWJlbCBwb2ludHMgaWYgd2UgaGF2ZSBhIG5lc3RlZAogICAgLy8gc3dpdGNoIHN0YXRlbWVudCB3ZSBtaWdodCBiZSBhYmxlIHRvIG91dHB1dCBzaW1wbGVyIGNvZGUgKG5vdCB0aGUgY29tcGxleAogICAgLy8gc3dpdGNoIHN0YXRlbWVudCkuCiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRCbG9jayhpci5CbG9jayBibG9jaykgewogICAgZm9yIChpci5TdGF0ZW1lbnQgc3RhdGVtZW50IGluIGJsb2NrLnN0YXRlbWVudHMpIHsKICAgICAgaWYgKHN0YXRlbWVudC5hY2NlcHQodGhpcykpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdExhYmVsZWRTdGF0ZW1lbnQoaXIuTGFiZWxlZFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKICAgIHJldHVybiBzdGF0ZW1lbnQuYm9keS5hY2NlcHQodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RG9TdGF0ZW1lbnQoaXIuRG9TdGF0ZW1lbnQgZG9TdGF0ZW1lbnQpIHsKICAgIHJldHVybiBkb1N0YXRlbWVudC5ib2R5LmFjY2VwdCh0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRGb3JTdGF0ZW1lbnQoaXIuRm9yU3RhdGVtZW50IGZvclN0YXRlbWVudCkgewogICAgcmV0dXJuIGZvclN0YXRlbWVudC5ib2R5LmFjY2VwdCh0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRGb3JJblN0YXRlbWVudChpci5Gb3JJblN0YXRlbWVudCBmb3JJblN0YXRlbWVudCkgewogICAgcmV0dXJuIGZvckluU3RhdGVtZW50LmJvZHkuYWNjZXB0KHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFN3aXRjaFN0YXRlbWVudChpci5Td2l0Y2hTdGF0ZW1lbnQgc3dpdGNoU3RhdGVtZW50KSB7CiAgICBmb3IgKHZhciBzd2l0Y2hDYXNlIGluIHN3aXRjaFN0YXRlbWVudC5jYXNlcykgewogICAgICBpZiAoc3dpdGNoQ2FzZS5hY2NlcHQodGhpcykpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFN3aXRjaENhc2UoaXIuU3dpdGNoQ2FzZSBzd2l0Y2hDYXNlKSB7CiAgICByZXR1cm4gc3dpdGNoQ2FzZS5ib2R5LmFjY2VwdCh0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJZlN0YXRlbWVudChpci5JZlN0YXRlbWVudCBpZlN0YXRlbWVudCkgewogICAgcmV0dXJuIGlmU3RhdGVtZW50LnRoZW4uYWNjZXB0KHRoaXMpIHx8CiAgICAgICAgKGlmU3RhdGVtZW50Lm90aGVyd2lzZSAhPSBudWxsICYmIGlmU3RhdGVtZW50Lm90aGVyd2lzZS5hY2NlcHQodGhpcykpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFRyeUNhdGNoKGlyLlRyeUNhdGNoIHRyeUNhdGNoKSB7CiAgICBpZiAodHJ5Q2F0Y2guYm9keS5hY2NlcHQodGhpcykpIHsKICAgICAgZm9yICh2YXIgY2F0Y2hTdGF0ZW1lbnQgaW4gdHJ5Q2F0Y2guY2F0Y2hlcykgewogICAgICAgIGlmIChjYXRjaFN0YXRlbWVudC5hY2NlcHQodGhpcykpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFdoaWxlU3RhdGVtZW50KGlyLldoaWxlU3RhdGVtZW50IHN0YXRlbWVudCkgewogICAgcmV0dXJuIHN0YXRlbWVudC5ib2R5LmFjY2VwdCh0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRDYXRjaChpci5DYXRjaCBjYXRjaFN0YXRlbWVudCkgewogICAgcmV0dXJuIGNhdGNoU3RhdGVtZW50LmJvZHkuYWNjZXB0KHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFRyeUZpbmFsbHkoaXIuVHJ5RmluYWxseSB0cnlGaW5hbGx5KSB7CiAgICByZXR1cm4gdHJ5RmluYWxseS5ib2R5LmFjY2VwdCh0aGlzKSAmJiB0cnlGaW5hbGx5LmZpbmFsaXplci5hY2NlcHQodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihpci5GdW5jdGlvbkRlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CiAgICByZXR1cm4gZGVjbGFyYXRpb24uZnVuY3Rpb24uYWNjZXB0KHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEZ1bmN0aW9uTm9kZShpci5GdW5jdGlvbk5vZGUgbm9kZSkgewogICAgcmV0dXJuIG5vZGUuYm9keS5hY2NlcHQodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGRlZmF1bHRTdGF0ZW1lbnQoaXIuU3RhdGVtZW50IG5vZGUpIHsKICAgIGlmIChub2RlIGlzIGlyLkV4cHJlc3Npb25TdGF0ZW1lbnQgfHwKICAgICAgICBub2RlIGlzIGlyLkVtcHR5U3RhdGVtZW50IHx8CiAgICAgICAgbm9kZSBpcyBpci5CcmVha1N0YXRlbWVudCB8fAogICAgICAgIG5vZGUgaXMgaXIuUmV0dXJuU3RhdGVtZW50IHx8CiAgICAgICAgbm9kZSBpcyBpci5Bc3NlcnRTdGF0ZW1lbnQgfHwKICAgICAgICBub2RlIGlzIGlyLllpZWxkU3RhdGVtZW50IHx8CiAgICAgICAgbm9kZSBpcyBpci5WYXJpYWJsZURlY2xhcmF0aW9uKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHRocm93ICdTdGF0ZW1lbnQgdHlwZSAke25vZGUucnVudGltZVR5cGV9IG5vdCBoYW5kbGVkIGluICcKICAgICAgICAnU3dpdGNoQ29udGludWVBbmFseXNpcyc7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGRlZmF1bHROb2RlKGlyLk5vZGUgbm9kZSkgPT4gZmFsc2U7Cn0KgIEAKAFKSTo4HgE+QgQBDE9RS1EaEQQBDCQ3JBUIBhIEAQw+KAQBDDYqBAEMOSsEAQw/LQQBDEI0JRUIBhIEAQwzKQQBDDYsTwQBDC0mNSsXCggGEgQBDDooBAEMLS0EAQwzTgQBDEYuBAEMMSMEAQwtKiUlJiYlKhQGPyIEAQwrAgE2cGFja2FnZTpjb21waWxlci9zcmMvc3NhL3N3aXRjaF9jb250aW51ZV9hbmFseXNpcy5kYXJ0M3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3NzYS90eXBlX2J1aWxkZXIuZGFydK/FLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZ3JhcGhfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdub2Rlcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci9hYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydCc7CmltcG9ydCAnLi4vaW8vc291cmNlX2luZm9ybWF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3VzZS5kYXJ0JyBzaG93IFR5cGVVc2U7CgovLy8gRW51bSB0aGF0IGRlZmluZXMgaG93IGEgbWVtYmVyIGhhcyBhY2Nlc3MgdG8gdGhlIGN1cnJlbnQgdHlwZSB2YXJpYWJsZXMuCmVudW0gQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgewogIC8vLyBUaGUgbWVtYmVyIGhhcyBubyBhY2Nlc3MgdG8gdHlwZSB2YXJpYWJsZXMuCiAgbm9uZSwKCiAgLy8vIFR5cGUgdmFyaWFibGVzIGFyZSBhY2Nlc3NpYmxlIGFzIGEgcHJvcGVydHkgb24gYHRoaXNgLgogIHByb3BlcnR5LAoKICAvLy8gVHlwZSB2YXJpYWJsZXMgYXJlIGFjY2Vzc2libGUgYXMgcGFyYW1ldGVycyBpbiB0aGUgY3VycmVudCBjb250ZXh0LgogIHBhcmFtZXRlciwKCiAgLy8vIElmIHRoZSBjdXJyZW50IGNvbnRleHQgaXMgYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yLCB0eXBlIHZhcmlhYmxlcyBhcmUKICAvLy8gYWNjZXNzaWJsZSBhcyBwYXJhbWV0ZXJzLCBvdGhlcndpc2UgdHlwZSB2YXJpYWJsZXMgYXJlIGFjY2Vzc2libGUgYXMKICAvLy8gYSBwcm9wZXJ0eSBvbiBgdGhpc2AuCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCBmb3IgaW5zdGFuY2UgZmllbGRzIHdob3NlIGluaXRpYWxpemVycyBhcmUgZXhlY3V0ZWQgaW4gdGhlCiAgLy8vIGNvbnN0cnVjdG9ycy4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBdm9pZCB0aGUgbmVlZCBmb3IgdGhpcyBieSBhZGRpbmcgYSBmaWVsZC1zZXR0ZXIKICAvLyB0byB0aGUgSi1tb2RlbC4KICBpbnN0YW5jZUZpZWxkLAp9CgovLy8gRnVuY3Rpb25zIHRvIGluc2VydCB0eXBlIGNoZWNraW5nLCBjb2VyY2lvbiwgYW5kIGluc3RydWN0aW9uIGluc2VydGlvbgovLy8gZGVwZW5kaW5nIG9uIHRoZSBlbnZpcm9ubWVudCBmb3IgZGFydCBjb2RlLgphYnN0cmFjdCBjbGFzcyBUeXBlQnVpbGRlciB7CiAgZmluYWwgR3JhcGhCdWlsZGVyIGJ1aWxkZXI7CiAgVHlwZUJ1aWxkZXIodGhpcy5idWlsZGVyKTsKCiAgLy8vIENyZWF0ZSBhIHR5cGUgbWFzayBmb3IgJ3RydXN0aW5nJyBhIERhcnRUeXBlLiBSZXR1cm5zIGBudWxsYCBpZiB0aGVyZSBpcwogIC8vLyBubyBhcHByb3hpbWF0aW5nIHR5cGUgbWFzayAoaS5lLiB0aGUgdHlwZSBtYXNrIHdvdWxkIGJlIGBkeW5hbWljYCkuCiAgQWJzdHJhY3RWYWx1ZSB0cnVzdFR5cGVNYXNrKERhcnRUeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlID09IG51bGwpIHJldHVybiBudWxsOwogICAgdHlwZSA9IGJ1aWxkZXIubG9jYWxzSGFuZGxlci5zdWJzdEluQ29udGV4dCh0eXBlKTsKICAgIHR5cGUgPSB0eXBlLnVuYWxpYXNlZDsKICAgIGlmICh0eXBlLmlzRHluYW1pYykgcmV0dXJuIG51bGw7CiAgICBpZiAoIXR5cGUuaXNJbnRlcmZhY2VUeXBlKSByZXR1cm4gbnVsbDsKICAgIGlmICh0eXBlID09IGJ1aWxkZXIuY29tbW9uRWxlbWVudHMub2JqZWN0VHlwZSkgcmV0dXJuIG51bGw7CiAgICAvLyBUaGUgdHlwZSBlbGVtZW50IGlzIGVpdGhlciBhIGNsYXNzIG9yIHRoZSB2b2lkIGVsZW1lbnQuCiAgICBDbGFzc0VudGl0eSBlbGVtZW50ID0gKHR5cGUgYXMgSW50ZXJmYWNlVHlwZSkuZWxlbWVudDsKICAgIHJldHVybiBidWlsZGVyLmFic3RyYWN0VmFsdWVEb21haW4uY3JlYXRlTnVsbGFibGVTdWJ0eXBlKGVsZW1lbnQpOwogIH0KCiAgLy8vIENyZWF0ZSBhbiBpbnN0cnVjdGlvbiB0byBzaW1wbHkgdHJ1c3QgdGhlIHByb3ZpZGVkIHR5cGUuCiAgSEluc3RydWN0aW9uIF90cnVzdFR5cGUoSEluc3RydWN0aW9uIG9yaWdpbmFsLCBEYXJ0VHlwZSB0eXBlKSB7CiAgICBhc3NlcnQodHlwZSAhPSBudWxsKTsKICAgIEFic3RyYWN0VmFsdWUgbWFzayA9IHRydXN0VHlwZU1hc2sodHlwZSk7CiAgICBpZiAobWFzayA9PSBudWxsKSByZXR1cm4gb3JpZ2luYWw7CiAgICByZXR1cm4gbmV3IEhUeXBlS25vd24ucGlubmVkKG1hc2ssIG9yaWdpbmFsKTsKICB9CgogIC8vLyBQcm9kdWNlcyBjb2RlIHRoYXQgY2hlY2tzIHRoZSBydW50aW1lIHR5cGUgaXMgYWN0dWFsbHkgdGhlIHR5cGUgc3BlY2lmaWVkCiAgLy8vIGJ5IGF0dGVtcHRpbmcgYSB0eXBlIGNvbnZlcnNpb24uCiAgSEluc3RydWN0aW9uIF9jaGVja1R5cGUoSEluc3RydWN0aW9uIG9yaWdpbmFsLCBEYXJ0VHlwZSB0eXBlLCBpbnQga2luZCkgewogICAgYXNzZXJ0KHR5cGUgIT0gbnVsbCk7CiAgICB0eXBlID0gYnVpbGRlci5sb2NhbHNIYW5kbGVyLnN1YnN0SW5Db250ZXh0KHR5cGUpOwogICAgSEluc3RydWN0aW9uIG90aGVyID0gYnVpbGRUeXBlQ29udmVyc2lvbihvcmlnaW5hbCwgdHlwZSwga2luZCk7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGlzIG9wZXJhdGlvbiBvbiBgcmVnaXN0cnlgIG1heSBiZSBpbmNvbnNpc3RlbnQuCiAgICAvLyBJZiBpdCBpcyBuZWVkZWQgdGhlbiBpdCBzZWVtcyBsaWtlbHkgdGhhdCBzaW1pbGFyIGludm9jYXRpb25zIG9mCiAgICAvLyBgYnVpbGRUeXBlQ29udmVyc2lvbmAgaW4gYFNzYUJ1aWxkZXIudmlzaXRBc2Agc2hvdWxkIGFsc28gYmUgZm9sbG93ZWQgYnkKICAgIC8vIGEgc2ltaWxhciBvcGVyYXRpb24gb24gYHJlZ2lzdHJ5YDsgb3RoZXJ3aXNlLCB0aGlzIG9uZSBtaWdodCBub3QgYmUKICAgIC8vIG5lZWRlZC4KICAgIGJ1aWxkZXIucmVnaXN0cnk/LnJlZ2lzdGVyVHlwZVVzZShuZXcgVHlwZVVzZS5pc0NoZWNrKHR5cGUpKTsKICAgIGlmIChvdGhlciBpcyBIVHlwZUNvbnZlcnNpb24gJiYgb3RoZXIuaXNSZWR1bmRhbnQoYnVpbGRlci5jbG9zZWRXb3JsZCkpIHsKICAgICAgcmV0dXJuIG9yaWdpbmFsOwogICAgfQogICAgcmV0dXJuIG90aGVyOwogIH0KCiAgSEluc3RydWN0aW9uIHRydXN0VHlwZU9mUGFyYW1ldGVyKEhJbnN0cnVjdGlvbiBvcmlnaW5hbCwgRGFydFR5cGUgdHlwZSkgewogICAgaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuIG9yaWdpbmFsOwogICAgSEluc3RydWN0aW9uIHRydXN0ZWQgPSBfdHJ1c3RUeXBlKG9yaWdpbmFsLCB0eXBlKTsKICAgIGlmICh0cnVzdGVkID09IG9yaWdpbmFsKSByZXR1cm4gb3JpZ2luYWw7CiAgICBpZiAodHJ1c3RlZCBpcyBIVHlwZUtub3duICYmIHRydXN0ZWQuaXNSZWR1bmRhbnQoYnVpbGRlci5jbG9zZWRXb3JsZCkpIHsKICAgICAgcmV0dXJuIG9yaWdpbmFsOwogICAgfQogICAgYnVpbGRlci5hZGQodHJ1c3RlZCk7CiAgICByZXR1cm4gdHJ1c3RlZDsKICB9CgogIEhJbnN0cnVjdGlvbiBwb3RlbnRpYWxseUNoZWNrT3JUcnVzdFR5cGVPZlBhcmFtZXRlcigKICAgICAgSEluc3RydWN0aW9uIG9yaWdpbmFsLCBEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZSA9PSBudWxsKSByZXR1cm4gb3JpZ2luYWw7CiAgICBISW5zdHJ1Y3Rpb24gY2hlY2tlZE9yVHJ1c3RlZCA9IG9yaWdpbmFsOwogICAgaWYgKGJ1aWxkZXIub3B0aW9ucy5wYXJhbWV0ZXJDaGVja1BvbGljeS5pc1RydXN0ZWQpIHsKICAgICAgY2hlY2tlZE9yVHJ1c3RlZCA9IF90cnVzdFR5cGUob3JpZ2luYWwsIHR5cGUpOwogICAgfSBlbHNlIGlmIChidWlsZGVyLm9wdGlvbnMucGFyYW1ldGVyQ2hlY2tQb2xpY3kuaXNFbWl0dGVkKSB7CiAgICAgIGNoZWNrZWRPclRydXN0ZWQgPQogICAgICAgICAgX2NoZWNrVHlwZShvcmlnaW5hbCwgdHlwZSwgSFR5cGVDb252ZXJzaW9uLkNIRUNLRURfTU9ERV9DSEVDSyk7CiAgICB9CiAgICBpZiAoY2hlY2tlZE9yVHJ1c3RlZCA9PSBvcmlnaW5hbCkgcmV0dXJuIG9yaWdpbmFsOwogICAgYnVpbGRlci5hZGQoY2hlY2tlZE9yVHJ1c3RlZCk7CiAgICByZXR1cm4gY2hlY2tlZE9yVHJ1c3RlZDsKICB9CgogIC8vLyBEZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgYW5kIHRoZSBtb2RlLCB3cmFwIHRoZSBnaXZlbiB0eXBlIGluIGFuCiAgLy8vIGluc3RydWN0aW9uIHRoYXQgY2hlY2tzIHRoZSB0eXBlIGlzIHdoYXQgd2UgZXhwZWN0IG9yIGF1dG9tYXRpY2FsbHkKICAvLy8gdHJ1c3RzIHRoZSB3cml0dGVuIHR5cGUuCiAgSEluc3RydWN0aW9uIHBvdGVudGlhbGx5Q2hlY2tPclRydXN0VHlwZU9mQXNzaWdubWVudCgKICAgICAgSEluc3RydWN0aW9uIG9yaWdpbmFsLCBEYXJ0VHlwZSB0eXBlLAogICAgICB7aW50IGtpbmQ6IEhUeXBlQ29udmVyc2lvbi5DSEVDS0VEX01PREVfQ0hFQ0t9KSB7CiAgICBpZiAodHlwZSA9PSBudWxsKSByZXR1cm4gb3JpZ2luYWw7CiAgICBISW5zdHJ1Y3Rpb24gY2hlY2tlZE9yVHJ1c3RlZCA9IG9yaWdpbmFsOwogICAgaWYgKGJ1aWxkZXIub3B0aW9ucy5hc3NpZ25tZW50Q2hlY2tQb2xpY3kuaXNUcnVzdGVkKSB7CiAgICAgIGNoZWNrZWRPclRydXN0ZWQgPSBfdHJ1c3RUeXBlKG9yaWdpbmFsLCB0eXBlKTsKICAgIH0gZWxzZSBpZiAoYnVpbGRlci5vcHRpb25zLmFzc2lnbm1lbnRDaGVja1BvbGljeS5pc0VtaXR0ZWQpIHsKICAgICAgY2hlY2tlZE9yVHJ1c3RlZCA9IF9jaGVja1R5cGUob3JpZ2luYWwsIHR5cGUsIGtpbmQpOwogICAgfQogICAgaWYgKGNoZWNrZWRPclRydXN0ZWQgPT0gb3JpZ2luYWwpIHJldHVybiBvcmlnaW5hbDsKICAgIGJ1aWxkZXIuYWRkKGNoZWNrZWRPclRydXN0ZWQpOwogICAgcmV0dXJuIGNoZWNrZWRPclRydXN0ZWQ7CiAgfQoKICBISW5zdHJ1Y3Rpb24gcG90ZW50aWFsbHlDaGVja09yVHJ1c3RUeXBlT2ZDb25kaXRpb24oSEluc3RydWN0aW9uIG9yaWdpbmFsKSB7CiAgICBEYXJ0VHlwZSBib29sVHlwZSA9IGJ1aWxkZXIuY29tbW9uRWxlbWVudHMuYm9vbFR5cGU7CiAgICBISW5zdHJ1Y3Rpb24gY2hlY2tlZE9yVHJ1c3RlZCA9IG9yaWdpbmFsOwogICAgaWYgKGJ1aWxkZXIub3B0aW9ucy5jb25kaXRpb25DaGVja1BvbGljeS5pc1RydXN0ZWQpIHsKICAgICAgY2hlY2tlZE9yVHJ1c3RlZCA9IF90cnVzdFR5cGUob3JpZ2luYWwsIGJvb2xUeXBlKTsKICAgIH0gZWxzZSBpZiAoYnVpbGRlci5vcHRpb25zLmNvbmRpdGlvbkNoZWNrUG9saWN5LmlzRW1pdHRlZCkgewogICAgICBjaGVja2VkT3JUcnVzdGVkID0gX2NoZWNrVHlwZSgKICAgICAgICAgIG9yaWdpbmFsLCBib29sVHlwZSwgSFR5cGVDb252ZXJzaW9uLkJPT0xFQU5fQ09OVkVSU0lPTl9DSEVDSyk7CiAgICB9CiAgICBpZiAoY2hlY2tlZE9yVHJ1c3RlZCA9PSBvcmlnaW5hbCkgcmV0dXJuIG9yaWdpbmFsOwogICAgYnVpbGRlci5hZGQoY2hlY2tlZE9yVHJ1c3RlZCk7CiAgICByZXR1cm4gY2hlY2tlZE9yVHJ1c3RlZDsKICB9CgogIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzIGNvbXB1dGVUeXBlVmFyaWFibGVBY2Nlc3MoTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIC8vLyBIZWxwZXIgdG8gY3JlYXRlIGFuIGluc3RydWN0aW9uIHRoYXQgZ2V0cyB0aGUgdmFsdWUgb2YgYSB0eXBlIHZhcmlhYmxlLgogIEhJbnN0cnVjdGlvbiBhZGRUeXBlVmFyaWFibGVSZWZlcmVuY2UoCiAgICAgIFR5cGVWYXJpYWJsZVR5cGUgdHlwZSwgTWVtYmVyRW50aXR5IG1lbWJlciwKICAgICAge1NvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9ufSkgewogICAgTG9jYWwgdHlwZVZhcmlhYmxlTG9jYWwgPQogICAgICAgIGJ1aWxkZXIubG9jYWxzSGFuZGxlci5nZXRUeXBlVmFyaWFibGVBc0xvY2FsKHR5cGUpOwoKICAgIC8vLyBSZWFkIFt0eXBlVmFyaWFibGVdIGFzIGEgcHJvcGVydHkgb2Ygb24gYHRoaXNgLgogICAgSEluc3RydWN0aW9uIHJlYWRBc1Byb3BlcnR5KCkgewogICAgICByZXR1cm4gcmVhZFR5cGVWYXJpYWJsZSh0eXBlLCBtZW1iZXIsCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pOwogICAgfQoKICAgIC8vLyBSZWFkIFt0eXBlVmFyaWFibGVdIGFzIGEgcGFyYW1ldGVyLgogICAgSEluc3RydWN0aW9uIHJlYWRBc1BhcmFtZXRlcigpIHsKICAgICAgcmV0dXJuIGJ1aWxkZXIubG9jYWxzSGFuZGxlcgogICAgICAgICAgLnJlYWRMb2NhbCh0eXBlVmFyaWFibGVMb2NhbCwgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0KCiAgICBDbGFzc1R5cGVWYXJpYWJsZUFjY2VzcyB0eXBlVmFyaWFibGVBY2Nlc3M7CiAgICBpZiAodHlwZS5lbGVtZW50LnR5cGVEZWNsYXJhdGlvbiBpcyBDbGFzc0VudGl0eSkgewogICAgICB0eXBlVmFyaWFibGVBY2Nlc3MgPSBjb21wdXRlVHlwZVZhcmlhYmxlQWNjZXNzKG1lbWJlcik7CiAgICB9IGVsc2UgewogICAgICB0eXBlVmFyaWFibGVBY2Nlc3MgPSBDbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcy5wYXJhbWV0ZXI7CiAgICB9CiAgICBzd2l0Y2ggKHR5cGVWYXJpYWJsZUFjY2VzcykgewogICAgICBjYXNlIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzLnBhcmFtZXRlcjoKICAgICAgICByZXR1cm4gcmVhZEFzUGFyYW1ldGVyKCk7CiAgICAgIGNhc2UgQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MuaW5zdGFuY2VGaWVsZDoKICAgICAgICBpZiAobWVtYmVyICE9IGJ1aWxkZXIudGFyZ2V0RWxlbWVudCkgewogICAgICAgICAgLy8gV2hlbiBbbWVtYmVyXSBpcyBhIGZpZWxkLCB3ZSBjYW4gZWl0aGVyIGJlIGdlbmVyYXRpbmcgYSBjaGVja2VkCiAgICAgICAgICAvLyBzZXR0ZXIgb3IgaW5saW5pbmcgaXRzIGluaXRpYWxpemVyIGluIGEgY29uc3RydWN0b3IuIEFuIGluaXRpYWxpemVyCiAgICAgICAgICAvLyBpcyBuZXZlciBidWlsdCBzdGFuZGFsb25lLCBzbyBpbiB0aGF0IGNhc2UgW3RhcmdldF0gaXMgbm90IHRoZQogICAgICAgICAgLy8gW21lbWJlcl0gaXRzZWxmLgogICAgICAgICAgcmV0dXJuIHJlYWRBc1BhcmFtZXRlcigpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVhZEFzUHJvcGVydHkoKTsKICAgICAgY2FzZSBDbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcy5wcm9wZXJ0eToKICAgICAgICByZXR1cm4gcmVhZEFzUHJvcGVydHkoKTsKICAgICAgY2FzZSBDbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcy5ub25lOgogICAgICAgIGJ1aWxkZXIucmVwb3J0ZXIuaW50ZXJuYWxFcnJvcigKICAgICAgICAgICAgdHlwZS5lbGVtZW50LCAnVW5leHBlY3RlZCB0eXBlIHZhcmlhYmxlIGluIHN0YXRpYyBjb250ZXh0LicpOwogICAgfQogICAgYnVpbGRlci5yZXBvcnRlci5pbnRlcm5hbEVycm9yKAogICAgICAgIHR5cGUuZWxlbWVudCwgJ1VuZXhwZWN0ZWQgdHlwZSB2YXJpYWJsZSBhY2Nlc3M6ICR0eXBlVmFyaWFibGVBY2Nlc3MuJyk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vLyBHZW5lcmF0ZSBjb2RlIHRvIGV4dHJhY3QgdGhlIHR5cGUgYXJndW1lbnQgZnJvbSB0aGUgb2JqZWN0LgogIEhJbnN0cnVjdGlvbiByZWFkVHlwZVZhcmlhYmxlKFR5cGVWYXJpYWJsZVR5cGUgdmFyaWFibGUsIE1lbWJlckVudGl0eSBtZW1iZXIsCiAgICAgIHtTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbn0pIHsKICAgIGFzc2VydChtZW1iZXIuaXNJbnN0YW5jZU1lbWJlcik7CiAgICBhc3NlcnQodmFyaWFibGUuZWxlbWVudC50eXBlRGVjbGFyYXRpb24gaXMgQ2xhc3NFbnRpdHkpOwogICAgSEluc3RydWN0aW9uIHRhcmdldCA9CiAgICAgICAgYnVpbGRlci5sb2NhbHNIYW5kbGVyLnJlYWRUaGlzKHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBISW5zdHJ1Y3Rpb24gaW50ZXJjZXB0b3IgPQogICAgICAgIG5ldyBISW50ZXJjZXB0b3IodGFyZ2V0LCBidWlsZGVyLmFic3RyYWN0VmFsdWVEb21haW4ubm9uTnVsbFR5cGUpCiAgICAgICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgICBidWlsZGVyLmFkZChpbnRlcmNlcHRvcik7CiAgICBidWlsZGVyLnB1c2gobmV3IEhUeXBlSW5mb1JlYWRWYXJpYWJsZS5pbnRlcmNlcHRlZCgKICAgICAgICB2YXJpYWJsZSwgaW50ZXJjZXB0b3IsIHRhcmdldCwgYnVpbGRlci5hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlKQogICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb24pOwogICAgcmV0dXJuIGJ1aWxkZXIucG9wKCk7CiAgfQoKICBISW5zdHJ1Y3Rpb24gYnVpbGRUeXBlQXJndW1lbnRSZXByZXNlbnRhdGlvbnMoCiAgICAgIERhcnRUeXBlIHR5cGUsIE1lbWJlckVudGl0eSBzb3VyY2VFbGVtZW50LAogICAgICBbU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb25dKSB7CiAgICBhc3NlcnQoIXR5cGUuaXNUeXBlVmFyaWFibGUpOwogICAgLy8gQ29tcHV0ZSB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHR5cGUgYXJndW1lbnRzLCBpbmNsdWRpbmcgYWNjZXNzCiAgICAvLyB0byB0aGUgcnVudGltZSB0eXBlIGluZm9ybWF0aW9uIGZvciB0eXBlIHZhcmlhYmxlcyBhcyBpbnN0cnVjdGlvbnMuCiAgICBhc3NlcnQodHlwZS5pc0ludGVyZmFjZVR5cGUpOwogICAgSW50ZXJmYWNlVHlwZSBpbnRlcmZhY2UgPSB0eXBlOwogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cyA9IDxISW5zdHJ1Y3Rpb24+W107CiAgICBmb3IgKERhcnRUeXBlIGFyZ3VtZW50IGluIGludGVyZmFjZS50eXBlQXJndW1lbnRzKSB7CiAgICAgIGlucHV0cy5hZGQoYW5hbHl6ZVR5cGVBcmd1bWVudChhcmd1bWVudCwgc291cmNlRWxlbWVudCwKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfQogICAgSEluc3RydWN0aW9uIHJlcHJlc2VudGF0aW9uID0gbmV3IEhUeXBlSW5mb0V4cHJlc3Npb24oCiAgICAgICAgVHlwZUluZm9FeHByZXNzaW9uS2luZC5JTlNUQU5DRSwKICAgICAgICBidWlsZGVyLmNsb3NlZFdvcmxkLmVsZW1lbnRFbnZpcm9ubWVudC5nZXRUaGlzVHlwZShpbnRlcmZhY2UuZWxlbWVudCksCiAgICAgICAgaW5wdXRzLAogICAgICAgIGJ1aWxkZXIuYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSkKICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogICAgcmV0dXJuIHJlcHJlc2VudGF0aW9uOwogIH0KCiAgSEluc3RydWN0aW9uIGFuYWx5emVUeXBlQXJndW1lbnQoCiAgICAgIERhcnRUeXBlIGFyZ3VtZW50LCBNZW1iZXJFbnRpdHkgc291cmNlRWxlbWVudCwKICAgICAge1NvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9ufSkgewogICAgYXJndW1lbnQgPSBhcmd1bWVudC51bmFsaWFzZWQ7CiAgICBpZiAoYXJndW1lbnQudHJlYXRBc0R5bmFtaWMpIHsKICAgICAgLy8gUmVwcmVzZW50IFtkeW5hbWljXSBhcyBbbnVsbF0uCiAgICAgIHJldHVybiBidWlsZGVyLmdyYXBoLmFkZENvbnN0YW50TnVsbChidWlsZGVyLmNsb3NlZFdvcmxkKTsKICAgIH0KCiAgICBpZiAoYXJndW1lbnQuaXNUeXBlVmFyaWFibGUpIHsKICAgICAgcmV0dXJuIGFkZFR5cGVWYXJpYWJsZVJlZmVyZW5jZShhcmd1bWVudCwgc291cmNlRWxlbWVudCwKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CgogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cyA9IDxISW5zdHJ1Y3Rpb24+W107CiAgICBhcmd1bWVudC5mb3JFYWNoVHlwZVZhcmlhYmxlKChUeXBlVmFyaWFibGVUeXBlIHZhcmlhYmxlKSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEFsc28gbWFrZSB0aGlzIGNvbmRpdGlvbmFsIG9uIHdoZXRoZXIgd2UgaGF2ZQogICAgICAvLyBjYWxjdWxhdGVkIHdlIG5lZWQgdGhhdCBwYXJ0aWN1bGFyIG1ldGhvZCBzaWduYXR1cmUuCiAgICAgIGlucHV0cy5hZGQoYW5hbHl6ZVR5cGVBcmd1bWVudCh2YXJpYWJsZSwgc291cmNlRWxlbWVudCkpOwogICAgfSk7CiAgICBISW5zdHJ1Y3Rpb24gcmVzdWx0ID0gbmV3IEhUeXBlSW5mb0V4cHJlc3Npb24oCiAgICAgICAgVHlwZUluZm9FeHByZXNzaW9uS2luZC5DT01QTEVURSwKICAgICAgICBhcmd1bWVudCwKICAgICAgICBpbnB1dHMsCiAgICAgICAgYnVpbGRlci5hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlKQogICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgICBidWlsZGVyLmFkZChyZXN1bHQpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGJvb2wgZ2V0IGNoZWNrT3JUcnVzdFR5cGVzID0+IHRydWU7CgogIC8vLyBCdWlsZCBhIFtIVHlwZUNvbnZlcnNpb25dIGZvciBjb252ZXJ0aW5nIFtvcmlnaW5hbF0gdG8gdHlwZSBbdHlwZV0uCiAgLy8vCiAgLy8vIEludmFyaWFudDogW3R5cGVdIG11c3QgYmUgdmFsaWQgaW4gdGhlIGNvbnRleHQuCiAgLy8vIFNlZSBbTG9jYWxzSGFuZGxlci5zdWJzdEluQ29udGV4dF0uCiAgSEluc3RydWN0aW9uIGJ1aWxkVHlwZUNvbnZlcnNpb24oCiAgICAgIEhJbnN0cnVjdGlvbiBvcmlnaW5hbCwgRGFydFR5cGUgdHlwZSwgaW50IGtpbmQsCiAgICAgIHtTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbn0pIHsKICAgIGlmICh0eXBlID09IG51bGwpIHJldHVybiBvcmlnaW5hbDsKICAgIHR5cGUgPSB0eXBlLnVuYWxpYXNlZDsKICAgIGlmICh0eXBlLmlzSW50ZXJmYWNlVHlwZSAmJiAhdHlwZS50cmVhdEFzUmF3KSB7CiAgICAgIEludGVyZmFjZVR5cGUgaW50ZXJmYWNlVHlwZSA9IHR5cGU7CiAgICAgIEFic3RyYWN0VmFsdWUgc3VidHlwZSA9IGJ1aWxkZXIuYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgICAgLmNyZWF0ZU51bGxhYmxlU3VidHlwZShpbnRlcmZhY2VUeXBlLmVsZW1lbnQpOwogICAgICBISW5zdHJ1Y3Rpb24gcmVwcmVzZW50YXRpb25zID0gYnVpbGRUeXBlQXJndW1lbnRSZXByZXNlbnRhdGlvbnMoCiAgICAgICAgICB0eXBlLCBidWlsZGVyLnNvdXJjZUVsZW1lbnQsIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgYnVpbGRlci5hZGQocmVwcmVzZW50YXRpb25zKTsKICAgICAgcmV0dXJuIG5ldyBIVHlwZUNvbnZlcnNpb24ud2l0aFR5cGVSZXByZXNlbnRhdGlvbigKICAgICAgICAgIHR5cGUsIGtpbmQsIHN1YnR5cGUsIG9yaWdpbmFsLCByZXByZXNlbnRhdGlvbnMpCiAgICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogICAgfSBlbHNlIGlmICh0eXBlLmlzVHlwZVZhcmlhYmxlKSB7CiAgICAgIEFic3RyYWN0VmFsdWUgc3VidHlwZSA9IG9yaWdpbmFsLmluc3RydWN0aW9uVHlwZTsKICAgICAgSEluc3RydWN0aW9uIHR5cGVWYXJpYWJsZSA9CiAgICAgICAgICBhZGRUeXBlVmFyaWFibGVSZWZlcmVuY2UodHlwZSwgYnVpbGRlci5zb3VyY2VFbGVtZW50KTsKICAgICAgcmV0dXJuIG5ldyBIVHlwZUNvbnZlcnNpb24ud2l0aFR5cGVSZXByZXNlbnRhdGlvbigKICAgICAgICAgIHR5cGUsIGtpbmQsIHN1YnR5cGUsIG9yaWdpbmFsLCB0eXBlVmFyaWFibGUpCiAgICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogICAgfSBlbHNlIGlmICh0eXBlLmlzRnVuY3Rpb25UeXBlIHx8IHR5cGUuaXNGdXR1cmVPcikgewogICAgICBISW5zdHJ1Y3Rpb24gcmVpZmllZFR5cGUgPQogICAgICAgICAgYW5hbHl6ZVR5cGVBcmd1bWVudCh0eXBlLCBidWlsZGVyLnNvdXJjZUVsZW1lbnQpOwogICAgICAvLyBUeXBlTWFza3MgZG9uJ3QgZW5jb2RlIGZ1bmN0aW9uIHR5cGVzIG9yIEZ1dHVyZU9yIHR5cGVzLgogICAgICBBYnN0cmFjdFZhbHVlIHJlZmluZWRNYXNrID0gb3JpZ2luYWwuaW5zdHJ1Y3Rpb25UeXBlOwogICAgICByZXR1cm4gbmV3IEhUeXBlQ29udmVyc2lvbi53aXRoVHlwZVJlcHJlc2VudGF0aW9uKAogICAgICAgICAgdHlwZSwga2luZCwgcmVmaW5lZE1hc2ssIG9yaWdpbmFsLCByZWlmaWVkVHlwZSkKICAgICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gb3JpZ2luYWwuY29udmVydFR5cGUoYnVpbGRlci5jbG9zZWRXb3JsZCwgdHlwZSwga2luZCkKICAgICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgICB9CiAgfQp9CoEtAE5OPAEdFSQhMSgsAU0fMggBPQwBSg0BTUscBk4USxURAgFLMB0eHQFPSi8jNxslLEA/O0cEAT9CGi4nMgQBUCdMGjdETkhQSw9CThcGEgQBTCc3Lk0XBhoUBAE3LicuOjVBGUoGNyMdBAFHSh84LDgnLjs1QjsGNyMdBAFPOS46OUElSQY3Ix0EAUoBTikyLx48ATgkLDEGASwlI08GATA3Pg0+BiIuIjIvTVFMHiQKIS0hKShKBiRQEQQBQlAvJT0aTh9KMx44UDAaBAExMS8iSksiJDI5PjIGOylPEDEvGwQBJDUvIyMoQQYBIz8xBgEyP0w+QAgzKRIQMS8ZEwQBJgFKBjYqJDYvJxs0Kjo5RzskOToxJjgiQTk3MTkhPEI8OToxDUMxBgQCASpwYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2EvdHlwZV9idWlsZGVyLmRhcnQxc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaXIvZWxlbWVudF9tYXAuZGFydIsoLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydCcgYXMgaXI7CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvaW5kZXhlZC5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9vcmRlcmVkX3R5cGVzZXQuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY2FsbF9zdHJ1Y3R1cmUuZGFydCc7CgovLy8gSW50ZXJmYWNlIHRoYXQgdHJhbnNsYXRlcyBiZXR3ZWVuIEtlcm5lbCBJUiBub2RlcyBhbmQgZW50aXRpZXMuCi8vLwovLy8gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIGltcGxlbWVudCBbS2VybmVsVG9FbGVtZW50TWFwXSBpbiB0aGUKLy8vIGZyb250ZW5kIGFuZCBbSnNUb0VsZW1lbnRNYXBdIGluIHRoZSBiYWNrZW5kLgphYnN0cmFjdCBjbGFzcyBJclRvRWxlbWVudE1hcCB7CiAgLy8vIFJldHVybnMgdGhlIFtEYXJ0VHlwZV0gY29ycmVzcG9uZGluZyB0byBbdHlwZV0uCiAgRGFydFR5cGUgZ2V0RGFydFR5cGUoaXIuRGFydFR5cGUgdHlwZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbTWVtYmVyRW50aXR5XSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtZW1iZXIgW25vZGVdLgogIE1lbWJlckVudGl0eSBnZXRNZW1iZXIoaXIuTWVtYmVyIG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgW0Z1bmN0aW9uRW50aXR5XSBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9jZWR1cmUgW25vZGVdLgogIEZ1bmN0aW9uRW50aXR5IGdldE1ldGhvZChpci5Qcm9jZWR1cmUgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbQ29uc3RydWN0b3JFbnRpdHldIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdlbmVyYXRpdmUgb3IgZmFjdG9yeQogIC8vLyBjb25zdHJ1Y3RvciBbbm9kZV0uCiAgQ29uc3RydWN0b3JFbnRpdHkgZ2V0Q29uc3RydWN0b3IoaXIuTWVtYmVyIG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgW0ZpZWxkRW50aXR5XSBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaWVsZCBbbm9kZV0uCiAgRmllbGRFbnRpdHkgZ2V0RmllbGQoaXIuRmllbGQgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbQ2xhc3NFbnRpdHldIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNsYXNzIFtub2RlXS4KICBDbGFzc0VudGl0eSBnZXRDbGFzcyhpci5DbGFzcyBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtGdW5jdGlvblR5cGVdIG9mIHRoZSBbbm9kZV0uCiAgRnVuY3Rpb25UeXBlIGdldEZ1bmN0aW9uVHlwZShpci5GdW5jdGlvbk5vZGUgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbVHlwZWRlZlR5cGVdIGNvcnJlc3BvbmRpbmcgdG8gcmF3IHR5cGUgb2YgdGhlIHR5cGVkZWYgW25vZGVdLgogIFR5cGVkZWZUeXBlIGdldFR5cGVkZWZUeXBlKGlyLlR5cGVkZWYgbm9kZSk7CgogIC8vLyBSZXR1cm4gdGhlIFtJbnRlcmZhY2VUeXBlXSBjb3JyZXNwb25kaW5nIHRvIHRoZSBbY2xzXSB3aXRoIHRoZSBnaXZlbgogIC8vLyBbdHlwZUFyZ3VtZW50c10uCiAgSW50ZXJmYWNlVHlwZSBjcmVhdGVJbnRlcmZhY2VUeXBlKAogICAgICBpci5DbGFzcyBjbHMsIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMpOwoKICAvLy8gUmV0dXJucyB0aGUgW0NhbGxTdHJ1Y3R1cmVdIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFthcmd1bWVudHNdLgogIENhbGxTdHJ1Y3R1cmUgZ2V0Q2FsbFN0cnVjdHVyZShpci5Bcmd1bWVudHMgYXJndW1lbnRzKTsKCiAgLy8vIFJldHVybnMgdGhlIFtUeXBlVmFyaWFibGVFbnRpdHldIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUgcGFyYW1ldGVyCiAgLy8vIFtub2RlXS4KICBUeXBlVmFyaWFibGVFbnRpdHkgZ2V0VHlwZVZhcmlhYmxlKGlyLlR5cGVQYXJhbWV0ZXIgbm9kZSk7CgogIENvbW1vbkVsZW1lbnRzIGdldCBjb21tb25FbGVtZW50czsKICBEaWFnbm9zdGljUmVwb3J0ZXIgZ2V0IHJlcG9ydGVyOwogIEludGVyZmFjZVR5cGUgZ2V0VGhpc1R5cGUoSW5kZXhlZENsYXNzIGNscyk7CiAgSW50ZXJmYWNlVHlwZSBnZXRTdXBlclR5cGUoSW5kZXhlZENsYXNzIGNscyk7CiAgT3JkZXJlZFR5cGVTZXQgZ2V0T3JkZXJlZFR5cGVTZXQoSW5kZXhlZENsYXNzIGNscyk7CiAgSXRlcmFibGU8SW50ZXJmYWNlVHlwZT4gZ2V0SW50ZXJmYWNlcyhJbmRleGVkQ2xhc3MgY2xzKTsKICBJbnRlcmZhY2VUeXBlIGFzSW5zdGFuY2VPZihJbnRlcmZhY2VUeXBlIHR5cGUsIENsYXNzRW50aXR5IGNscyk7CiAgRGFydFR5cGUgc3Vic3RCeUNvbnRleHQoRGFydFR5cGUgdHlwZSwgSW50ZXJmYWNlVHlwZSBjb250ZXh0KTsKICBEYXJ0VHlwZSBnZXRDYWxsVHlwZShJbnRlcmZhY2VUeXBlIHR5cGUpOwogIGludCBnZXRIaWVyYXJjaHlEZXB0aChJbmRleGVkQ2xhc3MgY2xzKTsKICBEYXJ0VHlwZSBnZXRUeXBlVmFyaWFibGVCb3VuZChJbmRleGVkVHlwZVZhcmlhYmxlIHR5cGVWYXJpYWJsZSk7Cn0KSQBOTjwBKDQvNQEZIiQjISIqAUQETzIgNioBRSoBSi8BURo0AUMnAUMnATA2AVEvAUsXJTYBRDoBSw49ASUjLzA2O0NBLCtDAgEocGFja2FnZTpjb21waWxlci9zcmMvaXIvZWxlbWVudF9tYXAuZGFydDJzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9vcmRlcmVkX3R5cGVzZXQuZGFydKd+Ly8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgb3JkZXJlZF90eXBlc2V0OwoKaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL2RhcnQyanMuZGFydCcKICAgIHNob3cgTGluaywgTGlua0J1aWxkZXIsIExpbmtFbnRyeTsKCmltcG9ydCAnY29tbW9uLmRhcnQnOwppbXBvcnQgJ2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJ2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJ3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0JzsKCi8vLyBBbiBvcmRlcmVkIHNldCBvZiB0aGUgc3VwZXJ0eXBlcyBvZiBhIGNsYXNzLiBUaGUgc3VwZXJ0eXBlcyBvZiBhIGNsYXNzIGFyZQovLy8gb3JkZXJlZCBieSBkZWNyZWFzaW5nIGhpZXJhcmNoeSBkZXB0aCBhbmQgYnkgdGhlIG9yZGVyIHRoZXkgYXJlIGV4dGVuZGVkLAovLy8gbWl4ZWQgaW4sIG9yIGltcGxlbWVudGVkLgovLy8KLy8vIEZvciB0aGVzZSBjbGFzc2VzCi8vLwovLy8gICAgIGNsYXNzIEEge30gLy8gRGVwdGggPSAxLgovLy8gICAgIGNsYXNzIEIge30gLy8gRGVwdGggPSAxLgovLy8gICAgIGNsYXNzIEMgZXh0ZW5kcyBCIGltcGxlbWVudHMgQSB7fSAvLyBEZXB0aCAyLgovLy8KLy8vIHRoZSBvcmRlcmVkIHN1cGVydHlwZXMgYXJlCi8vLwovLy8gICAgIEE6IFtBLCBPYmplY3RdCi8vLyAgICAgQjogW0IsIE9iamVjdF0KLy8vICAgICBDOiBbQywgQiwgQSwgT2JqZWN0XQpjbGFzcyBPcmRlcmVkVHlwZVNldCB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtPcmRlcmVkVHlwZVNldF0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdvcmRlcmVkLXR5cGUtc2V0JzsKCiAgZmluYWwgTGlzdDxMaW5rPEludGVyZmFjZVR5cGU+PiBfbGV2ZWxzOwogIGZpbmFsIExpbms8SW50ZXJmYWNlVHlwZT4gdHlwZXM7CgogIE9yZGVyZWRUeXBlU2V0LmludGVybmFsKHRoaXMuX2xldmVscywgdGhpcy50eXBlcyk7CgogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbT3JkZXJlZFR5cGVTZXRdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgT3JkZXJlZFR5cGVTZXQucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNYWtlIHRoZSBkZXNlcmlhbGl6ZWQgdHlwZSBzZXRzIHNoYXJlIHRoZWlyCiAgICAvLyBpbnRlcm5hbCBsaW5rcyBsaWtlIHRoZSBvcmlnaW5hbCB0eXBlIHNldHMgZG8/CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGludCB0eXBlc0NvdW50ID0gc291cmNlLnJlYWRJbnQoKTsKICAgIExpbmtCdWlsZGVyPEludGVyZmFjZVR5cGU+IHR5cGVMaW5rQnVpbGRlciA9CiAgICAgICAgbmV3IExpbmtCdWlsZGVyPEludGVyZmFjZVR5cGU+KCk7CiAgICBMaXN0PExpbms8SW50ZXJmYWNlVHlwZT4+IGxpbmtzID0gW107CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzQ291bnQ7IGkrKykgewogICAgICBsaW5rcy5hZGQodHlwZUxpbmtCdWlsZGVyLmFkZExhc3Qoc291cmNlLnJlYWREYXJ0VHlwZSgpKSk7CiAgICB9CiAgICBMaW5rPEludGVyZmFjZVR5cGU+IHR5cGVzID0KICAgICAgICB0eXBlTGlua0J1aWxkZXIudG9MaW5rKGNvbnN0IExpbms8SW50ZXJmYWNlVHlwZT4oKSk7CiAgICBsaW5rcy5hZGQoY29uc3QgTGluazxJbnRlcmZhY2VUeXBlPigpKTsKCiAgICBpbnQgbGV2ZWxDb3VudCA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICBMaXN0PExpbms8SW50ZXJmYWNlVHlwZT4+IGxldmVscyA9CiAgICAgICAgbmV3IExpc3Q8TGluazxJbnRlcmZhY2VUeXBlPj4obGV2ZWxDb3VudCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxldmVsQ291bnQ7IGkrKykgewogICAgICBsZXZlbHNbaV0gPSBsaW5rc1tzb3VyY2UucmVhZEludCgpXTsKICAgIH0KICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgT3JkZXJlZFR5cGVTZXQuaW50ZXJuYWwobGV2ZWxzLCB0eXBlcyk7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtPcmRlcmVkVHlwZVNldF0gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIExpc3Q8SW50ZXJmYWNlVHlwZT4gdHlwZUxpc3QgPSB0eXBlcy50b0xpc3QoKTsKICAgIHNpbmsud3JpdGVJbnQodHlwZUxpc3QubGVuZ3RoKTsKICAgIGZvciAoSW50ZXJmYWNlVHlwZSB0eXBlIGluIHR5cGVMaXN0KSB7CiAgICAgIHNpbmsud3JpdGVEYXJ0VHlwZSh0eXBlKTsKICAgIH0KICAgIExpc3Q8aW50PiBsZXZlbExpc3QgPSBbXTsKICAgIExpbms8SW50ZXJmYWNlVHlwZT4gbGluayA9IHR5cGVzOwogICAgd2hpbGUgKGxpbmsgIT0gbnVsbCkgewogICAgICBpbnQgaW5kZXggPSBfbGV2ZWxzLmluZGV4T2YobGluayk7CiAgICAgIGlmIChpbmRleCAhPSAtMSkgewogICAgICAgIGxldmVsTGlzdC5hZGQoaW5kZXgpOwogICAgICB9CiAgICAgIGxpbmsgPSBsaW5rLnRhaWw7CiAgICB9CiAgICBzaW5rLndyaXRlSW50KGxldmVsTGlzdC5sZW5ndGgpOwogICAgZm9yIChpbnQgbGV2ZWwgaW4gbGV2ZWxMaXN0KSB7CiAgICAgIHNpbmsud3JpdGVJbnQobGV2ZWwpOwogICAgfQogICAgc2luay5lbmQodGFnKTsKICB9CgogIGZhY3RvcnkgT3JkZXJlZFR5cGVTZXQuc2luZ2xldG9uKEludGVyZmFjZVR5cGUgdHlwZSkgewogICAgTGluazxJbnRlcmZhY2VUeXBlPiB0eXBlcyA9CiAgICAgICAgbmV3IExpbmtFbnRyeTxJbnRlcmZhY2VUeXBlPih0eXBlLCBjb25zdCBMaW5rPEludGVyZmFjZVR5cGU+KCkpOwogICAgTGlzdDxMaW5rPEludGVyZmFjZVR5cGU+PiBsaXN0ID0gbmV3IExpc3Q8TGluazxJbnRlcmZhY2VUeXBlPj4oMSk7CiAgICBsaXN0WzBdID0gdHlwZXM7CiAgICByZXR1cm4gbmV3IE9yZGVyZWRUeXBlU2V0LmludGVybmFsKGxpc3QsIHR5cGVzKTsKICB9CgogIC8vLyBDcmVhdGVzIGEgbmV3IFtPcmRlcmVkVHlwZVNldF0gZm9yIFt0eXBlXSB3aGVuIGl0IGRpcmVjdGx5IGV4dGVuZHMgdGhlCiAgLy8vIGNsYXNzIHdoaWNoIHRoaXMgc2V0IHJlcHJlc2VudHMuIFRoaXMgaXMgZm9yIGluc3RhbmNlIHVzZWQgdG8gY3JlYXRlIHRoZQogIC8vLyB0eXBlIHNldCBmb3IgW0Nsb3N1cmVDbGFzc0VsZW1lbnRdIHdoaWNoIGV4dGVuZHMgW0Nsb3N1cmVdLgogIE9yZGVyZWRUeXBlU2V0IGV4dGVuZENsYXNzKEludGVyZmFjZVR5cGUgdHlwZSkgewogICAgYXNzZXJ0KAogICAgICAgIHR5cGVzLmhlYWQudHJlYXRBc1JhdywKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgdHlwZS5lbGVtZW50LAogICAgICAgICAgICAnQ2Fubm90IGV4dGVuZCBnZW5lcmljIGNsYXNzICR7dHlwZXMuaGVhZH0gdXNpbmcgJwogICAgICAgICAgICAnT3JkZXJlZFR5cGVTZXQuZXh0ZW5kQ2xhc3MnKSk7CiAgICBMaW5rPEludGVyZmFjZVR5cGU+IGV4dGVuZGVkVHlwZXMgPQogICAgICAgIG5ldyBMaW5rRW50cnk8SW50ZXJmYWNlVHlwZT4odHlwZSwgdHlwZXMpOwogICAgTGlzdDxMaW5rPEludGVyZmFjZVR5cGU+PiBsaXN0ID0gbmV3IExpc3Q8TGluazxJbnRlcmZhY2VUeXBlPj4obGV2ZWxzICsgMSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxldmVsczsgaSsrKSB7CiAgICAgIGxpc3RbaV0gPSBfbGV2ZWxzW2ldOwogICAgfQogICAgbGlzdFtsZXZlbHNdID0gZXh0ZW5kZWRUeXBlczsKICAgIHJldHVybiBuZXcgT3JkZXJlZFR5cGVTZXQuaW50ZXJuYWwobGlzdCwgZXh0ZW5kZWRUeXBlcyk7CiAgfQoKICBMaW5rPEludGVyZmFjZVR5cGU+IGdldCBzdXBlcnR5cGVzID0+IHR5cGVzLnRhaWw7CgogIGludCBnZXQgbGV2ZWxzID0+IF9sZXZlbHMubGVuZ3RoOwoKICBpbnQgZ2V0IG1heERlcHRoID0+IGxldmVscyAtIDE7CgogIExpbms8SW50ZXJmYWNlVHlwZT4gb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCBsZXZlbHMpIHsKICAgICAgcmV0dXJuIF9sZXZlbHNbaW5kZXhdOwogICAgfQogICAgcmV0dXJuIGNvbnN0IExpbms8SW50ZXJmYWNlVHlwZT4oKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBvZmZzZXRzIGludG8gW3R5cGVzXSBhdCB3aGljaCBlYWNoIGxldmVsIGJlZ2lucy4KICBMaXN0PGludD4gZ2V0IGxldmVsT2Zmc2V0cyB7CiAgICBMaXN0PGludD4gb2Zmc2V0cyA9IG5ldyBMaXN0LmZpbGxlZChsZXZlbHMsIC0xKTsKICAgIGludCBvZmZzZXQgPSAwOwogICAgTGluazxJbnRlcmZhY2VUeXBlPiBwb2ludGVyID0gdHlwZXM7CiAgICBmb3IgKGludCBkZXB0aCA9IG1heERlcHRoOyBkZXB0aCA+PSAwOyBkZXB0aC0tKSB7CiAgICAgIHdoaWxlICghaWRlbnRpY2FsKHBvaW50ZXIsIF9sZXZlbHNbZGVwdGhdKSkgewogICAgICAgIHBvaW50ZXIgPSBwb2ludGVyLnRhaWw7CiAgICAgICAgb2Zmc2V0Kys7CiAgICAgIH0KICAgICAgb2Zmc2V0c1tkZXB0aF0gPSBvZmZzZXQ7CiAgICB9CiAgICByZXR1cm4gb2Zmc2V0czsKICB9CgogIHZvaWQgZm9yRWFjaChpbnQgbGV2ZWwsIHZvaWQgZihJbnRlcmZhY2VUeXBlIHR5cGUpKSB7CiAgICBpZiAobGV2ZWwgPCBsZXZlbHMpIHsKICAgICAgTGluazxJbnRlcmZhY2VUeXBlPiBwb2ludGVyID0gX2xldmVsc1tsZXZlbF07CiAgICAgIExpbms8SW50ZXJmYWNlVHlwZT4gZW5kID0KICAgICAgICAgIGxldmVsID4gMCA/IF9sZXZlbHNbbGV2ZWwgLSAxXSA6IGNvbnN0IExpbms8SW50ZXJmYWNlVHlwZT4oKTsKICAgICAgLy8gVE9ETyhoZXQpOiBjaGVja2luZyBgaXNOb3RFbXB0eWAgc2hvdWxkIGJlIHVubmVjZXNzYXJ5LCByZW1vdmUgd2hlbgogICAgICAvLyBjb25zdGFudHMgYXJlIHByb3Blcmx5IGNhbm9uaWNhbGl6ZWQKICAgICAgd2hpbGUgKHBvaW50ZXIuaXNOb3RFbXB0eSAmJiAhaWRlbnRpY2FsKHBvaW50ZXIsIGVuZCkpIHsKICAgICAgICBmKHBvaW50ZXIuaGVhZCk7CiAgICAgICAgcG9pbnRlciA9IHBvaW50ZXIudGFpbDsKICAgICAgfQogICAgfQogIH0KCiAgSW50ZXJmYWNlVHlwZSBhc0luc3RhbmNlT2YoQ2xhc3NFbnRpdHkgY2xzLCBpbnQgaGllcmFyY2h5RGVwdGgpIHsKICAgIGludCBsZXZlbCA9IGhpZXJhcmNoeURlcHRoOwogICAgaWYgKGxldmVsIDwgbGV2ZWxzKSB7CiAgICAgIExpbms8SW50ZXJmYWNlVHlwZT4gcG9pbnRlciA9IF9sZXZlbHNbbGV2ZWxdOwogICAgICBMaW5rPEludGVyZmFjZVR5cGU+IGVuZCA9CiAgICAgICAgICBsZXZlbCA+IDAgPyBfbGV2ZWxzW2xldmVsIC0gMV0gOiBjb25zdCBMaW5rPEludGVyZmFjZVR5cGU+KCk7CiAgICAgIC8vIFRPRE8oaGV0KTogY2hlY2tpbmcgYGlzTm90RW1wdHlgIHNob3VsZCBiZSB1bm5lY2Vzc2FyeSwgcmVtb3ZlIHdoZW4KICAgICAgLy8gY29uc3RhbnRzIGFyZSBwcm9wZXJseSBjYW5vbmljYWxpemVkCiAgICAgIHdoaWxlIChwb2ludGVyLmlzTm90RW1wdHkgJiYgIWlkZW50aWNhbChwb2ludGVyLCBlbmQpKSB7CiAgICAgICAgaWYgKGNscyA9PSBwb2ludGVyLmhlYWQuZWxlbWVudCkgewogICAgICAgICAgcmV0dXJuIHBvaW50ZXIuaGVhZDsKICAgICAgICB9CiAgICAgICAgcG9pbnRlciA9IHBvaW50ZXIudGFpbDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiB0eXBlcy50b1N0cmluZygpOwp9CgovLy8gQnVpbGRlciBmb3IgY3JlYXRpb24gYW4gb3JkZXJlZCBzZXQgb2YgdGhlIHN1cGVydHlwZXMgb2YgYSBjbGFzcy4gVGhlCi8vLyBzdXBlcnR5cGVzIGFyZSBvcmRlcmVkIGJ5IGRlY3JlYXNpbmcgaGllcmFyY2h5IGRlcHRoIGFuZCBieSB0aGUgb3JkZXIgdGhleQovLy8gYXJlIGV4dGVuZGVkLCBtaXhlZCBpbiwgb3IgaW1wbGVtZW50ZWQuCi8vLwovLy8gRm9yIHRoZXNlIGNsYXNzZXMKLy8vCi8vLyAgICAgY2xhc3MgQSB7fSAvLyBEZXB0aCA9IDEuCi8vLyAgICAgY2xhc3MgQiB7fSAvLyBEZXB0aCA9IDEuCi8vLyAgICAgY2xhc3MgQyBleHRlbmRzIEIgaW1wbGVtZW50cyBBIHt9IC8vIERlcHRoIDIuCi8vLwovLy8gdGhlIG9yZGVyZWQgc3VwZXJ0eXBlcyBhcmUKLy8vCi8vLyAgICAgQTogW0EsIE9iamVjdF0KLy8vICAgICBCOiBbQiwgT2JqZWN0XQovLy8gICAgIEM6IFtDLCBCLCBBLCBPYmplY3RdCmFic3RyYWN0IGNsYXNzIE9yZGVyZWRUeXBlU2V0QnVpbGRlciB7CiAgT3JkZXJlZFR5cGVTZXQgY3JlYXRlT3JkZXJlZFR5cGVTZXQoCiAgICAgIEludGVyZmFjZVR5cGUgc3VwZXJ0eXBlLCBMaW5rPERhcnRUeXBlPiBpbnRlcmZhY2VzKTsKfQoKYWJzdHJhY3QgY2xhc3MgT3JkZXJlZFR5cGVTZXRCdWlsZGVyQmFzZSBpbXBsZW1lbnRzIE9yZGVyZWRUeXBlU2V0QnVpbGRlciB7CiAgTWFwPGludCwgTGlua0VudHJ5PEludGVyZmFjZVR5cGU+PiBtYXAgPQogICAgICBuZXcgTWFwPGludCwgTGlua0VudHJ5PEludGVyZmFjZVR5cGU+PigpOwogIGludCBtYXhEZXB0aCA9IC0xOwoKICBmaW5hbCBDbGFzc0VudGl0eSBjbHM7CgogIE9yZGVyZWRUeXBlU2V0QnVpbGRlckJhc2UodGhpcy5jbHMpOwoKICBJbnRlcmZhY2VUeXBlIGdldFRoaXNUeXBlKGNvdmFyaWFudCBDbGFzc0VudGl0eSBjbHMpOwogIEludGVyZmFjZVR5cGUgc3Vic3RCeUNvbnRleHQoCiAgICAgIGNvdmFyaWFudCBJbnRlcmZhY2VUeXBlIHR5cGUsIGNvdmFyaWFudCBJbnRlcmZhY2VUeXBlIGNvbnRleHQpOwogIGludCBnZXRIaWVyYXJjaHlEZXB0aChjb3ZhcmlhbnQgQ2xhc3NFbnRpdHkgY2xzKTsKICBPcmRlcmVkVHlwZVNldCBnZXRPcmRlcmVkVHlwZVNldChjb3ZhcmlhbnQgQ2xhc3NFbnRpdHkgY2xzKTsKCiAgQG92ZXJyaWRlCiAgT3JkZXJlZFR5cGVTZXQgY3JlYXRlT3JkZXJlZFR5cGVTZXQoCiAgICAgIEludGVyZmFjZVR5cGUgc3VwZXJ0eXBlLCBMaW5rPERhcnRUeXBlPiBpbnRlcmZhY2VzKSB7CiAgICAvLyBUT0RPKDE1Mjk2KTogQ29sbGFwc2UgdGhlc2UgaXRlcmF0aW9ucyB0byBvbmUgd2hlbiB0aGUgb3JkZXIgaXMgbm90CiAgICAvLyBuZWVkZWQuCiAgICBhZGQoc3VwZXJ0eXBlKTsKICAgIGZvciAoTGluazxEYXJ0VHlwZT4gbGluayA9IGludGVyZmFjZXM7ICFsaW5rLmlzRW1wdHk7IGxpbmsgPSBsaW5rLnRhaWwpIHsKICAgICAgYWRkKGxpbmsuaGVhZCk7CiAgICB9CgogICAgX2FkZEFsbFN1cGVydHlwZXMoc3VwZXJ0eXBlKTsKICAgIGZvciAoTGluazxEYXJ0VHlwZT4gbGluayA9IGludGVyZmFjZXM7ICFsaW5rLmlzRW1wdHk7IGxpbmsgPSBsaW5rLnRhaWwpIHsKICAgICAgX2FkZEFsbFN1cGVydHlwZXMobGluay5oZWFkKTsKICAgIH0KICAgIGFkZChnZXRUaGlzVHlwZShjbHMpKTsKICAgIHJldHVybiB0b1R5cGVTZXQoKTsKICB9CgogIC8vLyBBZGRzIFt0eXBlXSBhbmQgYWxsIHN1cGVydHlwZXMgb2YgW3R5cGVdIHRvIFthbGxTdXBlcnR5cGVzXSB3aGlsZQogIC8vLyBzdWJzdGl0dXRpbmcgdHlwZSB2YXJpYWJsZXMuCiAgdm9pZCBfYWRkQWxsU3VwZXJ0eXBlcyhJbnRlcmZhY2VUeXBlIHR5cGUpIHsKICAgIENsYXNzRW50aXR5IGNsYXNzRWxlbWVudCA9IHR5cGUuZWxlbWVudDsKICAgIExpbms8SW50ZXJmYWNlVHlwZT4gc3VwZXJ0eXBlcyA9IGdldE9yZGVyZWRUeXBlU2V0KGNsYXNzRWxlbWVudCkuc3VwZXJ0eXBlczsKICAgIGFzc2VydCgKICAgICAgICBzdXBlcnR5cGVzICE9IG51bGwsCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIGNscywKICAgICAgICAgICAgIlN1cGVydHlwZXMgbm90IGNvbXB1dGVkIG9uICRjbGFzc0VsZW1lbnQgIgogICAgICAgICAgICAiZHVyaW5nIHJlc29sdXRpb24gb2YgJGNscyIpKTsKICAgIHdoaWxlICghc3VwZXJ0eXBlcy5pc0VtcHR5KSB7CiAgICAgIEludGVyZmFjZVR5cGUgc3VwZXJ0eXBlID0gc3VwZXJ0eXBlcy5oZWFkOwogICAgICBhZGQoc3Vic3RCeUNvbnRleHQoc3VwZXJ0eXBlLCB0eXBlKSk7CiAgICAgIHN1cGVydHlwZXMgPSBzdXBlcnR5cGVzLnRhaWw7CiAgICB9CiAgfQoKICB2b2lkIGFkZChJbnRlcmZhY2VUeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlLmVsZW1lbnQgPT0gY2xzKSB7CiAgICAgIF9hZGRBdERlcHRoKHR5cGUsIG1heERlcHRoICsgMSk7CiAgICB9IGVsc2UgewogICAgICBfYWRkQXREZXB0aCh0eXBlLCBnZXRIaWVyYXJjaHlEZXB0aCh0eXBlLmVsZW1lbnQpKTsKICAgIH0KICB9CgogIHZvaWQgX2FkZEF0RGVwdGgoSW50ZXJmYWNlVHlwZSB0eXBlLCBpbnQgZGVwdGgpIHsKICAgIExpbmtFbnRyeTxJbnRlcmZhY2VUeXBlPiBwcmV2ID0gbnVsbDsKICAgIExpbmtFbnRyeTxJbnRlcmZhY2VUeXBlPiBsaW5rID0gbWFwW2RlcHRoXTsKICAgIHdoaWxlIChsaW5rICE9IG51bGwpIHsKICAgICAgSW50ZXJmYWNlVHlwZSBleGlzdGluZ1R5cGUgPSBsaW5rLmhlYWQ7CiAgICAgIGlmIChleGlzdGluZ1R5cGUgPT0gdHlwZSkgcmV0dXJuOwogICAgICBpZiAoZXhpc3RpbmdUeXBlLmVsZW1lbnQgPT0gdHlwZS5lbGVtZW50KSB7CiAgICAgICAgYXNzZXJ0KGZhbHNlLCBmYWlsZWRBdChjbHMsICdJbnZhbGlkIG9yZGVyZWQgdHlwZXNldCBmb3IgJGNscycpKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgcHJldiA9IGxpbms7CiAgICAgIGxpbmsgPSBsaW5rLnRhaWw7CiAgICB9CiAgICBMaW5rRW50cnk8SW50ZXJmYWNlVHlwZT4gbmV4dCA9IG5ldyBMaW5rRW50cnk8SW50ZXJmYWNlVHlwZT4odHlwZSk7CiAgICBuZXh0LnRhaWwgPSBudWxsOwogICAgaWYgKHByZXYgPT0gbnVsbCkgewogICAgICBtYXBbZGVwdGhdID0gbmV4dDsKICAgIH0gZWxzZSB7CiAgICAgIHByZXYudGFpbCA9IG5leHQ7CiAgICB9CiAgICBpZiAoZGVwdGggPiBtYXhEZXB0aCkgewogICAgICBtYXhEZXB0aCA9IGRlcHRoOwogICAgfQogIH0KCiAgT3JkZXJlZFR5cGVTZXQgdG9UeXBlU2V0KCkgewogICAgTGlzdDxMaW5rPEludGVyZmFjZVR5cGU+PiBsZXZlbHMgPQogICAgICAgIG5ldyBMaXN0PExpbms8SW50ZXJmYWNlVHlwZT4+KG1heERlcHRoICsgMSk7CiAgICBpZiAobWF4RGVwdGggPCAwKSB7CiAgICAgIHJldHVybiBuZXcgT3JkZXJlZFR5cGVTZXQuaW50ZXJuYWwobGV2ZWxzLCBjb25zdCBMaW5rPEludGVyZmFjZVR5cGU+KCkpOwogICAgfQogICAgTGluazxJbnRlcmZhY2VUeXBlPiBuZXh0ID0gY29uc3QgTGluazxJbnRlcmZhY2VUeXBlPigpOwogICAgZm9yIChpbnQgZGVwdGggPSAwOyBkZXB0aCA8PSBtYXhEZXB0aDsgZGVwdGgrKykgewogICAgICBMaW5rRW50cnk8SW50ZXJmYWNlVHlwZT4gZmlyc3QgPSBtYXBbZGVwdGhdOwogICAgICBpZiAoZmlyc3QgPT0gbnVsbCkgewogICAgICAgIGxldmVsc1tkZXB0aF0gPSBuZXh0OwogICAgICB9IGVsc2UgewogICAgICAgIGxldmVsc1tkZXB0aF0gPSBmaXJzdDsKICAgICAgICBMaW5rRW50cnk8SW50ZXJmYWNlVHlwZT4gbGFzdCA9IGZpcnN0OwogICAgICAgIHdoaWxlIChsYXN0LnRhaWwgIT0gbnVsbCkgewogICAgICAgICAgbGFzdCA9IGxhc3QudGFpbDsKICAgICAgICB9CiAgICAgICAgbGFzdC50YWlsID0gbmV4dDsKICAgICAgICBuZXh0ID0gZmlyc3Q7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgT3JkZXJlZFR5cGVTZXQuaW50ZXJuYWwobGV2ZWxzLCBsZXZlbHMubGFzdCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBmb3IgKGludCBkZXB0aCA9IDA7IGRlcHRoIDw9IG1heERlcHRoOyBkZXB0aCsrKSB7CiAgICAgIHNiLndyaXRlKCckZGVwdGg6ICcpOwogICAgICBMaW5rRW50cnk8SW50ZXJmYWNlVHlwZT4gZmlyc3QgPSBtYXBbZGVwdGhdOwogICAgICBmaXJzdC5wcmludE9uKHNiLCAiLCAiKTsKICAgICAgc2Iud3JpdGUoJ1xuJyk7CiAgICB9CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KgUMATk48ARkBOScBFiEeKwFPTh4EFgQhITYEHwQXFx0XSB0wASsjATUBPEFINhcnMSoqK0EGID0sAScnMysrBhU3BAEyKBUzJCsgBh4mGykZHggYBiUjHAYTBAE5IElHFTUEAU1PQjMMHxIaPywoM1AnHAYiPQQBNAEkASIBLxodBigEAUMfNRQpNjQgEggfBhQEATgaNCBITS4/GSAIBgQBRCAaNCBITS4/Kx8KIAgGEQQBDCkCAUpPLAQWBCEhNgQfBBcXHScnOwIBTCswFQEZAScBOCBGND8BDCc8Sw8UThYGASJOJAYbGAQBSCMvLVEMHBIROCsiMSwkBgQBIR8nDToGBAE0KjAbLigyShAIExgGSBYYGQ0YBhwYBgQBHyc1GE8GPDYzGx4PHy8kHAoaFggGPQQBDBYqNhwzHxYGGgQCASlwYWNrYWdlOmNvbXBpbGVyL3NyYy9vcmRlcmVkX3R5cGVzZXQuZGFydDhzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pci9jYWNoZWRfc3RhdGljX3R5cGUuZGFydIlgLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQnIGFzIGlyOwppbXBvcnQgJ3N0YXRpY190eXBlX2Jhc2UuZGFydCc7CmltcG9ydCAnc3RhdGljX3R5cGVfcHJvdmlkZXIuZGFydCc7CgovLy8gQ2xhc3MgdGhhdCBwcm92aWRlcyB0aGUgc3RhdGljIHR5cGUgb2YgZXhwcmVzc2lvbiB1c2luZyB0aGUgdmlzaXRvciBwYXR0ZXJuCi8vLyBhbmQgYSBwcmVjb21wdXRlZCBjYWNoZSBmb3IgY29tcGxleCBleHByZXNzaW9uIHR5cGUuCmNsYXNzIENhY2hlZFN0YXRpY1R5cGUgZXh0ZW5kcyBTdGF0aWNUeXBlQmFzZSBpbXBsZW1lbnRzIFN0YXRpY1R5cGVQcm92aWRlciB7CiAgZmluYWwgTWFwPGlyLkV4cHJlc3Npb24sIGlyLkRhcnRUeXBlPiBfY2FjaGU7CiAgQG92ZXJyaWRlCiAgZmluYWwgVGhpc0ludGVyZmFjZVR5cGUgdGhpc1R5cGU7CgogIENhY2hlZFN0YXRpY1R5cGUoCiAgICAgIGlyLlR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQsIHRoaXMuX2NhY2hlLCB0aGlzLnRoaXNUeXBlKQogICAgICA6IHN1cGVyKHR5cGVFbnZpcm9ubWVudCk7CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIGdldFN0YXRpY1R5cGUoaXIuRXhwcmVzc2lvbiBub2RlKSB7CiAgICBpci5EYXJ0VHlwZSB0eXBlID0gbm9kZS5hY2NlcHQodGhpcyk7CiAgICBhc3NlcnQodHlwZSAhPSBudWxsLCAiTm8gc3RhdGljIHR5cGUgZm91bmQgZm9yICR7bm9kZS5ydW50aW1lVHlwZX0uIik7CiAgICByZXR1cm4gdHlwZTsKICB9CgogIGlyLkRhcnRUeXBlIF9nZXRTdGF0aWNUeXBlKGlyLkV4cHJlc3Npb24gbm9kZSkgewogICAgaXIuRGFydFR5cGUgdHlwZSA9IF9jYWNoZVtub2RlXTsKICAgIGFzc2VydCh0eXBlICE9IG51bGwsICJObyBzdGF0aWMgdHlwZSBjYWNoZWQgZm9yICR7bm9kZS5ydW50aW1lVHlwZX0uIik7CiAgICByZXR1cm4gdHlwZTsKICB9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0VmFyaWFibGVHZXQoaXIuVmFyaWFibGVHZXQgbm9kZSkgPT4gX2dldFN0YXRpY1R5cGUobm9kZSk7CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0UHJvcGVydHlHZXQoaXIuUHJvcGVydHlHZXQgbm9kZSkgPT4gX2dldFN0YXRpY1R5cGUobm9kZSk7CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0RGlyZWN0UHJvcGVydHlHZXQoaXIuRGlyZWN0UHJvcGVydHlHZXQgbm9kZSkgPT4KICAgICAgX2dldFN0YXRpY1R5cGUobm9kZSk7CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0U3VwZXJQcm9wZXJ0eUdldChpci5TdXBlclByb3BlcnR5R2V0IG5vZGUpID0+CiAgICAgIF9nZXRTdGF0aWNUeXBlKG5vZGUpOwoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdE1ldGhvZEludm9jYXRpb24oaXIuTWV0aG9kSW52b2NhdGlvbiBub2RlKSA9PgogICAgICBfZ2V0U3RhdGljVHlwZShub2RlKTsKCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXREaXJlY3RNZXRob2RJbnZvY2F0aW9uKGlyLkRpcmVjdE1ldGhvZEludm9jYXRpb24gbm9kZSkgPT4KICAgICAgX2dldFN0YXRpY1R5cGUobm9kZSk7CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0U3RhdGljSW52b2NhdGlvbihpci5TdGF0aWNJbnZvY2F0aW9uIG5vZGUpID0+CiAgICAgIF9nZXRTdGF0aWNUeXBlKG5vZGUpOwoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbihpci5TdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSkgPT4KICAgICAgX2dldFN0YXRpY1R5cGUobm9kZSk7CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKGlyLkNvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSA9PgogICAgICBfZ2V0U3RhdGljVHlwZShub2RlKTsKCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRJbnN0YW50aWF0aW9uKGlyLkluc3RhbnRpYXRpb24gbm9kZSkgPT4gX2dldFN0YXRpY1R5cGUobm9kZSk7Cn0KSwBOTjwBKDQvMTUgJAFQOU4wDCQBFEYgAQwyKksRBAEzJUwRBAEMTQEMTQEMQxwBDEEcAQxBHAEMTRwBDEEcAQxLHAEMSxwBDFECAS9wYWNrYWdlOmNvbXBpbGVyL3NyYy9pci9jYWNoZWRfc3RhdGljX3R5cGUuZGFydCtzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pci9kZWJ1Zy5kYXJ0iDEvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIEhlbHBlciBmb3IgZGVidWcgS2VybmVsIG5vZGVzLgoKbGlicmFyeSBrZXJuZWwuZGVidWc7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC92aXNpdG9yLmRhcnQnOwoKaW1wb3J0ICcuLi91dGlsL3V0aWwuZGFydCcgc2hvdyBJbmRlbnRhdGlvbiwgVGFnZ2luZzsKCmNsYXNzIERlYnVnUHJpbnRlciBleHRlbmRzIFZpc2l0b3Igd2l0aCBJbmRlbnRhdGlvbiwgVGFnZ2luZzxOb2RlPiB7CiAgQG92ZXJyaWRlCiAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwoKICB2b2lkIHZpc2l0Tm9kZVdpdGhDaGlsZHJlbihOb2RlIG5vZGUsIFN0cmluZyB0eXBlLCBbTWFwIHBhcmFtc10pIHsKICAgIG9wZW5Ob2RlKG5vZGUsIHR5cGUsIHBhcmFtcyk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgICBjbG9zZU5vZGUoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZGVmYXVsdE5vZGUoTm9kZSBub2RlKSB7CiAgICB2aXNpdE5vZGVXaXRoQ2hpbGRyZW4obm9kZSwgJyR7bm9kZS5ydW50aW1lVHlwZX0nKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXROYW1lKE5hbWUgbm9kZSkgewogICAgb3BlbkFuZENsb3NlTm9kZShub2RlLCAnJHtub2RlLnJ1bnRpbWVUeXBlfScsCiAgICAgICAgeyduYW1lJzogbm9kZS5uYW1lLCAnbGlicmFyeSc6IG5vZGUubGlicmFyeT8ubmFtZX0pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludExpdGVyYWwoSW50TGl0ZXJhbCBub2RlKSB7CiAgICBvcGVuQW5kQ2xvc2VOb2RlKG5vZGUsICcke25vZGUucnVudGltZVR5cGV9Jywgeyd2YWx1ZSc6ICcke25vZGUudmFsdWV9J30pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFZhcmlhYmxlR2V0KFZhcmlhYmxlR2V0IG5vZGUpIHsKICAgIG9wZW5BbmRDbG9zZU5vZGUoCiAgICAgICAgbm9kZSwgJyR7bm9kZS5ydW50aW1lVHlwZX0nLCB7J3ZhcmlhYmxlJzogJyR7bm9kZS52YXJpYWJsZX0nfSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RhdGljR2V0KFN0YXRpY0dldCBub2RlKSB7CiAgICBvcGVuQW5kQ2xvc2VOb2RlKG5vZGUsICcke25vZGUucnVudGltZVR5cGV9Jywgeyd0YXJnZXQnOiAnJHtub2RlLnRhcmdldH0nfSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIG9wZW5Ob2RlKG5vZGUsICcke25vZGUucnVudGltZVR5cGV9JywgewogICAgICAnbmFtZSc6ICcke25vZGUubmFtZSA/PyAnLS11bm5hbWVkLS0nfScsCiAgICAgICdpc0ZpbmFsJzogJyR7bm9kZS5pc0ZpbmFsfScsCiAgICAgICdpc0NvbnN0JzogJyR7bm9kZS5pc0NvbnN0fScsCiAgICAgICdpc0ZpZWxkRm9ybWFsJzogJyR7bm9kZS5pc0ZpZWxkRm9ybWFsfScKICAgIH0pOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogICAgY2xvc2VOb2RlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIG5vZGUpIHsKICAgIG9wZW5Ob2RlKG5vZGUsICcke25vZGUucnVudGltZVR5cGV9JywgewogICAgICAnbmFtZSc6ICcke25vZGUuY2xhc3NOb2RlLm5hbWV9JywKICAgIH0pOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogICAgY2xvc2VOb2RlKCk7CiAgfQoKICAvLy8gUHJldHR5LXByaW50cyBnaXZlbiBub2RlIHRyZWUgaW50byBzdHJpbmcuCiAgc3RhdGljIFN0cmluZyBwcmV0dHlQcmludChOb2RlIG5vZGUpIHsKICAgIHZhciBwID0gbmV3IERlYnVnUHJpbnRlcigpOwogICAgbm9kZS5hY2NlcHQocCk7CiAgICByZXR1cm4gcC5zYi50b1N0cmluZygpOwogIH0KfQpQAE5OPAEjARYBIiYBNgFFDCgBRSIeEQQBDCA4BAEMHjI9BAEMKk8EAQwsFkgEAQwoUQQBDDwsLyQkLwgeEQQBDDAsKAgeEQQBMSkgFBwEAgEicGFja2FnZTpjb21waWxlci9zcmMvaXIvZGVidWcuZGFydCtzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pci90eXBlcy5kYXJ0kg0vLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vb3JkZXJlZF90eXBlc2V0LmRhcnQnOwppbXBvcnQgJ2VsZW1lbnRfbWFwLmRhcnQnOwoKLy8vIFN1cHBvcnQgZm9yIHN1YnR5cGUgY2hlY2tzIG9mIGtlcm5lbCBiYXNlZCBbRGFydFR5cGVdcy4KY2xhc3MgS2VybmVsRGFydFR5cGVzIGV4dGVuZHMgRGFydFR5cGVzIHsKICBmaW5hbCBJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwOwogIGZpbmFsIFN1YnR5cGVWaXNpdG9yPERhcnRUeXBlPiBzdWJ0eXBlVmlzaXRvcjsKICBmaW5hbCBQb3RlbnRpYWxTdWJ0eXBlVmlzaXRvcjxEYXJ0VHlwZT4gcG90ZW50aWFsU3VidHlwZVZpc2l0b3I7CgogIEtlcm5lbERhcnRUeXBlcyh0aGlzLmVsZW1lbnRNYXApCiAgICAgIDogdGhpcy5zdWJ0eXBlVmlzaXRvciA9IG5ldyBLZXJuZWxTdWJ0eXBlVmlzaXRvcihlbGVtZW50TWFwKSwKICAgICAgICB0aGlzLnBvdGVudGlhbFN1YnR5cGVWaXNpdG9yID0KICAgICAgICAgICAgbmV3IF9LZXJuZWxQb3RlbnRpYWxTdWJ0eXBlVmlzaXRvcihlbGVtZW50TWFwKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1BvdGVudGlhbFN1YnR5cGUoRGFydFR5cGUgdCwgRGFydFR5cGUgcywKICAgICAge2Jvb2wgYXNzdW1lSW5zdGFudGlhdGlvbnM6IHRydWV9KSB7CiAgICByZXR1cm4gcG90ZW50aWFsU3VidHlwZVZpc2l0b3IuaXNQb3RlbnRpYWxTdWJ0eXBlKHQsIHMsCiAgICAgICAgYXNzdW1lSW5zdGFudGlhdGlvbnM6IGFzc3VtZUluc3RhbnRpYXRpb25zKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNBc3NpZ25hYmxlKERhcnRUeXBlIHQsIERhcnRUeXBlIHMpIHsKICAgIHJldHVybiBpc1N1YnR5cGUodCwgcykgfHwgaXNTdWJ0eXBlKHMsIHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1N1YnR5cGUoRGFydFR5cGUgdCwgRGFydFR5cGUgcykgewogICAgcmV0dXJuIHN1YnR5cGVWaXNpdG9yLmlzU3VidHlwZSh0LCBzKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0VGhpc1R5cGUoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5nZXRUaGlzVHlwZShjbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXRTdXBlcnR5cGUoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5nZXRTdXBlclR5cGUoY2xzKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPEludGVyZmFjZVR5cGU+IGdldFN1cGVydHlwZXMoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5nZXRPcmRlcmVkVHlwZVNldChjbHMpLnN1cGVydHlwZXM7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxJbnRlcmZhY2VUeXBlPiBnZXRJbnRlcmZhY2VzKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuZ2V0SW50ZXJmYWNlcyhjbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBhc0luc3RhbmNlT2YoSW50ZXJmYWNlVHlwZSB0eXBlLCBDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBlbGVtZW50TWFwLmFzSW5zdGFuY2VPZih0eXBlLCBjbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgc3Vic3RCeUNvbnRleHQoRGFydFR5cGUgYmFzZSwgSW50ZXJmYWNlVHlwZSBjb250ZXh0KSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5zdWJzdEJ5Q29udGV4dChiYXNlLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uVHlwZSBnZXRDYWxsVHlwZShJbnRlcmZhY2VUeXBlIHR5cGUpIHsKICAgIERhcnRUeXBlIGNhbGxUeXBlID0gZWxlbWVudE1hcC5nZXRDYWxsVHlwZSh0eXBlKTsKICAgIHJldHVybiBjYWxsVHlwZSBpcyBGdW5jdGlvblR5cGUgPyBjYWxsVHlwZSA6IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNoZWNrVHlwZVZhcmlhYmxlQm91bmRzPFQ+KAogICAgICBUIGNvbnRleHQsCiAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMsCiAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVWYXJpYWJsZXMsCiAgICAgIHZvaWQgY2hlY2tUeXBlVmFyaWFibGVCb3VuZChUIGNvbnRleHQsIERhcnRUeXBlIHR5cGVBcmd1bWVudCwKICAgICAgICAgIFR5cGVWYXJpYWJsZVR5cGUgdHlwZVZhcmlhYmxlLCBEYXJ0VHlwZSBib3VuZCkpIHsKICAgIGFzc2VydCh0eXBlVmFyaWFibGVzLmxlbmd0aCA9PSB0eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgdHlwZUFyZ3VtZW50cy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgRGFydFR5cGUgdHlwZUFyZ3VtZW50ID0gdHlwZUFyZ3VtZW50c1tpbmRleF07CiAgICAgIFR5cGVWYXJpYWJsZVR5cGUgdHlwZVZhcmlhYmxlID0gdHlwZVZhcmlhYmxlc1tpbmRleF07CiAgICAgIERhcnRUeXBlIGJvdW5kID0gZWxlbWVudE1hcAogICAgICAgICAgLmdldFR5cGVWYXJpYWJsZUJvdW5kKHR5cGVWYXJpYWJsZS5lbGVtZW50KQogICAgICAgICAgLnN1YnN0KHR5cGVBcmd1bWVudHMsIHR5cGVWYXJpYWJsZXMpOwogICAgICBjaGVja1R5cGVWYXJpYWJsZUJvdW5kKGNvbnRleHQsIHR5cGVBcmd1bWVudCwgdHlwZVZhcmlhYmxlLCBib3VuZCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBDb21tb25FbGVtZW50cyBnZXQgY29tbW9uRWxlbWVudHMgPT4gZWxlbWVudE1hcC5jb21tb25FbGVtZW50czsKfQoKY2xhc3MgS2VybmVsT3JkZXJlZFR5cGVTZXRCdWlsZGVyIGV4dGVuZHMgT3JkZXJlZFR5cGVTZXRCdWlsZGVyQmFzZSB7CiAgZmluYWwgSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcDsKCiAgS2VybmVsT3JkZXJlZFR5cGVTZXRCdWlsZGVyKHRoaXMuZWxlbWVudE1hcCwgQ2xhc3NFbnRpdHkgY2xzKSA6IHN1cGVyKGNscyk7CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0VGhpc1R5cGUoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5nZXRUaGlzVHlwZShjbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBzdWJzdEJ5Q29udGV4dChJbnRlcmZhY2VUeXBlIHR5cGUsIEludGVyZmFjZVR5cGUgY29udGV4dCkgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuc3Vic3RCeUNvbnRleHQodHlwZSwgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0SGllcmFyY2h5RGVwdGgoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5nZXRIaWVyYXJjaHlEZXB0aChjbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgT3JkZXJlZFR5cGVTZXQgZ2V0T3JkZXJlZFR5cGVTZXQoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5nZXRPcmRlcmVkVHlwZVNldChjbHMpOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUeXBlUmVsYXRpb25NaXhpbgogICAgaW1wbGVtZW50cyBBYnN0cmFjdFR5cGVSZWxhdGlvbjxEYXJ0VHlwZT4gewogIElyVG9FbGVtZW50TWFwIGdldCBlbGVtZW50TWFwOwoKICBAb3ZlcnJpZGUKICBDb21tb25FbGVtZW50cyBnZXQgY29tbW9uRWxlbWVudHMgPT4gZWxlbWVudE1hcC5jb21tb25FbGVtZW50czsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0VHlwZVZhcmlhYmxlQm91bmQoVHlwZVZhcmlhYmxlRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBlbGVtZW50TWFwLmdldFR5cGVWYXJpYWJsZUJvdW5kKGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25UeXBlIGdldENhbGxUeXBlKEludGVyZmFjZVR5cGUgdHlwZSkgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuZ2V0Q2FsbFR5cGUodHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGFzSW5zdGFuY2VPZihJbnRlcmZhY2VUeXBlIHR5cGUsIENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuYXNJbnN0YW5jZU9mKHR5cGUsIGNscyk7CiAgfQp9CgpjbGFzcyBLZXJuZWxTdWJ0eXBlVmlzaXRvciBleHRlbmRzIFN1YnR5cGVWaXNpdG9yPERhcnRUeXBlPgogICAgd2l0aCBBYnN0cmFjdFR5cGVSZWxhdGlvbk1peGluIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwOwoKICBLZXJuZWxTdWJ0eXBlVmlzaXRvcih0aGlzLmVsZW1lbnRNYXApOwp9CgpjbGFzcyBfS2VybmVsUG90ZW50aWFsU3VidHlwZVZpc2l0b3IgZXh0ZW5kcyBQb3RlbnRpYWxTdWJ0eXBlVmlzaXRvcjxEYXJ0VHlwZT4KICAgIHdpdGggQWJzdHJhY3RUeXBlUmVsYXRpb25NaXhpbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcDsKCiAgX0tlcm5lbFBvdGVudGlhbFN1YnR5cGVWaXNpdG9yKHRoaXMuZWxlbWVudE1hcCk7Cn0KgKIATk48ASIkISIbATwqIzFDASNEJzwBDDIrPDUEAQwuLwQBDCsrBAEMLygEAQwwKQQBDDs5BAEMOyoEAQxELwQBDEI1BAEMMTY3BAEMIxEkJEQ8OkE0PCI2MEoGBAEMQgIBRiMBTgEMLygEAQxMNQQBDCsuBAEMNi4EAgEpMCEBDEIBDD41BAEMMSkEAQxELwQCATwlDCMBKQIBTyUMIwEzAgEicGFja2FnZTpjb21waWxlci9zcmMvaXIvdHlwZXMuZGFydC5zZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pci92aXNpdG9ycy5kYXJ0wABudS8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy9jb25zdGFudF9zeXN0ZW0uZGFydCcgYXMgY29uc3RhbnRfc3lzdGVtOwppbXBvcnQgJy4uL2NvbnN0YW50cy9jb25zdHJ1Y3RvcnMuZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL2V4cHJlc3Npb25zLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL29wZXJhdG9ycy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pci9lbGVtZW50X21hcC5kYXJ0JzsKaW1wb3J0ICcuLi9pci91dGlsLmRhcnQnOwoKLy8vIFZpc2l0b3IgdGhhdCBjb252ZXJ0cyBzdHJpbmcgbGl0ZXJhbHMgYW5kIGNvbmNhdGVuYXRpb25zIG9mIHN0cmluZyBsaXRlcmFscwovLy8gaW50byB0aGUgc3RyaW5nIHZhbHVlLgpjbGFzcyBTdHJpbmdpZmllciBleHRlbmRzIGlyLkV4cHJlc3Npb25WaXNpdG9yPFN0cmluZz4gewogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdFN0cmluZ0xpdGVyYWwoaXIuU3RyaW5nTGl0ZXJhbCBub2RlKSA9PiBub2RlLnZhbHVlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKGlyLlN0cmluZ0NvbmNhdGVuYXRpb24gbm9kZSkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgZm9yIChpci5FeHByZXNzaW9uIGV4cHJlc3Npb24gaW4gbm9kZS5leHByZXNzaW9ucykgewogICAgICBTdHJpbmcgdmFsdWUgPSBleHByZXNzaW9uLmFjY2VwdCh0aGlzKTsKICAgICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBudWxsOwogICAgICBzYi53cml0ZSh2YWx1ZSk7CiAgICB9CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCi8vLyBWaXNpdG9yIHRoYXQgY29udmVydHMgYSBrZXJuZWwgY29uc3RhbnQgZXhwcmVzc2lvbiBpbnRvIGEKLy8vIFtDb25zdGFudEV4cHJlc3Npb25dLgpjbGFzcyBDb25zdGFudGlmaWVyIGV4dGVuZHMgaXIuRXhwcmVzc2lvblZpc2l0b3I8Q29uc3RhbnRFeHByZXNzaW9uPiB7CiAgZmluYWwgYm9vbCByZXF1aXJlQ29uc3RhbnQ7CiAgZmluYWwgSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcDsKICBpci5UcmVlTm9kZSBmYWlsTm9kZTsKICBmaW5hbCBNYXA8aXIuVmFyaWFibGVEZWNsYXJhdGlvbiwgQ29uc3RhbnRFeHByZXNzaW9uPiBfaW5pdGlhbGl6ZXJMb2NhbHMgPQogICAgICA8aXIuVmFyaWFibGVEZWNsYXJhdGlvbiwgQ29uc3RhbnRFeHByZXNzaW9uPnt9OwoKICBDb25zdGFudGlmaWVyKHRoaXMuZWxlbWVudE1hcCwge3RoaXMucmVxdWlyZUNvbnN0YW50OiB0cnVlfSk7CgogIENvbW1vbkVsZW1lbnRzIGdldCBfY29tbW9uRWxlbWVudHMgPT4gZWxlbWVudE1hcC5jb21tb25FbGVtZW50czsKCiAgQ29uc3RhbnRFeHByZXNzaW9uIHZpc2l0KGlyLkV4cHJlc3Npb24gbm9kZSkgewogICAgQ29uc3RhbnRFeHByZXNzaW9uIGNvbnN0YW50ID0gbm9kZS5hY2NlcHQodGhpcyk7CiAgICBpZiAoY29uc3RhbnQgPT0gbnVsbCAmJiByZXF1aXJlQ29uc3RhbnQpIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3VwcG9ydCBjb250ZXh0dWFsIGVycm9yIG1lc3NhZ2VzLgogICAgICBlbGVtZW50TWFwLnJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKGZhaWxOb2RlID8/IG5vZGUpLAogICAgICAgICAgTWVzc2FnZUtpbmQuTk9UX0FfQ09NUElMRV9USU1FX0NPTlNUQU5UKTsKICAgICAgcmV0dXJuIG5ldyBFcnJvbmVvdXNDb25zdGFudEV4cHJlc3Npb24oKTsKICAgIH0KICAgIHJldHVybiBjb25zdGFudDsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiBkZWZhdWx0RXhwcmVzc2lvbihpci5FeHByZXNzaW9uIG5vZGUpIHsKICAgIGlmIChyZXF1aXJlQ29uc3RhbnQpIHsKICAgICAgZmFpbE5vZGUgPz89IG5vZGU7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIExpc3Q8Q29uc3RhbnRFeHByZXNzaW9uPiBfY29tcHV0ZUxpc3QoTGlzdDxpci5FeHByZXNzaW9uPiBleHByZXNzaW9ucykgewogICAgTGlzdDxDb25zdGFudEV4cHJlc3Npb24+IGxpc3QgPSA8Q29uc3RhbnRFeHByZXNzaW9uPltdOwogICAgZm9yIChpci5FeHByZXNzaW9uIGV4cHJlc3Npb24gaW4gZXhwcmVzc2lvbnMpIHsKICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIGNvbnN0YW50ID0gdmlzaXQoZXhwcmVzc2lvbik7CiAgICAgIGlmIChjb25zdGFudCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgbGlzdC5hZGQoY29uc3RhbnQpOwogICAgfQogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICBMaXN0PENvbnN0YW50RXhwcmVzc2lvbj4gX2NvbXB1dGVBcmd1bWVudHMoaXIuQXJndW1lbnRzIG5vZGUpIHsKICAgIExpc3Q8Q29uc3RhbnRFeHByZXNzaW9uPiBhcmd1bWVudHMgPSA8Q29uc3RhbnRFeHByZXNzaW9uPltdOwogICAgZm9yIChpci5FeHByZXNzaW9uIGFyZ3VtZW50IGluIG5vZGUucG9zaXRpb25hbCkgewogICAgICBDb25zdGFudEV4cHJlc3Npb24gY29uc3RhbnQgPSB2aXNpdChhcmd1bWVudCk7CiAgICAgIGlmIChjb25zdGFudCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgYXJndW1lbnRzLmFkZChjb25zdGFudCk7CiAgICB9CiAgICBmb3IgKGlyLk5hbWVkRXhwcmVzc2lvbiBhcmd1bWVudCBpbiBub2RlLm5hbWVkKSB7CiAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBjb25zdGFudCA9IHZpc2l0KGFyZ3VtZW50LnZhbHVlKTsKICAgICAgaWYgKGNvbnN0YW50ID09IG51bGwpIHJldHVybiBudWxsOwogICAgICBhcmd1bWVudHMuYWRkKGNvbnN0YW50KTsKICAgIH0KICAgIHJldHVybiBhcmd1bWVudHM7CiAgfQoKICBDb25zdHJ1Y3RlZENvbnN0YW50RXhwcmVzc2lvbiBfY29tcHV0ZUNvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgaXIuQ29uc3RydWN0b3IgdGFyZ2V0LAogICAgICBpci5Bcmd1bWVudHMgYXJndW1lbnRzLAogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhpcyB3aGVuIGNvcnJlY3QgdHlwZSBhcmd1bWVudHMgYXJlIHBhc3NlZAogICAgICAvLyB0aHJvdWdoIFthcmd1bWVudHNdLiBDdXJyZW50IFtpci5SZWRpcmVjdGluZ0luaXRpYWxpemVyXSBkb2Vzbid0IGhhdmUKICAgICAgLy8gYW55IHR5cGUgYXJndW1lbnRzLgogICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlcykgewogICAgTGlzdDxDb25zdGFudEV4cHJlc3Npb24+IGV4cHJlc3Npb25zID0gX2NvbXB1dGVBcmd1bWVudHMoYXJndW1lbnRzKTsKICAgIGlmIChleHByZXNzaW9ucyA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBuZXcgQ29uc3RydWN0ZWRDb25zdGFudEV4cHJlc3Npb24oCiAgICAgICAgZWxlbWVudE1hcC5jcmVhdGVJbnRlcmZhY2VUeXBlKHRhcmdldC5lbmNsb3NpbmdDbGFzcywgdHlwZXMpLAogICAgICAgIGVsZW1lbnRNYXAuZ2V0Q29uc3RydWN0b3IodGFyZ2V0KSwKICAgICAgICBlbGVtZW50TWFwLmdldENhbGxTdHJ1Y3R1cmUoYXJndW1lbnRzKSwKICAgICAgICBleHByZXNzaW9ucyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gdmlzaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oaXIuQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGlmICghbm9kZS5pc0NvbnN0KSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBfY29tcHV0ZUNvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgICBub2RlLnRhcmdldCwgbm9kZS5hcmd1bWVudHMsIG5vZGUuYXJndW1lbnRzLnR5cGVzKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiB2aXNpdFZhcmlhYmxlR2V0KGlyLlZhcmlhYmxlR2V0IG5vZGUpIHsKICAgIENvbnN0YW50RXhwcmVzc2lvbiBjb25zdGFudCA9IF9pbml0aWFsaXplckxvY2Fsc1tub2RlLnZhcmlhYmxlXTsKICAgIGlmIChjb25zdGFudCAhPSBudWxsKSB7CiAgICAgIHJldHVybiBjb25zdGFudDsKICAgIH0KICAgIGlmIChub2RlLnZhcmlhYmxlLnBhcmVudCBpcyBpci5GdW5jdGlvbk5vZGUpIHsKICAgICAgaXIuRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uID0gbm9kZS52YXJpYWJsZS5wYXJlbnQ7CiAgICAgIGludCBpbmRleCA9IGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmluZGV4T2Yobm9kZS52YXJpYWJsZSk7CiAgICAgIGlmIChpbmRleCAhPSAtMSkgewogICAgICAgIHJldHVybiBuZXcgUG9zaXRpb25hbEFyZ3VtZW50UmVmZXJlbmNlKGluZGV4KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQoZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLmNvbnRhaW5zKG5vZGUudmFyaWFibGUpKTsKICAgICAgICByZXR1cm4gbmV3IE5hbWVkQXJndW1lbnRSZWZlcmVuY2Uobm9kZS52YXJpYWJsZS5uYW1lKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChub2RlLnZhcmlhYmxlLmlzQ29uc3QpIHsKICAgICAgcmV0dXJuIHZpc2l0KG5vZGUudmFyaWFibGUuaW5pdGlhbGl6ZXIpOwogICAgfQogICAgcmV0dXJuIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIHZpc2l0U3RhdGljR2V0KGlyLlN0YXRpY0dldCBub2RlKSB7CiAgICBpci5NZW1iZXIgdGFyZ2V0ID0gbm9kZS50YXJnZXQ7CiAgICBpZiAodGFyZ2V0IGlzIGlyLkZpZWxkICYmIHRhcmdldC5pc0NvbnN0KSB7CiAgICAgIHJldHVybiBuZXcgRmllbGRDb25zdGFudEV4cHJlc3Npb24oZWxlbWVudE1hcC5nZXRGaWVsZChub2RlLnRhcmdldCkpOwogICAgfSBlbHNlIGlmICh0YXJnZXQgaXMgaXIuUHJvY2VkdXJlICYmCiAgICAgICAgdGFyZ2V0LmtpbmQgPT0gaXIuUHJvY2VkdXJlS2luZC5NZXRob2QpIHsKICAgICAgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24gPSBlbGVtZW50TWFwLmdldE1ldGhvZChub2RlLnRhcmdldCk7CiAgICAgIERhcnRUeXBlIHR5cGUgPSBlbGVtZW50TWFwLmdldEZ1bmN0aW9uVHlwZShub2RlLnRhcmdldC5mdW5jdGlvbik7CiAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25Db25zdGFudEV4cHJlc3Npb24oZnVuY3Rpb24sIHR5cGUpOwogICAgfQogICAgcmV0dXJuIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIHZpc2l0TnVsbExpdGVyYWwoaXIuTnVsbExpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIG5ldyBOdWxsQ29uc3RhbnRFeHByZXNzaW9uKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gdmlzaXRCb29sTGl0ZXJhbChpci5Cb29sTGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gbmV3IEJvb2xDb25zdGFudEV4cHJlc3Npb24obm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gdmlzaXRJbnRMaXRlcmFsKGlyLkludExpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIG5ldyBJbnRDb25zdGFudEV4cHJlc3Npb24oCiAgICAgICAgbmV3IEJpZ0ludC5mcm9tKG5vZGUudmFsdWUpLnRvVW5zaWduZWQoNjQpKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiB2aXNpdERvdWJsZUxpdGVyYWwoaXIuRG91YmxlTGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gbmV3IERvdWJsZUNvbnN0YW50RXhwcmVzc2lvbihub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiB2aXNpdFN0cmluZ0xpdGVyYWwoaXIuU3RyaW5nTGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gbmV3IFN0cmluZ0NvbnN0YW50RXhwcmVzc2lvbihub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiB2aXNpdFN5bWJvbExpdGVyYWwoaXIuU3ltYm9sTGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gbmV3IFN5bWJvbENvbnN0YW50RXhwcmVzc2lvbihub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oaXIuU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICBMaXN0PENvbnN0YW50RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMgPSBfY29tcHV0ZUxpc3Qobm9kZS5leHByZXNzaW9ucyk7CiAgICBpZiAoZXhwcmVzc2lvbnMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gbmV3IENvbmNhdGVuYXRlQ29uc3RhbnRFeHByZXNzaW9uKGV4cHJlc3Npb25zKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiB2aXNpdE1hcExpdGVyYWwoaXIuTWFwTGl0ZXJhbCBub2RlKSB7CiAgICBpZiAoIW5vZGUuaXNDb25zdCkgewogICAgICByZXR1cm4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgICB9CiAgICBEYXJ0VHlwZSBrZXlUeXBlID0gZWxlbWVudE1hcC5nZXREYXJ0VHlwZShub2RlLmtleVR5cGUpOwogICAgRGFydFR5cGUgdmFsdWVUeXBlID0gZWxlbWVudE1hcC5nZXREYXJ0VHlwZShub2RlLnZhbHVlVHlwZSk7CiAgICBMaXN0PENvbnN0YW50RXhwcmVzc2lvbj4ga2V5cyA9IDxDb25zdGFudEV4cHJlc3Npb24+W107CiAgICBMaXN0PENvbnN0YW50RXhwcmVzc2lvbj4gdmFsdWVzID0gPENvbnN0YW50RXhwcmVzc2lvbj5bXTsKICAgIGZvciAoaXIuTWFwRW50cnkgZW50cnkgaW4gbm9kZS5lbnRyaWVzKSB7CiAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBrZXkgPSB2aXNpdChlbnRyeS5rZXkpOwogICAgICBpZiAoa2V5ID09IG51bGwpIHJldHVybiBudWxsOwogICAgICBrZXlzLmFkZChrZXkpOwogICAgICBDb25zdGFudEV4cHJlc3Npb24gdmFsdWUgPSB2aXNpdChlbnRyeS52YWx1ZSk7CiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgdmFsdWVzLmFkZCh2YWx1ZSk7CiAgICB9CiAgICByZXR1cm4gbmV3IE1hcENvbnN0YW50RXhwcmVzc2lvbigKICAgICAgICBfY29tbW9uRWxlbWVudHMubWFwVHlwZShrZXlUeXBlLCB2YWx1ZVR5cGUpLCBrZXlzLCB2YWx1ZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIHZpc2l0U2V0TGl0ZXJhbChpci5TZXRMaXRlcmFsIG5vZGUpIHsKICAgIGlmICghbm9kZS5pc0NvbnN0KSB7CiAgICAgIHJldHVybiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICAgIH0KICAgIERhcnRUeXBlIGVsZW1lbnRUeXBlID0gZWxlbWVudE1hcC5nZXREYXJ0VHlwZShub2RlLnR5cGVBcmd1bWVudCk7CiAgICBMaXN0PENvbnN0YW50RXhwcmVzc2lvbj4gdmFsdWVzID0gPENvbnN0YW50RXhwcmVzc2lvbj5bXTsKICAgIGZvciAoaXIuRXhwcmVzc2lvbiBleHByZXNzaW9uIGluIG5vZGUuZXhwcmVzc2lvbnMpIHsKICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIHZhbHVlID0gdmlzaXQoZXhwcmVzc2lvbik7CiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgdmFsdWVzLmFkZCh2YWx1ZSk7CiAgICB9CiAgICByZXR1cm4gbmV3IFNldENvbnN0YW50RXhwcmVzc2lvbigKICAgICAgICBfY29tbW9uRWxlbWVudHMuc2V0VHlwZShlbGVtZW50VHlwZSksIHZhbHVlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gdmlzaXRMaXN0TGl0ZXJhbChpci5MaXN0TGl0ZXJhbCBub2RlKSB7CiAgICBpZiAoIW5vZGUuaXNDb25zdCkgewogICAgICByZXR1cm4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgICB9CiAgICBEYXJ0VHlwZSBlbGVtZW50VHlwZSA9IGVsZW1lbnRNYXAuZ2V0RGFydFR5cGUobm9kZS50eXBlQXJndW1lbnQpOwogICAgTGlzdDxDb25zdGFudEV4cHJlc3Npb24+IHZhbHVlcyA9IDxDb25zdGFudEV4cHJlc3Npb24+W107CiAgICBmb3IgKGlyLkV4cHJlc3Npb24gZXhwcmVzc2lvbiBpbiBub2RlLmV4cHJlc3Npb25zKSB7CiAgICAgIENvbnN0YW50RXhwcmVzc2lvbiB2YWx1ZSA9IHZpc2l0KGV4cHJlc3Npb24pOwogICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIHZhbHVlcy5hZGQodmFsdWUpOwogICAgfQogICAgcmV0dXJuIG5ldyBMaXN0Q29uc3RhbnRFeHByZXNzaW9uKAogICAgICAgIF9jb21tb25FbGVtZW50cy5saXN0VHlwZShlbGVtZW50VHlwZSksIHZhbHVlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gdmlzaXRUeXBlTGl0ZXJhbChpci5UeXBlTGl0ZXJhbCBub2RlKSB7CiAgICBTdHJpbmcgbmFtZTsKICAgIERhcnRUeXBlIHR5cGUgPSBlbGVtZW50TWFwLmdldERhcnRUeXBlKG5vZGUudHlwZSk7CiAgICBpZiAodHlwZS5pc0R5bmFtaWMpIHsKICAgICAgbmFtZSA9ICdkeW5hbWljJzsKICAgIH0gZWxzZSBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIG5hbWUgPSB0eXBlLmVsZW1lbnQubmFtZTsKICAgIH0gZWxzZSBpZiAodHlwZS5pc1R5cGVkZWYpIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ29tcHV0ZSBhIG5hbWUgZm9yIHRoZSB0eXBlIGxpdGVyYWw/IEl0IGlzIG9ubHkKICAgICAgLy8gdXNlZCBpbiBlcnJvciBtZXNzYWdlcyBpbiB0aGUgb2xkIFNTQSBidWlsZGVyLgogICAgICBuYW1lID0gJz8nOwogICAgfSBlbHNlIGlmIChub2RlLnR5cGUgaXMgaXIuRnVuY3Rpb25UeXBlKSB7CiAgICAgIGlyLkZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUgPSBub2RlLnR5cGU7CiAgICAgIGFzc2VydChmdW5jdGlvblR5cGUudHlwZWRlZiAhPSBudWxsKTsKICAgICAgdHlwZSA9IGVsZW1lbnRNYXAuZ2V0VHlwZWRlZlR5cGUoZnVuY3Rpb25UeXBlLnR5cGVkZWYpOwogICAgICBuYW1lID0gZnVuY3Rpb25UeXBlLnR5cGVkZWYubmFtZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICAgIH0KICAgIHJldHVybiBuZXcgVHlwZUNvbnN0YW50RXhwcmVzc2lvbih0eXBlLCBuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiB2aXNpdEFzRXhwcmVzc2lvbihpci5Bc0V4cHJlc3Npb24gbm9kZSkgewogICAgQ29uc3RhbnRFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB2aXNpdChub2RlLm9wZXJhbmQpOwogICAgaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBEYXJ0VHlwZSB0eXBlID0gZWxlbWVudE1hcC5nZXREYXJ0VHlwZShub2RlLnR5cGUpOwogICAgcmV0dXJuIG5ldyBBc0NvbnN0YW50RXhwcmVzc2lvbihleHByZXNzaW9uLCB0eXBlKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiB2aXNpdEluc3RhbnRpYXRpb24oaXIuSW5zdGFudGlhdGlvbiBub2RlKSB7CiAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0KICAgICAgICBub2RlLnR5cGVBcmd1bWVudHMubWFwKGVsZW1lbnRNYXAuZ2V0RGFydFR5cGUpLnRvTGlzdCgpOwogICAgZm9yIChEYXJ0VHlwZSB0eXBlQXJndW1lbnQgaW4gdHlwZUFyZ3VtZW50cykgewogICAgICBpZiAodHlwZUFyZ3VtZW50LmNvbnRhaW5zVHlwZVZhcmlhYmxlcykgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICBDb25zdGFudEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHZpc2l0KG5vZGUuZXhwcmVzc2lvbik7CiAgICBpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBuZXcgSW5zdGFudGlhdGlvbkNvbnN0YW50RXhwcmVzc2lvbih0eXBlQXJndW1lbnRzLCBleHByZXNzaW9uKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiB2aXNpdE5vdChpci5Ob3Qgbm9kZSkgewogICAgQ29uc3RhbnRFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB2aXNpdChub2RlLm9wZXJhbmQpOwogICAgaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gbmV3IFVuYXJ5Q29uc3RhbnRFeHByZXNzaW9uKFVuYXJ5T3BlcmF0b3IuTk9ULCBleHByZXNzaW9uKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiB2aXNpdENvbmRpdGlvbmFsRXhwcmVzc2lvbihpci5Db25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgewogICAgQ29uc3RhbnRFeHByZXNzaW9uIGNvbmRpdGlvbiA9IHZpc2l0KG5vZGUuY29uZGl0aW9uKTsKICAgIGlmIChjb25kaXRpb24gPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBDb25zdGFudEV4cHJlc3Npb24gdHJ1ZUV4cCA9IHZpc2l0KG5vZGUudGhlbik7CiAgICBpZiAodHJ1ZUV4cCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIENvbnN0YW50RXhwcmVzc2lvbiBmYWxzZUV4cCA9IHZpc2l0KG5vZGUub3RoZXJ3aXNlKTsKICAgIGlmIChmYWxzZUV4cCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBuZXcgQ29uZGl0aW9uYWxDb25zdGFudEV4cHJlc3Npb24oY29uZGl0aW9uLCB0cnVlRXhwLCBmYWxzZUV4cCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gdmlzaXRQcm9wZXJ0eUdldChpci5Qcm9wZXJ0eUdldCBub2RlKSB7CiAgICBpZiAobm9kZS5uYW1lLm5hbWUgIT0gJ2xlbmd0aCcpIHsKICAgICAgZmFpbE5vZGUgPz89IG5vZGU7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgQ29uc3RhbnRFeHByZXNzaW9uIHJlY2VpdmVyID0gdmlzaXQobm9kZS5yZWNlaXZlcik7CiAgICBpZiAocmVjZWl2ZXIgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gbmV3IFN0cmluZ0xlbmd0aENvbnN0YW50RXhwcmVzc2lvbihyZWNlaXZlcik7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gdmlzaXRNZXRob2RJbnZvY2F0aW9uKGlyLk1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgLy8gTWV0aG9kIGludm9jYXRpb25zIGFyZSBnZW5lcmFsbHkgbm90IGNvbnN0YW50IGV4cHJlc3Npb25zIGJ1dCB1bmFyeQogICAgLy8gYW5kIGJpbmFyeSBleHByZXNzaW9ucyBhcmUgZW5jb2RlZCBhcyBtZXRob2QgaW52b2NhdGlvbnMgaW4ga2VybmVsLgogICAgaWYgKG5vZGUuYXJndW1lbnRzLm5hbWVkLmlzTm90RW1wdHkpIHsKICAgICAgcmV0dXJuIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogICAgfQogICAgaWYgKG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoID09IDApIHsKICAgICAgVW5hcnlPcGVyYXRvciBvcGVyYXRvcjsKICAgICAgaWYgKG5vZGUubmFtZS5uYW1lID09IFVuYXJ5T3BlcmF0b3IuTkVHQVRFLnNlbGVjdG9yTmFtZSkgewogICAgICAgIG9wZXJhdG9yID0gVW5hcnlPcGVyYXRvci5ORUdBVEU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3BlcmF0b3IgPSBVbmFyeU9wZXJhdG9yLnBhcnNlKG5vZGUubmFtZS5uYW1lKTsKICAgICAgfQogICAgICBpZiAob3BlcmF0b3IgIT0gbnVsbCkgewogICAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBleHByZXNzaW9uID0gdmlzaXQobm9kZS5yZWNlaXZlcik7CiAgICAgICAgaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgICAgcmV0dXJuIG5ldyBVbmFyeUNvbnN0YW50RXhwcmVzc2lvbihvcGVyYXRvciwgZXhwcmVzc2lvbik7CiAgICAgIH0KICAgIH0KICAgIGlmIChub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA9PSAxKSB7CiAgICAgIEJpbmFyeU9wZXJhdG9yIG9wZXJhdG9yID0gQmluYXJ5T3BlcmF0b3IucGFyc2Uobm9kZS5uYW1lLm5hbWUpOwogICAgICBpZiAob3BlcmF0b3IgIT0gbnVsbCkgewogICAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBsZWZ0ID0gdmlzaXQobm9kZS5yZWNlaXZlcik7CiAgICAgICAgaWYgKGxlZnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIHJpZ2h0ID0gdmlzaXQobm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5zaW5nbGUpOwogICAgICAgIGlmIChyaWdodCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgICByZXR1cm4gbmV3IEJpbmFyeUNvbnN0YW50RXhwcmVzc2lvbihsZWZ0LCBvcGVyYXRvciwgcmlnaHQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gdmlzaXRTdGF0aWNJbnZvY2F0aW9uKGlyLlN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IGVsZW1lbnRNYXAuZ2V0TWVtYmVyKG5vZGUudGFyZ2V0KTsKICAgIGlmIChtZW1iZXIgPT0gX2NvbW1vbkVsZW1lbnRzLmlkZW50aWNhbEZ1bmN0aW9uKSB7CiAgICAgIGlmIChub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA9PSAyICYmCiAgICAgICAgICBub2RlLmFyZ3VtZW50cy5uYW1lZC5pc0VtcHR5KSB7CiAgICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIGxlZnQgPSB2aXNpdChub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsWzBdKTsKICAgICAgICBpZiAobGVmdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgICBDb25zdGFudEV4cHJlc3Npb24gcmlnaHQgPSB2aXNpdChub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsWzFdKTsKICAgICAgICBpZiAocmlnaHQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgICAgcmV0dXJuIG5ldyBJZGVudGljYWxDb25zdGFudEV4cHJlc3Npb24obGVmdCwgcmlnaHQpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKG1lbWJlci5uYW1lID09ICdmcm9tRW52aXJvbm1lbnQnICYmCiAgICAgICAgbm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGggPT0gMSkgewogICAgICBDb25zdGFudEV4cHJlc3Npb24gbmFtZSA9IHZpc2l0KG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwuc2luZ2xlKTsKICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBkZWZhdWx0VmFsdWU7CiAgICAgIGlmIChub2RlLmFyZ3VtZW50cy5uYW1lZC5sZW5ndGggPT0gMSkgewogICAgICAgIGlmIChub2RlLmFyZ3VtZW50cy5uYW1lZC5zaW5nbGUubmFtZSAhPSAnZGVmYXVsdFZhbHVlJykgewogICAgICAgICAgcmV0dXJuIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogICAgICAgIH0KICAgICAgICBkZWZhdWx0VmFsdWUgPSB2aXNpdChub2RlLmFyZ3VtZW50cy5uYW1lZC5zaW5nbGUudmFsdWUpOwogICAgICAgIGlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgaWYgKG1lbWJlci5lbmNsb3NpbmdDbGFzcyA9PSBfY29tbW9uRWxlbWVudHMuYm9vbENsYXNzKSB7CiAgICAgICAgcmV0dXJuIG5ldyBCb29sRnJvbUVudmlyb25tZW50Q29uc3RhbnRFeHByZXNzaW9uKG5hbWUsIGRlZmF1bHRWYWx1ZSk7CiAgICAgIH0gZWxzZSBpZiAobWVtYmVyLmVuY2xvc2luZ0NsYXNzID09IF9jb21tb25FbGVtZW50cy5pbnRDbGFzcykgewogICAgICAgIHJldHVybiBuZXcgSW50RnJvbUVudmlyb25tZW50Q29uc3RhbnRFeHByZXNzaW9uKG5hbWUsIGRlZmF1bHRWYWx1ZSk7CiAgICAgIH0gZWxzZSBpZiAobWVtYmVyLmVuY2xvc2luZ0NsYXNzID09IF9jb21tb25FbGVtZW50cy5zdHJpbmdDbGFzcykgewogICAgICAgIHJldHVybiBuZXcgU3RyaW5nRnJvbUVudmlyb25tZW50Q29uc3RhbnRFeHByZXNzaW9uKG5hbWUsIGRlZmF1bHRWYWx1ZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiB2aXNpdExvZ2ljYWxFeHByZXNzaW9uKGlyLkxvZ2ljYWxFeHByZXNzaW9uIG5vZGUpIHsKICAgIEJpbmFyeU9wZXJhdG9yIG9wZXJhdG9yID0gQmluYXJ5T3BlcmF0b3IucGFyc2Uobm9kZS5vcGVyYXRvcik7CiAgICBpZiAob3BlcmF0b3IgIT0gbnVsbCAmJgogICAgICAgIEJpbmFyeUNvbnN0YW50RXhwcmVzc2lvbi5wb3RlbnRpYWxPcGVyYXRvcihvcGVyYXRvcikpIHsKICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIGxlZnQgPSB2aXNpdChub2RlLmxlZnQpOwogICAgICBpZiAobGVmdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIHJpZ2h0ID0gdmlzaXQobm9kZS5yaWdodCk7CiAgICAgIGlmIChyaWdodCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuIG5ldyBCaW5hcnlDb25zdGFudEV4cHJlc3Npb24obGVmdCwgb3BlcmF0b3IsIHJpZ2h0KTsKICAgIH0KICAgIHJldHVybiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiB2aXNpdExldChpci5MZXQgbm9kZSkgewogICAgaXIuRXhwcmVzc2lvbiBib2R5ID0gbm9kZS5ib2R5OwogICAgaWYgKGJvZHkgaXMgaXIuQ29uZGl0aW9uYWxFeHByZXNzaW9uKSB7CiAgICAgIGlyLkV4cHJlc3Npb24gY29uZGl0aW9uID0gYm9keS5jb25kaXRpb247CiAgICAgIGlmIChjb25kaXRpb24gaXMgaXIuTWV0aG9kSW52b2NhdGlvbikgewogICAgICAgIGlyLkV4cHJlc3Npb24gcmVjZWl2ZXIgPSBjb25kaXRpb24ucmVjZWl2ZXI7CiAgICAgICAgaXIuRXhwcmVzc2lvbiBvdGhlcndpc2UgPSBib2R5Lm90aGVyd2lzZTsKICAgICAgICBpZiAoY29uZGl0aW9uLm5hbWUubmFtZSA9PSBCaW5hcnlPcGVyYXRvci5FUS5uYW1lICYmCiAgICAgICAgICAgIHJlY2VpdmVyIGlzIGlyLlZhcmlhYmxlR2V0ICYmCiAgICAgICAgICAgIGNvbmRpdGlvbi5hcmd1bWVudHMucG9zaXRpb25hbC5zaW5nbGUgaXMgaXIuTnVsbExpdGVyYWwgJiYKICAgICAgICAgICAgb3RoZXJ3aXNlIGlzIGlyLlZhcmlhYmxlR2V0KSB7CiAgICAgICAgICBpZiAocmVjZWl2ZXIudmFyaWFibGUgPT0gbm9kZS52YXJpYWJsZSAmJgogICAgICAgICAgICAgIG90aGVyd2lzZS52YXJpYWJsZSA9PSBub2RlLnZhcmlhYmxlKSB7CiAgICAgICAgICAgIC8vIFdlIGhhdmUgPGxlZnQ+ID8/IDxyaWdodD4gZW5jb2RlZCBhczoKICAgICAgICAgICAgLy8gICAgbGV0ICMxID0gPGxlZnQ+IGluICMxID09IG51bGwgPyA8cmlnaHQ+IDogIzEKICAgICAgICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIGxlZnQgPSB2aXNpdChub2RlLnZhcmlhYmxlLmluaXRpYWxpemVyKTsKICAgICAgICAgICAgaWYgKGxlZnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIENvbnN0YW50RXhwcmVzc2lvbiByaWdodCA9IHZpc2l0KGJvZHkudGhlbik7CiAgICAgICAgICAgIGlmIChyaWdodCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIFtJRl9OVUxMXSBiaW5hcnkgY29uc3RhbnQgZXhwcmVzc2lvbgogICAgICAgICAgICAvLyB3aGVuIHRoZSByZXNvbHZlciBpcyByZW1vdmVkOyB0aGVuIHdlIG5vIGxvbmdlciBuZWVkIHRoZQogICAgICAgICAgICAvLyBleHByZXNzaW9ucyB0byBiZSBzdHJ1Y3R1cmFsbHkgZXF1aXZhbGVuY2UgZm9yIGVxdWl2YWxlbmNlCiAgICAgICAgICAgIC8vIHRlc3RpbmcuCiAgICAgICAgICAgIHJldHVybiBuZXcgQmluYXJ5Q29uc3RhbnRFeHByZXNzaW9uKAogICAgICAgICAgICAgICAgbGVmdCwgQmluYXJ5T3BlcmF0b3IuSUZfTlVMTCwgcmlnaHQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIHZpc2l0QmxvY2tFeHByZXNzaW9uKGlyLkJsb2NrRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgfQoKICAvLy8gQ29tcHV0ZSB0aGUgW0NvbnN0YW50Q29uc3RydWN0b3JdIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbnN0IGNvbnN0cnVjdG9yCiAgLy8vIFtub2RlXS4KICBDb25zdGFudENvbnN0cnVjdG9yIGNvbXB1dGVDb25zdGFudENvbnN0cnVjdG9yKGlyLkNvbnN0cnVjdG9yIG5vZGUpIHsKICAgIGFzc2VydChub2RlLmlzQ29uc3QpOwogICAgaXIuQ2xhc3MgY2xzID0gbm9kZS5lbmNsb3NpbmdDbGFzczsKICAgIEludGVyZmFjZVR5cGUgdHlwZSA9IGVsZW1lbnRNYXAuZ2V0VGhpc1R5cGUoZWxlbWVudE1hcC5nZXRDbGFzcyhjbHMpKTsKCiAgICBNYXA8ZHluYW1pYywgQ29uc3RhbnRFeHByZXNzaW9uPiBkZWZhdWx0VmFsdWVzID0KICAgICAgICA8ZHluYW1pYywgQ29uc3RhbnRFeHByZXNzaW9uPnt9OwogICAgaW50IHBhcmFtZXRlckluZGV4ID0gMDsKICAgIGZvciAoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIKICAgICAgICBpbiBub2RlLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgIGlmIChwYXJhbWV0ZXJJbmRleCA+PSBub2RlLmZ1bmN0aW9uLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpIHsKICAgICAgICBDb25zdGFudEV4cHJlc3Npb24gZGVmYXVsdFZhbHVlOwogICAgICAgIGlmIChwYXJhbWV0ZXIuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgZGVmYXVsdFZhbHVlID0gdmlzaXQocGFyYW1ldGVyLmluaXRpYWxpemVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZGVmYXVsdFZhbHVlID0gbmV3IE51bGxDb25zdGFudEV4cHJlc3Npb24oKTsKICAgICAgICB9CiAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgICBkZWZhdWx0VmFsdWVzW3BhcmFtZXRlckluZGV4XSA9IGRlZmF1bHRWYWx1ZTsKICAgICAgfQogICAgICBwYXJhbWV0ZXJJbmRleCsrOwogICAgfQogICAgZm9yIChpci5WYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciBpbiBub2RlLmZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycykgewogICAgICBDb25zdGFudEV4cHJlc3Npb24gZGVmYXVsdFZhbHVlID0gdmlzaXQocGFyYW1ldGVyLmluaXRpYWxpemVyKTsKICAgICAgaWYgKGRlZmF1bHRWYWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgZGVmYXVsdFZhbHVlc1twYXJhbWV0ZXIubmFtZV0gPSBkZWZhdWx0VmFsdWU7CiAgICB9CgogICAgYm9vbCBpc1JlZGlyZWN0aW5nID0gbm9kZS5pbml0aWFsaXplcnMubGVuZ3RoID09IDEgJiYKICAgICAgICBub2RlLmluaXRpYWxpemVycy5zaW5nbGUgaXMgaXIuUmVkaXJlY3RpbmdJbml0aWFsaXplcjsKCiAgICBNYXA8RmllbGRFbnRpdHksIENvbnN0YW50RXhwcmVzc2lvbj4gZmllbGRNYXAgPQogICAgICAgIDxGaWVsZEVudGl0eSwgQ29uc3RhbnRFeHByZXNzaW9uPnt9OwoKICAgIHZvaWQgcmVnaXN0ZXJGaWVsZChpci5GaWVsZCBmaWVsZCwgQ29uc3RhbnRFeHByZXNzaW9uIGNvbnN0YW50KSB7CiAgICAgIGZpZWxkTWFwW2VsZW1lbnRNYXAuZ2V0RmllbGQoZmllbGQpXSA9IGNvbnN0YW50OwogICAgfQoKICAgIGlmICghaXNSZWRpcmVjdGluZykgewogICAgICBmb3IgKGlyLkZpZWxkIGZpZWxkIGluIGNscy5maWVsZHMpIHsKICAgICAgICBpZiAoZmllbGQuaXNTdGF0aWMpIGNvbnRpbnVlOwogICAgICAgIGlmIChmaWVsZC5pbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgICAgICByZWdpc3RlckZpZWxkKGZpZWxkLCB2aXNpdChmaWVsZC5pbml0aWFsaXplcikpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIENvbnN0cnVjdGVkQ29uc3RhbnRFeHByZXNzaW9uIHN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uOwogICAgTGlzdDxBc3NlcnRDb25zdGFudEV4cHJlc3Npb24+IGFzc2VydGlvbnMgPSA8QXNzZXJ0Q29uc3RhbnRFeHByZXNzaW9uPltdOwogICAgZm9yIChpci5Jbml0aWFsaXplciBpbml0aWFsaXplciBpbiBub2RlLmluaXRpYWxpemVycykgewogICAgICBpZiAoaW5pdGlhbGl6ZXIgaXMgaXIuRmllbGRJbml0aWFsaXplcikgewogICAgICAgIHJlZ2lzdGVyRmllbGQoaW5pdGlhbGl6ZXIuZmllbGQsIHZpc2l0KGluaXRpYWxpemVyLnZhbHVlKSk7CiAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbGl6ZXIgaXMgaXIuU3VwZXJJbml0aWFsaXplcikgewogICAgICAgIHN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uID0gX2NvbXB1dGVDb25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICAgICAgICAgIGluaXRpYWxpemVyLnRhcmdldCwKICAgICAgICAgICAgaW5pdGlhbGl6ZXIuYXJndW1lbnRzLAogICAgICAgICAgICBpbml0aWFsaXplci5hcmd1bWVudHMudHlwZXMpOwogICAgICB9IGVsc2UgaWYgKGluaXRpYWxpemVyIGlzIGlyLlJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIpIHsKICAgICAgICBzdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbiA9IF9jb21wdXRlQ29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgICAgICAgICBpbml0aWFsaXplci50YXJnZXQsCiAgICAgICAgICAgIGluaXRpYWxpemVyLmFyZ3VtZW50cywKICAgICAgICAgICAgbm9kZS5lbmNsb3NpbmdDbGFzcy50aGlzVHlwZS50eXBlQXJndW1lbnRzKTsKICAgICAgfSBlbHNlIGlmIChpbml0aWFsaXplciBpcyBpci5Bc3NlcnRJbml0aWFsaXplcikgewogICAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBjb25kaXRpb24gPSB2aXNpdChpbml0aWFsaXplci5zdGF0ZW1lbnQuY29uZGl0aW9uKTsKICAgICAgICBDb25zdGFudEV4cHJlc3Npb24gbWVzc2FnZSA9IGluaXRpYWxpemVyLnN0YXRlbWVudC5tZXNzYWdlICE9IG51bGwKICAgICAgICAgICAgPyB2aXNpdChpbml0aWFsaXplci5zdGF0ZW1lbnQubWVzc2FnZSkKICAgICAgICAgICAgOiBudWxsOwogICAgICAgIGFzc2VydGlvbnMuYWRkKG5ldyBBc3NlcnRDb25zdGFudEV4cHJlc3Npb24oY29uZGl0aW9uLCBtZXNzYWdlKSk7CiAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbGl6ZXIgaXMgaXIuSW52YWxpZEluaXRpYWxpemVyKSB7CiAgICAgICAgU3RyaW5nIGNvbnN0cnVjdG9yTmFtZSA9ICcke2Nscy5uYW1lfS4ke25vZGUubmFtZX0nOwogICAgICAgIGVsZW1lbnRNYXAucmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgICAgICBjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZShpbml0aWFsaXplciksCiAgICAgICAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQ09OU1RSVUNUT1IsCiAgICAgICAgICAgIHsnY29uc3RydWN0b3JOYW1lJzogY29uc3RydWN0b3JOYW1lfSk7CiAgICAgICAgcmV0dXJuIG5ldyBFcnJvbmVvdXNDb25zdGFudENvbnN0cnVjdG9yKCk7CiAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbGl6ZXIgaXMgaXIuTG9jYWxJbml0aWFsaXplcikgewogICAgICAgIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSBpbml0aWFsaXplci52YXJpYWJsZTsKICAgICAgICBDb25zdGFudEV4cHJlc3Npb24gY29uc3RhbnQgPSB2aXNpdCh2YXJpYWJsZS5pbml0aWFsaXplcik7CiAgICAgICAgaWYgKGNvbnN0YW50ICE9IG51bGwpIHsKICAgICAgICAgIF9pbml0aWFsaXplckxvY2Fsc1t2YXJpYWJsZV0gPSBjb25zdGFudDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVXNlIFtfRXJyb25lb3VzSW5pdGlhbGl6ZXJWaXNpdG9yXSBpbgogICAgICAgICAgLy8gYHNzYS9idWlsZGVyX2tlcm5lbC5kYXJ0YCB0byBpZGVudGlmeSBlcnJvbmVvdXMgaW5pdGlhbGl6ZXIuCiAgICAgICAgICBTdHJpbmcgY29uc3RydWN0b3JOYW1lID0gJyR7Y2xzLm5hbWV9LiR7bm9kZS5uYW1lfSc7CiAgICAgICAgICBlbGVtZW50TWFwLnJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgICAgICBjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZShpbml0aWFsaXplciksCiAgICAgICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9DT05TVFJVQ1RPUiwKICAgICAgICAgICAgICB7J2NvbnN0cnVjdG9yTmFtZSc6IGNvbnN0cnVjdG9yTmFtZX0pOwogICAgICAgICAgcmV0dXJuIG5ldyBFcnJvbmVvdXNDb25zdGFudENvbnN0cnVjdG9yKCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICAgICAnVW5leHBlY3RlZCBpbml0aWFsaXplciAkaW5pdGlhbGl6ZXIgKCR7aW5pdGlhbGl6ZXIucnVudGltZVR5cGV9KScpOwogICAgICB9CiAgICB9CiAgICBpZiAoaXNSZWRpcmVjdGluZykgewogICAgICByZXR1cm4gbmV3IFJlZGlyZWN0aW5nR2VuZXJhdGl2ZUNvbnN0YW50Q29uc3RydWN0b3IoCiAgICAgICAgICBkZWZhdWx0VmFsdWVzLCBzdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IEdlbmVyYXRpdmVDb25zdGFudENvbnN0cnVjdG9yKHR5cGUsIGRlZmF1bHRWYWx1ZXMsIGZpZWxkTWFwLAogICAgICAgICAgYXNzZXJ0aW9ucywgc3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24pOwogICAgfQogIH0KfQoKLy8vIFZpc2l0b3IgdGhhdCBjb252ZXJ0cyBrZXJuZWwgZGFydCB0eXBlcyBpbnRvIFtEYXJ0VHlwZV0uCmNsYXNzIERhcnRUeXBlQ29udmVydGVyIGV4dGVuZHMgaXIuRGFydFR5cGVWaXNpdG9yPERhcnRUeXBlPiB7CiAgZmluYWwgSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcDsKICBmaW5hbCBNYXA8aXIuVHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IGN1cnJlbnRGdW5jdGlvblR5cGVQYXJhbWV0ZXJzID0KICAgICAgPGlyLlR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwogIGJvb2wgdG9wTGV2ZWwgPSB0cnVlOwoKICBEYXJ0VHlwZUNvbnZlcnRlcih0aGlzLmVsZW1lbnRNYXApOwoKICBEYXJ0VHlwZSBjb252ZXJ0KGlyLkRhcnRUeXBlIHR5cGUpIHsKICAgIHRvcExldmVsID0gdHJ1ZTsKICAgIHJldHVybiB0eXBlLmFjY2VwdCh0aGlzKTsKICB9CgogIC8vLyBWaXNpdCBhIGlubmVyIHR5cGUuCiAgRGFydFR5cGUgdmlzaXRUeXBlKGlyLkRhcnRUeXBlIHR5cGUpIHsKICAgIHRvcExldmVsID0gZmFsc2U7CiAgICByZXR1cm4gdHlwZS5hY2NlcHQodGhpcyk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIHZpc2l0U3VwZXJ0eXBlKGlyLlN1cGVydHlwZSBub2RlKSB7CiAgICBDbGFzc0VudGl0eSBjbHMgPSBlbGVtZW50TWFwLmdldENsYXNzKG5vZGUuY2xhc3NOb2RlKTsKICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZShjbHMsIHZpc2l0VHlwZXMobm9kZS50eXBlQXJndW1lbnRzKSk7CiAgfQoKICBMaXN0PERhcnRUeXBlPiB2aXNpdFR5cGVzKExpc3Q8aXIuRGFydFR5cGU+IHR5cGVzKSB7CiAgICB0b3BMZXZlbCA9IGZhbHNlOwogICAgcmV0dXJuIG5ldyBMaXN0LmdlbmVyYXRlKAogICAgICAgIHR5cGVzLmxlbmd0aCwgKGludCBpbmRleCkgPT4gdHlwZXNbaW5kZXhdLmFjY2VwdCh0aGlzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKGlyLlR5cGVQYXJhbWV0ZXJUeXBlIG5vZGUpIHsKICAgIERhcnRUeXBlIHR5cGVQYXJhbWV0ZXIgPSBjdXJyZW50RnVuY3Rpb25UeXBlUGFyYW1ldGVyc1tub2RlLnBhcmFtZXRlcl07CiAgICBpZiAodHlwZVBhcmFtZXRlciAhPSBudWxsKSB7CiAgICAgIHJldHVybiB0eXBlUGFyYW1ldGVyOwogICAgfQogICAgaWYgKG5vZGUucGFyYW1ldGVyLnBhcmVudCBpcyBpci5UeXBlZGVmKSB7CiAgICAgIC8vIFR5cGVkZWZzIGFyZSBvbmx5IHVzZWQgaW4gdHlwZSBsaXRlcmFscyBzbyB3ZSBuZXZlciBuZWVkIHRoZWlyIHR5cGUKICAgICAgLy8gdmFyaWFibGVzLgogICAgICByZXR1cm4gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIH0KICAgIHJldHVybiBuZXcgVHlwZVZhcmlhYmxlVHlwZShlbGVtZW50TWFwLmdldFR5cGVWYXJpYWJsZShub2RlLnBhcmFtZXRlcikpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRGdW5jdGlvblR5cGUoaXIuRnVuY3Rpb25UeXBlIG5vZGUpIHsKICAgIGludCBpbmRleCA9IDA7CiAgICBMaXN0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPiB0eXBlVmFyaWFibGVzOwogICAgZm9yIChpci5UeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgaW4gbm9kZS50eXBlUGFyYW1ldGVycykgewogICAgICBGdW5jdGlvblR5cGVWYXJpYWJsZSB0eXBlVmFyaWFibGUgPSBuZXcgRnVuY3Rpb25UeXBlVmFyaWFibGUoaW5kZXgpOwogICAgICBjdXJyZW50RnVuY3Rpb25UeXBlUGFyYW1ldGVyc1t0eXBlUGFyYW1ldGVyXSA9IHR5cGVWYXJpYWJsZTsKICAgICAgdHlwZVZhcmlhYmxlcyA/Pz0gPEZ1bmN0aW9uVHlwZVZhcmlhYmxlPltdOwogICAgICB0eXBlVmFyaWFibGVzLmFkZCh0eXBlVmFyaWFibGUpOwogICAgICBpbmRleCsrOwogICAgfQogICAgaWYgKHR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgdHlwZVZhcmlhYmxlcy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICB0eXBlVmFyaWFibGVzW2luZGV4XS5ib3VuZCA9CiAgICAgICAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnNbaW5kZXhdLmJvdW5kLmFjY2VwdCh0aGlzKTsKICAgICAgfQogICAgfQoKICAgIEZ1bmN0aW9uVHlwZSB0eXBlID0gbmV3IEZ1bmN0aW9uVHlwZSgKICAgICAgICB2aXNpdFR5cGUobm9kZS5yZXR1cm5UeXBlKSwKICAgICAgICB2aXNpdFR5cGVzKG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMKICAgICAgICAgICAgLnRha2Uobm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50KQogICAgICAgICAgICAudG9MaXN0KCkpLAogICAgICAgIHZpc2l0VHlwZXMobm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycwogICAgICAgICAgICAuc2tpcChub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpCiAgICAgICAgICAgIC50b0xpc3QoKSksCiAgICAgICAgbm9kZS5uYW1lZFBhcmFtZXRlcnMubWFwKChuKSA9PiBuLm5hbWUpLnRvTGlzdCgpLAogICAgICAgIG5vZGUubmFtZWRQYXJhbWV0ZXJzLm1hcCgobikgPT4gdmlzaXRUeXBlKG4udHlwZSkpLnRvTGlzdCgpLAogICAgICAgIHR5cGVWYXJpYWJsZXMgPz8gY29uc3QgPEZ1bmN0aW9uVHlwZVZhcmlhYmxlPltdKTsKICAgIGZvciAoaXIuVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyIGluIG5vZGUudHlwZVBhcmFtZXRlcnMpIHsKICAgICAgY3VycmVudEZ1bmN0aW9uVHlwZVBhcmFtZXRlcnMucmVtb3ZlKHR5cGVQYXJhbWV0ZXIpOwogICAgfQogICAgcmV0dXJuIHR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdEludGVyZmFjZVR5cGUoaXIuSW50ZXJmYWNlVHlwZSBub2RlKSB7CiAgICBDbGFzc0VudGl0eSBjbHMgPSBlbGVtZW50TWFwLmdldENsYXNzKG5vZGUuY2xhc3NOb2RlKTsKICAgIGlmIChjbHMubmFtZSA9PSAnRnV0dXJlT3InICYmCiAgICAgICAgY2xzLmxpYnJhcnkgPT0gZWxlbWVudE1hcC5jb21tb25FbGVtZW50cy5hc3luY0xpYnJhcnkpIHsKICAgICAgcmV0dXJuIG5ldyBGdXR1cmVPclR5cGUodmlzaXRUeXBlcyhub2RlLnR5cGVBcmd1bWVudHMpLnNpbmdsZSk7CiAgICB9CiAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUoY2xzLCB2aXNpdFR5cGVzKG5vZGUudHlwZUFyZ3VtZW50cykpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRWb2lkVHlwZShpci5Wb2lkVHlwZSBub2RlKSB7CiAgICByZXR1cm4gY29uc3QgVm9pZFR5cGUoKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0RHluYW1pY1R5cGUoaXIuRHluYW1pY1R5cGUgbm9kZSkgewogICAgcmV0dXJuIGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdEludmFsaWRUeXBlKGlyLkludmFsaWRUeXBlIG5vZGUpIHsKICAgIC8vIFJvb3QgdXNlcyBzdWNoIGEgYG8gaXMgVW5yZXNvbHZlZGAgYW5kIGBvIGFzIFVucmVzb2x2ZWRgIG11c3QgYmUgc3BlY2lhbAogICAgLy8gY2FzZWQgaW4gdGhlIGJ1aWxkZXIsIG5lc3RlZCBpbnZhbGlkIHR5cGVzIGFyZSB0cmVhdGVkIGFzIGBkeW5hbWljYC4KICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRCb3R0b21UeXBlKGlyLkJvdHRvbVR5cGUgbm9kZSkgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuY29tbW9uRWxlbWVudHMubnVsbFR5cGU7CiAgfQp9CgpjbGFzcyBDb25zdGFudFZhbHVlZmllciBpbXBsZW1lbnRzIGlyLkNvbnN0YW50VmlzaXRvcjxDb25zdGFudFZhbHVlPiB7CiAgZmluYWwgSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcDsKCiAgQ29uc3RhbnRWYWx1ZWZpZXIodGhpcy5lbGVtZW50TWFwKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBkZWZhdWx0Q29uc3RhbnQoaXIuQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIlVuZXhwZWN0ZWQgY29uc3RhbnQgJG5vZGUgKCR7bm9kZS5ydW50aW1lVHlwZX0pLiIpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSB2aXNpdFVuZXZhbHVhdGVkQ29uc3RhbnQoaXIuVW5ldmFsdWF0ZWRDb25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5leHBlY3RlZCB1bmV2YWx1YXRlZCBjb25zdGFudCAkbm9kZS4iKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgdmlzaXRUeXBlTGl0ZXJhbENvbnN0YW50KGlyLlR5cGVMaXRlcmFsQ29uc3RhbnQgbm9kZSkgewogICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5jcmVhdGVUeXBlKAogICAgICAgIGVsZW1lbnRNYXAuY29tbW9uRWxlbWVudHMsIGVsZW1lbnRNYXAuZ2V0RGFydFR5cGUobm9kZS50eXBlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0VGVhck9mZkNvbnN0YW50KGlyLlRlYXJPZmZDb25zdGFudCBub2RlKSB7CiAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiA9IGVsZW1lbnRNYXAuZ2V0TWV0aG9kKG5vZGUucHJvY2VkdXJlKTsKICAgIERhcnRUeXBlIHR5cGUgPSBlbGVtZW50TWFwLmdldEZ1bmN0aW9uVHlwZShub2RlLnByb2NlZHVyZS5mdW5jdGlvbik7CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uQ29uc3RhbnRWYWx1ZShmdW5jdGlvbiwgdHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCgKICAgICAgaXIuUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCBub2RlKSB7CiAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0gW107CiAgICBmb3IgKGlyLkRhcnRUeXBlIHR5cGUgaW4gbm9kZS50eXBlcykgewogICAgICB0eXBlQXJndW1lbnRzLmFkZChlbGVtZW50TWFwLmdldERhcnRUeXBlKHR5cGUpKTsKICAgIH0KICAgIEZ1bmN0aW9uQ29uc3RhbnRWYWx1ZSBmdW5jdGlvbiA9IG5vZGUudGVhck9mZkNvbnN0YW50LmFjY2VwdCh0aGlzKTsKICAgIHJldHVybiBuZXcgSW5zdGFudGlhdGlvbkNvbnN0YW50VmFsdWUodHlwZUFyZ3VtZW50cywgZnVuY3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSB2aXNpdEluc3RhbmNlQ29uc3RhbnQoaXIuSW5zdGFuY2VDb25zdGFudCBub2RlKSB7CiAgICBJbnRlcmZhY2VUeXBlIHR5cGUgPQogICAgICAgIGVsZW1lbnRNYXAuY3JlYXRlSW50ZXJmYWNlVHlwZShub2RlLmNsYXNzTm9kZSwgbm9kZS50eXBlQXJndW1lbnRzKTsKICAgIE1hcDxGaWVsZEVudGl0eSwgQ29uc3RhbnRWYWx1ZT4gZmllbGRzID0ge307CiAgICBub2RlLmZpZWxkVmFsdWVzLmZvckVhY2goKGlyLlJlZmVyZW5jZSByZWZlcmVuY2UsIGlyLkNvbnN0YW50IHZhbHVlKSB7CiAgICAgIEZpZWxkRW50aXR5IGZpZWxkID0gZWxlbWVudE1hcC5nZXRGaWVsZChyZWZlcmVuY2UuYXNGaWVsZCk7CiAgICAgIGZpZWxkc1tmaWVsZF0gPSB2YWx1ZS5hY2NlcHQodGhpcyk7CiAgICB9KTsKICAgIHJldHVybiBuZXcgQ29uc3RydWN0ZWRDb25zdGFudFZhbHVlKHR5cGUsIGZpZWxkcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0TGlzdENvbnN0YW50KGlyLkxpc3RDb25zdGFudCBub2RlKSB7CiAgICBMaXN0PENvbnN0YW50VmFsdWU+IGVsZW1lbnRzID0gW107CiAgICBmb3IgKGlyLkNvbnN0YW50IGVsZW1lbnQgaW4gbm9kZS5lbnRyaWVzKSB7CiAgICAgIGVsZW1lbnRzLmFkZChlbGVtZW50LmFjY2VwdCh0aGlzKSk7CiAgICB9CiAgICBEYXJ0VHlwZSB0eXBlID0gZWxlbWVudE1hcC5jb21tb25FbGVtZW50cwogICAgICAgIC5saXN0VHlwZShlbGVtZW50TWFwLmdldERhcnRUeXBlKG5vZGUudHlwZUFyZ3VtZW50KSk7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZUxpc3QodHlwZSwgZWxlbWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSB2aXNpdFNldENvbnN0YW50KGlyLlNldENvbnN0YW50IG5vZGUpIHsKICAgIExpc3Q8Q29uc3RhbnRWYWx1ZT4gZWxlbWVudHMgPSBbXTsKICAgIGZvciAoaXIuQ29uc3RhbnQgZWxlbWVudCBpbiBub2RlLmVudHJpZXMpIHsKICAgICAgZWxlbWVudHMuYWRkKGVsZW1lbnQuYWNjZXB0KHRoaXMpKTsKICAgIH0KICAgIERhcnRUeXBlIHR5cGUgPSBlbGVtZW50TWFwLmNvbW1vbkVsZW1lbnRzCiAgICAgICAgLnNldFR5cGUoZWxlbWVudE1hcC5nZXREYXJ0VHlwZShub2RlLnR5cGVBcmd1bWVudCkpOwogICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5jcmVhdGVTZXQoZWxlbWVudE1hcC5jb21tb25FbGVtZW50cywgdHlwZSwgZWxlbWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSB2aXNpdE1hcENvbnN0YW50KGlyLk1hcENvbnN0YW50IG5vZGUpIHsKICAgIExpc3Q8Q29uc3RhbnRWYWx1ZT4ga2V5cyA9IFtdOwogICAgTGlzdDxDb25zdGFudFZhbHVlPiB2YWx1ZXMgPSBbXTsKICAgIGZvciAoaXIuQ29uc3RhbnRNYXBFbnRyeSBlbGVtZW50IGluIG5vZGUuZW50cmllcykgewogICAgICBrZXlzLmFkZChlbGVtZW50LmtleS5hY2NlcHQodGhpcykpOwogICAgICB2YWx1ZXMuYWRkKGVsZW1lbnQudmFsdWUuYWNjZXB0KHRoaXMpKTsKICAgIH0KICAgIERhcnRUeXBlIHR5cGUgPSBlbGVtZW50TWFwLmNvbW1vbkVsZW1lbnRzLm1hcFR5cGUoCiAgICAgICAgZWxlbWVudE1hcC5nZXREYXJ0VHlwZShub2RlLmtleVR5cGUpLAogICAgICAgIGVsZW1lbnRNYXAuZ2V0RGFydFR5cGUobm9kZS52YWx1ZVR5cGUpKTsKICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0uY3JlYXRlTWFwKAogICAgICAgIGVsZW1lbnRNYXAuY29tbW9uRWxlbWVudHMsIHR5cGUsIGtleXMsIHZhbHVlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0U3ltYm9sQ29uc3RhbnQoaXIuU3ltYm9sQ29uc3RhbnQgbm9kZSkgewogICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5jcmVhdGVTeW1ib2woZWxlbWVudE1hcC5jb21tb25FbGVtZW50cywgbm9kZS5uYW1lKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgdmlzaXRTdHJpbmdDb25zdGFudChpci5TdHJpbmdDb25zdGFudCBub2RlKSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZVN0cmluZyhub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgdmlzaXREb3VibGVDb25zdGFudChpci5Eb3VibGVD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bGVjdGlvbi9jb2xsZWN0aW9uLmRhcnQnIHNob3cgbWVyZ2VTb3J0OyAvLyBhIHN0YWJsZSBzb3J0LgoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL2NvbnN0cnVjdG9ycy5kYXJ0JzsKaW1wb3J0ICcuLi9jb25zdGFudHMvZXhwcmVzc2lvbnMuZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pci9lbGVtZW50X21hcC5kYXJ0JzsKaW1wb3J0ICcuLi9pci92aXNpdG9ycy5kYXJ0JzsKaW1wb3J0ICcuLi9pci91dGlsLmRhcnQnOwppbXBvcnQgJy4uL2pzX21vZGVsL2VsZW1lbnRfbWFwLmRhcnQnOwppbXBvcnQgJy4uL2pzX21vZGVsL2Vudi5kYXJ0JzsKaW1wb3J0ICcuLi9vcmRlcmVkX3R5cGVzZXQuZGFydCc7CmltcG9ydCAnLi4vc3NhL3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9tZW1iZXJfdXNhZ2UuZGFydCc7CmltcG9ydCAnZWxlbWVudF9tYXBfaW1wbC5kYXJ0JzsKCi8vLyBFbnZpcm9ubWVudCBmb3IgZmFzdCBsb29rdXAgb2YgY29tcG9uZW50IGxpYnJhcmllcy4KY2xhc3MgS1Byb2dyYW1FbnYgewogIGZpbmFsIFNldDxpci5Db21wb25lbnQ+IF9jb21wb25lbnRzID0gbmV3IFNldDxpci5Db21wb25lbnQ+KCk7CgogIE1hcDxVcmksIEtMaWJyYXJ5RW52PiBfbGlicmFyeU1hcDsKCiAgLy8vIFRPRE8oam9obm5pd2ludGhlcik6IEhhbmRsZSBhcmJpdHJhcnkgbG9hZCBvcmRlciBpZiBuZWVkZWQuCiAgaXIuTWVtYmVyIGdldCBtYWluTWV0aG9kID0+IF9jb21wb25lbnRzLmZpcnN0Py5tYWluTWV0aG9kOwoKICBpci5Db21wb25lbnQgZ2V0IG1haW5Db21wb25lbnQgPT4gX2NvbXBvbmVudHMuZmlyc3Q7CgogIHZvaWQgYWRkQ29tcG9uZW50KGlyLkNvbXBvbmVudCBjb21wb25lbnQpIHsKICAgIGlmIChfY29tcG9uZW50cy5hZGQoY29tcG9uZW50KSkgewogICAgICBpZiAoX2xpYnJhcnlNYXAgIT0gbnVsbCkgewogICAgICAgIF9hZGRMaWJyYXJpZXMoY29tcG9uZW50KTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBfYWRkTGlicmFyaWVzKGlyLkNvbXBvbmVudCBjb21wb25lbnQpIHsKICAgIGZvciAoaXIuTGlicmFyeSBsaWJyYXJ5IGluIGNvbXBvbmVudC5saWJyYXJpZXMpIHsKICAgICAgX2xpYnJhcnlNYXBbbGlicmFyeS5pbXBvcnRVcmldID0gbmV3IEtMaWJyYXJ5RW52KGxpYnJhcnkpOwogICAgfQogIH0KCiAgdm9pZCBfZW5zdXJlTGlicmFyeU1hcCgpIHsKICAgIGlmIChfbGlicmFyeU1hcCA9PSBudWxsKSB7CiAgICAgIF9saWJyYXJ5TWFwID0gPFVyaSwgS0xpYnJhcnlFbnY+e307CiAgICAgIGZvciAoaXIuQ29tcG9uZW50IGNvbXBvbmVudCBpbiBfY29tcG9uZW50cykgewogICAgICAgIF9hZGRMaWJyYXJpZXMoY29tcG9uZW50KTsKICAgICAgfQogICAgfQogIH0KCiAgLy8vIFJldHVybiB0aGUgW0tMaWJyYXJ5RW52XSBmb3IgdGhlIGxpYnJhcnkgd2l0aCB0aGUgY2Fub25pY2FsIFt1cmldLgogIEtMaWJyYXJ5RW52IGxvb2t1cExpYnJhcnkoVXJpIHVyaSkgewogICAgX2Vuc3VyZUxpYnJhcnlNYXAoKTsKICAgIHJldHVybiBfbGlicmFyeU1hcFt1cmldOwogIH0KCiAgLy8vIENhbGxzIFtmXSBmb3IgZWFjaCBsaWJyYXJ5IGluIHRoaXMgZW52aXJvbm1lbnQuCiAgdm9pZCBmb3JFYWNoTGlicmFyeSh2b2lkIGYoS0xpYnJhcnlFbnYgbGlicmFyeSkpIHsKICAgIF9lbnN1cmVMaWJyYXJ5TWFwKCk7CiAgICBfbGlicmFyeU1hcC52YWx1ZXMuZm9yRWFjaChmKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbGlicmFyaWVzIGluIHRoaXMgZW52aXJvbm1lbnQuCiAgaW50IGdldCBsZW5ndGggewogICAgX2Vuc3VyZUxpYnJhcnlNYXAoKTsKICAgIHJldHVybiBfbGlicmFyeU1hcC5sZW5ndGg7CiAgfQoKICAvLy8gQ29udmVydCB0aGlzIFtLUHJvZ3JhbUVudl0gdG8gdGhlIGNvcnJlc3BvbmRpbmcgW0pQcm9ncmFtRW52XS4KICBKUHJvZ3JhbUVudiBjb252ZXJ0KCkgPT4gbmV3IEpQcm9ncmFtRW52KF9jb21wb25lbnRzKTsKfQoKLy8vIEVudmlyb25tZW50IGZvciBmYXN0IGxvb2t1cCBvZiBsaWJyYXJ5IGNsYXNzZXMgYW5kIG1lbWJlcnMuCmNsYXNzIEtMaWJyYXJ5RW52IHsKICBmaW5hbCBpci5MaWJyYXJ5IGxpYnJhcnk7CgogIE1hcDxTdHJpbmcsIEtDbGFzc0Vudj4gX2NsYXNzTWFwOwogIE1hcDxTdHJpbmcsIGlyLk1lbWJlcj4gX21lbWJlck1hcDsKICBNYXA8U3RyaW5nLCBpci5NZW1iZXI+IF9zZXR0ZXJNYXA7CgogIEtMaWJyYXJ5RW52KHRoaXMubGlicmFyeSk7CgogIHZvaWQgX2Vuc3VyZUNsYXNzTWFwKCkgewogICAgaWYgKF9jbGFzc01hcCA9PSBudWxsKSB7CiAgICAgIF9jbGFzc01hcCA9IDxTdHJpbmcsIEtDbGFzc0Vudj57fTsKICAgICAgZm9yIChpci5DbGFzcyBjbHMgaW4gbGlicmFyeS5jbGFzc2VzKSB7CiAgICAgICAgX2NsYXNzTWFwW2Nscy5uYW1lXSA9IG5ldyBLQ2xhc3NFbnZJbXBsKGNscyk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBSZXR1cm4gdGhlIFtLQ2xhc3NFbnZdIGZvciB0aGUgY2xhc3MgW25hbWVdIGluIFtsaWJyYXJ5XS4KICBLQ2xhc3NFbnYgbG9va3VwQ2xhc3MoU3RyaW5nIG5hbWUpIHsKICAgIF9lbnN1cmVDbGFzc01hcCgpOwogICAgcmV0dXJuIF9jbGFzc01hcFtuYW1lXTsKICB9CgogIC8vLyBDYWxscyBbZl0gZm9yIGVhY2ggY2xhc3MgaW4gdGhpcyBsaWJyYXJ5LgogIHZvaWQgZm9yRWFjaENsYXNzKHZvaWQgZihLQ2xhc3NFbnYgY2xzKSkgewogICAgX2Vuc3VyZUNsYXNzTWFwKCk7CiAgICBfY2xhc3NNYXAudmFsdWVzLmZvckVhY2goZik7CiAgfQoKICB2b2lkIF9lbnN1cmVNZW1iZXJNYXBzKCkgewogICAgaWYgKF9tZW1iZXJNYXAgPT0gbnVsbCkgewogICAgICBfbWVtYmVyTWFwID0gPFN0cmluZywgaXIuTWVtYmVyPnt9OwogICAgICBfc2V0dGVyTWFwID0gPFN0cmluZywgaXIuTWVtYmVyPnt9OwogICAgICBmb3IgKGlyLk1lbWJlciBtZW1iZXIgaW4gbGlicmFyeS5tZW1iZXJzKSB7CiAgICAgICAgaWYgKG1lbWJlci5uYW1lLm5hbWUuY29udGFpbnMoJyMnKSkgewogICAgICAgICAgLy8gU2tpcCBzeW50aGV0aWMgLmRpbGwgbWVtYmVycy4KICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAobWVtYmVyIGlzIGlyLlByb2NlZHVyZSkgewogICAgICAgICAgaWYgKG1lbWJlci5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuU2V0dGVyKSB7CiAgICAgICAgICAgIF9zZXR0ZXJNYXBbbWVtYmVyLm5hbWUubmFtZV0gPSBtZW1iZXI7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfbWVtYmVyTWFwW21lbWJlci5uYW1lLm5hbWVdID0gbWVtYmVyOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAobWVtYmVyIGlzIGlyLkZpZWxkKSB7CiAgICAgICAgICBfbWVtYmVyTWFwW21lbWJlci5uYW1lLm5hbWVdID0gbWVtYmVyOwogICAgICAgICAgaWYgKG1lbWJlci5pc011dGFibGUpIHsKICAgICAgICAgICAgX3NldHRlck1hcFttZW1iZXIubmFtZS5uYW1lXSA9IG1lbWJlcjsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgICAgTk9fTE9DQVRJT05fU1BBTk5BQkxFLCAiVW5leHBlY3RlZCBsaWJyYXJ5IG1lbWJlciBub2RlOiAkbWVtYmVyIik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLy8gUmV0dXJuIHRoZSBbaXIuTWVtYmVyXSBmb3IgdGhlIG1lbWJlciBbbmFtZV0gaW4gW2xpYnJhcnldLgogIGlyLk1lbWJlciBsb29rdXBNZW1iZXIoU3RyaW5nIG5hbWUsIHtib29sIHNldHRlcjogZmFsc2V9KSB7CiAgICBfZW5zdXJlTWVtYmVyTWFwcygpOwogICAgcmV0dXJuIHNldHRlciA/IF9zZXR0ZXJNYXBbbmFtZV0gOiBfbWVtYmVyTWFwW25hbWVdOwogIH0KCiAgdm9pZCBmb3JFYWNoTWVtYmVyKHZvaWQgZihpci5NZW1iZXIgbWVtYmVyKSkgewogICAgX2Vuc3VyZU1lbWJlck1hcHMoKTsKICAgIF9tZW1iZXJNYXAudmFsdWVzLmZvckVhY2goZik7CiAgICBmb3IgKGlyLk1lbWJlciBtZW1iZXIgaW4gX3NldHRlck1hcC52YWx1ZXMpIHsKICAgICAgaWYgKG1lbWJlciBpcyBpci5Qcm9jZWR1cmUpIHsKICAgICAgICBmKG1lbWJlcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gU2tpcCBmaWVsZHM7IHRoZXNlIGFyZSBhbHNvIGluIF9tZW1iZXJNYXAuCiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBDb252ZXJ0IHRoaXMgW0tMaWJyYXJ5RW52XSB0byBhIGNvcnJlc3BvbmRpbmcgW0pMaWJyYXJ5RW52XSBjb250YWluaW5nCiAgLy8vIG9ubHkgdGhlIG1lbWJlcnMgaW4gW2xpdmVNZW1iZXJzXS4KICBKTGlicmFyeUVudiBjb252ZXJ0KElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsCiAgICAgIE1hcDxNZW1iZXJFbnRpdHksIE1lbWJlclVzYWdlPiBsaXZlTWVtYmVyVXNhZ2UpIHsKICAgIE1hcDxTdHJpbmcsIGlyLk1lbWJlcj4gbWVtYmVyTWFwOwogICAgTWFwPFN0cmluZywgaXIuTWVtYmVyPiBzZXR0ZXJNYXA7CiAgICBpZiAoX21lbWJlck1hcCA9PSBudWxsKSB7CiAgICAgIG1lbWJlck1hcCA9IGNvbnN0IDxTdHJpbmcsIGlyLk1lbWJlcj57fTsKICAgIH0gZWxzZSB7CiAgICAgIG1lbWJlck1hcCA9IDxTdHJpbmcsIGlyLk1lbWJlcj57fTsKICAgICAgX21lbWJlck1hcC5mb3JFYWNoKChTdHJpbmcgbmFtZSwgaXIuTWVtYmVyIG5vZGUpIHsKICAgICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0gZWxlbWVudE1hcC5nZXRNZW1iZXIobm9kZSk7CiAgICAgICAgaWYgKGxpdmVNZW1iZXJVc2FnZS5jb250YWluc0tleShtZW1iZXIpKSB7CiAgICAgICAgICBtZW1iZXJNYXBbbmFtZV0gPSBub2RlOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBpZiAoX3NldHRlck1hcCA9PSBudWxsKSB7CiAgICAgIHNldHRlck1hcCA9IGNvbnN0IDxTdHJpbmcsIGlyLk1lbWJlcj57fTsKICAgIH0gZWxzZSB7CiAgICAgIHNldHRlck1hcCA9IDxTdHJpbmcsIGlyLk1lbWJlcj57fTsKICAgICAgX3NldHRlck1hcC5mb3JFYWNoKChTdHJpbmcgbmFtZSwgaXIuTWVtYmVyIG5vZGUpIHsKICAgICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0gZWxlbWVudE1hcC5nZXRNZW1iZXIobm9kZSk7CiAgICAgICAgaWYgKGxpdmVNZW1iZXJVc2FnZS5jb250YWluc0tleShtZW1iZXIpKSB7CiAgICAgICAgICBzZXR0ZXJNYXBbbmFtZV0gPSBub2RlOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gbmV3IEpMaWJyYXJ5RW52KGxpYnJhcnksIG1lbWJlck1hcCwgc2V0dGVyTWFwKTsKICB9Cn0KCmNsYXNzIEtMaWJyYXJ5RGF0YSB7CiAgZmluYWwgaXIuTGlicmFyeSBsaWJyYXJ5OwogIEl0ZXJhYmxlPENvbnN0YW50VmFsdWU+IF9tZXRhZGF0YTsKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBdm9pZCBkaXJlY3QgYWNjZXNzIHRvIFtpbXBvcnRzXS4KICBNYXA8aXIuTGlicmFyeURlcGVuZGVuY3ksIEltcG9ydEVudGl0eT4gaW1wb3J0czsKCiAgS0xpYnJhcnlEYXRhKHRoaXMubGlicmFyeSk7CgogIEl0ZXJhYmxlPENvbnN0YW50VmFsdWU+IGdldE1ldGFkYXRhKEtlcm5lbFRvRWxlbWVudE1hcEltcGwgZWxlbWVudE1hcCkgewogICAgcmV0dXJuIF9tZXRhZGF0YSA/Pz0gZWxlbWVudE1hcC5nZXRNZXRhZGF0YShsaWJyYXJ5LmFubm90YXRpb25zKTsKICB9CgogIEl0ZXJhYmxlPEltcG9ydEVudGl0eT4gZ2V0SW1wb3J0cyhLZXJuZWxUb0VsZW1lbnRNYXBJbXBsIGVsZW1lbnRNYXApIHsKICAgIGlmIChpbXBvcnRzID09IG51bGwpIHsKICAgICAgTGlzdDxpci5MaWJyYXJ5RGVwZW5kZW5jeT4gZGVwZW5kZW5jaWVzID0gbGlicmFyeS5kZXBlbmRlbmNpZXM7CiAgICAgIGlmIChkZXBlbmRlbmNpZXMuaXNFbXB0eSkgewogICAgICAgIGltcG9ydHMgPSBjb25zdCA8aXIuTGlicmFyeURlcGVuZGVuY3ksIEltcG9ydEVudGl0eT57fTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbXBvcnRzID0gPGlyLkxpYnJhcnlEZXBlbmRlbmN5LCBJbXBvcnRFbnRpdHk+e307CiAgICAgICAgZGVwZW5kZW5jaWVzLmZvckVhY2goKGlyLkxpYnJhcnlEZXBlbmRlbmN5IG5vZGUpIHsKICAgICAgICAgIGlmIChub2RlLmlzRXhwb3J0KSByZXR1cm47CiAgICAgICAgICBpbXBvcnRzW25vZGVdID0gbmV3IEltcG9ydEVudGl0eSgKICAgICAgICAgICAgICBub2RlLmlzRGVmZXJyZWQsCiAgICAgICAgICAgICAgbm9kZS5uYW1lLAogICAgICAgICAgICAgIG5vZGUudGFyZ2V0TGlicmFyeS5pbXBvcnRVcmksCiAgICAgICAgICAgICAgZWxlbWVudE1hcC5nZXRMaWJyYXJ5KG5vZGUuZW5jbG9zaW5nTGlicmFyeSkuY2Fub25pY2FsVXJpKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGltcG9ydHMudmFsdWVzOwogIH0KCiAgLy8vIENvbnZlcnQgdGhpcyBbS0xpYnJhcnlEYXRhXSB0byB0aGUgY29ycmVzcG9uZGluZyBbSkxpYnJhcnlEYXRhXS4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBXaHkgaXNuJ3QgW2ltcG9ydHNdIGVuc3VyZWQgdG8gYmUgbm9uLW51bGwgaGVyZT8KICBKTGlicmFyeURhdGEgY29udmVydCgpIHsKICAgIHJldHVybiBuZXcgSkxpYnJhcnlEYXRhKGxpYnJhcnksIGltcG9ydHMpOwogIH0KfQoKLy8vIE1lbWJlciBkYXRhIGZvciBhIGNsYXNzLgphYnN0cmFjdCBjbGFzcyBLQ2xhc3NFbnYgewogIC8vLyBUaGUgW2lyLkNsYXNzXSB0aGF0IGRlZmluZWQgdGhlIGNsYXNzLCBpZiBhbnkuCiAgaXIuQ2xhc3MgZ2V0IGNsczsKCiAgLy8vIFdoZXRoZXIgdGhlIGNsYXNzIGlzIGFuIHVubmFtZWQgbWl4aW4gYXBwbGljYXRpb24uCiAgYm9vbCBnZXQgaXNVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbjsKCiAgLy8vIFdoZXRoZXIgdGhlIGNsYXNzIGlzIGEgbWl4aW4gYXBwbGljYXRpb24gdGhhdCBtaXhlcyBpbiBtZXRob2RzIHdpdGggc3VwZXIKICAvLy8gY2FsbHMuCiAgYm9vbCBnZXQgaXNTdXBlck1peGluQXBwbGljYXRpb247CgogIC8vLyBFbnN1cmVzIHRoYXQgYWxsIG1lbWJlcnMgaGF2ZSBiZWVuIGNvbXB1dGVkIGZvciBbY2xzXS4KICB2b2lkIGVuc3VyZU1lbWJlcnMoS2VybmVsVG9FbGVtZW50TWFwSW1wbCBlbGVtZW50TWFwKTsKCiAgLy8vIFJldHVybiB0aGUgW01lbWJlckVudGl0eV0gZm9yIHRoZSBtZW1iZXIgW25hbWVdIGluIHRoZSBjbGFzcy4gSWYgW3NldHRlcl0KICAvLy8gaXMgYHRydWVgLCB0aGUgc2V0dGVyIG9yIGFzc2lnbmFibGUgZmllbGQgY29ycmVzcG9uZGluZyB0byBbbmFtZV0gaXMKICAvLy8gcmV0dXJuZWQuCiAgTWVtYmVyRW50aXR5IGxvb2t1cE1lbWJlcihJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwLCBTdHJpbmcgbmFtZSwKICAgICAge2Jvb2wgc2V0dGVyOiBmYWxzZX0pOwoKICAvLy8gQ2FsbHMgW2ZdIGZvciBlYWNoIG1lbWJlciBvZiBbY2xzXS4KICB2b2lkIGZvckVhY2hNZW1iZXIoSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwgdm9pZCBmKE1lbWJlckVudGl0eSBtZW1iZXIpKTsKCiAgLy8vIFJldHVybiB0aGUgW0NvbnN0cnVjdG9yRW50aXR5XSBmb3IgdGhlIGNvbnN0cnVjdG9yIFtuYW1lXSBpbiBbY2xzXS4KICBDb25zdHJ1Y3RvckVudGl0eSBsb29rdXBDb25zdHJ1Y3RvcihJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwLCBTdHJpbmcgbmFtZSk7CgogIC8vLyBDYWxscyBbZl0gZm9yIGVhY2ggY29uc3RydWN0b3Igb2YgW2Nsc10uCiAgdm9pZCBmb3JFYWNoQ29uc3RydWN0b3IoCiAgICAgIElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsIHZvaWQgZihDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvcikpOwoKICAvLy8gQ2FsbHMgW2ZdIGZvciBlYWNoIGNvbnN0cnVjdG9yIGJvZHkgZm9yIHRoZSBsaXZlIGNvbnN0cnVjdG9ycyBpbiB0aGUKICAvLy8gY2xhc3MuCiAgdm9pZCBmb3JFYWNoQ29uc3RydWN0b3JCb2R5KHZvaWQgZihDb25zdHJ1Y3RvckJvZHlFbnRpdHkgY29uc3RydWN0b3IpKTsKCiAgLy8vIENvbnZlcnQgdGhpcyBbS0NsYXNzRW52XSB0byB0aGUgY29ycmVzcG9uZGluZyBbSkNsYXNzRW52XSBjb250YWluaW5nIG9ubHkKICAvLy8gdGhlIG1lbWJlcnMgaW4gW2xpdmVNZW1iZXJzXS4KICBKQ2xhc3NFbnYgY29udmVydChJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwLAogICAgICBNYXA8TWVtYmVyRW50aXR5LCBNZW1iZXJVc2FnZT4gbGl2ZU1lbWJlclVzYWdlKTsKfQoKaW50IG9yZGVyQnlGaWxlT2Zmc2V0KGlyLlRyZWVOb2RlIGEsIGlyLlRyZWVOb2RlIGIpIHsKICB2YXIgYUxvYyA9IGEubG9jYXRpb247CiAgdmFyIGJMb2MgPSBiLmxvY2F0aW9uOwogIHZhciBhVXJpID0gJyR7YUxvYy5maWxlfSc7CiAgdmFyIGJVcmkgPSAnJHtiTG9jLmZpbGV9JzsKICB2YXIgdXJpQ29tcGFyZSA9IGFVcmkuY29tcGFyZVRvKGJVcmkpOwogIGlmICh1cmlDb21wYXJlICE9IDApIHJldHVybiB1cmlDb21wYXJlOwogIHJldHVybiBhLmZpbGVPZmZzZXQuY29tcGFyZVRvKGIuZmlsZU9mZnNldCk7Cn0KCi8vLyBFbnZpcm9ubWVudCBmb3IgZmFzdCBsb29rdXAgb2YgY2xhc3MgbWVtYmVycy4KY2xhc3MgS0NsYXNzRW52SW1wbCBpbXBsZW1lbnRzIEtDbGFzc0VudiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgaXIuQ2xhc3MgY2xzOwoKICBNYXA8U3RyaW5nLCBpci5NZW1iZXI+IF9jb25zdHJ1Y3Rvck1hcDsKICBNYXA8U3RyaW5nLCBpci5NZW1iZXI+IF9tZW1iZXJNYXA7CiAgTWFwPFN0cmluZywgaXIuTWVtYmVyPiBfc2V0dGVyTWFwOwogIExpc3Q8aXIuTWVtYmVyPiBfbWVtYmVyczsgLy8gaW4gZGVjbGFyYXRpb24gb3JkZXIuCiAgYm9vbCBfaXNTdXBlck1peGluQXBwbGljYXRpb247CgogIC8vLyBDb25zdHJ1Y3RvciBib2RpZXMgY3JlYXRlZCBmb3IgdGhpcyBjbGFzcy4KICBMaXN0PENvbnN0cnVjdG9yQm9keUVudGl0eT4gX2NvbnN0cnVjdG9yQm9keUxpc3Q7CgogIEtDbGFzc0VudkltcGwodGhpcy5jbHMpOwoKICBLQ2xhc3NFbnZJbXBsLmludGVybmFsKHRoaXMuY2xzLCB0aGlzLl9jb25zdHJ1Y3Rvck1hcCwgdGhpcy5fbWVtYmVyTWFwLAogICAgICB0aGlzLl9zZXR0ZXJNYXAsIHRoaXMuX21lbWJlcnMsIHRoaXMuX2lzU3VwZXJNaXhpbkFwcGxpY2F0aW9uKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbiA9PiBjbHMuaXNBbm9ueW1vdXNNaXhpbjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNTdXBlck1peGluQXBwbGljYXRpb24gewogICAgYXNzZXJ0KF9pc1N1cGVyTWl4aW5BcHBsaWNhdGlvbiAhPSBudWxsKTsKICAgIHJldHVybiBfaXNTdXBlck1peGluQXBwbGljYXRpb247CiAgfQoKICAvLy8gQ29waWVkIGZyb20gJ3BhY2thZ2U6a2VybmVsL3RyYW5zZm9ybWF0aW9ucy9taXhpbl9mdWxsX3Jlc29sdXRpb24uZGFydCcuCiAgaXIuQ29uc3RydWN0b3IgX2J1aWxkRm9yd2FyZGluZ0NvbnN0cnVjdG9yKAogICAgICBDbG9uZVZpc2l0b3IgY2xvbmVyLCBpci5Db25zdHJ1Y3RvciBzdXBlcmNsYXNzQ29uc3RydWN0b3IpIHsKICAgIHZhciBzdXBlckZ1bmN0aW9uID0gc3VwZXJjbGFzc0NvbnN0cnVjdG9yLmZ1bmN0aW9uOwoKICAgIC8vIFdlIGtlZXAgdHlwZXMgYW5kIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgcGFyYW1ldGVycyBidXQgYWx3YXlzIG1hcmsgdGhlCiAgICAvLyBwYXJhbWV0ZXJzIGFzIGZpbmFsIChzaW5jZSB3ZSBqdXN0IGZvcndhcmQgdGhlbSB0byB0aGUgc3VwZXIKICAgIC8vIGNvbnN0cnVjdG9yKS4KICAgIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gY2xvbmVWYXJpYWJsZShpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSB7CiAgICAgIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gY2xvbmUgPSBjbG9uZXIuY2xvbmUodmFyaWFibGUpOwogICAgICBjbG9uZS5pc0ZpbmFsID0gdHJ1ZTsKICAgICAgcmV0dXJuIGNsb25lOwogICAgfQoKICAgIC8vIEJ1aWxkIGEgW0Z1bmN0aW9uTm9kZV0gd2hpY2ggaGFzIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgdGhlIG9uZSBpbiB0aGUKICAgIC8vIHN1cGVyY2xhc3MgY29uc3RydWN0b3IuCiAgICB2YXIgcG9zaXRpb25hbFBhcmFtZXRlcnMgPQogICAgICAgIHN1cGVyRnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubWFwKGNsb25lVmFyaWFibGUpLnRvTGlzdCgpOwogICAgdmFyIG5hbWVkUGFyYW1ldGVycyA9CiAgICAgICAgc3VwZXJGdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMubWFwKGNsb25lVmFyaWFibGUpLnRvTGlzdCgpOwogICAgdmFyIGZ1bmN0aW9uID0gbmV3IGlyLkZ1bmN0aW9uTm9kZShuZXcgaXIuRW1wdHlTdGF0ZW1lbnQoKSwKICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyczogcG9zaXRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzOiBuYW1lZFBhcmFtZXRlcnMsCiAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogc3VwZXJGdW5jdGlvbi5yZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgIHJldHVyblR5cGU6IGNvbnN0IGlyLlZvaWRUeXBlKCkpOwoKICAgIC8vIEJ1aWxkIGEgW1N1cGVySW5pdGlhbGl6ZXJdIHdoaWNoIHRha2VzIGFsbCBwb3NpdGlvbmFsL25hbWVkIHBhcmFtZXRlcnMKICAgIC8vIGFuZCBmb3J3YXJkIHRoZW0gdG8gdGhlIHN1cGVyIGNsYXNzIGNvbnN0cnVjdG9yLgogICAgdmFyIHBvc2l0aW9uYWxBcmd1bWVudHMgPSA8aXIuRXhwcmVzc2lvbj5bXTsKICAgIGZvciAodmFyIHZhcmlhYmxlIGluIHBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgIHBvc2l0aW9uYWxBcmd1bWVudHMuYWRkKG5ldyBpci5WYXJpYWJsZUdldCh2YXJpYWJsZSkpOwogICAgfQogICAgdmFyIG5hbWVkQXJndW1lbnRzID0gPGlyLk5hbWVkRXhwcmVzc2lvbj5bXTsKICAgIGZvciAodmFyIHZhcmlhYmxlIGluIG5hbWVkUGFyYW1ldGVycykgewogICAgICBuYW1lZEFyZ3VtZW50cy5hZGQoCiAgICAgICAgICBuZXcgaXIuTmFtZWRFeHByZXNzaW9uKHZhcmlhYmxlLm5hbWUsIG5ldyBpci5WYXJpYWJsZUdldCh2YXJpYWJsZSkpKTsKICAgIH0KICAgIHZhciBzdXBlckluaXRpYWxpemVyID0gbmV3IGlyLlN1cGVySW5pdGlhbGl6ZXIoc3VwZXJjbGFzc0NvbnN0cnVjdG9yLAogICAgICAgIG5ldyBpci5Bcmd1bWVudHMocG9zaXRpb25hbEFyZ3VtZW50cywgbmFtZWQ6IG5hbWVkQXJndW1lbnRzKSk7CgogICAgLy8gQXNzZW1ibGUgdGhlIGNvbnN0cnVjdG9yLgogICAgcmV0dXJuIG5ldyBpci5Db25zdHJ1Y3RvcihmdW5jdGlvbiwKICAgICAgICBuYW1lOiBzdXBlcmNsYXNzQ29uc3RydWN0b3IubmFtZSwKICAgICAgICBpbml0aWFsaXplcnM6IDxpci5Jbml0aWFsaXplcj5bc3VwZXJJbml0aWFsaXplcl0pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbnN1cmVNZW1iZXJzKEtlcm5lbFRvRWxlbWVudE1hcEltcGwgZWxlbWVudE1hcCkgewogICAgX2Vuc3VyZU1hcHMoZWxlbWVudE1hcCk7CiAgfQoKICB2b2lkIF9lbnN1cmVNYXBzKEtlcm5lbFRvRWxlbWVudE1hcEltcGwgZWxlbWVudE1hcCkgewogICAgaWYgKF9tZW1iZXJNYXAgIT0gbnVsbCkgcmV0dXJuOwoKICAgIF9tZW1iZXJNYXAgPSA8U3RyaW5nLCBpci5NZW1iZXI+e307CiAgICBfc2V0dGVyTWFwID0gPFN0cmluZywgaXIuTWVtYmVyPnt9OwogICAgX2NvbnN0cnVjdG9yTWFwID0gPFN0cmluZywgaXIuTWVtYmVyPnt9OwogICAgdmFyIG1lbWJlcnMgPSA8aXIuTWVtYmVyPltdOwogICAgX2lzU3VwZXJNaXhpbkFwcGxpY2F0aW9uID0gZmFsc2U7CgogICAgdm9pZCBhZGRGaWVsZChpci5GaWVsZCBtZW1iZXIsIHtib29sIGluY2x1ZGVTdGF0aWN9KSB7CiAgICAgIGlmICghaW5jbHVkZVN0YXRpYyAmJiBtZW1iZXIuaXNTdGF0aWMpIHJldHVybjsKICAgICAgdmFyIG5hbWUgPSBtZW1iZXIubmFtZS5uYW1lOwogICAgICBpZiAobmFtZS5jb250YWlucygnIycpKSB7CiAgICAgICAgLy8gU2tpcCBzeW50aGV0aWMgLmRpbGwgbWVtYmVycy4KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgX21lbWJlck1hcFtuYW1lXSA9IG1lbWJlcjsKICAgICAgaWYgKG1lbWJlci5pc011dGFibGUpIHsKICAgICAgICBfc2V0dGVyTWFwW25hbWVdID0gbWVtYmVyOwogICAgICB9CiAgICAgIG1lbWJlcnMuYWRkKG1lbWJlcik7CiAgICB9CgogICAgdm9pZCBhZGRQcm9jZWR1cmUoaXIuUHJvY2VkdXJlIG1lbWJlciwKICAgICAgICB7Ym9vbCBpbmNsdWRlU3RhdGljLCBib29sIGluY2x1ZGVOb1N1Y2hNZXRob2RGb3J3YXJkZXJzfSkgewogICAgICBpZiAobWVtYmVyLmlzRm9yd2FyZGluZ1N0dWIgJiYgbWVtYmVyLmlzQWJzdHJhY3QpIHsKICAgICAgICAvLyBTa2lwIGFic3RyYWN0IGZvcndhcmRpbmcgc3R1YnMuIFRoZXNlIGFyZSBuZXZlciBlbWl0dGVkIGJ1dCB0aGV5CiAgICAgICAgLy8gbWlnaHQgc2hhZG93IHRoZSBpbmNsdXNpb24gb2YgYSBtaXhlZCBpbiBtZXRob2QgaW4gY29kZSBsaWtlOgogICAgICAgIC8vCiAgICAgICAgLy8gICAgIGNsYXNzIFN1cGVyIHt9CiAgICAgICAgLy8gICAgIGNsYXNzIE1peGluPFQ+IHsKICAgICAgICAvLyAgICAgICB2b2lkIG1ldGhvZChUIHQpIHt9CiAgICAgICAgLy8gICAgIH0KICAgICAgICAvLyAgICAgY2xhc3MgQ2xhc3MgZXh0ZW5kcyBTdXBlciB3aXRoIE1peGluPGludD4ge30KICAgICAgICAvLyAgICAgbWFpbigpID0+IG5ldyBDbGFzcygpLm1ldGhvZCgpOwogICAgICAgIC8vCiAgICAgICAgLy8gSGVyZSBhIHN0dWIgaXMgY3JlYXRlZCBmb3IgYFN1cGVyJk1peGluLm1ldGhvZGAgaGlkaW5nIHRoYXQKICAgICAgICAvLyBgTWl4aW4ubWV0aG9kYCBpcyBpbmhlcml0ZWQgYnkgYENsYXNzYC4KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKCFpbmNsdWRlU3RhdGljICYmIG1lbWJlci5pc1N0YXRpYykgcmV0dXJuOwogICAgICBpZiAobWVtYmVyLmlzTm9TdWNoTWV0aG9kRm9yd2FyZGVyKSB7CiAgICAgICAgLy8gVE9ETyhzaWdtdW5kKTogcmVtb3ZlIG9uY2UgIzMzNzMyIGlzIGZpeGVkLgogICAgICAgIGlmICghaW5jbHVkZU5vU3VjaE1ldGhvZEZvcndhcmRlcnMgfHwKICAgICAgICAgICAgbWVtYmVyLm5hbWUuaXNQcml2YXRlICYmCiAgICAgICAgICAgICAgICBtZW1iZXIubmFtZS5saWJyYXJ5TmFtZSAhPSBtZW1iZXIuZW5jbG9zaW5nTGlicmFyeS5yZWZlcmVuY2UpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIG5hbWUgPSBtZW1iZXIubmFtZS5uYW1lOwogICAgICBhc3NlcnQoIW5hbWUuY29udGFpbnMoJyMnKSk7CiAgICAgIGlmIChtZW1iZXIua2luZCA9PSBpci5Qcm9jZWR1cmVLaW5kLkZhY3RvcnkpIHsKICAgICAgICBpZiAobWVtYmVyLmZ1bmN0aW9uLmJvZHkgaXMgaXIuUmVkaXJlY3RpbmdGYWN0b3J5Qm9keSkgewogICAgICAgICAgLy8gRG9uJ3QgaW5jbHVkZSByZWRpcmVjdGluZyBmYWN0b3JpZXMuCiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIF9jb25zdHJ1Y3Rvck1hcFtuYW1lXSA9IG1lbWJlcjsKICAgICAgfSBlbHNlIGlmIChtZW1iZXIua2luZCA9PSBpci5Qcm9jZWR1cmVLaW5kLlNldHRlcikgewogICAgICAgIF9zZXR0ZXJNYXBbbmFtZV0gPSBtZW1iZXI7CiAgICAgICAgbWVtYmVycy5hZGQobWVtYmVyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQobWVtYmVyLmtpbmQgPT0gaXIuUHJvY2VkdXJlS2luZC5NZXRob2QgfHwKICAgICAgICAgICAgbWVtYmVyLmtpbmQgPT0gaXIuUHJvY2VkdXJlS2luZC5HZXR0ZXIgfHwKICAgICAgICAgICAgbWVtYmVyLmtpbmQgPT0gaXIuUHJvY2VkdXJlS2luZC5PcGVyYXRvcik7CiAgICAgICAgX21lbWJlck1hcFtuYW1lXSA9IG1lbWJlcjsKICAgICAgICBtZW1iZXJzLmFkZChtZW1iZXIpOwogICAgICB9CiAgICB9CgogICAgdm9pZCBhZGRDb25zdHJ1Y3RvcnMoaXIuQ2xhc3MgYykgewogICAgICBmb3IgKGlyLkNvbnN0cnVjdG9yIG1lbWJlciBpbiBjLmNvbnN0cnVjdG9ycykgewogICAgICAgIHZhciBuYW1lID0gbWVtYmVyLm5hbWUubmFtZTsKICAgICAgICBhc3NlcnQoIW5hbWUuY29udGFpbnMoJyMnKSk7CiAgICAgICAgX2NvbnN0cnVjdG9yTWFwW25hbWVdID0gbWVtYmVyOwogICAgICB9CiAgICB9CgogICAgaW50IG1peGluTWVtYmVyQ291bnQgPSAwOwoKICAgIGlmIChjbHMubWl4ZWRJbkNsYXNzICE9IG51bGwpIHsKICAgICAgQ2xvbmVWaXNpdG9yIGNsb25lVmlzaXRvcjsKICAgICAgZm9yIChpci5GaWVsZCBmaWVsZCBpbiBjbHMubWl4ZWRJbkNsYXNzLm1peGluLmZpZWxkcykgewogICAgICAgIGlmIChmaWVsZC5jb250YWluc1N1cGVyQ2FsbHMpIHsKICAgICAgICAgIF9pc1N1cGVyTWl4aW5BcHBsaWNhdGlvbiA9IHRydWU7CiAgICAgICAgICBjbG9uZVZpc2l0b3IgPz89IG5ldyBDbG9uZVZpc2l0b3IoCiAgICAgICAgICAgICAgdHlwZVN1YnN0aXR1dGlvbjogZ2V0U3Vic3RpdHV0aW9uTWFwKGNscy5taXhlZEluVHlwZSkpOwogICAgICAgICAgY2xzLmFkZE1lbWJlcihjbG9uZVZpc2l0b3IuY2xvbmUoZmllbGQpKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBhZGRGaWVsZChmaWVsZCwgaW5jbHVkZVN0YXRpYzogZmFsc2UpOwogICAgICB9CiAgICAgIGZvciAoaXIuUHJvY2VkdXJlIHByb2NlZHVyZSBpbiBjbHMubWl4ZWRJbkNsYXNzLm1peGluLnByb2NlZHVyZXMpIHsKICAgICAgICBpZiAocHJvY2VkdXJlLmNvbnRhaW5zU3VwZXJDYWxscykgewogICAgICAgICAgX2lzU3VwZXJNaXhpbkFwcGxpY2F0aW9uID0gdHJ1ZTsKICAgICAgICAgIGNsb25lVmlzaXRvciA/Pz0gbmV3IENsb25lVmlzaXRvcigKICAgICAgICAgICAgICB0eXBlU3Vic3RpdHV0aW9uOiBnZXRTdWJzdGl0dXRpb25NYXAoY2xzLm1peGVkSW5UeXBlKSk7CiAgICAgICAgICBjbHMuYWRkTWVtYmVyKGNsb25lVmlzaXRvci5jbG9uZShwcm9jZWR1cmUpKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBhZGRQcm9jZWR1cmUocHJvY2VkdXJlLAogICAgICAgICAgICBpbmNsdWRlU3RhdGljOiBmYWxzZSwgaW5jbHVkZU5vU3VjaE1ldGhvZEZvcndhcmRlcnM6IGZhbHNlKTsKICAgICAgfQogICAgICBtZXJnZVNvcnQobWVtYmVycywgY29tcGFyZTogb3JkZXJCeUZpbGVPZmZzZXQpOwogICAgICBtaXhpbk1lbWJlckNvdW50ID0gbWVtYmVycy5sZW5ndGg7CiAgICB9CgogICAgZm9yIChpci5GaWVsZCBtZW1iZXIgaW4gY2xzLmZpZWxkcykgewogICAgICBhZGRGaWVsZChtZW1iZXIsIGluY2x1ZGVTdGF0aWM6IHRydWUpOwogICAgfQogICAgYWRkQ29uc3RydWN0b3JzKGNscyk7CiAgICBmb3IgKGlyLlByb2NlZHVyZSBtZW1iZXIgaW4gY2xzLnByb2NlZHVyZXMpIHsKICAgICAgYWRkUHJvY2VkdXJlKG1lbWJlciwKICAgICAgICAgIGluY2x1ZGVTdGF0aWM6IHRydWUsIGluY2x1ZGVOb1N1Y2hNZXRob2RGb3J3YXJkZXJzOiB0cnVlKTsKICAgIH0KCiAgICBpZiAoaXNVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbiAmJiBfY29uc3RydWN0b3JNYXAuaXNFbXB0eSkgewogICAgICAvLyBFbnN1cmUgdGhhdCBjb25zdHJ1Y3RvcnMgYXJlIGNyZWF0ZWQgZm9yIHRoZSBzdXBlcmNsYXNzIGluIGNhc2UgaXQKICAgICAgLy8gaXMgYWxzbyBhbiB1bm5hbWVkIG1peGluIGFwcGxpY2F0aW9uLgogICAgICBDbGFzc0VudGl0eSBzdXBlcmNsYXNzID0gZWxlbWVudE1hcC5nZXRDbGFzcyhjbHMuc3VwZXJjbGFzcyk7CiAgICAgIGVsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50Lmxvb2t1cENvbnN0cnVjdG9yKHN1cGVyY2xhc3MsICcnKTsKCiAgICAgIC8vIFVubmFtZWQgbWl4aW4gYXBwbGljYXRpb25zIGhhdmUgbm8gY29uc3RydWN0b3JzIHdoZW4gcmVhZCBmcm9tIC5kaWxsLgogICAgICAvLyBGb3IgZWFjaCBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yIGluIHRoZSBzdXBlcmNsYXNzIHdlIG1ha2UgYQogICAgICAvLyBjb3JyZXNwb25kaW5nIGZvcndhcmRpbmcgY29uc3RydWN0b3IgaW4gdGhlIHN1YmNsYXNzLgogICAgICAvLwogICAgICAvLyBUaGlzIGNvZGUgaXMgY29waWVkIGZyb20KICAgICAgLy8gJ3BhY2thZ2U6a2VybmVsL3RyYW5zZm9ybWF0aW9ucy9taXhpbl9mdWxsX3Jlc29sdXRpb24uZGFydCcKICAgICAgdmFyIHN1cGVyY2xhc3NTdWJzdGl0dXRpb24gPSBnZXRTdWJzdGl0dXRpb25NYXAoY2xzLnN1cGVydHlwZSk7CiAgICAgIHZhciBzdXBlcmNsYXNzQ2xvbmVyID0KICAgICAgICAgIG5ldyBDbG9uZVZpc2l0b3IodHlwZVN1YnN0aXR1dGlvbjogc3VwZXJjbGFzc1N1YnN0aXR1dGlvbik7CgogICAgICBmb3IgKHZhciBzdXBlcmNsYXNzQ29uc3RydWN0b3IgaW4gY2xzLnN1cGVyY2xhc3MuY29uc3RydWN0b3JzKSB7CiAgICAgICAgdmFyIGZvcndhcmRpbmdDb25zdHJ1Y3RvciA9IF9idWlsZEZvcndhcmRpbmdDb25zdHJ1Y3RvcigKICAgICAgICAgICAgc3VwZXJjbGFzc0Nsb25lciwgc3VwZXJjbGFzc0NvbnN0cnVjdG9yKTsKICAgICAgICBjbHMuYWRkTWVtYmVyKGZvcndhcmRpbmdDb25zdHJ1Y3Rvcik7CiAgICAgICAgX2NvbnN0cnVjdG9yTWFwW2ZvcndhcmRpbmdDb25zdHJ1Y3Rvci5uYW1lLm5hbWVdID0KICAgICAgICAgICAgZm9yd2FyZGluZ0NvbnN0cnVjdG9yOwogICAgICB9CiAgICB9CgogICAgbWVyZ2VTb3J0KG1lbWJlcnMsIHN0YXJ0OiBtaXhpbk1lbWJlckNvdW50LCBjb21wYXJlOiBvcmRlckJ5RmlsZU9mZnNldCk7CiAgICBfbWVtYmVycyA9IG1lbWJlcnM7CiAgfQoKICBAb3ZlcnJpZGUKICBNZW1iZXJFbnRpdHkgbG9va3VwTWVtYmVyKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsIFN0cmluZyBuYW1lLAogICAgICB7Ym9vbCBzZXR0ZXI6IGZhbHNlfSkgewogICAgX2Vuc3VyZU1hcHMoZWxlbWVudE1hcCk7CiAgICBpci5NZW1iZXIgbWVtYmVyID0gc2V0dGVyID8gX3NldHRlck1hcFtuYW1lXSA6IF9tZW1iZXJNYXBbbmFtZV07CiAgICByZXR1cm4gbWVtYmVyICE9IG51bGwgPyBlbGVtZW50TWFwLmdldE1lbWJlcihtZW1iZXIpIDogbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaE1lbWJlcihJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwLCB2b2lkIGYoTWVtYmVyRW50aXR5IG1lbWJlcikpIHsKICAgIF9lbnN1cmVNYXBzKGVsZW1lbnRNYXApOwogICAgX21lbWJlcnMuZm9yRWFjaCgoaXIuTWVtYmVyIG1lbWJlcikgewogICAgICBmKGVsZW1lbnRNYXAuZ2V0TWVtYmVyKG1lbWJlcikpOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdHJ1Y3RvckVudGl0eSBsb29rdXBDb25zdHJ1Y3RvcihJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwLCBTdHJpbmcgbmFtZSkgewogICAgX2Vuc3VyZU1hcHMoZWxlbWVudE1hcCk7CiAgICBpci5NZW1iZXIgY29uc3RydWN0b3IgPSBfY29uc3RydWN0b3JNYXBbbmFtZV07CiAgICByZXR1cm4gY29uc3RydWN0b3IgIT0gbnVsbCA/IGVsZW1lbnRNYXAuZ2V0Q29uc3RydWN0b3IoY29uc3RydWN0b3IpIDogbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaENvbnN0cnVjdG9yKAogICAgICBJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwLCB2b2lkIGYoQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IpKSB7CiAgICBfZW5zdXJlTWFwcyhlbGVtZW50TWFwKTsKICAgIF9jb25zdHJ1Y3Rvck1hcC52YWx1ZXMuZm9yRWFjaCgoaXIuTWVtYmVyIGNvbnN0cnVjdG9yKSB7CiAgICAgIGYoZWxlbWVudE1hcC5nZXRDb25zdHJ1Y3Rvcihjb25zdHJ1Y3RvcikpOwogICAgfSk7CiAgfQoKICB2b2lkIGFkZENvbnN0cnVjdG9yQm9keShDb25zdHJ1Y3RvckJvZHlFbnRpdHkgY29uc3RydWN0b3JCb2R5KSB7CiAgICBfY29uc3RydWN0b3JCb2R5TGlzdCA/Pz0gPENvbnN0cnVjdG9yQm9keUVudGl0eT5bXTsKICAgIF9jb25zdHJ1Y3RvckJvZHlMaXN0LmFkZChjb25zdHJ1Y3RvckJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoQ29uc3RydWN0b3JCb2R5KHZvaWQgZihDb25zdHJ1Y3RvckJvZHlFbnRpdHkgY29uc3RydWN0b3IpKSB7CiAgICBfY29uc3RydWN0b3JCb2R5TGlzdD8uZm9yRWFjaChmKTsKICB9CgogIEBvdmVycmlkZQogIEpDbGFzc0VudiBjb252ZXJ0KElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsCiAgICAgIE1hcDxNZW1iZXJFbnRpdHksIE1lbWJlclVzYWdlPiBsaXZlTWVtYmVyVXNhZ2UpIHsKICAgIE1hcDxTdHJpbmcsIGlyLk1lbWJlcj4gY29uc3RydWN0b3JNYXA7CiAgICBNYXA8U3RyaW5nLCBpci5NZW1iZXI+IG1lbWJlck1hcDsKICAgIE1hcDxTdHJpbmcsIGlyLk1lbWJlcj4gc2V0dGVyTWFwOwogICAgTGlzdDxpci5NZW1iZXI+IG1lbWJlcnM7CiAgICBpZiAoX2NvbnN0cnVjdG9yTWFwID09IG51bGwpIHsKICAgICAgY29uc3RydWN0b3JNYXAgPSBjb25zdCA8U3RyaW5nLCBpci5NZW1iZXI+e307CiAgICB9IGVsc2UgewogICAgICBjb25zdHJ1Y3Rvck1hcCA9IDxTdHJpbmcsIGlyLk1lbWJlcj57fTsKICAgICAgX2NvbnN0cnVjdG9yTWFwLmZvckVhY2goKFN0cmluZyBuYW1lLCBpci5NZW1iZXIgbm9kZSkgewogICAgICAgIE1lbWJlckVudGl0eSBtZW1iZXIgPSBlbGVtZW50TWFwLmdldE1lbWJlcihub2RlKTsKICAgICAgICBpZiAobGl2ZU1lbWJlclVzYWdlLmNvbnRhaW5zS2V5KG1lbWJlcikpIHsKICAgICAgICAgIGNvbnN0cnVjdG9yTWFwW25hbWVdID0gbm9kZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgaWYgKF9tZW1iZXJNYXAgPT0gbnVsbCkgewogICAgICBtZW1iZXJNYXAgPSBjb25zdCA8U3RyaW5nLCBpci5NZW1iZXI+e307CiAgICB9IGVsc2UgewogICAgICBtZW1iZXJNYXAgPSA8U3RyaW5nLCBpci5NZW1iZXI+e307CiAgICAgIF9tZW1iZXJNYXAuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIGlyLk1lbWJlciBub2RlKSB7CiAgICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IGVsZW1lbnRNYXAuZ2V0TWVtYmVyKG5vZGUpOwogICAgICAgIGlmIChsaXZlTWVtYmVyVXNhZ2UuY29udGFpbnNLZXkobWVtYmVyKSkgewogICAgICAgICAgbWVtYmVyTWFwW25hbWVdID0gbm9kZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgaWYgKF9zZXR0ZXJNYXAgPT0gbnVsbCkgewogICAgICBzZXR0ZXJNYXAgPSBjb25zdCA8U3RyaW5nLCBpci5NZW1iZXI+e307CiAgICB9IGVsc2UgewogICAgICBzZXR0ZXJNYXAgPSA8U3RyaW5nLCBpci5NZW1iZXI+e307CiAgICAgIF9zZXR0ZXJNYXAuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIGlyLk1lbWJlciBub2RlKSB7CiAgICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IGVsZW1lbnRNYXAuZ2V0TWVtYmVyKG5vZGUpOwogICAgICAgIGlmIChsaXZlTWVtYmVyVXNhZ2UuY29udGFpbnNLZXkobWVtYmVyKSkgewogICAgICAgICAgc2V0dGVyTWFwW25hbWVdID0gbm9kZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgaWYgKF9tZW1iZXJzID09IG51bGwpIHsKICAgICAgbWVtYmVycyA9IGNvbnN0IDxpci5NZW1iZXI+W107CiAgICB9IGVsc2UgewogICAgICBtZW1iZXJzID0gPGlyLk1lbWJlcj5bXTsKICAgICAgX21lbWJlcnMuZm9yRWFjaCgoaXIuTWVtYmVyIG5vZGUpIHsKICAgICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0gZWxlbWVudE1hcC5nZXRNZW1iZXIobm9kZSk7CiAgICAgICAgaWYgKGxpdmVNZW1iZXJVc2FnZS5jb250YWluc0tleShtZW1iZXIpKSB7CiAgICAgICAgICBtZW1iZXJzLmFkZChub2RlKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIG5ldyBKQ2xhc3NFbnZJbXBsKGNscywgY29uc3RydWN0b3JNYXAsIG1lbWJlck1hcCwgc2V0dGVyTWFwLCBtZW1iZXJzLAogICAgICAgIF9pc1N1cGVyTWl4aW5BcHBsaWNhdGlvbiA/PyBmYWxzZSk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBLQ2xhc3NEYXRhIHsKICBpci5DbGFzcyBnZXQgbm9kZTsKCiAgSW50ZXJmYWNlVHlwZSBnZXQgdGhpc1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBnZXQgcmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIGdldCBzdXBlcnR5cGU7CiAgSW50ZXJmYWNlVHlwZSBnZXQgbWl4ZWRJblR5cGU7CiAgTGlzdDxJbnRlcmZhY2VUeXBlPiBnZXQgaW50ZXJmYWNlczsKICBPcmRlcmVkVHlwZVNldCBnZXQgb3JkZXJlZFR5cGVTZXQ7CiAgRGFydFR5cGUgZ2V0IGNhbGxUeXBlOwoKICBib29sIGdldCBpc0VudW1DbGFzczsKICBib29sIGdldCBpc01peGluQXBwbGljYXRpb247CgogIEl0ZXJhYmxlPENvbnN0YW50VmFsdWU+IGdldE1ldGFkYXRhKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApOwoKICAvLy8gQ29udmVydCB0aGlzIFtLQ2xhc3NEYXRhXSB0byB0aGUgY29ycmVzcG9uZGluZyBbSkNsYXNzRGF0YV0uCiAgSkNsYXNzRGF0YSBjb252ZXJ0KCk7Cn0KCmNsYXNzIEtDbGFzc0RhdGFJbXBsIGltcGxlbWVudHMgS0NsYXNzRGF0YSB7CiAgQG92ZXJyaWRlCiAgZmluYWwgaXIuQ2xhc3Mgbm9kZTsKICBAb3ZlcnJpZGUKICBib29sIGlzTWl4aW5BcHBsaWNhdGlvbjsKICBib29sIGlzQ2FsbFR5cGVDb21wdXRlZCA9IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlOwogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgcmF3VHlwZTsKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIHN1cGVydHlwZTsKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIG1peGVkSW5UeXBlOwogIEBvdmVycmlkZQogIExpc3Q8SW50ZXJmYWNlVHlwZT4gaW50ZXJmYWNlczsKICBAb3ZlcnJpZGUKICBPcmRlcmVkVHlwZVNldCBvcmRlcmVkVHlwZVNldDsKCiAgSXRlcmFibGU8Q29uc3RhbnRWYWx1ZT4gX21ldGFkYXRhOwoKICBLQ2xhc3NEYXRhSW1wbCh0aGlzLm5vZGUpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0VudW1DbGFzcyA9PiBub2RlLmlzRW51bTsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0IGNhbGxUeXBlID0+IG51bGw7CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPENvbnN0YW50VmFsdWU+IGdldE1ldGFkYXRhKAogICAgICBjb3ZhcmlhbnQgS2VybmVsVG9FbGVtZW50TWFwSW1wbCBlbGVtZW50TWFwKSB7CiAgICByZXR1cm4gX21ldGFkYXRhID8/PSBlbGVtZW50TWFwLmdldE1ldGFkYXRhKG5vZGUuYW5ub3RhdGlvbnMpOwogIH0KCiAgQG92ZXJyaWRlCiAgSkNsYXNzRGF0YSBjb252ZXJ0KCkgewogICAgcmV0dXJuIG5ldyBKQ2xhc3NEYXRhSW1wbChub2RlLCBuZXcgUmVndWxhckNsYXNzRGVmaW5pdGlvbihub2RlKSk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBLTWVtYmVyRGF0YSB7CiAgaXIuTWVtYmVyIGdldCBub2RlOwoKICBNYXA8aXIuRXhwcmVzc2lvbiwgaXIuRGFydFR5cGU+IHN0YXRpY1R5cGVzOwoKICBJdGVyYWJsZTxDb25zdGFudFZhbHVlPiBnZXRNZXRhZGF0YShJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwKTsKCiAgSW50ZXJmYWNlVHlwZSBnZXRNZW1iZXJUaGlzVHlwZShKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwKTsKCiAgQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgZ2V0IGNsYXNzVHlwZVZhcmlhYmxlQWNjZXNzOwoKICAvLy8gQ29udmVydCB0aGlzIFtLTWVtYmVyRGF0YV0gdG8gdGhlIGNvcnJlc3BvbmRpbmcgW0pNZW1iZXJEYXRhXS4KICBKTWVtYmVyRGF0YSBjb252ZXJ0KCk7Cn0KCmFic3RyYWN0IGNsYXNzIEtNZW1iZXJEYXRhSW1wbCBpbXBsZW1lbnRzIEtNZW1iZXJEYXRhIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBpci5NZW1iZXIgbm9kZTsKCiAgSXRlcmFibGU8Q29uc3RhbnRWYWx1ZT4gX21ldGFkYXRhOwoKICBAb3ZlcnJpZGUKICBNYXA8aXIuRXhwcmVzc2lvbiwgaXIuRGFydFR5cGU+IHN0YXRpY1R5cGVzOwoKICBLTWVtYmVyRGF0YUltcGwodGhpcy5ub2RlKTsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Q29uc3RhbnRWYWx1ZT4gZ2V0TWV0YWRhdGEoCiAgICAgIGNvdmFyaWFudCBLZXJuZWxUb0VsZW1lbnRNYXBJbXBsIGVsZW1lbnRNYXApIHsKICAgIHJldHVybiBfbWV0YWRhdGEgPz89IGVsZW1lbnRNYXAuZ2V0TWV0YWRhdGEobm9kZS5hbm5vdGF0aW9ucyk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldE1lbWJlclRoaXNUeXBlKEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApIHsKICAgIE1lbWJlckVudGl0eSBtZW1iZXIgPSBlbGVtZW50TWFwLmdldE1lbWJlcihub2RlKTsKICAgIENsYXNzRW50aXR5IGNscyA9IG1lbWJlci5lbmNsb3NpbmdDbGFzczsKICAgIGlmIChjbHMgIT0gbnVsbCkgewogICAgICByZXR1cm4gZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQuZ2V0VGhpc1R5cGUoY2xzKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgS0Z1bmN0aW9uRGF0YSBpbXBsZW1lbnRzIEtNZW1iZXJEYXRhIHsKICBGdW5jdGlvblR5cGUgZ2V0RnVuY3Rpb25UeXBlKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApOwoKICBMaXN0PFR5cGVWYXJpYWJsZVR5cGU+IGdldEZ1bmN0aW9uVHlwZVZhcmlhYmxlcyhJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwKTsKCiAgdm9pZCBmb3JFYWNoUGFyYW1ldGVyKEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsCiAgICAgIHZvaWQgZihEYXJ0VHlwZSB0eXBlLCBTdHJpbmcgbmFtZSwgQ29uc3RhbnRWYWx1ZSBkZWZhdWx0VmFsdWUpKTsKfQoKYWJzdHJhY3QgY2xhc3MgS0Z1bmN0aW9uRGF0YU1peGluIGltcGxlbWVudHMgS0Z1bmN0aW9uRGF0YSB7CiAgaXIuRnVuY3Rpb25Ob2RlIGdldCBmdW5jdGlvbk5vZGU7CiAgTGlzdDxUeXBlVmFyaWFibGVUeXBlPiBfdHlwZVZhcmlhYmxlczsKCiAgQG92ZXJyaWRlCiAgTGlzdDxUeXBlVmFyaWFibGVUeXBlPiBnZXRGdW5jdGlvblR5cGVWYXJpYWJsZXMoCiAgICAgIGNvdmFyaWFudCBLZXJuZWxUb0VsZW1lbnRNYXBJbXBsIGVsZW1lbnRNYXApIHsKICAgIGlmIChfdHlwZVZhcmlhYmxlcyA9PSBudWxsKSB7CiAgICAgIGlmIChmdW5jdGlvbk5vZGUudHlwZVBhcmFtZXRlcnMuaXNFbXB0eSkgewogICAgICAgIF90eXBlVmFyaWFibGVzID0gY29uc3QgPFR5cGVWYXJpYWJsZVR5cGU+W107CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaXIuVHJlZU5vZGUgcGFyZW50ID0gZnVuY3Rpb25Ob2RlLnBhcmVudDsKICAgICAgICBpZiAocGFyZW50IGlzIGlyLkNvbnN0cnVjdG9yIHx8CiAgICAgICAgICAgIChwYXJlbnQgaXMgaXIuUHJvY2VkdXJlICYmCiAgICAgICAgICAgICAgICBwYXJlbnQua2luZCA9PSBpci5Qcm9jZWR1cmVLaW5kLkZhY3RvcnkpKSB7CiAgICAgICAgICBfdHlwZVZhcmlhYmxlcyA9IGNvbnN0IDxUeXBlVmFyaWFibGVUeXBlPltdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBfdHlwZVZhcmlhYmxlcyA9IGZ1bmN0aW9uTm9kZS50eXBlUGFyYW1ldGVycwogICAgICAgICAgICAgIC5tYXA8VHlwZVZhcmlhYmxlVHlwZT4oKGlyLlR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlcikgewogICAgICAgICAgICByZXR1cm4gZWxlbWVudE1hcAogICAgICAgICAgICAgICAgLmdldERhcnRUeXBlKG5ldyBpci5UeXBlUGFyYW1ldGVyVHlwZSh0eXBlUGFyYW1ldGVyKSk7CiAgICAgICAgICB9KS50b0xpc3QoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfdHlwZVZhcmlhYmxlczsKICB9Cn0KCmNsYXNzIEtGdW5jdGlvbkRhdGFJbXBsIGV4dGVuZHMgS01lbWJlckRhdGFJbXBsCiAgICB3aXRoIEtGdW5jdGlvbkRhdGFNaXhpbgogICAgaW1wbGVtZW50cyBLRnVuY3Rpb25EYXRhIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb25Ob2RlOwogIEZ1bmN0aW9uVHlwZSBfdHlwZTsKCiAgS0Z1bmN0aW9uRGF0YUltcGwoaXIuTWVtYmVyIG5vZGUsIHRoaXMuZnVuY3Rpb25Ob2RlKSA6IHN1cGVyKG5vZGUpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvblR5cGUgZ2V0RnVuY3Rpb25UeXBlKGNvdmFyaWFudCBLZXJuZWxUb0VsZW1lbnRNYXBJbXBsIGVsZW1lbnRNYXApIHsKICAgIHJldHVybiBfdHlwZSA/Pz0gZWxlbWVudE1hcC5nZXRGdW5jdGlvblR5cGUoZnVuY3Rpb25Ob2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaFBhcmFtZXRlcihKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwLAogICAgICB2b2lkIGYoRGFydFR5cGUgdHlwZSwgU3RyaW5nIG5hbWUsIENvbnN0YW50VmFsdWUgZGVmYXVsdFZhbHVlKSkgewogICAgdm9pZCBoYW5kbGVQYXJhbWV0ZXIoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlLCB7Ym9vbCBpc09wdGlvbmFsOiB0cnVlfSkgewogICAgICBEYXJ0VHlwZSB0eXBlID0gZWxlbWVudE1hcC5nZXREYXJ0VHlwZShub2RlLnR5cGUpOwogICAgICBTdHJpbmcgbmFtZSA9IG5vZGUubmFtZTsKICAgICAgQ29uc3RhbnRWYWx1ZSBkZWZhdWx0VmFsdWU7CiAgICAgIGlmIChpc09wdGlvbmFsKSB7CiAgICAgICAgaWYgKG5vZGUuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgZGVmYXVsdFZhbHVlID0gZWxlbWVudE1hcC5nZXRDb25zdGFudFZhbHVlKG5vZGUuaW5pdGlhbGl6ZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBuZXcgTnVsbENvbnN0YW50VmFsdWUoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZih0eXBlLCBuYW1lLCBkZWZhdWx0VmFsdWUpOwogICAgfQoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnVuY3Rpb25Ob2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGhhbmRsZVBhcmFtZXRlcihmdW5jdGlvbk5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnNbaV0sCiAgICAgICAgICBpc09wdGlvbmFsOiBpID49IGZ1bmN0aW9uTm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50KTsKICAgIH0KICAgIGZ1bmN0aW9uTm9kZS5uYW1lZFBhcmFtZXRlcnMudG9MaXN0KCkKICAgICAgLi5zb3J0KG5hbWVkT3JkZXJpbmcpCiAgICAgIC4uZm9yRWFjaChoYW5kbGVQYXJhbWV0ZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25EYXRhIGNvbnZlcnQoKSB7CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uRGF0YUltcGwoCiAgICAgICAgbm9kZSwgZnVuY3Rpb25Ob2RlLCBuZXcgUmVndWxhck1lbWJlckRlZmluaXRpb24obm9kZSksIHN0YXRpY1R5cGVzKTsKICB9CgogIEBvdmVycmlkZQogIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzIGdldCBjbGFzc1R5cGVWYXJpYWJsZUFjY2VzcyB7CiAgICBpZiAobm9kZS5pc0luc3RhbmNlTWVtYmVyKSByZXR1cm4gQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MucHJvcGVydHk7CiAgICByZXR1cm4gQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3Mubm9uZTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIEtDb25zdHJ1Y3RvckRhdGEgZXh0ZW5kcyBLRnVuY3Rpb25EYXRhIHsKICBDb25zdGFudENvbnN0cnVjdG9yIGdldENvbnN0cnVjdG9yQ29uc3RhbnQoCiAgICAgIEtlcm5lbFRvRWxlbWVudE1hcEltcGwgZWxlbWVudE1hcCwgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IpOwp9CgpjbGFzcyBLQ29uc3RydWN0b3JEYXRhSW1wbCBleHRlbmRzIEtGdW5jdGlvbkRhdGFJbXBsCiAgICBpbXBsZW1lbnRzIEtDb25zdHJ1Y3RvckRhdGEgewogIENvbnN0YW50Q29uc3RydWN0b3IgX2NvbnN0YW50Q29uc3RydWN0b3I7CiAgQ29uc3RydWN0b3JCb2R5RW50aXR5IGNvbnN0cnVjdG9yQm9keTsKCiAgS0NvbnN0cnVjdG9yRGF0YUltcGwoaXIuTWVtYmVyIG5vZGUsIGlyLkZ1bmN0aW9uTm9kZSBmdW5jdGlvbk5vZGUpCiAgICAgIDogc3VwZXIobm9kZSwgZnVuY3Rpb25Ob2RlKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRDb25zdHJ1Y3RvciBnZXRDb25zdHJ1Y3RvckNvbnN0YW50KAogICAgICBLZXJuZWxUb0VsZW1lbnRNYXBJbXBsIGVsZW1lbnRNYXAsIENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yKSB7CiAgICBpZiAoX2NvbnN0YW50Q29uc3RydWN0b3IgPT0gbnVsbCkgewogICAgICBpZiAobm9kZSBpcyBpci5Db25zdHJ1Y3RvciAmJiBjb25zdHJ1Y3Rvci5pc0NvbnN0KSB7CiAgICAgICAgX2NvbnN0YW50Q29uc3RydWN0b3IgPQogICAgICAgICAgICBuZXcgQ29uc3RhbnRpZmllcihlbGVtZW50TWFwKS5jb21wdXRlQ29uc3RhbnRDb25zdHJ1Y3Rvcihub2RlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgY29uc3RydWN0b3IsCiAgICAgICAgICAgICJVbmV4cGVjdGVkIGNvbnN0cnVjdG9yICRjb25zdHJ1Y3RvciBpbiAiCiAgICAgICAgICAgICJDb25zdHJ1Y3RvckRhdGFJbXBsLl9nZXRDb25zdHJ1Y3RvckNvbnN0YW50Iik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfY29uc3RhbnRDb25zdHJ1Y3RvcjsKICB9CgogIEBvdmVycmlkZQogIEpDb25zdHJ1Y3RvckRhdGEgY29udmVydCgpIHsKICAgIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbjsKICAgIGlmIChub2RlIGlzIGlyLkNvbnN0cnVjdG9yKSB7CiAgICAgIGRlZmluaXRpb24gPSBuZXcgU3BlY2lhbE1lbWJlckRlZmluaXRpb24obm9kZSwgTWVtYmVyS2luZC5jb25zdHJ1Y3Rvcik7CiAgICB9IGVsc2UgewogICAgICBkZWZpbml0aW9uID0gbmV3IFJlZ3VsYXJNZW1iZXJEZWZpbml0aW9uKG5vZGUpOwogICAgfQogICAgcmV0dXJuIG5ldyBKQ29uc3RydWN0b3JEYXRhSW1wbCgKICAgICAgICBub2RlLCBmdW5jdGlvbk5vZGUsIGRlZmluaXRpb24sIHN0YXRpY1R5cGVzKTsKICB9CgogIEBvdmVycmlkZQogIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzIGdldCBjbGFzc1R5cGVWYXJpYWJsZUFjY2VzcyA9PgogICAgICBDbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcy5wYXJhbWV0ZXI7Cn0KCmFic3RyYWN0IGNsYXNzIEtGaWVsZERhdGEgZXh0ZW5kcyBLTWVtYmVyRGF0YSB7CiAgRGFydFR5cGUgZ2V0RmllbGRUeXBlKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApOwoKICBDb25zdGFudEV4cHJlc3Npb24gZ2V0RmllbGRDb25zdGFudEV4cHJlc3Npb24oCiAgICAgIEtlcm5lbFRvRWxlbWVudE1hcEltcGwgZWxlbWVudE1hcCk7Cn0KCmNsYXNzIEtGaWVsZERhdGFJbXBsIGV4dGVuZHMgS01lbWJlckRhdGFJbXBsIGltcGxlbWVudHMgS0ZpZWxkRGF0YSB7CiAgRGFydFR5cGUgX3R5cGU7CiAgQ29uc3RhbnRFeHByZXNzaW9uIF9jb25zdGFudEV4cHJlc3Npb247CgogIEtGaWVsZERhdGFJbXBsKGlyLkZpZWxkIG5vZGUpIDogc3VwZXIobm9kZSk7CgogIEBvdmVycmlkZQogIGlyLkZpZWxkIGdldCBub2RlID0+IHN1cGVyLm5vZGU7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldEZpZWxkVHlwZShjb3ZhcmlhbnQgS2VybmVsVG9FbGVtZW50TWFwSW1wbCBlbGVtZW50TWFwKSB7CiAgICByZXR1cm4gX3R5cGUgPz89IGVsZW1lbnRNYXAuZ2V0RGFydFR5cGUobm9kZS50eXBlKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiBnZXRGaWVsZENvbnN0YW50RXhwcmVzc2lvbigKICAgICAgS2VybmVsVG9FbGVtZW50TWFwSW1wbCBlbGVtZW50TWFwKSB7CiAgICBpZiAoX2NvbnN0YW50RXhwcmVzc2lvbiA9PSBudWxsKSB7CiAgICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgICBfY29uc3RhbnRFeHByZXNzaW9uID0KICAgICAgICAgICAgbmV3IENvbnN0YW50aWZpZXIoZWxlbWVudE1hcCkudmlzaXQobm9kZS5pbml0aWFsaXplcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKG5vZGUpLAogICAgICAgICAgICAiVW5leHBlY3RlZCBmaWVsZCAke25vZGV9IGluICIKICAgICAgICAgICAgIkZpZWxkRGF0YUltcGwuZ2V0RmllbGRDb25zdGFudCIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gX2NvbnN0YW50RXhwcmVzc2lvbjsKICB9CgogIEBvdmVycmlkZQogIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzIGdldCBjbGFzc1R5cGVWYXJpYWJsZUFjY2VzcyB7CiAgICBpZiAobm9kZS5pc0luc3RhbmNlTWVtYmVyKSByZXR1cm4gQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MuaW5zdGFuY2VGaWVsZDsKICAgIHJldHVybiBDbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcy5ub25lOwogIH0KCiAgQG92ZXJyaWRlCiAgSkZpZWxkRGF0YSBjb252ZXJ0KCkgewogICAgcmV0dXJuIG5ldyBKRmllbGREYXRhSW1wbCgKICAgICAgICBub2RlLCBuZXcgUmVndWxhck1lbWJlckRlZmluaXRpb24obm9kZSksIHN0YXRpY1R5cGVzKTsKICB9Cn0KCmNsYXNzIEtUeXBlZGVmRGF0YSB7CiAgZmluYWwgaXIuVHlwZWRlZiBub2RlOwogIGZpbmFsIFR5cGVkZWZFbnRpdHkgZWxlbWVudDsKICBmaW5hbCBUeXBlZGVmVHlwZSByYXdUeXBlOwoKICBLVHlwZWRlZkRhdGEodGhpcy5ub2RlLCB0aGlzLmVsZW1lbnQsIHRoaXMucmF3VHlwZSk7Cn0KCmNsYXNzIEtUeXBlVmFyaWFibGVEYXRhIHsKICBmaW5hbCBpci5UeXBlUGFyYW1ldGVyIG5vZGU7CiAgRGFydFR5cGUgX2JvdW5kOwogIERhcnRUeXBlIF9kZWZhdWx0VHlwZTsKCiAgS1R5cGVWYXJpYWJsZURhdGEodGhpcy5ub2RlKTsKCiAgRGFydFR5cGUgZ2V0Qm91bmQoSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCkgewogICAgcmV0dXJuIF9ib3VuZCA/Pz0gZWxlbWVudE1hcC5nZXREYXJ0VHlwZShub2RlLmJvdW5kKTsKICB9CgogIERhcnRUeXBlIGdldERlZmF1bHRUeXBlKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApIHsKICAgIC8vIFRPRE8oMzQ1MjIpOiBSZW1vdmUgYD8/IGNvbnN0IGlyLkR5bmFtaWNUeXBlKClgIHdoZW4gaXNzdWUgMzQ1MjIgaXMKICAgIC8vIGZpeGVkLgogICAgcmV0dXJuIF9kZWZhdWx0VHlwZSA/Pz0KICAgICAgICBlbGVtZW50TWFwLmdldERhcnRUeXBlKG5vZGUuZGVmYXVsdFR5cGUgPz8gY29uc3QgaXIuRHluYW1pY1R5cGUoKSk7CiAgfQoKICBKVHlwZVZhcmlhYmxlRGF0YSBjb3B5KCkgewogICAgcmV0dXJuIG5ldyBKVHlwZVZhcmlhYmxlRGF0YShub2RlKTsKICB9Cn0Kg6QATk48ARwBPyEBKCQrTgEZKSgjJCEhHhonHyIjKCABOBRBASUBQj0BNwEuJiEiCAYEAS82QQYEAR0fKjQiCAYEAUknGR0EATY1GSMEATsTGR8EAUU5AgFAFBwBJCUlAR0BGx0pLjYIBgQBQCcXHAQBMC0XIQQBHR4qKjIuKxQKJjgzEzMMKTEiMwwRFFEKCAYEAUE+GTkEATEZIjIkEw82CAYEAU0pMTgmJh4vDSk5OjMiCgoGHi8NKTk6MyIKCgY7BAIBFRwlPDMBHgFLRgQBSRtGIkAPOjslLB8ZLEoMCAYbBAFHSxsvBAIBHRs1FAE5JgFQDSQBPTkBUEsQRB0BKk4BSk8BLxtJAUsNSgFQJC83AgE2GRkdHSkqLwIBMisMFgEqJSU1IQExNAEbAUpGAQw+AQwlLiUEAU8uQzgBT0QVTD0cFAYBTh8fSBpDQDQqRioBTjgxMT0GMSwaUAZKRwEhKCo7BAEMOh0EATgkASgoLSEmATs1IyApEAghHiMIGwYBK0Q6TEkLHiAlETwvC0czEAg1LDcuJVASCggjIzVBMhIKKDsjHQ85NjcjHQgGASc2JSUoCAYBHgEkIT4oKy1GNBQKLwhKLCstRjgUCiBJCDYpBgEqLQYaMhtFBgFATC9ERwFPRT8JIkVGHUYBR0E2LjsjCAYBTRgEAQxEHh1FQQQBDE8dKicIBAEMUB0zUAQBDBtKHT0xCAQBQzgvBAEMSyYEAQwvOCsmJh0jNA0uPjozJwoKBh4vDSk5OjMiCgoGHi8NKTk6MyIKCgYcJQ0fKjozHQoKBlEsBAIBHBUBHh0fISYlGQEYHwFCAUMYAgEtDBcMGyMBDBoMGQwbDB0MIgwhASUBHQEMJwEMIQEMJzVDBAEMGUcEAgEdFgEvAUIBPgE3AUUZAgE4DBgBJQEMLwEeAQwnNUMEAQw/Ni0XPQYRBAIBNjsBTgEzRwIBPSQpAQwzNSIxNQ8yKCc8NxE3SB5HFwoIBhsEAgEwHB8MJhYBRgEMTj8EAQwzSFE5HyIYKEgRMgoIIwYBSTxBBiocIgQBDBshTQQBDDhIKQQCATguSQIBNSIsKQFFIwEMLkooOx9MDxIZNjwIBiEEAQwfISJODTYGJTYEAQw5KQIBMDQBMSoCAUUSKgEvAQwjAQxHOAQBDDErJxoeQw8SMSsvCAYgBAEMOE0pBAEMGR8/BAIBFRkfHQE3AgEaHxMZASABMToEATdLDhxMBAEdKAQCASRwYWNrYWdlOmNvbXBpbGVyL3NyYy9rZXJuZWwvZW52LmRhcnQ4c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvdW5pdmVyc2UvZnVuY3Rpb25fc2V0LmRhcnSnbS8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IHVuaXZlcnNlLmZ1bmN0aW9uX3NldDsKCmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnIHNob3cgSWRlbnRpZmllcnMsIFNlbGVjdG9yczsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci9hYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydCc7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnIHNob3cgSGFzaGluZywgU2V0bGV0OwppbXBvcnQgJ3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3I7CgovLyBUT0RPKGthc3BlcmwpOiBUaGlzIGFjdHVhbGx5IGhvbGRzIGdldHRlcnMgYW5kIHNldHRlcnMganVzdCBmaW5lCi8vIHRvbyBhbmQgc3RyaWNseSB0aGV5IGFyZW4ndCBmdW5jdGlvbnMuIE1heWJlIHRoaXMgbmVlZHMgYSBiZXR0ZXIKLy8gbmFtZSAtLSBzb21ldGhpbmcgbGlrZSBFbGVtZW50U2V0IHNlZW1zIGEgYml0IHRvbyBnZW5lcmljLgpjbGFzcyBGdW5jdGlvblNldCB7CiAgZmluYWwgTWFwPFN0cmluZywgRnVuY3Rpb25TZXROb2RlPiBfbm9kZXM7CgogIGZhY3RvcnkgRnVuY3Rpb25TZXQoSXRlcmFibGU8TWVtYmVyRW50aXR5PiBsaXZlSW5zdGFuY2VNZW1iZXJzKSB7CiAgICBNYXA8U3RyaW5nLCBGdW5jdGlvblNldE5vZGU+IG5vZGVzID0gbmV3IE1hcDxTdHJpbmcsIEZ1bmN0aW9uU2V0Tm9kZT4oKTsKICAgIGZvciAoTWVtYmVyRW50aXR5IG1lbWJlciBpbiBsaXZlSW5zdGFuY2VNZW1iZXJzKSB7CiAgICAgIFN0cmluZyBuYW1lID0gbWVtYmVyLm5hbWU7CiAgICAgIChub2Rlc1tuYW1lXSA/Pz0gbmV3IEZ1bmN0aW9uU2V0Tm9kZShuYW1lKSkuYWRkKG1lbWJlcik7CiAgICB9CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uU2V0LmludGVybmFsKG5vZGVzKTsKICB9CgogIEZ1bmN0aW9uU2V0LmludGVybmFsKHRoaXMuX25vZGVzKTsKCiAgYm9vbCBjb250YWlucyhNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgYXNzZXJ0KGVsZW1lbnQuaXNJbnN0YW5jZU1lbWJlcik7CiAgICBhc3NlcnQoIWVsZW1lbnQuaXNBYnN0cmFjdCk7CiAgICBTdHJpbmcgbmFtZSA9IGVsZW1lbnQubmFtZTsKICAgIEZ1bmN0aW9uU2V0Tm9kZSBub2RlID0gX25vZGVzW25hbWVdOwogICAgcmV0dXJuIChub2RlICE9IG51bGwpID8gbm9kZS5jb250YWlucyhlbGVtZW50KSA6IGZhbHNlOwogIH0KCiAgLy8vIFJldHVybnMgYWxsIHRoZSBmdW5jdGlvbnMgdGhhdCBtYXkgYmUgaW52b2tlZCB3aXRoIHRoZSBbc2VsZWN0b3JdIG9uIGEKICAvLy8gcmVjZWl2ZXIgd2l0aCB0aGUgZ2l2ZW4gW2NvbnN0cmFpbnRdLiBUaGUgcmV0dXJuZWQgZWxlbWVudHMgbWF5IGluY2x1ZGUKICAvLy8gbm9TdWNoTWV0aG9kIGhhbmRsZXJzIHRoYXQgYXJlIHBvdGVudGlhbCB0YXJnZXRzIGluZGlyZWN0bHkgdGhyb3VnaCB0aGUKICAvLy8gbm9TdWNoTWV0aG9kIG1lY2hhbmlzbS4KICBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IGZpbHRlcigKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXIsIEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSB7CiAgICByZXR1cm4gcXVlcnkoc2VsZWN0b3IsIHJlY2VpdmVyLCBkb21haW4pLmZ1bmN0aW9uczsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBtYXNrIGZvciB0aGUgcG90ZW50aWFsIHJlY2VpdmVycyBvZiBhIGR5bmFtaWMgY2FsbCB0bwogIC8vLyBbc2VsZWN0b3JdIG9uIFtjb25zdHJhaW50XS4KICAvLy8KICAvLy8gVGhpcyB3aWxsIG5hcnJvdyB0aGUgY29uc3RyYWludHMgb2YgW2NvbnN0cmFpbnRdIHRvIGEgW1R5cGVNYXNrXSBvZiB0aGUKICAvLy8gc2V0IG9mIGNsYXNzZXMgdGhhdCBhY3R1YWxseSBpbXBsZW1lbnQgdGhlIHNlbGVjdGVkIG1lbWJlciBvciBpbXBsZW1lbnQKICAvLy8gdGhlIGhhbmRsaW5nICdub1N1Y2hNZXRob2QnIHdoZXJlIHRoZSBzZWxlY3RlZCBtZW1iZXIgaXMgdW5pbXBsZW1lbnRlZC4KICBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyVHlwZSgKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXIsIEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSB7CiAgICByZXR1cm4gcXVlcnkoc2VsZWN0b3IsIHJlY2VpdmVyLCBkb21haW4pLmNvbXB1dGVNYXNrKGRvbWFpbik7CiAgfQoKICBTZWxlY3Rvck1hc2sgX2NyZWF0ZVNlbGVjdG9yTWFzaygKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXIsIEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSB7CiAgICByZXR1cm4gcmVjZWl2ZXIgIT0gbnVsbAogICAgICAgID8gbmV3IFNlbGVjdG9yTWFzayhzZWxlY3RvciwgcmVjZWl2ZXIpCiAgICAgICAgOiBuZXcgU2VsZWN0b3JNYXNrKHNlbGVjdG9yLCBkb21haW4uZHluYW1pY1R5cGUpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHNldCBvZiBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdGhlIHRhcmdldCBvZiBhIGNhbGwgdG8KICAvLy8gW3NlbGVjdG9yXSBvbiBhIHJlY2VpdmVyIGNvbnN0cmFpbmVkIGJ5IFtjb25zdHJhaW50XSBpbmNsdWRpbmcKICAvLy8gJ25vU3VjaE1ldGhvZCcgbWV0aG9kcyB3aGVyZSBhcHBsaWNhYmxlLgogIEZ1bmN0aW9uU2V0UXVlcnkgcXVlcnkoCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyLCBBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgewogICAgU3RyaW5nIG5hbWUgPSBzZWxlY3Rvci5uYW1lOwogICAgU2VsZWN0b3JNYXNrIHNlbGVjdG9yTWFzayA9IF9jcmVhdGVTZWxlY3Rvck1hc2soc2VsZWN0b3IsIHJlY2VpdmVyLCBkb21haW4pOwogICAgU2VsZWN0b3JNYXNrIG5vU3VjaE1ldGhvZE1hc2sgPQogICAgICAgIG5ldyBTZWxlY3Rvck1hc2soU2VsZWN0b3JzLm5vU3VjaE1ldGhvZF8sIHNlbGVjdG9yTWFzay5yZWNlaXZlcik7CiAgICBGdW5jdGlvblNldE5vZGUgbm9kZSA9IF9ub2Rlc1tuYW1lXTsKICAgIEZ1bmN0aW9uU2V0Tm9kZSBub1N1Y2hNZXRob2RzID0gX25vZGVzW0lkZW50aWZpZXJzLm5vU3VjaE1ldGhvZF9dOwogICAgaWYgKG5vZGUgIT0gbnVsbCkgewogICAgICByZXR1cm4gbm9kZS5xdWVyeShzZWxlY3Rvck1hc2ssIGRvbWFpbiwgbm9TdWNoTWV0aG9kcywgbm9TdWNoTWV0aG9kTWFzayk7CiAgICB9CiAgICAvLyBJZiB0aGVyZSBpcyBubyBtZXRob2QgdGhhdCBtYXRjaGVzIFtzZWxlY3Rvcl0gd2Uga25vdyB3ZSBjYW4KICAgIC8vIG9ubHkgaGl0IFs6bm9TdWNoTWV0aG9kOl0uCiAgICBpZiAobm9TdWNoTWV0aG9kcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBjb25zdCBFbXB0eUZ1bmN0aW9uU2V0UXVlcnkoKTsKICAgIH0KICAgIHJldHVybiBub1N1Y2hNZXRob2RzLnF1ZXJ5KG5vU3VjaE1ldGhvZE1hc2ssIGRvbWFpbik7CiAgfQoKICB2b2lkIGZvckVhY2godm9pZCBhY3Rpb24oTWVtYmVyRW50aXR5IG1lbWJlcikpIHsKICAgIF9ub2Rlcy5mb3JFYWNoKChTdHJpbmcgbmFtZSwgRnVuY3Rpb25TZXROb2RlIG5vZGUpIHsKICAgICAgbm9kZS5mb3JFYWNoKGFjdGlvbik7CiAgICB9KTsKICB9Cn0KCi8vLyBBIHNlbGVjdG9yL2NvbnN0cmFpbnQgcGFpciByZXByZXNlbnRpbmcgdGhlIGR5bmFtaWMgaW52b2NhdGlvbiBvZiBbc2VsZWN0b3JdCi8vLyBvbiBhIHJlY2VpdmVyIGNvbnN0cmFpbmVkIGJ5IFtjb25zdHJhaW50XS4KY2xhc3MgU2VsZWN0b3JNYXNrIHsKICBmaW5hbCBTZWxlY3RvciBzZWxlY3RvcjsKICBmaW5hbCBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyOwogIEBvdmVycmlkZQogIGZpbmFsIGludCBoYXNoQ29kZTsKCiAgU2VsZWN0b3JNYXNrKHRoaXMuc2VsZWN0b3IsIHRoaXMucmVjZWl2ZXIpCiAgICAgIDogdGhpcy5oYXNoQ29kZSA9CiAgICAgICAgICAgIEhhc2hpbmcubWl4SGFzaENvZGVCaXRzKHNlbGVjdG9yLmhhc2hDb2RlLCByZWNlaXZlci5oYXNoQ29kZSkgewogICAgYXNzZXJ0KHJlY2VpdmVyICE9IG51bGwpOwogIH0KCiAgU3RyaW5nIGdldCBuYW1lID0+IHNlbGVjdG9yLm5hbWU7CgogIGJvb2wgYXBwbGllcyhNZW1iZXJFbnRpdHkgZWxlbWVudCwgQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pIHsKICAgIGlmICghc2VsZWN0b3IuYXBwbGllc1VubmFtZWQoZWxlbWVudCkpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBkb21haW4KICAgICAgICAuaXNUYXJnZXRpbmdNZW1iZXIocmVjZWl2ZXIsIGVsZW1lbnQsIHNlbGVjdG9yLm1lbWJlck5hbWUpCiAgICAgICAgLmlzUG90ZW50aWFsbHlUcnVlOwogIH0KCiAgYm9vbCBuZWVkc05vU3VjaE1ldGhvZEhhbmRsaW5nKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSB7CiAgICByZXR1cm4gZG9tYWluCiAgICAgICAgLm5lZWRzTm9TdWNoTWV0aG9kSGFuZGxpbmcocmVjZWl2ZXIsIHNlbGVjdG9yKQogICAgICAgIC5pc1BvdGVudGlhbGx5VHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBzZWxlY3RvciA9PSBvdGhlci5zZWxlY3RvciAmJiByZWNlaXZlciA9PSBvdGhlci5yZWNlaXZlcjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICcoJHNlbGVjdG9yLCRyZWNlaXZlciknOwp9CgovLy8gQSBub2RlIGluIHRoZSBbRnVuY3Rpb25TZXRdIGNhY2hpbmcgYWxsIFtGdW5jdGlvblNldFF1ZXJ5XSBvYmplY3QgZm9yCi8vLyBzZWxlY3RvcnMgd2l0aCB0aGUgc2FtZSBbbmFtZV0uCmNsYXNzIEZ1bmN0aW9uU2V0Tm9kZSB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgZmluYWwgTWFwPFNlbGVjdG9yTWFzaywgRnVuY3Rpb25TZXRRdWVyeT4gY2FjaGUgPQogICAgICA8U2VsZWN0b3JNYXNrLCBGdW5jdGlvblNldFF1ZXJ5Pnt9OwoKICAvLyBJbml0aWFsbHksIHdlIGtlZXAgdGhlIGVsZW1lbnRzIGluIGEgbGlzdCBiZWNhdXNlIGl0IGlzIG1vcmUKICAvLyBjb21wYWN0IHRoYW4gYSBoYXNoIHNldC4gT25jZSB3ZSBnZXQgZW5vdWdoIGVsZW1lbnRzLCB3ZSBjaGFuZ2UKICAvLyB0aGUgcmVwcmVzZW50YXRpb24gdG8gYmUgYSBzZXQgdG8gZ2V0IGZhc3RlciBjb250YWlucyBjaGVja3MuCiAgc3RhdGljIGNvbnN0IGludCBNQVhfRUxFTUVOVFNfSU5fTElTVCA9IDg7CiAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBlbGVtZW50cyA9IDxNZW1iZXJFbnRpdHk+W107CiAgYm9vbCBpc0xpc3QgPSB0cnVlOwoKICBGdW5jdGlvblNldE5vZGUodGhpcy5uYW1lKTsKCiAgdm9pZCBhZGQoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIGFzc2VydChlbGVtZW50Lm5hbWUgPT0gbmFtZSk7CiAgICAvLyBXZSB0cnkgdG8gYXZvaWQgY2xlYXJpbmcgdGhlIGNhY2hlIHVubGVzcyB3ZSBoYXZlIHRvLiBGb3IgdGhhdAogICAgLy8gcmVhc29uIHdlIGtlZXAgdGhlIGV4cGxpY2l0IGNvbnRhaW5zIGNoZWNrIGV2ZW4gdGhvdWdoIHRoZSBhZGQKICAgIC8vIG1ldGhvZCBlbmRzIHVwIGRvaW5nIHRoZSB3b3JrIGFnYWluIChmb3Igc2V0cykuCiAgICBpZiAoIWVsZW1lbnRzLmNvbnRhaW5zKGVsZW1lbnQpKSB7CiAgICAgIGlmIChpc0xpc3QgJiYgZWxlbWVudHMubGVuZ3RoID49IE1BWF9FTEVNRU5UU19JTl9MSVNUKSB7CiAgICAgICAgZWxlbWVudHMgPSBlbGVtZW50cy50b1NldCgpOwogICAgICAgIGlzTGlzdCA9IGZhbHNlOwogICAgICB9CiAgICAgIGlmIChpc0xpc3QpIHsKICAgICAgICBMaXN0PE1lbWJlckVudGl0eT4gbGlzdCA9IGVsZW1lbnRzOwogICAgICAgIGxpc3QuYWRkKGVsZW1lbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIFNldDxNZW1iZXJFbnRpdHk+IHNldCA9IGVsZW1lbnRzOwogICAgICAgIHNldC5hZGQoZWxlbWVudCk7CiAgICAgIH0KICAgICAgaWYgKCFjYWNoZS5pc0VtcHR5KSBjYWNoZS5jbGVhcigpOwogICAgfQogIH0KCiAgdm9pZCByZW1vdmUoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIGFzc2VydChlbGVtZW50Lm5hbWUgPT0gbmFtZSk7CiAgICBpZiAoaXNMaXN0KSB7CiAgICAgIExpc3Q8TWVtYmVyRW50aXR5PiBsaXN0ID0gZWxlbWVudHM7CiAgICAgIGludCBpbmRleCA9IGxpc3QuaW5kZXhPZihlbGVtZW50KTsKICAgICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuOwogICAgICBNZW1iZXJFbnRpdHkgbGFzdCA9IGxpc3QucmVtb3ZlTGFzdCgpOwogICAgICBpZiAoaW5kZXggIT0gbGlzdC5sZW5ndGgpIHsKICAgICAgICBsaXN0W2luZGV4XSA9IGxhc3Q7CiAgICAgIH0KICAgICAgaWYgKCFjYWNoZS5pc0VtcHR5KSBjYWNoZS5jbGVhcigpOwogICAgfSBlbHNlIHsKICAgICAgU2V0PE1lbWJlckVudGl0eT4gc2V0ID0gZWxlbWVudHM7CiAgICAgIGlmIChzZXQucmVtb3ZlKGVsZW1lbnQpKSB7CiAgICAgICAgLy8gVG8gYXZvaWQgd29iYmxpbmcgYmV0d2VlbiB0aGUgdHdvIHJlcHJlc2VudGF0aW9ucywgd2UgZG8KICAgICAgICAvLyBub3QgdHJhbnNpdGlvbiBiYWNrIHRvIHRoZSBsaXN0IHJlcHJlc2VudGF0aW9uIGV2ZW4gaWYgd2UKICAgICAgICAvLyBlbmQgdXAgd2l0aCBmZXcgZW5vdWdoIGVsZW1lbnRzIGF0IHRoaXMgcG9pbnQuCiAgICAgICAgaWYgKCFjYWNoZS5pc0VtcHR5KSBjYWNoZS5jbGVhcigpOwogICAgICB9CiAgICB9CiAgfQoKICBib29sIGNvbnRhaW5zKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQoZWxlbWVudC5uYW1lID09IG5hbWUpOwogICAgcmV0dXJuIGVsZW1lbnRzLmNvbnRhaW5zKGVsZW1lbnQpOwogIH0KCiAgdm9pZCBmb3JFYWNoKHZvaWQgYWN0aW9uKE1lbWJlckVudGl0eSBtZW1iZXIpKSB7CiAgICBlbGVtZW50cy5mb3JFYWNoKGFjdGlvbik7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgc2V0IG9mIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB0aGUgdGFyZ2V0IG9mIFtzZWxlY3Rvck1hc2tdCiAgLy8vIGluY2x1ZGluZyBubyBzdWNoIG1ldGhvZCBoYW5kbGluZyB3aGVyZSBhcHBsaWNhYmxlLgogIEZ1bmN0aW9uU2V0UXVlcnkgcXVlcnkoU2VsZWN0b3JNYXNrIHNlbGVjdG9yTWFzaywgQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4sCiAgICAgIFtGdW5jdGlvblNldE5vZGUgbm9TdWNoTWV0aG9kcywgU2VsZWN0b3JNYXNrIG5vU3VjaE1ldGhvZE1hc2tdKSB7CiAgICBhc3NlcnQoc2VsZWN0b3JNYXNrLm5hbWUgPT0gbmFtZSk7CiAgICBGdW5jdGlvblNldFF1ZXJ5IHJlc3VsdCA9IGNhY2hlW3NlbGVjdG9yTWFza107CiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHJldHVybiByZXN1bHQ7CgogICAgU2V0bGV0PE1lbWJlckVudGl0eT4gZnVuY3Rpb25zOwogICAgZm9yIChNZW1iZXJFbnRpdHkgZWxlbWVudCBpbiBlbGVtZW50cykgewogICAgICBpZiAoc2VsZWN0b3JNYXNrLmFwcGxpZXMoZWxlbWVudCwgZG9tYWluKSkgewogICAgICAgIGlmIChmdW5jdGlvbnMgPT0gbnVsbCkgewogICAgICAgICAgLy8gRGVmZXIgdGhlIGFsbG9jYXRpb24gb2YgdGhlIGZ1bmN0aW9ucyBzZXQgdW50aWwgd2UgYXJlCiAgICAgICAgICAvLyBzdXJlIHdlIG5lZWQgaXQuIFRoaXMgYWxsb3dzIHVzIHRvIHJldHVybiBpbW11dGFibGUgZW1wdHkKICAgICAgICAgIC8vIGxpc3RzIHdoZW4gdGhlIGZpbHRlcmluZyBwcm9kdWNlZCBubyByZXN1bHRzLgogICAgICAgICAgZnVuY3Rpb25zID0gbmV3IFNldGxldDxNZW1iZXJFbnRpdHk+KCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9ucy5hZGQoZWxlbWVudCk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBJZiB3ZSBjYW5ub3QgZW5zdXJlIGEgbWV0aG9kIHdpbGwgYmUgZm91bmQgYXQgcnVudGltZSwgd2UgYWxzbwogICAgLy8gYWRkIFtub1N1Y2hNZXRob2RdIGltcGxlbWVudGF0aW9ucyB0aGF0IGFwcGx5IHRvIFttYXNrXSBhcwogICAgLy8gcG90ZW50aWFsIHRhcmdldHMuCiAgICBpZiAobm9TdWNoTWV0aG9kcyAhPSBudWxsICYmCiAgICAgICAgc2VsZWN0b3JNYXNrLm5lZWRzTm9TdWNoTWV0aG9kSGFuZGxpbmcoZG9tYWluKSkgewogICAgICBGdW5jdGlvblNldFF1ZXJ5IG5vU3VjaE1ldGhvZFF1ZXJ5ID0KICAgICAgICAgIG5vU3VjaE1ldGhvZHMucXVlcnkobm9TdWNoTWV0aG9kTWFzaywgZG9tYWluKTsKICAgICAgaWYgKCFub1N1Y2hNZXRob2RRdWVyeS5mdW5jdGlvbnMuaXNFbXB0eSkgewogICAgICAgIGlmIChmdW5jdGlvbnMgPT0gbnVsbCkgewogICAgICAgICAgZnVuY3Rpb25zID0KICAgICAgICAgICAgICBuZXcgU2V0bGV0PE1lbWJlckVudGl0eT4uZnJvbShub1N1Y2hNZXRob2RRdWVyeS5mdW5jdGlvbnMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmdW5jdGlvbnMuYWRkQWxsKG5vU3VjaE1ldGhvZFF1ZXJ5LmZ1bmN0aW9ucyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjYWNoZVtzZWxlY3Rvck1hc2tdID0gcmVzdWx0ID0gKGZ1bmN0aW9ucyAhPSBudWxsKQogICAgICAgID8gbmV3IEZ1bGxGdW5jdGlvblNldFF1ZXJ5KGZ1bmN0aW9ucykKICAgICAgICA6IGNvbnN0IEVtcHR5RnVuY3Rpb25TZXRRdWVyeSgpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCdGdW5jdGlvblNldE5vZGUoJyk7CiAgICBTdHJpbmcgY29tbWEgPSAnJzsKICAgIGNhY2hlLmZvckVhY2goKG1hc2ssIHF1ZXJ5KSB7CiAgICAgIHNiLndyaXRlKGNvbW1hKTsKICAgICAgc2Iud3JpdGUoJyRtYXNrPSRxdWVyeScpOwogICAgICBjb21tYSA9ICcsJzsKICAgIH0pOwogICAgc2Iud3JpdGUoJyknKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQoKLy8vIEEgc2V0IG9mIGZ1bmN0aW9ucyB0aGF0IGFyZSB0aGUgcG90ZW50aWFsIHRhcmdldHMgb2YgYWxsIGNhbGwgc2l0ZXMgc2hhcmluZwovLy8gdGhlIHNhbWUgcmVjZWl2ZXIgbWFzayBhbmQgc2VsZWN0b3IuCmFic3RyYWN0IGNsYXNzIEZ1bmN0aW9uU2V0UXVlcnkgewogIGNvbnN0IEZ1bmN0aW9uU2V0UXVlcnkoKTsKCiAgLy8vIENvbXB1dGUgdGhlIHR5cGUgb2YgYWxsIHBvdGVudGlhbCByZWNlaXZlcnMgb2YgdGhpcyBmdW5jdGlvbiBzZXQuCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlTWFzayhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbik7CgogIC8vLyBSZXR1cm5zIGFsbCBwb3RlbnRpYWwgdGFyZ2V0cyBvZiB0aGlzIGZ1bmN0aW9uIHNldC4KICBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IGdldCBmdW5jdGlvbnM7Cn0KCmNsYXNzIEVtcHR5RnVuY3Rpb25TZXRRdWVyeSBpbXBsZW1lbnRzIEZ1bmN0aW9uU2V0UXVlcnkgewogIGNvbnN0IEVtcHR5RnVuY3Rpb25TZXRRdWVyeSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVNYXNrKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PiBkb21haW4uZW1wdHlUeXBlOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IGdldCBmdW5jdGlvbnMgPT4gY29uc3QgPE1lbWJlckVudGl0eT5bXTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJzxlbXB0eT4nOwp9CgpjbGFzcyBGdWxsRnVuY3Rpb25TZXRRdWVyeSBpbXBsZW1lbnRzIEZ1bmN0aW9uU2V0UXVlcnkgewogIEBvdmVycmlkZQogIGZpbmFsIEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gZnVuY3Rpb25zOwoKICBBYnN0cmFjdFZhbHVlIF9yZWNlaXZlcjsKCiAgRnVsbEZ1bmN0aW9uU2V0UXVlcnkodGhpcy5mdW5jdGlvbnMpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVNYXNrKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSB7CiAgICByZXR1cm4gX3JlY2VpdmVyID8/PSBkb21haW4uY29tcHV0ZVJlY2VpdmVyKGZ1bmN0aW9ucyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJF9yZWNlaXZlcjokZnVuY3Rpb25zJzsKfQqBLQBOTjwBHwE7JDExJgFERD4ULQFETTchPwYsBAElASgmISApPAQBTU5OHiFPOAQBSCIGTk5OHk9CBAEkTxwvOgQBR0UvGk8hUSRKKUcYUAZEIiEsBjoEATM5HAgEAgFRLxUbIAwWAS0YTB4EASQBQzkSQxwEAT8SNxwEAQwcLUUEAQwwAgFKJBgVNCoBQkVDLTYWAR4BIyJGRjcnPyUYCBQsGw8qGggpBgQBJiISKikdLSIcCCkNKCFERTorCAYEASgiJwQBMx4EAUw6UEgnMycBJC0zIURHOzIKIAgGAUZCGiE6KzkyIRZKETkKCAY3LikTBAEMFioiFyIXIBMIExoEAgFQKSIcAUg5ATooAgE6IQEMTQEMQgEMIgIBOQwqARsBKAEMOjwEAQwwAgEvcGFja2FnZTpjb21waWxlci9zcmMvdW5pdmVyc2UvZnVuY3Rpb25fc2V0LmRhcnREc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2FwaV9wcm90b3R5cGUvY29uc3RhbnRfZXZhbHVhdG9yLmRhcnSB/i8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZyb250X2VuZC5jb25zdGFudF9ldmFsdWF0b3I7CgpleHBvcnQgJy4uL2Zhc3RhL2tlcm5lbC9jb25zdGFudF9ldmFsdWF0b3IuZGFydCcKICAgIHNob3cKICAgICAgICBDb25zdGFudEV2YWx1YXRvciwKICAgICAgICBDb25zdGFudHNUcmFuc2Zvcm1lciwKICAgICAgICBFcnJvclJlcG9ydGVyLAogICAgICAgIEV2YWx1YXRpb25FbnZpcm9ubWVudCwKICAgICAgICBTaW1wbGVFcnJvclJlcG9ydGVyLAogICAgICAgIHRyYW5zZm9ybUNvbXBvbmVudCwKICAgICAgICB0cmFuc2Zvcm1MaWJyYXJpZXM7ChEATk48ASYBMQkbHhcfHRwcATtwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS9jb25zdGFudF9ldmFsdWF0b3IuZGFydDdzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9rZXJuZWwva2VybmVsX2ltcGFjdC5kYXJ0wACAoi8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQnIGFzIGlyOwoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbi9yZXNvbHV0aW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JzsKaW1wb3J0ICcuLi9jb25zdGFudHMvZXhwcmVzc2lvbnMuZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pci9jb25zdGFudHMuZGFydCc7CmltcG9ydCAnLi4vaXIvaW1wYWN0LmRhcnQnOwppbXBvcnQgJy4uL2lyL2ltcGFjdF9kYXRhLmRhcnQnOwppbXBvcnQgJy4uL2lyL3J1bnRpbWVfdHlwZV9hbmFseXNpcy5kYXJ0JzsKaW1wb3J0ICcuLi9pci9zY29wZS5kYXJ0JzsKaW1wb3J0ICcuLi9pci9zdGF0aWNfdHlwZS5kYXJ0JzsKaW1wb3J0ICcuLi9pci91dGlsLmRhcnQnOwppbXBvcnQgJy4uL2lyL3Zpc2l0b3JzLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvYW5ub3RhdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9uYXRpdmVfZGF0YS5kYXJ0JzsKaW1wb3J0ICcuLi9uYXRpdmUvYmVoYXZpb3IuZGFydCc7CmltcG9ydCAnLi4vb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi9yZXNvbHV0aW9uL3JlZ2lzdHJ5LmRhcnQnIHNob3cgUmVzb2x1dGlvbldvcmxkSW1wYWN0QnVpbGRlcjsKaW1wb3J0ICcuLi91bml2ZXJzZS9jYWxsX3N0cnVjdHVyZS5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9mZWF0dXJlLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3VzZS5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS93b3JsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2VsZW1lbnRfbWFwLmRhcnQnOwoKLy8vIFZpc2l0b3IgdGhhdCBjb21wdXRlcyB0aGUgd29ybGQgaW1wYWN0IG9mIGEgbWVtYmVyLgpjbGFzcyBLZXJuZWxJbXBhY3RCdWlsZGVyIGV4dGVuZHMgSW1wYWN0QnVpbGRlckJhc2UKICAgIHdpdGggS2VybmVsSW1wYWN0UmVnaXN0cnlNaXhpbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgUmVzb2x1dGlvbldvcmxkSW1wYWN0QnVpbGRlciBpbXBhY3RCdWlsZGVyOwogIEBvdmVycmlkZQogIGZpbmFsIEtlcm5lbFRvRWxlbWVudE1hcCBlbGVtZW50TWFwOwogIEBvdmVycmlkZQogIGZpbmFsIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlcjsKICBAb3ZlcnJpZGUKICBmaW5hbCBDb21waWxlck9wdGlvbnMgX29wdGlvbnM7CiAgQG92ZXJyaWRlCiAgZmluYWwgTWVtYmVyRW50aXR5IGN1cnJlbnRNZW1iZXI7CiAgZmluYWwgU2V0PFByYWdtYUFubm90YXRpb24+IF9hbm5vdGF0aW9uczsKICBAb3ZlcnJpZGUKICBmaW5hbCBDb25zdGFudFZhbHVlZmllciBfY29uc3RhbnRWYWx1ZWZpZXI7CgogIEtlcm5lbEltcGFjdEJ1aWxkZXIoCiAgICAgIHRoaXMuZWxlbWVudE1hcCwKICAgICAgdGhpcy5jdXJyZW50TWVtYmVyLAogICAgICB0aGlzLnJlcG9ydGVyLAogICAgICB0aGlzLl9vcHRpb25zLAogICAgICBWYXJpYWJsZVNjb3BlTW9kZWwgdmFyaWFibGVTY29wZU1vZGVsLAogICAgICB0aGlzLl9hbm5vdGF0aW9ucywKICAgICAgdGhpcy5fY29uc3RhbnRWYWx1ZWZpZXIpCiAgICAgIDogdGhpcy5pbXBhY3RCdWlsZGVyID0KICAgICAgICAgICAgbmV3IFJlc29sdXRpb25Xb3JsZEltcGFjdEJ1aWxkZXIoJyR7Y3VycmVudE1lbWJlcn0nKSwKICAgICAgICBzdXBlcihlbGVtZW50TWFwLnR5cGVFbnZpcm9ubWVudCwgZWxlbWVudE1hcC5jbGFzc0hpZXJhcmNoeSwKICAgICAgICAgICAgdmFyaWFibGVTY29wZU1vZGVsKTsKCiAgQG92ZXJyaWRlCiAgQ29tbW9uRWxlbWVudHMgZ2V0IGNvbW1vbkVsZW1lbnRzID0+IGVsZW1lbnRNYXAuY29tbW9uRWxlbWVudHM7CgogIEBvdmVycmlkZQogIE5hdGl2ZUJhc2ljRGF0YSBnZXQgX25hdGl2ZUJhc2ljRGF0YSA9PiBlbGVtZW50TWFwLm5hdGl2ZUJhc2ljRGF0YTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgdXNlQXNzZXJ0cyA9PiBfb3B0aW9ucy5lbmFibGVVc2VyQXNzZXJ0aW9uczsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaW5mZXJFZmZlY3RpdmVseUZpbmFsVmFyaWFibGVUeXBlcyA9PgogICAgICAhX2Fubm90YXRpb25zLmNvbnRhaW5zKFByYWdtYUFubm90YXRpb24uZGlzYWJsZUZpbmFsKTsKfQoKLy8vIENvbnZlcnRzIGEgW0ltcGFjdERhdGFdIG9iamVjdCBiYXNlZCBvbiBrZXJuZWwgdG8gdGhlIGNvcnJlc3BvbmRpbmcKLy8vIFtSZXNvbHV0aW9uSW1wYWN0XSBiYXNlZCBvbiB0aGUgSyBtb2RlbC4KY2xhc3MgS2VybmVsSW1wYWN0Q29udmVydGVyIGV4dGVuZHMgS2VybmVsSW1wYWN0UmVnaXN0cnlNaXhpbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgUmVzb2x1dGlvbldvcmxkSW1wYWN0QnVpbGRlciBpbXBhY3RCdWlsZGVyOwogIEBvdmVycmlkZQogIGZpbmFsIEtlcm5lbFRvRWxlbWVudE1hcCBlbGVtZW50TWFwOwogIEBvdmVycmlkZQogIGZpbmFsIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlcjsKICBAb3ZlcnJpZGUKICBmaW5hbCBDb21waWxlck9wdGlvbnMgX29wdGlvbnM7CiAgQG92ZXJyaWRlCiAgZmluYWwgTWVtYmVyRW50aXR5IGN1cnJlbnRNZW1iZXI7CiAgQG92ZXJyaWRlCiAgZmluYWwgQ29uc3RhbnRWYWx1ZWZpZXIgX2NvbnN0YW50VmFsdWVmaWVyOwoKICBLZXJuZWxJbXBhY3RDb252ZXJ0ZXIodGhpcy5lbGVtZW50TWFwLCB0aGlzLmN1cnJlbnRNZW1iZXIsIHRoaXMucmVwb3J0ZXIsCiAgICAgIHRoaXMuX29wdGlvbnMsIHRoaXMuX2NvbnN0YW50VmFsdWVmaWVyKQogICAgICA6IHRoaXMuaW1wYWN0QnVpbGRlciA9CiAgICAgICAgICAgIG5ldyBSZXNvbHV0aW9uV29ybGRJbXBhY3RCdWlsZGVyKCcke2N1cnJlbnRNZW1iZXJ9Jyk7CgogIEBvdmVycmlkZQogIGlyLlR5cGVFbnZpcm9ubWVudCBnZXQgdHlwZUVudmlyb25tZW50ID0+IGVsZW1lbnRNYXAudHlwZUVudmlyb25tZW50OwoKICBAb3ZlcnJpZGUKICBDb21tb25FbGVtZW50cyBnZXQgY29tbW9uRWxlbWVudHMgPT4gZWxlbWVudE1hcC5jb21tb25FbGVtZW50czsKCiAgQG92ZXJyaWRlCiAgTmF0aXZlQmFzaWNEYXRhIGdldCBfbmF0aXZlQmFzaWNEYXRhID0+IGVsZW1lbnRNYXAubmF0aXZlQmFzaWNEYXRhOwoKICAvLy8gQ29udmVydHMgYSBbSW1wYWN0RGF0YV0gb2JqZWN0IGJhc2VkIG9uIGtlcm5lbCB0byB0aGUgY29ycmVzcG9uZGluZwogIC8vLyBbUmVzb2x1dGlvbkltcGFjdF0gYmFzZWQgb24gdGhlIEsgbW9kZWwuCiAgUmVzb2x1dGlvbkltcGFjdCBjb252ZXJ0KEltcGFjdERhdGEgaW1wYWN0RGF0YSkgewogICAgaW1wYWN0RGF0YS5hcHBseSh0aGlzKTsKICAgIHJldHVybiBpbXBhY3RCdWlsZGVyOwogIH0KfQoKLy8vIFtJbXBhY3RSZWdpc3RyeV0gdGhhdCBjb252ZXJ0cyBrZXJuZWwgYmFzZWQgaW1wYWN0IGRhdGEgdG8gd29ybGQgaW1wYWN0Ci8vLyBvYmplY3QgYmFzZWQgb24gdGhlIEsgbW9kZWwuCmFic3RyYWN0IGNsYXNzIEtlcm5lbEltcGFjdFJlZ2lzdHJ5TWl4aW4gaW1wbGVtZW50cyBJbXBhY3RSZWdpc3RyeSB7CiAgQ29tcGlsZXJPcHRpb25zIGdldCBfb3B0aW9uczsKICBEaWFnbm9zdGljUmVwb3J0ZXIgZ2V0IHJlcG9ydGVyOwogIEtlcm5lbFRvRWxlbWVudE1hcCBnZXQgZWxlbWVudE1hcDsKICBNZW1iZXJFbnRpdHkgZ2V0IGN1cnJlbnRNZW1iZXI7CiAgUmVzb2x1dGlvbldvcmxkSW1wYWN0QnVpbGRlciBnZXQgaW1wYWN0QnVpbGRlcjsKICBpci5UeXBlRW52aXJvbm1lbnQgZ2V0IHR5cGVFbnZpcm9ubWVudDsKICBDb21tb25FbGVtZW50cyBnZXQgY29tbW9uRWxlbWVudHM7CiAgTmF0aXZlQmFzaWNEYXRhIGdldCBfbmF0aXZlQmFzaWNEYXRhOwogIENvbnN0YW50VmFsdWVmaWVyIGdldCBfY29uc3RhbnRWYWx1ZWZpZXI7CgogIE9iamVjdCBfY29tcHV0ZVJlY2VpdmVyQ29uc3RyYWludCgKICAgICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlLCBDbGFzc1JlbGF0aW9uIHJlbGF0aW9uKSB7CiAgICBpZiAocmVjZWl2ZXJUeXBlIGlzIGlyLkludGVyZmFjZVR5cGUpIHsKICAgICAgaWYgKHJlY2VpdmVyVHlwZS5jbGFzc05vZGUgPT0gdHlwZUVudmlyb25tZW50LmZ1dHVyZU9yQ2xhc3MpIHsKICAgICAgICAvLyBDRkUgZW5jb2RlcyBGdXR1cmVPciBhcyBhbiBpbnRlcmZhY2UgdHlwZSEKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICByZXR1cm4gbmV3IFN0cm9uZ01vZGVDb25zdHJhaW50KGNvbW1vbkVsZW1lbnRzLCBfbmF0aXZlQmFzaWNEYXRhLAogICAgICAgICAgZWxlbWVudE1hcC5nZXRDbGFzcyhyZWNlaXZlclR5cGUuY2xhc3NOb2RlKSwgcmVsYXRpb24pOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyUGFyYW1ldGVyQ2hlY2soaXIuRGFydFR5cGUgaXJUeXBlKSB7CiAgICBEYXJ0VHlwZSB0eXBlID0gZWxlbWVudE1hcC5nZXREYXJ0VHlwZShpclR5cGUpOwogICAgaWYgKCF0eXBlLmlzRHluYW1pYykgewogICAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyVHlwZVVzZShuZXcgVHlwZVVzZS5wYXJhbWV0ZXJDaGVjayh0eXBlKSk7CiAgICB9CiAgfQoKICBMaXN0PERhcnRUeXBlPiBfZ2V0VHlwZUFyZ3VtZW50cyhMaXN0PGlyLkRhcnRUeXBlPiB0eXBlcykgewogICAgaWYgKHR5cGVzLmlzRW1wdHkpIHJldHVybiBudWxsOwogICAgcmV0dXJuIHR5cGVzLm1hcChlbGVtZW50TWFwLmdldERhcnRUeXBlKS50b0xpc3QoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJMYXp5RmllbGQoKSB7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyRmVhdHVyZShGZWF0dXJlLkxBWllfRklFTEQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckZpZWxkTm9kZShpci5GaWVsZCBmaWVsZCkgewogICAgaWYgKGZpZWxkLmlzSW5zdGFuY2VNZW1iZXIgJiYKICAgICAgICBfbmF0aXZlQmFzaWNEYXRhCiAgICAgICAgICAgIC5pc05hdGl2ZUNsYXNzKGVsZW1lbnRNYXAuZ2V0Q2xhc3MoZmllbGQuZW5jbG9zaW5nQ2xhc3MpKSkgewogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0gZWxlbWVudE1hcC5nZXRNZW1iZXIoZmllbGQpOwogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBOYXRpdmVEYXRhQnVpbGRlciBhbHJlYWR5IGhhcyB0aGUgbmF0aXZlIGJlaGF2aW9yCiAgICAgIC8vIGF0IHRoaXMgcG9pbnQuIFVzZSB0aGF0IGluc3RlYWQuCiAgICAgIGJvb2wgaXNKc0ludGVyb3AgPSBfbmF0aXZlQmFzaWNEYXRhLmlzSnNJbnRlcm9wTWVtYmVyKG1lbWJlcik7CiAgICAgIExpc3Q8Q29uc3RhbnRWYWx1ZT4gbWV0YWRhdGEgPQogICAgICAgICAgZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQuZ2V0TWVtYmVyTWV0YWRhdGEobWVtYmVyKTsKICAgICAgSXRlcmFibGU8U3RyaW5nPiBjcmVhdGVzQW5ub3RhdGlvbnMgPQogICAgICAgICAgZ2V0Q3JlYXRlc0Fubm90YXRpb25zKHJlcG9ydGVyLCBjb21tb25FbGVtZW50cywgbWV0YWRhdGEpOwogICAgICBJdGVyYWJsZTxTdHJpbmc+IHJldHVybnNBbm5vdGF0aW9ucyA9CiAgICAgICAgICBnZXRSZXR1cm5zQW5ub3RhdGlvbnMocmVwb3J0ZXIsIGNvbW1vbkVsZW1lbnRzLCBtZXRhZGF0YSk7CiAgICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJOYXRpdmVEYXRhKGVsZW1lbnRNYXAuZ2V0TmF0aXZlQmVoYXZpb3JGb3JGaWVsZExvYWQoCiAgICAgICAgICBmaWVsZCwgY3JlYXRlc0Fubm90YXRpb25zLCByZXR1cm5zQW5ub3RhdGlvbnMsCiAgICAgICAgICBpc0pzSW50ZXJvcDogaXNKc0ludGVyb3ApKTsKICAgICAgaW1wYWN0QnVpbGRlcgogICAgICAgICAgLnJlZ2lzdGVyTmF0aXZlRGF0YShlbGVtZW50TWFwLmdldE5hdGl2ZUJlaGF2aW9yRm9yRmllbGRTdG9yZShmaWVsZCkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckNvbnN0cnVjdG9yTm9kZShpci5Db25zdHJ1Y3RvciBjb25zdHJ1Y3RvcikgewogICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IGVsZW1lbnRNYXAuZ2V0TWVtYmVyKGNvbnN0cnVjdG9yKTsKICAgIGlmIChjb25zdHJ1Y3Rvci5pc0V4dGVybmFsICYmICFjb21tb25FbGVtZW50cy5pc0ZvcmVpZ25IZWxwZXIobWVtYmVyKSkgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBOYXRpdmVEYXRhQnVpbGRlciBhbHJlYWR5IGhhcyB0aGUgbmF0aXZlIGJlaGF2aW9yCiAgICAgIC8vIGF0IHRoaXMgcG9pbnQuIFVzZSB0aGF0IGluc3RlYWQuCiAgICAgIGJvb2wgaXNKc0ludGVyb3AgPSBfbmF0aXZlQmFzaWNEYXRhLmlzSnNJbnRlcm9wTWVtYmVyKG1lbWJlcik7CiAgICAgIExpc3Q8Q29uc3RhbnRWYWx1ZT4gbWV0YWRhdGEgPQogICAgICAgICAgZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQuZ2V0TWVtYmVyTWV0YWRhdGEobWVtYmVyKTsKICAgICAgSXRlcmFibGU8U3RyaW5nPiBjcmVhdGVzQW5ub3RhdGlvbnMgPQogICAgICAgICAgZ2V0Q3JlYXRlc0Fubm90YXRpb25zKHJlcG9ydGVyLCBjb21tb25FbGVtZW50cywgbWV0YWRhdGEpOwogICAgICBJdGVyYWJsZTxTdHJpbmc+IHJldHVybnNBbm5vdGF0aW9ucyA9CiAgICAgICAgICBnZXRSZXR1cm5zQW5ub3RhdGlvbnMocmVwb3J0ZXIsIGNvbW1vbkVsZW1lbnRzLCBtZXRhZGF0YSk7CiAgICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJOYXRpdmVEYXRhKGVsZW1lbnRNYXAuZ2V0TmF0aXZlQmVoYXZpb3JGb3JNZXRob2QoCiAgICAgICAgICBjb25zdHJ1Y3RvciwgY3JlYXRlc0Fubm90YXRpb25zLCByZXR1cm5zQW5ub3RhdGlvbnMsCiAgICAgICAgICBpc0pzSW50ZXJvcDogaXNKc0ludGVyb3ApKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTeW5jU3Rhcihpci5EYXJ0VHlwZSBlbGVtZW50VHlwZSkgewogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckZlYXR1cmUoRmVhdHVyZS5TWU5DX1NUQVIpOwogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN0YXRpY0ludm9rZSgKICAgICAgICBjb21tb25FbGVtZW50cy5zeW5jU3Rhckl0ZXJhYmxlRmFjdG9yeSwKICAgICAgICBjb25zdCBDYWxsU3RydWN0dXJlLnVubmFtZWQoMSwgMSksCiAgICAgICAgPERhcnRUeXBlPltlbGVtZW50TWFwLmdldERhcnRUeXBlKGVsZW1lbnRUeXBlKV0pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJBc3luYyhpci5EYXJ0VHlwZSBlbGVtZW50VHlwZSkgewogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckZlYXR1cmUoRmVhdHVyZS5BU1lOQyk7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3RhdGljSW52b2tlKAogICAgICAgIGNvbW1vbkVsZW1lbnRzLmFzeW5jQXdhaXRDb21wbGV0ZXJGYWN0b3J5LAogICAgICAgIGNvbnN0IENhbGxTdHJ1Y3R1cmUudW5uYW1lZCgwLCAxKSwKICAgICAgICA8RGFydFR5cGU+W2VsZW1lbnRNYXAuZ2V0RGFydFR5cGUoZWxlbWVudFR5cGUpXSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckFzeW5jU3Rhcihpci5EYXJ0VHlwZSBlbGVtZW50VHlwZSkgewogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckZlYXR1cmUoRmVhdHVyZS5BU1lOQ19TVEFSKTsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5zdGF0aWNJbnZva2UoCiAgICAgICAgY29tbW9uRWxlbWVudHMuYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckZhY3RvcnksCiAgICAgICAgY29uc3QgQ2FsbFN0cnVjdHVyZS51bm5hbWVkKDEsIDEpLAogICAgICAgIDxEYXJ0VHlwZT5bZWxlbWVudE1hcC5nZXREYXJ0VHlwZShlbGVtZW50VHlwZSldKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyUHJvY2VkdXJlTm9kZShpci5Qcm9jZWR1cmUgcHJvY2VkdXJlKSB7CiAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0gZWxlbWVudE1hcC5nZXRNZW1iZXIocHJvY2VkdXJlKTsKICAgIGlmIChwcm9jZWR1cmUuaXNFeHRlcm5hbCAmJiAhY29tbW9uRWxlbWVudHMuaXNGb3JlaWduSGVscGVyKG1lbWJlcikpIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTmF0aXZlRGF0YUJ1aWxkZXIgYWxyZWFkeSBoYXMgdGhlIG5hdGl2ZSBiZWhhdmlvcgogICAgICAvLyBhdCB0aGlzIHBvaW50LiBVc2UgdGhhdCBpbnN0ZWFkLgogICAgICBib29sIGlzSnNJbnRlcm9wID0gX25hdGl2ZUJhc2ljRGF0YS5pc0pzSW50ZXJvcE1lbWJlcihtZW1iZXIpOwogICAgICBMaXN0PENvbnN0YW50VmFsdWU+IG1ldGFkYXRhID0KICAgICAgICAgIGVsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50LmdldE1lbWJlck1ldGFkYXRhKG1lbWJlcik7CiAgICAgIEl0ZXJhYmxlPFN0cmluZz4gY3JlYXRlc0Fubm90YXRpb25zID0KICAgICAgICAgIGdldENyZWF0ZXNBbm5vdGF0aW9ucyhyZXBvcnRlciwgY29tbW9uRWxlbWVudHMsIG1ldGFkYXRhKTsKICAgICAgSXRlcmFibGU8U3RyaW5nPiByZXR1cm5zQW5ub3RhdGlvbnMgPQogICAgICAgICAgZ2V0UmV0dXJuc0Fubm90YXRpb25zKHJlcG9ydGVyLCBjb21tb25FbGVtZW50cywgbWV0YWRhdGEpOwogICAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyTmF0aXZlRGF0YShlbGVtZW50TWFwLmdldE5hdGl2ZUJlaGF2aW9yRm9yTWV0aG9kKAogICAgICAgICAgcHJvY2VkdXJlLCBjcmVhdGVzQW5ub3RhdGlvbnMsIHJldHVybnNBbm5vdGF0aW9ucywKICAgICAgICAgIGlzSnNJbnRlcm9wOiBpc0pzSW50ZXJvcCkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckludExpdGVyYWwoaW50IHZhbHVlKSB7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyQ29uc3RhbnRMaXRlcmFsKAogICAgICAgIG5ldyBJbnRDb25zdGFudEV4cHJlc3Npb24obmV3IEJpZ0ludC5mcm9tKHZhbHVlKS50b1Vuc2lnbmVkKDY0KSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckRvdWJsZUxpdGVyYWwoZG91YmxlIHZhbHVlKSB7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyQ29uc3RhbnRMaXRlcmFsKG5ldyBEb3VibGVDb25zdGFudEV4cHJlc3Npb24odmFsdWUpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJCb29sTGl0ZXJhbChib29sIHZhbHVlKSB7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyQ29uc3RhbnRMaXRlcmFsKG5ldyBCb29sQ29uc3RhbnRFeHByZXNzaW9uKHZhbHVlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyU3RyaW5nTGl0ZXJhbChTdHJpbmcgdmFsdWUpIHsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJDb25zdGFudExpdGVyYWwobmV3IFN0cmluZ0NvbnN0YW50RXhwcmVzc2lvbih2YWx1ZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN5bWJvbExpdGVyYWwoU3RyaW5nIHZhbHVlKSB7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyQ29uc3RTeW1ib2xOYW1lKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJOdWxsTGl0ZXJhbCgpIHsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJDb25zdGFudExpdGVyYWwobmV3IE51bGxDb25zdGFudEV4cHJlc3Npb24oKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyTGlzdExpdGVyYWwoaXIuRGFydFR5cGUgZWxlbWVudFR5cGUsCiAgICAgIHtib29sIGlzQ29uc3QsIGJvb2wgaXNFbXB0eX0pIHsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJMaXN0TGl0ZXJhbChuZXcgTGlzdExpdGVyYWxVc2UoCiAgICAgICAgY29tbW9uRWxlbWVudHMubGlzdFR5cGUoZWxlbWVudE1hcC5nZXREYXJ0VHlwZShlbGVtZW50VHlwZSkpLAogICAgICAgIGlzQ29uc3RhbnQ6IGlzQ29uc3QsCiAgICAgICAgaXNFbXB0eTogaXNFbXB0eSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclNldExpdGVyYWwoaXIuRGFydFR5cGUgZWxlbWVudFR5cGUsCiAgICAgIHtib29sIGlzQ29uc3QsIGJvb2wgaXNFbXB0eX0pIHsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJTZXRMaXRlcmFsKG5ldyBTZXRMaXRlcmFsVXNlKAogICAgICAgIGNvbW1vbkVsZW1lbnRzLnNldFR5cGUoZWxlbWVudE1hcC5nZXREYXJ0VHlwZShlbGVtZW50VHlwZSkpLAogICAgICAgIGlzQ29uc3RhbnQ6IGlzQ29uc3QsCiAgICAgICAgaXNFbXB0eTogaXNFbXB0eSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck1hcExpdGVyYWwoaXIuRGFydFR5cGUga2V5VHlwZSwgaXIuRGFydFR5cGUgdmFsdWVUeXBlLAogICAgICB7Ym9vbCBpc0NvbnN0LCBib29sIGlzRW1wdHl9KSB7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyTWFwTGl0ZXJhbChuZXcgTWFwTGl0ZXJhbFVzZSgKICAgICAgICBjb21tb25FbGVtZW50cy5tYXBUeXBlKAogICAgICAgICAgICBlbGVtZW50TWFwLmdldERhcnRUeXBlKGtleVR5cGUpLCBlbGVtZW50TWFwLmdldERhcnRUeXBlKHZhbHVlVHlwZSkpLAogICAgICAgIGlzQ29uc3RhbnQ6IGlzQ29uc3QsCiAgICAgICAgaXNFbXB0eTogaXNFbXB0eSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck5ldygKICAgICAgaXIuTWVtYmVyIHRhcmdldCwKICAgICAgaXIuSW50ZXJmYWNlVHlwZSB0eXBlLAogICAgICBpbnQgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzLAogICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzLAogICAgICBpci5MaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQsCiAgICAgIHtib29sIGlzQ29uc3R9KSB7CiAgICBDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvciA9IGVsZW1lbnRNYXAuZ2V0Q29uc3RydWN0b3IodGFyZ2V0KTsKICAgIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSA9IG5ldyBDYWxsU3RydWN0dXJlKAogICAgICAgIHBvc2l0aW9uYWxBcmd1bWVudHMgKyBuYW1lZEFyZ3VtZW50cy5sZW5ndGgsCiAgICAgICAgbmFtZWRBcmd1bWVudHMsCiAgICAgICAgdHlwZUFyZ3VtZW50cy5sZW5ndGgpOwogICAgSW1wb3J0RW50aXR5IGRlZmVycmVkSW1wb3J0ID0gZWxlbWVudE1hcC5nZXRJbXBvcnQoaW1wb3J0KTsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJTdGF0aWNVc2UoaXNDb25zdAogICAgICAgID8gbmV3IFN0YXRpY1VzZS5jb25zdENvbnN0cnVjdG9ySW52b2tlKGNvbnN0cnVjdG9yLCBjYWxsU3RydWN0dXJlLAogICAgICAgICAgICBlbGVtZW50TWFwLmdldERhcnRUeXBlKHR5cGUpLCBkZWZlcnJlZEltcG9ydCkKICAgICAgICA6IG5ldyBTdGF0aWNVc2UudHlwZWRDb25zdHJ1Y3Rvckludm9rZShjb25zdHJ1Y3RvciwgY2FsbFN0cnVjdHVyZSwKICAgICAgICAgICAgZWxlbWVudE1hcC5nZXREYXJ0VHlwZSh0eXBlKSwgZGVmZXJyZWRJbXBvcnQpKTsKICAgIGlmICh0eXBlLnR5cGVBcmd1bWVudHMuYW55KChpci5EYXJ0VHlwZSB0eXBlKSA9PiB0eXBlIGlzISBpci5EeW5hbWljVHlwZSkpIHsKICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckZlYXR1cmUoRmVhdHVyZS5UWVBFX1ZBUklBQkxFX0JPVU5EU19DSEVDSyk7CiAgICB9CgogICAgaWYgKGNvbW1vbkVsZW1lbnRzLmlzU3ltYm9sQ29uc3RydWN0b3IoY29uc3RydWN0b3IpKSB7CiAgICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJGZWF0dXJlKEZlYXR1cmUuU1lNQk9MX0NPTlNUUlVDVE9SKTsKICAgIH0KCiAgICBpZiAodGFyZ2V0LmlzRXh0ZXJuYWwgJiYKICAgICAgICBjb25zdHJ1Y3Rvci5pc0Zyb21FbnZpcm9ubWVudENvbnN0cnVjdG9yICYmCiAgICAgICAgIWlzQ29uc3QpIHsKICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckZlYXR1cmUoRmVhdHVyZS5USFJPV19VTlNVUFBPUlRFRF9FUlJPUik7CiAgICAgIC8vIFdlIG5lZWQgdG8gcmVnaXN0ZXIgdGhlIGV4dGVybmFsIGNvbnN0cnVjdG9yIGFzIGxpdmUgYmVsb3csIHNvIGRvbid0CiAgICAgIC8vIHJldHVybiBoZXJlLgogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckNvbnN0SW5zdGFudGlhdGlvbihpci5DbGFzcyBjbHMsIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMsCiAgICAgIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydCkgewogICAgSW1wb3J0RW50aXR5IGRlZmVycmVkSW1wb3J0ID0gZWxlbWVudE1hcC5nZXRJbXBvcnQoaW1wb3J0KTsKICAgIEludGVyZmFjZVR5cGUgdHlwZSA9IGVsZW1lbnRNYXAuY3JlYXRlSW50ZXJmYWNlVHlwZShjbHMsIHR5cGVBcmd1bWVudHMpOwogICAgaW1wYWN0QnVpbGRlcgogICAgICAgIC5yZWdpc3RlclR5cGVVc2UobmV3IFR5cGVVc2UuY29uc3RJbnN0YW50aWF0aW9uKHR5cGUsIGRlZmVycmVkSW1wb3J0KSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyQ29uc3RDb25zdHJ1Y3Rvckludm9jYXRpb25Ob2RlKGlyLkNvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7CiAgICBhc3NlcnQobm9kZS5pc0NvbnN0KTsKICAgIENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yID0gZWxlbWVudE1hcC5nZXRDb25zdHJ1Y3Rvcihub2RlLnRhcmdldCk7CiAgICBpZiAoY29tbW9uRWxlbWVudHMuaXNTeW1ib2xDb25zdHJ1Y3Rvcihjb25zdHJ1Y3RvcikpIHsKICAgICAgQ29uc3RhbnRWYWx1ZSB2YWx1ZSA9CiAgICAgICAgICBlbGVtZW50TWFwLmdldENvbnN0YW50VmFsdWUobm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5maXJzdCk7CiAgICAgIGlmICghdmFsdWUuaXNTdHJpbmcpIHsKICAgICAgICAvLyBUT0RPKGhldCk6IEdldCB0aGUgYWN0dWFsIHNwYW4gZm9yIHRoZSBTeW1ib2wgY29uc3RydWN0b3IgYXJndW1lbnQKICAgICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgICAgIE1lc3NhZ2VLaW5kLlNUUklOR19FWFBFQ1RFRCwKICAgICAgICAgICAgeyd0eXBlJzogdmFsdWUuZ2V0VHlwZShlbGVtZW50TWFwLmNvbW1vbkVsZW1lbnRzKX0pOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBTdHJpbmdDb25zdGFudFZhbHVlIHN0cmluZ1ZhbHVlID0gdmFsdWU7CiAgICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJDb25zdFN5bWJvbE5hbWUoc3RyaW5nVmFsdWUuc3RyaW5nVmFsdWUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN1cGVySW5pdGlhbGl6ZXIoCiAgICAgIGlyLkNvbnN0cnVjdG9yIHNvdXJjZSwKICAgICAgaXIuQ29uc3RydWN0b3IgdGFyZ2V0LAogICAgICBpbnQgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzLAogICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNYXliZSByZXdyaXRlIGBub2RlLnRhcmdldGAgdG8gcG9pbnQgdG8gYQogICAgLy8gc3ludGhlc2l6ZWQgdW5uYW1lZCBtaXhpbiBjb25zdHJ1Y3RvciB3aGVuIG5lZWRlZC4gVGhpcyB3b3VsZCByZXF1aXJlIHVzCiAgICAvLyB0byBjb25zaWRlciBpbXBhY3QgYnVpbGRpbmcgYSByZXF1aXJlZCBwcmUtc3RlcCBmb3IgaW5mZXJlbmNlIGFuZAogICAgLy8gc3NhLWJ1aWxkaW5nLgogICAgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IgPQogICAgICAgIGVsZW1lbnRNYXAuZ2V0U3VwZXJDb25zdHJ1Y3Rvcihzb3VyY2UsIHRhcmdldCk7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3VwZXJDb25zdHJ1Y3Rvckludm9rZSgKICAgICAgICBjb25zdHJ1Y3RvciwKICAgICAgICBuZXcgQ2FsbFN0cnVjdHVyZShwb3NpdGlvbmFsQXJndW1lbnRzICsgbmFtZWRBcmd1bWVudHMubGVuZ3RoLAogICAgICAgICAgICBuYW1lZEFyZ3VtZW50cywgdHlwZUFyZ3VtZW50cy5sZW5ndGgpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyU3RhdGljSW52b2NhdGlvbigKICAgICAgaXIuUHJvY2VkdXJlIHByb2NlZHVyZSwKICAgICAgaW50IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIExpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cywKICAgICAgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cywKICAgICAgaXIuTGlicmFyeURlcGVuZGVuY3kgaW1wb3J0KSB7CiAgICBGdW5jdGlvbkVudGl0eSB0YXJnZXQgPSBlbGVtZW50TWFwLmdldE1ldGhvZChwcm9jZWR1cmUpOwogICAgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlID0gbmV3IENhbGxTdHJ1Y3R1cmUoCiAgICAgICAgcG9zaXRpb25hbEFyZ3VtZW50cyArIG5hbWVkQXJndW1lbnRzLmxlbmd0aCwKICAgICAgICBuYW1lZEFyZ3VtZW50cywKICAgICAgICB0eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgICBMaXN0PERhcnRUeXBlPiBkYXJ0VHlwZUFyZ3VtZW50cyA9IF9nZXRUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMpOwogICAgaWYgKGNvbW1vbkVsZW1lbnRzLmlzRXh0cmFjdFR5cGVBcmd1bWVudHModGFyZ2V0KSkgewogICAgICBfaGFuZGxlRXh0cmFjdFR5cGVBcmd1bWVudHModGFyZ2V0LCBkYXJ0VHlwZUFyZ3VtZW50cywgY2FsbFN0cnVjdHVyZSk7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSB7CiAgICAgIEltcG9ydEVudGl0eSBkZWZlcnJlZEltcG9ydCA9IGVsZW1lbnRNYXAuZ2V0SW1wb3J0KGltcG9ydCk7CiAgICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5zdGF0aWNJbnZva2UoCiAgICAgICAgICB0YXJnZXQsIGNhbGxTdHJ1Y3R1cmUsIGRhcnRUeXBlQXJndW1lbnRzLCBkZWZlcnJlZEltcG9ydCkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN0YXRpY0ludm9jYXRpb25Ob2RlKGlyLlN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgc3dpdGNoIChlbGVtZW50TWFwLmdldEZvcmVpZ25LaW5kKG5vZGUpKSB7CiAgICAgIGNhc2UgRm9yZWlnbktpbmQuSlM6CiAgICAgICAgaW1wYWN0QnVpbGRlcgogICAgICAgICAgICAucmVnaXN0ZXJOYXRpdmVEYXRhKGVsZW1lbnRNYXAuZ2V0TmF0aXZlQmVoYXZpb3JGb3JKc0NhbGwobm9kZSkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEZvcmVpZ25LaW5kLkpTX0JVSUxUSU46CiAgICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3Rlck5hdGl2ZURhdGEoCiAgICAgICAgICAgIGVsZW1lbnRNYXAuZ2V0TmF0aXZlQmVoYXZpb3JGb3JKc0J1aWx0aW5DYWxsKG5vZGUpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBGb3JlaWduS2luZC5KU19FTUJFRERFRF9HTE9CQUw6CiAgICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3Rlck5hdGl2ZURhdGEoCiAgICAgICAgICAgIGVsZW1lbnRNYXAuZ2V0TmF0aXZlQmVoYXZpb3JGb3JKc0VtYmVkZGVkR2xvYmFsQ2FsbChub2RlKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgRm9yZWlnbktpbmQuSlNfSU5URVJDRVBUT1JfQ09OU1RBTlQ6CiAgICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlID0KICAgICAgICAgICAgZWxlbWVudE1hcC5nZXRJbnRlcmZhY2VUeXBlRm9ySnNJbnRlcmNlcHRvckNhbGwobm9kZSk7CiAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewogICAgICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclR5cGVVc2UobmV3IFR5cGVVc2UuaW5zdGFudGlhdGlvbih0eXBlKSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEZvcmVpZ25LaW5kLk5PTkU6CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICB2b2lkIF9oYW5kbGVFeHRyYWN0VHlwZUFyZ3VtZW50cyhGdW5jdGlvbkVudGl0eSB0YXJnZXQsCiAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMsIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSkgewogICAgLy8gZXh0cmFjdFR5cGVBcmd1bWVudHM8TWFwPihvYmosIGZuKSBoYXMgYWRkaXRpb25hbCBpbXBhY3RzOgogICAgLy8KICAgIC8vICAgMS4gQWxsIGNsYXNzZXMgaW1wbGVtZW50aW5nIE1hcCBuZWVkIHRvIGNhcnJ5IHR5cGUgYXJndW1lbnRzIChzaW1pbGFyCiAgICAvLyAgICAgIHRvIGNoZWNraW5nIGBvIGlzIE1hcDxLLCBWPmApLgogICAgLy8KICAgIC8vICAgMi4gVGhlcmUgaXMgYW4gaW52b2NhdGlvbiBvZiBmbiB3aXRoIHNvbWUgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzLgogICAgLy8KICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJTdGF0aWNVc2UoCiAgICAgICAgbmV3IFN0YXRpY1VzZS5zdGF0aWNJbnZva2UodGFyZ2V0LCBjYWxsU3RydWN0dXJlLCB0eXBlQXJndW1lbnRzKSk7CgogICAgaWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoICE9IDEpIHJldHVybjsKICAgIERhcnRUeXBlIG1hdGNoZWRUeXBlID0gdHlwZUFyZ3VtZW50cy5maXJzdDsKCiAgICBpZiAobWF0Y2hlZFR5cGUgaXMhIEludGVyZmFjZVR5cGUpIHJldHVybjsKICAgIEludGVyZmFjZVR5cGUgaW50ZXJmYWNlVHlwZSA9IG1hdGNoZWRUeXBlOwogICAgQ2xhc3NFbnRpdHkgY2xzID0gaW50ZXJmYWNlVHlwZS5lbGVtZW50OwogICAgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZSA9IGVsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50LmdldFRoaXNUeXBlKGNscyk7CgogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclR5cGVVc2UobmV3IFR5cGVVc2UuaXNDaGVjayh0aGlzVHlwZSkpOwoKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFNlbGVjdG9yLmNhbGxDbG9zdXJlKAogICAgICAgIDAsIGNvbnN0IDxTdHJpbmc+W10sIHRoaXNUeXBlLnR5cGVBcmd1bWVudHMubGVuZ3RoKTsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJEeW5hbWljVXNlKAogICAgICAgIG5ldyBDb25zdHJhaW5lZER5bmFtaWNVc2Uoc2VsZWN0b3IsIG51bGwsIHRoaXNUeXBlLnR5cGVBcmd1bWVudHMpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTdGF0aWNUZWFyT2ZmKAogICAgICBpci5Qcm9jZWR1cmUgcHJvY2VkdXJlLCBpci5MaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQpIHsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5zdGF0aWNUZWFyT2ZmKAogICAgICAgIGVsZW1lbnRNYXAuZ2V0TWV0aG9kKHByb2NlZHVyZSksIGVsZW1lbnRNYXAuZ2V0SW1wb3J0KGltcG9ydCkpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTdGF0aWNHZXQoaXIuTWVtYmVyIG1lbWJlciwgaXIuTGlicmFyeURlcGVuZGVuY3kgaW1wb3J0KSB7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3RhdGljR2V0KAogICAgICAgIGVsZW1lbnRNYXAuZ2V0TWVtYmVyKG1lbWJlciksIGVsZW1lbnRNYXAuZ2V0SW1wb3J0KGltcG9ydCkpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTdGF0aWNTZXQoaXIuTWVtYmVyIG1lbWJlciwgaXIuTGlicmFyeURlcGVuZGVuY3kgaW1wb3J0KSB7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3RhdGljU2V0KAogICAgICAgIGVsZW1lbnRNYXAuZ2V0TWVtYmVyKG1lbWJlciksIGVsZW1lbnRNYXAuZ2V0SW1wb3J0KGltcG9ydCkpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTdXBlckludm9jYXRpb24oaXIuTmFtZSBuYW1lLCBpbnQgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzLCBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICBGdW5jdGlvbkVudGl0eSBtZXRob2QgPQogICAgICAgIGVsZW1lbnRNYXAuZ2V0U3VwZXJNZW1iZXIoY3VycmVudE1lbWJlciwgbmFtZSwgc2V0dGVyOiBmYWxzZSk7CiAgICBMaXN0PERhcnRUeXBlPiBkYXJ0VHlwZUFyZ3VtZW50cyA9IF9nZXRUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMpOwogICAgaWYgKG1ldGhvZCAhPSBudWxsKSB7CiAgICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5zdXBlckludm9rZSgKICAgICAgICAgIG1ldGhvZCwKICAgICAgICAgIG5ldyBDYWxsU3RydWN0dXJlKHBvc2l0aW9uYWxBcmd1bWVudHMgKyBuYW1lZEFyZ3VtZW50cy5sZW5ndGgsCiAgICAgICAgICAgICAgbmFtZWRBcmd1bWVudHMsIHR5cGVBcmd1bWVudHMubGVuZ3RoKSwKICAgICAgICAgIGRhcnRUeXBlQXJndW1lbnRzKSk7CiAgICB9IGVsc2UgewogICAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3VwZXJJbnZva2UoCiAgICAgICAgICBlbGVtZW50TWFwLmdldFN1cGVyTm9TdWNoTWV0aG9kKGN1cnJlbnRNZW1iZXIuZW5jbG9zaW5nQ2xhc3MpLAogICAgICAgICAgQ2FsbFN0cnVjdHVyZS5PTkVfQVJHKSk7CiAgICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJGZWF0dXJlKEZlYXR1cmUuU1VQRVJfTk9fU1VDSF9NRVRIT0QpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN1cGVyR2V0KGlyLk5hbWUgbmFtZSkgewogICAgTWVtYmVyRW50aXR5IG1lbWJlciA9CiAgICAgICAgZWxlbWVudE1hcC5nZXRTdXBlck1lbWJlcihjdXJyZW50TWVtYmVyLCBuYW1lLCBzZXR0ZXI6IGZhbHNlKTsKICAgIGlmIChtZW1iZXIgIT0gbnVsbCkgewogICAgICBpZiAobWVtYmVyLmlzRnVuY3Rpb24pIHsKICAgICAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3VwZXJUZWFyT2ZmKG1lbWJlcikpOwogICAgICB9IGVsc2UgewogICAgICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5zdXBlckdldChtZW1iZXIpKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN1cGVySW52b2tlKAogICAgICAgICAgZWxlbWVudE1hcC5nZXRTdXBlck5vU3VjaE1ldGhvZChjdXJyZW50TWVtYmVyLmVuY2xvc2luZ0NsYXNzKSwKICAgICAgICAgIENhbGxTdHJ1Y3R1cmUuT05FX0FSRykpOwogICAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyRmVhdHVyZShGZWF0dXJlLlNVUEVSX05PX1NVQ0hfTUVUSE9EKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTdXBlclNldChpci5OYW1lIG5hbWUpIHsKICAgIE1lbWJlckVudGl0eSBtZW1iZXIgPQogICAgICAgIGVsZW1lbnRNYXAuZ2V0U3VwZXJNZW1iZXIoY3VycmVudE1lbWJlciwgbmFtZSwgc2V0dGVyOiB0cnVlKTsKICAgIGlmIChtZW1iZXIgIT0gbnVsbCkgewogICAgICBpZiAobWVtYmVyLmlzRmllbGQpIHsKICAgICAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3VwZXJGaWVsZFNldChtZW1iZXIpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3VwZXJTZXR0ZXJTZXQobWVtYmVyKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5zdXBlckludm9rZSgKICAgICAgICAgIGVsZW1lbnRNYXAuZ2V0U3VwZXJOb1N1Y2hNZXRob2QoY3VycmVudE1lbWJlci5lbmNsb3NpbmdDbGFzcyksCiAgICAgICAgICBDYWxsU3RydWN0dXJlLk9ORV9BUkcpKTsKICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckZlYXR1cmUoRmVhdHVyZS5TVVBFUl9OT19TVUNIX01FVEhPRCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyTG9jYWxGdW5jdGlvbkludm9jYXRpb24oCiAgICAgIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24gbG9jYWxGdW5jdGlvbiwKICAgICAgaW50IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIExpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cywKICAgICAgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykgewogICAgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlID0gbmV3IENhbGxTdHJ1Y3R1cmUoCiAgICAgICAgcG9zaXRpb25hbEFyZ3VtZW50cyArIG5hbWVkQXJndW1lbnRzLmxlbmd0aCwKICAgICAgICBuYW1lZEFyZ3VtZW50cywKICAgICAgICB0eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgICBMaXN0PERhcnRUeXBlPiBkYXJ0VHlwZUFyZ3VtZW50cyA9IF9nZXRUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMpOwogICAgLy8gSW52b2NhdGlvbiBvZiBhIGxvY2FsIGZ1bmN0aW9uLiBObyBuZWVkIGZvciBkeW5hbWljIHVzZSwgYnV0CiAgICAvLyB3ZSBuZWVkIHRvIHRyYWNrIHRoZSB0eXBlIGFyZ3VtZW50cy4KICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5jbG9zdXJlQ2FsbCgKICAgICAgICBlbGVtZW50TWFwLmdldExvY2FsRnVuY3Rpb24obG9jYWxGdW5jdGlvbiksCiAgICAgICAgY2FsbFN0cnVjdHVyZSwKICAgICAgICBkYXJ0VHlwZUFyZ3VtZW50cykpOwogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogWWV0LCBhbGFzLCB3ZSBuZWVkIHRoZSBkeW5hbWljIHVzZSBmb3Igbm93LiBSZW1vdmUKICAgIC8vIHRoaXMgd2hlbiBrZXJuZWwgYWRkcyBhbiBgaXNGdW5jdGlvbkNhbGxgIGZsYWcgdG8KICAgIC8vIFtpci5NZXRob2RJbnZvY2F0aW9uXS4KICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJEeW5hbWljVXNlKG5ldyBDb25zdHJhaW5lZER5bmFtaWNVc2UoCiAgICAgICAgY2FsbFN0cnVjdHVyZS5jYWxsU2VsZWN0b3IsIG51bGwsIGRhcnRUeXBlQXJndW1lbnRzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyRHluYW1pY0ludm9jYXRpb24oCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwKICAgICAgQ2xhc3NSZWxhdGlvbiByZWxhdGlvbiwKICAgICAgaXIuTmFtZSBuYW1lLAogICAgICBpbnQgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzLAogICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICBTZWxlY3RvciBzZWxlY3RvciA9IGVsZW1lbnRNYXAuZ2V0SW52b2NhdGlvblNlbGVjdG9yKAogICAgICAgIG5hbWUsIHBvc2l0aW9uYWxBcmd1bWVudHMsIG5hbWVkQXJndW1lbnRzLCB0eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgICBMaXN0PERhcnRUeXBlPiBkYXJ0VHlwZUFyZ3VtZW50cyA9IF9nZXRUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMpOwogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckR5bmFtaWNVc2UobmV3IENvbnN0cmFpbmVkRHluYW1pY1VzZShzZWxlY3RvciwKICAgICAgICBfY29tcHV0ZVJlY2VpdmVyQ29uc3RyYWludChyZWNlaXZlclR5cGUsIHJlbGF0aW9uKSwgZGFydFR5cGVBcmd1bWVudHMpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJGdW5jdGlvbkludm9jYXRpb24oCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwKICAgICAgaW50IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIExpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cywKICAgICAgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykgewogICAgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlID0gbmV3IENhbGxTdHJ1Y3R1cmUoCiAgICAgICAgcG9zaXRpb25hbEFyZ3VtZW50cyArIG5hbWVkQXJndW1lbnRzLmxlbmd0aCwKICAgICAgICBuYW1lZEFyZ3VtZW50cywKICAgICAgICB0eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgICBMaXN0PERhcnRUeXBlPiBkYXJ0VHlwZUFyZ3VtZW50cyA9IF9nZXRUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMpOwogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckR5bmFtaWNVc2UobmV3IENvbnN0cmFpbmVkRHluYW1pY1VzZSgKICAgICAgICBjYWxsU3RydWN0dXJlLmNhbGxTZWxlY3RvciwKICAgICAgICBfY29tcHV0ZVJlY2VpdmVyQ29uc3RyYWludChyZWNlaXZlclR5cGUsIENsYXNzUmVsYXRpb24uc3VidHlwZSksCiAgICAgICAgZGFydFR5cGVBcmd1bWVudHMpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJJbnN0YW5jZUludm9jYXRpb24oCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwKICAgICAgQ2xhc3NSZWxhdGlvbiByZWxhdGlvbiwKICAgICAgaXIuTWVtYmVyIHRhcmdldCwKICAgICAgaW50IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIExpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cywKICAgICAgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykgewogICAgTGlzdDxEYXJ0VHlwZT4gZGFydFR5cGVBcmd1bWVudHMgPSBfZ2V0VHlwZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRzKTsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJEeW5hbWljVXNlKG5ldyBDb25zdHJhaW5lZER5bmFtaWNVc2UoCiAgICAgICAgZWxlbWVudE1hcC5nZXRJbnZvY2F0aW9uU2VsZWN0b3IodGFyZ2V0Lm5hbWUsIHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgICAgICAgIG5hbWVkQXJndW1lbnRzLCB0eXBlQXJndW1lbnRzLmxlbmd0aCksCiAgICAgICAgX2NvbXB1dGVSZWNlaXZlckNvbnN0cmFpbnQocmVjZWl2ZXJUeXBlLCByZWxhdGlvbiksCiAgICAgICAgZGFydFR5cGVBcmd1bWVudHMpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJEeW5hbWljR2V0KAogICAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsIENsYXNzUmVsYXRpb24gcmVsYXRpb24sIGlyLk5hbWUgbmFtZSkgewogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckR5bmFtaWNVc2UobmV3IENvbnN0cmFpbmVkRHluYW1pY1VzZSgKICAgICAgICBuZXcgU2VsZWN0b3IuZ2V0dGVyKGVsZW1lbnRNYXAuZ2V0TmFtZShuYW1lKSksCiAgICAgICAgX2NvbXB1dGVSZWNlaXZlckNvbnN0cmFpbnQocmVjZWl2ZXJUeXBlLCByZWxhdGlvbiksCiAgICAgICAgY29uc3QgPERhcnRUeXBlPltdKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVySW5zdGFuY2VHZXQoCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwgQ2xhc3NSZWxhdGlvbiByZWxhdGlvbiwgaXIuTWVtYmVyIHRhcmdldCkgewogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckR5bmFtaWNVc2UobmV3IENvbnN0cmFpbmVkRHluYW1pY1VzZSgKICAgICAgICBuZXcgU2VsZWN0b3IuZ2V0dGVyKGVsZW1lbnRNYXAuZ2V0TmFtZSh0YXJnZXQubmFtZSkpLAogICAgICAgIF9jb21wdXRlUmVjZWl2ZXJDb25zdHJhaW50KHJlY2VpdmVyVHlwZSwgcmVsYXRpb24pLAogICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bXSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckR5bmFtaWNTZXQoCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwgQ2xhc3NSZWxhdGlvbiByZWxhdGlvbiwgaXIuTmFtZSBuYW1lKSB7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyRHluYW1pY1VzZShuZXcgQ29uc3RyYWluZWREeW5hbWljVXNlKAogICAgICAgIG5ldyBTZWxlY3Rvci5zZXR0ZXIoZWxlbWVudE1hcC5nZXROYW1lKG5hbWUpKSwKICAgICAgICBfY29tcHV0ZVJlY2VpdmVyQ29uc3RyYWludChyZWNlaXZlclR5cGUsIHJlbGF0aW9uKSwKICAgICAgICBjb25zdCA8RGFydFR5cGU+W10pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJJbnN0YW5jZVNldCgKICAgICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlLCBDbGFzc1JlbGF0aW9uIHJlbGF0aW9uLCBpci5NZW1iZXIgdGFyZ2V0KSB7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyRHluYW1pY1VzZShuZXcgQ29uc3RyYWluZWREeW5hbWljVXNlKAogICAgICAgIG5ldyBTZWxlY3Rvci5zZXR0ZXIoZWxlbWVudE1hcC5nZXROYW1lKHRhcmdldC5uYW1lKSksCiAgICAgICAgX2NvbXB1dGVSZWNlaXZlckNvbnN0cmFpbnQocmVjZWl2ZXJUeXBlLCByZWxhdGlvbiksCiAgICAgICAgY29uc3QgPERhcnRUeXBlPltdKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyUnVudGltZVR5cGVVc2UoaXIuUHJvcGVydHlHZXQgbm9kZSwgUnVudGltZVR5cGVVc2VLaW5kIGtpbmQsCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwgaXIuRGFydFR5cGUgYXJndW1lbnRUeXBlKSB7CiAgICBEYXJ0VHlwZSByZWNlaXZlckRhcnRUeXBlID0gZWxlbWVudE1hcC5nZXREYXJ0VHlwZShyZWNlaXZlclR5cGUpOwogICAgRGFydFR5cGUgYXJndW1lbnREYXJ0VHlwZSA9CiAgICAgICAgYXJndW1lbnRUeXBlID09IG51bGwgPyBudWxsIDogZWxlbWVudE1hcC5nZXREYXJ0VHlwZShhcmd1bWVudFR5cGUpOwoKICAgIGlmIChfb3B0aW9ucy5vbWl0SW1wbGljaXRDaGVja3MpIHsKICAgICAgc3dpdGNoIChraW5kKSB7CiAgICAgICAgY2FzZSBSdW50aW1lVHlwZVVzZUtpbmQuc3RyaW5nOgogICAgICAgICAgaWYgKCFfb3B0aW9ucy5sYXhSdW50aW1lVHlwZVRvU3RyaW5nKSB7CiAgICAgICAgICAgIGlmIChyZWNlaXZlckRhcnRUeXBlID09IGNvbW1vbkVsZW1lbnRzLm9iamVjdFR5cGUpIHsKICAgICAgICAgICAgICByZXBvcnRlci5yZXBvcnRIaW50TWVzc2FnZShjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZShub2RlKSwKICAgICAgICAgICAgICAgICAgTWVzc2FnZUtpbmQuUlVOVElNRV9UWVBFX1RPX1NUUklOR19PQkpFQ1QpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJlcG9ydGVyLnJlcG9ydEhpbnRNZXNzYWdlKAogICAgICAgICAgICAgICAgICBjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZShub2RlKSwKICAgICAgICAgICAgICAgICAgTWVzc2FnZUtpbmQuUlVOVElNRV9UWVBFX1RPX1NUUklOR19TVUJUWVBFLAogICAgICAgICAgICAgICAgICB7J3JlY2VpdmVyVHlwZSc6ICcke3JlY2VpdmVyRGFydFR5cGV9Lid9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBSdW50aW1lVHlwZVVzZUtpbmQuZXF1YWxzOgogICAgICAgIGNhc2UgUnVudGltZVR5cGVVc2VLaW5kLnVua25vd246CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclJ1bnRpbWVUeXBlVXNlKAogICAgICAgIG5ldyBSdW50aW1lVHlwZVVzZShraW5kLCByZWNlaXZlckRhcnRUeXBlLCBhcmd1bWVudERhcnRUeXBlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyQXNzZXJ0KHtib29sIHdpdGhNZXNzYWdlfSkgewogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckZlYXR1cmUoCiAgICAgICAgd2l0aE1lc3NhZ2UgPyBGZWF0dXJlLkFTU0VSVF9XSVRIX01FU1NBR0UgOiBGZWF0dXJlLkFTU0VSVCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyR2VuZXJpY0luc3RhbnRpYXRpb24oCiAgICAgIGlyLkZ1bmN0aW9uVHlwZSBleHByZXNzaW9uVHlwZSwgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVHJhY2sgd2hpY2ggYXJpdGllcyBhcmUgdXNlZCBpbiBpbnN0YW50aWF0aW9uLgogICAgaW1wYWN0QnVpbGRlci5yZWdpc3Rlckluc3RhbnRpYXRpb24obmV3IEdlbmVyaWNJbnN0YW50aWF0aW9uKAogICAgICAgIGVsZW1lbnRNYXAuZ2V0RGFydFR5cGUoZXhwcmVzc2lvblR5cGUpLAogICAgICAgIHR5cGVBcmd1bWVudHMubWFwKGVsZW1lbnRNYXAuZ2V0RGFydFR5cGUpLnRvTGlzdCgpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyU3RyaW5nQ29uY2F0ZW5hdGlvbigpIHsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJGZWF0dXJlKEZlYXR1cmUuU1RSSU5HX0lOVEVSUE9MQVRJT04pOwogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckZlYXR1cmUoRmVhdHVyZS5TVFJJTkdfSlVYVEFQT1NJVElPTik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyTG9jYWxGdW5jdGlvbihpci5UcmVlTm9kZSBub2RlKSB7CiAgICBMb2NhbCBmdW5jdGlvbiA9IGVsZW1lbnRNYXAuZ2V0TG9jYWxGdW5jdGlvbihub2RlKTsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5jbG9zdXJlKGZ1bmN0aW9uKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyTG9jYWxXaXRob3V0SW5pdGlhbGl6ZXIoKSB7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyRmVhdHVyZShGZWF0dXJlLkxPQ0FMX1dJVEhPVVRfSU5JVElBTElaRVIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlcklzQ2hlY2soaXIuRGFydFR5cGUgdHlwZSkgewogICAgaW1wYWN0QnVpbGRlcgogICAgICAgIC5yZWdpc3RlclR5cGVVc2UobmV3IFR5cGVVc2UuaXNDaGVjayhlbGVtZW50TWFwLmdldERhcnRUeXBlKHR5cGUpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVySW1wbGljaXRDYXN0KGlyLkRhcnRUeXBlIHR5cGUpIHsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJUeXBlVXNlKAogICAgICAgIG5ldyBUeXBlVXNlLmltcGxpY2l0Q2FzdChlbGVtZW50TWFwLmdldERhcnRUeXBlKHR5cGUpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyQXNDYXN0KGlyLkRhcnRUeXBlIHR5cGUpIHsKICAgIGltcGFjdEJ1aWxkZXIKICAgICAgICAucmVnaXN0ZXJUeXBlVXNlKG5ldyBUeXBlVXNlLmFzQ2FzdChlbGVtZW50TWFwLmdldERhcnRUeXBlKHR5cGUpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyVGhyb3coKSB7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyRmVhdHVyZShGZWF0dXJlLlRIUk9XX0VYUFJFU1NJT04pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN5bmNGb3JJbihpci5EYXJ0VHlwZSBpdGVyYWJsZVR5cGUpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSByZWNlaXZlciBjb25zdHJhaW50cyBmb3IgdGhlIGR5bmFtaWMgdXNlcyBpbgogICAgLy8gc3Ryb25nIG1vZGUuCiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyRmVhdHVyZShGZWF0dXJlLlNZTkNfRk9SX0lOKTsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJEeW5hbWljVXNlKG5ldyBEeW5hbWljVXNlKFNlbGVjdG9ycy5pdGVyYXRvcikpOwogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckR5bmFtaWNVc2UobmV3IER5bmFtaWNVc2UoU2VsZWN0b3JzLmN1cnJlbnQpKTsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJEeW5hbWljVXNlKG5ldyBEeW5hbWljVXNlKFNlbGVjdG9ycy5tb3ZlTmV4dCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckFzeW5jRm9ySW4oaXIuRGFydFR5cGUgaXRlcmFibGVUeXBlKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2UgcmVjZWl2ZXIgY29uc3RyYWludHMgZm9yIHRoZSBkeW5hbWljIHVzZXMgaW4KICAgIC8vIHN0cm9uZyBtb2RlLgogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckZlYXR1cmUoRmVhdHVyZS5BU1lOQ19GT1JfSU4pOwogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckR5bmFtaWNVc2UobmV3IER5bmFtaWNVc2UoU2VsZWN0b3JzLmNhbmNlbCkpOwogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckR5bmFtaWNVc2UobmV3IER5bmFtaWNVc2UoU2VsZWN0b3JzLmN1cnJlbnQpKTsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJEeW5hbWljVXNlKG5ldyBEeW5hbWljVXNlKFNlbGVjdG9ycy5tb3ZlTmV4dCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckNhdGNoKCkgewogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckZlYXR1cmUoRmVhdHVyZS5DQVRDSF9TVEFURU1FTlQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN0YWNrVHJhY2UoKSB7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyRmVhdHVyZShGZWF0dXJlLlNUQUNLX1RSQUNFX0lOX0NBVENIKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJDYXRjaFR5cGUoaXIuRGFydFR5cGUgdHlwZSkgewogICAgaW1wYWN0QnVpbGRlcgogICAgICAgIC5yZWdpc3RlclR5cGVVc2UobmV3IFR5cGVVc2UuY2F0Y2hUeXBlKGVsZW1lbnRNYXAuZ2V0RGFydFR5cGUodHlwZSkpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJUeXBlTGl0ZXJhbChpci5EYXJ0VHlwZSB0eXBlLCBpci5MaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQpIHsKICAgIEltcG9ydEVudGl0eSBkZWZlcnJlZEltcG9ydCA9IGVsZW1lbnRNYXAuZ2V0SW1wb3J0KGltcG9ydCk7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyVHlwZVVzZSgKICAgICAgICBuZXcgVHlwZVVzZS50eXBlTGl0ZXJhbChlbGVtZW50TWFwLmdldERhcnRUeXBlKHR5cGUpLCBkZWZlcnJlZEltcG9ydCkpOwogICAgaWYgKHR5cGUgaXMgaXIuRnVuY3Rpb25UeXBlKSB7CiAgICAgIGFzc2VydCh0eXBlLnR5cGVkZWYgIT0gbnVsbCk7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENhbiB3ZSBhdm9pZCB0aGUgdHlwZWRlZiB0eXBlIGFsdG9nZXRoZXI/CiAgICAgIC8vIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIHR5cGVkZWYgaXMgbGl2ZS4KICAgICAgZWxlbWVudE1hcC5nZXRUeXBlZGVmVHlwZSh0eXBlLnR5cGVkZWYpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckZpZWxkSW5pdGlhbGl6YXRpb24oaXIuRmllbGQgbm9kZSkgewogICAgaW1wYWN0QnVpbGRlcgogICAgICAgIC5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLmZpZWxkSW5pdChlbGVtZW50TWFwLmdldEZpZWxkKG5vZGUpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyRmllbGRDb25zdGFudEluaXRpYWxpemF0aW9uKAogICAgICBpci5GaWVsZCBub2RlLCBDb25zdGFudFJlZmVyZW5jZSBjb25zdGFudCkgewogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLmZpZWxkQ29uc3RhbnRJbml0KAogICAgICAgIGVsZW1lbnRNYXAuZ2V0RmllbGQobm9kZSksCiAgICAgICAgY29uc3RhbnQuY29uc3RhbnQuYWNjZXB0KF9jb25zdGFudFZhbHVlZmllcikpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJSZWRpcmVjdGluZ0luaXRpYWxpemVyKAogICAgICBpci5Db25zdHJ1Y3RvciBjb25zdHJ1Y3RvciwKICAgICAgaW50IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIExpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cywKICAgICAgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykgewogICAgQ29uc3RydWN0b3JFbnRpdHkgdGFyZ2V0ID0gZWxlbWVudE1hcC5nZXRDb25zdHJ1Y3Rvcihjb25zdHJ1Y3Rvcik7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3VwZXJDb25zdHJ1Y3Rvckludm9rZSgKICAgICAgICB0YXJnZXQsCiAgICAgICAgbmV3IENhbGxTdHJ1Y3R1cmUocG9zaXRpb25hbEFyZ3VtZW50cyArIG5hbWVkQXJndW1lbnRzLmxlbmd0aCwKICAgICAgICAgICAgbmFtZWRBcmd1bWVudHMsIHR5cGVBcmd1bWVudHMubGVuZ3RoKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckxvYWRMaWJyYXJ5KCkgewogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN0YXRpY0ludm9rZSgKICAgICAgICBjb21tb25FbGVtZW50cy5sb2FkRGVmZXJyZWRMaWJyYXJ5LCBDYWxsU3RydWN0dXJlLk9ORV9BUkcpKTsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJGZWF0dXJlKEZlYXR1cmUuTE9BRF9MSUJSQVJZKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTd2l0Y2hTdGF0ZW1lbnROb2RlKGlyLlN3aXRjaFN0YXRlbWVudCBub2RlKSB7CiAgICAvLyBUT0RPKDMyNTU3KTogUmVtb3ZlIHRoaXMgd2hlbiBpc3N1ZSAzMjU1NyBpcyBmaXhlZC4KICAgIGlyLlRyZWVOb2RlIGZpcnN0Q2FzZTsKICAgIERhcnRUeXBlIGZpcnN0Q2FzZVR5cGU7CiAgICBEaWFnbm9zdGljTWVzc2FnZSBlcnJvcjsKICAgIExpc3Q8RGlhZ25vc3RpY01lc3NhZ2U+IGluZm9zID0gPERpYWdub3N0aWNNZXNzYWdlPltdOwoKICAgIGJvb2wgb3ZlcnJpZGVzRXF1YWxzKEludGVyZmFjZVR5cGUgdHlwZSkgewogICAgICBpZiAodHlwZSA9PSBjb21tb25FbGVtZW50cy5zeW1ib2xJbXBsZW1lbnRhdGlvblR5cGUpIHsKICAgICAgICAvLyBUcmVhdCBzeW1ib2wgY29uc3RhbnRzIGFzIGlmIFN5bWJvbCBkb2Vzbid0IG92ZXJyaWRlIGA9PWAuCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIENsYXNzRW50aXR5IGNscyA9IHR5cGUuZWxlbWVudDsKICAgICAgd2hpbGUgKGNscyAhPSBudWxsKSB7CiAgICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciA9CiAgICAgICAgICAgIGVsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50Lmxvb2t1cENsYXNzTWVtYmVyKGNscywgJz09Jyk7CiAgICAgICAgaWYgKG1lbWJlci5pc0Fic3RyYWN0KSB7CiAgICAgICAgICBjbHMgPSBlbGVtZW50TWFwLmVsZW1lbnRFbnZpcm9ubWVudC5nZXRTdXBlckNsYXNzKGNscyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBtZW1iZXIuZW5jbG9zaW5nQ2xhc3MgIT0gY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3M7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBmb3IgKGlyLlN3aXRjaENhc2Ugc3dpdGNoQ2FzZSBpbiBub2RlLmNhc2VzKSB7CiAgICAgIGZvciAoaXIuRXhwcmVzc2lvbiBleHByZXNzaW9uIGluIHN3aXRjaENhc2UuZXhwcmVzc2lvbnMpIHsKICAgICAgICBDb25zdGFudFZhbHVlIHZhbHVlID0gZWxlbWVudE1hcC5nZXRDb25zdGFudFZhbHVlKGV4cHJlc3Npb24pOwogICAgICAgIERhcnRUeXBlIHR5cGUgPSB2YWx1ZS5nZXRUeXBlKGVsZW1lbnRNYXAuY29tbW9uRWxlbWVudHMpOwogICAgICAgIGlmIChmaXJzdENhc2VUeXBlID09IG51bGwpIHsKICAgICAgICAgIGZpcnN0Q2FzZSA9IGV4cHJlc3Npb247CiAgICAgICAgICBmaXJzdENhc2VUeXBlID0gdHlwZTsKCiAgICAgICAgICAvLyBXZSBvbmx5IHJlcG9ydCB0aGUgYmFkIHR5cGUgb24gdGhlIGZpcnN0IGNsYXNzIGVsZW1lbnQuIEFsbCBvdGhlcnMKICAgICAgICAgIC8vIGdldCBhICJ0eXBlIGRpZmZlcnMiIGVycm9yLgogICAgICAgICAgaWYgKHR5cGUgPT0gY29tbW9uRWxlbWVudHMuZG91YmxlVHlwZSkgewogICAgICAgICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICAgICAgICBjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZShleHByZXNzaW9uKSwKICAgICAgICAgICAgICAgIE1lc3NhZ2VLaW5kLlNXSVRDSF9DQVNFX1ZBTFVFX09WRVJSSURFU19FUVVBTFMsCiAgICAgICAgICAgICAgICB7J3R5cGUnOiAiZG91YmxlIn0pOwogICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IGNvbW1vbkVsZW1lbnRzLmZ1bmN0aW9uVHlwZSkgewogICAgICAgICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUobm9kZSksCiAgICAgICAgICAgICAgICBNZXNzYWdlS2luZC5TV0lUQ0hfQ0FTRV9GT1JCSURERU4sIHsndHlwZSc6ICJGdW5jdGlvbiJ9KTsKICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaXNPYmplY3QgJiYKICAgICAgICAgICAgICB0eXBlICE9IGNvbW1vbkVsZW1lbnRzLnR5cGVMaXRlcmFsVHlwZSAmJgogICAgICAgICAgICAgIG92ZXJyaWRlc0VxdWFscyh0eXBlKSkgewogICAgICAgICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICAgICAgICBjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZShmaXJzdENhc2UpLAogICAgICAgICAgICAgICAgTWVzc2FnZUtpbmQuU1dJVENIX0NBU0VfVkFMVUVfT1ZFUlJJREVTX0VRVUFMUywKICAgICAgICAgICAgICAgIHsndHlwZSc6IHR5cGV9KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHR5cGUgIT0gZmlyc3RDYXNlVHlwZSkgewogICAgICAgICAgICBpZiAoZXJyb3IgPT0gbnVsbCkgewogICAgICAgICAgICAgIGVycm9yID0gcmVwb3J0ZXIuY3JlYXRlTWVzc2FnZSgKICAgICAgICAgICAgICAgICAgY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUobm9kZSksCiAgICAgICAgICAgICAgICAgIE1lc3NhZ2VLaW5kLlNXSVRDSF9DQVNFX1RZUEVTX05PVF9FUVVBTCwKICAgICAgICAgICAgICAgICAgeyd0eXBlJzogZmlyc3RDYXNlVHlwZX0pOwogICAgICAgICAgICAgIGluZm9zLmFkZChyZXBvcnRlci5jcmVhdGVNZXNzYWdlKAogICAgICAgICAgICAgICAgICBjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZShmaXJzdENhc2UpLAogICAgICAgICAgICAgICAgICBNZXNzYWdlS2luZC5TV0lUQ0hfQ0FTRV9UWVBFU19OT1RfRVFVQUxfQ0FTRSwKICAgICAgICAgICAgICAgICAgeyd0eXBlJzogZmlyc3RDYXNlVHlwZX0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbmZvcy5hZGQocmVwb3J0ZXIuY3JlYXRlTWVzc2FnZSgKICAgICAgICAgICAgICAgIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKGV4cHJlc3Npb24pLAogICAgICAgICAgICAgICAgTWVzc2FnZUtpbmQuU1dJVENIX0NBU0VfVFlQRVNfTk9UX0VRVUFMX0NBU0UsCiAgICAgICAgICAgICAgICB7J3R5cGUnOiB0eXBlfSkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGVycm9yICE9IG51bGwpIHsKICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3IoZXJyb3IsIGluZm9zKTsKICAgIH0KICB9Cn0Kg4YATk48ASg1ARkfJCIoIyQhHxwhKxshGh4pKSIaSCojJB8pGwE4NCUMNAwnDCUMIgwkLAwuARcXGhUVLRkfHUJFIQEMQgEMRgEMOAEMMT0CAUgtQAw0DCcMJQwiDCQMLgFMLh1CAQxIAQxCAQxGAUovNBwaBAIBTCFFICMlIjIqJSgsASU6LEU2FQhIQgYRBAEMNDQbRwYEAT4kNwQBDB03BAEMKyIZSTlQKkUlQyxFLEVROSYUUQYEAQw9PU1QKkUlQyxFLEVOPyYGBAEMMzZAMCs7BAEMMDJAMys7BAEMNDdAOSs7BAEMNztLUCpFJUMsRSxFTj0mBgQBDCcrSwQBDC1QBAEMKU4EAQwtUAQBDC0yBAEMH0kEAQw0JjpGHRwEAQwzJjhFHRwEAQxGJjggUR0cBAEMFBgdHyMnIxhHNTUYH0AsSzpLPFFJBgE7QQYBHTQURk4WBgQBDFElQE0SUAQBDE8aTDscSB1OJScpQRAIL0YGBAEMIR0dHyMpRlBJFSQ4ShVHNQQBDCEeHyMnJT01NRgfSTlNDg1CQkYGBAEMQC8bFk4PIypBDysqSA8wHUMcSgoPHQ8GBAE6Q0IHTysHTQclSwErMAEvLy1NAUIBMj0mTAQBDB49QUkEAQxKPUYEAQxKPUYEAQxGRhxHSRpBEkk1Hw1BSSNDBgQBDCgaRxofTQ9JCA1BSSNDBgQBDCgaRhocTg9PCA1BSSNDBgQBDCgsHyMpNTUYH0lELD80Fx1POR5APwQBDCIgHhQfIyk6SklJUQQBDCMgHyMpNTUYH0lAJEkdBAEMIyAeGB8jKUlASzM8HQQBDBtIQDc8HgQBDBxMQD48HgQBDBtIQDc8HgQBDBxMQD48HgQBDEw8RiBMAScWKDJBTj4VKjc+PQ4MESgpEQgGKkcEAQwsI0UEAQwlSUtCMD4EAQwnQUEEAQwxOEYEAQwrRgQBDCsSTQQBDDAjQQQBDCoSTAQBDBk9BAEMNU0UOEpJSgQBDDZNFDlISUoEAQwZPAQBDB5BBAEMLRJPBAEMTEAjUCMkSDUvBgQBDDQSUAQBDCwzRSM4BAEMJyIfIylHShBHNQQBDB9ARTkEAQw+OxscHTsBLz1GFggmHB5IIUIRRgoIFAYBM0FHQiUiIAFQKTMpO0AlPE1KJzgnKTpAIQwRJyEuNzssMDxALQ4uOz4iDAoIBhkqBgQCAS5wYWNrYWdlOmNvbXBpbGVyL3NyYy9rZXJuZWwva2VybmVsX2ltcGFjdC5kYXJ0LnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3NzYS9sb2dnaW5nLmRhcnSiSS8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL3V0aWwvZmVhdHVyZXMuZGFydCc7CmltcG9ydCAnbm9kZXMuZGFydCc7CgovLy8gTG9nIHVzZWQgZm9yIHVuaXQgdGVzdGluZyBvcHRpbWl6YXRpb25zLgpjbGFzcyBPcHRpbWl6YXRpb25UZXN0TG9nIHsKICBMaXN0PE9wdGltaXphdGlvbkxvZ0VudHJ5PiBlbnRyaWVzID0gW107CgogIE1hcDxTdHJpbmcsIFNldDxISW5zdHJ1Y3Rpb24+PiBfdW5jb252ZXJ0ZWQ7CgogIEZlYXR1cmVzIF9yZWdpc3RlcihTdHJpbmcgdGFnLCBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwsIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQsCiAgICAgIHZvaWQgZihGZWF0dXJlcyBmZWF0dXJlcykpIHsKICAgIGlmIChjb252ZXJ0ZWQgPT0gbnVsbCkgewogICAgICBfdW5jb252ZXJ0ZWQgPz89IHt9OwogICAgICBTZXQ8SEluc3RydWN0aW9uPiBzZXQgPSBfdW5jb252ZXJ0ZWRbdGFnXSA/Pz0gbmV3IFNldDxISW5zdHJ1Y3Rpb24+KCk7CiAgICAgIGlmICghc2V0LmFkZChvcmlnaW5hbCkpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgRmVhdHVyZXMgZmVhdHVyZXMgPSBuZXcgRmVhdHVyZXMoKTsKICAgIGYoZmVhdHVyZXMpOwogICAgZW50cmllcy5hZGQobmV3IE9wdGltaXphdGlvbkxvZ0VudHJ5KHRhZywgZmVhdHVyZXMpKTsKICAgIHJldHVybiBmZWF0dXJlczsKICB9CgogIHZvaWQgcmVnaXN0ZXJGaWVsZEdldChISW52b2tlRHluYW1pY0dldHRlciBvcmlnaW5hbCwgSEZpZWxkR2V0IGNvbnZlcnRlZCkgewogICAgRmVhdHVyZXMgZmVhdHVyZXMgPSBuZXcgRmVhdHVyZXMoKTsKICAgIGlmIChjb252ZXJ0ZWQuZWxlbWVudCAhPSBudWxsKSB7CiAgICAgIGZlYXR1cmVzWyduYW1lJ10gPQogICAgICAgICAgJyR7Y29udmVydGVkLmVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MubmFtZX0uJHtjb252ZXJ0ZWQuZWxlbWVudC5uYW1lfSc7CiAgICB9IGVsc2UgewogICAgICBmZWF0dXJlc1snbmFtZSddID0gJzxudWxsLWd1YXJkPic7CiAgICB9CiAgICBlbnRyaWVzLmFkZChuZXcgT3B0aW1pemF0aW9uTG9nRW50cnkoJ0ZpZWxkR2V0JywgZmVhdHVyZXMpKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJGaWVsZFNldChISW52b2tlRHluYW1pY1NldHRlciBvcmlnaW5hbCwgW0hGaWVsZFNldCBjb252ZXJ0ZWRdKSB7CiAgICBGZWF0dXJlcyBmZWF0dXJlcyA9IG5ldyBGZWF0dXJlcygpOwogICAgaWYgKGNvbnZlcnRlZCAhPSBudWxsKSB7CiAgICAgIGZlYXR1cmVzWyduYW1lJ10gPQogICAgICAgICAgJyR7Y29udmVydGVkLmVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MubmFtZX0uJHtjb252ZXJ0ZWQuZWxlbWVudC5uYW1lfSc7CiAgICB9IGVsc2UgewogICAgICBmZWF0dXJlc1sncmVtb3ZlZCddID0gb3JpZ2luYWwuc2VsZWN0b3IubmFtZTsKICAgIH0KICAgIGVudHJpZXMuYWRkKG5ldyBPcHRpbWl6YXRpb25Mb2dFbnRyeSgnRmllbGRTZXQnLCBmZWF0dXJlcykpOwogIH0KCiAgdm9pZCByZWdpc3RlckZpZWxkQ2FsbChISW52b2tlRHluYW1pY01ldGhvZCBvcmlnaW5hbCwgSEZpZWxkR2V0IGNvbnZlcnRlZCkgewogICAgRmVhdHVyZXMgZmVhdHVyZXMgPSBuZXcgRmVhdHVyZXMoKTsKICAgIGlmIChjb252ZXJ0ZWQuZWxlbWVudCAhPSBudWxsKSB7CiAgICAgIGZlYXR1cmVzWyduYW1lJ10gPQogICAgICAgICAgJyR7Y29udmVydGVkLmVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MubmFtZX0uJHtjb252ZXJ0ZWQuZWxlbWVudC5uYW1lfSc7CiAgICB9IGVsc2UgewogICAgICBmZWF0dXJlc1snbmFtZSddID0gJzxudWxsLWd1YXJkPic7CiAgICB9CiAgICBlbnRyaWVzLmFkZChuZXcgT3B0aW1pemF0aW9uTG9nRW50cnkoJ0ZpZWxkQ2FsbCcsIGZlYXR1cmVzKSk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyQ29uc3RhbnRGaWVsZEdldCgKICAgICAgSEludm9rZUR5bmFtaWNHZXR0ZXIgb3JpZ2luYWwsIEZpZWxkRW50aXR5IGZpZWxkLCBIQ29uc3RhbnQgY29udmVydGVkKSB7CiAgICBGZWF0dXJlcyBmZWF0dXJlcyA9IG5ldyBGZWF0dXJlcygpOwogICAgZmVhdHVyZXNbJ25hbWUnXSA9ICcke2ZpZWxkLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiR7ZmllbGQubmFtZX0nOwogICAgZmVhdHVyZXNbJ3ZhbHVlJ10gPSBjb252ZXJ0ZWQuY29uc3RhbnQudG9TdHJ1Y3R1cmVkVGV4dCgpOwogICAgZW50cmllcy5hZGQobmV3IE9wdGltaXphdGlvbkxvZ0VudHJ5KCdDb25zdGFudEZpZWxkR2V0JywgZmVhdHVyZXMpKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJDb25zdGFudEZpZWxkQ2FsbCgKICAgICAgSEludm9rZUR5bmFtaWNNZXRob2Qgb3JpZ2luYWwsIEZpZWxkRW50aXR5IGZpZWxkLCBIQ29uc3RhbnQgY29udmVydGVkKSB7CiAgICBGZWF0dXJlcyBmZWF0dXJlcyA9IG5ldyBGZWF0dXJlcygpOwogICAgZmVhdHVyZXNbJ25hbWUnXSA9ICcke2ZpZWxkLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiR7ZmllbGQubmFtZX0nOwogICAgZmVhdHVyZXNbJ3ZhbHVlJ10gPSBjb252ZXJ0ZWQuY29uc3RhbnQudG9TdHJ1Y3R1cmVkVGV4dCgpOwogICAgZW50cmllcy5hZGQobmV3IE9wdGltaXphdGlvbkxvZ0VudHJ5KCdDb25zdGFudEZpZWxkQ2FsbCcsIGZlYXR1cmVzKSk7CiAgfQoKICBGZWF0dXJlcyBfcmVnaXN0ZXJTcGVjaWFsaXplcigKICAgICAgSEludm9rZUR5bmFtaWMgb3JpZ2luYWwsIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQsIFN0cmluZyBuYW1lLAogICAgICBbU3RyaW5nIHVuY29udmVydGVkTmFtZV0pIHsKICAgIGFzc2VydCghKGNvbnZlcnRlZCA9PSBudWxsICYmIHVuY29udmVydGVkTmFtZSA9PSBudWxsKSk7CiAgICByZXR1cm4gX3JlZ2lzdGVyKCdTcGVjaWFsaXplcicsIG9yaWdpbmFsLCBjb252ZXJ0ZWQsIChGZWF0dXJlcyBmZWF0dXJlcykgewogICAgICBpZiAoY29udmVydGVkICE9IG51bGwpIHsKICAgICAgICBmZWF0dXJlcy5hZGQobmFtZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZmVhdHVyZXMuYWRkKHVuY29udmVydGVkTmFtZSk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgdm9pZCByZWdpc3RlckluZGV4QXNzaWduKEhJbnZva2VEeW5hbWljIG9yaWdpbmFsLCBISW5kZXhBc3NpZ24gY29udmVydGVkKSB7CiAgICBfcmVnaXN0ZXJTcGVjaWFsaXplcihvcmlnaW5hbCwgY29udmVydGVkLCAnSW5kZXhBc3NpZ24nKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJJbmRleChISW52b2tlRHluYW1pYyBvcmlnaW5hbCwgSEluZGV4IGNvbnZlcnRlZCkgewogICAgX3JlZ2lzdGVyU3BlY2lhbGl6ZXIob3JpZ2luYWwsIGNvbnZlcnRlZCwgJ0luZGV4Jyk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyQml0Tm90KEhJbnZva2VEeW5hbWljIG9yaWdpbmFsLCBIQml0Tm90IGNvbnZlcnRlZCkgewogICAgX3JlZ2lzdGVyU3BlY2lhbGl6ZXIob3JpZ2luYWwsIGNvbnZlcnRlZCwgJ0JpdE5vdCcpOwogIH0KCiAgdm9pZCByZWdpc3RlclVuYXJ5TmVnYXRlKEhJbnZva2VEeW5hbWljIG9yaWdpbmFsLCBITmVnYXRlIGNvbnZlcnRlZCkgewogICAgX3JlZ2lzdGVyU3BlY2lhbGl6ZXIob3JpZ2luYWwsIGNvbnZlcnRlZCwgJ05lZ2F0ZScpOwogIH0KCiAgdm9pZCByZWdpc3RlckFicyhISW52b2tlRHluYW1pYyBvcmlnaW5hbCwgSEFicyBjb252ZXJ0ZWQpIHsKICAgIF9yZWdpc3RlclNwZWNpYWxpemVyKG9yaWdpbmFsLCBjb252ZXJ0ZWQsICdBYnMnKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJBZGQoSEludm9rZUR5bmFtaWMgb3JpZ2luYWwsIEhBZGQgY29udmVydGVkKSB7CiAgICBfcmVnaXN0ZXJTcGVjaWFsaXplcihvcmlnaW5hbCwgY29udmVydGVkLCAnQWRkJyk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyRGl2aWRlKEhJbnZva2VEeW5hbWljIG9yaWdpbmFsLCBIRGl2aWRlIGNvbnZlcnRlZCkgewogICAgX3JlZ2lzdGVyU3BlY2lhbGl6ZXIob3JpZ2luYWwsIGNvbnZlcnRlZCwgJ0RpdmlkZScpOwogIH0KCiAgdm9pZCByZWdpc3Rlck1vZHVsbyhISW52b2tlRHluYW1pYyBvcmlnaW5hbCwgW0hSZW1haW5kZXIgY29udmVydGVkXSkgewogICAgX3JlZ2lzdGVyU3BlY2lhbGl6ZXIob3JpZ2luYWwsIGNvbnZlcnRlZCwgJ01vZHVsbycsICdEeW5hbWljTW9kdWxvJyk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyUmVtYWluZGVyKEhJbnZva2VEeW5hbWljIG9yaWdpbmFsLCBIUmVtYWluZGVyIGNvbnZlcnRlZCkgewogICAgX3JlZ2lzdGVyU3BlY2lhbGl6ZXIob3JpZ2luYWwsIGNvbnZlcnRlZCwgJ1JlbWFpbmRlcicpOwogIH0KCiAgdm9pZCByZWdpc3Rlck11bHRpcGx5KEhJbnZva2VEeW5hbWljIG9yaWdpbmFsLCBITXVsdGlwbHkgY29udmVydGVkKSB7CiAgICBfcmVnaXN0ZXJTcGVjaWFsaXplcihvcmlnaW5hbCwgY29udmVydGVkLCAnTXVsdGlwbHknKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJTdWJ0cmFjdChISW52b2tlRHluYW1pYyBvcmlnaW5hbCwgSFN1YnRyYWN0IGNvbnZlcnRlZCkgewogICAgX3JlZ2lzdGVyU3BlY2lhbGl6ZXIob3JpZ2luYWwsIGNvbnZlcnRlZCwgJ1N1YnRyYWN0Jyk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyVHJ1bmNhdGluZ0RpdmlkZSgKICAgICAgSEludm9rZUR5bmFtaWMgb3JpZ2luYWwsIEhUcnVuY2F0aW5nRGl2aWRlIGNvbnZlcnRlZCkgewogICAgX3JlZ2lzdGVyU3BlY2lhbGl6ZXIob3JpZ2luYWwsIGNvbnZlcnRlZCwgJ1RydW5jYXRpbmdEaXZpZGUnLAogICAgICAgICdUcnVuY2F0aW5nRGl2aWRlLiR7b3JpZ2luYWwuc2VsZWN0b3IubmFtZX0nKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJTaGlmdExlZnQoSEludm9rZUR5bmFtaWMgb3JpZ2luYWwsIEhTaGlmdExlZnQgY29udmVydGVkKSB7CiAgICBfcmVnaXN0ZXJTcGVjaWFsaXplcihvcmlnaW5hbCwgY29udmVydGVkLCAnU2hpZnRMZWZ0JywKICAgICAgICAnU2hpZnRMZWZ0LiR7b3JpZ2luYWwuc2VsZWN0b3IubmFtZX0nKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJTaGlmdFJpZ2h0KEhJbnZva2VEeW5hbWljIG9yaWdpbmFsLCBIU2hpZnRSaWdodCBjb252ZXJ0ZWQpIHsKICAgIF9yZWdpc3RlclNwZWNpYWxpemVyKG9yaWdpbmFsLCBjb252ZXJ0ZWQsICdTaGlmdFJpZ2h0JywKICAgICAgICAnU2hpZnRSaWdodC4ke29yaWdpbmFsLnNlbGVjdG9yLm5hbWV9Jyk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyQml0T3IoSEludm9rZUR5bmFtaWMgb3JpZ2luYWwsIEhCaXRPciBjb252ZXJ0ZWQpIHsKICAgIF9yZWdpc3RlclNwZWNpYWxpemVyKG9yaWdpbmFsLCBjb252ZXJ0ZWQsICdCaXRPcicpOwogIH0KCiAgdm9pZCByZWdpc3RlckJpdEFuZChISW52b2tlRHluYW1pYyBvcmlnaW5hbCwgSEJpdEFuZCBjb252ZXJ0ZWQpIHsKICAgIF9yZWdpc3RlclNwZWNpYWxpemVyKG9yaWdpbmFsLCBjb252ZXJ0ZWQsICdCaXRBbmQnKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJCaXRYb3IoSEludm9rZUR5bmFtaWMgb3JpZ2luYWwsIEhCaXRYb3IgY29udmVydGVkKSB7CiAgICBfcmVnaXN0ZXJTcGVjaWFsaXplcihvcmlnaW5hbCwgY29udmVydGVkLCAnQml0WG9yJyk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyRXF1YWxzKEhJbnZva2VEeW5hbWljIG9yaWdpbmFsLCBISWRlbnRpdHkgY29udmVydGVkKSB7CiAgICBfcmVnaXN0ZXJTcGVjaWFsaXplcihvcmlnaW5hbCwgY29udmVydGVkLCAnRXF1YWxzJyk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyTGVzcyhISW52b2tlRHluYW1pYyBvcmlnaW5hbCwgSExlc3MgY29udmVydGVkKSB7CiAgICBfcmVnaXN0ZXJTcGVjaWFsaXplcihvcmlnaW5hbCwgY29udmVydGVkLCAnTGVzcycpOwogIH0KCiAgdm9pZCByZWdpc3RlckdyZWF0ZXIoSEludm9rZUR5bmFtaWMgb3JpZ2luYWwsIEhHcmVhdGVyIGNvbnZlcnRlZCkgewogICAgX3JlZ2lzdGVyU3BlY2lhbGl6ZXIob3JpZ2luYWwsIGNvbnZlcnRlZCwgJ0dyZWF0ZXInKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJMZXNzRXF1YWwoSEludm9rZUR5bmFtaWMgb3JpZ2luYWwsIEhMZXNzRXF1YWwgY29udmVydGVkKSB7CiAgICBfcmVnaXN0ZXJTcGVjaWFsaXplcihvcmlnaW5hbCwgY29udmVydGVkLCAnTGVzc0VxdWFscycpOwogIH0KCiAgdm9pZCByZWdpc3RlckdyZWF0ZXJFcXVhbChISW52b2tlRHluYW1pYyBvcmlnaW5hbCwgSEdyZWF0ZXJFcXVhbCBjb252ZXJ0ZWQpIHsKICAgIF9yZWdpc3RlclNwZWNpYWxpemVyKG9yaWdpbmFsLCBjb252ZXJ0ZWQsICdHcmVhdGVyRXF1YWxzJyk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyQ29kZVVuaXRBdChISW52b2tlRHluYW1pYyBvcmlnaW5hbCkgewogICAgRmVhdHVyZXMgZmVhdHVyZXMgPSBuZXcgRmVhdHVyZXMoKTsKICAgIGZlYXR1cmVzWyduYW1lJ10gPSBvcmlnaW5hbC5zZWxlY3Rvci5uYW1lOwogICAgZW50cmllcy5hZGQobmV3IE9wdGltaXphdGlvbkxvZ0VudHJ5KCdDb2RlVW5pdEF0JywgZmVhdHVyZXMpKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJDb21wYXJlVG8oSEludm9rZUR5bmFtaWMgb3JpZ2luYWwsIFtIQ29uc3RhbnQgY29udmVydGVkXSkgewogICAgRmVhdHVyZXMgZmVhdHVyZXMgPSBuZXcgRmVhdHVyZXMoKTsKICAgIGlmIChjb252ZXJ0ZWQgIT0gbnVsbCkgewogICAgICBmZWF0dXJlc1snY29uc3RhbnQnXSA9IGNvbnZlcnRlZC5jb25zdGFudC50b0RhcnRUZXh0KCk7CiAgICB9CiAgICBlbnRyaWVzLmFkZChuZXcgT3B0aW1pemF0aW9uTG9nRW50cnkoJ0NvbXBhcmVUbycsIGZlYXR1cmVzKSk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyU3Vic3RyaW5nKEhJbnZva2VEeW5hbWljIG9yaWdpbmFsKSB7CiAgICBGZWF0dXJlcyBmZWF0dXJlcyA9IG5ldyBGZWF0dXJlcygpOwogICAgZW50cmllcy5hZGQobmV3IE9wdGltaXphdGlvbkxvZ0VudHJ5KCdTdWJzdHJpbmcnLCBmZWF0dXJlcykpOwogIH0KCiAgdm9pZCByZWdpc3RlclRyaW0oSEludm9rZUR5bmFtaWMgb3JpZ2luYWwpIHsKICAgIEZlYXR1cmVzIGZlYXR1cmVzID0gbmV3IEZlYXR1cmVzKCk7CiAgICBlbnRyaWVzLmFkZChuZXcgT3B0aW1pemF0aW9uTG9nRW50cnkoJ1RyaW0nLCBmZWF0dXJlcykpOwogIH0KCiAgdm9pZCByZWdpc3RlclBhdHRlcm5NYXRjaChISW52b2tlRHluYW1pYyBvcmlnaW5hbCkgewogICAgRmVhdHVyZXMgZmVhdHVyZXMgPSBuZXcgRmVhdHVyZXMoKTsKICAgIGVudHJpZXMuYWRkKG5ldyBPcHRpbWl6YXRpb25Mb2dFbnRyeSgnUGF0dGVybk1hdGNoJywgZmVhdHVyZXMpKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJSb3VuZChISW52b2tlRHluYW1pYyBvcmlnaW5hbCkgewogICAgX3JlZ2lzdGVyU3BlY2lhbGl6ZXIob3JpZ2luYWwsIG51bGwsIG51bGwsICdSb3VuZCcpOwogIH0KCiAgdm9pZCByZWdpc3RlclR5cGVDb252ZXJzaW9uKAogICAgICBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwsIEhUeXBlQ29udmVyc2lvbiBjb252ZXJ0ZWQpIHsKICAgIEZlYXR1cmVzIGZlYXR1cmVzID0gbmV3IEZlYXR1cmVzKCk7CiAgICBzd2l0Y2ggKGNvbnZlcnRlZC5raW5kKSB7CiAgICAgIGNhc2UgSFR5cGVDb252ZXJzaW9uLkNIRUNLRURfTU9ERV9DSEVDSzoKICAgICAgICBmZWF0dXJlc1sna2luZCddID0gJ2NoZWNrZWQnOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEhUeXBlQ29udmVyc2lvbi5BUkdVTUVOVF9UWVBFX0NIRUNLOgogICAgICAgIGZlYXR1cmVzWydraW5kJ10gPSAnYXJndW1lbnQnOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEhUeXBlQ29udmVyc2lvbi5DQVNUX1RZUEVfQ0hFQ0s6CiAgICAgICAgZmVhdHVyZXNbJ2tpbmQnXSA9ICdjYXN0JzsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBIVHlwZUNvbnZlcnNpb24uQk9PTEVBTl9DT05WRVJTSU9OX0NIRUNLOgogICAgICAgIGZlYXR1cmVzWydraW5kJ10gPSAnYm9vbGVhbic7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSFR5cGVDb252ZXJzaW9uLlJFQ0VJVkVSX1RZUEVfQ0hFQ0s6CiAgICAgICAgZmVhdHVyZXNbJ2tpbmQnXSA9ICdyZWNlaXZlcic7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoY29udmVydGVkLnR5cGVFeHByZXNzaW9uICE9IG51bGwpIHsKICAgICAgZmVhdHVyZXNbJ3R5cGUnXSA9ICcke2NvbnZlcnRlZC50eXBlRXhwcmVzc2lvbn0nOwogICAgfQogICAgZW50cmllcy5hZGQobmV3IE9wdGltaXphdGlvbkxvZ0VudHJ5KCdUeXBlQ29udmVyc2lvbicsIGZlYXR1cmVzKSk7CiAgfQoKICBTdHJpbmcgZ2V0VGV4dCgpIHsKICAgIHJldHVybiBlbnRyaWVzLmpvaW4oJyxcbicpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ09wdGltaXphdGlvbkxvZygke2dldFRleHQoKX0pJzsKfQoKLy8vIEEgcmVnaXN0ZXJlZCBvcHRpbWl6YXRpb24uCmNsYXNzIE9wdGltaXphdGlvbkxvZ0VudHJ5IHsKICAvLy8gU3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgb3B0aW1pemF0aW9uIGtpbmQuCiAgZmluYWwgU3RyaW5nIHRhZzsKCiAgLy8vIEFkZGl0aW9uYWwgZGF0YSBmb3IgdGhpcyBvcHRpbWl6YXRpb24uCiAgZmluYWwgRmVhdHVyZXMgZmVhdHVyZXM7CgogIE9wdGltaXphdGlvbkxvZ0VudHJ5KHRoaXMudGFnLCB0aGlzLmZlYXR1cmVzKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyR0YWcoJHtmZWF0dXJlcy5nZXRUZXh0KCl9KSc7Cn0KgQkATk48ASQgFQEtHCsBLwFQIx0bTSAVCAYoEToVBAFOKCUZUA0pBkEEAVAoHRlQDTQGQQQBTyglGVANKQZCBAEhTyhFP0kEASJPKEU/SgQBIUQiPU8fHA8nCAgEAU4+BAFCOAQBRDkEAUk5BAE+NgQBPjYEAUQ5BAFJSgQBSjwEAUg7BAFIOwQBIT5CNwQBSjswBAFMPDEEAUI4BAFEOQQBRDkEAUY5BAFANwQBRjoEAUo9BAFQQAQBNSgvQwQBSygdPgZCBAE0KEIEAS8oPQQBNyhFBAEwOQQBHzooHi8mDzAnDywjDzUmDzAnDwYsOAZHBAEVIAQBDDgCAR8dPRQBLRsBMQEMNgIBJXBhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS9sb2dnaW5nLmRhcnQ4c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9mYW5nb3JuLmRhcnTAAGY/Ly8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuZmFuZ29ybjsKCmltcG9ydCAnZGFydDpjb3JlJyBoaWRlIE1hcEVudHJ5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBBcmd1bWVudHMsCiAgICAgICAgQXNFeHByZXNzaW9uLAogICAgICAgIEFzc2VydEluaXRpYWxpemVyLAogICAgICAgIEF3YWl0RXhwcmVzc2lvbiwKICAgICAgICBCbG9jaywKICAgICAgICBCb29sTGl0ZXJhbCwKICAgICAgICBCcmVha1N0YXRlbWVudCwKICAgICAgICBDYXRjaCwKICAgICAgICBDaGVja0xpYnJhcnlJc0xvYWRlZCwKICAgICAgICBDb25kaXRpb25hbEV4cHJlc3Npb24sCiAgICAgICAgRGFydFR5cGUsCiAgICAgICAgRW1wdHlTdGF0ZW1lbnQsCiAgICAgICAgRXhwcmVzc2lvbiwKICAgICAgICBFeHByZXNzaW9uU3RhdGVtZW50LAogICAgICAgIEludmFsaWRFeHByZXNzaW9uLAogICAgICAgIElzRXhwcmVzc2lvbiwKICAgICAgICBMYWJlbGVkU3RhdGVtZW50LAogICAgICAgIExldCwKICAgICAgICBMaWJyYXJ5RGVwZW5kZW5jeSwKICAgICAgICBMb2dpY2FsRXhwcmVzc2lvbiwKICAgICAgICBNYXBFbnRyeSwKICAgICAgICBNZW1iZXIsCiAgICAgICAgTmFtZSwKICAgICAgICBOYW1lZEV4cHJlc3Npb24sCiAgICAgICAgTm90LAogICAgICAgIE51bGxMaXRlcmFsLAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBSZXRocm93LAogICAgICAgIFN0YXRlbWVudCwKICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uLAogICAgICAgIFN0cmluZ0xpdGVyYWwsCiAgICAgICAgVGhpc0V4cHJlc3Npb24sCiAgICAgICAgVGhyb3csCiAgICAgICAgVHJlZU5vZGUsCiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiwKICAgICAgICBzZXRQYXJlbnRzOwoKaW1wb3J0ICcuLi9wYXJzZXIuZGFydCcgc2hvdyBvZmZzZXRGb3JUb2tlbiwgb3B0aW9uYWw7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgdW5zdXBwb3J0ZWQ7CgppbXBvcnQgJy4uL3NjYW5uZXIuZGFydCcgc2hvdyBUb2tlbjsKCmltcG9ydCAnYm9keV9idWlsZGVyLmRhcnQnIHNob3cgTGFiZWxUYXJnZXQ7CgppbXBvcnQgJ2NvbGxlY3Rpb25zLmRhcnQnCiAgICBzaG93CiAgICAgICAgRm9yRWxlbWVudCwKICAgICAgICBGb3JJbkVsZW1lbnQsCiAgICAgICAgRm9ySW5NYXBFbnRyeSwKICAgICAgICBGb3JNYXBFbnRyeSwKICAgICAgICBJZkVsZW1lbnQsCiAgICAgICAgSWZNYXBFbnRyeSwKICAgICAgICBTcHJlYWRFbGVtZW50OwoKaW1wb3J0ICdrZXJuZWxfZXhwcmVzc2lvbl9nZW5lcmF0b3IuZGFydCcKICAgIHNob3cKICAgICAgICBLZXJuZWxEZWZlcnJlZEFjY2Vzc0dlbmVyYXRvciwKICAgICAgICBLZXJuZWxEZWxheWVkQXNzaWdubWVudCwKICAgICAgICBLZXJuZWxEZWxheWVkUG9zdGZpeEluY3JlbWVudCwKICAgICAgICBLZXJuZWxJbmRleGVkQWNjZXNzR2VuZXJhdG9yLAogICAgICAgIEtlcm5lbExvYWRMaWJyYXJ5R2VuZXJhdG9yLAogICAgICAgIEtlcm5lbE51bGxBd2FyZVByb3BlcnR5QWNjZXNzR2VuZXJhdG9yLAogICAgICAgIEtlcm5lbFBhcnNlckVycm9yR2VuZXJhdG9yLAogICAgICAgIEtlcm5lbFByZWZpeFVzZUdlbmVyYXRvciwKICAgICAgICBLZXJuZWxQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvciwKICAgICAgICBLZXJuZWxSZWFkT25seUFjY2Vzc0dlbmVyYXRvciwKICAgICAgICBLZXJuZWxTdGF0aWNBY2Nlc3NHZW5lcmF0b3IsCiAgICAgICAgS2VybmVsU3VwZXJJbmRleGVkQWNjZXNzR2VuZXJhdG9yLAogICAgICAgIEtlcm5lbFN1cGVyUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IsCiAgICAgICAgS2VybmVsVGhpc0luZGV4ZWRBY2Nlc3NHZW5lcmF0b3IsCiAgICAgICAgS2VybmVsVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yLAogICAgICAgIEtlcm5lbFR5cGVVc2VHZW5lcmF0b3IsCiAgICAgICAgS2VybmVsVW5leHBlY3RlZFF1YWxpZmllZFVzZUdlbmVyYXRvciwKICAgICAgICBLZXJuZWxVbmxpbmtlZEdlbmVyYXRvciwKICAgICAgICBLZXJuZWxVbnJlc29sdmVkTmFtZUdlbmVyYXRvciwKICAgICAgICBLZXJuZWxWYXJpYWJsZVVzZUdlbmVyYXRvcjsKCmltcG9ydCAna2VybmVsX3NoYWRvd19hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBBcmd1bWVudHNKdWRnbWVudCwKICAgICAgICBBc3NlcnRJbml0aWFsaXplckp1ZGdtZW50LAogICAgICAgIEFzc2VydFN0YXRlbWVudEp1ZGdtZW50LAogICAgICAgIEJsb2NrSnVkZ21lbnQsCiAgICAgICAgQ2F0Y2hKdWRnbWVudCwKICAgICAgICBEb0p1ZGdtZW50LAogICAgICAgIERvdWJsZUp1ZGdtZW50LAogICAgICAgIEVtcHR5U3RhdGVtZW50SnVkZ21lbnQsCiAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudEp1ZGdtZW50LAogICAgICAgIEZvckp1ZGdtZW50LAogICAgICAgIElmSnVkZ21lbnQsCiAgICAgICAgSW50SnVkZ21lbnQsCiAgICAgICAgTGlzdExpdGVyYWxKdWRnbWVudCwKICAgICAgICBMb2FkTGlicmFyeUp1ZGdtZW50LAogICAgICAgIE1hcExpdGVyYWxKdWRnbWVudCwKICAgICAgICBSZXR1cm5KdWRnbWVudCwKICAgICAgICBTZXRMaXRlcmFsSnVkZ21lbnQsCiAgICAgICAgU2hhZG93TGFyZ2VJbnRMaXRlcmFsLAogICAgICAgIFN5bWJvbExpdGVyYWxKdWRnbWVudCwKICAgICAgICBTeW50aGV0aWNFeHByZXNzaW9uSnVkZ21lbnQsCiAgICAgICAgVHJ5Q2F0Y2hKdWRnbWVudCwKICAgICAgICBUcnlGaW5hbGx5SnVkZ21lbnQsCiAgICAgICAgVHlwZUxpdGVyYWxKdWRnbWVudCwKICAgICAgICBXaGlsZUp1ZGdtZW50LAogICAgICAgIFlpZWxkSnVkZ21lbnQ7CgppbXBvcnQgJ2ZvcmVzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIsCiAgICAgICAgRm9yZXN0LAogICAgICAgIEdlbmVyYXRvciwKICAgICAgICBMb2FkTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgTWVzc2FnZSwKICAgICAgICBQcmVmaXhCdWlsZGVyLAogICAgICAgIFByZWZpeFVzZUdlbmVyYXRvciwKICAgICAgICBUeXBlRGVjbGFyYXRpb25CdWlsZGVyLAogICAgICAgIFVubGlua2VkRGVjbGFyYXRpb247CgovLy8gQSBzaGFkb3cgdHJlZSBmYWN0b3J5LgpjbGFzcyBGYW5nb3JuIGV4dGVuZHMgRm9yZXN0IHsKICBjb25zdCBGYW5nb3JuKCk7CgogIEBvdmVycmlkZQogIEFyZ3VtZW50c0p1ZGdtZW50IGFyZ3VtZW50cyhMaXN0PEV4cHJlc3Npb24+IHBvc2l0aW9uYWwsIFRva2VuIHRva2VuLAogICAgICB7TGlzdDxEYXJ0VHlwZT4gdHlwZXMsIExpc3Q8TmFtZWRFeHByZXNzaW9uPiBuYW1lZH0pIHsKICAgIHJldHVybiBuZXcgQXJndW1lbnRzSnVkZ21lbnQocG9zaXRpb25hbCwgdHlwZXM6IHR5cGVzLCBuYW1lZDogbmFtZWQpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIEFyZ3VtZW50c0p1ZGdtZW50IGFyZ3VtZW50c0VtcHR5KFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gYXJndW1lbnRzKDxFeHByZXNzaW9uPltdLCB0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PE5hbWVkRXhwcmVzc2lvbj4gYXJndW1lbnRzTmFtZWQoQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5uYW1lZDsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8RXhwcmVzc2lvbj4gYXJndW1lbnRzUG9zaXRpb25hbChBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLnBvc2l0aW9uYWw7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PERhcnRUeXBlPiBhcmd1bWVudHNUeXBlQXJndW1lbnRzKEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBhcmd1bWVudHMudHlwZXM7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFyZ3VtZW50c1NldFR5cGVBcmd1bWVudHMoQXJndW1lbnRzIGFyZ3VtZW50cywgTGlzdDxEYXJ0VHlwZT4gdHlwZXMpIHsKICAgIEFyZ3VtZW50c0p1ZGdtZW50LnNldE5vbkluZmVycmFibGVBcmd1bWVudFR5cGVzKGFyZ3VtZW50cywgdHlwZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nTGl0ZXJhbCBhc0xpdGVyYWxTdHJpbmcoRXhwcmVzc2lvbiB2YWx1ZSkgPT4gdmFsdWU7CgogIEBvdmVycmlkZQogIEJvb2xMaXRlcmFsIGxpdGVyYWxCb29sKGJvb2wgdmFsdWUsIFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gbmV3IEJvb2xMaXRlcmFsKHZhbHVlKS4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIERvdWJsZUp1ZGdtZW50IGxpdGVyYWxEb3VibGUoZG91YmxlIHZhbHVlLCBUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIG5ldyBEb3VibGVKdWRnbWVudCh2YWx1ZSkuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRKdWRnbWVudCBsaXRlcmFsSW50KGludCB2YWx1ZSwgVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBuZXcgSW50SnVkZ21lbnQodmFsdWUsIHRva2VuPy5sZXhlbWUpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIFNoYWRvd0xhcmdlSW50TGl0ZXJhbCBsaXRlcmFsTGFyZ2VJbnQoU3RyaW5nIGxpdGVyYWwsIFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gbmV3IFNoYWRvd0xhcmdlSW50TGl0ZXJhbChsaXRlcmFsLCBvZmZzZXRGb3JUb2tlbih0b2tlbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdExpdGVyYWxKdWRnbWVudCBsaXRlcmFsTGlzdCgKICAgICAgVG9rZW4gY29uc3RLZXl3b3JkLAogICAgICBib29sIGlzQ29uc3QsCiAgICAgIE9iamVjdCB0eXBlQXJndW1lbnQsCiAgICAgIE9iamVjdCB0eXBlQXJndW1lbnRzLAogICAgICBUb2tlbiBsZWZ0QnJhY2tldCwKICAgICAgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucywKICAgICAgVG9rZW4gcmlnaHRCcmFja2V0KSB7CiAgICAvLyBUT0RPKGJyaWFud2lsa2Vyc29uKTogVGhlIGZpbGUgb2Zmc2V0IGNvbXB1dGVkIGJlbG93IHdpbGwgbm90IGJlIGNvcnJlY3QKICAgIC8vIGlmIHRoZXJlIGFyZSB0eXBlIGFyZ3VtZW50cyBidXQgbm8gYGNvbnN0YCBrZXl3b3JkLgogICAgcmV0dXJuIG5ldyBMaXN0TGl0ZXJhbEp1ZGdtZW50KGV4cHJlc3Npb25zLAogICAgICAgIHR5cGVBcmd1bWVudDogdHlwZUFyZ3VtZW50LCBpc0NvbnN0OiBpc0NvbnN0KQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbihjb25zdEtleXdvcmQgPz8gbGVmdEJyYWNrZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgU2V0TGl0ZXJhbEp1ZGdtZW50IGxpdGVyYWxTZXQoCiAgICAgIFRva2VuIGNvbnN0S2V5d29yZCwKICAgICAgYm9vbCBpc0NvbnN0LAogICAgICBPYmplY3QgdHlwZUFyZ3VtZW50LAogICAgICBPYmplY3QgdHlwZUFyZ3VtZW50cywKICAgICAgVG9rZW4gbGVmdEJyYWNlLAogICAgICBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zLAogICAgICBUb2tlbiByaWdodEJyYWNlKSB7CiAgICAvLyBUT0RPKGJyaWFud2lsa2Vyc29uKTogVGhlIGZpbGUgb2Zmc2V0IGNvbXB1dGVkIGJlbG93IHdpbGwgbm90IGJlIGNvcnJlY3QKICAgIC8vIGlmIHRoZXJlIGFyZSB0eXBlIGFyZ3VtZW50cyBidXQgbm8gYGNvbnN0YCBrZXl3b3JkLgogICAgcmV0dXJuIG5ldyBTZXRMaXRlcmFsSnVkZ21lbnQoZXhwcmVzc2lvbnMsCiAgICAgICAgdHlwZUFyZ3VtZW50OiB0eXBlQXJndW1lbnQsIGlzQ29uc3Q6IGlzQ29uc3QpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKGNvbnN0S2V5d29yZCA/PyBsZWZ0QnJhY2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWFwTGl0ZXJhbEp1ZGdtZW50IGxpdGVyYWxNYXAoCiAgICAgIFRva2VuIGNvbnN0S2V5d29yZCwKICAgICAgYm9vbCBpc0NvbnN0LAogICAgICBEYXJ0VHlwZSBrZXlUeXBlLAogICAgICBEYXJ0VHlwZSB2YWx1ZVR5cGUsCiAgICAgIE9iamVjdCB0eXBlQXJndW1lbnRzLAogICAgICBUb2tlbiBsZWZ0QnJhY2UsCiAgICAgIExpc3Q8TWFwRW50cnk+IGVudHJpZXMsCiAgICAgIFRva2VuIHJpZ2h0QnJhY2UpIHsKICAgIC8vIFRPRE8oYnJpYW53aWxrZXJzb24pOiBUaGUgZmlsZSBvZmZzZXQgY29tcHV0ZWQgYmVsb3cgd2lsbCBub3QgYmUgY29ycmVjdAogICAgLy8gaWYgdGhlcmUgYXJlIHR5cGUgYXJndW1lbnRzIGJ1dCBubyBgY29uc3RgIGtleXdvcmQuCiAgICByZXR1cm4gbmV3IE1hcExpdGVyYWxKdWRnbWVudChlbnRyaWVzLAogICAgICAgIGtleVR5cGU6IGtleVR5cGUsIHZhbHVlVHlwZTogdmFsdWVUeXBlLCBpc0NvbnN0OiBpc0NvbnN0KQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbihjb25zdEtleXdvcmQgPz8gbGVmdEJyYWNlKTsKICB9CgogIEBvdmVycmlkZQogIE51bGxMaXRlcmFsIGxpdGVyYWxOdWxsKFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gbmV3IE51bGxMaXRlcmFsKCkuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmdMaXRlcmFsIGxpdGVyYWxTdHJpbmcoU3RyaW5nIHZhbHVlLCBUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIG5ldyBTdHJpbmdMaXRlcmFsKHZhbHVlKS4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIFN5bWJvbExpdGVyYWxKdWRnbWVudCBsaXRlcmFsU3ltYm9sTXVsdGlwbGUoU3RyaW5nIHZhbHVlLCBUb2tlbiBoYXNoLCBfKSB7CiAgICByZXR1cm4gbmV3IFN5bWJvbExpdGVyYWxKdWRnbWVudCh2YWx1ZSkuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbihoYXNoKTsKICB9CgogIEBvdmVycmlkZQogIFN5bWJvbExpdGVyYWxKdWRnbWVudCBsaXRlcmFsU3ltYm9sU2luZ2x1YXIoU3RyaW5nIHZhbHVlLCBUb2tlbiBoYXNoLCBfKSB7CiAgICByZXR1cm4gbmV3IFN5bWJvbExpdGVyYWxKdWRnbWVudCh2YWx1ZSkuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbihoYXNoKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVMaXRlcmFsSnVkZ21lbnQgbGl0ZXJhbFR5cGUoRGFydFR5cGUgdHlwZSwgVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBuZXcgVHlwZUxpdGVyYWxKdWRnbWVudCh0eXBlKS4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIE1hcEVudHJ5IG1hcEVudHJ5KEV4cHJlc3Npb24ga2V5LCBUb2tlbiBjb2xvbiwgRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgcmV0dXJuIG5ldyBNYXBFbnRyeShrZXksIHZhbHVlKS4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKGNvbG9uKTsKICB9CgogIEBvdmVycmlkZQogIGludCByZWFkT2Zmc2V0KFRyZWVOb2RlIG5vZGUpID0+IG5vZGUuZmlsZU9mZnNldDsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBsb2FkTGlicmFyeShMaWJyYXJ5RGVwZW5kZW5jeSBkZXBlbmRlbmN5LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IExvYWRMaWJyYXJ5SnVkZ21lbnQoZGVwZW5kZW5jeSwgYXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gY2hlY2tMaWJyYXJ5SXNMb2FkZWQoTGlicmFyeURlcGVuZGVuY3kgZGVwZW5kZW5jeSkgewogICAgcmV0dXJuIG5ldyBDaGVja0xpYnJhcnlJc0xvYWRlZChkZXBlbmRlbmN5KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYXNFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgRGFydFR5cGUgdHlwZSwgVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBuZXcgQXNFeHByZXNzaW9uKGV4cHJlc3Npb24sIHR5cGUpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gc3ByZWFkRWxlbWVudChFeHByZXNzaW9uIGV4cHJlc3Npb24sIFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gbmV3IFNwcmVhZEVsZW1lbnQoZXhwcmVzc2lvbiwgdG9rZW4ubGV4ZW1lID09ICcuLi4/JykKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBpZkVsZW1lbnQoRXhwcmVzc2lvbiBjb25kaXRpb24sIEV4cHJlc3Npb24gdGhlbiwKICAgICAgRXhwcmVzc2lvbiBvdGhlcndpc2UsIFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gbmV3IElmRWxlbWVudChjb25kaXRpb24sIHRoZW4sIG90aGVyd2lzZSkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgTWFwRW50cnkgaWZNYXBFbnRyeSgKICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24sIE1hcEVudHJ5IHRoZW4sIE1hcEVudHJ5IG90aGVyd2lzZSwgVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBuZXcgSWZNYXBFbnRyeShjb25kaXRpb24sIHRoZW4sIG90aGVyd2lzZSkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBmb3JFbGVtZW50KAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlcywKICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24sCiAgICAgIExpc3Q8RXhwcmVzc2lvbj4gdXBkYXRlcywKICAgICAgRXhwcmVzc2lvbiBib2R5LAogICAgICBUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIG5ldyBGb3JFbGVtZW50KHZhcmlhYmxlcywgY29uZGl0aW9uLCB1cGRhdGVzLCBib2R5KQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICBNYXBFbnRyeSBmb3JNYXBFbnRyeSgKICAgICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXMsCiAgICAgIEV4cHJlc3Npb24gY29uZGl0aW9uLAogICAgICBMaXN0PEV4cHJlc3Npb24+IHVwZGF0ZXMsCiAgICAgIE1hcEVudHJ5IGJvZHksCiAgICAgIFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gbmV3IEZvck1hcEVudHJ5KHZhcmlhYmxlcywgY29uZGl0aW9uLCB1cGRhdGVzLCBib2R5KQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGZvckluRWxlbWVudChWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBFeHByZXNzaW9uIGl0ZXJhYmxlLAogICAgICBTdGF0ZW1lbnQgcHJvbG9ndWUsIEV4cHJlc3Npb24gYm9keSwgRXhwcmVzc2lvbiBwcm9ibGVtLCBUb2tlbiB0b2tlbiwKICAgICAge2Jvb2wgaXNBc3luYzogZmFsc2V9KSB7CiAgICByZXR1cm4gbmV3IEZvckluRWxlbWVudCh2YXJpYWJsZSwgaXRlcmFibGUsIHByb2xvZ3VlLCBib2R5LCBwcm9ibGVtLAogICAgICAgIGlzQXN5bmM6IGlzQXN5bmMpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIE1hcEVudHJ5IGZvckluTWFwRW50cnkoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgRXhwcmVzc2lvbiBpdGVyYWJsZSwKICAgICAgU3RhdGVtZW50IHByb2xvZ3VlLCBNYXBFbnRyeSBib2R5LCBFeHByZXNzaW9uIHByb2JsZW0sIFRva2VuIHRva2VuLAogICAgICB7Ym9vbCBpc0FzeW5jOiBmYWxzZX0pIHsKICAgIHJldHVybiBuZXcgRm9ySW5NYXBFbnRyeSh2YXJpYWJsZSwgaXRlcmFibGUsIHByb2xvZ3VlLCBib2R5LCBwcm9ibGVtLAogICAgICAgIGlzQXN5bmM6IGlzQXN5bmMpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIEFzc2VydEluaXRpYWxpemVyIGFzc2VydEluaXRpYWxpemVyKAogICAgICBUb2tlbiBhc3NlcnRLZXl3b3JkLAogICAgICBUb2tlbiBsZWZ0UGFyZW50aGVzaXMsCiAgICAgIEV4cHJlc3Npb24gY29uZGl0aW9uLAogICAgICBUb2tlbiBjb21tYSwKICAgICAgRXhwcmVzc2lvbiBtZXNzYWdlKSB7CiAgICByZXR1cm4gbmV3IEFzc2VydEluaXRpYWxpemVySnVkZ21lbnQoYXNzZXJ0U3RhdGVtZW50KAogICAgICAgIGFzc2VydEtleXdvcmQsIGxlZnRQYXJlbnRoZXNpcywgY29uZGl0aW9uLCBjb21tYSwgbWVzc2FnZSwgbnVsbCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50IGFzc2VydFN0YXRlbWVudChUb2tlbiBhc3NlcnRLZXl3b3JkLCBUb2tlbiBsZWZ0UGFyZW50aGVzaXMsCiAgICAgIEV4cHJlc3Npb24gY29uZGl0aW9uLCBUb2tlbiBjb21tYSwgRXhwcmVzc2lvbiBtZXNzYWdlLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIC8vIENvbXB1dGUgc3RhcnQgYW5kIGVuZCBvZmZzZXRzIGZvciB0aGUgY29uZGl0aW9uIGV4cHJlc3Npb24uCiAgICAvLyBUaGlzIGNvZGUgaXMgYSB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBiZWNhdXNlIGV4cHJlc3Npb25zIGRvbid0IGNhcnJ5CiAgICAvLyB0aGVpciBzdGFydCBhbmQgZW5kIG9mZnNldHMgY3VycmVudGx5LgogICAgLy8KICAgIC8vIFRoZSB0b2tlbiB0aGF0IGZvbGxvd3MgbGVmdFBhcmVudGhlc2lzIGlzIGNvbnNpZGVyZWQgdG8gYmUgdGhlCiAgICAvLyBmaXJzdCB0b2tlbiBvZiB0aGUgY29uZGl0aW9uLgogICAgLy8gVE9ETyhhaGUpOiB0aGlzIHJlYWxseSBzaG91bGQgYmUgY29uZGl0aW9uLmZpbGVPZmZzZXQuCiAgICBpbnQgc3RhcnRPZmZzZXQgPSBsZWZ0UGFyZW50aGVzaXMubmV4dC5vZmZzZXQ7CiAgICBpbnQgZW5kT2Zmc2V0OwogICAgewogICAgICAvLyBTZWFyY2ggZm9yd2FyZCBmcm9tIGxlZnRQYXJlbnRoZXNpcyB0byBmaW5kIHRoZSBsYXN0IHRva2VuIG9mCiAgICAgIC8vIHRoZSBjb25kaXRpb24gLSB3aGljaCBpcyBhIHRva2VuIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgY29tbWFUb2tlbiwKICAgICAgLy8gcmlnaHQgcGFyZW50aGVzaXMgb3IgYSB0cmFpbGluZyBjb21tYS4KICAgICAgVG9rZW4gY29uZGl0aW9uQm91bmRhcnkgPSBjb21tYSA/PyBsZWZ0UGFyZW50aGVzaXMuZW5kR3JvdXA7CiAgICAgIFRva2VuIGNvbmRpdGlvbkxhc3RUb2tlbiA9IGxlZnRQYXJlbnRoZXNpczsKICAgICAgd2hpbGUgKCFjb25kaXRpb25MYXN0VG9rZW4uaXNFb2YpIHsKICAgICAgICBUb2tlbiBuZXh0VG9rZW4gPSBjb25kaXRpb25MYXN0VG9rZW4ubmV4dDsKICAgICAgICBpZiAobmV4dFRva2VuID09IGNvbmRpdGlvbkJvdW5kYXJ5KSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCcsJywgbmV4dFRva2VuKSAmJgogICAgICAgICAgICBuZXh0VG9rZW4ubmV4dCA9PSBjb25kaXRpb25Cb3VuZGFyeSkgewogICAgICAgICAgLy8gVGhlIG5leHQgdG9rZW4gaXMgdHJhaWxpbmcgY29tbWEsIHdoaWNoIG1lYW5zIGN1cnJlbnQgdG9rZW4gaXMKICAgICAgICAgIC8vIHRoZSBsYXN0IHRva2VuIG9mIHRoZSBjb25kaXRpb24uCiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY29uZGl0aW9uTGFzdFRva2VuID0gbmV4dFRva2VuOwogICAgICB9CiAgICAgIGlmIChjb25kaXRpb25MYXN0VG9rZW4uaXNFb2YpIHsKICAgICAgICBlbmRPZmZzZXQgPSBzdGFydE9mZnNldCA9IC0xOwogICAgICB9IGVsc2UgewogICAgICAgIGVuZE9mZnNldCA9IGNvbmRpdGlvbkxhc3RUb2tlbi5vZmZzZXQgKyBjb25kaXRpb25MYXN0VG9rZW4ubGVuZ3RoOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IEFzc2VydFN0YXRlbWVudEp1ZGdtZW50KGNvbmRpdGlvbiwKICAgICAgICBjb25kaXRpb25TdGFydE9mZnNldDogc3RhcnRPZmZzZXQsCiAgICAgICAgY29uZGl0aW9uRW5kT2Zmc2V0OiBlbmRPZmZzZXQsCiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGF3YWl0RXhwcmVzc2lvbihFeHByZXNzaW9uIG9wZXJhbmQsIFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gbmV3IEF3YWl0RXhwcmVzc2lvbihvcGVyYW5kKS4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIFN0YXRlbWVudCBibG9jaygKICAgICAgVG9rZW4gb3BlbkJyYWNlLCBMaXN0PFN0YXRlbWVudD4gc3RhdGVtZW50cywgVG9rZW4gY2xvc2VCcmFjZSkgewogICAgTGlzdDxTdGF0ZW1lbnQ+IGNvcHk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlbWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IHN0YXRlbWVudHNbaV07CiAgICAgIGlmIChzdGF0ZW1lbnQgaXMgX1ZhcmlhYmxlc0RlY2xhcmF0aW9uKSB7CiAgICAgICAgY29weSA/Pz0gbmV3IExpc3Q8U3RhdGVtZW50Pi5mcm9tKHN0YXRlbWVudHMuZ2V0UmFuZ2UoMCwgaSkpOwogICAgICAgIGNvcHkuYWRkQWxsKHN0YXRlbWVudC5kZWNsYXJhdGlvbnMpOwogICAgICB9IGVsc2UgaWYgKGNvcHkgIT0gbnVsbCkgewogICAgICAgIGNvcHkuYWRkKHN0YXRlbWVudCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgQmxvY2tKdWRnbWVudChjb3B5ID8/IHN0YXRlbWVudHMpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKG9wZW5CcmFjZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdGF0ZW1lbnQgYnJlYWtTdGF0ZW1lbnQoVG9rZW4gYnJlYWtLZXl3b3JkLCBPYmplY3QgbGFiZWwsIFRva2VuIHNlbWljb2xvbikgewogICAgcmV0dXJuIG5ldyBCcmVha1N0YXRlbWVudChudWxsKS4uZmlsZU9mZnNldCA9IGJyZWFrS2V5d29yZC5jaGFyT2Zmc2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgQ2F0Y2ggY2F0Y2hDbGF1c2UoCiAgICAgIFRva2VuIG9uS2V5d29yZCwKICAgICAgRGFydFR5cGUgZXhjZXB0aW9uVHlwZSwKICAgICAgVG9rZW4gY2F0Y2hLZXl3b3JkLAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGV4Y2VwdGlvblBhcmFtZXRlciwKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBzdGFja1RyYWNlUGFyYW1ldGVyLAogICAgICBEYXJ0VHlwZSBzdGFja1RyYWNlVHlwZSwKICAgICAgU3RhdGVtZW50IGJvZHkpIHsKICAgIHJldHVybiBuZXcgQ2F0Y2hKdWRnbWVudChleGNlcHRpb25QYXJhbWV0ZXIsIGJvZHksCiAgICAgICAgZ3VhcmQ6IGV4Y2VwdGlvblR5cGUsIHN0YWNrVHJhY2U6IHN0YWNrVHJhY2VQYXJhbWV0ZXIpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKG9uS2V5d29yZCA/PyBjYXRjaEtleXdvcmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBjb25kaXRpb25hbEV4cHJlc3Npb24oRXhwcmVzc2lvbiBjb25kaXRpb24sIFRva2VuIHF1ZXN0aW9uLAogICAgICBFeHByZXNzaW9uIHRoZW5FeHByZXNzaW9uLCBUb2tlbiBjb2xvbiwgRXhwcmVzc2lvbiBlbHNlRXhwcmVzc2lvbikgewogICAgcmV0dXJuIG5ldyBDb25kaXRpb25hbEV4cHJlc3Npb24oCiAgICAgICAgY29uZGl0aW9uLCB0aGVuRXhwcmVzc2lvbiwgZWxzZUV4cHJlc3Npb24sIG51bGwpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHF1ZXN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIFN0YXRlbWVudCBjb250aW51ZVN0YXRlbWVudCgKICAgICAgVG9rZW4gY29udGludWVLZXl3b3JkLCBPYmplY3QgbGFiZWwsIFRva2VuIHNlbWljb2xvbikgewogICAgcmV0dXJuIG5ldyBCcmVha1N0YXRlbWVudChudWxsKS4uZmlsZU9mZnNldCA9IGNvbnRpbnVlS2V5d29yZC5jaGFyT2Zmc2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50IGRvU3RhdGVtZW50KFRva2VuIGRvS2V5d29yZCwgU3RhdGVtZW50IGJvZHksIFRva2VuIHdoaWxlS2V5d29yZCwKICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24sIFRva2VuIHNlbWljb2xvbikgewogICAgcmV0dXJuIG5ldyBEb0p1ZGdtZW50KGJvZHksIGNvbmRpdGlvbikuLmZpbGVPZmZzZXQgPSBkb0tleXdvcmQuY2hhck9mZnNldDsKICB9CgogIFN0YXRlbWVudCBleHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnRKdWRnbWVudChleHByZXNzaW9uKTsKICB9CgogIEBvdmVycmlkZQogIFN0YXRlbWVudCBlbXB0eVN0YXRlbWVudChUb2tlbiBzZW1pY29sb24pIHsKICAgIHJldHVybiBuZXcgRW1wdHlTdGF0ZW1lbnRKdWRnbWVudCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50IGZvclN0YXRlbWVudCgKICAgICAgVG9rZW4gZm9yS2V5d29yZCwKICAgICAgVG9rZW4gbGVmdFBhcmVudGhlc2lzLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlcywKICAgICAgVG9rZW4gbGVmdFNlcGFyYXRvciwKICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24sCiAgICAgIFN0YXRlbWVudCBjb25kaXRpb25TdGF0ZW1lbnQsCiAgICAgIExpc3Q8RXhwcmVzc2lvbj4gdXBkYXRlcnMsCiAgICAgIFRva2VuIHJpZ2h0UGFyZW50aGVzaXMsCiAgICAgIFN0YXRlbWVudCBib2R5KSB7CiAgICByZXR1cm4gbmV3IEZvckp1ZGdtZW50KHZhcmlhYmxlcywgY29uZGl0aW9uLCB1cGRhdGVycywgYm9keSkKICAgICAgLi5maWxlT2Zmc2V0ID0gZm9yS2V5d29yZC5jaGFyT2Zmc2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50IGlmU3RhdGVtZW50KFRva2VuIGlmS2V5d29yZCwgRXhwcmVzc2lvbiBjb25kaXRpb24sCiAgICAgIFN0YXRlbWVudCB0aGVuU3RhdGVtZW50LCBUb2tlbiBlbHNlS2V5d29yZCwgU3RhdGVtZW50IGVsc2VTdGF0ZW1lbnQpIHsKICAgIHJldHVybiBuZXcgSWZKdWRnbWVudChjb25kaXRpb24sIHRoZW5TdGF0ZW1lbnQsIGVsc2VTdGF0ZW1lbnQpCiAgICAgIC4uZmlsZU9mZnNldCA9IGlmS2V5d29yZC5jaGFyT2Zmc2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBpc0V4cHJlc3Npb24oCiAgICAgIEV4cHJlc3Npb24gb3BlcmFuZCwgVG9rZW4gaXNPcGVyYXRvciwgVG9rZW4gbm90T3BlcmF0b3IsIERhcnRUeXBlIHR5cGUpIHsKICAgIEV4cHJlc3Npb24gcmVzdWx0ID0gbmV3IElzRXhwcmVzc2lvbihvcGVyYW5kLCB0eXBlKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbihpc09wZXJhdG9yKTsKICAgIGlmIChub3RPcGVyYXRvciAhPSBudWxsKSB7CiAgICAgIHJlc3VsdCA9IG5vdEV4cHJlc3Npb24ocmVzdWx0LCBub3RPcGVyYXRvciwgZmFsc2UpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIFN0YXRlbWVudCBsYWJlbGVkU3RhdGVtZW50KExhYmVsVGFyZ2V0IHRhcmdldCwgU3RhdGVtZW50IHN0YXRlbWVudCkgPT4KICAgICAgc3RhdGVtZW50OwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGxvZ2ljYWxFeHByZXNzaW9uKAogICAgICBFeHByZXNzaW9uIGxlZnRPcGVyYW5kLCBUb2tlbiBvcGVyYXRvciwgRXhwcmVzc2lvbiByaWdodE9wZXJhbmQpIHsKICAgIHJldHVybiBuZXcgTG9naWNhbEV4cHJlc3Npb24oCiAgICAgICAgbGVmdE9wZXJhbmQsIG9wZXJhdG9yLnN0cmluZ1ZhbHVlLCByaWdodE9wZXJhbmQpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKG9wZXJhdG9yKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gbm90RXhwcmVzc2lvbihFeHByZXNzaW9uIG9wZXJhbmQsIFRva2VuIHRva2VuLCBib29sIGlzU3ludGhldGljKSB7CiAgICByZXR1cm4gbmV3IE5vdChvcGVyYW5kKS4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gcGFyZW50aGVzaXplZENvbmRpdGlvbigKICAgICAgVG9rZW4gbGVmdFBhcmVudGhlc2lzLCBFeHByZXNzaW9uIGV4cHJlc3Npb24sIFRva2VuIHJpZ2h0UGFyZW50aGVzaXMpIHsKICAgIHJldHVybiBleHByZXNzaW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50IHJldGhyb3dTdGF0ZW1lbnQoVG9rZW4gcmV0aHJvd0tleXdvcmQsIFRva2VuIHNlbWljb2xvbikgewogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50SnVkZ21lbnQoCiAgICAgICAgbmV3IFJldGhyb3coKS4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHJldGhyb3dLZXl3b3JkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdGF0ZW1lbnQgcmV0dXJuU3RhdGVtZW50KAogICAgICBUb2tlbiByZXR1cm5LZXl3b3JkLCBFeHByZXNzaW9uIGV4cHJlc3Npb24sIFRva2VuIHNlbWljb2xvbikgewogICAgcmV0dXJuIG5ldyBSZXR1cm5KdWRnbWVudChyZXR1cm5LZXl3b3JkPy5sZXhlbWUsIGV4cHJlc3Npb24pCiAgICAgIC4uZmlsZU9mZnNldCA9IHJldHVybktleXdvcmQuY2hhck9mZnNldDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gc3RyaW5nQ29uY2F0ZW5hdGlvbkV4cHJlc3Npb24oCiAgICAgIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMsIFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oZXhwcmVzc2lvbnMpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIFN0YXRlbWVudCBzeW50aGV0aWNMYWJlbGVkU3RhdGVtZW50KFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKICAgIHJldHVybiBuZXcgTGFiZWxlZFN0YXRlbWVudChzdGF0ZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiB0aGlzRXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIG5ldyBUaGlzRXhwcmVzc2lvbigpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiB0aHJvd0V4cHJlc3Npb24oVG9rZW4gdGhyb3dLZXl3b3JkLCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKICAgIHJldHVybiBuZXcgVGhyb3coZXhwcmVzc2lvbikuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0aHJvd0tleXdvcmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1Rocm93KE9iamVjdCBvKSA9PiBvIGlzIFRocm93OwoKICBAb3ZlcnJpZGUKICBTdGF0ZW1lbnQgdHJ5U3RhdGVtZW50KFRva2VuIHRyeUtleXdvcmQsIFN0YXRlbWVudCBib2R5LAogICAgICBMaXN0PENhdGNoPiBjYXRjaENsYXVzZXMsIFRva2VuIGZpbmFsbHlLZXl3b3JkLCBTdGF0ZW1lbnQgZmluYWxseUJsb2NrKSB7CiAgICBTdGF0ZW1lbnQgcmVzdWx0ID0gYm9keTsKICAgIGlmIChjYXRjaENsYXVzZXMgIT0gbnVsbCkgewogICAgICByZXN1bHQgPSBuZXcgVHJ5Q2F0Y2hKdWRnbWVudChyZXN1bHQsIGNhdGNoQ2xhdXNlcyk7CiAgICB9CiAgICBpZiAoZmluYWxseUJsb2NrICE9IG51bGwpIHsKICAgICAgcmVzdWx0ID0gbmV3IFRyeUZpbmFsbHlKdWRnbWVudChyZXN1bHQsIGZpbmFsbHlCbG9jayk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgX1ZhcmlhYmxlc0RlY2xhcmF0aW9uIHZhcmlhYmxlc0RlY2xhcmF0aW9uKAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IGRlY2xhcmF0aW9ucywgVXJpIHVyaSkgewogICAgcmV0dXJuIG5ldyBfVmFyaWFibGVzRGVjbGFyYXRpb24oZGVjbGFyYXRpb25zLCB1cmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXNEZWNsYXJhdGlvbkV4dHJhY3REZWNsYXJhdGlvbnMoCiAgICAgIF9WYXJpYWJsZXNEZWNsYXJhdGlvbiB2YXJpYWJsZXNEZWNsYXJhdGlvbikgewogICAgcmV0dXJuIHZhcmlhYmxlc0RlY2xhcmF0aW9uLmRlY2xhcmF0aW9uczsKICB9CgogIEBvdmVycmlkZQogIFN0YXRlbWVudCB3cmFwVmFyaWFibGVzKFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKICAgIGlmIChzdGF0ZW1lbnQgaXMgX1ZhcmlhYmxlc0RlY2xhcmF0aW9uKSB7CiAgICAgIHJldHVybiBuZXcgQmxvY2tKdWRnbWVudCgKICAgICAgICAgIG5ldyBMaXN0PFN0YXRlbWVudD4uZnJvbShzdGF0ZW1lbnQuZGVjbGFyYXRpb25zLCBncm93YWJsZTogdHJ1ZSkpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gc3RhdGVtZW50LmZpbGVPZmZzZXQ7CiAgICB9IGVsc2UgaWYgKHN0YXRlbWVudCBpcyBWYXJpYWJsZURlY2xhcmF0aW9uKSB7CiAgICAgIHJldHVybiBuZXcgQmxvY2tKdWRnbWVudCg8U3RhdGVtZW50PltzdGF0ZW1lbnRdKQogICAgICAgIC4uZmlsZU9mZnNldCA9IHN0YXRlbWVudC5maWxlT2Zmc2V0OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHN0YXRlbWVudDsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFN0YXRlbWVudCB3aGlsZVN0YXRlbWVudCgKICAgICAgVG9rZW4gd2hpbGVLZXl3b3JkLCBFeHByZXNzaW9uIGNvbmRpdGlvbiwgU3RhdGVtZW50IGJvZHkpIHsKICAgIHJldHVybiBuZXcgV2hpbGVKdWRnbWVudChjb25kaXRpb24sIGJvZHkpCiAgICAgIC4uZmlsZU9mZnNldCA9IHdoaWxlS2V5d29yZC5jaGFyT2Zmc2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50IHlpZWxkU3RhdGVtZW50KAogICAgICBUb2tlbiB5aWVsZEtleXdvcmQsIFRva2VuIHN0YXIsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICByZXR1cm4gbmV3IFlpZWxkSnVkZ21lbnQoc3RhciAhPSBudWxsLCBleHByZXNzaW9uKQogICAgICAuLmZpbGVPZmZzZXQgPSB5aWVsZEtleXdvcmQuY2hhck9mZnNldDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbkZyb21FeHByZXNzaW9uU3RhdGVtZW50KFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKICAgIHJldHVybiAoc3RhdGVtZW50IGFzIEV4cHJlc3Npb25TdGF0ZW1lbnQpLmV4cHJlc3Npb247CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzQmxvY2soT2JqZWN0IG5vZGUpID0+IG5vZGUgaXMgQmxvY2s7CgogIEBvdmVycmlkZQogIGJvb2wgaXNFbXB0eVN0YXRlbWVudChTdGF0ZW1lbnQgc3RhdGVtZW50KSA9PiBzdGF0ZW1lbnQgaXMgRW1wdHlTdGF0ZW1lbnQ7CgogIEBvdmVycmlkZQogIGJvb2wgaXNFcnJvbmVvdXNOb2RlKE9iamVjdCBub2RlKSB7CiAgICBpZiAobm9kZSBpcyBFeHByZXNzaW9uU3RhdGVtZW50KSB7CiAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gbm9kZTsKICAgICAgbm9kZSA9IHN0YXRlbWVudC5leHByZXNzaW9uOwogICAgfQogICAgaWYgKG5vZGUgaXMgVmFyaWFibGVEZWNsYXJhdGlvbikgewogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gbm9kZTsKICAgICAgbm9kZSA9IHZhcmlhYmxlLmluaXRpYWxpemVyOwogICAgfQogICAgaWYgKG5vZGUgaXMgU3ludGhldGljRXhwcmVzc2lvbkp1ZGdtZW50KSB7CiAgICAgIFN5bnRoZXRpY0V4cHJlc3Npb25KdWRnbWVudCBzeW50aCA9IG5vZGU7CiAgICAgIG5vZGUgPSBzeW50aC5kZXN1Z2FyZWQ7CiAgICB9CiAgICBpZiAobm9kZSBpcyBMZXQpIHsKICAgICAgTGV0IGxldCA9IG5vZGU7CiAgICAgIG5vZGUgPSBsZXQudmFyaWFibGUuaW5pdGlhbGl6ZXI7CiAgICB9CiAgICByZXR1cm4gbm9kZSBpcyBJbnZhbGlkRXhwcmVzc2lvbjsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNFeHByZXNzaW9uU3RhdGVtZW50KFN0YXRlbWVudCBzdGF0ZW1lbnQpID0+CiAgICAgIHN0YXRlbWVudCBpcyBFeHByZXNzaW9uU3RhdGVtZW50OwoKICBAb3ZlcnJpZGUKICBib29sIGlzVGhpc0V4cHJlc3Npb24oT2JqZWN0IG5vZGUpID0+IG5vZGUgaXMgVGhpc0V4cHJlc3Npb247CgogIEBvdmVycmlkZQogIGJvb2wgaXNWYXJpYWJsZXNEZWNsYXJhdGlvbihPYmplY3Qgbm9kZSkgPT4gbm9kZSBpcyBfVmFyaWFibGVzRGVjbGFyYXRpb247CgogIEBvdmVycmlkZQogIEtlcm5lbFZhcmlhYmxlVXNlR2VuZXJhdG9yIHZhcmlhYmxlVXNlR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgVG9rZW4gdG9rZW4sCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsCiAgICAgIERhcnRUeXBlIHByb21vdGVkVHlwZSkgewogICAgcmV0dXJuIG5ldyBLZXJuZWxWYXJpYWJsZVVzZUdlbmVyYXRvcigKICAgICAgICBoZWxwZXIsIHRva2VuLCB2YXJpYWJsZSwgcHJvbW90ZWRUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIEtlcm5lbFByb3BlcnR5QWNjZXNzR2VuZXJhdG9yIHByb3BlcnR5QWNjZXNzR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgVG9rZW4gdG9rZW4sCiAgICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIsCiAgICAgIE5hbWUgbmFtZSwKICAgICAgTWVtYmVyIGdldHRlciwKICAgICAgTWVtYmVyIHNldHRlcikgewogICAgcmV0dXJuIG5ldyBLZXJuZWxQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvci5pbnRlcm5hbCgKICAgICAgICBoZWxwZXIsIHRva2VuLCByZWNlaXZlciwgbmFtZSwgZ2V0dGVyLCBzZXR0ZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgS2VybmVsVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yIHRoaXNQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcigKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsCiAgICAgIFRva2VuIHRva2VuLAogICAgICBOYW1lIG5hbWUsCiAgICAgIE1lbWJlciBnZXR0ZXIsCiAgICAgIE1lbWJlciBzZXR0ZXIpIHsKICAgIHJldHVybiBuZXcgS2VybmVsVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yKAogICAgICAgIGhlbHBlciwgdG9rZW4sIG5hbWUsIGdldHRlciwgc2V0dGVyKTsKICB9CgogIEBvdmVycmlkZQogIEtlcm5lbE51bGxBd2FyZVByb3BlcnR5QWNjZXNzR2VuZXJhdG9yIG51bGxBd2FyZVByb3BlcnR5QWNjZXNzR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgVG9rZW4gdG9rZW4sCiAgICAgIEV4cHJlc3Npb24gcmVjZWl2ZXJFeHByZXNzaW9uLAogICAgICBOYW1lIG5hbWUsCiAgICAgIE1lbWJlciBnZXR0ZXIsCiAgICAgIE1lbWJlciBzZXR0ZXIsCiAgICAgIERhcnRUeXBlIHR5cGUpIHsKICAgIHJldHVybiBuZXcgS2VybmVsTnVsbEF3YXJlUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IoCiAgICAgICAgaGVscGVyLCB0b2tlbiwgcmVjZWl2ZXJFeHByZXNzaW9uLCBuYW1lLCBnZXR0ZXIsIHNldHRlciwgdHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBLZXJuZWxTdXBlclByb3BlcnR5QWNjZXNzR2VuZXJhdG9yIHN1cGVyUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IoCiAgICAgIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLAogICAgICBUb2tlbiB0b2tlbiwKICAgICAgTmFtZSBuYW1lLAogICAgICBNZW1iZXIgZ2V0dGVyLAogICAgICBNZW1iZXIgc2V0dGVyKSB7CiAgICByZXR1cm4gbmV3IEtlcm5lbFN1cGVyUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IoCiAgICAgICAgaGVscGVyLCB0b2tlbiwgbmFtZSwgZ2V0dGVyLCBzZXR0ZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgS2VybmVsSW5kZXhlZEFjY2Vzc0dlbmVyYXRvciBpbmRleGVkQWNjZXNzR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgVG9rZW4gdG9rZW4sCiAgICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIsCiAgICAgIEV4cHJlc3Npb24gaW5kZXgsCiAgICAgIFByb2NlZHVyZSBnZXR0ZXIsCiAgICAgIFByb2NlZHVyZSBzZXR0ZXIpIHsKICAgIHJldHVybiBuZXcgS2VybmVsSW5kZXhlZEFjY2Vzc0dlbmVyYXRvci5pbnRlcm5hbCgKICAgICAgICBoZWxwZXIsIHRva2VuLCByZWNlaXZlciwgaW5kZXgsIGdldHRlciwgc2V0dGVyKTsKICB9CgogIEBvdmVycmlkZQogIEtlcm5lbFRoaXNJbmRleGVkQWNjZXNzR2VuZXJhdG9yIHRoaXNJbmRleGVkQWNjZXNzR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgVG9rZW4gdG9rZW4sCiAgICAgIEV4cHJlc3Npb24gaW5kZXgsCiAgICAgIFByb2NlZHVyZSBnZXR0ZXIsCiAgICAgIFByb2NlZHVyZSBzZXR0ZXIpIHsKICAgIHJldHVybiBuZXcgS2VybmVsVGhpc0luZGV4ZWRBY2Nlc3NHZW5lcmF0b3IoCiAgICAgICAgaGVscGVyLCB0b2tlbiwgaW5kZXgsIGdldHRlciwgc2V0dGVyKTsKICB9CgogIEBvdmVycmlkZQogIEtlcm5lbFN1cGVySW5kZXhlZEFjY2Vzc0dlbmVyYXRvciBzdXBlckluZGV4ZWRBY2Nlc3NHZW5lcmF0b3IoCiAgICAgIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLAogICAgICBUb2tlbiB0b2tlbiwKICAgICAgRXhwcmVzc2lvbiBpbmRleCwKICAgICAgTWVtYmVyIGdldHRlciwKICAgICAgTWVtYmVyIHNldHRlcikgewogICAgcmV0dXJuIG5ldyBLZXJuZWxTdXBlckluZGV4ZWRBY2Nlc3NHZW5lcmF0b3IoCiAgICAgICAgaGVscGVyLCB0b2tlbiwgaW5kZXgsIGdldHRlciwgc2V0dGVyKTsKICB9CgogIEBvdmVycmlkZQogIEtlcm5lbFN0YXRpY0FjY2Vzc0dlbmVyYXRvciBzdGF0aWNBY2Nlc3NHZW5lcmF0b3IoCiAgICAgIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLAogICAgICBUb2tlbiB0b2tlbiwKICAgICAgTWVtYmVyIGdldHRlciwKICAgICAgTWVtYmVyIHNldHRlcikgewogICAgcmV0dXJuIG5ldyBLZXJuZWxTdGF0aWNBY2Nlc3NHZW5lcmF0b3IoaGVscGVyLCB0b2tlbiwgZ2V0dGVyLCBzZXR0ZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgS2VybmVsTG9hZExpYnJhcnlHZW5lcmF0b3IgbG9hZExpYnJhcnlHZW5lcmF0b3IoCiAgICAgIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLAogICAgICBUb2tlbiB0b2tlbiwKICAgICAgTG9hZExpYnJhcnlCdWlsZGVyIGJ1aWxkZXIpIHsKICAgIHJldHVybiBuZXcgS2VybmVsTG9hZExpYnJhcnlHZW5lcmF0b3IoaGVscGVyLCB0b2tlbiwgYnVpbGRlcik7CiAgfQoKICBAb3ZlcnJpZGUKICBLZXJuZWxEZWZlcnJlZEFjY2Vzc0dlbmVyYXRvciBkZWZlcnJlZEFjY2Vzc0dlbmVyYXRvcigKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsCiAgICAgIFRva2VuIHRva2VuLAogICAgICBQcmVmaXhVc2VHZW5lcmF0b3IgcHJlZml4R2VuZXJhdG9yLAogICAgICBHZW5lcmF0b3Igc3VmZml4R2VuZXJhdG9yKSB7CiAgICByZXR1cm4gbmV3IEtlcm5lbERlZmVycmVkQWNjZXNzR2VuZXJhdG9yKAogICAgICAgIGhlbHBlciwgdG9rZW4sIHByZWZpeEdlbmVyYXRvciwgc3VmZml4R2VuZXJhdG9yKTsKICB9CgogIEBvdmVycmlkZQogIEtlcm5lbFR5cGVVc2VHZW5lcmF0b3IgdHlwZVVzZUdlbmVyYXRvcigKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsCiAgICAgIFRva2VuIHRva2VuLAogICAgICBUeXBlRGVjbGFyYXRpb25CdWlsZGVyIGRlY2xhcmF0aW9uLAogICAgICBTdHJpbmcgcGxhaW5OYW1lRm9yUmVhZCkgewogICAgcmV0dXJuIG5ldyBLZXJuZWxUeXBlVXNlR2VuZXJhdG9yKAogICAgICAgIGhlbHBlciwgdG9rZW4sIGRlY2xhcmF0aW9uLCBwbGFpbk5hbWVGb3JSZWFkKTsKICB9CgogIEBvdmVycmlkZQogIEtlcm5lbFJlYWRPbmx5QWNjZXNzR2VuZXJhdG9yIHJlYWRPbmx5QWNjZXNzR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgVG9rZW4gdG9rZW4sCiAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwKICAgICAgU3RyaW5nIHBsYWluTmFtZUZvclJlYWQpIHsKICAgIHJldHVybiBuZXcgS2VybmVsUmVhZE9ubHlBY2Nlc3NHZW5lcmF0b3IoCiAgICAgICAgaGVscGVyLCB0b2tlbiwgZXhwcmVzc2lvbiwgcGxhaW5OYW1lRm9yUmVhZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBLZXJuZWxVbnJlc29sdmVkTmFtZUdlbmVyYXRvciB1bnJlc29sdmVkTmFtZUdlbmVyYXRvcigKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLCBOYW1lIG5hbWUpIHsKICAgIHJldHVybiBuZXcgS2VybmVsVW5yZXNvbHZlZE5hbWVHZW5lcmF0b3IoaGVscGVyLCB0b2tlbiwgbmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBLZXJuZWxVbmxpbmtlZEdlbmVyYXRvciB1bmxpbmtlZEdlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgVG9rZW4gdG9rZW4sIFVubGlua2VkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKICAgIHJldHVybiBuZXcgS2VybmVsVW5saW5rZWRHZW5lcmF0b3IoaGVscGVyLCB0b2tlbiwgZGVjbGFyYXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgS2VybmVsRGVsYXllZEFzc2lnbm1lbnQgZGVsYXllZEFzc2lnbm1lbnQoCiAgICAgIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLAogICAgICBUb2tlbiB0b2tlbiwKICAgICAgR2VuZXJhdG9yIGdlbmVyYXRvciwKICAgICAgRXhwcmVzc2lvbiB2YWx1ZSwKICAgICAgU3RyaW5nIGFzc2lnbm1lbnRPcGVyYXRvcikgewogICAgcmV0dXJuIG5ldyBLZXJuZWxEZWxheWVkQXNzaWdubWVudCgKICAgICAgICBoZWxwZXIsIHRva2VuLCBnZW5lcmF0b3IsIHZhbHVlLCBhc3NpZ25tZW50T3BlcmF0b3IpOwogIH0KCiAgQG92ZXJyaWRlCiAgS2VybmVsRGVsYXllZFBvc3RmaXhJbmNyZW1lbnQgZGVsYXllZFBvc3RmaXhJbmNyZW1lbnQoCiAgICAgIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLAogICAgICBUb2tlbiB0b2tlbiwKICAgICAgR2VuZXJhdG9yIGdlbmVyYXRvciwKICAgICAgTmFtZSBiaW5hcnlPcGVyYXRvciwKICAgICAgUHJvY2VkdXJlIGludGVyZmFjZVRhcmdldCkgewogICAgcmV0dXJuIG5ldyBLZXJuZWxEZWxheWVkUG9zdGZpeEluY3JlbWVudCgKICAgICAgICBoZWxwZXIsIHRva2VuLCBnZW5lcmF0b3IsIGJpbmFyeU9wZXJhdG9yLCBpbnRlcmZhY2VUYXJnZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgS2VybmVsUHJlZml4VXNlR2VuZXJhdG9yIHByZWZpeFVzZUdlbmVyYXRvcigKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLCBQcmVmaXhCdWlsZGVyIHByZWZpeCkgewogICAgcmV0dXJuIG5ldyBLZXJuZWxQcmVmaXhVc2VHZW5lcmF0b3IoaGVscGVyLCB0b2tlbiwgcHJlZml4KTsKICB9CgogIEBvdmVycmlkZQogIEtlcm5lbFVuZXhwZWN0ZWRRdWFsaWZpZWRVc2VHZW5lcmF0b3IgdW5leHBlY3RlZFF1YWxpZmllZFVzZUdlbmVyYXRvcigKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsCiAgICAgIFRva2VuIHRva2VuLAogICAgICBHZW5lcmF0b3IgcHJlZml4R2VuZXJhdG9yLAogICAgICBib29sIGlzVW5yZXNvbHZlZCkgewogICAgcmV0dXJuIG5ldyBLZXJuZWxVbmV4cGVjdGVkUXVhbGlmaWVkVXNlR2VuZXJhdG9yKAogICAgICAgIGhlbHBlciwgdG9rZW4sIHByZWZpeEdlbmVyYXRvciwgaXNVbnJlc29sdmVkKTsKICB9CgogIEBvdmVycmlkZQogIEtlcm5lbFBhcnNlckVycm9yR2VuZXJhdG9yIHBhcnNlckVycm9yR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sIE1lc3NhZ2UgbWVzc2FnZSkgewogICAgcmV0dXJuIG5ldyBLZXJuZWxQYXJzZXJFcnJvckdlbmVyYXRvcihoZWxwZXIsIHRva2VuLCBtZXNzYWdlKTsKICB9Cn0KCmNsYXNzIF9WYXJpYWJsZXNEZWNsYXJhdGlvbiBleHRlbmRzIFN0YXRlbWVudCB7CiAgZmluYWwgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBkZWNsYXJhdGlvbnM7CiAgZmluYWwgVXJpIHVyaTsKCiAgX1ZhcmlhYmxlc0RlY2xhcmF0aW9uKHRoaXMuZGVjbGFyYXRpb25zLCB0aGlzLnVyaSkgewogICAgc2V0UGFyZW50cyhkZWNsYXJhdGlvbnMsIHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KHYpIHsKICAgIHVuc3VwcG9ydGVkKCJhY2NlcHQiLCBmaWxlT2Zmc2V0LCB1cmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0MSh2LCBhcmcpIHsKICAgIHVuc3VwcG9ydGVkKCJhY2NlcHQxIiwgZmlsZU9mZnNldCwgdXJpKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q2hpbGRyZW4odikgewogICAgdW5zdXBwb3J0ZWQoInZpc2l0Q2hpbGRyZW4iLCBmaWxlT2Zmc2V0LCB1cmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdHJhbnNmb3JtQ2hpbGRyZW4odikgewogICAgdW5zdXBwb3J0ZWQoInRyYW5zZm9ybUNoaWxkcmVuIiwgZmlsZU9mZnNldCwgdXJpKTsKICB9Cn0Kg3MATk48ARcBIgEhCRMWGxkPFRgPHh8SGBQdGxYaDRsbEhAOGQ0VExETHRcYDxIdFAE3ASwBJQEtARoJFBYXFRMUFwEqCSchJyYkMCQiJyclKywqKyAvISckASAJGyMhFxcUGCAlFRQVHR0cGBwfHyUaHB0XFwEVCSMQExwRFxwgHQEbHxMBDEg9SSwEAQwyLQQBDD4cBAEMPiEEAQw/HAQBDE5HBAEMPAEMNUcEAQw8SgQBDDMxLAQBDEdGBAEMIxoUGxwZJBxQOzA2QgQBDCEaFBscFyQaUDsvNkAEAQwhGhQYGhwXHhpQOytCQAQBDClCBAEMO0kEAQxNUAQBDE1QBAEMQE4EAQxFSQQBDDQBDE47BAEMQjEEAQxPLiwEAQxBQSwEAQw+KzUsBAEMF042LAQBDBkrHCAXFT8sBAEMGCscIBUVQCwEAQxNTB9JGiwEAQxMSh9KGiwEAQwnGx0cExw6SwQBDEhQQ0suB0YlPjMTBkdQMEMyKjMuES8zTC4RCigIJiYPSwgGMisnGwQBDEBNBAEME0caMiswRi0hHQgGMTAEAQxQSwQBDBUXHhouLx8YNz9ABAEMSUsmOS8EAQwfPk4EAQxNL08EAUo4BAEMLikEAQwaGB0rGxwkIR4YQSwEAQw/TUMrBAEMG1A4MR86BhMEAQxJEQEMIEkiOS8EAQxQQQQBDCVOFwQBDEYsRQQBDB1FQS8EAQwsMzAsBAEMPSwEAQwrRQQBDEpNBAEMKAEMO1AdIDsGID0GEwQBDC45OQQBDEU0LgQBDDEuIEwtMzctDRgGBAEMHEIuLgQBDBxQNy4EAQxJOgQBDC4BDE0BDCYnLCMGJysjBi8wHgYXFicGJgQBDDUoAQxAAQxNAQwzKBMkHyswBAEMOSgTGxEVFzc4BAEMQSgTERUXMi4EAQxLKBMlERUVFzdIBAEMQygTERUXMy4EAQw3KBMbGBgaNjkEAQw/KBMYGBoxLwQBDEEoExgVFzIvBAEMNSgTFRdLBAEMMygTJEMEAQw5KBMqIy46BAEMKygTKiEnNwQBDDkoEx0hLjYEAQw5QkMEAQxONkQEAQwtKBMbGCMoPgQBDDkoExsbIy5EBAEML01ABAEMSSgTIRs2NwQBDDNIQwQCATAwEQE3JAQBDA4sBAEMFC0EAQwVMwQBDBk3BAIBL3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvZmFuZ29ybi5kYXJ0QnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9wYXJzZXIvZGlyZWN0aXZlX2NvbnRleHQuZGFydIzELy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCc7CmltcG9ydCAncGFyc2VyLmRhcnQnOwppbXBvcnQgJy4uLy4uL3NjYW5uZXIvdG9rZW4uZGFydCc7CgpjbGFzcyBEaXJlY3RpdmVDb250ZXh0IHsKICBEaXJlY3RpdmVTdGF0ZSBzdGF0ZSA9IERpcmVjdGl2ZVN0YXRlLlVua25vd247CgogIHZvaWQgY2hlY2tTY3JpcHRUYWcoUGFyc2VyIHBhcnNlciwgVG9rZW4gdG9rZW4pIHsKICAgIGlmIChzdGF0ZSA9PSBEaXJlY3RpdmVTdGF0ZS5Vbmtub3duKSB7CiAgICAgIHN0YXRlID0gRGlyZWN0aXZlU3RhdGUuU2NyaXB0OwogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBUaGUgc2Nhbm5lciBvbmx5IHByb2R1Y2VzIHRoZSBTQ1JJUFRfVEFHCiAgICAvLyB3aGVuIGl0IGlzIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgZmlsZS4KICAgIHRocm93ICJJbnRlcm5hbCBlcnJvcjogVW5leHBlY3RlZCBzY3JpcHQgdGFnLiI7CiAgfQoKICB2b2lkIGNoZWNrRGVjbGFyYXRpb24oKSB7CiAgICBpZiAoc3RhdGUgIT0gRGlyZWN0aXZlU3RhdGUuUGFydE9mKSB7CiAgICAgIHN0YXRlID0gRGlyZWN0aXZlU3RhdGUuRGVjbGFyYXRpb25zOwogICAgfQogIH0KCiAgdm9pZCBjaGVja0V4cG9ydChQYXJzZXIgcGFyc2VyLCBUb2tlbiB0b2tlbikgewogICAgaWYgKHN0YXRlLmluZGV4IDw9IERpcmVjdGl2ZVN0YXRlLkltcG9ydEFuZEV4cG9ydC5pbmRleCkgewogICAgICBzdGF0ZSA9IERpcmVjdGl2ZVN0YXRlLkltcG9ydEFuZEV4cG9ydDsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gUmVjb3ZlcnkKICAgIGlmIChzdGF0ZSA9PSBEaXJlY3RpdmVTdGF0ZS5QYXJ0KSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLCBtZXNzYWdlRXhwb3J0QWZ0ZXJQYXJ0KTsKICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gRGlyZWN0aXZlU3RhdGUuUGFydE9mKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLCBtZXNzYWdlTm9uUGFydE9mRGlyZWN0aXZlSW5QYXJ0KTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLCBtZXNzYWdlRGlyZWN0aXZlQWZ0ZXJEZWNsYXJhdGlvbik7CiAgICB9CiAgfQoKICB2b2lkIGNoZWNrSW1wb3J0KFBhcnNlciBwYXJzZXIsIFRva2VuIHRva2VuKSB7CiAgICBpZiAoc3RhdGUuaW5kZXggPD0gRGlyZWN0aXZlU3RhdGUuSW1wb3J0QW5kRXhwb3J0LmluZGV4KSB7CiAgICAgIHN0YXRlID0gRGlyZWN0aXZlU3RhdGUuSW1wb3J0QW5kRXhwb3J0OwogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBSZWNvdmVyeQogICAgaWYgKHN0YXRlID09IERpcmVjdGl2ZVN0YXRlLlBhcnQpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4sIG1lc3NhZ2VJbXBvcnRBZnRlclBhcnQpOwogICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBEaXJlY3RpdmVTdGF0ZS5QYXJ0T2YpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4sIG1lc3NhZ2VOb25QYXJ0T2ZEaXJlY3RpdmVJblBhcnQpOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4sIG1lc3NhZ2VEaXJlY3RpdmVBZnRlckRlY2xhcmF0aW9uKTsKICAgIH0KICB9CgogIHZvaWQgY2hlY2tMaWJyYXJ5KFBhcnNlciBwYXJzZXIsIFRva2VuIHRva2VuKSB7CiAgICBpZiAoc3RhdGUuaW5kZXggPCBEaXJlY3RpdmVTdGF0ZS5MaWJyYXJ5LmluZGV4KSB7CiAgICAgIHN0YXRlID0gRGlyZWN0aXZlU3RhdGUuTGlicmFyeTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gUmVjb3ZlcnkKICAgIGlmIChzdGF0ZSA9PSBEaXJlY3RpdmVTdGF0ZS5MaWJyYXJ5KSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLCBtZXNzYWdlTXVsdGlwbGVMaWJyYXJ5RGlyZWN0aXZlcyk7CiAgICB9IGVsc2UgaWYgKHN0YXRlID09IERpcmVjdGl2ZVN0YXRlLlBhcnRPZikgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0b2tlbiwgbWVzc2FnZU5vblBhcnRPZkRpcmVjdGl2ZUluUGFydCk7CiAgICB9IGVsc2UgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0b2tlbiwgbWVzc2FnZUxpYnJhcnlEaXJlY3RpdmVOb3RGaXJzdCk7CiAgICB9CiAgfQoKICB2b2lkIGNoZWNrUGFydChQYXJzZXIgcGFyc2VyLCBUb2tlbiB0b2tlbikgewogICAgaWYgKHN0YXRlLmluZGV4IDw9IERpcmVjdGl2ZVN0YXRlLlBhcnQuaW5kZXgpIHsKICAgICAgc3RhdGUgPSBEaXJlY3RpdmVTdGF0ZS5QYXJ0OwogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBSZWNvdmVyeQogICAgaWYgKHN0YXRlID09IERpcmVjdGl2ZVN0YXRlLlBhcnRPZikgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0b2tlbiwgbWVzc2FnZU5vblBhcnRPZkRpcmVjdGl2ZUluUGFydCk7CiAgICB9IGVsc2UgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0b2tlbiwgbWVzc2FnZURpcmVjdGl2ZUFmdGVyRGVjbGFyYXRpb24pOwogICAgfQogIH0KCiAgdm9pZCBjaGVja1BhcnRPZihQYXJzZXIgcGFyc2VyLCBUb2tlbiB0b2tlbikgewogICAgaWYgKHN0YXRlID09IERpcmVjdGl2ZVN0YXRlLlVua25vd24pIHsKICAgICAgc3RhdGUgPSBEaXJlY3RpdmVTdGF0ZS5QYXJ0T2Y7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIFJlY292ZXJ5CiAgICBpZiAoc3RhdGUgPT0gRGlyZWN0aXZlU3RhdGUuUGFydE9mKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLCBtZXNzYWdlUGFydE9mVHdpY2UpOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4sIG1lc3NhZ2VOb25QYXJ0T2ZEaXJlY3RpdmVJblBhcnQpOwogICAgfQogIH0KfQoKZW51bSBEaXJlY3RpdmVTdGF0ZSB7CiAgVW5rbm93biwKICBTY3JpcHQsCiAgTGlicmFyeSwKICBJbXBvcnRBbmRFeHBvcnQsCiAgUGFydCwKICBQYXJ0T2YsCiAgRGVjbGFyYXRpb25zLAp9Cm4ATk48AR4WIwEZMQE0KyUOBjAvNAQBHCorBgQBMT8uDgYQKEQxTQ1OBgQBMT8uDgYQKEQxTQ1OBgQBMjYmDgYQK04xTQ1NBgQBLzQjDgYQKk0NTgYEATErJQ4GECpADU0GBAIBFgsKCxMIChACATlwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL2RpcmVjdGl2ZV9jb250ZXh0LmRhcnREc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3BhcnNlci9mb3J3YXJkaW5nX2xpc3RlbmVyLmRhcnTAAIyZLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vbWVzc2FnZXMuZGFydCc7CmltcG9ydCAnLi4vcGFyc2VyLmRhcnQnOwppbXBvcnQgJy4uL3NjYW5uZXIuZGFydCc7CgpjbGFzcyBGb3J3YXJkaW5nTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0ZW5lciB7CiAgTGlzdGVuZXIgbGlzdGVuZXI7CiAgYm9vbCBmb3J3YXJkRXJyb3JzID0gdHJ1ZTsKCiAgRm9yd2FyZGluZ0xpc3RlbmVyKFt0aGlzLmxpc3RlbmVyXSk7CgogIEBvdmVycmlkZQogIFVyaSBnZXQgdXJpID0+IGxpc3RlbmVyPy51cmk7CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Bcmd1bWVudHMoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkFyZ3VtZW50cyh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQXNzZXJ0KFRva2VuIGFzc2VydEtleXdvcmQsIEFzc2VydCBraW5kKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Bc3NlcnQoYXNzZXJ0S2V5d29yZCwga2luZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQXdhaXRFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Bd2FpdEV4cHJlc3Npb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkJpbmFyeUV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkJpbmFyeUV4cHJlc3Npb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkJsb2NrKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5CbG9jayh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQmxvY2tGdW5jdGlvbkJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkJsb2NrRnVuY3Rpb25Cb2R5KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5DYXNjYWRlKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5DYXNjYWRlKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5DYXNlRXhwcmVzc2lvbihUb2tlbiBjYXNlS2V5d29yZCkgewogICAgbGlzdGVuZXI/LmJlZ2luQ2FzZUV4cHJlc3Npb24oY2FzZUtleXdvcmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkNhdGNoQ2xhdXNlKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5DYXRjaENsYXVzZSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ2xhc3NPck1peGluQm9keShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luQ2xhc3NPck1peGluQm9keSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ2xhc3NEZWNsYXJhdGlvbihUb2tlbiBiZWdpbiwgVG9rZW4gYWJzdHJhY3RUb2tlbiwgVG9rZW4gbmFtZSkgewogICAgbGlzdGVuZXI/LmJlZ2luQ2xhc3NEZWNsYXJhdGlvbihiZWdpbiwgYWJzdHJhY3RUb2tlbiwgbmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ2xhc3NPck5hbWVkTWl4aW5BcHBsaWNhdGlvbihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luQ2xhc3NPck5hbWVkTWl4aW5BcHBsaWNhdGlvbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ29tYmluYXRvcnMoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkNvbWJpbmF0b3JzKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Db21waWxhdGlvblVuaXQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkNvbXBpbGF0aW9uVW5pdCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ29uZGl0aW9uYWxVcmkoVG9rZW4gaWZLZXl3b3JkKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Db25kaXRpb25hbFVyaShpZktleXdvcmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkNvbmRpdGlvbmFsVXJpcyhUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luQ29uZGl0aW9uYWxVcmlzKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Db25zdEV4cHJlc3Npb24oVG9rZW4gY29uc3RLZXl3b3JkKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Db25zdEV4cHJlc3Npb24oY29uc3RLZXl3b3JkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Db25zdExpdGVyYWwoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkNvbnN0TGl0ZXJhbCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ29uc3RydWN0b3JSZWZlcmVuY2UoVG9rZW4gc3RhcnQpIHsKICAgIGxpc3RlbmVyPy5iZWdpbkNvbnN0cnVjdG9yUmVmZXJlbmNlKHN0YXJ0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Eb1doaWxlU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Eb1doaWxlU3RhdGVtZW50KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Eb1doaWxlU3RhdGVtZW50Qm9keShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luRG9XaGlsZVN0YXRlbWVudEJvZHkodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkVsc2VTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkVsc2VTdGF0ZW1lbnQodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkVudW0oVG9rZW4gZW51bUtleXdvcmQpIHsKICAgIGxpc3RlbmVyPy5iZWdpbkVudW0oZW51bUtleXdvcmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkV4cG9ydChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luRXhwb3J0KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5GYWN0b3J5TWV0aG9kKAogICAgICBUb2tlbiBsYXN0Q29uc3VtZWQsIFRva2VuIGV4dGVybmFsVG9rZW4sIFRva2VuIGNvbnN0VG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkZhY3RvcnlNZXRob2QobGFzdENvbnN1bWVkLCBleHRlcm5hbFRva2VuLCBjb25zdFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5GaWVsZEluaXRpYWxpemVyKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5GaWVsZEluaXRpYWxpemVyKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Gb3JDb250cm9sRmxvdyhUb2tlbiBhd2FpdFRva2VuLCBUb2tlbiBmb3JUb2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luRm9yQ29udHJvbEZsb3coYXdhaXRUb2tlbiwgZm9yVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZvckluQm9keShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luRm9ySW5Cb2R5KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Gb3JJbkV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkZvckluRXhwcmVzc2lvbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRm9yU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Gb3JTdGF0ZW1lbnQodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZvclN0YXRlbWVudEJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkZvclN0YXRlbWVudEJvZHkodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZvcm1hbFBhcmFtZXRlcihUb2tlbiB0b2tlbiwgTWVtYmVyS2luZCBraW5kLCBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwKICAgICAgVG9rZW4gdmFyRmluYWxPckNvbnN0KSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Gb3JtYWxQYXJhbWV0ZXIoCiAgICAgICAgdG9rZW4sIGtpbmQsIGNvdmFyaWFudFRva2VuLCB2YXJGaW5hbE9yQ29uc3QpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZvcm1hbFBhcmFtZXRlcnMoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgbGlzdGVuZXI/LmJlZ2luRm9ybWFsUGFyYW1ldGVycyh0b2tlbiwga2luZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Mb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZ1bmN0aW9uRXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luRnVuY3Rpb25FeHByZXNzaW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5GdW5jdGlvbk5hbWUoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkZ1bmN0aW9uTmFtZSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRnVuY3Rpb25UeXBlKFRva2VuIGJlZ2luVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkZ1bmN0aW9uVHlwZShiZWdpblRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5GdW5jdGlvblR5cGVBbGlhcyhUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luRnVuY3Rpb25UeXBlQWxpYXModG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXIoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXIodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkhpZGUoVG9rZW4gaGlkZUtleXdvcmQpIHsKICAgIGxpc3RlbmVyPy5iZWdpbkhpZGUoaGlkZUtleXdvcmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbklmQ29udHJvbEZsb3coVG9rZW4gaWZUb2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luSWZDb250cm9sRmxvdyhpZlRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5UaGVuQ29udHJvbEZsb3coVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpblRoZW5Db250cm9sRmxvdyh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luSWZTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbklmU3RhdGVtZW50KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5JbXBvcnQoVG9rZW4gaW1wb3J0S2V5d29yZCkgewogICAgbGlzdGVuZXI/LmJlZ2luSW1wb3J0KGltcG9ydEtleXdvcmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkluaXRpYWxpemVkSWRlbnRpZmllcihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luSW5pdGlhbGl6ZWRJZGVudGlmaWVyKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Jbml0aWFsaXplcihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luSW5pdGlhbGl6ZXIodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkluaXRpYWxpemVycyhUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luSW5pdGlhbGl6ZXJzKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5MYWJlbGVkU3RhdGVtZW50KFRva2VuIHRva2VuLCBpbnQgbGFiZWxDb3VudCkgewogICAgbGlzdGVuZXI/LmJlZ2luTGFiZWxlZFN0YXRlbWVudCh0b2tlbiwgbGFiZWxDb3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTGlicmFyeU5hbWUoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkxpYnJhcnlOYW1lKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5MaXRlcmFsU3RyaW5nKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5MaXRlcmFsU3RyaW5nKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5MaXRlcmFsU3ltYm9sKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5MaXRlcmFsU3ltYm9sKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5NZW1iZXIoKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5NZW1iZXIoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5NZXRhZGF0YShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luTWV0YWRhdGEodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbk1ldGFkYXRhU3RhcihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luTWV0YWRhdGFTdGFyKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5NZXRob2QoVG9rZW4gZXh0ZXJuYWxUb2tlbiwgVG9rZW4gc3RhdGljVG9rZW4sIFRva2VuIGNvdmFyaWFudFRva2VuLAogICAgICBUb2tlbiB2YXJGaW5hbE9yQ29uc3QsIFRva2VuIGdldE9yU2V0LCBUb2tlbiBuYW1lKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5NZXRob2QoZXh0ZXJuYWxUb2tlbiwgc3RhdGljVG9rZW4sIGNvdmFyaWFudFRva2VuLAogICAgICAgIHZhckZpbmFsT3JDb25zdCwgZ2V0T3JTZXQsIG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbk1peGluRGVjbGFyYXRpb24oVG9rZW4gbWl4aW5LZXl3b3JkLCBUb2tlbiBuYW1lKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5NaXhpbkRlY2xhcmF0aW9uKG1peGluS2V5d29yZCwgbmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTmFtZWRGdW5jdGlvbkV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbk5hbWVkRnVuY3Rpb25FeHByZXNzaW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5OYW1lZE1peGluQXBwbGljYXRpb24oCiAgICAgIFRva2VuIGJlZ2luLCBUb2tlbiBhYnN0cmFjdFRva2VuLCBUb2tlbiBuYW1lKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5OYW1lZE1peGluQXBwbGljYXRpb24oYmVnaW4sIGFic3RyYWN0VG9rZW4sIG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbk5ld0V4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbk5ld0V4cHJlc3Npb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbk9wdGlvbmFsRm9ybWFsUGFyYW1ldGVycyhUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luT3B0aW9uYWxGb3JtYWxQYXJhbWV0ZXJzKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5QYXJ0KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5QYXJ0KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5QYXJ0T2YoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpblBhcnRPZih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luUmVkaXJlY3RpbmdGYWN0b3J5Qm9keShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luUmVkaXJlY3RpbmdGYWN0b3J5Qm9keSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luUmV0aHJvd1N0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luUmV0aHJvd1N0YXRlbWVudCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luUmV0dXJuU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5SZXR1cm5TdGF0ZW1lbnQodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblNob3coVG9rZW4gc2hvd0tleXdvcmQpIHsKICAgIGxpc3RlbmVyPy5iZWdpblNob3coc2hvd0tleXdvcmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblN3aXRjaEJsb2NrKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Td2l0Y2hCbG9jayh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luU3dpdGNoQ2FzZShpbnQgbGFiZWxDb3VudCwgaW50IGV4cHJlc3Npb25Db3VudCwgVG9rZW4gZmlyc3RUb2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luU3dpdGNoQ2FzZShsYWJlbENvdW50LCBleHByZXNzaW9uQ291bnQsIGZpcnN0VG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblN3aXRjaFN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luU3dpdGNoU3RhdGVtZW50KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5UaGVuU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5UaGVuU3RhdGVtZW50KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Ub3BMZXZlbE1lbWJlcihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luVG9wTGV2ZWxNZW1iZXIodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblRvcExldmVsTWV0aG9kKFRva2VuIGxhc3RDb25zdW1lZCwgVG9rZW4gZXh0ZXJuYWxUb2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luVG9wTGV2ZWxNZXRob2QobGFzdENvbnN1bWVkLCBleHRlcm5hbFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5UcnlTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpblRyeVN0YXRlbWVudCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luVHlwZUFyZ3VtZW50cyhUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luVHlwZUFyZ3VtZW50cyh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luVHlwZUxpc3QoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpblR5cGVMaXN0KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5UeXBlVmFyaWFibGUoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpblR5cGVWYXJpYWJsZSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luVHlwZVZhcmlhYmxlcyhUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luVHlwZVZhcmlhYmxlcyh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luVmFyaWFibGVJbml0aWFsaXplcihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luVmFyaWFibGVJbml0aWFsaXplcih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luVmFyaWFibGVzRGVjbGFyYXRpb24oVG9rZW4gdG9rZW4sIFRva2VuIHZhckZpbmFsT3JDb25zdCkgewogICAgbGlzdGVuZXI/LmJlZ2luVmFyaWFibGVzRGVjbGFyYXRpb24odG9rZW4sIHZhckZpbmFsT3JDb25zdCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luV2hpbGVTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbldoaWxlU3RhdGVtZW50KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5XaGlsZVN0YXRlbWVudEJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbldoaWxlU3RhdGVtZW50Qm9keSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luWWllbGRTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbllpZWxkU3RhdGVtZW50KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZGlzY2FyZFR5cGVSZXBsYWNlZFdpdGhDb21tZW50VHlwZUFzc2lnbigpIHsKICAgIGxpc3RlbmVyPy5kaXNjYXJkVHlwZVJlcGxhY2VkV2l0aENvbW1lbnRUeXBlQXNzaWduKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEFyZ3VtZW50cyhpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kQXJndW1lbnRzKGNvdW50LCBiZWdpblRva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEFzc2VydChUb2tlbiBhc3NlcnRLZXl3b3JkLCBBc3NlcnQga2luZCwgVG9rZW4gbGVmdFBhcmVudGhlc2lzLAogICAgICBUb2tlbiBjb21tYVRva2VuLCBUb2tlbiBzZW1pY29sb25Ub2tlbikgewogICAgbGlzdGVuZXI/LmVuZEFzc2VydCgKICAgICAgICBhc3NlcnRLZXl3b3JkLCBraW5kLCBsZWZ0UGFyZW50aGVzaXMsIGNvbW1hVG9rZW4sIHNlbWljb2xvblRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQXdhaXRFeHByZXNzaW9uKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kQXdhaXRFeHByZXNzaW9uKGJlZ2luVG9rZW4sIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQmluYXJ5RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZEJpbmFyeUV4cHJlc3Npb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRCbG9jayhpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kQmxvY2soY291bnQsIGJlZ2luVG9rZW4sIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQmxvY2tGdW5jdGlvbkJvZHkoaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZEJsb2NrRnVuY3Rpb25Cb2R5KGNvdW50LCBiZWdpblRva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENhc2NhZGUoKSB7CiAgICBsaXN0ZW5lcj8uZW5kQ2FzY2FkZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDYXNlRXhwcmVzc2lvbihUb2tlbiBjb2xvbikgewogICAgbGlzdGVuZXI/LmVuZENhc2VFeHByZXNzaW9uKGNvbG9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ2F0Y2hDbGF1c2UoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRDYXRjaENsYXVzZSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENsYXNzT3JNaXhpbkJvZHkoaW50IG1lbWJlckNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZENsYXNzT3JNaXhpbkJvZHkobWVtYmVyQ291bnQsIGJlZ2luVG9rZW4sIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ2xhc3NEZWNsYXJhdGlvbihUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZENsYXNzRGVjbGFyYXRpb24oYmVnaW5Ub2tlbiwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDb21iaW5hdG9ycyhpbnQgY291bnQpIHsKICAgIGxpc3RlbmVyPy5lbmRDb21iaW5hdG9ycyhjb3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENvbXBpbGF0aW9uVW5pdChpbnQgY291bnQsIFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kQ29tcGlsYXRpb25Vbml0KGNvdW50LCB0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENvbmRpdGlvbmFsVXJpKFRva2VuIGlmS2V5d29yZCwgVG9rZW4gbGVmdFBhcmVuLCBUb2tlbiBlcXVhbFNpZ24pIHsKICAgIGxpc3RlbmVyPy5lbmRDb25kaXRpb25hbFVyaShpZktleXdvcmQsIGxlZnRQYXJlbiwgZXF1YWxTaWduKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ29uZGl0aW9uYWxVcmlzKGludCBjb3VudCkgewogICAgbGlzdGVuZXI/LmVuZENvbmRpdGlvbmFsVXJpcyhjb3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENvbnN0RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZENvbnN0RXhwcmVzc2lvbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENvbnN0TGl0ZXJhbChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZENvbnN0TGl0ZXJhbCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENvbnN0cnVjdG9yUmVmZXJlbmNlKAogICAgICBUb2tlbiBzdGFydCwgVG9rZW4gcGVyaW9kQmVmb3JlTmFtZSwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRDb25zdHJ1Y3RvclJlZmVyZW5jZShzdGFydCwgcGVyaW9kQmVmb3JlTmFtZSwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmREb1doaWxlU3RhdGVtZW50KAogICAgICBUb2tlbiBkb0tleXdvcmQsIFRva2VuIHdoaWxlS2V5d29yZCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmREb1doaWxlU3RhdGVtZW50KGRvS2V5d29yZCwgd2hpbGVLZXl3b3JkLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZERvV2hpbGVTdGF0ZW1lbnRCb2R5KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kRG9XaGlsZVN0YXRlbWVudEJvZHkodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRFbHNlU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kRWxzZVN0YXRlbWVudCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEVudW0oVG9rZW4gZW51bUtleXdvcmQsIFRva2VuIGxlZnRCcmFjZSwgaW50IGNvdW50KSB7CiAgICBsaXN0ZW5lcj8uZW5kRW51bShlbnVtS2V5d29yZCwgbGVmdEJyYWNlLCBjb3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEV4cG9ydChUb2tlbiBleHBvcnRLZXl3b3JkLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGxpc3RlbmVyPy5lbmRFeHBvcnQoZXhwb3J0S2V5d29yZCwgc2VtaWNvbG9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRmFjdG9yeU1ldGhvZCgKICAgICAgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZmFjdG9yeUtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kRmFjdG9yeU1ldGhvZChiZWdpblRva2VuLCBmYWN0b3J5S2V5d29yZCwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGaWVsZEluaXRpYWxpemVyKFRva2VuIGFzc2lnbm1lbnQsIFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kRmllbGRJbml0aWFsaXplcihhc3NpZ25tZW50LCB0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZpZWxkcyhUb2tlbiBzdGF0aWNUb2tlbiwgVG9rZW4gY292YXJpYW50VG9rZW4sIFRva2VuIHZhckZpbmFsT3JDb25zdCwKICAgICAgaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZEZpZWxkcyhzdGF0aWNUb2tlbiwgY292YXJpYW50VG9rZW4sIHZhckZpbmFsT3JDb25zdCwgY291bnQsCiAgICAgICAgYmVnaW5Ub2tlbiwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JDb250cm9sRmxvdyhUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZEZvckNvbnRyb2xGbG93KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9ySW5Db250cm9sRmxvdyhUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZEZvckluQ29udHJvbEZsb3codG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JJbihUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZEZvckluKGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9ySW5Cb2R5KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kRm9ySW5Cb2R5KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9ySW5FeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kRm9ySW5FeHByZXNzaW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9yU3RhdGVtZW50KFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kRm9yU3RhdGVtZW50KGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9yU3RhdGVtZW50Qm9keShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZEZvclN0YXRlbWVudEJvZHkodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JtYWxQYXJhbWV0ZXIoVG9rZW4gdGhpc0tleXdvcmQsIFRva2VuIHBlcmlvZEFmdGVyVGhpcywKICAgICAgVG9rZW4gbmFtZVRva2VuLCBGb3JtYWxQYXJhbWV0ZXJLaW5kIGtpbmQsIE1lbWJlcktpbmQgbWVtYmVyS2luZCkgewogICAgbGlzdGVuZXI/LmVuZEZvcm1hbFBhcmFtZXRlcigKICAgICAgICB0aGlzS2V5d29yZCwgcGVyaW9kQWZ0ZXJUaGlzLCBuYW1lVG9rZW4sIGtpbmQsIG1lbWJlcktpbmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JtYWxQYXJhbWV0ZXJzKAogICAgICBpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuLCBNZW1iZXJLaW5kIGtpbmQpIHsKICAgIGxpc3RlbmVyPy5lbmRGb3JtYWxQYXJhbWV0ZXJzKGNvdW50LCBiZWdpblRva2VuLCBlbmRUb2tlbiwga2luZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZExvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbihUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZExvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbihlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZ1bmN0aW9uRXhwcmVzc2lvbihUb2tlbiBiZWdpblRva2VuLCBUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZEZ1bmN0aW9uRXhwcmVzc2lvbihiZWdpblRva2VuLCB0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZ1bmN0aW9uTmFtZShUb2tlbiBiZWdpblRva2VuLCBUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZEZ1bmN0aW9uTmFtZShiZWdpblRva2VuLCB0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZ1bmN0aW9uVHlwZShUb2tlbiBmdW5jdGlvblRva2VuLCBUb2tlbiBxdWVzdGlvbk1hcmspIHsKICAgIGxpc3RlbmVyPy5lbmRGdW5jdGlvblR5cGUoZnVuY3Rpb25Ub2tlbiwgcXVlc3Rpb25NYXJrKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRnVuY3Rpb25UeXBlQWxpYXMoCiAgICAgIFRva2VuIHR5cGVkZWZLZXl3b3JkLCBUb2tlbiBlcXVhbHMsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kRnVuY3Rpb25UeXBlQWxpYXModHlwZWRlZktleXdvcmQsIGVxdWFscywgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGdW5jdGlvblR5cGVkRm9ybWFsUGFyYW1ldGVyKFRva2VuIG5hbWVUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZEZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXIobmFtZVRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kSGlkZShUb2tlbiBoaWRlS2V5d29yZCkgewogICAgbGlzdGVuZXI/LmVuZEhpZGUoaGlkZUtleXdvcmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRJZkNvbnRyb2xGbG93KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kSWZDb250cm9sRmxvdyh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZElmRWxzZUNvbnRyb2xGbG93KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kSWZFbHNlQ29udHJvbEZsb3codG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRJZlN0YXRlbWVudChUb2tlbiBpZlRva2VuLCBUb2tlbiBlbHNlVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRJZlN0YXRlbWVudChpZlRva2VuLCBlbHNlVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRJbXBvcnQoVG9rZW4gaW1wb3J0S2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBsaXN0ZW5lcj8uZW5kSW1wb3J0KGltcG9ydEtleXdvcmQsIHNlbWljb2xvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEluaXRpYWxpemVkSWRlbnRpZmllcihUb2tlbiBuYW1lVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRJbml0aWFsaXplZElkZW50aWZpZXIobmFtZVRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kSW5pdGlhbGl6ZXIoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRJbml0aWFsaXplcih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEluaXRpYWxpemVycyhpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kSW5pdGlhbGl6ZXJzKGNvdW50LCBiZWdpblRva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZExhYmVsZWRTdGF0ZW1lbnQoaW50IGxhYmVsQ291bnQpIHsKICAgIGxpc3RlbmVyPy5lbmRMYWJlbGVkU3RhdGVtZW50KGxhYmVsQ291bnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRMaWJyYXJ5TmFtZShUb2tlbiBsaWJyYXJ5S2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBsaXN0ZW5lcj8uZW5kTGlicmFyeU5hbWUobGlicmFyeUtleXdvcmQsIHNlbWljb2xvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUxpdGVyYWxNYXBFbnRyeShUb2tlbiBjb2xvbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVMaXRlcmFsTWFwRW50cnkoY29sb24sIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTGl0ZXJhbFNldE9yTWFwKAogICAgaW50IGNvdW50LAogICAgVG9rZW4gbGVmdEJyYWNlLAogICAgVG9rZW4gY29uc3RLZXl3b3JkLAogICAgVG9rZW4gcmlnaHRCcmFjZSwKICAgIC8vIFRPRE8oZGFucnViZWwpOiBoYXNTZXRFbnRyeSBwYXJhbWV0ZXIgZXhpc3RzIGZvciByZXBsaWNhdGluZyBleGlzdGluZwogICAgLy8gYmVoYXZpb3IgYW5kIHdpbGwgYmUgcmVtb3ZlZCBvbmNlIHVuaWZpZWQgY29sbGVjdGlvbiBoYXMgYmVlbiBlbmFibGVkCiAgICBib29sIGhhc1NldEVudHJ5LAogICkgewogICAgbGlzdGVuZXI/LmhhbmRsZUxpdGVyYWxTZXRPck1hcCgKICAgICAgICBjb3VudCwgbGVmdEJyYWNlLCBjb25zdEtleXdvcmQsIHJpZ2h0QnJhY2UsIGhhc1NldEVudHJ5KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTGl0ZXJhbFN0cmluZyhpbnQgaW50ZXJwb2xhdGlvbkNvdW50LCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZExpdGVyYWxTdHJpbmcoaW50ZXJwb2xhdGlvbkNvdW50LCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZExpdGVyYWxTeW1ib2woVG9rZW4gaGFzaFRva2VuLCBpbnQgaWRlbnRpZmllckNvdW50KSB7CiAgICBsaXN0ZW5lcj8uZW5kTGl0ZXJhbFN5bWJvbChoYXNoVG9rZW4sIGlkZW50aWZpZXJDb3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE1lbWJlcigpIHsKICAgIGxpc3RlbmVyPy5lbmRNZW1iZXIoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTWV0YWRhdGEoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gcGVyaW9kQmVmb3JlTmFtZSwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRNZXRhZGF0YShiZWdpblRva2VuLCBwZXJpb2RCZWZvcmVOYW1lLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE1ldGFkYXRhU3RhcihpbnQgY291bnQpIHsKICAgIGxpc3RlbmVyPy5lbmRNZXRhZGF0YVN0YXIoY291bnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRNZXRob2QoCiAgICAgIFRva2VuIGdldE9yU2V0LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBiZWdpblBhcmFtLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZE1ldGhvZChnZXRPclNldCwgYmVnaW5Ub2tlbiwgYmVnaW5QYXJhbSwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRNaXhpbkRlY2xhcmF0aW9uKFRva2VuIG1peGluS2V5d29yZCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRNaXhpbkRlY2xhcmF0aW9uKG1peGluS2V5d29yZCwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmROYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbihUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZE5hbWVkRnVuY3Rpb25FeHByZXNzaW9uKGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTmFtZWRNaXhpbkFwcGxpY2F0aW9uKFRva2VuIGJlZ2luLCBUb2tlbiBjbGFzc0tleXdvcmQsIFRva2VuIGVxdWFscywKICAgICAgVG9rZW4gaW1wbGVtZW50c0tleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kTmFtZWRNaXhpbkFwcGxpY2F0aW9uKAogICAgICAgIGJlZ2luLCBjbGFzc0tleXdvcmQsIGVxdWFscywgaW1wbGVtZW50c0tleXdvcmQsIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTmV3RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZE5ld0V4cHJlc3Npb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRPcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMoCiAgICAgIGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRPcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMoY291bnQsIGJlZ2luVG9rZW4sIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kUGFydChUb2tlbiBwYXJ0S2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBsaXN0ZW5lcj8uZW5kUGFydChwYXJ0S2V5d29yZCwgc2VtaWNvbG9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kUGFydE9mKAogICAgICBUb2tlbiBwYXJ0S2V5d29yZCwgVG9rZW4gb2ZLZXl3b3JkLCBUb2tlbiBzZW1pY29sb24sIGJvb2wgaGFzTmFtZSkgewogICAgbGlzdGVuZXI/LmVuZFBhcnRPZihwYXJ0S2V5d29yZCwgb2ZLZXl3b3JkLCBzZW1pY29sb24sIGhhc05hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kUmVkaXJlY3RpbmdGYWN0b3J5Qm9keShiZWdpblRva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFJldGhyb3dTdGF0ZW1lbnQoVG9rZW4gcmV0aHJvd1Rva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZFJldGhyb3dTdGF0ZW1lbnQocmV0aHJvd1Rva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFJldHVyblN0YXRlbWVudCgKICAgICAgYm9vbCBoYXNFeHByZXNzaW9uLCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZFJldHVyblN0YXRlbWVudChoYXNFeHByZXNzaW9uLCBiZWdpblRva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFNob3coVG9rZW4gc2hvd0tleXdvcmQpIHsKICAgIGxpc3RlbmVyPy5lbmRTaG93KHNob3dLZXl3b3JkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kU3dpdGNoQmxvY2soaW50IGNhc2VDb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRTd2l0Y2hCbG9jayhjYXNlQ291bnQsIGJlZ2luVG9rZW4sIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kU3dpdGNoQ2FzZSgKICAgICAgaW50IGxhYmVsQ291bnQsCiAgICAgIGludCBleHByZXNzaW9uQ291bnQsCiAgICAgIFRva2VuIGRlZmF1bHRLZXl3b3JkLAogICAgICBUb2tlbiBjb2xvbkFmdGVyRGVmYXVsdCwKICAgICAgaW50IHN0YXRlbWVudENvdW50LAogICAgICBUb2tlbiBmaXJzdFRva2VuLAogICAgICBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZFN3aXRjaENhc2UobGFiZWxDb3VudCwgZXhwcmVzc2lvbkNvdW50LCBkZWZhdWx0S2V5d29yZCwKICAgICAgICBjb2xvbkFmdGVyRGVmYXVsdCwgc3RhdGVtZW50Q291bnQsIGZpcnN0VG9rZW4sIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kU3dpdGNoU3RhdGVtZW50KFRva2VuIHN3aXRjaEtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kU3dpdGNoU3RhdGVtZW50KHN3aXRjaEtleXdvcmQsIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVGhlblN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZFRoZW5TdGF0ZW1lbnQodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRUb3BMZXZlbERlY2xhcmF0aW9uKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kVG9wTGV2ZWxEZWNsYXJhdGlvbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFRvcExldmVsRmllbGRzKFRva2VuIHN0YXRpY1Rva2VuLCBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwKICAgICAgVG9rZW4gdmFyRmluYWxPckNvbnN0LCBpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kVG9wTGV2ZWxGaWVsZHMoc3RhdGljVG9rZW4sIGNvdmFyaWFudFRva2VuLCB2YXJGaW5hbE9yQ29uc3QsCiAgICAgICAgY291bnQsIGJlZ2luVG9rZW4sIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVG9wTGV2ZWxNZXRob2QoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZ2V0T3JTZXQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kVG9wTGV2ZWxNZXRob2QoYmVnaW5Ub2tlbiwgZ2V0T3JTZXQsIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVHJ5U3RhdGVtZW50KGludCBjYXRjaENvdW50LCBUb2tlbiB0cnlLZXl3b3JkLCBUb2tlbiBmaW5hbGx5S2V5d29yZCkgewogICAgbGlzdGVuZXI/LmVuZFRyeVN0YXRlbWVudChjYXRjaENvdW50LCB0cnlLZXl3b3JkLCBmaW5hbGx5S2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFR5cGVBcmd1bWVudHMoaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZFR5cGVBcmd1bWVudHMoY291bnQsIGJlZ2luVG9rZW4sIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVHlwZUxpc3QoaW50IGNvdW50KSB7CiAgICBsaXN0ZW5lcj8uZW5kVHlwZUxpc3QoY291bnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRUeXBlVmFyaWFibGUoVG9rZW4gdG9rZW4sIGludCBpbmRleCwgVG9rZW4gZXh0ZW5kc09yU3VwZXIpIHsKICAgIGxpc3RlbmVyPy5lbmRUeXBlVmFyaWFibGUodG9rZW4sIGluZGV4LCBleHRlbmRzT3JTdXBlcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFR5cGVWYXJpYWJsZXMoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRUeXBlVmFyaWFibGVzKGJlZ2luVG9rZW4sIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVmFyaWFibGVJbml0aWFsaXplcihUb2tlbiBhc3NpZ25tZW50T3BlcmF0b3IpIHsKICAgIGxpc3RlbmVyPy5lbmRWYXJpYWJsZUluaXRpYWxpemVyKGFzc2lnbm1lbnRPcGVyYXRvcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFZhcmlhYmxlc0RlY2xhcmF0aW9uKGludCBjb3VudCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRWYXJpYWJsZXNEZWNsYXJhdGlvbihjb3VudCwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRXaGlsZVN0YXRlbWVudChUb2tlbiB3aGlsZUtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kV2hpbGVTdGF0ZW1lbnQod2hpbGVLZXl3b3JkLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFdoaWxlU3RhdGVtZW50Qm9keShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZFdoaWxlU3RhdGVtZW50Qm9keSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFlpZWxkU3RhdGVtZW50KFRva2VuIHlpZWxkVG9rZW4sIFRva2VuIHN0YXJUb2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRZaWVsZFN0YXRlbWVudCh5aWVsZFRva2VuLCBzdGFyVG9rZW4sIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQXNPcGVyYXRvcihUb2tlbiBvcGVyYXRvcikgewogICAgbGlzdGVuZXI/LmhhbmRsZUFzT3BlcmF0b3Iob3BlcmF0b3IpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVBc3NpZ25tZW50RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUFzc2lnbm1lbnRFeHByZXNzaW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQXN5bmNNb2RpZmllcihUb2tlbiBhc3luY1Rva2VuLCBUb2tlbiBzdGFyVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVBc3luY01vZGlmaWVyKGFzeW5jVG9rZW4sIHN0YXJUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUJyZWFrU3RhdGVtZW50KAogICAgICBib29sIGhhc1RhcmdldCwgVG9rZW4gYnJlYWtLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUJyZWFrU3RhdGVtZW50KGhhc1RhcmdldCwgYnJlYWtLZXl3b3JkLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNhc2VNYXRjaChUb2tlbiBjYXNlS2V5d29yZCwgVG9rZW4gY29sb24pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVDYXNlTWF0Y2goY2FzZUtleXdvcmQsIGNvbG9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ2F0Y2hCbG9jayhUb2tlbiBvbktleXdvcmQsIFRva2VuIGNhdGNoS2V5d29yZCwgVG9rZW4gY29tbWEpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVDYXRjaEJsb2NrKG9uS2V5d29yZCwgY2F0Y2hLZXl3b3JkLCBjb21tYSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNsYXNzRXh0ZW5kcyhUb2tlbiBleHRlbmRzS2V5d29yZCkgewogICAgbGlzdGVuZXI/LmhhbmRsZUNsYXNzRXh0ZW5kcyhleHRlbmRzS2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNsYXNzSGVhZGVyKFRva2VuIGJlZ2luLCBUb2tlbiBjbGFzc0tleXdvcmQsIFRva2VuIG5hdGl2ZVRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlQ2xhc3NIZWFkZXIoYmVnaW4sIGNsYXNzS2V5d29yZCwgbmF0aXZlVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDbGFzc05vV2l0aENsYXVzZSgpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVDbGFzc05vV2l0aENsYXVzZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDbGFzc09yTWl4aW5JbXBsZW1lbnRzKAogICAgICBUb2tlbiBpbXBsZW1lbnRzS2V5d29yZCwgaW50IGludGVyZmFjZXNDb3VudCkgewogICAgbGlzdGVuZXI/LmhhbmRsZUNsYXNzT3JNaXhpbkltcGxlbWVudHMoaW1wbGVtZW50c0tleXdvcmQsIGludGVyZmFjZXNDb3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNsYXNzV2l0aENsYXVzZShUb2tlbiB3aXRoS2V5d29yZCkgewogICAgbGlzdGVuZXI/LmhhbmRsZUNsYXNzV2l0aENsYXVzZSh3aXRoS2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNvbW1lbnRSZWZlcmVuY2UoCiAgICAgIFRva2VuIG5ld0tleXdvcmQsIFRva2VuIHByZWZpeCwgVG9rZW4gcGVyaW9kLCBUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUNvbW1lbnRSZWZlcmVuY2UobmV3S2V5d29yZCwgcHJlZml4LCBwZXJpb2QsIHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ29tbWVudFJlZmVyZW5jZVRleHQoU3RyaW5nIHJlZmVyZW5jZVNvdXJjZSwgaW50IHJlZmVyZW5jZU9mZnNldCkgewogICAgbGlzdGVuZXI/LmhhbmRsZUNvbW1lbnRSZWZlcmVuY2VUZXh0KHJlZmVyZW5jZVNvdXJjZSwgcmVmZXJlbmNlT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Db25kaXRpb25hbEV4cHJlc3Npb24oVG9rZW4gcXVlc3Rpb24pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkNvbmRpdGlvbmFsRXhwcmVzc2lvbihxdWVzdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNvbmRpdGlvbmFsRXhwcmVzc2lvbkNvbG9uKCkgewogICAgbGlzdGVuZXI/LmhhbmRsZUNvbmRpdGlvbmFsRXhwcmVzc2lvbkNvbG9uKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENvbmRpdGlvbmFsRXhwcmVzc2lvbihUb2tlbiBxdWVzdGlvbiwgVG9rZW4gY29sb24pIHsKICAgIGxpc3RlbmVyPy5lbmRDb25kaXRpb25hbEV4cHJlc3Npb24ocXVlc3Rpb24sIGNvbG9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ29udGludWVTdGF0ZW1lbnQoCiAgICAgIGJvb2wgaGFzVGFyZ2V0LCBUb2tlbiBjb250aW51ZUtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlQ29udGludWVTdGF0ZW1lbnQoaGFzVGFyZ2V0LCBjb250aW51ZUtleXdvcmQsIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRGlyZWN0aXZlc09ubHkoKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlRGlyZWN0aXZlc09ubHkoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRG90dGVkTmFtZShpbnQgY291bnQsIFRva2VuIGZpcnN0SWRlbnRpZmllcikgewogICAgbGlzdGVuZXI/LmhhbmRsZURvdHRlZE5hbWUoY291bnQsIGZpcnN0SWRlbnRpZmllcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkltcGxpY2l0Q3JlYXRpb25FeHByZXNzaW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRJbXBsaWNpdENyZWF0aW9uRXhwcmVzc2lvbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUVsc2VDb250cm9sRmxvdyhUb2tlbiBlbHNlVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVFbHNlQ29udHJvbEZsb3coZWxzZVRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRW1wdHlTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVFbXB0eVN0YXRlbWVudCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUVtcHR5RnVuY3Rpb25Cb2R5KFRva2VuIHNlbWljb2xvbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUVtcHR5RnVuY3Rpb25Cb2R5KHNlbWljb2xvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUVycm9yVG9rZW4oRXJyb3JUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUVycm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVFeHByZXNzaW9uRnVuY3Rpb25Cb2R5KFRva2VuIGFycm93VG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlRXhwcmVzc2lvbkZ1bmN0aW9uQm9keShhcnJvd1Rva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUV4cHJlc3Npb25TdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVFeHByZXNzaW9uU3RhdGVtZW50KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRXh0cmFuZW91c0V4cHJlc3Npb24oVG9rZW4gdG9rZW4sIE1lc3NhZ2UgbWVzc2FnZSkgewogICAgbGlzdGVuZXI/LmhhbmRsZUV4dHJhbmVvdXNFeHByZXNzaW9uKHRva2VuLCBtZXNzYWdlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRmluYWxseUJsb2NrKFRva2VuIGZpbmFsbHlLZXl3b3JkKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlRmluYWxseUJsb2NrKGZpbmFsbHlLZXl3b3JkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRm9ybWFsUGFyYW1ldGVyV2l0aG91dFZhbHVlKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlRm9ybWFsUGFyYW1ldGVyV2l0aG91dFZhbHVlKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRnVuY3Rpb25Cb2R5U2tpcHBlZChUb2tlbiB0b2tlbiwgYm9vbCBpc0V4cHJlc3Npb25Cb2R5KSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlRnVuY3Rpb25Cb2R5U2tpcHBlZCh0b2tlbiwgaXNFeHByZXNzaW9uQm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIElkZW50aWZpZXJDb250ZXh0IGNvbnRleHQpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVJZGVudGlmaWVyKHRva2VuLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSWRlbnRpZmllckxpc3QoaW50IGNvdW50KSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlSWRlbnRpZmllckxpc3QoY291bnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVSZWNvdmVySW1wb3J0KFRva2VuIHNlbWljb2xvbikgewogICAgbGlzdGVuZXI/LmhhbmRsZVJlY292ZXJJbXBvcnQoc2VtaWNvbG9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW5kZXhlZEV4cHJlc3Npb24oCiAgICAgIFRva2VuIG9wZW5TcXVhcmVCcmFja2V0LCBUb2tlbiBjbG9zZVNxdWFyZUJyYWNrZXQpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVJbmRleGVkRXhwcmVzc2lvbihvcGVuU3F1YXJlQnJhY2tldCwgY2xvc2VTcXVhcmVCcmFja2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW50ZXJwb2xhdGlvbkV4cHJlc3Npb24oVG9rZW4gbGVmdEJyYWNrZXQsIFRva2VuIHJpZ2h0QnJhY2tldCkgewogICAgbGlzdGVuZXI/LmhhbmRsZUludGVycG9sYXRpb25FeHByZXNzaW9uKGxlZnRCcmFja2V0LCByaWdodEJyYWNrZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJbnZhbGlkRXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUludmFsaWRFeHByZXNzaW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW52YWxpZEZ1bmN0aW9uQm9keShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUludmFsaWRGdW5jdGlvbkJvZHkodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJbnZhbGlkTWVtYmVyKFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlSW52YWxpZE1lbWJlcihlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRPcGVyYXRvck5hbWUoVG9rZW4gb3BlcmF0b3JLZXl3b3JkLCBUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUludmFsaWRPcGVyYXRvck5hbWUob3BlcmF0b3JLZXl3b3JkLCB0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRUeXBlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlSW52YWxpZFR5cGVBcmd1bWVudHModG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJbnZhbGlkVHlwZVJlZmVyZW5jZShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUludmFsaWRUeXBlUmVmZXJlbmNlKHRva2VuKTsKICB9CgogIHZvaWQgaGFuZGxlSW52YWxpZFRvcExldmVsQmxvY2soVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVJbnZhbGlkVG9wTGV2ZWxCbG9jayh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRUb3BMZXZlbERlY2xhcmF0aW9uKFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlSW52YWxpZFRvcExldmVsRGVjbGFyYXRpb24oZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJc09wZXJhdG9yKFRva2VuIGlzT3BlcmF0b3IsIFRva2VuIG5vdCkgewogICAgbGlzdGVuZXI/LmhhbmRsZUlzT3BlcmF0b3IoaXNPcGVyYXRvciwgbm90KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTGFiZWwoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVMYWJlbCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUxpdGVyYWxCb29sKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTGl0ZXJhbEJvb2wodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVMaXRlcmFsRG91YmxlKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTGl0ZXJhbERvdWJsZSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUxpdGVyYWxJbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVMaXRlcmFsSW50KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTGl0ZXJhbExpc3QoCiAgICAgIGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gY29uc3RLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUxpdGVyYWxMaXN0KGNvdW50LCBiZWdpblRva2VuLCBjb25zdEtleXdvcmQsIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTGl0ZXJhbE51bGwoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVMaXRlcmFsTnVsbCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU1peGluSGVhZGVyKFRva2VuIG1peGluS2V5d29yZCkgewogICAgbGlzdGVuZXI/LmhhbmRsZU1peGluSGVhZGVyKG1peGluS2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU1peGluT24oVG9rZW4gb25LZXl3b3JkLCBpbnQgdHlwZUNvdW50KSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTWl4aW5PbihvbktleXdvcmQsIHR5cGVDb3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5hbWVkQXJndW1lbnQoVG9rZW4gY29sb24pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVOYW1lZEFyZ3VtZW50KGNvbG9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTmFtZWRNaXhpbkFwcGxpY2F0aW9uV2l0aENsYXVzZShUb2tlbiB3aXRoS2V5d29yZCkgewogICAgbGlzdGVuZXI/LmhhbmRsZU5hbWVkTWl4aW5BcHBsaWNhdGlvbldpdGhDbGF1c2Uod2l0aEtleXdvcmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOYXRpdmVDbGF1c2UoVG9rZW4gbmF0aXZlVG9rZW4sIGJvb2wgaGFzTmFtZSkgewogICAgbGlzdGVuZXI/LmhhbmRsZU5hdGl2ZUNsYXVzZShuYXRpdmVUb2tlbiwgaGFzTmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keShUb2tlbiBuYXRpdmVUb2tlbiwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTmF0aXZlRnVuY3Rpb25Cb2R5KG5hdGl2ZVRva2VuLCBzZW1pY29sb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHlJZ25vcmVkKFRva2VuIG5hdGl2ZVRva2VuLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHlJZ25vcmVkKG5hdGl2ZVRva2VuLCBzZW1pY29sb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHlTa2lwcGVkKFRva2VuIG5hdGl2ZVRva2VuLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHlTa2lwcGVkKG5hdGl2ZVRva2VuLCBzZW1pY29sb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0FyZ3VtZW50cyhUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZU5vQXJndW1lbnRzKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9Db21tZW50UmVmZXJlbmNlKCkgewogICAgbGlzdGVuZXI/LmhhbmRsZU5vQ29tbWVudFJlZmVyZW5jZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0NvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTm9Db25zdHJ1Y3RvclJlZmVyZW5jZUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cyh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUZvckluaXRpYWxpemVyRW1wdHlTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVGb3JJbml0aWFsaXplckVtcHR5U3RhdGVtZW50KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRm9ySW5pdGlhbGl6ZXJFeHByZXNzaW9uU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlRm9ySW5pdGlhbGl6ZXJFeHByZXNzaW9uU3RhdGVtZW50KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRm9ySW5pdGlhbGl6ZXJMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVGb3JJbml0aWFsaXplckxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUZvckluTG9vcFBhcnRzKFRva2VuIGF3YWl0VG9rZW4sIFRva2VuIGZvclRva2VuLAogICAgICBUb2tlbiBsZWZ0UGFyZW50aGVzaXMsIFRva2VuIGluS2V5d29yZCkgewogICAgbGlzdGVuZXI/LmhhbmRsZUZvckluTG9vcFBhcnRzKAogICAgICAgIGF3YWl0VG9rZW4sIGZvclRva2VuLCBsZWZ0UGFyZW50aGVzaXMsIGluS2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUZvckxvb3BQYXJ0cyhUb2tlbiBmb3JLZXl3b3JkLCBUb2tlbiBsZWZ0UGFyZW4sCiAgICAgIFRva2VuIGxlZnRTZXBhcmF0b3IsIGludCB1cGRhdGVFeHByZXNzaW9uQ291bnQpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVGb3JMb29wUGFydHMoCiAgICAgICAgZm9yS2V5d29yZCwgbGVmdFBhcmVuLCBsZWZ0U2VwYXJhdG9yLCB1cGRhdGVFeHByZXNzaW9uQ291bnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0ZpZWxkSW5pdGlhbGl6ZXIoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVOb0ZpZWxkSW5pdGlhbGl6ZXIodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0Zvcm1hbFBhcmFtZXRlcnMoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgbGlzdGVuZXI/LmhhbmRsZU5vRm9ybWFsUGFyYW1ldGVycyh0b2tlbiwga2luZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vRnVuY3Rpb25Cb2R5KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTm9GdW5jdGlvbkJvZHkodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0luaXRpYWxpemVycygpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVOb0luaXRpYWxpemVycygpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb25OdWxsQXNzZXJ0RXhwcmVzc2lvbihUb2tlbiBiYW5nKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTm9uTnVsbEFzc2VydEV4cHJlc3Npb24oYmFuZyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vTmFtZShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZU5vTmFtZSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vVHlwZShUb2tlbiBsYXN0Q29uc3VtZWQpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVOb1R5cGUobGFzdENvbnN1bWVkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9UeXBlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTm9UeXBlQXJndW1lbnRzKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9UeXBlVmFyaWFibGVzKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTm9UeXBlVmFyaWFibGVzKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9WYXJpYWJsZUluaXRpYWxpemVyKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTm9WYXJpYWJsZUluaXRpYWxpemVyKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlT3BlcmF0b3IoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVPcGVyYXRvcih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU9wZXJhdG9yTmFtZShUb2tlbiBvcGVyYXRvcktleXdvcmQsIFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlT3BlcmF0b3JOYW1lKG9wZXJhdG9yS2V5d29yZCwgdG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVQYXJlbnRoZXNpemVkQ29uZGl0aW9uKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlUGFyZW50aGVzaXplZENvbmRpdGlvbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlUGFyZW50aGVzaXplZEV4cHJlc3Npb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJbXBvcnRQcmVmaXgoVG9rZW4gZGVmZXJyZWRLZXl3b3JkLCBUb2tlbiBhc0tleXdvcmQpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVJbXBvcnRQcmVmaXgoZGVmZXJyZWRLZXl3b3JkLCBhc0tleXdvcmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVRdWFsaWZpZWQoVG9rZW4gcGVyaW9kKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlUXVhbGlmaWVkKHBlcmlvZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVJlY292ZXJDbGFzc0hlYWRlcigpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVSZWNvdmVyQ2xhc3NIZWFkZXIoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlUmVjb3Zlck1peGluSGVhZGVyKCkgewogICAgbGlzdGVuZXI/LmhhbmRsZVJlY292ZXJNaXhpbkhlYWRlcigpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVSZWNvdmVyYWJsZUVycm9yKAogICAgICBNZXNzYWdlIG1lc3NhZ2UsIFRva2VuIHN0YXJ0VG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBpZiAoZm9yd2FyZEVycm9ycykgewogICAgICBsaXN0ZW5lcj8uaGFuZGxlUmVjb3ZlcmFibGVFcnJvcihtZXNzYWdlLCBzdGFydFRva2VuLCBlbmRUb2tlbik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRTdGF0ZW1lbnQoVG9rZW4gdG9rZW4sIE1lc3NhZ2UgbWVzc2FnZSkgewogICAgbGlzdGVuZXI/LmhhbmRsZUludmFsaWRTdGF0ZW1lbnQodG9rZW4sIG1lc3NhZ2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTY3JpcHQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVTY3JpcHQodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTZW5kKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlU2VuZChiZWdpblRva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVNwcmVhZEV4cHJlc3Npb24oVG9rZW4gc3ByZWFkVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVTcHJlYWRFeHByZXNzaW9uKHNwcmVhZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU3RyaW5nSnV4dGFwb3NpdGlvbihpbnQgbGl0ZXJhbENvdW50KSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlU3RyaW5nSnV4dGFwb3NpdGlvbihsaXRlcmFsQ291bnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVVbmVzY2FwZUVycm9yKAogICAgICBNZXNzYWdlIG1lc3NhZ2UsIFRva2VuIGxvY2F0aW9uLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlVW5lc2NhcGVFcnJvcihtZXNzYWdlLCBsb2NhdGlvbiwgb2Zmc2V0LCBsZW5ndGgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTdHJpbmdQYXJ0KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlU3RyaW5nUGFydCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVN1cGVyRXhwcmVzc2lvbihUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgbGlzdGVuZXI/LmhhbmRsZVN1cGVyRXhwcmVzc2lvbih0b2tlbiwgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVN5bWJvbFZvaWQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVTeW1ib2xWb2lkKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVGhpc0V4cHJlc3Npb24oVG9rZW4gdG9rZW4sIElkZW50aWZpZXJDb250ZXh0IGNvbnRleHQpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVUaGlzRXhwcmVzc2lvbih0b2tlbiwgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVRocm93RXhwcmVzc2lvbihUb2tlbiB0aHJvd1Rva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZVRocm93RXhwcmVzc2lvbih0aHJvd1Rva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVR5cGUoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gcXVlc3Rpb25NYXJrKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlVHlwZShiZWdpblRva2VuLCBxdWVzdGlvbk1hcmspOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVUeXBlVmFyaWFibGVzRGVmaW5lZChUb2tlbiB0b2tlbiwgaW50IGNvdW50KSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlVHlwZVZhcmlhYmxlc0RlZmluZWQodG9rZW4sIGNvdW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVW5hcnlQb3N0Zml4QXNzaWdubWVudEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVVbmFyeVBvc3RmaXhBc3NpZ25tZW50RXhwcmVzc2lvbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVVuYXJ5UHJlZml4QXNzaWdubWVudEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVVbmFyeVByZWZpeEFzc2lnbm1lbnRFeHByZXNzaW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVW5hcnlQcmVmaXhFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlVW5hcnlQcmVmaXhFeHByZXNzaW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Gb3JtYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVFeHByZXNzaW9uKCkgewogICAgbGlzdGVuZXI/LmJlZ2luRm9ybWFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlRXhwcmVzc2lvbigpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JtYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVFeHByZXNzaW9uKCkgewogICAgbGlzdGVuZXI/LmVuZEZvcm1hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZUV4cHJlc3Npb24oKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVmFsdWVkRm9ybWFsUGFyYW1ldGVyKFRva2VuIGVxdWFscywgVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVWYWx1ZWRGb3JtYWxQYXJhbWV0ZXIoZXF1YWxzLCB0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVZvaWRLZXl3b3JkKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlVm9pZEtleXdvcmQodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBsb2dFdmVudChTdHJpbmcgbmFtZSkgewogICAgbGlzdGVuZXI/LmxvZ0V2ZW50KG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZXBvcnRFcnJvcklmTnVsbGFibGVUeXBlKFRva2VuIHF1ZXN0aW9uTWFyaykgewogICAgbGlzdGVuZXI/LnJlcG9ydEVycm9ySWZOdWxsYWJsZVR5cGUocXVlc3Rpb25NYXJrKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVwb3J0Tm9uTnVsbEFzc2VydEV4cHJlc3Npb25Ob3RFbmFibGVkKFRva2VuIGJhbmcpIHsKICAgIGxpc3RlbmVyPy5yZXBvcnROb25OdWxsQXNzZXJ0RXhwcmVzc2lvbk5vdEVuYWJsZWQoYmFuZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBzZXQgc3VwcHJlc3NQYXJzZUVycm9ycyhib29sIHZhbHVlKSB7CiAgICBsaXN0ZW5lcj8uc3VwcHJlc3NQYXJzZUVycm9ycyA9IHZhbHVlOwogIH0KfQqFwgBOTjwBGxkaAS8VHQEnAQwgAQwlJQQBDDcwBAEMKysEAQwsLAQBDCEhBAEMLS0EAQwjIwQBDDAwBAEMJycEAQwsLAQBDE1BBAEMODgEAQwnJwQBDCsrBAEMLi4EAQwrKwQBDDIyBAEMKCgEAQwwMAQBDCwsBAEMMDAEAQwpKQQBDCYmBAEMIiIEAQwbQ0sEAQwsLAQBDD85BAEMJSUEAQwrKwQBDCgoBAEMLCwEAQxQHyQ3BAEMPTIEAQw0NAQBDC4uBAEMKCgEAQwtLQQBDC0tBAEMODgEAQwmJgQBDCsrBAEMKysEAQwnJwQBDCoqBAEMMTEEAQwnJwQBDCgoBAEMPDgEAQwnJwQBDCkpBAEMKSkEAQwXHQQBDCQkBAEMKCgEAQxRO0YqBAEMPzkEAQwzMwQBDCM2RgQBDCkpBAEMNDQEAQwgIAQBDCIiBAEMMjIEAQwsLAQBDCsrBAEMJiYEAQwnJwQBDFBIBAEMKysEAQwpKQQBDCoqBAEMRkAEAQwoKAQBDCkpBAEMJCQEAQwoKAQBDCkpBAEMLy8EAQxHQQQBDCoqBAEMLi4EAQwqKgQBDDQ6BAEMQzkEAQxKMBlLBAEMPjgEAQwqKgQBDD81BAEMS0EEAQwWHAQBDCgoBAEMJSUEAQxQRgQBDD85BAEMIyUEAQw0MAQBDE5CBAEMJykEAQwpKQQBDCYmBAEMID1KBAEMHD1GBAEMLi4EAQwnJwQBDEA2BAEMOTMEAQwZQEYEAQw8NgQBDFE1TR8EAQwoKAQBDCoqBAEMIiIEAQwjIwQBDCkpBAEMKSkEAQwqKgQBDERKIkQEAQwcRkYEAQw1NQQBDD44BAEMODIEAQxCPAQBDB08RgQBDDo6BAEMJCQEAQwnJwQBDCsrBAEMODIEAQw5MwQBDDMzBAEMJSUEAQxGPAQBDC0vBAEMPzkEAQw8NgQBDB4PFRgWTU0WBiVCBAEMQj4EAQxAPAQBDBUbBAEMT0MEAQwkJgQBDBJMRQQBDEE7BAEMNDQEAQxPMShDBAEMJycEAQwkNUgEAQw1LwQBDBJLRQQBDEU/BAEMQTsEAQwbPkcEAQwkJAQBDEk/BAEMFhYbHB8aGBhJQgQBDEE7BAEMJycEAQwtLQQBDEJMTiYEAQxNQQQBDFFHBAEMRz0EAQwgIgQBDEc9BAEMPDYEAQw6OgQBDDw4BAEMPzkEAQwsLAQBDE5CBAEMKioEAQwxMQQBDEA6BAEMHTxHBAEMOTMEAQxMQAQBDDIyBAEMT0MEAQwjKQQBDCU2UAQBDDIyBAEMH0NJBAEMUUwEAQw0NAQBDCwyBAEMPzkEAQwgP00EAQwgJgQBDDw4BAEMNjYEAQw0NAQBDDAwBAEMKysEAQwyMgQBDCwnBAEMSEIEAQwwMAQBDEI6BAEMMjIEAQw4OAQBDEdCBAEMQjAEAQwpKwQBDC4uBAEMIDtOBAEMTkgEAQwuLgQBDDAwBAEMLS0EAQxHQQQBDDExBAEMMTEEATExBAEMOjoEAQw3MQQBDCIiBAEMKCgEAQwqKgQBDCcnBAEMGklMBAEMKCgEAQwvLwQBDDczBAEMKioEAQxCQgQBDD04BAEMRkAEAQxNRwQBDE1HBAEMKCgEAQwkKgQBDFFRBAEMOTkEAQw+PgQBDENDBAEMPjAkOwQBDD04IkYEAQwvLwQBDEA1BAEMKysEAQwgJgQBDDMzBAEMIyMEAQwqKgQBDCwsBAEMLCwEAQwyMgQBDCUlBAEMQDoEAQwzMwQBDDQ0BAEMRD4EAQwnJwQBDCQqBAEMJCoEAQwfOxlHBgQBDD42BAEMIyMEAQw2MAQBDDMzBAEMNTcEAQwcQUYEAQwnJwQBDEc1BAEMJycEAQxGNAQBDEE7BAEMOjQEAQw8OAQBDD09BAEMPDwEAQwyMgQBDDY8BAEMNDoEAQxAOgQBDCgoBAEMHx4EAQw3NwQBDD09BAEMKCsEAgE7cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci9mb3J3YXJkaW5nX2xpc3RlbmVyLmRhcnRDc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3BhcnNlci9saXRlcmFsX2VudHJ5X2luZm8uZGFydIscLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9zY2FubmVyLmRhcnQnOwppbXBvcnQgJ2lkZW50aWZpZXJfY29udGV4dC5kYXJ0JzsKaW1wb3J0ICdsaXRlcmFsX2VudHJ5X2luZm9faW1wbC5kYXJ0JzsKaW1wb3J0ICdwYXJzZXIuZGFydCc7CmltcG9ydCAndXRpbC5kYXJ0JzsKCi8vLyBbc2ltcGxlRW50cnldIGlzIHRoZSBmaXJzdCBzdGVwIGZvciBwYXJzaW5nIGEgbGl0ZXJhbCBlbnRyeQovLy8gd2l0aG91dCBhbnkgY29udHJvbCBmbG93IG9yIHNwcmVhZCBjb2xsZWN0aW9uIG9wZXJhdG9yLgpjb25zdCBMaXRlcmFsRW50cnlJbmZvIHNpbXBsZUVudHJ5ID0gY29uc3QgTGl0ZXJhbEVudHJ5SW5mbyh0cnVlLCAwKTsKCi8vLyBbTGl0ZXJhbEVudHJ5SW5mb10gcmVwcmVzZW50cyBzdGVwcyBmb3IgcHJvY2Vzc2luZyBhbiBlbnRyeQovLy8gaW4gYSBsaXRlcmFsIGxpc3QsIG1hcCwgb3Igc2V0LiBUaGVzZSBzdGVwcyB3aWxsIGhhbmRsZSBwYXJzaW5nCi8vLyBib3RoIGNvbnRyb2wgZmxvdyBhbmQgc3ByZWFkYWJsZSBvcGVyYXRvcnMsIGFuZCBpbmRpY2F0ZQovLy8gd2hlbiB0aGUgY2xpZW50IHNob3VsZCBwYXJzZSB0aGUgbGl0ZXJhbCBlbnRyeS4KLy8vCi8vLyBDbGllbnRzIHNob3VsZCBwYXJzZSBhIHNpbmdsZSBlbnRyeSBpbiBhIGxpc3QsIHNldCwgb3IgbWFwIGxpa2UgdGhpczoKLy8vIGBgYAovLy8gICAgTGl0ZXJhbEVudHJ5SW5mbyBpbmZvID0gY29tcHV0ZUxpdGVyYWxFbnRyeSh0b2tlbik7Ci8vLyAgICB3aGlsZSAoaW5mbyAhPSBudWxsKSB7Ci8vLyAgICAgIGlmIChpbmZvLmhhc0VudHJ5KSB7Ci8vLyAgICAgICAgLi4uIHBhcnNlIGV4cHJlc3Npb24gKGA6YCBleHByZXNzaW9uKT8gLi4uCi8vLyAgICAgICAgdG9rZW4gPSBsYXN0Q29uc3VtZWRUb2tlbjsKLy8vICAgICAgfSBlbHNlIHsKLy8vICAgICAgICB0b2tlbiA9IGluZm8ucGFyc2UodG9rZW4sIHBhcnNlcik7Ci8vLyAgICAgIH0KLy8vICAgICAgaW5mbyA9IGluZm8uY29tcHV0ZU5leHQodG9rZW4pOwovLy8gICAgfQovLy8gYGBgCmNsYXNzIExpdGVyYWxFbnRyeUluZm8gewogIC8vLyBgdHJ1ZWAgaWYgYW4gZW50cnkgc2hvdWxkIGJlIHBhcnNlZCBieSB0aGUgY2FsbGVyCiAgLy8vIG9yIGBmYWxzZWAgaWYgdGhpcyBvYmplY3QncyBbcGFyc2VdIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkLgogIGZpbmFsIGJvb2wgaGFzRW50cnk7CgogIC8vLyBVc2VkIGZvciByZWNvdmVyeSwgdGhpcyBpbmRpY2F0ZXMKICAvLy8gKzEgZm9yIGFuIGBpZmAgY29uZGl0aW9uIGFuZCAtMSBmb3IgYGVsc2VgLgogIGZpbmFsIGludCBpZkNvbmRpdGlvbkRlbHRhOwoKICBjb25zdCBMaXRlcmFsRW50cnlJbmZvKHRoaXMuaGFzRW50cnksIHRoaXMuaWZDb25kaXRpb25EZWx0YSk7CgogIC8vLyBQYXJzZSB0aGUgY29udHJvbCBmbG93IGFuZCBzcHJlYWQgY29sbGVjdGlvbiBhc3BlY3RzIG9mIHRoaXMgZW50cnkuCiAgVG9rZW4gcGFyc2UoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIHRocm93IGhhc0VudHJ5CiAgICAgICAgPyAnSW50ZXJuYWwgRXJyb3I6IHNob3VsZCBub3QgY2FsbCBwYXJzZScKICAgICAgICA6ICdJbnRlcm5hbCBFcnJvcjogJHJ1bnRpbWVUeXBlIHNob3VsZCBpbXBsZW1lbnQgcGFyc2UnOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIG5leHQgc3RlcCB3aGVuIHBhcnNpbmcgYW4gZW50cnkgb3IgYG51bGxgIGlmIG5vbmUuCiAgTGl0ZXJhbEVudHJ5SW5mbyBjb21wdXRlTmV4dChUb2tlbiB0b2tlbikgPT4gbnVsbDsKfQoKLy8vIENvbXB1dGUgdGhlIFtMaXRlcmFsRW50cnlJbmZvXSBmb3IgdGhlIGxpdGVyYWwgbGlzdCwgbWFwLCBvciBzZXQgZW50cnkuCkxpdGVyYWxFbnRyeUluZm8gY29tcHV0ZUxpdGVyYWxFbnRyeShUb2tlbiB0b2tlbikgewogIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogIGlmIChvcHRpb25hbCgnaWYnLCBuZXh0KSkgewogICAgcmV0dXJuIGlmQ29uZGl0aW9uOwogIH0gZWxzZSBpZiAob3B0aW9uYWwoJ2ZvcicsIG5leHQpIHx8CiAgICAgIChvcHRpb25hbCgnYXdhaXQnLCBuZXh0KSAmJiBvcHRpb25hbCgnZm9yJywgbmV4dC5uZXh0KSkpIHsKICAgIHJldHVybiBuZXcgRm9yQ29uZGl0aW9uKCk7CiAgfSBlbHNlIGlmIChvcHRpb25hbCgnLi4uJywgbmV4dCkgfHwgb3B0aW9uYWwoJy4uLj8nLCBuZXh0KSkgewogICAgcmV0dXJuIHNwcmVhZE9wZXJhdG9yOwogIH0KICByZXR1cm4gc2ltcGxlRW50cnk7Cn0KCi8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBbdG9rZW5dIHNob3VsZCBiZSB0cmVhdGVkIGxpa2UgdGhlIHN0YXJ0IG9mCi8vLyBhIGxpdGVyYWwgZW50cnkgaW4gYSBsaXN0LCBzZXQsIG9yIG1hcCBmb3IgdGhlIHB1cnBvc2VzIG9mIHJlY292ZXJ5Lgpib29sIGxvb2tzTGlrZUxpdGVyYWxFbnRyeShUb2tlbiB0b2tlbikgPT4KICAgIGxvb2tzTGlrZUV4cHJlc3Npb25TdGFydCh0b2tlbikgfHwKICAgIG9wdGlvbmFsKCcuLi4nLCB0b2tlbikgfHwKICAgIG9wdGlvbmFsKCcuLi4/JywgdG9rZW4pIHx8CiAgICBvcHRpb25hbCgnaWYnLCB0b2tlbikgfHwKICAgIG9wdGlvbmFsKCdmb3InLCB0b2tlbikgfHwKICAgIChvcHRpb25hbCgnYXdhaXQnLCB0b2tlbikgJiYgb3B0aW9uYWwoJ2ZvcicsIHRva2VuLm5leHQpKTsKTwBNTjwBGiInFhQBQDxGAUBEPTQESgg7Hh42JhIuCykJCBk4QxcBKDIeAUABSiwTMkEEAUU1AgFMNBseGCZBH0AbBBYCAUtJKyceHx0ePwE6cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci9saXRlcmFsX2VudHJ5X2luZm8uZGFydDtzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvcGFyc2VyL2xvb3Bfc3RhdGUuZGFydIGFLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEucGFyc2VyLmxvb3Bfc3RhdGU7CgplbnVtIExvb3BTdGF0ZSB7CiAgT3V0c2lkZUxvb3AsCiAgSW5zaWRlU3dpdGNoLCAvLyBgYnJlYWtgIHN0YXRlbWVudCBhbGxvd2VkCiAgSW5zaWRlTG9vcCwgLy8gYGJyZWFrYCBhbmQgYGNvbnRpbnVlYCBzdGF0ZW1lbnRzIGFsbG93ZWQKfQoNAE5OPAEhAREPLTsCATJwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL2xvb3Bfc3RhdGUuZGFydEFzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvcGFyc2VyL21vZGlmaWVyX2NvbnRleHQuZGFydLPlLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vLi4vc2Nhbm5lci90b2tlbi5kYXJ0JyBzaG93IFRva2VuOwppbXBvcnQgJy4uL21lc3NhZ2VzLmRhcnQnIGFzIGZhc3RhOwppbXBvcnQgJ21lbWJlcl9raW5kLmRhcnQnIHNob3cgTWVtYmVyS2luZDsKaW1wb3J0ICdwYXJzZXIuZGFydCcgc2hvdyBQYXJzZXI7CmltcG9ydCAndXRpbC5kYXJ0JyBzaG93IG9wdGlvbmFsOwoKYm9vbCBpc01vZGlmaWVyKFRva2VuIHRva2VuKSB7CiAgaWYgKCF0b2tlbi5pc01vZGlmaWVyKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlmICh0b2tlbi50eXBlLmlzQnVpbHRJbikgewogICAgLy8gQSBidWlsdC1pbiBpZGVudGlmaWVyIGNhbiBvbmx5IGJlIGEgbW9kaWZpZXIgYXMgbG9uZyBhcyBpdCBpcwogICAgLy8gZm9sbG93ZWQgYnkgYW5vdGhlciBtb2RpZmllciBvciBhbiBpZGVudGlmaWVyLiBPdGhlcndpc2UsIGl0IGlzIHRoZQogICAgLy8gaWRlbnRpZmllci4KICAgIC8vCiAgICAvLyBGb3IgZXhhbXBsZSwgYGV4dGVybmFsYCBpcyBhIG1vZGlmaWVyIGluIHRoaXMgZGVjbGFyYXRpb246CiAgICAvLyAgIGV4dGVybmFsIEZvbyBmb28oKTsKICAgIC8vIGJ1dCBpcyB0aGUgaWRlbnRpZmllciBpbiB0aGlzIGRlY2xhcmF0aW9uCiAgICAvLyAgIGV4dGVybmFsKCkgPT4gdHJ1ZTsKICAgIGlmICghdG9rZW4ubmV4dC50eXBlLmlzS2V5d29yZCAmJiAhdG9rZW4ubmV4dC5pc0lkZW50aWZpZXIpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICByZXR1cm4gdHJ1ZTsKfQoKLy8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBwYXJzZSBtb2RpZmllcnMgaW4gbW9zdCBsb2NhdGlvbnMgd2hlcmUgbW9kaWZpZXJzCi8vLyBjYW4gb2NjdXIsIGJ1dCBkb2VzIG5vdCBjYWxsIGhhbmRsZU1vZGlmaWVyIG9yIGhhbmRsZU1vZGlmaWVycy4KY2xhc3MgTW9kaWZpZXJSZWNvdmVyeUNvbnRleHQgewogIGZpbmFsIFBhcnNlciBwYXJzZXI7CiAgVG9rZW4gYWJzdHJhY3RUb2tlbjsKICBUb2tlbiBjb25zdFRva2VuOwogIFRva2VuIGNvdmFyaWFudFRva2VuOwogIFRva2VuIGV4dGVybmFsVG9rZW47CiAgVG9rZW4gZmluYWxUb2tlbjsKICBUb2tlbiBzdGF0aWNUb2tlbjsKICBUb2tlbiB2YXJGaW5hbE9yQ29uc3Q7CiAgVG9rZW4gdmFyVG9rZW47CgogIC8vIFNldCBgdHJ1ZWAgd2hlbiBwYXJzaW5nIG1vZGlmaWVycyBhZnRlciB0aGUgYGZhY3RvcnlgIHRva2VuLgogIGJvb2wgYWZ0ZXJGYWN0b3J5ID0gZmFsc2U7CgogIC8vIFRPRE8oZGFucnViZWwpOiBSZXBsYWNlIFtNb2RpZmllclJlY292ZXJ5Q29udGV4dF0gYW5kIFtNb2RpZmllckNvbnRleHRdCiAgLy8gd2l0aCB0aGlzIGNsYXNzLgoKICBNb2RpZmllclJlY292ZXJ5Q29udGV4dCh0aGlzLnBhcnNlcik7CgogIC8vLyBQYXJzZSBtb2RpZmllcnMgZm9yIGNsYXNzIG1ldGhvZHMgYW5kIGZpZWxkcy4KICBUb2tlbiBwYXJzZUNsYXNzTWVtYmVyTW9kaWZpZXJzKFRva2VuIHRva2VuLAogICAgICB7VG9rZW4gZXh0ZXJuYWxUb2tlbiwKICAgICAgVG9rZW4gc3RhdGljVG9rZW4sCiAgICAgIFRva2VuIGNvdmFyaWFudFRva2VuLAogICAgICBUb2tlbiB2YXJGaW5hbE9yQ29uc3R9KSB7CiAgICB0b2tlbiA9IHBhcnNlTW9kaWZpZXJzKHRva2VuLAogICAgICAgIGV4dGVybmFsVG9rZW46IGV4dGVybmFsVG9rZW4sCiAgICAgICAgc3RhdGljVG9rZW46IHN0YXRpY1Rva2VuLAogICAgICAgIGNvdmFyaWFudFRva2VuOiBjb3ZhcmlhbnRUb2tlbiwKICAgICAgICB2YXJGaW5hbE9yQ29uc3Q6IHZhckZpbmFsT3JDb25zdCk7CgogICAgaWYgKGFic3RyYWN0VG9rZW4gIT0gbnVsbCkgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIGFic3RyYWN0VG9rZW4sIGZhc3RhLm1lc3NhZ2VBYnN0cmFjdENsYXNzTWVtYmVyKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBQYXJzZSBtb2RpZmllcnMgZm9yIGZvcm1hbCBwYXJhbWV0ZXJzLgogIFRva2VuIHBhcnNlRm9ybWFsUGFyYW1ldGVyTW9kaWZpZXJzKFRva2VuIHRva2VuLCBNZW1iZXJLaW5kIG1lbWJlcktpbmQsCiAgICAgIHtUb2tlbiBjb3ZhcmlhbnRUb2tlbiwgVG9rZW4gdmFyRmluYWxPckNvbnN0fSkgewogICAgdG9rZW4gPSBwYXJzZU1vZGlmaWVycyh0b2tlbiwKICAgICAgICBjb3ZhcmlhbnRUb2tlbjogY292YXJpYW50VG9rZW4sIHZhckZpbmFsT3JDb25zdDogdmFyRmluYWxPckNvbnN0KTsKCiAgICBpZiAobWVtYmVyS2luZCA9PSBNZW1iZXJLaW5kLlN0YXRpY01ldGhvZCB8fAogICAgICAgIG1lbWJlcktpbmQgPT0gTWVtYmVyS2luZC5Ub3BMZXZlbE1ldGhvZCkgewogICAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIodGhpcy5jb3ZhcmlhbnRUb2tlbik7CiAgICAgIHRoaXMuY292YXJpYW50VG9rZW4gPSBudWxsOwogICAgfQogICAgaWYgKGNvbnN0VG9rZW4gIT0gbnVsbCkgewogICAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIoY29uc3RUb2tlbik7CiAgICAgIHZhckZpbmFsT3JDb25zdCA9IG51bGw7CiAgICB9IGVsc2UgaWYgKG1lbWJlcktpbmQgPT0gTWVtYmVyS2luZC5HZW5lcmFsaXplZEZ1bmN0aW9uVHlwZSkgewogICAgICBpZiAodmFyRmluYWxPckNvbnN0ICE9IG51bGwpIHsKICAgICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgdmFyRmluYWxPckNvbnN0LCBmYXN0YS5tZXNzYWdlRnVuY3Rpb25UeXBlZFBhcmFtZXRlclZhcik7CiAgICAgICAgdmFyRmluYWxPckNvbnN0ID0gbnVsbDsKICAgICAgICBmaW5hbFRva2VuID0gbnVsbDsKICAgICAgICB2YXJUb2tlbiA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIHJlcG9ydEV4dHJhbmVvdXNNb2RpZmllcihhYnN0cmFjdFRva2VuKTsKICAgIHJlcG9ydEV4dHJhbmVvdXNNb2RpZmllcihleHRlcm5hbFRva2VuKTsKICAgIHJlcG9ydEV4dHJhbmVvdXNNb2RpZmllcihzdGF0aWNUb2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gUGFyc2UgbW9kaWZpZXJzIGFmdGVyIHRoZSBgZmFjdG9yeWAgdG9rZW4uCiAgVG9rZW4gcGFyc2VNb2RpZmllcnNBZnRlckZhY3RvcnkoVG9rZW4gdG9rZW4sCiAgICAgIHtUb2tlbiBleHRlcm5hbFRva2VuLCBUb2tlbiBzdGF0aWNPckNvdmFyaWFudCwgVG9rZW4gdmFyRmluYWxPckNvbnN0fSkgewogICAgYWZ0ZXJGYWN0b3J5ID0gdHJ1ZTsKICAgIHRva2VuID0gcGFyc2VNb2RpZmllcnModG9rZW4sCiAgICAgICAgZXh0ZXJuYWxUb2tlbjogZXh0ZXJuYWxUb2tlbiwKICAgICAgICBzdGF0aWNPckNvdmFyaWFudDogc3RhdGljT3JDb3ZhcmlhbnQsCiAgICAgICAgdmFyRmluYWxPckNvbnN0OiB2YXJGaW5hbE9yQ29uc3QpOwoKICAgIGlmIChhYnN0cmFjdFRva2VuICE9IG51bGwpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBhYnN0cmFjdFRva2VuLCBmYXN0YS5tZXNzYWdlQWJzdHJhY3RDbGFzc01lbWJlcik7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gUGFyc2UgbW9kaWZpZXJzIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb25zIGFuZCBmaWVsZHMuCiAgVG9rZW4gcGFyc2VUb3BMZXZlbE1vZGlmaWVycyhUb2tlbiB0b2tlbiwKICAgICAge1Rva2VuIGV4dGVybmFsVG9rZW4sIFRva2VuIHZhckZpbmFsT3JDb25zdH0pIHsKICAgIHRva2VuID0gcGFyc2VNb2RpZmllcnModG9rZW4sCiAgICAgICAgZXh0ZXJuYWxUb2tlbjogZXh0ZXJuYWxUb2tlbiwgdmFyRmluYWxPckNvbnN0OiB2YXJGaW5hbE9yQ29uc3QpOwoKICAgIHJlcG9ydEV4dHJhbmVvdXNNb2RpZmllcihhYnN0cmFjdFRva2VuKTsKICAgIHJlcG9ydEV4dHJhbmVvdXNNb2RpZmllcihjb3ZhcmlhbnRUb2tlbik7CiAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIoc3RhdGljVG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFBhcnNlIG1vZGlmaWVycyBmb3IgdmFyaWFibGUgZGVjbGFyYXRpb25zLgogIFRva2VuIHBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbk1vZGlmaWVycyhUb2tlbiB0b2tlbiwKICAgICAge1Rva2VuIHZhckZpbmFsT3JDb25zdH0pIHsKICAgIHRva2VuID0gcGFyc2VNb2RpZmllcnModG9rZW4sIHZhckZpbmFsT3JDb25zdDogdmFyRmluYWxPckNvbnN0KTsKCiAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIoYWJzdHJhY3RUb2tlbik7CiAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIoY292YXJpYW50VG9rZW4pOwogICAgcmVwb3J0RXh0cmFuZW91c01vZGlmaWVyKGV4dGVybmFsVG9rZW4pOwogICAgcmVwb3J0RXh0cmFuZW91c01vZGlmaWVyKHN0YXRpY1Rva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBQYXJzZSBtb2RpZmllcnMgZHVyaW5nIHJlY292ZXJ5IHdoZW4gbW9kaWZpZXJzIGFyZSBvdXQgb2Ygb3JkZXIKICAvLy8gb3IgaW52YWxpZC4gVHlwaWNhbGx5IGNsaWVudHMgY2FsbCBtZXRob2RzIGxpa2UKICAvLy8gW3BhcnNlQ2xhc3NNZW1iZXJNb2RpZmllcnNdIHdoaWNoIGluIHR1cm4gY2FsbHMgdGhpcyBtZXRob2QsCiAgLy8vIHJhdGhlciB0aGFuIGNhbGxpbmcgdGhpcyBtZXRob2QgZGlyZWN0bHkuCiAgLy8vCiAgLy8vIFRoZSB2YXJpb3VzIG1vZGlmaWVyIHRva2VuIHBhcmFtZXRlcnMgcmVwcmVzZW50IHRva2VucyBvZiBtb2RpZmllcnMKICAvLy8gdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBwYXJzZWQgcHJpb3IgdG8gcmVjb3ZlcnkuIFRoZSBbc3RhdGljT3JDb3ZhcmlhbnRdCiAgLy8vIHBhcmFtZXRlciBpcyBmb3IgY29udmVuaWVuY2UgaWYgY2FsbGVyIGhhcyBhIHRva2VuIHRoYXQgbWF5IGJlIGVpdGhlcgogIC8vLyBgc3RhdGljYCBvciBgY292YXJpYW50YC4gVGhlIGZpcnN0IG5vbi1udWxsIHBhcmFtZXRlciBvZgogIC8vLyBbc3RhdGljT3JDb3ZhcmlhbnRdLCBbc3RhdGljVG9rZW5dLCBvciBbY292YXJpYW50VG9rZW5dIHdpbGwgYmUgdXNlZCwKICAvLy8gaW4gdGhhdCBvcmRlciwgYW5kIHRoZSBvdGhlcnMgaWdub3JlZC4KICBUb2tlbiBwYXJzZU1vZGlmaWVycyhUb2tlbiB0b2tlbiwKICAgICAge1Rva2VuIGV4dGVybmFsVG9rZW4sCiAgICAgIFRva2VuIHN0YXRpY1Rva2VuLAogICAgICBUb2tlbiBzdGF0aWNPckNvdmFyaWFudCwKICAgICAgVG9rZW4gY292YXJpYW50VG9rZW4sCiAgICAgIFRva2VuIHZhckZpbmFsT3JDb25zdH0pIHsKICAgIGlmIChleHRlcm5hbFRva2VuICE9IG51bGwpIHsKICAgICAgdGhpcy5leHRlcm5hbFRva2VuID0gZXh0ZXJuYWxUb2tlbjsKICAgIH0KICAgIGlmIChzdGF0aWNPckNvdmFyaWFudCAhPSBudWxsKSB7CiAgICAgIGlmIChvcHRpb25hbCgnc3RhdGljJywgc3RhdGljT3JDb3ZhcmlhbnQpKSB7CiAgICAgICAgdGhpcy5zdGF0aWNUb2tlbiA9IHN0YXRpY09yQ292YXJpYW50OwogICAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCdjb3ZhcmlhbnQnLCBzdGF0aWNPckNvdmFyaWFudCkpIHsKICAgICAgICB0aGlzLmNvdmFyaWFudFRva2VuID0gc3RhdGljT3JDb3ZhcmlhbnQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgIkludGVybmFsIGVycm9yOiAiCiAgICAgICAgICAgICJVbmV4cGVjdGVkIHN0YXRpY09yQ292YXJpYW50ICckc3RhdGljT3JDb3ZhcmlhbnQnLiI7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc3RhdGljVG9rZW4gIT0gbnVsbCkgewogICAgICB0aGlzLnN0YXRpY1Rva2VuID0gc3RhdGljVG9rZW47CiAgICB9IGVsc2UgaWYgKGNvdmFyaWFudFRva2VuICE9IG51bGwpIHsKICAgICAgdGhpcy5jb3ZhcmlhbnRUb2tlbiA9IGNvdmFyaWFudFRva2VuOwogICAgfQogICAgaWYgKHZhckZpbmFsT3JDb25zdCAhPSBudWxsKSB7CiAgICAgIHRoaXMudmFyRmluYWxPckNvbnN0ID0gdmFyRmluYWxPckNvbnN0OwogICAgICBpZiAob3B0aW9uYWwoJ3ZhcicsIHZhckZpbmFsT3JDb25zdCkpIHsKICAgICAgICB2YXJUb2tlbiA9IHZhckZpbmFsT3JDb25zdDsKICAgICAgfSBlbHNlIGlmIChvcHRpb25hbCgnZmluYWwnLCB2YXJGaW5hbE9yQ29uc3QpKSB7CiAgICAgICAgZmluYWxUb2tlbiA9IHZhckZpbmFsT3JDb25zdDsKICAgICAgfSBlbHNlIGlmIChvcHRpb25hbCgnY29uc3QnLCB2YXJGaW5hbE9yQ29uc3QpKSB7CiAgICAgICAgY29uc3RUb2tlbiA9IHZhckZpbmFsT3JDb25zdDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyAiSW50ZXJuYWwgZXJyb3I6IFVuZXhwZWN0ZWQgdmFyRmluYWxPckNvbnN0ICckdmFyRmluYWxPckNvbnN0Jy4iOwogICAgICB9CiAgICB9CgogICAgLy8gUHJvY2VzcyBpbnZhbGlkIGFuZCBvdXQtb2Ytb3JkZXIgbW9kaWZpZXJzCiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGZpbmFsIHZhbHVlID0gbmV4dC5zdHJpbmdWYWx1ZTsKICAgICAgaWYgKGlzTW9kaWZpZXIobmV4dCkpIHsKICAgICAgICBpZiAoaWRlbnRpY2FsKCdhYnN0cmFjdCcsIHZhbHVlKSkgewogICAgICAgICAgdG9rZW4gPSBwYXJzZUFic3RyYWN0KHRva2VuKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgnY29uc3QnLCB2YWx1ZSkpIHsKICAgICAgICAgIHRva2VuID0gcGFyc2VDb25zdCh0b2tlbik7CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwoJ2NvdmFyaWFudCcsIHZhbHVlKSkgewogICAgICAgICAgdG9rZW4gPSBwYXJzZUNvdmFyaWFudCh0b2tlbik7CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwoJ2V4dGVybmFsJywgdmFsdWUpKSB7CiAgICAgICAgICB0b2tlbiA9IHBhcnNlRXh0ZXJuYWwodG9rZW4pOwogICAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCdmaW5hbCcsIHZhbHVlKSkgewogICAgICAgICAgdG9rZW4gPSBwYXJzZUZpbmFsKHRva2VuKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgnc3RhdGljJywgdmFsdWUpKSB7CiAgICAgICAgICB0b2tlbiA9IHBhcnNlU3RhdGljKHRva2VuKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgndmFyJywgdmFsdWUpKSB7CiAgICAgICAgICB0b2tlbiA9IHBhcnNlVmFyKHRva2VuKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgJ0ludGVybmFsIEVycm9yOiBVbmhhbmRsZWQgbW9kaWZpZXI6ICR2YWx1ZSc7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGFmdGVyRmFjdG9yeSAmJiBpZGVudGljYWwoJ2ZhY3RvcnknLCB2YWx1ZSkpIHsKICAgICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgICAgbmV4dCwgZmFzdGEudGVtcGxhdGVEdXBsaWNhdGVkTW9kaWZpZXIpOwogICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgfSBlbHNlIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIH0KCiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZUFic3RyYWN0KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnYWJzdHJhY3QnLCBuZXh0KSk7CiAgICBpZiAoYWJzdHJhY3RUb2tlbiA9PSBudWxsKSB7CiAgICAgIGFic3RyYWN0VG9rZW4gPSBuZXh0OwogICAgICByZXR1cm4gbmV4dDsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgbmV4dCwgZmFzdGEudGVtcGxhdGVEdXBsaWNhdGVkTW9kaWZpZXIpOwogICAgcmV0dXJuIG5leHQ7CiAgfQoKICBUb2tlbiBwYXJzZUNvbnN0KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnY29uc3QnLCBuZXh0KSk7CiAgICBpZiAodmFyRmluYWxPckNvbnN0ID09IG51bGwgJiYgY292YXJpYW50VG9rZW4gPT0gbnVsbCkgewogICAgICB2YXJGaW5hbE9yQ29uc3QgPSBjb25zdFRva2VuID0gbmV4dDsKCiAgICAgIGlmIChhZnRlckZhY3RvcnkpIHsKICAgICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBmYXN0YS5tZXNzYWdlQ29uc3RBZnRlckZhY3RvcnkpOwogICAgICB9CiAgICAgIHJldHVybiBuZXh0OwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBpZiAoY29uc3RUb2tlbiAhPSBudWxsKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgbmV4dCwgZmFzdGEudGVtcGxhdGVEdXBsaWNhdGVkTW9kaWZpZXIpOwogICAgfSBlbHNlIGlmIChjb3ZhcmlhbnRUb2tlbiAhPSBudWxsKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGZhc3RhLm1lc3NhZ2VDb25zdEFuZENvdmFyaWFudCk7CiAgICB9IGVsc2UgaWYgKGZpbmFsVG9rZW4gIT0gbnVsbCkgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBmYXN0YS5tZXNzYWdlQ29uc3RBbmRGaW5hbCk7CiAgICB9IGVsc2UgaWYgKHZhclRva2VuICE9IG51bGwpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgZmFzdGEubWVzc2FnZUNvbnN0QW5kVmFyKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICdJbnRlcm5hbCBFcnJvcjogVW5leHBlY3RlZCB2YXJGaW5hbE9yQ29uc3Q6ICR2YXJGaW5hbE9yQ29uc3QnOwogICAgfQogICAgcmV0dXJuIG5leHQ7CiAgfQoKICBUb2tlbiBwYXJzZUNvdmFyaWFudChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2NvdmFyaWFudCcsIG5leHQpKTsKICAgIGlmIChjb25zdFRva2VuID09IG51bGwgJiYKICAgICAgICBjb3ZhcmlhbnRUb2tlbiA9PSBudWxsICYmCiAgICAgICAgc3RhdGljVG9rZW4gPT0gbnVsbCAmJgogICAgICAgICFhZnRlckZhY3RvcnkpIHsKICAgICAgY292YXJpYW50VG9rZW4gPSBuZXh0OwoKICAgICAgaWYgKHZhclRva2VuICE9IG51bGwpIHsKICAgICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBmYXN0YS5tZXNzYWdlQ292YXJpYW50QWZ0ZXJWYXIpOwogICAgICB9IGVsc2UgaWYgKGZpbmFsVG9rZW4gIT0gbnVsbCkgewogICAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGZhc3RhLm1lc3NhZ2VDb3ZhcmlhbnRBZnRlckZpbmFsKTsKICAgICAgfQogICAgICByZXR1cm4gbmV4dDsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgaWYgKGNvdmFyaWFudFRva2VuICE9IG51bGwpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBuZXh0LCBmYXN0YS50ZW1wbGF0ZUR1cGxpY2F0ZWRNb2RpZmllcik7CiAgICB9IGVsc2UgaWYgKGFmdGVyRmFjdG9yeSkgewogICAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIobmV4dCk7CiAgICB9IGVsc2UgaWYgKGNvbnN0VG9rZW4gIT0gbnVsbCkgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBmYXN0YS5tZXNzYWdlQ29uc3RBbmRDb3ZhcmlhbnQpOwogICAgfSBlbHNlIGlmIChzdGF0aWNUb2tlbiAhPSBudWxsKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGZhc3RhLm1lc3NhZ2VDb3ZhcmlhbnRBbmRTdGF0aWMpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgJ0ludGVybmFsIEVycm9yOiBVbmhhbmRsZWQgcmVjb3Zlcnk6ICRuZXh0JzsKICAgIH0KICAgIHJldHVybiBuZXh0OwogIH0KCiAgVG9rZW4gcGFyc2VFeHRlcm5hbChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2V4dGVybmFsJywgbmV4dCkpOwogICAgaWYgKGV4dGVybmFsVG9rZW4gPT0gbnVsbCkgewogICAgICBleHRlcm5hbFRva2VuID0gbmV4dDsKCiAgICAgIGlmIChhZnRlckZhY3RvcnkpIHsKICAgICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBmYXN0YS5tZXNzYWdlRXh0ZXJuYWxBZnRlckZhY3RvcnkpOwogICAgICB9IGVsc2UgaWYgKGNvbnN0VG9rZW4gIT0gbnVsbCkgewogICAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGZhc3RhLm1lc3NhZ2VFeHRlcm5hbEFmdGVyQ29uc3QpOwogICAgICB9IGVsc2UgaWYgKHN0YXRpY1Rva2VuICE9IG51bGwpIHsKICAgICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBmYXN0YS5tZXNzYWdlRXh0ZXJuYWxBZnRlclN0YXRpYyk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgIG5leHQsIGZhc3RhLnRlbXBsYXRlRHVwbGljYXRlZE1vZGlmaWVyKTsKICAgIHJldHVybiBuZXh0OwogIH0KCiAgVG9rZW4gcGFyc2VGaW5hbChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2ZpbmFsJywgbmV4dCkpOwogICAgaWYgKHZhckZpbmFsT3JDb25zdCA9PSBudWxsICYmICFhZnRlckZhY3RvcnkpIHsKICAgICAgdmFyRmluYWxPckNvbnN0ID0gZmluYWxUb2tlbiA9IG5leHQ7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBpZiAoZmluYWxUb2tlbiAhPSBudWxsKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgbmV4dCwgZmFzdGEudGVtcGxhdGVEdXBsaWNhdGVkTW9kaWZpZXIpOwogICAgfSBlbHNlIGlmIChhZnRlckZhY3RvcnkpIHsKICAgICAgcmVwb3J0RXh0cmFuZW91c01vZGlmaWVyKG5leHQpOwogICAgfSBlbHNlIGlmIChjb25zdFRva2VuICE9IG51bGwpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgZmFzdGEubWVzc2FnZUNvbnN0QW5kRmluYWwpOwogICAgfSBlbHNlIGlmICh2YXJUb2tlbiAhPSBudWxsKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGZhc3RhLm1lc3NhZ2VGaW5hbEFuZFZhcik7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyAnSW50ZXJuYWwgRXJyb3I6IFVuZXhwZWN0ZWQgdmFyRmluYWxPckNvbnN0OiAkdmFyRmluYWxPckNvbnN0JzsKICAgIH0KICAgIHJldHVybiBuZXh0OwogIH0KCiAgVG9rZW4gcGFyc2VTdGF0aWMoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdzdGF0aWMnLCBuZXh0KSk7CiAgICBpZiAoY292YXJpYW50VG9rZW4gPT0gbnVsbCAmJiBzdGF0aWNUb2tlbiA9PSBudWxsICYmICFhZnRlckZhY3RvcnkpIHsKICAgICAgc3RhdGljVG9rZW4gPSBuZXh0OwoKICAgICAgaWYgKGNvbnN0VG9rZW4gIT0gbnVsbCkgewogICAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGZhc3RhLm1lc3NhZ2VTdGF0aWNBZnRlckNvbnN0KTsKICAgICAgfSBlbHNlIGlmIChmaW5hbFRva2VuICE9IG51bGwpIHsKICAgICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBmYXN0YS5tZXNzYWdlU3RhdGljQWZ0ZXJGaW5hbCk7CiAgICAgIH0gZWxzZSBpZiAodmFyVG9rZW4gIT0gbnVsbCkgewogICAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGZhc3RhLm1lc3NhZ2VTdGF0aWNBZnRlclZhcik7CiAgICAgIH0KICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIGlmIChjb3ZhcmlhbnRUb2tlbiAhPSBudWxsKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGZhc3RhLm1lc3NhZ2VDb3ZhcmlhbnRBbmRTdGF0aWMpOwogICAgfSBlbHNlIGlmIChzdGF0aWNUb2tlbiAhPSBudWxsKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgbmV4dCwgZmFzdGEudGVtcGxhdGVEdXBsaWNhdGVkTW9kaWZpZXIpOwogICAgfSBlbHNlIGlmIChhZnRlckZhY3RvcnkpIHsKICAgICAgcmVwb3J0RXh0cmFuZW91c01vZGlmaWVyKG5leHQpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgJ0ludGVybmFsIEVycm9yOiBVbmhhbmRsZWQgcmVjb3Zlcnk6ICRuZXh0JzsKICAgIH0KICAgIHJldHVybiBuZXh0OwogIH0KCiAgVG9rZW4gcGFyc2VWYXIoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCd2YXInLCBuZXh0KSk7CiAgICBpZiAodmFyRmluYWxPckNvbnN0ID09IG51bGwgJiYgIWFmdGVyRmFjdG9yeSkgewogICAgICB2YXJGaW5hbE9yQ29uc3QgPSB2YXJUb2tlbiA9IG5leHQ7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBpZiAodmFyVG9rZW4gIT0gbnVsbCkgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIG5leHQsIGZhc3RhLnRlbXBsYXRlRHVwbGljYXRlZE1vZGlmaWVyKTsKICAgIH0gZWxzZSBpZiAoYWZ0ZXJGYWN0b3J5KSB7CiAgICAgIHJlcG9ydEV4dHJhbmVvdXNNb2RpZmllcihuZXh0KTsKICAgIH0gZWxzZSBpZiAoY29uc3RUb2tlbiAhPSBudWxsKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGZhc3RhLm1lc3NhZ2VDb25zdEFuZFZhcik7CiAgICB9IGVsc2UgaWYgKGZpbmFsVG9rZW4gIT0gbnVsbCkgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBmYXN0YS5tZXNzYWdlRmluYWxBbmRWYXIpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgJ0ludGVybmFsIEVycm9yOiBVbmV4cGVjdGVkIHZhckZpbmFsT3JDb25zdDogJHZhckZpbmFsT3JDb25zdCc7CiAgICB9CiAgICByZXR1cm4gbmV4dDsKICB9CgogIHZvaWQgcmVwb3J0RXh0cmFuZW91c01vZGlmaWVyKFRva2VuIHRva2VuKSB7CiAgICBpZiAodG9rZW4gIT0gbnVsbCkgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIHRva2VuLCBmYXN0YS50ZW1wbGF0ZUV4dHJhbmVvdXNNb2RpZmllcik7CiAgICB9CiAgfQp9CoGVAE5OPAEuJCsiIgEfGxIEHkVLEwdCHTEdQhQGBA8CAUxEIBcXFBgXFBUZEgFCHQFNFgEoATQvHBkcICImIigrASElPAYSBAEtSjciSwExMzUiBh4sHkMlJ0YgGxkIBi0tKxIEATEwTxkiJi4rASElPAYSBAE6LDYiSQEtLisSBAExNyFFAS0uLSsSBAFGNkMwBkpPTD9MLSQcGR8cICEqBiUzLj0xDyFCCCYmKSwGIy4uJDcmNyYPUAgGATIdEyYeLCgwJTQpMygwJTEmLiMRPgpAMDUWDw8IGQYBEgQBJR0oIRwTBgEQLDERBAEiHSU9KwEaTQgTBgEQHi4zKUslRyNFDUwGEQQBJh0pHiIfGR0BHk0nTwgTBgEQIi4zHyYlSyZMDTkGEQQBJR0oIRwBGlAnTihPCBMGARAsMREEASIdJTQrEwYBEB4uMx8mJUcjRQ1MBhEEASMdJkoaASBMJ0wlSggTBgEQIkwmLjMfJg05BhEEASAdIzQpEwYBEBwuMx8mJUUlRQ1MBhEEAS8ZLjQGBAIBOHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvbW9kaWZpZXJfY29udGV4dC5kYXJ0Q3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9wYXJzZXIvcmVjb3ZlcnlfbGlzdGVuZXJzLmRhcnSJ6C8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uLy4uL3NjYW5uZXIvdG9rZW4uZGFydCcgc2hvdyBUb2tlbjsKCmltcG9ydCAnZm9yd2FyZGluZ19saXN0ZW5lci5kYXJ0JyBzaG93IEZvcndhcmRpbmdMaXN0ZW5lcjsKCmNsYXNzIENsYXNzSGVhZGVyUmVjb3ZlcnlMaXN0ZW5lciBleHRlbmRzIEZvcndhcmRpbmdMaXN0ZW5lciB7CiAgVG9rZW4gZXh0ZW5kc0tleXdvcmQ7CiAgVG9rZW4gaW1wbGVtZW50c0tleXdvcmQ7CiAgVG9rZW4gd2l0aEtleXdvcmQ7CgogIHZvaWQgY2xlYXIoKSB7CiAgICBleHRlbmRzS2V5d29yZCA9IG51bGw7CiAgICBpbXBsZW1lbnRzS2V5d29yZCA9IG51bGw7CiAgICB3aXRoS2V5d29yZCA9IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNsYXNzRXh0ZW5kcyhUb2tlbiBleHRlbmRzS2V5d29yZCkgewogICAgdGhpcy5leHRlbmRzS2V5d29yZCA9IGV4dGVuZHNLZXl3b3JkOwogICAgc3VwZXIuaGFuZGxlQ2xhc3NFeHRlbmRzKGV4dGVuZHNLZXl3b3JkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ2xhc3NPck1peGluSW1wbGVtZW50cygKICAgICAgVG9rZW4gaW1wbGVtZW50c0tleXdvcmQsIGludCBpbnRlcmZhY2VzQ291bnQpIHsKICAgIHRoaXMuaW1wbGVtZW50c0tleXdvcmQgPSBpbXBsZW1lbnRzS2V5d29yZDsKICAgIHN1cGVyLmhhbmRsZUNsYXNzT3JNaXhpbkltcGxlbWVudHMoaW1wbGVtZW50c0tleXdvcmQsIGludGVyZmFjZXNDb3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNsYXNzV2l0aENsYXVzZShUb2tlbiB3aXRoS2V5d29yZCkgewogICAgdGhpcy53aXRoS2V5d29yZCA9IHdpdGhLZXl3b3JkOwogICAgc3VwZXIuaGFuZGxlQ2xhc3NXaXRoQ2xhdXNlKHdpdGhLZXl3b3JkKTsKICB9Cn0KCmNsYXNzIEltcG9ydFJlY292ZXJ5TGlzdGVuZXIgZXh0ZW5kcyBGb3J3YXJkaW5nTGlzdGVuZXIgewogIFRva2VuIGFzS2V5d29yZDsKICBUb2tlbiBkZWZlcnJlZEtleXdvcmQ7CiAgVG9rZW4gaWZLZXl3b3JkOwogIGJvb2wgaGFzQ29tYmluYXRvciA9IGZhbHNlOwoKICB2b2lkIGNsZWFyKCkgewogICAgYXNLZXl3b3JkID0gbnVsbDsKICAgIGRlZmVycmVkS2V5d29yZCA9IG51bGw7CiAgICBpZktleXdvcmQgPSBudWxsOwogICAgaGFzQ29tYmluYXRvciA9IGZhbHNlOwogIH0KCiAgdm9pZCBlbmRDb25kaXRpb25hbFVyaShUb2tlbiBpZktleXdvcmQsIFRva2VuIGxlZnRQYXJlbiwgVG9rZW4gZXF1YWxTaWduKSB7CiAgICB0aGlzLmlmS2V5d29yZCA9IGlmS2V5d29yZDsKICAgIHN1cGVyLmVuZENvbmRpdGlvbmFsVXJpKGlmS2V5d29yZCwgbGVmdFBhcmVuLCBlcXVhbFNpZ24pOwogIH0KCiAgdm9pZCBlbmRIaWRlKFRva2VuIGhpZGVLZXl3b3JkKSB7CiAgICB0aGlzLmhhc0NvbWJpbmF0b3IgPSB0cnVlOwogICAgc3VwZXIuZW5kSGlkZShoaWRlS2V5d29yZCk7CiAgfQoKICB2b2lkIGVuZFNob3coVG9rZW4gc2hvd0tleXdvcmQpIHsKICAgIHRoaXMuaGFzQ29tYmluYXRvciA9IHRydWU7CiAgICBzdXBlci5lbmRTaG93KHNob3dLZXl3b3JkKTsKICB9CgogIHZvaWQgaGFuZGxlSW1wb3J0UHJlZml4KFRva2VuIGRlZmVycmVkS2V5d29yZCwgVG9rZW4gYXNLZXl3b3JkKSB7CiAgICB0aGlzLmRlZmVycmVkS2V5d29yZCA9IGRlZmVycmVkS2V5d29yZDsKICAgIHRoaXMuYXNLZXl3b3JkID0gYXNLZXl3b3JkOwogICAgc3VwZXIuaGFuZGxlSW1wb3J0UHJlZml4KGRlZmVycmVkS2V5d29yZCwgYXNLZXl3b3JkKTsKICB9Cn0KCmNsYXNzIE1peGluSGVhZGVyUmVjb3ZlcnlMaXN0ZW5lciBleHRlbmRzIEZvcndhcmRpbmdMaXN0ZW5lciB7CiAgVG9rZW4gb25LZXl3b3JkOwogIFRva2VuIGltcGxlbWVudHNLZXl3b3JkOwoKICB2b2lkIGNsZWFyKCkgewogICAgb25LZXl3b3JkID0gbnVsbDsKICAgIGltcGxlbWVudHNLZXl3b3JkID0gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ2xhc3NPck1peGluSW1wbGVtZW50cygKICAgICAgVG9rZW4gaW1wbGVtZW50c0tleXdvcmQsIGludCBpbnRlcmZhY2VzQ291bnQpIHsKICAgIHRoaXMuaW1wbGVtZW50c0tleXdvcmQgPSBpbXBsZW1lbnRzS2V5d29yZDsKICAgIHN1cGVyLmhhbmRsZUNsYXNzT3JNaXhpbkltcGxlbWVudHMoaW1wbGVtZW50c0tleXdvcmQsIGludGVyZmFjZXNDb3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU1peGluT24oVG9rZW4gb25LZXl3b3JkLCBpbnQgdHlwZUNvdW50KSB7CiAgICB0aGlzLm9uS2V5d29yZCA9IG9uS2V5d29yZDsKICAgIHN1cGVyLmhhbmRsZU1peGluT24ob25LZXl3b3JkLCB0eXBlQ291bnQpOwogIH0KfQpiAE5OPAEuATsBPxgbFQERGx4YBAEMMiouBAEMJTYwTAQBDDIkLgQCAToTGRMeAREWHBYbBAFOID4EASQfIAQBJB8gBAFELCA6BAIBPxMbAREWHgQBDCU2MEwEAQw3IC8EAgE6cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci9yZWNvdmVyeV9saXN0ZW5lcnMuZGFydEZzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvcGFyc2VyL3Rva2VuX3N0cmVhbV9yZXdyaXRlci5kYXJ0moYvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9zY2FubmVyL2Vycm9yX3Rva2VuLmRhcnQnIHNob3cgVW5tYXRjaGVkVG9rZW47CgppbXBvcnQgJy4uLy4uL3NjYW5uZXIvdG9rZW4uZGFydCcKICAgIHNob3cKICAgICAgICBCZWdpblRva2VuLAogICAgICAgIFNpbXBsZVRva2VuLAogICAgICAgIFN5bnRoZXRpY0JlZ2luVG9rZW4sCiAgICAgICAgU3ludGhldGljU3RyaW5nVG9rZW4sCiAgICAgICAgU3ludGhldGljVG9rZW4sCiAgICAgICAgVG9rZW4sCiAgICAgICAgVG9rZW5UeXBlOwoKLy8vIFByb3ZpZGVzIHRoZSBjYXBhYmlsaXR5IG9mIGluc2VydGluZyB0b2tlbnMgaW50byBhIHRva2VuIHN0cmVhbS4gVGhpcwovLy8gaW1wbGVtZW50YXRpb24gZG9lcyB0aGlzIGJ5IHJld3JpdGluZyB0aGUgcHJldmlvdXMgdG9rZW4gdG8gcG9pbnQgdG8gdGhlCi8vLyBpbnNlcnRlZCB0b2tlbi4KY2xhc3MgVG9rZW5TdHJlYW1SZXdyaXRlciB7CiAgLy8gVE9ETyhicmlhbndpbGtlcnNvbik6CiAgLy8KICAvLyBXaGVuIHdlIGdldCB0byB0aGUgcG9pbnQgb2YgcmVtb3ZpbmcgYHRva2VuLnByZXZpb3VzYCwgdGhlIHBsYW4gaXMgdG8KICAvLyBjb252ZXJ0IHRoaXMgaW50byBhbiBpbnRlcmZhY2UgYW5kIHByb3ZpZGUgdHdvIGltcGxlbWVudGF0aW9ucy4KICAvLwogIC8vIE9uZSwgdXNlZCBieSBGYXN0YSwgd2lsbCBjb25uZWN0IHRoZSBpbnNlcnRlZCB0b2tlbnMgdG8gdGhlIGZvbGxvd2luZyB0b2tlbgogIC8vIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBwcmV2aW91cyB0b2tlbi4KICAvLwogIC8vIFRoZSBvdGhlciwgdXNlZCBieSAnYW5hbHl6ZXInLCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlCiAgLy8gc3RyZWFtIChhY3R1YWxseSB3aXRoIHRoZSBCT0YgbWFya2VyIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbSkuIEl0CiAgLy8gd2lsbCBiZSBjcmVhdGVkIG9ubHkgd2hlbiBpbnZva2luZyAnYW5hbHl6ZXInIHNwZWNpZmljIHBhcnNlIG1ldGhvZHMgKGluCiAgLy8gYFBhcnNlcmApLCBzdWNoIGFzCiAgLy8KICAvLyBUb2tlbiBwYXJzZVVuaXRXaXRoUmV3cml0ZShUb2tlbiBib2YpIHsKICAvLyAgIHJld3JpdGVyID0gQW5hbHl6ZXJUb2tlblN0cmVhbVJld3JpdGVyKGJvZik7CiAgLy8gICByZXR1cm4gcGFyc2VVbml0KGJvZi5uZXh0KTsKICAvLyB9CiAgLy8KCiAgLy8vIEluc2VydCBhIHN5bnRoZXRpYyBvcGVuIGFuZCBjbG9zZSBwYXJlbnRoZXNpcyBhbmQgcmV0dXJuIHRoZSBuZXcgc3ludGhldGljCiAgLy8vIG9wZW4gcGFyZW50aGVzaXMuIElmIFtpbnNlcnRJZGVudGlmaWVyXSBpcyB0cnVlLCB0aGVuIGEgc3ludGhldGljCiAgLy8vIGlkZW50aWZpZXIgaXMgaW5jbHVkZWQgYmV0d2VlbiB0aGUgb3BlbiBhbmQgY2xvc2UgcGFyZW50aGVzaXMuCiAgVG9rZW4gaW5zZXJ0UGFyZW5zKFRva2VuIHRva2VuLCBib29sIGluY2x1ZGVJZGVudGlmaWVyKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGludCBvZmZzZXQgPSBuZXh0LmNoYXJPZmZzZXQ7CiAgICBCZWdpblRva2VuIGxlZnRQYXJlbiA9CiAgICAgICAgbmV4dCA9IG5ldyBTeW50aGV0aWNCZWdpblRva2VuKFRva2VuVHlwZS5PUEVOX1BBUkVOLCBvZmZzZXQpOwogICAgaWYgKGluY2x1ZGVJZGVudGlmaWVyKSB7CiAgICAgIG5leHQgPSBuZXh0LnNldE5leHQoCiAgICAgICAgICBuZXcgU3ludGhldGljU3RyaW5nVG9rZW4oVG9rZW5UeXBlLklERU5USUZJRVIsICcnLCBvZmZzZXQsIDApKTsKICAgIH0KICAgIG5leHQgPSBuZXh0LnNldE5leHQobmV3IFN5bnRoZXRpY1Rva2VuKFRva2VuVHlwZS5DTE9TRV9QQVJFTiwgb2Zmc2V0KSk7CiAgICBsZWZ0UGFyZW4uZW5kR3JvdXAgPSBuZXh0OwogICAgbmV4dC5zZXROZXh0KHRva2VuLm5leHQpOwoKICAgIC8vIEEgbm8tb3AgcmV3cml0ZXIgY291bGQgc2tpcCB0aGlzIHN0ZXAuCiAgICB0b2tlbi5zZXROZXh0KGxlZnRQYXJlbik7CgogICAgcmV0dXJuIGxlZnRQYXJlbjsKICB9CgogIC8vLyBJbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciBhZnRlciBbdG9rZW5dIGFuZCByZXR1cm4gdGhlIG5ldyBpZGVudGlmaWVyLgogIFRva2VuIGluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBpbnNlcnRUb2tlbigKICAgICAgICB0b2tlbiwKICAgICAgICBuZXcgU3ludGhldGljU3RyaW5nVG9rZW4oCiAgICAgICAgICAgIFRva2VuVHlwZS5JREVOVElGSUVSLCAnJywgdG9rZW4ubmV4dC5jaGFyT2Zmc2V0LCAwKSk7CiAgfQoKICAvLy8gSW5zZXJ0IFtuZXdUb2tlbl0gYWZ0ZXIgW3Rva2VuXSBhbmQgcmV0dXJuIFtuZXdUb2tlbl0uCiAgVG9rZW4gaW5zZXJ0VG9rZW4oVG9rZW4gdG9rZW4sIFRva2VuIG5ld1Rva2VuKSB7CiAgICBuZXdUb2tlbi5zZXROZXh0KHRva2VuLm5leHQpOwoKICAgIC8vIEEgbm8tb3AgcmV3cml0ZXIgY291bGQgc2tpcCB0aGlzIHN0ZXAuCiAgICB0b2tlbi5zZXROZXh0KG5ld1Rva2VuKTsKCiAgICByZXR1cm4gbmV3VG9rZW47CiAgfQoKICAvLy8gTW92ZSBbZW5kR3JvdXBdIChhIHN5bnRoZXRpYyBgKWAsIGBdYCwgb3IgYH1gIHRva2VuKSBhbmQgYXNzb2NpYXRlZAogIC8vLyBlcnJvciB0b2tlbiBhZnRlciBbdG9rZW5dIGluIHRoZSB0b2tlbiBzdHJlYW0gYW5kIHJldHVybiBbZW5kR3JvdXBdLgogIFRva2VuIG1vdmVTeW50aGV0aWMoVG9rZW4gdG9rZW4sIFRva2VuIGVuZEdyb3VwKSB7CiAgICBhc3NlcnQoZW5kR3JvdXAuYmVmb3JlU3ludGhldGljICE9IG51bGwpOwogICAgVG9rZW4gZXJyb3JUb2tlbjsKICAgIGlmIChlbmRHcm91cC5uZXh0IGlzIFVubWF0Y2hlZFRva2VuKSB7CiAgICAgIGVycm9yVG9rZW4gPSBlbmRHcm91cC5uZXh0OwogICAgfQoKICAgIC8vIFJlbW92ZSBlbmRHcm91cCBmcm9tIGl0cyBjdXJyZW50IGxvY2F0aW9uCiAgICBlbmRHcm91cC5iZWZvcmVTeW50aGV0aWMuc2V0TmV4dCgoZXJyb3JUb2tlbiA/PyBlbmRHcm91cCkubmV4dCk7CgogICAgLy8gSW5zZXJ0IGVuZEdyb3VwIGludG8gaXRzIG5ldyBsb2NhdGlvbgogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICB0b2tlbi5zZXROZXh0KGVuZEdyb3VwKTsKICAgIChlcnJvclRva2VuID8/IGVuZEdyb3VwKS5zZXROZXh0KG5leHQpOwogICAgZW5kR3JvdXAub2Zmc2V0ID0gbmV4dC5vZmZzZXQ7CiAgICBpZiAoZXJyb3JUb2tlbiAhPSBudWxsKSB7CiAgICAgIGVycm9yVG9rZW4ub2Zmc2V0ID0gbmV4dC5vZmZzZXQ7CiAgICB9CgogICAgcmV0dXJuIGVuZEdyb3VwOwogIH0KCiAgLy8vIFJlcGxhY2UgdGhlIHNpbmdsZSB0b2tlbiBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIFtwcmV2aW91c1Rva2VuXSB3aXRoCiAgLy8vIHRoZSBjaGFpbiBvZiB0b2tlbnMgc3RhcnRpbmcgYXQgdGhlIFtyZXBsYWNlbWVudFRva2VuXS4gUmV0dXJuIHRoZQogIC8vLyBbcmVwbGFjZW1lbnRUb2tlbl0uCiAgVG9rZW4gcmVwbGFjZVRva2VuRm9sbG93aW5nKFRva2VuIHByZXZpb3VzVG9rZW4sIFRva2VuIHJlcGxhY2VtZW50VG9rZW4pIHsKICAgIFRva2VuIHJlcGxhY2VkVG9rZW4gPSBwcmV2aW91c1Rva2VuLm5leHQ7CiAgICBwcmV2aW91c1Rva2VuLnNldE5leHQocmVwbGFjZW1lbnRUb2tlbik7CgogICAgKHJlcGxhY2VtZW50VG9rZW4gYXMgU2ltcGxlVG9rZW4pLnByZWNlZGluZ0NvbW1lbnRzID0KICAgICAgICByZXBsYWNlZFRva2VuLnByZWNlZGluZ0NvbW1lbnRzOwoKICAgIF9sYXN0VG9rZW5JbkNoYWluKHJlcGxhY2VtZW50VG9rZW4pLnNldE5leHQocmVwbGFjZWRUb2tlbi5uZXh0KTsKCiAgICByZXR1cm4gcmVwbGFjZW1lbnRUb2tlbjsKICB9CgogIC8vLyBHaXZlbiB0aGUgW2ZpcnN0VG9rZW5dIGluIGEgY2hhaW4gb2YgdG9rZW5zIHRvIGJlIGluc2VydGVkLCByZXR1cm4gdGhlCiAgLy8vIGxhc3QgdG9rZW4gaW4gdGhlIGNoYWluLgogIC8vLwogIC8vLyBBcyBhIHNpZGUtZWZmZWN0LCB0aGlzIG1ldGhvZCBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgdG9rZW5zIGluIHRoZSBjaGFpbgogIC8vLyBoYXZlIHRoZWlyIGBwcmV2aW91c2AgcG9pbnRlcnMgc2V0IGNvcnJlY3RseS4KICBUb2tlbiBfbGFzdFRva2VuSW5DaGFpbihUb2tlbiBmaXJzdFRva2VuKSB7CiAgICBUb2tlbiBwcmV2aW91czsKICAgIFRva2VuIGN1cnJlbnQgPSBmaXJzdFRva2VuOwogICAgd2hpbGUgKGN1cnJlbnQubmV4dCAhPSBudWxsICYmIGN1cnJlbnQubmV4dC50eXBlICE9IFRva2VuVHlwZS5FT0YpIHsKICAgICAgaWYgKHByZXZpb3VzICE9IG51bGwpIHsKICAgICAgICBjdXJyZW50LnByZXZpb3VzID0gcHJldmlvdXM7CiAgICAgIH0KICAgICAgcHJldmlvdXMgPSBjdXJyZW50OwogICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0OwogICAgfQogICAgaWYgKHByZXZpb3VzICE9IG51bGwpIHsKICAgICAgY3VycmVudC5wcmV2aW91cyA9IHByZXZpb3VzOwogICAgfQogICAgcmV0dXJuIGN1cnJlbnQ7CiAgfQp9CgovLy8gUHJvdmlkZXMgdGhlIGNhcGFiaWxpdHkgb2YgYWRkaW5nIHRva2VucyB0aGF0IGxlYWQgaW50byBhIHRva2VuIHN0cmVhbQovLy8gd2l0aG91dCBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIHRva2VuIHN0cmVhbSBhbmQgbm90IHNldHRpbmcgdGhlIGFueSB0b2tlbidzCi8vLyBgcHJldmlvdXNgIGZpZWxkLgpjbGFzcyBUb2tlblN0cmVhbUdob3N0V3JpdGVyIGltcGxlbWVudHMgVG9rZW5TdHJlYW1SZXdyaXRlciB7CiAgQG92ZXJyaWRlCiAgVG9rZW4gaW5zZXJ0UGFyZW5zKFRva2VuIHRva2VuLCBib29sIGluY2x1ZGVJZGVudGlmaWVyKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGludCBvZmZzZXQgPSBuZXh0LmNoYXJPZmZzZXQ7CiAgICBCZWdpblRva2VuIGxlZnRQYXJlbiA9CiAgICAgICAgbmV4dCA9IG5ldyBTeW50aGV0aWNCZWdpblRva2VuKFRva2VuVHlwZS5PUEVOX1BBUkVOLCBvZmZzZXQpOwogICAgaWYgKGluY2x1ZGVJZGVudGlmaWVyKSB7CiAgICAgIFRva2VuIGlkZW50aWZpZXIgPQogICAgICAgICAgbmV3IFN5bnRoZXRpY1N0cmluZ1Rva2VuKFRva2VuVHlwZS5JREVOVElGSUVSLCAnJywgb2Zmc2V0LCAwKTsKICAgICAgbmV4dC5uZXh0ID0gaWRlbnRpZmllcjsKICAgICAgbmV4dCA9IGlkZW50aWZpZXI7CiAgICB9CiAgICBUb2tlbiByaWdodFBhcmVuID0gbmV3IFN5bnRoZXRpY1Rva2VuKFRva2VuVHlwZS5DTE9TRV9QQVJFTiwgb2Zmc2V0KTsKICAgIG5leHQubmV4dCA9IHJpZ2h0UGFyZW47CiAgICByaWdodFBhcmVuLm5leHQgPSB0b2tlbi5uZXh0OwoKICAgIHJldHVybiBsZWZ0UGFyZW47CiAgfQoKICAvLy8gSW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgYWZ0ZXIgW3Rva2VuXSBhbmQgcmV0dXJuIHRoZSBuZXcgaWRlbnRpZmllci4KICBUb2tlbiBpbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gaW5zZXJ0VG9rZW4oCiAgICAgICAgdG9rZW4sCiAgICAgICAgbmV3IFN5bnRoZXRpY1N0cmluZ1Rva2VuKAogICAgICAgICAgICBUb2tlblR5cGUuSURFTlRJRklFUiwgJycsIHRva2VuLm5leHQuY2hhck9mZnNldCwgMCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gaW5zZXJ0VG9rZW4oVG9rZW4gdG9rZW4sIFRva2VuIG5ld1Rva2VuKSB7CiAgICBuZXdUb2tlbi5uZXh0ID0gdG9rZW4ubmV4dDsKICAgIHJldHVybiBuZXdUb2tlbjsKICB9CgogIEBvdmVycmlkZQogIFRva2VuIG1vdmVTeW50aGV0aWMoVG9rZW4gdG9rZW4sIFRva2VuIGVuZEdyb3VwKSB7CiAgICBUb2tlbiBuZXdFbmRHcm91cCA9CiAgICAgICAgbmV3IFN5bnRoZXRpY1Rva2VuKGVuZEdyb3VwLnR5cGUsIHRva2VuLm5leHQuY2hhck9mZnNldCk7CiAgICBuZXdFbmRHcm91cC5uZXh0ID0gdG9rZW4ubmV4dDsKICAgIHJldHVybiBuZXdFbmRHcm91cDsKICB9CgogIEBvdmVycmlkZQogIFRva2VuIHJlcGxhY2VUb2tlbkZvbGxvd2luZyhUb2tlbiBwcmV2aW91c1Rva2VuLCBUb2tlbiByZXBsYWNlbWVudFRva2VuKSB7CiAgICBUb2tlbiByZXBsYWNlZFRva2VuID0gcHJldmlvdXNUb2tlbi5uZXh0OwoKICAgIChyZXBsYWNlbWVudFRva2VuIGFzIFNpbXBsZVRva2VuKS5wcmVjZWRpbmdDb21tZW50cyA9CiAgICAgICAgcmVwbGFjZWRUb2tlbi5wcmVjZWRpbmdDb21tZW50czsKCiAgICBfbGFzdFRva2VuSW5DaGFpbihyZXBsYWNlbWVudFRva2VuKS5uZXh0ID0gcmVwbGFjZWRUb2tlbi5uZXh0OwogICAgcmV0dXJuIHJlcGxhY2VtZW50VG9rZW47CiAgfQoKICAvLy8gR2l2ZW4gdGhlIFtmaXJzdFRva2VuXSBpbiBhIGNoYWluIG9mIHRva2VucyB0byBiZSBpbnNlcnRlZCwgcmV0dXJuIHRoZQogIC8vLyBsYXN0IHRva2VuIGluIHRoZSBjaGFpbi4KICBUb2tlbiBfbGFzdFRva2VuSW5DaGFpbihUb2tlbiBmaXJzdFRva2VuKSB7CiAgICBUb2tlbiBjdXJyZW50ID0gZmlyc3RUb2tlbjsKICAgIHdoaWxlIChjdXJyZW50Lm5leHQgIT0gbnVsbCAmJiBjdXJyZW50Lm5leHQudHlwZSAhPSBUb2tlblR5cGUuRU9GKSB7CiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7CiAgICB9CiAgICByZXR1cm4gY3VycmVudDsKICB9Cn0KgNAATk48AToBIgkUFR0eGA8TAUpNFBwbBUtFBVErBVBOThgFLTQjBwUBUUhFPB0iG0YdG0oGTB8eAS4eARYEAVExGA8iQgQBPTMiAS4dARUEAUpLNS4WKyIGATFFAS0dHSwjHicGARUEAU5JGk0uLQE6KQFFAR0EAU0fBk40LhQgSR4lCBoeBhwjBhQEAgFLUBY+DDwdIhtGHRlJHhkGShwiARYEAVExGA8iQgQBDDMgFQQBDDUYQiMYBAEMTS4BOikBQx0EAU0fLiBJHgYUBAIBPXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvdG9rZW5fc3RyZWFtX3Jld3JpdGVyLmRhcnQ6c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3BhcnNlci90eXBlX2luZm8uZGFydLTVLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEucGFyc2VyLnR5cGVfaW5mbzsKCmltcG9ydCAnLi4vLi4vc2Nhbm5lci90b2tlbi5kYXJ0JyBzaG93IFRva2VuLCBUb2tlblR5cGU7CgppbXBvcnQgJy4uL3NjYW5uZXIvdG9rZW5fY29uc3RhbnRzLmRhcnQnIHNob3cgSURFTlRJRklFUl9UT0tFTiwgS0VZV09SRF9UT0tFTjsKCmltcG9ydCAncGFyc2VyLmRhcnQnIHNob3cgUGFyc2VyOwoKaW1wb3J0ICd0eXBlX2luZm9faW1wbC5kYXJ0JzsKCmltcG9ydCAndXRpbC5kYXJ0JyBzaG93IGlzT25lT2YsIG9wdGlvbmFsOwoKLy8vIFtUeXBlSW5mb10gcHJvdmlkZXMgaW5mb3JtYXRpb24gY29sbGVjdGVkIGJ5IFtjb21wdXRlVHlwZV0KLy8vIGFib3V0IGEgcGFydGljdWxhciB0eXBlIHJlZmVyZW5jZS4KYWJzdHJhY3QgY2xhc3MgVHlwZUluZm8gewogIC8vLyBSZXR1cm4gdHlwZSBpbmZvIHJlcHJlc2VudGluZyB0aGUgcmVjZWl2ZXIgd2l0aG91dCB0aGUgdHJhaWxpbmcgYD9gCiAgLy8vIG9yIHRoZSByZWNlaXZlciBpZiB0aGUgcmVjZWl2ZXIgZG9lcyBub3QgcmVwcmVzZW50IGEgbnVsbGFibGUgdHlwZS4KICBUeXBlSW5mbyBnZXQgYXNOb25OdWxsYWJsZTsKCiAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIHRva2VucyBjb21wcmlzaW5nIHRoZSB0eXBlIHJlcHJlc2VudGVkIGJ5IHRoZQogIC8vLyByZWNlaXZlciBjb3VsZCBiZSBpbnRlcnByZXRlZCBhcyBhIHZhbGlkIHN0YW5kYWxvbmUgZXhwcmVzc2lvbi4KICAvLy8gRm9yIGV4YW1wbGUsIGBBYCBvciBgQS5iYCBjb3VsZCBiZSBpbnRlcnByZXRlZCBhcyB0eXBlIHJlZmVyZW5jZXMKICAvLy8gb3IgZXhwcmVzc2lvbnMsIHdoaWxlIGBBPFQ+YCBvbmx5IGxvb2tzIGxpa2UgYSB0eXBlIHJlZmVyZW5jZS4KICBib29sIGdldCBjb3VsZEJlRXhwcmVzc2lvbjsKCiAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSByZWNlaXZlciBoYXMgYSB0cmFpbGluZyBgP2AuCiAgYm9vbCBnZXQgaXNOdWxsYWJsZTsKCiAgLy8vIENhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSB0b2tlbiBhZnRlciBbdG9rZW5dIG11c3QgYmUgYSB0eXBlIChub3Qgdm9pZCkuCiAgLy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxsIHRoZSBhcHByb3ByaWF0ZSBldmVudCBtZXRob2RzIG9uIHRoZSBbUGFyc2VyXSdzCiAgLy8vIGxpc3RlbmVyIHRvIGhhbmRsZSB0aGUgdHlwZSwgaW5zZXJ0aW5nIGEgc3ludGhldGljIHR5cGUgcmVmZXJlbmNlIGlmCiAgLy8vIG5lY2Vzc2FyeS4gVGhpcyBtYXkgbW9kaWZ5IHRoZSB0b2tlbiBzdHJlYW0gd2hlbiBwYXJzaW5nIGA+PmAgb3IgYD4+PmAKICAvLy8gb3IgYD4+Pj1gIGluIHZhbGlkIGNvZGUgb3IgZHVyaW5nIHJlY292ZXJ5LgogIFRva2VuIGVuc3VyZVR5cGVOb3RWb2lkKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKTsKCiAgLy8vIENhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSB0b2tlbiBhZnRlciBbdG9rZW5dIG11c3QgYmUgYSB0eXBlIG9yIHZvaWQuCiAgLy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxsIHRoZSBhcHByb3ByaWF0ZSBldmVudCBtZXRob2RzIG9uIHRoZSBbUGFyc2VyXSdzCiAgLy8vIGxpc3RlbmVyIHRvIGhhbmRsZSB0aGUgdHlwZSwgaW5zZXJ0aW5nIGEgc3ludGhldGljIHR5cGUgcmVmZXJlbmNlIGlmCiAgLy8vIG5lY2Vzc2FyeS4gVGhpcyBtYXkgbW9kaWZ5IHRoZSB0b2tlbiBzdHJlYW0gd2hlbiBwYXJzaW5nIGA+PmAgb3IgYD4+PmAKICAvLy8gb3IgYD4+Pj1gIGluIHZhbGlkIGNvZGUgb3IgZHVyaW5nIHJlY292ZXJ5LgogIFRva2VuIGVuc3VyZVR5cGVPclZvaWQoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpOwoKICAvLy8gQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHBhcnNlIGFuIG9wdGlvbmFsIHR5cGUgKG5vdCB2b2lkKSBhZnRlciBbdG9rZW5dLgogIC8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsbCB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgbWV0aG9kcyBvbiB0aGUgW1BhcnNlcl0ncwogIC8vLyBsaXN0ZW5lciB0byBoYW5kbGUgdGhlIHR5cGUuIFRoaXMgbWF5IG1vZGlmeSB0aGUgdG9rZW4gc3RyZWFtCiAgLy8vIHdoZW4gcGFyc2luZyBgPj5gIG9yIGA+Pj5gIG9yIGA+Pj49YCAgaW4gdmFsaWQgY29kZSBvciBkdXJpbmcgcmVjb3ZlcnkuCiAgVG9rZW4gcGFyc2VUeXBlTm90Vm9pZChUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcik7CgogIC8vLyBDYWxsIHRoaXMgZnVuY3Rpb24gdG8gcGFyc2UgYW4gb3B0aW9uYWwgdHlwZSBvciB2b2lkIGFmdGVyIFt0b2tlbl0uCiAgLy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxsIHRoZSBhcHByb3ByaWF0ZSBldmVudCBtZXRob2RzIG9uIHRoZSBbUGFyc2VyXSdzCiAgLy8vIGxpc3RlbmVyIHRvIGhhbmRsZSB0aGUgdHlwZS4gVGhpcyBtYXkgbW9kaWZ5IHRoZSB0b2tlbiBzdHJlYW0KICAvLy8gd2hlbiBwYXJzaW5nIGA+PmAgb3IgYD4+PmAgb3IgYD4+Pj1gIGluIHZhbGlkIGNvZGUgb3IgZHVyaW5nIHJlY292ZXJ5LgogIFRva2VuIHBhcnNlVHlwZShUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcik7CgogIC8vLyBDYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCB0aGUgW3Rva2VuXSBiZWZvcmUgdGhlIHR5cGUgdG8gb2J0YWluCiAgLy8vIHRoZSBsYXN0IHRva2VuIGluIHRoZSB0eXBlLiBJZiB0aGVyZSBpcyBubyB0eXBlLCB0aGVuIHRoaXMgbWV0aG9kCiAgLy8vIHdpbGwgcmV0dXJuIFt0b2tlbl0uIFRoaXMgZG9lcyBub3QgbW9kaWZ5IHRoZSB0b2tlbiBzdHJlYW0uCiAgVG9rZW4gc2tpcFR5cGUoVG9rZW4gdG9rZW4pOwp9CgovLy8gW1R5cGVQYXJhbU9yQXJnSW5mb10gcHJvdmlkZXMgaW5mb3JtYXRpb24gY29sbGVjdGVkIGJ5Ci8vLyBbY29tcHV0ZVR5cGVQYXJhbU9yQXJnXSBhYm91dCBhIHBhcnRpY3VsYXIgZ3JvdXAgb2YgdHlwZSBhcmd1bWVudHMKLy8vIG9yIHR5cGUgcGFyYW1ldGVycy4KYWJzdHJhY3QgY2xhc3MgVHlwZVBhcmFtT3JBcmdJbmZvIHsKICBjb25zdCBUeXBlUGFyYW1PckFyZ0luZm8oKTsKCiAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIHJlY2VpdmVyIHJlcHJlc2VudHMgYSBzaW5nbGUgdHlwZSBhcmd1bWVudAogIGJvb2wgZ2V0IGlzU2ltcGxlVHlwZUFyZ3VtZW50ID0+IGZhbHNlOwoKICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMKICBpbnQgZ2V0IHR5cGVBcmd1bWVudENvdW50OwoKICAvLy8gUmV0dXJuIHRoZSBzaW1wbGUgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzaW1wbGUgdHlwZSBhcmd1bWVudAogIC8vLyBvciB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhpcyBpcyBub3QgYSBzaW1wbGUgdHlwZSBhcmd1bWVudC4KICBUeXBlSW5mbyBnZXQgdHlwZUluZm8gewogICAgdGhyb3cgIkludGVybmFsIGVycm9yOiAkcnVudGltZVR5cGUgaXMgbm90IGEgU2ltcGxlVHlwZUFyZ3VtZW50LiI7CiAgfQoKICAvLy8gQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHBhcnNlIG9wdGlvbmFsIHR5cGUgYXJndW1lbnRzIGFmdGVyIFt0b2tlbl0uCiAgLy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxsIHRoZSBhcHByb3ByaWF0ZSBldmVudCBtZXRob2RzIG9uIHRoZSBbUGFyc2VyXSdzCiAgLy8vIGxpc3RlbmVyIHRvIGhhbmRsZSB0aGUgYXJndW1lbnRzLiBUaGlzIG1heSBtb2RpZnkgdGhlIHRva2VuIHN0cmVhbQogIC8vLyB3aGVuIHBhcnNpbmcgYD4+YCBvciBgPj4+YCBvciBgPj4+PWAgaW4gdmFsaWQgY29kZSBvciBkdXJpbmcgcmVjb3ZlcnkuCiAgVG9rZW4gcGFyc2VBcmd1bWVudHMoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpOwoKICAvLy8gQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHBhcnNlIG9wdGlvbmFsIHR5cGUgcGFyYW1ldGVycwogIC8vLyAoYWxzbyBrbm93biBhcyB0eXBlIHZhcmlhYmxlcykgYWZ0ZXIgW3Rva2VuXS4KICAvLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGwgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IG1ldGhvZHMgb24gdGhlIFtQYXJzZXJdJ3MKICAvLy8gbGlzdGVuZXIgdG8gaGFuZGxlIHRoZSBwYXJhbWV0ZXJzLiBUaGlzIG1heSBtb2RpZnkgdGhlIHRva2VuIHN0cmVhbQogIC8vLyB3aGVuIHBhcnNpbmcgYD4+YCBvciBgPj4+YCBvciBgPj4+PWAgaW4gdmFsaWQgY29kZSBvciBkdXJpbmcgcmVjb3ZlcnkuCiAgVG9rZW4gcGFyc2VWYXJpYWJsZXMoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpOwoKICAvLy8gQ2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIFt0b2tlbl0gYmVmb3JlIHRoZSB0eXBlIHZhciB0byBvYnRhaW4KICAvLy8gdGhlIGxhc3QgdG9rZW4gaW4gdGhlIHR5cGUgdmFyLiBJZiB0aGVyZSBpcyBubyB0eXBlIHZhciwgdGhlbiB0aGlzIG1ldGhvZAogIC8vLyB3aWxsIHJldHVybiBbdG9rZW5dLiBUaGlzIGRvZXMgbm90IG1vZGlmeSB0aGUgdG9rZW4gc3RyZWFtLgogIFRva2VuIHNraXAoVG9rZW4gdG9rZW4pOwp9CgovLy8gW05vVHlwZV0gaXMgYSBzcGVjaWFsaXplZCBbVHlwZUluZm9dIHJldHVybmVkIGJ5IFtjb21wdXRlVHlwZV0gd2hlbgovLy8gdGhlcmUgaXMgbm8gdHlwZSBpbmZvcm1hdGlvbiBpbiB0aGUgc291cmNlLgpjb25zdCBUeXBlSW5mbyBub1R5cGUgPSBjb25zdCBOb1R5cGUoKTsKCi8vLyBbTm9UeXBlUGFyYW1PckFyZ10gaXMgYSBzcGVjaWFsaXplZCBbVHlwZVBhcmFtT3JBcmdJbmZvXSByZXR1cm5lZCBieQovLy8gW2NvbXB1dGVUeXBlUGFyYW1PckFyZ10gd2hlbiBubyB0eXBlIHBhcmFtZXRlcnMgb3IgYXJndW1lbnRzIGFyZSBmb3VuZC4KY29uc3QgVHlwZVBhcmFtT3JBcmdJbmZvIG5vVHlwZVBhcmFtT3JBcmcgPSBjb25zdCBOb1R5cGVQYXJhbU9yQXJnKCk7CgovLy8gW1ZvaWRUeXBlXSBpcyBhIHNwZWNpYWxpemVkIFtUeXBlSW5mb10gcmV0dXJuZWQgYnkgW2NvbXB1dGVUeXBlXSB3aGVuCi8vLyBgdm9pZGAgYXBwZWFycyBpbiB0aGUgc291cmNlLgpjb25zdCBUeXBlSW5mbyB2b2lkVHlwZSA9IGNvbnN0IFZvaWRUeXBlKCk7Cgpib29sIGlzR2VuZXJhbGl6ZWRGdW5jdGlvblR5cGUoVG9rZW4gdG9rZW4pIHsKICByZXR1cm4gb3B0aW9uYWwoJ0Z1bmN0aW9uJywgdG9rZW4pICYmCiAgICAgIChvcHRpb25hbCgnPCcsIHRva2VuLm5leHQpIHx8IG9wdGlvbmFsKCcoJywgdG9rZW4ubmV4dCkpOwp9Cgpib29sIGlzVmFsaWRUeXBlUmVmZXJlbmNlKFRva2VuIHRva2VuKSB7CiAgaW50IGtpbmQgPSB0b2tlbi5raW5kOwogIGlmIChJREVOVElGSUVSX1RPS0VOID09IGtpbmQpIHJldHVybiB0cnVlOwogIGlmIChLRVlXT1JEX1RPS0VOID09IGtpbmQpIHsKICAgIFRva2VuVHlwZSB0eXBlID0gdG9rZW4udHlwZTsKICAgIFN0cmluZyB2YWx1ZSA9IHR5cGUubGV4ZW1lOwogICAgcmV0dXJuIHR5cGUuaXNQc2V1ZG8gfHwKICAgICAgICAodHlwZS5pc0J1aWx0SW4gJiYgb3B0aW9uYWwoJy4nLCB0b2tlbi5uZXh0KSkgfHwKICAgICAgICAoaWRlbnRpY2FsKHZhbHVlLCAnZHluYW1pYycpKSB8fAogICAgICAgIChpZGVudGljYWwodmFsdWUsICd2b2lkJykpOwogIH0KICByZXR1cm4gZmFsc2U7Cn0KCi8vLyBDYWxsZWQgYnkgdGhlIHBhcnNlciB0byBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgYSBwb3NzaWJsZSB0eXBlIHJlZmVyZW5jZQovLy8gdGhhdCBmb2xsb3dzIFt0b2tlbl0uIFRoaXMgZG9lcyBub3QgbW9kaWZ5IHRoZSB0b2tlbiBzdHJlYW0uCi8vLwovLy8gSWYgW2luRGVjbGFyYXRpb25dIGlzIGB0cnVlYCwgdGhlbiB0aGlzIHdpbGwgbW9yZSBhZ2dyZXNzaXZlbHkgcmVjb3ZlcgovLy8gZ2l2ZW4gdW5iYWxhbmNlZCBgPGAgYD5gIGFuZCBpbnZhbGlkIHBhcmFtZXRlcnMgb3IgYXJndW1lbnRzLgpUeXBlSW5mbyBjb21wdXRlVHlwZShmaW5hbCBUb2tlbiB0b2tlbiwgYm9vbCByZXF1aXJlZCwKICAgIFtib29sIGluRGVjbGFyYXRpb24gPSBmYWxzZV0pIHsKICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICBpZiAoIWlzVmFsaWRUeXBlUmVmZXJlbmNlKG5leHQpKSB7CiAgICBpZiAobmV4dC50eXBlLmlzQnVpbHRJbikgewogICAgICBUeXBlUGFyYW1PckFyZ0luZm8gdHlwZVBhcmFtT3JBcmcgPQogICAgICAgICAgY29tcHV0ZVR5cGVQYXJhbU9yQXJnKG5leHQsIGluRGVjbGFyYXRpb24pOwogICAgICBpZiAodHlwZVBhcmFtT3JBcmcgIT0gbm9UeXBlUGFyYW1PckFyZykgewogICAgICAgIC8vIFJlY292ZXJ5OiBidWlsdC1pbiBgPGAgLi4uIGA+YAogICAgICAgIGlmIChyZXF1aXJlZCB8fCBsb29rc0xpa2VOYW1lKHR5cGVQYXJhbU9yQXJnLnNraXAobmV4dCkubmV4dCkpIHsKICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleFR5cGVJbmZvKHRva2VuLCB0eXBlUGFyYW1PckFyZykKICAgICAgICAgICAgICAuY29tcHV0ZUJ1aWx0aW5PclZhckFzVHlwZShyZXF1aXJlZCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHJlcXVpcmVkIHx8IGlzR2VuZXJhbGl6ZWRGdW5jdGlvblR5cGUobmV4dC5uZXh0KSkgewogICAgICAgIFN0cmluZyB2YWx1ZSA9IG5leHQuc3RyaW5nVmFsdWU7CiAgICAgICAgaWYgKCghaWRlbnRpY2FsKCdnZXQnLCB2YWx1ZSkgJiYKICAgICAgICAgICAgIWlkZW50aWNhbCgnc2V0JywgdmFsdWUpICYmCiAgICAgICAgICAgICFpZGVudGljYWwoJ2ZhY3RvcnknLCB2YWx1ZSkgJiYKICAgICAgICAgICAgIWlkZW50aWNhbCgnb3BlcmF0b3InLCB2YWx1ZSkgJiYKICAgICAgICAgICAgIShpZGVudGljYWwoJ3R5cGVkZWYnLCB2YWx1ZSkgJiYgbmV4dC5uZXh0LmlzSWRlbnRpZmllcikpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXhUeXBlSW5mbyh0b2tlbiwgdHlwZVBhcmFtT3JBcmcpCiAgICAgICAgICAgICAgLmNvbXB1dGVCdWlsdGluT3JWYXJBc1R5cGUocmVxdWlyZWQpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmIChyZXF1aXJlZCkgewogICAgICAvLyBSZWNvdmVyeQogICAgICBpZiAob3B0aW9uYWwoJy4nLCBuZXh0KSkgewogICAgICAgIC8vIExvb2tzIGxpa2UgcHJlZml4ZWQgdHlwZSBtaXNzaW5nIHRoZSBwcmVmaXgKICAgICAgICByZXR1cm4gbmV3IENvbXBsZXhUeXBlSW5mbygKICAgICAgICAgICAgICAgIHRva2VuLCBjb21wdXRlVHlwZVBhcmFtT3JBcmcobmV4dCwgaW5EZWNsYXJhdGlvbikpCiAgICAgICAgICAgIC5jb21wdXRlUHJlZml4ZWRUeXBlKHJlcXVpcmVkKTsKICAgICAgfSBlbHNlIGlmIChvcHRpb25hbCgndmFyJywgbmV4dCkgJiYKICAgICAgICAgIGlzT25lT2YobmV4dC5uZXh0LCBjb25zdCBbJzwnLCAnLCcsICc+J10pKSB7CiAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4VHlwZUluZm8oCiAgICAgICAgICAgICAgICB0b2tlbiwgY29tcHV0ZVR5cGVQYXJhbU9yQXJnKG5leHQsIGluRGVjbGFyYXRpb24pKQogICAgICAgICAgICAuY29tcHV0ZUJ1aWx0aW5PclZhckFzVHlwZShyZXF1aXJlZCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBub1R5cGU7CiAgfQoKICBpZiAob3B0aW9uYWwoJ3ZvaWQnLCBuZXh0KSkgewogICAgbmV4dCA9IG5leHQubmV4dDsKICAgIGlmIChpc0dlbmVyYWxpemVkRnVuY3Rpb25UeXBlKG5leHQpKSB7CiAgICAgIC8vIGB2b2lkYCBgRnVuY3Rpb25gIC4uLgogICAgICByZXR1cm4gbmV3IENvbXBsZXhUeXBlSW5mbyh0b2tlbiwgbm9UeXBlUGFyYW1PckFyZykKICAgICAgICAgIC5jb21wdXRlVm9pZEdGVChyZXF1aXJlZCk7CiAgICB9CiAgICAvLyBgdm9pZGAKICAgIHJldHVybiB2b2lkVHlwZTsKICB9CgogIGlmIChpc0dlbmVyYWxpemVkRnVuY3Rpb25UeXBlKG5leHQpKSB7CiAgICAvLyBgRnVuY3Rpb25gIC4uLgogICAgcmV0dXJuIG5ldyBDb21wbGV4VHlwZUluZm8odG9rZW4sIG5vVHlwZVBhcmFtT3JBcmcpCiAgICAgICAgLmNvbXB1dGVOb1R5cGVHRlQodG9rZW4sIHJlcXVpcmVkKTsKICB9CgogIC8vIFdlJ3ZlIHNlZW4gYW4gaWRlbnRpZmllci4KCiAgVHlwZVBhcmFtT3JBcmdJbmZvIHR5cGVQYXJhbU9yQXJnID0KICAgICAgY29tcHV0ZVR5cGVQYXJhbU9yQXJnKG5leHQsIGluRGVjbGFyYXRpb24pOwogIGlmICh0eXBlUGFyYW1PckFyZyAhPSBub1R5cGVQYXJhbU9yQXJnKSB7CiAgICBpZiAodHlwZVBhcmFtT3JBcmcuaXNTaW1wbGVUeXBlQXJndW1lbnQpIHsKICAgICAgLy8gV2UndmUgc2VlbiBpZGVudGlmaWVyIGA8YCBpZGVudGlmaWVyIGA+YAogICAgICBuZXh0ID0gdHlwZVBhcmFtT3JBcmcuc2tpcChuZXh0KS5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJz8nLCBuZXh0KSkgewogICAgICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICAgICAgaWYgKCFpc0dlbmVyYWxpemVkRnVuY3Rpb25UeXBlKG5leHQpKSB7CiAgICAgICAgICBpZiAoKHJlcXVpcmVkIHx8IGxvb2tzTGlrZU5hbWUobmV4dCkpICYmCiAgICAgICAgICAgICAgdHlwZVBhcmFtT3JBcmcgPT0gc2ltcGxlVHlwZUFyZ3VtZW50MSkgewogICAgICAgICAgICAvLyBpZGVudGlmaWVyIGA8YCBpZGVudGlmaWVyIGA+YCBgP2AgaWRlbnRpZmllcgogICAgICAgICAgICByZXR1cm4gc2ltcGxlTnVsbGFibGVUeXBlV2l0aDFBcmd1bWVudDsKICAgICAgICAgIH0KICAgICAgICAgIC8vIGlkZW50aWZpZXIgYDxgIGlkZW50aWZpZXIgYD5gIGA/YCBub24taWRlbnRpZmllcgogICAgICAgICAgcmV0dXJuIG5vVHlwZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoIWlzR2VuZXJhbGl6ZWRGdW5jdGlvblR5cGUobmV4dCkpIHsKICAgICAgICBpZiAocmVxdWlyZWQgfHwgbG9va3NMaWtlTmFtZShuZXh0KSkgewogICAgICAgICAgLy8gaWRlbnRpZmllciBgPGAgaWRlbnRpZmllciBgPmAgaWRlbnRpZmllcgogICAgICAgICAgcmV0dXJuIHR5cGVQYXJhbU9yQXJnLnR5cGVJbmZvOwogICAgICAgIH0KICAgICAgICAvLyBpZGVudGlmaWVyIGA8YCBpZGVudGlmaWVyIGA+YCBub24taWRlbnRpZmllcgogICAgICAgIHJldHVybiBub1R5cGU7CiAgICAgIH0KICAgIH0KICAgIC8vIFRPRE8oZGFucnViZWwpOiBDb25zaWRlciBhZGRpbmcgYSBjb25zdCBmb3IKICAgIC8vIGlkZW50aWZpZXIgYDxgIGlkZW50aWZpZXIgYCxgIGlkZW50aWZpZXIgYD5gCiAgICAvLyBpZiB0aGF0IHByb3ZlcyB0byBiZSBhIGNvbW1vbiBjYXNlLgoKICAgIC8vIGlkZW50aWZpZXIgYDxgIC4uLiBgPmAKICAgIHJldHVybiBuZXcgQ29tcGxleFR5cGVJbmZvKHRva2VuLCB0eXBlUGFyYW1PckFyZykKICAgICAgICAuY29tcHV0ZVNpbXBsZVdpdGhUeXBlQXJndW1lbnRzKHJlcXVpcmVkKTsKICB9CgogIGFzc2VydCh0eXBlUGFyYW1PckFyZyA9PSBub1R5cGVQYXJhbU9yQXJnKTsKICBuZXh0ID0gbmV4dC5uZXh0OwogIGlmIChvcHRpb25hbCgnLicsIG5leHQpKSB7CiAgICBuZXh0ID0gbmV4dC5uZXh0OwogICAgaWYgKGlzVmFsaWRUeXBlUmVmZXJlbmNlKG5leHQpKSB7CiAgICAgIC8vIFdlJ3ZlIHNlZW4gaWRlbnRpZmllciBgLmAgaWRlbnRpZmllcgogICAgICB0eXBlUGFyYW1PckFyZyA9IGNvbXB1dGVUeXBlUGFyYW1PckFyZyhuZXh0LCBpbkRlY2xhcmF0aW9uKTsKICAgICAgbmV4dCA9IG5leHQubmV4dDsKICAgICAgaWYgKHR5cGVQYXJhbU9yQXJnID09IG5vVHlwZVBhcmFtT3JBcmcpIHsKICAgICAgICBpZiAob3B0aW9uYWwoJz8nLCBuZXh0KSkgewogICAgICAgICAgbmV4dCA9IG5leHQubmV4dDsKICAgICAgICAgIGlmICghaXNHZW5lcmFsaXplZEZ1bmN0aW9uVHlwZShuZXh0KSkgewogICAgICAgICAgICBpZiAocmVxdWlyZWQgfHwgbG9va3NMaWtlTmFtZShuZXh0KSkgewogICAgICAgICAgICAgIC8vIGlkZW50aWZpZXIgYC5gIGlkZW50aWZpZXIgYD9gIGlkZW50aWZpZXIKICAgICAgICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogY29uc2lkZXIgYWRkaW5nIFByZWZpeGVkTnVsbGFibGVUeXBlCiAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIGJ1aWxkIGNvbXBsZXggdHlwZQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIC8vIGlkZW50aWZpZXIgYC5gIGlkZW50aWZpZXIgYD9gIG5vbi1pZGVudGlmaWVyCiAgICAgICAgICAgICAgcmV0dXJuIG5vVHlwZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoIWlzR2VuZXJhbGl6ZWRGdW5jdGlvblR5cGUobmV4dCkpIHsKICAgICAgICAgICAgaWYgKHJlcXVpcmVkIHx8IGxvb2tzTGlrZU5hbWUobmV4dCkpIHsKICAgICAgICAgICAgICAvLyBpZGVudGlmaWVyIGAuYCBpZGVudGlmaWVyIGlkZW50aWZpZXIKICAgICAgICAgICAgICByZXR1cm4gcHJlZml4ZWRUeXBlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIC8vIGlkZW50aWZpZXIgYC5gIGlkZW50aWZpZXIgbm9uLWlkZW50aWZpZXIKICAgICAgICAgICAgICByZXR1cm4gbm9UeXBlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIGlkZW50aWZpZXIgYC5gIGlkZW50aWZpZXIKICAgICAgcmV0dXJuIG5ldyBDb21wbGV4VHlwZUluZm8odG9rZW4sIHR5cGVQYXJhbU9yQXJnKQogICAgICAgICAgLmNvbXB1dGVQcmVmaXhlZFR5cGUocmVxdWlyZWQpOwogICAgfQogICAgLy8gaWRlbnRpZmllciBgLmAgbm9uLWlkZW50aWZpZXIKICAgIGlmIChyZXF1aXJlZCkgewogICAgICB0eXBlUGFyYW1PckFyZyA9IGNvbXB1dGVUeXBlUGFyYW1PckFyZyh0b2tlbi5uZXh0Lm5leHQsIGluRGVjbGFyYXRpb24pOwogICAgICByZXR1cm4gbmV3IENvbXBsZXhUeXBlSW5mbyh0b2tlbiwgdHlwZVBhcmFtT3JBcmcpCiAgICAgICAgICAuY29tcHV0ZVByZWZpeGVkVHlwZShyZXF1aXJlZCk7CiAgICB9CiAgICByZXR1cm4gbm9UeXBlOwogIH0KCiAgYXNzZXJ0KHR5cGVQYXJhbU9yQXJnID09IG5vVHlwZVBhcmFtT3JBcmcpOwogIGlmIChpc0dlbmVyYWxpemVkRnVuY3Rpb25UeXBlKG5leHQpKSB7CiAgICAvLyBpZGVudGlmaWVyIGBGdW5jdGlvbmAKICAgIHJldHVybiBuZXcgQ29tcGxleFR5cGVJbmZvKHRva2VuLCBub1R5cGVQYXJhbU9yQXJnKQogICAgICAgIC5jb21wdXRlSWRlbnRpZmllckdGVChyZXF1aXJlZCk7CiAgfQoKICBpZiAob3B0aW9uYWwoJz8nLCBuZXh0KSkgewogICAgbmV4dCA9IG5leHQubmV4dDsKICAgIGlmIChpc0dlbmVyYWxpemVkRnVuY3Rpb25UeXBlKG5leHQpKSB7CiAgICAgIC8vIGlkZW50aWZpZXIgYD9gIEZ1bmN0aW9uIGAoYAogICAgICByZXR1cm4gbmV3IENvbXBsZXhUeXBlSW5mbyh0b2tlbiwgbm9UeXBlUGFyYW1PckFyZykKICAgICAgICAgIC5jb21wdXRlSWRlbnRpZmllclF1ZXN0aW9uR0ZUKHJlcXVpcmVkKTsKICAgIH0gZWxzZSBpZiAocmVxdWlyZWQgfHwgbG9va3NMaWtlTmFtZShuZXh0KSkgewogICAgICAvLyBpZGVudGlmaWVyIGA/YAogICAgICByZXR1cm4gc2ltcGxlTnVsbGFibGVUeXBlOwogICAgfQogIH0gZWxzZSBpZiAocmVxdWlyZWQgfHwgbG9va3NMaWtlTmFtZShuZXh0KSkgewogICAgLy8gaWRlbnRpZmllciBpZGVudGlmaWVyCiAgICByZXR1cm4gc2ltcGxlVHlwZTsKICB9CiAgcmV0dXJuIG5vVHlwZTsKfQoKLy8vIENhbGxlZCBieSB0aGUgcGFyc2VyIHRvIG9idGFpbiBpbmZvcm1hdGlvbiBhYm91dCBhIHBvc3NpYmxlIGdyb3VwIG9mIHR5cGUKLy8vIHBhcmFtZXRlcnMgb3IgdHlwZSBhcmd1bWVudHMgdGhhdCBmb2xsb3cgW3Rva2VuXS4KLy8vIFRoaXMgZG9lcyBub3QgbW9kaWZ5IHRoZSB0b2tlbiBzdHJlYW0uCi8vLwovLy8gSWYgW2luRGVjbGFyYXRpb25dIGlzIGB0cnVlYCwgdGhlbiB0aGlzIHdpbGwgbW9yZSBhZ2dyZXNzaXZlbHkgcmVjb3ZlcgovLy8gZ2l2ZW4gdW5iYWxhbmNlZCBgPGAgYD5gIGFuZCBpbnZhbGlkIHBhcmFtZXRlcnMgb3IgYXJndW1lbnRzLgpUeXBlUGFyYW1PckFyZ0luZm8gY29tcHV0ZVR5cGVQYXJhbU9yQXJnKFRva2VuIHRva2VuLAogICAgW2Jvb2wgaW5EZWNsYXJhdGlvbiA9IGZhbHNlXSkgewogIFRva2VuIGJlZ2luR3JvdXAgPSB0b2tlbi5uZXh0OwogIGlmICghb3B0aW9uYWwoJzwnLCBiZWdpbkdyb3VwKSkgewogICAgcmV0dXJuIG5vVHlwZVBhcmFtT3JBcmc7CiAgfQoKICAvLyBpZGVudGlmaWVyIGA8YCBgdm9pZGAgYD5gIGFuZCBgPGAgYGR5bmFtaWNgIGA+YAogIC8vIGFyZSBoYW5kbGVkIGJ5IENvbXBsZXhUeXBlSW5mby4KICBUb2tlbiBuZXh0ID0gYmVnaW5Hcm91cC5uZXh0OwogIGlmICgobmV4dC5raW5kID09IElERU5USUZJRVJfVE9LRU4gfHwgbmV4dC50eXBlLmlzUHNldWRvKSkgewogICAgaWYgKG9wdGlvbmFsKCc+JywgbmV4dC5uZXh0KSkgewogICAgICByZXR1cm4gc2ltcGxlVHlwZUFyZ3VtZW50MTsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJz4+JywgbmV4dC5uZXh0KSkgewogICAgICByZXR1cm4gc2ltcGxlVHlwZUFyZ3VtZW50MUd0R3Q7CiAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCc+PScsIG5leHQubmV4dCkpIHsKICAgICAgcmV0dXJuIHNpbXBsZVR5cGVBcmd1bWVudDFHdEVxOwogICAgfQogIH0gZWxzZSBpZiAob3B0aW9uYWwoJygnLCBuZXh0KSkgewogICAgcmV0dXJuIG5vVHlwZVBhcmFtT3JBcmc7CiAgfQoKICAvLyBUT0RPKGRhbnJ1YmVsKTogQ29uc2lkZXIgYWRkaW5nIGFkZGl0aW9uYWwgY29uc3QgZm9yIGNvbW1vbiBzaXR1YXRpb25zLgogIHJldHVybiBuZXcgQ29tcGxleFR5cGVQYXJhbU9yQXJnSW5mbyh0b2tlbiwgaW5EZWNsYXJhdGlvbikuY29tcHV0ZSgpOwp9CgovLy8gQ2FsbGVkIGJ5IHRoZSBwYXJzZXIgdG8gb2J0YWluIGluZm9ybWF0aW9uIGFib3V0IGEgcG9zc2libGUgZ3JvdXAgb2YgdHlwZQovLy8gdHlwZSBhcmd1bWVudHMgdGhhdCBmb2xsb3cgW3Rva2VuXSBhbmQgdGhhdCBhcmUgZm9sbG93ZWQgYnkgJygnLgovLy8gUmV0dXJucyB0aGUgdHlwZSBhcmd1bWVudHMgaWYgW3Rva2VuXSBtYXRjaGVzICc8JyB0eXBlICgnLCcgdHlwZSkqICc+JyAnKCcsCi8vLyBhbmQgb3RoZXJ3aXNlIHJldHVybnMgW25vVHlwZVBhcmFtT3JBcmddLiBUaGUgZmluYWwgJygnIGlzIG5vdCBwYXJ0IG9mIHRoZQovLy8gZ3JhbW1hciBjb25zdHJ1Y3QgYHR5cGVBcmd1bWVudHNgLCBidXQgaXQgaXMgcmVxdWlyZWQgaGVyZSBzdWNoIHRoYXQgdHlwZQovLy8gYXJndW1lbnRzIGluIGdlbmVyaWMgbWV0aG9kIGludm9jYXRpb25zIGNhbiBiZSByZWNvZ25pemVkLCBhbmQgYXMgZmV3IGFzCi8vLyBwb3NzaWJsZSBvdGhlciBjb25zdHJ1Y3RzIHdpbGwgcGFzcyAoZS5nLiwgJ2EgPCBDLCBEID4gMycpLgpUeXBlUGFyYW1PckFyZ0luZm8gY29tcHV0ZU1ldGhvZFR5cGVBcmd1bWVudHMoVG9rZW4gdG9rZW4pIHsKICBUeXBlUGFyYW1PckFyZ0luZm8gdHlwZUFyZyA9IGNvbXB1dGVUeXBlUGFyYW1PckFyZyh0b2tlbik7CiAgcmV0dXJuIG9wdGlvbmFsKCcoJywgdHlwZUFyZy5za2lwKHRva2VuKS5uZXh0KSA/IHR5cGVBcmcgOiBub1R5cGVQYXJhbU9yQXJnOwp9CoFbAE5OPAEgATkBTwEiAR4BKwE/JxpKSh4BSUZIRR4BNhcBUU5LTTI3AU5OS00yNgFNTkRONgFKTkRNLwFESEIfAgE7RxgkHgFGKgEqHQFHQxpHBAFJTklNNAE7NE5KTTQBSFBCGwIBSDAoAUlMRgFKIiwBLihAAgEpGS0fISAcOSkkBBACAU9BBEtCNyQbJR8qNjAqSTw0CkUpKSgsLUk8NAoIGxIhNyRDLCo3JEMyCAYTBAEgFisfOiUGDhUEASkWOCwEAR8BJjIsLzItIRowMzc8NAw+GQo1LzYqCjgXCAYzNCsBHjYzBAEuFB0WJi5DGDAjHDIzOkY0FT4dDgwRMjM2IxU6HQ4MCggjOCoGJRROOCoGEwQBLikdOCkEAR0WKyU6MzIYIQYwHRcEEQIBTjYrBEtCNiQhJB0EATUlID8kIiwmLCYGJB0EAU1IAgFORVBPTk1APT1PAgExcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci90eXBlX2luZm8uZGFydEhzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvcGFyc2VyL2lkZW50aWZpZXJfY29udGV4dF9pbXBsLmRhcnTAAI7kLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vLi4vc2Nhbm5lci90b2tlbi5kYXJ0JyBzaG93IFRva2VuOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JyBhcyBmYXN0YTsKCmltcG9ydCAnLi4vc2Nhbm5lci90b2tlbl9jb25zdGFudHMuZGFydCcgc2hvdyBJREVOVElGSUVSX1RPS0VOOwoKaW1wb3J0ICdpZGVudGlmaWVyX2NvbnRleHQuZGFydCc7CgppbXBvcnQgJ3BhcnNlci5kYXJ0JyBzaG93IFBhcnNlcjsKCmltcG9ydCAndHlwZV9pbmZvLmRhcnQnIHNob3cgaXNWYWxpZFR5cGVSZWZlcmVuY2U7CgppbXBvcnQgJ3V0aWwuZGFydCcgc2hvdyBpc09uZU9mT3JFb2YsIG9wdGlvbmFsOwoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQuY2F0Y2hQYXJhbWV0ZXJdLgpjbGFzcyBDYXRjaFBhcmFtZXRlcklkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGNvbnN0IENhdGNoUGFyYW1ldGVySWRlbnRpZmllckNvbnRleHQoKSA6IHN1cGVyKCdjYXRjaFBhcmFtZXRlcicpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBpZiAoaWRlbnRpZmllci5pc0lkZW50aWZpZXIpIHsKICAgICAgY2hlY2tBc3luY0F3YWl0WWllbGRBc0lkZW50aWZpZXIoaWRlbnRpZmllciwgcGFyc2VyKTsKICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKGlkZW50aWZpZXIsIGZhc3RhLm1lc3NhZ2VDYXRjaFN5bnRheCk7CiAgICBpZiAobG9va3NMaWtlU3RhdGVtZW50U3RhcnQoaWRlbnRpZmllcikgfHwKICAgICAgICBpc09uZU9mT3JFb2YoaWRlbnRpZmllciwgY29uc3QgWycsJywgJyknXSkpIHsKICAgICAgcmV0dXJuIHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuKTsKICAgIH0gZWxzZSBpZiAoIWlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgIC8vIFdoZW4gaW4gZG91YnQsIGNvbnN1bWUgdGhlIHRva2VuIHRvIGVuc3VyZSB3ZSBtYWtlIHByb2dyZXNzCiAgICAgIC8vIGJ1dCBpbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciB0byBzYXRpc2Z5IGxpc3RlbmVycy4KICAgICAgcmV0dXJuIHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIpOwogICAgfQogICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgfQp9CgovLy8gU2VlIFtJZGVudGlmaWVyQ29udGV4dC5jbGFzc09yTWl4aW5EZWNsYXJhdGlvbl0uCmNsYXNzIENsYXNzT3JNaXhpbklkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGNvbnN0IENsYXNzT3JNaXhpbklkZW50aWZpZXJDb250ZXh0KCkKICAgICAgOiBzdXBlcignY2xhc3NPck1peGluRGVjbGFyYXRpb24nLAogICAgICAgICAgICBpbkRlY2xhcmF0aW9uOiB0cnVlLCBpc0J1aWx0SW5JZGVudGlmaWVyQWxsb3dlZDogZmFsc2UpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBpZiAoaWRlbnRpZmllci50eXBlLmlzUHNldWRvKSB7CiAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBpZiAobG9va3NMaWtlU3RhcnRPZk5leHRUb3BMZXZlbERlY2xhcmF0aW9uKGlkZW50aWZpZXIpIHx8CiAgICAgICAgaXNPbmVPZk9yRW9mKAogICAgICAgICAgICBpZGVudGlmaWVyLCBjb25zdCBbJzwnLCAneycsICdleHRlbmRzJywgJ3dpdGgnLCAnaW1wbGVtZW50cyddKSkgewogICAgICBpZGVudGlmaWVyID0gcGFyc2VyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4sIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKGlkZW50aWZpZXIpKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpZmllci50eXBlLmlzQnVpbHRJbikgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIGlkZW50aWZpZXIsIGZhc3RhLnRlbXBsYXRlQnVpbHRJbklkZW50aWZpZXJJbkRlY2xhcmF0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgICBpZiAoIWlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gV2hlbiBpbiBkb3VidCwgY29uc3VtZSB0aGUgdG9rZW4gdG8gZW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MKICAgICAgICAvLyBidXQgaW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaWRlbnRpZmllcjsKICB9Cn0KCi8vLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0LmNvbWJpbmF0b3JdLgpjbGFzcyBDb21iaW5hdG9ySWRlbnRpZmllckNvbnRleHQgZXh0ZW5kcyBJZGVudGlmaWVyQ29udGV4dCB7CiAgY29uc3QgQ29tYmluYXRvcklkZW50aWZpZXJDb250ZXh0KCkgOiBzdXBlcignY29tYmluYXRvcicpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBjb25zdCBmb2xsb3dpbmdWYWx1ZXMgPSBjb25zdCBbJzsnLCAnLCcsICdpZicsICdhcycsICdzaG93JywgJ2hpZGUnXTsKCiAgICBpZiAoaWRlbnRpZmllci5pc0lkZW50aWZpZXIpIHsKICAgICAgaWYgKCFsb29rc0xpa2VTdGFydE9mTmV4dFRvcExldmVsRGVjbGFyYXRpb24oaWRlbnRpZmllcikgfHwKICAgICAgICAgIGlzT25lT2ZPckVvZihpZGVudGlmaWVyLm5leHQsIGZvbGxvd2luZ1ZhbHVlcykpIHsKICAgICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgICAgfQogICAgICAvLyBBbHRob3VnaCB0aGlzIGlzIGEgdmFsaWQgaWRlbnRpZmllciBuYW1lLCB0aGUgaW1wb3J0IGRlY2xhcmF0aW9uCiAgICAgIC8vIGlzIGludmFsaWQgYW5kIHRoaXMgbG9va3MgbGlrZSB0aGUgc3RhcnQgb2YgdGhlIG5leHQgZGVjbGFyYXRpb24uCiAgICAgIC8vIEluIHRoaXMgc2l0dWF0aW9uLCBmYWxsIHRocm91Z2ggdG8gaW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIuCiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIGlmIChpc09uZU9mT3JFb2YoaWRlbnRpZmllciwgZm9sbG93aW5nVmFsdWVzKSB8fAogICAgICAgIGxvb2tzTGlrZVN0YXJ0T2ZOZXh0VG9wTGV2ZWxEZWNsYXJhdGlvbihpZGVudGlmaWVyKSkgewogICAgICBpZGVudGlmaWVyID0gcGFyc2VyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4sIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKGlkZW50aWZpZXIpKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgICBpZiAoIWlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gV2hlbiBpbiBkb3VidCwgY29uc3VtZSB0aGUgdG9rZW4gdG8gZW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MKICAgICAgICAvLyBidXQgaW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaWRlbnRpZmllcjsKICB9Cn0KCi8vLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0LmNvbnN0cnVjdG9yUmVmZXJlbmNlXQovLy8gYW5kIFtJZGVudGlmaWVyQ29udGV4dC5jb25zdHJ1Y3RvclJlZmVyZW5jZUNvbnRpbnVhdGlvbl0KLy8vIGFuZCBbSWRlbnRpZmllckNvbnRleHQuY29uc3RydWN0b3JSZWZlcmVuY2VDb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHNdLgpjbGFzcyBDb25zdHJ1Y3RvclJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGNvbnN0IENvbnN0cnVjdG9yUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQoKQogICAgICA6IHN1cGVyKCdjb25zdHJ1Y3RvclJlZmVyZW5jZScsIGlzU2NvcGVSZWZlcmVuY2U6IHRydWUpOwoKICBjb25zdCBDb25zdHJ1Y3RvclJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0LmNvbnRpbnVhdGlvbigpCiAgICAgIDogc3VwZXIoJ2NvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uJywgaXNDb250aW51YXRpb246IHRydWUpOwoKICBjb25zdCBDb25zdHJ1Y3RvclJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0LmNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cygpCiAgICAgIDogc3VwZXIoJ2NvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzJywKICAgICAgICAgICAgaXNDb250aW51YXRpb246IHRydWUpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBpZiAoaWRlbnRpZmllci5pc0lkZW50aWZpZXIpIHsKICAgICAgY2hlY2tBc3luY0F3YWl0WWllbGRBc0lkZW50aWZpZXIoaWRlbnRpZmllciwgcGFyc2VyKTsKICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIGlmICghaWRlbnRpZmllci5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuLCB0aGlzLAogICAgICAgICAgbWVzc2FnZTogZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIud2l0aEFyZ3VtZW50cyhpZGVudGlmaWVyKSk7CiAgICB9IGVsc2UgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIGlkZW50aWZpZXIsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyKTsKICAgIH0KICAgIHJldHVybiBpZGVudGlmaWVyOwogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQuZG90dGVkTmFtZV0uCmNsYXNzIERvdHRlZE5hbWVJZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBEb3R0ZWROYW1lSWRlbnRpZmllckNvbnRleHQoKSA6IHN1cGVyKCdkb3R0ZWROYW1lJyk7CgogIGNvbnN0IERvdHRlZE5hbWVJZGVudGlmaWVyQ29udGV4dC5jb250aW51YXRpb24oKQogICAgICA6IHN1cGVyKCdkb3R0ZWROYW1lQ29udGludWF0aW9uJywgaXNDb250aW51YXRpb246IHRydWUpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBjb25zdCBmb2xsb3dpbmdWYWx1ZXMgPSBjb25zdCBbJy4nLCAnPT0nLCAnKSddOwoKICAgIGlmIChpZGVudGlmaWVyLmlzSWRlbnRpZmllcikgewogICAgICAvLyBEb3R0ZWROYW1lSWRlbnRpZmllckNvbnRleHQgYXJlIG9ubHkgdXNlZCBpbiBjb25kaXRpb25hbCBpbXBvcnQKICAgICAgLy8gZXhwcmVzc2lvbnMuIEFsdGhvdWdoIHNvbWUgdG9wIGxldmVsIGtleXdvcmRzIHN1Y2ggYXMgYGltcG9ydGAgY2FuIGJlCiAgICAgIC8vIHVzZWQgYXMgaWRlbnRpZmllcnMsIHRoZXkgYXJlIG1vcmUgbGlrZWx5IHRoZSBzdGFydCBvZiB0aGUgbmV4dAogICAgICAvLyBkaXJlY3RpdmUgb3IgZGVjbGFyYXRpb24uCiAgICAgIGlmICghaWRlbnRpZmllci5pc1RvcExldmVsS2V5d29yZCB8fAogICAgICAgICAgaXNPbmVPZk9yRW9mKGlkZW50aWZpZXIubmV4dCwgZm9sbG93aW5nVmFsdWVzKSkgewogICAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgICB9CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIGlmIChsb29rc0xpa2VTdGFydE9mTmV4dFRvcExldmVsRGVjbGFyYXRpb24oaWRlbnRpZmllcikgfHwKICAgICAgICBpc09uZU9mT3JFb2YoaWRlbnRpZmllciwgZm9sbG93aW5nVmFsdWVzKSkgewogICAgICBpZGVudGlmaWVyID0gcGFyc2VyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4sIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKGlkZW50aWZpZXIpKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgICBpZiAoIWlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gV2hlbiBpbiBkb3VidCwgY29uc3VtZSB0aGUgdG9rZW4gdG8gZW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MKICAgICAgICAvLyBidXQgaW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaWRlbnRpZmllcjsKICB9Cn0KCi8vLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0LmVudW1EZWNsYXJhdGlvbl0uCmNsYXNzIEVudW1EZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGNvbnN0IEVudW1EZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0KCkKICAgICAgOiBzdXBlcignZW51bURlY2xhcmF0aW9uJywKICAgICAgICAgICAgaW5EZWNsYXJhdGlvbjogdHJ1ZSwgaXNCdWlsdEluSWRlbnRpZmllckFsbG93ZWQ6IGZhbHNlKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gaWRlbnRpZmllciA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQoaWRlbnRpZmllci5raW5kICE9IElERU5USUZJRVJfVE9LRU4pOwogICAgaWYgKGlkZW50aWZpZXIudHlwZS5pc1BzZXVkbykgewogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgaWYgKGxvb2tzTGlrZVN0YXJ0T2ZOZXh0VG9wTGV2ZWxEZWNsYXJhdGlvbihpZGVudGlmaWVyKSB8fAogICAgICAgIGlzT25lT2ZPckVvZihpZGVudGlmaWVyLCBjb25zdCBbJ3snXSkpIHsKICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuLCB0aGlzLAogICAgICAgICAgbWVzc2FnZTogZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIud2l0aEFyZ3VtZW50cyhpZGVudGlmaWVyKSk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWZpZXIudHlwZS5pc0J1aWx0SW4pIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBmYXN0YS50ZW1wbGF0ZUJ1aWx0SW5JZGVudGlmaWVySW5EZWNsYXJhdGlvbik7CiAgICB9IGVsc2UgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIGlkZW50aWZpZXIsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyKTsKICAgICAgaWYgKCFpZGVudGlmaWVyLmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICAgIC8vIFdoZW4gaW4gZG91YnQsIGNvbnN1bWUgdGhlIHRva2VuIHRvIGVuc3VyZSB3ZSBtYWtlIHByb2dyZXNzCiAgICAgICAgLy8gYnV0IGluc2VydCBhIHN5bnRoZXRpYyBpZGVudGlmaWVyIHRvIHNhdGlzZnkgbGlzdGVuZXJzLgogICAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIucmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcihpZGVudGlmaWVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgfQp9CgovLy8gU2VlIFtJZGVudGlmaWVyQ29udGV4dC5lbnVtVmFsdWVEZWNsYXJhdGlvbl0uCmNsYXNzIEVudW1WYWx1ZURlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQgZXh0ZW5kcyBJZGVudGlmaWVyQ29udGV4dCB7CiAgY29uc3QgRW51bVZhbHVlRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgpCiAgICAgIDogc3VwZXIoJ2VudW1WYWx1ZURlY2xhcmF0aW9uJywgaW5EZWNsYXJhdGlvbjogdHJ1ZSk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGlmIChpZGVudGlmaWVyLmlzSWRlbnRpZmllcikgewogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgaWYgKGxvb2tzTGlrZVN0YXJ0T2ZOZXh0VG9wTGV2ZWxEZWNsYXJhdGlvbihpZGVudGlmaWVyKSB8fAogICAgICAgIGlzT25lT2ZPckVvZihpZGVudGlmaWVyLCBjb25zdCBbJywnLCAnfSddKSkgewogICAgICByZXR1cm4gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4pOwogICAgfSBlbHNlIGlmICghaWRlbnRpZmllci5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgLy8gV2hlbiBpbiBkb3VidCwgY29uc3VtZSB0aGUgdG9rZW4gdG8gZW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MKICAgICAgLy8gYnV0IGluc2VydCBhIHN5bnRoZXRpYyBpZGVudGlmaWVyIHRvIHNhdGlzZnkgbGlzdGVuZXJzLgogICAgICByZXR1cm4gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoaWRlbnRpZmllcik7CiAgICB9CiAgICByZXR1cm4gaWRlbnRpZmllcjsKICB9Cn0KCi8vLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0LmV4cHJlc3Npb25dLgpjbGFzcyBFeHByZXNzaW9uSWRlbnRpZmllckNvbnRleHQgZXh0ZW5kcyBJZGVudGlmaWVyQ29udGV4dCB7CiAgY29uc3QgRXhwcmVzc2lvbklkZW50aWZpZXJDb250ZXh0KCkKICAgICAgOiBzdXBlcignZXhwcmVzc2lvbicsIGlzU2NvcGVSZWZlcmVuY2U6IHRydWUpOwoKICBjb25zdCBFeHByZXNzaW9uSWRlbnRpZmllckNvbnRleHQuY29udGludWF0aW9uKCkKICAgICAgOiBzdXBlcignZXhwcmVzc2lvbkNvbnRpbnVhdGlvbicsIGlzQ29udGludWF0aW9uOiB0cnVlKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gaWRlbnRpZmllciA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQoaWRlbnRpZmllci5raW5kICE9IElERU5USUZJRVJfVE9LRU4pOwogICAgaWYgKGlkZW50aWZpZXIuaXNJZGVudGlmaWVyKSB7CiAgICAgIGlmIChvcHRpb25hbCgnYXdhaXQnLCBpZGVudGlmaWVyKSAmJiBpZGVudGlmaWVyLm5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gQWx0aG91Z2ggdGhlIGBhd2FpdGAgY2FuIGJlIHVzZWQgaW4gYW4gZXhwcmVzc2lvbiwKICAgICAgICAvLyBpdCBpcyBmb2xsb3dlZCBieSBhbm90aGVyIGlkZW50aWZpZXIgd2hpY2ggZG9lcyBub3QgZm9ybQogICAgICAgIC8vIGEgdmFsaWQgZXhwcmVzc2lvbi4gUmVwb3J0IGFuIGVycm9yIG9uIHRoZSBgYXdhaXRgIHRva2VuCiAgICAgICAgLy8gcmF0aGVyIHRoYW4gdGhlIHRva2VuIGZvbGxvd2luZyBpdC4KICAgICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVVbmV4cGVjdGVkVG9rZW4pOwoKICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKSBDb25zaWRlciBhIG5ldyBsaXN0ZW5lciBldmVudCBzbyB0aGF0IGFuYWx5emVyCiAgICAgICAgLy8gY2FuIHJlcHJlc2VudCB0aGlzIGFzIGFuIGF3YWl0IGV4cHJlc3Npb24gaW4gYSBjb250ZXh0IHRoYXQgZG9lcwogICAgICAgIC8vIG5vdCBhbGxvdyBhd2FpdC4KICAgICAgICByZXR1cm4gaWRlbnRpZmllci5uZXh0OwogICAgICB9IGVsc2UgewogICAgICAgIGNoZWNrQXN5bmNBd2FpdFlpZWxkQXNJZGVudGlmaWVyKGlkZW50aWZpZXIsIHBhcnNlcik7CiAgICAgIH0KICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgIGlkZW50aWZpZXIsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyKTsKICAgIGlmICghbG9va3NMaWtlU3RhdGVtZW50U3RhcnQoaWRlbnRpZmllcikpIHsKICAgICAgaWYgKGlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgICAgaWYgKGlzQ29udGludWF0aW9uIHx8ICFpc09uZU9mT3JFb2YoaWRlbnRpZmllciwgY29uc3QgWydhcycsICdpcyddKSkgewogICAgICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKCFpZGVudGlmaWVyLmlzT3BlcmF0b3IgJiYKICAgICAgICAgICFpc09uZU9mT3JFb2YoaWRlbnRpZmllciwKICAgICAgICAgICAgICBjb25zdCBbJy4nLCAnLCcsICcoJywgJyknLCAnWycsICddJywgJ30nLCAnPycsICc6JywgJzsnXSkpIHsKICAgICAgICAvLyBXaGVuIGluIGRvdWJ0LCBjb25zdW1lIHRoZSB0b2tlbiB0byBlbnN1cmUgd2UgbWFrZSBwcm9ncmVzcwogICAgICAgIHRva2VuID0gaWRlbnRpZmllcjsKICAgICAgICBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgICAgfQogICAgfQogICAgLy8gSW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICByZXR1cm4gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4pOwogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQuZmllbGREZWNsYXJhdGlvbl0uCmNsYXNzIEZpZWxkRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBGaWVsZERlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoKQogICAgICA6IHN1cGVyKCdmaWVsZERlY2xhcmF0aW9uJywgaW5EZWNsYXJhdGlvbjogdHJ1ZSk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGlmIChpZGVudGlmaWVyLmlzSWRlbnRpZmllcikgewogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgaWYgKGlzT25lT2ZPckVvZihpZGVudGlmaWVyLCBjb25zdCBbJzsnLCAnPScsICcsJywgJ30nXSkgfHwKICAgICAgICBsb29rc0xpa2VTdGFydE9mTmV4dENsYXNzTWVtYmVyKGlkZW50aWZpZXIpKSB7CiAgICAgIHJldHVybiBwYXJzZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbiwgdGhpcyk7CiAgICB9IGVsc2UgaWYgKCFpZGVudGlmaWVyLmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICAvLyBXaGVuIGluIGRvdWJ0LCBjb25zdW1lIHRoZSB0b2tlbiB0byBlbnN1cmUgd2UgbWFrZSBwcm9ncmVzcwogICAgICAvLyBidXQgaW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICAgIHJldHVybiBwYXJzZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcihpZGVudGlmaWVyLCB0aGlzLAogICAgICAgICAgbWVzc2FnZTogZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIud2l0aEFyZ3VtZW50cyhpZGVudGlmaWVyKSwKICAgICAgICAgIG1lc3NhZ2VPblRva2VuOiBpZGVudGlmaWVyKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KICB9Cn0KCi8vLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0LmZpZWxkSW5pdGlhbGl6ZXJdLgpjbGFzcyBGaWVsZEluaXRpYWxpemVySWRlbnRpZmllckNvbnRleHQgZXh0ZW5kcyBJZGVudGlmaWVyQ29udGV4dCB7CiAgY29uc3QgRmllbGRJbml0aWFsaXplcklkZW50aWZpZXJDb250ZXh0KCkKICAgICAgOiBzdXBlcignZmllbGRJbml0aWFsaXplcicsIGlzQ29udGludWF0aW9uOiB0cnVlKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgYXNzZXJ0KG9wdGlvbmFsKCcuJywgdG9rZW4pKTsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGlmIChpZGVudGlmaWVyLmlzSWRlbnRpZmllcikgewogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgLy8gSW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICByZXR1cm4gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4pOwogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQuZm9ybWFsUGFyYW1ldGVyRGVjbGFyYXRpb25dLgpjbGFzcyBGb3JtYWxQYXJhbWV0ZXJEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGNvbnN0IEZvcm1hbFBhcmFtZXRlckRlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoKQogICAgICA6IHN1cGVyKCdmb3JtYWxQYXJhbWV0ZXJEZWNsYXJhdGlvbicsIGluRGVjbGFyYXRpb246IHRydWUpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBpZiAoaWRlbnRpZmllci5pc0lkZW50aWZpZXIpIHsKICAgICAgY2hlY2tBc3luY0F3YWl0WWllbGRBc0lkZW50aWZpZXIoaWRlbnRpZmllciwgcGFyc2VyKTsKICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIGNvbnN0IGZvbGxvd2luZ1ZhbHVlcyA9IGNvbnN0IFsnOicsICc9JywgJywnLCAnKCcsICcpJywgJ1snLCAnXScsICd7JywgJ30nXTsKICAgIGlmIChsb29rc0xpa2VTdGFydE9mTmV4dENsYXNzTWVtYmVyKGlkZW50aWZpZXIpIHx8CiAgICAgICAgbG9va3NMaWtlU3RhdGVtZW50U3RhcnQoaWRlbnRpZmllcikgfHwKICAgICAgICBpc09uZU9mT3JFb2YoaWRlbnRpZmllciwgZm9sbG93aW5nVmFsdWVzKSkgewogICAgICBpZGVudGlmaWVyID0gcGFyc2VyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4sIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKGlkZW50aWZpZXIpKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgICBpZiAoIWlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gV2hlbiBpbiBkb3VidCwgY29uc3VtZSB0aGUgdG9rZW4gdG8gZW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MKICAgICAgICAvLyBidXQgaW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaWRlbnRpZmllcjsKICB9Cn0KCi8vLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0LmltcG9ydFByZWZpeERlY2xhcmF0aW9uXS4KY2xhc3MgSW1wb3J0UHJlZml4SWRlbnRpZmllckNvbnRleHQgZXh0ZW5kcyBJZGVudGlmaWVyQ29udGV4dCB7CiAgY29uc3QgSW1wb3J0UHJlZml4SWRlbnRpZmllckNvbnRleHQoKQogICAgICA6IHN1cGVyKCdpbXBvcnRQcmVmaXhEZWNsYXJhdGlvbicsCiAgICAgICAgICAgIGluRGVjbGFyYXRpb246IHRydWUsIGlzQnVpbHRJbklkZW50aWZpZXJBbGxvd2VkOiBmYWxzZSk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGlmIChpZGVudGlmaWVyLnR5cGUuaXNQc2V1ZG8pIHsKICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIGNvbnN0IGZvbGxvd2luZ1ZhbHVlcyA9IGNvbnN0IFsnOycsICdpZicsICdzaG93JywgJ2hpZGUnLCAnZGVmZXJyZWQnLCAnYXMnXTsKICAgIGlmIChpZGVudGlmaWVyLnR5cGUuaXNCdWlsdEluICYmCiAgICAgICAgaXNPbmVPZk9yRW9mKGlkZW50aWZpZXIubmV4dCwgZm9sbG93aW5nVmFsdWVzKSkgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIGlkZW50aWZpZXIsIGZhc3RhLnRlbXBsYXRlQnVpbHRJbklkZW50aWZpZXJJbkRlY2xhcmF0aW9uKTsKICAgIH0gZWxzZSBpZiAobG9va3NMaWtlU3RhcnRPZk5leHRUb3BMZXZlbERlY2xhcmF0aW9uKGlkZW50aWZpZXIpIHx8CiAgICAgICAgaXNPbmVPZk9yRW9mKGlkZW50aWZpZXIsIGZvbGxvd2luZ1ZhbHVlcykpIHsKICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuLCB0aGlzLAogICAgICAgICAgbWVzc2FnZTogZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIud2l0aEFyZ3VtZW50cyhpZGVudGlmaWVyKSk7CiAgICB9IGVsc2UgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIGlkZW50aWZpZXIsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyKTsKICAgICAgaWYgKCFpZGVudGlmaWVyLmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICAgIC8vIFdoZW4gaW4gZG91YnQsIGNvbnN1bWUgdGhlIHRva2VuIHRvIGVuc3VyZSB3ZSBtYWtlIHByb2dyZXNzCiAgICAgICAgLy8gYnV0IGluc2VydCBhIHN5bnRoZXRpYyBpZGVudGlmaWVyIHRvIHNhdGlzZnkgbGlzdGVuZXJzLgogICAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIucmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcihpZGVudGlmaWVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgfQp9CgpjbGFzcyBMaXRlcmFsU3ltYm9sSWRlbnRpZmllckNvbnRleHQgZXh0ZW5kcyBJZGVudGlmaWVyQ29udGV4dCB7CiAgY29uc3QgTGl0ZXJhbFN5bWJvbElkZW50aWZpZXJDb250ZXh0KCkKICAgICAgOiBzdXBlcignbGl0ZXJhbFN5bWJvbCcsIGluU3ltYm9sOiB0cnVlKTsKCiAgY29uc3QgTGl0ZXJhbFN5bWJvbElkZW50aWZpZXJDb250ZXh0LmNvbnRpbnVhdGlvbigpCiAgICAgIDogc3VwZXIoJ2xpdGVyYWxTeW1ib2xDb250aW51YXRpb24nLAogICAgICAgICAgICBpblN5bWJvbDogdHJ1ZSwgaXNDb250aW51YXRpb246IHRydWUpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBpZiAoaWRlbnRpZmllci5pc0lkZW50aWZpZXIpIHsKICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIHJldHVybiBwYXJzZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbiwgdGhpcywKICAgICAgICBtZXNzYWdlOiBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKGlkZW50aWZpZXIpKTsKICB9Cn0KCi8vLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0LmxvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbl0KLy8vIGFuZCBbSWRlbnRpZmllckNvbnRleHQubG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uQ29udGludWF0aW9uXS4KY2xhc3MgTG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQgZXh0ZW5kcyBJZGVudGlmaWVyQ29udGV4dCB7CiAgY29uc3QgTG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoKQogICAgICA6IHN1cGVyKCdsb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb24nLCBpbkRlY2xhcmF0aW9uOiB0cnVlKTsKCiAgY29uc3QgTG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQuY29udGludWF0aW9uKCkKICAgICAgOiBzdXBlcignbG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uQ29udGludWF0aW9uJywKICAgICAgICAgICAgaW5EZWNsYXJhdGlvbjogdHJ1ZSwgaXNDb250aW51YXRpb246IHRydWUpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBpZiAoaWRlbnRpZmllci5pc0lkZW50aWZpZXIpIHsKICAgICAgY2hlY2tBc3luY0F3YWl0WWllbGRBc0lkZW50aWZpZXIoaWRlbnRpZmllciwgcGFyc2VyKTsKICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIGlmIChpc09uZU9mT3JFb2YoaWRlbnRpZmllciwgY29uc3QgWycuJywgJygnLCAneycsICc9PiddKSB8fAogICAgICAgIGxvb2tzTGlrZVN0YXRlbWVudFN0YXJ0KGlkZW50aWZpZXIpKSB7CiAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbiwgdGhpcywKICAgICAgICAgIG1lc3NhZ2U6IGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyLndpdGhBcmd1bWVudHMoaWRlbnRpZmllcikpOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICAgIGlmICghaWRlbnRpZmllci5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgICAvLyBXaGVuIGluIGRvdWJ0LCBjb25zdW1lIHRoZSB0b2tlbiB0byBlbnN1cmUgd2UgbWFrZSBwcm9ncmVzcwogICAgICAgIC8vIGJ1dCBpbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciB0byBzYXRpc2Z5IGxpc3RlbmVycy4KICAgICAgICBpZGVudGlmaWVyID0gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoaWRlbnRpZmllcik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpZGVudGlmaWVyOwogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQubGFiZWxEZWNsYXJhdGlvbl0uCmNsYXNzIExhYmVsRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBMYWJlbERlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoKQogICAgICA6IHN1cGVyKCdsYWJlbERlY2xhcmF0aW9uJywgaW5EZWNsYXJhdGlvbjogdHJ1ZSk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGlmIChpZGVudGlmaWVyLmlzSWRlbnRpZmllcikgewogICAgICBjaGVja0FzeW5jQXdhaXRZaWVsZEFzSWRlbnRpZmllcihpZGVudGlmaWVyLCBwYXJzZXIpOwogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgaWYgKGlzT25lT2ZPckVvZihpZGVudGlmaWVyLCBjb25zdCBbJzonXSkgfHwKICAgICAgICBsb29rc0xpa2VTdGF0ZW1lbnRTdGFydChpZGVudGlmaWVyKSkgewogICAgICBpZGVudGlmaWVyID0gcGFyc2VyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4sIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKGlkZW50aWZpZXIpKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgICBpZiAoIWlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gV2hlbiBpbiBkb3VidCwgY29uc3VtZSB0aGUgdG9rZW4gdG8gZW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MKICAgICAgICAvLyBidXQgaW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaWRlbnRpZmllcjsKICB9Cn0KCi8vLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0LmxhYmVsUmVmZXJlbmNlXS4KY2xhc3MgTGFiZWxSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBMYWJlbFJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0KCkgOiBzdXBlcignbGFiZWxSZWZlcmVuY2UnKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gaWRlbnRpZmllciA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQoaWRlbnRpZmllci5raW5kICE9IElERU5USUZJRVJfVE9LRU4pOwogICAgaWYgKGlkZW50aWZpZXIuaXNJZGVudGlmaWVyKSB7CiAgICAgIGNoZWNrQXN5bmNBd2FpdFlpZWxkQXNJZGVudGlmaWVyKGlkZW50aWZpZXIsIHBhcnNlcik7CiAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBpZiAoaXNPbmVPZk9yRW9mKGlkZW50aWZpZXIsIGNvbnN0IFsnOyddKSkgewogICAgICBpZGVudGlmaWVyID0gcGFyc2VyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4sIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKGlkZW50aWZpZXIpKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgICBpZiAoIWlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gV2hlbiBpbiBkb3VidCwgY29uc3VtZSB0aGUgdG9rZW4gdG8gZW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MKICAgICAgICAvLyBidXQgaW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaWRlbnRpZmllcjsKICB9Cn0KCi8vLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0LmxpYnJhcnlOYW1lXSwKLy8vIGFuZCBbSWRlbnRpZmllckNvbnRleHQubGlicmFyeU5hbWVDb250aW51YXRpb25dCi8vLyBhbmQgW0lkZW50aWZpZXJDb250ZXh0LnBhcnROYW1lXSwKLy8vIGFuZCBbSWRlbnRpZmllckNvbnRleHQucGFydE5hbWVDb250aW51YXRpb25dLgpjbGFzcyBMaWJyYXJ5SWRlbnRpZmllckNvbnRleHQgZXh0ZW5kcyBJZGVudGlmaWVyQ29udGV4dCB7CiAgY29uc3QgTGlicmFyeUlkZW50aWZpZXJDb250ZXh0KCkKICAgICAgOiBzdXBlcignbGlicmFyeU5hbWUnLCBpbkxpYnJhcnlPclBhcnRPZkRlY2xhcmF0aW9uOiB0cnVlKTsKCiAgY29uc3QgTGlicmFyeUlkZW50aWZpZXJDb250ZXh0LmNvbnRpbnVhdGlvbigpCiAgICAgIDogc3VwZXIoJ2xpYnJhcnlOYW1lQ29udGludWF0aW9uJywKICAgICAgICAgICAgaW5MaWJyYXJ5T3JQYXJ0T2ZEZWNsYXJhdGlvbjogdHJ1ZSwgaXNDb250aW51YXRpb246IHRydWUpOwoKICBjb25zdCBMaWJyYXJ5SWRlbnRpZmllckNvbnRleHQucGFydE5hbWUoKQogICAgICA6IHN1cGVyKCdwYXJ0TmFtZScsIGluTGlicmFyeU9yUGFydE9mRGVjbGFyYXRpb246IHRydWUpOwoKICBjb25zdCBMaWJyYXJ5SWRlbnRpZmllckNvbnRleHQucGFydE5hbWVDb250aW51YXRpb24oKQogICAgICA6IHN1cGVyKCdwYXJ0TmFtZUNvbnRpbnVhdGlvbicsCiAgICAgICAgICAgIGluTGlicmFyeU9yUGFydE9mRGVjbGFyYXRpb246IHRydWUsIGlzQ29udGludWF0aW9uOiB0cnVlKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gaWRlbnRpZmllciA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQoaWRlbnRpZmllci5raW5kICE9IElERU5USUZJRVJfVE9LRU4pOwogICAgY29uc3QgZm9sbG93aW5nVmFsdWVzID0gY29uc3QgWycuJywgJzsnXTsKCiAgICBpZiAoaWRlbnRpZmllci5pc0lkZW50aWZpZXIpIHsKICAgICAgVG9rZW4gbmV4dCA9IGlkZW50aWZpZXIubmV4dDsKICAgICAgaWYgKCFsb29rc0xpa2VTdGFydE9mTmV4dFRvcExldmVsRGVjbGFyYXRpb24oaWRlbnRpZmllcikgfHwKICAgICAgICAgIGlzT25lT2ZPckVvZihuZXh0LCBmb2xsb3dpbmdWYWx1ZXMpKSB7CiAgICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICAgIH0KICAgICAgLy8gQWx0aG91Z2ggdGhpcyBpcyBhIHZhbGlkIGxpYnJhcnkgbmFtZSwgdGhlIGxpYnJhcnkgZGVjbGFyYXRpb24KICAgICAgLy8gaXMgaW52YWxpZCBhbmQgdGhpcyBsb29rcyBsaWtlIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBkZWNsYXJhdGlvbi4KICAgICAgLy8gSW4gdGhpcyBzaXR1YXRpb24sIGZhbGwgdGhyb3VnaCB0byBpbnNlcnQgYSBzeW50aGV0aWMgbGlicmFyeSBuYW1lLgogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBpZiAoaXNPbmVPZk9yRW9mKGlkZW50aWZpZXIsIGZvbGxvd2luZ1ZhbHVlcykgfHwKICAgICAgICBsb29rc0xpa2VTdGFydE9mTmV4dFRvcExldmVsRGVjbGFyYXRpb24oaWRlbnRpZmllcikpIHsKICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuLCB0aGlzLAogICAgICAgICAgbWVzc2FnZTogZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIud2l0aEFyZ3VtZW50cyhpZGVudGlmaWVyKSk7CiAgICB9IGVsc2UgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIGlkZW50aWZpZXIsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyKTsKICAgICAgaWYgKCFpZGVudGlmaWVyLmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICAgIC8vIFdoZW4gaW4gZG91YnQsIGNvbnN1bWUgdGhlIHRva2VuIHRvIGVuc3VyZSB3ZSBtYWtlIHByb2dyZXNzCiAgICAgICAgLy8gYnV0IGluc2VydCBhIHN5bnRoZXRpYyBpZGVudGlmaWVyIHRvIHNhdGlzZnkgbGlzdGVuZXJzLgogICAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIucmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcihpZGVudGlmaWVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgfQp9CgovLy8gU2VlIFtJZGVudGlmaWVyQ29udGV4dC5sb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25dLgpjbGFzcyBMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgpCiAgICAgIDogc3VwZXIoJ2xvY2FsVmFyaWFibGVEZWNsYXJhdGlvbicsIGluRGVjbGFyYXRpb246IHRydWUpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBpZiAoaWRlbnRpZmllci5pc0lkZW50aWZpZXIpIHsKICAgICAgY2hlY2tBc3luY0F3YWl0WWllbGRBc0lkZW50aWZpZXIoaWRlbnRpZmllciwgcGFyc2VyKTsKICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIGlmIChpc09uZU9mT3JFb2YoaWRlbnRpZmllciwgY29uc3QgWyc7JywgJz0nLCAnLCcsICd7JywgJ30nXSkgfHwKICAgICAgICBsb29rc0xpa2VTdGF0ZW1lbnRTdGFydChpZGVudGlmaWVyKSkgewogICAgICBpZGVudGlmaWVyID0gcGFyc2VyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4sIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKGlkZW50aWZpZXIpKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgICBpZiAoIWlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gV2hlbiBpbiBkb3VidCwgY29uc3VtZSB0aGUgdG9rZW4gdG8gZW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MKICAgICAgICAvLyBidXQgaW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaWRlbnRpZmllcjsKICB9Cn0KCi8vLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0Lm1ldGFkYXRhUmVmZXJlbmNlXQovLy8gYW5kIFtJZGVudGlmaWVyQ29udGV4dC5tZXRhZGF0YUNvbnRpbnVhdGlvbl0KLy8vIGFuZCBbSWRlbnRpZmllckNvbnRleHQubWV0YWRhdGFDb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHNdLgpjbGFzcyBNZXRhZGF0YVJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGNvbnN0IE1ldGFkYXRhUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQoKQogICAgICA6IHN1cGVyKCdtZXRhZGF0YVJlZmVyZW5jZScsIGlzU2NvcGVSZWZlcmVuY2U6IHRydWUpOwoKICBjb25zdCBNZXRhZGF0YVJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0LmNvbnRpbnVhdGlvbigpCiAgICAgIDogc3VwZXIoJ21ldGFkYXRhQ29udGludWF0aW9uJywgaXNDb250aW51YXRpb246IHRydWUpOwoKICBjb25zdCBNZXRhZGF0YVJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0LmNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cygpCiAgICAgIDogc3VwZXIoJ21ldGFkYXRhQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzJywgaXNDb250aW51YXRpb246IHRydWUpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBpZiAoaWRlbnRpZmllci5pc0lkZW50aWZpZXIpIHsKICAgICAgY2hlY2tBc3luY0F3YWl0WWllbGRBc0lkZW50aWZpZXIoaWRlbnRpZmllciwgcGFyc2VyKTsKICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIGlmIChpc09uZU9mT3JFb2YoaWRlbnRpZmllciwgY29uc3QgWyd7JywgJ30nLCAnKCcsICcpJywgJ10nXSkgfHwKICAgICAgICBsb29rc0xpa2VTdGFydE9mTmV4dFRvcExldmVsRGVjbGFyYXRpb24oaWRlbnRpZmllcikgfHwKICAgICAgICBsb29rc0xpa2VTdGFydE9mTmV4dENsYXNzTWVtYmVyKGlkZW50aWZpZXIpIHx8CiAgICAgICAgbG9va3NMaWtlU3RhdGVtZW50U3RhcnQoaWRlbnRpZmllcikpIHsKICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuLCB0aGlzLAogICAgICAgICAgbWVzc2FnZTogZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIud2l0aEFyZ3VtZW50cyhpZGVudGlmaWVyKSk7CiAgICB9IGVsc2UgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIGlkZW50aWZpZXIsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyKTsKICAgICAgaWYgKCFpZGVudGlmaWVyLmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICAgIC8vIFdoZW4gaW4gZG91YnQsIGNvbnN1bWUgdGhlIHRva2VuIHRvIGVuc3VyZSB3ZSBtYWtlIHByb2dyZXNzCiAgICAgICAgLy8gYnV0IGluc2VydCBhIHN5bnRoZXRpYyBpZGVudGlmaWVyIHRvIHNhdGlzZnkgbGlzdGVuZXJzLgogICAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIucmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcihpZGVudGlmaWVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgfQp9CgovLy8gU2VlIFtJZGVudGlmaWVyQ29udGV4dC5tZXRob2REZWNsYXJhdGlvbl0sCi8vLyBhbmQgW0lkZW50aWZpZXJDb250ZXh0Lm1ldGhvZERlY2xhcmF0aW9uQ29udGludWF0aW9uXSwKLy8vIGFuZCBbSWRlbnRpZmllckNvbnRleHQub3BlcmF0b3JOYW1lXS4KY2xhc3MgTWV0aG9kRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBNZXRob2REZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0KCkKICAgICAgOiBzdXBlcignbWV0aG9kRGVjbGFyYXRpb24nLCBpbkRlY2xhcmF0aW9uOiB0cnVlKTsKCiAgY29uc3QgTWV0aG9kRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dC5jb250aW51YXRpb24oKQogICAgICA6IHN1cGVyKCdtZXRob2REZWNsYXJhdGlvbkNvbnRpbnVhdGlvbicsCiAgICAgICAgICAgIGluRGVjbGFyYXRpb246IHRydWUsIGlzQ29udGludWF0aW9uOiB0cnVlKTsKCiAgY29uc3QgTWV0aG9kRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dC5vcGVyYXRvck5hbWUoKQogICAgICA6IHN1cGVyKCdvcGVyYXRvck5hbWUnLCBpbkRlY2xhcmF0aW9uOiB0cnVlKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gaWRlbnRpZmllciA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQoaWRlbnRpZmllci5raW5kICE9IElERU5USUZJRVJfVE9LRU4pOwogICAgaWYgKGlkZW50aWZpZXIuaXNJZGVudGlmaWVyKSB7CiAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBpZiAoaWRlbnRpZmllci5pc1VzZXJEZWZpbmFibGVPcGVyYXRvciAmJiAhaXNDb250aW51YXRpb24pIHsKICAgICAgcmV0dXJuIHBhcnNlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIsIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBmYXN0YS5tZXNzYWdlTWlzc2luZ09wZXJhdG9yS2V5d29yZCwKICAgICAgICAgIG1lc3NhZ2VPblRva2VuOiBpZGVudGlmaWVyKTsKICAgIH0gZWxzZSBpZiAoaXNPbmVPZk9yRW9mKGlkZW50aWZpZXIsIGNvbnN0IFsnLicsICcoJywgJ3snLCAnPT4nLCAnfSddKSB8fAogICAgICAgIGxvb2tzTGlrZVN0YXJ0T2ZOZXh0Q2xhc3NNZW1iZXIoaWRlbnRpZmllcikpIHsKICAgICAgcmV0dXJuIHBhcnNlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuLCB0aGlzKTsKICAgIH0gZWxzZSBpZiAoIWlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgIC8vIFdoZW4gaW4gZG91YnQsIGNvbnN1bWUgdGhlIHRva2VuIHRvIGVuc3VyZSB3ZSBtYWtlIHByb2dyZXNzCiAgICAgIC8vIGJ1dCBpbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciB0byBzYXRpc2Z5IGxpc3RlbmVycy4KICAgICAgcmV0dXJuIHBhcnNlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIsIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKGlkZW50aWZpZXIpLAogICAgICAgICAgbWVzc2FnZU9uVG9rZW46IGlkZW50aWZpZXIpOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgfQogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQubmFtZWRBcmd1bWVudFJlZmVyZW5jZV0uCmNsYXNzIE5hbWVkQXJndW1lbnRSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBOYW1lZEFyZ3VtZW50UmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQoKQogICAgICA6IHN1cGVyKCduYW1lZEFyZ3VtZW50UmVmZXJlbmNlJywgYWxsb3dlZEluQ29uc3RhbnRFeHByZXNzaW9uOiB0cnVlKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gaWRlbnRpZmllciA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQoaWRlbnRpZmllci5raW5kICE9IElERU5USUZJRVJfVE9LRU4pOwogICAgaWYgKGlkZW50aWZpZXIuaXNJZGVudGlmaWVyKSB7CiAgICAgIGNoZWNrQXN5bmNBd2FpdFlpZWxkQXNJZGVudGlmaWVyKGlkZW50aWZpZXIsIHBhcnNlcik7CiAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBpZiAoaXNPbmVPZk9yRW9mKGlkZW50aWZpZXIsIGNvbnN0IFsnOiddKSkgewogICAgICBpZGVudGlmaWVyID0gcGFyc2VyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4sIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKGlkZW50aWZpZXIpKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgICBpZiAoIWlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gV2hlbiBpbiBkb3VidCwgY29uc3VtZSB0aGUgdG9rZW4gdG8gZW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MKICAgICAgICAvLyBidXQgaW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaWRlbnRpZmllcjsKICB9Cn0KCi8vLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0LnRvcExldmVsRnVuY3Rpb25EZWNsYXJhdGlvbl0KLy8vIGFuZCBbSWRlbnRpZmllckNvbnRleHQudG9wTGV2ZWxWYXJpYWJsZURlY2xhcmF0aW9uXS4KY2xhc3MgVG9wTGV2ZWxEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGZpbmFsIExpc3Q8U3RyaW5nPiBmb2xsb3dpbmdWYWx1ZXM7CgogIGNvbnN0IFRvcExldmVsRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dChTdHJpbmcgbmFtZSwgdGhpcy5mb2xsb3dpbmdWYWx1ZXMpCiAgICAgIDogc3VwZXIobmFtZSwgaW5EZWNsYXJhdGlvbjogdHJ1ZSk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKCiAgICBpZiAoaWRlbnRpZmllci5pc0lkZW50aWZpZXIpIHsKICAgICAgVG9rZW4gbmV4dCA9IGlkZW50aWZpZXIubmV4dDsKICAgICAgaWYgKCFsb29rc0xpa2VTdGFydE9mTmV4dFRvcExldmVsRGVjbGFyYXRpb24oaWRlbnRpZmllcikgfHwKICAgICAgICAgIGlzT25lT2ZPckVvZihuZXh0LCBmb2xsb3dpbmdWYWx1ZXMpKSB7CiAgICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICAgIH0KICAgICAgLy8gQWx0aG91Z2ggdGhpcyBpcyBhIHZhbGlkIHRvcCBsZXZlbCBuYW1lLCB0aGUgZGVjbGFyYXRpb24KICAgICAgLy8gaXMgaW52YWxpZCBhbmQgdGhpcyBsb29rcyBsaWtlIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBkZWNsYXJhdGlvbi4KICAgICAgLy8gSW4gdGhpcyBzaXR1YXRpb24sIGZhbGwgdGhyb3VnaCB0byBpbnNlcnQgYSBzeW50aGV0aWMgbmFtZS4KICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgaWYgKGxvb2tzTGlrZVN0YXJ0T2ZOZXh0VG9wTGV2ZWxEZWNsYXJhdGlvbihpZGVudGlmaWVyKSB8fAogICAgICAgIGlzT25lT2ZPckVvZihpZGVudGlmaWVyLCBmb2xsb3dpbmdWYWx1ZXMpKSB7CiAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbiwgdGhpcywKICAgICAgICAgIG1lc3NhZ2U6IGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyLndpdGhBcmd1bWVudHMoaWRlbnRpZmllcikpOwogICAgfSBlbHNlIGlmIChpZGVudGlmaWVyLnR5cGUuaXNCdWlsdEluKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVCdWlsdEluSWRlbnRpZmllckluRGVjbGFyYXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICAgIGlmICghaWRlbnRpZmllci5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgICAvLyBXaGVuIGluIGRvdWJ0LCBjb25zdW1lIHRoZSB0b2tlbiB0byBlbnN1cmUgd2UgbWFrZSBwcm9ncmVzcwogICAgICAgIC8vIGJ1dCBpbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciB0byBzYXRpc2Z5IGxpc3RlbmVycy4KICAgICAgICBpZGVudGlmaWVyID0gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoaWRlbnRpZmllcik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpZGVudGlmaWVyOwogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQudHlwZWRlZkRlY2xhcmF0aW9uXS4KY2xhc3MgVHlwZWRlZkRlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQgZXh0ZW5kcyBJZGVudGlmaWVyQ29udGV4dCB7CiAgY29uc3QgVHlwZWRlZkRlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoKQogICAgICA6IHN1cGVyKCd0eXBlZGVmRGVjbGFyYXRpb24nLAogICAgICAgICAgICBpbkRlY2xhcmF0aW9uOiB0cnVlLCBpc0J1aWx0SW5JZGVudGlmaWVyQWxsb3dlZDogZmFsc2UpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBpZiAoaWRlbnRpZmllci50eXBlLmlzUHNldWRvKSB7CiAgICAgIGlmIChvcHRpb25hbCgnRnVuY3Rpb24nLCBpZGVudGlmaWVyKSkgewogICAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgICBpZGVudGlmaWVyLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICAgIH0KICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIGNvbnN0IGZvbGxvd2luZ1ZhbHVlcyA9IGNvbnN0IFsnKCcsICc8JywgJz0nLCAnOyddOwogICAgaWYgKGlkZW50aWZpZXIudHlwZS5pc0J1aWx0SW4gJiYKICAgICAgICBpc09uZU9mT3JFb2YoaWRlbnRpZmllci5uZXh0LCBmb2xsb3dpbmdWYWx1ZXMpKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVCdWlsdEluSWRlbnRpZmllckluRGVjbGFyYXRpb24pOwogICAgfSBlbHNlIGlmIChsb29rc0xpa2VTdGFydE9mTmV4dFRvcExldmVsRGVjbGFyYXRpb24oaWRlbnRpZmllcikgfHwKICAgICAgICBpc09uZU9mT3JFb2YoaWRlbnRpZmllciwgZm9sbG93aW5nVmFsdWVzKSkgewogICAgICBpZGVudGlmaWVyID0gcGFyc2VyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4sIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKGlkZW50aWZpZXIpKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgICBpZiAoIWlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gV2hlbiBpbiBkb3VidCwgY29uc3VtZSB0aGUgdG9rZW4gdG8gZW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MKICAgICAgICAvLyBidXQgaW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaWRlbnRpZmllcjsKICB9Cn0KCi8vLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0LnR5cGVSZWZlcmVuY2VdLgpjbGFzcyBUeXBlUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQgZXh0ZW5kcyBJZGVudGlmaWVyQ29udGV4dCB7CiAgY29uc3QgVHlwZVJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0KCkKICAgICAgOiBzdXBlcigndHlwZVJlZmVyZW5jZScsCiAgICAgICAgICAgIGlzU2NvcGVSZWZlcmVuY2U6IHRydWUsCiAgICAgICAgICAgIGlzQnVpbHRJbklkZW50aWZpZXJBbGxvd2VkOiBmYWxzZSwKICAgICAgICAgICAgcmVjb3ZlcnlUZW1wbGF0ZTogZmFzdGEudGVtcGxhdGVFeHBlY3RlZFR5cGUpOwoKICBjb25zdCBUeXBlUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQuY29udGludWF0aW9uKCkKICAgICAgOiBzdXBlcigndHlwZVJlZmVyZW5jZUNvbnRpbnVhdGlvbicsCiAgICAgICAgICAgIGlzQ29udGludWF0aW9uOiB0cnVlLCBpc0J1aWx0SW5JZGVudGlmaWVyQWxsb3dlZDogZmFsc2UpOwoKICBjb25zdCBUeXBlUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQucHJlZml4ZWQoKQogICAgICA6IHN1cGVyKCdwcmVmaXhlZFR5cGVSZWZlcmVuY2UnLAogICAgICAgICAgICBpc1Njb3BlUmVmZXJlbmNlOiB0cnVlLAogICAgICAgICAgICBpc0J1aWx0SW5JZGVudGlmaWVyQWxsb3dlZDogdHJ1ZSwKICAgICAgICAgICAgcmVjb3ZlcnlUZW1wbGF0ZTogZmFzdGEudGVtcGxhdGVFeHBlY3RlZFR5cGUpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChuZXh0LmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBpZiAoaXNWYWxpZFR5cGVSZWZlcmVuY2UobmV4dCkpIHsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9IGVsc2UgaWYgKG5leHQuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgIGlmIChvcHRpb25hbCgidm9pZCIsIG5leHQpKSB7CiAgICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgZmFzdGEubWVzc2FnZUludmFsaWRWb2lkKTsKICAgICAgfSBlbHNlIGlmIChuZXh0LnR5cGUuaXNCdWlsdEluKSB7CiAgICAgICAgaWYgKCFpc0J1aWx0SW5JZGVudGlmaWVyQWxsb3dlZCkgewogICAgICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICAgICAgbmV4dCwgZmFzdGEudGVtcGxhdGVCdWlsdEluSWRlbnRpZmllckFzVHlwZSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCd2YXInLCBuZXh0KSkgewogICAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGZhc3RhLm1lc3NhZ2VWYXJBc1R5cGVOYW1lKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgICAgbmV4dCwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZFR5cGUpOwogICAgICB9CiAgICAgIHJldHVybiBuZXh0OwogICAgfQogICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4obmV4dCwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZFR5cGUpOwogICAgaWYgKCFpc09uZU9mT3JFb2YobmV4dCwgY29uc3QgWyc+JywgJyknLCAnXScsICd7JywgJ30nLCAnLCcsICc7J10pKSB7CiAgICAgIC8vIFdoZW4gaW4gZG91YnQsIGNvbnN1bWUgdGhlIHRva2VuIHRvIGVuc3VyZSB3ZSBtYWtlIHByb2dyZXNzCiAgICAgIHRva2VuID0gbmV4dDsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICB9CiAgICAvLyBJbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciB0byBzYXRpc2Z5IGxpc3RlbmVycy4KICAgIHJldHVybiBwYXJzZXIucmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbik7CiAgfQp9CgovLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0LnR5cGVWYXJpYWJsZURlY2xhcmF0aW9uXS4KY2xhc3MgVHlwZVZhcmlhYmxlRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBUeXBlVmFyaWFibGVEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0KCkKICAgICAgOiBzdXBlcigndHlwZVZhcmlhYmxlRGVjbGFyYXRpb24nLAogICAgICAgICAgICBpbkRlY2xhcmF0aW9uOiB0cnVlLCBpc0J1aWx0SW5JZGVudGlmaWVyQWxsb3dlZDogZmFsc2UpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBpZiAoaWRlbnRpZmllci50eXBlLmlzUHNldWRvKSB7CiAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBjb25zdCBmb2xsb3dpbmdWYWx1ZXMgPSBjb25zdCBbJzwnLCAnPicsICc7JywgJ30nLCAnZXh0ZW5kcycsICdzdXBlciddOwogICAgaWYgKGxvb2tzTGlrZVN0YXJ0T2ZOZXh0VG9wTGV2ZWxEZWNsYXJhdGlvbihpZGVudGlmaWVyKSB8fAogICAgICAgIGxvb2tzTGlrZVN0YXJ0T2ZOZXh0Q2xhc3NNZW1iZXIoaWRlbnRpZmllcikgfHwKICAgICAgICBsb29rc0xpa2VTdGF0ZW1lbnRTdGFydChpZGVudGlmaWVyKSB8fAogICAgICAgIGlzT25lT2ZPckVvZihpZGVudGlmaWVyLCBmb2xsb3dpbmdWYWx1ZXMpKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgICBpZGVudGlmaWVyID0gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4pOwogICAgfSBlbHNlIGlmIChpZGVudGlmaWVyLnR5cGUuaXNCdWlsdEluKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVCdWlsdEluSWRlbnRpZmllckluRGVjbGFyYXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICAgIGlmICghaWRlbnRpZmllci5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgICAvLyBXaGVuIGluIGRvdWJ0LCBjb25zdW1lIHRoZSB0b2tlbiB0byBlbnN1cmUgd2UgbWFrZSBwcm9ncmVzcwogICAgICAgIC8vIGJ1dCBpbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciB0byBzYXRpc2Z5IGxpc3RlbmVycy4KICAgICAgICBpZGVudGlmaWVyID0gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoaWRlbnRpZmllcik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpZGVudGlmaWVyOwogIH0KfQoKdm9pZCBjaGVja0FzeW5jQXdhaXRZaWVsZEFzSWRlbnRpZmllcihUb2tlbiBpZGVudGlmaWVyLCBQYXJzZXIgcGFyc2VyKSB7CiAgaWYgKCFwYXJzZXIuaW5QbGFpblN5bmMgJiYgaWRlbnRpZmllci50eXBlLmlzUHNldWRvKSB7CiAgICBpZiAob3B0aW9uYWwoJ2F3YWl0JywgaWRlbnRpZmllcikpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IoaWRlbnRpZmllciwgZmFzdGEubWVzc2FnZUF3YWl0QXNJZGVudGlmaWVyKTsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ3lpZWxkJywgaWRlbnRpZmllcikpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IoaWRlbnRpZmllciwgZmFzdGEubWVzc2FnZVlpZWxkQXNJZGVudGlmaWVyKTsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ2FzeW5jJywgaWRlbnRpZmllcikpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IoaWRlbnRpZmllciwgZmFzdGEubWVzc2FnZUFzeW5jQXNJZGVudGlmaWVyKTsKICAgIH0KICB9Cn0KCmJvb2wgbG9va3NMaWtlU3RhcnRPZk5leHRDbGFzc01lbWJlcihUb2tlbiB0b2tlbikgPT4KICAgIHRva2VuLmlzTW9kaWZpZXIgfHwgaXNPbmVPZk9yRW9mKHRva2VuLCBjb25zdCBbJ0AnLCAnZ2V0JywgJ3NldCcsICd2b2lkJ10pOwoKYm9vbCBsb29rc0xpa2VTdGFydE9mTmV4dFRvcExldmVsRGVjbGFyYXRpb24oVG9rZW4gdG9rZW4pID0+CiAgICB0b2tlbi5pc1RvcExldmVsS2V5d29yZCB8fAogICAgaXNPbmVPZk9yRW9mKHRva2VuLCBjb25zdCBbJ2NvbnN0JywgJ2dldCcsICdmaW5hbCcsICdzZXQnLCAndmFyJywgJ3ZvaWQnXSk7CoO7AE5OPAEuAScBQAEiASIBMwEwASxCRQEMNyMxIzwZBgEQSS82PzRFQUQGFwQCATVAKClFAQw3IzEkGQYBED8WTkFQLC5FDS45L0dDTAgGFwQCASg+PQEMNyMxSgEjQjwbCEpLSwYBEDU/QVANLjkvR0NMCAYXBAIBMT1QSDA/AT1JAU9EIwEMNyMxIzwZBgEQLUFQDS45BhcEAgEoPj0BMz8BDDcjMTQBI0lPSSMrPBsIBgEQPzVBUA0uOS9HQ0wIBhcEAgEtQyshRQEMNyMxJBkGARA/MUFQLC5FDS45L0dDTAgGFwQCATJIMDwBDDcjMSMZBgEQLDc/Nj80RUFEBhcEAgEoPiY1ATM/AQw3IzEjSz5ERC8wOAFJTBwgDz4IGQYBECw3MC5PHQorJEtHHCEIBjs9BAIBLkQsOAEMNyMxIxkGARBANzw0RUFATycNLjkZBgQCAS5ELDkBDDciIzEjGQYBECw3Oz0EAgE4TjZCAQw3IzEjPBkGARBRNy81QVANLjkvR0NMCAYXBAIBNUAoKUUBDDcjMSQZBgEQUSU6LkVGNUFQDS45L0dDTAgGFwQCAUEpMAE2KzMBDDcjMSMZBgEQOU4EAgE1Qkw0QAFBNjgBDDcjMSM8GQYBEEEvQVANLjkvR0NMCAYXBAIBLkQsOAEMNyMxIzwZBgEQMS9BUA0uOS9HQ0wIBhcEAgEsQkUBDDcjMSM8GQYBEDFBUA0uOS9HQ0wIBhcEAgEpNCYyOyNCATApRwEsPwE4JkcBDDcjMS4BIyRCMRsISEtNBgEQNT9BUA0uOS9HQ0wIBhcEAgE2TDRAAQw3IzEjPBkGARBFL0FQDS45L0dDTAgGFwQCAS4xREUtPAE6PQFMTwEMNyMxIzwZBgEQRT83L0FQDS45L0dDTAgGFwQCAS87KkUtOQE6LzgBOjQBDDcjMSMZBgEQQUA4J003PDRFQUBPJw0uORkGBAIBNEoyTAEMNyMxIzwZBgEQMUFQDS45L0dDTAgGFwQCATg5RyYBUCoBDDcjMQEjJEIxGwhCS0UGARA/NUFQLC5FDS45L0dDTAgGFwQCATBGLiRFAQw3IzEkLjA7CBkGARA4JTouRUY1QVANLjkvR0NMCAYXBAIBK0EpHyQvOwE2K0YBMickLjsBDDcdKyYTLSRHKCsyPAoqSQ8wLwgTBk5KRRQZBjs9BAIBNEszKUUBDDcjMSQZBgEQTD83LzUuOUUsLkUNLjkvR0NMCAYXBAIBSTkpUTBRMFEGBAIBNVABPR9QAT9wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL2lkZW50aWZpZXJfY29udGV4dF9pbXBsLmRhcnQ2c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvc3NhL2NvZGVnZW5faGVscGVycy5kYXJ0wACuLS8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvanNfYmFja2VuZC5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2ludGVyY2VwdG9yX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9zZWxlY3Rvci5kYXJ0JyBzaG93IFNlbGVjdG9yOwppbXBvcnQgJy4uL3dvcmxkLmRhcnQnIHNob3cgSkNsb3NlZFdvcmxkOwppbXBvcnQgJ2NvZGVnZW4uZGFydCcgc2hvdyBDb2RlZ2VuUGhhc2U7CmltcG9ydCAnbm9kZXMuZGFydCc7CgovLy8gUmVwbGFjZXMgc29tZSBpbnN0cnVjdGlvbnMgd2l0aCBzcGVjaWFsaXplZCB2ZXJzaW9ucyB0byBtYWtlIGNvZGVnZW4gZWFzaWVyLgovLy8gQ2FjaGVzIGNvZGVnZW4gaW5mb3JtYXRpb24gb24gbm9kZXMuCmNsYXNzIFNzYUluc3RydWN0aW9uU2VsZWN0aW9uIGV4dGVuZHMgSEJhc2VWaXNpdG9yIHdpdGggQ29kZWdlblBoYXNlIHsKICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwogIGZpbmFsIEludGVyY2VwdG9yRGF0YSBfaW50ZXJjZXB0b3JEYXRhOwogIGZpbmFsIENvbXBpbGVyT3B0aW9ucyBfb3B0aW9uczsKICBIR3JhcGggZ3JhcGg7CgogIFNzYUluc3RydWN0aW9uU2VsZWN0aW9uKAogICAgICB0aGlzLl9vcHRpb25zLCB0aGlzLl9jbG9zZWRXb3JsZCwgdGhpcy5faW50ZXJjZXB0b3JEYXRhKTsKCiAgQWJzdHJhY3RWYWx1ZURvbWFpbiBnZXQgX2Fic3RyYWN0VmFsdWVEb21haW4gPT4KICAgICAgX2Nsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRHcmFwaChIR3JhcGggZ3JhcGgpIHsKICAgIHRoaXMuZ3JhcGggPSBncmFwaDsKICAgIHZpc2l0RG9taW5hdG9yVHJlZShncmFwaCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEJhc2ljQmxvY2soSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IGJsb2NrLmZpcnN0OwogICAgd2hpbGUgKGluc3RydWN0aW9uICE9IG51bGwpIHsKICAgICAgSEluc3RydWN0aW9uIG5leHQgPSBpbnN0cnVjdGlvbi5uZXh0OwogICAgICBISW5zdHJ1Y3Rpb24gcmVwbGFjZW1lbnQgPSBpbnN0cnVjdGlvbi5hY2NlcHQodGhpcyk7CiAgICAgIGlmIChyZXBsYWNlbWVudCAhPSBpbnN0cnVjdGlvbiAmJiByZXBsYWNlbWVudCAhPSBudWxsKSB7CiAgICAgICAgYmxvY2sucmV3cml0ZShpbnN0cnVjdGlvbiwgcmVwbGFjZW1lbnQpOwoKICAgICAgICAvLyBJZiB0aGUgcmVwbGFjZW1lbnQgaW5zdHJ1Y3Rpb24gZG9lcyBub3Qga25vdyBpdHMgc291cmNlIGVsZW1lbnQsIHVzZQogICAgICAgIC8vIHRoZSBzb3VyY2UgZWxlbWVudCBvZiB0aGUgaW5zdHJ1Y3Rpb24uCiAgICAgICAgaWYgKHJlcGxhY2VtZW50LnNvdXJjZUVsZW1lbnQgPT0gbnVsbCkgewogICAgICAgICAgcmVwbGFjZW1lbnQuc291cmNlRWxlbWVudCA9IGluc3RydWN0aW9uLnNvdXJjZUVsZW1lbnQ7CiAgICAgICAgfQogICAgICAgIGlmIChyZXBsYWNlbWVudC5zb3VyY2VJbmZvcm1hdGlvbiA9PSBudWxsKSB7CiAgICAgICAgICByZXBsYWNlbWVudC5zb3VyY2VJbmZvcm1hdGlvbiA9IGluc3RydWN0aW9uLnNvdXJjZUluZm9ybWF0aW9uOwogICAgICAgIH0KICAgICAgICBpZiAoIXJlcGxhY2VtZW50LmlzSW5CYXNpY0Jsb2NrKCkpIHsKICAgICAgICAgIC8vIFRoZSBjb25zdGFudCBmb2xkaW5nIGNhbiByZXR1cm4gYW4gaW5zdHJ1Y3Rpb24gdGhhdCBpcyBhbHJlYWR5CiAgICAgICAgICAvLyBwYXJ0IG9mIHRoZSBncmFwaCAobGlrZSBhbiBpbnB1dCksIHNvIHdlIG9ubHkgYWRkIHRoZSByZXBsYWNlbWVudAogICAgICAgICAgLy8gaWYgbmVjZXNzYXJ5LgogICAgICAgICAgYmxvY2suYWRkQWZ0ZXIoaW5zdHJ1Y3Rpb24sIHJlcGxhY2VtZW50KTsKICAgICAgICAgIC8vIFZpc2l0IHRoZSByZXBsYWNlbWVudCBhcyB0aGUgbmV4dCBpbnN0cnVjdGlvbiBpbiBjYXNlIGl0IGNhbiBhbHNvCiAgICAgICAgICAvLyBiZSBjb25zdGFudCBmb2xkZWQgYXdheS4KICAgICAgICAgIG5leHQgPSByZXBsYWNlbWVudDsKICAgICAgICB9CiAgICAgICAgYmxvY2sucmVtb3ZlKGluc3RydWN0aW9uKTsKICAgICAgfQogICAgICBpbnN0cnVjdGlvbiA9IG5leHQ7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRJbnN0cnVjdGlvbihISW5zdHJ1Y3Rpb24gbm9kZSkgewogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRJcyhISXMgbm9kZSkgewogICAgaWYgKG5vZGUua2luZCA9PSBISXMuUkFXX0NIRUNLKSB7CiAgICAgIEhJbnN0cnVjdGlvbiBpbnRlcmNlcHRvciA9IG5vZGUuaW50ZXJjZXB0b3I7CiAgICAgIGlmIChpbnRlcmNlcHRvciAhPSBudWxsKSB7CiAgICAgICAgcmV0dXJuIG5ldyBISXNWaWFJbnRlcmNlcHRvcigKICAgICAgICAgICAgbm9kZS50eXBlRXhwcmVzc2lvbiwgaW50ZXJjZXB0b3IsIF9hYnN0cmFjdFZhbHVlRG9tYWluLmJvb2xUeXBlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRJZGVudGl0eShISWRlbnRpdHkgbm9kZSkgewogICAgbm9kZS5zaW5nbGVDb21wYXJpc29uT3AgPSBzaW1wbGVPcChub2RlLmxlZnQsIG5vZGUucmlnaHQpOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgc2luZ2xlIEphdmFTY3JpcHQgY29tcGFyaXNvbiAoYD09YCBvciBgPT09YCkgaWYgdGhhdAogIC8vLyBpbXBsZW1lbnRzIGBpZGVudGljYWwobGVmdCwgcmlnaHQpYCwgb3IgcmV0dXJucyBgbnVsbGAgaWYgdGhlIG1vcmUgY29tcGxleAogIC8vLyB0ZXJuYXJ5IGBsZWZ0ID09IG51bGwgPyByaWdodCA9PSBudWxsIDogbGVmdCA9PT0gcmlnaHRgIGlzIHJlcXVpcmVkLgogIFN0cmluZyBzaW1wbGVPcChISW5zdHJ1Y3Rpb24gbGVmdCwgSEluc3RydWN0aW9uIHJpZ2h0KSB7CiAgICBBYnN0cmFjdFZhbHVlIGxlZnRUeXBlID0gbGVmdC5pbnN0cnVjdGlvblR5cGU7CiAgICBBYnN0cmFjdFZhbHVlIHJpZ2h0VHlwZSA9IHJpZ2h0Lmluc3RydWN0aW9uVHlwZTsKICAgIGlmIChfYWJzdHJhY3RWYWx1ZURvbWFpbi5pc051bGwobGVmdFR5cGUpLmlzRGVmaW5pdGVseUZhbHNlKSB7CiAgICAgIHJldHVybiAnPT09JzsKICAgIH0KICAgIGlmIChfYWJzdHJhY3RWYWx1ZURvbWFpbi5pc051bGwocmlnaHRUeXBlKS5pc0RlZmluaXRlbHlGYWxzZSkgewogICAgICByZXR1cm4gJz09PSc7CiAgICB9CgogICAgLy8gRGFydCBgbnVsbGAgaXMgaW1wbGVtZW50ZWQgYnkgSmF2YVNjcmlwdCBgbnVsbGAgYW5kIGB1bmRlZmluZWRgIHdoaWNoIGFyZQogICAgLy8gbm90IHN0cmljdC1lcXVhbHMsIHNvIHdlIGNhbid0IHVzZSBgPT09YC4gV2Ugd291bGQgbGlrZSB0byB1c2UgYD09YCBidXQKICAgIC8vIG5lZWQgdG8gYXZvaWQgYW55IGNhc2VzIGZyb20gRVM2IDcuMi4xNCB0aGF0IGludm9sdmUgY29udmVyc2lvbnMuCiAgICBpZiAobGVmdC5pc0NvbnN0YW50TnVsbCgpIHx8IHJpZ2h0LmlzQ29uc3RhbnROdWxsKCkpIHsKICAgICAgcmV0dXJuICc9PSc7CiAgICB9CgogICAgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzTnVtYmVyT3JOdWxsKGxlZnRUeXBlKS5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4uaXNOdW1iZXJPck51bGwocmlnaHRUeXBlKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiAnPT0nOwogICAgfQogICAgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzU3RyaW5nT3JOdWxsKGxlZnRUeXBlKS5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4uaXNTdHJpbmdPck51bGwocmlnaHRUeXBlKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiAnPT0nOwogICAgfQogICAgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzQm9vbGVhbk9yTnVsbChsZWZ0VHlwZSkuaXNEZWZpbml0ZWx5VHJ1ZSAmJgogICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzQm9vbGVhbk9yTnVsbChyaWdodFR5cGUpLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcmV0dXJuICc9PSc7CiAgICB9CgogICAgaWYgKF9pbnRlcmNlcHRlZChsZWZ0VHlwZSkpIHJldHVybiBudWxsOwogICAgaWYgKF9pbnRlcmNlcHRlZChyaWdodFR5cGUpKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiAnPT0nOwogIH0KCiAgLy8gVG9QcmltaXRpdmUgY29udmVyc2lvbnMgb2YgYW4gb2JqZWN0IG9jY3VyIHdoZW4gdGhlIG90aGVyIG9wZXJhbmQgaXMgYQogIC8vIHByaW1pdGl2ZSAoTnVtYmVyLCBTdHJpbmcsIFN5bWJvbCBhbmQsIGluZGlyZWN0bHksIEJvb2xlYW4pLiBXZSB1c2UKICAvLyAnaW50ZXJjZXB0ZWQnIHR5cGVzIGFzIGEgcHJveHkgZm9yIGFsbCB0aGUgcHJpbWl0aXZlIHR5cGVzLgogIGJvb2wgX2ludGVyY2VwdGVkKEFic3RyYWN0VmFsdWUgdHlwZSkgPT4gX2Fic3RyYWN0VmFsdWVEb21haW4KICAgICAgLmlzSW50ZXJjZXB0b3IoX2Fic3RyYWN0VmFsdWVEb21haW4uZXhjbHVkZU51bGwodHlwZSkpCiAgICAgIC5pc1BvdGVudGlhbGx5VHJ1ZTsKCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0SW52b2tlRHluYW1pYyhISW52b2tlRHluYW1pYyBub2RlKSB7CiAgICBpZiAobm9kZS5pc0ludGVyY2VwdGVkQ2FsbCkgewogICAgICB0cnlSZXBsYWNlSW50ZXJjZXB0b3JXaXRoRHVtbXkobm9kZSwgbm9kZS5zZWxlY3Rvciwgbm9kZS5tYXNrKTsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0SW52b2tlU3VwZXIoSEludm9rZVN1cGVyIG5vZGUpIHsKICAgIGlmIChub2RlLmlzSW50ZXJjZXB0ZWRDYWxsKSB7CiAgICAgIEFic3RyYWN0VmFsdWUgbWFzayA9IG5vZGUuZ2V0RGFydFJlY2VpdmVyKF9jbG9zZWRXb3JsZCkuaW5zdHJ1Y3Rpb25UeXBlOwogICAgICB0cnlSZXBsYWNlSW50ZXJjZXB0b3JXaXRoRHVtbXkobm9kZSwgbm9kZS5zZWxlY3RvciwgbWFzayk7CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB2aXNpdE9uZVNob3RJbnRlcmNlcHRvcihIT25lU2hvdEludGVyY2VwdG9yIG5vZGUpIHsKICAgIC8vIFRoZSByZWNlaXZlciBwYXJhbWV0ZXIgc2hvdWxkIG5ldmVyIGJlIHJlcGxhY2VkIHdpdGggYSBkdW1teSBjb25zdGFudC4KICAgIHJldHVybiBub2RlOwogIH0KCiAgYm9vbCB0cnlSZXBsYWNlSW50ZXJjZXB0b3JXaXRoRHVtbXkoCiAgICAgIEhJbnZva2Ugbm9kZSwgU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgbWFzaykgewogICAgLy8gQ2FsbHMgb2YgdGhlIGZvcm0KICAgIC8vCiAgICAvLyAgICAgYS5mb28kMShhLCB4KQogICAgLy8KICAgIC8vIHdoZXJlIHRoZSBpbnRlcmNlcHRvciBjYWxsaW5nIGNvbnZlbnRpb24gaXMgdXNlZCBjb21lIGZyb20gcmVjb2duaXppbmcKICAgIC8vIHRoYXQgJ2EnIGlzIGEgJ3NlbGYtaW50ZXJjZXB0b3InLiAgSWYgdGhlIHNlbGVjdG9yIG1hdGNoZXMgb25seSBtZXRob2RzCiAgICAvLyB0aGF0IGlnbm9yZSB0aGUgZXhwbGljaXQgcmVjZWl2ZXIgcGFyYW1ldGVyLCByZXBsYWNlIG9jY3VycmVuY2VzIG9mIHRoZQogICAgLy8gcmVjZWl2ZXIgYXJndW1lbnQgd2l0aCBhIGR1bW15IHJlY2VpdmVyICcwJzoKICAgIC8vCiAgICAvLyAgICAgYS5mb28kMShhLCB4KSAgIC0tLT4gICBhLmZvbyQxKDAsIHgpCiAgICAvLwogICAgLy8gVGhpcyBvZnRlbiByZWR1Y2VzIHRoZSBudW1iZXIgb2YgcmVmZXJlbmNlcyB0byAnYScgdG8gb25lLCBhbGxvd2luZyAnYScKICAgIC8vIHRvIGJlIGdlbmVyYXRlZCBhdCB1c2UgdG8gYXZvaWQgYSB0ZW1wb3JhcnksIGUuZy4KICAgIC8vCiAgICAvLyAgICAgdDEgPSBiLmdldCR0aGluZygpOwogICAgLy8gICAgIHQxLmZvbyQxKHQxLCB4KQogICAgLy8gLS0tPgogICAgLy8gICAgIGIuZ2V0JHRoaW5nKCkuZm9vJDEoMCwgeCkKICAgIC8vCgogICAgLy8gVE9ETygxNTkzMyk6IE1ha2UgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgcHJvcGVydHkgZXh0cmFjdGlvbiBjbG9zdXJlcwogICAgLy8gd29yayB3aXRoIHRoZSBkdW1teSByZWNlaXZlciBvcHRpbWl6YXRpb24uCiAgICBpZiAoc2VsZWN0b3IuaXNHZXR0ZXIpIHJldHVybiBmYWxzZTsKCiAgICAvLyBUaGlzIGFzc2lnbm1lbnQgb2YgaW5wdXRzIGlzIHVuaWZvcm0gZm9yIEhJbnZva2VEeW5hbWljIGFuZCBISW52b2tlU3VwZXIuCiAgICBISW5zdHJ1Y3Rpb24gaW50ZXJjZXB0b3IgPSBub2RlLmlucHV0c1swXTsKICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlckFyZ3VtZW50ID0gbm9kZS5pbnB1dHNbMV07CgogICAgaWYgKGludGVyY2VwdG9yLm5vbkNoZWNrKCkgPT0gcmVjZWl2ZXJBcmd1bWVudC5ub25DaGVjaygpKSB7CiAgICAgIGlmIChfaW50ZXJjZXB0b3JEYXRhLmlzSW50ZXJjZXB0ZWRTZWxlY3RvcihzZWxlY3RvcikgJiYKICAgICAgICAgICFfaW50ZXJjZXB0b3JEYXRhLmlzSW50ZXJjZXB0ZWRNaXhpblNlbGVjdG9yKAogICAgICAgICAgICAgIHNlbGVjdG9yLCBtYXNrLCBfY2xvc2VkV29ybGQpKSB7CiAgICAgICAgQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IG5ldyBTeW50aGV0aWNDb25zdGFudFZhbHVlKAogICAgICAgICAgICBTeW50aGV0aWNDb25zdGFudEtpbmQuRFVNTVlfSU5URVJDRVBUT1IsCiAgICAgICAgICAgIHJlY2VpdmVyQXJndW1lbnQuaW5zdHJ1Y3Rpb25UeXBlKTsKICAgICAgICBIQ29uc3RhbnQgZHVtbXkgPSBncmFwaC5hZGRDb25zdGFudChjb25zdGFudCwgX2Nsb3NlZFdvcmxkKTsKICAgICAgICByZWNlaXZlckFyZ3VtZW50LnVzZWRCeS5yZW1vdmUobm9kZSk7CiAgICAgICAgbm9kZS5pbnB1dHNbMV0gPSBkdW1teTsKICAgICAgICBkdW1teS51c2VkQnkuYWRkKG5vZGUpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRGaWVsZFNldChIRmllbGRTZXQgc2V0dGVyKSB7CiAgICAvLyBQYXR0ZXJuIG1hdGNoCiAgICAvLyAgICAgdDEgPSB4LmY7IHQyID0gdDEgKyAxOyB4LmYgPSB0MjsgdXNlKHQyKSAgIC0tPiAgKyt4LmYKICAgIC8vICAgICB0MSA9IHguZjsgdDIgPSB0MSBvcCB5OyB4LmYgPSB0MjsgdXNlKHQyKSAgLS0+ICB4LmYgb3A9IHkKICAgIC8vICAgICB0MSA9IHguZjsgdDIgPSB0MSArIDE7IHguZiA9IHQyOyB1c2UodDEpICAgLS0+ICB4LmYrKwogICAgSEJhc2ljQmxvY2sgYmxvY2sgPSBzZXR0ZXIuYmxvY2s7CiAgICBISW5zdHJ1Y3Rpb24gb3AgPSBzZXR0ZXIudmFsdWU7CiAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIgPSBzZXR0ZXIucmVjZWl2ZXI7CgogICAgYm9vbCBpc01hdGNoaW5nUmVhZChISW5zdHJ1Y3Rpb24gY2FuZGlkYXRlKSB7CiAgICAgIGlmIChjYW5kaWRhdGUgaXMgSEZpZWxkR2V0KSB7CiAgICAgICAgaWYgKGNhbmRpZGF0ZS5lbGVtZW50ICE9IHNldHRlci5lbGVtZW50KSByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKGNhbmRpZGF0ZS5yZWNlaXZlciAhPSBzZXR0ZXIucmVjZWl2ZXIpIHJldHVybiBmYWxzZTsKICAgICAgICAvLyBSZWNvZ25pemUgb25seSB0aHJlZSBpbnN0cnVjdGlvbnMgaW4gc2VxdWVuY2UgaW4gdGhlIHNhbWUgYmxvY2suIFRoaXMKICAgICAgICAvLyBjb3VsZCBiZSBicm9hZGVuZWQgdG8gYWxsb3cgbm9uLWludGVyZmVyaW5nIGludGVybGVhdmVkIGluc3RydWN0aW9ucy4KICAgICAgICBpZiAob3AuYmxvY2sgIT0gYmxvY2spIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAoY2FuZGlkYXRlLmJsb2NrICE9IGJsb2NrKSByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKHNldHRlci5wcmV2aW91cyAhPSBvcCkgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmIChvcC5wcmV2aW91cyAhPSBjYW5kaWRhdGUpIHJldHVybiBmYWxzZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgSEluc3RydWN0aW9uIG5vTWF0Y2hpbmdSZWFkKCkgewogICAgICAvLyBJZiB3ZSBoYXZlIG90aGVyIEhGaWVsZFNldCBvcHRpbWl6YXRpb25zLCB0aGV5IGdvIGhlcmUuCiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIEhJbnN0cnVjdGlvbiByZXBsYWNlT3AoSEluc3RydWN0aW9uIHJlcGxhY2VtZW50LCBISW5zdHJ1Y3Rpb24gZ2V0dGVyKSB7CiAgICAgIGJsb2NrLmFkZEJlZm9yZShzZXR0ZXIsIHJlcGxhY2VtZW50KTsKICAgICAgYmxvY2sucmVtb3ZlKHNldHRlcik7CiAgICAgIGJsb2NrLnJld3JpdGUob3AsIHJlcGxhY2VtZW50KTsKICAgICAgYmxvY2sucmVtb3ZlKG9wKTsKICAgICAgYmxvY2sucmVtb3ZlKGdldHRlcik7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIEhJbnN0cnVjdGlvbiBwbHVzT3JNaW51cyhTdHJpbmcgYXNzaWduT3AsIFN0cmluZyBpbmNyZW1lbnRPcCkgewogICAgICBISW52b2tlQmluYXJ5IGJpbmFyeSA9IG9wOwogICAgICBISW5zdHJ1Y3Rpb24gbGVmdCA9IGJpbmFyeS5sZWZ0OwogICAgICBISW5zdHJ1Y3Rpb24gcmlnaHQgPSBiaW5hcnkucmlnaHQ7CiAgICAgIGlmIChpc01hdGNoaW5nUmVhZChsZWZ0KSkgewogICAgICAgIGlmIChsZWZ0LnVzZWRCeS5sZW5ndGggPT0gMSkgewogICAgICAgICAgaWYgKHJpZ2h0IGlzIEhDb25zdGFudCAmJiByaWdodC5jb25zdGFudC5pc09uZSkgewogICAgICAgICAgICBISW5zdHJ1Y3Rpb24gcm13ID0gbmV3IEhSZWFkTW9kaWZ5V3JpdGUucHJlT3AoCiAgICAgICAgICAgICAgICBzZXR0ZXIuZWxlbWVudCwgaW5jcmVtZW50T3AsIHJlY2VpdmVyLCBvcC5pbnN0cnVjdGlvblR5cGUpOwogICAgICAgICAgICByZXR1cm4gcmVwbGFjZU9wKHJtdywgbGVmdCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBISW5zdHJ1Y3Rpb24gcm13ID0gbmV3IEhSZWFkTW9kaWZ5V3JpdGUuYXNzaWduT3AoCiAgICAgICAgICAgICAgICBzZXR0ZXIuZWxlbWVudCwgYXNzaWduT3AsIHJlY2VpdmVyLCByaWdodCwgb3AuaW5zdHJ1Y3Rpb25UeXBlKTsKICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VPcChybXcsIGxlZnQpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAob3AudXNlZEJ5Lmxlbmd0aCA9PSAxICYmCiAgICAgICAgICAgIHJpZ2h0IGlzIEhDb25zdGFudCAmJgogICAgICAgICAgICByaWdodC5jb25zdGFudC5pc09uZSkgewogICAgICAgICAgSEluc3RydWN0aW9uIHJtdyA9IG5ldyBIUmVhZE1vZGlmeVdyaXRlLnBvc3RPcCgKICAgICAgICAgICAgICBzZXR0ZXIuZWxlbWVudCwgaW5jcmVtZW50T3AsIHJlY2VpdmVyLCBvcC5pbnN0cnVjdGlvblR5cGUpOwogICAgICAgICAgYmxvY2suYWRkQWZ0ZXIobGVmdCwgcm13KTsKICAgICAgICAgIGJsb2NrLnJlbW92ZShzZXR0ZXIpOwogICAgICAgICAgYmxvY2sucmVtb3ZlKG9wKTsKICAgICAgICAgIGJsb2NrLnJld3JpdGUobGVmdCwgcm13KTsKICAgICAgICAgIGJsb2NrLnJlbW92ZShsZWZ0KTsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbm9NYXRjaGluZ1JlYWQoKTsKICAgIH0KCiAgICBISW5zdHJ1Y3Rpb24gc2ltcGxlKAogICAgICAgIFN0cmluZyBhc3NpZ25PcCwgSEluc3RydWN0aW9uIGxlZnQsIEhJbnN0cnVjdGlvbiByaWdodCkgewogICAgICBpZiAoaXNNYXRjaGluZ1JlYWQobGVmdCkpIHsKICAgICAgICBpZiAobGVmdC51c2VkQnkubGVuZ3RoID09IDEpIHsKICAgICAgICAgIEhJbnN0cnVjdGlvbiBybXcgPSBuZXcgSFJlYWRNb2RpZnlXcml0ZS5hc3NpZ25PcCgKICAgICAgICAgICAgICBzZXR0ZXIuZWxlbWVudCwgYXNzaWduT3AsIHJlY2VpdmVyLCByaWdodCwgb3AuaW5zdHJ1Y3Rpb25UeXBlKTsKICAgICAgICAgIHJldHVybiByZXBsYWNlT3Aocm13LCBsZWZ0KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5vTWF0Y2hpbmdSZWFkKCk7CiAgICB9CgogICAgSEluc3RydWN0aW9uIHNpbXBsZUJpbmFyeShTdHJpbmcgYXNzaWduT3ApIHsKICAgICAgSEludm9rZUJpbmFyeSBiaW5hcnkgPSBvcDsKICAgICAgcmV0dXJuIHNpbXBsZShhc3NpZ25PcCwgYmluYXJ5LmxlZnQsIGJpbmFyeS5yaWdodCk7CiAgICB9CgogICAgSEluc3RydWN0aW9uIGJpdG9wKFN0cmluZyBhc3NpZ25PcCkgewogICAgICAvLyBIQml0QW5kLCBIQml0T3IgZXRjLiBhcmUgbW9yZSBkaWZmaWN1bHQgYmVjYXVzZSBIQml0QW5kKGEueCwgeSkKICAgICAgLy8gc29tZXRpbWVzIG5lZWRzIHRvIGJlIGZvcmNlZCB0byB1bnNpZ25lZDogYS54ID0gKGEueCAmIHkpID4+PiAwLgogICAgICBpZiAob3AuaXNVSW50MzEoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICByZXR1cm4gc2ltcGxlQmluYXJ5KGFzc2lnbk9wKTsKICAgICAgfQogICAgICByZXR1cm4gbm9NYXRjaGluZ1JlYWQoKTsKICAgIH0KCiAgICBpZiAob3AgaXMgSEFkZCkgcmV0dXJuIHBsdXNPck1pbnVzKCcrJywgJysrJyk7CiAgICBpZiAob3AgaXMgSFN1YnRyYWN0KSByZXR1cm4gcGx1c09yTWludXMoJy0nLCAnLS0nKTsKCiAgICBpZiAob3AgaXMgSFN0cmluZ0NvbmNhdCkgcmV0dXJuIHNpbXBsZSgnKycsIG9wLmxlZnQsIG9wLnJpZ2h0KTsKCiAgICBpZiAob3AgaXMgSE11bHRpcGx5KSByZXR1cm4gc2ltcGxlQmluYXJ5KCcqJyk7CiAgICBpZiAob3AgaXMgSERpdmlkZSkgcmV0dXJuIHNpbXBsZUJpbmFyeSgnLycpOwoKICAgIGlmIChvcCBpcyBIQml0QW5kKSByZXR1cm4gYml0b3AoJyYnKTsKICAgIGlmIChvcCBpcyBIQml0T3IpIHJldHVybiBiaXRvcCgnfCcpOwogICAgaWYgKG9wIGlzIEhCaXRYb3IpIHJldHVybiBiaXRvcCgnXicpOwoKICAgIHJldHVybiBub01hdGNoaW5nUmVhZCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRJZihISWYgbm9kZSkgewogICAgaWYgKCFfb3B0aW9ucy5leHBlcmltZW50VG9Cb29sZWFuKSByZXR1cm4gbm9kZTsKICAgIEhJbnN0cnVjdGlvbiBjb25kaXRpb24gPSBub2RlLmlucHV0cy5zaW5nbGU7CiAgICAvLyBpZiAoeCAhPSBudWxsKSAtLT4gaWYgKHgpCiAgICBpZiAoY29uZGl0aW9uIGlzIEhOb3QpIHsKICAgICAgSEluc3RydWN0aW9uIHRlc3QgPSBjb25kaXRpb24uaW5wdXRzLnNpbmdsZTsKICAgICAgaWYgKHRlc3QgaXMgSElkZW50aXR5KSB7CiAgICAgICAgSEluc3RydWN0aW9uIG9wZXJhbmQxID0gdGVzdC5pbnB1dHNbMF07CiAgICAgICAgSEluc3RydWN0aW9uIG9wZXJhbmQyID0gdGVzdC5pbnB1dHNbMV07CiAgICAgICAgaWYgKG9wZXJhbmQyLmlzTnVsbChfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSAmJgogICAgICAgICAgICAhX2ludGVyY2VwdGVkKG9wZXJhbmQxLmluc3RydWN0aW9uVHlwZSkpIHsKICAgICAgICAgIGlmICh0ZXN0LnVzZWRCeS5sZW5ndGggPT0gMSAmJiBjb25kaXRpb24udXNlZEJ5Lmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgIG5vZGUuY2hhbmdlVXNlKGNvbmRpdGlvbiwgb3BlcmFuZDEpOwogICAgICAgICAgICBjb25kaXRpb24uYmxvY2sucmVtb3ZlKGNvbmRpdGlvbik7CiAgICAgICAgICAgIHRlc3QuYmxvY2sucmVtb3ZlKHRlc3QpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy8gaWYgKHggPT0gbnVsbCkgPT4gaWYgKCF4KQogICAgaWYgKGNvbmRpdGlvbiBpcyBISWRlbnRpdHkgJiYgY29uZGl0aW9uLnVzZWRCeS5sZW5ndGggPT0gMSkgewogICAgICBISW5zdHJ1Y3Rpb24gb3BlcmFuZDEgPSBjb25kaXRpb24uaW5wdXRzWzBdOwogICAgICBISW5zdHJ1Y3Rpb24gb3BlcmFuZDIgPSBjb25kaXRpb24uaW5wdXRzWzFdOwogICAgICBpZiAob3BlcmFuZDIuaXNOdWxsKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgICAhX2ludGVyY2VwdGVkKG9wZXJhbmQxLmluc3RydWN0aW9uVHlwZSkpIHsKICAgICAgICB2YXIgbm90ID0gSE5vdChvcGVyYW5kMSwgX2Fic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUpOwogICAgICAgIG5vZGUuYmxvY2suYWRkQmVmb3JlKG5vZGUsIG5vdCk7CiAgICAgICAgbm9kZS5jaGFuZ2VVc2UoY29uZGl0aW9uLCBub3QpOwogICAgICAgIGNvbmRpdGlvbi5ibG9jay5yZW1vdmUoY29uZGl0aW9uKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQp9CgovLy8gUmVtb3ZlIFtIVHlwZUtub3duXSBpbnN0cnVjdGlvbnMgZnJvbSB0aGUgZ3JhcGgsIHRvIG1ha2UgY29kZWdlbgovLy8gYW5hbHlzaXMgZWFzaWVyLgpjbGFzcyBTc2FUeXBlS25vd25SZW1vdmVyIGV4dGVuZHMgSEJhc2VWaXNpdG9yIHdpdGggQ29kZWdlblBoYXNlIHsKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0R3JhcGgoSEdyYXBoIGdyYXBoKSB7CiAgICB2aXNpdERvbWluYXRvclRyZWUoZ3JhcGgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJhc2ljQmxvY2soSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IGJsb2NrLmZpcnN0OwogICAgd2hpbGUgKGluc3RydWN0aW9uICE9IG51bGwpIHsKICAgICAgSEluc3RydWN0aW9uIG5leHQgPSBpbnN0cnVjdGlvbi5uZXh0OwogICAgICBpbnN0cnVjdGlvbi5hY2NlcHQodGhpcyk7CiAgICAgIGluc3RydWN0aW9uID0gbmV4dDsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlS25vd24oSFR5cGVLbm93biBpbnN0cnVjdGlvbikgewogICAgZm9yIChISW5zdHJ1Y3Rpb24gdXNlciBpbiBpbnN0cnVjdGlvbi51c2VkQnkpIHsKICAgICAgaWYgKHVzZXIgaXMgSFR5cGVDb252ZXJzaW9uKSB7CiAgICAgICAgdXNlci5pbnB1dFR5cGUgPSBpbnN0cnVjdGlvbi5pbnN0cnVjdGlvblR5cGU7CiAgICAgIH0KICAgIH0KICAgIGluc3RydWN0aW9uLmJsb2NrLnJld3JpdGUoaW5zdHJ1Y3Rpb24sIGluc3RydWN0aW9uLmNoZWNrZWRJbnB1dCk7CiAgICBpbnN0cnVjdGlvbi5ibG9jay5yZW1vdmUoaW5zdHJ1Y3Rpb24pOwogIH0KfQoKLy8vIFJlbW92ZSBbSFR5cGVDb252ZXJzaW9uXSBpbnN0cnVjdGlvbnMgZnJvbSB0aGUgZ3JhcGggaW4gJy0tdHJ1c3QtcHJpbWl0aXZlcycKLy8vIG1vZGUuCmNsYXNzIFNzYVRydXN0ZWRDaGVja1JlbW92ZXIgZXh0ZW5kcyBIQmFzZVZpc2l0b3Igd2l0aCBDb2RlZ2VuUGhhc2UgewogIGZpbmFsIENvbXBpbGVyT3B0aW9ucyBfb3B0aW9uczsKCiAgU3NhVHJ1c3RlZENoZWNrUmVtb3Zlcih0aGlzLl9vcHRpb25zKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEdyYXBoKEhHcmFwaCBncmFwaCkgewogICAgaWYgKCFfb3B0aW9ucy50cnVzdFByaW1pdGl2ZXMpIHJldHVybjsKICAgIHZpc2l0RG9taW5hdG9yVHJlZShncmFwaCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QmFzaWNCbG9jayhIQmFzaWNCbG9jayBibG9jaykgewogICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gYmxvY2suZmlyc3Q7CiAgICB3aGlsZSAoaW5zdHJ1Y3Rpb24gIT0gbnVsbCkgewogICAgICBISW5zdHJ1Y3Rpb24gbmV4dCA9IGluc3RydWN0aW9uLm5leHQ7CiAgICAgIGluc3RydWN0aW9uLmFjY2VwdCh0aGlzKTsKICAgICAgaW5zdHJ1Y3Rpb24gPSBuZXh0OwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVDb252ZXJzaW9uKEhUeXBlQ29udmVyc2lvbiBpbnN0cnVjdGlvbikgewogICAgaWYgKGluc3RydWN0aW9uLmlzUmVjZWl2ZXJUeXBlQ2hlY2sgfHwgaW5zdHJ1Y3Rpb24uaXNBcmd1bWVudFR5cGVDaGVjaykgewogICAgICBpbnN0cnVjdGlvbi5ibG9jay5yZXdyaXRlKGluc3RydWN0aW9uLCBpbnN0cnVjdGlvbi5jaGVja2VkSW5wdXQpOwogICAgICBpbnN0cnVjdGlvbi5ibG9jay5yZW1vdmUoaW5zdHJ1Y3Rpb24pOwogICAgfQogIH0KfQoKLy8vIFVzZSB0aGUgcmVzdWx0IG9mIHN0YXRpYyBhbmQgZmllbGQgYXNzaWdubWVudHMgd2hlcmUgaXQgaXMgcHJvZml0YWJsZSB0byB1c2UKLy8vIHRoZSByZXN1bHQgb2YgdGhlIGFzc2lnbm1lbnQgaW5zdGVhZCBvZiB0aGUgdmFsdWUuCi8vLwovLy8gICAgIGEueCA9IHY7Ci8vLyAgICAgYi55ID0gdjsKLy8vIC0tPgovLy8gICAgIGIueSA9IGEueCA9IHY7CmNsYXNzIFNzYUFzc2lnbm1lbnRDaGFpbmluZyBleHRlbmRzIEhCYXNlVmlzaXRvciB3aXRoIENvZGVnZW5QaGFzZSB7CiAgZmluYWwgSkNsb3NlZFdvcmxkIF9jbG9zZWRXb3JsZDsKICBmaW5hbCBDb21waWxlck9wdGlvbnMgX29wdGlvbnM7CiAgLy9IR3JhcGggZ3JhcGg7CgogIFNzYUFzc2lnbm1lbnRDaGFpbmluZyh0aGlzLl9vcHRpb25zLCB0aGlzLl9jbG9zZWRXb3JsZCk7CgogIEFic3RyYWN0VmFsdWVEb21haW4gZ2V0IF9hYnN0cmFjdFZhbHVlRG9tYWluID0+CiAgICAgIF9jbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0R3JhcGgoSEdyYXBoIGdyYXBoKSB7CiAgICAvL3RoaXMuZ3JhcGggPSBncmFwaDsKICAgIHZpc2l0RG9taW5hdG9yVHJlZShncmFwaCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QmFzaWNCbG9jayhIQmFzaWNCbG9jayBibG9jaykgewogICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gYmxvY2suZmlyc3Q7CiAgICB3aGlsZSAoaW5zdHJ1Y3Rpb24gIT0gbnVsbCkgewogICAgICBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uLmFjY2VwdCh0aGlzKTsKICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIHRoZSBuZXh0IGluc3RydWN0aW9uLgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB2aXNpdEluc3RydWN0aW9uKEhJbnN0cnVjdGlvbiBub2RlKSB7CiAgICByZXR1cm4gbm9kZS5uZXh0OwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0RmllbGRTZXQoSEZpZWxkU2V0IHNldHRlcikgewogICAgcmV0dXJuIHRyeUNoYWluQXNzaWdubWVudChzZXR0ZXIsIHNldHRlci52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRTdGF0aWNTdG9yZShIU3RhdGljU3RvcmUgc3RvcmUpIHsKICAgIHJldHVybiB0cnlDaGFpbkFzc2lnbm1lbnQoc3RvcmUsIHN0b3JlLmlucHV0cy5zaW5nbGUpOwogIH0KCiAgSEluc3RydWN0aW9uIHRyeUNoYWluQXNzaWdubWVudChISW5zdHJ1Y3Rpb24gc2V0dGVyLCBISW5zdHJ1Y3Rpb24gdmFsdWUpIHsKICAgIC8vIFRyeSB0byB1c2UgcmVzdWx0IG9mIGZpZWxkIG9yIHN0YXRpYyBhc3NpZ25tZW50CiAgICAvLwogICAgLy8gICAgIHQxID0gdjsgIHguZiA9IHQxOyAgLi4uIHQxIC4uLgogICAgLy8gLS0+CiAgICAvLyAgICAgdDEgPSB4LmYgPSB2OyAgLi4uIHQxIC4uLgogICAgLy8KCiAgICAvLyBTaW5nbGUgdXNlIGlzIHRoaXMgc2V0dGVyIHNvIHRoZXJlIHdpbGwgYmUgbm8gb3RoZXIgdXNlcyB0byBjaGFpbiB0by4KICAgIGlmICh2YWx1ZS51c2VkQnkubGVuZ3RoIDw9IDEpIHJldHVybiBzZXR0ZXIubmV4dDsKCiAgICAvLyBJdCBpcyBhbHdheXMgd29ydGh3aGlsZSBjaGFpbmluZyBpbnRvIGFub3RoZXIgc2V0dGVyLCBzaW5jZSBpdCByZWR1Y2VzCiAgICAvLyB0aGUgbnVtYmVyIG9mIHJlZmVyZW5jZXMgdG8gW3ZhbHVlXS4KICAgIEhJbnN0cnVjdGlvbiBjaGFpbiA9IHNldHRlcjsKICAgIHNldHRlci5pbnN0cnVjdGlvblR5cGUgPSB2YWx1ZS5pbnN0cnVjdGlvblR5cGU7CiAgICBmb3IgKEhJbnN0cnVjdGlvbiBjdXJyZW50ID0gc2V0dGVyLm5leHQ7OykgewogICAgICBpZiAoY3VycmVudCBpcyBIRmllbGRTZXQpIHsKICAgICAgICBIRmllbGRTZXQgbmV4dFNldHRlciA9IGN1cnJlbnQ7CiAgICAgICAgaWYgKG5leHRTZXR0ZXIudmFsdWUgPT0gdmFsdWUgJiYgbmV4dFNldHRlci5yZWNlaXZlciAhPSB2YWx1ZSkgewogICAgICAgICAgbmV4dFNldHRlci5jaGFuZ2VVc2UodmFsdWUsIGNoYWluKTsKICAgICAgICAgIG5leHRTZXR0ZXIuaW5zdHJ1Y3Rpb25UeXBlID0gdmFsdWUuaW5zdHJ1Y3Rpb25UeXBlOwogICAgICAgICAgY2hhaW4gPSBuZXh0U2V0dGVyOwogICAgICAgICAgY3VycmVudCA9IG5leHRTZXR0ZXIubmV4dDsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjdXJyZW50IGlzIEhTdGF0aWNTdG9yZSkgewogICAgICAgIEhTdGF0aWNTdG9yZSBuZXh0U3RvcmUgPSBjdXJyZW50OwogICAgICAgIGlmIChuZXh0U3RvcmUudmFsdWUgPT0gdmFsdWUpIHsKICAgICAgICAgIG5leHRTdG9yZS5jaGFuZ2VVc2UodmFsdWUsIGNoYWluKTsKICAgICAgICAgIG5leHRTdG9yZS5pbnN0cnVjdGlvblR5cGUgPSB2YWx1ZS5pbnN0cnVjdGlvblR5cGU7CiAgICAgICAgICBjaGFpbiA9IG5leHRTdG9yZTsKICAgICAgICAgIGN1cnJlbnQgPSBuZXh0U3RvcmUubmV4dDsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjdXJyZW50IGlzIEhSZXR1cm4pIHsKICAgICAgICBpZiAoY3VycmVudC5pbnB1dHMuc2luZ2xlID09IHZhbHVlKSB7CiAgICAgICAgICBjdXJyZW50LmNoYW5nZVVzZSh2YWx1ZSwgY2hhaW4pOwogICAgICAgICAgcmV0dXJuIGN1cnJlbnQubmV4dDsKICAgICAgICB9CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICB9CgogICAgZmluYWwgSEluc3RydWN0aW9uIG5leHQgPSBjaGFpbi5uZXh0OwoKICAgIGlmICh2YWx1ZS51c2VkQnkubGVuZ3RoIDw9IDEpIHJldHVybiBuZXh0OyAvLyBzZXR0ZXIgaXMgb25seSByZW1haW5pbmcgdXNlLgoKICAgIC8vIENoYWluIHRvIG90aGVyIHBsYWNlcy4KICAgIHZhciB1c2VzID0gRG9taW5hdGVkVXNlcy5vZih2YWx1ZSwgY2hhaW4sIGV4Y2x1ZGVEb21pbmF0b3I6IHRydWUpOwoKICAgIGlmICh1c2VzLmlzRW1wdHkpIHJldHVybiBuZXh0OwoKICAgIGJvb2wgc2ltcGxlU291cmNlID0gdmFsdWUgaXMgSENvbnN0YW50IHx8IHZhbHVlIGlzIEhQYXJhbWV0ZXJWYWx1ZTsKCiAgICBpZiAodXNlcy5pc1NpbmdsZXRvbikgewogICAgICB2YXIgdXNlID0gdXNlcy5zaW5nbGU7CiAgICAgIGlmICh1c2UgaXMgSFBoaSkgewogICAgICAgIC8vIEZpbHRlciBvdXQgYmFjay1lZGdlcyAtIHRoYXQgY2F1c2VzIHByb2JsZW1zIGZvciB2YXJpYWJsZQogICAgICAgIC8vIGFzc2lnbm1lbnQuCiAgICAgICAgLy8gVE9ETyhzcmEpOiBCZXR0ZXIgYW5hbHlzaXMgdG8gcGVybWl0IHBoaXMgdGhhdCBhcmUgcGFydCBvZiBhCiAgICAgICAgLy8gZm9yd2FyZHMtb25seSB0cmVlLgogICAgICAgIGlmICh1c2UuYmxvY2suaWQgPCBjaGFpbi5ibG9jay5pZCkgcmV0dXJuIG5leHQ7CiAgICAgICAgaWYgKHVzZS51c2VkQnkuYW55KChub2RlKSA9PiBub2RlIGlzIEhQaGkpKSByZXR1cm4gbmV4dDsKCiAgICAgICAgLy8gQSBmb3J3YXJkIHBoaSBvZnRlbiBoYXMgYSBuZXcgbmFtZS4gV2Ugd2FudCB0byBhdm9pZCBbdmFsdWVdIGhhdmluZyBhCiAgICAgICAgLy8gbmFtZSBhdCB0aGUgc2FtZSB0aW1lLCBzbyBjaGFpbiBpbnRvIHRoZSBwaGkgb25seSBpZiBbdmFsdWVdICgxKSB3aWxsCiAgICAgICAgLy8gbmV2ZXIgaGF2ZSBhIG5hbWUgKGxpa2UgYSBjb25zdGFudCkgKDIpIHVuYXZvaWRhYmx5IGhhcyBhIG5hbWUKICAgICAgICAvLyAoZS5nLiBhIHBhcmFtZXRlcikgb3IgKDMpIGNoYWluaW5nIHdpbGwgcmVzdWx0IGluIGEgc2luZ2xlIHVzZSB0aGF0CiAgICAgICAgLy8gdmFyaWFibGUgYWxsb2NhdG9yIGNhbiB0cnkgdG8gbmFtZSBjb25zaXN0ZW50bHkgd2l0aCB0aGUgb3RoZXIgcGhpCiAgICAgICAgLy8gaW5wdXRzLgogICAgICAgIGlmIChzaW1wbGVTb3VyY2UgfHwgdmFsdWUudXNlZEJ5Lmxlbmd0aCA8PSAyKSB7CiAgICAgICAgICBpZiAodmFsdWUuaXNQdXJlKF9hYnN0cmFjdFZhbHVlRG9tYWluKSB8fAogICAgICAgICAgICAgIHNldHRlci5wcmV2aW91cyA9PSB2YWx1ZSB8fAogICAgICAgICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgdGVzdHMgZm9yIGltbWVkaWF0ZWx5IHByZXZpb3VzIHBoaS4KICAgICAgICAgICAgICAoc2V0dGVyLnByZXZpb3VzID09IG51bGwgJiYgdmFsdWUuYmxvY2sgPT0gc2V0dGVyLmJsb2NrKSkgewogICAgICAgICAgICB1c2VzLnJlcGxhY2VXaXRoKGNoYWluKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgIH0KICAgICAgLy8gVE9ETyhzcmEpOiBDaGFpbnMgd2l0aCBvbmUgcmVtYWluaW5nIHBvdGVudGlhbCB1c2UgaGF2ZSB0aGUgcG90ZW50aWFsCiAgICAgIC8vIHRvIGdlbmVyYXRlIGh1Z2UgZXhwcmVzc2lvbiBjb250YWluaW5nIG1hbnkgbmVzdGVkIGFzc2lnbm1lbnRzLiBUaGlzCiAgICAgIC8vIHdpbGwgYmUgc21hbGxlciBidXQgbmVhcmx5IGltcG9zc2libGUgdG8gcmVhZC4gQXJlIHRoZXJlIGludGVyaW9yCiAgICAgIC8vIHBvc2l0aW9ucyB0aGF0IHdlIHNob3VsZCBjaGFpbiBpbnRvIGJlY2F1c2UgdGhleSBhcmUgbm90IHRvbyBkaWZmaWN1bHQKICAgICAgLy8gdG8gcmVhZD8KICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CgogICAgaWYgKHNpbXBsZVNvdXJjZSkgcmV0dXJuIG5leHQ7CgogICAgLy8gSWYgdGhlcmUgYXJlIG1hbnkgcmVtYWluaW5nIHVzZXMsIGJ1dCB0aGV5IGFyZSBhbGwgZG9taW5hdGVkIGJ5IFtjaGFpbl0sCiAgICAvLyB0aGUgdmFyaWFibGUgYWxsb2NhdG9yIHdpbGwgdHJ5IHRvIGdpdmUgdGhlbSBhbGwgdGhlIHNhbWUgbmFtZS4KICAgIGlmICh1c2VzLmxlbmd0aCA+PSAyICYmCiAgICAgICAgdmFsdWUudXNlZEJ5Lmxlbmd0aCAtIHVzZXMubGVuZ3RoIDw9IDEgJiYKICAgICAgICB2YWx1ZSA9PSB2YWx1ZS5ub25DaGVjaygpKSB7CiAgICAgIC8vIElmIFt2YWx1ZV0gaXMgYSBwaGksIGl0IG1pZ2h0IGhhdmUgYSBuYW1lLiBFeGNlcHRpb25zIGFyZSBwaGlzIHRoYXQgY2FuCiAgICAgIC8vIGJlIGNvbXBpbGVkIGludG8gZXhwcmVzc2lvbnMgbGlrZSBgYT9iOmNgIGFuZCBgYSYmYmAuIFdlIGNhbid0IHRlbGwKICAgICAgLy8gaGVyZSBpZiB0aGUgcGhpIGlzIGFuIGV4cHJlc3Npb24sIHdoaWNoIHdlIGNvdWxkIGNoYWluLCBvciBhbgogICAgICAvLyBpZi10aGVuLWVsc2Ugd2l0aCBhc3NpZ25tZW50cyB0byBhIHZhcmlhYmxlLiBJZiB3ZSB0cnkgdG8gY2hhaW4gYW4KICAgICAgLy8gaWYtdGhlbi1lbHNlIHBoaSB3ZSB3aWxsIGVuZCB1cCBnZW5lcmF0aW5nIGNvZGUgbGlrZQogICAgICAvLwogICAgICAvLyAgICAgdDIgPSB0aGlzLnggPSB0MTsgIC8vIHQxIGlzIHRoZSBwaGksIHQyIGlzIHRoZSBjaGFpbmVkIG5hbWUKICAgICAgLy8KICAgICAgaWYgKHZhbHVlIGlzIEhQaGkpIHJldHVybiBuZXh0OwoKICAgICAgLy8gV2UgbmVlZCBbdmFsdWVdIHRvIGJlIGdlbmVyYXRlLWF0LXVzZSBpbiB0aGUgc2V0dGVyIHRvIGF2b2lkIGl0IGhhdmluZwogICAgICAvLyBhIG5hbWUuIEFzIGEgcXVpY2sgY2hlY2sgZm9yIGdlbmVyYXRlLWF0LXVzZSwgYWNjZXB0IHB1cmUgYW5kCiAgICAgIC8vIGltbWVkaWF0ZWx5IHByZWNlZGluZyBpbnN0cnVjdGlvbnMuCiAgICAgIGlmICh2YWx1ZS5pc1B1cmUoX2Fic3RyYWN0VmFsdWVEb21haW4pIHx8IHNldHRlci5wcmV2aW91cyA9PSB2YWx1ZSkgewogICAgICAgIC8vIFRPRE8oc3JhKTogV2UgY2FuIHRvbGVyYXRlIGEgZmV3IG5vbi10aHJvd2luZyBsb2FkcyBiZXR3ZWVuIHNldHRlcgogICAgICAgIC8vIGFuZCB2YWx1ZS4KICAgICAgICB1c2VzLnJlcGxhY2VXaXRoKGNoYWluKTsKICAgICAgICBjaGFpbi5zb3VyY2VFbGVtZW50ID8/PSB2YWx1ZS5zb3VyY2VFbGVtZW50OwogICAgICB9CiAgICAgIHJldHVybiBuZXh0OwogICAgfQoKICAgIHJldHVybiBuZXh0OwogIH0KfQoKLy8vIEluc3RlYWQgb2YgZW1pdHRpbmcgZWFjaCBTU0EgaW5zdHJ1Y3Rpb24gd2l0aCBhIHRlbXBvcmFyeSB2YXJpYWJsZQovLy8gbWFyayBpbnN0cnVjdGlvbnMgdGhhdCBjYW4gYmUgZW1pdHRlZCBhdCB0aGVpciB1c2Utc2l0ZS4KLy8vIEZvciBleGFtcGxlLCBpbjoKLy8vICAgdDAgPSA0OwovLy8gICB0MSA9IDM7Ci8vLyAgIHQyID0gYWRkKHQwLCB0MSk7Ci8vLyB0MCBhbmQgdDEgd291bGQgYmUgbWFya2VkIGFuZCB0aGUgcmVzdWx0aW5nIGNvZGUgd291bGQgdGhlbiBiZToKLy8vICAgdDIgPSBhZGQoNCwgMyk7CmNsYXNzIFNzYUluc3RydWN0aW9uTWVyZ2VyIGV4dGVuZHMgSEJhc2VWaXNpdG9yIHdpdGggQ29kZWdlblBoYXNlIHsKICBmaW5hbCBBYnN0cmFjdFZhbHVlRG9tYWluIF9hYnN0cmFjdFZhbHVlRG9tYWluOwogIGZpbmFsIFN1cGVyTWVtYmVyRGF0YSBfc3VwZXJNZW1iZXJEYXRhOwoKICAvLy8gTGlzdCBvZiBbSEluc3RydWN0aW9uXSB0aGF0IHRoZSBpbnN0cnVjdGlvbiBtZXJnZXIgZXhwZWN0cyBpbgogIC8vLyBvcmRlciB3aGVuIHZpc2l0aW5nIHRoZSBpbnB1dHMgb2YgYW4gaW5zdHJ1Y3Rpb24uCiAgTGlzdDxISW5zdHJ1Y3Rpb24+IGV4cGVjdGVkSW5wdXRzOwoKICAvLy8gU2V0IG9mIHB1cmUgW0hJbnN0cnVjdGlvbl0gdGhhdCB0aGUgaW5zdHJ1Y3Rpb24gbWVyZ2VyIGV4cGVjdHMgdG8KICAvLy8gZmluZC4gVGhlIG9yZGVyIG9mIHB1cmUgaW5zdHJ1Y3Rpb25zIGRvIG5vdCBtYXR0ZXIsIGFzIHRoZXkgd2lsbAogIC8vLyBub3QgYmUgYWZmZWN0ZWQgYnkgc2lkZSBlZmZlY3RzLgogIFNldDxISW5zdHJ1Y3Rpb24+IHB1cmVJbnB1dHM7CiAgU2V0PEhJbnN0cnVjdGlvbj4gZ2VuZXJhdGVBdFVzZVNpdGU7CgogIHZvaWQgbWFya0FzR2VuZXJhdGVBdFVzZVNpdGUoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBhc3NlcnQoIWluc3RydWN0aW9uLmlzSnNTdGF0ZW1lbnQoKSk7CiAgICBnZW5lcmF0ZUF0VXNlU2l0ZS5hZGQoaW5zdHJ1Y3Rpb24pOwogIH0KCiAgU3NhSW5zdHJ1Y3Rpb25NZXJnZXIoCiAgICAgIHRoaXMuX2Fic3RyYWN0VmFsdWVEb21haW4sIHRoaXMuZ2VuZXJhdGVBdFVzZVNpdGUsIHRoaXMuX3N1cGVyTWVtYmVyRGF0YSk7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRHcmFwaChIR3JhcGggZ3JhcGgpIHsKICAgIHZpc2l0RG9taW5hdG9yVHJlZShncmFwaCk7CiAgfQoKICB2b2lkIGFuYWx5emVJbnB1dHMoSEluc3RydWN0aW9uIHVzZXIsIGludCBzdGFydCkgewogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cyA9IHVzZXIuaW5wdXRzOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgaW5wdXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIEhJbnN0cnVjdGlvbiBpbnB1dCA9IGlucHV0c1tpXTsKICAgICAgaWYgKCFnZW5lcmF0ZUF0VXNlU2l0ZS5jb250YWlucyhpbnB1dCkgJiYKICAgICAgICAgICFpbnB1dC5pc0NvZGVNb3Rpb25JbnZhcmlhbnQoKSAmJgogICAgICAgICAgaW5wdXQudXNlZEJ5Lmxlbmd0aCA9PSAxICYmCiAgICAgICAgICBpbnB1dCBpcyEgSFBoaSAmJgogICAgICAgICAgaW5wdXQgaXMhIEhMb2NhbFZhbHVlICYmCiAgICAgICAgICAhaW5wdXQuaXNKc1N0YXRlbWVudCgpKSB7CiAgICAgICAgaWYgKGlzRWZmZWN0aXZlbHlQdXJlKGlucHV0KSkgewogICAgICAgICAgLy8gT25seSBjb25zaWRlciBhIHB1cmUgaW5wdXQgaWYgaXQgaXMgaW4gdGhlIHNhbWUgbG9vcC4KICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgbWlnaHQgbW92ZSBHVk4nZWQgaW5zdHJ1Y3Rpb24gYmFjayBpbnRvIHRoZQogICAgICAgICAgLy8gbG9vcC4KICAgICAgICAgIGlmICh1c2VyLmhhc1NhbWVMb29wSGVhZGVyQXMoaW5wdXQpKSB7CiAgICAgICAgICAgIC8vIE1vdmUgaXQgY2xvc2VyIHRvIFt1c2VyXSwgc28gdGhhdCBpbnN0cnVjdGlvbnMgaW4KICAgICAgICAgICAgLy8gYmV0d2VlbiBkbyBub3QgcHJldmVudCBtYWtpbmcgaXQgZ2VuZXJhdGUgYXQgdXNlIHNpdGUuCiAgICAgICAgICAgIGlucHV0Lm1vdmVCZWZvcmUodXNlcik7CiAgICAgICAgICAgIHB1cmVJbnB1dHMuYWRkKGlucHV0KTsKICAgICAgICAgICAgLy8gUHJldmlvdXMgY29tcHV0YXRpb25zIGRvbmUgb24gW2lucHV0XSBhcmUgbm93IGludmFsaWQKICAgICAgICAgICAgLy8gYmVjYXVzZSB3ZSBtb3ZlZCBbaW5wdXRdIHRvIGFub3RoZXIgcGxhY2UuIFNvIGFsbAogICAgICAgICAgICAvLyBub24gY29kZSBtb3Rpb24gaW52YXJpYW50IGluc3RydWN0aW9ucyBuZWVkCiAgICAgICAgICAgIC8vIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgW2dlbmVyYXRlQXRVc2VTaXRlXSBzZXQuCiAgICAgICAgICAgIGlucHV0LmlucHV0cy5mb3JFYWNoKChpbnN0cnVjdGlvbikgewogICAgICAgICAgICAgIGlmICghaW5zdHJ1Y3Rpb24uaXNDb2RlTW90aW9uSW52YXJpYW50KCkpIHsKICAgICAgICAgICAgICAgIGdlbmVyYXRlQXRVc2VTaXRlLnJlbW92ZShpbnN0cnVjdGlvbik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gVmlzaXQgdGhlIHB1cmUgaW5wdXQgbm93IHNvIHRoYXQgdGhlIGV4cGVjdGVkIGlucHV0cwogICAgICAgICAgICAvLyBhcmUgYWZ0ZXIgdGhlIGV4cGVjdGVkIGlucHV0cyBvZiBbdXNlcl0uCiAgICAgICAgICAgIGlucHV0LmFjY2VwdCh0aGlzKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgZXhwZWN0ZWRJbnB1dHMuYWRkKGlucHV0KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFNvbWUgbm9uLXB1cmUgaW5zdHJ1Y3Rpb25zIG1heSBiZSB0cmVhdGVkIGFzIHB1cmUuIEhMb2NhbEdldCBkZXBlbmRzIG9uCiAgLy8gYXNzaWdubWVudHMsIGJ1dCB3ZSBjYW4gaWdub3JlIHRoZSBpbml0aWFsaXppbmcgYXNzaWdubWVudCBzaW5jZSBpdCB3aWxsIGJ5CiAgLy8gY29uc3RydWN0aW9uIGFsd2F5cyBwcmVjZWRlIGEgdXNlLgogIGJvb2wgaXNFZmZlY3RpdmVseVB1cmUoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBpZiAoaW5zdHJ1Y3Rpb24gaXMgSExvY2FsR2V0KSByZXR1cm4gIWlzQXNzaWduZWRMb2NhbChpbnN0cnVjdGlvbi5sb2NhbCk7CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb24uaXNQdXJlKF9hYnN0cmFjdFZhbHVlRG9tYWluKTsKICB9CgogIGJvb2wgaXNBc3NpZ25lZExvY2FsKEhMb2NhbFZhbHVlIGxvY2FsKSB7CiAgICAvLyBbSExvY2FsVmFsdWVdcyBoYXZlIGFuIGluaXRpYWxpemluZyBhc3NpZ25tZW50IHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8KICAgIC8vIHByZWNlZGUgdGhlIHVzZSwgZXhjZXB0IGZvciBbSFBhcmFtZXRlclZhbHVlXXMgd2hpY2ggYXJlICdhc3NpZ25lZCcgYXQKICAgIC8vIGVudHJ5LgogICAgaW50IGluaXRpYWxpemluZ0Fzc2lnbm1lbnRDb3VudCA9IChsb2NhbCBpcyBIUGFyYW1ldGVyVmFsdWUpID8gMCA6IDE7CiAgICByZXR1cm4gbG9jYWwudXNlZEJ5CiAgICAgICAgLndoZXJlKCh1c2VyKSA9PiB1c2VyIGlzIEhMb2NhbFNldCkKICAgICAgICAuc2tpcChpbml0aWFsaXppbmdBc3NpZ25tZW50Q291bnQpCiAgICAgICAgLmlzTm90RW1wdHk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW5zdHJ1Y3Rpb24oSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICAvLyBBIGNvZGUgbW90aW9uIGludmFyaWFudCBpbnN0cnVjdGlvbiBpcyBkZWFsdCBiZWZvcmUgdmlzaXRpbmcgaXQuCiAgICBhc3NlcnQoIWluc3RydWN0aW9uLmlzQ29kZU1vdGlvbkludmFyaWFudCgpKTsKICAgIGFuYWx5emVJbnB1dHMoaW5zdHJ1Y3Rpb24sIDApOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludm9rZVN1cGVyKEhJbnZva2VTdXBlciBpbnN0cnVjdGlvbikgewogICAgTWVtYmVyRW50aXR5IHN1cGVyTWV0aG9kID0gaW5zdHJ1Y3Rpb24uZWxlbWVudDsKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gaW5zdHJ1Y3Rpb24uc2VsZWN0b3I7CiAgICAvLyBJZiBhbGlhc2VkIHN1cGVyIG1lbWJlcnMgY2Fubm90IGJlIHVzZWQsIHdlIHdpbGwgZ2VuZXJhdGUgY29kZSBsaWtlCiAgICAvLwogICAgLy8gICAgIEMucHJvdG90eXBlLm1ldGhvZC5jYWxsKGluc3RhbmNlKQogICAgLy8KICAgIC8vIHdoZXJlIGluc3RhbmNlIGlzIHRoZSBbdGhpc10gb2JqZWN0IGZvciB0aGUgbWV0aG9kLiBJbiBzdWNoIGEgY2FzZSwgdGhlCiAgICAvLyBnZXQgb2YgcHJvdG90eXBlIG1pZ2h0IGJlIGV2YWx1YXRlZCBiZWZvcmUgaW5zdGFuY2UgaXMgY3JlYXRlZCBpZiB3ZQogICAgLy8gZ2VuZXJhdGUgaW5zdGFuY2UgYXQgdXNlIHNpdGUsIHdoaWNoIGluIHR1cm4gbWlnaHQgdXBkYXRlIHRoZSBwcm90b3R5cGUKICAgIC8vIGFmdGVyIGZpcnN0IGFjY2VzcyBpZiB3ZSB1c2UgbGF6eSBpbml0aWFsaXphdGlvbi4KICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgdGhlcmVmb3JlIGRvbid0IGFsbG93IHRoZSByZWNlaXZlciAodGhlIGZpcnN0IGFyZ3VtZW50KQogICAgLy8gdG8gYmUgZ2VuZXJhdGVkIGF0IHVzZSBzaXRlLCBhbmQgb25seSBhbmFseXplIGFsbCBvdGhlciBhcmd1bWVudHMuCiAgICBpZiAoIV9zdXBlck1lbWJlckRhdGEuY2FuVXNlQWxpYXNlZFN1cGVyTWVtYmVyKHN1cGVyTWV0aG9kLCBzZWxlY3RvcikpIHsKICAgICAgYW5hbHl6ZUlucHV0cyhpbnN0cnVjdGlvbiwgMSk7CiAgICB9IGVsc2UgewogICAgICBzdXBlci52aXNpdEludm9rZVN1cGVyKGluc3RydWN0aW9uKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJcyhISXMgaW5zdHJ1Y3Rpb24pIHsKICAgIC8vIEluIHRoZSBnZW5lcmFsIGNhc2UgdGhlIGlucHV0IG1pZ2h0IGJlIHVzZWQgbXVsdHBsZSBtdWx0aXBsZSB0aW1lcywgc28gaXQKICAgIC8vIG11c3Qgbm90IGJlIHNldCBnZW5lcmF0ZSBhdCB1c2Ugc2l0ZS4KCiAgICAvLyBJZiB0aGUgY29kZSB3aWxsIGdlbmVyYXRlICdpbnN0YW5jZW9mJyB0aGVuIHdlIGNhbiBnZW5lcmF0ZSBhdCB1c2Ugc2l0ZS4KICAgIGlmIChpbnN0cnVjdGlvbi51c2VJbnN0YW5jZU9mKSB7CiAgICAgIGFuYWx5emVJbnB1dHMoaW5zdHJ1Y3Rpb24sIDApOwogICAgfQoKICAgIC8vIENvbXBvdW5kIGFuZCB2YXJpYWJsZSBjaGVja3MgdXNlIGEgc2VwYXJhdGUgaW5zdHJ1Y3Rpb24gdG8gY29tcHV0ZSB0aGUKICAgIC8vIHJlc3VsdC4KICAgIGlmIChpbnN0cnVjdGlvbi5pc0NvbXBvdW5kQ2hlY2sgfHwgaW5zdHJ1Y3Rpb24uaXNWYXJpYWJsZUNoZWNrKSB7CiAgICAgIGFuYWx5emVJbnB1dHMoaW5zdHJ1Y3Rpb24sIDApOwogICAgfQogIH0KCiAgLy8gQSBib3VuZHMgY2hlY2sgbWV0aG9kIG11c3Qgbm90IGhhdmUgaXRzIGZpcnN0IGlucHV0IGdlbmVyYXRlZCBhdCB1c2Ugc2l0ZSwKICAvLyBiZWNhdXNlIGl0J3MgdXNpbmcgaXQgdHdpY2UuCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJvdW5kc0NoZWNrKEhCb3VuZHNDaGVjayBpbnN0cnVjdGlvbikgewogICAgYW5hbHl6ZUlucHV0cyhpbnN0cnVjdGlvbiwgMSk7CiAgfQoKICAvLyBBbiBpZGVudGl0eSBvcGVyYXRpb24gbXVzdCBvbmx5IGhhdmUgaXRzIGlucHV0cyBnZW5lcmF0ZWQgYXQgdXNlIHNpdGUgaWYKICAvLyBkb2VzIG5vdCByZXF1aXJlIGFuIGV4cHJlc3Npb24gd2l0aCBtdWx0aXBsZSB1c2VzIChiZWNhdXNlIG9mIG51bGwgLwogIC8vIHVuZGVmaW5lZCkuCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdElkZW50aXR5KEhJZGVudGl0eSBpbnN0cnVjdGlvbikgewogICAgaWYgKGluc3RydWN0aW9uLnNpbmdsZUNvbXBhcmlzb25PcCAhPSBudWxsKSB7CiAgICAgIHN1cGVyLnZpc2l0SWRlbnRpdHkoaW5zdHJ1Y3Rpb24pOwogICAgfQogICAgLy8gRG8gbm90aGluZy4KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlQ29udmVyc2lvbihIVHlwZUNvbnZlcnNpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGlmICghaW5zdHJ1Y3Rpb24uaXNBcmd1bWVudFR5cGVDaGVjayAmJiAhaW5zdHJ1Y3Rpb24uaXNSZWNlaXZlclR5cGVDaGVjaykgewogICAgICBhc3NlcnQoaW5zdHJ1Y3Rpb24uaXNDaGVja2VkTW9kZUNoZWNrIHx8IGluc3RydWN0aW9uLmlzQ2FzdFR5cGVDaGVjayk7CiAgICAgIC8vIENoZWNrZWQgbW9kZSBjaGVja3MgYW5kIGNhc3QgY2hlY2tzIGNvbXBpbGUgdG8gY29kZSB0aGF0CiAgICAgIC8vIG9ubHkgdXNlIHRoZWlyIGlucHV0IG9uY2UsIHNvIHdlIGNhbiBzYWZlbHkgdmlzaXQgdGhlbQogICAgICAvLyBhbmQgdHJ5IHRvIG1lcmdlIHRoZSBpbnB1dC4KICAgICAgdmlzaXRJbnN0cnVjdGlvbihpbnN0cnVjdGlvbik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZUtub3duKEhUeXBlS25vd24gaW5zdHJ1Y3Rpb24pIHsKICAgIC8vIFtIVHlwZUtub3duXSBpbnN0cnVjdGlvbnMgYXJlIHJlbW92ZWQgYmVmb3JlIGNvZGUgZ2VuZXJhdGlvbi4KICAgIGFzc2VydChmYWxzZSk7CiAgfQoKICB2b2lkIHRyeUdlbmVyYXRlQXRVc2VTaXRlKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgaWYgKGluc3RydWN0aW9uLmlzQ29udHJvbEZsb3coKSkgcmV0dXJuOwogICAgbWFya0FzR2VuZXJhdGVBdFVzZVNpdGUoaW5zdHJ1Y3Rpb24pOwogIH0KCiAgYm9vbCBpc0Jsb2NrU2luZ2xlUHJlZGVjZXNzb3IoSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIHJldHVybiBibG9jay5zdWNjZXNzb3JzLmxlbmd0aCA9PSAxICYmCiAgICAgICAgYmxvY2suc3VjY2Vzc29yc1swXS5wcmVkZWNlc3NvcnMubGVuZ3RoID09IDE7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QmFzaWNCbG9jayhIQmFzaWNCbG9jayBibG9jaykgewogICAgLy8gQ29tcGVuc2F0ZSBmcm9tIG5vdCBtZXJnaW5nIGJsb2NrczogaWYgdGhlIGJsb2NrIGlzIHRoZQogICAgLy8gc2luZ2xlIHByZWRlY2Vzc29yIG9mIGl0cyBzaW5nbGUgc3VjY2Vzc29yLCBsZXQgdGhlIHN1Y2Nlc3NvcgogICAgLy8gdmlzaXQgaXQuCiAgICBpZiAoaXNCbG9ja1NpbmdsZVByZWRlY2Vzc29yKGJsb2NrKSkgcmV0dXJuOwoKICAgIHRyeU1lcmdpbmdFeHByZXNzaW9ucyhibG9jayk7CiAgfQoKICB2b2lkIHRyeU1lcmdpbmdFeHByZXNzaW9ucyhIQmFzaWNCbG9jayBibG9jaykgewogICAgLy8gVmlzaXQgZWFjaCBpbnN0cnVjdGlvbiBvZiB0aGUgYmFzaWMgYmxvY2sgaW4gbGFzdC10by1maXJzdCBvcmRlci4KICAgIC8vIEtlZXAgYSBsaXN0IG9mIGV4cGVjdGVkIGlucHV0cyBvZiB0aGUgY3VycmVudCAiZXhwcmVzc2lvbiIgYmVpbmcKICAgIC8vIG1lcmdlZC4gSWYgaW5zdHJ1Y3Rpb25zIG9jY3VyIGluIHRoZSBleHBlY3RlZCBvcmRlciwgdGhleSBhcmUKICAgIC8vIGluY2x1ZGVkIGluIHRoZSBleHByZXNzaW9uLgoKICAgIC8vIFRoZSBleHBlY3RlZElucHV0cyBsaXN0IGhvbGRzIG5vbi10cml2aWFsIGluc3RydWN0aW9ucyB0aGF0IG1heQogICAgLy8gYmUgZ2VuZXJhdGVkIGF0IHRoZWlyIHVzZSBzaXRlLCBpZiB0aGV5IG9jY3VyIGluIHRoZSBjb3JyZWN0IG9yZGVyLgogICAgaWYgKGV4cGVjdGVkSW5wdXRzID09IG51bGwpIGV4cGVjdGVkSW5wdXRzID0gbmV3IExpc3Q8SEluc3RydWN0aW9uPigpOwogICAgaWYgKHB1cmVJbnB1dHMgPT0gbnVsbCkgcHVyZUlucHV0cyA9IG5ldyBTZXQ8SEluc3RydWN0aW9uPigpOwoKICAgIC8vIFBvcCBpbnN0cnVjdGlvbnMgZnJvbSBleHBlY3RlZElucHV0cyB1bnRpbCBpbnN0cnVjdGlvbiBpcyBmb3VuZC4KICAgIC8vIFJldHVybiB0cnVlIGlmIGl0IGlzIGZvdW5kLCBvciBmYWxzZSBpZiBub3QuCiAgICBib29sIGZpbmRJbklucHV0c0FuZFBvcE5vbk1hdGNoaW5nKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgICBhc3NlcnQoIWlzRWZmZWN0aXZlbHlQdXJlKGluc3RydWN0aW9uKSk7CiAgICAgIHdoaWxlICghZXhwZWN0ZWRJbnB1dHMuaXNFbXB0eSkgewogICAgICAgIEhJbnN0cnVjdGlvbiBuZXh0SW5wdXQgPSBleHBlY3RlZElucHV0cy5yZW1vdmVMYXN0KCk7CiAgICAgICAgYXNzZXJ0KCFnZW5lcmF0ZUF0VXNlU2l0ZS5jb250YWlucyhuZXh0SW5wdXQpKTsKICAgICAgICBhc3NlcnQobmV4dElucHV0LnVzZWRCeS5sZW5ndGggPT0gMSk7CiAgICAgICAgaWYgKGlkZW50aWNhbChuZXh0SW5wdXQsIGluc3RydWN0aW9uKSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBibG9jay5sYXN0LmFjY2VwdCh0aGlzKTsKICAgIGZvciAoSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gYmxvY2subGFzdC5wcmV2aW91czsKICAgICAgICBpbnN0cnVjdGlvbiAhPSBudWxsOwogICAgICAgIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb24ucHJldmlvdXMpIHsKICAgICAgaWYgKGdlbmVyYXRlQXRVc2VTaXRlLmNvbnRhaW5zKGluc3RydWN0aW9uKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChpbnN0cnVjdGlvbi5pc0NvZGVNb3Rpb25JbnZhcmlhbnQoKSkgewogICAgICAgIG1hcmtBc0dlbmVyYXRlQXRVc2VTaXRlKGluc3RydWN0aW9uKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoaXNFZmZlY3RpdmVseVB1cmUoaW5zdHJ1Y3Rpb24pKSB7CiAgICAgICAgaWYgKHB1cmVJbnB1dHMuY29udGFpbnMoaW5zdHJ1Y3Rpb24pKSB7CiAgICAgICAgICB0cnlHZW5lcmF0ZUF0VXNlU2l0ZShpbnN0cnVjdGlvbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIElmIHRoZSBpbnB1dCBpcyBub3QgaW4gdGhlIFtwdXJlSW5wdXRzXSBzZXQsIGl0IGhhcyBub3QKICAgICAgICAgIC8vIGJlZW4gdmlzaXRlZCBvciBzaG91bGQgbm90IGJlIGdlbmVyYXRlZCBhdCB1c2Utc2l0ZS4gVGhlIG1vc3QKICAgICAgICAgIC8vIGxpa2VseSByZWFzb24gZm9yIHRoZSBsYXR0ZXIsIGlzIHRoYXQgdGhlIGluc3RydWN0aW9uIGlzIHVzZWQKICAgICAgICAgIC8vIGluIG1vcmUgdGhhbiBvbmUgbG9jYXRpb24uCiAgICAgICAgICAvLyBXZSBtdXN0IGVpdGhlciBjbGVhciB0aGUgZXhwZWN0ZWRJbnB1dHMsIG9yIG1vdmUgdGhlIHB1cmUKICAgICAgICAgIC8vIGluc3RydWN0aW9uJ3MgaW5wdXRzIGluIGZyb250IG9mIHRoZSBleGlzdGluZyBvbmVzLgogICAgICAgICAgLy8gRXhhbXBsZToKICAgICAgICAgIC8vICAgdDEgPSBmb28oKTsgIC8vIHNpZGUtZWZmZWN0LgogICAgICAgICAgLy8gICB0MiA9IGJhcigpOyAgLy8gc2lkZS1lZmZlY3QuCiAgICAgICAgICAvLyAgIHQzID0gcHVyZSh0Mik7ICAgIC8vIHVzZWQgbW9yZSB0aGFuIG9uY2UuCiAgICAgICAgICAvLyAgIGYodDEsIHQzKTsgICAvLyBleHBlY3RlZCBpbnB1dHMgb2YgJ2YnOiB0MS4KICAgICAgICAgIC8vICAgdXNlKHQzKTsKICAgICAgICAgIC8vCiAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBjbGVhciB0aGUgZXhwZWN0ZWQgaW5wdXRzIHdlIGVuZCB1cCBpbiBhIHNpdHVhdGlvbgogICAgICAgICAgLy8gd2hlcmUgcHVyZSBwdXNoZXMgInQyIiBvbiB0b3Agb2YgInQxIiBsZWFkaW5nIHRvOgogICAgICAgICAgLy8gICB0MyA9IHB1cmUoYmFyKCkpOwogICAgICAgICAgLy8gICBmKGZvbygpLCB0Myk7CiAgICAgICAgICAvLyAgIHVzZSh0Myk7CiAgICAgICAgICAvLwogICAgICAgICAgLy8gSWYgd2UgY2xlYXIgdGhlIGV4cGVjdGVkLWlucHV0cyBsaXN0IHdlIGhhdmUgdGhlIGNvcnJlY3QKICAgICAgICAgIC8vIG91dHB1dDoKICAgICAgICAgIC8vICAgdDEgPSBmb28oKTsKICAgICAgICAgIC8vICAgdDMgPSBwdXJlKGJhcigpKTsKICAgICAgICAgIC8vICAgZih0MSwgdDMpOwogICAgICAgICAgLy8gICB1c2UodDMpOwogICAgICAgICAgLy8KICAgICAgICAgIC8vIENsZWFyaW5nIGlzLCBob3dldmVyLCBub3Qgb3B0aW1hbC4KICAgICAgICAgIC8vIEV4YW1wbGU6CiAgICAgICAgICAvLyAgIHQxID0gZm9vKCk7ICAvLyB0MSBpcyBub3cgdXNlZCBieSBgcHVyZWAuCiAgICAgICAgICAvLyAgIHQyID0gYmFyKCk7ICAvLyB0MiBpcyBub3cgdXNlZCBieSBgZmAuCiAgICAgICAgICAvLyAgIHQzID0gcHVyZSh0MSk7CiAgICAgICAgICAvLyAgIGYodDIsIHQzKTsKICAgICAgICAgIC8vICAgdXNlKHQzKTsKICAgICAgICAgIC8vCiAgICAgICAgICAvLyBJZiB3ZSBjbGVhciB0aGUgZXhwZWN0ZWQtaW5wdXRzIHdlIGNhbid0IGdlbmVyYXRlLWF0LXVzZSBhbnkgb2YKICAgICAgICAgIC8vIHRoZSBpbnN0cnVjdGlvbnMuCiAgICAgICAgICAvLwogICAgICAgICAgLy8gVGhlIG9wdGltYWwgc29sdXRpb24gaXMgdG8gbW92ZSB0aGUgaW5wdXRzIG9mICdwdXJlJyBpbgogICAgICAgICAgLy8gZnJvbnQgb2YgdGhlIGV4cGVjdGVkSW5wdXRzIGxpc3QuIFRoaXMgbWFrZXMgc2Vuc2UsIHNpbmNlIHdlCiAgICAgICAgICAvLyBwdXNoIGV4cGVjdGVkLWlucHV0cyBmcm9tIGxlZnQtdG8gcmlnaHQsIGFuZCB0aGUgYHB1cmVgIGZ1bmN0aW9uCiAgICAgICAgICAvLyBpbnZvY2F0aW9uIGlzICJtb3JlIGxlZnQiIChpLmUuIGJlZm9yZSkgdGhlIGZpcnN0IGFyZ3VtZW50IG9mIGBmYC4KICAgICAgICAgIC8vIFdpdGggdGhhdCBhcHByb2FjaCB3ZSBlbmQgdXAgd2l0aDoKICAgICAgICAgIC8vICAgdDMgPSBwdXJlKGZvbygpKTsKICAgICAgICAgIC8vICAgZihiYXIoKSwgdDMpOwogICAgICAgICAgLy8gICB1c2UodDMpOwogICAgICAgICAgLy8KICAgICAgICAgIGludCBvbGRMZW5ndGggPSBleHBlY3RlZElucHV0cy5sZW5ndGg7CiAgICAgICAgICBpbnN0cnVjdGlvbi5hY2NlcHQodGhpcyk7CiAgICAgICAgICBpZiAob2xkTGVuZ3RoICE9IDAgJiYgb2xkTGVuZ3RoICE9IGV4cGVjdGVkSW5wdXRzLmxlbmd0aCkgewogICAgICAgICAgICAvLyBNb3ZlIHRoZSBwdXJlIGluc3RydWN0aW9uJ3MgaW5wdXRzIHRvIHRoZSBmcm9udC4KICAgICAgICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IG5ld0lucHV0cyA9IGV4cGVjdGVkSW5wdXRzLnN1Ymxpc3Qob2xkTGVuZ3RoKTsKICAgICAgICAgICAgaW50IG5ld0NvdW50ID0gbmV3SW5wdXRzLmxlbmd0aDsKICAgICAgICAgICAgZXhwZWN0ZWRJbnB1dHMuc2V0UmFuZ2UoCiAgICAgICAgICAgICAgICBuZXdDb3VudCwgbmV3Q291bnQgKyBvbGRMZW5ndGgsIGV4cGVjdGVkSW5wdXRzKTsKICAgICAgICAgICAgZXhwZWN0ZWRJbnB1dHMuc2V0UmFuZ2UoMCwgbmV3Q291bnQsIG5ld0lucHV0cyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmIChmaW5kSW5JbnB1dHNBbmRQb3BOb25NYXRjaGluZyhpbnN0cnVjdGlvbikpIHsKICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGluc3RydWN0aW9uIGlzIHRoZSBuZXh0IG5vbi10cml2aWFsCiAgICAgICAgICAvLyBleHBlY3RlZCBpbnB1dC4KICAgICAgICAgIHRyeUdlbmVyYXRlQXRVc2VTaXRlKGluc3RydWN0aW9uKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXNzZXJ0KGV4cGVjdGVkSW5wdXRzLmlzRW1wdHkpOwogICAgICAgIH0KICAgICAgICBpbnN0cnVjdGlvbi5hY2NlcHQodGhpcyk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoYmxvY2sucHJlZGVjZXNzb3JzLmxlbmd0aCA9PSAxICYmCiAgICAgICAgaXNCbG9ja1NpbmdsZVByZWRlY2Vzc29yKGJsb2NrLnByZWRlY2Vzc29yc1swXSkpIHsKICAgICAgYXNzZXJ0KGJsb2NrLnBoaXMuaXNFbXB0eSk7CiAgICAgIHRyeU1lcmdpbmdFeHByZXNzaW9ucyhibG9jay5wcmVkZWNlc3NvcnNbMF0pOwogICAgfSBlbHNlIHsKICAgICAgZXhwZWN0ZWRJbnB1dHMgPSBudWxsOwogICAgICBwdXJlSW5wdXRzID0gbnVsbDsKICAgIH0KICB9Cn0KCi8vLyAgRGV0ZWN0IGNvbnRyb2wgZmxvdyBhcmlzaW5nIGZyb20gc2hvcnQtY2lyY3VpdCBsb2dpY2FsIGFuZAovLy8gIGNvbmRpdGlvbmFsIG9wZXJhdG9ycywgYW5kIHByZXBhcmUgdGhlIHByb2dyYW0gdG8gYmUgZ2VuZXJhdGVkCi8vLyAgdXNpbmcgdGhlc2Ugb3BlcmF0b3JzIGluc3RlYWQgb2YgbmVzdGVkIGlmcyBhbmQgYm9vbGVhbiB2YXJpYWJsZXMuCmNsYXNzIFNzYUNvbmRpdGlvbk1lcmdlciBleHRlbmRzIEhHcmFwaFZpc2l0b3Igd2l0aCBDb2RlZ2VuUGhhc2UgewogIFNldDxISW5zdHJ1Y3Rpb24+IGdlbmVyYXRlQXRVc2VTaXRlOwogIFNldDxISW5zdHJ1Y3Rpb24+IGNvbnRyb2xGbG93T3BlcmF0b3JzOwoKICB2b2lkIG1hcmtBc0dlbmVyYXRlQXRVc2VTaXRlKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgYXNzZXJ0KCFpbnN0cnVjdGlvbi5pc0pzU3RhdGVtZW50KCkpOwogICAgZ2VuZXJhdGVBdFVzZVNpdGUuYWRkKGluc3RydWN0aW9uKTsKICB9CgogIFNzYUNvbmRpdGlvbk1lcmdlcih0aGlzLmdlbmVyYXRlQXRVc2VTaXRlLCB0aGlzLmNvbnRyb2xGbG93T3BlcmF0b3JzKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEdyYXBoKEhHcmFwaCBncmFwaCkgewogICAgdmlzaXRQb3N0RG9taW5hdG9yVHJlZShncmFwaCk7CiAgfQoKICAvLy8gQ2hlY2sgaWYgYSBibG9jayBoYXMgYXQgbGVhc3Qgb25lIHN0YXRlbWVudCBvdGhlciB0aGFuCiAgLy8vIFtpbnN0cnVjdGlvbl0uCiAgYm9vbCBoYXNBbnlTdGF0ZW1lbnQoSEJhc2ljQmxvY2sgYmxvY2ssIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgLy8gSWYgW2luc3RydWN0aW9uXSBpcyBub3QgaW4gW2Jsb2NrXSwgdGhlbiBpZiB0aGUgYmxvY2sgaXMgbm90CiAgICAvLyBlbXB0eSwgd2Uga25vdyB0aGVyZSB3aWxsIGJlIGEgc3RhdGVtZW50IHRvIGVtaXQuCiAgICBpZiAoIWlkZW50aWNhbChpbnN0cnVjdGlvbi5ibG9jaywgYmxvY2spKSB7CiAgICAgIHJldHVybiAhaWRlbnRpY2FsKGJsb2NrLmxhc3QsIGJsb2NrLmZpcnN0KTsKICAgIH0KCiAgICAvLyBJZiBbaW5zdHJ1Y3Rpb25dIGlzIG5vdCB0aGUgbGFzdCBpbnN0cnVjdGlvbiBvZiB0aGUgYmxvY2sKICAgIC8vIGJlZm9yZSB0aGUgY29udHJvbCBmbG93IGluc3RydWN0aW9uLCBvciB0aGUgbGFzdCBpbnN0cnVjdGlvbiwKICAgIC8vIHRoZW4gd2Ugd2lsbCBoYXZlIHRvIGVtaXQgYSBzdGF0ZW1lbnQgZm9yIHRoYXQgbGFzdCBpbnN0cnVjdGlvbi4KICAgIGlmIChpbnN0cnVjdGlvbiAhPSBibG9jay5sYXN0ICYmCiAgICAgICAgIWlkZW50aWNhbChpbnN0cnVjdGlvbiwgYmxvY2subGFzdC5wcmV2aW91cykpIHJldHVybiB0cnVlOwoKICAgIC8vIElmIG9uZSBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBibG9jayB1bnRpbCBbaW5zdHJ1Y3Rpb25dIGlzCiAgICAvLyBub3QgZ2VuZXJhdGVkIGF0IHVzZSBzaXRlLCB0aGVuIHdlIHdpbGwgaGF2ZSB0byBlbWl0IGEKICAgIC8vIHN0YXRlbWVudCBmb3IgaXQuCiAgICAvLyBUT0RPKG5nZW9mZnJheSk6IHdlIGNvdWxkIGdlbmVyYXRlIGEgY29tbWEgc2VwYXJhdGVkCiAgICAvLyBsaXN0IG9mIGV4cHJlc3Npb25zLgogICAgZm9yIChISW5zdHJ1Y3Rpb24gdGVtcCA9IGJsb2NrLmZpcnN0OwogICAgICAgICFpZGVudGljYWwodGVtcCwgaW5zdHJ1Y3Rpb24pOwogICAgICAgIHRlbXAgPSB0ZW1wLm5leHQpIHsKICAgICAgaWYgKCFnZW5lcmF0ZUF0VXNlU2l0ZS5jb250YWlucyh0ZW1wKSkgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgYm9vbCBpc1NhZmVUb0dlbmVyYXRlQXRVc2VTaXRlKEhJbnN0cnVjdGlvbiB1c2VyLCBISW5zdHJ1Y3Rpb24gaW5wdXQpIHsKICAgIC8vIEhDcmVhdGUgZXZhbHVhdGVzIGFyZ3VtZW50cyBpbiBvcmRlciBhbmQgcGFzc2VzIHRoZW0gdG8gYSBjb25zdHJ1Y3Rvci4KICAgIGlmICh1c2VyIGlzIEhDcmVhdGUpIHJldHVybiB0cnVlOwogICAgLy8gQSBbSEZvcmVpZ25dIGluc3RydWN0aW9uIHVzZXMgb3BlcmF0b3JzIGFuZCBpZiB3ZSBnZW5lcmF0ZSBbaW5wdXRdIGF0IHVzZQogICAgLy8gc2l0ZSwgdGhlIHByZWNlZGVuY2Ugb3IgZXZhbHVhdGlvbiBvcmRlciBtaWdodCBiZSB3cm9uZy4KICAgIGlmICh1c2VyIGlzIEhGb3JlaWduKSByZXR1cm4gZmFsc2U7CiAgICAvLyBBIFtIQ2hlY2tdIGluc3RydWN0aW9uIHdpdGggY29udHJvbCBmbG93IHVzZXMgaXRzIGlucHV0CiAgICAvLyBtdWx0aXBsZSB0aW1lcywgc28gd2UgYXZvaWQgZ2VuZXJhdGluZyBpdCBhdCB1c2Ugc2l0ZS4KICAgIGlmICh1c2VyIGlzIEhDaGVjayAmJiB1c2VyLmlzQ29udHJvbEZsb3coKSkgcmV0dXJuIGZhbHNlOwogICAgLy8gQSBbSElzXSBpbnN0cnVjdGlvbiB1c2VzIGl0cyBpbnB1dCBtdWx0aXBsZSB0aW1lcywgc28gd2UKICAgIC8vIGF2b2lkIGdlbmVyYXRpbmcgaXQgYXQgdXNlIHNpdGUuCiAgICBpZiAodXNlciBpcyBISXMpIHJldHVybiBmYWxzZTsKICAgIC8vIEF2b2lkIGNvZGUgbW90aW9uIGludG8gYSBsb29wLgogICAgcmV0dXJuIHVzZXIuaGFzU2FtZUxvb3BIZWFkZXJBcyhpbnB1dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QmFzaWNCbG9jayhIQmFzaWNCbG9jayBibG9jaykgewogICAgaWYgKGJsb2NrLmxhc3QgaXMhIEhJZikgcmV0dXJuOwogICAgSElmIHN0YXJ0SWYgPSBibG9jay5sYXN0OwogICAgSEJhc2ljQmxvY2sgZW5kID0gc3RhcnRJZi5qb2luQmxvY2s7CgogICAgLy8gV2UgY2hlY2sgdGhhdCB0aGUgc3RydWN0dXJlIGlzIHRoZSBmb2xsb3dpbmc6CiAgICAvLyAgICAgICAgIElmCiAgICAvLyAgICAgICAvICAgIFwKICAgIC8vICAgICAgLyAgICAgIFwKICAgIC8vICAgMSBleHByICAgIGdvdG8KICAgIC8vICAgIGdvdG8gICAgIC8KICAgIC8vICAgICAgXCAgICAgLwogICAgLy8gICAgICAgXCAgIC8KICAgIC8vIHBoaShleHByLCB0cnVlfGZhbHNlKQogICAgLy8KICAgIC8vIGFuZCB0aGUgc2FtZSBmb3IgbmVzdGVkIG5vZGVzOgogICAgLy8KICAgIC8vICAgICAgICAgICAgSWYKICAgIC8vICAgICAgICAgIC8gICAgXAogICAgLy8gICAgICAgICAvICAgICAgXAogICAgLy8gICAgICAxIGV4cHIxICAgIFwKICAgIC8vICAgICAgIElmICAgICAgICAgXAogICAgLy8gICAgICAvICBcICAgICAgICAgXAogICAgLy8gICAgIC8gICAgXCAgICAgICAgIGdvdG8KICAgIC8vICAxIGV4cHIyICAgICAgICAgICAgfAogICAgLy8gICAgZ290byAgICBnb3RvICAgICB8CiAgICAvLyAgICAgIFwgICAgIC8gICAgICAgIHwKICAgIC8vICAgICAgIFwgICAvICAgICAgICAgfAogICAgLy8gICBwaGkxKGV4cHIyLCB0cnVlfGZhbHNlKQogICAgLy8gICAgICAgICAgXCAgICAgICAgICB8CiAgICAvLyAgICAgICAgICAgXCAgICAgICAgIHwKICAgIC8vICAgICAgICAgICAgIHBoaShwaGkxLCB0cnVlfGZhbHNlKQoKICAgIGlmIChlbmQgPT0gbnVsbCkgcmV0dXJuOwogICAgaWYgKGVuZC5waGlzLmlzRW1wdHkpIHJldHVybjsKICAgIGlmICghaWRlbnRpY2FsKGVuZC5waGlzLmZpcnN0LCBlbmQucGhpcy5sYXN0KSkgcmV0dXJuOwogICAgSEJhc2ljQmxvY2sgZWxzZUJsb2NrID0gc3RhcnRJZi5lbHNlQmxvY2s7CgogICAgaWYgKCFpZGVudGljYWwoZW5kLnByZWRlY2Vzc29yc1sxXSwgZWxzZUJsb2NrKSkgcmV0dXJuOwogICAgSFBoaSBwaGkgPSBlbmQucGhpcy5maXJzdDsKICAgIEhJbnN0cnVjdGlvbiB0aGVuSW5wdXQgPSBwaGkuaW5wdXRzWzBdOwogICAgSEluc3RydWN0aW9uIGVsc2VJbnB1dCA9IHBoaS5pbnB1dHNbMV07CiAgICBpZiAodGhlbklucHV0LmlzSnNTdGF0ZW1lbnQoKSB8fCBlbHNlSW5wdXQuaXNKc1N0YXRlbWVudCgpKSByZXR1cm47CgogICAgaWYgKGhhc0FueVN0YXRlbWVudChlbHNlQmxvY2ssIGVsc2VJbnB1dCkpIHJldHVybjsKICAgIGFzc2VydChlbHNlQmxvY2suc3VjY2Vzc29ycy5sZW5ndGggPT0gMSk7CiAgICBhc3NlcnQoZW5kLnByZWRlY2Vzc29ycy5sZW5ndGggPT0gMik7CgogICAgSEJhc2ljQmxvY2sgdGhlbkJsb2NrID0gc3RhcnRJZi50aGVuQmxvY2s7CiAgICAvLyBTa2lwIHRyaXZpYWwgZ290byBibG9ja3MuCiAgICB3aGlsZSAodGhlbkJsb2NrLnN1Y2Nlc3NvcnNbMF0gIT0gZW5kICYmIHRoZW5CbG9jay5maXJzdCBpcyBIR290bykgewogICAgICB0aGVuQmxvY2sgPSB0aGVuQmxvY2suc3VjY2Vzc29yc1swXTsKICAgIH0KCiAgICAvLyBJZiB0aGUgW3RoZW5CbG9ja10gaXMgYWxyZWFkeSBhIGNvbnRyb2wgZmxvdyBvcGVyYXRpb24sIGFuZCBkb2VzIG5vdAogICAgLy8gaGF2ZSBhbnkgc3RhdGVtZW50IGFuZCBpdHMgam9pbiBibG9jayBpcyBbZW5kXSwgd2UgY2FuIGVtaXQgYQogICAgLy8gc2VxdWVuY2Ugb2YgY29udHJvbCBmbG93IG9wZXJhdGlvbi4KICAgIGlmIChjb250cm9sRmxvd09wZXJhdG9ycy5jb250YWlucyh0aGVuQmxvY2subGFzdCkpIHsKICAgICAgSElmIG90aGVySWYgPSB0aGVuQmxvY2subGFzdDsKICAgICAgaWYgKCFpZGVudGljYWwob3RoZXJJZi5qb2luQmxvY2ssIGVuZCkpIHsKICAgICAgICAvLyBUaGlzIGNvdWxkIGJlIGEgam9pbiBibG9jayB0aGF0IGp1c3QgZmVlZHMgaW50byBvdXIgam9pbiBibG9jay4KICAgICAgICBIQmFzaWNCbG9jayBvdGhlckpvaW4gPSBvdGhlcklmLmpvaW5CbG9jazsKICAgICAgICBpZiAob3RoZXJKb2luLmZpcnN0ICE9IG90aGVySm9pbi5sYXN0KSByZXR1cm47CiAgICAgICAgaWYgKG90aGVySm9pbi5zdWNjZXNzb3JzLmxlbmd0aCAhPSAxKSByZXR1cm47CiAgICAgICAgaWYgKG90aGVySm9pbi5zdWNjZXNzb3JzWzBdICE9IGVuZCkgcmV0dXJuOwogICAgICAgIGlmIChvdGhlckpvaW4ucGhpcy5pc0VtcHR5KSByZXR1cm47CiAgICAgICAgaWYgKCFpZGVudGljYWwob3RoZXJKb2luLnBoaXMuZmlyc3QsIG90aGVySm9pbi5waGlzLmxhc3QpKSByZXR1cm47CiAgICAgICAgSFBoaSBvdGhlclBoaSA9IG90aGVySm9pbi5waGlzLmZpcnN0OwogICAgICAgIGlmICh0aGVuSW5wdXQgIT0gb3RoZXJQaGkpIHJldHVybjsKICAgICAgICBpZiAoZWxzZUlucHV0ICE9IG90aGVyUGhpLmlucHV0c1sxXSkgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChoYXNBbnlTdGF0ZW1lbnQodGhlbkJsb2NrLCBvdGhlcklmKSkgcmV0dXJuOwogICAgfSBlbHNlIHsKICAgICAgaWYgKCFpZGVudGljYWwoZW5kLnByZWRlY2Vzc29yc1swXSwgdGhlbkJsb2NrKSkgcmV0dXJuOwogICAgICBpZiAoaGFzQW55U3RhdGVtZW50KHRoZW5CbG9jaywgdGhlbklucHV0KSkgcmV0dXJuOwogICAgICBhc3NlcnQodGhlbkJsb2NrLnN1Y2Nlc3NvcnMubGVuZ3RoID09IDEpOwogICAgfQoKICAgIC8vIEZyb20gbm93IG9uLCB3ZSBoYXZlIHJlY29nbml6ZWQgYSBjb250cm9sIGZsb3cgb3BlcmF0aW9uIGJ1aWx0IGZyb20KICAgIC8vIHRoZSBidWlsZGVyLiBNYXJrIHRoZSBpZiBpbnN0cnVjdGlvbiBhcyBzdWNoLgogICAgY29udHJvbEZsb3dPcGVyYXRvcnMuYWRkKHN0YXJ0SWYpOwoKICAgIC8vIEZpbmQgdGhlIG5leHQgbm9uLUhHb3RvIGluc3RydWN0aW9uIGZvbGxvd2luZyB0aGUgcGhpLgogICAgSEluc3RydWN0aW9uIG5leHRJbnN0cnVjdGlvbiA9IHBoaS5ibG9jay5maXJzdDsKICAgIHdoaWxlIChuZXh0SW5zdHJ1Y3Rpb24gaXMgSEdvdG8pIHsKICAgICAgbmV4dEluc3RydWN0aW9uID0gbmV4dEluc3RydWN0aW9uLmJsb2NrLnN1Y2Nlc3NvcnNbMF0uZmlyc3Q7CiAgICB9CgogICAgLy8gSWYgdGhlIG9wZXJhdGlvbiBpcyBvbmx5IHVzZWQgYnkgdGhlIGZpcnN0IGluc3RydWN0aW9uCiAgICAvLyBvZiBpdHMgYmxvY2sgYW5kIGlzIHNhZmUgdG8gYmUgZ2VuZXJhdGVkIGF0IHVzZSBzaXRlLCBtYXJrIGl0CiAgICAvLyBzby4KICAgIGlmIChwaGkudXNlZEJ5Lmxlbmd0aCA9PSAxICYmCiAgICAgICAgcGhpLnVzZWRCeVswXSA9PSBuZXh0SW5zdHJ1Y3Rpb24gJiYKICAgICAgICBpc1NhZmVUb0dlbmVyYXRlQXRVc2VTaXRlKHBoaS51c2VkQnlbMF0sIHBoaSkpIHsKICAgICAgbWFya0FzR2VuZXJhdGVBdFVzZVNpdGUocGhpKTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKGVsc2VJbnB1dC5ibG9jaywgZWxzZUJsb2NrKSkgewogICAgICBhc3NlcnQoZWxzZUlucHV0LnVzZWRCeS5sZW5ndGggPT0gMSk7CiAgICAgIG1hcmtBc0dlbmVyYXRlQXRVc2VTaXRlKGVsc2VJbnB1dCk7CiAgICB9CgogICAgLy8gSWYgW3RoZW5JbnB1dF0gaXMgZGVmaW5lZCBpbiB0aGUgZmlyc3QgcHJlZGVjZXNzb3IsIHRoZW4gaXQgaXMgb25seSB1c2VkCiAgICAvLyBieSBbcGhpXSBhbmQgY2FuIGJlIGdlbmVyYXRlZCBhdCB1c2Ugc2l0ZS4KICAgIGlmIChpZGVudGljYWwodGhlbklucHV0LmJsb2NrLCBlbmQucHJlZGVjZXNzb3JzWzBdKSkgewogICAgICBhc3NlcnQodGhlbklucHV0LnVzZWRCeS5sZW5ndGggPT0gMSk7CiAgICAgIG1hcmtBc0dlbmVyYXRlQXRVc2VTaXRlKHRoZW5JbnB1dCk7CiAgICB9CiAgfQp9CgovLy8gSW5zZXJ0ICdjYWNoZXMnIGZvciB3aG9sZS1mdW5jdGlvbiByZWdpb24tY29uc3RhbnRzIHdoZW4gdGhlIGxvY2FsIG1pbmlmaWVkCi8vLyBuYW1lIHdvdWxkIGJlIHNob3J0ZXIgdGhhbiByZXBlYXRlZCByZWZlcmVuY2VzLiAgVGhlc2UgYXJlIGNhY2hlcyBmb3IgJ3RoaXMnCi8vLyBhbmQgY29uc3RhbnQgdmFsdWVzLgpjbGFzcyBTc2FTaGFyZVJlZ2lvbkNvbnN0YW50cyBleHRlbmRzIEhCYXNlVmlzaXRvciB3aXRoIENvZGVnZW5QaGFzZSB7CiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwoKICBTc2FTaGFyZVJlZ2lvbkNvbnN0YW50cyh0aGlzLl9vcHRpb25zKTsKCiAgQG92ZXJyaWRlCiAgdmlzaXRHcmFwaChIR3JhcGggZ3JhcGgpIHsKICAgIC8vIFdlIG5lZWQgdGhlIGFzeW5jIHJld3JpdGUgdG8gYmUgc21hcnRlciBhYm91dCBob2lzdGluZyByZWdpb24gY29uc3RhbnRzCiAgICAvLyBiZWZvcmUgaXQgaXMgd29ydGgtd2hpbGUuCiAgICBpZiAoZ3JhcGgubmVlZHNBc3luY1Jld3JpdGUpIHJldHVybjsKCiAgICAvLyAnSFRoaXMnIGFuZCBjb25zdGFudHMgYXJlIGluIHRoZSBlbnRyeSBibG9jay4gTm8gbmVlZCB0byB3YWxrIHRoZSByZXN0IG9mCiAgICAvLyB0aGUgZ3JhcGguCiAgICB2aXNpdEJhc2ljQmxvY2soZ3JhcGguZW50cnkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRCYXNpY0Jsb2NrKEhCYXNpY0Jsb2NrIGJsb2NrKSB7CiAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSBibG9jay5maXJzdDsKICAgIHdoaWxlIChpbnN0cnVjdGlvbiAhPSBudWxsKSB7CiAgICAgIEhJbnN0cnVjdGlvbiBuZXh0ID0gaW5zdHJ1Y3Rpb24ubmV4dDsKICAgICAgaW5zdHJ1Y3Rpb24uYWNjZXB0KHRoaXMpOwogICAgICBpbnN0cnVjdGlvbiA9IG5leHQ7CiAgICB9CiAgfQoKICAvLyBOb3QgYWxsIG9jY3VycmVuY2VzIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIGEgbG9jYWwgdmFyaWFibGUgY2FjaGUsIHNvIHdlCiAgLy8gZmlsdGVyIHRoZSB1c2VzLgogIGludCBfY291bnRDYWNoZWFibGVVc2VzKAogICAgICBISW5zdHJ1Y3Rpb24gbm9kZSwgYm9vbCBGdW5jdGlvbihISW5zdHJ1Y3Rpb24pIGNhY2hlYWJsZSkgewogICAgcmV0dXJuIG5vZGUudXNlZEJ5LndoZXJlKGNhY2hlYWJsZSkubGVuZ3RoOwogIH0KCiAgLy8gUmVwbGFjZSBjYWNoZWFibGUgdXNlcyB3aXRoIGEgcmVmZXJlbmNlIHRvIGEgSExhdGVWYWx1ZSBub2RlLgogIF9jYWNoZSgKICAgICAgSEluc3RydWN0aW9uIG5vZGUsIGJvb2wgRnVuY3Rpb24oSEluc3RydWN0aW9uKSBjYWNoZWFibGUsIFN0cmluZyBuYW1lKSB7CiAgICB2YXIgdXNlcnMgPSBub2RlLnVzZWRCeS50b0xpc3QoKTsKICAgIHZhciByZWZlcmVuY2UgPSBuZXcgSExhdGVWYWx1ZShub2RlKTsKICAgIC8vIFRPRE8oc3JhKTogVGhlIHNvdXJjZUluZm9ybWF0aW9uIHNob3VsZCByZWFsbHkgYmUgZnJvbSB0aGUgZnVuY3Rpb24KICAgIC8vIGVudHJ5LCBub3QgdGhlIHVzZSBvZiBgdGhpc2AuCiAgICByZWZlcmVuY2Uuc291cmNlSW5mb3JtYXRpb24gPSBub2RlLnNvdXJjZUluZm9ybWF0aW9uOwogICAgcmVmZXJlbmNlLnNvdXJjZUVsZW1lbnQgPSBfRXhwcmVzc2lvbk5hbWUobmFtZSk7CiAgICBub2RlLmJsb2NrLmFkZEFmdGVyKG5vZGUsIHJlZmVyZW5jZSk7CiAgICBmb3IgKEhJbnN0cnVjdGlvbiB1c2VyIGluIHVzZXJzKSB7CiAgICAgIGlmIChjYWNoZWFibGUodXNlcikpIHsKICAgICAgICB1c2VyLmNoYW5nZVVzZShub2RlLCByZWZlcmVuY2UpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VGhpcyhIVGhpcyBub2RlKSB7CiAgICBpbnQgc2l6ZSA9IDQ7CiAgICAvLyBDb21wYXJlIHRoZSBzaXplIG9mIHRoZSB1bmNoYW5nZWQgbWluaWZpZWQgd2l0aCB0aGUgc2l6ZSBvZiB0aGUgbWluaWZpZWQKICAgIC8vIGNvZGUgd2hlcmUgJ3RoaXMnIGlzIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUuIFdlIGFzc3VtZSB0aGUgdmFyaWFibGUgaGFzCiAgICAvLyBtaW5pZmllZCBzaXplIDEuCiAgICAvLwogICAgLy8gVGhlIHNpemUgb3ZlcmhlYWQgb2YgaW50cm9kdWNpbmcgYSB2YXJpYWJsZSBpbiB0aGUgd29yc3QgY2FzZSBpbmNsdWRlcwogICAgLy8gJ3ZhciAnOgogICAgLy8KICAgIC8vICAgICAgICAgICAxMjM0ICAgLy8gc2l6ZQogICAgLy8gICAgIHZhciB4PXRoaXM7ICAvLyAobWluaWZpZWQgJzsnIGNhbiBiZSBlbmQtb2YtbGluZSkKICAgIC8vICAgICAxMjM0NTYgICAgNyAgLy8gYWRkaXRpb25hbCBvdmVyaGVhZAogICAgLy8KICAgIC8vIFRPRE8oc3JhKTogSWYgdGhlcmUgYXJlIG11bHRpcGxlIHZhbHVlcyB0aGF0IGNhbiBwb3RlbnRpYWxseSBiZSBjYWNoZWQsCiAgICAvLyB0aGV5IGNhbiBzaGFyZSB0aGUgJ3ZhciAnIGNvc3QsIGV2ZW4gaWYgbm9uZSBvZiB0aGVtIGFyZSBiZW5lZmljaWFsCiAgICAvLyBpbmRpdmlkdWFsbHkuCiAgICBpbnQgdXNlQ291bnQgPSBub2RlLnVzZWRCeS5sZW5ndGg7CiAgICBpZiAodXNlQ291bnQgKiBzaXplIDw9IDcgKyBzaXplICsgdXNlQ291bnQgKiAxKSByZXR1cm47CiAgICBfY2FjaGUobm9kZSwgKF8pID0+IHRydWUsICdfdGhpcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbnN0YW50KEhDb25zdGFudCBub2RlKSB7CiAgICBpZiAobm9kZS51c2VkQnkubGVuZ3RoIDw9IDEpIHJldHVybjsKICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnQgPSBub2RlLmNvbnN0YW50OwoKICAgIGlmIChjb25zdGFudC5pc051bGwpIHsKICAgICAgX2hhbmRsZU51bGwobm9kZSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoY29uc3RhbnQuaXNJbnQpIHsKICAgICAgX2hhbmRsZUludChub2RlLCBjb25zdGFudCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoY29uc3RhbnQuaXNTdHJpbmcpIHsKICAgICAgX2hhbmRsZVN0cmluZyhub2RlLCBjb25zdGFudCk7CiAgICAgIHJldHVybjsKICAgIH0KICB9CgogIHZvaWQgX2hhbmRsZU51bGwoSENvbnN0YW50IG5vZGUpIHsKICAgIGludCBzaXplID0gNDsKCiAgICBib29sIF9pc0NhY2hlYWJsZVVzZShISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgICAgLy8gT25lLXNob3QgaW50ZXJjZXB0b3JzIGhhdmUgYG51bGxgIGFzIGEgZHVtbXkgaW50ZXJjZXB0b3IuCiAgICAgIGlmIChpbnN0cnVjdGlvbiBpcyBIT25lU2hvdEludGVyY2VwdG9yKSByZXR1cm4gZmFsc2U7CgogICAgICBpZiAoaW5zdHJ1Y3Rpb24gaXMgSEludm9rZSkgcmV0dXJuIHRydWU7CiAgICAgIGlmIChpbnN0cnVjdGlvbiBpcyBIQ3JlYXRlKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKGluc3RydWN0aW9uIGlzIEhQaGkpIHJldHVybiB0cnVlOwoKICAgICAgLy8gV2UgcmV0dXJuIGBudWxsYCBieSByZW1vdmluZyB0aGUgcmV0dXJuIGV4cHJlc3Npb24gb3Igc3RhdGVtZW50LgogICAgICBpZiAoaW5zdHJ1Y3Rpb24gaXMgSFJldHVybikgcmV0dXJuIGZhbHNlOwoKICAgICAgLy8gSmF2YVNjcmlwdCBgeCA9PSBudWxsYCBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGB4ID09IF9udWxsYC4KICAgICAgaWYgKGluc3RydWN0aW9uIGlzIEhJZGVudGl0eSkgcmV0dXJuIGZhbHNlOwoKICAgICAgLy8gVE9ETyhzcmEpOiBEZXRlcm1pbmUgaWYgb3RoZXIgdXNlcyByZXN1bHQgaW4gZmFzdGVyIEphdmFTY3JpcHQgY29kZS4KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGludCB1c2VDb3VudCA9IF9jb3VudENhY2hlYWJsZVVzZXMobm9kZSwgX2lzQ2FjaGVhYmxlVXNlKTsKICAgIGlmICh1c2VDb3VudCAqIHNpemUgPD0gNyArIHNpemUgKyB1c2VDb3VudCAqIDEpIHJldHVybjsKICAgIF9jYWNoZShub2RlLCBfaXNDYWNoZWFibGVVc2UsICdfbnVsbCcpOwogICAgcmV0dXJuOwogIH0KCiAgdm9pZCBfaGFuZGxlSW50KEhDb25zdGFudCBub2RlLCBJbnRDb25zdGFudFZhbHVlIGludENvbnN0YW50KSB7CiAgICBCaWdJbnQgdmFsdWUgPSBpbnRDb25zdGFudC5pbnRWYWx1ZTsKICAgIFN0cmluZyB0ZXh0ID0gdmFsdWUudG9TdHJpbmcoKTsKICAgIGludCBzaXplID0gdGV4dC5sZW5ndGg7CiAgICBpZiAoc2l6ZSA8PSAzKSByZXR1cm47CgogICAgYm9vbCBfaXNDYWNoZWFibGVVc2UoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICAgIGlmIChpbnN0cnVjdGlvbiBpcyBISW52b2tlKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKGluc3RydWN0aW9uIGlzIEhDcmVhdGUpIHJldHVybiB0cnVlOwogICAgICBpZiAoaW5zdHJ1Y3Rpb24gaXMgSFJldHVybikgcmV0dXJuIHRydWU7CiAgICAgIGlmIChpbnN0cnVjdGlvbiBpcyBIUGhpKSByZXR1cm4gdHJ1ZTsKCiAgICAgIC8vIEphdmFTY3JpcHQgYHggPT09IDVgIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gYHggPT09IF81YC4KICAgICAgaWYgKGluc3RydWN0aW9uIGlzIEhJZGVudGl0eSkgcmV0dXJuIGZhbHNlOwoKICAgICAgLy8gRm9yZWlnbiBjb2RlIHRlbXBsYXRlcyBtYXkgdXNlIGxpdGVyYWxzIGluIHdheXMgdGhhdCBhcmUgYmVuZWZpY2lhbC4KICAgICAgaWYgKGluc3RydWN0aW9uIGlzIEhGb3JlaWduQ29kZSkgcmV0dXJuIGZhbHNlOwoKICAgICAgLy8gVE9ETyhzcmEpOiBEZXRlcm1pbmUgaWYgb3RoZXIgdXNlcyByZXN1bHQgaW4gZmFzdGVyIEphdmFTY3JpcHQgY29kZS4KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGludCB1c2VDb3VudCA9IF9jb3VudENhY2hlYWJsZVVzZXMobm9kZSwgX2lzQ2FjaGVhYmxlVXNlKTsKICAgIGlmICh1c2VDb3VudCAqIHNpemUgPD0gNyArIHNpemUgKyB1c2VDb3VudCAqIDEpIHJldHVybjsKICAgIF9jYWNoZShub2RlLCBfaXNDYWNoZWFibGVVc2UsICdfJHt0ZXh0LnJlcGxhY2VGaXJzdCgiLSIsICJfIil9Jyk7CiAgfQoKICB2b2lkIF9oYW5kbGVTdHJpbmcoSENvbnN0YW50IG5vZGUsIFN0cmluZ0NvbnN0YW50VmFsdWUgc3RyaW5nQ29uc3RhbnQpIHsKICAgIFN0cmluZyB2YWx1ZSA9IHN0cmluZ0NvbnN0YW50LnN0cmluZ1ZhbHVlOwogICAgaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDsKICAgIGludCBzaXplID0gbGVuZ3RoICsgMjsgLy8gSW5jbHVkZSBxdW90ZXMuCiAgICBpZiAoc2l6ZSA8PSAyKSByZXR1cm47CgogICAgYm9vbCBfaXNDYWNoZWFibGVVc2UoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICAgIC8vIEZvcmVpZ24gY29kZSB0ZW1wbGF0ZXMgbWF5IHVzZSBsaXRlcmFscyBpbiB3YXlzIHRoYXQgYXJlIGJlbmVmaWNpYWwuCiAgICAgIGlmIChpbnN0cnVjdGlvbiBpcyBIRm9yZWlnbkNvZGUpIHJldHVybiBmYWxzZTsKCiAgICAgIC8vIENhY2hlIGxhcmdlciBzdHJpbmdzIGV2ZW4gaWYgdW5mb3J0dW5hdGUuCiAgICAgIGlmIChsZW5ndGggPj0gMTYpIHJldHVybiB0cnVlOwoKICAgICAgaWYgKGluc3RydWN0aW9uIGlzIEhJbnZva2UpIHJldHVybiB0cnVlOwogICAgICBpZiAoaW5zdHJ1Y3Rpb24gaXMgSENyZWF0ZSkgcmV0dXJuIHRydWU7CiAgICAgIGlmIChpbnN0cnVjdGlvbiBpcyBIUmV0dXJuKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKGluc3RydWN0aW9uIGlzIEhQaGkpIHJldHVybiB0cnVlOwoKICAgICAgLy8gVE9ETyhzcmEpOiBDaGVjayBpZiBhLng9InMiIGNhbiBhdm9pZCBvciBzcGVjaWFsaXplIGEgd3JpdGUgYmFycmllci4KICAgICAgaWYgKGluc3RydWN0aW9uIGlzIEhGaWVsZFNldCkg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ZW5faGVscGVycy5kYXJ0OXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3NzYS92YXJpYWJsZV9hbGxvY2F0b3IuZGFydMAAXHYvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9qc19iYWNrZW5kLmRhcnQnOwppbXBvcnQgJ2NvZGVnZW4uZGFydCcgc2hvdyBDb2RlZ2VuUGhhc2U7CmltcG9ydCAnbm9kZXMuZGFydCc7CgovLy8gVGhlIFtMaXZlUmFuZ2VdIGNsYXNzIGNvdmVycyBhIHJhbmdlIHdoZXJlIGFuIGluc3RydWN0aW9uIGlzIGxpdmUuCmNsYXNzIExpdmVSYW5nZSB7CiAgZmluYWwgaW50IHN0YXJ0OwogIC8vIFtlbmRdIGlzIG5vdCBmaW5hbCBiZWNhdXNlIGl0IGNhbiBiZSB1cGRhdGVkIGR1ZSB0byBsb29wcy4KICBpbnQgZW5kOwogIExpdmVSYW5nZSh0aGlzLnN0YXJ0LCB0aGlzLmVuZCkgewogICAgYXNzZXJ0KHN0YXJ0IDw9IGVuZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnWyRzdGFydCAkZW5kWyc7Cn0KCi8vLyBUaGUgW0xpdmVJbnRlcnZhbF0gY2xhc3MgY29udGFpbnMgdGhlIGxpc3Qgb2YgcmFuZ2VzIHdoZXJlIGFuCi8vLyBpbnN0cnVjdGlvbiBpcyBsaXZlLgpjbGFzcyBMaXZlSW50ZXJ2YWwgewogIC8vLyBUaGUgaWQgd2hlcmUgdGhlIGluc3RydWN0aW9uIGlzIGRlZmluZWQuCiAgaW50IHN0YXJ0OwogIGZpbmFsIExpc3Q8TGl2ZVJhbmdlPiByYW5nZXM7CiAgTGl2ZUludGVydmFsKCkgOiByYW5nZXMgPSA8TGl2ZVJhbmdlPltdOwoKICAvLyBXZSB3YW50IFtIQ2hlY2tdIGluc3RydWN0aW9ucyB0byBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgdGhlCiAgLy8gaW5zdHJ1Y3Rpb24gaXQgY2hlY2tzLCBzbyBib3RoIGluc3RydWN0aW9ucyBzaG91bGQgc2hhcmUgdGhlIHNhbWUKICAvLyBsaXZlIHJhbmdlcy4KICBMaXZlSW50ZXJ2YWwuZm9yQ2hlY2sodGhpcy5zdGFydCwgTGl2ZUludGVydmFsIGNoZWNrZWRJbnRlcnZhbCkKICAgICAgOiByYW5nZXMgPSBjaGVja2VkSW50ZXJ2YWwucmFuZ2VzOwoKICAvLy8gVXBkYXRlIGFsbCByYW5nZXMgdGhhdCBhcmUgY29udGFpbmVkIGluIFtmcm9tLCB0b1sgdG8KICAvLy8gZGllIGF0IFt0b10uCiAgdm9pZCBsb29wVXBkYXRlKGludCBmcm9tLCBpbnQgdG8pIHsKICAgIGZvciAoTGl2ZVJhbmdlIHJhbmdlIGluIHJhbmdlcykgewogICAgICBpZiAoZnJvbSA8PSByYW5nZS5zdGFydCAmJiByYW5nZS5lbmQgPCB0bykgewogICAgICAgIHJhbmdlLmVuZCA9IHRvOwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gQWRkIGEgbmV3IHJhbmdlIHRvIHRoaXMgaW50ZXJ2YWwuCiAgdm9pZCBhZGQoTGl2ZVJhbmdlIGludGVydmFsKSB7CiAgICByYW5nZXMuYWRkKGludGVydmFsKTsKICB9CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgb25lIG9mIHRoZSByYW5nZXMgb2YgdGhpcyBpbnRlcnZhbCBkaWVzIGF0IFthdF0uCiAgYm9vbCBkaWVzQXQoaW50IGF0KSB7CiAgICBmb3IgKExpdmVSYW5nZSByYW5nZSBpbiByYW5nZXMpIHsKICAgICAgaWYgKHJhbmdlLmVuZCA9PSBhdCkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBMaXN0PFN0cmluZz4gcmVzID0gbmV3IExpc3Q8U3RyaW5nPigpOwogICAgZm9yIChmaW5hbCBpbnRlcnZhbCBpbiByYW5nZXMpIHJlcy5hZGQoaW50ZXJ2YWwudG9TdHJpbmcoKSk7CiAgICByZXR1cm4gJygke3Jlcy5qb2luKCIsICIpfSknOwogIH0KfQoKLy8vIFRoZSBbTGl2ZUVudmlyb25tZW50XSBjbGFzcyBjb250YWlucyB0aGUgbGl2ZUluIHNldCBvZiBhIGJhc2ljCi8vLyBibG9jay4gQSBsaXZlSW4gc2V0IG9mIGEgYmxvY2sgY29udGFpbnMgdGhlIGluc3RydWN0aW9ucyB0aGF0IGFyZQovLy8gbGl2ZSB3aGVuIGVudGVyaW5nIHRoYXQgYmxvY2suCmNsYXNzIExpdmVFbnZpcm9ubWVudCB7CiAgLy8vIFRoZSBpbnN0cnVjdGlvbiBpZCB3aGVyZSB0aGUgYmFzaWMgYmxvY2sgc3RhcnRzLiBTZWUKICAvLy8gW1NzYUxpdmVJbnRlcnZhbEJ1aWxkZXIuaW5zdHJ1Y3Rpb25JZF0uCiAgaW50IHN0YXJ0SWQ7CgogIC8vLyBUaGUgaW5zdHJ1Y3Rpb24gaWQgd2hlcmUgdGhlIGJhc2ljIGJsb2NrIGVuZHMuCiAgZmluYWwgaW50IGVuZElkOwoKICAvLy8gTG9vcCBtYXJrZXJzIHRoYXQgd2lsbCBiZSB1cGRhdGVkIG9uY2UgdGhlIGxvb3AgaGVhZGVyIGlzCiAgLy8vIHZpc2l0ZWQuIFRoZSBsaXZlSW4gc2V0IG9mIHRoZSBsb29wIGhlYWRlciB3aWxsIGJlIG1lcmdlZCBpbnRvIHRoaXMKICAvLy8gZW52aXJvbm1lbnQuIFtsb29wTWFya2Vyc10gaXMgYSBtYXBwaW5nIGZyb20gYmxvY2sgaGVhZGVyIHRvIHRoZQogIC8vLyBlbmQgaW5zdHJ1Y3Rpb24gaWQgb2YgdGhlIGxvb3AgZXhpdCBibG9jay4KICBmaW5hbCBNYXA8SEJhc2ljQmxvY2ssIGludD4gbG9vcE1hcmtlcnM7CgogIC8vLyBUaGUgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIGxpdmUgaW4gdGhpcyBiYXNpYyBibG9jay4gVGhlIHZhbHVlcyBvZgogIC8vLyB0aGUgbWFwIGNvbnRhaW4gdGhlIGluc3RydWN0aW9uIGlkcyB3aGVyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRpZS4KICAvLy8gSXQgd2lsbCBiZSB1c2VkIHdoZW4gYWRkaW5nIGEgcmFuZ2UgdG8gdGhlIGxpdmUgaW50ZXJ2YWwgb2YgYW4KICAvLy8gaW5zdHJ1Y3Rpb24uCiAgZmluYWwgTWFwPEhJbnN0cnVjdGlvbiwgaW50PiBsaXZlSW5zdHJ1Y3Rpb25zOwoKICAvLy8gTWFwIGNvbnRhaW5pbmcgdGhlIGxpdmUgaW50ZXJ2YWxzIG9mIGluc3RydWN0aW9ucy4KICBmaW5hbCBNYXA8SEluc3RydWN0aW9uLCBMaXZlSW50ZXJ2YWw+IGxpdmVJbnRlcnZhbHM7CgogIExpdmVFbnZpcm9ubWVudCh0aGlzLmxpdmVJbnRlcnZhbHMsIHRoaXMuZW5kSWQpCiAgICAgIDogbGl2ZUluc3RydWN0aW9ucyA9IG5ldyBNYXA8SEluc3RydWN0aW9uLCBpbnQ+KCksCiAgICAgICAgbG9vcE1hcmtlcnMgPSBuZXcgTWFwPEhCYXNpY0Jsb2NrLCBpbnQ+KCk7CgogIC8vLyBSZW1vdmUgYW4gaW5zdHJ1Y3Rpb24gZnJvbSB0aGUgbGl2ZUluIHNldC4gVGhpcyBtZXRob2QgYWxzbwogIC8vLyB1cGRhdGVzIHRoZSBsaXZlIGludGVydmFsIG9mIFtpbnN0cnVjdGlvbl0gdG8gY29udGFpbiB0aGUgbmV3CiAgLy8vIHJhbmdlOiBbaWQsIC8gaWQgY29udGFpbmVkIGluIFtsaXZlSW5zdHJ1Y3Rpb25zXSAvXS4KICB2b2lkIHJlbW92ZShISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24sIGludCBpZCkgewogICAgTGl2ZUludGVydmFsIGludGVydmFsID0KICAgICAgICBsaXZlSW50ZXJ2YWxzLnB1dElmQWJzZW50KGluc3RydWN0aW9uLCAoKSA9PiBuZXcgTGl2ZUludGVydmFsKCkpOwogICAgaW50IGxhc3RJZCA9IGxpdmVJbnN0cnVjdGlvbnNbaW5zdHJ1Y3Rpb25dOwogICAgLy8gSWYgW2xhc3RJZF0gaXMgbnVsbCwgdGhlbiB0aGlzIGluc3RydWN0aW9uIGlzIG5vdCBiZWluZyB1c2VkLgogICAgaW50ZXJ2YWwuYWRkKG5ldyBMaXZlUmFuZ2UoaWQsIGxhc3RJZCA9PSBudWxsID8gaWQgOiBsYXN0SWQpKTsKICAgIC8vIFRoZSBpbnN0cnVjdGlvbiBpcyBkZWZpbmVkIGF0IFtpZF0uCiAgICBpbnRlcnZhbC5zdGFydCA9IGlkOwogICAgbGl2ZUluc3RydWN0aW9ucy5yZW1vdmUoaW5zdHJ1Y3Rpb24pOwogIH0KCiAgLy8vIEFkZCBbaW5zdHJ1Y3Rpb25dIHRvIHRoZSBsaXZlSW4gc2V0LiBJZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgbm90CiAgLy8vIGFscmVhZHkgaW4gdGhlIHNldCwgd2Ugc2F2ZSB0aGUgaWQgd2hlcmUgaXQgZGllcy4KICB2b2lkIGFkZChISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24sIGludCB1c2VySWQpIHsKICAgIC8vIE5vdGUgdGhhdCB3ZSBhcmUgdmlzaXRpbmcgdGhlIGdyYXBoIGluIHBvc3QtZG9taW5hdG9yIG9yZGVyLCBzbwogICAgLy8gdGhlIGZpcnN0IHRpbWUgd2Ugc2VlIGEgdmFyaWFibGUgaXMgd2hlbiBpdCBkaWVzLgogICAgbGl2ZUluc3RydWN0aW9ucy5wdXRJZkFic2VudChpbnN0cnVjdGlvbiwgKCkgPT4gdXNlcklkKTsKICB9CgogIC8vLyBNZXJnZSB0aGlzIGVudmlyb25tZW50IHdpdGggW290aGVyXS4gVXBkYXRlIHRoZSBlbmQgaWQgb2YKICAvLy8gaW5zdHJ1Y3Rpb25zIGluIGNhc2UgdGhleSBhcmUgZGlmZmVyZW50IGJldHdlZW4gdGhpcyBhbmQgW290aGVyXS4KICB2b2lkIG1lcmdlV2l0aChMaXZlRW52aXJvbm1lbnQgb3RoZXIpIHsKICAgIG90aGVyLmxpdmVJbnN0cnVjdGlvbnMuZm9yRWFjaCgoSEluc3RydWN0aW9uIGluc3RydWN0aW9uLCBpbnQgZXhpc3RpbmdJZCkgewogICAgICAvLyBJZiBib3RoIGVudmlyb25tZW50cyBoYXZlIHRoZSBzYW1lIGluc3RydWN0aW9uIGlkIG9mIHdoZXJlCiAgICAgIC8vIFtpbnN0cnVjdGlvbl0gZGllcywgdGhlcmUgaXMgbm8gbmVlZCB0byB1cGRhdGUgdGhlIGxpdmUKICAgICAgLy8gaW50ZXJ2YWwgb2YgW2luc3RydWN0aW9uXS4gRm9yIGV4YW1wbGUgdGhlIGlmIGJsb2NrIGFuZCB0aGUKICAgICAgLy8gZWxzZSBibG9jayBoYXZlIHRoZSBzYW1lIGVuZCBpZCBmb3IgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBpcwogICAgICAvLyBiZWluZyB1c2VkIGluIHRoZSBqb2luIGJsb2NrIGFuZCBkZWZpbmVkIGJlZm9yZSB0aGUgaWYvZWxzZS4KICAgICAgaWYgKGV4aXN0aW5nSWQgPT0gZW5kSWQpIHJldHVybjsKICAgICAgTGl2ZUludGVydmFsIHJhbmdlID0KICAgICAgICAgIGxpdmVJbnRlcnZhbHMucHV0SWZBYnNlbnQoaW5zdHJ1Y3Rpb24sICgpID0+IG5ldyBMaXZlSW50ZXJ2YWwoKSk7CiAgICAgIHJhbmdlLmFkZChuZXcgTGl2ZVJhbmdlKG90aGVyLnN0YXJ0SWQsIGV4aXN0aW5nSWQpKTsKICAgICAgbGl2ZUluc3RydWN0aW9uc1tpbnN0cnVjdGlvbl0gPSBlbmRJZDsKICAgIH0pOwogICAgb3RoZXIubG9vcE1hcmtlcnMuZm9yRWFjaCgoaywgdikgewogICAgICBsb29wTWFya2Vyc1trXSA9IHY7CiAgICB9KTsKICB9CgogIHZvaWQgYWRkTG9vcE1hcmtlcihIQmFzaWNCbG9jayBoZWFkZXIsIGludCBpZCkgewogICAgYXNzZXJ0KCFsb29wTWFya2Vycy5jb250YWluc0tleShoZWFkZXIpKTsKICAgIGxvb3BNYXJrZXJzW2hlYWRlcl0gPSBpZDsKICB9CgogIHZvaWQgcmVtb3ZlTG9vcE1hcmtlcihIQmFzaWNCbG9jayBoZWFkZXIpIHsKICAgIGFzc2VydChsb29wTWFya2Vycy5jb250YWluc0tleShoZWFkZXIpKTsKICAgIGxvb3BNYXJrZXJzLnJlbW92ZShoZWFkZXIpOwogIH0KCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBsaXZlSW5zdHJ1Y3Rpb25zLmlzRW1wdHkgJiYgbG9vcE1hcmtlcnMuaXNFbXB0eTsKICBib29sIGNvbnRhaW5zKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgPT4KICAgICAgbGl2ZUluc3RydWN0aW9ucy5jb250YWluc0tleShpbnN0cnVjdGlvbik7CiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gbGl2ZUluc3RydWN0aW9ucy50b1N0cmluZygpOwp9CgovLy8gQnVpbGRzIHRoZSBsaXZlIGludGVydmFscyBvZiBlYWNoIGluc3RydWN0aW9uLiBUaGUgYWxnb3JpdGhtIHZpc2l0cwovLy8gdGhlIGdyYXBoIHBvc3QtZG9taW5hdG9yIHRyZWUgdG8gZmluZCB0aGUgbGFzdCB1c2VzIG9mIGFuCi8vLyBpbnN0cnVjdGlvbiwgYW5kIGNvbXB1dGVzIHRoZSBsaXZlSW5zIG9mIGVhY2ggYmFzaWMgYmxvY2suCmNsYXNzIFNzYUxpdmVJbnRlcnZhbEJ1aWxkZXIgZXh0ZW5kcyBIQmFzZVZpc2l0b3Igd2l0aCBDb2RlZ2VuUGhhc2UgewogIGZpbmFsIFNldDxISW5zdHJ1Y3Rpb24+IGdlbmVyYXRlQXRVc2VTaXRlOwogIGZpbmFsIFNldDxISW5zdHJ1Y3Rpb24+IGNvbnRyb2xGbG93T3BlcmF0b3JzOwoKICAvLy8gQSBjb3VudGVyIHRvIGFzc2lnbiBzdGFydCBhbmQgZW5kIGlkcyB0byBsaXZlIHJhbmdlcy4gVGhlIGluaXRpYWwKICAvLy8gdmFsdWUgaXMgbm90IHJlbGV2YW50LiBOb3RlIHRoYXQgaW5zdHJ1Y3Rpb25JZCBnb2VzIGRvd253YXJkIHRvIGVhc2UKICAvLy8gcmVhc29uaW5nIGFib3V0IGxpdmUgcmFuZ2VzICh0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gb2YgYSBncmFwaCBoYXMKICAvLy8gdGhlIGxvd2VzdCBpZCkuCiAgaW50IGluc3RydWN0aW9uSWQgPSAwOwoKICAvLy8gVGhlIGxpdmVJbnMgb2YgYmFzaWMgYmxvY2tzLgogIGZpbmFsIE1hcDxIQmFzaWNCbG9jaywgTGl2ZUVudmlyb25tZW50PiBsaXZlSW5zdHJ1Y3Rpb25zOwoKICAvLy8gVGhlIGxpdmUgaW50ZXJ2YWxzIG9mIGluc3RydWN0aW9ucy4KICBmaW5hbCBNYXA8SEluc3RydWN0aW9uLCBMaXZlSW50ZXJ2YWw+IGxpdmVJbnRlcnZhbHM7CgogIFNzYUxpdmVJbnRlcnZhbEJ1aWxkZXIodGhpcy5nZW5lcmF0ZUF0VXNlU2l0ZSwgdGhpcy5jb250cm9sRmxvd09wZXJhdG9ycykKICAgICAgOiBsaXZlSW5zdHJ1Y3Rpb25zID0gbmV3IE1hcDxIQmFzaWNCbG9jaywgTGl2ZUVudmlyb25tZW50PigpLAogICAgICAgIGxpdmVJbnRlcnZhbHMgPSBuZXcgTWFwPEhJbnN0cnVjdGlvbiwgTGl2ZUludGVydmFsPigpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0R3JhcGgoSEdyYXBoIGdyYXBoKSB7CiAgICB2aXNpdFBvc3REb21pbmF0b3JUcmVlKGdyYXBoKTsKICAgIGlmICghbGl2ZUluc3RydWN0aW9uc1tncmFwaC5lbnRyeV0uaXNFbXB0eSkgewogICAgICBmYWlsZWRBdChDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLCAnTGl2ZUludGVydmFsQnVpbGRlci4nKTsKICAgIH0KICB9CgogIHZvaWQgbWFya0lucHV0c0FzTGl2ZUluRW52aXJvbm1lbnQoCiAgICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiwgTGl2ZUVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICBmb3IgKGludCBpID0gMCwgbGVuID0gaW5zdHJ1Y3Rpb24uaW5wdXRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIG1hcmtBc0xpdmVJbkVudmlyb25tZW50KGluc3RydWN0aW9uLmlucHV0c1tpXSwgZW52aXJvbm1lbnQpOwogICAgfQogIH0KCiAgLy8gUmV0dXJucyB0aGUgbm9uLUhDaGVjayBpbnN0cnVjdGlvbiwgb3IgdGhlIGxhc3QgW0hDaGVja10gaW4gdGhlCiAgLy8gY2hlY2sgY2hhaW4gdGhhdCBpcyBub3QgZ2VuZXJhdGUgYXQgdXNlIHNpdGUuCiAgLy8KICAvLyBGb3IgZXhhbXBsZToKICAvLwogIC8vICAgICB0MSA9IEdlbmVyYXRlZEF0VXNlU2l0ZSBpbnN0cnVjdGlvbgogIC8vICAgICB0MiA9IGNoZWNrKHQxKQogIC8vICAgICB0MyA9IGNoZWNrKHQyKQogIC8vICAgICB0NCA9IHVzZSh0MykKICAvLyAgICAgdDUgPSB1c2UodDMpCiAgLy8gICAgIHQ2ID0gdXNlKHQyKQogIC8vCiAgLy8gVGhlIHQxIGlzIGdlbmVyYXRlLWF0LXVzZSBzaXRlLCBhbmQgdGhlIGxpdmUtcmFuZ2UgbXVzdCB0aHVzIGJlIG9uIHQyIGFuZAogIC8vIG5vdCBvbiB0aGUgY2hlY2tlZCBpbnN0cnVjdGlvbiB0MS4KICAvLyBXaGVuIGxvb2tpbmcgZm9yIHRoZSBjaGVja2VkSW5zdHJ1Y3Rpb25Pck5vbkdlbmVyYXRlQXRVc2VTaXRlIG9mIHQzIHdlIG11c3QKICAvLyByZXR1cm4gdDIuCiAgSEluc3RydWN0aW9uIGNoZWNrZWRJbnN0cnVjdGlvbk9yTm9uR2VuZXJhdGVBdFVzZVNpdGUoSENoZWNrIGNoZWNrKSB7CiAgICBkeW5hbWljIGNoZWNrZWQgPSBjaGVjay5jaGVja2VkSW5wdXQ7CiAgICB3aGlsZSAoY2hlY2tlZCBpcyBIQ2hlY2spIHsKICAgICAgSEluc3RydWN0aW9uIG5leHQgPSBjaGVja2VkLmNoZWNrZWRJbnB1dDsKICAgICAgaWYgKGdlbmVyYXRlQXRVc2VTaXRlLmNvbnRhaW5zKG5leHQpKSBicmVhazsKICAgICAgY2hlY2tlZCA9IG5leHQ7CiAgICB9CiAgICByZXR1cm4gY2hlY2tlZDsKICB9CgogIHZvaWQgbWFya0FzTGl2ZUluRW52aXJvbm1lbnQoCiAgICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiwgTGl2ZUVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICBpZiAoZ2VuZXJhdGVBdFVzZVNpdGUuY29udGFpbnMoaW5zdHJ1Y3Rpb24pKSB7CiAgICAgIG1hcmtJbnB1dHNBc0xpdmVJbkVudmlyb25tZW50KGluc3RydWN0aW9uLCBlbnZpcm9ubWVudCk7CiAgICB9IGVsc2UgewogICAgICBlbnZpcm9ubWVudC5hZGQoaW5zdHJ1Y3Rpb24sIGluc3RydWN0aW9uSWQpOwogICAgICAvLyBTcGVjaWFsIGNhc2UgdGhlIEhDaGVjayBpbnN0cnVjdGlvbiB0byBtYXJrIHRoZSBhY3R1YWwKICAgICAgLy8gY2hlY2tlZCBpbnN0cnVjdGlvbiBsaXZlLiBUaGUgY2hlY2tlZCBpbnN0cnVjdGlvbiBhbmQgdGhlCiAgICAgIC8vIFtIQ2hlY2tdIHdpbGwgc2hhcmUgdGhlIHNhbWUgbGl2ZSByYW5nZXMuCiAgICAgIGlmIChpbnN0cnVjdGlvbiBpcyBIQ2hlY2spIHsKICAgICAgICBIQ2hlY2sgY2hlY2sgPSBpbnN0cnVjdGlvbjsKICAgICAgICBISW5zdHJ1Y3Rpb24gY2hlY2tlZCA9IGNoZWNrZWRJbnN0cnVjdGlvbk9yTm9uR2VuZXJhdGVBdFVzZVNpdGUoY2hlY2spOwogICAgICAgIGlmICghZ2VuZXJhdGVBdFVzZVNpdGUuY29udGFpbnMoY2hlY2tlZCkpIHsKICAgICAgICAgIGVudmlyb25tZW50LmFkZChjaGVja2VkLCBpbnN0cnVjdGlvbklkKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgcmVtb3ZlRnJvbUVudmlyb25tZW50KAogICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24sIExpdmVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewogICAgZW52aXJvbm1lbnQucmVtb3ZlKGluc3RydWN0aW9uLCBpbnN0cnVjdGlvbklkKTsKICAgIC8vIFNwZWNpYWwgY2FzZSB0aGUgSENoZWNrIGluc3RydWN0aW9uIHRvIGhhdmUgdGhlIHNhbWUgbGl2ZQogICAgLy8gaW50ZXJ2YWwgYXMgdGhlIGluc3RydWN0aW9uIGl0IGlzIGNoZWNraW5nLgogICAgaWYgKGluc3RydWN0aW9uIGlzIEhDaGVjaykgewogICAgICBIQ2hlY2sgY2hlY2sgPSBpbnN0cnVjdGlvbjsKICAgICAgSEluc3RydWN0aW9uIGNoZWNrZWQgPSBjaGVja2VkSW5zdHJ1Y3Rpb25Pck5vbkdlbmVyYXRlQXRVc2VTaXRlKGNoZWNrKTsKICAgICAgaWYgKCFnZW5lcmF0ZUF0VXNlU2l0ZS5jb250YWlucyhjaGVja2VkKSkgewogICAgICAgIGxpdmVJbnRlcnZhbHMucHV0SWZBYnNlbnQoY2hlY2tlZCwgKCkgPT4gbmV3IExpdmVJbnRlcnZhbCgpKTsKICAgICAgICAvLyBVbmNvbmRpdGlvbmFsbHkgZm9yY2UgdGhlIGxpdmUgcmFuZ2VzIG9mIHRoZSBIQ2hlY2sgdG8KICAgICAgICAvLyBiZSB0aGUgbGl2ZSByYW5nZXMgb2YgdGhlIGluc3RydWN0aW9uIGl0IGlzIGNoZWNraW5nLgogICAgICAgIGxpdmVJbnRlcnZhbHNbaW5zdHJ1Y3Rpb25dID0KICAgICAgICAgICAgbmV3IExpdmVJbnRlcnZhbC5mb3JDaGVjayhpbnN0cnVjdGlvbklkLCBsaXZlSW50ZXJ2YWxzW2NoZWNrZWRdKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJhc2ljQmxvY2soSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIExpdmVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9CiAgICAgICAgbmV3IExpdmVFbnZpcm9ubWVudChsaXZlSW50ZXJ2YWxzLCBpbnN0cnVjdGlvbklkKTsKCiAgICAvLyBJZiB0aGUgY29udHJvbCBmbG93IGluc3RydWN0aW9uIGluIHRoaXMgYmxvY2sgd2lsbCBhY3R1YWxseSBiZQogICAgLy8gaW5saW5lZCBpbiB0aGUgY29kZWdlbiBpbiB0aGUgam9pbiBibG9jaywgd2UgbmVlZCB0byBtYWtlCiAgICAvLyB3aGF0ZXZlciBpcyB1c2VkIGJ5IHRoYXQgY29udHJvbCBmbG93IGluc3RydWN0aW9uIGFzIGxpdmUgaW4KICAgIC8vIHRoZSBqb2luIGJsb2NrLgogICAgaWYgKGNvbnRyb2xGbG93T3BlcmF0b3JzLmNvbnRhaW5zKGJsb2NrLmxhc3QpKSB7CiAgICAgIEhJZiBpZkluc3RydWN0aW9uID0gYmxvY2subGFzdDsKICAgICAgSEJhc2ljQmxvY2sgam9pbkJsb2NrID0gaWZJbnN0cnVjdGlvbi5qb2luQmxvY2s7CiAgICAgIGlmIChnZW5lcmF0ZUF0VXNlU2l0ZS5jb250YWlucyhqb2luQmxvY2sucGhpcy5maXJzdCkpIHsKICAgICAgICBtYXJrSW5wdXRzQXNMaXZlSW5FbnZpcm9ubWVudCgKICAgICAgICAgICAgaWZJbnN0cnVjdGlvbiwgbGl2ZUluc3RydWN0aW9uc1tqb2luQmxvY2tdKTsKICAgICAgfQogICAgfQoKICAgIC8vIEFkZCB0byB0aGUgZW52aXJvbm1lbnQgdGhlIGxpdmVJbiBvZiBpdHMgc3VjY2Vzc29yLCBhcyB3ZWxsIGFzCiAgICAvLyB0aGUgaW5wdXRzIG9mIHRoZSBwaGlzIG9mIHRoZSBzdWNjZXNzb3IgdGhhdCBmbG93IGZyb20gdGhpcyBibG9jay4KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2suc3VjY2Vzc29ycy5sZW5ndGg7IGkrKykgewogICAgICBIQmFzaWNCbG9jayBzdWNjZXNzb3IgPSBibG9jay5zdWNjZXNzb3JzW2ldOwogICAgICBMaXZlRW52aXJvbm1lbnQgc3VjY2Vzc29yRW52ID0gbGl2ZUluc3RydWN0aW9uc1tzdWNjZXNzb3JdOwogICAgICBpZiAoc3VjY2Vzc29yRW52ICE9IG51bGwpIHsKICAgICAgICBlbnZpcm9ubWVudC5tZXJnZVdpdGgoc3VjY2Vzc29yRW52KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlbnZpcm9ubWVudC5hZGRMb29wTWFya2VyKHN1Y2Nlc3NvciwgaW5zdHJ1Y3Rpb25JZCk7CiAgICAgIH0KCiAgICAgIGludCBpbmRleCA9IHN1Y2Nlc3Nvci5wcmVkZWNlc3NvcnMuaW5kZXhPZihibG9jayk7CiAgICAgIGZvciAoSFBoaSBwaGkgPSBzdWNjZXNzb3IucGhpcy5maXJzdDsgcGhpICE9IG51bGw7IHBoaSA9IHBoaS5uZXh0KSB7CiAgICAgICAgbWFya0FzTGl2ZUluRW52aXJvbm1lbnQocGhpLmlucHV0c1tpbmRleF0sIGVudmlyb25tZW50KTsKICAgICAgfQogICAgfQoKICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgaW5zdHJ1Y3Rpb25zIHRvIHJlbW92ZSBhbiBpbnN0cnVjdGlvbiBmcm9tIHRoZQogICAgLy8gZW52aXJvbm1lbnQgYW5kIGFkZCBpdHMgaW5wdXRzLgogICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gYmxvY2subGFzdDsKICAgIHdoaWxlIChpbnN0cnVjdGlvbiAhPSBudWxsKSB7CiAgICAgIGlmICghZ2VuZXJhdGVBdFVzZVNpdGUuY29udGFpbnMoaW5zdHJ1Y3Rpb24pKSB7CiAgICAgICAgcmVtb3ZlRnJvbUVudmlyb25tZW50KGluc3RydWN0aW9uLCBlbnZpcm9ubWVudCk7CiAgICAgICAgbWFya0lucHV0c0FzTGl2ZUluRW52aXJvbm1lbnQoaW5zdHJ1Y3Rpb24sIGVudmlyb25tZW50KTsKICAgICAgfQogICAgICBpbnN0cnVjdGlvbklkLS07CiAgICAgIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb24ucHJldmlvdXM7CiAgICB9CgogICAgLy8gV2UganVzdCByZW1vdmUgdGhlIHBoaXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuIFRoZSBpbnB1dHMgb2YgdGhlCiAgICAvLyBwaGlzIHdpbGwgYmUgcHV0IGluIHRoZSBlbnZpcm9ubWVudCBvZiB0aGUgcHJlZGVjZXNzb3JzLgogICAgZm9yIChIUGhpIHBoaSA9IGJsb2NrLnBoaXMuZmlyc3Q7IHBoaSAhPSBudWxsOyBwaGkgPSBwaGkubmV4dCkgewogICAgICBpZiAoIWdlbmVyYXRlQXRVc2VTaXRlLmNvbnRhaW5zKHBoaSkpIHsKICAgICAgICBlbnZpcm9ubWVudC5yZW1vdmUocGhpLCBpbnN0cnVjdGlvbklkKTsKICAgICAgfQogICAgfQoKICAgIC8vIFNhdmUgdGhlIGxpdmVJbnN0cnVjdGlvbnMgb2YgdGhhdCBibG9jay4KICAgIGVudmlyb25tZW50LnN0YXJ0SWQgPSBpbnN0cnVjdGlvbklkICsgMTsKICAgIGxpdmVJbnN0cnVjdGlvbnNbYmxvY2tdID0gZW52aXJvbm1lbnQ7CgogICAgLy8gSWYgdGhlIGJsb2NrIGlzIGEgbG9vcCBoZWFkZXIsIHdlIGNhbiByZW1vdmUgdGhlIGxvb3AgbWFya2VyLAogICAgLy8gYmVjYXVzZSBpdCB3aWxsIGp1c3QgcmVjb21wdXRlIHRoZSBsb29wIHBoaXMuCiAgICAvLyBXZSBhbHNvIGNoZWNrIGlmIHRoaXMgbG9vcCBoZWFkZXIgaGFzIGFueSBiYWNrIGVkZ2VzLiBJZiBub3QsCiAgICAvLyB3ZSBrbm93IHRoZXJlIGlzIG5vIGxvb3AgbWFya2VyIGZvciBpdC4KICAgIGlmIChibG9jay5pc0xvb3BIZWFkZXIoKSAmJiBibG9jay5wcmVkZWNlc3NvcnMubGVuZ3RoID4gMSkgewogICAgICB1cGRhdGVMb29wTWFya2VyKGJsb2NrKTsKICAgIH0KICB9CgogIHZvaWQgdXBkYXRlTG9vcE1hcmtlcihIQmFzaWNCbG9jayBoZWFkZXIpIHsKICAgIExpdmVFbnZpcm9ubWVudCBlbnYgPSBsaXZlSW5zdHJ1Y3Rpb25zW2hlYWRlcl07CiAgICBpbnQgbGFzdElkID0gZW52Lmxvb3BNYXJrZXJzW2hlYWRlcl07CiAgICAvLyBVcGRhdGUgYWxsIGluc3RydWN0aW9ucyB0aGF0IGFyZSBsaXZlSW5zIGluIFtoZWFkZXJdIHRvIGhhdmUgYQogICAgLy8gcmFuZ2UgdGhhdCBjb3ZlcnMgdGhlIGxvb3AuCiAgICBlbnYubGl2ZUluc3RydWN0aW9ucy5mb3JFYWNoKChISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24sIGludCBpZCkgewogICAgICBMaXZlSW50ZXJ2YWwgcmFuZ2UgPQogICAgICAgICAgZW52LmxpdmVJbnRlcnZhbHMucHV0SWZBYnNlbnQoaW5zdHJ1Y3Rpb24sICgpID0+IG5ldyBMaXZlSW50ZXJ2YWwoKSk7CiAgICAgIHJhbmdlLmxvb3BVcGRhdGUoZW52LnN0YXJ0SWQsIGxhc3RJZCk7CiAgICAgIGVudi5saXZlSW5zdHJ1Y3Rpb25zW2luc3RydWN0aW9uXSA9IGxhc3RJZDsKICAgIH0pOwoKICAgIGVudi5yZW1vdmVMb29wTWFya2VyKGhlYWRlcik7CgogICAgLy8gVXBkYXRlIGFsbCBsaXZlSW5zIHNldCB0byBjb250YWluIHRoZSBsaXZlSW5zIG9mIFtoZWFkZXJdLgogICAgbGl2ZUluc3RydWN0aW9ucy5mb3JFYWNoKChIQmFzaWNCbG9jayBibG9jaywgTGl2ZUVudmlyb25tZW50IG90aGVyKSB7CiAgICAgIGlmIChvdGhlci5sb29wTWFya2Vycy5jb250YWluc0tleShoZWFkZXIpKSB7CiAgICAgICAgZW52LmxpdmVJbnN0cnVjdGlvbnMuZm9yRWFjaCgoSEluc3RydWN0aW9uIGluc3RydWN0aW9uLCBpbnQgaWQpIHsKICAgICAgICAgIG90aGVyLmxpdmVJbnN0cnVjdGlvbnNbaW5zdHJ1Y3Rpb25dID0gaWQ7CiAgICAgICAgfSk7CiAgICAgICAgb3RoZXIucmVtb3ZlTG9vcE1hcmtlcihoZWFkZXIpOwogICAgICAgIGVudi5sb29wTWFya2Vycy5mb3JFYWNoKChrLCB2KSB7CiAgICAgICAgICBvdGhlci5sb29wTWFya2Vyc1trXSA9IHY7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwogIH0KfQoKLy8vIFJlcHJlc2VudHMgYSBjb3B5IGZyb20gb25lIGluc3RydWN0aW9uIHRvIGFub3RoZXIuIFRoZSBjb2RlZ2VuCi8vLyBhbHNvIHVzZXMgdGhpcyBjbGFzcyB0byByZXByZXNlbnQgYSBjb3B5IGZyb20gb25lIHZhcmlhYmxlIHRvCi8vLyBhbm90aGVyLgpjbGFzcyBDb3B5PFQ+IHsKICBmaW5hbCBUIHNvdXJjZTsKICBmaW5hbCBUIGRlc3RpbmF0aW9uOwoKICBDb3B5KHRoaXMuc291cmNlLCB0aGlzLmRlc3RpbmF0aW9uKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyRkZXN0aW5hdGlvbiA8LSAkc291cmNlJzsKfQoKLy8vIEEgY29weSBoYW5kbGVyIGNvbnRhaW5zIHRoZSBjb3BpZXMgdGhhdCBhIGJhc2ljIGJsb2NrIG5lZWRzIHRvIGRvCi8vLyBhZnRlciBleGVjdXRpbmcgYWxsIGl0cyBpbnN0cnVjdGlvbnMuCmNsYXNzIENvcHlIYW5kbGVyIHsKICAvLy8gVGhlIGNvcGllcyBmcm9tIGFuIGluc3RydWN0aW9uIHRvIGEgcGhpIG9mIHRoZSBzdWNjZXNzb3IuCiAgZmluYWwgTGlzdDxDb3B5PEhJbnN0cnVjdGlvbj4+IGNvcGllczsKCiAgLy8vIEFzc2lnbm1lbnRzIGZyb20gYW4gaW5zdHJ1Y3Rpb24gdGhhdCBkb2VzIG5vdCBuZWVkIGEgbmFtZSAoZS5nLiBhCiAgLy8vIGNvbnN0YW50KSB0byB0aGUgcGhpIG9mIGEgc3VjY2Vzc29yLgogIGZpbmFsIExpc3Q8Q29weTxISW5zdHJ1Y3Rpb24+PiBhc3NpZ25tZW50czsKCiAgQ29weUhhbmRsZXIoKQogICAgICA6IGNvcGllcyA9IG5ldyBMaXN0PENvcHk8SEluc3RydWN0aW9uPj4oKSwKICAgICAgICBhc3NpZ25tZW50cyA9IG5ldyBMaXN0PENvcHk8SEluc3RydWN0aW9uPj4oKTsKCiAgdm9pZCBhZGRDb3B5KEhJbnN0cnVjdGlvbiBzb3VyY2UsIEhJbnN0cnVjdGlvbiBkZXN0aW5hdGlvbikgewogICAgY29waWVzLmFkZChuZXcgQ29weTxISW5zdHJ1Y3Rpb24+KHNvdXJjZSwgZGVzdGluYXRpb24pKTsKICB9CgogIHZvaWQgYWRkQXNzaWdubWVudChISW5zdHJ1Y3Rpb24gc291cmNlLCBISW5zdHJ1Y3Rpb24gZGVzdGluYXRpb24pIHsKICAgIGFzc2lnbm1lbnRzLmFkZChuZXcgQ29weTxISW5zdHJ1Y3Rpb24+KHNvdXJjZSwgZGVzdGluYXRpb24pKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdDb3BpZXM6ICRjb3BpZXMsIGFzc2lnbm1lbnRzOiAkYXNzaWdubWVudHMnOwoKICBib29sIGdldCBpc0VtcHR5ID0+IGNvcGllcy5pc0VtcHR5ICYmIGFzc2lnbm1lbnRzLmlzRW1wdHk7Cn0KCi8vLyBDb250YWlucyB0aGUgbWFwcGluZyBiZXR3ZWVuIGluc3RydWN0aW9ucyBhbmQgdGhlaXIgbmFtZXMgZm9yIGNvZGUKLy8vIGdlbmVyYXRpb24sIGFzIHdlbGwgYXMgdGhlIFtDb3B5SGFuZGxlcl0gZm9yIGVhY2ggYmFzaWMgYmxvY2suCmNsYXNzIFZhcmlhYmxlTmFtZXMgewogIGZpbmFsIE1hcDxISW5zdHJ1Y3Rpb24sIFN0cmluZz4gb3duTmFtZTsKICBmaW5hbCBNYXA8SEJhc2ljQmxvY2ssIENvcHlIYW5kbGVyPiBjb3B5SGFuZGxlcnM7CgogIC8vIFVzZWQgdG8gY29udHJvbCBoZXVyaXN0aWMgdGhhdCBkZXRlcm1pbmVzIGhvdyBsb2NhbCB2YXJpYWJsZXMgYXJlIGRlY2xhcmVkLgogIGZpbmFsIFNldDxTdHJpbmc+IGFsbFVzZWROYW1lczsKCiAgLy8vIE5hbWUgdGhhdCBpcyB1c2VkIGFzIGEgdGVtcG9yYXJ5IHRvIGJyZWFrIGN5Y2xlcyBpbgogIC8vLyBwYXJhbGxlbCBjb3BpZXMuIFdlIG1ha2Ugc3VyZSB0aGlzIG5hbWUgaXMgbm90IGJlaW5nIHVzZWQKICAvLy8gYW55d2hlcmUgYnkgcmVzZXJ2aW5nIGl0IHdoZW4gd2UgYWxsb2NhdGUgbmFtZXMgZm9yIGluc3RydWN0aW9ucy4KICBmaW5hbCBTdHJpbmcgc3dhcFRlbXA7CgogIFN0cmluZyBnZXRTd2FwVGVtcCgpIHsKICAgIGFsbFVzZWROYW1lcy5hZGQoc3dhcFRlbXApOwogICAgcmV0dXJuIHN3YXBUZW1wOwogIH0KCiAgVmFyaWFibGVOYW1lcygpCiAgICAgIDogb3duTmFtZSA9IG5ldyBNYXA8SEluc3RydWN0aW9uLCBTdHJpbmc+KCksCiAgICAgICAgY29weUhhbmRsZXJzID0gbmV3IE1hcDxIQmFzaWNCbG9jaywgQ29weUhhbmRsZXI+KCksCiAgICAgICAgYWxsVXNlZE5hbWVzID0gbmV3IFNldDxTdHJpbmc+KCksCiAgICAgICAgc3dhcFRlbXAgPSAndDAnOwoKICBpbnQgZ2V0IG51bWJlck9mVmFyaWFibGVzID0+IGFsbFVzZWROYW1lcy5sZW5ndGg7CgogIFN0cmluZyBnZXROYW1lKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgcmV0dXJuIG93bk5hbWVbaW5zdHJ1Y3Rpb25dOwogIH0KCiAgQ29weUhhbmRsZXIgZ2V0Q29weUhhbmRsZXIoSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIHJldHVybiBjb3B5SGFuZGxlcnNbYmxvY2tdOwogIH0KCiAgdm9pZCBhZGROYW1lVXNlZChTdHJpbmcgbmFtZSkgewogICAgYWxsVXNlZE5hbWVzLmFkZChuYW1lKTsKICB9CgogIGJvb2wgaGFzTmFtZShISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pID0+IG93bk5hbWUuY29udGFpbnNLZXkoaW5zdHJ1Y3Rpb24pOwoKICB2b2lkIGFkZENvcHkoSEJhc2ljQmxvY2sgYmxvY2ssIEhJbnN0cnVjdGlvbiBzb3VyY2UsIEhQaGkgZGVzdGluYXRpb24pIHsKICAgIENvcHlIYW5kbGVyIGhhbmRsZXIgPQogICAgICAgIGNvcHlIYW5kbGVycy5wdXRJZkFic2VudChibG9jaywgKCkgPT4gbmV3IENvcHlIYW5kbGVyKCkpOwogICAgaGFuZGxlci5hZGRDb3B5KHNvdXJjZSwgZGVzdGluYXRpb24pOwogIH0KCiAgdm9pZCBhZGRBc3NpZ25tZW50KEhCYXNpY0Jsb2NrIGJsb2NrLCBISW5zdHJ1Y3Rpb24gc291cmNlLCBIUGhpIGRlc3RpbmF0aW9uKSB7CiAgICBDb3B5SGFuZGxlciBoYW5kbGVyID0KICAgICAgICBjb3B5SGFuZGxlcnMucHV0SWZBYnNlbnQoYmxvY2ssICgpID0+IG5ldyBDb3B5SGFuZGxlcigpKTsKICAgIGhhbmRsZXIuYWRkQXNzaWdubWVudChzb3VyY2UsIGRlc3RpbmF0aW9uKTsKICB9Cn0KCi8vLyBBbGxvY2F0ZXMgdmFyaWFibGUgbmFtZXMgZm9yIGluc3RydWN0aW9ucywgbWFraW5nIHN1cmUgdGhleSBkb24ndCBjb2xsaWRlLgpjbGFzcyBWYXJpYWJsZU5hbWVyIHsKICBmaW5hbCBWYXJpYWJsZU5hbWVzIG5hbWVzOwogIGZpbmFsIE5hbWVyIF9uYW1lcjsKICBmaW5hbCBTZXQ8U3RyaW5nPiB1c2VkTmFtZXM7CiAgZmluYWwgTGlzdDxTdHJpbmc+IGZyZWVUZW1wb3JhcnlOYW1lczsKICBpbnQgdGVtcG9yYXJ5SW5kZXggPSAwOwogIHN0YXRpYyBmaW5hbCBSZWdFeHAgcmVnZXhwID0gbmV3IFJlZ0V4cCgndFswLTldKycpOwoKICBWYXJpYWJsZU5hbWVyKExpdmVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgdGhpcy5uYW1lcywgdGhpcy5fbmFtZXIpCiAgICAgIDogdXNlZE5hbWVzID0gbmV3IFNldDxTdHJpbmc+KCksCiAgICAgICAgZnJlZVRlbXBvcmFyeU5hbWVzID0gbmV3IExpc3Q8U3RyaW5nPigpIHsKICAgIC8vIFtWYXJpYWJsZU5hbWVzLnN3YXBUZW1wXSBpcyB1c2VkIHdoZW4gdGhlcmUgaXMgYSBjeWNsZSBpbiBhIGNvcHkgaGFuZGxlci4KICAgIC8vIFRoZXJlZm9yZSB3ZSBtYWtlIHN1cmUgbm8gb25lIHVzZXMgaXQuCiAgICB1c2VkTmFtZXMuYWRkKG5hbWVzLnN3YXBUZW1wKTsKCiAgICAvLyBBbGwgbGl2ZUlucyBpbnN0cnVjdGlvbnMgbXVzdCBoYXZlIGEgbmFtZSBhdCB0aGlzIHBvaW50LCBzbyB3ZQogICAgLy8gYWRkIHRoZW0gdG8gdGhlIGxpc3Qgb2YgdXNlZCBuYW1lcy4KICAgIGVudmlyb25tZW50LmxpdmVJbnN0cnVjdGlvbnMuZm9yRWFjaCgoSEluc3RydWN0aW9uIGluc3RydWN0aW9uLCBpbnQgaW5kZXgpIHsKICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lcy5nZXROYW1lKGluc3RydWN0aW9uKTsKICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewogICAgICAgIHVzZWROYW1lcy5hZGQobmFtZSk7CiAgICAgICAgbmFtZXMuYWRkTmFtZVVzZWQobmFtZSk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgU3RyaW5nIGFsbG9jYXRlV2l0aEhpbnQoU3RyaW5nIG9yaWdpbmFsTmFtZSkgewogICAgaW50IGkgPSAwOwogICAgU3RyaW5nIG5hbWUgPSBfbmFtZXIuc2FmZVZhcmlhYmxlTmFtZShvcmlnaW5hbE5hbWUpOwogICAgd2hpbGUgKHVzZWROYW1lcy5jb250YWlucyhuYW1lKSkgewogICAgICBuYW1lID0gX25hbWVyLnNhZmVWYXJpYWJsZU5hbWUoJyRvcmlnaW5hbE5hbWUke2krK30nKTsKICAgIH0KICAgIHJldHVybiBuYW1lOwogIH0KCiAgU3RyaW5nIGFsbG9jYXRlVGVtcG9yYXJ5KCkgewogICAgd2hpbGUgKCFmcmVlVGVtcG9yYXJ5TmFtZXMuaXNFbXB0eSkgewogICAgICBTdHJpbmcgbmFtZSA9IGZyZWVUZW1wb3JhcnlOYW1lcy5yZW1vdmVMYXN0KCk7CiAgICAgIGlmICghdXNlZE5hbWVzLmNvbnRhaW5zKG5hbWUpKSByZXR1cm4gbmFtZTsKICAgIH0KICAgIFN0cmluZyBuYW1lID0gJ3Qke3RlbXBvcmFyeUluZGV4Kyt9JzsKICAgIHdoaWxlICh1c2VkTmFtZXMuY29udGFpbnMobmFtZSkpIG5hbWUgPSAndCR7dGVtcG9yYXJ5SW5kZXgrK30nOwogICAgcmV0dXJuIG5hbWU7CiAgfQoKICBIUGhpIGZpcnN0UGhpVXNlcldpdGhFbGVtZW50KEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgZm9yIChISW5zdHJ1Y3Rpb24gdXNlciBpbiBpbnN0cnVjdGlvbi51c2VkQnkpIHsKICAgICAgaWYgKHVzZXIgaXMgSFBoaSAmJiB1c2VyLnNvdXJjZUVsZW1lbnQgIT0gbnVsbCkgewogICAgICAgIHJldHVybiB1c2VyOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIFN0cmluZyBhbGxvY2F0ZU5hbWUoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBTdHJpbmcgbmFtZTsKICAgIGlmIChpbnN0cnVjdGlvbiBpcyBIQ2hlY2spIHsKICAgICAgLy8gU3BlY2lhbCBjYXNlIHRoaXMgaW5zdHJ1Y3Rpb24gdG8gdXNlIHRoZSBuYW1lIG9mIGl0cwogICAgICAvLyBpbnB1dCBpZiBpdCBoYXMgb25lLgogICAgICBISW5zdHJ1Y3Rpb24gdGVtcCA9IGluc3RydWN0aW9uOwogICAgICBkbyB7CiAgICAgICAgdGVtcCA9ICh0ZW1wIGFzIEhDaGVjaykuY2hlY2tlZElucHV0OwogICAgICAgIG5hbWUgPSBuYW1lcy5vd25OYW1lW3RlbXBdOwogICAgICB9IHdoaWxlIChuYW1lID09IG51bGwgJiYgdGVtcCBpcyBIQ2hlY2spOwogICAgICBpZiAobmFtZSAhPSBudWxsKSByZXR1cm4gYWRkQWxsb2NhdGVkTmFtZShpbnN0cnVjdGlvbiwgbmFtZSk7CiAgICB9CgogICAgaWYgKGluc3RydWN0aW9uLnNvdXJjZUVsZW1lbnQgIT0gbnVsbCkgewogICAgICBpZiAoaW5zdHJ1Y3Rpb24uc291cmNlRWxlbWVudC5uYW1lICE9IG51bGwpIHsKICAgICAgICBuYW1lID0gYWxsb2NhdGVXaXRoSGludChpbnN0cnVjdGlvbi5zb3VyY2VFbGVtZW50Lm5hbWUpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFNvdXJjZSBlbGVtZW50IGlzIHN5bnRoZXNpemVkIGFuZCBoYXMgbm8gbmFtZS4KICAgICAgICBuYW1lID0gYWxsb2NhdGVUZW1wb3JhcnkoKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gV2UgY291bGQgbm90IGZpbmQgYW4gZWxlbWVudCBmb3IgdGhlIGluc3RydWN0aW9uLiBJZiB0aGUKICAgICAgLy8gaW5zdHJ1Y3Rpb24gaXMgdXNlZCBieSBhIHBoaSwgdHJ5IHRvIHVzZSB0aGUgbmFtZSBvZiB0aGUgcGhpLgogICAgICAvLyBPdGhlcndpc2UsIGp1c3QgYWxsb2NhdGUgYSB0ZW1wb3JhcnkgbmFtZS4KICAgICAgSFBoaSBwaGkgPSBmaXJzdFBoaVVzZXJXaXRoRWxlbWVudChpbnN0cnVjdGlvbik7CiAgICAgIGlmIChwaGkgIT0gbnVsbCkgewogICAgICAgIG5hbWUgPSBhbGxvY2F0ZVdpdGhIaW50KHBoaS5zb3VyY2VFbGVtZW50Lm5hbWUpOwogICAgICB9IGVsc2UgewogICAgICAgIG5hbWUgPSBhbGxvY2F0ZVRlbXBvcmFyeSgpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYWRkQWxsb2NhdGVkTmFtZShpbnN0cnVjdGlvbiwgbmFtZSk7CiAgfQoKICBTdHJpbmcgYWRkQWxsb2NhdGVkTmFtZShISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24sIFN0cmluZyBuYW1lKSB7CiAgICB1c2VkTmFtZXMuYWRkKG5hbWUpOwogICAgbmFtZXMuYWRkTmFtZVVzZWQobmFtZSk7CiAgICBuYW1lcy5vd25OYW1lW2luc3RydWN0aW9uXSA9IG5hbWU7CiAgICByZXR1cm4gbmFtZTsKICB9CgogIC8vLyBGcmVlcyBbaW5zdHJ1Y3Rpb25dJ3MgbmFtZSBzbyBpdCBjYW4gYmUgdXNlZCBmb3Igb3RoZXIgaW5zdHJ1Y3Rpb25zLgogIHZvaWQgZnJlZU5hbWUoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBTdHJpbmcgb3duTmFtZSA9IG5hbWVzLm93bk5hbWVbaW5zdHJ1Y3Rpb25dOwogICAgaWYgKG93bk5hbWUgIT0gbnVsbCkgewogICAgICAvLyBXZSBjaGVjayBpZiB3ZSBoYXZlIGFscmVhZHkgbG9va2VkIGZvciB0ZW1wb3JhcnkgbmFtZXMKICAgICAgLy8gYmVjYXVzZSBpZiB3ZSBoYXZlbid0LCBjaGFuY2VzIGFyZSB0aGUgdGVtcG9yYXJ5IHdlIGFsbG9jYXRlCiAgICAgIC8vIGluIHRoaXMgYmxvY2sgY2FuIG1hdGNoIGEgcGhpIHdpdGggdGhlIHNhbWUgbmFtZSBpbiB0aGUKICAgICAgLy8gc3VjY2Vzc29yIGJsb2NrLgogICAgICBpZiAodGVtcG9yYXJ5SW5kZXggIT0gMCAmJiByZWdleHAuaGFzTWF0Y2gob3duTmFtZSkpIHsKICAgICAgICBmcmVlVGVtcG9yYXJ5TmFtZXMuYWRkKG93bk5hbWUpOwogICAgICB9CiAgICAgIHVzZWROYW1lcy5yZW1vdmUob3duTmFtZSk7CiAgICB9CiAgfQp9CgovLy8gVmlzaXRzIGFsbCBibG9ja3MgaW4gdGhlIGdyYXBoLCBzZXRzIG5hbWVzIHRvIGluc3RydWN0aW9ucywgYW5kCi8vLyBjcmVhdGVzIHRoZSBbQ29weUhhbmRsZXJdIGZvciBlYWNoIGJsb2NrLiBUaGlzIGNsYXNzIG5lZWRzIHRvIGhhdmUKLy8vIHRoZSBsaXZlSW5zIHNldCBhcyB3ZWxsIGFzIGFsbCB0aGUgbGl2ZSBpbnRlcnZhbHMgb2YgaW5zdHJ1Y3Rpb25zLgovLy8gSXQgdmlzaXRzIHRoZSBncmFwaCBpbiBkb21pbmF0b3Igb3JkZXIsIHNvIHRoYXQgYXQgZWFjaCBlbnRyeSBvZiBhCi8vLyBibG9jaywgdGhlIGluc3RydWN0aW9ucyBpbiBpdHMgbGl2ZUlucyBzZXQgaGF2ZSBuYW1lcy4KLy8vCi8vLyBXaGVuIHZpc2l0aW5nIGEgYmxvY2ssIGl0IGdvZXMgdGhyb3VnaCBhbGwgaW5zdHJ1Y3Rpb25zLiBGb3IgZWFjaAovLy8gaW5zdHJ1Y3Rpb24sIGl0IGZyZWVzIHRoZSBuYW1lcyBvZiB0aGUgaW5wdXRzIHRoYXQgZGllIGF0IHRoYXQKLy8vIGluc3RydWN0aW9uLCBhbmQgYWxsb2NhdGVzIGEgbmFtZSB0byB0aGUgaW5zdHJ1Y3Rpb24uIEZvciBlYWNoIHBoaSwKLy8vIGl0IGFkZHMgYSBjb3B5IHRvIHRoZSBDb3B5SGFuZGxlciBvZiB0aGUgY29ycmVzcG9uZGluZyBwcmVkZWNlc3Nvci4KY2xhc3MgU3NhVmFyaWFibGVBbGxvY2F0b3IgZXh0ZW5kcyBIQmFzZVZpc2l0b3Igd2l0aCBDb2RlZ2VuUGhhc2UgewogIGZpbmFsIE5hbWVyIF9uYW1lcjsKICBmaW5hbCBNYXA8SEJhc2ljQmxvY2ssIExpdmVFbnZpcm9ubWVudD4gbGl2ZUluc3RydWN0aW9uczsKICBmaW5hbCBNYXA8SEluc3RydWN0aW9uLCBMaXZlSW50ZXJ2YWw+IGxpdmVJbnRlcnZhbHM7CiAgZmluYWwgU2V0PEhJbnN0cnVjdGlvbj4gZ2VuZXJhdGVBdFVzZVNpdGU7CgogIGZpbmFsIFZhcmlhYmxlTmFtZXMgbmFtZXM7CgogIFNzYVZhcmlhYmxlQWxsb2NhdG9yKHRoaXMuX25hbWVyLCB0aGlzLmxpdmVJbnN0cnVjdGlvbnMsIHRoaXMubGl2ZUludGVydmFscywKICAgICAgdGhpcy5nZW5lcmF0ZUF0VXNlU2l0ZSkKICAgICAgOiB0aGlzLm5hbWVzID0gbmV3IFZhcmlhYmxlTmFtZXMoKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEdyYXBoKEhHcmFwaCBncmFwaCkgewogICAgdmlzaXREb21pbmF0b3JUcmVlKGdyYXBoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCYXNpY0Jsb2NrKEhCYXNpY0Jsb2NrIGJsb2NrKSB7CiAgICBWYXJpYWJsZU5hbWVyIHZhcmlhYmxlTmFtZXIgPQogICAgICAgIG5ldyBWYXJpYWJsZU5hbWVyKGxpdmVJbnN0cnVjdGlvbnNbYmxvY2tdLCBuYW1lcywgX25hbWVyKTsKCiAgICBibG9jay5mb3JFYWNoUGhpKChIUGhpIHBoaSkgewogICAgICBoYW5kbGVQaGkocGhpLCB2YXJpYWJsZU5hbWVyKTsKICAgIH0pOwoKICAgIGJsb2NrLmZvckVhY2hJbnN0cnVjdGlvbigoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICAgIGhhbmRsZUluc3RydWN0aW9uKGluc3RydWN0aW9uLCB2YXJpYWJsZU5hbWVyKTsKICAgIH0pOwogIH0KCiAgLy8vIFJldHVybnMgd2hldGhlciBbaW5zdHJ1Y3Rpb25dIG5lZWRzIGEgbmFtZS4gSW5zdHJ1Y3Rpb25zIHRoYXQKICAvLy8gaGF2ZSBubyB1c2VycyBvciB0aGF0IGFyZSBnZW5lcmF0ZWQgYXQgdXNlIHNpdGUgZG8gbm90IG5lZWQgYSBuYW1lLgogIGJvb2wgbmVlZHNOYW1lKGluc3RydWN0aW9uKSB7CiAgICBpZiAoaW5zdHJ1Y3Rpb24gaXMgSFRoaXMpIHJldHVybiBmYWxzZTsKICAgIGlmIChpbnN0cnVjdGlvbiBpcyBIUGFyYW1ldGVyVmFsdWUpIHJldHVybiB0cnVlOwogICAgaWYgKGluc3RydWN0aW9uLnVzZWRCeS5pc0VtcHR5KSByZXR1cm4gZmFsc2U7CiAgICBpZiAoZ2VuZXJhdGVBdFVzZVNpdGUuY29udGFpbnMoaW5zdHJ1Y3Rpb24pKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gIWluc3RydWN0aW9uLm5vbkNoZWNrKCkuaXNDb2RlTW90aW9uSW52YXJpYW50KCk7CiAgfQoKICAvLy8gUmV0dXJucyB3aGV0aGVyIFtpbnN0cnVjdGlvbl0gZGllcyBhdCB0aGUgaW5zdHJ1Y3Rpb24gW2F0XS4KICBib29sIGRpZXNBdChISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24sIEhJbnN0cnVjdGlvbiBhdCkgewogICAgTGl2ZUludGVydmFsIGF0SW50ZXJ2YWwgPSBsaXZlSW50ZXJ2YWxzW2F0XTsKICAgIExpdmVJbnRlcnZhbCBpbnN0cnVjdGlvbkludGVydmFsID0gbGl2ZUludGVydmFsc1tpbnN0cnVjdGlvbl07CiAgICBpbnQgc3RhcnQgPSBhdEludGVydmFsLnN0YXJ0OwogICAgcmV0dXJuIGluc3RydWN0aW9uSW50ZXJ2YWwuZGllc0F0KHN0YXJ0KTsKICB9CgogIHZvaWQgZnJlZVVzZWROYW1lc0F0KAogICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24sIEhJbnN0cnVjdGlvbiBhdCwgVmFyaWFibGVOYW1lciBuYW1lcikgewogICAgaWYgKG5lZWRzTmFtZShpbnN0cnVjdGlvbikpIHsKICAgICAgaWYgKGRpZXNBdChpbnN0cnVjdGlvbiwgYXQpKSB7CiAgICAgICAgbmFtZXIuZnJlZU5hbWUoaW5zdHJ1Y3Rpb24pOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGdlbmVyYXRlQXRVc2VTaXRlLmNvbnRhaW5zKGluc3RydWN0aW9uKSkgewogICAgICAvLyBJZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgZ2VuZXJhdGVkIGF0IHVzZSBzaXRlLCB0aGVuIGFsbCBpdHMKICAgICAgLy8gaW5wdXRzIG1heSBhbHNvIGRpZSBhdCBbYXRdLgogICAgICBmb3IgKGludCBpID0gMCwgbGVuID0gaW5zdHJ1Y3Rpb24uaW5wdXRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgSEluc3RydWN0aW9uIGlucHV0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzW2ldOwogICAgICAgIGZyZWVVc2VkTmFtZXNBdChpbnB1dCwgYXQsIG5hbWVyKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBoYW5kbGVJbnN0cnVjdGlvbihISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24sIFZhcmlhYmxlTmFtZXIgbmFtZXIpIHsKICAgIGlmIChnZW5lcmF0ZUF0VXNlU2l0ZS5jb250YWlucyhpbnN0cnVjdGlvbikpIHsKICAgICAgYXNzZXJ0KCFsaXZlSW50ZXJ2YWxzLmNvbnRhaW5zS2V5KGluc3RydWN0aW9uKSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBmb3IgKGludCBpID0gMCwgbGVuID0gaW5zdHJ1Y3Rpb24uaW5wdXRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIEhJbnN0cnVjdGlvbiBpbnB1dCA9IGluc3RydWN0aW9uLmlucHV0c1tpXTsKICAgICAgZnJlZVVzZWROYW1lc0F0KGlucHV0LCBpbnN0cnVjdGlvbiwgbmFtZXIpOwogICAgfQoKICAgIGlmIChuZWVkc05hbWUoaW5zdHJ1Y3Rpb24pKSB7CiAgICAgIG5hbWVyLmFsbG9jYXRlTmFtZShpbnN0cnVjdGlvbik7CiAgICB9CiAgfQoKICB2b2lkIGhhbmRsZVBoaShIUGhpIHBoaSwgVmFyaWFibGVOYW1lciBuYW1lcikgewogICAgaWYgKCFuZWVkc05hbWUocGhpKSkgcmV0dXJuOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhpLmlucHV0cy5sZW5ndGg7IGkrKykgewogICAgICBISW5zdHJ1Y3Rpb24gaW5wdXQgPSBwaGkuaW5wdXRzW2ldOwogICAgICBIQmFzaWNCbG9jayBwcmVkZWNlc3NvciA9IHBoaS5ibG9jay5wcmVkZWNlc3NvcnNbaV07CiAgICAgIC8vIEEgW0hUeXBlS25vd25dIGluc3RydWN0aW9uIG5ldmVyIGhhcyBhIG5hbWUsIGJ1dCBpdHMgY2hlY2tlZAogICAgICAvLyBpbnB1dCBtaWdodCwgdGhlcmVmb3JlIHdlIG5lZWQgdG8gZG8gYSBjb3B5IGluc3RlYWQgb2YgYW4KICAgICAgLy8gYXNzaWdubWVudC4KICAgICAgd2hpbGUgKGlucHV0IGlzIEhUeXBlS25vd24pIGlucHV0ID0gaW5wdXQuaW5wdXRzWzBdOwogICAgICBpZiAoIW5lZWRzTmFtZShpbnB1dCkpIHsKICAgICAgICBuYW1lcy5hZGRBc3NpZ25tZW50KHByZWRlY2Vzc29yLCBpbnB1dCwgcGhpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBuYW1lcy5hZGRDb3B5KHByZWRlY2Vzc29yLCBpbnB1dCwgcGhpKTsKICAgICAgfQogICAgfQoKICAgIG5hbWVyLmFsbG9jYXRlTmFtZShwaGkpOwogIH0KfQqCogBOTjwBGSgpFQFHEhNACyQaBAEMKAIBQhkVLw0gKwFARxJCKQE8EyYmMxgIBgQBKCEaBAFHGCYoBhIEAQwWK0EiBAIBQ0YjGDsuDwE1EwFASkcxKwFIRkUTMQE5NwEyOTMBQkQ7MhxKMEVDKxkqBAFFODNHOT0EAUBIKlBEQUVERicbTDstCCcaCAQBMy4eBAEuLSAEAUctMQw0AgFIPj9GLTABSEtIFhkBIzwBKjcBTEQ/AQwiIzJDBgQBJj9FQwYEAUUzBRIFLRgYFhYWBU8oURBIKiAwMxYGFAQBID8zPw0zQEMzIyRQNDMKCAYEAR4/NEEzISJOMkZCQSVOCAYEAQwsIjsBRkFEFzUmNz4nOQgGAUZKODNCIi0PPQgBOUtBCAYBRycrIjY5QQgXKgYBR0BFLjAIBgEwLSsBRTVFL0EfBgQBLjQqRiNGG1AtMggBIgFCSjNKNAwoKSQMCAgEAgFDQg0QEhcBJwEMMgIBRioUQCkBSCsuARAxNgFAPQQBRkIEAQxFAT0CAUdDFis0AVEiATpASBkBGSAVBAESMzwqGQE0AS0hBAEyIAQBIhwEAU4BSxpCKgQBURpCMAQCAU8WHRYfKRo2AUYnMlEuIwFGK1EwGh0hCAgEATEPOSc9BhEEAR8qNTIGKkQRBAE7NDgVCAYRBAEyESE+HicLLiQwRAYBLTRBDzokCA1CRzQ3GTkPJAgGMAQBQxkdJxEEAUssMRtARkEaPSkIIQYEAgFER0dHOwRGQ0hIRBY8Ny0BHQFPHioBDCIfBAEMLCJDASIlCAE6NQgEAURKICw1Mj88BAFCOzFDIi4EARhIIiUlCDpDJkc0KwgGBAFKMzcOBgFFMjIGASInBgQBMiEBMio7RkMVOx82DzAIBgEdBAIBMHBhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS92YXJpYWJsZV9hbGxvY2F0b3IuZGFydD1zZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9zc2EvaW50ZXJjZXB0b3Jfc2ltcGxpZmllci5kYXJ0wABK4i8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JyBzaG93IENvbW1vbkVsZW1lbnRzOwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvaW50ZXJjZXB0b3JfZGF0YS5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9zZWxlY3Rvci5kYXJ0JyBzaG93IFNlbGVjdG9yOwppbXBvcnQgJy4uL3dvcmxkLmRhcnQnIHNob3cgSkNsb3NlZFdvcmxkOwppbXBvcnQgJ25vZGVzLmRhcnQnOwppbXBvcnQgJ29wdGltaXplLmRhcnQnOwoKLy8vIFRoaXMgcGhhc2Ugc2ltcGxpZmllcyBpbnRlcmNlcHRvcnMgaW4gbXVsdGlwbGUgd2F5czoKLy8vCi8vLyAxKSBJZiB0aGUgaW50ZXJjZXB0b3IgaXMgZm9yIGFuIG9iamVjdCB3aG9zZSB0eXBlIGlzIGtub3duLCBpdAovLy8gdHJpZXMgdG8gdXNlIGEgY29uc3RhbnQgaW50ZXJjZXB0b3IgaW5zdGVhZC4KLy8vCi8vLyAyKSBJbnRlcmNlcHRvcnMgYXJlIHNwZWNpYWxpemVkIGJhc2VkIG9uIHRoZSBzZWxlY3RvciBpdCBpcyB1c2VkIHdpdGguCi8vLwovLy8gMykgSWYgd2Uga25vdyB0aGUgb2JqZWN0IGlzIG5vdCBpbnRlcmNlcHRlZCwgd2UganVzdCB1c2UgdGhlIG9iamVjdAovLy8gaW5zdGVhZC4KLy8vCi8vLyA0KSBTaW5nbGUgdXNlIGludGVyY2VwdG9ycyBhdCBkeW5hbWljIGludm9rZSBzaXRlcyBhcmUgcmVwbGFjZWQgd2l0aCAnb25lCi8vLyBzaG90IGludGVyY2VwdG9ycycgd2hpY2ggYXJlIHN5bnRoZXNpemVkIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zIHRoYXQgZmV0Y2gKLy8vIHRoZSBpbnRlcmNlcHRvciBhbmQgdGhlbiBjYWxsIHRoZSBtZXRob2QuICBUaGlzIHNhdmVzIGNvZGUgc2l6ZSBhbmQgbWFrZXMgdGhlCi8vLyByZWNlaXZlciBvZiBhbiBpbnRlcmNlcHRlZCBjYWxsIGEgY2FuZGlkYXRlIGZvciBiZWluZyBnZW5lcmF0ZWQgYXQgdXNlIHNpdGUuCi8vLwovLy8gNSkgU29tZSBISXMgb3BlcmF0aW9ucyBvbiBhbiBpbnRlcmNlcHRvciBhcmUgcmVwbGFjZWQgd2l0aCBhIEhJcyB2ZXJzaW9uIHRoYXQKLy8vIHVzZXMgJ2luc3RhbmNlb2YnIHJhdGhlciB0aGFuIHRlc3RpbmcgYSB0eXBlIGZsYWcuCi8vLwpjbGFzcyBTc2FTaW1wbGlmeUludGVyY2VwdG9ycyBleHRlbmRzIEhCYXNlVmlzaXRvcgogICAgaW1wbGVtZW50cyBPcHRpbWl6YXRpb25QaGFzZSB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAiU3NhU2ltcGxpZnlJbnRlcmNlcHRvcnMiOwogIGZpbmFsIEpDbG9zZWRXb3JsZCBfY2xvc2VkV29ybGQ7CiAgZmluYWwgQ2xhc3NFbnRpdHkgX2VuY2xvc2luZ0NsYXNzOwogIEhHcmFwaCBfZ3JhcGg7CgogIFNzYVNpbXBsaWZ5SW50ZXJjZXB0b3JzKHRoaXMuX2Nsb3NlZFdvcmxkLCB0aGlzLl9lbmNsb3NpbmdDbGFzcyk7CgogIENvbW1vbkVsZW1lbnRzIGdldCBfY29tbW9uRWxlbWVudHMgPT4gX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzOwoKICBJbnRlcmNlcHRvckRhdGEgZ2V0IF9pbnRlcmNlcHRvckRhdGEgPT4gX2Nsb3NlZFdvcmxkLmludGVyY2VwdG9yRGF0YTsKCiAgQWJzdHJhY3RWYWx1ZURvbWFpbiBnZXQgX2Fic3RyYWN0VmFsdWVEb21haW4gPT4KICAgICAgX2Nsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRHcmFwaChIR3JhcGggZ3JhcGgpIHsKICAgIHRoaXMuX2dyYXBoID0gZ3JhcGg7CiAgICB2aXNpdERvbWluYXRvclRyZWUoZ3JhcGgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJhc2ljQmxvY2soSEJhc2ljQmxvY2sgbm9kZSkgewogICAgY3VycmVudEJsb2NrID0gbm9kZTsKCiAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSBub2RlLmZpcnN0OwogICAgd2hpbGUgKGluc3RydWN0aW9uICE9IG51bGwpIHsKICAgICAgYm9vbCBzaG91bGRSZW1vdmUgPSBpbnN0cnVjdGlvbi5hY2NlcHQodGhpcyk7CiAgICAgIEhJbnN0cnVjdGlvbiBuZXh0ID0gaW5zdHJ1Y3Rpb24ubmV4dDsKICAgICAgaWYgKHNob3VsZFJlbW92ZSkgewogICAgICAgIGluc3RydWN0aW9uLmJsb2NrLnJlbW92ZShpbnN0cnVjdGlvbik7CiAgICAgIH0KICAgICAgaW5zdHJ1Y3Rpb24gPSBuZXh0OwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEluc3RydWN0aW9uKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJbnZva2UoSEludm9rZSBpbnZva2UpIHsKICAgIGlmICghaW52b2tlLmlzSW50ZXJjZXB0ZWRDYWxsKSByZXR1cm4gZmFsc2U7CiAgICBkeW5hbWljIGludGVyY2VwdG9yID0gaW52b2tlLmlucHV0c1swXTsKICAgIGlmIChpbnRlcmNlcHRvciBpcyEgSEludGVyY2VwdG9yKSByZXR1cm4gZmFsc2U7CgogICAgLy8gVE9ETyhzcmEpOiBNb3ZlIHRoaXMgcGVyLWNhbGwgY29kZSB0byB2aXNpdEludGVyY2VwdG9yLgogICAgLy8KICAgIC8vIFRoZSBpbnRlcmNlcHRvciBpcyB2aXNpdGVkIGZpcnN0LCBzbyB3ZSBnZXQgaGVyZSBvbmx5IHdoZW4gdGhlCiAgICAvLyBpbnRlcmNlcHRvciB3YXMgbm90IHJld3JpdHRlbiB0byBhIHNpbmdsZSBzaGFyZWQgcmVwbGFjZW1lbnQuICBJJ20gbm90CiAgICAvLyBzdXJlIHdlIHNob3VsZCBzdWJzdGl0dXRlIGEgY29uc3RhbnQgaW50ZXJjZXB0b3Igb24gYSBwZXItY2FsbCBiYXNpcyBpZgogICAgLy8gdGhlIGludGVyY2VwdG9yIGlzIGFscmVhZHkgYXZhaWxhYmxlIGluIGEgbG9jYWwgdmFyaWFibGUsIGJ1dCBpdCBpcwogICAgLy8gcG9zc2libGUgdGhhdCBhbGwgdXNlcyBjYW4gYmUgcmV3cml0dGVuIHRvIHVzZSBkaWZmZXJlbnQgY29uc3RhbnRzLgoKICAgIEhJbnN0cnVjdGlvbiBjb25zdGFudCA9IHRyeUNvbXB1dGVDb25zdGFudEludGVyY2VwdG9yKAogICAgICAgIGludm9rZS5pbnB1dHNbMV0sIGludGVyY2VwdG9yLmludGVyY2VwdGVkQ2xhc3Nlcyk7CiAgICBpZiAoY29uc3RhbnQgIT0gbnVsbCkgewogICAgICBpbnZva2UuY2hhbmdlVXNlKGludGVyY2VwdG9yLCBjb25zdGFudCk7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBib29sIGNhblVzZVNlbGZGb3JJbnRlcmNlcHRvcihISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIsCiAgICAgIHtTZXQ8Q2xhc3NFbnRpdHk+IGludGVyY2VwdGVkQ2xhc3Nlc30pIHsKICAgIGlmIChyZWNlaXZlci5pc1ByaW1pdGl2ZShfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNQb3RlbnRpYWxseVRydWUpIHsKICAgICAgLy8gUHJpbWl0aXZlcyBhbHdheXMgbmVlZCBpbnRlcmNlcHRvcnMuCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChyZWNlaXZlci5pc051bGwoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzUG90ZW50aWFsbHlUcnVlKSB7CiAgICAgIGlmIChpbnRlcmNlcHRlZENsYXNzZXMgPT0gbnVsbCB8fAogICAgICAgICAgaW50ZXJjZXB0ZWRDbGFzc2VzLmNvbnRhaW5zKF9jb21tb25FbGVtZW50cy5qc051bGxDbGFzcykpIHsKICAgICAgICAvLyBOZWVkIHRoZSBKU051bGwgaW50ZXJjZXB0b3IuCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CgogICAgLy8gQWxsIGludGVyY2VwdGVkIGNsYXNzZXMgZXh0ZW5kIGBJbnRlcmNlcHRvcmAsIHNvIGlmIHRoZSByZWNlaXZlciBjYW4ndCBiZQogICAgLy8gYSBjbGFzcyBleHRlbmRpbmcgYEludGVyY2VwdG9yYCB0aGVuIGl0IGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkuCiAgICByZXR1cm4gX2Fic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAuaXNJbnRlcmNlcHRvcihyZWNlaXZlci5pbnN0cnVjdGlvblR5cGUpCiAgICAgICAgLmlzRGVmaW5pdGVseUZhbHNlOwogIH0KCiAgSEluc3RydWN0aW9uIHRyeUNvbXB1dGVDb25zdGFudEludGVyY2VwdG9yKAogICAgICBISW5zdHJ1Y3Rpb24gaW5wdXQsIFNldDxDbGFzc0VudGl0eT4gaW50ZXJjZXB0ZWRDbGFzc2VzKSB7CiAgICBDbGFzc0VudGl0eSBjb25zdGFudEludGVyY2VwdG9yID0gdHJ5Q29tcHV0ZUNvbnN0YW50SW50ZXJjZXB0b3JGcm9tVHlwZSgKICAgICAgICBpbnB1dC5pbnN0cnVjdGlvblR5cGUsIGludGVyY2VwdGVkQ2xhc3Nlcyk7CgogICAgaWYgKGNvbnN0YW50SW50ZXJjZXB0b3IgPT0gbnVsbCkgcmV0dXJuIG51bGw7CgogICAgLy8gSWYgd2UganVzdCBoYXBwZW4gdG8gYmUgaW4gYW4gaW5zdGFuY2UgbWV0aG9kIG9mIHRoZSBjb25zdGFudAogICAgLy8gaW50ZXJjZXB0b3IsIGB0aGlzYCBpcyBhIHNob3J0ZXIgYWxpYXMuCiAgICBpZiAoY29uc3RhbnRJbnRlcmNlcHRvciA9PSBfZW5jbG9zaW5nQ2xhc3MgJiYKICAgICAgICBfZ3JhcGgudGhpc0luc3RydWN0aW9uICE9IG51bGwpIHsKICAgICAgcmV0dXJuIF9ncmFwaC50aGlzSW5zdHJ1Y3Rpb247CiAgICB9CgogICAgQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IG5ldyBJbnRlcmNlcHRvckNvbnN0YW50VmFsdWUoY29uc3RhbnRJbnRlcmNlcHRvcik7CiAgICByZXR1cm4gX2dyYXBoLmFkZENvbnN0YW50KGNvbnN0YW50LCBfY2xvc2VkV29ybGQpOwogIH0KCiAgQ2xhc3NFbnRpdHkgdHJ5Q29tcHV0ZUNvbnN0YW50SW50ZXJjZXB0b3JGcm9tVHlwZSgKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlLCBTZXQ8Q2xhc3NFbnRpdHk+IGludGVyY2VwdGVkQ2xhc3NlcykgewogICAgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzTnVsbCh0eXBlKS5pc1BvdGVudGlhbGx5VHJ1ZSkgewogICAgICBpZiAoX2Fic3RyYWN0VmFsdWVEb21haW4uaXNOdWxsKHR5cGUpLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICByZXR1cm4gX2NvbW1vbkVsZW1lbnRzLmpzTnVsbENsYXNzOwogICAgICB9CiAgICB9IGVsc2UgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzSW50ZWdlck9yTnVsbCh0eXBlKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiBfY29tbW9uRWxlbWVudHMuanNJbnRDbGFzczsKICAgIH0gZWxzZSBpZiAoX2Fic3RyYWN0VmFsdWVEb21haW4uaXNEb3VibGVPck51bGwodHlwZSkuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICByZXR1cm4gX2NvbW1vbkVsZW1lbnRzLmpzRG91YmxlQ2xhc3M7CiAgICB9IGVsc2UgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzQm9vbGVhbk9yTnVsbCh0eXBlKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiBfY29tbW9uRWxlbWVudHMuanNCb29sQ2xhc3M7CiAgICB9IGVsc2UgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzU3RyaW5nT3JOdWxsKHR5cGUpLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcmV0dXJuIF9jb21tb25FbGVtZW50cy5qc1N0cmluZ0NsYXNzOwogICAgfSBlbHNlIGlmIChfYWJzdHJhY3RWYWx1ZURvbWFpbi5pc0FycmF5KHR5cGUpLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcmV0dXJuIF9jb21tb25FbGVtZW50cy5qc0FycmF5Q2xhc3M7CiAgICB9IGVsc2UgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzTnVtYmVyT3JOdWxsKHR5cGUpLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICAhaW50ZXJjZXB0ZWRDbGFzc2VzLmNvbnRhaW5zKF9jb21tb25FbGVtZW50cy5qc0ludENsYXNzKSAmJgogICAgICAgICFpbnRlcmNlcHRlZENsYXNzZXMuY29udGFpbnMoX2NvbW1vbkVsZW1lbnRzLmpzRG91YmxlQ2xhc3MpKSB7CiAgICAgIC8vIElmIHRoZSBtZXRob2QgYmVpbmcgaW50ZXJjZXB0ZWQgaXMgbm90IGRlZmluZWQgaW4gW2ludF0gb3IgW2RvdWJsZV0gd2UKICAgICAgLy8gY2FuIHNhZmVseSB1c2UgdGhlIG51bWJlciBpbnRlcmNlcHRvci4gIFRoaXMgaXMgYmVjYXVzZSBub25lIG9mIHRoZQogICAgICAvLyBbaW50XSBvciBbZG91YmxlXSBtZXRob2RzIGFyZSBjYWxsZWQgZnJvbSBhIG1ldGhvZCBkZWZpbmVkIG9uIFtudW1dLgogICAgICByZXR1cm4gX2NvbW1vbkVsZW1lbnRzLmpzTnVtYmVyQ2xhc3M7CiAgICB9IGVsc2UgewogICAgICAvLyBUcnkgdG8gZmluZCBjb25zdGFudCBpbnRlcmNlcHRvciBmb3IgYSBuYXRpdmUgY2xhc3MuICBJZiB0aGUgcmVjZWl2ZXIKICAgICAgLy8gaXMgY29uc3RyYWluZWQgdG8gYSBsZWFmIG5hdGl2ZSBjbGFzcywgd2UgY2FuIHVzZSB0aGUgY2xhc3MncwogICAgICAvLyBpbnRlcmNlcHRvciBkaXJlY3RseS4KCiAgICAgIC8vIFRPRE8oc3JhKTogS2V5IERPTSBjbGFzc2VzIGxpa2UgTm9kZSwgRWxlbWVudCBhbmQgRXZlbnQgYXJlIG5vdCBsZWFmCiAgICAgIC8vIGNsYXNzZXMuICBXaGVuIHRoZSByZWNlaXZlciB0eXBlIGlzIG5vdCBhIGxlYWYgY2xhc3MsIHdlIG1pZ2h0IHN0aWxsIGJlCiAgICAgIC8vIGFibGUgdG8gdXNlIHRoZSByZWNlaXZlciBjbGFzcyBhcyBhIGNvbnN0YW50IGludGVyY2VwdG9yLiAgSXQgaXMKICAgICAgLy8gdXN1YWxseSB0aGUgY2FzZSB0aGF0IG1ldGhvZHMgZGVmaW5lZCBvbiBhIG5vbi1sZWFmIGNsYXNzIGRvbid0IHRlc3QKICAgICAgLy8gZm9yIGEgc3ViY2xhc3Mgb3IgY2FsbCBtZXRob2RzIGRlZmluZWQgb24gYSBzdWJjbGFzcy4gIFByb3ZpZGVkIHRoZQogICAgICAvLyBjb2RlIGlzIGNvbXBsZXRlbHkgaW5zZW5zaXRpdmUgdG8gdGhlIHNwZWNpZmljIGluc3RhbmNlIHN1YmNsYXNzZXMsIHdlCiAgICAgIC8vIGNhbiB1c2UgdGhlIG5vbi1sZWFmIGNsYXNzIGRpcmVjdGx5LgogICAgICBDbGFzc0VudGl0eSBlbGVtZW50ID0gX2Fic3RyYWN0VmFsdWVEb21haW4uZ2V0RXhhY3RDbGFzcyh0eXBlKTsKICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBfY2xvc2VkV29ybGQubmF0aXZlRGF0YS5pc05hdGl2ZUNsYXNzKGVsZW1lbnQpKSB7CiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbnVsbDsKICB9CgogIEhJbnN0cnVjdGlvbiBmaW5kRG9taW5hdG9yKEl0ZXJhYmxlPEhJbnN0cnVjdGlvbj4gaW5zdHJ1Y3Rpb25zKSB7CiAgICBISW5zdHJ1Y3Rpb24gcmVzdWx0OwogICAgTDE6CiAgICBmb3IgKEhJbnN0cnVjdGlvbiBjYW5kaWRhdGUgaW4gaW5zdHJ1Y3Rpb25zKSB7CiAgICAgIGZvciAoSEluc3RydWN0aW9uIGN1cnJlbnQgaW4gaW5zdHJ1Y3Rpb25zKSB7CiAgICAgICAgaWYgKGN1cnJlbnQgIT0gY2FuZGlkYXRlICYmICFjYW5kaWRhdGUuZG9taW5hdGVzKGN1cnJlbnQpKSBjb250aW51ZSBMMTsKICAgICAgfQogICAgICByZXN1bHQgPSBjYW5kaWRhdGU7CiAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBpbnQgdXNlQ291bnQoSEluc3RydWN0aW9uIHVzZXIsIEhJbnN0cnVjdGlvbiB1c2VkKSA9PgogICAgICB1c2VyLmlucHV0cy53aGVyZSgoaW5wdXQpID0+IGlucHV0ID09IHVzZWQpLmxlbmd0aDsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEludGVyY2VwdG9yKEhJbnRlcmNlcHRvciBub2RlKSB7CiAgICBpZiAobm9kZS5yZWNlaXZlci5ub25DaGVjaygpID09IF9ncmFwaC5leHBsaWNpdFJlY2VpdmVyUGFyYW1ldGVyKSB7CiAgICAgIC8vIElmIGBleHBsaWNpdFJlY2VpdmVyUGFyYW1ldGVyYCBpcyBzZXQgaXQgbWVhbnMgdGhlIGN1cnJlbnQgbWV0aG9kIGlzIGFuCiAgICAgIC8vIGludGVyY2VwdG9yIG1ldGhvZCwgYW5kIGB0aGlzYCBpcyB0aGUgaW50ZXJjZXB0b3IuICBUaGUgY2FsbGVyIGp1c3QgZGlkCiAgICAgIC8vIGBnZXRJbnRlcmNlcHRvcihmb28pLmN1cnJlbnRNZXRob2QoZm9vKWAgdG8gZW50ZXIgdGhlIGN1cnJlbnQgbWV0aG9kLgogICAgICBub2RlLmJsb2NrLnJld3JpdGUobm9kZSwgX2dyYXBoLnRoaXNJbnN0cnVjdGlvbik7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHJld3JpdGVTZWxmSW50ZXJjZXB0b3JVc2VzKG5vZGUpOwoKICAgIGlmIChub2RlLnVzZWRCeS5pc0VtcHR5KSByZXR1cm4gdHJ1ZTsKCiAgICAvLyBTcGVjaWFsaXplIHRoZSBpbnRlcmNlcHRvciB3aXRoIHNldCBvZiBjbGFzc2VzIGl0IGludGVyY2VwdHMsIGNvbnNpZGVyaW5nCiAgICAvLyBhbGwgdXNlcy4gIChUaGUgc3BlY2lhbGl6ZWQgaW50ZXJjZXB0b3IgaGFzIGEgc2hvcnRlciBkaXNwYXRjaCBjaGFpbikuCiAgICAvLyBUaGlzIG9wZXJhdGlvbiBhcHBsaWVzIG9ubHkgd2hlcmUgdGhlIGludGVyY2VwdG9yIGlzIHVzZWQgdG8gZGlzcGF0Y2ggYQogICAgLy8gbWV0aG9kLiAgT3RoZXIgdXNlcywgZS5nLiBhcyBhbiBvcmRpbmFyeSBhcmd1bWVudCBvciBhIEhJcyBjaGVjayB1c2UgdGhlCiAgICAvLyBtb3N0IGdlbmVyYWwgaW50ZXJjZXB0b3IuCiAgICAvLwogICAgLy8gVE9ETyhzcmEpOiBUYWtlIGludG8gYWNjb3VudCB0aGUgcmVjZWl2ZXIgdHlwZSBhdCBlYWNoIGNhbGwuICBlLmc6CiAgICAvLwogICAgLy8gICAgIChhKSA9PiBhLmxlbmd0aCArIGEuaGFzaENvZGUKICAgIC8vCiAgICAvLyBDdXJyZW50bHkgd2UgdXNlIHRoZSBtb3N0IGdlbmVyYWwgaW50ZXJjZXB0b3Igc2luY2UgYWxsIGludGVyY2VwdGVkIHR5cGVzCiAgICAvLyBpbXBsZW1lbnQgYGhhc2hDb2RlYC4gQnV0IGluIHRoaXMgZXhhbXBsZSwgYGEuaGFzaENvZGVgIGlzIG9ubHkgcmVhY2hlZAogICAgLy8gaWYgYGEubGVuZ3RoYCBzdWNjZWVkcywgd2hpY2ggaXMgaW5kaWNhdGVkIGJ5IHRoZSBoYXNoQ29kZSByZWNlaXZlciBiZWluZwogICAgLy8gYSBIVHlwZUtub3duIGluc3RydWN0aW9uLgoKICAgIFNldDxDbGFzc0VudGl0eT4gaW50ZXJjZXB0ZWRDbGFzc2VzOwogICAgSEluc3RydWN0aW9uIGRvbWluYXRvciA9IGZpbmREb21pbmF0b3Iobm9kZS51c2VkQnkpOwogICAgLy8gSWYgdGhlcmUgaXMgYSBjYWxsIHRoYXQgZG9taW5hdGVzIGFsbCBvdGhlciB1c2VzLCB3ZSBjYW4gdXNlIGp1c3QgdGhlCiAgICAvLyBzZWxlY3RvciBvZiB0aGF0IGluc3RydWN0aW9uLgogICAgaWYgKGRvbWluYXRvciBpcyBISW52b2tlRHluYW1pYyAmJgogICAgICAgIGRvbWluYXRvci5pc0NhbGxPbkludGVyY2VwdG9yKF9jbG9zZWRXb3JsZCkgJiYKICAgICAgICBub2RlID09IGRvbWluYXRvci5yZWNlaXZlciAmJgogICAgICAgIHVzZUNvdW50KGRvbWluYXRvciwgbm9kZSkgPT0gMSkgewogICAgICBpbnRlcmNlcHRlZENsYXNzZXMgPSBfaW50ZXJjZXB0b3JEYXRhLmdldEludGVyY2VwdGVkQ2xhc3Nlc09uKAogICAgICAgICAgZG9taW5hdG9yLnNlbGVjdG9yLm5hbWUsIF9jbG9zZWRXb3JsZCk7CgogICAgICAvLyBJZiB3ZSBmb3VuZCB0aGF0IHdlIG5lZWQgbnVtYmVyLCB3ZSBtdXN0IHN0aWxsIGdvIHRocm91Z2ggYWxsCiAgICAgIC8vIHVzZXMgdG8gY2hlY2sgaWYgdGhleSByZXF1aXJlIGludCwgb3IgZG91YmxlLgogICAgICBpZiAoaW50ZXJjZXB0ZWRDbGFzc2VzLmNvbnRhaW5zKF9jb21tb25FbGVtZW50cy5qc051bWJlckNsYXNzKSAmJgogICAgICAgICAgIShpbnRlcmNlcHRlZENsYXNzZXMuY29udGFpbnMoX2NvbW1vbkVsZW1lbnRzLmpzRG91YmxlQ2xhc3MpIHx8CiAgICAgICAgICAgICAgaW50ZXJjZXB0ZWRDbGFzc2VzLmNvbnRhaW5zKF9jb21tb25FbGVtZW50cy5qc0ludENsYXNzKSkpIHsKICAgICAgICBTZXQ8Q2xhc3NFbnRpdHk+IHJlcXVpcmVkOwogICAgICAgIGZvciAoSEluc3RydWN0aW9uIHVzZXIgaW4gbm9kZS51c2VkQnkpIHsKICAgICAgICAgIGlmICh1c2VyIGlzISBISW52b2tlKSBjb250aW51ZTsKICAgICAgICAgIFNldDxDbGFzc0VudGl0eT4gaW50ZXJjZXB0ZWQgPSBfaW50ZXJjZXB0b3JEYXRhCiAgICAgICAgICAgICAgLmdldEludGVyY2VwdGVkQ2xhc3Nlc09uKHVzZXIuc2VsZWN0b3IubmFtZSwgX2Nsb3NlZFdvcmxkKTsKICAgICAgICAgIGlmIChpbnRlcmNlcHRlZC5jb250YWlucyhfY29tbW9uRWxlbWVudHMuanNJbnRDbGFzcykpIHsKICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVXNlIHR5cGUgYXJndW1lbnQgd2hlbiBhbGwgdXNlcyBvZgogICAgICAgICAgICAvLyBpbnRlcmNlcHRlZCBjbGFzc2VzIGV4cGVjdCBlbnRpdGllcyBpbnN0ZWFkIG9mIGVsZW1lbnRzLgogICAgICAgICAgICByZXF1aXJlZCA/Pz0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKICAgICAgICAgICAgcmVxdWlyZWQuYWRkKF9jb21tb25FbGVtZW50cy5qc0ludENsYXNzKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpbnRlcmNlcHRlZC5jb250YWlucyhfY29tbW9uRWxlbWVudHMuanNEb3VibGVDbGFzcykpIHsKICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVXNlIHR5cGUgYXJndW1lbnQgd2hlbiBhbGwgdXNlcyBvZgogICAgICAgICAgICAvLyBpbnRlcmNlcHRlZCBjbGFzc2VzIGV4cGVjdCBlbnRpdGllcyBpbnN0ZWFkIG9mIGVsZW1lbnRzLgogICAgICAgICAgICByZXF1aXJlZCA/Pz0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKICAgICAgICAgICAgcmVxdWlyZWQuYWRkKF9jb21tb25FbGVtZW50cy5qc0RvdWJsZUNsYXNzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gRG9uJ3QgbW9kaWZ5IHRoZSByZXN1bHQgb2YKICAgICAgICAvLyBbX2ludGVyY2VwdG9yRGF0YS5nZXRJbnRlcmNlcHRlZENsYXNzZXNPbl0uCiAgICAgICAgaWYgKHJlcXVpcmVkICE9IG51bGwpIHsKICAgICAgICAgIGludGVyY2VwdGVkQ2xhc3NlcyA9IGludGVyY2VwdGVkQ2xhc3Nlcy51bmlvbihyZXF1aXJlZCk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2UgdHlwZSBhcmd1bWVudCB3aGVuIGFsbCB1c2VzIG9mIGludGVyY2VwdGVkCiAgICAgIC8vIGNsYXNzZXMgZXhwZWN0IGVudGl0aWVzIGluc3RlYWQgb2YgZWxlbWVudHMuCiAgICAgIGludGVyY2VwdGVkQ2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CiAgICAgIGZvciAoSEluc3RydWN0aW9uIHVzZXIgaW4gbm9kZS51c2VkQnkpIHsKICAgICAgICBpZiAodXNlciBpcyBISW52b2tlRHluYW1pYyAmJgogICAgICAgICAgICB1c2VyLmlzQ2FsbE9uSW50ZXJjZXB0b3IoX2Nsb3NlZFdvcmxkKSAmJgogICAgICAgICAgICBub2RlID09IHVzZXIucmVjZWl2ZXIgJiYKICAgICAgICAgICAgdXNlQ291bnQodXNlciwgbm9kZSkgPT0gMSkgewogICAgICAgICAgaW50ZXJjZXB0ZWRDbGFzc2VzLmFkZEFsbChfaW50ZXJjZXB0b3JEYXRhLmdldEludGVyY2VwdGVkQ2xhc3Nlc09uKAogICAgICAgICAgICAgIHVzZXIuc2VsZWN0b3IubmFtZSwgX2Nsb3NlZFdvcmxkKSk7CiAgICAgICAgfSBlbHNlIGlmICh1c2VyIGlzIEhJbnZva2VTdXBlciAmJgogICAgICAgICAgICB1c2VyLmlzQ2FsbE9uSW50ZXJjZXB0b3IoX2Nsb3NlZFdvcmxkKSAmJgogICAgICAgICAgICBub2RlID09IHVzZXIucmVjZWl2ZXIgJiYKICAgICAgICAgICAgdXNlQ291bnQodXNlciwgbm9kZSkgPT0gMSkgewogICAgICAgICAgaW50ZXJjZXB0ZWRDbGFzc2VzLmFkZEFsbChfaW50ZXJjZXB0b3JEYXRhLmdldEludGVyY2VwdGVkQ2xhc3Nlc09uKAogICAgICAgICAgICAgIHVzZXIuc2VsZWN0b3IubmFtZSwgX2Nsb3NlZFdvcmxkKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFVzZSBhIG1vc3QgZ2VuZXJhbCBpbnRlcmNlcHRvciBmb3Igb3RoZXIgaW5zdHJ1Y3Rpb25zLCBleGFtcGxlLAogICAgICAgICAgLy8gaXMtY2hlY2tzIGFuZCBlc2NhcGluZyBpbnRlcmNlcHRvcnMuCiAgICAgICAgICBpbnRlcmNlcHRlZENsYXNzZXMuYWRkQWxsKF9pbnRlcmNlcHRvckRhdGEuaW50ZXJjZXB0ZWRDbGFzc2VzKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIG5vZGUuaW50ZXJjZXB0ZWRDbGFzc2VzID0gaW50ZXJjZXB0ZWRDbGFzc2VzOwoKICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciA9IG5vZGUucmVjZWl2ZXI7CgogICAgLy8gVHJ5IGNvbXB1dGluZyBhIGNvbnN0YW50IGludGVyY2VwdG9yLgogICAgSEluc3RydWN0aW9uIGNvbnN0YW50SW50ZXJjZXB0b3IgPQogICAgICAgIHRyeUNvbXB1dGVDb25zdGFudEludGVyY2VwdG9yKHJlY2VpdmVyLCBpbnRlcmNlcHRlZENsYXNzZXMpOwogICAgaWYgKGNvbnN0YW50SW50ZXJjZXB0b3IgIT0gbnVsbCkgewogICAgICBub2RlLmJsb2NrLnJld3JpdGUobm9kZSwgY29uc3RhbnRJbnRlcmNlcHRvcik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBJZiBpdCBpcyBhIGNvbmRpdGlvbmFsIGNvbnN0YW50IGludGVyY2VwdG9yIGFuZCB3YXMgbm90IHN0cmVuZ3RoZW5lZCB0byBhCiAgICAvLyBjb25zdGFudCBpbnRlcmNlcHRvciB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgbW9yZSB3ZSBjYW4gZG8uCiAgICBpZiAobm9kZS5pc0NvbmRpdGlvbmFsQ29uc3RhbnRJbnRlcmNlcHRvcikgcmV0dXJuIGZhbHNlOwoKICAgIC8vIERvIHdlIGhhdmUgYW4gJ2FsbW9zdCBjb25zdGFudCcgaW50ZXJjZXB0b3I/ICBUaGUgcmVjZWl2ZXIgY291bGQgYmUKICAgIC8vIGBudWxsYCBidXQgbm90IGFueSBvdGhlciBKYXZhU2NyaXB0IGZhbHN5IHZhbHVlLCBgbnVsbGAgdmFsdWVzIGNhdXNlCiAgICAvLyBgTm9TdWNoTWV0aG9kRXJyb3JgcywgYW5kIGlmIHRoZSByZWNlaXZlciB3YXMgbm90IG51bGwgd2Ugd291bGQgaGF2ZSBhCiAgICAvLyBjb25zdGFudCBpbnRlcmNlcHRvciBgQ2AuICBUaGVuIHdlIGNhbiB1c2UgYChyZWNlaXZlciAmJiBDKWAgZm9yIHRoZQogICAgLy8gaW50ZXJjZXB0b3IuCiAgICBpZiAocmVjZWl2ZXIuaXNOdWxsKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc1BvdGVudGlhbGx5VHJ1ZSkgewogICAgICBpZiAoIWludGVyY2VwdGVkQ2xhc3Nlcy5jb250YWlucyhfY29tbW9uRWxlbWVudHMuanNOdWxsQ2xhc3MpKSB7CiAgICAgICAgLy8gQ2FuIHVzZSBgKHJlY2VpdmVyICYmIEMpYCBvbmx5IGlmIHJlY2VpdmVyIGlzIGVpdGhlciBudWxsIG9yIHRydXRoeS4KICAgICAgICBpZiAoIShyZWNlaXZlcgogICAgICAgICAgICAgICAgLmlzUHJpbWl0aXZlTnVtYmVyKF9hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgICAgICAgLmlzUG90ZW50aWFsbHlUcnVlIHx8CiAgICAgICAgICAgIHJlY2VpdmVyCiAgICAgICAgICAgICAgICAuaXNQcmltaXRpdmVCb29sZWFuKF9hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgICAgICAgLmlzUG90ZW50aWFsbHlUcnVlIHx8CiAgICAgICAgICAgIHJlY2VpdmVyCiAgICAgICAgICAgICAgICAuaXNQcmltaXRpdmVTdHJpbmcoX2Fic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgICAgICAuaXNQb3RlbnRpYWxseVRydWUpKSB7CiAgICAgICAgICBDbGFzc0VudGl0eSBpbnRlcmNlcHRvckNsYXNzID0gdHJ5Q29tcHV0ZUNvbnN0YW50SW50ZXJjZXB0b3JGcm9tVHlwZSgKICAgICAgICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5leGNsdWRlTnVsbChyZWNlaXZlci5pbnN0cnVjdGlvblR5cGUpLAogICAgICAgICAgICAgIGludGVyY2VwdGVkQ2xhc3Nlcyk7CiAgICAgICAgICBpZiAoaW50ZXJjZXB0b3JDbGFzcyAhPSBudWxsKSB7CiAgICAgICAgICAgIEhJbnN0cnVjdGlvbiBjb25zdGFudEluc3RydWN0aW9uID0gX2dyYXBoLmFkZENvbnN0YW50KAogICAgICAgICAgICAgICAgbmV3IEludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZShpbnRlcmNlcHRvckNsYXNzKSwgX2Nsb3NlZFdvcmxkKTsKICAgICAgICAgICAgbm9kZS5jb25kaXRpb25hbENvbnN0YW50SW50ZXJjZXB0b3IgPSBjb25zdGFudEluc3RydWN0aW9uOwogICAgICAgICAgICBjb25zdGFudEluc3RydWN0aW9uLnVzZWRCeS5hZGQobm9kZSk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBUcnkgY3JlYXRpbmcgYSBvbmUtc2hvdCBpbnRlcmNlcHRvciBvciBvcHRpbWl6ZWQgaXMtY2hlY2sKICAgIGlmIChub2RlLnVzZWRCeS5sZW5ndGggIT0gMSkgcmV0dXJuIGZhbHNlOwogICAgSEluc3RydWN0aW9uIHVzZXIgPSBub2RlLnVzZWRCeS5zaW5nbGU7CgogICAgLy8gSWYgdGhlIGludGVyY2VwdG9yIFtub2RlXSB3YXMgbG9vcCBob2lzdGVkLCB3ZSBrZWVwIHRoZSBpbnRlcmNlcHRvci4KICAgIGlmICghdXNlci5oYXNTYW1lTG9vcEhlYWRlckFzKG5vZGUpKSByZXR1cm4gZmFsc2U7CgogICAgYm9vbCByZXBsYWNlVXNlcldpdGgoSEluc3RydWN0aW9uIHJlcGxhY2VtZW50KSB7CiAgICAgIEhCYXNpY0Jsb2NrIGJsb2NrID0gdXNlci5ibG9jazsKICAgICAgYmxvY2suYWRkQWZ0ZXIodXNlciwgcmVwbGFjZW1lbnQpOwogICAgICBibG9jay5yZXdyaXRlKHVzZXIsIHJlcGxhY2VtZW50KTsKICAgICAgYmxvY2sucmVtb3ZlKHVzZXIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaWYgKHVzZXIgaXMgSElzKSB7CiAgICAgIC8vIFNlZSBpZiB3ZSBjYW4gcmV3cml0ZSB0aGUgaXMtY2hlY2sgdG8gdXNlICdpbnN0YW5jZW9mJywgaS5lLiByZXdyaXRlCiAgICAgIC8vICJnZXRJbnRlcmNlcHRvcih4KS4kaXNUIiB0byAieCBpbnN0YW5jZW9mIFQiLgogICAgICBpZiAobm9kZSA9PSB1c2VyLmludGVyY2VwdG9yKSB7CiAgICAgICAgaWYgKF9pbnRlcmNlcHRvckRhdGEubWF5R2VuZXJhdGVJbnN0YW5jZW9mQ2hlY2soCiAgICAgICAgICAgIHVzZXIudHlwZUV4cHJlc3Npb24sIF9jbG9zZWRXb3JsZCkpIHsKICAgICAgICAgIEhJbnN0cnVjdGlvbiBpbnN0YW5jZW9mQ2hlY2sgPSBuZXcgSElzLmluc3RhbmNlT2YodXNlci50eXBlRXhwcmVzc2lvbiwKICAgICAgICAgICAgICB1c2VyLmV4cHJlc3Npb24sIHVzZXIuaW5zdHJ1Y3Rpb25UeXBlLCB1c2VyLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgICAgIGluc3RhbmNlb2ZDaGVjay5zb3VyY2VFbGVtZW50ID0gdXNlci5zb3VyY2VFbGVtZW50OwogICAgICAgICAgcmV0dXJuIHJlcGxhY2VVc2VyV2l0aChpbnN0YW5jZW9mQ2hlY2spOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmICh1c2VyIGlzIEhJbnZva2VEeW5hbWljKSB7CiAgICAgIGlmIChub2RlID09IHVzZXIuaW5wdXRzWzBdKSB7CiAgICAgICAgLy8gUmVwbGFjZSB0aGUgdXNlciB3aXRoIGEgW0hPbmVTaG90SW50ZXJjZXB0b3JdLgogICAgICAgIEhDb25zdGFudCBudWxsQ29uc3RhbnQgPSBfZ3JhcGguYWRkQ29uc3RhbnROdWxsKF9jbG9zZWRXb3JsZCk7CiAgICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cyA9IG5ldyBMaXN0PEhJbnN0cnVjdGlvbj4uZnJvbSh1c2VyLmlucHV0cyk7CiAgICAgICAgaW5wdXRzWzBdID0gbnVsbENvbnN0YW50OwogICAgICAgIEhPbmVTaG90SW50ZXJjZXB0b3Igb25lU2hvdEludGVyY2VwdG9yID0gbmV3IEhPbmVTaG90SW50ZXJjZXB0b3IoCiAgICAgICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICAgICAgICB1c2VyLnNlbGVjdG9yLAogICAgICAgICAgICB1c2VyLm1hc2ssCiAgICAgICAgICAgIGlucHV0cywKICAgICAgICAgICAgdXNlci5pbnN0cnVjdGlvblR5cGUsCiAgICAgICAgICAgIHVzZXIudHlwZUFyZ3VtZW50cywKICAgICAgICAgICAgaW50ZXJjZXB0ZWRDbGFzc2VzKTsKICAgICAgICBvbmVTaG90SW50ZXJjZXB0b3Iuc291cmNlSW5mb3JtYXRpb24gPSB1c2VyLnNvdXJjZUluZm9ybWF0aW9uOwogICAgICAgIG9uZVNob3RJbnRlcmNlcHRvci5zb3VyY2VFbGVtZW50ID0gdXNlci5zb3VyY2VFbGVtZW50OwogICAgICAgIHJldHVybiByZXBsYWNlVXNlcldpdGgob25lU2hvdEludGVyY2VwdG9yKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBmYWxzZTsKICB9CgogIHZvaWQgcmV3cml0ZVNlbGZJbnRlcmNlcHRvclVzZXMoSEludGVyY2VwdG9yIG5vZGUpIHsKICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciA9IG5vZGUucmVjZWl2ZXI7CgogICAgLy8gQXQgaW5zdHJ1Y3Rpb25zIHRoYXQgdXNlIHRoZSBpbnRlcmNlcHRvciBhbmQgaXRzIHJlY2VpdmVyLCB0aGUgcmVjZWl2ZXIKICAgIC8vIG1pZ2h0IGJlIHJlZmluZWQgYXQgdGhlIHVzZSBzaXRlLgoKICAgIC8vICAgICBkeW5hbWljIHggPSAuLi4KICAgIC8vICAgICBpZiAoeCBpcyBNdW1ibGUpIHsKICAgIC8vICAgICAgIHByaW50KHgubGVuZ3RoKTsgIC8vIFNlbGYtaW50ZXJjZXB0b3IgaGVyZS4KICAgIC8vICAgICB9IGVsc2UgewogICAgLy8gICAgICAgcHJpbnQoeC5sZW5ndGgpOyAgLy8KICAgIC8vICAgICB9CgogICAgZmluaXNoSW52b2tlKEhJbnZva2UgaW52b2tlLCBTZWxlY3RvciBzZWxlY3RvcikgewogICAgICBISW5zdHJ1Y3Rpb24gY2FsbFJlY2VpdmVyID0gaW52b2tlLmdldERhcnRSZWNlaXZlcihfY2xvc2VkV29ybGQpOwogICAgICBpZiAocmVjZWl2ZXIubm9uQ2hlY2soKSA9PSBjYWxsUmVjZWl2ZXIubm9uQ2hlY2soKSkgewogICAgICAgIFNldDxDbGFzc0VudGl0eT4gaW50ZXJjZXB0ZWRDbGFzc2VzID0gX2ludGVyY2VwdG9yRGF0YQogICAgICAgICAgICAuZ2V0SW50ZXJjZXB0ZWRDbGFzc2VzT24oc2VsZWN0b3IubmFtZSwgX2Nsb3NlZFdvcmxkKTsKCiAgICAgICAgaWYgKGNhblVzZVNlbGZGb3JJbnRlcmNlcHRvcihjYWxsUmVjZWl2ZXIsCiAgICAgICAgICAgIGludGVyY2VwdGVkQ2xhc3NlczogaW50ZXJjZXB0ZWRDbGFzc2VzKSkgewogICAgICAgICAgaW52b2tlLmNoYW5nZVVzZShub2RlLCBjYWxsUmVjZWl2ZXIpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGZvciAoSEluc3RydWN0aW9uIHVzZXIgaW4gbm9kZS51c2VkQnkudG9MaXN0KCkpIHsKICAgICAgaWYgKHVzZXIgaXMgSElzKSB7CiAgICAgICAgaWYgKHVzZXIuaW50ZXJjZXB0b3IgPT0gbm9kZSkgewogICAgICAgICAgSEluc3RydWN0aW9uIGV4cHJlc3Npb24gPSB1c2VyLmV4cHJlc3Npb247CiAgICAgICAgICBpZiAoY2FuVXNlU2VsZkZvckludGVyY2VwdG9yKGV4cHJlc3Npb24pKSB7CiAgICAgICAgICAgIHVzZXIuY2hhbmdlVXNlKG5vZGUsIGV4cHJlc3Npb24pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh1c2VyIGlzIEhJbnZva2VEeW5hbWljKSB7CiAgICAgICAgaWYgKHVzZXIuaXNDYWxsT25JbnRlcmNlcHRvcihfY2xvc2VkV29ybGQpICYmCiAgICAgICAgICAgIG5vZGUgPT0gdXNlci5pbnB1dHNbMF0gJiYKICAgICAgICAgICAgdXNlQ291bnQodXNlciwgbm9kZSkgPT0gMSkgewogICAgICAgICAgZmluaXNoSW52b2tlKHVzZXIsIHVzZXIuc2VsZWN0b3IpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh1c2VyIGlzIEhJbnZva2VTdXBlcikgewogICAgICAgIGlmICh1c2VyLmlzQ2FsbE9uSW50ZXJjZXB0b3IoX2Nsb3NlZFdvcmxkKSAmJgogICAgICAgICAgICBub2RlID09IHVzZXIuaW5wdXRzWzBdICYmCiAgICAgICAgICAgIHVzZUNvdW50KHVzZXIsIG5vZGUpID09IDEpIHsKICAgICAgICAgIGZpbmlzaEludm9rZSh1c2VyLCB1c2VyLnNlbGVjdG9yKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVE9ETyhzcmEpOiBBcmUgdGhlcmUgb3RoZXIgcGFpcmVkIHVzZXMgb2YgdGhlIHJlY2VpdmVyIGFuZAogICAgICAgIC8vIGludGVyY2VwdG9yIHdoZXJlIHdlIGNhbiBtYWtlIHVzZSBvZiBhIHN0cmVuZ3RoZW5lZCByZWNlaXZlcj8KICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdE9uZVNob3RJbnRlcmNlcHRvcihIT25lU2hvdEludGVyY2VwdG9yIG5vZGUpIHsKICAgIC8vICdVbmRvJyB0aGUgb25lLXNob3QgdHJhbnNmb3JtYXRpb24gaWYgdGhlIHJlY2VpdmVyIGhhcyBhIGNvbnN0YW50CiAgICAvLyBpbnRlcmNlcHRvci4KICAgIEhJbnN0cnVjdGlvbiBjb25zdGFudCA9CiAgICAgICAgdHJ5Q29tcHV0ZUNvbnN0YW50SW50ZXJjZXB0b3Iobm9kZS5pbnB1dHNbMV0sIG5vZGUuaW50ZXJjZXB0ZWRDbGFzc2VzKTsKCiAgICBpZiAoY29uc3RhbnQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwoKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gbm9kZS5zZWxlY3RvcjsKICAgIEFic3RyYWN0VmFsdWUgbWFzayA9IG5vZGUubWFzazsKICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbjsKICAgIGlmIChzZWxlY3Rvci5pc0dldHRlcikgewogICAgICBpbnN0cnVjdGlvbiA9IG5ldyBISW52b2tlRHluYW1pY0dldHRlcigKICAgICAgICAgIHNlbGVjdG9yLAogICAgICAgICAgbWFzaywKICAgICAgICAgIG5vZGUuZWxlbWVudCwKICAgICAgICAgIDxISW5zdHJ1Y3Rpb24+W2NvbnN0YW50LCBub2RlLmlucHV0c1sxXV0sCiAgICAgICAgICB0cnVlLAogICAgICAgICAgbm9kZS5pbnN0cnVjdGlvblR5cGUsCiAgICAgICAgICBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaXNTZXR0ZXIpIHsKICAgICAgaW5zdHJ1Y3Rpb24gPSBuZXcgSEludm9rZUR5bmFtaWNTZXR0ZXIoCiAgICAgICAgICBzZWxlY3RvciwKICAgICAgICAgIG1hc2ssCiAgICAgICAgICBub2RlLmVsZW1lbnQsCiAgICAgICAgICA8SEluc3RydWN0aW9uPltjb25zdGFudCwgbm9kZS5pbnB1dHNbMV0sIG5vZGUuaW5wdXRzWzJdXSwKICAgICAgICAgIHRydWUsCiAgICAgICAgICBub2RlLmluc3RydWN0aW9uVHlwZSwKICAgICAgICAgIG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cyA9IG5ldyBMaXN0PEhJbnN0cnVjdGlvbj4uZnJvbShub2RlLmlucHV0cyk7CiAgICAgIGlucHV0c1swXSA9IGNvbnN0YW50OwogICAgICBpbnN0cnVjdGlvbiA9IG5ldyBISW52b2tlRHluYW1pY01ldGhvZChzZWxlY3RvciwgbWFzaywgaW5wdXRzLAogICAgICAgICAgbm9kZS5pbnN0cnVjdGlvblR5cGUsIG5vZGUudHlwZUFyZ3VtZW50cywgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgICAgIGlzSW50ZXJjZXB0ZWQ6IHRydWUpOwogICAgfQoKICAgIEhCYXNpY0Jsb2NrIGJsb2NrID0gbm9kZS5ibG9jazsKICAgIGJsb2NrLmFkZEFmdGVyKG5vZGUsIGluc3RydWN0aW9uKTsKICAgIGJsb2NrLnJld3JpdGUobm9kZSwgaW5zdHJ1Y3Rpb24pOwogICAgcmV0dXJuIHRydWU7CiAgfQp9CoHlAE5OPAE2IyQxLjIqFRgBOQRDMQRLBEgNBE5QUlEEUjcEMyMMMSMlEQFEAUUBSAEyKAEMIhkfBAEMKxkBKyI0LBovCBoGBAEMPAEMJTEsNAE/B0ZOT0tLATs7HC8GEgQBNy9ILhQGQyhGKBYIBgFRRyAxHAQBLkFNNAEyAUUvMiolBgFQNwQBNUE/QCwITilNLE4qTSxGK01ER1BNTiwNT0cfAU5RSk5NUC5GTxgIBgERBAFEGQgzM1AIGg0GEwQBPzoBDC1IUVFPOBMGASYBKgFRTk9QIQdKBygHUU9RIQEpOU0lJzcmKkUyAUc3SEpKIzEqOkpCR0gxNgxFR0gxOQwKJjcgQwoIDU02My8mNiUpTjIrNiUpTjIRTTJKEQoIBgEyASsBLSdFJzUUBgFRQj0BS0xOTBRDR1AXOSYVOiYVOSdQSiMqQ09HMhoMCggGAUEvLAFMNwE1JikoGhQGARdONyY5MlFOPjMKCCkkOkdOIkoiGxcUIiAhRz80CAYBEgQBNysBTykBGx45FCINATZIPD9DATM3MAoIBgE2GSg1Ni4MCis2JiktCik2JiktCg9GSQgGBAEMO0kUHFABKAEnJB4dLhQQGDQQICMkLhQQGEQQICMNTBxFTCAGASQnJhEEAgE0cGFja2FnZTpjb21waWxlci9zcmMvc3NhL2ludGVyY2VwdG9yX3NpbXBsaWZpZXIuZGFydDhzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9zc2EvdHlwZXNfcHJvcGFnYXRpb24uZGFydMAASSkvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCcgc2hvdyBDb21tb25FbGVtZW50czsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci9hYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9zZWxlY3Rvci5kYXJ0JyBzaG93IFNlbGVjdG9yOwppbXBvcnQgJy4uL3dvcmxkLmRhcnQnIHNob3cgSkNsb3NlZFdvcmxkOwppbXBvcnQgJ2xvZ2dpbmcuZGFydCc7CmltcG9ydCAnbm9kZXMuZGFydCc7CmltcG9ydCAnb3B0aW1pemUuZGFydCc7CgovLy8gVHlwZSBwcm9wYWdhdGlvbiBhbmQgY29uZGl0aW9uaW5nIGNoZWNrIGluc2VydGlvbi4KLy8vCi8vLyAxLiBUeXBlIHByb3BhZ2F0aW9uIChkYXRhZmxvdykgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlcyBvZiBhbGwgbm9kZXMuCi8vLwovLy8gMi4gSFR5cGVLbm93biBub2RlIGluc2VydGlvbiBjYXB0dXJlcyB0eXBlIHN0cmVuZ3RoZW5pbmcuCi8vLwovLy8gMy4gQ29uZGl0aW9uaW5nIGNoZWNrIGluc2VydGlvbiBpbnNlcnRzIHJlY2VpdmVyIGFuZCBhcmd1bWVudCBjaGVja3Mgb24KLy8vICAgIGNhbGxzIHdoZXJlIHRoYXQgY2FsbCBpcyBleHBlY3RlZCB0byBiZSByZXBsYWNlZCB3aXRoIGFuIGluc3RydWN0aW9uIHdpdGgKLy8vICAgIGEgbmFycm93ZXIgZG9tYWluLiBGb3IgZXhhbXBsZSBge051bGwsaW50fSArIHtpbnR9YCB3b3VsZCBpbnNlcnQgYW4KLy8vICAgIHJlY2VpdmVyIGNoZWNrIHRvIHN0cmVuZ3RoZW4gdGhlIHR5cGVzIHRvIGB7aW50fSArIHtpbnR9YCB0byBhbGxvdyB0aGUKLy8vICAgIGNhbGwgb2YgYG9wZXJhdG9yK2AgdG8gYmUgcmVwbGFjZWQgd2l0aCBhIEhBZGQgaW5zdHJ1Y3Rpb24uCi8vLwovLy8gQW5hbHlzaXMgYW5kIG5vZGUgaW5zZXJ0aW9uIGFyZSBkb25lIHRvZ2V0aGVyLCBzaW5jZSBpbnNlcnRpb24gaW1wcm92ZXMgdGhlCi8vLyB0eXBlIHByb3BhZ2F0aW9uIHJlc3VsdHMuCi8vIFRPRE8oc3JhKTogVGhlIEludm9rZUR5bmFtaWNTcGVjaWFsaXplciBzaG91bGQgYmUgY29uc3VsdGVkIGZvciBiZXR0ZXIKLy8gdGFyZ2V0ZWQgY29uZGl0aW9uaW5nIGNoZWNrcy4KY2xhc3MgU3NhVHlwZVByb3BhZ2F0b3IgZXh0ZW5kcyBIQmFzZVZpc2l0b3IgaW1wbGVtZW50cyBPcHRpbWl6YXRpb25QaGFzZSB7CiAgZmluYWwgTWFwPGludCwgSEluc3RydWN0aW9uPiB3b3JrbWFwID0gbmV3IE1hcDxpbnQsIEhJbnN0cnVjdGlvbj4oKTsKICBmaW5hbCBMaXN0PGludD4gd29ya2xpc3QgPSBuZXcgTGlzdDxpbnQ+KCk7CiAgZmluYWwgTWFwPEhJbnN0cnVjdGlvbiwgRnVuY3Rpb24+IHBlbmRpbmdPcHRpbWl6YXRpb25zID0KICAgICAgbmV3IE1hcDxISW5zdHJ1Y3Rpb24sIEZ1bmN0aW9uPigpOwoKICBmaW5hbCBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzOwogIGZpbmFsIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zOwogIGZpbmFsIENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzOwogIGZpbmFsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZDsKICBmaW5hbCBPcHRpbWl6YXRpb25UZXN0TG9nIF9sb2c7CiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+ICdTc2FUeXBlUHJvcGFnYXRvcic7CgogIFNzYVR5cGVQcm9wYWdhdG9yKHRoaXMucmVzdWx0cywgdGhpcy5vcHRpb25zLCB0aGlzLmNvbW1vbkVsZW1lbnRzLAogICAgICB0aGlzLmNsb3NlZFdvcmxkLCB0aGlzLl9sb2cpOwoKICBBYnN0cmFjdFZhbHVlRG9tYWluIGdldCBhYnN0cmFjdFZhbHVlRG9tYWluID0+CiAgICAgIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CgogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGUoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb24uYWNjZXB0KHRoaXMpOwogIH0KCiAgLy8gUmUtY29tcHV0ZSBhbmQgdXBkYXRlIHRoZSB0eXBlIG9mIHRoZSBpbnN0cnVjdGlvbi4gUmV0dXJucwogIC8vIHdoZXRoZXIgb3Igbm90IHRoZSB0eXBlIHdhcyBjaGFuZ2VkLgogIGJvb2wgdXBkYXRlVHlwZShISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIC8vIENvbXB1dGUgb2xkIGFuZCBuZXcgdHlwZXMuCiAgICBBYnN0cmFjdFZhbHVlIG9sZFR5cGUgPSBpbnN0cnVjdGlvbi5pbnN0cnVjdGlvblR5cGU7CiAgICBBYnN0cmFjdFZhbHVlIG5ld1R5cGUgPSBjb21wdXRlVHlwZShpbnN0cnVjdGlvbik7CiAgICBhc3NlcnQobmV3VHlwZSAhPSBudWxsKTsKICAgIC8vIFdlIHVuY29uZGl0aW9uYWxseSByZXBsYWNlIHRoZSBwcm9wYWdhdGVkIHR5cGUgd2l0aCB0aGUgbmV3IHR5cGUuIFRoZQogICAgLy8gY29tcHV0ZVR5cGUgbXVzdCBtYWtlIHN1cmUgdGhhdCB3ZSBldmVudHVhbGx5IHJlYWNoIGEgc3RhYmxlIHN0YXRlLgogICAgaW5zdHJ1Y3Rpb24uaW5zdHJ1Y3Rpb25UeXBlID0gbmV3VHlwZTsKICAgIHJldHVybiBvbGRUeXBlICE9IG5ld1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0R3JhcGgoSEdyYXBoIGdyYXBoKSB7CiAgICB2aXNpdERvbWluYXRvclRyZWUoZ3JhcGgpOwogICAgcHJvY2Vzc1dvcmtsaXN0KCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEJhc2ljQmxvY2soSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIGlmIChibG9jay5pc0xvb3BIZWFkZXIoKSkgewogICAgICBibG9jay5mb3JFYWNoUGhpKChIUGhpIHBoaSkgewogICAgICAgIC8vIFNldCB0aGUgaW5pdGlhbCB0eXBlIGZvciB0aGUgcGhpLiBXZSdyZSBub3QgdXNpbmcgdGhlIHR5cGUKICAgICAgICAvLyB0aGUgcGhpIHRoaW5rcyBpdCBoYXMgYmVjYXVzZSBuZXcgb3B0aW1pemF0aW9ucyBtYXkgaW1wbHkKICAgICAgICAvLyBjaGFuZ2luZyBpdC4KICAgICAgICAvLyBJbiB0aGVvcnkgd2Ugd291bGQgbmVlZCB0byBtYXJrCiAgICAgICAgLy8gdGhlIHR5cGUgb2YgYWxsIG90aGVyIGluY29taW5nIGVkZ2VzIGFzICJ1bmluaXRpYWxpemVkIiBhbmQgdGFrZSB0aGlzCiAgICAgICAgLy8gaW50byBhY2NvdW50IHdoZW4gZG9pbmcgdGhlIHByb3BhZ2F0aW9uIGluc2lkZSB0aGUgcGhpcy4gSnVzdAogICAgICAgIC8vIHNldHRpbmcgdGhlIHByb3BhZ2F0ZWQgdHlwZSBpcyBob3dldmVyIGVhc2llci4KICAgICAgICBwaGkuaW5zdHJ1Y3Rpb25UeXBlID0gcGhpLmlucHV0c1swXS5pbnN0cnVjdGlvblR5cGU7CiAgICAgICAgYWRkVG9Xb3JrTGlzdChwaGkpOwogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIGJsb2NrLmZvckVhY2hQaGkoKEhQaGkgcGhpKSB7CiAgICAgICAgaWYgKHVwZGF0ZVR5cGUocGhpKSkgewogICAgICAgICAgYWRkRGVwZW5kZW50SW5zdHJ1Y3Rpb25zVG9Xb3JrTGlzdChwaGkpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gYmxvY2suZmlyc3Q7CiAgICB3aGlsZSAoaW5zdHJ1Y3Rpb24gIT0gbnVsbCkgewogICAgICBpZiAodXBkYXRlVHlwZShpbnN0cnVjdGlvbikpIHsKICAgICAgICBhZGREZXBlbmRlbnRJbnN0cnVjdGlvbnNUb1dvcmtMaXN0KGluc3RydWN0aW9uKTsKICAgICAgfQogICAgICBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uLm5leHQ7CiAgICB9CiAgfQoKICB2b2lkIHByb2Nlc3NXb3JrbGlzdCgpIHsKICAgIGRvIHsKICAgICAgd2hpbGUgKCF3b3JrbGlzdC5pc0VtcHR5KSB7CiAgICAgICAgaW50IGlkID0gd29ya2xpc3QucmVtb3ZlTGFzdCgpOwogICAgICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IHdvcmttYXBbaWRdOwogICAgICAgIGFzc2VydChpbnN0cnVjdGlvbiAhPSBudWxsKTsKICAgICAgICB3b3JrbWFwLnJlbW92ZShpZCk7CiAgICAgICAgaWYgKHVwZGF0ZVR5cGUoaW5zdHJ1Y3Rpb24pKSB7CiAgICAgICAgICBhZGREZXBlbmRlbnRJbnN0cnVjdGlvbnNUb1dvcmtMaXN0KGluc3RydWN0aW9uKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gV2hpbGUgcHJvY2Vzc2luZyB0aGUgb3B0aW1pemFibGUgYXJpdGhtZXRpYyBpbnN0cnVjdGlvbnMsIHdlCiAgICAgIC8vIG1heSBkaXNjb3ZlciBiZXR0ZXIgdHlwZSBpbmZvcm1hdGlvbiBmb3IgZG9taW5hdGVkIHVzZXJzIG9mCiAgICAgIC8vIHJlcGxhY2VkIG9wZXJhbmRzLCBzbyB3ZSBtYXkgbmVlZCB0byB0YWtlIGFub3RoZXIgc3RhYiBhdAogICAgICAvLyBlbXB0eWluZyB0aGUgd29ya2xpc3QgYWZ0ZXJ3YXJkcy4KICAgICAgcHJvY2Vzc1BlbmRpbmdPcHRpbWl6YXRpb25zKCk7CiAgICB9IHdoaWxlICghd29ya2xpc3QuaXNFbXB0eSk7CiAgfQoKICB2b2lkIGFkZFRvV29ya0xpc3QoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBmaW5hbCBpbnQgaWQgPSBpbnN0cnVjdGlvbi5pZDsKCiAgICBpZiAoIXdvcmttYXAuY29udGFpbnNLZXkoaWQpKSB7CiAgICAgIHdvcmtsaXN0LmFkZChpZCk7CiAgICAgIHdvcmttYXBbaWRdID0gaW5zdHJ1Y3Rpb247CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHZpc2l0QmluYXJ5QXJpdGhtZXRpYyhIQmluYXJ5QXJpdGhtZXRpYyBpbnN0cnVjdGlvbikgewogICAgSEluc3RydWN0aW9uIGxlZnQgPSBpbnN0cnVjdGlvbi5sZWZ0OwogICAgSEluc3RydWN0aW9uIHJpZ2h0ID0gaW5zdHJ1Y3Rpb24ucmlnaHQ7CiAgICBpZiAobGVmdC5pc0ludGVnZXIoYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSAmJgogICAgICAgIHJpZ2h0LmlzSW50ZWdlcihhYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiBhYnN0cmFjdFZhbHVlRG9tYWluLmludFR5cGU7CiAgICB9CiAgICBpZiAobGVmdC5pc0RvdWJsZShhYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiBhYnN0cmFjdFZhbHVlRG9tYWluLmRvdWJsZVR5cGU7CiAgICB9CiAgICByZXR1cm4gYWJzdHJhY3RWYWx1ZURvbWFpbi5udW1UeXBlOwogIH0KCiAgQWJzdHJhY3RWYWx1ZSBjaGVja1Bvc2l0aXZlSW50ZWdlcihIQmluYXJ5QXJpdGhtZXRpYyBpbnN0cnVjdGlvbikgewogICAgSEluc3RydWN0aW9uIGxlZnQgPSBpbnN0cnVjdGlvbi5sZWZ0OwogICAgSEluc3RydWN0aW9uIHJpZ2h0ID0gaW5zdHJ1Y3Rpb24ucmlnaHQ7CiAgICBpZiAobGVmdC5pc1Bvc2l0aXZlSW50ZWdlcihhYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgcmlnaHQuaXNQb3NpdGl2ZUludGVnZXIoYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICByZXR1cm4gYWJzdHJhY3RWYWx1ZURvbWFpbi5wb3NpdGl2ZUludFR5cGU7CiAgICB9CiAgICByZXR1cm4gdmlzaXRCaW5hcnlBcml0aG1ldGljKGluc3RydWN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdmlzaXRNdWx0aXBseShITXVsdGlwbHkgaW5zdHJ1Y3Rpb24pIHsKICAgIHJldHVybiBjaGVja1Bvc2l0aXZlSW50ZWdlcihpbnN0cnVjdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHZpc2l0QWRkKEhBZGQgaW5zdHJ1Y3Rpb24pIHsKICAgIHJldHVybiBjaGVja1Bvc2l0aXZlSW50ZWdlcihpbnN0cnVjdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHZpc2l0RGl2aWRlKEhEaXZpZGUgaW5zdHJ1Y3Rpb24pIHsKICAgIC8vIEFsd2F5cyBkb3VibGUsIGFzIGluaXRpYWxpemVkLgogICAgcmV0dXJuIGluc3RydWN0aW9uLmluc3RydWN0aW9uVHlwZTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdmlzaXRUcnVuY2F0aW5nRGl2aWRlKEhUcnVuY2F0aW5nRGl2aWRlIGluc3RydWN0aW9uKSB7CiAgICAvLyBBbHdheXMgYXMgaW5pdGlhbGl6ZWQuCiAgICByZXR1cm4gaW5zdHJ1Y3Rpb24uaW5zdHJ1Y3Rpb25UeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB2aXNpdFJlbWFpbmRlcihIUmVtYWluZGVyIGluc3RydWN0aW9uKSB7CiAgICAvLyBBbHdheXMgYXMgaW5pdGlhbGl6ZWQuCiAgICByZXR1cm4gaW5zdHJ1Y3Rpb24uaW5zdHJ1Y3Rpb25UeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB2aXNpdE5lZ2F0ZShITmVnYXRlIGluc3RydWN0aW9uKSB7CiAgICBISW5zdHJ1Y3Rpb24gb3BlcmFuZCA9IGluc3RydWN0aW9uLm9wZXJhbmQ7CiAgICAvLyBXZSBoYXZlIGludGVnZXIgc3ViY2xhc3NlcyB0aGF0IHJlcHJlc2VudCByYW5nZXMsIHNvIHdpZGVuIGFueSBpbnQKICAgIC8vIHN1YmNsYXNzIHRvIGZ1bGwgaW50ZWdlci4KICAgIGlmIChvcGVyYW5kLmlzSW50ZWdlcihhYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiBhYnN0cmFjdFZhbHVlRG9tYWluLmludFR5cGU7CiAgICB9CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb24ub3BlcmFuZC5pbnN0cnVjdGlvblR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHZpc2l0QWJzKEhBYnMgaW5zdHJ1Y3Rpb24pIHsKICAgIC8vIFRPRE8oc3JhKTogQ2FuIG5hcnJvdyB0byBub24tbmVnYXRpdmUgdHlwZSBmb3IgaW50ZWdlcnMuCiAgICByZXR1cm4gaW5zdHJ1Y3Rpb24ub3BlcmFuZC5pbnN0cnVjdGlvblR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHZpc2l0SW5zdHJ1Y3Rpb24oSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBhc3NlcnQoaW5zdHJ1Y3Rpb24uaW5zdHJ1Y3Rpb25UeXBlICE9IG51bGwpOwogICAgcmV0dXJuIGluc3RydWN0aW9uLmluc3RydWN0aW9uVHlwZTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdmlzaXRQaGkoSFBoaSBwaGkpIHsKICAgIEFic3RyYWN0VmFsdWUgY2FuZGlkYXRlVHlwZSA9IGFic3RyYWN0VmFsdWVEb21haW4uZW1wdHlUeXBlOwogICAgZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHBoaS5pbnB1dHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgQWJzdHJhY3RWYWx1ZSBpbnB1dFR5cGUgPSBwaGkuaW5wdXRzW2ldLmluc3RydWN0aW9uVHlwZTsKICAgICAgY2FuZGlkYXRlVHlwZSA9IGFic3RyYWN0VmFsdWVEb21haW4udW5pb24oY2FuZGlkYXRlVHlwZSwgaW5wdXRUeXBlKTsKICAgIH0KICAgIHJldHVybiBjYW5kaWRhdGVUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB2aXNpdFR5cGVDb252ZXJzaW9uKEhUeXBlQ29udmVyc2lvbiBpbnN0cnVjdGlvbikgewogICAgSEluc3RydWN0aW9uIGlucHV0ID0gaW5zdHJ1Y3Rpb24uY2hlY2tlZElucHV0OwogICAgQWJzdHJhY3RWYWx1ZSBpbnB1dFR5cGUgPSBpbnB1dC5pbnN0cnVjdGlvblR5cGU7CiAgICBBYnN0cmFjdFZhbHVlIGNoZWNrZWRUeXBlID0gaW5zdHJ1Y3Rpb24uY2hlY2tlZFR5cGU7CiAgICBpZiAoaW5zdHJ1Y3Rpb24uaXNBcmd1bWVudFR5cGVDaGVjayB8fCBpbnN0cnVjdGlvbi5pc1JlY2VpdmVyVHlwZUNoZWNrKSB7CiAgICAgIC8vIFdlIG11c3QgbWFrZSBzdXJlIGEgdHlwZSBjb252ZXJzaW9uIGZvciByZWNlaXZlciBvciBhcmd1bWVudCBjaGVjawogICAgICAvLyBkb2VzIG5vdCB0cnkgdG8gZG8gYW4gaW50IGNoZWNrLCBiZWNhdXNlIGFuIGludCBjaGVjayBpcyBub3QgZW5vdWdoLgogICAgICAvLyBXZSBvbmx5IGRvIGFuIGludCBjaGVjayBpZiB0aGUgaW5wdXQgaXMgaW50ZWdlciBvciBudWxsLgogICAgICBpZiAoYWJzdHJhY3RWYWx1ZURvbWFpbi5pc051bWJlck9yTnVsbChjaGVja2VkVHlwZSkuaXNEZWZpbml0ZWx5VHJ1ZSAmJgogICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5pc0RvdWJsZU9yTnVsbChjaGVja2VkVHlwZSkuaXNEZWZpbml0ZWx5RmFsc2UgJiYKICAgICAgICAgIGlucHV0LmlzSW50ZWdlck9yTnVsbChhYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgICAgaW5zdHJ1Y3Rpb24uY2hlY2tlZFR5cGUgPSBhYnN0cmFjdFZhbHVlRG9tYWluLmludFR5cGU7CiAgICAgIH0gZWxzZSBpZiAoYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgICAgICAgIC5pc0ludGVnZXJPck51bGwoY2hlY2tlZFR5cGUpCiAgICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICAgIGlucHV0LmlzSW50ZWdlck9yTnVsbChhYnN0cmFjdFZhbHVlRG9tYWluKS5pc1BvdGVudGlhbGx5RmFsc2UpIHsKICAgICAgICBpbnN0cnVjdGlvbi5jaGVja2VkVHlwZSA9IGFic3RyYWN0VmFsdWVEb21haW4ubnVtVHlwZTsKICAgICAgfQogICAgfQoKICAgIEFic3RyYWN0VmFsdWUgb3V0cHV0VHlwZSA9CiAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5pbnRlcnNlY3Rpb24oY2hlY2tlZFR5cGUsIGlucHV0VHlwZSk7CiAgICBpZiAoYWJzdHJhY3RWYWx1ZURvbWFpbi5pc0VtcHR5KG91dHB1dFR5cGUpLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgLy8gSW50ZXJzZWN0aW9uIG9mIGRvdWJsZSBhbmQgaW50ZWdlciBjb25mbGljdHMgKGlzIGVtcHR5KSwgYnV0IEpTIG51bWJlcnMKICAgICAgLy8gY2FuIGJlIGJvdGggaW50IGFuZCBkb3VibGUgYXQgdGhlIHNhbWUgdGltZS4gIEZvciBleGFtcGxlLCB0aGUgaW5wdXQKICAgICAgLy8gY2FuIGJlIGEgbGl0ZXJhbCBkb3VibGUgJzguMCcgdGhhdCBpcyBtYXJrZWQgYXMgYW4gaW50ZWdlciAoYmVjYXVzZSAnaXMKICAgICAgLy8gaW50JyB3aWxsIHJldHVybiAndHJ1ZScpLiAgV2hhdCB3ZSByZWFsbHkgbmVlZCB0byBkbyBpcyBtYWtlIHRoZQogICAgICAvLyBvdmVybGFwIGJldHdlZW4gaW50IGFuZCBkb3VibGUgdmFsdWVzIGV4cGxpY2l0IGluIHRoZSBUeXBlTWFzayBzeXN0ZW0uCiAgICAgIGlmIChhYnN0cmFjdFZhbHVlRG9tYWluLmlzSW50ZWdlck9yTnVsbChpbnB1dFR5cGUpLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uaXNEb3VibGVPck51bGwoY2hlY2tlZFR5cGUpLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICBpZiAoYWJzdHJhY3RWYWx1ZURvbWFpbi5pc051bGwoaW5wdXRUeXBlKS5pc1BvdGVudGlhbGx5VHJ1ZSAmJgogICAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmlzTnVsbChjaGVja2VkVHlwZSkuaXNQb3RlbnRpYWxseVRydWUpIHsKICAgICAgICAgIG91dHB1dFR5cGUgPQogICAgICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uaW5jbHVkZU51bGwoYWJzdHJhY3RWYWx1ZURvbWFpbi5kb3VibGVUeXBlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgb3V0cHV0VHlwZSA9IGFic3RyYWN0VmFsdWVEb21haW4uZG91YmxlVHlwZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChpbnB1dFR5cGUgIT0gb3V0cHV0VHlwZSkgewogICAgICAvLyBSZXBsYWNlIGRvbWluYXRlZCB1c2VzIG9mIGlucHV0IHdpdGggdXNlcyBvZiB0aGlzIEhUeXBlQ29udmVyc2lvbiBzbwogICAgICAvLyB0aGUgdXNlcyBiZW5lZml0IGZyb20gdGhlIHN0cm9uZ2VyIHR5cGUuCiAgICAgIC8vCiAgICAgIC8vIFRoZSBkZXBlbmRlbmN5IG9uIHRoZSBjaGVja2VkIHZhbHVlIGFsc28gaW1wcm92ZXMgdGhlIGdlbmVyYXRlZAogICAgICAvLyBKYXZhU2NyaXB0LiBNYW55IGNoZWNrcyBhcmUgY29tcGlsZWQgdG8gYSBmdW5jdGlvbiBjYWxsIGV4cHJlc3Npb24gdGhhdAogICAgICAvLyByZXR1cm5zIHRoZSBjaGVja2VkIHJlc3VsdCwgc28gdGhlIGNoZWNrIGNhbiBiZSBnZW5lcmF0ZWQgYXMgYQogICAgICAvLyBzdWJleHByZXNzaW9uIHJhdGhlciB0aGFuIGEgc2VwYXJhdGUgc3RhdGVtZW50LgogICAgICAvLwogICAgICAvLyBEbyBub3QgcmVwbGFjZSBsb2NhbCBhY2Nlc3Nlcywgc2luY2UgdGhlIGxvY2FsIG11c3QgYmUgYSBITG9jYWxWYWx1ZSwKICAgICAgLy8gbm90IGEgSFR5cGVDb252ZXJzaW9uLgogICAgICBpZiAoIShpbnB1dCBpcyBIUGFyYW1ldGVyVmFsdWUgJiYgaW5wdXQudXNlZEFzVmFyaWFibGUoKSkpIHsKICAgICAgICBpbnB1dC5yZXBsYWNlQWxsVXNlcnNEb21pbmF0ZWRCeShpbnN0cnVjdGlvbi5uZXh0LCBpbnN0cnVjdGlvbik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBvdXRwdXRUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB2aXNpdFR5cGVLbm93bihIVHlwZUtub3duIGluc3RydWN0aW9uKSB7CiAgICBISW5zdHJ1Y3Rpb24gaW5wdXQgPSBpbnN0cnVjdGlvbi5jaGVja2VkSW5wdXQ7CiAgICBBYnN0cmFjdFZhbHVlIGlucHV0VHlwZSA9IGlucHV0Lmluc3RydWN0aW9uVHlwZTsKICAgIEFic3RyYWN0VmFsdWUgb3V0cHV0VHlwZSA9CiAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5pbnRlcnNlY3Rpb24oaW5zdHJ1Y3Rpb24ua25vd25UeXBlLCBpbnB1dFR5cGUpOwogICAgaWYgKGlucHV0VHlwZSAhPSBvdXRwdXRUeXBlKSB7CiAgICAgIGlucHV0LnJlcGxhY2VBbGxVc2Vyc0RvbWluYXRlZEJ5KGluc3RydWN0aW9uLm5leHQsIGluc3RydWN0aW9uKTsKICAgIH0KICAgIHJldHVybiBvdXRwdXRUeXBlOwogIH0KCiAgdm9pZCBjb252ZXJ0SW5wdXQoSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sIEhJbnN0cnVjdGlvbiBpbnB1dCwKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlLCBpbnQga2luZCwgRGFydFR5cGUgdHlwZUV4cHJlc3Npb24pIHsKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gKGtpbmQgPT0gSFR5cGVDb252ZXJzaW9uLlJFQ0VJVkVSX1RZUEVfQ0hFQ0spCiAgICAgICAgPyBpbnN0cnVjdGlvbi5zZWxlY3RvcgogICAgICAgIDogbnVsbDsKICAgIEhUeXBlQ29udmVyc2lvbiBjb252ZXJ0ZWQgPSBuZXcgSFR5cGVDb252ZXJzaW9uKAogICAgICAgIHR5cGVFeHByZXNzaW9uLCBraW5kLCB0eXBlLCBpbnB1dCwgaW5zdHJ1Y3Rpb24uc291cmNlSW5mb3JtYXRpb24sCiAgICAgICAgcmVjZWl2ZXJUeXBlQ2hlY2tTZWxlY3Rvcjogc2VsZWN0b3IpOwogICAgaW5zdHJ1Y3Rpb24uYmxvY2suYWRkQmVmb3JlKGluc3RydWN0aW9uLCBjb252ZXJ0ZWQpOwogICAgaW5wdXQucmVwbGFjZUFsbFVzZXJzRG9taW5hdGVkQnkoaW5zdHJ1Y3Rpb24sIGNvbnZlcnRlZCk7CiAgICBfbG9nPy5yZWdpc3RlclR5cGVDb252ZXJzaW9uKGluc3RydWN0aW9uLCBjb252ZXJ0ZWQpOwogIH0KCiAgYm9vbCBpc0NoZWNrRW5vdWdoRm9yTnNtT3JBZShISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24sIEFic3RyYWN0VmFsdWUgdHlwZSkgewogICAgLy8gSW4gc29tZSBjYXNlcywgd2Ugd2FudCB0aGUgcmVjZWl2ZXIgdG8gYmUgYW4gaW50ZWdlciwKICAgIC8vIGJ1dCB0aGF0IGRvZXMgbm90IG1lYW4gd2Ugd2lsbCBnZXQgYSBOb1N1Y2hNZXRob2RFcnJvcgogICAgLy8gaWYgaXQncyBub3Q6IHRoZSByZWNlaXZlciBjb3VsZCBiZSBhIGRvdWJsZS4KICAgIGlmIChhYnN0cmFjdFZhbHVlRG9tYWluLmlzSW50ZWdlck9yTnVsbCh0eXBlKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIC8vIElmIHRoZSBpbnN0cnVjdGlvbidzIHR5cGUgaXMgaW50ZWdlciBvciBudWxsLCB0aGUgY29kZWdlbgogICAgICAvLyB3aWxsIGVtaXQgYSBudWxsIGNoZWNrLCB3aGljaCBpcyBlbm91Z2ggdG8ga25vdyBpZiBpdCB3aWxsCiAgICAgIC8vIGhpdCBhIG5vU3VjaE1ldGhvZC4KICAgICAgcmV0dXJuIGluc3RydWN0aW9uLmlzSW50ZWdlck9yTnVsbChhYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvLyBBZGQgYSByZWNlaXZlciB0eXBlIGNoZWNrIHdoZW4gdGhlIGNhbGwgY2FuIG9ubHkgaGl0CiAgLy8gW25vU3VjaE1ldGhvZF0gaWYgdGhlIHJlY2VpdmVyIGlzIG5vdCBvZiBhIHNwZWNpZmljIHR5cGUuCiAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIHJlY2VpdmVyIHR5cGUgY2hlY2sgd2FzIGFkZGVkLgogIGJvb2wgY2hlY2tSZWNlaXZlcihISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbikgewogICAgYXNzZXJ0KGluc3RydWN0aW9uLmlzSW50ZXJjZXB0ZWRDYWxsKTsKICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciA9IGluc3RydWN0aW9uLmlucHV0c1sxXTsKICAgIGlmIChyZWNlaXZlci5pc051bWJlcihhYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChyZWNlaXZlci5pc051bWJlck9yTnVsbChhYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIGNvbnZlcnRJbnB1dCgKICAgICAgICAgIGluc3RydWN0aW9uLAogICAgICAgICAgcmVjZWl2ZXIsCiAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmV4Y2x1ZGVOdWxsKHJlY2VpdmVyLmluc3RydWN0aW9uVHlwZSksCiAgICAgICAgICBIVHlwZUNvbnZlcnNpb24uUkVDRUlWRVJfVFlQRV9DSEVDSywKICAgICAgICAgIGNvbW1vbkVsZW1lbnRzLm51bVR5cGUpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSBpZiAoaW5zdHJ1Y3Rpb24uZWxlbWVudCA9PSBudWxsKSB7CiAgICAgIGlmIChjbG9zZWRXb3JsZC5pbmNsdWRlc0Nsb3N1cmVDYWxsKAogICAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IsIGluc3RydWN0aW9uLm1hc2spKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gdGFyZ2V0cyA9CiAgICAgICAgICBjbG9zZWRXb3JsZC5sb2NhdGVNZW1iZXJzKGluc3RydWN0aW9uLnNlbGVjdG9yLCBpbnN0cnVjdGlvbi5tYXNrKTsKICAgICAgaWYgKHRhcmdldHMubGVuZ3RoID09IDEpIHsKICAgICAgICBNZW1iZXJFbnRpdHkgdGFyZ2V0ID0gdGFyZ2V0cy5maXJzdDsKICAgICAgICBDbGFzc0VudGl0eSBjbHMgPSB0YXJnZXQuZW5jbG9zaW5nQ2xhc3M7CiAgICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlID0gYWJzdHJhY3RWYWx1ZURvbWFpbi5jcmVhdGVOb25OdWxsU3ViY2xhc3MoY2xzKTsKICAgICAgICAvLyBXZSBjdXJyZW50bHkgb25seSBvcHRpbWl6ZSBvbiBzb21lIHByaW1pdGl2ZSB0eXBlcy4KICAgICAgICBEYXJ0VHlwZSB0eXBlRXhwcmVzc2lvbjsKICAgICAgICBpZiAoYWJzdHJhY3RWYWx1ZURvbWFpbi5pc051bWJlck9yTnVsbCh0eXBlKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgICAgICB0eXBlRXhwcmVzc2lvbiA9IGNvbW1vbkVsZW1lbnRzLm51bVR5cGU7CiAgICAgICAgfSBlbHNlIGlmIChhYnN0cmFjdFZhbHVlRG9tYWluLmlzQm9vbGVhbk9yTnVsbCh0eXBlKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgICAgICB0eXBlRXhwcmVzc2lvbiA9IGNvbW1vbkVsZW1lbnRzLmJvb2xUeXBlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICghaXNDaGVja0Vub3VnaEZvck5zbU9yQWUocmVjZWl2ZXIsIHR5cGUpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgaW5zdHJ1Y3Rpb24uZWxlbWVudCA9IHRhcmdldDsKICAgICAgICBjb252ZXJ0SW5wdXQoaW5zdHJ1Y3Rpb24sIHJlY2VpdmVyLCB0eXBlLAogICAgICAgICAgICBIVHlwZUNvbnZlcnNpb24uUkVDRUlWRVJfVFlQRV9DSEVDSywgdHlwZUV4cHJlc3Npb24pOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLyBBZGQgYW4gYXJndW1lbnQgdHlwZSBjaGVjayBpZiB0aGUgYXJndW1lbnQgaXMgbm90IG9mIGEgdHlwZQogIC8vIGV4cGVjdGVkIGJ5IHRoZSBjYWxsLgogIC8vIFJldHVybiB0cnVlIGlmIHRoZSBhcmd1bWVudCB0eXBlIGNoZWNrIHdhcyBhZGRlZC4KICBib29sIGNoZWNrQXJndW1lbnQoSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24pIHsKICAgIEhJbnN0cnVjdGlvbiBsZWZ0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdOwogICAgSEluc3RydWN0aW9uIHJpZ2h0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzJdOwoKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gaW5zdHJ1Y3Rpb24uc2VsZWN0b3I7CiAgICBpZiAoc2VsZWN0b3IuaXNPcGVyYXRvciAmJgogICAgICAgIGxlZnQuaXNOdW1iZXIoYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBpZiAocmlnaHQuaXNOdW1iZXIoYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBBYnN0cmFjdFZhbHVlIHR5cGUgPQogICAgICAgICAgcmlnaHQuaXNJbnRlZ2VyT3JOdWxsKGFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUKICAgICAgICAgICAgICA/IGFic3RyYWN0VmFsdWVEb21haW4uZXhjbHVkZU51bGwocmlnaHQuaW5zdHJ1Y3Rpb25UeXBlKQogICAgICAgICAgICAgIDogYWJzdHJhY3RWYWx1ZURvbWFpbi5udW1UeXBlOwogICAgICAvLyBUT0RPKG5nZW9mZnJheSk6IFNvbWUgbnVtYmVyIG9wZXJhdGlvbnMgZG9uJ3QgaGF2ZSBhIGJ1aWx0aW4KICAgICAgLy8gdmFyaWFudCBhbmQgd2lsbCBkbyB0aGUgY2hlY2sgaW4gdGhlaXIgbWV0aG9kIGFueXdheS4gV2UKICAgICAgLy8gc3RpbGwgYWRkIGEgY2hlY2sgYmVjYXVzZSBpdCBhbGxvd3MgdG8gR1ZOIHRoZXNlIG9wZXJhdGlvbnMsCiAgICAgIC8vIGJ1dCB3ZSBzaG91bGQgZmluZCBhIGJldHRlciB3YXkuCiAgICAgIGNvbnZlcnRJbnB1dChpbnN0cnVjdGlvbiwgcmlnaHQsIHR5cGUsCiAgICAgICAgICBIVHlwZUNvbnZlcnNpb24uQVJHVU1FTlRfVFlQRV9DSEVDSywgY29tbW9uRWxlbWVudHMubnVtVHlwZSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgdm9pZCBwcm9jZXNzUGVuZGluZ09wdGltaXphdGlvbnMoKSB7CiAgICBwZW5kaW5nT3B0aW1pemF0aW9ucy5mb3JFYWNoKChpbnN0cnVjdGlvbiwgYWN0aW9uKSA9PiBhY3Rpb24oKSk7CiAgICBwZW5kaW5nT3B0aW1pemF0aW9ucy5jbGVhcigpOwogIH0KCiAgdm9pZCBhZGREZXBlbmRlbnRJbnN0cnVjdGlvbnNUb1dvcmtMaXN0KEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGluc3RydWN0aW9uLnVzZWRCeS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAvLyBUaGUgdHlwZSBwcm9wYWdhdG9yIG9ubHkgcHJvcGFnYXRlcyB0eXBlcyBmb3J3YXJkLiBXZQogICAgICAvLyB0aHVzIG9ubHkgbmVlZCB0byBhZGQgdGhlIHVzZXJzIG9mIHRoZSBbaW5zdHJ1Y3Rpb25dIHRvIHRoZSBsaXN0LgogICAgICBhZGRUb1dvcmtMaXN0KGluc3RydWN0aW9uLnVzZWRCeVtpXSk7CiAgICB9CiAgfQoKICB2b2lkIGFkZEFsbFVzZXJzQnV0KEhJbnZva2VEeW5hbWljIGludm9rZSwgSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBpbnN0cnVjdGlvbi51c2VkQnkuZm9yRWFjaCgoSEluc3RydWN0aW9uIHVzZXIpIHsKICAgICAgaWYgKHVzZXIgIT0gaW52b2tlKSBhZGRUb1dvcmtMaXN0KHVzZXIpOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHZpc2l0SW52b2tlRHluYW1pYyhISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbikgewogICAgaWYgKGluc3RydWN0aW9uLmlzSW50ZXJjZXB0ZWRDYWxsKSB7CiAgICAgIC8vIFdlIGNhbm5vdCBkbyB0aGUgZm9sbG93aW5nIG9wdGltaXphdGlvbiBub3csIGJlY2F1c2Ugd2UgaGF2ZSB0byB3YWl0CiAgICAgIC8vIGZvciB0aGUgdHlwZSBwcm9wYWdhdGlvbiB0byBiZSBzdGFibGUuIFRoZSByZWNlaXZlciBvZiBbaW5zdHJ1Y3Rpb25dCiAgICAgIC8vIG1pZ2h0IG1vdmUgZnJvbSBudW1iZXIgdG8gZHluYW1pYy4KICAgICAgdm9pZCBjaGVja0lucHV0cygpIHsKICAgICAgICBTZWxlY3RvciBzZWxlY3RvciA9IGluc3RydWN0aW9uLnNlbGVjdG9yOwogICAgICAgIGlmIChzZWxlY3Rvci5pc09wZXJhdG9yICYmIHNlbGVjdG9yLm5hbWUgIT0gJz09JykgewogICAgICAgICAgaWYgKGNoZWNrUmVjZWl2ZXIoaW5zdHJ1Y3Rpb24pKSB7CiAgICAgICAgICAgIGFkZEFsbFVzZXJzQnV0KGluc3RydWN0aW9uLCBpbnN0cnVjdGlvbi5pbnB1dHNbMV0pOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFzZWxlY3Rvci5pc1VuYXJ5T3BlcmF0b3IgJiYgY2hlY2tBcmd1bWVudChpbnN0cnVjdGlvbikpIHsKICAgICAgICAgICAgYWRkQWxsVXNlcnNCdXQoaW5zdHJ1Y3Rpb24sIGluc3RydWN0aW9uLmlucHV0c1syXSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pc0NhbGwpIHsKICAgICAgICAgIGlmIChzZWxlY3Rvci5uYW1lID09ICdhYnMnICYmIHNlbGVjdG9yLmFyZ3VtZW50Q291bnQgPT0gMCkgewogICAgICAgICAgICBpZiAoY2hlY2tSZWNlaXZlcihpbnN0cnVjdGlvbikpIHsKICAgICAgICAgICAgICBhZGRBbGxVc2Vyc0J1dChpbnN0cnVjdGlvbiwgaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcGVuZGluZ09wdGltaXphdGlvbnMucHV0SWZBYnNlbnQoaW5zdHJ1Y3Rpb24sICgpID0+IGNoZWNrSW5wdXRzKTsKICAgIH0KCiAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIgPSBpbnN0cnVjdGlvbi5nZXREYXJ0UmVjZWl2ZXIoY2xvc2VkV29ybGQpOwogICAgQWJzdHJhY3RWYWx1ZSByZWNlaXZlclR5cGUgPSByZWNlaXZlci5pbnN0cnVjdGlvblR5cGU7CiAgICBpbnN0cnVjdGlvbi5tYXNrID0gcmVjZWl2ZXJUeXBlOwoKICAgIC8vIFRyeSB0byByZWZpbmUgdGhhdCB0aGUgcmVjZWl2ZXIgaXMgbm90IG51bGwgYWZ0ZXIgdGhpcyBjYWxsIGJ5IGluc2VydGluZwogICAgLy8gYSByZWZpbmVtZW50IG5vZGUgKEhUeXBlS25vd24pLgogICAgdmFyIHNlbGVjdG9yID0gaW5zdHJ1Y3Rpb24uc2VsZWN0b3I7CiAgICBpZiAoIXNlbGVjdG9yLmlzQ2xvc3VyZUNhbGwgJiYgIXNlbGVjdG9yLmFwcGxpZXNUb051bGxXaXRob3V0VGhyb3coKSkgewogICAgICB2YXIgbmV4dCA9IGluc3RydWN0aW9uLm5leHQ7CiAgICAgIGlmIChuZXh0IGlzIEhUeXBlS25vd24gJiYgbmV4dC5jaGVja2VkSW5wdXQgPT0gcmVjZWl2ZXIpIHsKICAgICAgICAvLyBPbiBhIHByZXZpb3VzIHBhc3Mgb3IgaXRlcmF0aW9uIHdlIGFscmVhZHkgcmVmaW5lZCBbcmVjZWl2ZXJdIGJ5CiAgICAgICAgLy8gaW5zZXJ0aW5nIGEgW0hUeXBlS25vd25dIGluc3RydWN0aW9uLiBUaGF0IHJlcGxhY2VkIHNldmVyYWwgZG9taW5hdGVkCiAgICAgICAgLy8gdXNlcyB3aXRoIHRoZSByZWZpbmVtZW50LiBXZSB1cGRhdGUgdGhlIHR5cGUgb2YgdGhlIFtIVHlwZUtub3duXQogICAgICAgIC8vIGluc3RydWN0aW9uIGJlY2F1c2UgaXQgbWF5IGhhdmUgYmVlbiByZWZpbmVkIHdpdGggYSBjb3JyZWN0IHR5cGUgYXQKICAgICAgICAvLyB0aGUgdGltZSwgYnV0IGluY29ycmVjdCBub3cuCiAgICAgICAgQWJzdHJhY3RWYWx1ZSBuZXdUeXBlID0gYWJzdHJhY3RWYWx1ZURvbWFpbi5leGNsdWRlTnVsbChyZWNlaXZlclR5cGUpOwogICAgICAgIGlmIChuZXh0Lmluc3RydWN0aW9uVHlwZSAhPSBuZXdUeXBlKSB7CiAgICAgICAgICBuZXh0Lmtub3duVHlwZSA9IG5leHQuaW5zdHJ1Y3Rpb25UeXBlID0gbmV3VHlwZTsKICAgICAgICAgIGFkZERlcGVuZGVudEluc3RydWN0aW9uc1RvV29ya0xpc3QobmV4dCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGFic3RyYWN0VmFsdWVEb21haW4uaXNOdWxsKHJlY2VpdmVyVHlwZSkuaXNQb3RlbnRpYWxseVRydWUpIHsKICAgICAgICBEb21pbmF0ZWRVc2VzIHVzZXMgPQogICAgICAgICAgICBEb21pbmF0ZWRVc2VzLm9mKHJlY2VpdmVyLCBpbnN0cnVjdGlvbiwgZXhjbHVkZURvbWluYXRvcjogdHJ1ZSk7CiAgICAgICAgaWYgKHVzZXMuaXNOb3RFbXB0eSkgewogICAgICAgICAgLy8gSW5zZXJ0IGEgcmVmaW5lbWVudCBub2RlIGFmdGVyIHRoZSBjYWxsIGFuZCB1cGRhdGUgYWxsIHVzZXJzCiAgICAgICAgICAvLyBkb21pbmF0ZWQgYnkgdGhlIGNhbGwgdG8gdXNlIHRoYXQgbm9kZSBpbnN0ZWFkIG9mIFtyZWNlaXZlcl0uCiAgICAgICAgICBBYnN0cmFjdFZhbHVlIG5ld1R5cGUgPSBhYnN0cmFjdFZhbHVlRG9tYWluLmV4Y2x1ZGVOdWxsKHJlY2VpdmVyVHlwZSk7CiAgICAgICAgICBIVHlwZUtub3duIGNvbnZlcnRlZCA9CiAgICAgICAgICAgICAgbmV3IEhUeXBlS25vd24ud2l0bmVzc2VkKG5ld1R5cGUsIHJlY2VpdmVyLCBpbnN0cnVjdGlvbik7CiAgICAgICAgICBpbnN0cnVjdGlvbi5ibG9jay5hZGRCZWZvcmUoaW5zdHJ1Y3Rpb24ubmV4dCwgY29udmVydGVkKTsKICAgICAgICAgIHVzZXMucmVwbGFjZVdpdGgoY29udmVydGVkKTsKICAgICAgICAgIGFkZERlcGVuZGVudEluc3RydWN0aW9uc1RvV29ya0xpc3QoY29udmVydGVkKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaW5zdHJ1Y3Rpb24uc3BlY2lhbGl6ZXIKICAgICAgICAuY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgb3B0aW9ucywgY2xvc2VkV29ybGQpOwogIH0KfQqB3gBOTjwBNiQhMSEaMioXFRgBNwRIBD4ETFFLTkMEUB5KIUxHLjspASwhJyIiDCoBRSQBMScBOCUEAUAqLiI5Nh1NSysfBAEMIh8XBAEMJyAkRkUYK1FJOj0cCg0kHzMKCgYBLCIlOQgmBgQBGwkiKDAlHCc7CghGRUMrJSEEATEjASQYIQYEAQxHKixAQSoGPy0GKAQBRiosSEkyBi8EAQw3LgQBDC0uBAEMMyYoBAEMRx4oBAEMOR4oBAEMMzBKIUMqBjAEAQwtQDAEAQw9MSgEAQwlQUM/SwYaBAEMQzM1OU5MTkJOT0k/JSwjSz8IBgEfQkRRTlFKUE1OR0kXTxE3CggGI04yCUlRSDkJTyBDSQgGFwQBDDkzNR9MI0cGFwQBRD9GHxA1Si45PjoEAU89PjRGQ0QdUAYRBAE6PzczKzNDFAZJFBcURS8jEy4rNRYIJ00hLTFNPyFJM1E0ERgKRCYyQhUIBhIEAUEbNzMvMAEuHz9CFggbRkctRkJGKi1IEwYSBAEnRSIEAUZLP0ssBgQBSTUvCAQBDEEpTk4sGzI8LEAMSUAMJkcuQg4MCggBSAYBRjslAVAnKUwjQUxRTE8oTy87NApPHU0fSktRIUhEJzkKCAYBI1AEAgEvcGFja2FnZTpjb21waWxlci9zcmMvc3NhL3R5cGVzX3Byb3BhZ2F0aW9uLmRhcnQ7c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvc3NhL3ZhbHVlX3JhbmdlX2FuYWx5emVyLmRhcnTAAJwFLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vY29uc3RhbnRzL2NvbnN0YW50X3N5c3RlbS5kYXJ0JyBhcyBjb25zdGFudF9zeXN0ZW07CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKaW1wb3J0ICdub2Rlcy5kYXJ0JzsKaW1wb3J0ICdvcHRpbWl6ZS5kYXJ0JzsKCmNsYXNzIFZhbHVlUmFuZ2VJbmZvIHsKICBJbnRWYWx1ZSBpbnRaZXJvOwogIEludFZhbHVlIGludE9uZTsKCiAgVmFsdWVSYW5nZUluZm8oKSB7CiAgICBpbnRaZXJvID0gbmV3SW50VmFsdWUoQmlnSW50Lnplcm8pOwogICAgaW50T25lID0gbmV3SW50VmFsdWUoQmlnSW50Lm9uZSk7CiAgfQoKICBWYWx1ZSBuZXdJbnRWYWx1ZShCaWdJbnQgdmFsdWUpIHsKICAgIHJldHVybiBuZXcgSW50VmFsdWUodmFsdWUsIHRoaXMpOwogIH0KCiAgVmFsdWUgbmV3SW5zdHJ1Y3Rpb25WYWx1ZShISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIHJldHVybiBuZXcgSW5zdHJ1Y3Rpb25WYWx1ZShpbnN0cnVjdGlvbiwgdGhpcyk7CiAgfQoKICBWYWx1ZSBuZXdQb3NpdGl2ZVZhbHVlKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgcmV0dXJuIG5ldyBQb3NpdGl2ZVZhbHVlKGluc3RydWN0aW9uLCB0aGlzKTsKICB9CgogIFZhbHVlIG5ld0FkZFZhbHVlKFZhbHVlIGxlZnQsIFZhbHVlIHJpZ2h0KSB7CiAgICByZXR1cm4gbmV3IEFkZFZhbHVlKGxlZnQsIHJpZ2h0LCB0aGlzKTsKICB9CgogIFZhbHVlIG5ld1N1YnRyYWN0VmFsdWUoVmFsdWUgbGVmdCwgVmFsdWUgcmlnaHQpIHsKICAgIHJldHVybiBuZXcgU3VidHJhY3RWYWx1ZShsZWZ0LCByaWdodCwgdGhpcyk7CiAgfQoKICBWYWx1ZSBuZXdOZWdhdGVWYWx1ZShWYWx1ZSB2YWx1ZSkgewogICAgcmV0dXJuIG5ldyBOZWdhdGVWYWx1ZSh2YWx1ZSwgdGhpcyk7CiAgfQoKICBSYW5nZSBuZXdVbmJvdW5kUmFuZ2UoKSB7CiAgICByZXR1cm4gbmV3IFJhbmdlLnVuYm91bmQodGhpcyk7CiAgfQoKICBSYW5nZSBuZXdOb3JtYWxpemVkUmFuZ2UoVmFsdWUgbG93LCBWYWx1ZSB1cCkgewogICAgcmV0dXJuIG5ldyBSYW5nZS5ub3JtYWxpemUobG93LCB1cCwgdGhpcyk7CiAgfQoKICBSYW5nZSBuZXdNYXJrZXJSYW5nZSgpIHsKICAgIHJldHVybiBuZXcgUmFuZ2UoCiAgICAgICAgbmV3IE1hcmtlclZhbHVlKGZhbHNlLCB0aGlzKSwgbmV3IE1hcmtlclZhbHVlKHRydWUsIHRoaXMpLCB0aGlzKTsKICB9Cn0KCi8vLyBBIFtWYWx1ZV0gcmVwcmVzZW50cyBib3RoIHN5bWJvbGljIHZhbHVlcyBsaWtlIHRoZSB2YWx1ZSBvZiBhCi8vLyBwYXJhbWV0ZXIsIG9yIHRoZSBsZW5ndGggb2YgYW4gYXJyYXksIGFuZCBjb25jcmV0ZSB2YWx1ZXMsIGxpa2UKLy8vIGNvbnN0YW50cy4KYWJzdHJhY3QgY2xhc3MgVmFsdWUgewogIGZpbmFsIFZhbHVlUmFuZ2VJbmZvIGluZm87CiAgY29uc3QgVmFsdWUodGhpcy5pbmZvKTsKCiAgVmFsdWUgb3BlcmF0b3IgKyhWYWx1ZSBvdGhlcikgPT4gY29uc3QgVW5rbm93blZhbHVlKCk7CiAgVmFsdWUgb3BlcmF0b3IgLShWYWx1ZSBvdGhlcikgPT4gY29uc3QgVW5rbm93blZhbHVlKCk7CiAgVmFsdWUgb3BlcmF0b3IgLSgpID0+IGNvbnN0IFVua25vd25WYWx1ZSgpOwogIFZhbHVlIG9wZXJhdG9yICYoVmFsdWUgb3RoZXIpID0+IGNvbnN0IFVua25vd25WYWx1ZSgpOwoKICBWYWx1ZSBtaW4oVmFsdWUgb3RoZXIpIHsKICAgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm4gdGhpczsKICAgIGlmIChvdGhlciA9PSBjb25zdCBNaW5JbnRWYWx1ZSgpKSByZXR1cm4gb3RoZXI7CiAgICBpZiAob3RoZXIgPT0gY29uc3QgTWF4SW50VmFsdWUoKSkgcmV0dXJuIHRoaXM7CiAgICBWYWx1ZSB2YWx1ZSA9IHRoaXMgLSBvdGhlcjsKICAgIGlmICh2YWx1ZS5pc1Bvc2l0aXZlKSByZXR1cm4gb3RoZXI7CiAgICBpZiAodmFsdWUuaXNOZWdhdGl2ZSkgcmV0dXJuIHRoaXM7CiAgICByZXR1cm4gY29uc3QgVW5rbm93blZhbHVlKCk7CiAgfQoKICBWYWx1ZSBtYXgoVmFsdWUgb3RoZXIpIHsKICAgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm4gdGhpczsKICAgIGlmIChvdGhlciA9PSBjb25zdCBNaW5JbnRWYWx1ZSgpKSByZXR1cm4gdGhpczsKICAgIGlmIChvdGhlciA9PSBjb25zdCBNYXhJbnRWYWx1ZSgpKSByZXR1cm4gb3RoZXI7CiAgICBWYWx1ZSB2YWx1ZSA9IHRoaXMgLSBvdGhlcjsKICAgIGlmICh2YWx1ZS5pc1Bvc2l0aXZlKSByZXR1cm4gdGhpczsKICAgIGlmICh2YWx1ZS5pc05lZ2F0aXZlKSByZXR1cm4gb3RoZXI7CiAgICByZXR1cm4gY29uc3QgVW5rbm93blZhbHVlKCk7CiAgfQoKICBib29sIGdldCBpc05lZ2F0aXZlID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzUG9zaXRpdmUgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNaZXJvID0+IGZhbHNlOwp9CgovLy8gVGhlIFtNYXJrZXJWYWx1ZV0gY2xhc3MgaXMgdXNlZCB0byByZWNvZ25pemUgcmFuZ2VzIG9mIGxvb3AKLy8vIHVwZGF0ZXMuCmNsYXNzIE1hcmtlclZhbHVlIGV4dGVuZHMgVmFsdWUgewogIC8vLyBJZiBbcG9zaXRpdmVdIGlzIHRydWUgKHJlc3BlY3RpdmVseSBmYWxzZSksIHRoZSBtYXJrZXIgZ29lcwogIC8vLyB0byBbTWF4SW50VmFsdWVdIChyZXNwZWN0aXZlbHkgW01pbkludFZhbHVlXSkgd2hlbiBiZWluZyBhZGRlZAogIC8vLyB0byBhIHBvc2l0aXZlIChyZXNwZWN0aXZlbHkgbmVnYXRpdmUpIHZhbHVlLgogIGZpbmFsIGJvb2wgcG9zaXRpdmU7CgogIGNvbnN0IE1hcmtlclZhbHVlKHRoaXMucG9zaXRpdmUsIGluZm8pIDogc3VwZXIoaW5mbyk7CgogIEBvdmVycmlkZQogIFZhbHVlIG9wZXJhdG9yICsoVmFsdWUgb3RoZXIpIHsKICAgIGlmIChvdGhlci5pc1Bvc2l0aXZlICYmIHBvc2l0aXZlKSByZXR1cm4gY29uc3QgTWF4SW50VmFsdWUoKTsKICAgIGlmIChvdGhlci5pc05lZ2F0aXZlICYmICFwb3NpdGl2ZSkgcmV0dXJuIGNvbnN0IE1pbkludFZhbHVlKCk7CiAgICBpZiAob3RoZXIgaXMgSW50VmFsdWUpIHJldHVybiB0aGlzOwogICAgcmV0dXJuIGNvbnN0IFVua25vd25WYWx1ZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgVmFsdWUgb3BlcmF0b3IgLShWYWx1ZSBvdGhlcikgewogICAgaWYgKG90aGVyLmlzUG9zaXRpdmUgJiYgIXBvc2l0aXZlKSByZXR1cm4gY29uc3QgTWluSW50VmFsdWUoKTsKICAgIGlmIChvdGhlci5pc05lZ2F0aXZlICYmIHBvc2l0aXZlKSByZXR1cm4gY29uc3QgTWF4SW50VmFsdWUoKTsKICAgIGlmIChvdGhlciBpcyBJbnRWYWx1ZSkgcmV0dXJuIHRoaXM7CiAgICByZXR1cm4gY29uc3QgVW5rbm93blZhbHVlKCk7CiAgfQp9CgovLy8gQW4gW0ludFZhbHVlXSBjb250YWlucyBhIGNvbnN0YW50IGludGVnZXIgdmFsdWUuCmNsYXNzIEludFZhbHVlIGV4dGVuZHMgVmFsdWUgewogIGZpbmFsIEJpZ0ludCB2YWx1ZTsKCiAgY29uc3QgSW50VmFsdWUodGhpcy52YWx1ZSwgaW5mbykgOiBzdXBlcihpbmZvKTsKCiAgQG92ZXJyaWRlCiAgVmFsdWUgb3BlcmF0b3IgKyhkeW5hbWljIG90aGVyKSB7CiAgICBpZiAob3RoZXIuaXNaZXJvKSByZXR1cm4gdGhpczsKICAgIGlmIChvdGhlciBpcyEgSW50VmFsdWUpIHJldHVybiBvdGhlciArIHRoaXM7CiAgICBkeW5hbWljIGNvbnN0YW50ID0gY29uc3RhbnRfc3lzdGVtLmFkZC5mb2xkKAogICAgICAgIGNvbnN0YW50X3N5c3RlbS5jcmVhdGVJbnQodmFsdWUpLAogICAgICAgIGNvbnN0YW50X3N5c3RlbS5jcmVhdGVJbnQob3RoZXIudmFsdWUpKTsKICAgIGlmICghY29uc3RhbnQuaXNJbnQpIHJldHVybiBjb25zdCBVbmtub3duVmFsdWUoKTsKICAgIHJldHVybiBpbmZvLm5ld0ludFZhbHVlKGNvbnN0YW50LmludFZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIFZhbHVlIG9wZXJhdG9yIC0oZHluYW1pYyBvdGhlcikgewogICAgaWYgKG90aGVyLmlzWmVybykgcmV0dXJuIHRoaXM7CiAgICBpZiAob3RoZXIgaXMhIEludFZhbHVlKSByZXR1cm4gLW90aGVyICsgdGhpczsKICAgIGR5bmFtaWMgY29uc3RhbnQgPSBjb25zdGFudF9zeXN0ZW0uc3VidHJhY3QuZm9sZCgKICAgICAgICBjb25zdGFudF9zeXN0ZW0uY3JlYXRlSW50KHZhbHVlKSwKICAgICAgICBjb25zdGFudF9zeXN0ZW0uY3JlYXRlSW50KG90aGVyLnZhbHVlKSk7CiAgICBpZiAoIWNvbnN0YW50LmlzSW50KSByZXR1cm4gY29uc3QgVW5rbm93blZhbHVlKCk7CiAgICByZXR1cm4gaW5mby5uZXdJbnRWYWx1ZShjb25zdGFudC5pbnRWYWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBWYWx1ZSBvcGVyYXRvciAtKCkgewogICAgaWYgKGlzWmVybykgcmV0dXJuIHRoaXM7CiAgICBkeW5hbWljIGNvbnN0YW50ID0KICAgICAgICBjb25zdGFudF9zeXN0ZW0ubmVnYXRlLmZvbGQoY29uc3RhbnRfc3lzdGVtLmNyZWF0ZUludCh2YWx1ZSkpOwogICAgaWYgKCFjb25zdGFudC5pc0ludCkgcmV0dXJuIGNvbnN0IFVua25vd25WYWx1ZSgpOwogICAgcmV0dXJuIGluZm8ubmV3SW50VmFsdWUoY29uc3RhbnQuaW50VmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgVmFsdWUgb3BlcmF0b3IgJihkeW5hbWljIG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMhIEludFZhbHVlKSByZXR1cm4gY29uc3QgVW5rbm93blZhbHVlKCk7CiAgICBkeW5hbWljIGNvbnN0YW50ID0gY29uc3RhbnRfc3lzdGVtLmJpdEFuZC5mb2xkKAogICAgICAgIGNvbnN0YW50X3N5c3RlbS5jcmVhdGVJbnQodmFsdWUpLAogICAgICAgIGNvbnN0YW50X3N5c3RlbS5jcmVhdGVJbnQob3RoZXIudmFsdWUpKTsKICAgIHJldHVybiBpbmZvLm5ld0ludFZhbHVlKGNvbnN0YW50LmludFZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIFZhbHVlIG1pbihkeW5hbWljIG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMhIEludFZhbHVlKSByZXR1cm4gb3RoZXIubWluKHRoaXMpOwogICAgcmV0dXJuIHRoaXMudmFsdWUgPCBvdGhlci52YWx1ZSA/IHRoaXMgOiBvdGhlcjsKICB9CgogIEBvdmVycmlkZQogIFZhbHVlIG1heChkeW5hbWljIG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMhIEludFZhbHVlKSByZXR1cm4gb3RoZXIubWF4KHRoaXMpOwogICAgcmV0dXJuIHRoaXMudmFsdWUgPCBvdGhlci52YWx1ZSA/IG90aGVyIDogdGhpczsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyEgSW50VmFsdWUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB0aGlzLnZhbHVlID09IG90aGVyLnZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignSW50VmFsdWUuaGFzaENvZGUnKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0ludFZhbHVlICR2YWx1ZSc7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOZWdhdGl2ZSA9PiB2YWx1ZSA8IEJpZ0ludC56ZXJvOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUG9zaXRpdmUgPT4gdmFsdWUgPj0gQmlnSW50Lnplcm87CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNaZXJvID0+IHZhbHVlID09IEJpZ0ludC56ZXJvOwp9CgovLy8gVGhlIFtNYXhJbnRWYWx1ZV0gcmVwcmVzZW50cyB0aGUgbWF4aW11bSB2YWx1ZSBhbiBpbnRlZ2VyIGNhbiBoYXZlLAovLy8gd2hpY2ggaXMgY3VycmVudGx5ICtpbmZpbml0eS4KY2xhc3MgTWF4SW50VmFsdWUgZXh0ZW5kcyBWYWx1ZSB7CiAgY29uc3QgTWF4SW50VmFsdWUoKSA6IHN1cGVyKG51bGwpOwogIEBvdmVycmlkZQogIFZhbHVlIG9wZXJhdG9yICsoVmFsdWUgb3RoZXIpID0+IHRoaXM7CiAgQG92ZXJyaWRlCiAgVmFsdWUgb3BlcmF0b3IgLShWYWx1ZSBvdGhlcikgPT4gdGhpczsKICBAb3ZlcnJpZGUKICBWYWx1ZSBvcGVyYXRvciAtKCkgPT4gY29uc3QgTWluSW50VmFsdWUoKTsKICBAb3ZlcnJpZGUKICBWYWx1ZSBtaW4oVmFsdWUgb3RoZXIpID0+IG90aGVyOwogIEBvdmVycmlkZQogIFZhbHVlIG1heChWYWx1ZSBvdGhlcikgPT4gdGhpczsKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnTWF4JzsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc05lZ2F0aXZlID0+IGZhbHNlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUG9zaXRpdmUgPT4gdHJ1ZTsKfQoKLy8vIFRoZSBbTWluSW50VmFsdWVdIHJlcHJlc2VudHMgdGhlIG1pbmltdW0gdmFsdWUgYW4gaW50ZWdlciBjYW4gaGF2ZSwKLy8vIHdoaWNoIGlzIGN1cnJlbnRseSAtaW5maW5pdHkuCmNsYXNzIE1pbkludFZhbHVlIGV4dGVuZHMgVmFsdWUgewogIGNvbnN0IE1pbkludFZhbHVlKCkgOiBzdXBlcihudWxsKTsKICBAb3ZlcnJpZGUKICBWYWx1ZSBvcGVyYXRvciArKFZhbHVlIG90aGVyKSA9PiB0aGlzOwogIEBvdmVycmlkZQogIFZhbHVlIG9wZXJhdG9yIC0oVmFsdWUgb3RoZXIpID0+IHRoaXM7CiAgQG92ZXJyaWRlCiAgVmFsdWUgb3BlcmF0b3IgLSgpID0+IGNvbnN0IE1heEludFZhbHVlKCk7CiAgQG92ZXJyaWRlCiAgVmFsdWUgbWluKFZhbHVlIG90aGVyKSA9PiB0aGlzOwogIEBvdmVycmlkZQogIFZhbHVlIG1heChWYWx1ZSBvdGhlcikgPT4gb3RoZXI7CiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ01pbic7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOZWdhdGl2ZSA9PiB0cnVlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUG9zaXRpdmUgPT4gZmFsc2U7Cn0KCi8vLyBUaGUgW1Vua25vd25WYWx1ZV0gaXMgdGhlIHNlbnRpbmVsIGluIG91ciBhbmFseXNpcyB0byBtYXJrIGFuCi8vLyBvcGVyYXRpb24gdGhhdCBjb3VsZCBub3QgYmUgZG9uZSBiZWNhdXNlIG9mIHRvbyBtdWNoIGNvbXBsZXhpdHkuCmNsYXNzIFVua25vd25WYWx1ZSBleHRlbmRzIFZhbHVlIHsKICBjb25zdCBVbmtub3duVmFsdWUoKSA6IHN1cGVyKG51bGwpOwogIEBvdmVycmlkZQogIFZhbHVlIG9wZXJhdG9yICsoVmFsdWUgb3RoZXIpID0+IGNvbnN0IFVua25vd25WYWx1ZSgpOwogIEBvdmVycmlkZQogIFZhbHVlIG9wZXJhdG9yIC0oVmFsdWUgb3RoZXIpID0+IGNvbnN0IFVua25vd25WYWx1ZSgpOwogIEBvdmVycmlkZQogIFZhbHVlIG9wZXJhdG9yIC0oKSA9PiBjb25zdCBVbmtub3duVmFsdWUoKTsKICBAb3ZlcnJpZGUKICBWYWx1ZSBtaW4oVmFsdWUgb3RoZXIpID0+IGNvbnN0IFVua25vd25WYWx1ZSgpOwogIEBvdmVycmlkZQogIFZhbHVlIG1heChWYWx1ZSBvdGhlcikgPT4gY29uc3QgVW5rbm93blZhbHVlKCk7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOZWdhdGl2ZSA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1Bvc2l0aXZlID0+IGZhbHNlOwogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdVbmtub3duJzsKfQoKLy8vIEEgc3ltYm9saWMgdmFsdWUgcmVwcmVzZW50aW5nIGFuIFtISW5zdHJ1Y3Rpb25dLgpjbGFzcyBJbnN0cnVjdGlvblZhbHVlIGV4dGVuZHMgVmFsdWUgewogIGZpbmFsIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbjsKICBJbnN0cnVjdGlvblZhbHVlKHRoaXMuaW5zdHJ1Y3Rpb24sIGluZm8pIDogc3VwZXIoaW5mbyk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyEgSW5zdHJ1Y3Rpb25WYWx1ZSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHRoaXMuaW5zdHJ1Y3Rpb24gPT0gb3RoZXIuaW5zdHJ1Y3Rpb247CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdJbnN0cnVjdGlvblZhbHVlLmhhc2hDb2RlJyk7CgogIEBvdmVycmlkZQogIFZhbHVlIG9wZXJhdG9yICsoVmFsdWUgb3RoZXIpIHsKICAgIGlmIChvdGhlci5pc1plcm8pIHJldHVybiB0aGlzOwogICAgaWYgKG90aGVyIGlzIEludFZhbHVlKSB7CiAgICAgIGlmIChvdGhlci5pc05lZ2F0aXZlKSB7CiAgICAgICAgcmV0dXJuIGluZm8ubmV3U3VidHJhY3RWYWx1ZSh0aGlzLCAtb3RoZXIpOwogICAgICB9CiAgICAgIHJldHVybiBpbmZvLm5ld0FkZFZhbHVlKHRoaXMsIG90aGVyKTsKICAgIH0KICAgIGlmIChvdGhlciBpcyBJbnN0cnVjdGlvblZhbHVlKSB7CiAgICAgIHJldHVybiBpbmZvLm5ld0FkZFZhbHVlKHRoaXMsIG90aGVyKTsKICAgIH0KICAgIHJldHVybiBvdGhlciArIHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBWYWx1ZSBvcGVyYXRvciAtKFZhbHVlIG90aGVyKSB7CiAgICBpZiAob3RoZXIuaXNaZXJvKSByZXR1cm4gdGhpczsKICAgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm4gaW5mby5pbnRaZXJvOwogICAgaWYgKG90aGVyIGlzIEludFZhbHVlKSB7CiAgICAgIGlmIChvdGhlci5pc05lZ2F0aXZlKSB7CiAgICAgICAgcmV0dXJuIGluZm8ubmV3QWRkVmFsdWUodGhpcywgLW90aGVyKTsKICAgICAgfQogICAgICByZXR1cm4gaW5mby5uZXdTdWJ0cmFjdFZhbHVlKHRoaXMsIG90aGVyKTsKICAgIH0KICAgIGlmIChvdGhlciBpcyBJbnN0cnVjdGlvblZhbHVlKSB7CiAgICAgIHJldHVybiBpbmZvLm5ld1N1YnRyYWN0VmFsdWUodGhpcywgb3RoZXIpOwogICAgfQogICAgcmV0dXJuIC1vdGhlciArIHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBWYWx1ZSBvcGVyYXRvciAtKCkgewogICAgcmV0dXJuIGluZm8ubmV3TmVnYXRlVmFsdWUodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc05lZ2F0aXZlID0+IGZhbHNlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUG9zaXRpdmUgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdJbnN0cnVjdGlvbjogJGluc3RydWN0aW9uJzsKfQoKLy8vIFNwZWNpYWwgdmFsdWUgZm9yIGluc3RydWN0aW9ucyB3aG9zZSB0eXBlIGlzIGEgcG9zaXRpdmUgaW50ZWdlci4KY2xhc3MgUG9zaXRpdmVWYWx1ZSBleHRlbmRzIEluc3RydWN0aW9uVmFsdWUgewogIFBvc2l0aXZlVmFsdWUoSEluc3RydWN0aW9uIGluc3RydWN0aW9uLCBpbmZvKSA6IHN1cGVyKGluc3RydWN0aW9uLCBpbmZvKTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1Bvc2l0aXZlID0+IHRydWU7Cn0KCi8vLyBSZXByZXNlbnRzIGEgYmluYXJ5IG9wZXJhdGlvbiBvbiB0d28gW1ZhbHVlXSwgd2hlcmUgdGhlIG9wZXJhdGlvbgovLy8gZGlkIG5vdCB5aWVsZCBhIGNhbm9uaWNhbCB2YWx1ZS4KY2xhc3MgQmluYXJ5T3BlcmF0aW9uVmFsdWUgZXh0ZW5kcyBWYWx1ZSB7CiAgZmluYWwgVmFsdWUgbGVmdDsKICBmaW5hbCBWYWx1ZSByaWdodDsKICBCaW5hcnlPcGVyYXRpb25WYWx1ZSh0aGlzLmxlZnQsIHRoaXMucmlnaHQsIGluZm8pIDogc3VwZXIoaW5mbyk7Cn0KCmNsYXNzIEFkZFZhbHVlIGV4dGVuZHMgQmluYXJ5T3BlcmF0aW9uVmFsdWUgewogIEFkZFZhbHVlKGxlZnQsIHJpZ2h0LCBpbmZvKSA6IHN1cGVyKGxlZnQsIHJpZ2h0LCBpbmZvKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKG90aGVyIGlzISBBZGRWYWx1ZSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIChsZWZ0ID09IG90aGVyLmxlZnQgJiYgcmlnaHQgPT0gb3RoZXIucmlnaHQpIHx8CiAgICAgICAgKGxlZnQgPT0gb3RoZXIucmlnaHQgJiYgcmlnaHQgPT0gb3RoZXIubGVmdCk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdBZGRWYWx1ZS5oYXNoQ29kZScpOwoKICBAb3ZlcnJpZGUKICBWYWx1ZSBvcGVyYXRvciAtKCkgPT4gLWxlZnQgLSByaWdodDsKCiAgQG92ZXJyaWRlCiAgVmFsdWUgb3BlcmF0b3IgKyhWYWx1ZSBvdGhlcikgewogICAgaWYgKG90aGVyLmlzWmVybykgcmV0dXJuIHRoaXM7CiAgICBWYWx1ZSB2YWx1ZSA9IGxlZnQgKyBvdGhlcjsKICAgIGlmICh2YWx1ZSAhPSBjb25zdCBVbmtub3duVmFsdWUoKSAmJiB2YWx1ZSBpcyEgQmluYXJ5T3BlcmF0aW9uVmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlICsgcmlnaHQ7CiAgICB9CiAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIG5vdCBzaW1wbGUgZW5vdWdoLCB3ZSB0cnkgdGhlIHNhbWUgYXBwcm9hY2gKICAgIC8vIHdpdGggW3JpZ2h0XS4KICAgIHZhbHVlID0gcmlnaHQgKyBvdGhlcjsKICAgIGlmICh2YWx1ZSAhPSBjb25zdCBVbmtub3duVmFsdWUoKSAmJiB2YWx1ZSBpcyEgQmluYXJ5T3BlcmF0aW9uVmFsdWUpIHsKICAgICAgcmV0dXJuIGxlZnQgKyB2YWx1ZTsKICAgIH0KICAgIHJldHVybiBjb25zdCBVbmtub3duVmFsdWUoKTsKICB9CgogIEBvdmVycmlkZQogIFZhbHVlIG9wZXJhdG9yIC0oVmFsdWUgb3RoZXIpIHsKICAgIGlmIChvdGhlci5pc1plcm8pIHJldHVybiB0aGlzOwogICAgVmFsdWUgdmFsdWUgPSBsZWZ0IC0gb3RoZXI7CiAgICBpZiAodmFsdWUgIT0gY29uc3QgVW5rbm93blZhbHVlKCkgJiYgdmFsdWUgaXMhIEJpbmFyeU9wZXJhdGlvblZhbHVlKSB7CiAgICAgIHJldHVybiB2YWx1ZSArIHJpZ2h0OwogICAgfQogICAgLy8gSWYgdGhlIHJlc3VsdCBpcyBub3Qgc2ltcGxlIGVub3VnaCwgd2UgdHJ5IHRoZSBzYW1lIGFwcHJvYWNoCiAgICAvLyB3aXRoIFtyaWdodF0uCiAgICB2YWx1ZSA9IHJpZ2h0IC0gb3RoZXI7CiAgICBpZiAodmFsdWUgIT0gY29uc3QgVW5rbm93blZhbHVlKCkgJiYgdmFsdWUgaXMhIEJpbmFyeU9wZXJhdGlvblZhbHVlKSB7CiAgICAgIHJldHVybiBsZWZ0ICsgdmFsdWU7CiAgICB9CiAgICByZXR1cm4gY29uc3QgVW5rbm93blZhbHVlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc05lZ2F0aXZlID0+IGxlZnQuaXNOZWdhdGl2ZSAmJiByaWdodC5pc05lZ2F0aXZlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUG9zaXRpdmUgPT4gbGVmdC5pc1Bvc2l0aXZlICYmIHJpZ2h0LmlzUG9zaXRpdmU7CiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyRsZWZ0ICsgJHJpZ2h0JzsKfQoKY2xhc3MgU3VidHJhY3RWYWx1ZSBleHRlbmRzIEJpbmFyeU9wZXJhdGlvblZhbHVlIHsKICBTdWJ0cmFjdFZhbHVlKGxlZnQsIHJpZ2h0LCBpbmZvKSA6IHN1cGVyKGxlZnQsIHJpZ2h0LCBpbmZvKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKG90aGVyIGlzISBTdWJ0cmFjdFZhbHVlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gbGVmdCA9PSBvdGhlci5sZWZ0ICYmIHJpZ2h0ID09IG90aGVyLnJpZ2h0OwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignU3VidHJhY3RWYWx1ZS5oYXNoQ29kZScpOwoKICBAb3ZlcnJpZGUKICBWYWx1ZSBvcGVyYXRvciAtKCkgPT4gcmlnaHQgLSBsZWZ0OwoKICBAb3ZlcnJpZGUKICBWYWx1ZSBvcGVyYXRvciArKFZhbHVlIG90aGVyKSB7CiAgICBpZiAob3RoZXIuaXNaZXJvKSByZXR1cm4gdGhpczsKICAgIFZhbHVlIHZhbHVlID0gbGVmdCArIG90aGVyOwogICAgaWYgKHZhbHVlICE9IGNvbnN0IFVua25vd25WYWx1ZSgpICYmIHZhbHVlIGlzISBCaW5hcnlPcGVyYXRpb25WYWx1ZSkgewogICAgICByZXR1cm4gdmFsdWUgLSByaWdodDsKICAgIH0KICAgIC8vIElmIHRoZSByZXN1bHQgaXMgbm90IHNpbXBsZSBlbm91Z2gsIHdlIHRyeSB0aGUgc2FtZSBhcHByb2FjaAogICAgLy8gd2l0aCBbcmlnaHRdLgogICAgdmFsdWUgPSBvdGhlciAtIHJpZ2h0OwogICAgaWYgKHZhbHVlICE9IGNvbnN0IFVua25vd25WYWx1ZSgpICYmIHZhbHVlIGlzISBCaW5hcnlPcGVyYXRpb25WYWx1ZSkgewogICAgICByZXR1cm4gbGVmdCArIHZhbHVlOwogICAgfQogICAgcmV0dXJuIGNvbnN0IFVua25vd25WYWx1ZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgVmFsdWUgb3BlcmF0b3IgLShWYWx1ZSBvdGhlcikgewogICAgaWYgKG90aGVyLmlzWmVybykgcmV0dXJuIHRoaXM7CiAgICBWYWx1ZSB2YWx1ZSA9IGxlZnQgLSBvdGhlcjsKICAgIGlmICh2YWx1ZSAhPSBjb25zdCBVbmtub3duVmFsdWUoKSAmJiB2YWx1ZSBpcyEgQmluYXJ5T3BlcmF0aW9uVmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlIC0gcmlnaHQ7CiAgICB9CiAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIG5vdCBzaW1wbGUgZW5vdWdoLCB3ZSB0cnkgdGhlIHNhbWUgYXBwcm9hY2gKICAgIC8vIHdpdGggW3JpZ2h0XS4KICAgIHZhbHVlID0gcmlnaHQgKyBvdGhlcjsKICAgIGlmICh2YWx1ZSAhPSBjb25zdCBVbmtub3duVmFsdWUoKSAmJiB2YWx1ZSBpcyEgQmluYXJ5T3BlcmF0aW9uVmFsdWUpIHsKICAgICAgcmV0dXJuIGxlZnQgLSB2YWx1ZTsKICAgIH0KICAgIHJldHVybiBjb25zdCBVbmtub3duVmFsdWUoKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTmVnYXRpdmUgPT4gbGVmdC5pc05lZ2F0aXZlICYmIHJpZ2h0LmlzUG9zaXRpdmU7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNQb3NpdGl2ZSA9PiBsZWZ0LmlzUG9zaXRpdmUgJiYgcmlnaHQuaXNOZWdhdGl2ZTsKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJGxlZnQgLSAkcmlnaHQnOwp9CgpjbGFzcyBOZWdhdGVWYWx1ZSBleHRlbmRzIFZhbHVlIHsKICBmaW5hbCBWYWx1ZSB2YWx1ZTsKICBOZWdhdGVWYWx1ZSh0aGlzLnZhbHVlLCBpbmZvKSA6IHN1cGVyKGluZm8pOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMhIE5lZ2F0ZVZhbHVlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdmFsdWUgPT0gb3RoZXIudmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdOZWdhdGUuaGFzaENvZGUnKTsKCiAgQG92ZXJyaWRlCiAgVmFsdWUgb3BlcmF0b3IgKyhvdGhlcikgewogICAgaWYgKG90aGVyLmlzWmVybykgcmV0dXJuIHRoaXM7CiAgICBpZiAob3RoZXIgPT0gdmFsdWUpIHJldHVybiBpbmZvLmludFplcm87CiAgICBpZiAob3RoZXIgaXMgTmVnYXRlVmFsdWUpIHJldHVybiB0aGlzIC0gb3RoZXIudmFsdWU7CiAgICBpZiAob3RoZXIgaXMgSW50VmFsdWUpIHsKICAgICAgaWYgKG90aGVyLmlzTmVnYXRpdmUpIHsKICAgICAgICByZXR1cm4gaW5mby5uZXdTdWJ0cmFjdFZhbHVlKHRoaXMsIC1vdGhlcik7CiAgICAgIH0KICAgICAgcmV0dXJuIGluZm8ubmV3U3VidHJhY3RWYWx1ZShvdGhlciwgdmFsdWUpOwogICAgfQogICAgaWYgKG90aGVyIGlzIEluc3RydWN0aW9uVmFsdWUpIHsKICAgICAgcmV0dXJuIGluZm8ubmV3U3VidHJhY3RWYWx1ZShvdGhlciwgdmFsdWUpOwogICAgfQogICAgcmV0dXJuIG90aGVyIC0gdmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICBWYWx1ZSBvcGVyYXRvciAmKFZhbHVlIG90aGVyKSA9PiBjb25zdCBVbmtub3duVmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgVmFsdWUgb3BlcmF0b3IgLShvdGhlcikgewogICAgaWYgKG90aGVyLmlzWmVybykgcmV0dXJuIHRoaXM7CiAgICBpZiAob3RoZXIgaXMgSW50VmFsdWUpIHsKICAgICAgaWYgKG90aGVyLmlzTmVnYXRpdmUpIHsKICAgICAgICByZXR1cm4gaW5mby5uZXdTdWJ0cmFjdFZhbHVlKC1vdGhlciwgdmFsdWUpOwogICAgICB9CiAgICAgIHJldHVybiBpbmZvLm5ld1N1YnRyYWN0VmFsdWUodGhpcywgb3RoZXIpOwogICAgfQogICAgaWYgKG90aGVyIGlzIEluc3RydWN0aW9uVmFsdWUpIHsKICAgICAgcmV0dXJuIGluZm8ubmV3U3VidHJhY3RWYWx1ZSh0aGlzLCBvdGhlcik7CiAgICB9CiAgICBpZiAob3RoZXIgaXMgTmVnYXRlVmFsdWUpIHJldHVybiB0aGlzICsgb3RoZXIudmFsdWU7CiAgICByZXR1cm4gLW90aGVyIC0gdmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICBWYWx1ZSBvcGVyYXRvciAtKCkgPT4gdmFsdWU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTmVnYXRpdmUgPT4gdmFsdWUuaXNQb3NpdGl2ZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1Bvc2l0aXZlID0+IHZhbHVlLmlzTmVnYXRpdmU7CiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJy0kdmFsdWUnOwp9CgovLy8gQSBbUmFuZ2VdIHJlcHJlc2VudHMgdGhlIHBvc3NpYmxlIGludGVnZXIgdmFsdWVzIGFuIGluc3RydWN0aW9uCi8vLyBjYW4gaGF2ZSwgZnJvbSBpdHMgW2xvd2VyXSBib3VuZCB0byBpdHMgW3VwcGVyXSBib3VuZCwgYm90aAovLy8gaW5jbHVkZWQuCmNsYXNzIFJhbmdlIHsKICBmaW5hbCBWYWx1ZSBsb3dlcjsKICBmaW5hbCBWYWx1ZSB1cHBlcjsKICBmaW5hbCBWYWx1ZVJhbmdlSW5mbyBpbmZvOwogIFJhbmdlKHRoaXMubG93ZXIsIHRoaXMudXBwZXIsIHRoaXMuaW5mbykgewogICAgYXNzZXJ0KGxvd2VyICE9IGNvbnN0IFVua25vd25WYWx1ZSgpKTsKICAgIGFzc2VydCh1cHBlciAhPSBjb25zdCBVbmtub3duVmFsdWUoKSk7CiAgfQoKICBSYW5nZS51bmJvdW5kKGluZm8pIDogdGhpcyhjb25zdCBNaW5JbnRWYWx1ZSgpLCBjb25zdCBNYXhJbnRWYWx1ZSgpLCBpbmZvKTsKCiAgLy8vIENoZWNrcyBpZiB0aGUgZ2l2ZW4gdmFsdWVzIGFyZSB1bmtub3duLCBhbmQgY3JlYXRlcyBhCiAgLy8vIHJhbmdlIHRoYXQgZG9lcyBub3QgaGF2ZSBhbnkgdW5rbm93biB2YWx1ZXMuCiAgUmFuZ2Uubm9ybWFsaXplKFZhbHVlIGxvdywgVmFsdWUgdXAsIGluZm8pCiAgICAgIDogdGhpcyhsb3cgPT0gY29uc3QgVW5rbm93blZhbHVlKCkgPyBjb25zdCBNaW5JbnRWYWx1ZSgpIDogbG93LAogICAgICAgICAgICB1cCA9PSBjb25zdCBVbmtub3duVmFsdWUoKSA/IGNvbnN0IE1heEludFZhbHVlKCkgOiB1cCwgaW5mbyk7CgogIFJhbmdlIHVuaW9uKFJhbmdlIG90aGVyKSB7CiAgICByZXR1cm4gaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UoCiAgICAgICAgbG93ZXIubWluKG90aGVyLmxvd2VyKSwgdXBwZXIubWF4KG90aGVyLnVwcGVyKSk7CiAgfQoKICBSYW5nZSBpbnRlcnNlY3Rpb24oUmFuZ2Ugb3RoZXIpIHsKICAgIFZhbHVlIGxvdyA9IGxvd2VyLm1heChvdGhlci5sb3dlcik7CiAgICBWYWx1ZSB1cCA9IHVwcGVyLm1pbihvdGhlci51cHBlcik7CiAgICAvLyBJZiB3ZSBjb3VsZCBub3QgY29tcHV0ZSBtYXggb3IgbWluLCBwaWNrIGEgdmFsdWUgaW4gdGhlIHR3bwogICAgLy8gcmFuZ2VzLCB3aXRoIHByaW9yaXR5IHRvIFtJbnRWYWx1ZV1zIGJlY2F1c2UgdGhleSBhcmUgc2ltcGxlci4KICAgIGlmIChsb3cgPT0gY29uc3QgVW5rbm93blZhbHVlKCkpIHsKICAgICAgaWYgKGxvd2VyIGlzIEludFZhbHVlKQogICAgICAgIGxvdyA9IGxvd2VyOwogICAgICBlbHNlIGlmIChvdGhlci5sb3dlciBpcyBJbnRWYWx1ZSkKICAgICAgICBsb3cgPSBvdGhlci5sb3dlcjsKICAgICAgZWxzZQogICAgICAgIGxvdyA9IGxvd2VyOwogICAgfQogICAgaWYgKHVwID09IGNvbnN0IFVua25vd25WYWx1ZSgpKSB7CiAgICAgIGlmICh1cHBlciBpcyBJbnRWYWx1ZSkKICAgICAgICB1cCA9IHVwcGVyOwogICAgICBlbHNlIGlmIChvdGhlci51cHBlciBpcyBJbnRWYWx1ZSkKICAgICAgICB1cCA9IG90aGVyLnVwcGVyOwogICAgICBlbHNlCiAgICAgICAgdXAgPSB1cHBlcjsKICAgIH0KICAgIHJldHVybiBpbmZvLm5ld05vcm1hbGl6ZWRSYW5nZShsb3csIHVwKTsKICB9CgogIFJhbmdlIG9wZXJhdG9yICsoUmFuZ2Ugb3RoZXIpIHsKICAgIHJldHVybiBpbmZvLm5ld05vcm1hbGl6ZWRSYW5nZShsb3dlciArIG90aGVyLmxvd2VyLCB1cHBlciArIG90aGVyLnVwcGVyKTsKICB9CgogIFJhbmdlIG9wZXJhdG9yIC0oUmFuZ2Ugb3RoZXIpIHsKICAgIHJldHVybiBpbmZvLm5ld05vcm1hbGl6ZWRSYW5nZShsb3dlciAtIG90aGVyLnVwcGVyLCB1cHBlciAtIG90aGVyLmxvd2VyKTsKICB9CgogIFJhbmdlIG9wZXJhdG9yIC0oKSB7CiAgICByZXR1cm4gaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UoLXVwcGVyLCAtbG93ZXIpOwogIH0KCiAgUmFuZ2Ugb3BlcmF0b3IgJihSYW5nZSBvdGhlcikgewogICAgaWYgKGlzU2luZ2xlVmFsdWUgJiYKICAgICAgICBvdGhlci5pc1NpbmdsZVZhbHVlICYmCiAgICAgICAgbG93ZXIgaXMgSW50VmFsdWUgJiYKICAgICAgICBvdGhlci5sb3dlciBpcyBJbnRWYWx1ZSkgewogICAgICByZXR1cm4gaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UobG93ZXIgJiBvdGhlci5sb3dlciwgdXBwZXIgJiBvdGhlci51cHBlcik7CiAgICB9CiAgICBpZiAoaXNQb3NpdGl2ZSAmJiBvdGhlci5pc1Bvc2l0aXZlKSB7CiAgICAgIFZhbHVlIHVwID0gdXBwZXIubWluKG90aGVyLnVwcGVyKTsKICAgICAgaWYgKHVwID09IGNvbnN0IFVua25vd25WYWx1ZSgpKSB7CiAgICAgICAgLy8gSWYgd2UgY291bGQgbm90IGZpbmQgYSB0cml2aWFsIGJvdW5kLCBqdXN0IHRyeSB0byB1c2UgdGhlCiAgICAgICAgLy8gb25lIHRoYXQgaXMgYW4gaW50LgogICAgICAgIHVwID0gdXBwZXIgaXMgSW50VmFsdWUgPyB1cHBlciA6IG90aGVyLnVwcGVyOwogICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBnZXQgdGhlIHNhbWUgdXBwZXIgYm91bmQsIHdoZXRoZXIgaXQncyBhICYgYgogICAgICAgIC8vIG9yIGIgJiBhLgogICAgICAgIGlmICh1cCBpcyEgSW50VmFsdWUgJiYgdXBwZXIgIT0gb3RoZXIudXBwZXIpIHVwID0gY29uc3QgTWF4SW50VmFsdWUoKTsKICAgICAgfQogICAgICByZXR1cm4gaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UoaW5mby5pbnRaZXJvLCB1cCk7CiAgICB9IGVsc2UgaWYgKGlzUG9zaXRpdmUpIHsKICAgICAgcmV0dXJuIGluZm8ubmV3Tm9ybWFsaXplZFJhbmdlKGluZm8uaW50WmVybywgdXBwZXIpOwogICAgfSBlbHNlIGlmIChvdGhlci5pc1Bvc2l0aXZlKSB7CiAgICAgIHJldHVybiBpbmZvLm5ld05vcm1hbGl6ZWRSYW5nZShpbmZvLmludFplcm8sIG90aGVyLnVwcGVyKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBpbmZvLm5ld1VuYm91bmRSYW5nZSgpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKG90aGVyIGlzISBSYW5nZSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIG90aGVyLmxvd2VyID09IGxvd2VyICYmIG90aGVyLnVwcGVyID09IHVwcGVyOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignUmFuZ2UuaGFzaENvZGUnKTsKCiAgYm9vbCBvcGVyYXRvciA8KFJhbmdlIG90aGVyKSB7CiAgICByZXR1cm4gdXBwZXIgIT0gb3RoZXIubG93ZXIgJiYgdXBwZXIubWluKG90aGVyLmxvd2VyKSA9PSB1cHBlcjsKICB9CgogIGJvb2wgb3BlcmF0b3IgPihSYW5nZSBvdGhlcikgewogICAgcmV0dXJuIGxvd2VyICE9IG90aGVyLnVwcGVyICYmIGxvd2VyLm1heChvdGhlci51cHBlcikgPT0gbG93ZXI7CiAgfQoKICBib29sIG9wZXJhdG9yIDw9KFJhbmdlIG90aGVyKSB7CiAgICByZXR1cm4gdXBwZXIubWluKG90aGVyLmxvd2VyKSA9PSB1cHBlcjsKICB9CgogIGJvb2wgb3BlcmF0b3IgPj0oUmFuZ2Ugb3RoZXIpIHsKICAgIHJldHVybiBsb3dlci5tYXgob3RoZXIudXBwZXIpID09IGxvd2VyOwogIH0KCiAgYm9vbCBnZXQgaXNOZWdhdGl2ZSA9PiB1cHBlci5pc05lZ2F0aXZlOwogIGJvb2wgZ2V0IGlzUG9zaXRpdmUgPT4gbG93ZXIuaXNQb3NpdGl2ZTsKICBib29sIGdldCBpc1NpbmdsZVZhbHVlID0+IGxvd2VyID09IHVwcGVyOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnWyRsb3dlciwgJHVwcGVyXSc7Cn0KCi8vLyBWaXNpdHMgdGhlIGdyYXBoIGluIGRvbWluYXRvciBvcmRlciwgYW5kIGNvbXB1dGVzIHZhbHVlIHJhbmdlcyBmb3IKLy8vIGludGVnZXIgaW5zdHJ1Y3Rpb25zLiBXaGlsZSB2aXNpdGluZyB0aGUgZ3JhcGgsIHRoaXMgcGhhc2UgYWxzbwovLy8gcmVtb3ZlcyB1bm5lY2Vzc2FyeSBib3VuZHMgY2hlY2tzLCBhbmQgY29tcGFyaXNvbnMgdGhhdCBhcmUgcHJvdmVuCi8vLyB0byBiZSB0cnVlIG9yIGZhbHNlLgpjbGFzcyBTc2FWYWx1ZVJhbmdlQW5hbHl6ZXIgZXh0ZW5kcyBIQmFzZVZpc2l0b3IgaW1wbGVtZW50cyBPcHRpbWl6YXRpb25QaGFzZSB7CiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+ICdTU0EgdmFsdWUgcmFuZ2UgYnVpbGRlcic7CgogIC8vLyBMaXN0IG9mIFtIUmFuZ2VDb252ZXJzaW9uXSBpbnN0cnVjdGlvbnMgY3JlYXRlZCBieSB0aGUgcGhhc2UuIFdlCiAgLy8vIHNhdmUgdGhlbSBoZXJlIGluIG9yZGVyIHRvIHJlbW92ZSB0aGVtIG9uY2UgdGhlIHBoYXNlIGlzIGRvbmUuCiAgZmluYWwgTGlzdDxIUmFuZ2VDb252ZXJzaW9uPiBjb252ZXJzaW9ucyA9IDxIUmFuZ2VDb252ZXJzaW9uPltdOwoKICAvLy8gVmFsdWUgcmFuZ2VzIGZvciBpbnRlZ2VyIGluc3RydWN0aW9ucy4gVGhpcyBtYXAgZ2V0cyBwb3B1bGF0ZWQgYnkKICAvLy8gdGhlIGRvbWluYXRvciB0cmVlIHZpc2l0LgogIGZpbmFsIE1hcDxISW5zdHJ1Y3Rpb24sIFJhbmdlPiByYW5nZXMgPSBuZXcgTWFwPEhJbnN0cnVjdGlvbiwgUmFuZ2U+KCk7CgogIGZpbmFsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZDsKICBmaW5hbCBWYWx1ZVJhbmdlSW5mbyBpbmZvOwogIGZpbmFsIFNzYU9wdGltaXplclRhc2sgb3B0aW1pemVyOwoKICBIR3JhcGggZ3JhcGg7CgogIFNzYVZhbHVlUmFuZ2VBbmFseXplcihKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsIHRoaXMub3B0aW1pemVyKQogICAgICA6IGluZm8gPSBuZXcgVmFsdWVSYW5nZUluZm8oKSwKICAgICAgICB0aGlzLmNsb3NlZFdvcmxkID0gY2xvc2VkV29ybGQ7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRHcmFwaChIR3JhcGggZ3JhcGgpIHsKICAgIHRoaXMuZ3JhcGggPSBncmFwaDsKICAgIHZpc2l0RG9taW5hdG9yVHJlZShncmFwaCk7CiAgICAvLyBXZSByZW1vdmUgdGhlIHJhbmdlIGNvbnZlcnNpb25zIGFmdGVyIHZpc2l0aW5nIHRoZSBncmFwaCBzbwogICAgLy8gdGhhdCB0aGUgZ3JhcGggZG9lcyBub3QgZ2V0IHBvbGx1dGVkIHdpdGggdGhlc2UgaW5zdHJ1Y3Rpb25zCiAgICAvLyBvbmx5IG5lY2Vzc2FyeSBmb3IgdGhpcyBwaGFzZS4KICAgIHJlbW92ZVJhbmdlQ29udmVyc2lvbigpOwogICAgLy8gVE9ETyhoZXJodXQpOiBGaW5kIGEgY2xlYW5lciB3YXkgdG8gcGFzcyBhcm91bmQgcmFuZ2VzLgogICAgb3B0aW1pemVyLnJhbmdlcyA9IHJhbmdlczsKICB9CgogIHZvaWQgcmVtb3ZlUmFuZ2VDb252ZXJzaW9uKCkgewogICAgY29udmVyc2lvbnMuZm9yRWFjaCgoSFJhbmdlQ29udmVyc2lvbiBpbnN0cnVjdGlvbikgewogICAgICBpbnN0cnVjdGlvbi5ibG9jay5yZXdyaXRlKGluc3RydWN0aW9uLCBpbnN0cnVjdGlvbi5pbnB1dHNbMF0pOwogICAgICBpbnN0cnVjdGlvbi5ibG9jay5yZW1vdmUoaW5zdHJ1Y3Rpb24pOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QmFzaWNCbG9jayhIQmFzaWNCbG9jayBibG9jaykgewogICAgdm9pZCB2aXNpdChISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgICAgUmFuZ2UgcmFuZ2UgPSBpbnN0cnVjdGlvbi5hY2NlcHQodGhpcyk7CiAgICAgIGlmIChpbnN0cnVjdGlvbgogICAgICAgICAgLmlzSW50ZWdlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICBhc3NlcnQocmFuZ2UgIT0gbnVsbCk7CiAgICAgICAgcmFuZ2VzW2luc3RydWN0aW9uXSA9IHJhbmdlOwogICAgICB9CiAgICB9CgogICAgYmxvY2suZm9yRWFjaFBoaSh2aXNpdCk7CiAgICBibG9jay5mb3JFYWNoSW5zdHJ1Y3Rpb24odmlzaXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgUmFuZ2UgdmlzaXRJbnN0cnVjdGlvbihISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGlmIChpbnN0cnVjdGlvbgogICAgICAgIC5pc1Bvc2l0aXZlSW50ZWdlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgIC5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiBpbmZvLm5ld05vcm1hbGl6ZWRSYW5nZSgKICAgICAgICAgIGluZm8uaW50WmVybywgaW5mby5uZXdQb3NpdGl2ZVZhbHVlKGluc3RydWN0aW9uKSk7CiAgICB9IGVsc2UgaWYgKGluc3RydWN0aW9uCiAgICAgICAgLmlzSW50ZWdlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgIC5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIEluc3RydWN0aW9uVmFsdWUgdmFsdWUgPSBpbmZvLm5ld0luc3RydWN0aW9uVmFsdWUoaW5zdHJ1Y3Rpb24pOwogICAgICByZXR1cm4gaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UodmFsdWUsIHZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBpbmZvLm5ld1VuYm91bmRSYW5nZSgpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgUmFuZ2UgdmlzaXRQaGkoSFBoaSBwaGkpIHsKICAgIGlmIChwaGkuaXNJbnRlZ2VyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzUG90ZW50aWFsbHlGYWxzZSkKICAgICAgcmV0dXJuIGluZm8ubmV3VW5ib3VuZFJhbmdlKCk7CiAgICAvLyBTb21lIHBoYXNlcyBtYXkgcmVwbGFjZSBpbnN0cnVjdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGlucHV0cyBvZgogICAgLy8gdGhpcyBwaGkuIE9ubHkgdGhlIFtTc2FUeXBlc1Byb3BhZ2F0aW9uXSBwaGFzZSB3aWxsIHVwZGF0ZSB0aGUKICAgIC8vIHBoaSB0eXBlLiBQbGF5IGl0IHNhZmUgYnkgYXNzdW1pbmcgdGhlIFtTc2FUeXBlc1Byb3BhZ2F0aW9uXQogICAgLy8gcGhhc2UgaXMgbm90IG5lY2Vzc2FyaWx5IHJ1biBiZWZvcmUgdGhlIFtWYWx1ZVJhbmdlQW5hbHl6ZXJdLgogICAgaWYgKHBoaS5pbnB1dHMuYW55KChpKSA9PgogICAgICAgIGkuaXNJbnRlZ2VyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzUG90ZW50aWFsbHlGYWxzZSkpIHsKICAgICAgcmV0dXJuIGluZm8ubmV3VW5ib3VuZFJhbmdlKCk7CiAgICB9CiAgICBpZiAocGhpLmJsb2NrLmlzTG9vcEhlYWRlcigpKSB7CiAgICAgIFJhbmdlIHJhbmdlID0KICAgICAgICAgIG5ldyBMb29wVXBkYXRlUmVjb2duaXplcihjbG9zZWRXb3JsZCwgcmFuZ2VzLCBpbmZvKS5ydW4ocGhpKTsKICAgICAgaWYgKHJhbmdlID09IG51bGwpIHJldHVybiBpbmZvLm5ld1VuYm91bmRSYW5nZSgpOwogICAgICByZXR1cm4gcmFuZ2U7CiAgICB9CgogICAgUmFuZ2UgcmFuZ2UgPSByYW5nZXNbcGhpLmlucHV0c1swXV07CiAgICBmb3IgKGludCBpID0gMTsgaSA8IHBoaS5pbnB1dHMubGVuZ3RoOyBpKyspIHsKICAgICAgcmFuZ2UgPSByYW5nZS51bmlvbihyYW5nZXNbcGhpLmlucHV0c1tpXV0pOwogICAgfQogICAgcmV0dXJuIHJhbmdlOwogIH0KCiAgQG92ZXJyaWRlCiAgUmFuZ2UgdmlzaXRDb25zdGFudChIQ29uc3RhbnQgaENvbnN0YW50KSB7CiAgICBpZiAoaENvbnN0YW50CiAgICAgICAgLmlzSW50ZWdlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgIC5pc1BvdGVudGlhbGx5RmFsc2UpIHsKICAgICAgcmV0dXJuIGluZm8ubmV3VW5ib3VuZFJhbmdlKCk7CiAgICB9CiAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50ID0gaENvbnN0YW50LmNvbnN0YW50OwogICAgTnVtQ29uc3RhbnRWYWx1ZSBjb25zdGFudE51bTsKICAgIGlmIChjb25zdGFudCBpcyBEZWZlcnJlZEdsb2JhbENvbnN0YW50VmFsdWUpIHsKICAgICAgY29uc3RhbnROdW0gPSBjb25zdGFudC5yZWZlcmVuY2VkOwogICAgfSBlbHNlIHsKICAgICAgY29uc3RhbnROdW0gPSBjb25zdGFudDsKICAgIH0KICAgIGlmIChjb25zdGFudE51bS5pc1Bvc2l0aXZlSW5maW5pdHkgfHwgY29uc3RhbnROdW0uaXNOZWdhdGl2ZUluZmluaXR5KSB7CiAgICAgIHJldHVybiBpbmZvLm5ld1VuYm91bmRSYW5nZSgpOwogICAgfQogICAgaWYgKGNvbnN0YW50TnVtLmlzTWludXNaZXJvKSB7CiAgICAgIGNvbnN0YW50TnVtID0gbmV3IEludENvbnN0YW50VmFsdWUoQmlnSW50Lnplcm8pOwogICAgfQoKICAgIEJpZ0ludCBpbnRWYWx1ZSA9IGNvbnN0YW50TnVtIGlzIEludENvbnN0YW50VmFsdWUKICAgICAgICA/IGNvbnN0YW50TnVtLmludFZhbHVlCiAgICAgICAgOiBuZXcgQmlnSW50LmZyb20oY29uc3RhbnROdW0uZG91YmxlVmFsdWUudG9JbnQoKSk7CiAgICBWYWx1ZSB2YWx1ZSA9IGluZm8ubmV3SW50VmFsdWUoaW50VmFsdWUpOwogICAgcmV0dXJuIGluZm8ubmV3Tm9ybWFsaXplZFJhbmdlKHZhbHVlLCB2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBSYW5nZSB2aXNpdEZpZWxkR2V0KEhGaWVsZEdldCBmaWVsZEdldCkgewogICAgcmV0dXJuIHZpc2l0SW5zdHJ1Y3Rpb24oZmllbGRHZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgUmFuZ2UgdmlzaXRHZXRMZW5ndGgoSEdldExlbmd0aCBub2RlKSB7CiAgICBQb3NpdGl2ZVZhbHVlIHZhbHVlID0gaW5mby5uZXdQb3NpdGl2ZVZhbHVlKG5vZGUpOwogICAgLy8gV2Uga25vdyB0aGlzIHJhbmdlIGlzIGFib3ZlIHplcm8uIFRvIHNpbXBsaWZ5IHRoZSBhbmFseXNpcywgd2UKICAgIC8vIHB1dCB0aGUgemVybyB2YWx1ZSBhcyB0aGUgbG93ZXIgYm91bmQgb2YgdGhpcyByYW5nZS4gVGhpcwogICAgLy8gYWxsb3dzIHRvIGVhc2lseSByZW1vdmUgdGhlIHNlY29uZCBib3VuZCBjaGVjayBpbiB0aGUgZm9sbG93aW5nCiAgICAvLyBleHByZXNzaW9uOiBhWzFdICsgYVswXS4KICAgIHJldHVybiBpbmZvLm5ld05vcm1hbGl6ZWRSYW5nZShpbmZvLmludFplcm8sIHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIFJhbmdlIHZpc2l0Qm91bmRzQ2hlY2soSEJvdW5kc0NoZWNrIGNoZWNrKSB7CiAgICAvLyBTYXZlIHRoZSBuZXh0IGluc3RydWN0aW9uLCBpbiBjYXNlIHRoZSBjaGVjayBnZXRzIHJlbW92ZWQuCiAgICBISW5zdHJ1Y3Rpb24gbmV4dCA9IGNoZWNrLm5leHQ7CiAgICBSYW5nZSBpbmRleFJhbmdlID0gcmFuZ2VzW2NoZWNrLmluZGV4XTsKICAgIFJhbmdlIGxlbmd0aFJhbmdlID0gcmFuZ2VzW2NoZWNrLmxlbmd0aF07CiAgICBpZiAoaW5kZXhSYW5nZSA9PSBudWxsKSB7CiAgICAgIGluZGV4UmFuZ2UgPSBpbmZvLm5ld1VuYm91bmRSYW5nZSgpOwogICAgICBhc3NlcnQoY2hlY2suaW5kZXgKICAgICAgICAgIC5pc0ludGVnZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgIC5pc1BvdGVudGlhbGx5RmFsc2UpOwogICAgfQogICAgaWYgKGxlbmd0aFJhbmdlID09IG51bGwpIHsKICAgICAgLy8gV2UgbWlnaHQgaGF2ZSBsb3N0IHRoZSBsZW5ndGggcmFuZ2UgZHVlIHRvIGEgdHlwZSBjb252ZXJzaW9uIHRoYXQKICAgICAgLy8gYXNzZXJ0cyBhIG5vbi1pbnRlZ2VyIHR5cGUuIEluIHN1Y2ggYSBjYXNlLCB0aGUgcHJvZ3JhbSB3aWxsIG5ldmVyCiAgICAgIC8vIGdldCB0byB0aGlzIHBvaW50IGFueXdheSwgc28gbm8gbmVlZCB0byB0cnkgYW5kIHJlZmluZSByYW5nZXMuCiAgICAgIHJldHVybiBpbmRleFJhbmdlOwogICAgfQogICAgYXNzZXJ0KGNoZWNrLmxlbmd0aAogICAgICAgIC5pc0ludGVnZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSk7CgogICAgLy8gQ2hlY2sgaWYgdGhlIGluZGV4IGlzIHN0cmljdGx5IGJlbG93IHRoZSB1cHBlciBib3VuZCBvZiB0aGUgbGVuZ3RoCiAgICAvLyByYW5nZS4KICAgIFZhbHVlIG1heEluZGV4ID0gbGVuZ3RoUmFuZ2UudXBwZXIgLSBpbmZvLmludE9uZTsKICAgIGJvb2wgYmVsb3dMZW5ndGggPSBtYXhJbmRleCAhPSBjb25zdCBNYXhJbnRWYWx1ZSgpICYmCiAgICAgICAgaW5kZXhSYW5nZS51cHBlci5taW4obWF4SW5kZXgpID09IGluZGV4UmFuZ2UudXBwZXI7CgogICAgLy8gQ2hlY2sgaWYgdGhlIGluZGV4IGlzIHN0cmljdGx5IGJlbG93IHRoZSBsb3dlciBib3VuZCBvZiB0aGUgbGVuZ3RoCiAgICAvLyByYW5nZS4KICAgIGJlbG93TGVuZ3RoID0gYmVsb3dMZW5ndGggfHwKICAgICAgICAoaW5kZXhSYW5nZS51cHBlciAhPSBsZW5ndGhSYW5nZS5sb3dlciAmJgogICAgICAgICAgICBpbmRleFJhbmdlLnVwcGVyLm1pbihsZW5ndGhSYW5nZS5sb3dlcikgPT0gaW5kZXhSYW5nZS51cHBlcik7CiAgICBpZiAoaW5kZXhSYW5nZS5pc1Bvc2l0aXZlICYmIGJlbG93TGVuZ3RoKSB7CiAgICAgIGNoZWNrLmJsb2NrLnJld3JpdGUoY2hlY2ssIGNoZWNrLmluZGV4KTsKICAgICAgY2hlY2suYmxvY2sucmVtb3ZlKGNoZWNrKTsKICAgIH0gZWxzZSBpZiAoaW5kZXhSYW5nZS5pc05lZ2F0aXZlIHx8IGxlbmd0aFJhbmdlIDwgaW5kZXhSYW5nZSkgewogICAgICBjaGVjay5zdGF0aWNDaGVja3MgPSBIQm91bmRzQ2hlY2suQUxXQVlTX0ZBTFNFOwogICAgICAvLyBUaGUgY2hlY2sgaXMgYWx3YXlzIGZhbHNlLCBhbmQgd2hhdGV2ZXIgaW5zdHJ1Y3Rpb24gaXQKICAgICAgLy8gZG9taW5hdGVzIGlzIGRlYWQgY29kZS4KICAgICAgcmV0dXJuIGluZGV4UmFuZ2U7CiAgICB9IGVsc2UgaWYgKGluZGV4UmFuZ2UuaXNQb3NpdGl2ZSkgewogICAgICBjaGVjay5zdGF0aWNDaGVja3MgPSBIQm91bmRzQ2hlY2suQUxXQVlTX0FCT1ZFX1pFUk87CiAgICB9IGVsc2UgaWYgKGJlbG93TGVuZ3RoKSB7CiAgICAgIGNoZWNrLnN0YXRpY0NoZWNrcyA9IEhCb3VuZHNDaGVjay5BTFdBWVNfQkVMT1dfTEVOR1RIOwogICAgfQoKICAgIGlmIChpbmRleFJhbmdlLmlzUG9zaXRpdmUpIHsKICAgICAgLy8gSWYgdGhlIHRlc3QgcGFzc2VzLCB3ZSBrbm93IHRoZSBsb3dlciBib3VuZCBvZiB0aGUgbGVuZ3RoIGlzCiAgICAgIC8vIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIGluZGV4LgogICAgICBWYWx1ZSBsb3cgPSBsZW5ndGhSYW5nZS5sb3dlci5tYXgoaW5kZXhSYW5nZS5sb3dlcik7CiAgICAgIGlmIChsb3cgIT0gY29uc3QgVW5rbm93blZhbHVlKCkpIHsKICAgICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSBjcmVhdGVSYW5nZUNvbnZlcnNpb24obmV4dCwgY2hlY2subGVuZ3RoKTsKICAgICAgICByYW5nZXNbaW5zdHJ1Y3Rpb25dID0gaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UobG93LCBsZW5ndGhSYW5nZS51cHBlcik7CiAgICAgIH0KICAgIH0KCiAgICAvLyBVcGRhdGUgdGhlIHJhbmdlIG9mIHRoZSBpbmRleCBpZiB1c2luZyB0aGUgbWF4aW11bSBpbmRleAogICAgLy8gbmFycm93cyBpdC4gVXNlIHRoYXQgbmV3IHJhbmdlIGZvciB0aGlzIGluc3RydWN0aW9uIGFzIHdlbGwuCiAgICBSYW5nZSBuZXdJbmRleFJhbmdlID0gaW5kZXhSYW5nZQogICAgICAgIC5pbnRlcnNlY3Rpb24oaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UoaW5mby5pbnRaZXJvLCBtYXhJbmRleCkpOwogICAgaWYgKGluZGV4UmFuZ2UgPT0gbmV3SW5kZXhSYW5nZSkgcmV0dXJuIGluZGV4UmFuZ2U7CiAgICAvLyBFeHBsaWNpdGx5IGF0dGFjaCB0aGUgcmFuZ2UgaW5mb3JtYXRpb24gdG8gdGhlIGluZGV4IGluc3RydWN0aW9uLAogICAgLy8gd2hpY2ggbWF5IGJlIHVzZWQgYnkgb3RoZXIgaW5zdHJ1Y3Rpb25zLiAgUmV0dXJuaW5nIHRoZSBuZXcgcmFuZ2Ugd2lsbAogICAgLy8gYXR0YWNoIGl0IHRvIHRoaXMgaW5zdHJ1Y3Rpb24uCiAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSBjcmVhdGVSYW5nZUNvbnZlcnNpb24obmV4dCwgY2hlY2suaW5kZXgpOwogICAgcmFuZ2VzW2luc3RydWN0aW9uXSA9IG5ld0luZGV4UmFuZ2U7CiAgICByZXR1cm4gbmV3SW5kZXhSYW5nZTsKICB9CgogIEBvdmVycmlkZQogIFJhbmdlIHZpc2l0UmVsYXRpb25hbChIUmVsYXRpb25hbCByZWxhdGlvbmFsKSB7CiAgICBISW5zdHJ1Y3Rpb24gcmlnaHQgPSByZWxhdGlvbmFsLnJpZ2h0OwogICAgSEluc3RydWN0aW9uIGxlZnQgPSByZWxhdGlvbmFsLmxlZnQ7CiAgICBpZiAobGVmdC5pc0ludGVnZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNQb3RlbnRpYWxseUZhbHNlKSB7CiAgICAgIHJldHVybiBpbmZvLm5ld1VuYm91bmRSYW5nZSgpOwogICAgfQogICAgaWYgKHJpZ2h0LmlzSW50ZWdlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc1BvdGVudGlhbGx5RmFsc2UpIHsKICAgICAgcmV0dXJuIGluZm8ubmV3VW5ib3VuZFJhbmdlKCk7CiAgICB9CiAgICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9IHJlbGF0aW9uYWwub3BlcmF0aW9uKCk7CiAgICBSYW5nZSByaWdodFJhbmdlID0gcmFuZ2VzW3JlbGF0aW9uYWwucmlnaHRdOwogICAgUmFuZ2UgbGVmdFJhbmdlID0gcmFuZ2VzW3JlbGF0aW9uYWwubGVmdF07CgogICAgaWYgKHJlbGF0aW9uYWwgaXMgSElkZW50aXR5KSB7CiAgICAgIGhhbmRsZUVxdWFsaXR5Q2hlY2socmVsYXRpb25hbCk7CiAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbi5hcHBseShsZWZ0UmFuZ2UsIHJpZ2h0UmFuZ2UpKSB7CiAgICAgIHJlbGF0aW9uYWwuYmxvY2sKICAgICAgICAgIC5yZXdyaXRlKHJlbGF0aW9uYWwsIGdyYXBoLmFkZENvbnN0YW50Qm9vbCh0cnVlLCBjbG9zZWRXb3JsZCkpOwogICAgICByZWxhdGlvbmFsLmJsb2NrLnJlbW92ZShyZWxhdGlvbmFsKTsKICAgIH0gZWxzZSBpZiAobmVnYXRlT3BlcmF0aW9uKG9wZXJhdGlvbikuYXBwbHkobGVmdFJhbmdlLCByaWdodFJhbmdlKSkgewogICAgICByZWxhdGlvbmFsLmJsb2NrCiAgICAgICAgICAucmV3cml0ZShyZWxhdGlvbmFsLCBncmFwaC5hZGRDb25zdGFudEJvb2woZmFsc2UsIGNsb3NlZFdvcmxkKSk7CiAgICAgIHJlbGF0aW9uYWwuYmxvY2sucmVtb3ZlKHJlbGF0aW9uYWwpOwogICAgfQogICAgcmV0dXJuIGluZm8ubmV3VW5ib3VuZFJhbmdlKCk7CiAgfQoKICB2b2lkIGhhbmRsZUVxdWFsaXR5Q2hlY2soSFJlbGF0aW9uYWwgbm9kZSkgewogICAgUmFuZ2UgcmlnaHQgPSByYW5nZXNbbm9kZS5yaWdodF07CiAgICBSYW5nZSBsZWZ0ID0gcmFuZ2VzW25vZGUubGVmdF07CiAgICBpZiAobGVmdC5pc1NpbmdsZVZhbHVlICYmIHJpZ2h0LmlzU2luZ2xlVmFsdWUgJiYgbGVmdCA9PSByaWdodCkgewogICAgICBub2RlLmJsb2NrLnJld3JpdGUobm9kZSwgZ3JhcGguYWRkQ29uc3RhbnRCb29sKHRydWUsIGNsb3NlZFdvcmxkKSk7CiAgICAgIG5vZGUuYmxvY2sucmVtb3ZlKG5vZGUpOwogICAgfQogIH0KCiAgUmFuZ2UgaGFuZGxlSW52b2tlTW9kdWxvKEhJbnZva2VEeW5hbWljTWV0aG9kIGludm9rZSkgewogICAgSEluc3RydWN0aW9uIGxlZnQgPSBpbnZva2UuaW5wdXRzWzFdOwogICAgSEluc3RydWN0aW9uIHJpZ2h0ID0gaW52b2tlLmlucHV0c1syXTsKICAgIFJhbmdlIGRpdmlzb3IgPSByYW5nZXNbcmlnaHRdOwogICAgaWYgKGRpdmlzb3IgIT0gbnVsbCkgewogICAgICAvLyBGb3IgSW50ZWdlciB2YWx1ZXMgd2UgY2FuIGJlIHByZWNpc2UgaW4gdGhlIHVwcGVyIGJvdW5kLCBzbyBzcGVjaWFsCiAgICAgIC8vIGNhc2UgdGhvc2UuCiAgICAgIGlmIChsZWZ0LmlzSW50ZWdlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgICByaWdodC5pc0ludGVnZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICAgIGlmIChkaXZpc29yLmlzUG9zaXRpdmUpIHsKICAgICAgICAgIHJldHVybiBpbmZvLm5ld05vcm1hbGl6ZWRSYW5nZSgKICAgICAgICAgICAgICBpbmZvLmludFplcm8sIGRpdmlzb3IudXBwZXIgLSBpbmZvLmludE9uZSk7CiAgICAgICAgfSBlbHNlIGlmIChkaXZpc29yLmlzTmVnYXRpdmUpIHsKICAgICAgICAgIHJldHVybiBpbmZvLm5ld05vcm1hbGl6ZWRSYW5nZSgKICAgICAgICAgICAgICBpbmZvLmludFplcm8sIGluZm8ubmV3TmVnYXRlVmFsdWUoZGl2aXNvci5sb3dlcikgLSBpbmZvLmludE9uZSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGxlZnQKICAgICAgICAgICAgICAuaXNOdW1iZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSAmJgogICAgICAgICAgcmlnaHQuaXNOdW1iZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICAgIGlmIChkaXZpc29yLmlzUG9zaXRpdmUpIHsKICAgICAgICAgIHJldHVybiBpbmZvLm5ld05vcm1hbGl6ZWRSYW5nZShpbmZvLmludFplcm8sIGRpdmlzb3IudXBwZXIpOwogICAgICAgIH0gZWxzZSBpZiAoZGl2aXNvci5pc05lZ2F0aXZlKSB7CiAgICAgICAgICByZXR1cm4gaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UoCiAgICAgICAgICAgICAgaW5mby5pbnRaZXJvLCBpbmZvLm5ld05lZ2F0ZVZhbHVlKGRpdmlzb3IubG93ZXIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpbmZvLm5ld1VuYm91bmRSYW5nZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgUmFuZ2UgdmlzaXRSZW1haW5kZXIoSFJlbWFpbmRlciBpbnN0cnVjdGlvbikgewogICAgSEluc3RydWN0aW9uIGxlZnQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMF07CiAgICBISW5zdHJ1Y3Rpb24gcmlnaHQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMV07CiAgICBSYW5nZSBkaXZpZGVuZCA9IHJhbmdlc1tsZWZ0XTsKICAgIC8vIElmIGJvdGggb3BlcmFuZHMgYXJlID49MCwgdGhlIHJlc3VsdCBpcyA+PSAwIGFuZCBib3VuZGVkIGJ5IHRoZSBkaXZpc29yLgogICAgaWYgKChkaXZpZGVuZCAhPSBudWxsICYmIGRpdmlkZW5kLmlzUG9zaXRpdmUpIHx8CiAgICAgICAgbGVmdAogICAgICAgICAgICAuaXNQb3NpdGl2ZUludGVnZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgUmFuZ2UgZGl2aXNvciA9IHJhbmdlc1tyaWdodF07CiAgICAgIGlmIChkaXZpc29yICE9IG51bGwpIHsKICAgICAgICBpZiAoZGl2aXNvci5pc1Bvc2l0aXZlKSB7CiAgICAgICAgICAvLyBGb3IgSW50ZWdlciB2YWx1ZXMgd2UgY2FuIGJlIHByZWNpc2UgaW4gdGhlIHVwcGVyIGJvdW5kLgogICAgICAgICAgaWYgKGxlZnQKICAgICAgICAgICAgICAgICAgLmlzSW50ZWdlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSAmJgogICAgICAgICAgICAgIHJpZ2h0CiAgICAgICAgICAgICAgICAgIC5pc0ludGVnZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICAgICAgcmV0dXJuIGluZm8ubmV3Tm9ybWFsaXplZFJhbmdlKAogICAgICAgICAgICAgICAgaW5mby5pbnRaZXJvLCBkaXZpc29yLnVwcGVyIC0gaW5mby5pbnRPbmUpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGxlZnQuaXNOdW1iZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSAmJgogICAgICAgICAgICAgIHJpZ2h0CiAgICAgICAgICAgICAgICAgIC5pc051bWJlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICAgICAgICByZXR1cm4gaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UoaW5mby5pbnRaZXJvLCBkaXZpc29yLnVwcGVyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpbmZvLm5ld1VuYm91bmRSYW5nZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgUmFuZ2UgdmlzaXRJbnZva2VEeW5hbWljTWV0aG9kKEhJbnZva2VEeW5hbWljTWV0aG9kIGludm9rZSkgewogICAgaWYgKChpbnZva2UuaW5wdXRzLmxlbmd0aCA9PSAzKSAmJiAoaW52b2tlLnNlbGVjdG9yLm5hbWUgPT0gIiUiKSkKICAgICAgcmV0dXJuIGhhbmRsZUludm9rZU1vZHVsbyhpbnZva2UpOwogICAgcmV0dXJuIHN1cGVyLnZpc2l0SW52b2tlRHluYW1pY01ldGhvZChpbnZva2UpOwogIH0KCiAgUmFuZ2UgaGFuZGxlQmluYXJ5T3BlcmF0aW9uKEhCaW5hcnlBcml0aG1ldGljIGluc3RydWN0aW9uKSB7CiAgICBpZiAoaW5zdHJ1Y3Rpb24KICAgICAgICAuaXNJbnRlZ2VyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgLmlzUG90ZW50aWFsbHlGYWxzZSkgewogICAgICByZXR1cm4gaW5mby5uZXdVbmJvdW5kUmFuZ2UoKTsKICAgIH0KICAgIHJldHVybiBpbnN0cnVjdGlvbgogICAgICAgIC5vcGVyYXRpb24oKQogICAgICAgIC5hcHBseShyYW5nZXNbaW5zdHJ1Y3Rpb24ubGVmdF0sIHJhbmdlc1tpbnN0cnVjdGlvbi5yaWdodF0pOwogIH0KCiAgQG92ZXJyaWRlCiAgUmFuZ2UgdmlzaXRBZGQoSEFkZCBhZGQpIHsKICAgIHJldHVybiBoYW5kbGVCaW5hcnlPcGVyYXRpb24oYWRkKTsKICB9CgogIEBvdmVycmlkZQogIFJhbmdlIHZpc2l0U3VidHJhY3QoSFN1YnRyYWN0IHN1YikgewogICAgcmV0dXJuIGhhbmRsZUJpbmFyeU9wZXJhdGlvbihzdWIpOwogIH0KCiAgQG92ZXJyaWRlCiAgUmFuZ2UgdmlzaXRCaXRBbmQoSEJpdEFuZCBub2RlKSB7CiAgICBpZiAobm9kZS5pc0ludGVnZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNQb3RlbnRpYWxseUZhbHNlKSB7CiAgICAgIHJldHVybiBpbmZvLm5ld1VuYm91bmRSYW5nZSgpOwogICAgfQogICAgSEluc3RydWN0aW9uIHJpZ2h0ID0gbm9kZS5yaWdodDsKICAgIEhJbnN0cnVjdGlvbiBsZWZ0ID0gbm9kZS5sZWZ0OwogICAgaWYgKGxlZnQuaXNJbnRlZ2VyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICByaWdodC5pc0ludGVnZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICByZXR1cm4gcmFuZ2VzW2xlZnRdICYgcmFuZ2VzW3JpZ2h0XTsKICAgIH0KCiAgICBSYW5nZSB0cnlDb21wdXRlUmFuZ2UoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICAgIFJhbmdlIHJhbmdlID0gcmFuZ2VzW2luc3RydWN0aW9uXTsKICAgICAgaWYgKHJhbmdlLmlzUG9zaXRpdmUpIHsKICAgICAgICByZXR1cm4gaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UoaW5mby5pbnRaZXJvLCByYW5nZS51cHBlcik7CiAgICAgIH0gZWxzZSBpZiAocmFuZ2UuaXNOZWdhdGl2ZSkgewogICAgICAgIHJldHVybiBpbmZvLm5ld05vcm1hbGl6ZWRSYW5nZShyYW5nZS5sb3dlciwgaW5mby5pbnRaZXJvKTsKICAgICAgfQogICAgICByZXR1cm4gaW5mby5uZXdVbmJvdW5kUmFuZ2UoKTsKICAgIH0KCiAgICBpZiAobGVmdC5pc0ludGVnZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICByZXR1cm4gdHJ5Q29tcHV0ZVJhbmdlKGxlZnQpOwogICAgfSBlbHNlIGlmIChyaWdodAogICAgICAgIC5pc0ludGVnZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICByZXR1cm4gdHJ5Q29tcHV0ZVJhbmdlKHJpZ2h0KTsKICAgIH0KICAgIHJldHVybiBpbmZvLm5ld1VuYm91bmRSYW5nZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgUmFuZ2UgdmlzaXRDaGVjayhIQ2hlY2sgaW5zdHJ1Y3Rpb24pIHsKICAgIGlmIChyYW5nZXNbaW5zdHJ1Y3Rpb24uY2hlY2tlZElucHV0XSA9PSBudWxsKSB7CiAgICAgIHJldHVybiB2aXNpdEluc3RydWN0aW9uKGluc3RydWN0aW9uKTsKICAgIH0KICAgIHJldHVybiByYW5nZXNbaW5zdHJ1Y3Rpb24uY2hlY2tlZElucHV0XTsKICB9CgogIEhJbnN0cnVjdGlvbiBjcmVhdGVSYW5nZUNvbnZlcnNpb24oCiAgICAgIEhJbnN0cnVjdGlvbiBjdXJzb3IsIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgSFJhbmdlQ29udmVyc2lvbiBuZXdJbnN0cnVjdGlvbiA9IG5ldyBIUmFuZ2VDb252ZXJzaW9uKAogICAgICAgIGluc3RydWN0aW9uLCBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmludFR5cGUpOwogICAgY29udmVyc2lvbnMuYWRkKG5ld0luc3RydWN0aW9uKTsKICAgIGN1cnNvci5ibG9jay5hZGRCZWZvcmUoY3Vyc29yLCBuZXdJbnN0cnVjdGlvbik7CiAgICAvLyBVcGRhdGUgdGhlIHVzZXJzIG9mIHRoZSBpbnN0cnVjdGlvbiBkb21pbmF0ZWQgYnkgW2N1cnNvcl0gdG8KICAgIC8vIHVzZSB0aGUgbmV3IGluc3RydWN0aW9uLCB0aGF0IGhhcyBhbiBuYXJyb3dlciByYW5nZS4KICAgIGluc3RydWN0aW9uLnJlcGxhY2VBbGxVc2Vyc0RvbWluYXRlZEJ5KGN1cnNvciwgbmV3SW5zdHJ1Y3Rpb24pOwogICAgcmV0dXJuIG5ld0luc3RydWN0aW9uOwogIH0KCiAgc3RhdGljIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gbmVnYXRlT3BlcmF0aW9uKAogICAgICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbikgewogICAgaWYgKG9wZXJhdGlvbiA9PSBjb25zdCBjb25zdGFudF9zeXN0ZW0uTGVzc09wZXJhdGlvbigpKSB7CiAgICAgIHJldHVybiBjb25zdCBjb25zdGFudF9zeXN0ZW0uR3JlYXRlckVxdWFsT3BlcmF0aW9uKCk7CiAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PSBjb25zdCBjb25zdGFudF9zeXN0ZW0uTGVzc0VxdWFsT3BlcmF0aW9uKCkpIHsKICAgICAgcmV0dXJuIGNvbnN0IGNvbnN0YW50X3N5c3RlbS5HcmVhdGVyT3BlcmF0aW9uKCk7CiAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PSBjb25zdCBjb25zdGFudF9zeXN0ZW0uR3JlYXRlck9wZXJhdGlvbigpKSB7CiAgICAgIHJldHVybiBjb25zdCBjb25zdGFudF9zeXN0ZW0uTGVzc0VxdWFsT3BlcmF0aW9uKCk7CiAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PSBjb25zdCBjb25zdGFudF9zeXN0ZW0uR3JlYXRlckVxdWFsT3BlcmF0aW9uKCkpIHsKICAgICAgcmV0dXJuIGNvbnN0IGNvbnN0YW50X3N5c3RlbS5MZXNzT3BlcmF0aW9uKCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIHN0YXRpYyBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIGZsaXBPcGVyYXRpb24oCiAgICAgIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKSB7CiAgICBpZiAob3BlcmF0aW9uID09IGNvbnN0IGNvbnN0YW50X3N5c3RlbS5MZXNzT3BlcmF0aW9uKCkpIHsKICAgICAgcmV0dXJuIGNvbnN0IGNvbnN0YW50X3N5c3RlbS5HcmVhdGVyT3BlcmF0aW9uKCk7CiAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PSBjb25zdCBjb25zdGFudF9zeXN0ZW0uTGVzc0VxdWFsT3BlcmF0aW9uKCkpIHsKICAgICAgcmV0dXJuIGNvbnN0IGNvbnN0YW50X3N5c3RlbS5HcmVhdGVyRXF1YWxPcGVyYXRpb24oKTsKICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09IGNvbnN0IGNvbnN0YW50X3N5c3RlbS5HcmVhdGVyT3BlcmF0aW9uKCkpIHsKICAgICAgcmV0dXJuIGNvbnN0IGNvbnN0YW50X3N5c3RlbS5MZXNzT3BlcmF0aW9uKCk7CiAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PSBjb25zdCBjb25zdGFudF9zeXN0ZW0uR3JlYXRlckVxdWFsT3BlcmF0aW9uKCkpIHsKICAgICAgcmV0dXJuIGNvbnN0IGNvbnN0YW50X3N5c3RlbS5MZXNzRXF1YWxPcGVyYXRpb24oKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgUmFuZ2UgY29tcHV0ZUNvbnN0cmFpbmVkUmFuZ2UoY29uc3RhbnRfc3lzdGVtLkJpbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24sCiAgICAgIFJhbmdlIGxlZnRSYW5nZSwgUmFuZ2UgcmlnaHRSYW5nZSkgewogICAgUmFuZ2UgcmFuZ2U7CiAgICBpZiAob3BlcmF0aW9uID09IGNvbnN0IGNvbnN0YW50X3N5c3RlbS5MZXNzT3BlcmF0aW9uKCkpIHsKICAgICAgcmFuZ2UgPSBpbmZvLm5ld05vcm1hbGl6ZWRSYW5nZSgKICAgICAgICAgIGNvbnN0IE1pbkludFZhbHVlKCksIHJpZ2h0UmFuZ2UudXBwZXIgLSBpbmZvLmludE9uZSk7CiAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PSBjb25zdCBjb25zdGFudF9zeXN0ZW0uTGVzc0VxdWFsT3BlcmF0aW9uKCkpIHsKICAgICAgcmFuZ2UgPSBpbmZvLm5ld05vcm1hbGl6ZWRSYW5nZShjb25zdCBNaW5JbnRWYWx1ZSgpLCByaWdodFJhbmdlLnVwcGVyKTsKICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09IGNvbnN0IGNvbnN0YW50X3N5c3RlbS5HcmVhdGVyT3BlcmF0aW9uKCkpIHsKICAgICAgcmFuZ2UgPSBpbmZvLm5ld05vcm1hbGl6ZWRSYW5nZSgKICAgICAgICAgIHJpZ2h0UmFuZ2UubG93ZXIgKyBpbmZvLmludE9uZSwgY29uc3QgTWF4SW50VmFsdWUoKSk7CiAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PSBjb25zdCBjb25zdGFudF9zeXN0ZW0uR3JlYXRlckVxdWFsT3BlcmF0aW9uKCkpIHsKICAgICAgcmFuZ2UgPSBpbmZvLm5ld05vcm1hbGl6ZWRSYW5nZShyaWdodFJhbmdlLmxvd2VyLCBjb25zdCBNYXhJbnRWYWx1ZSgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJhbmdlID0gaW5mby5uZXdVbmJvdW5kUmFuZ2UoKTsKICAgIH0KICAgIHJldHVybiByYW5nZS5pbnRlcnNlY3Rpb24obGVmdFJhbmdlKTsKICB9CgogIEBvdmVycmlkZQogIFJhbmdlIHZpc2l0Q29uZGl0aW9uYWxCcmFuY2goSENvbmRpdGlvbmFsQnJhbmNoIGJyYW5jaCkgewogICAgZHluYW1pYyBjb25kaXRpb24gPSBicmFuY2guY29uZGl0aW9uOwogICAgLy8gVE9ETyhuZ2VvZmZyYXkpOiBIYW5kbGUgY29tcGxleCBjb25kaXRpb25zLgogICAgaWYgKGNvbmRpdGlvbiBpcyEgSFJlbGF0aW9uYWwpIHJldHVybiBpbmZvLm5ld1VuYm91bmRSYW5nZSgpOwogICAgaWYgKGNvbmRpdGlvbiBpcyBISWRlbnRpdHkpIHJldHVybiBpbmZvLm5ld1VuYm91bmRSYW5nZSgpOwogICAgSEluc3RydWN0aW9uIHJpZ2h0ID0gY29uZGl0aW9uLnJpZ2h0OwogICAgSEluc3RydWN0aW9uIGxlZnQgPSBjb25kaXRpb24ubGVmdDsKICAgIGlmIChsZWZ0LmlzSW50ZWdlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc1BvdGVudGlhbGx5RmFsc2UpIHsKICAgICAgcmV0dXJuIGluZm8ubmV3VW5ib3VuZFJhbmdlKCk7CiAgICB9CiAgICBpZiAocmlnaHQuaXNJbnRlZ2VyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzUG90ZW50aWFsbHlGYWxzZSkgewogICAgICByZXR1cm4gaW5mby5uZXdVbmJvdW5kUmFuZ2UoKTsKICAgIH0KCiAgICBSYW5nZSByaWdodFJhbmdlID0gcmFuZ2VzW3JpZ2h0XTsKICAgIFJhbmdlIGxlZnRSYW5nZSA9IHJhbmdlc1tsZWZ0XTsKICAgIGNvbnN0YW50X3N5c3RlbS5PcGVyYXRpb24gb3BlcmF0aW9uID0gY29uZGl0aW9uLm9wZXJhdGlvbigpOwogICAgY29uc3RhbnRfc3lzdGVtLk9wZXJhdGlvbiBtaXJyb3JPcCA9IGZsaXBPcGVyYXRpb24ob3BlcmF0aW9uKTsKICAgIC8vIE9ubHkgdXBkYXRlIHRoZSB0cnVlIGJyYW5jaCBpZiB0aGlzIGJsb2NrIGlzIHRoZSBvbmx5CiAgICAvLyBwcmVkZWNlc3Nvci4KICAgIGlmIChicmFuY2gudHJ1ZUJyYW5jaC5wcmVkZWNlc3NvcnMubGVuZ3RoID09IDEpIHsKICAgICAgYXNzZXJ0KGJyYW5jaC50cnVlQnJhbmNoLnByZWRlY2Vzc29yc1swXSA9PSBicmFuY2guYmxvY2spOwogICAgICAvLyBVcGRhdGUgdGhlIHRydWUgYnJhbmNoIHRvIHVzZSBuYXJyb3dlciByYW5nZXMgZm9yIFtsZWZ0XSBhbmQKICAgICAgLy8gW3JpZ2h0XS4KICAgICAgUmFuZ2UgcmFuZ2UgPSBjb21wdXRlQ29uc3RyYWluZWRSYW5nZShvcGVyYXRpb24sIGxlZnRSYW5nZSwgcmlnaHRSYW5nZSk7CiAgICAgIGlmIChsZWZ0UmFuZ2UgIT0gcmFuZ2UpIHsKICAgICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPQogICAgICAgICAgICBjcmVhdGVSYW5nZUNvbnZlcnNpb24oYnJhbmNoLnRydWVCcmFuY2guZmlyc3QsIGxlZnQpOwogICAgICAgIHJhbmdlc1tpbnN0cnVjdGlvbl0gPSByYW5nZTsKICAgICAgfQoKICAgICAgcmFuZ2UgPSBjb21wdXRlQ29uc3RyYWluZWRSYW5nZShtaXJyb3JPcCwgcmlnaHRSYW5nZSwgbGVmdFJhbmdlKTsKICAgICAgaWYgKHJpZ2h0UmFuZ2UgIT0gcmFuZ2UpIHsKICAgICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPQogICAgICAgICAgICBjcmVhdGVSYW5nZUNvbnZlcnNpb24oYnJhbmNoLnRydWVCcmFuY2guZmlyc3QsIHJpZ2h0KTsKICAgICAgICByYW5nZXNbaW5zdHJ1Y3Rpb25dID0gcmFuZ2U7CiAgICAgIH0KICAgIH0KCiAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgZmFsc2UgYnJhbmNoIGlmIHRoaXMgYmxvY2sgaXMgdGhlIG9ubHkKICAgIC8vIHByZWRlY2Vzc29yLgogICAgaWYgKGJyYW5jaC5mYWxzZUJyYW5jaC5wcmVkZWNlc3NvcnMubGVuZ3RoID09IDEpIHsKICAgICAgYXNzZXJ0KGJyYW5jaC5mYWxzZUJyYW5jaC5wcmVkZWNlc3NvcnNbMF0gPT0gYnJhbmNoLmJsb2NrKTsKICAgICAgY29uc3RhbnRfc3lzdGVtLk9wZXJhdGlvbiByZXZlcnNlID0gbmVnYXRlT3BlcmF0aW9uKG9wZXJhdGlvbik7CiAgICAgIGNvbnN0YW50X3N5c3RlbS5PcGVyYXRpb24gcmV2ZXJzZWRNaXJyb3IgPSBmbGlwT3BlcmF0aW9uKHJldmVyc2UpOwogICAgICAvLyBVcGRhdGUgdGhlIGZhbHNlIGJyYW5jaCB0byB1c2UgbmFycm93ZXIgcmFuZ2VzIGZvciBbbGVmdF0gYW5kCiAgICAgIC8vIFtyaWdodF0uCiAgICAgIFJhbmdlIHJhbmdlID0gY29tcHV0ZUNvbnN0cmFpbmVkUmFuZ2UocmV2ZXJzZSwgbGVmdFJhbmdlLCByaWdodFJhbmdlKTsKICAgICAgaWYgKGxlZnRSYW5nZSAhPSByYW5nZSkgewogICAgICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9CiAgICAgICAgICAgIGNyZWF0ZVJhbmdlQ29udmVyc2lvbihicmFuY2guZmFsc2VCcmFuY2guZmlyc3QsIGxlZnQpOwogICAgICAgIHJhbmdlc1tpbnN0cnVjdGlvbl0gPSByYW5nZTsKICAgICAgfQoKICAgICAgcmFuZ2UgPSBjb21wdXRlQ29uc3RyYWluZWRSYW5nZShyZXZlcnNlZE1pcnJvciwgcmlnaHRSYW5nZSwgbGVmdFJhbmdlKTsKICAgICAgaWYgKHJpZ2h0UmFuZ2UgIT0gcmFuZ2UpIHsKICAgICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPQogICAgICAgICAgICBjcmVhdGVSYW5nZUNvbnZlcnNpb24oYnJhbmNoLmZhbHNlQnJhbmNoLmZpcnN0LCByaWdodCk7CiAgICAgICAgcmFuZ2VzW2luc3RydWN0aW9uXSA9IHJhbmdlOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGluZm8ubmV3VW5ib3VuZFJhbmdlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBSYW5nZSB2aXNpdFJhbmdlQ29udmVyc2lvbihIUmFuZ2VDb252ZXJzaW9uIGNvbnZlcnNpb24pIHsKICAgIHJldHVybiByYW5nZXNbY29udmVyc2lvbl07CiAgfQp9CgovLy8gVHJpZXMgdG8gZmluZCBhIHJhbmdlIGZvciB0aGUgdXBkYXRlIGluc3RydWN0aW9uIG9mIGEgbG9vcCBwaGkuCmNsYXNzIExvb3BVcGRhdGVSZWNvZ25pemVyIGV4dGVuZHMgSEJhc2VWaXNpdG9yIHsKICBmaW5hbCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQ7CiAgZmluYWwgTWFwPEhJbnN0cnVjdGlvbiwgUmFuZ2U+IHJhbmdlczsKICBmaW5hbCBWYWx1ZVJhbmdlSW5mbyBpbmZvOwogIExvb3BVcGRhdGVSZWNvZ25pemVyKHRoaXMuY2xvc2VkV29ybGQsIHRoaXMucmFuZ2VzLCB0aGlzLmluZm8pOwoKICBSYW5nZSBydW4oSFBoaSBsb29wUGhpKSB7CiAgICAvLyBDcmVhdGUgYSBtYXJrZXIgcmFuZ2UgZm9yIHRoZSBsb29wIHBoaSwgc28gdGhhdCBpZiB0aGUgdXBkYXRlCiAgICAvLyB1c2VzIHRoZSBsb29wIHBoaSwgaXQgaGFzIGEgcmFuZ2UgdG8gdXNlLgogICAgcmFuZ2VzW2xvb3BQaGldID0gaW5mby5uZXdNYXJrZXJSYW5nZSgpOwogICAgUmFuZ2UgdXBkYXRlUmFuZ2UgPSB2aXNpdChsb29wUGhpLmlucHV0c1sxXSk7CiAgICByYW5nZXNbbG9vcFBoaV0gPSBudWxsOwogICAgaWYgKHVwZGF0ZVJhbmdlID09IG51bGwpIHJldHVybiBudWxsOwogICAgUmFuZ2Ugc3RhcnRSYW5nZSA9IHJhbmdlc1tsb29wUGhpLmlucHV0c1swXV07CiAgICAvLyBJZiB0aGUgbG93ZXIgKHJlc3BlY3RpdmVseSB1cHBlcikgdmFsdWUgaXMgdGhlIG1hcmtlciwgd2Uga25vdwogICAgLy8gdGhlIGxvb3AgZG9lcyBub3QgY2hhbmdlIGl0LCBzbyB3ZSBjYW4ganVzdCB1c2UgdGhlCiAgICAvLyBbc3RhcnRSYW5nZV0ncyBsb3dlciAodXBwZXIpIHZhbHVlLiBPdGhlcndpc2UgdGhlIGxvd2VyICh1cHBlcikgdmFsdWUKICAgIC8vIGlzIHRoZSBtaW5pbXVtIG9mIHRoZSBbc3RhcnRSYW5nZV0ncyBsb3dlciAodXBwZXIpIGFuZCB0aGUKICAgIC8vIFt1cGRhdGVSYW5nZV0ncyBsb3dlciAodXBwZXIpLgogICAgVmFsdWUgbG93ID0gdXBkYXRlUmFuZ2UubG93ZXIgaXMgTWFya2VyVmFsdWUKICAgICAgICA/IHN0YXJ0UmFuZ2UubG93ZXIKICAgICAgICA6IHVwZGF0ZVJhbmdlLmxvd2VyLm1pbihzdGFydFJhbmdlLmxvd2VyKTsKICAgIFZhbHVlIHVwID0gdXBkYXRlUmFuZ2UudXBwZXIgaXMgTWFya2VyVmFsdWUKICAgICAgICA/IHN0YXJ0UmFuZ2UudXBwZXIKICAgICAgICA6IHVwZGF0ZVJhbmdlLnVwcGVyLm1heChzdGFydFJhbmdlLnVwcGVyKTsKICAgIHJldHVybiBpbmZvLm5ld05vcm1hbGl6ZWRSYW5nZShsb3csIHVwKTsKICB9CgogIFJhbmdlIHZpc2l0KEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgaWYgKGluc3RydWN0aW9uCiAgICAgICAgLmlzSW50ZWdlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgIC5pc1BvdGVudGlhbGx5RmFsc2UpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAocmFuZ2VzW2luc3RydWN0aW9uXSAhPSBudWxsKSByZXR1cm4gcmFuZ2VzW2luc3RydWN0aW9uXTsKICAgIHJldHVybiBpbnN0cnVjdGlvbi5hY2NlcHQodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBSYW5nZSB2aXNpdFBoaShIUGhpIHBoaSkgewogICAgLy8gSWYgdGhlIHVwZGF0ZSBvZiBhIGxvb3AgcGhpIGludm9sdmVzIGFub3RoZXIgbG9vcCBwaGksIHdlIGdpdmUKICAgIC8vIHVwLgogICAgaWYgKHBoaS5ibG9jay5pc0xvb3BIZWFkZXIoKSkgcmV0dXJuIG51bGw7CiAgICBSYW5nZSBwaGlSYW5nZTsKICAgIGZvciAoSEluc3RydWN0aW9uIGlucHV0IGluIHBoaS5pbnB1dHMpIHsKICAgICAgUmFuZ2UgaW5wdXRSYW5nZSA9IHZpc2l0KGlucHV0KTsKICAgICAgaWYgKGlucHV0UmFuZ2UgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIGlmIChwaGlSYW5nZSA9PSBudWxsKSB7CiAgICAgICAgcGhpUmFuZ2UgPSBpbnB1dFJhbmdlOwogICAgICB9IGVsc2UgewogICAgICAgIHBoaVJhbmdlID0gcGhpUmFuZ2UudW5pb24oaW5wdXRSYW5nZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwaGlSYW5nZTsKICB9CgogIEBvdmVycmlkZQogIFJhbmdlIHZpc2l0Q2hlY2soSENoZWNrIGluc3RydWN0aW9uKSB7CiAgICByZXR1cm4gdmlzaXQoaW5zdHJ1Y3Rpb24uY2hlY2tlZElucHV0KTsKICB9CgogIEBvdmVycmlkZQogIFJhbmdlIHZpc2l0QWRkKEhBZGQgb3BlcmF0aW9uKSB7CiAgICByZXR1cm4gaGFuZGxlQmluYXJ5T3BlcmF0aW9uKG9wZXJhdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBSYW5nZSB2aXNpdFN1YnRyYWN0KEhTdWJ0cmFjdCBvcGVyYXRpb24pIHsKICAgIHJldHVybiBoYW5kbGVCaW5hcnlPcGVyYXRpb24ob3BlcmF0aW9uKTsKICB9CgogIFJhbmdlIGhhbmRsZUJpbmFyeU9wZXJhdGlvbihIQmluYXJ5QXJpdGhtZXRpYyBpbnN0cnVjdGlvbikgewogICAgUmFuZ2UgbGVmdFJhbmdlID0gdmlzaXQoaW5zdHJ1Y3Rpb24ubGVmdCk7CiAgICBSYW5nZSByaWdodFJhbmdlID0gdmlzaXQoaW5zdHJ1Y3Rpb24ucmlnaHQpOwogICAgaWYgKGxlZnRSYW5nZSA9PSBudWxsIHx8IHJpZ2h0UmFuZ2UgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9IGluc3RydWN0aW9u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ZXQoKSA6IHRhYmxlID0gbmV3IExpc3Q8SEluc3RydWN0aW9uPig4KTsKCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBzaXplID09IDA7CiAgaW50IGdldCBsZW5ndGggPT4gc2l6ZTsKCiAgdm9pZCBhZGQoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBhc3NlcnQobG9va3VwKGluc3RydWN0aW9uKSA9PSBudWxsKTsKICAgIGludCBoYXNoQ29kZSA9IGluc3RydWN0aW9uLmd2bkhhc2hDb2RlKCk7CiAgICBpbnQgY2FwYWNpdHkgPSB0YWJsZS5sZW5ndGg7CiAgICAvLyBSZXNpemUgd2hlbiBoYWxmIG9mIHRoZSBoYXNoIHRhYmxlIGlzIGluIHVzZS4KICAgIGlmIChzaXplID49IGNhcGFjaXR5ID4+IDEpIHsKICAgICAgY2FwYWNpdHkgPSBjYXBhY2l0eSA8PCAxOwogICAgICByZXNpemUoY2FwYWNpdHkpOwogICAgfQogICAgLy8gVHJ5IHRvIGluc2VydCBpbiB0aGUgaGFzaCB0YWJsZSBmaXJzdC4KICAgIGludCBpbmRleCA9IGhhc2hDb2RlICUgY2FwYWNpdHk7CiAgICBpZiAodGFibGVbaW5kZXhdID09IG51bGwpIHsKICAgICAgdGFibGVbaW5kZXhdID0gaW5zdHJ1Y3Rpb247CiAgICB9IGVsc2UgewogICAgICBjb2xsaXNpb25zID0gbmV3IFZhbHVlU2V0Tm9kZShpbnN0cnVjdGlvbiwgaGFzaENvZGUsIGNvbGxpc2lvbnMpOwogICAgfQogICAgc2l6ZSsrOwogIH0KCiAgSEluc3RydWN0aW9uIGxvb2t1cChISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGludCBoYXNoQ29kZSA9IGluc3RydWN0aW9uLmd2bkhhc2hDb2RlKCk7CiAgICBpbnQgaW5kZXggPSBoYXNoQ29kZSAlIHRhYmxlLmxlbmd0aDsKICAgIC8vIExvb2sgaW4gdGhlIGhhc2ggdGFibGUuCiAgICBISW5zdHJ1Y3Rpb24gcHJvYmUgPSB0YWJsZVtpbmRleF07CiAgICBpZiAocHJvYmUgIT0gbnVsbCAmJiBwcm9iZS5ndm5FcXVhbHMoaW5zdHJ1Y3Rpb24pKSByZXR1cm4gcHJvYmU7CiAgICAvLyBMb29rIGluIHRoZSBjb2xsaXNpb25zIGxpc3QuCiAgICBmb3IgKFZhbHVlU2V0Tm9kZSBub2RlID0gY29sbGlzaW9uczsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5uZXh0KSB7CiAgICAgIGlmIChub2RlLmhhc2hDb2RlID09IGhhc2hDb2RlKSB7CiAgICAgICAgSEluc3RydWN0aW9uIGNhY2hlZCA9IG5vZGUudmFsdWU7CiAgICAgICAgaWYgKGNhY2hlZC5ndm5FcXVhbHMoaW5zdHJ1Y3Rpb24pKSByZXR1cm4gY2FjaGVkOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQga2lsbChpbnQgZmxhZ3MpIHsKICAgIGlmIChmbGFncyA9PSAwKSByZXR1cm47CiAgICBpbnQgZGVwZW5kcyA9IFNpZGVFZmZlY3RzLmNvbXB1dGVEZXBlbmRzT25GbGFncyhmbGFncyk7CiAgICAvLyBLaWxsIGluIHRoZSBoYXNoIHRhYmxlLgogICAgZm9yIChpbnQgaW5kZXggPSAwLCBsZW5ndGggPSB0YWJsZS5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IHRhYmxlW2luZGV4XTsKICAgICAgaWYgKGluc3RydWN0aW9uICE9IG51bGwgJiYgaW5zdHJ1Y3Rpb24uc2lkZUVmZmVjdHMuZGVwZW5kc09uKGRlcGVuZHMpKSB7CiAgICAgICAgdGFibGVbaW5kZXhdID0gbnVsbDsKICAgICAgICBzaXplLS07CiAgICAgIH0KICAgIH0KICAgIC8vIEtpbGwgaW4gdGhlIGNvbGxpc2lvbnMgbGlzdC4KICAgIFZhbHVlU2V0Tm9kZSBwcmV2aW91cyA9IG51bGw7CiAgICBWYWx1ZVNldE5vZGUgY3VycmVudCA9IGNvbGxpc2lvbnM7CiAgICB3aGlsZSAoY3VycmVudCAhPSBudWxsKSB7CiAgICAgIFZhbHVlU2V0Tm9kZSBuZXh0ID0gY3VycmVudC5uZXh0OwogICAgICBISW5zdHJ1Y3Rpb24gY2FjaGVkID0gY3VycmVudC52YWx1ZTsKICAgICAgaWYgKGNhY2hlZC5zaWRlRWZmZWN0cy5kZXBlbmRzT24oZGVwZW5kcykpIHsKICAgICAgICBpZiAocHJldmlvdXMgPT0gbnVsbCkgewogICAgICAgICAgY29sbGlzaW9ucyA9IG5leHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0OwogICAgICAgIH0KICAgICAgICBzaXplLS07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHJldmlvdXMgPSBjdXJyZW50OwogICAgICB9CiAgICAgIGN1cnJlbnQgPSBuZXh0OwogICAgfQogIH0KCiAgVmFsdWVTZXQgY29weSgpIHsKICAgIHJldHVybiBjb3B5VG8obmV3IFZhbHVlU2V0KCksIHRhYmxlLCBjb2xsaXNpb25zKTsKICB9CgogIExpc3Q8SEluc3RydWN0aW9uPiB0b0xpc3QoKSB7CiAgICByZXR1cm4gY29weVRvKDxISW5zdHJ1Y3Rpb24+W10sIHRhYmxlLCBjb2xsaXNpb25zKTsKICB9CgogIC8vIENvcHkgdGhlIGluc3RydWN0aW9ucyBpbiB2YWx1ZSBzZXQgZGVmaW5lZCBieSBbdGFibGVdIGFuZAogIC8vIFtjb2xsaXNpb25zXSBpbnRvIFtvdGhlcl0gYW5kIHJldHVybnMgW290aGVyXS4gVGhlIGNvcHkgaXMgZG9uZQogIC8vIGJ5IGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBoYXNoIHRhYmxlIGFuZCB0aGUgY29sbGlzaW9ucyBsaXN0IGFuZAogIC8vIGNhbGxpbmcgWzpvdGhlci5hZGQ6XS4KICBzdGF0aWMgY29weVRvKHZhciBvdGhlciwgTGlzdDxISW5zdHJ1Y3Rpb24+IHRhYmxlLCBWYWx1ZVNldE5vZGUgY29sbGlzaW9ucykgewogICAgLy8gQ29weSBlbGVtZW50cyBmcm9tIHRoZSBoYXNoIHRhYmxlLgogICAgZm9yIChpbnQgaW5kZXggPSAwLCBsZW5ndGggPSB0YWJsZS5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IHRhYmxlW2luZGV4XTsKICAgICAgaWYgKGluc3RydWN0aW9uICE9IG51bGwpIG90aGVyLmFkZChpbnN0cnVjdGlvbik7CiAgICB9CiAgICAvLyBDb3B5IGVsZW1lbnRzIGZyb20gdGhlIGNvbGxpc2lvbiBsaXN0LgogICAgVmFsdWVTZXROb2RlIGN1cnJlbnQgPSBjb2xsaXNpb25zOwogICAgd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkgewogICAgICAvLyBUT0RPKGthc3BlcmwpOiBNYXliZSBmaW5kIGEgd2F5IG9mIHJldXNpbmcgdGhlIGhhc2ggY29kZQogICAgICAvLyByYXRoZXIgdGhhbiByZWNvbXB1dGluZyBpdCBldmVyeSB0aW1lLgogICAgICBvdGhlci5hZGQoY3VycmVudC52YWx1ZSk7CiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7CiAgICB9CiAgICByZXR1cm4gb3RoZXI7CiAgfQoKICBWYWx1ZVNldCBpbnRlcnNlY3Rpb24oVmFsdWVTZXQgb3RoZXIpIHsKICAgIGlmIChzaXplID4gb3RoZXIuc2l6ZSkgcmV0dXJuIG90aGVyLmludGVyc2VjdGlvbih0aGlzKTsKICAgIFZhbHVlU2V0IHJlc3VsdCA9IG5ldyBWYWx1ZVNldCgpOwogICAgLy8gTG9vayBpbiB0aGUgaGFzaCB0YWJsZS4KICAgIGZvciAoaW50IGluZGV4ID0gMCwgbGVuZ3RoID0gdGFibGUubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgewogICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSB0YWJsZVtpbmRleF07CiAgICAgIGlmIChpbnN0cnVjdGlvbiAhPSBudWxsICYmIG90aGVyLmxvb2t1cChpbnN0cnVjdGlvbikgIT0gbnVsbCkgewogICAgICAgIHJlc3VsdC5hZGQoaW5zdHJ1Y3Rpb24pOwogICAgICB9CiAgICB9CiAgICAvLyBMb29rIGluIHRoZSBjb2xsaXNpb24gbGlzdC4KICAgIFZhbHVlU2V0Tm9kZSBjdXJyZW50ID0gY29sbGlzaW9uczsKICAgIHdoaWxlIChjdXJyZW50ICE9IG51bGwpIHsKICAgICAgSEluc3RydWN0aW9uIHZhbHVlID0gY3VycmVudC52YWx1ZTsKICAgICAgaWYgKG90aGVyLmxvb2t1cCh2YWx1ZSkgIT0gbnVsbCkgewogICAgICAgIHJlc3VsdC5hZGQodmFsdWUpOwogICAgICB9CiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCByZXNpemUoaW50IGNhcGFjaXR5KSB7CiAgICB2YXIgb2xkU2l6ZSA9IHNpemU7CiAgICB2YXIgb2xkVGFibGUgPSB0YWJsZTsKICAgIHZhciBvbGRDb2xsaXNpb25zID0gY29sbGlzaW9uczsKICAgIC8vIFJlc2V0IHRoZSB0YWJsZSB3aXRoIGEgYmlnZ2VyIGNhcGFjaXR5LgogICAgYXNzZXJ0KGNhcGFjaXR5ID4gdGFibGUubGVuZ3RoKTsKICAgIHNpemUgPSAwOwogICAgdGFibGUgPSBuZXcgTGlzdDxISW5zdHJ1Y3Rpb24+KGNhcGFjaXR5KTsKICAgIGNvbGxpc2lvbnMgPSBudWxsOwogICAgLy8gQWRkIHRoZSBvbGQgaW5zdHJ1Y3Rpb25zIHRvIHRoZSBuZXcgdGFibGUuCiAgICBjb3B5VG8odGhpcywgb2xkVGFibGUsIG9sZENvbGxpc2lvbnMpOwogICAgLy8gTWFrZSBzdXJlIHdlIHByZXNlcnZlZCBhbGwgZWxlbWVudHMgYW5kIHRoYXQgbm8gcmVzaXppbmcKICAgIC8vIGhhcHBlbmVkIGFzIHBhcnQgb2YgdGhpcyByZXNpemluZy4KICAgIGFzc2VydChzaXplID09IG9sZFNpemUpOwogICAgYXNzZXJ0KHRhYmxlLmxlbmd0aCA9PSBjYXBhY2l0eSk7CiAgfQp9CgpjbGFzcyBWYWx1ZVNldE5vZGUgewogIGZpbmFsIEhJbnN0cnVjdGlvbiB2YWx1ZTsKICBmaW5hbCBpbnQgaGFzaDsKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IGhhc2g7CiAgVmFsdWVTZXROb2RlIG5leHQ7CiAgVmFsdWVTZXROb2RlKHRoaXMudmFsdWUsIHRoaXMuaGFzaCwgdGhpcy5uZXh0KTsKfQqAoQBOTjwBORUBERAcGzIBIRoBJykuITUhIBgGLiUgIg1IBgwEATIuKR8nRSRLJyo6CAYRBAEZHDwfSi9PHRAIBiQiJx4oKzMgHREgChAPHAgWBgQBFDYEASA4BAE/RUUcUCpKLzcGLiceQjAgHgYSBAEqPCYfSi9GIQgGIyceKikbCB4GEwQBHhgaJC8lDi4XMitAKh0mBAIBFRwSDBwVMgIBJ3BhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS92YWx1ZV9zZXQuZGFydDtzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY29sbGVjdGlvbi9saWIvc3JjL2FsZ29yaXRobXMuZGFydKYfLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAiZGFydDptYXRoIiBhcyBtYXRoOwoKaW1wb3J0ICJ1dGlscy5kYXJ0IjsKCi8vLyBSZXR1cm5zIGEgcG9zaXRpb24gb2YgdGhlIFt2YWx1ZV0gaW4gW3NvcnRlZExpc3RdLCBpZiBpdCBpcyB0aGVyZS4KLy8vCi8vLyBJZiB0aGUgbGlzdCBpc24ndCBzb3J0ZWQgYWNjb3JkaW5nIHRvIHRoZSBbY29tcGFyZV0gZnVuY3Rpb24sIHRoZSByZXN1bHQKLy8vIGlzIHVucHJlZGljdGFibGUuCi8vLwovLy8gSWYgW2NvbXBhcmVdIGlzIG9taXR0ZWQsIHRoaXMgZGVmYXVsdHMgdG8gY2FsbGluZyBbQ29tcGFyYWJsZS5jb21wYXJlVG9dIG9uCi8vLyB0aGUgb2JqZWN0cy4gSWYgYW55IG9iamVjdCBpcyBub3QgW0NvbXBhcmFibGVdLCB0aGlzIHRocm93cyBhIFtDYXN0RXJyb3JdLgovLy8KLy8vIFJldHVybnMgLTEgaWYgW3ZhbHVlXSBpcyBub3QgaW4gdGhlIGxpc3QgYnkgZGVmYXVsdC4KaW50IGJpbmFyeVNlYXJjaDxUPihMaXN0PFQ+IHNvcnRlZExpc3QsIFQgdmFsdWUsIHtpbnQgY29tcGFyZShUIGEsIFQgYil9KSB7CiAgY29tcGFyZSA/Pz0gZGVmYXVsdENvbXBhcmU8VD4oKTsKICBpbnQgbWluID0gMDsKICBpbnQgbWF4ID0gc29ydGVkTGlzdC5sZW5ndGg7CiAgd2hpbGUgKG1pbiA8IG1heCkgewogICAgaW50IG1pZCA9IG1pbiArICgobWF4IC0gbWluKSA+PiAxKTsKICAgIHZhciBlbGVtZW50ID0gc29ydGVkTGlzdFttaWRdOwogICAgaW50IGNvbXAgPSBjb21wYXJlKGVsZW1lbnQsIHZhbHVlKTsKICAgIGlmIChjb21wID09IDApIHJldHVybiBtaWQ7CiAgICBpZiAoY29tcCA8IDApIHsKICAgICAgbWluID0gbWlkICsgMTsKICAgIH0gZWxzZSB7CiAgICAgIG1heCA9IG1pZDsKICAgIH0KICB9CiAgcmV0dXJuIC0xOwp9CgovLy8gUmV0dXJucyB0aGUgZmlyc3QgcG9zaXRpb24gaW4gW3NvcnRlZExpc3RdIHRoYXQgZG9lcyBub3QgY29tcGFyZSBsZXNzIHRoYW4KLy8vIFt2YWx1ZV0uCi8vLwovLy8gSWYgdGhlIGxpc3QgaXNuJ3Qgc29ydGVkIGFjY29yZGluZyB0byB0aGUgW2NvbXBhcmVdIGZ1bmN0aW9uLCB0aGUgcmVzdWx0Ci8vLyBpcyB1bnByZWRpY3RhYmxlLgovLy8KLy8vIElmIFtjb21wYXJlXSBpcyBvbWl0dGVkLCB0aGlzIGRlZmF1bHRzIHRvIGNhbGxpbmcgW0NvbXBhcmFibGUuY29tcGFyZVRvXSBvbgovLy8gdGhlIG9iamVjdHMuIElmIGFueSBvYmplY3QgaXMgbm90IFtDb21wYXJhYmxlXSwgdGhpcyB0aHJvd3MgYSBbQ2FzdEVycm9yXS4KLy8vCi8vLyBSZXR1cm5zIFtzb3J0ZWRMaXN0Lmxlbmd0aF0gaWYgYWxsIHRoZSBpdGVtcyBpbiBbc29ydGVkTGlzdF0gY29tcGFyZSBsZXNzCi8vLyB0aGFuIFt2YWx1ZV0uCmludCBsb3dlckJvdW5kPFQ+KExpc3Q8VD4gc29ydGVkTGlzdCwgVCB2YWx1ZSwge2ludCBjb21wYXJlKFQgYSwgVCBiKX0pIHsKICBjb21wYXJlID8/PSBkZWZhdWx0Q29tcGFyZTxUPigpOwogIGludCBtaW4gPSAwOwogIGludCBtYXggPSBzb3J0ZWRMaXN0Lmxlbmd0aDsKICB3aGlsZSAobWluIDwgbWF4KSB7CiAgICBpbnQgbWlkID0gbWluICsgKChtYXggLSBtaW4pID4+IDEpOwogICAgdmFyIGVsZW1lbnQgPSBzb3J0ZWRMaXN0W21pZF07CiAgICBpbnQgY29tcCA9IGNvbXBhcmUoZWxlbWVudCwgdmFsdWUpOwogICAgaWYgKGNvbXAgPCAwKSB7CiAgICAgIG1pbiA9IG1pZCArIDE7CiAgICB9IGVsc2UgewogICAgICBtYXggPSBtaWQ7CiAgICB9CiAgfQogIHJldHVybiBtaW47Cn0KCi8vLyBTaHVmZmxlcyBhIGxpc3QgcmFuZG9tbHkuCi8vLwovLy8gQSBzdWItcmFuZ2Ugb2YgYSBsaXN0IGNhbiBiZSBzaHVmZmxlZCBieSBwcm92aWRpbmcgW3N0YXJ0XSBhbmQgW2VuZF0uCnZvaWQgc2h1ZmZsZShMaXN0IGxpc3QsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogIHZhciByYW5kb20gPSBuZXcgbWF0aC5SYW5kb20oKTsKICBpZiAoZW5kID09IG51bGwpIGVuZCA9IGxpc3QubGVuZ3RoOwogIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICB3aGlsZSAobGVuZ3RoID4gMSkgewogICAgaW50IHBvcyA9IHJhbmRvbS5uZXh0SW50KGxlbmd0aCk7CiAgICBsZW5ndGgtLTsKICAgIHZhciB0bXAxID0gbGlzdFtzdGFydCArIHBvc107CiAgICBsaXN0W3N0YXJ0ICsgcG9zXSA9IGxpc3Rbc3RhcnQgKyBsZW5ndGhdOwogICAgbGlzdFtzdGFydCArIGxlbmd0aF0gPSB0bXAxOwogIH0KfQoKLy8vIFJldmVyc2VzIGEgbGlzdCwgb3IgYSBwYXJ0IG9mIGEgbGlzdCwgaW4tcGxhY2UuCnZvaWQgcmV2ZXJzZShMaXN0IGxpc3QsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogIGlmIChlbmQgPT0gbnVsbCkgZW5kID0gbGlzdC5sZW5ndGg7CiAgX3JldmVyc2UobGlzdCwgc3RhcnQsIGVuZCk7Cn0KCi8vLyBJbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb24gdGhhdCBhc3N1bWVzIHZhbGlkIGFyZ3VtZW50cy4Kdm9pZCBfcmV2ZXJzZShMaXN0IGxpc3QsIGludCBzdGFydCwgaW50IGVuZCkgewogIGZvciAoaW50IGkgPSBzdGFydCwgaiA9IGVuZCAtIDE7IGkgPCBqOyBpKyssIGotLSkgewogICAgdmFyIHRtcCA9IGxpc3RbaV07CiAgICBsaXN0W2ldID0gbGlzdFtqXTsKICAgIGxpc3Rbal0gPSB0bXA7CiAgfQp9CgovLy8gU29ydCBhIGxpc3QgYmV0d2VlbiBbc3RhcnRdIChpbmNsdXNpdmUpIGFuZCBbZW5kXSAoZXhjbHVzaXZlKSB1c2luZwovLy8gaW5zZXJ0aW9uIHNvcnQuCi8vLwovLy8gSWYgW2NvbXBhcmVdIGlzIG9taXR0ZWQsIHRoaXMgZGVmYXVsdHMgdG8gY2FsbGluZyBbQ29tcGFyYWJsZS5jb21wYXJlVG9dIG9uCi8vLyB0aGUgb2JqZWN0cy4gSWYgYW55IG9iamVjdCBpcyBub3QgW0NvbXBhcmFibGVdLCB0aGlzIHRocm93cyBhIFtDYXN0RXJyb3JdLgovLy8KLy8vIEluc2VydGlvbiBzb3J0IGlzIGEgc2ltcGxlIHNvcnRpbmcgYWxnb3JpdGhtLiBGb3IgYG5gIGVsZW1lbnRzIGl0IGRvZXMgb24KLy8vIHRoZSBvcmRlciBvZiBgbiAqIGxvZyhuKWAgY29tcGFyaXNvbnMgYnV0IHVwIHRvIGBuYCBzcXVhcmVkIG1vdmVzLiBUaGUKLy8vIHNvcnRpbmcgaXMgcGVyZm9ybWVkIGluLXBsYWNlLCB3aXRob3V0IHVzaW5nIGV4dHJhIG1lbW9yeS4KLy8vCi8vLyBGb3Igc2hvcnQgbGlzdHMgdGhlIG1hbnkgbW92ZXMgaGF2ZSBsZXNzIGltcGFjdCB0aGFuIHRoZSBzaW1wbGUgYWxnb3JpdGhtLAovLy8gYW5kIGl0IGlzIG9mdGVuIHRoZSBmYXZvcmVkIHNvcnRpbmcgYWxnb3JpdGhtIGZvciBzaG9ydCBsaXN0cy4KLy8vCi8vLyBUaGlzIGluc2VydGlvbiBzb3J0IGlzIHN0YWJsZTogRXF1YWwgZWxlbWVudHMgZW5kIHVwIGluIHRoZSBzYW1lIG9yZGVyCi8vLyBhcyB0aGV5IHN0YXJ0ZWQgaW4uCnZvaWQgaW5zZXJ0aW9uU29ydDxUPihMaXN0PFQ+IGxpc3QsCiAgICB7aW50IGNvbXBhcmUoVCBhLCBUIGIpLCBpbnQgc3RhcnQ6IDAsIGludCBlbmR9KSB7CiAgLy8gSWYgdGhlIHNhbWUgbWV0aG9kIGNvdWxkIGhhdmUgYm90aCBwb3NpdGlvbmFsIGFuZCBuYW1lZCBvcHRpb25hbAogIC8vIHBhcmFtZXRlcnMsIHRoaXMgc2hvdWxkIGJlIChsaXN0LCBbc3RhcnQsIGVuZF0sIHtjb21wYXJlfSkuCiAgY29tcGFyZSA/Pz0gZGVmYXVsdENvbXBhcmU8VD4oKTsKICBlbmQgPz89IGxpc3QubGVuZ3RoOwoKICBmb3IgKGludCBwb3MgPSBzdGFydCArIDE7IHBvcyA8IGVuZDsgcG9zKyspIHsKICAgIGludCBtaW4gPSBzdGFydDsKICAgIGludCBtYXggPSBwb3M7CiAgICB2YXIgZWxlbWVudCA9IGxpc3RbcG9zXTsKICAgIHdoaWxlIChtaW4gPCBtYXgpIHsKICAgICAgaW50IG1pZCA9IG1pbiArICgobWF4IC0gbWluKSA+PiAxKTsKICAgICAgaW50IGNvbXBhcmlzb24gPSBjb21wYXJlKGVsZW1lbnQsIGxpc3RbbWlkXSk7CiAgICAgIGlmIChjb21wYXJpc29uIDwgMCkgewogICAgICAgIG1heCA9IG1pZDsKICAgICAgfSBlbHNlIHsKICAgICAgICBtaW4gPSBtaWQgKyAxOwogICAgICB9CiAgICB9CiAgICBsaXN0LnNldFJhbmdlKG1pbiArIDEsIHBvcyArIDEsIGxpc3QsIG1pbik7CiAgICBsaXN0W21pbl0gPSBlbGVtZW50OwogIH0KfQoKLy8vIExpbWl0IGJlbG93IHdoaWNoIG1lcmdlIHNvcnQgZGVmYXVsdHMgdG8gaW5zZXJ0aW9uIHNvcnQuCmNvbnN0IGludCBfTUVSR0VfU09SVF9MSU1JVCA9IDMyOwoKLy8vIFNvcnRzIGEgbGlzdCBiZXR3ZWVuIFtzdGFydF0gKGluY2x1c2l2ZSkgYW5kIFtlbmRdIChleGNsdXNpdmUpIHVzaW5nIHRoZQovLy8gbWVyZ2Ugc29ydCBhbGdvcml0aG0uCi8vLwovLy8gSWYgW2NvbXBhcmVdIGlzIG9taXR0ZWQsIHRoaXMgZGVmYXVsdHMgdG8gY2FsbGluZyBbQ29tcGFyYWJsZS5jb21wYXJlVG9dIG9uCi8vLyB0aGUgb2JqZWN0cy4gSWYgYW55IG9iamVjdCBpcyBub3QgW0NvbXBhcmFibGVdLCB0aGlzIHRocm93cyBhIFtDYXN0RXJyb3JdLgovLy8KLy8vIE1lcmdlLXNvcnRpbmcgd29ya3MgYnkgc3BsaXR0aW5nIHRoZSBqb2IgaW50byB0d28gcGFydHMsIHNvcnRpbmcgZWFjaAovLy8gcmVjdXJzaXZlbHksIGFuZCB0aGVuIG1lcmdpbmcgdGhlIHR3byBzb3J0ZWQgcGFydHMuCi8vLwovLy8gVGhpcyB0YWtlcyBvbiB0aGUgb3JkZXIgb2YgYG4gKiBsb2cobilgIGNvbXBhcmlzb25zIGFuZCBtb3ZlcyB0byBzb3J0Ci8vLyBgbmAgZWxlbWVudHMsIGJ1dCByZXF1aXJlcyBleHRyYSBzcGFjZSBvZiBhYm91dCB0aGUgc2FtZSBzaXplIGFzIHRoZSBsaXN0Ci8vLyBiZWluZyBzb3J0ZWQuCi8vLwovLy8gVGhpcyBtZXJnZSBzb3J0IGlzIHN0YWJsZTogRXF1YWwgZWxlbWVudHMgZW5kIHVwIGluIHRoZSBzYW1lIG9yZGVyCi8vLyBhcyB0aGV5IHN0YXJ0ZWQgaW4uCnZvaWQgbWVyZ2VTb3J0PFQ+KExpc3Q8VD4gbGlzdCwKICAgIHtpbnQgc3RhcnQ6IDAsIGludCBlbmQsIGludCBjb21wYXJlKFQgYSwgVCBiKX0pIHsKICBlbmQgPz89IGxpc3QubGVuZ3RoOwogIGNvbXBhcmUgPz89IGRlZmF1bHRDb21wYXJlPFQ+KCk7CgogIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICBpZiAobGVuZ3RoIDwgMikgcmV0dXJuOwogIGlmIChsZW5ndGggPCBfTUVSR0VfU09SVF9MSU1JVCkgewogICAgaW5zZXJ0aW9uU29ydChsaXN0LCBjb21wYXJlOiBjb21wYXJlLCBzdGFydDogc3RhcnQsIGVuZDogZW5kKTsKICAgIHJldHVybjsKICB9CiAgLy8gU3BlY2lhbCBjYXNlIHRoZSBmaXJzdCBzcGxpdCBpbnN0ZWFkIG9mIGRpcmVjdGx5IGNhbGxpbmcKICAvLyBfbWVyZ2VTb3J0LCBiZWNhdXNlIHRoZSBfbWVyZ2VTb3J0IHJlcXVpcmVzIGl0cyB0YXJnZXQgdG8KICAvLyBiZSBkaWZmZXJlbnQgZnJvbSBpdHMgc291cmNlLCBhbmQgaXQgcmVxdWlyZXMgZXh0cmEgc3BhY2UKICAvLyBvZiB0aGUgc2FtZSBzaXplIGFzIHRoZSBsaXN0IHRvIHNvcnQuCiAgLy8gVGhpcyBzcGxpdCBhbGxvd3MgdXMgdG8gaGF2ZSBvbmx5IGhhbGYgYXMgbXVjaCBleHRyYSBzcGFjZSwKICAvLyBhbmQgaXQgZW5kcyB1cCBpbiB0aGUgb3JpZ2luYWwgcGxhY2UuCiAgaW50IG1pZGRsZSA9IHN0YXJ0ICsgKChlbmQgLSBzdGFydCkgPj4gMSk7CiAgaW50IGZpcnN0TGVuZ3RoID0gbWlkZGxlIC0gc3RhcnQ7CiAgaW50IHNlY29uZExlbmd0aCA9IGVuZCAtIG1pZGRsZTsKICAvLyBzZWNvbmRMZW5ndGggaXMgYWx3YXlzIHRoZSBzYW1lIGFzIGZpcnN0TGVuZ3RoLCBvciBvbmUgZ3JlYXRlci4KICB2YXIgc2NyYXRjaFNwYWNlID0gbmV3IExpc3Q8VD4oc2Vjb25kTGVuZ3RoKTsKICBfbWVyZ2VTb3J0KGxpc3QsIGNvbXBhcmUsIG1pZGRsZSwgZW5kLCBzY3JhdGNoU3BhY2UsIDApOwogIGludCBmaXJzdFRhcmdldCA9IGVuZCAtIGZpcnN0TGVuZ3RoOwogIF9tZXJnZVNvcnQobGlzdCwgY29tcGFyZSwgc3RhcnQsIG1pZGRsZSwgbGlzdCwgZmlyc3RUYXJnZXQpOwogIF9tZXJnZShjb21wYXJlLCBsaXN0LCBmaXJzdFRhcmdldCwgZW5kLCBzY3JhdGNoU3BhY2UsIDAsIHNlY29uZExlbmd0aCwgbGlzdCwKICAgICAgc3RhcnQpOwp9CgovLy8gUGVyZm9ybXMgYW4gaW5zZXJ0aW9uIHNvcnQgaW50byBhIHBvdGVudGlhbGx5IGRpZmZlcmVudCBsaXN0IHRoYW4gdGhlCi8vLyBvbmUgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgdmFsdWVzLgovLy8KLy8vIEl0IHdpbGwgd29yayBpbi1wbGFjZSBhcyB3ZWxsLgp2b2lkIF9tb3ZpbmdJbnNlcnRpb25Tb3J0PFQ+KExpc3Q8VD4gbGlzdCwgaW50IGNvbXBhcmUoVCBhLCBUIGIpLCBpbnQgc3RhcnQsCiAgICBpbnQgZW5kLCBMaXN0PFQ+IHRhcmdldCwgaW50IHRhcmdldE9mZnNldCkgewogIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICBpZiAobGVuZ3RoID09IDApIHJldHVybjsKICB0YXJnZXRbdGFyZ2V0T2Zmc2V0XSA9IGxpc3Rbc3RhcnRdOwogIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgIHZhciBlbGVtZW50ID0gbGlzdFtzdGFydCArIGldOwogICAgaW50IG1pbiA9IHRhcmdldE9mZnNldDsKICAgIGludCBtYXggPSB0YXJnZXRPZmZzZXQgKyBpOwogICAgd2hpbGUgKG1pbiA8IG1heCkgewogICAgICBpbnQgbWlkID0gbWluICsgKChtYXggLSBtaW4pID4+IDEpOwogICAgICBpZiAoY29tcGFyZShlbGVtZW50LCB0YXJnZXRbbWlkXSkgPCAwKSB7CiAgICAgICAgbWF4ID0gbWlkOwogICAgICB9IGVsc2UgewogICAgICAgIG1pbiA9IG1pZCArIDE7CiAgICAgIH0KICAgIH0KICAgIHRhcmdldC5zZXRSYW5nZShtaW4gKyAxLCB0YXJnZXRPZmZzZXQgKyBpICsgMSwgdGFyZ2V0LCBtaW4pOwogICAgdGFyZ2V0W21pbl0gPSBlbGVtZW50OwogIH0KfQoKLy8vIFNvcnRzIFtsaXN0XSBmcm9tIFtzdGFydF0gdG8gW2VuZF0gaW50byBbdGFyZ2V0XSBhdCBbdGFyZ2V0T2Zmc2V0XS4KLy8vCi8vLyBUaGUgYHRhcmdldGAgbGlzdCBtdXN0IGJlIGFibGUgdG8gY29udGFpbiB0aGUgcmFuZ2UgZnJvbSBgc3RhcnRgIHRvIGBlbmRgCi8vLyBhZnRlciBgdGFyZ2V0T2Zmc2V0YC4KLy8vCi8vLyBBbGxvd3MgdGFyZ2V0IHRvIGJlIHRoZSBzYW1lIGxpc3QgYXMgW2xpc3RdLCBhcyBsb25nIGFzIGl0J3Mgbm90Ci8vLyBvdmVybGFwcGluZyB0aGUgYHN0YXJ0Li5lbmRgIHJhbmdlLgp2b2lkIF9tZXJnZVNvcnQ8VD4oTGlzdDxUPiBsaXN0LCBpbnQgY29tcGFyZShUIGEsIFQgYiksIGludCBzdGFydCwgaW50IGVuZCwKICAgIExpc3Q8VD4gdGFyZ2V0LCBpbnQgdGFyZ2V0T2Zmc2V0KSB7CiAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogIGlmIChsZW5ndGggPCBfTUVSR0VfU09SVF9MSU1JVCkgewogICAgX21vdmluZ0luc2VydGlvblNvcnQobGlzdCwgY29tcGFyZSwgc3RhcnQsIGVuZCwgdGFyZ2V0LCB0YXJnZXRPZmZzZXQpOwogICAgcmV0dXJuOwogIH0KICBpbnQgbWlkZGxlID0gc3RhcnQgKyAobGVuZ3RoID4+IDEpOwogIGludCBmaXJzdExlbmd0aCA9IG1pZGRsZSAtIHN0YXJ0OwogIGludCBzZWNvbmRMZW5ndGggPSBlbmQgLSBtaWRkbGU7CiAgLy8gSGVyZSBzZWNvbmRMZW5ndGggPj0gZmlyc3RMZW5ndGggKGRpZmZlcnMgYnkgYXQgbW9zdCBvbmUpLgogIGludCB0YXJnZXRNaWRkbGUgPSB0YXJnZXRPZmZzZXQgKyBmaXJzdExlbmd0aDsKICAvLyBTb3J0IHRoZSBzZWNvbmQgaGFsZiBpbnRvIHRoZSBlbmQgb2YgdGhlIHRhcmdldCBhcmVhLgogIF9tZXJnZVNvcnQobGlzdCwgY29tcGFyZSwgbWlkZGxlLCBlbmQsIHRhcmdldCwgdGFyZ2V0TWlkZGxlKTsKICAvLyBTb3J0IHRoZSBmaXJzdCBoYWxmIGludG8gdGhlIGVuZCBvZiB0aGUgc291cmNlIGFyZWEuCiAgX21lcmdlU29ydChsaXN0LCBjb21wYXJlLCBzdGFydCwgbWlkZGxlLCBsaXN0LCBtaWRkbGUpOwogIC8vIE1lcmdlIHRoZSB0d28gcGFydHMgaW50byB0aGUgdGFyZ2V0IGFyZWEuCiAgX21lcmdlKGNvbXBhcmUsIGxpc3QsIG1pZGRsZSwgbWlkZGxlICsgZmlyc3RMZW5ndGgsIHRhcmdldCwgdGFyZ2V0TWlkZGxlLAogICAgICB0YXJnZXRNaWRkbGUgKyBzZWNvbmRMZW5ndGgsIHRhcmdldCwgdGFyZ2V0T2Zmc2V0KTsKfQoKLy8vIE1lcmdlcyB0d28gbGlzdHMgaW50byBhIHRhcmdldCBsaXN0LgovLy8KLy8vIE9uZSBvZiB0aGUgaW5wdXQgbGlzdHMgbWF5IGJlIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBvZiB0aGUgdGFyZ2V0Ci8vLyBsaXN0LgovLy8KLy8vIEZvciBlcXVhbCBvYmplY3QsIGVsZW1lbnRzIGZyb20gW2ZpcnN0TGlzdF0gYXJlIGFsd2F5cyBwcmVmZXJyZWQuCi8vLyBUaGlzIGFsbG93cyB0aGUgbWVyZ2UgdG8gYmUgc3RhYmxlIGlmIHRoZSBmaXJzdCBsaXN0IGNvbnRhaW5zIGVsZW1lbnRzCi8vLyB0aGF0IHN0YXJ0ZWQgb3V0IGVhcmxpZXIgdGhhbiB0aGUgb25lcyBpbiBbc2Vjb25kTGlzdF0Kdm9pZCBfbWVyZ2U8VD4oCiAgICBpbnQgY29tcGFyZShUIGEsIFQgYiksCiAgICBMaXN0PFQ+IGZpcnN0TGlzdCwKICAgIGludCBmaXJzdFN0YXJ0LAogICAgaW50IGZpcnN0RW5kLAogICAgTGlzdDxUPiBzZWNvbmRMaXN0LAogICAgaW50IHNlY29uZFN0YXJ0LAogICAgaW50IHNlY29uZEVuZCwKICAgIExpc3Q8VD4gdGFyZ2V0LAogICAgaW50IHRhcmdldE9mZnNldCkgewogIC8vIE5vIGVtcHR5IGxpc3RzIHJlYWNoZXMgaGVyZS4KICBhc3NlcnQoZmlyc3RTdGFydCA8IGZpcnN0RW5kKTsKICBhc3NlcnQoc2Vjb25kU3RhcnQgPCBzZWNvbmRFbmQpOwogIGludCBjdXJzb3IxID0gZmlyc3RTdGFydDsKICBpbnQgY3Vyc29yMiA9IHNlY29uZFN0YXJ0OwogIHZhciBmaXJzdEVsZW1lbnQgPSBmaXJzdExpc3RbY3Vyc29yMSsrXTsKICB2YXIgc2Vjb25kRWxlbWVudCA9IHNlY29uZExpc3RbY3Vyc29yMisrXTsKICB3aGlsZSAodHJ1ZSkgewogICAgaWYgKGNvbXBhcmUoZmlyc3RFbGVtZW50LCBzZWNvbmRFbGVtZW50KSA8PSAwKSB7CiAgICAgIHRhcmdldFt0YXJnZXRPZmZzZXQrK10gPSBmaXJzdEVsZW1lbnQ7CiAgICAgIGlmIChjdXJzb3IxID09IGZpcnN0RW5kKSBicmVhazsgLy8gRmx1c2hpbmcgc2Vjb25kIGxpc3QgYWZ0ZXIgbG9vcC4KICAgICAgZmlyc3RFbGVtZW50ID0gZmlyc3RMaXN0W2N1cnNvcjErK107CiAgICB9IGVsc2UgewogICAgICB0YXJnZXRbdGFyZ2V0T2Zmc2V0KytdID0gc2Vjb25kRWxlbWVudDsKICAgICAgaWYgKGN1cnNvcjIgIT0gc2Vjb25kRW5kKSB7CiAgICAgICAgc2Vjb25kRWxlbWVudCA9IHNlY29uZExpc3RbY3Vyc29yMisrXTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICAvLyBTZWNvbmQgbGlzdCBlbXB0aWVzIGZpcnN0LiBGbHVzaGluZyBmaXJzdCBsaXN0IGhlcmUuCiAgICAgIHRhcmdldFt0YXJnZXRPZmZzZXQrK10gPSBmaXJzdEVsZW1lbnQ7CiAgICAgIHRhcmdldC5zZXRSYW5nZSh0YXJnZXRPZmZzZXQsIHRhcmdldE9mZnNldCArIChmaXJzdEVuZCAtIGN1cnNvcjEpLAogICAgICAgICAgZmlyc3RMaXN0LCBjdXJzb3IxKTsKICAgICAgcmV0dXJuOwogICAgfQogIH0KICAvLyBGaXJzdCBsaXN0IGVtcHRpZXMgZmlyc3QuIFJlYWNoZWQgYnkgYnJlYWsgYWJvdmUuCiAgdGFyZ2V0W3RhcmdldE9mZnNldCsrXSA9IHNlY29uZEVsZW1lbnQ7CiAgdGFyZ2V0LnNldFJhbmdlKAogICAgICB0YXJnZXRPZmZzZXQsIHRhcmdldE9mZnNldCArIChzZWNvbmRFbmQgLSBjdXJzb3IyKSwgc2Vjb25kTGlzdCwgY3Vyc29yMik7Cn0KgR0ATk48ARwBFQFHBE0WBFBPBDlMIw8fFigjKB8UFQ0RBgQNAgFPDQRNFgRQTwROEkojDx8WKCMoFBUNEQYEDgIBHgRKNCImHBcmDiIuIQQCATQ0Jh4CATsvNhcXEwQCAUgUBFBPBE5LPwRPQwRLGCQ2RkEjFwEwFRMdGCo0HBMPFwgGMBkEAgE9IgFNGgRQTwRKOARKThIERxggNhcjARwaJEMMBD4/PytBKy0kI0UwOyc/Tw4CAUooBCNNMRwbJiUjHCAYKi8TDxcIBkEbBAIBSAROGgRFKEwoHCRLDAQmJCNAMTtAOjovTDoCASkERgoERks7EBsXFBIYFRMUGCIhIxwdKy0RNS1KKw0uIi8SCD4tSR8OBgQ3KhNQAgEmcGFja2FnZTpjb2xsZWN0aW9uL3NyYy9hbGdvcml0aG1zLmRhcnRCc2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NvbGxlY3Rpb24vbGliL3NyYy9jYW5vbmljYWxpemVkX21hcC5kYXJ0lVkvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOwoKaW1wb3J0ICd1dGlscy5kYXJ0JzsKCnR5cGVkZWYgQyBfQ2Fub25pY2FsaXplPEMsIEs+KEsga2V5KTsKCnR5cGVkZWYgYm9vbCBfSXNWYWxpZEtleShPYmplY3Qga2V5KTsKCi8vLyBBIG1hcCB3aG9zZSBrZXlzIGFyZSBjb252ZXJ0ZWQgdG8gY2Fub25pY2FsIHZhbHVlcyBvZiB0eXBlIGBDYC4KLy8vCi8vLyBUaGlzIGlzIHVzZWZ1bCBmb3IgdXNpbmcgY2FzZS1pbnNlbnNpdGl2ZSBTdHJpbmcga2V5cywgZm9yIGV4YW1wbGUuIEl0J3MKLy8vIG1vcmUgZWZmaWNpZW50IHRoYW4gYSBbTGlua2VkSGFzaE1hcF0gd2l0aCBhIGN1c3RvbSBlcXVhbGl0eSBvcGVyYXRvcgovLy8gYmVjYXVzZSBpdCBvbmx5IGNhbm9uaWNhbGl6ZXMgZWFjaCBrZXkgb25jZSwgcmF0aGVyIHRoYW4gZG9pbmcgc28gZm9yIGVhY2gKLy8vIGNvbXBhcmlzb24uCi8vLwovLy8gQnkgZGVmYXVsdCwgYG51bGxgIGlzIGFsbG93ZWQgYXMgYSBrZXkuIEl0IGNhbiBiZSBmb3JiaWRkZW4gdmlhIHRoZQovLy8gYGlzVmFsaWRLZXlgIHBhcmFtZXRlci4KY2xhc3MgQ2Fub25pY2FsaXplZE1hcDxDLCBLLCBWPiBpbXBsZW1lbnRzIE1hcDxLLCBWPiB7CiAgZmluYWwgX0Nhbm9uaWNhbGl6ZTxDLCBLPiBfY2Fub25pY2FsaXplOwoKICBmaW5hbCBfSXNWYWxpZEtleSBfaXNWYWxpZEtleUZuOwoKICBmaW5hbCBfYmFzZSA9IG5ldyBNYXA8QywgUGFpcjxLLCBWPj4oKTsKCiAgLy8vIENyZWF0ZXMgYW4gZW1wdHkgY2Fub25pY2FsaXplZCBtYXAuCiAgLy8vCiAgLy8vIFRoZSBbY2Fub25pY2FsaXplXSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBjYW5vbmljYWwgdmFsdWUgZm9yIHRoZQogIC8vLyBnaXZlbiBrZXkuIEtleXMgd2l0aCB0aGUgc2FtZSBjYW5vbmljYWwgdmFsdWUgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudC4KICAvLy8KICAvLy8gVGhlIFtpc1ZhbGlkS2V5XSBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgW2Nhbm9uaWNhbGl6ZV0gZm9yCiAgLy8vIG1ldGhvZHMgdGhhdCB0YWtlIGFyYml0cmFyeSBvYmplY3RzLiBJdCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIgb3V0IGtleXMKICAvLy8gdGhhdCBjYW4ndCBiZSBjYW5vbmljYWxpemVkLgogIENhbm9uaWNhbGl6ZWRNYXAoQyBjYW5vbmljYWxpemUoSyBrZXkpLCB7Ym9vbCBpc1ZhbGlkS2V5KE9iamVjdCBrZXkpfSkKICAgICAgOiBfY2Fub25pY2FsaXplID0gY2Fub25pY2FsaXplLAogICAgICAgIF9pc1ZhbGlkS2V5Rm4gPSBpc1ZhbGlkS2V5OwoKICAvLy8gQ3JlYXRlcyBhIGNhbm9uaWNhbGl6ZWQgbWFwIHRoYXQgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUga2V5L3ZhbHVlIHBhaXJzCiAgLy8vIG9mIFtvdGhlcl0uCiAgLy8vCiAgLy8vIFRoZSBbY2Fub25pY2FsaXplXSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBjYW5vbmljYWwgdmFsdWUgZm9yIHRoZQogIC8vLyBnaXZlbiBrZXkuIEtleXMgd2l0aCB0aGUgc2FtZSBjYW5vbmljYWwgdmFsdWUgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudC4KICAvLy8KICAvLy8gVGhlIFtpc1ZhbGlkS2V5XSBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgW2Nhbm9uaWNhbGl6ZV0gZm9yCiAgLy8vIG1ldGhvZHMgdGhhdCB0YWtlIGFyYml0cmFyeSBvYmplY3RzLiBJdCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIgb3V0IGtleXMKICAvLy8gdGhhdCBjYW4ndCBiZSBjYW5vbmljYWxpemVkLgogIENhbm9uaWNhbGl6ZWRNYXAuZnJvbShNYXA8SywgVj4gb3RoZXIsIEMgY2Fub25pY2FsaXplKEsga2V5KSwKICAgICAge2Jvb2wgaXNWYWxpZEtleShPYmplY3Qga2V5KX0pCiAgICAgIDogX2Nhbm9uaWNhbGl6ZSA9IGNhbm9uaWNhbGl6ZSwKICAgICAgICBfaXNWYWxpZEtleUZuID0gaXNWYWxpZEtleSB7CiAgICBhZGRBbGwob3RoZXIpOwogIH0KCiAgViBvcGVyYXRvciBbXShPYmplY3Qga2V5KSB7CiAgICBpZiAoIV9pc1ZhbGlkS2V5KGtleSkpIHJldHVybiBudWxsOwogICAgdmFyIHBhaXIgPSBfYmFzZVtfY2Fub25pY2FsaXplKGtleSBhcyBLKV07CiAgICByZXR1cm4gcGFpciA9PSBudWxsID8gbnVsbCA6IHBhaXIubGFzdDsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KEsga2V5LCBWIHZhbHVlKSB7CiAgICBpZiAoIV9pc1ZhbGlkS2V5KGtleSkpIHJldHVybjsKICAgIF9iYXNlW19jYW5vbmljYWxpemUoa2V5KV0gPSBuZXcgUGFpcihrZXksIHZhbHVlKTsKICB9CgogIHZvaWQgYWRkQWxsKE1hcDxLLCBWPiBvdGhlcikgewogICAgb3RoZXIuZm9yRWFjaCgoa2V5LCB2YWx1ZSkgPT4gdGhpc1trZXldID0gdmFsdWUpOwogIH0KCiAgdm9pZCBhZGRFbnRyaWVzKEl0ZXJhYmxlPE1hcEVudHJ5PEssIFY+PiBlbnRyaWVzKSA9PgogICAgICBfYmFzZS5hZGRFbnRyaWVzKGVudHJpZXMubWFwKAogICAgICAgICAgKGUpID0+IG5ldyBNYXBFbnRyeShfY2Fub25pY2FsaXplKGUua2V5KSwgbmV3IFBhaXIoZS5rZXksIGUudmFsdWUpKSkpOwoKICBNYXA8SzIsIFYyPiBjYXN0PEsyLCBWMj4oKSA9PiBfYmFzZS5jYXN0PEsyLCBWMj4oKTsKCiAgdm9pZCBjbGVhcigpIHsKICAgIF9iYXNlLmNsZWFyKCk7CiAgfQoKICBib29sIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKICAgIGlmICghX2lzVmFsaWRLZXkoa2V5KSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIF9iYXNlLmNvbnRhaW5zS2V5KF9jYW5vbmljYWxpemUoa2V5IGFzIEspKTsKICB9CgogIGJvb2wgY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpID0+CiAgICAgIF9iYXNlLnZhbHVlcy5hbnkoKHBhaXIpID0+IHBhaXIubGFzdCA9PSB2YWx1ZSk7CgogIEl0ZXJhYmxlPE1hcEVudHJ5PEssIFY+PiBnZXQgZW50cmllcyA9PgogICAgICBfYmFzZS5lbnRyaWVzLm1hcCgoZSkgPT4gbmV3IE1hcEVudHJ5KGUudmFsdWUuZmlyc3QsIGUudmFsdWUubGFzdCkpOwoKICB2b2lkIGZvckVhY2godm9pZCBmKEsga2V5LCBWIHZhbHVlKSkgewogICAgX2Jhc2UuZm9yRWFjaCgoa2V5LCBwYWlyKSA9PiBmKHBhaXIuZmlyc3QsIHBhaXIubGFzdCkpOwogIH0KCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfYmFzZS5pc0VtcHR5OwoKICBib29sIGdldCBpc05vdEVtcHR5ID0+IF9iYXNlLmlzTm90RW1wdHk7CgogIEl0ZXJhYmxlPEs+IGdldCBrZXlzID0+IF9iYXNlLnZhbHVlcy5tYXAoKHBhaXIpID0+IHBhaXIuZmlyc3QpOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfYmFzZS5sZW5ndGg7CgogIE1hcDxLMiwgVjI+IG1hcDxLMiwgVjI+KE1hcEVudHJ5PEsyLCBWMj4gdHJhbnNmb3JtKEsga2V5LCBWIHZhbHVlKSkgPT4KICAgICAgX2Jhc2UubWFwKChfLCBwYWlyKSA9PiB0cmFuc2Zvcm0ocGFpci5maXJzdCwgcGFpci5sYXN0KSk7CgogIFYgcHV0SWZBYnNlbnQoSyBrZXksIFYgaWZBYnNlbnQoKSkgewogICAgcmV0dXJuIF9iYXNlCiAgICAgICAgLnB1dElmQWJzZW50KF9jYW5vbmljYWxpemUoa2V5KSwgKCkgPT4gbmV3IFBhaXIoa2V5LCBpZkFic2VudCgpKSkKICAgICAgICAubGFzdDsKICB9CgogIFYgcmVtb3ZlKE9iamVjdCBrZXkpIHsKICAgIGlmICghX2lzVmFsaWRLZXkoa2V5KSkgcmV0dXJuIG51bGw7CiAgICB2YXIgcGFpciA9IF9iYXNlLnJlbW92ZShfY2Fub25pY2FsaXplKGtleSBhcyBLKSk7CiAgICByZXR1cm4gcGFpciA9PSBudWxsID8gbnVsbCA6IHBhaXIubGFzdDsKICB9CgogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KEsga2V5LCBWIHZhbHVlKSkgPT4KICAgICAgX2Jhc2UucmVtb3ZlV2hlcmUoKF8sIHBhaXIpID0+IHRlc3QocGFpci5maXJzdCwgcGFpci5sYXN0KSk7CgogIEBkZXByZWNhdGVkCiAgTWFwPEsyLCBWMj4gcmV0eXBlPEsyLCBWMj4oKSA9PiBjYXN0PEsyLCBWMj4oKTsKCiAgViB1cGRhdGUoSyBrZXksIFYgdXBkYXRlKFYgdmFsdWUpLCB7ViBpZkFic2VudCgpfSkgPT4gX2Jhc2UKICAgICAgLnVwZGF0ZShfY2Fub25pY2FsaXplKGtleSksIChwYWlyKSA9PiBuZXcgUGFpcihrZXksIHVwZGF0ZShwYWlyLmxhc3QpKSwKICAgICAgICAgIGlmQWJzZW50OiBpZkFic2VudCA9PSBudWxsID8gbnVsbCA6ICgpID0+IG5ldyBQYWlyKGtleSwgaWZBYnNlbnQoKSkpCiAgICAgIC5sYXN0OwoKICB2b2lkIHVwZGF0ZUFsbChWIHVwZGF0ZShLIGtleSwgViB2YWx1ZSkpID0+IF9iYXNlLnVwZGF0ZUFsbCgKICAgICAgKF8sIHBhaXIpID0+IG5ldyBQYWlyKHBhaXIuZmlyc3QsIHVwZGF0ZShwYWlyLmZpcnN0LCBwYWlyLmxhc3QpKSk7CgogIEl0ZXJhYmxlPFY+IGdldCB2YWx1ZXMgPT4gX2Jhc2UudmFsdWVzLm1hcCgocGFpcikgPT4gcGFpci5sYXN0KTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgLy8gRGV0ZWN0IHRvU3RyaW5nKCkgY3ljbGVzLgogICAgaWYgKF9pc1RvU3RyaW5nVmlzaXRpbmcodGhpcykpIHsKICAgICAgcmV0dXJuICd7Li4ufSc7CiAgICB9CgogICAgdmFyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHRyeSB7CiAgICAgIF90b1N0cmluZ1Zpc2l0aW5nLmFkZCh0aGlzKTsKICAgICAgcmVzdWx0LndyaXRlKCd7Jyk7CiAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgICBmb3JFYWNoKChrLCB2KSB7CiAgICAgICAgaWYgKCFmaXJzdCkgewogICAgICAgICAgcmVzdWx0LndyaXRlKCcsICcpOwogICAgICAgIH0KICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICAgIHJlc3VsdC53cml0ZSgnJGs6ICR2Jyk7CiAgICAgIH0pOwogICAgICByZXN1bHQud3JpdGUoJ30nKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGFzc2VydChpZGVudGljYWwoX3RvU3RyaW5nVmlzaXRpbmcubGFzdCwgdGhpcykpOwogICAgICBfdG9TdHJpbmdWaXNpdGluZy5yZW1vdmVMYXN0KCk7CiAgICB9CgogICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogIH0KCiAgYm9vbCBfaXNWYWxpZEtleShPYmplY3Qga2V5KSA9PgogICAgICAoa2V5ID09IG51bGwgfHwga2V5IGlzIEspICYmCiAgICAgIChfaXNWYWxpZEtleUZuID09IG51bGwgfHwgX2lzVmFsaWRLZXlGbihrZXkpKTsKfQoKLy8vIEEgY29sbGVjdGlvbiB1c2VkIHRvIGlkZW50aWZ5IGN5Y2xpYyBtYXBzIGR1cmluZyB0b1N0cmluZygpIGNhbGxzLgpmaW5hbCBMaXN0IF90b1N0cmluZ1Zpc2l0aW5nID0gW107CgovLy8gQ2hlY2sgaWYgd2UgYXJlIGN1cnJlbnRseSB2aXNpdGluZyBgb2AgaW4gYSB0b1N0cmluZygpIGNhbGwuCmJvb2wgX2lzVG9TdHJpbmdWaXNpdGluZyhvKSA9PiBfdG9TdHJpbmdWaXNpdGluZy5hbnkoKGUpID0+IGlkZW50aWNhbChvLCBlKSk7CoCuAE5OPAEaARUBJgEmAUQETUpPEARIHDcrASMBKgEqBkxPBkxNI0kmJAFPEgZMTwZMTSNAJSYlEwQBHigvLAQBJiM2BAEhNgQBNyRRATYBERMEASEpNwQBJjYBKksBKTwEASUBKwFCASIBSUABJxFKDwQBGSg2LAQBMUMBDjIBPk5PDQE/SQFDARYhJRYGASUKIxkZFxYeChcgChkQNyYGAR4EASIjNQIBRyMBQU4BLXBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvY2Fub25pY2FsaXplZF9tYXAuZGFydFRzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY29sbGVjdGlvbi9saWIvc3JjL2NvbWJpbmVkX3dyYXBwZXJzL2NvbWJpbmVkX2l0ZXJhYmxlLmRhcnSH2S8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CgovLy8gQSB2aWV3IG9mIHNldmVyYWwgaXRlcmFibGVzIGNvbWJpbmVkIHNlcXVlbnRpYWxseSBpbnRvIGEgc2luZ2xlIGl0ZXJhYmxlLgovLy8KLy8vIEFsbCBtZXRob2RzIGFuZCBhY2Nlc3NvcnMgdHJlYXQgdGhlIFtDb21iaW5lZEl0ZXJhYmxlVmlld10gYXMgaWYgaXQgd2VyZSBhCi8vLyBzaW5nbGUgY29uY2F0ZW5hdGVkIGl0ZXJhYmxlLCBidXQgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24KLy8vIGxhemlseSBhY2Nlc3NpbmcgaW5kaXZpZHVhbCBpdGVyYWJsZSBpbnN0YW5jZXMuIFRoaXMgbWVhbnMgdGhhdCBpZiB0aGUKLy8vIHVuZGVybHlpbmcgaXRlcmFibGVzIGNoYW5nZSwgdGhlIFtDb21iaW5lZEl0ZXJhYmxlVmlld10gd2lsbCByZWZsZWN0IHRob3NlCi8vLyBjaGFuZ2VzLgpjbGFzcyBDb21iaW5lZEl0ZXJhYmxlVmlldzxUPiBleHRlbmRzIEl0ZXJhYmxlQmFzZTxUPiB7CiAgLy8vIFRoZSBpdGVyYWJsZXMgdGhhdCB0aGlzIGNvbWJpbmVzLgogIGZpbmFsIEl0ZXJhYmxlPEl0ZXJhYmxlPFQ+PiBfaXRlcmFibGVzOwoKICAvLy8gQ3JlYXRlcyBhIGNvbWJpbmVkIHZpZXcgb2YgW2l0ZXJhYmxlc10uCiAgY29uc3QgQ29tYmluZWRJdGVyYWJsZVZpZXcodGhpcy5faXRlcmFibGVzKTsKCiAgSXRlcmF0b3I8VD4gZ2V0IGl0ZXJhdG9yID0+CiAgICAgIG5ldyBfQ29tYmluZWRJdGVyYXRvcjxUPihfaXRlcmFibGVzLm1hcCgoaSkgPT4gaS5pdGVyYXRvcikuaXRlcmF0b3IpOwoKICAvLyBTcGVjaWFsIGNhc2VkIGNvbnRhaW5zL2lzRW1wdHkvbGVuZ3RoIHNpbmNlIG1hbnkgaXRlcmFibGVzIGhhdmUgYW4KICAvLyBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24gaW5zdGVhZCBvZiBydW5uaW5nIHRocm91Z2ggdGhlIGVudGlyZSBpdGVyYXRvci4KCiAgYm9vbCBjb250YWlucyhPYmplY3QgZWxlbWVudCkgPT4gX2l0ZXJhYmxlcy5hbnkoKGkpID0+IGkuY29udGFpbnMoZWxlbWVudCkpOwoKICBib29sIGdldCBpc0VtcHR5ID0+IF9pdGVyYWJsZXMuZXZlcnkoKGkpID0+IGkuaXNFbXB0eSk7CgogIGludCBnZXQgbGVuZ3RoID0+IF9pdGVyYWJsZXMuZm9sZCgwLCAobGVuZ3RoLCBpKSA9PiBsZW5ndGggKyBpLmxlbmd0aCk7Cn0KCi8vLyBUaGUgaXRlcmF0b3IgZm9yIFtDb21iaW5lZEl0ZXJhYmxlVmlld10uCi8vLwovLy8gVGhpcyBtb3ZlcyB0aHJvdWdoIGVhY2ggaXRlcmFibGUncyBpdGVyYXRvcnMgaW4gc2VxdWVuY2UuCmNsYXNzIF9Db21iaW5lZEl0ZXJhdG9yPFQ+IGltcGxlbWVudHMgSXRlcmF0b3I8VD4gewogIC8vLyBUaGUgaXRlcmF0b3JzIHRoYXQgdGhpcyBjb21iaW5lcy4KICAvLy8KICAvLy8gQmVjYXVzZSB0aGlzIGNvbWVzIGZyb20gYSBjYWxsIHRvIFtJdGVyYWJsZS5tYXBdLCBpdCdzIGxhenkgYW5kIHdpbGwKICAvLy8gYXZvaWQgaW5zdGFudGlhdGluZyB1bm5lY2Vzc2FyeSBpdGVyYXRvcnMuCiAgZmluYWwgSXRlcmF0b3I8SXRlcmF0b3I8VD4+IF9pdGVyYXRvcnM7CgogIF9Db21iaW5lZEl0ZXJhdG9yKHRoaXMuX2l0ZXJhdG9ycyk7CgogIFQgZ2V0IGN1cnJlbnQgPT4gX2l0ZXJhdG9ycy5jdXJyZW50Py5jdXJyZW50OwoKICBib29sIG1vdmVOZXh0KCkgewogICAgdmFyIGN1cnJlbnQgPSBfaXRlcmF0b3JzLmN1cnJlbnQ7CiAgICBpZiAoY3VycmVudCAhPSBudWxsICYmIGN1cnJlbnQubW92ZU5leHQoKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBfaXRlcmF0b3JzLm1vdmVOZXh0KCkgJiYgbW92ZU5leHQoKTsKICB9Cn0KOQBOTjwBGgFOBE9QS08NOCgqAS4vAR5MAUhOAU8BOgFKAgEtBD40KAZLMSoBJgEwARQmMRMGMAQCAT9wYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2NvbWJpbmVkX3dyYXBwZXJzL2NvbWJpbmVkX2l0ZXJhYmxlLmRhcnRQc2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NvbGxlY3Rpb24vbGliL3NyYy9jb21iaW5lZF93cmFwcGVycy9jb21iaW5lZF9saXN0LmRhcnSHKS8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CgovLy8gQSB2aWV3IG9mIHNldmVyYWwgbGlzdHMgY29tYmluZWQgaW50byBhIHNpbmdsZSBsaXN0LgovLy8KLy8vIEFsbCBtZXRob2RzIGFuZCBhY2Nlc3NvcnMgdHJlYXQgdGhlIFtDb21iaW5lZExpc3RWaWV3XSBsaXN0IGFzIGlmIGl0IHdlcmUgYQovLy8gc2luZ2xlIGNvbmNhdGVuYXRlZCBsaXN0LCBidXQgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24KLy8vIGxhemlseSBhY2Nlc3NpbmcgaW5kaXZpZHVhbCBsaXN0IGluc3RhbmNlcy4gVGhpcyBtZWFucyB0aGF0IGlmIHRoZQovLy8gdW5kZXJseWluZyBsaXN0cyBjaGFuZ2UsIHRoZSBbQ29tYmluZWRMaXN0Vmlld10gd2lsbCByZWZsZWN0IHRob3NlIGNoYW5nZXMuCi8vLwovLy8gVGhlIGluZGV4IG9wZXJhdG9yIChgW11gKSBhbmQgW2xlbmd0aF0gcHJvcGVydHkgb2YgYSBbQ29tYmluZWRMaXN0Vmlld10gYXJlCi8vLyBib3RoIGBPKGxpc3RzKWAgcmF0aGVyIHRoYW4gYE8oMSlgLiBBIFtDb21iaW5lZExpc3RWaWV3XSBpcyB1bm1vZGlmaWFibGUuCmNsYXNzIENvbWJpbmVkTGlzdFZpZXc8VD4gZXh0ZW5kcyBMaXN0QmFzZTxUPgogICAgaW1wbGVtZW50cyBVbm1vZGlmaWFibGVMaXN0VmlldzxUPiB7CiAgc3RhdGljIHZvaWQgX3Rocm93KCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ0Nhbm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIExpc3QnKTsKICB9CgogIC8vLyBUaGUgbGlzdHMgdGhhdCB0aGlzIGNvbWJpbmVzLgogIGZpbmFsIExpc3Q8TGlzdDxUPj4gX2xpc3RzOwoKICAvLy8gQ3JlYXRlcyBhIGNvbWJpbmVkIHZpZXcgb2YgW2xpc3RzXS4KICBDb21iaW5lZExpc3RWaWV3KHRoaXMuX2xpc3RzKTsKCiAgc2V0IGxlbmd0aChpbnQgbGVuZ3RoKSB7CiAgICBfdGhyb3coKTsKICB9CgogIGludCBnZXQgbGVuZ3RoID0+IF9saXN0cy5mb2xkKDAsIChsZW5ndGgsIGxpc3QpID0+IGxlbmd0aCArIGxpc3QubGVuZ3RoKTsKCiAgVCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIHZhciBpbml0aWFsSW5kZXggPSBpbmRleDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX2xpc3RzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBsaXN0ID0gX2xpc3RzW2ldOwogICAgICBpZiAoaW5kZXggPCBsaXN0Lmxlbmd0aCkgewogICAgICAgIHJldHVybiBsaXN0W2luZGV4XTsKICAgICAgfQogICAgICBpbmRleCAtPSBsaXN0Lmxlbmd0aDsKICAgIH0KICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluaXRpYWxJbmRleCwgdGhpcywgJ2luZGV4JywgbnVsbCwgbGVuZ3RoKTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgVCB2YWx1ZSkgewogICAgX3Rocm93KCk7CiAgfQoKICB2b2lkIGNsZWFyKCkgewogICAgX3Rocm93KCk7CiAgfQoKICBib29sIHJlbW92ZShPYmplY3QgZWxlbWVudCkgewogICAgX3Rocm93KCk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KFQgZWxlbWVudCkpIHsKICAgIF90aHJvdygpOwogIH0KCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoVCBlbGVtZW50KSkgewogICAgX3Rocm93KCk7CiAgfQp9CkQATk48ARoBOQRQTEdQBFBOLikZRgQBJB4BKiEBGw4EAUwBHR4uHCEcCBwGSwQBKg4EAREOBAEgDhEEASsOBAErDgQCATtwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2NvbWJpbmVkX3dyYXBwZXJzL2NvbWJpbmVkX2xpc3QuZGFydDdvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29sbGVjdGlvbi9jb2xsZWN0aW9ucy5kYXJ0g6gvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvbGxlY3Rpb247CgovLy8gQW4gdW5tb2RpZmlhYmxlIFtMaXN0XSB2aWV3IG9mIGFub3RoZXIgTGlzdC4KLy8vCi8vLyBUaGUgc291cmNlIG9mIHRoZSBlbGVtZW50cyBtYXkgYmUgYSBbTGlzdF0gb3IgYW55IFtJdGVyYWJsZV0gd2l0aAovLy8gZWZmaWNpZW50IFtJdGVyYWJsZS5sZW5ndGhdIGFuZCBbSXRlcmFibGUuZWxlbWVudEF0XS4KY2xhc3MgVW5tb2RpZmlhYmxlTGlzdFZpZXc8RT4gZXh0ZW5kcyBVbm1vZGlmaWFibGVMaXN0QmFzZTxFPiB7CiAgZmluYWwgSXRlcmFibGU8RT4gX3NvdXJjZTsKCiAgLy8vIENyZWF0ZXMgYW4gdW5tb2RpZmlhYmxlIGxpc3QgYmFja2VkIGJ5IFtzb3VyY2VdLgogIC8vLwogIC8vLyBUaGUgW3NvdXJjZV0gb2YgdGhlIGVsZW1lbnRzIG1heSBiZSBhIFtMaXN0XSBvciBhbnkgW0l0ZXJhYmxlXSB3aXRoCiAgLy8vIGVmZmljaWVudCBbSXRlcmFibGUubGVuZ3RoXSBhbmQgW0l0ZXJhYmxlLmVsZW1lbnRBdF0uCiAgVW5tb2RpZmlhYmxlTGlzdFZpZXcoSXRlcmFibGU8RT4gc291cmNlKSA6IF9zb3VyY2UgPSBzb3VyY2U7CgogIExpc3Q8Uj4gY2FzdDxSPigpID0+IFVubW9kaWZpYWJsZUxpc3RWaWV3KF9zb3VyY2UuY2FzdDxSPigpKTsKICBpbnQgZ2V0IGxlbmd0aCA9PiBfc291cmNlLmxlbmd0aDsKCiAgRSBvcGVyYXRvciBbXShpbnQgaW5kZXgpID0+IF9zb3VyY2UuZWxlbWVudEF0KGluZGV4KTsKfQoaAE5OPAEZATEERjpAHQE3Bko8PwFAJAE4AgEgZGFydDpjb2xsZWN0aW9uL2NvbGxlY3Rpb25zLmRhcnRPc2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NvbGxlY3Rpb24vbGliL3NyYy9jb21iaW5lZF93cmFwcGVycy9jb21iaW5lZF9tYXAuZGFydIf7Ly8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKCmltcG9ydCAnY29tYmluZWRfaXRlcmFibGUuZGFydCc7CgovLy8gUmV0dXJucyBhIG5ldyBtYXAgdGhhdCByZXByZXNlbnRzIG1hcHMgZmxhdHRlbmVkIGludG8gYSBzaW5nbGUgbWFwLgovLy8KLy8vIEFsbCBtZXRob2RzIGFuZCBhY2Nlc3NvcnMgdHJlYXQgdGhlIG5ldyBtYXAgYXMtaWYgaXQgd2VyZSBhIHNpbmdsZQovLy8gY29uY2F0ZW5hdGVkIG1hcCwgYnV0IHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGxhemlseQovLy8gYWNjZXNzaW5nIGluZGl2aWR1YWwgbWFwIGluc3RhbmNlcy4gSW4gdGhlIG9jY2FzaW9uIHdoZXJlIGEga2V5IG9jY3VycyBpbgovLy8gbXVsdGlwbGUgbWFwcyB0aGUgZmlyc3QgdmFsdWUgaXMgcmV0dXJuZWQuCi8vLwovLy8gVGhlIHJlc3VsdGluZyBtYXAgaGFzIGFuIGluZGV4IG9wZXJhdG9yIChgW11gKSBhbmQgYGxlbmd0aGAgcHJvcGVydHkgdGhhdAovLy8gYXJlIGJvdGggYE8obWFwcylgLCByYXRoZXIgdGhhbiBgTygxKWAsIGFuZCB0aGUgbWFwIGlzIHVubW9kaWZpYWJsZSAtIGJ1dAovLy8gdW5kZXJseWluZyBjaGFuZ2VzIHRvIHRoZXNlIG1hcHMgYXJlIHN0aWxsIGFjY2Vzc2libGUgZnJvbSB0aGUgcmVzdWx0aW5nCi8vLyBtYXAuCmNsYXNzIENvbWJpbmVkTWFwVmlldzxLLCBWPiBleHRlbmRzIFVubW9kaWZpYWJsZU1hcEJhc2U8SywgVj4gewogIGZpbmFsIEl0ZXJhYmxlPE1hcDxLLCBWPj4gX21hcHM7CgogIC8vLyBDcmVhdGUgYSBuZXcgY29tYmluZWQgdmlldyBpbnRvIG11bHRpcGxlIG1hcHMuCiAgLy8vCiAgLy8vIFRoZSBpdGVyYWJsZSBpcyBhY2Nlc3NlZCBsYXppbHkgc28gaXQgc2hvdWxkIGJlIGNvbGxlY3Rpb24gdHlwZSBsaWtlCiAgLy8vIFtMaXN0XSBvciBbU2V0XSByYXRoZXIgdGhhbiBhIGxhenkgaXRlcmFibGUgcHJvZHVjZWQgYnkgYG1hcCgpYCBldCBhbC4KICBDb21iaW5lZE1hcFZpZXcodGhpcy5fbWFwcyk7CgogIFYgb3BlcmF0b3IgW10oT2JqZWN0IGtleSkgewogICAgZm9yICh2YXIgbWFwIGluIF9tYXBzKSB7CiAgICAgIC8vIEF2b2lkIHR3byBoYXNoIGxvb2t1cHMgb24gYSBwb3NpdGl2ZSBoaXQuCiAgICAgIHZhciB2YWx1ZSA9IG1hcFtrZXldOwogICAgICBpZiAodmFsdWUgIT0gbnVsbCB8fCBtYXAuY29udGFpbnNLZXkodmFsdWUpKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vLyBUaGUga2V5cyBvZiBbdGhpc10uCiAgLy8vCiAgLy8vIFRoZSByZXR1cm5lZCBpdGVyYWJsZSBoYXMgZWZmaWNpZW50IGBsZW5ndGhgIGFuZCBgY29udGFpbnNgIG9wZXJhdGlvbnMsCiAgLy8vIGJhc2VkIG9uIFtsZW5ndGhdIGFuZCBbY29udGFpbnNLZXldIG9mIHRoZSBpbmRpdmlkdWFsIG1hcHMuCiAgLy8vCiAgLy8vIFRoZSBvcmRlciBvZiBpdGVyYXRpb24gaXMgZGVmaW5lZCBieSB0aGUgaW5kaXZpZHVhbCBgTWFwYCBpbXBsZW1lbnRhdGlvbnMsCiAgLy8vIGJ1dCBtdXN0IGJlIGNvbnNpc3RlbnQgYmV0d2VlbiBjaGFuZ2VzIHRvIHRoZSBtYXBzLgogIC8vLwogIC8vLyBVbmxpa2UgbW9zdCBbTWFwXSBpbXBsZW1lbnRhdGlvbnMsIG1vZGlmeWluZyBhbiBpbmRpdmlkdWFsIG1hcCB3aGlsZQogIC8vLyBpdGVyYXRpbmcgdGhlIGtleXMgd2lsbCBfc29tZXRpbWVzXyB0aHJvdy4gVGhpcyBiZWhhdmlvciBtYXkgY2hhbmdlIGluCiAgLy8vIHRoZSBmdXR1cmUuCiAgSXRlcmFibGU8Sz4gZ2V0IGtleXMgPT4gbmV3IENvbWJpbmVkSXRlcmFibGVWaWV3PEs+KF9tYXBzLm1hcCgobSkgPT4gbS5rZXlzKSk7Cn0KNgBOTjwBGgEhAUgER0tOLwROTk0JQCMBNQZLTR8BHh0zHDUWCAYRBAEaBk5CBlE6BktNElECATpwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2NvbWJpbmVkX3dyYXBwZXJzL2NvbWJpbmVkX21hcC5kYXJ0PHNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jb2xsZWN0aW9uL2xpYi9zcmMvY29tcGFyYXRvcnMuZGFydLpxLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUNCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhDQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KDQovLyBDaGFyYWN0ZXIgY29uc3RhbnRzLg0KY29uc3QgaW50IF96ZXJvID0gMHgzMDsNCmNvbnN0IGludCBfdXBwZXJDYXNlQSA9IDB4NDE7DQpjb25zdCBpbnQgX3VwcGVyQ2FzZVogPSAweDVhOw0KY29uc3QgaW50IF9sb3dlckNhc2VBID0gMHg2MTsNCmNvbnN0IGludCBfbG93ZXJDYXNlWiA9IDB4N2E7DQpjb25zdCBpbnQgX2FzY2lpQ2FzZUJpdCA9IDB4MjA7DQoNCi8vLyBDaGVja3MgaWYgc3RyaW5ncyBbYV0gYW5kIFtiXSBkaWZmZXIgb25seSBvbiB0aGUgY2FzZSBvZiBBU0NJSSBsZXR0ZXJzLg0KLy8vDQovLy8gU3RyaW5ncyBhcmUgZXF1YWwgaWYgdGhleSBoYXZlIHRoZSBzYW1lIGxlbmd0aCwgYW5kIHRoZSBjaGFyYWN0ZXJzIGF0DQovLy8gZWFjaCBpbmRleCBhcmUgdGhlIHNhbWUsIG9yIHRoZXkgYXJlIEFTQ0lJIGxldHRlcnMgd2hlcmUgb25lIGlzIHVwcGVyLWNhc2UNCi8vLyBhbmQgdGhlIG90aGVyIGlzIHRoZSBsb3dlci1jYXNlIHZlcnNpb24gb2YgdGhlIHNhbWUgbGV0dGVyLg0KLy8vDQovLy8gVGhlIGNvbXBhcmlzb24gZG9lcyBub3QgaWdub3JlIHRoZSBjYXNlIG9mIG5vbi1BU0NJSSBsZXR0ZXJzLCBzbw0KLy8vIGFuIHVwcGVyLWNhc2UgYWUtbGlnYXR1cmUgKMOGKSBpcyBkaWZmZXJlbnQgZnJvbQ0KLy8vIGEgbG93ZXIgY2FzZSBhZS1saWdhdHVyZSAow6YpLg0KLy8vDQovLy8gSWdub3Jpbmcgbm9uLUFTQ0lJIGxldHRlcnMgaXMgbm90IGdlbmVyYWxseSBhIGdvb2QgaWRlYSwgYnV0IGl0IG1ha2VzIHNlbnNlDQovLy8gZm9yIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHN0cmluZ3MgYXJlIGtub3duIHRvIGJlIEFTQ0lJLiBFeGFtcGxlcyBjb3VsZA0KLy8vIGJlIERhcnQgaWRlbnRpZmllcnMsIGJhc2UtNjQgb3IgaGV4IGVuY29kZWQgc3RyaW5ncywgR1VJRHMgb3Igc2ltaWxhcg0KLy8vIHN0cmluZ3Mgd2l0aCBhIGtub3duIHN0cnVjdHVyZS4NCmJvb2wgZXF1YWxzSWdub3JlQXNjaWlDYXNlKFN0cmluZyBhLCBTdHJpbmcgYikgew0KICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTsNCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7DQogICAgdmFyIGFDaGFyID0gYS5jb2RlVW5pdEF0KGkpOw0KICAgIHZhciBiQ2hhciA9IGIuY29kZVVuaXRBdChpKTsNCiAgICBpZiAoYUNoYXIgPT0gYkNoYXIpIGNvbnRpbnVlOw0KICAgIC8vIFF1aWNrLWNoZWNrIGZvciB3aGV0aGVyIHRoaXMgbWF5IGJlIGRpZmZlcmVudCBjYXNlcyBvZiB0aGUgc2FtZSBsZXR0ZXIuDQogICAgaWYgKGFDaGFyIF4gYkNoYXIgIT0gX2FzY2lpQ2FzZUJpdCkgcmV0dXJuIGZhbHNlOw0KICAgIC8vIElmIGl0J3MgcG9zc2libGUsIHRoZW4gY2hlY2sgaWYgZWl0aGVyIGNoYXJhY3RlciBpcyBhY3R1YWxseSBhbiBBU0NJSQ0KICAgIC8vIGxldHRlci4NCiAgICBpbnQgYUNoYXJMb3dlckNhc2UgPSBhQ2hhciB8IF9hc2NpaUNhc2VCaXQ7DQogICAgaWYgKF9sb3dlckNhc2VBIDw9IGFDaGFyTG93ZXJDYXNlICYmIGFDaGFyTG93ZXJDYXNlIDw9IF9sb3dlckNhc2VaKSB7DQogICAgICBjb250aW51ZTsNCiAgICB9DQogICAgcmV0dXJuIGZhbHNlOw0KICB9DQogIHJldHVybiB0cnVlOw0KfQ0KDQovLy8gSGFzaCBjb2RlIGZvciBhIHN0cmluZyB3aGljaCBpcyBjb21wYXRpYmxlIHdpdGggW2VxdWFsc0lnbm9yZUFzY2lpQ2FzZV0uDQovLy8NCi8vLyBUaGUgaGFzaCBjb2RlIGlzIHVuYWZmZWN0ZWQgYnkgY2hhbmdpbmcgdGhlIGNhc2Ugb2YgQVNDSUkgbGV0dGVycywgYnV0DQovLy8gdGhlIGNhc2Ugb2Ygbm9uLUFTQ0lJIGxldHRlcnMgZG8gYWZmZWN0IHRoZSByZXN1bHQuDQppbnQgaGFzaElnbm9yZUFzY2lpQ2FzZShTdHJpbmcgc3RyaW5nKSB7DQogIC8vIEplbmtpbnMgaGFzaCBjb2RlICggaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9KZW5raW5zX2hhc2hfZnVuY3Rpb24pLg0KICAvLyBhZGFwdGVkIHRvIHNtaSB2YWx1ZXMuDQogIC8vIFNhbWUgaGFzaCB1c2VkIGJ5IGRhcnQyanMgZm9yIHN0cmluZ3MsIG1vZGlmaWVkIHRvIGlnbm9yZSBBU0NJSSBsZXR0ZXINCiAgLy8gY2FzZS4NCiAgaW50IGhhc2ggPSAwOw0KICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7IGkrKykgew0KICAgIGludCBjaGFyID0gc3RyaW5nLmNvZGVVbml0QXQoaSk7DQogICAgLy8gQ29udmVydCBsb3dlci1jYXNlIEFTQ0lJIGxldHRlcnMgdG8gdXBwZXIgY2FzZS51cHBlcg0KICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHN0cmluZ3MgdGhhdCBkaWZmZXIgb25seSBpbiBjYXNlIHdpbGwgaGF2ZSB0aGUNCiAgICAvLyBzYW1lIGhhc2ggY29kZS4NCiAgICBpZiAoX2xvd2VyQ2FzZUEgPD0gY2hhciAmJiBjaGFyIDw9IF9sb3dlckNhc2VaKSBjaGFyIC09IF9hc2NpaUNhc2VCaXQ7DQogICAgaGFzaCA9IDB4MWZmZmZmZmYgJiAoaGFzaCArIGNoYXIpOw0KICAgIGhhc2ggPSAweDFmZmZmZmZmICYgKGhhc2ggKyAoKDB4MDAwN2ZmZmYgJiBoYXNoKSA8PCAxMCkpOw0KICAgIGhhc2ggPj49IDY7DQogIH0NCiAgaGFzaCA9IDB4MWZmZmZmZmYgJiAoaGFzaCArICgoMHgwM2ZmZmZmZiAmIGhhc2gpIDw8IDMpKTsNCiAgaGFzaCA+Pj0gMTE7DQogIHJldHVybiAweDFmZmZmZmZmICYgKGhhc2ggKyAoKDB4MDAwMDNmZmYgJiBoYXNoKSA8PCAxNSkpOw0KfQ0KDQovLy8gQ29tcGFyZXMgW2FdIGFuZCBbYl0gbGV4aWNhbGx5LCBjb252ZXJ0aW5nIEFTQ0lJIGxldHRlcnMgdG8gdXBwZXIgY2FzZS4NCi8vLw0KLy8vIENvbXBhcmlzb24gdHJlYXRzIGFsbCBsb3dlci1jYXNlIEFTQ0lJIGxldHRlcnMgYXMgdXBwZXItY2FzZSBsZXR0ZXJzLA0KLy8vIGJ1dCBkb2VzIG5vIGNhc2UgY29udmVyc2lvbiBmb3Igbm9uLUFTQ0lJIGxldHRlcnMuDQovLy8NCi8vLyBJZiB0d28gc3RyaW5ncyBkaWZmZXIgb25seSBvbiB0aGUgY2FzZSBvZiBBU0NJSSBsZXR0ZXJzLCB0aGUgb25lIHdpdGggdGhlDQovLy8gY2FwaXRhbCBsZXR0ZXIgYXQgdGhlIGZpcnN0IGRpZmZlcmVuY2Ugd2lsbCBjb21wYXJlIGFzIGxlc3MgdGhhbiB0aGUgb3RoZXINCi8vLyBzdHJpbmcuIFRoaXMgdGllLWJyZWFraW5nIGVuc3VyZXMgdGhhdCB0aGUgY29tcGFyaXNvbiBpcyBhIHRvdGFsIG9yZGVyaW5nDQovLy8gb24gc3RyaW5ncyBhbmQgaXMgY29tcGF0aWJsZSB3aXRoIGVxdWFsaXR5Lg0KLy8vDQovLy8gSWdub3Jpbmcgbm9uLUFTQ0lJIGxldHRlcnMgaXMgbm90IGdlbmVyYWxseSBhIGdvb2QgaWRlYSwgYnV0IGl0IG1ha2VzIHNlbnNlDQovLy8gZm9yIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHN0cmluZ3MgYXJlIGtub3duIHRvIGJlIEFTQ0lJLiBFeGFtcGxlcyBjb3VsZA0KLy8vIGJlIERhcnQgaWRlbnRpZmllcnMsIGJhc2UtNjQgb3IgaGV4IGVuY29kZWQgc3RyaW5ncywgR1VJRHMgb3Igc2ltaWxhcg0KLy8vIHN0cmluZ3Mgd2l0aCBhIGtub3duIHN0cnVjdHVyZS4NCmludCBjb21wYXJlQXNjaWlVcHBlckNhc2UoU3RyaW5nIGEsIFN0cmluZyBiKSB7DQogIGludCBkZWZhdWx0UmVzdWx0ID0gMDsgLy8gUmV0dXJuZWQgaWYgbm8gZGlmZmVyZW5jZSBmb3VuZC4NCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7DQogICAgaWYgKGkgPj0gYi5sZW5ndGgpIHJldHVybiAxOw0KICAgIHZhciBhQ2hhciA9IGEuY29kZVVuaXRBdChpKTsNCiAgICB2YXIgYkNoYXIgPSBiLmNvZGVVbml0QXQoaSk7DQogICAgaWYgKGFDaGFyID09IGJDaGFyKSBjb250aW51ZTsNCiAgICAvLyBVcHBlci1jYXNlIGlmIGxldHRlcnMuDQogICAgaW50IGFVcHBlckNhc2UgPSBhQ2hhcjsNCiAgICBpbnQgYlVwcGVyQ2FzZSA9IGJDaGFyOw0KICAgIGlmIChfbG93ZXJDYXNlQSA8PSBhQ2hhciAmJiBhQ2hhciA8PSBfbG93ZXJDYXNlWikgew0KICAgICAgYVVwcGVyQ2FzZSAtPSBfYXNjaWlDYXNlQml0Ow0KICAgIH0NCiAgICBpZiAoX2xvd2VyQ2FzZUEgPD0gYkNoYXIgJiYgYkNoYXIgPD0gX2xvd2VyQ2FzZVopIHsNCiAgICAgIGJVcHBlckNhc2UgLT0gX2FzY2lpQ2FzZUJpdDsNCiAgICB9DQogICAgaWYgKGFVcHBlckNhc2UgIT0gYlVwcGVyQ2FzZSkgcmV0dXJuIChhVXBwZXJDYXNlIC0gYlVwcGVyQ2FzZSkuc2lnbjsNCiAgICBpZiAoZGVmYXVsdFJlc3VsdCA9PSAwKSBkZWZhdWx0UmVzdWx0ID0gKGFDaGFyIC0gYkNoYXIpOw0KICB9DQogIGlmIChiLmxlbmd0aCA+IGEubGVuZ3RoKSByZXR1cm4gLTE7DQogIHJldHVybiBkZWZhdWx0UmVzdWx0LnNpZ247DQp9DQoNCi8vLyBDb21wYXJlcyBbYV0gYW5kIFtiXSBsZXhpY2FsbHksIGNvbnZlcnRpbmcgQVNDSUkgbGV0dGVycyB0byBsb3dlciBjYXNlLg0KLy8vDQovLy8gQ29tcGFyaXNvbiB0cmVhdHMgYWxsIHVwcGVyLWNhc2UgQVNDSUkgbGV0dGVycyBhcyBsb3dlci1jYXNlIGxldHRlcnMsDQovLy8gYnV0IGRvZXMgbm8gY2FzZSBjb252ZXJzaW9uIGZvciBub24tQVNDSUkgbGV0dGVycy4NCi8vLw0KLy8vIElmIHR3byBzdHJpbmdzIGRpZmZlciBvbmx5IG9uIHRoZSBjYXNlIG9mIEFTQ0lJIGxldHRlcnMsIHRoZSBvbmUgd2l0aCB0aGUNCi8vLyBjYXBpdGFsIGxldHRlciBhdCB0aGUgZmlyc3QgZGlmZmVyZW5jZSB3aWxsIGNvbXBhcmUgYXMgbGVzcyB0aGFuIHRoZSBvdGhlcg0KLy8vIHN0cmluZy4gVGhpcyB0aWUtYnJlYWtpbmcgZW5zdXJlcyB0aGF0IHRoZSBjb21wYXJpc29uIGlzIGEgdG90YWwgb3JkZXJpbmcNCi8vLyBvbiBzdHJpbmdzLg0KLy8vDQovLy8gSWdub3Jpbmcgbm9uLUFTQ0lJIGxldHRlcnMgaXMgbm90IGdlbmVyYWxseSBhIGdvb2QgaWRlYSwgYnV0IGl0IG1ha2VzIHNlbnNlDQovLy8gZm9yIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHN0cmluZ3MgYXJlIGtub3duIHRvIGJlIEFTQ0lJLiBFeGFtcGxlcyBjb3VsZA0KLy8vIGJlIERhcnQgaWRlbnRpZmllcnMsIGJhc2UtNjQgb3IgaGV4IGVuY29kZWQgc3RyaW5ncywgR1VJRHMgb3Igc2ltaWxhcg0KLy8vIHN0cmluZ3Mgd2l0aCBhIGtub3duIHN0cnVjdHVyZS4NCmludCBjb21wYXJlQXNjaWlMb3dlckNhc2UoU3RyaW5nIGEsIFN0cmluZyBiKSB7DQogIGludCBkZWZhdWx0UmVzdWx0ID0gMDsNCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7DQogICAgaWYgKGkgPj0gYi5sZW5ndGgpIHJldHVybiAxOw0KICAgIHZhciBhQ2hhciA9IGEuY29kZVVuaXRBdChpKTsNCiAgICB2YXIgYkNoYXIgPSBiLmNvZGVVbml0QXQoaSk7DQogICAgaWYgKGFDaGFyID09IGJDaGFyKSBjb250aW51ZTsNCiAgICBpbnQgYUxvd2VyQ2FzZSA9IGFDaGFyOw0KICAgIGludCBiTG93ZXJDYXNlID0gYkNoYXI7DQogICAgLy8gVXBwZXIgY2FzZSBpZiBBU0NJSSBsZXR0ZXJzLg0KICAgIGlmIChfdXBwZXJDYXNlQSA8PSBiQ2hhciAmJiBiQ2hhciA8PSBfdXBwZXJDYXNlWikgew0KICAgICAgYkxvd2VyQ2FzZSArPSBfYXNjaWlDYXNlQml0Ow0KICAgIH0NCiAgICBpZiAoX3VwcGVyQ2FzZUEgPD0gYUNoYXIgJiYgYUNoYXIgPD0gX3VwcGVyQ2FzZVopIHsNCiAgICAgIGFMb3dlckNhc2UgKz0gX2FzY2lpQ2FzZUJpdDsNCiAgICB9DQogICAgaWYgKGFMb3dlckNhc2UgIT0gYkxvd2VyQ2FzZSkgcmV0dXJuIChhTG93ZXJDYXNlIC0gYkxvd2VyQ2FzZSkuc2lnbjsNCiAgICBpZiAoZGVmYXVsdFJlc3VsdCA9PSAwKSBkZWZhdWx0UmVzdWx0ID0gYUNoYXIgLSBiQ2hhcjsNCiAgfQ0KICBpZiAoYi5sZW5ndGggPiBhLmxlbmd0aCkgcmV0dXJuIC0xOw0KICByZXR1cm4gZGVmYXVsdFJlc3VsdC5zaWduOw0KfQ0KDQovLy8gQ29tcGFyZXMgc3RyaW5ncyBbYV0gYW5kIFtiXSBhY2NvcmRpbmcgdG8gW25hdHVyYWwgc29ydCBvcmRlcmluZ11bXS4NCi8vLw0KLy8vIEEgbmF0dXJhbCBzb3J0IG9yZGVyaW5nIGlzIGEgbGV4aWNhbCBvcmRlcmluZyB3aGVyZSBlbWJlZGRlZA0KLy8vIG51bWVyYWxzIChkaWdpdCBzZXF1ZW5jZXMpIGFyZSB0cmVhdGVkIGFzIGEgc2luZ2xlIHVuaXQgYW5kIG9yZGVyZWQgYnkNCi8vLyBudW1lcmljYWwgdmFsdWUuDQovLy8gVGhpcyBtZWFucyB0aGF0IGAiYTEwYiJgIHdpbGwgYmUgb3JkZXJlZCBhZnRlciBgImE3YiJgIGluIG5hdHVyYWwNCi8vLyBvcmRlcmluZywgd2hlcmUgbGV4aWNhbCBvcmRlcmluZyB3b3VsZCBwdXQgdGhlIGAxYCBiZWZvcmUgdGhlIGA3YCwgaWdub3JpbmcNCi8vLyB0aGF0IHRoZSBgMWAgaXMgcGFydCBvZiBhIGxhcmdlciBudW1iZXIuDQovLy8NCi8vLyBFeGFtcGxlOg0KLy8vIFRoZSBmb2xsb3dpbmcgc3RyaW5ncyBhcmUgaW4gdGhlIG9yZGVyIHRoZXkgd291bGQgYmUgc29ydGVkIGJ5IHVzaW5nIHRoaXMNCi8vLyBjb21wYXJpc29uIGZ1bmN0aW9uOg0KLy8vDQovLy8gICAgICJhIiwgImEwIiwgImEwYiIsICJhMSIsICJhMDEiLCAiYTkiLCAiYTEwIiwgImExMDAiLCAiYTEwMGIiLCAiYWEiDQovLy8NCi8vLyBbbmF0dXJhbCBzb3J0IG9yZGVyaW5nXTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTmF0dXJhbF9zb3J0X29yZGVyDQppbnQgY29tcGFyZU5hdHVyYWwoU3RyaW5nIGEsIFN0cmluZyBiKSB7DQogIGZvciAoaW50IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgew0KICAgIGlmIChpID49IGIubGVuZ3RoKSByZXR1cm4gMTsNCiAgICB2YXIgYUNoYXIgPSBhLmNvZGVVbml0QXQoaSk7DQogICAgdmFyIGJDaGFyID0gYi5jb2RlVW5pdEF0KGkpOw0KICAgIGlmIChhQ2hhciAhPSBiQ2hhcikgew0KICAgICAgcmV0dXJuIF9jb21wYXJlTmF0dXJhbGx5KGEsIGIsIGksIGFDaGFyLCBiQ2hhcik7DQogICAgfQ0KICB9DQogIGlmIChiLmxlbmd0aCA+IGEubGVuZ3RoKSByZXR1cm4gLTE7DQogIHJldHVybiAwOw0KfQ0KDQovLy8gQ29tcGFyZXMgc3RyaW5ncyBbYV0gYW5kIFtiXSBhY2NvcmRpbmcgdG8gbG93ZXItY2FzZQ0KLy8vIFtuYXR1cmFsIHNvcnQgb3JkZXJpbmddW10uDQovLy8NCi8vLyBBU0NJSSBsZXR0ZXJzIGFyZSBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZSBiZWZvcmUgYmVpbmcgY29tcGFyZWQsIGxpa2UNCi8vLyBmb3IgW2NvbXBhcmVBc2NpaUxvd2VyQ2FzZV0sIHRoZW4gdGhlIHJlc3VsdCBpcyBjb21wYXJlZCBsaWtlIGZvcg0KLy8vIFtjb21wYXJlTmF0dXJhbF0uDQovLy8NCi8vLyBJZiB0d28gc3RyaW5ncyBkaWZmZXIgb25seSBvbiB0aGUgY2FzZSBvZiBBU0NJSSBsZXR0ZXJzLCB0aGUgb25lIHdpdGggdGhlDQovLy8gY2FwaXRhbCBsZXR0ZXIgYXQgdGhlIGZpcnN0IGRpZmZlcmVuY2Ugd2lsbCBjb21wYXJlIGFzIGxlc3MgdGhhbiB0aGUgb3RoZXINCi8vLyBzdHJpbmcuIFRoaXMgdGllLWJyZWFraW5nIGVuc3VyZXMgdGhhdCB0aGUgY29tcGFyaXNvbiBpcyBhIHRvdGFsIG9yZGVyaW5nDQovLy8gb24gc3RyaW5ncy4NCi8vLw0KLy8vIFtuYXR1cmFsIHNvcnQgb3JkZXJpbmddOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9OYXR1cmFsX3NvcnRfb3JkZXINCmludCBjb21wYXJlQXNjaWlMb3dlckNhc2VOYXR1cmFsKFN0cmluZyBhLCBTdHJpbmcgYikgew0KICBpbnQgZGVmYXVsdFJlc3VsdCA9IDA7IC8vIFJldHVybmVkIGlmIG5vIGRpZmZlcmVuY2UgZm91bmQuDQogIGZvciAoaW50IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgew0KICAgIGlmIChpID49IGIubGVuZ3RoKSByZXR1cm4gMTsNCiAgICB2YXIgYUNoYXIgPSBhLmNvZGVVbml0QXQoaSk7DQogICAgdmFyIGJDaGFyID0gYi5jb2RlVW5pdEF0KGkpOw0KICAgIGlmIChhQ2hhciA9PSBiQ2hhcikgY29udGludWU7DQogICAgaW50IGFMb3dlckNhc2UgPSBhQ2hhcjsNCiAgICBpbnQgYkxvd2VyQ2FzZSA9IGJDaGFyOw0KICAgIGlmIChfdXBwZXJDYXNlQSA8PSBhQ2hhciAmJiBhQ2hhciA8PSBfdXBwZXJDYXNlWikgew0KICAgICAgYUxvd2VyQ2FzZSArPSBfYXNjaWlDYXNlQml0Ow0KICAgIH0NCiAgICBpZiAoX3VwcGVyQ2FzZUEgPD0gYkNoYXIgJiYgYkNoYXIgPD0gX3VwcGVyQ2FzZVopIHsNCiAgICAgIGJMb3dlckNhc2UgKz0gX2FzY2lpQ2FzZUJpdDsNCiAgICB9DQogICAgaWYgKGFMb3dlckNhc2UgIT0gYkxvd2VyQ2FzZSkgew0KICAgICAgcmV0dXJuIF9jb21wYXJlTmF0dXJhbGx5KGEsIGIsIGksIGFMb3dlckNhc2UsIGJMb3dlckNhc2UpOw0KICAgIH0NCiAgICBpZiAoZGVmYXVsdFJlc3VsdCA9PSAwKSBkZWZhdWx0UmVzdWx0ID0gYUNoYXIgLSBiQ2hhcjsNCiAgfQ0KICBpZiAoYi5sZW5ndGggPiBhLmxlbmd0aCkgcmV0dXJuIC0xOw0KICByZXR1cm4gZGVmYXVsdFJlc3VsdC5zaWduOw0KfQ0KDQovLy8gQ29tcGFyZXMgc3RyaW5ncyBbYV0gYW5kIFtiXSBhY2NvcmRpbmcgdG8gdXBwZXItY2FzZQ0KLy8vIFtuYXR1cmFsIHNvcnQgb3JkZXJpbmddW10uDQovLy8NCi8vLyBBU0NJSSBsZXR0ZXJzIGFyZSBjb252ZXJ0ZWQgdG8gdXBwZXIgY2FzZSBiZWZvcmUgYmVpbmcgY29tcGFyZWQsIGxpa2UNCi8vLyBmb3IgW2NvbXBhcmVBc2NpaVVwcGVyQ2FzZV0sIHRoZW4gdGhlIHJlc3VsdCBpcyBjb21wYXJlZCBsaWtlIGZvcg0KLy8vIFtjb21wYXJlTmF0dXJhbF0uDQovLy8NCi8vLyBJZiB0d28gc3RyaW5ncyBkaWZmZXIgb25seSBvbiB0aGUgY2FzZSBvZiBBU0NJSSBsZXR0ZXJzLCB0aGUgb25lIHdpdGggdGhlDQovLy8gY2FwaXRhbCBsZXR0ZXIgYXQgdGhlIGZpcnN0IGRpZmZlcmVuY2Ugd2lsbCBjb21wYXJlIGFzIGxlc3MgdGhhbiB0aGUgb3RoZXINCi8vLyBzdHJpbmcuIFRoaXMgdGllLWJyZWFraW5nIGVuc3VyZXMgdGhhdCB0aGUgY29tcGFyaXNvbiBpcyBhIHRvdGFsIG9yZGVyaW5nDQovLy8gb24gc3RyaW5ncw0KLy8vDQovLy8gW25hdHVyYWwgc29ydCBvcmRlcmluZ106IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL05hdHVyYWxfc29ydF9vcmRlcg0KaW50IGNvbXBhcmVBc2NpaVVwcGVyQ2FzZU5hdHVyYWwoU3RyaW5nIGEsIFN0cmluZyBiKSB7DQogIGludCBkZWZhdWx0UmVzdWx0ID0gMDsNCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7DQogICAgaWYgKGkgPj0gYi5sZW5ndGgpIHJldHVybiAxOw0KICAgIHZhciBhQ2hhciA9IGEuY29kZVVuaXRBdChpKTsNCiAgICB2YXIgYkNoYXIgPSBiLmNvZGVVbml0QXQoaSk7DQogICAgaWYgKGFDaGFyID09IGJDaGFyKSBjb250aW51ZTsNCiAgICBpbnQgYVVwcGVyQ2FzZSA9IGFDaGFyOw0KICAgIGludCBiVXBwZXJDYXNlID0gYkNoYXI7DQogICAgaWYgKF9sb3dlckNhc2VBIDw9IGFDaGFyICYmIGFDaGFyIDw9IF9sb3dlckNhc2VaKSB7DQogICAgICBhVXBwZXJDYXNlIC09IF9hc2NpaUNhc2VCaXQ7DQogICAgfQ0KICAgIGlmIChfbG93ZXJDYXNlQSA8PSBiQ2hhciAmJiBiQ2hhciA8PSBfbG93ZXJDYXNlWikgew0KICAgICAgYlVwcGVyQ2FzZSAtPSBfYXNjaWlDYXNlQml0Ow0KICAgIH0NCiAgICBpZiAoYVVwcGVyQ2FzZSAhPSBiVXBwZXJDYXNlKSB7DQogICAgICByZXR1cm4gX2NvbXBhcmVOYXR1cmFsbHkoYSwgYiwgaSwgYVVwcGVyQ2FzZSwgYlVwcGVyQ2FzZSk7DQogICAgfQ0KICAgIGlmIChkZWZhdWx0UmVzdWx0ID09IDApIGRlZmF1bHRSZXN1bHQgPSBhQ2hhciAtIGJDaGFyOw0KICB9DQogIGlmIChiLmxlbmd0aCA+IGEubGVuZ3RoKSByZXR1cm4gLTE7DQogIHJldHVybiBkZWZhdWx0UmVzdWx0LnNpZ247DQp9DQoNCi8vLyBDaGVjayBmb3IgbnVtYmVycyBvdmVybGFwcGluZyB0aGUgY3VycmVudCBtaXNtYXRjaGVkIGNoYXJhY3RlcnMuDQovLy8NCi8vLyBJZiBib3RoIFthQ2hhcl0gYW5kIFtiQ2hhcl0gYXJlIGRpZ2l0cywgdXNlIG51bWVyaWNhbCBjb21wYXJpc29uLg0KLy8vIENoZWNrIGlmIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXJzIGlzIGEgbm9uLXplcm8gbnVtYmVyLCBhbmQgaWYgbm90LA0KLy8vIHNraXAgLSBidXQgY291bnQgLSBsZWFkaW5nIHplcm9zIGJlZm9yZSBjb21wYXJpbmcgbnVtYmVycy4NCi8vLw0KLy8vIElmIG9uZSBpcyBhIGRpZ2l0IGFuZCB0aGUgb3RoZXIgaXNuJ3QsIGNoZWNrIGlmIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXINCi8vLyBpcyBhIGRpZ2l0LCBhbmQgaWYgc28sIHRoZSB0aGUgb25lIHdpdGggdGhlIGRpZ2l0IGlzIHRoZSBncmVhdGVyIG51bWJlci4NCi8vLw0KLy8vIE90aGVyd2lzZSBqdXN0IHJldHVybnMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBbYUNoYXJdIGFuZCBbYkNoYXJdLg0KaW50IF9jb21wYXJlTmF0dXJhbGx5KFN0cmluZyBhLCBTdHJpbmcgYiwgaW50IGluZGV4LCBpbnQgYUNoYXIsIGludCBiQ2hhcikgew0KICBhc3NlcnQoYUNoYXIgIT0gYkNoYXIpOw0KICB2YXIgYUlzRGlnaXQgPSBfaXNEaWdpdChhQ2hhcik7DQogIHZhciBiSXNEaWdpdCA9IF9pc0RpZ2l0KGJDaGFyKTsNCiAgaWYgKGFJc0RpZ2l0KSB7DQogICAgaWYgKGJJc0RpZ2l0KSB7DQogICAgICByZXR1cm4gX2NvbXBhcmVOdW1lcmljYWxseShhLCBiLCBhQ2hhciwgYkNoYXIsIGluZGV4KTsNCiAgICB9IGVsc2UgaWYgKGluZGV4ID4gMCAmJiBfaXNEaWdpdChhLmNvZGVVbml0QXQoaW5kZXggLSAxKSkpIHsNCiAgICAgIC8vIGFDaGFyIGlzIHRoZSBjb250aW51YXRpb24gb2YgYSBsb25nZXIgbnVtYmVyLg0KICAgICAgcmV0dXJuIDE7DQogICAgfQ0KICB9IGVsc2UgaWYgKGJJc0RpZ2l0ICYmIGluZGV4ID4gMCAmJiBfaXNEaWdpdChiLmNvZGVVbml0QXQoaW5kZXggLSAxKSkpIHsNCiAgICAvLyBiQ2hhciBpcyB0aGUgY29udGludWF0aW9uIG9mIGEgbG9uZ2VyIG51bWJlci4NCiAgICByZXR1cm4gLTE7DQogIH0NCiAgLy8gQ2hhcmFjdGVycyBhcmUgYm90aCBub24tZGlnaXRzLCBvciBub3QgY29udGludWF0aW9uIG9mIGVhcmxpZXIgbnVtYmVyLg0KICByZXR1cm4gKGFDaGFyIC0gYkNoYXIpLnNpZ247DQp9DQoNCi8vLyBDb21wYXJlIG51bWJlcnMgb3ZlcmxhcHBpbmcgW2FDaGFyXSBhbmQgW2JDaGFyXSBudW1lcmljYWxseS4NCi8vLw0KLy8vIElmIHRoZSBudW1iZXJzIGhhdmUgdGhlIHNhbWUgbnVtZXJpY2FsIHZhbHVlLCBidXQgb25lIGhhcyBtb3JlIGxlYWRpbmcNCi8vLyB6ZXJvcywgdGhlIGxvbmdlciBudW1iZXIgaXMgY29uc2lkZXJlZCBncmVhdGVyIHRoYW4gdGhlIHNob3J0ZXIgb25lLg0KLy8vDQovLy8gVGhpcyBlbnN1cmVzIGEgdG90YWwgb3JkZXJpbmcgb24gc3RyaW5ncyBjb21wYXRpYmxlIHdpdGggZXF1YWxpdHkuDQppbnQgX2NvbXBhcmVOdW1lcmljYWxseShTdHJpbmcgYSwgU3RyaW5nIGIsIGludCBhQ2hhciwgaW50IGJDaGFyLCBpbnQgaW5kZXgpIHsNCiAgLy8gQm90aCBhcmUgZGlnaXRzLiBGaW5kIHRoZSBmaXJzdCBzaWduaWZpY2FudCBkaWZmZXJlbnQgZGlnaXQsIHRoZW4gZmluZA0KICAvLyB0aGUgbGVuZ3RoIG9mIHRoZSBudW1iZXJzLg0KICBpZiAoX2lzTm9uWmVyb051bWJlclN1ZmZpeChhLCBpbmRleCkpIHsNCiAgICAvLyBQYXJ0IG9mIGEgbG9uZ2VyIG51bWJlciwgZGlmZmVycyBhdCB0aGlzIGluZGV4LCBqdXN0IGNvdW50IHRoZSBsZW5ndGguDQogICAgaW50IHJlc3VsdCA9IF9jb21wYXJlRGlnaXRDb3VudChhLCBiLCBpbmRleCwgaW5kZXgpOw0KICAgIGlmIChyZXN1bHQgIT0gMCkgcmV0dXJuIHJlc3VsdDsNCiAgICAvLyBJZiBzYW1lIGxlbmd0aCwgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGlzIHRoZSBtb3N0IHNpZ25pZmljYW50IGRpZmZlcmluZw0KICAgIC8vIGRpZ2l0Lg0KICAgIHJldHVybiAoYUNoYXIgLSBiQ2hhcikuc2lnbjsNCiAgfQ0KICAvLyBOb3QgcGFydCBvZiBsYXJnZXIgKG5vbi16ZXJvKSBudW1iZXIsIHNvIHNraXAgbGVhZGluZyB6ZXJvcyBiZWZvcmUNCiAgLy8gY29tcGFyaW5nIG51bWJlcnMuDQogIGludCBhSW5kZXggPSBpbmRleDsNCiAgaW50IGJJbmRleCA9IGluZGV4Ow0KICBpZiAoYUNoYXIgPT0gX3plcm8pIHsNCiAgICBkbyB7DQogICAgICBhSW5kZXgrKzsNCiAgICAgIGlmIChhSW5kZXggPT0gYS5sZW5ndGgpIHJldHVybiAtMTsgLy8gbnVtYmVyIGluIGEgaXMgemVybywgYiBpcyBub3QuDQogICAgICBhQ2hhciA9IGEuY29kZVVuaXRBdChhSW5kZXgpOw0KICAgIH0gd2hpbGUgKGFDaGFyID09IF96ZXJvKTsNCiAgICBpZiAoIV9pc0RpZ2l0KGFDaGFyKSkgcmV0dXJuIC0xOw0KICB9IGVsc2UgaWYgKGJDaGFyID09IF96ZXJvKSB7DQogICAgZG8gew0KICAgICAgYkluZGV4Kys7DQogICAgICBpZiAoYkluZGV4ID09IGIubGVuZ3RoKSByZXR1cm4gMTsgLy8gbnVtYmVyIGluIGIgaXMgemVybywgYSBpcyBub3QuDQogICAgICBiQ2hhciA9IGIuY29kZVVuaXRBdChiSW5kZXgpOw0KICAgIH0gd2hpbGUgKGJDaGFyID09IF96ZXJvKTsNCiAgICBpZiAoIV9pc0RpZ2l0KGJDaGFyKSkgcmV0dXJuIDE7DQogIH0NCiAgaWYgKGFDaGFyICE9IGJDaGFyKSB7DQogICAgaW50IHJlc3VsdCA9IF9jb21wYXJlRGlnaXRDb3VudChhLCBiLCBhSW5kZXgsIGJJbmRleCk7DQogICAgaWYgKHJlc3VsdCAhPSAwKSByZXR1cm4gcmVzdWx0Ow0KICAgIHJldHVybiAoYUNoYXIgLSBiQ2hhcikuc2lnbjsNCiAgfQ0KICAvLyBTYW1lIGxlYWRpbmcgZGlnaXQsIG9uZSBoYWQgbW9yZSBsZWFkaW5nIHplcm9zLg0KICAvLyBDb21wYXJlIGRpZ2l0cyB1bnRpbCByZWFjaGluZyBhIGRpZmZlcmVuY2UuDQogIHdoaWxlICh0cnVlKSB7DQogICAgdmFyIGFJc0RpZ2l0ID0gZmFsc2U7DQogICAgdmFyIGJJc0RpZ2l0ID0gZmFsc2U7DQogICAgYUNoYXIgPSAwOw0KICAgIGJDaGFyID0gMDsNCiAgICBpZiAoKythSW5kZXggPCBhLmxlbmd0aCkgew0KICAgICAgYUNoYXIgPSBhLmNvZGVVbml0QXQoYUluZGV4KTsNCiAgICAgIGFJc0RpZ2l0ID0gX2lzRGlnaXQoYUNoYXIpOw0KICAgIH0NCiAgICBpZiAoKytiSW5kZXggPCBiLmxlbmd0aCkgew0KICAgICAgYkNoYXIgPSBiLmNvZGVVbml0QXQoYkluZGV4KTsNCiAgICAgIGJJc0RpZ2l0ID0gX2lzRGlnaXQoYkNoYXIpOw0KICAgIH0NCiAgICBpZiAoYUlzRGlnaXQpIHsNCiAgICAgIGlmIChiSXNEaWdpdCkgew0KICAgICAgICBpZiAoYUNoYXIgPT0gYkNoYXIpIGNvbnRpbnVlOw0KICAgICAgICAvLyBGaXJzdCBkaWZmZXJlbnQgZGlnaXQgZm91bmQuDQogICAgICAgIGJyZWFrOw0KICAgICAgfQ0KICAgICAgLy8gYkNoYXIgaXMgbm9uLWRpZ2l0LCBzbyBhIGhhcyBsb25nZXIgbnVtYmVyLg0KICAgICAgcmV0dXJuIDE7DQogICAgfSBlbHNlIGlmIChiSXNEaWdpdCkgew0KICAgICAgcmV0dXJuIC0xOyAvLyBiIGhhcyBsb25nZXIgbnVtYmVyLg0KICAgIH0gZWxzZSB7DQogICAgICAvLyBOZWl0aGVyIGlzIGRpZ2l0LCBzbyBudW1iZXJzIGhhZCBzYW1lIG51bWVyaWNhbCB2YWx1ZS4NCiAgICAgIC8vIEZhbGwgYmFjayBvbiBudW1iZXIgb2YgbGVhZGluZyB6ZXJvcw0KICAgICAgLy8gKHJlZmxlY3RlZCBieSBkaWZmZXJlbmNlIGluIGluZGljZXMpLg0KICAgICAgcmV0dXJuIChhSW5kZXggLSBiSW5kZXgpLnNpZ247DQogICAgfQ0KICB9DQogIC8vIEF0IGZpcnN0IGRpZmZlcmluZyBkaWdpdHMuDQogIGludCByZXN1bHQgPSBfY29tcGFyZURpZ2l0Q291bnQoYSwgYiwgYUluZGV4LCBiSW5kZXgpOw0KICBpZiAocmVzdWx0ICE9IDApIHJldHVybiByZXN1bHQ7DQogIHJldHVybiAoYUNoYXIgLSBiQ2hhcikuc2lnbjsNCn0NCg0KLy8vIENoZWNrcyB3aGljaCBvZiBbYV0gYW5kIFtiXSBoYXMgdGhlIGxvbmdlc3Qgc2VxdWVuY2Ugb2YgZGlnaXRzLg0KLy8vDQovLy8gU3RhcnRzIGNvdW50aW5nIGZyb20gYGkgKyAxYCBhbmQgYGogKyAxYCAoYXNzdW1lcyB0aGF0IGBhW2ldYCBhbmQgYGJbal1gIGFyZQ0KLy8vIGJvdGggYWxyZWFkeSBrbm93biB0byBiZSBkaWdpdHMpLg0KaW50IF9jb21wYXJlRGlnaXRDb3VudChTdHJpbmcgYSwgU3RyaW5nIGIsIGludCBpLCBpbnQgaikgew0KICB3aGlsZSAoKytpIDwgYS5sZW5ndGgpIHsNCiAgICBib29sIGFJc0RpZ2l0ID0gX2lzRGlnaXQoYS5jb2RlVW5pdEF0KGkpKTsNCiAgICBpZiAoKytqID09IGIubGVuZ3RoKSByZXR1cm4gYUlzRGlnaXQgPyAxIDogMDsNCiAgICBib29sIGJJc0RpZ2l0ID0gX2lzRGlnaXQoYi5jb2RlVW5pdEF0KGopKTsNCiAgICBpZiAoYUlzRGlnaXQpIHsNCiAgICAgIGlmIChiSXNEaWdpdCkgY29udGludWU7DQogICAgICByZXR1cm4gMTsNCiAgICB9IGVsc2UgaWYgKGJJc0RpZ2l0KSB7DQogICAgICByZXR1cm4gLTE7DQogICAgfSBlbHNlIHsNCiAgICAgIHJldHVybiAwOw0KICAgIH0NCiAgfQ0KICBpZiAoKytqIDwgYi5sZW5ndGggJiYgX2lzRGlnaXQoYi5jb2RlVW5pdEF0KGopKSkgew0KICAgIHJldHVybiAtMTsNCiAgfQ0KICByZXR1cm4gMDsNCn0NCg0KYm9vbCBfaXNEaWdpdChpbnQgY2hhckNvZGUpID0+IChjaGFyQ29kZSBeIF96ZXJvKSA8PSA5Ow0KDQovLy8gQ2hlY2sgaWYgdGhlIGRpZ2l0IGF0IFtpbmRleF0gaXMgY29udGludWluZyBhIG5vbi16ZXJvIG51bWJlci4NCi8vLw0KLy8vIElmIHRoZXJlIGlzIG5vIG5vbi16ZXJvIGRpZ2l0cyBiZWZvcmUsIHRoZW4gbGVhZGluZyB6ZXJvcyBhdCBbaW5kZXhdDQovLy8gYXJlIGFsc28gaWdub3JlZCB3aGVuIGNvbXBhcmluZyBudW1lcmljYWxseS4gSWYgdGhlcmUgaXMgYSBub24temVybyBkaWdpdA0KLy8vIGJlZm9yZSwgdGhlbiB6ZXJvcyBhdCBbaW5kZXhdIGFyZSBzaWduaWZpY2FudC4NCmJvb2wgX2lzTm9uWmVyb051bWJlclN1ZmZpeChTdHJpbmcgc3RyaW5nLCBpbnQgaW5kZXgpIHsNCiAgd2hpbGUgKC0taW5kZXggPj0gMCkgew0KICAgIGludCBjaGFyID0gc3RyaW5nLmNvZGVVbml0QXQoaW5kZXgpOw0KICAgIGlmIChjaGFyICE9IF96ZXJvKSByZXR1cm4gX2lzRGlnaXQoY2hhcik7DQogIH0NCiAgcmV0dXJuIGZhbHNlOw0KfQ0KgYsAT089AhkZHx8fHyECTQVLUEEFRjUjBVFMSyUyKygiIiNQN04QMUsRBxMFEAMCTgVMOSpPHU0MES0mPUkYTCg/EQU8ED0DAk0FSzgFT1BPMQVRTEslMT4oIiIiIx8dHTkkBzkkB0o+BSceAwJNBUs4BU9QTxEFUUxLJTEaKCIiIiMdHSU5JAc5JAdKPAUnHgMCSgVCTBZHUS4FDk8aBUsFTyooIiIiGzgHBScNAwI6IAVLRxcFT1BPEQVPOD4oIiIiIx0dOSQHOSQHJUIHPAUnHgMCOiAFS0cXBU9QTxAFTzgaKCIiIiMdHTkkBzkkByVCBzwFJx4DAkYFR0hABUxOBUhOGyMjExU+QjgRB0w2EAVNIAMCQgVMSgVIUE0hK086JVAPIgVJGRcXGQoRTCUfJiAKEUslHyUFGTwlIgU2MhIbGxAQICUjByAlIwcVFycpEAk2ERwqDkEvMCYHBSE6IyADAkUFUic8HDAzMBUfERwSDhEHBTYQBQ0DAjkCRAVKTzQ5GiovBREDASdwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2NvbXBhcmF0b3JzLmRhcnQ5c2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NvbGxlY3Rpb24vbGliL3NyYy9lcXVhbGl0eS5kYXJ0u/MvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICJkYXJ0OmNvbGxlY3Rpb24iOwoKaW1wb3J0ICJjb21wYXJhdG9ycy5kYXJ0IjsKCmNvbnN0IGludCBfSEFTSF9NQVNLID0gMHg3ZmZmZmZmZjsKCi8vLyBBIGdlbmVyaWMgZXF1YWxpdHkgcmVsYXRpb24gb24gb2JqZWN0cy4KYWJzdHJhY3QgY2xhc3MgRXF1YWxpdHk8RT4gewogIGNvbnN0IGZhY3RvcnkgRXF1YWxpdHkoKSA9IERlZmF1bHRFcXVhbGl0eTxFPjsKCiAgLy8vIENvbXBhcmUgdHdvIGVsZW1lbnRzIGZvciBiZWluZyBlcXVhbC4KICAvLy8KICAvLy8gVGhpcyBzaG91bGQgYmUgYSBwcm9wZXIgZXF1YWxpdHkgcmVsYXRpb24uCiAgYm9vbCBlcXVhbHMoRSBlMSwgRSBlMik7CgogIC8vLyBHZXQgYSBoYXNoY29kZSBvZiBhbiBlbGVtZW50LgogIC8vLwogIC8vLyBUaGUgaGFzaGNvZGUgc2hvdWxkIGJlIGNvbXBhdGlibGUgd2l0aCBbZXF1YWxzXSwgc28gdGhhdCBpZgogIC8vLyBgZXF1YWxzKGEsIGIpYCB0aGVuIGBoYXNoKGEpID09IGhhc2goYilgLgogIGludCBoYXNoKEUgZSk7CgogIC8vLyBUZXN0IHdoZXRoZXIgYW4gb2JqZWN0IGlzIGEgdmFsaWQgYXJndW1lbnQgdG8gW2VxdWFsc10gYW5kIFtoYXNoXS4KICAvLy8KICAvLy8gU29tZSBpbXBsZW1lbnRhdGlvbnMgbWF5IGJlIHJlc3RyaWN0ZWQgdG8gb25seSB3b3JrIG9uIHNwZWNpZmljIHR5cGVzCiAgLy8vIG9mIG9iamVjdHMuCiAgYm9vbCBpc1ZhbGlkS2V5KE9iamVjdCBvKTsKfQoKdHlwZWRlZiBGIF9HZXRLZXk8RSwgRj4oRSBvYmplY3QpOwoKLy8vIEVxdWFsaXR5IG9mIG9iamVjdHMgYmFzZWQgb24gZGVyaXZlZCB2YWx1ZXMuCi8vLwovLy8gRm9yIGV4YW1wbGUsIGdpdmVuIHRoZSBjbGFzczoKLy8vIGBgYGRhcnQKLy8vIGFic3RyYWN0IGNsYXNzIEVtcGxveWVlIHsKLy8vICAgaW50IGdldCBlbXBsb3ltZW50SWQ7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBUaGUgZm9sbG93aW5nIFtFcXVhbGl0eV0gY29uc2lkZXJzIGVtcGxveWVlcyB3aXRoIHRoZSBzYW1lIElEcyB0byBiZSBlcXVhbDoKLy8vIGBgYGRhcnQKLy8vIG5ldyBFcXVhbGl0eUJ5KChFbXBsb3llZSBlKSA9PiBlLmVtcGxveW1lbnRJZCk7Ci8vLyBgYGAKLy8vCi8vLyBJdCdzIGFsc28gcG9zc2libGUgdG8gcGFzcyBhbiBhZGRpdGlvbmFsIGVxdWFsaXR5IGluc3RhbmNlIHRoYXQgc2hvdWxkIGJlCi8vLyB1c2VkIHRvIGNvbXBhcmUgdGhlIHZhbHVlIGl0c2VsZi4KY2xhc3MgRXF1YWxpdHlCeTxFLCBGPiBpbXBsZW1lbnRzIEVxdWFsaXR5PEU+IHsKICAvLyBSZXR1cm5zIGEgZGVyaXZlZCB2YWx1ZSBGIGZyb20gYW4gb2JqZWN0IEUuCiAgZmluYWwgX0dldEtleTxFLCBGPiBfZ2V0S2V5OwoKICAvLyBEZXRlcm1pbmVzIGVxdWFsaXR5IGJldHdlZW4gdHdvIHZhbHVlcyBvZiBGLgogIGZpbmFsIEVxdWFsaXR5PEY+IF9pbm5lcjsKCiAgRXF1YWxpdHlCeShGIGdldEtleShFIG9iamVjdCksIFtFcXVhbGl0eTxGPiBpbm5lciA9IGNvbnN0IERlZmF1bHRFcXVhbGl0eSgpXSkKICAgICAgOiBfZ2V0S2V5ID0gZ2V0S2V5LAogICAgICAgIF9pbm5lciA9IGlubmVyOwoKICBib29sIGVxdWFscyhFIGUxLCBFIGUyKSA9PiBfaW5uZXIuZXF1YWxzKF9nZXRLZXkoZTEpLCBfZ2V0S2V5KGUyKSk7CgogIGludCBoYXNoKEUgZSkgPT4gX2lubmVyLmhhc2goX2dldEtleShlKSk7CgogIGJvb2wgaXNWYWxpZEtleShPYmplY3QgbykgewogICAgaWYgKG8gaXMgRSkgewogICAgICBmaW5hbCB2YWx1ZSA9IF9nZXRLZXkobyk7CiAgICAgIHJldHVybiB2YWx1ZSBpcyBGICYmIF9pbm5lci5pc1ZhbGlkS2V5KHZhbHVlKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9Cn0KCi8vLyBFcXVhbGl0eSBvZiBvYmplY3RzIHRoYXQgY29tcGFyZXMgb25seSB0aGUgbmF0dXJhbCBlcXVhbGl0eSBvZiB0aGUgb2JqZWN0cy4KLy8vCi8vLyBUaGlzIGVxdWFsaXR5IHVzZXMgdGhlIG9iamVjdHMnIG93biBbT2JqZWN0Lj09XSBhbmQgW09iamVjdC5oYXNoQ29kZV0gZm9yCi8vLyB0aGUgZXF1YWxpdHkuCi8vLwovLy8gTm90ZSB0aGF0IFtlcXVhbHNdIGFuZCBbaGFzaF0gdGFrZSBgT2JqZWN0YHMgcmF0aGVyIHRoYW4gYEVgcy4gVGhpcyBhbGxvd3MKLy8vIGBFYCB0byBiZSBpbmZlcnJlZCBhcyBgTnVsbGAgaW4gY29uc3QgY29udGV4dHMgd2hlcmUgYEVgIHdvdWxkbid0IGJlIGEKLy8vIGNvbXBpbGUtdGltZSBjb25zdGFudCwgd2hpbGUgc3RpbGwgYWxsb3dpbmcgdGhlIGNsYXNzIHRvIGJlIHVzZWQgYXQgcnVudGltZS4KY2xhc3MgRGVmYXVsdEVxdWFsaXR5PEU+IGltcGxlbWVudHMgRXF1YWxpdHk8RT4gewogIGNvbnN0IERlZmF1bHRFcXVhbGl0eSgpOwogIGJvb2wgZXF1YWxzKE9iamVjdCBlMSwgT2JqZWN0IGUyKSA9PiBlMSA9PSBlMjsKICBpbnQgaGFzaChPYmplY3QgZSkgPT4gZS5oYXNoQ29kZTsKICBib29sIGlzVmFsaWRLZXkoT2JqZWN0IG8pID0+IHRydWU7Cn0KCi8vLyBFcXVhbGl0eSBvZiBvYmplY3RzIHRoYXQgY29tcGFyZXMgb25seSB0aGUgaWRlbnRpdHkgb2YgdGhlIG9iamVjdHMuCmNsYXNzIElkZW50aXR5RXF1YWxpdHk8RT4gaW1wbGVtZW50cyBFcXVhbGl0eTxFPiB7CiAgY29uc3QgSWRlbnRpdHlFcXVhbGl0eSgpOwogIGJvb2wgZXF1YWxzKEUgZTEsIEUgZTIpID0+IGlkZW50aWNhbChlMSwgZTIpOwogIGludCBoYXNoKEUgZSkgPT4gaWRlbnRpdHlIYXNoQ29kZShlKTsKICBib29sIGlzVmFsaWRLZXkoT2JqZWN0IG8pID0+IHRydWU7Cn0KCi8vLyBFcXVhbGl0eSBvbiBpdGVyYWJsZXMuCi8vLwovLy8gVHdvIGl0ZXJhYmxlcyBhcmUgZXF1YWwgaWYgdGhleSBoYXZlIHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIG9yZGVyLgovLy8KLy8vIFRoZSBbZXF1YWxzXSBhbmQgW2hhc2hdIG1ldGhvZHMgYWNjZXB0cyBgbnVsbGAgdmFsdWVzLAovLy8gZXZlbiBpZiB0aGUgW2lzVmFsaWRLZXldIHJldHVybnMgYGZhbHNlYCBmb3IgYG51bGxgLgovLy8gVGhlIFtoYXNoXSBvZiBgbnVsbGAgaXMgYG51bGwuaGFzaENvZGVgLgpjbGFzcyBJdGVyYWJsZUVxdWFsaXR5PEU+IGltcGxlbWVudHMgRXF1YWxpdHk8SXRlcmFibGU8RT4+IHsKICBmaW5hbCBFcXVhbGl0eTxFPiBfZWxlbWVudEVxdWFsaXR5OwogIGNvbnN0IEl0ZXJhYmxlRXF1YWxpdHkoCiAgICAgIFtFcXVhbGl0eTxFPiBlbGVtZW50RXF1YWxpdHkgPSBjb25zdCBEZWZhdWx0RXF1YWxpdHkoKV0pCiAgICAgIDogX2VsZW1lbnRFcXVhbGl0eSA9IGVsZW1lbnRFcXVhbGl0eTsKCiAgYm9vbCBlcXVhbHMoSXRlcmFibGU8RT4gZWxlbWVudHMxLCBJdGVyYWJsZTxFPiBlbGVtZW50czIpIHsKICAgIGlmIChpZGVudGljYWwoZWxlbWVudHMxLCBlbGVtZW50czIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChlbGVtZW50czEgPT0gbnVsbCB8fCBlbGVtZW50czIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgdmFyIGl0MSA9IGVsZW1lbnRzMS5pdGVyYXRvcjsKICAgIHZhciBpdDIgPSBlbGVtZW50czIuaXRlcmF0b3I7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBib29sIGhhc05leHQgPSBpdDEubW92ZU5leHQoKTsKICAgICAgaWYgKGhhc05leHQgIT0gaXQyLm1vdmVOZXh0KCkpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKCFoYXNOZXh0KSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKCFfZWxlbWVudEVxdWFsaXR5LmVxdWFscyhpdDEuY3VycmVudCwgaXQyLmN1cnJlbnQpKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICBpbnQgaGFzaChJdGVyYWJsZTxFPiBlbGVtZW50cykgewogICAgaWYgKGVsZW1lbnRzID09IG51bGwpIHJldHVybiBudWxsLmhhc2hDb2RlOwogICAgLy8gSmVua2lucydzIG9uZS1hdC1hLXRpbWUgaGFzaCBmdW5jdGlvbi4KICAgIGludCBoYXNoID0gMDsKICAgIGZvciAoRSBlbGVtZW50IGluIGVsZW1lbnRzKSB7CiAgICAgIGludCBjID0gX2VsZW1lbnRFcXVhbGl0eS5oYXNoKGVsZW1lbnQpOwogICAgICBoYXNoID0gKGhhc2ggKyBjKSAmIF9IQVNIX01BU0s7CiAgICAgIGhhc2ggPSAoaGFzaCArIChoYXNoIDw8IDEwKSkgJiBfSEFTSF9NQVNLOwogICAgICBoYXNoIF49IChoYXNoID4+IDYpOwogICAgfQogICAgaGFzaCA9IChoYXNoICsgKGhhc2ggPDwgMykpICYgX0hBU0hfTUFTSzsKICAgIGhhc2ggXj0gKGhhc2ggPj4gMTEpOwogICAgaGFzaCA9IChoYXNoICsgKGhhc2ggPDwgMTUpKSAmIF9IQVNIX01BU0s7CiAgICByZXR1cm4gaGFzaDsKICB9CgogIGJvb2wgaXNWYWxpZEtleShPYmplY3QgbykgPT4gbyBpcyBJdGVyYWJsZTxFPjsKfQoKLy8vIEVxdWFsaXR5IG9uIGxpc3RzLgovLy8KLy8vIFR3byBsaXN0cyBhcmUgZXF1YWwgaWYgdGhleSBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhbmQgdGhlaXIgZWxlbWVudHMKLy8vIGF0IGVhY2ggaW5kZXggYXJlIGVxdWFsLgovLy8KLy8vIFRoaXMgaXMgZWZmZWN0aXZlbHkgdGhlIHNhbWUgYXMgW0l0ZXJhYmxlRXF1YWxpdHldIGV4Y2VwdCB0aGF0IGl0Ci8vLyBhY2Nlc3NlcyBlbGVtZW50cyBieSBpbmRleCBpbnN0ZWFkIG9mIHRocm91Z2ggaXRlcmF0aW9uLgovLy8KLy8vIFRoZSBbZXF1YWxzXSBhbmQgW2hhc2hdIG1ldGhvZHMgYWNjZXB0cyBgbnVsbGAgdmFsdWVzLAovLy8gZXZlbiBpZiB0aGUgW2lzVmFsaWRLZXldIHJldHVybnMgYGZhbHNlYCBmb3IgYG51bGxgLgovLy8gVGhlIFtoYXNoXSBvZiBgbnVsbGAgaXMgYG51bGwuaGFzaENvZGVgLgpjbGFzcyBMaXN0RXF1YWxpdHk8RT4gaW1wbGVtZW50cyBFcXVhbGl0eTxMaXN0PEU+PiB7CiAgZmluYWwgRXF1YWxpdHk8RT4gX2VsZW1lbnRFcXVhbGl0eTsKICBjb25zdCBMaXN0RXF1YWxpdHkoW0VxdWFsaXR5PEU+IGVsZW1lbnRFcXVhbGl0eSA9IGNvbnN0IERlZmF1bHRFcXVhbGl0eSgpXSkKICAgICAgOiBfZWxlbWVudEVxdWFsaXR5ID0gZWxlbWVudEVxdWFsaXR5OwoKICBib29sIGVxdWFscyhMaXN0PEU+IGxpc3QxLCBMaXN0PEU+IGxpc3QyKSB7CiAgICBpZiAoaWRlbnRpY2FsKGxpc3QxLCBsaXN0MikpIHJldHVybiB0cnVlOwogICAgaWYgKGxpc3QxID09IG51bGwgfHwgbGlzdDIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgaW50IGxlbmd0aCA9IGxpc3QxLmxlbmd0aDsKICAgIGlmIChsZW5ndGggIT0gbGlzdDIubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICghX2VsZW1lbnRFcXVhbGl0eS5lcXVhbHMobGlzdDFbaV0sIGxpc3QyW2ldKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBpbnQgaGFzaChMaXN0PEU+IGxpc3QpIHsKICAgIGlmIChsaXN0ID09IG51bGwpIHJldHVybiBudWxsLmhhc2hDb2RlOwogICAgLy8gSmVua2lucydzIG9uZS1hdC1hLXRpbWUgaGFzaCBmdW5jdGlvbi4KICAgIC8vIFRoaXMgY29kZSBpcyBhbG1vc3QgaWRlbnRpY2FsIHRvIHRoZSBvbmUgaW4gSXRlcmFibGVFcXVhbGl0eSwgZXhjZXB0CiAgICAvLyB0aGF0IGl0IHVzZXMgaW5kZXhpbmcgaW5zdGVhZCBvZiBpdGVyYXRpbmcgdG8gZ2V0IHRoZSBlbGVtZW50cy4KICAgIGludCBoYXNoID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICBpbnQgYyA9IF9lbGVtZW50RXF1YWxpdHkuaGFzaChsaXN0W2ldKTsKICAgICAgaGFzaCA9IChoYXNoICsgYykgJiBfSEFTSF9NQVNLOwogICAgICBoYXNoID0gKGhhc2ggKyAoaGFzaCA8PCAxMCkpICYgX0hBU0hfTUFTSzsKICAgICAgaGFzaCBePSAoaGFzaCA+PiA2KTsKICAgIH0KICAgIGhhc2ggPSAoaGFzaCArIChoYXNoIDw8IDMpKSAmIF9IQVNIX01BU0s7CiAgICBoYXNoIF49IChoYXNoID4+IDExKTsKICAgIGhhc2ggPSAoaGFzaCArIChoYXNoIDw8IDE1KSkgJiBfSEFTSF9NQVNLOwogICAgcmV0dXJuIGhhc2g7CiAgfQoKICBib29sIGlzVmFsaWRLZXkoT2JqZWN0IG8pID0+IG8gaXMgTGlzdDxFPjsKfQoKYWJzdHJhY3QgY2xhc3MgX1Vub3JkZXJlZEVxdWFsaXR5PEUsIFQgZXh0ZW5kcyBJdGVyYWJsZTxFPj4KICAgIGltcGxlbWVudHMgRXF1YWxpdHk8VD4gewogIGZpbmFsIEVxdWFsaXR5PEU+IF9lbGVtZW50RXF1YWxpdHk7CgogIGNvbnN0IF9Vbm9yZGVyZWRFcXVhbGl0eSh0aGlzLl9lbGVtZW50RXF1YWxpdHkpOwoKICBib29sIGVxdWFscyhUIGVsZW1lbnRzMSwgVCBlbGVtZW50czIpIHsKICAgIGlmIChpZGVudGljYWwoZWxlbWVudHMxLCBlbGVtZW50czIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChlbGVtZW50czEgPT0gbnVsbCB8fCBlbGVtZW50czIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgSGFzaE1hcDxFLCBpbnQ+IGNvdW50cyA9IG5ldyBIYXNoTWFwKAogICAgICAgIGVxdWFsczogX2VsZW1lbnRFcXVhbGl0eS5lcXVhbHMsCiAgICAgICAgaGFzaENvZGU6IF9lbGVtZW50RXF1YWxpdHkuaGFzaCwKICAgICAgICBpc1ZhbGlkS2V5OiBfZWxlbWVudEVxdWFsaXR5LmlzVmFsaWRLZXkpOwogICAgaW50IGxlbmd0aCA9IDA7CiAgICBmb3IgKHZhciBlIGluIGVsZW1lbnRzMSkgewogICAgICBpbnQgY291bnQgPSBjb3VudHNbZV07CiAgICAgIGlmIChjb3VudCA9PSBudWxsKSBjb3VudCA9IDA7CiAgICAgIGNvdW50c1tlXSA9IGNvdW50ICsgMTsKICAgICAgbGVuZ3RoKys7CiAgICB9CiAgICBmb3IgKHZhciBlIGluIGVsZW1lbnRzMikgewogICAgICBpbnQgY291bnQgPSBjb3VudHNbZV07CiAgICAgIGlmIChjb3VudCA9PSBudWxsIHx8IGNvdW50ID09IDApIHJldHVybiBmYWxzZTsKICAgICAgY291bnRzW2VdID0gY291bnQgLSAxOwogICAgICBsZW5ndGgtLTsKICAgIH0KICAgIHJldHVybiBsZW5ndGggPT0gMDsKICB9CgogIGludCBoYXNoKFQgZWxlbWVudHMpIHsKICAgIGlmIChlbGVtZW50cyA9PSBudWxsKSByZXR1cm4gbnVsbC5oYXNoQ29kZTsKICAgIGludCBoYXNoID0gMDsKICAgIGZvciAoRSBlbGVtZW50IGluIGVsZW1lbnRzKSB7CiAgICAgIGludCBjID0gX2VsZW1lbnRFcXVhbGl0eS5oYXNoKGVsZW1lbnQpOwogICAgICBoYXNoID0gKGhhc2ggKyBjKSAmIF9IQVNIX01BU0s7CiAgICB9CiAgICBoYXNoID0gKGhhc2ggKyAoaGFzaCA8PCAzKSkgJiBfSEFTSF9NQVNLOwogICAgaGFzaCBePSAoaGFzaCA+PiAxMSk7CiAgICBoYXNoID0gKGhhc2ggKyAoaGFzaCA8PCAxNSkpICYgX0hBU0hfTUFTSzsKICAgIHJldHVybiBoYXNoOwogIH0KfQoKLy8vIEVxdWFsaXR5IG9mIHRoZSBlbGVtZW50cyBvZiB0d28gaXRlcmFibGVzIHdpdGhvdXQgY29uc2lkZXJpbmcgb3JkZXIuCi8vLwovLy8gVHdvIGl0ZXJhYmxlcyBhcmUgY29uc2lkZXJlZCBlcXVhbCBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLAovLy8gYW5kIHRoZSBlbGVtZW50cyBvZiBvbmUgc2V0IGNhbiBiZSBwYWlyZWQgd2l0aCB0aGUgZWxlbWVudHMKLy8vIG9mIHRoZSBvdGhlciBpdGVyYWJsZSwgc28gdGhhdCBlYWNoIHBhaXIgYXJlIGVxdWFsLgpjbGFzcyBVbm9yZGVyZWRJdGVyYWJsZUVxdWFsaXR5PEU+IGV4dGVuZHMgX1Vub3JkZXJlZEVxdWFsaXR5PEUsIEl0ZXJhYmxlPEU+PiB7CiAgY29uc3QgVW5vcmRlcmVkSXRlcmFibGVFcXVhbGl0eSgKICAgICAgW0VxdWFsaXR5PEU+IGVsZW1lbnRFcXVhbGl0eSA9IGNvbnN0IERlZmF1bHRFcXVhbGl0eSgpXSkKICAgICAgOiBzdXBlcihlbGVtZW50RXF1YWxpdHkpOwoKICBib29sIGlzVmFsaWRLZXkoT2JqZWN0IG8pID0+IG8gaXMgSXRlcmFibGU8RT47Cn0KCi8vLyBFcXVhbGl0eSBvZiBzZXRzLgovLy8KLy8vIFR3byBzZXRzIGFyZSBjb25zaWRlcmVkIGVxdWFsIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMsCi8vLyBhbmQgdGhlIGVsZW1lbnRzIG9mIG9uZSBzZXQgY2FuIGJlIHBhaXJlZCB3aXRoIHRoZSBlbGVtZW50cwovLy8gb2YgdGhlIG90aGVyIHNldCwgc28gdGhhdCBlYWNoIHBhaXIgYXJlIGVxdWFsLgovLy8KLy8vIFRoaXMgZXF1YWxpdHkgYmVoYXZlcyB0aGUgc2FtZSBhcyBbVW5vcmRlcmVkSXRlcmFibGVFcXVhbGl0eV0gZXhjZXB0IHRoYXQKLy8vIGl0IGV4cGVjdHMgc2V0cyBpbnN0ZWFkIG9mIGl0ZXJhYmxlcyBhcyBhcmd1bWVudHMuCi8vLwovLy8gVGhlIFtlcXVhbHNdIGFuZCBbaGFzaF0gbWV0aG9kcyBhY2NlcHRzIGBudWxsYCB2YWx1ZXMsCi8vLyBldmVuIGlmIHRoZSBbaXNWYWxpZEtleV0gcmV0dXJucyBgZmFsc2VgIGZvciBgbnVsbGAuCi8vLyBUaGUgW2hhc2hdIG9mIGBudWxsYCBpcyBgbnVsbC5oYXNoQ29kZWAuCmNsYXNzIFNldEVxdWFsaXR5PEU+IGV4dGVuZHMgX1Vub3JkZXJlZEVxdWFsaXR5PEUsIFNldDxFPj4gewogIGNvbnN0IFNldEVxdWFsaXR5KFtFcXVhbGl0eTxFPiBlbGVtZW50RXF1YWxpdHkgPSBjb25zdCBEZWZhdWx0RXF1YWxpdHkoKV0pCiAgICAgIDogc3VwZXIoZWxlbWVudEVxdWFsaXR5KTsKCiAgYm9vbCBpc1ZhbGlkS2V5KE9iamVjdCBvKSA9PiBvIGlzIFNldDxFPjsKfQoKLy8vIEludGVybmFsIGNsYXNzIHVzZWQgYnkgW01hcEVxdWFsaXR5XS4KLy8vCi8vLyBUaGUgY2xhc3MgcmVwcmVzZW50cyBhIG1hcCBlbnRyeSBhcyBhIHNpbmdsZSBvYmplY3QsCi8vLyB1c2luZyBhIGNvbWJpbmVkIGhhc2hDb2RlIGFuZCBlcXVhbGl0eSBvZiB0aGUga2V5IGFuZCB2YWx1ZS4KY2xhc3MgX01hcEVudHJ5IHsKICBmaW5hbCBNYXBFcXVhbGl0eSBlcXVhbGl0eTsKICBmaW5hbCBrZXk7CiAgZmluYWwgdmFsdWU7CiAgX01hcEVudHJ5KHRoaXMuZXF1YWxpdHksIHRoaXMua2V5LCB0aGlzLnZhbHVlKTsKCiAgaW50IGdldCBoYXNoQ29kZSA9PgogICAgICAoMyAqIGVxdWFsaXR5Ll9rZXlFcXVhbGl0eS5oYXNoKGtleSkgKwogICAgICAgICAgNyAqIGVxdWFsaXR5Ll92YWx1ZUVxdWFsaXR5Lmhhc2godmFsdWUpKSAmCiAgICAgIF9IQVNIX01BU0s7CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSA9PgogICAgICBvdGhlciBpcyBfTWFwRW50cnkgJiYKICAgICAgZXF1YWxpdHkuX2tleUVxdWFsaXR5LmVxdWFscyhrZXksIG90aGVyLmtleSkgJiYKICAgICAgZXF1YWxpdHkuX3ZhbHVlRXF1YWxpdHkuZXF1YWxzKHZhbHVlLCBvdGhlci52YWx1ZSk7Cn0KCi8vLyBFcXVhbGl0eSBvbiBtYXBzLgovLy8KLy8vIFR3byBtYXBzIGFyZSBlcXVhbCBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGVudHJpZXMsIGFuZCBpZiB0aGUKLy8vIGVudHJpZXMgb2YgdGhlIHR3byBtYXBzIGFyZSBwYWlyd2lzZSBlcXVhbCBvbiBib3RoIGtleSBhbmQgdmFsdWUuCi8vLwovLy8gVGhlIFtlcXVhbHNdIGFuZCBbaGFzaF0gbWV0aG9kcyBhY2NlcHRzIGBudWxsYCB2YWx1ZXMsCi8vLyBldmVuIGlmIHRoZSBbaXNWYWxpZEtleV0gcmV0dXJucyBgZmFsc2VgIGZvciBgbnVsbGAuCi8vLyBUaGUgW2hhc2hdIG9mIGBudWxsYCBpcyBgbnVsbC5oYXNoQ29kZWAuCmNsYXNzIE1hcEVxdWFsaXR5PEssIFY+IGltcGxlbWVudHMgRXF1YWxpdHk8TWFwPEssIFY+PiB7CiAgZmluYWwgRXF1YWxpdHk8Sz4gX2tleUVxdWFsaXR5OwogIGZpbmFsIEVxdWFsaXR5PFY+IF92YWx1ZUVxdWFsaXR5OwogIGNvbnN0IE1hcEVxdWFsaXR5KAogICAgICB7RXF1YWxpdHk8Sz4ga2V5czogY29uc3QgRGVmYXVsdEVxdWFsaXR5KCksCiAgICAgIEVxdWFsaXR5PFY+IHZhbHVlczogY29uc3QgRGVmYXVsdEVxdWFsaXR5KCl9KQogICAgICA6IF9rZXlFcXVhbGl0eSA9IGtleXMsCiAgICAgICAgX3ZhbHVlRXF1YWxpdHkgPSB2YWx1ZXM7CgogIGJvb2wgZXF1YWxzKE1hcDxLLCBWPiBtYXAxLCBNYXA8SywgVj4gbWFwMikgewogICAgaWYgKGlkZW50aWNhbChtYXAxLCBtYXAyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAobWFwMSA9PSBudWxsIHx8IG1hcDIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgaW50IGxlbmd0aCA9IG1hcDEubGVuZ3RoOwogICAgaWYgKGxlbmd0aCAhPSBtYXAyLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogICAgTWFwPF9NYXBFbnRyeSwgaW50PiBlcXVhbEVsZW1lbnRDb3VudHMgPSBuZXcgSGFzaE1hcCgpOwogICAgZm9yIChLIGtleSBpbiBtYXAxLmtleXMpIHsKICAgICAgX01hcEVudHJ5IGVudHJ5ID0gbmV3IF9NYXBFbnRyeSh0aGlzLCBrZXksIG1hcDFba2V5XSk7CiAgICAgIGludCBjb3VudCA9IGVxdWFsRWxlbWVudENvdW50c1tlbnRyeV07CiAgICAgIGlmIChjb3VudCA9PSBudWxsKSBjb3VudCA9IDA7CiAgICAgIGVxdWFsRWxlbWVudENvdW50c1tlbnRyeV0gPSBjb3VudCArIDE7CiAgICB9CiAgICBmb3IgKEsga2V5IGluIG1hcDIua2V5cykgewogICAgICBfTWFwRW50cnkgZW50cnkgPSBuZXcgX01hcEVudHJ5KHRoaXMsIGtleSwgbWFwMltrZXldKTsKICAgICAgaW50IGNvdW50ID0gZXF1YWxFbGVtZW50Q291bnRzW2VudHJ5XTsKICAgICAgaWYgKGNvdW50ID09IG51bGwgfHwgY291bnQgPT0gMCkgcmV0dXJuIGZhbHNlOwogICAgICBlcXVhbEVsZW1lbnRDb3VudHNbZW50cnldID0gY291bnQgLSAxOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBpbnQgaGFzaChNYXA8SywgVj4gbWFwKSB7CiAgICBpZiAobWFwID09IG51bGwpIHJldHVybiBudWxsLmhhc2hDb2RlOwogICAgaW50IGhhc2ggPSAwOwogICAgZm9yIChLIGtleSBpbiBtYXAua2V5cykgewogICAgICBpbnQga2V5SGFzaCA9IF9rZXlFcXVhbGl0eS5oYXNoKGtleSk7CiAgICAgIGludCB2YWx1ZUhhc2ggPSBfdmFsdWVFcXVhbGl0eS5oYXNoKG1hcFtrZXldKTsKICAgICAgaGFzaCA9IChoYXNoICsgMyAqIGtleUhhc2ggKyA3ICogdmFsdWVIYXNoKSAmIF9IQVNIX01BU0s7CiAgICB9CiAgICBoYXNoID0gKGhhc2ggKyAoaGFzaCA8PCAzKSkgJiBfSEFTSF9NQVNLOwogICAgaGFzaCBePSAoaGFzaCA+PiAxMSk7CiAgICBoYXNoID0gKGhhc2ggKyAoaGFzaCA8PCAxNSkpICYgX0hBU0hfTUFTSzsKICAgIHJldHVybiBoYXNoOwogIH0KCiAgYm9vbCBpc1ZhbGlkS2V5KE9iamVjdCBvKSA9PiBvIGlzIE1hcDxLLCBWPjsKfQoKLy8vIENvbWJpbmVzIHNldmVyYWwgZXF1YWxpdGllcyBpbnRvIGEgc2luZ2xlIGVxdWFsaXR5LgovLy8KLy8vIFRyaWVzIGVhY2ggZXF1YWxpdHkgaW4gb3JkZXIsIHVzaW5nIFtFcXVhbGl0eS5pc1ZhbGlkS2V5XSwgYW5kIHJldHVybnMKLy8vIHRoZSByZXN1bHQgb2YgdGhlIGZpcnN0IGVxdWFsaXR5IHRoYXQgYXBwbGllcyB0byB0aGUgYXJndW1lbnQgb3IgYXJndW1lbnRzLgovLy8KLy8vIEZvciBgZXF1YWxzYCwgdGhlIGZpcnN0IGVxdWFsaXR5IHRoYXQgbWF0Y2hlcyB0aGUgZmlyc3QgYXJndW1lbnQgaXMgdXNlZCwKLy8vIGFuZCBpZiB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIGBlcXVhbHNgIGlzIG5vdCB2YWxpZCBmb3IgdGhhdCBlcXVhbGl0eSwKLy8vIGl0IHJldHVybnMgZmFsc2UuCi8vLwovLy8gQmVjYXVzZSB0aGUgZXF1YWxpdGllcyBhcmUgdHJpZWQgaW4gb3JkZXIsIHRoZXkgc2hvdWxkIGdlbmVyYWxseSB3b3JrIG9uCi8vLyBkaXNqb2ludCB0eXBlcy4gT3RoZXJ3aXNlIHRoZSBtdWx0aS1lcXVhbGl0eSBtYXkgZ2l2ZSBpbmNvbnNpc3RlbnQgcmVzdWx0cwovLy8gZm9yIGBlcXVhbHMoZTEsIGUyKWAgYW5kIGBlcXVhbHMoZTIsIGUxKWAuIFRoaXMgY2FuIGhhcHBlbiBpZiBvbmUgZXF1YWxpdHkKLy8vIGNvbnNpZGVycyBvbmx5IGBlMWAgYSB2YWxpZCBrZXksIGFuZCBub3QgYGUyYCwgYnV0IGFuIGVxdWFsaXR5IHdoaWNoIGlzCi8vLyBjaGVja2VkIGxhdGVyLCBhbGxvd3MgYm90aC4KY2xhc3MgTXVsdGlFcXVhbGl0eTxFPiBpbXBsZW1lbnRzIEVxdWFsaXR5PEU+IHsKICBmaW5hbCBJdGVyYWJsZTxFcXVhbGl0eTxFPj4gX2VxdWFsaXRpZXM7CgogIGNvbnN0IE11bHRpRXF1YWxpdHkoSXRlcmFibGU8RXF1YWxpdHk8RT4+IGVxdWFsaXRpZXMpCiAgICAgIDogX2VxdWFsaXRpZXMgPSBlcXVhbGl0aWVzOwoKICBib29sIGVxdWFscyhFIGUxLCBFIGUyKSB7CiAgICBmb3IgKEVxdWFsaXR5PEU+IGVxIGluIF9lcXVhbGl0aWVzKSB7CiAgICAgIGlmIChlcS5pc1ZhbGlkS2V5KGUxKSkgcmV0dXJuIGVxLmlzVmFsaWRLZXkoZTIpICYmIGVxLmVxdWFscyhlMSwgZTIpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgaW50IGhhc2goRSBlKSB7CiAgICBmb3IgKEVxdWFsaXR5PEU+IGVxIGluIF9lcXVhbGl0aWVzKSB7CiAgICAgIGlmIChlcS5pc1ZhbGlkS2V5KGUpKSByZXR1cm4gZXEuaGFzaChlKTsKICAgIH0KICAgIHJldHVybiAwOwogIH0KCiAgYm9vbCBpc1ZhbGlkS2V5KE9iamVjdCBvKSB7CiAgICBmb3IgKEVxdWFsaXR5PEU+IGVxIGluIF9lcXVhbGl0aWVzKSB7CiAgICAgIGlmIChlcS5pc1ZhbGlkS2V5KG8pKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9Cn0KCi8vLyBEZWVwIGVxdWFsaXR5IG9uIGNvbGxlY3Rpb25zLgovLy8KLy8vIFJlY29nbml6ZXMgbGlzdHMsIHNldHMsIGl0ZXJhYmxlcyBhbmQgbWFwcyBhbmQgY29tcGFyZXMgdGhlaXIgZWxlbWVudHMgdXNpbmcKLy8vIGRlZXAgZXF1YWxpdHkgYXMgd2VsbC4KLy8vCi8vLyBOb24taXRlcmFibGUvbWFwIG9iamVjdHMgYXJlIGNvbXBhcmVkIHVzaW5nIGEgY29uZmlndXJhYmxlIGJhc2UgZXF1YWxpdHkuCi8vLwovLy8gV29ya3MgaW4gb25lIG9mIHR3byBtb2Rlczogb3JkZXJlZCBvciB1bm9yZGVyZWQuCi8vLwovLy8gSW4gb3JkZXJlZCBtb2RlLCBsaXN0cyBhbmQgaXRlcmFibGVzIGFyZSByZXF1aXJlZCB0byBoYXZlIGVxdWFsIGVsZW1lbnRzCi8vLyBpbiB0aGUgc2FtZSBvcmRlci4gSW4gdW5vcmRlcmVkIG1vZGUsIHRoZSBvcmRlciBvZiBlbGVtZW50cyBpbiBpdGVyYWJsZXMKLy8vIGFuZCBsaXN0cyBhcmUgbm90IGltcG9ydGFudC4KLy8vCi8vLyBBIGxpc3QgaXMgb25seSBlcXVhbCB0byBhbm90aGVyIGxpc3QsIGxpa2V3aXNlIGZvciBzZXRzIGFuZCBtYXBzLiBBbGwgb3RoZXIKLy8vIGl0ZXJhYmxlcyBhcmUgY29tcGFyZWQgYXMgaXRlcmFibGVzIG9ubHkuCmNsYXNzIERlZXBDb2xsZWN0aW9uRXF1YWxpdHkgaW1wbGVtZW50cyBFcXVhbGl0eSB7CiAgZmluYWwgRXF1YWxpdHkgX2Jhc2U7CiAgZmluYWwgYm9vbCBfdW5vcmRlcmVkOwogIGNvbnN0IERlZXBDb2xsZWN0aW9uRXF1YWxpdHkoW0VxdWFsaXR5IGJhc2UgPSBjb25zdCBEZWZhdWx0RXF1YWxpdHkoKV0pCiAgICAgIDogX2Jhc2UgPSBiYXNlLAogICAgICAgIF91bm9yZGVyZWQgPSBmYWxzZTsKCiAgLy8vIENyZWF0ZXMgYSBkZWVwIGVxdWFsaXR5IG9uIGNvbGxlY3Rpb25zIHdoZXJlIHRoZSBvcmRlciBvZiBsaXN0cyBhbmQKICAvLy8gaXRlcmFibGVzIGFyZSBub3QgY29uc2lkZXJlZCBpbXBvcnRhbnQuIFRoYXQgaXMsIGxpc3RzIGFuZCBpdGVyYWJsZXMgYXJlCiAgLy8vIHRyZWF0ZWQgYXMgdW5vcmRlcmVkIGl0ZXJhYmxlcy4KICBjb25zdCBEZWVwQ29sbGVjdGlvbkVxdWFsaXR5LnVub3JkZXJlZCgKICAgICAgW0VxdWFsaXR5IGJhc2UgPSBjb25zdCBEZWZhdWx0RXF1YWxpdHkoKV0pCiAgICAgIDogX2Jhc2UgPSBiYXNlLAogICAgICAgIF91bm9yZGVyZWQgPSB0cnVlOwoKICBib29sIGVxdWFscyhlMSwgZTIpIHsKICAgIGlmIChlMSBpcyBTZXQpIHsKICAgICAgcmV0dXJuIGUyIGlzIFNldCAmJiBuZXcgU2V0RXF1YWxpdHkodGhpcykuZXF1YWxzKGUxLCBlMik7CiAgICB9CiAgICBpZiAoZTEgaXMgTWFwKSB7CiAgICAgIHJldHVybiBlMiBpcyBNYXAgJiYKICAgICAgICAgIG5ldyBNYXBFcXVhbGl0eShrZXlzOiB0aGlzLCB2YWx1ZXM6IHRoaXMpLmVxdWFscyhlMSwgZTIpOwogICAgfQogICAgaWYgKCFfdW5vcmRlcmVkKSB7CiAgICAgIGlmIChlMSBpcyBMaXN0KSB7CiAgICAgICAgcmV0dXJuIGUyIGlzIExpc3QgJiYgbmV3IExpc3RFcXVhbGl0eSh0aGlzKS5lcXVhbHMoZTEsIGUyKTsKICAgICAgfQogICAgICBpZiAoZTEgaXMgSXRlcmFibGUpIHsKICAgICAgICByZXR1cm4gZTIgaXMgSXRlcmFibGUgJiYgbmV3IEl0ZXJhYmxlRXF1YWxpdHkodGhpcykuZXF1YWxzKGUxLCBlMik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZTEgaXMgSXRlcmFibGUpIHsKICAgICAgaWYgKGUxIGlzIExpc3QgIT0gZTIgaXMgTGlzdCkgcmV0dXJuIGZhbHNlOwogICAgICByZXR1cm4gZTIgaXMgSXRlcmFibGUgJiYKICAgICAgICAgIG5ldyBVbm9yZGVyZWRJdGVyYWJsZUVxdWFsaXR5KHRoaXMpLmVxdWFscyhlMSwgZTIpOwogICAgfQogICAgcmV0dXJuIF9iYXNlLmVxdWFscyhlMSwgZTIpOwogIH0KCiAgaW50IGhhc2goT2JqZWN0IG8pIHsKICAgIGlmIChvIGlzIFNldCkgcmV0dXJuIG5ldyBTZXRFcXVhbGl0eSh0aGlzKS5oYXNoKG8pOwogICAgaWYgKG8gaXMgTWFwKSByZXR1cm4gbmV3IE1hcEVxdWFsaXR5KGtleXM6IHRoaXMsIHZhbHVlczogdGhpcykuaGFzaChvKTsKICAgIGlmICghX3Vub3JkZXJlZCkgewogICAgICBpZiAobyBpcyBMaXN0KSByZXR1cm4gbmV3IExpc3RFcXVhbGl0eSh0aGlzKS5oYXNoKG8pOwogICAgICBpZiAobyBpcyBJdGVyYWJsZSkgcmV0dXJuIG5ldyBJdGVyYWJsZUVxdWFsaXR5KHRoaXMpLmhhc2gobyk7CiAgICB9IGVsc2UgaWYgKG8gaXMgSXRlcmFibGUpIHsKICAgICAgcmV0dXJuIG5ldyBVbm9yZGVyZWRJdGVyYWJsZUVxdWFsaXR5KHRoaXMpLmhhc2gobyk7CiAgICB9CiAgICByZXR1cm4gX2Jhc2UuaGFzaChvKTsKICB9CgogIGJvb2wgaXNWYWxpZEtleShPYmplY3QgbykgPT4gbyBpcyBJdGVyYWJsZSB8fCBvIGlzIE1hcCB8fCBfYmFzZS5pc1ZhbGlkS2V5KG8pOwp9CgovLy8gU3RyaW5nIGVxdWFsaXR5IHRoYXQncyBpbnNlbnNpdGl2ZSB0byBkaWZmZXJlbmNlcyBpbiBBU0NJSSBjYXNlLgovLy8KLy8vIE5vbi1BU0NJSSBjaGFyYWN0ZXJzIGFyZSBjb21wYXJlZCBhcy1pcywgd2l0aCBubyBjb252ZXJzaW9uLgpjbGFzcyBDYXNlSW5zZW5zaXRpdmVFcXVhbGl0eSBpbXBsZW1lbnRzIEVxdWFsaXR5PFN0cmluZz4gewogIGNvbnN0IENhc2VJbnNlbnNpdGl2ZUVxdWFsaXR5KCk7CgogIGJvb2wgZXF1YWxzKFN0cmluZyBzdHJpbmcxLCBTdHJpbmcgc3RyaW5nMikgPT4KICAgICAgZXF1YWxzSWdub3JlQXNjaWlDYXNlKHN0cmluZzEsIHN0cmluZzIpOwoKICBpbnQgaGFzaChTdHJpbmcgc3RyaW5nKSA9PiBoYXNoSWdub3JlQXNjaWlDYXNlKHN0cmluZyk7CgogIGJvb2wgaXNWYWxpZEtleShPYmplY3Qgb2JqZWN0KSA9PiBvYmplY3QgaXMgU3RyaW5nOwp9CoHSAE5OPAEaARsBIwEsHTEBLAYxGwEkBkIwEQFJBkwSHQIBIwExBCIMHhwGCARQDDQIBE4mMDEfATIcAVAaGAFGASwBHhIgNQYSBAIBUAROEgRPS1EyGzEkJQIBSDMcMCglAgEbBE4EOzktPSYaPywBPjY+IiITJTMhTAYEASMwLhIiLiYxGwYuGi8RBAExAgEXBEgdBEY9BDs5LTUmTiwBLi42Hy4nRgYRBAEbLC5MRxIsLiYxGwYuGi8RBAEtAgE8HSYBMwEqNj4qKSkyFB8dJB0QBh8dNR0QBhgEARkwEiIuJgYuGi8RBAIBSQRRQDhQIz8gATECARYETEAzBE43BDs5LT1NIAEsAgEqBDlBEh4NDzIBFi01EgEkHDY6AgEWBEtGBDs5LTkiJBUyNB0hATAsNB4tPB89LSQtBh89LTUtBhEEARwrEh4sNUAGLhovEQQBLwIBOARLUAROSxYETU9PTCAwKwE4IgEcKkwGEgQBEiovBg4EAR4qKQYSBAIBIgRRGwROBDUETU0hBFAuMxgZShYcAUpPJioxFhsBGBVABhUaRAYXGEQIHEwIITIfPgYhBAEXOEwXPEQgOgYaBAFRAgFFBEE8IwExLwE6ATYCASRwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2VxdWFsaXR5LmRhcnQ9c2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NvbGxlY3Rpb24vbGliL3NyYy9lcXVhbGl0eV9tYXAuZGFydISDLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKCmltcG9ydCAnZXF1YWxpdHkuZGFydCc7CmltcG9ydCAnd3JhcHBlcnMuZGFydCc7CgovLy8gQSBbTWFwXSB3aG9zZSBrZXkgZXF1YWxpdHkgaXMgZGV0ZXJtaW5lZCBieSBhbiBbRXF1YWxpdHldIG9iamVjdC4KY2xhc3MgRXF1YWxpdHlNYXA8SywgVj4gZXh0ZW5kcyBEZWxlZ2F0aW5nTWFwPEssIFY+IHsKICAvLy8gQ3JlYXRlcyBhIG1hcCB3aXRoIGVxdWFsaXR5IGJhc2VkIG9uIFtlcXVhbGl0eV0uCiAgRXF1YWxpdHlNYXAoRXF1YWxpdHk8Sz4gZXF1YWxpdHkpCiAgICAgIDogc3VwZXIobmV3IExpbmtlZEhhc2hNYXAoCiAgICAgICAgICAgIGVxdWFsczogZXF1YWxpdHkuZXF1YWxzLAogICAgICAgICAgICBoYXNoQ29kZTogZXF1YWxpdHkuaGFzaCwKICAgICAgICAgICAgaXNWYWxpZEtleTogZXF1YWxpdHkuaXNWYWxpZEtleSkpOwoKICAvLy8gQ3JlYXRlcyBhIG1hcCB3aXRoIGVxdWFsaXR5IGJhc2VkIG9uIFtlcXVhbGl0eV0gdGhhdCBjb250YWlucyBhbGwKICAvLy8ga2V5LXZhbHVlIHBhaXJzIG9mIFtvdGhlcl0uCiAgLy8vCiAgLy8vIElmIFtvdGhlcl0gaGFzIG11bHRpcGxlIGtleXMgdGhhdCBhcmUgZXF1aXZhbGVudCBhY2NvcmRpbmcgdG8gW2VxdWFsaXR5XSwKICAvLy8gdGhlIGxhc3Qgb25lIHJlYWNoZWQgZHVyaW5nIGl0ZXJhdGlvbiB0YWtlcyBwcmVjZWRlbmNlLgogIEVxdWFsaXR5TWFwLmZyb20oRXF1YWxpdHk8Sz4gZXF1YWxpdHksIE1hcDxLLCBWPiBvdGhlcikKICAgICAgOiBzdXBlcihuZXcgTGlua2VkSGFzaE1hcCgKICAgICAgICAgICAgZXF1YWxzOiBlcXVhbGl0eS5lcXVhbHMsCiAgICAgICAgICAgIGhhc2hDb2RlOiBlcXVhbGl0eS5oYXNoLAogICAgICAgICAgICBpc1ZhbGlkS2V5OiBlcXVhbGl0eS5pc1ZhbGlkS2V5KSkgewogICAgYWRkQWxsKG90aGVyKTsKICB9Cn0KIQBOTjwBGgEYGAFGNjckISUlLwFIIgZQPjohJSUwEwQCAShwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2VxdWFsaXR5X21hcC5kYXJ0PXNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jb2xsZWN0aW9uL2xpYi9zcmMvZXF1YWxpdHlfc2V0LmRhcnSEey8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CgppbXBvcnQgJ2VxdWFsaXR5LmRhcnQnOwppbXBvcnQgJ3dyYXBwZXJzLmRhcnQnOwoKLy8vIEEgW01hcF0gd2hvc2Uga2V5IGVxdWFsaXR5IGlzIGRldGVybWluZWQgYnkgYW4gW0VxdWFsaXR5XSBvYmplY3QuCmNsYXNzIEVxdWFsaXR5U2V0PEU+IGV4dGVuZHMgRGVsZWdhdGluZ1NldDxFPiB7CiAgLy8vIENyZWF0ZXMgYSBzZXQgd2l0aCBlcXVhbGl0eSBiYXNlZCBvbiBbZXF1YWxpdHldLgogIEVxdWFsaXR5U2V0KEVxdWFsaXR5PEU+IGVxdWFsaXR5KQogICAgICA6IHN1cGVyKG5ldyBMaW5rZWRIYXNoU2V0KAogICAgICAgICAgICBlcXVhbHM6IGVxdWFsaXR5LmVxdWFscywKICAgICAgICAgICAgaGFzaENvZGU6IGVxdWFsaXR5Lmhhc2gsCiAgICAgICAgICAgIGlzVmFsaWRLZXk6IGVxdWFsaXR5LmlzVmFsaWRLZXkpKTsKCiAgLy8vIENyZWF0ZXMgYSBzZXQgd2l0aCBlcXVhbGl0eSBiYXNlZCBvbiBbZXF1YWxpdHldIHRoYXQgY29udGFpbnMgYWxsCiAgLy8vIGVsZW1lbnRzIGluIFtvdGhlcl0uCiAgLy8vCiAgLy8vIElmIFtvdGhlcl0gaGFzIG11bHRpcGxlIHZhbHVlcyB0aGF0IGFyZSBlcXVpdmFsZW50IGFjY29yZGluZyB0bwogIC8vLyBbZXF1YWxpdHldLCB0aGUgZmlyc3Qgb25lIHJlYWNoZWQgZHVyaW5nIGl0ZXJhdGlvbiB0YWtlcyBwcmVjZWRlbmNlLgogIEVxdWFsaXR5U2V0LmZyb20oRXF1YWxpdHk8RT4gZXF1YWxpdHksIEl0ZXJhYmxlPEU+IG90aGVyKQogICAgICA6IHN1cGVyKG5ldyBMaW5rZWRIYXNoU2V0KAogICAgICAgICAgICBlcXVhbHM6IGVxdWFsaXR5LmVxdWFscywKICAgICAgICAgICAgaGFzaENvZGU6IGVxdWFsaXR5Lmhhc2gsCiAgICAgICAgICAgIGlzVmFsaWRLZXk6IGVxdWFsaXR5LmlzVmFsaWRLZXkpKSB7CiAgICBhZGRBbGwob3RoZXIpOwogIH0KfQohAE5OPAEaARgYAUYwNyQhJSUvAUgbBkZLPCElJTATBAIBKHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvZXF1YWxpdHlfc2V0LmRhcnQ6c2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NvbGxlY3Rpb24vbGliL3NyYy9mdW5jdGlvbnMuZGFydJvHLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKaW1wb3J0ICdkYXJ0Om1hdGgnIGFzIG1hdGg7CgppbXBvcnQgJ3V0aWxzLmRhcnQnOwoKLy8gVE9ETyhud2Vpeik6IFdoZW4gc2RrIzI2NDg4IGlzIGZpeGVkLCB1c2Ugb3ZlcmxvYWRzIHRvIGVuc3VyZSB0aGF0IGlmIFtrZXldCi8vIG9yIFt2YWx1ZV0gaXNuJ3QgcGFzc2VkLCBgSzJgL2BWMmAgZGVmYXVsdHMgdG8gYEsxYC9gVjFgLCByZXNwZWN0aXZlbHkuCi8vLyBDcmVhdGVzIGEgbmV3IG1hcCBmcm9tIFttYXBdIHdpdGggbmV3IGtleXMgYW5kIHZhbHVlcy4KLy8vCi8vLyBUaGUgcmV0dXJuIHZhbHVlcyBvZiBba2V5XSBhcmUgdXNlZCBhcyB0aGUga2V5cyBhbmQgdGhlIHJldHVybiB2YWx1ZXMgb2YKLy8vIFt2YWx1ZV0gYXJlIHVzZWQgYXMgdGhlIHZhbHVlcyBmb3IgdGhlIG5ldyBtYXAuCk1hcDxLMiwgVjI+IG1hcE1hcDxLMSwgVjEsIEsyLCBWMj4oTWFwPEsxLCBWMT4gbWFwLAogICAge0syIGtleShLMSBrZXksIFYxIHZhbHVlKSwgVjIgdmFsdWUoSzEga2V5LCBWMSB2YWx1ZSl9KSB7CiAga2V5ID8/PSAobWFwS2V5LCBfKSA9PiBtYXBLZXkgYXMgSzI7CiAgdmFsdWUgPz89IChfLCBtYXBWYWx1ZSkgPT4gbWFwVmFsdWUgYXMgVjI7CgogIHZhciByZXN1bHQgPSA8SzIsIFYyPnt9OwogIG1hcC5mb3JFYWNoKChtYXBLZXksIG1hcFZhbHVlKSB7CiAgICByZXN1bHRba2V5KG1hcEtleSwgbWFwVmFsdWUpXSA9IHZhbHVlKG1hcEtleSwgbWFwVmFsdWUpOwogIH0pOwogIHJldHVybiByZXN1bHQ7Cn0KCi8vLyBSZXR1cm5zIGEgbmV3IG1hcCB3aXRoIGFsbCBrZXkvdmFsdWUgcGFpcnMgaW4gYm90aCBbbWFwMV0gYW5kIFttYXAyXS4KLy8vCi8vLyBJZiB0aGVyZSBhcmUga2V5cyB0aGF0IG9jY3VyIGluIGJvdGggbWFwcywgdGhlIFt2YWx1ZV0gZnVuY3Rpb24gaXMgdXNlZCB0bwovLy8gc2VsZWN0IHRoZSB2YWx1ZSB0aGF0IGdvZXMgaW50byB0aGUgcmVzdWx0aW5nIG1hcCBiYXNlZCBvbiB0aGUgdHdvIG9yaWdpbmFsCi8vLyB2YWx1ZXMuIElmIFt2YWx1ZV0gaXMgb21pdHRlZCwgdGhlIHZhbHVlIGZyb20gW21hcDJdIGlzIHVzZWQuCk1hcDxLLCBWPiBtZXJnZU1hcHM8SywgVj4oTWFwPEssIFY+IG1hcDEsIE1hcDxLLCBWPiBtYXAyLAogICAge1YgdmFsdWUoViB2YWx1ZTEsIFYgdmFsdWUyKX0pIHsKICB2YXIgcmVzdWx0ID0gbmV3IE1hcDxLLCBWPi5mcm9tKG1hcDEpOwogIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gcmVzdWx0Li5hZGRBbGwobWFwMik7CgogIG1hcDIuZm9yRWFjaCgoa2V5LCBtYXBWYWx1ZSkgewogICAgcmVzdWx0W2tleV0gPQogICAgICAgIHJlc3VsdC5jb250YWluc0tleShrZXkpID8gdmFsdWUocmVzdWx0W2tleV0sIG1hcFZhbHVlKSA6IG1hcFZhbHVlOwogIH0pOwogIHJldHVybiByZXN1bHQ7Cn0KCi8vLyBHcm91cHMgdGhlIGVsZW1lbnRzIGluIFt2YWx1ZXNdIGJ5IHRoZSB2YWx1ZSByZXR1cm5lZCBieSBba2V5XS4KLy8vCi8vLyBSZXR1cm5zIGEgbWFwIGZyb20ga2V5cyBjb21wdXRlZCBieSBba2V5XSB0byBhIGxpc3Qgb2YgYWxsIHZhbHVlcyBmb3Igd2hpY2gKLy8vIFtrZXldIHJldHVybnMgdGhhdCBrZXkuIFRoZSB2YWx1ZXMgYXBwZWFyIGluIHRoZSBsaXN0IGluIHRoZSBzYW1lIHJlbGF0aXZlCi8vLyBvcmRlciBhcyBpbiBbdmFsdWVzXS4KTWFwPFQsIExpc3Q8Uz4+IGdyb3VwQnk8UywgVD4oSXRlcmFibGU8Uz4gdmFsdWVzLCBUIGtleShTIGVsZW1lbnQpKSB7CiAgdmFyIG1hcCA9IDxULCBMaXN0PFM+Pnt9OwogIGZvciAodmFyIGVsZW1lbnQgaW4gdmFsdWVzKSB7CiAgICB2YXIgbGlzdCA9IG1hcC5wdXRJZkFic2VudChrZXkoZWxlbWVudCksICgpID0+IFtdKTsKICAgIGxpc3QuYWRkKGVsZW1lbnQpOwogIH0KICByZXR1cm4gbWFwOwp9CgovLy8gUmV0dXJucyB0aGUgZWxlbWVudCBvZiBbdmFsdWVzXSBmb3Igd2hpY2ggW29yZGVyQnldIHJldHVybnMgdGhlIG1pbmltdW0KLy8vIHZhbHVlLgovLy8KLy8vIFRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgW29yZGVyQnldIGFyZSBjb21wYXJlZCB1c2luZyB0aGUgW2NvbXBhcmVdIGZ1bmN0aW9uLgovLy8gSWYgW2NvbXBhcmVdIGlzIG9taXR0ZWQsIHZhbHVlcyBtdXN0IGltcGxlbWVudCBbQ29tcGFyYWJsZTxUPl0gYW5kIHRoZXkgYXJlCi8vLyBjb21wYXJlZCB1c2luZyB0aGVpciBbQ29tcGFyYWJsZS5jb21wYXJlVG9dLgpTIG1pbkJ5PFMsIFQ+KEl0ZXJhYmxlPFM+IHZhbHVlcywgVCBvcmRlckJ5KFMgZWxlbWVudCksCiAgICB7aW50IGNvbXBhcmUoVCB2YWx1ZTEsIFQgdmFsdWUyKX0pIHsKICBjb21wYXJlID8/PSBkZWZhdWx0Q29tcGFyZTxUPigpOwoKICBTIG1pblZhbHVlOwogIFQgbWluT3JkZXJCeTsKICBmb3IgKHZhciBlbGVtZW50IGluIHZhbHVlcykgewogICAgdmFyIGVsZW1lbnRPcmRlckJ5ID0gb3JkZXJCeShlbGVtZW50KTsKICAgIGlmIChtaW5PcmRlckJ5ID09IG51bGwgfHwgY29tcGFyZShlbGVtZW50T3JkZXJCeSwgbWluT3JkZXJCeSkgPCAwKSB7CiAgICAgIG1pblZhbHVlID0gZWxlbWVudDsKICAgICAgbWluT3JkZXJCeSA9IGVsZW1lbnRPcmRlckJ5OwogICAgfQogIH0KICByZXR1cm4gbWluVmFsdWU7Cn0KCi8vLyBSZXR1cm5zIHRoZSBlbGVtZW50IG9mIFt2YWx1ZXNdIGZvciB3aGljaCBbb3JkZXJCeV0gcmV0dXJucyB0aGUgbWF4aW11bQovLy8gdmFsdWUuCi8vLwovLy8gVGhlIHZhbHVlcyByZXR1cm5lZCBieSBbb3JkZXJCeV0gYXJlIGNvbXBhcmVkIHVzaW5nIHRoZSBbY29tcGFyZV0gZnVuY3Rpb24uCi8vLyBJZiBbY29tcGFyZV0gaXMgb21pdHRlZCwgdmFsdWVzIG11c3QgaW1wbGVtZW50IFtDb21wYXJhYmxlPFQ+XSBhbmQgdGhleSBhcmUKLy8vIGNvbXBhcmVkIHVzaW5nIHRoZWlyIFtDb21wYXJhYmxlLmNvbXBhcmVUb10uClMgbWF4Qnk8UywgVD4oSXRlcmFibGU8Uz4gdmFsdWVzLCBUIG9yZGVyQnkoUyBlbGVtZW50KSwKICAgIHtpbnQgY29tcGFyZShUIHZhbHVlMSwgVCB2YWx1ZTIpfSkgewogIGNvbXBhcmUgPz89IGRlZmF1bHRDb21wYXJlPFQ+KCk7CgogIFMgbWF4VmFsdWU7CiAgVCBtYXhPcmRlckJ5OwogIGZvciAodmFyIGVsZW1lbnQgaW4gdmFsdWVzKSB7CiAgICB2YXIgZWxlbWVudE9yZGVyQnkgPSBvcmRlckJ5KGVsZW1lbnQpOwogICAgaWYgKG1heE9yZGVyQnkgPT0gbnVsbCB8fCBjb21wYXJlKGVsZW1lbnRPcmRlckJ5LCBtYXhPcmRlckJ5KSA+IDApIHsKICAgICAgbWF4VmFsdWUgPSBlbGVtZW50OwogICAgICBtYXhPcmRlckJ5ID0gZWxlbWVudE9yZGVyQnk7CiAgICB9CiAgfQogIHJldHVybiBtYXhWYWx1ZTsKfQoKLy8vIFJldHVybnMgdGhlIFt0cmFuc2l0aXZlIGNsb3N1cmVdW10gb2YgW2dyYXBoXS4KLy8vCi8vLyBbdHJhbnNpdGl2ZSBjbG9zdXJlXTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVHJhbnNpdGl2ZV9jbG9zdXJlCi8vLwovLy8gSW50ZXJwcmV0cyBbZ3JhcGhdIGFzIGEgZGlyZWN0ZWQgZ3JhcGggd2l0aCBhIHZlcnRleCBmb3IgZWFjaCBrZXkgYW5kIGVkZ2VzCi8vLyBmcm9tIGVhY2gga2V5IHRvIHRoZSB2YWx1ZXMgdGhhdCB0aGUga2V5IG1hcHMgdG8uCi8vLwovLy8gQXNzdW1lcyB0aGF0IGV2ZXJ5IHZlcnRleCBpbiB0aGUgZ3JhcGggaGFzIGEga2V5IHRvIHJlcHJlc2VudCBpdCwgZXZlbiBpZgovLy8gdGhhdCB2ZXJ0ZXggaGFzIG5vIG91dGdvaW5nIGVkZ2VzLiBUaGlzIGlzbid0IGNoZWNrZWQsIGJ1dCBpZiBpdCdzIG5vdAovLy8gc2F0aXNmaWVkLCB0aGUgZnVuY3Rpb24gbWF5IGNyYXNoIG9yIHByb3ZpZGUgdW5leHBlY3RlZCBvdXRwdXQuIEZvciBleGFtcGxlLAovLy8gYHsiYSI6IFsiYiJdfWAgaXMgbm90IHZhbGlkLCBidXQgYHsiYSI6IFsiYiJdLCAiYiI6IFtdfWAgaXMuCk1hcDxULCBTZXQ8VD4+IHRyYW5zaXRpdmVDbG9zdXJlPFQ+KE1hcDxULCBJdGVyYWJsZTxUPj4gZ3JhcGgpIHsKICAvLyBUaGlzIHVzZXMgW1dhcnNoYWxsJ3MgYWxnb3JpdGhtXVtdLCBtb2RpZmllZCBub3QgdG8gYWRkIGEgdmVydGV4IGZyb20gZWFjaAogIC8vIG5vZGUgdG8gaXRzZWxmLgogIC8vCiAgLy8gW1dhcnNoYWxsJ3MgYWxnb3JpdGhtXTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmxveWQlRTIlODAlOTNXYXJzaGFsbF9hbGdvcml0aG0jQXBwbGljYXRpb25zX2FuZF9nZW5lcmFsaXphdGlvbnMuCiAgdmFyIHJlc3VsdCA9IDxULCBTZXQ8VD4+e307CiAgZ3JhcGguZm9yRWFjaCgodmVydGV4LCBlZGdlcykgewogICAgcmVzdWx0W3ZlcnRleF0gPSBuZXcgU2V0PFQ+LmZyb20oZWRnZXMpOwogIH0pOwoKICAvLyBMaXN0cyBhcmUgZmFzdGVyIHRvIGl0ZXJhdGUgdGhhbiBtYXBzLCBzbyB3ZSBjcmVhdGUgYSBsaXN0IHNpbmNlIHdlJ3JlCiAgLy8gaXRlcmF0aW5nIHJlcGVhdGVkbHkuCiAgdmFyIGtleXMgPSBncmFwaC5rZXlzLnRvTGlzdCgpOwogIGZvciAodmFyIHZlcnRleDEgaW4ga2V5cykgewogICAgZm9yICh2YXIgdmVydGV4MiBpbiBrZXlzKSB7CiAgICAgIGZvciAodmFyIHZlcnRleDMgaW4ga2V5cykgewogICAgICAgIGlmIChyZXN1bHRbdmVydGV4Ml0uY29udGFpbnModmVydGV4MSkgJiYKICAgICAgICAgICAgcmVzdWx0W3ZlcnRleDFdLmNvbnRhaW5zKHZlcnRleDMpKSB7CiAgICAgICAgICByZXN1bHRbdmVydGV4Ml0uYWRkKHZlcnRleDMpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIHJlc3VsdDsKfQoKLy8vIFJldHVybnMgdGhlIFtzdHJvbmdseSBjb25uZWN0ZWQgY29tcG9uZW50c11bXSBvZiBbZ3JhcGhdLCBpbiB0b3BvbG9naWNhbAovLy8gb3JkZXIuCi8vLwovLy8gW3N0cm9uZ2x5IGNvbm5lY3RlZCBjb21wb25lbnRzXTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3Ryb25nbHlfY29ubmVjdGVkX2NvbXBvbmVudAovLy8KLy8vIEludGVycHJldHMgW2dyYXBoXSBhcyBhIGRpcmVjdGVkIGdyYXBoIHdpdGggYSB2ZXJ0ZXggZm9yIGVhY2gga2V5IGFuZCBlZGdlcwovLy8gZnJvbSBlYWNoIGtleSB0byB0aGUgdmFsdWVzIHRoYXQgdGhlIGtleSBtYXBzIHRvLgovLy8KLy8vIEFzc3VtZXMgdGhhdCBldmVyeSB2ZXJ0ZXggaW4gdGhlIGdyYXBoIGhhcyBhIGtleSB0byByZXByZXNlbnQgaXQsIGV2ZW4gaWYKLy8vIHRoYXQgdmVydGV4IGhhcyBubyBvdXRnb2luZyBlZGdlcy4gVGhpcyBpc24ndCBjaGVja2VkLCBidXQgaWYgaXQncyBub3QKLy8vIHNhdGlzZmllZCwgdGhlIGZ1bmN0aW9uIG1heSBjcmFzaCBvciBwcm92aWRlIHVuZXhwZWN0ZWQgb3V0cHV0LiBGb3IgZXhhbXBsZSwKLy8vIGB7ImEiOiBbImIiXX1gIGlzIG5vdCB2YWxpZCwgYnV0IGB7ImEiOiBbImIiXSwgImIiOiBbXX1gIGlzLgpMaXN0PFNldDxUPj4gc3Ryb25nbHlDb25uZWN0ZWRDb21wb25lbnRzPFQ+KE1hcDxULCBJdGVyYWJsZTxUPj4gZ3JhcGgpIHsKICAvLyBUaGlzIHVzZXMgW1RhcmphbidzIGFsZ29yaXRobV1bXS4KICAvLwogIC8vIFtUYXJqYW4ncyBhbGdvcml0aG1dOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9UYXJqYW4lMjdzX3N0cm9uZ2x5X2Nvbm5lY3RlZF9jb21wb25lbnRzX2FsZ29yaXRobQogIHZhciBpbmRleCA9IDA7CiAgdmFyIHN0YWNrID0gPFQ+W107CiAgdmFyIHJlc3VsdCA9IDxTZXQ8VD4+W107CgogIC8vIFRoZSBvcmRlciBvZiB0aGVzZSBkb2Vzbid0IG1hdHRlciwgc28gd2UgdXNlIHVuLWxpbmtlZCBpbXBsZW1lbnRhdGlvbnMgdG8KICAvLyBhdm9pZCB1bm5lY2Vzc2FyeSBvdmVyaGVhZC4KICB2YXIgaW5kaWNlcyA9IG5ldyBIYXNoTWFwPFQsIGludD4oKTsKICB2YXIgbG93TGlua3MgPSBuZXcgSGFzaE1hcDxULCBpbnQ+KCk7CiAgdmFyIG9uU3RhY2sgPSBuZXcgSGFzaFNldDxUPigpOwoKICBzdHJvbmdDb25uZWN0KFQgdmVydGV4KSB7CiAgICBpbmRpY2VzW3ZlcnRleF0gPSBpbmRleDsKICAgIGxvd0xpbmtzW3ZlcnRleF0gPSBpbmRleDsKICAgIGluZGV4Kys7CgogICAgc3RhY2suYWRkKHZlcnRleCk7CiAgICBvblN0YWNrLmFkZCh2ZXJ0ZXgpOwoKICAgIGZvciAodmFyIHN1Y2Nlc3NvciBpbiBncmFwaFt2ZXJ0ZXhdKSB7CiAgICAgIGlmICghaW5kaWNlcy5jb250YWluc0tleShzdWNjZXNzb3IpKSB7CiAgICAgICAgc3Ryb25nQ29ubmVjdChzdWNjZXNzb3IpOwogICAgICAgIGxvd0xpbmtzW3ZlcnRleF0gPSBtYXRoLm1pbihsb3dMaW5rc1t2ZXJ0ZXhdLCBsb3dMaW5rc1tzdWNjZXNzb3JdKTsKICAgICAgfSBlbHNlIGlmIChvblN0YWNrLmNvbnRhaW5zKHN1Y2Nlc3NvcikpIHsKICAgICAgICBsb3dMaW5rc1t2ZXJ0ZXhdID0gbWF0aC5taW4obG93TGlua3NbdmVydGV4XSwgbG93TGlua3Nbc3VjY2Vzc29yXSk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAobG93TGlua3NbdmVydGV4XSA9PSBpbmRpY2VzW3ZlcnRleF0pIHsKICAgICAgdmFyIGNvbXBvbmVudCA9IG5ldyBTZXQ8VD4oKTsKICAgICAgVCBuZWlnaGJvcjsKICAgICAgZG8gewogICAgICAgIG5laWdoYm9yID0gc3RhY2sucmVtb3ZlTGFzdCgpOwogICAgICAgIG9uU3RhY2sucmVtb3ZlKG5laWdoYm9yKTsKICAgICAgICBjb21wb25lbnQuYWRkKG5laWdoYm9yKTsKICAgICAgfSB3aGlsZSAobmVpZ2hib3IgIT0gdmVydGV4KTsKICAgICAgcmVzdWx0LmFkZChjb21wb25lbnQpOwogICAgfQogIH0KCiAgZm9yICh2YXIgdmVydGV4IGluIGdyYXBoLmtleXMpIHsKICAgIGlmICghaW5kaWNlcy5jb250YWluc0tleSh2ZXJ0ZXgpKSBzdHJvbmdDb25uZWN0KHZlcnRleCk7CiAgfQoKICAvLyBUYXJqYW4ncyBhbGdvcml0aG0gcHJvZHVjZXMgYSByZXZlcnNlLXRvcG9sb2dpY2FsIHNvcnQsIHNvIHdlIHJldmVyc2UgaXQgdG8KICAvLyBnZXQgYSBub3JtYWwgdG9wb2xvZ2ljYWwgc29ydC4KICByZXR1cm4gcmVzdWx0LnJldmVyc2VkLnRvTGlzdCgpOwp9CoDNAE5OPAEaHAEVAU9LOwRNNDQ+Jy0BGyM9BhECAUoET1BCOiUpMgEhEksGEQIBRARQTxpGHCA4FwQOAgFMCwRQUDE4KSMBDhAgK0kaIwYEEwIBTAsEUFAxOCkjAQ4QICtJGiMGBBMCATMESwRQNgROS1FBQVAVBX4eIi0GAUwbIh4gIjExKAoIBgQBEQIBTQsEYARQNgROS1FBSScFbBEVGwFPIScoIgEcHR4NARcZASstIkwwTAgGAS8kEgsnIiEkHQYEASM9BAFRJCMCASVwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2Z1bmN0aW9ucy5kYXJ0PXNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jb2xsZWN0aW9uL2xpYi9zcmMvaXRlcmFibGVfemlwLmRhcnSHHi8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgImRhcnQ6Y29sbGVjdGlvbiI7CgovLy8gSXRlcmFibGUgdGhhdCBpdGVyYXRlcyBvdmVyIGxpc3RzIG9mIHZhbHVlcyBmcm9tIG90aGVyIGl0ZXJhYmxlcy4KLy8vCi8vLyBXaGVuIFtpdGVyYXRvcl0gaXMgcmVhZCwgYW4gW0l0ZXJhdG9yXSBpcyBjcmVhdGVkIGZvciBlYWNoIFtJdGVyYWJsZV0gaW4KLy8vIHRoZSBbSXRlcmFibGVdIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCi8vLwovLy8gQXMgbG9uZyBhcyBhbGwgdGhlc2UgaXRlcmF0b3JzIGhhdmUgYSBuZXh0IHZhbHVlLCB0aG9zZSBuZXh0IHZhbHVlcyBhcmUKLy8vIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgbGlzdCwgd2hpY2ggYmVjb21lcyB0aGUgbmV4dCB2YWx1ZSBvZiB0aGlzCi8vLyBbSXRlcmFibGVdJ3MgW0l0ZXJhdG9yXS4gQXMgc29vbiBhcyBhbnkgb2YgdGhlIGl0ZXJhdG9ycyBydW4gb3V0LAovLy8gdGhlIHppcHBlZCBpdGVyYXRvciBhbHNvIHN0b3BzLgpjbGFzcyBJdGVyYWJsZVppcDxUPiBleHRlbmRzIEl0ZXJhYmxlQmFzZTxMaXN0PFQ+PiB7CiAgZmluYWwgSXRlcmFibGU8SXRlcmFibGU8VD4+IF9pdGVyYWJsZXM7CgogIEl0ZXJhYmxlWmlwKEl0ZXJhYmxlPEl0ZXJhYmxlPFQ+PiBpdGVyYWJsZXMpIDogdGhpcy5faXRlcmFibGVzID0gaXRlcmFibGVzOwoKICAvLy8gUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IGNvbWJpbmVzIHZhbHVlcyBvZiB0aGUgaXRlcmFibGVzJyBpdGVyYXRvcnMKICAvLy8gYXMgbG9uZyBhcyB0aGV5IGFsbCBoYXZlIHZhbHVlcy4KICBJdGVyYXRvcjxMaXN0PFQ+PiBnZXQgaXRlcmF0b3IgewogICAgdmFyIGl0ZXJhdG9ycyA9IF9pdGVyYWJsZXMubWFwKCh4KSA9PiB4Lml0ZXJhdG9yKS50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICAgIC8vIFRPRE8obHJuKTogUmV0dXJuIGFuIGVtcHR5IGl0ZXJhdG9yIGRpcmVjdGx5IGlmIGl0ZXJhdG9ycyBpcyBlbXB0eT8KICAgIHJldHVybiBuZXcgX0l0ZXJhdG9yWmlwPFQ+KGl0ZXJhdG9ycyk7CiAgfQp9CgpjbGFzcyBfSXRlcmF0b3JaaXA8VD4gaW1wbGVtZW50cyBJdGVyYXRvcjxMaXN0PFQ+PiB7CiAgZmluYWwgTGlzdDxJdGVyYXRvcjxUPj4gX2l0ZXJhdG9yczsKICBMaXN0PFQ+IF9jdXJyZW50OwoKICBfSXRlcmF0b3JaaXAoTGlzdDxJdGVyYXRvcjxUPj4gaXRlcmF0b3JzKSA6IF9pdGVyYXRvcnMgPSBpdGVyYXRvcnM7CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBpZiAoX2l0ZXJhdG9ycy5pc0VtcHR5KSByZXR1cm4gZmFsc2U7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IF9pdGVyYXRvcnMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKCFfaXRlcmF0b3JzW2ldLm1vdmVOZXh0KCkpIHsKICAgICAgICBfY3VycmVudCA9IG51bGw7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICBfY3VycmVudCA9IG5ldyBMaXN0KF9pdGVyYXRvcnMubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2l0ZXJhdG9ycy5sZW5ndGg7IGkrKykgewogICAgICBfY3VycmVudFtpXSA9IF9pdGVyYXRvcnNbaV0uY3VycmVudDsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgTGlzdDxUPiBnZXQgY3VycmVudCA9PiBfY3VycmVudDsKfQo2AE5OPAEaAUYETS4ETEZGJDUqAU4BSycjT0srBAIBNSYUAUYBFCoyJxkWCAYsMisGEQQBIwIBKHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvaXRlcmFibGVfemlwLmRhcnQ/c2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NvbGxlY3Rpb24vbGliL3NyYy9wcmlvcml0eV9xdWV1ZS5kYXJ0q6cvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICJkYXJ0OmNvbGxlY3Rpb24iOwoKaW1wb3J0ICJ1dGlscy5kYXJ0IjsKCi8vLyBBIHByaW9yaXR5IHF1ZXVlIGlzIGEgcHJpb3JpdHkgYmFzZWQgd29yay1saXN0IG9mIGVsZW1lbnRzLgovLy8KLy8vIFRoZSBxdWV1ZSBhbGxvd3MgYWRkaW5nIGVsZW1lbnRzLCBhbmQgcmVtb3ZpbmcgdGhlbSBhZ2FpbiBpbiBwcmlvcml0eSBvcmRlci4KYWJzdHJhY3QgY2xhc3MgUHJpb3JpdHlRdWV1ZTxFPiB7CiAgLy8vIENyZWF0ZXMgYW4gZW1wdHkgW1ByaW9yaXR5UXVldWVdLgogIC8vLwogIC8vLyBUaGUgY3JlYXRlZCBbUHJpb3JpdHlRdWV1ZV0gaXMgYSBwbGFpbiBbSGVhcFByaW9yaXR5UXVldWVdLgogIC8vLwogIC8vLyBUaGUgW2NvbXBhcmlzb25dIGlzIGEgW0NvbXBhcmF0b3JdIHVzZWQgdG8gY29tcGFyZSB0aGUgcHJpb3JpdHkgb2YKICAvLy8gZWxlbWVudHMuIEFuIGVsZW1lbnQgdGhhdCBjb21wYXJlcyBhcyBsZXNzIHRoYW4gYW5vdGhlciBlbGVtZW50IGhhcwogIC8vLyBhIGhpZ2hlciBwcmlvcml0eS4KICAvLy8KICAvLy8gSWYgW2NvbXBhcmlzb25dIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIFtDb21wYXJhYmxlLmNvbXBhcmVdLiBJZiB0aGlzCiAgLy8vIGlzIHRoZSBjYXNlLCBgRWAgbXVzdCBpbXBsZW1lbnQgW0NvbXBhcmFibGVdLCBhbmQgdGhpcyBpcyBjaGVja2VkIGF0CiAgLy8vIHJ1bnRpbWUgZm9yIGV2ZXJ5IGNvbXBhcmlzb24uCiAgZmFjdG9yeSBQcmlvcml0eVF1ZXVlKFtpbnQgY29tcGFyaXNvbihFIGUxLCBFIGUyKV0pID0gSGVhcFByaW9yaXR5UXVldWU8RT47CgogIC8vLyBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHF1ZXVlLgogIGludCBnZXQgbGVuZ3RoOwoKICAvLy8gV2hldGhlciB0aGUgcXVldWUgaXMgZW1wdHkuCiAgYm9vbCBnZXQgaXNFbXB0eTsKCiAgLy8vIFdoZXRoZXIgdGhlIHF1ZXVlIGhhcyBhbnkgZWxlbWVudHMuCiAgYm9vbCBnZXQgaXNOb3RFbXB0eTsKCiAgLy8vIENoZWNrcyBpZiBbb2JqZWN0XSBpcyBpbiB0aGUgcXVldWUuCiAgLy8vCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyBmb3VuZC4KICBib29sIGNvbnRhaW5zKEUgb2JqZWN0KTsKCiAgLy8vIEFkZHMgZWxlbWVudCB0byB0aGUgcXVldWUuCiAgLy8vCiAgLy8vIFRoZSBlbGVtZW50IHdpbGwgYmVjb21lIHRoZSBuZXh0IHRvIGJlIHJlbW92ZWQgYnkgW3JlbW92ZUZpcnN0XQogIC8vLyB3aGVuIGFsbCBlbGVtZW50cyB3aXRoIGhpZ2hlciBwcmlvcml0eSBoYXZlIGJlZW4gcmVtb3ZlZC4KICB2b2lkIGFkZChFIGVsZW1lbnQpOwoKICAvLy8gQWRkcyBhbGwgW2VsZW1lbnRzXSB0byB0aGUgcXVldWUuCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gZWxlbWVudHMpOwoKICAvLy8gUmV0dXJucyB0aGUgbmV4dCBlbGVtZW50IHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSBbcmVtb3ZlRmlyc3RdLgogIC8vLwogIC8vLyBUaGUgZWxlbWVudCBpcyBub3QgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZS4KICAvLy8KICAvLy8gVGhlIHF1ZXVlIG11c3Qgbm90IGJlIGVtcHR5IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLgogIEUgZ2V0IGZpcnN0OwoKICAvLy8gUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgZWxlbWVudCB3aXRoIHRoZSBoaWdoZXN0IHByaW9yaXR5LgogIC8vLwogIC8vLyBSZXBlYXRlZGx5IGNhbGxpbmcgdGhpcyBtZXRob2QsIHdpdGhvdXQgYWRkaW5nIGVsZW1lbnQgaW4gYmV0d2VlbiwKICAvLy8gaXMgZ3VhcmFudGVlZCB0byByZXR1cm4gZWxlbWVudHMgaW4gbm9uLWRlY3JlYXNpbmcgb3JkZXIgYXMsIHNwZWNpZmllZCBieQogIC8vLyBbY29tcGFyaXNvbl0uCiAgLy8vCiAgLy8vIFRoZSBxdWV1ZSBtdXN0IG5vdCBiZSBlbXB0eSB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KICBFIHJlbW92ZUZpcnN0KCk7CgogIC8vLyBSZW1vdmVzIGFuIGVsZW1lbnQgdGhhdCBjb21wYXJlcyBlcXVhbCB0byBbZWxlbWVudF0gaW4gdGhlIHF1ZXVlLgogIC8vLwogIC8vLyBSZXR1cm5zIHRydWUgaWYgYW4gZWxlbWVudCBpcyBmb3VuZCBhbmQgcmVtb3ZlZCwKICAvLy8gYW5kIGZhbHNlIGlmIG5vIGVxdWFsIGVsZW1lbnQgaXMgZm91bmQuCiAgYm9vbCByZW1vdmUoRSBlbGVtZW50KTsKCiAgLy8vIFJlbW92ZXMgYWxsIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgcXVldWUgYW5kIHJldHVybnMgdGhlbS4KICAvLy8KICAvLy8gVGhlIHJldHVybmVkIGl0ZXJhYmxlIGhhcyBubyBzcGVjaWZpZWQgb3JkZXIuCiAgSXRlcmFibGU8RT4gcmVtb3ZlQWxsKCk7CgogIC8vLyBSZW1vdmVzIGFsbCB0aGUgZWxlbWVudHMgZnJvbSB0aGlzIHF1ZXVlLgogIHZvaWQgY2xlYXIoKTsKCiAgLy8vIFJldHVybnMgYSBsaXN0IG9mIHRoZSBlbGVtZW50cyBvZiB0aGlzIHF1ZXVlIGluIHByaW9yaXR5IG9yZGVyLgogIC8vLwogIC8vLyBUaGUgcXVldWUgaXMgbm90IG1vZGlmaWVkLgogIC8vLwogIC8vLyBUaGUgb3JkZXIgaXMgdGhlIG9yZGVyIHRoYXQgdGhlIGVsZW1lbnRzIHdvdWxkIGJlIGluIGlmIHRoZXkgd2VyZQogIC8vLyByZW1vdmVkIGZyb20gdGhpcyBxdWV1ZSB1c2luZyBbcmVtb3ZlRmlyc3RdLgogIExpc3Q8RT4gdG9MaXN0KCk7CgogIC8vLyBSZXR1cm4gYSBjb21wYXJhdG9yIGJhc2VkIHNldCB1c2luZyB0aGUgY29tcGFyYXRvciBvZiB0aGlzIHF1ZXVlLgogIC8vLwogIC8vLyBUaGUgcXVldWUgaXMgbm90IG1vZGlmaWVkLgogIC8vLwogIC8vLyBUaGUgcmV0dXJuZWQgW1NldF0gaXMgY3VycmVudGx5IGEgW1NwbGF5VHJlZVNldF0sCiAgLy8vIGJ1dCB0aGlzIG1heSBjaGFuZ2UgYXMgb3RoZXIgb3JkZXJlZCBzZXRzIGFyZSBpbXBsZW1lbnRlZC4KICAvLy8KICAvLy8gVGhlIHNldCBjb250YWlucyBhbGwgdGhlIGVsZW1lbnRzIG9mIHRoaXMgcXVldWUuCiAgLy8vIElmIGFuIGVsZW1lbnQgb2NjdXJzIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBxdWV1ZSwKICAvLy8gdGhlIHNldCB3aWxsIGNvbnRhaW4gaXQgb25seSBvbmNlLgogIFNldDxFPiB0b1NldCgpOwp9CgovLy8gSGVhcCBiYXNlZCBwcmlvcml0eSBxdWV1ZS4KLy8vCi8vLyBUaGUgZWxlbWVudHMgYXJlIGtlcHQgaW4gYSBoZWFwIHN0cnVjdHVyZSwKLy8vIHdoZXJlIHRoZSBlbGVtZW50IHdpdGggdGhlIGhpZ2hlc3QgcHJpb3JpdHkgaXMgaW1tZWRpYXRlbHkgYWNjZXNzaWJsZSwKLy8vIGFuZCBtb2RpZnlpbmcgYSBzaW5nbGUgZWxlbWVudCB0YWtlcwovLy8gbG9nYXJpdGhtaWMgdGltZSBpbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9uIGF2ZXJhZ2UuCi8vLwovLy8gKiBUaGUgW2FkZF0gYW5kIFtyZW1vdmVGaXJzdF0gb3BlcmF0aW9ucyB0YWtlIGFtb3J0aXplZCBsb2dhcml0aG1pYyB0aW1lLAovLy8gICBPKGxvZyhuKSksIGJ1dCBtYXkgb2NjYXNpb25hbGx5IHRha2UgbGluZWFyIHRpbWUgd2hlbiBncm93aW5nIHRoZSBjYXBhY2l0eQovLy8gICBvZiB0aGUgaGVhcC4KLy8vICogVGhlIFthZGRBbGxdIG9wZXJhdGlvbiB3b3JrcyBhcyBkb2luZyByZXBlYXRlZCBbYWRkXSBvcGVyYXRpb25zLgovLy8gKiBUaGUgW2ZpcnN0XSBnZXR0ZXIgdGFrZXMgY29uc3RhbnQgdGltZSwgTygxKS4KLy8vICogVGhlIFtjbGVhcl0gYW5kIFtyZW1vdmVBbGxdIG1ldGhvZHMgYWxzbyB0YWtlIGNvbnN0YW50IHRpbWUsIE8oMSkuCi8vLyAqIFRoZSBbY29udGFpbnNdIGFuZCBbcmVtb3ZlXSBvcGVyYXRpb25zIG1heSBuZWVkIHRvIHNlYXJjaCB0aGUgZW50aXJlCi8vLyAgIHF1ZXVlIGZvciB0aGUgZWxlbWVudHMsIHRha2luZyBPKG4pIHRpbWUuCi8vLyAqIFRoZSBbdG9MaXN0XSBvcGVyYXRpb24gZWZmZWN0aXZlbHkgc29ydHMgdGhlIGVsZW1lbnRzLCB0YWtpbmcgTyhuKmxvZyhuKSkKLy8vICAgdGltZS4KLy8vICogVGhlIFt0b1NldF0gb3BlcmF0aW9uIGVmZmVjdGl2ZWx5IGFkZHMgZWFjaCBlbGVtZW50IHRvIHRoZSBuZXcgc2V0LCB0YWtpbmcKLy8vICAgYW4gZXhwZWN0ZWQgTyhuKmxvZyhuKSkgdGltZS4KY2xhc3MgSGVhcFByaW9yaXR5UXVldWU8RT4gaW1wbGVtZW50cyBQcmlvcml0eVF1ZXVlPEU+IHsKICAvLy8gSW5pdGlhbCBjYXBhY2l0eSBvZiBhIHF1ZXVlIHdoZW4gY3JlYXRlZCwgb3Igd2hlbiBhZGRlZCB0byBhZnRlciBhCiAgLy8vIFtjbGVhcl0uCiAgLy8vCiAgLy8vIE51bWJlciBjYW4gYmUgYW55IHBvc2l0aXZlIHZhbHVlLiBQaWNraW5nIGEgc2l6ZSB0aGF0IGdpdmVzIGEgd2hvbGUKICAvLy8gbnVtYmVyIG9mICJ0cmVlIGxldmVscyIgaW4gdGhlIGhlYXAgaXMgb25seSBkb25lIGZvciBhZXN0aGV0aWMgcmVhc29ucy4KICBzdGF0aWMgY29uc3QgaW50IF9JTklUSUFMX0NBUEFDSVRZID0gNzsKCiAgLy8vIFRoZSBjb21wYXJpc29uIGJlaW5nIHVzZWQgdG8gY29tcGFyZSB0aGUgcHJpb3JpdHkgb2YgZWxlbWVudHMuCiAgZmluYWwgQ29tcGFyYXRvcjxFPiBjb21wYXJpc29uOwoKICAvLy8gTGlzdCBpbXBsZW1lbnRhdGlvbiBvZiBhIGhlYXAuCiAgTGlzdDxFPiBfcXVldWUgPSBuZXcgTGlzdDxFPihfSU5JVElBTF9DQVBBQ0lUWSk7CgogIC8vLyBOdW1iZXIgb2YgZWxlbWVudHMgaW4gcXVldWUuCiAgLy8vCiAgLy8vIFRoZSBoZWFwIGlzIGltcGxlbWVudGVkIGluIHRoZSBmaXJzdCBbX2xlbmd0aF0gZW50cmllcyBvZiBbX3F1ZXVlXS4KICBpbnQgX2xlbmd0aCA9IDA7CgogIC8vLyBDcmVhdGUgYSBuZXcgcHJpb3JpdHkgcXVldWUuCiAgLy8vCiAgLy8vIFRoZSBbY29tcGFyaXNvbl0gaXMgYSBbQ29tcGFyYXRvcl0gdXNlZCB0byBjb21wYXJlIHRoZSBwcmlvcml0eSBvZgogIC8vLyBlbGVtZW50cy4gQW4gZWxlbWVudCB0aGF0IGNvbXBhcmVzIGFzIGxlc3MgdGhhbiBhbm90aGVyIGVsZW1lbnQgaGFzCiAgLy8vIGEgaGlnaGVyIHByaW9yaXR5LgogIC8vLwogIC8vLyBJZiBbY29tcGFyaXNvbl0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gW0NvbXBhcmFibGUuY29tcGFyZV0uIElmIHRoaXMKICAvLy8gaXMgdGhlIGNhc2UsIGBFYCBtdXN0IGltcGxlbWVudCBbQ29tcGFyYWJsZV0sIGFuZCB0aGlzIGlzIGNoZWNrZWQgYXQKICAvLy8gcnVudGltZSBmb3IgZXZlcnkgY29tcGFyaXNvbi4KICBIZWFwUHJpb3JpdHlRdWV1ZShbaW50IGNvbXBhcmlzb24oRSBlMSwgRSBlMildKQogICAgICA6IGNvbXBhcmlzb24gPSBjb21wYXJpc29uID8/IGRlZmF1bHRDb21wYXJlPEU+KCk7CgogIHZvaWQgYWRkKEUgZWxlbWVudCkgewogICAgX2FkZChlbGVtZW50KTsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGVsZW1lbnRzKSB7CiAgICBmb3IgKEUgZWxlbWVudCBpbiBlbGVtZW50cykgewogICAgICBfYWRkKGVsZW1lbnQpOwogICAgfQogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIF9xdWV1ZSA9IGNvbnN0IFtdOwogICAgX2xlbmd0aCA9IDA7CiAgfQoKICBib29sIGNvbnRhaW5zKEUgb2JqZWN0KSB7CiAgICByZXR1cm4gX2xvY2F0ZShvYmplY3QpID49IDA7CiAgfQoKICBFIGdldCBmaXJzdCB7CiAgICBpZiAoX2xlbmd0aCA9PSAwKSB0aHJvdyBuZXcgU3RhdGVFcnJvcigiTm8gc3VjaCBlbGVtZW50Iik7CiAgICByZXR1cm4gX3F1ZXVlWzBdOwogIH0KCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfbGVuZ3RoID09IDA7CgogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gX2xlbmd0aCAhPSAwOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfbGVuZ3RoOwoKICBib29sIHJlbW92ZShFIGVsZW1lbnQpIHsKICAgIGludCBpbmRleCA9IF9sb2NhdGUoZWxlbWVudCk7CiAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gZmFsc2U7CiAgICBFIGxhc3QgPSBfcmVtb3ZlTGFzdCgpOwogICAgaWYgKGluZGV4IDwgX2xlbmd0aCkgewogICAgICBpbnQgY29tcCA9IGNvbXBhcmlzb24obGFzdCwgZWxlbWVudCk7CiAgICAgIGlmIChjb21wIDw9IDApIHsKICAgICAgICBfYnViYmxlVXAobGFzdCwgaW5kZXgpOwogICAgICB9IGVsc2UgewogICAgICAgIF9idWJibGVEb3duKGxhc3QsIGluZGV4KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBJdGVyYWJsZTxFPiByZW1vdmVBbGwoKSB7CiAgICBMaXN0PEU+IHJlc3VsdCA9IF9xdWV1ZTsKICAgIGludCBsZW5ndGggPSBfbGVuZ3RoOwogICAgX3F1ZXVlID0gY29uc3QgW107CiAgICBfbGVuZ3RoID0gMDsKICAgIHJldHVybiByZXN1bHQudGFrZShsZW5ndGgpOwogIH0KCiAgRSByZW1vdmVGaXJzdCgpIHsKICAgIGlmIChfbGVuZ3RoID09IDApIHRocm93IG5ldyBTdGF0ZUVycm9yKCJObyBzdWNoIGVsZW1lbnQiKTsKICAgIEUgcmVzdWx0ID0gX3F1ZXVlWzBdOwogICAgRSBsYXN0ID0gX3JlbW92ZUxhc3QoKTsKICAgIGlmIChfbGVuZ3RoID4gMCkgewogICAgICBfYnViYmxlRG93bihsYXN0LCAwKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBMaXN0PEU+IHRvTGlzdCgpIHsKICAgIExpc3Q8RT4gbGlzdCA9IG5ldyBMaXN0PEU+KCkuLmxlbmd0aCA9IF9sZW5ndGg7CiAgICBsaXN0LnNldFJhbmdlKDAsIF9sZW5ndGgsIF9xdWV1ZSk7CiAgICBsaXN0LnNvcnQoY29tcGFyaXNvbik7CiAgICByZXR1cm4gbGlzdDsKICB9CgogIFNldDxFPiB0b1NldCgpIHsKICAgIFNldDxFPiBzZXQgPSBuZXcgU3BsYXlUcmVlU2V0PEU+KGNvbXBhcmlzb24pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbGVuZ3RoOyBpKyspIHsKICAgICAgc2V0LmFkZChfcXVldWVbaV0pOwogICAgfQogICAgcmV0dXJuIHNldDsKICB9CgogIC8vLyBSZXR1cm5zIHNvbWUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHF1ZXVlLgogIC8vLwogIC8vLyBUaGUgZm9ybWF0IGlzbid0IHNpZ25pZmljYW50LCBhbmQgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiBfcXVldWUudGFrZShfbGVuZ3RoKS50b1N0cmluZygpOwogIH0KCiAgLy8vIEFkZCBlbGVtZW50IHRvIHRoZSBxdWV1ZS4KICAvLy8KICAvLy8gR3Jvd3MgdGhlIGNhcGFjaXR5IGlmIHRoZSBiYWNraW5nIGxpc3QgaXMgZnVsbC4KICB2b2lkIF9hZGQoRSBlbGVtZW50KSB7CiAgICBpZiAoX2xlbmd0aCA9PSBfcXVldWUubGVuZ3RoKSBfZ3JvdygpOwogICAgX2J1YmJsZVVwKGVsZW1lbnQsIF9sZW5ndGgrKyk7CiAgfQoKICAvLy8gRmluZCB0aGUgaW5kZXggb2YgYW4gb2JqZWN0IGluIHRoZSBoZWFwLgogIC8vLwogIC8vLyBSZXR1cm5zIC0xIGlmIHRoZSBvYmplY3QgaXMgbm90IGZvdW5kLgogIGludCBfbG9jYXRlKEUgb2JqZWN0KSB7CiAgICBpZiAoX2xlbmd0aCA9PSAwKSByZXR1cm4gLTE7CiAgICAvLyBDb3VudCBwb3NpdGlvbnMgZnJvbSBvbmUgaW5zdGVhZCBvZiB6ZXJvLiBUaGlzIGdpdmVzIHRoZSBudW1iZXJzCiAgICAvLyBzb21lIG5pY2UgcHJvcGVydGllcy4gRm9yIGV4YW1wbGUsIGFsbCByaWdodCBjaGlsZHJlbiBhcmUgb2RkLAogICAgLy8gdGhlaXIgbGVmdCBzaWJsaW5nIGlzIGV2ZW4sIGFuZCB0aGUgcGFyZW50IGlzIGZvdW5kIGJ5IHNoaWZ0aW5nCiAgICAvLyByaWdodCBieSBvbmUuCiAgICAvLyBWYWxpZCByYW5nZSBmb3IgcG9zaXRpb24gaXMgWzEuLl9sZW5ndGhdLCBpbmNsdXNpdmUuCiAgICBpbnQgcG9zaXRpb24gPSAxOwogICAgLy8gUHJlLW9yZGVyIGRlcHRoIGZpcnN0IHNlYXJjaCwgb21pdCBjaGlsZCBub2RlcyBpZiB0aGUgY3VycmVudAogICAgLy8gbm9kZSBoYXMgbG93ZXIgcHJpb3JpdHkgdGhhbiBbb2JqZWN0XSwgYmVjYXVzZSBhbGwgbm9kZXMgbG93ZXIKICAgIC8vIGluIHRoZSBoZWFwIHdpbGwgYWxzbyBoYXZlIGxvd2VyIHByaW9yaXR5LgogICAgZG8gewogICAgICBpbnQgaW5kZXggPSBwb3NpdGlvbiAtIDE7CiAgICAgIEUgZWxlbWVudCA9IF9xdWV1ZVtpbmRleF07CiAgICAgIGludCBjb21wID0gY29tcGFyaXNvbihlbGVtZW50LCBvYmplY3QpOwogICAgICBpZiAoY29tcCA9PSAwKSByZXR1cm4gaW5kZXg7CiAgICAgIGlmIChjb21wIDwgMCkgewogICAgICAgIC8vIEVsZW1lbnQgbWF5IGJlIGluIHN1YnRyZWUuCiAgICAgICAgLy8gQ29udGludWUgd2l0aCB0aGUgbGVmdCBjaGlsZCwgaWYgaXQgaXMgdGhlcmUuCiAgICAgICAgaW50IGxlZnRDaGlsZFBvc2l0aW9uID0gcG9zaXRpb24gKiAyOwogICAgICAgIGlmIChsZWZ0Q2hpbGRQb3NpdGlvbiA8PSBfbGVuZ3RoKSB7CiAgICAgICAgICBwb3NpdGlvbiA9IGxlZnRDaGlsZFBvc2l0aW9uOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIEZpbmQgdGhlIG5leHQgcmlnaHQgc2libGluZyBvciByaWdodCBhbmNlc3RvciBzaWJsaW5nLgogICAgICBkbyB7CiAgICAgICAgd2hpbGUgKHBvc2l0aW9uLmlzT2RkKSB7CiAgICAgICAgICAvLyBXaGlsZSBwb3NpdGlvbiBpcyBhIHJpZ2h0IGNoaWxkLCBnbyB0byB0aGUgcGFyZW50LgogICAgICAgICAgcG9zaXRpb24gPj49IDE7CiAgICAgICAgfQogICAgICAgIC8vIFRoZW4gZ28gdG8gdGhlIHJpZ2h0IHNpYmxpbmcgb2YgdGhlIGxlZnQtY2hpbGQuCiAgICAgICAgcG9zaXRpb24gKz0gMTsKICAgICAgfSB3aGlsZSAocG9zaXRpb24gPiBfbGVuZ3RoKTsgLy8gSGFwcGVucyBpZiBsYXN0IGVsZW1lbnQgaXMgYSBsZWZ0IGNoaWxkLgogICAgfSB3aGlsZSAocG9zaXRpb24gIT0gMSk7IC8vIEF0IHJvb3QgYWdhaW4uIEhhcHBlbnMgZm9yIHJpZ2h0LW1vc3QgZWxlbWVudC4KICAgIHJldHVybiAtMTsKICB9CgogIEUgX3JlbW92ZUxhc3QoKSB7CiAgICBpbnQgbmV3TGVuZ3RoID0gX2xlbmd0aCAtIDE7CiAgICBFIGxhc3QgPSBfcXVldWVbbmV3TGVuZ3RoXTsKICAgIF9xdWV1ZVtuZXdMZW5ndGhdID0gbnVsbDsKICAgIF9sZW5ndGggPSBuZXdMZW5ndGg7CiAgICByZXR1cm4gbGFzdDsKICB9CgogIC8vLyBQbGFjZSBbZWxlbWVudF0gaW4gaGVhcCBhdCBbaW5kZXhdIG9yIGFib3ZlLgogIC8vLwogIC8vLyBQdXQgZWxlbWVudCBpbnRvIHRoZSBlbXB0eSBjZWxsIGF0IGBpbmRleGAuCiAgLy8vIFdoaWxlIHRoZSBgZWxlbWVudGAgaGFzIGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoZQogIC8vLyBwYXJlbnQsIHN3YXAgaXQgd2l0aCB0aGUgcGFyZW50LgogIHZvaWQgX2J1YmJsZVVwKEUgZWxlbWVudCwgaW50IGluZGV4KSB7CiAgICB3aGlsZSAoaW5kZXggPiAwKSB7CiAgICAgIGludCBwYXJlbnRJbmRleCA9IChpbmRleCAtIDEpIH4vIDI7CiAgICAgIEUgcGFyZW50ID0gX3F1ZXVlW3BhcmVudEluZGV4XTsKICAgICAgaWYgKGNvbXBhcmlzb24oZWxlbWVudCwgcGFyZW50KSA+IDApIGJyZWFrOwogICAgICBfcXVldWVbaW5kZXhdID0gcGFyZW50OwogICAgICBpbmRleCA9IHBhcmVudEluZGV4OwogICAgfQogICAgX3F1ZXVlW2luZGV4XSA9IGVsZW1lbnQ7CiAgfQoKICAvLy8gUGxhY2UgW2VsZW1lbnRdIGluIGhlYXAgYXQgW2luZGV4XSBvciBhYm92ZS4KICAvLy8KICAvLy8gUHV0IGVsZW1lbnQgaW50byB0aGUgZW1wdHkgY2VsbCBhdCBgaW5kZXhgLgogIC8vLyBXaGlsZSB0aGUgYGVsZW1lbnRgIGhhcyBsb3dlciBwcmlvcml0eSB0aGFuIGVpdGhlciBjaGlsZCwKICAvLy8gc3dhcCBpdCB3aXRoIHRoZSBoaWdoZXN0IHByaW9yaXR5IGNoaWxkLgogIHZvaWQgX2J1YmJsZURvd24oRSBlbGVtZW50LCBpbnQgaW5kZXgpIHsKICAgIGludCByaWdodENoaWxkSW5kZXggPSBpbmRleCAqIDIgKyAyOwogICAgd2hpbGUgKHJpZ2h0Q2hpbGRJbmRleCA8IF9sZW5ndGgpIHsKICAgICAgaW50IGxlZnRDaGlsZEluZGV4ID0gcmlnaHRDaGlsZEluZGV4IC0gMTsKICAgICAgRSBsZWZ0Q2hpbGQgPSBfcXVldWVbbGVmdENoaWxkSW5kZXhdOwogICAgICBFIHJpZ2h0Q2hpbGQgPSBfcXVldWVbcmlnaHRDaGlsZEluZGV4XTsKICAgICAgaW50IGNvbXAgPSBjb21wYXJpc29uKGxlZnRDaGlsZCwgcmlnaHRDaGlsZCk7CiAgICAgIGludCBtaW5DaGlsZEluZGV4OwogICAgICBFIG1pbkNoaWxkOwogICAgICBpZiAoY29tcCA8IDApIHsKICAgICAgICBtaW5DaGlsZCA9IGxlZnRDaGlsZDsKICAgICAgICBtaW5DaGlsZEluZGV4ID0gbGVmdENoaWxkSW5kZXg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbWluQ2hpbGQgPSByaWdodENoaWxkOwogICAgICAgIG1pbkNoaWxkSW5kZXggPSByaWdodENoaWxkSW5kZXg7CiAgICAgIH0KICAgICAgY29tcCA9IGNvbXBhcmlzb24oZWxlbWVudCwgbWluQ2hpbGQpOwogICAgICBpZiAoY29tcCA8PSAwKSB7CiAgICAgICAgX3F1ZXVlW2luZGV4XSA9IGVsZW1lbnQ7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIF9xdWV1ZVtpbmRleF0gPSBtaW5DaGlsZDsKICAgICAgaW5kZXggPSBtaW5DaGlsZEluZGV4OwogICAgICByaWdodENoaWxkSW5kZXggPSBpbmRleCAqIDIgKyAyOwogICAgfQogICAgaW50IGxlZnRDaGlsZEluZGV4ID0gcmlnaHRDaGlsZEluZGV4IC0gMTsKICAgIGlmIChsZWZ0Q2hpbGRJbmRleCA8IF9sZW5ndGgpIHsKICAgICAgRSBjaGlsZCA9IF9xdWV1ZVtsZWZ0Q2hpbGRJbmRleF07CiAgICAgIGludCBjb21wID0gY29tcGFyaXNvbihlbGVtZW50LCBjaGlsZCk7CiAgICAgIGlmIChjb21wID4gMCkgewogICAgICAgIF9xdWV1ZVtpbmRleF0gPSBjaGlsZDsKICAgICAgICBpbmRleCA9IGxlZnRDaGlsZEluZGV4OwogICAgICB9CiAgICB9CiAgICBfcXVldWVbaW5kZXhdID0gZWxlbWVudDsKICB9CgogIC8vLyBHcm93cyB0aGUgY2FwYWNpdHkgb2YgdGhlIGxpc3QgaG9sZGluZyB0aGUgaGVhcC4KICAvLy8KICAvLy8gQ2FsbGVkIHdoZW4gdGhlIGxpc3QgaXMgZnVsbC4KICB2b2lkIF9ncm93KCkgewogICAgaW50IG5ld0NhcGFjaXR5ID0gX3F1ZXVlLmxlbmd0aCAqIDIgKyAxOwogICAgaWYgKG5ld0NhcGFjaXR5IDwgX0lOSVRJQUxfQ0FQQUNJVFkpIG5ld0NhcGFjaXR5ID0gX0lOSVRJQUxfQ0FQQUNJVFk7CiAgICBMaXN0PEU+IG5ld1F1ZXVlID0gbmV3IExpc3Q8RT4obmV3Q2FwYWNpdHkpOwogICAgbmV3UXVldWUuc2V0UmFuZ2UoMCwgX2xlbmd0aCwgX3F1ZXVlKTsKICAgIF9xdWV1ZSA9IG5ld1F1ZXVlOwogIH0KfQqBagBOTjwBGgEVAUAEUSIoBkIGSUoZBk9LJE4BJxIBIhQBKhcBKgYsGwEhBkZAFwEoJQFHBjEGPg8BQQZJUBQGPhMBSAY3LhoBQQY0GwEwEAFGBiEGSDMUAUgGIQY4QQY3OCkSAgEfBC9LKTsETlETRzRJSzBQDFEkOUkPBkpOKgFFIgElMwEjBkoTASMGSUoZBk9LJDI4ARgTBAEmIhUGBAERFxEEARwhBAEQPxYEASQBJwEdARsiIRwbLBcgDyIIBhEEARwdGhcRIAQBFD8aHBccBhMEARU0JxsRBAETMigaBhAEATAGQhYsBAEgBjYZKyMEAS8GLRohSEZHFTwWRUYyCSAhLiMWJjkuLCgUCghACyFAGgo7F1BPDwQBFCEgHhkRBAEzBjI3JykYKiYyHhsGHQQBMwYyQC8rKSgwLC40GRIWHigPHykILBchEAggHScGLiQoLRYfIAgGHQQBNwYkES1KMSsXBAIBKnBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvcHJpb3JpdHlfcXVldWUuZGFydDtzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY29sbGVjdGlvbi9saWIvc3JjL3F1ZXVlX2xpc3QuZGFydJ5RLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKCi8vLyBBIGNsYXNzIHRoYXQgZWZmaWNpZW50bHkgaW1wbGVtZW50cyBib3RoIFtRdWV1ZV0gYW5kIFtMaXN0XS4KLy8gVE9ETyhud2Vpeik6IEN1cnJlbnRseSB0aGlzIGNvZGUgaXMgY29waWVkIGFsbW9zdCB2ZXJiYXRpbSBmcm9tCi8vIGRhcnQ6Y29sbGVjdGlvbi4gVGhlIG9ubHkgY2hhbmdlcyBhcmUgdG8gaW1wbGVtZW50IExpc3QgYW5kIHRvIHJlbW92ZSBtZXRob2RzCi8vIHRoYXQgYXJlIHJlZHVuZGFudCB3aXRoIExpc3RNaXhpbi4gUmVtb3ZlIG9yIHNpbXBsaWZ5IGl0IHdoZW4gaXNzdWUgMjEzMzAgaXMKLy8gZml4ZWQuCmNsYXNzIFF1ZXVlTGlzdDxFPiBleHRlbmRzIE9iamVjdCB3aXRoIExpc3RNaXhpbjxFPiBpbXBsZW1lbnRzIFF1ZXVlPEU+IHsKICAvLy8gQWRhcHRzIFtzb3VyY2VdIHRvIGJlIGEgYFF1ZXVlTGlzdDxUPmAuCiAgLy8vCiAgLy8vIEFueSB0aW1lIHRoZSBjbGFzcyB3b3VsZCBwcm9kdWNlIGFuIGVsZW1lbnQgdGhhdCBpcyBub3QgYSBbVF0sIHRoZSBlbGVtZW50CiAgLy8vIGFjY2VzcyB3aWxsIHRocm93LgogIC8vLwogIC8vLyBBbnkgdGltZSBhIFtUXSB2YWx1ZSBpcyBhdHRlbXB0ZWQgc3RvcmVkIGludG8gdGhlIGFkYXB0ZWQgY2xhc3MsIHRoZSBzdG9yZQogIC8vLyB3aWxsIHRocm93IHVubGVzcyB0aGUgdmFsdWUgaXMgYWxzbyBhbiBpbnN0YW5jZSBvZiBbU10uCiAgLy8vCiAgLy8vIElmIGFsbCBhY2Nlc3NlZCBlbGVtZW50cyBvZiBbc291cmNlXSBhcmUgYWN0dWFsbHkgaW5zdGFuY2VzIG9mIFtUXSBhbmQgaWYKICAvLy8gYWxsIGVsZW1lbnRzIHN0b3JlZCBpbiB0aGUgcmV0dXJuZWQgIGFyZSBhY3R1YWxseSBpbnN0YW5jZSBvZiBbU10sCiAgLy8vIHRoZW4gdGhlIHJldHVybmVkIGluc3RhbmNlIGNhbiBiZSB1c2VkIGFzIGEgYFF1ZXVlTGlzdDxUPmAuCiAgc3RhdGljIFF1ZXVlTGlzdDxUPiBfY2FzdEZyb208UywgVD4oUXVldWVMaXN0PFM+IHNvdXJjZSkgewogICAgcmV0dXJuIG5ldyBfQ2FzdFF1ZXVlTGlzdDxTLCBUPihzb3VyY2UpOwogIH0KCiAgc3RhdGljIGNvbnN0IGludCBfSU5JVElBTF9DQVBBQ0lUWSA9IDg7CiAgTGlzdDxFPiBfdGFibGU7CiAgaW50IF9oZWFkOwogIGludCBfdGFpbDsKCiAgLy8vIENyZWF0ZSBhbiBlbXB0eSBxdWV1ZS4KICAvLy8KICAvLy8gSWYgW2luaXRpYWxDYXBhY2l0eV0gaXMgZ2l2ZW4sIHByZXBhcmUgdGhlIHF1ZXVlIGZvciBhdCBsZWFzdCB0aGF0IG1hbnkKICAvLy8gZWxlbWVudHMuCiAgUXVldWVMaXN0KFtpbnQgaW5pdGlhbENhcGFjaXR5XSkKICAgICAgOiBfaGVhZCA9IDAsCiAgICAgICAgX3RhaWwgPSAwIHsKICAgIGlmIChpbml0aWFsQ2FwYWNpdHkgPT0gbnVsbCB8fCBpbml0aWFsQ2FwYWNpdHkgPCBfSU5JVElBTF9DQVBBQ0lUWSkgewogICAgICBpbml0aWFsQ2FwYWNpdHkgPSBfSU5JVElBTF9DQVBBQ0lUWTsKICAgIH0gZWxzZSBpZiAoIV9pc1Bvd2VyT2YyKGluaXRpYWxDYXBhY2l0eSkpIHsKICAgICAgaW5pdGlhbENhcGFjaXR5ID0gX25leHRQb3dlck9mMihpbml0aWFsQ2FwYWNpdHkpOwogICAgfQogICAgYXNzZXJ0KF9pc1Bvd2VyT2YyKGluaXRpYWxDYXBhY2l0eSkpOwogICAgX3RhYmxlID0gbmV3IExpc3Q8RT4oaW5pdGlhbENhcGFjaXR5KTsKICB9CgogIC8vIEFuIGludGVybmFsIGNvbnN0cnVjdG9yIGZvciB1c2UgYnkgX0Nhc3RRdWV1ZUxpc3QuCiAgUXVldWVMaXN0Ll8oKTsKCiAgLy8vIENyZWF0ZSBhIHF1ZXVlIGluaXRpYWxseSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiBbc291cmNlXS4KICBmYWN0b3J5IFF1ZXVlTGlzdC5mcm9tKEl0ZXJhYmxlPEU+IHNvdXJjZSkgewogICAgaWYgKHNvdXJjZSBpcyBMaXN0KSB7CiAgICAgIGludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoOwogICAgICBRdWV1ZUxpc3Q8RT4gcXVldWUgPSBuZXcgUXVldWVMaXN0KGxlbmd0aCArIDEpOwogICAgICBhc3NlcnQocXVldWUuX3RhYmxlLmxlbmd0aCA+IGxlbmd0aCk7CiAgICAgIHZhciBzb3VyY2VMaXN0ID0gc291cmNlOwogICAgICBxdWV1ZS5fdGFibGUuc2V0UmFuZ2UoMCwgbGVuZ3RoLCBzb3VyY2VMaXN0LCAwKTsKICAgICAgcXVldWUuX3RhaWwgPSBsZW5ndGg7CiAgICAgIHJldHVybiBxdWV1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgUXVldWVMaXN0PEU+KCkuLmFkZEFsbChzb3VyY2UpOwogICAgfQogIH0KCiAgLy8gQ29sbGVjdGlvbiBpbnRlcmZhY2UuCgogIHZvaWQgYWRkKEUgZWxlbWVudCkgewogICAgX2FkZChlbGVtZW50KTsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CiAgICBpZiAoaXRlcmFibGUgaXMgTGlzdCkgewogICAgICB2YXIgbGlzdCA9IGl0ZXJhYmxlOwogICAgICBpbnQgYWRkQ291bnQgPSBsaXN0Lmxlbmd0aDsKICAgICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgICBpZiAobGVuZ3RoICsgYWRkQ291bnQgPj0gX3RhYmxlLmxlbmd0aCkgewogICAgICAgIF9wcmVHcm93KGxlbmd0aCArIGFkZENvdW50KTsKICAgICAgICAvLyBBZnRlciBwcmVHcm93LCBhbGwgZWxlbWVudHMgYXJlIGF0IHRoZSBzdGFydCBvZiB0aGUgbGlzdC4KICAgICAgICBfdGFibGUuc2V0UmFuZ2UobGVuZ3RoLCBsZW5ndGggKyBhZGRDb3VudCwgbGlzdCwgMCk7CiAgICAgICAgX3RhaWwgKz0gYWRkQ291bnQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQWRkaW5nIGFkZENvdW50IGVsZW1lbnRzIHdvbid0IHJlYWNoIF9oZWFkLgogICAgICAgIGludCBlbmRTcGFjZSA9IF90YWJsZS5sZW5ndGggLSBfdGFpbDsKICAgICAgICBpZiAoYWRkQ291bnQgPCBlbmRTcGFjZSkgewogICAgICAgICAgX3RhYmxlLnNldFJhbmdlKF90YWlsLCBfdGFpbCArIGFkZENvdW50LCBsaXN0LCAwKTsKICAgICAgICAgIF90YWlsICs9IGFkZENvdW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbnQgcHJlU3BhY2UgPSBhZGRDb3VudCAtIGVuZFNwYWNlOwogICAgICAgICAgX3RhYmxlLnNldFJhbmdlKF90YWlsLCBfdGFpbCArIGVuZFNwYWNlLCBsaXN0LCAwKTsKICAgICAgICAgIF90YWJsZS5zZXRSYW5nZSgwLCBwcmVTcGFjZSwgbGlzdCwgZW5kU3BhY2UpOwogICAgICAgICAgX3RhaWwgPSBwcmVTcGFjZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAoRSBlbGVtZW50IGluIGl0ZXJhYmxlKSBfYWRkKGVsZW1lbnQpOwogICAgfQogIH0KCiAgUXVldWVMaXN0PFQ+IGNhc3Q8VD4oKSA9PiBRdWV1ZUxpc3QuX2Nhc3RGcm9tPEUsIFQ+KHRoaXMpOwoKICBAZGVwcmVjYXRlZAogIFF1ZXVlTGlzdDxUPiByZXR5cGU8VD4oKSA9PiBjYXN0PFQ+KCk7CgogIFN0cmluZyB0b1N0cmluZygpID0+IEl0ZXJhYmxlQmFzZS5pdGVyYWJsZVRvRnVsbFN0cmluZyh0aGlzLCAieyIsICJ9Iik7CgogIC8vIFF1ZXVlIGludGVyZmFjZS4KCiAgdm9pZCBhZGRMYXN0KEUgZWxlbWVudCkgewogICAgX2FkZChlbGVtZW50KTsKICB9CgogIHZvaWQgYWRkRmlyc3QoRSBlbGVtZW50KSB7CiAgICBfaGVhZCA9IChfaGVhZCAtIDEpICYgKF90YWJsZS5sZW5ndGggLSAxKTsKICAgIF90YWJsZVtfaGVhZF0gPSBlbGVtZW50OwogICAgaWYgKF9oZWFkID09IF90YWlsKSBfZ3JvdygpOwogIH0KCiAgRSByZW1vdmVGaXJzdCgpIHsKICAgIGlmIChfaGVhZCA9PSBfdGFpbCkgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIk5vIGVsZW1lbnQiKTsKICAgIEUgcmVzdWx0ID0gX3RhYmxlW19oZWFkXTsKICAgIF90YWJsZVtfaGVhZF0gPSBudWxsOwogICAgX2hlYWQgPSAoX2hlYWQgKyAxKSAmIChfdGFibGUubGVuZ3RoIC0gMSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgRSByZW1vdmVMYXN0KCkgewogICAgaWYgKF9oZWFkID09IF90YWlsKSB0aHJvdyBuZXcgU3RhdGVFcnJvcigiTm8gZWxlbWVudCIpOwogICAgX3RhaWwgPSAoX3RhaWwgLSAxKSAmIChfdGFibGUubGVuZ3RoIC0gMSk7CiAgICBFIHJlc3VsdCA9IF90YWJsZVtfdGFpbF07CiAgICBfdGFibGVbX3RhaWxdID0gbnVsbDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLyBMaXN0IGludGVyZmFjZS4KCiAgaW50IGdldCBsZW5ndGggPT4gKF90YWlsIC0gX2hlYWQpICYgKF90YWJsZS5sZW5ndGggLSAxKTsKCiAgc2V0IGxlbmd0aChpbnQgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCJMZW5ndGggJHZhbHVlIG1heSBub3QgYmUgbmVnYXRpdmUuIik7CgogICAgaW50IGRlbHRhID0gdmFsdWUgLSBsZW5ndGg7CiAgICBpZiAoZGVsdGEgPj0gMCkgewogICAgICBpZiAoX3RhYmxlLmxlbmd0aCA8PSB2YWx1ZSkgewogICAgICAgIF9wcmVHcm93KHZhbHVlKTsKICAgICAgfQogICAgICBfdGFpbCA9IChfdGFpbCArIGRlbHRhKSAmIChfdGFibGUubGVuZ3RoIC0gMSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpbnQgbmV3VGFpbCA9IF90YWlsICsgZGVsdGE7IC8vIFtkZWx0YV0gaXMgbmVnYXRpdmUuCiAgICBpZiAobmV3VGFpbCA+PSAwKSB7CiAgICAgIF90YWJsZS5maWxsUmFuZ2UobmV3VGFpbCwgX3RhaWwsIG51bGwpOwogICAgfSBlbHNlIHsKICAgICAgbmV3VGFpbCArPSBfdGFibGUubGVuZ3RoOwogICAgICBfdGFibGUuZmlsbFJhbmdlKDAsIF90YWlsLCBudWxsKTsKICAgICAgX3RhYmxlLmZpbGxSYW5nZShuZXdUYWlsLCBfdGFibGUubGVuZ3RoLCBudWxsKTsKICAgIH0KICAgIF90YWlsID0gbmV3VGFpbDsKICB9CgogIEUgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggJGluZGV4IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLi4kbGVuZ3RoKS4iKTsKICAgIH0KCiAgICByZXR1cm4gX3RhYmxlWyhfaGVhZCArIGluZGV4KSAmIChfdGFibGUubGVuZ3RoIC0gMSldOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBFIHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggJGluZGV4IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLi4kbGVuZ3RoKS4iKTsKICAgIH0KCiAgICBfdGFibGVbKF9oZWFkICsgaW5kZXgpICYgKF90YWJsZS5sZW5ndGggLSAxKV0gPSB2YWx1ZTsKICB9CgogIC8vIEludGVybmFsIGhlbHBlciBmdW5jdGlvbnMuCgogIC8vLyBXaGV0aGVyIFtudW1iZXJdIGlzIGEgcG93ZXIgb2YgdHdvLgogIC8vLwogIC8vLyBPbmx5IHdvcmtzIGZvciBwb3NpdGl2ZSBudW1iZXJzLgogIHN0YXRpYyBib29sIF9pc1Bvd2VyT2YyKGludCBudW1iZXIpID0+IChudW1iZXIgJiAobnVtYmVyIC0gMSkpID09IDA7CgogIC8vLyBSb3VuZHMgW251bWJlcl0gdXAgdG8gdGhlIG5lYXJlc3QgcG93ZXIgb2YgMi4KICAvLy8KICAvLy8gSWYgW251bWJlcl0gaXMgYSBwb3dlciBvZiAyIGFscmVhZHksIGl0IGlzIHJldHVybmVkLgogIC8vLwogIC8vLyBPbmx5IHdvcmtzIGZvciBwb3NpdGl2ZSBudW1iZXJzLgogIHN0YXRpYyBpbnQgX25leHRQb3dlck9mMihpbnQgbnVtYmVyKSB7CiAgICBhc3NlcnQobnVtYmVyID4gMCk7CiAgICBudW1iZXIgPSAobnVtYmVyIDw8IDEpIC0gMTsKICAgIGZvciAoOzspIHsKICAgICAgaW50IG5leHROdW1iZXIgPSBudW1iZXIgJiAobnVtYmVyIC0gMSk7CiAgICAgIGlmIChuZXh0TnVtYmVyID09IDApIHJldHVybiBudW1iZXI7CiAgICAgIG51bWJlciA9IG5leHROdW1iZXI7CiAgICB9CiAgfQoKICAvLy8gQWRkcyBlbGVtZW50IGF0IGVuZCBvZiBxdWV1ZS4gVXNlZCBieSBib3RoIFthZGRdIGFuZCBbYWRkQWxsXS4KICB2b2lkIF9hZGQoRSBlbGVtZW50KSB7CiAgICBfdGFibGVbX3RhaWxdID0gZWxlbWVudDsKICAgIF90YWlsID0gKF90YWlsICsgMSkgJiAoX3RhYmxlLmxlbmd0aCAtIDEpOwogICAgaWYgKF9oZWFkID09IF90YWlsKSBfZ3JvdygpOwogIH0KCiAgLy8vIEdyb3cgdGhlIHRhYmxlIHdoZW4gZnVsbC4KICB2b2lkIF9ncm93KCkgewogICAgTGlzdDxFPiBuZXdUYWJsZSA9IG5ldyBMaXN0PEU+KF90YWJsZS5sZW5ndGggKiAyKTsKICAgIGludCBzcGxpdCA9IF90YWJsZS5sZW5ndGggLSBfaGVhZDsKICAgIG5ld1RhYmxlLnNldFJhbmdlKDAsIHNwbGl0LCBfdGFibGUsIF9oZWFkKTsKICAgIG5ld1RhYmxlLnNldFJhbmdlKHNwbGl0LCBzcGxpdCArIF9oZWFkLCBfdGFibGUsIDApOwogICAgX2hlYWQgPSAwOwogICAgX3RhaWwgPSBfdGFibGUubGVuZ3RoOwogICAgX3RhYmxlID0gbmV3VGFibGU7CiAgfQoKICBpbnQgX3dyaXRlVG9MaXN0KExpc3Q8RT4gdGFyZ2V0KSB7CiAgICBhc3NlcnQodGFyZ2V0Lmxlbmd0aCA+PSBsZW5ndGgpOwogICAgaWYgKF9oZWFkIDw9IF90YWlsKSB7CiAgICAgIGludCBsZW5ndGggPSBfdGFpbCAtIF9oZWFkOwogICAgICB0YXJnZXQuc2V0UmFuZ2UoMCwgbGVuZ3RoLCBfdGFibGUsIF9oZWFkKTsKICAgICAgcmV0dXJuIGxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIGludCBmaXJzdFBhcnRTaXplID0gX3RhYmxlLmxlbmd0aCAtIF9oZWFkOwogICAgICB0YXJnZXQuc2V0UmFuZ2UoMCwgZmlyc3RQYXJ0U2l6ZSwgX3RhYmxlLCBfaGVhZCk7CiAgICAgIHRhcmdldC5zZXRSYW5nZShmaXJzdFBhcnRTaXplLCBmaXJzdFBhcnRTaXplICsgX3RhaWwsIF90YWJsZSwgMCk7CiAgICAgIHJldHVybiBfdGFpbCArIGZpcnN0UGFydFNpemU7CiAgICB9CiAgfQoKICAvLy8gR3Jvd3MgdGhlIHRhYmxlIGV2ZW4gaWYgaXQgaXMgbm90IGZ1bGwuCiAgdm9pZCBfcHJlR3JvdyhpbnQgbmV3RWxlbWVudENvdW50KSB7CiAgICBhc3NlcnQobmV3RWxlbWVudENvdW50ID49IGxlbmd0aCk7CgogICAgLy8gQWRkIDEuNXggZXh0cmEgcm9vbSB0byBlbnN1cmUgdGhhdCB0aGVyZSdzIHJvb20gZm9yIG1vcmUgZWxlbWVudHMgYWZ0ZXIKICAgIC8vIGV4cGFuc2lvbi4KICAgIG5ld0VsZW1lbnRDb3VudCArPSBuZXdFbGVtZW50Q291bnQgPj4gMTsKICAgIGludCBuZXdDYXBhY2l0eSA9IF9uZXh0UG93ZXJPZjIobmV3RWxlbWVudENvdW50KTsKICAgIExpc3Q8RT4gbmV3VGFibGUgPSBuZXcgTGlzdDxFPihuZXdDYXBhY2l0eSk7CiAgICBfdGFpbCA9IF93cml0ZVRvTGlzdChuZXdUYWJsZSk7CiAgICBfdGFibGUgPSBuZXdUYWJsZTsKICAgIF9oZWFkID0gMDsKICB9Cn0KCmNsYXNzIF9DYXN0UXVldWVMaXN0PFMsIFQ+IGV4dGVuZHMgUXVldWVMaXN0PFQ+IHsKICBmaW5hbCBRdWV1ZUxpc3Q8Uz4gX2RlbGVnYXRlOwoKICBfQ2FzdFF1ZXVlTGlzdCh0aGlzLl9kZWxlZ2F0ZSkgOiBzdXBlci5fKCkgewogICAgX3RhYmxlID0gX2RlbGVnYXRlLl90YWJsZS5jYXN0PFQ+KCk7CiAgfQoKICBpbnQgZ2V0IF9oZWFkID0+IF9kZWxlZ2F0ZS5faGVhZDsKICBzZXQgX2hlYWQoaW50IHZhbHVlKSA9PiBfZGVsZWdhdGUuX2hlYWQgPSB2YWx1ZTsKCiAgaW50IGdldCBfdGFpbCA9PiBfZGVsZWdhdGUuX3RhaWw7CiAgc2V0IF90YWlsKGludCB2YWx1ZSkgPT4gX2RlbGVnYXRlLl90YWlsID0gdmFsdWU7Cn0KgQYATk48ARoBQUNRUApKLgZRGQZRPgZQSUI9LQQBKhINDQEdBk4QIxMUSiswOAYqKwQBOBEBRC8aIjYsHzccFA0xBgQBGwEYEwQBJhwbIiAwJUU9Gw83LiM9HREuPTgcCggNMQYEAT0BDikBSgEWARwTBAEdLx0hBAEUPB4aLxMEARM8Lx4aEwQBFQE7ARpPASAWJBkINQ4GATkYLg0gKDYGFQQBHShPBgE6BAEqKE8GATsEASABKgYnRwE0BjsGJykYIA8uKhsGBAFFGR0vIQQBIBE3JzA4DxsXBAElJRoiMRUNMThIJAYEAS4nJwFPEi02MSQXDwQCATIgAS8pBAEkMwEkMwIBJnBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvcXVldWVfbGlzdC5kYXJ0OnNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jb2xsZWN0aW9uL2xpYi9zcmMvdW5pb25fc2V0LmRhcnSNYC8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CgppbXBvcnQgJ3VubW9kaWZpYWJsZV93cmFwcGVycy5kYXJ0JzsKCi8vLyBBIHNpbmdsZSBzZXQgdGhhdCBwcm92aWRlcyBhIHZpZXcgb2YgdGhlIHVuaW9uIG92ZXIgYSBzZXQgb2Ygc2V0cy4KLy8vCi8vLyBTaW5jZSB0aGlzIGlzIGp1c3QgYSB2aWV3LCBpdCByZWZsZWN0cyBhbGwgY2hhbmdlcyBpbiB0aGUgdW5kZXJseWluZyBzZXRzLgovLy8KLy8vIElmIGFuIGVsZW1lbnQgaXMgaW4gbXVsdGlwbGUgc2V0cyBhbmQgdGhlIG91dGVyIHNldCBpcyBvcmRlcmVkLCB0aGUgdmVyc2lvbgovLy8gaW4gdGhlIGVhcmxpZXN0IGlubmVyIHNldCBpcyBwcmVmZXJyZWQuIENvbXBvbmVudCBzZXRzIGFyZSBhc3N1bWVkIHRvIHVzZQovLy8gYD09YCBhbmQgYGhhc2hDb2RlYCBmb3IgZXF1YWxpdHkuCmNsYXNzIFVuaW9uU2V0PEU+IGV4dGVuZHMgU2V0QmFzZTxFPiB3aXRoIFVubW9kaWZpYWJsZVNldE1peGluPEU+IHsKICAvLy8gVGhlIHNldCBvZiBzZXRzIHRoYXQgdGhpcyBwcm92aWRlcyBhIHZpZXcgb2YuCiAgZmluYWwgU2V0PFNldDxFPj4gX3NldHM7CgogIC8vLyBXaGV0aGVyIHRoZSBzZXRzIGluIFtfc2V0c10gYXJlIGd1YXJhbnRlZWQgdG8gYmUgZGlzam9pbnQuCiAgZmluYWwgYm9vbCBfZGlzam9pbnQ7CgogIC8vLyBDcmVhdGVzIGEgbmV3IHNldCB0aGF0J3MgYSB2aWV3IG9mIHRoZSB1bmlvbiBvZiBhbGwgc2V0cyBpbiBbc2V0c10uCiAgLy8vCiAgLy8vIElmIGFueSBzZXRzIGluIFtzZXRzXSBjaGFuZ2UsIHRoaXMgW1VuaW9uU2V0XSByZWZsZWN0cyB0aGF0IGNoYW5nZS4gSWYgYQogIC8vLyBuZXcgc2V0IGlzIGFkZGVkIHRvIFtzZXRzXSwgdGhpcyBbVW5pb25TZXRdIHJlZmxlY3RzIHRoYXQgYXMgd2VsbC4KICAvLy8KICAvLy8gSWYgW2Rpc2pvaW50XSBpcyBgdHJ1ZWAsIHRoZW4gYWxsIGNvbXBvbmVudCBzZXRzIG11c3QgYmUgZGlzam9pbnQuIFRoYXQKICAvLy8gaXMsIHRoYXQgdGhleSBjb250YWluIG5vIGVsZW1lbnRzIGluIGNvbW1vbi4gVGhpcyBtYWtlcyBtYW55IG9wZXJhdGlvbnMKICAvLy8gaW5jbHVkaW5nIFtsZW5ndGhdIG1vcmUgZWZmaWNpZW50LiBJZiB0aGUgY29tcG9uZW50IHNldHMgdHVybiBvdXQgbm90IHRvCiAgLy8vIGJlIGRpc2pvaW50LCBzb21lIG9wZXJhdGlvbnMgbWF5IGJlaGF2ZSBpbmNvbnNpc3RlbnRseS4KICBVbmlvblNldCh0aGlzLl9zZXRzLCB7Ym9vbCBkaXNqb2ludDogZmFsc2V9KSA6IF9kaXNqb2ludCA9IGRpc2pvaW50OwoKICAvLy8gQ3JlYXRlcyBhIG5ldyBzZXQgdGhhdCdzIGEgdmlldyBvZiB0aGUgdW5pb24gb2YgYWxsIHNldHMgaW4gW3NldHNdLgogIC8vLwogIC8vLyBJZiBhbnkgc2V0cyBpbiBbc2V0c10gY2hhbmdlLCB0aGlzIFtVbmlvblNldF0gcmVmbGVjdHMgdGhhdCBjaGFuZ2UuCiAgLy8vIEhvd2V2ZXIsIHVubGlrZSBbbmV3IFVuaW9uU2V0XSwgdGhpcyBjcmVhdGVzIGEgY29weSBvZiBpdHMgcGFyYW1ldGVyLCBzbwogIC8vLyBjaGFuZ2VzIGluIFtzZXRzXSBhcmVuJ3QgcmVmbGVjdGVkIGluIHRoaXMgW1VuaW9uU2V0XS4KICAvLy8KICAvLy8gSWYgW2Rpc2pvaW50XSBpcyBgdHJ1ZWAsIHRoZW4gYWxsIGNvbXBvbmVudCBzZXRzIG11c3QgYmUgZGlzam9pbnQuIFRoYXQKICAvLy8gaXMsIHRoYXQgdGhleSBjb250YWluIG5vIGVsZW1lbnRzIGluIGNvbW1vbi4gVGhpcyBtYWtlcyBtYW55IG9wZXJhdGlvbnMKICAvLy8gaW5jbHVkaW5nIFtsZW5ndGhdIG1vcmUgZWZmaWNpZW50LiBJZiB0aGUgY29tcG9uZW50IHNldHMgdHVybiBvdXQgbm90IHRvCiAgLy8vIGJlIGRpc2pvaW50LCBzb21lIG9wZXJhdGlvbnMgbWF5IGJlaGF2ZSBpbmNvbnNpc3RlbnRseS4KICBVbmlvblNldC5mcm9tKEl0ZXJhYmxlPFNldDxFPj4gc2V0cywge2Jvb2wgZGlzam9pbnQ6IGZhbHNlfSkKICAgICAgOiB0aGlzKHNldHMudG9TZXQoKSwgZGlzam9pbnQ6IGRpc2pvaW50KTsKCiAgaW50IGdldCBsZW5ndGggPT4gX2Rpc2pvaW50CiAgICAgID8gX3NldHMuZm9sZCgwLCAobGVuZ3RoLCBzZXQpID0+IGxlbmd0aCArIHNldC5sZW5ndGgpCiAgICAgIDogX2l0ZXJhYmxlLmxlbmd0aDsKCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yID0+IF9pdGVyYWJsZS5pdGVyYXRvcjsKCiAgLy8vIFJldHVybnMgYW4gaXRlcmFibGUgb3ZlciB0aGUgY29udGVudHMgb2YgYWxsIHRoZSBzZXRzIGluIFt0aGlzXS4KICBJdGVyYWJsZTxFPiBnZXQgX2l0ZXJhYmxlID0+CiAgICAgIF9kaXNqb2ludCA/IF9zZXRzLmV4cGFuZCgoc2V0KSA9PiBzZXQpIDogX2RlZHVwSXRlcmFibGU7CgogIC8vLyBSZXR1cm5zIGFuIGl0ZXJhYmxlIG92ZXIgdGhlIGNvbnRlbnRzIG9mIGFsbCB0aGUgc2V0cyBpbiBbdGhpc10gdGhhdAogIC8vLyBkZS1kdXBsaWNhdGVzIGVsZW1lbnRzLgogIC8vLwogIC8vLyBJZiB0aGUgc2V0cyBhcmVuJ3QgZ3VhcmFudGVlZCB0byBiZSBkaXNqb2ludCwgdGhpcyBrZWVwcyB0cmFjayBvZiB0aGUKICAvLy8gZWxlbWVudHMgd2UndmUgYWxyZWFkeSBlbWl0dGVkIHNvIHRoYXQgd2UgY2FuIGRlLWR1cGxpY2F0ZSB0aGVtLgogIEl0ZXJhYmxlPEU+IGdldCBfZGVkdXBJdGVyYWJsZSB7CiAgICB2YXIgc2VlbiA9IG5ldyBTZXQ8RT4oKTsKICAgIHJldHVybiBfc2V0cy5leHBhbmQoKHNldCkgPT4gc2V0KS53aGVyZSgoZWxlbWVudCkgewogICAgICBpZiAoc2Vlbi5jb250YWlucyhlbGVtZW50KSkgcmV0dXJuIGZhbHNlOwogICAgICBzZWVuLmFkZChlbGVtZW50KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9KTsKICB9CgogIGJvb2wgY29udGFpbnMoT2JqZWN0IGVsZW1lbnQpID0+IF9zZXRzLmFueSgoc2V0KSA9PiBzZXQuY29udGFpbnMoZWxlbWVudCkpOwoKICBFIGxvb2t1cChPYmplY3QgZWxlbWVudCkgewogICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CgogICAgcmV0dXJuIF9zZXRzCiAgICAgICAgLm1hcCgoc2V0KSA9PiBzZXQubG9va3VwKGVsZW1lbnQpKQogICAgICAgIC5maXJzdFdoZXJlKChyZXN1bHQpID0+IHJlc3VsdCAhPSBudWxsLCBvckVsc2U6ICgpID0+IG51bGwpOwogIH0KCiAgU2V0PEU+IHRvU2V0KCkgewogICAgdmFyIHJlc3VsdCA9IG5ldyBTZXQ8RT4oKTsKICAgIGZvciAodmFyIHNldCBpbiBfc2V0cykgewogICAgICByZXN1bHQuYWRkQWxsKHNldCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQpaAE5OPAEaASUBRwRPBFBOJkQ0GwFBGAFKBk9JBk5OTz5HAUoGSk89Bk5OTz4/MAEePBoBMgFHHz8BSx4GTEcjHTgwGRMIBAFOAR0mARErRQQBEx8dGgYTBAIBJXBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvdW5pb25fc2V0LmRhcnRGc2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NvbGxlY3Rpb24vbGliL3NyYy91bm1vZGlmaWFibGVfd3JhcHBlcnMuZGFydJjxLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZW1wdHlfdW5tb2RpZmlhYmxlX3NldC5kYXJ0JzsKaW1wb3J0ICd3cmFwcGVycy5kYXJ0JzsKCmV4cG9ydCAiZGFydDpjb2xsZWN0aW9uIiBzaG93IFVubW9kaWZpYWJsZUxpc3RWaWV3LCBVbm1vZGlmaWFibGVNYXBWaWV3OwoKLy8vIEEgZml4ZWQtbGVuZ3RoIGxpc3QuCi8vLwovLy8gQSBgTm9uR3Jvd2FibGVMaXN0Vmlld2AgY29udGFpbnMgYSBbTGlzdF0gb2JqZWN0IGFuZCBlbnN1cmVzIHRoYXQKLy8vIGl0cyBsZW5ndGggZG9lcyBub3QgY2hhbmdlLgovLy8gTWV0aG9kcyB0aGF0IHdvdWxkIGNoYW5nZSB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0LAovLy8gc3VjaCBhcyBbYWRkXSBhbmQgW3JlbW92ZV0sIHRocm93IGFuIFtVbnN1cHBvcnRlZEVycm9yXS4KLy8vIEFsbCBvdGhlciBtZXRob2RzIHdvcmsgZGlyZWN0bHkgb24gdGhlIHVuZGVybHlpbmcgbGlzdC4KLy8vCi8vLyBUaGlzIGNsYXNzIF9kb2VzXyBhbGxvdyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50cyBvZiB0aGUgd3JhcHBlZCBsaXN0LgovLy8gWW91IGNhbiwgZm9yIGV4YW1wbGUsIFtzb3J0XSB0aGUgbGlzdC4KLy8vIFBlcm1pdHRlZCBvcGVyYXRpb25zIGRlZmVyIHRvIHRoZSB3cmFwcGVkIGxpc3QuCmNsYXNzIE5vbkdyb3dhYmxlTGlzdFZpZXc8RT4gZXh0ZW5kcyBEZWxlZ2F0aW5nTGlzdDxFPgogICAgd2l0aCBOb25Hcm93YWJsZUxpc3RNaXhpbjxFPiB7CiAgTm9uR3Jvd2FibGVMaXN0VmlldyhMaXN0PEU+IGxpc3RCYXNlKSA6IHN1cGVyKGxpc3RCYXNlKTsKfQoKLy8vIE1peGluIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhIHRocm93aW5nIHZlcnNpb24gb2YgYWxsIGxpc3Qgb3BlcmF0aW9ucyB0aGF0Ci8vLyBjaGFuZ2UgdGhlIExpc3QncyBsZW5ndGguCmFic3RyYWN0IGNsYXNzIE5vbkdyb3dhYmxlTGlzdE1peGluPEU+IGltcGxlbWVudHMgTGlzdDxFPiB7CiAgc3RhdGljIFQgX3Rocm93PFQ+KCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIkNhbm5vdCBjaGFuZ2UgdGhlIGxlbmd0aCBvZiBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXTsKICAvLy8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGFyZSBkaXNhbGxvd2VkLgogIHNldCBsZW5ndGgoaW50IG5ld0xlbmd0aCkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYXJlIGRpc2FsbG93ZWQuCiAgYm9vbCBhZGQoRSB2YWx1ZSkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYXJlIGRpc2FsbG93ZWQuCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gaXRlcmFibGUpID0+IF90aHJvdygpOwoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXTsKICAvLy8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGFyZSBkaXNhbGxvd2VkLgogIHZvaWQgaW5zZXJ0KGludCBpbmRleCwgRSBlbGVtZW50KSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBhcmUgZGlzYWxsb3dlZC4KICB2b2lkIGluc2VydEFsbChpbnQgaW5kZXgsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBhcmUgZGlzYWxsb3dlZC4KICBib29sIHJlbW92ZShPYmplY3QgdmFsdWUpID0+IF90aHJvdygpOwoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXTsKICAvLy8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGFyZSBkaXNhbGxvd2VkLgogIEUgcmVtb3ZlQXQoaW50IGluZGV4KSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBhcmUgZGlzYWxsb3dlZC4KICBFIHJlbW92ZUxhc3QoKSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBhcmUgZGlzYWxsb3dlZC4KICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBhcmUgZGlzYWxsb3dlZC4KICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBhcmUgZGlzYWxsb3dlZC4KICB2b2lkIHJlbW92ZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYXJlIGRpc2FsbG93ZWQuCiAgdm9pZCByZXBsYWNlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZTxFPiBpdGVyYWJsZSkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYXJlIGRpc2FsbG93ZWQuCiAgdm9pZCBjbGVhcigpID0+IF90aHJvdygpOwp9CgovLy8gQW4gdW5tb2RpZmlhYmxlIHNldC4KLy8vCi8vLyBBbiBVbm1vZGlmaWFibGVTZXRWaWV3IGNvbnRhaW5zIGEgW1NldF0gb2JqZWN0IGFuZCBlbnN1cmVzCi8vLyB0aGF0IGl0IGRvZXMgbm90IGNoYW5nZS4KLy8vIE1ldGhvZHMgdGhhdCB3b3VsZCBjaGFuZ2UgdGhlIHNldCwKLy8vIHN1Y2ggYXMgW2FkZF0gYW5kIFtyZW1vdmVdLCB0aHJvdyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0uCi8vLyBQZXJtaXR0ZWQgb3BlcmF0aW9ucyBkZWZlciB0byB0aGUgd3JhcHBlZCBzZXQuCmNsYXNzIFVubW9kaWZpYWJsZVNldFZpZXc8RT4gZXh0ZW5kcyBEZWxlZ2F0aW5nU2V0PEU+CiAgICB3aXRoIFVubW9kaWZpYWJsZVNldE1peGluPEU+IHsKICBVbm1vZGlmaWFibGVTZXRWaWV3KFNldDxFPiBzZXRCYXNlKSA6IHN1cGVyKHNldEJhc2UpOwoKICAvLy8gQW4gdW5tb2RpZmlhYmxlIGVtcHR5IHNldC4KICAvLy8KICAvLy8gVGhpcyBpcyB0aGUgc2FtZSBhcyBgbmV3IFVubW9kaWZpYWJsZVNldFZpZXcobmV3IFNldCgpKWAsIGV4Y2VwdCB0aGF0IGl0CiAgLy8vIGNhbiBiZSB1c2VkIGluIGNvbnN0IGNvbnRleHRzLgogIGNvbnN0IGZhY3RvcnkgVW5tb2RpZmlhYmxlU2V0Vmlldy5lbXB0eSgpID0gRW1wdHlVbm1vZGlmaWFibGVTZXQ8RT47Cn0KCi8vLyBNaXhpbiBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSB0aHJvd2luZyB2ZXJzaW9uIG9mIGFsbCBzZXQgb3BlcmF0aW9ucyB0aGF0Ci8vLyBjaGFuZ2UgdGhlIFNldC4KYWJzdHJhY3QgY2xhc3MgVW5tb2RpZmlhYmxlU2V0TWl4aW48RT4gaW1wbGVtZW50cyBTZXQ8RT4gewogIHN0YXRpYyBUIF90aHJvdzxUPigpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBTZXQiKTsKICB9CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBzZXQgYXJlIGRpc2FsbG93ZWQuCiAgYm9vbCBhZGQoRSB2YWx1ZSkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBzZXQgYXJlIGRpc2FsbG93ZWQuCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gZWxlbWVudHMpID0+IF90aHJvdygpOwoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXTsKICAvLy8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgc2V0IGFyZSBkaXNhbGxvd2VkLgogIGJvb2wgcmVtb3ZlKE9iamVjdCB2YWx1ZSkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBzZXQgYXJlIGRpc2FsbG93ZWQuCiAgdm9pZCByZW1vdmVBbGwoSXRlcmFibGUgZWxlbWVudHMpID0+IF90aHJvdygpOwoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXTsKICAvLy8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgc2V0IGFyZSBkaXNhbGxvd2VkLgogIHZvaWQgcmV0YWluQWxsKEl0ZXJhYmxlIGVsZW1lbnRzKSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIHNldCBhcmUgZGlzYWxsb3dlZC4KICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIHNldCBhcmUgZGlzYWxsb3dlZC4KICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIHNldCBhcmUgZGlzYWxsb3dlZC4KICB2b2lkIGNsZWFyKCkgPT4gX3Rocm93KCk7Cn0KCi8vLyBNaXhpbiBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSB0aHJvd2luZyB2ZXJzaW9uIG9mIGFsbCBtYXAgb3BlcmF0aW9ucyB0aGF0Ci8vLyBjaGFuZ2UgdGhlIE1hcC4KYWJzdHJhY3QgY2xhc3MgVW5tb2RpZmlhYmxlTWFwTWl4aW48SywgVj4gaW1wbGVtZW50cyBNYXA8SywgVj4gewogIHN0YXRpYyBUIF90aHJvdzxUPigpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBNYXAiKTsKICB9CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBtYXAgYXJlIGRpc2FsbG93ZWQuCiAgdm9pZCBvcGVyYXRvciBbXT0oSyBrZXksIFYgdmFsdWUpID0+IF90aHJvdygpOwoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXTsKICAvLy8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgbWFwIGFyZSBkaXNhbGxvd2VkLgogIFYgcHV0SWZBYnNlbnQoSyBrZXksIFYgaWZBYnNlbnQoKSkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBtYXAgYXJlIGRpc2FsbG93ZWQuCiAgdm9pZCBhZGRBbGwoTWFwPEssIFY+IG90aGVyKSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIG1hcCBhcmUgZGlzYWxsb3dlZC4KICBWIHJlbW92ZShPYmplY3Qga2V5KSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIG1hcCBhcmUgZGlzYWxsb3dlZC4KICB2b2lkIGNsZWFyKCkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBtYXAgYXJlIGRpc2FsbG93ZWQuCiAgc2V0IGZpcnN0KF8pID0+IF90aHJvdygpOwoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXTsKICAvLy8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgbWFwIGFyZSBkaXNhbGxvd2VkLgogIHNldCBsYXN0KF8pID0+IF90aHJvdygpOwp9CoC1AE5OPAEmGAFJARkERiA2PTwESSs0NyM7AgFPHjwZIDwEASREKQEkRCEBJEQxASREMQEkRD8BJEQpASREJQEkRB4BJEQ2ASRENgEkRDQBJERLASREHAIBGQQ/HSc9MzYjOAEhBk8lRwIBThQ7GUUEASQ1IQEkNTEBJDUpASQ1MQEkNTEBJDU2ASQ1NgEkNRwCAU4UQRlFBAEkNTEBJDUyASQ1LAEkNSQBJDUcASQ1HAEkNRsCATFwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL3VubW9kaWZpYWJsZV93cmFwcGVycy5kYXJ0RXNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jb2xsZWN0aW9uL2xpYi9zcmMvdW5pb25fc2V0X2NvbnRyb2xsZXIuZGFydIdQLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAndW5pb25fc2V0LmRhcnQnOwoKLy8vIEEgY29udHJvbGxlciB0aGF0IGV4cG9zZXMgYSB2aWV3IG9mIHRoZSB1bmlvbiBvZiBhIGNvbGxlY3Rpb24gb2Ygc2V0cy4KLy8vCi8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgY2xhc3MgZm9yIGNyZWF0aW5nIGEgW1VuaW9uU2V0XSB3aG9zZSBjb250ZW50cyBjaGFuZ2UKLy8vIG92ZXIgdGhlIGxpZmV0aW1lIG9mIGEgY2xhc3MuIEZvciBleGFtcGxlOgovLy8KLy8vIGBgYGRhcnQKLy8vIGNsYXNzIEVuZ2luZSB7Ci8vLyAgIFNldDxUZXN0PiBnZXQgYWN0aXZlVGVzdHMgPT4gX2FjdGl2ZVRlc3RzR3JvdXAuc2V0OwovLy8gICBmaW5hbCBfYWN0aXZlVGVzdHNHcm91cCA9IG5ldyBVbmlvblNldENvbnRyb2xsZXI8VGVzdD4oKTsKLy8vCi8vLyAgIHZvaWQgYWRkU3VpdGUoU3VpdGUgc3VpdGUpIHsKLy8vICAgICBfYWN0aXZlVGVzdHNHcm91cC5hZGQoc3VpdGUudGVzdHMpOwovLy8gICAgIF9ydW5TdWl0ZShzdWl0ZSk7Ci8vLyAgICAgX2FjdGl2ZVRlc3RzR3JvdXAucmVtb3ZlKHN1aXRlLnRlc3RzKTsKLy8vICAgfQovLy8gfQovLy8gYGBgCmNsYXNzIFVuaW9uU2V0Q29udHJvbGxlcjxFPiB7CiAgLy8vIFRoZSBbVW5pb25TZXRdIHRoYXQgcHJvdmlkZXMgYSB2aWV3IG9mIHRoZSB1bmlvbiBvZiBzZXRzIGluIFt0aGlzXS4KICBVbmlvblNldDxFPiBnZXQgc2V0ID0+IF9zZXQ7CiAgVW5pb25TZXQ8RT4gX3NldDsKCiAgLy8vIFRoZSBzZXRzIHdob3NlIHVuaW9uIGlzIGV4cG9zZWQgdGhyb3VnaCBbc2V0XS4KICBmaW5hbCBfc2V0cyA9IG5ldyBTZXQ8U2V0PEU+PigpOwoKICAvLy8gQ3JlYXRlcyBhIHNldCBvZiBzZXRzIHRoYXQgcHJvdmlkZXMgYSB2aWV3IG9mIHRoZSB1bmlvbiBvZiB0aG9zZSBzZXRzLgogIC8vLwogIC8vLyBJZiBbZGlzam9pbnRdIGlzIGB0cnVlYCwgdGhpcyBhc3N1bWVzIHRoYXQgYWxsIGNvbXBvbmVudCBzZXRzIGFyZQogIC8vLyBkaXNqb2ludOKAlHRoYXQgaXMsIHRoYXQgdGhleSBjb250YWluIG5vIGVsZW1lbnRzIGluIGNvbW1vbi4gVGhpcyBtYWtlcwogIC8vLyBtYW55IG9wZXJhdGlvbnMgaW5jbHVkaW5nIFtsZW5ndGhdIG1vcmUgZWZmaWNpZW50LgogIFVuaW9uU2V0Q29udHJvbGxlcih7Ym9vbCBkaXNqb2ludDogZmFsc2V9KSB7CiAgICBfc2V0ID0gbmV3IFVuaW9uU2V0PEU+KF9zZXRzLCBkaXNqb2ludDogZGlzam9pbnQpOwogIH0KCiAgLy8vIEFkZHMgdGhlIGNvbnRlbnRzIG9mIFtjb21wb25lbnRdIHRvIFtzZXRdLgogIC8vLwogIC8vLyBJZiB0aGUgY29udGVudHMgb2YgW2NvbXBvbmVudF0gY2hhbmdlIG92ZXIgdGltZSwgW3NldF0gd2lsbCBjaGFuZ2UKICAvLy8gYWNjb3JkaW5nbHkuCiAgdm9pZCBhZGQoU2V0PEU+IGNvbXBvbmVudCkgewogICAgX3NldHMuYWRkKGNvbXBvbmVudCk7CiAgfQoKICAvLy8gUmVtb3ZlcyB0aGUgY29udGVudHMgb2YgW2NvbXBvbmVudF0gdG8gW3NldF0uCiAgLy8vCiAgLy8vIElmIGFub3RoZXIgc2V0IGluIFt0aGlzXSBoYXMgb3ZlcmxhcHBpbmcgZWxlbWVudHMgd2l0aCBbY29tcG9uZW50XSwgdGhvc2UKICAvLy8gZWxlbWVudHMgd2lsbCByZW1haW4gaW4gW3NldF0uCiAgYm9vbCByZW1vdmUoU2V0PEU+IGNvbXBvbmVudCkgPT4gX3NldHMucmVtb3ZlKGNvbXBvbmVudCk7Cn0KOABOTjwBGQFLBFAvBAwTOkAEIywaLwgGCB5KHxQBNSMBTQZITDkvNwQBMQZJEx8aBAE0BlAlPAIBMHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvdW5pb25fc2V0X2NvbnRyb2xsZXIuZGFydDlzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY29sbGVjdGlvbi9saWIvc3JjL3dyYXBwZXJzLmRhcnTAAFOELy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAiZGFydDpjb2xsZWN0aW9uIjsKaW1wb3J0ICJkYXJ0Om1hdGgiIGFzIG1hdGg7CgppbXBvcnQgInVubW9kaWZpYWJsZV93cmFwcGVycy5kYXJ0IjsKCnR5cGVkZWYgSyBfS2V5Rm9yVmFsdWU8SywgVj4oViB2YWx1ZSk7CgovLy8gQSBiYXNlIGNsYXNzIGZvciBkZWxlZ2F0aW5nIGl0ZXJhYmxlcy4KLy8vCi8vLyBTdWJjbGFzc2VzIGNhbiBwcm92aWRlIGEgW19iYXNlXSB0aGF0IHNob3VsZCBiZSBkZWxlZ2F0ZWQgdG8uIFVubGlrZQovLy8gW0RlbGVnYXRpbmdJdGVyYWJsZV0sIHRoaXMgYWxsb3dzIHRoZSBiYXNlIHRvIGJlIGNyZWF0ZWQgb24gZGVtYW5kLgphYnN0cmFjdCBjbGFzcyBfRGVsZWdhdGluZ0l0ZXJhYmxlQmFzZTxFPiBpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+IHsKICBJdGVyYWJsZTxFPiBnZXQgX2Jhc2U7CgogIGNvbnN0IF9EZWxlZ2F0aW5nSXRlcmFibGVCYXNlKCk7CgogIGJvb2wgYW55KGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBfYmFzZS5hbnkodGVzdCk7CgogIEl0ZXJhYmxlPFQ+IGNhc3Q8VD4oKSA9PiBfYmFzZS5jYXN0PFQ+KCk7CgogIGJvb2wgY29udGFpbnMoT2JqZWN0IGVsZW1lbnQpID0+IF9iYXNlLmNvbnRhaW5zKGVsZW1lbnQpOwoKICBFIGVsZW1lbnRBdChpbnQgaW5kZXgpID0+IF9iYXNlLmVsZW1lbnRBdChpbmRleCk7CgogIGJvb2wgZXZlcnkoYm9vbCB0ZXN0KEUgZWxlbWVudCkpID0+IF9iYXNlLmV2ZXJ5KHRlc3QpOwoKICBJdGVyYWJsZTxUPiBleHBhbmQ8VD4oSXRlcmFibGU8VD4gZihFIGVsZW1lbnQpKSA9PiBfYmFzZS5leHBhbmQoZik7CgogIEUgZ2V0IGZpcnN0ID0+IF9iYXNlLmZpcnN0OwoKICBFIGZpcnN0V2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIHtFIG9yRWxzZSgpfSkgPT4KICAgICAgX2Jhc2UuZmlyc3RXaGVyZSh0ZXN0LCBvckVsc2U6IG9yRWxzZSk7CgogIFQgZm9sZDxUPihUIGluaXRpYWxWYWx1ZSwgVCBjb21iaW5lKFQgcHJldmlvdXNWYWx1ZSwgRSBlbGVtZW50KSkgPT4KICAgICAgX2Jhc2UuZm9sZChpbml0aWFsVmFsdWUsIGNvbWJpbmUpOwoKICBJdGVyYWJsZTxFPiBmb2xsb3dlZEJ5KEl0ZXJhYmxlPEU+IG90aGVyKSA9PiBfYmFzZS5mb2xsb3dlZEJ5KG90aGVyKTsKCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihFIGVsZW1lbnQpKSA9PiBfYmFzZS5mb3JFYWNoKGYpOwoKICBib29sIGdldCBpc0VtcHR5ID0+IF9iYXNlLmlzRW1wdHk7CgogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gX2Jhc2UuaXNOb3RFbXB0eTsKCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yID0+IF9iYXNlLml0ZXJhdG9yOwoKICBTdHJpbmcgam9pbihbU3RyaW5nIHNlcGFyYXRvciA9ICIiXSkgPT4gX2Jhc2Uuam9pbihzZXBhcmF0b3IpOwoKICBFIGdldCBsYXN0ID0+IF9iYXNlLmxhc3Q7CgogIEUgbGFzdFdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCB7RSBvckVsc2UoKX0pID0+CiAgICAgIF9iYXNlLmxhc3RXaGVyZSh0ZXN0LCBvckVsc2U6IG9yRWxzZSk7CgogIGludCBnZXQgbGVuZ3RoID0+IF9iYXNlLmxlbmd0aDsKCiAgSXRlcmFibGU8VD4gbWFwPFQ+KFQgZihFIGVsZW1lbnQpKSA9PiBfYmFzZS5tYXAoZik7CgogIEUgcmVkdWNlKEUgY29tYmluZShFIHZhbHVlLCBFIGVsZW1lbnQpKSA9PiBfYmFzZS5yZWR1Y2UoY29tYmluZSk7CgogIEBkZXByZWNhdGVkCiAgSXRlcmFibGU8VD4gcmV0eXBlPFQ+KCkgPT4gY2FzdDxUPigpOwoKICBFIGdldCBzaW5nbGUgPT4gX2Jhc2Uuc2luZ2xlOwoKICBFIHNpbmdsZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCB7RSBvckVsc2UoKX0pIHsKICAgIHJldHVybiBfYmFzZS5zaW5nbGVXaGVyZSh0ZXN0LCBvckVsc2U6IG9yRWxzZSk7CiAgfQoKICBJdGVyYWJsZTxFPiBza2lwKGludCBuKSA9PiBfYmFzZS5za2lwKG4pOwoKICBJdGVyYWJsZTxFPiBza2lwV2hpbGUoYm9vbCB0ZXN0KEUgdmFsdWUpKSA9PiBfYmFzZS5za2lwV2hpbGUodGVzdCk7CgogIEl0ZXJhYmxlPEU+IHRha2UoaW50IG4pID0+IF9iYXNlLnRha2Uobik7CgogIEl0ZXJhYmxlPEU+IHRha2VXaGlsZShib29sIHRlc3QoRSB2YWx1ZSkpID0+IF9iYXNlLnRha2VXaGlsZSh0ZXN0KTsKCiAgTGlzdDxFPiB0b0xpc3Qoe2Jvb2wgZ3Jvd2FibGU6IHRydWV9KSA9PiBfYmFzZS50b0xpc3QoZ3Jvd2FibGU6IGdyb3dhYmxlKTsKCiAgU2V0PEU+IHRvU2V0KCkgPT4gX2Jhc2UudG9TZXQoKTsKCiAgSXRlcmFibGU8RT4gd2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpID0+IF9iYXNlLndoZXJlKHRlc3QpOwoKICBJdGVyYWJsZTxUPiB3aGVyZVR5cGU8VD4oKSA9PiBfYmFzZS53aGVyZVR5cGU8VD4oKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gX2Jhc2UudG9TdHJpbmcoKTsKfQoKLy8vIEFuIFtJdGVyYWJsZV0gdGhhdCBkZWxlZ2F0ZXMgYWxsIG9wZXJhdGlvbnMgdG8gYSBiYXNlIGl0ZXJhYmxlLgovLy8KLy8vIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gaGlkZSBub24tYEl0ZXJhYmxlYCBtZXRob2RzIG9mIGFuIGl0ZXJhYmxlIG9iamVjdCwKLy8vIG9yIGl0IGNhbiBiZSBleHRlbmRlZCB0byBhZGQgZXh0cmEgZnVuY3Rpb25hbGl0eSBvbiB0b3Agb2YgYW4gZXhpc3RpbmcKLy8vIGl0ZXJhYmxlIG9iamVjdC4KY2xhc3MgRGVsZWdhdGluZ0l0ZXJhYmxlPEU+IGV4dGVuZHMgX0RlbGVnYXRpbmdJdGVyYWJsZUJhc2U8RT4gewogIGZpbmFsIEl0ZXJhYmxlPEU+IF9iYXNlOwoKICAvLy8gQ3JlYXRlcyBhIHdyYXBwZXIgdGhhdCBmb3J3YXJkcyBvcGVyYXRpb25zIHRvIFtiYXNlXS4KICBjb25zdCBEZWxlZ2F0aW5nSXRlcmFibGUoSXRlcmFibGU8RT4gYmFzZSkgOiBfYmFzZSA9IGJhc2U7CgogIC8vLyBDcmVhdGVzIGEgd3JhcHBlciB0aGF0IGFzc2VydHMgdGhlIHR5cGVzIG9mIHZhbHVlcyBpbiBbYmFzZV0uCiAgLy8vCiAgLy8vIFRoaXMgc291bmRseSBjb252ZXJ0cyBhbiBbSXRlcmFibGVdIHdpdGhvdXQgYSBnZW5lcmljIHR5cGUgdG8gYW4KICAvLy8gYEl0ZXJhYmxlPEU+YCBieSBhc3NlcnRpbmcgdGhhdCBpdHMgZWxlbWVudHMgYXJlIGluc3RhbmNlcyBvZiBgRWAgd2hlbmV2ZXIKICAvLy8gdGhleSdyZSBhY2Nlc3NlZC4gSWYgdGhleSdyZSBub3QsIGl0IHRocm93cyBhIFtDYXN0RXJyb3JdLgogIC8vLwogIC8vLyBUaGlzIGZvcndhcmRzIGFsbCBvcGVyYXRpb25zIHRvIFtiYXNlXSwgc28gYW55IGNoYW5nZXMgaW4gW2Jhc2VdIHdpbGwgYmUKICAvLy8gcmVmbGVjdGVkIGluIFt0aGlzXS4gSWYgW2Jhc2VdIGlzIGFscmVhZHkgYW4gYEl0ZXJhYmxlPEU+YCwgaXQncyByZXR1cm5lZAogIC8vLyB1bm1vZGlmaWVkLgogIEBEZXByZWNhdGVkKCdVc2UgaXRlcmFibGUuY2FzdDxFPiBpbnN0ZWFkLicpCiAgc3RhdGljIEl0ZXJhYmxlPEU+IHR5cGVkPEU+KEl0ZXJhYmxlIGJhc2UpID0+IGJhc2UuY2FzdDxFPigpOwp9CgovLy8gQSBbTGlzdF0gdGhhdCBkZWxlZ2F0ZXMgYWxsIG9wZXJhdGlvbnMgdG8gYSBiYXNlIGxpc3QuCi8vLwovLy8gVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBoaWRlIG5vbi1gTGlzdGAgbWV0aG9kcyBvZiBhIGxpc3Qgb2JqZWN0LCBvciBpdAovLy8gY2FuIGJlIGV4dGVuZGVkIHRvIGFkZCBleHRyYSBmdW5jdGlvbmFsaXR5IG9uIHRvcCBvZiBhbiBleGlzdGluZyBsaXN0Ci8vLyBvYmplY3QuCmNsYXNzIERlbGVnYXRpbmdMaXN0PEU+IGV4dGVuZHMgRGVsZWdhdGluZ0l0ZXJhYmxlPEU+IGltcGxlbWVudHMgTGlzdDxFPiB7CiAgY29uc3QgRGVsZWdhdGluZ0xpc3QoTGlzdDxFPiBiYXNlKSA6IHN1cGVyKGJhc2UpOwoKICAvLy8gQ3JlYXRlcyBhIHdyYXBwZXIgdGhhdCBhc3NlcnRzIHRoZSB0eXBlcyBvZiB2YWx1ZXMgaW4gW2Jhc2VdLgogIC8vLwogIC8vLyBUaGlzIHNvdW5kbHkgY29udmVydHMgYSBbTGlzdF0gd2l0aG91dCBhIGdlbmVyaWMgdHlwZSB0byBhIGBMaXN0PEU+YCBieQogIC8vLyBhc3NlcnRpbmcgdGhhdCBpdHMgZWxlbWVudHMgYXJlIGluc3RhbmNlcyBvZiBgRWAgd2hlbmV2ZXIgdGhleSdyZQogIC8vLyBhY2Nlc3NlZC4gSWYgdGhleSdyZSBub3QsIGl0IHRocm93cyBhIFtDYXN0RXJyb3JdLiBOb3RlIHRoYXQgZXZlbiBpZiBhbgogIC8vLyBvcGVyYXRpb24gdGhyb3dzIGEgW0Nhc3RFcnJvcl0sIGl0IG1heSBzdGlsbCBtdXRhdGUgdGhlIHVuZGVybHlpbmcKICAvLy8gY29sbGVjdGlvbi4KICAvLy8KICAvLy8gVGhpcyBmb3J3YXJkcyBhbGwgb3BlcmF0aW9ucyB0byBbYmFzZV0sIHNvIGFueSBjaGFuZ2VzIGluIFtiYXNlXSB3aWxsIGJlCiAgLy8vIHJlZmxlY3RlZCBpbiBbdGhpc10uIElmIFtiYXNlXSBpcyBhbHJlYWR5IGEgYExpc3Q8RT5gLCBpdCdzIHJldHVybmVkCiAgLy8vIHVubW9kaWZpZWQuCiAgQERlcHJlY2F0ZWQoJ1VzZSBsaXN0LmNhc3Q8RT4gaW5zdGVhZC4nKQogIHN0YXRpYyBMaXN0PEU+IHR5cGVkPEU+KExpc3QgYmFzZSkgPT4gYmFzZS5jYXN0PEU+KCk7CgogIExpc3Q8RT4gZ2V0IF9saXN0QmFzZSA9PiBfYmFzZTsKCiAgRSBvcGVyYXRvciBbXShpbnQgaW5kZXgpID0+IF9saXN0QmFzZVtpbmRleF07CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgRSB2YWx1ZSkgewogICAgX2xpc3RCYXNlW2luZGV4XSA9IHZhbHVlOwogIH0KCiAgTGlzdDxFPiBvcGVyYXRvciArKExpc3Q8RT4gb3RoZXIpID0+IF9saXN0QmFzZSArIG90aGVyOwoKICB2b2lkIGFkZChFIHZhbHVlKSB7CiAgICBfbGlzdEJhc2UuYWRkKHZhbHVlKTsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CiAgICBfbGlzdEJhc2UuYWRkQWxsKGl0ZXJhYmxlKTsKICB9CgogIE1hcDxpbnQsIEU+IGFzTWFwKCkgPT4gX2xpc3RCYXNlLmFzTWFwKCk7CgogIExpc3Q8VD4gY2FzdDxUPigpID0+IF9saXN0QmFzZS5jYXN0PFQ+KCk7CgogIHZvaWQgY2xlYXIoKSB7CiAgICBfbGlzdEJhc2UuY2xlYXIoKTsKICB9CgogIHZvaWQgZmlsbFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgW0UgZmlsbFZhbHVlXSkgewogICAgX2xpc3RCYXNlLmZpbGxSYW5nZShzdGFydCwgZW5kLCBmaWxsVmFsdWUpOwogIH0KCiAgc2V0IGZpcnN0KEUgdmFsdWUpIHsKICAgIGlmICh0aGlzLmlzRW1wdHkpIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KDAsIHRoaXMpOwogICAgdGhpc1swXSA9IHZhbHVlOwogIH0KCiAgSXRlcmFibGU8RT4gZ2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSA9PiBfbGlzdEJhc2UuZ2V0UmFuZ2Uoc3RhcnQsIGVuZCk7CgogIGludCBpbmRleE9mKEUgZWxlbWVudCwgW2ludCBzdGFydCA9IDBdKSA9PiBfbGlzdEJhc2UuaW5kZXhPZihlbGVtZW50LCBzdGFydCk7CgogIGludCBpbmRleFdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCBbaW50IHN0YXJ0ID0gMF0pID0+CiAgICAgIF9saXN0QmFzZS5pbmRleFdoZXJlKHRlc3QsIHN0YXJ0KTsKCiAgdm9pZCBpbnNlcnQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKICAgIF9saXN0QmFzZS5pbnNlcnQoaW5kZXgsIGVsZW1lbnQpOwogIH0KCiAgaW5zZXJ0QWxsKGludCBpbmRleCwgSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKICAgIF9saXN0QmFzZS5pbnNlcnRBbGwoaW5kZXgsIGl0ZXJhYmxlKTsKICB9CgogIHNldCBsYXN0KEUgdmFsdWUpIHsKICAgIGlmICh0aGlzLmlzRW1wdHkpIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KDAsIHRoaXMpOwogICAgdGhpc1t0aGlzLmxlbmd0aCAtIDFdID0gdmFsdWU7CiAgfQoKICBpbnQgbGFzdEluZGV4T2YoRSBlbGVtZW50LCBbaW50IHN0YXJ0XSkgPT4KICAgICAgX2xpc3RCYXNlLmxhc3RJbmRleE9mKGVsZW1lbnQsIHN0YXJ0KTsKCiAgaW50IGxhc3RJbmRleFdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCBbaW50IHN0YXJ0XSkgPT4KICAgICAgX2xpc3RCYXNlLmxhc3RJbmRleFdoZXJlKHRlc3QsIHN0YXJ0KTsKCiAgc2V0IGxlbmd0aChpbnQgbmV3TGVuZ3RoKSB7CiAgICBfbGlzdEJhc2UubGVuZ3RoID0gbmV3TGVuZ3RoOwogIH0KCiAgYm9vbCByZW1vdmUoT2JqZWN0IHZhbHVlKSA9PiBfbGlzdEJhc2UucmVtb3ZlKHZhbHVlKTsKCiAgRSByZW1vdmVBdChpbnQgaW5kZXgpID0+IF9saXN0QmFzZS5yZW1vdmVBdChpbmRleCk7CgogIEUgcmVtb3ZlTGFzdCgpID0+IF9saXN0QmFzZS5yZW1vdmVMYXN0KCk7CgogIHZvaWQgcmVtb3ZlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBfbGlzdEJhc2UucmVtb3ZlUmFuZ2Uoc3RhcnQsIGVuZCk7CiAgfQoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICBfbGlzdEJhc2UucmVtb3ZlV2hlcmUodGVzdCk7CiAgfQoKICB2b2lkIHJlcGxhY2VSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CiAgICBfbGlzdEJhc2UucmVwbGFjZVJhbmdlKHN0YXJ0LCBlbmQsIGl0ZXJhYmxlKTsKICB9CgogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIF9saXN0QmFzZS5yZXRhaW5XaGVyZSh0ZXN0KTsKICB9CgogIEBkZXByZWNhdGVkCiAgTGlzdDxUPiByZXR5cGU8VD4oKSA9PiBjYXN0PFQ+KCk7CgogIEl0ZXJhYmxlPEU+IGdldCByZXZlcnNlZCA9PiBfbGlzdEJhc2UucmV2ZXJzZWQ7CgogIHZvaWQgc2V0QWxsKGludCBpbmRleCwgSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKICAgIF9saXN0QmFzZS5zZXRBbGwoaW5kZXgsIGl0ZXJhYmxlKTsKICB9CgogIHZvaWQgc2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZTxFPiBpdGVyYWJsZSwgW2ludCBza2lwQ291bnQgPSAwXSkgewogICAgX2xpc3RCYXNlLnNldFJhbmdlKHN0YXJ0LCBlbmQsIGl0ZXJhYmxlLCBza2lwQ291bnQpOwogIH0KCiAgdm9pZCBzaHVmZmxlKFttYXRoLlJhbmRvbSByYW5kb21dKSB7CiAgICBfbGlzdEJhc2Uuc2h1ZmZsZShyYW5kb20pOwogIH0KCiAgdm9pZCBzb3J0KFtpbnQgY29tcGFyZShFIGEsIEUgYildKSB7CiAgICBfbGlzdEJhc2Uuc29ydChjb21wYXJlKTsKICB9CgogIExpc3Q8RT4gc3VibGlzdChpbnQgc3RhcnQsIFtpbnQgZW5kXSkgPT4gX2xpc3RCYXNlLnN1Ymxpc3Qoc3RhcnQsIGVuZCk7Cn0KCi8vLyBBIFtTZXRdIHRoYXQgZGVsZWdhdGVzIGFsbCBvcGVyYXRpb25zIHRvIGEgYmFzZSBzZXQuCi8vLwovLy8gVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBoaWRlIG5vbi1gU2V0YCBtZXRob2RzIG9mIGEgc2V0IG9iamVjdCwgb3IgaXQgY2FuCi8vLyBiZSBleHRlbmRlZCB0byBhZGQgZXh0cmEgZnVuY3Rpb25hbGl0eSBvbiB0b3Agb2YgYW4gZXhpc3Rpbmcgc2V0IG9iamVjdC4KY2xhc3MgRGVsZWdhdGluZ1NldDxFPiBleHRlbmRzIERlbGVnYXRpbmdJdGVyYWJsZTxFPiBpbXBsZW1lbnRzIFNldDxFPiB7CiAgY29uc3QgRGVsZWdhdGluZ1NldChTZXQ8RT4gYmFzZSkgOiBzdXBlcihiYXNlKTsKCiAgLy8vIENyZWF0ZXMgYSB3cmFwcGVyIHRoYXQgYXNzZXJ0cyB0aGUgdHlwZXMgb2YgdmFsdWVzIGluIFtiYXNlXS4KICAvLy8KICAvLy8gVGhpcyBzb3VuZGx5IGNvbnZlcnRzIGEgW1NldF0gd2l0aG91dCBhIGdlbmVyaWMgdHlwZSB0byBhIGBTZXQ8RT5gIGJ5CiAgLy8vIGFzc2VydGluZyB0aGF0IGl0cyBlbGVtZW50cyBhcmUgaW5zdGFuY2VzIG9mIGBFYCB3aGVuZXZlciB0aGV5J3JlCiAgLy8vIGFjY2Vzc2VkLiBJZiB0aGV5J3JlIG5vdCwgaXQgdGhyb3dzIGEgW0Nhc3RFcnJvcl0uIE5vdGUgdGhhdCBldmVuIGlmIGFuCiAgLy8vIG9wZXJhdGlvbiB0aHJvd3MgYSBbQ2FzdEVycm9yXSwgaXQgbWF5IHN0aWxsIG11dGF0ZSB0aGUgdW5kZXJseWluZwogIC8vLyBjb2xsZWN0aW9uLgogIC8vLwogIC8vLyBUaGlzIGZvcndhcmRzIGFsbCBvcGVyYXRpb25zIHRvIFtiYXNlXSwgc28gYW55IGNoYW5nZXMgaW4gW2Jhc2VdIHdpbGwgYmUKICAvLy8gcmVmbGVjdGVkIGluIFt0aGlzXS4gSWYgW2Jhc2VdIGlzIGFscmVhZHkgYSBgU2V0PEU+YCwgaXQncyByZXR1cm5lZAogIC8vLyB1bm1vZGlmaWVkLgogIEBEZXByZWNhdGVkKCdVc2Ugc2V0LmNhc3Q8RT4gaW5zdGVhZC4nKQogIHN0YXRpYyBTZXQ8RT4gdHlwZWQ8RT4oU2V0IGJhc2UpID0+IGJhc2UuY2FzdDxFPigpOwoKICBTZXQ8RT4gZ2V0IF9zZXRCYXNlID0+IF9iYXNlOwoKICBib29sIGFkZChFIHZhbHVlKSA9PiBfc2V0QmFzZS5hZGQodmFsdWUpOwoKICB2b2lkIGFkZEFsbChJdGVyYWJsZTxFPiBlbGVtZW50cykgewogICAgX3NldEJhc2UuYWRkQWxsKGVsZW1lbnRzKTsKICB9CgogIFNldDxUPiBjYXN0PFQ+KCkgPT4gX3NldEJhc2UuY2FzdDxUPigpOwoKICB2b2lkIGNsZWFyKCkgewogICAgX3NldEJhc2UuY2xlYXIoKTsKICB9CgogIGJvb2wgY29udGFpbnNBbGwoSXRlcmFibGU8T2JqZWN0PiBvdGhlcikgPT4gX3NldEJhc2UuY29udGFpbnNBbGwob3RoZXIpOwoKICBTZXQ8RT4gZGlmZmVyZW5jZShTZXQ8T2JqZWN0PiBvdGhlcikgPT4gX3NldEJhc2UuZGlmZmVyZW5jZShvdGhlcik7CgogIFNldDxFPiBpbnRlcnNlY3Rpb24oU2V0PE9iamVjdD4gb3RoZXIpID0+IF9zZXRCYXNlLmludGVyc2VjdGlvbihvdGhlcik7CgogIEUgbG9va3VwKE9iamVjdCBlbGVtZW50KSA9PiBfc2V0QmFzZS5sb29rdXAoZWxlbWVudCk7CgogIGJvb2wgcmVtb3ZlKE9iamVjdCB2YWx1ZSkgPT4gX3NldEJhc2UucmVtb3ZlKHZhbHVlKTsKCiAgdm9pZCByZW1vdmVBbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cykgewogICAgX3NldEJhc2UucmVtb3ZlQWxsKGVsZW1lbnRzKTsKICB9CgogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIF9zZXRCYXNlLnJlbW92ZVdoZXJlKHRlc3QpOwogIH0KCiAgdm9pZCByZXRhaW5BbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cykgewogICAgX3NldEJhc2UucmV0YWluQWxsKGVsZW1lbnRzKTsKICB9CgogIEBkZXByZWNhdGVkCiAgU2V0PFQ+IHJldHlwZTxUPigpID0+IGNhc3Q8VD4oKTsKCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgX3NldEJhc2UucmV0YWluV2hlcmUodGVzdCk7CiAgfQoKICBTZXQ8RT4gdW5pb24oU2V0PEU+IG90aGVyKSA9PiBfc2V0QmFzZS51bmlvbihvdGhlcik7CgogIFNldDxFPiB0b1NldCgpID0+IG5ldyBEZWxlZ2F0aW5nU2V0PEU+KF9zZXRCYXNlLnRvU2V0KCkpOwp9CgovLy8gQSBbUXVldWVdIHRoYXQgZGVsZWdhdGVzIGFsbCBvcGVyYXRpb25zIHRvIGEgYmFzZSBxdWV1ZS4KLy8vCi8vLyBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGhpZGUgbm9uLWBRdWV1ZWAgbWV0aG9kcyBvZiBhIHF1ZXVlIG9iamVjdCwgb3IgaXQKLy8vIGNhbiBiZSBleHRlbmRlZCB0byBhZGQgZXh0cmEgZnVuY3Rpb25hbGl0eSBvbiB0b3Agb2YgYW4gZXhpc3RpbmcgcXVldWUKLy8vIG9iamVjdC4KY2xhc3MgRGVsZWdhdGluZ1F1ZXVlPEU+IGV4dGVuZHMgRGVsZWdhdGluZ0l0ZXJhYmxlPEU+IGltcGxlbWVudHMgUXVldWU8RT4gewogIGNvbnN0IERlbGVnYXRpbmdRdWV1ZShRdWV1ZTxFPiBxdWV1ZSkgOiBzdXBlcihxdWV1ZSk7CgogIC8vLyBDcmVhdGVzIGEgd3JhcHBlciB0aGF0IGFzc2VydHMgdGhlIHR5cGVzIG9mIHZhbHVlcyBpbiBbYmFzZV0uCiAgLy8vCiAgLy8vIFRoaXMgc291bmRseSBjb252ZXJ0cyBhIFtRdWV1ZV0gd2l0aG91dCBhIGdlbmVyaWMgdHlwZSB0byBhIGBRdWV1ZTxFPmAgYnkKICAvLy8gYXNzZXJ0aW5nIHRoYXQgaXRzIGVsZW1lbnRzIGFyZSBpbnN0YW5jZXMgb2YgYEVgIHdoZW5ldmVyIHRoZXkncmUKICAvLy8gYWNjZXNzZWQuIElmIHRoZXkncmUgbm90LCBpdCB0aHJvd3MgYSBbQ2FzdEVycm9yXS4gTm90ZSB0aGF0IGV2ZW4gaWYgYW4KICAvLy8gb3BlcmF0aW9uIHRocm93cyBhIFtDYXN0RXJyb3JdLCBpdCBtYXkgc3RpbGwgbXV0YXRlIHRoZSB1bmRlcmx5aW5nCiAgLy8vIGNvbGxlY3Rpb24uCiAgLy8vCiAgLy8vIFRoaXMgZm9yd2FyZHMgYWxsIG9wZXJhdGlvbnMgdG8gW2Jhc2VdLCBzbyBhbnkgY2hhbmdlcyBpbiBbYmFzZV0gd2lsbCBiZQogIC8vLyByZWZsZWN0ZWQgaW4gW3RoaXNdLiBJZiBbYmFzZV0gaXMgYWxyZWFkeSBhIGBRdWV1ZTxFPmAsIGl0J3MgcmV0dXJuZWQKICAvLy8gdW5tb2RpZmllZC4KICBARGVwcmVjYXRlZCgnVXNlIHF1ZXVlLmNhc3Q8RT4gaW5zdGVhZC4nKQogIHN0YXRpYyBRdWV1ZTxFPiB0eXBlZDxFPihRdWV1ZSBiYXNlKSA9PiBiYXNlLmNhc3Q8RT4oKTsKCiAgUXVldWU8RT4gZ2V0IF9iYXNlUXVldWUgPT4gX2Jhc2U7CgogIHZvaWQgYWRkKEUgdmFsdWUpIHsKICAgIF9iYXNlUXVldWUuYWRkKHZhbHVlKTsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CiAgICBfYmFzZVF1ZXVlLmFkZEFsbChpdGVyYWJsZSk7CiAgfQoKICB2b2lkIGFkZEZpcnN0KEUgdmFsdWUpIHsKICAgIF9iYXNlUXVldWUuYWRkRmlyc3QodmFsdWUpOwogIH0KCiAgdm9pZCBhZGRMYXN0KEUgdmFsdWUpIHsKICAgIF9iYXNlUXVldWUuYWRkTGFzdCh2YWx1ZSk7CiAgfQoKICBRdWV1ZTxUPiBjYXN0PFQ+KCkgPT4gX2Jhc2VRdWV1ZS5jYXN0PFQ+KCk7CgogIHZvaWQgY2xlYXIoKSB7CiAgICBfYmFzZVF1ZXVlLmNsZWFyKCk7CiAgfQoKICBib29sIHJlbW92ZShPYmplY3Qgb2JqZWN0KSA9PiBfYmFzZVF1ZXVlLnJlbW92ZShvYmplY3QpOwoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICBfYmFzZVF1ZXVlLnJlbW92ZVdoZXJlKHRlc3QpOwogIH0KCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgX2Jhc2VRdWV1ZS5yZXRhaW5XaGVyZSh0ZXN0KTsKICB9CgogIEBkZXByZWNhdGVkCiAgUXVldWU8VD4gcmV0eXBlPFQ+KCkgPT4gY2FzdDxUPigpOwoKICBFIHJlbW92ZUZpcnN0KCkgPT4gX2Jhc2VRdWV1ZS5yZW1vdmVGaXJzdCgpOwoKICBFIHJlbW92ZUxhc3QoKSA9PiBfYmFzZVF1ZXVlLnJlbW92ZUxhc3QoKTsKfQoKLy8vIEEgW01hcF0gdGhhdCBkZWxlZ2F0ZXMgYWxsIG9wZXJhdGlvbnMgdG8gYSBiYXNlIG1hcC4KLy8vCi8vLyBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGhpZGUgbm9uLWBNYXBgIG1ldGhvZHMgb2YgYW4gb2JqZWN0IHRoYXQgZXh0ZW5kcwovLy8gYE1hcGAsIG9yIGl0IGNhbiBiZSBleHRlbmRlZCB0byBhZGQgZXh0cmEgZnVuY3Rpb25hbGl0eSBvbiB0b3Agb2YgYW4KLy8vIGV4aXN0aW5nIG1hcCBvYmplY3QuCmNsYXNzIERlbGVnYXRpbmdNYXA8SywgVj4gaW1wbGVtZW50cyBNYXA8SywgVj4gewogIGZpbmFsIE1hcDxLLCBWPiBfYmFzZTsKCiAgY29uc3QgRGVsZWdhdGluZ01hcChNYXA8SywgVj4gYmFzZSkgOiBfYmFzZSA9IGJhc2U7CgogIC8vLyBDcmVhdGVzIGEgd3JhcHBlciB0aGF0IGFzc2VydHMgdGhlIHR5cGVzIG9mIGtleXMgYW5kIHZhbHVlcyBpbiBbYmFzZV0uCiAgLy8vCiAgLy8vIFRoaXMgc291bmRseSBjb252ZXJ0cyBhIFtNYXBdIHdpdGhvdXQgZ2VuZXJpYyB0eXBlcyB0byBhIGBNYXA8SywgVj5gIGJ5CiAgLy8vIGFzc2VydGluZyB0aGF0IGl0cyBrZXlzIGFyZSBpbnN0YW5jZXMgb2YgYEVgIGFuZCBpdHMgdmFsdWVzIGFyZSBpbnN0YW5jZXMKICAvLy8gb2YgYFZgIHdoZW5ldmVyIHRoZXkncmUgYWNjZXNzZWQuIElmIHRoZXkncmUgbm90LCBpdCB0aHJvd3MgYSBbQ2FzdEVycm9yXS4KICAvLy8gTm90ZSB0aGF0IGV2ZW4gaWYgYW4gb3BlcmF0aW9uIHRocm93cyBhIFtDYXN0RXJyb3JdLCBpdCBtYXkgc3RpbGwgbXV0YXRlCiAgLy8vIHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24uCiAgLy8vCiAgLy8vIFRoaXMgZm9yd2FyZHMgYWxsIG9wZXJhdGlvbnMgdG8gW2Jhc2VdLCBzbyBhbnkgY2hhbmdlcyBpbiBbYmFzZV0gd2lsbCBiZQogIC8vLyByZWZsZWN0ZWQgaW4gW3RoaXNdLiBJZiBbYmFzZV0gaXMgYWxyZWFkeSBhIGBNYXA8SywgVj5gLCBpdCdzIHJldHVybmVkCiAgLy8vIHVubW9kaWZpZWQuCiAgQERlcHJlY2F0ZWQoJ1VzZSBtYXAuY2FzdDxLLCBWPiBpbnN0ZWFkLicpCiAgc3RhdGljIE1hcDxLLCBWPiB0eXBlZDxLLCBWPihNYXAgYmFzZSkgPT4gYmFzZS5jYXN0PEssIFY+KCk7CgogIFYgb3BlcmF0b3IgW10oT2JqZWN0IGtleSkgPT4gX2Jhc2Vba2V5XTsKCiAgdm9pZCBvcGVyYXRvciBbXT0oSyBrZXksIFYgdmFsdWUpIHsKICAgIF9iYXNlW2tleV0gPSB2YWx1ZTsKICB9CgogIHZvaWQgYWRkQWxsKE1hcDxLLCBWPiBvdGhlcikgewogICAgX2Jhc2UuYWRkQWxsKG90aGVyKTsKICB9CgogIHZvaWQgYWRkRW50cmllcyhJdGVyYWJsZTxNYXBFbnRyeTxLLCBWPj4gZW50cmllcykgewogICAgX2Jhc2UuYWRkRW50cmllcyhlbnRyaWVzKTsKICB9CgogIHZvaWQgY2xlYXIoKSB7CiAgICBfYmFzZS5jbGVhcigpOwogIH0KCiAgTWFwPEsyLCBWMj4gY2FzdDxLMiwgVjI+KCkgPT4gX2Jhc2UuY2FzdDxLMiwgVjI+KCk7CgogIGJvb2wgY29udGFpbnNLZXkoT2JqZWN0IGtleSkgPT4gX2Jhc2UuY29udGFpbnNLZXkoa2V5KTsKCiAgYm9vbCBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgPT4gX2Jhc2UuY29udGFpbnNWYWx1ZSh2YWx1ZSk7CgogIEl0ZXJhYmxlPE1hcEVudHJ5PEssIFY+PiBnZXQgZW50cmllcyA9PiBfYmFzZS5lbnRyaWVzOwoKICB2b2lkIGZvckVhY2godm9pZCBmKEsga2V5LCBWIHZhbHVlKSkgewogICAgX2Jhc2UuZm9yRWFjaChmKTsKICB9CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2Jhc2UuaXNFbXB0eTsKCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBfYmFzZS5pc05vdEVtcHR5OwoKICBJdGVyYWJsZTxLPiBnZXQga2V5cyA9PiBfYmFzZS5rZXlzOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfYmFzZS5sZW5ndGg7CgogIE1hcDxLMiwgVjI+IG1hcDxLMiwgVjI+KE1hcEVudHJ5PEsyLCBWMj4gdHJhbnNmb3JtKEsga2V5LCBWIHZhbHVlKSkgPT4KICAgICAgX2Jhc2UubWFwKHRyYW5zZm9ybSk7CgogIFYgcHV0SWZBYnNlbnQoSyBrZXksIFYgaWZBYnNlbnQoKSkgPT4gX2Jhc2UucHV0SWZBYnNlbnQoa2V5LCBpZkFic2VudCk7CgogIFYgcmVtb3ZlKE9iamVjdCBrZXkpID0+IF9iYXNlLnJlbW92ZShrZXkpOwoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChLIGtleSwgViB2YWx1ZSkpID0+IF9iYXNlLnJlbW92ZVdoZXJlKHRlc3QpOwoKICBAZGVwcmVjYXRlZAogIE1hcDxLMiwgVjI+IHJldHlwZTxLMiwgVjI+KCkgPT4gY2FzdDxLMiwgVjI+KCk7CgogIEl0ZXJhYmxlPFY+IGdldCB2YWx1ZXMgPT4gX2Jhc2UudmFsdWVzOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBfYmFzZS50b1N0cmluZygpOwoKICBWIHVwZGF0ZShLIGtleSwgViB1cGRhdGUoViB2YWx1ZSksIHtWIGlmQWJzZW50KCl9KSA9PgogICAgICBfYmFzZS51cGRhdGUoa2V5LCB1cGRhdGUsIGlmQWJzZW50OiBpZkFic2VudCk7CgogIHZvaWQgdXBkYXRlQWxsKFYgdXBkYXRlKEsga2V5LCBWIHZhbHVlKSkgPT4gX2Jhc2UudXBkYXRlQWxsKHVwZGF0ZSk7Cn0KCi8vLyBBbiB1bm1vZGlmaWFibGUgW1NldF0gdmlldyBvZiB0aGUga2V5cyBvZiBhIFtNYXBdLgovLy8KLy8vIFRoZSBzZXQgZGVsZWdhdGVzIGFsbCBvcGVyYXRpb25zIHRvIHRoZSB1bmRlcmx5aW5nIG1hcC4KLy8vCi8vLyBBIGBNYXBgIGNhbiBvbmx5IGNvbnRhaW4gZWFjaCBrZXkgb25jZSwgc28gaXRzIGtleXMgY2FuIGFsd2F5cwovLy8gYmUgdmlld2VkIGFzIGEgYFNldGAgd2l0aG91dCBhbnkgbG9zcywgZXZlbiBpZiB0aGUgW01hcC5rZXlzXQovLy8gZ2V0dGVyIG9ubHkgc2hvd3MgYW4gW0l0ZXJhYmxlXSB2aWV3IG9mIHRoZSBrZXlzLgovLy8KLy8vIE5vdGUgdGhhdCBbbG9va3VwXSBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHNldC4KY2xhc3MgTWFwS2V5U2V0PEU+IGV4dGVuZHMgX0RlbGVnYXRpbmdJdGVyYWJsZUJhc2U8RT4KICAgIHdpdGggVW5tb2RpZmlhYmxlU2V0TWl4aW48RT4gewogIGZpbmFsIE1hcDxFLCBkeW5hbWljPiBfYmFzZU1hcDsKCiAgTWFwS2V5U2V0KE1hcDxFLCBkeW5hbWljPiBiYXNlKSA6IF9iYXNlTWFwID0gYmFzZTsKCiAgSXRlcmFibGU8RT4gZ2V0IF9iYXNlID0+IF9iYXNlTWFwLmtleXM7CgogIFNldDxUPiBjYXN0PFQ+KCkgewogICAgaWYgKHRoaXMgaXMgTWFwS2V5U2V0PFQ+KSB7CiAgICAgIHJldHVybiB0aGlzIGFzIE1hcEtleVNldDxUPjsKICAgIH0KICAgIHJldHVybiBTZXQuY2FzdEZyb208RSwgVD4odGhpcyk7CiAgfQoKICBib29sIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KSA9PiBfYmFzZU1hcC5jb250YWluc0tleShlbGVtZW50KTsKCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfYmFzZU1hcC5pc0VtcHR5OwoKICBib29sIGdldCBpc05vdEVtcHR5ID0+IF9iYXNlTWFwLmlzTm90RW1wdHk7CgogIGludCBnZXQgbGVuZ3RoID0+IF9iYXNlTWFwLmxlbmd0aDsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gInske19iYXNlLmpvaW4oJywgJyl9fSI7CgogIGJvb2wgY29udGFpbnNBbGwoSXRlcmFibGU8T2JqZWN0PiBvdGhlcikgPT4gb3RoZXIuZXZlcnkoY29udGFpbnMpOwoKICAvLy8gUmV0dXJucyBhIG5ldyBzZXQgd2l0aCB0aGUgdGhlIGVsZW1lbnRzIG9mIFt0aGlzXSB0aGF0IGFyZSBub3QgaW4gW290aGVyXS4KICAvLy8KICAvLy8gVGhhdCBpcywgdGhlIHJldHVybmVkIHNldCBjb250YWlucyBhbGwgdGhlIGVsZW1lbnRzIG9mIHRoaXMgW1NldF0gdGhhdCBhcmUKICAvLy8gbm90IGVsZW1lbnRzIG9mIFtvdGhlcl0gYWNjb3JkaW5nIHRvIGBvdGhlci5jb250YWluc2AuCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgc2V0IHdpbGwgdXNlIHRoZSBkZWZhdWx0IGVxdWFsaXR5IG9wZXJhdGlvbiwgd2hpY2gKICAvLy8gbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBlcXVhbGl0eSBvcGVyYXRpb24gW3RoaXNdIHVzZXMuCiAgU2V0PEU+IGRpZmZlcmVuY2UoU2V0PE9iamVjdD4gb3RoZXIpID0+CiAgICAgIHdoZXJlKChlbGVtZW50KSA9PiAhb3RoZXIuY29udGFpbnMoZWxlbWVudCkpLnRvU2V0KCk7CgogIC8vLyBSZXR1cm5zIGEgbmV3IHNldCB3aGljaCBpcyB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gW3RoaXNdIGFuZCBbb3RoZXJdLgogIC8vLwogIC8vLyBUaGF0IGlzLCB0aGUgcmV0dXJuZWQgc2V0IGNvbnRhaW5zIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhpcyBbU2V0XSB0aGF0IGFyZQogIC8vLyBhbHNvIGVsZW1lbnRzIG9mIFtvdGhlcl0gYWNjb3JkaW5nIHRvIGBvdGhlci5jb250YWluc2AuCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgc2V0IHdpbGwgdXNlIHRoZSBkZWZhdWx0IGVxdWFsaXR5IG9wZXJhdGlvbiwgd2hpY2gKICAvLy8gbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBlcXVhbGl0eSBvcGVyYXRpb24gW3RoaXNdIHVzZXMuCiAgU2V0PEU+IGludGVyc2VjdGlvbihTZXQ8T2JqZWN0PiBvdGhlcikgPT4gd2hlcmUob3RoZXIuY29udGFpbnMpLnRvU2V0KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdIHNpbmNlIHRoZXJlJ3Mgbm8gY29ycmVzcG9uZGluZyBtZXRob2QgZm9yCiAgLy8vIFtNYXBdcy4KICBFIGxvb2t1cChPYmplY3QgZWxlbWVudCkgPT4KICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIk1hcEtleVNldCBkb2Vzbid0IHN1cHBvcnQgbG9va3VwKCkuIik7CgogIEBkZXByZWNhdGVkCiAgU2V0PFQ+IHJldHlwZTxUPigpID0+IFNldC5jYXN0RnJvbTxFLCBUPih0aGlzKTsKCiAgLy8vIFJldHVybnMgYSBuZXcgc2V0IHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgZWxlbWVudHMgb2YgW3RoaXNdIGFuZCBbb3RoZXJdLgogIC8vLwogIC8vLyBUaGF0IGlzLCB0aGUgcmV0dXJuZWQgc2V0IGNvbnRhaW5zIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhpcyBbU2V0XSBhbmQgYWxsCiAgLy8vIHRoZSBlbGVtZW50cyBvZiBbb3RoZXJdLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgdGhlIHJldHVybmVkIHNldCB3aWxsIHVzZSB0aGUgZGVmYXVsdCBlcXVhbGl0eSBvcGVyYXRpb24sIHdoaWNoCiAgLy8vIG1heSBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgZXF1YWxpdHkgb3BlcmF0aW9uIFt0aGlzXSB1c2VzLgogIFNldDxFPiB1bmlvbihTZXQ8RT4gb3RoZXIpID0+IHRvU2V0KCkuLmFkZEFsbChvdGhlcik7Cn0KCi8vLyBDcmVhdGVzIGEgbW9kaWZpYWJsZSBbU2V0XSB2aWV3IG9mIHRoZSB2YWx1ZXMgb2YgYSBbTWFwXS4KLy8vCi8vLyBUaGUgYFNldGAgdmlldyBhc3N1bWVzIHRoYXQgdGhlIGtleXMgb2YgdGhlIGBNYXBgIGNhbiBiZSB1bmlxdWVseSBkZXRlcm1pbmVkCi8vLyBmcm9tIHRoZSB2YWx1ZXMuIFRoZSBga2V5Rm9yVmFsdWVgIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IgZmluZHMKLy8vIHRoZSBrZXkgZm9yIGEgc2luZ2xlIHZhbHVlLiBUaGUgYGtleUZvclZhbHVlYCBmdW5jdGlvbiBzaG91bGQgYmUgY29uc2lzdGVudAovLy8gd2l0aCBlcXVhbGl0eS4gSWYgYHZhbHVlMSA9PSB2YWx1ZTJgIHRoZW4gYGtleUZvclZhbHVlKHZhbHVlMSlgIGFuZAovLy8gYGtleUZvclZhbHVlKHZhbHVlMilgIHNob3VsZCBiZSBjb25zaWRlcmVkIGVxdWFsIGtleXMgYnkgdGhlIHVuZGVybHlpbmcgbWFwLAovLy8gYW5kIHZpY2UgdmVyc2EuCi8vLwovLy8gTW9kaWZ5aW5nIHRoZSBzZXQgd2lsbCBtb2RpZnkgdGhlIHVuZGVybHlpbmcgbWFwIGJhc2VkIG9uIHRoZSBrZXkgcmV0dXJuZWQKLy8vIGJ5IGBrZXlGb3JWYWx1ZWAuCi8vLwovLy8gSWYgdGhlIGBNYXBgIGNvbnRlbnRzIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBga2V5Rm9yVmFsdWVgIGZ1bmN0aW9uLAovLy8gdGhlIHNldCB3aWxsIG5vdCB3b3JrIGNvbnNpc3RlbnRseSwgYW5kIG1heSBnaXZlIG1lYW5pbmdsZXNzIHJlc3BvbnNlcyBvciBkbwovLy8gaW5jb25zaXN0ZW50IHVwZGF0ZXMuCi8vLwovLy8gVGhpcyBzZXQgY2FuLCBmb3IgZXhhbXBsZSwgYmUgdXNlZCBvbiBhIG1hcCBmcm9tIGRhdGFiYXNlIHJlY29yZCBJRHMgdG8gdGhlCi8vLyByZWNvcmRzLiBJdCBleHBvc2VzIHRoZSByZWNvcmRzIGFzIGEgc2V0LCBhbmQgYWxsb3dzIGZvciB3cml0aW5nIGJvdGgKLy8vIGByZWNvcmRTZXQuYWRkKGRhdGFiYXNlUmVjb3JkKWAgYW5kIGByZWNvcmRNYXBbaWRdYC4KLy8vCi8vLyBFZmZlY3RpdmVseSwgdGhlIG1hcCB3aWxsIGFjdCBhcyBhIGtpbmQgb2YgaW5kZXggZm9yIHRoZSBzZXQuCmNsYXNzIE1hcFZhbHVlU2V0PEssIFY+IGV4dGVuZHMgX0RlbGVnYXRpbmdJdGVyYWJsZUJhc2U8Vj4gaW1wbGVtZW50cyBTZXQ8Vj4gewogIGZpbmFsIE1hcDxLLCBWPiBfYmFzZU1hcDsKICBmaW5hbCBfS2V5Rm9yVmFsdWU8SywgVj4gX2tleUZvclZhbHVlOwoKICAvLy8gQ3JlYXRlcyBhIG5ldyBbTWFwVmFsdWVTZXRdIGJhc2VkIG9uIFtiYXNlXS4KICAvLy8KICAvLy8gW2tleUZvclZhbHVlXSByZXR1cm5zIHRoZSBrZXkgaW4gdGhlIG1hcCB0aGF0IHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGgKICAvLy8gdGhlIGdpdmVuIHZhbHVlLiBUaGUgc2V0J3Mgbm90aW9uIG9mIGVxdWFsaXR5IGlzIGlkZW50aWNhbCB0byB0aGUgZXF1YWxpdHkKICAvLy8gb2YgdGhlIHJldHVybiB2YWx1ZXMgb2YgW2tleUZvclZhbHVlXS4KICBNYXBWYWx1ZVNldChNYXA8SywgVj4gYmFzZSwgSyBrZXlGb3JWYWx1ZShWIHZhbHVlKSkKICAgICAgOiBfYmFzZU1hcCA9IGJhc2UsCiAgICAgICAgX2tleUZvclZhbHVlID0ga2V5Rm9yVmFsdWU7CgogIEl0ZXJhYmxlPFY+IGdldCBfYmFzZSA9PiBfYmFzZU1hcC52YWx1ZXM7CgogIFNldDxUPiBjYXN0PFQ+KCkgewogICAgaWYgKHRoaXMgaXMgU2V0PFQ+KSB7CiAgICAgIHJldHVybiB0aGlzIGFzIFNldDxUPjsKICAgIH0KICAgIHJldHVybiBTZXQuY2FzdEZyb208ViwgVD4odGhpcyk7CiAgfQoKICBib29sIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KSB7CiAgICBpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQgaXMhIFYpIHJldHVybiBmYWxzZTsKICAgIHZhciBrZXkgPSBfa2V5Rm9yVmFsdWUoZWxlbWVudCBhcyBWKTsKCiAgICByZXR1cm4gX2Jhc2VNYXAuY29udGFpbnNLZXkoa2V5KTsKICB9CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2Jhc2VNYXAuaXNFbXB0eTsKCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBfYmFzZU1hcC5pc05vdEVtcHR5OwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfYmFzZU1hcC5sZW5ndGg7CgogIFN0cmluZyB0b1N0cmluZygpID0+IHRvU2V0KCkudG9TdHJpbmcoKTsKCiAgYm9vbCBhZGQoViB2YWx1ZSkgewogICAgSyBrZXkgPSBfa2V5Rm9yVmFsdWUodmFsdWUpOwogICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKICAgIF9iYXNlTWFwLnB1dElmQWJzZW50KGtleSwgKCkgewogICAgICByZXN1bHQgPSB0cnVlOwogICAgICByZXR1cm4gdmFsdWU7CiAgICB9KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIGFkZEFsbChJdGVyYWJsZTxWPiBlbGVtZW50cykgPT4gZWxlbWVudHMuZm9yRWFjaChhZGQpOwoKICB2b2lkIGNsZWFyKCkgPT4gX2Jhc2VNYXAuY2xlYXIoKTsKCiAgYm9vbCBjb250YWluc0FsbChJdGVyYWJsZTxPYmplY3Q+IG90aGVyKSA9PiBvdGhlci5ldmVyeShjb250YWlucyk7CgogIC8vLyBSZXR1cm5zIGEgbmV3IHNldCB3aXRoIHRoZSB0aGUgZWxlbWVudHMgb2YgW3RoaXNdIHRoYXQgYXJlIG5vdCBpbiBbb3RoZXJdLgogIC8vLwogIC8vLyBUaGF0IGlzLCB0aGUgcmV0dXJuZWQgc2V0IGNvbnRhaW5zIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhpcyBbU2V0XSB0aGF0IGFyZQogIC8vLyBub3QgZWxlbWVudHMgb2YgW290aGVyXSBhY2NvcmRpbmcgdG8gYG90aGVyLmNvbnRhaW5zYC4KICAvLy8KICAvLy8gTm90ZSB0aGF0IHRoZSByZXR1cm5lZCBzZXQgd2lsbCB1c2UgdGhlIGRlZmF1bHQgZXF1YWxpdHkgb3BlcmF0aW9uLCB3aGljaAogIC8vLyBtYXkgYmUgZGlmZmVyZW50IHRoYW4gdGhlIGVxdWFsaXR5IG9wZXJhdGlvbiBbdGhpc10gdXNlcy4KICBTZXQ8Vj4gZGlmZmVyZW5jZShTZXQ8T2JqZWN0PiBvdGhlcikgPT4KICAgICAgd2hlcmUoKGVsZW1lbnQpID0+ICFvdGhlci5jb250YWlucyhlbGVtZW50KSkudG9TZXQoKTsKCiAgLy8vIFJldHVybnMgYSBuZXcgc2V0IHdoaWNoIGlzIHRoZSBpbnRlcnNlY3Rpb24gYmV0d2VlbiBbdGhpc10gYW5kIFtvdGhlcl0uCiAgLy8vCiAgLy8vIFRoYXQgaXMsIHRoZSByZXR1cm5lZCBzZXQgY29udGFpbnMgYWxsIHRoZSBlbGVtZW50cyBvZiB0aGlzIFtTZXRdIHRoYXQgYXJlCiAgLy8vIGFsc28gZWxlbWVudHMgb2YgW290aGVyXSBhY2NvcmRpbmcgdG8gYG90aGVyLmNvbnRhaW5zYC4KICAvLy8KICAvLy8gTm90ZSB0aGF0IHRoZSByZXR1cm5lZCBzZXQgd2lsbCB1c2UgdGhlIGRlZmF1bHQgZXF1YWxpdHkgb3BlcmF0aW9uLCB3aGljaAogIC8vLyBtYXkgYmUgZGlmZmVyZW50IHRoYW4gdGhlIGVxdWFsaXR5IG9wZXJhdGlvbiBbdGhpc10gdXNlcy4KICBTZXQ8Vj4gaW50ZXJzZWN0aW9uKFNldDxPYmplY3Q+IG90aGVyKSA9PiB3aGVyZShvdGhlci5jb250YWlucykudG9TZXQoKTsKCiAgViBsb29rdXAoT2JqZWN0IGVsZW1lbnQpIHsKICAgIGlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudCBpcyEgVikgcmV0dXJuIG51bGw7CiAgICB2YXIga2V5ID0gX2tleUZvclZhbHVlKGVsZW1lbnQgYXMgVik7CgogICAgcmV0dXJuIF9iYXNlTWFwW2tleV07CiAgfQoKICBib29sIHJlbW92ZShPYmplY3QgZWxlbWVudCkgewogICAgaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50IGlzISBWKSByZXR1cm4gZmFsc2U7CiAgICB2YXIga2V5ID0gX2tleUZvclZhbHVlKGVsZW1lbnQgYXMgVik7CgogICAgaWYgKCFfYmFzZU1hcC5jb250YWluc0tleShrZXkpKSByZXR1cm4gZmFsc2U7CiAgICBfYmFzZU1hcC5yZW1vdmUoa2V5KTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgdm9pZCByZW1vdmVBbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cykgPT4gZWxlbWVudHMuZm9yRWFjaChyZW1vdmUpOwoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChWIGVsZW1lbnQpKSB7CiAgICB2YXIgdG9SZW1vdmUgPSBbXTsKICAgIF9iYXNlTWFwLmZvckVhY2goKGtleSwgdmFsdWUpIHsKICAgICAgaWYgKHRlc3QodmFsdWUpKSB0b1JlbW92ZS5hZGQoa2V5KTsKICAgIH0pOwogICAgdG9SZW1vdmUuZm9yRWFjaChfYmFzZU1hcC5yZW1vdmUpOwogIH0KCiAgdm9pZCByZXRhaW5BbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cykgewogICAgdmFyIHZhbHVlc1RvUmV0YWluID0gbmV3IFNldDxWPi5pZGVudGl0eSgpOwogICAgZm9yICh2YXIgZWxlbWVudCBpbiBlbGVtZW50cykgewogICAgICBpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQgaXMhIFYpIGNvbnRpbnVlOwogICAgICB2YXIga2V5ID0gX2tleUZvclZhbHVlKGVsZW1lbnQgYXMgVik7CgogICAgICBpZiAoIV9iYXNlTWFwLmNvbnRhaW5zS2V5KGtleSkpIGNvbnRpbnVlOwogICAgICB2YWx1ZXNUb1JldGFpbi5hZGQoX2Jhc2VNYXBba2V5XSk7CiAgICB9CgogICAgdmFyIGtleXNUb1JlbW92ZSA9IFtdOwogICAgX2Jhc2VNYXAuZm9yRWFjaCgoaywgdikgewogICAgICBpZiAoIXZhbHVlc1RvUmV0YWluLmNvbnRhaW5zKHYpKSBrZXlzVG9SZW1vdmUuYWRkKGspOwogICAgfSk7CiAgICBrZXlzVG9SZW1vdmUuZm9yRWFjaChfYmFzZU1hcC5yZW1vdmUpOwogIH0KCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoViBlbGVtZW50KSkgPT4KICAgICAgcmVtb3ZlV2hlcmUoKGVsZW1lbnQpID0+ICF0ZXN0KGVsZW1lbnQpKTsKCiAgQGRlcHJlY2F0ZWQKICBTZXQ8VD4gcmV0eXBlPFQ+KCkgPT4gU2V0LmNhc3RGcm9tPFYsIFQ+KHRoaXMpOwoKICAvLy8gUmV0dXJucyBhIG5ldyBzZXQgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBlbGVtZW50cyBvZiBbdGhpc10gYW5kIFtvdGhlcl0uCiAgLy8vCiAgLy8vIFRoYXQgaXMsIHRoZSByZXR1cm5lZCBzZXQgY29udGFpbnMgYWxsIHRoZSBlbGVtZW50cyBvZiB0aGlzIFtTZXRdIGFuZCBhbGwKICAvLy8gdGhlIGVsZW1lbnRzIG9mIFtvdGhlcl0uCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgc2V0IHdpbGwgdXNlIHRoZSBkZWZhdWx0IGVxdWFsaXR5IG9wZXJhdGlvbiwgd2hpY2gKICAvLy8gbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBlcXVhbGl0eSBvcGVyYXRpb24gW3RoaXNdIHVzZXMuCiAgU2V0PFY+IHVuaW9uKFNldDxWPiBvdGhlcikgPT4gdG9TZXQoKS4uYWRkQWxsKG90aGVyKTsKfQqCswBOTjwBGhwBJQEnASsESUhDGQEjATUBLAE8ATQBOQFGAR4BNi4BRikBSAE3ASUBKwEuAUEBHAE1LQEiATYBRAEOKAEgATY0BAEsAUYBLAFGAU0BIwFAATYBKQIBRARRSxVBGwE8PQFEBkdRQQZPUBIvQAIBOwROSgxLNAFEBk5ITkkSBk9LEis4ASIBMAEqHgQBOgEWGgQBJiAEASwBLAERFwQBNjAEARc7FQQBTgFQATspASYmBAEvKgQBFjsjBAEtLQE7LQEeIgQBOAE2ASwBKScEASshBAFAMgQBKyEEAQ4kATIBMScEAVE5BAEnHwQBJx0EAUoCATkEUE1JMgFEBkxITkkSBk9KEio2ASABLAEmHwQBKgERFgQBSwFGAUoBOAE3AS4iBAErIAQBLiIEAQ4jASsgBAE3ATwCAT0EUEsMTTgBRAZQSE5JEgZPTBIsOgEkARYbBAEmIQQBGyAEARofBAEuAREYBAE7ASsiBAErIgQBDiUBLwEtAgE5BE9JGTEZATYBTQZOUFFPIQZPTRItPwErASYYBAEhGQQBNh8EARETBAE2AToBQgE5ASkWBAElASsBJgEiAUkcAUoBLQFKAQ4yASoBKQE4NQFHAgE3BDwEQ0I2BDY2IyIBNQEqARUgIwYlBAFCASgBLgElATABRQFRBlE9BlBAKjwBTgZRPgZQQEsBTQ4eSQEOMgFPBlAfBlBAOAIBPgRRUFBIURQETxYETlEaBFBKOQRCTxwpATMGTlEtNhkkASwBFRodBiUEASI4KgEmBAEoAS4BJQErARYhGSMVFAgTBAE+ASQBRQFRBlE9BlBAKjwBTgZRPgZQQEsBHTcqARoEASA4KgEyGhEEAUkBKxckKggnBAEuMCQ2LAEwKQYBGx48CCsEASwwAQ4yAU8GUB8GUEA4AgEkcGFja2FnZTpjb2xsZWN0aW9uL3NyYy93cmFwcGVycy5kYXJ0OHNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9kYXJ0MmpzX2luZm8vbGliL3NyYy9ncmFwaC5kYXJ0qN4vLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIEEgbGlicmFyeSB0byB3b3JrIHdpdGggZ3JhcGhzLiBJdCBjb250YWlucyBhIGNvdXBsZSBhbGdvcml0aG1zLCBpbmNsdWRpbmcKLy8vIFRhcmphbidzIGFsZ29yaXRobSB0byBjb21wdXRlIHN0cm9uZ2x5IGNvbm5lY3RlZCBjb21wb25lbnRzIGluIGEgZ3JhcGggYW5kCi8vLyBDb29wZXIgZXQgYWwncyBkb21pbmF0b3IgYWxnb3JpdGhtLgovLy8KLy8vIFBvcnRpb25zIG9mIHRoZSBjb2RlIGluIHRoaXMgbGlicmFyeSB3YXMgYWRhcHRlZCBmcm9tCi8vLyBgcGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2NvbGxlY3Rpb25fdXRpbGl0aWVzLmRhcnRgLgovLyBUT0RPKHNpZ211bmQpOiBtb3ZlIHRoaXMgaW50byBhIHNoYXJlZCBwbGFjZSwgbGlrZSBxdWl2ZXI/CmxpYnJhcnkgZGFydDJqc19pbmZvLnNyYy5ncmFwaDsKCmltcG9ydCAnZGFydDptYXRoJyBhcyBtYXRoOwoKYWJzdHJhY3QgY2xhc3MgR3JhcGg8Tj4gewogIEl0ZXJhYmxlPE4+IGdldCBub2RlczsKICBib29sIGdldCBpc0VtcHR5OwogIGludCBnZXQgbm9kZUNvdW50OwogIEl0ZXJhYmxlPE4+IHRhcmdldHNPZihOIHNvdXJjZSk7CiAgSXRlcmFibGU8Tj4gc291cmNlc09mKE4gc291cmNlKTsKCiAgLy8vIFJ1biBhIHRvcG9sb2dpY2FsIHNvcnQgb2YgdGhlIGdyYXBoLiBTaW5jZSB0aGUgZ3JhcGggbWF5IGNvbnRhaW4gY3ljbGVzLAogIC8vLyB0aGlzIHJlc3VsdHMgaW4gYSBsaXN0IG9mIHN0cm9uZ2x5IGNvbm5lY3RlZCBjb21wb25lbnRzIHJhdGhlciB0aGFuIGEgbGlzdAogIC8vLyBvZiBub2Rlcy4gVGhlIG5vZGVzIGluIGVhY2ggc3Ryb25nbHkgY29ubmVjdGVkIGNvbXBvbmVudHMgb25seSBoYXZlIGVkZ2VzCiAgLy8vIHRoYXQgcG9pbnQgdG8gbm9kZXMgaW4gdGhlIHNhbWUgY29tcG9uZW50IG9yIGVhcmxpZXIgY29tcG9uZW50cy4KICBMaXN0PExpc3Q8Tj4+IGNvbXB1dGVUb3BvbG9naWNhbFNvcnQoKSB7CiAgICBfU2NjRmluZGVyPE4+IGZpbmRlciA9IG5ldyBfU2NjRmluZGVyPE4+KHRoaXMpOwogICAgcmV0dXJuIGZpbmRlci5jb21wdXRlVG9wb2xvZ2ljYWxTb3J0KCk7CiAgfQoKICAvLy8gV2hldGhlciBbc291cmNlXSBjYW4gdHJhbnNpdGl2ZWx5IHJlYWNoIFt0YXJnZXRdLgogIGJvb2wgY29udGFpbnNQYXRoKE4gc291cmNlLCBOIHRhcmdldCkgewogICAgU2V0PE4+IHNlZW4gPSBuZXcgU2V0PE4+KCk7CiAgICBib29sIGhlbHBlcihOIG5vZGUpIHsKICAgICAgaWYgKGlkZW50aWNhbChub2RlLCB0YXJnZXQpKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKCFzZWVuLmFkZChub2RlKSkgcmV0dXJuIGZhbHNlOwogICAgICByZXR1cm4gdGFyZ2V0c09mKG5vZGUpLmFueShoZWxwZXIpOwogICAgfQoKICAgIHJldHVybiBoZWxwZXIoc291cmNlKTsKICB9CgogIC8vLyBSZXR1cm5zIGFsbCBub2RlcyByZWFjaGFibGUgZnJvbSBbcm9vdF0gaW4gcG9zdCBvcmRlci4KICBJdGVyYWJsZTxOPiBwb3N0T3JkZXIoTiByb290KSBzeW5jKiB7CiAgICB2YXIgc2VlbiA9IG5ldyBTZXQ8Tj4oKTsKICAgIEl0ZXJhYmxlPE4+IGhlbHBlcihOIG4pIHN5bmMqIHsKICAgICAgaWYgKCFzZWVuLmFkZChuKSkgcmV0dXJuOwogICAgICBmb3IgKHZhciB4IGluIHRhcmdldHNPZihuKSkgewogICAgICAgIHlpZWxkKiBoZWxwZXIoeCk7CiAgICAgIH0KICAgICAgeWllbGQgbjsKICAgIH0KCiAgICB5aWVsZCogaGVscGVyKHJvb3QpOwogIH0KCiAgLy8vIFJldHVybnMgYW4gaXRlcmFibGUgb2YgYWxsIG5vZGVzIHJlYWNoYWJsZSBmcm9tIFtyb290XSBpbiBwcmVvcmRlci4KICBJdGVyYWJsZTxOPiBwcmVPcmRlcihOIHJvb3QpIHN5bmMqIHsKICAgIHZhciBzZWVuID0gbmV3IFNldDxOPigpOwogICAgdmFyIHN0YWNrID0gPE4+W3Jvb3RdOwogICAgd2hpbGUgKHN0YWNrLmlzTm90RW1wdHkpIHsKICAgICAgdmFyIG5leHQgPSBzdGFjay5yZW1vdmVMYXN0KCk7CiAgICAgIGlmICghc2Vlbi5jb250YWlucyhuZXh0KSkgewogICAgICAgIHNlZW4uYWRkKG5leHQpOwogICAgICAgIHlpZWxkIG5leHQ7CiAgICAgICAgc3RhY2suYWRkQWxsKHRhcmdldHNPZihuZXh0KSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIGEgbGlzdCBvZiBub2RlcyB0aGF0IGZvcm0gYSBjeWNsZSBjb250YWluaW5nIHRoZSBnaXZlbiBub2RlLiBJZgogIC8vLyB0aGUgbm9kZSBpcyBub3QgcGFydCBvZiBhIGN5Y2xlIGluIHRoaXMgZ3JhcGgsIHRoZW4gYSBsaXN0IGNvbnRhaW5pbmcgb25seQogIC8vLyB0aGUgbm9kZSBpdHNlbGYgd2lsbCBiZSByZXR1cm5lZC4KICBMaXN0PE4+IGZpbmRDeWNsZUNvbnRhaW5pbmcoTiBub2RlKSB7CiAgICBhc3NlcnQobm9kZSAhPSBudWxsKTsKICAgIF9TY2NGaW5kZXI8Tj4gZmluZGVyID0gbmV3IF9TY2NGaW5kZXI8Tj4odGhpcyk7CiAgICByZXR1cm4gZmluZGVyLl9jb21wb25lbnRDb250YWluaW5nKG5vZGUpOwogIH0KCiAgLy8vIFJldHVybnMgYSBkb21pbmF0b3IgdHJlZSBzdGFydGluZyBmcm9tIHJvb3QuIFRoaXMgaXMgYSBuZXcgZ3JhcGgsIHdpdGggdGhlCiAgLy8vIHNhbWUgbm9kZXMgYXMgdGhpcyBncmFwaCwgYnV0IHdoZXJlIGVkZ2VzIGV4aXN0IGJldHdlZW4gYSBub2RlIGFuZCB0aGUKICAvLy8gbm9kZXMgaXQgaW1tZWRpYXRlbHkgZG9taW5hdGVzLiBGb3IgZXhhbXBsZSwgdGhpcyBncmFwaDoKICAvLy8KICAvLy8gICAgICAgcm9vdAogIC8vLyAgICAgICAvICAgXAogIC8vLyAgICAgIGEgICAgIGIKICAvLy8gICAgICB8ICAgIC8gXAogIC8vLyAgICAgIGMgICBkICAgZQogIC8vLyAgICAgICBcIC8gXCAvCiAgLy8vICAgICAgICBmICAgZwogIC8vLwogIC8vLyBQcm9kdWNlcyB0aGlzIHRyZWU6CiAgLy8vCiAgLy8vICAgICAgIHJvb3QKICAvLy8gICAgICAgL3wgIFwKICAvLy8gICAgICBhIHwgICBiCiAgLy8vICAgICAgfCB8ICAvfFwKICAvLy8gICAgICBjIHwgZCB8IGUKICAvLy8gICAgICAgIHwgICB8CiAgLy8vICAgICAgICBmICAgZwogIC8vLwogIC8vLyBJbnRlcm5hbGx5IHdlIGNvbXB1dGUgZG9taW5hdG9ycyB1c2luZyAoQ29vcGVyLCBIYXJ2ZXksIGFuZCBLZW5uZWR5J3MKICAvLy8gYWxnb3JpdGhtKVtodHRwOi8vd3d3LmNzLnJpY2UuZWR1L35rZWl0aC9FTUJFRC9kb20ucGRmXS4KICBHcmFwaDxOPiBkb21pbmF0b3JUcmVlKE4gcm9vdCkgewogICAgdmFyIGlEb20gPSAobmV3IF9Eb21pbmF0b3JGaW5kZXIodGhpcykuLnJ1bihyb290KSkuaW1tZWRpYXRlRG9taW5hdG9yczsKICAgIHZhciBncmFwaCA9IG5ldyBFZGdlTGlzdEdyYXBoPE4+KCk7CiAgICBmb3IgKE4gbm9kZSBpbiBpRG9tLmtleXMpIHsKICAgICAgaWYgKG5vZGUgIT0gcm9vdCkgZ3JhcGguYWRkRWRnZShpRG9tW25vZGVdLCBub2RlKTsKICAgIH0KICAgIHJldHVybiBncmFwaDsKICB9Cn0KCmNsYXNzIEVkZ2VMaXN0R3JhcGg8Tj4gZXh0ZW5kcyBHcmFwaDxOPiB7CiAgLy8vIEVkZ2VzIGluIHRoZSBncmFwaC4KICBNYXA8TiwgU2V0PE4+PiBfZWRnZXMgPSBuZXcgTWFwPE4sIFNldDxOPj4oKTsKCiAgLy8vIFRoZSByZXZlcnNlIG9mIF9lZGdlcy4KICBNYXA8TiwgU2V0PE4+PiBfcmV2RWRnZXMgPSBuZXcgTWFwPE4sIFNldDxOPj4oKTsKCiAgSXRlcmFibGU8Tj4gZ2V0IG5vZGVzID0+IF9lZGdlcy5rZXlzOwogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2VkZ2VzLmlzRW1wdHk7CiAgaW50IGdldCBub2RlQ291bnQgPT4gX2VkZ2VzLmxlbmd0aDsKCiAgZmluYWwgX2VtcHR5ID0gbmV3IFNldDxOPigpOwoKICBJdGVyYWJsZTxOPiB0YXJnZXRzT2YoTiBzb3VyY2UpID0+IF9lZGdlc1tzb3VyY2VdID8/IF9lbXB0eTsKICBJdGVyYWJsZTxOPiBzb3VyY2VzT2YoTiBzb3VyY2UpID0+IF9yZXZFZGdlc1tzb3VyY2VdID8/IF9lbXB0eTsKCiAgdm9pZCBhZGRFZGdlKE4gc291cmNlLCBOIHRhcmdldCkgewogICAgYXNzZXJ0KHNvdXJjZSAhPSBudWxsKTsKICAgIGFzc2VydCh0YXJnZXQgIT0gbnVsbCk7CiAgICBhZGROb2RlKHNvdXJjZSk7CiAgICBhZGROb2RlKHRhcmdldCk7CiAgICBfZWRnZXNbc291cmNlXS5hZGQodGFyZ2V0KTsKICAgIF9yZXZFZGdlc1t0YXJnZXRdLmFkZChzb3VyY2UpOwogIH0KCiAgdm9pZCBhZGROb2RlKE4gbm9kZSkgewogICAgYXNzZXJ0KG5vZGUgIT0gbnVsbCk7CiAgICBfZWRnZXMucHV0SWZBYnNlbnQobm9kZSwgKCkgPT4gbmV3IFNldDxOPigpKTsKICAgIF9yZXZFZGdlcy5wdXRJZkFic2VudChub2RlLCAoKSA9PiBuZXcgU2V0PE4+KCkpOwogIH0KCiAgLy8vIFJlbW92ZSB0aGUgZWRnZSBmcm9tIHRoZSBnaXZlbiBbc291cmNlXSBub2RlIHRvIHRoZSBnaXZlbiBbdGFyZ2V0XSBub2RlLgogIC8vLyBJZiB0aGVyZSB3YXMgbm8gc3VjaCBlZGdlIHRoZW4gdGhlIGdyYXBoIHdpbGwgYmUgdW5tb2RpZmllZDogdGhlIG51bWJlciBvZgogIC8vLyBlZGdlcyB3aWxsIGJlIHRoZSBzYW1lIGFuZCB0aGUgc2V0IG9mIG5vZGVzIHdpbGwgYmUgdGhlIHNhbWUgKG5laXRoZXIgbm9kZQogIC8vLyB3aWxsIGVpdGhlciBiZSBhZGRlZCBvciByZW1vdmVkKS4KICB2b2lkIHJlbW92ZUVkZ2UoTiBzb3VyY2UsIE4gdGFyZ2V0KSB7CiAgICBfZWRnZXNbc291cmNlXT8ucmVtb3ZlKHRhcmdldCk7CiAgfQoKICAvLy8gUmVtb3ZlIHRoZSBnaXZlbiBub2RlIGZyb20gdGhpcyBncmFwaC4gQXMgYSBjb25zZXF1ZW5jZSwgYW55IGVkZ2VzIGZvcgogIC8vLyB3aGljaCB0aGF0IG5vZGUgd2FzIGVpdGhlciBhIGhlYWQgb3IgYSB0YWlsIHdpbGwgYWxzbyBiZSByZW1vdmVkLgogIHZvaWQgcmVtb3ZlTm9kZShOIG5vZGUpIHsKICAgIF9lZGdlcy5yZW1vdmUobm9kZSk7CiAgICB2YXIgc291cmNlcyA9IF9yZXZFZGdlc1tub2RlXTsKICAgIGlmIChzb3VyY2VzID09IG51bGwpIHJldHVybjsKICAgIGZvciAodmFyIHNvdXJjZSBpbiBzb3VyY2VzKSB7CiAgICAgIF9lZGdlc1tzb3VyY2VdLnJlbW92ZShub2RlKTsKICAgIH0KICB9CgogIC8vLyBSZW1vdmUgYWxsIG9mIHRoZSBnaXZlbiBub2RlcyBmcm9tIHRoaXMgZ3JhcGguIEFzIGEgY29uc2VxdWVuY2UsIGFueSBlZGdlcwogIC8vLyBmb3Igd2hpY2ggdGhvc2Ugbm9kZXMgd2VyZSBlaXRoZXIgYSBoZWFkIG9yIGEgdGFpbCB3aWxsIGFsc28gYmUgcmVtb3ZlZC4KICB2b2lkIHJlbW92ZUFsbE5vZGVzKExpc3Q8Tj4gbm9kZXMpID0+IG5vZGVzLmZvckVhY2gocmVtb3ZlTm9kZSk7Cn0KCi8vLyBVc2VkIGJ5IHRoZSBbU2NjRmluZGVyXSB0byBtYWludGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbm9kZXMgdGhhdCBoYXZlCi8vLyBiZWVuIGV4YW1pbmVkLiBUaGVyZSBpcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHBlciBub2RlIGluIHRoZSBncmFwaC4KY2xhc3MgX05vZGVJbmZvPE4+IHsKICAvLy8gRGVwdGggb2YgdGhlIG5vZGUgY29ycmVzcG9uZGluZyB0byB0aGlzIGluZm8uCiAgaW50IGluZGV4ID0gMDsKCiAgLy8vIERlcHRoIG9mIHRoZSBmaXJzdCBub2RlIGluIGEgY3ljbGUuCiAgaW50IGxvd2xpbmsgPSAwOwoKICAvLy8gV2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBub2RlIGlzIG9uIHRoZSBzdGFjay4gVXNlZCB0byByZW1vdmUgdGhlIG5lZWQKICAvLy8gZm9yIHNlYXJjaGluZyBhIGNvbGxlY3Rpb24gZm9yIHRoZSBub2RlIGVhY2ggdGltZSB0aGUgcXVlc3Rpb24gbmVlZHMgdG8gYmUKICAvLy8gYXNrZWQuCiAgYm9vbCBvblN0YWNrID0gZmFsc2U7CgogIC8vLyBDb21wb25lbnQgdGhhdCBjb250YWlucyB0aGUgY29ycmVzcG9uZGluZyBub2RlLgogIExpc3Q8Tj4gY29tcG9uZW50OwoKICBfTm9kZUluZm8oaW50IGRlcHRoKQogICAgICA6IGluZGV4ID0gZGVwdGgsCiAgICAgICAgbG93bGluayA9IGRlcHRoLAogICAgICAgIG9uU3RhY2sgPSBmYWxzZTsKfQoKLy8vIEltcGxlbWVudHMgVGFyamFuJ3MgQWxnb3JpdGhtIGZvciBmaW5kaW5nIHRoZSBzdHJvbmdseSBjb25uZWN0ZWQgY29tcG9uZW50cwovLy8gaW4gYSBncmFwaC4KY2xhc3MgX1NjY0ZpbmRlcjxOPiB7CiAgLy8vIFRoZSBncmFwaCB0byBwcm9jZXNzLgogIGZpbmFsIEdyYXBoPE4+IF9ncmFwaDsKCiAgLy8vIFRoZSBpbmRleCB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBkZXB0aCBvZiBub2Rlcy4KICBpbnQgX2luZGV4ID0gMDsKCiAgLy8vIE5vZGVzIHRoYXQgYXJlIGJlaW5nIHZpc2l0ZWQgaW4gb3JkZXIgdG8gaWRlbnRpZnkgY29tcG9uZW50cy4KICBMaXN0PE4+IF9zdGFjayA9IG5ldyBMaXN0PE4+KCk7CgogIC8vLyBJbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggZWFjaCBub2RlLgogIE1hcDxOLCBfTm9kZUluZm88Tj4+IF9pbmZvID0gPE4sIF9Ob2RlSW5mbzxOPj57fTsKCiAgLy8vIEFsbCBzdHJvbmdseSBjb25uZWN0ZWQgY29tcG9uZW50cyBmb3VuZCwgaW4gdG9wb2xvZ2ljYWwgc29ydCBvcmRlciAoZWFjaAogIC8vLyBub2RlIGluIGEgc3Ryb25nbHkgY29ubmVjdGVkIGNvbXBvbmVudCBvbmx5IGhhcyBlZGdlcyB0aGF0IHBvaW50IHRvIG5vZGVzCiAgLy8vIGluIHRoZSBzYW1lIGNvbXBvbmVudCBvciBlYXJsaWVyIGNvbXBvbmVudHMpLgogIExpc3Q8TGlzdDxOPj4gX2FsbENvbXBvbmVudHMgPSBuZXcgTGlzdDxMaXN0PE4+PigpOwoKICBfU2NjRmluZGVyKHRoaXMuX2dyYXBoKTsKCiAgLy8vIFJldHVybiBhIGxpc3QgY29udGFpbmluZyB0aGUgbm9kZXMgdGhhdCBhcmUgcGFydCBvZiB0aGUgc3Ryb25nbHkgY29ubmVjdGVkCiAgLy8vIGNvbXBvbmVudCB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiBub2RlLgogIExpc3Q8Tj4gX2NvbXBvbmVudENvbnRhaW5pbmcoTiBub2RlKSA9PiBfc3Ryb25nQ29ubmVjdChub2RlKS5jb21wb25lbnQ7CgogIC8vLyBSdW4gVGFyamFuJ3MgYWxnb3JpdGhtIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBsaXN0IG9mIHN0cm9uZ2x5IGNvbm5lY3RlZAogIC8vLyBjb21wb25lbnRzLiBUaGUgbGlzdCBpcyBpbiB0b3BvbG9naWNhbCBzb3J0IG9yZGVyIChlYWNoIG5vZGUgaW4gYSBzdHJvbmdseQogIC8vLyBjb25uZWN0ZWQgY29tcG9uZW50IG9ubHkgaGFzIGVkZ2VzIHRoYXQgcG9pbnQgdG8gbm9kZXMgaW4gdGhlIHNhbWUKICAvLy8gY29tcG9uZW50IG9yIGVhcmxpZXIgY29tcG9uZW50cykuCiAgTGlzdDxMaXN0PE4+PiBjb21wdXRlVG9wb2xvZ2ljYWxTb3J0KCkgewogICAgZm9yIChOIG5vZGUgaW4gX2dyYXBoLm5vZGVzKSB7CiAgICAgIHZhciBub2RlSW5mbyA9IF9pbmZvW25vZGVdOwogICAgICBpZiAobm9kZUluZm8gPT0gbnVsbCkgX3N0cm9uZ0Nvbm5lY3Qobm9kZSk7CiAgICB9CiAgICByZXR1cm4gX2FsbENvbXBvbmVudHM7CiAgfQoKICAvLy8gUmVtb3ZlIGFuZCByZXR1cm4gdGhlIHRvcC1tb3N0IGVsZW1lbnQgZnJvbSB0aGUgc3RhY2suCiAgTiBfcG9wKCkgewogICAgTiBub2RlID0gX3N0YWNrLnJlbW92ZUF0KF9zdGFjay5sZW5ndGggLSAxKTsKICAgIF9pbmZvW25vZGVdLm9uU3RhY2sgPSBmYWxzZTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgLy8vIEFkZCB0aGUgZ2l2ZW4gbm9kZSB0byB0aGUgc3RhY2suCiAgdm9pZCBfcHVzaChOIG5vZGUpIHsKICAgIF9pbmZvW25vZGVdLm9uU3RhY2sgPSB0cnVlOwogICAgX3N0YWNrLmFkZChub2RlKTsKICB9CgogIC8vLyBDb21wdXRlIHRoZSBzdHJvbmdseSBjb25uZWN0ZWQgY29tcG9uZW50IHRoYXQgY29udGFpbnMgdGhlIGdpdmVuIG5vZGUgYXMKICAvLy8gd2VsbCBhcyBhbnkgY29tcG9uZW50cyBjb250YWluaW5nIG5vZGVzIHRoYXQgYXJlIHJlYWNoYWJsZSBmcm9tIHRoZSBnaXZlbgogIC8vLyBjb21wb25lbnQuCiAgX05vZGVJbmZvPE4+IF9zdHJvbmdDb25uZWN0KE4gdikgewogICAgLy8gU2V0IHRoZSBkZXB0aCBpbmRleCBmb3IgdiB0byB0aGUgc21hbGxlc3QgdW51c2VkIGluZGV4CiAgICB2YXIgdkluZm8gPSBuZXcgX05vZGVJbmZvPE4+KF9pbmRleCsrKTsKICAgIF9pbmZvW3ZdID0gdkluZm87CiAgICBfcHVzaCh2KTsKCiAgICBmb3IgKE4gdyBpbiBfZ3JhcGgudGFyZ2V0c09mKHYpKSB7CiAgICAgIHZhciB3SW5mbyA9IF9pbmZvW3ddOwogICAgICBpZiAod0luZm8gPT0gbnVsbCkgewogICAgICAgIC8vIFN1Y2Nlc3NvciB3IGhhcyBub3QgeWV0IGJlZW4gdmlzaXRlZDsgcmVjdXJzZSBvbiBpdAogICAgICAgIHdJbmZvID0gX3N0cm9uZ0Nvbm5lY3Qodyk7CiAgICAgICAgdkluZm8ubG93bGluayA9IG1hdGgubWluKHZJbmZvLmxvd2xpbmssIHdJbmZvLmxvd2xpbmspOwogICAgICB9IGVsc2UgaWYgKHdJbmZvLm9uU3RhY2spIHsKICAgICAgICAvLyBTdWNjZXNzb3IgdyBpcyBpbiBzdGFjayBTIGFuZCBoZW5jZSBpbiB0aGUgY3VycmVudCBTQ0MKICAgICAgICB2SW5mby5sb3dsaW5rID0gbWF0aC5taW4odkluZm8ubG93bGluaywgd0luZm8uaW5kZXgpOwogICAgICB9CiAgICB9CgogICAgLy8gSWYgdiBpcyBhIHJvb3Qgbm9kZSwgcG9wIHRoZSBzdGFjayBhbmQgZ2VuZXJhdGUgYW4gU0NDCiAgICBpZiAodkluZm8ubG93bGluayA9PSB2SW5mby5pbmRleCkgewogICAgICB2YXIgY29tcG9uZW50ID0gbmV3IExpc3Q8Tj4oKTsKICAgICAgTiB3OwogICAgICBkbyB7CiAgICAgICAgdyA9IF9wb3AoKTsKICAgICAgICBjb21wb25lbnQuYWRkKHcpOwogICAgICAgIF9pbmZvW3ddLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKICAgICAgfSB3aGlsZSAoIWlkZW50aWNhbCh3LCB2KSk7CiAgICAgIF9hbGxDb21wb25lbnRzLmFkZChjb21wb25lbnQpOwogICAgfQogICAgcmV0dXJuIHZJbmZvOwogIH0KfQoKLy8vIENvbXB1dGVzIGRvbWluYXRvcnMgdXNpbmcgKENvb3BlciwgSGFydmV5LCBhbmQgS2VubmVkeSdzCi8vLyBhbGdvcml0aG0pW2h0dHA6Ly93d3cuY3MucmljZS5lZHUvfmtlaXRoL0VNQkVEL2RvbS5wZGZdLgpjbGFzcyBfRG9taW5hdG9yRmluZGVyPE4+IHsKICBmaW5hbCBHcmFwaDxOPiBfZ3JhcGg7CiAgTWFwPE4sIE4+IGltbWVkaWF0ZURvbWluYXRvcnMgPSB7fTsKICBNYXA8TiwgaW50PiBwb3N0T3JkZXJJZCA9IHt9OwogIF9Eb21pbmF0b3JGaW5kZXIodGhpcy5fZ3JhcGgpOwoKICBydW4oTiByb290KSB7CiAgICBpbW1lZGlhdGVEb21pbmF0b3JzW3Jvb3RdID0gcm9vdDsKICAgIGJvb2wgY2hhbmdlZCA9IHRydWU7CiAgICBpbnQgaSA9IDA7CiAgICB2YXIgbm9kZXNJblBvc3RPcmRlciA9IF9ncmFwaC5wb3N0T3JkZXIocm9vdCkudG9MaXN0KCk7CiAgICBmb3IgKHZhciBuIGluIG5vZGVzSW5Qb3N0T3JkZXIpIHsKICAgICAgcG9zdE9yZGVySWRbbl0gPSBpKys7CiAgICB9CiAgICB2YXIgbm9kZXNJblJldmVyc2VkUG9zdE9yZGVyID0gbm9kZXNJblBvc3RPcmRlci5yZXZlcnNlZDsKICAgIHdoaWxlIChjaGFuZ2VkKSB7CiAgICAgIGNoYW5nZWQgPSBmYWxzZTsKICAgICAgZm9yICh2YXIgbiBpbiBub2Rlc0luUmV2ZXJzZWRQb3N0T3JkZXIpIHsKICAgICAgICBpZiAobiA9PSByb290KSBjb250aW51ZTsKICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgICAgICBOIGlkb207CiAgICAgICAgZm9yICh2YXIgcCBpbiBfZ3JhcGguc291cmNlc09mKG4pKSB7CiAgICAgICAgICBpZiAoaW1tZWRpYXRlRG9taW5hdG9yc1twXSAhPSBudWxsKSB7CiAgICAgICAgICAgIGlmIChmaXJzdCkgewogICAgICAgICAgICAgIGlkb20gPSBwOwogICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaWRvbSA9IF9pbnRlcnNlY3QocCwgaWRvbSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGltbWVkaWF0ZURvbWluYXRvcnNbbl0gIT0gaWRvbSkgewogICAgICAgICAgaW1tZWRpYXRlRG9taW5hdG9yc1tuXSA9IGlkb207CiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIE4gX2ludGVyc2VjdChOIGIxLCBOIGIyKSB7CiAgICB2YXIgZmluZ2VyMSA9IGIxOwogICAgdmFyIGZpbmdlcjIgPSBiMjsKICAgIHdoaWxlIChmaW5nZXIxICE9IGZpbmdlcjIpIHsKICAgICAgd2hpbGUgKHBvc3RPcmRlcklkW2ZpbmdlcjFdIDwgcG9zdE9yZGVySWRbZmluZ2VyMl0pIHsKICAgICAgICBmaW5nZXIxID0gaW1tZWRpYXRlRG9taW5hdG9yc1tmaW5nZXIxXTsKICAgICAgfQogICAgICB3aGlsZSAocG9zdE9yZGVySWRbZmluZ2VyMl0gPCBwb3N0T3JkZXJJZFtmaW5nZXIxXSkgewogICAgICAgIGZpbmdlcjIgPSBpbW1lZGlhdGVEb21pbmF0b3JzW2ZpbmdlcjJdOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmluZ2VyMTsKICB9Cn0KgVAATk48AU5PKAQ6QD4gARwBGhkUFSMjAU9RUEcrNCwEATgqIBowKSoGARsEAT0oHSQgJBoIDwYBGQQBSicdGx8lIhgUJwgGBAFOUSgoGjQuBAFRTT8GERITFBUUEwYaBhESExQVExMGTD8jTCggOQYSBAIBKhowAR0zASgmJgEfAT9CASUcHBUVICMEARkaMjUEAU9RUSgoJAQBTUgcGSMhIiMGBAFRT0MCAU5NFTQRASoTAU5RDRgBNhUBFxcZGQIBUBAWHBkBPhIBRCIBLTQBT1A0NgEbAVEuSgFRUUkoKyMiMgYbBAE9DTEhEQQBJxcgFgQBT1ARJT4sFg4BJxwbPyNAIkI+CAYBPiglCwsUGigiJQYSBAIBPT0cGSYgIQEQJhkPPCYcBj4WFzAhGxAtMBkYHRUqDgwKLikaCggGBAEdFhYhPDAIPDAIBhQEAgEjcGFja2FnZTpkYXJ0MmpzX2luZm8vc3JjL2dyYXBoLmRhcnQrc2Rrcm9vdDovcGtnL2pzX2FzdC9saWIvc3JjL3ByZWNlZGVuY2UuZGFydILkLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgcHJlY2VkZW5jZTsKCmNvbnN0IEVYUFJFU1NJT04gPSAwOwpjb25zdCBBU1NJR05NRU5UID0gRVhQUkVTU0lPTiArIDE7CmNvbnN0IExPR0lDQUxfT1IgPSBBU1NJR05NRU5UICsgMTsKY29uc3QgTE9HSUNBTF9BTkQgPSBMT0dJQ0FMX09SICsgMTsKY29uc3QgQklUX09SID0gTE9HSUNBTF9BTkQgKyAxOwpjb25zdCBCSVRfWE9SID0gQklUX09SICsgMTsKY29uc3QgQklUX0FORCA9IEJJVF9YT1IgKyAxOwpjb25zdCBFUVVBTElUWSA9IEJJVF9BTkQgKyAxOwpjb25zdCBSRUxBVElPTkFMID0gRVFVQUxJVFkgKyAxOwpjb25zdCBTSElGVCA9IFJFTEFUSU9OQUwgKyAxOwpjb25zdCBBRERJVElWRSA9IFNISUZUICsgMTsKY29uc3QgTVVMVElQTElDQVRJVkUgPSBBRERJVElWRSArIDE7CmNvbnN0IFVOQVJZID0gTVVMVElQTElDQVRJVkUgKyAxOwpjb25zdCBDQUxMID0gVU5BUlkgKyAxOwpjb25zdCBMRUZUX0hBTkRfU0lERSA9IENBTEwgKyAxOwpjb25zdCBQUklNQVJZID0gTEVGVF9IQU5EX1NJREUgKyAxOwoYAE5OPAEUARYjIyQgHB0eIR4cJSIYISQBInBhY2thZ2U6anNfYXN0L3NyYy9wcmVjZWRlbmNlLmRhcnQrc2Rrcm9vdDovcGtnL2pzX2FzdC9saWIvc3JjL2NoYXJhY3RlcnMuZGFydIpJLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkganNfY2hhcmFjdGVyX2NvZGVzOwoKY29uc3QgaW50ICRFT0YgPSAwOwpjb25zdCBpbnQgJFNUWCA9IDI7CmNvbnN0IGludCAkQlMgPSA4Owpjb25zdCBpbnQgJFRBQiA9IDk7CmNvbnN0IGludCAkTEYgPSAxMDsKY29uc3QgaW50ICRWVEFCID0gMTE7CmNvbnN0IGludCAkRkYgPSAxMjsKY29uc3QgaW50ICRDUiA9IDEzOwpjb25zdCBpbnQgJFNQQUNFID0gMzI7CmNvbnN0IGludCAkQkFORyA9IDMzOwpjb25zdCBpbnQgJERRID0gMzQ7CmNvbnN0IGludCAkSEFTSCA9IDM1Owpjb25zdCBpbnQgJCQgPSAzNjsKY29uc3QgaW50ICRQRVJDRU5UID0gMzc7CmNvbnN0IGludCAkQU1QRVJTQU5EID0gMzg7CmNvbnN0IGludCAkU1EgPSAzOTsKY29uc3QgaW50ICRPUEVOX1BBUkVOID0gNDA7CmNvbnN0IGludCAkQ0xPU0VfUEFSRU4gPSA0MTsKY29uc3QgaW50ICRTVEFSID0gNDI7CmNvbnN0IGludCAkUExVUyA9IDQzOwpjb25zdCBpbnQgJENPTU1BID0gNDQ7CmNvbnN0IGludCAkTUlOVVMgPSA0NTsKY29uc3QgaW50ICRQRVJJT0QgPSA0NjsKY29uc3QgaW50ICRTTEFTSCA9IDQ3Owpjb25zdCBpbnQgJDAgPSA0ODsKY29uc3QgaW50ICQxID0gNDk7CmNvbnN0IGludCAkMiA9IDUwOwpjb25zdCBpbnQgJDMgPSA1MTsKY29uc3QgaW50ICQ0ID0gNTI7CmNvbnN0IGludCAkNSA9IDUzOwpjb25zdCBpbnQgJDYgPSA1NDsKY29uc3QgaW50ICQ3ID0gNTU7CmNvbnN0IGludCAkOCA9IDU2Owpjb25zdCBpbnQgJDkgPSA1NzsKY29uc3QgaW50ICRDT0xPTiA9IDU4Owpjb25zdCBpbnQgJFNFTUlDT0xPTiA9IDU5Owpjb25zdCBpbnQgJExUID0gNjA7CmNvbnN0IGludCAkRVEgPSA2MTsKY29uc3QgaW50ICRHVCA9IDYyOwpjb25zdCBpbnQgJFFVRVNUSU9OID0gNjM7CmNvbnN0IGludCAkQVQgPSA2NDsKY29uc3QgaW50ICRBID0gNjU7CmNvbnN0IGludCAkQiA9IDY2Owpjb25zdCBpbnQgJEMgPSA2NzsKY29uc3QgaW50ICREID0gNjg7CmNvbnN0IGludCAkRSA9IDY5Owpjb25zdCBpbnQgJEYgPSA3MDsKY29uc3QgaW50ICRHID0gNzE7CmNvbnN0IGludCAkSCA9IDcyOwpjb25zdCBpbnQgJEkgPSA3MzsKY29uc3QgaW50ICRKID0gNzQ7CmNvbnN0IGludCAkSyA9IDc1Owpjb25zdCBpbnQgJEwgPSA3NjsKY29uc3QgaW50ICRNID0gNzc7CmNvbnN0IGludCAkTiA9IDc4Owpjb25zdCBpbnQgJE8gPSA3OTsKY29uc3QgaW50ICRQID0gODA7CmNvbnN0IGludCAkUSA9IDgxOwpjb25zdCBpbnQgJFIgPSA4MjsKY29uc3QgaW50ICRTID0gODM7CmNvbnN0IGludCAkVCA9IDg0Owpjb25zdCBpbnQgJFUgPSA4NTsKY29uc3QgaW50ICRWID0gODY7CmNvbnN0IGludCAkVyA9IDg3Owpjb25zdCBpbnQgJFggPSA4ODsKY29uc3QgaW50ICRZID0gODk7CmNvbnN0IGludCAkWiA9IDkwOwpjb25zdCBpbnQgJE9QRU5fU1FVQVJFX0JSQUNLRVQgPSA5MTsKY29uc3QgaW50ICRCQUNLU0xBU0ggPSA5MjsKY29uc3QgaW50ICRDTE9TRV9TUVVBUkVfQlJBQ0tFVCA9IDkzOwpjb25zdCBpbnQgJENBUkVUID0gOTQ7CmNvbnN0IGludCAkXyA9IDk1Owpjb25zdCBpbnQgJEJBQ0tQSU5HID0gOTY7CmNvbnN0IGludCAkYSA9IDk3Owpjb25zdCBpbnQgJGIgPSA5ODsKY29uc3QgaW50ICRjID0gOTk7CmNvbnN0IGludCAkZCA9IDEwMDsKY29uc3QgaW50ICRlID0gMTAxOwpjb25zdCBpbnQgJGYgPSAxMDI7CmNvbnN0IGludCAkZyA9IDEwMzsKY29uc3QgaW50ICRoID0gMTA0Owpjb25zdCBpbnQgJGkgPSAxMDU7CmNvbnN0IGludCAkaiA9IDEwNjsKY29uc3QgaW50ICRrID0gMTA3Owpjb25zdCBpbnQgJGwgPSAxMDg7CmNvbnN0IGludCAkbSA9IDEwOTsKY29uc3QgaW50ICRuID0gMTEwOwpjb25zdCBpbnQgJG8gPSAxMTE7CmNvbnN0IGludCAkcCA9IDExMjsKY29uc3QgaW50ICRxID0gMTEzOwpjb25zdCBpbnQgJHIgPSAxMTQ7CmNvbnN0IGludCAkcyA9IDExNTsKY29uc3QgaW50ICR0ID0gMTE2Owpjb25zdCBpbnQgJHUgPSAxMTc7CmNvbnN0IGludCAkdiA9IDExODsKY29uc3QgaW50ICR3ID0gMTE5Owpjb25zdCBpbnQgJHggPSAxMjA7CmNvbnN0IGludCAkeSA9IDEyMTsKY29uc3QgaW50ICR6ID0gMTIyOwpjb25zdCBpbnQgJE9QRU5fQ1VSTFlfQlJBQ0tFVCA9IDEyMzsKY29uc3QgaW50ICRCQVIgPSAxMjQ7CmNvbnN0IGludCAkQ0xPU0VfQ1VSTFlfQlJBQ0tFVCA9IDEyNTsKY29uc3QgaW50ICRUSUxERSA9IDEyNjsKY29uc3QgaW50ICRERUwgPSAxMjc7CmNvbnN0IGludCAkTkJTUCA9IDE2MDsKY29uc3QgaW50ICRMUyA9IDB4MjAyODsKY29uc3QgaW50ICRQUyA9IDB4MjAyOTsKCmNvbnN0IGludCAkRklSU1RfU1VSUk9HQVRFID0gMHhkODAwOwpjb25zdCBpbnQgJExBU1RfU1VSUk9HQVRFID0gMHhkZmZmOwpjb25zdCBpbnQgJExBU1RfQ09ERV9QT0lOVCA9IDB4MTBmZmZmOwp3AE5OPAEcARQUExQUFhQUFxYUFhMZGxQcHRYWFxcYFxMTExMTExMTExMXGxQUFBoUExMTExMTExMTExMTExMTExMTExMTExMTExMlGyYXExoTExMUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCUWJhgWFxgYASUkJwEicGFja2FnZTpqc19hc3Qvc3JjL2NoYXJhY3RlcnMuZGFydDdzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pbmZlcnJlci9ub2RlX3RyYWNlci5kYXJ0wABGMy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGNvbXBpbGVyLnNyYy5pbmZlcnJlci5ub2RlX3RyYWNlcjsKCmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnIHNob3cgSWRlbnRpZmllcnM7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnIHNob3cgU2V0bGV0OwppbXBvcnQgJ2Fic3RyYWN0X3ZhbHVlX2RvbWFpbi5kYXJ0JzsKaW1wb3J0ICdkZWJ1Zy5kYXJ0JyBhcyBkZWJ1ZzsKaW1wb3J0ICdpbmZlcnJlcl9lbmdpbmUuZGFydCc7CmltcG9ydCAndHlwZV9ncmFwaF9ub2Rlcy5kYXJ0JzsKCi8vIEEgc2V0IG9mIHNlbGVjdG9ycyB3ZSBrbm93IGRvIG5vdCBlc2NhcGUgdGhlIGVsZW1lbnRzIGluc2lkZSB0aGUKLy8gbGlzdC4KU2V0PFN0cmluZz4gZG9lc05vdEVzY2FwZUxpc3RTZXQgPSBuZXcgU2V0PFN0cmluZz4uZnJvbShjb25zdCA8U3RyaW5nPlsKICAvLyBGcm9tIE9iamVjdC4KICAnPT0nLAogICdoYXNoQ29kZScsCiAgJ3RvU3RyaW5nJywKICAnbm9TdWNoTWV0aG9kJywKICAncnVudGltZVR5cGUnLAoKICAvLyBGcm9tIEl0ZXJhYmxlLgogICdpc0VtcHR5JywKICAnaXNOb3RFbXB0eScsCiAgJ2xlbmd0aCcsCiAgJ2NvbnRhaW5zJywKICAnam9pbicsCgogIC8vIEZyb20gTGlzdC4KICAnYWRkJywKICAnYWRkQWxsJywKICAnY2xlYXInLAogICdmaWxsUmFuZ2UnLAogICdpbmRleE9mJywKICAnaW5zZXJ0JywKICAnaW5zZXJ0QWxsJywKICAnbGFzdEluZGV4T2YnLAogICdyZW1vdmUnLAogICdyZW1vdmVSYW5nZScsCiAgJ3JlcGxhY2VSYW5nZScsCiAgJ3NldEFsbCcsCiAgJ3NldFJhbmdlJywKICAnc2h1ZmZsZScsCiAgJ1tdPScsCgogIC8vIEZyb20gSlNBcnJheS4KICAnY2hlY2tNdXRhYmxlJywKICAnY2hlY2tHcm93YWJsZScsCl0pOwoKU2V0PFN0cmluZz4gZG9lc05vdEVzY2FwZVNldFNldCA9IG5ldyBTZXQ8U3RyaW5nPi5mcm9tKGNvbnN0IDxTdHJpbmc+WwogIC8vIEZyb20gT2JqZWN0LgogICc9PScsCiAgJ2hhc2hDb2RlJywKICAndG9TdHJpbmcnLAogICdub1N1Y2hNZXRob2QnLAogICdydW50aW1lVHlwZScsCgogIC8vIEZyb20gSXRlcmFibGUuCiAgJ2lzRW1wdHknLAogICdpc05vdEVtcHR5JywKICAnbGVuZ3RoJywKICAnY29udGFpbnMnLAogICdqb2luJywKCiAgLy8gRnJvbSBTZXQuCiAgJ2FkZCcsCiAgJ2FkZEFsbCcsCiAgJ2NsZWFyJywKICAnY29udGFpbnNBbGwnLAogICdyZW1vdmUnLAogICdyZW1vdmVBbGwnLAogICdyZXRhaW5BbGwnLApdKTsKClNldDxTdHJpbmc+IGRvZXNOb3RFc2NhcGVNYXBTZXQgPSBuZXcgU2V0PFN0cmluZz4uZnJvbShjb25zdCA8U3RyaW5nPlsKICAvLyBGcm9tIE9iamVjdC4KICAnPT0nLAogICdoYXNoQ29kZScsCiAgJ3RvU3RyaW5nJywKICAnbm9TdWNoTWV0aG9kJywKICAncnVudGltZVR5cGUnLAogIC8vIGZyb20gTWFwLgogICdpc0VtcHR5JywKICAnaXNOb3RFbXB0eScsCiAgJ2xlbmd0aCcsCiAgJ2NsZWFyJywKICAnY29udGFpbnNLZXknLAogICdjb250YWluc1ZhbHVlJywKICAnW109JywKICAvLyBba2V5c10gb25seSBhbGxvd3Mga2V5IHZhbHVlcyB0byBlc2NhcGUsIHdoaWNoIHdlIGRvIG5vdCB0cmFjay4KICAna2V5cycKXSk7CgovLy8gQ29tbW9uIGxvZ2ljIHRvIHRyYWNlIGEgdmFsdWUgdGhyb3VnaCB0aGUgdHlwZSBpbmZlcmVuY2UgZ3JhcGggbm9kZXMuCmFic3RyYWN0IGNsYXNzIFRyYWNlclZpc2l0b3IgaW1wbGVtZW50cyBUeXBlSW5mb3JtYXRpb25WaXNpdG9yIHsKICBmaW5hbCBUeXBlSW5mb3JtYXRpb24gdHJhY2VkVHlwZTsKICBmaW5hbCBJbmZlcnJlckVuZ2luZSBpbmZlcnJlcjsKCiAgc3RhdGljIGNvbnN0IGludCBNQVhfQU5BTFlTSVNfQ09VTlQgPQogICAgICBjb25zdCBpbnQuZnJvbUVudmlyb25tZW50KCdkYXJ0MmpzLnRyYWNpbmcubGltaXQnLCBkZWZhdWx0VmFsdWU6IDMyKTsKICBmaW5hbCBTZXRsZXQ8TWVtYmVyRW50aXR5PiBhbmFseXplZEVsZW1lbnRzID0gbmV3IFNldGxldDxNZW1iZXJFbnRpdHk+KCk7CgogIFRyYWNlclZpc2l0b3IodGhpcy50cmFjZWRUeXBlLCB0aGlzLmluZmVycmVyKTsKCiAgLy8vIFdvcmsgbGlzdCB0aGF0IGdldHMgcG9wdWxhdGVkIHdpdGggW1R5cGVJbmZvcm1hdGlvbl0gdGhhdCBjb3VsZAogIC8vLyBjb250YWluIHRoZSBjb250YWluZXIuCiAgZmluYWwgTGlzdDxUeXBlSW5mb3JtYXRpb24+IHdvcmtMaXN0ID0gPFR5cGVJbmZvcm1hdGlvbj5bXTsKCiAgLy8vIFdvcmsgbGlzdCBvZiBsaXN0cyB0byBhbmFseXplIGFmdGVyIGFuYWx5emluZyB0aGUgdXNlcnMgb2YgYQogIC8vLyBbVHlwZUluZm9ybWF0aW9uXS4gV2Uga25vdyB0aGUgW3RyYWNlZFR5cGVdIGhhcyBiZWVuIHN0b3JlZCBpbiB0aGVzZQogIC8vLyBsaXN0cyBhbmQgd2UgbXVzdCBjaGVjayBob3cgaXQgZXNjYXBlcyBmcm9tIHRoZXNlIGxpc3RzLgogIGZpbmFsIExpc3Q8TGlzdFR5cGVJbmZvcm1hdGlvbj4gbGlzdHNUb0FuYWx5emUgPSA8TGlzdFR5cGVJbmZvcm1hdGlvbj5bXTsKCiAgLy8vIFdvcmsgbGlzdCBvZiBzZXRzIHRvIGFuYWx5emUgYWZ0ZXIgYW5hbHl6aW5nIHRoZSB1c2VycyBvZiBhCiAgLy8vIFtUeXBlSW5mb3JtYXRpb25dLiBXZSBrbm93IHRoZSBbdHJhY2VkVHlwZV0gaGFzIGJlZW4gc3RvcmVkIGluIHRoZXNlIHNldHMKICAvLy8gYW5kIHdlIG11c3QgY2hlY2sgaG93IGl0IGVzY2FwZXMgZnJvbSB0aGVzZSBzZXRzLgogIGZpbmFsIExpc3Q8U2V0VHlwZUluZm9ybWF0aW9uPiBzZXRzVG9BbmFseXplID0gPFNldFR5cGVJbmZvcm1hdGlvbj5bXTsKCiAgLy8vIFdvcmsgbGlzdCBvZiBtYXBzIHRvIGFuYWx5emUgYWZ0ZXIgYW5hbHl6aW5nIHRoZSB1c2VycyBvZiBhCiAgLy8vIFtUeXBlSW5mb3JtYXRpb25dLiBXZSBrbm93IHRoZSBbdHJhY2VkVHlwZV0gaGFzIGJlZW4gc3RvcmVkIGluIHRoZXNlCiAgLy8vIG1hcHMgYW5kIHdlIG11c3QgY2hlY2sgaG93IGl0IGVzY2FwZXMgZnJvbSB0aGVzZSBtYXBzLgogIGZpbmFsIExpc3Q8TWFwVHlwZUluZm9ybWF0aW9uPiBtYXBzVG9BbmFseXplID0gPE1hcFR5cGVJbmZvcm1hdGlvbj5bXTsKCiAgZmluYWwgU2V0bGV0PFR5cGVJbmZvcm1hdGlvbj4gZmxvd3NJbnRvID0gbmV3IFNldGxldDxUeXBlSW5mb3JtYXRpb24+KCk7CgogIC8vIFRoZSBjdXJyZW50IFtUeXBlSW5mb3JtYXRpb25dIGluIHRoZSBhbmFseXNpcy4KICBUeXBlSW5mb3JtYXRpb24gY3VycmVudFVzZXI7CiAgYm9vbCBjb250aW51ZUFuYWx5emluZyA9IHRydWU7CgogIHZvaWQgYWRkTmV3RXNjYXBlSW5mb3JtYXRpb24oVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIGlmIChmbG93c0ludG8uY29udGFpbnMoaW5mbykpIHJldHVybjsKICAgIGZsb3dzSW50by5hZGQoaW5mbyk7CiAgICB3b3JrTGlzdC5hZGQoaW5mbyk7CiAgfQoKICBib29sIF93b3VsZEJlVG9vTWFueVVzZXJzKFNldCB1c2VycykgewogICAgaW50IHNlZW5Tb0ZhciA9IGFuYWx5emVkRWxlbWVudHMubGVuZ3RoOwogICAgaWYgKHNlZW5Tb0ZhciArIHVzZXJzLmxlbmd0aCA8PSBNQVhfQU5BTFlTSVNfQ09VTlQpIHJldHVybiBmYWxzZTsKICAgIGludCBhY3R1YWxXb3JrID0gMDsKICAgIGZvciAoVHlwZUluZm9ybWF0aW9uIHVzZXIgaW4gdXNlcnMpIHsKICAgICAgaWYgKCFhbmFseXplZEVsZW1lbnRzLmNvbnRhaW5zKHVzZXIub3duZXIpKSB7CiAgICAgICAgYWN0dWFsV29yaysrOwogICAgICAgIGlmIChhY3R1YWxXb3JrID4gTUFYX0FOQUxZU0lTX0NPVU5UIC0gc2VlblNvRmFyKSByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgdm9pZCBhbmFseXplKCkgewogICAgLy8gQ29sbGVjdCB0aGUgW1R5cGVJbmZvcm1hdGlvbl0gd2hlcmUgdGhlIGxpc3QgY2FuIGZsb3cgaW4sCiAgICAvLyBhcyB3ZWxsIGFzIHRoZSBvcGVyYXRpb25zIGRvbmUgb24gYWxsIHRoZXNlIFtUeXBlSW5mb3JtYXRpb25dcy4KICAgIGFkZE5ld0VzY2FwZUluZm9ybWF0aW9uKHRyYWNlZFR5cGUpOwogICAgd2hpbGUgKCF3b3JrTGlzdC5pc0VtcHR5KSB7CiAgICAgIGN1cnJlbnRVc2VyID0gd29ya0xpc3QucmVtb3ZlTGFzdCgpOwogICAgICBpZiAoX3dvdWxkQmVUb29NYW55VXNlcnMoY3VycmVudFVzZXIudXNlcnMpKSB7CiAgICAgICAgYmFpbG91dCgnVG9vIG1hbnkgdXNlcnMnKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBmb3IgKFR5cGVJbmZvcm1hdGlvbiBpbmZvIGluIGN1cnJlbnRVc2VyLnVzZXJzKSB7CiAgICAgICAgYW5hbHl6ZWRFbGVtZW50cy5hZGQoaW5mby5vd25lcik7CiAgICAgICAgaW5mby5hY2NlcHQodGhpcyk7CiAgICAgIH0KICAgICAgd2hpbGUgKCFsaXN0c1RvQW5hbHl6ZS5pc0VtcHR5KSB7CiAgICAgICAgYW5hbHl6ZVN0b3JlZEludG9MaXN0KGxpc3RzVG9BbmFseXplLnJlbW92ZUxhc3QoKSk7CiAgICAgIH0KICAgICAgd2hpbGUgKHNldHNUb0FuYWx5emUuaXNOb3RFbXB0eSkgewogICAgICAgIGFuYWx5emVTdG9yZWRJbnRvU2V0KHNldHNUb0FuYWx5emUucmVtb3ZlTGFzdCgpKTsKICAgICAgfQogICAgICB3aGlsZSAoIW1hcHNUb0FuYWx5emUuaXNFbXB0eSkgewogICAgICAgIGFuYWx5emVTdG9yZWRJbnRvTWFwKG1hcHNUb0FuYWx5emUucmVtb3ZlTGFzdCgpKTsKICAgICAgfQogICAgICBpZiAoIWNvbnRpbnVlQW5hbHl6aW5nKSBicmVhazsKICAgIH0KICB9CgogIHZvaWQgYmFpbG91dChTdHJpbmcgcmVhc29uKSB7CiAgICBpZiAoZGVidWcuVkVSQk9TRSkgewogICAgICBwcmludCgnQmFpbGluZyBvdXQgb24gJHRyYWNlZFR5cGUgYmVjYXVzZTogJHJlYXNvbicpOwogICAgfQogICAgY29udGludWVBbmFseXppbmcgPSBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRBd2FpdFR5cGVJbmZvcm1hdGlvbihBd2FpdFR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBiYWlsb3V0KCJQYXNzZWQgdGhyb3VnaCBhd2FpdCIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFlpZWxkVHlwZUluZm9ybWF0aW9uKFlpZWxkVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIC8vIFRPRE8oMjkzNDQpOiBUaGUgZW5jbG9zaW5nIHN5bmMqL2FzeW5jL2FzeW5jKiBtZXRob2QgY291bGQgaGF2ZSBhCiAgICAvLyB0cmFjYWJsZSBUeXBlSW5mb3JtYXRpb24gZm9yIHRoZSBJdGVyYWJsZSAvIEZ1dHVyZSAvIFN0cmVhbSB3aXRoIGFuCiAgICAvLyBlbGVtZW50IFR5cGVJbmZvcm1hdGlvbi4gVGhlbiBZaWVsZFR5cGVJbmZvcm1hdGlvbiBjb3VsZCBjb25uZWN0IHRoZQogICAgLy8gc291cmNlIHR5cGUgaW5mb3JtYXRpb24gdG8gdGhlIHRyYWNhYmxlIGVsZW1lbnQuCiAgICBiYWlsb3V0KCJQYXNzZWQgdGhyb3VnaCB5aWVsZCIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE5hcnJvd1R5cGVJbmZvcm1hdGlvbihOYXJyb3dUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgYWRkTmV3RXNjYXBlSW5mb3JtYXRpb24oaW5mbyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UGhpRWxlbWVudFR5cGVJbmZvcm1hdGlvbihQaGlFbGVtZW50VHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIGFkZE5ld0VzY2FwZUluZm9ybWF0aW9uKGluZm8pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEVsZW1lbnRJbkNvbnRhaW5lclR5cGVJbmZvcm1hdGlvbigKICAgICAgRWxlbWVudEluQ29udGFpbmVyVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIGFkZE5ld0VzY2FwZUluZm9ybWF0aW9uKGluZm8pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEVsZW1lbnRJblNldFR5cGVJbmZvcm1hdGlvbihFbGVtZW50SW5TZXRUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgYWRkTmV3RXNjYXBlSW5mb3JtYXRpb24oaW5mbyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0S2V5SW5NYXBUeXBlSW5mb3JtYXRpb24oS2V5SW5NYXBUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgLy8gV2UgZG8gbm90IHRyYWNrIHRoZSB1c2Ugb2Yga2V5cyBmcm9tIGEgbWFwLCBzbyB3ZSBoYXZlIHRvIGJhaWwuCiAgICBiYWlsb3V0KCdVc2VkIGFzIGtleSBpbiBNYXAnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRWYWx1ZUluTWFwVHlwZUluZm9ybWF0aW9uKFZhbHVlSW5NYXBUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgYWRkTmV3RXNjYXBlSW5mb3JtYXRpb24oaW5mbyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGlzdFR5cGVJbmZvcm1hdGlvbihMaXN0VHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIGxpc3RzVG9BbmFseXplLmFkZChpbmZvKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTZXRUeXBlSW5mb3JtYXRpb24oU2V0VHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIHNldHNUb0FuYWx5emUuYWRkKGluZm8pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE1hcFR5cGVJbmZvcm1hdGlvbihNYXBUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgbWFwc1RvQW5hbHl6ZS5hZGQoaW5mbyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29uY3JldGVUeXBlSW5mb3JtYXRpb24oQ29uY3JldGVUeXBlSW5mb3JtYXRpb24gaW5mbykge30KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN0cmluZ0xpdGVyYWxUeXBlSW5mb3JtYXRpb24oU3RyaW5nTGl0ZXJhbFR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Qm9vbExpdGVyYWxUeXBlSW5mb3JtYXRpb24oQm9vbExpdGVyYWxUeXBlSW5mb3JtYXRpb24gaW5mbykge30KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENsb3N1cmVUeXBlSW5mb3JtYXRpb24oQ2xvc3VyZVR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2xvc3VyZUNhbGxTaXRlVHlwZUluZm9ybWF0aW9uKAogICAgICBDbG9zdXJlQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24gaW5mbykge30KCiAgQG92ZXJyaWRlCiAgdmlzaXRTdGF0aWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbihTdGF0aWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBNZW1iZXJFbnRpdHkgY2FsbGVkID0gaW5mby5jYWxsZWRFbGVtZW50OwogICAgVHlwZUluZm9ybWF0aW9uIGluZmVycmVkID0gaW5mZXJyZXIudHlwZXMuZ2V0SW5mZXJyZWRUeXBlT2ZNZW1iZXIoY2FsbGVkKTsKICAgIGlmIChpbmZlcnJlZCA9PSBjdXJyZW50VXNlcikgewogICAgICBhZGROZXdFc2NhcGVJbmZvcm1hdGlvbihpbmZvKTsKICAgIH0KICB9CgogIHZvaWQgYW5hbHl6ZVN0b3JlZEludG9MaXN0KExpc3RUeXBlSW5mb3JtYXRpb24gbGlzdCkgewogICAgaW5mZXJyZXIuYW5hbHl6ZUxpc3RBbmRFbnF1ZXVlKGxpc3QpOwogICAgaWYgKGxpc3QuYmFpbGVkT3V0KSB7CiAgICAgIGJhaWxvdXQoJ1N0b3JlZCBpbiBhIGxpc3QgdGhhdCBiYWlsZWQgb3V0Jyk7CiAgICB9IGVsc2UgewogICAgICBsaXN0LmZsb3dzSW50by5mb3JFYWNoKChUeXBlSW5mb3JtYXRpb24gZmxvdykgewogICAgICAgIGZsb3cudXNlcnMuZm9yRWFjaCgoVHlwZUluZm9ybWF0aW9uIHVzZXIpIHsKICAgICAgICAgIGlmICh1c2VyIGlzIER5bmFtaWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbikgewogICAgICAgICAgICBpZiAodXNlci5yZWNlaXZlciAhPSBmbG93KSByZXR1cm47CiAgICAgICAgICAgIGlmIChpbmZlcnJlci5yZXR1cm5zTGlzdEVsZW1lbnRUeXBlU2V0LmNvbnRhaW5zKHVzZXIuc2VsZWN0b3IpKSB7CiAgICAgICAgICAgICAgYWRkTmV3RXNjYXBlSW5mb3JtYXRpb24odXNlcik7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWRvZXNOb3RFc2NhcGVMaXN0U2V0LmNvbnRhaW5zKHVzZXIuc2VsZWN0b3IubmFtZSkpIHsKICAgICAgICAgICAgICBiYWlsb3V0KCdFc2NhcGUgZnJvbSBhIGxpc3QgdmlhIFske3VzZXIuc2VsZWN0b3IubmFtZX1dJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CiAgfQoKICB2b2lkIGFuYWx5emVTdG9yZWRJbnRvU2V0KFNldFR5cGVJbmZvcm1hdGlvbiBzZXQpIHsKICAgIGluZmVycmVyLmFuYWx5emVTZXRBbmRFbnF1ZXVlKHNldCk7CiAgICBpZiAoc2V0LmJhaWxlZE91dCkgewogICAgICBiYWlsb3V0KCdTdG9yZWQgaW4gYSBzZXQgdGhhdCBiYWlsZWQgb3V0Jyk7CiAgICB9IGVsc2UgewogICAgICBzZXQuZmxvd3NJbnRvLmZvckVhY2goKFR5cGVJbmZvcm1hdGlvbiBmbG93KSB7CiAgICAgICAgZmxvdy51c2Vycy5mb3JFYWNoKChUeXBlSW5mb3JtYXRpb24gdXNlcikgewogICAgICAgICAgaWYgKHVzZXIgaXMgRHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKSB7CiAgICAgICAgICAgIGlmICh1c2VyLnJlY2VpdmVyICE9IGZsb3cpIHJldHVybjsKICAgICAgICAgICAgaWYgKHVzZXIuc2VsZWN0b3IuaXNJbmRleCkgewogICAgICAgICAgICAgIGFkZE5ld0VzY2FwZUluZm9ybWF0aW9uKHVzZXIpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCFkb2VzTm90RXNjYXBlU2V0U2V0LmNvbnRhaW5zKHVzZXIuc2VsZWN0b3IubmFtZSkpIHsKICAgICAgICAgICAgICBiYWlsb3V0KCdFc2NhcGUgZnJvbSBhIHNldCB2aWEgWyR7dXNlci5zZWxlY3Rvci5uYW1lfV0nKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KICB9CgogIHZvaWQgYW5hbHl6ZVN0b3JlZEludG9NYXAoTWFwVHlwZUluZm9ybWF0aW9uIG1hcCkgewogICAgaW5mZXJyZXIuYW5hbHl6ZU1hcEFuZEVucXVldWUobWFwKTsKICAgIGlmIChtYXAuYmFpbGVkT3V0KSB7CiAgICAgIGJhaWxvdXQoJ1N0b3JlZCBpbiBhIG1hcCB0aGF0IGJhaWxlZCBvdXQnKTsKICAgIH0gZWxzZSB7CiAgICAgIG1hcC5mbG93c0ludG8uZm9yRWFjaCgoVHlwZUluZm9ybWF0aW9uIGZsb3cpIHsKICAgICAgICBmbG93LnVzZXJzLmZvckVhY2goKFR5cGVJbmZvcm1hdGlvbiB1c2VyKSB7CiAgICAgICAgICBpZiAodXNlciBpcyBEeW5hbWljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24pIHsKICAgICAgICAgICAgaWYgKHVzZXIucmVjZWl2ZXIgIT0gZmxvdykgcmV0dXJuOwogICAgICAgICAgICBpZiAodXNlci5zZWxlY3Rvci5pc0luZGV4KSB7CiAgICAgICAgICAgICAgYWRkTmV3RXNjYXBlSW5mb3JtYXRpb24odXNlcik7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWRvZXNOb3RFc2NhcGVNYXBTZXQuY29udGFpbnModXNlci5zZWxlY3Rvci5uYW1lKSkgewogICAgICAgICAgICAgIGJhaWxvdXQoJ0VzY2FwZSBmcm9tIGEgbWFwIHZpYSBbJHt1c2VyLnNlbGVjdG9yLm5hbWV9XScpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgLy8vIENoZWNrcyB3aGV0aGVyIHRoaXMgaXMgYSBjYWxsIHRvIGEgbGlzdCBhZGRpbmcgbWV0aG9kLiBUaGUgZGVmaW5pdGlvbiBvZgogIC8vLyB3aGF0IGxpc3QgYWRkaW5nIG1lYW5zIGhhcyB0byBzdGF5IGluIHN5bmMgd2l0aAogIC8vLyBbaXNQYXJhbWV0ZXJPZkxpc3RBZGRpbmdNZXRob2RdLgogIGJvb2wgbWlnaHRBZGRUb0NvbnRhaW5lcihEeW5hbWljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgaWYgKGluZm8uYXJndW1lbnRzID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIGlmIChpbmZvLmFyZ3VtZW50cy5uYW1lZC5pc05vdEVtcHR5KSByZXR1cm4gZmFsc2U7CiAgICBTdHJpbmcgc2VsZWN0b3JOYW1lID0gaW5mby5zZWxlY3Rvci5uYW1lOwogICAgTGlzdDxUeXBlSW5mb3JtYXRpb24+IGFyZ3VtZW50cyA9IGluZm8uYXJndW1lbnRzLnBvc2l0aW9uYWw7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHJldHVybiAoc2VsZWN0b3JOYW1lID09ICdhZGQnICYmIGN1cnJlbnRVc2VyID09IGFyZ3VtZW50c1swXSk7CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gKHNlbGVjdG9yTmFtZSA9PSAnaW5zZXJ0JyAmJiBjdXJyZW50VXNlciA9PSBhcmd1bWVudHNbMV0pOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgYm9vbCBpc0luZGV4U2V0QXJndW1lbnQoRHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8sIGludCBpbmRleCkgewogICAgU3RyaW5nIHNlbGVjdG9yTmFtZSA9IGluZm8uc2VsZWN0b3IubmFtZTsKICAgIGlmIChzZWxlY3Rvck5hbWUgIT0gJ1tdPScpIHJldHVybiBmYWxzZTsKICAgIGFzc2VydChpbmZvLmFyZ3VtZW50cy5sZW5ndGggPT0gMik7CiAgICBMaXN0PFR5cGVJbmZvcm1hdGlvbj4gYXJndW1lbnRzID0gaW5mby5hcmd1bWVudHMucG9zaXRpb25hbDsKICAgIHJldHVybiBjdXJyZW50VXNlciA9PSBhcmd1bWVudHNbaW5kZXhdOwogIH0KCiAgLy8vIENoZWNrcyB3aGV0aGVyIHRoZSBjYWxsIHNpdGUgZmxvd3MgdGhlIGN1cnJlbnRVc2VyIHRvIHRoZSBrZXkgYXJndW1lbnQgb2YKICAvLy8gYW4gaW5kZXhpbmcgc2V0dGVyLiBUaGlzIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGgKICAvLy8gW2lzUGFyYW1ldGVyT2ZNYXBBZGRpbmdNZXRob2RdLgogIGJvb2wgaXNJbmRleFNldEtleShEeW5hbWljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgcmV0dXJuIGlzSW5kZXhTZXRBcmd1bWVudChpbmZvLCAwKTsKICB9CgogIC8vLyBDaGVja3Mgd2hldGhlciB0aGUgY2FsbCBzaXRlIGZsb3dzIHRoZSBjdXJyZW50VXNlciB0byB0aGUgdmFsdWUgYXJndW1lbnQKICAvLy8gb2YgYW4gaW5kZXhpbmcgc2V0dGVyLiBUaGlzIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGgKICAvLy8gW2lzUGFyYW1ldGVyT2ZMaXN0QWRkaW5nTWV0aG9kXSBhbmQgW2lzUGFyYW1ldGVyT2ZNYXBBZGRpbmdNZXRob2RdLgogIGJvb2wgaXNJbmRleFNldFZhbHVlKER5bmFtaWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICByZXR1cm4gaXNJbmRleFNldEFyZ3VtZW50KGluZm8sIDEpOwogIH0KCiAgdm9pZCBiYWlsb3V0SWZSZWFjaGVzKGJvb2wgcHJlZGljYXRlKFBhcmFtZXRlclR5cGVJbmZvcm1hdGlvbiBlKSkgewogICAgZm9yICh2YXIgdXNlciBpbiBjdXJyZW50VXNlci51c2VycykgewogICAgICBpZiAodXNlciBpcyBQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24pIHsKICAgICAgICBpZiAocHJlZGljYXRlKHVzZXIpKSB7CiAgICAgICAgICBiYWlsb3V0KCdSZWFjaGVkIHN1cHByZXNzZWQgcGFyYW1ldGVyIHdpdGhvdXQgcHJlY2lzZSByZWNlaXZlcicpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKAogICAgICBEeW5hbWljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgdm9pZCBhZGRzVG9Db250YWluZXIoQWJzdHJhY3RWYWx1ZSBtYXNrKSB7CiAgICAgIE9iamVjdCBhbGxvY2F0aW9uTm9kZSA9CiAgICAgICAgICBpbmZlcnJlci5hYnN0cmFjdFZhbHVlRG9tYWluLmdldEFsbG9jYXRpb25Ob2RlKG1hc2spOwogICAgICBpZiAoYWxsb2NhdGlvbk5vZGUgIT0gbnVsbCkgewogICAgICAgIExpc3RUeXBlSW5mb3JtYXRpb24gbGlzdCA9CiAgICAgICAgICAgIGluZmVycmVyLnR5cGVzLmFsbG9jYXRlZExpc3RzW2FsbG9jYXRpb25Ob2RlXTsKICAgICAgICBsaXN0c1RvQW5hbHl6ZS5hZGQobGlzdCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVGhlIFttYXNrXSBpcyBhIHVuaW9uIG9mIHR3byBjb250YWluZXJzLCBhbmQgd2UgbG9zZSB0cmFjayBvZiB3aGVyZQogICAgICAgIC8vIHRoZXNlIGNvbnRhaW5lcnMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhdCB0aGlzIHBvaW50LgogICAgICAgIGJhaWxvdXQoJ1N0b3JlZCBpbiB0b28gbWFueSBjb250YWluZXJzJyk7CiAgICAgIH0KICAgIH0KCiAgICB2b2lkIGFkZHNUb01hcFZhbHVlKEFic3RyYWN0VmFsdWUgbWFzaykgewogICAgICBPYmplY3QgYWxsb2NhdGlvbk5vZGUgPQogICAgICAgICAgaW5mZXJyZXIuYWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRBbGxvY2F0aW9uTm9kZShtYXNrKTsKICAgICAgaWYgKGFsbG9jYXRpb25Ob2RlICE9IG51bGwpIHsKICAgICAgICBNYXBUeXBlSW5mb3JtYXRpb24gbWFwID0gaW5mZXJyZXIudHlwZXMuYWxsb2NhdGVkTWFwc1thbGxvY2F0aW9uTm9kZV07CiAgICAgICAgbWFwc1RvQW5hbHl6ZS5hZGQobWFwKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUaGUgW21hc2tdIGlzIGEgdW5pb24uIFNlZSBjb21tZW50IGZvciBbbWFza10gYWJvdmUuCiAgICAgICAgYmFpbG91dCgnU3RvcmVkIGluIHRvbyBtYW55IG1hcHMnKTsKICAgICAgfQogICAgfQoKICAgIHZvaWQgYWRkc1RvTWFwS2V5KEFic3RyYWN0VmFsdWUgbWFzaykgewogICAgICAvLyBXZSBkbyBub3QgdHJhY2sgdGhlIHVzZSBvZiBrZXlzIGZyb20gYSBtYXAsIHNvIHdlIGhhdmUgdG8gYmFpbC4KICAgICAgYmFpbG91dCgnVXNlZCBhcyBrZXkgaW4gTWFwJyk7CiAgICB9CgogICAgLy8gImFbLi4uXSA9IHgiIGNvdWxkIGJlIGEgbGlzdCAoY29udGFpbmVyKSBvciBtYXAgYXNzaWduZW1udC4KICAgIGlmIChpc0luZGV4U2V0VmFsdWUoaW5mbykpIHsKICAgICAgdmFyIHJlY2VpdmVyVHlwZSA9IGluZm8ucmVjZWl2ZXIudHlwZTsKICAgICAgaWYgKGluZmVycmVyLmFic3RyYWN0VmFsdWVEb21haW4uaXNDb250YWluZXIocmVjZWl2ZXJUeXBlKSkgewogICAgICAgIGFkZHNUb0NvbnRhaW5lcihyZWNlaXZlclR5cGUpOwogICAgICB9IGVsc2UgaWYgKGluZmVycmVyLmFic3RyYWN0VmFsdWVEb21haW4uaXNNYXAocmVjZWl2ZXJUeXBlKSkgewogICAgICAgIGFkZHNUb01hcFZhbHVlKHJlY2VpdmVyVHlwZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gTm90IGEgY29udGFpbmVyIG9yIG1hcCwgc28gdGhlIHRhcmdldHMgY291bGQgYmUgYW55IG1ldGhvZHMuIFRoZXJlCiAgICAgICAgLy8gYXJlIGVkZ2VzIGZyb20gdGhlIFtjdXJyZW50VXNlcl0gdG8gdGhlIHBhcmFtZXRlcnMgb2YgdGhlIHRhcmdldHMsIHNvCiAgICAgICAgLy8gdHJhY2luZyB3aWxsIGNvbnRpbnVlIGludG8gdGhlIHRhcmdldHMuICBUcmFjaW5nIHN0b3BzIGF0IHBhcmFtZXRlcnMKICAgICAgICAvLyB0aGF0IG1hdGNoIHRoZSB0YXJnZXRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlY2VpdmVyVHlwZXMgYWJvdmUgKHRvCiAgICAgICAgLy8gcHJldmVudCBpbXByZWNpc2UgcmVzdWx0cyBmcm9tIHRyYWNpbmcgdGhlIGltcGxlbWVudGF0aW9uKSwgc28gd2UKICAgICAgICAvLyBuZWVkIGNvbXBlbnNhdGUgaWYgb25lIG9mIHRoZSB0YXJnZXRzIGlzIGluIHRoZSB0YXJnZXQgc2V0LiBJZiB0aGVyZQogICAgICAgIC8vIGlzIGFuIGVkZ2UgdG8gYSBwYXJhbWV0ZXIgbWF0Y2hpbmcgW2lzUGFyYW1ldGVyT2ZMaXN0QWRkaW5nTWV0aG9kXSBvcgogICAgICAgIC8vIFtpc1BhcmFtZXRlck9mTWFwQWRkaW5nTWV0aG9kXSB0aGVuIHRoZSB0cmFjZWQgdmFsdWUgaXMgYmVpbmcgc3RvcmVkCiAgICAgICAgLy8gaW50byBhbiB1bnRyYWNlZCBsaXN0IG9yIG1hcC4KCiAgICAgICAgLy8gVE9ETyhzcmEpOiBJdCB3b3VsZCBiZSBtb3JlIHByZWNpc2UgdG8gc3BlY2lmaWNhbGx5IG1hdGNoIHRoZSBgdmFsdWUnCiAgICAgICAgLy8gcGFyYW1ldGVycyBvZiAib3BlcmF0b3IgW109Ii4KICAgICAgICBiYWlsb3V0SWZSZWFjaGVzKGlzUGFyYW1ldGVyT2ZMaXN0QWRkaW5nTWV0aG9kKTsKICAgICAgICBiYWlsb3V0SWZSZWFjaGVzKGlzUGFyYW1ldGVyT2ZNYXBBZGRpbmdNZXRob2QpOwogICAgICB9CiAgICB9CgogICAgLy8gQ291bGQgYmU6ICBtW3hdID0gLi4uOwogICAgaWYgKGlzSW5kZXhTZXRLZXkoaW5mbykpIHsKICAgICAgdmFyIHJlY2VpdmVyVHlwZSA9IGluZm8ucmVjZWl2ZXIudHlwZTsKICAgICAgaWYgKGluZmVycmVyLmFic3RyYWN0VmFsdWVEb21haW4uaXNNYXAocmVjZWl2ZXJUeXBlKSkgewogICAgICAgIGFkZHNUb01hcEtleShyZWNlaXZlclR5cGUpOwogICAgICB9IGVsc2UgewogICAgICAgIGJhaWxvdXRJZlJlYWNoZXMoaXNQYXJhbWV0ZXJPZkxpc3RBZGRpbmdNZXRob2QpOwogICAgICAgIGJhaWxvdXRJZlJlYWNoZXMoaXNQYXJhbWV0ZXJPZk1hcEFkZGluZ01ldGhvZCk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAobWlnaHRBZGRUb0NvbnRhaW5lcihpbmZvKSkgewogICAgICB2YXIgcmVjZWl2ZXJUeXBlID0gaW5mby5yZWNlaXZlci50eXBlOwogICAgICBpZiAoaW5mZXJyZXIuYWJzdHJhY3RWYWx1ZURvbWFpbi5pc0NvbnRhaW5lcihyZWNlaXZlclR5cGUpKSB7CiAgICAgICAgYWRkc1RvQ29udGFpbmVyKHJlY2VpdmVyVHlwZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gTm90IGEgY29udGFpbmVyLCBzZWUgbm90ZSBhYm92ZS4KICAgICAgICBiYWlsb3V0SWZSZWFjaGVzKGlzUGFyYW1ldGVyT2ZMaXN0QWRkaW5nTWV0aG9kKTsKICAgICAgfQogICAgfQoKICAgIGlmIChpbmZvLnRhcmdldHNJbmNsdWRlQ29tcGxleE5vU3VjaE1ldGhvZChpbmZlcnJlcikgJiYKICAgICAgICBpbmZvLmFyZ3VtZW50cyAhPSBudWxsICYmCiAgICAgICAgaW5mby5hcmd1bWVudHMuY29udGFpbnMoY3VycmVudFVzZXIpKSB7CiAgICAgIGJhaWxvdXQoJ1Bhc3NlZCB0byBub1N1Y2hNZXRob2QnKTsKICAgIH0KCiAgICBJdGVyYWJsZTxUeXBlSW5mb3JtYXRpb24+IGluZmVycmVkVGFyZ2V0VHlwZXMgPQogICAgICAgIGluZm8uY29uY3JldGVUYXJnZXRzLm1hcCgoTWVtYmVyRW50aXR5IGVudGl0eSkgewogICAgICByZXR1cm4gaW5mZXJyZXIudHlwZXMuZ2V0SW5mZXJyZWRUeXBlT2ZNZW1iZXIoZW50aXR5KTsKICAgIH0pOwogICAgaWYgKGluZmVycmVkVGFyZ2V0VHlwZXMuYW55KCh1c2VyKSA9PiB1c2VyID09IGN1cnJlbnRVc2VyKSkgewogICAgICBhZGROZXdFc2NhcGVJbmZvcm1hdGlvbihpbmZvKTsKICAgIH0KICB9CgogIC8vLyBDaGVjayB3aGV0aGVyIGVsZW1lbnQgaXMgdGhlIHBhcmFtZXRlciBvZiBhIGxpc3QgYWRkaW5nIG1ldGhvZC4KICAvLy8gVGhlIGRlZmluaXRpb24gb2Ygd2hhdCBhIGxpc3QgYWRkaW5nIG1ldGhvZCBpcyBoYXMgdG8gc3RheSBpbiBzeW5jIHdpdGgKICAvLy8gW21pZ2h0QWRkVG9Db250YWluZXJdLgogIGJvb2wgaXNQYXJhbWV0ZXJPZkxpc3RBZGRpbmdNZXRob2QoUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uIHBhcmFtZXRlckluZm8pIHsKICAgIGlmICghcGFyYW1ldGVySW5mby5pc1JlZ3VsYXJQYXJhbWV0ZXIpIHJldHVybiBmYWxzZTsKICAgIGlmIChwYXJhbWV0ZXJJbmZvLm1ldGhvZC5lbmNsb3NpbmdDbGFzcyAhPQogICAgICAgIGluZmVycmVyLmNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmpzQXJyYXlDbGFzcykgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBTdHJpbmcgbmFtZSA9IHBhcmFtZXRlckluZm8ubWV0aG9kLm5hbWU7CiAgICByZXR1cm4gKG5hbWUgPT0gJ1tdPScpIHx8IChuYW1lID09ICdhZGQnKSB8fCAobmFtZSA9PSAnaW5zZXJ0Jyk7CiAgfQoKICAvLy8gQ2hlY2sgd2hldGhlciBlbGVtZW50IGlzIHRoZSBwYXJhbWV0ZXIgb2YgYSBsaXN0IGFkZGluZyBtZXRob2QuCiAgLy8vIFRoZSBkZWZpbml0aW9uIG9mIHdoYXQgYSBsaXN0IGFkZGluZyBtZXRob2QgaXMgaGFzIHRvIHN0YXkgaW4gc3luYyB3aXRoCiAgLy8vIFtpc0luZGV4U2V0S2V5XSBhbmQgW2lzSW5kZXhTZXRWYWx1ZV0uCiAgYm9vbCBpc1BhcmFtZXRlck9mTWFwQWRkaW5nTWV0aG9kKFBhcmFtZXRlclR5cGVJbmZvcm1hdGlvbiBwYXJhbWV0ZXJJbmZvKSB7CiAgICBpZiAoIXBhcmFtZXRlckluZm8uaXNSZWd1bGFyUGFyYW1ldGVyKSByZXR1cm4gZmFsc2U7CiAgICBpZiAocGFyYW1ldGVySW5mby5tZXRob2QuZW5jbG9zaW5nQ2xhc3MgIT0KICAgICAgICBpbmZlcnJlci5jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5tYXBMaXRlcmFsQ2xhc3MpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgU3RyaW5nIG5hbWUgPSBwYXJhbWV0ZXJJbmZvLm1ldGhvZC5uYW1lOwogICAgcmV0dXJuIChuYW1lID09ICdbXT0nKTsKICB9CgogIGJvb2wgaXNDbG9zdXJlKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBpZiAoIWVsZW1lbnQuaXNGdW5jdGlvbikgcmV0dXJuIGZhbHNlOwoKICAgIC8vLyBDcmVhdGluZyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBbRnVuY3Rpb25dIGFsc28KICAgIC8vLyBjbG9zdXJpemVzIHRoZSBjb3JyZXNwb25kaW5nIFtjYWxsXSBtZW1iZXIuIFdlIGRvIG5vdCBjdXJyZW50bHkKICAgIC8vLyB0cmFjayB0aGVzZSwgdGh1cyB0aGUgY2hlY2sgZm9yIFtpc0Nsb3N1cml6ZWRdIG9uIHN1Y2ggYSBtZXRob2Qgd2lsbAogICAgLy8vIHJldHVybiBmYWxzZS4gSW5zdGVhZCB3ZSBjYXRjaCB0aGF0IGNhc2UgaGVyZSBmb3Igbm93LgogICAgLy8gVE9ETyhoZXJodXQpOiBIYW5kbGUgY3JlYXRpb24gb2YgY2xvc3VyZXMgZnJvbSBpbnN0YW5jZXMgb2YgRnVuY3Rpb24uCiAgICBpZiAoZWxlbWVudC5pc0luc3RhbmNlTWVtYmVyICYmIGVsZW1lbnQubmFtZSA9PSBJZGVudGlmaWVycy5jYWxsKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgQ2xhc3NFbnRpdHkgY2xzID0gZWxlbWVudC5lbmNsb3NpbmdDbGFzczsKICAgIHJldHVybiBjbHMgIT0gbnVsbCAmJiBjbHMuaXNDbG9zdXJlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE1lbWJlclR5cGVJbmZvcm1hdGlvbihNZW1iZXJUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgaWYgKGluZm8uaXNDbG9zdXJpemVkKSB7CiAgICAgIGJhaWxvdXQoJ1JldHVybmVkIGZyb20gYSBjbG9zdXJpemVkIG1ldGhvZCcpOwogICAgfQogICAgaWYgKGlzQ2xvc3VyZShpbmZvLm1lbWJlcikpIHsKICAgICAgYmFpbG91dCgnUmV0dXJuZWQgZnJvbSBhIGNsb3N1cmUnKTsKICAgIH0KICAgIGlmIChpbmZvLm1lbWJlci5pc0ZpZWxkICYmCiAgICAgICAgIWluZmVycmVyLmNhbkZpZWxkQmVVc2VkRm9yR2xvYmFsT3B0aW1pemF0aW9ucyhpbmZvLm1lbWJlcikpIHsKICAgICAgYmFpbG91dCgnRXNjYXBlIHRvIGNvZGUgdGhhdCBoYXMgc3BlY2lhbCBiYWNrZW5kIHRyZWF0bWVudCcpOwogICAgfQogICAgYWRkTmV3RXNjYXBlSW5mb3JtYXRpb24oaW5mbyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uKFBhcmFtZXRlclR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBpZiAoaW5mZXJyZXIuY2xvc2VkV29ybGQubmF0aXZlRGF0YS5pc05hdGl2ZU1lbWJlcihpbmZvLm1ldGhvZCkpIHsKICAgICAgYmFpbG91dCgnUGFzc2VkIHRvIGEgbmF0aXZlIG1ldGhvZCcpOwogICAgfQogICAgaWYgKCFpbmZlcnJlcgogICAgICAgIC5jYW5GdW5jdGlvblBhcmFtZXRlcnNCZVVzZWRGb3JHbG9iYWxPcHRpbWl6YXRpb25zKGluZm8ubWV0aG9kKSkgewogICAgICBiYWlsb3V0KCdFc2NhcGUgdG8gY29kZSB0aGF0IGhhcyBzcGVjaWFsIGJhY2tlbmQgdHJlYXRtZW50Jyk7CiAgICB9CiAgICBpZiAoaXNQYXJhbWV0ZXJPZkxpc3RBZGRpbmdNZXRob2QoaW5mbykgfHwKICAgICAgICBpc1BhcmFtZXRlck9mTWFwQWRkaW5nTWV0aG9kKGluZm8pKSB7CiAgICAgIC8vIFRoZXNlIGVsZW1lbnRzIGFyZSBiZWluZyBoYW5kbGVkIGluCiAgICAgIC8vIFt2aXNpdER5bmFtaWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbl0uCiAgICAgIHJldHVybjsKICAgIH0KICAgIGFkZE5ld0VzY2FwZUluZm9ybWF0aW9uKGluZm8pOwogIH0KfQqCKABOTjwBKwEwJCglHh8gAUQJSBIIDg4SEQEUDRAMDgoBEAkMCw8NDA8RDBESDA4NCQETEhMEAUcSCA4OEhEBFA0QDA4KAQ8JDAsRDA8PBAFHEggODhIRDw0QDAsREwlFCQQBSkEkIQEoTEwBMQFGHT4BQ0s/TAFCUDhJAUJLPUkBSwE0HyEBNyoZGAQBKS1GGCo0FkYIBhIEARNBRykgKzUjDwg4KhsIKDwIKToIJzoIJQYEASAZPAYfBAEMPiUEAQw+SUtMOCUEAQxAIwQBDEgjBAEMLzAjBAEMTCMEAQxERyMEAQxIIwQBDDweBAEMOh0EAQw6HQQBDEUBDE8BDEsBDEMBDCwuAQxLLk8jJQYEATkqGjMNNjQ4L04tTUkODAwKBgQBNigZMg01NDgvKS1MSA4MDAoGBAE2KBkyDTU0OC8pLUxIDgwMCgYEAU82J0IuNy5BIUUoSAYSBAFMLi0oQSwEAVA5JjwoBAFPPEo+KAQBRiouH0wRCggGBAEMLC0vHkAkIzsiD08/MggGAS4eQCRPIA9ALAgGASxJJQYBQyEtRCdFJg9OUVBPTVBRUCkBUSk5OAgGAR4fLT4kDzk4CAYBJS1EJw8sOQgGATwiMCkGATQ5PQhCJQYEAUZOHU85LzwUBi1FBAFGTi1OOS8/FAYtHAQBKSsBSEhNP01IEwYuKQQBDEAdNAYiKgYfR0QGIwQBDEZHLAYSS0QGLy4tMA4GIwQCAS5wYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci9ub2RlX3RyYWNlci5kYXJ0M3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2VtaXR0ZXIvbW9kZWwuZGFydMAAT5ovLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLm5ld19qc19lbWl0dGVyLm1vZGVsOwoKaW1wb3J0ICcuLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnIHNob3cgQ29uc3RhbnRWYWx1ZTsKaW1wb3J0ICcuLi9kZWZlcnJlZF9sb2FkLmRhcnQnIHNob3cgT3V0cHV0VW5pdDsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBhcyBqcyBzaG93IEV4cHJlc3Npb24sIE5hbWUsIFN0YXRlbWVudCwgVG9rZW5GaW5hbGl6ZXI7CmltcG9ydCAnLi4vanMvanNfZGVidWcuZGFydCcgYXMganMgc2hvdyBub2RlVG9TdHJpbmc7CmltcG9ydCAnanNfZW1pdHRlci5kYXJ0JyBzaG93IE1ldGFkYXRhQ29sbGVjdG9yOwoKY2xhc3MgUHJvZ3JhbSB7CiAgZmluYWwgTGlzdDxGcmFnbWVudD4gZnJhZ21lbnRzOwogIGZpbmFsIExpc3Q8SG9sZGVyPiBob2xkZXJzOwogIGZpbmFsIGJvb2wgb3V0cHV0Q29udGFpbnNDb25zdGFudExpc3Q7CiAgZmluYWwgYm9vbCBuZWVkc05hdGl2ZVN1cHBvcnQ7CiAgZmluYWwgYm9vbCBoYXNTb2Z0RGVmZXJyZWRDbGFzc2VzOwoKICAvLy8gQSBtYXAgZnJvbSBsb2FkIGlkIHRvIHRoZSBsaXN0IG9mIGZyYWdtZW50cyB0aGF0IG5lZWQgdG8gYmUgbG9hZGVkLgogIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8RnJhZ21lbnQ+PiBsb2FkTWFwOwoKICAvLyBJZiB0aGlzIGZpZWxkIGlzIG5vdCBgbnVsbGAgdGhlbiBpdHMgdmFsdWUgbXVzdCBiZSBlbWl0dGVkIGluIHRoZSBlbWJlZGRlZAogIC8vIGdsb2JhbCBgVFlQRV9UT19JTlRFUkNFUFRPUl9NQVBgLiBUaGUgbWFwIHJlZmVyZW5jZXMgY29uc3RhbnRzIGFuZCBjbGFzc2VzLgogIGZpbmFsIGpzLkV4cHJlc3Npb24gdHlwZVRvSW50ZXJjZXB0b3JNYXA7CgogIC8vIFRPRE8oZmxvaXRzY2gpOiB3ZSBzaG91bGQgc3RvcmUgdGhlIG1ldGFkYXRhIGRpcmVjdGx5IGluc3RlYWQgb2Ygc3RvcmluZwogIC8vIHRoZSBjb2xsZWN0b3IuIEhvd2V2ZXIsIHRoZSBvbGQgZW1pdHRlciBzdGlsbCB1cGRhdGVzIHRoZSBkYXRhLgogIGZpbmFsIE1ldGFkYXRhQ29sbGVjdG9yIF9tZXRhZGF0YUNvbGxlY3RvcjsKICBmaW5hbCBJdGVyYWJsZTxqcy5Ub2tlbkZpbmFsaXplcj4gZmluYWxpemVyczsKCiAgUHJvZ3JhbSh0aGlzLmZyYWdtZW50cywgdGhpcy5ob2xkZXJzLCB0aGlzLmxvYWRNYXAsIHRoaXMudHlwZVRvSW50ZXJjZXB0b3JNYXAsCiAgICAgIHRoaXMuX21ldGFkYXRhQ29sbGVjdG9yLCB0aGlzLmZpbmFsaXplcnMsCiAgICAgIHt0aGlzLm5lZWRzTmF0aXZlU3VwcG9ydCwKICAgICAgdGhpcy5vdXRwdXRDb250YWluc0NvbnN0YW50TGlzdCwKICAgICAgdGhpcy5oYXNTb2Z0RGVmZXJyZWRDbGFzc2VzfSkgewogICAgYXNzZXJ0KG5lZWRzTmF0aXZlU3VwcG9ydCAhPSBudWxsKTsKICAgIGFzc2VydChvdXRwdXRDb250YWluc0NvbnN0YW50TGlzdCAhPSBudWxsKTsKICB9CgogIC8vLyBBY2Nlc3NvciBmb3IgdGhlIGxpc3Qgb2YgbWV0YWRhdGEgZW50cmllcyBmb3IgYSBnaXZlbiBbT3V0cHV0VW5pdF0uCiAgLy8vCiAgLy8vIFRoZXJlIGlzIG9uZSBsaXN0IGZvciBlYWNoIG91dHB1dCB1bml0LiBUaGUgbGlzdCBiZWxvbmdpbmcgdG8gdGhlIG1haW4KICAvLy8gdW5pdCBtdXN0IGJlIGVtaXR0ZWQgaW4gdGhlIGBNRVRBREFUQWAgZW1iZWRkZWQgZ2xvYmFsLgogIC8vLyBUaGUgbGlzdCByZWZlcmVuY2VzIGNvbnN0YW50cyBhbmQgbXVzdCBoZW5jZSBiZSBlbWl0dGVkIGFmdGVyIGNvbnN0YW50cwogIC8vLyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuCiAgLy8vCiAgLy8vIE5vdGU6IHRoZSBtZXRhZGF0YSBpcyBkZXJpdmVkIGZyb20gdGhlIHRhc2sncyBgbWV0YWRhdGFDb2xsZWN0b3JgLiBUaGUKICAvLy8gbGlzdCBtdXN0IG5vdCBiZSBlbWl0dGVkIGJlZm9yZSBhbGwgb3BlcmF0aW9ucyBvbiBpdCBhcmUgZG9uZS4gRm9yCiAgLy8vIGV4YW1wbGUsIHRoZSBvbGQgZW1pdHRlciBnZW5lcmF0ZXMgbWV0YWRhdGEgd2hlbiBlbWl0dGluZyByZWZsZWN0aW9uCiAgLy8vIGRhdGEuCiAganMuRXhwcmVzc2lvbiBtZXRhZGF0YUZvck91dHB1dFVuaXQoT3V0cHV0VW5pdCB1bml0KSB7CiAgICByZXR1cm4gX21ldGFkYXRhQ29sbGVjdG9yLmdldE1ldGFkYXRhRm9yT3V0cHV0VW5pdCh1bml0KTsKICB9CgogIC8vLyBBY2Nlc3NvciBmb3IgdGhlIGxpc3Qgb2YgdHlwZSBlbnRyaWVzIGZvciBhIGdpdmVuIFtPdXRwdXRVbml0XS4KICAvLy8KICAvLy8gVGhlcmUgaXMgb25lIGxpc3QgZm9yIGVhY2ggb3V0cHV0IHVuaXQuIFRoZSBsaXN0IGJlbG9uZ2luZyB0byB0aGUgbWFpbgogIC8vLyB1bml0IG11c3QgYmUgZW1pdHRlZCBpbiB0aGUgYFRZUEVTYCBlbWJlZGRlZCBnbG9iYWwuIFRoZSBsaXN0IHJlZmVyZW5jZXMKICAvLy8gY29uc3RhbnRzIGFuZCBtdXN0IGhlbmNlIGJlIGVtaXR0ZWQgYWZ0ZXIgY29uc3RhbnRzIGhhdmUgYmVlbiBpbml0aWFsaXplZC4KICAvLy8KICAvLy8gTm90ZTogdGhlIG1ldGFkYXRhIGlzIGRlcml2ZWQgZnJvbSB0aGUgdGFzaydzIGBtZXRhZGF0YUNvbGxlY3RvcmAuIFRoZQogIC8vLyBsaXN0IGlzIG9ubHkgYSBwbGFjZWhvbGRlciBhbmQgd2lsbCBiZSBmaWxsZWQgaW4gb25jZSBtZXRhZGF0YSBjb2xsZWN0aW9uCiAgLy8vIGlzIGZpbmFsaXplZC4KICBqcy5FeHByZXNzaW9uIG1ldGFkYXRhVHlwZXNGb3JPdXRwdXRVbml0KE91dHB1dFVuaXQgdW5pdCkgewogICAgcmV0dXJuIF9tZXRhZGF0YUNvbGxlY3Rvci5nZXRUeXBlc0Zvck91dHB1dFVuaXQodW5pdCk7CiAgfQoKICBib29sIGdldCBpc1NwbGl0ID0+IGZyYWdtZW50cy5sZW5ndGggPiAxOwogIEl0ZXJhYmxlPEZyYWdtZW50PiBnZXQgZGVmZXJyZWRGcmFnbWVudHMgPT4gZnJhZ21lbnRzLnNraXAoMSk7CiAgRnJhZ21lbnQgZ2V0IG1haW5GcmFnbWVudCA9PiBmcmFnbWVudHMuZmlyc3Q7Cn0KCi8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBKYXZhU2NyaXB0IG9iamVjdCB0aGF0IGNvbnRhaW5zIHN0YXRpYyBzdGF0ZSwgbGlrZQovLy8gY2xhc3NlcyBvciBmdW5jdGlvbnMuCmNsYXNzIEhvbGRlciB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgZmluYWwgaW50IGluZGV4OwogIGZpbmFsIGJvb2wgaXNTdGF0aWNTdGF0ZUhvbGRlcjsKICBmaW5hbCBib29sIGlzQ29uc3RhbnRzSG9sZGVyOwoKICBIb2xkZXIodGhpcy5uYW1lLCB0aGlzLmluZGV4LAogICAgICB7dGhpcy5pc1N0YXRpY1N0YXRlSG9sZGVyOiBmYWxzZSwgdGhpcy5pc0NvbnN0YW50c0hvbGRlcjogZmFsc2V9KTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICdIb2xkZXIobmFtZT0ke25hbWV9KSc7CiAgfQp9CgovLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIG9uZSBvdXRwdXQgZmlsZS4KLy8vCi8vLyBJZiBubyBsaWJyYXJ5IGlzIGRlZmVycmVkLCB0aGVyZSBpcyBvbmx5IG9uZSBbRnJhZ21lbnRdIG9mIHR5cGUKLy8vIFtNYWluRnJhZ21lbnRdLgphYnN0cmFjdCBjbGFzcyBGcmFnbWVudCB7CiAgLy8vIFRoZSBvdXRwdXRVbml0IHNob3VsZCBvbmx5IGJlIHVzZWQgZHVyaW5nIHRoZSB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgbW9kZWwuCiAgLy8vIFVzZXMgaW5kaWNhdGUgbWlzc2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgbW9kZWwuCiAgZmluYWwgT3V0cHV0VW5pdCBvdXRwdXRVbml0OwoKICBmaW5hbCBMaXN0PExpYnJhcnk+IGxpYnJhcmllczsKICBmaW5hbCBMaXN0PENvbnN0YW50PiBjb25zdGFudHM7CiAgLy8gVE9ETyhmbG9pdHNjaCk6IHNob3VsZCB3ZSBtb3ZlIHN0YXRpYyBmaWVsZHMgaW50byBsaWJyYXJpZXMgb3IgY2xhc3Nlcz8KICBmaW5hbCBMaXN0PFN0YXRpY0ZpZWxkPiBzdGF0aWNOb25GaW5hbEZpZWxkczsKICAvLyBUT0RPKGZsb2l0c2NoKTogbGF6eSBmaWVsZHMgc2hvdWxkIGJlIGluIHRoZWlyIGxpYnJhcnkgb3IgZXZlbiBjbGFzcy4KICBmaW5hbCBMaXN0PFN0YXRpY0ZpZWxkPiBzdGF0aWNMYXppbHlJbml0aWFsaXplZEZpZWxkczsKCiAgLy8vIE91dHB1dCBmaWxlIG5hbWUgd2l0aG91dCBleHRlbnNpb24uCiAgZmluYWwgU3RyaW5nIG91dHB1dEZpbGVOYW1lOwoKICBGcmFnbWVudCgKICAgICAgdGhpcy5vdXRwdXRVbml0LAogICAgICB0aGlzLm91dHB1dEZpbGVOYW1lLAogICAgICB0aGlzLmxpYnJhcmllcywKICAgICAgdGhpcy5zdGF0aWNOb25GaW5hbEZpZWxkcywKICAgICAgdGhpcy5zdGF0aWNMYXppbHlJbml0aWFsaXplZEZpZWxkcywKICAgICAgdGhpcy5jb25zdGFudHMpOwoKICBib29sIGdldCBpc01haW5GcmFnbWVudDsKfQoKLy8vIFRoZSBtYWluIG91dHB1dCBmaWxlLgovLy8KLy8vIFRoaXMgY29kZSBlbWl0dGVkIGZyb20gdGhpcyBbRnJhZ21lbnRdIG11c3QgYmUgbG9hZGVkIGZpcnN0LiBJdCBjYW4gdGhlbiBsb2FkCi8vLyBvdGhlciBbRGVmZXJyZWRGcmFnbWVudF1zLgpjbGFzcyBNYWluRnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7CiAgZmluYWwganMuU3RhdGVtZW50IGludm9rZU1haW47CgogIE1haW5GcmFnbWVudCgKICAgICAgT3V0cHV0VW5pdCBvdXRwdXRVbml0LAogICAgICBTdHJpbmcgb3V0cHV0RmlsZU5hbWUsCiAgICAgIHRoaXMuaW52b2tlTWFpbiwKICAgICAgTGlzdDxMaWJyYXJ5PiBsaWJyYXJpZXMsCiAgICAgIExpc3Q8U3RhdGljRmllbGQ+IHN0YXRpY05vbkZpbmFsRmllbGRzLAogICAgICBMaXN0PFN0YXRpY0ZpZWxkPiBzdGF0aWNMYXppbHlJbml0aWFsaXplZEZpZWxkcywKICAgICAgTGlzdDxDb25zdGFudD4gY29uc3RhbnRzKQogICAgICA6IHN1cGVyKG91dHB1dFVuaXQsIG91dHB1dEZpbGVOYW1lLCBsaWJyYXJpZXMsIHN0YXRpY05vbkZpbmFsRmllbGRzLAogICAgICAgICAgICBzdGF0aWNMYXppbHlJbml0aWFsaXplZEZpZWxkcywgY29uc3RhbnRzKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNNYWluRnJhZ21lbnQgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICdNYWluRnJhZ21lbnQoKSc7CiAgfQp9CgovLy8gQW4gb3V0cHV0IChmaWxlKSBmb3IgZGVmZXJyZWQgY29kZS4KY2xhc3MgRGVmZXJyZWRGcmFnbWVudCBleHRlbmRzIEZyYWdtZW50IHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgRGVmZXJyZWRGcmFnbWVudCgKICAgICAgT3V0cHV0VW5pdCBvdXRwdXRVbml0LAogICAgICBTdHJpbmcgb3V0cHV0RmlsZU5hbWUsCiAgICAgIHRoaXMubmFtZSwKICAgICAgTGlzdDxMaWJyYXJ5PiBsaWJyYXJpZXMsCiAgICAgIExpc3Q8U3RhdGljRmllbGQ+IHN0YXRpY05vbkZpbmFsRmllbGRzLAogICAgICBMaXN0PFN0YXRpY0ZpZWxkPiBzdGF0aWNMYXppbHlJbml0aWFsaXplZEZpZWxkcywKICAgICAgTGlzdDxDb25zdGFudD4gY29uc3RhbnRzKQogICAgICA6IHN1cGVyKG91dHB1dFVuaXQsIG91dHB1dEZpbGVOYW1lLCBsaWJyYXJpZXMsIHN0YXRpY05vbkZpbmFsRmllbGRzLAogICAgICAgICAgICBzdGF0aWNMYXppbHlJbml0aWFsaXplZEZpZWxkcywgY29uc3RhbnRzKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNNYWluRnJhZ21lbnQgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnRGVmZXJyZWRGcmFnbWVudChuYW1lPSR7bmFtZX0pJzsKICB9Cn0KCmNsYXNzIENvbnN0YW50IHsKICBmaW5hbCBqcy5OYW1lIG5hbWU7CiAgZmluYWwgSG9sZGVyIGhvbGRlcjsKICBmaW5hbCBDb25zdGFudFZhbHVlIHZhbHVlOwoKICBDb25zdGFudCh0aGlzLm5hbWUsIHRoaXMuaG9sZGVyLCB0aGlzLnZhbHVlKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICdDb25zdGFudChuYW1lPSR7bmFtZS5rZXl9LHZhbHVlPSR7dmFsdWUudG9TdHJ1Y3R1cmVkVGV4dCgpfSknOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgRmllbGRDb250YWluZXIgewogIExpc3Q8RmllbGQ+IGdldCBzdGF0aWNGaWVsZHNGb3JSZWZsZWN0aW9uOwp9CgpjbGFzcyBMaWJyYXJ5IGltcGxlbWVudHMgRmllbGRDb250YWluZXIgewogIC8vLyBUaGUgZWxlbWVudCBzaG91bGQgb25seSBiZSB1c2VkIGR1cmluZyB0aGUgdHJhbnNpdGlvbiB0byB0aGUgbmV3IG1vZGVsLgogIC8vLyBVc2VzIGluZGljYXRlIG1pc3NpbmcgaW5mb3JtYXRpb24gaW4gdGhlIG1vZGVsLgogIGZpbmFsIExpYnJhcnlFbnRpdHkgZWxlbWVudDsKCiAgZmluYWwgU3RyaW5nIHVyaTsKICBmaW5hbCBMaXN0PFN0YXRpY01ldGhvZD4gc3RhdGljczsKICBmaW5hbCBMaXN0PENsYXNzPiBjbGFzc2VzOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBMaXN0PEZpZWxkPiBzdGF0aWNGaWVsZHNGb3JSZWZsZWN0aW9uOwoKICBMaWJyYXJ5KHRoaXMuZWxlbWVudCwgdGhpcy51cmksIHRoaXMuc3RhdGljcywgdGhpcy5jbGFzc2VzLAogICAgICB0aGlzLnN0YXRpY0ZpZWxkc0ZvclJlZmxlY3Rpb24pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gJ0xpYnJhcnkodXJpPSR7dXJpfSxlbGVtZW50PSR7ZWxlbWVudH0pJzsKICB9Cn0KCmNsYXNzIFN0YXRpY0ZpZWxkIHsKICAvLy8gVGhlIGVsZW1lbnQgc2hvdWxkIG9ubHkgYmUgdXNlZCBkdXJpbmcgdGhlIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBtb2RlbC4KICAvLy8gVXNlcyBpbmRpY2F0ZSBtaXNzaW5nIGluZm9ybWF0aW9uIGluIHRoZSBtb2RlbC4KICBmaW5hbCBGaWVsZEVudGl0eSBlbGVtZW50OwoKICBmaW5hbCBqcy5OYW1lIG5hbWU7CiAgZmluYWwganMuTmFtZSBnZXR0ZXJOYW1lOwogIC8vIFRPRE8oZmxvaXRzY2gpOiB0aGUgaG9sZGVyIGZvciBzdGF0aWMgZmllbGRzIGlzIHRoZSBpc29sYXRlIG9iamVjdC4gV2UKICAvLyBjb3VsZCByZW1vdmUgdGhpcyBmaWVsZCBhbmQgdXNlIHRoZSBpc29sYXRlIG9iamVjdCBkaXJlY3RseS4KICBmaW5hbCBIb2xkZXIgaG9sZGVyOwogIGZpbmFsIGpzLkV4cHJlc3Npb24gY29kZTsKICBmaW5hbCBib29sIGlzRmluYWw7CiAgZmluYWwgYm9vbCBpc0xhenk7CiAgZmluYWwgYm9vbCBpc0luaXRpYWxpemVkQnlDb25zdGFudDsKCiAgU3RhdGljRmllbGQodGhpcy5lbGVtZW50LCB0aGlzLm5hbWUsIHRoaXMuZ2V0dGVyTmFtZSwgdGhpcy5ob2xkZXIsIHRoaXMuY29kZSwKICAgICAge3RoaXMuaXNGaW5hbCwgdGhpcy5pc0xhenksIHRoaXMuaXNJbml0aWFsaXplZEJ5Q29uc3RhbnQ6IGZhbHNlfSk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnU3RhdGljRmllbGQobmFtZT0ke25hbWUua2V5fSxlbGVtZW50PSR7ZWxlbWVudH0pJzsKICB9Cn0KCmNsYXNzIENsYXNzIGltcGxlbWVudHMgRmllbGRDb250YWluZXIgewogIC8vLyBUaGUgZWxlbWVudCBzaG91bGQgb25seSBiZSB1c2VkIGR1cmluZyB0aGUgdHJhbnNpdGlvbiB0byB0aGUgbmV3IG1vZGVsLgogIC8vLyBVc2VzIGluZGljYXRlIG1pc3NpbmcgaW5mb3JtYXRpb24gaW4gdGhlIG1vZGVsLgogIGZpbmFsIENsYXNzRW50aXR5IGVsZW1lbnQ7CgogIGZpbmFsIGpzLk5hbWUgbmFtZTsKICBmaW5hbCBIb2xkZXIgaG9sZGVyOwogIENsYXNzIF9zdXBlcmNsYXNzOwogIENsYXNzIF9taXhpbkNsYXNzOwogIGZpbmFsIExpc3Q8TWV0aG9kPiBtZXRob2RzOwogIGZpbmFsIExpc3Q8RmllbGQ+IGZpZWxkczsKICBmaW5hbCBMaXN0PFN0dWJNZXRob2Q+IGlzQ2hlY2tzOwogIGZpbmFsIExpc3Q8U3R1Yk1ldGhvZD4gY2hlY2tlZFNldHRlcnM7CgogIC8vLyBTdHViIG1ldGhvZHMgZm9yIHRoaXMgY2xhc3MgdGhhdCBhcmUgY2FsbCBzdHVicyBmb3IgZ2V0dGVycy4KICBmaW5hbCBMaXN0PFN0dWJNZXRob2Q+IGNhbGxTdHViczsKCiAgLy8vIG5vU3VjaE1ldGhvZCBzdHVicyBpbiB0aGUgc3BlY2lhbCBjYXNlIHRoYXQgdGhlIGNsYXNzIGlzIE9iamVjdC4KICBmaW5hbCBMaXN0PFN0dWJNZXRob2Q+IG5vU3VjaE1ldGhvZFN0dWJzOwogIEBvdmVycmlkZQogIGZpbmFsIExpc3Q8RmllbGQ+IHN0YXRpY0ZpZWxkc0ZvclJlZmxlY3Rpb247CiAgZmluYWwgYm9vbCBoYXNSdGlGaWVsZDsgLy8gUGVyLWluc3RhbmNlIHJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbiBwc2V1ZG8tZmllbGQuCiAgZmluYWwgYm9vbCBvbmx5Rm9yUnRpOwogIGZpbmFsIGJvb2wgaXNEaXJlY3RseUluc3RhbnRpYXRlZDsKICBmaW5hbCBib29sIGlzTmF0aXZlOwogIGZpbmFsIGJvb2wgaXNDbG9zdXJlQmFzZUNsYXNzOyAvLyBDb21tb24gYmFzZSBjbGFzcyBmb3IgY2xvc3VyZXMuCgogIC8vLyBXaGV0aGVyIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHNvZnQgZGVmZXJyZWQuCiAgLy8vCiAgLy8vIEEgc29mdC1kZWZlcnJlZCBjbGFzcyBpcyBvbmx5IGZ1bGx5IGluaXRpYWxpemVkIGF0IGZpcnN0IGluc3RhbnRpYXRpb24uCiAgZmluYWwgYm9vbCBpc1NvZnREZWZlcnJlZDsKCiAgZmluYWwgYm9vbCBpc1N1cGVyTWl4aW5BcHBsaWNhdGlvbjsKCiAgLy8gSWYgdGhlIGNsYXNzIGltcGxlbWVudHMgYSBmdW5jdGlvbiB0eXBlLCBhbmQgdGhlIHR5cGUgaXMgZW5jb2RlZCBpbiB0aGUKICAvLyBtZXRhdGFkYSB0YWJsZSwgdGhlbiB0aGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBpbmRleCBpbnRvIHRoYXQgZmllbGQuCiAgZmluYWwganMuRXhwcmVzc2lvbiBmdW5jdGlvblR5cGVJbmRleDsKCiAgLy8vIFdoZXRoZXIgdGhlIGNsYXNzIG11c3QgYmUgZXZhbHVhdGVkIGVhZ2VybHkuCiAgYm9vbCBpc0VhZ2VyID0gZmFsc2U7CgogIC8vLyBMZWFmIHRhZ3MuIFNlZSBbTmF0aXZlRW1pdHRlci5wcmVwYXJlTmF0aXZlQ2xhc3Nlc10uCiAgTGlzdDxTdHJpbmc+IG5hdGl2ZUxlYWZUYWdzOwoKICAvLy8gTm9uLWxlYWYgdGFncy4gU2VlIFtOYXRpdmVFbWl0dGVyLnByZXBhcmVOYXRpdmVDbGFzc2VzXS4KICBMaXN0PFN0cmluZz4gbmF0aXZlTm9uTGVhZlRhZ3M7CgogIC8vLyBOYXRpdmUgZXh0ZW5zaW9ucy4gU2VlIFtOYXRpdmVFbWl0dGVyLnByZXBhcmVOYXRpdmVDbGFzc2VzXS4KICBMaXN0PENsYXNzPiBuYXRpdmVFeHRlbnNpb25zOwoKICBDbGFzcygKICAgICAgdGhpcy5lbGVtZW50LAogICAgICB0aGlzLm5hbWUsCiAgICAgIHRoaXMuaG9sZGVyLAogICAgICB0aGlzLm1ldGhvZHMsCiAgICAgIHRoaXMuZmllbGRzLAogICAgICB0aGlzLnN0YXRpY0ZpZWxkc0ZvclJlZmxlY3Rpb24sCiAgICAgIHRoaXMuY2FsbFN0dWJzLAogICAgICB0aGlzLm5vU3VjaE1ldGhvZFN0dWJzLAogICAgICB0aGlzLmNoZWNrZWRTZXR0ZXJzLAogICAgICB0aGlzLmlzQ2hlY2tzLAogICAgICB0aGlzLmZ1bmN0aW9uVHlwZUluZGV4LAogICAgICB7dGhpcy5oYXNSdGlGaWVsZCwKICAgICAgdGhpcy5vbmx5Rm9yUnRpLAogICAgICB0aGlzLmlzRGlyZWN0bHlJbnN0YW50aWF0ZWQsCiAgICAgIHRoaXMuaXNOYXRpdmUsCiAgICAgIHRoaXMuaXNDbG9zdXJlQmFzZUNsYXNzLAogICAgICB0aGlzLmlzU29mdERlZmVycmVkID0gZmFsc2UsCiAgICAgIHRoaXMuaXNTdXBlck1peGluQXBwbGljYXRpb259KSB7CiAgICBhc3NlcnQob25seUZvclJ0aSAhPSBudWxsKTsKICAgIGFzc2VydChpc0RpcmVjdGx5SW5zdGFudGlhdGVkICE9IG51bGwpOwogICAgYXNzZXJ0KGlzTmF0aXZlICE9IG51bGwpOwogICAgYXNzZXJ0KGlzQ2xvc3VyZUJhc2VDbGFzcyAhPSBudWxsKTsKICB9CgogIGJvb2wgZ2V0IGlzU2ltcGxlTWl4aW5BcHBsaWNhdGlvbiA9PiBmYWxzZTsKCiAgQ2xhc3MgZ2V0IHN1cGVyY2xhc3MgPT4gX3N1cGVyY2xhc3M7CgogIHZvaWQgc2V0U3VwZXJjbGFzcyhDbGFzcyBzdXBlcmNsYXNzKSB7CiAgICBfc3VwZXJjbGFzcyA9IHN1cGVyY2xhc3M7CiAgfQoKICBDbGFzcyBnZXQgbWl4aW5DbGFzcyA9PiBfbWl4aW5DbGFzczsKCiAgdm9pZCBzZXRNaXhpbkNsYXNzKENsYXNzIG1peGluQ2xhc3MpIHsKICAgIF9taXhpbkNsYXNzID0gbWl4aW5DbGFzczsKICB9CgogIGpzLk5hbWUgZ2V0IHN1cGVyY2xhc3NOYW1lID0+IHN1cGVyY2xhc3MgPT0gbnVsbCA/IG51bGwgOiBzdXBlcmNsYXNzLm5hbWU7CgogIGludCBnZXQgc3VwZXJjbGFzc0hvbGRlckluZGV4ID0+CiAgICAgIChzdXBlcmNsYXNzID09IG51bGwpID8gMCA6IHN1cGVyY2xhc3MuaG9sZGVyLmluZGV4OwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnQ2xhc3MobmFtZT0ke25hbWUua2V5fSxlbGVtZW50PSRlbGVtZW50KSc7Cn0KCmNsYXNzIE1peGluQXBwbGljYXRpb24gZXh0ZW5kcyBDbGFzcyB7CiAgTWl4aW5BcHBsaWNhdGlvbigKICAgICAgQ2xhc3NFbnRpdHkgZWxlbWVudCwKICAgICAganMuTmFtZSBuYW1lLAogICAgICBIb2xkZXIgaG9sZGVyLAogICAgICBMaXN0PEZpZWxkPiBpbnN0YW5jZUZpZWxkcywKICAgICAgTGlzdDxGaWVsZD4gc3RhdGljRmllbGRzRm9yUmVmbGVjdGlvbiwKICAgICAgTGlzdDxTdHViTWV0aG9kPiBjYWxsU3R1YnMsCiAgICAgIExpc3Q8U3R1Yk1ldGhvZD4gY2hlY2tlZFNldHRlcnMsCiAgICAgIExpc3Q8U3R1Yk1ldGhvZD4gaXNDaGVja3MsCiAgICAgIGpzLkV4cHJlc3Npb24gZnVuY3Rpb25UeXBlSW5kZXgsCiAgICAgIHtib29sIGhhc1J0aUZpZWxkLAogICAgICBib29sIG9ubHlGb3JSdGksCiAgICAgIGJvb2wgaXNEaXJlY3RseUluc3RhbnRpYXRlZH0pCiAgICAgIDogc3VwZXIoCiAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgIGhvbGRlciwKICAgICAgICAgICAgY29uc3QgPE1ldGhvZD5bXSwKICAgICAgICAgICAgaW5zdGFuY2VGaWVsZHMsCiAgICAgICAgICAgIHN0YXRpY0ZpZWxkc0ZvclJlZmxlY3Rpb24sCiAgICAgICAgICAgIGNhbGxTdHVicywKICAgICAgICAgICAgY29uc3QgPFN0dWJNZXRob2Q+W10sCiAgICAgICAgICAgIGNoZWNrZWRTZXR0ZXJzLAogICAgICAgICAgICBpc0NoZWNrcywKICAgICAgICAgICAgZnVuY3Rpb25UeXBlSW5kZXgsCiAgICAgICAgICAgIGhhc1J0aUZpZWxkOiBoYXNSdGlGaWVsZCwKICAgICAgICAgICAgb25seUZvclJ0aTogb25seUZvclJ0aSwKICAgICAgICAgICAgaXNEaXJlY3RseUluc3RhbnRpYXRlZDogaXNEaXJlY3RseUluc3RhbnRpYXRlZCwKICAgICAgICAgICAgaXNOYXRpdmU6IGZhbHNlLAogICAgICAgICAgICBpc0Nsb3N1cmVCYXNlQ2xhc3M6IGZhbHNlLAogICAgICAgICAgICBpc1N1cGVyTWl4aW5BcHBsaWNhdGlvbjogZmFsc2UpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1NpbXBsZU1peGluQXBwbGljYXRpb24gPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ01peGluKG5hbWU9JHtuYW1lLmtleX0sZWxlbWVudD0kZWxlbWVudCknOwp9CgovLy8gQSBmaWVsZC4KLy8vCi8vLyBJbiBnZW5lcmFsIHJlcHJlc2VudHMgYW4gaW5zdGFuY2UgZmllbGQsIGJ1dCBmb3IgcmVmbGVjdGlvbiBtYXkgYWxzbwovLy8gcmVwcmVzZW50IHN0YXRpYyBmaWVsZHMuCmNsYXNzIEZpZWxkIHsKICAvLy8gVGhlIGVsZW1lbnQgc2hvdWxkIG9ubHkgYmUgdXNlZCBkdXJpbmcgdGhlIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBtb2RlbC4KICAvLy8gVXNlcyBpbmRpY2F0ZSBtaXNzaW5nIGluZm9ybWF0aW9uIGluIHRoZSBtb2RlbC4KICBmaW5hbCBGaWVsZEVudGl0eSBlbGVtZW50OwoKICBmaW5hbCBqcy5OYW1lIG5hbWU7CiAgZmluYWwganMuTmFtZSBhY2Nlc3Nvck5hbWU7CgogIC8vLyAwMDogRG9lcyBub3QgbmVlZCBhbnkgZ2V0dGVyLgogIC8vLyAwMTogIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5maWVsZDsgfQogIC8vLyAxMDogIGZ1bmN0aW9uKHJlY2VpdmVyKSB7IHJldHVybiByZWNlaXZlci5maWVsZDsgfQogIC8vLyAxMTogIGZ1bmN0aW9uKHJlY2VpdmVyKSB7IHJldHVybiB0aGlzLmZpZWxkOyB9CiAgZmluYWwgaW50IGdldHRlckZsYWdzOwoKICAvLy8gMDA6IERvZXMgbm90IG5lZWQgYW55IHNldHRlci4KICAvLy8gMDE6ICBmdW5jdGlvbih2YWx1ZSkgeyB0aGlzLmZpZWxkID0gdmFsdWU7IH0KICAvLy8gMTA6ICBmdW5jdGlvbihyZWNlaXZlciwgdmFsdWUpIHsgcmVjZWl2ZXIuZmllbGQgPSB2YWx1ZTsgfQogIC8vLyAxMTogIGZ1bmN0aW9uKHJlY2VpdmVyLCB2YWx1ZSkgeyB0aGlzLmZpZWxkID0gdmFsdWU7IH0KICBmaW5hbCBpbnQgc2V0dGVyRmxhZ3M7CgogIGZpbmFsIGJvb2wgbmVlZHNDaGVja2VkU2V0dGVyOwoKICBmaW5hbCBDb25zdGFudFZhbHVlIGluaXRpYWxpemVySW5BbGxvY2F0b3I7CgogIGZpbmFsIENvbnN0YW50VmFsdWUgY29uc3RhbnRWYWx1ZTsKCiAgZmluYWwgYm9vbCBpc0VsaWRlZDsKCiAgLy8gVE9ETyhmbG9pdHNjaCk6IHN1cHBvcnQgcmVuYW1lZCBmaWVsZHMuCiAgRmllbGQoCiAgICAgIHRoaXMuZWxlbWVudCwKICAgICAgdGhpcy5uYW1lLAogICAgICB0aGlzLmFjY2Vzc29yTmFtZSwKICAgICAgdGhpcy5nZXR0ZXJGbGFncywKICAgICAgdGhpcy5zZXR0ZXJGbGFncywKICAgICAgdGhpcy5uZWVkc0NoZWNrZWRTZXR0ZXIsCiAgICAgIHRoaXMuaW5pdGlhbGl6ZXJJbkFsbG9jYXRvciwKICAgICAgdGhpcy5jb25zdGFudFZhbHVlLAogICAgICB0aGlzLmlzRWxpZGVkKTsKCiAgYm9vbCBnZXQgbmVlZHNHZXR0ZXIgPT4gZ2V0dGVyRmxhZ3MgIT0gMDsKICBib29sIGdldCBuZWVkc1VuY2hlY2tlZFNldHRlciA9PiBzZXR0ZXJGbGFncyAhPSAwOwoKICBib29sIGdldCBuZWVkc0ludGVyY2VwdGVkR2V0dGVyID0+IGdldHRlckZsYWdzID4gMTsKICBib29sIGdldCBuZWVkc0ludGVyY2VwdGVkU2V0dGVyID0+IHNldHRlckZsYWdzID4gMTsKCiAgYm9vbCBnZXQgbmVlZHNJbnRlcmNlcHRlZEdldHRlck9uUmVjZWl2ZXIgPT4gZ2V0dGVyRmxhZ3MgPT0gMjsKICBib29sIGdldCBuZWVkc0ludGVyY2VwdGVkU2V0dGVyT25SZWNlaXZlciA9PiBzZXR0ZXJGbGFncyA9PSAyOwoKICBib29sIGdldCBuZWVkc0ludGVyY2VwdGVkR2V0dGVyT25UaGlzID0+IGdldHRlckZsYWdzID09IDM7CiAgYm9vbCBnZXQgbmVlZHNJbnRlcmNlcHRlZFNldHRlck9uVGhpcyA9PiBzZXR0ZXJGbGFncyA9PSAzOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gJ0ZpZWxkKG5hbWU9JHtuYW1lLmtleX0sZWxlbWVudD0ke2VsZW1lbnR9KSc7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBNZXRob2QgewogIC8vLyBUaGUgZWxlbWVudCBzaG91bGQgb25seSBiZSB1c2VkIGR1cmluZyB0aGUgdHJhbnNpdGlvbiB0byB0aGUgbmV3IG1vZGVsLgogIC8vLyBVc2VzIGluZGljYXRlIG1pc3NpbmcgaW5mb3JtYXRpb24gaW4gdGhlIG1vZGVsLgogIGZpbmFsIE1lbWJlckVudGl0eSBlbGVtZW50OwoKICAvLy8gVGhlIG5hbWUgb2YgdGhlIG1ldGhvZC4gSWYgdGhlIG1ldGhvZCBpcyBhIFtQYXJhbWV0ZXJTdHViTWV0aG9kXSBmb3IgYQogIC8vLyBzdGF0aWMgZnVuY3Rpb24sIHRoZW4gdGhlIG5hbWUgY2FuIGJlIGBudWxsYC4gSW4gdGhhdCBjYXNlLCBvbmx5IHRoZQogIC8vLyBbUGFyYW1ldGVyU3R1Yk1ldGhvZC5jYWxsTmFtZV0gc2hvdWxkIGJlIHVzZWQuCiAgZmluYWwganMuTmFtZSBuYW1lOwogIGZpbmFsIGpzLkV4cHJlc3Npb24gY29kZTsKCiAgTWV0aG9kKHRoaXMuZWxlbWVudCwgdGhpcy5uYW1lLCB0aGlzLmNvZGUpOwp9CgovLy8gQSBtZXRob2QgdGhhdCBjb3JyZXNwb25kcyB0byBhIG1ldGhvZCBpbiB0aGUgb3JpZ2luYWwgRGFydCBwcm9ncmFtLgphYnN0cmFjdCBjbGFzcyBEYXJ0TWV0aG9kIGV4dGVuZHMgTWV0aG9kIHsKICBmaW5hbCBib29sIG5lZWRzVGVhck9mZjsKICBmaW5hbCBqcy5OYW1lIHRlYXJPZmZOYW1lOwogIGZpbmFsIExpc3Q8UGFyYW1ldGVyU3R1Yk1ldGhvZD4gcGFyYW1ldGVyU3R1YnM7CiAgZmluYWwgYm9vbCBjYW5CZUFwcGxpZWQ7CiAgZmluYWwgaW50IGFwcGx5SW5kZXg7CgogIC8vIElzIG5vbi1udWxsIGlmIFtuZWVkc1RlYXJPZmZdLgogIC8vCiAgLy8gSWYgdGhlIHR5cGUgaXMgZW5jb2RlZCBpbiB0aGUgbWV0YWRhdGEgdGFibGUgdGhpcyBmaWVsZCBjb250YWlucyBhbiBpbmRleAogIC8vIGludG8gdGhlIHRhYmxlLiBPdGhlcndpc2UgdGhlIHR5cGUgY29udGFpbnMgdHlwZSB2YXJpYWJsZXMgaW4gd2hpY2ggY2FzZQogIC8vIHRoaXMgZmllbGQgaG9sZHMgYSBmdW5jdGlvbiBjb21wdXRpbmcgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZS4KICBmaW5hbCBqcy5FeHByZXNzaW9uIGZ1bmN0aW9uVHlwZTsKCiAgLy8gU2lnbmF0dXJlIGluZm9ybWF0aW9uIGZvciB0aGlzIG1ldGhvZC4gW29wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlc10gaXMKICAvLyBvbmx5IHJlcXVpcmVkIGFuZCBzdG9yZWQgaGVyZSBpZiB0aGUgbWV0aG9kIFtjYW5CZUFwcGxpZWRdLiBUaGUgY291bnQgaXMKICAvLyBhbHdheXMgc3RvcmVkIHRvIGhlbHAgc2VsZWN0IHNwZWNpYWxpemVkIHRlYXItb2ZmIHBhdGhzLgogIGZpbmFsIGludCByZXF1aXJlZFBhcmFtZXRlckNvdW50OwogIGZpbmFsIC8qIE1hcCB8IExpc3QgKi8gb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzOwoKICAvLyBJZiB0aGlzIG1ldGhvZCBjYW4gYmUgdG9ybiBvZmYsIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nCiAgLy8gY2FsbCBtZXRob2QuIEZvciBleGFtcGxlLCBmb3IgdGhlIG1lbWJlciBgZm9vJDEkbmFtZWAgaXQgd291bGQgYmUKICAvLyBgY2FsbCQxJG5hbWVgIChpbiB1bm1pbmlmaWVkIG1vZGUpLgogIGZpbmFsIGpzLk5hbWUgY2FsbE5hbWU7CgogIERhcnRNZXRob2QoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCwganMuTmFtZSBuYW1lLCBqcy5FeHByZXNzaW9uIGNvZGUsCiAgICAgIHRoaXMucGFyYW1ldGVyU3R1YnMsIHRoaXMuY2FsbE5hbWUsCiAgICAgIHt0aGlzLm5lZWRzVGVhck9mZiwKICAgICAgdGhpcy50ZWFyT2ZmTmFtZSwKICAgICAgdGhpcy5jYW5CZUFwcGxpZWQsCiAgICAgIHRoaXMucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwKICAgICAgdGhpcy5vcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMsCiAgICAgIHRoaXMuZnVuY3Rpb25UeXBlLAogICAgICB0aGlzLmFwcGx5SW5kZXh9KQogICAgICA6IHN1cGVyKGVsZW1lbnQsIG5hbWUsIGNvZGUpIHsKICAgIGFzc2VydChuZWVkc1RlYXJPZmYgIT0gbnVsbCk7CiAgICBhc3NlcnQoIW5lZWRzVGVhck9mZiB8fCB0ZWFyT2ZmTmFtZSAhPSBudWxsKTsKICAgIGFzc2VydChjYW5CZUFwcGxpZWQgIT0gbnVsbCk7CiAgICBhc3NlcnQoIWNhbkJlQXBwbGllZCB8fAogICAgICAgIChyZXF1aXJlZFBhcmFtZXRlckNvdW50ICE9IG51bGwgJiYKICAgICAgICAgICAgb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzICE9IG51bGwpKTsKICB9CgogIGJvb2wgZ2V0IGlzU3RhdGljOwp9CgpjbGFzcyBJbnN0YW5jZU1ldGhvZCBleHRlbmRzIERhcnRNZXRob2QgewogIC8vLyBBbiBhbHRlcm5hdGl2ZSBuYW1lIGZvciB0aGlzIG1ldGhvZC4gVGhpcyBpcyB1c2VkIHRvIG1vZGVsIGNhbGxzIHRvCiAgLy8vIGEgbWV0aG9kIHZpYSBgc3VwZXJgLiBJZiBbYWxpYXNOYW1lXSBpcyBub24tbnVsbCwgdGhlIGVtaXR0ZXIgaGFzIHRvCiAgLy8vIGVuc3VyZSB0aGF0IHRoaXMgbWV0aG9kIGlzIHJlZ2lzdGVyZWQgb24gdGhlIHByb3RvdHlwZSB1bmRlciBib3RoIFtuYW1lXQogIC8vLyBhbmQgW2FsaWFzTmFtZV0uCiAgZmluYWwganMuTmFtZSBhbGlhc05hbWU7CgogIC8vLyBUcnVlIGlmIHRoaXMgaXMgdGhlIGltcGxpY2l0IGBjYWxsYCBpbnN0YW5jZSBtZXRob2Qgb2YgYW4gYW5vbnltb3VzCiAgLy8vIGNsb3N1cmUuIFRoaXMgcHJlZGljYXRlIGlzIGZhbHNlIGZvciBleHBsaWNpdCBgY2FsbGAgbWV0aG9kcyBhbmQgZm9yCiAgLy8vIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB0b3JuIG9mZi4KICBmaW5hbCBib29sIGlzQ2xvc3VyZUNhbGxNZXRob2Q7CgogIC8vLyBUcnVlIGlmIHRoZSBpbnRlcmNlcHRvciBjYWxsaW5nIGNvbnZlbnRpb24gaXMgdXNlZCBmb3IgdGhpcyBtZXRob2QuCiAgZmluYWwgYm9vbCBpc0ludGVyY2VwdGVkOwoKICAvLy8gTmFtZSBjYWxsZWQgdmlhIHRoZSBnZW5lcmFsICdjYXRjaCBhbGwnIHBhdGggb2YgRnVuY3Rpb24uYXBwbHkuCiAgLy8vZmluYWwganMuTmFtZSBhcHBseU5hbWU7CgogIEluc3RhbmNlTWV0aG9kKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQsIGpzLk5hbWUgbmFtZSwganMuRXhwcmVzc2lvbiBjb2RlLAogICAgICBMaXN0PFBhcmFtZXRlclN0dWJNZXRob2Q+IHBhcmFtZXRlclN0dWJzLCBqcy5OYW1lIGNhbGxOYW1lLAogICAgICB7Ym9vbCBuZWVkc1RlYXJPZmYsCiAgICAgIGpzLk5hbWUgdGVhck9mZk5hbWUsCiAgICAgIHRoaXMuYWxpYXNOYW1lLAogICAgICBib29sIGNhbkJlQXBwbGllZCwKICAgICAgaW50IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgIC8qIExpc3QgfCBNYXAgKi8gb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzLAogICAgICB0aGlzLmlzQ2xvc3VyZUNhbGxNZXRob2QsCiAgICAgIHRoaXMuaXNJbnRlcmNlcHRlZCwKICAgICAganMuRXhwcmVzc2lvbiBmdW5jdGlvblR5cGUsCiAgICAgIGludCBhcHBseUluZGV4fSkKICAgICAgOiBzdXBlcihlbGVtZW50LCBuYW1lLCBjb2RlLCBwYXJhbWV0ZXJTdHVicywgY2FsbE5hbWUsCiAgICAgICAgICAgIG5lZWRzVGVhck9mZjogbmVlZHNUZWFyT2ZmLAogICAgICAgICAgICB0ZWFyT2ZmTmFtZTogdGVhck9mZk5hbWUsCiAgICAgICAgICAgIGNhbkJlQXBwbGllZDogY2FuQmVBcHBsaWVkLAogICAgICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiByZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgICAgICBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXM6IG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcywKICAgICAgICAgICAgZnVuY3Rpb25UeXBlOiBmdW5jdGlvblR5cGUsCiAgICAgICAgICAgIGFwcGx5SW5kZXg6IGFwcGx5SW5kZXgpIHsKICAgIGFzc2VydChpc0Nsb3N1cmVDYWxsTWV0aG9kICE9IG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNTdGF0aWMgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnSW5zdGFuY2VNZXRob2QobmFtZT0ke25hbWUua2V5fSxlbGVtZW50PSR7ZWxlbWVudH0nCiAgICAgICAgJyxjb2RlPSR7anMubm9kZVRvU3RyaW5nKGNvZGUpfSknOwogIH0KfQoKLy8vIEEgbWV0aG9kIHRoYXQgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBiYWNrZW5kIGFuZCBoYXMgbm90IGRpcmVjdCBjb3JyZXNwb25kZW5jZQovLy8gdG8gYSBtZXRob2QgaW4gdGhlIG9yaWdpbmFsIERhcnQgcHJvZ3JhbS4gRXhhbXBsZXMgYXJlIGdldHRlciBhbmQgc2V0dGVyCi8vLyBzdHVicyBhbmQgc3R1YnMgdG8gZGlzcGF0Y2ggY2FsbHMgdG8gbWV0aG9kcyB3aXRoIG9wdGlvbmFsIHBhcmFtZXRlcnMuCmNsYXNzIFN0dWJNZXRob2QgZXh0ZW5kcyBNZXRob2QgewogIFN0dWJNZXRob2QoanMuTmFtZSBuYW1lLCBqcy5FeHByZXNzaW9uIGNvZGUsIHtNZW1iZXJFbnRpdHkgZWxlbWVudH0pCiAgICAgIDogc3VwZXIoZWxlbWVudCwgbmFtZSwgY29kZSk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnU3R1Yk1ldGhvZChuYW1lPSR7bmFtZS5rZXl9LGVsZW1lbnQ9JHtlbGVtZW50fScKICAgICAgICAnLGNvZGU9JHtqcy5ub2RlVG9TdHJpbmcoY29kZSl9KSc7CiAgfQp9CgovLy8gQSBzdHViIHRoYXQgYWRhcHRzIGFuZCByZWRpcmVjdHMgdG8gdGhlIG1haW4gbWV0aG9kICh0aGUgb25lIGNvbnRhaW5pbmcpCi8vLyB0aGUgYWN0dWFsIGNvZGUuCi8vLwovLy8gRm9yIGV4YW1wbGUsIGdpdmVuIGEgbWV0aG9kIGBmb28kMih4LCBbeTogNDk5XSlgIGEgcG9zc2libGUgcGFyYW1ldGVyCi8vLyBzdHViLW1ldGhvZCBjb3VsZCBiZSBgZm9vJDEoeCkgPT4gZm9vJDIoeCwgNDk5KWAuCi8vLwovLy8gUGFyYW1ldGVyU3R1Yk1ldGhvZHMgYXJlIGFsd2F5cyBhdHRhY2hlZCB0byAoc3RhdGljIG9yIGluc3RhbmNlKSBtZXRob2RzLgpjbGFzcyBQYXJhbWV0ZXJTdHViTWV0aG9kIGV4dGVuZHMgU3R1Yk1ldGhvZCB7CiAgLy8vIFRoZSBgY2FsbGAgbmFtZSBvZiB0aGlzIHN0dWIuCiAgLy8vCiAgLy8vIFdoZW4gYW4gaW5zdGFuY2UgbWV0aG9kIGlzIHRvcm4gb2ZmLCBpdCBpcyBpbnZva2VkIGFzIGEgYGNhbGxgIG1lbWJlciBhbmQKICAvLy8gbm90IGl0J3Mgb3JpZ2luYWwgbmFtZSBhbnltb3JlLiBUaGUgW2NhbGxOYW1lXSBwcm92aWRlcyB0aGUgc3R1YidzCiAgLy8vIG5hbWUgd2hlbiBpdCBpcyB1c2VkIHRoaXMgd2F5LgogIC8vLwogIC8vLyBJZiBhIHN0dWIncyBtZW1iZXIgY2FuIG5vdCBiZSB0b3JuIG9mZiwgdGhlIFtjYWxsTmFtZV0gaXMgYG51bGxgLgogIGpzLk5hbWUgY2FsbE5hbWU7CgogIFBhcmFtZXRlclN0dWJNZXRob2QoanMuTmFtZSBuYW1lLCB0aGlzLmNhbGxOYW1lLCBqcy5FeHByZXNzaW9uIGNvZGUsCiAgICAgIHtNZW1iZXJFbnRpdHkgZWxlbWVudH0pCiAgICAgIDogc3VwZXIobmFtZSwgY29kZSwgZWxlbWVudDogZWxlbWVudCk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnUGFyYW1ldGVyU3R1Yk1ldGhvZChuYW1lPSR7bmFtZS5rZXl9LCBjYWxsTmFtZT0ke2NhbGxOYW1lPy5rZXl9JwogICAgICAgICcsIGVsZW1lbnQ9JHtlbGVtZW50fScKICAgICAgICAnLCBjb2RlPSR7anMubm9kZVRvU3RyaW5nKGNvZGUpfSknOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgU3RhdGljTWV0aG9kIGltcGxlbWVudHMgTWV0aG9kIHsKICBIb2xkZXIgZ2V0IGhvbGRlcjsKfQoKY2xhc3MgU3RhdGljRGFydE1ldGhvZCBleHRlbmRzIERhcnRNZXRob2QgaW1wbGVtZW50cyBTdGF0aWNNZXRob2QgewogIEBvdmVycmlkZQogIGZpbmFsIEhvbGRlciBob2xkZXI7CgogIFN0YXRpY0RhcnRNZXRob2QoCiAgICAgIEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQsCiAgICAgIGpzLk5hbWUgbmFtZSwKICAgICAgdGhpcy5ob2xkZXIsCiAgICAgIGpzLkV4cHJlc3Npb24gY29kZSwKICAgICAgTGlzdDxQYXJhbWV0ZXJTdHViTWV0aG9kPiBwYXJhbWV0ZXJTdHVicywKICAgICAganMuTmFtZSBjYWxsTmFtZSwKICAgICAge2Jvb2wgbmVlZHNUZWFyT2ZmLAogICAgICBqcy5OYW1lIHRlYXJPZmZOYW1lLAogICAgICBib29sIGNhbkJlQXBwbGllZCwKICAgICAgaW50IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgIC8qIExpc3QgfCBNYXAgKi8gb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzLAogICAgICBqcy5FeHByZXNzaW9uIGZ1bmN0aW9uVHlwZSwKICAgICAgaW50IGFwcGx5SW5kZXh9KQogICAgICA6IHN1cGVyKGVsZW1lbnQsIG5hbWUsIGNvZGUsIHBhcmFtZXRlclN0dWJzLCBjYWxsTmFtZSwKICAgICAgICAgICAgbmVlZHNUZWFyT2ZmOiBuZWVkc1RlYXJPZmYsCiAgICAgICAgICAgIHRlYXJPZmZOYW1lOiB0ZWFyT2ZmTmFtZSwKICAgICAgICAgICAgY2FuQmVBcHBsaWVkOiBjYW5CZUFwcGxpZWQsCiAgICAgICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgICAgIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlczogb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzLAogICAgICAgICAgICBmdW5jdGlvblR5cGU6IGZ1bmN0aW9uVHlwZSwKICAgICAgICAgICAgYXBwbHlJbmRleDogYXBwbHlJbmRleCk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU3RhdGljID0+IHRydWU7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnU3RhdGljRGFydE1ldGhvZChuYW1lPSR7bmFtZS5rZXl9LGVsZW1lbnQ9JHtlbGVtZW50fScKICAgICAgICAnLGNvZGU9JHtqcy5ub2RlVG9TdHJpbmcoY29kZSl9KSc7CiAgfQp9CgpjbGFzcyBTdGF0aWNTdHViTWV0aG9kIGV4dGVuZHMgU3R1Yk1ldGhvZCBpbXBsZW1lbnRzIFN0YXRpY01ldGhvZCB7CiAgQG92ZXJyaWRlCiAgSG9sZGVyIGhvbGRlcjsKICBTdGF0aWNTdHViTWV0aG9kKGpzLk5hbWUgbmFtZSwgdGhpcy5ob2xkZXIsIGpzLkV4cHJlc3Npb24gY29kZSkKICAgICAgOiBzdXBlcihuYW1lLCBjb2RlKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICdTdGF0aWNTdHViTWV0aG9kKG5hbWU9JHtuYW1lLmtleX0sZWxlbWVudD0ke2VsZW1lbnR9fScKICAgICAgICAnLGNvZGU9JHtqcy5ub2RlVG9TdHJpbmcoY29kZSl9KSc7CiAgfQp9CoKEAE5OPAEmATYwJE82MQEQIh4pISUBSi0BUFEsAU5FLjABUTAgJyYoMAQBSgZNPk4dBk1JSww5PgQBRgZNT1EGTVAUPjsEASxBMAIBTxoPFRMiIAEgSQEMFiMEAgErBEQUGlE2HwEhIk0wSzkBKh8BDBcbFiEqFwEbAgEaBFIfJiEBEB0dFx8uNyBLNwEMIwEMFh0EAgEoKhUBFB0dER8uNyBLNwEMJAEMFi0EAgERFhcdATABDBZLBAIBIC0CASpONh8BFCQdAQwvAT4nAQwWNQQCARRONh0BFhxMQhccFhUmAVBJAQwWPwQCAShONh0BFhcVFR4cIykBQyQBRywML1EZJRdEATIGTh0BJgFNSSkBMxgBOx8BPyIBQyABCRQRExQTJhYeGxUeGRcjFR8jJyAsHigEAS4BJwEpHgQBJwEpHgQBTQEjOgEMQwIBJxQbFBUiLSInIScZFyQPFRIUHhwnFyIcFh8mJDwdJy0BDC0BDEMCAQ0ESR0OTjYdARYeASQtOTUZASQzQT0ZASEBLgElARcBLQkUERkYGB8jGhYBLDUBNjYBQUEBPT0BDBY5BAIBGE42HgFNSzUWHAEuAgFIKxsdMhsYASQFT05DJAFQTj4kOQFMRykaAUcqGhgZIysZGCUiMiIcKzYEARUCASpKS08XGwFKSyYiAUocAUYeAUtCGhsWGSI3IBoiFz0oJig8TCgmKQQBDB4BDBZAKwQCAVBNSyJHJAEMFjwrBAIBTRUESjYETi8kBlBJJQZIFAFHHi0BDBZNHywEAgEwFQIBRAwXARQeFBMaMBgaGxkiNyIXPSgmKDxMKCUBDB0BDBZCKwQCAUQMEUIbAQwWQysEAgEqcGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9tb2RlbC5kYXJ0TXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2VtaXR0ZXIvcHJvZ3JhbV9idWlsZGVyL3Byb2dyYW1fYnVpbGRlci5kYXJ0wAC2rC8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuanNfZW1pdHRlci5wcm9ncmFtX2J1aWxkZXI7CgppbXBvcnQgJ2RhcnQ6aW8nOwppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBqc29uRGVjb2RlOwoKaW1wb3J0ICcuLi8uLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vLi4vY29tbW9uL25hbWVzLmRhcnQnIHNob3cgTmFtZXMsIFNlbGVjdG9yczsKaW1wb3J0ICcuLi8uLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnCiAgICBzaG93IENvbnN0YW50VmFsdWUsIEludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZTsKaW1wb3J0ICcuLi8uLi9jb21tb25fZWxlbWVudHMuZGFydCcgc2hvdyBKQ29tbW9uRWxlbWVudHMsIEpFbGVtZW50RW52aXJvbm1lbnQ7CmltcG9ydCAnLi4vLi4vZGVmZXJyZWRfbG9hZC5kYXJ0JwogICAgc2hvdyBkZWZlcnJlZFBhcnRGaWxlTmFtZSwgT3V0cHV0VW5pdCwgT3V0cHV0VW5pdERhdGE7CmltcG9ydCAnLi4vLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vLi4vaW8vc291cmNlX2luZm9ybWF0aW9uLmRhcnQnOwppbXBvcnQgJy4uLy4uL2pzL2pzLmRhcnQnIGFzIGpzOwppbXBvcnQgJy4uLy4uL2pzX2JhY2tlbmQvZmllbGRfYW5hbHlzaXMuZGFydCcKICAgIHNob3cgRmllbGRBbmFseXNpc0RhdGEsIEpGaWVsZEFuYWx5c2lzOwppbXBvcnQgJy4uLy4uL2pzX2JhY2tlbmQvYmFja2VuZC5kYXJ0JyBzaG93IFN1cGVyTWVtYmVyRGF0YTsKaW1wb3J0ICcuLi8uLi9qc19iYWNrZW5kL2JhY2tlbmRfdXNhZ2UuZGFydCc7CmltcG9ydCAnLi4vLi4vanNfYmFja2VuZC9jb25zdGFudF9oYW5kbGVyX2phdmFzY3JpcHQuZGFydCcKICAgIHNob3cgSmF2YVNjcmlwdENvbnN0YW50Q29tcGlsZXI7CmltcG9ydCAnLi4vLi4vanNfYmFja2VuZC9jdXN0b21fZWxlbWVudHNfYW5hbHlzaXMuZGFydCc7CmltcG9ydCAnLi4vLi4vanNfYmFja2VuZC9pbmZlcnJlZF9kYXRhLmRhcnQnOwppbXBvcnQgJy4uLy4uL2pzX2JhY2tlbmQvaW50ZXJjZXB0b3JfZGF0YS5kYXJ0JzsKaW1wb3J0ICcuLi8uLi9qc19iYWNrZW5kL25hbWVyLmRhcnQnIHNob3cgTmFtZXIsIFN0cmluZ0JhY2tlZE5hbWU7CmltcG9ydCAnLi4vLi4vanNfYmFja2VuZC9uYXRpdmVfZGF0YS5kYXJ0JzsKaW1wb3J0ICcuLi8uLi9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXMuZGFydCcKICAgIHNob3cgUnVudGltZVR5cGVzQ2hlY2tzLCBSdW50aW1lVHlwZXNOZWVkLCBSdW50aW1lVHlwZXNFbmNvZGVyOwppbXBvcnQgJy4uLy4uL2pzX21vZGVsL2VsZW1lbnRzLmRhcnQnIHNob3cgSkdlbmVyYXRvckJvZHksIEpTaWduYXR1cmVNZXRob2Q7CmltcG9ydCAnLi4vLi4vbmF0aXZlL2VucXVldWUuZGFydCcgc2hvdyBOYXRpdmVDb2RlZ2VuRW5xdWV1ZXI7CmltcG9ydCAnLi4vLi4vb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi8uLi91bml2ZXJzZS9jb2RlZ2VuX3dvcmxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCcgc2hvdyBTZWxlY3RvcjsKaW1wb3J0ICcuLi8uLi91bml2ZXJzZS93b3JsZF9idWlsZGVyLmRhcnQnIHNob3cgU2VsZWN0b3JDb25zdHJhaW50czsKaW1wb3J0ICcuLi8uLi93b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKaW1wb3J0ICcuLi9qc19lbWl0dGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgQ2xhc3NTdHViR2VuZXJhdG9yLAogICAgICAgIENvZGVFbWl0dGVyVGFzaywKICAgICAgICBFbWl0dGVyLAogICAgICAgIEluc3RhbnRpYXRpb25TdHViR2VuZXJhdG9yLAogICAgICAgIEludGVyY2VwdG9yU3R1YkdlbmVyYXRvciwKICAgICAgICBNYWluQ2FsbFN0dWJHZW5lcmF0b3IsCiAgICAgICAgUGFyYW1ldGVyU3R1YkdlbmVyYXRvciwKICAgICAgICBSdW50aW1lVHlwZUdlbmVyYXRvciwKICAgICAgICBUeXBlVGVzdFByb3BlcnRpZXM7CmltcG9ydCAnLi4vbW9kZWwuZGFydCc7CmltcG9ydCAnLi4vc29ydGVyLmRhcnQnOwoKcGFydCAnY29sbGVjdG9yLmRhcnQnOwpwYXJ0ICdmaWVsZF92aXNpdG9yLmRhcnQnOwpwYXJ0ICdyZWdpc3RyeS5kYXJ0JzsKCi8vLyBCdWlsZHMgYSBzZWxmLWNvbnRhaW5lZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvZ3JhbSB0aGF0IGNhbiB0aGVuIGJlCi8vLyBlbWl0dGVkIG1vcmUgZWFzaWx5IGJ5IHRoZSBpbmRpdmlkdWFsIGVtaXR0ZXJzLgpjbGFzcyBQcm9ncmFtQnVpbGRlciB7CiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwogIGZpbmFsIERpYWdub3N0aWNSZXBvcnRlciBfcmVwb3J0ZXI7CiAgZmluYWwgSkVsZW1lbnRFbnZpcm9ubWVudCBfZWxlbWVudEVudmlyb25tZW50OwogIGZpbmFsIEpDb21tb25FbGVtZW50cyBfY29tbW9uRWxlbWVudHM7CiAgZmluYWwgT3V0cHV0VW5pdERhdGEgX291dHB1dFVuaXREYXRhOwogIGZpbmFsIENvZGVnZW5Xb3JsZEJ1aWxkZXIgX3dvcmxkQnVpbGRlcjsKICBmaW5hbCBOYXRpdmVDb2RlZ2VuRW5xdWV1ZXIgX25hdGl2ZUNvZGVnZW5FbnF1ZXVlcjsKICBmaW5hbCBCYWNrZW5kVXNhZ2UgX2JhY2tlbmRVc2FnZTsKICBmaW5hbCBKYXZhU2NyaXB0Q29uc3RhbnRDb21waWxlciBfY29uc3RhbnRIYW5kbGVyOwogIGZpbmFsIE5hdGl2ZURhdGEgX25hdGl2ZURhdGE7CiAgZmluYWwgUnVudGltZVR5cGVzTmVlZCBfcnRpTmVlZDsKICBmaW5hbCBJbnRlcmNlcHRvckRhdGEgX2ludGVyY2VwdG9yRGF0YTsKICBmaW5hbCBTdXBlck1lbWJlckRhdGEgX3N1cGVyTWVtYmVyRGF0YTsKICBmaW5hbCBSdW50aW1lVHlwZXNDaGVja3MgX3J0aUNoZWNrczsKICBmaW5hbCBSdW50aW1lVHlwZXNFbmNvZGVyIF9ydGlFbmNvZGVyOwogIGZpbmFsIE9uZVNob3RJbnRlcmNlcHRvckRhdGEgX29uZVNob3RJbnRlcmNlcHRvckRhdGE7CiAgZmluYWwgQ3VzdG9tRWxlbWVudHNDb2RlZ2VuQW5hbHlzaXMgX2N1c3RvbUVsZW1lbnRzQ29kZWdlbkFuYWx5c2lzOwogIGZpbmFsIE1hcDxNZW1iZXJFbnRpdHksIGpzLkV4cHJlc3Npb24+IF9nZW5lcmF0ZWRDb2RlOwogIGZpbmFsIE5hbWVyIF9uYW1lcjsKICBmaW5hbCBDb2RlRW1pdHRlclRhc2sgX3Rhc2s7CiAgZmluYWwgSkNsb3NlZFdvcmxkIF9jbG9zZWRXb3JsZDsKICBmaW5hbCBKRmllbGRBbmFseXNpcyBfZmllbGRBbmFseXNpczsKICBmaW5hbCBJbmZlcnJlZERhdGEgX2luZmVycmVkRGF0YTsKICBmaW5hbCBTb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5IF9zb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5OwoKICAvLy8gVGhlIFtTb3J0ZXJdIHVzZWQgZm9yIG9yZGVyaW5nIGVsZW1lbnRzIGluIHRoZSBnZW5lcmF0ZWQgSmF2YVNjcmlwdC4KICBmaW5hbCBTb3J0ZXIgX3NvcnRlcjsKCiAgLy8vIENvbnRhaW5zIHRoZSBjb2xsZWN0ZWQgaW5mb3JtYXRpb24gdGhlIHByb2dyYW0gYnVpbGRlciB1c2VkIHRvIGJ1aWxkCiAgLy8vIHRoZSBtb2RlbC4KICAvLyBUaGUgY29sbGVjdG9yIHdpbGwgYmUgZmlsbGVkIG9uIHRoZSBmaXJzdCBjYWxsIHRvIGBidWlsZFByb2dyYW1gLgogIC8vIEl0IGlzIHB1YmxpY2x5IGV4cG9zZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBOZXcgY29kZQogIC8vIChhbmQgaW4gcGFydGljdWxhciBuZXcgZW1pdHRlcnMpIHNob3VsZCBub3QgYWNjZXNzIGl0IG91dHNpZGUgdGhpcyBjbGFzcy4KICBmaW5hbCBDb2xsZWN0b3IgY29sbGVjdG9yOwoKICBmaW5hbCBSZWdpc3RyeSBfcmVnaXN0cnk7CgogIGZpbmFsIEZ1bmN0aW9uRW50aXR5IF9tYWluRnVuY3Rpb247CiAgZmluYWwgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IF9ydGlOZWVkZWRDbGFzc2VzOwoKICAvLy8gVHJ1ZSBpZiB0aGUgcHJvZ3JhbSBzaG91bGQgc3RvcmUgZnVuY3Rpb24gdHlwZXMgaW4gdGhlIG1ldGFkYXRhLgogIGJvb2wgX3N0b3JlRnVuY3Rpb25UeXBlc0luTWV0YWRhdGEgPSBmYWxzZTsKCiAgUHJvZ3JhbUJ1aWxkZXIoCiAgICAgIHRoaXMuX29wdGlvbnMsCiAgICAgIHRoaXMuX3JlcG9ydGVyLAogICAgICB0aGlzLl9lbGVtZW50RW52aXJvbm1lbnQsCiAgICAgIHRoaXMuX2NvbW1vbkVsZW1lbnRzLAogICAgICB0aGlzLl9vdXRwdXRVbml0RGF0YSwKICAgICAgdGhpcy5fd29ybGRCdWlsZGVyLAogICAgICB0aGlzLl9uYXRpdmVDb2RlZ2VuRW5xdWV1ZXIsCiAgICAgIHRoaXMuX2JhY2tlbmRVc2FnZSwKICAgICAgdGhpcy5fY29uc3RhbnRIYW5kbGVyLAogICAgICB0aGlzLl9uYXRpdmVEYXRhLAogICAgICB0aGlzLl9ydGlOZWVkLAogICAgICB0aGlzLl9pbnRlcmNlcHRvckRhdGEsCiAgICAgIHRoaXMuX3N1cGVyTWVtYmVyRGF0YSwKICAgICAgdGhpcy5fcnRpQ2hlY2tzLAogICAgICB0aGlzLl9ydGlFbmNvZGVyLAogICAgICB0aGlzLl9vbmVTaG90SW50ZXJjZXB0b3JEYXRhLAogICAgICB0aGlzLl9jdXN0b21FbGVtZW50c0NvZGVnZW5BbmFseXNpcywKICAgICAgdGhpcy5fZ2VuZXJhdGVkQ29kZSwKICAgICAgdGhpcy5fbmFtZXIsCiAgICAgIHRoaXMuX3Rhc2ssCiAgICAgIHRoaXMuX2Nsb3NlZFdvcmxkLAogICAgICB0aGlzLl9maWVsZEFuYWx5c2lzLAogICAgICB0aGlzLl9pbmZlcnJlZERhdGEsCiAgICAgIHRoaXMuX3NvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3ksCiAgICAgIHRoaXMuX3NvcnRlciwKICAgICAgdGhpcy5fcnRpTmVlZGVkQ2xhc3NlcywKICAgICAgdGhpcy5fbWFpbkZ1bmN0aW9uKQogICAgICA6IHRoaXMuY29sbGVjdG9yID0gbmV3IENvbGxlY3RvcigKICAgICAgICAgICAgX29wdGlvbnMsCiAgICAgICAgICAgIF9jb21tb25FbGVtZW50cywKICAgICAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgICAgICAgX291dHB1dFVuaXREYXRhLAogICAgICAgICAgICBfd29ybGRCdWlsZGVyLAogICAgICAgICAgICBfbmFtZXIsCiAgICAgICAgICAgIF90YXNrLmVtaXR0ZXIsCiAgICAgICAgICAgIF9jb25zdGFudEhhbmRsZXIsCiAgICAgICAgICAgIF9uYXRpdmVEYXRhLAogICAgICAgICAgICBfaW50ZXJjZXB0b3JEYXRhLAogICAgICAgICAgICBfb25lU2hvdEludGVyY2VwdG9yRGF0YSwKICAgICAgICAgICAgX2Nsb3NlZFdvcmxkLAogICAgICAgICAgICBfcnRpTmVlZGVkQ2xhc3NlcywKICAgICAgICAgICAgX2dlbmVyYXRlZENvZGUsCiAgICAgICAgICAgIF9zb3J0ZXIpLAogICAgICAgIHRoaXMuX3JlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5KF9vdXRwdXRVbml0RGF0YS5tYWluT3V0cHV0VW5pdCwgX3NvcnRlcik7CgogIC8vLyBNYXBwaW5nIGZyb20gW0NsYXNzRW50aXR5XSB0byBjb25zdHJ1Y3RlZCBbQ2xhc3NdLiBXZSBuZWVkIHRoaXMgdG8KICAvLy8gdXBkYXRlIHRoZSBzdXBlcmNsYXNzIGluIHRoZSBbQ2xhc3NdLgogIGZpbmFsIE1hcDxDbGFzc0VudGl0eSwgQ2xhc3M+IF9jbGFzc2VzID0gPENsYXNzRW50aXR5LCBDbGFzcz57fTsKCiAgLy8vIE1hcHBpbmcgZnJvbSBbT3V0cHV0VW5pdF0gdG8gY29uc3RydWN0ZWQgW0ZyYWdtZW50XS4gV2UgbmVlZCB0aGlzIHRvCiAgLy8vIGdlbmVyYXRlIHRoZSBkZWZlcnJlZExvYWRpbmdNYXAgKHRvIGtub3cgd2hpY2ggaHVua3MgdG8gbG9hZCkuCiAgZmluYWwgTWFwPE91dHB1dFVuaXQsIEZyYWdtZW50PiBfb3V0cHV0cyA9IDxPdXRwdXRVbml0LCBGcmFnbWVudD57fTsKCiAgLy8vIE1hcHBpbmcgZnJvbSBbQ29uc3RhbnRWYWx1ZV0gdG8gY29uc3RydWN0ZWQgW0NvbnN0YW50XS4gV2UgbmVlZCB0aGlzIHRvCiAgLy8vIHVwZGF0ZSBmaWVsZC1pbml0aWFsaXplcnMgdG8gcG9pbnQgdG8gdGhlIENvbnN0YW50TW9kZWwuCiAgZmluYWwgTWFwPENvbnN0YW50VmFsdWUsIENvbnN0YW50PiBfY29uc3RhbnRzID0gPENvbnN0YW50VmFsdWUsIENvbnN0YW50Pnt9OwoKICBTZXQ8Q2xhc3M+IF91bm5lZWRlZE5hdGl2ZUNsYXNzZXM7CgogIC8vLyBDbGFzc2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCBkdXJpbmcgYSBwcm9maWxlIHJ1bi4KICAvLy8KICAvLy8gVGhlc2UgY2xhc3NlcyBzaG91bGQgbm90IGJlIHNvZnQtZGVmZXJyZWQuCiAgLy8vCiAgLy8vIEFsc28gY29udGFpbnMgY2xhc3NlcyB0aGF0IGFyZSBub3QgdHJhY2tlZCBieSB0aGUgcHJvZmlsZSBydW4gKGxpa2UKICAvLy8gaW50ZXJjZXB0b3JzLCAuLi4pLgogIFNldDxDbGFzc0VudGl0eT4gX25vdFNvZnREZWZlcnJlZDsKCiAgUHJvZ3JhbSBidWlsZFByb2dyYW0oe2Jvb2wgc3RvcmVGdW5jdGlvblR5cGVzSW5NZXRhZGF0YTogZmFsc2V9KSB7CiAgICBjb2xsZWN0b3IuY29sbGVjdCgpOwogICAgX2luaXRpYWxpemVTb2Z0RGVmZXJyZWRNYXAoKTsKCiAgICB0aGlzLl9zdG9yZUZ1bmN0aW9uVHlwZXNJbk1ldGFkYXRhID0gc3RvcmVGdW5jdGlvblR5cGVzSW5NZXRhZGF0YTsKICAgIC8vIE5vdGU6IEluIHJhcmUgY2FzZXMgKG1vc3RseSB0ZXN0cykgb3V0cHV0IHVuaXRzIGNhbiBiZSBlbXB0eS4gVGhpcwogICAgLy8gaGFwcGVucyB3aGVuIHRoZSBkZWZlcnJlZCBjb2RlIGlzIGRlYWQtY29kZSBlbGltaW5hdGVkIGJ1dCB3ZSBzdGlsbCBuZWVkCiAgICAvLyB0byBjaGVjayB0aGF0IHRoZSBsaWJyYXJ5IGhhcyBiZWVuIGxvYWRlZC4KICAgIF9jbG9zZWRXb3JsZC5vdXRwdXRVbml0RGF0YS5vdXRwdXRVbml0cwogICAgICAgIC5mb3JFYWNoKF9yZWdpc3RyeS5yZWdpc3Rlck91dHB1dFVuaXQpOwogICAgY29sbGVjdG9yLm91dHB1dENsYXNzTGlzdHMuZm9yRWFjaChfcmVnaXN0cnkucmVnaXN0ZXJDbGFzc2VzKTsKICAgIGNvbGxlY3Rvci5vdXRwdXRTdGF0aWNMaXN0cy5mb3JFYWNoKF9yZWdpc3RyeS5yZWdpc3Rlck1lbWJlcnMpOwogICAgY29sbGVjdG9yLm91dHB1dENvbnN0YW50TGlzdHMuZm9yRWFjaChfcmVnaXN0ZXJDb25zdGFudHMpOwogICAgY29sbGVjdG9yLm91dHB1dFN0YXRpY05vbkZpbmFsRmllbGRMaXN0cy5mb3JFYWNoKF9yZWdpc3RyeS5yZWdpc3Rlck1lbWJlcnMpOwoKICAgIC8vIFdlIGFsd2F5cyBhZGQgdGhlIGN1cnJlbnQgaXNvbGF0ZSBob2xkZXIuCiAgICBfcmVnaXN0ZXJTdGF0aWNTdGF0ZUhvbGRlcigpOwoKICAgIC8vIFdlIG5lZWQgdG8gcnVuIHRoZSBuYXRpdmUtcHJlcGFyYXRpb24gYmVmb3JlIHdlIGJ1aWxkIHRoZSBvdXRwdXQuIFRoZQogICAgLy8gcHJlcGFyYXRpb24gY29kZSwgaW4gdHVybiBuZWVkcyB0aGUgY2xhc3NlcyB0byBiZSBzZXQgdXAuCiAgICAvLyBXZSB0aHVzIGJ1aWxkIHRoZSBjbGFzc2VzIGJlZm9yZSBidWlsZGluZyB0aGVpciBjb250YWluZXJzLgogICAgY29sbGVjdG9yLm91dHB1dENsYXNzTGlzdHMKICAgICAgICAuZm9yRWFjaCgoT3V0cHV0VW5pdCBfLCBMaXN0PENsYXNzRW50aXR5PiBjbGFzc2VzKSB7CiAgICAgIGNsYXNzZXMuZm9yRWFjaChfYnVpbGRDbGFzcyk7CiAgICB9KTsKCiAgICAvLyBSZXNvbHZlIHRoZSBzdXBlcmNsYXNzIHJlZmVyZW5jZXMgYWZ0ZXIgd2UndmUgcHJvY2Vzc2VkIGFsbCB0aGUgY2xhc3Nlcy4KICAgIF9jbGFzc2VzLmZvckVhY2goKENsYXNzRW50aXR5IGNscywgQ2xhc3MgYykgewogICAgICBDbGFzc0VudGl0eSBzdXBlcmNsYXNzID0gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRTdXBlckNsYXNzKGNscyk7CiAgICAgIGlmIChzdXBlcmNsYXNzICE9IG51bGwpIHsKICAgICAgICBjLnNldFN1cGVyY2xhc3MoX2NsYXNzZXNbc3VwZXJjbGFzc10pOwogICAgICAgIGFzc2VydCgKICAgICAgICAgICAgYy5zdXBlcmNsYXNzICE9IG51bGwsCiAgICAgICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICAgICAgY2xzLAogICAgICAgICAgICAgICAgIk5vIENsYXNzIGZvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBzdXBlcmNsYXNzICIKICAgICAgICAgICAgICAgICIke3N1cGVyY2xhc3N9IG9mICRjLiIpKTsKICAgICAgfQogICAgICBpZiAoYy5pc1NpbXBsZU1peGluQXBwbGljYXRpb24gfHwgYy5pc1N1cGVyTWl4aW5BcHBsaWNhdGlvbikgewogICAgICAgIENsYXNzRW50aXR5IGVmZmVjdGl2ZU1peGluQ2xhc3MgPQogICAgICAgICAgICBfZWxlbWVudEVudmlyb25tZW50LmdldEVmZmVjdGl2ZU1peGluQ2xhc3MoY2xzKTsKICAgICAgICBjLnNldE1peGluQ2xhc3MoX2NsYXNzZXNbZWZmZWN0aXZlTWl4aW5DbGFzc10pOwogICAgICAgIGFzc2VydCgKICAgICAgICAgICAgYy5taXhpbkNsYXNzICE9IG51bGwsCiAgICAgICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICAgICAgY2xzLAogICAgICAgICAgICAgICAgIk5vIGNsYXNzIGZvciBlZmZlY3RpdmUgbWl4aW4gJHtlZmZlY3RpdmVNaXhpbkNsYXNzfSBvbiAiCiAgICAgICAgICAgICAgICAiJGNscy4iKSk7CiAgICAgIH0KICAgIH0pOwoKICAgIExpc3Q8Q2xhc3M+IG5hdGl2ZUNsYXNzZXMgPSBjb2xsZWN0b3IubmF0aXZlQ2xhc3Nlc0FuZFN1YmNsYXNzZXMKICAgICAgICAubWFwKChDbGFzc0VudGl0eSBjbGFzc0VsZW1lbnQpID0+IF9jbGFzc2VzW2NsYXNzRWxlbWVudF0pCiAgICAgICAgLnRvTGlzdCgpOwoKICAgIFNldDxDbGFzc0VudGl0eT4gaW50ZXJjZXB0b3JDbGFzc2VzTmVlZGVkQnlDb25zdGFudHMgPQogICAgICAgIGNvbGxlY3Rvci5jb21wdXRlSW50ZXJjZXB0b3JzUmVmZXJlbmNlZEZyb21Db25zdGFudHMoKTsKCiAgICBfdW5uZWVkZWROYXRpdmVDbGFzc2VzID0gX3Rhc2submF0aXZlRW1pdHRlci5wcmVwYXJlTmF0aXZlQ2xhc3NlcygKICAgICAgICBuYXRpdmVDbGFzc2VzLCBpbnRlcmNlcHRvckNsYXNzZXNOZWVkZWRCeUNvbnN0YW50cywgX3J0aU5lZWRlZENsYXNzZXMpOwoKICAgIF9hZGRKc0ludGVyb3BTdHVicyhfcmVnaXN0cnkubWFpbkxpYnJhcmllc01hcCk7CgogICAgTWFpbkZyYWdtZW50IG1haW5GcmFnbWVudCA9IF9idWlsZE1haW5GcmFnbWVudChfcmVnaXN0cnkubWFpbkxpYnJhcmllc01hcCk7CiAgICBJdGVyYWJsZTxGcmFnbWVudD4gZGVmZXJyZWRGcmFnbWVudHMgPQogICAgICAgIF9yZWdpc3RyeS5kZWZlcnJlZExpYnJhcmllc01hcC5tYXAoX2J1aWxkRGVmZXJyZWRGcmFnbWVudCk7CgogICAgTGlzdDxGcmFnbWVudD4gZnJhZ21lbnRzID0gbmV3IExpc3Q8RnJhZ21lbnQ+KF9yZWdpc3RyeS5saWJyYXJpZXNNYXBDb3VudCk7CiAgICBmcmFnbWVudHNbMF0gPSBtYWluRnJhZ21lbnQ7CiAgICBmcmFnbWVudHMuc2V0QWxsKDEsIGRlZmVycmVkRnJhZ21lbnRzKTsKCiAgICBfbWFya0VhZ2VyQ2xhc3NlcygpOwoKICAgIExpc3Q8SG9sZGVyPiBob2xkZXJzID0gX3JlZ2lzdHJ5LmhvbGRlcnMudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CgogICAgYm9vbCBuZWVkc05hdGl2ZVN1cHBvcnQgPQogICAgICAgIF9uYXRpdmVDb2RlZ2VuRW5xdWV1ZXIuaGFzSW5zdGFudGlhdGVkTmF0aXZlQ2xhc3NlczsKCiAgICBhc3NlcnQoIW5lZWRzTmF0aXZlU3VwcG9ydCB8fCBuYXRpdmVDbGFzc2VzLmlzTm90RW1wdHkpOwoKICAgIExpc3Q8anMuVG9rZW5GaW5hbGl6ZXI+IGZpbmFsaXplcnMgPSBbX3Rhc2subWV0YWRhdGFDb2xsZWN0b3JdOwogICAgaWYgKF9uYW1lciBpcyBqcy5Ub2tlbkZpbmFsaXplcikgewogICAgICB2YXIgbmFtaW5nRmluYWxpemVyID0gX25hbWVyOwogICAgICBmaW5hbGl6ZXJzLmFkZChuYW1pbmdGaW5hbGl6ZXIgYXMganMuVG9rZW5GaW5hbGl6ZXIpOwogICAgfQoKICAgIHJldHVybiBuZXcgUHJvZ3JhbShmcmFnbWVudHMsIGhvbGRlcnMsIF9idWlsZExvYWRNYXAoKSwKICAgICAgICBfYnVpbGRUeXBlVG9JbnRlcmNlcHRvck1hcCgpLCBfdGFzay5tZXRhZGF0YUNvbGxlY3RvciwgZmluYWxpemVycywKICAgICAgICBuZWVkc05hdGl2ZVN1cHBvcnQ6IG5lZWRzTmF0aXZlU3VwcG9ydCwKICAgICAgICBvdXRwdXRDb250YWluc0NvbnN0YW50TGlzdDogY29sbGVjdG9yLm91dHB1dENvbnRhaW5zQ29uc3RhbnRMaXN0LAogICAgICAgIGhhc1NvZnREZWZlcnJlZENsYXNzZXM6IF9ub3RTb2Z0RGVmZXJyZWQgIT0gbnVsbCk7CiAgfQoKICB2b2lkIF9tYXJrRWFnZXJDbGFzc2VzKCkgewogICAgX21hcmtFYWdlckludGVyY2VwdG9yQ2xhc3NlcygpOwogIH0KCiAgdm9pZCBfaW5pdGlhbGl6ZVNvZnREZWZlcnJlZE1hcCgpIHsKICAgIHZhciBhbGxvY2F0ZWRDbGFzc2VzUGF0aCA9IF9vcHRpb25zLmV4cGVyaW1lbnRhbEFsbG9jYXRpb25zUGF0aDsKICAgIGlmIChhbGxvY2F0ZWRDbGFzc2VzUGF0aCAhPSBudWxsKSB7CiAgICAgIC8vIFRPRE8oMjk1NzQpOiB0aGUgZm9sbG93aW5nIGJsYWNrbGlzdCBpcyBhZC1ob2MgYW5kIHBvdGVudGlhbGx5CiAgICAgIC8vIGluY29tcGxldGUuIFdlIG5lZWQgdG8gbWFyayBhbGwgY2xhc3NlcyBhcyBibGFjayBsaXN0ZWQsIHRoYXQgYXJlCiAgICAgIC8vIHVzZWQgd2l0aG91dCBjb2RlIGdvaW5nIHRocm91Z2ggdGhlIGNsYXNzJyBjb25zdHJ1Y3Rvci4KICAgICAgdmFyIGJsYWNrTGlzdCA9IFsKICAgICAgICAnZGFydDpfaW50ZXJjZXB0b3JzJywKICAgICAgICAnZGFydDpodG1sJywKICAgICAgICAnZGFydDp0eXBlZF9kYXRhX2ltcGxlbWVudGF0aW9uJywKICAgICAgICAnZGFydDpfbmF0aXZlX3R5cGVkX2RhdGEnCiAgICAgIF0udG9TZXQoKTsKCiAgICAgIC8vIFRPRE8oMjk1NzQpOiB0aGUgY29tcGlsZXIgc2hvdWxkIG5vdCBqdXN0IHVzZSBkYXJ0OmlvIHRvIGdldCB0aGUKICAgICAgLy8gY29udGVudHMgb2YgYSBmaWxlLgogICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShhbGxvY2F0ZWRDbGFzc2VzUGF0aCk7CgogICAgICAvLyBUT0RPKDI5NTc0KTogYXJlIHRoZSBmb2xsb3dpbmcgY2hlY2tzIG5lY2Vzc2FyeT8KICAgICAgLy8gVG8gbWFrZSBjb21waWxhdGlvbiBpbiBidWlsZC1zeXN0ZW1zIGVhc2llciwgd2UgaWdub3JlIG5vbi1leGlzdGluZwogICAgICAvLyBvciBlbXB0eSBwcm9maWxlcy4KICAgICAgaWYgKCFmaWxlLmV4aXN0c1N5bmMoKSkgewogICAgICAgIF9yZXBvcnRlci5sb2coIlByb2ZpbGUgZmlsZSBkb2VzIG5vdCBleGlzdDogJGFsbG9jYXRlZENsYXNzZXNQYXRoIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChmaWxlLmxlbmd0aFN5bmMoKSA9PSAwKSB7CiAgICAgICAgX3JlcG9ydGVyLmxvZygiUHJvZmlsZSBpbmZvcm1hdGlvbiAoYWxsb2NhdGVkIGNsYXNzZXMpIGlzIGVtcHR5LiIpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgU3RyaW5nIGRhdGEgPSBuZXcgRmlsZShhbGxvY2F0ZWRDbGFzc2VzUGF0aCkucmVhZEFzU3RyaW5nU3luYygpOwogICAgICBTZXQ8U3RyaW5nPiBhbGxvY2F0ZWRDbGFzc2VzS2V5cyA9IGpzb25EZWNvZGUoZGF0YSkua2V5cy50b1NldCgpOwogICAgICBTZXQ8Q2xhc3NFbnRpdHk+IGFsbG9jYXRlZENsYXNzZXMgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwoKICAgICAgLy8gQ29sbGVjdHMgYWxsIHN1cGVyIGFuZCBtaXhpbiBjbGFzc2VzIG9mIGEgY2xhc3MuCiAgICAgIHZvaWQgY29sbGVjdChDbGFzc0VudGl0eSBlbGVtZW50KSB7CiAgICAgICAgYWxsb2NhdGVkQ2xhc3Nlcy5hZGQoZWxlbWVudCk7CiAgICAgICAgaWYgKF9lbGVtZW50RW52aXJvbm1lbnQuaXNNaXhpbkFwcGxpY2F0aW9uKGVsZW1lbnQpKSB7CiAgICAgICAgICBjb2xsZWN0KF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0RWZmZWN0aXZlTWl4aW5DbGFzcyhlbGVtZW50KSk7CiAgICAgICAgfQogICAgICAgIENsYXNzRW50aXR5IHN1cGVyY2xhc3MgPSBfZWxlbWVudEVudmlyb25tZW50LmdldFN1cGVyQ2xhc3MoZWxlbWVudCk7CiAgICAgICAgaWYgKHN1cGVyY2xhc3MgIT0gbnVsbCkgewogICAgICAgICAgY29sbGVjdChzdXBlcmNsYXNzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIEZvciBldmVyeSBrbm93biBjbGFzcywgc2VlIGlmIGl0IHdhcyBhbGxvY2F0ZWQgaW4gdGhlIHByb2ZpbGUuIElmIHllcywKICAgICAgLy8gY29sbGVjdCBpdHMgZGVwZW5kZW5jaWVzIChzdXBlcnMgYW5kIG1peGlucykgYW5kIG1hcmsgdGhlbSBhcwogICAgICAvLyBub3Qtc29mdC1kZWZlcnJhYmxlLgogICAgICBjb2xsZWN0b3Iub3V0cHV0Q2xhc3NMaXN0cy5mb3JFYWNoKChfLCBMaXN0PENsYXNzRW50aXR5PiBlbGVtZW50cykgewogICAgICAgIGZvciAoQ2xhc3NFbnRpdHkgZWxlbWVudCBpbiBlbGVtZW50cykgewogICAgICAgICAgLy8gVE9ETygyOTU3NCk6IHNoYXJlIHRoZSBlbmNvZGluZyBvZiB0aGUgZWxlbWVudCB3aXRoIHRoZSBjb2RlCiAgICAgICAgICAvLyB0aGF0IGVtaXRzIHRoZSBwcm9maWxlLXJ1bi4KICAgICAgICAgIHZhciBrZXkgPSAiJHtlbGVtZW50LmxpYnJhcnkuY2Fub25pY2FsVXJpfToke2VsZW1lbnQubmFtZX0iOwogICAgICAgICAgaWYgKGFsbG9jYXRlZENsYXNzZXNLZXlzLmNvbnRhaW5zKGtleSkgfHwKICAgICAgICAgICAgICBfbmF0aXZlRGF0YS5pc0pzSW50ZXJvcENsYXNzKGVsZW1lbnQpIHx8CiAgICAgICAgICAgICAgYmxhY2tMaXN0LmNvbnRhaW5zKGVsZW1lbnQubGlicmFyeS5jYW5vbmljYWxVcmkudG9TdHJpbmcoKSkpIHsKICAgICAgICAgICAgY29sbGVjdChlbGVtZW50KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICBfbm90U29mdERlZmVycmVkID0gYWxsb2NhdGVkQ2xhc3NlczsKICAgIH0KICB9CgogIC8vLyBCdWlsZHMgYSBtYXAgZnJvbSBsb2FkSWQgdG8gb3V0cHV0cy10by1sb2FkLgogIE1hcDxTdHJpbmcsIExpc3Q8RnJhZ21lbnQ+PiBfYnVpbGRMb2FkTWFwKCkgewogICAgTWFwPFN0cmluZywgTGlzdDxGcmFnbWVudD4+IGxvYWRNYXAgPSA8U3RyaW5nLCBMaXN0PEZyYWdtZW50Pj57fTsKICAgIF9jbG9zZWRXb3JsZC5vdXRwdXRVbml0RGF0YS5odW5rc1RvTG9hZAogICAgICAgIC5mb3JFYWNoKChTdHJpbmcgbG9hZElkLCBMaXN0PE91dHB1dFVuaXQ+IG91dHB1dFVuaXRzKSB7CiAgICAgIGxvYWRNYXBbbG9hZElkXSA9IG91dHB1dFVuaXRzCiAgICAgICAgICAubWFwKChPdXRwdXRVbml0IHVuaXQpID0+IF9vdXRwdXRzW3VuaXRdKQogICAgICAgICAgLnRvTGlzdChncm93YWJsZTogZmFsc2UpOwogICAgfSk7CiAgICByZXR1cm4gbG9hZE1hcDsKICB9CgogIGpzLkV4cHJlc3Npb24gX2J1aWxkVHlwZVRvSW50ZXJjZXB0b3JNYXAoKSB7CiAgICBJbnRlcmNlcHRvclN0dWJHZW5lcmF0b3Igc3R1YkdlbmVyYXRvciA9IG5ldyBJbnRlcmNlcHRvclN0dWJHZW5lcmF0b3IoCiAgICAgICAgX29wdGlvbnMsCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLAogICAgICAgIF90YXNrLAogICAgICAgIF9uYXRpdmVDb2RlZ2VuRW5xdWV1ZXIsCiAgICAgICAgX25hbWVyLAogICAgICAgIF9vbmVTaG90SW50ZXJjZXB0b3JEYXRhLAogICAgICAgIF9jdXN0b21FbGVtZW50c0NvZGVnZW5BbmFseXNpcywKICAgICAgICBfd29ybGRCdWlsZGVyLAogICAgICAgIF9jbG9zZWRXb3JsZCk7CiAgICByZXR1cm4gc3R1YkdlbmVyYXRvci5nZW5lcmF0ZVR5cGVUb0ludGVyY2VwdG9yTWFwKCk7CiAgfQoKICBNYWluRnJhZ21lbnQgX2J1aWxkTWFpbkZyYWdtZW50KExpYnJhcmllc01hcCBsaWJyYXJpZXNNYXApIHsKICAgIC8vIENvbnN0cnVjdCB0aGUgbWFpbiBvdXRwdXQgZnJvbSB0aGUgbGlicmFyaWVzIGFuZCB0aGUgcmVnaXN0ZXJlZCBob2xkZXJzLgogICAgTWFpbkZyYWdtZW50IHJlc3VsdCA9IG5ldyBNYWluRnJhZ21lbnQoCiAgICAgICAgbGlicmFyaWVzTWFwLm91dHB1dFVuaXQsCiAgICAgICAgIiIsIC8vIFRoZSBlbXB0eSBzdHJpbmcgaXMgdGhlIG5hbWUgZm9yIHRoZSBtYWluIG91dHB1dCBmaWxlLgogICAgICAgIF9idWlsZEludm9rZU1haW4oKSwKICAgICAgICBfYnVpbGRMaWJyYXJpZXMobGlicmFyaWVzTWFwKSwKICAgICAgICBfYnVpbGRTdGF0aWNOb25GaW5hbEZpZWxkcyhsaWJyYXJpZXNNYXApLAogICAgICAgIF9idWlsZFN0YXRpY0xhemlseUluaXRpYWxpemVkRmllbGRzKGxpYnJhcmllc01hcCksCiAgICAgICAgX2J1aWxkQ29uc3RhbnRzKGxpYnJhcmllc01hcCkpOwogICAgX291dHB1dHNbbGlicmFyaWVzTWFwLm91dHB1dFVuaXRdID0gcmVzdWx0OwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGpzLlN0YXRlbWVudCBfYnVpbGRJbnZva2VNYWluKCkgewogICAgcmV0dXJuIE1haW5DYWxsU3R1YkdlbmVyYXRvci5nZW5lcmF0ZUludm9rZU1haW4oCiAgICAgICAgX3Rhc2suZW1pdHRlciwgX21haW5GdW5jdGlvbik7CiAgfQoKICBEZWZlcnJlZEZyYWdtZW50IF9idWlsZERlZmVycmVkRnJhZ21lbnQoTGlicmFyaWVzTWFwIGxpYnJhcmllc01hcCkgewogICAgRGVmZXJyZWRGcmFnbWVudCByZXN1bHQgPSBuZXcgRGVmZXJyZWRGcmFnbWVudCgKICAgICAgICBsaWJyYXJpZXNNYXAub3V0cHV0VW5pdCwKICAgICAgICBkZWZlcnJlZFBhcnRGaWxlTmFtZShfb3B0aW9ucywgbGlicmFyaWVzTWFwLm5hbWUsIGFkZEV4dGVuc2lvbjogZmFsc2UpLAogICAgICAgIGxpYnJhcmllc01hcC5uYW1lLAogICAgICAgIF9idWlsZExpYnJhcmllcyhsaWJyYXJpZXNNYXApLAogICAgICAgIF9idWlsZFN0YXRpY05vbkZpbmFsRmllbGRzKGxpYnJhcmllc01hcCksCiAgICAgICAgX2J1aWxkU3RhdGljTGF6aWx5SW5pdGlhbGl6ZWRGaWVsZHMobGlicmFyaWVzTWFwKSwKICAgICAgICBfYnVpbGRDb25zdGFudHMobGlicmFyaWVzTWFwKSk7CiAgICBfb3V0cHV0c1tsaWJyYXJpZXNNYXAub3V0cHV0VW5pdF0gPSByZXN1bHQ7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgTGlzdDxDb25zdGFudD4gX2J1aWxkQ29uc3RhbnRzKExpYnJhcmllc01hcCBsaWJyYXJpZXNNYXApIHsKICAgIExpc3Q8Q29uc3RhbnRWYWx1ZT4gY29uc3RhbnRWYWx1ZXMgPQogICAgICAgIGNvbGxlY3Rvci5vdXRwdXRDb25zdGFudExpc3RzW2xpYnJhcmllc01hcC5vdXRwdXRVbml0XTsKICAgIGlmIChjb25zdGFudFZhbHVlcyA9PSBudWxsKSByZXR1cm4gY29uc3QgPENvbnN0YW50PltdOwogICAgcmV0dXJuIGNvbnN0YW50VmFsdWVzCiAgICAgICAgLm1hcCgoQ29uc3RhbnRWYWx1ZSB2YWx1ZSkgPT4gX2NvbnN0YW50c1t2YWx1ZV0pCiAgICAgICAgLnRvTGlzdChncm93YWJsZTogZmFsc2UpOwogIH0KCiAgTGlzdDxTdGF0aWNGaWVsZD4gX2J1aWxkU3RhdGljTm9uRmluYWxGaWVsZHMoTGlicmFyaWVzTWFwIGxpYnJhcmllc01hcCkgewogICAgTGlzdDxGaWVsZEVudGl0eT4gc3RhdGljTm9uRmluYWxGaWVsZHMgPQogICAgICAgIGNvbGxlY3Rvci5vdXRwdXRTdGF0aWNOb25GaW5hbEZpZWxkTGlzdHNbbGlicmFyaWVzTWFwLm91dHB1dFVuaXRdOwogICAgaWYgKHN0YXRpY05vbkZpbmFsRmllbGRzID09IG51bGwpIHJldHVybiBjb25zdCA8U3RhdGljRmllbGQ+W107CgogICAgcmV0dXJuIHN0YXRpY05vbkZpbmFsRmllbGRzLm1hcChfYnVpbGRTdGF0aWNGaWVsZCkudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgfQoKICBTdGF0aWNGaWVsZCBfYnVpbGRTdGF0aWNGaWVsZChGaWVsZEVudGl0eSBlbGVtZW50KSB7CiAgICBGaWVsZEFuYWx5c2lzRGF0YSBmaWVsZERhdGEgPSBfZmllbGRBbmFseXNpcy5nZXRGaWVsZERhdGEoZWxlbWVudCk7CiAgICBDb25zdGFudFZhbHVlIGluaXRpYWxWYWx1ZSA9IGZpZWxkRGF0YS5pbml0aWFsVmFsdWU7CiAgICBqcy5FeHByZXNzaW9uIGNvZGU7CiAgICBpZiAoaW5pdGlhbFZhbHVlICE9IG51bGwpIHsKICAgICAgLy8gVE9ETyh6YXJhaCk6IFRoZSBob2xkZXIgc2hvdWxkIG5vdCBiZSByZWdpc3RlcmVkIGR1cmluZyBidWlsZGluZyBvZgogICAgICAvLyBhIHN0YXRpYyBmaWVsZC4KICAgICAgX3JlZ2lzdHJ5LnJlZ2lzdGVySG9sZGVyKF9uYW1lci5nbG9iYWxPYmplY3RGb3JDb25zdGFudChpbml0aWFsVmFsdWUpLAogICAgICAgICAgaXNDb25zdGFudHNIb2xkZXI6IHRydWUpOwogICAgICBjb2RlID0gX3Rhc2suZW1pdHRlci5jb25zdGFudFJlZmVyZW5jZShpbml0aWFsVmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KGZpZWxkRGF0YS5pc0VhZ2VyKTsKICAgICAgY29kZSA9IF9nZW5lcmF0ZWRDb2RlW2VsZW1lbnRdOwogICAgfQogICAganMuTmFtZSBuYW1lID0gX25hbWVyLmdsb2JhbFByb3BlcnR5TmFtZUZvck1lbWJlcihlbGVtZW50KTsKCiAgICAvLyBUT0RPKGZsb2l0c2NoKTogd2Ugc2hvdWxkbid0IHVwZGF0ZSB0aGUgcmVnaXN0cnkgaW4gdGhlIG1pZGRsZSBvZgogICAgLy8gYnVpbGRpbmcgYSBzdGF0aWMgZmllbGQuIChOb3RlIHRoYXQgdGhlIHN0YXRpYy1zdGF0ZSBob2xkZXIgd2FzCiAgICAvLyBhbHJlYWR5IHJlZ2lzdGVyZWQgZWFybGllciwgYW5kIHRoYXQgd2UganVzdCBjYWxsIHRoZSByZWdpc3RlciB0byBnZXQKICAgIC8vIHRoZSBob2xkZXItaW5zdGFuY2UuCiAgICByZXR1cm4gbmV3IFN0YXRpY0ZpZWxkKAogICAgICAgIGVsZW1lbnQsIG5hbWUsIG51bGwsIF9yZWdpc3RlclN0YXRpY1N0YXRlSG9sZGVyKCksIGNvZGUsCiAgICAgICAgaXNGaW5hbDogZmFsc2UsCiAgICAgICAgaXNMYXp5OiBmYWxzZSwKICAgICAgICBpc0luaXRpYWxpemVkQnlDb25zdGFudDogaW5pdGlhbFZhbHVlICE9IG51bGwpOwogIH0KCiAgTGlzdDxTdGF0aWNGaWVsZD4gX2J1aWxkU3RhdGljTGF6aWx5SW5pdGlhbGl6ZWRGaWVsZHMoCiAgICAgIExpYnJhcmllc01hcCBsaWJyYXJpZXNNYXApIHsKICAgIEl0ZXJhYmxlPEZpZWxkRW50aXR5PiBsYXp5RmllbGRzID0gX2NvbnN0YW50SGFuZGxlcgogICAgICAgIC5nZXRMYXppbHlJbml0aWFsaXplZEZpZWxkc0ZvckVtaXNzaW9uKCkKICAgICAgICAud2hlcmUoKEZpZWxkRW50aXR5IGVsZW1lbnQpID0+CiAgICAgICAgICAgIF9vdXRwdXRVbml0RGF0YS5vdXRwdXRVbml0Rm9yTWVtYmVyKGVsZW1lbnQpID09CiAgICAgICAgICAgIGxpYnJhcmllc01hcC5vdXRwdXRVbml0KTsKICAgIHJldHVybiBfc29ydGVyCiAgICAgICAgLnNvcnRNZW1iZXJzKGxhenlGaWVsZHMpCiAgICAgICAgLm1hcChfYnVpbGRMYXp5RmllbGQpCiAgICAgICAgLndoZXJlKChmaWVsZCkgPT4gZmllbGQgIT0gbnVsbCkgLy8gSGFwcGVucyB3aGVuIHRoZSBmaWVsZCB3YXMgdW51c2VkLgogICAgICAgIC50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICB9CgogIFN0YXRpY0ZpZWxkIF9idWlsZExhenlGaWVsZChGaWVsZEVudGl0eSBlbGVtZW50KSB7CiAgICBqcy5FeHByZXNzaW9uIGNvZGUgPSBfZ2VuZXJhdGVkQ29kZVtlbGVtZW50XTsKICAgIC8vIFRoZSBjb2RlIGlzIG51bGwgaWYgd2UgZW5kZWQgdXAgbm90IG5lZWRpbmcgdGhlIGxhemlseQogICAgLy8gaW5pdGlhbGl6ZWQgZmllbGQgYWZ0ZXIgYWxsIGJlY2F1c2Ugb2YgY29uc3RhbnQgZm9sZGluZwogICAgLy8gYmVmb3JlIGNvZGUgZ2VuZXJhdGlvbi4KICAgIGlmIChjb2RlID09IG51bGwpIHJldHVybiBudWxsOwoKICAgIGpzLk5hbWUgbmFtZSA9IF9uYW1lci5nbG9iYWxQcm9wZXJ0eU5hbWVGb3JNZW1iZXIoZWxlbWVudCk7CiAgICBqcy5OYW1lIGdldHRlck5hbWUgPSBfbmFtZXIubGF6eUluaXRpYWxpemVyTmFtZShlbGVtZW50KTsKICAgIC8vIFRPRE8oZmxvaXRzY2gpOiB3ZSBzaG91bGRuJ3QgdXBkYXRlIHRoZSByZWdpc3RyeSBpbiB0aGUgbWlkZGxlIG9mCiAgICAvLyBidWlsZGluZyBhIHN0YXRpYyBmaWVsZC4gKE5vdGUgdGhhdCB0aGUgc3RhdGljLXN0YXRlIGhvbGRlciB3YXMKICAgIC8vIGFscmVhZHkgcmVnaXN0ZXJlZCBlYXJsaWVyLCBhbmQgdGhhdCB3ZSBqdXN0IGNhbGwgdGhlIHJlZ2lzdGVyIHRvIGdldAogICAgLy8gdGhlIGhvbGRlci1pbnN0YW5jZS4KICAgIHJldHVybiBuZXcgU3RhdGljRmllbGQoCiAgICAgICAgZWxlbWVudCwgbmFtZSwgZ2V0dGVyTmFtZSwgX3JlZ2lzdGVyU3RhdGljU3RhdGVIb2xkZXIoKSwgY29kZSwKICAgICAgICBpc0ZpbmFsOiAhZWxlbWVudC5pc0Fzc2lnbmFibGUsIGlzTGF6eTogdHJ1ZSk7CiAgfQoKICBMaXN0PExpYnJhcnk+IF9idWlsZExpYnJhcmllcyhMaWJyYXJpZXNNYXAgbGlicmFyaWVzTWFwKSB7CiAgICBMaXN0PExpYnJhcnk+IGxpYnJhcmllcyA9IG5ldyBMaXN0PExpYnJhcnk+KGxpYnJhcmllc01hcC5sZW5ndGgpOwogICAgaW50IGNvdW50ID0gMDsKICAgIGxpYnJhcmllc01hcC5mb3JFYWNoKChMaWJyYXJ5RW50aXR5IGxpYnJhcnksIExpc3Q8Q2xhc3NFbnRpdHk+IGNsYXNzZXMsCiAgICAgICAgTGlzdDxNZW1iZXJFbnRpdHk+IG1lbWJlcnMpIHsKICAgICAgbGlicmFyaWVzW2NvdW50KytdID0gX2J1aWxkTGlicmFyeShsaWJyYXJ5LCBjbGFzc2VzLCBtZW1iZXJzKTsKICAgIH0pOwogICAgcmV0dXJuIGxpYnJhcmllczsKICB9CgogIHZvaWQgX2FkZEpzSW50ZXJvcFN0dWJzKExpYnJhcmllc01hcCBsaWJyYXJpZXNNYXApIHsKICAgIGlmIChfY2xhc3Nlcy5jb250YWluc0tleShfY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MpKSB7CiAgICAgIHZhciB0b1N0cmluZ0ludm9jYXRpb24gPSBfbmFtZXIuaW52b2NhdGlvbk5hbWUoU2VsZWN0b3JzLnRvU3RyaW5nXyk7CiAgICAgIC8vIFRPRE8oamFjb2JyKTogcmVnaXN0ZXIgdG9TdHJpbmcgYXMgdXNlZCBzbyB0aGF0IGl0IGlzIGFsd2F5cyBhY2Nlc3NpYmxlCiAgICAgIC8vIGZyb20gSmF2YVNjcmlwdC4KICAgICAgX2NsYXNzZXNbX2NvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzXS5jYWxsU3R1YnMuYWRkKF9idWlsZFN0dWJNZXRob2QoCiAgICAgICAgICBuZXcgU3RyaW5nQmFja2VkTmFtZSgidG9TdHJpbmciKSwKICAgICAgICAgIGpzLmpzKCdmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuIyh0aGlzKSB9JywgdG9TdHJpbmdJbnZvY2F0aW9uKSkpOwogICAgfQoKICAgIC8vIFdlIGFkZCBhbGwgbWVtYmVycyBmcm9tIGNsYXNzZXMgbWFya2VkIHdpdGggaXNKc0ludGVyb3AgdG8gdGhlIGJhc2UKICAgIC8vIEludGVyY2VwdG9yIGNsYXNzIHdpdGggaW1wbGVtZW50YXRpb25zIHRoYXQgZGlyZWN0bHkgY2FsbCB0aGUKICAgIC8vIGNvcnJlc3BvbmRpbmcgSmF2YVNjcmlwdCBtZW1iZXIuIFdlIGRvIG5vdCBhdHRlbXB0IHRvIGJpbmQgdGhpcyB3aGVuCiAgICAvLyB0ZWFyaW5nIG9mZiBKYXZhU2NyaXB0IG1ldGhvZHMgYXMgd2UgY2Fubm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gY2FsbGluZwogICAgLy8gYSByZWd1bGFyIGdldHRlciB0aGF0IHJldHVybnMgYSBKYXZhU2NyaXB0IGZ1bmN0aW9uIGFuZCB0ZWFyaW5nIG9mZgogICAgLy8gYSBtZXRob2QgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlcmUgZXhpc3QgbXVsdGlwbGUgSmF2YVNjcmlwdCBjbGFzc2VzCiAgICAvLyB0aGF0IGNvbmZsaWN0IG9uIHdoZXRoZXIgdGhlIG1lbWJlciBpcyBhIGdldHRlciBvciBhIG1ldGhvZC4KICAgIHZhciBpbnRlcmNlcHRvckNsYXNzID0gX2NsYXNzZXNbX2NvbW1vbkVsZW1lbnRzLmpzSmF2YVNjcmlwdE9iamVjdENsYXNzXTsKICAgIHZhciBzdHViTmFtZXMgPSBuZXcgU2V0PFN0cmluZz4oKTsKICAgIGxpYnJhcmllc01hcAogICAgICAgIC5mb3JFYWNoKChMaWJyYXJ5RW50aXR5IGxpYnJhcnksIExpc3Q8Q2xhc3NFbnRpdHk+IGNsYXNzRWxlbWVudHMsIF8pIHsKICAgICAgZm9yIChDbGFzc0VudGl0eSBjbHMgaW4gY2xhc3NFbGVtZW50cykgewogICAgICAgIGlmIChfbmF0aXZlRGF0YS5pc0pzSW50ZXJvcENsYXNzKGNscykpIHsKICAgICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaExvY2FsQ2xhc3NNZW1iZXIoY2xzLAogICAgICAgICAgICAgIChNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAgICAgICAgIHZhciBqc05hbWUgPSBfbmF0aXZlRGF0YS5jb21wdXRlVW5lc2NhcGVkSlNJbnRlcm9wTmFtZShtZW1iZXIubmFtZSk7CiAgICAgICAgICAgIGlmICghbWVtYmVyLmlzSW5zdGFuY2VNZW1iZXIpIHJldHVybjsKICAgICAgICAgICAgaWYgKG1lbWJlci5pc0dldHRlciB8fCBtZW1iZXIuaXNGaWVsZCB8fCBtZW1iZXIuaXNGdW5jdGlvbikgewogICAgICAgICAgICAgIHZhciBzZWxlY3RvcnMgPQogICAgICAgICAgICAgICAgICBfd29ybGRCdWlsZGVyLmdldHRlckludm9jYXRpb25zQnlOYW1lKG1lbWJlci5uYW1lKTsKICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JzICE9IG51bGwgJiYgIXNlbGVjdG9ycy5pc0VtcHR5KSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBzZWxlY3RvciBpbiBzZWxlY3RvcnMua2V5cykgewogICAgICAgICAgICAgICAgICB2YXIgc3R1Yk5hbWUgPSBfbmFtZXIuaW52b2NhdGlvbk5hbWUoc2VsZWN0b3IpOwogICAgICAgICAgICAgICAgICBpZiAoc3R1Yk5hbWVzLmFkZChzdHViTmFtZS5rZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgaW50ZXJjZXB0b3JDbGFzcy5jYWxsU3R1YnMuYWRkKF9idWlsZFN0dWJNZXRob2Qoc3R1Yk5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGpzLmpzKCdmdW5jdGlvbihvYmopIHsgcmV0dXJuIG9iai4jIH0nLCBbanNOYW1lXSksCiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IG1lbWJlcikpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAobWVtYmVyLmlzU2V0dGVyIHx8IChtZW1iZXIuaXNGaWVsZCAmJiAhbWVtYmVyLmlzQ29uc3QpKSB7CiAgICAgICAgICAgICAgdmFyIHNlbGVjdG9ycyA9CiAgICAgICAgICAgICAgICAgIF93b3JsZEJ1aWxkZXIuc2V0dGVySW52b2NhdGlvbnNCeU5hbWUobWVtYmVyLm5hbWUpOwogICAgICAgICAgICAgIGlmIChzZWxlY3RvcnMgIT0gbnVsbCAmJiAhc2VsZWN0b3JzLmlzRW1wdHkpIHsKICAgICAgICAgICAgICAgIHZhciBzdHViTmFtZSA9IF9uYW1lci5zZXR0ZXJGb3JNZW1iZXIobWVtYmVyKTsKICAgICAgICAgICAgICAgIGlmIChzdHViTmFtZXMuYWRkKHN0dWJOYW1lLmtleSkpIHsKICAgICAgICAgICAgICAgICAgaW50ZXJjZXB0b3JDbGFzcy5jYWxsU3R1YnMuYWRkKF9idWlsZFN0dWJNZXRob2Qoc3R1Yk5hbWUsCiAgICAgICAgICAgICAgICAgICAgICBqcy5qcygnZnVuY3Rpb24ob2JqLCB2KSB7IHJldHVybiBvYmouIyA9IHYgfScsIFtqc05hbWVdKSwKICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IG1lbWJlcikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gR2VuZXJhdGluZyBzdHVicyBmb3IgZGlyZWN0IGNhbGxzIGFuZCBzdHVicyBmb3IgY2FsbC10aHJvdWdoCiAgICAgICAgICAgIC8vIG9mIGdldHRlcnMgdGhhdCBoYXBwZW4gdG8gYmUgZnVuY3Rpb25zLgogICAgICAgICAgICBib29sIGlzRnVuY3Rpb25MaWtlID0gZmFsc2U7CiAgICAgICAgICAgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKG1lbWJlci5pc0Z1bmN0aW9uKSB7CiAgICAgICAgICAgICAgRnVuY3Rpb25FbnRpdHkgZm4gPSBtZW1iZXI7CiAgICAgICAgICAgICAgZnVuY3Rpb25UeXBlID0gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRGdW5jdGlvblR5cGUoZm4pOwogICAgICAgICAgICB9IGVsc2UgaWYgKG1lbWJlci5pc0dldHRlcikgewogICAgICAgICAgICAgIGlzRnVuY3Rpb25MaWtlID0gdHJ1ZTsKICAgICAgICAgICAgfSAvLyBUT0RPKGphY29icik6IGhhbmRsZSBmaWVsZCBlbGVtZW50cy4KCiAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uTGlrZSB8fCBmdW5jdGlvblR5cGUgIT0gbnVsbCkgewogICAgICAgICAgICAgIGludCBtaW5BcmdzOwogICAgICAgICAgICAgIGludCBtYXhBcmdzOwogICAgICAgICAgICAgIGlmIChmdW5jdGlvblR5cGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgbWluQXJncyA9IGZ1bmN0aW9uVHlwZS5wYXJhbWV0ZXJUeXBlcy5sZW5ndGg7CiAgICAgICAgICAgICAgICBtYXhBcmdzID0gbWluQXJncyArIGZ1bmN0aW9uVHlwZS5vcHRpb25hbFBhcmFtZXRlclR5cGVzLmxlbmd0aDsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbWluQXJncyA9IDA7CiAgICAgICAgICAgICAgICBtYXhBcmdzID0gMzI3Njc7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBfd29ybGRCdWlsZGVyLmludm9jYXRpb25zQnlOYW1lKG1lbWJlci5uYW1lKTsKICAgICAgICAgICAgICAvLyBOYW1lZCBhcmd1bWVudHMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLiBJbiB0aGUgZnV0dXJlIHdlCiAgICAgICAgICAgICAgLy8gbWF5IHdhbnQgdG8gbWFwIG5hbWVkIGFyZ3VtZW50cyB0byBhbiBvYmplY3QgbGl0ZXJhbCBjb250YWluaW5nCiAgICAgICAgICAgICAgLy8gYWxsIG5hbWVkIGFyZ3VtZW50cy4KICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JzICE9IG51bGwgJiYgIXNlbGVjdG9ycy5pc0VtcHR5KSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBzZWxlY3RvciBpbiBzZWxlY3RvcnMua2V5cykgewogICAgICAgICAgICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBhcml0eSBtYXRjaGVzIHRoaXMgbWVtYmVyLgogICAgICAgICAgICAgICAgICB2YXIgYXJndW1lbnRDb3VudCA9IHNlbGVjdG9yLmFyZ3VtZW50Q291bnQ7CiAgICAgICAgICAgICAgICAgIC8vIEpTIGludGVyb3AgZG9lcyBub3Qgc3VwcG9ydCBuYW1lZCBhcmd1bWVudHMuCiAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5uYW1lZEFyZ3VtZW50Q291bnQgPiAwKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50Q291bnQgPCBtaW5BcmdzKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50Q291bnQgPiBtYXhBcmdzKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgdmFyIHN0dWJOYW1lID0gX25hbWVyLmludm9jYXRpb25OYW1lKHNlbGVjdG9yKTsKICAgICAgICAgICAgICAgICAgaWYgKCFzdHViTmFtZXMuYWRkKHN0dWJOYW1lLmtleSkpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICB2YXIgcGFyYW1ldGVycyA9CiAgICAgICAgICAgICAgICAgICAgICBuZXcgTGlzdDxTdHJpbmc+LmdlbmVyYXRlKGFyZ3VtZW50Q291bnQsIChpKSA9PiAncCRpJyk7CgogICAgICAgICAgICAgICAgICAvLyBXZSBpbnRlbnRpb25hbGx5IGdlbmVyYXRlIHRoZSBzYW1lIHN0dWIgbWV0aG9kIGZvciBkaXJlY3QKICAgICAgICAgICAgICAgICAgLy8gY2FsbHMgYW5kIGNhbGwtdGhyb3VnaHMgb2YgZ2V0dGVycyBzbyB0aGF0IGNhbGxpbmcgYQogICAgICAgICAgICAgICAgICAvLyBnZXR0ZXIgdGhhdCByZXR1cm5zIGEgZnVuY3Rpb24gYmVoYXZlcyB0aGUgc2FtZSBhcyBjYWxsaW5nCiAgICAgICAgICAgICAgICAgIC8vIGEgbWV0aG9kLiBUaGlzIGlzIGhlbHBmdWwgYXMgbWFueSB0eXBlZCBKYXZhU2NyaXB0IEFQSXMKICAgICAgICAgICAgICAgICAgLy8gc3BlY2lmeSBtZW1iZXIgZnVuY3Rpb25zIHdpdGggZ2V0dGVycyB0aGF0IHJldHVybgogICAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbnMuIFRoZSBiZWhhdmlvciBvZiB0aGlzIHNvbHV0aW9uIG1hdGNoZXMgSmF2YVNjcmlwdAogICAgICAgICAgICAgICAgICAvLyBiZWhhdmlvciBpbXBsaWNpdGx5IGJpbmRpbmcgdGhpcyBvbmx5IHdoZW4gSmF2YVNjcmlwdAogICAgICAgICAgICAgICAgICAvLyB3b3VsZC4KICAgICAgICAgICAgICAgICAgaW50ZXJjZXB0b3JDbGFzcy5jYWxsU3R1YnMuYWRkKF9idWlsZFN0dWJNZXRob2QoCiAgICAgICAgICAgICAgICAgICAgICBzdHViTmFtZSwKICAgICAgICAgICAgICAgICAgICAgIGpzLmpzKCdmdW5jdGlvbihyZWNlaXZlciwgIykgeyByZXR1cm4gcmVjZWl2ZXIuIygjKSB9JywKICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFyYW1ldGVycywganNOYW1lLCBwYXJhbWV0ZXJzXSksCiAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiBtZW1iZXIpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgfQoKICAvLyBOb3RlIHRoYXQgYSBsaWJyYXJ5LWVsZW1lbnQgbWF5IGhhdmUgbXVsdGlwbGUgW0xpYnJhcnldcywgaWYgaXQgaXMgc3BsaXQKICAvLyBpbnRvIG11bHRpcGxlIG91dHB1dCB1bml0cy4KICBMaWJyYXJ5IF9idWlsZExpYnJhcnkoTGlicmFyeUVudGl0eSBsaWJyYXJ5LCBMaXN0PENsYXNzRW50aXR5PiBjbGFzc0VsZW1lbnRzLAogICAgICBMaXN0PE1lbWJlckVudGl0eT4gbWVtYmVyRWxlbWVudHMpIHsKICAgIFN0cmluZyB1cmkgPSBsaWJyYXJ5LmNhbm9uaWNhbFVyaS50b1N0cmluZygpOwoKICAgIExpc3Q8U3RhdGljTWV0aG9kPiBzdGF0aWNzID0gbWVtYmVyRWxlbWVudHMKICAgICAgICAud2hlcmUoKGUpID0+ICFlLmlzRmllbGQpCiAgICAgICAgLmNhc3Q8RnVuY3Rpb25FbnRpdHk+KCkKICAgICAgICAubWFwPFN0YXRpY01ldGhvZD4oX2J1aWxkU3RhdGljTWV0aG9kKQogICAgICAgIC50b0xpc3QoKTsKCiAgICBpZiAobGlicmFyeSA9PSBfY29tbW9uRWxlbWVudHMuaW50ZXJjZXB0b3JzTGlicmFyeSkgewogICAgICBzdGF0aWNzLmFkZEFsbChfZ2VuZXJhdGVHZXRJbnRlcmNlcHRvck1ldGhvZHMoKSk7CiAgICAgIHN0YXRpY3MuYWRkQWxsKF9nZW5lcmF0ZU9uZVNob3RJbnRlcmNlcHRvcnMoKSk7CiAgICB9CgogICAgTGlzdDxDbGFzcz4gY2xhc3NlcyA9IGNsYXNzRWxlbWVudHMKICAgICAgICAubWFwKChDbGFzc0VudGl0eSBjbGFzc0VsZW1lbnQpID0+IF9jbGFzc2VzW2NsYXNzRWxlbWVudF0pCiAgICAgICAgLndoZXJlKChDbGFzcyBjbHMpID0+CiAgICAgICAgICAgICFjbHMuaXNOYXRpdmUgfHwgIV91bm5lZWRlZE5hdGl2ZUNsYXNzZXMuY29udGFpbnMoY2xzKSkKICAgICAgICAudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CgogICAgYm9vbCB2aXNpdFN0YXRpY3MgPSB0cnVlOwogICAgTGlzdDxGaWVsZD4gc3RhdGljRmllbGRzRm9yUmVmbGVjdGlvbiA9CiAgICAgICAgX2J1aWxkRmllbGRzKGxpYnJhcnk6IGxpYnJhcnksIHZpc2l0U3RhdGljczogdmlzaXRTdGF0aWNzKTsKCiAgICByZXR1cm4gbmV3IExpYnJhcnkoCiAgICAgICAgbGlicmFyeSwgdXJpLCBzdGF0aWNzLCBjbGFzc2VzLCBzdGF0aWNGaWVsZHNGb3JSZWZsZWN0aW9uKTsKICB9CgogIGJvb2wgX2lzU29mdERlZmVycmVkKENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBfbm90U29mdERlZmVycmVkICE9IG51bGwgJiYgIV9ub3RTb2Z0RGVmZXJyZWQuY29udGFpbnMoZWxlbWVudCk7CiAgfQoKICBDbGFzcyBfYnVpbGRDbGFzcyhDbGFzc0VudGl0eSBjbHMpIHsKICAgIGJvb2wgb25seUZvclJ0aSA9IGNvbGxlY3Rvci5jbGFzc2VzT25seU5lZWRlZEZvclJ0aS5jb250YWlucyhjbHMpOwogICAgYm9vbCBoYXNSdGlGaWVsZCA9IF9ydGlOZWVkLmNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKGNscyk7CiAgICBpZiAoX25hdGl2ZURhdGEuaXNKc0ludGVyb3BDbGFzcyhjbHMpKSB7CiAgICAgIC8vIFRPRE8oamFjb2JyKTogY2hlY2sgd2hldGhlciB0aGUgY2xhc3MgaGFzIGFueSBhY3RpdmUgc3RhdGljIGZpZWxkcwogICAgICAvLyBpZiBpdCBkb2VzIG5vdCB3ZSBjYW4gc3VwcHJlc3MgaXQgY29tcGxldGVseS4KICAgICAgb25seUZvclJ0aSA9IHRydWU7CiAgICB9CiAgICBib29sIGlzQ2xvc3VyZUJhc2VDbGFzcyA9IGNscyA9PSBfY29tbW9uRWxlbWVudHMuY2xvc3VyZUNsYXNzOwoKICAgIExpc3Q8TWV0aG9kPiBtZXRob2RzID0gW107CiAgICBMaXN0PFN0dWJNZXRob2Q+IGNhbGxTdHVicyA9IDxTdHViTWV0aG9kPltdOwoKICAgIENsYXNzU3R1YkdlbmVyYXRvciBjbGFzc1N0dWJHZW5lcmF0b3IgPSBuZXcgQ2xhc3NTdHViR2VuZXJhdG9yKAogICAgICAgIF90YXNrLmVtaXR0ZXIsIF9jb21tb25FbGVtZW50cywgX25hbWVyLCBfd29ybGRCdWlsZGVyLCBfY2xvc2VkV29ybGQsCiAgICAgICAgZW5hYmxlTWluaWZpY2F0aW9uOiBfb3B0aW9ucy5lbmFibGVNaW5pZmljYXRpb24pOwogICAgUnVudGltZVR5cGVHZW5lcmF0b3IgcnVudGltZVR5cGVHZW5lcmF0b3IgPSBuZXcgUnVudGltZVR5cGVHZW5lcmF0b3IoCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLAogICAgICAgIF9vdXRwdXRVbml0RGF0YSwKICAgICAgICBfdGFzaywKICAgICAgICBfbmFtZXIsCiAgICAgICAgX3J0aUNoZWNrcywKICAgICAgICBfcnRpRW5jb2Rlcik7CgogICAgdm9pZCB2aXNpdEluc3RhbmNlTWVtYmVyKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgICAgaWYgKCFtZW1iZXIuaXNBYnN0cmFjdCAmJiAhbWVtYmVyLmlzRmllbGQpIHsKICAgICAgICBpZiAobWVtYmVyIGlzISBKU2lnbmF0dXJlTWV0aG9kKSB7CiAgICAgICAgICBNZXRob2QgbWV0aG9kID0gX2J1aWxkTWV0aG9kKG1lbWJlcik7CiAgICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpIG1ldGhvZHMuYWRkKG1ldGhvZCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChtZW1iZXIuaXNHZXR0ZXIgfHwgbWVtYmVyLmlzRmllbGQpIHsKICAgICAgICBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+IHNlbGVjdG9ycyA9CiAgICAgICAgICAgIF93b3JsZEJ1aWxkZXIuaW52b2NhdGlvbnNCeU5hbWUobWVtYmVyLm5hbWUpOwogICAgICAgIGlmIChzZWxlY3RvcnMgIT0gbnVsbCAmJiAhc2VsZWN0b3JzLmlzRW1wdHkpIHsKICAgICAgICAgIE1hcDxqcy5OYW1lLCBqcy5FeHByZXNzaW9uPiBjYWxsU3R1YnNGb3JNZW1iZXIgPQogICAgICAgICAgICAgIGNsYXNzU3R1YkdlbmVyYXRvci5nZW5lcmF0ZUNhbGxTdHVic0ZvckdldHRlcihtZW1iZXIsIHNlbGVjdG9ycyk7CiAgICAgICAgICBjYWxsU3R1YnNGb3JNZW1iZXIuZm9yRWFjaCgoanMuTmFtZSBuYW1lLCBqcy5FeHByZXNzaW9uIGNvZGUpIHsKICAgICAgICAgICAgY2FsbFN0dWJzLmFkZChfYnVpbGRTdHViTWV0aG9kKG5hbWUsIGNvZGUsIGVsZW1lbnQ6IG1lbWJlcikpOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgdm9pZCB2aXNpdE1lbWJlcihNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAgIGlmIChtZW1iZXIuaXNJbnN0YW5jZU1lbWJlcikgewogICAgICAgIHZpc2l0SW5zdGFuY2VNZW1iZXIobWVtYmVyKTsKICAgICAgfQogICAgfQoKICAgIExpc3Q8U3R1Yk1ldGhvZD4gbm9TdWNoTWV0aG9kU3R1YnMgPSA8U3R1Yk1ldGhvZD5bXTsKCiAgICBpZiAoX2JhY2tlbmRVc2FnZS5pc05vU3VjaE1ldGhvZFVzZWQgJiYKICAgICAgICBjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKSB7CiAgICAgIE1hcDxqcy5OYW1lLCBTZWxlY3Rvcj4gc2VsZWN0b3JzID0KICAgICAgICAgIGNsYXNzU3R1YkdlbmVyYXRvci5jb21wdXRlU2VsZWN0b3JzRm9yTnNtSGFuZGxlcnMoKTsKICAgICAgc2VsZWN0b3JzLmZvckVhY2goKGpzLk5hbWUgbmFtZSwgU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgICAgICAvLyBJZiB0aGUgcHJvZ3JhbSBjb250YWlucyBgY29uc3QgU3ltYm9sYCBuYW1lcyB3ZSBoYXZlIHRvIHJldGFpbiB0aGVtLgogICAgICAgIFN0cmluZyBzZWxlY3Rvck5hbWUgPSBzZWxlY3Rvci5uYW1lOwogICAgICAgIGlmIChzZWxlY3Rvci5pc1NldHRlcikgc2VsZWN0b3JOYW1lID0gIiRzZWxlY3Rvck5hbWU9IjsKICAgICAgICBub1N1Y2hNZXRob2RTdHVicy5hZGQoCiAgICAgICAgICAgIGNsYXNzU3R1YkdlbmVyYXRvci5nZW5lcmF0ZVN0dWJGb3JOb1N1Y2hNZXRob2QobmFtZSwgc2VsZWN0b3IpKTsKICAgICAgfSk7CiAgICB9CgogICAgaWYgKGlzQ2xvc3VyZUJhc2VDbGFzcykgewogICAgICAvLyBXZSBhZGQgYSBzcGVjaWFsIGdldHRlciB0byBhbGxvdyBmb3IgdGVhcmluZyBvZmYgYSBjbG9zdXJlIGZyb20gaXRzZWxmLgogICAgICBqcy5OYW1lIG5hbWUgPSBfbmFtZXIuZ2V0dGVyRm9yTWVtYmVyKE5hbWVzLmNhbGwpOwogICAgICBqcy5GdW4gZnVuY3Rpb24gPSBqcy5qcygnZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9Jyk7CiAgICAgIGNhbGxTdHVicy5hZGQoX2J1aWxkU3R1Yk1ldGhvZChuYW1lLCBmdW5jdGlvbikpOwogICAgfQoKICAgIGlmIChfY29tbW9uRWxlbWVudHMuaXNJbnN0YW50aWF0aW9uQ2xhc3MoY2xzKSAmJiAhb25seUZvclJ0aSkgewogICAgICBjYWxsU3R1YnMuYWRkQWxsKF9nZW5lcmF0ZUluc3RhbnRpYXRpb25TdHVicyhjbHMpKTsKICAgIH0KCiAgICAvLyBNaXhpbkFwcGxpY2F0aW9ucyBydW4gdGhyb3VnaCB0aGUgbWVtYmVycyBvZiB0aGVpciBtaXhpbi4gSGVyZSwgd2UgYXJlCiAgICAvLyBvbmx5IGludGVyZXN0ZWQgaW4gZGlyZWN0IG1lbWJlcnMuCiAgICBib29sIGlzU3VwZXJNaXhpbkFwcGxpY2F0aW9uID0gZmFsc2U7CiAgICBpZiAoIW9ubHlGb3JSdGkpIHsKICAgICAgaWYgKF9lbGVtZW50RW52aXJvbm1lbnQuaXNTdXBlck1peGluQXBwbGljYXRpb24oY2xzKSkgewogICAgICAgIExpc3Q8TWVtYmVyRW50aXR5PiBtZW1iZXJzID0gPE1lbWJlckVudGl0eT5bXTsKICAgICAgICB2b2lkIGFkZChNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAgICAgICBpZiAobWVtYmVyLmVuY2xvc2luZ0NsYXNzID09IGNscykgewogICAgICAgICAgICBtZW1iZXJzLmFkZChtZW1iZXIpOwogICAgICAgICAgICBpc1N1cGVyTWl4aW5BcHBsaWNhdGlvbiA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBfZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hMb2NhbENsYXNzTWVtYmVyKGNscywgYWRkKTsKICAgICAgICBfZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hJbmplY3RlZENsYXNzTWVtYmVyKGNscywgYWRkKTsKCiAgICAgICAgaWYgKG1lbWJlcnMuaXNOb3RFbXB0eSkgewogICAgICAgICAgX3NvcnRlci5zb3J0TWVtYmVycyhtZW1iZXJzKS5mb3JFYWNoKHZpc2l0TWVtYmVyKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoIV9lbGVtZW50RW52aXJvbm1lbnQuaXNNaXhpbkFwcGxpY2F0aW9uKGNscykpIHsKICAgICAgICBMaXN0PE1lbWJlckVudGl0eT4gbWVtYmVycyA9IDxNZW1iZXJFbnRpdHk+W107CiAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5mb3JFYWNoTG9jYWxDbGFzc01lbWJlcihjbHMsIG1lbWJlcnMuYWRkKTsKICAgICAgICBfZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hJbmplY3RlZENsYXNzTWVtYmVyKGNscywgbWVtYmVycy5hZGQpOwogICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaENvbnN0cnVjdG9yQm9keShjbHMsIG1lbWJlcnMuYWRkKTsKICAgICAgICBfc29ydGVyLnNvcnRNZW1iZXJzKG1lbWJlcnMpLmZvckVhY2godmlzaXRNZW1iZXIpOwogICAgICB9CiAgICB9CiAgICBib29sIGlzSW50ZXJjZXB0ZWRDbGFzcyA9IF9pbnRlcmNlcHRvckRhdGEuaXNJbnRlcmNlcHRlZENsYXNzKGNscyk7CiAgICBMaXN0PEZpZWxkPiBpbnN0YW5jZUZpZWxkcyA9IG9ubHlGb3JSdGkKICAgICAgICA/IGNvbnN0IDxGaWVsZD5bXQogICAgICAgIDogX2J1aWxkRmllbGRzKAogICAgICAgICAgICBjbHM6IGNscywKICAgICAgICAgICAgdmlzaXRTdGF0aWNzOiBmYWxzZSwKICAgICAgICAgICAgaXNIb2xkZXJJbnRlcmNlcHRlZENsYXNzOiBpc0ludGVyY2VwdGVkQ2xhc3MpOwogICAgTGlzdDxGaWVsZD4gc3RhdGljRmllbGRzRm9yUmVmbGVjdGlvbiA9IG9ubHlGb3JSdGkKICAgICAgICA/IGNvbnN0IDxGaWVsZD5bXQogICAgICAgIDogX2J1aWxkRmllbGRzKAogICAgICAgICAgICBjbHM6IGNscywKICAgICAgICAgICAgdmlzaXRTdGF0aWNzOiB0cnVlLAogICAgICAgICAgICBpc0hvbGRlckludGVyY2VwdGVkQ2xhc3M6IGlzSW50ZXJjZXB0ZWRDbGFzcyk7CgogICAgVHlwZVRlc3RQcm9wZXJ0aWVzIHR5cGVUZXN0cyA9IHJ1bnRpbWVUeXBlR2VuZXJhdG9yLmdlbmVyYXRlSXNUZXN0cygKICAgICAgICBjbHMsIF9nZW5lcmF0ZWRDb2RlLAogICAgICAgIHN0b3JlRnVuY3Rpb25UeXBlSW5NZXRhZGF0YTogX3N0b3JlRnVuY3Rpb25UeXBlc0luTWV0YWRhdGEpOwoKICAgIExpc3Q8U3R1Yk1ldGhvZD4gY2hlY2tlZFNldHRlcnMgPSA8U3R1Yk1ldGhvZD5bXTsKICAgIExpc3Q8U3R1Yk1ldGhvZD4gaXNDaGVja3MgPSA8U3R1Yk1ldGhvZD5bXTsKICAgIGlmIChfbmF0aXZlRGF0YS5pc0pzSW50ZXJvcENsYXNzKGNscykpIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogSW5zdGVhZCBvZiBnZW5lcmF0aW5nIGFsbCBzdHVicyBmb3IgZWFjaAogICAgICAvLyBqcy1pbnRlcm9wIGNsYXNzIHdlIHNob3VsZCBnZW5lcmF0ZSBhIHN0dWIgZm9yIGVhY2ggaW1wbGVtZW50ZWQgY2xhc3MuCiAgICAgIC8vIEN1cnJlbnRseSB3ZSBnZW5lcmF0ZSBkdXBsaWNhdGVzIGlmIGEgY2xhc3MgaXMgaW1wbGVtZW50ZWQgYnkgbXVsdGlwbGUKICAgICAgLy8ganMtaW50ZXJvcCBjbGFzc2VzLgogICAgICB0eXBlVGVzdHMuZm9yRWFjaFByb3BlcnR5KF9zb3J0ZXIsIChqcy5OYW1lIG5hbWUsIGpzLk5vZGUgY29kZSkgewogICAgICAgIF9jbGFzc2VzW19jb21tb25FbGVtZW50cy5qc0phdmFTY3JpcHRPYmplY3RDbGFzc10KICAgICAgICAgICAgLmlzQ2hlY2tzCiAgICAgICAgICAgIC5hZGQoX2J1aWxkU3R1Yk1ldGhvZChuYW1lLCBjb2RlKSk7CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChGaWVsZCBmaWVsZCBpbiBpbnN0YW5jZUZpZWxkcykgewogICAgICAgIGlmIChmaWVsZC5uZWVkc0NoZWNrZWRTZXR0ZXIpIHsKICAgICAgICAgIGFzc2VydCghZmllbGQubmVlZHNVbmNoZWNrZWRTZXR0ZXIpOwogICAgICAgICAgRmllbGRFbnRpdHkgZWxlbWVudCA9IGZpZWxkLmVsZW1lbnQ7CiAgICAgICAgICBqcy5FeHByZXNzaW9uIGNvZGUgPSBfZ2VuZXJhdGVkQ29kZVtlbGVtZW50XTsKICAgICAgICAgIGlmIChjb2RlID09IG51bGwpIHsKICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3RhdGljIHR5cGVzIGFyZSBub3QgaG9ub3VyZWQgaW4gdGhlIGR5bmFtaWMKICAgICAgICAgICAgLy8gdXNlcyBjcmVhdGVkIGluIGNvZGVnZW4sIGxlYWRpbmcgdG8gZGVhZCBjb2RlLCBhcyBrbm93biBieSB0aGUKICAgICAgICAgICAgLy8gY2xvc2VkIHdvcmxkIGNvbXB1dGF0aW9uLCBiZWluZyB0cmlnZ2VyZWQgYnkgdGhlIGNvZGVnZW4KICAgICAgICAgICAgLy8gZW5xdWV1ZXIuIFdlIGNhdXRpb3VzbHkgZ2VuZXJhdGUgYW4gZW1wdHkgZnVuY3Rpb24gZm9yIHRoaXMgY2FzZS4KICAgICAgICAgICAgY29kZSA9IGpzLmpzKCJmdW5jdGlvbigpIHt9Iik7CiAgICAgICAgICB9CiAgICAgICAgICBqcy5OYW1lIG5hbWUgPSBfbmFtZXIuZGVyaXZlU2V0dGVyTmFtZShmaWVsZC5hY2Nlc3Nvck5hbWUpOwogICAgICAgICAgY2hlY2tlZFNldHRlcnMuYWRkKF9idWlsZFN0dWJNZXRob2QobmFtZSwgY29kZSwgZWxlbWVudDogZWxlbWVudCkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdHlwZVRlc3RzLmZvckVhY2hQcm9wZXJ0eShfc29ydGVyLCAoanMuTmFtZSBuYW1lLCBqcy5Ob2RlIGNvZGUpIHsKICAgICAgICBpc0NoZWNrcy5hZGQoX2J1aWxkU3R1Yk1ldGhvZChuYW1lLCBjb2RlKSk7CiAgICAgIH0pOwogICAgfQoKICAgIGpzLk5hbWUgbmFtZSA9IF9uYW1lci5jbGFzc05hbWUoY2xzKTsKICAgIFN0cmluZyBob2xkZXJOYW1lID0gX25hbWVyLmdsb2JhbE9iamVjdEZvckNsYXNzKGNscyk7CiAgICAvLyBUT0RPKGZsb2l0c2NoKTogd2Ugc2hvdWxkbid0IHVwZGF0ZSB0aGUgcmVnaXN0cnkgaW4gdGhlIG1pZGRsZSBvZgogICAgLy8gYnVpbGRpbmcgYSBjbGFzcy4KICAgIEhvbGRlciBob2xkZXIgPSBfcmVnaXN0cnkucmVnaXN0ZXJIb2xkZXIoaG9sZGVyTmFtZSk7CiAgICBib29sIGlzSW5zdGFudGlhdGVkID0gIV9uYXRpdmVEYXRhLmlzSnNJbnRlcm9wQ2xhc3MoY2xzKSAmJgogICAgICAgIF93b3JsZEJ1aWxkZXIuZGlyZWN0bHlJbnN0YW50aWF0ZWRDbGFzc2VzLmNvbnRhaW5zKGNscyk7CgogICAgQ2xhc3MgcmVzdWx0OwogICAgaWYgKF9lbGVtZW50RW52aXJvbm1lbnQuaXNNaXhpbkFwcGxpY2F0aW9uKGNscykgJiYKICAgICAgICAhb25seUZvclJ0aSAmJgogICAgICAgICFpc1N1cGVyTWl4aW5BcHBsaWNhdGlvbikgewogICAgICBhc3NlcnQoIV9uYXRpdmVEYXRhLmlzTmF0aXZlQ2xhc3MoY2xzKSk7CiAgICAgIGFzc2VydChtZXRob2RzLmlzRW1wdHkpOwogICAgICBhc3NlcnQoIWlzQ2xvc3VyZUJhc2VDbGFzcyk7CgogICAgICByZXN1bHQgPSBuZXcgTWl4aW5BcHBsaWNhdGlvbigKICAgICAgICAgIGNscywKICAgICAgICAgIG5hbWUsCiAgICAgICAgICBob2xkZXIsCiAgICAgICAgICBpbnN0YW5jZUZpZWxkcywKICAgICAgICAgIHN0YXRpY0ZpZWxkc0ZvclJlZmxlY3Rpb24sCiAgICAgICAgICBjYWxsU3R1YnMsCiAgICAgICAgICBjaGVja2VkU2V0dGVycywKICAgICAgICAgIGlzQ2hlY2tzLAogICAgICAgICAgdHlwZVRlc3RzLmZ1bmN0aW9uVHlwZUluZGV4LAogICAgICAgICAgaXNEaXJlY3RseUluc3RhbnRpYXRlZDogaXNJbnN0YW50aWF0ZWQsCiAgICAgICAgICBoYXNSdGlGaWVsZDogaGFzUnRpRmllbGQsCiAgICAgICAgICBvbmx5Rm9yUnRpOiBvbmx5Rm9yUnRpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IG5ldyBDbGFzcygKICAgICAgICAgIGNscywKICAgICAgICAgIG5hbWUsCiAgICAgICAgICBob2xkZXIsCiAgICAgICAgICBtZXRob2RzLAogICAgICAgICAgaW5zdGFuY2VGaWVsZHMsCiAgICAgICAgICBzdGF0aWNGaWVsZHNGb3JSZWZsZWN0aW9uLAogICAgICAgICAgY2FsbFN0dWJzLAogICAgICAgICAgbm9TdWNoTWV0aG9kU3R1YnMsCiAgICAgICAgICBjaGVja2VkU2V0dGVycywKICAgICAgICAgIGlzQ2hlY2tzLAogICAgICAgICAgdHlwZVRlc3RzLmZ1bmN0aW9uVHlwZUluZGV4LAogICAgICAgICAgaXNEaXJlY3RseUluc3RhbnRpYXRlZDogaXNJbnN0YW50aWF0ZWQsCiAgICAgICAgICBoYXNSdGlGaWVsZDogaGFzUnRpRmllbGQsCiAgICAgICAgICBvbmx5Rm9yUnRpOiBvbmx5Rm9yUnRpLAogICAgICAgICAgaXNOYXRpdmU6IF9uYXRpdmVEYXRhLmlzTmF0aXZlQ2xhc3MoY2xzKSwKICAgICAgICAgIGlzQ2xvc3VyZUJhc2VDbGFzczogaXNDbG9zdXJlQmFzZUNsYXNzLAogICAgICAgICAgaXNTb2Z0RGVmZXJyZWQ6IF9pc1NvZnREZWZlcnJlZChjbHMpLAogICAgICAgICAgaXNTdXBlck1peGluQXBwbGljYXRpb246IGlzU3VwZXJNaXhpbkFwcGxpY2F0aW9uKTsKICAgIH0KICAgIF9jbGFzc2VzW2Nsc10gPSByZXN1bHQ7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgYm9vbCBfbWV0aG9kTmVlZHNTdHVicyhGdW5jdGlvbkVudGl0eSBtZXRob2QpIHsKICAgIGlmIChtZXRob2QgaXMgSkdlbmVyYXRvckJvZHkpIHJldHVybiBmYWxzZTsKICAgIGlmIChtZXRob2QgaXMgQ29uc3RydWN0b3JCb2R5RW50aXR5KSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gbWV0aG9kLnBhcmFtZXRlclN0cnVjdHVyZS5vcHRpb25hbFBhcmFtZXRlcnMgIT0gMCB8fAogICAgICAgIG1ldGhvZC5wYXJhbWV0ZXJTdHJ1Y3R1cmUudHlwZVBhcmFtZXRlcnMgIT0gMDsKICB9CgogIGJvb2wgX21ldGhvZENhbkJlQXBwbGllZChGdW5jdGlvbkVudGl0eSBtZXRob2QpIHsKICAgIHJldHVybiBfYmFja2VuZFVzYWdlLmlzRnVuY3Rpb25BcHBseVVzZWQgJiYKICAgICAgICBfaW5mZXJyZWREYXRhLmdldE1pZ2h0QmVQYXNzZWRUb0FwcGx5KG1ldGhvZCk7CiAgfQoKICAvKiBNYXAgfCBMaXN0ICovIF9jb21wdXRlUGFyYW1ldGVyRGVmYXVsdFZhbHVlcyhGdW5jdGlvbkVudGl0eSBtZXRob2QpIHsKICAgIHZhciAvKiBNYXAgfCBMaXN0ICovIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlczsKICAgIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUgPSBtZXRob2QucGFyYW1ldGVyU3RydWN0dXJlOwogICAgaWYgKHBhcmFtZXRlclN0cnVjdHVyZS5uYW1lZFBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMgPSBuZXcgTWFwPFN0cmluZywgQ29uc3RhbnRWYWx1ZT4oKTsKICAgICAgX3dvcmxkQnVpbGRlci5mb3JFYWNoUGFyYW1ldGVyKG1ldGhvZCwKICAgICAgICAgIChEYXJ0VHlwZSB0eXBlLCBTdHJpbmcgbmFtZSwgQ29uc3RhbnRWYWx1ZSBkZWZhdWx0VmFsdWUpIHsKICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlLm5hbWVkUGFyYW1ldGVycy5jb250YWlucyhuYW1lKSkgewogICAgICAgICAgYXNzZXJ0KGRlZmF1bHRWYWx1ZSAhPSBudWxsKTsKICAgICAgICAgIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlc1tuYW1lXSA9IGRlZmF1bHRWYWx1ZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzID0gPENvbnN0YW50VmFsdWU+W107CiAgICAgIGludCBpbmRleCA9IDA7CiAgICAgIF93b3JsZEJ1aWxkZXIuZm9yRWFjaFBhcmFtZXRlcihtZXRob2QsCiAgICAgICAgICAoRGFydFR5cGUgdHlwZSwgU3RyaW5nIG5hbWUsIENvbnN0YW50VmFsdWUgZGVmYXVsdFZhbHVlKSB7CiAgICAgICAgaWYgKGluZGV4ID49IHBhcmFtZXRlclN0cnVjdHVyZS5yZXF1aXJlZFBhcmFtZXRlcnMpIHsKICAgICAgICAgIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcy5hZGQoZGVmYXVsdFZhbHVlKTsKICAgICAgICB9CiAgICAgICAgaW5kZXgrKzsKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzOwogIH0KCiAgRGFydE1ldGhvZCBfYnVpbGRNZXRob2QoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgewogICAganMuTmFtZSBuYW1lID0gX25hbWVyLm1ldGhvZFByb3BlcnR5TmFtZShlbGVtZW50KTsKICAgIGpzLkV4cHJlc3Npb24gY29kZSA9IF9nZW5lcmF0ZWRDb2RlW2VsZW1lbnRdOwoKICAgIC8vIFRPRE8oa2FzcGVybCk6IEZpZ3VyZSBvdXQgdW5kZXIgd2hpY2ggY29uZGl0aW9ucyBjb2RlIGlzIG51bGwuCiAgICBpZiAoY29kZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKCiAgICBib29sIGNhblRlYXJPZmYgPSBmYWxzZTsKICAgIGpzLk5hbWUgdGVhck9mZk5hbWU7CiAgICBib29sIGlzQ2xvc3VyZUNhbGxNZXRob2QgPSBmYWxzZTsKICAgIGJvb2wgaXNOb3RBcHBseVRhcmdldCA9CiAgICAgICAgIWVsZW1lbnQuaXNGdW5jdGlvbiB8fCBlbGVtZW50LmlzR2V0dGVyIHx8IGVsZW1lbnQuaXNTZXR0ZXI7CgogICAgYm9vbCBjYW5CZUFwcGxpZWQgPSBfbWV0aG9kQ2FuQmVBcHBsaWVkKGVsZW1lbnQpOwoKICAgIGpzLk5hbWUgYWxpYXNOYW1lID0gX3N1cGVyTWVtYmVyRGF0YS5pc0FsaWFzZWRTdXBlck1lbWJlcihlbGVtZW50KQogICAgICAgID8gX25hbWVyLmFsaWFzZWRTdXBlck1lbWJlclByb3BlcnR5TmFtZShlbGVtZW50KQogICAgICAgIDogbnVsbDsKCiAgICBpZiAoaXNOb3RBcHBseVRhcmdldCkgewogICAgICBjYW5UZWFyT2ZmID0gZmFsc2U7CiAgICB9IGVsc2UgewogICAgICBpZiAoZWxlbWVudC5lbmNsb3NpbmdDbGFzcy5pc0Nsb3N1cmUpIHsKICAgICAgICBjYW5UZWFyT2ZmID0gZmFsc2U7CiAgICAgICAgaXNDbG9zdXJlQ2FsbE1ldGhvZCA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQ2FyZWZ1bCB3aXRoIG9wZXJhdG9ycy4KICAgICAgICBjYW5UZWFyT2ZmID0gX3dvcmxkQnVpbGRlci5oYXNJbnZva2VkR2V0dGVyKGVsZW1lbnQpOwogICAgICAgIGFzc2VydChjYW5UZWFyT2ZmIHx8CiAgICAgICAgICAgICFfd29ybGRCdWlsZGVyLm1ldGhvZHNOZWVkaW5nU3VwZXJHZXR0ZXIuY29udGFpbnMoZWxlbWVudCkpOwogICAgICAgIHRlYXJPZmZOYW1lID0gX25hbWVyLmdldHRlckZvckVsZW1lbnQoZWxlbWVudCk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoY2FuVGVhck9mZikgewogICAgICBhc3NlcnQoZWxlbWVudCBpcyEgQ29uc3RydWN0b3JFbnRpdHksIGZhaWxlZEF0KGVsZW1lbnQpKTsKICAgICAgYXNzZXJ0KGVsZW1lbnQgaXMhIENvbnN0cnVjdG9yQm9keUVudGl0eSwgZmFpbGVkQXQoZWxlbWVudCkpOwogICAgfQoKICAgIGJvb2wgaXNJbnRlcmNlcHRlZCA9CiAgICAgICAgX2Nsb3NlZFdvcmxkLmludGVyY2VwdG9yRGF0YS5pc0ludGVyY2VwdGVkTWV0aG9kKGVsZW1lbnQpOwoKICAgIGpzLk5hbWUgY2FsbE5hbWUgPSBudWxsOwogICAgaWYgKGNhblRlYXJPZmYpIHsKICAgICAgU2VsZWN0b3IgY2FsbFNlbGVjdG9yID0KICAgICAgICAgIG5ldyBTZWxlY3Rvci5mcm9tRWxlbWVudChlbGVtZW50KS50b0NhbGxTZWxlY3RvcigpOwogICAgICBjYWxsTmFtZSA9IF9uYW1lci5pbnZvY2F0aW9uTmFtZShjYWxsU2VsZWN0b3IpOwogICAgfQoKICAgIERhcnRUeXBlIG1lbWJlclR5cGUgPSBfZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZShlbGVtZW50KTsKICAgIGpzLkV4cHJlc3Npb24gZnVuY3Rpb25UeXBlOwogICAgaWYgKGNhblRlYXJPZmYpIHsKICAgICAgT3V0cHV0VW5pdCBvdXRwdXRVbml0ID0gX291dHB1dFVuaXREYXRhLm91dHB1dFVuaXRGb3JNZW1iZXIoZWxlbWVudCk7CiAgICAgIGZ1bmN0aW9uVHlwZSA9IF9nZW5lcmF0ZUZ1bmN0aW9uVHlwZShtZW1iZXJUeXBlLCBvdXRwdXRVbml0KTsKICAgIH0KCiAgICBGdW5jdGlvbkVudGl0eSBtZXRob2QgPSBlbGVtZW50OwogICAgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSA9IG1ldGhvZC5wYXJhbWV0ZXJTdHJ1Y3R1cmU7CiAgICBpbnQgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA9IHBhcmFtZXRlclN0cnVjdHVyZS5yZXF1aXJlZFBhcmFtZXRlcnM7CiAgICB2YXIgLyogTGlzdCB8IE1hcCAqLyBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXM7CiAgICBpbnQgYXBwbHlJbmRleCA9IDA7CiAgICBpZiAoY2FuQmVBcHBsaWVkKSB7CiAgICAgIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcyA9IF9jb21wdXRlUGFyYW1ldGVyRGVmYXVsdFZhbHVlcyhtZXRob2QpOwogICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlLnR5cGVQYXJhbWV0ZXJzID4gMCkgewogICAgICAgIGFwcGx5SW5kZXggPSAxOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIG5ldyBJbnN0YW5jZU1ldGhvZChlbGVtZW50LCBuYW1lLCBjb2RlLAogICAgICAgIF9nZW5lcmF0ZVBhcmFtZXRlclN0dWJzKGVsZW1lbnQsIGNhblRlYXJPZmYsIGNhbkJlQXBwbGllZCksIGNhbGxOYW1lLAogICAgICAgIG5lZWRzVGVhck9mZjogY2FuVGVhck9mZiwKICAgICAgICB0ZWFyT2ZmTmFtZTogdGVhck9mZk5hbWUsCiAgICAgICAgaXNDbG9zdXJlQ2FsbE1ldGhvZDogaXNDbG9zdXJlQ2FsbE1ldGhvZCwKICAgICAgICBpc0ludGVyY2VwdGVkOiBpc0ludGVyY2VwdGVkLAogICAgICAgIGFsaWFzTmFtZTogYWxpYXNOYW1lLAogICAgICAgIGNhbkJlQXBwbGllZDogY2FuQmVBcHBsaWVkLAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzOiBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMsCiAgICAgICAgZnVuY3Rpb25UeXBlOiBmdW5jdGlvblR5cGUsCiAgICAgICAgYXBwbHlJbmRleDogYXBwbHlJbmRleCk7CiAgfQoKICBqcy5FeHByZXNzaW9uIF9nZW5lcmF0ZUZ1bmN0aW9uVHlwZSgKICAgICAgRnVuY3Rpb25UeXBlIHR5cGUsIE91dHB1dFVuaXQgb3V0cHV0VW5pdCkgewogICAgaWYgKHR5cGUuY29udGFpbnNUeXBlVmFyaWFibGVzKSB7CiAgICAgIGpzLkV4cHJlc3Npb24gdGhpc0FjY2VzcyA9IGpzLmpzKHIndGhpcy4kcmVjZWl2ZXInKTsKICAgICAgcmV0dXJuIF9ydGlFbmNvZGVyLmdldFNpZ25hdHVyZUVuY29kaW5nKF90YXNrLmVtaXR0ZXIsIHR5cGUsIHRoaXNBY2Nlc3MpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF90YXNrLm1ldGFkYXRhQ29sbGVjdG9yLnJlaWZ5VHlwZSh0eXBlLCBvdXRwdXRVbml0KTsKICAgIH0KICB9CgogIExpc3Q8UGFyYW1ldGVyU3R1Yk1ldGhvZD4gX2dlbmVyYXRlUGFyYW1ldGVyU3R1YnMoCiAgICAgIEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQsIGJvb2wgY2FuVGVhck9mZiwgYm9vbCBjYW5CZUFwcGxpZWQpIHsKICAgIGlmICghX21ldGhvZE5lZWRzU3R1YnMoZWxlbWVudCkpIHJldHVybiBjb25zdCA8UGFyYW1ldGVyU3R1Yk1ldGhvZD5bXTsKCiAgICBQYXJhbWV0ZXJTdHViR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBQYXJhbWV0ZXJTdHViR2VuZXJhdG9yKAogICAgICAgIF90YXNrLAogICAgICAgIF9uYW1lciwKICAgICAgICBfcnRpRW5jb2RlciwKICAgICAgICBfbmF0aXZlRGF0YSwKICAgICAgICBfaW50ZXJjZXB0b3JEYXRhLAogICAgICAgIF93b3JsZEJ1aWxkZXIsCiAgICAgICAgX2Nsb3NlZFdvcmxkLAogICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5KTsKICAgIHJldHVybiBnZW5lcmF0b3IuZ2VuZXJhdGVQYXJhbWV0ZXJTdHVicyhlbGVtZW50LAogICAgICAgIGNhblRlYXJPZmY6IGNhblRlYXJPZmYsIGNhbkJlQXBwbGllZDogY2FuQmVBcHBsaWVkKTsKICB9CgogIExpc3Q8U3R1Yk1ldGhvZD4gX2dlbmVyYXRlSW5zdGFudGlhdGlvblN0dWJzKENsYXNzRW50aXR5IGluc3RhbnRpYXRpb25DbGFzcykgewogICAgSW5zdGFudGlhdGlvblN0dWJHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IEluc3RhbnRpYXRpb25TdHViR2VuZXJhdG9yKAogICAgICAgIF90YXNrLAogICAgICAgIF9jb21tb25FbGVtZW50cywKICAgICAgICBfbmFtZXIsCiAgICAgICAgX3dvcmxkQnVpbGRlciwKICAgICAgICBfY2xvc2VkV29ybGQsCiAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kpOwogICAgcmV0dXJuIGdlbmVyYXRvci5nZW5lcmF0ZVN0dWJzKGluc3RhbnRpYXRpb25DbGFzcywgbnVsbCk7CiAgfQoKICAvLy8gQnVpbGRzIGEgc3R1YiBtZXRob2QuCiAgLy8vCiAgLy8vIFN0dWIgbWV0aG9kcyBtYXkgaGF2ZSBhbiBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQgZm9yIGNvZGUtc2l6ZQogIC8vLyBhdHRyaWJ1dGlvbi4KICBNZXRob2QgX2J1aWxkU3R1Yk1ldGhvZChqcy5OYW1lIG5hbWUsIGpzLkV4cHJlc3Npb24gY29kZSwKICAgICAge01lbWJlckVudGl0eSBlbGVtZW50fSkgewogICAgcmV0dXJuIG5ldyBTdHViTWV0aG9kKG5hbWUsIGNvZGUsIGVsZW1lbnQ6IGVsZW1lbnQpOwogIH0KCiAgLy8gVGhlIGdldEludGVyY2VwdG9yIG1ldGhvZHMgZGlyZWN0bHkgYWNjZXNzIHRoZSBwcm90b3R5cGUgb2YgY2xhc3Nlcy4KICAvLyBXZSBtdXN0IGV2YWx1YXRlIHRoZXNlIGNsYXNzZXMgZWFnZXJseSBzbyB0aGF0IHRoZSBwcm90b3R5cGUgaXMKICAvLyBhY2Nlc3NpYmxlLgogIHZvaWQgX21hcmtFYWdlckludGVyY2VwdG9yQ2xhc3NlcygpIHsKICAgIEl0ZXJhYmxlPGpzLk5hbWU+IG5hbWVzID0KICAgICAgICBfb25lU2hvdEludGVyY2VwdG9yRGF0YS5zcGVjaWFsaXplZEdldEludGVyY2VwdG9yTmFtZXM7CiAgICBmb3IgKGpzLk5hbWUgbmFtZSBpbiBuYW1lcykgewogICAgICBmb3IgKENsYXNzRW50aXR5IGVsZW1lbnQKICAgICAgICAgIGluIF9vbmVTaG90SW50ZXJjZXB0b3JEYXRhLmdldFNwZWNpYWxpemVkR2V0SW50ZXJjZXB0b3JzRm9yKG5hbWUpKSB7CiAgICAgICAgQ2xhc3MgY2xzID0gX2NsYXNzZXNbZWxlbWVudF07CiAgICAgICAgaWYgKGNscyAhPSBudWxsKSBjbHMuaXNFYWdlciA9IHRydWU7CiAgICAgIH0KICAgIH0KICB9CgogIEl0ZXJhYmxlPFN0YXRpY1N0dWJNZXRob2Q+IF9nZW5lcmF0ZUdldEludGVyY2VwdG9yTWV0aG9kcygpIHsKICAgIEludGVyY2VwdG9yU3R1YkdlbmVyYXRvciBzdHViR2VuZXJhdG9yID0gbmV3IEludGVyY2VwdG9yU3R1YkdlbmVyYXRvcigKICAgICAgICBfb3B0aW9ucywKICAgICAgICBfY29tbW9uRWxlbWVudHMsCiAgICAgICAgX3Rhc2ssCiAgICAgICAgX25hdGl2ZUNvZGVnZW5FbnF1ZXVlciwKICAgICAgICBfbmFtZXIsCiAgICAgICAgX29uZVNob3RJbnRlcmNlcHRvckRhdGEsCiAgICAgICAgX2N1c3RvbUVsZW1lbnRzQ29kZWdlbkFuYWx5c2lzLAogICAgICAgIF93b3JsZEJ1aWxkZXIsCiAgICAgICAgX2Nsb3NlZFdvcmxkKTsKCiAgICBTdHJpbmcgaG9sZGVyTmFtZSA9CiAgICAgICAgX25hbWVyLmdsb2JhbE9iamVjdEZvckxpYnJhcnkoX2NvbW1vbkVsZW1lbnRzLmludGVyY2VwdG9yc0xpYnJhcnkpOwogICAgLy8gVE9ETyhmbG9pdHNjaCk6IHdlIHNob3VsZG4ndCB1cGRhdGUgdGhlIHJlZ2lzdHJ5IGluIHRoZSBtaWRkbGUgb2YKICAgIC8vIGdlbmVyYXRpbmcgdGhlIGludGVyY2VwdG9yIG1ldGhvZHMuCiAgICBIb2xkZXIgaG9sZGVyID0gX3JlZ2lzdHJ5LnJlZ2lzdGVySG9sZGVyKGhvbGRlck5hbWUpOwoKICAgIEl0ZXJhYmxlPGpzLk5hbWU+IG5hbWVzID0KICAgICAgICBfb25lU2hvdEludGVyY2VwdG9yRGF0YS5zcGVjaWFsaXplZEdldEludGVyY2VwdG9yTmFtZXM7CiAgICByZXR1cm4gbmFtZXMubWFwKChqcy5OYW1lIG5hbWUpIHsKICAgICAgU2V0PENsYXNzRW50aXR5PiBjbGFzc2VzID0KICAgICAgICAgIF9vbmVTaG90SW50ZXJjZXB0b3JEYXRhLmdldFNwZWNpYWxpemVkR2V0SW50ZXJjZXB0b3JzRm9yKG5hbWUpOwogICAgICBqcy5FeHByZXNzaW9uIGNvZGUgPSBzdHViR2VuZXJhdG9yLmdlbmVyYXRlR2V0SW50ZXJjZXB0b3JNZXRob2QoY2xhc3Nlcyk7CiAgICAgIHJldHVybiBuZXcgU3RhdGljU3R1Yk1ldGhvZChuYW1lLCBob2xkZXIsIGNvZGUpOwogICAgfSk7CiAgfQoKICBMaXN0PEZpZWxkPiBfYnVpbGRGaWVsZHMoCiAgICAgIHtib29sIHZpc2l0U3RhdGljczogZmFsc2UsCiAgICAgIGJvb2wgaXNIb2xkZXJJbnRlcmNlcHRlZENsYXNzOiBmYWxzZSwKICAgICAgTGlicmFyeUVudGl0eSBsaWJyYXJ5LAogICAgICBDbGFzc0VudGl0eSBjbHN9KSB7CiAgICBMaXN0PEZpZWxkPiBmaWVsZHMgPSA8RmllbGQ+W107CgogICAgdm9pZCB2aXNpdEZpZWxkKEZpZWxkRW50aXR5IGZpZWxkLCBqcy5OYW1lIG5hbWUsIGpzLk5hbWUgYWNjZXNzb3JOYW1lLAogICAgICAgIGJvb2wgbmVlZHNHZXR0ZXIsIGJvb2wgbmVlZHNTZXR0ZXIsIGJvb2wgbmVlZHNDaGVja2VkU2V0dGVyKSB7CiAgICAgIGludCBnZXR0ZXJGbGFncyA9IDA7CiAgICAgIGlmIChuZWVkc0dldHRlcikgewogICAgICAgIGlmICh2aXNpdFN0YXRpY3MgfHwKICAgICAgICAgICAgIV9pbnRlcmNlcHRvckRhdGEuZmllbGRIYXNJbnRlcmNlcHRlZEdldHRlcihmaWVsZCkpIHsKICAgICAgICAgIGdldHRlckZsYWdzID0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZ2V0dGVyRmxhZ3MgKz0gMjsKICAgICAgICAgIC8vIFRPRE8oc3JhKTogJ2lzSW50ZXJjZXB0ZWRDbGFzcycgbWlnaHQgbm90IGJlIHRoZSBjb3JyZWN0IHRlc3QKICAgICAgICAgIC8vIGZvciBtZXRob2RzIGZvcmNlZCB0byB1c2UgdGhlIGludGVyY2VwdG9yIGNvbnZlbnRpb24gYmVjYXVzZQogICAgICAgICAgLy8gdGhlIG1ldGhvZCdzIGNsYXNzIHdhcyBlbHNld2hlcmUgbWl4ZWQtaW4gdG8gYW4gaW50ZXJjZXB0b3IuCiAgICAgICAgICBpZiAoIWlzSG9sZGVySW50ZXJjZXB0ZWRDbGFzcykgewogICAgICAgICAgICBnZXR0ZXJGbGFncyArPSAxOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgaW50IHNldHRlckZsYWdzID0gMDsKICAgICAgaWYgKG5lZWRzU2V0dGVyKSB7CiAgICAgICAgaWYgKHZpc2l0U3RhdGljcyB8fAogICAgICAgICAgICAhX2ludGVyY2VwdG9yRGF0YS5maWVsZEhhc0ludGVyY2VwdGVkU2V0dGVyKGZpZWxkKSkgewogICAgICAgICAgc2V0dGVyRmxhZ3MgPSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzZXR0ZXJGbGFncyArPSAyOwogICAgICAgICAgaWYgKCFpc0hvbGRlckludGVyY2VwdGVkQ2xhc3MpIHsKICAgICAgICAgICAgc2V0dGVyRmxhZ3MgKz0gMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIEZpZWxkQW5hbHlzaXNEYXRhIGZpZWxkRGF0YSA9IF9maWVsZEFuYWx5c2lzLmdldEZpZWxkRGF0YShmaWVsZCk7CiAgICAgIENvbnN0YW50VmFsdWUgaW5pdGlhbGl6ZXJJbkFsbG9jYXRvcjsKICAgICAgaWYgKGZpZWxkRGF0YS5pc0luaXRpYWxpemVkSW5BbGxvY2F0b3IpIHsKICAgICAgICBpbml0aWFsaXplckluQWxsb2NhdG9yID0gZmllbGREYXRhLmluaXRpYWxWYWx1ZTsKICAgICAgfQogICAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50VmFsdWU7CiAgICAgIGlmIChmaWVsZERhdGEuaXNFZmZlY3RpdmVseUNvbnN0YW50KSB7CiAgICAgICAgY29uc3RhbnRWYWx1ZSA9IGZpZWxkRGF0YS5jb25zdGFudFZhbHVlOwogICAgICB9CgogICAgICBmaWVsZHMuYWRkKG5ldyBGaWVsZCgKICAgICAgICAgIGZpZWxkLAogICAgICAgICAgbmFtZSwKICAgICAgICAgIGFjY2Vzc29yTmFtZSwKICAgICAgICAgIGdldHRlckZsYWdzLAogICAgICAgICAgc2V0dGVyRmxhZ3MsCiAgICAgICAgICBuZWVkc0NoZWNrZWRTZXR0ZXIsCiAgICAgICAgICBpbml0aWFsaXplckluQWxsb2NhdG9yLAogICAgICAgICAgY29uc3RhbnRWYWx1ZSwKICAgICAgICAgIGZpZWxkRGF0YS5pc0VsaWRlZCkpOwogICAgfQoKICAgIEZpZWxkVmlzaXRvciB2aXNpdG9yID0gbmV3IEZpZWxkVmlzaXRvcihfb3B0aW9ucywgX2VsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgICBfY29tbW9uRWxlbWVudHMsIF93b3JsZEJ1aWxkZXIsIF9uYXRpdmVEYXRhLCBfbmFtZXIsIF9jbG9zZWRXb3JsZCk7CiAgICB2aXNpdG9yLnZpc2l0RmllbGRzKHZpc2l0RmllbGQsCiAgICAgICAgdmlzaXRTdGF0aWNzOiB2aXNpdFN0YXRpY3MsIGxpYnJhcnk6IGxpYnJhcnksIGNsczogY2xzKTsKCiAgICByZXR1cm4gZmllbGRzOwogIH0KCiAgSXRlcmFibGU8U3RhdGljU3R1Yk1ldGhvZD4gX2dlbmVyYXRlT25lU2hvdEludGVyY2VwdG9ycygpIHsKICAgIEludGVyY2VwdG9yU3R1YkdlbmVyYXRvciBzdHViR2VuZXJhdG9yID0gbmV3IEludGVyY2VwdG9yU3R1YkdlbmVyYXRvcigKICAgICAgICBfb3B0aW9ucywKICAgICAgICBfY29tbW9uRWxlbWVudHMsCiAgICAgICAgX3Rhc2ssCiAgICAgICAgX25hdGl2ZUNvZGVnZW5FbnF1ZXVlciwKICAgICAgICBfbmFtZXIsCiAgICAgICAgX29uZVNob3RJbnRlcmNlcHRvckRhdGEsCiAgICAgICAgX2N1c3RvbUVsZW1lbnRzQ29kZWdlbkFuYWx5c2lzLAogICAgICAgIF93b3JsZEJ1aWxkZXIsCiAgICAgICAgX2Nsb3NlZFdvcmxkKTsKCiAgICBTdHJpbmcgaG9sZGVyTmFtZSA9CiAgICAgICAgX25hbWVyLmdsb2JhbE9iamVjdEZvckxpYnJhcnkoX2NvbW1vbkVsZW1lbnRzLmludGVyY2VwdG9yc0xpYnJhcnkpOwogICAgLy8gVE9ETyhmbG9pdHNjaCk6IHdlIHNob3VsZG4ndCB1cGRhdGUgdGhlIHJlZ2lzdHJ5IGluIHRoZSBtaWRkbGUgb2YKICAgIC8vIGdlbmVyYXRpbmcgdGhlIGludGVyY2VwdG9yIG1ldGhvZHMuCiAgICBIb2xkZXIgaG9sZGVyID0gX3JlZ2lzdHJ5LnJlZ2lzdGVySG9sZGVyKGhvbGRlck5hbWUpOwoKICAgIExpc3Q8anMuTmFtZT4gbmFtZXMgPSBfb25lU2hvdEludGVyY2VwdG9yRGF0YS5vbmVTaG90SW50ZXJjZXB0b3JOYW1lczsKICAgIHJldHVybiBuYW1lcy5tYXAoKGpzLk5hbWUgbmFtZSkgewogICAgICBqcy5FeHByZXNzaW9uIGNvZGUgPSBzdHViR2VuZXJhdG9yLmdlbmVyYXRlT25lU2hvdEludGVyY2VwdG9yKG5hbWUpOwogICAgICByZXR1cm4gbmV3IFN0YXRpY1N0dWJNZXRob2QobmFtZSwgaG9sZGVyLCBjb2RlKTsKICAgIH0pOwogIH0KCiAgU3RhdGljRGFydE1ldGhvZCBfYnVpbGRTdGF0aWNNZXRob2QoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgewogICAganMuTmFtZSBuYW1lID0gX25hbWVyLm1ldGhvZFByb3BlcnR5TmFtZShlbGVtZW50KTsKICAgIFN0cmluZyBob2xkZXIgPSBfbmFtZXIuZ2xvYmFsT2JqZWN0Rm9yTWVtYmVyKGVsZW1lbnQpOwogICAganMuRXhwcmVzc2lvbiBjb2RlID0gX2dlbmVyYXRlZENvZGVbZWxlbWVudF07CgogICAgYm9vbCBpc0FwcGx5VGFyZ2V0ID0KICAgICAgICAhZWxlbWVudC5pc0NvbnN0cnVjdG9yICYmICFlbGVtZW50LmlzR2V0dGVyICYmICFlbGVtZW50LmlzU2V0dGVyOwogICAgYm9vbCBjYW5CZUFwcGxpZWQgPSBfbWV0aG9kQ2FuQmVBcHBsaWVkKGVsZW1lbnQpOwoKICAgIGJvb2wgbmVlZHNUZWFyT2ZmID0gaXNBcHBseVRhcmdldCAmJgogICAgICAgIF93b3JsZEJ1aWxkZXIuc3RhdGljRnVuY3Rpb25zTmVlZGluZ0dldHRlci5jb250YWlucyhlbGVtZW50KTsKCiAgICBqcy5OYW1lIHRlYXJPZmZOYW1lID0KICAgICAgICBuZWVkc1RlYXJPZmYgPyBfbmFtZXIuc3RhdGljQ2xvc3VyZU5hbWUoZWxlbWVudCkgOiBudWxsOwoKICAgIGpzLk5hbWUgY2FsbE5hbWUgPSBudWxsOwogICAgaWYgKG5lZWRzVGVhck9mZikgewogICAgICBTZWxlY3RvciBjYWxsU2VsZWN0b3IgPQogICAgICAgICAgbmV3IFNlbGVjdG9yLmZyb21FbGVtZW50KGVsZW1lbnQpLnRvQ2FsbFNlbGVjdG9yKCk7CiAgICAgIGNhbGxOYW1lID0gX25hbWVyLmludm9jYXRpb25OYW1lKGNhbGxTZWxlY3Rvcik7CiAgICB9CiAgICBqcy5FeHByZXNzaW9uIGZ1bmN0aW9uVHlwZTsKICAgIERhcnRUeXBlIHR5cGUgPSBfZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZShlbGVtZW50KTsKICAgIGlmIChuZWVkc1RlYXJPZmYpIHsKICAgICAgT3V0cHV0VW5pdCBvdXRwdXRVbml0ID0gX291dHB1dFVuaXREYXRhLm91dHB1dFVuaXRGb3JNZW1iZXIoZWxlbWVudCk7CiAgICAgIGZ1bmN0aW9uVHlwZSA9IF9nZW5lcmF0ZUZ1bmN0aW9uVHlwZSh0eXBlLCBvdXRwdXRVbml0KTsKICAgIH0KCiAgICBGdW5jdGlvbkVudGl0eSBtZXRob2QgPSBlbGVtZW50OwogICAgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSA9IG1ldGhvZC5wYXJhbWV0ZXJTdHJ1Y3R1cmU7CiAgICBpbnQgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA9IHBhcmFtZXRlclN0cnVjdHVyZS5yZXF1aXJlZFBhcmFtZXRlcnM7CiAgICB2YXIgLyogTGlzdCB8IE1hcCAqLyBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXM7CiAgICBpbnQgYXBwbHlJbmRleCA9IDA7CiAgICBpZiAoY2FuQmVBcHBsaWVkKSB7CiAgICAgIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcyA9IF9jb21wdXRlUGFyYW1ldGVyRGVmYXVsdFZhbHVlcyhtZXRob2QpOwogICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlLnR5cGVQYXJhbWV0ZXJzID4gMCkgewogICAgICAgIGFwcGx5SW5kZXggPSAxOwogICAgICB9CiAgICB9CgogICAgLy8gVE9ETyhmbG9pdHNjaCk6IHdlIHNob3VsZG4ndCB1cGRhdGUgdGhlIHJlZ2lzdHJ5IGluIHRoZSBtaWRkbGUgb2YKICAgIC8vIGJ1aWxkaW5nIGEgc3RhdGljIG1ldGhvZC4KICAgIHJldHVybiBuZXcgU3RhdGljRGFydE1ldGhvZCgKICAgICAgICBlbGVtZW50LAogICAgICAgIG5hbWUsCiAgICAgICAgX3JlZ2lzdHJ5LnJlZ2lzdGVySG9sZGVyKGhvbGRlciksCiAgICAgICAgY29kZSwKICAgICAgICBfZ2VuZXJhdGVQYXJhbWV0ZXJTdHVicyhlbGVtZW50LCBuZWVkc1RlYXJPZmYsIGNhbkJlQXBwbGllZCksCiAgICAgICAgY2FsbE5hbWUsCiAgICAgICAgbmVlZHNUZWFyT2ZmOiBuZWVkc1RlYXJPZmYsCiAgICAgICAgdGVhck9mZk5hbWU6IHRlYXJPZmZOYW1lLAogICAgICAgIGNhbkJlQXBwbGllZDogY2FuQmVBcHBsaWVkLAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzOiBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMsCiAgICAgICAgZnVuY3Rpb25UeXBlOiBmdW5jdGlvblR5cGUsCiAgICAgICAgYXBwbHlJbmRleDogYXBwbHlJbmRleCk7CiAgfQoKICB2b2lkIF9yZWdpc3RlckNvbnN0YW50cygKICAgICAgT3V0cHV0VW5pdCBvdXRwdXRVbml0LCBJdGVyYWJsZTxDb25zdGFudFZhbHVlPiBjb25zdGFudFZhbHVlcykgewogICAgLy8gYGNvbnN0YW50VmFsdWVzYCBpcyBudWxsIGlmIGFuIG91dHB1dFVuaXQgZG9lc24ndCBjb250YWluIGFueSBjb25zdGFudHMuCiAgICBpZiAoY29uc3RhbnRWYWx1ZXMgPT0gbnVsbCkgcmV0dXJuOwogICAgZm9yIChDb25zdGFudFZhbHVlIGNvbnN0YW50VmFsdWUgaW4gY29uc3RhbnRWYWx1ZXMpIHsKICAgICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyQ29uc3RhbnQob3V0cHV0VW5pdCwgY29uc3RhbnRWYWx1ZSk7CiAgICAgIGFzc2VydCghX2NvbnN0YW50cy5jb250YWluc0tleShjb25zdGFudFZhbHVlKSk7CiAgICAgIGpzLk5hbWUgbmFtZSA9IF9uYW1lci5jb25zdGFudE5hbWUoY29uc3RhbnRWYWx1ZSk7CiAgICAgIFN0cmluZyBjb25zdGFudE9iamVjdCA9IF9uYW1lci5nbG9iYWxPYmplY3RGb3JDb25zdGFudChjb25zdGFudFZhbHVlKTsKICAgICAgSG9sZGVyIGhvbGRlciA9CiAgICAgICAgICBfcmVnaXN0cnkucmVnaXN0ZXJIb2xkZXIoY29uc3RhbnRPYmplY3QsIGlzQ29uc3RhbnRzSG9sZGVyOiB0cnVlKTsK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RC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQyanMuanNfZW1pdHRlci5wcm9ncmFtX2J1aWxkZXI7CgovLy8gW21lbWJlcl0gaXMgYSBmaWVsZCAoaW5zdGFuY2UsIHN0YXRpYywgb3IgdG9wIGxldmVsKS4KLy8vCi8vLyBbbmFtZV0gaXMgdGhlIGZpZWxkIG5hbWUgdGhhdCB0aGUgW05hbWVyXSBoYXMgcGlja2VkIGZvciB0aGlzIGZpZWxkJ3MKLy8vIHN0b3JhZ2UsIHRoYXQgaXMsIHRoZSBKYXZhU2NyaXB0IHByb3BlcnR5IG5hbWUuCi8vLwovLy8gW2FjY2Vzc29yTmFtZV0gaXMgdGhlIG5hbWUgb2YgdGhlIGFjY2Vzc29yLiBGb3IgaW5zdGFuY2UgZmllbGRzIHRoaXMgaXMKLy8vIG1vc3RseSB0aGUgc2FtZSBhcyBbbmFtZV0gZXhjZXB0IHdoZW4gW21lbWJlcl0gaXMgc2hhZG93aW5nIGEgZmllbGQgaW4gaXRzCi8vLyBzdXBlcmNsYXNzLiAgRm9yIG90aGVyIGZpZWxkcywgdGhleSBhcmUgcmFyZWx5IHRoZSBzYW1lLgovLy8KLy8vIFtuZWVkc0dldHRlcl0gYW5kIFtuZWVkc1NldHRlcl0gcmVwcmVzZW50IGlmIGEgZ2V0dGVyIG9yIGEgc2V0dGVyCi8vLyByZXNwZWN0aXZlbHkgaXMgbmVlZGVkLiAgVGhlcmUgYXJlIG1hbnkgZmFjdG9ycyBpbiB0aGlzLCBmb3IgZXhhbXBsZSwgaWYgdGhlCi8vLyBhY2Nlc3NvciBjYW4gYmUgaW5saW5lZC4KLy8vCi8vLyBbbmVlZHNDaGVja2VkU2V0dGVyXSBpbmRpY2F0ZXMgdGhhdCBhIGNoZWNrZWQgZ2V0dGVyIGlzIG5lZWRlZCwgYW5kIGluIHRoaXMKLy8vIGNhc2UsIFtuZWVkc1NldHRlcl0gaXMgYWx3YXlzIGZhbHNlLiBbbmVlZHNDaGVja2VkU2V0dGVyXSBpcyBvbmx5IHRydWUgd2hlbgovLy8gdHlwZSBhc3NlcnRpb25zIGFyZSBlbmFibGVkIChjaGVja2VkIG1vZGUpLgp0eXBlZGVmIHZvaWQgQWNjZXB0RmllbGQoRmllbGRFbnRpdHkgbWVtYmVyLCBqcy5OYW1lIG5hbWUsIGpzLk5hbWUgYWNjZXNzb3JOYW1lLAogICAgYm9vbCBuZWVkc0dldHRlciwgYm9vbCBuZWVkc1NldHRlciwgYm9vbCBuZWVkc0NoZWNrZWRTZXR0ZXIpOwoKY2xhc3MgRmllbGRWaXNpdG9yIHsKICBmaW5hbCBDb21waWxlck9wdGlvbnMgX29wdGlvbnM7CiAgZmluYWwgSkVsZW1lbnRFbnZpcm9ubWVudCBfZWxlbWVudEVudmlyb25tZW50OwogIGZpbmFsIEpDb21tb25FbGVtZW50cyBfY29tbW9uRWxlbWVudHM7CiAgZmluYWwgQ29kZWdlbldvcmxkQnVpbGRlciBfY29kZWdlbldvcmxkQnVpbGRlcjsKICBmaW5hbCBOYXRpdmVEYXRhIF9uYXRpdmVEYXRhOwogIGZpbmFsIE5hbWVyIF9uYW1lcjsKICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwoKICBGaWVsZFZpc2l0b3IoCiAgICAgIHRoaXMuX29wdGlvbnMsCiAgICAgIHRoaXMuX2VsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgdGhpcy5fY29tbW9uRWxlbWVudHMsCiAgICAgIHRoaXMuX2NvZGVnZW5Xb3JsZEJ1aWxkZXIsCiAgICAgIHRoaXMuX25hdGl2ZURhdGEsCiAgICAgIHRoaXMuX25hbWVyLAogICAgICB0aGlzLl9jbG9zZWRXb3JsZCk7CgogIC8vLyBJbnZva2VzIFtmXSBmb3IgZWFjaCBvZiB0aGUgZmllbGRzIG9mIFtlbGVtZW50XS4KICAvLy8KICAvLy8gW2VsZW1lbnRdIG11c3QgYmUgYSBbQ2xhc3NFbnRpdHldIG9yIGEgW0xpYnJhcnlFbnRpdHldLgogIC8vLwogIC8vLyBJZiBbZWxlbWVudF0gaXMgYSBbQ2xhc3NFbnRpdHldLCB0aGUgc3RhdGljIGZpZWxkcyBvZiB0aGUgY2xhc3MgYXJlCiAgLy8vIHZpc2l0ZWQgaWYgW3Zpc2l0U3RhdGljc10gaXMgdHJ1ZSBhbmQgdGhlIGluc3RhbmNlIGZpZWxkcyBhcmUgdmlzaXRlZCBpZgogIC8vLyBbdmlzaXRTdGF0aWNzXSBpcyBmYWxzZS4KICAvLy8KICAvLy8gSWYgW2VsZW1lbnRdIGlzIGEgW0xpYnJhcnlFbnRpdHldLCBbdmlzaXRTdGF0aWNzXSBtdXN0IGJlIHRydWUuCiAgLy8vCiAgLy8vIFdoZW4gdmlzaXRpbmcgdGhlIGluc3RhbmNlIGZpZWxkcyBvZiBhIGNsYXNzLCB0aGUgZmllbGRzIG9mIGl0cyBzdXBlcmNsYXNzCiAgLy8vIGFyZSBhbHNvIHZpc2l0ZWQgaWYgdGhlIGNsYXNzIGlzIGluc3RhbnRpYXRlZC4KICAvLy8KICAvLy8gSW52YXJpYW50OiBbZWxlbWVudF0gbXVzdCBiZSBhIGRlY2xhcmF0aW9uIGVsZW1lbnQuCiAgdm9pZCB2aXNpdEZpZWxkcyhBY2NlcHRGaWVsZCBmLAogICAgICB7Ym9vbCB2aXNpdFN0YXRpY3M6IGZhbHNlLCBMaWJyYXJ5RW50aXR5IGxpYnJhcnksIENsYXNzRW50aXR5IGNsc30pIHsKICAgIGJvb2wgaXNOYXRpdmVDbGFzcyA9IGZhbHNlOwogICAgYm9vbCBpc0xpYnJhcnkgPSBmYWxzZTsKICAgIGJvb2wgaXNJbnN0YW50aWF0ZWQgPSBmYWxzZTsKICAgIGlmIChjbHMgIT0gbnVsbCkgewogICAgICBpc05hdGl2ZUNsYXNzID0gX25hdGl2ZURhdGEuaXNOYXRpdmVDbGFzcyhjbHMpOwoKICAgICAgLy8gSWYgdGhlIGNsYXNzIGlzIG5ldmVyIGluc3RhbnRpYXRlZCB3ZSBzdGlsbCBuZWVkIHRvIHNldCBpdCB1cCBmb3IKICAgICAgLy8gaW5oZXJpdGFuY2UgcHVycG9zZXMsIGJ1dCB3ZSBjYW4gc2ltcGxpZnkgaXRzIEphdmFTY3JpcHQgY29uc3RydWN0b3IuCiAgICAgIGlzSW5zdGFudGlhdGVkID0KICAgICAgICAgIF9jb2RlZ2VuV29ybGRCdWlsZGVyLmRpcmVjdGx5SW5zdGFudGlhdGVkQ2xhc3Nlcy5jb250YWlucyhjbHMpOwogICAgfSBlbHNlIGlmIChsaWJyYXJ5ICE9IG51bGwpIHsKICAgICAgaXNMaWJyYXJ5ID0gdHJ1ZTsKICAgICAgYXNzZXJ0KHZpc2l0U3RhdGljcywgZmFpbGVkQXQobGlicmFyeSkpOwogICAgfSBlbHNlIHsKICAgICAgZmFpbGVkQXQoCiAgICAgICAgICBOT19MT0NBVElPTl9TUEFOTkFCTEUsICdFeHBlY3RlZCBhIENsYXNzRW50aXR5IG9yIGEgTGlicmFyeUVudGl0eS4nKTsKICAgIH0KCiAgICB2b2lkIHZpc2l0RmllbGQoRmllbGRFbnRpdHkgZmllbGQsIHtDbGFzc0VudGl0eSBob2xkZXJ9KSB7CiAgICAgIGJvb2wgaXNNaXhpbk5hdGl2ZUZpZWxkID0KICAgICAgICAgIGlzTmF0aXZlQ2xhc3MgJiYgX2VsZW1lbnRFbnZpcm9ubWVudC5pc01peGluQXBwbGljYXRpb24oaG9sZGVyKTsKCiAgICAgIC8vIFNlZSBpZiB3ZSBjYW4gZHluYW1pY2FsbHkgY3JlYXRlIGdldHRlcnMgYW5kIHNldHRlcnMuCiAgICAgIC8vIFdlIGNhbiBvbmx5IGdlbmVyYXRlIGdldHRlcnMgYW5kIHNldHRlcnMgZm9yIFtlbGVtZW50XSBzaW5jZQogICAgICAvLyB0aGUgZmllbGRzIG9mIHN1cGVyIGNsYXNzZXMgY291bGQgYmUgb3ZlcndyaXR0ZW4gd2l0aCBnZXR0ZXJzIG9yCiAgICAgIC8vIHNldHRlcnMuCiAgICAgIGJvb2wgbmVlZHNHZXR0ZXIgPSBmYWxzZTsKICAgICAgYm9vbCBuZWVkc1NldHRlciA9IGZhbHNlOwogICAgICBpZiAoaXNMaWJyYXJ5IHx8IGlzTWl4aW5OYXRpdmVGaWVsZCB8fCBob2xkZXIgPT0gY2xzKSB7CiAgICAgICAgbmVlZHNHZXR0ZXIgPSBmaWVsZE5lZWRzR2V0dGVyKGZpZWxkKTsKICAgICAgICBuZWVkc1NldHRlciA9IGZpZWxkTmVlZHNTZXR0ZXIoZmllbGQpOwogICAgICB9CgogICAgICBpZiAoKGlzSW5zdGFudGlhdGVkICYmICFfbmF0aXZlRGF0YS5pc05hdGl2ZUNsYXNzKGNscykpIHx8CiAgICAgICAgICBuZWVkc0dldHRlciB8fAogICAgICAgICAgbmVlZHNTZXR0ZXIpIHsKICAgICAgICBqcy5OYW1lIGFjY2Vzc29yTmFtZSA9IF9uYW1lci5maWVsZEFjY2Vzc29yTmFtZShmaWVsZCk7CiAgICAgICAganMuTmFtZSBmaWVsZE5hbWUgPSBfbmFtZXIuZmllbGRQcm9wZXJ0eU5hbWUoZmllbGQpOwogICAgICAgIGJvb2wgbmVlZHNDaGVja2VkU2V0dGVyID0gZmFsc2U7CiAgICAgICAgaWYgKF9vcHRpb25zLnBhcmFtZXRlckNoZWNrUG9saWN5LmlzRW1pdHRlZCAmJgogICAgICAgICAgICBuZWVkc1NldHRlciAmJgogICAgICAgICAgICAhY2FuQXZvaWRHZW5lcmF0ZWRDaGVja2VkU2V0dGVyKGZpZWxkKSkgewogICAgICAgICAgbmVlZHNDaGVja2VkU2V0dGVyID0gdHJ1ZTsKICAgICAgICAgIG5lZWRzU2V0dGVyID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIEdldHRlcnMgYW5kIHNldHRlcnMgd2l0aCBzdWZmaXhlcyB3aWxsIGJlIGdlbmVyYXRlZCBkeW5hbWljYWxseS4KICAgICAgICBmKGZpZWxkLCBmaWVsZE5hbWUsIGFjY2Vzc29yTmFtZSwgbmVlZHNHZXR0ZXIsIG5lZWRzU2V0dGVyLAogICAgICAgICAgICBuZWVkc0NoZWNrZWRTZXR0ZXIpOwogICAgICB9CiAgICB9CgogICAgaWYgKGlzTGlicmFyeSkgewogICAgICBfZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hMaWJyYXJ5TWVtYmVyKGxpYnJhcnksIChNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAgICAgaWYgKG1lbWJlci5pc0ZpZWxkKSB2aXNpdEZpZWxkKG1lbWJlcik7CiAgICAgIH0pOwogICAgfSBlbHNlIGlmICh2aXNpdFN0YXRpY3MpIHsKICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5mb3JFYWNoTG9jYWxDbGFzc01lbWJlcihjbHMsIChNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAgICAgaWYgKG1lbWJlci5pc0ZpZWxkICYmIG1lbWJlci5pc1N0YXRpYykgewogICAgICAgICAgdmlzaXRGaWVsZChtZW1iZXIsIGhvbGRlcjogY2xzKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgLy8gVE9ETyhrYXNwZXJsKTogV2Ugc2hvdWxkIG1ha2Ugc3VyZSB0byBvbmx5IGVtaXQgb25lIHZlcnNpb24gb2YKICAgICAgLy8gb3ZlcnJpZGRlbiBmaWVsZHMuIFJpZ2h0IG5vdywgd2UgcmVseSBvbiB0aGUgb3JkZXJpbmcgc28gdGhlCiAgICAgIC8vIGZpZWxkcyBwdWxsZWQgaW4gZnJvbSBtaXhpbnMgYXJlIHJlcGxhY2VkIHdpdGggdGhlIGZpZWxkcyBmcm9tCiAgICAgIC8vIHRoZSBjbGFzcyBkZWZpbml0aW9uLgoKICAgICAgLy8gSWYgYSBjbGFzcyBpcyBub3QgaW5zdGFudGlhdGVkIHRoZW4gd2UgYWRkIHRoZSBmaWVsZCBqdXN0IHNvIHdlIGNhbgogICAgICAvLyBnZW5lcmF0ZSB0aGUgZmllbGQgZ2V0dGVyL3NldHRlciBkeW5hbWljYWxseS4gU2luY2UgdGhpcyBpcyBvbmx5CiAgICAgIC8vIGFsbG93ZWQgb24gZmllbGRzIHRoYXQgYXJlIGluIFtlbGVtZW50XSB3ZSBkb24ndCBuZWVkIHRvIHZpc2l0CiAgICAgIC8vIHN1cGVyY2xhc3NlcyBmb3Igbm9uLWluc3RhbnRpYXRlZCBjbGFzc2VzLgogICAgICBfZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hDbGFzc01lbWJlcihjbHMsCiAgICAgICAgICAoQ2xhc3NFbnRpdHkgaG9sZGVyLCBNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAgICAgaWYgKGNscyAhPSBob2xkZXIgJiYgIWlzSW5zdGFudGlhdGVkKSByZXR1cm47CiAgICAgICAgaWYgKG1lbWJlci5pc0ZpZWxkICYmICFtZW1iZXIuaXNTdGF0aWMpIHsKICAgICAgICAgIHZpc2l0RmllbGQobWVtYmVyLCBob2xkZXI6IGhvbGRlcik7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9CgogIGJvb2wgZmllbGROZWVkc0dldHRlcihGaWVsZEVudGl0eSBmaWVsZCkgewogICAgYXNzZXJ0KGZpZWxkLmlzRmllbGQpOwogICAgaWYgKGZpZWxkQWNjZXNzTmV2ZXJUaHJvd3MoZmllbGQpKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gZmllbGQuZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCAmJgogICAgICAgIF9jb2RlZ2VuV29ybGRCdWlsZGVyLmhhc0ludm9rZWRHZXR0ZXIoZmllbGQpOwogIH0KCiAgYm9vbCBmaWVsZE5lZWRzU2V0dGVyKEZpZWxkRW50aXR5IGZpZWxkKSB7CiAgICBhc3NlcnQoZmllbGQuaXNGaWVsZCk7CiAgICBpZiAoZmllbGRBY2Nlc3NOZXZlclRocm93cyhmaWVsZCkpIHJldHVybiBmYWxzZTsKICAgIGlmICghZmllbGQuaXNBc3NpZ25hYmxlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gZmllbGQuZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCAmJgogICAgICAgIF9jb2RlZ2VuV29ybGRCdWlsZGVyLmhhc0ludm9rZWRTZXR0ZXIoZmllbGQpOwogIH0KCiAgc3RhdGljIGJvb2wgZmllbGRBY2Nlc3NOZXZlclRocm93cyhGaWVsZEVudGl0eSBmaWVsZCkgewogICAgcmV0dXJuCiAgICAgICAgLy8gV2UgbmV2ZXIgYWNjZXNzIGEgZmllbGQgaW4gYSBjbG9zdXJlIChhIGNhcHR1cmVkIHZhcmlhYmxlKSB3aXRob3V0CiAgICAgICAgLy8ga25vd2luZyB0aGF0IGl0IGlzIHRoZXJlLiAgVGhlcmVmb3JlIHdlIGRvbid0IG5lZWQgdG8gdXNlIGEgZ2V0dGVyCiAgICAgICAgLy8gKHRoYXQgd2lsbCB0aHJvdyBpZiB0aGUgZ2V0dGVyIG1ldGhvZCBpcyBtaXNzaW5nKSwgYnV0IGNhbiBhbHdheXMKICAgICAgICAvLyBhY2Nlc3MgdGhlIGZpZWxkIGRpcmVjdGx5LgogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJldHVybiBgdHJ1ZWAgSkNsb3N1cmVGaWVsZC4KICAgICAgICBmYWxzZTsKICB9CgogIGJvb2wgY2FuQXZvaWRHZW5lcmF0ZWRDaGVja2VkU2V0dGVyKEZpZWxkRW50aXR5IG1lbWJlcikgewogICAgLy8gV2UgbmV2ZXIgZ2VuZXJhdGUgYWNjZXNzb3JzIGZvciB0b3AtbGV2ZWwvc3RhdGljIGZpZWxkcy4KICAgIGlmICghbWVtYmVyLmlzSW5zdGFuY2VNZW1iZXIpIHJldHVybiB0cnVlOwogICAgRGFydFR5cGUgdHlwZSA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0RmllbGRUeXBlKG1lbWJlcik7CiAgICByZXR1cm4gdHlwZS50cmVhdEFzRHluYW1pYyB8fCB0eXBlID09IF9jb21tb25FbGVtZW50cy5vYmplY3RUeXBlOwogIH0KfQqArgBOTjwBLAE6BEo0BExPPQRGUR0EUFAwUUIBFSIxKTIgFiMBEBUgHCEYExoBNwY+BkpPHwZGBlE1BjoiTCAcIRc2AUtPF0oiGC8NEFAGAT8gSwE/RkoSICA+Ly8IAUEZGUA9KTcbNiUfCkxEIQgGARVQMAofTzErCgoNSEZIHwFNSkg0MjY2Mi4KCgYEAS0bNSs2BAEtGzUrKzYEAToLTk5NJj0PBAE8QC8+RgQCAUJwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL3Byb2dyYW1fYnVpbGRlci9maWVsZF92aXNpdG9yLmRhcnRHc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfZW1pdHRlci9wcm9ncmFtX2J1aWxkZXIvY29sbGVjdG9yLmRhcnSvzi8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQyanMuanNfZW1pdHRlci5wcm9ncmFtX2J1aWxkZXI7CgovLy8gR2VuZXJhdGVzIHRoZSBjb2RlIGZvciBhbGwgdXNlZCBjbGFzc2VzIGluIHRoZSBwcm9ncmFtLiBTdGF0aWMgZmllbGRzIChldmVuCi8vLyBpbiBjbGFzc2VzKSBhcmUgaWdub3JlZCwgc2luY2UgdGhleSBjYW4gYmUgdHJlYXRlZCBhcyBub24tY2xhc3MgZWxlbWVudHMuCi8vLwovLy8gVGhlIGNvZGUgZm9yIHRoZSBjb250YWluaW5nICh1c2VkKSBtZXRob2RzIG11c3QgZXhpc3QgaW4gdGhlIGB1bml2ZXJzZWAuCmNsYXNzIENvbGxlY3RvciB7CiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwogIGZpbmFsIEpDb21tb25FbGVtZW50cyBfY29tbW9uRWxlbWVudHM7CiAgZmluYWwgSkVsZW1lbnRFbnZpcm9ubWVudCBfZWxlbWVudEVudmlyb25tZW50OwogIGZpbmFsIE91dHB1dFVuaXREYXRhIF9vdXRwdXRVbml0RGF0YTsKICBmaW5hbCBDb2RlZ2VuV29ybGRCdWlsZGVyIF93b3JsZEJ1aWxkZXI7CiAgLy8gVE9ETyhmbG9pdHNjaCk6IHRoZSBjb2RlLWVtaXR0ZXIgdGFzayBzaG91bGQgbm90IG5lZWQgYSBuYW1lci4KICBmaW5hbCBOYW1lciBfbmFtZXI7CiAgZmluYWwgRW1pdHRlciBfZW1pdHRlcjsKICBmaW5hbCBKYXZhU2NyaXB0Q29uc3RhbnRDb21waWxlciBfY29uc3RhbnRIYW5kbGVyOwogIGZpbmFsIE5hdGl2ZURhdGEgX25hdGl2ZURhdGE7CiAgZmluYWwgSW50ZXJjZXB0b3JEYXRhIF9pbnRlcmNlcHRvckRhdGE7CiAgZmluYWwgT25lU2hvdEludGVyY2VwdG9yRGF0YSBfb25lU2hvdEludGVyY2VwdG9yRGF0YTsKICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwogIGZpbmFsIFNldDxDbGFzc0VudGl0eT4gX3J0aU5lZWRlZENsYXNzZXM7CiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwganMuRXhwcmVzc2lvbj4gX2dlbmVyYXRlZENvZGU7CiAgZmluYWwgU29ydGVyIF9zb3J0ZXI7CgogIGZpbmFsIFNldDxDbGFzc0VudGl0eT4gbmVlZGVkQ2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CiAgLy8gVGhpcyBmaWVsZCBpcyBzZXQgaW4gW2NvbXB1dGVOZWVkZWREZWNsYXJhdGlvbnNdLgogIFNldDxDbGFzc0VudGl0eT4gY2xhc3Nlc09ubHlOZWVkZWRGb3JSdGk7CiAgZmluYWwgTWFwPE91dHB1dFVuaXQsIExpc3Q8Q2xhc3NFbnRpdHk+PiBvdXRwdXRDbGFzc0xpc3RzID0KICAgICAgbmV3IE1hcDxPdXRwdXRVbml0LCBMaXN0PENsYXNzRW50aXR5Pj4oKTsKICBmaW5hbCBNYXA8T3V0cHV0VW5pdCwgTGlzdDxDb25zdGFudFZhbHVlPj4gb3V0cHV0Q29uc3RhbnRMaXN0cyA9CiAgICAgIG5ldyBNYXA8T3V0cHV0VW5pdCwgTGlzdDxDb25zdGFudFZhbHVlPj4oKTsKICBmaW5hbCBNYXA8T3V0cHV0VW5pdCwgTGlzdDxNZW1iZXJFbnRpdHk+PiBvdXRwdXRTdGF0aWNMaXN0cyA9CiAgICAgIG5ldyBNYXA8T3V0cHV0VW5pdCwgTGlzdDxNZW1iZXJFbnRpdHk+PigpOwogIGZpbmFsIE1hcDxPdXRwdXRVbml0LCBMaXN0PEZpZWxkRW50aXR5Pj4gb3V0cHV0U3RhdGljTm9uRmluYWxGaWVsZExpc3RzID0KICAgICAgbmV3IE1hcDxPdXRwdXRVbml0LCBMaXN0PEZpZWxkRW50aXR5Pj4oKTsKICBmaW5hbCBNYXA8T3V0cHV0VW5pdCwgU2V0PExpYnJhcnlFbnRpdHk+PiBvdXRwdXRMaWJyYXJ5TGlzdHMgPQogICAgICBuZXcgTWFwPE91dHB1dFVuaXQsIFNldDxMaWJyYXJ5RW50aXR5Pj4oKTsKCiAgLy8vIFRydWUsIGlmIHRoZSBvdXRwdXQgY29udGFpbnMgYSBjb25zdGFudCBsaXN0LgogIC8vLwogIC8vLyBUaGlzIGZsYWcgaXMgdXBkYXRlZCBpbiBbY29tcHV0ZU5lZWRlZENvbnN0YW50c10uCiAgYm9vbCBvdXRwdXRDb250YWluc0NvbnN0YW50TGlzdCA9IGZhbHNlOwoKICBmaW5hbCBMaXN0PENsYXNzRW50aXR5PiBuYXRpdmVDbGFzc2VzQW5kU3ViY2xhc3NlcyA9IDxDbGFzc0VudGl0eT5bXTsKCiAgQ29sbGVjdG9yKAogICAgICB0aGlzLl9vcHRpb25zLAogICAgICB0aGlzLl9jb21tb25FbGVtZW50cywKICAgICAgdGhpcy5fZWxlbWVudEVudmlyb25tZW50LAogICAgICB0aGlzLl9vdXRwdXRVbml0RGF0YSwKICAgICAgdGhpcy5fd29ybGRCdWlsZGVyLAogICAgICB0aGlzLl9uYW1lciwKICAgICAgdGhpcy5fZW1pdHRlciwKICAgICAgdGhpcy5fY29uc3RhbnRIYW5kbGVyLAogICAgICB0aGlzLl9uYXRpdmVEYXRhLAogICAgICB0aGlzLl9pbnRlcmNlcHRvckRhdGEsCiAgICAgIHRoaXMuX29uZVNob3RJbnRlcmNlcHRvckRhdGEsCiAgICAgIHRoaXMuX2Nsb3NlZFdvcmxkLAogICAgICB0aGlzLl9ydGlOZWVkZWRDbGFzc2VzLAogICAgICB0aGlzLl9nZW5lcmF0ZWRDb2RlLAogICAgICB0aGlzLl9zb3J0ZXIpOwoKICBTZXQ8Q2xhc3NFbnRpdHk+IGNvbXB1dGVJbnRlcmNlcHRvcnNSZWZlcmVuY2VkRnJvbUNvbnN0YW50cygpIHsKICAgIFNldDxDbGFzc0VudGl0eT4gY2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CiAgICBMaXN0PENvbnN0YW50VmFsdWU+IGNvbnN0YW50cyA9IF93b3JsZEJ1aWxkZXIuZ2V0Q29uc3RhbnRzRm9yRW1pc3Npb24oKTsKICAgIGZvciAoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCBpbiBjb25zdGFudHMpIHsKICAgICAgaWYgKGNvbnN0YW50IGlzIEludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZSkgewogICAgICAgIEludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZSBpbnRlcmNlcHRvckNvbnN0YW50ID0gY29uc3RhbnQ7CiAgICAgICAgY2xhc3Nlcy5hZGQoaW50ZXJjZXB0b3JDb25zdGFudC5jbHMpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gY2xhc3NlczsKICB9CgogIC8vLyBSZXR1cm4gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiBpdHMgYXJndW1lbnQgaXMgYSBjbGFzcwogIC8vLyB0aGF0IG5lZWRzIHRvIGJlIGVtaXR0ZWQuCiAgRnVuY3Rpb24gY29tcHV0ZUNsYXNzRmlsdGVyKEl0ZXJhYmxlPENsYXNzRW50aXR5PiBiYWNrZW5kVHlwZUhlbHBlcnMpIHsKICAgIFNldDxDbGFzc0VudGl0eT4gdW5uZWVkZWRDbGFzc2VzID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKICAgIC8vIFRoZSBbQm9vbF0gY2xhc3MgaXMgbm90IG1hcmtlZCBhcyBhYnN0cmFjdCwgYnV0IGhhcyBhIGZhY3RvcnkKICAgIC8vIGNvbnN0cnVjdG9yIHRoYXQgYWx3YXlzIHRocm93cy4gV2UgbmV2ZXIgbmVlZCB0byBlbWl0IGl0LgogICAgdW5uZWVkZWRDbGFzc2VzLmFkZChfY29tbW9uRWxlbWVudHMuYm9vbENsYXNzKTsKCiAgICAvLyBHbyBvdmVyIHNwZWNpYWxpemVkIGludGVyY2VwdG9ycyBhbmQgdGhlbiBjb25zdGFudHMgdG8ga25vdyB3aGljaAogICAgLy8gaW50ZXJjZXB0b3JzIGFyZSBuZWVkZWQuCiAgICBTZXQ8Q2xhc3NFbnRpdHk+IG5lZWRlZCA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CiAgICBmb3IgKGpzLk5hbWUgbmFtZQogICAgICAgIGluIF9vbmVTaG90SW50ZXJjZXB0b3JEYXRhLnNwZWNpYWxpemVkR2V0SW50ZXJjZXB0b3JOYW1lcykgewogICAgICBuZWVkZWQuYWRkQWxsKAogICAgICAgICAgX29uZVNob3RJbnRlcmNlcHRvckRhdGEuZ2V0U3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvcnNGb3IobmFtZSkpOwogICAgfQoKICAgIC8vIEFkZCBpbnRlcmNlcHRvcnMgcmVmZXJlbmNlZCBieSBjb25zdGFudHMuCiAgICBuZWVkZWQuYWRkQWxsKGNvbXB1dGVJbnRlcmNlcHRvcnNSZWZlcmVuY2VkRnJvbUNvbnN0YW50cygpKTsKCiAgICAvLyBBZGQgdW5uZWVkZWQgaW50ZXJjZXB0b3JzIHRvIHRoZSBbdW5uZWVkZWRDbGFzc2VzXSBzZXQuCiAgICBmb3IgKENsYXNzRW50aXR5IGludGVyY2VwdG9yIGluIF9pbnRlcmNlcHRvckRhdGEuaW50ZXJjZXB0ZWRDbGFzc2VzKSB7CiAgICAgIGlmICghbmVlZGVkLmNvbnRhaW5zKGludGVyY2VwdG9yKSAmJgogICAgICAgICAgaW50ZXJjZXB0b3IgIT0gX2NvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKSB7CiAgICAgICAgdW5uZWVkZWRDbGFzc2VzLmFkZChpbnRlcmNlcHRvcik7CiAgICAgIH0KICAgIH0KCiAgICAvLyBUaGVzZSBjbGFzc2VzIGFyZSBqdXN0IGhlbHBlcnMgZm9yIHRoZSBiYWNrZW5kJ3MgdHlwZSBzeXN0ZW0uCiAgICB1bm5lZWRlZENsYXNzZXMuYWRkQWxsKGJhY2tlbmRUeXBlSGVscGVycyk7CgogICAgcmV0dXJuIChDbGFzc0VudGl0eSBjbHMpID0+ICF1bm5lZWRlZENsYXNzZXMuY29udGFpbnMoY2xzKTsKICB9CgogIC8vIFJldHVybiB0aGUgY2xhc3NlcyB0aGF0IGFyZSBqdXN0IGhlbHBlcnMgZm9yIHRoZSBiYWNrZW5kJ3MgdHlwZSBzeXN0ZW0uCiAgc3RhdGljIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBnZXRCYWNrZW5kVHlwZUhlbHBlcnMoCiAgICAgIEpDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cykgewogICAgcmV0dXJuIDxDbGFzc0VudGl0eT5bCiAgICAgIGNvbW1vbkVsZW1lbnRzLmpzTXV0YWJsZUFycmF5Q2xhc3MsCiAgICAgIGNvbW1vbkVsZW1lbnRzLmpzRml4ZWRBcnJheUNsYXNzLAogICAgICBjb21tb25FbGVtZW50cy5qc0V4dGVuZGFibGVBcnJheUNsYXNzLAogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNYXJrIHRoaXMgYXMgYSBiYWNrZW5kIHR5cGUgaGVscGVyOgogICAgICAvL2NvbW1vbkVsZW1lbnRzLmpzVW5tb2RpZmlhYmxlQXJyYXlDbGFzcywKICAgICAgY29tbW9uRWxlbWVudHMuanNVSW50MzJDbGFzcywKICAgICAgY29tbW9uRWxlbWVudHMuanNVSW50MzFDbGFzcywKICAgICAgY29tbW9uRWxlbWVudHMuanNQb3NpdGl2ZUludENsYXNzCiAgICBdOwogIH0KCiAgLy8vIENvbXB1dGUgYWxsIHRoZSBjb25zdGFudHMgdGhhdCBtdXN0IGJlIGVtaXR0ZWQuCiAgdm9pZCBjb21wdXRlTmVlZGVkQ29uc3RhbnRzKCkgewogICAgTGlzdDxDb25zdGFudFZhbHVlPiBjb25zdGFudHMgPQogICAgICAgIF93b3JsZEJ1aWxkZXIuZ2V0Q29uc3RhbnRzRm9yRW1pc3Npb24oX2VtaXR0ZXIuY29tcGFyZUNvbnN0YW50cyk7CiAgICBmb3IgKENvbnN0YW50VmFsdWUgY29uc3RhbnQgaW4gY29uc3RhbnRzKSB7CiAgICAgIGlmIChfZW1pdHRlci5pc0NvbnN0YW50SW5saW5lZE9yQWxyZWFkeUVtaXR0ZWQoY29uc3RhbnQpKSBjb250aW51ZTsKCiAgICAgIGlmIChjb25zdGFudC5pc0xpc3QpIG91dHB1dENvbnRhaW5zQ29uc3RhbnRMaXN0ID0gdHJ1ZTsKCiAgICAgIE91dHB1dFVuaXQgY29uc3RhbnRVbml0ID0gX291dHB1dFVuaXREYXRhLm91dHB1dFVuaXRGb3JDb25zdGFudChjb25zdGFudCk7CiAgICAgIGlmIChjb25zdGFudFVuaXQgPT0gbnVsbCkgewogICAgICAgIC8vIFRoZSBiYWNrLWVuZCBpbnRyb2R1Y2VzIHNvbWUgY29uc3RhbnRzLCBsaWtlICJJbnRlcmNlcHRvckNvbnN0YW50IiBvcgogICAgICAgIC8vIHNvbWUgbGlzdCBjb25zdGFudHMuIFRoZXkgYXJlIGVtaXR0ZWQgaW4gdGhlIG1haW4gb3V0cHV0LXVuaXQuCiAgICAgICAgLy8gVE9ETyhzaWd1cmRtKTogV2Ugc2hvdWxkIHRyYWNrIHRob3NlIGNvbnN0YW50cy4KICAgICAgICBjb25zdGFudFVuaXQgPSBfb3V0cHV0VW5pdERhdGEubWFpbk91dHB1dFVuaXQ7CiAgICAgIH0KICAgICAgb3V0cHV0Q29uc3RhbnRMaXN0cwogICAgICAgICAgLnB1dElmQWJzZW50KGNvbnN0YW50VW5pdCwgKCkgPT4gbmV3IExpc3Q8Q29uc3RhbnRWYWx1ZT4oKSkKICAgICAgICAgIC5hZGQoY29uc3RhbnQpOwogICAgfQogIH0KCiAgLy8vIENvbXB1dGUgYWxsIHRoZSBjbGFzc2VzIGFuZCB0eXBlZGVmcyB0aGF0IG11c3QgYmUgZW1pdHRlZC4KICB2b2lkIGNvbXB1dGVOZWVkZWREZWNsYXJhdGlvbnMoKSB7CiAgICBTZXQ8Q2xhc3NFbnRpdHk+IGJhY2tlbmRUeXBlSGVscGVycyA9CiAgICAgICAgZ2V0QmFja2VuZFR5cGVIZWxwZXJzKF9jb21tb25FbGVtZW50cykudG9TZXQoKTsKCiAgICAvLyBDb21wdXRlIG5lZWRlZCBjbGFzc2VzLgogICAgU2V0PENsYXNzRW50aXR5PiBpbnN0YW50aWF0ZWRDbGFzc2VzID0KICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGlzIHNob3VsZCBiZSBhY2Nlc3NlZCBmcm9tIGEgY29kZWdlbiBjbG9zZWQKICAgICAgICAvLyB3b3JsZC4KICAgICAgICBfd29ybGRCdWlsZGVyLmRpcmVjdGx5SW5zdGFudGlhdGVkQ2xhc3NlcwogICAgICAgICAgICAud2hlcmUoY29tcHV0ZUNsYXNzRmlsdGVyKGJhY2tlbmRUeXBlSGVscGVycykpCiAgICAgICAgICAgIC50b1NldCgpOwoKICAgIHZvaWQgYWRkQ2xhc3NXaXRoU3VwZXJjbGFzc2VzKENsYXNzRW50aXR5IGNscykgewogICAgICBuZWVkZWRDbGFzc2VzLmFkZChjbHMpOwogICAgICBmb3IgKENsYXNzRW50aXR5IHN1cGVyY2xhc3MgPSBfZWxlbWVudEVudmlyb25tZW50LmdldFN1cGVyQ2xhc3MoY2xzKTsKICAgICAgICAgIHN1cGVyY2xhc3MgIT0gbnVsbDsKICAgICAgICAgIHN1cGVyY2xhc3MgPSBfZWxlbWVudEVudmlyb25tZW50LmdldFN1cGVyQ2xhc3Moc3VwZXJjbGFzcykpIHsKICAgICAgICBuZWVkZWRDbGFzc2VzLmFkZChzdXBlcmNsYXNzKTsKICAgICAgfQogICAgfQoKICAgIHZvaWQgYWRkQ2xhc3Nlc1dpdGhTdXBlcmNsYXNzZXMoSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGNsYXNzZXMpIHsKICAgICAgZm9yIChDbGFzc0VudGl0eSBjbHMgaW4gY2xhc3NlcykgewogICAgICAgIGFkZENsYXNzV2l0aFN1cGVyY2xhc3NlcyhjbHMpOwogICAgICB9CiAgICB9CgogICAgLy8gMS4gV2UgbmVlZCB0byBnZW5lcmF0ZSBhbGwgY2xhc3NlcyB0aGF0IGFyZSBpbnN0YW50aWF0ZWQuCiAgICBhZGRDbGFzc2VzV2l0aFN1cGVyY2xhc3NlcyhpbnN0YW50aWF0ZWRDbGFzc2VzKTsKCiAgICAvLyAyLiBBZGQgYWxsIGNsYXNzZXMgdXNlZCBhcyBtaXhpbnMuCiAgICBTZXQ8Q2xhc3NFbnRpdHk+IG1peGluQ2xhc3NlcyA9IG5lZWRlZENsYXNzZXMKICAgICAgICAud2hlcmUoX2VsZW1lbnRFbnZpcm9ubWVudC5pc01peGluQXBwbGljYXRpb24pCiAgICAgICAgLm1hcChfZWxlbWVudEVudmlyb25tZW50LmdldEVmZmVjdGl2ZU1peGluQ2xhc3MpCiAgICAgICAgLnRvU2V0KCk7CiAgICBuZWVkZWRDbGFzc2VzLmFkZEFsbChtaXhpbkNsYXNzZXMpOwoKICAgIC8vIDMuIEZpbmQgYWxsIGNsYXNzZXMgbmVlZGVkIGZvciBydGkuCiAgICAvLyBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGlzIGlzIHRoZSBwZW51bHRpbWF0ZSBzdGVwLCBhdCB0aGlzIHBvaW50LAogICAgLy8gbmVlZGVkQ2xhc3NlcyBtdXN0IG9ubHkgY29udGFpbiBjbGFzc2VzIHRoYXQgaGF2ZSBiZWVuIHJlc29sdmVkIGFuZAogICAgLy8gY29kZWdlbidkLiBUaGUgcnRpTmVlZGVkQ2xhc3NlcyBtYXkgY29udGFpbiBhZGRpdGlvbmFsIGNsYXNzZXMsIGJ1dAogICAgLy8gdGhlc2UgYXJlIHRob3VnaHQgdG8gbm90IGhhdmUgYmVlbiBpbnN0YW50aWF0ZWQsIHNvIHdlIG5lZWQgdG8gYmUgYWJsZQogICAgLy8gdG8gaWRlbnRpZnkgdGhlbSBsYXRlciBhbmQgbWFrZSBzdXJlIHdlIG9ubHkgZW1pdCAiZW1wdHkgc2hlbGxzIiB3aXRob3V0CiAgICAvLyBmaWVsZHMsIGV0Yy4KICAgIGNsYXNzZXNPbmx5TmVlZGVkRm9yUnRpID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKICAgIGZvciAoQ2xhc3NFbnRpdHkgY2xzIGluIF9ydGlOZWVkZWRDbGFzc2VzKSB7CiAgICAgIGlmIChiYWNrZW5kVHlwZUhlbHBlcnMuY29udGFpbnMoY2xzKSkgY29udGludWU7CiAgICAgIHdoaWxlIChjbHMgIT0gbnVsbCAmJiAhbmVlZGVkQ2xhc3Nlcy5jb250YWlucyhjbHMpKSB7CiAgICAgICAgaWYgKCFjbGFzc2VzT25seU5lZWRlZEZvclJ0aS5hZGQoY2xzKSkgYnJlYWs7CiAgICAgICAgY2xzID0gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRTdXBlckNsYXNzKGNscyk7CiAgICAgIH0KICAgIH0KCiAgICBuZWVkZWRDbGFzc2VzLmFkZEFsbChjbGFzc2VzT25seU5lZWRlZEZvclJ0aSk7CgogICAgLy8gVE9ETygxODE3NSwgZmxvaXRzY2gpOiByZW1vdmUgb25jZSBpc3N1ZSAxODE3NSBpcyBmaXhlZC4KICAgIGlmIChuZWVkZWRDbGFzc2VzLmNvbnRhaW5zKF9jb21tb25FbGVtZW50cy5qc0ludENsYXNzKSkgewogICAgICBuZWVkZWRDbGFzc2VzLmFkZChfY29tbW9uRWxlbWVudHMuaW50Q2xhc3MpOwogICAgfQogICAgaWYgKG5lZWRlZENsYXNzZXMuY29udGFpbnMoX2NvbW1vbkVsZW1lbnRzLmpzRG91YmxlQ2xhc3MpKSB7CiAgICAgIG5lZWRlZENsYXNzZXMuYWRkKF9jb21tb25FbGVtZW50cy5kb3VibGVDbGFzcyk7CiAgICB9CiAgICBpZiAobmVlZGVkQ2xhc3Nlcy5jb250YWlucyhfY29tbW9uRWxlbWVudHMuanNOdW1iZXJDbGFzcykpIHsKICAgICAgbmVlZGVkQ2xhc3Nlcy5hZGQoX2NvbW1vbkVsZW1lbnRzLm51bUNsYXNzKTsKICAgIH0KICAgIGlmIChuZWVkZWRDbGFzc2VzLmNvbnRhaW5zKF9jb21tb25FbGVtZW50cy5qc1N0cmluZ0NsYXNzKSkgewogICAgICBuZWVkZWRDbGFzc2VzLmFkZChfY29tbW9uRWxlbWVudHMuc3RyaW5nQ2xhc3MpOwogICAgfQogICAgaWYgKG5lZWRlZENsYXNzZXMuY29udGFpbnMoX2NvbW1vbkVsZW1lbnRzLmpzQm9vbENsYXNzKSkgewogICAgICBuZWVkZWRDbGFzc2VzLmFkZChfY29tbW9uRWxlbWVudHMuYm9vbENsYXNzKTsKICAgIH0KICAgIGlmIChuZWVkZWRDbGFzc2VzLmNvbnRhaW5zKF9jb21tb25FbGVtZW50cy5qc0FycmF5Q2xhc3MpKSB7CiAgICAgIG5lZWRlZENsYXNzZXMuYWRkKF9jb21tb25FbGVtZW50cy5saXN0Q2xhc3MpOwogICAgfQoKICAgIC8vIDQuIEZpbmFsbHksIHNvcnQgdGhlIGNsYXNzZXMuCiAgICBMaXN0PENsYXNzRW50aXR5PiBzb3J0ZWRDbGFzc2VzID0gX3NvcnRlci5zb3J0Q2xhc3NlcyhuZWVkZWRDbGFzc2VzKTsKCiAgICBmb3IgKENsYXNzRW50aXR5IGNscyBpbiBzb3J0ZWRDbGFzc2VzKSB7CiAgICAgIGlmIChfbmF0aXZlRGF0YS5pc05hdGl2ZU9yRXh0ZW5kc05hdGl2ZShjbHMpICYmCiAgICAgICAgICAhY2xhc3Nlc09ubHlOZWVkZWRGb3JSdGkuY29udGFpbnMoY2xzKSkgewogICAgICAgIC8vIEZvciBub3csIG5hdGl2ZSBjbGFzc2VzIGFuZCByZWxhdGVkIGNsYXNzZXMgY2Fubm90IGJlIGRlZmVycmVkLgogICAgICAgIG5hdGl2ZUNsYXNzZXNBbmRTdWJjbGFzc2VzLmFkZChjbHMpOwogICAgICAgIGFzc2VydCghX291dHB1dFVuaXREYXRhLmlzRGVmZXJyZWRDbGFzcyhjbHMpLCBmYWlsZWRBdChjbHMpKTsKICAgICAgICBvdXRwdXRDbGFzc0xpc3RzCiAgICAgICAgICAgIC5wdXRJZkFic2VudCgKICAgICAgICAgICAgICAgIF9vdXRwdXRVbml0RGF0YS5tYWluT3V0cHV0VW5pdCwgKCkgPT4gbmV3IExpc3Q8Q2xhc3NFbnRpdHk+KCkpCiAgICAgICAgICAgIC5hZGQoY2xzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvdXRwdXRDbGFzc0xpc3RzCiAgICAgICAgICAgIC5wdXRJZkFic2VudChfb3V0cHV0VW5pdERhdGEub3V0cHV0VW5pdEZvckNsYXNzKGNscyksCiAgICAgICAgICAgICAgICAoKSA9PiBuZXcgTGlzdDxDbGFzc0VudGl0eT4oKSkKICAgICAgICAgICAgLmFkZChjbHMpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGNvbXB1dGVOZWVkZWRTdGF0aWNzKCkgewogICAgYm9vbCBpc1N0YXRpY0Z1bmN0aW9uKE1lbWJlckVudGl0eSBlbGVtZW50KSA9PgogICAgICAgICFlbGVtZW50LmlzSW5zdGFuY2VNZW1iZXIgJiYgIWVsZW1lbnQuaXNGaWVsZDsKCiAgICBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IGVsZW1lbnRzID0KICAgICAgICBfZ2VuZXJhdGVkQ29kZS5rZXlzLndoZXJlKGlzU3RhdGljRnVuY3Rpb24pOwoKICAgIGZvciAoTWVtYmVyRW50aXR5IG1lbWJlciBpbiBfc29ydGVyLnNvcnRNZW1iZXJzKGVsZW1lbnRzKSkgewogICAgICBMaXN0PE1lbWJlckVudGl0eT4gbGlzdCA9IG91dHB1dFN0YXRpY0xpc3RzLnB1dElmQWJzZW50KAogICAgICAgICAgX291dHB1dFVuaXREYXRhLm91dHB1dFVuaXRGb3JNZW1iZXIobWVtYmVyKSwKICAgICAgICAgICgpID0+IG5ldyBMaXN0PE1lbWJlckVudGl0eT4oKSk7CiAgICAgIGxpc3QuYWRkKG1lbWJlcik7CiAgICB9CiAgfQoKICB2b2lkIGNvbXB1dGVOZWVkZWRTdGF0aWNOb25GaW5hbEZpZWxkcygpIHsKICAgIGFkZFRvT3V0cHV0VW5pdChGaWVsZEVudGl0eSBlbGVtZW50KSB7CiAgICAgIExpc3Q8RmllbGRFbnRpdHk+IGxpc3QgPSBvdXRwdXRTdGF0aWNOb25GaW5hbEZpZWxkTGlzdHMucHV0SWZBYnNlbnQoCiAgICAgICAgICBfb3V0cHV0VW5pdERhdGEub3V0cHV0VW5pdEZvck1lbWJlcihlbGVtZW50KSwKICAgICAgICAgICgpID0+IG5ldyBMaXN0PEZpZWxkRW50aXR5PigpKTsKICAgICAgbGlzdC5hZGQoZWxlbWVudCk7CiAgICB9CgogICAgTGlzdDxGaWVsZEVudGl0eT4gZmllbGRzID0KICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGlzIHNob3VsZCBiZSBhY2Nlc3NlZCBmcm9tIGEgY29kZWdlbiBjbG9zZWQKICAgICAgICAvLyB3b3JsZC4KICAgICAgICBfd29ybGRCdWlsZGVyLmFsbFJlZmVyZW5jZWRTdGF0aWNGaWVsZHMud2hlcmUoKEZpZWxkRW50aXR5IGZpZWxkKSB7CiAgICAgIHJldHVybiBfY2xvc2VkV29ybGQuZmllbGRBbmFseXNpcy5nZXRGaWVsZERhdGEoZmllbGQpLmlzRWFnZXI7CiAgICB9KS50b0xpc3QoKTsKCiAgICBmaWVsZHMuc29ydCgoRmllbGRFbnRpdHkgYSwgRmllbGRFbnRpdHkgYikgewogICAgICBGaWVsZEFuYWx5c2lzRGF0YSBhRmllbGREYXRhID0gX2Nsb3NlZFdvcmxkLmZpZWxkQW5hbHlzaXMuZ2V0RmllbGREYXRhKGEpOwogICAgICBGaWVsZEFuYWx5c2lzRGF0YSBiRmllbGREYXRhID0gX2Nsb3NlZFdvcmxkLmZpZWxkQW5hbHlzaXMuZ2V0RmllbGREYXRhKGIpOwogICAgICBpbnQgYUluZGV4ID0gYUZpZWxkRGF0YS5lYWdlckNyZWF0aW9uSW5kZXg7CiAgICAgIGludCBiSW5kZXggPSBiRmllbGREYXRhLmVhZ2VyQ3JlYXRpb25JbmRleDsKICAgICAgaWYgKGFJbmRleCAhPSBudWxsICYmIGJJbmRleCAhPSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGFJbmRleC5jb21wYXJlVG8oYkluZGV4KTsKICAgICAgfSBlbHNlIGlmIChhSW5kZXggIT0gbnVsbCkgewogICAgICAgIC8vIFNvcnQgW2JdIGJlZm9yZSBbYV0uCiAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0gZWxzZSBpZiAoYkluZGV4ICE9IG51bGwpIHsKICAgICAgICAvLyBTb3J0IFthXSBiZWZvcmUgW2JdLgogICAgICAgIHJldHVybiAtMTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gX3NvcnRlci5jb21wYXJlTWVtYmVyc0J5TG9jYXRpb24oYSwgYik7CiAgICAgIH0KICAgIH0pOwogICAgZmllbGRzLmZvckVhY2goYWRkVG9PdXRwdXRVbml0KTsKICB9CgogIHZvaWQgY29tcHV0ZU5lZWRlZExpYnJhcmllcygpIHsKICAgIF9nZW5lcmF0ZWRDb2RlLmtleXMuZm9yRWFjaCgoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgICAgT3V0cHV0VW5pdCB1bml0ID0gX291dHB1dFVuaXREYXRhLm91dHB1dFVuaXRGb3JNZW1iZXIoZWxlbWVudCk7CiAgICAgIExpYnJhcnlFbnRpdHkgbGlicmFyeSA9IGVsZW1lbnQubGlicmFyeTsKICAgICAgb3V0cHV0TGlicmFyeUxpc3RzCiAgICAgICAgICAucHV0SWZBYnNlbnQodW5pdCwgKCkgPT4gbmV3IFNldDxMaWJyYXJ5RW50aXR5PigpKQogICAgICAgICAgLmFkZChsaWJyYXJ5KTsKICAgIH0pOwogICAgbmVlZGVkQ2xhc3Nlcy5mb3JFYWNoKChDbGFzc0VudGl0eSBlbGVtZW50KSB7CiAgICAgIE91dHB1dFVuaXQgdW5pdCA9IF9vdXRwdXRVbml0RGF0YS5vdXRwdXRVbml0Rm9yQ2xhc3MoZWxlbWVudCk7CiAgICAgIExpYnJhcnlFbnRpdHkgbGlicmFyeSA9IGVsZW1lbnQubGlicmFyeTsKICAgICAgb3V0cHV0TGlicmFyeUxpc3RzCiAgICAgICAgICAucHV0SWZBYnNlbnQodW5pdCwgKCkgPT4gbmV3IFNldDxMaWJyYXJ5RW50aXR5PigpKQogICAgICAgICAgLmFkZChsaWJyYXJ5KTsKICAgIH0pOwogIH0KCiAgdm9pZCBjb2xsZWN0KCkgewogICAgY29tcHV0ZU5lZWRlZERlY2xhcmF0aW9ucygpOwogICAgY29tcHV0ZU5lZWRlZENvbnN0YW50cygpOwogICAgY29tcHV0ZU5lZWRlZFN0YXRpY3MoKTsKICAgIGNvbXB1dGVOZWVkZWRTdGF0aWNOb25GaW5hbEZpZWxkcygpOwogICAgY29tcHV0ZU5lZWRlZExpYnJhcmllcygpOwogIH0KfQqBRABOTjwBLAFQTgRNEiIpMSgrRBYaNSAqOCMsORgBQTcsPjBDMkAxTDBBMQE0BjgrAUgBDRUcIBwaExUdGB0kGR4bFQFCN00wMkEuCAYUBAFFIEo/RUE0AUkgNhZFFUsGATFBAT9LKzgqCAYBRTABQAQBTTYoGiooLUIxJCQoBwQBNiIkSjBKAT4BUSJRSjs3CBpGGgYEAUElKjgBHytOEjI7FgE1HkweSCcIBgFFKScIBgFBNQEqMjc5EigBK0lLS05QFDYxNjw2NggGATMBQD4zBkE2BkEzBkE2Bj80BkA0BgElSgEtNjRLLUYZGk8XDxlCLxcIBgQBIDM3ASY1AUE/NysYBgQBLStLOCoZBgEfThJMRREBMVFRMjIuKSMgEiMgEw83CAglBAEiOUYvGT0ZCDJFLxk9GQgEARMhHhwpHgQCAT5wYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL3Byb2dyYW1fYnVpbGRlci9jb2xsZWN0b3IuZGFydEZzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19lbWl0dGVyL3Byb2dyYW1fYnVpbGRlci9yZWdpc3RyeS5kYXJ0k5YvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0MmpzLmpzX2VtaXR0ZXIucHJvZ3JhbV9idWlsZGVyOwoKY2xhc3MgTGlicmFyeUNvbnRlbnRzIHsKICBmaW5hbCBMaXN0PENsYXNzRW50aXR5PiBjbGFzc2VzID0gPENsYXNzRW50aXR5PltdOwogIGZpbmFsIExpc3Q8TWVtYmVyRW50aXR5PiBtZW1iZXJzID0gPE1lbWJlckVudGl0eT5bXTsKfQoKLy8vIE1hcHMgW0xpYnJhcnlFbnRpdHldcyB0byB0aGVpciBbQ2xhc3NFbnRpdHldcyBhbmQgW01lbWJlckVudGl0eV1zLgovLy8KLy8vIEZ1bmRhbWVudGFsbHksIHRoaXMgY2xhc3MgbmljZWx5IGVuY2Fwc3VsYXRlcyBhCi8vLyBgTWFwPExpYnJhcnlFbnRpdHksIFBhaXI8TGlzdDxDbGFzc0VudGl0eT4sIExpc3Q8TWVtYmVyRW50aXR5Pj4+YC4KLy8vCi8vLyBUaGVyZSBleGlzdHMgZXhhY3RseSBvbmUgaW5zdGFuY2UgcGVyIFtPdXRwdXRVbml0XS4KY2xhc3MgTGlicmFyaWVzTWFwIHsKICBmaW5hbCBNYXA8TGlicmFyeUVudGl0eSwgTGlicmFyeUNvbnRlbnRzPiBfbWFwcGluZyA9CiAgICAgIDxMaWJyYXJ5RW50aXR5LCBMaWJyYXJ5Q29udGVudHM+e307CgogIC8vIEl0IGlzIHZlcnkgY29tbW9uIHRvIGFjY2VzcyB0aGUgc2FtZSBsaWJyYXJ5IG11bHRpcGxlIHRpbWVzIGluIGEgcm93LCBzbwogIC8vIHdlIGNhY2hlIHRoZSBsYXN0IGFjY2Vzcy4KICBMaWJyYXJ5RW50aXR5IF9sYXN0TGlicmFyeTsKICBMaWJyYXJ5Q29udGVudHMgX2xhc3RNYXBwaW5nOwoKICAvLy8gQSB1bmlxdWUgbmFtZSByZXByZXNlbnRpbmcgdGhpcyBpbnN0YW5jZS4KICBmaW5hbCBTdHJpbmcgbmFtZTsKICBmaW5hbCBPdXRwdXRVbml0IG91dHB1dFVuaXQ7CgogIExpYnJhcmllc01hcC5tYWluKHRoaXMub3V0cHV0VW5pdCkgOiBuYW1lID0gIiI7CgogIExpYnJhcmllc01hcC5kZWZlcnJlZCh0aGlzLm91dHB1dFVuaXQsIHRoaXMubmFtZSkgewogICAgYXNzZXJ0KG5hbWUgIT0gIiIpOwogIH0KCiAgTGlicmFyeUNvbnRlbnRzIF9nZXRNYXBwaW5nKExpYnJhcnlFbnRpdHkgbGlicmFyeSkgewogICAgaWYgKF9sYXN0TGlicmFyeSAhPSBsaWJyYXJ5KSB7CiAgICAgIF9sYXN0TGlicmFyeSA9IGxpYnJhcnk7CiAgICAgIF9sYXN0TWFwcGluZyA9IF9tYXBwaW5nLnB1dElmQWJzZW50KGxpYnJhcnksICgpID0+IG5ldyBMaWJyYXJ5Q29udGVudHMoKSk7CiAgICB9CiAgICByZXR1cm4gX2xhc3RNYXBwaW5nOwogIH0KCiAgdm9pZCBhZGRDbGFzcyhMaWJyYXJ5RW50aXR5IGxpYnJhcnksIENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIF9nZXRNYXBwaW5nKGxpYnJhcnkpLmNsYXNzZXMuYWRkKGVsZW1lbnQpOwogIH0KCiAgdm9pZCBhZGRNZW1iZXIoTGlicmFyeUVudGl0eSBsaWJyYXJ5LCBNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgX2dldE1hcHBpbmcobGlicmFyeSkubWVtYmVycy5hZGQoZWxlbWVudCk7CiAgfQoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfbWFwcGluZy5sZW5ndGg7CgogIHZvaWQgZm9yRWFjaCgKICAgICAgdm9pZCBmKExpYnJhcnlFbnRpdHkgbGlicmFyeSwgTGlzdDxDbGFzc0VudGl0eT4gY2xhc3NlcywKICAgICAgICAgIExpc3Q8TWVtYmVyRW50aXR5PiBtZW1iZXJzKSkgewogICAgX21hcHBpbmcuZm9yRWFjaCgoTGlicmFyeUVudGl0eSBsaWJyYXJ5LCBMaWJyYXJ5Q29udGVudHMgbWFwcGluZykgewogICAgICBmKGxpYnJhcnksIG1hcHBpbmcuY2xhc3NlcywgbWFwcGluZy5tZW1iZXJzKTsKICAgIH0pOwogIH0KfQoKLy8vIEtlZXBzIHRyYWNrIG9mIGFsbCBlbGVtZW50cyBhbmQgaG9sZGVycy4KLy8vCi8vLyBUaGlzIGNsYXNzIGFzc2lnbnMgZWFjaCByZWdpc3RlcmVkIGVsZW1lbnQgdG8gaXRzIFtMaWJyYXJpZXNNYXBdICh3aGljaCBhcmUKLy8vIGluIGJpamVjdGlvbiB3aXRoIFtPdXRwdXRVbml0XXMpLgovLy8KLy8vIFJlZ2lzdGVyZWQgaG9sZGVycyBhcmUgYXNzaWduZWQgYSBuYW1lLgpjbGFzcyBSZWdpc3RyeSB7CiAgZmluYWwgT3V0cHV0VW5pdCBfbWFpbk91dHB1dFVuaXQ7CiAgZmluYWwgU29ydGVyIF9zb3J0ZXI7CiAgZmluYWwgTWFwPFN0cmluZywgSG9sZGVyPiBfaG9sZGVyc01hcCA9IDxTdHJpbmcsIEhvbGRlcj57fTsKICBmaW5hbCBNYXA8T3V0cHV0VW5pdCwgTGlicmFyaWVzTWFwPiBfZGVmZXJyZWRMaWJyYXJpZXNNYXAgPQogICAgICA8T3V0cHV0VW5pdCwgTGlicmFyaWVzTWFwPnt9OwoKICAvLy8gQ2FjaGUgZm9yIHRoZSBsYXN0IHNlZW4gb3V0cHV0IHVuaXQuCiAgT3V0cHV0VW5pdCBfbGFzdE91dHB1dFVuaXQ7CiAgTGlicmFyaWVzTWFwIF9sYXN0TGlicmFyaWVzTWFwOwoKICBJdGVyYWJsZTxIb2xkZXI+IGdldCBob2xkZXJzID0+IF9ob2xkZXJzTWFwLnZhbHVlczsKICBJdGVyYWJsZTxMaWJyYXJpZXNNYXA+IGdldCBkZWZlcnJlZExpYnJhcmllc01hcCA9PgogICAgICBfZGVmZXJyZWRMaWJyYXJpZXNNYXAudmFsdWVzOwoKICAvLyBBZGQgb25lIGZvciB0aGUgbWFpbiBsaWJyYXJpZXMgbWFwLgogIGludCBnZXQgbGlicmFyaWVzTWFwQ291bnQgPT4gX2RlZmVycmVkTGlicmFyaWVzTWFwLmxlbmd0aCArIDE7CgogIExpYnJhcmllc01hcCBtYWluTGlicmFyaWVzTWFwOwoKICBSZWdpc3RyeSh0aGlzLl9tYWluT3V0cHV0VW5pdCwgdGhpcy5fc29ydGVyKTsKCiAgTGlicmFyaWVzTWFwIF9tYXBVbml0VG9MaWJyYXJpZXNNYXAoT3V0cHV0VW5pdCB0YXJnZXRVbml0KSB7CiAgICBpZiAodGFyZ2V0VW5pdCA9PSBfbGFzdE91dHB1dFVuaXQpIHJldHVybiBfbGFzdExpYnJhcmllc01hcDsKCiAgICBMaWJyYXJpZXNNYXAgcmVzdWx0ID0gKHRhcmdldFVuaXQgPT0gX21haW5PdXRwdXRVbml0KQogICAgICAgID8gbWFpbkxpYnJhcmllc01hcAogICAgICAgIDogX2RlZmVycmVkTGlicmFyaWVzTWFwW3RhcmdldFVuaXRdOwoKICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCk7CiAgICBfbGFzdE91dHB1dFVuaXQgPSB0YXJnZXRVbml0OwogICAgX2xhc3RMaWJyYXJpZXNNYXAgPSByZXN1bHQ7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCByZWdpc3Rlck91dHB1dFVuaXQoT3V0cHV0VW5pdCBvdXRwdXRVbml0KSB7CiAgICBpZiAob3V0cHV0VW5pdCA9PSBfbWFpbk91dHB1dFVuaXQpIHsKICAgICAgYXNzZXJ0KG1haW5MaWJyYXJpZXNNYXAgPT0gbnVsbCk7CiAgICAgIG1haW5MaWJyYXJpZXNNYXAgPSBuZXcgTGlicmFyaWVzTWFwLm1haW4oX21haW5PdXRwdXRVbml0KTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydCghX2RlZmVycmVkTGlicmFyaWVzTWFwLmNvbnRhaW5zS2V5KG91dHB1dFVuaXQpKTsKICAgICAgU3RyaW5nIG5hbWUgPSBvdXRwdXRVbml0Lm5hbWU7CiAgICAgIF9kZWZlcnJlZExpYnJhcmllc01hcFtvdXRwdXRVbml0XSA9CiAgICAgICAgICBuZXcgTGlicmFyaWVzTWFwLmRlZmVycmVkKG91dHB1dFVuaXQsIG5hbWUpOwogICAgfQogIH0KCiAgLy8vIEFkZHMgYWxsIGVsZW1lbnRzIHRvIHRoZWlyIHJlc3BlY3RpdmUgbGlicmFyaWVzIGluIHRoZSBjb3JyZWN0CiAgLy8vIGxpYnJhcmllcyBtYXAuCiAgdm9pZCByZWdpc3RlckNsYXNzZXMoT3V0cHV0VW5pdCBvdXRwdXRVbml0LCBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZWxlbWVudHMpIHsKICAgIExpYnJhcmllc01hcCB0YXJnZXRMaWJyYXJpZXNNYXAgPSBfbWFwVW5pdFRvTGlicmFyaWVzTWFwKG91dHB1dFVuaXQpOwogICAgZm9yIChDbGFzc0VudGl0eSBlbGVtZW50IGluIF9zb3J0ZXIuc29ydENsYXNzZXMoZWxlbWVudHMpKSB7CiAgICAgIHRhcmdldExpYnJhcmllc01hcC5hZGRDbGFzcyhlbGVtZW50LmxpYnJhcnksIGVsZW1lbnQpOwogICAgfQogIH0KCiAgLy8vIEFkZHMgYWxsIGVsZW1lbnRzIHRvIHRoZWlyIHJlc3BlY3RpdmUgbGlicmFyaWVzIGluIHRoZSBjb3JyZWN0CiAgLy8vIGxpYnJhcmllcyBtYXAuCiAgdm9pZCByZWdpc3Rlck1lbWJlcnMoT3V0cHV0VW5pdCBvdXRwdXRVbml0LCBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IGVsZW1lbnRzKSB7CiAgICBMaWJyYXJpZXNNYXAgdGFyZ2V0TGlicmFyaWVzTWFwID0gX21hcFVuaXRUb0xpYnJhcmllc01hcChvdXRwdXRVbml0KTsKICAgIGZvciAoTWVtYmVyRW50aXR5IGVsZW1lbnQgaW4gX3NvcnRlci5zb3J0TWVtYmVycyhlbGVtZW50cykpIHsKICAgICAgdGFyZ2V0TGlicmFyaWVzTWFwLmFkZE1lbWJlcihlbGVtZW50LmxpYnJhcnksIGVsZW1lbnQpOwogICAgfQogIH0KCiAgdm9pZCByZWdpc3RlckNvbnN0YW50KE91dHB1dFVuaXQgb3V0cHV0VW5pdCwgQ29uc3RhbnRWYWx1ZSBjb25zdGFudFZhbHVlKSB7CiAgICAvLyBJZ25vcmUgZm9yIG5vdy4KICB9CgogIEhvbGRlciByZWdpc3RlckhvbGRlcihTdHJpbmcgbmFtZSwKICAgICAge2Jvb2wgaXNTdGF0aWNTdGF0ZUhvbGRlcjogZmFsc2UsIGJvb2wgaXNDb25zdGFudHNIb2xkZXI6IGZhbHNlfSkgewogICAgYXNzZXJ0KF9ob2xkZXJzTWFwW25hbWVdID09IG51bGwgfHwKICAgICAgICAoX2hvbGRlcnNNYXBbbmFtZV0uaXNTdGF0aWNTdGF0ZUhvbGRlciA9PSBpc1N0YXRpY1N0YXRlSG9sZGVyICYmCiAgICAgICAgICAgIF9ob2xkZXJzTWFwW25hbWVdLmlzQ29uc3RhbnRzSG9sZGVyID09IGlzQ29uc3RhbnRzSG9sZGVyKSk7CgogICAgcmV0dXJuIF9ob2xkZXJzTWFwLnB1dElmQWJzZW50KG5hbWUsICgpIHsKICAgICAgcmV0dXJuIG5ldyBIb2xkZXIobmFtZSwgX2hvbGRlcnNNYXAubGVuZ3RoLAogICAgICAgICAgaXNTdGF0aWNTdGF0ZUhvbGRlcjogaXNTdGF0aWNTdGF0ZUhvbGRlciwKICAgICAgICAgIGlzQ29uc3RhbnRzSG9sZGVyOiBpc0NvbnN0YW50c0hvbGRlcik7CiAgICB9KTsKICB9Cn0KgJkATk48ASwBGDU3AgFHBDRHBDgVNyoBTh8eIAEwFR8BMgE2GAQBNyMeUQYZBAE+LwQBQC8EASUBED8pSDQIBAIBLQRQJgQsESQYPj4kASseIgE2NSQBKUEBIQEwAT9BATobLQEcIiATBAEzKShBDT4lKjcGBAFFFVBKQT0GBAFFFVFKQj4GBAFOFwQBJUooSUgBLjI0MQgEAgE9cGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9wcm9ncmFtX2J1aWxkZXIvcmVnaXN0cnkuZGFydEVzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19lbWl0dGVyL3N0YXJ0dXBfZW1pdHRlci9lbWl0dGVyLmRhcnSXdy8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuanNfZW1pdHRlci5zdGFydHVwX2VtaXR0ZXI7CgppbXBvcnQgJ3BhY2thZ2U6anNfcnVudGltZS9zaGFyZWQvZW1iZWRkZWRfbmFtZXMuZGFydCcKICAgIHNob3cgSnNCdWlsdGluLCBNRVRBREFUQSwgVFlQRVM7CgppbXBvcnQgJy4uLy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi8uLi9jb21waWxlci5kYXJ0JyBzaG93IENvbXBpbGVyOwppbXBvcnQgJy4uLy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCcgc2hvdyBDb25zdGFudFZhbHVlOwppbXBvcnQgJy4uLy4uL2RlZmVycmVkX2xvYWQuZGFydCcgc2hvdyBPdXRwdXRVbml0OwppbXBvcnQgJy4uLy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uLy4uL2pzL2pzLmRhcnQnIGFzIGpzOwppbXBvcnQgJy4uLy4uL2pzX2JhY2tlbmQvanNfYmFja2VuZC5kYXJ0JyBzaG93IEphdmFTY3JpcHRCYWNrZW5kLCBOYW1lcjsKaW1wb3J0ICcuLi8uLi93b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKaW1wb3J0ICcuLi9qc19lbWl0dGVyLmRhcnQnIHNob3cgQ29kZUVtaXR0ZXJUYXNrLCBOYXRpdmVFbWl0dGVyOwppbXBvcnQgJy4uL2pzX2VtaXR0ZXIuZGFydCcgYXMgZW1pdHRlclRhc2sgc2hvdyBFbWl0dGVyQmFzZSwgRW1pdHRlckZhY3Rvcnk7CmltcG9ydCAnLi4vbW9kZWwuZGFydCc7CmltcG9ydCAnLi4vcHJvZ3JhbV9idWlsZGVyL3Byb2dyYW1fYnVpbGRlci5kYXJ0JyBzaG93IFByb2dyYW1CdWlsZGVyOwppbXBvcnQgJy4uL3NvcnRlci5kYXJ0JyBzaG93IFNvcnRlcjsKaW1wb3J0ICdtb2RlbF9lbWl0dGVyLmRhcnQnOwoKY2xhc3MgRW1pdHRlckZhY3RvcnkgaW1wbGVtZW50cyBlbWl0dGVyVGFzay5FbWl0dGVyRmFjdG9yeSB7CiAgZmluYWwgYm9vbCBnZW5lcmF0ZVNvdXJjZU1hcDsKCiAgRW1pdHRlckZhY3Rvcnkoe3RoaXMuZ2VuZXJhdGVTb3VyY2VNYXB9KTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgc3VwcG9ydHNSZWZsZWN0aW9uID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBFbWl0dGVyIGNyZWF0ZUVtaXR0ZXIoQ29kZUVtaXR0ZXJUYXNrIHRhc2ssIE5hbWVyIG5hbWVyLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsIFNvcnRlciBzb3J0ZXIpIHsKICAgIHJldHVybiBuZXcgRW1pdHRlcih0YXNrLmNvbXBpbGVyLCBuYW1lciwgdGFzay5uYXRpdmVFbWl0dGVyLCBjbG9zZWRXb3JsZCwKICAgICAgICBzb3J0ZXIsIHRhc2ssIGdlbmVyYXRlU291cmNlTWFwKTsKICB9Cn0KCmNsYXNzIEVtaXR0ZXIgZXh0ZW5kcyBlbWl0dGVyVGFzay5FbWl0dGVyQmFzZSB7CiAgZmluYWwgQ29tcGlsZXIgX2NvbXBpbGVyOwogIGZpbmFsIEpDbG9zZWRXb3JsZCBfY2xvc2VkV29ybGQ7CiAgQG92ZXJyaWRlCiAgZmluYWwgTmFtZXIgbmFtZXI7CiAgZmluYWwgTW9kZWxFbWl0dGVyIF9lbWl0dGVyOwoKICBKYXZhU2NyaXB0QmFja2VuZCBnZXQgX2JhY2tlbmQgPT4gX2NvbXBpbGVyLmJhY2tlbmQ7CgogIEVtaXR0ZXIoCiAgICAgIHRoaXMuX2NvbXBpbGVyLAogICAgICB0aGlzLm5hbWVyLAogICAgICBOYXRpdmVFbWl0dGVyIG5hdGl2ZUVtaXR0ZXIsCiAgICAgIHRoaXMuX2Nsb3NlZFdvcmxkLAogICAgICBTb3J0ZXIgc29ydGVyLAogICAgICBDb2RlRW1pdHRlclRhc2sgdGFzaywKICAgICAgYm9vbCBzaG91bGRHZW5lcmF0ZVNvdXJjZU1hcCkKICAgICAgOiBfZW1pdHRlciA9IG5ldyBNb2RlbEVtaXR0ZXIoX2NvbXBpbGVyLCBuYW1lciwgbmF0aXZlRW1pdHRlciwKICAgICAgICAgICAgX2Nsb3NlZFdvcmxkLCBzb3J0ZXIsIHRhc2ssIHNob3VsZEdlbmVyYXRlU291cmNlTWFwKTsKCiAgRGlhZ25vc3RpY1JlcG9ydGVyIGdldCByZXBvcnRlciA9PiBfY29tcGlsZXIucmVwb3J0ZXI7CgogIEBvdmVycmlkZQogIGludCBlbWl0UHJvZ3JhbShQcm9ncmFtQnVpbGRlciBwcm9ncmFtQnVpbGRlcikgewogICAgUHJvZ3JhbSBwcm9ncmFtID0gcHJvZ3JhbUJ1aWxkZXIuYnVpbGRQcm9ncmFtKCk7CiAgICBpZiAocmV0YWluRGF0YUZvclRlc3RpbmcpIHsKICAgICAgcHJvZ3JhbUZvclRlc3RpbmcgPSBwcm9ncmFtOwogICAgfQogICAgcmV0dXJuIF9lbWl0dGVyLmVtaXRQcm9ncmFtKHByb2dyYW0pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvbnN0YW50SW5saW5lZE9yQWxyZWFkeUVtaXR0ZWQoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgcmV0dXJuIF9lbWl0dGVyLmlzQ29uc3RhbnRJbmxpbmVkT3JBbHJlYWR5RW1pdHRlZChjb25zdGFudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgY29tcGFyZUNvbnN0YW50cyhDb25zdGFudFZhbHVlIGEsIENvbnN0YW50VmFsdWUgYikgewogICAgcmV0dXJuIF9lbWl0dGVyLmNvbXBhcmVDb25zdGFudHMoYSwgYik7CiAgfQoKICBAb3ZlcnJpZGUKICBqcy5FeHByZXNzaW9uIGNvbnN0YW50UmVmZXJlbmNlKENvbnN0YW50VmFsdWUgdmFsdWUpIHsKICAgIHJldHVybiBfZW1pdHRlci5nZW5lcmF0ZUNvbnN0YW50UmVmZXJlbmNlKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIGpzLkV4cHJlc3Npb24gZ2VuZXJhdGVFbWJlZGRlZEdsb2JhbEFjY2VzcyhTdHJpbmcgZ2xvYmFsKSB7CiAgICByZXR1cm4gX2VtaXR0ZXIuZ2VuZXJhdGVFbWJlZGRlZEdsb2JhbEFjY2VzcyhnbG9iYWwpOwogIH0KCiAgQG92ZXJyaWRlCiAgLy8gVE9ETyhoZXJodXQpOiBVc2UgYSBzaW5nbGUgc2hhcmVkIGZ1bmN0aW9uLgogIGpzLkV4cHJlc3Npb24gZ2VuZXJhdGVGdW5jdGlvblRoYXRSZXR1cm5zTnVsbCgpIHsKICAgIHJldHVybiBqcy5qcygnZnVuY3Rpb24oKSB7fScpOwogIH0KCiAgQG92ZXJyaWRlCiAganMuRXhwcmVzc2lvbiBpc29sYXRlTGF6eUluaXRpYWxpemVyQWNjZXNzKEZpZWxkRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBqcy5qcygnIy4jJywgWwogICAgICBuYW1lci5nbG9iYWxPYmplY3RGb3JNZW1iZXIoZWxlbWVudCksCiAgICAgIG5hbWVyLmxhenlJbml0aWFsaXplck5hbWUoZWxlbWVudCkKICAgIF0pOwogIH0KCiAgQG92ZXJyaWRlCiAganMuRXhwcmVzc2lvbiBpc29sYXRlU3RhdGljQ2xvc3VyZUFjY2VzcyhGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gX2VtaXR0ZXIuZ2VuZXJhdGVTdGF0aWNDbG9zdXJlQWNjZXNzKGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAganMuUHJvcGVydHlBY2Nlc3MgcHJvdG90eXBlQWNjZXNzKAogICAgICBDbGFzc0VudGl0eSBlbGVtZW50LCBib29sIGhhc0JlZW5JbnN0YW50aWF0ZWQpIHsKICAgIGpzLkV4cHJlc3Npb24gY29uc3RydWN0b3IgPQogICAgICAgIGhhc0JlZW5JbnN0YW50aWF0ZWQgPyBjb25zdHJ1Y3RvckFjY2VzcyhlbGVtZW50KSA6IHR5cGVBY2Nlc3MoZWxlbWVudCk7CiAgICByZXR1cm4ganMuanMoJyMucHJvdG90eXBlJywgY29uc3RydWN0b3IpOwogIH0KCiAgQG92ZXJyaWRlCiAganMuVGVtcGxhdGUgdGVtcGxhdGVGb3JCdWlsdGluKEpzQnVpbHRpbiBidWlsdGluKSB7CiAgICBzd2l0Y2ggKGJ1aWx0aW4pIHsKICAgICAgY2FzZSBKc0J1aWx0aW4uZGFydE9iamVjdENvbnN0cnVjdG9yOgogICAgICAgIENsYXNzRW50aXR5IG9iamVjdENsYXNzID0gX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzOwogICAgICAgIHJldHVybiBqcy5qcy5leHByZXNzaW9uVGVtcGxhdGVZaWVsZGluZyh0eXBlQWNjZXNzKG9iamVjdENsYXNzKSk7CgogICAgICBjYXNlIEpzQnVpbHRpbi5pc0NoZWNrUHJvcGVydHlUb0pzQ29uc3RydWN0b3JOYW1lOgogICAgICAgIGludCBpc1ByZWZpeExlbmd0aCA9IG5hbWVyLm9wZXJhdG9ySXNQcmVmaXgubGVuZ3RoOwogICAgICAgIHJldHVybiBqcy5qcy5leHByZXNzaW9uVGVtcGxhdGVGb3IoJyMuc3Vic3RyaW5nKCRpc1ByZWZpeExlbmd0aCknKTsKCiAgICAgIGNhc2UgSnNCdWlsdGluLmlzRnVuY3Rpb25UeXBlOgogICAgICAgIHJldHVybiBfYmFja2VuZC5ydGlFbmNvZGVyLnRlbXBsYXRlRm9ySXNGdW5jdGlvblR5cGU7CgogICAgICBjYXNlIEpzQnVpbHRpbi5pc0Z1dHVyZU9yVHlwZToKICAgICAgICByZXR1cm4gX2JhY2tlbmQucnRpRW5jb2Rlci50ZW1wbGF0ZUZvcklzRnV0dXJlT3JUeXBlOwoKICAgICAgY2FzZSBKc0J1aWx0aW4uaXNWb2lkVHlwZToKICAgICAgICByZXR1cm4gX2JhY2tlbmQucnRpRW5jb2Rlci50ZW1wbGF0ZUZvcklzVm9pZFR5cGU7CgogICAgICBjYXNlIEpzQnVpbHRpbi5pc0R5bmFtaWNUeXBlOgogICAgICAgIHJldHVybiBfYmFja2VuZC5ydGlFbmNvZGVyLnRlbXBsYXRlRm9ySXNEeW5hbWljVHlwZTsKCiAgICAgIGNhc2UgSnNCdWlsdGluLmlzSnNJbnRlcm9wVHlwZUFyZ3VtZW50OgogICAgICAgIHJldHVybiBfYmFja2VuZC5ydGlFbmNvZGVyLnRlbXBsYXRlRm9ySXNKc0ludGVyb3BUeXBlQXJndW1lbnQ7CgogICAgICBjYXNlIEpzQnVpbHRpbi5yYXdSdGlUb0pzQ29uc3RydWN0b3JOYW1lOgogICAgICAgIHJldHVybiBqcy5qcy5leHByZXNzaW9uVGVtcGxhdGVGb3IoIiMubmFtZSIpOwoKICAgICAgY2FzZSBKc0J1aWx0aW4ucmF3UnVudGltZVR5cGU6CiAgICAgICAgcmV0dXJuIGpzLmpzLmV4cHJlc3Npb25UZW1wbGF0ZUZvcigiIy5jb25zdHJ1Y3RvciIpOwoKICAgICAgY2FzZSBKc0J1aWx0aW4uaXNTdWJ0eXBlOgogICAgICAgIC8vIFRPRE8oZmxvaXRzY2gpOiBtb3ZlIHRoaXMgY2xvc2VyIHRvIHdoZXJlIGlzLWNoZWNrIHByb3BlcnRpZXMgYXJlCiAgICAgICAgLy8gYnVpbHQuCiAgICAgICAgU3RyaW5nIGlzUHJlZml4ID0gbmFtZXIub3BlcmF0b3JJc1ByZWZpeDsKICAgICAgICByZXR1cm4ganMuanMuZXhwcmVzc2lvblRlbXBsYXRlRm9yKCIoJyRpc1ByZWZpeCcgKyAjKSBpbiAjLnByb3RvdHlwZSIpOwoKICAgICAgY2FzZSBKc0J1aWx0aW4uaXNHaXZlblR5cGVSdGk6CiAgICAgICAgcmV0dXJuIGpzLmpzLmV4cHJlc3Npb25UZW1wbGF0ZUZvcignIy5uYW1lID09PSAjJyk7CgogICAgICBjYXNlIEpzQnVpbHRpbi5nZXRNZXRhZGF0YToKICAgICAgICBTdHJpbmcgbWV0YWRhdGFBY2Nlc3MgPQogICAgICAgICAgICBfZW1pdHRlci5nZW5lcmF0ZUVtYmVkZGVkR2xvYmFsQWNjZXNzU3RyaW5nKE1FVEFEQVRBKTsKICAgICAgICByZXR1cm4ganMuanMuZXhwcmVzc2lvblRlbXBsYXRlRm9yKCIkbWV0YWRhdGFBY2Nlc3NbI10iKTsKCiAgICAgIGNhc2UgSnNCdWlsdGluLmdldFR5cGU6CiAgICAgICAgU3RyaW5nIHR5cGVzQWNjZXNzID0gX2VtaXR0ZXIuZ2VuZXJhdGVFbWJlZGRlZEdsb2JhbEFjY2Vzc1N0cmluZyhUWVBFUyk7CiAgICAgICAgcmV0dXJuIGpzLmpzLmV4cHJlc3Npb25UZW1wbGF0ZUZvcigiJHR5cGVzQWNjZXNzWyNdIik7CgogICAgICBkZWZhdWx0OgogICAgICAgIHJlcG9ydGVyLmludGVybmFsRXJyb3IoCiAgICAgICAgICAgIE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwgIlVuaGFuZGxlZCBCdWlsdGluOiAkYnVpbHRpbiIpOwogICAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdlbmVyYXRlZFNpemUoT3V0cHV0VW5pdCB1bml0KSB7CiAgICBpZiAoX2VtaXR0ZXIub21pdHRlZEZyYWdtZW50cy5hbnkoKGYpID0+IGYub3V0cHV0VW5pdCA9PSB1bml0KSkgewogICAgICByZXR1cm4gMDsKICAgIH0KICAgIEZyYWdtZW50IGtleSA9IF9lbWl0dGVyLm91dHB1dEJ1ZmZlcnMua2V5cwogICAgICAgIC5maXJzdFdoZXJlKChGcmFnbWVudCBmcmFnbWVudCkgPT4gZnJhZ21lbnQub3V0cHV0VW5pdCA9PSB1bml0KTsKICAgIHJldHVybiBfZW1pdHRlci5vdXRwdXRCdWZmZXJzW2tleV0ubGVuZ3RoOwogIH0KfQqAuwBOTjwBLAE3JQEcLDkzJyFJLUFNGEYlHQE9IAEsAQwoAQw7MU4qBAIBMBwjDBUfATcBCxYSIxkVHCRFQgE5AQwzNSAjBioEAQxDQQQBDDssBAEMOTYEAQw+OgQBDDE0IwQBDEQaLCkIBAEMRToEAQwlNyBQLgQBDDYXLEtKATk8TAElPgElPgEhOgEkPQEuRwEwNgElPQEgTRIyUAElPAEiIENCAR5RPwEPIEMVBgQBDCdGEAYvSS8EAgE8cGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9zdGFydHVwX2VtaXR0ZXIvZW1pdHRlci5kYXJ0QXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2JhY2tlbmQvanNfaW50ZXJvcF9hbmFseXNpcy5kYXJ0iLcvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIEFuYWx5c2lzIHRvIGRldGVybWluZSBob3cgdG8gZ2VuZXJhdGUgY29kZSBmb3IgdHlwZWQgSmF2YVNjcmlwdCBpbnRlcm9wLgpsaWJyYXJ5IGNvbXBpbGVyLnNyYy5qc19iYWNrZW5kLmpzX2ludGVyb3BfYW5hbHlzaXM7CgppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIGFzIGpzQXN0OwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIHNob3cganM7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCcgc2hvdyBTZWxlY3RvcjsKaW1wb3J0ICcuLi91bml2ZXJzZS9jb2RlZ2VuX3dvcmxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvd29ybGRfYnVpbGRlci5kYXJ0JyBzaG93IFNlbGVjdG9yQ29uc3RyYWludHM7CmltcG9ydCAnbmFtZXIuZGFydCc7CmltcG9ydCAnbmF0aXZlX2RhdGEuZGFydCc7Cgpqc0FzdC5TdGF0ZW1lbnQgYnVpbGRKc0ludGVyb3BCb290c3RyYXAoQ29kZWdlbldvcmxkQnVpbGRlciBjb2RlZ2VuV29ybGRCdWlsZGVyLAogICAgTmF0aXZlQmFzaWNEYXRhIG5hdGl2ZUJhc2ljRGF0YSwgTmFtZXIgbmFtZXIpIHsKICBpZiAoIW5hdGl2ZUJhc2ljRGF0YS5pc0pzSW50ZXJvcFVzZWQpIHJldHVybiBudWxsOwogIExpc3Q8anNBc3QuU3RhdGVtZW50PiBzdGF0ZW1lbnRzID0gPGpzQXN0LlN0YXRlbWVudD5bXTsKICBjb2RlZ2VuV29ybGRCdWlsZGVyLmZvckVhY2hJbnZva2VkTmFtZSgKICAgICAgKFN0cmluZyBuYW1lLCBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+IHNlbGVjdG9ycykgewogICAgc2VsZWN0b3JzLmZvckVhY2goKFNlbGVjdG9yIHNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzIGNvbnN0cmFpbnRzKSB7CiAgICAgIGlmIChzZWxlY3Rvci5pc0Nsb3N1cmVDYWxsKSB7CiAgICAgICAgLy8gVE9ETyhqYWNvYnIpOiBzdXBwb3J0IG5hbWVkIGFyZ3VtZW50cy4KICAgICAgICBpZiAoc2VsZWN0b3IubmFtZWRBcmd1bWVudENvdW50ID4gMCkgcmV0dXJuOwogICAgICAgIGludCBhcmd1bWVudENvdW50ID0gc2VsZWN0b3IuYXJndW1lbnRDb3VudDsKICAgICAgICBTdHJpbmcgY2FuZGlkYXRlUGFyYW1ldGVyTmFtZXMgPQogICAgICAgICAgICAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWic7CiAgICAgICAgTGlzdDxTdHJpbmc+IHBhcmFtZXRlcnMgPSBuZXcgTGlzdDxTdHJpbmc+LmdlbmVyYXRlKAogICAgICAgICAgICBhcmd1bWVudENvdW50LCAoaSkgPT4gY2FuZGlkYXRlUGFyYW1ldGVyTmFtZXNbaV0pOwoKICAgICAgICBqc0FzdC5OYW1lIG5hbWUgPSBuYW1lci5pbnZvY2F0aW9uTmFtZShzZWxlY3Rvcik7CiAgICAgICAgc3RhdGVtZW50cy5hZGQoanMuc3RhdGVtZW50KAogICAgICAgICAgICAnRnVuY3Rpb24ucHJvdG90eXBlLiMgPSBmdW5jdGlvbigjKSB7IHJldHVybiB0aGlzKCMpIH0nLAogICAgICAgICAgICBbbmFtZSwgcGFyYW1ldGVycywgcGFyYW1ldGVyc10pKTsKICAgICAgfQogICAgfSk7CiAgfSk7CiAgcmV0dXJuIG5ldyBqc0FzdC5CbG9jayhzdGF0ZW1lbnRzKTsKfQoKRnVuY3Rpb25UeXBlIGJ1aWxkSnNGdW5jdGlvblR5cGUoKSB7CiAgLy8gVE9ETyhqYWNvYnIpOiBjb25zaWRlciB1c2luZyBjb2RlZ2VuV29ybGRCdWlsZGVyLmlzQ2hlY2tzIHRvIGRldGVybWluZSB0aGUKICAvLyByYW5nZSBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50cyB0aGF0IG5lZWQgdG8gYmUgc3VwcG9ydGVkIGJ5IEphdmFTY3JpcHQKICAvLyBmdW5jdGlvbiB0eXBlcy4KICByZXR1cm4gbmV3IEZ1bmN0aW9uVHlwZSgKICAgICAgY29uc3QgRHluYW1pY1R5cGUoKSwKICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKDE2LCBjb25zdCBEeW5hbWljVHlwZSgpKSwKICAgICAgY29uc3QgPFN0cmluZz5bXSwKICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICBjb25zdCA8RnVuY3Rpb25UeXBlVmFyaWFibGU+W10pOwp9CjgATk48AU01ASEhIDIxQhUbAVE0NToqRE0kMjU0KUQ9PwE6JUUuCAgGJgIBJVBLFRsbGjoYGicCAThwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL2pzX2ludGVyb3BfYW5hbHlzaXMuZGFydDZzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9yZXNvbHV0aW9uL3JlZ2lzdHJ5LmRhcnSWZC8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMucmVzb2x1dGlvbi5yZWdpc3RyeTsKCmltcG9ydCAnLi4vY29tbW9uL3Jlc29sdXRpb24uZGFydCcgc2hvdyBSZXNvbHV0aW9uSW1wYWN0OwppbXBvcnQgJy4uL2NvbnN0YW50cy9leHByZXNzaW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JyBzaG93IENsYXNzRW50aXR5OwppbXBvcnQgJy4uL3VuaXZlcnNlL2ZlYXR1cmUuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvd29ybGRfaW1wYWN0LmRhcnQnIHNob3cgV29ybGRJbXBhY3QsIFdvcmxkSW1wYWN0QnVpbGRlckltcGw7CmltcG9ydCAnLi4vdXRpbC9lbnVtc2V0LmRhcnQnIHNob3cgRW51bVNldDsKaW1wb3J0ICcuLi91dGlsL3V0aWwuZGFydCcgc2hvdyBTZXRsZXQ7CgpjbGFzcyBSZXNvbHV0aW9uV29ybGRJbXBhY3RCdWlsZGVyIGV4dGVuZHMgV29ybGRJbXBhY3RCdWlsZGVySW1wbAogICAgaW1wbGVtZW50cyBSZXNvbHV0aW9uSW1wYWN0IHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBFbnVtU2V0PEZlYXR1cmU+IF9mZWF0dXJlczsKICBTZXRsZXQ8TWFwTGl0ZXJhbFVzZT4gX21hcExpdGVyYWxzOwogIFNldGxldDxTZXRMaXRlcmFsVXNlPiBfc2V0TGl0ZXJhbHM7CiAgU2V0bGV0PExpc3RMaXRlcmFsVXNlPiBfbGlzdExpdGVyYWxzOwogIFNldGxldDxTdHJpbmc+IF9jb25zdFN5bWJvbE5hbWVzOwogIFNldGxldDxDb25zdGFudEV4cHJlc3Npb24+IF9jb25zdGFudExpdGVyYWxzOwogIFNldGxldDxkeW5hbWljPiBfbmF0aXZlRGF0YTsKICBTZXRsZXQ8Q2xhc3NFbnRpdHk+IF9zZWVuQ2xhc3NlczsKICBTZXQ8UnVudGltZVR5cGVVc2U+IF9ydW50aW1lVHlwZVVzZXM7CiAgU2V0PEdlbmVyaWNJbnN0YW50aWF0aW9uPiBfZ2VuZXJpY0luc3RhbnRpYXRpb25zOwoKICBSZXNvbHV0aW9uV29ybGRJbXBhY3RCdWlsZGVyKHRoaXMubmFtZSk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gZmFsc2U7CgogIHZvaWQgcmVnaXN0ZXJNYXBMaXRlcmFsKE1hcExpdGVyYWxVc2UgbWFwTGl0ZXJhbFVzZSkgewogICAgYXNzZXJ0KG1hcExpdGVyYWxVc2UgIT0gbnVsbCk7CiAgICBfbWFwTGl0ZXJhbHMgPz89IG5ldyBTZXRsZXQ8TWFwTGl0ZXJhbFVzZT4oKTsKICAgIF9tYXBMaXRlcmFscy5hZGQobWFwTGl0ZXJhbFVzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxNYXBMaXRlcmFsVXNlPiBnZXQgbWFwTGl0ZXJhbHMgewogICAgcmV0dXJuIF9tYXBMaXRlcmFscyAhPSBudWxsID8gX21hcExpdGVyYWxzIDogY29uc3QgPE1hcExpdGVyYWxVc2U+W107CiAgfQoKICB2b2lkIHJlZ2lzdGVyU2V0TGl0ZXJhbChTZXRMaXRlcmFsVXNlIHNldExpdGVyYWxVc2UpIHsKICAgIGFzc2VydChzZXRMaXRlcmFsVXNlICE9IG51bGwpOwogICAgX3NldExpdGVyYWxzID8/PSBuZXcgU2V0bGV0PFNldExpdGVyYWxVc2U+KCk7CiAgICBfc2V0TGl0ZXJhbHMuYWRkKHNldExpdGVyYWxVc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8U2V0TGl0ZXJhbFVzZT4gZ2V0IHNldExpdGVyYWxzID0+CiAgICAgIF9zZXRMaXRlcmFscyA/PyBjb25zdCA8U2V0TGl0ZXJhbFVzZT5bXTsKCiAgdm9pZCByZWdpc3Rlckxpc3RMaXRlcmFsKExpc3RMaXRlcmFsVXNlIGxpc3RMaXRlcmFsVXNlKSB7CiAgICBhc3NlcnQobGlzdExpdGVyYWxVc2UgIT0gbnVsbCk7CiAgICBfbGlzdExpdGVyYWxzID8/PSBuZXcgU2V0bGV0PExpc3RMaXRlcmFsVXNlPigpOwogICAgX2xpc3RMaXRlcmFscy5hZGQobGlzdExpdGVyYWxVc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8TGlzdExpdGVyYWxVc2U+IGdldCBsaXN0TGl0ZXJhbHMgewogICAgcmV0dXJuIF9saXN0TGl0ZXJhbHMgIT0gbnVsbCA/IF9saXN0TGl0ZXJhbHMgOiBjb25zdCA8TGlzdExpdGVyYWxVc2U+W107CiAgfQoKICB2b2lkIHJlZ2lzdGVyUnVudGltZVR5cGVVc2UoUnVudGltZVR5cGVVc2UgcnVudGltZVR5cGVVc2UpIHsKICAgIGFzc2VydChydW50aW1lVHlwZVVzZSAhPSBudWxsKTsKICAgIF9ydW50aW1lVHlwZVVzZXMgPz89IG5ldyBTZXRsZXQ8UnVudGltZVR5cGVVc2U+KCk7CiAgICBfcnVudGltZVR5cGVVc2VzLmFkZChydW50aW1lVHlwZVVzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxSdW50aW1lVHlwZVVzZT4gZ2V0IHJ1bnRpbWVUeXBlVXNlcyB7CiAgICByZXR1cm4gX3J1bnRpbWVUeXBlVXNlcyAhPSBudWxsCiAgICAgICAgPyBfcnVudGltZVR5cGVVc2VzCiAgICAgICAgOiBjb25zdCA8UnVudGltZVR5cGVVc2U+W107CiAgfQoKICB2b2lkIHJlZ2lzdGVyQ29uc3RTeW1ib2xOYW1lKFN0cmluZyBuYW1lKSB7CiAgICBfY29uc3RTeW1ib2xOYW1lcyA/Pz0gbmV3IFNldGxldDxTdHJpbmc+KCk7CiAgICBfY29uc3RTeW1ib2xOYW1lcy5hZGQobmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxTdHJpbmc+IGdldCBjb25zdFN5bWJvbE5hbWVzIHsKICAgIHJldHVybiBfY29uc3RTeW1ib2xOYW1lcyAhPSBudWxsID8gX2NvbnN0U3ltYm9sTmFtZXMgOiBjb25zdCA8U3RyaW5nPltdOwogIH0KCiAgdm9pZCByZWdpc3RlckZlYXR1cmUoRmVhdHVyZSBmZWF0dXJlKSB7CiAgICBfZmVhdHVyZXMgPz89IG5ldyBFbnVtU2V0PEZlYXR1cmU+KCk7CiAgICBfZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8RmVhdHVyZT4gZ2V0IGZlYXR1cmVzIHsKICAgIHJldHVybiBfZmVhdHVyZXMgIT0gbnVsbAogICAgICAgID8gX2ZlYXR1cmVzLml0ZXJhYmxlKEZlYXR1cmUudmFsdWVzKQogICAgICAgIDogY29uc3QgPEZlYXR1cmU+W107CiAgfQoKICB2b2lkIHJlZ2lzdGVyQ29uc3RhbnRMaXRlcmFsKENvbnN0YW50RXhwcmVzc2lvbiBjb25zdGFudCkgewogICAgX2NvbnN0YW50TGl0ZXJhbHMgPz89IG5ldyBTZXRsZXQ8Q29uc3RhbnRFeHByZXNzaW9uPigpOwogICAgX2NvbnN0YW50TGl0ZXJhbHMuYWRkKGNvbnN0YW50KTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPENvbnN0YW50RXhwcmVzc2lvbj4gZ2V0IGNvbnN0YW50TGl0ZXJhbHMgewogICAgcmV0dXJuIF9jb25zdGFudExpdGVyYWxzICE9IG51bGwKICAgICAgICA/IF9jb25zdGFudExpdGVyYWxzCiAgICAgICAgOiBjb25zdCA8Q29uc3RhbnRFeHByZXNzaW9uPltdOwogIH0KCiAgdm9pZCByZWdpc3Rlck5hdGl2ZURhdGEoZHluYW1pYyBuYXRpdmVEYXRhKSB7CiAgICBhc3NlcnQobmF0aXZlRGF0YSAhPSBudWxsKTsKICAgIF9uYXRpdmVEYXRhID8/PSBuZXcgU2V0bGV0PGR5bmFtaWM+KCk7CiAgICBfbmF0aXZlRGF0YS5hZGQobmF0aXZlRGF0YSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxkeW5hbWljPiBnZXQgbmF0aXZlRGF0YSB7CiAgICByZXR1cm4gX25hdGl2ZURhdGEgIT0gbnVsbCA/IF9uYXRpdmVEYXRhIDogY29uc3QgPGR5bmFtaWM+W107CiAgfQoKICB2b2lkIHJlZ2lzdGVyU2VlbkNsYXNzKENsYXNzRW50aXR5IHNlZW5DbGFzcykgewogICAgX3NlZW5DbGFzc2VzID8/PSBuZXcgU2V0bGV0PENsYXNzRW50aXR5PigpOwogICAgX3NlZW5DbGFzc2VzLmFkZChzZWVuQ2xhc3MpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGdldCBzZWVuQ2xhc3NlcyB7CiAgICByZXR1cm4gX3NlZW5DbGFzc2VzID8/IGNvbnN0IDxDbGFzc0VudGl0eT5bXTsKICB9CgogIHZvaWQgcmVnaXN0ZXJJbnN0YW50aWF0aW9uKEdlbmVyaWNJbnN0YW50aWF0aW9uIGluc3RhbnRpYXRpb24pIHsKICAgIF9nZW5lcmljSW5zdGFudGlhdGlvbnMgPz89IG5ldyBTZXQ8R2VuZXJpY0luc3RhbnRpYXRpb24+KCk7CiAgICBfZ2VuZXJpY0luc3RhbnRpYXRpb25zLmFkZChpbnN0YW50aWF0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPEdlbmVyaWNJbnN0YW50aWF0aW9uPiBnZXQgZ2VuZXJpY0luc3RhbnRpYXRpb25zIHsKICAgIHJldHVybiBfZ2VuZXJpY0luc3RhbnRpYXRpb25zID8/IGNvbnN0IDxHZW5lcmljSW5zdGFudGlhdGlvbj5bXTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCdSZXNvbHV0aW9uV29ybGRJbXBhY3RCdWlsZGVyKCRuYW1lKScpOwogICAgV29ybGRJbXBhY3QucHJpbnRPbihzYiwgdGhpcyk7CiAgICBpZiAoX2ZlYXR1cmVzICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJ1xuIGZlYXR1cmVzOicpOwogICAgICBmb3IgKEZlYXR1cmUgZmVhdHVyZSBpbiBfZmVhdHVyZXMuaXRlcmFibGUoRmVhdHVyZS52YWx1ZXMpKSB7CiAgICAgICAgc2Iud3JpdGUoJ1xuICAkZmVhdHVyZScpOwogICAgICB9CiAgICB9CiAgICBpZiAoX21hcExpdGVyYWxzICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJ1xuIG1hcC1saXRlcmFsczonKTsKICAgICAgZm9yIChNYXBMaXRlcmFsVXNlIHVzZSBpbiBfbWFwTGl0ZXJhbHMpIHsKICAgICAgICBzYi53cml0ZSgnXG4gICR1c2UnKTsKICAgICAgfQogICAgfQogICAgaWYgKF9zZXRMaXRlcmFscyAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCdcbiBzZXQtbGl0ZXJhbHM6Jyk7CiAgICAgIGZvciAoU2V0TGl0ZXJhbFVzZSB1c2UgaW4gX3NldExpdGVyYWxzKSB7CiAgICAgICAgc2Iud3JpdGUoJ1xuICAkdXNlJyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfbGlzdExpdGVyYWxzICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJ1xuIGxpc3QtbGl0ZXJhbHM6Jyk7CiAgICAgIGZvciAoTGlzdExpdGVyYWxVc2UgdXNlIGluIF9saXN0TGl0ZXJhbHMpIHsKICAgICAgICBzYi53cml0ZSgnXG4gICR1c2UnKTsKICAgICAgfQogICAgfQogICAgaWYgKF9jb25zdGFudExpdGVyYWxzICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJ1xuIGNvbnN0LWxpdGVyYWxzOicpOwogICAgICBmb3IgKENvbnN0YW50RXhwcmVzc2lvbiBjb25zdGFudCBpbiBfY29uc3RhbnRMaXRlcmFscykgewogICAgICAgIHNiLndyaXRlKCdcbiAgJHtjb25zdGFudC50b0RhcnRUZXh0KCl9Jyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfY29uc3RTeW1ib2xOYW1lcyAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCdcbiBjb25zdC1zeW1ib2wtbmFtZXM6ICRfY29uc3RTeW1ib2xOYW1lcycpOwogICAgfQogICAgaWYgKF9uYXRpdmVEYXRhICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJ1xuIG5hdGl2ZS1kYXRhOicpOwogICAgICBmb3IgKHZhciBkYXRhIGluIF9uYXRpdmVEYXRhKSB7CiAgICAgICAgc2Iud3JpdGUoJ1xuICAkZGF0YScpOwogICAgICB9CiAgICB9CiAgICBpZiAoX2dlbmVyaWNJbnN0YW50aWF0aW9ucyAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCdcbiBpbnN0YW50aWF0aW9uczonKTsKICAgICAgZm9yICh2YXIgZGF0YSBpbiBfZ2VuZXJpY0luc3RhbnRpYXRpb25zKSB7CiAgICAgICAgc2Iud3JpdGUoJ1xuICAkZGF0YScpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KgMYATk48ASUBOig1I1EsKAFCIhUeJiYoJDAfJCg0ASsBDB0BOSMyJQQBDCxKBAE5IzIlBAEMLS8BPCQ0JwQBDC5NBAE/JDcqBAEMMSQbJAQBLjAhBAEMKk0EASoqHAQBDCMdLR0EAT48JQQBDDYlHCgEATAgKyEEAQwlQgQBMjAhBAEMKjIEAUNALwQBDD1FBAEMFio1Ix0gRCIIBiAkMB4IBiAkMB4IBiElMh4IBiUmPzIIBiU9Bh8jJh8IBiomMR8IBhoEAgEtcGFja2FnZTpjb21waWxlci9zcmMvcmVzb2x1dGlvbi9yZWdpc3RyeS5kYXJ0MHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3V0aWwvZmVhdHVyZXMuZGFydJIiLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBTZXQgb2YgZmVhdHVyZXMgdXNlZCBpbiBhbm5vdGF0aW9ucy4KY2xhc3MgRmVhdHVyZXMgewogIE1hcDxTdHJpbmcsIE9iamVjdD4gX2ZlYXR1cmVzID0ge307CgogIHZvaWQgYWRkKFN0cmluZyBrZXksIHt2YXIgdmFsdWU6ICcnfSkgewogICAgX2ZlYXR1cmVzW2tleV0gPSB2YWx1ZS50b1N0cmluZygpOwogIH0KCiAgdm9pZCBhZGRFbGVtZW50KFN0cmluZyBrZXksIFt2YXIgdmFsdWVdKSB7CiAgICBMaXN0PFN0cmluZz4gbGlzdCA9IF9mZWF0dXJlcy5wdXRJZkFic2VudChrZXksICgpID0+IDxTdHJpbmc+W10pOwogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgbGlzdC5hZGQodmFsdWUudG9TdHJpbmcoKSk7CiAgICB9CiAgfQoKICBib29sIGNvbnRhaW5zS2V5KFN0cmluZyBrZXkpIHsKICAgIHJldHVybiBfZmVhdHVyZXMuY29udGFpbnNLZXkoa2V5KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewogICAgX2ZlYXR1cmVzW2tleV0gPSB2YWx1ZTsKICB9CgogIE9iamVjdCBvcGVyYXRvciBbXShTdHJpbmcga2V5KSA9PiBfZmVhdHVyZXNba2V5XTsKCiAgT2JqZWN0IHJlbW92ZShTdHJpbmcga2V5KSA9PiBfZmVhdHVyZXMucmVtb3ZlKGtleSk7CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2ZlYXR1cmVzLmlzRW1wdHk7CgogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gX2ZlYXR1cmVzLmlzTm90RW1wdHk7CgogIHZvaWQgZm9yRWFjaCh2b2lkIEZ1bmN0aW9uKFN0cmluZywgT2JqZWN0KSBmKSB7CiAgICBfZmVhdHVyZXMuZm9yRWFjaChmKTsKICB9CgogIC8vLyBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGZlYXR1cmVzIGluIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgc29ydGVkCiAgLy8vIGJ5IGZlYXR1cmUgbmFtZXMuCiAgU3RyaW5nIGdldFRleHQoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBib29sIG5lZWRzQ29tbWEgPSBmYWxzZTsKICAgIGZvciAoU3RyaW5nIG5hbWUgaW4gX2ZlYXR1cmVzLmtleXMudG9MaXN0KCkuLnNvcnQoKSkgewogICAgICBkeW5hbWljIHZhbHVlID0gX2ZlYXR1cmVzW25hbWVdOwogICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICAgIGlmIChuZWVkc0NvbW1hKSB7CiAgICAgICAgICBzYi53cml0ZSgnLCcpOwogICAgICAgIH0KICAgICAgICBzYi53cml0ZShuYW1lKTsKICAgICAgICBpZiAodmFsdWUgaXMgTGlzdDxTdHJpbmc+KSB7CiAgICAgICAgICB2YWx1ZSA9ICdbJHsodmFsdWUuLnNvcnQoKSkuam9pbignLCcpfV0nOwogICAgICAgIH0KICAgICAgICBpZiAodmFsdWUgIT0gJycpIHsKICAgICAgICAgIHNiLndyaXRlKCc9Jyk7CiAgICAgICAgICBzYi53cml0ZSh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIG5lZWRzQ29tbWEgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdGZWF0dXJlcygke2dldFRleHQoKX0pJzsKCiAgLy8vIENyZWF0ZXMgYSBbRmVhdHVyZXNdIG9iamVjdCBieSBwYXJzZSB0aGUgW3RleHRdIGVuY29kaW5nLgogIC8vLwogIC8vLyBTaW5nbGUgZmVhdHVyZXMgd2lsbCBiZSBwYXJzZWQgYXMgc3RyaW5ncyBhbmQgbGlzdCBmZWF0dXJlcyAoZmVhdHVyZXMKICAvLy8gZW5jb2RlZCBpbiBgWy4uLl1gIHdpbGwgYmUgcGFyc2VkIGFzIGxpc3RzIG9mIHN0cmluZ3MuCiAgc3RhdGljIEZlYXR1cmVzIGZyb21UZXh0KFN0cmluZyB0ZXh0KSB7CiAgICBGZWF0dXJlcyBmZWF0dXJlcyA9IG5ldyBGZWF0dXJlcygpOwogICAgaWYgKHRleHQgPT0gbnVsbCkgcmV0dXJuIGZlYXR1cmVzOwogICAgaW50IGluZGV4ID0gMDsKICAgIHdoaWxlIChpbmRleCA8IHRleHQubGVuZ3RoKSB7CiAgICAgIGludCBlcVBvcyA9IHRleHQuaW5kZXhPZignPScsIGluZGV4KTsKICAgICAgaW50IGNvbW1hUG9zID0gdGV4dC5pbmRleE9mKCcsJywgaW5kZXgpOwogICAgICBTdHJpbmcgbmFtZTsKICAgICAgYm9vbCBoYXNWYWx1ZSA9IGZhbHNlOwogICAgICBpZiAoZXFQb3MgIT0gLTEgJiYgY29tbWFQb3MgIT0gLTEpIHsKICAgICAgICBpZiAoZXFQb3MgPCBjb21tYVBvcykgewogICAgICAgICAgbmFtZSA9IHRleHQuc3Vic3RyaW5nKGluZGV4LCBlcVBvcyk7CiAgICAgICAgICBoYXNWYWx1ZSA9IHRydWU7CiAgICAgICAgICBpbmRleCA9IGVxUG9zICsgMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmFtZSA9IHRleHQuc3Vic3RyaW5nKGluZGV4LCBjb21tYVBvcyk7CiAgICAgICAgICBpbmRleCA9IGNvbW1hUG9zICsgMTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZXFQb3MgIT0gLTEpIHsKICAgICAgICBuYW1lID0gdGV4dC5zdWJzdHJpbmcoaW5kZXgsIGVxUG9zKTsKICAgICAgICBoYXNWYWx1ZSA9IHRydWU7CiAgICAgICAgaW5kZXggPSBlcVBvcyArIDE7CiAgICAgIH0gZWxzZSBpZiAoY29tbWFQb3MgIT0gLTEpIHsKICAgICAgICBuYW1lID0gdGV4dC5zdWJzdHJpbmcoaW5kZXgsIGNvbW1hUG9zKTsKICAgICAgICBpbmRleCA9IGNvbW1hUG9zICsgMTsKICAgICAgfSBlbHNlIHsKICAgICAgICBuYW1lID0gdGV4dC5zdWJzdHJpbmcoaW5kZXgpOwogICAgICAgIGluZGV4ID0gdGV4dC5sZW5ndGg7CiAgICAgIH0KICAgICAgaWYgKGhhc1ZhbHVlKSB7CiAgICAgICAgY29uc3QgTWFwPFN0cmluZywgU3RyaW5nPiBkZWxpbWl0ZXJzID0gY29uc3QgewogICAgICAgICAgJ1snOiAnXScsCiAgICAgICAgICAneyc6ICd9JywKICAgICAgICAgICcoJzogJyknLAogICAgICAgICAgJzwnOiAnPicKICAgICAgICB9OwogICAgICAgIExpc3Q8U3RyaW5nPiBlbmREZWxpbWl0ZXJzID0gPFN0cmluZz5bXTsKICAgICAgICBib29sIGlzTGlzdCA9IGluZGV4IDwgdGV4dC5sZW5ndGggJiYgdGV4dC5zdGFydHNXaXRoKCdbJywgaW5kZXgpOwogICAgICAgIGlmIChpc0xpc3QpIHsKICAgICAgICAgIGZlYXR1cmVzLmFkZEVsZW1lbnQobmFtZSk7CiAgICAgICAgICBlbmREZWxpbWl0ZXJzLmFkZCgnXScpOwogICAgICAgICAgaW5kZXgrKzsKICAgICAgICB9CiAgICAgICAgaW50IHZhbHVlU3RhcnQgPSBpbmRleDsKICAgICAgICB3aGlsZSAoaW5kZXggPCB0ZXh0Lmxlbmd0aCkgewogICAgICAgICAgU3RyaW5nIGNoYXIgPSB0ZXh0LnN1YnN0cmluZyhpbmRleCwgaW5kZXggKyAxKTsKICAgICAgICAgIGlmIChlbmREZWxpbWl0ZXJzLmlzTm90RW1wdHkgJiYgZW5kRGVsaW1pdGVycy5sYXN0ID09IGNoYXIpIHsKICAgICAgICAgICAgZW5kRGVsaW1pdGVycy5yZW1vdmVMYXN0KCk7CiAgICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBTdHJpbmcgZW5kRGVsaW1pdGVyID0gZGVsaW1pdGVyc1tjaGFyXTsKICAgICAgICAgICAgaWYgKGVuZERlbGltaXRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgZW5kRGVsaW1pdGVycy5hZGQoZW5kRGVsaW1pdGVyKTsKICAgICAgICAgICAgICBpbmRleCsrOwogICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJywnKSB7CiAgICAgICAgICAgICAgaWYgKGVuZERlbGltaXRlcnMuaXNFbXB0eSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbmREZWxpbWl0ZXJzLmxlbmd0aCA9PSAxICYmIGlzTGlzdCkgewogICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gdGV4dC5zdWJzdHJpbmcodmFsdWVTdGFydCwgaW5kZXgpOwogICAgICAgICAgICAgICAgZmVhdHVyZXMuYWRkRWxlbWVudChuYW1lLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICBpbmRleCsrOwogICAgICAgICAgICAgICAgdmFsdWVTdGFydCA9IGluZGV4OwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpbmRleCsrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpbmRleCsrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpc0xpc3QpIHsKICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHRleHQuc3Vic3RyaW5nKHZhbHVlU3RhcnQsIGluZGV4IC0gMSk7CiAgICAgICAgICBpZiAodmFsdWUuaXNOb3RFbXB0eSkgewogICAgICAgICAgICBmZWF0dXJlcy5hZGRFbGVtZW50KG5hbWUsIHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgU3RyaW5nIHZhbHVlID0gdGV4dC5zdWJzdHJpbmcodmFsdWVTdGFydCwgaW5kZXgpOwogICAgICAgICAgZmVhdHVyZXMuYWRkKG5hbWUsIHZhbHVlOiB2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGluZGV4Kys7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZmVhdHVyZXMuYWRkKG5hbWUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmVhdHVyZXM7CiAgfQp9CoCgAE5OPAEpESYBKicEAS1GGSIGBAEhJwQBMBwEATQBNgEpAS8BMhoEAVAYFSodOycbGhkKGCU0ChsZGwobCAYaBAEMMQFABkw9KignEyIsLxMdKyAvGx0RMiAKIC0ZGyMwHg8mHQgWNxQUFBMLMUoWJSITCiAmOkgoFRM0KC8XJisXQEIyGSQXGRAVFw4MChZAIi4METwsChEPHAgGFQQCASdwYWNrYWdlOmNvbXBpbGVyL3NyYy91dGlsL2ZlYXR1cmVzLmRhcnRIc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3BhcnNlci9saXRlcmFsX2VudHJ5X2luZm9faW1wbC5kYXJ0n8kvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uLy4uL3NjYW5uZXIvdG9rZW4uZGFydCc7CmltcG9ydCAnbGl0ZXJhbF9lbnRyeV9pbmZvLmRhcnQnOwppbXBvcnQgJ3BhcnNlci5kYXJ0JzsKaW1wb3J0ICd1dGlsLmRhcnQnOwoKLy8vIFtpZkNvbmRpdGlvbl0gaXMgdGhlIGZpcnN0IHN0ZXAgZm9yIHBhcnNpbmcgYSBsaXRlcmFsIGVudHJ5Ci8vLyBzdGFydGluZyB3aXRoIGBpZmAgY29udHJvbCBmbG93Lgpjb25zdCBMaXRlcmFsRW50cnlJbmZvIGlmQ29uZGl0aW9uID0gY29uc3QgSWZDb25kaXRpb24oKTsKCi8vLyBbc3ByZWFkT3BlcmF0b3JdIGlzIHRoZSBmaXJzdCBzdGVwIGZvciBwYXJzaW5nIGEgbGl0ZXJhbCBlbnRyeQovLy8gcHJlY2VkZWQgYnkgYSAnLi4uJyBzcHJlYWQgb3BlcmF0b3IuCmNvbnN0IExpdGVyYWxFbnRyeUluZm8gc3ByZWFkT3BlcmF0b3IgPSBjb25zdCBTcHJlYWRPcGVyYXRvcigpOwoKLy8vIFRoZSBmaXJzdCBzdGVwIHdoZW4gcHJvY2Vzc2luZyBhIGBmb3JgIGNvbnRyb2wgZmxvdyBjb2xsZWN0aW9uIGVudHJ5LgpjbGFzcyBGb3JDb25kaXRpb24gZXh0ZW5kcyBMaXRlcmFsRW50cnlJbmZvIHsKICBib29sIGluU3R5bGU7CgogIEZvckNvbmRpdGlvbigpIDogc3VwZXIoZmFsc2UsIDApOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZShUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBUb2tlbiBhd2FpdFRva2VuOwogICAgaWYgKG9wdGlvbmFsKCdhd2FpdCcsIG5leHQpKSB7CiAgICAgIGF3YWl0VG9rZW4gPSB0b2tlbiA9IG5leHQ7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgfQogICAgZmluYWwgZm9yVG9rZW4gPSBuZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdmb3InLCBmb3JUb2tlbikpOwogICAgcGFyc2VyLmxpc3RlbmVyLmJlZ2luRm9yQ29udHJvbEZsb3coYXdhaXRUb2tlbiwgZm9yVG9rZW4pOwoKICAgIHRva2VuID0gcGFyc2VyLnBhcnNlRm9yTG9vcFBhcnRzU3RhcnQoYXdhaXRUb2tlbiwgZm9yVG9rZW4pOwogICAgVG9rZW4gaWRlbnRpZmllciA9IHRva2VuLm5leHQ7CiAgICB0b2tlbiA9IHBhcnNlci5wYXJzZUZvckxvb3BQYXJ0c01pZCh0b2tlbiwgYXdhaXRUb2tlbiwgZm9yVG9rZW4pOwoKICAgIGlmIChvcHRpb25hbCgnaW4nLCB0b2tlbi5uZXh0KSB8fCBvcHRpb25hbCgnOicsIHRva2VuLm5leHQpKSB7CiAgICAgIC8vIFByb2Nlc3MgYGZvciAoIC4uLiBpbiAuLi4gKWAKICAgICAgaW5TdHlsZSA9IHRydWU7CiAgICAgIHRva2VuID0gcGFyc2VyLnBhcnNlRm9ySW5Mb29wUGFydHNSZXN0KAogICAgICAgICAgdG9rZW4sIGF3YWl0VG9rZW4sIGZvclRva2VuLCBpZGVudGlmaWVyKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFByb2Nlc3MgYGZvciAoIC4uLiA7IC4uLiA7IC4uLiApYAogICAgICBpblN0eWxlID0gZmFsc2U7CiAgICAgIHRva2VuID0gcGFyc2VyLnBhcnNlRm9yTG9vcFBhcnRzUmVzdCh0b2tlbiwgZm9yVG9rZW4sIGF3YWl0VG9rZW4pOwogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgQG92ZXJyaWRlCiAgTGl0ZXJhbEVudHJ5SW5mbyBjb21wdXRlTmV4dChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJ2ZvcicsIG5leHQpIHx8CiAgICAgICAgKG9wdGlvbmFsKCdhd2FpdCcsIG5leHQpICYmIG9wdGlvbmFsKCdmb3InLCBuZXh0Lm5leHQpKSkgewogICAgICByZXR1cm4gbmV3IE5lc3RlZCgKICAgICAgICBuZXcgRm9yQ29uZGl0aW9uKCksCiAgICAgICAgaW5TdHlsZSA/IGNvbnN0IEZvckluQ29tcGxldGUoKSA6IGNvbnN0IEZvckNvbXBsZXRlKCksCiAgICAgICk7CiAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCdpZicsIG5leHQpKSB7CiAgICAgIHJldHVybiBuZXcgTmVzdGVkKAogICAgICAgIGlmQ29uZGl0aW9uLAogICAgICAgIGluU3R5bGUgPyBjb25zdCBGb3JJbkNvbXBsZXRlKCkgOiBjb25zdCBGb3JDb21wbGV0ZSgpLAogICAgICApOwogICAgfSBlbHNlIGlmIChvcHRpb25hbCgnLi4uJywgbmV4dCkgfHwgb3B0aW9uYWwoJy4uLj8nLCBuZXh0KSkgewogICAgICByZXR1cm4gaW5TdHlsZSA/IGNvbnN0IEZvckluU3ByZWFkKCkgOiBjb25zdCBGb3JTcHJlYWQoKTsKICAgIH0KICAgIHJldHVybiBpblN0eWxlID8gY29uc3QgRm9ySW5FbnRyeSgpIDogY29uc3QgRm9yRW50cnkoKTsKICB9Cn0KCi8vLyBBIHN0ZXAgZm9yIHBhcnNpbmcgYSBzcHJlYWQgY29sbGVjdGlvbgovLy8gYXMgdGhlICJmb3IiIGNvbnRyb2wgZmxvdydzIGV4cHJlc3Npb24uCmNsYXNzIEZvclNwcmVhZCBleHRlbmRzIFNwcmVhZE9wZXJhdG9yIHsKICBjb25zdCBGb3JTcHJlYWQoKTsKCiAgQG92ZXJyaWRlCiAgTGl0ZXJhbEVudHJ5SW5mbyBjb21wdXRlTmV4dChUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIGNvbnN0IEZvckNvbXBsZXRlKCk7CiAgfQp9CgovLy8gQSBzdGVwIGZvciBwYXJzaW5nIGEgc3ByZWFkIGNvbGxlY3Rpb24KLy8vIGFzIHRoZSAiZm9yLWluIiBjb250cm9sIGZsb3cncyBleHByZXNzaW9uLgpjbGFzcyBGb3JJblNwcmVhZCBleHRlbmRzIFNwcmVhZE9wZXJhdG9yIHsKICBjb25zdCBGb3JJblNwcmVhZCgpOwoKICBAb3ZlcnJpZGUKICBMaXRlcmFsRW50cnlJbmZvIGNvbXB1dGVOZXh0KFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gY29uc3QgRm9ySW5Db21wbGV0ZSgpOwogIH0KfQoKLy8vIEEgc3RlcCBmb3IgcGFyc2luZyBhIGxpdGVyYWwgbGlzdCwgc2V0LCBvciBtYXAgZW50cnkKLy8vIGFzIHRoZSAiZm9yIiBjb250cm9sIGZsb3cncyBleHByZXNzaW9uLgpjbGFzcyBGb3JFbnRyeSBleHRlbmRzIExpdGVyYWxFbnRyeUluZm8gewogIGNvbnN0IEZvckVudHJ5KCkgOiBzdXBlcih0cnVlLCAwKTsKCiAgQG92ZXJyaWRlCiAgTGl0ZXJhbEVudHJ5SW5mbyBjb21wdXRlTmV4dChUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIGNvbnN0IEZvckNvbXBsZXRlKCk7CiAgfQp9CgovLy8gQSBzdGVwIGZvciBwYXJzaW5nIGEgbGl0ZXJhbCBsaXN0LCBzZXQsIG9yIG1hcCBlbnRyeQovLy8gYXMgdGhlICJmb3ItaW4iIGNvbnRyb2wgZmxvdydzIGV4cHJlc3Npb24uCmNsYXNzIEZvckluRW50cnkgZXh0ZW5kcyBMaXRlcmFsRW50cnlJbmZvIHsKICBjb25zdCBGb3JJbkVudHJ5KCkgOiBzdXBlcih0cnVlLCAwKTsKCiAgQG92ZXJyaWRlCiAgTGl0ZXJhbEVudHJ5SW5mbyBjb21wdXRlTmV4dChUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIGNvbnN0IEZvckluQ29tcGxldGUoKTsKICB9Cn0KCmNsYXNzIEZvckNvbXBsZXRlIGV4dGVuZHMgTGl0ZXJhbEVudHJ5SW5mbyB7CiAgY29uc3QgRm9yQ29tcGxldGUoKSA6IHN1cGVyKGZhbHNlLCAwKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2UoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIHBhcnNlci5saXN0ZW5lci5lbmRGb3JDb250cm9sRmxvdyh0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQp9CgpjbGFzcyBGb3JJbkNvbXBsZXRlIGV4dGVuZHMgTGl0ZXJhbEVudHJ5SW5mbyB7CiAgY29uc3QgRm9ySW5Db21wbGV0ZSgpIDogc3VwZXIoZmFsc2UsIDApOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZShUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgcGFyc2VyLmxpc3RlbmVyLmVuZEZvckluQ29udHJvbEZsb3codG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KfQoKLy8vIFRoZSBmaXJzdCBzdGVwIHdoZW4gcHJvY2Vzc2luZyBhbiBgaWZgIGNvbnRyb2wgZmxvdyBjb2xsZWN0aW9uIGVudHJ5LgpjbGFzcyBJZkNvbmRpdGlvbiBleHRlbmRzIExpdGVyYWxFbnRyeUluZm8gewogIGNvbnN0IElmQ29uZGl0aW9uKCkgOiBzdXBlcihmYWxzZSwgMSk7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBmaW5hbCBpZlRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnaWYnLCBpZlRva2VuKSk7CiAgICBwYXJzZXIubGlzdGVuZXIuYmVnaW5JZkNvbnRyb2xGbG93KGlmVG9rZW4pOwogICAgVG9rZW4gcmVzdWx0ID0gcGFyc2VyLmVuc3VyZVBhcmVudGhlc2l6ZWRDb25kaXRpb24oaWZUb2tlbik7CiAgICBwYXJzZXIubGlzdGVuZXIuYmVnaW5UaGVuQ29udHJvbEZsb3cocmVzdWx0KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXRlcmFsRW50cnlJbmZvIGNvbXB1dGVOZXh0KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChvcHRpb25hbCgnZm9yJywgbmV4dCkgfHwKICAgICAgICAob3B0aW9uYWwoJ2F3YWl0JywgbmV4dCkgJiYgb3B0aW9uYWwoJ2ZvcicsIG5leHQubmV4dCkpKSB7CiAgICAgIHJldHVybiBuZXcgTmVzdGVkKG5ldyBGb3JDb25kaXRpb24oKSwgY29uc3QgSWZDb21wbGV0ZSgpKTsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ2lmJywgbmV4dCkpIHsKICAgICAgcmV0dXJuIG5ldyBOZXN0ZWQoaWZDb25kaXRpb24sIGNvbnN0IElmQ29tcGxldGUoKSk7CiAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCcuLi4nLCBuZXh0KSB8fCBvcHRpb25hbCgnLi4uPycsIG5leHQpKSB7CiAgICAgIHJldHVybiBjb25zdCBJZlNwcmVhZCgpOwogICAgfQogICAgcmV0dXJuIGNvbnN0IElmRW50cnkoKTsKICB9Cn0KCi8vLyBBIHN0ZXAgZm9yIHBhcnNpbmcgYSBzcHJlYWQgY29sbGVjdGlvbgovLy8gYXMgdGhlIGBpZmAgY29udHJvbCBmbG93J3MgdGhlbi1leHByZXNzaW9uLgpjbGFzcyBJZlNwcmVhZCBleHRlbmRzIFNwcmVhZE9wZXJhdG9yIHsKICBjb25zdCBJZlNwcmVhZCgpOwoKICBAb3ZlcnJpZGUKICBMaXRlcmFsRW50cnlJbmZvIGNvbXB1dGVOZXh0KFRva2VuIHRva2VuKSA9PiBjb25zdCBJZkNvbXBsZXRlKCk7Cn0KCi8vLyBBIHN0ZXAgZm9yIHBhcnNpbmcgYSBsaXRlcmFsIGxpc3QsIHNldCwgb3IgbWFwIGVudHJ5Ci8vLyBhcyB0aGUgYGlmYCBjb250cm9sIGZsb3cncyB0aGVuLWV4cHJlc3Npb24uCmNsYXNzIElmRW50cnkgZXh0ZW5kcyBMaXRlcmFsRW50cnlJbmZvIHsKICBjb25zdCBJZkVudHJ5KCkgOiBzdXBlcih0cnVlLCAwKTsKCiAgQG92ZXJyaWRlCiAgTGl0ZXJhbEVudHJ5SW5mbyBjb21wdXRlTmV4dChUb2tlbiB0b2tlbikgPT4gY29uc3QgSWZDb21wbGV0ZSgpOwp9CgpjbGFzcyBJZkNvbXBsZXRlIGV4dGVuZHMgTGl0ZXJhbEVudHJ5SW5mbyB7CiAgY29uc3QgSWZDb21wbGV0ZSgpIDogc3VwZXIoZmFsc2UsIDApOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZShUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgaWYgKCFvcHRpb25hbCgnZWxzZScsIHRva2VuLm5leHQpKSB7CiAgICAgIHBhcnNlci5saXN0ZW5lci5lbmRJZkNvbnRyb2xGbG93KHRva2VuKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIEBvdmVycmlkZQogIExpdGVyYWxFbnRyeUluZm8gY29tcHV0ZU5leHQoVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBvcHRpb25hbCgnZWxzZScsIHRva2VuLm5leHQpID8gY29uc3QgSWZFbHNlKCkgOiBudWxsOwogIH0KfQoKLy8vIEEgc3RlcCBmb3IgcGFyc2luZyB0aGUgYGVsc2VgIHBvcnRpb24gb2YgYW4gYGlmYCBjb250cm9sIGZsb3cuCmNsYXNzIElmRWxzZSBleHRlbmRzIExpdGVyYWxFbnRyeUluZm8gewogIGNvbnN0IElmRWxzZSgpIDogc3VwZXIoZmFsc2UsIC0xKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2UoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGVsc2VUb2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2Vsc2UnLCBlbHNlVG9rZW4pKTsKICAgIHBhcnNlci5saXN0ZW5lci5oYW5kbGVFbHNlQ29udHJvbEZsb3coZWxzZVRva2VuKTsKICAgIHJldHVybiBlbHNlVG9rZW47CiAgfQoKICBAb3ZlcnJpZGUKICBMaXRlcmFsRW50cnlJbmZvIGNvbXB1dGVOZXh0KFRva2VuIHRva2VuKSB7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2Vsc2UnLCB0b2tlbikpOwogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJ2ZvcicsIG5leHQpIHx8CiAgICAgICAgKG9wdGlvbmFsKCdhd2FpdCcsIG5leHQpICYmIG9wdGlvbmFsKCdmb3InLCBuZXh0Lm5leHQpKSkgewogICAgICByZXR1cm4gbmV3IE5lc3RlZChuZXcgRm9yQ29uZGl0aW9uKCksIGNvbnN0IElmRWxzZUNvbXBsZXRlKCkpOwogICAgfSBlbHNlIGlmIChvcHRpb25hbCgnaWYnLCBuZXh0KSkgewogICAgICByZXR1cm4gbmV3IE5lc3RlZChpZkNvbmRpdGlvbiwgY29uc3QgSWZFbHNlQ29tcGxldGUoKSk7CiAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCcuLi4nLCBuZXh0KSB8fCBvcHRpb25hbCgnLi4uPycsIG5leHQpKSB7CiAgICAgIHJldHVybiBjb25zdCBFbHNlU3ByZWFkKCk7CiAgICB9CiAgICByZXR1cm4gY29uc3QgRWxzZUVudHJ5KCk7CiAgfQp9CgpjbGFzcyBFbHNlU3ByZWFkIGV4dGVuZHMgU3ByZWFkT3BlcmF0b3IgewogIGNvbnN0IEVsc2VTcHJlYWQoKTsKCiAgQG92ZXJyaWRlCiAgTGl0ZXJhbEVudHJ5SW5mbyBjb21wdXRlTmV4dChUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIGNvbnN0IElmRWxzZUNvbXBsZXRlKCk7CiAgfQp9CgpjbGFzcyBFbHNlRW50cnkgZXh0ZW5kcyBMaXRlcmFsRW50cnlJbmZvIHsKICBjb25zdCBFbHNlRW50cnkoKSA6IHN1cGVyKHRydWUsIDApOwoKICBAb3ZlcnJpZGUKICBMaXRlcmFsRW50cnlJbmZvIGNvbXB1dGVOZXh0KFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gY29uc3QgSWZFbHNlQ29tcGxldGUoKTsKICB9Cn0KCmNsYXNzIElmRWxzZUNvbXBsZXRlIGV4dGVuZHMgTGl0ZXJhbEVudHJ5SW5mbyB7CiAgY29uc3QgSWZFbHNlQ29tcGxldGUoKSA6IHN1cGVyKGZhbHNlLCAwKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2UoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIHBhcnNlci5saXN0ZW5lci5lbmRJZkVsc2VDb250cm9sRmxvdyh0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQp9CgovLy8gVGhlIGZpcnN0IHN0ZXAgd2hlbiBwcm9jZXNzaW5nIGEgc3ByZWFkIGVudHJ5LgpjbGFzcyBTcHJlYWRPcGVyYXRvciBleHRlbmRzIExpdGVyYWxFbnRyeUluZm8gewogIGNvbnN0IFNwcmVhZE9wZXJhdG9yKCkgOiBzdXBlcihmYWxzZSwgMCk7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBmaW5hbCBvcGVyYXRvciA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJy4uLicsIG9wZXJhdG9yKSB8fCBvcHRpb25hbCgnLi4uPycsIG9wZXJhdG9yKSk7CiAgICB0b2tlbiA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24ob3BlcmF0b3IpOwogICAgcGFyc2VyLmxpc3RlbmVyLmhhbmRsZVNwcmVhZEV4cHJlc3Npb24ob3BlcmF0b3IpOwogICAgcmV0dXJuIHRva2VuOwogIH0KfQoKY2xhc3MgTmVzdGVkIGV4dGVuZHMgTGl0ZXJhbEVudHJ5SW5mbyB7CiAgTGl0ZXJhbEVudHJ5SW5mbyBuZXN0ZWRTdGVwOwogIGZpbmFsIExpdGVyYWxFbnRyeUluZm8gbGFzdFN0ZXA7CgogIE5lc3RlZCh0aGlzLm5lc3RlZFN0ZXAsIHRoaXMubGFzdFN0ZXApIDogc3VwZXIoZmFsc2UsIDApOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBoYXNFbnRyeSA9PiBuZXN0ZWRTdGVwLmhhc0VudHJ5OwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZShUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgPT4gbmVzdGVkU3RlcC5wYXJzZSh0b2tlbiwgcGFyc2VyKTsKCiAgQG92ZXJyaWRlCiAgTGl0ZXJhbEVudHJ5SW5mbyBjb21wdXRlTmV4dChUb2tlbiB0b2tlbikgewogICAgbmVzdGVkU3RlcCA9IG5lc3RlZFN0ZXAuY29tcHV0ZU5leHQodG9rZW4pOwogICAgcmV0dXJuIG5lc3RlZFN0ZXAgIT0gbnVsbCA/IHRoaXMgOiBsYXN0U3RlcDsKICB9Cn0KgSMATU48ASMiFhQBQCU6AUMpQAFKLhABJAEMLB0WIyEZBhsnPwFBI0YBQyYWLjQNKxdJBhIEAQwuHSFDGRw/CScZFT8JQkAGPAQCASssKRUBDC4gBAIBKy8rFwEMLiIEAgE5LColAQwuIAQCATkvLCcBDC4iBAIBLSkBDCwuEgQCAS8rAQwsMBIEAgFKLSkBDCwgJTFBMhMEAQwuHSFDQSc6Qh8GHAQCASswKBQBDEMCATkwKSQBDEMCASwoAQwsKS8GEgQBDC5BBAIBQyglAQwsIik2FgQBDC4lHSFDRSc+QiEGHgQCASoWAQwuIwQCASsmAQwuIwQCATAsAQwsMRIEAgEzMCwBDCwhRS42EgQCASgfIwE8AQwsAQxOAQwuMDEEAgE/cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci9saXRlcmFsX2VudHJ5X2luZm9faW1wbC5kYXJ0P3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9wYXJzZXIvdHlwZV9pbmZvX2ltcGwuZGFydMAAjY8vLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5wYXJzZXIudHlwZV9pbmZvX2ltcGw7CgppbXBvcnQgJy4uLy4uL3NjYW5uZXIvdG9rZW4uZGFydCcgc2hvdyBTeW50aGV0aWNUb2tlbiwgVG9rZW4sIFRva2VuVHlwZTsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcgYXMgZmFzdGE7CgppbXBvcnQgJy4uL3NjYW5uZXIvdG9rZW5fY29uc3RhbnRzLmRhcnQnIHNob3cgSURFTlRJRklFUl9UT0tFTjsKCmltcG9ydCAnLi4vdXRpbC9saW5rLmRhcnQnIHNob3cgTGluazsKCmltcG9ydCAnZm9yd2FyZGluZ19saXN0ZW5lci5kYXJ0JyBzaG93IEZvcndhcmRpbmdMaXN0ZW5lcjsKCmltcG9ydCAnaWRlbnRpZmllcl9jb250ZXh0LmRhcnQnIHNob3cgSWRlbnRpZmllckNvbnRleHQ7CgppbXBvcnQgJ21lbWJlcl9raW5kLmRhcnQnIHNob3cgTWVtYmVyS2luZDsKCmltcG9ydCAnbGlzdGVuZXIuZGFydCcgc2hvdyBMaXN0ZW5lcjsKCmltcG9ydCAncGFyc2VyLmRhcnQnIHNob3cgUGFyc2VyOwoKaW1wb3J0ICd0eXBlX2luZm8uZGFydCc7CgppbXBvcnQgJ3V0aWwuZGFydCcKICAgIHNob3cKICAgICAgICBvcHRpb25hbCwKICAgICAgICBza2lwTWV0YWRhdGEsCiAgICAgICAgc3BsaXRHdEVxLAogICAgICAgIHNwbGl0R3RGcm9tR3RHdEVxLAogICAgICAgIHNwbGl0R3RGcm9tR3RHdEd0LAogICAgICAgIHNwbGl0R3RGcm9tR3RHdEd0RXEsCiAgICAgICAgc3BsaXRHdEd0LAogICAgICAgIHN5bnRoZXRpY0d0OwoKLy8vIFtTaW1wbGVUeXBlXSBpcyBhIHNwZWNpYWxpemVkIFtUeXBlSW5mb10gcmV0dXJuZWQgYnkgW2NvbXB1dGVUeXBlXQovLy8gd2hlbiB0aGVyZSBpcyBhIHNpbmdsZSBpZGVudGlmaWVyIGFzIHRoZSB0eXBlIHJlZmVyZW5jZS4KY29uc3QgVHlwZUluZm8gc2ltcGxlVHlwZSA9IGNvbnN0IFNpbXBsZVR5cGUoKTsKCi8vLyBbU2ltcGxlTnVsbGFibGVUeXBlXSBpcyBhIHNwZWNpYWxpemVkIFtUeXBlSW5mb10gcmV0dXJuZWQgYnkgW2NvbXB1dGVUeXBlXQovLy8gd2hlbiB0aGVyZSBpcyBhIHNpbmdsZSBpZGVudGlmaWVyIGZvbGxvd2VkIGJ5IGA/YCBhcyB0aGUgdHlwZSByZWZlcmVuY2UuCmNvbnN0IFR5cGVJbmZvIHNpbXBsZU51bGxhYmxlVHlwZSA9IGNvbnN0IFNpbXBsZU51bGxhYmxlVHlwZSgpOwoKLy8vIFtQcmVmaXhlZFR5cGVdIGlzIGEgc3BlY2lhbGl6ZWQgW1R5cGVJbmZvXSByZXR1cm5lZCBieSBbY29tcHV0ZVR5cGVdCi8vLyB3aGVuIHRoZSB0eXBlIHJlZmVyZW5jZSBpcyBvZiB0aGUgZm9ybTogaWRlbnRpZmllciBgLmAgaWRlbnRpZmllci4KY29uc3QgVHlwZUluZm8gcHJlZml4ZWRUeXBlID0gY29uc3QgUHJlZml4ZWRUeXBlKCk7CgovLy8gW1NpbXBsZVR5cGVXaXRoMUFyZ3VtZW50XSBpcyBhIHNwZWNpYWxpemVkIFtUeXBlSW5mb10gcmV0dXJuZWQgYnkKLy8vIFtjb21wdXRlVHlwZV0gd2hlbiB0aGUgdHlwZSByZWZlcmVuY2UgaXMgb2YgdGhlIGZvcm06Ci8vLyBpZGVudGlmaWVyIGA8YCBpZGVudGlmaWVyIGA+YC4KY29uc3QgVHlwZUluZm8gc2ltcGxlVHlwZVdpdGgxQXJndW1lbnQgPQogICAgY29uc3QgU2ltcGxlVHlwZVdpdGgxQXJndW1lbnQoc2ltcGxlVHlwZUFyZ3VtZW50MSk7CgovLy8gW1NpbXBsZVR5cGVXaXRoMUFyZ3VtZW50XSBpcyBhIHNwZWNpYWxpemVkIFtUeXBlSW5mb10gcmV0dXJuZWQgYnkKLy8vIFtjb21wdXRlVHlwZV0gd2hlbiB0aGUgdHlwZSByZWZlcmVuY2UgaXMgb2YgdGhlIGZvcm06Ci8vLyBpZGVudGlmaWVyIGA8YCBpZGVudGlmaWVyIGA+PWAuCmNvbnN0IFR5cGVJbmZvIHNpbXBsZVR5cGVXaXRoMUFyZ3VtZW50R3RFcSA9CiAgICBjb25zdCBTaW1wbGVUeXBlV2l0aDFBcmd1bWVudChzaW1wbGVUeXBlQXJndW1lbnQxR3RFcSk7CgovLy8gW1NpbXBsZVR5cGVXaXRoMUFyZ3VtZW50XSBpcyBhIHNwZWNpYWxpemVkIFtUeXBlSW5mb10gcmV0dXJuZWQgYnkKLy8vIFtjb21wdXRlVHlwZV0gd2hlbiB0aGUgdHlwZSByZWZlcmVuY2UgaXMgb2YgdGhlIGZvcm06Ci8vLyBpZGVudGlmaWVyIGA8YCBpZGVudGlmaWVyIGA+PmAuCmNvbnN0IFR5cGVJbmZvIHNpbXBsZVR5cGVXaXRoMUFyZ3VtZW50R3RHdCA9CiAgICBjb25zdCBTaW1wbGVUeXBlV2l0aDFBcmd1bWVudChzaW1wbGVUeXBlQXJndW1lbnQxR3RHdCk7CgovLy8gW1NpbXBsZU51bGxhYmxlVHlwZVdpdGgxQXJndW1lbnRdIGlzIGEgc3BlY2lhbGl6ZWQgW1R5cGVJbmZvXSByZXR1cm5lZCBieQovLy8gW2NvbXB1dGVUeXBlXSB3aGVuIHRoZSB0eXBlIHJlZmVyZW5jZSBpcyBvZiB0aGUgZm9ybToKLy8vIGlkZW50aWZpZXIgYDxgIGlkZW50aWZpZXIgYD5gIGA/YC4KY29uc3QgVHlwZUluZm8gc2ltcGxlTnVsbGFibGVUeXBlV2l0aDFBcmd1bWVudCA9CiAgICBjb25zdCBTaW1wbGVOdWxsYWJsZVR5cGVXaXRoMUFyZ3VtZW50KCk7CgovLy8gW1NpbXBsZVR5cGVBcmd1bWVudDFdIGlzIGEgc3BlY2lhbGl6ZWQgW1R5cGVQYXJhbU9yQXJnSW5mb10gcmV0dXJuZWQgYnkKLy8vIFtjb21wdXRlVHlwZVBhcmFtT3JBcmddIHdoZW4gdGhlIHR5cGUgcmVmZXJlbmNlIGlzIG9mIHRoZSBmb3JtOgovLy8gYDxgIGlkZW50aWZpZXIgYD5gLgpjb25zdCBUeXBlUGFyYW1PckFyZ0luZm8gc2ltcGxlVHlwZUFyZ3VtZW50MSA9IGNvbnN0IFNpbXBsZVR5cGVBcmd1bWVudDEoKTsKCi8vLyBbU2ltcGxlVHlwZUFyZ3VtZW50MV0gaXMgYSBzcGVjaWFsaXplZCBbVHlwZVBhcmFtT3JBcmdJbmZvXSByZXR1cm5lZCBieQovLy8gW2NvbXB1dGVUeXBlUGFyYW1PckFyZ10gd2hlbiB0aGUgdHlwZSByZWZlcmVuY2UgaXMgb2YgdGhlIGZvcm06Ci8vLyBgPGAgaWRlbnRpZmllciBgPj1gLgpjb25zdCBUeXBlUGFyYW1PckFyZ0luZm8gc2ltcGxlVHlwZUFyZ3VtZW50MUd0RXEgPQogICAgY29uc3QgU2ltcGxlVHlwZUFyZ3VtZW50MUd0RXEoKTsKCi8vLyBbU2ltcGxlVHlwZUFyZ3VtZW50MV0gaXMgYSBzcGVjaWFsaXplZCBbVHlwZVBhcmFtT3JBcmdJbmZvXSByZXR1cm5lZCBieQovLy8gW2NvbXB1dGVUeXBlUGFyYW1PckFyZ10gd2hlbiB0aGUgdHlwZSByZWZlcmVuY2UgaXMgb2YgdGhlIGZvcm06Ci8vLyBgPGAgaWRlbnRpZmllciBgPj5gLgpjb25zdCBUeXBlUGFyYW1PckFyZ0luZm8gc2ltcGxlVHlwZUFyZ3VtZW50MUd0R3QgPQogICAgY29uc3QgU2ltcGxlVHlwZUFyZ3VtZW50MUd0R3QoKTsKCi8vLyBTZWUgZG9jdW1lbnRhdGlvbiBvbiB0aGUgW25vVHlwZV0gY29uc3QuCmNsYXNzIE5vVHlwZSBpbXBsZW1lbnRzIFR5cGVJbmZvIHsKICBjb25zdCBOb1R5cGUoKTsKCiAgQG92ZXJyaWRlCiAgVHlwZUluZm8gZ2V0IGFzTm9uTnVsbGFibGUgPT4gdGhpczsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgY291bGRCZUV4cHJlc3Npb24gPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTnVsbGFibGUgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZVR5cGVOb3RWb2lkKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICB0b2tlbi5uZXh0LCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkVHlwZSk7CiAgICBwYXJzZXIucmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbik7CiAgICByZXR1cm4gc2ltcGxlVHlwZS5wYXJzZVR5cGUodG9rZW4sIHBhcnNlcik7CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVUeXBlT3JWb2lkKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSA9PgogICAgICBlbnN1cmVUeXBlTm90Vm9pZCh0b2tlbiwgcGFyc2VyKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2VUeXBlTm90Vm9pZChUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgPT4KICAgICAgcGFyc2VUeXBlKHRva2VuLCBwYXJzZXIpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZVR5cGUoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIHBhcnNlci5saXN0ZW5lci5oYW5kbGVOb1R5cGUodG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gc2tpcFR5cGUoVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiB0b2tlbjsKICB9Cn0KCi8vLyBTZWUgZG9jdW1lbnRhdGlvbiBvbiB0aGUgW3ByZWZpeGVkVHlwZV0gY29uc3QuCmNsYXNzIFByZWZpeGVkVHlwZSBpbXBsZW1lbnRzIFR5cGVJbmZvIHsKICBjb25zdCBQcmVmaXhlZFR5cGUoKTsKCiAgQG92ZXJyaWRlCiAgVHlwZUluZm8gZ2V0IGFzTm9uTnVsbGFibGUgPT4gdGhpczsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgY291bGRCZUV4cHJlc3Npb24gPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOdWxsYWJsZSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlVHlwZU5vdFZvaWQoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpID0+CiAgICAgIHBhcnNlVHlwZSh0b2tlbiwgcGFyc2VyKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlVHlwZU9yVm9pZChUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgPT4KICAgICAgcGFyc2VUeXBlKHRva2VuLCBwYXJzZXIpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZVR5cGVOb3RWb2lkKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSA9PgogICAgICBwYXJzZVR5cGUodG9rZW4sIHBhcnNlcik7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlVHlwZShUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gc3RhcnQgPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQodG9rZW4uaXNLZXl3b3JkT3JJZGVudGlmaWVyKTsKICAgIExpc3RlbmVyIGxpc3RlbmVyID0gcGFyc2VyLmxpc3RlbmVyOwogICAgbGlzdGVuZXIuaGFuZGxlSWRlbnRpZmllcih0b2tlbiwgSWRlbnRpZmllckNvbnRleHQucHJlZml4ZWRUeXBlUmVmZXJlbmNlKTsKCiAgICBUb2tlbiBwZXJpb2QgPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJy4nLCB0b2tlbikpOwoKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydCh0b2tlbi5pc0tleXdvcmRPcklkZW50aWZpZXIpOwogICAgbGlzdGVuZXIuaGFuZGxlSWRlbnRpZmllcigKICAgICAgICB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQudHlwZVJlZmVyZW5jZUNvbnRpbnVhdGlvbik7CiAgICBsaXN0ZW5lci5oYW5kbGVRdWFsaWZpZWQocGVyaW9kKTsKCiAgICBsaXN0ZW5lci5oYW5kbGVOb1R5cGVBcmd1bWVudHModG9rZW4ubmV4dCk7CiAgICBsaXN0ZW5lci5oYW5kbGVUeXBlKHN0YXJ0LCBudWxsKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIEBvdmVycmlkZQogIFRva2VuIHNraXBUeXBlKFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gdG9rZW4ubmV4dC5uZXh0Lm5leHQ7CiAgfQp9CgovLy8gU2VlIGRvY3VtZW50YXRpb24gb24gdGhlIFtzaW1wbGVOdWxsYWJsZVR5cGVXaXRoMUFyZ3VtZW50XSBjb25zdC4KY2xhc3MgU2ltcGxlTnVsbGFibGVUeXBlV2l0aDFBcmd1bWVudCBleHRlbmRzIFNpbXBsZVR5cGVXaXRoMUFyZ3VtZW50IHsKICBjb25zdCBTaW1wbGVOdWxsYWJsZVR5cGVXaXRoMUFyZ3VtZW50KCkgOiBzdXBlcihzaW1wbGVUeXBlQXJndW1lbnQxKTsKCiAgQG92ZXJyaWRlCiAgVHlwZUluZm8gZ2V0IGFzTm9uTnVsbGFibGUgPT4gc2ltcGxlVHlwZVdpdGgxQXJndW1lbnQ7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTnVsbGFibGUgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2VUeXBlUmVzdChUb2tlbiBzdGFydCwgVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnPycsIHRva2VuKSk7CiAgICBwYXJzZXIubGlzdGVuZXIuaGFuZGxlVHlwZShzdGFydCwgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gc2tpcFR5cGUoVG9rZW4gdG9rZW4pIHsKICAgIHRva2VuID0gc3VwZXIuc2tpcFR5cGUodG9rZW4pLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJz8nLCB0b2tlbikpOwogICAgcmV0dXJuIHRva2VuOwogIH0KfQoKLy8vIFNlZSBkb2N1bWVudGF0aW9uIG9uIHRoZSBbc2ltcGxlVHlwZVdpdGgxQXJndW1lbnRdIGNvbnN0LgpjbGFzcyBTaW1wbGVUeXBlV2l0aDFBcmd1bWVudCBpbXBsZW1lbnRzIFR5cGVJbmZvIHsKICBmaW5hbCBUeXBlUGFyYW1PckFyZ0luZm8gdHlwZUFyZzsKCiAgY29uc3QgU2ltcGxlVHlwZVdpdGgxQXJndW1lbnQodGhpcy50eXBlQXJnKTsKCiAgQG92ZXJyaWRlCiAgVHlwZUluZm8gZ2V0IGFzTm9uTnVsbGFibGUgPT4gdGhpczsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgY291bGRCZUV4cHJlc3Npb24gPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTnVsbGFibGUgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZVR5cGVOb3RWb2lkKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSA9PgogICAgICBwYXJzZVR5cGUodG9rZW4sIHBhcnNlcik7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZVR5cGVPclZvaWQoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpID0+CiAgICAgIHBhcnNlVHlwZSh0b2tlbiwgcGFyc2VyKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2VUeXBlTm90Vm9pZChUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgPT4KICAgICAgcGFyc2VUeXBlKHRva2VuLCBwYXJzZXIpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZVR5cGUoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIHN0YXJ0ID0gdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KHRva2VuLmlzS2V5d29yZE9ySWRlbnRpZmllcik7CiAgICBwYXJzZXIubGlzdGVuZXIuaGFuZGxlSWRlbnRpZmllcih0b2tlbiwgSWRlbnRpZmllckNvbnRleHQudHlwZVJlZmVyZW5jZSk7CiAgICB0b2tlbiA9IHR5cGVBcmcucGFyc2VBcmd1bWVudHModG9rZW4sIHBhcnNlcik7CiAgICByZXR1cm4gcGFyc2VUeXBlUmVzdChzdGFydCwgdG9rZW4sIHBhcnNlcik7CiAgfQoKICBUb2tlbiBwYXJzZVR5cGVSZXN0KFRva2VuIHN0YXJ0LCBUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgcGFyc2VyLmxpc3RlbmVyLmhhbmRsZVR5cGUoc3RhcnQsIG51bGwpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gc2tpcFR5cGUoVG9rZW4gdG9rZW4pIHsKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydCh0b2tlbi5pc0tleXdvcmRPcklkZW50aWZpZXIpOwogICAgcmV0dXJuIHR5cGVBcmcuc2tpcCh0b2tlbik7CiAgfQp9CgovLy8gU2VlIGRvY3VtZW50YXRpb24gb24gdGhlIFtzaW1wbGVOdWxsYWJsZVR5cGVdIGNvbnN0LgpjbGFzcyBTaW1wbGVOdWxsYWJsZVR5cGUgZXh0ZW5kcyBTaW1wbGVUeXBlIHsKICBjb25zdCBTaW1wbGVOdWxsYWJsZVR5cGUoKTsKCiAgQG92ZXJyaWRlCiAgVHlwZUluZm8gZ2V0IGFzTm9uTnVsbGFibGUgPT4gc2ltcGxlVHlwZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOdWxsYWJsZSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZVR5cGVSZXN0KFRva2VuIHN0YXJ0LCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiB0b2tlbiA9IHN0YXJ0Lm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJz8nLCB0b2tlbikpOwogICAgcGFyc2VyLmxpc3RlbmVyLmhhbmRsZVR5cGUoc3RhcnQsIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIEBvdmVycmlkZQogIFRva2VuIHNraXBUeXBlKFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gdG9rZW4ubmV4dC5uZXh0OwogIH0KfQoKLy8vIFNlZSBkb2N1bWVudGF0aW9uIG9uIHRoZSBbc2ltcGxlVHlwZV0gY29uc3QuCmNsYXNzIFNpbXBsZVR5cGUgaW1wbGVtZW50cyBUeXBlSW5mbyB7CiAgY29uc3QgU2ltcGxlVHlwZSgpOwoKICBAb3ZlcnJpZGUKICBUeXBlSW5mbyBnZXQgYXNOb25OdWxsYWJsZSA9PiB0aGlzOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBjb3VsZEJlRXhwcmVzc2lvbiA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc051bGxhYmxlID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVUeXBlTm90Vm9pZChUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgPT4KICAgICAgcGFyc2VUeXBlKHRva2VuLCBwYXJzZXIpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVUeXBlT3JWb2lkKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSA9PgogICAgICBwYXJzZVR5cGUodG9rZW4sIHBhcnNlcik7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlVHlwZU5vdFZvaWQoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpID0+CiAgICAgIHBhcnNlVHlwZSh0b2tlbiwgcGFyc2VyKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2VUeXBlKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQoaXNWYWxpZFR5cGVSZWZlcmVuY2UodG9rZW4pKTsKICAgIHBhcnNlci5saXN0ZW5lci5oYW5kbGVJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC50eXBlUmVmZXJlbmNlKTsKICAgIHRva2VuID0gbm9UeXBlUGFyYW1PckFyZy5wYXJzZUFyZ3VtZW50cyh0b2tlbiwgcGFyc2VyKTsKICAgIHJldHVybiBwYXJzZVR5cGVSZXN0KHRva2VuLCBwYXJzZXIpOwogIH0KCiAgVG9rZW4gcGFyc2VUeXBlUmVzdChUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgcGFyc2VyLmxpc3RlbmVyLmhhbmRsZVR5cGUodG9rZW4sIG51bGwpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gc2tpcFR5cGUoVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiB0b2tlbi5uZXh0OwogIH0KfQoKLy8vIFNlZSBkb2N1bWVudGF0aW9uIG9uIHRoZSBbdm9pZFR5cGVdIGNvbnN0LgpjbGFzcyBWb2lkVHlwZSBpbXBsZW1lbnRzIFR5cGVJbmZvIHsKICBjb25zdCBWb2lkVHlwZSgpOwoKICBAb3ZlcnJpZGUKICBUeXBlSW5mbyBnZXQgYXNOb25OdWxsYWJsZSA9PiB0aGlzOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBjb3VsZEJlRXhwcmVzc2lvbiA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOdWxsYWJsZSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlVHlwZU5vdFZvaWQoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIC8vIFJlcG9ydCBhbiBlcnJvciwgdGhlbiBwYXJzZSBgdm9pZGAgYXMgaWYgaXQgd2VyZSBhIHR5cGUgbmFtZS4KICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLm5leHQsIGZhc3RhLm1lc3NhZ2VJbnZhbGlkVm9pZCk7CiAgICByZXR1cm4gc2ltcGxlVHlwZS5wYXJzZVR5cGVOb3RWb2lkKHRva2VuLCBwYXJzZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlVHlwZU9yVm9pZChUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgPT4KICAgICAgcGFyc2VUeXBlKHRva2VuLCBwYXJzZXIpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZVR5cGVOb3RWb2lkKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSA9PgogICAgICBlbnN1cmVUeXBlTm90Vm9pZCh0b2tlbiwgcGFyc2VyKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2VUeXBlKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBwYXJzZXIubGlzdGVuZXIuaGFuZGxlVm9pZEtleXdvcmQodG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gc2tpcFR5cGUoVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiB0b2tlbi5uZXh0OwogIH0KfQoKYm9vbCBsb29rc0xpa2VOYW1lKFRva2VuIHRva2VuKSA9PgogICAgdG9rZW4ua2luZCA9PSBJREVOVElGSUVSX1RPS0VOIHx8CiAgICBvcHRpb25hbCgndGhpcycsIHRva2VuKSB8fAogICAgKHRva2VuLmlzSWRlbnRpZmllciAmJgogICAgICAgIC8vIEFsdGhvdWdoIGB0eXBlZGVmYCBpcyBhIGxlZ2FsIGlkZW50aWZpZXIsCiAgICAgICAgLy8gdHlwZSBgdHlwZWRlZmAgaWRlbnRpZmllciBpcyBub3QgbGVnYWwgYW5kIGluIHRoaXMgc2l0dWF0aW9uCiAgICAgICAgLy8gYHR5cGVkZWZgIGlzIHByb2JhYmx5IGEgc2VwYXJhdGUgZGVjbGFyYXRpb24uCiAgICAgICAgKCFvcHRpb25hbCgndHlwZWRlZicsIHRva2VuKSB8fCAhdG9rZW4ubmV4dC5pc0lkZW50aWZpZXIpKTsKCi8vLyBXaGVuIG1pc3NpbmcgYSBjb21tYSwgZGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiB0b2tlbiBsb29rcyBsaWtlIGl0IHNob3VsZAovLy8gYmUgcGFydCBvZiBhIGNvbGxlY3Rpb24gb2YgdHlwZSBwYXJhbWV0ZXJzIG9yIGFyZ3VtZW50cy4KYm9vbCBsb29rc0xpa2VUeXBlUGFyYW1PckFyZyhib29sIGluRGVjbGFyYXRpb24sIFRva2VuIHRva2VuKSB7CiAgaWYgKGluRGVjbGFyYXRpb24gJiYgdG9rZW4ua2luZCA9PSBJREVOVElGSUVSX1RPS0VOKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChuZXh0LmtpbmQgPT0gSURFTlRJRklFUl9UT0tFTiB8fAogICAgICAgIG9wdGlvbmFsKCcsJywgbmV4dCkgfHwKICAgICAgICBpc0Nsb3NlcihuZXh0KSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9CiAgcmV0dXJuIGZhbHNlOwp9CgovLy8gSW5zdGFuY2VzIG9mIFtDb21wbGV4VHlwZUluZm9dIGFyZSByZXR1cm5lZCBieSBbY29tcHV0ZVR5cGVdIHRvIHJlcHJlc2VudAovLy8gdHlwZSByZWZlcmVuY2VzIHRoYXQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGJ5IHRoZSBjb25zdGFudHMgYWJvdmUuCmNsYXNzIENvbXBsZXhUeXBlSW5mbyBpbXBsZW1lbnRzIFR5cGVJbmZvIHsKICAvLy8gVGhlIGZpcnN0IHRva2VuIGluIHRoZSB0eXBlIHJlZmVyZW5jZS4KICBUb2tlbiBzdGFydDsKCiAgLy8vIFR5cGUgYXJndW1lbnRzIHdlcmUgc2VlbiBkdXJpbmcgYW5hbHlzaXMuCiAgZmluYWwgVHlwZVBhcmFtT3JBcmdJbmZvIHR5cGVBcmd1bWVudHM7CgogIC8vLyBUaGUgdG9rZW4gYmVmb3JlIHRoZSB0cmFpbGluZyBxdWVzdGlvbiBtYXJrIG9yIGBudWxsYCBpZiBlaXRoZXIKICAvLy8gMSkgdGhlcmUgaXMgbm8gdHJhaWxpbmcgcXVlc3Rpb24gbWFyaywgb3IKICAvLy8gMikgdGhlIHRyYWlsaW5nIHF1ZXN0aW9uIG1hcmsgaXMgbm90IHBhcnQgb2YgdGhlIHR5cGUgcmVmZXJlbmNlLgogIFRva2VuIGJlZm9yZVF1ZXN0aW9uTWFyazsKCiAgLy8vIFRoZSBsYXN0IHRva2VuIGluIHRoZSB0eXBlIHJlZmVyZW5jZS4KICBUb2tlbiBlbmQ7CgogIC8vLyBUaGUgYEZ1bmN0aW9uYCB0b2tlbnMgYmVmb3JlIHRoZSBzdGFydCBvZiB0eXBlIHZhcmlhYmxlcyBvZiBmdW5jdGlvbiB0eXBlcwogIC8vLyBhcyBzZWVuIGR1cmluZyBhbmFseXNpcy4KICBMaW5rPFRva2VuPiB0eXBlVmFyaWFibGVTdGFydGVycyA9IGNvbnN0IExpbms8VG9rZW4+KCk7CgogIC8vLyBJZiB0aGUgcmVjZWl2ZXIgcmVwcmVzZW50cyBhIGdlbmVyYWxpemVkIGZ1bmN0aW9uIHR5cGUgdGhlbiB0aGlzIGluZGljYXRlcwogIC8vLyB3aGV0aGVyIGl0IGhhcyBhIHJldHVybiB0eXBlLCBvdGhlcndpc2UgdGhpcyBpcyBgbnVsbGAuCiAgYm9vbCBnZnRIYXNSZXR1cm5UeXBlOwoKICBDb21wbGV4VHlwZUluZm8oVG9rZW4gYmVmb3JlU3RhcnQsIHRoaXMudHlwZUFyZ3VtZW50cykKICAgICAgOiB0aGlzLnN0YXJ0ID0gYmVmb3JlU3RhcnQubmV4dCB7CiAgICBhc3NlcnQodHlwZUFyZ3VtZW50cyAhPSBudWxsKTsKICB9CgogIENvbXBsZXhUeXBlSW5mby5fbm9uTnVsbGFibGUodGhpcy5zdGFydCwgdGhpcy50eXBlQXJndW1lbnRzLCB0aGlzLmVuZCwKICAgICAgdGhpcy50eXBlVmFyaWFibGVTdGFydGVycywgdGhpcy5nZnRIYXNSZXR1cm5UeXBlKTsKCiAgQG92ZXJyaWRlCiAgVHlwZUluZm8gZ2V0IGFzTm9uTnVsbGFibGUgewogICAgcmV0dXJuIGJlZm9yZVF1ZXN0aW9uTWFyayA9PSBudWxsCiAgICAgICAgPyB0aGlzCiAgICAgICAgOiBuZXcgQ29tcGxleFR5cGVJbmZvLl9ub25OdWxsYWJsZShzdGFydCwgdHlwZUFyZ3VtZW50cywKICAgICAgICAgICAgYmVmb3JlUXVlc3Rpb25NYXJrLCB0eXBlVmFyaWFibGVTdGFydGVycywgZ2Z0SGFzUmV0dXJuVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBjb3VsZEJlRXhwcmVzc2lvbiA9PgogICAgICB0eXBlQXJndW1lbnRzID09IG5vVHlwZVBhcmFtT3JBcmcgJiYgdHlwZVZhcmlhYmxlU3RhcnRlcnMuaXNFbXB0eTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOdWxsYWJsZSA9PiBiZWZvcmVRdWVzdGlvbk1hcmsgIT0gbnVsbDsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlVHlwZU5vdFZvaWQoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpID0+CiAgICAgIHBhcnNlVHlwZSh0b2tlbiwgcGFyc2VyKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlVHlwZU9yVm9pZChUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgPT4KICAgICAgcGFyc2VUeXBlKHRva2VuLCBwYXJzZXIpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZVR5cGVOb3RWb2lkKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSA9PgogICAgICBwYXJzZVR5cGUodG9rZW4sIHBhcnNlcik7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlVHlwZShUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgYXNzZXJ0KGlkZW50aWNhbCh0b2tlbi5uZXh0LCBzdGFydCkpOwoKICAgIGlmIChvcHRpb25hbCgnLicsIHN0YXJ0KSkgewogICAgICAvLyBSZWNvdmVyeTogSW5zZXJ0IG1pc3NpbmcgaWRlbnRpZmllciB3aXRob3V0IHNlbmRpbmcgZXZlbnRzCiAgICAgIHN0YXJ0ID0gcGFyc2VyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoCiAgICAgICAgICB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQucHJlZml4ZWRUeXBlUmVmZXJlbmNlKTsKICAgIH0KCiAgICBmaW5hbCB0eXBlVmFyaWFibGVFbmRHcm91cHMgPSA8VG9rZW4+W107CiAgICBmb3IgKExpbms8VG9rZW4+IHQgPSB0eXBlVmFyaWFibGVTdGFydGVyczsgdC5pc05vdEVtcHR5OyB0ID0gdC50YWlsKSB7CiAgICAgIHR5cGVWYXJpYWJsZUVuZEdyb3Vwcy5hZGQoCiAgICAgICAgICBjb21wdXRlVHlwZVBhcmFtT3JBcmcodC5oZWFkLCB0cnVlKS5wYXJzZVZhcmlhYmxlcyh0LmhlYWQsIHBhcnNlcikpOwogICAgICBwYXJzZXIubGlzdGVuZXIuYmVnaW5GdW5jdGlvblR5cGUoc3RhcnQpOwogICAgfQoKICAgIGlmIChnZnRIYXNSZXR1cm5UeXBlID09IGZhbHNlKSB7CiAgICAgIC8vIEEgZnVuY3Rpb24gdHlwZSB3aXRob3V0IHJldHVybiB0eXBlLgogICAgICAvLyBQdXNoIHRoZSBub24tZXhpc3RpbmcgcmV0dXJuIHR5cGUgZmlyc3QuIFRoZSBsb29wIGJlbG93IHdpbGwKICAgICAgLy8gZ2VuZXJhdGUgdGhlIGZ1bGwgdHlwZS4KICAgICAgbm9UeXBlLnBhcnNlVHlwZSh0b2tlbiwgcGFyc2VyKTsKICAgIH0gZWxzZSB7CiAgICAgIFRva2VuIHR5cGVSZWZPclByZWZpeCA9IHRva2VuLm5leHQ7CiAgICAgIGlmIChvcHRpb25hbCgndm9pZCcsIHR5cGVSZWZPclByZWZpeCkpIHsKICAgICAgICB0b2tlbiA9IHZvaWRUeXBlLnBhcnNlVHlwZSh0b2tlbiwgcGFyc2VyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoIW9wdGlvbmFsKCcuJywgdHlwZVJlZk9yUHJlZml4KSAmJgogICAgICAgICAgICAhb3B0aW9uYWwoJy4nLCB0eXBlUmVmT3JQcmVmaXgubmV4dCkpIHsKICAgICAgICAgIHRva2VuID0KICAgICAgICAgICAgICBwYXJzZXIuZW5zdXJlSWRlbnRpZmllcih0b2tlbiwgSWRlbnRpZmllckNvbnRleHQudHlwZVJlZmVyZW5jZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRva2VuID0gcGFyc2VyLmVuc3VyZUlkZW50aWZpZXIoCiAgICAgICAgICAgICAgdG9rZW4sIElkZW50aWZpZXJDb250ZXh0LnByZWZpeGVkVHlwZVJlZmVyZW5jZSk7CiAgICAgICAgICB0b2tlbiA9IHBhcnNlci5wYXJzZVF1YWxpZmllZFJlc3QoCiAgICAgICAgICAgICAgdG9rZW4sIElkZW50aWZpZXJDb250ZXh0LnR5cGVSZWZlcmVuY2VDb250aW51YXRpb24pOwogICAgICAgICAgaWYgKHRva2VuLmlzU3ludGhldGljICYmIGVuZCA9PSB0eXBlUmVmT3JQcmVmaXgubmV4dCkgewogICAgICAgICAgICAvLyBSZWNvdmVyeTogVXBkYXRlIGBlbmRgIGlmIGEgc3ludGhldGljIGlkZW50aWZpZXIgd2FzIGluc2VydGVkLgogICAgICAgICAgICBlbmQgPSB0b2tlbjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdG9rZW4gPSB0eXBlQXJndW1lbnRzLnBhcnNlQXJndW1lbnRzKHRva2VuLCBwYXJzZXIpOwoKICAgICAgICAvLyBPbmx5IGNvbnN1bWUgdGhlIGA/YCBpZiBpdCBpcyBwYXJ0IG9mIHRoZSBjb21wbGV4IHR5cGUKICAgICAgICBUb2tlbiBxdWVzdGlvbk1hcmsgPSB0b2tlbi5uZXh0OwogICAgICAgIGlmIChvcHRpb25hbCgnPycsIHF1ZXN0aW9uTWFyaykgJiYKICAgICAgICAgICAgKHR5cGVWYXJpYWJsZUVuZEdyb3Vwcy5pc05vdEVtcHR5IHx8IGJlZm9yZVF1ZXN0aW9uTWFyayAhPSBudWxsKSkgewogICAgICAgICAgdG9rZW4gPSBxdWVzdGlvbk1hcms7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHF1ZXN0aW9uTWFyayA9IG51bGw7CiAgICAgICAgfQoKICAgICAgICBwYXJzZXIubGlzdGVuZXIuaGFuZGxlVHlwZSh0eXBlUmVmT3JQcmVmaXgsIHF1ZXN0aW9uTWFyayk7CiAgICAgIH0KICAgIH0KCiAgICBpbnQgZW5kR3JvdXBJbmRleCA9IHR5cGVWYXJpYWJsZUVuZEdyb3Vwcy5sZW5ndGggLSAxOwogICAgZm9yIChMaW5rPFRva2VuPiB0ID0gdHlwZVZhcmlhYmxlU3RhcnRlcnM7IHQuaXNOb3RFbXB0eTsgdCA9IHQudGFpbCkgewogICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICAgIGFzc2VydChvcHRpb25hbCgnRnVuY3Rpb24nLCB0b2tlbikpOwogICAgICBUb2tlbiBmdW5jdGlvblRva2VuID0gdG9rZW47CgogICAgICBpZiAob3B0aW9uYWwoIjwiLCB0b2tlbi5uZXh0KSkgewogICAgICAgIC8vIFNraXAgdHlwZSBwYXJhbWV0ZXJzLCB0aGV5IHdlcmUgcGFyc2VkIGFib3ZlLgogICAgICAgIHRva2VuID0gdHlwZVZhcmlhYmxlRW5kR3JvdXBzW2VuZEdyb3VwSW5kZXhdOwogICAgICAgIGFzc2VydChvcHRpb25hbCgnPicsIHRva2VuKSk7CiAgICAgIH0KICAgICAgdG9rZW4gPSBwYXJzZXIucGFyc2VGb3JtYWxQYXJhbWV0ZXJzUmVxdWlyZWRPcHQoCiAgICAgICAgICB0b2tlbiwgTWVtYmVyS2luZC5HZW5lcmFsaXplZEZ1bmN0aW9uVHlwZSk7CgogICAgICAvLyBPbmx5IGNvbnN1bWUgdGhlIGA/YCBpZiBpdCBpcyBwYXJ0IG9mIHRoZSBjb21wbGV4IHR5cGUKICAgICAgVG9rZW4gcXVlc3Rpb25NYXJrID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKG9wdGlvbmFsKCc/JywgcXVlc3Rpb25NYXJrKSAmJgogICAgICAgICAgKGVuZEdyb3VwSW5kZXggPiAwIHx8IGJlZm9yZVF1ZXN0aW9uTWFyayAhPSBudWxsKSkgewogICAgICAgIHRva2VuID0gcXVlc3Rpb25NYXJrOwogICAgICB9IGVsc2UgewogICAgICAgIHF1ZXN0aW9uTWFyayA9IG51bGw7CiAgICAgIH0KCiAgICAgIC0tZW5kR3JvdXBJbmRleDsKICAgICAgcGFyc2VyLmxpc3RlbmVyLmVuZEZ1bmN0aW9uVHlwZShmdW5jdGlvblRva2VuLCBxdWVzdGlvbk1hcmspOwogICAgfQoKICAgIC8vIFRoZXJlIGFyZSB0d28gc2l0dWF0aW9ucyBpbiB3aGljaCB0aGUgW3Rva2VuXSAhPSBbZW5kXToKICAgIC8vIFZhbGlkIGNvZGU6ICAgIGlkZW50aWZpZXIgYDxgIGlkZW50aWZpZXIgYDxgIGlkZW50aWZpZXIgYD4+YAogICAgLy8gICAgd2hlcmUgYD4+YCBpcyByZXBsYWNlZCBieSB0d28gdG9rZW5zLgogICAgLy8gSW52YWxpZCBjb2RlOiAgaWRlbnRpZmllciBgPGAgaWRlbnRpZmllciBpZGVudGlmaWVyIGA+YAogICAgLy8gICAgd2hlcmUgYSBzeW50aGV0aWMgYD5gIGlzIGluc2VydGVkIGJldHdlZW4gdGhlIGlkZW50aWZpZXJzLgogICAgYXNzZXJ0KGlkZW50aWNhbCh0b2tlbiwgZW5kKSB8fCBvcHRpb25hbCgnPicsIHRva2VuKSk7CgogICAgLy8gRHVyaW5nIHJlY292ZXJ5LCBbdG9rZW5dIG1heSBiZSBhIHN5bnRoZXRpYyB0aGF0IHdhcyBpbnNlcnRlZCBpbiB0aGUKICAgIC8vIG1pZGRsZSBvZiB0aGUgdHlwZSByZWZlcmVuY2UuCiAgICBlbmQgPSB0b2tlbjsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIEBvdmVycmlkZQogIFRva2VuIHNraXBUeXBlKFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gZW5kOwogIH0KCiAgLy8vIEdpdmVuIGBGdW5jdGlvbmAgbm9uLWlkZW50aWZpZXIsIGNvbXB1dGUgdGhlIHR5cGUKICAvLy8gYW5kIHJldHVybiB0aGUgcmVjZWl2ZXIgb3Igb25lIG9mIHRoZSBbVHlwZUluZm9dIGNvbnN0YW50cy4KICBUeXBlSW5mbyBjb21wdXRlTm9UeXBlR0ZUKFRva2VuIGJlZm9yZVN0YXJ0LCBib29sIHJlcXVpcmVkKSB7CiAgICBhc3NlcnQob3B0aW9uYWwoJ0Z1bmN0aW9uJywgc3RhcnQpKTsKICAgIGFzc2VydChiZWZvcmVTdGFydC5uZXh0ID09IHN0YXJ0KTsKCiAgICBjb21wdXRlUmVzdChiZWZvcmVTdGFydCwgcmVxdWlyZWQpOwogICAgaWYgKGdmdEhhc1JldHVyblR5cGUgPT0gbnVsbCkgewogICAgICByZXR1cm4gcmVxdWlyZWQgPyBzaW1wbGVUeXBlIDogbm9UeXBlOwogICAgfQogICAgYXNzZXJ0KGVuZCAhPSBudWxsKTsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgLy8vIEdpdmVuIHZvaWQgYEZ1bmN0aW9uYCBub24taWRlbnRpZmllciwgY29tcHV0ZSB0aGUgdHlwZQogIC8vLyBhbmQgcmV0dXJuIHRoZSByZWNlaXZlciBvciBvbmUgb2YgdGhlIFtUeXBlSW5mb10gY29uc3RhbnRzLgogIFR5cGVJbmZvIGNvbXB1dGVWb2lkR0ZUKGJvb2wgcmVxdWlyZWQpIHsKICAgIGFzc2VydChvcHRpb25hbCgndm9pZCcsIHN0YXJ0KSk7CiAgICBhc3NlcnQob3B0aW9uYWwoJ0Z1bmN0aW9uJywgc3RhcnQubmV4dCkpOwoKICAgIGNvbXB1dGVSZXN0KHN0YXJ0LCByZXF1aXJlZCk7CiAgICBpZiAoZ2Z0SGFzUmV0dXJuVHlwZSA9PSBudWxsKSB7CiAgICAgIHJldHVybiB2b2lkVHlwZTsKICAgIH0KICAgIGFzc2VydChlbmQgIT0gbnVsbCk7CiAgICByZXR1cm4gdGhpczsKICB9CgogIC8vLyBHaXZlbiBpZGVudGlmaWVyIGBGdW5jdGlvbmAgbm9uLWlkZW50aWZpZXIsIGNvbXB1dGUgdGhlIHR5cGUKICAvLy8gYW5kIHJldHVybiB0aGUgcmVjZWl2ZXIgb3Igb25lIG9mIHRoZSBbVHlwZUluZm9dIGNvbnN0YW50cy4KICBUeXBlSW5mbyBjb21wdXRlSWRlbnRpZmllckdGVChib29sIHJlcXVpcmVkKSB7CiAgICBhc3NlcnQoaXNWYWxpZFR5cGVSZWZlcmVuY2Uoc3RhcnQpKTsKICAgIGFzc2VydChvcHRpb25hbCgnRnVuY3Rpb24nLCBzdGFydC5uZXh0KSk7CgogICAgY29tcHV0ZVJlc3Qoc3RhcnQsIHJlcXVpcmVkKTsKICAgIGlmIChnZnRIYXNSZXR1cm5UeXBlID09IG51bGwpIHsKICAgICAgcmV0dXJuIHNpbXBsZVR5cGU7CiAgICB9CiAgICBhc3NlcnQoZW5kICE9IG51bGwpOwogICAgcmV0dXJuIHRoaXM7CiAgfQoKICAvLy8gR2l2ZW4gaWRlbnRpZmllciBgP2AgYEZ1bmN0aW9uYCBub24taWRlbnRpZmllciwgY29tcHV0ZSB0aGUgdHlwZQogIC8vLyBhbmQgcmV0dXJuIHRoZSByZWNlaXZlciBvciBvbmUgb2YgdGhlIFtUeXBlSW5mb10gY29uc3RhbnRzLgogIFR5cGVJbmZvIGNvbXB1dGVJZGVudGlmaWVyUXVlc3Rpb25HRlQoYm9vbCByZXF1aXJlZCkgewogICAgYXNzZXJ0KGlzVmFsaWRUeXBlUmVmZXJlbmNlKHN0YXJ0KSk7CiAgICBhc3NlcnQob3B0aW9uYWwoJz8nLCBzdGFydC5uZXh0KSk7CiAgICBhc3NlcnQob3B0aW9uYWwoJ0Z1bmN0aW9uJywgc3RhcnQubmV4dC5uZXh0KSk7CgogICAgY29tcHV0ZVJlc3Qoc3RhcnQsIHJlcXVpcmVkKTsKICAgIGlmIChnZnRIYXNSZXR1cm5UeXBlID09IG51bGwpIHsKICAgICAgcmV0dXJuIHNpbXBsZU51bGxhYmxlVHlwZTsKICAgIH0KICAgIGFzc2VydChlbmQgIT0gbnVsbCk7CiAgICByZXR1cm4gdGhpczsKICB9CgogIC8vLyBHaXZlbiBhIGJ1aWx0aW4sIHJldHVybiB0aGUgcmVjZWl2ZXIgc28gdGhhdCBwYXJzZVR5cGUgd2lsbCByZXBvcnQKICAvLy8gYW4gZXJyb3IgZm9yIHRoZSBidWlsdGluIHVzZWQgYXMgYSB0eXBlLgogIFR5cGVJbmZvIGNvbXB1dGVCdWlsdGluT3JWYXJBc1R5cGUoYm9vbCByZXF1aXJlZCkgewogICAgYXNzZXJ0KHN0YXJ0LnR5cGUuaXNCdWlsdEluIHx8IG9wdGlvbmFsKCd2YXInLCBzdGFydCkpOwoKICAgIGVuZCA9IHR5cGVBcmd1bWVudHMuc2tpcChzdGFydCk7CiAgICBjb21wdXRlUmVzdChlbmQsIHJlcXVpcmVkKTsKICAgIGFzc2VydChlbmQgIT0gbnVsbCk7CiAgICByZXR1cm4gdGhpczsKICB9CgogIC8vLyBHaXZlbiBpZGVudGlmaWVyIGA8YCAuLi4gYD5gLCBjb21wdXRlIHRoZSB0eXBlCiAgLy8vIGFuZCByZXR1cm4gdGhlIHJlY2VpdmVyIG9yIG9uZSBvZiB0aGUgW1R5cGVJbmZvXSBjb25zdGFudHMuCiAgVHlwZUluZm8gY29tcHV0ZVNpbXBsZVdpdGhUeXBlQXJndW1lbnRzKGJvb2wgcmVxdWlyZWQpIHsKICAgIGFzc2VydChpc1ZhbGlkVHlwZVJlZmVyZW5jZShzdGFydCkpOwogICAgYXNzZXJ0KG9wdGlvbmFsKCc8Jywgc3RhcnQubmV4dCkpOwogICAgYXNzZXJ0KHR5cGVBcmd1bWVudHMgIT0gbm9UeXBlUGFyYW1PckFyZyk7CgogICAgZW5kID0gdHlwZUFyZ3VtZW50cy5za2lwKHN0YXJ0KTsKICAgIGNvbXB1dGVSZXN0KGVuZCwgcmVxdWlyZWQpOwoKICAgIGlmICghcmVxdWlyZWQgJiYgIWxvb2tzTGlrZU5hbWUoZW5kLm5leHQpICYmIGdmdEhhc1JldHVyblR5cGUgPT0gbnVsbCkgewogICAgICByZXR1cm4gbm9UeXBlOwogICAgfQogICAgYXNzZXJ0KGVuZCAhPSBudWxsKTsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgLy8vIEdpdmVuIGlkZW50aWZpZXIgYC5gIGlkZW50aWZpZXIgKG9yIGAuYCBpZGVudGlmaWVyIG9yIGlkZW50aWZpZXIgYC5gCiAgLy8vIGZvciByZWNvdmVyeSksIGNvbXB1dGUgdGhlIHR5cGUgYW5kIHJldHVybiB0aGUgcmVjZWl2ZXIgb3Igb25lIG9mIHRoZQogIC8vLyBbVHlwZUluZm9dIGNvbnN0YW50cy4KICBUeXBlSW5mbyBjb21wdXRlUHJlZml4ZWRUeXBlKGJvb2wgcmVxdWlyZWQpIHsKICAgIFRva2VuIHRva2VuID0gc3RhcnQ7CiAgICBpZiAoIW9wdGlvbmFsKCcuJywgdG9rZW4pKSB7CiAgICAgIGFzc2VydCh0b2tlbi5pc0tleXdvcmRPcklkZW50aWZpZXIpOwogICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICB9CiAgICBhc3NlcnQob3B0aW9uYWwoJy4nLCB0b2tlbikpOwogICAgaWYgKHRva2VuLm5leHQuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIH0KCiAgICBlbmQgPSB0eXBlQXJndW1lbnRzLnNraXAodG9rZW4pOwogICAgY29tcHV0ZVJlc3QoZW5kLCByZXF1aXJlZCk7CiAgICBpZiAoIXJlcXVpcmVkICYmICFsb29rc0xpa2VOYW1lKGVuZC5uZXh0KSAmJiBnZnRIYXNSZXR1cm5UeXBlID09IG51bGwpIHsKICAgICAgcmV0dXJuIG5vVHlwZTsKICAgIH0KICAgIGFzc2VydChlbmQgIT0gbnVsbCk7CiAgICByZXR1cm4gdGhpczsKICB9CgogIHZvaWQgY29tcHV0ZVJlc3QoVG9rZW4gdG9rZW4sIGJvb2wgcmVxdWlyZWQpIHsKICAgIGlmIChvcHRpb25hbCgnPycsIHRva2VuLm5leHQpKSB7CiAgICAgIGJlZm9yZVF1ZXN0aW9uTWFyayA9IHRva2VuOwogICAgICBlbmQgPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICB9CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICB3aGlsZSAob3B0aW9uYWwoJ0Z1bmN0aW9uJywgdG9rZW4pKSB7CiAgICAgIFRva2VuIHR5cGVWYXJpYWJsZVN0YXJ0ID0gdG9rZW47CiAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBDb25zaWRlciBjYWNoaW5nIFR5cGVQYXJhbU9yQXJnSW5mbwogICAgICB0b2tlbiA9IGNvbXB1dGVUeXBlUGFyYW1PckFyZyh0b2tlbiwgdHJ1ZSkuc2tpcCh0b2tlbik7CiAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKCFvcHRpb25hbCgnKCcsIHRva2VuKSkgewogICAgICAgIGJyZWFrOyAvLyBOb3QgYSBmdW5jdGlvbiB0eXBlLgogICAgICB9CiAgICAgIHRva2VuID0gdG9rZW4uZW5kR3JvdXA7CiAgICAgIGlmICh0b2tlbiA9PSBudWxsKSB7CiAgICAgICAgYnJlYWs7IC8vIE5vdCBhIGZ1bmN0aW9uIHR5cGUuCiAgICAgIH0KICAgICAgaWYgKCFyZXF1aXJlZCkgewogICAgICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIGlmIChvcHRpb25hbCgnPycsIG5leHQpKSB7CiAgICAgICAgICBuZXh0ID0gbmV4dC5uZXh0OwogICAgICAgIH0KICAgICAgICBpZiAoIShuZXh0LmlzSWRlbnRpZmllciB8fCBvcHRpb25hbCgndGhpcycsIG5leHQpKSkgewogICAgICAgICAgYnJlYWs7IC8vIGBGdW5jdGlvbmAgdXNlZCBhcyB0aGUgbmFtZSBpbiBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgogICAgICAgIH0KICAgICAgfQogICAgICBhc3NlcnQob3B0aW9uYWwoJyknLCB0b2tlbikpOwogICAgICBnZnRIYXNSZXR1cm5UeXBlID8/PSB0eXBlVmFyaWFibGVTdGFydCAhPSBzdGFydDsKICAgICAgdHlwZVZhcmlhYmxlU3RhcnRlcnMgPSB0eXBlVmFyaWFibGVTdGFydGVycy5wcmVwZW5kKHR5cGVWYXJpYWJsZVN0YXJ0KTsKCiAgICAgIGJlZm9yZVF1ZXN0aW9uTWFyayA9IG51bGw7CiAgICAgIGVuZCA9IHRva2VuOwogICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CgogICAgICBpZiAob3B0aW9uYWwoJz8nLCB0b2tlbikpIHsKICAgICAgICBiZWZvcmVRdWVzdGlvbk1hcmsgPSBlbmQ7CiAgICAgICAgZW5kID0gdG9rZW47CiAgICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICB9CiAgICB9CiAgfQp9CgovLy8gU2VlIFtub1R5cGVQYXJhbU9yQXJnXS4KY2xhc3MgTm9UeXBlUGFyYW1PckFyZyBleHRlbmRzIFR5cGVQYXJhbU9yQXJnSW5mbyB7CiAgY29uc3QgTm9UeXBlUGFyYW1PckFyZygpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IHR5cGVBcmd1bWVudENvdW50ID0+IDA7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlQXJndW1lbnRzKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBwYXJzZXIubGlzdGVuZXIuaGFuZGxlTm9UeXBlQXJndW1lbnRzKHRva2VuLm5leHQpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2VWYXJpYWJsZXMoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIHBhcnNlci5saXN0ZW5lci5oYW5kbGVOb1R5cGVWYXJpYWJsZXModG9rZW4ubmV4dCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBza2lwKFRva2VuIHRva2VuKSA9PiB0b2tlbjsKfQoKY2xhc3MgU2ltcGxlVHlwZUFyZ3VtZW50MSBleHRlbmRzIFR5cGVQYXJhbU9yQXJnSW5mbyB7CiAgY29uc3QgU2ltcGxlVHlwZUFyZ3VtZW50MSgpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1NpbXBsZVR5cGVBcmd1bWVudCA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IHR5cGVBcmd1bWVudENvdW50ID0+IDE7CgogIEBvdmVycmlkZQogIFR5cGVJbmZvIGdldCB0eXBlSW5mbyA9PiBzaW1wbGVUeXBlV2l0aDFBcmd1bWVudDsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2VBcmd1bWVudHMoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGJlZ2luR3JvdXAgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCc8JywgYmVnaW5Hcm91cCkpOwogICAgVG9rZW4gZW5kR3JvdXAgPSBwYXJzZUVuZEdyb3VwKGJlZ2luR3JvdXAsIGJlZ2luR3JvdXAubmV4dCk7CiAgICBMaXN0ZW5lciBsaXN0ZW5lciA9IHBhcnNlci5saXN0ZW5lcjsKICAgIGxpc3RlbmVyLmJlZ2luVHlwZUFyZ3VtZW50cyhiZWdpbkdyb3VwKTsKICAgIHNpbXBsZVR5cGUucGFyc2VUeXBlKGJlZ2luR3JvdXAsIHBhcnNlcik7CiAgICBwYXJzZXIubGlzdGVuZXIuZW5kVHlwZUFyZ3VtZW50cygxLCBiZWdpbkdyb3VwLCBlbmRHcm91cCk7CiAgICByZXR1cm4gZW5kR3JvdXA7CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZVZhcmlhYmxlcyhUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gYmVnaW5Hcm91cCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJzwnLCBiZWdpbkdyb3VwKSk7CiAgICB0b2tlbiA9IGJlZ2luR3JvdXAubmV4dDsKICAgIFRva2VuIGVuZEdyb3VwID0gcGFyc2VFbmRHcm91cChiZWdpbkdyb3VwLCB0b2tlbik7CiAgICBMaXN0ZW5lciBsaXN0ZW5lciA9IHBhcnNlci5saXN0ZW5lcjsKICAgIGxpc3RlbmVyLmJlZ2luVHlwZVZhcmlhYmxlcyhiZWdpbkdyb3VwKTsKICAgIGxpc3RlbmVyLmJlZ2luTWV0YWRhdGFTdGFyKHRva2VuKTsKICAgIGxpc3RlbmVyLmVuZE1ldGFkYXRhU3RhcigwKTsKICAgIGxpc3RlbmVyLmhhbmRsZUlkZW50aWZpZXIodG9rZW4sIElkZW50aWZpZXJDb250ZXh0LnR5cGVWYXJpYWJsZURlY2xhcmF0aW9uKTsKICAgIGxpc3RlbmVyLmJlZ2luVHlwZVZhcmlhYmxlKHRva2VuKTsKICAgIGxpc3RlbmVyLmhhbmRsZVR5cGVWYXJpYWJsZXNEZWZpbmVkKHRva2VuLCAxKTsKICAgIGxpc3RlbmVyLmhhbmRsZU5vVHlwZSh0b2tlbik7CiAgICBsaXN0ZW5lci5lbmRUeXBlVmFyaWFibGUoZW5kR3JvdXAsIDAsIG51bGwpOwogICAgbGlzdGVuZXIuZW5kVHlwZVZhcmlhYmxlcyhiZWdpbkdyb3VwLCBlbmRHcm91cCk7CiAgICByZXR1cm4gZW5kR3JvdXA7CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBza2lwKFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJzwnLCB0b2tlbikpOwogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KHRva2VuLmlzS2V5d29yZE9ySWRlbnRpZmllcik7CiAgICByZXR1cm4gc2tpcEVuZEdyb3VwKHRva2VuKTsKICB9CgogIFRva2VuIHNraXBFbmRHcm91cChUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCc+JywgdG9rZW4pKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlRW5kR3JvdXAoVG9rZW4gYmVnaW5Hcm91cCwgVG9rZW4gdG9rZW4pIHsKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnPicsIHRva2VuKSk7CiAgICByZXR1cm4gdG9rZW47CiAgfQp9CgpjbGFzcyBTaW1wbGVUeXBlQXJndW1lbnQxR3RFcSBleHRlbmRzIFNpbXBsZVR5cGVBcmd1bWVudDEgewogIGNvbnN0IFNpbXBsZVR5cGVBcmd1bWVudDFHdEVxKCk7CgogIEBvdmVycmlkZQogIFR5cGVJbmZvIGdldCB0eXBlSW5mbyA9PiBzaW1wbGVUeXBlV2l0aDFBcmd1bWVudEd0RXE7CgogIFRva2VuIHNraXBFbmRHcm91cChUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCc+PScsIHRva2VuKSk7CiAgICByZXR1cm4gc3BsaXRHdEVxKHRva2VuKTsKICB9CgogIFRva2VuIHBhcnNlRW5kR3JvdXAoVG9rZW4gYmVnaW5Hcm91cCwgVG9rZW4gYmVmb3JlRW5kR3JvdXApIHsKICAgIFRva2VuIGVuZEdyb3VwID0gYmVmb3JlRW5kR3JvdXAubmV4dDsKICAgIGlmICghb3B0aW9uYWwoJz4nLCBlbmRHcm91cCkpIHsKICAgICAgZW5kR3JvdXAgPSBzcGxpdEd0RXEoZW5kR3JvdXApOwogICAgICBlbmRHcm91cC5uZXh0LnNldE5leHQoZW5kR3JvdXAubmV4dC5uZXh0KTsKICAgIH0KICAgIGJlZm9yZUVuZEdyb3VwLnNldE5leHQoZW5kR3JvdXApOwogICAgcmV0dXJuIGVuZEdyb3VwOwogIH0KfQoKY2xhc3MgU2ltcGxlVHlwZUFyZ3VtZW50MUd0R3QgZXh0ZW5kcyBTaW1wbGVUeXBlQXJndW1lbnQxIHsKICBjb25zdCBTaW1wbGVUeXBlQXJndW1lbnQxR3RHdCgpOwoKICBAb3ZlcnJpZGUKICBUeXBlSW5mbyBnZXQgdHlwZUluZm8gPT4gc2ltcGxlVHlwZVdpdGgxQXJndW1lbnRHdEd0OwoKICBUb2tlbiBza2lwRW5kR3JvdXAoVG9rZW4gdG9rZW4pIHsKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnPj4nLCB0b2tlbikpOwogICAgcmV0dXJuIHNwbGl0R3RHdCh0b2tlbik7CiAgfQoKICBUb2tlbiBwYXJzZUVuZEdyb3VwKFRva2VuIGJlZ2luR3JvdXAsIFRva2VuIGJlZm9yZUVuZEdyb3VwKSB7CiAgICBUb2tlbiBlbmRHcm91cCA9IGJlZm9yZUVuZEdyb3VwLm5leHQ7CiAgICBpZiAoIW9wdGlvbmFsKCc+JywgZW5kR3JvdXApKSB7CiAgICAgIGVuZEdyb3VwID0gc3BsaXRHdEd0KGVuZEdyb3VwKTsKICAgICAgZW5kR3JvdXAubmV4dC5zZXROZXh0KGVuZEdyb3VwLm5leHQubmV4dCk7CiAgICB9CiAgICBiZWZvcmVFbmRHcm91cC5zZXROZXh0KGVuZEdyb3VwKTsKICAgIHJldHVybiBlbmRHcm91cDsKICB9Cn0KCmNsYXNzIENvbXBsZXhUeXBlUGFyYW1PckFyZ0luZm8gZXh0ZW5kcyBUeXBlUGFyYW1PckFyZ0luZm8gewogIC8vLyBUaGUgZmlyc3QgdG9rZW4gaW4gdGhlIHR5cGUgdmFyLgogIGZpbmFsIFRva2VuIHN0YXJ0OwoKICAvLy8gSWYgW2luRGVjbGFyYXRpb25dIGlzIGB0cnVlYCwgdGhlbiB0aGlzIHdpbGwgbW9yZSBhZ2dyZXNzaXZlbHkgcmVjb3ZlcgogIC8vLyBnaXZlbiB1bmJhbGFuY2VkIGA8YCBgPmAgYW5kIGludmFsaWQgcGFyYW1ldGVycyBvciBhcmd1bWVudHMuCiAgZmluYWwgYm9vbCBpbkRlY2xhcmF0aW9uOwoKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUFyZ3VtZW50Q291bnQ7CgogIC8vLyBUaGUgYD5gIHRva2VuIHdoaWNoIGVuZHMgdGhlIHR5cGUgcGFyYW1ldGVyIG9yIGFyZ3VtZW50LgogIC8vLyBUaGlzIGNsb3NlciBtYXkgYmUgc3ludGhldGljLCBwb2ludHMgdG8gdGhlIG5leHQgdG9rZW4gaW4gdGhlIHN0cmVhbSwKICAvLy8gaXMgb25seSB1c2VkIHdoZW4gc2tpcHBpbmcgb3ZlciB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9yIGFyZ3VtZW50cywKICAvLy8gYW5kIG1heSBub3QgYmUgcGFydCBvZiB0aGUgdG9rZW4gc3RyZWFtLgogIFRva2VuIHNraXBFbmQ7CgogIENvbXBsZXhUeXBlUGFyYW1PckFyZ0luZm8oVG9rZW4gdG9rZW4sIHRoaXMuaW5EZWNsYXJhdGlvbikKICAgICAgOiBhc3NlcnQob3B0aW9uYWwoJzwnLCB0b2tlbi5uZXh0KSksCiAgICAgICAgYXNzZXJ0KGluRGVjbGFyYXRpb24gIT0gbnVsbCksCiAgICAgICAgc3RhcnQgPSB0b2tlbi5uZXh0OwoKICAvLy8gUGFyc2UgdGhlIHRva2VucyBhbmQgcmV0dXJuIHRoZSByZWNlaXZlciBvciBbbm9UeXBlUGFyYW1PckFyZ10gaWYgdGhlcmUKICAvLy8gYXJlIG5vIHR5cGUgcGFyYW1ldGVycyBvciBhcmd1bWVudHMuIFRoaXMgZG9lcyBub3QgbW9kaWZ5IHRoZSB0b2tlbgogIC8vLyBzdHJlYW0uCiAgVHlwZVBhcmFtT3JBcmdJbmZvIGNvbXB1dGUoKSB7CiAgICBUb2tlbiB0b2tlbjsKICAgIFRva2VuIG5leHQgPSBzdGFydDsKICAgIHR5cGVBcmd1bWVudENvdW50ID0gMDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIFR5cGVJbmZvIHR5cGVJbmZvID0gY29tcHV0ZVR5cGUobmV4dCwgdHJ1ZSwgaW5EZWNsYXJhdGlvbik7CiAgICAgIGlmICh0eXBlSW5mbyA9PSBub1R5cGUpIHsKICAgICAgICB3aGlsZSAodHlwZUluZm8gPT0gbm9UeXBlICYmIG9wdGlvbmFsKCdAJywgbmV4dC5uZXh0KSkgewogICAgICAgICAgbmV4dCA9IHNraXBNZXRhZGF0YShuZXh0KTsKICAgICAgICAgIHR5cGVJbmZvID0gY29tcHV0ZVR5cGUobmV4dCwgdHJ1ZSwgaW5EZWNsYXJhdGlvbik7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlSW5mbyA9PSBub1R5cGUpIHsKICAgICAgICAgIGlmIChuZXh0ID09IHN0YXJ0ICYmICFpbkRlY2xhcmF0aW9uICYmICFpc0Nsb3NlcihuZXh0Lm5leHQpKSB7CiAgICAgICAgICAgIHJldHVybiBub1R5cGVQYXJhbU9yQXJnOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFvcHRpb25hbCgnLCcsIG5leHQubmV4dCkpIHsKICAgICAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGFzc2VydCh0eXBlSW5mbyAhPSBub1R5cGUgfHwgb3B0aW9uYWwoJywnLCBuZXh0Lm5leHQpKTsKICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gcHJvY2VzcyB0eXBlIChpZiBhbnkpIGFuZCBjb25zdW1lIGAsYAogICAgICB9CiAgICAgICsrdHlwZUFyZ3VtZW50Q291bnQ7CiAgICAgIHRva2VuID0gdHlwZUluZm8uc2tpcFR5cGUobmV4dCk7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJ2V4dGVuZHMnLCBuZXh0KSkgewogICAgICAgIHRva2VuID0gY29tcHV0ZVR5cGUobmV4dCwgdHJ1ZSwgaW5EZWNsYXJhdGlvbikuc2tpcFR5cGUobmV4dCk7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIH0KICAgICAgaWYgKCFvcHRpb25hbCgnLCcsIG5leHQpKSB7CiAgICAgICAgc2tpcEVuZCA9IHNwbGl0Q2xvc2VyKG5leHQpOwogICAgICAgIGlmIChza2lwRW5kICE9IG51bGwpIHsKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KICAgICAgICBpZiAoIWluRGVjbGFyYXRpb24pIHsKICAgICAgICAgIHJldHVybiBub1R5cGVQYXJhbU9yQXJnOwogICAgICAgIH0KCiAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICBpZiAoIWxvb2tzTGlrZVR5cGVQYXJhbU9yQXJnKGluRGVjbGFyYXRpb24sIG5leHQpKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLy8gTG9va3MgbGlrZSBtaXNzaW5nIGNvbW1hLiBDb250aW51ZSBsb29waW5nLgogICAgICAgIG5leHQgPSB0b2tlbjsKICAgICAgfQogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBza2lwRW5kID0gc3BsaXRDbG9zZXIobmV4dCk7CiAgICBpZiAoc2tpcEVuZCA9PSBudWxsKSB7CiAgICAgIGlmIChvcHRpb25hbCgnKCcsIG5leHQpKSB7CiAgICAgICAgdG9rZW4gPSBuZXh0LmVuZEdyb3VwOwogICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICB9CiAgICAgIHNraXBFbmQgPSBzcGxpdENsb3NlcihuZXh0KTsKICAgICAgaWYgKHNraXBFbmQgPT0gbnVsbCkgewogICAgICAgIHNraXBFbmQgPSBzcGxpdENsb3NlcihuZXh0Lm5leHQpOwogICAgICB9CiAgICAgIGlmIChza2lwRW5kID09IG51bGwpIHsKICAgICAgICBza2lwRW5kID0gc3ludGhldGljR3QobmV4dCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2VBcmd1bWVudHMoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIGFzc2VydChpZGVudGljYWwodG9rZW4ubmV4dCwgc3RhcnQpKTsKICAgIFRva2VuIG5leHQgPSBzdGFydDsKICAgIHBhcnNlci5saXN0ZW5lci5iZWdpblR5cGVBcmd1bWVudHMoc3RhcnQpOwogICAgaW50IGNvdW50ID0gMDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIFR5cGVJbmZvIHR5cGVJbmZvID0gY29tcHV0ZVR5cGUobmV4dCwgdHJ1ZSwgaW5EZWNsYXJhdGlvbik7CiAgICAgIGlmICh0eXBlSW5mbyA9PSBub1R5cGUpIHsKICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgIHdoaWxlICh0eXBlSW5mbyA9PSBub1R5cGUgJiYgb3B0aW9uYWwoJ0AnLCBuZXh0Lm5leHQpKSB7CiAgICAgICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgICAgICBuZXh0Lm5leHQsIGZhc3RhLnRlbXBsYXRlVW5leHBlY3RlZFRva2VuKTsKICAgICAgICAgIG5leHQgPSBza2lwTWV0YWRhdGEobmV4dCk7CiAgICAgICAgICB0eXBlSW5mbyA9IGNvbXB1dGVUeXBlKG5leHQsIHRydWUsIGluRGVjbGFyYXRpb24pOwogICAgICAgIH0KICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gcHJvY2VzcyB0eXBlIChpZiBhbnkpIGFuZCBjb25zdW1lIGAsYAogICAgICB9CiAgICAgIHRva2VuID0gdHlwZUluZm8uZW5zdXJlVHlwZU9yVm9pZChuZXh0LCBwYXJzZXIpOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgKytjb3VudDsKICAgICAgaWYgKCFvcHRpb25hbCgnLCcsIG5leHQpKSB7CiAgICAgICAgaWYgKHBhcnNlQ2xvc2VyKHRva2VuKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgIGlmICghbG9va3NMaWtlVHlwZVBhcmFtT3JBcmcoaW5EZWNsYXJhdGlvbiwgbmV4dCkpIHsKICAgICAgICAgIHRva2VuID0gcGFyc2VVbmV4cGVjdGVkRW5kKHRva2VuLCB0cnVlLCBwYXJzZXIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8vIE1pc3NpbmcgY29tbWEuIFJlcG9ydCBlcnJvciwgaW5zZXJ0IGNvbW1hLCBhbmQgY29udGludWUgbG9vcGluZy4KICAgICAgICBuZXh0ID0gcGFyc2VNaXNzaW5nQ29tbWEodG9rZW4sIHBhcnNlcik7CiAgICAgIH0KICAgIH0KICAgIFRva2VuIGVuZEdyb3VwID0gdG9rZW4ubmV4dDsKICAgIHBhcnNlci5saXN0ZW5lci5lbmRUeXBlQXJndW1lbnRzKGNvdW50LCBzdGFydCwgZW5kR3JvdXApOwogICAgcmV0dXJuIGVuZEdyb3VwOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2VWYXJpYWJsZXMoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIGFzc2VydChpZGVudGljYWwodG9rZW4ubmV4dCwgc3RhcnQpKTsKICAgIFRva2VuIG5leHQgPSBzdGFydDsKICAgIExpc3RlbmVyIGxpc3RlbmVyID0gcGFyc2VyLmxpc3RlbmVyOwogICAgbGlzdGVuZXIuYmVnaW5UeXBlVmFyaWFibGVzKHN0YXJ0KTsKICAgIGludCBjb3VudCA9IDA7CgogICAgTGluazxUb2tlbj4gdHlwZVN0YXJ0cyA9IGNvbnN0IExpbms8VG9rZW4+KCk7CiAgICBMaW5rPFR5cGVJbmZvPiBzdXBlclR5cGVJbmZvcyA9IGNvbnN0IExpbms8VHlwZUluZm8+KCk7CgogICAgd2hpbGUgKHRydWUpIHsKICAgICAgdG9rZW4gPSBwYXJzZXIucGFyc2VNZXRhZGF0YVN0YXIobmV4dCk7CiAgICAgIG5leHQgPSBwYXJzZXIuZW5zdXJlSWRlbnRpZmllcigKICAgICAgICAgIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC50eXBlVmFyaWFibGVEZWNsYXJhdGlvbik7CiAgICAgIHRva2VuID0gbmV4dDsKICAgICAgbGlzdGVuZXIuYmVnaW5UeXBlVmFyaWFibGUodG9rZW4pOwogICAgICB0eXBlU3RhcnRzID0gdHlwZVN0YXJ0cy5wcmVwZW5kKHRva2VuKTsKCiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJ2V4dGVuZHMnLCBuZXh0KSkgewogICAgICAgIFR5cGVJbmZvIHR5cGVJbmZvID0gY29tcHV0ZVR5cGUobmV4dCwgdHJ1ZSwgaW5EZWNsYXJhdGlvbik7CiAgICAgICAgdG9rZW4gPSB0eXBlSW5mby5za2lwVHlwZShuZXh0KTsKICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICBzdXBlclR5cGVJbmZvcyA9IHN1cGVyVHlwZUluZm9zLnByZXBlbmQodHlwZUluZm8pOwogICAgICB9IGVsc2UgewogICAgICAgIHN1cGVyVHlwZUluZm9zID0gc3VwZXJUeXBlSW5mb3MucHJlcGVuZChudWxsKTsKICAgICAgfQoKICAgICAgKytjb3VudDsKICAgICAgaWYgKCFvcHRpb25hbCgnLCcsIG5leHQpKSB7CiAgICAgICAgaWYgKGlzQ2xvc2VyKHRva2VuKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgIGlmICghbG9va3NMaWtlVHlwZVBhcmFtT3JBcmcoaW5EZWNsYXJhdGlvbiwgbmV4dCkpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAvLyBNaXNzaW5nIGNvbW1hLiBSZXBvcnQgZXJyb3IsIGluc2VydCBjb21tYSwgYW5kIGNvbnRpbnVlIGxvb3BpbmcuCiAgICAgICAgbmV4dCA9IHBhcnNlTWlzc2luZ0NvbW1hKHRva2VuLCBwYXJzZXIpOwogICAgICB9CiAgICB9CgogICAgYXNzZXJ0KGNvdW50ID4gMCk7CiAgICBhc3NlcnQodHlwZVN0YXJ0cy5zbG93TGVuZ3RoKCkgPT0gY291bnQpOwogICAgYXNzZXJ0KHN1cGVyVHlwZUluZm9zLnNsb3dMZW5ndGgoKSA9PSBjb3VudCk7CiAgICBsaXN0ZW5lci5oYW5kbGVUeXBlVmFyaWFibGVzRGVmaW5lZCh0b2tlbiwgY291bnQpOwoKICAgIHRva2VuID0gbnVsbDsKICAgIHdoaWxlICh0eXBlU3RhcnRzLmlzTm90RW1wdHkpIHsKICAgICAgVG9rZW4gdG9rZW4yID0gdHlwZVN0YXJ0cy5oZWFkOwogICAgICBUeXBlSW5mbyB0eXBlSW5mbyA9IHN1cGVyVHlwZUluZm9zLmhlYWQ7CgogICAgICBUb2tlbiBleHRlbmRzT3JTdXBlciA9IG51bGw7CiAgICAgIFRva2VuIG5leHQyID0gdG9rZW4yLm5leHQ7CiAgICAgIGlmICh0eXBlSW5mbyAhPSBudWxsKSB7CiAgICAgICAgYXNzZXJ0KG9wdGlvbmFsKCdleHRlbmRzJywgbmV4dDIpKTsKICAgICAgICBleHRlbmRzT3JTdXBlciA9IG5leHQyOwogICAgICAgIHRva2VuMiA9IHR5cGVJbmZvLmVuc3VyZVR5cGVOb3RWb2lkKG5leHQyLCBwYXJzZXIpOwogICAgICAgIG5leHQyID0gdG9rZW4yLm5leHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXNzZXJ0KCFvcHRpb25hbCgnZXh0ZW5kcycsIG5leHQyKSk7CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlTm9UeXBlKHRva2VuMik7CiAgICAgIH0KICAgICAgLy8gVHlwZSB2YXJpYWJsZXMgYXJlICJjb21wbGV0ZWQiIGluIHJldmVyc2Ugb3JkZXIsIHNvIGNhcHR1cmUgdGhlIGxhc3QKICAgICAgLy8gY29uc3VtZWQgdG9rZW4gZnJvbSB0aGUgZmlyc3QgImNvbXBsZXRlZCIgdHlwZSB2YXJpYWJsZS4KICAgICAgdG9rZW4gPz89IHRva2VuMjsKICAgICAgbGlzdGVuZXIuZW5kVHlwZVZhcmlhYmxlKG5leHQyLCAtLWNvdW50LCBleHRlbmRzT3JTdXBlcik7CgogICAgICB0eXBlU3RhcnRzID0gdHlwZVN0YXJ0cy50YWlsOwogICAgICBzdXBlclR5cGVJbmZvcyA9IHN1cGVyVHlwZUluZm9zLnRhaWw7CiAgICB9CgogICAgaWYgKCFwYXJzZUNsb3Nlcih0b2tlbikpIHsKICAgICAgdG9rZW4gPSBwYXJzZVVuZXhwZWN0ZWRFbmQodG9rZW4sIGZhbHNlLCBwYXJzZXIpOwogICAgfQogICAgVG9rZW4gZW5kR3JvdXAgPSB0b2tlbi5uZXh0OwogICAgbGlzdGVuZXIuZW5kVHlwZVZhcmlhYmxlcyhzdGFydCwgZW5kR3JvdXApOwogICAgcmV0dXJuIGVuZEdyb3VwOwogIH0KCiAgVG9rZW4gcGFyc2VNaXNzaW5nQ29tbWEoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgbmV4dCwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCcsJykpOwogICAgcmV0dXJuIHBhcnNlci5yZXdyaXRlci5pbnNlcnRUb2tlbigKICAgICAgICB0b2tlbiwgbmV3IFN5bnRoZXRpY1Rva2VuKFRva2VuVHlwZS5DT01NQSwgbmV4dC5jaGFyT2Zmc2V0KSk7CiAgfQoKICBUb2tlbiBwYXJzZVVuZXhwZWN0ZWRFbmQoVG9rZW4gdG9rZW4sIGJvb2wgaXNBcmd1bWVudHMsIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgYm9vbCBlcnJvclJlcG9ydGVkID0gdG9rZW4uaXNTeW50aGV0aWMgfHwgKG5leHQuaXNTeW50aGV0aWMgJiYgIW5leHQuaXNFb2YpOwoKICAgIGJvb2wgdHlwZUZvbGxvd3NFeHRlbmRzID0gZmFsc2U7CiAgICBpZiAob3B0aW9uYWwoJ2V4dGVuZHMnLCBuZXh0KSkgewogICAgICBpZiAoIWVycm9yUmVwb3J0ZWQpIHsKICAgICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgdG9rZW4sIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRBZnRlckJ1dEdvdC53aXRoQXJndW1lbnRzKCc+JykpOwogICAgICAgIGVycm9yUmVwb3J0ZWQgPSB0cnVlOwogICAgICB9CiAgICAgIHRva2VuID0gbmV4dDsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIHR5cGVGb2xsb3dzRXh0ZW5kcyA9IGlzVmFsaWRUeXBlUmVmZXJlbmNlKG5leHQpOwoKICAgICAgaWYgKHBhcnNlQ2xvc2VyKHRva2VuKSkgewogICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgfQogICAgfQoKICAgIGlmICh0eXBlRm9sbG93c0V4dGVuZHMgfHwKICAgICAgICBvcHRpb25hbCgnZHluYW1pYycsIG5leHQpIHx8CiAgICAgICAgb3B0aW9uYWwoJ3ZvaWQnLCBuZXh0KSB8fAogICAgICAgIG9wdGlvbmFsKCdGdW5jdGlvbicsIG5leHQpKSB7CiAgICAgIFR5cGVJbmZvIGludmFsaWRUeXBlID0gY29tcHV0ZVR5cGUodG9rZW4sIHRydWUpOwogICAgICBpZiAoaW52YWxpZFR5cGUgIT0gbm9UeXBlKSB7CiAgICAgICAgaWYgKCFlcnJvclJlcG9ydGVkKSB7CiAgICAgICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICB0b2tlbiwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEFmdGVyQnV0R290LndpdGhBcmd1bWVudHMoJz4nKSk7CiAgICAgICAgICBlcnJvclJlcG9ydGVkID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIC8vIFBhcnNlIHRoZSB0eXBlIHNvIHRoYXQgdGhlIHRva2VuIHN0cmVhbSBpcyBwcm9wZXJseSBtb2RpZmllZCwKICAgICAgICAvLyBidXQgZW5zdXJlIHRoYXQgcGFyc2VyIGV2ZW50cyBhcmUgaWdub3JlZCBieSByZXBsYWNpbmcgdGhlIGxpc3RlbmVyLgogICAgICAgIGZpbmFsIG9yaWdpbmFsTGlzdGVuZXIgPSBwYXJzZXIubGlzdGVuZXI7CiAgICAgICAgcGFyc2VyLmxpc3RlbmVyID0gbmV3IEZvcndhcmRpbmdMaXN0ZW5lcigpOwogICAgICAgIHRva2VuID0gaW52YWxpZFR5cGUucGFyc2VUeXBlKHRva2VuLCBwYXJzZXIpOwogICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIHBhcnNlci5saXN0ZW5lciA9IG9yaWdpbmFsTGlzdGVuZXI7CgogICAgICAgIGlmIChwYXJzZUNsb3Nlcih0b2tlbikpIHsKICAgICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBUeXBlUGFyYW1PckFyZ0luZm8gaW52YWxpZFR5cGVWYXIgPQogICAgICAgIGNvbXB1dGVUeXBlUGFyYW1PckFyZyh0b2tlbiwgaW5EZWNsYXJhdGlvbik7CiAgICBpZiAoaW52YWxpZFR5cGVWYXIgIT0gbm9UeXBlUGFyYW1PckFyZykgewogICAgICBpZiAoIWVycm9yUmVwb3J0ZWQpIHsKICAgICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgdG9rZW4sIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRBZnRlckJ1dEdvdC53aXRoQXJndW1lbnRzKCc+JykpOwogICAgICAgIGVycm9yUmVwb3J0ZWQgPSB0cnVlOwogICAgICB9CgogICAgICAvLyBQYXJzZSB0aGUgdHlwZSBzbyB0aGF0IHRoZSB0b2tlbiBzdHJlYW0gaXMgcHJvcGVybHkgbW9kaWZpZWQsCiAgICAgIC8vIGJ1dCBlbnN1cmUgdGhhdCBwYXJzZXIgZXZlbnRzIGFyZSBpZ25vcmVkIGJ5IHJlcGxhY2luZyB0aGUgbGlzdGVuZXIuCiAgICAgIGZpbmFsIG9yaWdpbmFsTGlzdGVuZXIgPSBwYXJzZXIubGlzdGVuZXI7CiAgICAgIHBhcnNlci5saXN0ZW5lciA9IG5ldyBGb3J3YXJkaW5nTGlzdGVuZXIoKTsKICAgICAgdG9rZW4gPSBpc0FyZ3VtZW50cwogICAgICAgICAgPyBpbnZhbGlkVHlwZVZhci5wYXJzZUFyZ3VtZW50cyh0b2tlbiwgcGFyc2VyKQogICAgICAgICAgOiBpbnZhbGlkVHlwZVZhci5wYXJzZVZhcmlhYmxlcyh0b2tlbiwgcGFyc2VyKTsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIHBhcnNlci5saXN0ZW5lciA9IG9yaWdpbmFsTGlzdGVuZXI7CgogICAgICBpZiAocGFyc2VDbG9zZXIodG9rZW4pKSB7CiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICB9CiAgICB9CgogICAgaWYgKG9wdGlvbmFsKCcoJywgbmV4dCkgJiYgbmV4dC5lbmRHcm91cCAhPSBudWxsKSB7CiAgICAgIGlmICghZXJyb3JSZXBvcnRlZCkgewogICAgICAgIC8vIE9ubHkgcmVwb3J0IGFuIGVycm9yIGlmIG9uZSBoYXMgbm90IGFscmVhZHkgYmVlbiByZXBvcnRlZC4KICAgICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgdG9rZW4sIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRBZnRlckJ1dEdvdC53aXRoQXJndW1lbnRzKCc+JykpOwogICAgICAgIGVycm9yUmVwb3J0ZWQgPSB0cnVlOwogICAgICB9CiAgICAgIHRva2VuID0gbmV4dC5lbmRHcm91cDsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CgogICAgICBpZiAocGFyc2VDbG9zZXIodG9rZW4pKSB7CiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICB9CiAgICB9CgogICAgaWYgKCFlcnJvclJlcG9ydGVkKSB7CiAgICAgIC8vIE9ubHkgcmVwb3J0IGFuIGVycm9yIGlmIG9uZSBoYXMgbm90IGFscmVhZHkgYmVlbiByZXBvcnRlZC4KICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICB0b2tlbiwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEFmdGVyQnV0R290LndpdGhBcmd1bWVudHMoJz4nKSk7CiAgICB9CiAgICBpZiAocGFyc2VDbG9zZXIobmV4dCkpIHsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CiAgICBUb2tlbiBlbmRHcm91cCA9IHN5bnRoZXRpY0d0KG5leHQpOwogICAgZW5kR3JvdXAuc2V0TmV4dChuZXh0KTsKICAgIHRva2VuLnNldE5leHQoZW5kR3JvdXApOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gc2tpcChUb2tlbiB0b2tlbikgewogICAgYXNzZXJ0KHNraXBFbmQgIT0gbnVsbCk7CiAgICByZXR1cm4gc2tpcEVuZDsKICB9Cn0KCi8vLyBSZXR1cm4gYHRydWVgIGlmIFt0b2tlbl0gaXMgb25lIG9mIGA+YCwgYD4+YCwgYD4+PmAsIGA+PWAsIGA+Pj1gLCBvciBgPj4+PWAuCmJvb2wgaXNDbG9zZXIoVG9rZW4gdG9rZW4pIHsKICBmaW5hbCB2YWx1ZSA9IHRva2VuLnN0cmluZ1ZhbHVlOwogIHJldHVybiBpZGVudGljYWwodmFsdWUsICc+JykgfHwKICAgICAgaWRlbnRpY2FsKHZhbHVlLCAnPj4nKSB8fAogICAgICBpZGVudGljYWwodmFsdWUsICc+PScpIHx8CiAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJz4+PicpIHx8CiAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJz4+PScpIHx8CiAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJz4+Pj0nKTsKfQoKLy8vIElmIFtiZWZvcmVDbG9zZXJdLm5leHQgaXMgb25lIG9mIGA+YCwgYD4+YCwgYD4+PmAsIGA+PWAsIGA+Pj1gLCBvciBgPj4+PWAKLy8vIHRoZW4gdXBkYXRlIHRoZSB0b2tlbiBzdHJlYW0gYW5kIHJldHVybiBgdHJ1ZWAuCmJvb2wgcGFyc2VDbG9zZXIoVG9rZW4gYmVmb3JlQ2xvc2VyKSB7CiAgVG9rZW4gdW5zcGxpdCA9IGJlZm9yZUNsb3Nlci5uZXh0OwogIFRva2VuIHNwbGl0ID0gc3BsaXRDbG9zZXIodW5zcGxpdCk7CiAgaWYgKHNwbGl0ID09IHVuc3BsaXQpIHsKICAgIHJldHVybiB0cnVlOwogIH0gZWxzZSBpZiAoc3BsaXQgPT0gbnVsbCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBzcGxpdC5uZXh0LnNldE5leHQodW5zcGxpdC5uZXh0KTsKICBiZWZvcmVDbG9zZXIuc2V0TmV4dChzcGxpdCk7CiAgcmV0dXJuIHRydWU7Cn0KCi8vLyBJZiBbY2xvc2VyXSBpcyBgPmAgdGhlbiByZXR1cm4gaXQuCi8vLyBJZiBbY2xvc2VyXSBpcyBvbmUgb2YgYD4+YCwgYD4+PmAsIGA+PWAsIGA+Pj1gLCAgb3IgYD4+Pj1gIHRoZW4gc3BsaXQKLy8vIHRoZSB0b2tlbiBhbmQgcmV0dXJuIHRoZSBsZWFkaW5nIGA+YCB3aXRob3V0IHVwZGF0aW5nIHRoZSB0b2tlbiBzdHJlYW0uCi8vLyBJZiBbY2xvc2VyXSBpcyBub25lIG9mIHRoZSBhYm92ZSwgdGhlbiByZXR1cm4gbnVsbDsKVG9rZW4gc3BsaXRDbG9zZXIoVG9rZW4gY2xvc2VyKSB7CiAgU3RyaW5nIHZhbHVlID0gY2xvc2VyLnN0cmluZ1ZhbHVlOwogIGlmIChpZGVudGljYWwodmFsdWUsICc+JykpIHsKICAgIHJldHVybiBjbG9zZXI7CiAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICc+PicpKSB7CiAgICByZXR1cm4gc3BsaXRHdEd0KGNsb3Nlcik7CiAgfSBlbHNl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eSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gQSBwYWlyIG9mIHZhbHVlcy4KY2xhc3MgUGFpcjxFLCBGPiB7CiAgRSBmaXJzdDsKICBGIGxhc3Q7CgogIFBhaXIodGhpcy5maXJzdCwgdGhpcy5sYXN0KTsKfQoKLy8vIFJldHVybnMgYSBbQ29tcGFyYXRvcl0gdGhhdCBhc3NlcnRzIHRoYXQgaXRzIGZpcnN0IGFyZ3VtZW50IGlzIGNvbXBhcmFibGUuCkNvbXBhcmF0b3I8VD4gZGVmYXVsdENvbXBhcmU8VD4oKSA9PgogICAgKHZhbHVlMSwgdmFsdWUyKSA9PiAodmFsdWUxIGFzIENvbXBhcmFibGUpLmNvbXBhcmVUbyh2YWx1ZTIpOwoRAE5OPAEWEwsKAR8CAU8lQgEhcGFja2FnZTpjb2xsZWN0aW9uL3NyYy91dGlscy5kYXJ0R3Nka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jb2xsZWN0aW9uL2xpYi9zcmMvZW1wdHlfdW5tb2RpZmlhYmxlX3NldC5kYXJ0hy0vLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOwoKaW1wb3J0ICd1bm1vZGlmaWFibGVfd3JhcHBlcnMuZGFydCc7CgovLyBVbmZvcnR1bmF0ZWx5LCB3ZSBjYW4ndCB1c2UgVW5tb2RpZmlhYmxlU2V0TWl4aW4gaGVyZSwgc2luY2UgY29uc3QgY2xhc3NlcwovLyBjYW4ndCB1c2UgbWl4aW5zLgovLy8gQW4gdW5tb2RpZmlhYmxlLCBlbXB0eSBzZXQgdGhhdCBjYW4gaGF2ZSBhIGNvbnN0IGNvbnN0cnVjdG9yLgpjbGFzcyBFbXB0eVVubW9kaWZpYWJsZVNldDxFPiBleHRlbmRzIEl0ZXJhYmxlQmFzZTxFPgogICAgaW1wbGVtZW50cyBVbm1vZGlmaWFibGVTZXRWaWV3PEU+IHsKICBzdGF0aWMgVCBfdGhyb3c8VD4oKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgU2V0Iik7CiAgfQoKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3IgPT4gbmV3IEl0ZXJhYmxlPEU+LmVtcHR5KCkuaXRlcmF0b3I7CiAgaW50IGdldCBsZW5ndGggPT4gMDsKCiAgY29uc3QgRW1wdHlVbm1vZGlmaWFibGVTZXQoKTsKCiAgRW1wdHlVbm1vZGlmaWFibGVTZXQ8VD4gY2FzdDxUPigpID0+IG5ldyBFbXB0eVVubW9kaWZpYWJsZVNldDxUPigpOwogIGJvb2wgY29udGFpbnMoT2JqZWN0IGVsZW1lbnQpID0+IGZhbHNlOwogIGJvb2wgY29udGFpbnNBbGwoSXRlcmFibGU8T2JqZWN0PiBvdGhlcikgPT4gb3RoZXIuaXNFbXB0eTsKICBJdGVyYWJsZTxFPiBmb2xsb3dlZEJ5KEl0ZXJhYmxlPEU+IG90aGVyKSA9PiBuZXcgU2V0LmZyb20ob3RoZXIpOwogIEUgbG9va3VwKE9iamVjdCBlbGVtZW50KSA9PiBudWxsOwogIEBkZXByZWNhdGVkCiAgRW1wdHlVbm1vZGlmaWFibGVTZXQ8VD4gcmV0eXBlPFQ+KCkgPT4gbmV3IEVtcHR5VW5tb2RpZmlhYmxlU2V0PFQ+KCk7CiAgRSBzaW5nbGVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwge0Ugb3JFbHNlKCl9KSA9PiBzdXBlci5zaW5nbGVXaGVyZSh0ZXN0KTsKICBJdGVyYWJsZTxUPiB3aGVyZVR5cGU8VD4oKSA9PiBuZXcgRW1wdHlVbm1vZGlmaWFibGVTZXQ8VD4oKTsKICBTZXQ8RT4gdG9TZXQoKSA9PiBuZXcgU2V0KCk7CiAgU2V0PEU+IHVuaW9uKFNldDxFPiBvdGhlcikgPT4gbmV3IFNldC5mcm9tKG90aGVyKTsKICBTZXQ8RT4gaW50ZXJzZWN0aW9uKFNldDxPYmplY3Q+IG90aGVyKSA9PiBuZXcgU2V0KCk7CiAgU2V0PEU+IGRpZmZlcmVuY2UoU2V0PE9iamVjdD4gb3RoZXIpID0+IG5ldyBTZXQoKTsKCiAgYm9vbCBhZGQoRSB2YWx1ZSkgPT4gX3Rocm93KCk7CiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gZWxlbWVudHMpID0+IF90aHJvdygpOwogIHZvaWQgY2xlYXIoKSA9PiBfdGhyb3coKTsKICBib29sIHJlbW92ZShPYmplY3QgZWxlbWVudCkgPT4gX3Rocm93KCk7CiAgdm9pZCByZW1vdmVBbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cykgPT4gX3Rocm93KCk7CiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gX3Rocm93KCk7CiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gX3Rocm93KCk7CiAgdm9pZCByZXRhaW5BbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cykgPT4gX3Rocm93KCk7Cn0KLwBOTjwBGgElAU4VQjYoGUUEAUAXASABRio9RCQOSFA/HzU3NQEhMRwrOTY2OQIBMnBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvZW1wdHlfdW5tb2RpZmlhYmxlX3NldC5kYXJ0S3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2VtaXR0ZXIvc3RhcnR1cF9lbWl0dGVyL21vZGVsX2VtaXR0ZXIuZGFydL1GLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5qc19lbWl0dGVyLnN0YXJ0dXBfZW1pdHRlci5tb2RlbF9lbWl0dGVyOwoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgSnNvbkVuY29kZXI7CmltcG9ydCAnZGFydDptYXRoJyBzaG93IFJhbmRvbTsKCmltcG9ydCAncGFja2FnZTpqc19ydW50aW1lL3NoYXJlZC9lbWJlZGRlZF9uYW1lcy5kYXJ0JwogICAgc2hvdwogICAgICAgIERFRkVSUkVEX0lOSVRJQUxJWkVELAogICAgICAgIERFRkVSUkVEX0xJQlJBUllfUEFSVFMsCiAgICAgICAgREVGRVJSRURfUEFSVF9VUklTLAogICAgICAgIERFRkVSUkVEX1BBUlRfSEFTSEVTLAogICAgICAgIEdFVF9UWVBFX0ZST01fTkFNRSwKICAgICAgICBJTklUSUFMSVpFX0xPQURFRF9IVU5LLAogICAgICAgIElOVEVSQ0VQVE9SU19CWV9UQUcsCiAgICAgICAgSVNfSFVOS19JTklUSUFMSVpFRCwKICAgICAgICBJU19IVU5LX0xPQURFRCwKICAgICAgICBKc0dldE5hbWUsCiAgICAgICAgTEVBRl9UQUdTLAogICAgICAgIE1BTkdMRURfR0xPQkFMX05BTUVTLAogICAgICAgIE1BTkdMRURfTkFNRVMsCiAgICAgICAgTUVUQURBVEEsCiAgICAgICAgTkFUSVZFX1NVUEVSQ0xBU1NfVEFHX05BTUUsCiAgICAgICAgVFlQRV9UT19JTlRFUkNFUFRPUl9NQVAsCiAgICAgICAgVFlQRVM7CgppbXBvcnQgJ3BhY2thZ2U6anNfYXN0L3NyYy9wcmVjZWRlbmNlLmRhcnQnIGFzIGpzX3ByZWNlZGVuY2U7CgppbXBvcnQgJy4uLy4uLy4uL2NvbXBpbGVyX25ldy5kYXJ0JzsKaW1wb3J0ICcuLi8uLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vLi4vY29tcGlsZXIuZGFydCcgc2hvdyBDb21waWxlcjsKaW1wb3J0ICcuLi8uLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnCiAgICBzaG93IENvbnN0YW50VmFsdWUsIEZ1bmN0aW9uQ29uc3RhbnRWYWx1ZSwgTnVsbENvbnN0YW50VmFsdWU7CmltcG9ydCAnLi4vLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgQ29tbW9uRWxlbWVudHM7CmltcG9ydCAnLi4vLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vLi4vaGFzaC9zaGExLmRhcnQnIHNob3cgSGFzaGVyOwppbXBvcnQgJy4uLy4uL2lvL2NvZGVfb3V0cHV0LmRhcnQnOwppbXBvcnQgJy4uLy4uL2lvL2xvY2F0aW9uX3Byb3ZpZGVyLmRhcnQnIHNob3cgTG9jYXRpb25Db2xsZWN0b3I7CmltcG9ydCAnLi4vLi4vaW8vc291cmNlX21hcF9idWlsZGVyLmRhcnQnIHNob3cgU291cmNlTWFwQnVpbGRlcjsKaW1wb3J0ICcuLi8uLi9qcy9qcy5kYXJ0JyBhcyBqczsKaW1wb3J0ICcuLi8uLi9qc19iYWNrZW5kL2pzX2JhY2tlbmQuZGFydCcKICAgIHNob3cgSmF2YVNjcmlwdEJhY2tlbmQsIE5hbWVyLCBDb25zdGFudEVtaXR0ZXIsIFN0cmluZ0JhY2tlZE5hbWU7CmltcG9ydCAnLi4vLi4vanNfYmFja2VuZC9qc19pbnRlcm9wX2FuYWx5c2lzLmRhcnQnIGFzIGpzSW50ZXJvcEFuYWx5c2lzOwppbXBvcnQgJy4uLy4uL3dvcmxkLmRhcnQnOwppbXBvcnQgJy4uL2NvZGVfZW1pdHRlcl90YXNrLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50X29yZGVyaW5nLmRhcnQnIHNob3cgQ29uc3RhbnRPcmRlcmluZzsKaW1wb3J0ICcuLi9oZWFkZXJzLmRhcnQnOwppbXBvcnQgJy4uL2pzX2VtaXR0ZXIuZGFydCcgc2hvdyBOYXRpdmVFbWl0dGVyOwppbXBvcnQgJy4uL2pzX2VtaXR0ZXIuZGFydCcgc2hvdyBidWlsZFRlYXJPZmZDb2RlLCBOYXRpdmVHZW5lcmF0b3I7CmltcG9ydCAnLi4vbW9kZWwuZGFydCc7CmltcG9ydCAnLi4vc29ydGVyLmRhcnQnIHNob3cgU29ydGVyOwoKcGFydCAnZnJhZ21lbnRfZW1pdHRlci5kYXJ0JzsKCmNsYXNzIE1vZGVsRW1pdHRlciB7CiAgZmluYWwgQ29tcGlsZXIgY29tcGlsZXI7CiAgZmluYWwgTmFtZXIgbmFtZXI7CiAgZmluYWwgQ29kZUVtaXR0ZXJUYXNrIHRhc2s7CiAgQ29uc3RhbnRFbWl0dGVyIGNvbnN0YW50RW1pdHRlcjsKICBmaW5hbCBOYXRpdmVFbWl0dGVyIG5hdGl2ZUVtaXR0ZXI7CiAgZmluYWwgYm9vbCBzaG91bGRHZW5lcmF0ZVNvdXJjZU1hcDsKICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwogIGZpbmFsIENvbnN0YW50T3JkZXJpbmcgX2NvbnN0YW50T3JkZXJpbmc7CgogIC8vIFRoZSBmdWxsIGNvZGUgdGhhdCBpcyB3cml0dGVuIHRvIGVhY2ggaHVuayBwYXJ0LWZpbGUuCiAgZmluYWwgTWFwPEZyYWdtZW50LCBDb2RlT3V0cHV0PiBvdXRwdXRCdWZmZXJzID0ge307CgogIFNldDxGcmFnbWVudD4gb21pdHRlZEZyYWdtZW50cyA9IFNldCgpOwoKICBKYXZhU2NyaXB0QmFja2VuZCBnZXQgYmFja2VuZCA9PiBjb21waWxlci5iYWNrZW5kOwoKICAvLy8gRm9yIGRlZmVycmVkIGxvYWRpbmcgd2UgY29tbXVuaWNhdGUgdGhlIGluaXRpYWxpemVycyB2aWEgdGhpcyBnbG9iYWwgdmFyLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgZGVmZXJyZWRJbml0aWFsaXplcnNHbG9iYWwgPQogICAgICByIiRfX2RhcnRfZGVmZXJyZWRfaW5pdGlhbGl6ZXJzX18iOwoKICBzdGF0aWMgY29uc3QgU3RyaW5nIHBhcnRFeHRlbnNpb24gPSAicGFydCI7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBkZWZlcnJlZEV4dGVuc2lvbiA9ICJwYXJ0LmpzIjsKCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0eXBlTmFtZVByb3BlcnR5ID0gciJidWlsdGluJGNscyI7CgogIE1vZGVsRW1pdHRlcih0aGlzLmNvbXBpbGVyLCB0aGlzLm5hbWVyLCB0aGlzLm5hdGl2ZUVtaXR0ZXIsIHRoaXMuX2Nsb3NlZFdvcmxkLAogICAgICBTb3J0ZXIgc29ydGVyLCB0aGlzLnRhc2ssIHRoaXMuc2hvdWxkR2VuZXJhdGVTb3VyY2VNYXApCiAgICAgIDogX2NvbnN0YW50T3JkZXJpbmcgPSBuZXcgQ29uc3RhbnRPcmRlcmluZyhzb3J0ZXIpIHsKICAgIHRoaXMuY29uc3RhbnRFbWl0dGVyID0gbmV3IENvbnN0YW50RW1pdHRlcigKICAgICAgICBjb21waWxlci5vcHRpb25zLAogICAgICAgIF9jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cywKICAgICAgICBjb21waWxlci5jb2RlZ2VuV29ybGRCdWlsZGVyLAogICAgICAgIF9jbG9zZWRXb3JsZC5ydGlOZWVkLAogICAgICAgIGNvbXBpbGVyLmJhY2tlbmQucnRpRW5jb2RlciwKICAgICAgICBfY2xvc2VkV29ybGQuZmllbGRBbmFseXNpcywKICAgICAgICB0YXNrLAogICAgICAgIHRoaXMuZ2VuZXJhdGVDb25zdGFudFJlZmVyZW5jZSwKICAgICAgICBjb25zdGFudExpc3RHZW5lcmF0b3IpOwogIH0KCiAgRGlhZ25vc3RpY1JlcG9ydGVyIGdldCByZXBvcnRlciA9PiBjb21waWxlci5yZXBvcnRlcjsKCiAganMuRXhwcmVzc2lvbiBjb25zdGFudExpc3RHZW5lcmF0b3IoanMuRXhwcmVzc2lvbiBhcnJheSkgewogICAgLy8gVE9ETyhmbG9pdHNjaCk6IHJlbW92ZSBoYXJkLWNvZGVkIG5hbWUuCiAgICByZXR1cm4ganMuanMoJ21ha2VDb25zdExpc3QoIyknLCBbYXJyYXldKTsKICB9CgogIGpzLkV4cHJlc3Npb24gZ2VuZXJhdGVFbWJlZGRlZEdsb2JhbEFjY2VzcyhTdHJpbmcgZ2xvYmFsKSB7CiAgICByZXR1cm4ganMuanMoZ2VuZXJhdGVFbWJlZGRlZEdsb2JhbEFjY2Vzc1N0cmluZyhnbG9iYWwpKTsKICB9CgogIFN0cmluZyBnZW5lcmF0ZUVtYmVkZGVkR2xvYmFsQWNjZXNzU3RyaW5nKFN0cmluZyBnbG9iYWwpIHsKICAgIC8vIFRPRE8oZmxvaXRzY2gpOiBkb24ndCB1c2UgJ2luaXQnIGFzIGdsb2JhbCBlbWJlZGRlciBzdG9yYWdlLgogICAgcmV0dXJuICdpbml0LiRnbG9iYWwnOwogIH0KCiAgYm9vbCBpc0NvbnN0YW50SW5saW5lZE9yQWxyZWFkeUVtaXR0ZWQoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgaWYgKGNvbnN0YW50LmlzRnVuY3Rpb24pIHJldHVybiB0cnVlOyAvLyBBbHJlYWR5IGVtaXR0ZWQuCiAgICBpZiAoY29uc3RhbnQuaXNQcmltaXRpdmUpIHJldHVybiB0cnVlOyAvLyBJbmxpbmVkLgogICAgaWYgKGNvbnN0YW50LmlzRHVtbXkpIHJldHVybiB0cnVlOyAvLyBJbmxpbmVkLgogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8gVE9ETyhmbG9pdHNjaCk6IGNvcGllZCBmcm9tIE9sZEVtaXR0ZXIuIEFkanVzdCBvciBzaGFyZS4KICBpbnQgY29tcGFyZUNvbnN0YW50cyhDb25zdGFudFZhbHVlIGEsIENvbnN0YW50VmFsdWUgYikgewogICAgLy8gSW5saW5lZCBjb25zdGFudHMgZG9uJ3QgYWZmZWN0IHRoZSBvcmRlciBhbmQgc29tZXRpbWVzIGRvbid0IGV2ZW4gaGF2ZQogICAgLy8gbmFtZXMuCiAgICBpbnQgY21wMSA9IGlzQ29uc3RhbnRJbmxpbmVkT3JBbHJlYWR5RW1pdHRlZChhKSA/IDAgOiAxOwogICAgaW50IGNtcDIgPSBpc0NvbnN0YW50SW5saW5lZE9yQWxyZWFkeUVtaXR0ZWQoYikgPyAwIDogMTsKICAgIGlmIChjbXAxICsgY21wMiA8IDIpIHJldHVybiBjbXAxIC0gY21wMjsKCiAgICAvLyBFbWl0IGNvbnN0YW50IGludGVyY2VwdG9ycyBmaXJzdC4gQ29uc3RhbnQgaW50ZXJjZXB0b3JzIGZvciBwcmltaXRpdmVzCiAgICAvLyBtaWdodCBiZSB1c2VkIGJ5IGNvZGUgdGhhdCBidWlsZHMgb3RoZXIgY29uc3RhbnRzLiAgU2VlIElzc3VlIDE4MTczLgogICAgaWYgKGEuaXNJbnRlcmNlcHRvciAhPSBiLmlzSW50ZXJjZXB0b3IpIHsKICAgICAgcmV0dXJuIGEuaXNJbnRlcmNlcHRvciA/IC0xIDogMTsKICAgIH0KCiAgICAvLyBTb3J0aW5nIGJ5IHRoZSBsb25nIG5hbWUgY2x1c3RlcnMgY29uc3RhbnRzIHdpdGggdGhlIHNhbWUgY29uc3RydWN0b3IKICAgIC8vIHdoaWNoIGNvbXByZXNzZXMgYSB0aW55IGJpdCBiZXR0ZXIuCiAgICBpbnQgciA9IG5hbWVyLmNvbnN0YW50TG9uZ05hbWUoYSkuY29tcGFyZVRvKG5hbWVyLmNvbnN0YW50TG9uZ05hbWUoYikpOwogICAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CgogICAgLy8gUmVzb2x2ZSBjb2xsaXNpb25zIGluIHRoZSBsb25nIG5hbWUgYnkgdXNpbmcgYSBzdHJ1Y3R1cmFsIG9yZGVyLgogICAgcmV0dXJuIF9jb25zdGFudE9yZGVyaW5nLmNvbXBhcmUoYSwgYik7CiAgfQoKICBqcy5FeHByZXNzaW9uIGdlbmVyYXRlU3RhdGljQ2xvc3VyZUFjY2VzcyhGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4ganMuanMoJyMuIygpJywgWwogICAgICBuYW1lci5nbG9iYWxPYmplY3RGb3JNZW1iZXIoZWxlbWVudCksCiAgICAgIG5hbWVyLnN0YXRpY0Nsb3N1cmVOYW1lKGVsZW1lbnQpCiAgICBdKTsKICB9CgogIGpzLkV4cHJlc3Npb24gZ2VuZXJhdGVDb25zdGFudFJlZmVyZW5jZShDb25zdGFudFZhbHVlIHZhbHVlKSB7CiAgICBpZiAodmFsdWUuaXNGdW5jdGlvbikgewogICAgICBGdW5jdGlvbkNvbnN0YW50VmFsdWUgZnVuY3Rpb25Db25zdGFudCA9IHZhbHVlOwogICAgICByZXR1cm4gZ2VuZXJhdGVTdGF0aWNDbG9zdXJlQWNjZXNzKGZ1bmN0aW9uQ29uc3RhbnQuZWxlbWVudCk7CiAgICB9CgogICAgLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgImlzSW5saW5lZCIgcGFydCwgYnV0IGl0IGRvZXMgbm90IGh1cnQgdG8KICAgIC8vIHRlc3QgZm9yIHRoZSBvdGhlciBwcmVkaWNhdGVzLgogICAgaWYgKGlzQ29uc3RhbnRJbmxpbmVkT3JBbHJlYWR5RW1pdHRlZCh2YWx1ZSkpIHsKICAgICAgcmV0dXJuIGNvbnN0YW50RW1pdHRlci5nZW5lcmF0ZSh2YWx1ZSk7CiAgICB9CiAgICByZXR1cm4ganMuanMoJyMuIycsCiAgICAgICAgW25hbWVyLmdsb2JhbE9iamVjdEZvckNvbnN0YW50KHZhbHVlKSwgbmFtZXIuY29uc3RhbnROYW1lKHZhbHVlKV0pOwogIH0KCiAgaW50IGVtaXRQcm9ncmFtKFByb2dyYW0gcHJvZ3JhbSkgewogICAgTWFpbkZyYWdtZW50IG1haW5GcmFnbWVudCA9IHByb2dyYW0uZnJhZ21lbnRzLmZpcnN0OwogICAgTGlzdDxEZWZlcnJlZEZyYWdtZW50PiBkZWZlcnJlZEZyYWdtZW50cyA9CiAgICAgICAgbmV3IExpc3Q8RGVmZXJyZWRGcmFnbWVudD4uZnJvbShwcm9ncmFtLmRlZmVycmVkRnJhZ21lbnRzKTsKCiAgICBGcmFnbWVudEVtaXR0ZXIgZnJhZ21lbnRFbWl0dGVyID0gbmV3IEZyYWdtZW50RW1pdHRlcigKICAgICAgICBjb21waWxlciwgbmFtZXIsIGJhY2tlbmQsIGNvbnN0YW50RW1pdHRlciwgdGhpcywgX2Nsb3NlZFdvcmxkKTsKCiAgICB2YXIgZGVmZXJyZWRMb2FkaW5nU3RhdGUgPSBuZXcgRGVmZXJyZWRMb2FkaW5nU3RhdGUoKTsKICAgIGpzLlN0YXRlbWVudCBtYWluQ29kZSA9CiAgICAgICAgZnJhZ21lbnRFbWl0dGVyLmVtaXRNYWluRnJhZ21lbnQocHJvZ3JhbSwgZGVmZXJyZWRMb2FkaW5nU3RhdGUpOwoKICAgIE1hcDxEZWZlcnJlZEZyYWdtZW50LCBqcy5FeHByZXNzaW9uPiBkZWZlcnJlZEZyYWdtZW50c0NvZGUgPSB7fTsKCiAgICBmb3IgKERlZmVycmVkRnJhZ21lbnQgZnJhZ21lbnQgaW4gZGVmZXJyZWRGcmFnbWVudHMpIHsKICAgICAganMuRXhwcmVzc2lvbiB0eXBlcyA9CiAgICAgICAgICBwcm9ncmFtLm1ldGFkYXRhVHlwZXNGb3JPdXRwdXRVbml0KGZyYWdtZW50Lm91dHB1dFVuaXQpOwogICAgICBqcy5FeHByZXNzaW9uIGZyYWdtZW50Q29kZSA9IGZyYWdtZW50RW1pdHRlci5lbWl0RGVmZXJyZWRGcmFnbWVudCgKICAgICAgICAgIGZyYWdtZW50LCB0eXBlcywgcHJvZ3JhbS5ob2xkZXJzKTsKICAgICAgaWYgKGZyYWdtZW50Q29kZSAhPSBudWxsKSB7CiAgICAgICAgZGVmZXJyZWRGcmFnbWVudHNDb2RlW2ZyYWdtZW50XSA9IGZyYWdtZW50Q29kZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvbWl0dGVkRnJhZ21lbnRzLmFkZChmcmFnbWVudCk7CiAgICAgIH0KICAgIH0KCiAgICBqcy5Ub2tlbkNvdW50ZXIgY291bnRlciA9IG5ldyBqcy5Ub2tlbkNvdW50ZXIoKTsKICAgIGRlZmVycmVkRnJhZ21lbnRzQ29kZS52YWx1ZXMuZm9yRWFjaChjb3VudGVyLmNvdW50VG9rZW5zKTsKICAgIGNvdW50ZXIuY291bnRUb2tlbnMobWFpbkNvZGUpOwoKICAgIHByb2dyYW0uZmluYWxpemVycy5mb3JFYWNoKChqcy5Ub2tlbkZpbmFsaXplciBmKSA9PiBmLmZpbmFsaXplVG9rZW5zKCkpOwoKICAgIC8vIFRPRE8oc3JhKTogVGhpcyBpcyB3aGVyZSB3ZSBrbm93IGlmIHRoZSB0eXBlcyAoYW5kIHBvdGVudGlhbGx5IG90aGVyCiAgICAvLyBkZWZlcnJlZCBBU1RzIGluc2lkZSB0aGUgcGFydHMpIGhhdmUgYW55IGNvbnRlbnRzLiBXZSBzaG91ZGwgd2FpdCB1bnRpbAogICAgLy8gdGhpcyBwb2ludCB0byBkZWNpZGUgaWYgYSBwYXJ0IGlzIGVtcHR5LgoKICAgIE1hcDxEZWZlcnJlZEZyYWdtZW50LCBTdHJpbmc+IGh1bmtIYXNoZXMgPQogICAgICAgIHdyaXRlRGVmZXJyZWRGcmFnbWVudHMoZGVmZXJyZWRGcmFnbWVudHNDb2RlKTsKCiAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIHdyaXR0ZW4gdGhlIGRlZmVycmVkIGh1bmtzLCB3ZSBjYW4gY3JlYXRlIHRoZSBkZWZlcnJlZAogICAgLy8gbG9hZGluZyBkYXRhLgogICAgZnJhZ21lbnRFbWl0dGVyLmZpbmFsaXplRGVmZXJyZWRMb2FkaW5nRGF0YSgKICAgICAgICBwcm9ncmFtLmxvYWRNYXAsIGh1bmtIYXNoZXMsIGRlZmVycmVkTG9hZGluZ1N0YXRlKTsKCiAgICB3cml0ZU1haW5GcmFnbWVudChtYWluRnJhZ21lbnQsIG1haW5Db2RlLAogICAgICAgIGlzU3BsaXQ6IHByb2dyYW0uZGVmZXJyZWRGcmFnbWVudHMuaXNOb3RFbXB0eSB8fAogICAgICAgICAgICBwcm9ncmFtLmhhc1NvZnREZWZlcnJlZENsYXNzZXMgfHwKICAgICAgICAgICAgY29tcGlsZXIub3B0aW9ucy5leHBlcmltZW50YWxUcmFja0FsbG9jYXRpb25zKTsKCiAgICBpZiAoX2Nsb3NlZFdvcmxkLmJhY2tlbmRVc2FnZS5yZXF1aXJlc1ByZWFtYmxlICYmCiAgICAgICAgIWJhY2tlbmQuaHRtbExpYnJhcnlJc0xvYWRlZCkgewogICAgICByZXBvcnRlci5yZXBvcnRIaW50TWVzc2FnZShOT19MT0NBVElPTl9TUEFOTkFCTEUsIE1lc3NhZ2VLaW5kLlBSRUFNQkxFKTsKICAgIH0KCiAgICBpZiAoY29tcGlsZXIub3B0aW9ucy5kZWZlcnJlZE1hcFVyaSAhPSBudWxsKSB7CiAgICAgIHdyaXRlRGVmZXJyZWRNYXAoKTsKICAgIH0KCiAgICAvLyBSZXR1cm4gdGhlIHRvdGFsIHByb2dyYW0gc2l6ZS4KICAgIHJldHVybiBvdXRwdXRCdWZmZXJzLnZhbHVlcy5mb2xkKDAsIChhLCBiKSA9PiBhICsgYi5sZW5ndGgpOwogIH0KCiAgLy8vIEdlbmVyYXRlcyBhIHNpbXBsZSBoZWFkZXIgdGhhdCBwcm92aWRlcyB0aGUgY29tcGlsZXIncyBidWlsZCBpZC4KICBqcy5Db21tZW50IGJ1aWxkR2VuZXJhdGVkQnkoKSB7CiAgICBTdHJpbmdCdWZmZXIgZmxhdm9yID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgZmxhdm9yLndyaXRlKCdmYXN0IHN0YXJ0dXAgZW1pdHRlcicpOwogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMgZmxhdm9yLgogICAgZmxhdm9yLndyaXRlKCcsIHN0cm9uZycpOwogICAgaWYgKGNvbXBpbGVyLm9wdGlvbnMudHJ1c3RQcmltaXRpdmVzKSBmbGF2b3Iud3JpdGUoJywgdHJ1c3QgcHJpbWl0aXZlcycpOwogICAgaWYgKGNvbXBpbGVyLm9wdGlvbnMub21pdEltcGxpY2l0Q2hlY2tzKSBmbGF2b3Iud3JpdGUoJywgb21pdCBjaGVja3MnKTsKICAgIGlmIChjb21waWxlci5vcHRpb25zLmxheFJ1bnRpbWVUeXBlVG9TdHJpbmcpIHsKICAgICAgZmxhdm9yLndyaXRlKCcsIGxheCBydW50aW1lIHR5cGUnKTsKICAgIH0KICAgIGlmIChjb21waWxlci5vcHRpb25zLnVzZUNvbnRlbnRTZWN1cml0eVBvbGljeSkgZmxhdm9yLndyaXRlKCcsIENTUCcpOwogICAgcmV0dXJuIG5ldyBqcy5Db21tZW50KGdlbmVyYXRlZEJ5KGNvbXBpbGVyLCBmbGF2b3I6ICckZmxhdm9yJykpOwogIH0KCiAgLy8vIFdyaXRlcyBhbGwgZGVmZXJyZWQgZnJhZ21lbnQncyBjb2RlIGludG8gZmlsZXMuCiAgLy8vCiAgLy8vIFJldHVybnMgYSBtYXAgZnJvbSBmcmFnbWVudCB0byBpdHMgaGFzaGNvZGUgKGFzIHVzZWQgZm9yIHRoZSBkZWZlcnJlZAogIC8vLyBsaWJyYXJ5IGNvZGUpLgogIC8vLwogIC8vLyBVcGRhdGVzIHRoZSBzaGFyZWQgW291dHB1dEJ1ZmZlcnNdIGZpZWxkIHdpdGggdGhlIG91dHB1dC4KICBNYXA8RGVmZXJyZWRGcmFnbWVudCwgU3RyaW5nPiB3cml0ZURlZmVycmVkRnJhZ21lbnRzKAogICAgICBNYXA8RGVmZXJyZWRGcmFnbWVudCwganMuRXhwcmVzc2lvbj4gZnJhZ21lbnRzQ29kZSkgewogICAgTWFwPERlZmVycmVkRnJhZ21lbnQsIFN0cmluZz4gaHVua0hhc2hlcyA9IHt9OwoKICAgIGZyYWdtZW50c0NvZGUuZm9yRWFjaCgoRGVmZXJyZWRGcmFnbWVudCBmcmFnbWVudCwganMuRXhwcmVzc2lvbiBjb2RlKSB7CiAgICAgIGh1bmtIYXNoZXNbZnJhZ21lbnRdID0gd3JpdGVEZWZlcnJlZEZyYWdtZW50KGZyYWdtZW50LCBjb2RlKTsKICAgIH0pOwoKICAgIHJldHVybiBodW5rSGFzaGVzOwogIH0KCiAganMuU3RhdGVtZW50IGJ1aWxkRGVmZXJyZWRJbml0aWFsaXplckdsb2JhbCgpIHsKICAgIHJldHVybiBqcy5qcy5zdGF0ZW1lbnQoCiAgICAgICAgJ3NlbGYuI2RlZmVycmVkSW5pdGlhbGl6ZXJzID0gJwogICAgICAgICdzZWxmLiNkZWZlcnJlZEluaXRpYWxpemVycyB8fCBPYmplY3QuY3JlYXRlKG51bGwpOycsCiAgICAgICAgeydkZWZlcnJlZEluaXRpYWxpemVycyc6IGRlZmVycmVkSW5pdGlhbGl6ZXJzR2xvYmFsfSk7CiAgfQoKICAvLyBXcml0ZXMgdGhlIGdpdmVuIFtmcmFnbWVudF0ncyBbY29kZV0gaW50byBhIGZpbGUuCiAgLy8KICAvLyBVcGRhdGVzIHRoZSBzaGFyZWQgW291dHB1dEJ1ZmZlcnNdIGZpZWxkIHdpdGggdGhlIG91dHB1dC4KICB2b2lkIHdyaXRlTWFpbkZyYWdtZW50KE1haW5GcmFnbWVudCBmcmFnbWVudCwganMuU3RhdGVtZW50IGNvZGUsCiAgICAgIHtib29sIGlzU3BsaXR9KSB7CiAgICBMb2NhdGlvbkNvbGxlY3RvciBsb2NhdGlvbkNvbGxlY3RvcjsKICAgIExpc3Q8Q29kZU91dHB1dExpc3RlbmVyPiBjb2RlT3V0cHV0TGlzdGVuZXJzOwogICAgaWYgKHNob3VsZEdlbmVyYXRlU291cmNlTWFwKSB7CiAgICAgIHRhc2subWVhc3VyZVN1YnRhc2soJ3NvdXJjZS1tYXBzJywgKCkgewogICAgICAgIGxvY2F0aW9uQ29sbGVjdG9yID0gbmV3IExvY2F0aW9uQ29sbGVjdG9yKCk7CiAgICAgICAgY29kZU91dHB1dExpc3RlbmVycyA9IDxDb2RlT3V0cHV0TGlzdGVuZXI+W2xvY2F0aW9uQ29sbGVjdG9yXTsKICAgICAgfSk7CiAgICB9CgogICAgQ29kZU91dHB1dCBtYWluT3V0cHV0ID0gbmV3IFN0cmVhbUNvZGVPdXRwdXQoCiAgICAgICAgY29tcGlsZXIub3V0cHV0UHJvdmlkZXIuY3JlYXRlT3V0cHV0U2luaygnJywgJ2pzJywgT3V0cHV0VHlwZS5qcyksCiAgICAgICAgY29kZU91dHB1dExpc3RlbmVycyk7CiAgICBvdXRwdXRCdWZmZXJzW2ZyYWdtZW50XSA9IG1haW5PdXRwdXQ7CgogICAganMuUHJvZ3JhbSBwcm9ncmFtID0gbmV3IGpzLlByb2dyYW0oWwogICAgICBidWlsZEdlbmVyYXRlZEJ5KCksCiAgICAgIG5ldyBqcy5Db21tZW50KEhPT0tTX0FQSV9VU0FHRSksCiAgICAgIGlzU3BsaXQgPyBidWlsZERlZmVycmVkSW5pdGlhbGl6ZXJHbG9iYWwoKSA6IG5ldyBqcy5CbG9jay5lbXB0eSgpLAogICAgICBjb2RlCiAgICBdKTsKCiAgICBtYWluT3V0cHV0LmFkZEJ1ZmZlcihqcy5jcmVhdGVDb2RlQnVmZmVyKAogICAgICAgIHByb2dyYW0sIGNvbXBpbGVyLm9wdGlvbnMsIGJhY2tlbmQuc291cmNlSW5mb3JtYXRpb25TdHJhdGVneSwKICAgICAgICBtb25pdG9yOiBjb21waWxlci5kdW1wSW5mb1Rhc2spKTsKCiAgICBpZiAoc2hvdWxkR2VuZXJhdGVTb3VyY2VNYXApIHsKICAgICAgdGFzay5tZWFzdXJlU3VidGFzaygnc291cmNlLW1hcHMnLCAoKSB7CiAgICAgICAgbWFpbk91dHB1dC5hZGQoU291cmNlTWFwQnVpbGRlci5nZW5lcmF0ZVNvdXJjZU1hcFRhZygKICAgICAgICAgICAgY29tcGlsZXIub3B0aW9ucy5zb3VyY2VNYXBVcmksIGNvbXBpbGVyLm9wdGlvbnMub3V0cHV0VXJpKSk7CiAgICAgIH0pOwogICAgfQoKICAgIG1haW5PdXRwdXQuY2xvc2UoKTsKCiAgICBpZiAoc2hvdWxkR2VuZXJhdGVTb3VyY2VNYXApIHsKICAgICAgdGFzay5tZWFzdXJlU3VidGFzaygnc291cmNlLW1hcHMnLCAoKSB7CiAgICAgICAgU291cmNlTWFwQnVpbGRlci5vdXRwdXRTb3VyY2VNYXAoCiAgICAgICAgICAgIG1haW5PdXRwdXQsCiAgICAgICAgICAgIGxvY2F0aW9uQ29sbGVjdG9yLAogICAgICAgICAgICBuYW1lci5jcmVhdGVNaW5pZmllZEdsb2JhbE5hbWVNYXAoKSwKICAgICAgICAgICAgbmFtZXIuY3JlYXRlTWluaWZpZWRJbnN0YW5jZU5hbWVNYXAoKSwKICAgICAgICAgICAgJycsCiAgICAgICAgICAgIGNvbXBpbGVyLm9wdGlvbnMuc291cmNlTWFwVXJpLAogICAgICAgICAgICBjb21waWxlci5vcHRpb25zLm91dHB1dFVyaSwKICAgICAgICAgICAgY29tcGlsZXIub3V0cHV0UHJvdmlkZXIpOwogICAgICB9KTsKICAgIH0KICB9CgogIC8vIFdyaXRlcyB0aGUgZ2l2ZW4gW2ZyYWdtZW50XSdzIFtjb2RlXSBpbnRvIGEgZmlsZS4KICAvLwogIC8vIFJldHVybnMgdGhlIGRlZmVycmVkIGZyYWdtZW50J3MgaGFzaC4KICAvLwogIC8vIFVwZGF0ZXMgdGhlIHNoYXJlZCBbb3V0cHV0QnVmZmVyc10gZmllbGQgd2l0aCB0aGUgb3V0cHV0LgogIFN0cmluZyB3cml0ZURlZmVycmVkRnJhZ21lbnQoRGVmZXJyZWRGcmFnbWVudCBmcmFnbWVudCwganMuRXhwcmVzc2lvbiBjb2RlKSB7CiAgICBMaXN0PENvZGVPdXRwdXRMaXN0ZW5lcj4gb3V0cHV0TGlzdGVuZXJzID0gW107CiAgICBIYXNoZXIgaGFzaGVyID0gbmV3IEhhc2hlcigpOwogICAgb3V0cHV0TGlzdGVuZXJzLmFkZChoYXNoZXIpOwoKICAgIExvY2F0aW9uQ29sbGVjdG9yIGxvY2F0aW9uQ29sbGVjdG9yOwogICAgaWYgKHNob3VsZEdlbmVyYXRlU291cmNlTWFwKSB7CiAgICAgIHRhc2subWVhc3VyZVN1YnRhc2soJ3NvdXJjZS1tYXBzJywgKCkgewogICAgICAgIGxvY2F0aW9uQ29sbGVjdG9yID0gbmV3IExvY2F0aW9uQ29sbGVjdG9yKCk7CiAgICAgICAgb3V0cHV0TGlzdGVuZXJzLmFkZChsb2NhdGlvbkNvbGxlY3Rvcik7CiAgICAgIH0pOwogICAgfQoKICAgIFN0cmluZyBodW5rUHJlZml4ID0gZnJhZ21lbnQub3V0cHV0RmlsZU5hbWU7CgogICAgQ29kZU91dHB1dCBvdXRwdXQgPSBuZXcgU3RyZWFtQ29kZU91dHB1dCgKICAgICAgICBjb21waWxlci5vdXRwdXRQcm92aWRlcgogICAgICAgICAgICAuY3JlYXRlT3V0cHV0U2luayhodW5rUHJlZml4LCBkZWZlcnJlZEV4dGVuc2lvbiwgT3V0cHV0VHlwZS5qc1BhcnQpLAogICAgICAgIG91dHB1dExpc3RlbmVycyk7CgogICAgb3V0cHV0QnVmZmVyc1tmcmFnbWVudF0gPSBvdXRwdXQ7CgogICAgLy8gVGhlIFtjb2RlXSBjb250YWlucyB0aGUgZnVuY3Rpb24gdGhhdCBtdXN0IGJlIGludm9rZWQgd2hlbiB0aGUgZGVmZXJyZWQKICAgIC8vIGh1bmsgaXMgbG9hZGVkLgogICAgLy8gVGhhdCBmdW5jdGlvbiBtdXN0IGJlIGluIGEgbWFwIGZyb20gaXRzIGhhc2hjb2RlIHRvIHRoZSBmdW5jdGlvbi4gU2luY2UKICAgIC8vIHdlIGRvbid0IGtub3cgdGhlIGhhc2ggYmVmb3JlIHdlIGFjdHVhbGx5IGVtaXQgdGhlIGNvZGUgd2Ugc3RvcmUgdGhlCiAgICAvLyBmdW5jdGlvbiBpbiBhIHRlbXBvcmFyeSBmaWVsZCBmaXJzdDoKICAgIC8vCiAgICAvLyAgIGRlZmVycmVkSW5pdGlhbGl6ZXIuY3VycmVudCA9IDxwcmV0dHktcHJpbnRlZCBjb2RlPjsKICAgIC8vICAgZGVmZXJyZWRJbml0aWFsaXplcls8aGFzaD5dID0gZGVmZXJyZWRJbml0aWFsaXplci5jdXJyZW50OwoKICAgIGpzLlByb2dyYW0gcHJvZ3JhbSA9IG5ldyBqcy5Qcm9ncmFtKFsKICAgICAgYnVpbGRHZW5lcmF0ZWRCeSgpLAogICAgICBidWlsZERlZmVycmVkSW5pdGlhbGl6ZXJHbG9iYWwoKSwKICAgICAganMuanMuc3RhdGVtZW50KCckZGVmZXJyZWRJbml0aWFsaXplcnNHbG9iYWwuY3VycmVudCA9ICMnLCBjb2RlKQogICAgXSk7CgogICAgb3V0cHV0LmFkZEJ1ZmZlcihqcy5jcmVhdGVDb2RlQnVmZmVyKAogICAgICAgIHByb2dyYW0sIGNvbXBpbGVyLm9wdGlvbnMsIGJhY2tlbmQuc291cmNlSW5mb3JtYXRpb25TdHJhdGVneSwKICAgICAgICBtb25pdG9yOiBjb21waWxlci5kdW1wSW5mb1Rhc2spKTsKCiAgICAvLyBNYWtlIGEgdW5pcXVlIGhhc2ggb2YgdGhlIGNvZGUgKGJlZm9yZSB0aGUgc291cmNlbWFwcyBhcmUgYWRkZWQpCiAgICAvLyBUaGlzIHdpbGwgYmUgdXNlZCB0byByZXRyaWV2ZSB0aGUgaW5pdGlhbGl6aW5nIGZ1bmN0aW9uIGZyb20gdGhlIGdsb2JhbAogICAgLy8gdmFyaWFibGUuCiAgICBTdHJpbmcgaGFzaCA9IGhhc2hlci5nZXRIYXNoKCk7CgogICAgLy8gTm93IHdlIGNvcHkgdGhlIGRlZmVycmVkSW5pdGlhbGl6ZXIuY3VycmVudCBpbnRvIGl0cyBjb3JyZWN0IGhhc2guCiAgICBvdXRwdXQuYWRkKCdcbiR7ZGVmZXJyZWRJbml0aWFsaXplcnNHbG9iYWx9WyIkaGFzaCJdID0gJwogICAgICAgICcke2RlZmVycmVkSW5pdGlhbGl6ZXJzR2xvYmFsfS5jdXJyZW50Jyk7CgogICAgaWYgKHNob3VsZEdlbmVyYXRlU291cmNlTWFwKSB7CiAgICAgIHRhc2subWVhc3VyZVN1YnRhc2soJ3NvdXJjZS1tYXBzJywgKCkgewogICAgICAgIFVyaSBtYXBVcmksIHBhcnRVcmk7CiAgICAgICAgVXJpIHNvdXJjZU1hcFVyaSA9IGNvbXBpbGVyLm9wdGlvbnMuc291cmNlTWFwVXJpOwogICAgICAgIFVyaSBvdXRwdXRVcmkgPSBjb21waWxlci5vcHRpb25zLm91dHB1dFVyaTsKICAgICAgICBTdHJpbmcgcGFydE5hbWUgPSAiJGh1bmtQcmVmaXguJHBhcnRFeHRlbnNpb24iOwogICAgICAgIFN0cmluZyBodW5rRmlsZU5hbWUgPSAiJGh1bmtQcmVmaXguJGRlZmVycmVkRXh0ZW5zaW9uIjsKCiAgICAgICAgaWYgKHNvdXJjZU1hcFVyaSAhPSBudWxsKSB7CiAgICAgICAgICBTdHJpbmcgbWFwRmlsZU5hbWUgPSBodW5rRmlsZU5hbWUgKyAiLm1hcCI7CiAgICAgICAgICBMaXN0PFN0cmluZz4gbWFwU2VnbWVudHMgPSBzb3VyY2VNYXBVcmkucGF0aFNlZ21lbnRzLnRvTGlzdCgpOwogICAgICAgICAgbWFwU2VnbWVudHNbbWFwU2VnbWVudHMubGVuZ3RoIC0gMV0gPSBtYXBGaWxlTmFtZTsKICAgICAgICAgIG1hcFVyaSA9CiAgICAgICAgICAgICAgY29tcGlsZXIub3B0aW9ucy5zb3VyY2VNYXBVcmkucmVwbGFjZShwYXRoU2VnbWVudHM6IG1hcFNlZ21lbnRzKTsKICAgICAgICB9CgogICAgICAgIGlmIChvdXRwdXRVcmkgIT0gbnVsbCkgewogICAgICAgICAgTGlzdDxTdHJpbmc+IHBhcnRTZWdtZW50cyA9IG91dHB1dFVyaS5wYXRoU2VnbWVudHMudG9MaXN0KCk7CiAgICAgICAgICBwYXJ0U2VnbWVudHNbcGFydFNlZ21lbnRzLmxlbmd0aCAtIDFdID0gaHVua0ZpbGVOYW1lOwogICAgICAgICAgcGFydFVyaSA9CiAgICAgICAgICAgICAgY29tcGlsZXIub3B0aW9ucy5vdXRwdXRVcmkucmVwbGFjZShwYXRoU2VnbWVudHM6IHBhcnRTZWdtZW50cyk7CiAgICAgICAgfQoKICAgICAgICBvdXRwdXQuYWRkKFNvdXJjZU1hcEJ1aWxkZXIuZ2VuZXJhdGVTb3VyY2VNYXBUYWcobWFwVXJpLCBwYXJ0VXJpKSk7CiAgICAgICAgb3V0cHV0LmNsb3NlKCk7CiAgICAgICAgU291cmNlTWFwQnVpbGRlci5vdXRwdXRTb3VyY2VNYXAob3V0cHV0LCBsb2NhdGlvbkNvbGxlY3Rvciwge30sIHt9LAogICAgICAgICAgICBwYXJ0TmFtZSwgbWFwVXJpLCBwYXJ0VXJpLCBjb21waWxlci5vdXRwdXRQcm92aWRlcik7CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgb3V0cHV0LmNsb3NlKCk7CiAgICB9CgogICAgcmV0dXJuIGhhc2g7CiAgfQoKICAvLy8gV3JpdGVzIGEgbWFwcGluZyBmcm9tIGxpYnJhcnktbmFtZSB0byBodW5rIGZpbGVzLgogIC8vLwogIC8vLyBUaGUgb3V0cHV0IGlzIHdyaXR0ZW4gaW50byBhIHNlcGFyYXRlIGZpbGUgdGhhdCBjYW4gYmUgdXNlZCBieSBvdXRzaWRlCiAgLy8vIHRvb2xzLgogIHZvaWQgd3JpdGVEZWZlcnJlZE1hcCgpIHsKICAgIE1hcDxTdHJpbmcsIGR5bmFtaWM+IG1hcHBpbmcgPSB7fTsKICAgIC8vIEpzb24gZG9lcyBub3Qgc3VwcG9ydCBjb21tZW50cywgc28gd2UgZW1iZWQgdGhlIGV4cGxhbmF0aW9uIGluIHRoZQogICAgLy8gZGF0YS4KICAgIG1hcHBpbmdbIl9jb21tZW50Il0gPSAiVGhpcyBtYXBwaW5nIHNob3dzIHdoaWNoIGNvbXBpbGVkIGAuanNgIGZpbGVzIGFyZSAiCiAgICAgICAgIm5lZWRlZCBmb3IgYSBnaXZlbiBkZWZlcnJlZCBsaWJyYXJ5IGltcG9ydC4iOwogICAgbWFwcGluZy5hZGRBbGwoX2Nsb3NlZFdvcmxkLm91dHB1dFVuaXREYXRhLmNvbXB1dGVEZWZlcnJlZE1hcCgKICAgICAgICBjb21waWxlci5vcHRpb25zLCBfY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50LAogICAgICAgIG9taXR0ZWRVbml0czoKICAgICAgICAgICAgb21pdHRlZEZyYWdtZW50cy5tYXAoKGZyYWdlbW50KSA9PiBmcmFnZW1udC5vdXRwdXRVbml0KS50b1NldCgpKSk7CiAgICBjb21waWxlci5vdXRwdXRQcm92aWRlci5jcmVhdGVPdXRwdXRTaW5rKAogICAgICAgIGNvbXBpbGVyLm9wdGlvbnMuZGVmZXJyZWRNYXBVcmkucGF0aCwgJycsIE91dHB1dFR5cGUuZGVmZXJyZWRNYXApCiAgICAgIC4uYWRkKGNvbnN0IEpzb25FbmNvZGVyLndpdGhJbmRlbnQoIiAgIikuY29udmVydChtYXBwaW5nKSkKICAgICAgLi5jbG9zZSgpOwogIH0KfQqBsQBOTjwBOgEoIAE3CR4gHB4cIB0dGBMTHhcSJCEPAT4BJRwsJUI5JyskQUEhKkZJGyQ6GjBEGCUBHgEVGxUeIyUmIywBOzYBKgE1AVAzKgEuNQE5AVE+OzAaJSYeJSQOKCAEATgBPS8vBAE+PgQBPUQbBAFDPjczEgQBPjtODj09LQFOTC4nBgFNK0waAUgsBAFGHCwnCAQBQRw2RAYBTyY0LgYYTAQBJTkvRAE7SAE7HEkBRQE7HENJLSI4DygIBgE1PyMBTQFMTzABLzcBTxUxPAEuOS48ATYoTwYBMxoGASZBBAFHIi4qMB5OTDMqBkpFBAE2BkwVBkA4PDMBTEQIARcEATIcKD4/BAE3BT9DGCkyIy41RwoGATJLHioBKhonSQsIAS5GKgEjLj5JCgYBGAEjLioYHzEzECsoJgoGBAE3BSsFP1AzIiEBKSMuNTAKBgExAS4gURoBJgFPF09MLAc+RAEqGihHCAEqRioBSE8RJAFKPTIBIy4dOjQ4QAEkNkk9E1AKASFHQBROCgFMGExBCg0WBgERBAE4Bk0NHCdKDU83QzsWTy5KQREEAgFCcGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9zdGFydHVwX2VtaXR0ZXIvbW9kZWxfZW1pdHRlci5kYXJ0TnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2VtaXR0ZXIvc3RhcnR1cF9lbWl0dGVyL2ZyYWdtZW50X2VtaXR0ZXIuZGFydMABKBsvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0MmpzLmpzX2VtaXR0ZXIuc3RhcnR1cF9lbWl0dGVyLm1vZGVsX2VtaXR0ZXI7CgovLy8gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgc3RvcmVzIHRoZSB0ZWFyLW9mZiBnZXR0ZXIgb24gYSBzdGF0aWMKLy8vIGZ1bmN0aW9uLgovLy8KLy8vIFRoaXMgcHJvcGVydHkgaXMgb25seSB1c2VkIHdoZW4gaXNvbGF0ZXMgYXJlIHVzZWQuCi8vLwovLy8gV2hlbiBzZXJpYWxpemluZyBzdGF0aWMgZnVuY3Rpb25zIHdlIHRyYW5zbWl0IHRoZQovLy8gbmFtZSBvZiB0aGUgc3RhdGljIGZ1bmN0aW9uLCBidXQgbm90IHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbidzIGdldHRlci4gV2UKLy8vIHN0b3JlIHRoZSBnZXR0ZXItZnVuY3Rpb24gb24gdGhlIHN0YXRpYyBmdW5jdGlvbiBpdHNlbGYsIHdoaWNoIGFsbG93cyB1cyB0bwovLy8gZmluZCBpdCBlYXNpbHkuCmNvbnN0IFN0cmluZyB0ZWFyT2ZmUHJvcGVydHlOYW1lID0gcickdGVhck9mZic7CgovLy8gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgc3RvcmVzIHRoZSBsaXN0IG9mIGZpZWxkcyBvbiBhIGNvbnN0cnVjdG9yLgovLy8KLy8vIFRoaXMgcHJvcGVydHkgaXMgb25seSB1c2VkIHdoZW4gaXNvbGF0ZXMgYXJlIHVzZWQuCi8vLwovLy8gV2hlbiBzZXJpYWxpemluZyBvYmplY3RzIHdlIGV4dHJhY3QgYWxsIGZpZWxkcyBmcm9tIGFueSBnaXZlbiBvYmplY3QuCi8vLyBXZSBleHRyYWN0IHRoZSBuYW1lcyBvZiBhbGwgZmllbGRzIGZyb20gYSBmcmVzaCBlbXB0eSBvYmplY3QuIFRoaXMgbGlzdAovLy8gaXMgY2FjaGVkIG9uIHRoZSBjb25zdHJ1Y3RvciBpbiB0aGlzIHByb3BlcnR5IHRvIHRvIGF2b2lkIHRvbyBtYW55Ci8vLyBhbGxvY2F0aW9ucy4KY29uc3QgU3RyaW5nIGNhY2hlZENsYXNzRmllbGROYW1lcyA9IHInJGNhY2hlZEZpZWxkTmFtZXMnOwoKLy8vIFRoZSBmYXN0IHN0YXJ0dXAgZW1pdHRlcidzIGdvYWwgaXMgdG8gbWluaW1pemUgdGhlIGFtb3VudCBvZiB3b3JrIHRoYXQgdGhlCi8vLyBKYXZhU2NyaXB0IGVuZ2luZSBoYXMgdG8gZG8gYmVmb3JlIGl0IGNhbiBzdGFydCBydW5uaW5nIHVzZXIgY29kZS4KLy8vCi8vLyBXaGVuZXZlciBwb3NzaWJsZSwgdGhlIGVtaXR0ZXIgdXNlcyBvYmplY3QgbGl0ZXJhbHMgaW5zdGVhZCBvZiB1cGRhdGluZwovLy8gb2JqZWN0cy4KLy8vCi8vLyBFeGFtcGxlOgovLy8KLy8vICAgICAvLyBIb2xkZXJzIGFyZSBpbml0aWFsaXplZCBkaXJlY3RseSB3aXRoIHRoZSBjbGFzc2VzIGFuZCBzdGF0aWMKLy8vICAgICAvLyBmdW5jdGlvbnMuCi8vLyAgICAgdmFyIEEgPSB7IFBvaW50OiBmdW5jdGlvbiBQb2ludCh4LCB5KSB7IHRoaXMueCA9IHg7IHRoaXMueSA9IHkgfSwKLy8vICAgICAgICAgICAgICAgc29tZVN0YXRpY0Z1bmN0aW9uOiBmdW5jdGlvbiBzb21lU3RhdGljRnVuY3Rpb24oKSB7IC4uLiB9IH07Ci8vLwovLy8gICAgIC8vIENsYXNzLWJlaGF2aW9yIGlzIGVtaXR0ZWQgaW4gYSBwcm90b3R5cGUgb2JqZWN0IHRoYXQgaXMgZGlyZWN0bHkKLy8vICAgICAvLyBhc3NpZ25lZDoKLy8vICAgICBBLlBvaW50LnByb3RvdHlwZSA9IHsgZGlzdGFuY2VUbzogZnVuY3Rpb24ob3RoZXIpIHsgLi4uIH0gfTsKLy8vCi8vLyAgICAgLy8gSW5oZXJpdGFuY2UgaXMgYWNoaWV2ZWQgYnkgdXBkYXRpbmcgdGhlIHByb3RvdHlwZSBvYmplY3RzIChoaWRkZW4gaW4KLy8vICAgICAvLyBhIGhlbHBlciBmdW5jdGlvbik6Ci8vLyAgICAgQS5Qb2ludC5wcm90b3R5cGUuX19wcm90b19fID0gSC5PYmplY3QucHJvdG90eXBlOwovLy8KLy8vIFRoZSBlbWl0dGVyIGRvZXNuJ3QgdHJ5IHRvIGJlIGNsZXZlciBhbmQgZW1pdHMgZXZlcnl0aGluZyBiZWZvcmVoYW5kLiBUaGlzCi8vLyBpbmNyZWFzZXMgdGhlIG91dHB1dCBzaXplLCBidXQgaW1wcm92ZXMgcGVyZm9ybWFuY2UuCi8vLwovLyBUaGUgY29kZSByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBhbGwgRGFydCBjb2RlIGlzIGluc2lkZSBob2xkZXJzLiBBcyBzdWNoCi8vIHdlIGNhbiB1c2UgImdsb2JhbCIgbmFtZXMgaG93ZXZlciB3ZSB3YW50LiBBcyBsb25nIGFzIHdlIGRvbid0IHNoYWRvdwovLyBKYXZhU2NyaXB0IHZhcmlhYmxlcyAobGlrZSBgQXJyYXlgKSB3ZSBhcmUgZnJlZSB0byBjaG9zZSB3aGF0ZXZlciB2YXJpYWJsZQovLyBuYW1lcyB3ZSB3YW50LiBGdXJ0aGVybW9yZSwgdGhlIHByZXR0eS1wcmludGVyIG1pbmlmaWVzIGxvY2FsIHZhcmlhYmxlcywgdGh1cwovLyByZWR1Y2luZyB0aGVpciBzaXplLgpjb25zdCBTdHJpbmcgbWFpbkJvaWxlcnBsYXRlID0gJycnCihmdW5jdGlvbiBkYXJ0UHJvZ3JhbSgpIHsKLy8gQ29waWVzIHRoZSBvd24gcHJvcGVydGllcyBmcm9tIFtmcm9tXSB0byBbdG9dLgpmdW5jdGlvbiBjb3B5UHJvcGVydGllcyhmcm9tLCB0bykgewogIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZnJvbSk7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIga2V5ID0ga2V5c1tpXTsKICAgIHRvW2tleV0gPSBmcm9tW2tleV07CiAgfQp9CgovLyBPbmx5IHVzZSBkaXJlY3QgcHJvdG8gYWNjZXNzIHRvIGNvbnN0cnVjdCB0aGUgcHJvdG90eXBlIGNoYWluIChpbnN0ZWFkIG9mCi8vIGNvcHlpbmcgcHJvcGVydGllcykgb24gcGxhdGZvcm1zIHdoZXJlIHdlIGtub3cgaXQgd29ya3Mgd2VsbCAoQ2hyb21lIC8gZDgpLgp2YXIgc3VwcG9ydHNEaXJlY3RQcm90b0FjY2VzcyA9ICNkaXJlY3RBY2Nlc3NUZXN0RXhwcmVzc2lvbjsKCi8vIFNldHMgdGhlIG5hbWUgcHJvcGVydHkgb2YgZnVuY3Rpb25zLCBpZiB0aGUgSlMgZW5naW5lIGRvZXNuJ3Qgc2V0IHRoZSBuYW1lCi8vIGl0c2VsZi4KLy8gQXMgb2YgMjAxOCBvbmx5IElFMTEgZG9lc24ndCBzZXQgdGhlIG5hbWUuCmZ1bmN0aW9uIHNldEZ1bmN0aW9uTmFtZXNJZk5lY2Vzc2FyeShob2xkZXJzKSB7CiAgZnVuY3Rpb24gdCgpe307CiAgaWYgKHR5cGVvZiB0Lm5hbWUgPT0gInN0cmluZyIpIHJldHVybjsKCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBob2xkZXJzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgaG9sZGVyID0gaG9sZGVyc1tpXTsKICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoaG9sZGVyKTsKICAgIGZvciAodmFyIGogPSAwOyBqIDwga2V5cy5sZW5ndGg7IGorKykgewogICAgICB2YXIga2V5ID0ga2V5c1tqXTsKICAgICAgdmFyIGYgPSBob2xkZXJba2V5XTsKICAgICAgaWYgKHR5cGVvZiBmID09ICdmdW5jdGlvbicpIGYubmFtZSA9IGtleTsKICAgIH0KICB9Cn0KCi8vIE1ha2VzIFtjbHNdIGluaGVyaXQgZnJvbSBbc3VwXS4KLy8gT24gQ2hyb21lLCBGaXJlZm94IGFuZCByZWNlbnQgSUVzIHRoaXMgaGFwcGVucyBieSB1cGRhdGluZyB0aGUgaW50ZXJuYWwKLy8gcHJvdG8tcHJvcGVydHkgb2YgdGhlIGNsYXNzZXMgJ3Byb3RvdHlwZScgZmllbGQuCi8vIE9sZGVyIElFcyB1c2UgYE9iamVjdC5jcmVhdGVgIGFuZCBjb3B5IG92ZXIgdGhlIHByb3BlcnRpZXMuCmZ1bmN0aW9uIGluaGVyaXQoY2xzLCBzdXApIHsKICAvLyBOb3RlIHRoYXQgUlRJIG5lZWRzIGNscy5uYW1lLCBidXQgd2UgZG9uJ3QgbmVlZCB0byBzZXQgaXQgYW55bW9yZS4KICBjbHMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY2xzOwogIGNscy5wcm90b3R5cGVbI29wZXJhdG9ySXNQcmVmaXggKyBjbHMubmFtZV0gPSBjbHM7CgogIC8vIFRoZSBzdXBlcmNsYXNzIGlzIG9ubHkgbnVsbCBmb3IgdGhlIERhcnQgT2JqZWN0LgogIGlmIChzdXAgIT0gbnVsbCkgewogICAgaWYgKHN1cHBvcnRzRGlyZWN0UHJvdG9BY2Nlc3MpIHsKICAgICAgLy8gRmlyZWZveCBkb2Vzbid0IGxpa2UgdG8gdXBkYXRlIHRoZSBwcm90b3R5cGVzLCBidXQgd2hlbiBzZXR0aW5nIHVwCiAgICAgIC8vIHRoZSBoaWVyYXJjaHkgY2hhaW4gaXQncyBvay4KICAgICAgY2xzLnByb3RvdHlwZS5fX3Byb3RvX18gPSBzdXAucHJvdG90eXBlOwogICAgICByZXR1cm47CiAgICB9CiAgICB2YXIgY2xzUHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXAucHJvdG90eXBlKTsKICAgIGNvcHlQcm9wZXJ0aWVzKGNscy5wcm90b3R5cGUsIGNsc1Byb3RvdHlwZSk7CiAgICBjbHMucHJvdG90eXBlID0gY2xzUHJvdG90eXBlOwogIH0KfQoKLy8gQmF0Y2hlZCB2ZXJzaW9uIG9mIFtpbmhlcml0XSBmb3IgbXVsdGlwbGUgY2xhc3NlcyBmcm9tIG9uZSBzdXBlcmNsYXNzLgpmdW5jdGlvbiBpbmhlcml0TWFueShzdXAsIGNsYXNzZXMpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsKICAgIGluaGVyaXQoY2xhc3Nlc1tpXSwgc3VwKTsKICB9Cn0KCi8vIE1peGVzIGluIHRoZSBwcm9wZXJ0aWVzIG9mIFttaXhpbl0gaW50byBbY2xzXS4KZnVuY3Rpb24gbWl4aW4oY2xzLCBtaXhpbikgewogIGNvcHlQcm9wZXJ0aWVzKG1peGluLnByb3RvdHlwZSwgY2xzLnByb3RvdHlwZSk7CiAgY2xzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNsczsKfQoKLy8gQ3JlYXRlcyBhIGxhenkgZmllbGQuCi8vCi8vIEEgbGF6eSBmaWVsZCBoYXMgYSBzdG9yYWdlIGVudHJ5LCBbbmFtZV0sIHdoaWNoIGhvbGRzIHRoZSB2YWx1ZSwgYW5kIGEKLy8gZ2V0dGVyIChbZ2V0dGVyTmFtZV0pIHRvIGFjY2VzcyB0aGUgZmllbGQuIElmIHRoZSBmaWVsZCB3YXNuJ3Qgc2V0IGJlZm9yZQovLyB0aGUgZmlyc3QgYWNjZXNzLCBpdCBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSBbaW5pdGlhbGl6ZXJdLgpmdW5jdGlvbiBsYXp5KGhvbGRlciwgbmFtZSwgZ2V0dGVyTmFtZSwgaW5pdGlhbGl6ZXIpIHsKICB2YXIgdW5pbml0aWFsaXplZFNlbnRpbmVsID0gaG9sZGVyOwogIGhvbGRlcltuYW1lXSA9IHVuaW5pdGlhbGl6ZWRTZW50aW5lbDsKICBob2xkZXJbZ2V0dGVyTmFtZV0gPSBmdW5jdGlvbigpIHsKICAgIGhvbGRlcltnZXR0ZXJOYW1lXSA9IGZ1bmN0aW9uKCkgeyAjY3ljbGljVGhyb3cobmFtZSkgfTsKICAgIHZhciByZXN1bHQ7CiAgICB2YXIgc2VudGluZWxJblByb2dyZXNzID0gaW5pdGlhbGl6ZXI7CiAgICB0cnkgewogICAgICBpZiAoaG9sZGVyW25hbWVdID09PSB1bmluaXRpYWxpemVkU2VudGluZWwpIHsKICAgICAgICByZXN1bHQgPSBob2xkZXJbbmFtZV0gPSBzZW50aW5lbEluUHJvZ3Jlc3M7CiAgICAgICAgcmVzdWx0ID0gaG9sZGVyW25hbWVdID0gaW5pdGlhbGl6ZXIoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXN1bHQgPSBob2xkZXJbbmFtZV07CiAgICAgIH0KICAgIH0gZmluYWxseSB7CiAgICAgIC8vIFVzZSB0cnktZmluYWxseSwgbm90IHRyeS1jYXRjaC90aHJvdyBhcyBpdCBkZXN0cm95cyB0aGUgc3RhY2sKICAgICAgLy8gdHJhY2UuCiAgICAgIGlmIChyZXN1bHQgPT09IHNlbnRpbmVsSW5Qcm9ncmVzcykgewogICAgICAgIC8vIFRoZSBsYXp5IHN0YXRpYyAoaG9sZGVyW25hbWVdKSBtaWdodCBoYXZlIGJlZW4gc2V0IHRvIGEgZGlmZmVyZW50CiAgICAgICAgLy8gdmFsdWUuIEFjY29yZGluZyB0byBzcGVjIHdlIHN0aWxsIGhhdmUgdG8gcmVzZXQgaXQgdG8gbnVsbCwgaWYKICAgICAgICAvLyB0aGUgaW5pdGlhbGl6YXRpb24gZmFpbGVkLgogICAgICAgIGhvbGRlcltuYW1lXSA9IG51bGw7CiAgICAgIH0KICAgICAgLy8gVE9ETyhmbG9pdHNjaCk6IGZvciBwZXJmb3JtYW5jZSByZWFzb25zIHRoZSBmdW5jdGlvbiBzaG91bGQgcHJvYmFibHkKICAgICAgLy8gYmUgdW5pcXVlIGZvciBlYWNoIHN0YXRpYy4KICAgICAgaG9sZGVyW2dldHRlck5hbWVdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzW25hbWVdOyB9OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9Owp9CgovLyBHaXZlbiBhIGxpc3QsIG1hcmtzIGl0IGFzIGNvbnN0YW50LgovLwovLyBUaGUgcnVudGltZSBlbnN1cmVzIHRoYXQgY29uc3QtbGlzdHMgY2Fubm90IGJlIG1vZGlmaWVkLgpmdW5jdGlvbiBtYWtlQ29uc3RMaXN0KGxpc3QpIHsKICAvLyBCeSBhc3NpZ25pbmcgYSBmdW5jdGlvbiB0byB0aGUgcHJvcGVydGllcyB0aGV5IGJlY29tZSBwYXJ0IG9mIHRoZQogIC8vIGhpZGRlbiBjbGFzcy4gVGhlIGFjdHVhbCB2YWx1ZXMgb2YgdGhlIGZpZWxkcyBkb24ndCBtYXR0ZXIsIHNpbmNlIHdlCiAgLy8gb25seSBjaGVjayBpZiB0aGV5IGV4aXN0LgogIGxpc3QuaW1tdXRhYmxlXCRsaXN0ID0gQXJyYXk7CiAgbGlzdC5maXhlZFwkbGVuZ3RoID0gQXJyYXk7CiAgcmV0dXJuIGxpc3Q7Cn0KCmZ1bmN0aW9uIGNvbnZlcnRUb0Zhc3RPYmplY3QocHJvcGVydGllcykgewogIC8vIENyZWF0ZSBhbiBpbnN0YW5jZSB0aGF0IHVzZXMgJ3Byb3BlcnRpZXMnIGFzIHByb3RvdHlwZS4gVGhpcyBzaG91bGQKICAvLyBtYWtlICdwcm9wZXJ0aWVzJyBhIGZhc3Qgb2JqZWN0LgogIGZ1bmN0aW9uIHQoKSB7fQogIHQucHJvdG90eXBlID0gcHJvcGVydGllczsKICBuZXcgdCgpOwogIHJldHVybiBwcm9wZXJ0aWVzOwp9CgpmdW5jdGlvbiBjb252ZXJ0QWxsVG9GYXN0T2JqZWN0KGFycmF5T2ZPYmplY3RzKSB7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheU9mT2JqZWN0cy5sZW5ndGg7ICsraSkgewogICAgY29udmVydFRvRmFzdE9iamVjdChhcnJheU9mT2JqZWN0c1tpXSk7CiAgfQp9CgovLyBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgYnkgdGhlIHRlYXJPZmZDb2RlIHRvIGd1YXJhbnRlZSB1bmlxdWUgZnVuY3Rpb25zIHBlcgovLyB0ZWFyLW9mZnMuCnZhciBmdW5jdGlvbkNvdW50ZXIgPSAwOwojdGVhck9mZkNvZGU7CgovLyBFYWNoIGRlZmVycmVkIGh1bmsgY29tZXMgd2l0aCBpdHMgb3duIHR5cGVzIHdoaWNoIGFyZSBhZGRlZCB0byB0aGUgZW5kCi8vIG9mIHRoZSB0eXBlcy1hcnJheS4KLy8gVGhlIGBmdW5UeXBlc2AgcGFzc2VkIHRvIHRoZSBgaW5zdGFsbFRlYXJPZmZgIGZ1bmN0aW9uIGJlbG93IGlzIHJlbGF0aXZlIHRvCi8vIHRoZSBodW5rIHRoZSBmdW5jdGlvbiBjb21lcyBmcm9tLiBUaGUgYHR5cGVzT2Zmc2V0YCB2YXJpYWJsZSBlbmNvZGVzIHRoZQovLyBvZmZzZXQgYXQgd2hpY2ggdGhlIG5ldyB0eXBlcyB3aWxsIGJlIGFkZGVkLgp2YXIgdHlwZXNPZmZzZXQgPSAwOwoKLy8gQWRhcHRzIHRoZSBzdG9yZWQgZGF0YSwgc28gaXQncyBzdWl0YWJsZSBmb3IgYSB0ZWFyT2ZmIGNhbGwuCi8vCi8vIFN0b3JlcyB0aGUgdGVhci1vZmYgZ2V0dGVyLWZ1bmN0aW9uIGluIHRoZSBbY29udGFpbmVyXSdzIFtnZXR0ZXJOYW1lXQovLyBwcm9wZXJ0eS4KLy8KLy8gVGhlIFtjb250YWluZXJdIGlzIGVpdGhlciBhIGNsYXNzICh0aGF0IGlzLCBpdHMgcHJvdG90eXBlKSwgb3IgdGhlIGhvbGRlciBmb3IKLy8gc3RhdGljIGZ1bmN0aW9ucy4KLy8KLy8gVGhlIGFyZ3VtZW50IFtmdW5zT3JOYW1lc10gaXMgYW4gYXJyYXkgb2Ygc3RyaW5ncyBvciBmdW5jdGlvbnMuIElmIGl0IGlzIGEKLy8gbmFtZSwgdGhlbiB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGZldGNoZWQgZnJvbSB0aGUgY29udGFpbmVyLiBUaGUgZmlyc3QKLy8gZW50cnkgaW4gdGhhdCBhcnJheSAqbXVzdCogYmUgYSBzdHJpbmcuCi8vCi8vIFRPRE8oZmxvaXRzY2gpOiBDaGFuZ2UgdGVhck9mZkNvZGUgdG8gYWNjZXB0IHRoZSBkYXRhIGRpcmVjdGx5LCBvciBjcmVhdGUgYQovLyBkaWZmZXJlbnQgdGVhck9mZkNvZGU/CmZ1bmN0aW9uIGluc3RhbGxUZWFyT2ZmKAogICAgY29udGFpbmVyLCBnZXR0ZXJOYW1lLCBpc1N0YXRpYywgaXNJbnRlcmNlcHRlZCwgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwKICAgIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcywgY2FsbE5hbWVzLCBmdW5zT3JOYW1lcywgZnVuVHlwZSwgYXBwbHlJbmRleCkgewogIC8vIEEgZnVuY3Rpb24gY2FuIGhhdmUgc2V2ZXJhbCBzdHVicyAoZm9yIGV4YW1wbGUgdG8gZmlsbCBpbiBvcHRpb25hbAogIC8vIGFyZ3VtZW50cykuIFdlIGNvbGxlY3QgdGhlc2UgZnVuY3Rpb25zIGluIHRoZSBgZnVuc2AgYXJyYXkuCiAgdmFyIGZ1bnMgPSBbXTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGZ1bnNPck5hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgZnVuID0gZnVuc09yTmFtZXNbaV07CiAgICBpZiAoKHR5cGVvZiBmdW4pID09ICdzdHJpbmcnKSBmdW4gPSBjb250YWluZXJbZnVuXTsKICAgIGZ1bi4jY2FsbE5hbWUgPSBjYWxsTmFtZXNbaV07CiAgICBmdW5zLnB1c2goZnVuKTsKICB9CgogIC8vIFRoZSBtYWluIGZ1bmN0aW9uIHRvIHdoaWNoIGFsbCBzdHVicyByZWRpcmVjdC4KICB2YXIgZnVuID0gZnVuc1swXTsKCiAgZnVuWyNhcmd1bWVudENvdW50XSA9IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ7CiAgZnVuWyNkZWZhdWx0QXJndW1lbnRWYWx1ZXNdID0gb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzOwogIHZhciByZWZsZWN0aW9uSW5mbyA9IGZ1blR5cGU7CiAgaWYgKHR5cGVvZiByZWZsZWN0aW9uSW5mbyA9PSAibnVtYmVyIikgewogICAgLy8gVGhlIHJlZmxlY3Rpb25JbmZvIGNhbiBlaXRoZXIgYmUgYSBmdW5jdGlvbiwgb3IgYSBwb2ludGVyIGludG8gdGhlIHR5cGVzCiAgICAvLyB0YWJsZS4gSWYgaXQgcG9pbnRzIGludG8gdGhlIHR5cGVzLXRhYmxlIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBpbmRleCwKICAgIC8vIGluIGNhc2UgdGhlIHRlYXItb2ZmIGlzIHBhcnQgb2YgYSBkZWZlcnJlZCBodW5rLgogICAgcmVmbGVjdGlvbkluZm8gPSByZWZsZWN0aW9uSW5mbyArIHR5cGVzT2Zmc2V0OwogIH0KICB2YXIgbmFtZSA9IGZ1bnNPck5hbWVzWzBdOwogIGZ1bi4jc3R1Yk5hbWUgPSBuYW1lOwogIHZhciBnZXR0ZXJGdW5jdGlvbiA9CiAgICAgIHRlYXJPZmYoZnVucywgYXBwbHlJbmRleCB8fCAwLCByZWZsZWN0aW9uSW5mbywgaXNTdGF0aWMsIG5hbWUsIGlzSW50ZXJjZXB0ZWQpOwogIGNvbnRhaW5lcltnZXR0ZXJOYW1lXSA9IGdldHRlckZ1bmN0aW9uOwogIGlmIChpc1N0YXRpYykgewogICAgZnVuLiR0ZWFyT2ZmUHJvcGVydHlOYW1lID0gZ2V0dGVyRnVuY3Rpb247CiAgfQp9CgpmdW5jdGlvbiBpbnN0YWxsU3RhdGljVGVhck9mZigKICAgIGNvbnRhaW5lciwgZ2V0dGVyTmFtZSwKICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcywKICAgIGNhbGxOYW1lcywgZnVuc09yTmFtZXMsIGZ1blR5cGUsIGFwcGx5SW5kZXgpIHsKICAvLyBUT0RPKHNyYSk6IFNwZWNpYWxpemUgaW5zdGFsbFRlYXJPZmYgZm9yIHN0YXRpYyBtZXRob2RzLiBJdCBtaWdodCBiZQogIC8vIHBvc3NpYmxlIHRvIGhhbmRsZSBzb21lIHZlcnkgY29tbW9uIHNpbXBsZSBjYXNlcyBkaXJlY3RseS4KICByZXR1cm4gaW5zdGFsbFRlYXJPZmYoCiAgICAgIGNvbnRhaW5lciwgZ2V0dGVyTmFtZSwgdHJ1ZSwgZmFsc2UsCiAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcywKICAgICAgY2FsbE5hbWVzLCBmdW5zT3JOYW1lcywgZnVuVHlwZSwgYXBwbHlJbmRleCk7Cn0KCmZ1bmN0aW9uIGluc3RhbGxJbnN0YW5jZVRlYXJPZmYoCiAgICBjb250YWluZXIsIGdldHRlck5hbWUsIGlzSW50ZXJjZXB0ZWQsCiAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50LCBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMsCiAgICBjYWxsTmFtZXMsIGZ1bnNPck5hbWVzLCBmdW5UeXBlLCBhcHBseUluZGV4KSB7CiAgLy8gVE9ETyhzcmEpOiBTcGVjaWFsaXplIGluc3RhbGxUZWFyT2ZmIGZvciBpbnN0YW5jZSBtZXRob2RzLgogIHJldHVybiBpbnN0YWxsVGVhck9mZigKICAgICAgY29udGFpbmVyLCBnZXR0ZXJOYW1lLCBmYWxzZSwgaXNJbnRlcmNlcHRlZCwKICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwgb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzLAogICAgICBjYWxsTmFtZXMsIGZ1bnNPck5hbWVzLCBmdW5UeXBlLCBhcHBseUluZGV4KTsKfQoKLy8gSW5zdGVhZCBvZiBzZXR0aW5nIHRoZSBpbnRlcmNlcHRvciB0YWdzIGRpcmVjdGx5IHdlIHVzZSB0aGlzIHVwZGF0ZQovLyBmdW5jdGlvbi4gVGhpcyBtYWtlcyBpdCBlYXNpZXIgZm9yIGRlZmVycmVkIGZyYWdtZW50cyB0byBjb250cmlidXRlIHRvIHRoZQovLyBlbWJlZGRlZCBnbG9iYWwuCmZ1bmN0aW9uIHNldE9yVXBkYXRlSW50ZXJjZXB0b3JzQnlUYWcobmV3VGFncykgewogIHZhciB0YWdzID0gI2VtYmVkZGVkSW50ZXJjZXB0b3JUYWdzOwogIGlmICghdGFncykgewogICAgI2VtYmVkZGVkSW50ZXJjZXB0b3JUYWdzID0gbmV3VGFnczsKICAgIHJldHVybjsKICB9CiAgY29weVByb3BlcnRpZXMobmV3VGFncywgdGFncyk7Cn0KCi8vIEluc3RlYWQgb2Ygc2V0dGluZyB0aGUgbGVhZiB0YWdzIGRpcmVjdGx5IHdlIHVzZSB0aGlzIHVwZGF0ZQovLyBmdW5jdGlvbi4gVGhpcyBtYWtlcyBpdCBlYXNpZXIgZm9yIGRlZmVycmVkIGZyYWdtZW50cyB0byBjb250cmlidXRlIHRvIHRoZQovLyBlbWJlZGRlZCBnbG9iYWwuCmZ1bmN0aW9uIHNldE9yVXBkYXRlTGVhZlRhZ3MobmV3VGFncykgewogIHZhciB0YWdzID0gI2VtYmVkZGVkTGVhZlRhZ3M7CiAgaWYgKCF0YWdzKSB7CiAgICAjZW1iZWRkZWRMZWFmVGFncyA9IG5ld1RhZ3M7CiAgICByZXR1cm47CiAgfQogIGNvcHlQcm9wZXJ0aWVzKG5ld1RhZ3MsIHRhZ3MpOwp9CgovLyBVcGRhdGVzIHRoZSB0eXBlcyBlbWJlZGRlZCBnbG9iYWwuCmZ1bmN0aW9uIHVwZGF0ZVR5cGVzKG5ld1R5cGVzKSB7CiAgdmFyIHR5cGVzID0gI2VtYmVkZGVkVHlwZXM7CiAgdmFyIGxlbmd0aCA9IHR5cGVzLmxlbmd0aDsKICAvLyBUaGUgdGVhci1vZmYgZnVuY3Rpb24gdXNlcyBhbm90aGVyICd0eXBlc09mZnNldCcgdmFsdWUgY2FjaGVkIGluCiAgLy8gW2luaXRpYWxpemVEZWZlcnJlZEh1bmtdIHNvIFt1cGRhdGVUeXBlc10gY2FuIGJlIGNhbGxlZCBlaXRoZXIgYmVmb3JlIG9yCiAgLy8gYWZ0ZXIgdGhlIHRlYXJvZmZzIGhhdmUgYmVlbiBpbnN0YWxsZWQuCiAgdHlwZXMucHVzaC5hcHBseSh0eXBlcywgbmV3VHlwZXMpOwogIHJldHVybiBsZW5ndGg7Cn0KCi8vIFVwZGF0ZXMgdGhlIGdpdmVuIGhvbGRlciB3aXRoIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBbbmV3SG9sZGVyXS4KLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gYSBkZWZlcnJlZCBmcmFnbWVudCBpcyBpbml0aWFsaXplZC4KZnVuY3Rpb24gdXBkYXRlSG9sZGVyKGhvbGRlciwgbmV3SG9sZGVyKSB7CiAgY29weVByb3BlcnRpZXMobmV3SG9sZGVyLCBob2xkZXIpOwogIHJldHVybiBob2xkZXI7Cn0KCnZhciAjaHVua0hlbHBlcnMgPSAoZnVuY3Rpb24oKXsKICB2YXIgbWtJbnN0YW5jZSA9IGZ1bmN0aW9uKAogICAgICBpc0ludGVyY2VwdGVkLCByZXF1aXJlZFBhcmFtZXRlckNvdW50LCBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMsCiAgICAgIGNhbGxOYW1lcywgYXBwbHlJbmRleCkgewogICAgcmV0dXJuIGZ1bmN0aW9uKGNvbnRhaW5lciwgZ2V0dGVyTmFtZSwgbmFtZSwgZnVuVHlwZSkgewogICAgICByZXR1cm4gaW5zdGFsbEluc3RhbmNlVGVhck9mZigKICAgICAgICAgIGNvbnRhaW5lciwgZ2V0dGVyTmFtZSwgaXNJbnRlcmNlcHRlZCwKICAgICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcywKICAgICAgICAgIGNhbGxOYW1lcywgW25hbWVdLCBmdW5UeXBlLCBhcHBseUluZGV4KTsKICAgIH0KICB9LAoKICBta1N0YXRpYyA9IGZ1bmN0aW9uKAogICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50LCBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMsCiAgICAgIGNhbGxOYW1lcywgYXBwbHlJbmRleCkgewogICAgcmV0dXJuIGZ1bmN0aW9uKGNvbnRhaW5lciwgZ2V0dGVyTmFtZSwgbmFtZSwgZnVuVHlwZSkgewogICAgICByZXR1cm4gaW5zdGFsbFN0YXRpY1RlYXJPZmYoCiAgICAgICAgICBjb250YWluZXIsIGdldHRlck5hbWUsCiAgICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50LCBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMsCiAgICAgICAgICBjYWxsTmFtZXMsIFtuYW1lXSwgZnVuVHlwZSwgYXBwbHlJbmRleCk7CiAgICB9CiAgfTsKCiAgLy8gVE9ETyhzcmEpOiBNaW5pZnkgcHJvcGVydGllcyBvZiAnaHVua0hlbHBlcnMnLgogIHJldHVybiB7CiAgICBpbmhlcml0OiBpbmhlcml0LAogICAgaW5oZXJpdE1hbnk6IGluaGVyaXRNYW55LAogICAgbWl4aW46IG1peGluLAogICAgaW5zdGFsbFN0YXRpY1RlYXJPZmY6IGluc3RhbGxTdGF0aWNUZWFyT2ZmLAogICAgaW5zdGFsbEluc3RhbmNlVGVhck9mZjogaW5zdGFsbEluc3RhbmNlVGVhck9mZiwKCiAgICAgICAgLy8gVW5pbnRlcmNlcHRlZCBtZXRob2RzLgogICAgX2luc3RhbmNlXzB1OiBta0luc3RhbmNlKDAsIDAsIG51bGwsIFsjY2FsbDBzZWxlY3Rvcl0sIDApLAogICAgX2luc3RhbmNlXzF1OiBta0luc3RhbmNlKDAsIDEsIG51bGwsIFsjY2FsbDFzZWxlY3Rvcl0sIDApLAogICAgX2luc3RhbmNlXzJ1OiBta0luc3RhbmNlKDAsIDIsIG51bGwsIFsjY2FsbDJzZWxlY3Rvcl0sIDApLAoKICAgICAgICAvLyBJbnRlcmNlcHRlZCBtZXRob2RzLgogICAgX2luc3RhbmNlXzBpOiBta0luc3RhbmNlKDEsIDAsIG51bGwsIFsjY2FsbDBzZWxlY3Rvcl0sIDApLAogICAgX2luc3RhbmNlXzFpOiBta0luc3RhbmNlKDEsIDEsIG51bGwsIFsjY2FsbDFzZWxlY3Rvcl0sIDApLAogICAgX2luc3RhbmNlXzJpOiBta0luc3RhbmNlKDEsIDIsIG51bGwsIFsjY2FsbDJzZWxlY3Rvcl0sIDApLAoKICAgICAgICAvLyBTdGF0aWMgbWV0aG9kcy4KICAgIF9zdGF0aWNfMDogbWtTdGF0aWMoMCwgbnVsbCwgWyNjYWxsMHNlbGVjdG9yXSwgMCksCiAgICBfc3RhdGljXzE6IG1rU3RhdGljKDEsIG51bGwsIFsjY2FsbDFzZWxlY3Rvcl0sIDApLAogICAgX3N0YXRpY18yOiBta1N0YXRpYygyLCBudWxsLCBbI2NhbGwyc2VsZWN0b3JdLCAwKSwKCiAgICBtYWtlQ29uc3RMaXN0OiBtYWtlQ29uc3RMaXN0LAogICAgbGF6eTogbGF6eSwKICAgIHVwZGF0ZUhvbGRlcjogdXBkYXRlSG9sZGVyLAogICAgY29udmVydFRvRmFzdE9iamVjdDogY29udmVydFRvRmFzdE9iamVjdCwKICAgIHNldEZ1bmN0aW9uTmFtZXNJZk5lY2Vzc2FyeTogc2V0RnVuY3Rpb25OYW1lc0lmTmVjZXNzYXJ5LAogICAgdXBkYXRlVHlwZXM6IHVwZGF0ZVR5cGVzLAogICAgc2V0T3JVcGRhdGVJbnRlcmNlcHRvcnNCeVRhZzogc2V0T3JVcGRhdGVJbnRlcmNlcHRvcnNCeVRhZywKICAgIHNldE9yVXBkYXRlTGVhZlRhZ3M6IHNldE9yVXBkYXRlTGVhZlRhZ3MsCiAgfTsKfSkoKTsKCi8vIEV2ZXJ5IGRlZmVycmVkIGh1bmsgKGkuZS4gZnJhZ21lbnQpIGlzIGEgZnVuY3Rpb24gdGhhdCB3ZSBjYW4gaW52b2tlIHRvCi8vIGluaXRpYWxpemUgaXQuIEF0IHRoaXMgbW9tZW50IGl0IGNvbnRyaWJ1dGVzIGl0cyBkYXRhIHRvIHRoZSBtYWluIGh1bmsuCmZ1bmN0aW9uIGluaXRpYWxpemVEZWZlcnJlZEh1bmsoaHVuaykgewogIC8vIFVwZGF0ZSB0aGUgdHlwZXNPZmZzZXQgZm9yIHRoZSBuZXh0IGRlZmVycmVkIGxpYnJhcnkuCiAgdHlwZXNPZmZzZXQgPSAjZW1iZWRkZWRUeXBlcy5sZW5ndGg7CgogIC8vIFRPRE8oZmxvaXRzY2gpOiBleHRlbmQgbmF0aXZlcy4KICBodW5rKGh1bmtIZWxwZXJzLCAjZW1iZWRkZWRHbG9iYWxzT2JqZWN0LCBob2xkZXJzLCAjc3RhdGljU3RhdGUpOwp9CgovLyBSZXR1cm5zIHRoZSBnbG9iYWwgd2l0aCB0aGUgZ2l2ZW4gW25hbWVdLgpmdW5jdGlvbiBnZXRHbG9iYWxGcm9tTmFtZShuYW1lKSB7CiAgLy8gVE9ETyhmbG9pdHNjaCk6IHdlIGFyZSBydW5uaW5nIHRocm91Z2ggYWxsIGhvbGRlcnMuIFNpbmNlIG5lZ2F0aXZlCiAgLy8gbG9va3VwcyBhcmUgZXhwZW5zaXZlIHdlIG1pZ2h0IG5lZWQgdG8gaW1wcm92ZSB0aGlzLgogIC8vIFJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IGFsbCBuYW1lcyBhcmUgdW5pcXVlIGFjcm9zcyBhbGwgaG9sZGVycy4KICBmb3IgKHZhciBpID0gMDsgaSA8IGhvbGRlcnMubGVuZ3RoOyBpKyspIHsKICAgIC8vIFRoZSBjb25zdGFudCBob2xkZXIgcmV1c2VzIHRoZSBzYW1lIG5hbWVzLiBUaGVyZWZvcmUgd2UgbXVzdCBza2lwIGl0LgogICAgaWYgKGhvbGRlcnNbaV0gPT0gI2NvbnN0YW50SG9sZGVyUmVmZXJlbmNlKSBjb250aW51ZTsKICAgIC8vIFJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IGFsbCB2YXJpYWJsZXMgYXJlIHVuaXF1ZS4KICAgIGlmIChob2xkZXJzW2ldW25hbWVdKSByZXR1cm4gaG9sZGVyc1tpXVtuYW1lXTsKICB9Cn0KCmlmICgjaGFzU29mdERlZmVycmVkQ2xhc3NlcykgewogIC8vIExvYWRzIHRoZSBzb2Z0LWRlZmVycmVkIGNsYXNzZXMgYW5kIGluaXRpYWxpemVzIHRoZW0uCiAgLy8gVXBkYXRlcyB0aGUgcHJvdG90eXBlIG9mIHRoZSBnaXZlbiBvYmplY3QuCiAgZnVuY3Rpb24gc29mdERlZihvKSB7CiAgICBzb2Z0RGVmID0gZnVuY3Rpb24obykge307ICAvLyBSZXBsYWNlIG91cnNlbHZlcy4KICAgICNkZWZlcnJlZEdsb2JhbFsjc29mdElkXSgKICAgICAgICBob2xkZXJzLCAjZW1iZWRkZWRHbG9iYWxzT2JqZWN0LCAjc3RhdGljU3RhdGUsCiAgICAgICAgaHVua0hlbHBlcnMpOwogICAgaWYgKG8gIT0gbnVsbCkgewogICAgICAvLyBUT0RPKDI5NTc0KTogc2hvdWxkIHdlIGRvIHNvbWV0aGluZyBkaWZmZXJlbnQgZm9yIEZpcmVmb3g/CiAgICAgIC8vIElmIHdlIHJlY29tbWVuZCB0aGF0IHRoZSBwcm9ncmFtIHRyaWdnZXJzIHRoZSBsb2FkIGJ5IGl0c2VsZiBiZWZvcmUKICAgICAgLy8gY2xhc3NlcyBhcmUgbmVlZGVkLCB0aGVuIHRoaXMgbGluZSBzaG91bGQgcmFyZWx5IGJlIGhpdC4KICAgICAgLy8gQWxzbywgaXQgaXMgb25seSBoaXQgYXQgbW9zdCBvbmNlIChwZXIgc29mdC1kZWZlcnJlZCBjaHVuaykuCiAgICAgIG8uX19wcm90b19fID0gby5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7CiAgICB9CiAgfQp9CgppZiAoI2lzVHJhY2tpbmdBbGxvY2F0aW9ucykgewogIHZhciBhbGxvY2F0aW9ucyA9ICNkZWZlcnJlZEdsb2JhbFsnYWxsb2NhdGlvbnMnXSA9IHt9Owp9CgovLyBDcmVhdGVzIHRoZSBob2xkZXJzLgojaG9sZGVyczsKCi8vIElmIHRoZSBuYW1lIGlzIG5vdCBzZXQgb24gdGhlIGZ1bmN0aW9ucywgZG8gaXQgbm93LgpodW5rSGVscGVycy5zZXRGdW5jdGlvbk5hbWVzSWZOZWNlc3NhcnkoaG9sZGVycyk7CgovLyBUT0RPKGZsb2l0c2NoKTogd2Ugc2hvdWxkIGJ1aWxkIHRoaXMgb2JqZWN0IGFzIGEgbGl0ZXJhbC4KdmFyICNzdGF0aWNTdGF0ZURlY2xhcmF0aW9uID0ge307CgovLyBTZXRzIHRoZSBwcm90b3R5cGVzIG9mIGNsYXNzZXMuCiNwcm90b3R5cGVzOwovLyBTZXRzIGFsaWFzZXMgb2YgbWV0aG9kcyAob24gdGhlIHByb3RvdHlwZXMgb2YgY2xhc3NlcykuCiNhbGlhc2VzOwovLyBJbnN0YWxscyB0aGUgdGVhci1vZmZzIG9mIGZ1bmN0aW9ucy4KI3RlYXJPZmZzOwovLyBCdWlsZHMgdGhlIGluaGVyaXRhbmNlIHN0cnVjdHVyZS4KI2luaGVyaXRhbmNlOwoKLy8gSW5zdGFudGlhdGVzIGFsbCBjb25zdGFudHMuCiNjb25zdGFudHM7CgovLyBFbWl0cyB0aGUgZW1iZWRkZWQgZ2xvYmFscy4gRHVlIHRvIHR5cGUgY2hlY2tzIGluIGVhZ2VyIGluaXRpYWxpemVycyB0aGlzIGlzCi8vIG5lZWRlZCBiZWZvcmUgc3RhdGljIG5vbi1maW5hbCBmaWVsZHMgaW5pdGlhbGl6ZXJzLgojZW1iZWRkZWRHbG9iYWxzOwoKLy8gSW5pdGlhbGl6ZXMgdGhlIHN0YXRpYyBub24tZmluYWwgZmllbGRzICh3aXRoIHRoZWlyIGNvbnN0YW50IHZhbHVlcykuCiNzdGF0aWNOb25GaW5hbEZpZWxkczsKLy8gQ3JlYXRlcyBsYXp5IGdldHRlcnMgZm9yIHN0YXRpY3MgdGhhdCBtdXN0IHJ1biBpbml0aWFsaXplcnMgb24gZmlyc3QgYWNjZXNzLgojbGF6eVN0YXRpY3M7CgovLyBTZXRzIHVwIHRoZSBuYXRpdmUgc3VwcG9ydC4KLy8gTmF0aXZlLXN1cHBvcnQgdXNlcyBzZXRPclVwZGF0ZUludGVyY2VwdG9yc0J5VGFnIGFuZCBzZXRPclVwZGF0ZUxlYWZUYWdzLgojbmF0aXZlU3VwcG9ydDsKCi8vIFNldHMgdXAgdGhlIGpzLWludGVyb3Agc3VwcG9ydC4KI2pzSW50ZXJvcFN1cHBvcnQ7CgovLyBFbnN1cmUgaG9sZGVycyBhcmUgaW4gZmFzdCBtb2RlLCBub3cgd2UgaGF2ZSBmaW5pc2hlZCBhZGRpbmcgdGhpbmdzLgpjb252ZXJ0QWxsVG9GYXN0T2JqZWN0KGhvbGRlcnMpOwpjb252ZXJ0VG9GYXN0T2JqZWN0KCNzdGF0aWNTdGF0ZSk7CgovLyBJbnZva2VzIG1haW4gKG1ha2luZyBzdXJlIHRoYXQgaXQgcmVjb3JkcyB0aGUgJ2N1cnJlbnQtc2NyaXB0JyB2YWx1ZSkuCiNpbnZva2VNYWluOwp9KSgpCicnJzsKCi8vLyBBbiBleHByZXNzaW9uIHRoYXQgcmV0dXJucyBgdHJ1ZWAgaWYgYF9fcHJvdG9fX2AgY2FuIGJlIGFzc2lnbmVkIHRvIHN0aXRjaAovLy8gdG9nZXRoZXIgYSBwcm90b3R5cGUgY2hhaW4sIGFuZCB0aGUgcGVyZm9ybWFuY2UgaXMgZ29vZC4KY29uc3QgU3RyaW5nIGRpcmVjdEFjY2Vzc1Rlc3RFeHByZXNzaW9uID0gcicnJwogIChmdW5jdGlvbiAoKSB7CiAgICB2YXIgY2xzID0gZnVuY3Rpb24gKCkge307CiAgICBjbHMucHJvdG90eXBlID0geydwJzoge319OwogICAgdmFyIG9iamVjdCA9IG5ldyBjbHMoKTsKICAgIGlmICghKG9iamVjdC5fX3Byb3RvX18gJiYgb2JqZWN0Ll9fcHJvdG9fXy5wID09PSBjbHMucHJvdG90eXBlLnApKQogICAgICByZXR1cm4gZmFsc2U7CgogICAgdHJ5IHsKICAgICAgLy8gQXJlIHdlIHJ1bm5pbmcgb24gYSBwbGF0Zm9ybSB3aGVyZSB0aGUgcGVyZm9ybWFuY2UgaXMgZ29vZD8KICAgICAgLy8gKGkuZS4gQ2hyb21lIG9yIGQ4KS4KCiAgICAgIC8vIENocm9tZSB1c2VyQWdlbnQ/CiAgICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9ICJ1bmRlZmluZWQiICYmCiAgICAgICAgICB0eXBlb2YgbmF2aWdhdG9yLnVzZXJBZ2VudCA9PSAic3RyaW5nIiAmJgogICAgICAgICAgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUvIikgPj0gMCkgcmV0dXJuIHRydWU7CiAgICAgIC8vIGQ4IHZlcnNpb24oKSBsb29rcyBsaWtlICJOLk4uTi5OIiwganNzaGVsbCB2ZXJzaW9uKCkgbGlrZSAiTiIuCiAgICAgIGlmICh0eXBlb2YgdmVyc2lvbiA9PSAiZnVuY3Rpb24iICYmCiAgICAgICAgICB2ZXJzaW9uLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgdmFyIHYgPSB2ZXJzaW9uKCk7CiAgICAgICAgaWYgKC9eXGQrXC5cZCtcLlxkK1wuXGQrJC8udGVzdCh2KSkgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0gY2F0Y2goXykge30KCiAgICByZXR1cm4gZmFsc2U7CiAgfSkoKQonJyc7CgovLy8gU29mdC1kZWZlcnJlZCBmcmFnbWVudHMgYXJlIGJ1aWx0IHNpbWlsYXJseSB0byB0aGUgbWFpbiBmcmFnbWVudC4KCi8vLyBEZWZlcnJlZCBmcmFnbWVudHMgKGFrYSAnaHVua3MnKSBhcmUgYnVpbHQgc2ltaWxhcmx5IHRvIHRoZSBtYWluIGZyYWdtZW50LgovLy8KLy8vIEhvd2V2ZXIsIGF0IHNwZWNpZmljIG1vbWVudHMgdGhleSBuZWVkIHRvIGNvbnRyaWJ1dGUgdGhlaXIgZGF0YS4KLy8vIEZvciBleGFtcGxlLCBvbmNlIHRoZSBob2xkZXJzIGhhdmUgYmVlbiBjcmVhdGVkLCB0aGV5IGFyZSBpbmNsdWRlZCBpbnRvCi8vLyB0aGUgbWFpbiBob2xkZXJzLgovLy8KLy8vIFRoaXMgdGVtcGxhdGUgaXMgdXNlZCBmb3IgRGFydCAyLgpjb25zdCBTdHJpbmcgZGVmZXJyZWRCb2lsZXJwbGF0ZURhcnQyID0gJycnCmZ1bmN0aW9uKGh1bmtIZWxwZXJzLCAjZW1iZWRkZWRHbG9iYWxzT2JqZWN0LCBob2xkZXJzTGlzdCwgI3N0YXRpY1N0YXRlKSB7CgovLyBCdWlsZHMgdGhlIGhvbGRlcnMuIFRoZXkgb25seSBjb250YWluIHRoZSBkYXRhIGZvciBuZXcgaG9sZGVycy4KI2hvbGRlcnM7CgovLyBJZiB0aGUgbmFtZSBpcyBub3Qgc2V0IG9uIHRoZSBmdW5jdGlvbnMsIGRvIGl0IG5vdy4KaHVua0hlbHBlcnMuc2V0RnVuY3Rpb25OYW1lc0lmTmVjZXNzYXJ5KCNkZWZlcnJlZEhvbGRlcnNMaXN0KTsKCi8vIFVwZGF0ZXMgdGhlIGhvbGRlcnMgb2YgdGhlIG1haW4tZnJhZ21lbnQuIFVzZXMgdGhlIHByb3ZpZGVkIGhvbGRlcnNMaXN0IHRvCi8vIGFjY2VzcyB0aGUgbWFpbiBob2xkZXJzLgovLyBUaGUgbG9jYWwgaG9sZGVycyBhcmUgcmVwbGFjZWQgYnkgdGhlIGNvbWJpbmVkIGhvbGRlcnMuIFRoaXMgaXMgbmVjZXNzYXJ5Ci8vIGZvciB0aGUgaW5oZXJpdGFuY2Ugc2V0dXAgYmVsb3cuCiN1cGRhdGVIb2xkZXJzOwovLyBTZXRzIHRoZSBwcm90b3R5cGVzIG9mIHRoZSBuZXcgY2xhc3Nlcy4KI3Byb3RvdHlwZXM7Ci8vIEFkZCBzaWduYXR1cmUgZnVuY3Rpb24gdHlwZXMgYW5kIGNvbXB1dGUgdGhlIHR5cGVzIG9mZnNldCBpbiBgaW5pdC50eXBlc2AuCi8vIFRoZXNlIGNhbiBvbmx5IHJlZmVyIHRvIHJlZ3VsYXIgY2xhc3NlcyBhbmQgaW4gRGFydCAyIG9ubHkgY2xvc3VyZXMgaGF2ZQovLyBmdW5jdGlvbiB0eXBlcyBzbyB0aGUgYHR5cGVzT2Zmc2V0YCBoYXMgYmVlbiBzYWZlbHkgY29tcHV0ZWQgYmVmb3JlIGl0J3MKLy8gcmVmZXJyZWQgaW4gdGhlIHNpZ25hdHVyZXMgb2YgdGhlIGBjbG9zdXJlc2AgYmVsb3cuCnZhciAjdHlwZXNPZmZzZXQgPSBodW5rSGVscGVycy51cGRhdGVUeXBlcygjdHlwZXMpOwojY2xvc3VyZXM7Ci8vIFNldHMgYWxpYXNlcyBvZiBtZXRob2RzIChvbiB0aGUgcHJvdG90eXBlcyBvZiBjbGFzc2VzKS4KI2FsaWFzZXM7Ci8vIEluc3RhbGxzIHRoZSB0ZWFyLW9mZnMgb2YgZnVuY3Rpb25zLgojdGVhck9mZnM7Ci8vIEJ1aWxkcyB0aGUgaW5oZXJpdGFuY2Ugc3RydWN0dXJlLgojaW5oZXJpdGFuY2U7CgovLyBJbnN0YW50aWF0ZXMgYWxsIGNvbnN0YW50cyBvZiB0aGlzIGRlZmVycmVkIGZyYWdtZW50LgovLyBOb3RlIHRoYXQgdGhlIGNvbnN0YW50LWhvbGRlciBoYXMgYmVlbiB1cGRhdGVkIGVhcmxpZXIgYW5kIHN0b3JpbmcgdGhlCi8vIGNvbnN0YW50IHZhbHVlcyBpbiB0aGUgY29uc3RhbnQtaG9sZGVyIG1ha2VzIHRoZW0gYXZhaWxhYmxlIGdsb2JhbGx5LgojY29uc3RhbnRzOwovLyBJbml0aWFsaXplcyB0aGUgc3RhdGljIG5vbi1maW5hbCBmaWVsZHMgKHdpdGggdGhlaXIgY29uc3RhbnQgdmFsdWVzKS4KI3N0YXRpY05vbkZpbmFsRmllbGRzOwovLyBDcmVhdGVzIGxhenkgZ2V0dGVycyBmb3Igc3RhdGljcyB0aGF0IG11c3QgcnVuIGluaXRpYWxpemVycyBvbiBmaXJzdCBhY2Nlc3MuCiNsYXp5U3RhdGljczsKCi8vIE5hdGl2ZS1zdXBwb3J0IHVzZXMgc2V0T3JVcGRhdGVJbnRlcmNlcHRvcnNCeVRhZyBhbmQgc2V0T3JVcGRhdGVMZWFmVGFncy4KI25hdGl2ZVN1cHBvcnQ7Cn0nJyc7CgovLy8KLy8vIEhvd2V2ZXIsIHRoZXkgZG9uJ3QgY29udHJpYnV0ZSBhbnl0aGluZyB0byBnbG9iYWwgbmFtZXNwYWNlLCBidXQganVzdAovLy8gaW5pdGlhbGl6ZSBleGlzdGluZyBjbGFzc2VzLiBGb3IgZXhhbXBsZSwgdGhleSB1cGRhdGUgdGhlIGluaGVyaXRhbmNlCi8vLyBoaWVyYXJjaHksIGFuZCBhZGQgbWV0aG9kcyB0aGUgcHJvdG90eXBlcy4KY29uc3QgU3RyaW5nIHNvZnREZWZlcnJlZEJvaWxlcnBsYXRlID0gJycnCiNkZWZlcnJlZEdsb2JhbFsjc29mdElkXSA9CiAgZnVuY3Rpb24oaG9sZGVyc0xpc3QsICNlbWJlZGRlZEdsb2JhbHNPYmplY3QsICNzdGF0aWNTdGF0ZSwKICAgICAgICAgICBodW5rSGVscGVycykgewoKLy8gSW5zdGFsbHMgdGhlIGhvbGRlcnMgYXMgbG9jYWwgdmFyaWFibGVzLgojaW5zdGFsbEhvbGRlcnNBc0xvY2FsczsKLy8gU2V0cyB0aGUgcHJvdG90eXBlcyBvZiB0aGUgbmV3IGNsYXNzZXMuCiNwcm90b3R5cGVzOwovLyBTZXRzIGFsaWFzZXMgb2YgbWV0aG9kcyAob24gdGhlIHByb3RvdHlwZXMgb2YgY2xhc3NlcykuCiNhbGlhc2VzOwovLyBJbnN0YWxscyB0aGUgdGVhci1vZmZzIG9mIGZ1bmN0aW9ucy4KI3RlYXJPZmZzOwovLyBCdWlsZHMgdGhlIGluaGVyaXRhbmNlIHN0cnVjdHVyZS4KI2luaGVyaXRhbmNlOwp9JycnOwoKLy8vIFRoaXMgY2xhc3MgYnVpbGRzIGEgSmF2YVNjcmlwdCB0cmVlIGZvciBhIGdpdmVuIGZyYWdtZW50LgovLy8KLy8vIEEgZnJhZ21lbnQgaXMgZ2VuZXJhbGx5IHdyaXR0ZW4gaW50byBhIHNlcGFyYXRlIGZpbGUgc28gdGhhdCBpdCBjYW4gYmUKLy8vIGxvYWRlZCBkeW5hbWljYWxseSB3aGVuIGEgZGVmZXJyZWQgbGlicmFyeSBpcyBsb2FkZWQuCi8vLwovLy8gVGhpcyBjbGFzcyBpcyBzdGF0ZWxlc3MgYW5kIGNhbiBiZSByZXVzZWQgZm9yIGRpZmZlcmVudCBmcmFnbWVudHMuCmNsYXNzIEZyYWdtZW50RW1pdHRlciB7CiAgZmluYWwgQ29tcGlsZXIgY29tcGlsZXI7CiAgZmluYWwgTmFtZXIgbmFtZXI7CiAgZmluYWwgSmF2YVNjcmlwdEJhY2tlbmQgYmFja2VuZDsKICBmaW5hbCBDb25zdGFudEVtaXR0ZXIgY29uc3RhbnRFbWl0dGVyOwogIGZpbmFsIE1vZGVsRW1pdHRlciBtb2RlbEVtaXR0ZXI7CiAgZmluYWwgSkNsb3NlZFdvcmxkIF9jbG9zZWRXb3JsZDsKCiAganMuTmFtZSBfY2FsbDBOYW1lLCBfY2FsbDFOYW1lLCBfY2FsbDJOYW1lOwogIGpzLk5hbWUgZ2V0IGNhbGwwTmFtZSA9PgogICAgICBfY2FsbDBOYW1lID8/PSBuYW1lci5nZXROYW1lRm9ySnNHZXROYW1lKG51bGwsIEpzR2V0TmFtZS5DQUxMX1BSRUZJWDApOwogIGpzLk5hbWUgZ2V0IGNhbGwxTmFtZSA9PgogICAgICBfY2FsbDFOYW1lID8/PSBuYW1lci5nZXROYW1lRm9ySnNHZXROYW1lKG51bGwsIEpzR2V0TmFtZS5DQUxMX1BSRUZJWDEpOwogIGpzLk5hbWUgZ2V0IGNhbGwyTmFtZSA9PgogICAgICBfY2FsbDJOYW1lID8/PSBuYW1lci5nZXROYW1lRm9ySnNHZXROYW1lKG51bGwsIEpzR2V0TmFtZS5DQUxMX1BSRUZJWDIpOwoKICBGcmFnbWVudEVtaXR0ZXIodGhpcy5jb21waWxlciwgdGhpcy5uYW1lciwgdGhpcy5iYWNrZW5kLCB0aGlzLmNvbnN0YW50RW1pdHRlciwKICAgICAgdGhpcy5tb2RlbEVtaXR0ZXIsIHRoaXMuX2Nsb3NlZFdvcmxkKTsKCiAganMuRXhwcmVzc2lvbiBnZW5lcmF0ZUVtYmVkZGVkR2xvYmFsQWNjZXNzKFN0cmluZyBnbG9iYWwpID0+CiAgICAgIG1vZGVsRW1pdHRlci5nZW5lcmF0ZUVtYmVkZGVkR2xvYmFsQWNjZXNzKGdsb2JhbCk7CgogIGpzLkV4cHJlc3Npb24gZ2VuZXJhdGVDb25zdGFudFJlZmVyZW5jZShDb25zdGFudFZhbHVlIHZhbHVlKSA9PgogICAgICBtb2RlbEVtaXR0ZXIuZ2VuZXJhdGVDb25zdGFudFJlZmVyZW5jZSh2YWx1ZSk7CgogIGpzLkV4cHJlc3Npb24gY2xhc3NSZWZlcmVuY2UoQ2xhc3MgY2xzKSB7CiAgICByZXR1cm4ganMuanMoJyMuIycsIFtjbHMuaG9sZGVyLm5hbWUsIGNscy5uYW1lXSk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyRW50aXR5QXN0KEVudGl0eSBlbnRpdHksIGpzLk5vZGUgY29kZSwge0xpYnJhcnlFbnRpdHkgbGlicmFyeX0pIHsKICAgIGNvbXBpbGVyLmR1bXBJbmZvVGFzay5yZWdpc3RlckVudGl0eUFzdChlbnRpdHksIGNvZGUpOwogICAgLy8gVE9ETyhzaWdtdW5kKTogc3RvcCByZWNvZGluZyBhc3NvY2lhdGlvbnMgdHdpY2UsIGR1bXAtaW5mbyBhbHJlYWR5CiAgICAvLyBoYXMgbGlicmFyeSB0byBlbGVtZW50IGRlcGVuZGVuY2llcyB0byByZWNvdmVyIHRoaXMgZGF0YS4KICAgIGlmIChsaWJyYXJ5ICE9IG51bGwpIGNvbXBpbGVyLmR1bXBJbmZvVGFzay5yZWdpc3RlckVudGl0eUFzdChsaWJyYXJ5LCBjb2RlKTsKICB9CgogIGpzLlN0YXRlbWVudCBlbWl0TWFpbkZyYWdtZW50KAogICAgICBQcm9ncmFtIHByb2dyYW0sIERlZmVycmVkTG9hZGluZ1N0YXRlIGRlZmVycmVkTG9hZGluZ1N0YXRlKSB7CiAgICBNYWluRnJhZ21lbnQgZnJhZ21lbnQgPSBwcm9ncmFtLmZyYWdtZW50cy5maXJzdDsKCiAgICBJdGVyYWJsZTxIb2xkZXI+IG5vblN0YXRpY1N0YXRlSG9sZGVycyA9CiAgICAgICAgcHJvZ3JhbS5ob2xkZXJzLndoZXJlKChIb2xkZXIgaG9sZGVyKSA9PiAhaG9sZGVyLmlzU3RhdGljU3RhdGVIb2xkZXIpOwoKICAgIFN0cmluZyBzb2Z0RGVmZXJyZWRJZCA9ICJzb2Z0RGVmZXJyZWQke25ldyBSYW5kb20oKS5uZXh0SW50KDB4N0ZGRkZGRkYpfSI7CgogICAgSG9sZGVyQ29kZSBob2xkZXJDb2RlID0KICAgICAgICBlbWl0SG9sZGVycyhwcm9ncmFtLmhvbGRlcnMsIGZyYWdtZW50LCBpbml0aWFsaXplRW1wdHlIb2xkZXJzOiB0cnVlKTsKCiAgICBqcy5TdGF0ZW1lbnQgbWFpbkNvZGUgPSBqcy5qcy5zdGF0ZW1lbnQobWFpbkJvaWxlcnBsYXRlLCB7CiAgICAgIC8vIFRPRE8oMjk0NTUpOiAnaHVua0hlbHBlcnMnIGRpc3BsYWNlcyBvdGhlciBuYW1lcywgc28gZG9uJ3QgbWluaWZ5IGl0LgogICAgICAnaHVua0hlbHBlcnMnOiBqcy5WYXJpYWJsZURlY2xhcmF0aW9uKCdodW5rSGVscGVycycsIGFsbG93UmVuYW1lOiBmYWxzZSksCiAgICAgICdkaXJlY3RBY2Nlc3NUZXN0RXhwcmVzc2lvbic6IGpzLmpzKGRpcmVjdEFjY2Vzc1Rlc3RFeHByZXNzaW9uKSwKICAgICAgJ2N5Y2xpY1Rocm93JzogYmFja2VuZC5lbWl0dGVyCiAgICAgICAgICAuc3RhdGljRnVuY3Rpb25BY2Nlc3MoX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmN5Y2xpY1Rocm93SGVscGVyKSwKICAgICAgJ29wZXJhdG9ySXNQcmVmaXgnOiBqcy5zdHJpbmcobmFtZXIub3BlcmF0b3JJc1ByZWZpeCksCiAgICAgICd0ZWFyT2ZmQ29kZSc6IG5ldyBqcy5CbG9jayhidWlsZFRlYXJPZmZDb2RlKGNvbXBpbGVyLm9wdGlvbnMsCiAgICAgICAgICBiYWNrZW5kLmVtaXR0ZXIuZW1pdHRlciwgYmFja2VuZC5uYW1lciwgX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzKSksCiAgICAgICdlbWJlZGRlZFR5cGVzJzogZ2VuZXJhdGVFbWJlZGRlZEdsb2JhbEFjY2VzcyhUWVBFUyksCiAgICAgICdlbWJlZGRlZEludGVyY2VwdG9yVGFncyc6CiAgICAgICAgICBnZW5lcmF0ZUVtYmVkZGVkR2xvYmFsQWNjZXNzKElOVEVSQ0VQVE9SU19CWV9UQUcpLAogICAgICAnZW1iZWRkZWRMZWFmVGFncyc6IGdlbmVyYXRlRW1iZWRkZWRHbG9iYWxBY2Nlc3MoTEVBRl9UQUdTKSwKICAgICAgJ2VtYmVkZGVkR2xvYmFsc09iamVjdCc6IGpzLmpzKCJpbml0IiksCiAgICAgICdzdGF0aWNTdGF0ZURlY2xhcmF0aW9uJzogbmV3IGpzLlZhcmlhYmxlRGVjbGFyYXRpb24oCiAgICAgICAgICBuYW1lci5zdGF0aWNTdGF0ZUhvbGRlciwKICAgICAgICAgIGFsbG93UmVuYW1lOiBmYWxzZSksCiAgICAgICdzdGF0aWNTdGF0ZSc6IGpzLmpzKCcjJywgbmFtZXIuc3RhdGljU3RhdGVIb2xkZXIpLAogICAgICAnY29uc3RhbnRIb2xkZXJSZWZlcmVuY2UnOiBidWlsZENvbnN0YW50SG9sZGVyUmVmZXJlbmNlKHByb2dyYW0pLAogICAgICAnaG9sZGVycyc6IGhvbGRlckNvZGUuc3RhdGVtZW50cywKICAgICAgJ2NhbGxOYW1lJzoganMuc3RyaW5nKG5hbWVyLmNhbGxOYW1lRmllbGQpLAogICAgICAnc3R1Yk5hbWUnOiBqcy5zdHJpbmcobmFtZXIuc3R1Yk5hbWVGaWVsZCksCiAgICAgICdhcmd1bWVudENvdW50JzoganMuc3RyaW5nKG5hbWVyLnJlcXVpcmVkUGFyYW1ldGVyRmllbGQpLAogICAgICAnZGVmYXVsdEFyZ3VtZW50VmFsdWVzJzoganMuc3RyaW5nKG5hbWVyLmRlZmF1bHRWYWx1ZXNGaWVsZCksCiAgICAgICdkZWZlcnJlZEdsb2JhbCc6IE1vZGVsRW1pdHRlci5kZWZlcnJlZEluaXRpYWxpemVyc0dsb2JhbCwKICAgICAgJ2hhc1NvZnREZWZlcnJlZENsYXNzZXMnOiBwcm9ncmFtLmhhc1NvZnREZWZlcnJlZENsYXNzZXMsCiAgICAgICdzb2Z0SWQnOiBqcy5zdHJpbmcoc29mdERlZmVycmVkSWQpLAogICAgICAnaXNUcmFja2luZ0FsbG9jYXRpb25zJzogY29tcGlsZXIub3B0aW9ucy5leHBlcmltZW50YWxUcmFja0FsbG9jYXRpb25zLAogICAgICAncHJvdG90eXBlcyc6IGVtaXRQcm90b3R5cGVzKGZyYWdtZW50KSwKICAgICAgJ2luaGVyaXRhbmNlJzogZW1pdEluaGVyaXRhbmNlKGZyYWdtZW50KSwKICAgICAgJ2FsaWFzZXMnOiBlbWl0SW5zdGFuY2VNZXRob2RBbGlhc2VzKGZyYWdtZW50KSwKICAgICAgJ3RlYXJPZmZzJzogZW1pdEluc3RhbGxUZWFyT2ZmcyhmcmFnbWVudCksCiAgICAgICdjb25zdGFudHMnOiBlbWl0Q29uc3RhbnRzKGZyYWdtZW50KSwKICAgICAgJ3N0YXRpY05vbkZpbmFsRmllbGRzJzogZW1pdFN0YXRpY05vbkZpbmFsRmllbGRzKGZyYWdtZW50KSwKICAgICAgJ2xhenlTdGF0aWNzJzogZW1pdExhemlseUluaXRpYWxpemVkU3RhdGljcyhmcmFnbWVudCksCiAgICAgICdlbWJlZGRlZEdsb2JhbHMnOiBlbWl0RW1iZWRkZWRHbG9iYWxzKHByb2dyYW0sIGRlZmVycmVkTG9hZGluZ1N0YXRlKSwKICAgICAgJ25hdGl2ZVN1cHBvcnQnOiBwcm9ncmFtLm5lZWRzTmF0aXZlU3VwcG9ydAogICAgICAgICAgPyBlbWl0TmF0aXZlU3VwcG9ydChmcmFnbWVudCkKICAgICAgICAgIDogbmV3IGpzLkVtcHR5U3RhdGVtZW50KCksCiAgICAgICdqc0ludGVyb3BTdXBwb3J0JzoganNJbnRlcm9wQW5hbHlzaXMuYnVpbGRKc0ludGVyb3BCb290c3RyYXAoCiAgICAgICAgICAgICAgY29tcGlsZXIuY29kZWdlbldvcmxkQnVpbGRlciwgX2Nsb3NlZFdvcmxkLm5hdGl2ZURhdGEsIG5hbWVyKSA/PwogICAgICAgICAgbmV3IGpzLkVtcHR5U3RhdGVtZW50KCksCiAgICAgICdpbnZva2VNYWluJzogZnJhZ21lbnQuaW52b2tlTWFpbiwKCiAgICAgICdjYWxsMHNlbGVjdG9yJzoganMucXVvdGVOYW1lKGNhbGwwTmFtZSksCiAgICAgICdjYWxsMXNlbGVjdG9yJzoganMucXVvdGVOYW1lKGNhbGwxTmFtZSksCiAgICAgICdjYWxsMnNlbGVjdG9yJzoganMucXVvdGVOYW1lKGNhbGwyTmFtZSksCiAgICB9KTsKICAgIGlmIChwcm9ncmFtLmhhc1NvZnREZWZlcnJlZENsYXNzZXMpIHsKICAgICAgcmV0dXJuIG5ldyBqcy5CbG9jayhbCiAgICAgICAganMuanMuc3RhdGVtZW50KHNvZnREZWZlcnJlZEJvaWxlcnBsYXRlLCB7CiAgICAgICAgICAnZGVmZXJyZWRHbG9iYWwnOiBNb2RlbEVtaXR0ZXIuZGVmZXJyZWRJbml0aWFsaXplcnNHbG9iYWwsCiAgICAgICAgICAnc29mdElkJzoganMuc3RyaW5nKHNvZnREZWZlcnJlZElkKSwKICAgICAgICAgIC8vIFRPRE8oZmxvaXRzY2gpOiBkb24ndCBqdXN0IHJlZmVyZW5jZSAnaW5pdCcuCiAgICAgICAgICAnZW1iZWRkZWRHbG9iYWxzT2JqZWN0JzogbmV3IGpzLlBhcmFtZXRlcignaW5pdCcpLAogICAgICAgICAgJ3N0YXRpY1N0YXRlJzogbmV3IGpzLlBhcmFtZXRlcihuYW1lci5zdGF0aWNTdGF0ZUhvbGRlciksCiAgICAgICAgICAnaW5zdGFsbEhvbGRlcnNBc0xvY2Fscyc6CiAgICAgICAgICAgICAgZW1pdEluc3RhbGxIb2xkZXJzQXNMb2NhbHMobm9uU3RhdGljU3RhdGVIb2xkZXJzKSwKICAgICAgICAgICdwcm90b3R5cGVzJzogZW1pdFByb3RvdHlwZXMoZnJhZ21lbnQsIHNvZnREZWZlcnJlZDogdHJ1ZSksCiAgICAgICAgICAnYWxpYXNlcyc6IGVtaXRJbnN0YW5jZU1ldGhvZEFsaWFzZXMoZnJhZ21lbnQsIHNvZnREZWZlcnJlZDogdHJ1ZSksCiAgICAgICAgICAndGVhck9mZnMnOiBlbWl0SW5zdGFsbFRlYXJPZmZzKGZyYWdtZW50LCBzb2Z0RGVmZXJyZWQ6IHRydWUpLAogICAgICAgICAgJ2luaGVyaXRhbmNlJzogZW1pdEluaGVyaXRhbmNlKGZyYWdtZW50LCBzb2Z0RGVmZXJyZWQ6IHRydWUpLAogICAgICAgIH0pLAogICAgICAgIG1haW5Db2RlCiAgICAgIF0pOwogICAgfQogICAgcmV0dXJuIG1haW5Db2RlOwogIH0KCiAganMuU3RhdGVtZW50IGVtaXRJbnN0YWxsSG9sZGVyc0FzTG9jYWxzKEl0ZXJhYmxlPEhvbGRlcj4gaG9sZGVycykgewogICAgTGlzdDxqcy5TdGF0ZW1lbnQ+IGhvbGRlckluaXRzID0gW107CiAgICBpbnQgY291bnRlciA9IDA7CiAgICBmb3IgKEhvbGRlciBob2xkZXIgaW4gaG9sZGVycykgewogICAgICBob2xkZXJJbml0cy5hZGQobmV3IGpzLkV4cHJlc3Npb25TdGF0ZW1lbnQobmV3IGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24oCiAgICAgICAgICBuZXcganMuVmFyaWFibGVEZWNsYXJhdGlvbihob2xkZXIubmFtZSwgYWxsb3dSZW5hbWU6IGZhbHNlKSwKICAgICAgICAgIGpzLmpzKCJob2xkZXJzTGlzdFsjXSIsIGpzLm51bWJlcihjb3VudGVyKyspKSkpKTsKICAgIH0KICAgIHJldHVybiBuZXcganMuQmxvY2soaG9sZGVySW5pdHMpOwogIH0KCiAganMuRXhwcmVzc2lvbiBlbWl0RGVmZXJyZWRGcmFnbWVudChEZWZlcnJlZEZyYWdtZW50IGZyYWdtZW50LAogICAgICBqcy5FeHByZXNzaW9uIGRlZmVycmVkVHlwZXMsIExpc3Q8SG9sZGVyPiBob2xkZXJzKSB7CiAgICBIb2xkZXJDb2RlIGhvbGRlckNvZGUgPQogICAgICAgIGVtaXRIb2xkZXJzKGhvbGRlcnMsIGZyYWdtZW50LCBpbml0aWFsaXplRW1wdHlIb2xkZXJzOiBmYWxzZSk7CgogICAgTGlzdDxIb2xkZXI+IG5vblN0YXRpY1N0YXRlSG9sZGVycyA9IGhvbGRlcnMKICAgICAgICAud2hlcmUoKEhvbGRlciBob2xkZXIpID0+ICFob2xkZXIuaXNTdGF0aWNTdGF0ZUhvbGRlcikKICAgICAgICAudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CgogICAgTGlzdDxqcy5TdGF0ZW1lbnQ+IHVwZGF0ZUhvbGRlckFzc2lnbm1lbnRzID0gW107CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vblN0YXRpY1N0YXRlSG9sZGVycy5sZW5ndGg7IGkrKykgewogICAgICBIb2xkZXIgaG9sZGVyID0gbm9uU3RhdGljU3RhdGVIb2xkZXJzW2ldOwogICAgICBpZiAoaG9sZGVyQ29kZS5hY3RpdmVIb2xkZXJzLmNvbnRhaW5zKGhvbGRlcikpIHsKICAgICAgICB1cGRhdGVIb2xkZXJBc3NpZ25tZW50cy5hZGQoanMuanMuc3RhdGVtZW50KAogICAgICAgICAgICAnI2hvbGRlciA9IGh1bmtIZWxwZXJzLnVwZGF0ZUhvbGRlcihob2xkZXJzTGlzdFsjaW5kZXhdLCAjaG9sZGVyKScsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAnaW5kZXgnOiBqcy5udW1iZXIoaSksCiAgICAgICAgICAgICAgJ2hvbGRlcic6IG5ldyBqcy5WYXJpYWJsZVVzZShob2xkZXIubmFtZSkKICAgICAgICAgICAgfSkpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRPRE8oc3JhKTogQ2hhbmdlIGRlY2xhcmF0aW9uIGZvbGxvd2VkIGJ5IGFzc2lnbm1lbnRzIHRvIGRlY2xhcmF0aW9ucwogICAgICAgIC8vIHdpdGggaW5pdGlhbGl6YXRpb24uCiAgICAgICAgdXBkYXRlSG9sZGVyQXNzaWdubWVudHMuYWRkKGpzLmpzLnN0YXRlbWVudCgKICAgICAgICAgICAgJyNob2xkZXIgPSBob2xkZXJzTGlzdFsjaW5kZXhdJywgewogICAgICAgICAgJ2luZGV4JzoganMubnVtYmVyKGkpLAogICAgICAgICAgJ2hvbGRlcic6IG5ldyBqcy5WYXJpYWJsZVVzZShob2xkZXIubmFtZSkKICAgICAgICB9KSk7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgY2xhc3NQcm90b3R5cGVzID0gZW1pdFByb3RvdHlwZXMoZnJhZ21lbnQsIGluY2x1ZGVDbG9zdXJlczogZmFsc2UpOwogICAgdmFyIGNsb3N1cmVQcm90b3R5cGVzID0gZW1pdFByb3RvdHlwZXMoZnJhZ21lbnQsIGluY2x1ZGVDbG9zdXJlczogdHJ1ZSk7CiAgICB2YXIgaW5oZXJpdGFuY2UgPSBlbWl0SW5oZXJpdGFuY2UoZnJhZ21lbnQpOwogICAgdmFyIG1ldGhvZEFsaWFzZXMgPSBlbWl0SW5zdGFuY2VNZXRob2RBbGlhc2VzKGZyYWdtZW50KTsKICAgIHZhciB0ZWFyT2ZmcyA9IGVtaXRJbnN0YWxsVGVhck9mZnMoZnJhZ21lbnQpOwogICAgdmFyIGNvbnN0YW50cyA9IGVtaXRDb25zdGFudHMoZnJhZ21lbnQpOwogICAgdmFyIHN0YXRpY05vbkZpbmFsRmllbGRzID0gZW1pdFN0YXRpY05vbkZpbmFsRmllbGRzKGZyYWdtZW50KTsKICAgIHZhciBsYXp5SW5pdGlhbGl6ZXJzID0gZW1pdExhemlseUluaXRpYWxpemVkU3RhdGljcyhmcmFnbWVudCk7CiAgICAvLyBUT0RPKGZsb2l0c2NoKTogb25seSBjYWxsIGVtaXROYXRpdmVTdXBwb3J0IGlmIHdlIG5lZWQgbmF0aXZlLgogICAgdmFyIG5hdGl2ZVN1cHBvcnQgPSBlbWl0TmF0aXZlU3VwcG9ydChmcmFnbWVudCk7CgogICAgLy8gVE9ETyhzcmEpOiBIb3cgZG8gd2UgdGVsbCBpZiBbZGVmZXJyZWRUeXBlc10gaXMgZW1wdHk/IEl0IGlzIGZpbGxlZC1pbgogICAgLy8gbGF0ZXIgdmlhIHRoZSBwcm9ncmFtIGZpbmFsaXplcnMuIFNvIHdlIHNob3VsZCBkZWZlciB0aGUgZGVjaXNpb24gb24gdGhlCiAgICAvLyBlbXB0aW5lc3Mgb2YgdGhlIGZyYWdtZW50IHVudGlsIHRoZSBmaW5hbGl6ZXJzIGhhdmUgcnVuLiAgRm9yIG5vdyB3ZSBzZWVtCiAgICAvLyB0byBnZXQgYXdheSB3aXRoIHRoZSBmYWN0IHRoYXQgdHlwZSBpbmRleGVzIGFyZSBlaXRoZXIgKDEpIG1haW4gdW5pdCBvcgogICAgLy8gKDIpIGxvY2FsIHRvIHRoZSBlbWl0dGVkIHVuaXQsIHNvIHRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcgYXMgYSB0eXBlIGluIGEKICAgIC8vIGRlZmVycmVkIHVuaXQgdGhhdCBpcyByZWZlcmVuY2VkIGZyb20gYW5vdGhlciBkZWZlcnJlZCB1bml0LiAgSWYgd2UgZGlkCiAgICAvLyBub3QgZW1pdCBhbnkgZnVuY3Rpb25zLCB0aGVuIHdlIHByb2JhYmx5IGRpZCBub3QgdXNlIHRoZSBzaWduYXR1cmUgdHlwZXMKICAgIC8vIGluIHRoZSBPdXRwdXRVbml0J3MgdHlwZXMsIGxlYXZpbmcgdGhlbSB1bnVzZWQgYW5kIHRyZWUtc2hha2VuLgoKICAgIGlmIChob2xkZXJDb2RlLmFjdGl2ZUhvbGRlcnMuaXNFbXB0eSAmJgogICAgICAgIGlzRW1wdHlTdGF0ZW1lbnQoY2xhc3NQcm90b3R5cGVzKSAmJgogICAgICAgIGlzRW1wdHlTdGF0ZW1lbnQoY2xvc3VyZVByb3RvdHlwZXMpICYmCiAgICAgICAgaXNFbXB0eVN0YXRlbWVudChpbmhlcml0YW5jZSkgJiYKICAgICAgICBpc0VtcHR5U3RhdGVtZW50KG1ldGhvZEFsaWFzZXMpICYmCiAgICAgICAgaXNFbXB0eVN0YXRlbWVudCh0ZWFyT2ZmcykgJiYKICAgICAgICBpc0VtcHR5U3RhdGVtZW50KGNvbnN0YW50cykgJiYKICAgICAgICBpc0VtcHR5U3RhdGVtZW50KHN0YXRpY05vbkZpbmFsRmllbGRzKSAmJgogICAgICAgIGlzRW1wdHlTdGF0ZW1lbnQobGF6eUluaXRpYWxpemVycykgJiYKICAgICAgICBpc0VtcHR5U3RhdGVtZW50KG5hdGl2ZVN1cHBvcnQpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGpzLkV4cHJlc3Npb24gY29kZSA9IGpzLmpzKGRlZmVycmVkQm9pbGVycGxhdGVEYXJ0MiwgewogICAgICAvLyBUT0RPKGZsb2l0c2NoKTogZG9uJ3QganVzdCByZWZlcmVuY2UgJ2luaXQnLgogICAgICAnZW1iZWRkZWRHbG9iYWxzT2JqZWN0JzogbmV3IGpzLlBhcmFtZXRlcignaW5pdCcpLAogICAgICAnc3RhdGljU3RhdGUnOiBuZXcganMuUGFyYW1ldGVyKG5hbWVyLnN0YXRpY1N0YXRlSG9sZGVyKSwKICAgICAgJ2hvbGRlcnMnOiBob2xkZXJDb2RlLnN0YXRlbWVudHMsCiAgICAgICdkZWZlcnJlZEhvbGRlcnNMaXN0JzogbmV3IGpzLkFycmF5SW5pdGlhbGl6ZXIoaG9sZGVyQ29kZS5hY3RpdmVIb2xkZXJzCiAgICAgICAgICAubWFwKChob2xkZXIpID0+IGpzLmpzKCIjIiwgaG9sZGVyLm5hbWUpKQogICAgICAgICAgLnRvTGlzdChncm93YWJsZTogZmFsc2UpKSwKICAgICAgJ3VwZGF0ZUhvbGRlcnMnOiBuZXcganMuQmxvY2sodXBkYXRlSG9sZGVyQXNzaWdubWVudHMpLAogICAgICAncHJvdG90eXBlcyc6IGNsYXNzUHJvdG90eXBlcywKICAgICAgJ2Nsb3N1cmVzJzogY2xvc3VyZVByb3RvdHlwZXMsCiAgICAgICdpbmhlcml0YW5jZSc6IGluaGVyaXRhbmNlLAogICAgICAnYWxpYXNlcyc6IG1ldGhvZEFsaWFzZXMsCiAgICAgICd0ZWFyT2Zmcyc6IHRlYXJPZmZzLAogICAgICAnY29uc3RhbnRzJzogY29uc3RhbnRzLAogICAgICAnc3RhdGljTm9uRmluYWxGaWVsZHMnOiBzdGF0aWNOb25GaW5hbEZpZWxkcywKICAgICAgJ2xhenlTdGF0aWNzJzogbGF6eUluaXRpYWxpemVycywKICAgICAgJ3R5cGVzJzogZGVmZXJyZWRUeXBlcywKICAgICAgJ25hdGl2ZVN1cHBvcnQnOiBuYXRpdmVTdXBwb3J0LAogICAgICAndHlwZXNPZmZzZXQnOiBuYW1lci50eXBlc09mZnNldE5hbWUsCiAgICB9KTsKCiAgICBpZiAoY29tcGlsZXIub3B0aW9ucy5leHBlcmltZW50U3RhcnR1cEZ1bmN0aW9ucykgewogICAgICBjb2RlID0ganMuUGFyZW50aGVzZXMoY29kZSk7CiAgICB9CiAgICByZXR1cm4gY29kZTsKICB9CgogIC8vLyBFbWl0cyBhbGwgaG9sZGVycywgZXhjZXB0IGZvciB0aGUgc3RhdGljLXN0YXRlIGhvbGRlci4KICAvLy8KICAvLy8gVGhlIGVtaXR0ZWQgaG9sZGVycyBjb250YWluIGNsYXNzZXMgKG9ubHkgdGhlIGNvbnN0cnVjdG9ycykgYW5kIGFsbAogIC8vLyBzdGF0aWMgZnVuY3Rpb25zLgogIEhvbGRlckNvZGUgZW1pdEhvbGRlcnMoTGlzdDxIb2xkZXI+IGhvbGRlcnMsIEZyYWdtZW50IGZyYWdtZW50LAogICAgICB7Ym9vbCBpbml0aWFsaXplRW1wdHlIb2xkZXJzfSkgewogICAgYXNzZXJ0KGluaXRpYWxpemVFbXB0eUhvbGRlcnMgIT0gbnVsbCk7CiAgICAvLyBTa2lwIHRoZSBzdGF0aWMtc3RhdGUgaG9sZGVyIGluIHRoaXMgZnVuY3Rpb24uCiAgICBob2xkZXJzID0gaG9sZGVycwogICAgICAgIC53aGVyZSgoSG9sZGVyIGhvbGRlcikgPT4gIWhvbGRlci5pc1N0YXRpY1N0YXRlSG9sZGVyKQogICAgICAgIC50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKCiAgICBNYXA8SG9sZGVyLCBMaXN0PGpzLlByb3BlcnR5Pj4gaG9sZGVyQ29kZSA9IHt9OwoKICAgIGZvciAoSG9sZGVyIGhvbGRlciBpbiBob2xkZXJzKSB7CiAgICAgIGhvbGRlckNvZGVbaG9sZGVyXSA9IDxqcy5Qcm9wZXJ0eT5bXTsKICAgIH0KCiAgICBmb3IgKExpYnJhcnkgbGlicmFyeSBpbiBmcmFnbWVudC5saWJyYXJpZXMpIHsKICAgICAgZm9yIChTdGF0aWNNZXRob2QgbWV0aG9kIGluIGxpYnJhcnkuc3RhdGljcykgewogICAgICAgIGFzc2VydCghbWV0aG9kLmhvbGRlci5pc1N0YXRpY1N0YXRlSG9sZGVyKTsKICAgICAgICB2YXIgc3RhdGljTWV0aG9kID0gZW1pdFN0YXRpY01ldGhvZChtZXRob2QpOwogICAgICAgIHN0YXRpY01ldGhvZC5mb3JFYWNoKChrZXksIHZhbHVlKSB7CiAgICAgICAgICB2YXIgcHJvcGVydHkgPSBuZXcganMuUHJvcGVydHkoanMucXVvdGVOYW1lKGtleSksIHZhbHVlKTsKICAgICAgICAgIGhvbGRlckNvZGVbbWV0aG9kLmhvbGRlcl0uYWRkKHByb3BlcnR5KTsKICAgICAgICAgIHJlZ2lzdGVyRW50aXR5QXN0KG1ldGhvZC5lbGVtZW50LCBwcm9wZXJ0eSwgbGlicmFyeTogbGlicmFyeS5lbGVtZW50KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBmb3IgKENsYXNzIGNscyBpbiBsaWJyYXJ5LmNsYXNzZXMpIHsKICAgICAgICBhc3NlcnQoIWNscy5ob2xkZXIuaXNTdGF0aWNTdGF0ZUhvbGRlcik7CiAgICAgICAgdmFyIGNvbnN0cnVjdG9yID0gZW1pdENvbnN0cnVjdG9yKGNscyk7CiAgICAgICAgdmFyIHByb3BlcnR5ID0gbmV3IGpzLlByb3BlcnR5KGpzLnF1b3RlTmFtZShjbHMubmFtZSksIGNvbnN0cnVjdG9yKTsKICAgICAgICByZWdpc3RlckVudGl0eUFzdChjbHMuZWxlbWVudCwgcHJvcGVydHksIGxpYnJhcnk6IGxpYnJhcnkuZWxlbWVudCk7CiAgICAgICAgaG9sZGVyQ29kZVtjbHMuaG9sZGVyXS5hZGQocHJvcGVydHkpOwogICAgICB9CiAgICB9CgogICAgTGlzdDxqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uPiBob2xkZXJJbml0aWFsaXphdGlvbnMgPSBbXTsKICAgIExpc3Q8SG9sZGVyPiBhY3RpdmVIb2xkZXJzID0gW107CgogICAgZm9yIChIb2xkZXIgaG9sZGVyIGluIGhvbGRlcnMpIHsKICAgICAgTGlzdDxqcy5Qcm9wZXJ0eT4gcHJvcGVydGllcyA9IGhvbGRlckNvZGVbaG9sZGVyXTsKICAgICAgaWYgKHByb3BlcnRpZXMuaXNFbXB0eSkgewogICAgICAgIGhvbGRlckluaXRpYWxpemF0aW9ucy5hZGQobmV3IGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24oCiAgICAgICAgICAgIG5ldyBqcy5WYXJpYWJsZURlY2xhcmF0aW9uKGhvbGRlci5uYW1lLCBhbGxvd1JlbmFtZTogZmFsc2UpLAogICAgICAgICAgICBpbml0aWFsaXplRW1wdHlIb2xkZXJzCiAgICAgICAgICAgICAgICA/IG5ldyBqcy5PYmplY3RJbml0aWFsaXplcihwcm9wZXJ0aWVzKQogICAgICAgICAgICAgICAgOiBudWxsKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWN0aXZlSG9sZGVycy5hZGQoaG9sZGVyKTsKICAgICAgICBob2xkZXJJbml0aWFsaXphdGlvbnMuYWRkKG5ldyBqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uKAogICAgICAgICAgICBuZXcganMuVmFyaWFibGVEZWNsYXJhdGlvbihob2xkZXIubmFtZSwgYWxsb3dSZW5hbWU6IGZhbHNlKSwKICAgICAgICAgICAgbmV3IGpzLk9iamVjdEluaXRpYWxpemVyKHByb3BlcnRpZXMpKSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBUaGUgZ2VuZXJhdGVkIGNvZGUgbG9va3MgbGlrZSB0aGlzOgogICAgLy8KICAgIC8vICAgIHsKICAgIC8vICAgICAgdmFyIEggPSB7Li4ufSwgLi4uLCBHID0gey4uLn07CiAgICAvLyAgICAgIHZhciBob2xkZXJzID0gWyBILCAuLi4sIEcgXTsgLy8gTWFpbiB1bml0IG9ubHkuCiAgICAvLyAgICB9CgogICAgTGlzdDxqcy5TdGF0ZW1lbnQ+IHN0YXRlbWVudHMgPSBbXTsKICAgIHN0YXRlbWVudHMuYWRkKG5ldyBqcy5FeHByZXNzaW9uU3RhdGVtZW50KG5ldyBqcy5WYXJpYWJsZURlY2xhcmF0aW9uTGlzdCgKICAgICAgICBob2xkZXJJbml0aWFsaXphdGlvbnMsCiAgICAgICAgaW5kZW50U3BsaXRzOiBmYWxzZSkpKTsKICAgIGlmIChpbml0aWFsaXplRW1wdHlIb2xkZXJzKSB7CiAgICAgIHN0YXRlbWVudHMuYWRkKGpzLmpzLnN0YXRlbWVudCgKICAgICAgICAgICd2YXIgaG9sZGVycyA9ICMnLAogICAgICAgICAgbmV3IGpzLkFycmF5SW5pdGlhbGl6ZXIoaG9sZGVycwogICAgICAgICAgICAgIC5tYXAoKGhvbGRlcikgPT4gbmV3IGpzLlZhcmlhYmxlVXNlKGhvbGRlci5uYW1lKSkKICAgICAgICAgICAgICAudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSkpKSk7CiAgICB9CiAgICByZXR1cm4gbmV3IEhvbGRlckNvZGUoCiAgICAgIGFjdGl2ZUhvbGRlcnM6IGFjdGl2ZUhvbGRlcnMsCiAgICAgIHN0YXRlbWVudHM6IG5ldyBqcy5CbG9jayhzdGF0ZW1lbnRzKSwKICAgICk7CiAgfQoKICAvLy8gUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgY29uc3RhbnQgaG9sZGVyLCBvciB0aGUgSlMtbGl0ZXJhbCBgbnVsbGAuCiAganMuRXhwcmVzc2lvbiBidWlsZENvbnN0YW50SG9sZGVyUmVmZXJlbmNlKFByb2dyYW0gcHJvZ3JhbSkgewogICAgSG9sZGVyIGNvbnN0YW50SG9sZGVyID0gcHJvZ3JhbS5ob2xkZXJzLmZpcnN0V2hlcmUoCiAgICAgICAgKEhvbGRlciBob2xkZXIpID0+IGhvbGRlci5pc0NvbnN0YW50c0hvbGRlciwKICAgICAgICBvckVsc2U6ICgpID0+IG51bGwpOwogICAgaWYgKGNvbnN0YW50SG9sZGVyID09IG51bGwpIHJldHVybiBuZXcganMuTGl0ZXJhbE51bGwoKTsKICAgIHJldHVybiBuZXcganMuVmFyaWFibGVVc2UoY29uc3RhbnRIb2xkZXIubmFtZSk7CiAgfQoKICAvLy8gRW1pdHMgdGhlIGdpdmVuIFttZXRob2RdLgogIC8vLwogIC8vLyBBIERhcnQgbWV0aG9kIG1pZ2h0IHJlc3VsdCBpbiBzZXZlcmFsIEphdmFTY3JpcHQgZnVuY3Rpb25zLCBpZiBpdAogIC8vLyByZXF1aXJlcyBzdHVicy4gVGhlIHJldHVybmVkIG1hcCBjb250YWlucyB0aGUgb3JpZ2luYWwgbWV0aG9kIGFuZCBhbGwKICAvLy8gdGhlIHN0dWJzIGl0IG5lZWRzLgogIE1hcDxqcy5OYW1lLCBqcy5FeHByZXNzaW9uPiBlbWl0U3RhdGljTWV0aG9kKFN0YXRpY01ldGhvZCBtZXRob2QpIHsKICAgIE1hcDxqcy5OYW1lLCBqcy5FeHByZXNzaW9uPiBqc01ldGhvZHMgPSB7fTsKCiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGluc3RhbGwgc3R1Yi1tZXRob2RzLiBUaGV5IGNhbiBvbmx5IGJlIHVzZWQgd2hlbiB0aGVyZQogICAgLy8gYXJlIHRlYXItb2ZmcywgaW4gd2hpY2ggY2FzZSB0aGV5IGFyZSBlbWl0dGVkIHRoZXJlLgogICAgYXNzZXJ0KCgpIHsKICAgICAgaWYgKG1ldGhvZCBpcyBTdGF0aWNEYXJ0TWV0aG9kKSB7CiAgICAgICAgcmV0dXJuIG1ldGhvZC5uZWVkc1RlYXJPZmYgfHwgbWV0aG9kLnBhcmFtZXRlclN0dWJzLmlzRW1wdHk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9KCkpOwogICAganNNZXRob2RzW21ldGhvZC5uYW1lXSA9IG1ldGhvZC5jb2RlOwoKICAgIHJldHVybiBqc01ldGhvZHM7CiAgfQoKICAvLy8gRW1pdHMgYSBjb25zdHJ1Y3RvciBmb3IgdGhlIGdpdmVuIGNsYXNzIFtjbHNdLgogIC8vLwogIC8vLyBUaGUgY29uc3RydWN0b3IgaXMgc3RhdGljYWxseSBidWlsdC4KICBqcy5FeHByZXNzaW9uIGVtaXRDb25zdHJ1Y3RvcihDbGFzcyBjbHMpIHsKICAgIGpzLk5hbWUgbmFtZSA9IGNscy5uYW1lOwogICAgLy8gSWYgdGhlIGNsYXNzIGlzIG5vdCBkaXJlY3RseSBpbnN0YW50aWF0ZWQgd2Ugb25seSBuZWVkIGl0IGZvciBpbmhlcml0YW5jZQogICAgLy8gb3IgUlRJLiBJbiBlaXRoZXIgY2FzZSB3ZSBkb24ndCBuZWVkIGl0cyBmaWVsZHMuCiAgICBpZiAoY2xzLmlzTmF0aXZlIHx8ICFjbHMuaXNEaXJlY3RseUluc3RhbnRpYXRlZCkgewogICAgICByZXR1cm4ganMuanMoJ2Z1bmN0aW9uICMoKSB7IH0nLCBuYW1lKTsKICAgIH0KCiAgICB2YXIgc3RhdGVtZW50cyA9IDxqcy5TdGF0ZW1lbnQ+W107CiAgICB2YXIgcGFyYW1ldGVycyA9IDxqcy5QYXJhbWV0ZXI+W107CiAgICB2YXIgdGhpc1JlZjsKCiAgICBpZiAoY2xzLmlzU29mdERlZmVycmVkKSB7CiAgICAgIHN0YXRlbWVudHMuYWRkKGpzLmpzLnN0YXRlbWVudCgnc29mdERlZih0aGlzKScpKTsKICAgIH0gZWxzZSBpZiAoY29tcGlsZXIub3B0aW9ucy5leHBlcmltZW50YWxUcmFja0FsbG9jYXRpb25zKSB7CiAgICAgIFN0cmluZyBxdWFsaWZpZWROYW1lID0KICAgICAgICAgICIke2Nscy5lbGVtZW50LmxpYnJhcnkuY2Fub25pY2FsVXJpfToke2Nscy5lbGVtZW50Lm5hbWV9IjsKICAgICAgc3RhdGVtZW50cy5hZGQoanMuanMuc3RhdGVtZW50KCdhbGxvY2F0aW9uc1siJHF1YWxpZmllZE5hbWUiXSA9IHRydWUnKSk7CiAgICB9CgogICAgTGlzdDxGaWVsZD4gZW1pdHRlZEZpZWxkcyA9IGNscy5maWVsZHMud2hlcmUoKGYpID0+ICFmLmlzRWxpZGVkKS50b0xpc3QoKTsKCiAgICAvLyBJZiB0aGVyZSBhcmUgbWFueSByZWZlcmVuY2VzIHRvIGB0aGlzYCwgY2FjaGUgaXQgaW4gYSBsb2NhbC4KICAgIGlmIChlbWl0dGVkRmllbGRzLmxlbmd0aCArIChjbHMuaGFzUnRpRmllbGQgPyAxIDogMCkgPj0gNCkgewogICAgICAvLyBQYXJhbWV0ZXJzIGFyZSBuYW1lZCB0MCwgdDEsIGV0Yywgc28gJ18nIHdpbGwgbm90IGNvbmZsaWN0LiBGb3JjaW5nICdfJwogICAgICAvLyBpbiBtaW5pZmllZCBtb2RlIHdvcmtzIGJlY2F1c2Ugbm8gcGFyYW1ldGVyIG9yIGxvY2FsIGFsc28gbWluaWZpZXMgdG8KICAgICAgLy8gJ18nICh0aGUgbWluaWZpZXIgZG9lc24ndCBrbm93ICdfJyBpcyBhdmFpbGFibGUpLgogICAgICBqcy5OYW1lIHVuZGVyc2NvcmUgPSBuZXcgU3RyaW5nQmFja2VkTmFtZSgnXycpOwogICAgICBzdGF0ZW1lbnRzLmFkZChqcy5qcy5zdGF0ZW1lbnQoJ3ZhciAjID0gdGhpczsnLCB1bmRlcnNjb3JlKSk7CiAgICAgIHRoaXNSZWYgPSB1bmRlcnNjb3JlOwogICAgfSBlbHNlIHsKICAgICAgdGhpc1JlZiA9IGpzLmpzKCd0aGlzJyk7CiAgICB9CgogICAgLy8gQ2hhaW4gYXNzaWdubWVudHMgb2YgdGhlIHNhbWUgdmFsdWUsIGUuZy4gYHRoaXMuYiA9IHRoaXMuYSA9IG51bGxgLgogICAgLy8gTGltaXQgY2hhaW4gbGVuZ3RoIHNvIHRoYXQgdGhlIEphdmFTY3JpcHQgcGFyc2VyIGhhcyBib3VuZGVkIHJlY3Vyc2lvbi4KICAgIGNvbnN0IGludCBtYXhDaGFpbkxlbmd0aCA9IDMwOwogICAganMuRXhwcmVzc2lvbiBhc3NpZ25tZW50ID0gbnVsbDsKICAgIGludCBjaGFpbkxlbmd0aCA9IDA7CiAgICBDb25zdGFudFZhbHVlIHByZXZpb3VzQ29uc3RhbnQgPSBudWxsOwogICAgdm9pZCBmbHVzaEFzc2lnbm1lbnQoKSB7CiAgICAgIGlmIChhc3NpZ25tZW50ICE9IG51bGwpIHsKICAgICAgICBzdGF0ZW1lbnRzLmFkZChqcy5qcy5zdGF0ZW1lbnQoJyM7JywgYXNzaWdubWVudCkpOwogICAgICAgIGFzc2lnbm1lbnQgPSBudWxsOwogICAgICAgIGNoYWluTGVuZ3RoID0gMDsKICAgICAgICBwcmV2aW91c0NvbnN0YW50ID0gbnVsbDsKICAgICAgfQogICAgfQoKICAgIGZvciAoRmllbGQgZmllbGQgaW4gZW1pdHRlZEZpZWxkcykgewogICAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50ID0gZmllbGQuaW5pdGlhbGl6ZXJJbkFsbG9jYXRvcjsKICAgICAgaWYgKGNvbnN0YW50ICE9IG51bGwpIHsKICAgICAgICBpZiAoY29uc3RhbnQgPT0gcHJldmlvdXNDb25zdGFudCAmJiBjaGFpbkxlbmd0aCA8IG1heENoYWluTGVuZ3RoKSB7CiAgICAgICAgICBhc3NpZ25tZW50ID0ganMuanMoJyMuIyA9ICMnLCBbdGhpc1JlZiwgZmllbGQubmFtZSwgYXNzaWdubWVudF0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmbHVzaEFzc2lnbm1lbnQoKTsKICAgICAgICAgIGFzc2lnbm1lbnQgPSBqcy5qcygnIy4jID0gIycsIFsKICAgICAgICAgICAgdGhpc1JlZiwKICAgICAgICAgICAgZmllbGQubmFtZSwKICAgICAgICAgICAgY29uc3RhbnRFbWl0dGVyLmdlbmVyYXRlKGNvbnN0YW50KSwKICAgICAgICAgIF0pOwogICAgICAgIH0KICAgICAgICArK2NoYWluTGVuZ3RoOwogICAgICAgIHByZXZpb3VzQ29uc3RhbnQgPSBjb25zdGFudDsKICAgICAgfSBlbHNlIHsKICAgICAgICBmbHVzaEFzc2lnbm1lbnQoKTsKICAgICAgICBqcy5QYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IGpzLlBhcmFtZXRlcigndCR7cGFyYW1ldGVycy5sZW5ndGh9Jyk7CiAgICAgICAgcGFyYW1ldGVycy5hZGQocGFyYW1ldGVyKTsKICAgICAgICBzdGF0ZW1lbnRzLmFkZCgKICAgICAgICAgICAganMuanMuc3RhdGVtZW50KCcjLiMgPSAjJywgW3RoaXNSZWYsIGZpZWxkLm5hbWUsIHBhcmFtZXRlci5uYW1lXSkpOwogICAgICB9CiAgICB9CiAgICBmbHVzaEFzc2lnbm1lbnQoKTsKCiAgICBpZiAoY2xzLmhhc1J0aUZpZWxkKSB7CiAgICAgIGpzLlBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcganMuUGFyYW1ldGVyKCd0JHtwYXJhbWV0ZXJzLmxlbmd0aH0nKTsKICAgICAgcGFyYW1ldGVycy5hZGQocGFyYW1ldGVyKTsKICAgICAgc3RhdGVtZW50cy5hZGQoanMuanMuc3RhdGVtZW50KAogICAgICAgICAgJyMuIyA9ICMnLCBbdGhpc1JlZiwgbmFtZXIucnRpRmllbGRKc05hbWUsIHBhcmFtZXRlci5uYW1lXSkpOwogICAgfQoKICAgIHJldHVybiBqcy5qcygnZnVuY3Rpb24gIygjKSB7ICMgfScsIFtuYW1lLCBwYXJhbWV0ZXJzLCBzdGF0ZW1lbnRzXSk7CiAgfQoKICAvLy8gRW1pdHMgdGhlIHByb3RvdHlwZS1zZWN0aW9uIG9mIHRoZSBmcmFnbWVudC4KICAvLy8KICAvLy8gVGhpcyBzZWN0aW9uIHVwZGF0ZXMgdGhlIHByb3RvdHlwZS1wcm9wZXJ0eSBvZiBhbGwgY29uc3RydWN0b3JzIGluIHRoZQogIC8vLyBnbG9iYWwgaG9sZGVycy4KICAvLy8KICAvLy8gW3NvZnREZWZlcnJlZF0gZGV0ZXJtaW5lIHdoZXRoZXIgcHJvdG90eXBlcyBmb3Igc29mdCBkZWZlcnJlZCBjbGFzc2VzIGFyZQogIC8vLyBnZW5lcmF0ZWQuCiAgLy8vCiAgLy8vIElmIFtpbmNsdWRlQ2xvc3VyZXNdIGlzIGB0cnVlYCBvbmx5IHByb3RvdHlwZXMgZm9yIGNsb3N1cmUgY2xhc3NlcyBhcmUKICAvLy8gZ2VuZXJhdGVkLCBpZiBbaW5jbHVkZUNsb3N1cmVzXSBpcyBgZmFsc2VgIG9ubHkgcHJvdG90eXBlcyBmb3Igbm9uLWNsb3N1cmUKICAvLy8gY2xhc3NlcyBhcmUgZ2VuZXJhdGVkLiBPdGhlcndpc2UgcHJvdG90eXBlcyBmb3IgYWxsIGNsYXNzZXMgYXJlIGdlbmVyYXRlZC4KICBqcy5TdGF0ZW1lbnQgZW1pdFByb3RvdHlwZXMoRnJhZ21lbnQgZnJhZ21lbnQsCiAgICAgIHtib29sIHNvZnREZWZlcnJlZCA9IGZhbHNlLCBib29sIGluY2x1ZGVDbG9zdXJlc30pIHsKICAgIExpc3Q8anMuU3RhdGVtZW50PiBhc3NpZ25tZW50cyA9IGZyYWdtZW50LmxpYnJhcmllcwogICAgICAgIC5leHBhbmQoKExpYnJhcnkgbGlicmFyeSkgPT4gbGlicmFyeS5jbGFzc2VzKQogICAgICAgIC53aGVyZSgoQ2xhc3MgY2xzKSB7CiAgICAgIGlmIChpbmNsdWRlQ2xvc3VyZXMgIT0gbnVsbCkgewogICAgICAgIGlmIChjbHMuZWxlbWVudC5pc0Nsb3N1cmUgIT0gaW5jbHVkZUNsb3N1cmVzKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBjbHMuaXNTb2Z0RGVmZXJyZWQgPT0gc29mdERlZmVycmVkOwogICAgfSkubWFwKChDbGFzcyBjbHMpIHsKICAgICAgdmFyIHByb3RvID0ganMuanMuc3RhdGVtZW50KAogICAgICAgICAgJyMucHJvdG90eXBlID0gIzsnLCBbY2xhc3NSZWZlcmVuY2UoY2xzKSwgZW1pdFByb3RvdHlwZShjbHMpXSk7CiAgICAgIENsYXNzRW50aXR5IGVsZW1lbnQgPSBjbHMuZWxlbWVudDsKICAgICAgcmVnaXN0ZXJFbnRpdHlBc3QoZWxlbWVudCwgcHJvdG8sIGxpYnJhcnk6IGVsZW1lbnQubGlicmFyeSk7CiAgICAgIHJldHVybiBwcm90bzsKICAgIH0pLnRvTGlzdChncm93YWJsZTogZmFsc2UpOwoKICAgIHJldHVybiBuZXcganMuQmxvY2soYXNzaWdubWVudHMpOwogIH0KCiAgLy8vIEVtaXRzIHRoZSBwcm90b3R5cGUgb2YgdGhlIGdpdmVuIGNsYXNzIFtjbHNdLgogIC8vLwogIC8vLyBUaGUgcHJvdG90eXBlIGlzIGdlbmVyYXRlZCBhcyBvYmplY3QgbGl0ZXJhbC4gSW5oZXJpdGFuY2UgaXMgaWdub3JlZC4KICAvLy8KICAvLy8gVGhlIHByb3RvdHlwZSBhbHNvIGluY2x1ZGVzIHRoZSBgaXMtcHJvcGVydHlgIHRoYXQgZXZlcnkgY2xhc3MgbXVzdCBoYXZlLgogIC8vIFRPRE8oZmxvaXRzY2gpOiB3ZSBjb3VsZCBhdm9pZCB0aGF0IHByb3BlcnR5IGlmIHdlIGtuZXcgdGhhdCBpdCB3YXNuJ3QKICAvLyAgICBuZWVkZWQuCiAganMuRXhwcmVzc2lvbiBlbWl0UHJvdG90eXBlKENsYXNzIGNscykgewogICAgSXRlcmFibGU8TWV0aG9kPiBtZXRob2RzID0gY2xzLm1ldGhvZHM7CiAgICBJdGVyYWJsZTxNZXRob2Q+IGNoZWNrZWRTZXR0ZXJzID0gY2xzLmNoZWNrZWRTZXR0ZXJzOwogICAgSXRlcmFibGU8TWV0aG9kPiBpc0NoZWNrcyA9IGNscy5pc0NoZWNrczsKICAgIEl0ZXJhYmxlPE1ldGhvZD4gY2FsbFN0dWJzID0gY2xzLmNhbGxTdHViczsKICAgIEl0ZXJhYmxlPE1ldGhvZD4gbm9TdWNoTWV0aG9kU3R1YnMgPSBjbHMubm9TdWNoTWV0aG9kU3R1YnM7CiAgICBJdGVyYWJsZTxNZXRob2Q+IGdldHRlcnNTZXR0ZXJzID0gZ2VuZXJhdGVHZXR0ZXJzU2V0dGVycyhjbHMpOwogICAgSXRlcmFibGU8TWV0aG9kPiBhbGxNZXRob2RzID0gWwogICAgICBtZXRob2RzLAogICAgICBjaGVja2VkU2V0dGVycywKICAgICAgaXNDaGVja3MsCiAgICAgIGNhbGxTdHVicywKICAgICAgbm9TdWNoTWV0aG9kU3R1YnMsCiAgICAgIGdldHRlcnNTZXR0ZXJzCiAgICBdLmV4cGFuZCgoeCkgPT4geCk7CgogICAgTGlzdDxqcy5Qcm9wZXJ0eT4gcHJvcGVydGllcyA9IFtdOwoKICAgIGlmIChjbHMuc3VwZXJjbGFzcyA9PSBudWxsKSB7CiAgICAgIC8vIFRPRE8oc3JhKTogV2hhdCBpcyB0aGlzIGRvaW5nPyBEb2N1bWVudCBvciByZW1vdmUuCiAgICAgIHByb3BlcnRpZXMKICAgICAgICAgIC5hZGQoanMuUHJvcGVydHkoanMuc3RyaW5nKCJjb25zdHJ1Y3RvciIpLCBjbGFzc1JlZmVyZW5jZShjbHMpKSk7CiAgICAgIHByb3BlcnRpZXMuYWRkKGpzLlByb3BlcnR5KG5hbWVyLm9wZXJhdG9ySXMoY2xzLmVsZW1lbnQpLCBqcy5udW1iZXIoMSkpKTsKICAgIH0KCiAgICBhbGxNZXRob2RzLmZvckVhY2goKE1ldGhvZCBtZXRob2QpIHsKICAgICAgZW1pdEluc3RhbmNlTWV0aG9kKG1ldGhvZCkKICAgICAgICAgIC5mb3JFYWNoKChqcy5FeHByZXNzaW9uIG5hbWUsIGpzLkV4cHJlc3Npb24gY29kZSkgewogICAgICAgIHZhciBwcm9wID0ganMuUHJvcGVydHkobmFtZSwgY29kZSk7CiAgICAgICAgcmVnaXN0ZXJFbnRpdHlBc3QobWV0aG9kLmVsZW1lbnQsIHByb3ApOwogICAgICAgIHByb3BlcnRpZXMuYWRkKHByb3ApOwogICAgICB9KTsKICAgIH0pOwoKICAgIGlmIChjbHMuaXNDbG9zdXJlQmFzZUNsYXNzKSB7CiAgICAgIC8vIENsb3N1cmVzIGV4dGVuZCBhIGNvbW1vbiBiYXNlIGNsYXNzLCBzbyB3ZSBjYW4gcHV0IHByb3BlcnRpZXMgb24gdGhlCiAgICAgIC8vIHByb3RvdHlwZSBmb3IgY29tbW9uIHZhbHVlcy4KCiAgICAgIC8vIENsb3N1cmVzIHRha2luZyBleGFjdGx5IG9uZSBhcmd1bWVudCBhcmUgY29tbW9uLgogICAgICBwcm9wZXJ0aWVzLmFkZChqcy5Qcm9wZXJ0eSgKICAgICAgICAgIGpzLnN0cmluZyhuYW1lci5jYWxsQ2F0Y2hBbGxOYW1lKSwganMucXVvdGVOYW1lKGNhbGwxTmFtZSkpKTsKICAgICAgcHJvcGVydGllcy5hZGQoCiAgICAgICAgICBqcy5Qcm9wZXJ0eShqcy5zdHJpbmcobmFtZXIucmVxdWlyZWRQYXJhbWV0ZXJGaWVsZCksIGpzLm51bWJlcigxKSkpOwoKICAgICAgLy8gTW9zdCBjbG9zdXJlcyBoYXZlIG5vIG9wdGlvbmFsIGFyZ3VtZW50cy4KICAgICAgcHJvcGVydGllcy5hZGQoanMuUHJvcGVydHkoCiAgICAgICAgICBqcy5zdHJpbmcobmFtZXIuZGVmYXVsdFZhbHVlc0ZpZWxkKSwgbmV3IGpzLkxpdGVyYWxOdWxsKCkpKTsKICAgIH0KCiAgICByZXR1cm4gbmV3IGpzLk9iamVjdEluaXRpYWxpemVyKHByb3BlcnRpZXMpOwogIH0KCiAgLy8vIEdlbmVyYXRlcyBhIGdldHRlciBmb3IgdGhlIGdpdmVuIFtmaWVsZF0uCiAgTWV0aG9kIGdlbmVyYXRlR2V0dGVyKEZpZWxkIGZpZWxkKSB7CiAgICBhc3NlcnQoZmllbGQubmVlZHNHZXR0ZXIpOwoKICAgIGpzLkV4cHJlc3Npb24gY29kZTsKICAgIGlmIChmaWVsZC5pc0VsaWRlZCkgewogICAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50VmFsdWUgPSBmaWVsZC5jb25zdGFudFZhbHVlOwogICAgICBpZiAoY29uc3RhbnRWYWx1ZSA9PSBudWxsKSB7CiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3RhdGljIHR5cGVzIGFyZSBub3QgaG9ub3VyZWQgaW4gdGhlIGR5bmFtaWMKICAgICAgICAvLyB1c2VzIGNyZWF0ZWQgaW4gY29kZWdlbiwgbGVhZGluZyB0byBkZWFkIGNvZGUsIGFzIGtub3duIGJ5IHRoZSBjbG9zZWQKICAgICAgICAvLyB3b3JsZCBjb21wdXRhdGlvbiwgYmVpbmcgdHJpZ2dlcmVkIGJ5IHRoZSBjb2RlZ2VuIGVucXVldWVyLiBXZQogICAgICAgIC8vIGNhdXRpb3VzbHkgZ2VuZXJhdGUgYSBudWxsIGNvbnN0YW50IGZvciB0aGlzIGNhc2UuCiAgICAgICAgY29uc3RhbnRWYWx1ZSA9IG5ldyBOdWxsQ29uc3RhbnRWYWx1ZSgpOwogICAgICB9CiAgICAgIGNvZGUgPSBqcy5qcygKICAgICAgICAgICJmdW5jdGlvbigpIHsgcmV0dXJuICM7IH0iLCBnZW5lcmF0ZUNvbnN0YW50UmVmZXJlbmNlKGNvbnN0YW50VmFsdWUpKTsKICAgIH0gZWxzZSB7CiAgICAgIFN0cmluZyB0ZW1wbGF0ZTsKICAgICAgaWYgKGZpZWxkLm5lZWRzSW50ZXJjZXB0ZWRHZXR0ZXJPblJlY2VpdmVyKSB7CiAgICAgICAgdGVtcGxhdGUgPSAiZnVuY3Rpb24ocmVjZWl2ZXIpIHsgcmV0dXJuIHJlY2VpdmVyWyNdOyB9IjsKICAgICAgfSBlbHNlIGlmIChmaWVsZC5uZWVkc0ludGVyY2VwdGVkR2V0dGVyT25UaGlzKSB7CiAgICAgICAgdGVtcGxhdGUgPSAiZnVuY3Rpb24ocmVjZWl2ZXIpIHsgcmV0dXJuIHRoaXNbI107IH0iOwogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydCghZmllbGQubmVlZHNJbnRlcmNlcHRlZEdldHRlcik7CiAgICAgICAgdGVtcGxhdGUgPSAiZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzWyNdOyB9IjsKICAgICAgfQogICAgICBqcy5FeHByZXNzaW9uIGZpZWxkTmFtZSA9IGpzLnF1b3RlTmFtZShmaWVsZC5uYW1lKTsKICAgICAgY29kZSA9IGpzLmpzKHRlbXBsYXRlLCBmaWVsZE5hbWUpOwogICAgfQogICAganMuTmFtZSBnZXR0ZXJOYW1lID0gbmFtZXIuZGVyaXZlR2V0dGVyTmFtZShmaWVsZC5hY2Nlc3Nvck5hbWUpOwogICAgcmV0dXJuIG5ldyBTdHViTWV0aG9kKGdldHRlck5hbWUsIGNvZGUpOwogIH0KCiAgLy8vIEdlbmVyYXRlcyBhIHNldHRlciBmb3IgdGhlIGdpdmVuIFtmaWVsZF0uCiAgTWV0aG9kIGdlbmVyYXRlU2V0dGVyKEZpZWxkIGZpZWxkKSB7CiAgICBhc3NlcnQoZmllbGQubmVlZHNVbmNoZWNrZWRTZXR0ZXIpOwoKICAgIFN0cmluZyB0ZW1wbGF0ZTsKICAgIGpzLkV4cHJlc3Npb24gY29kZTsKICAgIGlmIChmaWVsZC5pc0VsaWRlZCkgewogICAgICBjb2RlID0ganMuanMoImZ1bmN0aW9uKCkgeyB9Iik7CiAgICB9IGVsc2UgewogICAgICBpZiAoZmllbGQubmVlZHNJbnRlcmNlcHRlZFNldHRlck9uUmVjZWl2ZXIpIHsKICAgICAgICB0ZW1wbGF0ZSA9ICJmdW5jdGlvbihyZWNlaXZlciwgdmFsKSB7IHJldHVybiByZWNlaXZlclsjXSA9IHZhbDsgfSI7CiAgICAgIH0gZWxzZSBpZiAoZmllbGQubmVlZHNJbnRlcmNlcHRlZFNldHRlck9uVGhpcykgewogICAgICAgIHRlbXBsYXRlID0gImZ1bmN0aW9uKHJlY2VpdmVyLCB2YWwpIHsgcmV0dXJuIHRoaXNbI10gPSB2YWw7IH0iOwogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydCghZmllbGQubmVlZHNJbnRlcmNlcHRlZFNldHRlcik7CiAgICAgICAgdGVtcGxhdGUgPSAiZnVuY3Rpb24odmFsKSB7IHJldHVybiB0aGlzWyNdID0gdmFsOyB9IjsKICAgICAgfQogICAgICBqcy5FeHByZXNzaW9uIGZpZWxkTmFtZSA9IGpzLnF1b3RlTmFtZShmaWVsZC5uYW1lKTsKICAgICAgY29kZSA9IGpzLmpzKHRlbXBsYXRlLCBmaWVsZE5hbWUpOwogICAgfQoKICAgIGpzLk5hbWUgc2V0dGVyTmFtZSA9IG5hbWVyLmRlcml2ZVNldHRlck5hbWUoZmllbGQuYWNjZXNzb3JOYW1lKTsKICAgIHJldHVybiBuZXcgU3R1Yk1ldGhvZChzZXR0ZXJOYW1lLCBjb2RlKTsKICB9CgogIC8vLyBHZW5lcmF0ZXMgYWxsIGdldHRlcnMgYW5kIHNldHRlcnMgdGhlIGdpdmVuIGNsYXNzIFtjbHNdIG5lZWRzLgogIEl0ZXJhYmxlPE1ldGhvZD4gZ2VuZXJhdGVHZXR0ZXJzU2V0dGVycyhDbGFzcyBjbHMpIHsKICAgIEl0ZXJhYmxlPE1ldGhvZD4gZ2V0dGVycyA9IGNscy5maWVsZHMKICAgICAgICAud2hlcmUoKEZpZWxkIGZpZWxkKSA9PiBmaWVsZC5uZWVkc0dldHRlcikKICAgICAgICAubWFwKGdlbmVyYXRlR2V0dGVyKTsKCiAgICBJdGVyYWJsZTxNZXRob2Q+IHNldHRlcnMgPSBjbHMuZmllbGRzCiAgICAgICAgLndoZXJlKChGaWVsZCBmaWVsZCkgPT4gZmllbGQubmVlZHNVbmNoZWNrZWRTZXR0ZXIpCiAgICAgICAgLm1hcChnZW5lcmF0ZVNldHRlcik7CgogICAgcmV0dXJuIFtnZXR0ZXJzLCBzZXR0ZXJzXS5leHBhbmQoKHgpID0+IHgpOwogIH0KCiAgLy8vIEVtaXRzIHRoZSBnaXZlbiBpbnN0YW5jZSBbbWV0aG9kXS4KICAvLy8KICAvLy8gVGhlIGdpdmVuIG1ldGhvZCBtYXkgYmUgYSBzdHViLW1ldGhvZCAoZm9yIGV4YW1wbGUgZm9yIGlzLWNoZWNrcykuCiAgLy8vCiAgLy8vIElmIGl0IGlzIGEgRGFydC1tZXRob2QsIGFsbCBuZWNlc3Nhcnkgc3R1Yi1tZXRob2RzIGFyZSBlbWl0dGVkLCB0b28uIEluCiAgLy8vIHRoYXQgY2FzZSB0aGUgcmV0dXJuZWQgbWFwIGNvbnRhaW5zIG1vcmUgdGhhbiBqdXN0IG9uZSBlbnRyeS4KICAvLy8KICAvLy8gSWYgdGhlIG1ldGhvZCBpcyBhIGNsb3N1cmUgY2FsbC1tZXRob2QsIGFsc28gcmV0dXJucyB0aGUgbmVjZXNzYXJ5CiAgLy8vIHByb3BlcnRpZXMgaW4gY2FzZSB0aGUgY2xvc3VyZSBjYW4gYmUgYXBwbGllZC4KICBNYXA8anMuRXhwcmVzc2lvbiwganMuRXhwcmVzc2lvbj4gZW1pdEluc3RhbmNlTWV0aG9kKE1ldGhvZCBtZXRob2QpIHsKICAgIHZhciBwcm9wZXJ0aWVzID0gPGpzLkV4cHJlc3Npb24sIGpzLkV4cHJlc3Npb24+e307CgogICAgcHJvcGVydGllc1ttZXRob2QubmFtZV0gPSBtZXRob2QuY29kZTsKICAgIGlmIChtZXRob2QgaXMgSW5zdGFuY2VNZXRob2QpIHsKICAgICAgZm9yIChQYXJhbWV0ZXJTdHViTWV0aG9kIHN0dWJNZXRob2QgaW4gbWV0aG9kLnBhcmFtZXRlclN0dWJzKSB7CiAgICAgICAgcHJvcGVydGllc1tzdHViTWV0aG9kLm5hbWVdID0gc3R1Yk1ldGhvZC5jb2RlOwogICAgICB9CgogICAgICBpZiAobWV0aG9kLmlzQ2xvc3VyZUNhbGxNZXRob2QgJiYgbWV0aG9kLmNhbkJlQXBwbGllZCkgewogICAgICAgIC8vIFRPRE8oc3JhKTogV2Ugc2hvdWxkIGFsc28gYWRkIHRoZXNlIHByb3BlcnRpZXMgZm9yIHRoZSB1c2VyLWRlZmluZWQKICAgICAgICAvLyBgY2FsbGAgbWV0aG9kIG9uIGNsYXNzZXMuIEZ1bmN0aW9uLmFwcGx5IGlzIGN1cnJlbnRseSBicm9rZW4gZm9yCiAgICAgICAgLy8gY29tcGxleCBjYXNlcy4gW2ZvcmNlQWRkXSBtaWdodCBiZSB0cnVlIHdoZW4gdGhpcyBpcyBmaXhlZC4KICAgICAgICBib29sIGZvcmNlQWRkID0gIW1ldGhvZC5pc0Nsb3N1cmVDYWxsTWV0aG9kOwoKICAgICAgICAvLyBDb21tb24gY2FzZSBvZiAiY2FsbCoiOiAiY2FsbCQxIiBpcyBzdG9yZWQgb24gdGhlIENsb3N1cmUgY2xhc3MuCiAgICAgICAgaWYgKG1ldGhvZC5hcHBseUluZGV4ICE9IDAgfHwKICAgICAgICAgICAgbWV0aG9kLnBhcmFtZXRlclN0dWJzLmlzTm90RW1wdHkgfHwKICAgICAgICAgICAgbWV0aG9kLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgIT0gMSB8fAogICAgICAgICAgICBmb3JjZUFkZCkgewogICAgICAgICAganMuTmFtZSBhcHBseU5hbWUgPSBtZXRob2QuYXBwbHlJbmRleCA9PSAwCiAgICAgICAgICAgICAgPyBtZXRob2QubmFtZQogICAgICAgICAgICAgIDogbWV0aG9kLnBhcmFtZXRlclN0dWJzW21ldGhvZC5hcHBseUluZGV4IC0gMV0ubmFtZTsKICAgICAgICAgIHByb3BlcnRpZXNbanMuc3RyaW5nKG5hbWVyLmNhbGxDYXRjaEFsbE5hbWUpXSA9CiAgICAgICAgICAgICAganMucXVvdGVOYW1lKGFwcGx5TmFtZSk7CiAgICAgICAgfQogICAgICAgIC8vIENvbW1vbiBjYXNlIG9mICcxJyBpcyBzdG9yZWQgb24gdGhlIENsb3N1cmUgY2xhc3MuCiAgICAgICAgaWYgKG1ldGhvZC5yZXF1aXJlZFBhcmFtZXRlckNvdW50ICE9IDEgfHwgZm9yY2VBZGQpIHsKICAgICAgICAgIHByb3BlcnRpZXNbanMuc3RyaW5nKG5hbWVyLnJlcXVpcmVkUGFyYW1ldGVyRmllbGQpXSA9CiAgICAgICAgICAgICAganMubnVtYmVyKG1ldGhvZC5yZXF1aXJlZFBhcmFtZXRlckNvdW50KTsKICAgICAgICB9CgogICAgICAgIGpzLkV4cHJlc3Npb24gZGVmYXVsdFZhbHVlcyA9CiAgICAgICAgICAgIF9lbmNvZGVPcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMobWV0aG9kKTsKICAgICAgICAvLyBEZWZhdWx0IHZhbHVlcyBwcm9wZXJ0eSBvZiBgbnVsbGAgaXMgc3RvcmVkIG9uIHRoZSBjb21tb24gSlMKICAgICAgICAvLyBzdXBlcmNsYXNzLgogICAgICAgIGlmIChkZWZhdWx0VmFsdWVzIGlzISBqcy5MaXRlcmFsTnVsbCB8fCBmb3JjZUFkZCkgewogICAgICAgICAgcHJvcGVydGllc1tqcy5zdHJpbmcobmFtZXIuZGVmYXVsdFZhbHVlc0ZpZWxkKV0gPSBkZWZhdWx0VmFsdWVzOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHJldHVybiBwcm9wZXJ0aWVzOwogIH0KCiAgLy8vIEVtaXRzIHRoZSBpbmhlcml0YW5jZSBibG9jayBvZiB0aGUgZnJhZ21lbnQuCiAgLy8vCiAgLy8vIEluIHRoaXMgc2VjdGlvbiBwcm90b3R5cGUgY2hhaW5zIGFyZSB1cGRhdGVkIGFuZCBtaXhpbiBmdW5jdGlvbnMgYXJlCiAgLy8vIGNvcGllZC4KICBqcy5TdGF0ZW1lbnQgZW1pdEluaGVyaXRhbmNlKEZyYWdtZW50IGZyYWdtZW50LCB7Ym9vbCBzb2Z0RGVmZXJyZWQgPSBmYWxzZX0pIHsKICAgIExpc3Q8anMuU3RhdGVtZW50PiBpbmhlcml0Q2FsbHMgPSBbXTsKICAgIExpc3Q8anMuU3RhdGVtZW50PiBtaXhpbkNhbGxzID0gW107CiAgICAvLyBsb2NhbCBjYWNoZXMgb2YgZnVuY3Rpb25zIHRvIGFsbG93IG1pbmlmYWN0aW9uIG9mIGZ1bmN0aW9uIG5hbWUgaW4gY2FsbC4KICAgIExvY2FsQWxpYXNlcyBsb2NhbHMgPSBMb2NhbEFsaWFzZXMoKTsKCiAgICBTZXQ8Q2xhc3M+IGNsYXNzZXNJbkZyYWdtZW50ID0gU2V0KCk7CiAgICBmb3IgKExpYnJhcnkgbGlicmFyeSBpbiBmcmFnbWVudC5saWJyYXJpZXMpIHsKICAgICAgY2xhc3Nlc0luRnJhZ21lbnQuYWRkQWxsKGxpYnJhcnkuY2xhc3NlcwogICAgICAgICAgLndoZXJlKCgoQ2xhc3MgY2xzKSA9PiBjbHMuaXNTb2Z0RGVmZXJyZWQgPT0gc29mdERlZmVycmVkKSkpOwogICAgfQoKICAgIE1hcDxDbGFzcywgTGlzdDxDbGFzcz4+IHN1YmNsYXNzZXMgPSB7fTsKICAgIFNldDxDbGFzcz4gc2VlbiA9IFNldCgpOwoKICAgIHZvaWQgY29sbGVjdChjbHMpIHsKICAgICAgaWYgKGNscyA9PSBudWxsIHx8IHNlZW4uY29udGFpbnMoY2xzKSkgcmV0dXJuOwoKICAgICAgQ2xhc3Mgc3VwZXJjbGFzcyA9IGNscy5zdXBlcmNsYXNzOwogICAgICBpZiAoY2xhc3Nlc0luRnJhZ21lbnQuY29udGFpbnMoc3VwZXJjbGFzcykpIHsKICAgICAgICBjb2xsZWN0KHN1cGVyY2xhc3MpOwogICAgICB9CgogICAgICBzdWJjbGFzc2VzLnB1dElmQWJzZW50KHN1cGVyY2xhc3MsICgpID0+IDxDbGFzcz5bXSkuYWRkKGNscyk7CgogICAgICBzZWVuLmFkZChjbHMpOwogICAgfQoKICAgIGZvciAoTGlicmFyeSBsaWJyYXJ5IGluIGZyYWdtZW50LmxpYnJhcmllcykgewogICAgICBmb3IgKENsYXNzIGNscyBpbiBsaWJyYXJ5LmNsYXNzZXMpIHsKICAgICAgICBpZiAoY2xzLmlzU29mdERlZmVycmVkICE9IHNvZnREZWZlcnJlZCkgY29udGludWU7CiAgICAgICAgY29sbGVjdChjbHMpOwogICAgICAgIGlmIChjbHMubWl4aW5DbGFzcyAhPSBudWxsKSB7CiAgICAgICAgICBqcy5TdGF0ZW1lbnQgc3RhdGVtZW50ID0ganMuanMuc3RhdGVtZW50KCcjKCMsICMpJywgWwogICAgICAgICAgICBsb2NhbHMuZmluZCgnX21peGluJywgJ2h1bmtIZWxwZXJzLm1peGluJyksCiAgICAgICAgICAgIGNsYXNzUmVmZXJlbmNlKGNscyksCiAgICAgICAgICAgIGNsYXNzUmVmZXJlbmNlKGNscy5taXhpbkNsYXNzKSwKICAgICAgICAgIF0pOwogICAgICAgICAgcmVnaXN0ZXJFbnRpdHlBc3QoY2xzLmVsZW1lbnQsIHN0YXRlbWVudCwgbGlicmFyeTogbGlicmFyeS5lbGVtZW50KTsKICAgICAgICAgIG1peGluQ2FsbHMuYWRkKHN0YXRlbWVudCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZm9yIChDbGFzcyBzdXBlcmNsYXNzIGluIHN1YmNsYXNzZXMua2V5cykgewogICAgICBMaXN0PENsYXNzPiBsaXN0ID0gc3ViY2xhc3Nlc1tzdXBlcmNsYXNzXTsKICAgICAganMuRXhwcmVzc2lvbiBzdXBlcmNsYXNzUmVmZXJlbmNlID0gKHN1cGVyY2xhc3MgPT0gbnVsbCkKICAgICAgICAgID8gbmV3IGpzLkxpdGVyYWxOdWxsKCkKICAgICAgICAgIDogY2xhc3NSZWZlcmVuY2Uoc3VwZXJjbGFzcyk7CiAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PSAxKSB7CiAgICAgICAgQ2xhc3MgY2xzID0gbGlzdC5zaW5nbGU7CiAgICAgICAgdmFyIHN0YXRlbWVudCA9IGpzLmpzLnN0YXRlbWVudCgnIygjLCAjKScsIFsKICAgICAgICAgIGxvY2Fscy5maW5kKCdfaW5oZXJpdCcsICdodW5rSGVscGVycy5pbmhlcml0JyksCiAgICAgICAgICBjbGFzc1JlZmVyZW5jZShjbHMpLAogICAgICAgICAgc3VwZXJjbGFzc1JlZmVyZW5jZQogICAgICAgIF0pOwogICAgICAgIHJlZ2lzdGVyRW50aXR5QXN0KGNscy5lbGVtZW50LCBzdGF0ZW1lbnQsIGxpYnJhcnk6IGNscy5lbGVtZW50LmxpYnJhcnkpOwogICAgICAgIGluaGVyaXRDYWxscy5hZGQoc3RhdGVtZW50KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBMaXN0PGpzLkV4cHJlc3Npb24+IGxpc3RFbGVtZW50cyA9IFtdOwogICAgICAgIC8vIFNpbmNlIGluaGVyaXRNYW55IHNoYXJlcyB0aGUgc3VwZXJjbGFzcyByZWZlcmVuY2UsIHdlIGF0dHJpYnV0ZSBpdAogICAgICAgIC8vIG9ubHkgdG8gdGhlIGZpcnN0IHN1YmNsYXNzLgogICAgICAgIENsYXNzRW50aXR5IGZpcnN0Q2xhc3MgPSBsaXN0LmZpcnN0LmVsZW1lbnQ7CiAgICAgICAgcmVnaXN0ZXJFbnRpdHlBc3QoZmlyc3RDbGFzcywgc3VwZXJjbGFzc1JlZmVyZW5jZSwKICAgICAgICAgICAgbGlicmFyeTogZmlyc3RDbGFzcy5saWJyYXJ5KTsKICAgICAgICBmb3IgKENsYXNzIGNscyBpbiBsaXN0KSB7CiAgICAgICAgICBqcy5FeHByZXNzaW9uIHJlZmVyZW5jZSA9IGNsYXNzUmVmZXJlbmNlKGNscyk7CiAgICAgICAgICByZWdpc3RlckVudGl0eUFzdChjbHMuZWxlbWVudCwgcmVmZXJlbmNlLAogICAgICAgICAgICAgIGxpYnJhcnk6IGNscy5lbGVtZW50LmxpYnJhcnkpOwogICAgICAgICAgbGlzdEVsZW1lbnRzLmFkZChyZWZlcmVuY2UpOwogICAgICAgIH0KICAgICAgICBpbmhlcml0Q2FsbHMuYWRkKGpzLmpzLnN0YXRlbWVudCgnIygjLCAjKScsIFsKICAgICAgICAgIGxvY2Fscy5maW5kKCdfaW5oZXJpdE1hbnknLCAnaHVua0hlbHBlcnMuaW5oZXJpdE1hbnknKSwKICAgICAgICAgIHN1cGVyY2xhc3NSZWZlcmVuY2UsCiAgICAgICAgICBqcy5BcnJheUluaXRpYWxpemVyKGxpc3RFbGVtZW50cykKICAgICAgICBdKSk7CiAgICAgIH0KICAgIH0KCiAgICBMaXN0PGpzLlN0YXRlbWVudD4gc3RhdGVtZW50cyA9IFtdOwogICAgaWYgKGxvY2Fscy5pc05vdEVtcHR5KSB7CiAgICAgIHN0YXRlbWVudHMuYWRkKGxvY2Fscy50b1N0YXRlbWVudCgpKTsKICAgIH0KICAgIHN0YXRlbWVudHMuYWRkQWxsKGluaGVyaXRDYWxscyk7CiAgICBzdGF0ZW1lbnRzLmFkZEFsbChtaXhpbkNhbGxzKTsKICAgIHJldHVybiB3cmFwUGhhc2UoJ2luaGVyaXRhbmNlJywgc3RhdGVtZW50cyk7CiAgfQoKICAvLy8gRW1pdHMgdGhlIHNldHVwIG9mIG1ldGhvZCBhbGlhc2VzLgogIC8vLwogIC8vLyBUaGlzIHN0ZXAgY29uc2lzdHMgb2Ygc2ltcGx5IGNvcHlpbmcgSmF2YVNjcmlwdCBmdW5jdGlvbnMgdG8gdGhlaXIKICAvLy8gYWxpYXNlZCBuYW1lcyBzbyB0aGV5IHBvaW50IHRvIHRoZSBzYW1lIGZ1bmN0aW9uLgogIGpzLlN0YXRlbWVudCBlbWl0SW5zdGFuY2VNZXRob2RBbGlhc2VzKEZyYWdtZW50IGZyYWdtZW50LAogICAgICB7Ym9vbCBzb2Z0RGVmZXJyZWQgPSBmYWxzZX0pIHsKICAgIExpc3Q8anMuU3RhdGVtZW50PiBhc3NpZ25tZW50cyA9IFtdOwoKICAgIGZvciAoTGlicmFyeSBsaWJyYXJ5IGluIGZyYWdtZW50LmxpYnJhcmllcykgewogICAgICBmb3IgKENsYXNzIGNscyBpbiBsaWJyYXJ5LmNsYXNzZXMpIHsKICAgICAgICBpZiAoY2xzLmlzU29mdERlZmVycmVkICE9IHNvZnREZWZlcnJlZCkgY29udGludWU7CiAgICAgICAgYm9vbCBmaXJzdEFsaWFzID0gdHJ1ZTsKICAgICAgICBmb3IgKEluc3RhbmNlTWV0aG9kIG1ldGhvZCBpbiBjbHMubWV0aG9kcykgewogICAgICAgICAgaWYgKG1ldGhvZC5hbGlhc05hbWUgIT0gbnVsbCkgewogICAgICAgICAgICBpZiAoZmlyc3RBbGlhcykgewogICAgICAgICAgICAgIGZpcnN0QWxpYXMgPSBmYWxzZTsKICAgICAgICAgICAgICBqcy5TdGF0ZW1lbnQgc3RhdGVtZW50ID0ganMuanMuc3RhdGVtZW50KAogICAgICAgICAgICAgICAgICBhc3NpZ25tZW50cy5pc0VtcHR5CiAgICAgICAgICAgICAgICAgICAgICA/ICd2YXIgXyA9ICMucHJvdG90eXBlOycKICAgICAgICAgICAgICAgICAgICAgIDogJ18gPSAjLnByb3RvdHlwZScsCiAgICAgICAgICAgICAgICAgIGNsYXNzUmVmZXJlbmNlKGNscykpOwogICAgICAgICAgICAgIHJlZ2lzdGVyRW50aXR5QXN0KG1ldGhvZC5lbGVtZW50LCBzdGF0ZW1lbnQpOwogICAgICAgICAgICAgIGFzc2lnbm1lbnRzLmFkZChzdGF0ZW1lbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGpzLlN0YXRlbWVudCBzdGF0ZW1lbnQgPSBqcy5qcy5zdGF0ZW1lbnQoJ18uIyA9IF8uIycsCiAgICAgICAgICAgICAgICBbanMucXVvdGVOYW1lKG1ldGhvZC5hbGlhc05hbWUpLCBqcy5xdW90ZU5hbWUobWV0aG9kLm5hbWUpXSk7CiAgICAgICAgICAgIHJlZ2lzdGVyRW50aXR5QXN0KG1ldGhvZC5lbGVtZW50LCBzdGF0ZW1lbnQpOwogICAgICAgICAgICBhc3NpZ25tZW50cy5hZGQoc3RhdGVtZW50KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB3cmFwUGhhc2UoJ2FsaWFzZXMnLCBhc3NpZ25tZW50cyk7CiAgfQoKICAvLy8gRW5jb2RlcyB0aGUgb3B0aW9uYWwgZGVmYXVsdCB2YWx1ZXMgc28gdGhhdCB0aGUgcnVudGltZSBGdW5jdGlvbi5hcHBseQogIC8vLyBjYW4gdXNlIHRoZW0uCiAganMuRXhwcmVzc2lvbiBfZW5jb2RlT3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzKERhcnRNZXRob2QgbWV0aG9kKSB7CiAgICAvLyBUT0RPKGhlcmh1dCk6IFJlcGxhY2UgW2pzLkxpdGVyYWxOdWxsXSB3aXRoIFtqcy5BcnJheUhvbGVdLgogICAgaWYgKG1ldGhvZC5vcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMgaXMgTGlzdCkgewogICAgICBMaXN0PENvbnN0YW50VmFsdWU+IGRlZmF1bHRWYWx1ZXMgPSBtZXRob2Qub3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzOwogICAgICBpZiAoZGVmYXVsdFZhbHVlcy5pc0VtcHR5KSB7CiAgICAgICAgcmV0dXJuIG5ldyBqcy5MaXRlcmFsTnVsbCgpOwogICAgICB9CiAgICAgIEl0ZXJhYmxlPGpzLkV4cHJlc3Npb24+IGVsZW1lbnRzID0KICAgICAgICAgIGRlZmF1bHRWYWx1ZXMubWFwKGdlbmVyYXRlQ29uc3RhbnRSZWZlcmVuY2UpOwogICAgICByZXR1cm4ganMuanMoJ2Z1bmN0aW9uKCkgeyByZXR1cm4gIzsgfScsCiAgICAgICAgICBuZXcganMuQXJyYXlJbml0aWFsaXplcihlbGVtZW50cy50b0xpc3QoKSkpOwogICAgfSBlbHNlIHsKICAgICAgTWFwPFN0cmluZywgQ29uc3RhbnRWYWx1ZT4gZGVmYXVsdFZhbHVlcyA9CiAgICAgICAgICBtZXRob2Qub3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzOwogICAgICBMaXN0PGpzLlByb3BlcnR5PiBwcm9wZXJ0aWVzID0gW107CiAgICAgIExpc3Q8U3RyaW5nPiBuYW1lcyA9IGRlZmF1bHRWYWx1ZXMua2V5cy50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICAgICAgLy8gU29ydCB0aGUgbmFtZXMgdGhlIHNhbWUgd2F5IHdlIHNvcnQgdGhlbSBmb3IgdGhlIG5hbWVkLWFyZ3VtZW50IGNhbGxpbmcKICAgICAgLy8gY29udmVudGlvbi4KICAgICAgbmFtZXMuc29ydCgpOwoKICAgICAgZm9yIChTdHJpbmcgbmFtZSBpbiBuYW1lcykgewogICAgICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBkZWZhdWx0VmFsdWVzW25hbWVdOwogICAgICAgIHByb3BlcnRpZXMuYWRkKAogICAgICAgICAgICBuZXcganMuUHJvcGVydHkoanMuc3RyaW5nKG5hbWUpLCBnZW5lcmF0ZUNvbnN0YW50UmVmZXJlbmNlKHZhbHVlKSkpOwogICAgICB9CiAgICAgIHJldHVybiBqcy5qcygKICAgICAgICAgICdmdW5jdGlvbigpIHsgcmV0dXJuICM7IH0nLCBuZXcganMuT2JqZWN0SW5pdGlhbGl6ZXIocHJvcGVydGllcykpOwogICAgfQogIH0KCiAgLy8vIFdyYXBzIHRoZSBzdGF0ZW1lbnQgaW4gYSBuYW1lZCBmdW5jdGlvbiB0byB0aGF0IGl0IHNob3dzIHVwIGFzIGEgdW5pdCBpbgogIC8vLyBwcm9maWxlcy4KICAvLyBUT0RPKHNyYSk6IFNob3VsZCB0aGlzIGJlIGNvbmRpdGlvbmFsPwogIGpzLlN0YXRlbWVudCB3cmFwUGhhc2UoU3RyaW5nIG5hbWUsIExpc3Q8anMuU3RhdGVtZW50PiBzdGF0ZW1lbnRzKSB7CiAgICBqcy5CbG9jayBibG9jayA9IG5ldyBqcy5CbG9jayhzdGF0ZW1lbnRzKTsKICAgIGlmIChzdGF0ZW1lbnRzLmlzRW1wdHkpIHJldHVybiBibG9jazsKICAgIHJldHVybiBqcy5qcy5zdGF0ZW1lbnQoJyhmdW5jdGlvbiAjKCl7I30pKCk7JywgW25hbWUsIGJsb2NrXSk7CiAgfQoKICBib29sIGlzRW1wdHlTdGF0ZW1lbnQoanMuU3RhdGVtZW50IHN0YXRlbWVudCkgewogICAgaWYgKHN0YXRlbWVudCBpcyBqcy5CbG9jaykgewogICAgICByZXR1cm4gc3RhdGVtZW50LnN0YXRlbWVudHMuaXNFbXB0eTsKICAgIH0KICAgIHJldHVybiBzdGF0ZW1lbnQgaXMganMuRW1wdHlTdGF0ZW1lbnQ7CiAgfQoKICAvLy8gRW1pdHMgdGhlIHNlY3Rpb24gdGhhdCBpbnN0YWxscyB0ZWFyLW9mZiBnZXR0ZXJzLgogIGpzLlN0YXRlbWVudCBlbWl0SW5zdGFsbFRlYXJPZmZzKEZyYWdtZW50IGZyYWdtZW50LAogICAgICB7Ym9vbCBzb2Z0RGVmZXJyZWQgPSBmYWxzZX0pIHsKICAgIExvY2FsQWxpYXNlcyBsb2NhbHMgPSBMb2NhbEFsaWFzZXMoKTsKCiAgICAvLy8gRW1pdHMgdGhlIHN0YXRlbWVudCB0aGF0IGluc3RhbGxzIGEgdGVhciBvZmYgZm9yIGEgbWV0aG9kLgogICAgLy8vCiAgICAvLy8gVGVhci1vZmZzIG1pZ2h0IGJlIHBhc3NlZCB0byBgRnVuY3Rpb24uYXBwbHlgIHdoaWNoIG1lYW5zIHRoYXQgYWxsCiAgICAvLy8gY2FsbGluZy1jb252ZW50aW9ucyAod2l0aCBvciB3aXRob3V0IG9wdGlvbmFsIHBvc2l0aW9uYWwvbmFtZWQKICAgIC8vLyBhcmd1bWVudHMpIGFyZSBwb3NzaWJsZS4gQXMgc3VjaCwgdGhlIHRlYXItb2ZmIG5lZWRzIGVub3VnaCBpbmZvcm1hdGlvbgogICAgLy8vIHRvIGZpbGwgaW4gbWlzc2luZyBwYXJhbWV0ZXJzLgogICAganMuU3RhdGVtZW50IGVtaXRJbnN0YWxsVGVhck9mZigKICAgICAgICBqcy5FeHByZXNzaW9uIGNvbnRhaW5lciwgRGFydE1ldGhvZCBtZXRob2QpIHsKICAgICAgTGlzdDxqcy5OYW1lPiBjYWxsTmFtZXMgPSBbXTsKICAgICAgTGlzdDxqcy5FeHByZXNzaW9uPiBmdW5zT3JOYW1lcyA9IFtdOwoKICAgICAgLy8vIEFkZHMgdGhlIHN0dWItbWV0aG9kJ3MgY29kZSBvciBuYW1lIHRvIHRoZSBbZnVuc09yTmFtZXNdIGFycmF5LgogICAgICAvLy8KICAgICAgLy8vIFN0YXRpYyBtZXRob2RzIGRvbid0IG5lZWQgc3R1Yi1tZXRob2RzIGV4Y2VwdCBmb3IgdGVhci1vZmZzLiBBcyBzdWNoLAogICAgICAvLy8gdGhleSBhcmUgbm90IGVtaXR0ZWQgaW4gdGhlIHByb3RvdHlwZSwgYnV0IGRpcmVjdGx5IHBhc3NlZCBoZXJlLgogICAgICAvLy8KICAgICAgLy8vIEluc3RhbmNlLW1ldGhvZHMgaW5zdGFsbCB0aGUgc3R1Yi1tZXRob2RzIGluIHRoZWlyIHByb3RvdHlwZSwgYW5kIHdlCiAgICAgIC8vLyB1c2Ugc3RyaW5nLWJhc2VkIHJlZGlyZWN0aW9ucyB0byBmaW5kIHRoZW0gdGhlcmUuCiAgICAgIHZvaWQgYWRkRnVuT3JOYW1lKFN0dWJNZXRob2Qgc3R1Yk1ldGhvZCkgewogICAgICAgIGlmIChtZXRob2QuaXNTdGF0aWMpIHsKICAgICAgICAgIGZ1bnNPck5hbWVzLmFkZChzdHViTWV0aG9kLmNvZGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmdW5zT3JOYW1lcy5hZGQoanMucXVvdGVOYW1lKHN0dWJNZXRob2QubmFtZSkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgY2FsbE5hbWVzLmFkZChtZXRob2QuY2FsbE5hbWUpOwogICAgICAvLyBUaGUgZmlyc3QgZW50cnkgaW4gdGhlIGZ1bnNPck5hbWVzLWFycmF5IG11c3QgYmUgYSBzdHJpbmcuCiAgICAgIGZ1bnNPck5hbWVzLmFkZChqcy5xdW90ZU5hbWUobWV0aG9kLm5hbWUpKTsKICAgICAgZm9yIChQYXJhbWV0ZXJTdHViTWV0aG9kIHN0dWJNZXRob2QgaW4gbWV0aG9kLnBhcmFtZXRlclN0dWJzKSB7CiAgICAgICAgY2FsbE5hbWVzLmFkZChzdHViTWV0aG9kLmNhbGxOYW1lKTsKICAgICAgICBhZGRGdW5Pck5hbWUoc3R1Yk1ldGhvZCk7CiAgICAgIH0KCiAgICAgIGpzLkFycmF5SW5pdGlhbGl6ZXIgY2FsbE5hbWVBcnJheSA9CiAgICAgICAgICBuZXcganMuQXJyYXlJbml0aWFsaXplcihjYWxsTmFtZXMubWFwKGpzLnF1b3RlTmFtZSkudG9MaXN0KCkpOwogICAgICBqcy5BcnJheUluaXRpYWxpemVyIGZ1bnNPck5hbWVzQXJyYXkgPQogICAgICAgICAgbmV3IGpzLkFycmF5SW5pdGlhbGl6ZXIoZnVuc09yTmFtZXMpOwoKICAgICAgYm9vbCBpc0ludGVyY2VwdGVkID0gZmFsc2U7CiAgICAgIGlmIChtZXRob2QgaXMgSW5zdGFuY2VNZXRob2QpIHsKICAgICAgICBpc0ludGVyY2VwdGVkID0gbWV0aG9kLmlzSW50ZXJjZXB0ZWQ7CiAgICAgIH0KCiAgICAgIGludCByZXF1aXJlZFBhcmFtZXRlckNvdW50ID0gbWV0aG9kLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQ7CiAgICAgIGpzLkV4cHJlc3Npb24gb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzID0gbmV3IGpzLkxpdGVyYWxOdWxsKCk7CiAgICAgIGlmIChtZXRob2QuY2FuQmVBcHBsaWVkKSB7CiAgICAgICAgb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzID0KICAgICAgICAgICAgX2VuY29kZU9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcyhtZXRob2QpOwogICAgICB9CgogICAgICB2YXIgYXBwbHlJbmRleCA9IGpzLm51bWJlcihtZXRob2QuYXBwbHlJbmRleCk7CgogICAgICBpZiAobWV0aG9kLmlzU3RhdGljKSB7CiAgICAgICAgaWYgKHJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPD0gMiAmJgogICAgICAgICAgICBjYWxsTmFtZXMubGVuZ3RoID09IDEgJiYKICAgICAgICAgICAgb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzIGlzIGpzLkxpdGVyYWxOdWxsICYmCiAgICAgICAgICAgIG1ldGhvZC5hcHBseUluZGV4ID09IDApIHsKICAgICAgICAgIGpzLlN0YXRlbWVudCBmaW5pc2goaW50IGFyaXR5KSB7CiAgICAgICAgICAgIC8vIFNob3J0IGZvcm0gZm9yIGV4YWN0bHkgMC8xLzIgYXJndW1lbnRzLgogICAgICAgICAgICB2YXIgaW5zdGFsbCA9CiAgICAgICAgICAgICAgICBsb2NhbHMuZmluZCgnX3N0YXRpY18ke2FyaXR5fScsICdodW5rSGVscGVycy5fc3RhdGljXyR7YXJpdHl9Jyk7CiAgICAgICAgICAgIHJldHVybiBqcy5qcy5zdGF0ZW1lbnQoJycnCiAgICAgICAgICAgICAgICAjaW5zdGFsbCgjY29udGFpbmVyLCAjZ2V0dGVyTmFtZSwgI25hbWUsICNmdW5UeXBlKScnJywgewogICAgICAgICAgICAgICJpbnN0YWxsIjogaW5zdGFsbCwKICAgICAgICAgICAgICAiY29udGFpbmVyIjogY29udGFpbmVyLAogICAgICAgICAgICAgICJnZXR0ZXJOYW1lIjoganMucXVvdGVOYW1lKG1ldGhvZC50ZWFyT2ZmTmFtZSksCiAgICAgICAgICAgICAgIm5hbWUiOiBmdW5zT3JOYW1lcy5zaW5nbGUsCiAgICAgICAgICAgICAgImZ1blR5cGUiOiBtZXRob2QuZnVuY3Rpb25UeXBlLAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KCiAgICAgICAgICB2YXIgaW5zdGFsbGVkTmFtZSA9IGNhbGxOYW1lcy5zaW5nbGU7CiAgICAgICAgICBpZiAoaW5zdGFsbGVkTmFtZSA9PSBjYWxsME5hbWUpIHJldHVybiBmaW5pc2goMCk7CiAgICAgICAgICBpZiAoaW5zdGFsbGVkTmFtZSA9PSBjYWxsMU5hbWUpIHJldHVybiBmaW5pc2goMSk7CiAgICAgICAgICBpZiAoaW5zdGFsbGVkTmFtZSA9PSBjYWxsMk5hbWUpIHJldHVybiBmaW5pc2goMik7CiAgICAgICAgfQoKICAgICAgICB2YXIgaW5zdGFsbCA9CiAgICAgICAgICAgIGxvY2Fscy5maW5kKCdfc3RhdGljJywgJ2h1bmtIZWxwZXJzLmluc3RhbGxTdGF0aWNUZWFyT2ZmJyk7CiAgICAgICAgcmV0dXJuIGpzLmpzLnN0YXRlbWVudCgnJycKICAgICAgICAgICAgI2luc3RhbGwoI2NvbnRhaW5lciwgI2dldHRlck5hbWUsCiAgICAgICAgICAgICAgICAgICAgICNyZXF1aXJlZFBhcmFtZXRlckNvdW50LCAjb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzLAogICAgICAgICAgICAgICAgICAgICAgI2NhbGxOYW1lcywgI2Z1bnNPck5hbWVzLCAjZnVuVHlwZSwgI2FwcGx5SW5kZXgpJycnLCB7CiAgICAgICAgICAiaW5zdGFsbCI6IGluc3RhbGwsCiAgICAgICAgICAiY29udGFpbmVyIjogY29udGFpbmVyLAogICAgICAgICAgImdldHRlck5hbWUiOiBqcy5xdW90ZU5hbWUobWV0aG9kLnRlYXJPZmZOYW1lKSwKICAgICAgICAgICJyZXF1aXJlZFBhcmFtZXRlckNvdW50IjoganMubnVtYmVyKHJlcXVpcmVkUGFyYW1ldGVyQ291bnQpLAogICAgICAgICAgIm9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcyI6IG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcywKICAgICAgICAgICJjYWxsTmFtZXMiOiBjYWxsTmFtZUFycmF5LAogICAgICAgICAgImZ1bnNPck5hbWVzIjogZnVuc09yTmFtZXNBcnJheSwKICAgICAgICAgICJmdW5UeXBlIjogbWV0aG9kLmZ1bmN0aW9uVHlwZSwKICAgICAgICAgICJhcHBseUluZGV4IjogYXBwbHlJbmRleCwKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAocmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA8PSAyICYmCiAgICAgICAgICAgIGNhbGxOYW1lcy5sZW5ndGggPT0gMSAmJgogICAgICAgICAgICBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMgaXMganMuTGl0ZXJhbE51bGwgJiYKICAgICAgICAgICAgbWV0aG9kLmFwcGx5SW5kZXggPT0gMCkgewogICAgICAgICAganMuU3RhdGVtZW50IGZpbmlzaChpbnQgYXJpdHkpIHsKICAgICAgICAgICAgLy8gU2hvcnQgZm9ybSBmb3IgZXhhY3RseSAwLzEvMiBhcmd1bWVudHMuCiAgICAgICAgICAgIFN0cmluZyBpc0ludGVyY2VwdGVkVGFnID0gaXNJbnRlcmNlcHRlZCA/ICdpJyA6ICd1JzsKICAgICAgICAgICAgdmFyIGluc3RhbGwgPSBsb2NhbHMuZmluZCgnX2luc3RhbmNlXyR7YXJpdHl9XyR7aXNJbnRlcmNlcHRlZFRhZ30nLAogICAgICAgICAgICAgICAgJ2h1bmtIZWxwZXJzLl9pbnN0YW5jZV8ke2FyaXR5fSR7aXNJbnRlcmNlcHRlZFRhZ30nKTsKICAgICAgICAgICAgcmV0dXJuIGpzLmpzLnN0YXRlbWVudCgnJycKICAgICAgICAgICAgICAgICNpbnN0YWxsKCNjb250YWluZXIsICNnZXR0ZXJOYW1lLCAjbmFtZSwgI2Z1blR5cGUpJycnLCB7CiAgICAgICAgICAgICAgImluc3RhbGwiOiBpbnN0YWxsLAogICAgICAgICAgICAgICJjb250YWluZXIiOiBjb250YWluZXIsCiAgICAgICAgICAgICAgImdldHRlck5hbWUiOiBqcy5xdW90ZU5hbWUobWV0aG9kLnRlYXJPZmZOYW1lKSwKICAgICAgICAgICAgICAibmFtZSI6IGZ1bnNPck5hbWVzLnNpbmdsZSwKICAgICAgICAgICAgICAiZnVuVHlwZSI6IG1ldGhvZC5mdW5jdGlvblR5cGUsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQoKICAgICAgICAgIHZhciBpbnN0YWxsZWROYW1lID0gY2FsbE5hbWVzLnNpbmdsZTsKICAgICAgICAgIGlmIChpbnN0YWxsZWROYW1lID09IGNhbGwwTmFtZSkgcmV0dXJuIGZpbmlzaCgwKTsKICAgICAgICAgIGlmIChpbnN0YWxsZWROYW1lID09IGNhbGwxTmFtZSkgcmV0dXJuIGZpbmlzaCgxKTsKICAgICAgICAgIGlmIChpbnN0YWxsZWROYW1lID09IGNhbGwyTmFtZSkgcmV0dXJuIGZpbmlzaCgyKTsKICAgICAgICB9CgogICAgICAgIHZhciBpbnN0YWxsID0KICAgICAgICAgICAgbG9jYWxzLmZpbmQoJ19pbnN0YW5jZScsICdodW5rSGVscGVycy5pbnN0YWxsSW5zdGFuY2VUZWFyT2ZmJyk7CiAgICAgICAgcmV0dXJuIGpzLmpzLnN0YXRlbWVudCgnJycKICAgICAgICAgICAgI2luc3RhbGwoI2NvbnRhaW5lciwgI2dldHRlck5hbWUsICNpc0ludGVyY2VwdGVkLAogICAgICAgICAgICAgICAgICAgICAjcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwgI29wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcywKICAgICAgICAgICAgICAgICAgICAgI2NhbGxOYW1lcywgI2Z1bnNPck5hbWVzLCAjZnVuVHlwZSwgI2FwcGx5SW5kZXgpJycnLCB7CiAgICAgICAgICAiaW5zdGFsbCI6IGluc3RhbGwsCiAgICAgICAgICAiY29udGFpbmVyIjogY29udGFpbmVyLAogICAgICAgICAgImdldHRlck5hbWUiOiBqcy5xdW90ZU5hbWUobWV0aG9kLnRlYXJPZmZOYW1lKSwKICAgICAgICAgIC8vICdUcnV0aHknIHZhbHVlcyBhcmUgb2sgZm9yIGBpc0ludGVyY2VwdGVkYC4KICAgICAgICAgICJpc0ludGVyY2VwdGVkIjoganMubnVtYmVyKGlzSW50ZXJjZXB0ZWQgPyAxIDogMCksCiAgICAgICAgICAicmVxdWlyZWRQYXJhbWV0ZXJDb3VudCI6IGpzLm51bWJlcihyZXF1aXJlZFBhcmFtZXRlckNvdW50KSwKICAgICAgICAgICJvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMiOiBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMsCiAgICAgICAgICAiY2FsbE5hbWVzIjogY2FsbE5hbWVBcnJheSwKICAgICAgICAgICJmdW5zT3JOYW1lcyI6IGZ1bnNPck5hbWVzQXJyYXksCiAgICAgICAgICAiZnVuVHlwZSI6IG1ldGhvZC5mdW5jdGlvblR5cGUsCiAgICAgICAgICAiYXBwbHlJbmRleCI6IGFwcGx5SW5kZXgsCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KCiAgICBMaXN0PGpzLlN0YXRlbWVudD4gaW5pdHMgPSBbXTsKICAgIGpzLkV4cHJlc3Npb24gdGVtcDsKCiAgICBmb3IgKExpYnJhcnkgbGlicmFyeSBpbiBmcmFnbWVudC5saWJyYXJpZXMpIHsKICAgICAgZm9yIChTdGF0aWNNZXRob2QgbWV0aG9kIGluIGxpYnJhcnkuc3RhdGljcykgewogICAgICAgIC8vIFRPRE8oZmxvaXRzY2gpOiBjYW4gdGhlcmUgYmUgYW55dGhpbmcgZWxzZSB0aGFuIGEgU3RhdGljRGFydE1ldGhvZD8KICAgICAgICBpZiAobWV0aG9kIGlzIFN0YXRpY0RhcnRNZXRob2QpIHsKICAgICAgICAgIGlmIChtZXRob2QubmVlZHNUZWFyT2ZmKSB7CiAgICAgICAgICAgIEhvbGRlciBob2xkZXIgPSBtZXRob2QuaG9sZGVyOwogICAgICAgICAgICBqcy5TdGF0ZW1lbnQgc3RhdGVtZW50ID0KICAgICAgICAgICAgICAgIGVtaXRJbnN0YWxsVGVhck9mZihuZXcganMuVmFyaWFibGVVc2UoaG9sZGVyLm5hbWUpLCBtZXRob2QpOwogICAgICAgICAgICByZWdpc3RlckVudGl0eUFzdChtZXRob2QuZWxlbWVudCwgc3RhdGVtZW50LAogICAgICAgICAgICAgICAgbGlicmFyeTogbGlicmFyeS5lbGVtZW50KTsKICAgICAgICAgICAgaW5pdHMuYWRkKHN0YXRlbWVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAoQ2xhc3MgY2xzIGluIGxpYnJhcnkuY2xhc3NlcykgewogICAgICAgIGlmIChjbHMuaXNTb2Z0RGVmZXJyZWQgIT0gc29mdERlZmVycmVkKSBjb250aW51ZTsKICAgICAgICB2YXIgbWV0aG9kcyA9IGNscy5tZXRob2RzLndoZXJlKChkeW5hbWljIG0pID0+IG0ubmVlZHNUZWFyT2ZmKS50b0xpc3QoKTsKICAgICAgICBqcy5FeHByZXNzaW9uIGNvbnRhaW5lciA9IGpzLmpzKCIjLnByb3RvdHlwZSIsIGNsYXNzUmVmZXJlbmNlKGNscykpOwogICAgICAgIGpzLkV4cHJlc3Npb24gcmVmZXJlbmNlID0gY29udGFpbmVyOwogICAgICAgIGlmIChtZXRob2RzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgIGlmICh0ZW1wID09IG51bGwpIHsKICAgICAgICAgICAgaW5pdHMuYWRkKGpzLmpzLnN0YXRlbWVudCgndmFyIF87JykpOwogICAgICAgICAgICB0ZW1wID0ganMuanMoJ18nKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEZpcnN0IGNhbGwgdXNlcyBhc3NpZ25tZW50IHRvIHRlbXAgdG8gY2FjaGUgdGhlIGNvbnRhaW5lci4KICAgICAgICAgIHJlZmVyZW5jZSA9IGpzLmpzKCcjID0gIycsIFt0ZW1wLCBjb250YWluZXJdKTsKICAgICAgICB9CiAgICAgICAgZm9yIChJbnN0YW5jZU1ldGhvZCBtZXRob2QgaW4gbWV0aG9kcykgewogICAgICAgICAganMuU3RhdGVtZW50IHN0YXRlbWVudCA9IGVtaXRJbnN0YWxsVGVhck9mZihyZWZlcmVuY2UsIG1ldGhvZCk7CiAgICAgICAgICByZWdpc3RlckVudGl0eUFzdChtZXRob2QuZWxlbWVudCwgc3RhdGVtZW50KTsKICAgICAgICAgIGluaXRzLmFkZChzdGF0ZW1lbnQpOwogICAgICAgICAgcmVmZXJlbmNlID0gdGVtcDsgLy8gU2Vjb25kIGFuZCBzdWJzZXF1ZW50IGNhbGxzIHVzZSB0ZW1wLgogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmIChsb2NhbHMuaXNOb3RFbXB0eSkgewogICAgICBpbml0cy5pbnNlcnQoMCwgbG9jYWxzLnRvU3RhdGVtZW50KCkpOwogICAgfQoKICAgIHJldHVybiB3cmFwUGhhc2UoJ2luc3RhbGxUZWFyT2ZmcycsIGluaXRzKTsKICB9CgogIC8vLyBFbWl0cyB0aGUgY29uc3RhbnRzIHNlY3Rpb24uCiAganMuU3RhdGVtZW50IGVtaXRDb25zdGFudHMoRnJhZ21lbnQgZnJhZ21lbnQpIHsKICAgIExpc3Q8anMuU3RhdGVtZW50PiBhc3NpZ25tZW50cyA9IFtdOwogICAgYm9vbCBoYXNMaXN0ID0gZmFsc2U7CiAgICBmb3IgKENvbnN0YW50IGNvbnN0YW50IGluIGZyYWdtZW50LmNvbnN0YW50cykgewogICAgICAvLyBUT0RPKDI1MjMwKTogV2Ugb25seSBuZWVkIHRvIG5hbWUgY29uc3RhbnRzIHRoYXQgYXJlIHVzZWQgZnJvbSBmdW5jdGlvbgogICAgICAvLyBib2RpZXMgb3IgZnJvbSBvdGhlciBjb25zdGFudHMgaW4gYSBkaWZmZXJlbnQgcGFydC4KICAgICAgdmFyIGFzc2lnbm1lbnQgPSBqcy5qcy5zdGF0ZW1lbnQoJyMuIyA9ICMnLCBbCiAgICAgICAgY29uc3RhbnQuaG9sZGVyLm5hbWUsCiAgICAgICAgY29uc3RhbnQubmFtZSwKICAgICAgICBjb25zdGFudEVtaXR0ZXIuZ2VuZXJhdGUoY29uc3RhbnQudmFsdWUpCiAgICAgIF0pOwogICAgICBjb21waWxlci5kdW1wSW5mb1Rhc2sucmVnaXN0ZXJDb25zdGFudEFzdChjb25zdGFudC52YWx1ZSwgYXNzaWdubWVudCk7CiAgICAgIGFzc2lnbm1lbnRzLmFkZChhc3NpZ25tZW50KTsKICAgICAgaWYgKGNvbnN0YW50LnZhbHVlLmlzTGlzdCkgaGFzTGlzdCA9IHRydWU7CiAgICB9CiAgICBpZiAoaGFzTGlzdCkgewogICAgICBhc3NpZ25tZW50cy5pbnNlcnQoCiAgICAgICAgICAwLCBqcy5qcy5zdGF0ZW1lbnQoJ3ZhciBtYWtlQ29uc3RMaXN0ID0gaHVua0hlbHBlcnMubWFrZUNvbnN0TGlzdDsnKSk7CiAgICB9CiAgICByZXR1cm4gd3JhcFBoYXNlKCdjb25zdGFudHMnLCBhc3NpZ25tZW50cyk7CiAgfQoKICAvLy8gRW1pdHMgdGhlIHN0YXRpYyBub24tZmluYWwgZmllbGRzIHNlY3Rpb24uCiAgLy8vCiAgLy8vIFRoaXMgc2VjdGlvbiBpbml0aWFsaXplcyBhbGwgc3RhdGljIG5vbi1maW5hbCBmaWVsZHMgdGhhdCBkb24ndCByZXF1aXJlCiAgLy8vIGFuIGluaXRpYWxpemVyLgogIGpzLlN0YXRlbWVudCBlbWl0U3RhdGljTm9uRmluYWxGaWVsZHMoRnJhZ21lbnQgZnJhZ21lbnQpIHsKICAgIExpc3Q8U3RhdGljRmllbGQ+IGZpZWxkcyA9IGZyYWdtZW50LnN0YXRpY05vbkZpbmFsRmllbGRzOwogICAgLy8gVE9ETyhzcmEpOiBDaGFpbiBhc3NpZ25tZW50cyB0aGF0IGhhdmUgdGhlIHNhbWUgdmFsdWUsIGkuZS4KICAgIC8vCiAgICAvLyAgICAkLnggPSBudWxsOyAkLnkgPSBudWxsOyAkLnogPSBudWxsOwogICAgLy8gLS0+CiAgICAvLyAgICAkLnogPSAkLnkgPSAkLnggPSBudWxsOwogICAgLy8KICAgIEl0ZXJhYmxlPGpzLlN0YXRlbWVudD4gc3RhdGVtZW50cyA9IGZpZWxkcy5tYXAoKFN0YXRpY0ZpZWxkIGZpZWxkKSB7CiAgICAgIGFzc2VydChmaWVsZC5ob2xkZXIuaXNTdGF0aWNTdGF0ZUhvbGRlcik7CiAgICAgIGpzLlN0YXRlbWVudCBzdGF0ZW1lbnQ7CiAgICAgIGlmIChmaWVsZC5pc0luaXRpYWxpemVkQnlDb25zdGFudCkgewogICAgICAgIHN0YXRlbWVudCA9IGpzLmpzCiAgICAgICAgICAgIC5zdGF0ZW1lbnQoIiMuIyA9ICM7IiwgW2ZpZWxkLmhvbGRlci5uYW1lLCBmaWVsZC5uYW1lLCBmaWVsZC5jb2RlXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVGhpcyBpcyBhIGJpdCBvZiBhIGhhY2suIEZpZWxkIGluaXRpYWxpemVycyBhcmUgZ2VuZXJhdGVkIGFzIGEKICAgICAgICAvLyBmdW5jdGlvbiBlbmRpbmcgd2l0aCBhIHJldHVybiBzdGF0ZW1lbnQuIFdlIHJlcGxhY2UgdGhlIGZ1bmN0aW9uCiAgICAgICAgLy8gd2l0aCB0aGUgYm9keSBibG9jayBhbmQgcmVwbGFjZSB0aGUgcmV0dXJuIHN0YXRlbWVudCB3aXRoIGFuCiAgICAgICAgLy8gYXNzaWdubWVudCB0byB0aGUgZmllbGQuCiAgICAgICAgLy8KICAgICAgICAvLyBTaW5jZSB1bm5lZWRlZCBibG9ja3MgYXJlIG5vdCBnZW5lcmF0ZWQgaW4gdGhlIG91dHB1dCwKICAgICAgICAvLyB0aGUgc3RhdGVtZW50KHMpIG9mIHRoZSBpbml0aWFsaXplcyBhcmUgaW5saW5lZCBpbiB0aGUgZW1pdHRlZCBjb2RlLgogICAgICAgIC8vCiAgICAgICAgLy8gVGhpcyBpcyBhIGNoZWFwIHdheSBvZiBzdXBwb3J0aW5nIGVhZ2VyIGZpZWxkcyAoYXMgb3Bwb3NlZCB0bwogICAgICAgIC8vIGdlbmVyYXRpbmcgb25lIFNTQSBncmFwaCBmb3IgYWxsIGVhZ2VyIGZpZWxkcykgdGhvdWdoIGl0IGRvZXMgbm90CiAgICAgICAgLy8gYXZvaWQgcmVkdW5kYW50IGRlY2xhcmF0aW9uIG9mIGxvY2FsIHZhcmlhYmxlLCBmb3IgaW5zdGFuY2UgZm9yCiAgICAgICAgLy8gdHlwZSBhcmd1bWVudHMuCiAgICAgICAganMuRnVuIGNvZGUgPSBmaWVsZC5jb2RlOwogICAgICAgIGlmIChjb2RlLnBhcmFtcy5pc0VtcHR5ICYmCiAgICAgICAgICAgIGNvZGUuYm9keS5zdGF0ZW1lbnRzLmxlbmd0aCA9PSAxICYmCiAgICAgICAgICAgIGNvZGUuYm9keS5zdGF0ZW1lbnRzLmxhc3QgaXMganMuUmV0dXJuKSB7CiAgICAgICAgICAvLyBGb3Igbm93IHdlIG9ubHkgc3VwcG9ydCBpbml0aWFsaXplcnMgb2YgdGhlIGZvcm0KICAgICAgICAgIC8vCiAgICAgICAgICAvLyAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gZTsgfQogICAgICAgICAgLy8KICAgICAgICAgIC8vIFRvIGF2b2lkIHVuZm9yZXNlZW4gY29uc2VxdWVuY2VzIG9mIGhhdmluZyBwYXJhbWV0ZXJzIGFuZCBsb2NhbHMKICAgICAgICAgIC8vIGluIHRoZSBpbml0aWFsaXplciBjb2RlLgogICAgICAgICAganMuUmV0dXJuIGxhc3QgPSBjb2RlLmJvZHkuc3RhdGVtZW50cy5sYXN0OwogICAgICAgICAgc3RhdGVtZW50ID0ganMuanMuc3RhdGVtZW50KAogICAgICAgICAgICAgICIjLiMgPSAjOyIsIFtmaWVsZC5ob2xkZXIubmFtZSwgZmllbGQubmFtZSwgbGFzdC52YWx1ZV0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBTYWZlIGZhbGxiYWNrIGluIHRoZSBldmVudCBvZiBhIGZpZWxkIGluaXRpYWxpemVyIHdpdGggbm8gcmV0dXJuCiAgICAgICAgICAvLyBzdGF0ZW1lbnQgYXMgdGhlIGxhc3Qgc3RhdGVtZW50LgogICAgICAgICAgc3RhdGVtZW50ID0ganMuanMKICAgICAgICAgICAgICAuc3RhdGVtZW50KCIjLiMgPSAjKCk7IiwgW2ZpZWxkLmhvbGRlci5uYW1lLCBmaWVsZC5uYW1lLCBjb2RlXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJlZ2lzdGVyRW50aXR5QXN0KGZpZWxkLmVsZW1lbnQsIHN0YXRlbWVudCwKICAgICAgICAgIGxpYnJhcnk6IGZpZWxkLmVsZW1lbnQubGlicmFyeSk7CiAgICAgIHJldHVybiBzdGF0ZW1lbnQ7CiAgICB9KTsKICAgIHJldHVybiB3cmFwUGhhc2UoJ3N0YXRpY0ZpZWxkcycsIHN0YXRlbWVudHMudG9MaXN0KCkpOwogIH0KCiAgLy8vIEVtaXRzIGxhenkgZmllbGRzLgogIC8vLwogIC8vLyBUaGlzIHNlY3Rpb24gaW5pdGlhbGl6ZXMgYWxsIHN0YXRpYyAoZmluYWwgYW5kIG5vbi1maW5hbCkgZmllbGRzIHRoYXQKICAvLy8gcmVxdWlyZSBhbiBpbml0aWFsaXplci4KICBqcy5TdGF0ZW1lbnQgZW1pdExhemlseUluaXRpYWxpemVkU3RhdGljcyhGcmFnbWVudCBmcmFnbWVudCkgewogICAgTGlzdDxTdGF0aWNGaWVsZD4gZmllbGRzID0gZnJhZ21lbnQuc3RhdGljTGF6aWx5SW5pdGlhbGl6ZWRGaWVsZHM7CiAgICBMaXN0PGpzLlN0YXRlbWVudD4gc3RhdGVtZW50cyA9IFtdOwogICAgTG9jYWxBbGlhc2VzIGxvY2FscyA9IExvY2FsQWxpYXNlcygpOwogICAgZm9yIChTdGF0aWNGaWVsZCBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgYXNzZXJ0KGZpZWxkLmhvbGRlci5pc1N0YXRpY1N0YXRlSG9sZGVyKTsKICAgICAganMuU3RhdGVtZW50IHN0YXRlbWVudCA9IGpzLmpzLnN0YXRlbWVudCgiIygjLCAjLCAjLCAjKTsiLCBbCiAgICAgICAgbG9jYWxzLmZpbmQoJ19sYXp5JywgJ2h1bmtIZWxwZXJzLmxhenknKSwKICAgICAgICBmaWVsZC5ob2xkZXIubmFtZSwKICAgICAgICBqcy5xdW90ZU5hbWUoZmllbGQubmFtZSksCiAgICAgICAganMucXVvdGVOYW1lKGZpZWxkLmdldHRlck5hbWUpLAogICAgICAgIGZpZWxkLmNvZGUKICAgICAgXSk7CgogICAgICByZWdpc3RlckVudGl0eUFzdChmaWVsZC5lbGVtZW50LCBzdGF0ZW1lbnQsCiAgICAgICAgICBsaWJyYXJ5OiBmaWVsZC5lbGVtZW50LmxpYnJhcnkpOwogICAgICBzdGF0ZW1lbnRzLmFkZChzdGF0ZW1lbnQpOwogICAgfQoKICAgIGlmIChsb2NhbHMuaXNOb3RFbXB0eSkgewogICAgICBzdGF0ZW1lbnRzLmluc2VydCgwLCBsb2NhbHMudG9TdGF0ZW1lbnQoKSk7CiAgICB9CgogICAgcmV0dXJuIHdyYXBQaGFzZSgnbGF6eUluaXRpYWxpemVycycsIHN0YXRlbWVudHMpOwogIH0KCiAgLy8vIEVtaXRzIHRoZSBlbWJlZGRlZCBnbG9iYWxzIHRoYXQgYXJlIG5lZWRlZCBmb3IgZGVmZXJyZWQgbG9hZGluZy4KICAvLy8KICAvLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGludm9rZWQgZm9yIHRoZSBtYWluIGZyYWdtZW50LgogIC8vLwogIC8vLyBUaGUgW2xvYWRNYXBdIGNvbnRhaW5zIGEgbWFwIGZyb20gbG9hZC1pZHMgKGZvciBlYWNoIGRlZmVycmVkIGxpYnJhcnkpCiAgLy8vIHRvIHRoZSBsaXN0IG9mIGdlbmVyYXRlZCBmcmFnbWVudHMgdGhhdCBtdXN0IGJlIGluc3RhbGxlZCB3aGVuIHRoZQogIC8vLyBkZWZlcnJlZCBsaWJyYXJ5IGlzIGxvYWRlZC4KICBJdGVyYWJsZTxqcy5Qcm9wZXJ0eT4gZW1pdEVtYmVkZGVkR2xvYmFsc0ZvckRlZmVycmVkTG9hZGluZygKICAgICAgRGVmZXJyZWRMb2FkaW5nU3RhdGUgZGVmZXJyZWRMb2FkaW5nU3RhdGUpIHsKICAgIExpc3Q8anMuUHJvcGVydHk+IGdsb2JhbHMgPSBbXTsKCiAgICBnbG9iYWxzLmFkZChuZXcganMuUHJvcGVydHkoCiAgICAgICAganMuc3RyaW5nKERFRkVSUkVEX0lOSVRJQUxJWkVEKSwganMuanMoIk9iamVjdC5jcmVhdGUobnVsbCkiKSkpOwoKICAgIFN0cmluZyBkZWZlcnJlZEdsb2JhbCA9IE1vZGVsRW1pdHRlci5kZWZlcnJlZEluaXRpYWxpemVyc0dsb2JhbDsKICAgIGpzLkV4cHJlc3Npb24gaXNIdW5rTG9hZGVkRnVuY3Rpb24gPQogICAgICAgIGpzLmpzKCJmdW5jdGlvbihoYXNoKSB7IHJldHVybiAhISRkZWZlcnJlZEdsb2JhbFtoYXNoXTsgfSIpOwogICAgZ2xvYmFscwogICAgICAgIC5hZGQobmV3IGpzLlByb3BlcnR5KGpzLnN0cmluZyhJU19IVU5LX0xPQURFRCksIGlzSHVua0xvYWRlZEZ1bmN0aW9uKSk7CgogICAganMuRXhwcmVzc2lvbiBpc0h1bmtJbml0aWFsaXplZEZ1bmN0aW9uID0ganMuanMoCiAgICAgICAgImZ1bmN0aW9uKGhhc2gpIHsgcmV0dXJuICEhI2RlZmVycmVkSW5pdGlhbGl6ZWRbaGFzaF07IH0iLCB7CiAgICAgICdkZWZlcnJlZEluaXRpYWxpemVkJzogZ2VuZXJhdGVFbWJlZGRlZEdsb2JhbEFjY2VzcyhERUZFUlJFRF9JTklUSUFMSVpFRCkKICAgIH0pOwogICAgZ2xvYmFscy5hZGQobmV3IGpzLlByb3BlcnR5KAogICAgICAgIGpzLnN0cmluZyhJU19IVU5LX0lOSVRJQUxJWkVEKSwgaXNIdW5rSW5pdGlhbGl6ZWRGdW5jdGlvbikpOwoKICAgIC8vLyBTZWUgW2ZpbmFsaXplRGVmZXJyZWRMb2FkaW5nRGF0YV0gZm9yIHRoZSBmb3JtYXQgb2YgdGhlIGRlZmVycmVkIGh1bmsuCiAgICBqcy5FeHByZXNzaW9uIGluaXRpYWxpemVMb2FkZWRIdW5rRnVuY3Rpb24gPSBqcy5qcygiIiIKICAgICAgICAgICAgZnVuY3Rpb24oaGFzaCkgewogICAgICAgICAgICAgIHZhciBodW5rID0gJGRlZmVycmVkR2xvYmFsW2hhc2hdOwogICAgICAgICAgICAgIGlmIChodW5rID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRocm93ICJEZWZlcnJlZExvYWRpbmcgc3RhdGUgZXJyb3I6IGNvZGUgd2l0aCBoYXNoICciICsKICAgICAgICAgICAgICAgICAgICBoYXNoICsgIicgd2FzIG5vdCBsb2FkZWQiOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpbml0aWFsaXplRGVmZXJyZWRIdW5rKGh1bmspOwogICAgICAgICAgICAgICNkZWZlcnJlZEluaXRpYWxpemVkW2hhc2hdID0gdHJ1ZTsKICAgICAgICAgICAgfSIiIiwgewogICAgICAnZGVmZXJyZWRJbml0aWFsaXplZCc6IGdlbmVyYXRlRW1iZWRkZWRHbG9iYWxBY2Nlc3MoREVGRVJSRURfSU5JVElBTElaRUQpCiAgICB9KTsKCiAgICBnbG9iYWxzLmFkZChuZXcganMuUHJvcGVydHkoCiAgICAgICAganMuc3RyaW5nKElOSVRJQUxJWkVfTE9BREVEX0hVTkspLCBpbml0aWFsaXplTG9hZGVkSHVua0Z1bmN0aW9uKSk7CgogICAgZ2xvYmFscy5hZGQobmV3IGpzLlByb3BlcnR5KGpzLnN0cmluZyhERUZFUlJFRF9MSUJSQVJZX1BBUlRTKSwKICAgICAgICBkZWZlcnJlZExvYWRpbmdTdGF0ZS5kZWZlcnJlZExpYnJhcnlQYXJ0cykpOwogICAgZ2xvYmFscy5hZGQobmV3IGpzLlByb3BlcnR5KAogICAgICAgIGpzLnN0cmluZyhERUZFUlJFRF9QQVJUX1VSSVMpLCBkZWZlcnJlZExvYWRpbmdTdGF0ZS5kZWZlcnJlZFBhcnRVcmlzKSk7CiAgICBnbG9iYWxzLmFkZChuZXcganMuUHJvcGVydHkoanMuc3RyaW5nKERFRkVSUkVEX1BBUlRfSEFTSEVTKSwKICAgICAgICBkZWZlcnJlZExvYWRpbmdTdGF0ZS5kZWZlcnJlZFBhcnRIYXNoZXMpKTsKCiAgICByZXR1cm4gZ2xvYmFsczsKICB9CgogIC8vIENyZWF0ZSBkYXRhIHVzZWQgZm9yIGxvYWRpbmcgYW5kIGluaXRpYWxpemluZyB0aGUgaHVua3MgZm9yIGEgZGVmZXJyZWQKICAvLyBpbXBvcnQuIFRoZXJlIGFyZSB0aHJlZSBwYXJ0czogYSBtYXAgZnJvbSBsb2FkSWQgdG8gbGlzdCBvZiBwYXJ0cywgd2hlcmUKICAvLyBwYXJ0cyBhcmUgcmVwcmVzZW50ZWQgYXMgYW4gaW5kZXg7IGFuIGFycmF5IG9mIHVyaXMgaW5kZXhlZCBieSBwYXJ0OyBhbmQgYW4KICAvLyBhcnJheSBvZiBoYXNoZXMgaW5kZXhlZCBieSBwYXJ0LgogIC8vIFtkZWZlcnJlZExvYWRIYXNoZXNdIG1heSBoYXZlIG1pc3NpbmcgZW50cmllcyB0byBpbmRpY2F0ZSBlbXB0eSBwYXJ0cy4KICB2b2lkIGZpbmFsaXplRGVmZXJyZWRMb2FkaW5nRGF0YSgKICAgICAgTWFwPFN0cmluZywgTGlzdDxGcmFnbWVudD4+IGxvYWRNYXAsCiAgICAgIE1hcDxEZWZlcnJlZEZyYWdtZW50LCBTdHJpbmc+IGRlZmVycmVkTG9hZEhhc2hlcywKICAgICAgRGVmZXJyZWRMb2FkaW5nU3RhdGUgZGVmZXJyZWRMb2FkaW5nU3RhdGUpIHsKICAgIGlmIChsb2FkTWFwLmlzRW1wdHkpIHJldHVybjsKCiAgICBNYXA8RnJhZ21lbnQsIGludD4gZnJhZ21lbnRJbmRleGVzID0ge307CiAgICBMaXN0PFN0cmluZz4gZnJhZ21lbnRVcmlzID0gW107CiAgICBMaXN0PFN0cmluZz4gZnJhZ21lbnRIYXNoZXMgPSBbXTsKCiAgICBMaXN0PGpzLlByb3BlcnR5PiBsaWJyYXJ5UGFydHNNYXBFbnRyaWVzID0gW107CgogICAgbG9hZE1hcC5mb3JFYWNoKChTdHJpbmcgbG9hZElkLCBMaXN0PEZyYWdtZW50PiBmcmFnbWVudExpc3QpIHsKICAgICAgTGlzdDxqcy5FeHByZXNzaW9uPiBpbmRleGVzID0gW107CiAgICAgIGZvciAoRnJhZ21lbnQgZnJhZ21lbnQgaW4gZnJhZ21lbnRMaXN0KSB7CiAgICAgICAgU3RyaW5nIGZyYWdtZW50SGFzaCA9IGRlZmVycmVkTG9hZEhhc2hlc1tmcmFnbWVudF07CiAgICAgICAgaWYgKGZyYWdtZW50SGFzaCA9PSBudWxsKSBjb250aW51ZTsKICAgICAgICBpbnQgaW5kZXggPSBmcmFnbWVudEluZGV4ZXNbZnJhZ21lbnRdOwogICAgICAgIGlmIChpbmRleCA9PSBudWxsKSB7CiAgICAgICAgICBpbmRleCA9IGZyYWdtZW50SW5kZXhlc1tmcmFnbWVudF0gPSBmcmFnbWVudEluZGV4ZXMubGVuZ3RoOwogICAgICAgICAgZnJhZ21lbnRVcmlzLmFkZCgKICAgICAgICAgICAgICAiJHtmcmFnbWVudC5vdXRwdXRGaWxlTmFtZX0uJHtNb2RlbEVtaXR0ZXIuZGVmZXJyZWRFeHRlbnNpb259Iik7CiAgICAgICAgICBmcmFnbWVudEhhc2hlcy5hZGQoZnJhZ21lbnRIYXNoKTsKICAgICAgICB9CiAgICAgICAgaW5kZXhlcy5hZGQoanMubnVtYmVyKGluZGV4KSk7CiAgICAgIH0KICAgICAgbGlicmFyeVBhcnRzTWFwRW50cmllcy5hZGQoCiAgICAgICAgICBuZXcganMuUHJvcGVydHkoanMuc3RyaW5nKGxvYWRJZCksIG5ldyBqcy5BcnJheUluaXRpYWxpemVyKGluZGV4ZXMpKSk7CiAgICB9KTsKCiAgICBkZWZlcnJlZExvYWRpbmdTdGF0ZS5kZWZlcnJlZExpYnJhcnlQYXJ0cwogICAgICAgIC5zZXRWYWx1ZShuZXcganMuT2JqZWN0SW5pdGlhbGl6ZXIobGlicmFyeVBhcnRzTWFwRW50cmllcykpOwogICAgZGVmZXJyZWRMb2FkaW5nU3RhdGUuZGVmZXJyZWRQYXJ0VXJpcwogICAgICAgIC5zZXRWYWx1ZShqcy5zdHJpbmdBcnJheShmcmFnbWVudFVyaXMpKTsKICAgIGRlZmVycmVkTG9hZGluZ1N0YXRlLmRlZmVycmVkUGFydEhhc2hlcwogICAgICAgIC5zZXRWYWx1ZShqcy5zdHJpbmdBcnJheShmcmFnbWVudEhhc2hlcykpOwogIH0KCiAgLy8vIEVtaXRzIHRoZSBbTUFOR0xFRF9HTE9CQUxfTkFNRVNdIGVtYmVkZGVkIGdsb2JhbC4KICAvLy8KICAvLy8gVGhpcyBnbG9iYWwgbWFwcyBtaW5pZmllZCBuYW1lcyBmb3Igc2VsZWN0ZWQgY2xhc3NlcyAoc29tZSBpbXBvcnRhbnQKICAvLy8gY29yZSBjbGFzc2VzLCBhbmQgc29tZSBuYXRpdmUgY2xhc3NlcykgdG8gdGhlaXIgdW5taW5pZmllZCBuYW1lcy4KICBqcy5Qcm9wZXJ0eSBlbWl0TWFuZ2xlZEdsb2JhbE5hbWVzKCkgewogICAgTGlzdDxqcy5Qcm9wZXJ0eT4gbmFtZXMgPSBbXTsKCiAgICBDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cyA9IF9jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50czsKICAgIC8vIFdlIHdhbnQgdG8ga2VlcCB0aGUgb3JpZ2luYWwgbmFtZXMgZm9yIHRoZSBtb3N0IGNvbW1vbiBjb3JlIGNsYXNzZXMgd2hlbgogICAgLy8gY2FsbGluZyB0b1N0cmluZyBvbiB0aGVtLgogICAgTGlzdDxDbGFzc0VudGl0eT4gbmF0aXZlQ2xhc3Nlc05lZWRpbmdVbm1hbmdsZWROYW1lID0gWwogICAgICBjb21tb25FbGVtZW50cy5pbnRDbGFzcywKICAgICAgY29tbW9uRWxlbWVudHMuZG91YmxlQ2xhc3MsCiAgICAgIGNvbW1vbkVsZW1lbnRzLm51bUNsYXNzLAogICAgICBjb21tb25FbGVtZW50cy5zdHJpbmdDbGFzcywKICAgICAgY29tbW9uRWxlbWVudHMuYm9vbENsYXNzLAogICAgICBjb21tb25FbGVtZW50cy5udWxsQ2xhc3MsCiAgICAgIGNvbW1vbkVsZW1lbnRzLmxpc3RDbGFzcwogICAgXTsKICAgIC8vIFRPRE8oZmxvaXRzY2gpOiB0aGlzIHNob3VsZCBwcm9iYWJseSBiZSBvbiBhIHBlci1mcmFnbWVudCBiYXNpcy4KICAgIG5hdGl2ZUNsYXNzZXNOZWVkaW5nVW5tYW5nbGVkTmFtZS5mb3JFYWNoKChlbGVtZW50KSB7CiAgICAgIG5hbWVzLmFkZChuZXcganMuUHJvcGVydHkoCiAgICAgICAgICBqcy5xdW90ZU5hbWUobmFtZXIuY2xhc3NOYW1lKGVsZW1lbnQpKSwganMuc3RyaW5nKGVsZW1lbnQubmFtZSkpKTsKICAgIH0pOwoKICAgIHJldHVybiBuZXcganMuUHJvcGVydHkoCiAgICAgICAganMuc3RyaW5nKE1BTkdMRURfR0xPQkFMX05BTUVTKSwgbmV3IGpzLk9iamVjdEluaXRpYWxpemVyKG5hbWVzKSk7CiAgfQoKICAvLy8gRW1pdHMgdGhlIFtHRVRfVFlQRV9GUk9NX05BTUVdIGVtYmVkZGVkIGdsb2JhbC4KICAvLy8KICAvLy8gVGhpcyBlbWJlZGRlZCBnbG9iYWwgcHJvdmlkZXMgYSB3YXkgdG8gZ28gZnJvbSBhIGNsYXNzIG5hbWUgKHdoaWNoIGlzCiAgLy8vIGFsc28gdGhlIGNvbnN0cnVjdG9yJ3MgbmFtZSkgdG8gdGhlIGNvbnN0cnVjdG9yIGl0c2VsZi4KICBqcy5Qcm9wZXJ0eSBlbWl0R2V0VHlwZUZyb21OYW1lKCkgewogICAganMuRXhwcmVzc2lvbiBmdW5jdGlvbiA9IGpzLmpzKCJnZXRHbG9iYWxGcm9tTmFtZSIpOwogICAgcmV0dXJuIG5ldyBqcy5Qcm9wZXJ0eShqcy5zdHJpbmcoR0VUX1RZUEVfRlJPTV9OQU1FKSwgZnVuY3Rpb24pOwogIH0KCiAgLy8vIEVtaXRzIHRoZSBbTUVUQURBVEFdIGVtYmVkZGVkIGdsb2JhbC4KICAvLy8KICAvLy8gVGhlIG1ldGFkYXRhIGl0c2VsZiBoYXMgYWxyZWFkeSBiZWVuIGNvbXB1dGVkIGVhcmxpZXIgYW5kIGlzIHN0b3JlZCBpbgogIC8vLyB0aGUgW3Byb2dyYW1dLgogIExpc3Q8anMuUHJvcGVydHk+IGVtaXRNZXRhZGF0YShQcm9ncmFtIHByb2dyYW0pIHsKICAgIExpc3Q8anMuUHJvcGVydHk+IG1ldGFkYXRhR2xvYmFscyA9IFtdOwoKICAgIGpzLlByb3BlcnR5IGNyZWF0ZUdsb2JhbChqcy5FeHByZXNzaW9uIG1ldGFkYXRhLCBTdHJpbmcgZ2xvYmFsKSB7CiAgICAgIHJldHVybiBuZXcganMuUHJvcGVydHkoanMuc3RyaW5nKGdsb2JhbCksIG1ldGFkYXRhKTsKICAgIH0KCiAgICB2YXIgbWFpblVuaXQgPSBwcm9ncmFtLm1haW5GcmFnbWVudC5vdXRwdXRVbml0OwogICAganMuRXhwcmVzc2lvbiBtZXRhZGF0YSA9IHByb2dyYW0ubWV0YWRhdGFGb3JPdXRwdXRVbml0KG1haW5Vbml0KTsKICAgIG1ldGFkYXRhR2xvYmFscy5hZGQoY3JlYXRlR2xvYmFsKG1ldGFkYXRhLCBNRVRBREFUQSkpOwogICAganMuRXhwcmVzc2lvbiB0eXBlcyA9IHByb2dyYW0ubWV0YWRhdGFUeXBlc0Zvck91dHB1dFVuaXQobWFpblVuaXQpOwogICAgbWV0YWRhdGFHbG9iYWxzLmFkZChjcmVhdGVHbG9iYWwodHlwZXMsIFRZUEVTKSk7CgogICAgcmV0dXJuIG1ldGFkYXRhR2xvYmFsczsKICB9CgogIC8vLyBFbWl0cyBhbGwgZW1iZWRkZWQgZ2xvYmFscy4KICBqcy5TdGF0ZW1lbnQgZW1pdEVtYmVkZGVkR2xvYmFscygKICAgICAgUHJvZ3JhbSBwcm9ncmFtLCBEZWZlcnJlZExvYWRpbmdTdGF0ZSBkZWZlcnJlZExvYWRpbmdTdGF0ZSkgewogICAgTGlzdDxqcy5Qcm9wZXJ0eT4gZ2xvYmFscyA9IFtdOwoKICAgIGlmIChwcm9ncmFtLmxvYWRNYXAuaXNOb3RFbXB0eSkgewogICAgICBnbG9iYWxzCiAgICAgICAgICAuYWRkQWxsKGVtaXRFbWJlZGRlZEdsb2JhbHNGb3JEZWZlcnJlZExvYWRpbmcoZGVmZXJyZWRMb2FkaW5nU3RhdGUpKTsKICAgIH0KCiAgICBpZiAocHJvZ3JhbS50eXBlVG9JbnRlcmNlcHRvck1hcCAhPSBudWxsKSB7CiAgICAgIGdsb2JhbHMuYWRkKG5ldyBqcy5Qcm9wZXJ0eSgKICAgICAgICAgIGpzLnN0cmluZyhUWVBFX1RPX0lOVEVSQ0VQVE9SX01BUCksIHByb2dyYW0udHlwZVRvSW50ZXJjZXB0b3JNYXApKTsKICAgIH0KCiAgICBnbG9iYWxzLmFkZChlbWl0TWFuZ2xlZEdsb2JhbE5hbWVzKCkpOwoKICAgIC8vIFRoZSBbTUFOR0xFRF9OQU1FU10gdGFibGUgbXVzdCBjb250YWluIHRoZSBtYXBwaW5nIGZvciBjb25zdCBzeW1ib2xzLgogICAgLy8gV2l0aG91dCBjb25zdCBzeW1ib2xzLCB0aGUgdGFibGUgaXMgb25seSByZWxldmFudCBmb3IgcmVmbGVjdGlvbiBhbmQKICAgIC8vIHRoZXJlZm9yZSB1bnVzZWQgaW4gdGhpcyBlbWl0dGVyLgogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoZSBuZWVkIGZvciBhZGRpbmcgYW4gZW1wdHkgbGlzdCBvZgogICAgLy8gbWFuZ2xlZCBuYW1lcy4KICAgIGdsb2JhbHMuYWRkKG5ldyBqcy5Qcm9wZXJ0eSgKICAgICAgICBqcy5zdHJpbmcoTUFOR0xFRF9OQU1FUyksIG5ldyBqcy5PYmplY3RJbml0aWFsaXplcig8anMuUHJvcGVydHk+W10pKSk7CgogICAgZ2xvYmFscy5hZGQoZW1pdEdldFR5cGVGcm9tTmFtZSgpKTsKCiAgICBnbG9iYWxzLmFkZEFsbChlbWl0TWV0YWRhdGEocHJvZ3JhbSkpOwoKICAgIGlmIChwcm9ncmFtLm5lZWRzTmF0aXZlU3VwcG9ydCkgewogICAgICBnbG9iYWxzLmFkZChuZXcganMuUHJvcGVydHkoCiAgICAgICAgICBqcy5zdHJpbmcoSU5URVJDRVBUT1JTX0JZX1RBRyksIG5ldyBqcy5MaXRlcmFsTnVsbCgpKSk7CiAgICAgIGdsb2JhbHMuYWRkKG5ldyBqcy5Qcm9wZXJ0eShqcy5zdHJpbmcoTEVBRl9UQUdTKSwgbmV3IGpzLkxpdGVyYWxOdWxsKCkpKTsKICAgIH0KCiAgICBqcy5PYmplY3RJbml0aWFsaXplciBnbG9iYWxzT2JqZWN0ID0gbmV3IGpzLk9iamVjdEluaXRpYWxpemVyKGdsb2JhbHMpOwoKICAgIHJldHVybiBqcy5qcy5zdGF0ZW1lbnQoJ3ZhciBpbml0ID0gIzsnLCBnbG9iYWxzT2JqZWN0KTsKICB9CgogIC8vLyBFbWl0cyBkYXRhIG5lZWRlZCBmb3IgbmF0aXZlIGNsYXNzZXMuCiAgLy8vCiAgLy8vIFdlIGRvbid0IHRyeSB0byByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIG5hdGl2ZSBkYXRhLCBidXQgcmF0aGVyIGJ1aWxkCiAgLy8vIEphdmFTY3JpcHQgb2JqZWN0IGxpdGVyYWxzIHRoYXQgY29udGFpbiBhbGwgdGhlIGluZm9ybWF0aW9uIGRpcmVjdGx5LgogIC8vLyBUaGlzIG1lYW5zIHRoYXQgdGhlIG91dHB1dCBzaXplIGlzIGJpZ2dlciwgYnV0IHRoYXQgdGhlIHN0YXJ0dXAgaXMgZmFzdGVyLgogIC8vLwogIC8vLyBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBzdGF0aWMgZXF1aXZhbGVudCBvZgogIC8vLyBbTmF0aXZlR2VuZXJhdG9yLmJ1aWxkTmF0aXZlSW5mb0hhbmRsZXJdLgogIGpzLlN0YXRlbWVudCBlbWl0TmF0aXZlU3VwcG9ydChGcmFnbWVudCBmcmFnbWVudCkgewogICAgTGlzdDxqcy5TdGF0ZW1lbnQ+IHN0YXRlbWVudHMgPSBbXTsKCiAgICAvLyBUaGUgaXNvbGF0ZS1hZmZpbml0eSB0YWcgbXVzdCBvbmx5IGJlIGluaXRpYWxpemVkIG9uY2UgcGVyIHByb2dyYW0uCiAgICBpZiAoZnJhZ21lbnQuaXNNYWluRnJhZ21lbnQgJiYKICAgICAgICBOYXRpdmVHZW5lcmF0b3IubmVlZHNJc29sYXRlQWZmaW5pdHlUYWdJbml0aWFsaXphdGlvbigKICAgICAgICAgICAgX2Nsb3NlZFdvcmxkLmJhY2tlbmRVc2FnZSkpIHsKICAgICAgc3RhdGVtZW50cy5hZGQoTmF0aXZlR2VuZXJhdG9yLmdlbmVyYXRlSXNvbGF0ZUFmZmluaXR5VGFnSW5pdGlhbGl6YXRpb24oCiAgICAgICAgICBfY2xvc2VkV29ybGQuYmFja2VuZFVzYWdlLCBnZW5lcmF0ZUVtYmVkZGVkR2xvYmFsQWNjZXNzLCBqcy5qcygiIiIKICAgICAgICAvLyBPbiBWOCwgdGhlICdpbnRlcm4nIGZ1bmN0aW9uIGNvbnZlcnRzIGEgc3RyaW5nIHRvIGEgc3ltYm9sLCB3aGljaAogICAgICAgIC8vIG1ha2VzIHByb3BlcnR5IGFjY2VzcyBtdWNoIGZhc3Rlci4KICAgICAgICAvLyBUT0RPKHNyYSk6IFVzZSBTeW1ib2wgb24gbm9uLUlFMTEgYnJvd3NlcnMuCiAgICAgICAgZnVuY3Rpb24gKHMpIHsKICAgICAgICAgIHZhciBvID0ge307CiAgICAgICAgICBvW3NdID0gMTsKICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhodW5rSGVscGVycy5jb252ZXJ0VG9GYXN0T2JqZWN0KG8pKVswXTsKICAgICAgICB9IiIiLCBbXSkpKTsKICAgIH0KCiAgICBNYXA8U3RyaW5nLCBqcy5FeHByZXNzaW9uPiBpbnRlcmNlcHRvcnNCeVRhZyA9IHt9OwogICAgTWFwPFN0cmluZywganMuRXhwcmVzc2lvbj4gbGVhZlRhZ3MgPSB7fTsKICAgIExpc3Q8anMuU3RhdGVtZW50PiBzdWJjbGFzc0Fzc2lnbm1lbnRzID0gW107CgogICAgZm9yIChMaWJyYXJ5IGxpYnJhcnkgaW4gZnJhZ21lbnQubGlicmFyaWVzKSB7CiAgICAgIGZvciAoQ2xhc3MgY2xzIGluIGxpYnJhcnkuY2xhc3NlcykgewogICAgICAgIGlmIChjbHMubmF0aXZlTGVhZlRhZ3MgIT0gbnVsbCkgewogICAgICAgICAgZm9yIChTdHJpbmcgdGFnIGluIGNscy5uYXRpdmVMZWFmVGFncykgewogICAgICAgICAgICBpbnRlcmNlcHRvcnNCeVRhZ1t0YWddID0gY2xhc3NSZWZlcmVuY2UoY2xzKTsKICAgICAgICAgICAgbGVhZlRhZ3NbdGFnXSA9IG5ldyBqcy5MaXRlcmFsQm9vbCh0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGNscy5uYXRpdmVOb25MZWFmVGFncyAhPSBudWxsKSB7CiAgICAgICAgICBmb3IgKFN0cmluZyB0YWcgaW4gY2xzLm5hdGl2ZU5vbkxlYWZUYWdzKSB7CiAgICAgICAgICAgIGludGVyY2VwdG9yc0J5VGFnW3RhZ10gPSBjbGFzc1JlZmVyZW5jZShjbHMpOwogICAgICAgICAgICBsZWFmVGFnc1t0YWddID0gbmV3IGpzLkxpdGVyYWxCb29sKGZhbHNlKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjbHMubmF0aXZlRXh0ZW5zaW9ucyAhPSBudWxsKSB7CiAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHN1YmNsYXNzZXMgPSBjbHMubmF0aXZlRXh0ZW5zaW9uczsKICAgICAgICAgICAganMuRXhwcmVzc2lvbiBiYXNlID0ganMuc3RyaW5nKGNscy5uYXRpdmVOb25MZWFmVGFnc1swXSk7CgogICAgICAgICAgICBmb3IgKENsYXNzIHN1YmNsYXNzIGluIHN1YmNsYXNzZXMpIHsKICAgICAgICAgICAgICBzdWJjbGFzc0Fzc2lnbm1lbnRzLmFkZChqcy5qcy5zdGF0ZW1lbnQoJyMuIyA9ICM7JywgWwogICAgICAgICAgICAgICAgY2xhc3NSZWZlcmVuY2Uoc3ViY2xhc3MpLAogICAgICAgICAgICAgICAgTkFUSVZFX1NVUEVSQ0xBU1NfVEFHX05BTUUsCiAgICAgICAgICAgICAgICBiYXNlCiAgICAgICAgICAgICAgXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKGludGVyY2VwdG9yc0J5VGFnLmlzTm90RW1wdHkpIHsKICAgICAgc3RhdGVtZW50cy5hZGQoanMuanMuc3RhdGVtZW50KAogICAgICAgICAgImh1bmtIZWxwZXJzLnNldE9yVXBkYXRlSW50ZXJjZXB0b3JzQnlUYWcoIyk7IiwKICAgICAgICAgIGpzLm9iamVjdExpdGVyYWwoaW50ZXJjZXB0b3JzQnlUYWcpKSk7CiAgICB9CiAgICBpZiAobGVhZlRhZ3MuaXNOb3RFbXB0eSkgewogICAgICBzdGF0ZW1lbnRzLmFkZChqcy5qcy5zdGF0ZW1lbnQoCiAgICAgICAgICAiaHVua0hlbHBlcnMuc2V0T3JVcGRhdGVMZWFmVGFncygjKTsiLCBqcy5vYmplY3RMaXRlcmFsKGxlYWZUYWdzKSkpOwogICAgfQogICAgc3RhdGVtZW50cy5hZGRBbGwoc3ViY2xhc3NBc3NpZ25tZW50cyk7CgogICAgcmV0dXJuIHdyYXBQaGFzZSgnbmF0aXZlU3VwcG9ydCcsIHN0YXRlbWVudHMpOwogIH0KfQoKY2xhc3MgTG9jYWxBbGlhc2VzIHsKICBmaW5hbCBNYXA8U3RyaW5nLCBqcy5FeHByZXNzaW9uPiBfbG9jYWxzID0ge307CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2xvY2Fscy5pc0VtcHR5OwogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gIWlzRW1wdHk7CgogIFN0cmluZyBmaW5kKFN0cmluZyBhbGlhcywgU3RyaW5nIGV4cHJlc3Npb24pIHsKICAgIF9sb2NhbHNbYWxpYXNdID8/PSBqcy5qcyhleHByZXNzaW9uKTsKICAgIHJldHVybiBhbGlhczsKICB9CgogIGpzLlN0YXRlbWVudCB0b1N0YXRlbWVudCgpIHsKICAgIExpc3Q8anMuVmFyaWFibGVJbml0aWFsaXphdGlvbj4gaW5pdGlhbGl6YXRpb25zID0gW107CiAgICBfbG9jYWxzLmZvckVhY2goKGxvY2FsLCB2YWx1ZSkgewogICAgICBpbml0aWFsaXphdGlvbnMKICAgICAgICAgIC5hZGQoanMuVmFyaWFibGVJbml0aWFsaXphdGlvbihqcy5WYXJpYWJsZURlY2xhcmF0aW9uKGxvY2FsKSwgdmFsdWUpKTsKICAgIH0pOwogICAgcmV0dXJuIGpzLkV4cHJlc3Npb25TdGF0ZW1lbnQoanMuVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoaW5pdGlhbGl6YXRpb25zKSk7CiAgfQp9CgovLy8gQ29kZSB0byBpbml0aWFsaXplIGhvbGRlciB3aXRoIGFuY2lsbGFyeSBpbmZvcm1hdGlvbi4KY2xhc3MgSG9sZGVyQ29kZSB7CiAgZmluYWwgTGlzdDxIb2xkZXI+IGFjdGl2ZUhvbGRlcnM7CiAganMuU3RhdGVtZW50IHN0YXRlbWVudHM7CiAgSG9sZGVyQ29kZSh7dGhpcy5hY3RpdmVIb2xkZXJzLCB0aGlzLnN0YXRlbWVudHN9KTsKfQoKY2xhc3MgRGVmZXJyZWRMb2FkaW5nU3RhdGUgewogIGZpbmFsIGRlZmVycmVkTGlicmFyeVBhcnRzID0gbmV3IERlZmVycmVkUHJpbWFyeUV4cHJlc3Npb24oKTsKICBmaW5hbCBkZWZlcnJlZFBhcnRVcmlzID0gbmV3IERlZmVycmVkUHJpbWFyeUV4cHJlc3Npb24oKTsKICBmaW5hbCBkZWZlcnJlZFBhcnRIYXNoZXMgPSBuZXcgRGVmZXJyZWRQcmltYXJ5RXhwcmVzc2lvbigpOwp9CgpjbGFzcyBEZWZlcnJlZFByaW1hcnlFeHByZXNzaW9uIGV4dGVuZHMganMuRGVmZXJyZWRFeHByZXNzaW9uIHsKICBqcy5FeHByZXNzaW9uIF92YWx1ZTsKCiAgdm9pZCBzZXRWYWx1ZShqcy5FeHByZXNzaW9uIHZhbHVlKSB7CiAgICBhc3NlcnQoX3ZhbHVlID09IG51bGwpOwogICAgYXNzZXJ0KHZhbHVlLnByZWNlZGVuY2VMZXZlbCA9PSB0aGlzLnByZWNlZGVuY2VMZXZlbCk7CiAgICBfdmFsdWUgPSB2YWx1ZTsKICB9CgogIEBvdmVycmlkZQogIGpzLkV4cHJlc3Npb24gZ2V0IHZhbHVlIHsKICAgIGFzc2VydChfdmFsdWUgIT0gbnVsbCk7CiAgICByZXR1cm4gX3ZhbHVlOwogIH0KCiAgQG92ZXJy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TCQrODMhAS0kJgEzAUMoMDwsLx1GHE8sCicIIlEIAS5FKjEsMwQBOAZLSCkiAUFQITwfIh8iICAfB0g6IU0IARxLBAE2Bkw+JjlFBAEsBk0VNCwBRjsGATRGO0g1ARwEASIkRCQBJg5QBgEwI04GASsBTUwpSBYhTwEoASsBJiNCUAYBTAE8BAEsBktMUQYwMDYoAUsjPypPTU0uNxcWFEUVBgE3LjEBMisqMzo2DAotNjo3DC47RgExRCosFRMODAoIBgEoJjoxBh8mTwYsATMEAgEVMQEnIwExKhIEAR86JRZRCFAEAgE6EyQbNQIBHUA8PgIBQBgBJxw7FAQBDBwcEwQBDDQCAUVwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL3N0YXJ0dXBfZW1pdHRlci9mcmFnbWVudF9lbWl0dGVyLmRhcnQsc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaGFzaC9zaGExLmRhcnSF9C8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CgppbXBvcnQgJ3BhY2thZ2U6Y3J5cHRvL2NyeXB0by5kYXJ0JzsKCmltcG9ydCAnLi4vaW8vY29kZV9vdXRwdXQuZGFydCcgc2hvdyBDb2RlT3V0cHV0TGlzdGVuZXI7CgpjbGFzcyBIYXNoZXIgaW1wbGVtZW50cyBDb2RlT3V0cHV0TGlzdGVuZXIgewogIGZpbmFsIF9EaWdlc3RTaW5rIF9kaWdlc3RTaW5rOwogIEJ5dGVDb252ZXJzaW9uU2luayBfYnl0ZVNpbms7CgogIEhhc2hlci5fKHRoaXMuX2RpZ2VzdFNpbmspCiAgICAgIDogX2J5dGVTaW5rID0gc2hhMS5zdGFydENodW5rZWRDb252ZXJzaW9uKF9kaWdlc3RTaW5rKTsKCiAgZmFjdG9yeSBIYXNoZXIoKSA9PiBIYXNoZXIuXyhfRGlnZXN0U2luaygpKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBvbkRvbmUoaW50IGxlbmd0aCkgewogICAgLy8gRG8gbm90aGluZy4KICB9CgogIEBvdmVycmlkZQogIHZvaWQgb25UZXh0KFN0cmluZyB0ZXh0KSB7CiAgICBpZiAoX2J5dGVTaW5rICE9IG51bGwpIHsKICAgICAgX2J5dGVTaW5rLmFkZCh1dGY4LmVuY29kZSh0ZXh0KSk7CiAgICB9CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgYmFzZTY0LWVuY29kZWQgU0hBLTEgaGFzaCBvZiB0aGUgdXRmLTggYnl0ZXMgb2YgdGhlIG91dHB1dAogIC8vLyB0ZXh0LgogIFN0cmluZyBnZXRIYXNoKCkgewogICAgaWYgKF9ieXRlU2luayAhPSBudWxsKSB7CiAgICAgIF9ieXRlU2luay5jbG9zZSgpOwogICAgICBfYnl0ZVNpbmsgPSBudWxsOwogICAgfQogICAgcmV0dXJuIGJhc2U2NC5lbmNvZGUoX2RpZ2VzdFNpbmsudmFsdWUuYnl0ZXMpOwogIH0KfQoKLy8vIEEgc2luayB1c2VkIHRvIGdldCBhIGRpZ2VzdCB2YWx1ZSBvdXQgb2YgYEhhc2guc3RhcnRDaHVua2VkQ29udmVyc2lvbmAuCmNsYXNzIF9EaWdlc3RTaW5rIGV4dGVuZHMgU2luazxEaWdlc3Q+IHsKICBEaWdlc3QgX3ZhbHVlOwoKICAvLy8gVGhlIHZhbHVlIGFkZGVkIHRvIHRoZSBzaW5rLCBpZiBhbnkuCiAgRGlnZXN0IGdldCB2YWx1ZSB7CiAgICBhc3NlcnQoX3ZhbHVlICE9IG51bGwpOwogICAgcmV0dXJuIF92YWx1ZTsKICB9CgogIC8vLyBBZGRzIFt2YWx1ZV0gdG8gdGhlIHNpbmsuCiAgLy8vCiAgLy8vIFVubGlrZSBtb3N0IHNpbmtzLCB0aGlzIG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlLgogIEBvdmVycmlkZQogIHZvaWQgYWRkKERpZ2VzdCB2YWx1ZSkgewogICAgYXNzZXJ0KF92YWx1ZSA9PSBudWxsKTsKICAgIF92YWx1ZSA9IHZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjbG9zZSgpIHsKICAgIGFzc2VydChfdmFsdWUgIT0gbnVsbCk7CiAgfQp9CkQATk48ARcBJQE5AS0hIAEdPgEvAQwcEwQBDB0dKAYEAU0MFR0ZGAYzBAIBTCkRASsVHBMEASAGNwwbHBQEAQwRHAQCASNwYWNrYWdlOmNvbXBpbGVyL3NyYy9oYXNoL3NoYTEuZGFydDhzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pby9zb3VyY2VfbWFwX2J1aWxkZXIuZGFydLvhLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5zb3VyY2VfbWFwX2J1aWxkZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IExvY2F0aW9uOwppbXBvcnQgJy4uLy4uL2NvbXBpbGVyX25ldy5kYXJ0JyBzaG93IENvbXBpbGVyT3V0cHV0LCBPdXRwdXRTaW5rLCBPdXRwdXRUeXBlOwppbXBvcnQgJy4uL3V0aWwvdXJpX2V4dHJhcy5kYXJ0JyBzaG93IHJlbGF0aXZpemU7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnOwppbXBvcnQgJ2xvY2F0aW9uX3Byb3ZpZGVyLmRhcnQnOwppbXBvcnQgJ2NvZGVfb3V0cHV0LmRhcnQnIHNob3cgU291cmNlTG9jYXRpb25zUHJvdmlkZXIsIFNvdXJjZUxvY2F0aW9uczsKaW1wb3J0ICdzb3VyY2VfaW5mb3JtYXRpb24uZGFydCcgc2hvdyBTb3VyY2VMb2NhdGlvbiwgRnJhbWVFbnRyeTsKCmNsYXNzIFNvdXJjZU1hcEJ1aWxkZXIgewogIGZpbmFsIFN0cmluZyB2ZXJzaW9uOwoKICAvLy8gVGhlIFVSSSBvZiB0aGUgc291cmNlIG1hcCBmaWxlLgogIGZpbmFsIFVyaSBzb3VyY2VNYXBVcmk7CgogIC8vLyBUaGUgVVJJIG9mIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgZmlsZS4KICBmaW5hbCBVcmkgdGFyZ2V0RmlsZVVyaTsKCiAgZmluYWwgTG9jYXRpb25Qcm92aWRlciBsb2NhdGlvblByb3ZpZGVyOwogIGZpbmFsIExpc3Q8U291cmNlTWFwRW50cnk+IGVudHJpZXMgPSBuZXcgTGlzdDxTb3VyY2VNYXBFbnRyeT4oKTsKCiAgLy8vIEV4dGVuc2lvbiB1c2VkIHRvIGRlb2JmdXNjYXRlIG1pbmlmaWVkIG5hbWVzIGluIGVycm9yIG1lc3NhZ2VzLgogIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gbWluaWZpZWRHbG9iYWxOYW1lczsKICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IG1pbmlmaWVkSW5zdGFuY2VOYW1lczsKCiAgLy8vIEV4dGVuc2lvbiB1c2VkIHRvIGRlb2JmdXNjYXRlIGlubGluZWQgc3RhY2sgZnJhbWVzLgogIGZpbmFsIE1hcDxpbnQsIExpc3Q8RnJhbWVFbnRyeT4+IGZyYW1lczsKCiAgU291cmNlTWFwQnVpbGRlcigKICAgICAgdGhpcy52ZXJzaW9uLAogICAgICB0aGlzLnNvdXJjZU1hcFVyaSwKICAgICAgdGhpcy50YXJnZXRGaWxlVXJpLAogICAgICB0aGlzLmxvY2F0aW9uUHJvdmlkZXIsCiAgICAgIHRoaXMubWluaWZpZWRHbG9iYWxOYW1lcywKICAgICAgdGhpcy5taW5pZmllZEluc3RhbmNlTmFtZXMsCiAgICAgIHRoaXMuZnJhbWVzKTsKCiAgdm9pZCBhZGRNYXBwaW5nKGludCB0YXJnZXRPZmZzZXQsIFNvdXJjZUxvY2F0aW9uIHNvdXJjZUxvY2F0aW9uKSB7CiAgICBlbnRyaWVzLmFkZChuZXcgU291cmNlTWFwRW50cnkoc291cmNlTG9jYXRpb24sIHRhcmdldE9mZnNldCkpOwogIH0KCiAgdm9pZCBwcmludFN0cmluZ0xpc3RPbihJdGVyYWJsZTxTdHJpbmc+IHN0cmluZ3MsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgYnVmZmVyLndyaXRlKCdbJyk7CiAgICBmb3IgKFN0cmluZyBzdHJpbmcgaW4gc3RyaW5ncykgewogICAgICBpZiAoIWZpcnN0KSBidWZmZXIud3JpdGUoJywnKTsKICAgICAgYnVmZmVyLndyaXRlKCciJyk7CiAgICAgIHdyaXRlSnNvbkVzY2FwZWRDaGFyc09uKHN0cmluZywgYnVmZmVyKTsKICAgICAgYnVmZmVyLndyaXRlKCciJyk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICB9CiAgICBidWZmZXIud3JpdGUoJ10nKTsKICB9CgogIFN0cmluZyBidWlsZCgpIHsKICAgIExpbmVDb2x1bW5NYXA8U291cmNlTWFwRW50cnk+IGxpbmVDb2x1bW5NYXAgPQogICAgICAgIG5ldyBMaW5lQ29sdW1uTWFwPFNvdXJjZU1hcEVudHJ5PigpOwogICAgTWFwPFVyaSwgTGluZUNvbHVtbk1hcDxTb3VyY2VNYXBFbnRyeT4+IHNvdXJjZUxvY2F0aW9uTWFwID0KICAgICAgICA8VXJpLCBMaW5lQ29sdW1uTWFwPFNvdXJjZU1hcEVudHJ5Pj57fTsKICAgIGVudHJpZXMuZm9yRWFjaCgoU291cmNlTWFwRW50cnkgc291cmNlTWFwRW50cnkpIHsKICAgICAgTG9jYXRpb24ga2VybmVsTG9jYXRpb24gPQogICAgICAgICAgbG9jYXRpb25Qcm92aWRlci5nZXRMb2NhdGlvbihzb3VyY2VNYXBFbnRyeS50YXJnZXRPZmZzZXQpOwogICAgICBpbnQgbGluZSA9IGtlcm5lbExvY2F0aW9uLmxpbmUgLSAxOwogICAgICBpbnQgY29sdW1uID0ga2VybmVsTG9jYXRpb24uY29sdW1uIC0gMTsKICAgICAgbGluZUNvbHVtbk1hcC5hZGQobGluZSwgY29sdW1uLCBzb3VyY2VNYXBFbnRyeSk7CgogICAgICBTb3VyY2VMb2NhdGlvbiBsb2NhdGlvbiA9IHNvdXJjZU1hcEVudHJ5LnNvdXJjZUxvY2F0aW9uOwogICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkgewogICAgICAgIGlmIChsb2NhdGlvbi5zb3VyY2VVcmkgIT0gbnVsbCkgewogICAgICAgICAgTGluZUNvbHVtbk1hcDxTb3VyY2VNYXBFbnRyeT4gc291cmNlTGluZUNvbHVtbk1hcCA9CiAgICAgICAgICAgICAgc291cmNlTG9jYXRpb25NYXAucHV0SWZBYnNlbnQobG9jYXRpb24uc291cmNlVXJpLAogICAgICAgICAgICAgICAgICAoKSA9PiBuZXcgTGluZUNvbHVtbk1hcDxTb3VyY2VNYXBFbnRyeT4oKSk7CiAgICAgICAgICBzb3VyY2VMaW5lQ29sdW1uTWFwLmFkZCgKICAgICAgICAgICAgICBsb2NhdGlvbi5saW5lIC0gMSwgbG9jYXRpb24uY29sdW1uIC0gMSwgc291cmNlTWFwRW50cnkpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CgogICAgcmV0dXJuIF9idWlsZChsaW5lQ29sdW1uTWFwKTsKICB9CgogIFN0cmluZyBfYnVpbGQoTGluZUNvbHVtbk1hcDxTb3VyY2VNYXBFbnRyeT4gbGluZUNvbHVtbk1hcCkgewogICAgSW5kZXhNYXA8VXJpPiB1cmlNYXAgPSBuZXcgSW5kZXhNYXA8VXJpPigpOwogICAgSW5kZXhNYXA8U3RyaW5nPiBuYW1lTWFwID0gbmV3IEluZGV4TWFwPFN0cmluZz4oKTsKCiAgICB2b2lkIHJlZ2lzdGVyTG9jYXRpb24oU291cmNlTG9jYXRpb24gc291cmNlTG9jYXRpb24pIHsKICAgICAgaWYgKHNvdXJjZUxvY2F0aW9uICE9IG51bGwpIHsKICAgICAgICBpZiAoc291cmNlTG9jYXRpb24uc291cmNlVXJpICE9IG51bGwpIHsKICAgICAgICAgIHVyaU1hcC5yZWdpc3Rlcihzb3VyY2VMb2NhdGlvbi5zb3VyY2VVcmkpOwogICAgICAgICAgaWYgKHNvdXJjZUxvY2F0aW9uLnNvdXJjZU5hbWUgIT0gbnVsbCkgewogICAgICAgICAgICBuYW1lTWFwLnJlZ2lzdGVyKHNvdXJjZUxvY2F0aW9uLnNvdXJjZU5hbWUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGxpbmVDb2x1bW5NYXAuZm9yRWFjaEVsZW1lbnQoKFNvdXJjZU1hcEVudHJ5IGVudHJ5KSB7CiAgICAgIHJlZ2lzdGVyTG9jYXRpb24oZW50cnkuc291cmNlTG9jYXRpb24pOwogICAgfSk7CgogICAgbWluaWZpZWRHbG9iYWxOYW1lcy52YWx1ZXMuZm9yRWFjaChuYW1lTWFwLnJlZ2lzdGVyKTsKICAgIG1pbmlmaWVkSW5zdGFuY2VOYW1lcy52YWx1ZXMuZm9yRWFjaChuYW1lTWFwLnJlZ2lzdGVyKTsKICAgIGZvciAoTGlzdDxGcmFtZUVudHJ5PiBlbnRyaWVzIGluIGZyYW1lcy52YWx1ZXMpIHsKICAgICAgZm9yICh2YXIgZnJhbWUgaW4gZW50cmllcykgewogICAgICAgIHJlZ2lzdGVyTG9jYXRpb24oZnJhbWUucHVzaExvY2F0aW9uKTsKICAgICAgICBpZiAoZnJhbWUuaW5saW5lZE1ldGhvZE5hbWUgIT0gbnVsbCkgewogICAgICAgICAgbmFtZU1hcC5yZWdpc3RlcihmcmFtZS5pbmxpbmVkTWV0aG9kTmFtZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgU3RyaW5nQnVmZmVyIG1hcHBpbmdzQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgd3JpdGVFbnRyaWVzKGxpbmVDb2x1bW5NYXAsIHVyaU1hcCwgbmFtZU1hcCwgbWFwcGluZ3NCdWZmZXIpOwoKICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBidWZmZXIud3JpdGUoJ3tcbicpOwogICAgYnVmZmVyLndyaXRlKCcgICJ2ZXJzaW9uIjogMyxcbicpOwogICAgYnVmZmVyLndyaXRlKCcgICJlbmdpbmUiOiAiJHZlcnNpb24iLFxuJyk7CiAgICBpZiAoc291cmNlTWFwVXJpICE9IG51bGwgJiYgdGFyZ2V0RmlsZVVyaSAhPSBudWxsKSB7CiAgICAgIGJ1ZmZlci53cml0ZSgKICAgICAgICAgICcgICJmaWxlIjogIiR7cmVsYXRpdml6ZShzb3VyY2VNYXBVcmksIHRhcmdldEZpbGVVcmksIGZhbHNlKX0iLFxuJyk7CiAgICB9CiAgICBidWZmZXIud3JpdGUoJyAgInNvdXJjZVJvb3QiOiAiIixcbicpOwogICAgYnVmZmVyLndyaXRlKCcgICJzb3VyY2VzIjogJyk7CiAgICBJdGVyYWJsZTxTdHJpbmc+IHJlbGF0aXZlU291cmNlVXJpTGlzdCA9IGNvbnN0IDxTdHJpbmc+W107CiAgICBpZiAoc291cmNlTWFwVXJpICE9IG51bGwpIHsKICAgICAgcmVsYXRpdmVTb3VyY2VVcmlMaXN0ID0KICAgICAgICAgIHVyaU1hcC5lbGVtZW50cy5tYXAoKHUpID0+IHJlbGF0aXZpemUoc291cmNlTWFwVXJpLCB1LCBmYWxzZSkpOwogICAgfQogICAgcHJpbnRTdHJpbmdMaXN0T24ocmVsYXRpdmVTb3VyY2VVcmlMaXN0LCBidWZmZXIpOwogICAgYnVmZmVyLndyaXRlKCcsXG4nKTsKICAgIGJ1ZmZlci53cml0ZSgnICAibmFtZXMiOiAnKTsKICAgIHByaW50U3RyaW5nTGlzdE9uKG5hbWVNYXAuZWxlbWVudHMsIGJ1ZmZlcik7CiAgICBidWZmZXIud3JpdGUoJyxcbicpOwogICAgYnVmZmVyLndyaXRlKCcgICJtYXBwaW5ncyI6ICInKTsKICAgIGJ1ZmZlci53cml0ZShtYXBwaW5nc0J1ZmZlcik7CiAgICBidWZmZXIud3JpdGUoJyIsXG4nKTsKICAgIGJ1ZmZlci53cml0ZSgnICAieF9vcmdfZGFydGxhbmdfZGFydDJqcyI6IHtcbicpOwogICAgYnVmZmVyLndyaXRlKCcgICAgIm1pbmlmaWVkX25hbWVzIjoge1xuJyk7CiAgICBidWZmZXIud3JpdGUoJyAgICAgICJnbG9iYWwiOiAnKTsKICAgIHdyaXRlTWluaWZpZWROYW1lcyhtaW5pZmllZEdsb2JhbE5hbWVzLCBuYW1lTWFwLCBidWZmZXIpOwogICAgYnVmZmVyLndyaXRlKCcsXG4nKTsKICAgIGJ1ZmZlci53cml0ZSgnICAgICAgImluc3RhbmNlIjogJyk7CiAgICB3cml0ZU1pbmlmaWVkTmFtZXMobWluaWZpZWRJbnN0YW5jZU5hbWVzLCBuYW1lTWFwLCBidWZmZXIpOwogICAgYnVmZmVyLndyaXRlKCdcbiAgICB9LFxuJyk7CiAgICBidWZmZXIud3JpdGUoJyAgICAiZnJhbWVzIjogJyk7CiAgICB3cml0ZUZyYW1lcyh1cmlNYXAsIG5hbWVNYXAsIGJ1ZmZlcik7CiAgICBidWZmZXIud3JpdGUoJ1xuICB9XG59XG4nKTsKICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9CgogIHZvaWQgd3JpdGVFbnRyaWVzKExpbmVDb2x1bW5NYXA8U291cmNlTWFwRW50cnk+IGVudHJpZXMsIEluZGV4TWFwPFVyaT4gdXJpTWFwLAogICAgICBJbmRleE1hcDxTdHJpbmc+IG5hbWVNYXAsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKICAgIFNvdXJjZUxvY2F0aW9uIHByZXZpb3VzU291cmNlTG9jYXRpb247CiAgICBpbnQgcHJldmlvdXNUYXJnZXRMaW5lID0gMDsKICAgIERlbHRhRW5jb2RlciB0YXJnZXRDb2x1bW5FbmNvZGVyID0gbmV3IERlbHRhRW5jb2RlcigpOwogICAgYm9vbCBmaXJzdEVudHJ5SW5MaW5lID0gdHJ1ZTsKICAgIERlbHRhRW5jb2RlciBzb3VyY2VVcmlJbmRleEVuY29kZXIgPSBuZXcgRGVsdGFFbmNvZGVyKCk7CiAgICBEZWx0YUVuY29kZXIgc291cmNlTGluZUVuY29kZXIgPSBuZXcgRGVsdGFFbmNvZGVyKCk7CiAgICBEZWx0YUVuY29kZXIgc291cmNlQ29sdW1uRW5jb2RlciA9IG5ldyBEZWx0YUVuY29kZXIoKTsKICAgIERlbHRhRW5jb2RlciBzb3VyY2VOYW1lSW5kZXhFbmNvZGVyID0gbmV3IERlbHRhRW5jb2RlcigpOwoKICAgIGVudHJpZXMuZm9yRWFjaCgoaW50IHRhcmdldExpbmUsIGludCB0YXJnZXRDb2x1bW4sIFNvdXJjZU1hcEVudHJ5IGVudHJ5KSB7CiAgICAgIFNvdXJjZUxvY2F0aW9uIHNvdXJjZUxvY2F0aW9uID0gZW50cnkuc291cmNlTG9jYXRpb247CiAgICAgIGlmIChzb3VyY2VMb2NhdGlvbiA9PSBwcmV2aW91c1NvdXJjZUxvY2F0aW9uKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZiAodGFyZ2V0TGluZSA+IHByZXZpb3VzVGFyZ2V0TGluZSkgewogICAgICAgIGZvciAoaW50IGkgPSBwcmV2aW91c1RhcmdldExpbmU7IGkgPCB0YXJnZXRMaW5lOyArK2kpIHsKICAgICAgICAgIG91dHB1dC53cml0ZSgnOycpOwogICAgICAgIH0KICAgICAgICBwcmV2aW91c1RhcmdldExpbmUgPSB0YXJnZXRMaW5lOwogICAgICAgIHByZXZpb3VzU291cmNlTG9jYXRpb24gPSBudWxsOwogICAgICAgIHRhcmdldENvbHVtbkVuY29kZXIucmVzZXQoKTsKICAgICAgICBmaXJzdEVudHJ5SW5MaW5lID0gdHJ1ZTsKICAgICAgfQoKICAgICAgaWYgKCFmaXJzdEVudHJ5SW5MaW5lKSB7CiAgICAgICAgb3V0cHV0LndyaXRlKCcsJyk7CiAgICAgIH0KICAgICAgZmlyc3RFbnRyeUluTGluZSA9IGZhbHNlOwoKICAgICAgdGFyZ2V0Q29sdW1uRW5jb2Rlci5lbmNvZGUob3V0cHV0LCB0YXJnZXRDb2x1bW4pOwoKICAgICAgaWYgKHNvdXJjZUxvY2F0aW9uID09IG51bGwpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIFVyaSBzb3VyY2VVcmkgPSBzb3VyY2VMb2NhdGlvbi5zb3VyY2VVcmk7CiAgICAgIGlmIChzb3VyY2VVcmkgIT0gbnVsbCkgewogICAgICAgIHNvdXJjZVVyaUluZGV4RW5jb2Rlci5lbmNvZGUob3V0cHV0LCB1cmlNYXBbc291cmNlVXJpXSk7CiAgICAgICAgc291cmNlTGluZUVuY29kZXIuZW5jb2RlKG91dHB1dCwgc291cmNlTG9jYXRpb24ubGluZSAtIDEpOwogICAgICAgIHNvdXJjZUNvbHVtbkVuY29kZXIuZW5jb2RlKG91dHB1dCwgc291cmNlTG9jYXRpb24uY29sdW1uIC0gMSk7CiAgICAgIH0KCiAgICAgIFN0cmluZyBzb3VyY2VOYW1lID0gc291cmNlTG9jYXRpb24uc291cmNlTmFtZTsKICAgICAgaWYgKHNvdXJjZU5hbWUgIT0gbnVsbCkgewogICAgICAgIHNvdXJjZU5hbWVJbmRleEVuY29kZXIuZW5jb2RlKG91dHB1dCwgbmFtZU1hcFtzb3VyY2VOYW1lXSk7CiAgICAgIH0KCiAgICAgIHByZXZpb3VzU291cmNlTG9jYXRpb24gPSBzb3VyY2VMb2NhdGlvbjsKICAgIH0pOwogIH0KCiAgdm9pZCB3cml0ZU1pbmlmaWVkTmFtZXMoTWFwPFN0cmluZywgU3RyaW5nPiBtaW5pZmllZE5hbWVzLAogICAgICBJbmRleE1hcDxTdHJpbmc+IG5hbWVNYXAsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgYnVmZmVyLndyaXRlKCciJyk7CiAgICBtaW5pZmllZE5hbWVzLmZvckVhY2goKFN0cmluZyBtaW5pZmllZE5hbWUsIFN0cmluZyBuYW1lKSB7CiAgICAgIGlmICghZmlyc3QpIGJ1ZmZlci53cml0ZSgnLCcpOwogICAgICAvLyBtaW5pZmllZE5hbWVzIGFyZSB2YWxpZCBKUyBpZGVudGlmaWVycyBzbyB0aGV5IGRvbid0IG5lZWQgdG8gYmUgZXNjYXBlZAogICAgICBidWZmZXIud3JpdGUobWluaWZpZWROYW1lKTsKICAgICAgYnVmZmVyLndyaXRlKCcsJyk7CiAgICAgIGJ1ZmZlci53cml0ZShuYW1lTWFwW25hbWVdKTsKICAgICAgZmlyc3QgPSBmYWxzZTsKICAgIH0pOwogICAgYnVmZmVyLndyaXRlKCciJyk7CiAgfQoKICB2b2lkIHdyaXRlRnJhbWVzKAogICAgICBJbmRleE1hcDxVcmk+IHVyaU1hcCwgSW5kZXhNYXA8U3RyaW5nPiBuYW1lTWFwLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CiAgICB2YXIgb2Zmc2V0RW5jb2RlciA9IERlbHRhRW5jb2RlcigpOwogICAgdmFyIHVyaUVuY29kZXIgPSBEZWx0YUVuY29kZXIoKTsKICAgIHZhciBsaW5lRW5jb2RlciA9IERlbHRhRW5jb2RlcigpOwogICAgdmFyIGNvbHVtbkVuY29kZXIgPSBEZWx0YUVuY29kZXIoKTsKICAgIHZhciBuYW1lRW5jb2RlciA9IERlbHRhRW5jb2RlcigpOwogICAgYnVmZmVyLndyaXRlKCciJyk7CiAgICBmcmFtZXMuZm9yRWFjaCgoaW50IG9mZnNldCwgTGlzdDxGcmFtZUVudHJ5PiBlbnRyaWVzKSB7CiAgICAgIGZvciAodmFyIGVudHJ5IGluIGVudHJpZXMpIHsKICAgICAgICBvZmZzZXRFbmNvZGVyLmVuY29kZShidWZmZXIsIG9mZnNldCk7CiAgICAgICAgaWYgKGVudHJ5LmlzUHVzaCkgewogICAgICAgICAgU291cmNlTG9jYXRpb24gbG9jYXRpb24gPSBlbnRyeS5wdXNoTG9jYXRpb247CiAgICAgICAgICB1cmlFbmNvZGVyLmVuY29kZShidWZmZXIsIHVyaU1hcFtsb2NhdGlvbi5zb3VyY2VVcmldKTsKICAgICAgICAgIGxpbmVFbmNvZGVyLmVuY29kZShidWZmZXIsIGxvY2F0aW9uLmxpbmUgLSAxKTsKICAgICAgICAgIGNvbHVtbkVuY29kZXIuZW5jb2RlKGJ1ZmZlciwgbG9jYXRpb24uY29sdW1uIC0gMSk7CiAgICAgICAgICBuYW1lRW5jb2Rlci5lbmNvZGUoYnVmZmVyLCBuYW1lTWFwW2VudHJ5LmlubGluZWRNZXRob2ROYW1lXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIDsgYW5kICwgYXJlIG5vdCB1c2VkIGJ5IFZMUSBzbyB3ZSBjYW4gZGlzdGluZ3Vpc2ggdGhlbSBpbiB0aGUKICAgICAgICAgIC8vIGVuY29kaW5nLCB0aGlzIGlzIHRoZSBzYW1lIHJlYXNvbiB0aGV5IGFyZSB1c2VkIGluIHRoZSBtYXBwaW5ncwogICAgICAgICAgLy8gZmllbGQuCiAgICAgICAgICBidWZmZXIud3JpdGUoZW50cnkuaXNFbXB0eVBvcCA/ICI7IiA6ICIsIik7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIGJ1ZmZlci53cml0ZSgnIicpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHNvdXJjZSBtYXAgdGFnIHRvIHB1dCBhdCB0aGUgZW5kIGEgLmpzIGZpbGUgaW4gW2ZpbGVVcmldIHRvCiAgLy8vIG1ha2UgaXQgcG9pbnQgdG8gdGhlIHNvdXJjZSBtYXAgZmlsZSBpbiBbc291cmNlTWFwVXJpXS4KICBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlU291cmNlTWFwVGFnKFVyaSBzb3VyY2VNYXBVcmksIFVyaSBmaWxlVXJpKSB7CiAgICBpZiAoc291cmNlTWFwVXJpICE9IG51bGwgJiYgZmlsZVVyaSAhPSBudWxsKSB7CiAgICAgIFN0cmluZyBzb3VyY2VNYXBGaWxlTmFtZSA9IHJlbGF0aXZpemUoZmlsZVVyaSwgc291cmNlTWFwVXJpLCBmYWxzZSk7CiAgICAgIHJldHVybiAnJycKCi8vIyBzb3VyY2VNYXBwaW5nVVJMPSRzb3VyY2VNYXBGaWxlTmFtZQonJyc7CiAgICB9CiAgICByZXR1cm4gJyc7CiAgfQoKICAvLy8gR2VuZXJhdGVzIHNvdXJjZSBtYXAgZmlsZXMgZm9yIGFsbCBbU291cmNlTG9jYXRpb25zXSBpbgogIC8vLyBbc291cmNlTG9jYXRpb25zUHJvdmlkZXJdIGZvciB0aGUgLmpzIGNvZGUgaW4gW2xvY2F0aW9uUHJvdmlkZXJdCiAgLy8vIFtzb3VyY2VNYXBVcmldIGlzIHVzZWQgdG8gcmVsYXRpdml6ZXMgdGhlIFVSSXMgb2YgdGhlIHJlZmVyZW5jZWQgc291cmNlCiAgLy8vIGZpbGVzIGFuZCB0aGUgdGFyZ2V0IFtmaWxlVXJpXS4gW25hbWVdIGFuZCBbb3V0cHV0UHJvdmlkZXJdIGFyZSB1c2VkIHRvCiAgLy8vIGNyZWF0ZSB0aGUgW091dHB1dFNpbmtdIGZvciB0aGUgc291cmNlIG1hcCB0ZXh0LgogIHN0YXRpYyB2b2lkIG91dHB1dFNvdXJjZU1hcCgKICAgICAgU291cmNlTG9jYXRpb25zUHJvdmlkZXIgc291cmNlTG9jYXRpb25zUHJvdmlkZXIsCiAgICAgIExvY2F0aW9uUHJvdmlkZXIgbG9jYXRpb25Qcm92aWRlciwKICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtaW5pZmllZEdsb2JhbE5hbWVzLAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1pbmlmaWVkSW5zdGFuY2VOYW1lcywKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIFVyaSBzb3VyY2VNYXBVcmksCiAgICAgIFVyaSBmaWxlVXJpLAogICAgICBDb21waWxlck91dHB1dCBjb21waWxlck91dHB1dCkgewogICAgLy8gQ3JlYXRlIGEgc291cmNlIGZpbGUgZm9yIHRoZSBjb21waWxhdGlvbiBvdXRwdXQuIFRoaXMgYWxsb3dzIHVzaW5nCiAgICAvLyBbOmdldExpbmU6XSB0byB0cmFuc2Zvcm0gb2Zmc2V0cyB0byBsaW5lIG51bWJlcnMgaW4gW1NvdXJjZU1hcEJ1aWxkZXJdLgogICAgaW50IGluZGV4ID0gMDsKICAgIHNvdXJjZUxvY2F0aW9uc1Byb3ZpZGVyLnNvdXJjZUxvY2F0aW9ucwogICAgICAgIC5mb3JFYWNoKChTb3VyY2VMb2NhdGlvbnMgc291cmNlTG9jYXRpb25zKSB7CiAgICAgIFNvdXJjZU1hcEJ1aWxkZXIgc291cmNlTWFwQnVpbGRlciA9IG5ldyBTb3VyY2VNYXBCdWlsZGVyKAogICAgICAgICAgc291cmNlTG9jYXRpb25zLm5hbWUsCiAgICAgICAgICBzb3VyY2VNYXBVcmksCiAgICAgICAgICBmaWxlVXJpLAogICAgICAgICAgbG9jYXRpb25Qcm92aWRlciwKICAgICAgICAgIG1pbmlmaWVkR2xvYmFsTmFtZXMsCiAgICAgICAgICBtaW5pZmllZEluc3RhbmNlTmFtZXMsCiAgICAgICAgICBzb3VyY2VMb2NhdGlvbnMuZnJhbWVNYXJrZXJzKTsKICAgICAgc291cmNlTG9jYXRpb25zLmZvckVhY2hTb3VyY2VMb2NhdGlvbihzb3VyY2VNYXBCdWlsZGVyLmFkZE1hcHBpbmcpOwogICAgICBTdHJpbmcgc291cmNlTWFwID0gc291cmNlTWFwQnVpbGRlci5idWlsZCgpOwogICAgICBTdHJpbmcgZXh0ZW5zaW9uID0gJ2pzLm1hcCc7CiAgICAgIGlmIChpbmRleCA+IDApIHsKICAgICAgICBpZiAobmFtZSA9PSAnJykgewogICAgICAgICAgbmFtZSA9IGZpbGVVcmkgIT0gbnVsbCA/IGZpbGVVcmkucGF0aFNlZ21lbnRzLmxhc3QgOiAnb3V0LmpzJzsKICAgICAgICAgIGV4dGVuc2lvbiA9ICdtYXAuJHtzb3VyY2VMb2NhdGlvbnMubmFtZX0nOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBleHRlbnNpb24gPSAnanMubWFwLiR7c291cmNlTG9jYXRpb25zLm5hbWV9JzsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29tcGlsZXJPdXRwdXQuY3JlYXRlT3V0cHV0U2luayhuYW1lLCBleHRlbnNpb24sIE91dHB1dFR5cGUuc291cmNlTWFwKQogICAgICAgIC4uYWRkKHNvdXJjZU1hcCkKICAgICAgICAuLmNsb3NlKCk7CiAgICAgIGluZGV4Kys7CiAgICB9KTsKICB9Cn0KCi8vLyBFbmNvZGVyIGZvciB2YWx1ZSBkZWx0YXMgaW4gVkxRIGZvcm1hdC4KY2xhc3MgRGVsdGFFbmNvZGVyIHsKICAvLy8gVGhlIGxhc3QgZW1pdHRlZCB2YWx1ZSBvZiB0aGUgZW5jb2Rlci4KICBpbnQgX3ZhbHVlID0gMDsKCiAgLy8vIFJlc2V0IHRoZSBlbmNvZGVyIHRvIGl0cyBpbml0aWFsIHN0YXRlLgogIHZvaWQgcmVzZXQoKSB7CiAgICBfdmFsdWUgPSAwOwogIH0KCiAgLy8vIFdyaXRlcyB0aGUgVkxRIG9mIGRlbHRhIGJldHdlZW4gW3ZhbHVlXSBhbmQgdGhlIGxhc3QgZW1pdHRlZCB2YWx1ZSBpbnRvCiAgLy8vIFtvdXRwdXRdIGFuZCB1cGRhdGVzIHRoZSBsYXN0IGVtaXR0ZWQgdmFsdWUgb2YgdGhlIGVuY29kZXIuCiAgdm9pZCBlbmNvZGUoU3RyaW5nQnVmZmVyIG91dHB1dCwgaW50IHZhbHVlKSB7CiAgICBfdmFsdWUgPSBlbmNvZGVWTFEob3V0cHV0LCB2YWx1ZSwgX3ZhbHVlKTsKICB9CgogIHN0YXRpYyBjb25zdCBpbnQgVkxRX0JBU0VfU0hJRlQgPSA1OwogIHN0YXRpYyBjb25zdCBpbnQgVkxRX0JBU0VfTUFTSyA9ICgxIDw8IDUpIC0gMTsKICBzdGF0aWMgY29uc3QgaW50IFZMUV9DT05USU5VQVRJT05fQklUID0gMSA8PCA1OwogIHN0YXRpYyBjb25zdCBpbnQgVkxRX0NPTlRJTlVBVElPTl9NQVNLID0gMSA8PCA1OwogIHN0YXRpYyBjb25zdCBTdHJpbmcgQkFTRTY0X0RJR0lUUyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1uJwogICAgICAnb3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJzsKCiAgLy8vIFdyaXRlcyB0aGUgVkxRIG9mIGRlbHRhIGJldHdlZW4gW3ZhbHVlXSBhbmQgW29mZnNldF0gaW50byBbb3V0cHV0XSBhbmQKICAvLy8gcmV0dXJuIFt2YWx1ZV0uCiAgc3RhdGljIGludCBlbmNvZGVWTFEoU3RyaW5nQnVmZmVyIG91dHB1dCwgaW50IHZhbHVlLCBpbnQgb2Zmc2V0KSB7CiAgICBpbnQgZGVsdGEgPSB2YWx1ZSAtIG9mZnNldDsKICAgIGludCBzaWduQml0ID0gMDsKICAgIGlmIChkZWx0YSA8IDApIHsKICAgICAgc2lnbkJpdCA9IDE7CiAgICAgIGRlbHRhID0gLWRlbHRhOwogICAgfQogICAgZGVsdGEgPSAoZGVsdGEgPDwgMSkgfCBzaWduQml0OwogICAgZG8gewogICAgICBpbnQgZGlnaXQgPSBkZWx0YSAmIFZMUV9CQVNFX01BU0s7CiAgICAgIGRlbHRhID4+PSBWTFFfQkFTRV9TSElGVDsKICAgICAgaWYgKGRlbHRhID4gMCkgewogICAgICAgIGRpZ2l0IHw9IFZMUV9DT05USU5VQVRJT05fQklUOwogICAgICB9CiAgICAgIG91dHB1dC53cml0ZShCQVNFNjRfRElHSVRTW2RpZ2l0XSk7CiAgICB9IHdoaWxlIChkZWx0YSA+IDApOwogICAgcmV0dXJuIHZhbHVlOwogIH0KfQoKY2xhc3MgU291cmNlTWFwRW50cnkgewogIFNvdXJjZUxvY2F0aW9uIHNvdXJjZUxvY2F0aW9uOwogIGludCB0YXJnZXRPZmZzZXQ7CgogIFNvdXJjZU1hcEVudHJ5KHRoaXMuc291cmNlTG9jYXRpb24sIHRoaXMudGFyZ2V0T2Zmc2V0KTsKfQoKLy8vIE1hcCBmcm9tIGxpbmUvY29sdW1uIHBhaXJzIHRvIGxpc3RzIG9mIFtUXSBlbGVtZW50cy4KY2xhc3MgTGluZUNvbHVtbk1hcDxUPiB7CiAgTWFwPGludCwgTWFwPGludCwgTGlzdDxUPj4+IF9tYXAgPSA8aW50LCBNYXA8aW50LCBMaXN0PFQ+Pj57fTsKCiAgLy8vIFJldHVybnMgdGhlIGxpc3Qgb2YgZWxlbWVudHMgYXNzb2NpYXRlZCB3aXRoIChbbGluZV0sW2NvbHVtbl0pLgogIExpc3Q8VD4gX2dldExpc3QoaW50IGxpbmUsIGludCBjb2x1bW4pIHsKICAgIE1hcDxpbnQsIExpc3Q8VD4+IGxpbmVNYXAgPSBfbWFwW2xpbmVdID8/PSA8aW50LCBMaXN0PFQ+Pnt9OwogICAgcmV0dXJuIGxpbmVNYXBbY29sdW1uXSA/Pz0gPFQ+W107CiAgfQoKICAvLy8gQWRkcyBbZWxlbWVudF0gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBvZiBlbGVtZW50cyBhc3NvY2lhdGVkIHdpdGgKICAvLy8gKFtsaW5lXSxbY29sdW1uXSkuCiAgdm9pZCBhZGQoaW50IGxpbmUsIGludCBjb2x1bW4sIFQgZWxlbWVudCkgewogICAgX2dldExpc3QobGluZSwgY29sdW1uKS5hZGQoZWxlbWVudCk7CiAgfQoKICAvLy8gQWRkcyBbZWxlbWVudF0gdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdCBvZiBlbGVtZW50cyBhc3NvY2lhdGVkIHdpdGgKICAvLy8gKFtsaW5lXSxbY29sdW1uXSkuCiAgdm9pZCBhZGRGaXJzdChpbnQgbGluZSwgaW50IGNvbHVtbiwgVCBlbGVtZW50KSB7CiAgICBfZ2V0TGlzdChsaW5lLCBjb2x1bW4pLmluc2VydCgwLCBlbGVtZW50KTsKICB9CgogIC8vLyBDYWxscyBbZl0gd2l0aCB0aGUgbGluZSBudW1iZXIgZm9yIGVhY2ggbGluZSB3aXRoIGFzc29jaWF0ZWQgZWxlbWVudHMuCiAgLy8vCiAgLy8vIFtmXSBpcyBjYWxsZWQgaW4gaW5jcmVhc2luZyBsaW5lIG9yZGVyLgogIHZvaWQgZm9yRWFjaExpbmUoZihpbnQgbGluZSkpIHsKICAgIExpc3Q8aW50PiBsaW5lcyA9IF9tYXAua2V5cy50b0xpc3QoKS4uc29ydCgpOwogICAgbGluZXMuZm9yRWFjaChmKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBlbGVtZW50cyBmb3IgdGhlIGZpcnN0IHRoZSBjb2x1bW4gaW4gW2xpbmVdIHRoYXQgaGFzCiAgLy8vIGFzc29jaWF0ZWQgZWxlbWVudHMuCiAgTGlzdDxUPiBnZXRGaXJzdEVsZW1lbnRzSW5MaW5lKGludCBsaW5lKSB7CiAgICBNYXA8aW50LCBMaXN0PFQ+PiBsaW5lTWFwID0gX21hcFtsaW5lXTsKICAgIGlmIChsaW5lTWFwID09IG51bGwpIHJldHVybiBudWxsOwogICAgTGlzdDxpbnQ+IGNvbHVtbnMgPSBsaW5lTWFwLmtleXMudG9MaXN0KCkuLnNvcnQoKTsKICAgIHJldHVybiBsaW5lTWFwW2NvbHVtbnMuZmlyc3RdOwogIH0KCiAgLy8vIENhbGxzIFtmXSBmb3IgZWFjaCBjb2x1bW4gd2l0aCBhc3NvY2lhdGVkIGVsZW1lbnRzIGluIFtsaW5lXS4KICAvLy8KICAvLy8gW2ZdIGlzIGNhbGxlZCBpbiBpbmNyZWFzaW5nIGNvbHVtbiBvcmRlci4KICB2b2lkIGZvckVhY2hDb2x1bW4oaW50IGxpbmUsIGYoaW50IGNvbHVtbiwgTGlzdDxUPiBlbGVtZW50cykpIHsKICAgIE1hcDxpbnQsIExpc3Q8VD4+IGxpbmVNYXAgPSBfbWFwW2xpbmVdOwogICAgaWYgKGxpbmVNYXAgIT0gbnVsbCkgewogICAgICBMaXN0PGludD4gY29sdW1ucyA9IGxpbmVNYXAua2V5cy50b0xpc3QoKS4uc29ydCgpOwogICAgICBjb2x1bW5zLmZvckVhY2goKGludCBjb2x1bW4pIHsKICAgICAgICBmKGNvbHVtbiwgbGluZU1hcFtjb2x1bW5dKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICAvLy8gQ2FsbHMgW2ZdIGZvciBlYWNoIGxpbmUvY29sdW1uL2VsZW1lbnQgdHJpcGxldCBpbiB0aGUgbWFwLgogIC8vLwogIC8vLyBbZl0gaXMgY2FsbGVkIGluIGluY3JlYXNpbmcgbGluZSwgY29sdW1uLCBlbGVtZW50IG9yZGVyLgogIHZvaWQgZm9yRWFjaChmKGludCBsaW5lLCBpbnQgY29sdW1uLCBUIGVsZW1lbnQpKSB7CiAgICBMaXN0PGludD4gbGluZXMgPSBfbWFwLmtleXMudG9MaXN0KCkuLnNvcnQoKTsKICAgIGZvciAoaW50IGxpbmUgaW4gbGluZXMpIHsKICAgICAgTWFwPGludCwgTGlzdDxUPj4gbGluZU1hcCA9IF9tYXBbbGluZV07CiAgICAgIExpc3Q8aW50PiBjb2x1bW5zID0gbGluZU1hcC5rZXlzLnRvTGlzdCgpLi5zb3J0KCk7CiAgICAgIGZvciAoaW50IGNvbHVtbiBpbiBjb2x1bW5zKSB7CiAgICAgICAgbGluZU1hcFtjb2x1bW5dLmZvckVhY2goKGUpID0+IGYobGluZSwgY29sdW1uLCBlKSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBDYWxscyBbZl0gZm9yIGVhY2ggZWxlbWVudCBhc3NvY2lhdGVkIGluIHRoZSBtYXAuCiAgLy8vCiAgLy8vIFtmXSBpcyBjYWxsZWQgaW4gaW5jcmVhc2luZyBsaW5lLCBjb2x1bW4sIGVsZW1lbnQgb3JkZXIuCiAgdm9pZCBmb3JFYWNoRWxlbWVudChmKFQgZWxlbWVudCkpIHsKICAgIGZvckVhY2goKGxpbmUsIGNvbHVtbiwgZWxlbWVudCkgPT4gZihlbGVtZW50KSk7CiAgfQp9CgovLy8gTWFwIGZyb20gW1RdIGVsZW1lbnRzIHRvIGFzc2lnbmVkIGluZGljZXMuCmNsYXNzIEluZGV4TWFwPFQ+IHsKICBNYXA8VCwgaW50PiBtYXAgPSA8VCwgaW50Pnt9OwoKICAvLy8gUmVnaXN0ZXIgW2VsZW1lbnRdIGFuZCByZXR1cm5zIGl0cyBpbmRleC4KICBpbnQgcmVnaXN0ZXIoVCBlbGVtZW50KSB7CiAgICByZXR1cm4gbWFwLnB1dElmQWJzZW50KGVsZW1lbnQsICgpID0+IG1hcC5sZW5ndGgpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIGluZGV4IG9mIFtlbGVtZW50XS4KICBpbnQgb3BlcmF0b3IgW10oVCBlbGVtZW50KSA9PiBtYXBbZWxlbWVudF07CgogIC8vLyBSZXR1cm5zIHRoZSBpbmRleGVkIGVsZW1lbnRzLgogIEl0ZXJhYmxlPFQ+IGdldCBlbGVtZW50cyA9PiBtYXAua2V5czsKfQqBxwBOTjwBJAEwTjIcIUlCARkYASYaASsbAStDAUYxMwE6KwEUFBkaHSAiFAFFQwQBShcXJSUZLxkVBhcEARMyLUAwNiBFKi43AT8eKj5APiNHCggIASIEAT8wNwE7JDA1MzkMCggGATouCAE6PDYjLi81CggGATZCAS4ZJy85FE8GKyM/IB5KBjYZITEZJSIaNS8mPhkoQCAkKiAeBAFRNysgOyI9OTs+AU88NhAIAS1AHQopJyUhCAEfGwggATgBJBAIATAfQUNHCAE1IEQIAS8IBAE9NxcXPyVRIhkjFQgXBAEUTSglJigmFzwjLhw4QTk9SBFLTRQ2CggIFwQBTj5GM0sRASgFBg8EAT5HTk43HzcpLzETGBMnSk8TLDVAIBgTHB8hKUozIxcaSTUROAoITRkTDwgEAgEsFS0SAS4REAQBTkIwLwQBJzEyM1EiAU0WRSAVFRMWBiQJKSAXJwgqGRIEAgEXIRQBOgIBORlBAUYrQSYEAUgZLikEAU4ZMy8EAU0GLiIyFgQBRxstLCY3IwQBRAYwQiwbOSUkCgYEAUEGPzUyHi45JDwIBgQBOAY/JjQEAgEvFCABMBw3BAEmLgEkKAIBL3BhY2thZ2U6Y29tcGlsZXIvc3JjL2lvL3NvdXJjZV9tYXBfYnVpbGRlci5kYXJ0P3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2VtaXR0ZXIvY29uc3RhbnRfb3JkZXJpbmcuZGFydK1RLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5qc19lbWl0dGVyLmNvbnN0YW50X29yZGVyaW5nOwoKaW1wb3J0ICcuLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnCiAgICBzaG93IENsYXNzRW50aXR5LCBGaWVsZEVudGl0eSwgTWVtYmVyRW50aXR5LCBUeXBlZGVmRW50aXR5OwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvanNfYmFja2VuZC5kYXJ0JyBzaG93IFN5bnRoZXRpY0NvbnN0YW50S2luZDsKaW1wb3J0ICdzb3J0ZXIuZGFydCcgc2hvdyBTb3J0ZXI7CgovLy8gQSBjYW5vbmljYWwgYnV0IGFyYml0cmFyeSBvcmRlcmluZyBvZiBjb25zdGFudHMuIFRoZSBvcmRlcmluZyBpcyAnc3RhYmxlJwovLy8gdW5kZXIgcGVydHVyYmF0aW9uIG9mIHRoZSBzb3VyY2UuCmFic3RyYWN0IGNsYXNzIENvbnN0YW50T3JkZXJpbmcgewogIGZhY3RvcnkgQ29uc3RhbnRPcmRlcmluZyhTb3J0ZXIgc29ydGVyKSA9IF9Db25zdGFudE9yZGVyaW5nOwoKICBpbnQgY29tcGFyZShDb25zdGFudFZhbHVlIGEsIENvbnN0YW50VmFsdWUgYik7Cn0KCmNsYXNzIF9Db25zdGFudE9yZGVyaW5nCiAgICBpbXBsZW1lbnRzIENvbnN0YW50T3JkZXJpbmcsIENvbnN0YW50VmFsdWVWaXNpdG9yPGludCwgQ29uc3RhbnRWYWx1ZT4gewogIGZpbmFsIFNvcnRlciBfc29ydGVyOwogIF9EYXJ0VHlwZU9yZGVyaW5nIF9kYXJ0VHlwZU9yZGVyaW5nOwogIF9Db25zdGFudE9yZGVyaW5nKHRoaXMuX3NvcnRlcikgewogICAgX2RhcnRUeXBlT3JkZXJpbmcgPSBuZXcgX0RhcnRUeXBlT3JkZXJpbmcodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgY29tcGFyZShDb25zdGFudFZhbHVlIGEsIENvbnN0YW50VmFsdWUgYikgPT4gY29tcGFyZVZhbHVlcyhhLCBiKTsKCiAgaW50IGNvbXBhcmVWYWx1ZXMoQ29uc3RhbnRWYWx1ZSBhLCBDb25zdGFudFZhbHVlIGIpIHsKICAgIGlmIChpZGVudGljYWwoYSwgYikpIHJldHVybiAwOwogICAgaW50IHIgPSBfS2luZFZpc2l0b3Iua2luZChhKS5jb21wYXJlVG8oX0tpbmRWaXNpdG9yLmtpbmQoYikpOwogICAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CiAgICByZXR1cm4gYS5hY2NlcHQodGhpcywgYik7CiAgfQoKICBzdGF0aWMgaW50IGNvbXBhcmVOdWxsYWJsZTxUPihpbnQgY29tcGFyZShUIGEsIFQgYiksIFQgYSwgVCBiKSB7CiAgICBpZiAoYSA9PSBudWxsICYmIGIgPT0gbnVsbCkgcmV0dXJuIDA7CiAgICBpZiAoYSA9PSBudWxsKSByZXR1cm4gLTE7CiAgICBpZiAoYiA9PSBudWxsKSByZXR1cm4gMTsKICAgIHJldHVybiBjb21wYXJlKGEsIGIpOwogIH0KCiAgc3RhdGljIGludCBjb21wYXJlTGlzdHM8UywgVD4oaW50IGNvbXBhcmUoUyBhLCBUIGIpLCBMaXN0PFM+IGEsIExpc3Q8VD4gYikgewogICAgaW50IHIgPSBhLmxlbmd0aC5jb21wYXJlVG8oYi5sZW5ndGgpOwogICAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKICAgICAgciA9IGNvbXBhcmUoYVtpXSwgYltpXSk7CiAgICAgIGlmIChyICE9IDApIHJldHVybiByOwogICAgfQogICAgcmV0dXJuIDA7CiAgfQoKICBpbnQgY29tcGFyZUNsYXNzZXMoQ2xhc3NFbnRpdHkgYSwgQ2xhc3NFbnRpdHkgYikgewogICAgaW50IHIgPSBhLm5hbWUuY29tcGFyZVRvKGIubmFtZSk7CiAgICBpZiAociAhPSAwKSByZXR1cm4gcjsKICAgIHJldHVybiBfc29ydGVyLmNvbXBhcmVDbGFzc2VzQnlMb2NhdGlvbihhLCBiKTsKICB9CgogIGludCBjb21wYXJlTWVtYmVycyhNZW1iZXJFbnRpdHkgYSwgTWVtYmVyRW50aXR5IGIpIHsKICAgIGludCByID0gYS5uYW1lLmNvbXBhcmVUbyhiLm5hbWUpOwogICAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CiAgICByZXR1cm4gX3NvcnRlci5jb21wYXJlTWVtYmVyc0J5TG9jYXRpb24oYSwgYik7CiAgfQoKICBpbnQgY29tcGFyZVR5cGVkZWZzKFR5cGVkZWZFbnRpdHkgYSwgVHlwZWRlZkVudGl0eSBiKSB7CiAgICBpbnQgciA9IGEubmFtZS5jb21wYXJlVG8oYi5uYW1lKTsKICAgIGlmIChyICE9IDApIHJldHVybiByOwogICAgcmV0dXJuIF9zb3J0ZXIuY29tcGFyZVR5cGVkZWZzQnlMb2NhdGlvbihhLCBiKTsKICB9CgogIGludCBjb21wYXJlRGFydFR5cGVzKERhcnRUeXBlIGEsIERhcnRUeXBlIGIpIHsKICAgIHJldHVybiBfZGFydFR5cGVPcmRlcmluZy5jb21wYXJlKGEsIGIpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0RnVuY3Rpb24oRnVuY3Rpb25Db25zdGFudFZhbHVlIGEsIEZ1bmN0aW9uQ29uc3RhbnRWYWx1ZSBiKSB7CiAgICByZXR1cm4gY29tcGFyZU1lbWJlcnMoYS5lbGVtZW50LCBiLmVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0TnVsbChOdWxsQ29uc3RhbnRWYWx1ZSBhLCBOdWxsQ29uc3RhbnRWYWx1ZSBiKSB7CiAgICByZXR1cm4gMDsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdE5vbkNvbnN0YW50KE5vbkNvbnN0YW50VmFsdWUgYSwgTm9uQ29uc3RhbnRWYWx1ZSBiKSB7CiAgICByZXR1cm4gMDsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdEludChJbnRDb25zdGFudFZhbHVlIGEsIEludENvbnN0YW50VmFsdWUgYikgewogICAgcmV0dXJuIGEuaW50VmFsdWUuY29tcGFyZVRvKGIuaW50VmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0RG91YmxlKERvdWJsZUNvbnN0YW50VmFsdWUgYSwgRG91YmxlQ29uc3RhbnRWYWx1ZSBiKSB7CiAgICByZXR1cm4gYS5kb3VibGVWYWx1ZS5jb21wYXJlVG8oYi5kb3VibGVWYWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRCb29sKEJvb2xDb25zdGFudFZhbHVlIGEsIEJvb2xDb25zdGFudFZhbHVlIGIpIHsKICAgIGludCBhSW50ID0gYS5ib29sVmFsdWUgPyAxIDogMDsKICAgIGludCBiSW50ID0gYi5ib29sVmFsdWUgPyAxIDogMDsKICAgIHJldHVybiBhSW50LmNvbXBhcmVUbyhiSW50KTsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdFN0cmluZyhTdHJpbmdDb25zdGFudFZhbHVlIGEsIFN0cmluZ0NvbnN0YW50VmFsdWUgYikgewogICAgU3RyaW5nIGFTdHJpbmcgPSBhLnN0cmluZ1ZhbHVlOwogICAgU3RyaW5nIGJTdHJpbmcgPSBiLnN0cmluZ1ZhbHVlOwogICAgcmV0dXJuIGFTdHJpbmcuY29tcGFyZVRvKGJTdHJpbmcpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0TGlzdChMaXN0Q29uc3RhbnRWYWx1ZSBhLCBMaXN0Q29uc3RhbnRWYWx1ZSBiKSB7CiAgICBpbnQgciA9IGNvbXBhcmVMaXN0cyhjb21wYXJlVmFsdWVzLCBhLmVudHJpZXMsIGIuZW50cmllcyk7CiAgICBpZiAociAhPSAwKSByZXR1cm4gcjsKICAgIHJldHVybiBjb21wYXJlRGFydFR5cGVzKGEudHlwZSwgYi50eXBlKTsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdFNldChTZXRDb25zdGFudFZhbHVlIGEsIFNldENvbnN0YW50VmFsdWUgYikgewogICAgaW50IHIgPSBjb21wYXJlTGlzdHMoY29tcGFyZVZhbHVlcywgYS52YWx1ZXMsIGIudmFsdWVzKTsKICAgIGlmIChyICE9IDApIHJldHVybiByOwogICAgcmV0dXJuIGNvbXBhcmVEYXJ0VHlwZXMoYS50eXBlLCBiLnR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0TWFwKE1hcENvbnN0YW50VmFsdWUgYSwgTWFwQ29uc3RhbnRWYWx1ZSBiKSB7CiAgICBpbnQgciA9IGNvbXBhcmVMaXN0cyhjb21wYXJlVmFsdWVzLCBhLmtleXMsIGIua2V5cyk7CiAgICBpZiAociAhPSAwKSByZXR1cm4gcjsKICAgIHIgPSBjb21wYXJlTGlzdHMoY29tcGFyZVZhbHVlcywgYS52YWx1ZXMsIGIudmFsdWVzKTsKICAgIGlmIChyICE9IDApIHJldHVybiByOwogICAgcmV0dXJuIGNvbXBhcmVEYXJ0VHlwZXMoYS50eXBlLCBiLnR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0Q29uc3RydWN0ZWQoQ29uc3RydWN0ZWRDb25zdGFudFZhbHVlIGEsIENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZSBiKSB7CiAgICBpbnQgciA9IGNvbXBhcmVEYXJ0VHlwZXMoYS50eXBlLCBiLnR5cGUpOwogICAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CgogICAgLy8gVE9ETyhzcmEpOiBBdm9pZCBhbGwgdGhlc2UgdGVhci1vZmZzLgogICAgTGlzdDxGaWVsZEVudGl0eT4gYUZpZWxkcyA9IGEuZmllbGRzLmtleXMudG9MaXN0KCkuLnNvcnQoY29tcGFyZU1lbWJlcnMpOwogICAgTGlzdDxGaWVsZEVudGl0eT4gYkZpZWxkcyA9IGIuZmllbGRzLmtleXMudG9MaXN0KCkuLnNvcnQoY29tcGFyZU1lbWJlcnMpOwoKICAgIHIgPSBjb21wYXJlTGlzdHMoY29tcGFyZU1lbWJlcnMsIGFGaWVsZHMsIGJGaWVsZHMpOwogICAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CgogICAgcmV0dXJuIGNvbXBhcmVMaXN0cygKICAgICAgICBjb21wYXJlVmFsdWVzLAogICAgICAgIGFGaWVsZHMubWFwKChmaWVsZCkgPT4gYS5maWVsZHNbZmllbGRdKS50b0xpc3QoKSwKICAgICAgICBhRmllbGRzLm1hcCgoZmllbGQpID0+IGIuZmllbGRzW2ZpZWxkXSkudG9MaXN0KCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0VHlwZShUeXBlQ29uc3RhbnRWYWx1ZSBhLCBUeXBlQ29uc3RhbnRWYWx1ZSBiKSB7CiAgICBpbnQgciA9IGNvbXBhcmVEYXJ0VHlwZXMoYS5yZXByZXNlbnRlZFR5cGUsIGIucmVwcmVzZW50ZWRUeXBlKTsKICAgIGlmIChyICE9IDApIHJldHVybiByOwogICAgcmV0dXJuIGNvbXBhcmVEYXJ0VHlwZXMoYS50eXBlLCBiLnR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0SW50ZXJjZXB0b3IoSW50ZXJjZXB0b3JDb25zdGFudFZhbHVlIGEsIEludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZSBiKSB7CiAgICByZXR1cm4gY29tcGFyZUNsYXNzZXMoYS5jbHMsIGIuY2xzKTsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdFN5bnRoZXRpYyhTeW50aGV0aWNDb25zdGFudFZhbHVlIGEsIFN5bnRoZXRpY0NvbnN0YW50VmFsdWUgYikgewogICAgLy8gW1N5bnRoZXRpY0NvbnN0YW50VmFsdWVdcyBoYXZlIGFic3RyYWN0IGZpZWxkcyB0aGF0IGFyZSBzZXQgb25seSBieQogICAgLy8gY29udmVudGlvbi4gIEx1Y2t5IGZvciB1cywgdGhleSBkbyBub3Qgb2NjdXIgYXMgdG9wIGxldmVsIGNvbnN0YW50LCBvbmx5CiAgICAvLyBhcyBlbGVtZW50cyBvZiBhIGZldyBjb25zdGFudHMuICBJZiB0aGlzIGJlY29tZXMgYSBzb3VyY2Ugb2YgaW5zdGFiaWxpdHksCiAgICAvLyB3ZSB3aWxsIG5lZWQgdG8gYWRkIGEgdG90YWwgb3JkZXJpbmcgb24gSmF2YVNjcmlwdCBBU1RzIGluY2x1ZGluZwogICAgLy8gZGVmZXJyZWQgZWxlbWVudHMuCiAgICBTeW50aGV0aWNDb25zdGFudEtpbmQgYUtpbmQgPSBhLnZhbHVlS2luZDsKICAgIFN5bnRoZXRpY0NvbnN0YW50S2luZCBiS2luZCA9IGIudmFsdWVLaW5kOwogICAgaW50IHIgPSBhS2luZC5pbmRleCAtIGJLaW5kLmluZGV4OwogICAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CiAgICBzd2l0Y2ggKGFLaW5kKSB7CiAgICAgIGNhc2UgU3ludGhldGljQ29uc3RhbnRLaW5kLkRVTU1ZX0lOVEVSQ0VQVE9SOgogICAgICBjYXNlIFN5bnRoZXRpY0NvbnN0YW50S2luZC5FTVBUWV9WQUxVRToKICAgICAgICAvLyBOZXZlciBlbWl0dGVkLgogICAgICAgIHJldHVybiAwOwoKICAgICAgY2FzZSBTeW50aGV0aWNDb25zdGFudEtpbmQuVFlQRVZBUklBQkxFX1JFRkVSRU5DRToKICAgICAgICAvLyBBbiBvcGFxdWUgZGVmZXJyZWQgSlMgQVNUIHJlZmVyZW5jZSB0byBhIHR5cGUgaW4gcmVmbGVjdGlvbiBkYXRhLgogICAgICAgIHJldHVybiAwOwogICAgICBjYXNlIFN5bnRoZXRpY0NvbnN0YW50S2luZC5OQU1FOgogICAgICAgIC8vIEFuIG9wYXF1ZSBkZWZlcnJlZCBKUyBBU1QgcmVmZXJlbmNlIHRvIGEgbmFtZS4KICAgICAgICByZXR1cm4gMDsKICAgICAgZGVmYXVsdDoKICAgICAgICAvLyBTaG91bGQgbm90IGhhcHBlbi4KICAgICAgICB0aHJvdyAndW5leHBlY3RlZCBTeW50aGV0aWNDb25zdGFudEtpbmQgJGFLaW5kJzsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdERlZmVycmVkR2xvYmFsKAogICAgICBEZWZlcnJlZEdsb2JhbENvbnN0YW50VmFsdWUgYSwgRGVmZXJyZWRHbG9iYWxDb25zdGFudFZhbHVlIGIpIHsKICAgIGludCByID0gY29tcGFyZVZhbHVlcyhhLnJlZmVyZW5jZWQsIGIucmVmZXJlbmNlZCk7CiAgICBpZiAociAhPSAwKSByZXR1cm4gcjsKICAgIHJldHVybiBhLnVuaXQuY29tcGFyZVRvKGIudW5pdCk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRJbnN0YW50aWF0aW9uKAogICAgICBJbnN0YW50aWF0aW9uQ29uc3RhbnRWYWx1ZSBhLCBJbnN0YW50aWF0aW9uQ29uc3RhbnRWYWx1ZSBiKSB7CiAgICBpbnQgciA9IGNvbXBhcmVWYWx1ZXMoYS5mdW5jdGlvbiwgYi5mdW5jdGlvbik7CiAgICBpZiAociAhPSAwKSByZXR1cm4gcjsKICAgIHJldHVybiBjb21wYXJlTGlzdHMoY29tcGFyZURhcnRUeXBlcywgYS50eXBlQXJndW1lbnRzLCBiLnR5cGVBcmd1bWVudHMpOwogIH0KfQoKY2xhc3MgX0tpbmRWaXNpdG9yIGltcGxlbWVudHMgQ29uc3RhbnRWYWx1ZVZpc2l0b3I8aW50LCBOdWxsPiB7CiAgY29uc3QgX0tpbmRWaXNpdG9yKCk7CgogIHN0YXRpYyBjb25zdCBpbnQgRlVOQ1RJT04gPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgTlVMTCA9IDI7CiAgc3RhdGljIGNvbnN0IGludCBJTlQgPSAzOwogIHN0YXRpYyBjb25zdCBpbnQgRE9VQkxFID0gNDsKICBzdGF0aWMgY29uc3QgaW50IEJPT0wgPSA1OwogIHN0YXRpYyBjb25zdCBpbnQgU1RSSU5HID0gNjsKICBzdGF0aWMgY29uc3QgaW50IExJU1QgPSA3OwogIHN0YXRpYyBjb25zdCBpbnQgU0VUID0gODsKICBzdGF0aWMgY29uc3QgaW50IE1BUCA9IDk7CiAgc3RhdGljIGNvbnN0IGludCBDT05TVFJVQ1RFRCA9IDEwOwogIHN0YXRpYyBjb25zdCBpbnQgVFlQRSA9IDExOwogIHN0YXRpYyBjb25zdCBpbnQgSU5URVJDRVBUT1IgPSAxMjsKICBzdGF0aWMgY29uc3QgaW50IFNZTlRIRVRJQyA9IDEzOwogIHN0YXRpYyBjb25zdCBpbnQgREVGRVJSRURfR0xPQkFMID0gMTQ7CiAgc3RhdGljIGNvbnN0IGludCBOT05DT05TVEFOVCA9IDE1OwogIHN0YXRpYyBjb25zdCBpbnQgSU5TVEFOVElBVElPTiA9IDE2OwoKICBzdGF0aWMgaW50IGtpbmQoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgPT4KICAgICAgY29uc3RhbnQuYWNjZXB0KGNvbnN0IF9LaW5kVmlzaXRvcigpLCBudWxsKTsKCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0RnVuY3Rpb24oRnVuY3Rpb25Db25zdGFudFZhbHVlIGEsIF8pID0+IEZVTkNUSU9OOwogIEBvdmVycmlkZQogIGludCB2aXNpdE51bGwoTnVsbENvbnN0YW50VmFsdWUgYSwgXykgPT4gTlVMTDsKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXROb25Db25zdGFudChOb25Db25zdGFudFZhbHVlIGEsIF8pID0+IE5PTkNPTlNUQU5UOwogIEBvdmVycmlkZQogIGludCB2aXNpdEludChJbnRDb25zdGFudFZhbHVlIGEsIF8pID0+IElOVDsKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXREb3VibGUoRG91YmxlQ29uc3RhbnRWYWx1ZSBhLCBfKSA9PiBET1VCTEU7CiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0Qm9vbChCb29sQ29uc3RhbnRWYWx1ZSBhLCBfKSA9PiBCT09MOwogIEBvdmVycmlkZQogIGludCB2aXNpdFN0cmluZyhTdHJpbmdDb25zdGFudFZhbHVlIGEsIF8pID0+IFNUUklORzsKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRMaXN0KExpc3RDb25zdGFudFZhbHVlIGEsIF8pID0+IExJU1Q7CiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0U2V0KFNldENvbnN0YW50VmFsdWUgYSwgXykgPT4gU0VUOwogIEBvdmVycmlkZQogIGludCB2aXNpdE1hcChNYXBDb25zdGFudFZhbHVlIGEsIF8pID0+IE1BUDsKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRDb25zdHJ1Y3RlZChDb25zdHJ1Y3RlZENvbnN0YW50VmFsdWUgYSwgXykgPT4gQ09OU1RSVUNURUQ7CiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0VHlwZShUeXBlQ29uc3RhbnRWYWx1ZSBhLCBfKSA9PiBUWVBFOwogIEBvdmVycmlkZQogIGludCB2aXNpdEludGVyY2VwdG9yKEludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZSBhLCBfKSA9PiBJTlRFUkNFUFRPUjsKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRTeW50aGV0aWMoU3ludGhldGljQ29uc3RhbnRWYWx1ZSBhLCBfKSA9PiBTWU5USEVUSUM7CiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0RGVmZXJyZWRHbG9iYWwoRGVmZXJyZWRHbG9iYWxDb25zdGFudFZhbHVlIGEsIF8pID0+IERFRkVSUkVEX0dMT0JBTDsKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRJbnN0YW50aWF0aW9uKEluc3RhbnRpYXRpb25Db25zdGFudFZhbHVlIGEsIF8pID0+IElOU1RBTlRJQVRJT047Cn0KCi8vLyBWaXNpdG9yIGZvciBkaXN0aW5ndWlzaGluZyB0eXBlcyBieSBraW5kLgpjbGFzcyBfRGFydFR5cGVLaW5kVmlzaXRvciBleHRlbmRzIERhcnRUeXBlVmlzaXRvcjxpbnQsIE51bGw+IHsKICBjb25zdCBfRGFydFR5cGVLaW5kVmlzaXRvcigpOwoKICBzdGF0aWMgaW50IGtpbmQoRGFydFR5cGUgdHlwZSkgewogICAgcmV0dXJuIHR5cGUuYWNjZXB0KGNvbnN0IF9EYXJ0VHlwZUtpbmRWaXNpdG9yKCksIG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0Vm9pZFR5cGUoY292YXJpYW50IFZvaWRUeXBlIHR5cGUsIF8pID0+IDY7CiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0VHlwZVZhcmlhYmxlVHlwZShjb3ZhcmlhbnQgVHlwZVZhcmlhYmxlVHlwZSB0eXBlLCBfKSA9PiAzOwogIEBvdmVycmlkZQogIGludCB2aXNpdEZ1bmN0aW9uVHlwZShjb3ZhcmlhbnQgRnVuY3Rpb25UeXBlIHR5cGUsIF8pID0+IDA7CiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0SW50ZXJmYWNlVHlwZShjb3ZhcmlhbnQgSW50ZXJmYWNlVHlwZSB0eXBlLCBfKSA9PiAxOwogIEBvdmVycmlkZQogIGludCB2aXNpdFR5cGVkZWZUeXBlKGNvdmFyaWFudCBUeXBlZGVmVHlwZSB0eXBlLCBfKSA9PiAyOwogIEBvdmVycmlkZQogIGludCB2aXNpdER5bmFtaWNUeXBlKGNvdmFyaWFudCBEeW5hbWljVHlwZSB0eXBlLCBfKSA9PiA1Owp9CgpjbGFzcyBfRGFydFR5cGVPcmRlcmluZyBleHRlbmRzIERhcnRUeXBlVmlzaXRvcjxpbnQsIERhcnRUeXBlPiB7CiAgZmluYWwgX0NvbnN0YW50T3JkZXJpbmcgX2NvbnN0YW50T3JkZXJpbmc7CiAgRGFydFR5cGUgX3Jvb3Q7CiAgX0RhcnRUeXBlT3JkZXJpbmcodGhpcy5fY29uc3RhbnRPcmRlcmluZyk7CgogIGludCBjb21wYXJlKERhcnRUeXBlIGEsIERhcnRUeXBlIGIpIHsKICAgIGlmIChhID09IGIpIHJldHVybiAwOwogICAgaW50IHIgPQogICAgICAgIF9EYXJ0VHlwZUtpbmRWaXNpdG9yLmtpbmQoYSkuY29tcGFyZVRvKF9EYXJ0VHlwZUtpbmRWaXNpdG9yLmtpbmQoYikpOwogICAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CiAgICBfcm9vdCA9IGE7CiAgICByID0gYS5hY2NlcHQodGhpcywgYik7CiAgICBfcm9vdCA9IG51bGw7CiAgICByZXR1cm4gcjsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdFZvaWRUeXBlKGNvdmFyaWFudCBWb2lkVHlwZSB0eXBlLCBjb3ZhcmlhbnQgVm9pZFR5cGUgb3RoZXIpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdVbnJlYWNoYWJsZScpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0VHlwZVZhcmlhYmxlVHlwZSgKICAgICAgY292YXJpYW50IFR5cGVWYXJpYWJsZVR5cGUgdHlwZSwgY292YXJpYW50IFR5cGVWYXJpYWJsZVR5cGUgb3RoZXIpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJUeXBlIHZhcmlhYmxlcyBhcmUgbm90IGV4cGVjdGVkIGluIGNvbnN0YW50czogJyR0eXBlJyBpbiAnJF9yb290JyIpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0RnVuY3Rpb25UeXBlKAogICAgICBjb3ZhcmlhbnQgRnVuY3Rpb25UeXBlIHR5cGUsIGNvdmFyaWFudCBGdW5jdGlvblR5cGUgb3RoZXIpIHsKICAgIGludCByID0gX2NvbXBhcmVUeXBlQXJndW1lbnRzKHR5cGUucGFyYW1ldGVyVHlwZXMsIG90aGVyLnBhcmFtZXRlclR5cGVzKTsKICAgIGlmIChyICE9IDApIHJldHVybiByOwogICAgciA9IF9jb21wYXJlVHlwZUFyZ3VtZW50cygKICAgICAgICB0eXBlLm9wdGlvbmFsUGFyYW1ldGVyVHlwZXMsIG90aGVyLm9wdGlvbmFsUGFyYW1ldGVyVHlwZXMpOwogICAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CiAgICByID0gX0NvbnN0YW50T3JkZXJpbmcuY29tcGFyZUxpc3RzKChTdHJpbmcgYSwgU3RyaW5nIGIpID0+IGEuY29tcGFyZVRvKGIpLAogICAgICAgIHR5cGUubmFtZWRQYXJhbWV0ZXJzLCBvdGhlci5uYW1lZFBhcmFtZXRlcnMpOwogICAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CiAgICByID0gX2NvbXBhcmVUeXBlQXJndW1lbnRzKAogICAgICAgIHR5cGUubmFtZWRQYXJhbWV0ZXJUeXBlcywgb3RoZXIubmFtZWRQYXJhbWV0ZXJUeXBlcyk7CiAgICBpZiAociAhPSAwKSByZXR1cm4gcjsKICAgIHJldHVybiBjb21wYXJlKHR5cGUucmV0dXJuVHlwZSwgb3RoZXIucmV0dXJuVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRJbnRlcmZhY2VUeXBlKAogICAgICBjb3ZhcmlhbnQgSW50ZXJmYWNlVHlwZSB0eXBlLCBjb3ZhcmlhbnQgSW50ZXJmYWNlVHlwZSBvdGhlcikgewogICAgaW50IHIgPSBfY29uc3RhbnRPcmRlcmluZy5jb21wYXJlQ2xhc3Nlcyh0eXBlLmVsZW1lbnQsIG90aGVyLmVsZW1lbnQpOwogICAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CiAgICByZXR1cm4gX2NvbXBhcmVUeXBlQXJndW1lbnRzKHR5cGUudHlwZUFyZ3VtZW50cywgb3RoZXIudHlwZUFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRUeXBlZGVmVHlwZSgKICAgICAgY292YXJpYW50IFR5cGVkZWZUeXBlIHR5cGUsIGNvdmFyaWFudCBUeXBlZGVmVHlwZSBvdGhlcikgewogICAgaW50IHIgPSBfY29uc3RhbnRPcmRlcmluZy5jb21wYXJlVHlwZWRlZnModHlwZS5lbGVtZW50LCBvdGhlci5lbGVtZW50KTsKICAgIGlmIChyICE9IDApIHJldHVybiByOwogICAgcmV0dXJuIF9jb21wYXJlVHlwZUFyZ3VtZW50cyh0eXBlLnR5cGVBcmd1bWVudHMsIG90aGVyLnR5cGVBcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0RHluYW1pY1R5cGUoCiAgICAgIGNvdmFyaWFudCBEeW5hbWljVHlwZSB0eXBlLCBjb3ZhcmlhbnQgRHluYW1pY1R5cGUgb3RoZXIpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdVbnJlYWNoYWJsZScpOwogIH0KCiAgaW50IF9jb21wYXJlVHlwZUFyZ3VtZW50cygKICAgICAgTGlzdDxEYXJ0VHlwZT4gYUFyZ3VtZW50cywgTGlzdDxEYXJ0VHlwZT4gYkFyZ3VtZW50cykgewogICAgcmV0dXJuIF9Db25zdGFudE9yZGVyaW5nLmNvbXBhcmVMaXN0cyhjb21wYXJlLCBhQXJndW1lbnRzLCBiQXJndW1lbnRzKTsKICB9Cn0KgXEATk48AS4BIyNAIUMiAU4mIj8BMQIBGEwYJyQ1BAEMSAE4I0IaHgQBQyoeHRoEAU8qGikfHAYOBAE1JhozBAE3JhozBAE6Jho0BAExLAQBDEgxBAEMPA4EAQxBDgQBDDktBAEMQjMEAQw8JCQhBAEMQiQkJwQBDDw/Gi0EAQw5PRotBAEMOTkaORotBAEMUS4aAS1OTgE4GgEZFzo7BAEMPEQaLQQBDFEpBAEMS0tQUUkaLy8nGhU0LhoSATlNEic6Eg8eOQYEAQwbRjcaJQQBDBpEMxpNBAIBQBgBIR0cHx0fHRwcJR4lIyklJwEtMwEMPQwxDD4MLgw3DDEMNwwxDC4MLgxGDDEMRgxADFAMTAIBLkAgASM8BAEMNgxGDD4MQAw8DDwCAUEtEi0BKBoMThoPGxIOBAEMSS8EAQwdSyBOBAEMGUNOGh9EGk82Gh8+GjcEAQwaRUsaSwQBDBhBTBpLBAEMGEEvBAEdPkwEAgE2cGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9jb25zdGFudF9vcmRlcmluZy5kYXJ0NXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2VtaXR0ZXIvaGVhZGVycy5kYXJ0huwvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmpzX2VtaXR0ZXIuaGVhZGVyczsKCmltcG9ydCAnLi4vY29tcGlsZXIuZGFydCcgc2hvdyBDb21waWxlcjsKClN0cmluZyBnZW5lcmF0ZWRCeShDb21waWxlciBjb21waWxlciwge1N0cmluZyBmbGF2b3I6ICIifSkgewogIFN0cmluZyBzdWZmaXggPSAnJzsKICBpZiAoY29tcGlsZXIub3B0aW9ucy5oYXNCdWlsZElkKSB7CiAgICBzdWZmaXggPSAnIHZlcnNpb246ICR7Y29tcGlsZXIub3B0aW9ucy5idWlsZElkfSc7CiAgfQogIGlmIChmbGF2b3IgIT0gIiIpIGZsYXZvciA9ICIgKCRmbGF2b3IpIjsKICByZXR1cm4gJy8vIEdlbmVyYXRlZCBieSBkYXJ0MmpzJGZsYXZvciwgJwogICAgICAndGhlIERhcnQgdG8gSmF2YVNjcmlwdCBjb21waWxlciRzdWZmaXguJzsKfQoKY29uc3QgU3RyaW5nIEhPT0tTX0FQSV9VU0FHRSA9ICIiIgovLyBUaGUgY29kZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGhvb2tzOgovLyBkYXJ0UHJpbnQobWVzc2FnZSk6Ci8vICAgIGlmIHRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBpdCBpcyBjYWxsZWQgaW5zdGVhZCBvZiB0aGUgRGFydCBbcHJpbnRdCi8vICAgIG1ldGhvZC4KLy8KLy8gZGFydE1haW5SdW5uZXIobWFpbiwgYXJncyk6Ci8vICAgIGlmIHRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCwgdGhlIERhcnQgW21haW5dIG1ldGhvZCB3aWxsIG5vdCBiZSBpbnZva2VkCi8vICAgIGRpcmVjdGx5LiBJbnN0ZWFkLCBhIGNsb3N1cmUgdGhhdCB3aWxsIGludm9rZSBbbWFpbl0sIGFuZCBpdHMgYXJndW1lbnRzCi8vICAgIFthcmdzXSBpcyBwYXNzZWQgdG8gW2RhcnRNYWluUnVubmVyXS4KLy8KLy8gZGFydERlZmVycmVkTGlicmFyeUxvYWRlcih1cmksIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk6Ci8vICAgIGlmIHRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCwgaXQgd2lsbCBiZSBjYWxsZWQgd2hlbiBhIGRlZmVycmVkIGxpYnJhcnkKLy8gICAgaXMgbG9hZGVkLiBJdCBzaG91bGQgbG9hZCBhbmQgZXZhbCB0aGUgamF2YXNjcmlwdCBvZiBgdXJpYCwgYW5kIGNhbGwKLy8gICAgc3VjY2Vzc0NhbGxiYWNrLiBJZiBpdCBmYWlscyB0byBkbyBzbywgaXQgc2hvdWxkIGNhbGwgZXJyb3JDYWxsYmFjayB3aXRoCi8vICAgIGFuIGVycm9yLgovLwovLyBkYXJ0Q2FsbEluc3RydW1lbnRhdGlvbihpZCwgcXVhbGlmaWVkTmFtZSk6Ci8vICAgIGlmIHRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCwgaXQgd2lsbCBiZSBjYWxsZWQgYXQgZWFjaCBlbnRyeSBvZiBhCi8vICAgIG1ldGhvZCBvciBjb25zdHJ1Y3Rvci4gVXNlZCBvbmx5IHdoZW4gY29tcGlsaW5nIHByb2dyYW1zIHdpdGgKLy8gICAgLS1leHBlcmltZW50LWNhbGwtaW5zdHJ1bWVudGF0aW9uLgovLwovLyBkZWZhdWx0UGFja2FnZXNCYXNlOgovLyAgICBPdmVycmlkZSB0aGUgbG9jYXRpb24gd2hlcmUgYHBhY2thZ2U6YCB1cmlzIGFyZSByZXNvbHZlZCBmcm9tLiBCeSBkZWZhdWx0Ci8vICAgIHRoZXkgYXJlIHJlc29sdmVkIHVuZGVyICJwYWNrYWdlcy8iIGZyb20gdGhlIGN1cnJlbnQgd2luZG93IGxvY2F0aW9uLgoiIiI7Ci4ATk48ASQBKQE9FiU2BCssMQIBIyoXSw4DH05OLANDTUtPEAMvSEQpAxhQTAUBLHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvaGVhZGVycy5kYXJ0L3Nka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jcnlwdG8vbGliL2NyeXB0by5kYXJ0gWwvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKZXhwb3J0ICdzcmMvZGlnZXN0LmRhcnQnOwpleHBvcnQgJ3NyYy9oYXNoLmRhcnQnOwpleHBvcnQgJ3NyYy9obWFjLmRhcnQnOwpleHBvcnQgJ3NyYy9tZDUuZGFydCc7CmV4cG9ydCAnc3JjL3NoYTEuZGFydCc7CmV4cG9ydCAnc3JjL3NoYTI1Ni5kYXJ0JzsKDABOTjwBGhgYFxgaARpwYWNrYWdlOmNyeXB0by9jcnlwdG8uZGFydDNzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY3J5cHRvL2xpYi9zcmMvZGlnZXN0LmRhcnSDti8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6Y29sbGVjdGlvbi9jb2xsZWN0aW9uLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6Y29udmVydC9jb252ZXJ0LmRhcnQnOwoKLy8vIEEgbWVzc2FnZSBkaWdlc3QgYXMgY29tcHV0ZWQgYnkgYSBgSGFzaGAgb3IgYEhNQUNgIGZ1bmN0aW9uLgpjbGFzcyBEaWdlc3QgewogIC8vLyBUaGUgbWVzc2FnZSBkaWdlc3QgYXMgYW4gYXJyYXkgb2YgYnl0ZXMuCiAgZmluYWwgTGlzdDxpbnQ+IGJ5dGVzOwoKICBEaWdlc3QodGhpcy5ieXRlcyk7CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgdGhpcyBpcyBlcXVhbCB0byBhbm90aGVyIGRpZ2VzdC4KICAvLy8KICAvLy8gVGhpcyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIG1hbnVhbCBjb21wYXJpc29ucyB0byBhdm9pZCBsZWFraW5nCiAgLy8vIGluZm9ybWF0aW9uIHZpYSB0aW1pbmcuCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpID0+CiAgICAgIG90aGVyIGlzIERpZ2VzdCAmJiBjb25zdCBMaXN0RXF1YWxpdHkoKS5lcXVhbHMoYnl0ZXMsIG90aGVyLmJ5dGVzKTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBjb25zdCBMaXN0RXF1YWxpdHkoKS5oYXNoKGJ5dGVzKTsKCiAgLy8vIFRoZSBtZXNzYWdlIGRpZ2VzdCBhcyBhIHN0cmluZyBvZiBoZXhhZGVjaW1hbCBkaWdpdHMuCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gaGV4LmVuY29kZShieXRlcyk7Cn0KHwBOTjwBLScBQQ8vGQEWATcGSR4MJEoBDDgBPAwqAgEecGFja2FnZTpjcnlwdG8vc3JjL2RpZ2VzdC5kYXJ0MXNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jcnlwdG8vbGliL3NyYy9oYXNoLmRhcnSEQy8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CgppbXBvcnQgJ2RpZ2VzdC5kYXJ0JzsKaW1wb3J0ICdkaWdlc3Rfc2luay5kYXJ0JzsKCi8vLyBBbiBpbnRlcmZhY2UgZm9yIGNyeXB0b2dyYXBoaWMgaGFzaCBmdW5jdGlvbnMuCi8vLwovLy8gRXZlcnkgaGFzaCBpcyBhIGNvbnZlcnRlciB0aGF0IHRha2VzIGEgbGlzdCBvZiBpbnRzIGFuZCByZXR1cm5zIGEgc2luZ2xlCi8vLyBkaWdlc3QuIFdoZW4gdXNlZCBpbiBjaHVua2VkIG1vZGUsIGl0IHdpbGwgb25seSBldmVyIGFkZCBvbmUgZGlnZXN0IHRvIHRoZQovLy8gaW5uZXIgW1NpbmtdLgphYnN0cmFjdCBjbGFzcyBIYXNoIGV4dGVuZHMgQ29udmVydGVyPExpc3Q8aW50PiwgRGlnZXN0PiB7CiAgLy8vIFRoZSBpbnRlcm5hbCBibG9jayBzaXplIG9mIHRoZSBoYXNoIGluIGJ5dGVzLgogIC8vLwogIC8vLyBUaGlzIGlzIGV4cG9zZWQgZm9yIHVzZSBieSB0aGUgYEhtYWNgIGNsYXNzLCB3aGljaCBuZWVkcyB0byBrbm93IHRoZSBibG9jawogIC8vLyBzaXplIGZvciB0aGUgW0hhc2hdIGl0IHVzZXMuCiAgaW50IGdldCBibG9ja1NpemU7CgogIGNvbnN0IEhhc2goKTsKCiAgQG92ZXJyaWRlCiAgRGlnZXN0IGNvbnZlcnQoTGlzdDxpbnQ+IGRhdGEpIHsKICAgIHZhciBpbm5lclNpbmsgPSBuZXcgRGlnZXN0U2luaygpOwogICAgdmFyIG91dGVyU2luayA9IHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oaW5uZXJTaW5rKTsKICAgIG91dGVyU2luay5hZGQoZGF0YSk7CiAgICBvdXRlclNpbmsuY2xvc2UoKTsKICAgIHJldHVybiBpbm5lclNpbmsudmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICBCeXRlQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPERpZ2VzdD4gc2luayk7Cn0KJQBOTjwBFwEWGwEzBE1PEjs0BlEjFQEQAQwjJjcZFxwEAQxAAgEccGFja2FnZTpjcnlwdG8vc3JjL2hhc2guZGFydDFzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY3J5cHRvL2xpYi9zcmMvaG1hYy5kYXJ0jGUvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CgppbXBvcnQgJ2RpZ2VzdC5kYXJ0JzsKaW1wb3J0ICdkaWdlc3Rfc2luay5kYXJ0JzsKaW1wb3J0ICdoYXNoLmRhcnQnOwoKLy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIFtrZXllZC1oYXNoIG1ldGhvZCBhdXRoZW50aWNhdGlvbiBjb2Rlc11bcmZjXS4KLy8vCi8vLyBbcmZjXTogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIxMDQKLy8vCi8vLyBITUFDIGFsbG93cyBtZXNzYWdlcyB0byBiZSBjcnlwdG9ncmFwaGljYWxseSBhdXRoZW50aWNhdGVkIHVzaW5nIGFueQovLy8gaXRlcmF0ZWQgY3J5cHRvZ3JhcGhpYyBoYXNoIGZ1bmN0aW9uLgpjbGFzcyBIbWFjIGV4dGVuZHMgQ29udmVydGVyPExpc3Q8aW50PiwgRGlnZXN0PiB7CiAgLy8vIFRoZSBoYXNoIGZ1bmN0aW9uIHVzZWQgdG8gY29tcHV0ZSB0aGUgYXV0aGVudGljYXRpb24gZGlnZXN0LgogIGZpbmFsIEhhc2ggX2hhc2g7CgogIC8vLyBUaGUgc2VjcmV0IGtleSBzaGFyZWQgYnkgdGhlIHNlbmRlciBhbmQgdGhlIHJlY2VpdmVyLgogIGZpbmFsIFVpbnQ4TGlzdCBfa2V5OwoKICAvLy8gQ3JlYXRlIGFuIFtIbWFjXSBvYmplY3QgZnJvbSBhIFtIYXNoXSBhbmQgYSBiaW5hcnkga2V5LgogIC8vLwogIC8vLyBUaGUga2V5IHNob3VsZCBiZSBhIHNlY3JldCBzaGFyZWQgYmV0d2VlbiB0aGUgc2VuZGVyIGFuZCByZWNlaXZlciBvZiB0aGUKICAvLy8gbWVzc2FnZS4KICBIbWFjKEhhc2ggaGFzaCwgTGlzdDxpbnQ+IGtleSkKICAgICAgOiBfaGFzaCA9IGhhc2gsCiAgICAgICAgX2tleSA9IG5ldyBVaW50OExpc3QoaGFzaC5ibG9ja1NpemUpIHsKICAgIC8vIEhhc2ggdGhlIGtleSBpZiBpdCdzIGxvbmdlciB0aGFuIHRoZSBibG9jayBzaXplIG9mIHRoZSBoYXNoLgogICAgaWYgKGtleS5sZW5ndGggPiBfaGFzaC5ibG9ja1NpemUpIGtleSA9IF9oYXNoLmNvbnZlcnQoa2V5KS5ieXRlczsKCiAgICAvLyBJZiBba2V5XSBpcyBzaG9ydGVyIHRoYW4gdGhlIGJsb2NrIHNpemUsIHRoZSByZXN0IG9mIFtfa2V5XSB3aWxsIGJlCiAgICAvLyAwLXBhZGRlZC4KICAgIF9rZXkuc2V0UmFuZ2UoMCwga2V5Lmxlbmd0aCwga2V5KTsKICB9CgogIEBvdmVycmlkZQogIERpZ2VzdCBjb252ZXJ0KExpc3Q8aW50PiBkYXRhKSB7CiAgICB2YXIgaW5uZXJTaW5rID0gbmV3IERpZ2VzdFNpbmsoKTsKICAgIHZhciBvdXRlclNpbmsgPSBzdGFydENodW5rZWRDb252ZXJzaW9uKGlubmVyU2luayk7CiAgICBvdXRlclNpbmsuYWRkKGRhdGEpOwogICAgb3V0ZXJTaW5rLmNsb3NlKCk7CiAgICByZXR1cm4gaW5uZXJTaW5rLnZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgQnl0ZUNvbnZlcnNpb25TaW5rIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxEaWdlc3Q+IHNpbmspID0+CiAgICAgIG5ldyBfSG1hY1Npbmsoc2luaywgX2hhc2gsIF9rZXkpOwp9CgovLy8gVGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBITUFDIGFsZ29yaXRobS4KY2xhc3MgX0htYWNTaW5rIGV4dGVuZHMgQnl0ZUNvbnZlcnNpb25TaW5rIHsKICAvLy8gVGhlIHNpbmsgZm9yIHRoZSBvdXRlciBoYXNoIGNvbXB1dGF0aW9uLgogIGZpbmFsIEJ5dGVDb252ZXJzaW9uU2luayBfb3V0ZXJTaW5rOwoKICAvLy8gVGhlIHNpbmsgdGhhdCBbX2lubmVyU2lua10ncyByZXN1bHQgd2lsbCBiZSBhZGRlZCB0byB3aGVuIGl0J3MgYXZhaWxhYmxlLgogIGZpbmFsIF9pbm5lclJlc3VsdFNpbmsgPSBuZXcgRGlnZXN0U2luaygpOwoKICAvLy8gVGhlIHNpbmsgZm9yIHRoZSBpbm5lciBoYXNoIGNvbXB1dGF0aW9uLgogIEJ5dGVDb252ZXJzaW9uU2luayBfaW5uZXJTaW5rOwoKICAvLy8gV2hldGhlciBbY2xvc2VdIGhhcyBiZWVuIGNhbGxlZC4KICBib29sIF9pc0Nsb3NlZCA9IGZhbHNlOwoKICBfSG1hY1NpbmsoU2luazxEaWdlc3Q+IHNpbmssIEhhc2ggaGFzaCwgTGlzdDxpbnQ+IGtleSkKICAgICAgOiBfb3V0ZXJTaW5rID0gaGFzaC5zdGFydENodW5rZWRDb252ZXJzaW9uKHNpbmspIHsKICAgIF9pbm5lclNpbmsgPSBoYXNoLnN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oX2lubmVyUmVzdWx0U2luayk7CgogICAgLy8gQ29tcHV0ZSBvdXRlciBwYWRkaW5nLgogICAgdmFyIHBhZGRpbmcgPSBuZXcgVWludDhMaXN0KGtleS5sZW5ndGgpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWRkaW5nLmxlbmd0aDsgaSsrKSB7CiAgICAgIHBhZGRpbmdbaV0gPSAweDVjIF4ga2V5W2ldOwogICAgfQogICAgX291dGVyU2luay5hZGQocGFkZGluZyk7CgogICAgLy8gQ29tcHV0ZSBpbm5lciBwYWRkaW5nLgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWRkaW5nLmxlbmd0aDsgaSsrKSB7CiAgICAgIHBhZGRpbmdbaV0gPSAweDM2IF4ga2V5W2ldOwogICAgfQogICAgX2lubmVyU2luay5hZGQocGFkZGluZyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZChMaXN0PGludD4gZGF0YSkgewogICAgaWYgKF9pc0Nsb3NlZCkgdGhyb3cgbmV3IFN0YXRlRXJyb3IoJ0hNQUMgaXMgY2xvc2VkJyk7CiAgICBfaW5uZXJTaW5rLmFkZChkYXRhKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWRkU2xpY2UoTGlzdDxpbnQ+IGRhdGEsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIGlmIChfaXNDbG9zZWQpIHRocm93IG5ldyBTdGF0ZUVycm9yKCdITUFDIGlzIGNsb3NlZCcpOwogICAgX2lubmVyU2luay5hZGRTbGljZShkYXRhLCBzdGFydCwgZW5kLCBpc0xhc3QpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjbG9zZSgpIHsKICAgIGlmIChfaXNDbG9zZWQpIHJldHVybjsKICAgIF9pc0Nsb3NlZCA9IHRydWU7CgogICAgX2lubmVyU2luay5jbG9zZSgpOwogICAgX291dGVyU2luay5hZGQoX2lubmVyUmVzdWx0U2luay52YWx1ZS5ieXRlcyk7CiAgICBfb3V0ZXJTaW5rLmNsb3NlKCk7CiAgfQp9Cm0ATk48ARcaARYbFAFIBC8ESSoyQxQBPBgBPgZPDyEWL0RGAUsRJwQBDCMmNxkXHAQBDEIoAgE3LS8nAVAtAS8hAScaATk5QAEeLS8iBh0BHi8iBh0EAQwdOxoEAQxDOzMEAQwRGxYBGDIYBAIBHHBhY2thZ2U6Y3J5cHRvL3NyYy9obWFjLmRhcnQwc2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NyeXB0by9saWIvc3JjL21kNS5kYXJ0jtovLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CgppbXBvcnQgJ2RpZ2VzdC5kYXJ0JzsKaW1wb3J0ICdoYXNoLmRhcnQnOwppbXBvcnQgJ2hhc2hfc2luay5kYXJ0JzsKaW1wb3J0ICd1dGlscy5kYXJ0JzsKCi8vLyBBbiBpbnN0YW5jZSBvZiBbTUQ1XS4KLy8vCi8vLyBUaGlzIGluc3RhbmNlIHByb3ZpZGVzIGNvbnZlbmllbnQgYWNjZXNzIHRvIHRoZSBbTUQ1XVtyZmNdIGhhc2ggZnVuY3Rpb24uCi8vLwovLy8gW3JmY106IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMxMzIxCi8vLwovLy8gKipXYXJuaW5nKio6IE1ENSBoYXMga25vd24gY29sbGlzaW9ucyBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIHJlcXVpcmVkCi8vLyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCmZpbmFsIG1kNSA9IG5ldyBNRDUuXygpOwoKLy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBbTUQ1XVtyZmNdIGhhc2ggZnVuY3Rpb24uCi8vLwovLy8gW3JmY106IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMxMzIxCi8vLwovLy8gKipXYXJuaW5nKio6IE1ENSBoYXMga25vd24gY29sbGlzaW9ucyBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIHJlcXVpcmVkCi8vLyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCi8vLwovLy8gTm90ZSB0aGF0IGl0J3MgYWxtb3N0IGFsd2F5cyBlYXNpZXIgdG8gdXNlIFttZDVdIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEgbmV3Ci8vLyBpbnN0YW5jZS4KY2xhc3MgTUQ1IGV4dGVuZHMgSGFzaCB7CiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IGJsb2NrU2l6ZSA9IDE2ICogYnl0ZXNQZXJXb3JkOwoKICBNRDUuXygpOwoKICBAb3ZlcnJpZGUKICBCeXRlQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPERpZ2VzdD4gc2luaykgPT4KICAgICAgbmV3IEJ5dGVDb252ZXJzaW9uU2luay5mcm9tKG5ldyBfTUQ1U2luayhzaW5rKSk7Cn0KCi8vLyBEYXRhIGZyb20gYSBub24tbGluZWFyIG1hdGhlbWF0aWNhbCBmdW5jdGlvbiB0aGF0IGZ1bmN0aW9ucyBhcwovLy8gcmVwcm9kdWNpYmxlIG5vaXNlLgpjb25zdCBfbm9pc2UgPSBjb25zdCBbCiAgMHhkNzZhYTQ3OCwgMHhlOGM3Yjc1NiwgMHgyNDIwNzBkYiwgMHhjMWJkY2VlZSwgMHhmNTdjMGZhZiwgMHg0Nzg3YzYyYSwgLy8KICAweGE4MzA0NjEzLCAweGZkNDY5NTAxLCAweDY5ODA5OGQ4LCAweDhiNDRmN2FmLCAweGZmZmY1YmIxLCAweDg5NWNkN2JlLAogIDB4NmI5MDExMjIsIDB4ZmQ5ODcxOTMsIDB4YTY3OTQzOGUsIDB4NDliNDA4MjEsIDB4ZjYxZTI1NjIsIDB4YzA0MGIzNDAsCiAgMHgyNjVlNWE1MSwgMHhlOWI2YzdhYSwgMHhkNjJmMTA1ZCwgMHgwMjQ0MTQ1MywgMHhkOGExZTY4MSwgMHhlN2QzZmJjOCwKICAweDIxZTFjZGU2LCAweGMzMzcwN2Q2LCAweGY0ZDUwZDg3LCAweDQ1NWExNGVkLCAweGE5ZTNlOTA1LCAweGZjZWZhM2Y4LAogIDB4Njc2ZjAyZDksIDB4OGQyYTRjOGEsIDB4ZmZmYTM5NDIsIDB4ODc3MWY2ODEsIDB4NmQ5ZDYxMjIsIDB4ZmRlNTM4MGMsCiAgMHhhNGJlZWE0NCwgMHg0YmRlY2ZhOSwgMHhmNmJiNGI2MCwgMHhiZWJmYmM3MCwgMHgyODliN2VjNiwgMHhlYWExMjdmYSwKICAweGQ0ZWYzMDg1LCAweDA0ODgxZDA1LCAweGQ5ZDRkMDM5LCAweGU2ZGI5OWU1LCAweDFmYTI3Y2Y4LCAweGM0YWM1NjY1LAogIDB4ZjQyOTIyNDQsIDB4NDMyYWZmOTcsIDB4YWI5NDIzYTcsIDB4ZmM5M2EwMzksIDB4NjU1YjU5YzMsIDB4OGYwY2NjOTIsCiAgMHhmZmVmZjQ3ZCwgMHg4NTg0NWRkMSwgMHg2ZmE4N2U0ZiwgMHhmZTJjZTZlMCwgMHhhMzAxNDMxNCwgMHg0ZTA4MTFhMSwKICAweGY3NTM3ZTgyLCAweGJkM2FmMjM1LCAweDJhZDdkMmJiLCAweGViODZkMzkxCl07CgovLy8gUGVyLXJvdW5kIHNoaWZ0IGFtb3VudHMuCmNvbnN0IF9zaGlmdEFtb3VudHMgPSBjb25zdCBbCiAgMDcsIDEyLCAxNywgMjIsIDA3LCAxMiwgMTcsIDIyLCAwNywgMTIsIDE3LCAyMiwgMDcsIDEyLCAxNywgMjIsIDA1LCAwOSwgMTQsIC8vCiAgMjAsIDA1LCAwOSwgMTQsIDIwLCAwNSwgMDksIDE0LCAyMCwgMDUsIDA5LCAxNCwgMjAsIDA0LCAxMSwgMTYsIDIzLCAwNCwgMTEsCiAgMTYsIDIzLCAwNCwgMTEsIDE2LCAyMywgMDQsIDExLCAxNiwgMjMsIDA2LCAxMCwgMTUsIDIxLCAwNiwgMTAsIDE1LCAyMSwgMDYsCiAgMTAsIDE1LCAyMSwgMDYsIDEwLCAxNSwgMjEKXTsKCi8vLyBUaGUgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgW01ENV0uCi8vLwovLy8gVGhpcyBpcyBzZXBhcmF0ZSBzbyB0aGF0IGl0IGNhbiBleHRlbmQgW0hhc2hTaW5rXSB3aXRob3V0IGxlYWtpbmcgYWRkaXRpb25hbAovLy8gcHVibGljIG1lbWJlcnMuCmNsYXNzIF9NRDVTaW5rIGV4dGVuZHMgSGFzaFNpbmsgewogIEBvdmVycmlkZQogIGZpbmFsIGRpZ2VzdCA9IG5ldyBVaW50MzJMaXN0KDQpOwoKICBfTUQ1U2luayhTaW5rPERpZ2VzdD4gc2luaykgOiBzdXBlcihzaW5rLCAxNiwgZW5kaWFuOiBFbmRpYW4ubGl0dGxlKSB7CiAgICBkaWdlc3RbMF0gPSAweDY3NDUyMzAxOwogICAgZGlnZXN0WzFdID0gMHhlZmNkYWI4OTsKICAgIGRpZ2VzdFsyXSA9IDB4OThiYWRjZmU7CiAgICBkaWdlc3RbM10gPSAweDEwMzI1NDc2OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB1cGRhdGVIYXNoKFVpbnQzMkxpc3QgY2h1bmspIHsKICAgIGFzc2VydChjaHVuay5sZW5ndGggPT0gMTYpOwoKICAgIHZhciBhID0gZGlnZXN0WzBdOwogICAgdmFyIGIgPSBkaWdlc3RbMV07CiAgICB2YXIgYyA9IGRpZ2VzdFsyXTsKICAgIHZhciBkID0gZGlnZXN0WzNdOwoKICAgIGludCBlOwogICAgaW50IGY7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2NDsgaSsrKSB7CiAgICAgIGlmIChpIDwgMTYpIHsKICAgICAgICBlID0gKGIgJiBjKSB8ICgofmIgJiBtYXNrMzIpICYgZCk7CiAgICAgICAgZiA9IGk7CiAgICAgIH0gZWxzZSBpZiAoaSA8IDMyKSB7CiAgICAgICAgZSA9IChkICYgYikgfCAoKH5kICYgbWFzazMyKSAmIGMpOwogICAgICAgIGYgPSAoKDUgKiBpKSArIDEpICUgMTY7CiAgICAgIH0gZWxzZSBpZiAoaSA8IDQ4KSB7CiAgICAgICAgZSA9IGIgXiBjIF4gZDsKICAgICAgICBmID0gKCgzICogaSkgKyA1KSAlIDE2OwogICAgICB9IGVsc2UgewogICAgICAgIGUgPSBjIF4gKGIgfCAofmQgJiBtYXNrMzIpKTsKICAgICAgICBmID0gKDcgKiBpKSAlIDE2OwogICAgICB9CgogICAgICB2YXIgdGVtcCA9IGQ7CiAgICAgIGQgPSBjOwogICAgICBjID0gYjsKICAgICAgYiA9IGFkZDMyKAogICAgICAgICAgYiwKICAgICAgICAgIHJvdGwzMihhZGQzMihhZGQzMihhLCBlKSwgYWRkMzIoX25vaXNlW2ldLCBjaHVua1tmXSkpLAogICAgICAgICAgICAgIF9zaGlmdEFtb3VudHNbaV0pKTsKICAgICAgYSA9IHRlbXA7CiAgICB9CgogICAgZGlnZXN0WzBdID0gYWRkMzIoYSwgZGlnZXN0WzBdKTsKICAgIGRpZ2VzdFsxXSA9IGFkZDMyKGIsIGRpZ2VzdFsxXSk7CiAgICBkaWdlc3RbMl0gPSBhZGQzMihjLCBkaWdlc3RbMl0pOwogICAgZGlnZXN0WzNdID0gYWRkMzIoZCwgZGlnZXN0WzNdKTsKICB9Cn0KfgBOTjwBFxoBFhQZFQEaBE4ELwRQIRkBNwQvBFAhBFAOGQwrAQsBDEI3AgFDGBdNSkpKSkpKSkpKMQMBHR5RTk4dAwEqBFEUIgwkAUkcHBwcBAEMJiABFxcXFwELCwEjFCsPGysgGxcgDyUaCAEUDQ0RDUEiEAYBJSUlJQQCARtwYWNrYWdlOmNyeXB0by9zcmMvbWQ1LmRhcnQxc2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NyeXB0by9saWIvc3JjL3NoYTEuZGFydIrrLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb252ZXJ0JzsKaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnOwoKaW1wb3J0ICdkaWdlc3QuZGFydCc7CmltcG9ydCAnaGFzaC5kYXJ0JzsKaW1wb3J0ICdoYXNoX3NpbmsuZGFydCc7CmltcG9ydCAndXRpbHMuZGFydCc7CgovLy8gQW4gaW5zdGFuY2Ugb2YgW1NoYTFdLgovLy8KLy8vIFRoaXMgaW5zdGFuY2UgcHJvdmlkZXMgY29udmVuaWVudCBhY2Nlc3MgdG8gdGhlIFtTSEEtMV1bcmZjXSBoYXNoIGZ1bmN0aW9uLgovLy8KLy8vIFtyZmNdOiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzMTc0CmZpbmFsIHNoYTEgPSBuZXcgU2hhMS5fKCk7CgovLy8gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFtTSEEtMV1bcmZjXSBoYXNoIGZ1bmN0aW9uLgovLy8KLy8vIFtyZmNdOiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzMTc0CmNsYXNzIFNoYTEgZXh0ZW5kcyBIYXNoIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgYmxvY2tTaXplID0gMTYgKiBieXRlc1BlcldvcmQ7CgogIFNoYTEuXygpOwoKICBAb3ZlcnJpZGUKICBCeXRlQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPERpZ2VzdD4gc2luaykgPT4KICAgICAgbmV3IEJ5dGVDb252ZXJzaW9uU2luay5mcm9tKG5ldyBfU2hhMVNpbmsoc2luaykpOwp9CgovLy8gVGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIFtTaGExXS4KLy8vCi8vLyBUaGlzIGlzIHNlcGFyYXRlIHNvIHRoYXQgaXQgY2FuIGV4dGVuZCBbSGFzaFNpbmtdIHdpdGhvdXQgbGVha2luZyBhZGRpdGlvbmFsCi8vLyBwdWJsaWMgbWVtZWJlcnMuCmNsYXNzIF9TaGExU2luayBleHRlbmRzIEhhc2hTaW5rIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBkaWdlc3QgPSBuZXcgVWludDMyTGlzdCg1KTsKCiAgLy8vIFRoZSBzaXh0ZWVuIHdvcmRzIGZyb20gdGhlIG9yaWdpbmFsIGNodW5rLCBleHRlbmRlZCB0byA4MCB3b3Jkcy4KICAvLy8KICAvLy8gVGhpcyBpcyBhbiBpbnN0YW5jZSB2YXJpYWJsZSB0byBhdm9pZCByZS1hbGxvY2F0aW5nLCBidXQgaXRzIGRhdGEgaXNuJ3QKICAvLy8gdXNlZCBhY3Jvc3MgaW52b2NhdGlvbnMgb2YgW3VwZGF0ZUhhc2hdLgogIGZpbmFsIFVpbnQzMkxpc3QgX2V4dGVuZGVkOwoKICBfU2hhMVNpbmsoU2luazxEaWdlc3Q+IHNpbmspCiAgICAgIDogX2V4dGVuZGVkID0gbmV3IFVpbnQzMkxpc3QoODApLAogICAgICAgIHN1cGVyKHNpbmssIDE2KSB7CiAgICBkaWdlc3RbMF0gPSAweDY3NDUyMzAxOwogICAgZGlnZXN0WzFdID0gMHhFRkNEQUI4OTsKICAgIGRpZ2VzdFsyXSA9IDB4OThCQURDRkU7CiAgICBkaWdlc3RbM10gPSAweDEwMzI1NDc2OwogICAgZGlnZXN0WzRdID0gMHhDM0QyRTFGMDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdXBkYXRlSGFzaChVaW50MzJMaXN0IGNodW5rKSB7CiAgICBhc3NlcnQoY2h1bmsubGVuZ3RoID09IDE2KTsKCiAgICB2YXIgYSA9IGRpZ2VzdFswXTsKICAgIHZhciBiID0gZGlnZXN0WzFdOwogICAgdmFyIGMgPSBkaWdlc3RbMl07CiAgICB2YXIgZCA9IGRpZ2VzdFszXTsKICAgIHZhciBlID0gZGlnZXN0WzRdOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODA7IGkrKykgewogICAgICBpZiAoaSA8IDE2KSB7CiAgICAgICAgX2V4dGVuZGVkW2ldID0gY2h1bmtbaV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2V4dGVuZGVkW2ldID0gcm90bDMyKAogICAgICAgICAgICBfZXh0ZW5kZWRbaSAtIDNdIF4KICAgICAgICAgICAgICAgIF9leHRlbmRlZFtpIC0gOF0gXgogICAgICAgICAgICAgICAgX2V4dGVuZGVkW2kgLSAxNF0gXgogICAgICAgICAgICAgICAgX2V4dGVuZGVkW2kgLSAxNl0sCiAgICAgICAgICAgIDEpOwogICAgICB9CgogICAgICB2YXIgbmV3QSA9IGFkZDMyKGFkZDMyKHJvdGwzMihhLCA1KSwgZSksIF9leHRlbmRlZFtpXSk7CiAgICAgIGlmIChpIDwgMjApIHsKICAgICAgICBuZXdBID0gYWRkMzIoYWRkMzIobmV3QSwgKGIgJiBjKSB8ICh+YiAmIGQpKSwgMHg1QTgyNzk5OSk7CiAgICAgIH0gZWxzZSBpZiAoaSA8IDQwKSB7CiAgICAgICAgbmV3QSA9IGFkZDMyKGFkZDMyKG5ld0EsIChiIF4gYyBeIGQpKSwgMHg2RUQ5RUJBMSk7CiAgICAgIH0gZWxzZSBpZiAoaSA8IDYwKSB7CiAgICAgICAgbmV3QSA9IGFkZDMyKGFkZDMyKG5ld0EsIChiICYgYykgfCAoYiAmIGQpIHwgKGMgJiBkKSksIDB4OEYxQkJDREMpOwogICAgICB9IGVsc2UgewogICAgICAgIG5ld0EgPSBhZGQzMihhZGQzMihuZXdBLCBiIF4gYyBeIGQpLCAweENBNjJDMUQ2KTsKICAgICAgfQoKICAgICAgZSA9IGQ7CiAgICAgIGQgPSBjOwogICAgICBjID0gcm90bDMyKGIsIDMwKTsKICAgICAgYiA9IGE7CiAgICAgIGEgPSBuZXdBICYgbWFzazMyOwogICAgfQoKICAgIGRpZ2VzdFswXSA9IGFkZDMyKGEsIGRpZ2VzdFswXSk7CiAgICBkaWdlc3RbMV0gPSBhZGQzMihiLCBkaWdlc3RbMV0pOwogICAgZGlnZXN0WzJdID0gYWRkMzIoYywgZGlnZXN0WzJdKTsKICAgIGRpZ2VzdFszXSA9IGFkZDMyKGQsIGRpZ2VzdFszXSk7CiAgICBkaWdlc3RbNF0gPSBhZGQzMihlLCBkaWdlc3RbNF0pOwogIH0KfQpqAE5OPAEXGgEWFBkVARsEUAQuGwE5BC4aDCsBDAEMQjgCASsEURUjDCQBRwZOLx4BHygaHBwcHBwEAQwmIAEXFxcXFwEjFCEPHx8jJCMQCAE+FEMbPBtMDzoIAQ0NGQ0ZBgElJSUlJQQCARxwYWNrYWdlOmNyeXB0by9zcmMvc2hhMS5kYXJ0M3Nka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jcnlwdG8vbGliL3NyYy9zaGEyNTYuZGFydJJ7Ly8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb252ZXJ0JzsKaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnOwoKaW1wb3J0ICdkaWdlc3QuZGFydCc7CmltcG9ydCAnaGFzaC5kYXJ0JzsKaW1wb3J0ICdoYXNoX3NpbmsuZGFydCc7CmltcG9ydCAndXRpbHMuZGFydCc7CgovLy8gQW4gaW5zdGFuY2Ugb2YgW1NoYTI1Nl0uCi8vLwovLy8gVGhpcyBpbnN0YW5jZSBwcm92aWRlcyBjb252ZW5pZW50IGFjY2VzcyB0byB0aGUgW1NoYTI1Nl1bcmZjXSBoYXNoIGZ1bmN0aW9uLgovLy8KLy8vIFtyZmNdOiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjM0CmZpbmFsIHNoYTI1NiA9IG5ldyBTaGEyNTYuXygpOwoKLy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBbU0hBLTI1Nl1bcmZjXSBoYXNoIGZ1bmN0aW9uLgovLy8KLy8vIFtyZmNdOiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjM0Ci8vLwovLy8gTm90ZSB0aGF0IGl0J3MgYWxtb3N0IGFsd2F5cyBlYXNpZXIgdG8gdXNlIFtzaGEyNTZdIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEKLy8vIG5ldyBpbnN0YW5jZS4KY2xhc3MgU2hhMjU2IGV4dGVuZHMgSGFzaCB7CiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IGJsb2NrU2l6ZSA9IDE2ICogYnl0ZXNQZXJXb3JkOwoKICBTaGEyNTYuXygpOwoKICBTaGEyNTYgbmV3SW5zdGFuY2UoKSA9PiBuZXcgU2hhMjU2Ll8oKTsKCiAgQG92ZXJyaWRlCiAgQnl0ZUNvbnZlcnNpb25TaW5rIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxEaWdlc3Q+IHNpbmspID0+CiAgICAgIG5ldyBCeXRlQ29udmVyc2lvblNpbmsuZnJvbShuZXcgX1NoYTI1NlNpbmsoc2luaykpOwp9CgovLy8gRGF0YSBmcm9tIGEgbm9uLWxpbmVhciBmdW5jdGlvbiB0aGF0IGZ1bmN0aW9ucyBhcyByZXByb2R1Y2libGUgbm9pc2UuCmNvbnN0IExpc3Q8aW50PiBfbm9pc2UgPSBjb25zdCBbCiAgMHg0MjhhMmY5OCwgMHg3MTM3NDQ5MSwgMHhiNWMwZmJjZiwgMHhlOWI1ZGJhNSwgMHgzOTU2YzI1YiwgMHg1OWYxMTFmMSwgLy8KICAweDkyM2Y4MmE0LCAweGFiMWM1ZWQ1LCAweGQ4MDdhYTk4LCAweDEyODM1YjAxLCAweDI0MzE4NWJlLCAweDU1MGM3ZGMzLAogIDB4NzJiZTVkNzQsIDB4ODBkZWIxZmUsIDB4OWJkYzA2YTcsIDB4YzE5YmYxNzQsIDB4ZTQ5YjY5YzEsIDB4ZWZiZTQ3ODYsCiAgMHgwZmMxOWRjNiwgMHgyNDBjYTFjYywgMHgyZGU5MmM2ZiwgMHg0YTc0ODRhYSwgMHg1Y2IwYTlkYywgMHg3NmY5ODhkYSwKICAweDk4M2U1MTUyLCAweGE4MzFjNjZkLCAweGIwMDMyN2M4LCAweGJmNTk3ZmM3LCAweGM2ZTAwYmYzLCAweGQ1YTc5MTQ3LAogIDB4MDZjYTYzNTEsIDB4MTQyOTI5NjcsIDB4MjdiNzBhODUsIDB4MmUxYjIxMzgsIDB4NGQyYzZkZmMsIDB4NTMzODBkMTMsCiAgMHg2NTBhNzM1NCwgMHg3NjZhMGFiYiwgMHg4MWMyYzkyZSwgMHg5MjcyMmM4NSwgMHhhMmJmZThhMSwgMHhhODFhNjY0YiwKICAweGMyNGI4YjcwLCAweGM3NmM1MWEzLCAweGQxOTJlODE5LCAweGQ2OTkwNjI0LCAweGY0MGUzNTg1LCAweDEwNmFhMDcwLAogIDB4MTlhNGMxMTYsIDB4MWUzNzZjMDgsIDB4Mjc0ODc3NGMsIDB4MzRiMGJjYjUsIDB4MzkxYzBjYjMsIDB4NGVkOGFhNGEsCiAgMHg1YjljY2E0ZiwgMHg2ODJlNmZmMywgMHg3NDhmODJlZSwgMHg3OGE1NjM2ZiwgMHg4NGM4NzgxNCwgMHg4Y2M3MDIwOCwKICAweDkwYmVmZmZhLCAweGE0NTA2Y2ViLCAweGJlZjlhM2Y3LCAweGM2NzE3OGYyCl07CgovLy8gVGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIFtTaGEyNTZdLgovLy8KLy8vIFRoaXMgaXMgc2VwYXJhdGUgc28gdGhhdCBpdCBjYW4gZXh0ZW5kIFtIYXNoU2lua10gd2l0aG91dCBsZWFraW5nIGFkZGl0aW9uYWwKLy8vIHB1YmxpYyBtZW1iZXJzLgpjbGFzcyBfU2hhMjU2U2luayBleHRlbmRzIEhhc2hTaW5rIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBkaWdlc3QgPSBuZXcgVWludDMyTGlzdCg4KTsKCiAgLy8vIFRoZSBzaXh0ZWVuIHdvcmRzIGZyb20gdGhlIG9yaWdpbmFsIGNodW5rLCBleHRlbmRlZCB0byA2NCB3b3Jkcy4KICAvLy8KICAvLy8gVGhpcyBpcyBhbiBpbnN0YW5jZSB2YXJpYWJsZSB0byBhdm9pZCByZS1hbGxvY2F0aW5nLCBidXQgaXRzIGRhdGEgaXNuJ3QKICAvLy8gdXNlZCBhY3Jvc3MgaW52b2NhdGlvbnMgb2YgW3VwZGF0ZUhhc2hdLgogIGZpbmFsIFVpbnQzMkxpc3QgX2V4dGVuZGVkOwoKICBfU2hhMjU2U2luayhTaW5rPERpZ2VzdD4gc2luaykKICAgICAgOiBfZXh0ZW5kZWQgPSBuZXcgVWludDMyTGlzdCg2NCksCiAgICAgICAgc3VwZXIoc2luaywgMTYpIHsKICAgIC8vIEluaXRpYWwgdmFsdWUgb2YgdGhlIGhhc2ggcGFydHMuIEZpcnN0IDMyIGJpdHMgb2YgdGhlIGZyYWN0aW9uYWwgcGFydHMKICAgIC8vIG9mIHRoZSBzcXVhcmUgcm9vdHMgb2YgdGhlIGZpcnN0IDggcHJpbWUgbnVtYmVycy4KICAgIGRpZ2VzdFswXSA9IDB4NmEwOWU2Njc7CiAgICBkaWdlc3RbMV0gPSAweGJiNjdhZTg1OwogICAgZGlnZXN0WzJdID0gMHgzYzZlZjM3MjsKICAgIGRpZ2VzdFszXSA9IDB4YTU0ZmY1M2E7CiAgICBkaWdlc3RbNF0gPSAweDUxMGU1MjdmOwogICAgZGlnZXN0WzVdID0gMHg5YjA1Njg4YzsKICAgIGRpZ2VzdFs2XSA9IDB4MWY4M2Q5YWI7CiAgICBkaWdlc3RbN10gPSAweDViZTBjZDE5OwogIH0KCiAgLy8gVGhlIGZvbGxvd2luZyBoZWxwZXIgZnVuY3Rpb25zIGFyZSB0YWtlbiBkaXJlY3RseSBmcm9tCiAgLy8gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjIzNC4KCiAgaW50IF9yb3RyMzIoaW50IG4sIGludCB4KSA9PiAoeCA+PiBuKSB8ICgoeCA8PCAoMzIgLSBuKSkgJiBtYXNrMzIpOwogIGludCBfY2goaW50IHgsIGludCB5LCBpbnQgeikgPT4gKHggJiB5KSBeICgofnggJiBtYXNrMzIpICYgeik7CiAgaW50IF9tYWooaW50IHgsIGludCB5LCBpbnQgeikgPT4gKHggJiB5KSBeICh4ICYgeikgXiAoeSAmIHopOwogIGludCBfYnNpZzAoaW50IHgpID0+IF9yb3RyMzIoMiwgeCkgXiBfcm90cjMyKDEzLCB4KSBeIF9yb3RyMzIoMjIsIHgpOwogIGludCBfYnNpZzEoaW50IHgpID0+IF9yb3RyMzIoNiwgeCkgXiBfcm90cjMyKDExLCB4KSBeIF9yb3RyMzIoMjUsIHgpOwogIGludCBfc3NpZzAoaW50IHgpID0+IF9yb3RyMzIoNywgeCkgXiBfcm90cjMyKDE4LCB4KSBeICh4ID4+IDMpOwogIGludCBfc3NpZzEoaW50IHgpID0+IF9yb3RyMzIoMTcsIHgpIF4gX3JvdHIzMigxOSwgeCkgXiAoeCA+PiAxMCk7CgogIEBvdmVycmlkZQogIHZvaWQgdXBkYXRlSGFzaChVaW50MzJMaXN0IGNodW5rKSB7CiAgICBhc3NlcnQoY2h1bmsubGVuZ3RoID09IDE2KTsKCiAgICAvLyBQcmVwYXJlIG1lc3NhZ2Ugc2NoZWR1bGUuCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspIHsKICAgICAgX2V4dGVuZGVkW2ldID0gY2h1bmtbaV07CiAgICB9CiAgICBmb3IgKHZhciBpID0gMTY7IGkgPCA2NDsgaSsrKSB7CiAgICAgIF9leHRlbmRlZFtpXSA9IGFkZDMyKGFkZDMyKF9zc2lnMShfZXh0ZW5kZWRbaSAtIDJdKSwgX2V4dGVuZGVkW2kgLSA3XSksCiAgICAgICAgICBhZGQzMihfc3NpZzAoX2V4dGVuZGVkW2kgLSAxNV0pLCBfZXh0ZW5kZWRbaSAtIDE2XSkpOwogICAgfQoKICAgIC8vIFNodWZmbGUgYXJvdW5kIHRoZSBiaXRzLgogICAgdmFyIGEgPSBkaWdlc3RbMF07CiAgICB2YXIgYiA9IGRpZ2VzdFsxXTsKICAgIHZhciBjID0gZGlnZXN0WzJdOwogICAgdmFyIGQgPSBkaWdlc3RbM107CiAgICB2YXIgZSA9IGRpZ2VzdFs0XTsKICAgIHZhciBmID0gZGlnZXN0WzVdOwogICAgdmFyIGcgPSBkaWdlc3RbNl07CiAgICB2YXIgaCA9IGRpZ2VzdFs3XTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDY0OyBpKyspIHsKICAgICAgdmFyIHRlbXAxID0gYWRkMzIoYWRkMzIoaCwgX2JzaWcxKGUpKSwKICAgICAgICAgIGFkZDMyKF9jaChlLCBmLCBnKSwgYWRkMzIoX25vaXNlW2ldLCBfZXh0ZW5kZWRbaV0pKSk7CiAgICAgIHZhciB0ZW1wMiA9IGFkZDMyKF9ic2lnMChhKSwgX21haihhLCBiLCBjKSk7CiAgICAgIGggPSBnOwogICAgICBnID0gZjsKICAgICAgZiA9IGU7CiAgICAgIGUgPSBhZGQzMihkLCB0ZW1wMSk7CiAgICAgIGQgPSBjOwogICAgICBjID0gYjsKICAgICAgYiA9IGE7CiAgICAgIGEgPSBhZGQzMih0ZW1wMSwgdGVtcDIpOwogICAgfQoKICAgIC8vIFVwZGF0ZSBoYXNoIHZhbHVlcyBhZnRlciBpdGVyYXRpb24uCiAgICBkaWdlc3RbMF0gPSBhZGQzMihhLCBkaWdlc3RbMF0pOwogICAgZGlnZXN0WzFdID0gYWRkMzIoYiwgZGlnZXN0WzFdKTsKICAgIGRpZ2VzdFsyXSA9IGFkZDMyKGMsIGRpZ2VzdFsyXSk7CiAgICBkaWdlc3RbM10gPSBhZGQzMihkLCBkaWdlc3RbM10pOwogICAgZGlnZXN0WzRdID0gYWRkMzIoZSwgZGlnZXN0WzRdKTsKICAgIGRpZ2VzdFs1XSA9IGFkZDMyKGYsIGRpZ2VzdFs1XSk7CiAgICBkaWdlc3RbNl0gPSBhZGQzMihnLCBkaWdlc3RbNl0pOwogICAgZGlnZXN0WzddID0gYWRkMzIoaCwgZGlnZXN0WzddKTsKICB9Cn0KgI8ATk48ARcaARYUGRUBHQRRBC4fATsELgRPEhwMKwEOASoBDEI6AgFKIU1KSkpKSkpKSkoxAwEtBFEUJQwkAUcGTi8eASEoGk45HBwcHBwcHBwEATwpAUZBQEhIQkQBDCYgASEjHwYkTkAGASAXFxcXFxcXFwEjLUAzDQ0NGw0NDR8GASslJSUlJSUlJQQCAR5wYWNrYWdlOmNyeXB0by9zcmMvc2hhMjU2LmRhcnQxc2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NvbnZlcnQvbGliL2NvbnZlcnQuZGFydIGVLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgY29udmVydDsKCmV4cG9ydCAnc3JjL2FjY3VtdWxhdG9yX3NpbmsuZGFydCc7CmV4cG9ydCAnc3JjL2J5dGVfYWNjdW11bGF0b3Jfc2luay5kYXJ0JzsKZXhwb3J0ICdzcmMvaGV4LmRhcnQnOwpleHBvcnQgJ3NyYy9wZXJjZW50LmRhcnQnOwpleHBvcnQgJ3NyYy9zdHJpbmdfYWNjdW11bGF0b3Jfc2luay5kYXJ0JzsKDQBOTjwBEQEkKRcbKwEccGFja2FnZTpjb252ZXJ0L2NvbnZlcnQuZGFydDhzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY3J5cHRvL2xpYi9zcmMvZGlnZXN0X3NpbmsuZGFydILiLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGlnZXN0LmRhcnQnOwoKLy8vIEEgc2luayB1c2VkIHRvIGdldCBhIGRpZ2VzdCB2YWx1ZSBvdXQgb2YgYEhhc2guc3RhcnRDaHVua2VkQ29udmVyc2lvbmAuCmNsYXNzIERpZ2VzdFNpbmsgZXh0ZW5kcyBTaW5rPERpZ2VzdD4gewogIC8vLyBUaGUgdmFsdWUgYWRkZWQgdG8gdGhlIHNpbmssIGlmIGFueS4KICBEaWdlc3QgZ2V0IHZhbHVlIHsKICAgIGFzc2VydChfdmFsdWUgIT0gbnVsbCk7CiAgICByZXR1cm4gX3ZhbHVlOwogIH0KCiAgRGlnZXN0IF92YWx1ZTsKCiAgLy8vIEFkZHMgW3ZhbHVlXSB0byB0aGUgc2luay4KICAvLy8KICAvLy8gVW5saWtlIG1vc3Qgc2lua3MsIHRoaXMgbWF5IG9ubHkgYmUgY2FsbGVkIG9uY2UuCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGQoRGlnZXN0IHZhbHVlKSB7CiAgICBhc3NlcnQoX3ZhbHVlID09IG51bGwpOwogICAgX3ZhbHVlID0gdmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNsb3NlKCkgewogICAgYXNzZXJ0KF92YWx1ZSAhPSBudWxsKTsKICB9Cn0KIABOTjwBFgFMKCsVHBMEAREBIAY3DBscFAQBDBEcBAIBI3BhY2thZ2U6Y3J5cHRvL3NyYy9kaWdlc3Rfc2luay5kYXJ0NnNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jcnlwdG8vbGliL3NyYy9oYXNoX3NpbmsuZGFydJUQLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKCmltcG9ydCAncGFja2FnZTp0eXBlZF9kYXRhL3R5cGVkX2RhdGEuZGFydCc7CgppbXBvcnQgJ2RpZ2VzdC5kYXJ0JzsKaW1wb3J0ICd1dGlscy5kYXJ0JzsKCi8vLyBBIGJhc2UgY2xhc3MgZm9yIFtTaW5rXSBpbXBsZW1lbnRhdGlvbnMgZm9yIGhhc2ggYWxnb3JpdGhtcy4KLy8vCi8vLyBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBbdXBkYXRlSGFzaF0gYW5kIFtkaWdlc3RdLgphYnN0cmFjdCBjbGFzcyBIYXNoU2luayBpbXBsZW1lbnRzIFNpbms8TGlzdDxpbnQ+PiB7CiAgLy8vIFRoZSBpbm5lciBzaW5rIHRoYXQgdGhpcyBzaG91bGQgZm9yd2FyZCB0by4KICBmaW5hbCBTaW5rPERpZ2VzdD4gX3Npbms7CgogIC8vLyBXaGV0aGVyIHRoZSBoYXNoIGZ1bmN0aW9uIG9wZXJhdGVzIG9uIGJpZy1lbmRpYW4gd29yZHMuCiAgZmluYWwgRW5kaWFuIF9lbmRpYW47CgogIC8vLyBUaGUgd29yZHMgaW4gdGhlIGN1cnJlbnQgY2h1bmsuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYW4gaW5zdGFuY2UgdmFyaWFibGUgdG8gYXZvaWQgcmUtYWxsb2NhdGluZywgYnV0IGl0cyBkYXRhIGlzbid0CiAgLy8vIHVzZWQgYWNyb3NzIGludm9jYXRpb25zIG9mIFtfaXRlcmF0ZV0uCiAgZmluYWwgVWludDMyTGlzdCBfY3VycmVudENodW5rOwoKICAvLy8gTWVzc2FnZXMgd2l0aCBtb3JlIHRoYW4gMl41My0xIGJpdHMgYXJlIG5vdCBzdXBwb3J0ZWQuIChUaGlzIGlzIHRoZQogIC8vLyBsYXJnZXN0IHZhbHVlIHRoYXQgaXMgcmVwcmVzZW50YWJsZSBvbiBib3RoIEpTIGFuZCB0aGUgRGFydCBWTS4pCiAgLy8vIFNvIHRoZSBtYXhpbXVtIGxlbmd0aCBpbiBieXRlcyBpcyAoMl41My0xKS84LgogIHN0YXRpYyBjb25zdCBfbWF4TWVzc2FnZUxlbmd0aEluQnl0ZXMgPSAweDAwMDNmZmZmZmZmZmZmZmY7CgogIC8vLyBUaGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBkYXRhIHNvIGZhciwgaW4gYnl0ZXMuCiAgaW50IF9sZW5ndGhJbkJ5dGVzID0gMDsKCiAgLy8vIERhdGEgdGhhdCBoYXMgeWV0IHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgaGFzaCBmdW5jdGlvbi4KICBmaW5hbCBfcGVuZGluZ0RhdGEgPSBuZXcgVWludDhCdWZmZXIoKTsKCiAgLy8vIFdoZXRoZXIgW2Nsb3NlXSBoYXMgYmVlbiBjYWxsZWQuCiAgYm9vbCBfaXNDbG9zZWQgPSBmYWxzZTsKCiAgLy8vIFRoZSB3b3JkcyBpbiB0aGUgY3VycmVudCBkaWdlc3QuCiAgLy8vCiAgLy8vIFRoaXMgc2hvdWxkIGJlIHVwZGF0ZWQgZWFjaCB0aW1lIFt1cGRhdGVIYXNoXSBpcyBjYWxsZWQuCiAgVWludDMyTGlzdCBnZXQgZGlnZXN0OwoKICAvLy8gQ3JlYXRlcyBhIG5ldyBoYXNoLgogIC8vLwogIC8vLyBbY2h1bmtTaXplSW5Xb3Jkc10gcmVwcmVzZW50cyB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgY2h1bmtzIHByb2Nlc3NlZCBieQogIC8vLyB0aGUgYWxnb3JpdGhtLCBpbiB0ZXJtcyBvZiAzMi1iaXQgd29yZHMuCiAgSGFzaFNpbmsodGhpcy5fc2luaywgaW50IGNodW5rU2l6ZUluV29yZHMsIHtFbmRpYW4gZW5kaWFuOiBFbmRpYW4uYmlnfSkKICAgICAgOiBfZW5kaWFuID0gZW5kaWFuLAogICAgICAgIF9jdXJyZW50Q2h1bmsgPSBuZXcgVWludDMyTGlzdChjaHVua1NpemVJbldvcmRzKTsKCiAgLy8vIFJ1bnMgYSBzaW5nbGUgaXRlcmF0aW9uIG9mIHRoZSBoYXNoIGNvbXB1dGF0aW9uLCB1cGRhdGluZyBbZGlnZXN0XSB3aXRoCiAgLy8vIHRoZSByZXN1bHQuCiAgLy8vCiAgLy8vIFtjaHVua10gaXMgdGhlIGN1cnJlbnQgY2h1bmssIHdob3NlIHNpemUgaXMgZ2l2ZW4gYnkgdGhlCiAgLy8vIGBjaHVua1NpemVJbldvcmRzYCBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KICB2b2lkIHVwZGF0ZUhhc2goVWludDMyTGlzdCBjaHVuayk7CgogIEBvdmVycmlkZQogIHZvaWQgYWRkKExpc3Q8aW50PiBkYXRhKSB7CiAgICBpZiAoX2lzQ2xvc2VkKSB0aHJvdyBuZXcgU3RhdGVFcnJvcignSGFzaC5hZGQoKSBjYWxsZWQgYWZ0ZXIgY2xvc2UoKS4nKTsKICAgIF9sZW5ndGhJbkJ5dGVzICs9IGRhdGEubGVuZ3RoOwogICAgX3BlbmRpbmdEYXRhLmFkZEFsbChkYXRhKTsKICAgIF9pdGVyYXRlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNsb3NlKCkgewogICAgaWYgKF9pc0Nsb3NlZCkgcmV0dXJuOwogICAgX2lzQ2xvc2VkID0gdHJ1ZTsKCiAgICBfZmluYWxpemVEYXRhKCk7CiAgICBfaXRlcmF0ZSgpOwogICAgYXNzZXJ0KF9wZW5kaW5nRGF0YS5pc0VtcHR5KTsKICAgIF9zaW5rLmFkZChuZXcgRGlnZXN0KF9ieXRlRGlnZXN0KCkpKTsKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQoKICBVaW50OExpc3QgX2J5dGVEaWdlc3QoKSB7CiAgICBpZiAoX2VuZGlhbiA9PSBFbmRpYW4uaG9zdCkgcmV0dXJuIGRpZ2VzdC5idWZmZXIuYXNVaW50OExpc3QoKTsKCiAgICB2YXIgYnl0ZURpZ2VzdCA9IG5ldyBVaW50OExpc3QoZGlnZXN0Lmxlbmd0aEluQnl0ZXMpOwogICAgdmFyIGJ5dGVEYXRhID0gYnl0ZURpZ2VzdC5idWZmZXIuYXNCeXRlRGF0YSgpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaWdlc3QubGVuZ3RoOyBpKyspIHsKICAgICAgYnl0ZURhdGEuc2V0VWludDMyKGkgKiBieXRlc1BlcldvcmQsIGRpZ2VzdFtpXSk7CiAgICB9CiAgICByZXR1cm4gYnl0ZURpZ2VzdDsKICB9CgogIC8vLyBJdGVyYXRlcyB0aHJvdWdoIFtfcGVuZGluZ0RhdGFdLCB1cGRhdGluZyB0aGUgaGFzaCBjb21wdXRhdGlvbiBmb3IgZWFjaAogIC8vLyBjaHVuay4KICB2b2lkIF9pdGVyYXRlKCkgewogICAgdmFyIHBlbmRpbmdEYXRhQnl0ZXMgPSBfcGVuZGluZ0RhdGEuYnVmZmVyLmFzQnl0ZURhdGEoKTsKICAgIHZhciBwZW5kaW5nRGF0YUNodW5rcyA9IF9wZW5kaW5nRGF0YS5sZW5ndGggfi8gX2N1cnJlbnRDaHVuay5sZW5ndGhJbkJ5dGVzOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwZW5kaW5nRGF0YUNodW5rczsgaSsrKSB7CiAgICAgIC8vIENvcHkgd29yZHMgZnJvbSB0aGUgcGVuZGluZyBkYXRhIGJ1ZmZlciBpbnRvIHRoZSBjdXJyZW50IGNodW5rIGJ1ZmZlci4KICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBfY3VycmVudENodW5rLmxlbmd0aDsgaisrKSB7CiAgICAgICAgX2N1cnJlbnRDaHVua1tqXSA9IHBlbmRpbmdEYXRhQnl0ZXMuZ2V0VWludDMyKAogICAgICAgICAgICBpICogX2N1cnJlbnRDaHVuay5sZW5ndGhJbkJ5dGVzICsgaiAqIGJ5dGVzUGVyV29yZCwgX2VuZGlhbik7CiAgICAgIH0KCiAgICAgIC8vIFJ1biB0aGUgaGFzaCBmdW5jdGlvbiBvbiB0aGUgY3VycmVudCBjaHVuay4KICAgICAgdXBkYXRlSGFzaChfY3VycmVudENodW5rKTsKICAgIH0KCiAgICAvLyBSZW1vdmUgYWxsIHBlbmRpbmcgZGF0YSB1cCB0byB0aGUgbGFzdCBjbGVhbiBjaHVuayBicmVhay4KICAgIF9wZW5kaW5nRGF0YS5yZW1vdmVSYW5nZSgKICAgICAgICAwLCBwZW5kaW5nRGF0YUNodW5rcyAqIF9jdXJyZW50Q2h1bmsubGVuZ3RoSW5CeXRlcyk7CiAgfQoKICAvLy8gRmluYWxpemVzIFtfcGVuZGluZ0RhdGFdLgogIC8vLwogIC8vLyBUaGlzIGFkZHMgYSAxIGJpdCB0byB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlLCBhbmQgZXhwYW5kcyBpdCB3aXRoIDAgYml0cyB0bwogIC8vLyBwYWQgaXQgb3V0LgogIHZvaWQgX2ZpbmFsaXplRGF0YSgpIHsKICAgIC8vIFBhZCBvdXQgdGhlIGRhdGEgd2l0aCAweDgwLCBlaWdodCAwcywgYW5kIGFzIG1hbnkgbW9yZSAwcyBhcyB3ZSBuZWVkIHRvCiAgICAvLyBsYW5kIGNsZWFubHkgb24gYSBjaHVuayBib3VuZGFyeS4KICAgIF9wZW5kaW5nRGF0YS5hZGQoMHg4MCk7CiAgICB2YXIgY29udGVudHNMZW5ndGggPSBfbGVuZ3RoSW5CeXRlcyArIDk7CiAgICB2YXIgZmluYWxpemVkTGVuZ3RoID0gX3JvdW5kVXAoY29udGVudHNMZW5ndGgsIF9jdXJyZW50Q2h1bmsubGVuZ3RoSW5CeXRlcyk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbmFsaXplZExlbmd0aCAtIGNvbnRlbnRzTGVuZ3RoOyBpKyspIHsKICAgICAgX3BlbmRpbmdEYXRhLmFkZCgwKTsKICAgIH0KCiAgICBpZiAoX2xlbmd0aEluQnl0ZXMgPiBfbWF4TWVzc2FnZUxlbmd0aEluQnl0ZXMpIHsKICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAnSGFzaGluZyBpcyB1bnN1cHBvcnRlZCBmb3IgbWVzc2FnZXMgd2l0aCBtb3JlIHRoYW4gMl41MyBiaXRzLicpOwogICAgfQoKICAgIHZhciBsZW5ndGhJbkJpdHMgPSBfbGVuZ3RoSW5CeXRlcyAqIGJpdHNQZXJCeXRlOwoKICAgIC8vIEFkZCB0aGUgZnVsbCBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEgYXMgYSA2NC1iaXQgdmFsdWUgYXQgdGhlIGVuZCBvZiB0aGUKICAgIC8vIGhhc2guCiAgICB2YXIgb2Zmc2V0ID0gX3BlbmRpbmdEYXRhLmxlbmd0aDsKICAgIF9wZW5kaW5nRGF0YS5hZGRBbGwobmV3IFVpbnQ4TGlzdCg4KSk7CiAgICB2YXIgYnl0ZURhdGEgPSBfcGVuZGluZ0RhdGEuYnVmZmVyLmFzQnl0ZURhdGEoKTsKCiAgICAvLyBXZSdyZSBlc3NlbnRpYWxseSBkb2luZyBieXRlRGF0YS5zZXRVaW50NjQob2Zmc2V0LCBsZW5ndGhJbkJpdHMsIF9lbmRpYW4pCiAgICAvLyBoZXJlLCBidXQgdGhhdCBtZXRob2QgaXNuJ3Qgc3VwcG9ydGVkIG9uIGRhcnQyanMgc28gd2UgaW1wbGVtZW50IGl0CiAgICAvLyBtYW51YWxseSBpbnN0ZWFkLgogICAgdmFyIGhpZ2hCaXRzID0gbGVuZ3RoSW5CaXRzID4+IDMyOwogICAgdmFyIGxvd0JpdHMgPSBsZW5ndGhJbkJpdHMgJiBtYXNrMzI7CiAgICBpZiAoX2VuZGlhbiA9PSBFbmRpYW4uYmlnKSB7CiAgICAgIGJ5dGVEYXRhLnNldFVpbnQzMihvZmZzZXQsIGhpZ2hCaXRzLCBfZW5kaWFuKTsKICAgICAgYnl0ZURhdGEuc2V0VWludDMyKG9mZnNldCArIGJ5dGVzUGVyV29yZCwgbG93Qml0cywgX2VuZGlhbik7CiAgICB9IGVsc2UgewogICAgICBieXRlRGF0YS5zZXRVaW50MzIob2Zmc2V0LCBsb3dCaXRzLCBfZW5kaWFuKTsKICAgICAgYnl0ZURhdGEuc2V0VWludDMyKG9mZnNldCArIGJ5dGVzUGVyV29yZCwgaGlnaEJpdHMsIF9lbmRpYW4pOwogICAgfQogIH0KCiAgLy8vIFJvdW5kcyBbdmFsXSB1cCB0byB0aGUgbmV4dCBtdWx0aXBsZSBvZiBbbl0sIGFzIGxvbmcgYXMgW25dIGlzIGEgcG93ZXIgb2YKICAvLy8gdHdvLgogIGludCBfcm91bmRVcChpbnQgdmFsLCBpbnQgbikgPT4gKHZhbCArIG4gLSAxKSAmIC1uOwp9CoCgAE5OPAEaAS0BFhUBQQQ6NTIcAT4YASYGTi0iAUpHND4BNRoBPioBJxoBJwY/GQEaBk4vSho6AU4SBj8+JQEMHU0jHxAEAQwRGxYBFRAiKhMEARxEATozLjcGFwQBTg0UPVAyUDc3SggBNSEGAUEePQQBIAZREhlPKRwtUUEbBgE1IkwGATUBUQ0mKzUBUUsZJykhNUMNNEQGBAFQCzYCASFwYWNrYWdlOmNyeXB0by9zcmMvaGFzaF9zaW5rLmRhcnQyc2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NyeXB0by9saWIvc3JjL3V0aWxzLmRhcnSC7C8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gQSBiaXRtYXNrIHRoYXQgbGltaXRzIGFuIGludGVnZXIgdG8gMzIgYml0cy4KY29uc3QgbWFzazMyID0gMHhGRkZGRkZGRjsKCi8vLyBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gYSBieXRlLgpjb25zdCBiaXRzUGVyQnl0ZSA9IDg7CgovLy8gVGhlIG51bWJlciBvZiBieXRlcyBpbiBhIDMyLWJpdCB3b3JkLgpjb25zdCBieXRlc1BlcldvcmQgPSA0OwoKLy8vIEFkZHMgW3hdIGFuZCBbeV0gd2l0aCAzMi1iaXQgb3ZlcmZsb3cgc2VtYW50aWNzLgppbnQgYWRkMzIoaW50IHgsIGludCB5KSA9PiAoeCArIHkpICYgbWFzazMyOwoKLy8vIEJpdHdpc2Ugcm90YXRlcyBbdmFsXSB0byB0aGUgbGVmdCBieSBbc2hpZnRdLCBvYmV5aW5nIDMyLWJpdCBvdmVyZmxvdwovLy8gc2VtYW50aWNzLgppbnQgcm90bDMyKGludCB2YWwsIGludCBzaGlmdCkgewogIHZhciBtb2RTaGlmdCA9IHNoaWZ0ICYgMzE7CiAgcmV0dXJuICgodmFsIDw8IG1vZFNoaWZ0KSAmIG1hc2szMikgfCAoKHZhbCAmIG1hc2szMikgPj4gKDMyIC0gbW9kU2hpZnQpKTsKfQoYAE5OPAExGwEiFwEqGAE1LQFKDyEdTQIBHXBhY2thZ2U6Y3J5cHRvL3NyYy91dGlscy5kYXJ0PnNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jb252ZXJ0L2xpYi9zcmMvYWNjdW11bGF0b3Jfc2luay5kYXJ0g+0vLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOwoKLy8vIEEgc2luayB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBhbGwgdGhlIFtldmVudHNdIHRoYXQgaGF2ZSBiZWVuIHBhc3NlZCB0byBpdC4KLy8vCi8vLyBTZWUgYWxzbyBbQ2h1bmtlZENvbnZlcnNpb25TaW5rLndpdGhDYWxsYmFja10uCmNsYXNzIEFjY3VtdWxhdG9yU2luazxUPiBpbXBsZW1lbnRzIFNpbms8VD4gewogIC8vLyBBbiB1bm1vZGlmaWFibGUgbGlzdCBvZiBldmVudHMgcGFzc2VkIHRvIHRoaXMgc2luayBzbyBmYXIuCiAgTGlzdDxUPiBnZXQgZXZlbnRzID0+IG5ldyBVbm1vZGlmaWFibGVMaXN0VmlldyhfZXZlbnRzKTsKICBmaW5hbCBfZXZlbnRzID0gPFQ+W107CgogIC8vLyBXaGV0aGVyIFtjbG9zZV0gaGFzIGJlZW4gY2FsbGVkLgogIGJvb2wgZ2V0IGlzQ2xvc2VkID0+IF9pc0Nsb3NlZDsKICB2YXIgX2lzQ2xvc2VkID0gZmFsc2U7CgogIC8vLyBSZW1vdmVzIGFsbCBldmVudHMgZnJvbSBbZXZlbnRzXS4KICAvLy8KICAvLy8gVGhpcyBjYW4gYmUgdXNlZCB0byBhdm9pZCBkb3VibGUtcHJvY2Vzc2luZyBldmVudHMuCiAgdm9pZCBjbGVhcigpIHsKICAgIF9ldmVudHMuY2xlYXIoKTsKICB9CgogIHZvaWQgYWRkKFQgZXZlbnQpIHsKICAgIGlmIChfaXNDbG9zZWQpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIkNhbid0IGFkZCB0byBhIGNsb3NlZCBzaW5rLiIpOwogICAgfQoKICAgIF9ldmVudHMuYWRkKGV2ZW50KTsKICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBfaXNDbG9zZWQgPSB0cnVlOwogIH0KfQonAE5OPAEaAVEEMy5BOxkBJyIZASgGOhEVBAEWFTsGARgEAREWBAIBKXBhY2thZ2U6Y29udmVydC9zcmMvYWNjdW11bGF0b3Jfc2luay5kYXJ0Q3Nka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jb252ZXJ0L2xpYi9zcmMvYnl0ZV9hY2N1bXVsYXRvcl9zaW5rLmRhcnSFwi8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CmltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKCmltcG9ydCAncGFja2FnZTp0eXBlZF9kYXRhL3R5cGVkX2RhdGEuZGFydCc7CgovLy8gQSBzaW5rIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBjb25jYXRlbmF0ZWQgYnl0ZXMgcGFzc2VkIHRvIGl0LgovLy8KLy8vIFNlZSBhbHNvIFtCeXRlQ29udmVyc2lvblNpbmsud2l0aENhbGxiYWNrXS4KY2xhc3MgQnl0ZUFjY3VtdWxhdG9yU2luayBleHRlbmRzIEJ5dGVDb252ZXJzaW9uU2lua0Jhc2UgewogIC8vLyBUaGUgYnl0ZXMgYWNjdW11bGF0ZWQgc28gZmFyLgogIC8vLwogIC8vLyBUaGUgcmV0dXJuZWQgW1VpbnQ4TGlzdF0gaXMgdmlld2luZyBhIHNoYXJlZCBidWZmZXIsIHNvIGl0IHNob3VsZCBub3QgYmUKICAvLy8gY2hhbmdlZCBhbmQgYW55IGJ5dGVzIG91dHNpZGUgdGhlIHZpZXcgc2hvdWxkIG5vdCBiZSBhY2Nlc3NlZC4KICBVaW50OExpc3QgZ2V0IGJ5dGVzID0+IG5ldyBVaW50OExpc3QudmlldyhfYnVmZmVyLmJ1ZmZlciwgMCwgX2J1ZmZlci5sZW5ndGgpOwoKICBmaW5hbCBfYnVmZmVyID0gbmV3IFVpbnQ4QnVmZmVyKCk7CgogIC8vLyBXaGV0aGVyIFtjbG9zZV0gaGFzIGJlZW4gY2FsbGVkLgogIGJvb2wgZ2V0IGlzQ2xvc2VkID0+IF9pc0Nsb3NlZDsKICB2YXIgX2lzQ2xvc2VkID0gZmFsc2U7CgogIC8vLyBSZW1vdmVzIGFsbCBieXRlcyBmcm9tIFtieXRlc10uCiAgLy8vCiAgLy8vIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXZvaWQgZG91YmxlLXByb2Nlc3NpbmcgZGF0YS4KICB2b2lkIGNsZWFyKCkgewogICAgX2J1ZmZlci5jbGVhcigpOwogIH0KCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGJ5dGVzKSB7CiAgICBpZiAoX2lzQ2xvc2VkKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJDYW4ndCBhZGQgdG8gYSBjbG9zZWQgc2luay4iKTsKICAgIH0KCiAgICBfYnVmZmVyLmFkZEFsbChieXRlcyk7CiAgfQoKICB2b2lkIGFkZFNsaWNlKExpc3Q8aW50PiBjaHVuaywgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGlzTGFzdCkgewogICAgaWYgKF9pc0Nsb3NlZCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiQ2FuJ3QgYWRkIHRvIGEgY2xvc2VkIHNpbmsuIik7CiAgICB9CgogICAgX2J1ZmZlci5hZGRBbGwoY2h1bmssIHN0YXJ0LCBlbmQpOwogICAgaWYgKGlzTGFzdCkgX2lzQ2xvc2VkID0gdHJ1ZTsKICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBfaXNDbG9zZWQgPSB0cnVlOwogIH0KfQo3AE5OPAEXGgEtAUgEMDskBk9FUAElASciGQEmBjgRFQQBHhU7BgEbBAFEFTsGASciBAERFgQCAS5wYWNrYWdlOmNvbnZlcnQvc3JjL2J5dGVfYWNjdW11bGF0b3Jfc2luay5kYXJ0MXNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jb252ZXJ0L2xpYi9zcmMvaGV4LmRhcnSDVi8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGNvbnZlcnQuaGV4OwoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwoKaW1wb3J0ICdoZXgvZW5jb2Rlci5kYXJ0JzsKaW1wb3J0ICdoZXgvZGVjb2Rlci5kYXJ0JzsKCmV4cG9ydCAnaGV4L2VuY29kZXIuZGFydCcgaGlkZSBoZXhFbmNvZGVyOwpleHBvcnQgJ2hleC9kZWNvZGVyLmRhcnQnIGhpZGUgaGV4RGVjb2RlcjsKCi8vLyBUaGUgY2Fub25pY2FsIGluc3RhbmNlIG9mIFtIZXhDb2RlY10uCmNvbnN0IGhleCA9IGNvbnN0IEhleENvZGVjLl8oKTsKCi8vLyBBIGNvZGVjIHRoYXQgY29udmVydHMgYnl0ZSBhcnJheXMgdG8gYW5kIGZyb20gaGV4YWRlY2ltYWwgc3RyaW5ncywgZm9sbG93aW5nCi8vLyBbdGhlIEJhc2UxNiBzcGVjXVtyZmNdLgovLy8KLy8vIFtyZmNdOiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDY0OCNzZWN0aW9uLTgKLy8vCi8vLyBUaGlzIHNob3VsZCBiZSB1c2VkIHZpYSB0aGUgW2hleF0gZmllbGQuCmNsYXNzIEhleENvZGVjIGV4dGVuZHMgQ29kZWM8TGlzdDxpbnQ+LCBTdHJpbmc+IHsKICBIZXhFbmNvZGVyIGdldCBlbmNvZGVyID0+IGhleEVuY29kZXI7CiAgSGV4RGVjb2RlciBnZXQgZGVjb2RlciA9PiBoZXhEZWNvZGVyOwoKICBjb25zdCBIZXhDb2RlYy5fKCk7Cn0KHwBOTjwBFQEXARsbASsrASogAVEcBDkELTIoKAEWAgEccGFja2FnZTpjb252ZXJ0L3NyYy9oZXguZGFydDVzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY29udmVydC9saWIvc3JjL3BlcmNlbnQuZGFydIX8Ly8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgY29udmVydC5wZXJjZW50OwoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwoKaW1wb3J0ICdwZXJjZW50L2VuY29kZXIuZGFydCc7CmltcG9ydCAncGVyY2VudC9kZWNvZGVyLmRhcnQnOwoKZXhwb3J0ICdwZXJjZW50L2VuY29kZXIuZGFydCcgaGlkZSBwZXJjZW50RW5jb2RlcjsKZXhwb3J0ICdwZXJjZW50L2RlY29kZXIuZGFydCcgaGlkZSBwZXJjZW50RGVjb2RlcjsKCi8vLyBUaGUgY2Fub25pY2FsIGluc3RhbmNlIG9mIFtQZXJjZW50Q29kZWNdLgpjb25zdCBwZXJjZW50ID0gY29uc3QgUGVyY2VudENvZGVjLl8oKTsKCi8vIFRPRE8obndlaXopOiBBZGQgZmxhZ3MgdG8gc3VwcG9ydCBnZW5lcmF0aW5nIGFuZCBpbnRlcnByZXRpbmcgIisiIGFzIGEgc3BhY2UKLy8gY2hhcmFjdGVyLiBBbHNvIGFkZCBhbiBvcHRpb24gZm9yIGN1c3RvbSBzZXRzIG9mIHVucmVzZXJ2ZWQgY2hhcmFjdGVycy4KLy8vIEEgY29kZWMgdGhhdCBjb252ZXJ0cyBieXRlIGFycmF5cyB0byBhbmQgZnJvbSBwZXJjZW50LWVuY29kZWQgKGFsc28ga25vd24gYXMKLy8vIFVSTC1lbmNvZGVkKSBzdHJpbmdzIGFjY29yZGluZyB0byBbUkZDIDM5ODZdW3JmY10uCi8vLwovLy8gW3JmY106IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMi4xCi8vLwovLy8gW2VuY29kZXJdIGVuY29kZXMgYWxsIGJ5dGVzIG90aGVyIHRoYW4gQVNDSUkgbGV0dGVycywgZGVjaW1hbCBkaWdpdHMsIG9yIG9uZQovLy8gb2YgYC0uX35gLiBUaGlzIG1hdGNoZXMgdGhlIGJlaGF2aW9yIG9mIFtVcmkuZW5jb2RlUXVlcnlDb21wb25lbnRdIGV4Y2VwdAovLy8gdGhhdCBpdCBkb2Vzbid0IGVuY29kZSBgMHgyMGAgYnl0ZXMgdG8gdGhlIGArYCBjaGFyYWN0ZXIuCi8vLwovLy8gVG8gYmUgbWF4aW1hbGx5IGZsZXhpYmxlLCBbZGVjb2Rlcl0gd2lsbCBkZWNvZGUgYW55IHBlcmNlbnQtZW5jb2RlZCBieXRlIGFuZAovLy8gd2lsbCBhbGxvdyBhbnkgbm9uLXBlcmNlbnQtZW5jb2RlZCBieXRlIG90aGVyIHRoYW4gYCVgLiBCeSBkZWZhdWx0LCBpdAovLy8gaW50ZXJwcmV0cyBgK2AgYXMgYDB4MkJgIHJhdGhlciB0aGFuIGAweDIwYCBhcyBlbWl0dGVkIGJ5Ci8vLyBbVXJpLmVuY29kZVF1ZXJ5Q29tcG9uZW50XS4KY2xhc3MgUGVyY2VudENvZGVjIGV4dGVuZHMgQ29kZWM8TGlzdDxpbnQ+LCBTdHJpbmc+IHsKICBQZXJjZW50RW5jb2RlciBnZXQgZW5jb2RlciA9PiBwZXJjZW50RW5jb2RlcjsKICBQZXJjZW50RGVjb2RlciBnZXQgZGVjb2RlciA9PiBwZXJjZW50RGVjb2RlcjsKCiAgY29uc3QgUGVyY2VudENvZGVjLl8oKTsKfQooAE5OPAEZARcBHx8BMzMBLigBUEtRNwQ7BFFOPgRRSz4gNjAwARoCASBwYWNrYWdlOmNvbnZlcnQvc3JjL3BlcmNlbnQuZGFydEVzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY29udmVydC9saWIvc3JjL3N0cmluZ19hY2N1bXVsYXRvcl9zaW5rLmRhcnSEuC8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CgovLy8gQSBzaW5rIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBjb25jYXRlbmF0ZWQgc3RyaW5ncyBwYXNzZWQgdG8gaXQuCi8vLwovLy8gU2VlIGFsc28gW1N0cmluZ0NvbnZlcnNpb25TaW5rLndpdGhDYWxsYmFja10uCmNsYXNzIFN0cmluZ0FjY3VtdWxhdG9yU2luayBleHRlbmRzIFN0cmluZ0NvbnZlcnNpb25TaW5rQmFzZSB7CiAgLy8vIFRoZSBzdHJpbmcgYWNjdW11bGF0ZWQgc28gZmFyLgogIFN0cmluZyBnZXQgc3RyaW5nID0+IF9idWZmZXIudG9TdHJpbmcoKTsKICBmaW5hbCBfYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwoKICAvLy8gV2hldGhlciBbY2xvc2VdIGhhcyBiZWVuIGNhbGxlZC4KICBib29sIGdldCBpc0Nsb3NlZCA9PiBfaXNDbG9zZWQ7CiAgdmFyIF9pc0Nsb3NlZCA9IGZhbHNlOwoKICAvLy8gRW1wdGllcyBbc3RyaW5nXS4KICAvLy8KICAvLy8gVGhpcyBjYW4gYmUgdXNlZCB0byBhdm9pZCBkb3VibGUtcHJvY2Vzc2luZyBkYXRhLgogIHZvaWQgY2xlYXIoKSB7CiAgICBfYnVmZmVyLmNsZWFyKCk7CiAgfQoKICB2b2lkIGFkZChTdHJpbmcgY2h1bmspIHsKICAgIGlmIChfaXNDbG9zZWQpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIkNhbid0IGFkZCB0byBhIGNsb3NlZCBzaW5rLiIpOwogICAgfQoKICAgIF9idWZmZXIud3JpdGUoY2h1bmspOwogIH0KCiAgdm9pZCBhZGRTbGljZShTdHJpbmcgY2h1bmssIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIGlmIChfaXNDbG9zZWQpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIkNhbid0IGFkZCB0byBhIGNsb3NlZCBzaW5rLiIpOwogICAgfQoKICAgIF9idWZmZXIud3JpdGUoY2h1bmsuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKTsKICAgIGlmIChpc0xhc3QpIF9pc0Nsb3NlZCA9IHRydWU7CiAgfQoKICB2b2lkIGNsb3NlKCkgewogICAgX2lzQ2xvc2VkID0gdHJ1ZTsKICB9Cn0KMABOTjwBFwFKBDI/JSsmASciGQEYBjgRFQQBGxU7BgEaBAFBFTsGATAiBAERFgQCATBwYWNrYWdlOmNvbnZlcnQvc3JjL3N0cmluZ19hY2N1bXVsYXRvcl9zaW5rLmRhcnQ3c2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL3R5cGVkX2RhdGEvbGliL3R5cGVkX2RhdGEuZGFydIFoLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBVdGlsaXRpZXMgYW5kIGZ1bmN0aW9uYWxpdHkgcmVsYXRlZCB0byB0aGUgImRhcnQ6dHlwZWRfZGF0YSIgbGlicmFyeS4KbGlicmFyeSB0eXBlZF9kYXRhOwoKZXhwb3J0ICJwYWNrYWdlOnR5cGVkX2RhdGEvdHlwZWRfYnVmZmVycy5kYXJ0IjsKCgBOTjwBShQBMAEicGFja2FnZTp0eXBlZF9kYXRhL3R5cGVkX2RhdGEuZGFydDlzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY29udmVydC9saWIvc3JjL2hleC9lbmNvZGVyLmRhcnSLiS8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGNvbnZlcnQuaGV4LmVuY29kZXI7CgppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CmltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKCmltcG9ydCAncGFja2FnZTpjaGFyY29kZS9hc2NpaS5kYXJ0JzsKCi8vLyBUaGUgY2Fub25pY2FsIGluc3RhbmNlIG9mIFtIZXhFbmNvZGVyXS4KY29uc3QgaGV4RW5jb2RlciA9IGNvbnN0IEhleEVuY29kZXIuXygpOwoKLy8vIEEgY29udmVydGVyIHRoYXQgZW5jb2RlcyBieXRlIGFycmF5cyBpbnRvIGhleGFkZWNpbWFsIHN0cmluZ3MuCi8vLwovLy8gVGhpcyB3aWxsIHRocm93IGEgW1JhbmdlRXJyb3JdIGlmIHRoZSBieXRlIGFycmF5IGhhcyBhbnkgZGlnaXRzIHRoYXQgZG9uJ3QKLy8vIGZpdCBpbiB0aGUgZ2FtdXQgb2YgYSBieXRlLgpjbGFzcyBIZXhFbmNvZGVyIGV4dGVuZHMgQ29udmVydGVyPExpc3Q8aW50PiwgU3RyaW5nPiB7CiAgY29uc3QgSGV4RW5jb2Rlci5fKCk7CgogIFN0cmluZyBjb252ZXJ0KExpc3Q8aW50PiBieXRlcykgPT4gX2NvbnZlcnQoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7CgogIEJ5dGVDb252ZXJzaW9uU2luayBzdGFydENodW5rZWRDb252ZXJzaW9uKFNpbms8U3RyaW5nPiBzaW5rKSA9PgogICAgICBuZXcgX0hleEVuY29kZXJTaW5rKHNpbmspOwp9CgovLy8gQSBjb252ZXJzaW9uIHNpbmsgZm9yIGNodW5rZWQgaGV4YWRlY2ltYWwgZW5jb2RpbmcuCmNsYXNzIF9IZXhFbmNvZGVyU2luayBleHRlbmRzIEJ5dGVDb252ZXJzaW9uU2lua0Jhc2UgewogIC8vLyBUaGUgdW5kZXJseWluZyBzaW5rIHRvIHdoaWNoIGRlY29kZWQgYnl0ZSBhcnJheXMgd2lsbCBiZSBwYXNzZWQuCiAgZmluYWwgU2luazxTdHJpbmc+IF9zaW5rOwoKICBfSGV4RW5jb2RlclNpbmsodGhpcy5fc2luayk7CgogIHZvaWQgYWRkKExpc3Q8aW50PiBjaHVuaykgewogICAgX3NpbmsuYWRkKF9jb252ZXJ0KGNodW5rLCAwLCBjaHVuay5sZW5ndGgpKTsKICB9CgogIHZvaWQgYWRkU2xpY2UoTGlzdDxpbnQ+IGNodW5rLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBjaHVuay5sZW5ndGgpOwogICAgX3NpbmsuYWRkKF9jb252ZXJ0KGNodW5rLCBzdGFydCwgZW5kKSk7CiAgICBpZiAoaXNMYXN0KSBfc2luay5jbG9zZSgpOwogIH0KCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQp9CgpTdHJpbmcgX2NvbnZlcnQoTGlzdDxpbnQ+IGJ5dGVzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAvLyBBIFVpbnQ4TGlzdCBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGEgU3RyaW5nQnVmZmVyIGdpdmVuIHRoYXQgd2Uga25vdyB0aGF0CiAgLy8gd2UncmUgb25seSBlbWl0dGluZyBBU0NJSS1jb21wYXRpYmxlIGNoYXJhY3RlcnMsIGFuZCB0aGF0IHdlIGtub3cgdGhlCiAgLy8gbGVuZ3RoIGFoZWFkIG9mIHRpbWUuCiAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OExpc3QoKGVuZCAtIHN0YXJ0KSAqIDIpOwogIHZhciBidWZmZXJJbmRleCA9IDA7CgogIC8vIEEgYml0d2lzZSBPUiBvZiBhbGwgYnl0ZXMgaW4gW2J5dGVzXS4gVGhpcyBhbGxvd3MgdXMgdG8gY2hlY2sgZm9yCiAgLy8gb3V0LW9mLXJhbmdlIGJ5dGVzIHdpdGhvdXQgYWRkaW5nIG1vcmUgYnJhbmNoZXMgdGhhbiBuZWNlc3NhcnkgdG8gdGhlCiAgLy8gY29yZSBsb29wLgogIHZhciBieXRlT3IgPSAwOwogIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICB2YXIgYnl0ZSA9IGJ5dGVzW2ldOwogICAgYnl0ZU9yIHw9IGJ5dGU7CgogICAgLy8gVGhlIGJpdHdpc2UgYXJpdGhtZXRpYyBoZXJlIGlzIGVxdWl2YWxlbnQgdG8gYGJ5dGUgfi8gMTZgIGFuZCBgYnl0ZSAlIDE2YAogICAgLy8gZm9yIHZhbGlkIGJ5dGUgdmFsdWVzLCBidXQgaXMgZWFzaWVyIGZvciBkYXJ0MmpzIHRvIG9wdGltaXplIGdpdmVuIHRoYXQKICAgIC8vIGl0IGNhbid0IHByb3ZlIHRoYXQgW2J5dGVdIHdpbGwgYWx3YXlzIGJlIHBvc2l0aXZlLgogICAgYnVmZmVyW2J1ZmZlckluZGV4KytdID0gX2NvZGVVbml0Rm9yRGlnaXQoKGJ5dGUgJiAweEYwKSA+PiA0KTsKICAgIGJ1ZmZlcltidWZmZXJJbmRleCsrXSA9IF9jb2RlVW5pdEZvckRpZ2l0KGJ5dGUgJiAweDBGKTsKICB9CgogIGlmIChieXRlT3IgPj0gMCAmJiBieXRlT3IgPD0gMjU1KSByZXR1cm4gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKGJ1ZmZlcik7CgogIC8vIElmIHRoZXJlIHdhcyBhbiBpbnZhbGlkIGJ5dGUsIGZpbmQgaXQgYW5kIHRocm93IGFuIGV4Y2VwdGlvbi4KICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgdmFyIGJ5dGUgPSBieXRlc1tpXTsKICAgIGlmIChieXRlID49IDAgJiYgYnl0ZSA8PSAweGZmKSBjb250aW51ZTsKICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgIkludmFsaWQgYnl0ZSAke2J5dGUgPCAwID8gIi0iIDogIiJ9MHgke2J5dGUuYWJzKCkudG9SYWRpeFN0cmluZygxNil9LiIsCiAgICAgICAgYnl0ZXMsCiAgICAgICAgaSk7CiAgfQoKICB0aHJvdyAndW5yZWFjaGFibGUnOwp9CgovLy8gUmV0dXJucyB0aGUgQVNDSUkvVW5pY29kZSBjb2RlIHVuaXQgY29ycmVzcG9uZGluZyB0byB0aGUgaGV4YWRlY2ltYWwgZGlnaXQKLy8vIFtkaWdpdF0uCmludCBfY29kZVVuaXRGb3JEaWdpdChpbnQgZGlnaXQpID0+IGRpZ2l0IDwgMTAgPyBkaWdpdCArICQwIDogZGlnaXQgKyAkYSAtIDEwOwpbAE5OPAEdARcaASYBLCkBQwRPIDgYAUcBQiECATg3RxwBHwEeMQQBRDosHwQBERMEAgE3T0sbMRcBR0sQEiYZFAFRTztDPAQBTQFDJhktH1EPDAQBFwIBTw1PASRwYWNrYWdlOmNvbnZlcnQvc3JjL2hleC9lbmNvZGVyLmRhcnQ5c2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NvbnZlcnQvbGliL3NyYy9oZXgvZGVjb2Rlci5kYXJ0lP0vLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBjb252ZXJ0LmhleC5kZWNvZGVyOwoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CgppbXBvcnQgJy4uL3V0aWxzLmRhcnQnOwoKLy8vIFRoZSBjYW5vbmljYWwgaW5zdGFuY2Ugb2YgW0hleERlY29kZXJdLgpjb25zdCBoZXhEZWNvZGVyID0gY29uc3QgSGV4RGVjb2Rlci5fKCk7CgovLy8gQSBjb252ZXJ0ZXIgdGhhdCBkZWNvZGVzIGhleGFkZWNpbWFsIHN0cmluZ3MgaW50byBieXRlIGFycmF5cy4KLy8vCi8vLyBCZWNhdXNlIHR3byBoZXhhZGVjaW1hbCBkaWdpdHMgY29ycmVzcG9uZCB0byBhIHNpbmdsZSBieXRlLCB0aGlzIHdpbGwgdGhyb3cKLy8vIGEgW0Zvcm1hdEV4Y2VwdGlvbl0gaWYgZ2l2ZW4gYW4gb2RkLWxlbmd0aCBzdHJpbmcuIEl0IHdpbGwgYWxzbyB0aHJvdyBhCi8vLyBbRm9ybWF0RXhjZXB0aW9uXSBpZiBnaXZlbiBhIHN0cmluZyBjb250YWluaW5nIG5vbi1oZXhhZGVjaW1hbCBjb2RlIHVuaXRzLgpjbGFzcyBIZXhEZWNvZGVyIGV4dGVuZHMgQ29udmVydGVyPFN0cmluZywgTGlzdDxpbnQ+PiB7CiAgY29uc3QgSGV4RGVjb2Rlci5fKCk7CgogIExpc3Q8aW50PiBjb252ZXJ0KFN0cmluZyBzdHJpbmcpIHsKICAgIGlmICghc3RyaW5nLmxlbmd0aC5pc0V2ZW4pIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigKICAgICAgICAgICJJbnZhbGlkIGlucHV0IGxlbmd0aCwgbXVzdCBiZSBldmVuLiIsIHN0cmluZywgc3RyaW5nLmxlbmd0aCk7CiAgICB9CgogICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4TGlzdChzdHJpbmcubGVuZ3RoIH4vIDIpOwogICAgX2RlY29kZShzdHJpbmcuY29kZVVuaXRzLCAwLCBzdHJpbmcubGVuZ3RoLCBieXRlcywgMCk7CiAgICByZXR1cm4gYnl0ZXM7CiAgfQoKICBTdHJpbmdDb252ZXJzaW9uU2luayBzdGFydENodW5rZWRDb252ZXJzaW9uKFNpbms8TGlzdDxpbnQ+PiBzaW5rKSA9PgogICAgICBuZXcgX0hleERlY29kZXJTaW5rKHNpbmspOwp9CgovLy8gQSBjb252ZXJzaW9uIHNpbmsgZm9yIGNodW5rZWQgaGV4YWRlY2ltYWwgZGVjb2RpbmcuCmNsYXNzIF9IZXhEZWNvZGVyU2luayBleHRlbmRzIFN0cmluZ0NvbnZlcnNpb25TaW5rQmFzZSB7CiAgLy8vIFRoZSB1bmRlcmx5aW5nIHNpbmsgdG8gd2hpY2ggZGVjb2RlZCBieXRlIGFycmF5cyB3aWxsIGJlIHBhc3NlZC4KICBmaW5hbCBTaW5rPExpc3Q8aW50Pj4gX3Npbms7CgogIC8vLyBUaGUgdHJhaWxpbmcgZGlnaXQgZnJvbSB0aGUgcHJldmlvdXMgc3RyaW5nLgogIC8vLwogIC8vLyBUaGlzIHdpbGwgYmUgbm9uLWBudWxsYCBpZiB0aGUgbW9zdCByZWNlbnQgc3RyaW5nIGhhZCBhbiBvZGQgbnVtYmVyIG9mCiAgLy8vIGhleGFkZWNpbWFsIGRpZ2l0cy4gU2luY2UgaXQncyB0aGUgbW9zdCBzaWduaWZpY2FudCBkaWdpdCwgaXQncyBhbHdheXMgYQogIC8vLyBtdWx0aXBsZSBvZiAxNi4KICBpbnQgX2xhc3REaWdpdDsKCiAgX0hleERlY29kZXJTaW5rKHRoaXMuX3NpbmspOwoKICB2b2lkIGFkZFNsaWNlKFN0cmluZyBzdHJpbmcsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHN0cmluZy5sZW5ndGgpOwoKICAgIGlmIChzdGFydCA9PSBlbmQpIHsKICAgICAgaWYgKGlzTGFzdCkgX2Nsb3NlKHN0cmluZywgZW5kKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciBjb2RlVW5pdHMgPSBzdHJpbmcuY29kZVVuaXRzOwogICAgVWludDhMaXN0IGJ5dGVzOwogICAgaW50IGJ5dGVzU3RhcnQ7CiAgICBpZiAoX2xhc3REaWdpdCA9PSBudWxsKSB7CiAgICAgIGJ5dGVzID0gbmV3IFVpbnQ4TGlzdCgoZW5kIC0gc3RhcnQpIH4vIDIpOwogICAgICBieXRlc1N0YXJ0ID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBoZXhQYWlycyA9IChlbmQgLSBzdGFydCAtIDEpIH4vIDI7CiAgICAgIGJ5dGVzID0gbmV3IFVpbnQ4TGlzdCgxICsgaGV4UGFpcnMpOwogICAgICBieXRlc1swXSA9IF9sYXN0RGlnaXQgKyBkaWdpdEZvckNvZGVVbml0KGNvZGVVbml0cywgc3RhcnQpOwogICAgICBzdGFydCsrOwogICAgICBieXRlc1N0YXJ0ID0gMTsKICAgIH0KCiAgICBfbGFzdERpZ2l0ID0gX2RlY29kZShjb2RlVW5pdHMsIHN0YXJ0LCBlbmQsIGJ5dGVzLCBieXRlc1N0YXJ0KTsKCiAgICBfc2luay5hZGQoYnl0ZXMpOwogICAgaWYgKGlzTGFzdCkgX2Nsb3NlKHN0cmluZywgZW5kKTsKICB9CgogIEJ5dGVDb252ZXJzaW9uU2luayBhc1V0ZjhTaW5rKGJvb2wgYWxsb3dNYWxmb3JtZWQpID0+CiAgICAgIG5ldyBfSGV4RGVjb2RlckJ5dGVTaW5rKF9zaW5rKTsKCiAgdm9pZCBjbG9zZSgpID0+IF9jbG9zZSgpOwoKICAvLy8gTGlrZSBbY2xvc2VdLCBidXQgaW5jbHVkZXMgW3N0cmluZ10gYW5kIFtpbmRleF0gaW4gdGhlIFtGb3JtYXRFeGNlcHRpb25dCiAgLy8vIGlmIG9uZSBpcyB0aHJvd24uCiAgdm9pZCBfY2xvc2UoW1N0cmluZyBzdHJpbmcsIGludCBpbmRleF0pIHsKICAgIGlmIChfbGFzdERpZ2l0ICE9IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigKICAgICAgICAgICJJbnB1dCBlbmRlZCB3aXRoIGluY29tcGxldGUgZW5jb2RlZCBieXRlLiIsIHN0cmluZywgaW5kZXgpOwogICAgfQoKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQp9CgovLy8gQSBjb252ZXJzaW9uIHNpbmsgZm9yIGNodW5rZWQgaGV4YWRlY2ltYWwgZGVjb2RpbmcgZnJvbSBVVEYtOCBieXRlcy4KY2xhc3MgX0hleERlY29kZXJCeXRlU2luayBleHRlbmRzIEJ5dGVDb252ZXJzaW9uU2lua0Jhc2UgewogIC8vLyBUaGUgdW5kZXJseWluZyBzaW5rIHRvIHdoaWNoIGRlY29kZWQgYnl0ZSBhcnJheXMgd2lsbCBiZSBwYXNzZWQuCiAgZmluYWwgU2luazxMaXN0PGludD4+IF9zaW5rOwoKICAvLy8gVGhlIHRyYWlsaW5nIGRpZ2l0IGZyb20gdGhlIHByZXZpb3VzIHN0cmluZy4KICAvLy8KICAvLy8gVGhpcyB3aWxsIGJlIG5vbi1gbnVsbGAgaWYgdGhlIG1vc3QgcmVjZW50IHN0cmluZyBoYWQgYW4gb2RkIG51bWJlciBvZgogIC8vLyBoZXhhZGVjaW1hbCBkaWdpdHMuIFNpbmNlIGl0J3MgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgZGlnaXQsIGl0J3MgYWx3YXlzIGEKICAvLy8gbXVsdGlwbGUgb2YgMTYuCiAgaW50IF9sYXN0RGlnaXQ7CgogIF9IZXhEZWNvZGVyQnl0ZVNpbmsodGhpcy5fc2luayk7CgogIHZvaWQgYWRkKExpc3Q8aW50PiBjaHVuaykgPT4gYWRkU2xpY2UoY2h1bmssIDAsIGNodW5rLmxlbmd0aCwgZmFsc2UpOwoKICB2b2lkIGFkZFNsaWNlKExpc3Q8aW50PiBjaHVuaywgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGlzTGFzdCkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgY2h1bmsubGVuZ3RoKTsKCiAgICBpZiAoc3RhcnQgPT0gZW5kKSB7CiAgICAgIGlmIChpc0xhc3QpIF9jbG9zZShjaHVuaywgZW5kKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIFVpbnQ4TGlzdCBieXRlczsKICAgIGludCBieXRlc1N0YXJ0OwogICAgaWYgKF9sYXN0RGlnaXQgPT0gbnVsbCkgewogICAgICBieXRlcyA9IG5ldyBVaW50OExpc3QoKGVuZCAtIHN0YXJ0KSB+LyAyKTsKICAgICAgYnl0ZXNTdGFydCA9IDA7CiAgICB9IGVsc2UgewogICAgICB2YXIgaGV4UGFpcnMgPSAoZW5kIC0gc3RhcnQgLSAxKSB+LyAyOwogICAgICBieXRlcyA9IG5ldyBVaW50OExpc3QoMSArIGhleFBhaXJzKTsKICAgICAgYnl0ZXNbMF0gPSBfbGFzdERpZ2l0ICsgZGlnaXRGb3JDb2RlVW5pdChjaHVuaywgc3RhcnQpOwogICAgICBzdGFydCsrOwogICAgICBieXRlc1N0YXJ0ID0gMTsKICAgIH0KCiAgICBfbGFzdERpZ2l0ID0gX2RlY29kZShjaHVuaywgc3RhcnQsIGVuZCwgYnl0ZXMsIGJ5dGVzU3RhcnQpOwoKICAgIF9zaW5rLmFkZChieXRlcyk7CiAgICBpZiAoaXNMYXN0KSBfY2xvc2UoY2h1bmssIGVuZCk7CiAgfQoKICB2b2lkIGNsb3NlKCkgPT4gX2Nsb3NlKCk7CgogIC8vLyBMaWtlIFtjbG9zZV0sIGJ1dCBpbmNsdWRlcyBbY2h1bmtdIGFuZCBbaW5kZXhdIGluIHRoZSBbRm9ybWF0RXhjZXB0aW9uXQogIC8vLyBpZiBvbmUgaXMgdGhyb3duLgogIHZvaWQgX2Nsb3NlKFtMaXN0PGludD4gY2h1bmssIGludCBpbmRleF0pIHsKICAgIGlmIChfbGFzdERpZ2l0ICE9IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigKICAgICAgICAgICJJbnB1dCBlbmRlZCB3aXRoIGluY29tcGxldGUgZW5jb2RlZCBieXRlLiIsIGNodW5rLCBpbmRleCk7CiAgICB9CgogICAgX3NpbmsuY2xvc2UoKTsKICB9Cn0KCi8vLyBEZWNvZGVzIFtjb2RlVW5pdHNdIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCBpbnRvIFtkZXN0aW5hdGlvbl0uCi8vLwovLy8gVGhpcyByZWFkcyBmcm9tIFtjb2RlVW5pdHNdIGJldHdlZW4gW3NvdXJjZVN0YXJ0XSBhbmQgW3NvdXJjZUVuZF0uIEl0IHdyaXRlcwovLy8gdGhlIHJlc3VsdCBpbnRvIFtkZXN0aW5hdGlvbl0gc3RhcnRpbmcgYXQgW2Rlc3RpbmF0aW9uU3RhcnRdLgovLy8KLy8vIElmIHRoZXJlJ3MgYSBsZWZ0b3ZlciBkaWdpdCBhdCB0aGUgZW5kIG9mIHRoZSBkZWNvZGluZywgdGhpcyByZXR1cm5zIHRoYXQKLy8vIGRpZ2l0LiBPdGhlcndpc2UgaXQgcmV0dXJucyBgbnVsbGAuCmludCBfZGVjb2RlKExpc3Q8aW50PiBjb2RlVW5pdHMsIGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCwKICAgIExpc3Q8aW50PiBkZXN0aW5hdGlvbiwgaW50IGRlc3RpbmF0aW9uU3RhcnQpIHsKICB2YXIgZGVzdGluYXRpb25JbmRleCA9IGRlc3RpbmF0aW9uU3RhcnQ7CiAgZm9yICh2YXIgaSA9IHNvdXJjZVN0YXJ0OyBpIDwgc291cmNlRW5kIC0gMTsgaSArPSAyKSB7CiAgICB2YXIgZmlyc3REaWdpdCA9IGRpZ2l0Rm9yQ29kZVVuaXQoY29kZVVuaXRzLCBpKTsKICAgIHZhciBzZWNvbmREaWdpdCA9IGRpZ2l0Rm9yQ29kZVVuaXQoY29kZVVuaXRzLCBpICsgMSk7CiAgICBkZXN0aW5hdGlvbltkZXN0aW5hdGlvbkluZGV4KytdID0gMTYgKiBmaXJzdERpZ2l0ICsgc2Vjb25kRGlnaXQ7CiAgfQoKICBpZiAoKHNvdXJjZUVuZCAtIHNvdXJjZVN0YXJ0KS5pc0V2ZW4pIHJldHVybiBudWxsOwogIHJldHVybiAxNiAqIGRpZ2l0Rm9yQ29kZVVuaXQoY29kZVVuaXRzLCBzb3VyY2VFbmQgLSAxKTsKfQqArgBOTjwBHQEXGgEYASwpAUMEUExPOBgBJSEhSQYBMzsSBAFHIQIBODlHHwEzBk1PFhIBHwFCOwEYJw4GASYVFB4xFg0tK0IPFgYBRAEWJQQBOCYBHAFPGCweIUcGARMEAgFJO0cfATMGTU8WEgEjAUgBRDoBGCYOBgEVFB4xFg0tKz4PFgYBQAEWJAQBHAFOGC4eIUYGARMEAgFCBFFCBE4oQTMrOTU6RQQBNToCASRwYWNrYWdlOmNvbnZlcnQvc3JjL2hleC9kZWNvZGVyLmRhcnQ9c2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NvbnZlcnQvbGliL3NyYy9wZXJjZW50L2VuY29kZXIuZGFydI4mLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgY29udmVydC5wZXJjZW50LmVuY29kZXI7CgppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CgppbXBvcnQgJ3BhY2thZ2U6Y2hhcmNvZGUvYXNjaWkuZGFydCc7CgovLy8gVGhlIGNhbm9uaWNhbCBpbnN0YW5jZSBvZiBbUGVyY2VudEVuY29kZXJdLgpjb25zdCBwZXJjZW50RW5jb2RlciA9IGNvbnN0IFBlcmNlbnRFbmNvZGVyLl8oKTsKCi8vLyBBIGNvbnZlcnRlciB0aGF0IGVuY29kZXMgYnl0ZSBhcnJheXMgaW50byBwZXJjZW50LWVuY29kZWQgc3RyaW5ncy4KLy8vCi8vLyBbZW5jb2Rlcl0gZW5jb2RlcyBhbGwgYnl0ZXMgb3RoZXIgdGhhbiBBU0NJSSBsZXR0ZXJzLCBkZWNpbWFsIGRpZ2l0cywgb3Igb25lCi8vLyBvZiBgLS5ffmAuIFRoaXMgbWF0Y2hlcyB0aGUgYmVoYXZpb3Igb2YgW1VyaS5lbmNvZGVRdWVyeUNvbXBvbmVudF0gZXhjZXB0Ci8vLyB0aGF0IGl0IGRvZXNuJ3QgZW5jb2RlIGAweDIwYCBieXRlcyB0byB0aGUgYCtgIGNoYXJhY3Rlci4KLy8vCi8vLyBUaGlzIHdpbGwgdGhyb3cgYSBbUmFuZ2VFcnJvcl0gaWYgdGhlIGJ5dGUgYXJyYXkgaGFzIGFueSBkaWdpdHMgdGhhdCBkb24ndAovLy8gZml0IGluIHRoZSBnYW11dCBvZiBhIGJ5dGUuCmNsYXNzIFBlcmNlbnRFbmNvZGVyIGV4dGVuZHMgQ29udmVydGVyPExpc3Q8aW50PiwgU3RyaW5nPiB7CiAgY29uc3QgUGVyY2VudEVuY29kZXIuXygpOwoKICBTdHJpbmcgY29udmVydChMaXN0PGludD4gYnl0ZXMpID0+IF9jb252ZXJ0KGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOwoKICBCeXRlQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPFN0cmluZz4gc2luaykgPT4KICAgICAgbmV3IF9QZXJjZW50RW5jb2RlclNpbmsoc2luayk7Cn0KCi8vLyBBIGNvbnZlcnNpb24gc2luayBmb3IgY2h1bmtlZCBwZXJjZW50YWRlY2ltYWwgZW5jb2RpbmcuCmNsYXNzIF9QZXJjZW50RW5jb2RlclNpbmsgZXh0ZW5kcyBCeXRlQ29udmVyc2lvblNpbmtCYXNlIHsKICAvLy8gVGhlIHVuZGVybHlpbmcgc2luayB0byB3aGljaCBkZWNvZGVkIGJ5dGUgYXJyYXlzIHdpbGwgYmUgcGFzc2VkLgogIGZpbmFsIFNpbms8U3RyaW5nPiBfc2luazsKCiAgX1BlcmNlbnRFbmNvZGVyU2luayh0aGlzLl9zaW5rKTsKCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGNodW5rKSB7CiAgICBfc2luay5hZGQoX2NvbnZlcnQoY2h1bmssIDAsIGNodW5rLmxlbmd0aCkpOwogIH0KCiAgdm9pZCBhZGRTbGljZShMaXN0PGludD4gY2h1bmssIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIGNodW5rLmxlbmd0aCk7CiAgICBfc2luay5hZGQoX2NvbnZlcnQoY2h1bmssIHN0YXJ0LCBlbmQpKTsKICAgIGlmIChpc0xhc3QpIF9zaW5rLmNsb3NlKCk7CiAgfQoKICB2b2lkIGNsb3NlKCkgewogICAgX3NpbmsuY2xvc2UoKTsKICB9Cn0KClN0cmluZyBfY29udmVydChMaXN0PGludD4gYnl0ZXMsIGludCBzdGFydCwgaW50IGVuZCkgewogIHZhciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CgogIC8vIEEgYml0d2lzZSBPUiBvZiBhbGwgYnl0ZXMgaW4gW2J5dGVzXS4gVGhpcyBhbGxvd3MgdXMgdG8gY2hlY2sgZm9yCiAgLy8gb3V0LW9mLXJhbmdlIGJ5dGVzIHdpdGhvdXQgYWRkaW5nIG1vcmUgYnJhbmNoZXMgdGhhbiBuZWNlc3NhcnkgdG8gdGhlCiAgLy8gY29yZSBsb29wLgogIHZhciBieXRlT3IgPSAwOwogIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICB2YXIgYnl0ZSA9IGJ5dGVzW2ldOwogICAgYnl0ZU9yIHw9IGJ5dGU7CgogICAgLy8gSWYgdGhlIGJ5dGUgaXMgYW4gdXBwZXJjYXNlIGxldHRlciwgY29udmVydCBpdCB0byBsb3dlcmNhc2UgdG8gY2hlY2sgaWYKICAgIC8vIGl0J3MgdW5yZXNlcnZlZC4gVGhpcyB3b3JrcyBiZWNhdXNlIHVwcGVyY2FzZSBsZXR0ZXJzIGluIEFTQ0lJIGFyZQogICAgLy8gZXhhY3RseSBgMGIxMDAwMDAgPSAweDIwYCBsZXNzIHRoYW4gbG93ZXJjYXNlIGxldHRlcnMsIHNvIGlmIHdlIGVuc3VyZQogICAgLy8gdGhhdCB0aGF0IGJpdCBpcyAxIHdlIGVuc3VyZSB0aGF0IHRoZSBsZXR0ZXIgaXMgbG93ZXJjYXNlLgogICAgdmFyIGxldHRlciA9IDB4MjAgfCBieXRlOwogICAgaWYgKChsZXR0ZXIgPj0gJGEgJiYgbGV0dGVyIDw9ICR6KSB8fAogICAgICAgIChieXRlID49ICQwICYmIGJ5dGUgPD0gJDkpIHx8CiAgICAgICAgYnl0ZSA9PSAkZGFzaCB8fAogICAgICAgIGJ5dGUgPT0gJGRvdCB8fAogICAgICAgIGJ5dGUgPT0gJHVuZGVyc2NvcmUgfHwKICAgICAgICBieXRlID09ICR0aWxkZSkgewogICAgICAvLyBVbnJlc2VydmVkIGNoYXJhY3RlcnMgYXJlIHNhZmUgdG8gd3JpdGUgYXMtaXMuCiAgICAgIGJ1ZmZlci53cml0ZUNoYXJDb2RlKGJ5dGUpOwogICAgICBjb250aW51ZTsKICAgIH0KCiAgICBidWZmZXIud3JpdGVDaGFyQ29kZSgkcGVyY2VudCk7CgogICAgLy8gVGhlIGJpdHdpc2UgYXJpdGhtZXRpYyBoZXJlIGlzIGVxdWl2YWxlbnQgdG8gYGJ5dGUgfi8gMTZgIGFuZCBgYnl0ZSAlIDE2YAogICAgLy8gZm9yIHZhbGlkIGJ5dGUgdmFsdWVzLCBidXQgaXMgZWFzaWVyIGZvciBkYXJ0MmpzIHRvIG9wdGltaXplIGdpdmVuIHRoYXQKICAgIC8vIGl0IGNhbid0IHByb3ZlIHRoYXQgW2J5dGVdIHdpbGwgYWx3YXlzIGJlIHBvc2l0aXZlLgogICAgYnVmZmVyLndyaXRlQ2hhckNvZGUoX2NvZGVVbml0Rm9yRGlnaXQoKGJ5dGUgJiAweEYwKSA+PiA0KSk7CiAgICBidWZmZXIud3JpdGVDaGFyQ29kZShfY29kZVVuaXRGb3JEaWdpdChieXRlICYgMHgwRikpOwogIH0KCiAgaWYgKGJ5dGVPciA+PSAwICYmIGJ5dGVPciA8PSAyNTUpIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKCiAgLy8gSWYgdGhlcmUgd2FzIGFuIGludmFsaWQgYnl0ZSwgZmluZCBpdCBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uLgogIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICB2YXIgYnl0ZSA9IGJ5dGVzW2ldOwogICAgaWYgKGJ5dGUgPj0gMCAmJiBieXRlIDw9IDB4ZmYpIGNvbnRpbnVlOwogICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigKICAgICAgICAiSW52YWxpZCBieXRlICR7Ynl0ZSA8IDAgPyAiLSIgOiAiIn0weCR7Ynl0ZS5hYnMoKS50b1JhZGl4U3RyaW5nKDE2KX0uIiwKICAgICAgICBieXRlcywKICAgICAgICBpKTsKICB9CgogIHRocm93ICd1bnJlYWNoYWJsZSc7Cn0KCi8vLyBSZXR1cm5zIHRoZSBBU0NJSS9Vbmljb2RlIGNvZGUgdW5pdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBoZXhhZGVjaW1hbCBkaWdpdAovLy8gW2RpZ2l0XS4KaW50IF9jb2RlVW5pdEZvckRpZ2l0KGludCBkaWdpdCkgPT4gZGlnaXQgPCAxMCA/IGRpZ2l0ICsgJDAgOiBkaWdpdCArICRBIC0gMTA7CmwATk48ASEBFwEmATAxAUcEUU4+BE8gPBwBRwFCJQIBPDtHHAEjAR4xBAFEOiwfBAEREwQCATcjAUdLEBImGRQBT0pOQh4qJhkYHxo4IhAGASQBUU87QToEAT4BQyYZLR9RDwwEARcCAU8NTwEocGFja2FnZTpjb252ZXJ0L3NyYy9wZXJjZW50L2VuY29kZXIuZGFydD1zZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY29udmVydC9saWIvc3JjL3BlcmNlbnQvZGVjb2Rlci5kYXJ0newvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBjb252ZXJ0LnBlcmNlbnQuZGVjb2RlcjsKCmltcG9ydCAnZGFydDpjb252ZXJ0JzsKCmltcG9ydCAncGFja2FnZTpjaGFyY29kZS9hc2NpaS5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOnR5cGVkX2RhdGEvdHlwZWRfZGF0YS5kYXJ0JzsKCmltcG9ydCAnLi4vdXRpbHMuZGFydCc7CgovLy8gVGhlIGNhbm9uaWNhbCBpbnN0YW5jZSBvZiBbUGVyY2VudERlY29kZXJdLgpjb25zdCBwZXJjZW50RGVjb2RlciA9IGNvbnN0IFBlcmNlbnREZWNvZGVyLl8oKTsKCmNvbnN0IF9sYXN0UGVyY2VudCA9IC0xOwoKLy8vIEEgY29udmVydGVyIHRoYXQgZGVjb2RlcyBwZXJjZW50LWVuY29kZWQgc3RyaW5ncyBpbnRvIGJ5dGUgYXJyYXlzLgovLy8KLy8vIFRvIGJlIG1heGltYWxseSBmbGV4aWJsZSwgdGhpcyB3aWxsIGRlY29kZSBhbnkgcGVyY2VudC1lbmNvZGVkIGJ5dGUgYW5kCi8vLyB3aWxsIGFsbG93IGFueSBub24tcGVyY2VudC1lbmNvZGVkIGJ5dGUgb3RoZXIgdGhhbiBgJWAuIEJ5IGRlZmF1bHQsIGl0Ci8vLyBpbnRlcnByZXRzIGArYCBhcyBgMHgyQmAgcmF0aGVyIHRoYW4gYDB4MjBgIGFzIGVtaXR0ZWQgYnkKLy8vIFtVcmkuZW5jb2RlUXVlcnlDb21wb25lbnRdLgovLy8KLy8vIFRoaXMgd2lsbCB0aHJvdyBhIFtGb3JtYXRFeGNlcHRpb25dIGlmIHRoZSBpbnB1dCBzdHJpbmcgaGFzIGFuIGluY29tcGxldGUKLy8vIHBlcmNlbnQtZW5jb2RpbmcsIG9yIGlmIGl0IGNvbnRhaW5zIG5vbi1BU0NJSSBjb2RlIHVuaXRzLgpjbGFzcyBQZXJjZW50RGVjb2RlciBleHRlbmRzIENvbnZlcnRlcjxTdHJpbmcsIExpc3Q8aW50Pj4gewogIGNvbnN0IFBlcmNlbnREZWNvZGVyLl8oKTsKCiAgTGlzdDxpbnQ+IGNvbnZlcnQoU3RyaW5nIHN0cmluZykgewogICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OEJ1ZmZlcigpOwogICAgdmFyIGxhc3REaWdpdCA9IF9kZWNvZGUoc3RyaW5nLmNvZGVVbml0cywgMCwgc3RyaW5nLmxlbmd0aCwgYnVmZmVyKTsKCiAgICBpZiAobGFzdERpZ2l0ICE9IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigKICAgICAgICAgICJJbnB1dCBlbmRlZCB3aXRoIGluY29tcGxldGUgZW5jb2RlZCBieXRlLiIsIHN0cmluZywgc3RyaW5nLmxlbmd0aCk7CiAgICB9CgogICAgcmV0dXJuIGJ1ZmZlci5idWZmZXIuYXNVaW50OExpc3QoMCwgYnVmZmVyLmxlbmd0aCk7CiAgfQoKICBTdHJpbmdDb252ZXJzaW9uU2luayBzdGFydENodW5rZWRDb252ZXJzaW9uKFNpbms8TGlzdDxpbnQ+PiBzaW5rKSA9PgogICAgICBuZXcgX1BlcmNlbnREZWNvZGVyU2luayhzaW5rKTsKfQoKLy8vIEEgY29udmVyc2lvbiBzaW5rIGZvciBjaHVua2VkIHBlcmNlbnQtZW5jb2RlZCBkZWNvZGluZy4KY2xhc3MgX1BlcmNlbnREZWNvZGVyU2luayBleHRlbmRzIFN0cmluZ0NvbnZlcnNpb25TaW5rQmFzZSB7CiAgLy8vIFRoZSB1bmRlcmx5aW5nIHNpbmsgdG8gd2hpY2ggZGVjb2RlZCBieXRlIGFycmF5cyB3aWxsIGJlIHBhc3NlZC4KICBmaW5hbCBTaW5rPExpc3Q8aW50Pj4gX3Npbms7CgogIC8vLyBUaGUgdHJhaWxpbmcgZGlnaXQgZnJvbSB0aGUgcHJldmlvdXMgc3RyaW5nLgogIC8vLwogIC8vLyBUaGlzIGlzIGBudWxsYCBpZiB0aGUgcHJldmlvdXMgc3RyaW5nIGVuZGVkIHdpdGggYSBjb21wbGV0ZQogIC8vLyBwZXJjZW50LWVuY29kZWQgYnl0ZSBvciBhIGxpdGVyYWwgY2hhcmFjdGVyLiBJdCdzIFtfbGFzdFBlcmNlbnRdIGlmIHRoZQogIC8vLyBtb3N0IHJlY2VudCBzdHJpbmcgZW5kZWQgd2l0aCBgJWAuIE90aGVyd2lzZSwgdGhlIG1vc3QgcmVjZW50IHN0cmluZyBlbmRlZAogIC8vLyB3aXRoIGEgYCVgIGZvbGxvd2VkIGJ5IGEgaGV4YWRlY2ltYWwgZGlnaXQsIGFuZCB0aGlzIGlzIHRoYXQgZGlnaXQuIFNpbmNlCiAgLy8vIGl0J3MgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgZGlnaXQsIGl0J3MgYWx3YXlzIGEgbXVsdGlwbGUgb2YgMTYuCiAgaW50IF9sYXN0RGlnaXQ7CgogIF9QZXJjZW50RGVjb2RlclNpbmsodGhpcy5fc2luayk7CgogIHZvaWQgYWRkU2xpY2UoU3RyaW5nIHN0cmluZywgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGlzTGFzdCkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgc3RyaW5nLmxlbmd0aCk7CgogICAgaWYgKHN0YXJ0ID09IGVuZCkgewogICAgICBpZiAoaXNMYXN0KSBfY2xvc2Uoc3RyaW5nLCBlbmQpOwogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OEJ1ZmZlcigpOwogICAgdmFyIGNvZGVVbml0cyA9IHN0cmluZy5jb2RlVW5pdHM7CiAgICBpZiAoX2xhc3REaWdpdCA9PSBfbGFzdFBlcmNlbnQpIHsKICAgICAgX2xhc3REaWdpdCA9IDE2ICogZGlnaXRGb3JDb2RlVW5pdChjb2RlVW5pdHMsIHN0YXJ0KTsKICAgICAgc3RhcnQrKzsKCiAgICAgIGlmIChzdGFydCA9PSBlbmQpIHsKICAgICAgICBpZiAoaXNMYXN0KSBfY2xvc2Uoc3RyaW5nLCBlbmQpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQoKICAgIGlmIChfbGFzdERpZ2l0ICE9IG51bGwpIHsKICAgICAgYnVmZmVyLmFkZChfbGFzdERpZ2l0ICsgZGlnaXRGb3JDb2RlVW5pdChjb2RlVW5pdHMsIHN0YXJ0KSk7CiAgICAgIHN0YXJ0Kys7CiAgICB9CgogICAgX2xhc3REaWdpdCA9IF9kZWNvZGUoY29kZVVuaXRzLCBzdGFydCwgZW5kLCBidWZmZXIpOwoKICAgIF9zaW5rLmFkZChidWZmZXIuYnVmZmVyLmFzVWludDhMaXN0KDAsIGJ1ZmZlci5sZW5ndGgpKTsKICAgIGlmIChpc0xhc3QpIF9jbG9zZShzdHJpbmcsIGVuZCk7CiAgfQoKICBCeXRlQ29udmVyc2lvblNpbmsgYXNVdGY4U2luayhib29sIGFsbG93TWFsZm9ybWVkKSA9PgogICAgICBuZXcgX1BlcmNlbnREZWNvZGVyQnl0ZVNpbmsoX3NpbmspOwoKICB2b2lkIGNsb3NlKCkgPT4gX2Nsb3NlKCk7CgogIC8vLyBMaWtlIFtjbG9zZV0sIGJ1dCBpbmNsdWRlcyBbc3RyaW5nXSBhbmQgW2luZGV4XSBpbiB0aGUgW0Zvcm1hdEV4Y2VwdGlvbl0KICAvLy8gaWYgb25lIGlzIHRocm93bi4KICB2b2lkIF9jbG9zZShbU3RyaW5nIHN0cmluZywgaW50IGluZGV4XSkgewogICAgaWYgKF9sYXN0RGlnaXQgIT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICAgIklucHV0IGVuZGVkIHdpdGggaW5jb21wbGV0ZSBlbmNvZGVkIGJ5dGUuIiwgc3RyaW5nLCBpbmRleCk7CiAgICB9CgogICAgX3NpbmsuY2xvc2UoKTsKICB9Cn0KCi8vLyBBIGNvbnZlcnNpb24gc2luayBmb3IgY2h1bmtlZCBwZXJjZW50LWVuY29kZWQgZGVjb2RpbmcgZnJvbSBVVEYtOCBieXRlcy4KY2xhc3MgX1BlcmNlbnREZWNvZGVyQnl0ZVNpbmsgZXh0ZW5kcyBCeXRlQ29udmVyc2lvblNpbmtCYXNlIHsKICAvLy8gVGhlIHVuZGVybHlpbmcgc2luayB0byB3aGljaCBkZWNvZGVkIGJ5dGUgYXJyYXlzIHdpbGwgYmUgcGFzc2VkLgogIGZpbmFsIFNpbms8TGlzdDxpbnQ+PiBfc2luazsKCiAgLy8vIFRoZSB0cmFpbGluZyBkaWdpdCBmcm9tIHRoZSBwcmV2aW91cyBzdHJpbmcuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYG51bGxgIGlmIHRoZSBwcmV2aW91cyBzdHJpbmcgZW5kZWQgd2l0aCBhIGNvbXBsZXRlCiAgLy8vIHBlcmNlbnQtZW5jb2RlZCBieXRlIG9yIGEgbGl0ZXJhbCBjaGFyYWN0ZXIuIEl0J3MgW19sYXN0UGVyY2VudF0gaWYgdGhlCiAgLy8vIG1vc3QgcmVjZW50IHN0cmluZyBlbmRlZCB3aXRoIGAlYC4gT3RoZXJ3aXNlLCB0aGUgbW9zdCByZWNlbnQgc3RyaW5nIGVuZGVkCiAgLy8vIHdpdGggYSBgJWAgZm9sbG93ZWQgYnkgYSBoZXhhZGVjaW1hbCBkaWdpdCwgYW5kIHRoaXMgaXMgdGhhdCBkaWdpdC4gU2luY2UKICAvLy8gaXQncyB0aGUgbW9zdCBzaWduaWZpY2FudCBkaWdpdCwgaXQncyBhbHdheXMgYSBtdWx0aXBsZSBvZiAxNi4KICBpbnQgX2xhc3REaWdpdDsKCiAgX1BlcmNlbnREZWNvZGVyQnl0ZVNpbmsodGhpcy5fc2luayk7CgogIHZvaWQgYWRkKExpc3Q8aW50PiBjaHVuaykgPT4gYWRkU2xpY2UoY2h1bmssIDAsIGNodW5rLmxlbmd0aCwgZmFsc2UpOwoKICB2b2lkIGFkZFNsaWNlKExpc3Q8aW50PiBjaHVuaywgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGlzTGFzdCkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgY2h1bmsubGVuZ3RoKTsKCiAgICBpZiAoc3RhcnQgPT0gZW5kKSB7CiAgICAgIGlmIChpc0xhc3QpIF9jbG9zZShjaHVuaywgZW5kKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhCdWZmZXIoKTsKICAgIGlmIChfbGFzdERpZ2l0ID09IF9sYXN0UGVyY2VudCkgewogICAgICBfbGFzdERpZ2l0ID0gMTYgKiBkaWdpdEZvckNvZGVVbml0KGNodW5rLCBzdGFydCk7CiAgICAgIHN0YXJ0Kys7CgogICAgICBpZiAoc3RhcnQgPT0gZW5kKSB7CiAgICAgICAgaWYgKGlzTGFzdCkgX2Nsb3NlKGNodW5rLCBlbmQpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQoKICAgIGlmIChfbGFzdERpZ2l0ICE9IG51bGwpIHsKICAgICAgYnVmZmVyLmFkZChfbGFzdERpZ2l0ICsgZGlnaXRGb3JDb2RlVW5pdChjaHVuaywgc3RhcnQpKTsKICAgICAgc3RhcnQrKzsKICAgIH0KCiAgICBfbGFzdERpZ2l0ID0gX2RlY29kZShjaHVuaywgc3RhcnQsIGVuZCwgYnVmZmVyKTsKCiAgICBfc2luay5hZGQoYnVmZmVyLmJ1ZmZlci5hc1VpbnQ4TGlzdCgwLCBidWZmZXIubGVuZ3RoKSk7CiAgICBpZiAoaXNMYXN0KSBfY2xvc2UoY2h1bmssIGVuZCk7CiAgfQoKICB2b2lkIGNsb3NlKCkgPT4gX2Nsb3NlKCk7CgogIC8vLyBMaWtlIFtjbG9zZV0sIGJ1dCBpbmNsdWRlcyBbY2h1bmtdIGFuZCBbaW5kZXhdIGluIHRoZSBbRm9ybWF0RXhjZXB0aW9uXQogIC8vLyBpZiBvbmUgaXMgdGhyb3duLgogIHZvaWQgX2Nsb3NlKFtMaXN0PGludD4gY2h1bmssIGludCBpbmRleF0pIHsKICAgIGlmIChfbGFzdERpZ2l0ICE9IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigKICAgICAgICAgICJJbnB1dCBlbmRlZCB3aXRoIGluY29tcGxldGUgZW5jb2RlZCBieXRlLiIsIGNodW5rLCBpbmRleCk7CiAgICB9CgogICAgX3NpbmsuY2xvc2UoKTsKICB9Cn0KCi8vLyBEZWNvZGVzIFtjb2RlVW5pdHNdIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCBpbnRvIFtkZXN0aW5hdGlvbl0uCi8vLwovLy8gVGhpcyByZWFkcyBmcm9tIFtjb2RlVW5pdHNdIGJldHdlZW4gW3NvdXJjZVN0YXJ0XSBhbmQgW3NvdXJjZUVuZF0uIEl0IHdyaXRlcwovLy8gdGhlIHJlc3VsdCBpbnRvIFtkZXN0aW5hdGlvbl0gc3RhcnRpbmcgYXQgW2Rlc3RpbmF0aW9uU3RhcnRdLgovLy8KLy8vIElmIHRoZXJlJ3MgYSBsZWZ0b3ZlciBkaWdpdCBhdCB0aGUgZW5kIG9mIHRoZSBkZWNvZGluZywgdGhpcyByZXR1cm5zIHRoYXQKLy8vIGRpZ2l0LiBPdGhlcndpc2UgaXQgcmV0dXJucyBgbnVsbGAuCmludCBfZGVjb2RlKExpc3Q8aW50PiBjb2RlVW5pdHMsIGludCBzdGFydCwgaW50IGVuZCwgVWludDhCdWZmZXIgYnVmZmVyKSB7CiAgLy8gQSBiaXR3aXNlIE9SIG9mIGFsbCBjb2RlIHVuaXRzIGluIFtjb2RlVW5pdHNdLiBUaGlzIGFsbG93cyB1cyB0byBjaGVjayBmb3IKICAvLyBvdXQtb2YtcmFuZ2UgY29kZSB1bml0cyB3aXRob3V0IGFkZGluZyBtb3JlIGJyYW5jaGVzIHRoYW4gbmVjZXNzYXJ5IHRvIHRoZQogIC8vIGNvcmUgbG9vcC4KICB2YXIgY29kZVVuaXRPciA9IDA7CgogIC8vIFRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgc2xpY2Ugb2YgYWRqYWNlbnQgbm9uLSUgY2hhcmFjdGVycy4gV2UgY2FuIGFkZAogIC8vIGFsbCBvZiB0aGVzZSB0byB0aGUgYnVmZmVyIGF0IG9uY2UuCiAgdmFyIHNsaWNlU3RhcnQgPSBzdGFydDsKICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgLy8gRmlyc3QsIGxvb3AgdGhyb3VnaCBub24tJSBjaGFyYWN0ZXJzLgogICAgdmFyIGNvZGVVbml0ID0gY29kZVVuaXRzW2ldOwogICAgaWYgKGNvZGVVbml0c1tpXSAhPSAkcGVyY2VudCkgewogICAgICBjb2RlVW5pdE9yIHw9IGNvZGVVbml0OwogICAgICBjb250aW51ZTsKICAgIH0KCiAgICAvLyBXZSBmb3VuZCBhICUuIFRoZSBzbGljZSBmcm9tIGBzbGljZVN0YXJ0YCB0byBgaWAgcmVwcmVzZW50cyBjaGFyYWN0ZXJzCiAgICAvLyB0aGFuIGNhbiBiZSBjb3BpZWQgdG8gdGhlIGJ1ZmZlciBhcy1pcy4KICAgIGlmIChpID4gc2xpY2VTdGFydCkgewogICAgICBfY2hlY2tGb3JJbnZhbGlkQ29kZVVuaXQoY29kZVVuaXRPciwgY29kZVVuaXRzLCBzbGljZVN0YXJ0LCBpKTsKICAgICAgYnVmZmVyLmFkZEFsbChjb2RlVW5pdHMsIHNsaWNlU3RhcnQsIGkpOwogICAgfQoKICAgIC8vIE5vdyBkZWNvZGUgdGhlIHBlcmNlbnQtZW5jb2RlZCBieXRlIGFuZCBhZGQgaXQgYXMgd2VsbC4KICAgIGkrKzsKICAgIGlmIChpID49IGVuZCkgcmV0dXJuIF9sYXN0UGVyY2VudDsKCiAgICB2YXIgZmlyc3REaWdpdCA9IGRpZ2l0Rm9yQ29kZVVuaXQoY29kZVVuaXRzLCBpKTsKICAgIGkrKzsKICAgIGlmIChpID49IGVuZCkgcmV0dXJuIDE2ICogZmlyc3REaWdpdDsKCiAgICB2YXIgc2Vjb25kRGlnaXQgPSBkaWdpdEZvckNvZGVVbml0KGNvZGVVbml0cywgaSk7CiAgICBidWZmZXIuYWRkKDE2ICogZmlyc3REaWdpdCArIHNlY29uZERpZ2l0KTsKCiAgICAvLyBUaGUgbmV4dCBpdGVyYXRpb24gd2lsbCBsb29rIGZvciBub24tJSBjaGFyYWN0ZXJzIGFnYWluLgogICAgc2xpY2VTdGFydCA9IGkgKyAxOwogIH0KCiAgaWYgKGVuZCA+IHNsaWNlU3RhcnQpIHsKICAgIF9jaGVja0ZvckludmFsaWRDb2RlVW5pdChjb2RlVW5pdE9yLCBjb2RlVW5pdHMsIHNsaWNlU3RhcnQsIGVuZCk7CiAgICBpZiAoc3RhcnQgPT0gc2xpY2VTdGFydCkgewogICAgICBidWZmZXIuYWRkQWxsKGNvZGVVbml0cyk7CiAgICB9IGVsc2UgewogICAgICBidWZmZXIuYWRkQWxsKGNvZGVVbml0cywgc2xpY2VTdGFydCwgZW5kKTsKICAgIH0KICB9CgogIHJldHVybiBudWxsOwp9Cgp2b2lkIF9jaGVja0ZvckludmFsaWRDb2RlVW5pdCgKICAgIGludCBjb2RlVW5pdE9yLCBMaXN0PGludD4gY29kZVVuaXRzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICBpZiAoY29kZVVuaXRPciA+PSAwICYmIGNvZGVVbml0T3IgPD0gMHg3ZikgcmV0dXJuOwoKICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgdmFyIGNvZGVVbml0ID0gY29kZVVuaXRzW2ldOwogICAgaWYgKGNvZGVVbml0ID49IDAgJiYgY29kZVVuaXQgPD0gMHg3ZikgY29udGludWU7CiAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICJOb24tQVNDSUkgY29kZSB1bml0ICIKICAgICAgICAiVSske2NvZGVVbml0LnRvUmFkaXhTdHJpbmcoMTYpLnBhZExlZnQoNCwgJzAnKX0iLAogICAgICAgIGNvZGVVbml0cywKICAgICAgICBpKTsKICB9Cn0KgPYATk48ASEBFwEmLQEYATAxARkBRwRMSz4gBE4+PBwBJSRJAR0hTwYBOAQBRyUCATw9Rx8BMwZCTlFQRRIBIwFCOwEYJw4GASQmJjwPARopEAgGAR5DDwYBOQE8JQQBOCoBHAFPGCweIUcGARMEAgFNP0cfATMGQk5RUEUSAScBSAFEOgEYJg4GASQmOA8BGigQCAYBHj8PBgE1ATwkBAEcAU4YLh4hRgYBEwQCAUIEUUIETihLUFAQFgFRKRomLSEkHhAGAU4vGkYvBgE/CScBNQkqATYvAUAYBAEaRh8gDTEGBAEPAgEfPzUBJiE1Hx87EwwEAgEocGFja2FnZTpjb252ZXJ0L3NyYy9wZXJjZW50L2RlY29kZXIuZGFydDpzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvdHlwZWRfZGF0YS9saWIvdHlwZWRfYnVmZmVycy5kYXJ0s88vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIEdyb3dhYmxlIHR5cGVkLWRhdGEgbGlzdHMuCi8vLwovLy8gVGhlc2UgbGlzdHMgd29ya3MganVzdCBhcyBhIHR5cGVkLWRhdGEgbGlzdCwgZXhjZXB0IHRoYXQgdGhleSBhcmUgZ3Jvd2FibGUuCi8vLyBUaGV5IHVzZSBhbiB1bmRlcmx5aW5nIGJ1ZmZlciwgYW5kIHdoZW4gdGhhdCBidWZmZXIgYmVjb21lcyB0b28gc21hbGwsIGl0Ci8vLyBpcyByZXBsYWNlZCBieSBhIG5ldyBidWZmZXIuCi8vLwovLy8gVGhhdCBtZWFucyB0aGF0IHVzaW5nIHRoZSBbVHlwZWREYXRhVmlldy5idWZmZXJdIGdldHRlciBpcyBub3QgZ3VhcmFudGVlZAovLy8gdG8gcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBlYWNoIHRpbWUgaXQgaXMgdXNlZCwgYW5kIHRoYXQgdGhlIGJ1ZmZlciBtYXkKLy8vIGJlIGxhcmdlciB0aGFuIHdoYXQgdGhlIGxpc3QgaXMgdXNpbmcuCmxpYnJhcnkgdHlwZWRfZGF0YS50eXBlZF9idWZmZXJzOwoKaW1wb3J0ICJkYXJ0OmNvbGxlY3Rpb24iIHNob3cgTGlzdEJhc2U7CmltcG9ydCAiZGFydDp0eXBlZF9kYXRhIjsKCmFic3RyYWN0IGNsYXNzIF9UeXBlZERhdGFCdWZmZXI8RT4gZXh0ZW5kcyBMaXN0QmFzZTxFPiB7CiAgc3RhdGljIGNvbnN0IGludCBJTklUSUFMX0xFTkdUSCA9IDg7CgogIC8vLyBUaGUgdW5kZXJseWluZyBkYXRhIGJ1ZmZlci4KICAvLy8KICAvLy8gVGhpcyBpcyBhbHdheXMgYm90aCBhIExpc3Q8RT4gYW5kIGEgVHlwZWREYXRhLCB3aGljaCB3ZSBkb24ndCBoYXZlIGEgdHlwZQogIC8vLyBmb3IgaGVyZS4gRm9yIGV4YW1wbGUsIGZvciBhIGBVaW50OEJ1ZmZlcmAsIHRoaXMgaXMgYSBgVWludDhMaXN0YC4KICBMaXN0PEU+IF9idWZmZXI7CgogIC8vLyBSZXR1cm5zIGEgdmlldyBvZiBbX2J1ZmZlcl0gYXMgYSBbVHlwZWREYXRhXS4KICBUeXBlZERhdGEgZ2V0IF90eXBlZEJ1ZmZlciA9PiBfYnVmZmVyIGFzIFR5cGVkRGF0YTsKCiAgLy8vIFRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYmVpbmcgYnVpbHQuCiAgaW50IF9sZW5ndGg7CgogIF9UeXBlZERhdGFCdWZmZXIoTGlzdDxFPiBidWZmZXIpCiAgICAgIDogdGhpcy5fYnVmZmVyID0gYnVmZmVyLAogICAgICAgIHRoaXMuX2xlbmd0aCA9IGJ1ZmZlci5sZW5ndGg7CgogIGludCBnZXQgbGVuZ3RoID0+IF9sZW5ndGg7CiAgRSBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA+PSBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzKTsKICAgIHJldHVybiBfYnVmZmVyW2luZGV4XTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgRSB2YWx1ZSkgewogICAgaWYgKGluZGV4ID49IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMpOwogICAgX2J1ZmZlcltpbmRleF0gPSB2YWx1ZTsKICB9CgogIHZvaWQgc2V0IGxlbmd0aChpbnQgbmV3TGVuZ3RoKSB7CiAgICBpZiAobmV3TGVuZ3RoIDwgX2xlbmd0aCkgewogICAgICBFIGRlZmF1bHRWYWx1ZSA9IF9kZWZhdWx0VmFsdWU7CiAgICAgIGZvciAoaW50IGkgPSBuZXdMZW5ndGg7IGkgPCBfbGVuZ3RoOyBpKyspIHsKICAgICAgICBfYnVmZmVyW2ldID0gZGVmYXVsdFZhbHVlOwogICAgICB9CiAgICB9IGVsc2UgaWYgKG5ld0xlbmd0aCA+IF9idWZmZXIubGVuZ3RoKSB7CiAgICAgIExpc3Q8RT4gbmV3QnVmZmVyOwogICAgICBpZiAoX2J1ZmZlci5sZW5ndGggPT0gMCkgewogICAgICAgIG5ld0J1ZmZlciA9IF9jcmVhdGVCdWZmZXIobmV3TGVuZ3RoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBuZXdCdWZmZXIgPSBfY3JlYXRlQmlnZ2VyQnVmZmVyKG5ld0xlbmd0aCk7CiAgICAgIH0KICAgICAgbmV3QnVmZmVyLnNldFJhbmdlKDAsIF9sZW5ndGgsIF9idWZmZXIpOwogICAgICBfYnVmZmVyID0gbmV3QnVmZmVyOwogICAgfQogICAgX2xlbmd0aCA9IG5ld0xlbmd0aDsKICB9CgogIHZvaWQgX2FkZChFIHZhbHVlKSB7CiAgICBpZiAoX2xlbmd0aCA9PSBfYnVmZmVyLmxlbmd0aCkgX2dyb3coX2xlbmd0aCk7CiAgICBfYnVmZmVyW19sZW5ndGgrK10gPSB2YWx1ZTsKICB9CgogIC8vIFdlIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGBhZGRgIGJlY2F1c2UgaXQgZ3Jvd3MgdGhlIGxpc3QKICAvLyBieSBzZXR0aW5nIHRoZSBsZW5ndGggaW4gaW5jcmVtZW50cyBvZiBvbmUuIFdlIHdhbnQgdG8gZ3JvdyBieSBkb3VibGluZwogIC8vIGNhcGFjaXR5IGluIG1vc3QgY2FzZXMuCiAgdm9pZCBhZGQoRSB2YWx1ZSkgewogICAgX2FkZCh2YWx1ZSk7CiAgfQoKICAvLy8gQXBwZW5kcyBhbGwgb2JqZWN0cyBvZiBbdmFsdWVzXSB0byB0aGUgZW5kIG9mIHRoaXMgYnVmZmVyLgogIC8vLwogIC8vLyBUaGlzIGFkZHMgdmFsdWVzIGZyb20gW3N0YXJ0XSAoaW5jbHVzaXZlKSB0byBbZW5kXSAoZXhjbHVzaXZlKSBpbgogIC8vLyBbdmFsdWVzXS4gSWYgW2VuZF0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYWRkaW5nIGFsbCBlbGVtZW50cyBvZgogIC8vLyBbdmFsdWVzXSBhZnRlciBbc3RhcnRdLgogIC8vLwogIC8vLyBUaGUgW3N0YXJ0XSB2YWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZS4gVGhlIFt2YWx1ZXNdIGl0ZXJhYmxlIG11c3QgaGF2ZSBhdAogIC8vLyBsZWFzdCBbc3RhcnRdIGVsZW1lbnRzLCBhbmQgaWYgW2VuZF0gaXMgc3BlY2lmaWVkLCBpdCBtdXN0IGJlIGdyZWF0ZXIgdGhhbgogIC8vLyBvciBlcXVhbCB0byBbc3RhcnRdIGFuZCBbdmFsdWVzXSBtdXN0IGhhdmUgYXQgbGVhc3QgW2VuZF0gZWxlbWVudHMuCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gdmFsdWVzLCBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tOb3ROZWdhdGl2ZShzdGFydCwgInN0YXJ0Iik7CiAgICBpZiAoZW5kICE9IG51bGwgJiYgc3RhcnQgPiBlbmQpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoZW5kLCBzdGFydCwgbnVsbCwgImVuZCIpOwogICAgfQoKICAgIF9hZGRBbGwodmFsdWVzLCBzdGFydCwgZW5kKTsKICB9CgogIC8vLyBJbnNlcnRzIGFsbCBvYmplY3RzIG9mIFt2YWx1ZXNdIGF0IHBvc2l0aW9uIFtpbmRleF0gaW4gdGhpcyBsaXN0LgogIC8vLwogIC8vLyBUaGlzIGFkZHMgdmFsdWVzIGZyb20gW3N0YXJ0XSAoaW5jbHVzaXZlKSB0byBbZW5kXSAoZXhjbHVzaXZlKSBpbgogIC8vLyBbdmFsdWVzXS4gSWYgW2VuZF0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYWRkaW5nIGFsbCBlbGVtZW50cyBvZgogIC8vLyBbdmFsdWVzXSBhZnRlciBbc3RhcnRdLgogIC8vLwogIC8vLyBUaGUgW3N0YXJ0XSB2YWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZS4gVGhlIFt2YWx1ZXNdIGl0ZXJhYmxlIG11c3QgaGF2ZSBhdAogIC8vLyBsZWFzdCBbc3RhcnRdIGVsZW1lbnRzLCBhbmQgaWYgW2VuZF0gaXMgc3BlY2lmaWVkLCBpdCBtdXN0IGJlIGdyZWF0ZXIgdGhhbgogIC8vLyBvciBlcXVhbCB0byBbc3RhcnRdIGFuZCBbdmFsdWVzXSBtdXN0IGhhdmUgYXQgbGVhc3QgW2VuZF0gZWxlbWVudHMuCiAgdm9pZCBpbnNlcnRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxFPiB2YWx1ZXMsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkSW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIsIF9sZW5ndGggKyAxKTsKICAgIFJhbmdlRXJyb3IuY2hlY2tOb3ROZWdhdGl2ZShzdGFydCwgInN0YXJ0Iik7CiAgICBpZiAoZW5kICE9IG51bGwpIHsKICAgICAgaWYgKHN0YXJ0ID4gZW5kKSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoZW5kLCBzdGFydCwgbnVsbCwgImVuZCIpOwogICAgICB9CiAgICAgIGlmIChzdGFydCA9PSBlbmQpIHJldHVybjsKICAgIH0KCiAgICAvLyBJZiB3ZSdyZSBhZGRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBhbnl3YXksIHVzZSBbX2FkZEFsbF0uIFRoaXMgbGV0cwogICAgLy8gdXMgYXZvaWQgY29udmVydGluZyBbdmFsdWVzXSBpbnRvIGEgbGlzdCBldmVuIGlmIFtlbmRdIGlzIG51bGwsIHNpbmNlIHdlCiAgICAvLyBjYW4gYWRkIHZhbHVlcyBpdGVyYXRpdmVseSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LiBXZSBjYW4ndCBkbyBzbyBpbiB0aGUKICAgIC8vIGNlbnRlciBiZWNhdXNlIGNvcHlpbmcgdGhlIHRyYWlsaW5nIGVsZW1lbnRzIGV2ZXJ5IHRpbWUgaXMgbm9uLWxpbmVhci4KICAgIGlmIChpbmRleCA9PSBfbGVuZ3RoKSB7CiAgICAgIF9hZGRBbGwodmFsdWVzLCBzdGFydCwgZW5kKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChlbmQgPT0gbnVsbCAmJiB2YWx1ZXMgaXMgTGlzdCkgewogICAgICBlbmQgPSB2YWx1ZXMubGVuZ3RoOwogICAgfQogICAgaWYgKGVuZCAhPSBudWxsKSB7CiAgICAgIF9pbnNlcnRLbm93bkxlbmd0aChpbmRleCwgdmFsdWVzLCBzdGFydCwgZW5kKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIEFkZCBlbGVtZW50cyBhdCBlbmQsIGdyb3dpbmcgYXMgYXBwcm9wcmlhdGUsIHRoZW4gcHV0IHRoZW0gYmFjayBhdAogICAgLy8gcG9zaXRpb24gW2luZGV4XSB1c2luZyBmbGlwLWJ5LWRvdWJsZS1yZXZlcnNlLgogICAgdmFyIHdyaXRlSW5kZXggPSBfbGVuZ3RoOwogICAgdmFyIHNraXBDb3VudCA9IHN0YXJ0OwogICAgZm9yICh2YXIgdmFsdWUgaW4gdmFsdWVzKSB7CiAgICAgIGlmIChza2lwQ291bnQgPiAwKSB7CiAgICAgICAgc2tpcENvdW50LS07CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKHdyaXRlSW5kZXggPT0gX2J1ZmZlci5sZW5ndGgpIHsKICAgICAgICBfZ3Jvdyh3cml0ZUluZGV4KTsKICAgICAgfQogICAgICBfYnVmZmVyW3dyaXRlSW5kZXgrK10gPSB2YWx1ZTsKICAgIH0KCiAgICBpZiAoc2tpcENvdW50ID4gMCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiVG9vIGZldyBlbGVtZW50cyIpOwogICAgfQogICAgaWYgKGVuZCAhPSBudWxsICYmIHdyaXRlSW5kZXggPCBlbmQpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoZW5kLCBzdGFydCwgd3JpdGVJbmRleCwgImVuZCIpOwogICAgfQoKICAgIC8vIFN3YXAgW2luZGV4Li5fbGVuZ3RoKSBhbmQgW19sZW5ndGguLndyaXRlSW5kZXgpIGJ5IGRvdWJsZS1yZXZlcnNpbmcuCiAgICBfcmV2ZXJzZShfYnVmZmVyLCBpbmRleCwgX2xlbmd0aCk7CiAgICBfcmV2ZXJzZShfYnVmZmVyLCBfbGVuZ3RoLCB3cml0ZUluZGV4KTsKICAgIF9yZXZlcnNlKF9idWZmZXIsIGluZGV4LCB3cml0ZUluZGV4KTsKICAgIF9sZW5ndGggPSB3cml0ZUluZGV4OwogICAgcmV0dXJuOwogIH0KCiAgLy8gUmV2ZXJzZXMgdGhlIHJhbmdlIFtzdGFydC4uZW5kKSBvZiBidWZmZXIuCiAgc3RhdGljIHZvaWQgX3JldmVyc2UoTGlzdCBidWZmZXIsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgZW5kLS07IC8vIFBvaW50IHRvIGxhc3QgZWxlbWVudCwgbm90IGFmdGVyIGxhc3QgZWxlbWVudC4KICAgIHdoaWxlIChzdGFydCA8IGVuZCkgewogICAgICB2YXIgZmlyc3QgPSBidWZmZXJbc3RhcnRdOwogICAgICB2YXIgbGFzdCA9IGJ1ZmZlcltlbmRdOwogICAgICBidWZmZXJbZW5kXSA9IGZpcnN0OwogICAgICBidWZmZXJbc3RhcnRdID0gbGFzdDsKICAgICAgc3RhcnQrKzsKICAgICAgZW5kLS07CiAgICB9CiAgfQoKICAvLy8gRG9lcyB0aGUgc2FtZSB0aGluZyBhcyBbYWRkQWxsXS4KICAvLy8KICAvLy8gVGhpcyBhbGxvd3MgW2FkZEFsbF0gYW5kIFtpbnNlcnRBbGxdIHRvIHNoYXJlIGltcGxlbWVudGF0aW9uIHdpdGhvdXQgYQogIC8vLyBzdWJjbGFzcyB1bmV4cGVjdGVkbHkgb3ZlcnJpZGluZyBib3RoIHdoZW4gaXQgaW50ZW5kZWQgdG8gb25seSBvdmVycmlkZQogIC8vLyBbYWRkQWxsXS4KICB2b2lkIF9hZGRBbGwoSXRlcmFibGU8RT4gdmFsdWVzLCBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pIHsKICAgIGlmICh2YWx1ZXMgaXMgTGlzdCkgZW5kID8/PSB2YWx1ZXMubGVuZ3RoOwoKICAgIC8vIElmIHdlIGtub3cgdGhlIGxlbmd0aCBvZiB0aGUgc2VnbWVudCB0byBhZGQsIGRvIHNvIHdpdGggW2FkZFJhbmdlXS4gVGhpcwogICAgLy8gd2F5IHdlIGtub3cgaG93IG11Y2ggdG8gZ3JvdyB0aGUgYnVmZmVyIGluIGFkdmFuY2UsIGFuZCBpdCBtYXkgYmUgZXZlbgogICAgLy8gbW9yZSBlZmZpY2llbnQgZm9yIHR5cGVkIGRhdGEgaW5wdXQuCiAgICBpZiAoZW5kICE9IG51bGwpIHsKICAgICAgX2luc2VydEtub3duTGVuZ3RoKF9sZW5ndGgsIHZhbHVlcywgc3RhcnQsIGVuZCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBPdGhlcndpc2UsIGp1c3QgYWRkIHZhbHVlcyBvbmUgYXQgYSB0aW1lLgogICAgdmFyIGkgPSAwOwogICAgZm9yICh2YXIgdmFsdWUgaW4gdmFsdWVzKSB7CiAgICAgIGlmIChpID49IHN0YXJ0KSBhZGQodmFsdWUpOwogICAgICBpKys7CiAgICB9CiAgICBpZiAoaSA8IHN0YXJ0KSB0aHJvdyBuZXcgU3RhdGVFcnJvcigiVG9vIGZldyBlbGVtZW50cyIpOwogIH0KCiAgLy8vIExpa2UgW2luc2VydEFsbF0sIGJ1dCB3aXRoIGEgZ3VhcmFudGVlZCBub24tYG51bGxgIFtzdGFydF0gYW5kIFtlbmRdLgogIHZvaWQgX2luc2VydEtub3duTGVuZ3RoKGludCBpbmRleCwgSXRlcmFibGU8RT4gdmFsdWVzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIGlmICh2YWx1ZXMgaXMgTGlzdCkgewogICAgICBlbmQgPz89IHZhbHVlcy5sZW5ndGg7CiAgICAgIGlmIChzdGFydCA+IHZhbHVlcy5sZW5ndGggfHwgZW5kID4gdmFsdWVzLmxlbmd0aCkgewogICAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJUb28gZmV3IGVsZW1lbnRzIik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChlbmQgIT0gbnVsbCk7CiAgICB9CgogICAgdmFyIHZhbHVlc0xlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgdmFyIG5ld0xlbmd0aCA9IF9sZW5ndGggKyB2YWx1ZXNMZW5ndGg7CiAgICBfZW5zdXJlQ2FwYWNpdHkobmV3TGVuZ3RoKTsKCiAgICBfYnVmZmVyLnNldFJhbmdlKAogICAgICAgIGluZGV4ICsgdmFsdWVzTGVuZ3RoLCBfbGVuZ3RoICsgdmFsdWVzTGVuZ3RoLCBfYnVmZmVyLCBpbmRleCk7CiAgICBfYnVmZmVyLnNldFJhbmdlKGluZGV4LCBpbmRleCArIHZhbHVlc0xlbmd0aCwgdmFsdWVzLCBzdGFydCk7CiAgICBfbGVuZ3RoID0gbmV3TGVuZ3RoOwogIH0KCiAgdm9pZCBpbnNlcnQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBfbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGluZGV4LCAwLCBfbGVuZ3RoKTsKICAgIH0KICAgIGlmIChfbGVuZ3RoIDwgX2J1ZmZlci5sZW5ndGgpIHsKICAgICAgX2J1ZmZlci5zZXRSYW5nZShpbmRleCArIDEsIF9sZW5ndGggKyAxLCBfYnVmZmVyLCBpbmRleCk7CiAgICAgIF9idWZmZXJbaW5kZXhdID0gZWxlbWVudDsKICAgICAgX2xlbmd0aCsrOwogICAgICByZXR1cm47CiAgICB9CiAgICBMaXN0PEU+IG5ld0J1ZmZlciA9IF9jcmVhdGVCaWdnZXJCdWZmZXIobnVsbCk7CiAgICBuZXdCdWZmZXIuc2V0UmFuZ2UoMCwgaW5kZXgsIF9idWZmZXIpOwogICAgbmV3QnVmZmVyLnNldFJhbmdlKGluZGV4ICsgMSwgX2xlbmd0aCArIDEsIF9idWZmZXIsIGluZGV4KTsKICAgIG5ld0J1ZmZlcltpbmRleF0gPSBlbGVtZW50OwogICAgX2xlbmd0aCsrOwogICAgX2J1ZmZlciA9IG5ld0J1ZmZlcjsKICB9CgogIC8vLyBFbnN1cmVzIHRoYXQgW19idWZmZXJdIGlzIGF0IGxlYXN0IFtyZXF1aXJlZENhcGFjaXR5XSBsb25nLAogIC8vLwogIC8vLyBHcm93cyB0aGUgYnVmZmVyIGlmIG5lY2Vzc2FyeSwgcHJlc2VydmluZyBleGlzdGluZyBkYXRhLgogIHZvaWQgX2Vuc3VyZUNhcGFjaXR5KGludCByZXF1aXJlZENhcGFjaXR5KSB7CiAgICBpZiAocmVxdWlyZWRDYXBhY2l0eSA8PSBfYnVmZmVyLmxlbmd0aCkgcmV0dXJuOwogICAgdmFyIG5ld0J1ZmZlciA9IF9jcmVhdGVCaWdnZXJCdWZmZXIocmVxdWlyZWRDYXBhY2l0eSk7CiAgICBuZXdCdWZmZXIuc2V0UmFuZ2UoMCwgX2xlbmd0aCwgX2J1ZmZlcik7CiAgICBfYnVmZmVyID0gbmV3QnVmZmVyOwogIH0KCiAgLy8vIENyZWF0ZSBhIGJpZ2dlciBidWZmZXIuCiAgLy8vCiAgLy8vIFRoaXMgbWV0aG9kIGRldGVybWluZXMgaG93IG11Y2ggYmlnZ2VyIGEgYmlnZ2VyIGJ1ZmZlciBzaG91bGQKICAvLy8gYmUuIElmIFtyZXF1aXJlZENhcGFjaXR5XSBpcyBub3QgbnVsbCwgaXQgd2lsbCBiZSBhdCBsZWFzdCB0aGF0CiAgLy8vIHNpemUuIEl0IHdpbGwgYWx3YXlzIGhhdmUgYXQgbGVhc3QgaGF2ZSBkb3VibGUgdGhlIGNhcGFjaXR5IG9mCiAgLy8vIHRoZSBjdXJyZW50IGJ1ZmZlci4KICBMaXN0PEU+IF9jcmVhdGVCaWdnZXJCdWZmZXIoaW50IHJlcXVpcmVkQ2FwYWNpdHkpIHsKICAgIGludCBuZXdMZW5ndGggPSBfYnVmZmVyLmxlbmd0aCAqIDI7CiAgICBpZiAocmVxdWlyZWRDYXBhY2l0eSAhPSBudWxsICYmIG5ld0xlbmd0aCA8IHJlcXVpcmVkQ2FwYWNpdHkpIHsKICAgICAgbmV3TGVuZ3RoID0gcmVxdWlyZWRDYXBhY2l0eTsKICAgIH0gZWxzZSBpZiAobmV3TGVuZ3RoIDwgSU5JVElBTF9MRU5HVEgpIHsKICAgICAgbmV3TGVuZ3RoID0gSU5JVElBTF9MRU5HVEg7CiAgICB9CiAgICByZXR1cm4gX2NyZWF0ZUJ1ZmZlcihuZXdMZW5ndGgpOwogIH0KCiAgLy8vIEdyb3dzIHRoZSBidWZmZXIuCiAgLy8vCiAgLy8vIFRoaXMgY29waWVzIHRoZSBmaXJzdCBbbGVuZ3RoXSBlbGVtZW50cyBpbnRvIHRoZSBuZXcgYnVmZmVyLgogIHZvaWQgX2dyb3coaW50IGxlbmd0aCkgewogICAgX2J1ZmZlciA9IF9jcmVhdGVCaWdnZXJCdWZmZXIobnVsbCkuLnNldFJhbmdlKDAsIGxlbmd0aCwgX2J1ZmZlcik7CiAgfQoKICB2b2lkIHNldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGU8RT4gc291cmNlLCBbaW50IHNraXBDb3VudCA9IDBdKSB7CiAgICBpZiAoZW5kID4gX2xlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoZW5kLCAwLCBfbGVuZ3RoKTsKICAgIF9zZXRSYW5nZShzdGFydCwgZW5kLCBzb3VyY2UsIHNraXBDb3VudCk7CiAgfQoKICAvLy8gTGlrZSBbc2V0UmFuZ2VdLCBidXQgd2l0aCBubyBib3VuZHMgY2hlY2tpbmcuCiAgdm9pZCBfc2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZTxFPiBzb3VyY2UsIGludCBza2lwQ291bnQpIHsKICAgIGlmIChzb3VyY2UgaXMgX1R5cGVkRGF0YUJ1ZmZlcjxFPikgewogICAgICBfYnVmZmVyLnNldFJhbmdlKHN0YXJ0LCBlbmQsIHNvdXJjZS5fYnVmZmVyLCBza2lwQ291bnQpOwogICAgfSBlbHNlIHsKICAgICAgX2J1ZmZlci5zZXRSYW5nZShzdGFydCwgZW5kLCBzb3VyY2UsIHNraXBDb3VudCk7CiAgICB9CiAgfQoKICAvLyBUeXBlZERhdGEuCgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzID0+IF90eXBlZEJ1ZmZlci5lbGVtZW50U2l6ZUluQnl0ZXM7CgogIGludCBnZXQgbGVuZ3RoSW5CeXRlcyA9PiBfbGVuZ3RoICogX3R5cGVkQnVmZmVyLmVsZW1lbnRTaXplSW5CeXRlczsKCiAgaW50IGdldCBvZmZzZXRJbkJ5dGVzID0+IF90eXBlZEJ1ZmZlci5vZmZzZXRJbkJ5dGVzOwoKICAvLy8gUmV0dXJucyB0aGUgdW5kZXJseWluZyBbQnl0ZUJ1ZmZlcl0uCiAgLy8vCiAgLy8vIFRoZSByZXR1cm5lZCBidWZmZXIgbWF5IGJlIHJlcGxhY2VkIGJ5IG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIFtsZW5ndGhdCiAgLy8vIG9mIHRoaXMgbGlzdC4KICAvLy8KICAvLy8gVGhlIGJ1ZmZlciBtYXkgYmUgbGFyZ2VyIHRoYW4gW2xlbmd0aEluQnl0ZXNdIGJ5dGVzLCBidXQgbmV2ZXIgc21hbGxlci4KICBCeXRlQnVmZmVyIGdldCBidWZmZXIgPT4gX3R5cGVkQnVmZmVyLmJ1ZmZlcjsKCiAgLy8gU3BlY2lhbGl6YXRpb24gZm9yIHRoZSBzcGVjaWZpYyB0eXBlLgoKICAvLyBSZXR1cm4gemVybyBmb3IgaW50ZWdlcnMsIDAuMCBmb3IgZmxvYXRzLCBldGMuCiAgLy8gVXNlZCB0byBmaWxsIGJ1ZmZlciB3aGVuIGNoYW5naW5nIGxlbmd0aC4KICBFIGdldCBfZGVmYXVsdFZhbHVlOwoKICAvLyBDcmVhdGUgYSBuZXcgdHlwZWQgbGlzdCB0byB1c2UgYXMgYnVmZmVyLgogIExpc3Q8RT4gX2NyZWF0ZUJ1ZmZlcihpbnQgc2l6ZSk7Cn0KCmFic3RyYWN0IGNsYXNzIF9JbnRCdWZmZXIgZXh0ZW5kcyBfVHlwZWREYXRhQnVmZmVyPGludD4gewogIF9JbnRCdWZmZXIoTGlzdDxpbnQ+IGJ1ZmZlcikgOiBzdXBlcihidWZmZXIpOwoKICBpbnQgZ2V0IF9kZWZhdWx0VmFsdWUgPT4gMDsKfQoKYWJzdHJhY3QgY2xhc3MgX0Zsb2F0QnVmZmVyIGV4dGVuZHMgX1R5cGVkRGF0YUJ1ZmZlcjxkb3VibGU+IHsKICBfRmxvYXRCdWZmZXIoTGlzdDxkb3VibGU+IGJ1ZmZlcikgOiBzdXBlcihidWZmZXIpOwoKICBkb3VibGUgZ2V0IF9kZWZhdWx0VmFsdWUgPT4gMC4wOwp9CgpjbGFzcyBVaW50OEJ1ZmZlciBleHRlbmRzIF9JbnRCdWZmZXIgewogIFVpbnQ4QnVmZmVyKFtpbnQgaW5pdGlhbExlbmd0aCA9IDBdKSA6IHN1cGVyKG5ldyBVaW50OExpc3QoaW5pdGlhbExlbmd0aCkpOwogIFVpbnQ4TGlzdCBfY3JlYXRlQnVmZmVyKGludCBzaXplKSA9PiBuZXcgVWludDhMaXN0KHNpemUpOwp9CgpjbGFzcyBJbnQ4QnVmZmVyIGV4dGVuZHMgX0ludEJ1ZmZlciB7CiAgSW50OEJ1ZmZlcihbaW50IGluaXRpYWxMZW5ndGggPSAwXSkgOiBzdXBlcihuZXcgSW50OExpc3QoaW5pdGlhbExlbmd0aCkpOwogIEludDhMaXN0IF9jcmVhdGVCdWZmZXIoaW50IHNpemUpID0+IG5ldyBJbnQ4TGlzdChzaXplKTsKfQoKY2xhc3MgVWludDhDbGFtcGVkQnVmZmVyIGV4dGVuZHMgX0ludEJ1ZmZlciB7CiAgVWludDhDbGFtcGVkQnVmZmVyKFtpbnQgaW5pdGlhbExlbmd0aCA9IDBdKQogICAgICA6IHN1cGVyKG5ldyBVaW50OENsYW1wZWRMaXN0KGluaXRpYWxMZW5ndGgpKTsKICBVaW50OENsYW1wZWRMaXN0IF9jcmVhdGVCdWZmZXIoaW50IHNpemUpID0+IG5ldyBVaW50OENsYW1wZWRMaXN0KHNpemUpOwp9CgpjbGFzcyBVaW50MTZCdWZmZXIgZXh0ZW5kcyBfSW50QnVmZmVyIHsKICBVaW50MTZCdWZmZXIoW2ludCBpbml0aWFsTGVuZ3RoID0gMF0pIDogc3VwZXIobmV3IFVpbnQxNkxpc3QoaW5pdGlhbExlbmd0aCkpOwogIFVpbnQxNkxpc3QgX2NyZWF0ZUJ1ZmZlcihpbnQgc2l6ZSkgPT4gbmV3IFVpbnQxNkxpc3Qoc2l6ZSk7Cn0KCmNsYXNzIEludDE2QnVmZmVyIGV4dGVuZHMgX0ludEJ1ZmZlciB7CiAgSW50MTZCdWZmZXIoW2ludCBpbml0aWFsTGVuZ3RoID0gMF0pIDogc3VwZXIobmV3IEludDE2TGlzdChpbml0aWFsTGVuZ3RoKSk7CiAgSW50MTZMaXN0IF9jcmVhdGVCdWZmZXIoaW50IHNpemUpID0+IG5ldyBJbnQxNkxpc3Qoc2l6ZSk7Cn0KCmNsYXNzIFVpbnQzMkJ1ZmZlciBleHRlbmRzIF9JbnRCdWZmZXIgewogIFVpbnQzMkJ1ZmZlcihbaW50IGluaXRpYWxMZW5ndGggPSAwXSkgOiBzdXBlcihuZXcgVWludDMyTGlzdChpbml0aWFsTGVuZ3RoKSk7CiAgVWludDMyTGlzdCBfY3JlYXRlQnVmZmVyKGludCBzaXplKSA9PiBuZXcgVWludDMyTGlzdChzaXplKTsKfQoKY2xhc3MgSW50MzJCdWZmZXIgZXh0ZW5kcyBfSW50QnVmZmVyIHsKICBJbnQzMkJ1ZmZlcihbaW50IGluaXRpYWxMZW5ndGggPSAwXSkgOiBzdXBlcihuZXcgSW50MzJMaXN0KGluaXRpYWxMZW5ndGgpKTsKICBJbnQzMkxpc3QgX2NyZWF0ZUJ1ZmZlcihpbnQgc2l6ZSkgPT4gbmV3IEludDMyTGlzdChzaXplKTsKfQoKY2xhc3MgVWludDY0QnVmZmVyIGV4dGVuZHMgX0ludEJ1ZmZlciB7CiAgVWludDY0QnVmZmVyKFtpbnQgaW5pdGlhbExlbmd0aCA9IDBdKSA6IHN1cGVyKG5ldyBVaW50NjRMaXN0KGluaXRpYWxMZW5ndGgpKTsKICBVaW50NjRMaXN0IF9jcmVhdGVCdWZmZXIoaW50IHNpemUpID0+IG5ldyBVaW50NjRMaXN0KHNpemUpOwp9CgpjbGFzcyBJbnQ2NEJ1ZmZlciBleHRlbmRzIF9JbnRCdWZmZXIgewogIEludDY0QnVmZmVyKFtpbnQgaW5pdGlhbExlbmd0aCA9IDBdKSA6IHN1cGVyKG5ldyBJbnQ2NExpc3QoaW5pdGlhbExlbmd0aCkpOwogIEludDY0TGlzdCBfY3JlYXRlQnVmZmVyKGludCBzaXplKSA9PiBuZXcgSW50NjRMaXN0KHNpemUpOwp9CgpjbGFzcyBGbG9hdDMyQnVmZmVyIGV4dGVuZHMgX0Zsb2F0QnVmZmVyIHsKICBGbG9hdDMyQnVmZmVyKFtpbnQgaW5pdGlhbExlbmd0aCA9IDBdKQogICAgICA6IHN1cGVyKG5ldyBGbG9hdDMyTGlzdChpbml0aWFsTGVuZ3RoKSk7CiAgRmxvYXQzMkxpc3QgX2NyZWF0ZUJ1ZmZlcihpbnQgc2l6ZSkgPT4gbmV3IEZsb2F0MzJMaXN0KHNpemUpOwp9CgpjbGFzcyBGbG9hdDY0QnVmZmVyIGV4dGVuZHMgX0Zsb2F0QnVmZmVyIHsKICBGbG9hdDY0QnVmZmVyKFtpbnQgaW5pdGlhbExlbmd0aCA9IDBdKQogICAgICA6IHN1cGVyKG5ldyBGbG9hdDY0TGlzdChpbml0aWFsTGVuZ3RoKSk7CiAgRmxvYXQ2NExpc3QgX2NyZWF0ZUJ1ZmZlcihpbnQgc2l6ZSkgPT4gbmV3IEZsb2F0NjRMaXN0KHNpemUpOwp9CgpjbGFzcyBJbnQzMng0QnVmZmVyIGV4dGVuZHMgX1R5cGVkRGF0YUJ1ZmZlcjxJbnQzMng0PiB7CiAgc3RhdGljIEludDMyeDQgX3plcm8gPSBuZXcgSW50MzJ4NCgwLCAwLCAwLCAwKTsKICBJbnQzMng0QnVmZmVyKFtpbnQgaW5pdGlhbExlbmd0aCA9IDBdKQogICAgICA6IHN1cGVyKG5ldyBJbnQzMng0TGlzdChpbml0aWFsTGVuZ3RoKSk7CiAgSW50MzJ4NCBnZXQgX2RlZmF1bHRWYWx1ZSA9PiBfemVybzsKICBJbnQzMng0TGlzdCBfY3JlYXRlQnVmZmVyKGludCBzaXplKSA9PiBuZXcgSW50MzJ4NExpc3Qoc2l6ZSk7Cn0KCmNsYXNzIEZsb2F0MzJ4NEJ1ZmZlciBleHRlbmRzIF9UeXBlZERhdGFCdWZmZXI8RmxvYXQzMng0PiB7CiAgRmxvYXQzMng0QnVmZmVyKFtpbnQgaW5pdGlhbExlbmd0aCA9IDBdKQogICAgICA6IHN1cGVyKG5ldyBGbG9hdDMyeDRMaXN0KGluaXRpYWxMZW5ndGgpKTsKICBGbG9hdDMyeDQgZ2V0IF9kZWZhdWx0VmFsdWUgPT4gbmV3IEZsb2F0MzJ4NC56ZXJvKCk7CiAgRmxvYXQzMng0TGlzdCBfY3JlYXRlQnVmZmVyKGludCBzaXplKSA9PiBuZXcgRmxvYXQzMng0TGlzdChzaXplKTsKfQqBjwBOTjwBHwRQTiEETkwrIgEoGgE5JwEiBlBJEwE0NgEqDwEjHyYBHR1CGwQBKkIcBAEjHyYyIwgtGSEuDzQILxsGGQQBFzMgBAFPTR0WEQQBQQZISx4GUVFKPjEmOwYBIQQBSAZISx4GUVFKTEMxFxk9CCAGAU9QUE4cIw4GASkbBhc1DgYBSjYeGyAbFRIIKhsIJQYBGTAGK0EGAUwnLCoaDAQBMDo9GiEeGxwPDQYEAScGTU4QPy8BUE4sFzcOBgExDyAiCwY9BAFMTxodOjIIDRsGASQsIAEWR0IZBAEmKDUGJEAgEQ4GMytAIA8ZBAFCBj8vNDstGQQBHgZERkUaNihEJC0iBiUEARgGQxtHBAFPRC4EATRKKT8NNwYEARABQQFGATcBKwZRFAZOMAErATQvFwEvIwIBOjABHgIBPzUBIwIBJ048AgEmTDoCAS4uNEoCAShQPgIBJ048AgEoUD4CASdOPAIBKFA+AgEnTjwCASspL0ACASspL0ACATgyKS8mQAIBPCsxN0QCASVwYWNrYWdlOnR5cGVkX2RhdGEvdHlwZWRfYnVmZmVycy5kYXJ0M3Nka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jb252ZXJ0L2xpYi9zcmMvdXRpbHMuZGFydIZYLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgY29udmVydC51dGlsczsKCmltcG9ydCAncGFja2FnZTpjaGFyY29kZS9hc2NpaS5kYXJ0JzsKCi8vLyBSZXR1cm5zIHRoZSBkaWdpdCAoMCB0aHJvdWdoIDE1KSBjb3JyZXNwb25kaW5nIHRvIHRoZSBoZXhhZGVjaW1hbCBjb2RlIHVuaXQKLy8vIGF0IGluZGV4IFtpXSBpbiBbY29kZVVuaXRzXS4KLy8vCi8vLyBJZiB0aGUgZ2l2ZW4gY29kZSB1bml0IGlzbid0IHZhbGlkIGhleGFkZWNpbWFsLCB0aHJvd3MgYSBbRm9ybWF0RXhjZXB0aW9uXS4KaW50IGRpZ2l0Rm9yQ29kZVVuaXQoTGlzdDxpbnQ+IGNvZGVVbml0cywgaW50IGluZGV4KSB7CiAgLy8gSWYgdGhlIGNvZGUgdW5pdCBpcyBhIG51bWVyYWwsIGdldCBpdHMgdmFsdWUuIFhPUiB3b3JrcyBiZWNhdXNlIDAgaW4gQVNDSUkKICAvLyBpcyBgMGIxMTAwMDBgIGFuZCB0aGUgb3RoZXIgbnVtZXJhbHMgY29tZSBhZnRlciBpdCBpbiBhc2NlbmRpbmcgb3JkZXIgYW5kCiAgLy8gdGFrZSB1cCBhdCBtb3N0IGZvdXIgYml0cy4KICAvLwogIC8vIFdlIGNoZWNrIGZvciBkaWdpdHMgZmlyc3QgYmVjYXVzZSBpdCBlbnN1cmVzIHRoZXJlJ3Mgb25seSBhIHNpbmdsZSBicmFuY2gKICAvLyBmb3IgMTAgb3V0IG9mIDE2IG9mIHRoZSBleHBlY3RlZCBjYXNlcy4gV2UgZG9uJ3QgY291bnQgdGhlIGBkaWdpdCA+PSAwYAogIC8vIGNoZWNrIGJlY2F1c2UgYnJhbmNoIHByZWRpY3Rpb24gd2lsbCBhbHdheXMgd29yayBvbiBpdCBmb3IgdmFsaWQgZGF0YS4KICB2YXIgY29kZVVuaXQgPSBjb2RlVW5pdHNbaW5kZXhdOwogIHZhciBkaWdpdCA9ICQwIF4gY29kZVVuaXQ7CiAgaWYgKGRpZ2l0IDw9IDkpIHsKICAgIGlmIChkaWdpdCA+PSAwKSByZXR1cm4gZGlnaXQ7CiAgfSBlbHNlIHsKICAgIC8vIElmIHRoZSBjb2RlIHVuaXQgaXMgYW4gdXBwZXJjYXNlIGxldHRlciwgY29udmVydCBpdCB0byBsb3dlcmNhc2UuIFRoaXMKICAgIC8vIHdvcmtzIGJlY2F1c2UgdXBwZXJjYXNlIGxldHRlcnMgaW4gQVNDSUkgYXJlIGV4YWN0bHkgYDBiMTAwMDAwID0gMHgyMGAKICAgIC8vIGxlc3MgdGhhbiBsb3dlcmNhc2UgbGV0dGVycywgc28gaWYgd2UgZW5zdXJlIHRoYXQgdGhhdCBiaXQgaXMgMSB3ZSBlbnN1cmUKICAgIC8vIHRoYXQgdGhlIGxldHRlciBpcyBsb3dlcmNhc2UuCiAgICB2YXIgbGV0dGVyID0gMHgyMCB8IGNvZGVVbml0OwogICAgaWYgKCRhIDw9IGxldHRlciAmJiBsZXR0ZXIgPD0gJGYpIHJldHVybiBsZXR0ZXIgLSAkYSArIDEwOwogIH0KCiAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigKICAgICAgIkludmFsaWQgaGV4YWRlY2ltYWwgY29kZSB1bml0ICIKICAgICAgIlUrJHtjb2RlVW5pdC50b1JhZGl4U3RyaW5nKDE2KS5wYWRMZWZ0KDQsICcwJyl9LiIsCiAgICAgIGNvZGVVbml0cywKICAgICAgaW5kZXgpOwp9CikATk48ARcBJgFQIQRQN1BPIAVPTUwjHRQiC05OUSUiPwQBHSc6EQ4CAR5wYWNrYWdlOmNvbnZlcnQvc3JjL3V0aWxzLmRhcnQsb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2FzeW5jL2FzeW5jLmRhcnSRXy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovKioKICogU3VwcG9ydCBmb3IgYXN5bmNocm9ub3VzIHByb2dyYW1taW5nLAogKiB3aXRoIGNsYXNzZXMgc3VjaCBhcyBGdXR1cmUgYW5kIFN0cmVhbS4KICoKICogVW5kZXJzdGFuZGluZyBbRnV0dXJlXXMgYW5kIFtTdHJlYW1dcyBpcyBhIHByZXJlcXVpc2l0ZSBmb3IKICogd3JpdGluZyBqdXN0IGFib3V0IGFueSBEYXJ0IHByb2dyYW0uCiAqCiAqIFRvIHVzZSB0aGlzIGxpYnJhcnkgaW4geW91ciBjb2RlOgogKgogKiAgICAgaW1wb3J0ICdkYXJ0OmFzeW5jJzsKICoKICogIyMgRnV0dXJlCiAqCiAqIEEgRnV0dXJlIG9iamVjdCByZXByZXNlbnRzIGEgY29tcHV0YXRpb24gd2hvc2UgcmV0dXJuIHZhbHVlCiAqIG1pZ2h0IG5vdCB5ZXQgYmUgYXZhaWxhYmxlLgogKiBUaGUgRnV0dXJlIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBjb21wdXRhdGlvbgogKiB3aGVuIGl0IGNvbXBsZXRlcyBhdCBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZS4KICogRnV0dXJlcyBhcmUgb2Z0ZW4gdXNlZCBmb3IgcG90ZW50aWFsbHkgbGVuZ3RoeSBjb21wdXRhdGlvbnMKICogc3VjaCBhcyBJL08gYW5kIGludGVyYWN0aW9uIHdpdGggdXNlcnMuCiAqCiAqIE1hbnkgbWV0aG9kcyBpbiB0aGUgRGFydCBsaWJyYXJpZXMgcmV0dXJuIEZ1dHVyZXMgd2hlbgogKiBwZXJmb3JtaW5nIHRhc2tzLiBGb3IgZXhhbXBsZSwgd2hlbiBiaW5kaW5nIGFuIEh0dHBTZXJ2ZXIKICogdG8gYSBob3N0IGFuZCBwb3J0LCB0aGUgYGJpbmQoKWAgbWV0aG9kIHJldHVybnMgYSBGdXR1cmUuCiAqCiAqICAgICAgSHR0cFNlcnZlci5iaW5kKCcxMjcuMC4wLjEnLCA0NDQ0KQogKiAgICAgICAgICAudGhlbigoc2VydmVyKSA9PiBwcmludCgnJHtzZXJ2ZXIuaXNCcm9hZGNhc3R9JykpCiAqICAgICAgICAgIC5jYXRjaEVycm9yKHByaW50KTsKICoKICogW0Z1dHVyZS50aGVuXSByZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHJ1bnMKICogd2hlbiB0aGUgRnV0dXJlJ3Mgb3BlcmF0aW9uLCBpbiB0aGlzIGNhc2UgdGhlIGBiaW5kKClgIG1ldGhvZCwKICogY29tcGxldGVzIHN1Y2Nlc3NmdWxseS4KICogVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBvcGVyYXRpb24KICogaXMgcGFzc2VkIGludG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLgogKiBJbiB0aGlzIGV4YW1wbGUsIHRoZSBgYmluZCgpYCBtZXRob2QgcmV0dXJucyB0aGUgSHR0cFNlcnZlcgogKiBvYmplY3QuIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBwcmludHMgb25lIG9mIGl0cyBwcm9wZXJ0aWVzLgogKiBbRnV0dXJlLmNhdGNoRXJyb3JdIHJlZ2lzdGVycyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQKICogcnVucyBpZiBhbiBlcnJvciBvY2N1cnMgd2l0aGluIHRoZSBGdXR1cmUuCiAqCiAqICMjIFN0cmVhbQogKgogKiBBIFN0cmVhbSBwcm92aWRlcyBhbiBhc3luY2hyb25vdXMgc2VxdWVuY2Ugb2YgZGF0YS4KICogRXhhbXBsZXMgb2YgZGF0YSBzZXF1ZW5jZXMgaW5jbHVkZSBpbmRpdmlkdWFsIGV2ZW50cywgbGlrZSBtb3VzZSBjbGlja3MsCiAqIG9yIHNlcXVlbnRpYWwgY2h1bmtzIG9mIGxhcmdlciBkYXRhLCBsaWtlIG11bHRpcGxlIGJ5dGUgbGlzdHMgd2l0aCB0aGUKICogY29udGVudHMgb2YgYSBmaWxlCiAqIHN1Y2ggYXMgbW91c2UgY2xpY2tzLCBhbmQgYSBzdHJlYW0gb2YgYnl0ZSBsaXN0cyByZWFkIGZyb20gYSBmaWxlLgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgb3BlbnMgYSBmaWxlIGZvciByZWFkaW5nLgogKiBbU3RyZWFtLmxpc3Rlbl0gcmVnaXN0ZXJzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBydW5zCiAqIGVhY2ggdGltZSBtb3JlIGRhdGEgaXMgYXZhaWxhYmxlLgogKgogKiAgICAgU3RyZWFtPExpc3Q8aW50Pj4gc3RyZWFtID0gbmV3IEZpbGUoJ3F1b3Rlcy50eHQnKS5vcGVuUmVhZCgpOwogKiAgICAgc3RyZWFtLnRyYW5zZm9ybSh1dGY4LmRlY29kZXIpLmxpc3RlbihwcmludCk7CiAqCiAqIFRoZSBzdHJlYW0gZW1pdHMgYSBzZXF1ZW5jZSBvZiBhIGxpc3Qgb2YgYnl0ZXMuCiAqIFRoZSBwcm9ncmFtIG11c3QgaW50ZXJwcmV0IHRoZSBieXRlcyBvciBoYW5kbGUgdGhlIHJhdyBieXRlIGRhdGEuCiAqIEhlcmUsIHRoZSBjb2RlIHVzZXMgYSBVVEYtOCBkZWNvZGVyIChwcm92aWRlZCBpbiB0aGUgYGRhcnQ6Y29udmVydGAgbGlicmFyeSkKICogdG8gY29udmVydCB0aGUgc2VxdWVuY2Ugb2YgYnl0ZXMgaW50byBhIHNlcXVlbmNlCiAqIG9mIERhcnQgc3RyaW5ncy4KICoKICogQW5vdGhlciBjb21tb24gdXNlIG9mIHN0cmVhbXMgaXMgZm9yIHVzZXItZ2VuZXJhdGVkIGV2ZW50cwogKiBpbiBhIHdlYiBhcHA6IFRoZSBmb2xsb3dpbmcgY29kZSBsaXN0ZW5zIGZvciBtb3VzZSBjbGlja3Mgb24gYSBidXR0b24uCiAqCiAqICAgICBxdWVyeVNlbGVjdG9yKCcjbXlCdXR0b24nKS5vbkNsaWNrLmxpc3RlbigoXykgPT4gcHJpbnQoJ0NsaWNrLicpKTsKICoKICogIyMgT3RoZXIgcmVzb3VyY2VzCiAqCiAqICogVGhlIFtkYXJ0OmFzeW5jIHNlY3Rpb24gb2YgdGhlIGxpYnJhcnkgdG91cl1bYXN5bmNocm9ub3VzLXByb2dyYW1taW5nXToKICogICBBIGJyaWVmIG92ZXJ2aWV3IG9mIGFzeW5jaHJvbm91cyBwcm9ncmFtbWluZy4KICoKICogKiBbVXNlIEZ1dHVyZS1CYXNlZCBBUElzXVtmdXR1cmVzLXR1dG9yaWFsXTogQSBjbG9zZXIgbG9vayBhdCBGdXR1cmVzIGFuZAogKiAgIGhvdyB0byB1c2UgdGhlbSB0byB3cml0ZSBhc3luY2hyb25vdXMgRGFydCBjb2RlLgogKgogKiAqIFtGdXR1cmVzIGFuZCBFcnJvciBIYW5kbGluZ11bZnV0dXJlcy1lcnJvci1oYW5kbGluZ106IEV2ZXJ5dGhpbmcgeW91CiAqICAgd2FudGVkIHRvIGtub3cgYWJvdXQgaGFuZGxpbmcgZXJyb3JzIGFuZCBleGNlcHRpb25zIHdoZW4gd29ya2luZyB3aXRoCiAqICAgRnV0dXJlcyAoYnV0IHdlcmUgYWZyYWlkIHRvIGFzaykuCiAqCiAqICogW1RoZSBFdmVudCBMb29wIGFuZCBEYXJ0XShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvYXJ0aWNsZXMvZXZlbnQtbG9vcC8pOgogKiAgIExlYXJuIGhvdyBEYXJ0IGhhbmRsZXMgdGhlIGV2ZW50IHF1ZXVlIGFuZCBtaWNyb3Rhc2sgcXVldWUsIHNvIHlvdSBjYW4KICogICB3cml0ZSBiZXR0ZXIgYXN5bmNocm9ub3VzIGNvZGUgd2l0aCBmZXdlciBzdXJwcmlzZXMuCiAqCiAqICogW3Rlc3QgcGFja2FnZTogQXN5bmNocm9ub3VzIFRlc3RzXVt0ZXN0LXJlYWRtZV06IEhvdyB0byB0ZXN0IGFzeW5jaHJvbm91cwogKiAgIGNvZGUuCiAqCiAqIFthc3luY2hyb25vdXMtcHJvZ3JhbW1pbmddOiBodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy9kYXJ0LXVwLWFuZC1ydW5uaW5nL2NoMDMuaHRtbCNkYXJ0YXN5bmMtLS1hc3luY2hyb25vdXMtcHJvZ3JhbW1pbmcKICogW2Z1dHVyZXMtdHV0b3JpYWxdOiBodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy90dXRvcmlhbHMvZnV0dXJlcy8KICogW2Z1dHVyZXMtZXJyb3ItaGFuZGxpbmddOiBodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvYXJ0aWNsZXMvZnV0dXJlcy1hbmQtZXJyb3ItaGFuZGxpbmcvCiAqIFt0ZXN0LXJlYWRtZV06IGh0dHBzOi8vcHViLmRhcnRsYW5nLm9yZy9wYWNrYWdlcy90ZXN0CiAqCiAqIHtAY2F0ZWdvcnkgQ29yZX0KICovCmxpYnJhcnkgZGFydC5hc3luYzsKCmltcG9ydCAiZGFydDpjb2xsZWN0aW9uIiBzaG93IEhhc2hNYXAsIEl0ZXJhYmxlQmFzZTsKaW1wb3J0ICJkYXJ0Ol9pbnRlcm5hbCIKICAgIHNob3cKICAgICAgICBDYXN0U3RyZWFtLAogICAgICAgIENhc3RTdHJlYW1UcmFuc2Zvcm1lciwKICAgICAgICBFbXB0eUl0ZXJhdG9yLAogICAgICAgIEl0ZXJhYmxlRWxlbWVudEVycm9yLAogICAgICAgIHByaW50VG9ab25lLAogICAgICAgIHByaW50VG9Db25zb2xlLAogICAgICAgIFNpbmNlOwoKcGFydCAnYXN5bmNfZXJyb3IuZGFydCc7CnBhcnQgJ2Jyb2FkY2FzdF9zdHJlYW1fY29udHJvbGxlci5kYXJ0JzsKcGFydCAnZGVmZXJyZWRfbG9hZC5kYXJ0JzsKcGFydCAnZnV0dXJlLmRhcnQnOwpwYXJ0ICdmdXR1cmVfaW1wbC5kYXJ0JzsKcGFydCAnc2NoZWR1bGVfbWljcm90YXNrLmRhcnQnOwpwYXJ0ICdzdHJlYW0uZGFydCc7CnBhcnQgJ3N0cmVhbV9jb250cm9sbGVyLmRhcnQnOwpwYXJ0ICdzdHJlYW1faW1wbC5kYXJ0JzsKcGFydCAnc3RyZWFtX3BpcGUuZGFydCc7CnBhcnQgJ3N0cmVhbV90cmFuc2Zvcm1lcnMuZGFydCc7CnBhcnQgJ3RpbWVyLmRhcnQnOwpwYXJ0ICd6b25lLmRhcnQnOwp5AE5OPAEEKSsDPygDJQMcAw0DPx8zMT8rAzo9PQMrPiADOUIbJyk/PzouAw0DN0xKFkYzOyUDRTUDM0VQNBQDPkoDSgMWA00zA002A0pLJwNPTDoDTwsDgIBIWzkDFAQUATUYCRQfFx4VGA8BGSkbFBkgFB8ZGSETEgEKZGFydDphc3luYzJvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvYXN5bmMvZnV0dXJlX2ltcGwuZGFydMAAZ6cvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmFzeW5jOwoKLyoqIFRoZSBvblZhbHVlIGFuZCBvbkVycm9yIGhhbmRsZXJzIHJldHVybiBlaXRoZXIgYSB2YWx1ZSBvciBhIGZ1dHVyZSAqLwp0eXBlZGVmIEZ1dHVyZU9yPFQ+IF9GdXR1cmVPblZhbHVlPFMsIFQ+KFMgdmFsdWUpOwovKiogVGVzdCB1c2VkIGJ5IFtGdXR1cmUuY2F0Y2hFcnJvcl0gdG8gaGFuZGxlIHNraXAgc29tZSBlcnJvcnMuICovCnR5cGVkZWYgYm9vbCBfRnV0dXJlRXJyb3JUZXN0KE9iamVjdCBlcnJvcik7Ci8qKiBVc2VkIGJ5IFtXaGVuRnV0dXJlXS4gKi8KdHlwZWRlZiBkeW5hbWljIF9GdXR1cmVBY3Rpb24oKTsKCmFic3RyYWN0IGNsYXNzIF9Db21wbGV0ZXI8VD4gaW1wbGVtZW50cyBDb21wbGV0ZXI8VD4gewogIGZpbmFsIF9GdXR1cmU8VD4gZnV0dXJlID0gbmV3IF9GdXR1cmU8VD4oKTsKCiAgdm9pZCBjb21wbGV0ZShbRnV0dXJlT3I8VD4gdmFsdWVdKTsKCiAgdm9pZCBjb21wbGV0ZUVycm9yKE9iamVjdCBlcnJvciwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pIHsKICAgIGVycm9yID0gX25vbk51bGxFcnJvcihlcnJvcik7CiAgICBpZiAoIWZ1dHVyZS5fbWF5Q29tcGxldGUpIHRocm93IG5ldyBTdGF0ZUVycm9yKCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKTsKICAgIEFzeW5jRXJyb3IgcmVwbGFjZW1lbnQgPSBab25lLmN1cnJlbnQuZXJyb3JDYWxsYmFjayhlcnJvciwgc3RhY2tUcmFjZSk7CiAgICBpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgewogICAgICBlcnJvciA9IF9ub25OdWxsRXJyb3IocmVwbGFjZW1lbnQuZXJyb3IpOwogICAgICBzdGFja1RyYWNlID0gcmVwbGFjZW1lbnQuc3RhY2tUcmFjZTsKICAgIH0KICAgIF9jb21wbGV0ZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIHZvaWQgX2NvbXBsZXRlRXJyb3IoT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpOwoKICAvLyBUaGUgZnV0dXJlJ3MgX2lzQ29tcGxldGUgZG9lc24ndCB0YWtlIGludG8gYWNjb3VudCBwZW5kaW5nIGNvbXBsZXRpb25zLgogIC8vIFdlIHRoZXJlZm9yZSB1c2UgX21heUNvbXBsZXRlLgogIGJvb2wgZ2V0IGlzQ29tcGxldGVkID0+ICFmdXR1cmUuX21heUNvbXBsZXRlOwp9CgpjbGFzcyBfQXN5bmNDb21wbGV0ZXI8VD4gZXh0ZW5kcyBfQ29tcGxldGVyPFQ+IHsKICB2b2lkIGNvbXBsZXRlKFtGdXR1cmVPcjxUPiB2YWx1ZV0pIHsKICAgIGlmICghZnV0dXJlLl9tYXlDb21wbGV0ZSkgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIkZ1dHVyZSBhbHJlYWR5IGNvbXBsZXRlZCIpOwogICAgZnV0dXJlLl9hc3luY0NvbXBsZXRlKHZhbHVlKTsKICB9CgogIHZvaWQgX2NvbXBsZXRlRXJyb3IoT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgIGZ1dHVyZS5fYXN5bmNDb21wbGV0ZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9Cn0KCmNsYXNzIF9TeW5jQ29tcGxldGVyPFQ+IGV4dGVuZHMgX0NvbXBsZXRlcjxUPiB7CiAgdm9pZCBjb21wbGV0ZShbRnV0dXJlT3I8VD4gdmFsdWVdKSB7CiAgICBpZiAoIWZ1dHVyZS5fbWF5Q29tcGxldGUpIHRocm93IG5ldyBTdGF0ZUVycm9yKCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKTsKICAgIGZ1dHVyZS5fY29tcGxldGUodmFsdWUpOwogIH0KCiAgdm9pZCBfY29tcGxldGVFcnJvcihPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgZnV0dXJlLl9jb21wbGV0ZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9Cn0KCmNsYXNzIF9GdXR1cmVMaXN0ZW5lcjxTLCBUPiB7CiAgc3RhdGljIGNvbnN0IGludCBtYXNrVmFsdWUgPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgbWFza0Vycm9yID0gMjsKICBzdGF0aWMgY29uc3QgaW50IG1hc2tUZXN0RXJyb3IgPSA0OwogIHN0YXRpYyBjb25zdCBpbnQgbWFza1doZW5jb21wbGV0ZSA9IDg7CiAgc3RhdGljIGNvbnN0IGludCBzdGF0ZUNoYWluID0gMDsKICBzdGF0aWMgY29uc3QgaW50IHN0YXRlVGhlbiA9IG1hc2tWYWx1ZTsKICBzdGF0aWMgY29uc3QgaW50IHN0YXRlVGhlbk9uZXJyb3IgPSBtYXNrVmFsdWUgfCBtYXNrRXJyb3I7CiAgc3RhdGljIGNvbnN0IGludCBzdGF0ZUNhdGNoZXJyb3IgPSBtYXNrRXJyb3I7CiAgc3RhdGljIGNvbnN0IGludCBzdGF0ZUNhdGNoZXJyb3JUZXN0ID0gbWFza0Vycm9yIHwgbWFza1Rlc3RFcnJvcjsKICBzdGF0aWMgY29uc3QgaW50IHN0YXRlV2hlbmNvbXBsZXRlID0gbWFza1doZW5jb21wbGV0ZTsKICAvLyBMaXN0ZW5lcnMgb24gdGhlIHNhbWUgZnV0dXJlIGFyZSBsaW5rZWQgdGhyb3VnaCB0aGlzIGxpbmsuCiAgX0Z1dHVyZUxpc3RlbmVyIF9uZXh0TGlzdGVuZXI7CiAgLy8gVGhlIGZ1dHVyZSB0byBjb21wbGV0ZSB3aGVuIHRoaXMgbGlzdGVuZXIgaXMgYWN0aXZhdGVkLgogIGZpbmFsIF9GdXR1cmU8VD4gcmVzdWx0OwogIC8vIFdoaWNoIGZpZWxkcyBtZWFucyB3aGF0LgogIGZpbmFsIGludCBzdGF0ZTsKICAvLyBVc2VkIGZvciB0aGVuL3doZW5Eb25lIGNhbGxiYWNrIGFuZCBlcnJvciB0ZXN0CiAgZmluYWwgRnVuY3Rpb24gY2FsbGJhY2s7CiAgLy8gVXNlZCBmb3IgZXJyb3IgY2FsbGJhY2tzLgogIGZpbmFsIEZ1bmN0aW9uIGVycm9yQ2FsbGJhY2s7CgogIF9GdXR1cmVMaXN0ZW5lci50aGVuKAogICAgICB0aGlzLnJlc3VsdCwgX0Z1dHVyZU9uVmFsdWU8UywgVD4gb25WYWx1ZSwgRnVuY3Rpb24gZXJyb3JDYWxsYmFjaykKICAgICAgOiBjYWxsYmFjayA9IG9uVmFsdWUsCiAgICAgICAgZXJyb3JDYWxsYmFjayA9IGVycm9yQ2FsbGJhY2ssCiAgICAgICAgc3RhdGUgPSAoZXJyb3JDYWxsYmFjayA9PSBudWxsKSA/IHN0YXRlVGhlbiA6IHN0YXRlVGhlbk9uZXJyb3I7CgogIF9GdXR1cmVMaXN0ZW5lci5jYXRjaEVycm9yKHRoaXMucmVzdWx0LCB0aGlzLmVycm9yQ2FsbGJhY2ssIHRoaXMuY2FsbGJhY2spCiAgICAgIDogc3RhdGUgPSAoY2FsbGJhY2sgPT0gbnVsbCkgPyBzdGF0ZUNhdGNoZXJyb3IgOiBzdGF0ZUNhdGNoZXJyb3JUZXN0OwoKICBfRnV0dXJlTGlzdGVuZXIud2hlbkNvbXBsZXRlKHRoaXMucmVzdWx0LCB0aGlzLmNhbGxiYWNrKQogICAgICA6IGVycm9yQ2FsbGJhY2sgPSBudWxsLAogICAgICAgIHN0YXRlID0gc3RhdGVXaGVuY29tcGxldGU7CgogIFpvbmUgZ2V0IF96b25lID0+IHJlc3VsdC5fem9uZTsKCiAgYm9vbCBnZXQgaGFuZGxlc1ZhbHVlID0+IChzdGF0ZSAmIG1hc2tWYWx1ZSAhPSAwKTsKICBib29sIGdldCBoYW5kbGVzRXJyb3IgPT4gKHN0YXRlICYgbWFza0Vycm9yICE9IDApOwogIGJvb2wgZ2V0IGhhc0Vycm9yVGVzdCA9PiAoc3RhdGUgPT0gc3RhdGVDYXRjaGVycm9yVGVzdCk7CiAgYm9vbCBnZXQgaGFuZGxlc0NvbXBsZXRlID0+IChzdGF0ZSA9PSBzdGF0ZVdoZW5jb21wbGV0ZSk7CgogIF9GdXR1cmVPblZhbHVlPFMsIFQ+IGdldCBfb25WYWx1ZSB7CiAgICBhc3NlcnQoaGFuZGxlc1ZhbHVlKTsKICAgIHJldHVybiBjYWxsYmFjazsKICB9CgogIEZ1bmN0aW9uIGdldCBfb25FcnJvciA9PiBlcnJvckNhbGxiYWNrOwogIF9GdXR1cmVFcnJvclRlc3QgZ2V0IF9lcnJvclRlc3QgewogICAgYXNzZXJ0KGhhc0Vycm9yVGVzdCk7CiAgICByZXR1cm4gY2FsbGJhY2s7CiAgfQoKICBfRnV0dXJlQWN0aW9uIGdldCBfd2hlbkNvbXBsZXRlQWN0aW9uIHsKICAgIGFzc2VydChoYW5kbGVzQ29tcGxldGUpOwogICAgcmV0dXJuIGNhbGxiYWNrOwogIH0KCiAgLy8vIFdoZXRoZXIgdGhpcyBsaXN0ZW5lciBoYXMgYW4gZXJyb3IgY2FsbGJhY2suCiAgLy8vCiAgLy8vIFRoaXMgZnVuY3Rpb24gbXVzdCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgbGlzdGVuZXIgW2hhbmRsZXNFcnJvcl0uCiAgYm9vbCBnZXQgaGFzRXJyb3JDYWxsYmFjayB7CiAgICBhc3NlcnQoaGFuZGxlc0Vycm9yKTsKICAgIHJldHVybiBfb25FcnJvciAhPSBudWxsOwogIH0KCiAgRnV0dXJlT3I8VD4gaGFuZGxlVmFsdWUoUyBzb3VyY2VSZXN1bHQpIHsKICAgIHJldHVybiBfem9uZS5ydW5VbmFyeTxGdXR1cmVPcjxUPiwgUz4oX29uVmFsdWUsIHNvdXJjZVJlc3VsdCk7CiAgfQoKICBib29sIG1hdGNoZXNFcnJvclRlc3QoQXN5bmNFcnJvciBhc3luY0Vycm9yKSB7CiAgICBpZiAoIWhhc0Vycm9yVGVzdCkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gX3pvbmUucnVuVW5hcnk8Ym9vbCwgT2JqZWN0PihfZXJyb3JUZXN0LCBhc3luY0Vycm9yLmVycm9yKTsKICB9CgogIEZ1dHVyZU9yPFQ+IGhhbmRsZUVycm9yKEFzeW5jRXJyb3IgYXN5bmNFcnJvcikgewogICAgYXNzZXJ0KGhhbmRsZXNFcnJvciAmJiBoYXNFcnJvckNhbGxiYWNrKTsKICAgIHZhciBlcnJvckNhbGxiYWNrID0gdGhpcy5lcnJvckNhbGxiYWNrOyAvLyBUbyBlbmFibGUgcHJvbW90aW9uLgogICAgLy8gSWYgdGhlIGVycm9yQ2FsbGJhY2sgcmV0dXJucyBzb21ldGhpbmcgd2hpY2ggaXMgbm90IGEgRnV0dXJlT3I8VD4sCiAgICAvLyB0aGlzIHJldHVybiBzdGF0ZW1lbnQgdGhyb3dzLCBhbmQgdGhlIGNhbGxlciBoYW5kbGVzIHRoZSBlcnJvci4KICAgIGlmIChlcnJvckNhbGxiYWNrIGlzIGR5bmFtaWMgRnVuY3Rpb24oT2JqZWN0LCBTdGFja1RyYWNlKSkgewogICAgICByZXR1cm4gX3pvbmUucnVuQmluYXJ5PGR5bmFtaWMsIE9iamVjdCwgU3RhY2tUcmFjZT4oCiAgICAgICAgICBlcnJvckNhbGxiYWNrLCBhc3luY0Vycm9yLmVycm9yLCBhc3luY0Vycm9yLnN0YWNrVHJhY2UpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KGVycm9yQ2FsbGJhY2sgaXMgZHluYW1pYyBGdW5jdGlvbihPYmplY3QpKTsKICAgICAgcmV0dXJuIF96b25lLnJ1blVuYXJ5PGR5bmFtaWMsIE9iamVjdD4oZXJyb3JDYWxsYmFjaywgYXN5bmNFcnJvci5lcnJvcik7CiAgICB9CiAgfQoKICBkeW5hbWljIGhhbmRsZVdoZW5Db21wbGV0ZSgpIHsKICAgIGFzc2VydCghaGFuZGxlc0Vycm9yKTsKICAgIHJldHVybiBfem9uZS5ydW4oX3doZW5Db21wbGV0ZUFjdGlvbik7CiAgfQp9CgpjbGFzcyBfRnV0dXJlPFQ+IGltcGxlbWVudHMgRnV0dXJlPFQ+IHsKICAvLy8gSW5pdGlhbCBzdGF0ZSwgd2FpdGluZyBmb3IgYSByZXN1bHQuIEluIHRoaXMgc3RhdGUsIHRoZQogIC8vLyBbcmVzdWx0T3JMaXN0ZW5lcnNdIGZpZWxkIGhvbGRzIGEgc2luZ2xlLWxpbmtlZCBsaXN0IG9mCiAgLy8vIFtfRnV0dXJlTGlzdGVuZXJdIGxpc3RlbmVycy4KICBzdGF0aWMgY29uc3QgaW50IF9zdGF0ZUluY29tcGxldGUgPSAwOwoKICAvLy8gUGVuZGluZyBjb21wbGV0aW9uLiBTZXQgd2hlbiBjb21wbGV0ZWQgdXNpbmcgW19hc3luY0NvbXBsZXRlXSBvcgogIC8vLyBbX2FzeW5jQ29tcGxldGVFcnJvcl0uIEl0IGlzIGFuIGVycm9yIHRvIHRyeSB0byBjb21wbGV0ZSBpdCBhZ2Fpbi4KICAvLy8gW3Jlc3VsdE9yTGlzdGVuZXJzXSBob2xkcyBsaXN0ZW5lcnMuCiAgc3RhdGljIGNvbnN0IGludCBfc3RhdGVQZW5kaW5nQ29tcGxldGUgPSAxOwoKICAvLy8gVGhlIGZ1dHVyZSBoYXMgYmVlbiBjaGFpbmVkIHRvIGFub3RoZXIgZnV0dXJlLiBUaGUgcmVzdWx0IG9mIHRoYXQKICAvLy8gb3RoZXIgZnV0dXJlIGJlY29tZXMgdGhlIHJlc3VsdCBvZiB0aGlzIGZ1dHVyZSBhcyB3ZWxsLgogIC8vLyBbcmVzdWx0T3JMaXN0ZW5lcnNdIGNvbnRhaW5zIHRoZSBzb3VyY2UgZnV0dXJlLgogIHN0YXRpYyBjb25zdCBpbnQgX3N0YXRlQ2hhaW5lZCA9IDI7CgogIC8vLyBUaGUgZnV0dXJlIGhhcyBiZWVuIGNvbXBsZXRlZCB3aXRoIGEgdmFsdWUgcmVzdWx0LgogIHN0YXRpYyBjb25zdCBpbnQgX3N0YXRlVmFsdWUgPSA0OwoKICAvLy8gVGhlIGZ1dHVyZSBoYXMgYmVlbiBjb21wbGV0ZWQgd2l0aCBhbiBlcnJvciByZXN1bHQuCiAgc3RhdGljIGNvbnN0IGludCBfc3RhdGVFcnJvciA9IDg7CgogIC8qKiBXaGV0aGVyIHRoZSBmdXR1cmUgaXMgY29tcGxldGUsIGFuZCBhcyB3aGF0LiAqLwogIGludCBfc3RhdGUgPSBfc3RhdGVJbmNvbXBsZXRlOwoKICAvKioKICAgKiBab25lIHRoYXQgdGhlIGZ1dHVyZSB3YXMgY29tcGxldGVkIGZyb20uCiAgICogVGhpcyBpcyB0aGUgem9uZSB0aGF0IGFuIGVycm9yIHJlc3VsdCBiZWxvbmdzIHRvLgogICAqCiAgICogVW50aWwgdGhlIGZ1dHVyZSBpcyBjb21wbGV0ZWQsIHRoZSBmaWVsZCBtYXkgaG9sZCB0aGUgem9uZSB0aGF0CiAgICogbGlzdGVuZXIgY2FsbGJhY2tzIHVzZWQgdG8gY3JlYXRlIHRoaXMgZnV0dXJlIHNob3VsZCBiZSBydW4gaW4uCiAgICovCiAgZmluYWwgWm9uZSBfem9uZTsKCiAgLyoqCiAgICogRWl0aGVyIHRoZSByZXN1bHQsIGEgbGlzdCBvZiBsaXN0ZW5lcnMgb3IgYW5vdGhlciBmdXR1cmUuCiAgICoKICAgKiBUaGUgcmVzdWx0IG9mIHRoZSBmdXR1cmUgaXMgZWl0aGVyIGEgdmFsdWUgb3IgYW4gZXJyb3IuCiAgICogQSByZXN1bHQgaXMgb25seSBzdG9yZWQgd2hlbiB0aGUgZnV0dXJlIGhhcyBjb21wbGV0ZWQuCiAgICoKICAgKiBUaGUgbGlzdGVuZXJzIGlzIGFuIGludGVybmFsbHkgbGlua2VkIGxpc3Qgb2YgW19GdXR1cmVMaXN0ZW5lcl1zLgogICAqIExpc3RlbmVycyBhcmUgb25seSByZW1lbWJlcmVkIHdoaWxlIHRoZSBmdXR1cmUgaXMgbm90IHlldCBjb21wbGV0ZSwKICAgKiBhbmQgaXQgaXMgbm90IGNoYWluZWQgdG8gYW5vdGhlciBmdXR1cmUuCiAgICoKICAgKiBUaGUgZnV0dXJlIGlzIGFub3RoZXIgZnV0dXJlIHRoYXQgaGlzIGZ1dHVyZSBpcyBjaGFpbmVkIHRvLiBUaGlzIGZ1dHVyZQogICAqIGlzIHdhaXRpbmcgZm9yIHRoZSBvdGhlciBmdXR1cmUgdG8gY29tcGxldGUsIGFuZCB3aGVuIGl0IGRvZXMsIHRoaXMgZnV0dXJlCiAgICogd2lsbCBjb21wbGV0ZSB3aXRoIHRoZSBzYW1lIHJlc3VsdC4KICAgKiBBbGwgbGlzdGVuZXJzIGFyZSBmb3J3YXJkZWQgdG8gdGhlIG90aGVyIGZ1dHVyZS4KICAgKi8KICB2YXIgX3Jlc3VsdE9yTGlzdGVuZXJzOwoKICAvLyBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgYXN5bmMvYXdhaXQuCiAgX0Z1dHVyZSgpIDogX3pvbmUgPSBab25lLmN1cnJlbnQ7CgogIF9GdXR1cmUuaW1tZWRpYXRlKEZ1dHVyZU9yPFQ+IHJlc3VsdCkgOiBfem9uZSA9IFpvbmUuY3VycmVudCB7CiAgICBfYXN5bmNDb21wbGV0ZShyZXN1bHQpOwogIH0KCiAgLyoqIENyZWF0ZXMgYSBmdXR1cmUgd2l0aCB0aGUgdmFsdWUgYW5kIHRoZSBzcGVjaWZpZWQgem9uZS4gKi8KICBfRnV0dXJlLnpvbmVWYWx1ZShUIHZhbHVlLCB0aGlzLl96b25lKSB7CiAgICBfc2V0VmFsdWUodmFsdWUpOwogIH0KCiAgX0Z1dHVyZS5pbW1lZGlhdGVFcnJvcih2YXIgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKQogICAgICA6IF96b25lID0gWm9uZS5jdXJyZW50IHsKICAgIF9hc3luY0NvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgLyoqIENyZWF0ZXMgYSBmdXR1cmUgdGhhdCBpcyBhbHJlYWR5IGNvbXBsZXRlZCB3aXRoIHRoZSB2YWx1ZS4gKi8KICBfRnV0dXJlLnZhbHVlKFQgdmFsdWUpIDogdGhpcy56b25lVmFsdWUodmFsdWUsIFpvbmUuY3VycmVudCk7CgogIGJvb2wgZ2V0IF9tYXlDb21wbGV0ZSA9PiBfc3RhdGUgPT0gX3N0YXRlSW5jb21wbGV0ZTsKICBib29sIGdldCBfaXNQZW5kaW5nQ29tcGxldGUgPT4gX3N0YXRlID09IF9zdGF0ZVBlbmRpbmdDb21wbGV0ZTsKICBib29sIGdldCBfbWF5QWRkTGlzdGVuZXIgPT4gX3N0YXRlIDw9IF9zdGF0ZVBlbmRpbmdDb21wbGV0ZTsKICBib29sIGdldCBfaXNDaGFpbmVkID0+IF9zdGF0ZSA9PSBfc3RhdGVDaGFpbmVkOwogIGJvb2wgZ2V0IF9pc0NvbXBsZXRlID0+IF9zdGF0ZSA+PSBfc3RhdGVWYWx1ZTsKICBib29sIGdldCBfaGFzRXJyb3IgPT4gX3N0YXRlID09IF9zdGF0ZUVycm9yOwoKICB2b2lkIF9zZXRDaGFpbmVkKF9GdXR1cmUgc291cmNlKSB7CiAgICBhc3NlcnQoX21heUFkZExpc3RlbmVyKTsKICAgIF9zdGF0ZSA9IF9zdGF0ZUNoYWluZWQ7CiAgICBfcmVzdWx0T3JMaXN0ZW5lcnMgPSBzb3VyY2U7CiAgfQoKICBGdXR1cmU8Uj4gdGhlbjxSPihGdXR1cmVPcjxSPiBmKFQgdmFsdWUpLCB7RnVuY3Rpb24gb25FcnJvcn0pIHsKICAgIFpvbmUgY3VycmVudFpvbmUgPSBab25lLmN1cnJlbnQ7CiAgICBpZiAoIWlkZW50aWNhbChjdXJyZW50Wm9uZSwgX3Jvb3Rab25lKSkgewogICAgICBmID0gY3VycmVudFpvbmUucmVnaXN0ZXJVbmFyeUNhbGxiYWNrPEZ1dHVyZU9yPFI+LCBUPihmKTsKICAgICAgaWYgKG9uRXJyb3IgIT0gbnVsbCkgewogICAgICAgIC8vIEluIGNoZWNrZWQgbW9kZSwgdGhpcyBjaGVja3MgdGhhdCBvbkVycm9yIGlzIGFzc2lnbmFibGUgdG8gb25lIG9mOgogICAgICAgIC8vICAgZHluYW1pYyBGdW5jdGlvbihPYmplY3QpCiAgICAgICAgLy8gICBkeW5hbWljIEZ1bmN0aW9uKE9iamVjdCwgU3RhY2tUcmFjZSkKICAgICAgICBvbkVycm9yID0gX3JlZ2lzdGVyRXJyb3JIYW5kbGVyKG9uRXJyb3IsIGN1cnJlbnRab25lKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIF90aGVuTm9ab25lUmVnaXN0cmF0aW9uPFI+KGYsIG9uRXJyb3IpOwogIH0KCiAgLy8gVGhpcyBtZXRob2QgaXMgdXNlZCBieSBhc3luYy9hd2FpdC4KICBGdXR1cmU8RT4gX3RoZW5Ob1pvbmVSZWdpc3RyYXRpb248RT4oCiAgICAgIEZ1dHVyZU9yPEU+IGYoVCB2YWx1ZSksIEZ1bmN0aW9uIG9uRXJyb3IpIHsKICAgIF9GdXR1cmU8RT4gcmVzdWx0ID0gbmV3IF9GdXR1cmU8RT4oKTsKICAgIF9hZGRMaXN0ZW5lcihuZXcgX0Z1dHVyZUxpc3RlbmVyPFQsIEU+LnRoZW4ocmVzdWx0LCBmLCBvbkVycm9yKSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgRnV0dXJlPFQ+IGNhdGNoRXJyb3IoRnVuY3Rpb24gb25FcnJvciwge2Jvb2wgdGVzdChlcnJvcil9KSB7CiAgICBfRnV0dXJlPFQ+IHJlc3VsdCA9IG5ldyBfRnV0dXJlPFQ+KCk7CiAgICBpZiAoIWlkZW50aWNhbChyZXN1bHQuX3pvbmUsIF9yb290Wm9uZSkpIHsKICAgICAgb25FcnJvciA9IF9yZWdpc3RlckVycm9ySGFuZGxlcihvbkVycm9yLCByZXN1bHQuX3pvbmUpOwogICAgICBpZiAodGVzdCAhPSBudWxsKSB0ZXN0ID0gcmVzdWx0Ll96b25lLnJlZ2lzdGVyVW5hcnlDYWxsYmFjayh0ZXN0KTsKICAgIH0KICAgIF9hZGRMaXN0ZW5lcihuZXcgX0Z1dHVyZUxpc3RlbmVyPFQsIFQ+LmNhdGNoRXJyb3IocmVzdWx0LCBvbkVycm9yLCB0ZXN0KSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgRnV0dXJlPFQ+IHdoZW5Db21wbGV0ZShkeW5hbWljIGFjdGlvbigpKSB7CiAgICBfRnV0dXJlPFQ+IHJlc3VsdCA9IG5ldyBfRnV0dXJlPFQ+KCk7CiAgICBpZiAoIWlkZW50aWNhbChyZXN1bHQuX3pvbmUsIF9yb290Wm9uZSkpIHsKICAgICAgYWN0aW9uID0gcmVzdWx0Ll96b25lLnJlZ2lzdGVyQ2FsbGJhY2s8ZHluYW1pYz4oYWN0aW9uKTsKICAgIH0KICAgIF9hZGRMaXN0ZW5lcihuZXcgX0Z1dHVyZUxpc3RlbmVyPFQsIFQ+LndoZW5Db21wbGV0ZShyZXN1bHQsIGFjdGlvbikpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIFN0cmVhbTxUPiBhc1N0cmVhbSgpID0+IG5ldyBTdHJlYW08VD4uZnJvbUZ1dHVyZSh0aGlzKTsKCiAgdm9pZCBfc2V0UGVuZGluZ0NvbXBsZXRlKCkgewogICAgYXNzZXJ0KF9tYXlDb21wbGV0ZSk7CiAgICBfc3RhdGUgPSBfc3RhdGVQZW5kaW5nQ29tcGxldGU7CiAgfQoKICB2b2lkIF9jbGVhclBlbmRpbmdDb21wbGV0ZSgpIHsKICAgIGFzc2VydChfaXNQZW5kaW5nQ29tcGxldGUpOwogICAgX3N0YXRlID0gX3N0YXRlSW5jb21wbGV0ZTsKICB9CgogIEFzeW5jRXJyb3IgZ2V0IF9lcnJvciB7CiAgICBhc3NlcnQoX2hhc0Vycm9yKTsKICAgIHJldHVybiBfcmVzdWx0T3JMaXN0ZW5lcnM7CiAgfQoKICBfRnV0dXJlIGdldCBfY2hhaW5Tb3VyY2UgewogICAgYXNzZXJ0KF9pc0NoYWluZWQpOwogICAgcmV0dXJuIF9yZXN1bHRPckxpc3RlbmVyczsKICB9CgogIC8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgYXN5bmMvYXdhaXQuCiAgdm9pZCBfc2V0VmFsdWUoVCB2YWx1ZSkgewogICAgYXNzZXJ0KCFfaXNDb21wbGV0ZSk7IC8vIEJ1dCBtYXkgaGF2ZSBhIGNvbXBsZXRpb24gcGVuZGluZy4KICAgIF9zdGF0ZSA9IF9zdGF0ZVZhbHVlOwogICAgX3Jlc3VsdE9yTGlzdGVuZXJzID0gdmFsdWU7CiAgfQoKICB2b2lkIF9zZXRFcnJvck9iamVjdChBc3luY0Vycm9yIGVycm9yKSB7CiAgICBhc3NlcnQoIV9pc0NvbXBsZXRlKTsgLy8gQnV0IG1heSBoYXZlIGEgY29tcGxldGlvbiBwZW5kaW5nLgogICAgX3N0YXRlID0gX3N0YXRlRXJyb3I7CiAgICBfcmVzdWx0T3JMaXN0ZW5lcnMgPSBlcnJvcjsKICB9CgogIHZvaWQgX3NldEVycm9yKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICBfc2V0RXJyb3JPYmplY3QobmV3IEFzeW5jRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpKTsKICB9CgogIC8vLyBDb3B5IHRoZSBjb21wbGV0aW9uIHJlc3VsdCBvZiBbc291cmNlXSBpbnRvIHRoaXMgZnV0dXJlLgogIC8vLwogIC8vLyBVc2VkIHdoZW4gYSBjaGFpbmVkIGZ1dHVyZSBub3RpY2VzIHRoYXQgaXRzIHNvdXJjZSBpcyBjb21wbGV0ZWQuCiAgdm9pZCBfY2xvbmVSZXN1bHQoX0Z1dHVyZSBzb3VyY2UpIHsKICAgIGFzc2VydCghX2lzQ29tcGxldGUpOwogICAgYXNzZXJ0KHNvdXJjZS5faXNDb21wbGV0ZSk7CiAgICBfc3RhdGUgPSBzb3VyY2UuX3N0YXRlOwogICAgX3Jlc3VsdE9yTGlzdGVuZXJzID0gc291cmNlLl9yZXN1bHRPckxpc3RlbmVyczsKICB9CgogIHZvaWQgX2FkZExpc3RlbmVyKF9GdXR1cmVMaXN0ZW5lciBsaXN0ZW5lcikgewogICAgYXNzZXJ0KGxpc3RlbmVyLl9uZXh0TGlzdGVuZXIgPT0gbnVsbCk7CiAgICBpZiAoX21heUFkZExpc3RlbmVyKSB7CiAgICAgIGxpc3RlbmVyLl9uZXh0TGlzdGVuZXIgPSBfcmVzdWx0T3JMaXN0ZW5lcnM7CiAgICAgIF9yZXN1bHRPckxpc3RlbmVycyA9IGxpc3RlbmVyOwogICAgfSBlbHNlIHsKICAgICAgaWYgKF9pc0NoYWluZWQpIHsKICAgICAgICAvLyBEZWxlZ2F0ZSBsaXN0ZW5lcnMgdG8gY2hhaW5lZCBzb3VyY2UgZnV0dXJlLgogICAgICAgIC8vIElmIHRoZSBzb3VyY2UgaXMgY29tcGxldGUsIGluc3RlYWQgY29weSBpdHMgdmFsdWVzIGFuZAogICAgICAgIC8vIGRyb3AgdGhlIGNoYWluaW5nLgogICAgICAgIF9GdXR1cmUgc291cmNlID0gX2NoYWluU291cmNlOwogICAgICAgIGlmICghc291cmNlLl9pc0NvbXBsZXRlKSB7CiAgICAgICAgICBzb3VyY2UuX2FkZExpc3RlbmVyKGxpc3RlbmVyKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgX2Nsb25lUmVzdWx0KHNvdXJjZSk7CiAgICAgIH0KICAgICAgYXNzZXJ0KF9pc0NvbXBsZXRlKTsKICAgICAgLy8gSGFuZGxlIGxhdGUgbGlzdGVuZXJzIGFzeW5jaHJvbm91c2x5LgogICAgICBfem9uZS5zY2hlZHVsZU1pY3JvdGFzaygoKSB7CiAgICAgICAgX3Byb3BhZ2F0ZVRvTGlzdGVuZXJzKHRoaXMsIGxpc3RlbmVyKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICB2b2lkIF9wcmVwZW5kTGlzdGVuZXJzKF9GdXR1cmVMaXN0ZW5lciBsaXN0ZW5lcnMpIHsKICAgIGlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgcmV0dXJuOwogICAgaWYgKF9tYXlBZGRMaXN0ZW5lcikgewogICAgICBfRnV0dXJlTGlzdGVuZXIgZXhpc3RpbmdMaXN0ZW5lcnMgPSBfcmVzdWx0T3JMaXN0ZW5lcnM7CiAgICAgIF9yZXN1bHRPckxpc3RlbmVycyA9IGxpc3RlbmVyczsKICAgICAgaWYgKGV4aXN0aW5nTGlzdGVuZXJzICE9IG51bGwpIHsKICAgICAgICBfRnV0dXJlTGlzdGVuZXIgY3Vyc29yID0gbGlzdGVuZXJzOwogICAgICAgIHdoaWxlIChjdXJzb3IuX25leHRMaXN0ZW5lciAhPSBudWxsKSB7CiAgICAgICAgICBjdXJzb3IgPSBjdXJzb3IuX25leHRMaXN0ZW5lcjsKICAgICAgICB9CiAgICAgICAgY3Vyc29yLl9uZXh0TGlzdGVuZXIgPSBleGlzdGluZ0xpc3RlbmVyczsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKF9pc0NoYWluZWQpIHsKICAgICAgICAvLyBEZWxlZ2F0ZSBsaXN0ZW5lcnMgdG8gY2hhaW5lZCBzb3VyY2UgZnV0dXJlLgogICAgICAgIC8vIElmIHRoZSBzb3VyY2UgaXMgY29tcGxldGUsIGluc3RlYWQgY29weSBpdHMgdmFsdWVzIGFuZAogICAgICAgIC8vIGRyb3AgdGhlIGNoYWluaW5nLgogICAgICAgIF9GdXR1cmUgc291cmNlID0gX2NoYWluU291cmNlOwogICAgICAgIGlmICghc291cmNlLl9pc0NvbXBsZXRlKSB7CiAgICAgICAgICBzb3VyY2UuX3ByZXBlbmRMaXN0ZW5lcnMobGlzdGVuZXJzKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgX2Nsb25lUmVzdWx0KHNvdXJjZSk7CiAgICAgIH0KICAgICAgYXNzZXJ0KF9pc0NvbXBsZXRlKTsKICAgICAgbGlzdGVuZXJzID0gX3JldmVyc2VMaXN0ZW5lcnMobGlzdGVuZXJzKTsKICAgICAgX3pvbmUuc2NoZWR1bGVNaWNyb3Rhc2soKCkgewogICAgICAgIF9wcm9wYWdhdGVUb0xpc3RlbmVycyh0aGlzLCBsaXN0ZW5lcnMpOwogICAgICB9KTsKICAgIH0KICB9CgogIF9GdXR1cmVMaXN0ZW5lciBfcmVtb3ZlTGlzdGVuZXJzKCkgewogICAgLy8gUmV2ZXJzZSBsaXN0ZW5lcnMgYmVmb3JlIHJldHVybmluZyB0aGVtLCBzbyB0aGUgcmVzdWx0aW5nIGxpc3QgaXMgaW4KICAgIC8vIHN1YnNjcmlwdGlvbiBvcmRlci4KICAgIGFzc2VydCghX2lzQ29tcGxldGUpOwogICAgX0Z1dHVyZUxpc3RlbmVyIGN1cnJlbnQgPSBfcmVzdWx0T3JMaXN0ZW5lcnM7CiAgICBfcmVzdWx0T3JMaXN0ZW5lcnMgPSBudWxsOwogICAgcmV0dXJuIF9yZXZlcnNlTGlzdGVuZXJzKGN1cnJlbnQpOwogIH0KCiAgX0Z1dHVyZUxpc3RlbmVyIF9yZXZlcnNlTGlzdGVuZXJzKF9GdXR1cmVMaXN0ZW5lciBsaXN0ZW5lcnMpIHsKICAgIF9GdXR1cmVMaXN0ZW5lciBwcmV2OwogICAgX0Z1dHVyZUxpc3RlbmVyIGN1cnJlbnQgPSBsaXN0ZW5lcnM7CiAgICB3aGlsZSAoY3VycmVudCAhPSBudWxsKSB7CiAgICAgIF9GdXR1cmVMaXN0ZW5lciBuZXh0ID0gY3VycmVudC5fbmV4dExpc3RlbmVyOwogICAgICBjdXJyZW50Ll9uZXh0TGlzdGVuZXIgPSBwcmV2OwogICAgICBwcmV2ID0gY3VycmVudDsKICAgICAgY3VycmVudCA9IG5leHQ7CiAgICB9CiAgICByZXR1cm4gcHJldjsKICB9CgogIC8vIFRha2UgdGhlIHZhbHVlICh3aGVuIGNvbXBsZXRlZCkgb2Ygc291cmNlIGFuZCBjb21wbGV0ZSB0YXJnZXQgd2l0aCB0aGF0CiAgLy8gdmFsdWUgKG9yIGVycm9yKS4gVGhpcyBmdW5jdGlvbiBjb3VsZCBjaGFpbiBhbGwgRnV0dXJlcywgYnV0IGlzIHNsb3dlcgogIC8vIGZvciBfRnV0dXJlIHRoYW4gX2NoYWluQ29yZUZ1dHVyZSwgc28geW91IG11c3QgdXNlIF9jaGFpbkNvcmVGdXR1cmUKICAvLyBpbiB0aGF0IGNhc2UuCiAgc3RhdGljIHZvaWQgX2NoYWluRm9yZWlnbkZ1dHVyZShGdXR1cmUgc291cmNlLCBfRnV0dXJlIHRhcmdldCkgewogICAgYXNzZXJ0KCF0YXJnZXQuX2lzQ29tcGxldGUpOwogICAgYXNzZXJ0KHNvdXJjZSBpcyEgX0Z1dHVyZSk7CgogICAgLy8gTWFyayB0aGUgdGFyZ2V0IGFzIGNoYWluZWQgKGFuZCBhcyBzdWNoIGhhbGYtY29tcGxldGVkKS4KICAgIHRhcmdldC5fc2V0UGVuZGluZ0NvbXBsZXRlKCk7CiAgICB0cnkgewogICAgICBzb3VyY2UudGhlbigodmFsdWUpIHsKICAgICAgICBhc3NlcnQodGFyZ2V0Ll9pc1BlbmRpbmdDb21wbGV0ZSk7CiAgICAgICAgLy8gVGhlICJ2YWx1ZSIgbWF5IGJlIGFub3RoZXIgZnV0dXJlIGlmIHRoZSBmb3JlaWduIGZ1dHVyZQogICAgICAgIC8vIGltcGxlbWVudGF0aW9uIGlzIG1pcy1iZWhhdmluZywKICAgICAgICAvLyBzbyB1c2UgX2NvbXBsZXRlIGluc3RlYWQgb2YgX2NvbXBsZXRlV2l0aFZhbHVlLgogICAgICAgIHRhcmdldC5fY2xlYXJQZW5kaW5nQ29tcGxldGUoKTsgLy8gQ2xlYXIgdGhpcyBmaXJzdCwgaXQncyBzZXQgYWdhaW4uCiAgICAgICAgdGFyZ2V0Ll9jb21wbGV0ZSh2YWx1ZSk7CiAgICAgIH0sCiAgICAgICAgICAvLyBUT0RPKGZsb2l0c2NoKTogZXZlbnR1YWxseSB3ZSB3b3VsZCBsaWtlIHRvIG1ha2UgdGhpcyBub24tb3B0aW9uYWwKICAgICAgICAgIC8vIGFuZCBkZXBlbmRlbnQgb24gdGhlIGxpc3RlbmVycyBvZiB0aGUgdGFyZ2V0IGZ1dHVyZS4gSWYgbm9uZSBvZgogICAgICAgICAgLy8gdGhlIHRhcmdldCBmdXR1cmUncyBsaXN0ZW5lcnMgd2FudCB0byBoYXZlIHRoZSBzdGFjayB0cmFjZSB3ZSBkb24ndAogICAgICAgICAgLy8gbmVlZCBhIHRyYWNlLgogICAgICAgICAgb25FcnJvcjogKGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSkgewogICAgICAgIGFzc2VydCh0YXJnZXQuX2lzUGVuZGluZ0NvbXBsZXRlKTsKICAgICAgICB0YXJnZXQuX2NvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgLy8gVGhpcyBvbmx5IGhhcHBlbnMgaWYgdGhlIGB0aGVuYCBjYWxsIHRocmV3IHN5bmNocm9ub3VzbHkgd2hlbiBnaXZlbgogICAgICAvLyB2YWxpZCBhcmd1bWVudHMuCiAgICAgIC8vIFRoYXQgcmVxdWlyZXMgYSBub24tY29uZm9ybWluZyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRnV0dXJlIGludGVyZmFjZSwKICAgICAgLy8gd2hpY2ggc2hvdWxkLCBob3BlZnVsbHksIG5ldmVyIGhhcHBlbi4KICAgICAgc2NoZWR1bGVNaWNyb3Rhc2soKCkgewogICAgICAgIHRhcmdldC5fY29tcGxldGVFcnJvcihlLCBzKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICAvLyBUYWtlIHRoZSB2YWx1ZSAod2hlbiBjb21wbGV0ZWQpIG9mIHNvdXJjZSBhbmQgY29tcGxldGUgdGFyZ2V0IHdpdGggdGhhdAogIC8vIHZhbHVlIChvciBlcnJvcikuIFRoaXMgZnVuY3Rpb24gZXhwZWN0cyB0aGF0IHNvdXJjZSBpcyBhIF9GdXR1cmUuCiAgc3RhdGljIHZvaWQgX2NoYWluQ29yZUZ1dHVyZShfRnV0dXJlIHNvdXJjZSwgX0Z1dHVyZSB0YXJnZXQpIHsKICAgIGFzc2VydCh0YXJnZXQuX21heUFkZExpc3RlbmVyKTsgLy8gTm90IGNvbXBsZXRlZCwgbm90IGFscmVhZHkgY2hhaW5lZC4KICAgIHdoaWxlIChzb3VyY2UuX2lzQ2hhaW5lZCkgewogICAgICBzb3VyY2UgPSBzb3VyY2UuX2NoYWluU291cmNlOwogICAgfQogICAgaWYgKHNvdXJjZS5faXNDb21wbGV0ZSkgewogICAgICBfRnV0dXJlTGlzdGVuZXIgbGlzdGVuZXJzID0gdGFyZ2V0Ll9yZW1vdmVMaXN0ZW5lcnMoKTsKICAgICAgdGFyZ2V0Ll9jbG9uZVJlc3VsdChzb3VyY2UpOwogICAgICBfcHJvcGFnYXRlVG9MaXN0ZW5lcnModGFyZ2V0LCBsaXN0ZW5lcnMpOwogICAgfSBlbHNlIHsKICAgICAgX0Z1dHVyZUxpc3RlbmVyIGxpc3RlbmVycyA9IHRhcmdldC5fcmVzdWx0T3JMaXN0ZW5lcnM7CiAgICAgIHRhcmdldC5fc2V0Q2hhaW5lZChzb3VyY2UpOwogICAgICBzb3VyY2UuX3ByZXBlbmRMaXN0ZW5lcnMobGlzdGVuZXJzKTsKICAgIH0KICB9CgogIHZvaWQgX2NvbXBsZXRlKEZ1dHVyZU9yPFQ+IHZhbHVlKSB7CiAgICBhc3NlcnQoIV9pc0NvbXBsZXRlKTsKICAgIGlmICh2YWx1ZSBpcyBGdXR1cmU8VD4pIHsKICAgICAgaWYgKHZhbHVlIGlzIF9GdXR1cmU8VD4pIHsKICAgICAgICBfY2hhaW5Db3JlRnV0dXJlKHZhbHVlLCB0aGlzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfY2hhaW5Gb3JlaWduRnV0dXJlKHZhbHVlLCB0aGlzKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgX0Z1dHVyZUxpc3RlbmVyIGxpc3RlbmVycyA9IF9yZW1vdmVMaXN0ZW5lcnMoKTsKICAgICAgX3NldFZhbHVlKHZhbHVlKTsKICAgICAgX3Byb3BhZ2F0ZVRvTGlzdGVuZXJzKHRoaXMsIGxpc3RlbmVycyk7CiAgICB9CiAgfQoKICB2b2lkIF9jb21wbGV0ZVdpdGhWYWx1ZShUIHZhbHVlKSB7CiAgICBhc3NlcnQoIV9pc0NvbXBsZXRlKTsKICAgIGFzc2VydCh2YWx1ZSBpcyEgRnV0dXJlPFQ+KTsKCiAgICBfRnV0dXJlTGlzdGVuZXIgbGlzdGVuZXJzID0gX3JlbW92ZUxpc3RlbmVycygpOwogICAgX3NldFZhbHVlKHZhbHVlKTsKICAgIF9wcm9wYWdhdGVUb0xpc3RlbmVycyh0aGlzLCBsaXN0ZW5lcnMpOwogIH0KCiAgdm9pZCBfY29tcGxldGVFcnJvcihPYmplY3QgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICBhc3NlcnQoIV9pc0NvbXBsZXRlKTsKCiAgICBfRnV0dXJlTGlzdGVuZXIgbGlzdGVuZXJzID0gX3JlbW92ZUxpc3RlbmVycygpOwogICAgX3NldEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgIF9wcm9wYWdhdGVUb0xpc3RlbmVycyh0aGlzLCBsaXN0ZW5lcnMpOwogIH0KCiAgdm9pZCBfYXN5bmNDb21wbGV0ZShGdXR1cmVPcjxUPiB2YWx1ZSkgewogICAgYXNzZXJ0KCFfaXNDb21wbGV0ZSk7CiAgICAvLyBUd28gY29ybmVyIGNhc2VzIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1dHVyZToKICAgIC8vICAgMS4gdGhlIGZ1dHVyZSBpcyBhbHJlYWR5IGNvbXBsZXRlZCBhbmQgYW4gZXJyb3IuCiAgICAvLyAgIDIuIHRoZSBmdXR1cmUgaXMgbm90IHlldCBjb21wbGV0ZWQgYnV0IG1pZ2h0IGJlY29tZSBhbiBlcnJvci4KICAgIC8vIFRoZSBmaXJzdCBjYXNlIG1lYW5zIHRoYXQgd2UgbXVzdCBub3QgaW1tZWRpYXRlbHkgY29tcGxldGUgdGhlIEZ1dHVyZSwKICAgIC8vIGFzIG91ciBjb2RlIHdvdWxkIGltbWVkaWF0ZWx5IHN0YXJ0IHByb3BhZ2F0aW5nIHRoZSBlcnJvciB3aXRob3V0CiAgICAvLyBnaXZpbmcgdGhlIHRpbWUgdG8gaW5zdGFsbCBlcnJvci1oYW5kbGVycy4KICAgIC8vIEhvd2V2ZXIgdGhlIHNlY29uZCBjYXNlIHJlcXVpcmVzIHVzIHRvIGRlYWwgd2l0aCB0aGUgdmFsdWUgaW1tZWRpYXRlbHkuCiAgICAvLyBPdGhlcndpc2UgdGhlIHZhbHVlIGNvdWxkIGNvbXBsZXRlIHdpdGggYW4gZXJyb3IgYW5kIHJlcG9ydCBhbgogICAgLy8gdW5oYW5kbGVkIGVycm9yLCBldmVuIHRob3VnaCB3ZSBrbm93IHdlIGFyZSBhbHJlYWR5IGdvaW5nIHRvIGxpc3RlbiB0bwogICAgLy8gaXQuCgogICAgaWYgKHZhbHVlIGlzIEZ1dHVyZTxUPikgewogICAgICBfY2hhaW5GdXR1cmUodmFsdWUpOwogICAgICByZXR1cm47CiAgICB9CiAgICBfc2V0UGVuZGluZ0NvbXBsZXRlKCk7CiAgICBfem9uZS5zY2hlZHVsZU1pY3JvdGFzaygoKSB7CiAgICAgIF9jb21wbGV0ZVdpdGhWYWx1ZSh2YWx1ZSk7CiAgICB9KTsKICB9CgogIHZvaWQgX2NoYWluRnV0dXJlKEZ1dHVyZTxUPiB2YWx1ZSkgewogICAgaWYgKHZhbHVlIGlzIF9GdXR1cmU8VD4pIHsKICAgICAgaWYgKHZhbHVlLl9oYXNFcnJvcikgewogICAgICAgIC8vIERlbGF5IGNvbXBsZXRpb24gdG8gYWxsb3cgdGhlIHVzZXIgdG8gcmVnaXN0ZXIgY2FsbGJhY2tzLgogICAgICAgIF9zZXRQZW5kaW5nQ29tcGxldGUoKTsKICAgICAgICBfem9uZS5zY2hlZHVsZU1pY3JvdGFzaygoKSB7CiAgICAgICAgICBfY2hhaW5Db3JlRnV0dXJlKHZhbHVlLCB0aGlzKTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfY2hhaW5Db3JlRnV0dXJlKHZhbHVlLCB0aGlzKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBKdXN0IGxpc3RlbiBvbiB0aGUgZm9yZWlnbiBmdXR1cmUuIFRoaXMgZ3VhcmFudGVlcyBhbiBhc3luYyBkZWxheS4KICAgIF9jaGFpbkZvcmVpZ25GdXR1cmUodmFsdWUsIHRoaXMpOwogIH0KCiAgdm9pZCBfYXN5bmNDb21wbGV0ZUVycm9yKGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgIGFzc2VydCghX2lzQ29tcGxldGUpOwoKICAgIF9zZXRQZW5kaW5nQ29tcGxldGUoKTsKICAgIF96b25lLnNjaGVkdWxlTWljcm90YXNrKCgpIHsKICAgICAgX2NvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgfSk7CiAgfQoKICAvKioKICAgKiBQcm9wYWdhdGVzIHRoZSB2YWx1ZS9lcnJvciBvZiBbc291cmNlXSB0byBpdHMgW2xpc3RlbmVyc10sIGV4ZWN1dGluZyB0aGUKICAgKiBsaXN0ZW5lcnMnIGNhbGxiYWNrcy4KICAgKi8KICBzdGF0aWMgdm9pZCBfcHJvcGFnYXRlVG9MaXN0ZW5lcnMoX0Z1dHVyZSBzb3VyY2UsIF9GdXR1cmVMaXN0ZW5lciBsaXN0ZW5lcnMpIHsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGFzc2VydChzb3VyY2UuX2lzQ29tcGxldGUpOwogICAgICBib29sIGhhc0Vycm9yID0gc291cmNlLl9oYXNFcnJvcjsKICAgICAgaWYgKGxpc3RlbmVycyA9PSBudWxsKSB7CiAgICAgICAgaWYgKGhhc0Vycm9yKSB7CiAgICAgICAgICBBc3luY0Vycm9yIGFzeW5jRXJyb3IgPSBzb3VyY2UuX2Vycm9yOwogICAgICAgICAgc291cmNlLl96b25lCiAgICAgICAgICAgICAgLmhhbmRsZVVuY2F1Z2h0RXJyb3IoYXN5bmNFcnJvci5lcnJvciwgYXN5bmNFcnJvci5zdGFja1RyYWNlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIFVzdWFsbHkgZnV0dXJlcyBvbmx5IGhhdmUgb25lIGxpc3RlbmVyLiBJZiB0aGV5IGhhdmUgc2V2ZXJhbCwgd2UKICAgICAgLy8gY2FsbCBoYW5kbGUgdGhlbSBzZXBhcmF0ZWx5IGluIHJlY3Vyc2l2ZSBjYWxscywgY29udGludWluZwogICAgICAvLyBoZXJlIG9ubHkgd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBsaXN0ZW5lciBsZWZ0LgogICAgICB3aGlsZSAobGlzdGVuZXJzLl9uZXh0TGlzdGVuZXIgIT0gbnVsbCkgewogICAgICAgIF9GdXR1cmVMaXN0ZW5lciBsaXN0ZW5lciA9IGxpc3RlbmVyczsKICAgICAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lci5fbmV4dExpc3RlbmVyOwogICAgICAgIGxpc3RlbmVyLl9uZXh0TGlzdGVuZXIgPSBudWxsOwogICAgICAgIF9wcm9wYWdhdGVUb0xpc3RlbmVycyhzb3VyY2UsIGxpc3RlbmVyKTsKICAgICAgfQogICAgICBfRnV0dXJlTGlzdGVuZXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnM7CiAgICAgIGZpbmFsIHNvdXJjZVJlc3VsdCA9IHNvdXJjZS5fcmVzdWx0T3JMaXN0ZW5lcnM7CiAgICAgIC8vIERvIHRoZSBhY3R1YWwgcHJvcGFnYXRpb24uCiAgICAgIC8vIFNldCBpbml0aWFsIHN0YXRlIG9mIGxpc3RlbmVySGFzRXJyb3IgYW5kIGxpc3RlbmVyVmFsdWVPckVycm9yLiBUaGVzZQogICAgICAvLyB2YXJpYWJsZXMgYXJlIHVwZGF0ZWQgd2l0aCB0aGUgb3V0Y29tZSBvZiBwb3RlbnRpYWwgY2FsbGJhY2tzLgogICAgICAvLyBOb24tZXJyb3IgcmVzdWx0cywgaW5jbHVkaW5nIGZ1dHVyZXMsIGFyZSBzdG9yZWQgaW4KICAgICAgLy8gbGlzdGVuZXJWYWx1ZU9yRXJyb3IgYW5kIGxpc3RlbmVySGFzRXJyb3IgaXMgc2V0IHRvIGZhbHNlLiBFcnJvcnMKICAgICAgLy8gYXJlIHN0b3JlZCBpbiBsaXN0ZW5lclZhbHVlT3JFcnJvciBhcyBhbiBbQXN5bmNFcnJvcl0gYW5kCiAgICAgIC8vIGxpc3RlbmVySGFzRXJyb3IgaXMgc2V0IHRvIHRydWUuCiAgICAgIGJvb2wgbGlzdGVuZXJIYXNFcnJvciA9IGhhc0Vycm9yOwogICAgICB2YXIgbGlzdGVuZXJWYWx1ZU9yRXJyb3IgPSBzb3VyY2VSZXN1bHQ7CgogICAgICAvLyBPbmx5IGlmIHdlIGVpdGhlciBoYXZlIGFuIGVycm9yIG9yIGNhbGxiYWNrcywgZ28gaW50byB0aGlzLCBzb21ld2hhdAogICAgICAvLyBleHBlbnNpdmUsIGJyYW5jaC4gSGVyZSB3ZSdsbCBlbnRlci9sZWF2ZSB0aGUgem9uZS4gTWFueSBmdXR1cmVzCiAgICAgIC8vIGRvbid0IGhhdmUgY2FsbGJhY2tzLCBzbyB0aGlzIGlzIGEgc2lnbmlmaWNhbnQgb3B0aW1pemF0aW9uLgogICAgICBpZiAoaGFzRXJyb3IgfHwgbGlzdGVuZXIuaGFuZGxlc1ZhbHVlIHx8IGxpc3RlbmVyLmhhbmRsZXNDb21wbGV0ZSkgewogICAgICAgIFpvbmUgem9uZSA9IGxpc3RlbmVyLl96b25lOwogICAgICAgIGlmIChoYXNFcnJvciAmJiAhc291cmNlLl96b25lLmluU2FtZUVycm9yWm9uZSh6b25lKSkgewogICAgICAgICAgLy8gRG9uJ3QgY3Jvc3Mgem9uZSBib3VuZGFyaWVzIHdpdGggZXJyb3JzLgogICAgICAgICAgQXN5bmNFcnJvciBhc3luY0Vycm9yID0gc291cmNlLl9lcnJvcjsKICAgICAgICAgIHNvdXJjZS5fem9uZQogICAgICAgICAgICAgIC5oYW5kbGVVbmNhdWdodEVycm9yKGFzeW5jRXJyb3IuZXJyb3IsIGFzeW5jRXJyb3Iuc3RhY2tUcmFjZSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBab25lIG9sZFpvbmU7CiAgICAgICAgaWYgKCFpZGVudGljYWwoWm9uZS5jdXJyZW50LCB6b25lKSkgewogICAgICAgICAgLy8gQ2hhbmdlIHpvbmUgaWYgaXQncyBub3QgY3VycmVudC4KICAgICAgICAgIG9sZFpvbmUgPSBab25lLl9lbnRlcih6b25lKTsKICAgICAgICB9CgogICAgICAgIC8vIFRoZXNlIGNhbGxiYWNrcyBhcmUgYWJzdHJhY3RlZCB0byBpc29sYXRlIHRoZSB0cnkvY2F0Y2ggYmxvY2tzCiAgICAgICAgLy8gZnJvbSB0aGUgcmVzdCBvZiB0aGUgY29kZSB0byB3b3JrIGFyb3VuZCBhIFY4IGdsYXNzIGphdy4KICAgICAgICB2b2lkIGhhbmRsZVdoZW5Db21wbGV0ZUNhbGxiYWNrKCkgewogICAgICAgICAgLy8gVGhlIHdoZW5Db21wbGV0ZS1oYW5kbGVyIGlzIG5vdCBjb21iaW5lZCB3aXRoIG5vcm1hbCB2YWx1ZS9lcnJvcgogICAgICAgICAgLy8gaGFuZGxpbmcuIFRoaXMgbWVhbnMgYXQgbW9zdCBvbmUgaGFuZGxlWCBtZXRob2QgaXMgY2FsbGVkIHBlcgogICAgICAgICAgLy8gbGlzdGVuZXIuCiAgICAgICAgICBhc3NlcnQoIWxpc3RlbmVyLmhhbmRsZXNWYWx1ZSk7CiAgICAgICAgICBhc3NlcnQoIWxpc3RlbmVyLmhhbmRsZXNFcnJvcik7CiAgICAgICAgICB2YXIgY29tcGxldGVSZXN1bHQ7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBjb21wbGV0ZVJlc3VsdCA9IGxpc3RlbmVyLmhhbmRsZVdoZW5Db21wbGV0ZSgpOwogICAgICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgICAgICBpZiAoaGFzRXJyb3IgJiYgaWRlbnRpY2FsKHNvdXJjZS5fZXJyb3IuZXJyb3IsIGUpKSB7CiAgICAgICAgICAgICAgbGlzdGVuZXJWYWx1ZU9yRXJyb3IgPSBzb3VyY2UuX2Vycm9yOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGxpc3RlbmVyVmFsdWVPckVycm9yID0gbmV3IEFzeW5jRXJyb3IoZSwgcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGlzdGVuZXJIYXNFcnJvciA9IHRydWU7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjb21wbGV0ZVJlc3VsdCBpcyBGdXR1cmUpIHsKICAgICAgICAgICAgaWYgKGNvbXBsZXRlUmVzdWx0IGlzIF9GdXR1cmUgJiYgY29tcGxldGVSZXN1bHQuX2lzQ29tcGxldGUpIHsKICAgICAgICAgICAgICBpZiAoY29tcGxldGVSZXN1bHQuX2hhc0Vycm9yKSB7CiAgICAgICAgICAgICAgICBsaXN0ZW5lclZhbHVlT3JFcnJvciA9IGNvbXBsZXRlUmVzdWx0Ll9lcnJvcjsKICAgICAgICAgICAgICAgIGxpc3RlbmVySGFzRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgdXNlIHRoZSBleGlzdGluZyByZXN1bHQgb2Ygc291cmNlLgogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBXZSBoYXZlIHRvIHdhaXQgZm9yIHRoZSBjb21wbGV0ZVJlc3VsdCBmdXR1cmUgdG8gY29tcGxldGUKICAgICAgICAgICAgLy8gYmVmb3JlIGtub3dpbmcgaWYgaXQncyBhbiBlcnJvciBvciB3ZSBzaG91bGQgdXNlIHRoZSByZXN1bHQKICAgICAgICAgICAgLy8gb2Ygc291cmNlLgogICAgICAgICAgICB2YXIgb3JpZ2luYWxTb3VyY2UgPSBzb3VyY2U7CiAgICAgICAgICAgIGxpc3RlbmVyVmFsdWVPckVycm9yID0gY29tcGxldGVSZXN1bHQudGhlbigoXykgPT4gb3JpZ2luYWxTb3VyY2UpOwogICAgICAgICAgICBsaXN0ZW5lckhhc0Vycm9yID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2b2lkIGhhbmRsZVZhbHVlQ2FsbGJhY2soKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBsaXN0ZW5lclZhbHVlT3JFcnJvciA9IGxpc3RlbmVyLmhhbmRsZVZhbHVlKHNvdXJjZVJlc3VsdCk7CiAgICAgICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgICAgIGxpc3RlbmVyVmFsdWVPckVycm9yID0gbmV3IEFzeW5jRXJyb3IoZSwgcyk7CiAgICAgICAgICAgIGxpc3RlbmVySGFzRXJyb3IgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdm9pZCBoYW5kbGVFcnJvcigpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIEFzeW5jRXJyb3IgYXN5bmNFcnJvciA9IHNvdXJjZS5fZXJyb3I7CiAgICAgICAgICAgIGlmIChsaXN0ZW5lci5tYXRjaGVzRXJyb3JUZXN0KGFzeW5jRXJyb3IpICYmCiAgICAgICAgICAgICAgICBsaXN0ZW5lci5oYXNFcnJvckNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgbGlzdGVuZXJWYWx1ZU9yRXJyb3IgPSBsaXN0ZW5lci5oYW5kbGVFcnJvcihhc3luY0Vycm9yKTsKICAgICAgICAgICAgICBsaXN0ZW5lckhhc0Vycm9yID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgICAgICAgaWYgKGlkZW50aWNhbChzb3VyY2UuX2Vycm9yLmVycm9yLCBlKSkgewogICAgICAgICAgICAgIGxpc3RlbmVyVmFsdWVPckVycm9yID0gc291cmNlLl9lcnJvcjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBsaXN0ZW5lclZhbHVlT3JFcnJvciA9IG5ldyBBc3luY0Vycm9yKGUsIHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxpc3RlbmVySGFzRXJyb3IgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGxpc3RlbmVyLmhhbmRsZXNDb21wbGV0ZSkgewogICAgICAgICAgaGFuZGxlV2hlbkNvbXBsZXRlQ2FsbGJhY2soKTsKICAgICAgICB9IGVsc2UgaWYgKCFoYXNFcnJvcikgewogICAgICAgICAgaWYgKGxpc3RlbmVyLmhhbmRsZXNWYWx1ZSkgewogICAgICAgICAgICBoYW5kbGVWYWx1ZUNhbGxiYWNrKCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChsaXN0ZW5lci5oYW5kbGVzRXJyb3IpIHsKICAgICAgICAgICAgaGFuZGxlRXJyb3IoKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIElmIHdlIGNoYW5nZWQgem9uZSwgb2xkWm9uZSB3aWxsIG5vdCBiZSBudWxsLgogICAgICAgIGlmIChvbGRab25lICE9IG51bGwpIFpvbmUuX2xlYXZlKG9sZFpvbmUpOwoKICAgICAgICAvLyBJZiB0aGUgbGlzdGVuZXIncyB2YWx1ZSBpcyBhIGZ1dHVyZSB3ZSBuZWVkIHRvIGNoYWluIGl0LiBOb3RlIHRoYXQKICAgICAgICAvLyB0aGlzIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGVyZSBpcyBhIGNhbGxiYWNrLgogICAgICAgIGlmIChsaXN0ZW5lclZhbHVlT3JFcnJvciBpcyBGdXR1cmUpIHsKICAgICAgICAgIEZ1dHVyZSBjaGFpblNvdXJjZSA9IGxpc3RlbmVyVmFsdWVPckVycm9yOwogICAgICAgICAgLy8gU2hvcnRjdXQgaWYgdGhlIGNoYWluLXNvdXJjZSBpcyBhbHJlYWR5IGNvbXBsZXRlZC4gSnVzdCBjb250aW51ZQogICAgICAgICAgLy8gdGhlIGxvb3AuCiAgICAgICAgICBfRnV0dXJlIHJlc3VsdCA9IGxpc3RlbmVyLnJlc3VsdDsKICAgICAgICAgIGlmIChjaGFpblNvdXJjZSBpcyBfRnV0dXJlKSB7CiAgICAgICAgICAgIGlmIChjaGFpblNvdXJjZS5faXNDb21wbGV0ZSkgewogICAgICAgICAgICAgIGxpc3RlbmVycyA9IHJlc3VsdC5fcmVtb3ZlTGlzdGVuZXJzKCk7CiAgICAgICAgICAgICAgcmVzdWx0Ll9jbG9uZVJlc3VsdChjaGFpblNvdXJjZSk7CiAgICAgICAgICAgICAgc291cmNlID0gY2hhaW5Tb3VyY2U7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgX2NoYWluQ29yZUZ1dHVyZShjaGFpblNvdXJjZSwgcmVzdWx0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX2NoYWluRm9yZWlnbkZ1dHVyZShjaGFpblNvdXJjZSwgcmVzdWx0KTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgICAgX0Z1dHVyZSByZXN1bHQgPSBsaXN0ZW5lci5yZXN1bHQ7CiAgICAgIGxpc3RlbmVycyA9IHJlc3VsdC5fcmVtb3ZlTGlzdGVuZXJzKCk7CiAgICAgIGlmICghbGlzdGVuZXJIYXNFcnJvcikgewogICAgICAgIHJlc3VsdC5fc2V0VmFsdWUobGlzdGVuZXJWYWx1ZU9yRXJyb3IpOwogICAgICB9IGVsc2UgewogICAgICAgIEFzeW5jRXJyb3IgYXN5bmNFcnJvciA9IGxpc3RlbmVyVmFsdWVPckVycm9yOwogICAgICAgIHJlc3VsdC5fc2V0RXJyb3JPYmplY3QoYXN5bmNFcnJvcik7CiAgICAgIH0KICAgICAgLy8gUHJlcGFyZSBmb3IgbmV4dCByb3VuZC4KICAgICAgc291cmNlID0gcmVzdWx0OwogICAgfQogIH0KCiAgRnV0dXJlPFQ+IHRpbWVvdXQoRHVyYXRpb24gdGltZUxpbWl0LCB7RnV0dXJlT3I8VD4gb25UaW1lb3V0KCl9KSB7CiAgICBpZiAoX2lzQ29tcGxldGUpIHJldHVybiBuZXcgX0Z1dHVyZS5pbW1lZGlhdGUodGhpcyk7CiAgICBfRnV0dXJlPFQ+IHJlc3VsdCA9IG5ldyBfRnV0dXJlPFQ+KCk7CiAgICBUaW1lciB0aW1lcjsKICAgIGlmIChvblRpbWVvdXQgPT0gbnVsbCkgewogICAgICB0aW1lciA9IG5ldyBUaW1lcih0aW1lTGltaXQsICgpIHsKICAgICAgICByZXN1bHQuX2NvbXBsZXRlRXJyb3IoCiAgICAgICAgICAgIG5ldyBUaW1lb3V0RXhjZXB0aW9uKCJGdXR1cmUgbm90IGNvbXBsZXRlZCIsIHRpbWVMaW1pdCkpOwogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIFpvbmUgem9uZSA9IFpvbmUuY3VycmVudDsKICAgICAgb25UaW1lb3V0ID0gem9uZS5yZWdpc3RlckNhbGxiYWNrKG9uVGltZW91dCk7CiAgICAgIHRpbWVyID0gbmV3IFRpbWVyKHRpbWVMaW1pdCwgKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICByZXN1bHQuX2NvbXBsZXRlKHpvbmUucnVuKG9uVGltZW91dCkpOwogICAgICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgICAgIHJlc3VsdC5fY29tcGxldGVFcnJvcihlLCBzKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgdGhpcy50aGVuKChUIHYpIHsKICAgICAgaWYgKHRpbWVyLmlzQWN0aXZlKSB7CiAgICAgICAgdGltZXIuY2FuY2VsKCk7CiAgICAgICAgcmVzdWx0Ll9jb21wbGV0ZVdpdGhWYWx1ZSh2KTsKICAgICAgfQogICAgfSwgb25FcnJvcjogKGUsIFN0YWNrVHJhY2UgcykgewogICAgICBpZiAodGltZXIuaXNBY3RpdmUpIHsKICAgICAgICB0aW1lci5jYW5jZWwoKTsKICAgICAgICByZXN1bHQuX2NvbXBsZXRlRXJyb3IoZSwgcyk7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KCi8vLyBSZWdpc3RlcnMgZXJyb3JIYW5kbGVyIGluIHpvbmUgaWYgaXQgaGFzIHRoZSBjb3JyZWN0IHR5cGUuCi8vLwovLy8gQ2hlY2tzIHRoYXQgdGhlIGZ1bmN0aW9uIGFjY2VwdHMgZWl0aGVyIGFuIFtPYmplY3RdIGFuZCBhIFtTdGFja1RyYWNlXQovLy8gb3IganVzdCBvbmUgW09iamVjdF0uIERvZXMgbm90IGNoZWNrIHRoZSByZXR1cm4gdHlwZS4KLy8vIFRoZSBhY3R1YWxseSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGBGdXR1cmVPcjxSPmAgd2hlcmUgYFJgIGlzIHRoZQovLy8gdmFsdWUgdHlwZSBvZiB0aGUgZnV0dXJlIHRoYXQgdGhlIGNhbGwgd2lsbCBjb21wbGV0ZSAoZWl0aGVyIHJldHVybmVkCi8vLyBieSBbRnV0dXJlLnRoZW5dIG9yIFtGdXR1cmUuY2F0Y2hFcnJvcl0pLiBXZSBjaGVjayB0aGUgcmV0dXJuZWQgdmFsdWUKLy8vIGR5bmFtaWNhbGx5IGJlY2F1c2UgdGhlIGZ1bmN0aW9ucyBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyBpbiBwb3NpdGlvbnMKLy8vIHdpdGhvdXQgaW5mZXJlbmNlLCBzbyBhIGZ1bmN0aW9uIGV4cHJlc3Npb24gd29uJ3QgaW5mZXIgdGhlIHJldHVybiB0eXBlLgovLy8KLy8vIFRocm93cyBpZiB0aGUgdHlwZSBpcyBub3QgdmFsaWQuCkZ1bmN0aW9uIF9yZWdpc3RlckVycm9ySGFuZGxlcihGdW5jdGlvbiBlcnJvckhhbmRsZXIsIFpvbmUgem9uZSkgewogIGlmIChlcnJvckhhbmRsZXIgaXMgZHluYW1pYyBGdW5jdGlvbihPYmplY3QsIFN0YWNrVHJhY2UpKSB7CiAgICByZXR1cm4gem9uZQogICAgICAgIC5yZWdpc3RlckJpbmFyeUNhbGxiYWNrPGR5bmFtaWMsIE9iamVjdCwgU3RhY2tUcmFjZT4oZXJyb3JIYW5kbGVyKTsKICB9CiAgaWYgKGVycm9ySGFuZGxlciBpcyBkeW5hbWljIEZ1bmN0aW9uKE9iamVjdCkpIHsKICAgIHJldHVybiB6b25lLnJlZ2lzdGVyVW5hcnlDYWxsYmFjazxkeW5hbWljLCBPYmplY3Q+KGVycm9ySGFuZGxlcik7CiAgfQogIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKAogICAgICBlcnJvckhhbmRsZXIsCiAgICAgICJvbkVycm9yIiwKICAgICAgIkVycm9yIGhhbmRsZXIgbXVzdCBhY2NlcHQgb25lIE9iamVjdCBvciBvbmUgT2JqZWN0IGFuZCBhIFN0YWNrVHJhY2UiCiAgICAgICIgYXMgYXJndW1lbnRzLCBhbmQgcmV0dXJuIGEgYSB2YWxpZCByZXN1bHQiKTsKfQqDBwBOTjwBFAFKM0QtHSEBNy4BJgE+IlBMHzArBicEATwBTSQwAgExJ1AiBAE9MwQCATAnUB0EAT0uBAIBHiIiJikjKj0wRDlAIT0bHhM0Gx8gARhJHCdIAU1MATseIwEiATU1OzwBJhoVBAEqJBoVBAEqHRUEATMGSB4aHQQBLEMEATEkRwQBMy5ESkdBO0MNOU8GBAEhGysEAgEoPj4jKQFHSSsuAUg+NiYBOSQBOiQBNiEBBi43BUVFBhQBBj8FPTwFR0kuBU1QKTYGGgEuJAFBHAQBQSsWBAE9HywEAURAATdCPzIxLwElHRwhBAFCJS5AHU4mMj8IBjMEASkoMipGEwQBPyovPkkGTxMEAS0qLz8GShMEAToBHxokBAEhIB8EARoXHwQBHRgfBAEpHEAaIAQBK0AaIAQBODgEAT8GRyYaIBw0BAEwLBszJQ0YOEIeJyMpEgoeCBsvIy8KBgQBNiMbPiYnLC8pCjIIDRg4Qh4nIy8SCh4IGzAjMAoGBAEnTBsaMh8nBAFBGikeNCQWFgYRBAFNTEkTQyEgAUAiChwrQys7TSEJUE1RGzYrMgoVTRpQMB0lCgYEAU1HQUsgJAYePSMwDT0iKwYEASYaHiEnDyoIDTYYLgYEASUaIQE0FiwEAT8aATQiLAQBKxoyOkdOSTJPRk4LAR4bDgYbISEIBAEnHx1FHyUpDA8nCA4GSiYEATsaARshKQgEAQZOGwZREyIoHxgxF00KEAhKRDkwLiwnMQgsNiRPSD1LQyooLwFOSkZLJD82MRdNEgoBFi4uJwoBSkQsTksXKioeEDwbQTQVOw4lFAwqSy4+KRA+Fg5JSxopTyYMCgElEEcbOSUMCgEdEDM5LUcoDhs1NBU7DiUMCgEoKCAnIwwRJxsMCgE5MwFOOC41ThcsKCs1MCQYFTUOEzYMEgoIKC0fMA82LAghFwYEAUU5KhEdKB9GCg0gNCgOMRknCgoGFhwYJggkHBglCAgTBAIBPwRLOkdKSktNBCVDPhBMBDJGBCEUEUw1AgEbZGFydDphc3luYy9mdXR1cmVfaW1wbC5kYXJ0OW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9hc3luYy9zY2hlZHVsZV9taWNyb3Rhc2suZGFydJMOLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5hc3luYzsKCnR5cGVkZWYgdm9pZCBfQXN5bmNDYWxsYmFjaygpOwoKY2xhc3MgX0FzeW5jQ2FsbGJhY2tFbnRyeSB7CiAgZmluYWwgX0FzeW5jQ2FsbGJhY2sgY2FsbGJhY2s7CiAgX0FzeW5jQ2FsbGJhY2tFbnRyeSBuZXh0OwogIF9Bc3luY0NhbGxiYWNrRW50cnkodGhpcy5jYWxsYmFjayk7Cn0KCi8qKiBIZWFkIG9mIHNpbmdsZSBsaW5rZWQgbGlzdCBvZiBwZW5kaW5nIGNhbGxiYWNrcy4gKi8KX0FzeW5jQ2FsbGJhY2tFbnRyeSBfbmV4dENhbGxiYWNrOwovKiogVGFpbCBvZiBzaW5nbGUgbGlua2VkIGxpc3Qgb2YgcGVuZGluZyBjYWxsYmFja3MuICovCl9Bc3luY0NhbGxiYWNrRW50cnkgX2xhc3RDYWxsYmFjazsKLyoqCiAqIFRhaWwgb2YgcHJpb3JpdHkgY2FsbGJhY2tzIGFkZGVkIGJ5IHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGNhbGxiYWNrLgogKgogKiBQcmlvcml0eSBjYWxsYmFja3MgYXJlIHB1dCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQogKiBjYWxsYmFjayBxdWV1ZSwgc28gdGhhdCBpZiBvbmUgY2FsbGJhY2sgc2NoZWR1bGVzIG1vcmUgdGhhbiBvbmUKICogcHJpb3JpdHkgY2FsbGJhY2ssIHRoZXkgYXJlIHN0aWxsIGVucXVldWVkIGluIHNjaGVkdWxpbmcgb3JkZXIuCiAqLwpfQXN5bmNDYWxsYmFja0VudHJ5IF9sYXN0UHJpb3JpdHlDYWxsYmFjazsKLyoqCiAqIFdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBpbnNpZGUgdGhlIGNhbGxiYWNrIGxvb3AuCiAqCiAqIElmIHdlIGFyZSBpbnNpZGUgdGhlIGxvb3AsIHdlIG5ldmVyIG5lZWQgdG8gc2NoZWR1bGUgdGhlIGxvb3AsCiAqIGV2ZW4gaWYgYWRkaW5nIGEgZmlyc3QgZWxlbWVudC4KICovCmJvb2wgX2lzSW5DYWxsYmFja0xvb3AgPSBmYWxzZTsKCnZvaWQgX21pY3JvdGFza0xvb3AoKSB7CiAgd2hpbGUgKF9uZXh0Q2FsbGJhY2sgIT0gbnVsbCkgewogICAgX2xhc3RQcmlvcml0eUNhbGxiYWNrID0gbnVsbDsKICAgIF9Bc3luY0NhbGxiYWNrRW50cnkgZW50cnkgPSBfbmV4dENhbGxiYWNrOwogICAgX25leHRDYWxsYmFjayA9IGVudHJ5Lm5leHQ7CiAgICBpZiAoX25leHRDYWxsYmFjayA9PSBudWxsKSBfbGFzdENhbGxiYWNrID0gbnVsbDsKICAgIChlbnRyeS5jYWxsYmFjaykoKTsKICB9Cn0KCnZvaWQgX3N0YXJ0TWljcm90YXNrTG9vcCgpIHsKICBfaXNJbkNhbGxiYWNrTG9vcCA9IHRydWU7CiAgdHJ5IHsKICAgIC8vIE1vdmVkIHRvIHNlcGFyYXRlIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5LWZpbmFsbHkgcHJldmVudHMKICAgIC8vIGdvb2Qgb3B0aW1pemF0aW9uLgogICAgX21pY3JvdGFza0xvb3AoKTsKICB9IGZpbmFsbHkgewogICAgX2xhc3RQcmlvcml0eUNhbGxiYWNrID0gbnVsbDsKICAgIF9pc0luQ2FsbGJhY2tMb29wID0gZmFsc2U7CiAgICBpZiAoX25leHRDYWxsYmFjayAhPSBudWxsKSB7CiAgICAgIF9Bc3luY1J1bi5fc2NoZWR1bGVJbW1lZGlhdGUoX3N0YXJ0TWljcm90YXNrTG9vcCk7CiAgICB9CiAgfQp9CgovKioKICogU2NoZWR1bGVzIGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIGFzIGEgbWljcm90YXNrLgogKgogKiBUaGUgbWljcm90YXNrIGlzIGNhbGxlZCBhZnRlciBhbGwgb3RoZXIgY3VycmVudGx5IHNjaGVkdWxlZAogKiBtaWNyb3Rhc2tzLCBidXQgYXMgcGFydCBvZiB0aGUgY3VycmVudCBzeXN0ZW0gZXZlbnQuCiAqLwp2b2lkIF9zY2hlZHVsZUFzeW5jQ2FsbGJhY2soX0FzeW5jQ2FsbGJhY2sgY2FsbGJhY2spIHsKICBfQXN5bmNDYWxsYmFja0VudHJ5IG5ld0VudHJ5ID0gbmV3IF9Bc3luY0NhbGxiYWNrRW50cnkoY2FsbGJhY2spOwogIGlmIChfbmV4dENhbGxiYWNrID09IG51bGwpIHsKICAgIF9uZXh0Q2FsbGJhY2sgPSBfbGFzdENhbGxiYWNrID0gbmV3RW50cnk7CiAgICBpZiAoIV9pc0luQ2FsbGJhY2tMb29wKSB7CiAgICAgIF9Bc3luY1J1bi5fc2NoZWR1bGVJbW1lZGlhdGUoX3N0YXJ0TWljcm90YXNrTG9vcCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIF9sYXN0Q2FsbGJhY2submV4dCA9IG5ld0VudHJ5OwogICAgX2xhc3RDYWxsYmFjayA9IG5ld0VudHJ5OwogIH0KfQoKLyoqCiAqIFNjaGVkdWxlcyBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBiZWZvcmUgYWxsIG90aGVyIGN1cnJlbnRseSBzY2hlZHVsZWQgb25lcy4KICoKICogVGhpcyBjYWxsYmFjayB0YWtlcyBwcmlvcml0eSBvdmVyIGV4aXN0aW5nIHNjaGVkdWxlZCBjYWxsYmFja3MuCiAqIEl0IGlzIG9ubHkgdXNlZCBpbnRlcm5hbGx5IHRvIGdpdmUgaGlnaGVyIHByaW9yaXR5IHRvIGVycm9yIHJlcG9ydGluZy4KICoKICogSXMgYWx3YXlzIHJ1biBpbiB0aGUgcm9vdCB6b25lLgogKi8Kdm9pZCBfc2NoZWR1bGVQcmlvcml0eUFzeW5jQ2FsbGJhY2soX0FzeW5jQ2FsbGJhY2sgY2FsbGJhY2spIHsKICBpZiAoX25leHRDYWxsYmFjayA9PSBudWxsKSB7CiAgICBfc2NoZWR1bGVBc3luY0NhbGxiYWNrKGNhbGxiYWNrKTsKICAgIF9sYXN0UHJpb3JpdHlDYWxsYmFjayA9IF9sYXN0Q2FsbGJhY2s7CiAgICByZXR1cm47CiAgfQogIF9Bc3luY0NhbGxiYWNrRW50cnkgZW50cnkgPSBuZXcgX0FzeW5jQ2FsbGJhY2tFbnRyeShjYWxsYmFjayk7CiAgaWYgKF9sYXN0UHJpb3JpdHlDYWxsYmFjayA9PSBudWxsKSB7CiAgICBlbnRyeS5uZXh0ID0gX25leHRDYWxsYmFjazsKICAgIF9uZXh0Q2FsbGJhY2sgPSBfbGFzdFByaW9yaXR5Q2FsbGJhY2sgPSBlbnRyeTsKICB9IGVsc2UgewogICAgZW50cnkubmV4dCA9IF9sYXN0UHJpb3JpdHlDYWxsYmFjay5uZXh0OwogICAgX2xhc3RQcmlvcml0eUNhbGxiYWNrLm5leHQgPSBlbnRyeTsKICAgIF9sYXN0UHJpb3JpdHlDYWxsYmFjayA9IGVudHJ5OwogICAgaWYgKGVudHJ5Lm5leHQgPT0gbnVsbCkgewogICAgICBfbGFzdENhbGxiYWNrID0gZW50cnk7CiAgICB9CiAgfQp9CgovKioKICogUnVucyBhIGZ1bmN0aW9uIGFzeW5jaHJvbm91c2x5LgogKgogKiBDYWxsYmFja3MgcmVnaXN0ZXJlZCB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gYXJlIGFsd2F5cyBleGVjdXRlZCBpbiBvcmRlciBhbmQKICogYXJlIGd1YXJhbnRlZWQgdG8gcnVuIGJlZm9yZSBvdGhlciBhc3luY2hyb25vdXMgZXZlbnRzIChsaWtlIFtUaW1lcl0gZXZlbnRzLAogKiBvciBET00gZXZlbnRzKS4KICoKICogKipXYXJuaW5nOioqIGl0IGlzIHBvc3NpYmxlIHRvIHN0YXJ2ZSB0aGUgRE9NIGJ5IHJlZ2lzdGVyaW5nIGFzeW5jaHJvbm91cwogKiBjYWxsYmFja3MgdGhyb3VnaCB0aGlzIG1ldGhvZC4gRm9yIGV4YW1wbGUgdGhlIGZvbGxvd2luZyBwcm9ncmFtIHJ1bnMKICogdGhlIGNhbGxiYWNrcyB3aXRob3V0IGV2ZXIgZ2l2aW5nIHRoZSBUaW1lciBjYWxsYmFjayBhIGNoYW5jZSB0byBleGVjdXRlOgogKgogKiAgICAgbWFpbigpIHsKICogICAgICAgVGltZXIucnVuKCgpIHsgcHJpbnQoImV4ZWN1dGVkIik7IH0pOyAgLy8gV2lsbCBuZXZlciBiZSBleGVjdXRlZC4KICogICAgICAgZm9vKCkgewogKiAgICAgICAgIHNjaGVkdWxlTWljcm90YXNrKGZvbyk7ICAvLyBTY2hlZHVsZXMgW2Zvb10gaW4gZnJvbnQgb2Ygb3RoZXIgZXZlbnRzLgogKiAgICAgICB9CiAqICAgICAgIGZvbygpOwogKiAgICAgfQogKgogKiAjIyBPdGhlciByZXNvdXJjZXMKICoKICogKiBbVGhlIEV2ZW50IExvb3AgYW5kIERhcnRdKGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy9hcnRpY2xlcy9ldmVudC1sb29wLyk6CiAqIExlYXJuIGhvdyBEYXJ0IGhhbmRsZXMgdGhlIGV2ZW50IHF1ZXVlIGFuZCBtaWNyb3Rhc2sgcXVldWUsIHNvIHlvdSBjYW4gd3JpdGUKICogYmV0dGVyIGFzeW5jaHJvbm91cyBjb2RlIHdpdGggZmV3ZXIgc3VycHJpc2VzLgogKi8Kdm9pZCBzY2hlZHVsZU1pY3JvdGFzayh2b2lkIGNhbGxiYWNrKCkpIHsKICBfWm9uZSBjdXJyZW50Wm9uZSA9IFpvbmUuY3VycmVudDsKICBpZiAoaWRlbnRpY2FsKF9yb290Wm9uZSwgY3VycmVudFpvbmUpKSB7CiAgICAvLyBObyBuZWVkIHRvIGJpbmQgdGhlIGNhbGxiYWNrLiBXZSBrbm93IHRoYXQgdGhlIHJvb3QncyBzY2hlZHVsZU1pY3JvdGFzawogICAgLy8gd2lsbCBiZSBpbnZva2VkIGluIHRoZSByb290IHpvbmUuCiAgICBfcm9vdFNjaGVkdWxlTWljcm90YXNrKG51bGwsIG51bGwsIF9yb290Wm9uZSwgY2FsbGJhY2spOwogICAgcmV0dXJuOwogIH0KICBfWm9uZUZ1bmN0aW9uIGltcGxlbWVudGF0aW9uID0gY3VycmVudFpvbmUuX3NjaGVkdWxlTWljcm90YXNrOwogIGlmIChpZGVudGljYWwoX3Jvb3Rab25lLCBpbXBsZW1lbnRhdGlvbi56b25lKSAmJgogICAgICBfcm9vdFpvbmUuaW5TYW1lRXJyb3Jab25lKGN1cnJlbnRab25lKSkgewogICAgX3Jvb3RTY2hlZHVsZU1pY3JvdGFzaygKICAgICAgICBudWxsLCBudWxsLCBjdXJyZW50Wm9uZSwgY3VycmVudFpvbmUucmVnaXN0ZXJDYWxsYmFjayhjYWxsYmFjaykpOwogICAgcmV0dXJuOwogIH0KICBab25lLmN1cnJlbnQuc2NoZWR1bGVNaWNyb3Rhc2soWm9uZS5jdXJyZW50LmJpbmRDYWxsYmFja0d1YXJkZWQoY2FsbGJhY2spKTsKfQoKY2xhc3MgX0FzeW5jUnVuIHsKICAvKiogU2NoZWR1bGUgdGhlIGdpdmVuIGNhbGxiYWNrIGJlZm9yZSBhbnkgb3RoZXIgZXZlbnQgaW4gdGhlIGV2ZW50LWxvb3AuICovCiAgZXh0ZXJuYWwgc3RhdGljIHZvaWQgX3NjaGVkdWxlSW1tZWRpYXRlKHZvaWQgY2FsbGJhY2soKSk7Cn0KgJsATk48ARQBHwEcIRwmAgE4IzgjBEkDNkNDBCsENgNCIwQgARgiIi8gNRgEAgEdHAg/GhYOIh8hOQYEAgEENQM/OAQ3RB8uHjkGCyMeBAIBBFADQ0oDIwQ/HyYrDARBJyAzCy0oIx4dBgQCAQQjA09QEwNNSU0DEEsRUQsQCQMWA09QMgQqJCtPKT0MBEEzMBxKDAROAgESTzwCASJkYXJ0OmFzeW5jL3NjaGVkdWxlX21pY3JvdGFzay5kYXJ0LW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9hc3luYy9zdHJlYW0uZGFydMABMnYvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmFzeW5jOwoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBDb3JlIFN0cmVhbSB0eXBlcwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp0eXBlZGVmIHZvaWQgX1RpbWVyQ2FsbGJhY2soKTsKCi8qKgogKiBBIHNvdXJjZSBvZiBhc3luY2hyb25vdXMgZGF0YSBldmVudHMuCiAqCiAqIEEgU3RyZWFtIHByb3ZpZGVzIGEgd2F5IHRvIHJlY2VpdmUgYSBzZXF1ZW5jZSBvZiBldmVudHMuCiAqIEVhY2ggZXZlbnQgaXMgZWl0aGVyIGEgZGF0YSBldmVudCwgYWxzbyBjYWxsZWQgYW4gKmVsZW1lbnQqIG9mIHRoZSBzdHJlYW0sCiAqIG9yIGFuIGVycm9yIGV2ZW50LCB3aGljaCBpcyBhIG5vdGlmaWNhdGlvbiB0aGF0IHNvbWV0aGluZyBoYXMgZmFpbGVkLgogKiBXaGVuIGEgc3RyZWFtIGhhcyBlbWl0dGVkIGFsbCBpdHMgZXZlbnQsCiAqIGEgc2luZ2xlICJkb25lIiBldmVudCB3aWxsIG5vdGlmeSB0aGUgbGlzdGVuZXIgdGhhdCB0aGUgZW5kIGhhcyBiZWVuIHJlYWNoZWQuCiAqCiAqIFlvdSBbbGlzdGVuXSBvbiBhIHN0cmVhbSB0byBtYWtlIGl0IHN0YXJ0IGdlbmVyYXRpbmcgZXZlbnRzLAogKiBhbmQgdG8gc2V0IHVwIGxpc3RlbmVycyB0aGF0IHJlY2VpdmUgdGhlIGV2ZW50cy4KICogV2hlbiB5b3UgbGlzdGVuLCB5b3UgcmVjZWl2ZSBhIFtTdHJlYW1TdWJzY3JpcHRpb25dIG9iamVjdAogKiB3aGljaCBpcyB0aGUgYWN0aXZlIG9iamVjdCBwcm92aWRpbmcgdGhlIGV2ZW50cywKICogYW5kIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHN0b3AgbGlzdGVuaW5nIGFnYWluLAogKiBvciB0byB0ZW1wb3JhcmlseSBwYXVzZSBldmVudHMgZnJvbSB0aGUgc3Vic2NyaXB0aW9uLgogKgogKiBUaGVyZSBhcmUgdHdvIGtpbmRzIG9mIHN0cmVhbXM6ICJTaW5nbGUtc3Vic2NyaXB0aW9uIiBzdHJlYW1zIGFuZAogKiAiYnJvYWRjYXN0IiBzdHJlYW1zLgogKgogKiAqQSBzaW5nbGUtc3Vic2NyaXB0aW9uIHN0cmVhbSogYWxsb3dzIG9ubHkgYSBzaW5nbGUgbGlzdGVuZXIgZHVyaW5nIHRoZSB3aG9sZQogKiBsaWZldGltZSBvZiB0aGUgc3RyZWFtLgogKiBJdCBkb2Vzbid0IHN0YXJ0IGdlbmVyYXRpbmcgZXZlbnRzIHVudGlsIGl0IGhhcyBhIGxpc3RlbmVyLAogKiBhbmQgaXQgc3RvcHMgc2VuZGluZyBldmVudHMgd2hlbiB0aGUgbGlzdGVuZXIgaXMgdW5zdWJzY3JpYmVkLAogKiBldmVuIGlmIHRoZSBzb3VyY2Ugb2YgZXZlbnRzIGNvdWxkIHN0aWxsIHByb3ZpZGUgbW9yZS4KICoKICogTGlzdGVuaW5nIHR3aWNlIG9uIGEgc2luZ2xlLXN1YnNjcmlwdGlvbiBzdHJlYW0gaXMgbm90IGFsbG93ZWQsIGV2ZW4gYWZ0ZXIKICogdGhlIGZpcnN0IHN1YnNjcmlwdGlvbiBoYXMgYmVlbiBjYW5jZWxlZC4KICoKICogU2luZ2xlLXN1YnNjcmlwdGlvbiBzdHJlYW1zIGFyZSBnZW5lcmFsbHkgdXNlZCBmb3Igc3RyZWFtaW5nIGNodW5rcyBvZgogKiBsYXJnZXIgY29udGlndW91cyBkYXRhIGxpa2UgZmlsZSBJL08uCiAqCiAqICpBIGJyb2FkY2FzdCBzdHJlYW0qIGFsbG93cyBhbnkgbnVtYmVyIG9mIGxpc3RlbmVycywgYW5kIGl0IGZpcmVzCiAqIGl0cyBldmVudHMgd2hlbiB0aGV5IGFyZSByZWFkeSwgd2hldGhlciB0aGVyZSBhcmUgbGlzdGVuZXJzIG9yIG5vdC4KICoKICogQnJvYWRjYXN0IHN0cmVhbXMgYXJlIHVzZWQgZm9yIGluZGVwZW5kZW50IGV2ZW50cy9vYnNlcnZlcnMuCiAqCiAqIElmIHNldmVyYWwgbGlzdGVuZXJzIHdhbnQgdG8gbGlzdGVuIHRvIGEgc2luZ2xlIHN1YnNjcmlwdGlvbiBzdHJlYW0sCiAqIHVzZSBbYXNCcm9hZGNhc3RTdHJlYW1dIHRvIGNyZWF0ZSBhIGJyb2FkY2FzdCBzdHJlYW0gb24gdG9wIG9mIHRoZQogKiBub24tYnJvYWRjYXN0IHN0cmVhbS4KICoKICogT24gZWl0aGVyIGtpbmQgb2Ygc3RyZWFtLCBzdHJlYW0gdHJhbnNmb3JtYXRpb25zLCBzdWNoIGFzIFt3aGVyZV0gYW5kCiAqIFtza2lwXSwgcmV0dXJuIHRoZSBzYW1lIHR5cGUgb2Ygc3RyZWFtIGFzIHRoZSBvbmUgdGhlIG1ldGhvZCB3YXMgY2FsbGVkIG9uLAogKiB1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkLgogKgogKiBXaGVuIGFuIGV2ZW50IGlzIGZpcmVkLCB0aGUgbGlzdGVuZXIocykgYXQgdGhhdCB0aW1lIHdpbGwgcmVjZWl2ZSB0aGUgZXZlbnQuCiAqIElmIGEgbGlzdGVuZXIgaXMgYWRkZWQgdG8gYSBicm9hZGNhc3Qgc3RyZWFtIHdoaWxlIGFuIGV2ZW50IGlzIGJlaW5nIGZpcmVkLAogKiB0aGF0IGxpc3RlbmVyIHdpbGwgbm90IHJlY2VpdmUgdGhlIGV2ZW50IGN1cnJlbnRseSBiZWluZyBmaXJlZC4KICogSWYgYSBsaXN0ZW5lciBpcyBjYW5jZWxlZCwgaXQgaW1tZWRpYXRlbHkgc3RvcHMgcmVjZWl2aW5nIGV2ZW50cy4KICogTGlzdGVuaW5nIG9uIGEgYnJvYWRjYXN0IHN0cmVhbSBjYW4gYmUgdHJlYXRlZCBhcyBsaXN0ZW5pbmcgb24gYSBuZXcgc3RyZWFtCiAqIGNvbnRhaW5pbmcgb25seSB0aGUgZXZlbnRzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gZW1pdHRlZCB3aGVuIHRoZSBbbGlzdGVuXQogKiBjYWxsIG9jY3Vycy4KICogRm9yIGV4YW1wbGUsIHRoZSBbZmlyc3RdIGdldHRlciBsaXN0ZW5zIHRvIHRoZSBzdHJlYW0sIHRoZW4gcmV0dXJucyB0aGUgZmlyc3QKICogZXZlbnQgdGhhdCBsaXN0ZW5lciByZWNlaXZlcy4KICogVGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIGZpcnN0IGV2ZW4gZW1pdHRlZCBieSB0aGUgc3RyZWFtLCBidXQgdGhlIGZpcnN0CiAqIG9mIHRoZSAqcmVtYWluaW5nKiBldmVudHMgb2YgdGhlIGJyb2FkY2FzdCBzdHJlYW0uCiAqCiAqIFdoZW4gdGhlICJkb25lIiBldmVudCBpcyBmaXJlZCwgc3Vic2NyaWJlcnMgYXJlIHVuc3Vic2NyaWJlZCBiZWZvcmUKICogcmVjZWl2aW5nIHRoZSBldmVudC4gQWZ0ZXIgdGhlIGV2ZW50IGhhcyBiZWVuIHNlbnQsIHRoZSBzdHJlYW0gaGFzIG5vCiAqIHN1YnNjcmliZXJzLiBBZGRpbmcgbmV3IHN1YnNjcmliZXJzIHRvIGEgYnJvYWRjYXN0IHN0cmVhbSBhZnRlciB0aGlzIHBvaW50CiAqIGlzIGFsbG93ZWQsIGJ1dCB0aGV5IHdpbGwganVzdCByZWNlaXZlIGEgbmV3ICJkb25lIiBldmVudCBhcyBzb29uCiAqIGFzIHBvc3NpYmxlLgogKgogKiBTdHJlYW0gc3Vic2NyaXB0aW9ucyBhbHdheXMgcmVzcGVjdCAicGF1c2UiIHJlcXVlc3RzLiBJZiBuZWNlc3NhcnkgdGhleSBuZWVkCiAqIHRvIGJ1ZmZlciB0aGVpciBpbnB1dCwgYnV0IG9mdGVuLCBhbmQgcHJlZmVyYWJseSwgdGhleSBjYW4gc2ltcGx5IHJlcXVlc3QKICogdGhlaXIgaW5wdXQgdG8gcGF1c2UgdG9vLgogKgogKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBbaXNCcm9hZGNhc3RdIHJldHVybnMgZmFsc2UuCiAqIEEgYnJvYWRjYXN0IHN0cmVhbSBpbmhlcml0aW5nIGZyb20gW1N0cmVhbV0gbXVzdCBvdmVycmlkZSBbaXNCcm9hZGNhc3RdCiAqIHRvIHJldHVybiBgdHJ1ZWAuCiAqLwphYnN0cmFjdCBjbGFzcyBTdHJlYW08VD4gewogIFN0cmVhbSgpOwoKICAvKioKICAgKiBJbnRlcm5hbCB1c2Ugb25seS4gV2UgZG8gbm90IHdhbnQgdG8gcHJvbWlzZSB0aGF0IFN0cmVhbSBzdGF5cyBjb25zdC4KICAgKgogICAqIElmIG1peGlucyBiZWNvbWUgY29tcGF0aWJsZSB3aXRoIGNvbnN0IGNvbnN0cnVjdG9ycywgd2UgbWF5IHVzZSBhCiAgICogc3RyZWFtIG1peGluIGluc3RlYWQgb2YgZXh0ZW5kaW5nIFN0cmVhbSBmcm9tIGEgY29uc3QgY2xhc3MuCiAgICovCiAgY29uc3QgU3RyZWFtLl9pbnRlcm5hbCgpOwoKICAvKioKICAgKiBDcmVhdGVzIGFuIGVtcHR5IGJyb2FkY2FzdCBzdHJlYW0uCiAgICoKICAgKiBUaGlzIGlzIGEgc3RyZWFtIHdoaWNoIGRvZXMgbm90aGluZyBleGNlcHQgc2VuZGluZyBhIGRvbmUgZXZlbnQKICAgKiB3aGVuIGl0J3MgbGlzdGVuZWQgdG8uCiAgICovCiAgY29uc3QgZmFjdG9yeSBTdHJlYW0uZW1wdHkoKSA9IF9FbXB0eVN0cmVhbTxUPjsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBzaW5nbGUtc3Vic2NyaXB0aW9uIHN0cmVhbSBmcm9tIHRoZSBmdXR1cmUuCiAgICoKICAgKiBXaGVuIHRoZSBmdXR1cmUgY29tcGxldGVzLCB0aGUgc3RyZWFtIHdpbGwgZmlyZSBvbmUgZXZlbnQsIGVpdGhlcgogICAqIGRhdGEgb3IgZXJyb3IsIGFuZCB0aGVuIGNsb3NlIHdpdGggYSBkb25lLWV2ZW50LgogICAqLwogIGZhY3RvcnkgU3RyZWFtLmZyb21GdXR1cmUoRnV0dXJlPFQ+IGZ1dHVyZSkgewogICAgLy8gVXNlIHRoZSBjb250cm9sbGVyJ3MgYnVmZmVyaW5nIHRvIGZpbGwgaW4gdGhlIHZhbHVlIGV2ZW4gYmVmb3JlCiAgICAvLyB0aGUgc3RyZWFtIGhhcyBhIGxpc3RlbmVyLiBGb3IgYSBzaW5nbGUgdmFsdWUsIGl0J3Mgbm90IHdvcnRoIGl0CiAgICAvLyB0byB3YWl0IGZvciBhIGxpc3RlbmVyIGJlZm9yZSBkb2luZyB0aGUgYHRoZW5gIG9uIHRoZSBmdXR1cmUuCiAgICBfU3RyZWFtQ29udHJvbGxlcjxUPiBjb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8VD4oc3luYzogdHJ1ZSk7CiAgICBmdXR1cmUudGhlbigodmFsdWUpIHsKICAgICAgY29udHJvbGxlci5fYWRkKHZhbHVlKTsKICAgICAgY29udHJvbGxlci5fY2xvc2VVbmNoZWNrZWQoKTsKICAgIH0sIG9uRXJyb3I6IChlcnJvciwgc3RhY2tUcmFjZSkgewogICAgICBjb250cm9sbGVyLl9hZGRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgIGNvbnRyb2xsZXIuX2Nsb3NlVW5jaGVja2VkKCk7CiAgICB9KTsKICAgIHJldHVybiBjb250cm9sbGVyLnN0cmVhbTsKICB9CgogIC8qKgogICAqIENyZWF0ZSBhIHN0cmVhbSBmcm9tIGEgZ3JvdXAgb2YgZnV0dXJlcy4KICAgKgogICAqIFRoZSBzdHJlYW0gcmVwb3J0cyB0aGUgcmVzdWx0cyBvZiB0aGUgZnV0dXJlcyBvbiB0aGUgc3RyZWFtIGluIHRoZSBvcmRlcgogICAqIGluIHdoaWNoIHRoZSBmdXR1cmVzIGNvbXBsZXRlLgogICAqIEVhY2ggZnV0dXJlIHByb3ZpZGVzIGVpdGhlciBhIGRhdGEgZXZlbnQgb3IgYW4gZXJyb3IgZXZlbnQsCiAgICogZGVwZW5kaW5nIG9uIGhvdyB0aGUgZnV0dXJlIGNvbXBsZXRlcy4KICAgKgogICAqIElmIHNvbWUgZnV0dXJlcyBoYXZlIGFscmVhZHkgY29tcGxldGVkIHdoZW4gYFN0cmVhbS5mcm9tRnV0dXJlc2AgaXMgY2FsbGVkLAogICAqIHRoZWlyIHJlc3VsdHMgd2lsbCBiZSBlbWl0dGVkIGluIHNvbWUgdW5zcGVjaWZpZWQgb3JkZXIuCiAgICoKICAgKiBXaGVuIGFsbCBmdXR1cmVzIGhhdmUgY29tcGxldGVkLCB0aGUgc3RyZWFtIGlzIGNsb3NlZC4KICAgKgogICAqIElmIFtmdXR1cmVzXSBpcyBlbXB0eSwgdGhlIHN0cmVhbSBjbG9zZXMgYXMgc29vbiBhcyBwb3NzaWJsZS4KICAgKi8KICBmYWN0b3J5IFN0cmVhbS5mcm9tRnV0dXJlcyhJdGVyYWJsZTxGdXR1cmU8VD4+IGZ1dHVyZXMpIHsKICAgIF9TdHJlYW1Db250cm9sbGVyPFQ+IGNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxUPihzeW5jOiB0cnVlKTsKICAgIGludCBjb3VudCA9IDA7CiAgICAvLyBEZWNsYXJlIHRoZXNlIGFzIHZhcmlhYmxlcyBob2xkaW5nIGNsb3N1cmVzIGluc3RlYWQgb2YgYXMKICAgIC8vIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KICAgIC8vIFRoaXMgYXZvaWRzIGNyZWF0aW5nIGEgbmV3IGNsb3N1cmUgZnJvbSB0aGUgZnVuY3Rpb25zIGZvciBlYWNoIGZ1dHVyZS4KICAgIHZhciBvblZhbHVlID0gKFQgdmFsdWUpIHsKICAgICAgaWYgKCFjb250cm9sbGVyLmlzQ2xvc2VkKSB7CiAgICAgICAgY29udHJvbGxlci5fYWRkKHZhbHVlKTsKICAgICAgICBpZiAoLS1jb3VudCA9PSAwKSBjb250cm9sbGVyLl9jbG9zZVVuY2hlY2tlZCgpOwogICAgICB9CiAgICB9OwogICAgdmFyIG9uRXJyb3IgPSAoZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2spIHsKICAgICAgaWYgKCFjb250cm9sbGVyLmlzQ2xvc2VkKSB7CiAgICAgICAgY29udHJvbGxlci5fYWRkRXJyb3IoZXJyb3IsIHN0YWNrKTsKICAgICAgICBpZiAoLS1jb3VudCA9PSAwKSBjb250cm9sbGVyLl9jbG9zZVVuY2hlY2tlZCgpOwogICAgICB9CiAgICB9OwogICAgLy8gVGhlIGZ1dHVyZXMgYXJlIGFscmVhZHkgcnVubmluZywgc28gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZW0gaW1tZWRpYXRlbHkKICAgIC8vIChpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZSBzdHJlYW0gdG8gYmUgbGlzdGVuZWQgb24pLgogICAgLy8gSWYgd2Ugd2FpdCwgd2UgbWlnaHQgbm90IGNhdGNoIGVycm9ycyBpbiB0aGUgZnV0dXJlcyBpbiB0aW1lLgogICAgZm9yICh2YXIgZnV0dXJlIGluIGZ1dHVyZXMpIHsKICAgICAgY291bnQrKzsKICAgICAgZnV0dXJlLnRoZW4ob25WYWx1ZSwgb25FcnJvcjogb25FcnJvcik7CiAgICB9CiAgICAvLyBVc2Ugc2NoZWR1bGUgbWljcm90YXNrIHNpbmNlIGNvbnRyb2xsZXIgaXMgc3luYy4KICAgIGlmIChjb3VudCA9PSAwKSBzY2hlZHVsZU1pY3JvdGFzayhjb250cm9sbGVyLmNsb3NlKTsKICAgIHJldHVybiBjb250cm9sbGVyLnN0cmVhbTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBzaW5nbGUtc3Vic2NyaXB0aW9uIHN0cmVhbSB0aGF0IGdldHMgaXRzIGRhdGEgZnJvbSBbZWxlbWVudHNdLgogICAqCiAgICogVGhlIGl0ZXJhYmxlIGlzIGl0ZXJhdGVkIHdoZW4gdGhlIHN0cmVhbSByZWNlaXZlcyBhIGxpc3RlbmVyLCBhbmQgc3RvcHMKICAgKiBpdGVyYXRpbmcgaWYgdGhlIGxpc3RlbmVyIGNhbmNlbHMgdGhlIHN1YnNjcmlwdGlvbiwgb3IgaWYgdGhlCiAgICogW0l0ZXJhdG9yLm1vdmVOZXh0XSBtZXRob2QgcmV0dXJucyBgZmFsc2VgIG9yIHRocm93cy4KICAgKiBJdGVyYXRpb24gaXMgc3VzcGVuZGVkIHdoaWxlIHRoZSBzdHJlYW0gc3Vic2NyaXB0aW9uIGlzIHBhdXNlZC4KICAgKgogICAqIElmIGNhbGxpbmcgW0l0ZXJhdG9yLm1vdmVOZXh0XSBvbiBgZWxlbWVudHMuaXRlcmF0b3JgIHRocm93cywKICAgKiB0aGUgc3RyZWFtIGVtaXRzIHRoYXQgZXJyb3IgYW5kIHRoZW4gaXQgY2xvc2VzLgogICAqIElmIHJlYWRpbmcgW0l0ZXJhdG9yLmN1cnJlbnRdIG9uIGBlbGVtZW50cy5pdGVyYXRvcmAgdGhyb3dzLAogICAqIHRoZSBzdHJlYW0gZW1pdHMgdGhhdCBlcnJvciwgYnV0IGtlZXBzIGl0ZXJhdGluZy4KICAgKi8KICBmYWN0b3J5IFN0cmVhbS5mcm9tSXRlcmFibGUoSXRlcmFibGU8VD4gZWxlbWVudHMpIHsKICAgIHJldHVybiBuZXcgX0dlbmVyYXRlZFN0cmVhbUltcGw8VD4oCiAgICAgICAgKCkgPT4gbmV3IF9JdGVyYWJsZVBlbmRpbmdFdmVudHM8VD4oZWxlbWVudHMpKTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBzdHJlYW0gdGhhdCByZXBlYXRlZGx5IGVtaXRzIGV2ZW50cyBhdCBbcGVyaW9kXSBpbnRlcnZhbHMuCiAgICoKICAgKiBUaGUgZXZlbnQgdmFsdWVzIGFyZSBjb21wdXRlZCBieSBpbnZva2luZyBbY29tcHV0YXRpb25dLiBUaGUgYXJndW1lbnQgdG8KICAgKiB0aGlzIGNhbGxiYWNrIGlzIGFuIGludGVnZXIgdGhhdCBzdGFydHMgd2l0aCAwIGFuZCBpcyBpbmNyZW1lbnRlZCBmb3IKICAgKiBldmVyeSBldmVudC4KICAgKgogICAqIElmIFtjb21wdXRhdGlvbl0gaXMgb21pdHRlZCB0aGUgZXZlbnQgdmFsdWVzIHdpbGwgYWxsIGJlIGBudWxsYC4KICAgKi8KICBmYWN0b3J5IFN0cmVhbS5wZXJpb2RpYyhEdXJhdGlvbiBwZXJpb2QsCiAgICAgIFtUIGNvbXB1dGF0aW9uKGludCBjb21wdXRhdGlvbkNvdW50KV0pIHsKICAgIFRpbWVyIHRpbWVyOwogICAgaW50IGNvbXB1dGF0aW9uQ291bnQgPSAwOwogICAgU3RyZWFtQ29udHJvbGxlcjxUPiBjb250cm9sbGVyOwogICAgLy8gQ291bnRzIHRoZSB0aW1lIHRoYXQgdGhlIFN0cmVhbSB3YXMgcnVubmluZyAoYW5kIG5vdCBwYXVzZWQpLgogICAgU3RvcHdhdGNoIHdhdGNoID0gbmV3IFN0b3B3YXRjaCgpOwoKICAgIHZvaWQgc2VuZEV2ZW50KCkgewogICAgICB3YXRjaC5yZXNldCgpOwogICAgICBUIGRhdGE7CiAgICAgIGlmIChjb21wdXRhdGlvbiAhPSBudWxsKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGRhdGEgPSBjb21wdXRhdGlvbihjb21wdXRhdGlvbkNvdW50KyspOwogICAgICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgICAgIGNvbnRyb2xsZXIuYWRkRXJyb3IoZSwgcyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnRyb2xsZXIuYWRkKGRhdGEpOwogICAgfQoKICAgIHZvaWQgc3RhcnRQZXJpb2RpY1RpbWVyKCkgewogICAgICBhc3NlcnQodGltZXIgPT0gbnVsbCk7CiAgICAgIHRpbWVyID0gbmV3IFRpbWVyLnBlcmlvZGljKHBlcmlvZCwgKFRpbWVyIHRpbWVyKSB7CiAgICAgICAgc2VuZEV2ZW50KCk7CiAgICAgIH0pOwogICAgfQoKICAgIGNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxUPigKICAgICAgICBzeW5jOiB0cnVlLAogICAgICAgIG9uTGlzdGVuOiAoKSB7CiAgICAgICAgICB3YXRjaC5zdGFydCgpOwogICAgICAgICAgc3RhcnRQZXJpb2RpY1RpbWVyKCk7CiAgICAgICAgfSwKICAgICAgICBvblBhdXNlOiAoKSB7CiAgICAgICAgICB0aW1lci5jYW5jZWwoKTsKICAgICAgICAgIHRpbWVyID0gbnVsbDsKICAgICAgICAgIHdhdGNoLnN0b3AoKTsKICAgICAgICB9LAogICAgICAgIG9uUmVzdW1lOiAoKSB7CiAgICAgICAgICBhc3NlcnQodGltZXIgPT0gbnVsbCk7CiAgICAgICAgICBEdXJhdGlvbiBlbGFwc2VkID0gd2F0Y2guZWxhcHNlZDsKICAgICAgICAgIHdhdGNoLnN0YXJ0KCk7CiAgICAgICAgICB0aW1lciA9IG5ldyBUaW1lcihwZXJpb2QgLSBlbGFwc2VkLCAoKSB7CiAgICAgICAgICAgIHRpbWVyID0gbnVsbDsKICAgICAgICAgICAgc3RhcnRQZXJpb2RpY1RpbWVyKCk7CiAgICAgICAgICAgIHNlbmRFdmVudCgpOwogICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgICBvbkNhbmNlbDogKCkgewogICAgICAgICAgaWYgKHRpbWVyICE9IG51bGwpIHRpbWVyLmNhbmNlbCgpOwogICAgICAgICAgdGltZXIgPSBudWxsOwogICAgICAgICAgcmV0dXJuIEZ1dHVyZS5fbnVsbEZ1dHVyZTsKICAgICAgICB9KTsKICAgIHJldHVybiBjb250cm9sbGVyLnN0cmVhbTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBzdHJlYW0gd2hlcmUgYWxsIGV2ZW50cyBvZiBhbiBleGlzdGluZyBzdHJlYW0gYXJlIHBpcGVkIHRocm91Z2gKICAgKiBhIHNpbmstdHJhbnNmb3JtYXRpb24uCiAgICoKICAgKiBUaGUgZ2l2ZW4gW21hcFNpbmtdIGNsb3N1cmUgaXMgaW52b2tlZCB3aGVuIHRoZSByZXR1cm5lZCBzdHJlYW0gaXMKICAgKiBsaXN0ZW5lZCB0by4gQWxsIGV2ZW50cyBmcm9tIHRoZSBbc291cmNlXSBhcmUgYWRkZWQgaW50byB0aGUgZXZlbnQgc2luawogICAqIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSB0aGUgaW52b2NhdGlvbi4gVGhlIHRyYW5zZm9ybWF0aW9uIHB1dHMgYWxsCiAgICogdHJhbnNmb3JtZWQgZXZlbnRzIGludG8gdGhlIHNpbmsgdGhlIFttYXBTaW5rXSBjbG9zdXJlIHJlY2VpdmVkIGR1cmluZwogICAqIGl0cyBpbnZvY2F0aW9uLiBDb25jZXB0dWFsbHkgdGhlIFttYXBTaW5rXSBjcmVhdGVzIGEgdHJhbnNmb3JtYXRpb24gcGlwZQogICAqIHdpdGggdGhlIGlucHV0IHNpbmsgYmVpbmcgdGhlIHJldHVybmVkIFtFdmVudFNpbmtdIGFuZCB0aGUgb3V0cHV0IHNpbmsKICAgKiBiZWluZyB0aGUgc2luayBpdCByZWNlaXZlZC4KICAgKgogICAqIFRoaXMgY29uc3RydWN0b3IgaXMgZnJlcXVlbnRseSB1c2VkIHRvIGJ1aWxkIHRyYW5zZm9ybWVycy4KICAgKgogICAqIEV4YW1wbGUgdXNlIGZvciBhIGR1cGxpY2F0aW5nIHRyYW5zZm9ybWVyOgogICAqCiAgICogICAgIGNsYXNzIER1cGxpY2F0aW9uU2luayBpbXBsZW1lbnRzIEV2ZW50U2luazxTdHJpbmc+IHsKICAgKiAgICAgICBmaW5hbCBFdmVudFNpbms8U3RyaW5nPiBfb3V0cHV0U2luazsKICAgKiAgICAgICBEdXBsaWNhdGlvblNpbmsodGhpcy5fb3V0cHV0U2luayk7CiAgICoKICAgKiAgICAgICB2b2lkIGFkZChTdHJpbmcgZGF0YSkgewogICAqICAgICAgICAgX291dHB1dFNpbmsuYWRkKGRhdGEpOwogICAqICAgICAgICAgX291dHB1dFNpbmsuYWRkKGRhdGEpOwogICAqICAgICAgIH0KICAgKgogICAqICAgICAgIHZvaWQgYWRkRXJyb3IoZSwgW3N0XSkgeyBfb3V0cHV0U2luay5hZGRFcnJvcihlLCBzdCk7IH0KICAgKiAgICAgICB2b2lkIGNsb3NlKCkgeyBfb3V0cHV0U2luay5jbG9zZSgpOyB9CiAgICogICAgIH0KICAgKgogICAqICAgICBjbGFzcyBEdXBsaWNhdGlvblRyYW5zZm9ybWVyIGV4dGVuZHMgU3RyZWFtVHJhbnNmb3JtZXJCYXNlPFN0cmluZywgU3RyaW5nPiB7CiAgICogICAgICAgLy8gU29tZSBnZW5lcmljIHR5cGVzIG9taXR0ZWQgZm9yIGJyZXZpdHkuCiAgICogICAgICAgU3RyZWFtIGJpbmQoU3RyZWFtIHN0cmVhbSkgPT4gbmV3IFN0cmVhbTxTdHJpbmc+LmV2ZW50VHJhbnNmb3JtZWQoCiAgICogICAgICAgICAgIHN0cmVhbSwKICAgKiAgICAgICAgICAgKEV2ZW50U2luayBzaW5rKSA9PiBuZXcgRHVwbGljYXRpb25TaW5rKHNpbmspKTsKICAgKiAgICAgfQogICAqCiAgICogICAgIHN0cmluZ1N0cmVhbS50cmFuc2Zvcm0obmV3IER1cGxpY2F0aW9uVHJhbnNmb3JtZXIoKSk7CiAgICoKICAgKiBUaGUgcmVzdWx0aW5nIHN0cmVhbSBpcyBhIGJyb2FkY2FzdCBzdHJlYW0gaWYgW3NvdXJjZV0gaXMuCiAgICovCiAgZmFjdG9yeSBTdHJlYW0uZXZlbnRUcmFuc2Zvcm1lZCgKICAgICAgU3RyZWFtIHNvdXJjZSwgRXZlbnRTaW5rIG1hcFNpbmsoRXZlbnRTaW5rPFQ+IHNpbmspKSB7CiAgICByZXR1cm4gbmV3IF9Cb3VuZFNpbmtTdHJlYW0oc291cmNlLCBtYXBTaW5rKTsKICB9CgogIC8qKgogICAqIEFkYXB0cyBbc291cmNlXSB0byBiZSBhIGBTdHJlYW08VD5gLgogICAqCiAgICogVGhpcyBhbGxvd3MgW3NvdXJjZV0gdG8gYmUgdXNlZCBhdCB0aGUgbmV3IHR5cGUsIGJ1dCBhdCBydW4tdGltZSBpdAogICAqIG11c3Qgc2F0aXNmeSB0aGUgcmVxdWlyZW1lbnRzIG9mIGJvdGggdGhlIG5ldyB0eXBlIGFuZCBpdHMgb3JpZ2luYWwgdHlwZS4KICAgKgogICAqIERhdGEgZXZlbnRzIGNyZWF0ZWQgYnkgdGhlIHNvdXJjZSBzdHJlYW0gbXVzdCBhbHNvIGJlIGluc3RhbmNlcyBvZiBbVF0uCiAgICovCiAgc3RhdGljIFN0cmVhbTxUPiBjYXN0RnJvbTxTLCBUPihTdHJlYW08Uz4gc291cmNlKSA9PgogICAgICBuZXcgQ2FzdFN0cmVhbTxTLCBUPihzb3VyY2UpOwoKICAvKioKICAgKiBXaGV0aGVyIHRoaXMgc3RyZWFtIGlzIGEgYnJvYWRjYXN0IHN0cmVhbS4KICAgKi8KICBib29sIGdldCBpc0Jyb2FkY2FzdCA9PiBmYWxzZTsKCiAgLyoqCiAgICogUmV0dXJucyBhIG11bHRpLXN1YnNjcmlwdGlvbiBzdHJlYW0gdGhhdCBwcm9kdWNlcyB0aGUgc2FtZSBldmVudHMgYXMgdGhpcy4KICAgKgogICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gd2lsbCBzdWJzY3JpYmUgdG8gdGhpcyBzdHJlYW0gd2hlbiBpdHMgZmlyc3QKICAgKiBzdWJzY3JpYmVyIGlzIGFkZGVkLCBhbmQgd2lsbCBzdGF5IHN1YnNjcmliZWQgdW50aWwgdGhpcyBzdHJlYW0gZW5kcywKICAgKiBvciBhIGNhbGxiYWNrIGNhbmNlbHMgdGhlIHN1YnNjcmlwdGlvbi4KICAgKgogICAqIElmIFtvbkxpc3Rlbl0gaXMgcHJvdmlkZWQsIGl0IGlzIGNhbGxlZCB3aXRoIGEgc3Vic2NyaXB0aW9uLWxpa2Ugb2JqZWN0CiAgICogdGhhdCByZXByZXNlbnRzIHRoZSB1bmRlcmx5aW5nIHN1YnNjcmlwdGlvbiB0byB0aGlzIHN0cmVhbS4gSXQgaXMKICAgKiBwb3NzaWJsZSB0byBwYXVzZSwgcmVzdW1lIG9yIGNhbmNlbCB0aGUgc3Vic2NyaXB0aW9uIGR1cmluZyB0aGUgY2FsbAogICAqIHRvIFtvbkxpc3Rlbl0uIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlIGV2ZW50IGhhbmRsZXJzLCBpbmNsdWRpbmcKICAgKiB1c2luZyBbU3RyZWFtU3Vic2NyaXB0aW9uLmFzRnV0dXJlXS4KICAgKgogICAqIElmIFtvbkNhbmNlbF0gaXMgcHJvdmlkZWQsIGl0IGlzIGNhbGxlZCBpbiBhIHNpbWlsYXIgd2F5IHRvIFtvbkxpc3Rlbl0KICAgKiB3aGVuIHRoZSByZXR1cm5lZCBzdHJlYW0gc3RvcHMgaGF2aW5nIGxpc3RlbmVyLiBJZiBpdCBsYXRlciBnZXRzCiAgICogYSBuZXcgbGlzdGVuZXIsIHRoZSBbb25MaXN0ZW5dIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZ2Fpbi4KICAgKgogICAqIFVzZSB0aGUgY2FsbGJhY2tzLCBmb3IgZXhhbXBsZSwgZm9yIHBhdXNpbmcgdGhlIHVuZGVybHlpbmcgc3Vic2NyaXB0aW9uCiAgICogd2hpbGUgaGF2aW5nIG5vIHN1YnNjcmliZXJzIHRvIHByZXZlbnQgbG9zaW5nIGV2ZW50cywgb3IgY2FuY2VsaW5nIHRoZQogICAqIHN1YnNjcmlwdGlvbiB3aGVuIHRoZXJlIGFyZSBubyBsaXN0ZW5lcnMuCiAgICovCiAgU3RyZWFtPFQ+IGFzQnJvYWRjYXN0U3RyZWFtKAogICAgICB7dm9pZCBvbkxpc3RlbihTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKSwKICAgICAgdm9pZCBvbkNhbmNlbChTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKX0pIHsKICAgIHJldHVybiBuZXcgX0FzQnJvYWRjYXN0U3RyZWFtPFQ+KHRoaXMsIG9uTGlzdGVuLCBvbkNhbmNlbCk7CiAgfQoKICAvKioKICAgKiBBZGRzIGEgc3Vic2NyaXB0aW9uIHRvIHRoaXMgc3RyZWFtLgogICAqCiAgICogUmV0dXJucyBhIFtTdHJlYW1TdWJzY3JpcHRpb25dIHdoaWNoIGhhbmRsZXMgZXZlbnRzIGZyb20gdGhpcyBzdHJlYW0gdXNpbmcKICAgKiB0aGUgcHJvdmlkZWQgW29uRGF0YV0sIFtvbkVycm9yXSBhbmQgW29uRG9uZV0gaGFuZGxlcnMuCiAgICogVGhlIGhhbmRsZXJzIGNhbiBiZSBjaGFuZ2VkIG9uIHRoZSBzdWJzY3JpcHRpb24sIGJ1dCB0aGV5IHN0YXJ0IG91dAogICAqIGFzIHRoZSBwcm92aWRlZCBmdW5jdGlvbnMuCiAgICoKICAgKiBPbiBlYWNoIGRhdGEgZXZlbnQgZnJvbSB0aGlzIHN0cmVhbSwgdGhlIHN1YnNjcmliZXIncyBbb25EYXRhXSBoYW5kbGVyCiAgICogaXMgY2FsbGVkLiBJZiBbb25EYXRhXSBpcyBgbnVsbGAsIG5vdGhpbmcgaGFwcGVucy4KICAgKgogICAqIE9uIGVycm9ycyBmcm9tIHRoaXMgc3RyZWFtLCB0aGUgW29uRXJyb3JdIGhhbmRsZXIgaXMgY2FsbGVkIHdpdGggdGhlCiAgICogZXJyb3Igb2JqZWN0IGFuZCBwb3NzaWJseSBhIHN0YWNrIHRyYWNlLgogICAqCiAgICogVGhlIFtvbkVycm9yXSBjYWxsYmFjayBtdXN0IGJlIG9mIHR5cGUgYHZvaWQgb25FcnJvcihlcnJvcilgIG9yCiAgICogYHZvaWQgb25FcnJvcihlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKWAuIElmIFtvbkVycm9yXSBhY2NlcHRzCiAgICogdHdvIGFyZ3VtZW50cyBpdCBpcyBjYWxsZWQgd2l0aCB0aGUgZXJyb3Igb2JqZWN0IGFuZCB0aGUgc3RhY2sgdHJhY2UKICAgKiAod2hpY2ggY291bGQgYmUgYG51bGxgIGlmIHRoaXMgc3RyZWFtIGl0c2VsZiByZWNlaXZlZCBhbiBlcnJvciB3aXRob3V0CiAgICogc3RhY2sgdHJhY2UpLgogICAqIE90aGVyd2lzZSBpdCBpcyBjYWxsZWQgd2l0aCBqdXN0IHRoZSBlcnJvciBvYmplY3QuCiAgICogSWYgW29uRXJyb3JdIGlzIG9taXR0ZWQsIGFueSBlcnJvcnMgb24gdGhpcyBzdHJlYW0gYXJlIGNvbnNpZGVyZWQgdW5oYW5kbGVkLAogICAqIGFuZCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY3VycmVudCBbWm9uZV0ncyBlcnJvciBoYW5kbGVyLgogICAqIEJ5IGRlZmF1bHQgdW5oYW5kbGVkIGFzeW5jIGVycm9ycyBhcmUgdHJlYXRlZAogICAqIGFzIGlmIHRoZXkgd2VyZSB1bmNhdWdodCB0b3AtbGV2ZWwgZXJyb3JzLgogICAqCiAgICogSWYgdGhpcyBzdHJlYW0gY2xvc2VzIGFuZCBzZW5kcyBhIGRvbmUgZXZlbnQsIHRoZSBbb25Eb25lXSBoYW5kbGVyIGlzCiAgICogY2FsbGVkLiBJZiBbb25Eb25lXSBpcyBgbnVsbGAsIG5vdGhpbmcgaGFwcGVucy4KICAgKgogICAqIElmIFtjYW5jZWxPbkVycm9yXSBpcyB0cnVlLCB0aGUgc3Vic2NyaXB0aW9uIGlzIGF1dG9tYXRpY2FsbHkgY2FuY2VsZWQKICAgKiB3aGVuIHRoZSBmaXJzdCBlcnJvciBldmVudCBpcyBkZWxpdmVyZWQuIFRoZSBkZWZhdWx0IGlzIGBmYWxzZWAuCiAgICoKICAgKiBXaGlsZSBhIHN1YnNjcmlwdGlvbiBpcyBwYXVzZWQsIG9yIHdoZW4gaXQgaGFzIGJlZW4gY2FuY2VsZWQsCiAgICogdGhlIHN1YnNjcmlwdGlvbiBkb2Vzbid0IHJlY2VpdmUgZXZlbnRzIGFuZCBub25lIG9mIHRoZQogICAqIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zIGFyZSBjYWxsZWQuCiAgICovCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IGxpc3Rlbih2b2lkIG9uRGF0YShUIGV2ZW50KSwKICAgICAge0Z1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcn0pOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IHN0cmVhbSBmcm9tIHRoaXMgc3RyZWFtIHRoYXQgZGlzY2FyZHMgc29tZSBlbGVtZW50cy4KICAgKgogICAqIFRoZSBuZXcgc3RyZWFtIHNlbmRzIHRoZSBzYW1lIGVycm9yIGFuZCBkb25lIGV2ZW50cyBhcyB0aGlzIHN0cmVhbSwKICAgKiBidXQgaXQgb25seSBzZW5kcyB0aGUgZGF0YSBldmVudHMgdGhhdCBzYXRpc2Z5IHRoZSBbdGVzdF0uCiAgICoKICAgKiBJZiB0aGUgW3Rlc3RdIGZ1bmN0aW9uIHRocm93cywgdGhlIGRhdGEgZXZlbnQgaXMgZHJvcHBlZCBhbmQgdGhlCiAgICogZXJyb3IgaXMgZW1pdHRlZCBvbiB0aGUgcmV0dXJuZWQgc3RyZWFtIGluc3RlYWQuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgc3RyZWFtIGlzIGEgYnJvYWRjYXN0IHN0cmVhbSBpZiB0aGlzIHN0cmVhbSBpcy4KICAgKiBJZiBhIGJyb2FkY2FzdCBzdHJlYW0gaXMgbGlzdGVuZWQgdG8gbW9yZSB0aGFuIG9uY2UsIGVhY2ggc3Vic2NyaXB0aW9uCiAgICogd2lsbCBpbmRpdmlkdWFsbHkgcGVyZm9ybSB0aGUgYHRlc3RgLgogICAqLwogIFN0cmVhbTxUPiB3aGVyZShib29sIHRlc3QoVCBldmVudCkpIHsKICAgIHJldHVybiBuZXcgX1doZXJlU3RyZWFtPFQ+KHRoaXMsIHRlc3QpOwogIH0KCiAgLyoqCiAgICogVHJhbnNmb3JtcyBlYWNoIGVsZW1lbnQgb2YgdGhpcyBzdHJlYW0gaW50byBhIG5ldyBzdHJlYW0gZXZlbnQuCiAgICoKICAgKiBDcmVhdGVzIGEgbmV3IHN0cmVhbSB0aGF0IGNvbnZlcnRzIGVhY2ggZWxlbWVudCBvZiB0aGlzIHN0cmVhbQogICAqIHRvIGEgbmV3IHZhbHVlIHVzaW5nIHRoZSBbY29udmVydF0gZnVuY3Rpb24sIGFuZCBlbWl0cyB0aGUgcmVzdWx0LgogICAqCiAgICogRm9yIGVhY2ggZGF0YSBldmVudCwgYG9gLCBpbiB0aGlzIHN0cmVhbSwgdGhlIHJldHVybmVkIHN0cmVhbQogICAqIHByb3ZpZGVzIGEgZGF0YSBldmVudCB3aXRoIHRoZSB2YWx1ZSBgY29udmVydChvKWAuCiAgICogSWYgW2NvbnZlcnRdIHRocm93cywgdGhlIHJldHVybmVkIHN0cmVhbSByZXBvcnRzIGl0IGFzIGFuIGVycm9yCiAgICogZXZlbnQgaW5zdGVhZC4KICAgKgogICAqIEVycm9yIGFuZCBkb25lIGV2ZW50cyBhcmUgcGFzc2VkIHRocm91Z2ggdW5jaGFuZ2VkIHRvIHRoZSByZXR1cm5lZCBzdHJlYW0uCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgc3RyZWFtIGlzIGEgYnJvYWRjYXN0IHN0cmVhbSBpZiB0aGlzIHN0cmVhbSBpcy4KICAgKiBUaGUgW2NvbnZlcnRdIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIHBlciBkYXRhIGV2ZW50IHBlciBsaXN0ZW5lci4KICAgKiBJZiBhIGJyb2FkY2FzdCBzdHJlYW0gaXMgbGlzdGVuZWQgdG8gbW9yZSB0aGFuIG9uY2UsIGVhY2ggc3Vic2NyaXB0aW9uCiAgICogd2lsbCBpbmRpdmlkdWFsbHkgY2FsbCBbY29udmVydF0gb24gZWFjaCBkYXRhIGV2ZW50LgogICAqLwogIFN0cmVhbTxTPiBtYXA8Uz4oUyBjb252ZXJ0KFQgZXZlbnQpKSB7CiAgICByZXR1cm4gbmV3IF9NYXBTdHJlYW08VCwgUz4odGhpcywgY29udmVydCk7CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IHN0cmVhbSB3aXRoIGVhY2ggZGF0YSBldmVudCBvZiB0aGlzIHN0cmVhbSBhc3luY2hyb25vdXNseQogICAqIG1hcHBlZCB0byBhIG5ldyBldmVudC4KICAgKgogICAqIFRoaXMgYWN0cyBsaWtlIFttYXBdLCBleGNlcHQgdGhhdCBbY29udmVydF0gbWF5IHJldHVybiBhIFtGdXR1cmVdLAogICAqIGFuZCBpbiB0aGF0IGNhc2UsIHRoaXMgc3RyZWFtIHdhaXRzIGZvciB0aGF0IGZ1dHVyZSB0byBjb21wbGV0ZSBiZWZvcmUKICAgKiBjb250aW51aW5nIHdpdGggaXRzIHJlc3VsdC4KICAgKgogICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gaXMgYSBicm9hZGNhc3Qgc3RyZWFtIGlmIHRoaXMgc3RyZWFtIGlzLgogICAqLwogIFN0cmVhbTxFPiBhc3luY01hcDxFPihGdXR1cmVPcjxFPiBjb252ZXJ0KFQgZXZlbnQpKSB7CiAgICBfU3RyZWFtQ29udHJvbGxlckJhc2U8RT4gY29udHJvbGxlcjsKICAgIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb247CgogICAgdm9pZCBvbkxpc3RlbigpIHsKICAgICAgZmluYWwgYWRkID0gY29udHJvbGxlci5hZGQ7CiAgICAgIGFzc2VydChjb250cm9sbGVyIGlzIF9TdHJlYW1Db250cm9sbGVyPEU+IHx8CiAgICAgICAgICBjb250cm9sbGVyIGlzIF9Ccm9hZGNhc3RTdHJlYW1Db250cm9sbGVyKTsKICAgICAgZmluYWwgYWRkRXJyb3IgPSBjb250cm9sbGVyLl9hZGRFcnJvcjsKICAgICAgc3Vic2NyaXB0aW9uID0gdGhpcy5saXN0ZW4oKFQgZXZlbnQpIHsKICAgICAgICBGdXR1cmVPcjxFPiBuZXdWYWx1ZTsKICAgICAgICB0cnkgewogICAgICAgICAgbmV3VmFsdWUgPSBjb252ZXJ0KGV2ZW50KTsKICAgICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgICBjb250cm9sbGVyLmFkZEVycm9yKGUsIHMpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAobmV3VmFsdWUgaXMgRnV0dXJlPEU+KSB7CiAgICAgICAgICBzdWJzY3JpcHRpb24ucGF1c2UoKTsKICAgICAgICAgIG5ld1ZhbHVlCiAgICAgICAgICAgICAgLnRoZW4oYWRkLCBvbkVycm9yOiBhZGRFcnJvcikKICAgICAgICAgICAgICAud2hlbkNvbXBsZXRlKHN1YnNjcmlwdGlvbi5yZXN1bWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb250cm9sbGVyLmFkZChuZXdWYWx1ZSk7CiAgICAgICAgfQogICAgICB9LCBvbkVycm9yOiBhZGRFcnJvciwgb25Eb25lOiBjb250cm9sbGVyLmNsb3NlKTsKICAgIH0KCiAgICBpZiAodGhpcy5pc0Jyb2FkY2FzdCkgewogICAgICBjb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8RT4uYnJvYWRjYXN0KAogICAgICAgICAgb25MaXN0ZW46IG9uTGlzdGVuLAogICAgICAgICAgb25DYW5jZWw6ICgpIHsKICAgICAgICAgICAgc3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogICAgICAgICAgfSwKICAgICAgICAgIHN5bmM6IHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyPEU+KAogICAgICAgICAgb25MaXN0ZW46IG9uTGlzdGVuLAogICAgICAgICAgb25QYXVzZTogKCkgewogICAgICAgICAgICBzdWJzY3JpcHRpb24ucGF1c2UoKTsKICAgICAgICAgIH0sCiAgICAgICAgICBvblJlc3VtZTogKCkgewogICAgICAgICAgICBzdWJzY3JpcHRpb24ucmVzdW1lKCk7CiAgICAgICAgICB9LAogICAgICAgICAgb25DYW5jZWw6ICgpID0+IHN1YnNjcmlwdGlvbi5jYW5jZWwoKSwKICAgICAgICAgIHN5bmM6IHRydWUpOwogICAgfQogICAgcmV0dXJuIGNvbnRyb2xsZXIuc3RyZWFtOwogIH0KCiAgLyoqCiAgICogVHJhbnNmb3JtcyBlYWNoIGVsZW1lbnQgaW50byBhIHNlcXVlbmNlIG9mIGFzeW5jaHJvbm91cyBldmVudHMuCiAgICoKICAgKiBSZXR1cm5zIGEgbmV3IHN0cmVhbSBhbmQgZm9yIGVhY2ggZXZlbnQgb2YgdGhpcyBzdHJlYW0sIGRvIHRoZSBmb2xsb3dpbmc6CiAgICoKICAgKiAqIElmIHRoZSBldmVudCBpcyBhbiBlcnJvciBldmVudCBvciBhIGRvbmUgZXZlbnQsIGl0IGlzIGVtaXR0ZWQgZGlyZWN0bHkKICAgKiBieSB0aGUgcmV0dXJuZWQgc3RyZWFtLgogICAqICogT3RoZXJ3aXNlIGl0IGlzIGFuIGVsZW1lbnQuIFRoZW4gdGhlIFtjb252ZXJ0XSBmdW5jdGlvbiBpcyBjYWxsZWQKICAgKiB3aXRoIHRoZSBlbGVtZW50IGFzIGFyZ3VtZW50IHRvIHByb2R1Y2UgYSBjb252ZXJ0LXN0cmVhbSBmb3IgdGhlIGVsZW1lbnQuCiAgICogKiBJZiB0aGF0IGNhbGwgdGhyb3dzLCB0aGUgZXJyb3IgaXMgZW1pdHRlZCBvbiB0aGUgcmV0dXJuZWQgc3RyZWFtLgogICAqICogSWYgdGhlIGNhbGwgcmV0dXJucyBgbnVsbGAsIG5vIGZ1cnRoZXIgYWN0aW9uIGlzIHRha2VuIGZvciB0aGUgZWxlbWVudHMuCiAgICogKiBPdGhlcndpc2UsIHRoaXMgc3RyZWFtIGlzIHBhdXNlZCBhbmQgY29udmVydC1zdHJlYW0gaXMgbGlzdGVuZWQgdG8uCiAgICogRXZlcnkgZGF0YSBhbmQgZXJyb3IgZXZlbnQgb2YgdGhlIGNvbnZlcnQtc3RyZWFtIGlzIGVtaXR0ZWQgb24gdGhlIHJldHVybmVkCiAgICogc3RyZWFtIGluIHRoZSBvcmRlciBpdCBpcyBwcm9kdWNlZC4KICAgKiBXaGVuIHRoZSBjb252ZXJ0LXN0cmVhbSBlbmRzLCB0aGlzIHN0cmVhbSBpcyByZXN1bWVkLgogICAqCiAgICogVGhlIHJldHVybmVkIHN0cmVhbSBpcyBhIGJyb2FkY2FzdCBzdHJlYW0gaWYgdGhpcyBzdHJlYW0gaXMuCiAgICovCiAgU3RyZWFtPEU+IGFzeW5jRXhwYW5kPEU+KFN0cmVhbTxFPiBjb252ZXJ0KFQgZXZlbnQpKSB7CiAgICBfU3RyZWFtQ29udHJvbGxlckJhc2U8RT4gY29udHJvbGxlcjsKICAgIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb247CiAgICB2b2lkIG9uTGlzdGVuKCkgewogICAgICBhc3NlcnQoY29udHJvbGxlciBpcyBfU3RyZWFtQ29udHJvbGxlciB8fAogICAgICAgICAgY29udHJvbGxlciBpcyBfQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlcik7CiAgICAgIHN1YnNjcmlwdGlvbiA9IHRoaXMubGlzdGVuKChUIGV2ZW50KSB7CiAgICAgICAgU3RyZWFtPEU+IG5ld1N0cmVhbTsKICAgICAgICB0cnkgewogICAgICAgICAgbmV3U3RyZWFtID0gY29udmVydChldmVudCk7CiAgICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgICAgY29udHJvbGxlci5hZGRFcnJvcihlLCBzKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKG5ld1N0cmVhbSAhPSBudWxsKSB7CiAgICAgICAgICBzdWJzY3JpcHRpb24ucGF1c2UoKTsKICAgICAgICAgIGNvbnRyb2xsZXIuYWRkU3RyZWFtKG5ld1N0cmVhbSkud2hlbkNvbXBsZXRlKHN1YnNjcmlwdGlvbi5yZXN1bWUpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgICAgIG9uRXJyb3I6IGNvbnRyb2xsZXIuX2FkZEVycm9yLCAvLyBBdm9pZCBab25lIGVycm9yIHJlcGxhY2VtZW50LgogICAgICAgICAgb25Eb25lOiBjb250cm9sbGVyLmNsb3NlKTsKICAgIH0KCiAgICBpZiAodGhpcy5pc0Jyb2FkY2FzdCkgewogICAgICBjb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8RT4uYnJvYWRjYXN0KAogICAgICAgICAgb25MaXN0ZW46IG9uTGlzdGVuLAogICAgICAgICAgb25DYW5jZWw6ICgpIHsKICAgICAgICAgICAgc3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogICAgICAgICAgfSwKICAgICAgICAgIHN5bmM6IHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyPEU+KAogICAgICAgICAgb25MaXN0ZW46IG9uTGlzdGVuLAogICAgICAgICAgb25QYXVzZTogKCkgewogICAgICAgICAgICBzdWJzY3JpcHRpb24ucGF1c2UoKTsKICAgICAgICAgIH0sCiAgICAgICAgICBvblJlc3VtZTogKCkgewogICAgICAgICAgICBzdWJzY3JpcHRpb24ucmVzdW1lKCk7CiAgICAgICAgICB9LAogICAgICAgICAgb25DYW5jZWw6ICgpID0+IHN1YnNjcmlwdGlvbi5jYW5jZWwoKSwKICAgICAgICAgIHN5bmM6IHRydWUpOwogICAgfQogICAgcmV0dXJuIGNvbnRyb2xsZXIuc3RyZWFtOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIHdyYXBwZXIgU3RyZWFtIHRoYXQgaW50ZXJjZXB0cyBzb21lIGVycm9ycyBmcm9tIHRoaXMgc3RyZWFtLgogICAqCiAgICogSWYgdGhpcyBzdHJlYW0gc2VuZHMgYW4gZXJyb3IgdGhhdCBtYXRjaGVzIFt0ZXN0XSwgdGhlbiBpdCBpcyBpbnRlcmNlcHRlZAogICAqIGJ5IHRoZSBbb25FcnJvcl0gZnVuY3Rpb24uCiAgICoKICAgKiBUaGUgW29uRXJyb3JdIGNhbGxiYWNrIG11c3QgYmUgb2YgdHlwZSBgdm9pZCBvbkVycm9yKGVycm9yKWAgb3IKICAgKiBgdm9pZCBvbkVycm9yKGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpYC4KICAgKiBUaGUgZnVuY3Rpb24gdHlwZSBkZXRlcm1pbmVzIHdoZXRoZXIgW29uRXJyb3JdIGlzIGludm9rZWQgd2l0aCBhIHN0YWNrCiAgICogdHJhY2UgYXJndW1lbnQuCiAgICogVGhlIHN0YWNrIHRyYWNlIGFyZ3VtZW50IG1heSBiZSBgbnVsbGAgaWYgdGhpcyBzdHJlYW0gcmVjZWl2ZWQgYW4gZXJyb3IKICAgKiB3aXRob3V0IGEgc3RhY2sgdHJhY2UuCiAgICoKICAgKiBBbiBhc3luY2hyb25vdXMgZXJyb3IgYGVycm9yYCBpcyBtYXRjaGVkIGJ5IGEgdGVzdCBmdW5jdGlvbiBpZgogICAqYHRlc3QoZXJyb3IpYCByZXR1cm5zIHRydWUuIElmIFt0ZXN0XSBpcyBvbWl0dGVkLCBldmVyeSBlcnJvciBpcyBjb25zaWRlcmVkCiAgICogbWF0Y2hpbmcuCiAgICoKICAgKiBJZiB0aGUgZXJyb3IgaXMgaW50ZXJjZXB0ZWQsIHRoZSBbb25FcnJvcl0gZnVuY3Rpb24gY2FuIGRlY2lkZSB3aGF0IHRvIGRvCiAgICogd2l0aCBpdC4gSXQgY2FuIHRocm93IGlmIGl0IHdhbnRzIHRvIHJhaXNlIGEgbmV3IChvciB0aGUgc2FtZSkgZXJyb3IsCiAgICogb3Igc2ltcGx5IHJldHVybiB0byBtYWtlIHRoaXMgc3RyZWFtIGZvcmdldCB0aGUgZXJyb3IuCiAgICogSWYgdGhlIHJlY2VpdmVkIGBlcnJvcmAgdmFsdWUgaXMgdGhyb3duIGFnYWluIGJ5IHRoZSBbb25FcnJvcl0gZnVuY3Rpb24sCiAgICogaXQgYWN0cyBsaWtlIGEgYHJldGhyb3dgIGFuZCBpdCBpcyBlbWl0dGVkIGFsb25nIHdpdGggaXRzIG9yaWdpbmFsCiAgICogc3RhY2sgdHJhY2UsIG5vdCB0aGUgc3RhY2sgdHJhY2Ugb2YgdGhlIGB0aHJvd2AgaW5zaWRlIFtvbkVycm9yXS4KICAgKgogICAqIElmIHlvdSBuZWVkIHRvIHRyYW5zZm9ybSBhbiBlcnJvciBpbnRvIGEgZGF0YSBldmVudCwgdXNlIHRoZSBtb3JlIGdlbmVyaWMKICAgKiBbU3RyZWFtLnRyYW5zZm9ybV0gdG8gaGFuZGxlIHRoZSBldmVudCBieSB3cml0aW5nIGEgZGF0YSBldmVudCB0bwogICAqIHRoZSBvdXRwdXQgc2luay4KICAgKgogICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gaXMgYSBicm9hZGNhc3Qgc3RyZWFtIGlmIHRoaXMgc3RyZWFtIGlzLgogICAqIElmIGEgYnJvYWRjYXN0IHN0cmVhbSBpcyBsaXN0ZW5lZCB0byBtb3JlIHRoYW4gb25jZSwgZWFjaCBzdWJzY3JpcHRpb24KICAgKiB3aWxsIGluZGl2aWR1YWxseSBwZXJmb3JtIHRoZSBgdGVzdGAgYW5kIGhhbmRsZSB0aGUgZXJyb3IuCiAgICovCiAgU3RyZWFtPFQ+IGhhbmRsZUVycm9yKEZ1bmN0aW9uIG9uRXJyb3IsIHtib29sIHRlc3QoZXJyb3IpfSkgewogICAgcmV0dXJuIG5ldyBfSGFuZGxlRXJyb3JTdHJlYW08VD4odGhpcywgb25FcnJvciwgdGVzdCk7CiAgfQoKICAvKioKICAgKiBUcmFuc2Zvcm1zIGVhY2ggZWxlbWVudCBvZiB0aGlzIHN0cmVhbSBpbnRvIGEgc2VxdWVuY2Ugb2YgZWxlbWVudHMuCiAgICoKICAgKiBSZXR1cm5zIGEgbmV3IHN0cmVhbSB3aGVyZSBlYWNoIGVsZW1lbnQgb2YgdGhpcyBzdHJlYW0gaXMgcmVwbGFjZWQKICAgKiBieSB6ZXJvIG9yIG1vcmUgZGF0YSBldmVudHMuCiAgICogVGhlIGV2ZW50IHZhbHVlcyBhcmUgcHJvdmlkZWQgYXMgYW4gW0l0ZXJhYmxlXSBieSBhIGNhbGwgdG8gW2NvbnZlcnRdCiAgICogd2l0aCB0aGUgZWxlbWVudCBhcyBhcmd1bWVudCwgYW5kIHRoZSBlbGVtZW50cyBvZiB0aGF0IGl0ZXJhYmxlIGlzCiAgICogZW1pdHRlZCBpbiBpdGVyYXRpb24gb3JkZXIuCiAgICogSWYgY2FsbGluZyBbY29udmVydF0gdGhyb3dzLCBvciBpZiB0aGUgaXRlcmF0aW9uIG9mIHRoZSByZXR1cm5lZCB2YWx1ZXMKICAgKiB0aHJvd3MsIHRoZSBlcnJvciBpcyBlbWl0dGVkIG9uIHRoZSByZXR1cm5lZCBzdHJlYW0gYW5kIGl0ZXJhdGlvbiBlbmRzCiAgICogZm9yIHRoYXQgZWxlbWVudCBvZiB0aGlzIHN0cmVhbS4KICAgKgogICAqIEVycm9yIGV2ZW50cyBhbmQgdGhlIGRvbmUgZXZlbnQgb2YgdGhpcyBzdHJlYW0gYXJlIGZvcndhcmRlZCBkaXJlY3RseQogICAqIHRvIHRoZSByZXR1cm5lZCBzdHJlYW0uCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgc3RyZWFtIGlzIGEgYnJvYWRjYXN0IHN0cmVhbSBpZiB0aGlzIHN0cmVhbSBpcy4KICAgKiBJZiBhIGJyb2FkY2FzdCBzdHJlYW0gaXMgbGlzdGVuZWQgdG8gbW9yZSB0aGFuIG9uY2UsIGVhY2ggc3Vic2NyaXB0aW9uCiAgICogd2lsbCBpbmRpdmlkdWFsbHkgY2FsbCBgY29udmVydGAgYW5kIGV4cGFuZCB0aGUgZXZlbnRzLgogICAqLwogIFN0cmVhbTxTPiBleHBhbmQ8Uz4oSXRlcmFibGU8Uz4gY29udmVydChUIGVsZW1lbnQpKSB7CiAgICByZXR1cm4gbmV3IF9FeHBhbmRTdHJlYW08VCwgUz4odGhpcywgY29udmVydCk7CiAgfQoKICAvKioKICAgKiBQaXBlcyB0aGUgZXZlbnRzIG9mIHRoaXMgc3RyZWFtIGludG8gW3N0cmVhbUNvbnN1bWVyXS4KICAgKgogICAqIEFsbCBldmVudHMgb2YgdGhpcyBzdHJlYW0gYXJlIGFkZGVkIHRvIGBzdHJlYW1Db25zdW1lcmAgdXNpbmcKICAgKiBbU3RyZWFtQ29uc3VtZXIuYWRkU3RyZWFtXS4KICAgKiBUaGUgYHN0cmVhbUNvbnN1bWVyYCBpcyBjbG9zZWQgd2hlbiB0aGlzIHN0cmVhbSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgYWRkZWQKICAgKiB0byBpdCAtIHdoZW4gdGhlIGZ1dHVyZSByZXR1cm5lZCBieSBgYWRkU3RyZWFtYCBjb21wbGV0ZXMgd2l0aG91dCBhbiBlcnJvci4KICAgKgogICAqIFJldHVybnMgYSBmdXR1cmUgd2hpY2ggY29tcGxldGVzIHdoZW4gdGhpcyBzdHJlYW0gaGFzIGJlZW4gY29uc3VtZWQKICAgKiBhbmQgdGhlIGNvbnN1bWVyIGhhcyBiZWVuIGNsb3NlZC4KICAgKgogICAqIFRoZSByZXR1cm5lZCBmdXR1cmUgY29tcGxldGVzIHdpdGggdGhlIHNhbWUgcmVzdWx0IGFzIHRoZSBmdXR1cmUgcmV0dXJuZWQKICAgKiBieSBbU3RyZWFtQ29uc3VtZXIuY2xvc2VdLgogICAqIElmIHRoZSBjYWxsIHRvIFtTdHJlYW1Db25zdW1lci5hZGRTdHJlYW1dIGZhaWxzIGluIHNvbWUgd2F5LCB0aGlzCiAgICogbWV0aG9kIGZhaWxzIGluIHRoZSBzYW1lIHdheS4KICAgKi8KICBGdXR1cmUgcGlwZShTdHJlYW1Db25zdW1lcjxUPiBzdHJlYW1Db25zdW1lcikgewogICAgcmV0dXJuIHN0cmVhbUNvbnN1bWVyLmFkZFN0cmVhbSh0aGlzKS50aGVuKChfKSA9PiBzdHJlYW1Db25zdW1lci5jbG9zZSgpKTsKICB9CgogIC8qKgogICAqIEFwcGxpZXMgIFtzdHJlYW1UcmFuc2Zvcm1lcl0gdG8gdGhpcyBzdHJlYW0uCiAgICoKICAgKiBSZXR1cm5zIHRoZSB0cmFuc2Zvcm1lZCBzdHJlYW0sCiAgICogdGhhdCBpcywgdGhlIHJlc3VsdCBvZiBgc3RyZWFtVHJhbnNmb3JtZXIuYmluZCh0aGlzKWAuCiAgICogVGhpcyBtZXRob2Qgc2ltcGx5IGFsbG93cyB3cml0aW5nIHRoZSBjYWxsIHRvIGBzdHJlYW1UcmFuc2Zvcm1lci5iaW5kYAogICAqIGluIGEgY2hhaW5lZCBmYXNoaW9uLCBsaWtlCiAgICogYGBgCiAgICogc3RyZWFtLm1hcChtYXBwaW5nKS50cmFuc2Zvcm0odHJhbnNmb3JtYXRpb24pLnRvTGlzdCgpCiAgICogYGBgCiAgICogd2hpY2ggY2FuIGJlIG1vcmUgY29udmVuaWVudCB0aGFuIGNhbGxpbmcgYGJpbmRgIGRpcmVjdGx5LgogICAqCiAgICogVGhlIFtzdHJlYW1UcmFuc2Zvcm1lcl0gY2FuIHJldHVybiBhbnkgc3RyZWFtLgogICAqIFdoZXRoZXIgdGhlIHJldHVybmVkIHN0cmVhbSBpcyBhIGJyb2FkY2FzdCBzdHJlYW0gb3Igbm90LAogICAqIGFuZCB3aGljaCBlbGVtZW50cyBpdCB3aWxsIGNvbnRhaW4sCiAgICogaXMgZW50aXJlbHkgdXAgdG8gdGhlIHRyYW5zZm9ybWF0aW9uLgogICAqLwogIFN0cmVhbTxTPiB0cmFuc2Zvcm08Uz4oU3RyZWFtVHJhbnNmb3JtZXI8VCwgUz4gc3RyZWFtVHJhbnNmb3JtZXIpIHsKICAgIHJldHVybiBzdHJlYW1UcmFuc2Zvcm1lci5iaW5kKHRoaXMpOwogIH0KCiAgLyoqCiAgICogQ29tYmluZXMgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMgYnkgcmVwZWF0ZWRseSBhcHBseWluZyBbY29tYmluZV0uCiAgICoKICAgKiBTaW1pbGFyIHRvIFtJdGVyYWJsZS5yZWR1Y2VdLCB0aGlzIGZ1bmN0aW9uIG1haW50YWlucyBhIHZhbHVlLAogICAqIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhpcyBzdHJlYW0KICAgKiBhbmQgdXBkYXRlZCBmb3IgZWFjaCBmdXJ0aGVyIGVsZW1lbnQgb2YgdGhpcyBzdHJlYW0uCiAgICogRm9yIGVhY2ggZWxlbWVudCBhZnRlciB0aGUgZmlyc3QsCiAgICogdGhlIHZhbHVlIGlzIHVwZGF0ZWQgdG8gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIFtjb21iaW5lXQogICAqIHdpdGggdGhlIHByZXZpb3VzIHZhbHVlIGFuZCB0aGUgZWxlbWVudC4KICAgKgogICAqIFdoZW4gdGhpcyBzdHJlYW0gaXMgZG9uZSwgdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aAogICAqIHRoZSB2YWx1ZSBhdCB0aGF0IHRpbWUuCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBpcyBlbXB0eSwgdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aAogICAqIGFuIGVycm9yLgogICAqIElmIHRoaXMgc3RyZWFtIGVtaXRzIGFuIGVycm9yLCBvciB0aGUgY2FsbCB0byBbY29tYmluZV0gdGhyb3dzLAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhhdCBlcnJvciwKICAgKiBhbmQgcHJvY2Vzc2luZyBpcyBzdG9wcGVkLgogICAqLwogIEZ1dHVyZTxUPiByZWR1Y2UoVCBjb21iaW5lKFQgcHJldmlvdXMsIFQgZWxlbWVudCkpIHsKICAgIF9GdXR1cmU8VD4gcmVzdWx0ID0gbmV3IF9GdXR1cmU8VD4oKTsKICAgIGJvb2wgc2VlbkZpcnN0ID0gZmFsc2U7CiAgICBUIHZhbHVlOwogICAgU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbjsKICAgIHN1YnNjcmlwdGlvbiA9IHRoaXMubGlzdGVuKAogICAgICAgIChUIGVsZW1lbnQpIHsKICAgICAgICAgIGlmIChzZWVuRmlyc3QpIHsKICAgICAgICAgICAgX3J1blVzZXJDb2RlKCgpID0+IGNvbWJpbmUodmFsdWUsIGVsZW1lbnQpLCAoVCBuZXdWYWx1ZSkgewogICAgICAgICAgICAgIHZhbHVlID0gbmV3VmFsdWU7CiAgICAgICAgICAgIH0sIF9jYW5jZWxBbmRFcnJvckNsb3N1cmUoc3Vic2NyaXB0aW9uLCByZXN1bHQpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhbHVlID0gZWxlbWVudDsKICAgICAgICAgICAgc2VlbkZpcnN0ID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IHJlc3VsdC5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIGlmICghc2VlbkZpcnN0KSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgLy8gVGhyb3cgYW5kIHJlY2F0Y2gsIGluc3RlYWQgb2YganVzdCBkb2luZwogICAgICAgICAgICAgIC8vICBfY29tcGxldGVXaXRoRXJyb3JDYWxsYmFjaywgZSwgdGhlRXJyb3IsIFN0YWNrVHJhY2UuY3VycmVudCksCiAgICAgICAgICAgICAgLy8gdG8gZW5zdXJlIHRoYXQgdGhlIHN0YWNrVHJhY2UgaXMgc2V0IG9uIHRoZSBlcnJvci4KICAgICAgICAgICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgICAgICAgIF9jb21wbGV0ZVdpdGhFcnJvckNhbGxiYWNrKHJlc3VsdCwgZSwgcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlc3VsdC5fY29tcGxldGUodmFsdWUpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLyoqCiAgICogQ29tYmluZXMgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMgYnkgcmVwZWF0ZWRseSBhcHBseWluZyBbY29tYmluZV0uCiAgICoKICAgKiBTaW1pbGFyIHRvIFtJdGVyYWJsZS5mb2xkXSwgdGhpcyBmdW5jdGlvbiBtYWludGFpbnMgYSB2YWx1ZSwKICAgKiBzdGFydGluZyB3aXRoIFtpbml0aWFsVmFsdWVdIGFuZCB1cGRhdGVkIGZvciBlYWNoIGVsZW1lbnQgb2YKICAgKiB0aGlzIHN0cmVhbS4KICAgKiBGb3IgZWFjaCBlbGVtZW50LCB0aGUgdmFsdWUgaXMgdXBkYXRlZCB0byB0aGUgcmVzdWx0IG9mIGNhbGxpbmcKICAgKiBbY29tYmluZV0gd2l0aCB0aGUgcHJldmlvdXMgdmFsdWUgYW5kIHRoZSBlbGVtZW50LgogICAqCiAgICogV2hlbiB0aGlzIHN0cmVhbSBpcyBkb25lLCB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoCiAgICogdGhlIHZhbHVlIGF0IHRoYXQgdGltZS4KICAgKiBGb3IgYW4gZW1wdHkgc3RyZWFtLCB0aGUgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIFtpbml0aWFsVmFsdWVdLgogICAqCiAgICogSWYgdGhpcyBzdHJlYW0gZW1pdHMgYW4gZXJyb3IsIG9yIHRoZSBjYWxsIHRvIFtjb21iaW5lXSB0aHJvd3MsCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGF0IGVycm9yLAogICAqIGFuZCBwcm9jZXNzaW5nIGlzIHN0b3BwZWQuCiAgICovCiAgRnV0dXJlPFM+IGZvbGQ8Uz4oUyBpbml0aWFsVmFsdWUsIFMgY29tYmluZShTIHByZXZpb3VzLCBUIGVsZW1lbnQpKSB7CiAgICBfRnV0dXJlPFM+IHJlc3VsdCA9IG5ldyBfRnV0dXJlPFM+KCk7CiAgICBTIHZhbHVlID0gaW5pdGlhbFZhbHVlOwogICAgU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbjsKICAgIHN1YnNjcmlwdGlvbiA9IHRoaXMubGlzdGVuKAogICAgICAgIChUIGVsZW1lbnQpIHsKICAgICAgICAgIF9ydW5Vc2VyQ29kZSgoKSA9PiBjb21iaW5lKHZhbHVlLCBlbGVtZW50KSwgKFMgbmV3VmFsdWUpIHsKICAgICAgICAgICAgdmFsdWUgPSBuZXdWYWx1ZTsKICAgICAgICAgIH0sIF9jYW5jZWxBbmRFcnJvckNsb3N1cmUoc3Vic2NyaXB0aW9uLCByZXN1bHQpKTsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IHJlc3VsdC5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIHJlc3VsdC5fY29tcGxldGUodmFsdWUpOwogICAgICAgIH0sCiAgICAgICAgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLyoqCiAgICogQ29tYmluZXMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBlbGVtZW50cyBpbnRvIGEgc2luZ2xlIHN0cmluZy4KICAgKgogICAqIEVhY2ggZWxlbWVudCBpcyBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgdXNpbmcgaXRzIFtPYmplY3QudG9TdHJpbmddIG1ldGhvZC4KICAgKiBJZiBbc2VwYXJhdG9yXSBpcyBwcm92aWRlZCwgaXQgaXMgaW5zZXJ0ZWQgYmV0d2VlbiBlbGVtZW50IHN0cmluZwogICAqIHJlcHJlc2VudGF0aW9ucy4KICAgKgogICAqIFRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhlIGNvbWJpbmVkIHN0cmluZyB3aGVuIHRoaXMgc3RyZWFtCiAgICogaXMgZG9uZS4KICAgKgogICAqIElmIHRoaXMgc3RyZWFtIGVtaXRzIGFuIGVycm9yLCBvciB0aGUgY2FsbCB0byBbT2JqZWN0LnRvU3RyaW5nXSB0aHJvd3MsCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGF0IGVycm9yLAogICAqIGFuZCBwcm9jZXNzaW5nIHN0b3BzLgogICAqLwogIEZ1dHVyZTxTdHJpbmc+IGpvaW4oW1N0cmluZyBzZXBhcmF0b3IgPSAiIl0pIHsKICAgIF9GdXR1cmU8U3RyaW5nPiByZXN1bHQgPSBuZXcgX0Z1dHVyZTxTdHJpbmc+KCk7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbjsKICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgc3Vic2NyaXB0aW9uID0gdGhpcy5saXN0ZW4oCiAgICAgICAgKFQgZWxlbWVudCkgewogICAgICAgICAgaWYgKCFmaXJzdCkgewogICAgICAgICAgICBidWZmZXIud3JpdGUoc2VwYXJhdG9yKTsKICAgICAgICAgIH0KICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBidWZmZXIud3JpdGUoZWxlbWVudCk7CiAgICAgICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgICAgIF9jYW5jZWxBbmRFcnJvcldpdGhSZXBsYWNlbWVudChzdWJzY3JpcHRpb24sIHJlc3VsdCwgZSwgcyk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBvbkVycm9yOiByZXN1bHQuX2NvbXBsZXRlRXJyb3IsCiAgICAgICAgb25Eb25lOiAoKSB7CiAgICAgICAgICByZXN1bHQuX2NvbXBsZXRlKGJ1ZmZlci50b1N0cmluZygpKTsKICAgICAgICB9LAogICAgICAgIGNhbmNlbE9uRXJyb3I6IHRydWUpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8qKgogICAqIFJldHVybnMgd2hldGhlciBbbmVlZGxlXSBvY2N1cnMgaW4gdGhlIGVsZW1lbnRzIHByb3ZpZGVkIGJ5IHRoaXMgc3RyZWFtLgogICAqCiAgICogQ29tcGFyZXMgZWFjaCBlbGVtZW50IG9mIHRoaXMgc3RyZWFtIHRvIFtuZWVkbGVdIHVzaW5nIFtPYmplY3QuPT1dLgogICAqIElmIGFuIGVxdWFsIGVsZW1lbnQgaXMgZm91bmQsIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggYHRydWVgLgogICAqIElmIHRoaXMgc3RyZWFtIGVuZHMgd2l0aG91dCBmaW5kaW5nIGEgbWF0Y2gsIHRoZSBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGgKICAgKiBgZmFsc2VgLgogICAqCiAgICogSWYgdGhpcyBzdHJlYW0gZW1pdHMgYW4gZXJyb3IsIG9yIHRoZSBjYWxsIHRvIFtPYmplY3QuPT1dIHRocm93cywKICAgKiB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoYXQgZXJyb3IsCiAgICogYW5kIHByb2Nlc3Npbmcgc3RvcHMuCiAgICovCiAgRnV0dXJlPGJvb2w+IGNvbnRhaW5zKE9iamVjdCBuZWVkbGUpIHsKICAgIF9GdXR1cmU8Ym9vbD4gZnV0dXJlID0gbmV3IF9GdXR1cmU8Ym9vbD4oKTsKICAgIFN0cmVhbVN1YnNjcmlwdGlvbiBzdWJzY3JpcHRpb247CiAgICBzdWJzY3JpcHRpb24gPSB0aGlzLmxpc3RlbigKICAgICAgICAoVCBlbGVtZW50KSB7CiAgICAgICAgICBfcnVuVXNlckNvZGUoKCkgPT4gKGVsZW1lbnQgPT0gbmVlZGxlKSwgKGJvb2wgaXNNYXRjaCkgewogICAgICAgICAgICBpZiAoaXNNYXRjaCkgewogICAgICAgICAgICAgIF9jYW5jZWxBbmRWYWx1ZShzdWJzY3JpcHRpb24sIGZ1dHVyZSwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYW5jZWxBbmRFcnJvckNsb3N1cmUoc3Vic2NyaXB0aW9uLCBmdXR1cmUpKTsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IGZ1dHVyZS5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIGZ1dHVyZS5fY29tcGxldGUoZmFsc2UpOwogICAgICAgIH0sCiAgICAgICAgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICByZXR1cm4gZnV0dXJlOwogIH0KCiAgLyoqCiAgICogRXhlY3V0ZXMgW2FjdGlvbl0gb24gZWFjaCBlbGVtZW50IG9mIHRoaXMgc3RyZWFtLgogICAqCiAgICogQ29tcGxldGVzIHRoZSByZXR1cm5lZCBbRnV0dXJlXSB3aGVuIGFsbCBlbGVtZW50cyBvZiB0aGlzIHN0cmVhbQogICAqIGhhdmUgYmVlbiBwcm9jZXNzZWQuCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBlbWl0cyBhbiBlcnJvciwgb3IgaWYgdGhlIGNhbGwgdG8gW2FjdGlvbl0gdGhyb3dzLAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgY29tcGxldGVzIHdpdGggdGhhdCBlcnJvciwKICAgKiBhbmQgcHJvY2Vzc2luZyBzdG9wcy4KICAgKi8KICBGdXR1cmUgZm9yRWFjaCh2b2lkIGFjdGlvbihUIGVsZW1lbnQpKSB7CiAgICBfRnV0dXJlIGZ1dHVyZSA9IG5ldyBfRnV0dXJlKCk7CiAgICBTdHJlYW1TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uOwogICAgc3Vic2NyaXB0aW9uID0gdGhpcy5saXN0ZW4oCiAgICAgICAgKFQgZWxlbWVudCkgewogICAgICAgICAgLy8gVE9ETyhmbG9pdHNjaCk6IHRoZSB0eXBlIHNob3VsZCBiZSAndm9pZCcgYW5kIGluZmVycmVkLgogICAgICAgICAgX3J1blVzZXJDb2RlPGR5bmFtaWM+KCgpID0+IGFjdGlvbihlbGVtZW50KSwgKF8pIHt9LAogICAgICAgICAgICAgIF9jYW5jZWxBbmRFcnJvckNsb3N1cmUoc3Vic2NyaXB0aW9uLCBmdXR1cmUpKTsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IGZ1dHVyZS5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIGZ1dHVyZS5fY29tcGxldGUobnVsbCk7CiAgICAgICAgfSwKICAgICAgICBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIHJldHVybiBmdXR1cmU7CiAgfQoKICAvKioKICAgKiBDaGVja3Mgd2hldGhlciBbdGVzdF0gYWNjZXB0cyBhbGwgZWxlbWVudHMgcHJvdmlkZWQgYnkgdGhpcyBzdHJlYW0uCiAgICoKICAgKiBDYWxscyBbdGVzdF0gb24gZWFjaCBlbGVtZW50IG9mIHRoaXMgc3RyZWFtLgogICAqIElmIHRoZSBjYWxsIHJldHVybnMgYGZhbHNlYCwgdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCBgZmFsc2VgCiAgICogYW5kIHByb2Nlc3Npbmcgc3RvcHMuCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBlbmRzIHdpdGhvdXQgZmluZGluZyBhbiBlbGVtZW50IHRoYXQgW3Rlc3RdIHJlamVjdHMsCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCBgdHJ1ZWAuCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBlbWl0cyBhbiBlcnJvciwgb3IgaWYgdGhlIGNhbGwgdG8gW3Rlc3RdIHRocm93cywKICAgKiB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoYXQgZXJyb3IsCiAgICogYW5kIHByb2Nlc3Npbmcgc3RvcHMuCiAgICovCiAgRnV0dXJlPGJvb2w+IGV2ZXJ5KGJvb2wgdGVzdChUIGVsZW1lbnQpKSB7CiAgICBfRnV0dXJlPGJvb2w+IGZ1dHVyZSA9IG5ldyBfRnV0dXJlPGJvb2w+KCk7CiAgICBTdHJlYW1TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uOwogICAgc3Vic2NyaXB0aW9uID0gdGhpcy5saXN0ZW4oCiAgICAgICAgKFQgZWxlbWVudCkgewogICAgICAgICAgX3J1blVzZXJDb2RlKCgpID0+IHRlc3QoZWxlbWVudCksIChib29sIGlzTWF0Y2gpIHsKICAgICAgICAgICAgaWYgKCFpc01hdGNoKSB7CiAgICAgICAgICAgICAgX2NhbmNlbEFuZFZhbHVlKHN1YnNjcmlwdGlvbiwgZnV0dXJlLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYW5jZWxBbmRFcnJvckNsb3N1cmUoc3Vic2NyaXB0aW9uLCBmdXR1cmUpKTsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IGZ1dHVyZS5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIGZ1dHVyZS5fY29tcGxldGUodHJ1ZSk7CiAgICAgICAgfSwKICAgICAgICBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIHJldHVybiBmdXR1cmU7CiAgfQoKICAvKioKICAgKiBDaGVja3Mgd2hldGhlciBbdGVzdF0gYWNjZXB0cyBhbnkgZWxlbWVudCBwcm92aWRlZCBieSB0aGlzIHN0cmVhbS4KICAgKgogICAqIENhbGxzIFt0ZXN0XSBvbiBlYWNoIGVsZW1lbnQgb2YgdGhpcyBzdHJlYW0uCiAgICogSWYgdGhlIGNhbGwgcmV0dXJucyBgdHJ1ZWAsIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggYHRydWVgCiAgICogYW5kIHByb2Nlc3Npbmcgc3RvcHMuCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBlbmRzIHdpdGhvdXQgZmluZGluZyBhbiBlbGVtZW50IHRoYXQgW3Rlc3RdIGFjY2VwdHMsCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCBgZmFsc2VgLgogICAqCiAgICogSWYgdGhpcyBzdHJlYW0gZW1pdHMgYW4gZXJyb3IsIG9yIGlmIHRoZSBjYWxsIHRvIFt0ZXN0XSB0aHJvd3MsCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGF0IGVycm9yLAogICAqIGFuZCBwcm9jZXNzaW5nIHN0b3BzLgogICAqLwogIEZ1dHVyZTxib29sPiBhbnkoYm9vbCB0ZXN0KFQgZWxlbWVudCkpIHsKICAgIF9GdXR1cmU8Ym9vbD4gZnV0dXJlID0gbmV3IF9GdXR1cmU8Ym9vbD4oKTsKICAgIFN0cmVhbVN1YnNjcmlwdGlvbiBzdWJzY3JpcHRpb247CiAgICBzdWJzY3JpcHRpb24gPSB0aGlzLmxpc3RlbigKICAgICAgICAoVCBlbGVtZW50KSB7CiAgICAgICAgICBfcnVuVXNlckNvZGUoKCkgPT4gdGVzdChlbGVtZW50KSwgKGJvb2wgaXNNYXRjaCkgewogICAgICAgICAgICBpZiAoaXNNYXRjaCkgewogICAgICAgICAgICAgIF9jYW5jZWxBbmRWYWx1ZShzdWJzY3JpcHRpb24sIGZ1dHVyZSwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYW5jZWxBbmRFcnJvckNsb3N1cmUoc3Vic2NyaXB0aW9uLCBmdXR1cmUpKTsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IGZ1dHVyZS5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIGZ1dHVyZS5fY29tcGxldGUoZmFsc2UpOwogICAgICAgIH0sCiAgICAgICAgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICByZXR1cm4gZnV0dXJlOwogIH0KCiAgLyoqCiAgICogVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIHN0cmVhbS4KICAgKgogICAqIFdhaXRzIGZvciBhbGwgZWxlbWVudHMgb2YgdGhpcyBzdHJlYW0uIFdoZW4gdGhpcyBzdHJlYW0gZW5kcywKICAgKiB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBlbWl0cyBhbiBlcnJvciwKICAgKiB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoYXQgZXJyb3IsCiAgICogYW5kIHByb2Nlc3Npbmcgc3RvcHMuCiAgICoKICAgKiBUaGlzIG9wZXJhdGlvbiBsaXN0ZW5zIHRvIHRoaXMgc3RyZWFtLCBhbmQgYSBub24tYnJvYWRjYXN0IHN0cmVhbSBjYW5ub3QKICAgKiBiZSByZXVzZWQgYWZ0ZXIgZmluZGluZyBpdHMgbGVuZ3RoLgogICAqLwogIEZ1dHVyZTxpbnQ+IGdldCBsZW5ndGggewogICAgX0Z1dHVyZTxpbnQ+IGZ1dHVyZSA9IG5ldyBfRnV0dXJlPGludD4oKTsKICAgIGludCBjb3VudCA9IDA7CiAgICB0aGlzLmxpc3RlbigKICAgICAgICAoXykgewogICAgICAgICAgY291bnQrKzsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IGZ1dHVyZS5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIGZ1dHVyZS5fY29tcGxldGUoY291bnQpOwogICAgICAgIH0sCiAgICAgICAgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICByZXR1cm4gZnV0dXJlOwogIH0KCiAgLyoqCiAgICogV2hldGhlciB0aGlzIHN0cmVhbSBjb250YWlucyBhbnkgZWxlbWVudHMuCiAgICoKICAgKiBXYWl0cyBmb3IgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhpcyBzdHJlYW0sIHRoZW4gY29tcGxldGVzIHRoZSByZXR1cm5lZAogICAqIGZ1dHVyZSB3aXRoIGB0cnVlYC4KICAgKiBJZiB0aGlzIHN0cmVhbSBlbmRzIHdpdGhvdXQgZW1pdHRpbmcgYW55IGVsZW1lbnRzLCB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzCiAgICogY29tcGxldGVkIHdpdGggYGZhbHNlYC4KICAgKgogICAqIElmIHRoZSBmaXJzdCBldmVudCBpcyBhbiBlcnJvciwgdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGF0CiAgICogZXJyb3IuCiAgICoKICAgKiBUaGlzIG9wZXJhdGlvbiBsaXN0ZW5zIHRvIHRoaXMgc3RyZWFtLCBhbmQgYSBub24tYnJvYWRjYXN0IHN0cmVhbSBjYW5ub3QKICAgKiBiZSByZXVzZWQgYWZ0ZXIgY2hlY2tpbmcgd2hldGhlciBpdCBpcyBlbXB0eS4KICAgKi8KICBGdXR1cmU8Ym9vbD4gZ2V0IGlzRW1wdHkgewogICAgX0Z1dHVyZTxib29sPiBmdXR1cmUgPSBuZXcgX0Z1dHVyZTxib29sPigpOwogICAgU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbjsKICAgIHN1YnNjcmlwdGlvbiA9IHRoaXMubGlzdGVuKAogICAgICAgIChfKSB7CiAgICAgICAgICBfY2FuY2VsQW5kVmFsdWUoc3Vic2NyaXB0aW9uLCBmdXR1cmUsIGZhbHNlKTsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IGZ1dHVyZS5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIGZ1dHVyZS5fY29tcGxldGUodHJ1ZSk7CiAgICAgICAgfSwKICAgICAgICBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIHJldHVybiBmdXR1cmU7CiAgfQoKICAvKioKICAgKiBBZGFwdCB0aGlzIHN0cmVhbSB0byBiZSBhIGBTdHJlYW08Uj5gLgogICAqCiAgICogVGhpcyBzdHJlYW0gaXMgd3JhcHBlZCBhcyBhIGBTdHJlYW08Uj5gIHdoaWNoIGNoZWNrcyBhdCBydW4tdGltZSB0aGF0CiAgICogZWFjaCBkYXRhIGV2ZW50IGVtaXR0ZWQgYnkgdGhpcyBzdHJlYW0gaXMgYWxzbyBhbiBpbnN0YW5jZSBvZiBbUl0uCiAgICovCiAgU3RyZWFtPFI+IGNhc3Q8Uj4oKSA9PiBTdHJlYW0uY2FzdEZyb208VCwgUj4odGhpcyk7CiAgLyoqCiAgICogQ29sbGVjdHMgYWxsIGVsZW1lbnRzIG9mIHRoaXMgc3RyZWFtIGluIGEgW0xpc3RdLgogICAqCiAgICogQ3JlYXRlcyBhIGBMaXN0PFQ+YCBhbmQgYWRkcyBhbGwgZWxlbWVudHMgb2YgdGhpcyBzdHJlYW0gdG8gdGhlIGxpc3QKICAgKiBpbiB0aGUgb3JkZXIgdGhleSBhcnJpdmUuCiAgICogV2hlbiB0aGlzIHN0cmVhbSBlbmRzLCB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoYXQgbGlzdC4KICAgKgogICAqIElmIHRoaXMgc3RyZWFtIGVtaXRzIGFuIGVycm9yLAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhhdCBlcnJvciwKICAgKiBhbmQgcHJvY2Vzc2luZyBzdG9wcy4KICAgKi8KICBGdXR1cmU8TGlzdDxUPj4gdG9MaXN0KCkgewogICAgTGlzdDxUPiByZXN1bHQgPSA8VD5bXTsKICAgIF9GdXR1cmU8TGlzdDxUPj4gZnV0dXJlID0gbmV3IF9GdXR1cmU8TGlzdDxUPj4oKTsKICAgIHRoaXMubGlzdGVuKAogICAgICAgIChUIGRhdGEpIHsKICAgICAgICAgIHJlc3VsdC5hZGQoZGF0YSk7CiAgICAgICAgfSwKICAgICAgICBvbkVycm9yOiBmdXR1cmUuX2NvbXBsZXRlRXJyb3IsCiAgICAgICAgb25Eb25lOiAoKSB7CiAgICAgICAgICBmdXR1cmUuX2NvbXBsZXRlKHJlc3VsdCk7CiAgICAgICAgfSwKICAgICAgICBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIHJldHVybiBmdXR1cmU7CiAgfQoKICAvKioKICAgKiBDb2xsZWN0cyB0aGUgZGF0YSBvZiB0aGlzIHN0cmVhbSBpbiBhIFtTZXRdLgogICAqCiAgICogQ3JlYXRlcyBhIGBTZXQ8VD5gIGFuZCBhZGRzIGFsbCBlbGVtZW50cyBvZiB0aGlzIHN0cmVhbSB0byB0aGUgc2V0LgogICAqIGluIHRoZSBvcmRlciB0aGV5IGFycml2ZS4KICAgKiBXaGVuIHRoaXMgc3RyZWFtIGVuZHMsIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhhdCBzZXQuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgc2V0IGlzIHRoZSBzYW1lIHR5cGUgYXMgcmV0dXJuZWQgYnkgYG5ldyBTZXQ8VD4oKWAuCiAgICogSWYgYW5vdGhlciB0eXBlIG9mIHNldCBpcyBuZWVkZWQsIGVpdGhlciB1c2UgW2ZvckVhY2hdIHRvIGFkZCBlYWNoCiAgICogZWxlbWVudCB0byB0aGUgc2V0LCBvciB1c2UKICAgKiBgdG9MaXN0KCkudGhlbigobGlzdCkgPT4gbmV3IFNvbWVPdGhlclNldC5mcm9tKGxpc3QpKWAKICAgKiB0byBjcmVhdGUgdGhlIHNldC4KICAgKgogICAqIElmIHRoaXMgc3RyZWFtIGVtaXRzIGFuIGVycm9yLAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhhdCBlcnJvciwKICAgKiBhbmQgcHJvY2Vzc2luZyBzdG9wcy4KICAgKi8KICBGdXR1cmU8U2V0PFQ+PiB0b1NldCgpIHsKICAgIFNldDxUPiByZXN1bHQgPSBuZXcgU2V0PFQ+KCk7CiAgICBfRnV0dXJlPFNldDxUPj4gZnV0dXJlID0gbmV3IF9GdXR1cmU8U2V0PFQ+PigpOwogICAgdGhpcy5saXN0ZW4oCiAgICAgICAgKFQgZGF0YSkgewogICAgICAgICAgcmVzdWx0LmFkZChkYXRhKTsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IGZ1dHVyZS5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIGZ1dHVyZS5fY29tcGxldGUocmVzdWx0KTsKICAgICAgICB9LAogICAgICAgIGNhbmNlbE9uRXJyb3I6IHRydWUpOwogICAgcmV0dXJuIGZ1dHVyZTsKICB9CgogIC8qKgogICAqIERpc2NhcmRzIGFsbCBkYXRhIG9uIHRoaXMgc3RyZWFtLCBidXQgc2lnbmFscyB3aGVuIGl0IGlzIGRvbmUgb3IgYW4gZXJyb3IKICAgKiBvY2N1cnJlZC4KICAgKgogICAqIFdoZW4gc3Vic2NyaWJpbmcgdXNpbmcgW2RyYWluXSwgY2FuY2VsT25FcnJvciB3aWxsIGJlIHRydWUuIFRoaXMgbWVhbnMKICAgKiB0aGF0IHRoZSBmdXR1cmUgd2lsbCBjb21wbGV0ZSB3aXRoIHRoZSBmaXJzdCBlcnJvciBvbiB0aGlzIHN0cmVhbSBhbmQgdGhlbgogICAqIGNhbmNlbCB0aGUgc3Vic2NyaXB0aW9uLgogICAqIElmIHRoaXMgc3RyZWFtIGVtaXRzIGFuIGVycm9yLCBvciB0aGUgY2FsbCB0byBbY29tYmluZV0gdGhyb3dzLAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhhdCBlcnJvciwKICAgKiBhbmQgcHJvY2Vzc2luZyBpcyBzdG9wcGVkLgogICAqCiAgICogSW4gY2FzZSBvZiBhIGBkb25lYCBldmVudCB0aGUgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIHRoZSBnaXZlbgogICAqIFtmdXR1cmVWYWx1ZV0uCiAgICovCiAgRnV0dXJlPEU+IGRyYWluPEU+KFtFIGZ1dHVyZVZhbHVlXSkgPT4KICAgICAgbGlzdGVuKG51bGwsIGNhbmNlbE9uRXJyb3I6IHRydWUpLmFzRnV0dXJlPEU+KGZ1dHVyZVZhbHVlKTsKCiAgLyoqCiAgICogUHJvdmlkZXMgYXQgbW9zdCB0aGUgZmlyc3QgW2NvdW50XSBkYXRhIGV2ZW50cyBvZiB0aGlzIHN0cmVhbS4KICAgKgogICAqIFJldHVybnMgYSBzdHJlYW0gdGhhdCBlbWl0cyB0aGUgc2FtZSBldmVudHMgdGhhdCB0aGlzIHN0cmVhbSB3b3VsZAogICAqIGlmIGxpc3RlbmVkIHRvIGF0IHRoZSBzYW1lIHRpbWUsCiAgICogdW50aWwgZWl0aGVyIHRoaXMgc3RyZWFtIGVuZHMgb3IgaXQgaGFzIGVtaXR0ZWQgW2NvdW50XSBkYXRhIGV2ZW50cywKICAgKiBhdCB3aGljaCBwb2ludCB0aGUgcmV0dXJuZWQgc3RyZWFtIGlzIGRvbmUuCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBwcm9kdWNlcyBmZXdlciB0aGFuIFtjb3VudF0gZGF0YSBldmVudHMgYmVmb3JlIGl0J3MgZG9uZSwKICAgKiBzbyB3aWxsIHRoZSByZXR1cm5lZCBzdHJlYW0uCiAgICoKICAgKiBTdGFydHMgbGlzdGVuaW5nIHRvIHRoaXMgc3RyZWFtIHdoZW4gdGhlIHJldHVybmVkIHN0cmVhbSBpcyBsaXN0ZW5lZCB0bwogICAqIGFuZCBzdG9wcyBsaXN0ZW5pbmcgd2hlbiB0aGUgZmlyc3QgW2NvdW50XSBkYXRhIGV2ZW50cyBoYXZlIGJlZW4gcmVjZWl2ZWQuCiAgICoKICAgKiBUaGlzIG1lYW5zIHRoYXQgaWYgdGhpcyBpcyBhIHNpbmdsZS1zdWJzY3JpcHRpb24gKG5vbi1icm9hZGNhc3QpIHN0cmVhbXMKICAgKiBpdCBjYW5ub3QgYmUgcmV1c2VkIGFmdGVyIHRoZSByZXR1cm5lZCBzdHJlYW0gaGFzIGJlZW4gbGlzdGVuZWQgdG8uCiAgICoKICAgKiBJZiB0aGlzIGlzIGEgYnJvYWRjYXN0IHN0cmVhbSwgdGhlIHJldHVybmVkIHN0cmVhbSBpcyBhIGJyb2FkY2FzdCBzdHJlYW0uCiAgICogSW4gdGhhdCBjYXNlLCB0aGUgZXZlbnRzIGFyZSBvbmx5IGNvdW50ZWQgZnJvbSB0aGUgdGltZQogICAqIHRoZSByZXR1cm5lZCBzdHJlYW0gaXMgbGlzdGVuZWQgdG8uCiAgICovCiAgU3RyZWFtPFQ+IHRha2UoaW50IGNvdW50KSB7CiAgICByZXR1cm4gbmV3IF9UYWtlU3RyZWFtPFQ+KHRoaXMsIGNvdW50KTsKICB9CgogIC8qKgogICAqIEZvcndhcmRzIGRhdGEgZXZlbnRzIHdoaWxlIFt0ZXN0XSBpcyBzdWNjZXNzZnVsLgogICAqCiAgICogUmV0dXJucyBhIHN0cmVhbSB0aGF0IHByb3ZpZGVzIHRoZSBzYW1lIGV2ZW50cyBhcyB0aGlzIHN0cmVhbQogICAqIHVudGlsIFt0ZXN0XSBmYWlscyBmb3IgYSBkYXRhIGV2ZW50LgogICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gaXMgZG9uZSB3aGVuIGVpdGhlciB0aGlzIHN0cmVhbSBpcyBkb25lLAogICAqIG9yIHdoZW4gdGhpcyBzdHJlYW0gZmlyc3QgZW1pdHMgYSBkYXRhIGV2ZW50IHRoYXQgZmFpbHMgW3Rlc3RdLgogICAqCiAgICogVGhlIGB0ZXN0YCBjYWxsIGlzIGNvbnNpZGVyZWQgZmFpbGluZyBpZiBpdCByZXR1cm5zIGEgbm9uLWB0cnVlYCB2YWx1ZQogICAqIG9yIGlmIGl0IHRocm93cy4gSWYgdGhlIGB0ZXN0YCBjYWxsIHRocm93cywgdGhlIGVycm9yIGlzIGVtaXR0ZWQgYXMgdGhlCiAgICogbGFzdCBldmVudCBvbiB0aGUgcmV0dXJuZWQgc3RyZWFtcy4KICAgKgogICAqIFN0b3BzIGxpc3RlbmluZyB0byB0aGlzIHN0cmVhbSBhZnRlciB0aGUgYWNjZXB0ZWQgZWxlbWVudHMuCiAgICoKICAgKiBJbnRlcm5hbGx5IHRoZSBtZXRob2QgY2FuY2VscyBpdHMgc3Vic2NyaXB0aW9uIGFmdGVyIHRoZXNlIGVsZW1lbnRzLiBUaGlzCiAgICogbWVhbnMgdGhhdCBzaW5nbGUtc3Vic2NyaXB0aW9uIChub24tYnJvYWRjYXN0KSBzdHJlYW1zIGFyZSBjbG9zZWQgYW5kCiAgICogY2Fubm90IGJlIHJldXNlZCBhZnRlciBhIGNhbGwgdG8gdGhpcyBtZXRob2QuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgc3RyZWFtIGlzIGEgYnJvYWRjYXN0IHN0cmVhbSBpZiB0aGlzIHN0cmVhbSBpcy4KICAgKiBGb3IgYSBicm9hZGNhc3Qgc3RyZWFtLCB0aGUgZXZlbnRzIGFyZSBvbmx5IHRlc3RlZCBmcm9tIHRoZSB0aW1lCiAgICogdGhlIHJldHVybmVkIHN0cmVhbSBpcyBsaXN0ZW5lZCB0by4KICAgKi8KICBTdHJlYW08VD4gdGFrZVdoaWxlKGJvb2wgdGVzdChUIGVsZW1lbnQpKSB7CiAgICByZXR1cm4gbmV3IF9UYWtlV2hpbGVTdHJlYW08VD4odGhpcywgdGVzdCk7CiAgfQoKICAvKioKICAgKiBTa2lwcyB0aGUgZmlyc3QgW2NvdW50XSBkYXRhIGV2ZW50cyBmcm9tIHRoaXMgc3RyZWFtLgogICAqCiAgICogUmV0dXJucyBhIHN0cmVhbSB0aGF0IGVtaXRzIHRoZSBzYW1lIGV2ZW50cyBhcyB0aGlzIHN0cmVhbSB3b3VsZAogICAqIGlmIGxpc3RlbmVkIHRvIGF0IHRoZSBzYW1lIHRpbWUsIGV4Y2VwdCB0aGF0IHRoZSBmaXJzdCBbY291bnRdCiAgICogZGF0YSBldmVudHMgYXJlIG5vdCBlbWl0dGVkLgogICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gaXMgZG9uZSB3aGVuIHRoaXMgc3RyZWFtIGlzLgogICAqCiAgICogSWYgdGhpcyBzdHJlYW0gZW1pdHMgZmV3ZXIgdGhhbiBbY291bnRdIGRhdGEgZXZlbnRzCiAgICogYmVmb3JlIGJlaW5nIGRvbmUsIHRoZSByZXR1cm5lZCBzdHJlYW0gZW1pdHMgbm8gZGF0YSBldmVudHMuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgc3RyZWFtIGlzIGEgYnJvYWRjYXN0IHN0cmVhbSBpZiB0aGlzIHN0cmVhbSBpcy4KICAgKiBGb3IgYSBicm9hZGNhc3Qgc3RyZWFtLCB0aGUgZXZlbnRzIGFyZSBvbmx5IGNvdW50ZWQgZnJvbSB0aGUgdGltZQogICAqIHRoZSByZXR1cm5lZCBzdHJlYW0gaXMgbGlzdGVuZWQgdG8uCiAgICovCiAgU3RyZWFtPFQ+IHNraXAoaW50IGNvdW50KSB7CiAgICByZXR1cm4gbmV3IF9Ta2lwU3RyZWFtPFQ+KHRoaXMsIGNvdW50KTsKICB9CgogIC8qKgogICAqIFNraXAgZGF0YSBldmVudHMgZnJvbSB0aGlzIHN0cmVhbSB3aGlsZSB0aGV5IGFyZSBtYXRjaGVkIGJ5IFt0ZXN0XS4KICAgKgogICAqIFJldHVybnMgYSBzdHJlYW0gdGhhdCBlbWl0cyB0aGUgc2FtZSBldmVudHMgYXMgdGhpcyBzdHJlYW0sCiAgICogZXhjZXB0IHRoYXQgZGF0YSBldmVudHMgYXJlIG5vdCBlbWl0dGVkIHVudGlsIGEgZGF0YSBldmVudCBmYWlscyBgdGVzdGAuCiAgICogVGhlIHRlc3QgZmFpbHMgd2hlbiBjYWxsZWQgd2l0aCBhIGRhdGEgZXZlbnQKICAgKiBpZiBpdCByZXR1cm5zIGEgbm9uLWB0cnVlYCB2YWx1ZSBvciBpZiB0aGUgY2FsbCB0byBgdGVzdGAgdGhyb3dzLgogICAqIElmIHRoZSBjYWxsIHRocm93cywgdGhlIGVycm9yIGlzIGVtaXR0ZWQgYXMgYW4gZXJyb3IgZXZlbnQKICAgKiBvbiB0aGUgcmV0dXJuZWQgc3RyZWFtIGluc3RlYWQgb2YgdGhlIGRhdGEgZXZlbnQsCiAgICogb3RoZXJ3aXNlIHRoZSBldmVudCB0aGF0IG1hZGUgYHRlc3RgIHJldHVybiBub24tdHJ1ZSBpcyBlbWl0dGVkIGFzIHRoZQogICAqIGZpcnN0IGRhdGEgZXZlbnQuCiAgICoKICAgKiBFcnJvciBhbmQgZG9uZSBldmVudHMgYXJlIHByb3ZpZGVkIGJ5IHRoZSByZXR1cm5lZCBzdHJlYW0gdW5tb2RpZmllZC4KICAgKgogICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gaXMgYSBicm9hZGNhc3Qgc3RyZWFtIGlmIHRoaXMgc3RyZWFtIGlzLgogICAqIEZvciBhIGJyb2FkY2FzdCBzdHJlYW0sIHRoZSBldmVudHMgYXJlIG9ubHkgdGVzdGVkIGZyb20gdGhlIHRpbWUKICAgKiB0aGUgcmV0dXJuZWQgc3RyZWFtIGlzIGxpc3RlbmVkIHRvLgogICAqLwogIFN0cmVhbTxUPiBza2lwV2hpbGUoYm9vbCB0ZXN0KFQgZWxlbWVudCkpIHsKICAgIHJldHVybiBuZXcgX1NraXBXaGlsZVN0cmVhbTxUPih0aGlzLCB0ZXN0KTsKICB9CgogIC8qKgogICAqIFNraXBzIGRhdGEgZXZlbnRzIGlmIHRoZXkgYXJlIGVxdWFsIHRvIHRoZSBwcmV2aW91cyBkYXRhIGV2ZW50LgogICAqCiAgICogVGhlIHJldHVybmVkIHN0cmVhbSBwcm92aWRlcyB0aGUgc2FtZSBldmVudHMgYXMgdGhpcyBzdHJlYW0sIGV4Y2VwdAogICAqIHRoYXQgaXQgbmV2ZXIgcHJvdmlkZXMgdHdvIGNvbnNlY3V0aXZlIGRhdGEgZXZlbnRzIHRoYXQgYXJlIGVxdWFsLgogICAqIFRoYXQgaXMsIGVycm9ycyBhcmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIHJldHVybmVkIHN0cmVhbSwgYW5kCiAgICogZGF0YSBldmVudHMgYXJlIHBhc3NlZCB0aHJvdWdoIGlmIHRoZXkgYXJlIGRpc3RpbmN0IGZyb20gdGhlIG1vc3QKICAgKiByZWNlbnRseSBlbWl0dGVkIGRhdGEgZXZlbnQuCiAgICoKICAgKiBFcXVhbGl0eSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBwcm92aWRlZCBbZXF1YWxzXSBtZXRob2QuIElmIHRoYXQgaXMKICAgKiBvbWl0dGVkLCB0aGUgJz09JyBvcGVyYXRvciBvbiB0aGUgbGFzdCBwcm92aWRlZCBkYXRhIGVsZW1lbnQgaXMgdXNlZC4KICAgKgogICAqIElmIFtlcXVhbHNdIHRocm93cywgdGhlIGRhdGEgZXZlbnQgaXMgcmVwbGFjZWQgYnkgYW4gZXJyb3IgZXZlbnQKICAgKiBjb250YWluaW5nIHRoZSB0aHJvd24gZXJyb3IuIFRoZSBiZWhhdmlvciBpcyBlcXVpdmFsZW50IHRvIHRoZQogICAqIG9yaWdpbmFsIHN0cmVhbSBlbWl0dGluZyB0aGUgZXJyb3IgZXZlbnQsIGFuZCBpdCBkb2Vzbid0IGNoYW5nZQogICAqIHRoZSB3aGF0IHRoZSBtb3N0IHJlY2VudGx5IGVtaXR0ZWQgZGF0YSBldmVudCBpcy4KICAgKgogICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gaXMgYSBicm9hZGNhc3Qgc3RyZWFtIGlmIHRoaXMgc3RyZWFtIGlzLgogICAqIElmIGEgYnJvYWRjYXN0IHN0cmVhbSBpcyBsaXN0ZW5lZCB0byBtb3JlIHRoYW4gb25jZSwgZWFjaCBzdWJzY3JpcHRpb24KICAgKiB3aWxsIGluZGl2aWR1YWxseSBwZXJmb3JtIHRoZSBgZXF1YWxzYCB0ZXN0LgogICAqLwogIFN0cmVhbTxUPiBkaXN0aW5jdChbYm9vbCBlcXVhbHMoVCBwcmV2aW91cywgVCBuZXh0KV0pIHsKICAgIHJldHVybiBuZXcgX0Rpc3RpbmN0U3RyZWFtPFQ+KHRoaXMsIGVxdWFscyk7CiAgfQoKICAvKioKICAgKiBUaGUgZmlyc3QgZWxlbWVudCBvZiB0aGlzIHN0cmVhbS4KICAgKgogICAqIFN0b3BzIGxpc3RlbmluZyB0byB0aGlzIHN0cmVhbSBhZnRlciB0aGUgZmlyc3QgZWxlbWVudCBoYXMgYmVlbiByZWNlaXZlZC4KICAgKgogICAqIEludGVybmFsbHkgdGhlIG1ldGhvZCBjYW5jZWxzIGl0cyBzdWJzY3JpcHRpb24gYWZ0ZXIgdGhlIGZpcnN0IGVsZW1lbnQuCiAgICogVGhpcyBtZWFucyB0aGF0IHNpbmdsZS1zdWJzY3JpcHRpb24gKG5vbi1icm9hZGNhc3QpIHN0cmVhbXMgYXJlIGNsb3NlZAogICAqIGFuZCBjYW5ub3QgYmUgcmV1c2VkIGFmdGVyIGEgY2FsbCB0byB0aGlzIGdldHRlci4KICAgKgogICAqIElmIGFuIGVycm9yIGV2ZW50IG9jY3VycyBiZWZvcmUgdGhlIGZpcnN0IGRhdGEgZXZlbnQsIHRoZSByZXR1cm5lZCBmdXR1cmUKICAgKiBpcyBjb21wbGV0ZWQgd2l0aCB0aGF0IGVycm9yLgogICAqCiAgICogSWYgdGhpcyBzdHJlYW0gaXMgZW1wdHkgKGEgZG9uZSBldmVudCBvY2N1cnMgYmVmb3JlIHRoZSBmaXJzdCBkYXRhIGV2ZW50KSwKICAgKiB0aGUgcmV0dXJuZWQgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIGFuIGVycm9yLgogICAqCiAgICogRXhjZXB0IGZvciB0aGUgdHlwZSBvZiB0aGUgZXJyb3IsIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8KICAgKiBgdGhpcy5lbGVtZW50QXQoMClgLgogICAqLwogIEZ1dHVyZTxUPiBnZXQgZmlyc3QgewogICAgX0Z1dHVyZTxUPiBmdXR1cmUgPSBuZXcgX0Z1dHVyZTxUPigpOwogICAgU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbjsKICAgIHN1YnNjcmlwdGlvbiA9IHRoaXMubGlzdGVuKAogICAgICAgIChUIHZhbHVlKSB7CiAgICAgICAgICBfY2FuY2VsQW5kVmFsdWUoc3Vic2NyaXB0aW9uLCBmdXR1cmUsIHZhbHVlKTsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IGZ1dHVyZS5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgICAgICBfY29tcGxldGVXaXRoRXJyb3JDYWxsYmFjayhmdXR1cmUsIGUsIHMpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICByZXR1cm4gZnV0dXJlOwogIH0KCiAgLyoqCiAgICogVGhlIGxhc3QgZWxlbWVudCBvZiB0aGlzIHN0cmVhbS4KICAgKgogICAqIElmIHRoaXMgc3RyZWFtIGVtaXRzIGFuIGVycm9yIGV2ZW50LAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhhdCBlcnJvcgogICAqIGFuZCBwcm9jZXNzaW5nIHN0b3BzLgogICAqCiAgICogSWYgdGhpcyBzdHJlYW0gaXMgZW1wdHkgKHRoZSBkb25lIGV2ZW50IGlzIHRoZSBmaXJzdCBldmVudCksCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCBhbiBlcnJvci4KICAgKi8KICBGdXR1cmU8VD4gZ2V0IGxhc3QgewogICAgX0Z1dHVyZTxUPiBmdXR1cmUgPSBuZXcgX0Z1dHVyZTxUPigpOwogICAgVCByZXN1bHQ7CiAgICBib29sIGZvdW5kUmVzdWx0ID0gZmFsc2U7CiAgICBsaXN0ZW4oCiAgICAgICAgKFQgdmFsdWUpIHsKICAgICAgICAgIGZvdW5kUmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgIHJlc3VsdCA9IHZhbHVlOwogICAgICAgIH0sCiAgICAgICAgb25FcnJvcjogZnV0dXJlLl9jb21wbGV0ZUVycm9yLAogICAgICAgIG9uRG9uZTogKCkgewogICAgICAgICAgaWYgKGZvdW5kUmVzdWx0KSB7CiAgICAgICAgICAgIGZ1dHVyZS5fY29tcGxldGUocmVzdWx0KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICAgICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgICAgIF9jb21wbGV0ZVdpdGhFcnJvckNhbGxiYWNrKGZ1dHVyZSwgZSwgcyk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIHJldHVybiBmdXR1cmU7CiAgfQoKICAvKioKICAgKiBUaGUgc2luZ2xlIGVsZW1lbnQgb2YgdGhpcyBzdHJlYW0uCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBlbWl0cyBhbiBlcnJvciBldmVudCwKICAgKiB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoYXQgZXJyb3IKICAgKiBhbmQgcHJvY2Vzc2luZyBzdG9wcy4KICAgKgogICAqIElmIFt0aGlzXSBpcyBlbXB0eSBvciBoYXMgbW9yZSB0aGFuIG9uZSBlbGVtZW50LAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgY29tcGxldGVzIHdpdGggYW4gZXJyb3IuCiAgICovCiAgRnV0dXJlPFQ+IGdldCBzaW5nbGUgewogICAgX0Z1dHVyZTxUPiBmdXR1cmUgPSBuZXcgX0Z1dHVyZTxUPigpOwogICAgVCByZXN1bHQ7CiAgICBib29sIGZvdW5kUmVzdWx0ID0gZmFsc2U7CiAgICBTdHJlYW1TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uOwogICAgc3Vic2NyaXB0aW9uID0gdGhpcy5saXN0ZW4oCiAgICAgICAgKFQgdmFsdWUpIHsKICAgICAgICAgIGlmIChmb3VuZFJlc3VsdCkgewogICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBzZWNvbmQgZWxlbWVudCB3ZSBnZXQuCiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgICAgICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgICAgICAgX2NhbmNlbEFuZEVycm9yV2l0aFJlcGxhY2VtZW50KHN1YnNjcmlwdGlvbiwgZnV0dXJlLCBlLCBzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBmb3VuZFJlc3VsdCA9IHRydWU7CiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IGZ1dHVyZS5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIGlmIChmb3VuZFJlc3VsdCkgewogICAgICAgICAgICBmdXR1cmUuX2NvbXBsZXRlKHJlc3VsdCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgICAgICBfY29tcGxldGVXaXRoRXJyb3JDYWxsYmFjayhmdXR1cmUsIGUsIHMpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICByZXR1cm4gZnV0dXJlOwogIH0KCiAgLyoqCiAgICogRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhpcyBzdHJlYW0gbWF0Y2hpbmcgW3Rlc3RdLgogICAqCiAgICogUmV0dXJucyBhIGZ1dHVyZSB0aGF0IGlzIGNvbXBsZXRlZCB3aXRoIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoaXMgc3RyZWFtCiAgICogdGhhdCBbdGVzdF0gcmV0dXJucyBgdHJ1ZWAgZm9yLgogICAqCiAgICogSWYgbm8gc3VjaCBlbGVtZW50IGlzIGZvdW5kIGJlZm9yZSB0aGlzIHN0cmVhbSBpcyBkb25lLCBhbmQgYQogICAqIFtvckVsc2VdIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLCB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgW29yRWxzZV0KICAgKiBiZWNvbWVzIHRoZSB2YWx1ZSBvZiB0aGUgZnV0dXJlLiBJZiBbb3JFbHNlXSB0aHJvd3MsIHRoZSByZXR1cm5lZAogICAqIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGF0IGVycm9yLgogICAqCiAgICogSWYgdGhpcyBzdHJlYW0gZW1pdHMgYW4gZXJyb3IgYmVmb3JlIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50LAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhhdCBlcnJvciwgYW5kIHByb2Nlc3Npbmcgc3RvcHMuCiAgICoKICAgKiBTdG9wcyBsaXN0ZW5pbmcgdG8gdGhpcyBzdHJlYW0gYWZ0ZXIgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQgb3IgZXJyb3IKICAgKiBoYXMgYmVlbiByZWNlaXZlZC4KICAgKgogICAqIEludGVybmFsbHkgdGhlIG1ldGhvZCBjYW5jZWxzIGl0cyBzdWJzY3JpcHRpb24gYWZ0ZXIgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdAogICAqIG1hdGNoZXMgdGhlIHByZWRpY2F0ZS4gVGhpcyBtZWFucyB0aGF0IHNpbmdsZS1zdWJzY3JpcHRpb24gKG5vbi1icm9hZGNhc3QpCiAgICogc3RyZWFtcyBhcmUgY2xvc2VkIGFuZCBjYW5ub3QgYmUgcmV1c2VkIGFmdGVyIGEgY2FsbCB0byB0aGlzIG1ldGhvZC4KICAgKgogICAqIElmIGFuIGVycm9yIG9jY3Vycywgb3IgaWYgdGhpcyBzdHJlYW0gZW5kcyB3aXRob3V0IGZpbmRpbmcgYSBtYXRjaCBhbmQKICAgKiB3aXRoIG5vIFtvckVsc2VdIGZ1bmN0aW9uIHByb3ZpZGVkLAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggYW4gZXJyb3IuCiAgICovCiAgRnV0dXJlPFQ+IGZpcnN0V2hlcmUoYm9vbCB0ZXN0KFQgZWxlbWVudCksIHtUIG9yRWxzZSgpfSkgewogICAgX0Z1dHVyZTxUPiBmdXR1cmUgPSBuZXcgX0Z1dHVyZSgpOwogICAgU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbjsKICAgIHN1YnNjcmlwdGlvbiA9IHRoaXMubGlzdGVuKAogICAgICAgIChUIHZhbHVlKSB7CiAgICAgICAgICBfcnVuVXNlckNvZGUoKCkgPT4gdGVzdCh2YWx1ZSksIChib29sIGlzTWF0Y2gpIHsKICAgICAgICAgICAgaWYgKGlzTWF0Y2gpIHsKICAgICAgICAgICAgICBfY2FuY2VsQW5kVmFsdWUoc3Vic2NyaXB0aW9uLCBmdXR1cmUsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbmNlbEFuZEVycm9yQ2xvc3VyZShzdWJzY3JpcHRpb24sIGZ1dHVyZSkpOwogICAgICAgIH0sCiAgICAgICAgb25FcnJvcjogZnV0dXJlLl9jb21wbGV0ZUVycm9yLAogICAgICAgIG9uRG9uZTogKCkgewogICAgICAgICAgaWYgKG9yRWxzZSAhPSBudWxsKSB7CiAgICAgICAgICAgIF9ydW5Vc2VyQ29kZShvckVsc2UsIGZ1dHVyZS5fY29tcGxldGUsIGZ1dHVyZS5fY29tcGxldGVFcnJvcik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgICAgICBfY29tcGxldGVXaXRoRXJyb3JDYWxsYmFjayhmdXR1cmUsIGUsIHMpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICByZXR1cm4gZnV0dXJlOwogIH0KCiAgLyoqCiAgICogRmluZHMgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGlzIHN0cmVhbSBtYXRjaGluZyBbdGVzdF0uCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBlbWl0cyBhbiBlcnJvciwgdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGF0CiAgICogZXJyb3IsIGFuZCBwcm9jZXNzaW5nIHN0b3BzLgogICAqCiAgICogT3RoZXJ3aXNlIGFzIFtmaXJzdFdoZXJlXSwgZXhjZXB0IHRoYXQgdGhlIGxhc3QgbWF0Y2hpbmcgZWxlbWVudCBpcyBmb3VuZAogICAqIGluc3RlYWQgb2YgdGhlIGZpcnN0LgogICAqIFRoYXQgbWVhbnMgdGhhdCBhIG5vbi1lcnJvciByZXN1bHQgY2Fubm90IGJlIHByb3ZpZGVkIGJlZm9yZSB0aGlzIHN0cmVhbQogICAqIGlzIGRvbmUuCiAgICovCiAgRnV0dXJlPFQ+IGxhc3RXaGVyZShib29sIHRlc3QoVCBlbGVtZW50KSwge1Qgb3JFbHNlKCl9KSB7CiAgICBfRnV0dXJlPFQ+IGZ1dHVyZSA9IG5ldyBfRnV0dXJlKCk7CiAgICBUIHJlc3VsdDsKICAgIGJvb2wgZm91bmRSZXN1bHQgPSBmYWxzZTsKICAgIFN0cmVhbVN1YnNjcmlwdGlvbiBzdWJzY3JpcHRpb247CiAgICBzdWJzY3JpcHRpb24gPSB0aGlzLmxpc3RlbigKICAgICAgICAoVCB2YWx1ZSkgewogICAgICAgICAgX3J1blVzZXJDb2RlKCgpID0+IHRydWUgPT0gdGVzdCh2YWx1ZSksIChib29sIGlzTWF0Y2gpIHsKICAgICAgICAgICAgaWYgKGlzTWF0Y2gpIHsKICAgICAgICAgICAgICBmb3VuZFJlc3VsdCA9IHRydWU7CiAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYW5jZWxBbmRFcnJvckNsb3N1cmUoc3Vic2NyaXB0aW9uLCBmdXR1cmUpKTsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IGZ1dHVyZS5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIGlmIChmb3VuZFJlc3VsdCkgewogICAgICAgICAgICBmdXR1cmUuX2NvbXBsZXRlKHJlc3VsdCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChvckVsc2UgIT0gbnVsbCkgewogICAgICAgICAgICBfcnVuVXNlckNvZGUob3JFbHNlLCBmdXR1cmUuX2NvbXBsZXRlLCBmdXR1cmUuX2NvbXBsZXRlRXJyb3IpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgICAgICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgICAgICAgX2NvbXBsZXRlV2l0aEVycm9yQ2FsbGJhY2soZnV0dXJlLCBlLCBzKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGNhbmNlbE9uRXJyb3I6IHRydWUpOwogICAgcmV0dXJuIGZ1dHVyZTsKICB9CgogIC8qKgogICAqIEZpbmRzIHRoZSBzaW5nbGUgZWxlbWVudCBpbiB0aGlzIHN0cmVhbSBtYXRjaGluZyBbdGVzdF0uCiAgICoKICAgKiBMaWtlIFtsYXN0V2hlcmVdLCBleGNlcHQgdGhhdCBpdCBpcyBhbiBlcnJvciBpZiBtb3JlIHRoYW4gb25lCiAgICogbWF0Y2hpbmcgZWxlbWVudCBvY2N1cnMgaW4gdGhpcyBzdHJlYW0uCiAgICovCiAgRnV0dXJlPFQ+IHNpbmdsZVdoZXJlKGJvb2wgdGVzdChUIGVsZW1lbnQpLCB7VCBvckVsc2UoKX0pIHsKICAgIF9GdXR1cmU8VD4gZnV0dXJlID0gbmV3IF9GdXR1cmU8VD4oKTsKICAgIFQgcmVzdWx0OwogICAgYm9vbCBmb3VuZFJlc3VsdCA9IGZhbHNlOwogICAgU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbjsKICAgIHN1YnNjcmlwdGlvbiA9IHRoaXMubGlzdGVuKAogICAgICAgIChUIHZhbHVlKSB7CiAgICAgICAgICBfcnVuVXNlckNvZGUoKCkgPT4gdHJ1ZSA9PSB0ZXN0KHZhbHVlKSwgKGJvb2wgaXNNYXRjaCkgewogICAgICAgICAgICBpZiAoaXNNYXRjaCkgewogICAgICAgICAgICAgIGlmIChmb3VuZFJlc3VsdCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgICAgICAgICAgICBfY2FuY2VsQW5kRXJyb3JXaXRoUmVwbGFjZW1lbnQoc3Vic2NyaXB0aW9uLCBmdXR1cmUsIGUsIHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBmb3VuZFJlc3VsdCA9IHRydWU7CiAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYW5jZWxBbmRFcnJvckNsb3N1cmUoc3Vic2NyaXB0aW9uLCBmdXR1cmUpKTsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IGZ1dHVyZS5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIGlmIChmb3VuZFJlc3VsdCkgewogICAgICAgICAgICBmdXR1cmUuX2NvbXBsZXRlKHJlc3VsdCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmIChvckVsc2UgIT0gbnVsbCkgewogICAgICAgICAgICAgIF9ydW5Vc2VyQ29kZShvckVsc2UsIGZ1dHVyZS5fY29tcGxldGUsIGZ1dHVyZS5fY29tcGxldGVFcnJvcik7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgICAgICBfY29tcGxldGVXaXRoRXJyb3JDYWxsYmFjayhmdXR1cmUsIGUsIHMpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICByZXR1cm4gZnV0dXJlOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIFtpbmRleF10aCBkYXRhIGV2ZW50IG9mIHRoaXMgc3RyZWFtLgogICAqCiAgICogU3RvcHMgbGlzdGVuaW5nIHRvIHRoaXMgc3RyZWFtIGFmdGVyIHRoZSBbaW5kZXhddGggZGF0YSBldmVudCBoYXMgYmVlbgogICAqIHJlY2VpdmVkLgogICAqCiAgICogSW50ZXJuYWxseSB0aGUgbWV0aG9kIGNhbmNlbHMgaXRzIHN1YnNjcmlwdGlvbiBhZnRlciB0aGVzZSBlbGVtZW50cy4gVGhpcwogICAqIG1lYW5zIHRoYXQgc2luZ2xlLXN1YnNjcmlwdGlvbiAobm9uLWJyb2FkY2FzdCkgc3RyZWFtcyBhcmUgY2xvc2VkIGFuZAogICAqIGNhbm5vdCBiZSByZXVzZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgbWV0aG9kLgogICAqCiAgICogSWYgYW4gZXJyb3IgZXZlbnQgb2NjdXJzIGJlZm9yZSB0aGUgdmFsdWUgaXMgZm91bmQsIHRoZSBmdXR1cmUgY29tcGxldGVzCiAgICogd2l0aCB0aGlzIGVycm9yLgogICAqCiAgICogSWYgYSBkb25lIGV2ZW50IG9jY3VycyBiZWZvcmUgdGhlIHZhbHVlIGlzIGZvdW5kLCB0aGUgZnV0dXJlIGNvbXBsZXRlcwogICAqIHdpdGggYSBbUmFuZ2VFcnJvcl0uCiAgICovCiAgRnV0dXJlPFQ+IGVsZW1lbnRBdChpbnQgaW5kZXgpIHsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKGluZGV4LCAiaW5kZXgiKTsKICAgIFJhbmdlRXJyb3IuY2hlY2tOb3ROZWdhdGl2ZShpbmRleCwgImluZGV4Iik7CiAgICBfRnV0dXJlPFQ+IGZ1dHVyZSA9IG5ldyBfRnV0dXJlPFQ+KCk7CiAgICBTdHJlYW1TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uOwogICAgaW50IGVsZW1lbnRJbmRleCA9IDA7CiAgICBzdWJzY3JpcHRpb24gPSB0aGlzLmxpc3RlbigKICAgICAgICAoVCB2YWx1ZSkgewogICAgICAgICAgaWYgKGluZGV4ID09IGVsZW1lbnRJbmRleCkgewogICAgICAgICAgICBfY2FuY2VsQW5kVmFsdWUoc3Vic2NyaXB0aW9uLCBmdXR1cmUsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgZWxlbWVudEluZGV4ICs9IDE7CiAgICAgICAgfSwKICAgICAgICBvbkVycm9yOiBmdXR1cmUuX2NvbXBsZXRlRXJyb3IsCiAgICAgICAgb25Eb25lOiAoKSB7CiAgICAgICAgICBmdXR1cmUuX2NvbXBsZXRlRXJyb3IoCiAgICAgICAgICAgICAgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIsIG51bGwsIGVsZW1lbnRJbmRleCkpOwogICAgICAgIH0sCiAgICAgICAgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICByZXR1cm4gZnV0dXJlOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBzdHJlYW0gd2l0aCB0aGUgc2FtZSBldmVudHMgYXMgdGhpcyBzdHJlYW0uCiAgICoKICAgKiBXaGVuZXZlciBtb3JlIHRoYW4gW3RpbWVMaW1pdF0gcGFzc2VzIGJldHdlZW4gdHdvIGV2ZW50cyBmcm9tIHRoaXMgc3RyZWFtLAogICAqIHRoZSBbb25UaW1lb3V0XSBmdW5jdGlvbiBpcyBjYWxsZWQsIHdoaWNoIGNhbiBlbWl0IGZ1cnRoZXIgZXZlbnRzIG9uCiAgICogdGhlIHJldHVybmVkIHN0cmVhbS4KICAgKgogICAqIFRoZSBjb3VudGRvd24gZG9lc24ndCBzdGFydCB1bnRpbCB0aGUgcmV0dXJuZWQgc3RyZWFtIGlzIGxpc3RlbmVkIHRvLgogICAqIFRoZSBjb3VudGRvd24gaXMgcmVzZXQgZXZlcnkgdGltZSBhbiBldmVudCBpcyBmb3J3YXJkZWQgZnJvbSB0aGlzIHN0cmVhbSwKICAgKiBvciB3aGVuIHRoaXMgc3RyZWFtIGlzIHBhdXNlZCBhbmQgcmVzdW1lZC4KICAgKgogICAqIFRoZSBbb25UaW1lb3V0XSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBvbmUgYXJndW1lbnQ6IGFuCiAgICogW0V2ZW50U2lua10gdGhhdCBhbGxvd3MgcHV0dGluZyBldmVudHMgaW50byB0aGUgcmV0dXJuZWQgc3RyZWFtLgogICAqIFRoaXMgYEV2ZW50U2lua2AgaXMgb25seSB2YWxpZCBkdXJpbmcgdGhlIGNhbGwgdG8gW29uVGltZW91dF0uCiAgICogQ2FsbGluZyBbRXZlbnRTaW5rLmNsb3NlXSBvbiB0aGUgc2luayBwYXNzZWQgdG8gW29uVGltZW91dF0gY2xvc2VzIHRoZQogICAqIHJldHVybmVkIHN0cmVhbSwgYW5kIG5vIGZ1cnRoZXIgZXZlbnRzIGFyZSBwcm9jZXNzZWQuCiAgICoKICAgKiBJZiBbb25UaW1lb3V0XSBpcyBvbWl0dGVkLCBhIHRpbWVvdXQgd2lsbCBqdXN0IHB1dCBhIFtUaW1lb3V0RXhjZXB0aW9uXQogICAqIGludG8gdGhlIGVycm9yIGNoYW5uZWwgb2YgdGhlIHJldHVybmVkIHN0cmVhbS4KICAgKiBJZiB0aGUgY2FsbCB0byBbb25UaW1lb3V0XSB0aHJvd3MsIHRoZSBlcnJvciBpcyBlbWl0dGVkIG9uIHRoZSByZXR1cm5lZAogICAqIHN0cmVhbS4KICAgKgogICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gaXMgYSBicm9hZGNhc3Qgc3RyZWFtIGlmIHRoaXMgc3RyZWFtIGlzLgogICAqIElmIGEgYnJvYWRjYXN0IHN0cmVhbSBpcyBsaXN0ZW5lZCB0byBtb3JlIHRoYW4gb25jZSwgZWFjaCBzdWJzY3JpcHRpb24KICAgKiB3aWxsIGhhdmUgaXRzIGluZGl2aWR1YWxseSB0aW1lciB0aGF0IHN0YXJ0cyBjb3VudGluZyBvbiBsaXN0ZW4sCiAgICogYW5kIHRoZSBzdWJzY3JpcHRpb25zJyB0aW1lcnMgY2FuIGJlIHBhdXNlZCBpbmRpdmlkdWFsbHkuCiAgICovCiAgU3RyZWFtPFQ+IHRpbWVvdXQoRHVyYXRpb24gdGltZUxpbWl0LCB7dm9pZCBvblRpbWVvdXQoRXZlbnRTaW5rPFQ+IHNpbmspfSkgewogICAgX1N0cmVhbUNvbnRyb2xsZXJCYXNlPFQ+IGNvbnRyb2xsZXI7CiAgICAvLyBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgc2V0IG9uIGxpc3Rlbi4KICAgIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb247CiAgICBUaW1lciB0aW1lcjsKICAgIFpvbmUgem9uZTsKICAgIF9UaW1lckNhbGxiYWNrIHRpbWVvdXQ7CgogICAgdm9pZCBvbkRhdGEoVCBldmVudCkgewogICAgICB0aW1lci5jYW5jZWwoKTsKICAgICAgY29udHJvbGxlci5hZGQoZXZlbnQpOwogICAgICB0aW1lciA9IHpvbmUuY3JlYXRlVGltZXIodGltZUxpbWl0LCB0aW1lb3V0KTsKICAgIH0KCiAgICB2b2lkIG9uRXJyb3IoZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgICB0aW1lci5jYW5jZWwoKTsKICAgICAgYXNzZXJ0KGNvbnRyb2xsZXIgaXMgX1N0cmVhbUNvbnRyb2xsZXIgfHwKICAgICAgICAgIGNvbnRyb2xsZXIgaXMgX0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXIpOwogICAgICBjb250cm9sbGVyLl9hZGRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7IC8vIEF2b2lkIFpvbmUgZXJyb3IgcmVwbGFjZW1lbnQuCiAgICAgIHRpbWVyID0gem9uZS5jcmVhdGVUaW1lcih0aW1lTGltaXQsIHRpbWVvdXQpOwogICAgfQoKICAgIHZvaWQgb25Eb25lKCkgewogICAgICB0aW1lci5jYW5jZWwoKTsKICAgICAgY29udHJvbGxlci5jbG9zZSgpOwogICAgfQoKICAgIHZvaWQgb25MaXN0ZW4oKSB7CiAgICAgIC8vIFRoaXMgaXMgdGhlIG9uTGlzdGVuIGNhbGxiYWNrIGZvciBvZiBjb250cm9sbGVyLgogICAgICAvLyBJdCBydW5zIGluIHRoZSBzYW1lIHpvbmUgdGhhdCB0aGUgc3Vic2NyaXB0aW9uIHdhcyBjcmVhdGVkIGluLgogICAgICAvLyBVc2UgdGhhdCB6b25lIGZvciBjcmVhdGluZyB0aW1lcnMgYW5kIHJ1bm5pbmcgdGhlIG9uVGltZW91dAogICAgICAvLyBjYWxsYmFjay4KICAgICAgem9uZSA9IFpvbmUuY3VycmVudDsKICAgICAgaWYgKG9uVGltZW91dCA9PSBudWxsKSB7CiAgICAgICAgdGltZW91dCA9ICgpIHsKICAgICAgICAgIGNvbnRyb2xsZXIuYWRkRXJyb3IoCiAgICAgICAgICAgICAgbmV3IFRpbWVvdXRFeGNlcHRpb24oIk5vIHN0cmVhbSBldmVudCIsIHRpbWVMaW1pdCksIG51bGwpOwogICAgICAgIH07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVE9ETyhmbG9pdHNjaCk6IHRoZSByZXR1cm4gdHlwZSBzaG91bGQgYmUgJ3ZvaWQnLCBhbmQgdGhlIHR5cGUKICAgICAgICAvLyBzaG91bGQgYmUgaW5mZXJyZWQuCiAgICAgICAgdmFyIHJlZ2lzdGVyZWRPblRpbWVvdXQgPQogICAgICAgICAgICB6b25lLnJlZ2lzdGVyVW5hcnlDYWxsYmFjazxkeW5hbWljLCBFdmVudFNpbms8VD4+KG9uVGltZW91dCk7CiAgICAgICAgdmFyIHdyYXBwZXIgPSBuZXcgX0NvbnRyb2xsZXJFdmVudFNpbmtXcmFwcGVyPFQ+KG51bGwpOwogICAgICAgIHRpbWVvdXQgPSAoKSB7CiAgICAgICAgICB3cmFwcGVyLl9zaW5rID0gY29udHJvbGxlcjsgLy8gT25seSB2YWxpZCBkdXJpbmcgY2FsbC4KICAgICAgICAgIHpvbmUucnVuVW5hcnlHdWFyZGVkKHJlZ2lzdGVyZWRPblRpbWVvdXQsIHdyYXBwZXIpOwogICAgICAgICAgd3JhcHBlci5fc2luayA9IG51bGw7CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgc3Vic2NyaXB0aW9uID0gdGhpcy5saXN0ZW4ob25EYXRhLCBvbkVycm9yOiBvbkVycm9yLCBvbkRvbmU6IG9uRG9uZSk7CiAgICAgIHRpbWVyID0gem9uZS5jcmVhdGVUaW1lcih0aW1lTGltaXQsIHRpbWVvdXQpOwogICAgfQoKICAgIEZ1dHVyZSBvbkNhbmNlbCgpIHsKICAgICAgdGltZXIuY2FuY2VsKCk7CiAgICAgIEZ1dHVyZSByZXN1bHQgPSBzdWJzY3JpcHRpb24uY2FuY2VsKCk7CiAgICAgIHN1YnNjcmlwdGlvbiA9IG51bGw7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgY29udHJvbGxlciA9IGlzQnJvYWRjYXN0CiAgICAgICAgPyBuZXcgX1N5bmNCcm9hZGNhc3RTdHJlYW1Db250cm9sbGVyPFQ+KG9uTGlzdGVuLCBvbkNhbmNlbCkKICAgICAgICA6IG5ldyBfU3luY1N0cmVhbUNvbnRyb2xsZXI8VD4ob25MaXN0ZW4sICgpIHsKICAgICAgICAgICAgLy8gRG9uJ3QgbnVsbCB0aGUgdGltZXIsIG9uQ2FuY2VsIG1heSBjYWxsIGNhbmNlbCBhZ2Fpbi4KICAgICAgICAgICAgdGltZXIuY2FuY2VsKCk7CiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5wYXVzZSgpOwogICAgICAgICAgfSwgKCkgewogICAgICAgICAgICBzdWJzY3JpcHRpb24ucmVzdW1lKCk7CiAgICAgICAgICAgIHRpbWVyID0gem9uZS5jcmVhdGVUaW1lcih0aW1lTGltaXQsIHRpbWVvdXQpOwogICAgICAgICAgfSwgb25DYW5jZWwpOwogICAgcmV0dXJuIGNvbnRyb2xsZXIuc3RyZWFtOwogIH0KfQoKLyoqCiAqIEEgc3Vic2NyaXB0aW9uIG9uIGV2ZW50cyBmcm9tIGEgW1N0cmVhbV0uCiAqCiAqIFdoZW4geW91IGxpc3RlbiBvbiBhIFtTdHJlYW1dIHVzaW5nIFtTdHJlYW0ubGlzdGVuXSwKICogYSBbU3RyZWFtU3Vic2NyaXB0aW9uXSBvYmplY3QgaXMgcmV0dXJuZWQuCiAqCiAqIFRoZSBzdWJzY3JpcHRpb24gcHJvdmlkZXMgZXZlbnRzIHRvIHRoZSBsaXN0ZW5lciwKICogYW5kIGhvbGRzIHRoZSBjYWxsYmFja3MgdXNlZCB0byBoYW5kbGUgdGhlIGV2ZW50cy4KICogVGhlIHN1YnNjcmlwdGlvbiBjYW4gYWxzbyBiZSB1c2VkIHRvIHVuc3Vic2NyaWJlIGZyb20gdGhlIGV2ZW50cywKICogb3IgdG8gdGVtcG9yYXJpbHkgcGF1c2UgdGhlIGV2ZW50cyBmcm9tIHRoZSBzdHJlYW0uCiAqLwphYnN0cmFjdCBjbGFzcyBTdHJlYW1TdWJzY3JpcHRpb248VD4gewogIC8qKgogICAqIENhbmNlbHMgdGhpcyBzdWJzY3JpcHRpb24uCiAgICoKICAgKiBBZnRlciB0aGlzIGNhbGwsIHRoZSBzdWJzY3JpcHRpb24gbm8gbG9uZ2VyIHJlY2VpdmVzIGV2ZW50cy4KICAgKgogICAqIFRoZSBzdHJlYW0gbWF5IG5lZWQgdG8gc2h1dCBkb3duIHRoZSBzb3VyY2Ugb2YgZXZlbnRzIGFuZCBjbGVhbiB1cCBhZnRlcgogICAqIHRoZSBzdWJzY3JpcHRpb24gaXMgY2FuY2VsZWQuCiAgICoKICAgKiBSZXR1cm5zIGEgZnV0dXJlIHRoYXQgaXMgY29tcGxldGVkIG9uY2UgdGhlIHN0cmVhbSBoYXMgZmluaXNoZWQKICAgKiBpdHMgY2xlYW51cC4KICAgKgogICAqIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIG1heSBhbHNvIHJldHVybiBgbnVsbGAgaWYgbm8gY2xlYW51cCB3YXMgbmVjZXNzYXJ5LgogICAqIFJldHVybmluZyBgbnVsbGAgaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIGJlIGF2b2lkZWQuCiAgICoKICAgKiBUeXBpY2FsbHksIGZ1dHVyZXMgYXJlIHJldHVybmVkIHdoZW4gdGhlIHN0cmVhbSBuZWVkcyB0byByZWxlYXNlIHJlc291cmNlcy4KICAgKiBGb3IgZXhhbXBsZSwgYSBzdHJlYW0gbWlnaHQgbmVlZCB0byBjbG9zZSBhbiBvcGVuIGZpbGUgKGFzIGFuIGFzeW5jaHJvbm91cwogICAqIG9wZXJhdGlvbikuIElmIHRoZSBsaXN0ZW5lciB3YW50cyB0byBkZWxldGUgdGhlIGZpbGUgYWZ0ZXIgaGF2aW5nCiAgICogY2FuY2VsZWQgdGhlIHN1YnNjcmlwdGlvbiwgaXQgbXVzdCB3YWl0IGZvciB0aGUgY2xlYW51cCBmdXR1cmUgdG8gY29tcGxldGUuCiAgICoKICAgKiBBIHJldHVybmVkIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCBhIGBudWxsYCB2YWx1ZS4KICAgKiBJZiB0aGUgY2xlYW51cCB0aHJvd3MsIHdoaWNoIGl0IHJlYWxseSBzaG91bGRuJ3QsIHRoZSByZXR1cm5lZCBmdXR1cmUKICAgKiBjb21wbGV0ZXMgd2l0aCB0aGF0IGVycm9yLgogICAqLwogIEZ1dHVyZSBjYW5jZWwoKTsKCiAgLyoqCiAgICogUmVwbGFjZXMgdGhlIGRhdGEgZXZlbnQgaGFuZGxlciBvZiB0aGlzIHN1YnNjcmlwdGlvbi4KICAgKgogICAqIFRoZSBbaGFuZGxlRGF0YV0gZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIGVsZW1lbnQgb2YgdGhlIHN0cmVhbQogICAqIGFmdGVyIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgogICAqIElmIFtoYW5kbGVEYXRhXSBpcyBgbnVsbGAsIGZ1cnRoZXIgZWxlbWVudHMgYXJlIGlnbm9yZWQuCiAgICoKICAgKiBUaGlzIG1ldGhvZCByZXBsYWNlcyB0aGUgY3VycmVudCBoYW5kbGVyIHNldCBieSB0aGUgaW52b2NhdGlvbiBvZgogICAqIFtTdHJlYW0ubGlzdGVuXSBvciBieSBhIHByZXZpb3VzIGNhbGwgdG8gW29uRGF0YV0uCiAgICovCiAgdm9pZCBvbkRhdGEodm9pZCBoYW5kbGVEYXRhKFQgZGF0YSkpOwoKICAvKioKICAgKiBSZXBsYWNlcyB0aGUgZXJyb3IgZXZlbnQgaGFuZGxlciBvZiB0aGlzIHN1YnNjcmlwdGlvbi4KICAgKgogICAqIFRoZSBbaGFuZGxlRXJyb3JdIGZ1bmN0aW9uIG11c3QgYmUgYWJsZSB0byBiZSBjYWxsZWQgd2l0aCBlaXRoZXIKICAgKiBvbmUgcG9zaXRpb25hbCBhcmd1bWVudCwgb3Igd2l0aCB0d28gcG9zaXRpb25hbCBhcmd1bWVudHMKICAgKiB3aGVyZSB0aGUgc2Vjb25kcyBpcyBhbHdheXMgYSBbU3RhY2tUcmFjZV0uCiAgICoKICAgKiBUaGUgW2hhbmRsZUVycm9yXSBhcmd1bWVudCBtYXkgYmUgYG51bGxgLCBpbiB3aGljaCBjYXNlIGZ1cnRoZXIKICAgKiBlcnJvciBldmVudHMgYXJlIGNvbnNpZGVyZWQgdW5oYW5kbGVkLCBhbmQgd2lsbCBiZSByZXBvcnRlZCB0bwogICAqIFtab25lLmhhbmRsZVVuY2F1Z2h0RXJyb3JdLgogICAqCiAgICogVGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgYWxsIGVycm9yIGV2ZW50cyBmcm9tIHRoZQogICAqIHN0cmVhbSBzdWJzY3JpcHRpb24uCiAgICoKICAgKiBUaGlzIG1ldGhvZCByZXBsYWNlcyB0aGUgY3VycmVudCBoYW5kbGVyIHNldCBieSB0aGUgaW52b2NhdGlvbiBvZgogICAqIFtTdHJlYW0ubGlzdGVuXSwgYnkgY2FsbGluZyBbYXNGdXR1cmVdLCBvciBieSBhIHByZXZpb3VzIGNhbGwgdG8gW29uRXJyb3JdLgogICAqLwogIHZvaWQgb25FcnJvcihGdW5jdGlvbiBoYW5kbGVFcnJvcik7CgogIC8qKgogICAqIFJlcGxhY2VzIHRoZSBkb25lIGV2ZW50IGhhbmRsZXIgb2YgdGhpcyBzdWJzY3JpcHRpb24uCiAgICoKICAgKiBUaGUgW2hhbmRsZURvbmVdIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBzdHJlYW0gY2xvc2VzLgogICAqIFRoZSB2YWx1ZSBtYXkgYmUgYG51bGxgLCBpbiB3aGljaCBjYXNlIG5vIGZ1bmN0aW9uIGlzIGNhbGxlZC4KICAgKgogICAqIFRoaXMgbWV0aG9kIHJlcGxhY2VzIHRoZSBjdXJyZW50IGhhbmRsZXIgc2V0IGJ5IHRoZSBpbnZvY2F0aW9uIG9mCiAgICogW1N0cmVhbS5saXN0ZW5dLCBieSBjYWxsaW5nIFthc0Z1dHVyZV0sIG9yIGJ5IGEgcHJldmlvdXMgY2FsbCB0byBbb25Eb25lXS4KICAgKi8KICB2b2lkIG9uRG9uZSh2b2lkIGhhbmRsZURvbmUoKSk7CgogIC8qKgogICAqIFJlcXVlc3QgdGhhdCB0aGUgc3RyZWFtIHBhdXNlcyBldmVudHMgdW50aWwgZnVydGhlciBub3RpY2UuCiAgICoKICAgKiBXaGlsZSBwYXVzZWQsIHRoZSBzdWJzY3JpcHRpb24gd2lsbCBub3QgZmlyZSBhbnkgZXZlbnRzLgogICAqIElmIGl0IHJlY2VpdmVzIGV2ZW50cyBmcm9tIGl0cyBzb3VyY2UsIHRoZXkgd2lsbCBiZSBidWZmZXJlZCB1bnRpbAogICAqIHRoZSBzdWJzY3JpcHRpb24gaXMgcmVzdW1lZC4KICAgKiBGb3Igbm9uLWJyb2FkY2FzdCBzdHJlYW1zLCB0aGUgdW5kZXJseWluZyBzb3VyY2UgaXMgdXN1YWxseSBpbmZvcm1lZAogICAqIGFib3V0IHRoZSBwYXVzZSwKICAgKiBzbyBpdCBjYW4gc3RvcCBnZW5lcmF0aW5nIGV2ZW50cyB1bnRpbCB0aGUgc3Vic2NyaXB0aW9uIGlzIHJlc3VtZWQuCiAgICoKICAgKiBUbyBhdm9pZCBidWZmZXJpbmcgZXZlbnRzIG9uIGEgYnJvYWRjYXN0IHN0cmVhbSwgaXQgaXMgYmV0dGVyIHRvCiAgICogY2FuY2VsIHRoaXMgc3Vic2NyaXB0aW9uLCBhbmQgc3RhcnQgdG8gbGlzdGVuIGFnYWluIHdoZW4gZXZlbnRzCiAgICogYXJlIG5lZWRlZCwgaWYgdGhlIGludGVybWVkaWF0ZSBldmVudHMgYXJlIG5vdCBpbXBvcnRhbnQuCiAgICoKICAgKiBJZiBbcmVzdW1lU2lnbmFsXSBpcyBwcm92aWRlZCwgdGhlIHN0cmVhbSBzdWJzY3JpcHRpb24gd2lsbCB1bmRvIHRoZSBwYXVzZQogICAqIHdoZW4gdGhlIGZ1dHVyZSBjb21wbGV0ZXMsIGFzIGlmIGJ5IGEgY2FsbCB0byBbcmVzdW1lXS4KICAgKiBJZiB0aGUgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIGFuIGVycm9yLAogICAqIHRoZSBzdHJlYW0gd2lsbCBzdGlsbCByZXN1bWUsIGJ1dCB0aGUgZXJyb3Igd2lsbCBiZSBjb25zaWRlcmVkIHVuaGFuZGxlZAogICAqIGFuZCBpcyBwYXNzZWQgdG8gW1pvbmUuaGFuZGxlVW5jYXVnaHRFcnJvcl0uCiAgICoKICAgKiBBIGNhbGwgdG8gW3Jlc3VtZV0gd2lsbCBhbHNvIHVuZG8gYSBwYXVzZS4KICAgKgogICAqIElmIHRoZSBzdWJzY3JpcHRpb24gaXMgcGF1c2VkIG1vcmUgdGhhbiBvbmNlLCBhbiBlcXVhbCBudW1iZXIKICAgKiBvZiByZXN1bWVzIG11c3QgYmUgcGVyZm9ybWVkIHRvIHJlc3VtZSB0aGUgc3RyZWFtLgogICAqIENhbGxzIHRvIFtyZXN1bWVdIGFuZCB0aGUgY29tcGxldGlvbiBvZiBhIFtyZXN1bWVTaWduYWxdIGFyZQogICAqIGludGVyY2hhbmdlYWJsZSAtIHRoZSBbcGF1c2VdIHdoaWNoIHdhcyBwYXNzZWQgYSBbcmVzdW1lU2lnbmFsXSBtYXkgYmUKICAgKiBlbmRlZCBieSBhIGNhbGwgdG8gW3Jlc3VtZV0sIGFuZCBjb21wbGV0aW5nIHRoZSBbcmVzdW1lU2lnbmFsXSBtYXkgZW5kIGEKICAgKiBkaWZmZXJlbnQgW3BhdXNlXS4KICAgKgogICAqIEl0IGlzIHNhZmUgdG8gW3Jlc3VtZV0gb3IgY29tcGxldGUgYSBbcmVzdW1lU2lnbmFsXSBldmVuIHdoZW4gdGhlCiAgICogc3Vic2NyaXB0aW9uIGlzIG5vdCBwYXVzZWQsIGFuZCB0aGUgcmVzdW1lIHdpbGwgaGF2ZSBubyBlZmZlY3QuCiAgICoKICAgKiBDdXJyZW50bHkgRE9NIHN0cmVhbXMgc2lsZW50bHkgZHJvcCBldmVudHMgd2hlbiB0aGUgc3RyZWFtIGlzIHBhdXNlZC4gVGhpcwogICAqIGlzIGEgYnVnIGFuZCB3aWxsIGJlIGZpeGVkLgogICAqLwogIHZvaWQgcGF1c2UoW0Z1dHVyZSByZXN1bWVTaWduYWxdKTsKCiAgLyoqCiAgICogUmVzdW1lIGFmdGVyIGEgcGF1c2UuCiAgICoKICAgKiBUaGlzIHVuZG9lcyBvbmUgcHJldmlvdXMgY2FsbCB0byBbcGF1c2VdLgogICAqIFdoZW4gYWxsIHByZXZpb3VzbHkgY2FsbHMgdG8gW3BhdXNlXSBoYXZlIGJlZW4gbWF0Y2hlZCBieSBhIGNhbGxzIHRvCiAgICogW3Jlc3VtZV0sIHBvc3NpYmx5IHRocm91Z2ggYSBgcmVzdW1lU2lnbmFsYCBwYXNzZWQgdG8gW3BhdXNlXSwKICAgKiB0aGUgc3RyZWFtIHN1YnNjcmlwdGlvbiBtYXkgZW1pdCBldmVudHMgYWdhaW4uCiAgICoKICAgKiBJdCBpcyBzYWZlIHRvIFtyZXN1bWVdIGV2ZW4gd2hlbiB0aGUgc3Vic2NyaXB0aW9uIGlzIG5vdCBwYXVzZWQsIGFuZCB0aGUKICAgKiByZXN1bWUgd2lsbCBoYXZlIG5vIGVmZmVjdC4KICAgKi8KICB2b2lkIHJlc3VtZSgpOwoKICAvKioKICAgKiBXaGV0aGVyIHRoZSBbU3RyZWFtU3Vic2NyaXB0aW9uXSBpcyBjdXJyZW50bHkgcGF1c2VkLgogICAqCiAgICogSWYgdGhlcmUgaGF2ZSBiZWVuIG1vcmUgY2FsbHMgdG8gW3BhdXNlXSB0aGFuIHRvIFtyZXN1bWVdIG9uIHRoaXMKICAgKiBzdHJlYW0gc3Vic2NyaXB0aW9uLCB0aGUgc3Vic2NyaXB0aW9uIGlzIHBhdXNlZCwgYW5kIHRoaXMgZ2V0dGVyCiAgICogcmV0dXJucyBgdHJ1ZWAuCiAgICoKICAgKiBSZXR1cm5zIGBmYWxzZWAgaWYgdGhlIHN0cmVhbSBjYW4gY3VycmVudGx5IGVtaXQgZXZlbnRzLCBvciBpZgogICAqIHRoZSBzdWJzY3JpcHRpb24gaGFzIGNvbXBsZXRlZCBvciBiZWVuIGNhbmNlbGxlZC4KICAgKi8KICBib29sIGdldCBpc1BhdXNlZDsKCiAgLyoqCiAgICogUmV0dXJucyBhIGZ1dHVyZSB0aGF0IGhhbmRsZXMgdGhlIFtvbkRvbmVdIGFuZCBbb25FcnJvcl0gY2FsbGJhY2tzLgogICAqCiAgICogVGhpcyBtZXRob2QgKm92ZXJ3cml0ZXMqIHRoZSBleGlzdGluZyBbb25Eb25lXSBhbmQgW29uRXJyb3JdIGNhbGxiYWNrcwogICAqIHdpdGggbmV3IG9uZXMgdGhhdCBjb21wbGV0ZSB0aGUgcmV0dXJuZWQgZnV0dXJlLgogICAqCiAgICogSW4gY2FzZSBvZiBhbiBlcnJvciB0aGUgc3Vic2NyaXB0aW9uIHdpbGwgYXV0b21hdGljYWxseSBjYW5jZWwgKGV2ZW4KICAgKiB3aGVuIGl0IHdhcyBsaXN0ZW5pbmcgd2l0aCBgY2FuY2VsT25FcnJvcmAgc2V0IHRvIGBmYWxzZWApLgogICAqCiAgICogSW4gY2FzZSBvZiBhIGBkb25lYCBldmVudCB0aGUgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIHRoZSBnaXZlbgogICAqIFtmdXR1cmVWYWx1ZV0uCiAgICovCiAgRnV0dXJlPEU+IGFzRnV0dXJlPEU+KFtFIGZ1dHVyZVZhbHVlXSk7Cn0KCi8qKgogKiBBIFtTaW5rXSB0aGF0IHN1cHBvcnRzIGFkZGluZyBlcnJvcnMuCiAqCiAqIFRoaXMgbWFrZXMgaXQgc3VpdGFibGUgZm9yIGNhcHR1cmluZyB0aGUgcmVzdWx0cyBvZiBhc3luY2hyb25vdXMKICogY29tcHV0YXRpb25zLCB3aGljaCBjYW4gY29tcGxldGUgd2l0aCBhIHZhbHVlIG9yIGFuIGVycm9yLgogKgogKiBUaGUgW0V2ZW50U2lua10gaGFzIGJlZW4gZGVzaWduZWQgdG8gaGFuZGxlIGFzeW5jaHJvbm91cyBldmVudHMgZnJvbQogKiBbU3RyZWFtXXMuIFNlZSwgZm9yIGV4YW1wbGUsIFtTdHJlYW0uZXZlbnRUcmFuc2Zvcm1lZF0gd2hpY2ggdXNlcwogKiBgRXZlbnRTaW5rYHMgdG8gdHJhbnNmb3JtIGV2ZW50cy4KICovCmFic3RyYWN0IGNsYXNzIEV2ZW50U2luazxUPiBpbXBsZW1lbnRzIFNpbms8VD4gewogIC8qKgogICAqIEFkZHMgYSBkYXRhIFtldmVudF0gdG8gdGhlIHNpbmsuCiAgICoKICAgKiBNdXN0IG5vdCBiZSBjYWxsZWQgb24gYSBjbG9zZWQgc2luay4KICAgKi8KICB2b2lkIGFkZChUIGV2ZW50KTsKCiAgLyoqCiAgICogQWRkcyBhbiBbZXJyb3JdIHRvIHRoZSBzaW5rLgogICAqCiAgICogTXVzdCBub3QgYmUgY2FsbGVkIG9uIGEgY2xvc2VkIHNpbmsuCiAgICovCiAgdm9pZCBhZGRFcnJvcihPYmplY3QgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKTsKCiAgLyoqCiAgICogQ2xvc2VzIHRoZSBzaW5rLgogICAqCiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBtb3JlIHRoYW4gb25jZSBpcyBhbGxvd2VkLCBidXQgZG9lcyBub3RoaW5nLgogICAqCiAgICogTmVpdGhlciBbYWRkXSBub3IgW2FkZEVycm9yXSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGlzIG1ldGhvZC4KICAgKi8KICB2b2lkIGNsb3NlKCk7Cn0KCi8qKiBbU3RyZWFtXSB3cmFwcGVyIHRoYXQgb25seSBleHBvc2VzIHRoZSBbU3RyZWFtXSBpbnRlcmZhY2UuICovCmNsYXNzIFN0cmVhbVZpZXc8VD4gZXh0ZW5kcyBTdHJlYW08VD4gewogIGZpbmFsIFN0cmVhbTxUPiBfc3RyZWFtOwoKICBjb25zdCBTdHJlYW1WaWV3KFN0cmVhbTxUPiBzdHJlYW0pCiAgICAgIDogX3N0cmVhbSA9IHN0cmVhbSwKICAgICAgICBzdXBlci5faW50ZXJuYWwoKTsKCiAgYm9vbCBnZXQgaXNCcm9hZGNhc3QgPT4gX3N0cmVhbS5pc0Jyb2FkY2FzdDsKCiAgU3RyZWFtPFQ+IGFzQnJvYWRjYXN0U3RyZWFtKAogICAgICAgICAge3ZvaWQgb25MaXN0ZW4oU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbiksCiAgICAgICAgICB2b2lkIG9uQ2FuY2VsKFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24pfSkgPT4KICAgICAgX3N0cmVhbS5hc0Jyb2FkY2FzdFN0cmVhbShvbkxpc3Rlbjogb25MaXN0ZW4sIG9uQ2FuY2VsOiBvbkNhbmNlbCk7CgogIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBsaXN0ZW4odm9pZCBvbkRhdGEoVCB2YWx1ZSksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICByZXR1cm4gX3N0cmVhbS5saXN0ZW4ob25EYXRhLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsIG9uRG9uZTogb25Eb25lLCBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKTsKICB9Cn0KCi8qKgogKiBBYnN0cmFjdCBpbnRlcmZhY2UgZm9yIGEgInNpbmsiIGFjY2VwdGluZyBtdWx0aXBsZSBlbnRpcmUgc3RyZWFtcy4KICoKICogQSBjb25zdW1lciBjYW4gYWNjZXB0IGEgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHN0cmVhbXMgdXNpbmcgW2FkZFN0cmVhbV0sCiAqIGFuZCB3aGVuIG5vIGZ1cnRoZXIgZGF0YSBuZWVkIHRvIGJlIGFkZGVkLCB0aGUgW2Nsb3NlXSBtZXRob2QgdGVsbHMgdGhlCiAqIGNvbnN1bWVyIHRvIGNvbXBsZXRlIGl0cyB3b3JrIGFuZCBzaHV0IGRvd24uCiAqCiAqIFRoZSBbU3RyZWFtLnBpcGVdIGFjY2VwdHMgYSBgU3RyZWFtQ29uc3VtZXJgIGFuZCB3aWxsIHBhc3MgdGhlIHN0cmVhbQogKiB0byB0aGUgY29uc3VtZXIncyBbYWRkU3RyZWFtXSBtZXRob2QuIFdoZW4gdGhhdCBjb21wbGV0ZXMsIGl0IHdpbGwKICogY2FsbCBbY2xvc2VdIGFuZCB0aGVuIGNvbXBsZXRlIGl0cyBvd24gcmV0dXJuZWQgZnV0dXJlLgogKi8KYWJzdHJhY3QgY2xhc3MgU3RyZWFtQ29uc3VtZXI8Uz4gewogIC8qKgogICAqIENvbnN1bWVzIHRoZSBlbGVtZW50cyBvZiBbc3RyZWFtXS4KICAgKgogICAqIExpc3RlbnMgb24gW3N0cmVhbV0gYW5kIGRvZXMgc29tZXRoaW5nIGZvciBlYWNoIGV2ZW50LgogICAqCiAgICogUmV0dXJucyBhIGZ1dHVyZSB3aGljaCBpcyBjb21wbGV0ZWQgd2hlbiB0aGUgc3RyZWFtIGlzIGRvbmUgYmVpbmcgYWRkZWQsCiAgICogYW5kIHRoZSBjb25zdW1lciBpcyByZWFkeSB0byBhY2NlcHQgYSBuZXcgc3RyZWFtLgogICAqIE5vIGZ1cnRoZXIgY2FsbHMgdG8gW2FkZFN0cmVhbV0gb3IgW2Nsb3NlXSBzaG91bGQgaGFwcGVuIGJlZm9yZSB0aGUKICAgKiByZXR1cm5lZCBmdXR1cmUgaGFzIGNvbXBsZXRlZC4KICAgKgogICAqIFRoZSBjb25zdW1lciBtYXkgc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHN0cmVhbSBhZnRlciBhbiBlcnJvciwKICAgKiBpdCBtYXkgY29uc3VtZSBhbGwgdGhlIGVycm9ycyBhbmQgb25seSBzdG9wIGF0IGEgZG9uZSBldmVudCwKICAgKiBvciBpdCBtYXkgYmUgY2FuY2VsZWQgZWFybHkgaWYgdGhlIHJlY2VpdmVyIGRvbid0IHdhbnQgYW55IGZ1cnRoZXIgZXZlbnRzLgogICAqCiAgICogSWYgdGhlIGNvbnN1bWVyIHN0b3BzIGxpc3RlbmluZyBiZWNhdXNlIG9mIHNvbWUgZXJyb3IgcHJldmVudGluZyBpdAogICAqIGZyb20gY29udGludWluZywgaXQgbWF5IHJlcG9ydCB0aGlzIGVycm9yIGluIHRoZSByZXR1cm5lZCBmdXR1cmUsCiAgICogb3RoZXJ3aXNlIGl0IHdpbGwganVzdCBjb21wbGV0ZSB0aGUgZnV0dXJlIHdpdGggYG51bGxgLgogICAqLwogIEZ1dHVyZSBhZGRTdHJlYW0oU3RyZWFtPFM+IHN0cmVhbSk7CgogIC8qKgogICAqIFRlbGxzIHRoZSBjb25zdW1lciB0aGF0IG5vIGZ1cnRoZXIgc3RyZWFtcyB3aWxsIGJlIGFkZGVkLgogICAqCiAgICogVGhpcyBhbGxvd3MgdGhlIGNvbnN1bWVyIHRvIGNvbXBsZXRlIGFueSByZW1haW5pbmcgd29yayBhbmQgcmVsZWFzZQogICAqIHJlc291cmNlcyB0aGF0IGFyZSBubyBsb25nZXIgbmVlZGVkCiAgICoKICAgKiBSZXR1cm5zIGEgZnV0dXJlIHdoaWNoIGlzIGNvbXBsZXRlZCB3aGVuIHRoZSBjb25zdW1lciBoYXMgc2h1dCBkb3duLgogICAqIElmIGNsZWFuaW5nIHVwIGNhbiBmYWlsLCB0aGUgZXJyb3IgbWF5IGJlIHJlcG9ydGVkIGluIHRoZSByZXR1cm5lZCBmdXR1cmUsCiAgICogb3RoZXJ3aXNlIGl0IGNvbXBsZXRlcyB3aXRoIGBudWxsYC4KICAgKi8KICBGdXR1cmUgY2xvc2UoKTsKfQoKLyoqCiAqIEEgb2JqZWN0IHRoYXQgYWNjZXB0cyBzdHJlYW0gZXZlbnRzIGJvdGggc3luY2hyb25vdXNseSBhbmQgYXN5bmNocm9ub3VzbHkuCiAqCiAqIEEgW1N0cmVhbVNpbmtdIGNvbWJpbmVzIHRoZSBtZXRob2RzIGZyb20gW1N0cmVhbUNvbnN1bWVyXSBhbmQgW0V2ZW50U2lua10uCiAqCiAqIFRoZSBbRXZlbnRTaW5rXSBtZXRob2RzIGNhbid0IGJlIHVzZWQgd2hpbGUgdGhlIFthZGRTdHJlYW1dIGlzIGNhbGxlZC4KICogQXMgc29vbiBhcyB0aGUgW2FkZFN0cmVhbV0ncyBbRnV0dXJlXSBjb21wbGV0ZXMgd2l0aCBhIHZhbHVlLCB0aGUKICogW0V2ZW50U2lua10gbWV0aG9kcyBjYW4gYmUgdXNlZCBhZ2Fpbi4KICoKICogSWYgW2FkZFN0cmVhbV0gaXMgY2FsbGVkIGFmdGVyIGFueSBvZiB0aGUgW0V2ZW50U2lua10gbWV0aG9kcywgaXQnbGwKICogYmUgZGVsYXllZCB1bnRpbCB0aGUgdW5kZXJseWluZyBzeXN0ZW0gaGFzIGNvbnN1bWVkIHRoZSBkYXRhIGFkZGVkIGJ5IHRoZQogKiBbRXZlbnRTaW5rXSBtZXRob2RzLgogKgogKiBXaGVuIFtFdmVudFNpbmtdIG1ldGhvZHMgYXJlIHVzZWQsIHRoZSBbZG9uZV0gW0Z1dHVyZV0gY2FuIGJlIHVzZWQgdG8KICogY2F0Y2ggYW55IGVycm9ycy4KICoKICogV2hlbiBbY2xvc2VdIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gdGhlIFtkb25lXSBbRnV0dXJlXS4KICovCmFic3RyYWN0IGNsYXNzIFN0cmVhbVNpbms8Uz4gaW1wbGVtZW50cyBFdmVudFNpbms8Uz4sIFN0cmVhbUNvbnN1bWVyPFM+IHsKICAvKioKICAgKiBUZWxscyB0aGUgc3RyZWFtIHNpbmsgdGhhdCBubyBmdXJ0aGVyIHN0cmVhbXMgd2lsbCBiZSBhZGRlZC4KICAgKgogICAqIFRoaXMgYWxsb3dzIHRoZSBzdHJlYW0gc2luayB0byBjb21wbGV0ZSBhbnkgcmVtYWluaW5nIHdvcmsgYW5kIHJlbGVhc2UKICAgKiByZXNvdXJjZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIG5lZWRlZAogICAqCiAgICogUmV0dXJucyBhIGZ1dHVyZSB3aGljaCBpcyBjb21wbGV0ZWQgd2hlbiB0aGUgc3RyZWFtIHNpbmsgaGFzIHNodXQgZG93bi4KICAgKiBJZiBjbGVhbmluZyB1cCBjYW4gZmFpbCwgdGhlIGVycm9yIG1heSBiZSByZXBvcnRlZCBpbiB0aGUgcmV0dXJuZWQgZnV0dXJlLAogICAqIG90aGVyd2lzZSBpdCBjb21wbGV0ZXMgd2l0aCBgbnVsbGAuCiAgICoKICAgKiBSZXR1cm5zIHRoZSBzYW1lIGZ1dHVyZSBhcyBbZG9uZV0uCiAgICoKICAgKiBUaGUgc3RyZWFtIHNpbmsgbWF5IGNsb3NlIGJlZm9yZSB0aGUgW2Nsb3NlXSBtZXRob2QgaXMgY2FsbGVkLCBlaXRoZXIgZHVlCiAgICogdG8gYW4gZXJyb3Igb3IgYmVjYXVzZSBpdCBpcyBpdHNlbGYgcHJvdmlkaW5nIGV2ZW50cyB0byBzb21lb25lIHdobyBoYXMKICAgKiBzdG9wcGVkIGxpc3RlbmluZy4gSW4gdGhhdCBjYXNlLCB0aGUgW2RvbmVdIGZ1dHVyZSBpcyBjb21wbGV0ZWQgZmlyc3QsCiAgICogYW5kIHRoZSBgY2xvc2VgIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgYGRvbmVgIGZ1dHVyZSB3aGVuIGNhbGxlZC4KICAgKgogICAqIFVuaWZpZXMgW1N0cmVhbUNvbnN1bWVyLmNsb3NlXSBhbmQgW0V2ZW50U2luay5jbG9zZV0gd2hpY2ggYm90aCBtYXJrIHRoZWlyCiAgICogb2JqZWN0IGFzIG5vdCBleHBlY3RpbmcgYW55IGZ1cnRoZXIgZXZlbnRzLgogICAqLwogIEZ1dHVyZSBjbG9zZSgpOwoKICAvKioKICAgKiBSZXR1cm4gYSBmdXR1cmUgd2hpY2ggaXMgY29tcGxldGVkIHdoZW4gdGhlIFtTdHJlYW1TaW5rXSBpcyBmaW5pc2hlZC4KICAgKgogICAqIElmIHRoZSBgU3RyZWFtU2lua2AgZmFpbHMgd2l0aCBhbiBlcnJvciwKICAgKiBwZXJoYXBzIGluIHJlc3BvbnNlIHRvIGFkZGluZyBldmVudHMgdXNpbmcgW2FkZF0sIFthZGRFcnJvcl0gb3IgW2Nsb3NlXSwKICAgKiB0aGUgW2RvbmVdIGZ1dHVyZSB3aWxsIGNvbXBsZXRlIHdpdGggdGhhdCBlcnJvci4KICAgKgogICAqIE90aGVyd2lzZSwgdGhlIHJldHVybmVkIGZ1dHVyZSB3aWxsIGNvbXBsZXRlIHdoZW4gZWl0aGVyOgogICAqCiAgICogKiBhbGwgZXZlbnRzIGhhdmUgYmVlbiBwcm9jZXNzZWQgYW5kIHRoZSBzaW5rIGhhcyBiZWVuIGNsb3NlZCwgb3IKICAgKiAqIHRoZSBzaW5rIGhhcyBvdGhlcndpc2UgYmVlbiBzdG9wcGVkIGZyb20gaGFuZGxpbmcgbW9yZSBldmVudHMKICAgKiAgIChmb3IgZXhhbXBsZSBieSBjYW5jZWxpbmcgYSBzdHJlYW0gc3Vic2NyaXB0aW9uKS4KICAgKi8KICBGdXR1cmUgZ2V0IGRvbmU7Cn0KCi8qKgogKiBUcmFuc2Zvcm1zIGEgU3RyZWFtLgogKgogKiBXaGVuIGEgc3RyZWFtJ3MgW1N0cmVhbS50cmFuc2Zvcm1dIG1ldGhvZCBpcyBpbnZva2VkIHdpdGggYQogKiBbU3RyZWFtVHJhbnNmb3JtZXJdLCB0aGUgc3RyZWFtIGNhbGxzIHRoZSBbYmluZF0gbWV0aG9kIG9uIHRoZSBwcm92aWRlZAogKiB0cmFuc2Zvcm1lci4gVGhlIHJlc3VsdGluZyBzdHJlYW0gaXMgdGhlbiByZXR1cm5lZCBmcm9tIHRoZQogKiBbU3RyZWFtLnRyYW5zZm9ybV0gbWV0aG9kLgogKgogKiBDb25jZXB0dWFsbHksIGEgdHJhbnNmb3JtZXIgaXMgc2ltcGx5IGEgZnVuY3Rpb24gZnJvbSBbU3RyZWFtXSB0byBbU3RyZWFtXQogKiB0aGF0IGlzIGVuY2Fwc3VsYXRlZCBpbnRvIGEgY2xhc3MuCiAqCiAqIEl0IGlzIGdvb2QgcHJhY3RpY2UgdG8gd3JpdGUgdHJhbnNmb3JtZXJzIHRoYXQgY2FuIGJlIHVzZWQgbXVsdGlwbGUgdGltZXMuCiAqCiAqIEFsbCBvdGhlciB0cmFuc2Zvcm1pbmcgbWV0aG9kcyBvbiBbU3RyZWFtXSwgc3VjaCBhcyBbU3RyZWFtLm1hcF0sCiAqIFtTdHJlYW0ud2hlcmVdIG9yIFtTdHJlYW0uZXhwYW5kXSBjYW4gYmUgaW1wbGVtZW50ZWQgdXNpbmcKICogW1N0cmVhbS50cmFuc2Zvcm1dLiBBIFtTdHJlYW1UcmFuc2Zvcm1lcl0gaXMgdGh1cyB2ZXJ5IHBvd2VyZnVsIGJ1dCBvZnRlbgogKiBhbHNvIGEgYml0IG1vcmUgY29tcGxpY2F0ZWQgdG8gdXNlLgogKi8KYWJzdHJhY3QgY2xhc3MgU3RyZWFtVHJhbnNmb3JtZXI8UywgVD4gewogIC8qKgogICAqIENyZWF0ZXMgYSBbU3RyZWFtVHJhbnNmb3JtZXJdIGJhc2VkIG9uIHRoZSBnaXZlbiBbb25MaXN0ZW5dIGNhbGxiYWNrLgogICAqCiAgICogVGhlIHJldHVybmVkIHN0cmVhbSB0cmFuc2Zvcm1lciB1c2VzIHRoZSBwcm92aWRlZCBbb25MaXN0ZW5dIGNhbGxiYWNrCiAgICogd2hlbiBhIHRyYW5zZm9ybWVkIHN0cmVhbSBpcyBsaXN0ZW5lZCB0by4gQXQgdGhhdCB0aW1lLCB0aGUgY2FsbGJhY2sKICAgKiByZWNlaXZlcyB0aGUgaW5wdXQgc3RyZWFtICh0aGUgb25lIHBhc3NlZCB0byBbYmluZF0pIGFuZCBhCiAgICogYm9vbGVhbiBmbGFnIGBjYW5jZWxPbkVycm9yYCB0byBjcmVhdGUgYSBbU3RyZWFtU3Vic2NyaXB0aW9uXS4KICAgKgogICAqIFRoZSBbb25MaXN0ZW5dIGNhbGxiYWNrIGRvZXMgKm5vdCogcmVjZWl2ZSB0aGUgaGFuZGxlcnMgdGhhdCB3ZXJlIHBhc3NlZAogICAqIHRvIFtTdHJlYW0ubGlzdGVuXS4gVGhlc2UgYXJlIGF1dG9tYXRpY2FsbHkgc2V0IGFmdGVyIHRoZSBjYWxsIHRvIHRoZQogICAqIFtvbkxpc3Rlbl0gY2FsbGJhY2sgKHVzaW5nIFtTdHJlYW1TdWJzY3JpcHRpb24ub25EYXRhXSwKICAgKiBbU3RyZWFtU3Vic2NyaXB0aW9uLm9uRXJyb3JdIGFuZCBbU3RyZWFtU3Vic2NyaXB0aW9uLm9uRG9uZV0pLgogICAqCiAgICogTW9zdCBjb21tb25seSwgYW4gW29uTGlzdGVuXSBjYWxsYmFjayB3aWxsIGZpcnN0IGNhbGwgW1N0cmVhbS5saXN0ZW5dIG9uCiAgICogdGhlIHByb3ZpZGVkIHN0cmVhbSAod2l0aCB0aGUgY29ycmVzcG9uZGluZyBgY2FuY2VsT25FcnJvcmAgZmxhZyksIGFuZCB0aGVuCiAgICogcmV0dXJuIGEgbmV3IFtTdHJlYW1TdWJzY3JpcHRpb25dLgogICAqCiAgICogVGhlcmUgYXJlIHR3byBjb21tb24gd2F5cyB0byBjcmVhdGUgYSBTdHJlYW1TdWJzY3JpcHRpb246CiAgICoKICAgKiAxLiBieSBhbGxvY2F0aW5nIGEgW1N0cmVhbUNvbnRyb2xsZXJdIGFuZCB0byByZXR1cm4gdGhlIHJlc3VsdCBvZgogICAqICAgIGxpc3RlbmluZyB0byBpdHMgc3RyZWFtLiBJdCdzIGltcG9ydGFudCB0byBmb3J3YXJkIHBhdXNlLCByZXN1bWUgYW5kCiAgICogICAgY2FuY2VsIGV2ZW50cyAodW5sZXNzIHRoZSB0cmFuc2Zvcm1lciBpbnRlbnRpb25hbGx5IHdhbnRzIHRvIGNoYW5nZQogICAqICAgIHRoaXMgYmVoYXZpb3IpLgogICAqIDIuIGJ5IGNyZWF0aW5nIGEgbmV3IGNsYXNzIHRoYXQgaW1wbGVtZW50cyBbU3RyZWFtU3Vic2NyaXB0aW9uXS4KICAgKiAgICBOb3RlIHRoYXQgdGhlIHN1YnNjcmlwdGlvbiBzaG91bGQgcnVuIGNhbGxiYWNrcyBpbiB0aGUgW1pvbmVdIHRoZQogICAqICAgIHN0cmVhbSB3YXMgbGlzdGVuZWQgdG8gKHNlZSBbWm9uZV0gYW5kIFtab25lLmJpbmRDYWxsYmFja10pLgogICAqCiAgICogRXhhbXBsZToKICAgKgogICAqIGBgYAogICAqIC8vLyBTdGFydHMgbGlzdGVuaW5nIHRvIFtpbnB1dF0gYW5kIGR1cGxpY2F0ZXMgYWxsIG5vbi1lcnJvciBldmVudHMuCiAgICogU3RyZWFtU3Vic2NyaXB0aW9uPGludD4gX29uTGlzdGVuKFN0cmVhbTxpbnQ+IGlucHV0LCBib29sIGNhbmNlbE9uRXJyb3IpIHsKICAgKiAgIFN0cmVhbVN1YnNjcmlwdGlvbjxTdHJpbmc+IHN1YnNjcmlwdGlvbjsKICAgKiAgIC8vIENyZWF0ZSBjb250cm9sbGVyIHRoYXQgZm9yd2FyZHMgcGF1c2UsIHJlc3VtZSBhbmQgY2FuY2VsIGV2ZW50cy4KICAgKiAgIHZhciBjb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8U3RyaW5nPigKICAgKiAgICAgICBvblBhdXNlOiAoKSB7CiAgICogICAgICAgICBzdWJzY3JpcHRpb24ucGF1c2UoKTsKICAgKiAgICAgICB9LAogICAqICAgICAgIG9uUmVzdW1lOiAoKSB7CiAgICogICAgICAgICBzdWJzY3JpcHRpb24ucmVzdW1lKCk7CiAgICogICAgICAgfSwKICAgKiAgICAgICBvbkNhbmNlbDogKCkgPT4gc3Vic2NyaXB0aW9uLmNhbmNlbCgpLAogICAqICAgICAgIHN5bmM6IHRydWUpOyAvLyAic3luYyIgaXMgY29ycmVjdCBoZXJlLCBzaW5jZSBldmVudHMgYXJlIGZvcndhcmRlZC4KICAgKgogICAqICAgLy8gTGlzdGVuIHRvIHRoZSBwcm92aWRlZCBzdHJlYW0gdXNpbmcgYGNhbmNlbE9uRXJyb3JgLgogICAqICAgc3Vic2NyaXB0aW9uID0gaW5wdXQubGlzdGVuKChkYXRhKSB7CiAgICogICAgIC8vIER1cGxpY2F0ZSB0aGUgZGF0YS4KICAgKiAgICAgY29udHJvbGxlci5hZGQoZGF0YSk7CiAgICogICAgIGNvbnRyb2xsZXIuYWRkKGRhdGEpOwogICAqICAgfSwKICAgKiAgICAgICBvbkVycm9yOiBjb250cm9sbGVyLmFkZEVycm9yLAogICAqICAgICAgIG9uRG9uZTogY29udHJvbGxlci5jbG9zZSwKICAgKiAgICAgICBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKTsKICAgKgogICAqICAgLy8gUmV0dXJuIGEgbmV3IFtTdHJlYW1TdWJzY3JpcHRpb25dIGJ5IGxpc3RlbmluZyB0byB0aGUgY29udHJvbGxlcidzCiAgICogICAvLyBzdHJlYW0uCiAgICogICByZXR1cm4gY29udHJvbGxlci5zdHJlYW0ubGlzdGVuKG51bGwpOwogICAqIH0KICAgKgogICAqIC8vIEluc3RhbnRpYXRlIGEgdHJhbnNmb3JtZXI6CiAgICogdmFyIGR1cGxpY2F0b3IgPSBjb25zdCBTdHJlYW1UcmFuc2Zvcm1lcjxpbnQsIGludD4oX29uTGlzdGVuKTsKICAgKgogICAqIC8vIFVzZSBhcyBmb2xsb3dzOgogICAqIGludFN0cmVhbS50cmFuc2Zvcm0oZHVwbGljYXRvcik7CiAgICogYGBgCiAgICovCiAgY29uc3QgZmFjdG9yeSBTdHJlYW1UcmFuc2Zvcm1lcigKICAgICAgICAgIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBvbkxpc3RlbigKICAgICAgICAgICAgICBTdHJlYW08Uz4gc3RyZWFtLCBib29sIGNhbmNlbE9uRXJyb3IpKSA9CiAgICAgIF9TdHJlYW1TdWJzY3JpcHRpb25UcmFuc2Zvcm1lcjxTLCBUPjsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtTdHJlYW1UcmFuc2Zvcm1lcl0gdGhhdCBkZWxlZ2F0ZXMgZXZlbnRzIHRvIHRoZSBnaXZlbiBmdW5jdGlvbnMuCiAgICoKICAgKiBFeGFtcGxlIHVzZSBvZiBhIGR1cGxpY2F0aW5nIHRyYW5zZm9ybWVyOgogICAqCiAgICogYGBgCiAgICogc3RyaW5nU3RyZWFtLnRyYW5zZm9ybShuZXcgU3RyZWFtVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+LmZyb21IYW5kbGVycygKICAgKiAgICAgaGFuZGxlRGF0YTogKFN0cmluZyB2YWx1ZSwgRXZlbnRTaW5rPFN0cmluZz4gc2luaykgewogICAqICAgICAgIHNpbmsuYWRkKHZhbHVlKTsKICAgKiAgICAgICBzaW5rLmFkZCh2YWx1ZSk7ICAvLyBEdXBsaWNhdGUgdGhlIGluY29taW5nIGV2ZW50cy4KICAgKiAgICAgfSkpOwogICAqIGBgYAogICAqCiAgICogVHJhbnNmb3JtZXJzIHRoYXQgYXJlIGNvbnN0cnVjdGVkIHRoaXMgd2F5IGNhbm5vdCB1c2UgY2FwdHVyZWQgc3RhdGUgaWYKICAgKiB0aGV5IGFyZSB1c2VkIGluIHN0cmVhbXMgdGhhdCBjYW4gYmUgbGlzdGVuZWQgdG8gbXVsdGlwbGUgdGltZXMuCiAgICogYGBgCiAgICogU3RyZWFtQ29udHJvbGxlcjxTdHJpbmc+IGNvbnRyb2xsZXI7CiAgICogY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdChvbkxpc3RlbjogKCkgewogICAqICAgc2NoZWR1bGVNaWNyb3Rhc2soKCkgewogICAqICAgICBjb250cm9sbGVyLmFkZEVycm9yKCJCYWQiKTsKICAgKiAgICAgY29udHJvbGxlci5hZGRFcnJvcigiV29yc2UiKTsKICAgKiAgICAgY29udHJvbGxlci5hZGRFcnJvcigiV29yc3QiKTsKICAgKiAgIH0pOwogICAqIH0pOwogICAqIHZhciBzaGFyZWRTdGF0ZSA9IDA7CiAgICogdmFyIHRyYW5zZm9ybWVkU3RyZWFtID0gY29udHJvbGxlci5zdHJlYW0udHJhbnNmb3JtKAogICAqICAgICBuZXcgU3RyZWFtVHJhbnNmb3JtZXI8U3RyaW5nPi5mcm9tSGFuZGxlcnMoCiAgICogICAgICAgICBoYW5kbGVFcnJvcjogKGVycm9yLCBzdGFja1RyYWNlLCBzaW5rKSB7CiAgICogICBzaGFyZWRTdGF0ZSsrOyAvLyBJbmNyZW1lbnQgc2hhcmVkIGVycm9yLWNvdW50ZXIuCiAgICogICBzaW5rLmFkZCgiRXJyb3IgJHNoYXJlZFN0YXRlOiAkZXJyb3IiKTsKICAgKiB9KSk7CiAgICoKICAgKiB0cmFuc2Zvcm1lZFN0cmVhbS5saXN0ZW4ocHJpbnQpOwogICAqIHRyYW5zZm9ybWVkU3RyZWFtLmxpc3RlbihwcmludCk7IC8vIExpc3RlbiB0d2ljZS4KICAgKiAvLyBMaXN0ZW5pbmcgdHdpY2UgdG8gdGhlIHNhbWUgc3RyZWFtIG1ha2VzIHRoZSB0cmFuc2Zvcm1lciBzaGFyZSB0aGUgc2FtZQogICAqIC8vIHN0YXRlLiBJbnN0ZWFkIG9mIGhhdmluZyAiRXJyb3IgMTogQmFkIiwgIkVycm9yIDI6IFdvcnNlIiwKICAgKiAvLyAiRXJyb3IgMzogV29yc3QiIGFzIG91dHB1dCAoZWFjaCB0d2ljZSBmb3IgdGhlIHNlcGFyYXRlIHN1YnNjcmlwdGlvbnMpLAogICAqIC8vIHRoaXMgcHJvZ3JhbSBlbWl0czoKICAgKiAvLyBFcnJvciAxOiBCYWQKICAgKiAvLyBFcnJvciAyOiBCYWQKICAgKiAvLyBFcnJvciAzOiBXb3JzZQogICAqIC8vIEVycm9yIDQ6IFdvcnNlCiAgICogLy8gRXJyb3IgNTogV29yc3QKICAgKiAvLyBFcnJvciA2OiBXb3JzdAogICAqIGBgYAogICAqLwogIGZhY3RvcnkgU3RyZWFtVHJhbnNmb3JtZXIuZnJvbUhhbmRsZXJzKAogICAgICB7dm9pZCBoYW5kbGVEYXRhKFMgZGF0YSwgRXZlbnRTaW5rPFQ+IHNpbmspLAogICAgICB2b2lkIGhhbmRsZUVycm9yKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlLCBFdmVudFNpbms8VD4gc2luayksCiAgICAgIHZvaWQgaGFuZGxlRG9uZShFdmVudFNpbms8VD4gc2luayl9KSA9IF9TdHJlYW1IYW5kbGVyVHJhbnNmb3JtZXI8UywgVD47CgogIC8qKgogICAqIENyZWF0ZXMgYSBbU3RyZWFtVHJhbnNmb3JtZXJdIGJhc2VkIG9uIGEgW2JpbmRdIGNhbGxiYWNrLgogICAqCiAgICogVGhlIHJldHVybmVkIHN0cmVhbSB0cmFuc2Zvcm1lciB1c2VzIHRoZSBbYmluZF0gYXJndW1lbnQgdG8gaW1wbGVtZW50IHRoZQogICAqIFtTdHJlYW1UcmFuc2Zvcm1lci5iaW5kXSBBUEkgYW5kIGNhbiBiZSB1c2VkIHdoZW4gdGhlIHRyYW5zZm9ybWF0aW9uIGlzCiAgICogYXZhaWxhYmxlIGFzIGEgc3RyZWFtLXRvLXN0cmVhbSBmdW5jdGlvbi4KICAgKgogICAqIGBgYGRhcnQKICAgKiBmaW5hbCBzcGxpdERlY29kZWQgPSBTdHJlYW1UcmFuc2Zvcm1lcjxMaXN0PGludD4sIFN0cmluZz4uZnJvbUJpbmQoCiAgICogICAgIChzdHJlYW0pID0+IHN0cmVhbS50cmFuc2Zvcm0odXRmOC5kZWNvZGVyKS50cmFuc2Zvcm0oTGluZVNwbGl0dGVyKCkpKTsKICAgKiBgYGAKICAgKi8KICBAU2luY2UoIjIuMSIpCiAgZmFjdG9yeSBTdHJlYW1UcmFuc2Zvcm1lci5mcm9tQmluZChTdHJlYW08VD4gRnVuY3Rpb24oU3RyZWFtPFM+KSBiaW5kKSA9CiAgICAgIF9TdHJlYW1CaW5kVHJhbnNmb3JtZXI8UywgVD47CgogIC8qKgogICAqIEFkYXB0cyBbc291cmNlXSB0byBiZSBhIGBTdHJlYW1UcmFuc2Zvcm1lcjxUUywgVFQ+YC4KICAgKgogICAqIFRoaXMgYWxsb3dzIFtzb3VyY2VdIHRvIGJlIHVzZWQgYXQgdGhlIG5ldyB0eXBlLCBidXQgYXQgcnVuLXRpbWUgaXQKICAgKiBtdXN0IHNhdGlzZnkgdGhlIHJlcXVpcmVtZW50cyBvZiBib3RoIHRoZSBuZXcgdHlwZSBhbmQgaXRzIG9yaWdpbmFsIHR5cGUuCiAgICoKICAgKiBEYXRhIGV2ZW50cyBwYXNzZWQgaW50byB0aGUgcmV0dXJuZWQgdHJhbnNmb3JtZXIgbXVzdCBhbHNvIGJlIGluc3RhbmNlcwogICAqIG9mIFtTU10sIGFuZCBkYXRhIGV2ZW50cyBwcm9kdWNlZCBieSBbc291cmNlXSBmb3IgdGhvc2UgZXZlbnRzIG11c3QKICAgKiBhbHNvIGJlIGluc3RhbmNlcyBvZiBbVFRdLgogICAqLwogIHN0YXRpYyBTdHJlYW1UcmFuc2Zvcm1lcjxUUywgVFQ+IGNhc3RGcm9tPFNTLCBTVCwgVFMsIFRUPigKICAgICAgU3RyZWFtVHJhbnNmb3JtZXI8U1MsIFNUPiBzb3VyY2UpIHsKICAgIHJldHVybiBuZXcgQ2FzdFN0cmVhbVRyYW5zZm9ybWVyPFNTLCBTVCwgVFMsIFRUPihzb3VyY2UpOwogIH0KCiAgLyoqCiAgICogVHJhbnNmb3JtcyB0aGUgcHJvdmlkZWQgW3N0cmVhbV0uCiAgICoKICAgKiBSZXR1cm5zIGEgbmV3IHN0cmVhbSB3aXRoIGV2ZW50cyB0aGF0IGFyZSBjb21wdXRlZCBmcm9tIGV2ZW50cyBvZiB0aGUKICAgKiBwcm92aWRlZCBbc3RyZWFtXS4KICAgKgogICAqIFRoZSBbU3RyZWFtVHJhbnNmb3JtZXJdIGludGVyZmFjZSBpcyBjb21wbGV0ZWx5IGdlbmVyaWMsCiAgICogc28gaXQgY2Fubm90IHNheSB3aGF0IHN1YmNsYXNzZXMgZG8uCiAgICogRWFjaCBbU3RyZWFtVHJhbnNmb3JtZXJdIHNob3VsZCBkb2N1bWVudCBjbGVhcmx5IGhvdyBpdCB0cmFuc2Zvcm1zIHRoZQogICAqIHN0cmVhbSAob24gdGhlIGNsYXNzIG9yIHZhcmlhYmxlIHVzZWQgdG8gYWNjZXNzIHRoZSB0cmFuc2Zvcm1lciksCiAgICogYXMgd2VsbCBhcyBhbnkgZGlmZmVyZW5jZXMgZnJvbSB0aGUgZm9sbG93aW5nIHR5cGljYWwgYmVoYXZpb3I6CiAgICoKICAgKiAqIFdoZW4gdGhlIHJldHVybmVkIHN0cmVhbSBpcyBsaXN0ZW5lZCB0bywgaXQgc3RhcnRzIGxpc3RlbmluZyB0byB0aGUKICAgKiAgIGlucHV0IFtzdHJlYW1dLgogICAqICogU3Vic2NyaXB0aW9ucyBvZiB0aGUgcmV0dXJuZWQgc3RyZWFtIGZvcndhcmQgKGluIGEgcmVhc29uYWJsZSB0aW1lKQogICAqICAgYSBbU3RyZWFtU3Vic2NyaXB0aW9uLnBhdXNlXSBjYWxsIHRvIHRoZSBzdWJzY3JpcHRpb24gb2YgdGhlIGlucHV0CiAgICogICBbc3RyZWFtXS4KICAgKiAqIFNpbWlsYXJseSwgY2FuY2VsaW5nIGEgc3Vic2NyaXB0aW9uIG9mIHRoZSByZXR1cm5lZCBzdHJlYW0gZXZlbnR1YWxseQogICAqICAgKGluIHJlYXNvbmFibGUgdGltZSkgY2FuY2VscyB0aGUgc3Vic2NyaXB0aW9uIG9mIHRoZSBpbnB1dCBbc3RyZWFtXS4KICAgKgogICAqICJSZWFzb25hYmxlIHRpbWUiIGRlcGVuZHMgb24gdGhlIHRyYW5zZm9ybWVyIGFuZCBzdHJlYW0uIFNvbWUgdHJhbnNmb3JtZXJzLAogICAqIGxpa2UgYSAidGltZW91dCIgdHJhbnNmb3JtZXIsIG1pZ2h0IG1ha2UgdGhlc2Ugb3BlcmF0aW9ucyBkZXBlbmQgb24gYQogICAqIGR1cmF0aW9uLiBPdGhlcnMgbWlnaHQgbm90IGRlbGF5IHRoZW0gYXQgYWxsLCBvciBqdXN0IGJ5IGEgbWljcm90YXNrLgogICAqCiAgICogVHJhbnNmb3JtZXJzIGFyZSBmcmVlIHRvIGhhbmRsZSBlcnJvcnMgaW4gYW55IHdheS4KICAgKiBBIHRyYW5zZm9ybWVyIGltcGxlbWVudGF0aW9uIG1heSBjaG9vc2UgdG8gcHJvcGFnYXRlIGVycm9ycywKICAgKiBvciBjb252ZXJ0IHRoZW0gdG8gb3RoZXIgZXZlbnRzLCBvciBpZ25vcmUgdGhlbSBjb21wbGV0ZWx5LAogICAqIGJ1dCBpZiBlcnJvcnMgYXJlIGlnbm9yZWQsIGl0IHNob3VsZCBiZSBkb2N1bWVudGVkIGV4cGxpY2l0bHkuCiAgICovCiAgU3RyZWFtPFQ+IGJpbmQoU3RyZWFtPFM+IHN0cmVhbSk7CgogIC8qKgogICAqIFByb3ZpZGVzIGEgYFN0cmVhbVRyYW5zZm9ybWVyPFJTLCBSVD5gIHZpZXcgb2YgdGhpcyBzdHJlYW0gdHJhbnNmb3JtZXIuCiAgICoKICAgKiBUaGUgcmVzdWx0aW5nIHRyYW5zZm9ybWVyIHdpbGwgY2hlY2sgYXQgcnVuLXRpbWUgdGhhdCBhbGwgZGF0YSBldmVudHMKICAgKiBvZiB0aGUgc3RyZWFtIGl0IHRyYW5zZm9ybXMgYXJlIGFjdHVhbGx5IGluc3RhbmNlcyBvZiBbU10sCiAgICogYW5kIGl0IHdpbGwgY2hlY2sgdGhhdCBhbGwgZGF0YSBldmVudHMgcHJvZHVjZWQgYnkgdGhpcyB0cmFuc2Zvcm1lcgogICAqIGFyZSBhY3R1YWxseSBpbnN0YW5jZXMgb2YgW1JUXS4KICAgKi8KICBTdHJlYW1UcmFuc2Zvcm1lcjxSUywgUlQ+IGNhc3Q8UlMsIFJUPigpOwp9CgovKioKICogQmFzZSBjbGFzcyBmb3IgaW1wbGVtZW50aW5nIFtTdHJlYW1UcmFuc2Zvcm1lcl0uCiAqCiAqIENvbnRhaW5zIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIGV2ZXJ5IG1ldGhvZCBleGNlcHQgW2JpbmRdLgogKi8KYWJzdHJhY3QgY2xhc3MgU3RyZWFtVHJhbnNmb3JtZXJCYXNlPFMsIFQ+IGltcGxlbWVudHMgU3RyZWFtVHJhbnNmb3JtZXI8UywgVD4gewogIGNvbnN0IFN0cmVhbVRyYW5zZm9ybWVyQmFzZSgpOwoKICBTdHJlYW1UcmFuc2Zvcm1lcjxSUywgUlQ+IGNhc3Q8UlMsIFJUPigpID0+CiAgICAgIFN0cmVhbVRyYW5zZm9ybWVyLmNhc3RGcm9tPFMsIFQsIFJTLCBSVD4odGhpcyk7Cn0KCi8qKgogKiBBbiBbSXRlcmF0b3JdIGxpa2UgaW50ZXJmYWNlIGZvciB0aGUgdmFsdWVzIG9mIGEgW1N0cmVhbV0uCiAqCiAqIFRoaXMgd3JhcHMgYSBbU3RyZWFtXSBhbmQgYSBzdWJzY3JpcHRpb24gb24gdGhlIHN0cmVhbS4gSXQgbGlzdGVucwogKiBvbiB0aGUgc3RyZWFtLCBhbmQgY29tcGxldGVzIHRoZSBmdXR1cmUgcmV0dXJuZWQgYnkgW21vdmVOZXh0XSB3aGVuIHRoZQogKiBuZXh0IHZhbHVlIGJlY29tZXMgYXZhaWxhYmxlLgogKgogKiBUaGUgc3RyZWFtIG1heSBiZSBwYXVzZWQgYmV0d2VlbiBjYWxscyB0byBbbW92ZU5leHRdLgogKi8KYWJzdHJhY3QgY2xhc3MgU3RyZWFtSXRlcmF0b3I8VD4gewogIC8qKiBDcmVhdGUgYSBbU3RyZWFtSXRlcmF0b3JdIG9uIFtzdHJlYW1dLiAqLwogIGZhY3RvcnkgU3RyZWFtSXRlcmF0b3IoU3RyZWFtPFQ+IHN0cmVhbSkKICAgICAgLy8gVE9ETyhscm4pOiB1c2UgcmVkaXJlY3RpbmcgZmFjdG9yeSBjb25zdHJ1Y3RvciB3aGVuIHR5cGUKICAgICAgLy8gYXJndW1lbnRzIGFyZSBzdXBwb3J0ZWQuCiAgICAgID0+CiAgICAgIG5ldyBfU3RyZWFtSXRlcmF0b3I8VD4oc3RyZWFtKTsKCiAgLyoqCiAgICogV2FpdCBmb3IgdGhlIG5leHQgc3RyZWFtIHZhbHVlIHRvIGJlIGF2YWlsYWJsZS4KICAgKgogICAqIFJldHVybnMgYSBmdXR1cmUgd2hpY2ggd2lsbCBjb21wbGV0ZSB3aXRoIGVpdGhlciBgdHJ1ZWAgb3IgYGZhbHNlYC4KICAgKiBDb21wbGV0aW5nIHdpdGggYHRydWVgIG1lYW5zIHRoYXQgYW5vdGhlciBldmVudCBoYXMgYmVlbiByZWNlaXZlZCBhbmQKICAgKiBjYW4gYmUgcmVhZCBhcyBbY3VycmVudF0uCiAgICogQ29tcGxldGluZyB3aXRoIGBmYWxzZWAgbWVhbnMgdGhhdCB0aGUgc3RyZWFtIGl0ZXJhdGlvbiBpcyBkb25lIGFuZAogICAqIG5vIGZ1cnRoZXIgZXZlbnRzIHdpbGwgZXZlciBiZSBhdmFpbGFibGUuCiAgICogVGhlIGZ1dHVyZSBtYXkgY29tcGxldGUgd2l0aCBhbiBlcnJvciwgaWYgdGhlIHN0cmVhbSBwcm9kdWNlcyBhbiBlcnJvciwKICAgKiB3aGljaCBhbHNvIGVuZHMgaXRlcmF0aW9uLgogICAqCiAgICogVGhlIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCBhZ2FpbiB1bnRpbCB0aGUgZnV0dXJlIHJldHVybmVkIGJ5IGEKICAgKiBwcmV2aW91cyBjYWxsIGlzIGNvbXBsZXRlZC4KICAgKi8KICBGdXR1cmU8Ym9vbD4gbW92ZU5leHQoKTsKCiAgLyoqCiAgICogVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHN0cmVhbS4KICAgKgogICAqIElzIGBudWxsYCBiZWZvcmUgdGhlIGZpcnN0IGNhbGwgdG8gW21vdmVOZXh0XSBhbmQgYWZ0ZXIgYSBjYWxsIHRvCiAgICogYG1vdmVOZXh0YCBjb21wbGV0ZXMgd2l0aCBhIGBmYWxzZWAgcmVzdWx0IG9yIGFuIGVycm9yLgogICAqCiAgICogV2hlbiBhIGBtb3ZlTmV4dGAgY2FsbCBjb21wbGV0ZXMgd2l0aCBgdHJ1ZWAsIHRoZSBgY3VycmVudGAgZmllbGQgaG9sZHMKICAgKiB0aGUgbW9zdCByZWNlbnQgZXZlbnQgb2YgdGhlIHN0cmVhbSwgYW5kIGl0IHN0YXlzIGxpa2UgdGhhdCB1bnRpbCB0aGUgbmV4dAogICAqIGNhbGwgdG8gYG1vdmVOZXh0YC4KICAgKiBCZXR3ZWVuIGEgY2FsbCB0byBgbW92ZU5leHRgIGFuZCB3aGVuIGl0cyByZXR1cm5lZCBmdXR1cmUgY29tcGxldGVzLAogICAqIHRoZSB2YWx1ZSBpcyB1bnNwZWNpZmllZC4KICAgKi8KICBUIGdldCBjdXJyZW50OwoKICAvKioKICAgKiBDYW5jZWxzIHRoZSBzdHJlYW0gaXRlcmF0b3IgKGFuZCB0aGUgdW5kZXJseWluZyBzdHJlYW0gc3Vic2NyaXB0aW9uKSBlYXJseS4KICAgKgogICAqIFRoZSBzdHJlYW0gaXRlcmF0b3IgaXMgYXV0b21hdGljYWxseSBjYW5jZWxlZCBpZiB0aGUgW21vdmVOZXh0XSBmdXR1cmUKICAgKiBjb21wbGV0ZXMgd2l0aCBlaXRoZXIgYGZhbHNlYCBvciBhbiBlcnJvci4KICAgKgogICAqIElmIHlvdSBuZWVkIHRvIHN0b3AgbGlzdGVuaW5nIGZvciB2YWx1ZXMgYmVmb3JlIHRoZSBzdHJlYW0gaXRlcmF0b3IgaXMKICAgKiBhdXRvbWF0aWNhbGx5IGNsb3NlZCwgeW91IG11c3QgY2FsbCBbY2FuY2VsXSB0byBlbnN1cmUgdGhhdCB0aGUgc3RyZWFtCiAgICogaXMgcHJvcGVybHkgY2xvc2VkLgogICAqCiAgICogSWYgW21vdmVOZXh0XSBoYXMgYmVlbiBjYWxsZWQgd2hlbiB0aGUgaXRlcmF0b3IgaXMgY2FuY2VsZWQsCiAgICogaXRzIHJldHVybmVkIGZ1dHVyZSB3aWxsIGNvbXBsZXRlIHdpdGggYGZhbHNlYCBhcyB2YWx1ZSwKICAgKiBhcyB3aWxsIGFsbCBmdXJ0aGVyIGNhbGxzIHRvIFttb3ZlTmV4dF0uCiAgICoKICAgKiBSZXR1cm5zIGEgZnV0dXJlIGlmIHRoZSBjYW5jZWwtb3BlcmF0aW9uIGlzIG5vdCBjb21wbGV0ZWQgc3luY2hyb25vdXNseS4KICAgKiBPdGhlcndpc2UgcmV0dXJucyBgbnVsbGAuCiAgICovCiAgRnV0dXJlIGNhbmNlbCgpOwp9CgovKioKICogV3JhcHMgYW4gW19FdmVudFNpbmtdIHNvIGl0IGV4cG9zZXMgb25seSB0aGUgW0V2ZW50U2lua10gaW50ZXJmYWNlLgogKi8KY2xhc3MgX0NvbnRyb2xsZXJFdmVudFNpbmtXcmFwcGVyPFQ+IGltcGxlbWVudHMgRXZlbnRTaW5rPFQ+IHsKICBFdmVudFNpbmsgX3Npbms7CiAgX0NvbnRyb2xsZXJFdmVudFNpbmtXcmFwcGVyKHRoaXMuX3NpbmspOwoKICB2b2lkIGFkZChUIGRhdGEpIHsKICAgIF9zaW5rLmFkZChkYXRhKTsKICB9CgogIHZvaWQgYWRkRXJyb3IoZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICBfc2luay5hZGRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQoKICB2b2lkIGNsb3NlKCkgewogICAgX3NpbmsuY2xvc2UoKTsKICB9Cn0KiIUATk48ARQBRxVHAR8BBCkDPE5JLFEDQDQ+NDI5A0UYA1EbP0I6A04tA0opA0VHA0ADSEYZA0lPGwNQT0NFT08QUSFPNgNHSU5FEANQTR0DPksVBBsMAQZLBUdCBhwBBigFRRwGMgEGPwVHNgYwR0hFSxoeJCYvJAgeBAEGLgVOJEEsBVE+BTwFQwY8SxNBHk4eIiA4CAcuIiw4CAdPPkUiDy4GODkeBAEGTgVNQztFBUM1QjcGNig4BAEGSgVOSxIFRgYrLxEeJEUnARcVDiEOMhklEgoIHAYBIB05FQoGASoUFxkgCxYaGBgLFyEsGTMaIhkOCxctGCUMHgQBBk8cBUhNR0xOTCEFQAUwBT4wLgUjJCQNBUMxCwVWNk4XPwsFPwVABiM9MgQBBioFSU8FTQY3JAEGMAYhAQZQBUZLLQVNR0pPKgVMRj4FTUwvBh86PEAEAQYpBVA9SSAFTDgFSi4FRUhKTBM4Uj8zMAVLNQVMRgVDPSkGNT4BBkgFSUAFRjYFQkwrBigsBAEGRQVESAVDOEUUBVAFQkhMOgYpMAQBBk0cBUhMIQVCBjgpKAEWIjM1LS0eDiUZJRIKJSATLDIRJAo3BgEcNh4ZIw0XDSweGCINGSMNMRcGHgQBBkUFTwVOHUlPSVBLUSk7BUIGOSkoFjA1LR0OJhklEgohIE0KCUolBgEcNh4ZIw0XDSweGCINGSMNMRcGHgQBBkwFTyAFRTNMFU0cBURQDwVPSzxOSEcFT0cWBUJMQAZAOwQBBkkFSCJLSCFNTCYFSx0FQkw9BjgzBAEGPAVDIVFRBUknBU8gRyMGMk8EAQYyBSU8TCAJPAlABTQ/KSsGRikEAQZFBUQ0Oic9LgVFHQVED0U3IAY3KhwNJSAWG0cgPhMdHgwLKBUcEjpQRDYdOA4TJQwLHhMEAQZFBUJCEkU4BUUdRwVFNyAGSCocJSAWRR48CygVIwseEwQBBkoFT0cWBVAOBU03GwYxNC4lFyAWGCUMGRAjG0gMCygVLwseEwQBBk4FSVFPDgVHNxsGKTAlIBZDGzsOPAsoFSMLHhMEAQY3BUYaBUc0GwYrJCUgFkU/PQsoFSILHhMEAQZJBTJQGwVJMwVFNxsGLTAlIBY9HDwOPAsoFSILHhMEAQZIBTJOGwVJNAVFNxsGKzAlIBY9GzsOPAsoFSMLHhMEAQYsBUNDBSQ3GwVOKQYbLhMRDhMLKBUjCx4TBAEGMAVNGU8dBVAMBU4zBh0wJSAOOAsoFSILHhMEAQYsBUtIBjYGNwVKH00FJDcbBh0cNhETHAsoFSQLHhMEAQYyBUkfTAVGSCA8GAUkNxsGGyI0ERMcCygVJAseEwQBBk8PBUxQHkU3IAVDFAYpQgEGRAVIJkoxBU4iBU1QBU5JBU89KQYeLAQBBjYFQypCRQVMTSkFQQVPSzMFQkYpBi4wBAEGOwVGRCI2BTlCBUJHKQYeLAQBBkkFQU4yR0A3TBcFSwVCRikGLjAEAQZFBUlIREciBUhLBUZERTcFQkwyBjoxBAEGJwVPBU1MNwVPIwVQMgVEGgYYKiUgFDgLKBUQNBs2DAseEwQBBiYFKjYbBUIyBhcqDh4MFB4aCygVHSYUDBA0GzYMCx4TBAEGKAUqNhsFNjIGGSoOHiUgFB0yEjQdSg4UDB4aCygVHSYUDBA0GzYMCx4TBAEGPQVOJQVDQ0cqBUZNBU4YBVFQSgVMKTUGPSclIBQ7GzwOPAsoFSBLFAwQNBs2DAseEwQBBjwFTyIFTxtODgY8Jw4eJSAUQxsiHg48CygVHSYUDCBLFAwQNBs2DAseEwQBBj4FQy0GPioOHiUgFEMbIRY4IU4SGBAiHg48CygVHSYUDBAiTRYONBs2DAseEwQBBkMFTA8FT0szBU4WBUwaBiMwMSolGiAUJzoUDB0LKBUhTwseEwQBBj8FUEoaBUtPMAU+RkRMOwVNNE0NBUJMRj8GTykyKBEPHAEbFh00BgExFjA1UDQGARQWGgYBFjpIRRMbHxcfSQsPSh8iSkAXQT4gCwgBTDQGARgWLRsVBgEdRDZFHCISIzoYHgQCAQQtAzguAzU2RTcEJwYgBUIFTiMFRRIFUTsFUVBHUQU2SyAGEwEGOwVIJD4FRzgGKAEGPAVGPzEFRUQhBUMaBUdRBiYBBjsFQUMFR1AGIgEGQQU+SCJKFkkFRkU/BVA9LE4yBTAFQzhCTE4YBUdFBVAhBiUBBhsFL0pENAVOIQYRAQY7BUdGFQVENwYVAQZJBUw2BUpBBUMUBioCAQQpA0Q+A0hFJQQxBiYFKgYVAQYiBSoGOAEGFgVGBUQGEAIBQigbASUaGwEvAR8+QUkBNT8iSQQCAQRGA0xLMANJRjsEIwYoBTwFTjdJJAVDQlAFSUc9BiYBBj8FSSkFSlApBhICAQROA04DSkUqA0hNGANJFQM/BEoGQgVMKQVNUCkFKAVPTUxHBVAxBhIBBksFLk42BT8FR0U5BhMCAQQYAz9LPx4DTiYDTgNFPk0nBCkGSwVLSkBEBU5LPUQFTlEoBT8FR01MGEZKRQUOBQlKUDBLNhkjDhokDjJPBT8sIB8fCiklKgVNEi4HBSNEBRgmCQYjKjcsAQZRBS8FCVA+HD8OCQVNRgkqQB4lJycLCRo6NTY5LwoFJjdQQ1AcFRUXFxcXCQYqM1BOAQY/BU9NLwUNSVAJBhBLJAEGOgVJTwVNSSAGPSo+BAEGJwVLGAU+KkxHRQVLF0tKEU1MBVFLSwU4QkFEBiQBBk0FS0BJJQYsAgEENANDBFAhAS42AgEEPgNGSyEDOQQjMCtCIgkmAQY1BUlLH0kvTSAFSiEGGwEGJgVHPQVNUBlKHwYRAQZRBUwwBUxMGQVCPi4FTh8GEwIBBEcEPxMrARUVBAEyJwQBERMEAgEWZGFydDphc3luYy9zdHJlYW0uZGFydDhvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvYXN5bmMvc3RyZWFtX2NvbnRyb2xsZXIuZGFydMAAf68vLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmFzeW5jOwoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBDb250cm9sbGVyIGZvciBjcmVhdGluZyBhbmQgYWRkaW5nIGV2ZW50cyB0byBhIHN0cmVhbS4KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLyoqCiAqIFR5cGUgb2YgYSBzdHJlYW0gY29udHJvbGxlcidzIGBvbkxpc3RlbmAsIGBvblBhdXNlYCBhbmQgYG9uUmVzdW1lYCBjYWxsYmFja3MuCiAqLwp0eXBlZGVmIHZvaWQgQ29udHJvbGxlckNhbGxiYWNrKCk7CgovKioKICogVHlwZSBvZiBzdHJlYW0gY29udHJvbGxlciBgb25DYW5jZWxgIGNhbGxiYWNrcy4KICoKICogVGhlIGNhbGxiYWNrIG1heSByZXR1cm4gZWl0aGVyIGB2b2lkYCBvciBhIGZ1dHVyZS4KICovCnR5cGVkZWYgQ29udHJvbGxlckNhbmNlbENhbGxiYWNrKCk7CgovKioKICogQSBjb250cm9sbGVyIHdpdGggdGhlIHN0cmVhbSBpdCBjb250cm9scy4KICoKICogVGhpcyBjb250cm9sbGVyIGFsbG93cyBzZW5kaW5nIGRhdGEsIGVycm9yIGFuZCBkb25lIGV2ZW50cyBvbgogKiBpdHMgW3N0cmVhbV0uCiAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgc2ltcGxlIHN0cmVhbSB0aGF0IG90aGVycwogKiBjYW4gbGlzdGVuIG9uLCBhbmQgdG8gcHVzaCBldmVudHMgdG8gdGhhdCBzdHJlYW0uCiAqCiAqIEl0J3MgcG9zc2libGUgdG8gY2hlY2sgd2hldGhlciB0aGUgc3RyZWFtIGlzIHBhdXNlZCBvciBub3QsIGFuZCB3aGV0aGVyCiAqIGl0IGhhcyBzdWJzY3JpYmVycyBvciBub3QsIGFzIHdlbGwgYXMgZ2V0dGluZyBhIGNhbGxiYWNrIHdoZW4gZWl0aGVyIG9mCiAqIHRoZXNlIGNoYW5nZS4KICovCmFic3RyYWN0IGNsYXNzIFN0cmVhbUNvbnRyb2xsZXI8VD4gaW1wbGVtZW50cyBTdHJlYW1TaW5rPFQ+IHsKICAvKiogVGhlIHN0cmVhbSB0aGF0IHRoaXMgY29udHJvbGxlciBpcyBjb250cm9sbGluZy4gKi8KICBTdHJlYW08VD4gZ2V0IHN0cmVhbTsKCiAgLyoqCiAgICogQSBjb250cm9sbGVyIHdpdGggYSBbc3RyZWFtXSB0aGF0IHN1cHBvcnRzIG9ubHkgb25lIHNpbmdsZSBzdWJzY3JpYmVyLgogICAqCiAgICogSWYgW3N5bmNdIGlzIHRydWUsIHRoZSByZXR1cm5lZCBzdHJlYW0gY29udHJvbGxlciBpcyBhCiAgICogW1N5bmNocm9ub3VzU3RyZWFtQ29udHJvbGxlcl0sIGFuZCBtdXN0IGJlIHVzZWQgd2l0aCB0aGUgY2FyZQogICAqIGFuZCBhdHRlbnRpb24gbmVjZXNzYXJ5IHRvIG5vdCBicmVhayB0aGUgW1N0cmVhbV0gY29udHJhY3QuIElmIGluIGRvdWJ0LAogICAqIHVzZSB0aGUgbm9uLXN5bmMgdmVyc2lvbi4KICAgKgogICAqIFVzaW5nIGFuIGFzeW5jaHJvbm91cyBjb250cm9sbGVyIHdpbGwgbmV2ZXIgZ2l2ZSB0aGUgd3JvbmcKICAgKiBiZWhhdmlvciwgYnV0IHVzaW5nIGEgc3luY2hyb25vdXMgY29udHJvbGxlciBpbmNvcnJlY3RseSBjYW4gY2F1c2UKICAgKiBvdGhlcndpc2UgY29ycmVjdCBwcm9ncmFtcyB0byBicmVhay4KICAgKgogICAqIEEgc3luY2hyb25vdXMgY29udHJvbGxlciBpcyBvbmx5IGludGVuZGVkIGZvciBvcHRpbWl6aW5nIGV2ZW50CiAgICogcHJvcGFnYXRpb24gd2hlbiBvbmUgYXN5bmNocm9ub3VzIGV2ZW50IGltbWVkaWF0ZWx5IHRyaWdnZXJzIGFub3RoZXIuCiAgICogSXQgc2hvdWxkIG5vdCBiZSB1c2VkIHVubGVzcyB0aGUgY2FsbHMgdG8gW2FkZF0gb3IgW2FkZEVycm9yXQogICAqIGFyZSBndWFyYW50ZWVkIHRvIG9jY3VyIGluIHBsYWNlcyB3aGVyZSBpdCB3b24ndCBicmVhayBgU3RyZWFtYCBpbnZhcmlhbnRzLgogICAqCiAgICogVXNlIHN5bmNocm9ub3VzIGNvbnRyb2xsZXJzIG9ubHkgdG8gZm9yd2FyZCAocG90ZW50aWFsbHkgdHJhbnNmb3JtZWQpCiAgICogZXZlbnRzIGZyb20gYW5vdGhlciBzdHJlYW0gb3IgYSBmdXR1cmUuCiAgICoKICAgKiBBIFN0cmVhbSBzaG91bGQgYmUgaW5lcnQgdW50aWwgYSBzdWJzY3JpYmVyIHN0YXJ0cyBsaXN0ZW5pbmcgb24gaXQgKHVzaW5nCiAgICogdGhlIFtvbkxpc3Rlbl0gY2FsbGJhY2sgdG8gc3RhcnQgcHJvZHVjaW5nIGV2ZW50cykuIFN0cmVhbXMgc2hvdWxkIG5vdAogICAqIGxlYWsgcmVzb3VyY2VzIChsaWtlIHdlYnNvY2tldHMpIHdoZW4gbm8gdXNlciBldmVyIGxpc3RlbnMgb24gdGhlIHN0cmVhbS4KICAgKgogICAqIFRoZSBjb250cm9sbGVyIGJ1ZmZlcnMgYWxsIGluY29taW5nIGV2ZW50cyB1bnRpbCBhIHN1YnNjcmliZXIgaXMKICAgKiByZWdpc3RlcmVkLCBidXQgdGhpcyBmZWF0dXJlIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gcmFyZSBjaXJjdW1zdGFuY2VzLgogICAqCiAgICogVGhlIFtvblBhdXNlXSBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtIGJlY29tZXMKICAgKiBwYXVzZWQuIFtvblJlc3VtZV0gaXMgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSByZXN1bWVkLgogICAqCiAgICogVGhlIFtvbkxpc3Rlbl0gY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbQogICAqIHJlY2VpdmVzIGl0cyBsaXN0ZW5lciBhbmQgW29uQ2FuY2VsXSB3aGVuIHRoZSBsaXN0ZW5lciBlbmRzCiAgICogaXRzIHN1YnNjcmlwdGlvbi4gSWYgW29uQ2FuY2VsXSBuZWVkcyB0byBwZXJmb3JtIGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24sCiAgICogW29uQ2FuY2VsXSBzaG91bGQgcmV0dXJuIGEgZnV0dXJlIHRoYXQgY29tcGxldGVzIHdoZW4gdGhlIGNhbmNlbCBvcGVyYXRpb24KICAgKiBpcyBkb25lLgogICAqCiAgICogSWYgdGhlIHN0cmVhbSBpcyBjYW5jZWxlZCBiZWZvcmUgdGhlIGNvbnRyb2xsZXIgbmVlZHMgbmV3IGRhdGEgdGhlCiAgICogW29uUmVzdW1lXSBjYWxsIG1pZ2h0IG5vdCBiZSBleGVjdXRlZC4KICAgKi8KICBmYWN0b3J5IFN0cmVhbUNvbnRyb2xsZXIoCiAgICAgIHt2b2lkIG9uTGlzdGVuKCksCiAgICAgIHZvaWQgb25QYXVzZSgpLAogICAgICB2b2lkIG9uUmVzdW1lKCksCiAgICAgIG9uQ2FuY2VsKCksCiAgICAgIGJvb2wgc3luYzogZmFsc2V9KSB7CiAgICByZXR1cm4gc3luYwogICAgICAgID8gbmV3IF9TeW5jU3RyZWFtQ29udHJvbGxlcjxUPihvbkxpc3Rlbiwgb25QYXVzZSwgb25SZXN1bWUsIG9uQ2FuY2VsKQogICAgICAgIDogbmV3IF9Bc3luY1N0cmVhbUNvbnRyb2xsZXI8VD4ob25MaXN0ZW4sIG9uUGF1c2UsIG9uUmVzdW1lLCBvbkNhbmNlbCk7CiAgfQoKICAvKioKICAgKiBBIGNvbnRyb2xsZXIgd2hlcmUgW3N0cmVhbV0gY2FuIGJlIGxpc3RlbmVkIHRvIG1vcmUgdGhhbiBvbmNlLgogICAqCiAgICogVGhlIFtTdHJlYW1dIHJldHVybmVkIGJ5IFtzdHJlYW1dIGlzIGEgYnJvYWRjYXN0IHN0cmVhbS4KICAgKiBJdCBjYW4gYmUgbGlzdGVuZWQgdG8gbW9yZSB0aGFuIG9uY2UuCiAgICoKICAgKiBBIFN0cmVhbSBzaG91bGQgYmUgaW5lcnQgdW50aWwgYSBzdWJzY3JpYmVyIHN0YXJ0cyBsaXN0ZW5pbmcgb24gaXQgKHVzaW5nCiAgICogdGhlIFtvbkxpc3Rlbl0gY2FsbGJhY2sgdG8gc3RhcnQgcHJvZHVjaW5nIGV2ZW50cykuIFN0cmVhbXMgc2hvdWxkIG5vdAogICAqIGxlYWsgcmVzb3VyY2VzIChsaWtlIHdlYnNvY2tldHMpIHdoZW4gbm8gdXNlciBldmVyIGxpc3RlbnMgb24gdGhlIHN0cmVhbS4KICAgKgogICAqIEJyb2FkY2FzdCBzdHJlYW1zIGRvIG5vdCBidWZmZXIgZXZlbnRzIHdoZW4gdGhlcmUgaXMgbm8gbGlzdGVuZXIuCiAgICoKICAgKiBUaGUgY29udHJvbGxlciBkaXN0cmlidXRlcyBhbnkgZXZlbnRzIHRvIGFsbCBjdXJyZW50bHkgc3Vic2NyaWJlZAogICAqIGxpc3RlbmVycyBhdCB0aGUgdGltZSB3aGVuIFthZGRdLCBbYWRkRXJyb3JdIG9yIFtjbG9zZV0gaXMgY2FsbGVkLgogICAqIEl0IGlzIG5vdCBhbGxvd2VkIHRvIGNhbGwgYGFkZGAsIGBhZGRFcnJvcmAsIG9yIGBjbG9zZWAgYmVmb3JlIGEgcHJldmlvdXMKICAgKiBjYWxsIGhhcyByZXR1cm5lZC4gVGhlIGNvbnRyb2xsZXIgZG9lcyBub3QgaGF2ZSBhbnkgaW50ZXJuYWwgcXVldWUgb2YKICAgKiBldmVudHMsIGFuZCBpZiB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzIGF0IHRoZSB0aW1lIHRoZSBldmVudCBpcyBhZGRlZCwKICAgKiBpdCB3aWxsIGp1c3QgYmUgZHJvcHBlZCwgb3IsIGlmIGl0IGlzIGFuIGVycm9yLCBiZSByZXBvcnRlZCBhcyB1bmNhdWdodC4KICAgKgogICAqIEVhY2ggbGlzdGVuZXIgc3Vic2NyaXB0aW9uIGlzIGhhbmRsZWQgaW5kZXBlbmRlbnRseSwKICAgKiBhbmQgaWYgb25lIHBhdXNlcywgb25seSB0aGUgcGF1c2luZyBsaXN0ZW5lciBpcyBhZmZlY3RlZC4KICAgKiBBIHBhdXNlZCBsaXN0ZW5lciB3aWxsIGJ1ZmZlciBldmVudHMgaW50ZXJuYWxseSB1bnRpbCB1bnBhdXNlZCBvciBjYW5jZWxlZC4KICAgKgogICAqIElmIFtzeW5jXSBpcyB0cnVlLCBldmVudHMgbWF5IGJlIGZpcmVkIGRpcmVjdGx5IGJ5IHRoZSBzdHJlYW0ncwogICAqIHN1YnNjcmlwdGlvbnMgZHVyaW5nIGFuIFthZGRdLCBbYWRkRXJyb3JdIG9yIFtjbG9zZV0gY2FsbC4KICAgKiBUaGUgcmV0dXJuZWQgc3RyZWFtIGNvbnRyb2xsZXIgaXMgYSBbU3luY2hyb25vdXNTdHJlYW1Db250cm9sbGVyXSwKICAgKiBhbmQgbXVzdCBiZSB1c2VkIHdpdGggdGhlIGNhcmUgYW5kIGF0dGVudGlvbiBuZWNlc3NhcnkgdG8gbm90IGJyZWFrCiAgICogdGhlIFtTdHJlYW1dIGNvbnRyYWN0LgogICAqIFNlZSBbQ29tcGxldGVyLnN5bmNdIGZvciBzb21lIGV4cGxhbmF0aW9ucyBvbiB3aGVuIGEgc3luY2hyb25vdXMKICAgKiBkaXNwYXRjaGluZyBjYW4gYmUgdXNlZC4KICAgKiBJZiBpbiBkb3VidCwga2VlcCB0aGUgY29udHJvbGxlciBub24tc3luYy4KICAgKgogICAqIElmIFtzeW5jXSBpcyBmYWxzZSwgdGhlIGV2ZW50IHdpbGwgYWx3YXlzIGJlIGZpcmVkIGF0IGEgbGF0ZXIgdGltZSwKICAgKiBhZnRlciB0aGUgY29kZSBhZGRpbmcgdGhlIGV2ZW50IGhhcyBjb21wbGV0ZWQuCiAgICogSW4gdGhhdCBjYXNlLCBubyBndWFyYW50ZWVzIGFyZSBnaXZlbiB3aXRoIHJlZ2FyZCB0byB3aGVuCiAgICogbXVsdGlwbGUgbGlzdGVuZXJzIGdldCB0aGUgZXZlbnRzLCBleGNlcHQgdGhhdCBlYWNoIGxpc3RlbmVyIHdpbGwgZ2V0CiAgICogYWxsIGV2ZW50cyBpbiB0aGUgY29ycmVjdCBvcmRlci4gRWFjaCBzdWJzY3JpcHRpb24gaGFuZGxlcyB0aGUgZXZlbnRzCiAgICogaW5kaXZpZHVhbGx5LgogICAqIElmIHR3byBldmVudHMgYXJlIHNlbnQgb24gYW4gYXN5bmMgY29udHJvbGxlciB3aXRoIHR3byBsaXN0ZW5lcnMsCiAgICogb25lIG9mIHRoZSBsaXN0ZW5lcnMgbWF5IGdldCBib3RoIGV2ZW50cwogICAqIGJlZm9yZSB0aGUgb3RoZXIgbGlzdGVuZXIgZ2V0cyBhbnkuCiAgICogQSBsaXN0ZW5lciBtdXN0IGJlIHN1YnNjcmliZWQgYm90aCB3aGVuIHRoZSBldmVudCBpcyBpbml0aWF0ZWQKICAgKiAodGhhdCBpcywgd2hlbiBbYWRkXSBpcyBjYWxsZWQpCiAgICogYW5kIHdoZW4gdGhlIGV2ZW50IGlzIGxhdGVyIGRlbGl2ZXJlZCwKICAgKiBpbiBvcmRlciB0byByZWNlaXZlIHRoZSBldmVudC4KICAgKgogICAqIFRoZSBbb25MaXN0ZW5dIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIHRoZSBmaXJzdCBsaXN0ZW5lciBpcyBzdWJzY3JpYmVkLAogICAqIGFuZCB0aGUgW29uQ2FuY2VsXSBpcyBjYWxsZWQgd2hlbiB0aGVyZSBhcmUgbm8gbG9uZ2VyIGFueSBhY3RpdmUgbGlzdGVuZXJzLgogICAqIElmIGEgbGlzdGVuZXIgaXMgYWRkZWQgYWdhaW4gbGF0ZXIsIGFmdGVyIHRoZSBbb25DYW5jZWxdIHdhcyBjYWxsZWQsCiAgICogdGhlIFtvbkxpc3Rlbl0gd2lsbCBiZSBjYWxsZWQgYWdhaW4uCiAgICovCiAgZmFjdG9yeSBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdCgKICAgICAge3ZvaWQgb25MaXN0ZW4oKSwgdm9pZCBvbkNhbmNlbCgpLCBib29sIHN5bmM6IGZhbHNlfSkgewogICAgcmV0dXJuIHN5bmMKICAgICAgICA/IG5ldyBfU3luY0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXI8VD4ob25MaXN0ZW4sIG9uQ2FuY2VsKQogICAgICAgIDogbmV3IF9Bc3luY0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXI8VD4ob25MaXN0ZW4sIG9uQ2FuY2VsKTsKICB9CgogIC8qKgogICAqIFRoZSBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtIGlzIGxpc3RlbmVkIHRvLgogICAqCiAgICogTWF5IGJlIHNldCB0byBgbnVsbGAsIGluIHdoaWNoIGNhc2Ugbm8gY2FsbGJhY2sgd2lsbCBoYXBwZW4uCiAgICovCiAgQ29udHJvbGxlckNhbGxiYWNrIGdldCBvbkxpc3RlbjsKCiAgdm9pZCBzZXQgb25MaXN0ZW4odm9pZCBvbkxpc3RlbkhhbmRsZXIoKSk7CgogIC8qKgogICAqIFRoZSBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtIGlzIHBhdXNlZC4KICAgKgogICAqIE1heSBiZSBzZXQgdG8gYG51bGxgLCBpbiB3aGljaCBjYXNlIG5vIGNhbGxiYWNrIHdpbGwgaGFwcGVuLgogICAqCiAgICogUGF1c2UgcmVsYXRlZCBjYWxsYmFja3MgYXJlIG5vdCBzdXBwb3J0ZWQgb24gYnJvYWRjYXN0IHN0cmVhbSBjb250cm9sbGVycy4KICAgKi8KICBDb250cm9sbGVyQ2FsbGJhY2sgZ2V0IG9uUGF1c2U7CgogIHZvaWQgc2V0IG9uUGF1c2Uodm9pZCBvblBhdXNlSGFuZGxlcigpKTsKCiAgLyoqCiAgICogVGhlIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCB3aGVuIHRoZSBzdHJlYW0gaXMgcmVzdW1lZC4KICAgKgogICAqIE1heSBiZSBzZXQgdG8gYG51bGxgLCBpbiB3aGljaCBjYXNlIG5vIGNhbGxiYWNrIHdpbGwgaGFwcGVuLgogICAqCiAgICogUGF1c2UgcmVsYXRlZCBjYWxsYmFja3MgYXJlIG5vdCBzdXBwb3J0ZWQgb24gYnJvYWRjYXN0IHN0cmVhbSBjb250cm9sbGVycy4KICAgKi8KICBDb250cm9sbGVyQ2FsbGJhY2sgZ2V0IG9uUmVzdW1lOwoKICB2b2lkIHNldCBvblJlc3VtZSh2b2lkIG9uUmVzdW1lSGFuZGxlcigpKTsKCiAgLyoqCiAgICogVGhlIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCB3aGVuIHRoZSBzdHJlYW0gaXMgY2FuY2VsZWQuCiAgICoKICAgKiBNYXkgYmUgc2V0IHRvIGBudWxsYCwgaW4gd2hpY2ggY2FzZSBubyBjYWxsYmFjayB3aWxsIGhhcHBlbi4KICAgKi8KICBDb250cm9sbGVyQ2FuY2VsQ2FsbGJhY2sgZ2V0IG9uQ2FuY2VsOwoKICB2b2lkIHNldCBvbkNhbmNlbChvbkNhbmNlbEhhbmRsZXIoKSk7CgogIC8qKgogICAqIFJldHVybnMgYSB2aWV3IG9mIHRoaXMgb2JqZWN0IHRoYXQgb25seSBleHBvc2VzIHRoZSBbU3RyZWFtU2lua10gaW50ZXJmYWNlLgogICAqLwogIFN0cmVhbVNpbms8VD4gZ2V0IHNpbms7CgogIC8qKgogICAqIFdoZXRoZXIgdGhlIHN0cmVhbSBjb250cm9sbGVyIGlzIGNsb3NlZCBmb3IgYWRkaW5nIG1vcmUgZXZlbnRzLgogICAqCiAgICogVGhlIGNvbnRyb2xsZXIgYmVjb21lcyBjbG9zZWQgYnkgY2FsbGluZyB0aGUgW2Nsb3NlXSBtZXRob2QuCiAgICogTmV3IGV2ZW50cyBjYW5ub3QgYmUgYWRkZWQsIGJ5IGNhbGxpbmcgW2FkZF0gb3IgW2FkZEVycm9yXSwKICAgKiB0byBhIGNsb3NlZCBjb250cm9sbGVyLgogICAqCiAgICogSWYgdGhlIGNvbnRyb2xsZXIgaXMgY2xvc2VkLAogICAqIHRoZSAiZG9uZSIgZXZlbnQgbWlnaHQgbm90IGhhdmUgYmVlbiBkZWxpdmVyZWQgeWV0LAogICAqIGJ1dCBpdCBoYXMgYmVlbiBzY2hlZHVsZWQsIGFuZCBpdCBpcyB0b28gbGF0ZSB0byBhZGQgbW9yZSBldmVudHMuCiAgICovCiAgYm9vbCBnZXQgaXNDbG9zZWQ7CgogIC8qKgogICAqIFdoZXRoZXIgdGhlIHN1YnNjcmlwdGlvbiB3b3VsZCBuZWVkIHRvIGJ1ZmZlciBldmVudHMuCiAgICoKICAgKiBUaGlzIGlzIHRoZSBjYXNlIGlmIHRoZSBjb250cm9sbGVyJ3Mgc3RyZWFtIGhhcyBhIGxpc3RlbmVyIGFuZCBpdCBpcwogICAqIHBhdXNlZCwgb3IgaWYgaXQgaGFzIG5vdCByZWNlaXZlZCBhIGxpc3RlbmVyIHlldC4gSW4gdGhhdCBjYXNlLCB0aGUKICAgKiBjb250cm9sbGVyIGlzIGNvbnNpZGVyZWQgcGF1c2VkIGFzIHdlbGwuCiAgICoKICAgKiBBIGJyb2FkY2FzdCBzdHJlYW0gY29udHJvbGxlciBpcyBuZXZlciBjb25zaWRlcmVkIHBhdXNlZC4gSXQgYWx3YXlzCiAgICogZm9yd2FyZHMgaXRzIGV2ZW50cyB0byBhbGwgdW5jYW5jZWxlZCBzdWJzY3JpcHRpb25zLCBpZiBhbnksCiAgICogYW5kIGxldCB0aGUgc3Vic2NyaXB0aW9ucyBoYW5kbGUgdGhlaXIgb3duIHBhdXNpbmcgYW5kIGJ1ZmZlcmluZy4KICAgKi8KICBib29sIGdldCBpc1BhdXNlZDsKCiAgLyoqIFdoZXRoZXIgdGhlcmUgaXMgYSBzdWJzY3JpYmVyIG9uIHRoZSBbU3RyZWFtXS4gKi8KICBib29sIGdldCBoYXNMaXN0ZW5lcjsKCiAgLyoqCiAgICogU2VuZHMgYSBkYXRhIFtldmVudF0uCiAgICoKICAgKiBMaXN0ZW5lcnMgcmVjZWl2ZSB0aGlzIGV2ZW50IGluIGEgbGF0ZXIgbWljcm90YXNrLgogICAqCiAgICogTm90ZSB0aGF0IGEgc3luY2hyb25vdXMgY29udHJvbGxlciAoY3JlYXRlZCBieSBwYXNzaW5nIHRydWUgdG8gdGhlIGBzeW5jYAogICAqIHBhcmFtZXRlciBvZiB0aGUgYFN0cmVhbUNvbnRyb2xsZXJgIGNvbnN0cnVjdG9yKSBkZWxpdmVycyBldmVudHMKICAgKiBpbW1lZGlhdGVseS4gU2luY2UgdGhpcyBiZWhhdmlvciB2aW9sYXRlcyB0aGUgY29udHJhY3QgbWVudGlvbmVkIGhlcmUsCiAgICogc3luY2hyb25vdXMgY29udHJvbGxlcnMgc2hvdWxkIG9ubHkgYmUgdXNlZCBhcyBkZXNjcmliZWQgaW4gdGhlCiAgICogZG9jdW1lbnRhdGlvbiB0byBlbnN1cmUgdGhhdCB0aGUgZGVsaXZlcmVkIGV2ZW50cyBhbHdheXMgKmFwcGVhciogYXMgaWYKICAgKiB0aGV5IHdlcmUgZGVsaXZlcmVkIGluIGEgc2VwYXJhdGUgbWljcm90YXNrLgogICAqLwogIHZvaWQgYWRkKFQgZXZlbnQpOwoKICAvKioKICAgKiBTZW5kcyBvciBlbnF1ZXVlcyBhbiBlcnJvciBldmVudC4KICAgKgogICAqIElmIFtlcnJvcl0gaXMgYG51bGxgLCBpdCBpcyByZXBsYWNlZCBieSBhIFtOdWxsVGhyb3duRXJyb3JdLgogICAqCiAgICogTGlzdGVuZXJzIHJlY2VpdmUgdGhpcyBldmVudCBhdCBhIGxhdGVyIG1pY3JvdGFzay4gVGhpcyBiZWhhdmlvciBjYW4gYmUKICAgKiBvdmVycmlkZGVuIGJ5IHVzaW5nIGBzeW5jYCBjb250cm9sbGVycy4gTm90ZSwgaG93ZXZlciwgdGhhdCBzeW5jCiAgICogY29udHJvbGxlcnMgaGF2ZSB0byBzYXRpc2Z5IHRoZSBwcmVjb25kaXRpb25zIG1lbnRpb25lZCBpbiB0aGUKICAgKiBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb25zdHJ1Y3RvcnMuCiAgICovCiAgdm9pZCBhZGRFcnJvcihPYmplY3QgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKTsKCiAgLyoqCiAgICogQ2xvc2VzIHRoZSBzdHJlYW0uCiAgICoKICAgKiBMaXN0ZW5lcnMgcmVjZWl2ZSB0aGUgZG9uZSBldmVudCBhdCBhIGxhdGVyIG1pY3JvdGFzay4gVGhpcyBiZWhhdmlvciBjYW4gYmUKICAgKiBvdmVycmlkZGVuIGJ5IHVzaW5nIGBzeW5jYCBjb250cm9sbGVycy4gTm90ZSwgaG93ZXZlciwgdGhhdCBzeW5jCiAgICogY29udHJvbGxlcnMgaGF2ZSB0byBzYXRpc2Z5IHRoZSBwcmVjb25kaXRpb25zIG1lbnRpb25lZCBpbiB0aGUKICAgKiBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb25zdHJ1Y3RvcnMuCiAgICovCiAgRnV0dXJlIGNsb3NlKCk7CgogIC8qKgogICAqIFJlY2VpdmVzIGV2ZW50cyBmcm9tIFtzb3VyY2VdIGFuZCBwdXRzIHRoZW0gaW50byB0aGlzIGNvbnRyb2xsZXIncyBzdHJlYW0uCiAgICoKICAgKiBSZXR1cm5zIGEgZnV0dXJlIHdoaWNoIGNvbXBsZXRlcyB3aGVuIHRoZSBzb3VyY2Ugc3RyZWFtIGlzIGRvbmUuCiAgICoKICAgKiBFdmVudHMgbXVzdCBub3QgYmUgYWRkZWQgZGlyZWN0bHkgdG8gdGhpcyBjb250cm9sbGVyIHVzaW5nIFthZGRdLAogICAqIFthZGRFcnJvcl0sIFtjbG9zZV0gb3IgW2FkZFN0cmVhbV0sIHVudGlsIHRoZSByZXR1cm5lZCBmdXR1cmUKICAgKiBpcyBjb21wbGV0ZS4KICAgKgogICAqIERhdGEgYW5kIGVycm9yIGV2ZW50cyBhcmUgZm9yd2FyZGVkIHRvIHRoaXMgY29udHJvbGxlcidzIHN0cmVhbS4gQSBkb25lCiAgICogZXZlbnQgb24gdGhlIHNvdXJjZSB3aWxsIGVuZCB0aGUgYGFkZFN0cmVhbWAgb3BlcmF0aW9uIGFuZCBjb21wbGV0ZSB0aGUKICAgKiByZXR1cm5lZCBmdXR1cmUuCiAgICoKICAgKiBJZiBbY2FuY2VsT25FcnJvcl0gaXMgdHJ1ZSwgb25seSB0aGUgZmlyc3QgZXJyb3Igb24gW3NvdXJjZV0gaXMKICAgKiBmb3J3YXJkZWQgdG8gdGhlIGNvbnRyb2xsZXIncyBzdHJlYW0sIGFuZCB0aGUgYGFkZFN0cmVhbWAgZW5kcwogICAqIGFmdGVyIHRoaXMuIElmIFtjYW5jZWxPbkVycm9yXSBpcyBmYWxzZSwgYWxsIGVycm9ycyBhcmUgZm9yd2FyZGVkCiAgICogYW5kIG9ubHkgYSBkb25lIGV2ZW50IHdpbGwgZW5kIHRoZSBgYWRkU3RyZWFtYC4KICAgKiBJZiBbY2FuY2VsT25FcnJvcl0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gZmFsc2UuCiAgICovCiAgRnV0dXJlIGFkZFN0cmVhbShTdHJlYW08VD4gc291cmNlLCB7Ym9vbCBjYW5jZWxPbkVycm9yfSk7Cn0KCi8qKgogKiBBIHN0cmVhbSBjb250cm9sbGVyIHRoYXQgZGVsaXZlcnMgaXRzIGV2ZW50cyBzeW5jaHJvbm91c2x5LgogKgogKiBBIHN5bmNocm9ub3VzIHN0cmVhbSBjb250cm9sbGVyIGlzIGludGVuZGVkIGZvciBjYXNlcyB3aGVyZQogKiBhbiBhbHJlYWR5IGFzeW5jaHJvbm91cyBldmVudCB0cmlnZ2VycyBhbiBldmVudCBvbiBhIHN0cmVhbS4KICoKICogSW5zdGVhZCBvZiBhZGRpbmcgdGhlIGV2ZW50IHRvIHRoZSBzdHJlYW0gaW4gYSBsYXRlciBtaWNyb3Rhc2ssCiAqIGNhdXNpbmcgZXh0cmEgbGF0ZW5jeSwgdGhlIGV2ZW50IGlzIGluc3RlYWQgZmlyZWQgaW1tZWRpYXRlbHkgYnkgdGhlCiAqIHN5bmNocm9ub3VzIHN0cmVhbSBjb250cm9sbGVyLCBhcyBpZiB0aGUgc3RyZWFtIGV2ZW50IHdhcwogKiB0aGUgY3VycmVudCBldmVudCBvciBtaWNyb3Rhc2suCiAqCiAqIFRoZSBzeW5jaHJvbm91cyBzdHJlYW0gY29udHJvbGxlciBjYW4gYmUgdXNlZCB0byBicmVhayB0aGUgY29udHJhY3QKICogb24gW1N0cmVhbV0sIGFuZCBpdCBtdXN0IGJlIHVzZWQgY2FyZWZ1bGx5IHRvIGF2b2lkIGRvaW5nIHNvLgogKgogKiBUaGUgb25seSBhZHZhbnRhZ2UgdG8gdXNpbmcgYSBbU3luY2hyb25vdXNTdHJlYW1Db250cm9sbGVyXSBvdmVyIGEKICogbm9ybWFsIFtTdHJlYW1Db250cm9sbGVyXSBpcyB0aGUgaW1wcm92ZWQgbGF0ZW5jeS4KICogT25seSB1c2UgdGhlIHN5bmNocm9ub3VzIHZlcnNpb24gaWYgdGhlIGltcHJvdmVtZW50IGlzIHNpZ25pZmljYW50LAogKiBhbmQgaWYgaXRzIHVzZSBpcyBzYWZlLiBPdGhlcndpc2UganVzdCB1c2UgYSBub3JtYWwgc3RyZWFtIGNvbnRyb2xsZXIsCiAqIHdoaWNoIHdpbGwgYWx3YXlzIGhhdmUgdGhlIGNvcnJlY3QgYmVoYXZpb3IgZm9yIGEgW1N0cmVhbV0sIGFuZCB3b24ndAogKiBhY2NpZGVudGFsbHkgYnJlYWsgb3RoZXIgY29kZS4KICoKICogQWRkaW5nIGV2ZW50cyB0byBhIHN5bmNocm9ub3VzIGNvbnRyb2xsZXIgc2hvdWxkIG9ubHkgaGFwcGVuIGFzIHRoZQogKiB2ZXJ5IGxhc3QgcGFydCBvZiB0aGUgaGFuZGxpbmcgb2YgdGhlIG9yaWdpbmFsIGV2ZW50LgogKiBBdCB0aGF0IHBvaW50LCBhZGRpbmcgYW4gZXZlbnQgdG8gdGhlIHN0cmVhbSBpcyBlcXVpdmFsZW50IHRvCiAqIHJldHVybmluZyB0byB0aGUgZXZlbnQgbG9vcCBhbmQgYWRkaW5nIHRoZSBldmVudCBpbiB0aGUgbmV4dCBtaWNyb3Rhc2suCiAqCiAqIEVhY2ggbGlzdGVuZXIgY2FsbGJhY2sgd2lsbCBiZSBydW4gYXMgaWYgaXQgd2FzIGEgdG9wLWxldmVsIGV2ZW50CiAqIG9yIG1pY3JvdGFzay4gVGhpcyBtZWFucyB0aGF0IGlmIGl0IHRocm93cywgdGhlIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYXMKICogdW5jYXVnaHQgYXMgc29vbiBhcyBwb3NzaWJsZS4KICogVGhpcyBpcyBvbmUgcmVhc29uIHRvIGFkZCB0aGUgZXZlbnQgYXMgdGhlIGxhc3QgdGhpbmcgaW4gdGhlIG9yaWdpbmFsIGV2ZW50CiAqIGhhbmRsZXIgLSBhbnkgYWN0aW9uIGRvbmUgYWZ0ZXIgYWRkaW5nIHRoZSBldmVudCB3aWxsIGRlbGF5IHRoZSByZXBvcnQgb2YKICogZXJyb3JzIGluIHRoZSBldmVudCBsaXN0ZW5lciBjYWxsYmFja3MuCiAqCiAqIElmIGFuIGV2ZW50IGlzIGFkZGVkIGluIGEgc2V0dGluZyB0aGF0IGlzbid0IGtub3duIHRvIGJlIGFub3RoZXIgZXZlbnQsCiAqIGl0IG1heSBjYXVzZSB0aGUgc3RyZWFtJ3MgbGlzdGVuZXIgdG8gZ2V0IHRoYXQgZXZlbnQgYmVmb3JlIHRoZSBsaXN0ZW5lcgogKiBpcyByZWFkeSB0byBoYW5kbGUgaXQuIFdlIHByb21pc2UgdGhhdCBhZnRlciBjYWxsaW5nIFtTdHJlYW0ubGlzdGVuXSwKICogeW91IHdvbid0IGdldCBhbnkgZXZlbnRzIHVudGlsIHRoZSBjb2RlIGRvaW5nIHRoZSBsaXN0ZW4gaGFzIGNvbXBsZXRlZC4KICogQ2FsbGluZyBbYWRkXSBpbiByZXNwb25zZSB0byBhIGZ1bmN0aW9uIGNhbGwgb2YgdW5rbm93biBvcmlnaW4gbWF5IGJyZWFrCiAqIHRoYXQgcHJvbWlzZS4KICoKICogQW4gW29uTGlzdGVuXSBjYWxsYmFjayBmcm9tIHRoZSBjb250cm9sbGVyIGlzICpub3QqIGFuIGFzeW5jaHJvbm91cyBldmVudCwKICogYW5kIGFkZGluZyBldmVudHMgdG8gdGhlIGNvbnRyb2xsZXIgaW4gdGhlIGBvbkxpc3RlbmAgY2FsbGJhY2sgaXMgYWx3YXlzCiAqIHdyb25nLiBUaGUgZXZlbnRzIHdpbGwgYmUgZGVsaXZlcmVkIGJlZm9yZSB0aGUgbGlzdGVuZXIgaGFzIGV2ZW4gcmVjZWl2ZWQKICogdGhlIHN1YnNjcmlwdGlvbiB5ZXQuCiAqCiAqIFRoZSBzeW5jaHJvbm91cyBicm9hZGNhc3Qgc3RyZWFtIGNvbnRyb2xsZXIgYWxzbyBoYXMgYSByZXN0cmljdGlvbnMgdGhhdCBhCiAqIG5vcm1hbCBzdHJlYW0gY29udHJvbGxlciBkb2VzIG5vdDoKICogVGhlIFthZGRdLCBbYWRkRXJyb3JdLCBbY2xvc2VdIGFuZCBbYWRkU3RyZWFtXSBtZXRob2RzICptdXN0IG5vdCogYmUKICogY2FsbGVkIHdoaWxlIGFuIGV2ZW50IGlzIGJlaW5nIGRlbGl2ZXJlZC4KICogVGhhdCBpcywgaWYgYSBjYWxsYmFjayBvbiBhIHN1YnNjcmlwdGlvbiBvbiB0aGUgY29udHJvbGxlcidzIHN0cmVhbSBjYXVzZXMKICogYSBjYWxsIHRvIGFueSBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlLCB0aGUgY2FsbCB3aWxsIGZhaWwuCiAqIEEgYnJvYWRjYXN0IHN0cmVhbSBtYXkgaGF2ZSBtb3JlIHRoYW4gb25lIGxpc3RlbmVyLCBhbmQgaWYgYW4KICogZXZlbnQgaXMgYWRkZWQgc3luY2hyb25vdXNseSB3aGlsZSBhbm90aGVyIGlzIGJlaW5nIGFsc28gaW4gdGhlIHByb2Nlc3MKICogb2YgYmVpbmcgYWRkZWQsIHRoZSBsYXR0ZXIgZXZlbnQgbWlnaHQgcmVhY2ggc29tZSBsaXN0ZW5lcnMgYmVmb3JlCiAqIHRoZSBmb3JtZXIuIFRvIHByZXZlbnQgdGhhdCwgYW4gZXZlbnQgY2Fubm90IGJlIGFkZGVkIHdoaWxlIGEgcHJldmlvdXMKICogZXZlbnQgaXMgYmVpbmcgZmlyZWQuCiAqIFRoaXMgZ3VhcmFudGVlcyB0aGF0IGFuIGV2ZW50IGlzIGZ1bGx5IGRlbGl2ZXJlZCB3aGVuIHRoZQogKiBmaXJzdCBbYWRkXSwgW2FkZEVycm9yXSBvciBbY2xvc2VdIHJldHVybnMsCiAqIGFuZCBmdXJ0aGVyIGV2ZW50cyB3aWxsIGJlIGRlbGl2ZXJlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4KICoKICogVGhpcyBzdGlsbCBvbmx5IGd1YXJhbnRlZXMgdGhhdCB0aGUgZXZlbnQgaXMgZGVsaXZlcmVkIHRvIHRoZSBzdWJzY3JpcHRpb24uCiAqIElmIHRoZSBzdWJzY3JpcHRpb24gaXMgcGF1c2VkLCB0aGUgYWN0dWFsIGNhbGxiYWNrIG1heSBzdGlsbCBoYXBwZW4gbGF0ZXIsCiAqIGFuZCB0aGUgZXZlbnQgd2lsbCBpbnN0ZWFkIGJlIGJ1ZmZlcmVkIGJ5IHRoZSBzdWJzY3JpcHRpb24uCiAqIEJhcnJpbmcgcGF1c2luZywgYW5kIHRoZSBmb2xsb3dpbmcgYnVmZmVyZWQgZXZlbnRzIHRoYXQgaGF2ZW4ndCBiZWVuCiAqIGRlbGl2ZXJlZCB5ZXQsIGNhbGxiYWNrcyB3aWxsIGJlIGNhbGxlZCBzeW5jaHJvbm91c2x5IHdoZW4gYW4gZXZlbnQgaXMgYWRkZWQuCiAqCiAqIEFkZGluZyBhbiBldmVudCB0byBhIHN5bmNocm9ub3VzIG5vbi1icm9hZGNhc3Qgc3RyZWFtIGNvbnRyb2xsZXIgd2hpbGUKICogYW5vdGhlciBldmVudCBpcyBpbiBwcm9ncmVzcyBtYXkgY2F1c2UgdGhlIHNlY29uZCBldmVudCB0byBiZSBkZWxheWVkCiAqIGFuZCBub3QgYmUgZGVsaXZlcmVkIHN5bmNocm9ub3VzbHksIGFuZCB1bnRpbCB0aGF0IGV2ZW50IGlzIGRlbGl2ZXJlZCwKICogdGhlIGNvbnRyb2xsZXIgd2lsbCBub3QgYWN0IHN5bmNocm9ub3VzbHkuCiAqLwphYnN0cmFjdCBjbGFzcyBTeW5jaHJvbm91c1N0cmVhbUNvbnRyb2xsZXI8VD4gaW1wbGVtZW50cyBTdHJlYW1Db250cm9sbGVyPFQ+IHsKICAvKioKICAgKiBBZGRzIGV2ZW50IHRvIHRoZSBjb250cm9sbGVyJ3Mgc3RyZWFtLgogICAqCiAgICogQXMgW1N0cmVhbUNvbnRyb2xsZXIuYWRkXSwgYnV0IG11c3Qgbm90IGJlIGNhbGxlZCB3aGlsZSBhbiBldmVudCBpcwogICAqIGJlaW5nIGFkZGVkIGJ5IFthZGRdLCBbYWRkRXJyb3JdIG9yIFtjbG9zZV0uCiAgICovCiAgdm9pZCBhZGQoVCBkYXRhKTsKCiAgLyoqCiAgICogQWRkcyBlcnJvciB0byB0aGUgY29udHJvbGxlcidzIHN0cmVhbS4KICAgKgogICAqIEFzIFtTdHJlYW1Db250cm9sbGVyLmFkZEVycm9yXSwgYnV0IG11c3Qgbm90IGJlIGNhbGxlZCB3aGlsZSBhbiBldmVudCBpcwogICAqIGJlaW5nIGFkZGVkIGJ5IFthZGRdLCBbYWRkRXJyb3JdIG9yIFtjbG9zZV0uCiAgICovCiAgdm9pZCBhZGRFcnJvcihPYmplY3QgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKTsKCiAgLyoqCiAgICogQ2xvc2VzIHRoZSBjb250cm9sbGVyJ3Mgc3RyZWFtLgogICAqCiAgICogQXMgW1N0cmVhbUNvbnRyb2xsZXIuY2xvc2VdLCBidXQgbXVzdCBub3QgYmUgY2FsbGVkIHdoaWxlIGFuIGV2ZW50IGlzCiAgICogYmVpbmcgYWRkZWQgYnkgW2FkZF0sIFthZGRFcnJvcl0gb3IgW2Nsb3NlXS4KICAgKi8KICBGdXR1cmUgY2xvc2UoKTsKfQoKYWJzdHJhY3QgY2xhc3MgX1N0cmVhbUNvbnRyb2xsZXJMaWZlY3ljbGU8VD4gewogIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBfc3Vic2NyaWJlKAogICAgICB2b2lkIG9uRGF0YShUIGRhdGEpLCBGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3IpOwogIHZvaWQgX3JlY29yZFBhdXNlKFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24pIHt9CiAgdm9pZCBfcmVjb3JkUmVzdW1lKFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24pIHt9CiAgRnV0dXJlIF9yZWNvcmRDYW5jZWwoU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbikgPT4gbnVsbDsKfQoKLy8gQmFzZSB0eXBlIGZvciBpbXBsZW1lbnRhdGlvbnMgb2Ygc3RyZWFtIGNvbnRyb2xsZXJzLgphYnN0cmFjdCBjbGFzcyBfU3RyZWFtQ29udHJvbGxlckJhc2U8VD4KICAgIGltcGxlbWVudHMKICAgICAgICBTdHJlYW1Db250cm9sbGVyPFQ+LAogICAgICAgIF9TdHJlYW1Db250cm9sbGVyTGlmZWN5Y2xlPFQ+LAogICAgICAgIF9FdmVudFNpbms8VD4sCiAgICAgICAgX0V2ZW50RGlzcGF0Y2g8VD4ge30KCi8qKgogKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIFtTdHJlYW1Db250cm9sbGVyXS4KICoKICogQ29udHJvbHMgYSBzdHJlYW0gdGhhdCBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIGNvbnRyb2xsZXIuCiAqLwphYnN0cmFjdCBjbGFzcyBfU3RyZWFtQ29udHJvbGxlcjxUPiBpbXBsZW1lbnRzIF9TdHJlYW1Db250cm9sbGVyQmFzZTxUPiB7CiAgLy8gVGhlIHN0YXRlcyBhcmUgYml0LWZsYWdzLiBNb3JlIHRoYW4gb25lIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgogIC8vCiAgLy8gVGhlICJzdWJzY3JpcHRpb24gc3RhdGUiIGdvZXMgdGhyb3VnaCB0aGUgc3RhdGVzOgogIC8vICAgaW5pdGlhbCAtPiBzdWJzY3JpYmVkIC0+IGNhbmNlbGVkLgogIC8vIFRoZXNlIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuCiAgLy8gVGhlICJjbG9zZWQiIHN0YXRlIHJlY29yZHMgd2hldGhlciB0aGUgW2Nsb3NlXSBtZXRob2QgaGFzIGJlZW4gY2FsbGVkCiAgLy8gb24gdGhlIGNvbnRyb2xsZXIuIFRoaXMgY2FuIGJlIGRvbmUgYXQgYW55IHRpbWUuIElmIGRvbmUgYmVmb3JlCiAgLy8gc3Vic2NyaXB0aW9uLCB0aGUgZG9uZSBldmVudCBpcyBxdWV1ZWQuIElmIGRvbmUgYWZ0ZXIgY2FuY2VsLCB0aGUgZG9uZQogIC8vIGV2ZW50IGlzIGlnbm9yZWQgKGp1c3QgYXMgYW55IG90aGVyIGV2ZW50IGFmdGVyIGEgY2FuY2VsKS4KCiAgLyoqIFRoZSBjb250cm9sbGVyIGlzIGluIGl0cyBpbml0aWFsIHN0YXRlIHdpdGggbm8gc3Vic2NyaXB0aW9uLiAqLwogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX0lOSVRJQUwgPSAwOwogIC8qKiBUaGUgY29udHJvbGxlciBoYXMgYSBzdWJzY3JpcHRpb24sIGJ1dCBoYXNuJ3QgYmVlbiBjbG9zZWQgb3IgY2FuY2VsZWQuICovCiAgc3RhdGljIGNvbnN0IGludCBfU1RBVEVfU1VCU0NSSUJFRCA9IDE7CiAgLyoqIFRoZSBzdWJzY3JpcHRpb24gaXMgY2FuY2VsZWQuICovCiAgc3RhdGljIGNvbnN0IGludCBfU1RBVEVfQ0FOQ0VMRUQgPSAyOwogIC8qKiBNYXNrIGZvciB0aGUgc3Vic2NyaXB0aW9uIHN0YXRlLiAqLwogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX1NVQlNDUklQVElPTl9NQVNLID0gMzsKCiAgLy8gVGhlIGZvbGxvd2luZyBzdGF0ZSByZWxhdGUgdG8gdGhlIGNvbnRyb2xsZXIsIG5vdCB0aGUgc3Vic2NyaXB0aW9uLgogIC8vIElmIGNsb3NlZCwgYWRkaW5nIG1vcmUgZXZlbnRzIGlzIG5vdCBhbGxvd2VkLgogIC8vIElmIGV4ZWN1dGluZyBhbiBbYWRkU3RyZWFtXSwgbmV3IGV2ZW50cyBhcmUgbm90IGFsbG93ZWQgZWl0aGVyLCBidXQgd2lsbAogIC8vIGJlIGFkZGVkIGJ5IHRoZSBzdHJlYW0uCgogIC8qKgogICAqIFRoZSBjb250cm9sbGVyIGlzIGNsb3NlZCBkdWUgdG8gY2FsbGluZyBbY2xvc2VdLgogICAqCiAgICogV2hlbiB0aGUgc3RyZWFtIGlzIGNsb3NlZCwgeW91IGNhbiBuZWl0aGVyIGFkZCBuZXcgZXZlbnRzIG5vciBhZGQgbmV3CiAgICogbGlzdGVuZXJzLgogICAqLwogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX0NMT1NFRCA9IDQ7CiAgLyoqCiAgICogVGhlIGNvbnRyb2xsZXIgaXMgaW4gdGhlIG1pZGRsZSBvZiBhbiBbYWRkU3RyZWFtXSBvcGVyYXRpb24uCiAgICoKICAgKiBXaGlsZSBhZGRpbmcgZXZlbnRzIGZyb20gYSBzdHJlYW0sIG5vIG5ldyBldmVudHMgY2FuIGJlIGFkZGVkIGRpcmVjdGx5CiAgICogb24gdGhlIGNvbnRyb2xsZXIuCiAgICovCiAgc3RhdGljIGNvbnN0IGludCBfU1RBVEVfQUREU1RSRUFNID0gODsKCiAgLyoqCiAgICogRmllbGQgY29udGFpbmluZyBkaWZmZXJlbnQgZGF0YSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgc3Vic2NyaXB0aW9uCiAgICogc3RhdGUuCiAgICoKICAgKiBJZiBbX3N0YXRlXSBpcyBbX1NUQVRFX0lOSVRJQUxdLCB0aGUgZmllbGQgbWF5IGNvbnRhaW4gYSBbX1BlbmRpbmdFdmVudHNdCiAgICogZm9yIGV2ZW50cyBhZGRlZCB0byB0aGUgY29udHJvbGxlciBiZWZvcmUgYSBzdWJzY3JpcHRpb24uCiAgICoKICAgKiBXaGlsZSBbX3N0YXRlXSBpcyBbX1NUQVRFX1NVQlNDUklCRURdLCB0aGUgZmllbGQgY29udGFpbnMgdGhlIHN1YnNjcmlwdGlvbi4KICAgKgogICAqIFdoZW4gW19zdGF0ZV0gaXMgW19TVEFURV9DQU5DRUxFRF0gdGhlIGZpZWxkIGlzIGN1cnJlbnRseSBub3QgdXNlZC4KICAgKi8KICB2YXIgX3ZhckRhdGE7CgogIC8qKiBDdXJyZW50IHN0YXRlIG9mIHRoZSBjb250cm9sbGVyLiAqLwogIGludCBfc3RhdGUgPSBfU1RBVEVfSU5JVElBTDsKCiAgLyoqCiAgICogRnV0dXJlIGNvbXBsZXRlZCB3aGVuIHRoZSBzdHJlYW0gc2VuZHMgaXRzIGxhc3QgZXZlbnQuCiAgICoKICAgKiBUaGlzIGlzIGFsc28gdGhlIGZ1dHVyZSByZXR1cm5lZCBieSBbY2xvc2VdLgogICAqLwogIC8vIFRPRE8obHJuKTogQ291bGQgdGhpcyBiZSBzdG9yZWQgaW4gdGhlIHZhckRhdGEgZmllbGQgdG9vLCBpZiBpdCdzIG5vdAogIC8vIGFjY2Vzc2VkIHVudGlsIHRoZSBjYWxsIHRvICJjbG9zZSI/IFRoZW4gd2UgbmVlZCB0byBzcGVjaWFsIGNhc2UgaWYgaXQncwogIC8vIGFjY2Vzc2VkIGVhcmxpZXIsIG9yIGlmIGNsb3NlIGlzIGNhbGxlZCBiZWZvcmUgc3Vic2NyaWJpbmcuCiAgX0Z1dHVyZSBfZG9uZUZ1dHVyZTsKCiAgQ29udHJvbGxlckNhbGxiYWNrIG9uTGlzdGVuOwogIENvbnRyb2xsZXJDYWxsYmFjayBvblBhdXNlOwogIENvbnRyb2xsZXJDYWxsYmFjayBvblJlc3VtZTsKICBDb250cm9sbGVyQ2FuY2VsQ2FsbGJhY2sgb25DYW5jZWw7CgogIF9TdHJlYW1Db250cm9sbGVyKHRoaXMub25MaXN0ZW4sIHRoaXMub25QYXVzZSwgdGhpcy5vblJlc3VtZSwgdGhpcy5vbkNhbmNlbCk7CgogIC8vIFJldHVybiBhIG5ldyBzdHJlYW0gZXZlcnkgdGltZS4gVGhlIHN0cmVhbXMgYXJlIGVxdWFsLCBidXQgbm90IGlkZW50aWNhbC4KICBTdHJlYW08VD4gZ2V0IHN0cmVhbSA9PiBuZXcgX0NvbnRyb2xsZXJTdHJlYW08VD4odGhpcyk7CgogIC8qKgogICAqIFJldHVybnMgYSB2aWV3IG9mIHRoaXMgb2JqZWN0IHRoYXQgb25seSBleHBvc2VzIHRoZSBbU3RyZWFtU2lua10gaW50ZXJmYWNlLgogICAqLwogIFN0cmVhbVNpbms8VD4gZ2V0IHNpbmsgPT4gbmV3IF9TdHJlYW1TaW5rV3JhcHBlcjxUPih0aGlzKTsKCiAgLyoqCiAgICogV2hldGhlciBhIGxpc3RlbmVyIGhhcyBleGlzdGVkIGFuZCBiZWVuIGNhbmNlbGVkLgogICAqCiAgICogQWZ0ZXIgdGhpcywgYWRkaW5nIG1vcmUgZXZlbnRzIHdpbGwgYmUgaWdub3JlZC4KICAgKi8KICBib29sIGdldCBfaXNDYW5jZWxlZCA9PiAoX3N0YXRlICYgX1NUQVRFX0NBTkNFTEVEKSAhPSAwOwoKICAvKiogV2hldGhlciB0aGVyZSBpcyBhbiBhY3RpdmUgbGlzdGVuZXIuICovCiAgYm9vbCBnZXQgaGFzTGlzdGVuZXIgPT4gKF9zdGF0ZSAmIF9TVEFURV9TVUJTQ1JJQkVEKSAhPSAwOwoKICAvKiogV2hldGhlciB0aGVyZSBoYXMgbm90IGJlZW4gYSBsaXN0ZW5lciB5ZXQuICovCiAgYm9vbCBnZXQgX2lzSW5pdGlhbFN0YXRlID0+CiAgICAgIChfc3RhdGUgJiBfU1RBVEVfU1VCU0NSSVBUSU9OX01BU0spID09IF9TVEFURV9JTklUSUFMOwoKICBib29sIGdldCBpc0Nsb3NlZCA9PiAoX3N0YXRlICYgX1NUQVRFX0NMT1NFRCkgIT0gMDsKCiAgYm9vbCBnZXQgaXNQYXVzZWQgPT4KICAgICAgaGFzTGlzdGVuZXIgPyBfc3Vic2NyaXB0aW9uLl9pc0lucHV0UGF1c2VkIDogIV9pc0NhbmNlbGVkOwoKICBib29sIGdldCBfaXNBZGRpbmdTdHJlYW0gPT4gKF9zdGF0ZSAmIF9TVEFURV9BRERTVFJFQU0pICE9IDA7CgogIC8qKiBOZXcgZXZlbnRzIG1heSBub3QgYmUgYWRkZWQgYWZ0ZXIgY2xvc2UsIG9yIGR1cmluZyBhZGRTdHJlYW0uICovCiAgYm9vbCBnZXQgX21heUFkZEV2ZW50ID0+IChfc3RhdGUgPCBfU1RBVEVfQ0xPU0VEKTsKCiAgLy8gUmV0dXJucyB0aGUgcGVuZGluZyBldmVudHMuCiAgLy8gUGVuZGluZyBldmVudHMgYXJlIGV2ZW50cyBhZGRlZCBiZWZvcmUgYSBzdWJzY3JpcHRpb24gZXhpc3RzLgogIC8vIFRoZXkgYXJlIGFkZGVkIHRvIHRoZSBzdWJzY3JpcHRpb24gd2hlbiBpdCBpcyBjcmVhdGVkLgogIC8vIFBlbmRpbmcgZXZlbnRzLCBpZiBhbnksIGFyZSBrZXB0IGluIHRoZSBfdmFyRGF0YSBmaWVsZCB1bnRpbCB0aGUKICAvLyBzdHJlYW0gaXMgbGlzdGVuZWQgdG8uCiAgLy8gV2hpbGUgYWRkaW5nIGEgc3RyZWFtLCBwZW5kaW5nIGV2ZW50cyBhcmUgbW92ZWQgaW50byB0aGUKICAvLyBzdGF0ZSBvYmplY3QgdG8gYWxsb3cgdGhlIHN0YXRlIG9iamVjdCB0byB1c2UgdGhlIF92YXJEYXRhIGZpZWxkLgogIF9QZW5kaW5nRXZlbnRzPFQ+IGdldCBfcGVuZGluZ0V2ZW50cyB7CiAgICBhc3NlcnQoX2lzSW5pdGlhbFN0YXRlKTsKICAgIGlmICghX2lzQWRkaW5nU3RyZWFtKSB7CiAgICAgIHJldHVybiBfdmFyRGF0YTsKICAgIH0KICAgIF9TdHJlYW1Db250cm9sbGVyQWRkU3RyZWFtU3RhdGU8VD4gc3RhdGUgPSBfdmFyRGF0YTsKICAgIHJldHVybiBzdGF0ZS52YXJEYXRhOwogIH0KCiAgLy8gUmV0dXJucyB0aGUgcGVuZGluZyBldmVudHMsIGFuZCBjcmVhdGVzIHRoZSBvYmplY3QgaWYgbmVjZXNzYXJ5LgogIF9TdHJlYW1JbXBsRXZlbnRzPFQ+IF9lbnN1cmVQZW5kaW5nRXZlbnRzKCkgewogICAgYXNzZXJ0KF9pc0luaXRpYWxTdGF0ZSk7CiAgICBpZiAoIV9pc0FkZGluZ1N0cmVhbSkgewogICAgICBfdmFyRGF0YSA/Pz0gbmV3IF9TdHJlYW1JbXBsRXZlbnRzPFQ+KCk7CiAgICAgIHJldHVybiBfdmFyRGF0YTsKICAgIH0KICAgIF9TdHJlYW1Db250cm9sbGVyQWRkU3RyZWFtU3RhdGU8VD4gc3RhdGUgPSBfdmFyRGF0YTsKICAgIGlmIChzdGF0ZS52YXJEYXRhID09IG51bGwpIHN0YXRlLnZhckRhdGEgPSBuZXcgX1N0cmVhbUltcGxFdmVudHM8VD4oKTsKICAgIHJldHVybiBzdGF0ZS52YXJEYXRhOwogIH0KCiAgLy8gR2V0IHRoZSBjdXJyZW50IHN1YnNjcmlwdGlvbi4KICAvLyBJZiB3ZSBhcmUgYWRkaW5nIGEgc3RyZWFtLCB0aGUgc3Vic2NyaXB0aW9uIGlzIG1vdmVkIGludG8gdGhlIHN0YXRlCiAgLy8gb2JqZWN0IHRvIGFsbG93IHRoZSBzdGF0ZSBvYmplY3QgdG8gdXNlIHRoZSBfdmFyRGF0YSBmaWVsZC4KICBfQ29udHJvbGxlclN1YnNjcmlwdGlvbjxUPiBnZXQgX3N1YnNjcmlwdGlvbiB7CiAgICBhc3NlcnQoaGFzTGlzdGVuZXIpOwogICAgaWYgKF9pc0FkZGluZ1N0cmVhbSkgewogICAgICBfU3RyZWFtQ29udHJvbGxlckFkZFN0cmVhbVN0YXRlPFQ+IGFkZFN0YXRlID0gX3ZhckRhdGE7CiAgICAgIHJldHVybiBhZGRTdGF0ZS52YXJEYXRhOwogICAgfQogICAgcmV0dXJuIF92YXJEYXRhOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBlcnJvciBkZXNjcmliaW5nIHdoeSBhbiBldmVudCBjYW5ub3QgYmUgYWRkZWQuCiAgICoKICAgKiBUaGUgcmVhc29uLCBhbmQgdGhlcmVmb3JlIHRoZSBlcnJvciBtZXNzYWdlLCBkZXBlbmRzIG9uIHRoZSBjdXJyZW50IHN0YXRlLgogICAqLwogIEVycm9yIF9iYWRFdmVudFN0YXRlKCkgewogICAgaWYgKGlzQ2xvc2VkKSB7CiAgICAgIHJldHVybiBuZXcgU3RhdGVFcnJvcigiQ2Fubm90IGFkZCBldmVudCBhZnRlciBjbG9zaW5nIik7CiAgICB9CiAgICBhc3NlcnQoX2lzQWRkaW5nU3RyZWFtKTsKICAgIHJldHVybiBuZXcgU3RhdGVFcnJvcigiQ2Fubm90IGFkZCBldmVudCB3aGlsZSBhZGRpbmcgYSBzdHJlYW0iKTsKICB9CgogIC8vIFN0cmVhbVNpbmsgaW50ZXJmYWNlLgogIEZ1dHVyZSBhZGRTdHJlYW0oU3RyZWFtPFQ+IHNvdXJjZSwge2Jvb2wgY2FuY2VsT25FcnJvcn0pIHsKICAgIGlmICghX21heUFkZEV2ZW50KSB0aHJvdyBfYmFkRXZlbnRTdGF0ZSgpOwogICAgaWYgKF9pc0NhbmNlbGVkKSByZXR1cm4gbmV3IF9GdXR1cmUuaW1tZWRpYXRlKG51bGwpOwogICAgX1N0cmVhbUNvbnRyb2xsZXJBZGRTdHJlYW1TdGF0ZTxUPiBhZGRTdGF0ZSA9CiAgICAgICAgbmV3IF9TdHJlYW1Db250cm9sbGVyQWRkU3RyZWFtU3RhdGU8VD4oCiAgICAgICAgICAgIHRoaXMsIF92YXJEYXRhLCBzb3VyY2UsIGNhbmNlbE9uRXJyb3IgPz8gZmFsc2UpOwogICAgX3ZhckRhdGEgPSBhZGRTdGF0ZTsKICAgIF9zdGF0ZSB8PSBfU1RBVEVfQUREU1RSRUFNOwogICAgcmV0dXJuIGFkZFN0YXRlLmFkZFN0cmVhbUZ1dHVyZTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBmdXR1cmUgdGhhdCBpcyBjb21wbGV0ZWQgd2hlbiB0aGUgc3RyZWFtIGlzIGRvbmUKICAgKiBwcm9jZXNzaW5nIGV2ZW50cy4KICAgKgogICAqIFRoaXMgaGFwcGVucyBlaXRoZXIgd2hlbiB0aGUgZG9uZSBldmVudCBoYXMgYmVlbiBzZW50LCBvciBpZiB0aGUKICAgKiBzdWJzY3JpYmVyIG9mIGEgc2luZ2xlLXN1YnNjcmlwdGlvbiBzdHJlYW0gaXMgY2FuY2VsbGVkLgogICAqLwogIEZ1dHVyZSBnZXQgZG9uZSA9PiBfZW5zdXJlRG9uZUZ1dHVyZSgpOwoKICBGdXR1cmUgX2Vuc3VyZURvbmVGdXR1cmUoKSB7CiAgICBfZG9uZUZ1dHVyZSA/Pz0gX2lzQ2FuY2VsZWQgPyBGdXR1cmUuX251bGxGdXR1cmUgOiBuZXcgX0Z1dHVyZSgpOwogICAgcmV0dXJuIF9kb25lRnV0dXJlOwogIH0KCiAgLyoqCiAgICogU2VuZCBvciBlbnF1ZXVlIGEgZGF0YSBldmVudC4KICAgKi8KICB2b2lkIGFkZChUIHZhbHVlKSB7CiAgICBpZiAoIV9tYXlBZGRFdmVudCkgdGhyb3cgX2JhZEV2ZW50U3RhdGUoKTsKICAgIF9hZGQodmFsdWUpOwogIH0KCiAgLyoqCiAgICogU2VuZCBvciBlbnF1ZXVlIGFuIGVycm9yIGV2ZW50LgogICAqLwogIHZvaWQgYWRkRXJyb3IoT2JqZWN0IGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSkgewogICAgaWYgKCFfbWF5QWRkRXZlbnQpIHRocm93IF9iYWRFdmVudFN0YXRlKCk7CiAgICBlcnJvciA9IF9ub25OdWxsRXJyb3IoZXJyb3IpOwogICAgQXN5bmNFcnJvciByZXBsYWNlbWVudCA9IFpvbmUuY3VycmVudC5lcnJvckNhbGxiYWNrKGVycm9yLCBzdGFja1RyYWNlKTsKICAgIGlmIChyZXBsYWNlbWVudCAhPSBudWxsKSB7CiAgICAgIGVycm9yID0gX25vbk51bGxFcnJvcihyZXBsYWNlbWVudC5lcnJvcik7CiAgICAgIHN0YWNrVHJhY2UgPSByZXBsYWNlbWVudC5zdGFja1RyYWNlOwogICAgfQogICAgX2FkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIC8qKgogICAqIENsb3NlcyB0aGlzIGNvbnRyb2xsZXIgYW5kIHNlbmRzIGEgZG9uZSBldmVudCBvbiB0aGUgc3RyZWFtLgogICAqCiAgICogVGhlIGZpcnN0IHRpbWUgYSBjb250cm9sbGVyIGlzIGNsb3NlZCwgYSAiZG9uZSIgZXZlbnQgaXMgYWRkZWQgdG8gaXRzCiAgICogc3RyZWFtLgogICAqCiAgICogWW91IGFyZSBhbGxvd2VkIHRvIGNsb3NlIHRoZSBjb250cm9sbGVyIG1vcmUgdGhhbiBvbmNlLCBidXQgb25seSB0aGUgZmlyc3QKICAgKiBjYWxsIGhhcyBhbnkgZWZmZWN0LgogICAqCiAgICogQWZ0ZXIgY2xvc2luZywgbm8gZnVydGhlciBldmVudHMgbWF5IGJlIGFkZGVkIHVzaW5nIFthZGRdLCBbYWRkRXJyb3JdCiAgICogb3IgW2FkZFN0cmVhbV0uCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aGVuIHRoZSBkb25lIGV2ZW50IGhhcyBiZWVuIGRlbGl2ZXJlZC4KICAgKi8KICBGdXR1cmUgY2xvc2UoKSB7CiAgICBpZiAoaXNDbG9zZWQpIHsKICAgICAgcmV0dXJuIF9lbnN1cmVEb25lRnV0dXJlKCk7CiAgICB9CiAgICBpZiAoIV9tYXlBZGRFdmVudCkgdGhyb3cgX2JhZEV2ZW50U3RhdGUoKTsKICAgIF9jbG9zZVVuY2hlY2tlZCgpOwogICAgcmV0dXJuIF9lbnN1cmVEb25lRnV0dXJlKCk7CiAgfQoKICB2b2lkIF9jbG9zZVVuY2hlY2tlZCgpIHsKICAgIF9zdGF0ZSB8PSBfU1RBVEVfQ0xPU0VEOwogICAgaWYgKGhhc0xpc3RlbmVyKSB7CiAgICAgIF9zZW5kRG9uZSgpOwogICAgfSBlbHNlIGlmIChfaXNJbml0aWFsU3RhdGUpIHsKICAgICAgX2Vuc3VyZVBlbmRpbmdFdmVudHMoKS5hZGQoY29uc3QgX0RlbGF5ZWREb25lKCkpOwogICAgfQogIH0KCiAgLy8gRXZlbnRTaW5rIGludGVyZmFjZS4gVXNlZCBieSB0aGUgW2FkZFN0cmVhbV0gZXZlbnRzLgoKICAvLyBBZGQgZGF0YSBldmVudCwgdXNlZCBib3RoIGJ5IHRoZSBbYWRkU3RyZWFtXSBldmVudHMgYW5kIGJ5IFthZGRdLgogIHZvaWQgX2FkZChUIHZhbHVlKSB7CiAgICBpZiAoaGFzTGlzdGVuZXIpIHsKICAgICAgX3NlbmREYXRhKHZhbHVlKTsKICAgIH0gZWxzZSBpZiAoX2lzSW5pdGlhbFN0YXRlKSB7CiAgICAgIF9lbnN1cmVQZW5kaW5nRXZlbnRzKCkuYWRkKG5ldyBfRGVsYXllZERhdGE8VD4odmFsdWUpKTsKICAgIH0KICB9CgogIHZvaWQgX2FkZEVycm9yKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICBpZiAoaGFzTGlzdGVuZXIpIHsKICAgICAgX3NlbmRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICB9IGVsc2UgaWYgKF9pc0luaXRpYWxTdGF0ZSkgewogICAgICBfZW5zdXJlUGVuZGluZ0V2ZW50cygpLmFkZChuZXcgX0RlbGF5ZWRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSkpOwogICAgfQogIH0KCiAgdm9pZCBfY2xvc2UoKSB7CiAgICAvLyBFbmQgb2YgYWRkU3RyZWFtIHN0cmVhbS4KICAgIGFzc2VydChfaXNBZGRpbmdTdHJlYW0pOwogICAgX1N0cmVhbUNvbnRyb2xsZXJBZGRTdHJlYW1TdGF0ZTxUPiBhZGRTdGF0ZSA9IF92YXJEYXRhOwogICAgX3ZhckRhdGEgPSBhZGRTdGF0ZS52YXJEYXRhOwogICAgX3N0YXRlICY9IH5fU1RBVEVfQUREU1RSRUFNOwogICAgYWRkU3RhdGUuY29tcGxldGUoKTsKICB9CgogIC8vIF9TdHJlYW1Db250cm9sbGVyTGlmZUN5Y2xlIGludGVyZmFjZQoKICBTdHJlYW1TdWJzY3JpcHRpb248VD4gX3N1YnNjcmliZSh2b2lkIG9uRGF0YShUIGRhdGEpLCBGdW5jdGlvbiBvbkVycm9yLAogICAgICB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3IpIHsKICAgIGlmICghX2lzSW5pdGlhbFN0YXRlKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJTdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBsaXN0ZW5lZCB0by4iKTsKICAgIH0KICAgIF9Db250cm9sbGVyU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbiA9IG5ldyBfQ29udHJvbGxlclN1YnNjcmlwdGlvbjxUPigKICAgICAgICB0aGlzLCBvbkRhdGEsIG9uRXJyb3IsIG9uRG9uZSwgY2FuY2VsT25FcnJvcik7CgogICAgX1BlbmRpbmdFdmVudHM8VD4gcGVuZGluZ0V2ZW50cyA9IF9wZW5kaW5nRXZlbnRzOwogICAgX3N0YXRlIHw9IF9TVEFURV9TVUJTQ1JJQkVEOwogICAgaWYgKF9pc0FkZGluZ1N0cmVhbSkgewogICAgICBfU3RyZWFtQ29udHJvbGxlckFkZFN0cmVhbVN0YXRlPFQ+IGFkZFN0YXRlID0gX3ZhckRhdGE7CiAgICAgIGFkZFN0YXRlLnZhckRhdGEgPSBzdWJzY3JpcHRpb247CiAgICAgIGFkZFN0YXRlLnJlc3VtZSgpOwogICAgfSBlbHNlIHsKICAgICAgX3ZhckRhdGEgPSBzdWJzY3JpcHRpb247CiAgICB9CiAgICBzdWJzY3JpcHRpb24uX3NldFBlbmRpbmdFdmVudHMocGVuZGluZ0V2ZW50cyk7CiAgICBzdWJzY3JpcHRpb24uX2d1YXJkQ2FsbGJhY2soKCkgewogICAgICBfcnVuR3VhcmRlZChvbkxpc3Rlbik7CiAgICB9KTsKCiAgICByZXR1cm4gc3Vic2NyaXB0aW9uOwogIH0KCiAgRnV0dXJlIF9yZWNvcmRDYW5jZWwoU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbikgewogICAgLy8gV2hlbiB3ZSBjYW5jZWwsIHdlIGZpcnN0IGNhbmNlbCBhbnkgc3RyZWFtIGJlaW5nIGFkZGVkLAogICAgLy8gVGhlbiB3ZSBjYWxsIGBvbkNhbmNlbGAsIGFuZCBmaW5hbGx5IHRoZSBfZG9uZUZ1dHVyZSBpcyBjb21wbGV0ZWQuCiAgICAvLyBJZiBlaXRoZXIgb2YgYWRkU3RyZWFtJ3MgY2FuY2VsIG9yIGBvbkNhbmNlbGAgcmV0dXJucyBhIGZ1dHVyZSwKICAgIC8vIHdlIHdhaXQgZm9yIGl0IGJlZm9yZSBjb250aW51aW5nLgogICAgLy8gQW55IGVycm9yIGR1cmluZyB0aGlzIHByb2Nlc3MgZW5kcyB1cCBpbiB0aGUgcmV0dXJuZWQgZnV0dXJlLgogICAgLy8gSWYgbW9yZSBlcnJvcnMgaGFwcGVuLCB3ZSBhY3QgYXMgaWYgaXQgaGFwcGVucyBpbnNpZGUgbmVzdGVkIHRyeS9maW5hbGx5cwogICAgLy8gb3Igd2hlbkNvbXBsZXRlIGNhbGxzLCBhbmQgb25seSB0aGUgbGFzdCBlcnJvciBlbmRzIHVwIGluIHRoZQogICAgLy8gcmV0dXJuZWQgZnV0dXJlLgogICAgRnV0dXJlIHJlc3VsdDsKICAgIGlmIChfaXNBZGRpbmdTdHJlYW0pIHsKICAgICAgX1N0cmVhbUNvbnRyb2xsZXJBZGRTdHJlYW1TdGF0ZTxUPiBhZGRTdGF0ZSA9IF92YXJEYXRhOwogICAgICByZXN1bHQgPSBhZGRTdGF0ZS5jYW5jZWwoKTsKICAgIH0KICAgIF92YXJEYXRhID0gbnVsbDsKICAgIF9zdGF0ZSA9CiAgICAgICAgKF9zdGF0ZSAmIH4oX1NUQVRFX1NVQlNDUklCRUQgfCBfU1RBVEVfQUREU1RSRUFNKSkgfCBfU1RBVEVfQ0FOQ0VMRUQ7CgogICAgaWYgKG9uQ2FuY2VsICE9IG51bGwpIHsKICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CiAgICAgICAgLy8gT25seSBpbnRyb2R1Y2UgYSBmdXR1cmUgaWYgb25lIGlzIG5lZWRlZC4KICAgICAgICAvLyBJZiBfb25DYW5jZWwgcmV0dXJucyBudWxsLCBubyBmdXR1cmUgaXMgbmVlZGVkLgogICAgICAgIHRyeSB7CiAgICAgICAgICByZXN1bHQgPSBvbkNhbmNlbCgpOwogICAgICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgICAgIC8vIFJldHVybiB0aGUgZXJyb3IgaW4gdGhlIHJldHVybmVkIGZ1dHVyZS4KICAgICAgICAgIC8vIENvbXBsZXRlIGl0IGFzeW5jaHJvbm91c2x5LCBzbyB0aGVyZSBpcyB0aW1lIGZvciBhIGxpc3RlbmVyCiAgICAgICAgICAvLyB0byBoYW5kbGUgdGhlIGVycm9yLgogICAgICAgICAgcmVzdWx0ID0gbmV3IF9GdXR1cmUoKS4uX2FzeW5jQ29tcGxldGVFcnJvcihlLCBzKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gU2ltcGxlciBjYXNlIHdoZW4gd2UgYWxyZWFkeSBrbm93IHRoYXQgd2Ugd2lsbCByZXR1cm4gYSBmdXR1cmUuCiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LndoZW5Db21wbGV0ZShvbkNhbmNlbCk7CiAgICAgIH0KICAgIH0KCiAgICB2b2lkIGNvbXBsZXRlKCkgewogICAgICBpZiAoX2RvbmVGdXR1cmUgIT0gbnVsbCAmJiBfZG9uZUZ1dHVyZS5fbWF5Q29tcGxldGUpIHsKICAgICAgICBfZG9uZUZ1dHVyZS5fYXN5bmNDb21wbGV0ZShudWxsKTsKICAgICAgfQogICAgfQoKICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewogICAgICByZXN1bHQgPSByZXN1bHQud2hlbkNvbXBsZXRlKGNvbXBsZXRlKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbXBsZXRlKCk7CiAgICB9CgogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgX3JlY29yZFBhdXNlKFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24pIHsKICAgIGlmIChfaXNBZGRpbmdTdHJlYW0pIHsKICAgICAgX1N0cmVhbUNvbnRyb2xsZXJBZGRTdHJlYW1TdGF0ZTxUPiBhZGRTdGF0ZSA9IF92YXJEYXRhOwogICAgICBhZGRTdGF0ZS5wYXVzZSgpOwogICAgfQogICAgX3J1bkd1YXJkZWQob25QYXVzZSk7CiAgfQoKICB2b2lkIF9yZWNvcmRSZXN1bWUoU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbikgewogICAgaWYgKF9pc0FkZGluZ1N0cmVhbSkgewogICAgICBfU3RyZWFtQ29udHJvbGxlckFkZFN0cmVhbVN0YXRlPFQ+IGFkZFN0YXRlID0gX3ZhckRhdGE7CiAgICAgIGFkZFN0YXRlLnJlc3VtZSgpOwogICAgfQogICAgX3J1bkd1YXJkZWQob25SZXN1bWUpOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgX1N5bmNTdHJlYW1Db250cm9sbGVyRGlzcGF0Y2g8VD4KICAgIGltcGxlbWVudHMgX1N0cmVhbUNvbnRyb2xsZXI8VD4sIFN5bmNocm9ub3VzU3RyZWFtQ29udHJvbGxlcjxUPiB7CiAgaW50IGdldCBfc3RhdGU7CiAgdm9pZCBzZXQgX3N0YXRlKGludCBzdGF0ZSk7CgogIHZvaWQgX3NlbmREYXRhKFQgZGF0YSkgewogICAgX3N1YnNjcmlwdGlvbi5fYWRkKGRhdGEpOwogIH0KCiAgdm9pZCBfc2VuZEVycm9yKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICBfc3Vic2NyaXB0aW9uLl9hZGRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQoKICB2b2lkIF9zZW5kRG9uZSgpIHsKICAgIF9zdWJzY3JpcHRpb24uX2Nsb3NlKCk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBfQXN5bmNTdHJlYW1Db250cm9sbGVyRGlzcGF0Y2g8VD4KICAgIGltcGxlbWVudHMgX1N0cmVhbUNvbnRyb2xsZXI8VD4gewogIHZvaWQgX3NlbmREYXRhKFQgZGF0YSkgewogICAgX3N1YnNjcmlwdGlvbi5fYWRkUGVuZGluZyhuZXcgX0RlbGF5ZWREYXRhPFQ+KGRhdGEpKTsKICB9CgogIHZvaWQgX3NlbmRFcnJvcihPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgX3N1YnNjcmlwdGlvbi5fYWRkUGVuZGluZyhuZXcgX0RlbGF5ZWRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSkpOwogIH0KCiAgdm9pZCBfc2VuZERvbmUoKSB7CiAgICBfc3Vic2NyaXB0aW9uLl9hZGRQZW5kaW5nKGNvbnN0IF9EZWxheWVkRG9uZSgpKTsKICB9Cn0KCi8vIFRPRE8obHJuKTogVXNlIGNvbW1vbiBzdXBlcmNsYXNzIGZvciBjYWxsYmFjay1jb250cm9sbGVycyB3aGVuIFZNIHN1cHBvcnRzCi8vIGNvbnN0cnVjdG9ycyBpbiBtaXhpbiBzdXBlcmNsYXNzZXMuCgpjbGFzcyBfQXN5bmNTdHJlYW1Db250cm9sbGVyPFQ+ID0gX1N0cmVhbUNvbnRyb2xsZXI8VD4KICAgIHdpdGggX0FzeW5jU3RyZWFtQ29udHJvbGxlckRpc3BhdGNoPFQ+OwoKY2xhc3MgX1N5bmNTdHJlYW1Db250cm9sbGVyPFQ+ID0gX1N0cmVhbUNvbnRyb2xsZXI8VD4KICAgIHdpdGggX1N5bmNTdHJlYW1Db250cm9sbGVyRGlzcGF0Y2g8VD47Cgp0eXBlZGVmIF9Ob3RpZmljYXRpb25IYW5kbGVyKCk7Cgp2b2lkIF9ydW5HdWFyZGVkKF9Ob3RpZmljYXRpb25IYW5kbGVyIG5vdGlmaWNhdGlvbkhhbmRsZXIpIHsKICBpZiAobm90aWZpY2F0aW9uSGFuZGxlciA9PSBudWxsKSByZXR1cm47CiAgdHJ5IHsKICAgIG5vdGlmaWNhdGlvbkhhbmRsZXIoKTsKICB9IGNhdGNoIChlLCBzKSB7CiAgICBab25lLmN1cnJlbnQuaGFuZGxlVW5jYXVnaHRFcnJvcihlLCBzKTsKICB9Cn0KCmNsYXNzIF9Db250cm9sbGVyU3RyZWFtPFQ+IGV4dGVuZHMgX1N0cmVhbUltcGw8VD4gewogIF9TdHJlYW1Db250cm9sbGVyTGlmZWN5Y2xlPFQ+IF9jb250cm9sbGVyOwoKICBfQ29udHJvbGxlclN0cmVhbSh0aGlzLl9jb250cm9sbGVyKTsKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IF9jcmVhdGVTdWJzY3JpcHRpb24odm9pZCBvbkRhdGEoVCBkYXRhKSwKICAgICAgICAgIEZ1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcikgPT4KICAgICAgX2NvbnRyb2xsZXIuX3N1YnNjcmliZShvbkRhdGEsIG9uRXJyb3IsIG9uRG9uZSwgY2FuY2VsT25FcnJvcik7CgogIC8vIE92ZXJyaWRlID09IGFuZCBoYXNoQ29kZSBzbyB0aGF0IG5ldyBzdHJlYW1zIHJldHVybmVkIGJ5IHRoZSBzYW1lCiAgLy8gY29udHJvbGxlciBhcmUgY29uc2lkZXJlZCBlcXVhbC4gVGhlIGNvbnRyb2xsZXIgcmV0dXJucyBhIG5ldyBzdHJlYW0KICAvLyBlYWNoIHRpbWUgaXQncyBxdWVyaWVkLCBidXQgZG9lc24ndCBoYXZlIHRvIGNhY2hlIHRoZSByZXN1bHQuCgogIGludCBnZXQgaGFzaENvZGUgPT4gX2NvbnRyb2xsZXIuaGFzaENvZGUgXiAweDM1MzIzNTMyOwoKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIG90aGVyIGlzIF9Db250cm9sbGVyU3RyZWFtICYmCiAgICAgICAgaWRlbnRpY2FsKG90aGVyLl9jb250cm9sbGVyLCB0aGlzLl9jb250cm9sbGVyKTsKICB9Cn0KCmNsYXNzIF9Db250cm9sbGVyU3Vic2NyaXB0aW9uPFQ+IGV4dGVuZHMgX0J1ZmZlcmluZ1N0cmVhbVN1YnNjcmlwdGlvbjxUPiB7CiAgZmluYWwgX1N0cmVhbUNvbnRyb2xsZXJMaWZlY3ljbGU8VD4gX2NvbnRyb2xsZXI7CgogIF9Db250cm9sbGVyU3Vic2NyaXB0aW9uKHRoaXMuX2NvbnRyb2xsZXIsIHZvaWQgb25EYXRhKFQgZGF0YSksCiAgICAgIEZ1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcikKICAgICAgOiBzdXBlcihvbkRhdGEsIG9uRXJyb3IsIG9uRG9uZSwgY2FuY2VsT25FcnJvcik7CgogIEZ1dHVyZSBfb25DYW5jZWwoKSB7CiAgICByZXR1cm4gX2NvbnRyb2xsZXIuX3JlY29yZENhbmNlbCh0aGlzKTsKICB9CgogIHZvaWQgX29uUGF1c2UoKSB7CiAgICBfY29udHJvbGxlci5fcmVjb3JkUGF1c2UodGhpcyk7CiAgfQoKICB2b2lkIF9vblJlc3VtZSgpIHsKICAgIF9jb250cm9sbGVyLl9yZWNvcmRSZXN1bWUodGhpcyk7CiAgfQp9CgovKiogQSBjbGFzcyB0aGF0IGV4cG9zZXMgb25seSB0aGUgW1N0cmVhbVNpbmtdIGludGVyZmFjZSBvZiBhbiBvYmplY3QuICovCmNsYXNzIF9TdHJlYW1TaW5rV3JhcHBlcjxUPiBpbXBsZW1lbnRzIFN0cmVhbVNpbms8VD4gewogIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXIgX3RhcmdldDsKICBfU3RyZWFtU2lua1dyYXBwZXIodGhpcy5fdGFyZ2V0KTsKICB2b2lkIGFkZChUIGRhdGEpIHsKICAgIF90YXJnZXQuYWRkKGRhdGEpOwogIH0KCiAgdm9pZCBhZGRFcnJvcihPYmplY3QgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICBfdGFyZ2V0LmFkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIEZ1dHVyZSBjbG9zZSgpID0+IF90YXJnZXQuY2xvc2UoKTsKCiAgRnV0dXJlIGFkZFN0cmVhbShTdHJlYW08VD4gc291cmNlKSA9PiBfdGFyZ2V0LmFkZFN0cmVhbShzb3VyY2UpOwoKICBGdXR1cmUgZ2V0IGRvbmUgPT4gX3RhcmdldC5kb25lOwp9CgovKioKICogT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIHVzZWQgdG8gaGFuZGxlIFtTdHJlYW1Db250cm9sbGVyLmFkZFN0cmVhbV0uCiAqLwpjbGFzcyBfQWRkU3RyZWFtU3RhdGU8VD4gewogIC8vIFtfRnV0dXJlXSByZXR1cm5lZCBieSBjYWxsIHRvIGFkZFN0cmVhbS4KICBmaW5hbCBfRnV0dXJlIGFkZFN0cmVhbUZ1dHVyZTsKCiAgLy8gU3Vic2NyaXB0aW9uIG9uIHN0cmVhbSBhcmd1bWVudCB0byBhZGRTdHJlYW0uCiAgZmluYWwgU3RyZWFtU3Vic2NyaXB0aW9uIGFkZFN1YnNjcmlwdGlvbjsKCiAgX0FkZFN0cmVhbVN0YXRlKAogICAgICBfRXZlbnRTaW5rPFQ+IGNvbnRyb2xsZXIsIFN0cmVhbTxUPiBzb3VyY2UsIGJvb2wgY2FuY2VsT25FcnJvcikKICAgICAgOiBhZGRTdHJlYW1GdXR1cmUgPSBuZXcgX0Z1dHVyZSgpLAogICAgICAgIGFkZFN1YnNjcmlwdGlvbiA9IHNvdXJjZS5saXN0ZW4oY29udHJvbGxlci5fYWRkLAogICAgICAgICAgICBvbkVycm9yOiBjYW5jZWxPbkVycm9yCiAgICAgICAgICAgICAgICA/IG1ha2VFcnJvckhhbmRsZXIoY29udHJvbGxlcikKICAgICAgICAgICAgICAgIDogY29udHJvbGxlci5fYWRkRXJyb3IsCiAgICAgICAgICAgIG9uRG9uZTogY29udHJvbGxlci5fY2xvc2UsCiAgICAgICAgICAgIGNhbmNlbE9uRXJyb3I6IGNhbmNlbE9uRXJyb3IpOwoKICBzdGF0aWMgbWFrZUVycm9ySGFuZGxlcihfRXZlbnRTaW5rIGNvbnRyb2xsZXIpID0+IChlLCBTdGFja1RyYWNlIHMpIHsKICAgICAgICBjb250cm9sbGVyLl9hZGRFcnJvcihlLCBzKTsKICAgICAgICBjb250cm9sbGVyLl9jbG9zZSgpOwogICAgICB9OwoKICB2b2lkIHBhdXNlKCkgewogICAgYWRkU3Vic2NyaXB0aW9uLnBhdXNlKCk7CiAgfQoKICB2b2lkIHJlc3VtZSgpIHsKICAgIGFkZFN1YnNjcmlwdGlvbi5yZXN1bWUoKTsKICB9CgogIC8qKgogICAqIFN0b3AgYWRkaW5nIHRoZSBzdHJlYW0uCiAgICoKICAgKiBDb21wbGV0ZSB0aGUgZnV0dXJlIHJldHVybmVkIGJ5IGBTdHJlYW1Db250cm9sbGVyLmFkZFN0cmVhbWAgd2hlbgogICAqIHRoZSBjYW5jZWwgaXMgY29tcGxldGUuCiAgICoKICAgKiBSZXR1cm4gYSBmdXR1cmUgaWYgdGhlIGNhbmNlbCB0YWtlcyB0aW1lLCBvdGhlcndpc2UgcmV0dXJuIGBudWxsYC4KICAgKi8KICBGdXR1cmUgY2FuY2VsKCkgewogICAgdmFyIGNhbmNlbCA9IGFkZFN1YnNjcmlwdGlvbi5jYW5jZWwoKTsKICAgIGlmIChjYW5jZWwgPT0gbnVsbCkgewogICAgICBhZGRTdHJlYW1GdXR1cmUuX2FzeW5jQ29tcGxldGUobnVsbCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIGNhbmNlbC53aGVuQ29tcGxldGUoKCkgewogICAgICBhZGRTdHJlYW1GdXR1cmUuX2FzeW5jQ29tcGxldGUobnVsbCk7CiAgICB9KTsKICB9CgogIHZvaWQgY29tcGxldGUoKSB7CiAgICBhZGRTdHJlYW1GdXR1cmUuX2FzeW5jQ29tcGxldGUobnVsbCk7CiAgfQp9CgpjbGFzcyBfU3RyZWFtQ29udHJvbGxlckFkZFN0cmVhbVN0YXRlPFQ+IGV4dGVuZHMgX0FkZFN0cmVhbVN0YXRlPFQ+IHsKICAvLyBUaGUgc3Vic2NyaXB0aW9uIG9yIHBlbmRpbmcgZGF0YSBvZiBhIF9TdHJlYW1Db250cm9sbGVyLgogIC8vIFN0b3JlZCBoZXJlIGJlY2F1c2Ugd2UgcmV1c2UgdGhlIGBfdmFyRGF0YWAgZmllbGQgIGluIHRoZSBfU3RyZWFtQ29udHJvbGxlcgogIC8vIHRvIHN0b3JlIHRoaXMgc3RhdGUgb2JqZWN0LgogIHZhciB2YXJEYXRhOwoKICBfU3RyZWFtQ29udHJvbGxlckFkZFN0cmVhbVN0YXRlKF9TdHJlYW1Db250cm9sbGVyPFQ+IGNvbnRyb2xsZXIsIHRoaXMudmFyRGF0YSwKICAgICAgU3RyZWFtPFQ+IHNvdXJjZSwgYm9vbCBjYW5jZWxPbkVycm9yKQogICAgICA6IHN1cGVyKGNvbnRyb2xsZXIsIHNvdXJjZSwgY2FuY2VsT25FcnJvcikgewogICAgaWYgKGNvbnRyb2xsZXIuaXNQYXVzZWQpIHsKICAgICAgYWRkU3Vic2NyaXB0aW9uLnBhdXNlKCk7CiAgICB9CiAgfQp9CoOwAE5OPAEUAUc6RwEEUQQjAQQzAzYEJAEELQNBEUA1A0tLEQQ+ORgBBkwFPENOHwVASCoFREtDUQVLLQVPTE8FRk0FPjsFN0FRUA4FSCwGHBgWFxIbEE5QBAEGRAU+KwVPTE8FRwVHSE9LS04FOj9RBUVASEkcRh4wBUk0P0tLE0cuKUQlLCQFTlFKKgYmPhBERgQBBkIFQgYjAS0BBj0FQgVQBiIBKwEGPgVCBVAGIwEtAQY/BUIGKQEoAQZRBhoBBkUFQkEdBSI5RwYVAQY7BUpJLgVJQkcGFQE4GAEGGwU4BU9GTEVNMgYVAQYnBUIFTUZEKAY4AQYYBVFGRCgGEgEGUAVGBUdDEgVNTRYFRURHNToGPAIBBD8DP0ADQ0g9IwNHQQNGNkdKSSIDRzlBSwNFTSFPTSsDS0xJS0wRA05MTRkDTiZILU49QUtGShk9Lz4DT04/SFEDSklKLgRPBiwFSTIGFAEGLAVOMgY4AQYlBUsyBhICAS8kUTs8RAIBOCgPHScXHQEEMQM9BEpDBTcqI0tFTEABRidQKicoKjEBSTNOHQEGNgVLEAYmBkIFTBgGKQEGSwwFTz8FUQVJBhABKh8BBjwFMgZLTkEXAR8eHyUBUAFPOgEGUQY9AQY3BTUGOwEuPQE0Hj0BNgEXQQFAAUc1ASFDPEYcPkcpHRwXBjkaBAFGMB0cLxcGOUsaBAEjSUExGRs+HwYVBAEGPwVQBhsUPwYdRQQBGz0vOTIwPRkgJQQBBkAYBUY+BioBH0YYBAEGIwYWLxEEAQYlBjkvIkwfMCsGIgQBBkIFSw0FUBoFSxUFTgYTFCIGLxcgBAEbHRcTIjgGBAE6AUcXFxgiPgYEATgXJSJIBgQBEiAdPCEhGQQBKgFKKxxEBk43ATYhGz4nGQ0fBjMlHQgBGQQBPT9KRylFUUUYExs+IgYVDU4BHBw1Ow4fGTZJIj0KD0swCAYBFj0qCAYBGi4NEgYBEwQBOhs+GAYaBAE7Gz4ZBhsEAgEwRhIeARseBAE5MAQBFRwEAgExJhs6BAE5RQQBFTUEAgFOJwE3LAE2KwEgAT0rCBsTLAQCATQtAScBQUJGAUdKQwE5ASMtKTgEAgFLMwFBOzcBFywEARQkBAEVJQQCAUo3IiQVFwQBOSkEASUBQwEjAgEETAQbLiEBMywBE0YpOSMvKCcrAUgkHQkBER0EARIeBAEGHQVHHQVIBhQrGiwTBiQsCAQBFCoEAgFGPlEhDwFRLDMfHwYEAgEhZGFydDphc3luYy9zdHJlYW1fY29udHJvbGxlci5kYXJ0Mm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9hc3luYy9zdHJlYW1faW1wbC5kYXJ0wAB91y8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuYXN5bmM7CgovKiogQWJzdHJhY3QgYW5kIHByaXZhdGUgaW50ZXJmYWNlIGZvciBhIHBsYWNlIHRvIHB1dCBldmVudHMuICovCmFic3RyYWN0IGNsYXNzIF9FdmVudFNpbms8VD4gewogIHZvaWQgX2FkZChUIGRhdGEpOwogIHZvaWQgX2FkZEVycm9yKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKTsKICB2b2lkIF9jbG9zZSgpOwp9CgovKioKICogQWJzdHJhY3QgYW5kIHByaXZhdGUgaW50ZXJmYWNlIGZvciBhIHBsYWNlIHRvIHNlbmQgZXZlbnRzLgogKgogKiBVc2VkIGJ5IGV2ZW50IGJ1ZmZlcmluZyB0byBmaW5hbGx5IGRpc3BhdGNoIHRoZSBwZW5kaW5nIGV2ZW50LCB3aGVyZQogKiBbX0V2ZW50U2lua10gaXMgd2hlcmUgdGhlIGV2ZW50IGZpcnN0IGVudGVycyB0aGUgc3RyZWFtIHN1YnNjcmlwdGlvbiwKICogYW5kIG1heSB5ZXQgYmUgYnVmZmVyZWQuCiAqLwphYnN0cmFjdCBjbGFzcyBfRXZlbnREaXNwYXRjaDxUPiB7CiAgdm9pZCBfc2VuZERhdGEoVCBkYXRhKTsKICB2b2lkIF9zZW5kRXJyb3IoT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpOwogIHZvaWQgX3NlbmREb25lKCk7Cn0KCi8qKgogKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHN0cmVhbSBzdWJzY3JpcHRpb24gb2YgYnVmZmVyaW5nIGV2ZW50cy4KICoKICogVGhlIG9ubHkgcHVibGljIG1ldGhvZHMgYXJlIHRob3NlIG9mIFtTdHJlYW1TdWJzY3JpcHRpb25dLCBzbyBpbnN0YW5jZXMgb2YKICogW19CdWZmZXJpbmdTdHJlYW1TdWJzY3JpcHRpb25dIGNhbiBiZSByZXR1cm5lZCBkaXJlY3RseSBhcyBhCiAqIFtTdHJlYW1TdWJzY3JpcHRpb25dIHdpdGhvdXQgZXhwb3NpbmcgaW50ZXJuYWwgZnVuY3Rpb25hbGl0eS4KICoKICogVGhlIFtTdHJlYW1Db250cm9sbGVyXSBpcyBhIHB1YmxpYyBmYWNpbmcgdmVyc2lvbiBvZiBbU3RyZWFtXSBhbmQgdGhpcyBjbGFzcywKICogd2l0aCBzb21lIG1ldGhvZHMgbWFkZSBwdWJsaWMuCiAqCiAqIFRoZSB1c2VyIGludGVyZmFjZSBvZiBbX0J1ZmZlcmluZ1N0cmVhbVN1YnNjcmlwdGlvbl0gYXJlIHRoZSBmb2xsb3dpbmcKICogbWV0aG9kczoKICoKICogKiBbX2FkZF06IEFkZCBhIGRhdGEgZXZlbnQgdG8gdGhlIHN0cmVhbS4KICogKiBbX2FkZEVycm9yXTogQWRkIGFuIGVycm9yIGV2ZW50IHRvIHRoZSBzdHJlYW0uCiAqICogW19jbG9zZV06IFJlcXVlc3QgdG8gY2xvc2UgdGhlIHN0cmVhbS4KICogKiBbX29uQ2FuY2VsXTogQ2FsbGVkIHdoZW4gdGhlIHN1YnNjcmlwdGlvbiB3aWxsIHByb3ZpZGUgbm8gbW9yZSBldmVudHMsCiAqICAgICBlaXRoZXIgZHVlIHRvIGJlaW5nIGFjdGl2ZWx5IGNhbmNlbGVkLCBvciBhZnRlciBzZW5kaW5nIGEgZG9uZSBldmVudC4KICogKiBbX29uUGF1c2VdOiBDYWxsZWQgd2hlbiB0aGUgc3Vic2NyaXB0aW9uIHdhbnRzIHRoZSBldmVudCBzb3VyY2UgdG8gcGF1c2UuCiAqICogW19vblJlc3VtZV06IENhbGxlZCB3aGVuIGFsbG93aW5nIG5ldyBldmVudHMgYWZ0ZXIgYSBwYXVzZS4KICoKICogVGhlIHVzZXIgc2hvdWxkIG5vdCBhZGQgbmV3IGV2ZW50cyB3aGVuIHRoZSBzdWJzY3JpcHRpb24gcmVxdWVzdHMgYSBwYXVzZWQsCiAqIGJ1dCBpZiBpdCBoYXBwZW5zIGFueXdheSwgdGhlIHN1YnNjcmlwdGlvbiB3aWxsIGVucXVldWUgdGhlIGV2ZW50cyBqdXN0IGFzCiAqIHdoZW4gbmV3IGV2ZW50cyBhcnJpdmUgd2hpbGUgc3RpbGwgZmlyaW5nIGFuIG9sZCBldmVudC4KICovCmNsYXNzIF9CdWZmZXJpbmdTdHJlYW1TdWJzY3JpcHRpb248VD4KICAgIGltcGxlbWVudHMgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+LCBfRXZlbnRTaW5rPFQ+LCBfRXZlbnREaXNwYXRjaDxUPiB7CiAgLyoqIFRoZSBgY2FuY2VsT25FcnJvcmAgZmxhZyBmcm9tIHRoZSBgbGlzdGVuYCBjYWxsLiAqLwogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX0NBTkNFTF9PTl9FUlJPUiA9IDE7CiAgLyoqCiAgICogV2hldGhlciB0aGUgImRvbmUiIGV2ZW50IGhhcyBiZWVuIHJlY2VpdmVkLgogICAqIE5vIGZ1cnRoZXIgZXZlbnRzIGFyZSBhY2NlcHRlZCBhZnRlciB0aGlzLgogICAqLwogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX0NMT1NFRCA9IDI7CiAgLyoqCiAgICogU2V0IGlmIHRoZSBpbnB1dCBoYXMgYmVlbiBhc2tlZCBub3QgdG8gc2VuZCBldmVudHMuCiAgICoKICAgKiBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBiZWluZyBwYXVzZWQsIHNpbmNlIHRoZSBpbnB1dCB3aWxsIHJlbWFpbiBwYXVzZWQKICAgKiBhZnRlciBhIGNhbGwgdG8gW3Jlc3VtZV0gaWYgdGhlcmUgYXJlIHBlbmRpbmcgZXZlbnRzLgogICAqLwogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX0lOUFVUX1BBVVNFRCA9IDQ7CiAgLyoqCiAgICogV2hldGhlciB0aGUgc3Vic2NyaXB0aW9uIGhhcyBiZWVuIGNhbmNlbGVkLgogICAqCiAgICogU2V0IGJ5IGNhbGxpbmcgW2NhbmNlbF0sIG9yIGJ5IGhhbmRsaW5nIGEgImRvbmUiIGV2ZW50LCBvciBhbiAiZXJyb3IiIGV2ZW50CiAgICogd2hlbiBgY2FuY2VsT25FcnJvcmAgaXMgdHJ1ZS4KICAgKi8KICBzdGF0aWMgY29uc3QgaW50IF9TVEFURV9DQU5DRUxFRCA9IDg7CiAgLyoqCiAgICogU2V0IHdoZW4gZWl0aGVyOgogICAqCiAgICogICAqIGFuIGVycm9yIGlzIHNlbnQsIGFuZCBbY2FuY2VsT25FcnJvcl0gaXMgdHJ1ZSwgb3IKICAgKiAgICogYSBkb25lIGV2ZW50IGlzIHNlbnQuCiAgICoKICAgKiBJZiB0aGUgc3Vic2NyaXB0aW9uIGlzIGNhbmNlbGVkIHdoaWxlIF9TVEFURV9XQUlUX0ZPUl9DQU5DRUwgaXMgc2V0LCB0aGUKICAgKiBzdGF0ZSBpcyB1bnNldCwgYW5kIG5vIGZ1cnRoZXIgZXZlbnRzIG11c3QgYmUgZGVsaXZlcmVkLgogICAqLwogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX1dBSVRfRk9SX0NBTkNFTCA9IDE2OwogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX0lOX0NBTExCQUNLID0gMzI7CiAgc3RhdGljIGNvbnN0IGludCBfU1RBVEVfSEFTX1BFTkRJTkcgPSA2NDsKICBzdGF0aWMgY29uc3QgaW50IF9TVEFURV9QQVVTRV9DT1VOVCA9IDEyODsKCiAgLyogRXZlbnQgaGFuZGxlcnMgcHJvdmlkZWQgaW4gY29uc3RydWN0b3IuICovCiAgX0RhdGFIYW5kbGVyPFQ+IF9vbkRhdGE7CiAgRnVuY3Rpb24gX29uRXJyb3I7CiAgX0RvbmVIYW5kbGVyIF9vbkRvbmU7CiAgZmluYWwgWm9uZSBfem9uZSA9IFpvbmUuY3VycmVudDsKCiAgLyoqIEJpdCB2ZWN0b3IgYmFzZWQgb24gc3RhdGUtY29uc3RhbnRzIGFib3ZlLiAqLwogIGludCBfc3RhdGU7CgogIC8vIFRPRE8oZmxvaXRzY2gpOiByZXVzZSBhbm90aGVyIGZpZWxkCiAgLyoqIFRoZSBmdXR1cmUgW19vbkNhbmNlbF0gbWF5IHJldHVybi4gKi8KICBGdXR1cmUgX2NhbmNlbEZ1dHVyZTsKCiAgLyoqCiAgICogUXVldWUgb2YgcGVuZGluZyBldmVudHMuCiAgICoKICAgKiBJcyBjcmVhdGVkIHdoZW4gbmVjZXNzYXJ5LCBvciBzZXQgaW4gY29uc3RydWN0b3IgZm9yIHByZWNvbmZpZ3VyZWQgZXZlbnRzLgogICAqLwogIF9QZW5kaW5nRXZlbnRzPFQ+IF9wZW5kaW5nOwoKICBfQnVmZmVyaW5nU3RyZWFtU3Vic2NyaXB0aW9uKAogICAgICB2b2lkIG9uRGF0YShUIGRhdGEpLCBGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3IpCiAgICAgIDogX3N0YXRlID0gKGNhbmNlbE9uRXJyb3IgPyBfU1RBVEVfQ0FOQ0VMX09OX0VSUk9SIDogMCkgewogICAgdGhpcy5vbkRhdGEob25EYXRhKTsKICAgIHRoaXMub25FcnJvcihvbkVycm9yKTsKICAgIHRoaXMub25Eb25lKG9uRG9uZSk7CiAgfQoKICAvKioKICAgKiBTZXRzIHRoZSBzdWJzY3JpcHRpb24ncyBwZW5kaW5nIGV2ZW50cyBvYmplY3QuCiAgICoKICAgKiBUaGlzIGNhbiBvbmx5IGJlIGRvbmUgb25jZS4gVGhlIHBlbmRpbmcgZXZlbnRzIG9iamVjdCBpcyB1c2VkIGZvciB0aGUKICAgKiByZXN0IG9mIHRoZSBzdWJzY3JpcHRpb24ncyBsaWZlIGN5Y2xlLgogICAqLwogIHZvaWQgX3NldFBlbmRpbmdFdmVudHMoX1BlbmRpbmdFdmVudHM8VD4gcGVuZGluZ0V2ZW50cykgewogICAgYXNzZXJ0KF9wZW5kaW5nID09IG51bGwpOwogICAgaWYgKHBlbmRpbmdFdmVudHMgPT0gbnVsbCkgcmV0dXJuOwogICAgX3BlbmRpbmcgPSBwZW5kaW5nRXZlbnRzOwogICAgaWYgKCFwZW5kaW5nRXZlbnRzLmlzRW1wdHkpIHsKICAgICAgX3N0YXRlIHw9IF9TVEFURV9IQVNfUEVORElORzsKICAgICAgX3BlbmRpbmcuc2NoZWR1bGUodGhpcyk7CiAgICB9CiAgfQoKICAvLyBTdHJlYW1TdWJzY3JpcHRpb24gaW50ZXJmYWNlLgoKICB2b2lkIG9uRGF0YSh2b2lkIGhhbmRsZURhdGEoVCBldmVudCkpIHsKICAgIGhhbmRsZURhdGEgPz89IF9udWxsRGF0YUhhbmRsZXI7CiAgICAvLyBUT0RPKGZsb2l0c2NoKTogdGhlIHJldHVybiB0eXBlIHNob3VsZCBiZSAndm9pZCcsIGFuZCB0aGUgdHlwZQogICAgLy8gc2hvdWxkIGJlIGluZmVycmVkLgogICAgX29uRGF0YSA9IF96b25lLnJlZ2lzdGVyVW5hcnlDYWxsYmFjazxkeW5hbWljLCBUPihoYW5kbGVEYXRhKTsKICB9CgogIHZvaWQgb25FcnJvcihGdW5jdGlvbiBoYW5kbGVFcnJvcikgewogICAgaGFuZGxlRXJyb3IgPz89IF9udWxsRXJyb3JIYW5kbGVyOwogICAgaWYgKGhhbmRsZUVycm9yIGlzIHZvaWQgRnVuY3Rpb24oT2JqZWN0LCBTdGFja1RyYWNlKSkgewogICAgICBfb25FcnJvciA9IF96b25lCiAgICAgICAgICAucmVnaXN0ZXJCaW5hcnlDYWxsYmFjazxkeW5hbWljLCBPYmplY3QsIFN0YWNrVHJhY2U+KGhhbmRsZUVycm9yKTsKICAgIH0gZWxzZSBpZiAoaGFuZGxlRXJyb3IgaXMgdm9pZCBGdW5jdGlvbihPYmplY3QpKSB7CiAgICAgIF9vbkVycm9yID0gX3pvbmUucmVnaXN0ZXJVbmFyeUNhbGxiYWNrPGR5bmFtaWMsIE9iamVjdD4oaGFuZGxlRXJyb3IpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoImhhbmRsZUVycm9yIGNhbGxiYWNrIG11c3QgdGFrZSBlaXRoZXIgYW4gT2JqZWN0ICIKICAgICAgICAgICIodGhlIGVycm9yKSwgb3IgYm90aCBhbiBPYmplY3QgKHRoZSBlcnJvcikgYW5kIGEgU3RhY2tUcmFjZS4iKTsKICAgIH0KICB9CgogIHZvaWQgb25Eb25lKHZvaWQgaGFuZGxlRG9uZSgpKSB7CiAgICBoYW5kbGVEb25lID8/PSBfbnVsbERvbmVIYW5kbGVyOwogICAgX29uRG9uZSA9IF96b25lLnJlZ2lzdGVyQ2FsbGJhY2soaGFuZGxlRG9uZSk7CiAgfQoKICB2b2lkIHBhdXNlKFtGdXR1cmUgcmVzdW1lU2lnbmFsXSkgewogICAgaWYgKF9pc0NhbmNlbGVkKSByZXR1cm47CiAgICBib29sIHdhc1BhdXNlZCA9IF9pc1BhdXNlZDsKICAgIGJvb2wgd2FzSW5wdXRQYXVzZWQgPSBfaXNJbnB1dFBhdXNlZDsKICAgIC8vIEluY3JlbWVudCBwYXVzZSBjb3VudCBhbmQgbWFyayBpbnB1dCBwYXVzZWQgKGlmIGl0IGlzbid0IGFscmVhZHkpLgogICAgX3N0YXRlID0gKF9zdGF0ZSArIF9TVEFURV9QQVVTRV9DT1VOVCkgfCBfU1RBVEVfSU5QVVRfUEFVU0VEOwogICAgaWYgKHJlc3VtZVNpZ25hbCAhPSBudWxsKSByZXN1bWVTaWduYWwud2hlbkNvbXBsZXRlKHJlc3VtZSk7CiAgICBpZiAoIXdhc1BhdXNlZCAmJiBfcGVuZGluZyAhPSBudWxsKSBfcGVuZGluZy5jYW5jZWxTY2hlZHVsZSgpOwogICAgaWYgKCF3YXNJbnB1dFBhdXNlZCAmJiAhX2luQ2FsbGJhY2spIF9ndWFyZENhbGxiYWNrKF9vblBhdXNlKTsKICB9CgogIHZvaWQgcmVzdW1lKCkgewogICAgaWYgKF9pc0NhbmNlbGVkKSByZXR1cm47CiAgICBpZiAoX2lzUGF1c2VkKSB7CiAgICAgIF9kZWNyZW1lbnRQYXVzZUNvdW50KCk7CiAgICAgIGlmICghX2lzUGF1c2VkKSB7CiAgICAgICAgaWYgKF9oYXNQZW5kaW5nICYmICFfcGVuZGluZy5pc0VtcHR5KSB7CiAgICAgICAgICAvLyBJbnB1dCBpcyBzdGlsbCBwYXVzZWQuCiAgICAgICAgICBfcGVuZGluZy5zY2hlZHVsZSh0aGlzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXNzZXJ0KF9tYXlSZXN1bWVJbnB1dCk7CiAgICAgICAgICBfc3RhdGUgJj0gfl9TVEFURV9JTlBVVF9QQVVTRUQ7CiAgICAgICAgICBpZiAoIV9pbkNhbGxiYWNrKSBfZ3VhcmRDYWxsYmFjayhfb25SZXN1bWUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgRnV0dXJlIGNhbmNlbCgpIHsKICAgIC8vIFRoZSB1c2VyIGRvZXNuJ3Qgd2FudCB0byByZWNlaXZlIGFueSBmdXJ0aGVyIGV2ZW50cy4gSWYgdGhlcmUgaXMgYW4KICAgIC8vIGVycm9yIG9yIGRvbmUgZXZlbnQgcGVuZGluZyAod2FpdGluZyBmb3IgdGhlIGNhbmNlbCB0byBiZSBkb25lKSBkaXNjYXJkCiAgICAvLyB0aGF0IGV2ZW50LgogICAgX3N0YXRlICY9IH5fU1RBVEVfV0FJVF9GT1JfQ0FOQ0VMOwogICAgaWYgKCFfaXNDYW5jZWxlZCkgewogICAgICBfY2FuY2VsKCk7CiAgICB9CiAgICByZXR1cm4gX2NhbmNlbEZ1dHVyZSA/PyBGdXR1cmUuX251bGxGdXR1cmU7CiAgfQoKICBGdXR1cmU8RT4gYXNGdXR1cmU8RT4oW0UgZnV0dXJlVmFsdWVdKSB7CiAgICBfRnV0dXJlPEU+IHJlc3VsdCA9IG5ldyBfRnV0dXJlPEU+KCk7CgogICAgLy8gT3ZlcndyaXRlIHRoZSBvbkRvbmUgYW5kIG9uRXJyb3IgaGFuZGxlcnMuCiAgICBfb25Eb25lID0gKCkgewogICAgICByZXN1bHQuX2NvbXBsZXRlKGZ1dHVyZVZhbHVlKTsKICAgIH07CiAgICBfb25FcnJvciA9IChlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICAgIEZ1dHVyZSBjYW5jZWxGdXR1cmUgPSBjYW5jZWwoKTsKICAgICAgaWYgKCFpZGVudGljYWwoY2FuY2VsRnV0dXJlLCBGdXR1cmUuX251bGxGdXR1cmUpKSB7CiAgICAgICAgY2FuY2VsRnV0dXJlLndoZW5Db21wbGV0ZSgoKSB7CiAgICAgICAgICByZXN1bHQuX2NvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdC5fY29tcGxldGVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgIH0KICAgIH07CgogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIFN0YXRlIG1hbmFnZW1lbnQuCgogIGJvb2wgZ2V0IF9pc0lucHV0UGF1c2VkID0+IChfc3RhdGUgJiBfU1RBVEVfSU5QVVRfUEFVU0VEKSAhPSAwOwogIGJvb2wgZ2V0IF9pc0Nsb3NlZCA9PiAoX3N0YXRlICYgX1NUQVRFX0NMT1NFRCkgIT0gMDsKICBib29sIGdldCBfaXNDYW5jZWxlZCA9PiAoX3N0YXRlICYgX1NUQVRFX0NBTkNFTEVEKSAhPSAwOwogIGJvb2wgZ2V0IF93YWl0c0ZvckNhbmNlbCA9PiAoX3N0YXRlICYgX1NUQVRFX1dBSVRfRk9SX0NBTkNFTCkgIT0gMDsKICBib29sIGdldCBfaW5DYWxsYmFjayA9PiAoX3N0YXRlICYgX1NUQVRFX0lOX0NBTExCQUNLKSAhPSAwOwogIGJvb2wgZ2V0IF9oYXNQZW5kaW5nID0+IChfc3RhdGUgJiBfU1RBVEVfSEFTX1BFTkRJTkcpICE9IDA7CiAgYm9vbCBnZXQgX2lzUGF1c2VkID0+IF9zdGF0ZSA+PSBfU1RBVEVfUEFVU0VfQ09VTlQ7CiAgYm9vbCBnZXQgX2NhbkZpcmUgPT4gX3N0YXRlIDwgX1NUQVRFX0lOX0NBTExCQUNLOwogIGJvb2wgZ2V0IF9tYXlSZXN1bWVJbnB1dCA9PgogICAgICAhX2lzUGF1c2VkICYmIChfcGVuZGluZyA9PSBudWxsIHx8IF9wZW5kaW5nLmlzRW1wdHkpOwogIGJvb2wgZ2V0IF9jYW5jZWxPbkVycm9yID0+IChfc3RhdGUgJiBfU1RBVEVfQ0FOQ0VMX09OX0VSUk9SKSAhPSAwOwoKICBib29sIGdldCBpc1BhdXNlZCA9PiBfaXNQYXVzZWQ7CgogIHZvaWQgX2NhbmNlbCgpIHsKICAgIF9zdGF0ZSB8PSBfU1RBVEVfQ0FOQ0VMRUQ7CiAgICBpZiAoX2hhc1BlbmRpbmcpIHsKICAgICAgX3BlbmRpbmcuY2FuY2VsU2NoZWR1bGUoKTsKICAgIH0KICAgIGlmICghX2luQ2FsbGJhY2spIF9wZW5kaW5nID0gbnVsbDsKICAgIF9jYW5jZWxGdXR1cmUgPSBfb25DYW5jZWwoKTsKICB9CgogIC8qKgogICAqIERlY3JlbWVudHMgdGhlIHBhdXNlIGNvdW50LgogICAqCiAgICogRG9lcyBub3QgYXV0b21hdGljYWxseSB1bnBhdXNlIHRoZSBpbnB1dCAoY2FsbCBbX29uUmVzdW1lXSkgd2hlbgogICAqIHRoZSBwYXVzZSBjb3VudCByZWFjaGVzIHplcm8uIFRoaXMgaXMgaGFuZGxlZCBlbHNld2hlcmUsIGFuZCBvbmx5CiAgICogaWYgdGhlcmUgYXJlIG5vIHBlbmRpbmcgZXZlbnRzIGJ1ZmZlcmVkLgogICAqLwogIHZvaWQgX2RlY3JlbWVudFBhdXNlQ291bnQoKSB7CiAgICBhc3NlcnQoX2lzUGF1c2VkKTsKICAgIF9zdGF0ZSAtPSBfU1RBVEVfUEFVU0VfQ09VTlQ7CiAgfQoKICAvLyBfRXZlbnRTaW5rIGludGVyZmFjZS4KCiAgdm9pZCBfYWRkKFQgZGF0YSkgewogICAgYXNzZXJ0KCFfaXNDbG9zZWQpOwogICAgaWYgKF9pc0NhbmNlbGVkKSByZXR1cm47CiAgICBpZiAoX2NhbkZpcmUpIHsKICAgICAgX3NlbmREYXRhKGRhdGEpOwogICAgfSBlbHNlIHsKICAgICAgX2FkZFBlbmRpbmcobmV3IF9EZWxheWVkRGF0YTxUPihkYXRhKSk7CiAgICB9CiAgfQoKICB2b2lkIF9hZGRFcnJvcihPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgaWYgKF9pc0NhbmNlbGVkKSByZXR1cm47CiAgICBpZiAoX2NhbkZpcmUpIHsKICAgICAgX3NlbmRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7IC8vIFJlcG9ydHMgY2FuY2VsIGFmdGVyIHNlbmRpbmcuCiAgICB9IGVsc2UgewogICAgICBfYWRkUGVuZGluZyhuZXcgX0RlbGF5ZWRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSkpOwogICAgfQogIH0KCiAgdm9pZCBfY2xvc2UoKSB7CiAgICBhc3NlcnQoIV9pc0Nsb3NlZCk7CiAgICBpZiAoX2lzQ2FuY2VsZWQpIHJldHVybjsKICAgIF9zdGF0ZSB8PSBfU1RBVEVfQ0xPU0VEOwogICAgaWYgKF9jYW5GaXJlKSB7CiAgICAgIF9zZW5kRG9uZSgpOwogICAgfSBlbHNlIHsKICAgICAgX2FkZFBlbmRpbmcoY29uc3QgX0RlbGF5ZWREb25lKCkpOwogICAgfQogIH0KCiAgLy8gSG9va3MgY2FsbGVkIHdoZW4gdGhlIGlucHV0IGlzIHBhdXNlZCwgdW5wYXVzZWQgb3IgY2FuY2VsZWQuCiAgLy8gVGhlc2UgbXVzdCBub3QgdGhyb3cuIElmIG92ZXJ3cml0dGVuIHRvIGNhbGwgdXNlciBjb2RlLCBpbmNsdWRlIHN1aXRhYmxlCiAgLy8gdHJ5L2NhdGNoIHdyYXBwaW5nIGFuZCBzZW5kIGFueSBlcnJvcnMgdG8KICAvLyBbX1pvbmUuY3VycmVudC5oYW5kbGVVbmNhdWdodEVycm9yXS4KICB2b2lkIF9vblBhdXNlKCkgewogICAgYXNzZXJ0KF9pc0lucHV0UGF1c2VkKTsKICB9CgogIHZvaWQgX29uUmVzdW1lKCkgewogICAgYXNzZXJ0KCFfaXNJbnB1dFBhdXNlZCk7CiAgfQoKICBGdXR1cmUgX29uQ2FuY2VsKCkgewogICAgYXNzZXJ0KF9pc0NhbmNlbGVkKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgLy8gSGFuZGxlIHBlbmRpbmcgZXZlbnRzLgoKICAvKioKICAgKiBBZGQgYSBwZW5kaW5nIGV2ZW50LgogICAqCiAgICogSWYgdGhlIHN1YnNjcmlwdGlvbiBpcyBub3QgcGF1c2VkLCB0aGlzIGFsc28gc2NoZWR1bGVzIGEgZmlyaW5nCiAgICogb2YgcGVuZGluZyBldmVudHMgbGF0ZXIgKGlmIG5lY2Vzc2FyeSkuCiAgICovCiAgdm9pZCBfYWRkUGVuZGluZyhfRGVsYXllZEV2ZW50IGV2ZW50KSB7CiAgICBfU3RyZWFtSW1wbEV2ZW50czxUPiBwZW5kaW5nID0gX3BlbmRpbmc7CiAgICBpZiAoX3BlbmRpbmcgPT0gbnVsbCkgewogICAgICBwZW5kaW5nID0gX3BlbmRpbmcgPSBuZXcgX1N0cmVhbUltcGxFdmVudHM8VD4oKTsKICAgIH0KICAgIHBlbmRpbmcuYWRkKGV2ZW50KTsKICAgIGlmICghX2hhc1BlbmRpbmcpIHsKICAgICAgX3N0YXRlIHw9IF9TVEFURV9IQVNfUEVORElORzsKICAgICAgaWYgKCFfaXNQYXVzZWQpIHsKICAgICAgICBfcGVuZGluZy5zY2hlZHVsZSh0aGlzKTsKICAgICAgfQogICAgfQogIH0KCiAgLyogX0V2ZW50RGlzcGF0Y2ggaW50ZXJmYWNlLiAqLwoKICB2b2lkIF9zZW5kRGF0YShUIGRhdGEpIHsKICAgIGFzc2VydCghX2lzQ2FuY2VsZWQpOwogICAgYXNzZXJ0KCFfaXNQYXVzZWQpOwogICAgYXNzZXJ0KCFfaW5DYWxsYmFjayk7CiAgICBib29sIHdhc0lucHV0UGF1c2VkID0gX2lzSW5wdXRQYXVzZWQ7CiAgICBfc3RhdGUgfD0gX1NUQVRFX0lOX0NBTExCQUNLOwogICAgX3pvbmUucnVuVW5hcnlHdWFyZGVkKF9vbkRhdGEsIGRhdGEpOwogICAgX3N0YXRlICY9IH5fU1RBVEVfSU5fQ0FMTEJBQ0s7CiAgICBfY2hlY2tTdGF0ZSh3YXNJbnB1dFBhdXNlZCk7CiAgfQoKICB2b2lkIF9zZW5kRXJyb3IoT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgIGFzc2VydCghX2lzQ2FuY2VsZWQpOwogICAgYXNzZXJ0KCFfaXNQYXVzZWQpOwogICAgYXNzZXJ0KCFfaW5DYWxsYmFjayk7CiAgICBib29sIHdhc0lucHV0UGF1c2VkID0gX2lzSW5wdXRQYXVzZWQ7CgogICAgdm9pZCBzZW5kRXJyb3IoKSB7CiAgICAgIC8vIElmIHRoZSBzdWJzY3JpcHRpb24gaGFzIGJlZW4gY2FuY2VsZWQgd2hpbGUgd2FpdGluZyBmb3IgdGhlIGNhbmNlbAogICAgICAvLyBmdXR1cmUgdG8gZmluaXNoIHdlIG11c3Qgbm90IHJlcG9ydCB0aGUgZXJyb3IuCiAgICAgIGlmIChfaXNDYW5jZWxlZCAmJiAhX3dhaXRzRm9yQ2FuY2VsKSByZXR1cm47CiAgICAgIF9zdGF0ZSB8PSBfU1RBVEVfSU5fQ0FMTEJBQ0s7CiAgICAgIC8vIFRPRE8oZmxvaXRzY2gpOiB0aGlzIGR5bmFtaWMgc2hvdWxkIGJlICd2b2lkJy4KICAgICAgdmFyIG9uRXJyb3IgPSBfb25FcnJvcjsKICAgICAgaWYgKG9uRXJyb3IgaXMgdm9pZCBGdW5jdGlvbihPYmplY3QsIFN0YWNrVHJhY2UpKSB7CiAgICAgICAgX3pvbmUucnVuQmluYXJ5R3VhcmRlZDxPYmplY3QsIFN0YWNrVHJhY2U+KG9uRXJyb3IsIGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQoX29uRXJyb3IgaXMgdm9pZCBGdW5jdGlvbihPYmplY3QpKTsKICAgICAgICBfem9uZS5ydW5VbmFyeUd1YXJkZWQ8T2JqZWN0Pihfb25FcnJvciwgZXJyb3IpOwogICAgICB9CiAgICAgIF9zdGF0ZSAmPSB+X1NUQVRFX0lOX0NBTExCQUNLOwogICAgfQoKICAgIGlmIChfY2FuY2VsT25FcnJvcikgewogICAgICBfc3RhdGUgfD0gX1NUQVRFX1dBSVRfRk9SX0NBTkNFTDsKICAgICAgX2NhbmNlbCgpOwogICAgICBpZiAoX2NhbmNlbEZ1dHVyZSAhPSBudWxsICYmCiAgICAgICAgICAhaWRlbnRpY2FsKF9jYW5jZWxGdXR1cmUsIEZ1dHVyZS5fbnVsbEZ1dHVyZSkpIHsKICAgICAgICBfY2FuY2VsRnV0dXJlLndoZW5Db21wbGV0ZShzZW5kRXJyb3IpOwogICAgICB9IGVsc2UgewogICAgICAgIHNlbmRFcnJvcigpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBzZW5kRXJyb3IoKTsKICAgICAgLy8gT25seSBjaGVjayBzdGF0ZSBpZiBub3QgY2FuY2VsT25FcnJvci4KICAgICAgX2NoZWNrU3RhdGUod2FzSW5wdXRQYXVzZWQpOwogICAgfQogIH0KCiAgdm9pZCBfc2VuZERvbmUoKSB7CiAgICBhc3NlcnQoIV9pc0NhbmNlbGVkKTsKICAgIGFzc2VydCghX2lzUGF1c2VkKTsKICAgIGFzc2VydCghX2luQ2FsbGJhY2spOwoKICAgIHZvaWQgc2VuZERvbmUoKSB7CiAgICAgIC8vIElmIHRoZSBzdWJzY3JpcHRpb24gaGFzIGJlZW4gY2FuY2VsZWQgd2hpbGUgd2FpdGluZyBmb3IgdGhlIGNhbmNlbAogICAgICAvLyBmdXR1cmUgdG8gZmluaXNoIHdlIG11c3Qgbm90IHJlcG9ydCB0aGUgZG9uZSBldmVudC4KICAgICAgaWYgKCFfd2FpdHNGb3JDYW5jZWwpIHJldHVybjsKICAgICAgX3N0YXRlIHw9IChfU1RBVEVfQ0FOQ0VMRUQgfCBfU1RBVEVfQ0xPU0VEIHwgX1NUQVRFX0lOX0NBTExCQUNLKTsKICAgICAgX3pvbmUucnVuR3VhcmRlZChfb25Eb25lKTsKICAgICAgX3N0YXRlICY9IH5fU1RBVEVfSU5fQ0FMTEJBQ0s7CiAgICB9CgogICAgX2NhbmNlbCgpOwogICAgX3N0YXRlIHw9IF9TVEFURV9XQUlUX0ZPUl9DQU5DRUw7CiAgICBpZiAoX2NhbmNlbEZ1dHVyZSAhPSBudWxsICYmCiAgICAgICAgIWlkZW50aWNhbChfY2FuY2VsRnV0dXJlLCBGdXR1cmUuX251bGxGdXR1cmUpKSB7CiAgICAgIF9jYW5jZWxGdXR1cmUud2hlbkNvbXBsZXRlKHNlbmREb25lKTsKICAgIH0gZWxzZSB7CiAgICAgIHNlbmREb25lKCk7CiAgICB9CiAgfQoKICAvKioKICAgKiBDYWxsIGEgaG9vayBmdW5jdGlvbi4KICAgKgogICAqIFRoZSBjYWxsIGlzIHByb3Blcmx5IHdyYXBwZWQgaW4gY29kZSB0byBhdm9pZCBvdGhlciBjYWxsYmFja3MKICAgKiBkdXJpbmcgdGhlIGNhbGwsIGFuZCBpdCBjaGVja3MgZm9yIHN0YXRlIGNoYW5nZXMgYWZ0ZXIgdGhlIGNhbGwKICAgKiB0aGF0IHNob3VsZCBjYXVzZSBmdXJ0aGVyIGNhbGxiYWNrcy4KICAgKi8KICB2b2lkIF9ndWFyZENhbGxiYWNrKHZvaWQgY2FsbGJhY2soKSkgewogICAgYXNzZXJ0KCFfaW5DYWxsYmFjayk7CiAgICBib29sIHdhc0lucHV0UGF1c2VkID0gX2lzSW5wdXRQYXVzZWQ7CiAgICBfc3RhdGUgfD0gX1NUQVRFX0lOX0NBTExCQUNLOwogICAgY2FsbGJhY2soKTsKICAgIF9zdGF0ZSAmPSB+X1NUQVRFX0lOX0NBTExCQUNLOwogICAgX2NoZWNrU3RhdGUod2FzSW5wdXRQYXVzZWQpOwogIH0KCiAgLyoqCiAgICogQ2hlY2sgaWYgdGhlIGlucHV0IG5lZWRzIHRvIGJlIGluZm9ybWVkIG9mIHN0YXRlIGNoYW5nZXMuCiAgICoKICAgKiBTdGF0ZSBjaGFuZ2VzIGFyZSBwYXVzaW5nLCByZXN1bWluZyBhbmQgY2FuY2VsaW5nLgogICAqCiAgICogQWZ0ZXIgY2FuY2VsaW5nLCBubyBmdXJ0aGVyIGNhbGxiYWNrcyB3aWxsIGhhcHBlbi4KICAgKgogICAqIFRoZSBjYW5jZWwgY2FsbGJhY2sgaXMgY2FsbGVkIGFmdGVyIGEgdXNlciBjYW5jZWwsIG9yIGFmdGVyCiAgICogdGhlIGZpbmFsIGRvbmUgZXZlbnQgaXMgc2VudC4KICAgKi8KICB2b2lkIF9jaGVja1N0YXRlKGJvb2wgd2FzSW5wdXRQYXVzZWQpIHsKICAgIGFzc2VydCghX2luQ2FsbGJhY2spOwogICAgaWYgKF9oYXNQZW5kaW5nICYmIF9wZW5kaW5nLmlzRW1wdHkpIHsKICAgICAgX3N0YXRlICY9IH5fU1RBVEVfSEFTX1BFTkRJTkc7CiAgICAgIGlmIChfaXNJbnB1dFBhdXNlZCAmJiBfbWF5UmVzdW1lSW5wdXQpIHsKICAgICAgICBfc3RhdGUgJj0gfl9TVEFURV9JTlBVVF9QQVVTRUQ7CiAgICAgIH0KICAgIH0KICAgIC8vIElmIHRoZSBzdGF0ZSBjaGFuZ2VzIGR1cmluZyBhIGNhbGxiYWNrLCB3ZSBpbW1lZGlhdGVseQogICAgLy8gbWFrZSBhIG5ldyBzdGF0ZS1jaGFuZ2UgY2FsbGJhY2suIExvb3AgdW50aWwgdGhlIHN0YXRlIGRpZG4ndCBjaGFuZ2UuCiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoX2lzQ2FuY2VsZWQpIHsKICAgICAgICBfcGVuZGluZyA9IG51bGw7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGJvb2wgaXNJbnB1dFBhdXNlZCA9IF9pc0lucHV0UGF1c2VkOwogICAgICBpZiAod2FzSW5wdXRQYXVzZWQgPT0gaXNJbnB1dFBhdXNlZCkgYnJlYWs7CiAgICAgIF9zdGF0ZSBePSBfU1RBVEVfSU5fQ0FMTEJBQ0s7CiAgICAgIGlmIChpc0lucHV0UGF1c2VkKSB7CiAgICAgICAgX29uUGF1c2UoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfb25SZXN1bWUoKTsKICAgICAgfQogICAgICBfc3RhdGUgJj0gfl9TVEFURV9JTl9DQUxMQkFDSzsKICAgICAgd2FzSW5wdXRQYXVzZWQgPSBpc0lucHV0UGF1c2VkOwogICAgfQogICAgaWYgKF9oYXNQZW5kaW5nICYmICFfaXNQYXVzZWQpIHsKICAgICAgX3BlbmRpbmcuc2NoZWR1bGUodGhpcyk7CiAgICB9CiAgfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIENvbW1vbiBiYXNlIGNsYXNzIGZvciBzaW5nbGUgYW5kIG11bHRpLXN1YnNjcmlwdGlvbiBzdHJlYW1zLgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmFic3RyYWN0IGNsYXNzIF9TdHJlYW1JbXBsPFQ+IGV4dGVuZHMgU3RyZWFtPFQ+IHsKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBTdHJlYW0gaW50ZXJmYWNlLgoKICBTdHJlYW1TdWJzY3JpcHRpb248VD4gbGlzdGVuKHZvaWQgb25EYXRhKFQgZGF0YSksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICBjYW5jZWxPbkVycm9yID0gaWRlbnRpY2FsKHRydWUsIGNhbmNlbE9uRXJyb3IpOwogICAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbiA9CiAgICAgICAgX2NyZWF0ZVN1YnNjcmlwdGlvbihvbkRhdGEsIG9uRXJyb3IsIG9uRG9uZSwgY2FuY2VsT25FcnJvcik7CiAgICBfb25MaXN0ZW4oc3Vic2NyaXB0aW9uKTsKICAgIHJldHVybiBzdWJzY3JpcHRpb247CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLyoqIENyZWF0ZSBhIHN1YnNjcmlwdGlvbiBvYmplY3QuIENhbGxlZCBieSBbc3ViY3JpYmVdLiAqLwogIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBfY3JlYXRlU3Vic2NyaXB0aW9uKHZvaWQgb25EYXRhKFQgZGF0YSksCiAgICAgIEZ1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcikgewogICAgcmV0dXJuIG5ldyBfQnVmZmVyaW5nU3RyZWFtU3Vic2NyaXB0aW9uPFQ+KAogICAgICAgIG9uRGF0YSwgb25FcnJvciwgb25Eb25lLCBjYW5jZWxPbkVycm9yKTsKICB9CgogIC8qKiBIb29rIGNhbGxlZCB3aGVuIHRoZSBzdWJzY3JpcHRpb24gaGFzIGJlZW4gY3JlYXRlZC4gKi8KICB2b2lkIF9vbkxpc3RlbihTdHJlYW1TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uKSB7fQp9Cgp0eXBlZGVmIF9QZW5kaW5nRXZlbnRzPFQ+IF9FdmVudEdlbmVyYXRvcjxUPigpOwoKLyoqIFN0cmVhbSB0aGF0IGdlbmVyYXRlcyBpdHMgb3duIGV2ZW50cy4gKi8KY2xhc3MgX0dlbmVyYXRlZFN0cmVhbUltcGw8VD4gZXh0ZW5kcyBfU3RyZWFtSW1wbDxUPiB7CiAgZmluYWwgX0V2ZW50R2VuZXJhdG9yPFQ+IF9wZW5kaW5nOwogIGJvb2wgX2lzVXNlZCA9IGZhbHNlOwogIC8qKgogICAqIEluaXRpYWxpemVzIHRoZSBzdHJlYW0gdG8gaGF2ZSBvbmx5IHRoZSBldmVudHMgcHJvdmlkZWQgYnkgYQogICAqIFtfUGVuZGluZ0V2ZW50c10uCiAgICoKICAgKiBBIG5ldyBbX1BlbmRpbmdFdmVudHNdIG11c3QgYmUgZ2VuZXJhdGVkIGZvciBlYWNoIGxpc3Rlbi4KICAgKi8KICBfR2VuZXJhdGVkU3RyZWFtSW1wbCh0aGlzLl9wZW5kaW5nKTsKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IF9jcmVhdGVTdWJzY3JpcHRpb24odm9pZCBvbkRhdGEoVCBkYXRhKSwKICAgICAgRnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yKSB7CiAgICBpZiAoX2lzVXNlZCkgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIlN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGxpc3RlbmVkIHRvLiIpOwogICAgX2lzVXNlZCA9IHRydWU7CiAgICByZXR1cm4gbmV3IF9CdWZmZXJpbmdTdHJlYW1TdWJzY3JpcHRpb248VD4oCiAgICAgICAgb25EYXRhLCBvbkVycm9yLCBvbkRvbmUsIGNhbmNlbE9uRXJyb3IpCiAgICAgIC4uX3NldFBlbmRpbmdFdmVudHMoX3BlbmRpbmcoKSk7CiAgfQp9CgovKiogUGVuZGluZyBldmVudHMgb2JqZWN0IHRoYXQgZ2V0cyBpdHMgZXZlbnRzIGZyb20gYW4gW0l0ZXJhYmxlXS4gKi8KY2xhc3MgX0l0ZXJhYmxlUGVuZGluZ0V2ZW50czxUPiBleHRlbmRzIF9QZW5kaW5nRXZlbnRzPFQ+IHsKICAvLyBUaGUgaXRlcmF0b3IgcHJvdmlkaW5nIGRhdGEgZm9yIGRhdGEgZXZlbnRzLgogIC8vIFNldCB0byBudWxsIHdoZW4gaXRlcmF0aW9uIGhhcyBjb21wbGV0ZWQuCiAgSXRlcmF0b3I8VD4gX2l0ZXJhdG9yOwoKICBfSXRlcmFibGVQZW5kaW5nRXZlbnRzKEl0ZXJhYmxlPFQ+IGRhdGEpIDogX2l0ZXJhdG9yID0gZGF0YS5pdGVyYXRvcjsKCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfaXRlcmF0b3IgPT0gbnVsbDsKCiAgdm9pZCBoYW5kbGVOZXh0KF9FdmVudERpc3BhdGNoPFQ+IGRpc3BhdGNoKSB7CiAgICBpZiAoX2l0ZXJhdG9yID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIk5vIGV2ZW50cyBwZW5kaW5nLiIpOwogICAgfQogICAgLy8gU2VuZCBvbmUgZXZlbnQgcGVyIGNhbGwgdG8gbW92ZU5leHQuCiAgICAvLyBJZiBtb3ZlTmV4dCByZXR1cm5zIHRydWUsIHNlbmQgdGhlIGN1cnJlbnQgZWxlbWVudCBhcyBkYXRhLgogICAgLy8gSWYgY3VycmVudCB0aHJvd3MsIHNlbmQgdGhhdCBlcnJvciwgYnV0IGtlZXAgaXRlcmF0aW5nLgogICAgLy8gSWYgbW92ZU5leHQgcmV0dXJucyBmYWxzZSwgc2VuZCBhIGRvbmUgZXZlbnQgYW5kIGNsZWFyIHRoZSBfaXRlcmF0b3IuCiAgICAvLyBJZiBtb3ZlTmV4dCB0aHJvd3MgYW4gZXJyb3IsIHNlbmQgYW4gZXJyb3IgYW5kIHByZXBhcmUgdG8gc2VuZCBhIGRvbmUKICAgIC8vIGV2ZW50IGFmdGVyd2FyZHMuCiAgICBib29sIGhhc01vcmU7CiAgICB0cnkgewogICAgICBoYXNNb3JlID0gX2l0ZXJhdG9yLm1vdmVOZXh0KCk7CiAgICAgIGlmIChoYXNNb3JlKSB7CiAgICAgICAgZGlzcGF0Y2guX3NlbmREYXRhKF9pdGVyYXRvci5jdXJyZW50KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfaXRlcmF0b3IgPSBudWxsOwogICAgICAgIGRpc3BhdGNoLl9zZW5kRG9uZSgpOwogICAgICB9CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIGlmIChoYXNNb3JlID09IG51bGwpIHsKICAgICAgICAvLyBUaHJldyBpbiAubW92ZU5leHQoKS4KICAgICAgICAvLyBFbnN1cmUgdGhhdCB3ZSBzZW5kIGEgZG9uZSBhZnRlcndhcmRzLgogICAgICAgIF9pdGVyYXRvciA9IGNvbnN0IEVtcHR5SXRlcmF0b3I8TnVsbD4oKTsKICAgICAgICBkaXNwYXRjaC5fc2VuZEVycm9yKGUsIHMpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRocmV3IGluIC5jdXJyZW50LgogICAgICAgIGRpc3BhdGNoLl9zZW5kRXJyb3IoZSwgcyk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgY2xlYXIoKSB7CiAgICBpZiAoaXNTY2hlZHVsZWQpIGNhbmNlbFNjaGVkdWxlKCk7CiAgICBfaXRlcmF0b3IgPSBudWxsOwogIH0KfQoKLy8gSW50ZXJuYWwgaGVscGVycy4KCi8vIFR5cGVzIG9mIHRoZSBkaWZmZXJlbnQgaGFuZGxlcnMgb24gYSBzdHJlYW0uIFR5cGVzIHVzZWQgdG8gdHlwZSBmaWVsZHMuCnR5cGVkZWYgdm9pZCBfRGF0YUhhbmRsZXI8VD4oVCB2YWx1ZSk7CnR5cGVkZWYgdm9pZCBfRG9uZUhhbmRsZXIoKTsKCi8qKiBEZWZhdWx0IGRhdGEgaGFuZGxlciwgZG9lcyBub3RoaW5nLiAqLwp2b2lkIF9udWxsRGF0YUhhbmRsZXIoT2JqZWN0IHZhbHVlKSB7fQoKLyoqIERlZmF1bHQgZXJyb3IgaGFuZGxlciwgcmVwb3J0cyB0aGUgZXJyb3IgdG8gdGhlIGN1cnJlbnQgem9uZSdzIGhhbmRsZXIuICovCnZvaWQgX251bGxFcnJvckhhbmRsZXIoT2JqZWN0IGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSkgewogIFpvbmUuY3VycmVudC5oYW5kbGVVbmNhdWdodEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKfQoKLyoqIERlZmF1bHQgZG9uZSBoYW5kbGVyLCBkb2VzIG5vdGhpbmcuICovCnZvaWQgX251bGxEb25lSGFuZGxlcigpIHt9CgovKiogQSBkZWxheWVkIGV2ZW50IG9uIGEgYnVmZmVyaW5nIHN0cmVhbSBzdWJzY3JpcHRpb24uICovCmFic3RyYWN0IGNsYXNzIF9EZWxheWVkRXZlbnQ8VD4gewogIC8qKiBBZGRlZCBhcyBhIGxpbmtlZCBsaXN0IG9uIHRoZSBbU3RyZWFtQ29udHJvbGxlcl0uICovCiAgX0RlbGF5ZWRFdmVudCBuZXh0OwogIC8qKiBFeGVjdXRlIHRoZSBkZWxheWVkIGV2ZW50IG9uIHRoZSBbU3RyZWFtQ29udHJvbGxlcl0uICovCiAgdm9pZCBwZXJmb3JtKF9FdmVudERpc3BhdGNoPFQ+IGRpc3BhdGNoKTsKfQoKLyoqIEEgZGVsYXllZCBkYXRhIGV2ZW50LiAqLwpjbGFzcyBfRGVsYXllZERhdGE8VD4gZXh0ZW5kcyBfRGVsYXllZEV2ZW50PFQ+IHsKICBmaW5hbCBUIHZhbHVlOwogIF9EZWxheWVkRGF0YSh0aGlzLnZhbHVlKTsKICB2b2lkIHBlcmZvcm0oX0V2ZW50RGlzcGF0Y2g8VD4gZGlzcGF0Y2gpIHsKICAgIGRpc3BhdGNoLl9zZW5kRGF0YSh2YWx1ZSk7CiAgfQp9CgovKiogQSBkZWxheWVkIGVycm9yIGV2ZW50LiAqLwpjbGFzcyBfRGVsYXllZEVycm9yIGV4dGVuZHMgX0RlbGF5ZWRFdmVudCB7CiAgZmluYWwgZXJyb3I7CiAgZmluYWwgU3RhY2tUcmFjZSBzdGFja1RyYWNlOwoKICBfRGVsYXllZEVycm9yKHRoaXMuZXJyb3IsIHRoaXMuc3RhY2tUcmFjZSk7CiAgdm9pZCBwZXJmb3JtKF9FdmVudERpc3BhdGNoIGRpc3BhdGNoKSB7CiAgICBkaXNwYXRjaC5fc2VuZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9Cn0KCi8qKiBBIGRlbGF5ZWQgZG9uZSBldmVudC4gKi8KY2xhc3MgX0RlbGF5ZWREb25lIGltcGxlbWVudHMgX0RlbGF5ZWRFdmVudCB7CiAgY29uc3QgX0RlbGF5ZWREb25lKCk7CiAgdm9pZCBwZXJmb3JtKF9FdmVudERpc3BhdGNoIGRpc3BhdGNoKSB7CiAgICBkaXNwYXRjaC5fc2VuZERvbmUoKTsKICB9CgogIF9EZWxheWVkRXZlbnQgZ2V0IG5leHQgPT4gbnVsbDsKCiAgdm9pZCBzZXQgbmV4dChfRGVsYXllZEV2ZW50IF8pIHsKICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJObyBldmVudHMgYWZ0ZXIgYSBkb25lLiIpOwogIH0KfQoKLyoqIFN1cGVyY2xhc3MgZm9yIHByb3ZpZGVyIG9mIHBlbmRpbmcgZXZlbnRzLiAqLwphYnN0cmFjdCBjbGFzcyBfUGVuZGluZ0V2ZW50czxUPiB7CiAgLy8gTm8gYXN5bmMgZXZlbnQgaGFzIGJlZW4gc2NoZWR1bGVkLgogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX1VOU0NIRURVTEVEID0gMDsKICAvLyBBbiBhc3luYyBldmVudCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gcnVuIGEgZnVuY3Rpb24uCiAgc3RhdGljIGNvbnN0IGludCBfU1RBVEVfU0NIRURVTEVEID0gMTsKICAvLyBBbiBhc3luYyBldmVudCBoYXMgYmVlbiBzY2hlZHVsZWQsIGJ1dCBpdCB3aWxsIGRvIG5vdGhpbmcgd2hlbiBpdCBydW5zLgogIC8vIEFzeW5jIGV2ZW50cyBjYW4ndCBiZSBwcmVlbXB0ZWQuCiAgc3RhdGljIGNvbnN0IGludCBfU1RBVEVfQ0FOQ0VMRUQgPSAzOwoKICAvKioKICAgKiBTdGF0ZSBvZiBiZWluZyBzY2hlZHVsZWQuCiAgICoKICAgKiBTZXQgdG8gW19TVEFURV9TQ0hFRFVMRURdIHdoZW4gcGVuZGluZyBldmVudHMgYXJlIHNjaGVkdWxlZCBmb3IKICAgKiBhc3luYyBkaXNwYXRjaC4gU2luY2Ugd2UgY2FuJ3QgY2FuY2VsIGEgW3NjaGVkdWxlTWljcm90YXNrXSBjYWxsLCBpZgogICAqIHNjaGVkdWxpbmcgaXMgImNhbmNlbGVkIiwgdGhlIF9zdGF0ZSBpcyBzaW1wbHkgc2V0IHRvIFtfU1RBVEVfQ0FOQ0VMRURdCiAgICogd2hpY2ggd2lsbCBtYWtlIHRoZSBhc3luYyBjb2RlIGRvIG5vdGhpbmcgZXhjZXB0IHJlc2V0dGluZyBbX3N0YXRlXS4KICAgKgogICAqIElmIGV2ZW50cyBhcmUgc2NoZWR1bGVkIHdoaWxlIHRoZSBzdGF0ZSBpcyBbX1NUQVRFX0NBTkNFTEVEXSwgaXQgaXMKICAgKiBtZXJlbHkgc3dpdGNoZWQgYmFjayB0byBbX1NUQVRFX1NDSEVEVUxFRF0sIGJ1dCBubyBuZXcgY2FsbCB0bwogICAqIFtzY2hlZHVsZU1pY3JvdGFza10gaXMgcGVyZm9ybWVkLgogICAqLwogIGludCBfc3RhdGUgPSBfU1RBVEVfVU5TQ0hFRFVMRUQ7CgogIGJvb2wgZ2V0IGlzRW1wdHk7CgogIGJvb2wgZ2V0IGlzU2NoZWR1bGVkID0+IF9zdGF0ZSA9PSBfU1RBVEVfU0NIRURVTEVEOwogIGJvb2wgZ2V0IF9ldmVudFNjaGVkdWxlZCA9PiBfc3RhdGUgPj0gX1NUQVRFX1NDSEVEVUxFRDsKCiAgLyoqCiAgICogU2NoZWR1bGUgYW4gZXZlbnQgdG8gcnVuIGxhdGVyLgogICAqCiAgICogSWYgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLCBpdCBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIHNhbWUgZGlzcGF0Y2ggYXMKICAgKiBhcmd1bWVudCBlYWNoIHRpbWUuIEl0IG1heSByZXVzZSBhbiBlYXJsaWVyIGFyZ3VtZW50IGluIHNvbWUgY2FzZXMuCiAgICovCiAgdm9pZCBzY2hlZHVsZShfRXZlbnREaXNwYXRjaDxUPiBkaXNwYXRjaCkgewogICAgaWYgKGlzU2NoZWR1bGVkKSByZXR1cm47CiAgICBhc3NlcnQoIWlzRW1wdHkpOwogICAgaWYgKF9ldmVudFNjaGVkdWxlZCkgewogICAgICBhc3NlcnQoX3N0YXRlID09IF9TVEFURV9DQU5DRUxFRCk7CiAgICAgIF9zdGF0ZSA9IF9TVEFURV9TQ0hFRFVMRUQ7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHNjaGVkdWxlTWljcm90YXNrKCgpIHsKICAgICAgaW50IG9sZFN0YXRlID0gX3N0YXRlOwogICAgICBfc3RhdGUgPSBfU1RBVEVfVU5TQ0hFRFVMRUQ7CiAgICAgIGlmIChvbGRTdGF0ZSA9PSBfU1RBVEVfQ0FOQ0VMRUQpIHJldHVybjsKICAgICAgaGFuZGxlTmV4dChkaXNwYXRjaCk7CiAgICB9KTsKICAgIF9zdGF0ZSA9IF9TVEFURV9TQ0hFRFVMRUQ7CiAgfQoKICB2b2lkIGNhbmNlbFNjaGVkdWxlKCkgewogICAgaWYgKGlzU2NoZWR1bGVkKSBfc3RhdGUgPSBfU1RBVEVfQ0FOQ0VMRUQ7CiAgfQoKICB2b2lkIGhhbmRsZU5leHQoX0V2ZW50RGlzcGF0Y2g8VD4gZGlzcGF0Y2gpOwoKICAvKiogVGhyb3cgYXdheSBhbnkgcGVuZGluZyBldmVudHMgYW5kIGNhbmNlbCBzY2hlZHVsZWQgZXZlbnRzLiAqLwogIHZvaWQgY2xlYXIoKTsKfQoKLyoqIENsYXNzIGhvbGRpbmcgcGVuZGluZyBldmVudHMgZm9yIGEgW19TdHJlYW1JbXBsXS4gKi8KY2xhc3MgX1N0cmVhbUltcGxFdmVudHM8VD4gZXh0ZW5kcyBfUGVuZGluZ0V2ZW50czxUPiB7CiAgLy8vIFNpbmdsZSBsaW5rZWQgbGlzdCBvZiBbX0RlbGF5ZWRFdmVudF0gb2JqZWN0cy4KICBfRGVsYXllZEV2ZW50IGZpcnN0UGVuZGluZ0V2ZW50OwoKICAvLy8gTGFzdCBlbGVtZW50IGluIHRoZSBsaXN0IG9mIHBlbmRpbmcgZXZlbnRzLiBOZXcgZXZlbnRzIGFyZSBhZGRlZCBhZnRlciBpdC4KICBfRGVsYXllZEV2ZW50IGxhc3RQZW5kaW5nRXZlbnQ7CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gbGFzdFBlbmRpbmdFdmVudCA9PSBudWxsOwoKICB2b2lkIGFkZChfRGVsYXllZEV2ZW50IGV2ZW50KSB7CiAgICBpZiAobGFzdFBlbmRpbmdFdmVudCA9PSBudWxsKSB7CiAgICAgIGZpcnN0UGVuZGluZ0V2ZW50ID0gbGFzdFBlbmRpbmdFdmVudCA9IGV2ZW50OwogICAgfSBlbHNlIHsKICAgICAgbGFzdFBlbmRpbmdFdmVudCA9IGxhc3RQZW5kaW5nRXZlbnQubmV4dCA9IGV2ZW50OwogICAgfQogIH0KCiAgdm9pZCBoYW5kbGVOZXh0KF9FdmVudERpc3BhdGNoPFQ+IGRpc3BhdGNoKSB7CiAgICBhc3NlcnQoIWlzU2NoZWR1bGVkKTsKICAgIF9EZWxheWVkRXZlbnQgZXZlbnQgPSBmaXJzdFBlbmRpbmdFdmVudDsKICAgIGZpcnN0UGVuZGluZ0V2ZW50ID0gZXZlbnQubmV4dDsKICAgIGlmIChmaXJzdFBlbmRpbmdFdmVudCA9PSBudWxsKSB7CiAgICAgIGxhc3RQZW5kaW5nRXZlbnQgPSBudWxsOwogICAgfQogICAgZXZlbnQucGVyZm9ybShkaXNwYXRjaCk7CiAgfQoKICB2b2lkIGNsZWFyKCkgewogICAgaWYgKGlzU2NoZWR1bGVkKSBjYW5jZWxTY2hlZHVsZSgpOwogICAgZmlyc3RQZW5kaW5nRXZlbnQgPSBsYXN0UGVuZGluZ0V2ZW50ID0gbnVsbDsKICB9Cn0KCnR5cGVkZWYgdm9pZCBfQnJvYWRjYXN0Q2FsbGJhY2s8VD4oU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbik7CgovKioKICogRG9uZSBzdWJzY3JpcHRpb24gdGhhdCB3aWxsIHNlbmQgb25lIGRvbmUgZXZlbnQgYXMgc29vbiBhcyBwb3NzaWJsZS4KICovCmNsYXNzIF9Eb25lU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IGltcGxlbWVudHMgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHsKICBzdGF0aWMgY29uc3QgaW50IF9ET05FX1NFTlQgPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgX1NDSEVEVUxFRCA9IDI7CiAgc3RhdGljIGNvbnN0IGludCBfUEFVU0VEID0gNDsKCiAgZmluYWwgWm9uZSBfem9uZTsKICBpbnQgX3N0YXRlID0gMDsKICBfRG9uZUhhbmRsZXIgX29uRG9uZTsKCiAgX0RvbmVTdHJlYW1TdWJzY3JpcHRpb24odGhpcy5fb25Eb25lKSA6IF96b25lID0gWm9uZS5jdXJyZW50IHsKICAgIF9zY2hlZHVsZSgpOwogIH0KCiAgYm9vbCBnZXQgX2lzU2VudCA9PiAoX3N0YXRlICYgX0RPTkVfU0VOVCkgIT0gMDsKICBib29sIGdldCBfaXNTY2hlZHVsZWQgPT4gKF9zdGF0ZSAmIF9TQ0hFRFVMRUQpICE9IDA7CiAgYm9vbCBnZXQgaXNQYXVzZWQgPT4gX3N0YXRlID49IF9QQVVTRUQ7CgogIHZvaWQgX3NjaGVkdWxlKCkgewogICAgaWYgKF9pc1NjaGVkdWxlZCkgcmV0dXJuOwogICAgX3pvbmUuc2NoZWR1bGVNaWNyb3Rhc2soX3NlbmREb25lKTsKICAgIF9zdGF0ZSB8PSBfU0NIRURVTEVEOwogIH0KCiAgdm9pZCBvbkRhdGEodm9pZCBoYW5kbGVEYXRhKFQgZGF0YSkpIHt9CiAgdm9pZCBvbkVycm9yKEZ1bmN0aW9uIGhhbmRsZUVycm9yKSB7fQogIHZvaWQgb25Eb25lKHZvaWQgaGFuZGxlRG9uZSgpKSB7CiAgICBfb25Eb25lID0gaGFuZGxlRG9uZTsKICB9CgogIHZvaWQgcGF1c2UoW0Z1dHVyZSByZXN1bWVTaWduYWxdKSB7CiAgICBfc3RhdGUgKz0gX1BBVVNFRDsKICAgIGlmIChyZXN1bWVTaWduYWwgIT0gbnVsbCkgcmVzdW1lU2lnbmFsLndoZW5Db21wbGV0ZShyZXN1bWUpOwogIH0KCiAgdm9pZCByZXN1bWUoKSB7CiAgICBpZiAoaXNQYXVzZWQpIHsKICAgICAgX3N0YXRlIC09IF9QQVVTRUQ7CiAgICAgIGlmICghaXNQYXVzZWQgJiYgIV9pc1NlbnQpIHsKICAgICAgICBfc2NoZWR1bGUoKTsKICAgICAgfQogICAgfQogIH0KCiAgRnV0dXJlIGNhbmNlbCgpID0+IEZ1dHVyZS5fbnVsbEZ1dHVyZTsKCiAgRnV0dXJlPEU+IGFzRnV0dXJlPEU+KFtFIGZ1dHVyZVZhbHVlXSkgewogICAgX0Z1dHVyZTxFPiByZXN1bHQgPSBuZXcgX0Z1dHVyZTxFPigpOwogICAgX29uRG9uZSA9ICgpIHsKICAgICAgcmVzdWx0Ll9jb21wbGV0ZVdpdGhWYWx1ZShmdXR1cmVWYWx1ZSk7CiAgICB9OwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgX3NlbmREb25lKCkgewogICAgX3N0YXRlICY9IH5fU0NIRURVTEVEOwogICAgaWYgKGlzUGF1c2VkKSByZXR1cm47CiAgICBfc3RhdGUgfD0gX0RPTkVfU0VOVDsKICAgIGlmIChfb25Eb25lICE9IG51bGwpIF96b25lLnJ1bkd1YXJkZWQoX29uRG9uZSk7CiAgfQp9CgpjbGFzcyBfQXNCcm9hZGNhc3RTdHJlYW08VD4gZXh0ZW5kcyBTdHJlYW08VD4gewogIGZpbmFsIFN0cmVhbTxUPiBfc291cmNlOwogIGZpbmFsIF9Ccm9hZGNhc3RDYWxsYmFjazxUPiBfb25MaXN0ZW5IYW5kbGVyOwogIGZpbmFsIF9Ccm9hZGNhc3RDYWxsYmFjazxUPiBfb25DYW5jZWxIYW5kbGVyOwogIGZpbmFsIFpvbmUgX3pvbmU7CgogIF9Bc0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXI8VD4gX2NvbnRyb2xsZXI7CiAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IF9zdWJzY3JpcHRpb247CgogIF9Bc0Jyb2FkY2FzdFN0cmVhbSgKICAgICAgdGhpcy5fc291cmNlLAogICAgICB2b2lkIG9uTGlzdGVuSGFuZGxlcihTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKSwKICAgICAgdm9pZCBvbkNhbmNlbEhhbmRsZXIoU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbikpCiAgICAgIC8vIFRPRE8oZmxvaXRzY2gpOiB0aGUgcmV0dXJuIHR5cGUgc2hvdWxkIGJlIHZvaWQgYW5kIHNob3VsZCBiZQogICAgICAvLyBpbmZlcnJlZC4KICAgICAgOiBfb25MaXN0ZW5IYW5kbGVyID0gWm9uZS5jdXJyZW50CiAgICAgICAgICAgIC5yZWdpc3RlclVuYXJ5Q2FsbGJhY2s8ZHluYW1pYywgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+PigKICAgICAgICAgICAgICAgIG9uTGlzdGVuSGFuZGxlciksCiAgICAgICAgX29uQ2FuY2VsSGFuZGxlciA9IFpvbmUuY3VycmVudAogICAgICAgICAgICAucmVnaXN0ZXJVbmFyeUNhbGxiYWNrPGR5bmFtaWMsIFN0cmVhbVN1YnNjcmlwdGlvbjxUPj4oCiAgICAgICAgICAgICAgICBvbkNhbmNlbEhhbmRsZXIpLAogICAgICAgIF96b25lID0gWm9uZS5jdXJyZW50IHsKICAgIF9jb250cm9sbGVyID0gbmV3IF9Bc0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXI8VD4oX29uTGlzdGVuLCBfb25DYW5jZWwpOwogIH0KCiAgYm9vbCBnZXQgaXNCcm9hZGNhc3QgPT4gdHJ1ZTsKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IGxpc3Rlbih2b2lkIG9uRGF0YShUIGRhdGEpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSkgewogICAgaWYgKF9jb250cm9sbGVyID09IG51bGwgfHwgX2NvbnRyb2xsZXIuaXNDbG9zZWQpIHsKICAgICAgLy8gUmV0dXJuIGEgZHVtbXkgc3Vic2NyaXB0aW9uIGJhY2tlZCBieSBub3RoaW5nLCBzaW5jZQogICAgICAvLyBpdCB3aWxsIG9ubHkgZXZlciBzZW5kIG9uZSBkb25lIGV2ZW50LgogICAgICByZXR1cm4gbmV3IF9Eb25lU3RyZWFtU3Vic2NyaXB0aW9uPFQ+KG9uRG9uZSk7CiAgICB9CiAgICBfc3Vic2NyaXB0aW9uID8/PSBfc291cmNlLmxpc3RlbihfY29udHJvbGxlci5hZGQsCiAgICAgICAgb25FcnJvcjogX2NvbnRyb2xsZXIuYWRkRXJyb3IsIG9uRG9uZTogX2NvbnRyb2xsZXIuY2xvc2UpOwogICAgY2FuY2VsT25FcnJvciA9IGlkZW50aWNhbCh0cnVlLCBjYW5jZWxPbkVycm9yKTsKICAgIHJldHVybiBfY29udHJvbGxlci5fc3Vic2NyaWJlKG9uRGF0YSwgb25FcnJvciwgb25Eb25lLCBjYW5jZWxPbkVycm9yKTsKICB9CgogIHZvaWQgX29uQ2FuY2VsKCkgewogICAgYm9vbCBzaHV0ZG93biA9IChfY29udHJvbGxlciA9PSBudWxsKSB8fCBfY29udHJvbGxlci5pc0Nsb3NlZDsKICAgIGlmIChfb25DYW5jZWxIYW5kbGVyICE9IG51bGwpIHsKICAgICAgX3pvbmUucnVuVW5hcnkoCiAgICAgICAgICBfb25DYW5jZWxIYW5kbGVyLCBuZXcgX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbldyYXBwZXI8VD4odGhpcykpOwogICAgfQogICAgaWYgKHNodXRkb3duKSB7CiAgICAgIGlmIChfc3Vic2NyaXB0aW9uICE9IG51bGwpIHsKICAgICAgICBfc3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogICAgICAgIF9zdWJzY3JpcHRpb24gPSBudWxsOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIF9vbkxpc3RlbigpIHsKICAgIGlmIChfb25MaXN0ZW5IYW5kbGVyICE9IG51bGwpIHsKICAgICAgX3pvbmUucnVuVW5hcnkoCiAgICAgICAgICBfb25MaXN0ZW5IYW5kbGVyLCBuZXcgX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbldyYXBwZXI8VD4odGhpcykpOwogICAgfQogIH0KCiAgLy8gTWV0aG9kcyBjYWxsZWQgZnJvbSBfQnJvYWRjYXN0U3Vic2NyaXB0aW9uV3JhcHBlci4KICB2b2lkIF9jYW5jZWxTdWJzY3JpcHRpb24oKSB7CiAgICBpZiAoX3N1YnNjcmlwdGlvbiA9PSBudWxsKSByZXR1cm47CiAgICAvLyBDYWxsZWQgYnkgW19jb250cm9sbGVyXSB3aGVuIGl0IGhhcyBubyBzdWJzY3JpYmVycyBsZWZ0LgogICAgU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbiA9IF9zdWJzY3JpcHRpb247CiAgICBfc3Vic2NyaXB0aW9uID0gbnVsbDsKICAgIF9jb250cm9sbGVyID0gbnVsbDsgLy8gTWFya3MgdGhlIHN0cmVhbSBhcyBubyBsb25nZXIgbGlzdGVuYWJsZS4KICAgIHN1YnNjcmlwdGlvbi5jYW5jZWwoKTsKICB9CgogIHZvaWQgX3BhdXNlU3Vic2NyaXB0aW9uKEZ1dHVyZSByZXN1bWVTaWduYWwpIHsKICAgIGlmIChfc3Vic2NyaXB0aW9uID09IG51bGwpIHJldHVybjsKICAgIF9zdWJzY3JpcHRpb24ucGF1c2UocmVzdW1lU2lnbmFsKTsKICB9CgogIHZvaWQgX3Jlc3VtZVN1YnNjcmlwdGlvbigpIHsKICAgIGlmIChfc3Vic2NyaXB0aW9uID09IG51bGwpIHJldHVybjsKICAgIF9zdWJzY3JpcHRpb24ucmVzdW1lKCk7CiAgfQoKICBib29sIGdldCBfaXNTdWJzY3JpcHRpb25QYXVzZWQgewogICAgaWYgKF9zdWJzY3JpcHRpb24gPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIF9zdWJzY3JpcHRpb24uaXNQYXVzZWQ7CiAgfQp9CgovKioKICogV3JhcHBlciBmb3Igc3Vic2NyaXB0aW9uIHRoYXQgZGlzYWxsb3dzIGNoYW5naW5nIGhhbmRsZXJzLgogKi8KY2xhc3MgX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbldyYXBwZXI8VD4gaW1wbGVtZW50cyBTdHJlYW1TdWJzY3JpcHRpb248VD4gewogIGZpbmFsIF9Bc0Jyb2FkY2FzdFN0cmVhbSBfc3RyZWFtOwoKICBfQnJvYWRjYXN0U3Vic2NyaXB0aW9uV3JhcHBlcih0aGlzLl9zdHJlYW0pOwoKICB2b2lkIG9uRGF0YSh2b2lkIGhhbmRsZURhdGEoVCBkYXRhKSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIkNhbm5vdCBjaGFuZ2UgaGFuZGxlcnMgb2YgYXNCcm9hZGNhc3RTdHJlYW0gc291cmNlIHN1YnNjcmlwdGlvbi4iKTsKICB9CgogIHZvaWQgb25FcnJvcihGdW5jdGlvbiBoYW5kbGVFcnJvcikgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIkNhbm5vdCBjaGFuZ2UgaGFuZGxlcnMgb2YgYXNCcm9hZGNhc3RTdHJlYW0gc291cmNlIHN1YnNjcmlwdGlvbi4iKTsKICB9CgogIHZvaWQgb25Eb25lKHZvaWQgaGFuZGxlRG9uZSgpKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiQ2Fubm90IGNoYW5nZSBoYW5kbGVycyBvZiBhc0Jyb2FkY2FzdFN0cmVhbSBzb3VyY2Ugc3Vic2NyaXB0aW9uLiIpOwogIH0KCiAgdm9pZCBwYXVzZShbRnV0dXJlIHJlc3VtZVNpZ25hbF0pIHsKICAgIF9zdHJlYW0uX3BhdXNlU3Vic2NyaXB0aW9uKHJlc3VtZVNpZ25hbCk7CiAgfQoKICB2b2lkIHJlc3VtZSgpIHsKICAgIF9zdHJlYW0uX3Jlc3VtZVN1YnNjcmlwdGlvbigpOwogIH0KCiAgRnV0dXJlIGNhbmNlbCgpIHsKICAgIF9zdHJlYW0uX2NhbmNlbFN1YnNjcmlwdGlvbigpOwogICAgcmV0dXJuIEZ1dHVyZS5fbnVsbEZ1dHVyZTsKICB9CgogIGJvb2wgZ2V0IGlzUGF1c2VkIHsKICAgIHJldHVybiBfc3RyZWFtLl9pc1N1YnNjcmlwdGlvblBhdXNlZDsKICB9CgogIEZ1dHVyZTxFPiBhc0Z1dHVyZTxFPihbRSBmdXR1cmVWYWx1ZV0pIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJDYW5ub3QgY2hhbmdlIGhhbmRsZXJzIG9mIGFzQnJvYWRjYXN0U3RyZWFtIHNvdXJjZSBzdWJzY3JpcHRpb24uIik7CiAgfQp9CgovKioKICogU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIFtTdHJlYW1JdGVyYXRvcl0uCiAqCiAqIFBhdXNlcyB0aGUgc3RyZWFtIGJldHdlZW4gY2FsbHMgdG8gW21vdmVOZXh0XS4KICovCmNsYXNzIF9TdHJlYW1JdGVyYXRvcjxUPiBpbXBsZW1lbnRzIFN0cmVhbUl0ZXJhdG9yPFQ+IHsKICAvLyBUaGUgc3RyZWFtIGl0ZXJhdG9yIGlzIGFsd2F5cyBpbiBvbmUgb2YgZm91ciBzdGF0ZXMuCiAgLy8gVGhlIHZhbHVlIG9mIHRoZSBbX3N0YXRlRGF0YV0gZmllbGQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuCiAgLy8KICAvLyBXaGVuIGBfc3Vic2NyaXB0aW9uID09IG51bGxgIGFuZCBgX3N0YXRlRGF0YSAhPSBudWxsYDoKICAvLyBUaGUgc3RyZWFtIGl0ZXJhdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIGJ1dCBbbW92ZU5leHRdIGhhcyBub3QgYmVlbiBjYWxsZWQKICAvLyB5ZXQuIFRoZSBbX3N0YXRlRGF0YV0gZmllbGQgY29udGFpbnMgdGhlIHN0cmVhbSB0byBsaXN0ZW4gdG8gb24gdGhlIGZpcnN0CiAgLy8gY2FsbCB0byBbbW92ZU5leHRdIGFuZCBbY3VycmVudF0gcmV0dXJucyBgbnVsbGAuCiAgLy8KICAvLyBXaGVuIGBfc3Vic2NyaXB0aW9uICE9IG51bGxgIGFuZCBgIV9pc1BhdXNlZGA6CiAgLy8gVGhlIHVzZXIgaGFzIGNhbGxlZCBbbW92ZU5leHRdIGFuZCB0aGUgaXRlcmF0b3IgaXMgd2FpdGluZyBmb3IgdGhlIG5leHQKICAvLyBldmVudC4gVGhlIFtfc3RhdGVEYXRhXSBmaWVsZCBjb250YWlucyB0aGUgW19GdXR1cmVdIHJldHVybmVkIGJ5IHRoZQogIC8vIFtfbW92ZU5leHRdIGNhbGwgYW5kIFtjdXJyZW50XSByZXR1cm5zIGBudWxsLmAKICAvLwogIC8vIFdoZW4gYF9zdWJzY3JpcHRpb24gIT0gbnVsbGAgYW5kIGBfaXNQYXVzZWRgOgogIC8vIFRoZSBtb3N0IHJlY2VudCBjYWxsIHRvIFttb3ZlTmV4dF0gaGFzIGNvbXBsZXRlZCB3aXRoIGEgYHRydWVgIHZhbHVlCiAgLy8gYW5kIFtjdXJyZW50XSBwcm92aWRlcyB0aGUgdmFsdWUgb2YgdGhlIGRhdGEgZXZlbnQuCiAgLy8gVGhlIFtfc3RhdGVEYXRhXSBmaWVsZCBjb250YWlucyB0aGUgW2N1cnJlbnRdIHZhbHVlLgogIC8vCiAgLy8gV2hlbiBgX3N1YnNjcmlwdGlvbiA9PSBudWxsYCBhbmQgYF9zdGF0ZURhdGEgPT0gbnVsbGA6CiAgLy8gVGhlIHN0cmVhbSBoYXMgY29tcGxldGVkIG9yIGJlZW4gY2FuY2VsZWQgdXNpbmcgW2NhbmNlbF0uCiAgLy8gVGhlIHN0cmVhbSBjb21wbGV0ZXMgb24gZWl0aGVyIGEgZG9uZSBldmVudCBvciBhbiBlcnJvciBldmVudC4KICAvLyBUaGUgbGFzdCBjYWxsIHRvIFttb3ZlTmV4dF0gaGFzIGNvbXBsZXRlZCB3aXRoIGBmYWxzZWAgYW5kIFtjdXJyZW50XQogIC8vIHJldHVybnMgYG51bGxgLgoKICAvLy8gU3Vic2NyaXB0aW9uIGJlaW5nIGxpc3RlbmVkIHRvLgogIC8vLwogIC8vLyBTZXQgdG8gYG51bGxgIHdoZW4gdGhlIHN0cmVhbSBzdWJzY3JpcHRpb24gaXMgZG9uZSBvciBjYW5jZWxlZC4KICBTdHJlYW1TdWJzY3JpcHRpb24gX3N1YnNjcmlwdGlvbjsKCiAgLy8vIERhdGEgdmFsdWUgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHN0YXRlLgogIC8vLwogIC8vLyBCZWZvcmUgZmlyc3QgY2FsbCB0byBbbW92ZU5leHRdOiBUaGUgc3RyZWFtIHRvIGxpc3RlbiB0by4KICAvLy8KICAvLy8gQWZ0ZXIgY2FsbGluZyBbbW92ZU5leHRdIGJ1dCBiZWZvcmUgdGhlIHJldHVybmVkIGZ1dHVyZSBjb21wbGV0ZXM6CiAgLy8vIFRoZSByZXR1cm5lZCBmdXR1cmUuCiAgLy8vCiAgLy8vIEFmdGVyIGNhbGxpbmcgW21vdmVOZXh0XSBhbmQgdGhlIHJldHVybmVkIGZ1dHVyZSBoYXMgY29tcGxldGVkCiAgLy8vIHdpdGggYHRydWVgOiBUaGUgdmFsdWUgb2YgW2N1cnJlbnRdLgogIC8vLwogIC8vLyBBZnRlciBjYWxsaW5nIFttb3ZlTmV4dF0gYW5kIHRoZSByZXR1cm5lZCBmdXR1cmUgaGFzIGNvbXBsZXRlZAogIC8vLyB3aXRoIGBmYWxzZWAsIG9yIGFmdGVyIGNhbGxpbmcgW2NhbmNlbF06IGBudWxsYC4KICBPYmplY3QgX3N0YXRlRGF0YTsKCiAgLy8vIFdoZXRoZXIgdGhlIGl0ZXJhdG9yIGlzIGJldHdlZW4gY2FsbHMgdG8gYG1vdmVOZXh0YC4KICAvLy8gVGhpcyB3aWxsIHVzdWFsbHkgY2F1c2UgdGhlIFtfc3Vic2NyaXB0aW9uXSB0byBiZSBwYXVzZWQsIGJ1dCBhcyBhbgogIC8vLyBvcHRpbWl6YXRpb24sIHdlIG9ubHkgcGF1c2UgYWZ0ZXIgdGhlIFttb3ZlTmV4dF0gZnV0dXJlIGhhcyBiZWVuCiAgLy8vIGNvbXBsZXRlZC4KICBib29sIF9pc1BhdXNlZCA9IGZhbHNlOwoKICBfU3RyZWFtSXRlcmF0b3IoZmluYWwgU3RyZWFtPFQ+IHN0cmVhbSkgOiBfc3RhdGVEYXRhID0gc3RyZWFtOwoKICBUIGdldCBjdXJyZW50IHsKICAgIGlmIChfc3Vic2NyaXB0aW9uICE9IG51bGwgJiYgX2lzUGF1c2VkKSB7CiAgICAgIHJldHVybiBfc3RhdGVEYXRhOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBGdXR1cmU8Ym9vbD4gbW92ZU5leHQoKSB7CiAgICBpZiAoX3N1YnNjcmlwdGlvbiAhPSBudWxsKSB7CiAgICAgIGlmIChfaXNQYXVzZWQpIHsKICAgICAgICB2YXIgZnV0dXJlID0gbmV3IF9GdXR1cmU8Ym9vbD4oKTsKICAgICAgICBfc3RhdGVEYXRhID0gZnV0dXJlOwogICAgICAgIF9pc1BhdXNlZCA9IGZhbHNlOwogICAgICAgIF9zdWJzY3JpcHRpb24ucmVzdW1lKCk7CiAgICAgICAgcmV0dXJuIGZ1dHVyZTsKICAgICAgfQogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiQWxyZWFkeSB3YWl0aW5nIGZvciBuZXh0LiIpOwogICAgfQogICAgcmV0dXJuIF9pbml0aWFsaXplT3JEb25lKCk7CiAgfQoKICAvLy8gQ2FsbGVkIGlmIHRoZXJlIGlzIG5vIGFjdGl2ZSBzdWJzY3JpcHRpb24gd2hlbiBbbW92ZU5leHRdIGlzIGNhbGxlZC4KICAvLy8KICAvLy8gRWl0aGVyIHN0YXJ0cyBsaXN0ZW5pbmcgb24gdGhlIHN0cmVhbSBpZiB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsIHRvCiAgLy8vIFttb3ZlTmV4dF0sIG9yIHJldHVybnMgYSBgZmFsc2VgIGZ1dHVyZSBiZWNhdXNlIHRoZSBzdHJlYW0gaGFzIGFscmVhZHkKICAvLy8gZW5kZWQuCiAgRnV0dXJlPGJvb2w+IF9pbml0aWFsaXplT3JEb25lKCkgewogICAgYXNzZXJ0KF9zdWJzY3JpcHRpb24gPT0gbnVsbCk7CiAgICB2YXIgc3RhdGVEYXRhID0gX3N0YXRlRGF0YTsKICAgIGlmIChzdGF0ZURhdGEgIT0gbnVsbCkgewogICAgICBTdHJlYW08VD4gc3RyZWFtID0gc3RhdGVEYXRhOwogICAgICBfc3Vic2NyaXB0aW9uID0gc3RyZWFtLmxpc3Rlbihfb25EYXRhLAogICAgICAgICAgb25FcnJvcjogX29uRXJyb3IsIG9uRG9uZTogX29uRG9uZSwgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICAgIHZhciBmdXR1cmUgPSBuZXcgX0Z1dHVyZTxib29sPigpOwogICAgICBfc3RhdGVEYXRhID0gZnV0dXJlOwogICAgICByZXR1cm4gZnV0dXJlOwogICAgfQogICAgcmV0dXJuIEZ1dHVyZS5fZmFsc2VGdXR1cmU7CiAgfQoKICBGdXR1cmUgY2FuY2VsKCkgewogICAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbiA9IF9zdWJzY3JpcHRpb247CiAgICBPYmplY3Qgc3RhdGVEYXRhID0gX3N0YXRlRGF0YTsKICAgIF9zdGF0ZURhdGEgPSBudWxsOwogICAgaWYgKHN1YnNjcmlwdGlvbiAhPSBudWxsKSB7CiAgICAgIF9zdWJzY3JpcHRpb24gPSBudWxsOwogICAgICBpZiAoIV9pc1BhdXNlZCkgewogICAgICAgIF9GdXR1cmU8Ym9vbD4gZnV0dXJlID0gc3RhdGVEYXRhOwogICAgICAgIGZ1dHVyZS5fYXN5bmNDb21wbGV0ZShmYWxzZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbi5jYW5jZWwoKTsKICAgIH0KICAgIHJldHVybiBGdXR1cmUuX251bGxGdXR1cmU7CiAgfQoKICB2b2lkIF9vbkRhdGEoVCBkYXRhKSB7CiAgICBhc3NlcnQoX3N1YnNjcmlwdGlvbiAhPSBudWxsICYmICFfaXNQYXVzZWQpOwogICAgX0Z1dHVyZTxib29sPiBtb3ZlTmV4dEZ1dHVyZSA9IF9zdGF0ZURhdGE7CiAgICBfc3RhdGVEYXRhID0gZGF0YTsKICAgIF9pc1BhdXNlZCA9IHRydWU7CiAgICBtb3ZlTmV4dEZ1dHVyZS5fY29tcGxldGUodHJ1ZSk7CiAgICBpZiAoX3N1YnNjcmlwdGlvbiAhPSBudWxsICYmIF9pc1BhdXNlZCkgX3N1YnNjcmlwdGlvbi5wYXVzZSgpOwogIH0KCiAgdm9pZCBfb25FcnJvcihPYmplY3QgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICBhc3NlcnQoX3N1YnNjcmlwdGlvbiAhPSBudWxsICYmICFfaXNQYXVzZWQpOwogICAgX0Z1dHVyZTxib29sPiBtb3ZlTmV4dEZ1dHVyZSA9IF9zdGF0ZURhdGE7CiAgICBfc3Vic2NyaXB0aW9uID0gbnVsbDsKICAgIF9zdGF0ZURhdGEgPSBudWxsOwogICAgbW92ZU5leHRGdXR1cmUuX2NvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgdm9pZCBfb25Eb25lKCkgewogICAgYXNzZXJ0KF9zdWJzY3JpcHRpb24gIT0gbnVsbCAmJiAhX2lzUGF1c2VkKTsKICAgIF9GdXR1cmU8Ym9vbD4gbW92ZU5leHRGdXR1cmUgPSBfc3RhdGVEYXRhOwogICAgX3N1YnNjcmlwdGlvbiA9IG51bGw7CiAgICBfc3RhdGVEYXRhID0gbnVsbDsKICAgIG1vdmVOZXh0RnV0dXJlLl9jb21wbGV0ZShmYWxzZSk7CiAgfQp9CgovKiogQW4gZW1wdHkgYnJvYWRjYXN0IHN0cmVhbSwgc2VuZGluZyBhIGRvbmUgZXZlbnQgYXMgc29vbiBhcyBwb3NzaWJsZS4gKi8KY2xhc3MgX0VtcHR5U3RyZWFtPFQ+IGV4dGVuZHMgU3RyZWFtPFQ+IHsKICBjb25zdCBfRW1wdHlTdHJlYW0oKSA6IHN1cGVyLl9pbnRlcm5hbCgpOwogIGJvb2wgZ2V0IGlzQnJvYWRjYXN0ID0+IHRydWU7CiAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IGxpc3Rlbih2b2lkIG9uRGF0YShUIGRhdGEpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSkgewogICAgcmV0dXJuIG5ldyBfRG9uZVN0cmVhbVN1YnNjcmlwdGlvbjxUPihvbkRvbmUpOwogIH0KfQqEJwBOTjwBFAFBHxU3EQIBBD4DSEkcBCMaOBQCAQRGA05AQQNRIgNKDAMtNCxMTU9BA09OOwQmSTovBjEwBiYGOQVOOwYsBjEFUSMGKAYWBTsfBU4+BjAsLC0BMBsVGCMBNA4BKSwYAQYeBVAGHgEgUEAZGxkEAQY0BUssBjweJx4iJB8GBAEjASolRhtDBAEnJzwXTTdMDVFLBgQBIyUyBAEmHSAqSkJBQ0MEARIdFR4YMCQjESMqNwoIBgQBFEtPEycYEQYwBAErKgEyEyUHMCY6JzQMDzIIBwETBAEXAUI3O0Y+PjY0HjxFASIBEx8XIQYnIQQBBiEFRkcuBiAXIgQBGwEWGB0UFw0uBgQBOB0URg05BgQBEhgdHRQTDSkGBAFCTi8qFBwEARUdBAEXGREEARwBBhoFRS0GKi0cNwYYGCQYIQgGBAEiARsaGBoqIiojIQQBORoYGioBF0w4MyQ4HjpQDzM4CCUGARooESM7Lw8VCA0TMCMGBAEVGhgaARZMPSRIISUGAQ8mITksDRIGBAEGGwVDRSoGKRoqIhAjIQQBBj8FOAU4BUEjBioaKyUvKAgGPk0TGRkQCCsyJBsUDxUIJSYGJR8GBAIBR0BHMkgXATQ/NClFHRkEAUk9QT0wMQQBPTUCATABLTclGAZCFwU/BicBQT1PFDAwJwQCAUY8Mi8ZAUgBKQEwHTIGLEM/TU0ZEgomFS8PGh4IFR0hMjEjDx4jCAYEAREnFgQCARUBSycdASsnAU9ANwIBKxsBOyI7Fj4sAgEdMREcLR8EAgEeLA8fAS4qLAQCAR0uGCoaBAEiASM1BAIBMiMoKzopTSYoAQYfBUVKTUoFSUQnBiMBFAE2OgEGJQVNSQYuHRYbKSEOBhsdIy8cCB8EARovBAEvAUQQAgE5NzUjAVEiATABIiQ0DTgGBAEwGi0kJR8GHQQBEScxBAIBSAEESAREIyMgARQSGAFBEQQBMjcqARUeKBoEASooIxoEASYXQQQBEhQZIxUIBgQBKQErKhMuBxMEARUbGho0BAIBMBswMBQBLycBFhRAQEYTKEQiKEQiH00EASABND83PjA1BjZDNEsEARVDJBZJBhQjIB4IBgQBFSQWSQYEATgfJ0A1GkUbBAExJycEAR8nHAQBIy0jBAIBBD4ESiQBLwEpIE0EAScgTQQBIyBNBAEmLgQBEiMEARQjHwQBFioEASsgTQQCAQQuAzIEODo/BTxOTzYFNE1KNAUzSjk6BTw/REoVASYGRiQBMQZABkkbBkUrBkU3FQE7SkcRGgFBARIuGQYRBAEcIRcqHRsgFwg5BiAEAUsGSU0NJSMgHSQtRCgbFQYgBAEUOCMXIBwYKiYIJAYfBAEZMS8XFiRDBAE5MS8aFzYEARMxLxoXJQQCAUwqLCA0PzMEAgEbZGFydDphc3luYy9zdHJlYW1faW1wbC5kYXJ0Mm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9hc3luYy9zdHJlYW1fcGlwZS5kYXJ0t6UvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmFzeW5jOwoKLyoqIFJ1bnMgdXNlciBjb2RlIGFuZCB0YWtlcyBhY3Rpb25zIGRlcGVuZGluZyBvbiBzdWNjZXNzIG9yIGZhaWx1cmUuICovCl9ydW5Vc2VyQ29kZTxUPigKICAgIFQgdXNlckNvZGUoKSwgb25TdWNjZXNzKFQgdmFsdWUpLCBvbkVycm9yKGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpKSB7CiAgdHJ5IHsKICAgIG9uU3VjY2Vzcyh1c2VyQ29kZSgpKTsKICB9IGNhdGNoIChlLCBzKSB7CiAgICBBc3luY0Vycm9yIHJlcGxhY2VtZW50ID0gWm9uZS5jdXJyZW50LmVycm9yQ2FsbGJhY2soZSwgcyk7CiAgICBpZiAocmVwbGFjZW1lbnQgPT0gbnVsbCkgewogICAgICBvbkVycm9yKGUsIHMpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGVycm9yID0gX25vbk51bGxFcnJvcihyZXBsYWNlbWVudC5lcnJvcik7CiAgICAgIHZhciBzdGFja1RyYWNlID0gcmVwbGFjZW1lbnQuc3RhY2tUcmFjZTsKICAgICAgb25FcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICB9CiAgfQp9CgovKiogSGVscGVyIGZ1bmN0aW9uIHRvIGNhbmNlbCBhIHN1YnNjcmlwdGlvbiBhbmQgd2FpdCBmb3IgdGhlIHBvdGVudGlhbCBmdXR1cmUsCiAgYmVmb3JlIGNvbXBsZXRpbmcgd2l0aCBhbiBlcnJvci4gKi8Kdm9pZCBfY2FuY2VsQW5kRXJyb3IoU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbiwgX0Z1dHVyZSBmdXR1cmUsIGVycm9yLAogICAgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgdmFyIGNhbmNlbEZ1dHVyZSA9IHN1YnNjcmlwdGlvbi5jYW5jZWwoKTsKICBpZiAoY2FuY2VsRnV0dXJlICE9IG51bGwgJiYgIWlkZW50aWNhbChjYW5jZWxGdXR1cmUsIEZ1dHVyZS5fbnVsbEZ1dHVyZSkpIHsKICAgIGNhbmNlbEZ1dHVyZS53aGVuQ29tcGxldGUoKCkgPT4gZnV0dXJlLl9jb21wbGV0ZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKSk7CiAgfSBlbHNlIHsKICAgIGZ1dHVyZS5fY29tcGxldGVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQp9Cgp2b2lkIF9jYW5jZWxBbmRFcnJvcldpdGhSZXBsYWNlbWVudChTdHJlYW1TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uLAogICAgX0Z1dHVyZSBmdXR1cmUsIGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICBBc3luY0Vycm9yIHJlcGxhY2VtZW50ID0gWm9uZS5jdXJyZW50LmVycm9yQ2FsbGJhY2soZXJyb3IsIHN0YWNrVHJhY2UpOwogIGlmIChyZXBsYWNlbWVudCAhPSBudWxsKSB7CiAgICBlcnJvciA9IF9ub25OdWxsRXJyb3IocmVwbGFjZW1lbnQuZXJyb3IpOwogICAgc3RhY2tUcmFjZSA9IHJlcGxhY2VtZW50LnN0YWNrVHJhY2U7CiAgfQogIF9jYW5jZWxBbmRFcnJvcihzdWJzY3JpcHRpb24sIGZ1dHVyZSwgZXJyb3IsIHN0YWNrVHJhY2UpOwp9Cgp0eXBlZGVmIHZvaWQgX0Vycm9yQ2FsbGJhY2soZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSk7CgovKiogSGVscGVyIGZ1bmN0aW9uIHRvIG1ha2UgYW4gb25FcnJvciBhcmd1bWVudCB0byBbX3J1blVzZXJDb2RlXS4gKi8KX0Vycm9yQ2FsbGJhY2sgX2NhbmNlbEFuZEVycm9yQ2xvc3VyZSgKICAgIFN0cmVhbVN1YnNjcmlwdGlvbiBzdWJzY3JpcHRpb24sIF9GdXR1cmUgZnV0dXJlKSB7CiAgcmV0dXJuIChlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICBfY2FuY2VsQW5kRXJyb3Ioc3Vic2NyaXB0aW9uLCBmdXR1cmUsIGVycm9yLCBzdGFja1RyYWNlKTsKICB9Owp9CgovKiogSGVscGVyIGZ1bmN0aW9uIHRvIGNhbmNlbCBhIHN1YnNjcmlwdGlvbiBhbmQgd2FpdCBmb3IgdGhlIHBvdGVudGlhbCBmdXR1cmUsCiAgYmVmb3JlIGNvbXBsZXRpbmcgd2l0aCBhIHZhbHVlLiAqLwp2b2lkIF9jYW5jZWxBbmRWYWx1ZShTdHJlYW1TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uLCBfRnV0dXJlIGZ1dHVyZSwgdmFsdWUpIHsKICB2YXIgY2FuY2VsRnV0dXJlID0gc3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogIGlmIChjYW5jZWxGdXR1cmUgIT0gbnVsbCAmJiAhaWRlbnRpY2FsKGNhbmNlbEZ1dHVyZSwgRnV0dXJlLl9udWxsRnV0dXJlKSkgewogICAgY2FuY2VsRnV0dXJlLndoZW5Db21wbGV0ZSgoKSA9PiBmdXR1cmUuX2NvbXBsZXRlKHZhbHVlKSk7CiAgfSBlbHNlIHsKICAgIGZ1dHVyZS5fY29tcGxldGUodmFsdWUpOwogIH0KfQoKLyoqCiAqIEEgW1N0cmVhbV0gdGhhdCBmb3J3YXJkcyBzdWJzY3JpcHRpb25zIHRvIGFub3RoZXIgc3RyZWFtLgogKgogKiBUaGlzIHN0cmVhbSBpbXBsZW1lbnRzIFtTdHJlYW1dLCBidXQgZm9yd2FyZHMgYWxsIHN1YnNjcmlwdGlvbnMKICogdG8gYW4gdW5kZXJseWluZyBzdHJlYW0sIGFuZCB3cmFwcyB0aGUgcmV0dXJuZWQgc3Vic2NyaXB0aW9uIHRvCiAqIG1vZGlmeSB0aGUgZXZlbnRzIG9uIHRoZSB3YXkuCiAqCiAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LgogKi8KYWJzdHJhY3QgY2xhc3MgX0ZvcndhcmRpbmdTdHJlYW08UywgVD4gZXh0ZW5kcyBTdHJlYW08VD4gewogIGZpbmFsIFN0cmVhbTxTPiBfc291cmNlOwoKICBfRm9yd2FyZGluZ1N0cmVhbSh0aGlzLl9zb3VyY2UpOwoKICBib29sIGdldCBpc0Jyb2FkY2FzdCA9PiBfc291cmNlLmlzQnJvYWRjYXN0OwoKICBTdHJlYW1TdWJzY3JpcHRpb248VD4gbGlzdGVuKHZvaWQgb25EYXRhKFQgdmFsdWUpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSkgewogICAgY2FuY2VsT25FcnJvciA9IGlkZW50aWNhbCh0cnVlLCBjYW5jZWxPbkVycm9yKTsKICAgIHJldHVybiBfY3JlYXRlU3Vic2NyaXB0aW9uKG9uRGF0YSwgb25FcnJvciwgb25Eb25lLCBjYW5jZWxPbkVycm9yKTsKICB9CgogIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBfY3JlYXRlU3Vic2NyaXB0aW9uKHZvaWQgb25EYXRhKFQgZGF0YSksCiAgICAgIEZ1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcikgewogICAgcmV0dXJuIG5ldyBfRm9yd2FyZGluZ1N0cmVhbVN1YnNjcmlwdGlvbjxTLCBUPigKICAgICAgICB0aGlzLCBvbkRhdGEsIG9uRXJyb3IsIG9uRG9uZSwgY2FuY2VsT25FcnJvcik7CiAgfQoKICAvLyBPdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgaW4gc3ViY2xhc3NlcyB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yLgoKICB2b2lkIF9oYW5kbGVEYXRhKFMgZGF0YSwgX0V2ZW50U2luazxUPiBzaW5rKSB7CiAgICBzaW5rLl9hZGQoZGF0YSBhcyBPYmplY3QpOwogIH0KCiAgdm9pZCBfaGFuZGxlRXJyb3IoZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSwgX0V2ZW50U2luazxUPiBzaW5rKSB7CiAgICBzaW5rLl9hZGRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQoKICB2b2lkIF9oYW5kbGVEb25lKF9FdmVudFNpbms8VD4gc2luaykgewogICAgc2luay5fY2xvc2UoKTsKICB9Cn0KCi8qKgogKiBBYnN0cmFjdCBzdXBlcmNsYXNzIGZvciBzdWJzY3JpcHRpb25zIHRoYXQgZm9yd2FyZCB0byBvdGhlciBzdWJzY3JpcHRpb25zLgogKi8KY2xhc3MgX0ZvcndhcmRpbmdTdHJlYW1TdWJzY3JpcHRpb248UywgVD4KICAgIGV4dGVuZHMgX0J1ZmZlcmluZ1N0cmVhbVN1YnNjcmlwdGlvbjxUPiB7CiAgZmluYWwgX0ZvcndhcmRpbmdTdHJlYW08UywgVD4gX3N0cmVhbTsKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFM+IF9zdWJzY3JpcHRpb247CgogIF9Gb3J3YXJkaW5nU3RyZWFtU3Vic2NyaXB0aW9uKHRoaXMuX3N0cmVhbSwgdm9pZCBvbkRhdGEoVCBkYXRhKSwKICAgICAgRnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yKQogICAgICA6IHN1cGVyKG9uRGF0YSwgb25FcnJvciwgb25Eb25lLCBjYW5jZWxPbkVycm9yKSB7CiAgICBfc3Vic2NyaXB0aW9uID0gX3N0cmVhbS5fc291cmNlCiAgICAgICAgLmxpc3RlbihfaGFuZGxlRGF0YSwgb25FcnJvcjogX2hhbmRsZUVycm9yLCBvbkRvbmU6IF9oYW5kbGVEb25lKTsKICB9CgogIC8vIF9TdHJlYW1TaW5rIGludGVyZmFjZS4KICAvLyBUcmFuc2Zvcm1lcnMgc2VuZGluZyBtb3JlIHRoYW4gb25lIGV2ZW50IGhhdmUgbm8gd2F5IHRvIGtub3cgaWYgdGhlIHN0cmVhbQogIC8vIGlzIGNhbmNlbGVkIG9yIGNsb3NlZCBhZnRlciB0aGUgZmlyc3QsIHNvIHdlIGp1c3QgaWdub3JlIHJlbWFpbmluZyBldmVudHMuCgogIHZvaWQgX2FkZChUIGRhdGEpIHsKICAgIGlmIChfaXNDbG9zZWQpIHJldHVybjsKICAgIHN1cGVyLl9hZGQoZGF0YSk7CiAgfQoKICB2b2lkIF9hZGRFcnJvcihPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgaWYgKF9pc0Nsb3NlZCkgcmV0dXJuOwogICAgc3VwZXIuX2FkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIC8vIFN0cmVhbVN1YnNjcmlwdGlvbiBjYWxsYmFja3MuCgogIHZvaWQgX29uUGF1c2UoKSB7CiAgICBpZiAoX3N1YnNjcmlwdGlvbiA9PSBudWxsKSByZXR1cm47CiAgICBfc3Vic2NyaXB0aW9uLnBhdXNlKCk7CiAgfQoKICB2b2lkIF9vblJlc3VtZSgpIHsKICAgIGlmIChfc3Vic2NyaXB0aW9uID09IG51bGwpIHJldHVybjsKICAgIF9zdWJzY3JpcHRpb24ucmVzdW1lKCk7CiAgfQoKICBGdXR1cmUgX29uQ2FuY2VsKCkgewogICAgaWYgKF9zdWJzY3JpcHRpb24gIT0gbnVsbCkgewogICAgICBTdHJlYW1TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uID0gX3N1YnNjcmlwdGlvbjsKICAgICAgX3N1YnNjcmlwdGlvbiA9IG51bGw7CiAgICAgIHJldHVybiBzdWJzY3JpcHRpb24uY2FuY2VsKCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vIE1ldGhvZHMgdXNlZCBhcyBsaXN0ZW5lciBvbiBzb3VyY2Ugc3Vic2NyaXB0aW9uLgoKICB2b2lkIF9oYW5kbGVEYXRhKFMgZGF0YSkgewogICAgX3N0cmVhbS5faGFuZGxlRGF0YShkYXRhLCB0aGlzKTsKICB9CgogIHZvaWQgX2hhbmRsZUVycm9yKGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgIF9zdHJlYW0uX2hhbmRsZUVycm9yKGVycm9yLCBzdGFja1RyYWNlLCB0aGlzKTsKICB9CgogIHZvaWQgX2hhbmRsZURvbmUoKSB7CiAgICBfc3RyZWFtLl9oYW5kbGVEb25lKHRoaXMpOwogIH0KfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBTdHJlYW0gdHJhbnNmb3JtZXJzIHVzZWQgYnkgdGhlIGRlZmF1bHQgU3RyZWFtIGltcGxlbWVudGF0aW9uLgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp0eXBlZGVmIGJvb2wgX1ByZWRpY2F0ZTxUPihUIHZhbHVlKTsKCnZvaWQgX2FkZEVycm9yV2l0aFJlcGxhY2VtZW50KF9FdmVudFNpbmsgc2luaywgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogIEFzeW5jRXJyb3IgcmVwbGFjZW1lbnQgPSBab25lLmN1cnJlbnQuZXJyb3JDYWxsYmFjayhlcnJvciwgc3RhY2tUcmFjZSk7CiAgaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHsKICAgIGVycm9yID0gX25vbk51bGxFcnJvcihyZXBsYWNlbWVudC5lcnJvcik7CiAgICBzdGFja1RyYWNlID0gcmVwbGFjZW1lbnQuc3RhY2tUcmFjZTsKICB9CiAgc2luay5fYWRkRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwp9CgpjbGFzcyBfV2hlcmVTdHJlYW08VD4gZXh0ZW5kcyBfRm9yd2FyZGluZ1N0cmVhbTxULCBUPiB7CiAgZmluYWwgX1ByZWRpY2F0ZTxUPiBfdGVzdDsKCiAgX1doZXJlU3RyZWFtKFN0cmVhbTxUPiBzb3VyY2UsIGJvb2wgdGVzdChUIHZhbHVlKSkKICAgICAgOiBfdGVzdCA9IHRlc3QsCiAgICAgICAgc3VwZXIoc291cmNlKTsKCiAgdm9pZCBfaGFuZGxlRGF0YShUIGlucHV0RXZlbnQsIF9FdmVudFNpbms8VD4gc2luaykgewogICAgYm9vbCBzYXRpc2ZpZXM7CiAgICB0cnkgewogICAgICBzYXRpc2ZpZXMgPSBfdGVzdChpbnB1dEV2ZW50KTsKICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgX2FkZEVycm9yV2l0aFJlcGxhY2VtZW50KHNpbmssIGUsIHMpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoc2F0aXNmaWVzKSB7CiAgICAgIHNpbmsuX2FkZChpbnB1dEV2ZW50KTsKICAgIH0KICB9Cn0KCnR5cGVkZWYgVCBfVHJhbnNmb3JtYXRpb248UywgVD4oUyB2YWx1ZSk7CgovKioKICogQSBzdHJlYW0gcGlwZSB0aGF0IGNvbnZlcnRzIGRhdGEgZXZlbnRzIGJlZm9yZSBwYXNzaW5nIHRoZW0gb24uCiAqLwpjbGFzcyBfTWFwU3RyZWFtPFMsIFQ+IGV4dGVuZHMgX0ZvcndhcmRpbmdTdHJlYW08UywgVD4gewogIGZpbmFsIF9UcmFuc2Zvcm1hdGlvbjxTLCBUPiBfdHJhbnNmb3JtOwoKICBfTWFwU3RyZWFtKFN0cmVhbTxTPiBzb3VyY2UsIFQgdHJhbnNmb3JtKFMgZXZlbnQpKQogICAgICA6IHRoaXMuX3RyYW5zZm9ybSA9IHRyYW5zZm9ybSwKICAgICAgICBzdXBlcihzb3VyY2UpOwoKICB2b2lkIF9oYW5kbGVEYXRhKFMgaW5wdXRFdmVudCwgX0V2ZW50U2luazxUPiBzaW5rKSB7CiAgICBUIG91dHB1dEV2ZW50OwogICAgdHJ5IHsKICAgICAgb3V0cHV0RXZlbnQgPSBfdHJhbnNmb3JtKGlucHV0RXZlbnQpOwogICAgfSBjYXRjaCAoZSwgcykgewogICAgICBfYWRkRXJyb3JXaXRoUmVwbGFjZW1lbnQoc2luaywgZSwgcyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHNpbmsuX2FkZChvdXRwdXRFdmVudCk7CiAgfQp9CgovKioKICogQSBzdHJlYW0gcGlwZSB0aGF0IGNvbnZlcnRzIGRhdGEgZXZlbnRzIGJlZm9yZSBwYXNzaW5nIHRoZW0gb24uCiAqLwpjbGFzcyBfRXhwYW5kU3RyZWFtPFMsIFQ+IGV4dGVuZHMgX0ZvcndhcmRpbmdTdHJlYW08UywgVD4gewogIGZpbmFsIF9UcmFuc2Zvcm1hdGlvbjxTLCBJdGVyYWJsZTxUPj4gX2V4cGFuZDsKCiAgX0V4cGFuZFN0cmVhbShTdHJlYW08Uz4gc291cmNlLCBJdGVyYWJsZTxUPiBleHBhbmQoUyBldmVudCkpCiAgICAgIDogdGhpcy5fZXhwYW5kID0gZXhwYW5kLAogICAgICAgIHN1cGVyKHNvdXJjZSk7CgogIHZvaWQgX2hhbmRsZURhdGEoUyBpbnB1dEV2ZW50LCBfRXZlbnRTaW5rPFQ+IHNpbmspIHsKICAgIHRyeSB7CiAgICAgIGZvciAoVCB2YWx1ZSBpbiBfZXhwYW5kKGlucHV0RXZlbnQpKSB7CiAgICAgICAgc2luay5fYWRkKHZhbHVlKTsKICAgICAgfQogICAgfSBjYXRjaCAoZSwgcykgewogICAgICAvLyBJZiBlaXRoZXIgX2V4cGFuZCBvciBpdGVyYXRpbmcgdGhlIGdlbmVyYXRlZCBpdGVyYXRvciB0aHJvd3MsCiAgICAgIC8vIHdlIGFib3J0IHRoZSBpdGVyYXRpb24uCiAgICAgIF9hZGRFcnJvcldpdGhSZXBsYWNlbWVudChzaW5rLCBlLCBzKTsKICAgIH0KICB9Cn0KCnR5cGVkZWYgYm9vbCBfRXJyb3JUZXN0KGVycm9yKTsKCi8qKgogKiBBIHN0cmVhbSBwaXBlIHRoYXQgY29udmVydHMgb3IgZGlzcG9zZXMgZXJyb3IgZXZlbnRzCiAqIGJlZm9yZSBwYXNzaW5nIHRoZW0gb24uCiAqLwpjbGFzcyBfSGFuZGxlRXJyb3JTdHJlYW08VD4gZXh0ZW5kcyBfRm9yd2FyZGluZ1N0cmVhbTxULCBUPiB7CiAgZmluYWwgRnVuY3Rpb24gX3RyYW5zZm9ybTsKICBmaW5hbCBfRXJyb3JUZXN0IF90ZXN0OwoKICBfSGFuZGxlRXJyb3JTdHJlYW0oU3RyZWFtPFQ+IHNvdXJjZSwgRnVuY3Rpb24gb25FcnJvciwgYm9vbCB0ZXN0KGVycm9yKSkKICAgICAgOiB0aGlzLl90cmFuc2Zvcm0gPSBvbkVycm9yLAogICAgICAgIHRoaXMuX3Rlc3QgPSB0ZXN0LAogICAgICAgIHN1cGVyKHNvdXJjZSk7CgogIHZvaWQgX2hhbmRsZUVycm9yKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlLCBfRXZlbnRTaW5rPFQ+IHNpbmspIHsKICAgIGJvb2wgbWF0Y2hlcyA9IHRydWU7CiAgICBpZiAoX3Rlc3QgIT0gbnVsbCkgewogICAgICB0cnkgewogICAgICAgIG1hdGNoZXMgPSBfdGVzdChlcnJvcik7CiAgICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgICBfYWRkRXJyb3JXaXRoUmVwbGFjZW1lbnQoc2luaywgZSwgcyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICBpZiAobWF0Y2hlcykgewogICAgICB0cnkgewogICAgICAgIF9pbnZva2VFcnJvckhhbmRsZXIoX3RyYW5zZm9ybSwgZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgaWYgKGlkZW50aWNhbChlLCBlcnJvcikpIHsKICAgICAgICAgIHNpbmsuX2FkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgX2FkZEVycm9yV2l0aFJlcGxhY2VtZW50KHNpbmssIGUsIHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHNpbmsuX2FkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgIH0KICB9Cn0KCmNsYXNzIF9UYWtlU3RyZWFtPFQ+IGV4dGVuZHMgX0ZvcndhcmRpbmdTdHJlYW08VCwgVD4gewogIGZpbmFsIGludCBfY291bnQ7CgogIF9UYWtlU3RyZWFtKFN0cmVhbTxUPiBzb3VyY2UsIGludCBjb3VudCkKICAgICAgOiB0aGlzLl9jb3VudCA9IGNvdW50LAogICAgICAgIHN1cGVyKHNvdXJjZSkgewogICAgLy8gVGhpcyB0ZXN0IGlzIGRvbmUgZWFybHkgdG8gYXZvaWQgaGFuZGxpbmcgYW4gYXN5bmMgZXJyb3IKICAgIC8vIGluIHRoZSBfaGFuZGxlRGF0YSBtZXRob2QuCiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChjb3VudCwgImNvdW50Iik7CiAgfQoKICBTdHJlYW1TdWJzY3JpcHRpb248VD4gX2NyZWF0ZVN1YnNjcmlwdGlvbih2b2lkIG9uRGF0YShUIGRhdGEpLAogICAgICBGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3IpIHsKICAgIGlmIChfY291bnQgPT0gMCkgewogICAgICBfc291cmNlLmxpc3RlbihudWxsKS5jYW5jZWwoKTsKICAgICAgcmV0dXJuIG5ldyBfRG9uZVN0cmVhbVN1YnNjcmlwdGlvbjxUPihvbkRvbmUpOwogICAgfQogICAgcmV0dXJuIG5ldyBfU3RhdGVTdHJlYW1TdWJzY3JpcHRpb248VD4oCiAgICAgICAgdGhpcywgb25EYXRhLCBvbkVycm9yLCBvbkRvbmUsIGNhbmNlbE9uRXJyb3IsIF9jb3VudCk7CiAgfQoKICB2b2lkIF9oYW5kbGVEYXRhKFQgaW5wdXRFdmVudCwgX0V2ZW50U2luazxUPiBzaW5rKSB7CiAgICBfU3RhdGVTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uID0gc2luazsKICAgIGludCBjb3VudCA9IHN1YnNjcmlwdGlvbi5fY291bnQ7CiAgICBpZiAoY291bnQgPiAwKSB7CiAgICAgIHNpbmsuX2FkZChpbnB1dEV2ZW50KTsKICAgICAgY291bnQgLT0gMTsKICAgICAgc3Vic2NyaXB0aW9uLl9jb3VudCA9IGNvdW50OwogICAgICBpZiAoY291bnQgPT0gMCkgewogICAgICAgIC8vIENsb3NpbmcgYWxzbyB1bnN1YnNjcmliZXMgYWxsIHN1YnNjcmliZXJzLCB3aGljaCB1bnN1YnNjcmliZXMKICAgICAgICAvLyB0aGlzIGZyb20gc291cmNlLgogICAgICAgIHNpbmsuX2Nsb3NlKCk7CiAgICAgIH0KICAgIH0KICB9Cn0KCi8qKgogKiBBIFtfRm9yd2FyZGluZ1N0cmVhbVN1YnNjcmlwdGlvbl0gd2l0aCBvbmUgZXh0cmEgc3RhdGUgZmllbGQuCiAqCiAqIFVzZSBieSBzZXZlcmFsIGRpZmZlcmVudCBjbGFzc2VzLCBzdG9yaW5nIGFuIGludGVnZXIsIGJvb2wgb3IgZ2VuZXJhbC4KICovCmNsYXNzIF9TdGF0ZVN0cmVhbVN1YnNjcmlwdGlvbjxUPiBleHRlbmRzIF9Gb3J3YXJkaW5nU3RyZWFtU3Vic2NyaXB0aW9uPFQsIFQ+IHsKICAvLyBSYXcgc3RhdGUgZmllbGQuIFR5cGVkIGFjY2VzcyBwcm92aWRlZCBieSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGJlbG93LgogIHZhciBfc2hhcmVkU3RhdGU7CgogIF9TdGF0ZVN0cmVhbVN1YnNjcmlwdGlvbihfRm9yd2FyZGluZ1N0cmVhbTxULCBUPiBzdHJlYW0sIHZvaWQgb25EYXRhKFQgZGF0YSksCiAgICAgIEZ1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvciwgdGhpcy5fc2hhcmVkU3RhdGUpCiAgICAgIDogc3VwZXIoc3RyZWFtLCBvbkRhdGEsIG9uRXJyb3IsIG9uRG9uZSwgY2FuY2VsT25FcnJvcik7CgogIGJvb2wgZ2V0IF9mbGFnID0+IF9zaGFyZWRTdGF0ZTsKICB2b2lkIHNldCBfZmxhZyhib29sIGZsYWcpIHsKICAgIF9zaGFyZWRTdGF0ZSA9IGZsYWc7CiAgfQoKICBpbnQgZ2V0IF9jb3VudCA9PiBfc2hhcmVkU3RhdGU7CiAgdm9pZCBzZXQgX2NvdW50KGludCBjb3VudCkgewogICAgX3NoYXJlZFN0YXRlID0gY291bnQ7CiAgfQoKICBPYmplY3QgZ2V0IF92YWx1ZSA9PiBfc2hhcmVkU3RhdGU7CiAgdm9pZCBzZXQgX3ZhbHVlKE9iamVjdCB2YWx1ZSkgewogICAgX3NoYXJlZFN0YXRlID0gdmFsdWU7CiAgfQp9CgpjbGFzcyBfVGFrZVdoaWxlU3RyZWFtPFQ+IGV4dGVuZHMgX0ZvcndhcmRpbmdTdHJlYW08VCwgVD4gewogIGZpbmFsIF9QcmVkaWNhdGU8VD4gX3Rlc3Q7CgogIF9UYWtlV2hpbGVTdHJlYW0oU3RyZWFtPFQ+IHNvdXJjZSwgYm9vbCB0ZXN0KFQgdmFsdWUpKQogICAgICA6IHRoaXMuX3Rlc3QgPSB0ZXN0LAogICAgICAgIHN1cGVyKHNvdXJjZSk7CgogIHZvaWQgX2hhbmRsZURhdGEoVCBpbnB1dEV2ZW50LCBfRXZlbnRTaW5rPFQ+IHNpbmspIHsKICAgIGJvb2wgc2F0aXNmaWVzOwogICAgdHJ5IHsKICAgICAgc2F0aXNmaWVzID0gX3Rlc3QoaW5wdXRFdmVudCk7CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIF9hZGRFcnJvcldpdGhSZXBsYWNlbWVudChzaW5rLCBlLCBzKTsKICAgICAgLy8gVGhlIHRlc3QgZGlkbid0IHNheSB0cnVlLiBEaWRuJ3Qgc2F5IGZhbHNlIGVpdGhlciwgYnV0IHdlIHN0b3AgYW55d2F5LgogICAgICBzaW5rLl9jbG9zZSgpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoc2F0aXNmaWVzKSB7CiAgICAgIHNpbmsuX2FkZChpbnB1dEV2ZW50KTsKICAgIH0gZWxzZSB7CiAgICAgIHNpbmsuX2Nsb3NlKCk7CiAgICB9CiAgfQp9CgpjbGFzcyBfU2tpcFN0cmVhbTxUPiBleHRlbmRzIF9Gb3J3YXJkaW5nU3RyZWFtPFQsIFQ+IHsKICBmaW5hbCBpbnQgX2NvdW50OwoKICBfU2tpcFN0cmVhbShTdHJlYW08VD4gc291cmNlLCBpbnQgY291bnQpCiAgICAgIDogdGhpcy5fY291bnQgPSBjb3VudCwKICAgICAgICBzdXBlcihzb3VyY2UpIHsKICAgIC8vIFRoaXMgdGVzdCBpcyBkb25lIGVhcmx5IHRvIGF2b2lkIGhhbmRsaW5nIGFuIGFzeW5jIGVycm9yCiAgICAvLyBpbiB0aGUgX2hhbmRsZURhdGEgbWV0aG9kLgogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoY291bnQsICJjb3VudCIpOwogICAgUmFuZ2VFcnJvci5jaGVja05vdE5lZ2F0aXZlKGNvdW50LCAiY291bnQiKTsKICB9CgogIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBfY3JlYXRlU3Vic2NyaXB0aW9uKHZvaWQgb25EYXRhKFQgZGF0YSksCiAgICAgIEZ1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcikgewogICAgcmV0dXJuIG5ldyBfU3RhdGVTdHJlYW1TdWJzY3JpcHRpb248VD4oCiAgICAgICAgdGhpcywgb25EYXRhLCBvbkVycm9yLCBvbkRvbmUsIGNhbmNlbE9uRXJyb3IsIF9jb3VudCk7CiAgfQoKICB2b2lkIF9oYW5kbGVEYXRhKFQgaW5wdXRFdmVudCwgX0V2ZW50U2luazxUPiBzaW5rKSB7CiAgICBfU3RhdGVTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uID0gc2luazsKICAgIGludCBjb3VudCA9IHN1YnNjcmlwdGlvbi5fY291bnQ7CiAgICBpZiAoY291bnQgPiAwKSB7CiAgICAgIHN1YnNjcmlwdGlvbi5fY291bnQgPSBjb3VudCAtIDE7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHNpbmsuX2FkZChpbnB1dEV2ZW50KTsKICB9Cn0KCmNsYXNzIF9Ta2lwV2hpbGVTdHJlYW08VD4gZXh0ZW5kcyBfRm9yd2FyZGluZ1N0cmVhbTxULCBUPiB7CiAgZmluYWwgX1ByZWRpY2F0ZTxUPiBfdGVzdDsKCiAgX1NraXBXaGlsZVN0cmVhbShTdHJlYW08VD4gc291cmNlLCBib29sIHRlc3QoVCB2YWx1ZSkpCiAgICAgIDogdGhpcy5fdGVzdCA9IHRlc3QsCiAgICAgICAgc3VwZXIoc291cmNlKTsKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IF9jcmVhdGVTdWJzY3JpcHRpb24odm9pZCBvbkRhdGEoVCBkYXRhKSwKICAgICAgRnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yKSB7CiAgICByZXR1cm4gbmV3IF9TdGF0ZVN0cmVhbVN1YnNjcmlwdGlvbjxUPigKICAgICAgICB0aGlzLCBvbkRhdGEsIG9uRXJyb3IsIG9uRG9uZSwgY2FuY2VsT25FcnJvciwgZmFsc2UpOwogIH0KCiAgdm9pZCBfaGFuZGxlRGF0YShUIGlucHV0RXZlbnQsIF9FdmVudFNpbms8VD4gc2luaykgewogICAgX1N0YXRlU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbiA9IHNpbms7CiAgICBib29sIGhhc0ZhaWxlZCA9IHN1YnNjcmlwdGlvbi5fZmxhZzsKICAgIGlmIChoYXNGYWlsZWQpIHsKICAgICAgc2luay5fYWRkKGlucHV0RXZlbnQpOwogICAgICByZXR1cm47CiAgICB9CiAgICBib29sIHNhdGlzZmllczsKICAgIHRyeSB7CiAgICAgIHNhdGlzZmllcyA9IF90ZXN0KGlucHV0RXZlbnQpOwogICAgfSBjYXRjaCAoZSwgcykgewogICAgICBfYWRkRXJyb3JXaXRoUmVwbGFjZW1lbnQoc2luaywgZSwgcyk7CiAgICAgIC8vIEEgZmFpbHVyZSB0byByZXR1cm4gYSBib29sZWFuIGlzIGNvbnNpZGVyZWQgIm5vdCBtYXRjaGluZyIuCiAgICAgIHN1YnNjcmlwdGlvbi5fZmxhZyA9IHRydWU7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghc2F0aXNmaWVzKSB7CiAgICAgIHN1YnNjcmlwdGlvbi5fZmxhZyA9IHRydWU7CiAgICAgIHNpbmsuX2FkZChpbnB1dEV2ZW50KTsKICAgIH0KICB9Cn0KCnR5cGVkZWYgYm9vbCBfRXF1YWxpdHk8VD4oVCBhLCBUIGIpOwoKY2xhc3MgX0Rpc3RpbmN0U3RyZWFtPFQ+IGV4dGVuZHMgX0ZvcndhcmRpbmdTdHJlYW08VCwgVD4gewogIHN0YXRpYyBmaW5hbCBfU0VOVElORUwgPSBuZXcgT2JqZWN0KCk7CgogIGZpbmFsIF9FcXVhbGl0eTxUPiBfZXF1YWxzOwoKICBfRGlzdGluY3RTdHJlYW0oU3RyZWFtPFQ+IHNvdXJjZSwgYm9vbCBlcXVhbHMoVCBhLCBUIGIpKQogICAgICA6IF9lcXVhbHMgPSBlcXVhbHMsCiAgICAgICAgc3VwZXIoc291cmNlKTsKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IF9jcmVhdGVTdWJzY3JpcHRpb24odm9pZCBvbkRhdGEoVCBkYXRhKSwKICAgICAgRnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yKSB7CiAgICByZXR1cm4gbmV3IF9TdGF0ZVN0cmVhbVN1YnNjcmlwdGlvbjxUPigK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cmFwcGVyKHRoaXMuX3NpbmspOwoKICB2b2lkIGFkZChUIGRhdGEpIHsKICAgIF9zaW5rLl9hZGQoZGF0YSk7CiAgfQoKICB2b2lkIGFkZEVycm9yKGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSkgewogICAgX3NpbmsuX2FkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBfc2luay5fY2xvc2UoKTsKICB9Cn0KCi8qKgogKiBBIFN0cmVhbVN1YnNjcmlwdGlvbiB0aGF0IHBpcGVzIGRhdGEgdGhyb3VnaCBhIHNpbmsuCiAqCiAqIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGlzIGNsYXNzIHRha2VzIGEgW19TaW5rTWFwcGVyXSB3aGljaCBtYXBzIGZyb20KICogW0V2ZW50U2lua10gdG8gW0V2ZW50U2lua10uIFRoZSBpbnB1dCB0byB0aGUgbWFwcGVyIGlzIHRoZSBvdXRwdXQgb2YKICogdGhlIHRyYW5zZm9ybWF0aW9uLiBUaGUgcmV0dXJuZWQgc2luayBpcyB0aGUgdHJhbnNmb3JtYXRpb24ncyBpbnB1dC4KICovCmNsYXNzIF9TaW5rVHJhbnNmb3JtZXJTdHJlYW1TdWJzY3JpcHRpb248UywgVD4KICAgIGV4dGVuZHMgX0J1ZmZlcmluZ1N0cmVhbVN1YnNjcmlwdGlvbjxUPiB7CiAgLy8vIFRoZSB0cmFuc2Zvcm1lcidzIGlucHV0IHNpbmsuCiAgRXZlbnRTaW5rPFM+IF90cmFuc2Zvcm1lclNpbms7CgogIC8vLyBUaGUgc3Vic2NyaXB0aW9uIHRvIHRoZSBpbnB1dCBzdHJlYW0uCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFM+IF9zdWJzY3JpcHRpb247CgogIF9TaW5rVHJhbnNmb3JtZXJTdHJlYW1TdWJzY3JpcHRpb24oU3RyZWFtPFM+IHNvdXJjZSwgX1NpbmtNYXBwZXI8UywgVD4gbWFwcGVyLAogICAgICB2b2lkIG9uRGF0YShUIGRhdGEpLCBGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3IpCiAgICAgIC8vIFdlIHNldCB0aGUgYWRhcHRlcidzIHRhcmdldCBvbmx5IHdoZW4gdGhlIHVzZXIgaXMgYWxsb3dlZCB0byBzZW5kIGRhdGEuCiAgICAgIDogc3VwZXIob25EYXRhLCBvbkVycm9yLCBvbkRvbmUsIGNhbmNlbE9uRXJyb3IpIHsKICAgIF9FdmVudFNpbmtXcmFwcGVyPFQ+IGV2ZW50U2luayA9IG5ldyBfRXZlbnRTaW5rV3JhcHBlcjxUPih0aGlzKTsKICAgIF90cmFuc2Zvcm1lclNpbmsgPSBtYXBwZXIoZXZlbnRTaW5rKTsKICAgIF9zdWJzY3JpcHRpb24gPQogICAgICAgIHNvdXJjZS5saXN0ZW4oX2hhbmRsZURhdGEsIG9uRXJyb3I6IF9oYW5kbGVFcnJvciwgb25Eb25lOiBfaGFuZGxlRG9uZSk7CiAgfQoKICAvKiogV2hldGhlciB0aGlzIHN1YnNjcmlwdGlvbiBpcyBzdGlsbCBzdWJzY3JpYmVkIHRvIGl0cyBzb3VyY2UuICovCiAgYm9vbCBnZXQgX2lzU3Vic2NyaWJlZCA9PiBfc3Vic2NyaXB0aW9uICE9IG51bGw7CgogIC8vIF9FdmVudFNpbmsgaW50ZXJmYWNlLgoKICAvKioKICAgKiBBZGRzIGFuIGV2ZW50IHRvIHRoaXMgc3Vic2NyaXB0aW9ucy4KICAgKgogICAqIENvbnRyYXJ5IHRvIG5vcm1hbCBbX0J1ZmZlcmluZ1N0cmVhbVN1YnNjcmlwdGlvbl1zIHdlIG1heSByZWNlaXZlCiAgICogZXZlbnRzIHdoZW4gdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZC4gUmVwb3J0IHRoZW0gYXMgc3RhdGUKICAgKiBlcnJvci4KICAgKi8KICB2b2lkIF9hZGQoVCBkYXRhKSB7CiAgICBpZiAoX2lzQ2xvc2VkKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJTdHJlYW0gaXMgYWxyZWFkeSBjbG9zZWQiKTsKICAgIH0KICAgIHN1cGVyLl9hZGQoZGF0YSk7CiAgfQoKICAvKioKICAgKiBBZGRzIGFuIGVycm9yIGV2ZW50IHRvIHRoaXMgc3Vic2NyaXB0aW9ucy4KICAgKgogICAqIENvbnRyYXJ5IHRvIG5vcm1hbCBbX0J1ZmZlcmluZ1N0cmVhbVN1YnNjcmlwdGlvbl1zIHdlIG1heSByZWNlaXZlCiAgICogZXZlbnRzIHdoZW4gdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZC4gUmVwb3J0IHRoZW0gYXMgc3RhdGUKICAgKiBlcnJvci4KICAgKi8KICB2b2lkIF9hZGRFcnJvcihPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgaWYgKF9pc0Nsb3NlZCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiU3RyZWFtIGlzIGFscmVhZHkgY2xvc2VkIik7CiAgICB9CiAgICBzdXBlci5fYWRkRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgLyoqCiAgICogQWRkcyBhIGNsb3NlIGV2ZW50IHRvIHRoaXMgc3Vic2NyaXB0aW9ucy4KICAgKgogICAqIENvbnRyYXJ5IHRvIG5vcm1hbCBbX0J1ZmZlcmluZ1N0cmVhbVN1YnNjcmlwdGlvbl1zIHdlIG1heSByZWNlaXZlCiAgICogZXZlbnRzIHdoZW4gdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZC4gUmVwb3J0IHRoZW0gYXMgc3RhdGUKICAgKiBlcnJvci4KICAgKi8KICB2b2lkIF9jbG9zZSgpIHsKICAgIGlmIChfaXNDbG9zZWQpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIlN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZCIpOwogICAgfQogICAgc3VwZXIuX2Nsb3NlKCk7CiAgfQoKICAvLyBfQnVmZmVyaW5nU3RyZWFtU3Vic2NyaXB0aW9uIGhvb2tzLgoKICB2b2lkIF9vblBhdXNlKCkgewogICAgaWYgKF9pc1N1YnNjcmliZWQpIF9zdWJzY3JpcHRpb24ucGF1c2UoKTsKICB9CgogIHZvaWQgX29uUmVzdW1lKCkgewogICAgaWYgKF9pc1N1YnNjcmliZWQpIF9zdWJzY3JpcHRpb24ucmVzdW1lKCk7CiAgfQoKICBGdXR1cmUgX29uQ2FuY2VsKCkgewogICAgaWYgKF9pc1N1YnNjcmliZWQpIHsKICAgICAgU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbiA9IF9zdWJzY3JpcHRpb247CiAgICAgIF9zdWJzY3JpcHRpb24gPSBudWxsOwogICAgICByZXR1cm4gc3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIF9oYW5kbGVEYXRhKFMgZGF0YSkgewogICAgdHJ5IHsKICAgICAgX3RyYW5zZm9ybWVyU2luay5hZGQoZGF0YSk7CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIF9hZGRFcnJvcihlLCBzKTsKICAgIH0KICB9CgogIHZvaWQgX2hhbmRsZUVycm9yKGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSkgewogICAgdHJ5IHsKICAgICAgX3RyYW5zZm9ybWVyU2luay5hZGRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIGlmIChpZGVudGljYWwoZSwgZXJyb3IpKSB7CiAgICAgICAgX2FkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfYWRkRXJyb3IoZSwgcyk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgX2hhbmRsZURvbmUoKSB7CiAgICB0cnkgewogICAgICBfc3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgX3RyYW5zZm9ybWVyU2luay5jbG9zZSgpOwogICAgfSBjYXRjaCAoZSwgcykgewogICAgICBfYWRkRXJyb3IoZSwgcyk7CiAgICB9CiAgfQp9Cgp0eXBlZGVmIEV2ZW50U2luazxTPiBfU2lua01hcHBlcjxTLCBUPihFdmVudFNpbms8VD4gb3V0cHV0KTsKCi8qKgogKiBBIFN0cmVhbVRyYW5zZm9ybWVyIGZvciBTaW5rLW1hcHBlcnMuCiAqCiAqIEEgU2luay1tYXBwZXIgdGFrZXMgYW4gW0V2ZW50U2lua10gKGl0cyBvdXRwdXQpIGFuZCByZXR1cm5zIGFub3RoZXIKICogRXZlbnRTaW5rIChpdHMgaW5wdXQpLgogKgogKiBOb3RlIHRoYXQgdGhpcyBjbGFzcyBjYW4gYmUgYGNvbnN0YC4KICovCmNsYXNzIF9TdHJlYW1TaW5rVHJhbnNmb3JtZXI8UywgVD4gZXh0ZW5kcyBTdHJlYW1UcmFuc2Zvcm1lckJhc2U8UywgVD4gewogIGZpbmFsIF9TaW5rTWFwcGVyPFMsIFQ+IF9zaW5rTWFwcGVyOwogIGNvbnN0IF9TdHJlYW1TaW5rVHJhbnNmb3JtZXIodGhpcy5fc2lua01hcHBlcik7CgogIFN0cmVhbTxUPiBiaW5kKFN0cmVhbTxTPiBzdHJlYW0pID0+CiAgICAgIG5ldyBfQm91bmRTaW5rU3RyZWFtPFMsIFQ+KHN0cmVhbSwgX3NpbmtNYXBwZXIpOwp9CgovKioKICogVGhlIHJlc3VsdCBvZiBiaW5kaW5nIGEgU3RyZWFtVHJhbnNmb3JtZXIgZm9yIFNpbmstbWFwcGVycy4KICoKICogSXQgY29udGFpbnMgdGhlIGJvdW5kIFN0cmVhbSBhbmQgdGhlIHNpbmstbWFwcGVyLiBPbmx5IHdoZW4gdGhlIHVzZXIgc3RhcnRzCiAqIGxpc3RlbmluZyB0byB0aGlzIHN0cmVhbSBpcyB0aGUgc2luay1tYXBwZXIgaW52b2tlZC4gVGhlIHJlc3VsdCBpcyB1c2VkCiAqIHRvIGNyZWF0ZSBhIFN0cmVhbVN1YnNjcmlwdGlvbiB0aGF0IHRyYW5zZm9ybXMgZXZlbnRzLgogKi8KY2xhc3MgX0JvdW5kU2lua1N0cmVhbTxTLCBUPiBleHRlbmRzIFN0cmVhbTxUPiB7CiAgZmluYWwgX1NpbmtNYXBwZXI8UywgVD4gX3NpbmtNYXBwZXI7CiAgZmluYWwgU3RyZWFtPFM+IF9zdHJlYW07CgogIGJvb2wgZ2V0IGlzQnJvYWRjYXN0ID0+IF9zdHJlYW0uaXNCcm9hZGNhc3Q7CgogIF9Cb3VuZFNpbmtTdHJlYW0odGhpcy5fc3RyZWFtLCB0aGlzLl9zaW5rTWFwcGVyKTsKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IGxpc3Rlbih2b2lkIG9uRGF0YShUIGV2ZW50KSwKICAgICAge0Z1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcn0pIHsKICAgIGNhbmNlbE9uRXJyb3IgPSBpZGVudGljYWwodHJ1ZSwgY2FuY2VsT25FcnJvcik7CiAgICBTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uID0KICAgICAgICBuZXcgX1NpbmtUcmFuc2Zvcm1lclN0cmVhbVN1YnNjcmlwdGlvbjxTLCBUPigKICAgICAgICAgICAgX3N0cmVhbSwgX3NpbmtNYXBwZXIsIG9uRGF0YSwgb25FcnJvciwgb25Eb25lLCBjYW5jZWxPbkVycm9yKTsKICAgIHJldHVybiBzdWJzY3JpcHRpb247CiAgfQp9CgovLy8gRGF0YS1oYW5kbGVyIGNvbWluZyBmcm9tIFtTdHJlYW1UcmFuc2Zvcm1lci5mcm9tSGFuZGxlcnNdLgp0eXBlZGVmIHZvaWQgX1RyYW5zZm9ybURhdGFIYW5kbGVyPFMsIFQ+KFMgZGF0YSwgRXZlbnRTaW5rPFQ+IHNpbmspOwoKLy8vIEVycm9yLWhhbmRsZXIgY29taW5nIGZyb20gW1N0cmVhbVRyYW5zZm9ybWVyLmZyb21IYW5kbGVyc10uCnR5cGVkZWYgdm9pZCBfVHJhbnNmb3JtRXJyb3JIYW5kbGVyPFQ+KAogICAgT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UsIEV2ZW50U2luazxUPiBzaW5rKTsKCi8vLyBEb25lLWhhbmRsZXIgY29taW5nIGZyb20gW1N0cmVhbVRyYW5zZm9ybWVyLmZyb21IYW5kbGVyc10uCnR5cGVkZWYgdm9pZCBfVHJhbnNmb3JtRG9uZUhhbmRsZXI8VD4oRXZlbnRTaW5rPFQ+IHNpbmspOwoKLyoqCiAqIFdyYXBzIGhhbmRsZXJzIChmcm9tIFtTdHJlYW1UcmFuc2Zvcm1lci5mcm9tSGFuZGxlcnNdKSBpbnRvIGFuIGBFdmVudFNpbmtgLgogKgogKiBUaGlzIHdheSB3ZSBjYW4gcmV1c2UgdGhlIGNvZGUgZnJvbSBbX1N0cmVhbVNpbmtUcmFuc2Zvcm1lcl0uCiAqLwpjbGFzcyBfSGFuZGxlckV2ZW50U2luazxTLCBUPiBpbXBsZW1lbnRzIEV2ZW50U2luazxTPiB7CiAgZmluYWwgX1RyYW5zZm9ybURhdGFIYW5kbGVyPFMsIFQ+IF9oYW5kbGVEYXRhOwogIGZpbmFsIF9UcmFuc2Zvcm1FcnJvckhhbmRsZXI8VD4gX2hhbmRsZUVycm9yOwogIGZpbmFsIF9UcmFuc2Zvcm1Eb25lSGFuZGxlcjxUPiBfaGFuZGxlRG9uZTsKCiAgLy8vIFRoZSBvdXRwdXQgc2luayB3aGVyZSB0aGUgaGFuZGxlcnMgc2hvdWxkIHNlbmQgdGhlaXIgZGF0YSBpbnRvLgogIEV2ZW50U2luazxUPiBfc2luazsKCiAgX0hhbmRsZXJFdmVudFNpbmsoCiAgICAgIHRoaXMuX2hhbmRsZURhdGEsIHRoaXMuX2hhbmRsZUVycm9yLCB0aGlzLl9oYW5kbGVEb25lLCB0aGlzLl9zaW5rKSB7CiAgICBpZiAoX3NpbmsgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiVGhlIHByb3ZpZGVkIHNpbmsgbXVzdCBub3QgYmUgbnVsbC4iKTsKICAgIH0KICB9CgogIGJvb2wgZ2V0IF9pc0Nsb3NlZCA9PiBfc2luayA9PSBudWxsOwoKICB2b2lkIGFkZChTIGRhdGEpIHsKICAgIGlmIChfaXNDbG9zZWQpIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcigiU2luayBpcyBjbG9zZWQiKTsKICAgIH0KICAgIGlmIChfaGFuZGxlRGF0YSAhPSBudWxsKSB7CiAgICAgIF9oYW5kbGVEYXRhKGRhdGEsIF9zaW5rKTsKICAgIH0gZWxzZSB7CiAgICAgIF9zaW5rLmFkZChkYXRhIGFzIFQpOwogICAgfQogIH0KCiAgdm9pZCBhZGRFcnJvcihPYmplY3QgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICBpZiAoX2lzQ2xvc2VkKSB7CiAgICAgIHRocm93IFN0YXRlRXJyb3IoIlNpbmsgaXMgY2xvc2VkIik7CiAgICB9CiAgICBpZiAoX2hhbmRsZUVycm9yICE9IG51bGwpIHsKICAgICAgX2hhbmRsZUVycm9yKGVycm9yLCBzdGFja1RyYWNlLCBfc2luayk7CiAgICB9IGVsc2UgewogICAgICBfc2luay5hZGRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICB9CiAgfQoKICB2b2lkIGNsb3NlKCkgewogICAgaWYgKF9pc0Nsb3NlZCkgcmV0dXJuOwogICAgdmFyIHNpbmsgPSBfc2luazsKICAgIF9zaW5rID0gbnVsbDsKICAgIGlmIChfaGFuZGxlRG9uZSAhPSBudWxsKSB7CiAgICAgIF9oYW5kbGVEb25lKHNpbmspOwogICAgfSBlbHNlIHsKICAgICAgc2luay5jbG9zZSgpOwogICAgfQogIH0KfQoKLyoqCiAqIEEgU3RyZWFtVHJhbnNmb3JtZXIgdGhhdCB0cmFuc2Zvcm1lcnMgZXZlbnRzIHdpdGggdGhlIGdpdmVuIGhhbmRsZXJzLgogKgogKiBOb3RlIHRoYXQgdGhpcyB0cmFuc2Zvcm1lciBjYW4gb25seSBiZSB1c2VkIG9uY2UuCiAqLwpjbGFzcyBfU3RyZWFtSGFuZGxlclRyYW5zZm9ybWVyPFMsIFQ+IGV4dGVuZHMgX1N0cmVhbVNpbmtUcmFuc2Zvcm1lcjxTLCBUPiB7CiAgX1N0cmVhbUhhbmRsZXJUcmFuc2Zvcm1lcigKICAgICAge3ZvaWQgaGFuZGxlRGF0YShTIGRhdGEsIEV2ZW50U2luazxUPiBzaW5rKSwKICAgICAgdm9pZCBoYW5kbGVFcnJvcihPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSwgRXZlbnRTaW5rPFQ+IHNpbmspLAogICAgICB2b2lkIGhhbmRsZURvbmUoRXZlbnRTaW5rPFQ+IHNpbmspfSkKICAgICAgOiBzdXBlcigoRXZlbnRTaW5rPFQ+IG91dHB1dFNpbmspIHsKICAgICAgICAgIHJldHVybiBuZXcgX0hhbmRsZXJFdmVudFNpbms8UywgVD4oCiAgICAgICAgICAgICAgaGFuZGxlRGF0YSwgaGFuZGxlRXJyb3IsIGhhbmRsZURvbmUsIG91dHB1dFNpbmspOwogICAgICAgIH0pOwoKICBTdHJlYW08VD4gYmluZChTdHJlYW08Uz4gc3RyZWFtKSB7CiAgICByZXR1cm4gc3VwZXIuYmluZChzdHJlYW0pOwogIH0KfQoKLyoqCiAqIEEgU3RyZWFtVHJhbnNmb3JtZXIgdGhhdCBvdmVycmlkZXMgW1N0cmVhbVRyYW5zZm9ybWVyLmJpbmRdIHdpdGggYSBjYWxsYmFjay4KICovCmNsYXNzIF9TdHJlYW1CaW5kVHJhbnNmb3JtZXI8UywgVD4gZXh0ZW5kcyBTdHJlYW1UcmFuc2Zvcm1lckJhc2U8UywgVD4gewogIGZpbmFsIFN0cmVhbTxUPiBGdW5jdGlvbihTdHJlYW08Uz4pIF9iaW5kOwogIF9TdHJlYW1CaW5kVHJhbnNmb3JtZXIodGhpcy5fYmluZCk7CgogIFN0cmVhbTxUPiBiaW5kKFN0cmVhbTxTPiBzdHJlYW0pID0+IF9iaW5kKHN0cmVhbSk7Cn0KCi8vLyBBIGNsb3N1cmUgbWFwcGluZyBhIHN0cmVhbSBhbmQgY2FuY2VsT25FcnJvciB0byBhIFN0cmVhbVN1YnNjcmlwdGlvbi4KdHlwZWRlZiBTdHJlYW1TdWJzY3JpcHRpb248VD4gX1N1YnNjcmlwdGlvblRyYW5zZm9ybWVyPFMsIFQ+KAogICAgU3RyZWFtPFM+IHN0cmVhbSwgYm9vbCBjYW5jZWxPbkVycm9yKTsKCi8qKgogKiBBIFtTdHJlYW1UcmFuc2Zvcm1lcl0gdGhhdCBtaW5pbWl6ZXMgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGNsYXNzZXMuCiAqCiAqIEluc3RlYWQgb2YgaW1wbGVtZW50aW5nIHRocmVlIGNsYXNzZXM6IGEgW1N0cmVhbVRyYW5zZm9ybWVyXSwgYSBbU3RyZWFtXQogKiAoYXMgdGhlIHJlc3VsdCBvZiBhIGBiaW5kYCBjYWxsKSBhbmQgYSBbU3RyZWFtU3Vic2NyaXB0aW9uXSAod2hpY2ggZG9lcyB0aGUKICogYWN0dWFsIHdvcmspLCB0aGlzIGNsYXNzIG9ubHkgcmVxdWlyZXMgYSBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgd2hlbiB0aGUKICogbGFzdCBiaXQgKHRoZSBzdWJzY3JpcHRpb24pIG9mIHRoZSB0cmFuc2Zvcm1lci13b3JrZmxvdyBpcyBuZWVkZWQuCiAqCiAqIFRoZSBnaXZlbiB0cmFuc2Zvcm1lciBmdW5jdGlvbiBtYXBzIGZyb20gU3RyZWFtIGFuZCBjYW5jZWxPbkVycm9yIHRvIGEKICogYFN0cmVhbVN1YnNjcmlwdGlvbmAuIEFzIHN1Y2ggaXQgY2FuIGFsc28gYWN0IG9uIGBjYW5jZWxgIGV2ZW50cywgbWFraW5nIGl0CiAqIGZ1bGx5IGdlbmVyYWwuCiAqLwpjbGFzcyBfU3RyZWFtU3Vic2NyaXB0aW9uVHJhbnNmb3JtZXI8UywgVD4gZXh0ZW5kcyBTdHJlYW1UcmFuc2Zvcm1lckJhc2U8UywgVD4gewogIGZpbmFsIF9TdWJzY3JpcHRpb25UcmFuc2Zvcm1lcjxTLCBUPiBfb25MaXN0ZW47CgogIGNvbnN0IF9TdHJlYW1TdWJzY3JpcHRpb25UcmFuc2Zvcm1lcih0aGlzLl9vbkxpc3Rlbik7CgogIFN0cmVhbTxUPiBiaW5kKFN0cmVhbTxTPiBzdHJlYW0pID0+CiAgICAgIG5ldyBfQm91bmRTdWJzY3JpcHRpb25TdHJlYW08UywgVD4oc3RyZWFtLCBfb25MaXN0ZW4pOwp9CgovKioKICogQSBzdHJlYW0gdHJhbnNmb3JtZWQgYnkgYSBbX1N0cmVhbVN1YnNjcmlwdGlvblRyYW5zZm9ybWVyXS4KICoKICogV2hlbiB0aGlzIHN0cmVhbSBpcyBsaXN0ZW5lZCB0byBpdCBpbnZva2VzIHRoZSBbX29uTGlzdGVuXSBmdW5jdGlvbiB3aXRoCiAqIHRoZSBzdG9yZWQgW19zdHJlYW1dLiBVc3VhbGx5IHRoZSB0cmFuc2Zvcm1lciBzdGFydHMgbGlzdGVuaW5nIGF0IHRoaXMKICogbW9tZW50LgogKi8KY2xhc3MgX0JvdW5kU3Vic2NyaXB0aW9uU3RyZWFtPFMsIFQ+IGV4dGVuZHMgU3RyZWFtPFQ+IHsKICBmaW5hbCBfU3Vic2NyaXB0aW9uVHJhbnNmb3JtZXI8UywgVD4gX29uTGlzdGVuOwogIGZpbmFsIFN0cmVhbTxTPiBfc3RyZWFtOwoKICBfQm91bmRTdWJzY3JpcHRpb25TdHJlYW0odGhpcy5fc3RyZWFtLCB0aGlzLl9vbkxpc3Rlbik7CgogIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBsaXN0ZW4odm9pZCBvbkRhdGEoVCBldmVudCksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICBjYW5jZWxPbkVycm9yID0gaWRlbnRpY2FsKHRydWUsIGNhbmNlbE9uRXJyb3IpOwogICAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHJlc3VsdCA9IF9vbkxpc3Rlbihfc3RyZWFtLCBjYW5jZWxPbkVycm9yKTsKICAgIHJlc3VsdC5vbkRhdGEob25EYXRhKTsKICAgIHJlc3VsdC5vbkVycm9yKG9uRXJyb3IpOwogICAgcmVzdWx0Lm9uRG9uZShvbkRvbmUpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KgVAATk48ARQBBEcENRQhARUWBAEyKAQBERQEAgEEOANHSEgELy4kIQEsJwFRUFE4RSoUUAQBRjMBGwEGKgVHRAwGFhU4BhYEAQYwBUdEDAY4FTgGKAQBBi8FR0QMBhIVOAYUBAEpARQuBAEVLwQBFxk3HCQGEQQBHQoiFRcGBAE2CjQVISYPGQgGBAEXChwgFRcGBAIBPQEEKQNHGgMoBEknMgEmNwIBBD8DT0s6BDEnGwEvATQBNT80KTZLGQQCAT9FAUAoPQE/OgEETwNBBDgxMC4BRhYBFUsZRgYEAScBFRUqBh8gDRwGBAE5FSoGIC4NKQYEAREbFhIfGQ0UBgQCAQRJAzUETR0zUCsqLkAMASUfBAIBBFAESS0mATUCAUo+KwEESgNMT05GA0pPEgRRMgE4ASY9AgEEPwNMSgsEOTIbAToBNT80RhsdGxMEAgEjZGFydDphc3luYy9zdHJlYW1fdHJhbnNmb3JtZXJzLmRhcnQrb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2FzeW5jL3pvbmUuZGFydMAA1p4vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmFzeW5jOwoKdHlwZWRlZiBSIFpvbmVDYWxsYmFjazxSPigpOwp0eXBlZGVmIFIgWm9uZVVuYXJ5Q2FsbGJhY2s8UiwgVD4oVCBhcmcpOwp0eXBlZGVmIFIgWm9uZUJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4oVDEgYXJnMSwgVDIgYXJnMik7Cgp0eXBlZGVmIEhhbmRsZVVuY2F1Z2h0RXJyb3JIYW5kbGVyID0gdm9pZCBGdW5jdGlvbihab25lIHNlbGYsCiAgICBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKTsKdHlwZWRlZiBSdW5IYW5kbGVyID0gUiBGdW5jdGlvbjxSPigKICAgIFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLCBSIEZ1bmN0aW9uKCkgZik7CnR5cGVkZWYgUnVuVW5hcnlIYW5kbGVyID0gUiBGdW5jdGlvbjxSLCBUPigKICAgIFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLCBSIEZ1bmN0aW9uKFQgYXJnKSBmLCBUIGFyZyk7CnR5cGVkZWYgUnVuQmluYXJ5SGFuZGxlciA9IFIgRnVuY3Rpb248UiwgVDEsIFQyPihab25lIHNlbGYsIFpvbmVEZWxlZ2F0ZSBwYXJlbnQsCiAgICBab25lIHpvbmUsIFIgRnVuY3Rpb24oVDEgYXJnMSwgVDIgYXJnMikgZiwgVDEgYXJnMSwgVDIgYXJnMik7CnR5cGVkZWYgUmVnaXN0ZXJDYWxsYmFja0hhbmRsZXIgPSBab25lQ2FsbGJhY2s8Uj4gRnVuY3Rpb248Uj4oCiAgICBab25lIHNlbGYsIFpvbmVEZWxlZ2F0ZSBwYXJlbnQsIFpvbmUgem9uZSwgUiBGdW5jdGlvbigpIGYpOwp0eXBlZGVmIFJlZ2lzdGVyVW5hcnlDYWxsYmFja0hhbmRsZXIgPSBab25lVW5hcnlDYWxsYmFjazxSLCBUPiBGdW5jdGlvbjxSLCBUPigKICAgIFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLCBSIEZ1bmN0aW9uKFQgYXJnKSBmKTsKdHlwZWRlZiBSZWdpc3RlckJpbmFyeUNhbGxiYWNrSGFuZGxlcgogICAgPSBab25lQmluYXJ5Q2FsbGJhY2s8UiwgVDEsIFQyPiBGdW5jdGlvbjxSLCBUMSwgVDI+KFpvbmUgc2VsZiwKICAgICAgICBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIFIgRnVuY3Rpb24oVDEgYXJnMSwgVDIgYXJnMikgZik7CnR5cGVkZWYgQXN5bmNFcnJvciBFcnJvckNhbGxiYWNrSGFuZGxlcihab25lIHNlbGYsIFpvbmVEZWxlZ2F0ZSBwYXJlbnQsCiAgICBab25lIHpvbmUsIE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKTsKdHlwZWRlZiB2b2lkIFNjaGVkdWxlTWljcm90YXNrSGFuZGxlcigKICAgIFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLCB2b2lkIGYoKSk7CnR5cGVkZWYgVGltZXIgQ3JlYXRlVGltZXJIYW5kbGVyKAogICAgWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIER1cmF0aW9uIGR1cmF0aW9uLCB2b2lkIGYoKSk7CnR5cGVkZWYgVGltZXIgQ3JlYXRlUGVyaW9kaWNUaW1lckhhbmRsZXIoWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LAogICAgWm9uZSB6b25lLCBEdXJhdGlvbiBwZXJpb2QsIHZvaWQgZihUaW1lciB0aW1lcikpOwp0eXBlZGVmIHZvaWQgUHJpbnRIYW5kbGVyKAogICAgWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIFN0cmluZyBsaW5lKTsKdHlwZWRlZiBab25lIEZvcmtIYW5kbGVyKFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLAogICAgWm9uZVNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbiwgTWFwIHpvbmVWYWx1ZXMpOwoKLyoqIFBhaXIgb2YgZXJyb3IgYW5kIHN0YWNrIHRyYWNlLiBSZXR1cm5lZCBieSBbWm9uZS5lcnJvckNhbGxiYWNrXS4gKi8KY2xhc3MgQXN5bmNFcnJvciBpbXBsZW1lbnRzIEVycm9yIHsKICBmaW5hbCBPYmplY3QgZXJyb3I7CiAgZmluYWwgU3RhY2tUcmFjZSBzdGFja1RyYWNlOwoKICBBc3luY0Vycm9yKHRoaXMuZXJyb3IsIHRoaXMuc3RhY2tUcmFjZSk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICckZXJyb3InOwp9CgpjbGFzcyBfWm9uZUZ1bmN0aW9uPFQgZXh0ZW5kcyBGdW5jdGlvbj4gewogIGZpbmFsIF9ab25lIHpvbmU7CiAgZmluYWwgVCBmdW5jdGlvbjsKICBjb25zdCBfWm9uZUZ1bmN0aW9uKHRoaXMuem9uZSwgdGhpcy5mdW5jdGlvbik7Cn0KCi8qKgogKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBhIGZvcmtlZCB6b25lLgogKgogKiBXaGVuIGZvcmtpbmcgYSBuZXcgem9uZSAoc2VlIFtab25lLmZvcmtdKSBvbmUgY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0CiAqIGJlaGF2aW9yIG9mIHRoZSB6b25lIGJ5IHByb3ZpZGluZyBjYWxsYmFja3MuIFRoZXNlIGNhbGxiYWNrcyBtdXN0IGJlCiAqIGdpdmVuIGluIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCiAqCiAqIEhhbmRsZXJzIGhhdmUgdGhlIHNhbWUgc2lnbmF0dXJlIGFzIHRoZSBzYW1lLW5hbWVkIG1ldGhvZHMgb24gW1pvbmVdIGJ1dAogKiByZWNlaXZlIHRocmVlIGFkZGl0aW9uYWwgYXJndW1lbnRzOgogKgogKiAgIDEuIHRoZSB6b25lIHRoZSBoYW5kbGVycyBhcmUgYXR0YWNoZWQgdG8gKHRoZSAic2VsZiIgem9uZSkuCiAqICAgMi4gYSBbWm9uZURlbGVnYXRlXSB0byB0aGUgcGFyZW50IHpvbmUuCiAqICAgMy4gdGhlIHpvbmUgdGhhdCBmaXJzdCByZWNlaXZlZCB0aGUgcmVxdWVzdCAoYmVmb3JlIHRoZSByZXF1ZXN0IHdhcwogKiAgICAgYnViYmxlZCB1cCkuCiAqCiAqIEhhbmRsZXJzIGNhbiBlaXRoZXIgc3RvcCBwcm9wYWdhdGlvbiB0aGUgcmVxdWVzdCAoYnkgc2ltcGx5IG5vdCBjYWxsaW5nIHRoZQogKiBwYXJlbnQgaGFuZGxlciksIG9yIGZvcndhcmQgdG8gdGhlIHBhcmVudCB6b25lLCBwb3RlbnRpYWxseSBtb2RpZnlpbmcgdGhlCiAqIGFyZ3VtZW50cyBvbiB0aGUgd2F5LgogKi8KYWJzdHJhY3QgY2xhc3MgWm9uZVNwZWNpZmljYXRpb24gewogIC8qKgogICAqIENyZWF0ZXMgYSBzcGVjaWZpY2F0aW9uIHdpdGggdGhlIHByb3ZpZGVkIGhhbmRsZXJzLgogICAqLwogIGNvbnN0IGZhY3RvcnkgWm9uZVNwZWNpZmljYXRpb24oCiAgICAgIHtIYW5kbGVVbmNhdWdodEVycm9ySGFuZGxlciBoYW5kbGVVbmNhdWdodEVycm9yLAogICAgICBSdW5IYW5kbGVyIHJ1biwKICAgICAgUnVuVW5hcnlIYW5kbGVyIHJ1blVuYXJ5LAogICAgICBSdW5CaW5hcnlIYW5kbGVyIHJ1bkJpbmFyeSwKICAgICAgUmVnaXN0ZXJDYWxsYmFja0hhbmRsZXIgcmVnaXN0ZXJDYWxsYmFjaywKICAgICAgUmVnaXN0ZXJVbmFyeUNhbGxiYWNrSGFuZGxlciByZWdpc3RlclVuYXJ5Q2FsbGJhY2ssCiAgICAgIFJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2tIYW5kbGVyIHJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2ssCiAgICAgIEVycm9yQ2FsbGJhY2tIYW5kbGVyIGVycm9yQ2FsbGJhY2ssCiAgICAgIFNjaGVkdWxlTWljcm90YXNrSGFuZGxlciBzY2hlZHVsZU1pY3JvdGFzaywKICAgICAgQ3JlYXRlVGltZXJIYW5kbGVyIGNyZWF0ZVRpbWVyLAogICAgICBDcmVhdGVQZXJpb2RpY1RpbWVySGFuZGxlciBjcmVhdGVQZXJpb2RpY1RpbWVyLAogICAgICBQcmludEhhbmRsZXIgcHJpbnQsCiAgICAgIEZvcmtIYW5kbGVyIGZvcmt9KSA9IF9ab25lU3BlY2lmaWNhdGlvbjsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIHNwZWNpZmljYXRpb24gZnJvbSBbb3RoZXJdIHdpdGggdGhlIHByb3ZpZGVkIGhhbmRsZXJzIG92ZXJyaWRpbmcKICAgKiB0aGUgb25lcyBpbiBbb3RoZXJdLgogICAqLwogIGZhY3RvcnkgWm9uZVNwZWNpZmljYXRpb24uZnJvbShab25lU3BlY2lmaWNhdGlvbiBvdGhlciwKICAgICAge0hhbmRsZVVuY2F1Z2h0RXJyb3JIYW5kbGVyIGhhbmRsZVVuY2F1Z2h0RXJyb3IsCiAgICAgIFJ1bkhhbmRsZXIgcnVuLAogICAgICBSdW5VbmFyeUhhbmRsZXIgcnVuVW5hcnksCiAgICAgIFJ1bkJpbmFyeUhhbmRsZXIgcnVuQmluYXJ5LAogICAgICBSZWdpc3RlckNhbGxiYWNrSGFuZGxlciByZWdpc3RlckNhbGxiYWNrLAogICAgICBSZWdpc3RlclVuYXJ5Q2FsbGJhY2tIYW5kbGVyIHJlZ2lzdGVyVW5hcnlDYWxsYmFjaywKICAgICAgUmVnaXN0ZXJCaW5hcnlDYWxsYmFja0hhbmRsZXIgcmVnaXN0ZXJCaW5hcnlDYWxsYmFjaywKICAgICAgRXJyb3JDYWxsYmFja0hhbmRsZXIgZXJyb3JDYWxsYmFjaywKICAgICAgU2NoZWR1bGVNaWNyb3Rhc2tIYW5kbGVyIHNjaGVkdWxlTWljcm90YXNrLAogICAgICBDcmVhdGVUaW1lckhhbmRsZXIgY3JlYXRlVGltZXIsCiAgICAgIENyZWF0ZVBlcmlvZGljVGltZXJIYW5kbGVyIGNyZWF0ZVBlcmlvZGljVGltZXIsCiAgICAgIFByaW50SGFuZGxlciBwcmludCwKICAgICAgRm9ya0hhbmRsZXIgZm9ya30pIHsKICAgIHJldHVybiBuZXcgWm9uZVNwZWNpZmljYXRpb24oCiAgICAgICAgaGFuZGxlVW5jYXVnaHRFcnJvcjogaGFuZGxlVW5jYXVnaHRFcnJvciA/PyBvdGhlci5oYW5kbGVVbmNhdWdodEVycm9yLAogICAgICAgIHJ1bjogcnVuID8/IG90aGVyLnJ1biwKICAgICAgICBydW5VbmFyeTogcnVuVW5hcnkgPz8gb3RoZXIucnVuVW5hcnksCiAgICAgICAgcnVuQmluYXJ5OiBydW5CaW5hcnkgPz8gb3RoZXIucnVuQmluYXJ5LAogICAgICAgIHJlZ2lzdGVyQ2FsbGJhY2s6IHJlZ2lzdGVyQ2FsbGJhY2sgPz8gb3RoZXIucmVnaXN0ZXJDYWxsYmFjaywKICAgICAgICByZWdpc3RlclVuYXJ5Q2FsbGJhY2s6CiAgICAgICAgICAgIHJlZ2lzdGVyVW5hcnlDYWxsYmFjayA/PyBvdGhlci5yZWdpc3RlclVuYXJ5Q2FsbGJhY2ssCiAgICAgICAgcmVnaXN0ZXJCaW5hcnlDYWxsYmFjazoKICAgICAgICAgICAgcmVnaXN0ZXJCaW5hcnlDYWxsYmFjayA/PyBvdGhlci5yZWdpc3RlckJpbmFyeUNhbGxiYWNrLAogICAgICAgIGVycm9yQ2FsbGJhY2s6IGVycm9yQ2FsbGJhY2sgPz8gb3RoZXIuZXJyb3JDYWxsYmFjaywKICAgICAgICBzY2hlZHVsZU1pY3JvdGFzazogc2NoZWR1bGVNaWNyb3Rhc2sgPz8gb3RoZXIuc2NoZWR1bGVNaWNyb3Rhc2ssCiAgICAgICAgY3JlYXRlVGltZXI6IGNyZWF0ZVRpbWVyID8/IG90aGVyLmNyZWF0ZVRpbWVyLAogICAgICAgIGNyZWF0ZVBlcmlvZGljVGltZXI6IGNyZWF0ZVBlcmlvZGljVGltZXIgPz8gb3RoZXIuY3JlYXRlUGVyaW9kaWNUaW1lciwKICAgICAgICBwcmludDogcHJpbnQgPz8gb3RoZXIucHJpbnQsCiAgICAgICAgZm9yazogZm9yayA/PyBvdGhlci5mb3JrKTsKICB9CgogIEhhbmRsZVVuY2F1Z2h0RXJyb3JIYW5kbGVyIGdldCBoYW5kbGVVbmNhdWdodEVycm9yOwogIFJ1bkhhbmRsZXIgZ2V0IHJ1bjsKICBSdW5VbmFyeUhhbmRsZXIgZ2V0IHJ1blVuYXJ5OwogIFJ1bkJpbmFyeUhhbmRsZXIgZ2V0IHJ1bkJpbmFyeTsKICBSZWdpc3RlckNhbGxiYWNrSGFuZGxlciBnZXQgcmVnaXN0ZXJDYWxsYmFjazsKICBSZWdpc3RlclVuYXJ5Q2FsbGJhY2tIYW5kbGVyIGdldCByZWdpc3RlclVuYXJ5Q2FsbGJhY2s7CiAgUmVnaXN0ZXJCaW5hcnlDYWxsYmFja0hhbmRsZXIgZ2V0IHJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2s7CiAgRXJyb3JDYWxsYmFja0hhbmRsZXIgZ2V0IGVycm9yQ2FsbGJhY2s7CiAgU2NoZWR1bGVNaWNyb3Rhc2tIYW5kbGVyIGdldCBzY2hlZHVsZU1pY3JvdGFzazsKICBDcmVhdGVUaW1lckhhbmRsZXIgZ2V0IGNyZWF0ZVRpbWVyOwogIENyZWF0ZVBlcmlvZGljVGltZXJIYW5kbGVyIGdldCBjcmVhdGVQZXJpb2RpY1RpbWVyOwogIFByaW50SGFuZGxlciBnZXQgcHJpbnQ7CiAgRm9ya0hhbmRsZXIgZ2V0IGZvcms7Cn0KCi8qKgogKiBJbnRlcm5hbCBbWm9uZVNwZWNpZmljYXRpb25dIGNsYXNzLgogKgogKiBUaGUgaW1wbGVtZW50YXRpb24gd2FudHMgdG8gcmVseSBvbiB0aGUgZmFjdCB0aGF0IHRoZSBnZXR0ZXJzIGNhbm5vdCBjaGFuZ2UKICogZHluYW1pY2FsbHkuIFdlIHRodXMgcmVxdWlyZSB1c2VycyB0byBnbyB0aHJvdWdoIHRoZSByZWRpcmVjdGluZwogKiBbWm9uZVNwZWNpZmljYXRpb25dIGNvbnN0cnVjdG9yIHdoaWNoIGluc3RhbnRpYXRlcyB0aGlzIGNsYXNzLgogKi8KY2xhc3MgX1pvbmVTcGVjaWZpY2F0aW9uIGltcGxlbWVudHMgWm9uZVNwZWNpZmljYXRpb24gewogIGNvbnN0IF9ab25lU3BlY2lmaWNhdGlvbigKICAgICAge3RoaXMuaGFuZGxlVW5jYXVnaHRFcnJvciwKICAgICAgdGhpcy5ydW4sCiAgICAgIHRoaXMucnVuVW5hcnksCiAgICAgIHRoaXMucnVuQmluYXJ5LAogICAgICB0aGlzLnJlZ2lzdGVyQ2FsbGJhY2ssCiAgICAgIHRoaXMucmVnaXN0ZXJVbmFyeUNhbGxiYWNrLAogICAgICB0aGlzLnJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2ssCiAgICAgIHRoaXMuZXJyb3JDYWxsYmFjaywKICAgICAgdGhpcy5zY2hlZHVsZU1pY3JvdGFzaywKICAgICAgdGhpcy5jcmVhdGVUaW1lciwKICAgICAgdGhpcy5jcmVhdGVQZXJpb2RpY1RpbWVyLAogICAgICB0aGlzLnByaW50LAogICAgICB0aGlzLmZvcmt9KTsKCiAgZmluYWwgSGFuZGxlVW5jYXVnaHRFcnJvckhhbmRsZXIgaGFuZGxlVW5jYXVnaHRFcnJvcjsKICBmaW5hbCBSdW5IYW5kbGVyIHJ1bjsKICBmaW5hbCBSdW5VbmFyeUhhbmRsZXIgcnVuVW5hcnk7CiAgZmluYWwgUnVuQmluYXJ5SGFuZGxlciBydW5CaW5hcnk7CiAgZmluYWwgUmVnaXN0ZXJDYWxsYmFja0hhbmRsZXIgcmVnaXN0ZXJDYWxsYmFjazsKICBmaW5hbCBSZWdpc3RlclVuYXJ5Q2FsbGJhY2tIYW5kbGVyIHJlZ2lzdGVyVW5hcnlDYWxsYmFjazsKICBmaW5hbCBSZWdpc3RlckJpbmFyeUNhbGxiYWNrSGFuZGxlciByZWdpc3RlckJpbmFyeUNhbGxiYWNrOwogIGZpbmFsIEVycm9yQ2FsbGJhY2tIYW5kbGVyIGVycm9yQ2FsbGJhY2s7CiAgZmluYWwgU2NoZWR1bGVNaWNyb3Rhc2tIYW5kbGVyIHNjaGVkdWxlTWljcm90YXNrOwogIGZpbmFsIENyZWF0ZVRpbWVySGFuZGxlciBjcmVhdGVUaW1lcjsKICBmaW5hbCBDcmVhdGVQZXJpb2RpY1RpbWVySGFuZGxlciBjcmVhdGVQZXJpb2RpY1RpbWVyOwogIGZpbmFsIFByaW50SGFuZGxlciBwcmludDsKICBmaW5hbCBGb3JrSGFuZGxlciBmb3JrOwp9CgovKioKICogQW4gYWRhcHRlZCB2aWV3IG9mIHRoZSBwYXJlbnQgem9uZS4KICoKICogVGhpcyBjbGFzcyBhbGxvd3MgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgem9uZSBtZXRob2QgdG8gaW52b2tlIG1ldGhvZHMgb24KICogdGhlIHBhcmVudCB6b25lIHdoaWxlIHJldGFpbmluZyBrbm93bGVkZ2Ugb2YgdGhlIG9yaWdpbmF0aW5nIHpvbmUuCiAqCiAqIEN1c3RvbSB6b25lcyAoY3JlYXRlZCB0aHJvdWdoIFtab25lLmZvcmtdIG9yIFtydW5ab25lZF0pIGNhbiBwcm92aWRlCiAqIGltcGxlbWVudGF0aW9ucyBvZiBtb3N0IG1ldGhvZHMgb2Ygem9uZXMuIFRoaXMgaXMgc2ltaWxhciB0byBvdmVycmlkaW5nCiAqIG1ldGhvZHMgb24gW1pvbmVdLCBleGNlcHQgdGhhdCB0aGlzIG1lY2hhbmlzbSBkb2Vzbid0IHJlcXVpcmUgc3ViY2xhc3NpbmcuCiAqCiAqIEEgY3VzdG9tIHpvbmUgZnVuY3Rpb24gKHByb3ZpZGVkIHRocm91Z2ggYSBbWm9uZVNwZWNpZmljYXRpb25dKSB0eXBpY2FsbHkKICogcmVjb3JkcyBvciB3cmFwcyBpdHMgcGFyYW1ldGVycyBhbmQgdGhlbiBkZWxlZ2F0ZXMgdGhlIG9wZXJhdGlvbiB0byBpdHMKICogcGFyZW50IHpvbmUgdXNpbmcgdGhlIHByb3ZpZGVkIFtab25lRGVsZWdhdGVdLgogKgogKiBXaGlsZSB6b25lcyBoYXZlIGFjY2VzcyB0byB0aGVpciBwYXJlbnQgem9uZSAodGhyb3VnaCBbWm9uZS5wYXJlbnRdKSBpdCBpcwogKiByZWNvbW1lbmRlZCB0byBjYWxsIHRoZSBtZXRob2RzIG9uIHRoZSBwcm92aWRlZCBwYXJlbnQgZGVsZWdhdGUgZm9yIHR3bwogKiByZWFzb25zOgogKiAxLiB0aGUgZGVsZWdhdGUgbWV0aG9kcyB0YWtlIGFuIGFkZGl0aW9uYWwgYHpvbmVgIGFyZ3VtZW50IHdoaWNoIGlzIHRoZQogKiAgIHpvbmUgdGhlIGFjdGlvbiBoYXMgYmVlbiBpbml0aWF0ZWQgaW4uCiAqIDIuIGRlbGVnYXRlIGNhbGxzIGFyZSBtb3JlIGVmZmljaWVudCwgc2luY2UgdGhlIGltcGxlbWVudGF0aW9uIGtub3dzIGhvdwogKiAgIHRvIHNraXAgem9uZXMgdGhhdCB3b3VsZCBqdXN0IGRlbGVnYXRlIHRvIHRoZWlyIHBhcmVudHMuCiAqLwphYnN0cmFjdCBjbGFzcyBab25lRGVsZWdhdGUgewogIHZvaWQgaGFuZGxlVW5jYXVnaHRFcnJvcihab25lIHpvbmUsIGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpOwogIFIgcnVuPFI+KFpvbmUgem9uZSwgUiBmKCkpOwogIFIgcnVuVW5hcnk8UiwgVD4oWm9uZSB6b25lLCBSIGYoVCBhcmcpLCBUIGFyZyk7CiAgUiBydW5CaW5hcnk8UiwgVDEsIFQyPihab25lIHpvbmUsIFIgZihUMSBhcmcxLCBUMiBhcmcyKSwgVDEgYXJnMSwgVDIgYXJnMik7CiAgWm9uZUNhbGxiYWNrPFI+IHJlZ2lzdGVyQ2FsbGJhY2s8Uj4oWm9uZSB6b25lLCBSIGYoKSk7CiAgWm9uZVVuYXJ5Q2FsbGJhY2s8UiwgVD4gcmVnaXN0ZXJVbmFyeUNhbGxiYWNrPFIsIFQ+KFpvbmUgem9uZSwgUiBmKFQgYXJnKSk7CiAgWm9uZUJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4gcmVnaXN0ZXJCaW5hcnlDYWxsYmFjazxSLCBUMSwgVDI+KAogICAgICBab25lIHpvbmUsIFIgZihUMSBhcmcxLCBUMiBhcmcyKSk7CiAgQXN5bmNFcnJvciBlcnJvckNhbGxiYWNrKFpvbmUgem9uZSwgT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpOwogIHZvaWQgc2NoZWR1bGVNaWNyb3Rhc2soWm9uZSB6b25lLCB2b2lkIGYoKSk7CiAgVGltZXIgY3JlYXRlVGltZXIoWm9uZSB6b25lLCBEdXJhdGlvbiBkdXJhdGlvbiwgdm9pZCBmKCkpOwogIFRpbWVyIGNyZWF0ZVBlcmlvZGljVGltZXIoWm9uZSB6b25lLCBEdXJhdGlvbiBwZXJpb2QsIHZvaWQgZihUaW1lciB0aW1lcikpOwogIHZvaWQgcHJpbnQoWm9uZSB6b25lLCBTdHJpbmcgbGluZSk7CiAgWm9uZSBmb3JrKFpvbmUgem9uZSwgWm9uZVNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbiwgTWFwIHpvbmVWYWx1ZXMpOwp9CgovKioKICogQSB6b25lIHJlcHJlc2VudHMgYW4gZW52aXJvbm1lbnQgdGhhdCByZW1haW5zIHN0YWJsZSBhY3Jvc3MgYXN5bmNocm9ub3VzCiAqIGNhbGxzLgogKgogKiBDb2RlIGlzIGFsd2F5cyBleGVjdXRlZCBpbiB0aGUgY29udGV4dCBvZiBhIHpvbmUsIGF2YWlsYWJsZSBhcwogKiBbWm9uZS5jdXJyZW50XS4gVGhlIGluaXRpYWwgYG1haW5gIGZ1bmN0aW9uIHJ1bnMgaW4gdGhlIGNvbnRleHQgb2YgdGhlCiAqIGRlZmF1bHQgem9uZSAoW1pvbmUucm9vdF0pLiBDb2RlIGNhbiBiZSBydW4gaW4gYSBkaWZmZXJlbnQgem9uZSB1c2luZyBlaXRoZXIKICogW3J1blpvbmVkXSwgdG8gY3JlYXRlIGEgbmV3IHpvbmUsIG9yIFtab25lLnJ1bl0gdG8gcnVuIGNvZGUgaW4gdGhlIGNvbnRleHQgb2YKICogYW4gZXhpc3Rpbmcgem9uZSBsaWtlbHkgY3JlYXRlZCB1c2luZyBbWm9uZS5mb3JrXS4KICoKICogRGV2ZWxvcGVycyBjYW4gY3JlYXRlIGEgbmV3IHpvbmUgdGhhdCBvdmVycmlkZXMgc29tZSBvZiB0aGUgZnVuY3Rpb25hbGl0eSBvZgogKiBhbiBleGlzdGluZyB6b25lLiBGb3IgZXhhbXBsZSwgY3VzdG9tIHpvbmVzIGNhbiByZXBsYWNlIG9mIG1vZGlmeSB0aGUKICogYmVoYXZpb3Igb2YgYHByaW50YCwgdGltZXJzLCBtaWNyb3Rhc2tzIG9yIGhvdyB1bmNhdWdodCBlcnJvcnMgYXJlIGhhbmRsZWQuCiAqCiAqIFRoZSBbWm9uZV0gY2xhc3MgaXMgbm90IHN1YmNsYXNzYWJsZSwgYnV0IHVzZXJzIGNhbiBwcm92aWRlIGN1c3RvbSB6b25lcyBieQogKiBmb3JraW5nIGFuIGV4aXN0aW5nIHpvbmUgKHVzdWFsbHkgW1pvbmUuY3VycmVudF0pIHdpdGggYSBbWm9uZVNwZWNpZmljYXRpb25dLgogKiBUaGlzIGlzIHNpbWlsYXIgdG8gY3JlYXRpbmcgYSBuZXcgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBiYXNlIGBab25lYCBjbGFzcwogKiBhbmQgdGhhdCBvdmVycmlkZXMgc29tZSBtZXRob2RzLCBleGNlcHQgd2l0aG91dCBhY3R1YWxseSBjcmVhdGluZyBhIG5ldwogKiBjbGFzcy4gSW5zdGVhZCB0aGUgb3ZlcnJpZGluZyBtZXRob2RzIGFyZSBwcm92aWRlZCBhcyBmdW5jdGlvbnMgdGhhdAogKiBleHBsaWNpdGx5IHRha2UgdGhlIGVxdWl2YWxlbnQgb2YgdGhlaXIgb3duIGNsYXNzLCB0aGUgInN1cGVyIiBjbGFzcyBhbmQgdGhlCiAqIGB0aGlzYCBvYmplY3QgYXMgcGFyYW1ldGVycy4KICoKICogQXN5bmNocm9ub3VzIGNhbGxiYWNrcyBhbHdheXMgcnVuIGluIHRoZSBjb250ZXh0IG9mIHRoZSB6b25lIHdoZXJlIHRoZXkgd2VyZQogKiBzY2hlZHVsZWQuIFRoaXMgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdHdvIHN0ZXBzOgogKiAxLiB0aGUgY2FsbGJhY2sgaXMgZmlyc3QgcmVnaXN0ZXJlZCB1c2luZyBvbmUgb2YgW3JlZ2lzdGVyQ2FsbGJhY2tdLAogKiAgIFtyZWdpc3RlclVuYXJ5Q2FsbGJhY2tdLCBvciBbcmVnaXN0ZXJCaW5hcnlDYWxsYmFja10uIFRoaXMgYWxsb3dzIHRoZSB6b25lCiAqICAgdG8gcmVjb3JkIHRoYXQgYSBjYWxsYmFjayBleGlzdHMgYW5kIHBvdGVudGlhbGx5IG1vZGlmeSBpdCAoYnkgcmV0dXJuaW5nIGEKICogICBkaWZmZXJlbnQgY2FsbGJhY2spLiBUaGUgY29kZSBkb2luZyB0aGUgcmVnaXN0cmF0aW9uIChlLmcuLCBgRnV0dXJlLnRoZW5gKQogKiAgIGFsc28gcmVtZW1iZXJzIHRoZSBjdXJyZW50IHpvbmUgc28gdGhhdCBpdCBjYW4gbGF0ZXIgcnVuIHRoZSBjYWxsYmFjayBpbgogKiAgIHRoYXQgem9uZS4KICogMi4gQXQgYSBsYXRlciBwb2ludCB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBpcyBydW4gaW4gdGhlIHJlbWVtYmVyZWQgem9uZS4KICoKICogVGhpcyBpcyBhbGwgaGFuZGxlZCBpbnRlcm5hbGx5IGJ5IHRoZSBwbGF0Zm9ybSBjb2RlIGFuZCBtb3N0IHVzZXJzIGRvbid0IG5lZWQKICogdG8gd29ycnkgYWJvdXQgaXQuIEhvd2V2ZXIsIGRldmVsb3BlcnMgb2YgbmV3IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLAogKiBwcm92aWRlZCBieSB0aGUgdW5kZXJseWluZyBzeXN0ZW0gb3IgdGhyb3VnaCBuYXRpdmUgZXh0ZW5zaW9ucywgbXVzdCBmb2xsb3cKICogdGhlIHByb3RvY29sIHRvIGJlIHpvbmUgY29tcGF0aWJsZS4KICoKICogRm9yIGNvbnZlbmllbmNlLCB6b25lcyBwcm92aWRlIFtiaW5kQ2FsbGJhY2tdIChhbmQgdGhlIGNvcnJlc3BvbmRpbmcKICogW2JpbmRVbmFyeUNhbGxiYWNrXSBhbmQgW2JpbmRCaW5hcnlDYWxsYmFja10pIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHJlc3BlY3QKICogdGhlIHpvbmUgY29udHJhY3Q6IHRoZXNlIGZ1bmN0aW9ucyBmaXJzdCBpbnZva2UgdGhlIGNvcnJlc3BvbmRpbmcgYHJlZ2lzdGVyYAogKiBmdW5jdGlvbnMgYW5kIHRoZW4gd3JhcCB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gc28gdGhhdCBpdCBydW5zIGluIHRoZSBjdXJyZW50CiAqIHpvbmUgd2hlbiBpdCBpcyBsYXRlciBhc3luY2hyb25vdXNseSBpbnZva2VkLgogKgogKiBTaW1pbGFybHksIHpvbmVzIHByb3ZpZGUgW2JpbmRDYWxsYmFja0d1YXJkZWRdIChhbmQgdGhlIGNvcnJlc3BvbmRpbmcKICogW2JpbmRVbmFyeUNhbGxiYWNrR3VhcmRlZF0gYW5kIFtiaW5kQmluYXJ5Q2FsbGJhY2tHdWFyZGVkXSksIHdoZW4gdGhlCiAqIGNhbGxiYWNrIHNob3VsZCBiZSBpbnZva2VkIHRocm91Z2ggW1pvbmUucnVuR3VhcmRlZF0uCiAqLwphYnN0cmFjdCBjbGFzcyBab25lIHsKICAvLyBQcml2YXRlIGNvbnN0cnVjdG9yIHNvIHRoYXQgaXQgaXMgbm90IHBvc3NpYmxlIGluc3RhbnRpYXRlIGEgWm9uZSBjbGFzcy4KICBab25lLl8oKTsKCiAgLyoqCiAgICogVGhlIHJvb3Qgem9uZS4KICAgKgogICAqIEFsbCBpc29sYXRlIGVudHJ5IGZ1bmN0aW9ucyAoYG1haW5gIG9yIHNwYXduZWQgZnVuY3Rpb25zKSBzdGFydCBydW5uaW5nIGluCiAgICogdGhlIHJvb3Qgem9uZSAodGhhdCBpcywgW1pvbmUuY3VycmVudF0gaXMgaWRlbnRpY2FsIHRvIFtab25lLnJvb3RdIHdoZW4gdGhlCiAgICogZW50cnkgZnVuY3Rpb24gaXMgY2FsbGVkKS4gSWYgbm8gY3VzdG9tIHpvbmUgaXMgY3JlYXRlZCwgdGhlIHJlc3Qgb2YgdGhlCiAgICogcHJvZ3JhbSBhbHdheXMgcnVucyBpbiB0aGUgcm9vdCB6b25lLgogICAqCiAgICogVGhlIHJvb3Qgem9uZSBpbXBsZW1lbnRzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIGFsbCB6b25lIG9wZXJhdGlvbnMuCiAgICogTWFueSBtZXRob2RzLCBsaWtlIFtyZWdpc3RlckNhbGxiYWNrXSBkbyB0aGUgYmFyZSBtaW5pbXVtIHJlcXVpcmVkIG9mIHRoZQogICAqIGZ1bmN0aW9uLCBhbmQgYXJlIG9ubHkgcHJvdmlkZWQgYXMgYSBob29rIGZvciBjdXN0b20gem9uZXMuIE90aGVycywgbGlrZQogICAqIFtzY2hlZHVsZU1pY3JvdGFza10sIGludGVyYWN0IHdpdGggdGhlIHVuZGVybHlpbmcgc3lzdGVtIHRvIGltcGxlbWVudCB0aGUKICAgKiBkZXNpcmVkIGJlaGF2aW9yLgogICAqLwogIHN0YXRpYyBjb25zdCBab25lIHJvb3QgPSBfcm9vdFpvbmU7CgogIC8qKiBUaGUgY3VycmVudGx5IHJ1bm5pbmcgem9uZS4gKi8KICBzdGF0aWMgWm9uZSBfY3VycmVudCA9IF9yb290Wm9uZTsKCiAgLyoqIFRoZSB6b25lIHRoYXQgaXMgY3VycmVudGx5IGFjdGl2ZS4gKi8KICBzdGF0aWMgWm9uZSBnZXQgY3VycmVudCA9PiBfY3VycmVudDsKCiAgLyoqCiAgICogSGFuZGxlcyB1bmNhdWdodCBhc3luY2hyb25vdXMgZXJyb3JzLgogICAqCiAgICogVGhlcmUgYXJlIHR3byBraW5kIG9mIGFzeW5jaHJvbm91cyBlcnJvcnMgdGhhdCBhcmUgaGFuZGxlZCBieSB0aGlzCiAgICogZnVuY3Rpb246CiAgICogMS4gVW5jYXVnaHQgZXJyb3JzIHRoYXQgd2VyZSB0aHJvd24gaW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrcywgZm9yIGV4YW1wbGUsCiAgICogICBhIGB0aHJvd2AgaW4gdGhlIGZ1bmN0aW9uIHBhc3NlZCB0byBbVGltZXIucnVuXS4KICAgKiAyLiBBc3luY2hyb25vdXMgZXJyb3JzIHRoYXQgYXJlIHB1c2hlZCB0aHJvdWdoIFtGdXR1cmVdIGFuZCBbU3RyZWFtXQogICAqICAgY2hhaW5zLCBidXQgZm9yIHdoaWNoIG5vIGNoaWxkIHJlZ2lzdGVyZWQgYW4gZXJyb3IgaGFuZGxlci4KICAgKiAgIE1vc3QgYXN5bmNocm9ub3VzIGNsYXNzZXMsIGxpa2UgW0Z1dHVyZV0gb3IgW1N0cmVhbV0gcHVzaCBlcnJvcnMgdG8gdGhlaXIKICAgKiAgIGxpc3RlbmVycy4gRXJyb3JzIGFyZSBwcm9wYWdhdGVkIHRoaXMgd2F5IHVudGlsIGVpdGhlciBhIGxpc3RlbmVyIGhhbmRsZXMKICAgKiAgIHRoZSBlcnJvciAoZm9yIGV4YW1wbGUgd2l0aCBbRnV0dXJlLmNhdGNoRXJyb3JdKSwgb3Igbm8gbGlzdGVuZXIgaXMKICAgKiAgIGF2YWlsYWJsZSBhbnltb3JlLiBJbiB0aGUgbGF0dGVyIGNhc2UsIGZ1dHVyZXMgYW5kIHN0cmVhbXMgaW52b2tlIHRoZQogICAqICAgem9uZSdzIFtoYW5kbGVVbmNhdWdodEVycm9yXS4KICAgKgogICAqIEJ5IGRlZmF1bHQsIHdoZW4gaGFuZGxlZCBieSB0aGUgcm9vdCB6b25lLCB1bmNhdWdodCBhc3luY2hyb25vdXMgZXJyb3JzIGFyZQogICAqIHRyZWF0ZWQgbGlrZSB1bmNhdWdodCBzeW5jaHJvbm91cyBleGNlcHRpb25zLgogICAqLwogIHZvaWQgaGFuZGxlVW5jYXVnaHRFcnJvcihlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKTsKCiAgLyoqCiAgICogVGhlIHBhcmVudCB6b25lIG9mIHRoZSB0aGlzIHpvbmUuCiAgICoKICAgKiBJcyBgbnVsbGAgaWYgYHRoaXNgIGlzIHRoZSBbcm9vdF0gem9uZS4KICAgKgogICAqIFpvbmVzIGFyZSBjcmVhdGVkIGJ5IFtmb3JrXSBvbiBhbiBleGlzdGluZyB6b25lLCBvciBieSBbcnVuWm9uZWRdIHdoaWNoCiAgICogZm9ya3MgdGhlIFtjdXJyZW50XSB6b25lLiBUaGUgbmV3IHpvbmUncyBwYXJlbnQgem9uZSBpcyB0aGUgem9uZSBpdCB3YXMKICAgKiBmb3JrZWQgZnJvbS4KICAgKi8KICBab25lIGdldCBwYXJlbnQ7CgogIC8qKgogICAqIFRoZSBlcnJvciB6b25lIGlzIHRoZSBvbmUgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgZGVhbGluZyB3aXRoIHVuY2F1Z2h0CiAgICogZXJyb3JzLgogICAqCiAgICogVGhpcyBpcyB0aGUgY2xvc2VzdCBwYXJlbnQgem9uZSBvZiB0aGlzIHpvbmUgdGhhdCBwcm92aWRlcyBhCiAgICogW2hhbmRsZVVuY2F1Z2h0RXJyb3JdIG1ldGhvZC4KICAgKgogICAqIEFzeW5jaHJvbm91cyBlcnJvcnMgbmV2ZXIgY3Jvc3Mgem9uZSBib3VuZGFyaWVzIGJldHdlZW4gem9uZXMgd2l0aAogICAqIGRpZmZlcmVudCBlcnJvciBoYW5kbGVycy4KICAgKgogICAqIEV4YW1wbGU6CiAgICogYGBgCiAgICogaW1wb3J0ICdkYXJ0OmFzeW5jJzsKICAgKgogICAqIG1haW4oKSB7CiAgICogICB2YXIgZnV0dXJlOwogICAqICAgcnVuWm9uZWQoKCkgewogICAqICAgICAvLyBUaGUgYXN5bmNocm9ub3VzIGVycm9yIGlzIGNhdWdodCBieSB0aGUgY3VzdG9tIHpvbmUgd2hpY2ggcHJpbnRzCiAgICogICAgIC8vICdhc3luY2hyb25vdXMgZXJyb3InLgogICAqICAgICBmdXR1cmUgPSBuZXcgRnV0dXJlLmVycm9yKCJhc3luY2hyb25vdXMgZXJyb3IiKTsKICAgKiAgIH0sIG9uRXJyb3I6IChlKSB7IHByaW50KGUpOyB9KTsgIC8vIENyZWF0ZXMgYSB6b25lIHdpdGggYW4gZXJyb3IgaGFuZGxlci4KICAgKiAgIC8vIFRoZSBmb2xsb3dpbmcgYGNhdGNoRXJyb3JgIGhhbmRsZXIgaXMgbmV2ZXIgaW52b2tlZCwgYmVjYXVzZSB0aGUKICAgKiAgIC8vIGN1c3RvbSB6b25lIGNyZWF0ZWQgYnkgdGhlIGNhbGwgdG8gYHJ1blpvbmVkYCBwcm92aWRlcyBhbgogICAqICAgLy8gZXJyb3IgaGFuZGxlci4KICAgKiAgIGZ1dHVyZS5jYXRjaEVycm9yKChlKSB7IHRocm93ICJpcyBuZXZlciByZWFjaGVkIjsgfSk7CiAgICogfQogICAqIGBgYAogICAqCiAgICogTm90ZSB0aGF0IGVycm9ycyBjYW5ub3QgZW50ZXIgYSBjaGlsZCB6b25lIHdpdGggYSBkaWZmZXJlbnQgZXJyb3IgaGFuZGxlcgogICAqIGVpdGhlcjoKICAgKiBgYGAKICAgKiBpbXBvcnQgJ2RhcnQ6YXN5bmMnOwogICAqCiAgICogbWFpbigpIHsKICAgKiAgIHJ1blpvbmVkKCgpIHsKICAgKiAgICAgLy8gVGhlIGZvbGxvd2luZyBhc3luY2hyb25vdXMgZXJyb3IgaXMgKm5vdCogY2F1Z2h0IGJ5IHRoZSBgY2F0Y2hFcnJvcmAKICAgKiAgICAgLy8gaW4gdGhlIG5lc3RlZCB6b25lLCBzaW5jZSBlcnJvcnMgYXJlIG5vdCB0byBjcm9zcyB6b25lIGJvdW5kYXJpZXMKICAgKiAgICAgLy8gd2l0aCBkaWZmZXJlbnQgZXJyb3IgaGFuZGxlcnMuCiAgICogICAgIC8vIEluc3RlYWQgdGhlIGVycm9yIGlzIGhhbmRsZWQgYnkgdGhlIGN1cnJlbnQgZXJyb3IgaGFuZGxlciwKICAgKiAgICAgLy8gcHJpbnRpbmcgIkNhdWdodCBieSBvdXRlciB6b25lOiBhc3luY2hyb25vdXMgZXJyb3IiLgogICAqICAgICB2YXIgZnV0dXJlID0gbmV3IEZ1dHVyZS5lcnJvcigiYXN5bmNocm9ub3VzIGVycm9yIik7CiAgICogICAgIHJ1blpvbmVkKCgpIHsKICAgKiAgICAgICBmdXR1cmUuY2F0Y2hFcnJvcigoZSkgeyB0aHJvdyAiaXMgbmV2ZXIgcmVhY2hlZCI7IH0pOwogICAqICAgICB9LCBvbkVycm9yOiAoZSkgeyB0aHJvdyAiaXMgbmV2ZXIgcmVhY2hlZCI7IH0pOwogICAqICAgfSwgb25FcnJvcjogKGUpIHsgcHJpbnQoIkNhdWdodCBieSBvdXRlciB6b25lOiAkZSIpOyB9KTsKICAgKiB9CiAgICogYGBgCiAgICovCiAgWm9uZSBnZXQgZXJyb3Jab25lOwoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgYHRoaXNgIGFuZCBbb3RoZXJab25lXSBhcmUgaW4gdGhlIHNhbWUgZXJyb3Igem9uZS4KICAgKgogICAqIFR3byB6b25lcyBhcmUgaW4gdGhlIHNhbWUgZXJyb3Igem9uZSBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgW2Vycm9yWm9uZV0uCiAgICovCiAgYm9vbCBpblNhbWVFcnJvclpvbmUoWm9uZSBvdGhlclpvbmUpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IHpvbmUgYXMgYSBjaGlsZCBvZiBgdGhpc2AuCiAgICoKICAgKiBUaGUgbmV3IHpvbmUgdXNlcyB0aGUgY2xvc3VyZXMgaW4gdGhlIGdpdmVuIFtzcGVjaWZpY2F0aW9uXSB0byBvdmVycmlkZQogICAqIHRoZSBjdXJyZW50J3Mgem9uZSBiZWhhdmlvci4gQWxsIHNwZWNpZmljYXRpb24gZW50cmllcyB0aGF0IGFyZSBgbnVsbGAKICAgKiBpbmhlcml0IHRoZSBiZWhhdmlvciBmcm9tIHRoZSBwYXJlbnQgem9uZSAoYHRoaXNgKS4KICAgKgogICAqIFRoZSBuZXcgem9uZSBpbmhlcml0cyB0aGUgc3RvcmVkIHZhbHVlcyAoYWNjZXNzZWQgdGhyb3VnaCBbb3BlcmF0b3IgW11dKQogICAqIG9mIHRoaXMgem9uZSBhbmQgdXBkYXRlcyB0aGVtIHdpdGggdmFsdWVzIGZyb20gW3pvbmVWYWx1ZXNdLCB3aGljaCBlaXRoZXIKICAgKiBhZGRzIG5ldyB2YWx1ZXMgb3Igb3ZlcnJpZGVzIGV4aXN0aW5nIG9uZXMuCiAgICoKICAgKiBOb3RlIHRoYXQgdGhlIGZvcmsgb3BlcmF0aW9uIGlzIGludGVyY2VwdGlibGUuIEEgem9uZSBjYW4gdGh1cyBjaGFuZ2UKICAgKiB0aGUgem9uZSBzcGVjaWZpY2F0aW9uIChvciB6b25lIHZhbHVlcyksIGdpdmluZyB0aGUgZm9ya2luZyB6b25lIGZ1bGwKICAgKiBjb250cm9sIG92ZXIgdGhlIGNoaWxkIHpvbmUuCiAgICovCiAgWm9uZSBmb3JrKHtab25lU3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uLCBNYXAgem9uZVZhbHVlc30pOwoKICAvKioKICAgKiBFeGVjdXRlcyBbYWN0aW9uXSBpbiB0aGlzIHpvbmUuCiAgICoKICAgKiBCeSBkZWZhdWx0IChhcyBpbXBsZW1lbnRlZCBpbiB0aGUgW3Jvb3RdIHpvbmUpLCBydW5zIFthY3Rpb25dCiAgICogd2l0aCBbY3VycmVudF0gc2V0IHRvIHRoaXMgem9uZS4KICAgKgogICAqIElmIFthY3Rpb25dIHRocm93cywgdGhlIHN5bmNocm9ub3VzIGV4Y2VwdGlvbiBpcyBub3QgY2F1Z2h0IGJ5IHRoZSB6b25lJ3MKICAgKiBlcnJvciBoYW5kbGVyLiBVc2UgW3J1bkd1YXJkZWRdIHRvIGFjaGlldmUgdGhhdC4KICAgKgogICAqIFNpbmNlIHRoZSByb290IHpvbmUgaXMgdGhlIG9ubHkgem9uZSB0aGF0IGNhbiBtb2RpZnkgdGhlIHZhbHVlIG9mCiAgICogW2N1cnJlbnRdLCBjdXN0b20gem9uZXMgaW50ZXJjZXB0aW5nIHJ1biBzaG91bGQgYWx3YXlzIGRlbGVnYXRlIHRvIHRoZWlyCiAgICogcGFyZW50IHpvbmUuIFRoZXkgbWF5IHRha2UgYWN0aW9ucyBiZWZvcmUgYW5kIGFmdGVyIHRoZSBjYWxsLgogICAqLwogIFIgcnVuPFI+KFIgYWN0aW9uKCkpOwoKICAvKioKICAgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gW2FjdGlvbl0gd2l0aCBbYXJndW1lbnRdIGluIHRoaXMgem9uZS4KICAgKgogICAqIEFzIFtydW5dIGV4Y2VwdCB0aGF0IFthY3Rpb25dIGlzIGNhbGxlZCB3aXRoIG9uZSBbYXJndW1lbnRdIGluc3RlYWQgb2YKICAgKiBub25lLgogICAqLwogIFIgcnVuVW5hcnk8UiwgVD4oUiBhY3Rpb24oVCBhcmd1bWVudCksIFQgYXJndW1lbnQpOwoKICAvKioKICAgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gW2FjdGlvbl0gd2l0aCBbYXJndW1lbnQxXSBhbmQgW2FyZ3VtZW50Ml0gaW4gdGhpcwogICAqIHpvbmUuCiAgICoKICAgKiBBcyBbcnVuXSBleGNlcHQgdGhhdCBbYWN0aW9uXSBpcyBjYWxsZWQgd2l0aCB0d28gYXJndW1lbnRzIGluc3RlYWQgb2Ygbm9uZS4KICAgKi8KICBSIHJ1bkJpbmFyeTxSLCBUMSwgVDI+KAogICAgICBSIGFjdGlvbihUMSBhcmd1bWVudDEsIFQyIGFyZ3VtZW50MiksIFQxIGFyZ3VtZW50MSwgVDIgYXJndW1lbnQyKTsKCiAgLyoqCiAgICogRXhlY3V0ZXMgdGhlIGdpdmVuIFthY3Rpb25dIGluIHRoaXMgem9uZSBhbmQgY2F0Y2hlcyBzeW5jaHJvbm91cwogICAqIGVycm9ycy4KICAgKgogICAqIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0bzoKICAgKiBgYGAKICAgKiB0cnkgewogICAqICAgdGhpcy5ydW4oYWN0aW9uKTsKICAgKiB9IGNhdGNoIChlLCBzKSB7CiAgICogICB0aGlzLmhhbmRsZVVuY2F1Z2h0RXJyb3IoZSwgcyk7CiAgICogfQogICAqIGBgYAogICAqCiAgICogU2VlIFtydW5dLgogICAqLwogIHZvaWQgcnVuR3VhcmRlZCh2b2lkIGFjdGlvbigpKTsKCiAgLyoqCiAgICogRXhlY3V0ZXMgdGhlIGdpdmVuIFthY3Rpb25dIHdpdGggW2FyZ3VtZW50XSBpbiB0aGlzIHpvbmUgYW5kCiAgICogY2F0Y2hlcyBzeW5jaHJvbm91cyBlcnJvcnMuCiAgICoKICAgKiBTZWUgW3J1bkd1YXJkZWRdLgogICAqLwogIHZvaWQgcnVuVW5hcnlHdWFyZGVkPFQ+KHZvaWQgYWN0aW9uKFQgYXJndW1lbnQpLCBUIGFyZ3VtZW50KTsKCiAgLyoqCiAgICogRXhlY3V0ZXMgdGhlIGdpdmVuIFthY3Rpb25dIHdpdGggW2FyZ3VtZW50MV0gYW5kIFthcmd1bWVudDJdIGluIHRoaXMKICAgKiB6b25lIGFuZCBjYXRjaGVzIHN5bmNocm9ub3VzIGVycm9ycy4KICAgKgogICAqIFNlZSBbcnVuR3VhcmRlZF0uCiAgICovCiAgdm9pZCBydW5CaW5hcnlHdWFyZGVkPFQxLCBUMj4oCiAgICAgIHZvaWQgYWN0aW9uKFQxIGFyZ3VtZW50MSwgVDIgYXJndW1lbnQyKSwgVDEgYXJndW1lbnQxLCBUMiBhcmd1bWVudDIpOwoKICAvKioKICAgKiBSZWdpc3RlcnMgdGhlIGdpdmVuIGNhbGxiYWNrIGluIHRoaXMgem9uZS4KICAgKgogICAqIFdoZW4gaW1wbGVtZW50aW5nIGFuIGFzeW5jaHJvbm91cyBwcmltaXRpdmUgdGhhdCB1c2VzIGNhbGxiYWNrcywgdGhlCiAgICogY2FsbGJhY2sgbXVzdCBiZSByZWdpc3RlcmVkIHVzaW5nIFtyZWdpc3RlckNhbGxiYWNrXSBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlCiAgICogdXNlciBwcm92aWRlcyB0aGUgY2FsbGJhY2suIFRoaXMgYWxsb3dzIHpvbmVzIHRvIHJlY29yZCBvdGhlciBpbmZvcm1hdGlvbgogICAqIHRoYXQgdGhleSBuZWVkIGF0IHRoZSBzYW1lIHRpbWUsIHBlcmhhcHMgZXZlbiB3cmFwcGluZyB0aGUgY2FsbGJhY2ssIHNvCiAgICogdGhhdCB0aGUgY2FsbGJhY2sgaXMgcHJlcGFyZWQgd2hlbiBpdCBpcyBsYXRlciBydW4gaW4gdGhlIHNhbWUgem9uZXMKICAgKiAodXNpbmcgW3J1bl0pLiBGb3IgZXhhbXBsZSwgYSB6b25lIG1heSBkZWNpZGUKICAgKiB0byBzdG9yZSB0aGUgc3RhY2sgdHJhY2UgKGF0IHRoZSB0aW1lIG9mIHRoZSByZWdpc3RyYXRpb24pIHdpdGggdGhlCiAgICogY2FsbGJhY2suCiAgICoKICAgKiBSZXR1cm5zIHRoZSBjYWxsYmFjayB0aGF0IHNob3VsZCBiZSB1c2VkIGluIHBsYWNlIG9mIHRoZSBwcm92aWRlZAogICAqIFtjYWxsYmFja10uIEZyZXF1ZW50bHkgem9uZXMgc2ltcGx5IHJldHVybiB0aGUgb3JpZ2luYWwgY2FsbGJhY2suCiAgICoKICAgKiBDdXN0b20gem9uZXMgbWF5IGludGVyY2VwdCB0aGlzIG9wZXJhdGlvbi4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaW4KICAgKiBbWm9uZS5yb290XSByZXR1cm5zIHRoZSBvcmlnaW5hbCBjYWxsYmFjayB1bmNoYW5nZWQuCiAgICovCiAgWm9uZUNhbGxiYWNrPFI+IHJlZ2lzdGVyQ2FsbGJhY2s8Uj4oUiBjYWxsYmFjaygpKTsKCiAgLyoqCiAgICogUmVnaXN0ZXJzIHRoZSBnaXZlbiBjYWxsYmFjayBpbiB0aGlzIHpvbmUuCiAgICoKICAgKiBTaW1pbGFyIHRvIFtyZWdpc3RlckNhbGxiYWNrXSBidXQgd2l0aCBhIHVuYXJ5IGNhbGxiYWNrLgogICAqLwogIFpvbmVVbmFyeUNhbGxiYWNrPFIsIFQ+IHJlZ2lzdGVyVW5hcnlDYWxsYmFjazxSLCBUPihSIGNhbGxiYWNrKFQgYXJnKSk7CgogIC8qKgogICAqIFJlZ2lzdGVycyB0aGUgZ2l2ZW4gY2FsbGJhY2sgaW4gdGhpcyB6b25lLgogICAqCiAgICogU2ltaWxhciB0byBbcmVnaXN0ZXJDYWxsYmFja10gYnV0IHdpdGggYSB1bmFyeSBjYWxsYmFjay4KICAgKi8KICBab25lQmluYXJ5Q2FsbGJhY2s8UiwgVDEsIFQyPiByZWdpc3RlckJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4oCiAgICAgIFIgY2FsbGJhY2soVDEgYXJnMSwgVDIgYXJnMikpOwoKICAvKioKICAgKiAgUmVnaXN0ZXJzIHRoZSBwcm92aWRlZCBbY2FsbGJhY2tdIGFuZCByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aWxsCiAgICogIGV4ZWN1dGUgaW4gdGhpcyB6b25lLgogICAqCiAgICogIEVxdWl2YWxlbnQgdG86CiAgICoKICAgKiAgICAgIFpvbmVDYWxsYmFjayByZWdpc3RlcmVkID0gdGhpcy5yZWdpc3RlckNhbGxiYWNrKGNhbGxiYWNrKTsKICAgKiAgICAgIHJldHVybiAoKSA9PiB0aGlzLnJ1bihyZWdpc3RlcmVkKTsKICAgKgogICAqLwogIFpvbmVDYWxsYmFjazxSPiBiaW5kQ2FsbGJhY2s8Uj4oUiBjYWxsYmFjaygpKTsKCiAgLyoqCiAgICogIFJlZ2lzdGVycyB0aGUgcHJvdmlkZWQgW2NhbGxiYWNrXSBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2lsbAogICAqICBleGVjdXRlIGluIHRoaXMgem9uZS4KICAgKgogICAqICBFcXVpdmFsZW50IHRvOgogICAqCiAgICogICAgICBab25lQ2FsbGJhY2sgcmVnaXN0ZXJlZCA9IHRoaXMucmVnaXN0ZXJVbmFyeUNhbGxiYWNrKGNhbGxiYWNrKTsKICAgKiAgICAgIHJldHVybiAoYXJnKSA9PiB0aGluLnJ1blVuYXJ5KHJlZ2lzdGVyZWQsIGFyZyk7CiAgICovCiAgWm9uZVVuYXJ5Q2FsbGJhY2s8UiwgVD4gYmluZFVuYXJ5Q2FsbGJhY2s8UiwgVD4oUiBjYWxsYmFjayhUIGFyZ3VtZW50KSk7CgogIC8qKgogICAqICBSZWdpc3RlcnMgdGhlIHByb3ZpZGVkIFtjYWxsYmFja10gYW5kIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHdpbGwKICAgKiAgZXhlY3V0ZSBpbiB0aGlzIHpvbmUuCiAgICoKICAgKiAgRXF1aXZhbGVudCB0bzoKICAgKgogICAqICAgICAgWm9uZUNhbGxiYWNrIHJlZ2lzdGVyZWQgPSByZWdpc3RlckJpbmFyeUNhbGxiYWNrKGNhbGxiYWNrKTsKICAgKiAgICAgIHJldHVybiAoYXJnMSwgYXJnMikgPT4gdGhpbi5ydW5CaW5hcnkocmVnaXN0ZXJlZCwgYXJnMSwgYXJnMik7CiAgICovCiAgWm9uZUJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4gYmluZEJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4oCiAgICAgIFIgY2FsbGJhY2soVDEgYXJndW1lbnQxLCBUMiBhcmd1bWVudDIpKTsKCiAgLyoqCiAgICogUmVnaXN0ZXJzIHRoZSBwcm92aWRlZCBbY2FsbGJhY2tdIGFuZCByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aWxsCiAgICogZXhlY3V0ZSBpbiB0aGlzIHpvbmUuCiAgICoKICAgKiBXaGVuIHRoZSBmdW5jdGlvbiBleGVjdXRlcywgZXJyb3JzIGFyZSBjYXVnaHQgYW5kIHRyZWF0ZWQgYXMgdW5jYXVnaHQKICAgKiBlcnJvcnMuCiAgICoKICAgKiBFcXVpdmFsZW50IHRvOgogICAqCiAgICogICAgIFpvbmVDYWxsYmFjayByZWdpc3RlcmVkID0gdGhpcy5yZWdpc3RlckNhbGxiYWNrKGNhbGxiYWNrKTsKICAgKiAgICAgcmV0dXJuICgpID0+IHRoaXMucnVuR3VhcmRlZChyZWdpc3RlcmVkKTsKICAgKgogICAqLwogIHZvaWQgRnVuY3Rpb24oKSBiaW5kQ2FsbGJhY2tHdWFyZGVkKHZvaWQgY2FsbGJhY2soKSk7CgogIC8qKgogICAqIFJlZ2lzdGVycyB0aGUgcHJvdmlkZWQgW2NhbGxiYWNrXSBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2lsbAogICAqIGV4ZWN1dGUgaW4gdGhpcyB6b25lLgogICAqCiAgICogV2hlbiB0aGUgZnVuY3Rpb24gZXhlY3V0ZXMsIGVycm9ycyBhcmUgY2F1Z2h0IGFuZCB0cmVhdGVkIGFzIHVuY2F1Z2h0CiAgICogZXJyb3JzLgogICAqCiAgICogRXF1aXZhbGVudCB0bzoKICAgKgogICAqICAgICBab25lQ2FsbGJhY2sgcmVnaXN0ZXJlZCA9IHRoaXMucmVnaXN0ZXJVbmFyeUNhbGxiYWNrKGNhbGxiYWNrKTsKICAgKiAgICAgcmV0dXJuIChhcmcpID0+IHRoaXMucnVuVW5hcnlHdWFyZGVkKHJlZ2lzdGVyZWQsIGFyZyk7CiAgICovCiAgdm9pZCBGdW5jdGlvbihUKSBiaW5kVW5hcnlDYWxsYmFja0d1YXJkZWQ8VD4odm9pZCBjYWxsYmFjayhUIGFyZ3VtZW50KSk7CgogIC8qKgogICAqICBSZWdpc3RlcnMgdGhlIHByb3ZpZGVkIFtjYWxsYmFja10gYW5kIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHdpbGwKICAgKiAgZXhlY3V0ZSBpbiB0aGlzIHpvbmUuCiAgICoKICAgKiAgRXF1aXZhbGVudCB0bzoKICAgKgogICAqICAgICAgWm9uZUNhbGxiYWNrIHJlZ2lzdGVyZWQgPSByZWdpc3RlckJpbmFyeUNhbGxiYWNrKGNhbGxiYWNrKTsKICAgKiAgICAgIHJldHVybiAoYXJnMSwgYXJnMikgPT4gdGhpcy5ydW5CaW5hcnlHdWFyZGVkKHJlZ2lzdGVyZWQsIGFyZzEsIGFyZzIpOwogICAqLwogIHZvaWQgRnVuY3Rpb24oVDEsIFQyKSBiaW5kQmluYXJ5Q2FsbGJhY2tHdWFyZGVkPFQxLCBUMj4oCiAgICAgIHZvaWQgY2FsbGJhY2soVDEgYXJndW1lbnQxLCBUMiBhcmd1bWVudDIpKTsKCiAgLyoqCiAgICogSW50ZXJjZXB0cyBlcnJvcnMgd2hlbiBhZGRlZCBwcm9ncmFtbWF0aWNhbGx5IHRvIGEgYEZ1dHVyZWAgb3IgYFN0cmVhbWAuCiAgICoKICAgKiBXaGVuIGNhbGxpbmcgW0NvbXBsZXRlci5jb21wbGV0ZUVycm9yXSwgW1N0cmVhbUNvbnRyb2xsZXIuYWRkRXJyb3JdLAogICAqIG9yIHNvbWUgW0Z1dHVyZV0gY29uc3RydWN0b3JzLCB0aGUgY3VycmVudCB6b25lIGlzIGFsbG93ZWQgdG8gaW50ZXJjZXB0CiAgICogYW5kIHJlcGxhY2UgdGhlIGVycm9yLgogICAqCiAgICogRnV0dXJlIGNvbnN0cnVjdG9ycyBpbnZva2UgdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSBlcnJvciBpcyByZWNlaXZlZAogICAqIGRpcmVjdGx5LCBmb3IgZXhhbXBsZSB3aXRoIFtGdXR1cmUuZXJyb3JdLCBvciB3aGVuIHRoZSBlcnJvciBpcyBjYXVnaHQKICAgKiBzeW5jaHJvbm91c2x5LCBmb3IgZXhhbXBsZSB3aXRoIFtGdXR1cmUuc3luY10uCiAgICoKICAgKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBhbiBlcnJvciBpcyBvbmx5IHNlbnQgdGhyb3VnaCBbZXJyb3JDYWxsYmFja10KICAgKiBvbmNlLiBMaWJyYXJpZXMgdGhhdCB1c2UgaW50ZXJtZWRpYXRlIGNvbnRyb2xsZXJzIG9yIGNvbXBsZXRlcnMgbWlnaHQKICAgKiBlbmQgdXAgaW52b2tpbmcgW2Vycm9yQ2FsbGJhY2tdIG11bHRpcGxlIHRpbWVzLgogICAqCiAgICogUmV0dXJucyBgbnVsbGAgaWYgbm8gcmVwbGFjZW1lbnQgaXMgZGVzaXJlZC4gT3RoZXJ3aXNlIHJldHVybnMgYW4gaW5zdGFuY2UKICAgKiBvZiBbQXN5bmNFcnJvcl0gaG9sZGluZyB0aGUgbmV3IHBhaXIgb2YgZXJyb3IgYW5kIHN0YWNrIHRyYWNlLgogICAqCiAgICogQWx0aG91Z2ggbm90IHJlY29tbWVuZGVkLCB0aGUgcmV0dXJuZWQgaW5zdGFuY2UgbWF5IGhhdmUgaXRzIGBlcnJvcmAgbWVtYmVyCiAgICogKFtBc3luY0Vycm9yLmVycm9yXSkgYmUgZXF1YWwgdG8gYG51bGxgIGluIHdoaWNoIGNhc2UgdGhlIGVycm9yIHNob3VsZCBiZQogICAqIHJlcGxhY2VkIGJ5IGEgW051bGxUaHJvd25FcnJvcl0uCiAgICoKICAgKiBDdXN0b20gem9uZXMgbWF5IGludGVyY2VwdCB0aGlzIG9wZXJhdGlvbi4KICAgKgogICAqIEltcGxlbWVudGF0aW9ucyBvZiBhIG5ldyBhc3luY2hyb25vdXMgcHJpbWl0aXZlIHRoYXQgY29udmVydHMgc3luY2hyb25vdXMKICAgKiBlcnJvcnMgdG8gYXN5bmNocm9ub3VzIGVycm9ycyByYXJlbHkgbmVlZCB0byBpbnZva2UgW2Vycm9yQ2FsbGJhY2tdLCBzaW5jZQogICAqIGVycm9ycyBhcmUgdXN1YWxseSByZXBvcnRlZCB0aHJvdWdoIGZ1dHVyZSBjb21wbGV0ZXJzIG9yIHN0cmVhbQogICAqIGNvbnRyb2xsZXJzLgogICAqLwogIEFzeW5jRXJyb3IgZXJyb3JDYWxsYmFjayhPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSk7CgogIC8qKgogICAqIFJ1bnMgW2NhbGxiYWNrXSBhc3luY2hyb25vdXNseSBpbiB0aGlzIHpvbmUuCiAgICoKICAgKiBUaGUgZ2xvYmFsIGBzY2hlZHVsZU1pY3JvdGFza2AgZGVsZWdhdGVzIHRvIHRoZSBjdXJyZW50IHpvbmUncwogICAqIFtzY2hlZHVsZU1pY3JvdGFza10uIFRoZSByb290IHpvbmUncyBpbXBsZW1lbnRhdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUKICAgKiB1bmRlcmx5aW5nIHN5c3RlbSB0byBzY2hlZHVsZSB0aGUgZ2l2ZW4gY2FsbGJhY2sgYXMgYSBtaWNyb3Rhc2suCiAgICoKICAgKiBDdXN0b20gem9uZXMgbWF5IGludGVyY2VwdCB0aGlzIG9wZXJhdGlvbiAoZm9yIGV4YW1wbGUgdG8gd3JhcCB0aGUgZ2l2ZW4KICAgKiBbY2FsbGJhY2tdKS4KICAgKi8KICB2b2lkIHNjaGVkdWxlTWljcm90YXNrKHZvaWQgY2FsbGJhY2soKSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBUaW1lciB3aGVyZSB0aGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgaW4gdGhpcyB6b25lLgogICAqLwogIFRpbWVyIGNyZWF0ZVRpbWVyKER1cmF0aW9uIGR1cmF0aW9uLCB2b2lkIGNhbGxiYWNrKCkpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgcGVyaW9kaWMgVGltZXIgd2hlcmUgdGhlIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIGluIHRoaXMgem9uZS4KICAgKi8KICBUaW1lciBjcmVhdGVQZXJpb2RpY1RpbWVyKER1cmF0aW9uIHBlcmlvZCwgdm9pZCBjYWxsYmFjayhUaW1lciB0aW1lcikpOwoKICAvKioKICAgKiBQcmludHMgdGhlIGdpdmVuIFtsaW5lXS4KICAgKgogICAqIFRoZSBnbG9iYWwgYHByaW50YCBmdW5jdGlvbiBkZWxlZ2F0ZXMgdG8gdGhlIGN1cnJlbnQgem9uZSdzIFtwcmludF0KICAgKiBmdW5jdGlvbiB3aGljaCBtYWtlcyBpdCBwb3NzaWJsZSB0byBpbnRlcmNlcHQgcHJpbnRpbmcuCiAgICoKICAgKiBFeGFtcGxlOgogICAqIGBgYAogICAqIGltcG9ydCAnZGFydDphc3luYyc7CiAgICoKICAgKiBtYWluKCkgewogICAqICAgcnVuWm9uZWQoKCkgewogICAqICAgICAvLyBFbmRzIHVwIHByaW50aW5nOiAiSW50ZXJjZXB0ZWQ6IGluIHpvbmUiLgogICAqICAgICBwcmludCgiaW4gem9uZSIpOwogICAqICAgfSwgem9uZVNwZWNpZmljYXRpb246IG5ldyBab25lU3BlY2lmaWNhdGlvbigKICAgKiAgICAgICBwcmludDogKFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLCBTdHJpbmcgbGluZSkgewogICAqICAgICBwYXJlbnQucHJpbnQoem9uZSwgIkludGVyY2VwdGVkOiAkbGluZSIpOwogICAqICAgfSkpOwogICAqIH0KICAgKiBgYGAKICAgKi8KICB2b2lkIHByaW50KFN0cmluZyBsaW5lKTsKCiAgLyoqCiAgICogQ2FsbCB0byBlbnRlciB0aGUgWm9uZS4KICAgKgogICAqIFRoZSBwcmV2aW91cyBjdXJyZW50IHpvbmUgaXMgcmV0dXJuZWQuCiAgICovCiAgc3RhdGljIFpvbmUgX2VudGVyKFpvbmUgem9uZSkgewogICAgYXNzZXJ0KHpvbmUgIT0gbnVsbCk7CiAgICBhc3NlcnQoIWlkZW50aWNhbCh6b25lLCBfY3VycmVudCkpOwogICAgWm9uZSBwcmV2aW91cyA9IF9jdXJyZW50OwogICAgX2N1cnJlbnQgPSB6b25lOwogICAgcmV0dXJuIHByZXZpb3VzOwogIH0KCiAgLyoqCiAgICogQ2FsbCB0byBsZWF2ZSB0aGUgWm9uZS4KICAgKgogICAqIFRoZSBwcmV2aW91cyBab25lIG11c3QgYmUgcHJvdmlkZWQgYXMgYHByZXZpb3VzYC4KICAgKi8KICBzdGF0aWMgdm9pZCBfbGVhdmUoWm9uZSBwcmV2aW91cykgewogICAgYXNzZXJ0KHByZXZpb3VzICE9IG51bGwpOwogICAgWm9uZS5fY3VycmVudCA9IHByZXZpb3VzOwogIH0KCiAgLyoqCiAgICogUmV0cmlldmVzIHRoZSB6b25lLXZhbHVlIGFzc29jaWF0ZWQgd2l0aCBba2V5XS4KICAgKgogICAqIElmIHRoaXMgem9uZSBkb2VzIG5vdCBjb250YWluIHRoZSB2YWx1ZSBsb29rcyB1cCB0aGUgc2FtZSBrZXkgaW4gdGhlCiAgICogcGFyZW50IHpvbmUuIElmIHRoZSBba2V5XSBpcyBub3QgZm91bmQgcmV0dXJucyBgbnVsbGAuCiAgICoKICAgKiBBbnkgb2JqZWN0IGNhbiBiZSB1c2VkIGFzIGtleSwgYXMgbG9uZyBhcyBpdCBoYXMgY29tcGF0aWJsZSBgb3BlcmF0b3IgPT1gCiAgICogYW5kIGBoYXNoQ29kZWAgaW1wbGVtZW50YXRpb25zLgogICAqIEJ5IGNvbnRyb2xsaW5nIGFjY2VzcyB0byB0aGUga2V5LCBhIHpvbmUgY2FuIGdyYW50IG9yIGRlbnkgYWNjZXNzIHRvIHRoZQogICAqIHpvbmUgdmFsdWUuCiAgICovCiAgb3BlcmF0b3IgW10oT2JqZWN0IGtleSk7Cn0KClpvbmVEZWxlZ2F0ZSBfcGFyZW50RGVsZWdhdGUoX1pvbmUgem9uZSkgewogIGlmICh6b25lLnBhcmVudCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICByZXR1cm4gem9uZS5wYXJlbnQuX2RlbGVnYXRlOwp9CgpjbGFzcyBfWm9uZURlbGVnYXRlIGltcGxlbWVudHMgWm9uZURlbGVnYXRlIHsKICBmaW5hbCBfWm9uZSBfZGVsZWdhdGlvblRhcmdldDsKCiAgX1pvbmVEZWxlZ2F0ZSh0aGlzLl9kZWxlZ2F0aW9uVGFyZ2V0KTsKCiAgdm9pZCBoYW5kbGVVbmNhdWdodEVycm9yKFpvbmUgem9uZSwgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gX2RlbGVnYXRpb25UYXJnZXQuX2hhbmRsZVVuY2F1Z2h0RXJyb3I7CiAgICBfWm9uZSBpbXBsWm9uZSA9IGltcGxlbWVudGF0aW9uLnpvbmU7CiAgICBIYW5kbGVVbmNhdWdodEVycm9ySGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcigKICAgICAgICBpbXBsWm9uZSwgX3BhcmVudERlbGVnYXRlKGltcGxab25lKSwgem9uZSwgZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgUiBydW48Uj4oWm9uZSB6b25lLCBSIGYoKSkgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gX2RlbGVnYXRpb25UYXJnZXQuX3J1bjsKICAgIF9ab25lIGltcGxab25lID0gaW1wbGVtZW50YXRpb24uem9uZTsKICAgIFJ1bkhhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgcmV0dXJuIGhhbmRsZXIoaW1wbFpvbmUsIF9wYXJlbnREZWxlZ2F0ZShpbXBsWm9uZSksIHpvbmUsIGYpOwogIH0KCiAgUiBydW5VbmFyeTxSLCBUPihab25lIHpvbmUsIFIgZihUIGFyZyksIFQgYXJnKSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSBfZGVsZWdhdGlvblRhcmdldC5fcnVuVW5hcnk7CiAgICBfWm9uZSBpbXBsWm9uZSA9IGltcGxlbWVudGF0aW9uLnpvbmU7CiAgICBSdW5VbmFyeUhhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgcmV0dXJuIGhhbmRsZXIoaW1wbFpvbmUsIF9wYXJlbnREZWxlZ2F0ZShpbXBsWm9uZSksIHpvbmUsIGYsIGFyZyk7CiAgfQoKICBSIHJ1bkJpbmFyeTxSLCBUMSwgVDI+KFpvbmUgem9uZSwgUiBmKFQxIGFyZzEsIFQyIGFyZzIpLCBUMSBhcmcxLCBUMiBhcmcyKSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSBfZGVsZWdhdGlvblRhcmdldC5fcnVuQmluYXJ5OwogICAgX1pvbmUgaW1wbFpvbmUgPSBpbXBsZW1lbnRhdGlvbi56b25lOwogICAgUnVuQmluYXJ5SGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcihpbXBsWm9uZSwgX3BhcmVudERlbGVnYXRlKGltcGxab25lKSwgem9uZSwgZiwgYXJnMSwgYXJnMik7CiAgfQoKICBab25lQ2FsbGJhY2s8Uj4gcmVnaXN0ZXJDYWxsYmFjazxSPihab25lIHpvbmUsIFIgZigpKSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSBfZGVsZWdhdGlvblRhcmdldC5fcmVnaXN0ZXJDYWxsYmFjazsKICAgIF9ab25lIGltcGxab25lID0gaW1wbGVtZW50YXRpb24uem9uZTsKICAgIFJlZ2lzdGVyQ2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIgPSBpbXBsZW1lbnRhdGlvbi5mdW5jdGlvbjsKICAgIHJldHVybiBoYW5kbGVyKGltcGxab25lLCBfcGFyZW50RGVsZWdhdGUoaW1wbFpvbmUpLCB6b25lLCBmKTsKICB9CgogIFpvbmVVbmFyeUNhbGxiYWNrPFIsIFQ+IHJlZ2lzdGVyVW5hcnlDYWxsYmFjazxSLCBUPihab25lIHpvbmUsIFIgZihUIGFyZykpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IF9kZWxlZ2F0aW9uVGFyZ2V0Ll9yZWdpc3RlclVuYXJ5Q2FsbGJhY2s7CiAgICBfWm9uZSBpbXBsWm9uZSA9IGltcGxlbWVudGF0aW9uLnpvbmU7CiAgICBSZWdpc3RlclVuYXJ5Q2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIgPSBpbXBsZW1lbnRhdGlvbi5mdW5jdGlvbjsKICAgIHJldHVybiBoYW5kbGVyKGltcGxab25lLCBfcGFyZW50RGVsZWdhdGUoaW1wbFpvbmUpLCB6b25lLCBmKTsKICB9CgogIFpvbmVCaW5hcnlDYWxsYmFjazxSLCBUMSwgVDI+IHJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2s8UiwgVDEsIFQyPigKICAgICAgWm9uZSB6b25lLCBSIGYoVDEgYXJnMSwgVDIgYXJnMikpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IF9kZWxlZ2F0aW9uVGFyZ2V0Ll9yZWdpc3RlckJpbmFyeUNhbGxiYWNrOwogICAgX1pvbmUgaW1wbFpvbmUgPSBpbXBsZW1lbnRhdGlvbi56b25lOwogICAgUmVnaXN0ZXJCaW5hcnlDYWxsYmFja0hhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgcmV0dXJuIGhhbmRsZXIoaW1wbFpvbmUsIF9wYXJlbnREZWxlZ2F0ZShpbXBsWm9uZSksIHpvbmUsIGYpOwogIH0KCiAgQXN5bmNFcnJvciBlcnJvckNhbGxiYWNrKFpvbmUgem9uZSwgT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IF9kZWxlZ2F0aW9uVGFyZ2V0Ll9lcnJvckNhbGxiYWNrOwogICAgX1pvbmUgaW1wbFpvbmUgPSBpbXBsZW1lbnRhdGlvbi56b25lOwogICAgaWYgKGlkZW50aWNhbChpbXBsWm9uZSwgX3Jvb3Rab25lKSkgcmV0dXJuIG51bGw7CiAgICBFcnJvckNhbGxiYWNrSGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcigKICAgICAgICBpbXBsWm9uZSwgX3BhcmVudERlbGVnYXRlKGltcGxab25lKSwgem9uZSwgZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgdm9pZCBzY2hlZHVsZU1pY3JvdGFzayhab25lIHpvbmUsIGYoKSkgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gX2RlbGVnYXRpb25UYXJnZXQuX3NjaGVkdWxlTWljcm90YXNrOwogICAgX1pvbmUgaW1wbFpvbmUgPSBpbXBsZW1lbnRhdGlvbi56b25lOwogICAgU2NoZWR1bGVNaWNyb3Rhc2tIYW5kbGVyIGhhbmRsZXIgPSBpbXBsZW1lbnRhdGlvbi5mdW5jdGlvbjsKICAgIGhhbmRsZXIoaW1wbFpvbmUsIF9wYXJlbnREZWxlZ2F0ZShpbXBsWm9uZSksIHpvbmUsIGYpOwogIH0KCiAgVGltZXIgY3JlYXRlVGltZXIoWm9uZSB6b25lLCBEdXJhdGlvbiBkdXJhdGlvbiwgdm9pZCBmKCkpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IF9kZWxlZ2F0aW9uVGFyZ2V0Ll9jcmVhdGVUaW1lcjsKICAgIF9ab25lIGltcGxab25lID0gaW1wbGVtZW50YXRpb24uem9uZTsKICAgIENyZWF0ZVRpbWVySGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcihpbXBsWm9uZSwgX3BhcmVudERlbGVnYXRlKGltcGxab25lKSwgem9uZSwgZHVyYXRpb24sIGYpOwogIH0KCiAgVGltZXIgY3JlYXRlUGVyaW9kaWNUaW1lcihab25lIHpvbmUsIER1cmF0aW9uIHBlcmlvZCwgdm9pZCBmKFRpbWVyIHRpbWVyKSkgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gX2RlbGVnYXRpb25UYXJnZXQuX2NyZWF0ZVBlcmlvZGljVGltZXI7CiAgICBfWm9uZSBpbXBsWm9uZSA9IGltcGxlbWVudGF0aW9uLnpvbmU7CiAgICBDcmVhdGVQZXJpb2RpY1RpbWVySGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcihpbXBsWm9uZSwgX3BhcmVudERlbGVnYXRlKGltcGxab25lKSwgem9uZSwgcGVyaW9kLCBmKTsKICB9CgogIHZvaWQgcHJpbnQoWm9uZSB6b25lLCBTdHJpbmcgbGluZSkgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gX2RlbGVnYXRpb25UYXJnZXQuX3ByaW50OwogICAgX1pvbmUgaW1wbFpvbmUgPSBpbXBsZW1lbnRhdGlvbi56b25lOwogICAgUHJpbnRIYW5kbGVyIGhhbmRsZXIgPSBpbXBsZW1lbnRhdGlvbi5mdW5jdGlvbjsKICAgIGhhbmRsZXIoaW1wbFpvbmUsIF9wYXJlbnREZWxlZ2F0ZShpbXBsWm9uZSksIHpvbmUsIGxpbmUpOwogIH0KCiAgWm9uZSBmb3JrKFpvbmUgem9uZSwgWm9uZVNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbiwgTWFwIHpvbmVWYWx1ZXMpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IF9kZWxlZ2F0aW9uVGFyZ2V0Ll9mb3JrOwogICAgX1pvbmUgaW1wbFpvbmUgPSBpbXBsZW1lbnRhdGlvbi56b25lOwogICAgRm9ya0hhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgcmV0dXJuIGhhbmRsZXIoCiAgICAgICAgaW1wbFpvbmUsIF9wYXJlbnREZWxlZ2F0ZShpbXBsWm9uZSksIHpvbmUsIHNwZWNpZmljYXRpb24sIHpvbmVWYWx1ZXMpOwogIH0KfQoKLyoqCiAqIEJhc2UgY2xhc3MgZm9yIFpvbmUgaW1wbGVtZW50YXRpb25zLgogKi8KYWJzdHJhY3QgY2xhc3MgX1pvbmUgaW1wbGVtZW50cyBab25lIHsKICBjb25zdCBfWm9uZSgpOwoKICAvLyBUT0RPKGZsb2l0c2NoKTogdGhlIHR5cGVzIG9mIHRoZSBgX1pvbmVGdW5jdGlvbmBzIHNob3VsZCBoYXZlIGEgdHlwZSBmb3IKICAvLyBhbGwgZmllbGRzLgogIF9ab25lRnVuY3Rpb248RnVuY3Rpb24+IGdldCBfcnVuOwogIF9ab25lRnVuY3Rpb248RnVuY3Rpb24+IGdldCBfcnVuVW5hcnk7CiAgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4gZ2V0IF9ydW5CaW5hcnk7CiAgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4gZ2V0IF9yZWdpc3RlckNhbGxiYWNrOwogIF9ab25lRnVuY3Rpb248RnVuY3Rpb24+IGdldCBfcmVnaXN0ZXJVbmFyeUNhbGxiYWNrOwogIF9ab25lRnVuY3Rpb248RnVuY3Rpb24+IGdldCBfcmVnaXN0ZXJCaW5hcnlDYWxsYmFjazsKICBfWm9uZUZ1bmN0aW9uPEVycm9yQ2FsbGJhY2tIYW5kbGVyPiBnZXQgX2Vycm9yQ2FsbGJhY2s7CiAgX1pvbmVGdW5jdGlvbjxTY2hlZHVsZU1pY3JvdGFza0hhbmRsZXI+IGdldCBfc2NoZWR1bGVNaWNyb3Rhc2s7CiAgX1pvbmVGdW5jdGlvbjxDcmVhdGVUaW1lckhhbmRsZXI+IGdldCBfY3JlYXRlVGltZXI7CiAgX1pvbmVGdW5jdGlvbjxDcmVhdGVQZXJpb2RpY1RpbWVySGFuZGxlcj4gZ2V0IF9jcmVhdGVQZXJpb2RpY1RpbWVyOwogIF9ab25lRnVuY3Rpb248UHJpbnRIYW5kbGVyPiBnZXQgX3ByaW50OwogIF9ab25lRnVuY3Rpb248Rm9ya0hhbmRsZXI+IGdldCBfZm9yazsKICBfWm9uZUZ1bmN0aW9uPEhhbmRsZVVuY2F1Z2h0RXJyb3JIYW5kbGVyPiBnZXQgX2hhbmRsZVVuY2F1Z2h0RXJyb3I7CiAgX1pvbmUgZ2V0IHBhcmVudDsKICBab25lRGVsZWdhdGUgZ2V0IF9kZWxlZ2F0ZTsKICBNYXAgZ2V0IF9tYXA7CgogIGJvb2wgaW5TYW1lRXJyb3Jab25lKFpvbmUgb3RoZXJab25lKSB7CiAgICByZXR1cm4gaWRlbnRpY2FsKHRoaXMsIG90aGVyWm9uZSkgfHwKICAgICAgICBpZGVudGljYWwoZXJyb3Jab25lLCBvdGhlclpvbmUuZXJyb3Jab25lKTsKICB9Cn0KCmNsYXNzIF9DdXN0b21ab25lIGV4dGVuZHMgX1pvbmUgewogIC8vIFRoZSBhY3R1YWwgem9uZSBhbmQgaW1wbGVtZW50YXRpb24gb2YgZWFjaCBvZiB0aGVzZQogIC8vIGluaGVyaXRhYmxlIHpvbmUgZnVuY3Rpb25zLgogIC8vIFRPRE8oZmxvaXRzY2gpOiB0aGUgdHlwZXMgb2YgdGhlIGBfWm9uZUZ1bmN0aW9uYHMgc2hvdWxkIGhhdmUgYSB0eXBlIGZvcgogIC8vIGFsbCBmaWVsZHMuCiAgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4gX3J1bjsKICBfWm9uZUZ1bmN0aW9uPEZ1bmN0aW9uPiBfcnVuVW5hcnk7CiAgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4gX3J1bkJpbmFyeTsKICBfWm9uZUZ1bmN0aW9uPEZ1bmN0aW9uPiBfcmVnaXN0ZXJDYWxsYmFjazsKICBfWm9uZUZ1bmN0aW9uPEZ1bmN0aW9uPiBfcmVnaXN0ZXJVbmFyeUNhbGxiYWNrOwogIF9ab25lRnVuY3Rpb248RnVuY3Rpb24+IF9yZWdpc3RlckJpbmFyeUNhbGxiYWNrOwogIF9ab25lRnVuY3Rpb248RXJyb3JDYWxsYmFja0hhbmRsZXI+IF9lcnJvckNhbGxiYWNrOwogIF9ab25lRnVuY3Rpb248U2NoZWR1bGVNaWNyb3Rhc2tIYW5kbGVyPiBfc2NoZWR1bGVNaWNyb3Rhc2s7CiAgX1pvbmVGdW5jdGlvbjxDcmVhdGVUaW1lckhhbmRsZXI+IF9jcmVhdGVUaW1lcjsKICBfWm9uZUZ1bmN0aW9uPENyZWF0ZVBlcmlvZGljVGltZXJIYW5kbGVyPiBfY3JlYXRlUGVyaW9kaWNUaW1lcjsKICBfWm9uZUZ1bmN0aW9uPFByaW50SGFuZGxlcj4gX3ByaW50OwogIF9ab25lRnVuY3Rpb248Rm9ya0hhbmRsZXI+IF9mb3JrOwogIF9ab25lRnVuY3Rpb248SGFuZGxlVW5jYXVnaHRFcnJvckhhbmRsZXI+IF9oYW5kbGVVbmNhdWdodEVycm9yOwoKICAvLyBBIGNhY2hlZCBkZWxlZ2F0ZSB0byB0aGlzIHpvbmUuCiAgWm9uZURlbGVnYXRlIF9kZWxlZ2F0ZUNhY2hlOwoKICAvLy8gVGhlIHBhcmVudCB6b25lLgogIGZpbmFsIF9ab25lIHBhcmVudDsKCiAgLy8vIFRoZSB6b25lJ3Mgc2NvcGVkIHZhbHVlIGRlY2xhcmF0aW9uIG1hcC4KICAvLy8KICAvLy8gVGhpcyBpcyBhbHdheXMgYSBbSGFzaE1hcF0uCiAgZmluYWwgTWFwIF9tYXA7CgogIFpvbmVEZWxlZ2F0ZSBnZXQgX2RlbGVnYXRlIHsKICAgIGlmIChfZGVsZWdhdGVDYWNoZSAhPSBudWxsKSByZXR1cm4gX2RlbGVnYXRlQ2FjaGU7CiAgICBfZGVsZWdhdGVDYWNoZSA9IG5ldyBfWm9uZURlbGVnYXRlKHRoaXMpOwogICAgcmV0dXJuIF9kZWxlZ2F0ZUNhY2hlOwogIH0KCiAgX0N1c3RvbVpvbmUodGhpcy5wYXJlbnQsIFpvbmVTcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb24sIHRoaXMuX21hcCkgewogICAgLy8gVGhlIHJvb3Qgem9uZSB3aWxsIGhhdmUgaW1wbGVtZW50YXRpb25zIG9mIGFsbCBwYXJ0cyBvZiB0aGUKICAgIC8vIHNwZWNpZmljYXRpb24sIHNvIGl0IHdpbGwgbmV2ZXIgdHJ5IHRvIGFjY2VzcyB0aGUgKG51bGwpIHBhcmVudC4KICAgIC8vIEFsbCBvdGhlciB6b25lcyBoYXZlIGEgbm9uLW51bGwgcGFyZW50LgogICAgX3J1biA9IChzcGVjaWZpY2F0aW9uLnJ1biAhPSBudWxsKQogICAgICAgID8gbmV3IF9ab25lRnVuY3Rpb248RnVuY3Rpb24+KHRoaXMsIHNwZWNpZmljYXRpb24ucnVuKQogICAgICAgIDogcGFyZW50Ll9ydW47CiAgICBfcnVuVW5hcnkgPSAoc3BlY2lmaWNhdGlvbi5ydW5VbmFyeSAhPSBudWxsKQogICAgICAgID8gbmV3IF9ab25lRnVuY3Rpb248RnVuY3Rpb24+KHRoaXMsIHNwZWNpZmljYXRpb24ucnVuVW5hcnkpCiAgICAgICAgOiBwYXJlbnQuX3J1blVuYXJ5OwogICAgX3J1bkJpbmFyeSA9IChzcGVjaWZpY2F0aW9uLnJ1bkJpbmFyeSAhPSBudWxsKQogICAgICAgID8gbmV3IF9ab25lRnVuY3Rpb248RnVuY3Rpb24+KHRoaXMsIHNwZWNpZmljYXRpb24ucnVuQmluYXJ5KQogICAgICAgIDogcGFyZW50Ll9ydW5CaW5hcnk7CiAgICBfcmVnaXN0ZXJDYWxsYmFjayA9IChzcGVjaWZpY2F0aW9uLnJlZ2lzdGVyQ2FsbGJhY2sgIT0gbnVsbCkKICAgICAgICA/IG5ldyBfWm9uZUZ1bmN0aW9uPEZ1bmN0aW9uPih0aGlzLCBzcGVjaWZpY2F0aW9uLnJlZ2lzdGVyQ2FsbGJhY2spCiAgICAgICAgOiBwYXJlbnQuX3JlZ2lzdGVyQ2FsbGJhY2s7CiAgICBfcmVnaXN0ZXJVbmFyeUNhbGxiYWNrID0gKHNwZWNpZmljYXRpb24ucmVnaXN0ZXJVbmFyeUNhbGxiYWNrICE9IG51bGwpCiAgICAgICAgPyBuZXcgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4odGhpcywgc3BlY2lmaWNhdGlvbi5yZWdpc3RlclVuYXJ5Q2FsbGJhY2spCiAgICAgICAgOiBwYXJlbnQuX3JlZ2lzdGVyVW5hcnlDYWxsYmFjazsKICAgIF9yZWdpc3RlckJpbmFyeUNhbGxiYWNrID0gKHNwZWNpZmljYXRpb24ucmVnaXN0ZXJCaW5hcnlDYWxsYmFjayAhPSBudWxsKQogICAgICAgID8gbmV3IF9ab25lRnVuY3Rpb248RnVuY3Rpb24+KAogICAgICAgICAgICB0aGlzLCBzcGVjaWZpY2F0aW9uLnJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2spCiAgICAgICAgOiBwYXJlbnQuX3JlZ2lzdGVyQmluYXJ5Q2FsbGJhY2s7CiAgICBfZXJyb3JDYWxsYmFjayA9IChzcGVjaWZpY2F0aW9uLmVycm9yQ2FsbGJhY2sgIT0gbnVsbCkKICAgICAgICA/IG5ldyBfWm9uZUZ1bmN0aW9uPEVycm9yQ2FsbGJhY2tIYW5kbGVyPigKICAgICAgICAgICAgdGhpcywgc3BlY2lmaWNhdGlvbi5lcnJvckNhbGxiYWNrKQogICAgICAgIDogcGFyZW50Ll9lcnJvckNhbGxiYWNrOwogICAgX3NjaGVkdWxlTWljcm90YXNrID0gKHNwZWNpZmljYXRpb24uc2NoZWR1bGVNaWNyb3Rhc2sgIT0gbnVsbCkKICAgICAgICA/IG5ldyBfWm9uZUZ1bmN0aW9uPFNjaGVkdWxlTWljcm90YXNrSGFuZGxlcj4oCiAgICAgICAgICAgIHRoaXMsIHNwZWNpZmljYXRpb24uc2NoZWR1bGVNaWNyb3Rhc2spCiAgICAgICAgOiBwYXJlbnQuX3NjaGVkdWxlTWljcm90YXNrOwogICAgX2NyZWF0ZVRpbWVyID0gKHNwZWNpZmljYXRpb24uY3JlYXRlVGltZXIgIT0gbnVsbCkKICAgICAgICA/IG5ldyBfWm9uZUZ1bmN0aW9uPENyZWF0ZVRpbWVySGFuZGxlcj4odGhpcywgc3BlY2lmaWNhdGlvbi5jcmVhdGVUaW1lcikKICAgICAgICA6IHBhcmVudC5fY3JlYXRlVGltZXI7CiAgICBfY3JlYXRlUGVyaW9kaWNUaW1lciA9IChzcGVjaWZpY2F0aW9uLmNyZWF0ZVBlcmlvZGljVGltZXIgIT0gbnVsbCkKICAgICAgICA/IG5ldyBfWm9uZUZ1bmN0aW9uPENyZWF0ZVBlcmlvZGljVGltZXJIYW5kbGVyPigKICAgICAgICAgICAgdGhpcywgc3BlY2lmaWNhdGlvbi5jcmVhdGVQZXJpb2RpY1RpbWVyKQogICAgICAgIDogcGFyZW50Ll9jcmVhdGVQZXJpb2RpY1RpbWVyOwogICAgX3ByaW50ID0gKHNwZWNpZmljYXRpb24ucHJpbnQgIT0gbnVsbCkKICAgICAgICA/IG5ldyBfWm9uZUZ1bmN0aW9uPFByaW50SGFuZGxlcj4odGhpcywgc3BlY2lmaWNhdGlvbi5wcmludCkKICAgICAgICA6IHBhcmVudC5fcHJpbnQ7CiAgICBfZm9yayA9IChzcGVjaWZpY2F0aW9uLmZvcmsgIT0gbnVsbCkKICAgICAgICA/IG5ldyBfWm9uZUZ1bmN0aW9uPEZvcmtIYW5kbGVyPih0aGlzLCBzcGVjaWZpY2F0aW9uLmZvcmspCiAgICAgICAgOiBwYXJlbnQuX2Zvcms7CiAgICBfaGFuZGxlVW5jYXVnaHRFcnJvciA9IChzcGVjaWZpY2F0aW9uLmhhbmRsZVVuY2F1Z2h0RXJyb3IgIT0gbnVsbCkKICAgICAgICA/IG5ldyBfWm9uZUZ1bmN0aW9uPEhhbmRsZVVuY2F1Z2h0RXJyb3JIYW5kbGVyPigKICAgICAgICAgICAgdGhpcywgc3BlY2lmaWNhdGlvbi5oYW5kbGVVbmNhdWdodEVycm9yKQogICAgICAgIDogcGFyZW50Ll9oYW5kbGVVbmNhdWdodEVycm9yOwogIH0KCiAgLyoqCiAgICogVGhlIGNsb3Nlc3QgZXJyb3ItaGFuZGxpbmcgem9uZS4KICAgKgogICAqIFJldHVybnMgYHRoaXNgIGlmIGB0aGlzYCBoYXMgYW4gZXJyb3ItaGFuZGxlci4gT3RoZXJ3aXNlIHJldHVybnMgdGhlCiAgICogcGFyZW50J3MgZXJyb3Item9uZS4KICAgKi8KICBab25lIGdldCBlcnJvclpvbmUgPT4gX2hhbmRsZVVuY2F1Z2h0RXJyb3Iuem9uZTsKCiAgdm9pZCBydW5HdWFyZGVkKHZvaWQgZigpKSB7CiAgICB0cnkgewogICAgICBydW4oZik7CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIGhhbmRsZVVuY2F1Z2h0RXJyb3IoZSwgcyk7CiAgICB9CiAgfQoKICB2b2lkIHJ1blVuYXJ5R3VhcmRlZDxUPih2b2lkIGYoVCBhcmcpLCBUIGFyZykgewogICAgdHJ5IHsKICAgICAgcnVuVW5hcnkoZiwgYXJnKTsKICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgaGFuZGxlVW5jYXVnaHRFcnJvcihlLCBzKTsKICAgIH0KICB9CgogIHZvaWQgcnVuQmluYXJ5R3VhcmRlZDxUMSwgVDI+KHZvaWQgZihUMSBhcmcxLCBUMiBhcmcyKSwgVDEgYXJnMSwgVDIgYXJnMikgewogICAgdHJ5IHsKICAgICAgcnVuQmluYXJ5KGYsIGFyZzEsIGFyZzIpOwogICAgfSBjYXRjaCAoZSwgcykgewogICAgICBoYW5kbGVVbmNhdWdodEVycm9yKGUsIHMpOwogICAgfQogIH0KCiAgWm9uZUNhbGxiYWNrPFI+IGJpbmRDYWxsYmFjazxSPihSIGYoKSkgewogICAgdmFyIHJlZ2lzdGVyZWQgPSByZWdpc3RlckNhbGxiYWNrKGYpOwogICAgcmV0dXJuICgpID0+IHRoaXMucnVuKHJlZ2lzdGVyZWQpOwogIH0KCiAgWm9uZVVuYXJ5Q2FsbGJhY2s8UiwgVD4gYmluZFVuYXJ5Q2FsbGJhY2s8UiwgVD4oUiBmKFQgYXJnKSkgewogICAgdmFyIHJlZ2lzdGVyZWQgPSByZWdpc3RlclVuYXJ5Q2FsbGJhY2soZik7CiAgICByZXR1cm4gKGFyZykgPT4gdGhpcy5ydW5VbmFyeShyZWdpc3RlcmVkLCBhcmcpOwogIH0KCiAgWm9uZUJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4gYmluZEJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4oCiAgICAgIFIgZihUMSBhcmcxLCBUMiBhcmcyKSkgewogICAgdmFyIHJlZ2lzdGVyZWQgPSByZWdpc3RlckJpbmFyeUNhbGxiYWNrKGYpOwogICAgcmV0dXJuIChhcmcxLCBhcmcyKSA9PiB0aGlzLnJ1bkJpbmFyeShyZWdpc3RlcmVkLCBhcmcxLCBhcmcyKTsKICB9CgogIHZvaWQgRnVuY3Rpb24oKSBiaW5kQ2FsbGJhY2tHdWFyZGVkKHZvaWQgZigpKSB7CiAgICB2YXIgcmVnaXN0ZXJlZCA9IHJlZ2lzdGVyQ2FsbGJhY2soZik7CiAgICByZXR1cm4gKCkgPT4gdGhpcy5ydW5HdWFyZGVkKHJlZ2lzdGVyZWQpOwogIH0KCiAgdm9pZCBGdW5jdGlvbihUKSBiaW5kVW5hcnlDYWxsYmFja0d1YXJkZWQ8VD4odm9pZCBmKFQgYXJnKSkgewogICAgdmFyIHJlZ2lzdGVyZWQgPSByZWdpc3RlclVuYXJ5Q2FsbGJhY2soZik7CiAgICByZXR1cm4gKGFyZykgPT4gdGhpcy5ydW5VbmFyeUd1YXJkZWQocmVnaXN0ZXJlZCwgYXJnKTsKICB9CgogIHZvaWQgRnVuY3Rpb24oVDEsIFQyKSBiaW5kQmluYXJ5Q2FsbGJhY2tHdWFyZGVkPFQxLCBUMj4oCiAgICAgIHZvaWQgZihUMSBhcmcxLCBUMiBhcmcyKSkgewogICAgdmFyIHJlZ2lzdGVyZWQgPSByZWdpc3RlckJpbmFyeUNhbGxiYWNrKGYpOwogICAgcmV0dXJuIChhcmcxLCBhcmcyKSA9PiB0aGlzLnJ1bkJpbmFyeUd1YXJkZWQocmVnaXN0ZXJlZCwgYXJnMSwgYXJnMik7CiAgfQoKICBvcGVyYXRvciBbXShPYmplY3Qga2V5KSB7CiAgICB2YXIgcmVzdWx0ID0gX21hcFtrZXldOwogICAgaWYgKHJlc3VsdCAhPSBudWxsIHx8IF9tYXAuY29udGFpbnNLZXkoa2V5KSkgcmV0dXJuIHJlc3VsdDsKICAgIC8vIElmIHdlIGFyZSBub3QgdGhlIHJvb3Qgem9uZSwgbG9vayB1cCBpbiB0aGUgcGFyZW50IHpvbmUuCiAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKICAgICAgLy8gV2UgZG8gbm90IG9wdGltaXplIGZvciByZXBlYXRlZGx5IGxvb2tpbmcgdXAgYSBrZXkgd2hpY2ggaXNuJ3QKICAgICAgLy8gdGhlcmUuIFRoYXQgd291bGQgcmVxdWlyZSBzdG9yaW5nIHRoZSBrZXkgYW5kIGtlZXBpbmcgaXQgYWxpdmUuCiAgICAgIC8vIENvcHlpbmcgdGhlIGtleS92YWx1ZSBmcm9tIHRoZSBwYXJlbnQgZG9lcyBub3Qga2VlcCBhbnkgbmV3IHZhbHVlcwogICAgICAvLyBhbGl2ZS4KICAgICAgdmFyIHZhbHVlID0gcGFyZW50W2tleV07CiAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgICAgX21hcFtrZXldID0gdmFsdWU7CiAgICAgIH0KICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQogICAgYXNzZXJ0KHRoaXMgPT0gX3Jvb3Rab25lKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgLy8gTWV0aG9kcyB0aGF0IGNhbiBiZSBjdXN0b21pemVkIGJ5IHRoZSB6b25lIHNwZWNpZmljYXRpb24uCgogIHZvaWQgaGFuZGxlVW5jYXVnaHRFcnJvcihlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSB0aGlzLl9oYW5kbGVVbmNhdWdodEVycm9yOwogICAgYXNzZXJ0KGltcGxlbWVudGF0aW9uICE9IG51bGwpOwogICAgWm9uZURlbGVnYXRlIHBhcmVudERlbGVnYXRlID0gX3BhcmVudERlbGVnYXRlKGltcGxlbWVudGF0aW9uLnpvbmUpOwogICAgSGFuZGxlVW5jYXVnaHRFcnJvckhhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgcmV0dXJuIGhhbmRsZXIoCiAgICAgICAgaW1wbGVtZW50YXRpb24uem9uZSwgcGFyZW50RGVsZWdhdGUsIHRoaXMsIGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIFpvbmUgZm9yayh7Wm9uZVNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbiwgTWFwIHpvbmVWYWx1ZXN9KSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSB0aGlzLl9mb3JrOwogICAgYXNzZXJ0KGltcGxlbWVudGF0aW9uICE9IG51bGwpOwogICAgWm9uZURlbGVnYXRlIHBhcmVudERlbGVnYXRlID0gX3BhcmVudERlbGVnYXRlKGltcGxlbWVudGF0aW9uLnpvbmUpOwogICAgRm9ya0hhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgcmV0dXJuIGhhbmRsZXIoCiAgICAgICAgaW1wbGVtZW50YXRpb24uem9uZSwgcGFyZW50RGVsZWdhdGUsIHRoaXMsIHNwZWNpZmljYXRpb24sIHpvbmVWYWx1ZXMpOwogIH0KCiAgUiBydW48Uj4oUiBmKCkpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IHRoaXMuX3J1bjsKICAgIGFzc2VydChpbXBsZW1lbnRhdGlvbiAhPSBudWxsKTsKICAgIFpvbmVEZWxlZ2F0ZSBwYXJlbnREZWxlZ2F0ZSA9IF9wYXJlbnREZWxlZ2F0ZShpbXBsZW1lbnRhdGlvbi56b25lKTsKICAgIFJ1bkhhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgcmV0dXJuIGhhbmRsZXIoaW1wbGVtZW50YXRpb24uem9uZSwgcGFyZW50RGVsZWdhdGUsIHRoaXMsIGYpOwogIH0KCiAgUiBydW5VbmFyeTxSLCBUPihSIGYoVCBhcmcpLCBUIGFyZykgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gdGhpcy5fcnVuVW5hcnk7CiAgICBhc3NlcnQoaW1wbGVtZW50YXRpb24gIT0gbnVsbCk7CiAgICBab25lRGVsZWdhdGUgcGFyZW50RGVsZWdhdGUgPSBfcGFyZW50RGVsZWdhdGUoaW1wbGVtZW50YXRpb24uem9uZSk7CiAgICBSdW5VbmFyeUhhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgcmV0dXJuIGhhbmRsZXIoaW1wbGVtZW50YXRpb24uem9uZSwgcGFyZW50RGVsZWdhdGUsIHRoaXMsIGYsIGFyZyk7CiAgfQoKICBSIHJ1bkJpbmFyeTxSLCBUMSwgVDI+KFIgZihUMSBhcmcxLCBUMiBhcmcyKSwgVDEgYXJnMSwgVDIgYXJnMikgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gdGhpcy5fcnVuQmluYXJ5OwogICAgYXNzZXJ0KGltcGxlbWVudGF0aW9uICE9IG51bGwpOwogICAgWm9uZURlbGVnYXRlIHBhcmVudERlbGVnYXRlID0gX3BhcmVudERlbGVnYXRlKGltcGxlbWVudGF0aW9uLnpvbmUpOwogICAgUnVuQmluYXJ5SGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcihpbXBsZW1lbnRhdGlvbi56b25lLCBwYXJlbnREZWxlZ2F0ZSwgdGhpcywgZiwgYXJnMSwgYXJnMik7CiAgfQoKICBab25lQ2FsbGJhY2s8Uj4gcmVnaXN0ZXJDYWxsYmFjazxSPihSIGNhbGxiYWNrKCkpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IHRoaXMuX3JlZ2lzdGVyQ2FsbGJhY2s7CiAgICBhc3NlcnQoaW1wbGVtZW50YXRpb24gIT0gbnVsbCk7CiAgICBab25lRGVsZWdhdGUgcGFyZW50RGVsZWdhdGUgPSBfcGFyZW50RGVsZWdhdGUoaW1wbGVtZW50YXRpb24uem9uZSk7CiAgICBSZWdpc3RlckNhbGxiYWNrSGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcihpbXBsZW1lbnRhdGlvbi56b25lLCBwYXJlbnREZWxlZ2F0ZSwgdGhpcywgY2FsbGJhY2spOwogIH0KCiAgWm9uZVVuYXJ5Q2FsbGJhY2s8UiwgVD4gcmVnaXN0ZXJVbmFyeUNhbGxiYWNrPFIsIFQ+KFIgY2FsbGJhY2soVCBhcmcpKSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSB0aGlzLl9yZWdpc3RlclVuYXJ5Q2FsbGJhY2s7CiAgICBhc3NlcnQoaW1wbGVtZW50YXRpb24gIT0gbnVsbCk7CiAgICBab25lRGVsZWdhdGUgcGFyZW50RGVsZWdhdGUgPSBfcGFyZW50RGVsZWdhdGUoaW1wbGVtZW50YXRpb24uem9uZSk7CiAgICBSZWdpc3RlclVuYXJ5Q2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIgPSBpbXBsZW1lbnRhdGlvbi5mdW5jdGlvbjsKICAgIHJldHVybiBoYW5kbGVyKGltcGxlbWVudGF0aW9uLnpvbmUsIHBhcmVudERlbGVnYXRlLCB0aGlzLCBjYWxsYmFjayk7CiAgfQoKICBab25lQmluYXJ5Q2FsbGJhY2s8UiwgVDEsIFQyPiByZWdpc3RlckJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4oCiAgICAgIFIgY2FsbGJhY2soVDEgYXJnMSwgVDIgYXJnMikpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IHRoaXMuX3JlZ2lzdGVyQmluYXJ5Q2FsbGJhY2s7CiAgICBhc3NlcnQoaW1wbGVtZW50YXRpb24gIT0gbnVsbCk7CiAgICBab25lRGVsZWdhdGUgcGFyZW50RGVsZWdhdGUgPSBfcGFyZW50RGVsZWdhdGUoaW1wbGVtZW50YXRpb24uem9uZSk7CiAgICBSZWdpc3RlckJpbmFyeUNhbGxiYWNrSGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcihpbXBsZW1lbnRhdGlvbi56b25lLCBwYXJlbnREZWxlZ2F0ZSwgdGhpcywgY2FsbGJhY2spOwogIH0KCiAgQXN5bmNFcnJvciBlcnJvckNhbGxiYWNrKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSB0aGlzLl9lcnJvckNhbGxiYWNrOwogICAgYXNzZXJ0KGltcGxlbWVudGF0aW9uICE9IG51bGwpOwogICAgZmluYWwgWm9uZSBpbXBsZW1lbnRhdGlvblpvbmUgPSBpbXBsZW1lbnRhdGlvbi56b25lOwogICAgaWYgKGlkZW50aWNhbChpbXBsZW1lbnRhdGlvblpvbmUsIF9yb290Wm9uZSkpIHJldHVybiBudWxsOwogICAgZmluYWwgWm9uZURlbGVnYXRlIHBhcmVudERlbGVnYXRlID0gX3BhcmVudERlbGVnYXRlKGltcGxlbWVudGF0aW9uWm9uZSk7CiAgICBFcnJvckNhbGxiYWNrSGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcihpbXBsZW1lbnRhdGlvblpvbmUsIHBhcmVudERlbGVnYXRlLCB0aGlzLCBlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQoKICB2b2lkIHNjaGVkdWxlTWljcm90YXNrKHZvaWQgZigpKSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSB0aGlzLl9zY2hlZHVsZU1pY3JvdGFzazsKICAgIGFzc2VydChpbXBsZW1lbnRhdGlvbiAhPSBudWxsKTsKICAgIFpvbmVEZWxlZ2F0ZSBwYXJlbnREZWxlZ2F0ZSA9IF9wYXJlbnREZWxlZ2F0ZShpbXBsZW1lbnRhdGlvbi56b25lKTsKICAgIFNjaGVkdWxlTWljcm90YXNrSGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcihpbXBsZW1lbnRhdGlvbi56b25lLCBwYXJlbnREZWxlZ2F0ZSwgdGhpcywgZik7CiAgfQoKICBUaW1lciBjcmVhdGVUaW1lcihEdXJhdGlvbiBkdXJhdGlvbiwgdm9pZCBmKCkpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IHRoaXMuX2NyZWF0ZVRpbWVyOwogICAgYXNzZXJ0KGltcGxlbWVudGF0aW9uICE9IG51bGwpOwogICAgWm9uZURlbGVnYXRlIHBhcmVudERlbGVnYXRlID0gX3BhcmVudERlbGVnYXRlKGltcGxlbWVudGF0aW9uLnpvbmUpOwogICAgQ3JlYXRlVGltZXJIYW5kbGVyIGhhbmRsZXIgPSBpbXBsZW1lbnRhdGlvbi5mdW5jdGlvbjsKICAgIHJldHVybiBoYW5kbGVyKGltcGxlbWVudGF0aW9uLnpvbmUsIHBhcmVudERlbGVnYXRlLCB0aGlzLCBkdXJhdGlvbiwgZik7CiAgfQoKICBUaW1lciBjcmVhdGVQZXJpb2RpY1RpbWVyKER1cmF0aW9uIGR1cmF0aW9uLCB2b2lkIGYoVGltZXIgdGltZXIpKSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSB0aGlzLl9jcmVhdGVQZXJpb2RpY1RpbWVyOwogICAgYXNzZXJ0KGltcGxlbWVudGF0aW9uICE9IG51bGwpOwogICAgWm9uZURlbGVnYXRlIHBhcmVudERlbGVnYXRlID0gX3BhcmVudERlbGVnYXRlKGltcGxlbWVudGF0aW9uLnpvbmUpOwogICAgQ3JlYXRlUGVyaW9kaWNUaW1lckhhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgcmV0dXJuIGhhbmRsZXIoaW1wbGVtZW50YXRpb24uem9uZSwgcGFyZW50RGVsZWdhdGUsIHRoaXMsIGR1cmF0aW9uLCBmKTsKICB9CgogIHZvaWQgcHJpbnQoU3RyaW5nIGxpbmUpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IHRoaXMuX3ByaW50OwogICAgYXNzZXJ0KGltcGxlbWVudGF0aW9uICE9IG51bGwpOwogICAgWm9uZURlbGVnYXRlIHBhcmVudERlbGVnYXRlID0gX3BhcmVudERlbGVnYXRlKGltcGxlbWVudGF0aW9uLnpvbmUpOwogICAgUHJpbnRIYW5kbGVyIGhhbmRsZXIgPSBpbXBsZW1lbnRhdGlvbi5mdW5jdGlvbjsKICAgIHJldHVybiBoYW5kbGVyKGltcGxlbWVudGF0aW9uLnpvbmUsIHBhcmVudERlbGVnYXRlLCB0aGlzLCBsaW5lKTsKICB9Cn0KCnZvaWQgX3Jvb3RIYW5kbGVVbmNhdWdodEVycm9yKAogICAgWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICBfc2NoZWR1bGVQcmlvcml0eUFzeW5jQ2FsbGJhY2soKCkgewogICAgZXJyb3IgPz89IG5ldyBOdWxsVGhyb3duRXJyb3IoKTsKICAgIGlmIChzdGFja1RyYWNlID09IG51bGwpIHRocm93IGVycm9yOwogICAgX3JldGhyb3coZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0pOwp9CgpleHRlcm5hbCB2b2lkIF9yZXRocm93KE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKTsKClIgX3Jvb3RSdW48Uj4oWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIFIgZigpKSB7CiAgaWYgKFpvbmUuX2N1cnJlbnQgPT0gem9uZSkgcmV0dXJuIGYoKTsKCiAgWm9uZSBvbGQgPSBab25lLl9lbnRlcih6b25lKTsKICB0cnkgewogICAgcmV0dXJuIGYoKTsKICB9IGZpbmFsbHkgewogICAgWm9uZS5fbGVhdmUob2xkKTsKICB9Cn0KClIgX3Jvb3RSdW5VbmFyeTxSLCBUPigKICAgIFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLCBSIGYoVCBhcmcpLCBUIGFyZykgewogIGlmIChab25lLl9jdXJyZW50ID09IHpvbmUpIHJldHVybiBmKGFyZyk7CgogIFpvbmUgb2xkID0gWm9uZS5fZW50ZXIoem9uZSk7CiAgdHJ5IHsKICAgIHJldHVybiBmKGFyZyk7CiAgfSBmaW5hbGx5IHsKICAgIFpvbmUuX2xlYXZlKG9sZCk7CiAgfQp9CgpSIF9yb290UnVuQmluYXJ5PFIsIFQxLCBUMj4oWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsCiAgICBSIGYoVDEgYXJnMSwgVDIgYXJnMiksIFQxIGFyZzEsIFQyIGFyZzIpIHsKICBpZiAoWm9uZS5fY3VycmVudCA9PSB6b25lKSByZXR1cm4gZihhcmcxLCBhcmcyKTsKCiAgWm9uZSBvbGQgPSBab25lLl9lbnRlcih6b25lKTsKICB0cnkgewogICAgcmV0dXJuIGYoYXJnMSwgYXJnMik7CiAgfSBmaW5hbGx5IHsKICAgIFpvbmUuX2xlYXZlKG9sZCk7CiAgfQp9Cgpab25lQ2FsbGJhY2s8Uj4gX3Jvb3RSZWdpc3RlckNhbGxiYWNrPFI+KAogICAgWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIFIgZigpKSB7CiAgcmV0dXJuIGY7Cn0KClpvbmVVbmFyeUNhbGxiYWNrPFIsIFQ+IF9yb290UmVnaXN0ZXJVbmFyeUNhbGxiYWNrPFIsIFQ+KAogICAgWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIFIgZihUIGFyZykpIHsKICByZXR1cm4gZjsKfQoKWm9uZUJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4gX3Jvb3RSZWdpc3RlckJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4oCiAgICBab25lIHNlbGYsIFpvbmVEZWxlZ2F0ZSBwYXJlbnQsIFpvbmUgem9uZSwgUiBmKFQxIGFyZzEsIFQyIGFyZzIpKSB7CiAgcmV0dXJuIGY7Cn0KCkFzeW5jRXJyb3IgX3Jvb3RFcnJvckNhbGxiYWNrKFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLAogICAgICAgIE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSA9PgogICAgbnVsbDsKCnZvaWQgX3Jvb3RTY2hlZHVsZU1pY3JvdGFzaygKICAgIFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLCB2b2lkIGYoKSkgewogIGlmICghaWRlbnRpY2FsKF9yb290Wm9uZSwgem9uZSkpIHsKICAgIGJvb2wgaGFzRXJyb3JIYW5kbGVyID0gIV9yb290Wm9uZS5pblNhbWVFcnJvclpvbmUoem9uZSk7CiAgICBpZiAoaGFzRXJyb3JIYW5kbGVyKSB7CiAgICAgIGYgPSB6b25lLmJpbmRDYWxsYmFja0d1YXJkZWQoZik7CiAgICB9IGVsc2UgewogICAgICBmID0gem9uZS5iaW5kQ2FsbGJhY2soZik7CiAgICB9CiAgICAvLyBVc2Ugcm9vdCB6b25lIGFzIGV2ZW50IHpvbmUgaWYgdGhlIGZ1bmN0aW9uIGlzIGFscmVhZHkgYm91bmQuCiAgICB6b25lID0gX3Jvb3Rab25lOwogIH0KICBfc2NoZWR1bGVBc3luY0NhbGxiYWNrKGYpOwp9CgpUaW1lciBfcm9vdENyZWF0ZVRpbWVyKFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLAogICAgRHVyYXRpb24gZHVyYXRpb24sIHZvaWQgY2FsbGJhY2soKSkgewogIGlmICghaWRlbnRpY2FsKF9yb290Wm9uZSwgem9uZSkpIHsKICAgIGNhbGxiYWNrID0gem9uZS5iaW5kQ2FsbGJhY2soY2FsbGJhY2spOwogIH0KICByZXR1cm4gVGltZXIuX2NyZWF0ZVRpbWVyKGR1cmF0aW9uLCBjYWxsYmFjayk7Cn0KClRpbWVyIF9yb290Q3JlYXRlUGVyaW9kaWNUaW1lcihab25lIHNlbGYsIFpvbmVEZWxlZ2F0ZSBwYXJlbnQsIFpvbmUgem9uZSwKICAgIER1cmF0aW9uIGR1cmF0aW9uLCB2b2lkIGNhbGxiYWNrKFRpbWVyIHRpbWVyKSkgewogIGlmICghaWRlbnRpY2FsKF9yb290Wm9uZSwgem9uZSkpIHsKICAgIC8vIFRPRE8oZmxvaXRzY2gpOiB0aGUgcmV0dXJuIHR5cGUgc2hvdWxkIGJlICd2b2lkJy4KICAgIGNhbGxiYWNrID0gem9uZS5iaW5kVW5hcnlDYWxsYmFjazxkeW5hbWljLCBUaW1lcj4oY2FsbGJhY2spOwogIH0KICByZXR1cm4gVGltZXIuX2NyZWF0ZVBlcmlvZGljVGltZXIoZHVyYXRpb24sIGNhbGxiYWNrKTsKfQoKdm9pZCBfcm9vdFByaW50KFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLCBTdHJpbmcgbGluZSkgewogIHByaW50VG9Db25zb2xlKGxpbmUpOwp9Cgp2b2lkIF9wcmludFRvWm9uZShTdHJpbmcgbGluZSkgewogIFpvbmUuY3VycmVudC5wcmludChsaW5lKTsKfQoKWm9uZSBfcm9vdEZvcmsoWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsCiAgICBab25lU3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uLCBNYXAgem9uZVZhbHVlcykgewogIC8vIFRPRE8oZmxvaXRzY2gpOiBpdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIGdldCByaWQgb2YgdGhpcyBoYWNrLgogIC8vIENoYW5nZSB0aGUgc3RhdGljIHpvbmVPckRpcmVjdFByaW50IGZ1bmN0aW9uIHRvIGdvIHRocm91Z2ggem9uZXMKICAvLyBmcm9tIG5vdyBvbi4KICBwcmludFRvWm9uZSA9IF9wcmludFRvWm9uZTsKCiAgaWYgKHNwZWNpZmljYXRpb24gPT0gbnVsbCkgewogICAgc3BlY2lmaWNhdGlvbiA9IGNvbnN0IFpvbmVTcGVjaWZpY2F0aW9uKCk7CiAgfSBlbHNlIGlmIChzcGVjaWZpY2F0aW9uIGlzISBfWm9uZVNwZWNpZmljYXRpb24pIHsKICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJab25lU3BlY2lmaWNhdGlvbnMgbXVzdCBiZSBpbnN0YW50aWF0ZWQiCiAgICAgICAgIiB3aXRoIHRoZSBwcm92aWRlZCBjb25zdHJ1Y3Rvci4iKTsKICB9CiAgTWFwIHZhbHVlTWFwOwogIGlmICh6b25lVmFsdWVzID09IG51bGwpIHsKICAgIGlmICh6b25lIGlzIF9ab25lKSB7CiAgICAgIHZhbHVlTWFwID0gem9uZS5fbWFwOwogICAgfSBlbHNlIHsKICAgICAgdmFsdWVNYXAgPSBuZXcgSGFzaE1hcCgpOwogICAgfQogIH0gZWxzZSB7CiAgICB2YWx1ZU1hcCA9IG5ldyBIYXNoTWFwLmZyb20oem9uZVZhbHVlcyk7CiAgfQogIHJldHVybiBuZXcgX0N1c3RvbVpvbmUoem9uZSwgc3BlY2lmaWNhdGlvbiwgdmFsdWVNYXApOwp9CgpjbGFzcyBfUm9vdFpvbmUgZXh0ZW5kcyBfWm9uZSB7CiAgY29uc3QgX1Jvb3Rab25lKCk7CgogIF9ab25lRnVuY3Rpb248RnVuY3Rpb24+IGdldCBfcnVuID0+CiAgICAgIGNvbnN0IF9ab25lRnVuY3Rpb248RnVuY3Rpb24+KF9yb290Wm9uZSwgX3Jvb3RSdW4pOwogIF9ab25lRnVuY3Rpb248RnVuY3Rpb24+IGdldCBfcnVuVW5hcnkgPT4KICAgICAgY29uc3QgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4oX3Jvb3Rab25lLCBfcm9vdFJ1blVuYXJ5KTsKICBfWm9uZUZ1bmN0aW9uPEZ1bmN0aW9uPiBnZXQgX3J1bkJpbmFyeSA9PgogICAgICBjb25zdCBfWm9uZUZ1bmN0aW9uPEZ1bmN0aW9uPihfcm9vdFpvbmUsIF9yb290UnVuQmluYXJ5KTsKICBfWm9uZUZ1bmN0aW9uPEZ1bmN0aW9uPiBnZXQgX3JlZ2lzdGVyQ2FsbGJhY2sgPT4KICAgICAgY29uc3QgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4oX3Jvb3Rab25lLCBfcm9vdFJlZ2lzdGVyQ2FsbGJhY2spOwogIF9ab25lRnVuY3Rpb248RnVuY3Rpb24+IGdldCBfcmVnaXN0ZXJVbmFyeUNhbGxiYWNrID0+CiAgICAgIGNvbnN0IF9ab25lRnVuY3Rpb248RnVuY3Rpb24+KF9yb290Wm9uZSwgX3Jvb3RSZWdpc3RlclVuYXJ5Q2FsbGJhY2spOwogIF9ab25lRnVuY3Rpb248RnVuY3Rpb24+IGdldCBfcmVnaXN0ZXJCaW5hcnlDYWxsYmFjayA9PgogICAgICBjb25zdCBfWm9uZUZ1bmN0aW9uPEZ1bmN0aW9uPihfcm9vdFpvbmUsIF9yb290UmVnaXN0ZXJCaW5hcnlDYWxsYmFjayk7CiAgX1pvbmVGdW5jdGlvbjxFcnJvckNhbGxiYWNrSGFuZGxlcj4gZ2V0IF9lcnJvckNhbGxiYWNrID0+CiAgICAgIGNvbnN0IF9ab25lRnVuY3Rpb248RXJyb3JDYWxsYmFja0hhbmRsZXI+KF9yb290Wm9uZSwgX3Jvb3RFcnJvckNhbGxiYWNrKTsKICBfWm9uZUZ1bmN0aW9uPFNjaGVkdWxlTWljcm90YXNrSGFuZGxlcj4gZ2V0IF9zY2hlZHVsZU1pY3JvdGFzayA9PgogICAgICBjb25zdCBfWm9uZUZ1bmN0aW9uPFNjaGVkdWxlTWljcm90YXNrSGFuZGxlcj4oCiAgICAgICAgICBfcm9vdFpvbmUsIF9yb290U2NoZWR1bGVNaWNyb3Rhc2spOwogIF9ab25lRnVuY3Rpb248Q3JlYXRlVGltZXJIYW5kbGVyPiBnZXQgX2NyZWF0ZVRpbWVyID0+CiAgICAgIGNvbnN0IF9ab25lRnVuY3Rpb248Q3JlYXRlVGltZXJIYW5kbGVyPihfcm9vdFpvbmUsIF9yb290Q3JlYXRlVGltZXIpOwogIF9ab25lRnVuY3Rpb248Q3JlYXRlUGVyaW9kaWNUaW1lckhhbmRsZXI+IGdldCBfY3JlYXRlUGVyaW9kaWNUaW1lciA9PgogICAgICBjb25zdCBfWm9uZUZ1bmN0aW9uPENyZWF0ZVBlcmlvZGljVGltZXJIYW5kbGVyPigKICAgICAgICAgIF9yb290Wm9uZSwgX3Jvb3RDcmVhdGVQZXJpb2RpY1RpbWVyKTsKICBfWm9uZUZ1bmN0aW9uPFByaW50SGFuZGxlcj4gZ2V0IF9wcmludCA9PgogICAgICBjb25zdCBfWm9uZUZ1bmN0aW9uPFByaW50SGFuZGxlcj4oX3Jvb3Rab25lLCBfcm9vdFByaW50KTsKICBfWm9uZUZ1bmN0aW9uPEZvcmtIYW5kbGVyPiBnZXQgX2ZvcmsgPT4KICAgICAgY29uc3QgX1pvbmVGdW5jdGlvbjxGb3JrSGFuZGxlcj4oX3Jvb3Rab25lLCBfcm9vdEZvcmspOwogIF9ab25lRnVuY3Rpb248SGFuZGxlVW5jYXVnaHRFcnJvckhhbmRsZXI+IGdldCBfaGFuZGxlVW5jYXVnaHRFcnJvciA9PgogICAgICBjb25zdCBfWm9uZUZ1bmN0aW9uPEhhbmRsZVVuY2F1Z2h0RXJyb3JIYW5kbGVyPigKICAgICAgICAgIF9yb290Wm9uZSwgX3Jvb3RIYW5kbGVVbmNhdWdodEVycm9yKTsKCiAgLy8gVGhlIHBhcmVudCB6b25lLgogIF9ab25lIGdldCBwYXJlbnQgPT4gbnVsbDsKCiAgLy8vIFRoZSB6b25lJ3Mgc2NvcGVkIHZhbHVlIGRlY2xhcmF0aW9uIG1hcC4KICAvLy8KICAvLy8gVGhpcyBpcyBhbHdheXMgYSBbSGFzaE1hcF0uCiAgTWFwIGdldCBfbWFwID0+IF9yb290TWFwOwoKICBzdGF0aWMgZmluYWwgX3Jvb3RNYXAgPSBuZXcgSGFzaE1hcCgpOwoKICBzdGF0aWMgWm9uZURlbGVnYXRlIF9yb290RGVsZWdhdGU7CgogIFpvbmVEZWxlZ2F0ZSBnZXQgX2RlbGVnYXRlIHsKICAgIGlmIChfcm9vdERlbGVnYXRlICE9IG51bGwpIHJldHVybiBfcm9vdERlbGVnYXRlOwogICAgcmV0dXJuIF9yb290RGVsZWdhdGUgPSBuZXcgX1pvbmVEZWxlZ2F0ZSh0aGlzKTsKICB9CgogIC8qKgogICAqIFRoZSBjbG9zZXN0IGVycm9yLWhhbmRsaW5nIHpvbmUuCiAgICoKICAgKiBSZXR1cm5zIGB0aGlzYCBpZiBgdGhpc2AgaGFzIGFuIGVycm9yLWhhbmRsZXIuIE90aGVyd2lzZSByZXR1cm5zIHRoZQogICAqIHBhcmVudCdzIGVycm9yLXpvbmUuCiAgICovCiAgWm9uZSBnZXQgZXJyb3Jab25lID0+IHRoaXM7CgogIC8vIFpvbmUgaW50ZXJmYWNlLgoKICB2b2lkIHJ1bkd1YXJkZWQodm9pZCBmKCkpIHsKICAgIHRyeSB7CiAgICAgIGlmIChpZGVudGljYWwoX3Jvb3Rab25lLCBab25lLl9jdXJyZW50KSkgewogICAgICAgIGYoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgX3Jvb3RSdW4obnVsbCwgbnVsbCwgdGhpcywgZik7CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIGhhbmRsZVVuY2F1Z2h0RXJyb3IoZSwgcyk7CiAgICB9CiAgfQoKICB2b2lkIHJ1blVuYXJ5R3VhcmRlZDxUPih2b2lkIGYoVCBhcmcpLCBUIGFyZykgewogICAgdHJ5IHsKICAgICAgaWYgKGlkZW50aWNhbChfcm9vdFpvbmUsIFpvbmUuX2N1cnJlbnQpKSB7CiAgICAgICAgZihhcmcpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBfcm9vdFJ1blVuYXJ5KG51bGwsIG51bGwsIHRoaXMsIGYsIGFyZyk7CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIGhhbmRsZVVuY2F1Z2h0RXJyb3IoZSwgcyk7CiAgICB9CiAgfQoKICB2b2lkIHJ1bkJpbmFyeUd1YXJkZWQ8VDEsIFQyPih2b2lkIGYoVDEgYXJnMSwgVDIgYXJnMiksIFQxIGFyZzEsIFQyIGFyZzIpIHsKICAgIHRyeSB7CiAgICAgIGlmIChpZGVudGljYWwoX3Jvb3Rab25lLCBab25lLl9jdXJyZW50KSkgewogICAgICAgIGYoYXJnMSwgYXJnMik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIF9yb290UnVuQmluYXJ5KG51bGwsIG51bGwsIHRoaXMsIGYsIGFyZzEsIGFyZzIpOwogICAgfSBjYXRjaCAoZSwgcykgewogICAgICBoYW5kbGVVbmNhdWdodEVycm9yKGUsIHMpOwogICAgfQogIH0KCiAgWm9uZUNhbGxiYWNrPFI+IGJpbmRDYWxsYmFjazxSPihSIGYoKSkgewogICAgcmV0dXJuICgpID0+IHRoaXMucnVuPFI+KGYpOwogIH0KCiAgWm9uZVVuYXJ5Q2FsbGJhY2s8UiwgVD4gYmluZFVuYXJ5Q2FsbGJhY2s8UiwgVD4oUiBmKFQgYXJnKSkgewogICAgcmV0dXJuIChhcmcpID0+IHRoaXMucnVuVW5hcnk8UiwgVD4oZiwgYXJnKTsKICB9CgogIFpvbmVCaW5hcnlDYWxsYmFjazxSLCBUMSwgVDI+IGJpbmRCaW5hcnlDYWxsYmFjazxSLCBUMSwgVDI+KAogICAgICBSIGYoVDEgYXJnMSwgVDIgYXJnMikpIHsKICAgIHJldHVybiAoYXJnMSwgYXJnMikgPT4gdGhpcy5ydW5CaW5hcnk8UiwgVDEsIFQyPihmLCBhcmcxLCBhcmcyKTsKICB9CgogIHZvaWQgRnVuY3Rpb24oKSBiaW5kQ2FsbGJhY2tHdWFyZGVkKHZvaWQgZigpKSB7CiAgICByZXR1cm4gKCkgPT4gdGhpcy5ydW5HdWFyZGVkKGYpOwogIH0KCiAgdm9pZCBGdW5jdGlvbihUKSBiaW5kVW5hcnlDYWxsYmFja0d1YXJkZWQ8VD4odm9pZCBmKFQgYXJnKSkgewogICAgcmV0dXJuIChhcmcpID0+IHRoaXMucnVuVW5hcnlHdWFyZGVkKGYsIGFyZyk7CiAgfQoKICB2b2lkIEZ1bmN0aW9uKFQxLCBUMikgYmluZEJpbmFyeUNhbGxiYWNrR3VhcmRlZDxUMSwgVDI+KAogICAgICB2b2lkIGYoVDEgYXJnMSwgVDIgYXJnMikpIHsKICAgIHJldHVybiAoYXJnMSwgYXJnMikgPT4gdGhpcy5ydW5CaW5hcnlHdWFyZGVkKGYsIGFyZzEsIGFyZzIpOwogIH0KCiAgb3BlcmF0b3IgW10oT2JqZWN0IGtleSkgPT4gbnVsbDsKCiAgLy8gTWV0aG9kcyB0aGF0IGNhbiBiZSBjdXN0b21pemVkIGJ5IHRoZSB6b25lIHNwZWNpZmljYXRpb24uCgogIHZvaWQgaGFuZGxlVW5jYXVnaHRFcnJvcihlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICBfcm9vdEhhbmRsZVVuY2F1Z2h0RXJyb3IobnVsbCwgbnVsbCwgdGhpcywgZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgWm9uZSBmb3JrKHtab25lU3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uLCBNYXAgem9uZVZhbHVlc30pIHsKICAgIHJldHVybiBfcm9vdEZvcmsobnVsbCwgbnVsbCwgdGhpcywgc3BlY2lmaWNhdGlvbiwgem9uZVZhbHVlcyk7CiAgfQoKICBSIHJ1bjxSPihSIGYoKSkgewogICAgaWYgKGlkZW50aWNhbChab25lLl9jdXJyZW50LCBfcm9vdFpvbmUpKSByZXR1cm4gZigpOwogICAgcmV0dXJuIF9yb290UnVuKG51bGwsIG51bGwsIHRoaXMsIGYpOwogIH0KCiAgUiBydW5VbmFyeTxSLCBUPihSIGYoVCBhcmcpLCBUIGFyZykgewogICAgaWYgKGlkZW50aWNhbChab25lLl9jdXJyZW50LCBfcm9vdFpvbmUpKSByZXR1cm4gZihhcmcpOwogICAgcmV0dXJuIF9yb290UnVuVW5hcnkobnVsbCwgbnVsbCwgdGhpcywgZiwgYXJnKTsKICB9CgogIFIgcnVuQmluYXJ5PFIsIFQxLCBUMj4oUiBmKFQxIGFyZzEsIFQyIGFyZzIpLCBUMSBhcmcxLCBUMiBhcmcyKSB7CiAgICBpZiAoaWRlbnRpY2FsKFpvbmUuX2N1cnJlbnQsIF9yb290Wm9uZSkpIHJldHVybiBmKGFyZzEsIGFyZzIpOwogICAgcmV0dXJuIF9yb290UnVuQmluYXJ5KG51bGwsIG51bGwsIHRoaXMsIGYsIGFyZzEsIGFyZzIpOwogIH0KCiAgWm9uZUNhbGxiYWNrPFI+IHJlZ2lzdGVyQ2FsbGJhY2s8Uj4oUiBmKCkpID0+IGY7CgogIFpvbmVVbmFyeUNhbGxiYWNrPFIsIFQ+IHJlZ2lzdGVyVW5hcnlDYWxsYmFjazxSLCBUPihSIGYoVCBhcmcpKSA9PiBmOwoKICBab25lQmluYXJ5Q2FsbGJhY2s8UiwgVDEsIFQyPiByZWdpc3RlckJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4oCiAgICAgICAgICBSIGYoVDEgYXJnMSwgVDIgYXJnMikpID0+CiAgICAgIGY7CgogIEFzeW5jRXJyb3IgZXJyb3JDYWxsYmFjayhPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgPT4gbnVsbDsKCiAgdm9pZCBzY2hlZHVsZU1pY3JvdGFzayh2b2lkIGYoKSkgewogICAgX3Jvb3RTY2hlZHVsZU1pY3JvdGFzayhudWxsLCBudWxsLCB0aGlzLCBmKTsKICB9CgogIFRpbWVyIGNyZWF0ZVRpbWVyKER1cmF0aW9uIGR1cmF0aW9uLCB2b2lkIGYoKSkgewogICAgcmV0dXJuIFRpbWVyLl9jcmVhdGVUaW1lcihkdXJhdGlvbiwgZik7CiAgfQoKICBUaW1lciBjcmVhdGVQZXJpb2RpY1RpbWVyKER1cmF0aW9uIGR1cmF0aW9uLCB2b2lkIGYoVGltZXIgdGltZXIpKSB7CiAgICByZXR1cm4gVGltZXIuX2NyZWF0ZVBlcmlvZGljVGltZXIoZHVyYXRpb24sIGYpOwogIH0KCiAgdm9pZCBwcmludChTdHJpbmcgbGluZSkgewogICAgcHJpbnRUb0NvbnNvbGUobGluZSk7CiAgfQp9Cgpjb25zdCBfcm9vdFpvbmUgPSBjb25zdCBfUm9vdFpvbmUoKTsKCi8qKgogKiBSdW5zIFtib2R5XSBpbiBpdHMgb3duIHpvbmUuCiAqCiAqIENyZWF0ZXMgYSBuZXcgem9uZSB1c2luZyBbWm9uZS5mb3JrXSBiYXNlZCBvbiBbem9uZVNwZWNpZmljYXRpb25dIGFuZAogKiBbem9uZVZhbHVlc10sIHRoZW4gcnVucyBbYm9keV0gaW4gdGhhdCB6b25lIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCiAqCiAqIElmIFtvbkVycm9yXSBpcyBwcm92aWRlZCwgaXQgbXVzdCBoYXZlIG9uZSBvZiB0aGUgdHlwZXMKICogKiBgdm9pZCBGdW5jdGlvbihPYmplY3QpYAogKiAqIGB2b2lkIEZ1bmN0aW9uKE9iamVjdCwgU3RhY2tUcmFjZSlgCiAqIGFuZCB0aGUgW29uRXJyb3JdIGhhbmRsZXIgaXMgdXNlZCAqYm90aCogdG8gaGFuZGxlIGFzeW5jaHJvbm91cyBlcnJvcnMKICogYnkgb3ZlcnJpZGluZyBbWm9uZVNwZWNpZmljYXRpb24uaGFuZGxlVW5jYXVnaHRFcnJvcl0gaW4gW3pvbmVTcGVjaWZpY2F0aW9uXSwKICogaWYgYW55LCAqYW5kKiB0byBoYW5kbGUgZXJyb3JzIHRocm93biBzeW5jaHJvbm91c2x5IGJ5IHRoZSBjYWxsIHRvIFtib2R5XS4KICoKICogSWYgYW4gZXJyb3Igb2NjdXJzIHN5bmNocm9ub3VzbHkgaW4gW2JvZHldLAogKiB0aGVuIHRocm93aW5nIGluIHRoZSBbb25FcnJvcl0gaGFuZGxlcgogKiBtYWtlcyB0aGUgY2FsbCB0byBgcnVuWm9uZWAgdGhyb3cgdGhhdCBlcnJvciwKICogYW5kIG90aGVyd2lzZSB0aGUgY2FsbCB0byBgcnVuWm9uZWRgIHJldHVybnMgYG51bGxgLgogKgogKiBJZiB0aGUgem9uZSBzcGVjaWZpY2F0aW9uIGhhcyBhIGBoYW5kbGVVbmNhdWdodEVycm9yYCB2YWx1ZSBvciB0aGUgW29uRXJyb3JdCiAqIHBhcmFtZXRlciBpcyBwcm92aWRlZCwgdGhlIHpvbmUgYmVjb21lcyBhbiBlcnJvci16b25lLgogKgogKiBFcnJvcnMgd2lsbCBuZXZlciBjcm9zcyBlcnJvci16b25lIGJvdW5kYXJpZXMgYnkgdGhlbXNlbHZlcy4KICogRXJyb3JzIHRoYXQgdHJ5IHRvIGNyb3NzIGVycm9yLXpvbmUgYm91bmRhcmllcyBhcmUgY29uc2lkZXJlZCB1bmNhdWdodCBpbgogKiB0aGVpciBvcmlnaW5hdGluZyBlcnJvciB6b25lLgogKgogKiAgICAgdmFyIGZ1dHVyZSA9IG5ldyBGdXR1cmUudmFsdWUoNDk5KTsKICogICAgIHJ1blpvbmVkKCgpIHsKICogICAgICAgdmFyIGZ1dHVyZTIgPSBmdXR1cmUudGhlbigoXykgeyB0aHJvdyAiZXJyb3IgaW4gZmlyc3QgZXJyb3Item9uZSI7IH0pOwogKiAgICAgICBydW5ab25lZCgoKSB7CiAqICAgICAgICAgdmFyIGZ1dHVyZTMgPSBmdXR1cmUyLmNhdGNoRXJyb3IoKGUpIHsgcHJpbnQoIk5ldmVyIHJlYWNoZWQhIik7IH0pOwogKiAgICAgICB9LCBvbkVycm9yOiAoZSkgeyBwcmludCgidW51c2VkIGVycm9yIGhhbmRsZXIiKTsgfSk7CiAqICAgICB9LCBvbkVycm9yOiAoZSkgeyBwcmludCgiY2F0Y2hlcyBlcnJvciBvZiBmaXJzdCBlcnJvci16b25lLiIpOyB9KTsKICoKICogRXhhbXBsZToKICoKICogICAgIHJ1blpvbmVkKCgpIHsKICogICAgICAgbmV3IEZ1dHVyZSgoKSB7IHRocm93ICJhc3luY2hyb25vdXMgZXJyb3IiOyB9KTsKICogICAgIH0sIG9uRXJyb3I6IHByaW50KTsgIC8vIFdpbGwgcHJpbnQgImFzeW5jaHJvbm91cyBlcnJvciIuCiAqCiAqIEl0IGlzIHBvc3NpYmxlIHRvIG1hbnVhbGx5IHBhc3MgYW4gZXJyb3IgZnJvbSBvbmUgZXJyb3Igem9uZSB0byBhbm90aGVyCiAqIGJ5IHJlLXRocm93aW5nIGl0IGluIHRoZSBuZXcgem9uZS4gSWYgW29uRXJyb3JdIHRocm93cywgdGhhdCBlcnJvciB3aWxsCiAqIG9jY3VyIGluIHRoZSBvcmlnaW5hbCB6b25lIHdoZXJlIFtydW5ab25lZF0gd2FzIGNhbGxlZC4KICovClIgcnVuWm9uZWQ8Uj4oUiBib2R5KCksCiAgICB7TWFwIHpvbmVWYWx1ZXMsIFpvbmVTcGVjaWZpY2F0aW9uIHpvbmVTcGVjaWZpY2F0aW9uLCBGdW5jdGlvbiBvbkVycm9yfSkgewogIGlmIChvbkVycm9yID09IG51bGwpIHsKICAgIHJldHVybiBfcnVuWm9uZWQ8Uj4oYm9keSwgem9uZVZhbHVlcywgem9uZVNwZWNpZmljYXRpb24pOwogIH0KICB2b2lkIEZ1bmN0aW9uKE9iamVjdCkgdW5hcnlPbkVycm9yOwogIHZvaWQgRnVuY3Rpb24oT2JqZWN0LCBTdGFja1RyYWNlKSBiaW5hcnlPbkVycm9yOwogIGlmIChvbkVycm9yIGlzIHZvaWQgRnVuY3Rpb24oT2JqZWN0LCBTdGFja1RyYWNlKSkgewogICAgYmluYXJ5T25FcnJvciA9IG9uRXJyb3I7CiAgfSBlbHNlIGlmIChvbkVycm9yIGlzIHZvaWQgRnVuY3Rpb24oT2JqZWN0KSkgewogICAgdW5hcnlPbkVycm9yID0gb25FcnJvcjsKICB9IGVsc2UgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIm9uRXJyb3IgY2FsbGJhY2sgbXVzdCB0YWtlIGVpdGhlciBhbiBPYmplY3QgIgogICAgICAgICIodGhlIGVycm9yKSwgb3IgYm90aCBhbiBPYmplY3QgKHRoZSBlcnJvcikgYW5kIGEgU3RhY2tUcmFjZS4iKTsKICB9CiAgSGFuZGxlVW5jYXVnaHRFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyID0gKFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwKICAgICAgWm9uZSB6b25lLCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICB0cnkgewogICAgICBpZiAoYmluYXJ5T25FcnJvciAhPSBudWxsKSB7CiAgICAgICAgc2VsZi5wYXJlbnQucnVuQmluYXJ5KGJpbmFyeU9uRXJyb3IsIGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQodW5hcnlPbkVycm9yICE9IG51bGwpOwogICAgICAgIHNlbGYucGFyZW50LnJ1blVuYXJ5KHVuYXJ5T25FcnJvciwgZXJyb3IpOwogICAgICB9CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIGlmIChpZGVudGljYWwoZSwgZXJyb3IpKSB7CiAgICAgICAgcGFyZW50LmhhbmRsZVVuY2F1Z2h0RXJyb3Ioem9uZSwgZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICB9IGVsc2UgewogICAgICAgIHBhcmVudC5oYW5kbGVVbmNhdWdodEVycm9yKHpvbmUsIGUsIHMpOwogICAgICB9CiAgICB9CiAgfTsKICBpZiAoem9uZVNwZWNpZmljYXRpb24gPT0gbnVsbCkgewogICAgem9uZVNwZWNpZmljYXRpb24gPQogICAgICAgIG5ldyBab25lU3BlY2lmaWNhdGlvbihoYW5kbGVVbmNhdWdodEVycm9yOiBlcnJvckhhbmRsZXIpOwogIH0gZWxzZSB7CiAgICB6b25lU3BlY2lmaWNhdGlvbiA9IG5ldyBab25lU3BlY2lmaWNhdGlvbi5mcm9tKHpvbmVTcGVjaWZpY2F0aW9uLAogICAgICAgIGhhbmRsZVVuY2F1Z2h0RXJyb3I6IGVycm9ySGFuZGxlcik7CiAgfQogIHRyeSB7CiAgICByZXR1cm4gX3J1blpvbmVkPFI+KGJvZHksIHpvbmVWYWx1ZXMsIHpvbmVTcGVjaWZpY2F0aW9uKTsKICB9IGNhdGNoIChlLCBzdGFja1RyYWNlKSB7CiAgICBpZiAoYmluYXJ5T25FcnJvciAhPSBudWxsKSB7CiAgICAgIGJpbmFyeU9uRXJyb3IoZSwgc3RhY2tUcmFjZSk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQodW5hcnlPbkVycm9yICE9IG51bGwpOwogICAgICB1bmFyeU9uRXJyb3IoZSk7CiAgICB9CiAgfQogIHJldHVybiBudWxsOwp9CgovLy8gUnVucyBbYm9keV0gaW4gYSBuZXcgem9uZSBiYXNlZCBvbiBbem9uZVZhbHVlc10gYW5kIFtzcGVjaWZpY2F0aW9uXS4KUiBfcnVuWm9uZWQ8Uj4oUiBib2R5KCksIE1hcCB6b25lVmFsdWVzLCBab25lU3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uKSA9PgogICAgWm9uZS5jdXJyZW50CiAgICAgICAgLmZvcmsoc3BlY2lmaWNhdGlvbjogc3BlY2lmaWNhdGlvbiwgem9uZVZhbHVlczogem9uZVZhbHVlcykKICAgICAgICAucnVuPFI+KGJvZHkpOwqF7gBOTjwBFAEdKjsBPkokQCxMUUI/QE9FJkNJSDUnOiJNSTYbPUQ2AUgkFh8BKwEhAgEqFBQxAgEEPANKSCcDTCcDQS1JFANPTRkEIwY5BiM3FiAiMDo8KjImNhovAQZQGgY6NxYg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aXJzdCBwYXRjaCBpbiAiZGFydDphc3luYyIgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBpbXBvcnRzIHVzZWQKLy8vIGJ5IHBhdGNoZXMgb2YgdGhhdCBsaWJyYXJ5LiBXZSBwbGFuIHRvIGNoYW5nZSB0aGlzIHdoZW4gd2UgaGF2ZSBhIHNoYXJlZAovLy8gZnJvbnQgZW5kIGFuZCBzaW1wbHkgdXNlIHBhcnRzLgoKaW1wb3J0ICJkYXJ0Ol9pbnRlcm5hbCIgc2hvdyBWTUxpYnJhcnlIb29rcywgcGF0Y2g7CgovLy8gVGhlc2UgYXJlIHRoZSBhZGRpdGlvbmFsIHBhcnRzIG9mIHRoaXMgcGF0Y2ggbGlicmFyeToKLy8gcGFydCAiZGVmZXJyZWRfbG9hZF9wYXRjaC5kYXJ0IjsKLy8gcGFydCAic2NoZWR1bGVfbWljcm90YXNrX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJ0aW1lcl9wYXRjaC5kYXJ0IjsKCi8vIEVxdWl2YWxlbnQgb2YgY2FsbGluZyBGQVRBTCBmcm9tIEMrKyBjb2RlLgpfZmF0YWwobXNnKSBuYXRpdmUgIkRhcnRBc3luY19mYXRhbCI7CgpjbGFzcyBfQXN5bmNBd2FpdENvbXBsZXRlcjxUPiBpbXBsZW1lbnRzIENvbXBsZXRlcjxUPiB7CiAgZmluYWwgX2NvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXI8VD4uc3luYygpOwogIGJvb2wgaXNTeW5jOwoKICBfQXN5bmNBd2FpdENvbXBsZXRlcigpIDogaXNTeW5jID0gZmFsc2U7CgogIHZvaWQgY29tcGxldGUoW0Z1dHVyZU9yPFQ+IHZhbHVlXSkgewogICAgaWYgKGlzU3luYykgewogICAgICBfY29tcGxldGVyLmNvbXBsZXRlKHZhbHVlKTsKICAgIH0gZWxzZSBpZiAodmFsdWUgaXMgRnV0dXJlPFQ+KSB7CiAgICAgIHZhbHVlLnRoZW4oX2NvbXBsZXRlci5jb21wbGV0ZSwgb25FcnJvcjogX2NvbXBsZXRlci5jb21wbGV0ZUVycm9yKTsKICAgIH0gZWxzZSB7CiAgICAgIHNjaGVkdWxlTWljcm90YXNrKCgpIHsKICAgICAgICBfY29tcGxldGVyLmNvbXBsZXRlKHZhbHVlKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICB2b2lkIGNvbXBsZXRlRXJyb3IoZSwgW3N0XSkgewogICAgaWYgKGlzU3luYykgewogICAgICBfY29tcGxldGVyLmNvbXBsZXRlRXJyb3IoZSwgc3QpOwogICAgfSBlbHNlIHsKICAgICAgc2NoZWR1bGVNaWNyb3Rhc2soKCkgewogICAgICAgIF9jb21wbGV0ZXIuY29tcGxldGVFcnJvcihlLCBzdCk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgdm9pZCBzdGFydChmKSB7CiAgICBmKCk7CiAgICBpc1N5bmMgPSB0cnVlOwogIH0KCiAgRnV0dXJlPFQ+IGdldCBmdXR1cmUgPT4gX2NvbXBsZXRlci5mdXR1cmU7CiAgYm9vbCBnZXQgaXNDb21wbGV0ZWQgPT4gX2NvbXBsZXRlci5pc0NvbXBsZXRlZDsKfQoKLy8gV2UgbmVlZCB0byBwYXNzIHRoZSB2YWx1ZSBhcyBmaXJzdCBhcmd1bWVudCBhbmQgbGVhdmUgdGhlIHNlY29uZCBhbmQgdGhpcmQKLy8gYXJndW1lbnRzIGVtcHR5ICh1c2VkIGZvciBlcnJvciBoYW5kbGluZykuCi8vIFNlZSB2bS9hc3RfdHJhbnNmb3JtZXIuY2MgZm9yIHVzYWdlLgpGdW5jdGlvbiBfYXN5bmNUaGVuV3JhcHBlckhlbHBlcihjb250aW51YXRpb24pIHsKICAvLyBBbnkgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIGFzIGFuIGFzeW5jaHJvbm91cyBjYWxsYmFjayBtdXN0IGJlIHJlZ2lzdGVyZWQKICAvLyBpbiB0aGUgY3VycmVudCBab25lLiBOb3JtYWxseSwgdGhpcyBpcyBkb25lIGJ5IHRoZSBmdXR1cmUgd2hlbiBhCiAgLy8gY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZCAoZm9yIGV4YW1wbGUgd2l0aCBgLnRoZW5gIG9yIGAuY2F0Y2hFcnJvcmApLiBJbiBvdXIKICAvLyBjYXNlIHdlIHdhbnQgdG8gcmV1c2UgdGhlIHNhbWUgY2FsbGJhY2sgbXVsdGlwbGUgdGltZXMgYW5kIHRoZXJlZm9yZSBhdm9pZAogIC8vIHRoZSBtdWx0aXBsZSByZWdpc3RyYXRpb25zLiBGb3Igb3VyIGludGVybmFsIGZ1dHVyZXMgKGBfRnV0dXJlYCkgd2UgY2FuCiAgLy8gdXNlIHRoZSBzaG9ydGN1dC12ZXJzaW9uIG9mIGAudGhlbmAsIGFuZCBza2lwIHRoZSByZWdpc3RyYXRpb24uIEhvd2V2ZXIsCiAgLy8gdGhhdCBtZWFucyB0aGF0IHRoZSBjb250aW51YXRpb24gbXVzdCBiZSByZWdpc3RlcmVkIGJ5IHVzLgogIC8vCiAgLy8gRnVydGhlcm1vcmUsIHdlIGtub3cgdGhhdCB0aGUgcm9vdC16b25lIGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgYW5kCiAgLy8gd2UgY2FuIHRoZXJlZm9yZSBza2lwIHRoZSByZWdpc3RyYXRpb24gY2FsbCBmb3IgaXQuCiAgLy8KICAvLyBOb3RlLCB0aGF0IHRoZSBjb250aW51YXRpb24gYWNjZXB0cyB1cCB0byB0aHJlZSBhcmd1bWVudHMuIElmIHRoZSBjdXJyZW50CiAgLy8gem9uZSBpcyB0aGUgcm9vdCB6b25lLCB3ZSBkb24ndCB3cmFwIHRoZSBjb250aW51YXRpb24sIGFuZCBhIGJhZAogIC8vIGBGdXR1cmVgIGltcGxlbWVudGF0aW9uIGNvdWxkIHBvdGVudGlhbGx5IGludm9rZSB0aGUgY2FsbGJhY2sgd2l0aCB0aGUKICAvLyB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzLgogIGlmIChab25lLmN1cnJlbnQgPT0gWm9uZS5yb290KSByZXR1cm4gY29udGludWF0aW9uOwogIHJldHVybiBab25lLmN1cnJlbnQucmVnaXN0ZXJVbmFyeUNhbGxiYWNrKCh4KSA9PiBjb250aW51YXRpb24oeCwgbnVsbCwgbnVsbCkpOwp9CgovLyBXZSBuZWVkIHRvIHBhc3MgdGhlIGV4Y2VwdGlvbiBhbmQgc3RhY2sgdHJhY2Ugb2JqZWN0cyBhcyBzZWNvbmQgYW5kIHRoaXJkCi8vIHBhcmFtZXRlciB0byB0aGUgY29udGludWF0aW9uLiAgU2VlIHZtL2FzdF90cmFuc2Zvcm1lci5jYyBmb3IgdXNhZ2UuCkZ1bmN0aW9uIF9hc3luY0Vycm9yV3JhcHBlckhlbHBlcihjb250aW51YXRpb24pIHsKICAvLyBTZWUgY29tbWVudHMgb2YgYF9hc3luY1RoZW5XcmFwcGVySGVscGVyYC4KICB2YXIgZXJyb3JDYWxsYmFjayA9IChlLCBzKSA9PiBjb250aW51YXRpb24obnVsbCwgZSwgcyk7CiAgaWYgKFpvbmUuY3VycmVudCA9PSBab25lLnJvb3QpIHJldHVybiBlcnJvckNhbGxiYWNrOwogIHJldHVybiBab25lLmN1cnJlbnQucmVnaXN0ZXJCaW5hcnlDYWxsYmFjayhlcnJvckNhbGxiYWNrKTsKfQoKLy8vIFJlZ2lzdGVycyB0aGUgW3RoZW5DYWxsYmFja10gYW5kIFtlcnJvckNhbGxiYWNrXSBvbiB0aGUgZ2l2ZW4gW29iamVjdF0uCi8vLwovLy8gSWYgW29iamVjdF0gaXMgbm90IGEgZnV0dXJlLCB0aGVuIGl0IGlzIHdyYXBwZWQgaW50byBvbmUuCi8vLwovLy8gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJlZ2lzdGVyaW5nIHdpdGggYC50aGVuYC4KRnV0dXJlIF9hd2FpdEhlbHBlcigKICAgIHZhciBvYmplY3QsIEZ1bmN0aW9uIHRoZW5DYWxsYmFjaywgRnVuY3Rpb24gZXJyb3JDYWxsYmFjaywgdmFyIGF3YWl0ZXIpIHsKICBpZiAob2JqZWN0IGlzISBGdXR1cmUpIHsKICAgIG9iamVjdCA9IG5ldyBfRnV0dXJlKCkuLl9zZXRWYWx1ZShvYmplY3QpOwogIH0gZWxzZSBpZiAob2JqZWN0IGlzISBfRnV0dXJlKSB7CiAgICByZXR1cm4gb2JqZWN0LnRoZW4odGhlbkNhbGxiYWNrLCBvbkVycm9yOiBlcnJvckNhbGxiYWNrKTsKICB9CiAgLy8gYG9iamVjdGAgaXMgYSBgX0Z1dHVyZWAuCiAgLy8KICAvLyBTaW5jZSB0aGUgY2FsbGJhY2tzIGhhdmUgYmVlbiByZWdpc3RlcmVkIGluIHRoZSBjdXJyZW50IHpvbmUgKHNlZQogIC8vIFtfYXN5bmNUaGVuV3JhcHBlckhlbHBlcl0gYW5kIFtfYXN5bmNFcnJvcldyYXBwZXJIZWxwZXJdKSwgd2UgY2FuIGF2b2lkCiAgLy8gYW5vdGhlciByZWdpc3RyYXRpb24gYW5kIGRpcmVjdGx5IGludm9rZSB0aGUgbm8tem9uZS1yZWdpc3RyYXRpb24gYC50aGVuYC4KICAvLwogIC8vIFdlIGNhbiBvbmx5IGRvIHRoaXMgZm9yIG91ciBpbnRlcm5hbCBmdXR1cmVzICh0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZgogIC8vIGFsbCBmdXR1cmVzIHRoYXQgYXJlIGNvbnN0cnVjdGVkIGJ5IHRoZSBgZGFydDphc3luY2AgbGlicmFyeSkuCiAgb2JqZWN0Ll9hd2FpdGVyID0gYXdhaXRlcjsKICByZXR1cm4gb2JqZWN0Ll90aGVuTm9ab25lUmVnaXN0cmF0aW9uKHRoZW5DYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7Cn0KCi8vIENhbGxlZCBhcyBwYXJ0IG9mIHRoZSAnYXdhaXQgZm9yICguLi4pJyBjb25zdHJ1Y3QuIFJlZ2lzdGVycyB0aGUKLy8gYXdhaXRlciBvbiB0aGUgc3RyZWFtLgp2b2lkIF9hc3luY1N0YXJMaXN0ZW5IZWxwZXIodmFyIG9iamVjdCwgdmFyIGF3YWl0ZXIpIHsKICBpZiAob2JqZWN0IGlzISBfU3RyZWFtSW1wbCkgewogICAgcmV0dXJuOwogIH0KICAvLyBgb2JqZWN0YCBpcyBhIGBfU3RyZWFtSW1wbGAuCiAgb2JqZWN0Ll9hd2FpdGVyID0gYXdhaXRlcjsKfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCnZvaWQgX2FzeW5jU3Rhck1vdmVOZXh0SGVscGVyKHZhciBzdHJlYW0pIHsKICBpZiAoc3RyZWFtIGlzISBfU3RyZWFtSW1wbCkgewogICAgcmV0dXJuOwogIH0KICAvLyBzdHJlYW0gaXMgYSBfU3RyZWFtSW1wbC4KICBpZiAoc3RyZWFtLl9nZW5lcmF0b3IgPT0gbnVsbCkgewogICAgLy8gTm8gZ2VuZXJhdG9yIHJlZ2lzdGVyZWQsIHRoaXMgaXNuJ3QgYW4gYXN5bmMqIFN0cmVhbS4KICAgIHJldHVybjsKICB9CiAgX21vdmVOZXh0RGVidWdnZXJTdGVwQ2hlY2soc3RyZWFtLl9nZW5lcmF0b3IpOwp9CgovLyBfQXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlciBpcyB1c2VkIGJ5IHRoZSBjb21waWxlciB0byBpbXBsZW1lbnQKLy8gYXN5bmMqIGdlbmVyYXRvciBmdW5jdGlvbnMuCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0FzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXI8VD4gewogIFN0cmVhbUNvbnRyb2xsZXI8VD4gY29udHJvbGxlcjsKICBGdW5jdGlvbiBhc3luY1N0YXJCb2R5OwogIGJvb2wgaXNBZGRpbmcgPSBmYWxzZTsKICBib29sIG9uTGlzdGVuUmVjZWl2ZWQgPSBmYWxzZTsKICBib29sIGlzU2NoZWR1bGVkID0gZmFsc2U7CiAgYm9vbCBpc1N1c3BlbmRlZEF0WWllbGQgPSBmYWxzZTsKICBDb21wbGV0ZXIgY2FuY2VsbGF0aW9uQ29tcGxldGVyID0gbnVsbDsKCiAgU3RyZWFtPFQ+IGdldCBzdHJlYW0gewogICAgZmluYWwgU3RyZWFtPFQ+IGxvY2FsID0gY29udHJvbGxlci5zdHJlYW07CiAgICBpZiAobG9jYWwgaXMgX1N0cmVhbUltcGw8VD4pIHsKICAgICAgbG9jYWwuX2dlbmVyYXRvciA9IGFzeW5jU3RhckJvZHk7CiAgICB9CiAgICByZXR1cm4gbG9jYWw7CiAgfQoKICB2b2lkIHJ1bkJvZHkoKSB7CiAgICBpc1NjaGVkdWxlZCA9IGZhbHNlOwogICAgaXNTdXNwZW5kZWRBdFlpZWxkID0gZmFsc2U7CiAgICBhc3luY1N0YXJCb2R5KCk7CiAgfQoKICB2b2lkIHNjaGVkdWxlR2VuZXJhdG9yKCkgewogICAgaWYgKGlzU2NoZWR1bGVkIHx8IGNvbnRyb2xsZXIuaXNQYXVzZWQgfHwgaXNBZGRpbmcpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaXNTY2hlZHVsZWQgPSB0cnVlOwogICAgc2NoZWR1bGVNaWNyb3Rhc2socnVuQm9keSk7CiAgfQoKICAvLyBBZGRzIGVsZW1lbnQgdG8gc3RyZWFtLCByZXR1cm5zIHRydWUgaWYgdGhlIGNhbGxlciBzaG91bGQgdGVybWluYXRlCiAgLy8gZXhlY3V0aW9uIG9mIHRoZSBnZW5lcmF0b3IuCiAgLy8KICAvLyBUT0RPKGhhdXNuZXIpOiBQZXIgc3BlYywgdGhlIGdlbmVyYXRvciBzaG91bGQgYmUgc3VzcGVuZGVkIGJlZm9yZQogIC8vIGV4aXRpbmcgd2hlbiB0aGUgc3RyZWFtIGlzIGNsb3NlZC4gV2UgY291bGQgYWRkIGEgZ2V0dGVyIGxpa2UgdGhpczoKICAvLyBnZXQgaXNDYW5jZWxsZWQgPT4gY29udHJvbGxlci5oYXNMaXN0ZW5lcjsKICAvLyBUaGUgZ2VuZXJhdG9yIHdvdWxkIHRyYW5zbGF0ZSBhICd5aWVsZCBlJyBzdGF0ZW1lbnQgdG8KICAvLyBjb250cm9sbGVyLmFkZChlKTsKICAvLyBzdXNwZW5kOwogIC8vIGlmIChjb250cm9sbGVyLmlzQ2FuY2VsbGVkKSByZXR1cm47CiAgYm9vbCBhZGQoVCBldmVudCkgewogICAgaWYgKCFvbkxpc3RlblJlY2VpdmVkKSBfZmF0YWwoInlpZWxkIGJlZm9yZSBzdHJlYW0gaXMgbGlzdGVuZWQgdG8iKTsKICAgIGlmIChpc1N1c3BlbmRlZEF0WWllbGQpIF9mYXRhbCgidW5leHBlY3RlZCB5aWVsZCIpOwogICAgLy8gSWYgc3RyZWFtIGlzIGNhbmNlbGxlZCwgdGVsbCBjYWxsZXIgdG8gZXhpdCB0aGUgYXN5bmMgZ2VuZXJhdG9yLgogICAgaWYgKCFjb250cm9sbGVyLmhhc0xpc3RlbmVyKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgY29udHJvbGxlci5hZGQoZXZlbnQpOwogICAgc2NoZWR1bGVHZW5lcmF0b3IoKTsKICAgIGlzU3VzcGVuZGVkQXRZaWVsZCA9IHRydWU7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLyBBZGRzIHRoZSBlbGVtZW50cyBvZiBzdHJlYW0gaW50byB0aGlzIGNvbnRyb2xsZXIncyBzdHJlYW0uCiAgLy8gVGhlIGdlbmVyYXRvciB3aWxsIGJlIHNjaGVkdWxlZCBhZ2FpbiB3aGVuIGFsbCBvZiB0aGUKICAvLyBlbGVtZW50cyBvZiB0aGUgYWRkZWQgc3RyZWFtIGhhdmUgYmVlbiBjb25zdW1lZC4KICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNhbGxlciBzaG91bGQgdGVybWluYXRlCiAgLy8gZXhlY3V0aW9uIG9mIHRoZSBnZW5lcmF0b3IuCiAgYm9vbCBhZGRTdHJlYW0oU3RyZWFtPFQ+IHN0cmVhbSkgewogICAgaWYgKCFvbkxpc3RlblJlY2VpdmVkKSBfZmF0YWwoInlpZWxkIGJlZm9yZSBzdHJlYW0gaXMgbGlzdGVuZWQgdG8iKTsKICAgIC8vIElmIHN0cmVhbSBpcyBjYW5jZWxsZWQsIHRlbGwgY2FsbGVyIHRvIGV4aXQgdGhlIGFzeW5jIGdlbmVyYXRvci4KICAgIGlmICghY29udHJvbGxlci5oYXNMaXN0ZW5lcikgcmV0dXJuIHRydWU7CiAgICBpc0FkZGluZyA9IHRydWU7CiAgICB2YXIgd2hlbkRvbmVBZGRpbmcgPSBjb250cm9sbGVyLmFkZFN0cmVhbShzdHJlYW0sIGNhbmNlbE9uRXJyb3I6IGZhbHNlKTsKICAgIHdoZW5Eb25lQWRkaW5nLnRoZW4oKF8pIHsKICAgICAgaXNBZGRpbmcgPSBmYWxzZTsKICAgICAgc2NoZWR1bGVHZW5lcmF0b3IoKTsKICAgICAgaWYgKCFpc1NjaGVkdWxlZCkgaXNTdXNwZW5kZWRBdFlpZWxkID0gdHJ1ZTsKICAgIH0pOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgdm9pZCBhZGRFcnJvcihPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgaWYgKChjYW5jZWxsYXRpb25Db21wbGV0ZXIgIT0gbnVsbCkgJiYgIWNhbmNlbGxhdGlvbkNvbXBsZXRlci5pc0NvbXBsZXRlZCkgewogICAgICAvLyBJZiB0aGUgc3RyZWFtIGhhcyBiZWVuIGNhbmNlbGxlZCwgY29tcGxldGUgdGhlIGNhbmNlbGxhdGlvbiBmdXR1cmUKICAgICAgLy8gd2l0aCB0aGUgZXJyb3IuCiAgICAgIGNhbmNlbGxhdGlvbkNvbXBsZXRlci5jb21wbGV0ZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gSWYgc3RyZWFtIGlzIGNhbmNlbGxlZCwgdGVsbCBjYWxsZXIgdG8gZXhpdCB0aGUgYXN5bmMgZ2VuZXJhdG9yLgogICAgaWYgKCFjb250cm9sbGVyLmhhc0xpc3RlbmVyKSByZXR1cm47CiAgICBjb250cm9sbGVyLmFkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgIC8vIE5vIG5lZWQgdG8gc2NoZWR1bGUgdGhlIGdlbmVyYXRvciBib2R5IGhlcmUuIFRoaXMgY29kZSBpcyBvbmx5CiAgICAvLyBjYWxsZWQgZnJvbSB0aGUgY2F0Y2ggY2xhdXNlIG9mIHRoZSBpbXBsaWNpdCB0cnktY2F0Y2gtZmluYWxseQogICAgLy8gYXJvdW5kIHRoZSBnZW5lcmF0b3IgYm9keS4gVGhhdCBpcywgd2UgYXJlIG9uIHRoZSBlcnJvciBwYXRoIG91dAogICAgLy8gb2YgdGhlIGdlbmVyYXRvciBhbmQgZG8gbm90IG5lZWQgdG8gcnVuIHRoZSBnZW5lcmF0b3IgYWdhaW4uCiAgfQoKICBjbG9zZSgpIHsKICAgIGlmICgoY2FuY2VsbGF0aW9uQ29tcGxldGVyICE9IG51bGwpICYmICFjYW5jZWxsYXRpb25Db21wbGV0ZXIuaXNDb21wbGV0ZWQpIHsKICAgICAgLy8gSWYgdGhlIHN0cmVhbSBoYXMgYmVlbiBjYW5jZWxsZWQsIGNvbXBsZXRlIHRoZSBjYW5jZWxsYXRpb24gZnV0dXJlCiAgICAgIC8vIHdpdGggdGhlIGVycm9yLgogICAgICBjYW5jZWxsYXRpb25Db21wbGV0ZXIuY29tcGxldGUoKTsKICAgIH0KICAgIGNvbnRyb2xsZXIuY2xvc2UoKTsKICB9CgogIF9Bc3luY1N0YXJTdHJlYW1Db250cm9sbGVyKHRoaXMuYXN5bmNTdGFyQm9keSkgewogICAgY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyKAogICAgICAgIG9uTGlzdGVuOiB0aGlzLm9uTGlzdGVuLAogICAgICAgIG9uUmVzdW1lOiB0aGlzLm9uUmVzdW1lLAogICAgICAgIG9uQ2FuY2VsOiB0aGlzLm9uQ2FuY2VsKTsKICB9CgogIG9uTGlzdGVuKCkgewogICAgYXNzZXJ0KCFvbkxpc3RlblJlY2VpdmVkKTsKICAgIG9uTGlzdGVuUmVjZWl2ZWQgPSB0cnVlOwogICAgc2NoZWR1bGVHZW5lcmF0b3IoKTsKICB9CgogIG9uUmVzdW1lKCkgewogICAgaWYgKGlzU3VzcGVuZGVkQXRZaWVsZCkgewogICAgICBzY2hlZHVsZUdlbmVyYXRvcigpOwogICAgfQogIH0KCiAgb25DYW5jZWwoKSB7CiAgICBpZiAoY29udHJvbGxlci5pc0Nsb3NlZCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChjYW5jZWxsYXRpb25Db21wbGV0ZXIgPT0gbnVsbCkgewogICAgICBjYW5jZWxsYXRpb25Db21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyKCk7CiAgICAgIC8vIE9ubHkgcmVzdW1lIHRoZSBnZW5lcmF0b3IgaWYgaXQgaXMgc3VzcGVuZGVkIGF0IGEgeWllbGQuCiAgICAgIC8vIENhbmNlbGxhdGlvbiBkb2VzIG5vdCBhZmZlY3QgYW4gYXN5bmMgZ2VuZXJhdG9yIHRoYXQgaXMKICAgICAgLy8gc3VzcGVuZGVkIGF0IGFuIGF3YWl0LgogICAgICBpZiAoaXNTdXNwZW5kZWRBdFlpZWxkKSB7CiAgICAgICAgc2NoZWR1bGVHZW5lcmF0b3IoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNhbmNlbGxhdGlvbkNvbXBsZXRlci5mdXR1cmU7CiAgfQp9CgpAcGF0Y2gKdm9pZCBfcmV0aHJvdyhPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgbmF0aXZlICJBc3luY19yZXRocm93IjsKCkBwYXRjaApjbGFzcyBfRnV0dXJlPFQ+IHsKICAvLy8gVGhlIGNsb3N1cmUgaW1wbGVtZW50aW5nIHRoZSBhc3luY1sqXS1ib2R5IHRoYXQgaXMgYGF3YWl0YGluZyB0aGlzIGZ1dHVyZS4KICBGdW5jdGlvbiBfYXdhaXRlcjsKfQoKQHBhdGNoCmNsYXNzIF9TdHJlYW1JbXBsPFQ+IHsKICAvLy8gVGhlIGNsb3N1cmUgaW1wbGVtZW50aW5nIHRoZSBhc3luY1sqXS1ib2R5IHRoYXQgaXMgYGF3YWl0YGluZyB0aGlzIGZ1dHVyZS4KICBGdW5jdGlvbiBfYXdhaXRlcjsKCiAgLy8vIFRoZSBjbG9zdXJlIGltcGxlbWVudGluZyB0aGUgYXN5bmMtZ2VuZXJhdG9yIGJvZHkgdGhhdCBpcyBjcmVhdGluZyBldmVudHMKICAvLy8gZm9yIHRoaXMgc3RyZWFtLgogIEZ1bmN0aW9uIF9nZW5lcmF0b3I7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQp2b2lkIF9jb21wbGV0ZU9uQXN5bmNSZXR1cm4oQ29tcGxldGVyIGNvbXBsZXRlciwgT2JqZWN0IHZhbHVlKSB7CiAgY29tcGxldGVyLmNvbXBsZXRlKHZhbHVlKTsKfQoKLy8vIFJldHVybnMgYSBbU3RhY2tUcmFjZV0gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN5bmNocm9ub3VzIHByZWZpeCBmb3IgdGhpcwovLy8gYXN5bmNocm9ub3VzIG1ldGhvZC4KT2JqZWN0IF9hc3luY1N0YWNrVHJhY2VIZWxwZXIoRnVuY3Rpb24gYXN5bmNfb3ApCiAgICBuYXRpdmUgIlN0YWNrVHJhY2VfYXN5bmNTdGFja1RyYWNlSGVscGVyIjsKCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQp2b2lkIF9jbGVhckFzeW5jVGhyZWFkU3RhY2tUcmFjZSgpCiAgICBuYXRpdmUgIlN0YWNrVHJhY2VfY2xlYXJBc3luY1RocmVhZFN0YWNrVHJhY2UiOwoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCnZvaWQgX3NldEFzeW5jVGhyZWFkU3RhY2tUcmFjZShTdGFja1RyYWNlIHN0YWNrVHJhY2UpCiAgICBuYXRpdmUgIlN0YWNrVHJhY2Vfc2V0QXN5bmNUaHJlYWRTdGFja1RyYWNlIjsKCnZvaWQgX21vdmVOZXh0RGVidWdnZXJTdGVwQ2hlY2soRnVuY3Rpb24gYXN5bmNfb3ApCiAgICBuYXRpdmUgIkFzeW5jU3Rhck1vdmVOZXh0X2RlYnVnZ2VyU3RlcENoZWNrIjsKgTkATk48AU1QTSQBNAE6JCkcAS4mATguDwErAScSIiVKDR0kCgYEASASJw0dKQoGBAESCRMEAS0yAgFOLigxTkZQUE1OQAVOOQVPRkwgNlECAU1IMjA6Nz0CAUwEPgQ0FU4bLyM+BB4FR01QBVFEHUYCAUQaNyAMBCIdAgEiLCAMBB4jPQwEMQIBQx8aJiIaGSEcIyoBGS8jKAYSBAETGSAVBAEdOg4GGCAEAUkhBUdJMDwYDikWSThIIxMGGxkfEgQBQDs2MSElSUguFU0eGBszCBIEATdRTBk+DgZIKSxGRkhEBAEMUUwZKAYYBAEzJyEhIgQBDx8dGQQBDx4bBgQBDx8TBikvQkEgIB0IBikEAgEHSwEHE1EVAgEHF1EVAVAXFwIBIkEdAgFNGTEvASIjNAEiNjIBMzIBIWRhcnQ6YXN5bmMtcGF0Y2gvYXN5bmNfcGF0Y2guZGFydD1vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL3NjaGVkdWxlX21pY3JvdGFza19wYXRjaC5kYXJ0g40vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiYXN5bmNfcGF0Y2guZGFydCI7CgpAcGF0Y2gKY2xhc3MgX0FzeW5jUnVuIHsKICBAcGF0Y2gKICBzdGF0aWMgdm9pZCBfc2NoZWR1bGVJbW1lZGlhdGUodm9pZCBjYWxsYmFjaygpKSB7CiAgICBpZiAoX1NjaGVkdWxlSW1tZWRpYXRlLl9jbG9zdXJlID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIk1pY3JvdGFza3MgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKICAgIH0KICAgIF9TY2hlZHVsZUltbWVkaWF0ZS5fY2xvc3VyZShjYWxsYmFjayk7CiAgfQp9Cgp0eXBlZGVmIHZvaWQgX1NjaGVkdWxlSW1tZWRpYXRlQ2xvc3VyZSh2b2lkIGNhbGxiYWNrKCkpOwoKY2xhc3MgX1NjaGVkdWxlSW1tZWRpYXRlIHsKICBzdGF0aWMgX1NjaGVkdWxlSW1tZWRpYXRlQ2xvc3VyZSBfY2xvc3VyZTsKfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCnZvaWQgX3NldFNjaGVkdWxlSW1tZWRpYXRlQ2xvc3VyZShfU2NoZWR1bGVJbW1lZGlhdGVDbG9zdXJlIGNsb3N1cmUpIHsKICBfU2NoZWR1bGVJbW1lZGlhdGUuX2Nsb3N1cmUgPSBjbG9zdXJlOwp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKdm9pZCBfZW5zdXJlU2NoZWR1bGVJbW1lZGlhdGUoKSB7CiAgX0FzeW5jUnVuLl9zY2hlZHVsZUltbWVkaWF0ZShfc3RhcnRNaWNyb3Rhc2tMb29wKTsKfQoiAE5OPAEfAQcSCTQvQgYrBAIBOQEbLQIBIkcpAgEiIjUCAS5kYXJ0OmFzeW5jLXBhdGNoL3NjaGVkdWxlX21pY3JvdGFza19wYXRjaC5kYXJ0MG9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvdGltZXJfcGF0Y2guZGFydIXuLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImFzeW5jX3BhdGNoLmRhcnQiOwoKQHBhdGNoCmNsYXNzIFRpbWVyIHsKICBAcGF0Y2gKICBzdGF0aWMgVGltZXIgX2NyZWF0ZVRpbWVyKER1cmF0aW9uIGR1cmF0aW9uLCB2b2lkIGNhbGxiYWNrKCkpIHsKICAgIC8vIFRPRE8oaXBvc3ZhKTogUmVtb3ZlIF9UaW1lckZhY3RvcnkgYW5kIHVzZSBWTUxpYnJhcnlIb29rcyBleGNsdXNpdmVseS4KICAgIGlmIChfVGltZXJGYWN0b3J5Ll9mYWN0b3J5ID09IG51bGwpIHsKICAgICAgX1RpbWVyRmFjdG9yeS5fZmFjdG9yeSA9IFZNTGlicmFyeUhvb2tzLnRpbWVyRmFjdG9yeTsKICAgIH0KICAgIGlmIChfVGltZXJGYWN0b3J5Ll9mYWN0b3J5ID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlRpbWVyIGludGVyZmFjZSBub3Qgc3VwcG9ydGVkLiIpOwogICAgfQogICAgaW50IG1pbGxpc2Vjb25kcyA9IGR1cmF0aW9uLmluTWlsbGlzZWNvbmRzOwogICAgaWYgKG1pbGxpc2Vjb25kcyA8IDApIG1pbGxpc2Vjb25kcyA9IDA7CiAgICByZXR1cm4gX1RpbWVyRmFjdG9yeS5fZmFjdG9yeShtaWxsaXNlY29uZHMsIChfKSB7CiAgICAgIGNhbGxiYWNrKCk7CiAgICB9LCBmYWxzZSk7CiAgfQoKICBAcGF0Y2gKICBzdGF0aWMgVGltZXIgX2NyZWF0ZVBlcmlvZGljVGltZXIoCiAgICAgIER1cmF0aW9uIGR1cmF0aW9uLCB2b2lkIGNhbGxiYWNrKFRpbWVyIHRpbWVyKSkgewogICAgLy8gVE9ETyhpcG9zdmEpOiBSZW1vdmUgX1RpbWVyRmFjdG9yeSBhbmQgdXNlIFZNTGlicmFyeUhvb2tzIGV4Y2x1c2l2ZWx5LgogICAgX1RpbWVyRmFjdG9yeS5fZmFjdG9yeSA/Pz0gVk1MaWJyYXJ5SG9va3MudGltZXJGYWN0b3J5OwogICAgaWYgKF9UaW1lckZhY3RvcnkuX2ZhY3RvcnkgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVGltZXIgaW50ZXJmYWNlIG5vdCBzdXBwb3J0ZWQuIik7CiAgICB9CiAgICBpbnQgbWlsbGlzZWNvbmRzID0gZHVyYXRpb24uaW5NaWxsaXNlY29uZHM7CiAgICBpZiAobWlsbGlzZWNvbmRzIDwgMCkgbWlsbGlzZWNvbmRzID0gMDsKICAgIHJldHVybiBfVGltZXJGYWN0b3J5Ll9mYWN0b3J5KG1pbGxpc2Vjb25kcywgY2FsbGJhY2ssIHRydWUpOwogIH0KfQoKdHlwZWRlZiBUaW1lciBfVGltZXJGYWN0b3J5Q2xvc3VyZSgKICAgIGludCBtaWxsaXNlY29uZHMsIHZvaWQgY2FsbGJhY2soVGltZXIgdGltZXIpLCBib29sIHJlcGVhdGluZyk7CgpjbGFzcyBfVGltZXJGYWN0b3J5IHsKICBzdGF0aWMgX1RpbWVyRmFjdG9yeUNsb3N1cmUgX2ZhY3Rvcnk7Cn0KLgBOTjwBHwEHDglCTio8BipEBjAsNhIPBAEJJTdOPCpEBjAsQQQCASRDARYoAgEhZGFydDphc3luYy1wYXRjaC90aW1lcl9wYXRjaC5kYXJ0Qm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9hc3luYy9icm9hZGNhc3Rfc3RyZWFtX2NvbnRyb2xsZXIuZGFydLyOLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5hc3luYzsKCmNsYXNzIF9Ccm9hZGNhc3RTdHJlYW08VD4gZXh0ZW5kcyBfQ29udHJvbGxlclN0cmVhbTxUPiB7CiAgX0Jyb2FkY2FzdFN0cmVhbShfU3RyZWFtQ29udHJvbGxlckxpZmVjeWNsZTxUPiBjb250cm9sbGVyKQogICAgICA6IHN1cGVyKGNvbnRyb2xsZXIpOwoKICBib29sIGdldCBpc0Jyb2FkY2FzdCA9PiB0cnVlOwp9CgpjbGFzcyBfQnJvYWRjYXN0U3Vic2NyaXB0aW9uPFQ+IGV4dGVuZHMgX0NvbnRyb2xsZXJTdWJzY3JpcHRpb248VD4gewogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX0VWRU5UX0lEID0gMTsKICBzdGF0aWMgY29uc3QgaW50IF9TVEFURV9GSVJJTkcgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX1JFTU9WRV9BRlRFUl9GSVJJTkcgPSA0OwogIC8vIFRPRE8obHJuKTogVXNlIHRoZSBfc3RhdGUgZmllbGQgb24gX0NvbnRyb2xsZXJTdWJzY3JpcHRpb24gdG8KICAvLyBhbHNvIHN0b3JlIHRoaXMgc3RhdGUuIFJlcXVpcmVzIHRoYXQgdGhlIHN1YnNjcmlwdGlvbiBpbXBsZW1lbnRhdGlvbgogIC8vIGRvZXMgbm90IGFzc3VtZSB0aGF0IGl0J3MgdXNlIG9mIHRoZSBzdGF0ZSBpbnRlZ2VyIGlzIHRoZSBvbmx5IHVzZS4KICBpbnQgX2V2ZW50U3RhdGUgPSAwOyAvLyBJbml0aWFsaXplZCB0byBoZWxwIGRhcnQyanMgdHlwZSBpbmZlcmVuY2UuCgogIF9Ccm9hZGNhc3RTdWJzY3JpcHRpb248VD4gX25leHQ7CiAgX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbjxUPiBfcHJldmlvdXM7CgogIF9Ccm9hZGNhc3RTdWJzY3JpcHRpb24oX1N0cmVhbUNvbnRyb2xsZXJMaWZlY3ljbGU8VD4gY29udHJvbGxlciwKICAgICAgdm9pZCBvbkRhdGEoVCBkYXRhKSwgRnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yKQogICAgICA6IHN1cGVyKGNvbnRyb2xsZXIsIG9uRGF0YSwgb25FcnJvciwgb25Eb25lLCBjYW5jZWxPbkVycm9yKSB7CiAgICBfbmV4dCA9IF9wcmV2aW91cyA9IHRoaXM7CiAgfQoKICBib29sIF9leHBlY3RzRXZlbnQoaW50IGV2ZW50SWQpID0+IChfZXZlbnRTdGF0ZSAmIF9TVEFURV9FVkVOVF9JRCkgPT0gZXZlbnRJZDsKCiAgdm9pZCBfdG9nZ2xlRXZlbnRJZCgpIHsKICAgIF9ldmVudFN0YXRlIF49IF9TVEFURV9FVkVOVF9JRDsKICB9CgogIGJvb2wgZ2V0IF9pc0ZpcmluZyA9PiAoX2V2ZW50U3RhdGUgJiBfU1RBVEVfRklSSU5HKSAhPSAwOwoKICB2b2lkIF9zZXRSZW1vdmVBZnRlckZpcmluZygpIHsKICAgIGFzc2VydChfaXNGaXJpbmcpOwogICAgX2V2ZW50U3RhdGUgfD0gX1NUQVRFX1JFTU9WRV9BRlRFUl9GSVJJTkc7CiAgfQoKICBib29sIGdldCBfcmVtb3ZlQWZ0ZXJGaXJpbmcgPT4KICAgICAgKF9ldmVudFN0YXRlICYgX1NUQVRFX1JFTU9WRV9BRlRFUl9GSVJJTkcpICE9IDA7CgogIC8vIFRoZSBjb250cm9sbGVyLl9yZWNvcmRQYXVzZSBkb2Vzbid0IGRvIGFueXRoaW5nIGZvciBhIGJyb2FkY2FzdCBjb250cm9sbGVyLAogIC8vIHNvIHdlIGRvbid0IGJvdGhlciBjYWxsaW5nIGl0LgogIHZvaWQgX29uUGF1c2UoKSB7fQoKICAvLyBUaGUgY29udHJvbGxlci5fcmVjb3JkUmVzdW1lIGRvZXNuJ3QgZG8gYW55dGhpbmcgZm9yIGEgYnJvYWRjYXN0CiAgLy8gY29udHJvbGxlciwgc28gd2UgZG9uJ3QgYm90aGVyIGNhbGxpbmcgaXQuCiAgdm9pZCBfb25SZXN1bWUoKSB7fQoKICAvLyBfb25DYW5jZWwgaXMgaW5oZXJpdGVkLgp9CgphYnN0cmFjdCBjbGFzcyBfQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlcjxUPgogICAgaW1wbGVtZW50cyBfU3RyZWFtQ29udHJvbGxlckJhc2U8VD4gewogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX0lOSVRJQUwgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX0VWRU5UX0lEID0gMTsKICBzdGF0aWMgY29uc3QgaW50IF9TVEFURV9GSVJJTkcgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX0NMT1NFRCA9IDQ7CiAgc3RhdGljIGNvbnN0IGludCBfU1RBVEVfQUREU1RSRUFNID0gODsKCiAgQ29udHJvbGxlckNhbGxiYWNrIG9uTGlzdGVuOwogIENvbnRyb2xsZXJDYW5jZWxDYWxsYmFjayBvbkNhbmNlbDsKCiAgLy8gU3RhdGUgb2YgdGhlIGNvbnRyb2xsZXIuCiAgaW50IF9zdGF0ZTsKCiAgLy8gRG91YmxlLWxpbmtlZCBsaXN0IG9mIGFjdGl2ZSBsaXN0ZW5lcnMuCiAgX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbjxUPiBfZmlyc3RTdWJzY3JpcHRpb247CiAgX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbjxUPiBfbGFzdFN1YnNjcmlwdGlvbjsKCiAgLy8gRXh0cmEgc3RhdGUgdXNlZCBkdXJpbmcgYW4gW2FkZFN0cmVhbV0gY2FsbC4KICBfQWRkU3RyZWFtU3RhdGU8VD4gX2FkZFN0cmVhbVN0YXRlOwoKICAvKioKICAgKiBGdXR1cmUgcmV0dXJuZWQgYnkgW2Nsb3NlXSBhbmQgW2RvbmVdLgogICAqCiAgICogVGhlIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2hlbmV2ZXIgdGhlIGRvbmUgZXZlbnQgaGFzIGJlZW4gc2VudCB0byBhbGwKICAgKiByZWxldmFudCBsaXN0ZW5lcnMuCiAgICogVGhlIHJlbGV2YW50IGxpc3RlbmVycyBhcmUgdGhlIG9uZXMgdGhhdCB3ZXJlIGxpc3RlbmluZyB3aGVuIFtjbG9zZV0gd2FzCiAgICogY2FsbGVkLiBXaGVuIGFsbCBvZiB0aGVzZSBoYXZlIGJlZW4gY2FuY2VsZWQgKHNlbmRpbmcgdGhlIGRvbmUgZXZlbnQgbWFrZXMKICAgKiB0aGVtIGNhbmNlbCwgYnV0IHRoZXkgY2FuIGFsc28gYmUgY2FuY2VsZWQgYmVmb3JlIHNlbmRpbmcgdGhlIGV2ZW50KSwKICAgKiB0aGlzIGZ1dHVyZSBjb21wbGV0ZXMuCiAgICoKICAgKiBBbnkgYXR0ZW1wdCB0byBsaXN0ZW4gYWZ0ZXIgY2FsbGluZyBbY2xvc2VdIHdpbGwgdGhyb3csIHNvIHRoZXJlIHdvbid0CiAgICogYmUgYW55IGZ1cnRoZXIgbGlzdGVuZXJzLgogICAqLwogIF9GdXR1cmUgX2RvbmVGdXR1cmU7CgogIF9Ccm9hZGNhc3RTdHJlYW1Db250cm9sbGVyKHRoaXMub25MaXN0ZW4sIHRoaXMub25DYW5jZWwpCiAgICAgIDogX3N0YXRlID0gX1NUQVRFX0lOSVRJQUw7CgogIENvbnRyb2xsZXJDYWxsYmFjayBnZXQgb25QYXVzZSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiQnJvYWRjYXN0IHN0cmVhbSBjb250cm9sbGVycyBkbyBub3Qgc3VwcG9ydCBwYXVzZSBjYWxsYmFja3MiKTsKICB9CgogIHZvaWQgc2V0IG9uUGF1c2Uodm9pZCBvblBhdXNlSGFuZGxlcigpKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiQnJvYWRjYXN0IHN0cmVhbSBjb250cm9sbGVycyBkbyBub3Qgc3VwcG9ydCBwYXVzZSBjYWxsYmFja3MiKTsKICB9CgogIENvbnRyb2xsZXJDYWxsYmFjayBnZXQgb25SZXN1bWUgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIkJyb2FkY2FzdCBzdHJlYW0gY29udHJvbGxlcnMgZG8gbm90IHN1cHBvcnQgcGF1c2UgY2FsbGJhY2tzIik7CiAgfQoKICB2b2lkIHNldCBvblJlc3VtZSh2b2lkIG9uUmVzdW1lSGFuZGxlcigpKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiQnJvYWRjYXN0IHN0cmVhbSBjb250cm9sbGVycyBkbyBub3Qgc3VwcG9ydCBwYXVzZSBjYWxsYmFja3MiKTsKICB9CgogIC8vIFN0cmVhbUNvbnRyb2xsZXIgaW50ZXJmYWNlLgoKICBTdHJlYW08VD4gZ2V0IHN0cmVhbSA9PiBuZXcgX0Jyb2FkY2FzdFN0cmVhbTxUPih0aGlzKTsKCiAgU3RyZWFtU2luazxUPiBnZXQgc2luayA9PiBuZXcgX1N0cmVhbVNpbmtXcmFwcGVyPFQ+KHRoaXMpOwoKICBib29sIGdldCBpc0Nsb3NlZCA9PiAoX3N0YXRlICYgX1NUQVRFX0NMT1NFRCkgIT0gMDsKCiAgLyoqCiAgICogQSBicm9hZGNhc3QgY29udHJvbGxlciBpcyBuZXZlciBwYXVzZWQuCiAgICoKICAgKiBFYWNoIHJlY2VpdmluZyBzdHJlYW0gbWF5IGJlIHBhdXNlZCBpbmRpdmlkdWFsbHksIGFuZCB0aGV5IGhhbmRsZSB0aGVpcgogICAqIG93biBidWZmZXJpbmcuCiAgICovCiAgYm9vbCBnZXQgaXNQYXVzZWQgPT4gZmFsc2U7CgogIC8qKiBXaGV0aGVyIHRoZXJlIGFyZSBjdXJyZW50bHkgb25lIG9yIG1vcmUgc3Vic2NyaWJlcnMuICovCiAgYm9vbCBnZXQgaGFzTGlzdGVuZXIgPT4gIV9pc0VtcHR5OwoKICAvKioKICAgKiBUZXN0IHdoZXRoZXIgdGhlIHN0cmVhbSBoYXMgZXhhY3RseSBvbmUgbGlzdGVuZXIuCiAgICoKICAgKiBBc3N1bWVzIHRoYXQgdGhlIHN0cmVhbSBoYXMgYSBsaXN0ZW5lciAobm90IFtfaXNFbXB0eV0pLgogICAqLwogIGJvb2wgZ2V0IF9oYXNPbmVMaXN0ZW5lciB7CiAgICBhc3NlcnQoIV9pc0VtcHR5KTsKICAgIHJldHVybiBpZGVudGljYWwoX2ZpcnN0U3Vic2NyaXB0aW9uLCBfbGFzdFN1YnNjcmlwdGlvbik7CiAgfQoKICAvKiogV2hldGhlciBhbiBldmVudCBpcyBiZWluZyBmaXJlZCAoc2VudCB0byBzb21lLCBidXQgbm90IGFsbCwgbGlzdGVuZXJzKS4gKi8KICBib29sIGdldCBfaXNGaXJpbmcgPT4gKF9zdGF0ZSAmIF9TVEFURV9GSVJJTkcpICE9IDA7CgogIGJvb2wgZ2V0IF9pc0FkZGluZ1N0cmVhbSA9PiAoX3N0YXRlICYgX1NUQVRFX0FERFNUUkVBTSkgIT0gMDsKCiAgYm9vbCBnZXQgX21heUFkZEV2ZW50ID0+IChfc3RhdGUgPCBfU1RBVEVfQ0xPU0VEKTsKCiAgX0Z1dHVyZSBfZW5zdXJlRG9uZUZ1dHVyZSgpIHsKICAgIGlmIChfZG9uZUZ1dHVyZSAhPSBudWxsKSByZXR1cm4gX2RvbmVGdXR1cmU7CiAgICByZXR1cm4gX2RvbmVGdXR1cmUgPSBuZXcgX0Z1dHVyZSgpOwogIH0KCiAgLy8gTGlua2VkIGxpc3QgaGVscGVycwoKICBib29sIGdldCBfaXNFbXB0eSA9PiBfZmlyc3RTdWJzY3JpcHRpb24gPT0gbnVsbDsKCiAgLyoqIEFkZHMgc3Vic2NyaXB0aW9uIHRvIGxpbmtlZCBsaXN0IG9mIGFjdGl2ZSBsaXN0ZW5lcnMuICovCiAgdm9pZCBfYWRkTGlzdGVuZXIoX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24pIHsKICAgIGFzc2VydChpZGVudGljYWwoc3Vic2NyaXB0aW9uLl9uZXh0LCBzdWJzY3JpcHRpb24pKTsKICAgIHN1YnNjcmlwdGlvbi5fZXZlbnRTdGF0ZSA9IChfc3RhdGUgJiBfU1RBVEVfRVZFTlRfSUQpOwogICAgLy8gSW5zZXJ0IGluIGxpbmtlZCBsaXN0IGFzIGxhc3Qgc3Vic2NyaXB0aW9uLgogICAgX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbjxUPiBvbGRMYXN0ID0gX2xhc3RTdWJzY3JpcHRpb247CiAgICBfbGFzdFN1YnNjcmlwdGlvbiA9IHN1YnNjcmlwdGlvbjsKICAgIHN1YnNjcmlwdGlvbi5fbmV4dCA9IG51bGw7CiAgICBzdWJzY3JpcHRpb24uX3ByZXZpb3VzID0gb2xkTGFzdDsKICAgIGlmIChvbGRMYXN0ID09IG51bGwpIHsKICAgICAgX2ZpcnN0U3Vic2NyaXB0aW9uID0gc3Vic2NyaXB0aW9uOwogICAgfSBlbHNlIHsKICAgICAgb2xkTGFzdC5fbmV4dCA9IHN1YnNjcmlwdGlvbjsKICAgIH0KICB9CgogIHZvaWQgX3JlbW92ZUxpc3RlbmVyKF9Ccm9hZGNhc3RTdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKSB7CiAgICBhc3NlcnQoaWRlbnRpY2FsKHN1YnNjcmlwdGlvbi5fY29udHJvbGxlciwgdGhpcykpOwogICAgYXNzZXJ0KCFpZGVudGljYWwoc3Vic2NyaXB0aW9uLl9uZXh0LCBzdWJzY3JpcHRpb24pKTsKICAgIF9Ccm9hZGNhc3RTdWJzY3JpcHRpb248VD4gcHJldmlvdXMgPSBzdWJzY3JpcHRpb24uX3ByZXZpb3VzOwogICAgX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbjxUPiBuZXh0ID0gc3Vic2NyaXB0aW9uLl9uZXh0OwogICAgaWYgKHByZXZpb3VzID09IG51bGwpIHsKICAgICAgLy8gVGhpcyB3YXMgdGhlIGZpcnN0IHN1YnNjcmlwdGlvbi4KICAgICAgX2ZpcnN0U3Vic2NyaXB0aW9uID0gbmV4dDsKICAgIH0gZWxzZSB7CiAgICAgIHByZXZpb3VzLl9uZXh0ID0gbmV4dDsKICAgIH0KICAgIGlmIChuZXh0ID09IG51bGwpIHsKICAgICAgLy8gVGhpcyB3YXMgdGhlIGxhc3Qgc3Vic2NyaXB0aW9uLgogICAgICBfbGFzdFN1YnNjcmlwdGlvbiA9IHByZXZpb3VzOwogICAgfSBlbHNlIHsKICAgICAgbmV4dC5fcHJldmlvdXMgPSBwcmV2aW91czsKICAgIH0KCiAgICBzdWJzY3JpcHRpb24uX25leHQgPSBzdWJzY3JpcHRpb24uX3ByZXZpb3VzID0gc3Vic2NyaXB0aW9uOwogIH0KCiAgLy8gX1N0cmVhbUNvbnRyb2xsZXJMaWZlY3ljbGUgaW50ZXJmYWNlLgoKICBTdHJlYW1TdWJzY3JpcHRpb248VD4gX3N1YnNjcmliZSh2b2lkIG9uRGF0YShUIGRhdGEpLCBGdW5jdGlvbiBvbkVycm9yLAogICAgICB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3IpIHsKICAgIGlmIChpc0Nsb3NlZCkgewogICAgICBvbkRvbmUgPz89IF9udWxsRG9uZUhhbmRsZXI7CiAgICAgIHJldHVybiBuZXcgX0RvbmVTdHJlYW1TdWJzY3JpcHRpb248VD4ob25Eb25lKTsKICAgIH0KICAgIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24gPSBuZXcgX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbjxUPigKICAgICAgICB0aGlzLCBvbkRhdGEsIG9uRXJyb3IsIG9uRG9uZSwgY2FuY2VsT25FcnJvcik7CiAgICBfYWRkTGlzdGVuZXIoc3Vic2NyaXB0aW9uKTsKICAgIGlmIChpZGVudGljYWwoX2ZpcnN0U3Vic2NyaXB0aW9uLCBfbGFzdFN1YnNjcmlwdGlvbikpIHsKICAgICAgLy8gT25seSBvbmUgbGlzdGVuZXIsIHNvIGl0IG11c3QgYmUgdGhlIGZpcnN0IGxpc3RlbmVyLgogICAgICBfcnVuR3VhcmRlZChvbkxpc3Rlbik7CiAgICB9CiAgICByZXR1cm4gc3Vic2NyaXB0aW9uOwogIH0KCiAgRnV0dXJlIF9yZWNvcmRDYW5jZWwoU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YikgewogICAgX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24gPSBzdWI7CiAgICAvLyBJZiBhbHJlYWR5IHJlbW92ZWQgYnkgdGhlIHN0cmVhbSwgZG9uJ3QgcmVtb3ZlIGl0IGFnYWluLgogICAgaWYgKGlkZW50aWNhbChzdWJzY3JpcHRpb24uX25leHQsIHN1YnNjcmlwdGlvbikpIHJldHVybiBudWxsOwogICAgaWYgKHN1YnNjcmlwdGlvbi5faXNGaXJpbmcpIHsKICAgICAgc3Vic2NyaXB0aW9uLl9zZXRSZW1vdmVBZnRlckZpcmluZygpOwogICAgfSBlbHNlIHsKICAgICAgX3JlbW92ZUxpc3RlbmVyKHN1YnNjcmlwdGlvbik7CiAgICAgIC8vIElmIHdlIGFyZSBjdXJyZW50bHkgZmlyaW5nIGFuIGV2ZW50LCB0aGUgZW1wdHktY2hlY2sgaXMgcGVyZm9ybWVkIGF0CiAgICAgIC8vIHRoZSBlbmQgb2YgdGhlIGxpc3RlbmVyIGxvb3AgaW5zdGVhZCBvZiBoZXJlLgogICAgICBpZiAoIV9pc0ZpcmluZyAmJiBfaXNFbXB0eSkgewogICAgICAgIF9jYWxsT25DYW5jZWwoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIF9yZWNvcmRQYXVzZShTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKSB7fQogIHZvaWQgX3JlY29yZFJlc3VtZShTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKSB7fQoKICAvLyBFdmVudFNpbmsgaW50ZXJmYWNlLgoKICBFcnJvciBfYWRkRXZlbnRFcnJvcigpIHsKICAgIGlmIChpc0Nsb3NlZCkgewogICAgICByZXR1cm4gbmV3IFN0YXRlRXJyb3IoIkNhbm5vdCBhZGQgbmV3IGV2ZW50cyBhZnRlciBjYWxsaW5nIGNsb3NlIik7CiAgICB9CiAgICBhc3NlcnQoX2lzQWRkaW5nU3RyZWFtKTsKICAgIHJldHVybiBuZXcgU3RhdGVFcnJvcigiQ2Fubm90IGFkZCBuZXcgZXZlbnRzIHdoaWxlIGRvaW5nIGFuIGFkZFN0cmVhbSIpOwogIH0KCiAgdm9pZCBhZGQoVCBkYXRhKSB7CiAgICBpZiAoIV9tYXlBZGRFdmVudCkgdGhyb3cgX2FkZEV2ZW50RXJyb3IoKTsKICAgIF9zZW5kRGF0YShkYXRhKTsKICB9CgogIHZvaWQgYWRkRXJyb3IoT2JqZWN0IGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSkgewogICAgZXJyb3IgPSBfbm9uTnVsbEVycm9yKGVycm9yKTsKICAgIGlmICghX21heUFkZEV2ZW50KSB0aHJvdyBfYWRkRXZlbnRFcnJvcigpOwogICAgQXN5bmNFcnJvciByZXBsYWNlbWVudCA9IFpvbmUuY3VycmVudC5lcnJvckNhbGxiYWNrKGVycm9yLCBzdGFja1RyYWNlKTsKICAgIGlmIChyZXBsYWNlbWVudCAhPSBudWxsKSB7CiAgICAgIGVycm9yID0gX25vbk51bGxFcnJvcihyZXBsYWNlbWVudC5lcnJvcik7CiAgICAgIHN0YWNrVHJhY2UgPSByZXBsYWNlbWVudC5zdGFja1RyYWNlOwogICAgfQogICAgX3NlbmRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQoKICBGdXR1cmUgY2xvc2UoKSB7CiAgICBpZiAoaXNDbG9zZWQpIHsKICAgICAgYXNzZXJ0KF9kb25lRnV0dXJlICE9IG51bGwpOwogICAgICByZXR1cm4gX2RvbmVGdXR1cmU7CiAgICB9CiAgICBpZiAoIV9tYXlBZGRFdmVudCkgdGhyb3cgX2FkZEV2ZW50RXJyb3IoKTsKICAgIF9zdGF0ZSB8PSBfU1RBVEVfQ0xPU0VEOwogICAgRnV0dXJlIGRvbmVGdXR1cmUgPSBfZW5zdXJlRG9uZUZ1dHVyZSgpOwogICAgX3NlbmREb25lKCk7CiAgICByZXR1cm4gZG9uZUZ1dHVyZTsKICB9CgogIEZ1dHVyZSBnZXQgZG9uZSA9PiBfZW5zdXJlRG9uZUZ1dHVyZSgpOwoKICBGdXR1cmUgYWRkU3RyZWFtKFN0cmVhbTxUPiBzdHJlYW0sIHtib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICBpZiAoIV9tYXlBZGRFdmVudCkgdGhyb3cgX2FkZEV2ZW50RXJyb3IoKTsKICAgIF9zdGF0ZSB8PSBfU1RBVEVfQUREU1RSRUFNOwogICAgX2FkZFN0cmVhbVN0YXRlID0gbmV3IF9BZGRTdHJlYW1TdGF0ZSh0aGlzLCBzdHJlYW0sIGNhbmNlbE9uRXJyb3IgPz8gZmFsc2UpOwogICAgcmV0dXJuIF9hZGRTdHJlYW1TdGF0ZS5hZGRTdHJlYW1GdXR1cmU7CiAgfQoKICAvLyBfRXZlbnRTaW5rIGludGVyZmFjZSwgY2FsbGVkIGZyb20gQWRkU3RyZWFtU3RhdGUuCiAgdm9pZCBfYWRkKFQgZGF0YSkgewogICAgX3NlbmREYXRhKGRhdGEpOwogIH0KCiAgdm9pZCBfYWRkRXJyb3IoT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgIF9zZW5kRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgdm9pZCBfY2xvc2UoKSB7CiAgICBhc3NlcnQoX2lzQWRkaW5nU3RyZWFtKTsKICAgIF9BZGRTdHJlYW1TdGF0ZSBhZGRTdGF0ZSA9IF9hZGRTdHJlYW1TdGF0ZTsKICAgIF9hZGRTdHJlYW1TdGF0ZSA9IG51bGw7CiAgICBfc3RhdGUgJj0gfl9TVEFURV9BRERTVFJFQU07CiAgICBhZGRTdGF0ZS5jb21wbGV0ZSgpOwogIH0KCiAgLy8gRXZlbnQgaGFuZGxpbmcuCiAgdm9pZCBfZm9yRWFjaExpc3RlbmVyKAogICAgICB2b2lkIGFjdGlvbihfQnVmZmVyaW5nU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbikpIHsKICAgIGlmIChfaXNGaXJpbmcpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoCiAgICAgICAgICAiQ2Fubm90IGZpcmUgbmV3IGV2ZW50LiBDb250cm9sbGVyIGlzIGFscmVhZHkgZmlyaW5nIGFuIGV2ZW50Iik7CiAgICB9CiAgICBpZiAoX2lzRW1wdHkpIHJldHVybjsKCiAgICAvLyBHZXQgZXZlbnQgaWQgb2YgdGhpcyBldmVudC4KICAgIGludCBpZCA9IChfc3RhdGUgJiBfU1RBVEVfRVZFTlRfSUQpOwogICAgLy8gU3RhcnQgZmlyaW5nIChzZXQgdGhlIF9TVEFURV9GSVJJTkcgYml0KS4gV2UgZG9uJ3QgZG8gW29uQ2FuY2VsXQogICAgLy8gY2FsbGJhY2tzIHdoaWxlIGZpcmluZywgYW5kIHdlIHByZXZlbnQgcmVlbnRyYW5jeSBvZiB0aGlzIGZ1bmN0aW9uLgogICAgLy8KICAgIC8vIFNldCBbX3N0YXRlXSdzIGV2ZW50IGlkIHRvIHRoZSBuZXh0IGV2ZW50J3MgaWQuCiAgICAvLyBBbnkgbGlzdGVuZXJzIGFkZGVkIHdoaWxlIGZpcmluZyB0aGlzIGV2ZW50IHdpbGwgZXhwZWN0IHRoZSBuZXh0IGV2ZW50LAogICAgLy8gbm90IHRoaXMgb25lLCBhbmQgd29uJ3QgZ2V0IG5vdGlmaWVkLgogICAgX3N0YXRlIF49IF9TVEFURV9FVkVOVF9JRCB8IF9TVEFURV9GSVJJTkc7CiAgICBfQnJvYWRjYXN0U3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbiA9IF9maXJzdFN1YnNjcmlwdGlvbjsKICAgIHdoaWxlIChzdWJzY3JpcHRpb24gIT0gbnVsbCkgewogICAgICBpZiAoc3Vic2NyaXB0aW9uLl9leHBlY3RzRXZlbnQoaWQpKSB7CiAgICAgICAgc3Vic2NyaXB0aW9uLl9ldmVudFN0YXRlIHw9IF9Ccm9hZGNhc3RTdWJzY3JpcHRpb24uX1NUQVRFX0ZJUklORzsKICAgICAgICBhY3Rpb24oc3Vic2NyaXB0aW9uKTsKICAgICAgICBzdWJzY3JpcHRpb24uX3RvZ2dsZUV2ZW50SWQoKTsKICAgICAgICBfQnJvYWRjYXN0U3Vic2NyaXB0aW9uPFQ+IG5leHQgPSBzdWJzY3JpcHRpb24uX25leHQ7CiAgICAgICAgaWYgKHN1YnNjcmlwdGlvbi5fcmVtb3ZlQWZ0ZXJGaXJpbmcpIHsKICAgICAgICAgIF9yZW1vdmVMaXN0ZW5lcihzdWJzY3JpcHRpb24pOwogICAgICAgIH0KICAgICAgICBzdWJzY3JpcHRpb24uX2V2ZW50U3RhdGUgJj0gfl9Ccm9hZGNhc3RTdWJzY3JpcHRpb24uX1NUQVRFX0ZJUklORzsKICAgICAgICBzdWJzY3JpcHRpb24gPSBuZXh0OwogICAgICB9IGVsc2UgewogICAgICAgIHN1YnNjcmlwdGlvbiA9IHN1YnNjcmlwdGlvbi5fbmV4dDsKICAgICAgfQogICAgfQogICAgX3N0YXRlICY9IH5fU1RBVEVfRklSSU5HOwoKICAgIGlmIChfaXNFbXB0eSkgewogICAgICBfY2FsbE9uQ2FuY2VsKCk7CiAgICB9CiAgfQoKICB2b2lkIF9jYWxsT25DYW5jZWwoKSB7CiAgICBhc3NlcnQoX2lzRW1wdHkpOwogICAgaWYgKGlzQ2xvc2VkICYmIF9kb25lRnV0dXJlLl9tYXlDb21wbGV0ZSkgewogICAgICAvLyBXaGVuIGNsb3NlZCwgX2RvbmVGdXR1cmUgaXMgbm90IG51bGwuCiAgICAgIF9kb25lRnV0dXJlLl9hc3luY0NvbXBsZXRlKG51bGwpOwogICAgfQogICAgX3J1bkd1YXJkZWQob25DYW5jZWwpOwogIH0KfQoKY2xhc3MgX1N5bmNCcm9hZGNhc3RTdHJlYW1Db250cm9sbGVyPFQ+IGV4dGVuZHMgX0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXI8VD4KICAgIGltcGxlbWVudHMgU3luY2hyb25vdXNTdHJlYW1Db250cm9sbGVyPFQ+IHsKICBfU3luY0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXIodm9pZCBvbkxpc3RlbigpLCB2b2lkIG9uQ2FuY2VsKCkpCiAgICAgIDogc3VwZXIob25MaXN0ZW4sIG9uQ2FuY2VsKTsKCiAgLy8gRXZlbnREaXNwYXRjaCBpbnRlcmZhY2UuCgogIGJvb2wgZ2V0IF9tYXlBZGRFdmVudCA9PiBzdXBlci5fbWF5QWRkRXZlbnQgJiYgIV9pc0ZpcmluZzsKCiAgX2FkZEV2ZW50RXJyb3IoKSB7CiAgICBpZiAoX2lzRmlyaW5nKSB7CiAgICAgIHJldHVybiBuZXcgU3RhdGVFcnJvcigKICAgICAgICAgICJDYW5ub3QgZmlyZSBuZXcgZXZlbnQuIENvbnRyb2xsZXIgaXMgYWxyZWFkeSBmaXJpbmcgYW4gZXZlbnQiKTsKICAgIH0KICAgIHJldHVybiBzdXBlci5fYWRkRXZlbnRFcnJvcigpOwogIH0KCiAgdm9pZCBfc2VuZERhdGEoVCBkYXRhKSB7CiAgICBpZiAoX2lzRW1wdHkpIHJldHVybjsKICAgIGlmIChfaGFzT25lTGlzdGVuZXIpIHsKICAgICAgX3N0YXRlIHw9IF9Ccm9hZGNhc3RTdHJlYW1Db250cm9sbGVyLl9TVEFURV9GSVJJTkc7CiAgICAgIF9Ccm9hZGNhc3RTdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uID0gX2ZpcnN0U3Vic2NyaXB0aW9uOwogICAgICBzdWJzY3JpcHRpb24uX2FkZChkYXRhKTsKICAgICAgX3N0YXRlICY9IH5fQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlci5fU1RBVEVfRklSSU5HOwogICAgICBpZiAoX2lzRW1wdHkpIHsKICAgICAgICBfY2FsbE9uQ2FuY2VsKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgX2ZvckVhY2hMaXN0ZW5lcigoX0J1ZmZlcmluZ1N0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24pIHsKICAgICAgc3Vic2NyaXB0aW9uLl9hZGQoZGF0YSk7CiAgICB9KTsKICB9CgogIHZvaWQgX3NlbmRFcnJvcihPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgaWYgKF9pc0VtcHR5KSByZXR1cm47CiAgICBfZm9yRWFjaExpc3RlbmVyKChfQnVmZmVyaW5nU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbikgewogICAgICBzdWJzY3JpcHRpb24uX2FkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgIH0pOwogIH0KCiAgdm9pZCBfc2VuZERvbmUoKSB7CiAgICBpZiAoIV9pc0VtcHR5KSB7CiAgICAgIF9mb3JFYWNoTGlzdGVuZXIoKF9CdWZmZXJpbmdTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKSB7CiAgICAgICAgc3Vic2NyaXB0aW9uLl9jbG9zZSgpOwogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChfZG9uZUZ1dHVyZSAhPSBudWxsKTsKICAgICAgYXNzZXJ0KF9kb25lRnV0dXJlLl9tYXlDb21wbGV0ZSk7CiAgICAgIF9kb25lRnV0dXJlLl9hc3luY0NvbXBsZXRlKG51bGwpOwogICAgfQogIH0KfQoKY2xhc3MgX0FzeW5jQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlcjxUPiBleHRlbmRzIF9Ccm9hZGNhc3RTdHJlYW1Db250cm9sbGVyPFQ+IHsKICBfQXN5bmNCcm9hZGNhc3RTdHJlYW1Db250cm9sbGVyKHZvaWQgb25MaXN0ZW4oKSwgdm9pZCBvbkNhbmNlbCgpKQogICAgICA6IHN1cGVyKG9uTGlzdGVuLCBvbkNhbmNlbCk7CgogIC8vIEV2ZW50RGlzcGF0Y2ggaW50ZXJmYWNlLgoKICB2b2lkIF9zZW5kRGF0YShUIGRhdGEpIHsKICAgIGZvciAoX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24gPSBfZmlyc3RTdWJzY3JpcHRpb247CiAgICAgICAgc3Vic2NyaXB0aW9uICE9IG51bGw7CiAgICAgICAgc3Vic2NyaXB0aW9uID0gc3Vic2NyaXB0aW9uLl9uZXh0KSB7CiAgICAgIHN1YnNjcmlwdGlvbi5fYWRkUGVuZGluZyhuZXcgX0RlbGF5ZWREYXRhPFQ+KGRhdGEpKTsKICAgIH0KICB9CgogIHZvaWQgX3NlbmRFcnJvcihPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgZm9yIChfQnJvYWRjYXN0U3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbiA9IF9maXJzdFN1YnNjcmlwdGlvbjsKICAgICAgICBzdWJzY3JpcHRpb24gIT0gbnVsbDsKICAgICAgICBzdWJzY3JpcHRpb24gPSBzdWJzY3JpcHRpb24uX25leHQpIHsKICAgICAgc3Vic2NyaXB0aW9uLl9hZGRQZW5kaW5nKG5ldyBfRGVsYXllZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKSk7CiAgICB9CiAgfQoKICB2b2lkIF9zZW5kRG9uZSgpIHsKICAgIGlmICghX2lzRW1wdHkpIHsKICAgICAgZm9yIChfQnJvYWRjYXN0U3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbiA9IF9maXJzdFN1YnNjcmlwdGlvbjsKICAgICAgICAgIHN1YnNjcmlwdGlvbiAhPSBudWxsOwogICAgICAgICAgc3Vic2NyaXB0aW9uID0gc3Vic2NyaXB0aW9uLl9uZXh0KSB7CiAgICAgICAgc3Vic2NyaXB0aW9uLl9hZGRQZW5kaW5nKGNvbnN0IF9EZWxheWVkRG9uZSgpKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KF9kb25lRnV0dXJlICE9IG51bGwpOwogICAgICBhc3NlcnQoX2RvbmVGdXR1cmUuX21heUNvbXBsZXRlKTsKICAgICAgX2RvbmVGdXR1cmUuX2FzeW5jQ29tcGxldGUobnVsbCk7CiAgICB9CiAgfQp9CgovKioKICogU3RyZWFtIGNvbnRyb2xsZXIgdGhhdCBpcyB1c2VkIGJ5IFtTdHJlYW0uYXNCcm9hZGNhc3RTdHJlYW1dLgogKgogKiBUaGlzIHN0cmVhbSBjb250cm9sbGVyIGFsbG93cyBpbmNvbWluZyBldmVudHMgd2hpbGUgaXQgaXMgZmlyaW5nCiAqIG90aGVyIGV2ZW50cy4gVGhpcyBpcyBoYW5kbGVkIGJ5IGRlbGF5aW5nIHRoZSBldmVudHMgdW50aWwgdGhlCiAqIGN1cnJlbnQgZXZlbnQgaXMgZG9uZSBmaXJpbmcsIGFuZCB0aGVuIGZpcmUgdGhlIHBlbmRpbmcgZXZlbnRzLgogKgogKiBUaGlzIGNsYXNzIGV4dGVuZHMgW19TeW5jQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlcl0uIEV2ZW50cyBvZgogKiBhbiAiYXNCcm9hZGNhc3RTdHJlYW0iIHN0cmVhbSBhcmUgYWx3YXlzIGluaXRpYXRlZCBieSBldmVudHMKICogb24gYW5vdGhlciBzdHJlYW0sIGFuZCBpdCBpcyBmaW5lIHRvIGZvcndhcmQgdGhlbSBzeW5jaHJvbm91c2x5LgogKi8KY2xhc3MgX0FzQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlcjxUPiBleHRlbmRzIF9TeW5jQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlcjxUPgogICAgaW1wbGVtZW50cyBfRXZlbnREaXNwYXRjaDxUPiB7CiAgX1N0cmVhbUltcGxFdmVudHM8VD4gX3BlbmRpbmc7CgogIF9Bc0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXIodm9pZCBvbkxpc3RlbigpLCB2b2lkIG9uQ2FuY2VsKCkpCiAgICAgIDogc3VwZXIob25MaXN0ZW4sIG9uQ2FuY2VsKTsKCiAgYm9vbCBnZXQgX2hhc1BlbmRpbmcgPT4gX3BlbmRpbmcgIT0gbnVsbCAmJiAhX3BlbmRpbmcuaXNFbXB0eTsKCiAgdm9pZCBfYWRkUGVuZGluZ0V2ZW50KF9EZWxheWVkRXZlbnQgZXZlbnQpIHsKICAgIF9wZW5kaW5nID8/PSBuZXcgX1N0cmVhbUltcGxFdmVudHM8VD4oKTsKICAgIF9wZW5kaW5nLmFkZChldmVudCk7CiAgfQoKICB2b2lkIGFkZChUIGRhdGEpIHsKICAgIGlmICghaXNDbG9zZWQgJiYgX2lzRmlyaW5nKSB7CiAgICAgIF9hZGRQZW5kaW5nRXZlbnQobmV3IF9EZWxheWVkRGF0YTxUPihkYXRhKSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHN1cGVyLmFkZChkYXRhKTsKICAgIHdoaWxlIChfaGFzUGVuZGluZykgewogICAgICBfcGVuZGluZy5oYW5kbGVOZXh0KHRoaXMpOwogICAgfQogIH0KCiAgdm9pZCBhZGRFcnJvcihPYmplY3QgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICBpZiAoIWlzQ2xvc2VkICYmIF9pc0ZpcmluZykgewogICAgICBfYWRkUGVuZGluZ0V2ZW50KG5ldyBfRGVsYXllZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghX21heUFkZEV2ZW50KSB0aHJvdyBfYWRkRXZlbnRFcnJvcigpOwogICAgX3NlbmRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICB3aGlsZSAoX2hhc1BlbmRpbmcpIHsKICAgICAgX3BlbmRpbmcuaGFuZGxlTmV4dCh0aGlzKTsKICAgIH0KICB9CgogIEZ1dHVyZSBjbG9zZSgpIHsKICAgIGlmICghaXNDbG9zZWQgJiYgX2lzRmlyaW5nKSB7CiAgICAgIF9hZGRQZW5kaW5nRXZlbnQoY29uc3QgX0RlbGF5ZWREb25lKCkpOwogICAgICBfc3RhdGUgfD0gX0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXIuX1NUQVRFX0NMT1NFRDsKICAgICAgcmV0dXJuIHN1cGVyLmRvbmU7CiAgICB9CiAgICBGdXR1cmUgcmVzdWx0ID0gc3VwZXIuY2xvc2UoKTsKICAgIGFzc2VydCghX2hhc1BlbmRpbmcpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgX2NhbGxPbkNhbmNlbCgpIHsKICAgIGlmIChfaGFzUGVuZGluZykgewogICAgICBfcGVuZGluZy5jbGVhcigpOwogICAgICBfcGVuZGluZyA9IG51bGw7CiAgICB9CiAgICBzdXBlci5fY2FsbE9uQ2FuY2VsKCk7CiAgfQp9CoIAAE5OPAEUATk9GwEgAgFFKCYzQ0pJRgEjJwFDUEQeBAFRARokBAE8ASEXLwQBITcBUSQVAUYwFgEdAgEtKicoJiYpAR8lAR4OAS0wLwEyJgEGLAVKGU5QSxwFTB8GFwE7IQEjIEgEASwgSAQBJCBIBAEuIEgEASEBOQE9ATYBBi0FTRQGHgE+JQEGNwU+Bh0XPQQBUTcBQAE1ASAxKAQBGQEzAT8+OTszOyYfJhspDSQGBAFBNzpBORwqIQ0dBhgpJA0hBgFABAErAUorFCM1Bkg3IDw+HQYZBAE0MkBCIiwNJU43JBkIBhEEATs8ARoBGxRKBh1NBAEVLxUEATkiL0wfMCsGIwQBExQjGgYvHS0RFwQBKgE9LyBRLAQBNxYVBAE4IwQBEh0wHCEZBAEVGUMVHEsGGgEjKUhLBzdPLS9BIyxKHic9LykKSx0PKwgGHgEUFwYEARkWMC8oBhsEAgFOMEMjAR4BPQEVFR1LBiMEARsaGzpDHzsWGQgOBkYfCAQBORpGMQgEARUVSB8KDSMoKAYEAgFRRCMBHgEbRh4tOwYEATlGHi1GBgQBFRVIIC84CA0jKCgGBAIBBEEDREJDA0JARARQIyEBQSMBQQEvLRkEARUiMw4GFRohBgQBOSI+DgYvIxohBgQBEyIuOhkGIxoTBAEZFxgXBhsEAgErZGFydDphc3luYy9icm9hZGNhc3Rfc3RyZWFtX2NvbnRyb2xsZXIuZGFydDRvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvYXN5bmMvZGVmZXJyZWRfbG9hZC5kYXJ0g84vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmFzeW5jOwoKLyoqCiAqIEluZGljYXRlcyB0aGF0IGxvYWRpbmcgb2YgW2xpYnJhcnlOYW1lXSBpcyBkZWZlcnJlZC4KICoKICogVGhpcyBjbGFzcyBpcyBvYnNvbGV0ZS4gSW5zdGVhZCB1c2UgdGhlIHN5bnRheDoKICogaW1wb3J0ICJsaWJyYXJ5LmRhcnQiIGRlZmVycmVkIGFzIHByZWZpeDsKICovCkBEZXByZWNhdGVkKCJEYXJ0IHNkayB2LiAxLjgiKQpjbGFzcyBEZWZlcnJlZExpYnJhcnkgewogIGZpbmFsIFN0cmluZyBsaWJyYXJ5TmFtZTsKICBmaW5hbCBTdHJpbmcgdXJpOwoKICBjb25zdCBEZWZlcnJlZExpYnJhcnkodGhpcy5saWJyYXJ5TmFtZSwge3RoaXMudXJpfSk7CgogIC8qKgogICAqIEVuc3VyZSB0aGF0IFtsaWJyYXJ5TmFtZV0gaGFzIGJlZW4gbG9hZGVkLgogICAqCiAgICogSWYgdGhlIGxpYnJhcnkgZmFpbHMgdG8gbG9hZCwgdGhlIEZ1dHVyZSB3aWxsIGNvbXBsZXRlIHdpdGggYQogICAqIERlZmVycmVkTG9hZEV4Y2VwdGlvbi4KICAgKi8KICBleHRlcm5hbCBGdXR1cmU8TnVsbD4gbG9hZCgpOwp9CgovKioKICogVGhyb3duIHdoZW4gYSBkZWZlcnJlZCBsaWJyYXJ5IGZhaWxzIHRvIGxvYWQuCiAqLwpjbGFzcyBEZWZlcnJlZExvYWRFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb24gewogIERlZmVycmVkTG9hZEV4Y2VwdGlvbih0aGlzLl9zKTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiRGVmZXJyZWRMb2FkRXhjZXB0aW9uOiAnJF9zJyI7CiAgZmluYWwgU3RyaW5nIF9zOwp9CiYATk48ARQBBDgDMy0EHxgcFAE3AQYwBUMcBiACAQQxBDMiNxMCAR1kYXJ0OmFzeW5jL2RlZmVycmVkX2xvYWQuZGFydDhvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2RlZmVycmVkX2xvYWRfcGF0Y2guZGFydIJCLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImFzeW5jX3BhdGNoLmRhcnQiOwoKZmluYWwgU2V0PFN0cmluZz4gX2xvYWRlZExpYnJhcmllcyA9IG5ldyBTZXQ8U3RyaW5nPigpOwoKQHBhdGNoCmNsYXNzIERlZmVycmVkTGlicmFyeSB7CiAgQHBhdGNoCiAgRnV0dXJlPE51bGw+IGxvYWQoKSB7CiAgICAvLyBEdW1teSBpbXBsZW1lbnRhdGlvbiB0aGF0IHNob3VsZCBldmVudHVhbGx5IGJlIHJlcGxhY2VkIGJ5IHJlYWwKICAgIC8vIGltcGxlbWVudGF0aW9uLgogICAgRnV0dXJlIGZ1dHVyZSA9IG5ldyBGdXR1cmU8TnVsbD4udmFsdWUobnVsbCk7CiAgICBfbG9hZGVkTGlicmFyaWVzLmFkZChsaWJyYXJ5TmFtZSk7CiAgICByZXR1cm4gZnV0dXJlOwogIH0KfQoVAE5OPAEfATgBBxgJGEcXMicTBAIBKWRhcnQ6YXN5bmMtcGF0Y2gvZGVmZXJyZWRfbG9hZF9wYXRjaC5kYXJ0LW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9hc3luYy9mdXR1cmUuZGFydMAAiOcvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmFzeW5jOwoKLy8vIEEgdHlwZSByZXByZXNlbnRpbmcgdmFsdWVzIHRoYXQgYXJlIGVpdGhlciBgRnV0dXJlPFQ+YCBvciBgVGAuCi8vLwovLy8gVGhpcyBjbGFzcyBkZWNsYXJhdGlvbiBpcyBhIHB1YmxpYyBzdGFuZC1pbiBmb3IgYW4gaW50ZXJuYWwKLy8vIGZ1dHVyZS1vci12YWx1ZSBnZW5lcmljIHR5cGUuIFJlZmVyZW5jZXMgdG8gdGhpcyBjbGFzcyBhcmUgcmVzb2x2ZWQgdG8gdGhlCi8vLyBpbnRlcm5hbCB0eXBlLgovLy8KLy8vIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGZvciBhbnkgY2xhc3MgdG8gZXh0ZW5kLCBtaXggaW4gb3IgaW1wbGVtZW50Ci8vLyBgRnV0dXJlT3JgLgovLy8KLy8vIE5vdGU6IHRoZSBgRnV0dXJlT3I8VD5gIHR5cGUgaXMgaW50ZXJwcmV0ZWQgYXMgYGR5bmFtaWNgIGluIG5vbiBzdHJvbmctbW9kZS4KLy8vCi8vLyAjIEV4YW1wbGVzCi8vLyBgYGAgZGFydAovLy8gLy8gVGhlIGBGdXR1cmU8VD4udGhlbmAgZnVuY3Rpb24gdGFrZXMgYSBjYWxsYmFjayBbZl0gdGhhdCByZXR1cm5zIGVpdGhlcgovLy8gLy8gYW4gYFNgIG9yIGEgYEZ1dHVyZTxTPmAuCi8vLyBGdXR1cmU8Uz4gdGhlbjxTPihGdXR1cmVPcjxTPiBmKFQgeCksIC4uLik7Ci8vLwovLy8gLy8gYENvbXBsZXRlcjxUPi5jb21wbGV0ZWAgdGFrZXMgZWl0aGVyIGEgYFRgIG9yIGBGdXR1cmU8VD5gLgovLy8gdm9pZCBjb21wbGV0ZShGdXR1cmVPcjxUPiB2YWx1ZSk7Ci8vLyBgYGAKLy8vCi8vLyAjIEFkdmFuY2VkCi8vLyBUaGUgYEZ1dHVyZU9yPGludD5gIHR5cGUgaXMgYWN0dWFsbHkgdGhlICJ0eXBlIHVuaW9uIiBvZiB0aGUgdHlwZXMgYGludGAgYW5kCi8vLyBgRnV0dXJlPGludD5gLiBUaGlzIHR5cGUgdW5pb24gaXMgZGVmaW5lZCBpbiBzdWNoIGEgd2F5IHRoYXQKLy8vIGBGdXR1cmVPcjxPYmplY3Q+YCBpcyBib3RoIGEgc3VwZXItIGFuZCBzdWItdHlwZSBvZiBgT2JqZWN0YCAoc3ViLXR5cGUKLy8vIGJlY2F1c2UgYE9iamVjdGAgaXMgb25lIG9mIHRoZSB0eXBlcyBvZiB0aGUgdW5pb24sIHN1cGVyLXR5cGUgYmVjYXVzZQovLy8gYE9iamVjdGAgaXMgYSBzdXBlci10eXBlIG9mIGJvdGggb2YgdGhlIHR5cGVzIG9mIHRoZSB1bmlvbikuIFRvZ2V0aGVyIGl0Ci8vLyBtZWFucyB0aGF0IGBGdXR1cmVPcjxPYmplY3Q+YCBpcyBlcXVpdmFsZW50IHRvIGBPYmplY3RgLgovLy8KLy8vIEFzIGEgY29yb2xsYXJ5LCBgRnV0dXJlT3I8T2JqZWN0PmAgaXMgZXF1aXZhbGVudCB0bwovLy8gYEZ1dHVyZU9yPEZ1dHVyZU9yPE9iamVjdD4+YCwgYEZ1dHVyZU9yPEZ1dHVyZTxPYmplY3Q+PmAgaXMgZXF1aXZhbGVudCB0bwovLy8gYEZ1dHVyZTxPYmplY3Q+YC4KYWJzdHJhY3QgY2xhc3MgRnV0dXJlT3I8VD4gewogIC8vIFByaXZhdGUgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3Rvciwgc28gdGhhdCBpdCBpcyBub3Qgc3ViY2xhc3NhYmxlLCBtaXhhYmxlLCBvcgogIC8vIGluc3RhbnRpYWJsZS4KICBGdXR1cmVPci5fKCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkZ1dHVyZU9yIGNhbid0IGJlIGluc3RhbnRpYXRlZCIpOwogIH0KfQoKLyoqCiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBkZWxheWVkIGNvbXB1dGF0aW9uLgogKgogKiBBIFtGdXR1cmVdIGlzIHVzZWQgdG8gcmVwcmVzZW50IGEgcG90ZW50aWFsIHZhbHVlLCBvciBlcnJvciwKICogdGhhdCB3aWxsIGJlIGF2YWlsYWJsZSBhdCBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZS4KICogUmVjZWl2ZXJzIG9mIGEgW0Z1dHVyZV0gY2FuIHJlZ2lzdGVyIGNhbGxiYWNrcwogKiB0aGF0IGhhbmRsZSB0aGUgdmFsdWUgb3IgZXJyb3Igb25jZSBpdCBpcyBhdmFpbGFibGUuCiAqIEZvciBleGFtcGxlOgogKgogKiAgICAgRnV0dXJlPGludD4gZnV0dXJlID0gZ2V0RnV0dXJlKCk7CiAqICAgICBmdXR1cmUudGhlbigodmFsdWUpID0+IGhhbmRsZVZhbHVlKHZhbHVlKSkKICogICAgICAgICAgIC5jYXRjaEVycm9yKChlcnJvcikgPT4gaGFuZGxlRXJyb3IoZXJyb3IpKTsKICoKICogQSBbRnV0dXJlXSBjYW4gYmUgY29tcGxldGVkIGluIHR3byB3YXlzOgogKiB3aXRoIGEgdmFsdWUgKCJ0aGUgZnV0dXJlIHN1Y2NlZWRzIikKICogb3Igd2l0aCBhbiBlcnJvciAoInRoZSBmdXR1cmUgZmFpbHMiKS4KICogVXNlcnMgY2FuIGluc3RhbGwgY2FsbGJhY2tzIGZvciBlYWNoIGNhc2UuCiAqCiAqIEluIHNvbWUgY2FzZXMgd2Ugc2F5IHRoYXQgYSBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggYW5vdGhlciBmdXR1cmUuCiAqIFRoaXMgaXMgYSBzaG9ydCB3YXkgb2Ygc3RhdGluZyB0aGF0IHRoZSBmdXR1cmUgaXMgY29tcGxldGVkIGluIHRoZSBzYW1lIHdheSwKICogd2l0aCB0aGUgc2FtZSB2YWx1ZSBvciBlcnJvciwKICogYXMgdGhlIG90aGVyIGZ1dHVyZSBvbmNlIHRoYXQgY29tcGxldGVzLgogKiBXaGVuZXZlciBhIGZ1bmN0aW9uIGluIHRoZSBjb3JlIGxpYnJhcnkgbWF5IGNvbXBsZXRlIGEgZnV0dXJlCiAqIChmb3IgZXhhbXBsZSBbQ29tcGxldGVyLmNvbXBsZXRlXSBvciBbbmV3IEZ1dHVyZS52YWx1ZV0pLAogKiB0aGVuIGl0IGFsc28gYWNjZXB0cyBhbm90aGVyIGZ1dHVyZSBhbmQgZG9lcyB0aGlzIHdvcmsgZm9yIHRoZSBkZXZlbG9wZXIuCiAqCiAqIFRoZSByZXN1bHQgb2YgcmVnaXN0ZXJpbmcgYSBwYWlyIG9mIGNhbGxiYWNrcyBpcyBhIG5ldyBGdXR1cmUgKHRoZQogKiAic3VjY2Vzc29yIikgd2hpY2ggaW4gdHVybiBpcyBjb21wbGV0ZWQgd2l0aCB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZQogKiBjb3JyZXNwb25kaW5nIGNhbGxiYWNrLgogKiBUaGUgc3VjY2Vzc29yIGlzIGNvbXBsZXRlZCB3aXRoIGFuIGVycm9yIGlmIHRoZSBpbnZva2VkIGNhbGxiYWNrIHRocm93cy4KICogRm9yIGV4YW1wbGU6CiAqIGBgYAogKiBGdXR1cmU8aW50PiBzdWNjZXNzb3IgPSBmdXR1cmUudGhlbigoaW50IHZhbHVlKSB7CiAqICAgICAvLyBJbnZva2VkIHdoZW4gdGhlIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCBhIHZhbHVlLgogKiAgICAgcmV0dXJuIDQyOyAgLy8gVGhlIHN1Y2Nlc3NvciBpcyBjb21wbGV0ZWQgd2l0aCB0aGUgdmFsdWUgNDIuCiAqICAgfSwKICogICBvbkVycm9yOiAoZSkgewogKiAgICAgLy8gSW52b2tlZCB3aGVuIHRoZSBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggYW4gZXJyb3IuCiAqICAgICBpZiAoY2FuSGFuZGxlKGUpKSB7CiAqICAgICAgIHJldHVybiA0OTk7ICAvLyBUaGUgc3VjY2Vzc29yIGlzIGNvbXBsZXRlZCB3aXRoIHRoZSB2YWx1ZSA0OTkuCiAqICAgICB9IGVsc2UgewogKiAgICAgICB0aHJvdyBlOyAgLy8gVGhlIHN1Y2Nlc3NvciBpcyBjb21wbGV0ZWQgd2l0aCB0aGUgZXJyb3IgZS4KICogICAgIH0KICogICB9KTsKICogYGBgCiAqCiAqIElmIGEgZnV0dXJlIGRvZXMgbm90IGhhdmUgYSBzdWNjZXNzb3Igd2hlbiBpdCBjb21wbGV0ZXMgd2l0aCBhbiBlcnJvciwKICogaXQgZm9yd2FyZHMgdGhlIGVycm9yIG1lc3NhZ2UgdG8gdGhlIGdsb2JhbCBlcnJvci1oYW5kbGVyLgogKiBUaGlzIGJlaGF2aW9yIG1ha2VzIHN1cmUgdGhhdCBubyBlcnJvciBpcyBzaWxlbnRseSBkcm9wcGVkLgogKiBIb3dldmVyLCBpdCBhbHNvIG1lYW5zIHRoYXQgZXJyb3IgaGFuZGxlcnMgc2hvdWxkIGJlIGluc3RhbGxlZCBlYXJseSwKICogc28gdGhhdCB0aGV5IGFyZSBwcmVzZW50IGFzIHNvb24gYXMgYSBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggYW4gZXJyb3IuCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhpcyBwb3RlbnRpYWwgYnVnOgogKiBgYGAKICogdmFyIGZ1dHVyZSA9IGdldEZ1dHVyZSgpOwogKiBuZXcgVGltZXIobmV3IER1cmF0aW9uKG1pbGxpc2Vjb25kczogNSksICgpIHsKICogICAvLyBUaGUgZXJyb3ItaGFuZGxlciBpcyBub3QgYXR0YWNoZWQgdW50aWwgNSBtcyBhZnRlciB0aGUgZnV0dXJlIGhhcwogKiAgIC8vIGJlZW4gcmVjZWl2ZWQuIElmIHRoZSBmdXR1cmUgZmFpbHMgYmVmb3JlIHRoYXQsIHRoZSBlcnJvciBpcwogKiAgIC8vIGZvcndhcmRlZCB0byB0aGUgZ2xvYmFsIGVycm9yLWhhbmRsZXIsIGV2ZW4gdGhvdWdoIHRoZXJlIGlzIGNvZGUKICogICAvLyAoanVzdCBiZWxvdykgdG8gZXZlbnR1YWxseSBoYW5kbGUgdGhlIGVycm9yLgogKiAgIGZ1dHVyZS50aGVuKCh2YWx1ZSkgeyB1c2VWYWx1ZSh2YWx1ZSk7IH0sCiAqICAgICAgICAgICAgICAgb25FcnJvcjogKGUpIHsgaGFuZGxlRXJyb3IoZSk7IH0pOwogKiB9KTsKICogYGBgCiAqCiAqIFdoZW4gcmVnaXN0ZXJpbmcgY2FsbGJhY2tzLCBpdCdzIG9mdGVuIG1vcmUgcmVhZGFibGUgdG8gcmVnaXN0ZXIgdGhlIHR3bwogKiBjYWxsYmFja3Mgc2VwYXJhdGVseSwgYnkgZmlyc3QgdXNpbmcgW3RoZW5dIHdpdGggb25lIGFyZ3VtZW50CiAqICh0aGUgdmFsdWUgaGFuZGxlcikgYW5kIHVzaW5nIGEgc2Vjb25kIFtjYXRjaEVycm9yXSBmb3IgaGFuZGxpbmcgZXJyb3JzLgogKiBFYWNoIG9mIHRoZXNlIHdpbGwgZm9yd2FyZCB0aGUgcmVzdWx0IHRoYXQgdGhleSBkb24ndCBoYW5kbGUKICogdG8gdGhlaXIgc3VjY2Vzc29ycywgYW5kIHRvZ2V0aGVyIHRoZXkgaGFuZGxlIGJvdGggdmFsdWUgYW5kIGVycm9yIHJlc3VsdC4KICogSXQgYWxzbyBoYXMgdGhlIGFkZGl0aW9uYWwgYmVuZWZpdCBvZiB0aGUgW2NhdGNoRXJyb3JdIGhhbmRsaW5nIGVycm9ycyBpbiB0aGUKICogW3RoZW5dIHZhbHVlIGNhbGxiYWNrIHRvby4KICogVXNpbmcgc2VxdWVudGlhbCBoYW5kbGVycyBpbnN0ZWFkIG9mIHBhcmFsbGVsIG9uZXMgb2Z0ZW4gbGVhZHMgdG8gY29kZSB0aGF0CiAqIGlzIGVhc2llciB0byByZWFzb24gYWJvdXQuCiAqIEl0IGFsc28gbWFrZXMgYXN5bmNocm9ub3VzIGNvZGUgdmVyeSBzaW1pbGFyIHRvIHN5bmNocm9ub3VzIGNvZGU6CiAqIGBgYAogKiAvLyBTeW5jaHJvbm91cyBjb2RlLgogKiB0cnkgewogKiAgIGludCB2YWx1ZSA9IGZvbygpOwogKiAgIHJldHVybiBiYXIodmFsdWUpOwogKiB9IGNhdGNoIChlKSB7CiAqICAgcmV0dXJuIDQ5OTsKICogfQogKiBgYGAKICoKICogRXF1aXZhbGVudCBhc3luY2hyb25vdXMgY29kZSwgYmFzZWQgb24gZnV0dXJlczoKICogYGBgCiAqIEZ1dHVyZTxpbnQ+IGZ1dHVyZSA9IG5ldyBGdXR1cmUoZm9vKTsgIC8vIFJlc3VsdCBvZiBmb28oKSBhcyBhIGZ1dHVyZS4KICogZnV0dXJlLnRoZW4oKGludCB2YWx1ZSkgPT4gYmFyKHZhbHVlKSkKICogICAgICAgLmNhdGNoRXJyb3IoKGUpID0+IDQ5OSk7CiAqIGBgYAogKgogKiBTaW1pbGFyIHRvIHRoZSBzeW5jaHJvbm91cyBjb2RlLCB0aGUgZXJyb3IgaGFuZGxlciAocmVnaXN0ZXJlZCB3aXRoCiAqIFtjYXRjaEVycm9yXSkgaXMgaGFuZGxpbmcgYW55IGVycm9ycyB0aHJvd24gYnkgZWl0aGVyIGBmb29gIG9yIGBiYXJgLgogKiBJZiB0aGUgZXJyb3ItaGFuZGxlciBoYWQgYmVlbiByZWdpc3RlcmVkIGFzIHRoZSBgb25FcnJvcmAgcGFyYW1ldGVyIG9mCiAqIHRoZSBgdGhlbmAgY2FsbCwgaXQgd291bGQgbm90IGNhdGNoIGVycm9ycyBmcm9tIHRoZSBgYmFyYCBjYWxsLgogKgogKiBGdXR1cmVzIGNhbiBoYXZlIG1vcmUgdGhhbiBvbmUgY2FsbGJhY2stcGFpciByZWdpc3RlcmVkLiBFYWNoIHN1Y2Nlc3NvciBpcwogKiB0cmVhdGVkIGluZGVwZW5kZW50bHkgYW5kIGlzIGhhbmRsZWQgYXMgaWYgaXQgd2FzIHRoZSBvbmx5IHN1Y2Nlc3Nvci4KICoKICogQSBmdXR1cmUgbWF5IGFsc28gZmFpbCB0byBldmVyIGNvbXBsZXRlLiBJbiB0aGF0IGNhc2UsIG5vIGNhbGxiYWNrcyBhcmUKICogY2FsbGVkLgogKi8KYWJzdHJhY3QgY2xhc3MgRnV0dXJlPFQ+IHsKICAvLy8gQSBgRnV0dXJlPE51bGw+YCBjb21wbGV0ZWQgd2l0aCBgbnVsbGAuCiAgc3RhdGljIGZpbmFsIF9GdXR1cmU8TnVsbD4gX251bGxGdXR1cmUgPQogICAgICBuZXcgX0Z1dHVyZTxOdWxsPi56b25lVmFsdWUobnVsbCwgWm9uZS5yb290KTsKCiAgLy8vIEEgYEZ1dHVyZTxib29sPmAgY29tcGxldGVkIHdpdGggYGZhbHNlYC4KICBzdGF0aWMgZmluYWwgX0Z1dHVyZTxib29sPiBfZmFsc2VGdXR1cmUgPQogICAgICBuZXcgX0Z1dHVyZTxib29sPi56b25lVmFsdWUoZmFsc2UsIFpvbmUucm9vdCk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBmdXR1cmUgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgW2NvbXB1dGF0aW9uXQogICAqIGFzeW5jaHJvbm91c2x5IHdpdGggW1RpbWVyLnJ1bl0uCiAgICoKICAgKiBJZiB0aGUgcmVzdWx0IG9mIGV4ZWN1dGluZyBbY29tcHV0YXRpb25dIHRocm93cywgdGhlIHJldHVybmVkIGZ1dHVyZSBpcwogICAqIGNvbXBsZXRlZCB3aXRoIHRoZSBlcnJvci4KICAgKgogICAqIElmIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBpdHNlbGYgYSBbRnV0dXJlXSwgY29tcGxldGlvbiBvZgogICAqIHRoZSBjcmVhdGVkIGZ1dHVyZSB3aWxsIHdhaXQgdW50aWwgdGhlIHJldHVybmVkIGZ1dHVyZSBjb21wbGV0ZXMsCiAgICogYW5kIHdpbGwgdGhlbiBjb21wbGV0ZSB3aXRoIHRoZSBzYW1lIHJlc3VsdC4KICAgKgogICAqIElmIGEgbm9uLWZ1dHVyZSB2YWx1ZSBpcyByZXR1cm5lZCwgdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQKICAgKiB3aXRoIHRoYXQgdmFsdWUuCiAgICovCiAgZmFjdG9yeSBGdXR1cmUoRnV0dXJlT3I8VD4gY29tcHV0YXRpb24oKSkgewogICAgX0Z1dHVyZTxUPiByZXN1bHQgPSBuZXcgX0Z1dHVyZTxUPigpOwogICAgVGltZXIucnVuKCgpIHsKICAgICAgdHJ5IHsKICAgICAgICByZXN1bHQuX2NvbXBsZXRlKGNvbXB1dGF0aW9uKCkpOwogICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgX2NvbXBsZXRlV2l0aEVycm9yQ2FsbGJhY2socmVzdWx0LCBlLCBzKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIGZ1dHVyZSBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgY2FsbGluZyBbY29tcHV0YXRpb25dCiAgICogYXN5bmNocm9ub3VzbHkgd2l0aCBbc2NoZWR1bGVNaWNyb3Rhc2tdLgogICAqCiAgICogSWYgZXhlY3V0aW5nIFtjb21wdXRhdGlvbl0gdGhyb3dzLAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhlIHRocm93biBlcnJvci4KICAgKgogICAqIElmIGNhbGxpbmcgW2NvbXB1dGF0aW9uXSByZXR1cm5zIGEgW0Z1dHVyZV0sIGNvbXBsZXRpb24gb2YKICAgKiB0aGUgY3JlYXRlZCBmdXR1cmUgd2lsbCB3YWl0IHVudGlsIHRoZSByZXR1cm5lZCBmdXR1cmUgY29tcGxldGVzLAogICAqIGFuZCB3aWxsIHRoZW4gY29tcGxldGUgd2l0aCB0aGUgc2FtZSByZXN1bHQuCiAgICoKICAgKiBJZiBjYWxsaW5nIFtjb21wdXRhdGlvbl0gcmV0dXJucyBhIG5vbi1mdXR1cmUgdmFsdWUsCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGF0IHZhbHVlLgogICAqLwogIGZhY3RvcnkgRnV0dXJlLm1pY3JvdGFzayhGdXR1cmVPcjxUPiBjb21wdXRhdGlvbigpKSB7CiAgICBfRnV0dXJlPFQ+IHJlc3VsdCA9IG5ldyBfRnV0dXJlPFQ+KCk7CiAgICBzY2hlZHVsZU1pY3JvdGFzaygoKSB7CiAgICAgIHRyeSB7CiAgICAgICAgcmVzdWx0Ll9jb21wbGV0ZShjb21wdXRhdGlvbigpKTsKICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgIF9jb21wbGV0ZVdpdGhFcnJvckNhbGxiYWNrKHJlc3VsdCwgZSwgcyk7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBmdXR1cmUgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIGltbWVkaWF0ZWx5IGNhbGxpbmcKICAgKiBbY29tcHV0YXRpb25dLgogICAqCiAgICogSWYgY2FsbGluZyBbY29tcHV0YXRpb25dIHRocm93cywgdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGUKICAgKiBlcnJvci4KICAgKgogICAqIElmIGNhbGxpbmcgW2NvbXB1dGF0aW9uXSByZXR1cm5zIGEgYEZ1dHVyZTxUPmAsIHRoYXQgZnV0dXJlIGlzIHJldHVybmVkLgogICAqCiAgICogSWYgY2FsbGluZyBbY29tcHV0YXRpb25dIHJldHVybnMgYSBub24tZnV0dXJlIHZhbHVlLAogICAqIGEgZnV0dXJlIGlzIHJldHVybmVkIHdoaWNoIGhhcyBiZWVuIGNvbXBsZXRlZCB3aXRoIHRoYXQgdmFsdWUuCiAgICovCiAgZmFjdG9yeSBGdXR1cmUuc3luYyhGdXR1cmVPcjxUPiBjb21wdXRhdGlvbigpKSB7CiAgICB0cnkgewogICAgICB2YXIgcmVzdWx0ID0gY29tcHV0YXRpb24oKTsKICAgICAgaWYgKHJlc3VsdCBpcyBGdXR1cmU8VD4pIHsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBuZXcgX0Z1dHVyZTxUPi52YWx1ZShyZXN1bHQpOwogICAgICB9CiAgICB9IGNhdGNoIChlcnJvciwgc3RhY2tUcmFjZSkgewogICAgICB2YXIgZnV0dXJlID0gbmV3IF9GdXR1cmU8VD4oKTsKICAgICAgQXN5bmNFcnJvciByZXBsYWNlbWVudCA9IFpvbmUuY3VycmVudC5lcnJvckNhbGxiYWNrKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHsKICAgICAgICBmdXR1cmUuX2FzeW5jQ29tcGxldGVFcnJvcigKICAgICAgICAgICAgX25vbk51bGxFcnJvcihyZXBsYWNlbWVudC5lcnJvciksIHJlcGxhY2VtZW50LnN0YWNrVHJhY2UpOwogICAgICB9IGVsc2UgewogICAgICAgIGZ1dHVyZS5fYXN5bmNDb21wbGV0ZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgfQogICAgICByZXR1cm4gZnV0dXJlOwogICAgfQogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIGZ1dHVyZSBjb21wbGV0ZWQgd2l0aCBbdmFsdWVdLgogICAqCiAgICogSWYgW3ZhbHVlXSBpcyBhIGZ1dHVyZSwgdGhlIGNyZWF0ZWQgZnV0dXJlIHdhaXRzIGZvciB0aGUKICAgKiBbdmFsdWVdIGZ1dHVyZSB0byBjb21wbGV0ZSwgYW5kIHRoZW4gY29tcGxldGVzIHdpdGggdGhlIHNhbWUgcmVzdWx0LgogICAqIFNpbmNlIGEgW3ZhbHVlXSBmdXR1cmUgY2FuIGNvbXBsZXRlIHdpdGggYW4gZXJyb3IsIHNvIGNhbiB0aGUgZnV0dXJlCiAgICogY3JlYXRlZCBieSBbRnV0dXJlLnZhbHVlXSwgZXZlbiBpZiB0aGUgbmFtZSBzdWdnZXN0cyBvdGhlcndpc2UuCiAgICoKICAgKiBJZiBbdmFsdWVdIGlzIG5vdCBhIFtGdXR1cmVdLCB0aGUgY3JlYXRlZCBmdXR1cmUgaXMgY29tcGxldGVkCiAgICogd2l0aCB0aGUgW3ZhbHVlXSB2YWx1ZSwKICAgKiBlcXVpdmFsZW50bHkgdG8gYG5ldyBGdXR1cmU8VD4uc3luYygoKSA9PiB2YWx1ZSlgLgogICAqCiAgICogVXNlIFtDb21wbGV0ZXJdIHRvIGNyZWF0ZSBhIGZ1dHVyZSBhbmQgY29tcGxldGUgaXQgbGF0ZXIuCiAgICovCiAgZmFjdG9yeSBGdXR1cmUudmFsdWUoW0Z1dHVyZU9yPFQ+IHZhbHVlXSkgewogICAgcmV0dXJuIG5ldyBfRnV0dXJlPFQ+LmltbWVkaWF0ZSh2YWx1ZSk7CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGEgZnV0dXJlIHRoYXQgY29tcGxldGVzIHdpdGggYW4gZXJyb3IuCiAgICoKICAgKiBUaGUgY3JlYXRlZCBmdXR1cmUgd2lsbCBiZSBjb21wbGV0ZWQgd2l0aCBhbiBlcnJvciBpbiBhIGZ1dHVyZSBtaWNyb3Rhc2suCiAgICogVGhpcyBhbGxvd3MgZW5vdWdoIHRpbWUgZm9yIHNvbWVvbmUgdG8gYWRkIGFuIGVycm9yIGhhbmRsZXIgb24gdGhlIGZ1dHVyZS4KICAgKiBJZiBhbiBlcnJvciBoYW5kbGVyIGlzbid0IGFkZGVkIGJlZm9yZSB0aGUgZnV0dXJlIGNvbXBsZXRlcywgdGhlIGVycm9yCiAgICogd2lsbCBiZSBjb25zaWRlcmVkIHVuaGFuZGxlZC4KICAgKgogICAqIElmIFtlcnJvcl0gaXMgYG51bGxgLCBpdCBpcyByZXBsYWNlZCBieSBhIFtOdWxsVGhyb3duRXJyb3JdLgogICAqCiAgICogVXNlIFtDb21wbGV0ZXJdIHRvIGNyZWF0ZSBhIGZ1dHVyZSBhbmQgY29tcGxldGUgaXQgbGF0ZXIuCiAgICovCiAgZmFjdG9yeSBGdXR1cmUuZXJyb3IoT2JqZWN0IGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSkgewogICAgZXJyb3IgPSBfbm9uTnVsbEVycm9yKGVycm9yKTsKICAgIGlmICghaWRlbnRpY2FsKFpvbmUuY3VycmVudCwgX3Jvb3Rab25lKSkgewogICAgICBBc3luY0Vycm9yIHJlcGxhY2VtZW50ID0gWm9uZS5jdXJyZW50LmVycm9yQ2FsbGJhY2soZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICBpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgewogICAgICAgIGVycm9yID0gX25vbk51bGxFcnJvcihyZXBsYWNlbWVudC5lcnJvcik7CiAgICAgICAgc3RhY2tUcmFjZSA9IHJlcGxhY2VtZW50LnN0YWNrVHJhY2U7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgX0Z1dHVyZTxUPi5pbW1lZGlhdGVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGEgZnV0dXJlIHRoYXQgcnVucyBpdHMgY29tcHV0YXRpb24gYWZ0ZXIgYSBkZWxheS4KICAgKgogICAqIFRoZSBbY29tcHV0YXRpb25dIHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIGdpdmVuIFtkdXJhdGlvbl0gaGFzIHBhc3NlZCwKICAgKiBhbmQgdGhlIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBjb21wdXRhdGlvbi4KICAgKgogICAqIElmIFtjb21wdXRhdGlvbl0gcmV0dXJucyBhIGZ1dHVyZSwKICAgKiB0aGUgZnV0dXJlIHJldHVybmVkIGJ5IHRoaXMgY29uc3RydWN0b3Igd2lsbCBjb21wbGV0ZSB3aXRoIHRoZSB2YWx1ZSBvcgogICAqIGVycm9yIG9mIHRoYXQgZnV0dXJlLgogICAqCiAgICogSWYgdGhlIGR1cmF0aW9uIGlzIDAgb3IgbGVzcywKICAgKiBpdCBjb21wbGV0ZXMgbm8gc29vbmVyIHRoYW4gaW4gdGhlIG5leHQgZXZlbnQtbG9vcCBpdGVyYXRpb24sCiAgICogYWZ0ZXIgYWxsIG1pY3JvdGFza3MgaGF2ZSBydW4uCiAgICoKICAgKiBJZiBbY29tcHV0YXRpb25dIGlzIG9taXR0ZWQsCiAgICogaXQgd2lsbCBiZSB0cmVhdGVkIGFzIGlmIFtjb21wdXRhdGlvbl0gd2FzIGAoKSA9PiBudWxsYCwKICAgKiBhbmQgdGhlIGZ1dHVyZSB3aWxsIGV2ZW50dWFsbHkgY29tcGxldGUgd2l0aCB0aGUgYG51bGxgIHZhbHVlLgogICAqCiAgICogSWYgY2FsbGluZyBbY29tcHV0YXRpb25dIHRocm93cywgdGhlIGNyZWF0ZWQgZnV0dXJlIHdpbGwgY29tcGxldGUgd2l0aCB0aGUKICAgKiBlcnJvci4KICAgKgogICAqIFNlZSBhbHNvIFtDb21wbGV0ZXJdIGZvciBhIHdheSB0byBjcmVhdGUgYW5kIGNvbXBsZXRlIGEgZnV0dXJlIGF0IGEKICAgKiBsYXRlciB0aW1lIHRoYXQgaXNuJ3QgbmVjZXNzYXJpbHkgYWZ0ZXIgYSBrbm93biBmaXhlZCBkdXJhdGlvbi4KICAgKi8KICBmYWN0b3J5IEZ1dHVyZS5kZWxheWVkKER1cmF0aW9uIGR1cmF0aW9uLCBbRnV0dXJlT3I8VD4gY29tcHV0YXRpb24oKV0pIHsKICAgIF9GdXR1cmU8VD4gcmVzdWx0ID0gbmV3IF9GdXR1cmU8VD4oKTsKICAgIG5ldyBUaW1lcihkdXJhdGlvbiwgKCkgewogICAgICBpZiAoY29tcHV0YXRpb24gPT0gbnVsbCkgewogICAgICAgIHJlc3VsdC5fY29tcGxldGUobnVsbCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJlc3VsdC5fY29tcGxldGUoY29tcHV0YXRpb24oKSk7CiAgICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgICAgX2NvbXBsZXRlV2l0aEVycm9yQ2FsbGJhY2socmVzdWx0LCBlLCBzKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8qKgogICAqIFdhaXRzIGZvciBtdWx0aXBsZSBmdXR1cmVzIHRvIGNvbXBsZXRlIGFuZCBjb2xsZWN0cyB0aGVpciByZXN1bHRzLgogICAqCiAgICogUmV0dXJucyBhIGZ1dHVyZSB3aGljaCB3aWxsIGNvbXBsZXRlIG9uY2UgYWxsIHRoZSBwcm92aWRlZCBmdXR1cmVzCiAgICogaGF2ZSBjb21wbGV0ZWQsIGVpdGhlciB3aXRoIHRoZWlyIHJlc3VsdHMsIG9yIHdpdGggYW4gZXJyb3IgaWYgYW55CiAgICogb2YgdGhlIHByb3ZpZGVkIGZ1dHVyZXMgZmFpbC4KICAgKgogICAqIFRoZSB2YWx1ZSBvZiB0aGUgcmV0dXJuZWQgZnV0dXJlIHdpbGwgYmUgYSBsaXN0IG9mIGFsbCB0aGUgdmFsdWVzIHRoYXQKICAgKiB3ZXJlIHByb2R1Y2VkIGluIHRoZSBvcmRlciB0aGF0IHRoZSBmdXR1cmVzIGFyZSBwcm92aWRlZCBieSBpdGVyYXRpbmcKICAgKiBbZnV0dXJlc10uCiAgICoKICAgKiBJZiBhbnkgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIGFuIGVycm9yLAogICAqIHRoZW4gdGhlIHJldHVybmVkIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCB0aGF0IGVycm9yLgogICAqIElmIGZ1cnRoZXIgZnV0dXJlcyBhbHNvIGNvbXBsZXRlIHdpdGggZXJyb3JzLCB0aG9zZSBlcnJvcnMgYXJlIGRpc2NhcmRlZC4KICAgKgogICAqIElmIGBlYWdlckVycm9yYCBpcyB0cnVlLCB0aGUgcmV0dXJuZWQgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIGFuIGVycm9yCiAgICogaW1tZWRpYXRlbHkgb24gdGhlIGZpcnN0IGVycm9yIGZyb20gb25lIG9mIHRoZSBmdXR1cmVzLiBPdGhlcndpc2UgYWxsCiAgICogZnV0dXJlcyBtdXN0IGNvbXBsZXRlIGJlZm9yZSB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCAoc3RpbGwgd2l0aAogICAqIHRoZSBmaXJzdCBlcnJvcjsgdGhlIHJlbWFpbmluZyBlcnJvcnMgYXJlIHNpbGVudGx5IGRyb3BwZWQpLgogICAqCiAgICogSW4gdGhlIGNhc2Ugb2YgYW4gZXJyb3IsIFtjbGVhblVwXSAoaWYgcHJvdmlkZWQpLCBpcyBpbnZva2VkIG9uIGFueQogICAqIG5vbi1udWxsIHJlc3VsdCBvZiBzdWNjZXNzZnVsIGZ1dHVyZXMuCiAgICogVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBgY2xlYW5VcGAgcmVzb3VyY2VzIHRoYXQgd291bGQgb3RoZXJ3aXNlIGJlCiAgICogbG9zdCAoc2luY2UgdGhlIHJldHVybmVkIGZ1dHVyZSBkb2VzIG5vdCBwcm92aWRlIGFjY2VzcyB0byB0aGVzZSB2YWx1ZXMpLgogICAqIFRoZSBbY2xlYW5VcF0gZnVuY3Rpb24gaXMgdW51c2VkIGlmIHRoZXJlIGlzIG5vIGVycm9yLgogICAqCiAgICogVGhlIGNhbGwgdG8gW2NsZWFuVXBdIHNob3VsZCBub3QgdGhyb3cuIElmIGl0IGRvZXMsIHRoZSBlcnJvciB3aWxsIGJlIGFuCiAgICogdW5jYXVnaHQgYXN5bmNocm9ub3VzIGVycm9yLgogICAqLwogIHN0YXRpYyBGdXR1cmU8TGlzdDxUPj4gd2FpdDxUPihJdGVyYWJsZTxGdXR1cmU8VD4+IGZ1dHVyZXMsCiAgICAgIHtib29sIGVhZ2VyRXJyb3I6IGZhbHNlLCB2b2lkIGNsZWFuVXAoVCBzdWNjZXNzVmFsdWUpfSkgewogICAgZmluYWwgX0Z1dHVyZTxMaXN0PFQ+PiByZXN1bHQgPSBuZXcgX0Z1dHVyZTxMaXN0PFQ+PigpOwogICAgTGlzdDxUPiB2YWx1ZXM7IC8vIENvbGxlY3RzIHRoZSB2YWx1ZXMuIFNldCB0byBudWxsIG9uIGVycm9yLgogICAgaW50IHJlbWFpbmluZyA9IDA7IC8vIEhvdyBtYW55IGZ1dHVyZXMgYXJlIHdlIHdhaXRpbmcgZm9yLgogICAgdmFyIGVycm9yOyAvLyBUaGUgZmlyc3QgZXJyb3IgZnJvbSBhIGZ1dHVyZS4KICAgIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZTsgLy8gVGhlIHN0YWNrVHJhY2UgdGhhdCBjYW1lIHdpdGggdGhlIGVycm9yLgoKICAgIC8vIEhhbmRsZSBhbiBlcnJvciBmcm9tIGFueSBvZiB0aGUgZnV0dXJlcy4KICAgIC8vIFRPRE8oam1lc3Nlcmx5KTogdXNlIGB2b2lkYCByZXR1cm4gdHlwZSBvbmNlIGl0IGNhbiBiZSBpbmZlcnJlZCBmb3IgdGhlCiAgICAvLyBgdGhlbmAgY2FsbCBiZWxvdy4KICAgIGhhbmRsZUVycm9yKHRoZUVycm9yLCBTdGFja1RyYWNlIHRoZVN0YWNrVHJhY2UpIHsKICAgICAgcmVtYWluaW5nLS07CiAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkgewogICAgICAgIGlmIChjbGVhblVwICE9IG51bGwpIHsKICAgICAgICAgIGZvciAodmFyIHZhbHVlIGluIHZhbHVlcykgewogICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICAgIC8vIEVuc3VyZSBlcnJvcnMgZnJvbSBjbGVhblVwIGFyZSB1bmNhdWdodC4KICAgICAgICAgICAgICBuZXcgRnV0dXJlLnN5bmMoKCkgewogICAgICAgICAgICAgICAgY2xlYW5VcCh2YWx1ZSk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFsdWVzID0gbnVsbDsKICAgICAgICBpZiAocmVtYWluaW5nID09IDAgfHwgZWFnZXJFcnJvcikgewogICAgICAgICAgcmVzdWx0Ll9jb21wbGV0ZUVycm9yKHRoZUVycm9yLCB0aGVTdGFja1RyYWNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZXJyb3IgPSB0aGVFcnJvcjsKICAgICAgICAgIHN0YWNrVHJhY2UgPSB0aGVTdGFja1RyYWNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChyZW1haW5pbmcgPT0gMCAmJiAhZWFnZXJFcnJvcikgewogICAgICAgIHJlc3VsdC5fY29tcGxldGVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgIH0KICAgIH0KCiAgICB0cnkgewogICAgICAvLyBBcyBlYWNoIGZ1dHVyZSBjb21wbGV0ZXMsIHB1dCBpdHMgdmFsdWUgaW50byB0aGUgY29ycmVzcG9uZGluZwogICAgICAvLyBwb3NpdGlvbiBpbiB0aGUgbGlzdCBvZiB2YWx1ZXMuCiAgICAgIGZvciAodmFyIGZ1dHVyZSBpbiBmdXR1cmVzKSB7CiAgICAgICAgaW50IHBvcyA9IHJlbWFpbmluZzsKICAgICAgICBmdXR1cmUudGhlbigoVCB2YWx1ZSkgewogICAgICAgICAgcmVtYWluaW5nLS07CiAgICAgICAgICBpZiAodmFsdWVzICE9IG51bGwpIHsKICAgICAgICAgICAgdmFsdWVzW3Bvc10gPSB2YWx1ZTsKICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA9PSAwKSB7CiAgICAgICAgICAgICAgcmVzdWx0Ll9jb21wbGV0ZVdpdGhWYWx1ZSh2YWx1ZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoY2xlYW5VcCAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgICAvLyBFbnN1cmUgZXJyb3JzIGZyb20gY2xlYW5VcCBhcmUgdW5jYXVnaHQuCiAgICAgICAgICAgICAgbmV3IEZ1dHVyZS5zeW5jKCgpIHsKICAgICAgICAgICAgICAgIGNsZWFuVXAodmFsdWUpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPT0gMCAmJiAhZWFnZXJFcnJvcikgewogICAgICAgICAgICAgIHJlc3VsdC5fY29tcGxldGVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9LCBvbkVycm9yOiBoYW5kbGVFcnJvcik7CiAgICAgICAgLy8gSW5jcmVtZW50IHRoZSAncmVtYWluaW5nJyBhZnRlciB0aGUgY2FsbCB0byAndGhlbicuCiAgICAgICAgLy8gSWYgdGhhdCBjYWxsIHRocm93cywgd2UgZG9uJ3QgZXhwZWN0IGFueSBmdXR1cmUgY2FsbGJhY2sgZnJvbQogICAgICAgIC8vIHRoZSBmdXR1cmUsIGFuZCB3ZSBhbHNvIGRvbid0IGluY3JlbWVudCByZW1haW5pbmcuCiAgICAgICAgcmVtYWluaW5nKys7CiAgICAgIH0KICAgICAgaWYgKHJlbWFpbmluZyA9PSAwKSB7CiAgICAgICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUoY29uc3QgW10pOwogICAgICB9CiAgICAgIHZhbHVlcyA9IG5ldyBMaXN0PFQ+KHJlbWFpbmluZyk7CiAgICB9IGNhdGNoIChlLCBzdCkgewogICAgICAvLyBUaGUgZXJyb3IgbXVzdCBoYXZlIGJlZW4gdGhyb3duIHdoaWxlIGl0ZXJhdGluZyBvdmVyIHRoZSBmdXR1cmVzCiAgICAgIC8vIGxpc3QsIG9yIHdoaWxlIGluc3RhbGxpbmcgYSBjYWxsYmFjayBoYW5kbGVyIG9uIHRoZSBmdXR1cmUuCiAgICAgIGlmIChyZW1haW5pbmcgPT0gMCB8fCBlYWdlckVycm9yKSB7CiAgICAgICAgLy8gVGhyb3cgYSBuZXcgRnV0dXJlLmVycm9yLgogICAgICAgIC8vIERvbid0IGp1c3QgY2FsbCBgcmVzdWx0Ll9jb21wbGV0ZUVycm9yYCBzaW5jZSB0aGF0IHdvdWxkIHByb3BhZ2F0ZQogICAgICAgIC8vIHRoZSBlcnJvciB0b28gZWFnZXJseSwgbm90IGdpdmluZyB0aGUgY2FsbGVycyB0aW1lIHRvIGluc3RhbGwKICAgICAgICAvLyBlcnJvciBoYW5kbGVycy4KICAgICAgICAvLyBBbHNvLCBkb24ndCB1c2UgYF9hc3luY0NvbXBsZXRlRXJyb3JgIHNpbmNlIHRoYXQgb25lIGRvZXNuJ3QgZ2l2ZQogICAgICAgIC8vIHpvbmVzIHRoZSBjaGFuY2UgdG8gaW50ZXJjZXB0IHRoZSBlcnJvci4KICAgICAgICByZXR1cm4gbmV3IEZ1dHVyZS5lcnJvcihlLCBzdCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gRG9uJ3QgYWxsb2NhdGUgYSBsaXN0IGZvciB2YWx1ZXMsIHRodXMgaW5kaWNhdGluZyB0aGF0IHRoZXJlIHdhcyBhbgogICAgICAgIC8vIGVycm9yLgogICAgICAgIC8vIFNldCBlcnJvciB0byB0aGUgY2F1Z2h0IGV4Y2VwdGlvbi4KICAgICAgICBlcnJvciA9IGU7CiAgICAgICAgc3RhY2tUcmFjZSA9IHN0OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBmaXJzdCBmdXR1cmUgaW4gW2Z1dHVyZXNdIHRvIGNvbXBsZXRlLgogICAqCiAgICogVGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBmaXJzdAogICAqIGZ1dHVyZSBpbiBbZnV0dXJlc10gdG8gcmVwb3J0IHRoYXQgaXQgaXMgY29tcGxldGUsCiAgICogd2hldGhlciBpdCdzIHdpdGggYSB2YWx1ZSBvciBhbiBlcnJvci4KICAgKiBUaGUgcmVzdWx0cyBvZiBhbGwgdGhlIG90aGVyIGZ1dHVyZXMgYXJlIGRpc2NhcmRlZC4KICAgKgogICAqIElmIFtmdXR1cmVzXSBpcyBlbXB0eSwgb3IgaWYgbm9uZSBvZiBpdHMgZnV0dXJlcyBjb21wbGV0ZSwKICAgKiB0aGUgcmV0dXJuZWQgZnV0dXJlIG5ldmVyIGNvbXBsZXRlcy4KICAgKi8KICBzdGF0aWMgRnV0dXJlPFQ+IGFueTxUPihJdGVyYWJsZTxGdXR1cmU8VD4+IGZ1dHVyZXMpIHsKICAgIHZhciBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPFQ+LnN5bmMoKTsKICAgIHZhciBvblZhbHVlID0gKFQgdmFsdWUpIHsKICAgICAgaWYgKCFjb21wbGV0ZXIuaXNDb21wbGV0ZWQpIGNvbXBsZXRlci5jb21wbGV0ZSh2YWx1ZSk7CiAgICB9OwogICAgdmFyIG9uRXJyb3IgPSAoZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2spIHsKICAgICAgaWYgKCFjb21wbGV0ZXIuaXNDb21wbGV0ZWQpIGNvbXBsZXRlci5jb21wbGV0ZUVycm9yKGVycm9yLCBzdGFjayk7CiAgICB9OwogICAgZm9yICh2YXIgZnV0dXJlIGluIGZ1dHVyZXMpIHsKICAgICAgZnV0dXJlLnRoZW4ob25WYWx1ZSwgb25FcnJvcjogb25FcnJvcik7CiAgICB9CiAgICByZXR1cm4gY29tcGxldGVyLmZ1dHVyZTsKICB9CgogIC8qKgogICAqIFBlcmZvcm1zIGFuIGFjdGlvbiBmb3IgZWFjaCBlbGVtZW50IG9mIHRoZSBpdGVyYWJsZSwgaW4gdHVybi4KICAgKgogICAqIFRoZSBbYWN0aW9uXSBtYXkgYmUgZWl0aGVyIHN5bmNocm9ub3VzIG9yIGFzeW5jaHJvbm91cy4KICAgKgogICAqIENhbGxzIFthY3Rpb25dIHdpdGggZWFjaCBlbGVtZW50IGluIFtlbGVtZW50c10gaW4gb3JkZXIuCiAgICogSWYgdGhlIGNhbGwgdG8gW2FjdGlvbl0gcmV0dXJucyBhIGBGdXR1cmU8VD5gLCB0aGUgaXRlcmF0aW9uIHdhaXRzCiAgICogdW50aWwgdGhlIGZ1dHVyZSBpcyBjb21wbGV0ZWQgYmVmb3JlIGNvbnRpbnVpbmcgd2l0aCB0aGUgbmV4dCBlbGVtZW50LgogICAqCiAgICogUmV0dXJucyBhIFtGdXR1cmVdIHRoYXQgY29tcGxldGVzIHdpdGggYG51bGxgIHdoZW4gYWxsIGVsZW1lbnRzIGhhdmUgYmVlbgogICAqIHByb2Nlc3NlZC4KICAgKgogICAqIE5vbi1bRnV0dXJlXSByZXR1cm4gdmFsdWVzLCBhbmQgY29tcGxldGlvbi12YWx1ZXMgb2YgcmV0dXJuZWQgW0Z1dHVyZV1zLAogICAqIGFyZSBkaXNjYXJkZWQuCiAgICoKICAgKiBBbnkgZXJyb3IgZnJvbSBbYWN0aW9uXSwgc3luY2hyb25vdXMgb3IgYXN5bmNocm9ub3VzLAogICAqIHdpbGwgc3RvcCB0aGUgaXRlcmF0aW9uIGFuZCBiZSByZXBvcnRlZCBpbiB0aGUgcmV0dXJuZWQgW0Z1dHVyZV0uCiAgICovCiAgc3RhdGljIEZ1dHVyZSBmb3JFYWNoPFQ+KEl0ZXJhYmxlPFQ+IGVsZW1lbnRzLCBGdXR1cmVPciBhY3Rpb24oVCBlbGVtZW50KSkgewogICAgdmFyIGl0ZXJhdG9yID0gZWxlbWVudHMuaXRlcmF0b3I7CiAgICByZXR1cm4gZG9XaGlsZSgoKSB7CiAgICAgIGlmICghaXRlcmF0b3IubW92ZU5leHQoKSkgcmV0dXJuIGZhbHNlOwogICAgICB2YXIgcmVzdWx0ID0gYWN0aW9uKGl0ZXJhdG9yLmN1cnJlbnQpOwogICAgICBpZiAocmVzdWx0IGlzIEZ1dHVyZSkgcmV0dXJuIHJlc3VsdC50aGVuKF9rVHJ1ZSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSk7CiAgfQoKICAvLyBDb25zdGFudCBgdHJ1ZWAgZnVuY3Rpb24sIHVzZWQgYXMgY2FsbGJhY2sgYnkgW2ZvckVhY2hdLgogIHN0YXRpYyBib29sIF9rVHJ1ZShfKSA9PiB0cnVlOwoKICAvKioKICAgKiBQZXJmb3JtcyBhbiBvcGVyYXRpb24gcmVwZWF0ZWRseSB1bnRpbCBpdCByZXR1cm5zIGBmYWxzZWAuCiAgICoKICAgKiBUaGUgb3BlcmF0aW9uLCBbYWN0aW9uXSwgbWF5IGJlIGVpdGhlciBzeW5jaHJvbm91cyBvciBhc3luY2hyb25vdXMuCiAgICoKICAgKiBUaGUgb3BlcmF0aW9uIGlzIGNhbGxlZCByZXBlYXRlZGx5IGFzIGxvbmcgYXMgaXQgcmV0dXJucyBlaXRoZXIgdGhlIFtib29sXQogICAqIHZhbHVlIGB0cnVlYCBvciBhIGBGdXR1cmU8Ym9vbD5gIHdoaWNoIGNvbXBsZXRlcyB3aXRoIHRoZSB2YWx1ZSBgdHJ1ZWAuCiAgICoKICAgKiBJZiBhIGNhbGwgdG8gW2FjdGlvbl0gcmV0dXJucyBgZmFsc2VgIG9yIGEgW0Z1dHVyZV0gdGhhdCBjb21wbGV0ZXMgdG8KICAgKiBgZmFsc2VgLCBpdGVyYXRpb24gZW5kcyBhbmQgdGhlIGZ1dHVyZSByZXR1cm5lZCBieSBbZG9XaGlsZV0gaXMgY29tcGxldGVkCiAgICogd2l0aCBhIGBudWxsYCB2YWx1ZS4KICAgKgogICAqIElmIGEgY2FsbCB0byBbYWN0aW9uXSB0aHJvd3Mgb3IgYSBmdXR1cmUgcmV0dXJuZWQgYnkgW2FjdGlvbl0gY29tcGxldGVzCiAgICogd2l0aCBhbiBlcnJvciwgaXRlcmF0aW9uIGVuZHMgYW5kIHRoZSBmdXR1cmUgcmV0dXJuZWQgYnkgW2RvV2hpbGVdCiAgICogY29tcGxldGVzIHdpdGggdGhlIHNhbWUgZXJyb3IuCiAgICoKICAgKiBDYWxscyB0byBbYWN0aW9uXSBtYXkgaGFwcGVuIGF0IGFueSB0aW1lLAogICAqIGluY2x1ZGluZyBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIGBkb1doaWxlYC4KICAgKiBUaGUgb25seSByZXN0cmljdGlvbiBpcyBhIG5ldyBjYWxsIHRvIFthY3Rpb25dIHdvbid0IGhhcHBlbiBiZWZvcmUKICAgKiB0aGUgcHJldmlvdXMgY2FsbCBoYXMgcmV0dXJuZWQsIGFuZCBpZiBpdCByZXR1cm5lZCBhIGBGdXR1cmU8Ym9vbD5gLCBub3QKICAgKiB1bnRpbCB0aGF0IGZ1dHVyZSBoYXMgY29tcGxldGVkLgogICAqLwogIHN0YXRpYyBGdXR1cmUgZG9XaGlsZShGdXR1cmVPcjxib29sPiBhY3Rpb24oKSkgewogICAgX0Z1dHVyZSBkb25lU2lnbmFsID0gbmV3IF9GdXR1cmUoKTsKICAgIHZvaWQgRnVuY3Rpb24oYm9vbCkgbmV4dEl0ZXJhdGlvbjsKICAgIC8vIEJpbmQgdGhpcyBjYWxsYmFjayBleHBsaWNpdGx5IHNvIHRoYXQgZWFjaCBpdGVyYXRpb24gaXNuJ3QgYm91bmQgaW4gdGhlCiAgICAvLyBjb250ZXh0IG9mIGFsbCB0aGUgcHJldmlvdXMgaXRlcmF0aW9ucycgY2FsbGJhY2tzLgogICAgLy8gVGhpcyBhdm9pZHMsIGUuZy4sIGRlZXBseSBuZXN0ZWQgc3RhY2sgdHJhY2VzIGZyb20gdGhlIHN0YWNrIHRyYWNlCiAgICAvLyBwYWNrYWdlLgogICAgbmV4dEl0ZXJhdGlvbiA9IFpvbmUuY3VycmVudC5iaW5kVW5hcnlDYWxsYmFja0d1YXJkZWQoKGJvb2wga2VlcEdvaW5nKSB7CiAgICAgIHdoaWxlIChrZWVwR29pbmcpIHsKICAgICAgICBGdXR1cmVPcjxib29sPiByZXN1bHQ7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJlc3VsdCA9IGFjdGlvbigpOwogICAgICAgIH0gY2F0Y2ggKGVycm9yLCBzdGFja1RyYWNlKSB7CiAgICAgICAgICAvLyBDYW5ub3QgdXNlIF9jb21wbGV0ZVdpdGhFcnJvckNhbGxiYWNrIGJlY2F1c2UgaXQgY29tcGxldGVzCiAgICAgICAgICAvLyB0aGUgZnV0dXJlIHN5bmNocm9ub3VzbHkuCiAgICAgICAgICBfYXN5bmNDb21wbGV0ZVdpdGhFcnJvckNhbGxiYWNrKGRvbmVTaWduYWwsIGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHJlc3VsdCBpcyBGdXR1cmU8Ym9vbD4pIHsKICAgICAgICAgIHJlc3VsdC50aGVuKG5leHRJdGVyYXRpb24sIG9uRXJyb3I6IGRvbmVTaWduYWwuX2NvbXBsZXRlRXJyb3IpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBrZWVwR29pbmcgPSByZXN1bHQ7CiAgICAgIH0KICAgICAgZG9uZVNpZ25hbC5fY29tcGxldGUobnVsbCk7CiAgICB9KTsKICAgIG5leHRJdGVyYXRpb24odHJ1ZSk7CiAgICByZXR1cm4gZG9uZVNpZ25hbDsKICB9CgogIC8qKgogICAqIFJlZ2lzdGVyIGNhbGxiYWNrcyB0byBiZSBjYWxsZWQgd2hlbiB0aGlzIGZ1dHVyZSBjb21wbGV0ZXMuCiAgICoKICAgKiBXaGVuIHRoaXMgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIGEgdmFsdWUsCiAgICogdGhlIFtvblZhbHVlXSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoYXQgdmFsdWUuCiAgICogSWYgdGhpcyBmdXR1cmUgaXMgYWxyZWFkeSBjb21wbGV0ZWQsIHRoZSBjYWxsYmFjayB3aWxsIG5vdCBiZSBjYWxsZWQKICAgKiBpbW1lZGlhdGVseSwgYnV0IHdpbGwgYmUgc2NoZWR1bGVkIGluIGEgbGF0ZXIgbWljcm90YXNrLgogICAqCiAgICogSWYgW29uRXJyb3JdIGlzIHByb3ZpZGVkLCBhbmQgdGhpcyBmdXR1cmUgY29tcGxldGVzIHdpdGggYW4gZXJyb3IsCiAgICogdGhlIGBvbkVycm9yYCBjYWxsYmFjayBpcyBjYWxsZWQgd2l0aCB0aGF0IGVycm9yIGFuZCBpdHMgc3RhY2sgdHJhY2UuCiAgICogVGhlIGBvbkVycm9yYCBjYWxsYmFjayBtdXN0IGFjY2VwdCBlaXRoZXIgb25lIGFyZ3VtZW50IG9yIHR3byBhcmd1bWVudHMKICAgKiB3aGVyZSB0aGUgbGF0dGVyIGlzIGEgW1N0YWNrVHJhY2VdLgogICAqIElmIGBvbkVycm9yYCBhY2NlcHRzIHR3byBhcmd1bWVudHMsCiAgICogaXQgaXMgY2FsbGVkIHdpdGggYm90aCB0aGUgZXJyb3IgYW5kIHRoZSBzdGFjayB0cmFjZSwKICAgKiBvdGhlcndpc2UgaXQgaXMgY2FsbGVkIHdpdGgganVzdCB0aGUgZXJyb3Igb2JqZWN0LgogICAqIFRoZSBgb25FcnJvcmAgY2FsbGJhY2sgbXVzdCByZXR1cm4gYSB2YWx1ZSBvciBmdXR1cmUgdGhhdCBjYW4gYmUgdXNlZAogICAqIHRvIGNvbXBsZXRlIHRoZSByZXR1cm5lZCBmdXR1cmUsIHNvIGl0IG11c3QgYmUgc29tZXRoaW5nIGFzc2lnbmFibGUgdG8KICAgKiBgRnV0dXJlT3I8Uj5gLgogICAqCiAgICogUmV0dXJucyBhIG5ldyBbRnV0dXJlXQogICAqIHdoaWNoIGlzIGNvbXBsZXRlZCB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIGNhbGwgdG8gYG9uVmFsdWVgCiAgICogKGlmIHRoaXMgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIGEgdmFsdWUpCiAgICogb3IgdG8gYG9uRXJyb3JgIChpZiB0aGlzIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCBhbiBlcnJvcikuCiAgICoKICAgKiBJZiB0aGUgaW52b2tlZCBjYWxsYmFjayB0aHJvd3MsCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGUgdGhyb3duIGVycm9yCiAgICogYW5kIGEgc3RhY2sgdHJhY2UgZm9yIHRoZSBlcnJvci4KICAgKiBJbiB0aGUgY2FzZSBvZiBgb25FcnJvcmAsCiAgICogaWYgdGhlIGV4Y2VwdGlvbiB0aHJvd24gaXMgYGlkZW50aWNhbGAgdG8gdGhlIGVycm9yIGFyZ3VtZW50IHRvIGBvbkVycm9yYCwKICAgKiB0aGUgdGhyb3cgaXMgY29uc2lkZXJlZCBhIHJldGhyb3csCiAgICogYW5kIHRoZSBvcmlnaW5hbCBzdGFjayB0cmFjZSBpcyB1c2VkIGluc3RlYWQuCiAgICoKICAgKiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBhIFtGdXR1cmVdLAogICAqIHRoZSBmdXR1cmUgcmV0dXJuZWQgYnkgYHRoZW5gIHdpbGwgYmUgY29tcGxldGVkIHdpdGgKICAgKiB0aGUgc2FtZSByZXN1bHQgYXMgdGhlIGZ1dHVyZSByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2suCiAgICoKICAgKiBJZiBbb25FcnJvcl0gaXMgbm90IGdpdmVuLCBhbmQgdGhpcyBmdXR1cmUgY29tcGxldGVzIHdpdGggYW4gZXJyb3IsCiAgICogdGhlIGVycm9yIGlzIGZvcndhcmRlZCBkaXJlY3RseSB0byB0aGUgcmV0dXJuZWQgZnV0dXJlLgogICAqCiAgICogSW4gbW9zdCBjYXNlcywgaXQgaXMgbW9yZSByZWFkYWJsZSB0byB1c2UgW2NhdGNoRXJyb3JdIHNlcGFyYXRlbHksIHBvc3NpYmx5CiAgICogd2l0aCBhIGB0ZXN0YCBwYXJhbWV0ZXIsIGluc3RlYWQgb2YgaGFuZGxpbmcgYm90aCB2YWx1ZSBhbmQgZXJyb3IgaW4gYQogICAqIHNpbmdsZSBbdGhlbl0gY2FsbC4KICAgKgogICAqIE5vdGUgdGhhdCBmdXR1cmVzIGRvbid0IGRlbGF5IHJlcG9ydGluZyBvZiBlcnJvcnMgdW50aWwgbGlzdGVuZXJzIGFyZQogICAqIGFkZGVkLiBJZiB0aGUgZmlyc3QgYHRoZW5gIG9yIGBjYXRjaEVycm9yYCBjYWxsIGhhcHBlbnMgYWZ0ZXIgdGhpcyBmdXR1cmUKICAgKiBoYXMgY29tcGxldGVkIHdpdGggYW4gZXJyb3IgdGhlbiB0aGUgZXJyb3IgaXMgcmVwb3J0ZWQgYXMgdW5oYW5kbGVkIGVycm9yLgogICAqIFNlZSB0aGUgZGVzY3JpcHRpb24gb24gW0Z1dHVyZV0uCiAgICovCiAgRnV0dXJlPFI+IHRoZW48Uj4oRnV0dXJlT3I8Uj4gb25WYWx1ZShUIHZhbHVlKSwge0Z1bmN0aW9uIG9uRXJyb3J9KTsKCiAgLyoqCiAgICogSGFuZGxlcyBlcnJvcnMgZW1pdHRlZCBieSB0aGlzIFtGdXR1cmVdLgogICAqCiAgICogVGhpcyBpcyB0aGUgYXN5bmNocm9ub3VzIGVxdWl2YWxlbnQgb2YgYSAiY2F0Y2giIGJsb2NrLgogICAqCiAgICogUmV0dXJucyBhIG5ldyBbRnV0dXJlXSB0aGF0IHdpbGwgYmUgY29tcGxldGVkIHdpdGggZWl0aGVyIHRoZSByZXN1bHQgb2YKICAgKiB0aGlzIGZ1dHVyZSBvciB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIGBvbkVycm9yYCBjYWxsYmFjay4KICAgKgogICAqIElmIHRoaXMgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIGEgdmFsdWUsCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCB0aGUgc2FtZSB2YWx1ZS4KICAgKgogICAqIElmIHRoaXMgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIGFuIGVycm9yLAogICAqIHRoZW4gW3Rlc3RdIGlzIGZpcnN0IGNhbGxlZCB3aXRoIHRoZSBlcnJvciB2YWx1ZS4KICAgKgogICAqIElmIGB0ZXN0YCByZXR1cm5zIGZhbHNlLCB0aGUgZXhjZXB0aW9uIGlzIG5vdCBoYW5kbGVkIGJ5IHRoaXMgYGNhdGNoRXJyb3JgLAogICAqIGFuZCB0aGUgcmV0dXJuZWQgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIHRoZSBzYW1lIGVycm9yIGFuZCBzdGFjayB0cmFjZQogICAqIGFzIHRoaXMgZnV0dXJlLgogICAqCiAgICogSWYgYHRlc3RgIHJldHVybnMgYHRydWVgLAogICAqIFtvbkVycm9yXSBpcyBjYWxsZWQgd2l0aCB0aGUgZXJyb3IgYW5kIHBvc3NpYmx5IHN0YWNrIHRyYWNlLAogICAqIGFuZCB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoZSByZXN1bHQgb2YgdGhpcyBjYWxsCiAgICogaW4gZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgZm9yIFt0aGVuXSdzIGBvbkVycm9yYC4KICAgKgogICAqIElmIGB0ZXN0YCBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBhIGZ1bmN0aW9uIHRoYXQgYWx3YXlzIHJldHVybnMgdHJ1ZS4KICAgKiBUaGUgYHRlc3RgIGZ1bmN0aW9uIHNob3VsZCBub3QgdGhyb3csIGJ1dCBpZiBpdCBkb2VzLCBpdCBpcyBoYW5kbGVkIGFzCiAgICogaWYgdGhlIGBvbkVycm9yYCBmdW5jdGlvbiBoYWQgdGhyb3duLgogICAqCiAgICogTm90ZSB0aGF0IGZ1dHVyZXMgZG9uJ3QgZGVsYXkgcmVwb3J0aW5nIG9mIGVycm9ycyB1bnRpbCBsaXN0ZW5lcnMgYXJlCiAgICogYWRkZWQuIElmIHRoZSBmaXJzdCBgY2F0Y2hFcnJvcmAgKG9yIGB0aGVuYCkgY2FsbCBoYXBwZW5zIGFmdGVyIHRoaXMgZnV0dXJlCiAgICogaGFzIGNvbXBsZXRlZCB3aXRoIGFuIGVycm9yIHRoZW4gdGhlIGVycm9yIGlzIHJlcG9ydGVkIGFzIHVuaGFuZGxlZCBlcnJvci4KICAgKiBTZWUgdGhlIGRlc2NyaXB0aW9uIG9uIFtGdXR1cmVdLgogICAqLwogIC8vIFRoZSBgRnVuY3Rpb25gIGJlbG93IHN0YW5kcyBmb3Igb25lIG9mIHR3byB0eXBlczoKICAvLyAtIChkeW5hbWljKSAtPiBGdXR1cmVPcjxUPgogIC8vIC0gKGR5bmFtaWMsIFN0YWNrVHJhY2UpIC0+IEZ1dHVyZU9yPFQ+CiAgLy8gR2l2ZW4gdGhhdCB0aGVyZSBpcyBhIGB0ZXN0YCBmdW5jdGlvbiB0aGF0IGlzIHVzdWFsbHkgdXNlZCB0byBkbyBhbgogIC8vIGBpc0NoZWNrYCB3ZSBzaG91bGQgYWxzbyBleHBlY3QgZnVuY3Rpb25zIHRoYXQgdGFrZSBhIHNwZWNpZmljIGFyZ3VtZW50LgogIC8vIE5vdGU6IG1ha2luZyBgY2F0Y2hFcnJvcmAgcmV0dXJuIGEgYEZ1dHVyZTxUPmAgaW4gbm9uLXN0cm9uZyBtb2RlIGNvdWxkIGJlCiAgLy8gYSBicmVha2luZyBjaGFuZ2UuCiAgRnV0dXJlPFQ+IGNhdGNoRXJyb3IoRnVuY3Rpb24gb25FcnJvciwge2Jvb2wgdGVzdChPYmplY3QgZXJyb3IpfSk7CgogIC8qKgogICAqIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoaXMgZnV0dXJlIGNvbXBsZXRlcy4KICAgKgogICAqIFRoZSBbYWN0aW9uXSBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGlzIGZ1dHVyZSBjb21wbGV0ZXMsIHdoZXRoZXIgaXQKICAgKiBkb2VzIHNvIHdpdGggYSB2YWx1ZSBvciB3aXRoIGFuIGVycm9yLgogICAqCiAgICogVGhpcyBpcyB0aGUgYXN5bmNocm9ub3VzIGVxdWl2YWxlbnQgb2YgYSAiZmluYWxseSIgYmxvY2suCiAgICoKICAgKiBUaGUgZnV0dXJlIHJldHVybmVkIGJ5IHRoaXMgY2FsbCwgYGZgLCB3aWxsIGNvbXBsZXRlIHRoZSBzYW1lIHdheQogICAqIGFzIHRoaXMgZnV0dXJlIHVubGVzcyBhbiBlcnJvciBvY2N1cnMgaW4gdGhlIFthY3Rpb25dIGNhbGwsIG9yIGluCiAgICogYSBbRnV0dXJlXSByZXR1cm5lZCBieSB0aGUgW2FjdGlvbl0gY2FsbC4gSWYgdGhlIGNhbGwgdG8gW2FjdGlvbl0KICAgKiBkb2VzIG5vdCByZXR1cm4gYSBmdXR1cmUsIGl0cyByZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4KICAgKgogICAqIElmIHRoZSBjYWxsIHRvIFthY3Rpb25dIHRocm93cywgdGhlbiBgZmAgaXMgY29tcGxldGVkIHdpdGggdGhlCiAgICogdGhyb3duIGVycm9yLgogICAqCiAgICogSWYgdGhlIGNhbGwgdG8gW2FjdGlvbl0gcmV0dXJucyBhIFtGdXR1cmVdLCBgZjJgLCB0aGVuIGNvbXBsZXRpb24gb2YKICAgKiBgZmAgaXMgZGVsYXllZCB1bnRpbCBgZjJgIGNvbXBsZXRlcy4gSWYgYGYyYCBjb21wbGV0ZXMgd2l0aAogICAqIGFuIGVycm9yLCB0aGF0IHdpbGwgYmUgdGhlIHJlc3VsdCBvZiBgZmAgdG9vLiBUaGUgdmFsdWUgb2YgYGYyYCBpcyBhbHdheXMKICAgKiBpZ25vcmVkLgogICAqCiAgICogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0bzoKICAgKgogICAqICAgICBGdXR1cmU8VD4gd2hlbkNvbXBsZXRlKGFjdGlvbigpKSB7CiAgICogICAgICAgcmV0dXJuIHRoaXMudGhlbigodikgewogICAqICAgICAgICAgdmFyIGYyID0gYWN0aW9uKCk7CiAgICogICAgICAgICBpZiAoZjIgaXMgRnV0dXJlKSByZXR1cm4gZjIudGhlbigoXykgPT4gdik7CiAgICogICAgICAgICByZXR1cm4gdgogICAqICAgICAgIH0sIG9uRXJyb3I6IChlKSB7CiAgICogICAgICAgICB2YXIgZjIgPSBhY3Rpb24oKTsKICAgKiAgICAgICAgIGlmIChmMiBpcyBGdXR1cmUpIHJldHVybiBmMi50aGVuKChfKSB7IHRocm93IGU7IH0pOwogICAqICAgICAgICAgdGhyb3cgZTsKICAgKiAgICAgICB9KTsKICAgKiAgICAgfQogICAqLwogIEZ1dHVyZTxUPiB3aGVuQ29tcGxldGUoRnV0dXJlT3IgYWN0aW9uKCkpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW1N0cmVhbV0gY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIHRoaXMgZnV0dXJlLgogICAqCiAgICogVGhlIHN0cmVhbSB3aWxsIHByb2R1Y2Ugc2luZ2xlIGRhdGEgb3IgZXJyb3IgZXZlbnQgY29udGFpbmluZyB0aGUKICAgKiBjb21wbGV0aW9uIHJlc3VsdCBvZiB0aGlzIGZ1dHVyZSwgYW5kIHRoZW4gaXQgd2lsbCBjbG9zZSB3aXRoIGEKICAgKiBkb25lIGV2ZW50LgogICAqCiAgICogSWYgdGhlIGZ1dHVyZSBuZXZlciBjb21wbGV0ZXMsIHRoZSBzdHJlYW0gd2lsbCBub3QgcHJvZHVjZSBhbnkgZXZlbnRzLgogICAqLwogIFN0cmVhbTxUPiBhc1N0cmVhbSgpOwoKICAvKioKICAgKiBUaW1lLW91dCB0aGUgZnV0dXJlIGNvbXB1dGF0aW9uIGFmdGVyIFt0aW1lTGltaXRdIGhhcyBwYXNzZWQuCiAgICoKICAgKiBSZXR1cm5zIGEgbmV3IGZ1dHVyZSB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoZSBzYW1lIHZhbHVlIGFzIHRoaXMgZnV0dXJlLAogICAqIGlmIHRoaXMgZnV0dXJlIGNvbXBsZXRlcyBpbiB0aW1lLgogICAqCiAgICogSWYgdGhpcyBmdXR1cmUgZG9lcyBub3QgY29tcGxldGUgYmVmb3JlIGB0aW1lTGltaXRgIGhhcyBwYXNzZWQsCiAgICogdGhlIFtvblRpbWVvdXRdIGFjdGlvbiBpcyBleGVjdXRlZCBpbnN0ZWFkLCBhbmQgaXRzIHJlc3VsdCAod2hldGhlciBpdAogICAqIHJldHVybnMgb3IgdGhyb3dzKSBpcyB1c2VkIGFzIHRoZSByZXN1bHQgb2YgdGhlIHJldHVybmVkIGZ1dHVyZS4KICAgKiBUaGUgW29uVGltZW91dF0gZnVuY3Rpb24gbXVzdCByZXR1cm4gYSBbVF0gb3IgYSBgRnV0dXJlPFQ+YC4KICAgKgogICAqIElmIGBvblRpbWVvdXRgIGlzIG9taXR0ZWQsIGEgdGltZW91dCB3aWxsIGNhdXNlIHRoZSByZXR1cm5lZCBmdXR1cmUgdG8KICAgKiBjb21wbGV0ZSB3aXRoIGEgW1RpbWVvdXRFeGNlcHRpb25dLgogICAqLwogIEZ1dHVyZTxUPiB0aW1lb3V0KER1cmF0aW9uIHRpbWVMaW1pdCwge0Z1dHVyZU9yPFQ+IG9uVGltZW91dCgpfSk7Cn0KCi8qKgogKiBUaHJvd24gd2hlbiBhIHNjaGVkdWxlZCB0aW1lb3V0IGhhcHBlbnMgd2hpbGUgd2FpdGluZyBmb3IgYW4gYXN5bmMgcmVzdWx0LgogKi8KY2xhc3MgVGltZW91dEV4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbiB7CiAgLyoqIERlc2NyaXB0aW9uIG9mIHRoZSBjYXVzZSBvZiB0aGUgdGltZW91dC4gKi8KICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKICAvKiogVGhlIGR1cmF0aW9uIHRoYXQgd2FzIGV4Y2VlZGVkLiAqLwogIGZpbmFsIER1cmF0aW9uIGR1cmF0aW9uOwoKICBUaW1lb3V0RXhjZXB0aW9uKHRoaXMubWVzc2FnZSwgW3RoaXMuZHVyYXRpb25dKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nIHJlc3VsdCA9ICJUaW1lb3V0RXhjZXB0aW9uIjsKICAgIGlmIChkdXJhdGlvbiAhPSBudWxsKSByZXN1bHQgPSAiVGltZW91dEV4Y2VwdGlvbiBhZnRlciAkZHVyYXRpb24iOwogICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgcmVzdWx0ID0gIiRyZXN1bHQ6ICRtZXNzYWdlIjsKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CgovKioKICogQSB3YXkgdG8gcHJvZHVjZSBGdXR1cmUgb2JqZWN0cyBhbmQgdG8gY29tcGxldGUgdGhlbSBsYXRlcgogKiB3aXRoIGEgdmFsdWUgb3IgZXJyb3IuCiAqCiAqIE1vc3Qgb2YgdGhlIHRpbWUsIHRoZSBzaW1wbGVzdCB3YXkgdG8gY3JlYXRlIGEgZnV0dXJlIGlzIHRvIGp1c3QgdXNlCiAqIG9uZSBvZiB0aGUgW0Z1dHVyZV0gY29uc3RydWN0b3JzIHRvIGNhcHR1cmUgdGhlIHJlc3VsdCBvZiBhIHNpbmdsZQogKiBhc3luY2hyb25vdXMgY29tcHV0YXRpb246CiAqIGBgYAogKiBuZXcgRnV0dXJlKCgpIHsgZG9Tb21ldGhpbmcoKTsgcmV0dXJuIHJlc3VsdDsgfSk7CiAqIGBgYAogKiBvciwgaWYgdGhlIGZ1dHVyZSByZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgYSBzZXF1ZW5jZSBvZiBhc3luY2hyb25vdXMKICogY29tcHV0YXRpb25zLCB0aGV5IGNhbiBiZSBjaGFpbmVkIHVzaW5nIFtGdXR1cmUudGhlbl0gb3Igc2ltaWxhciBmdW5jdGlvbnMKICogb24gW0Z1dHVyZV06CiAqIGBgYAogKiBGdXR1cmUgZG9TdHVmZigpewogKiAgIHJldHVybiBzb21lQXN5bmNPcGVyYXRpb24oKS50aGVuKChyZXN1bHQpIHsKICogICAgIHJldHVybiBzb21lT3RoZXJBc3luY09wZXJhdGlvbihyZXN1bHQpOwogKiAgIH0pOwogKiB9CiAqIGBgYAogKiBJZiB5b3UgZG8gbmVlZCB0byBjcmVhdGUgYSBGdXR1cmUgZnJvbSBzY3JhdGNoIOKAlCBmb3IgZXhhbXBsZSwKICogd2hlbiB5b3UncmUgY29udmVydGluZyBhIGNhbGxiYWNrLWJhc2VkIEFQSSBpbnRvIGEgRnV0dXJlLWJhc2VkCiAqIG9uZSDigJQgeW91IGNhbiB1c2UgYSBDb21wbGV0ZXIgYXMgZm9sbG93czoKICogYGBgCiAqIGNsYXNzIEFzeW5jT3BlcmF0aW9uIHsKICogICBDb21wbGV0ZXIgX2NvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXIoKTsKICoKICogICBGdXR1cmU8VD4gZG9PcGVyYXRpb24oKSB7CiAqICAgICBfc3RhcnRPcGVyYXRpb24oKTsKICogICAgIHJldHVybiBfY29tcGxldGVyLmZ1dHVyZTsgLy8gU2VuZCBmdXR1cmUgb2JqZWN0IGJhY2sgdG8gY2xpZW50LgogKiAgIH0KICoKICogICAvLyBTb21ldGhpbmcgY2FsbHMgdGhpcyB3aGVuIHRoZSB2YWx1ZSBpcyByZWFkeS4KICogICB2b2lkIF9maW5pc2hPcGVyYXRpb24oVCByZXN1bHQpIHsKICogICAgIF9jb21wbGV0ZXIuY29tcGxldGUocmVzdWx0KTsKICogICB9CiAqCiAqICAgLy8gSWYgc29tZXRoaW5nIGdvZXMgd3JvbmcsIGNhbGwgdGhpcy4KICogICB2b2lkIF9lcnJvckhhcHBlbmVkKGVycm9yKSB7CiAqICAgICBfY29tcGxldGVyLmNvbXBsZXRlRXJyb3IoZXJyb3IpOwogKiAgIH0KICogfQogKiBgYGAKICovCmFic3RyYWN0IGNsYXNzIENvbXBsZXRlcjxUPiB7CiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBjb21wbGV0ZXIuCiAgICoKICAgKiBUaGUgZ2VuZXJhbCB3b3JrZmxvdyBmb3IgY3JlYXRpbmcgYSBuZXcgZnV0dXJlIGlzIHRvIDEpIGNyZWF0ZSBhCiAgICogbmV3IGNvbXBsZXRlciwgMikgaGFuZCBvdXQgaXRzIGZ1dHVyZSwgYW5kLCBhdCBhIGxhdGVyIHBvaW50LCAzKSBpbnZva2UKICAgKiBlaXRoZXIgW2NvbXBsZXRlXSBvciBbY29tcGxldGVFcnJvcl0uCiAgICoKICAgKiBUaGUgY29tcGxldGVyIGNvbXBsZXRlcyB0aGUgZnV0dXJlIGFzeW5jaHJvbm91c2x5LiBUaGF0IG1lYW5zIHRoYXQKICAgKiBjYWxsYmFja3MgcmVnaXN0ZXJlZCBvbiB0aGUgZnV0dXJlIGFyZSBub3QgY2FsbGVkIGltbWVkaWF0ZWx5IHdoZW4KICAgKiBbY29tcGxldGVdIG9yIFtjb21wbGV0ZUVycm9yXSBpcyBjYWxsZWQuIEluc3RlYWQgdGhlIGNhbGxiYWNrcyBhcmUKICAgKiBkZWxheWVkIHVudGlsIGEgbGF0ZXIgbWljcm90YXNrLgogICAqCiAgICogRXhhbXBsZToKICAgKiBgYGAKICAgKiB2YXIgY29tcGxldGVyID0gbmV3IENvbXBsZXRlcigpOwogICAqIGhhbmRPdXQoY29tcGxldGVyLmZ1dHVyZSk7CiAgICogbGF0ZXI6IHsKICAgKiAgIGNvbXBsZXRlci5jb21wbGV0ZSgnY29tcGxldGlvbiB2YWx1ZScpOwogICAqIH0KICAgKiBgYGAKICAgKi8KICBmYWN0b3J5IENvbXBsZXRlcigpID0+IG5ldyBfQXN5bmNDb21wbGV0ZXI8VD4oKTsKCiAgLyoqCiAgICogQ29tcGxldGVzIHRoZSBmdXR1cmUgc3luY2hyb25vdXNseS4KICAgKgogICAqIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkIGJlIGF2b2lkZWQgdW5sZXNzIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBmdXR1cmUgaXMKICAgKiBrbm93biB0byBiZSB0aGUgZmluYWwgcmVzdWx0IG9mIGFub3RoZXIgYXN5bmNocm9ub3VzIG9wZXJhdGlvbi4gSWYgaW4gZG91YnQKICAgKiB1c2UgdGhlIGRlZmF1bHQgW0NvbXBsZXRlcl0gY29uc3RydWN0b3IuCiAgICoKICAgKiBVc2luZyBhbiBub3JtYWwsIGFzeW5jaHJvbm91cywgY29tcGxldGVyIHdpbGwgbmV2ZXIgZ2l2ZSB0aGUgd3JvbmcKICAgKiBiZWhhdmlvciwgYnV0IHVzaW5nIGEgc3luY2hyb25vdXMgY29tcGxldGVyIGluY29ycmVjdGx5IGNhbiBjYXVzZQogICAqIG90aGVyd2lzZSBjb3JyZWN0IHByb2dyYW1zIHRvIGJyZWFrLgogICAqCiAgICogQSBzeW5jaHJvbm91cyBjb21wbGV0ZXIgaXMgb25seSBpbnRlbmRlZCBmb3Igb3B0aW1pemluZyBldmVudAogICAqIHByb3BhZ2F0aW9uIHdoZW4gb25lIGFzeW5jaHJvbm91cyBldmVudCBpbW1lZGlhdGVseSB0cmlnZ2VycyBhbm90aGVyLgogICAqIEl0IHNob3VsZCBub3QgYmUgdXNlZCB1bmxlc3MgdGhlIGNhbGxzIHRvIFtjb21wbGV0ZV0gYW5kIFtjb21wbGV0ZUVycm9yXQogICAqIGFyZSBndWFyYW50ZWVkIHRvIG9jY3VyIGluIHBsYWNlcyB3aGVyZSBpdCB3b24ndCBicmVhayBgRnV0dXJlYCBpbnZhcmlhbnRzLgogICAqCiAgICogQ29tcGxldGluZyBzeW5jaHJvbm91c2x5IG1lYW5zIHRoYXQgdGhlIGNvbXBsZXRlcidzIGZ1dHVyZSB3aWxsIGJlCiAgICogY29tcGxldGVkIGltbWVkaWF0ZWx5IHdoZW4gY2FsbGluZyB0aGUgW2NvbXBsZXRlXSBvciBbY29tcGxldGVFcnJvcl0KICAgKiBtZXRob2Qgb24gYSBzeW5jaHJvbm91cyBjb21wbGV0ZXIsIHdoaWNoIGFsc28gY2FsbHMgYW55IGNhbGxiYWNrcwogICAqIHJlZ2lzdGVyZWQgb24gdGhhdCBmdXR1cmUuCiAgICoKICAgKiBDb21wbGV0aW5nIHN5bmNocm9ub3VzbHkgbXVzdCBub3QgYnJlYWsgdGhlIHJ1bGUgdGhhdCB3aGVuIHlvdSBhZGQgYQogICAqIGNhbGxiYWNrIG9uIGEgZnV0dXJlLCB0aGF0IGNhbGxiYWNrIG11c3Qgbm90IGJlIGNhbGxlZCB1bnRpbCB0aGUgY29kZQogICAqIHRoYXQgYWRkZWQgdGhlIGNhbGxiYWNrIGhhcyBjb21wbGV0ZWQuCiAgICogRm9yIHRoYXQgcmVhc29uLCBhIHN5bmNocm9ub3VzIGNvbXBsZXRpb24gbXVzdCBvbmx5IG9jY3VyIGF0IHRoZSB2ZXJ5IGVuZAogICAqIChpbiAidGFpbCBwb3NpdGlvbiIpIG9mIGFub3RoZXIgc3luY2hyb25vdXMgZXZlbnQsCiAgICogYmVjYXVzZSBhdCB0aGF0IHBvaW50LCBjb21wbGV0aW5nIHRoZSBmdXR1cmUgaW1tZWRpYXRlbHkgaXMgYmUgZXF1aXZhbGVudAogICAqIHRvIHJldHVybmluZyB0byB0aGUgZXZlbnQgbG9vcCBhbmQgY29tcGxldGluZyB0aGUgZnV0dXJlIGluIHRoZSBuZXh0CiAgICogbWljcm90YXNrLgogICAqCiAgICogRXhhbXBsZToKICAgKgogICAqICAgICB2YXIgY29tcGxldGVyID0gbmV3IENvbXBsZXRlci5zeW5jKCk7CiAgICogICAgIC8vIFRoZSBjb21wbGV0aW9uIGlzIHRoZSByZXN1bHQgb2YgdGhlIGFzeW5jaHJvbm91cyBvbkRvbmUgZXZlbnQuCiAgICogICAgIC8vIE5vIG90aGVyIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgYWZ0ZXIgdGhlIGNvbXBsZXRpb24uIEl0IGlzIHNhZmUKICAgKiAgICAgLy8gdG8gdXNlIHRoZSBDb21wbGV0ZXIuc3luYyBjb25zdHJ1Y3Rvci4KICAgKiAgICAgc3RyZWFtLmxpc3RlbihwcmludCwgb25Eb25lOiAoKSB7IGNvbXBsZXRlci5jb21wbGV0ZSgiZG9uZSIpOyB9KTsKICAgKgogICAqIEJhZCBleGFtcGxlLiBEbyBub3QgdXNlIHRoaXMgY29kZS4gT25seSBmb3IgaWxsdXN0cmF0aXZlIHB1cnBvc2VzOgogICAqCiAgICogICAgIHZhciBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyLnN5bmMoKTsKICAgKiAgICAgY29tcGxldGVyLmZ1dHVyZS50aGVuKChfKSB7IGJhcigpOyB9KTsKICAgKiAgICAgLy8gVGhlIGNvbXBsZXRpb24gaXMgdGhlIHJlc3VsdCBvZiB0aGUgYXN5bmNocm9ub3VzIG9uRG9uZSBldmVudC4KICAgKiAgICAgLy8gSG93ZXZlciwgdGhlcmUgaXMgc3RpbGwgY29kZSBleGVjdXRlZCBhZnRlciB0aGUgY29tcGxldGlvbi4gVGhpcwogICAqICAgICAvLyBvcGVyYXRpb24gaXMgKm5vdCogc2FmZS4KICAgKiAgICAgc3RyZWFtLmxpc3RlbihwcmludCwgb25Eb25lOiAoKSB7CiAgICogICAgICAgY29tcGxldGVyLmNvbXBsZXRlKCJkb25lIik7CiAgICogICAgICAgZm9vKCk7ICAvLyBJbiB0aGlzIGNhc2UsIGZvbygpIHJ1bnMgYWZ0ZXIgYmFyKCkuCiAgICogICAgIH0pOwogICAqLwogIGZhY3RvcnkgQ29tcGxldGVyLnN5bmMoKSA9PiBuZXcgX1N5bmNDb21wbGV0ZXI8VD4oKTsKCiAgLyoqCiAgICogVGhlIGZ1dHVyZSB0aGF0IGlzIGNvbXBsZXRlZCBieSB0aGlzIGNvbXBsZXRlci4KICAgKgogICAqIFRoZSBmdXR1cmUgdGhhdCBpcyBjb21wbGV0ZWQgd2hlbiBbY29tcGxldGVdIG9yIFtjb21wbGV0ZUVycm9yXSBpcyBjYWxsZWQuCiAgICovCiAgRnV0dXJlPFQ+IGdldCBmdXR1cmU7CgogIC8qKgogICAqIENvbXBsZXRlcyBbZnV0dXJlXSB3aXRoIHRoZSBzdXBwbGllZCB2YWx1ZXMuCiAgICoKICAgKiBUaGUgdmFsdWUgbXVzdCBiZSBlaXRoZXIgYSB2YWx1ZSBvZiB0eXBlIFtUXQogICAqIG9yIGEgZnV0dXJlIG9mIHR5cGUgYEZ1dHVyZTxUPmAuCiAgICoKICAgKiBJZiB0aGUgdmFsdWUgaXMgaXRzZWxmIGEgZnV0dXJlLCB0aGUgY29tcGxldGVyIHdpbGwgd2FpdCBmb3IgdGhhdCBmdXR1cmUKICAgKiB0byBjb21wbGV0ZSwgYW5kIGNvbXBsZXRlIHdpdGggdGhlIHNhbWUgcmVzdWx0LCB3aGV0aGVyIGl0IGlzIGEgc3VjY2VzcwogICAqIG9yIGFuIGVycm9yLgogICAqCiAgICogQ2FsbGluZyBbY29tcGxldGVdIG9yIFtjb21wbGV0ZUVycm9yXSBtdXN0IGJlIGRvbmUgYXQgbW9zdCBvbmNlLgogICAqCiAgICogQWxsIGxpc3RlbmVycyBvbiB0aGUgZnV0dXJlIGFyZSBpbmZvcm1lZCBhYm91dCB0aGUgdmFsdWUuCiAgICovCiAgdm9pZCBjb21wbGV0ZShbRnV0dXJlT3I8VD4gdmFsdWVdKTsKCiAgLyoqCiAgICogQ29tcGxldGUgW2Z1dHVyZV0gd2l0aCBhbiBlcnJvci4KICAgKgogICAqIENhbGxpbmcgW2NvbXBsZXRlXSBvciBbY29tcGxldGVFcnJvcl0gbXVzdCBiZSBkb25lIGF0IG1vc3Qgb25jZS4KICAgKgogICAqIENvbXBsZXRpbmcgYSBmdXR1cmUgd2l0aCBhbiBlcnJvciBpbmRpY2F0ZXMgdGhhdCBhbiBleGNlcHRpb24gd2FzIHRocm93bgogICAqIHdoaWxlIHRyeWluZyB0byBwcm9kdWNlIGEgdmFsdWUuCiAgICoKICAgKiBJZiBbZXJyb3JdIGlzIGBudWxsYCwgaXQgaXMgcmVwbGFjZWQgYnkgYSBbTnVsbFRocm93bkVycm9yXS4KICAgKgogICAqIElmIGBlcnJvcmAgaXMgYSBgRnV0dXJlYCwgdGhlIGZ1dHVyZSBpdHNlbGYgaXMgdXNlZCBhcyB0aGUgZXJyb3IgdmFsdWUuCiAgICogSWYgeW91IHdhbnQgdG8gY29tcGxldGUgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBmdXR1cmUsIHlvdSBjYW4gdXNlOgogICAqIGBgYAogICAqIHRoaXNDb21wbGV0ZXIuY29tcGxldGUodGhlRnV0dXJlKQogICAqIGBgYAogICAqIG9yIGlmIHlvdSBvbmx5IHdhbnQgdG8gaGFuZGxlIGFuIGVycm9yIGZyb20gdGhlIGZ1dHVyZToKICAgKiBgYGAKICAgKiB0aGVGdXR1cmUuY2F0Y2hFcnJvcih0aGlzQ29tcGxldGVyLmNvbXBsZXRlRXJyb3IpOwogICAqIGBgYAogICAqLwogIHZvaWQgY29tcGxldGVFcnJvcihPYmplY3QgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKTsKCiAgLyoqCiAgICogV2hldGhlciB0aGUgW2Z1dHVyZV0gaGFzIGJlZW4gY29tcGxldGVkLgogICAqCiAgICogUmVmbGVjdHMgd2hldGhlciBbY29tcGxldGVdIG9yIFtjb21wbGV0ZUVycm9yXSBoYXMgYmVlbiBjYWxsZWQuCiAgICogQSBgdHJ1ZWAgdmFsdWUgZG9lc24ndCBuZWNlc3NhcmlseSBtZWFuIHRoYXQgbGlzdGVuZXJzIG9mIHRoaXMgZnV0dXJlCiAgICogaGF2ZSBiZWVuIGludm9rZWQgeWV0LCBlaXRoZXIgYmVjYXVzZSB0aGUgY29tcGxldGVyIHVzdWFsbHkgd2FpdHMgdW50aWwKICAgKiBhIGxhdGVyIG1pY3JvdGFzayB0byBwcm9wYWdhdGUgdGhlIHJlc3VsdCwgb3IgYmVjYXVzZSBbY29tcGxldGVdCiAgICogd2FzIGNhbGxlZCB3aXRoIGEgZnV0dXJlIHRoYXQgaGFzbid0IGNvbXBsZXRlZCB5ZXQuCiAgICoKICAgKiBXaGVuIHRoaXMgdmFsdWUgaXMgYHRydWVgLCBbY29tcGxldGVdIGFuZCBbY29tcGxldGVFcnJvcl0gbXVzdCBub3QgYmUKICAgKiBjYWxsZWQgYWdhaW4uCiAgICovCiAgYm9vbCBnZXQgaXNDb21wbGV0ZWQ7Cn0KCi8vIEhlbHBlciBmdW5jdGlvbiBjb21wbGV0aW5nIGEgX0Z1dHVyZSB3aXRoIGVycm9yLCBidXQgY2hlY2tpbmcgdGhlIHpvbmUKLy8gZm9yIGVycm9yIHJlcGxhY2VtZW50IGZpcnN0Lgp2b2lkIF9jb21wbGV0ZVdpdGhFcnJvckNhbGxiYWNrKF9GdXR1cmUgcmVzdWx0LCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgQXN5bmNFcnJvciByZXBsYWNlbWVudCA9IFpvbmUuY3VycmVudC5lcnJvckNhbGxiYWNrKGVycm9yLCBzdGFja1RyYWNlKTsKICBpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgewogICAgZXJyb3IgPSBfbm9uTnVsbEVycm9yKHJlcGxhY2VtZW50LmVycm9yKTsKICAgIHN0YWNrVHJhY2UgPSByZXBsYWNlbWVudC5zdGFja1RyYWNlOwogIH0KICByZXN1bHQuX2NvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwp9CgovLyBMaWtlIFtfY29tcGxldGVXaXRoRXJyb3JDYWxsYmFja10gYnV0IGNvbXBsZXRlcyBhc3luY2hyb25vdXNseS4Kdm9pZCBfYXN5bmNDb21wbGV0ZVdpdGhFcnJvckNhbGxiYWNrKAogICAgX0Z1dHVyZSByZXN1bHQsIGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICBBc3lu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bnZva2VzIHRoZSBzcGVjaWZpZWQgY2FsbGJhY2sgZnVuY3Rpb24uCiAqIFVzZSBhIHBlcmlvZGljIHRpbWVyIHRvIHJlcGVhdGVkbHkgY291bnQgZG93biB0aGUgc2FtZSBpbnRlcnZhbC4KICoKICogQSBuZWdhdGl2ZSBkdXJhdGlvbiBpcyB0cmVhdGVkIHRoZSBzYW1lIGFzIGEgZHVyYXRpb24gb2YgMC4KICogSWYgdGhlIGR1cmF0aW9uIGlzIHN0YXRpY2FsbHkga25vd24gdG8gYmUgMCwgY29uc2lkZXIgdXNpbmcgW3J1bl0uCiAqCiAqIEZyZXF1ZW50bHkgdGhlIGR1cmF0aW9uIGlzIGVpdGhlciBhIGNvbnN0YW50IG9yIGNvbXB1dGVkIGFzIGluIHRoZQogKiBmb2xsb3dpbmcgZXhhbXBsZSAodGFraW5nIGFkdmFudGFnZSBvZiB0aGUgbXVsdGlwbGljYXRpb24gb3BlcmF0b3Igb2YKICogdGhlIFtEdXJhdGlvbl0gY2xhc3MpOgogKiBgYGBkYXJ0CiAqIGNvbnN0IHRpbWVvdXQgPSBjb25zdCBEdXJhdGlvbihzZWNvbmRzOiAzKTsKICogY29uc3QgbXMgPSBjb25zdCBEdXJhdGlvbihtaWxsaXNlY29uZHM6IDEpOwogKgogKiBzdGFydFRpbWVvdXQoW2ludCBtaWxsaXNlY29uZHNdKSB7CiAqICAgdmFyIGR1cmF0aW9uID0gbWlsbGlzZWNvbmRzID09IG51bGwgPyB0aW1lb3V0IDogbXMgKiBtaWxsaXNlY29uZHM7CiAqICAgcmV0dXJuIG5ldyBUaW1lcihkdXJhdGlvbiwgaGFuZGxlVGltZW91dCk7CiAqIH0KICogLi4uCiAqIHZvaWQgaGFuZGxlVGltZW91dCgpIHsgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uCiAqICAgLi4uCiAqIH0KICogYGBgCiAqIE5vdGU6IElmIERhcnQgY29kZSB1c2luZyBUaW1lciBpcyBjb21waWxlZCB0byBKYXZhU2NyaXB0LCB0aGUgZmluZXN0CiAqIGdyYW51bGFyaXR5IGF2YWlsYWJsZSBpbiB0aGUgYnJvd3NlciBpcyA0IG1pbGxpc2Vjb25kcy4KICoKICogU2VlIFtTdG9wd2F0Y2hdIGZvciBtZWFzdXJpbmcgZWxhcHNlZCB0aW1lLgogKi8KYWJzdHJhY3QgY2xhc3MgVGltZXIgewogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgdGltZXIuCiAgICoKICAgKiBUaGUgW2NhbGxiYWNrXSBmdW5jdGlvbiBpcyBpbnZva2VkIGFmdGVyIHRoZSBnaXZlbiBbZHVyYXRpb25dLgogICAqCiAgICovCiAgZmFjdG9yeSBUaW1lcihEdXJhdGlvbiBkdXJhdGlvbiwgdm9pZCBjYWxsYmFjaygpKSB7CiAgICBpZiAoWm9uZS5jdXJyZW50ID09IFpvbmUucm9vdCkgewogICAgICAvLyBObyBuZWVkIHRvIGJpbmQgdGhlIGNhbGxiYWNrLiBXZSBrbm93IHRoYXQgdGhlIHJvb3QncyB0aW1lciB3aWxsCiAgICAgIC8vIGJlIGludm9rZWQgaW4gdGhlIHJvb3Qgem9uZS4KICAgICAgcmV0dXJuIFpvbmUuY3VycmVudC5jcmVhdGVUaW1lcihkdXJhdGlvbiwgY2FsbGJhY2spOwogICAgfQogICAgcmV0dXJuIFpvbmUuY3VycmVudAogICAgICAgIC5jcmVhdGVUaW1lcihkdXJhdGlvbiwgWm9uZS5jdXJyZW50LmJpbmRDYWxsYmFja0d1YXJkZWQoY2FsbGJhY2spKTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgcmVwZWF0aW5nIHRpbWVyLgogICAqCiAgICogVGhlIFtjYWxsYmFja10gaXMgaW52b2tlZCByZXBlYXRlZGx5IHdpdGggW2R1cmF0aW9uXSBpbnRlcnZhbHMgdW50aWwKICAgKiBjYW5jZWxlZCB3aXRoIHRoZSBbY2FuY2VsXSBmdW5jdGlvbi4KICAgKgogICAqIFRoZSBleGFjdCB0aW1pbmcgZGVwZW5kcyBvbiB0aGUgdW5kZXJseWluZyB0aW1lciBpbXBsZW1lbnRhdGlvbi4KICAgKiBObyBtb3JlIHRoYW4gYG5gIGNhbGxiYWNrcyB3aWxsIGJlIG1hZGUgaW4gYGR1cmF0aW9uICogbmAgdGltZSwKICAgKiBidXQgdGhlIHRpbWUgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgY2FsbGJhY2tzCiAgICogY2FuIGJlIHNob3J0ZXIgYW5kIGxvbmdlciB0aGFuIGBkdXJhdGlvbmAuCiAgICoKICAgKiBJbiBwYXJ0aWN1bGFyLCBhbiBpbXBsZW1lbnRhdGlvbiBtYXkgc2NoZWR1bGUgdGhlIG5leHQgY2FsbGJhY2ssIGUuZy4sCiAgICogYSBgZHVyYXRpb25gIGFmdGVyIGVpdGhlciB3aGVuIHRoZSBwcmV2aW91cyBjYWxsYmFjayBlbmRlZCwKICAgKiB3aGVuIHRoZSBwcmV2aW91cyBjYWxsYmFjayBzdGFydGVkLCBvciB3aGVuIHRoZSBwcmV2aW91cyBjYWxsYmFjayB3YXMKICAgKiBzY2hlZHVsZWQgZm9yIC0gZXZlbiBpZiB0aGUgYWN0dWFsIGNhbGxiYWNrIHdhcyBkZWxheWVkLgogICAqLwogIGZhY3RvcnkgVGltZXIucGVyaW9kaWMoRHVyYXRpb24gZHVyYXRpb24sIHZvaWQgY2FsbGJhY2soVGltZXIgdGltZXIpKSB7CiAgICBpZiAoWm9uZS5jdXJyZW50ID09IFpvbmUucm9vdCkgewogICAgICAvLyBObyBuZWVkIHRvIGJpbmQgdGhlIGNhbGxiYWNrLiBXZSBrbm93IHRoYXQgdGhlIHJvb3QncyB0aW1lciB3aWxsCiAgICAgIC8vIGJlIGludm9rZWQgaW4gdGhlIHJvb3Qgem9uZS4KICAgICAgcmV0dXJuIFpvbmUuY3VycmVudC5jcmVhdGVQZXJpb2RpY1RpbWVyKGR1cmF0aW9uLCBjYWxsYmFjayk7CiAgICB9CiAgICB2YXIgYm91bmRDYWxsYmFjayA9IFpvbmUuY3VycmVudC5iaW5kVW5hcnlDYWxsYmFja0d1YXJkZWQ8VGltZXI+KGNhbGxiYWNrKTsKICAgIHJldHVybiBab25lLmN1cnJlbnQuY3JlYXRlUGVyaW9kaWNUaW1lcihkdXJhdGlvbiwgYm91bmRDYWxsYmFjayk7CiAgfQoKICAvKioKICAgKiBSdW5zIHRoZSBnaXZlbiBbY2FsbGJhY2tdIGFzeW5jaHJvbm91c2x5IGFzIHNvb24gYXMgcG9zc2libGUuCiAgICoKICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gYG5ldyBUaW1lcihEdXJhdGlvbi56ZXJvLCBjYWxsYmFjaylgLgogICAqLwogIHN0YXRpYyB2b2lkIHJ1bih2b2lkIGNhbGxiYWNrKCkpIHsKICAgIG5ldyBUaW1lcihEdXJhdGlvbi56ZXJvLCBjYWxsYmFjayk7CiAgfQoKICAvKioKICAgKiBDYW5jZWxzIHRoZSB0aW1lci4KICAgKgogICAqIE9uY2UgYSBbVGltZXJdIGhhcyBiZWVuIGNhbmNlbGVkLCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBub3QgYmUgY2FsbGVkCiAgICogYnkgdGhlIHRpbWVyLiBDYWxsaW5nIFtjYW5jZWxdIG1vcmUgdGhhbiBvbmNlIG9uIGEgW1RpbWVyXSBpcyBhbGxvd2VkLCBhbmQKICAgKiB3aWxsIGhhdmUgbm8gZnVydGhlciBlZmZlY3QuCiAgICovCiAgdm9pZCBjYW5jZWwoKTsKCiAgLyoqCiAgICogVGhlIG51bWJlciBvZiBkdXJhdGlvbnMgcHJlY2VkaW5nIHRoZSBtb3N0IHJlY2VudCB0aW1lciBldmVudC4KICAgKgogICAqIFRoZSB2YWx1ZSBzdGFydHMgYXQgemVybyBhbmQgaXMgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIGEgdGltZXIgZXZlbnQKICAgKiBvY2N1cnMsIHNvIGVhY2ggY2FsbGJhY2sgd2lsbCBzZWUgYSBsYXJnZXIgdmFsdWUgdGhhbiB0aGUgcHJldmlvdXMgb25lLgogICAqCiAgICogSWYgYSBwZXJpb2RpYyB0aW1lciB3aXRoIGEgbm9uLXplcm8gZHVyYXRpb24gaXMgZGVsYXllZCB0b28gbXVjaCwKICAgKiBzbyBtb3JlIHRoYW4gb25lIHRpY2sgc2hvdWxkIGhhdmUgaGFwcGVuZWQsCiAgICogYWxsIGJ1dCB0aGUgbGFzdCB0aWNrIGluIHRoZSBwYXN0IGFyZSBjb25zaWRlcmVkICJtaXNzZWQiLAogICAqIGFuZCBubyBjYWxsYmFjayBpcyBpbnZva2VkIGZvciB0aGVtLgogICAqIFRoZSBbdGlja10gY291bnQgcmVmbGVjdHMgdGhlIG51bWJlciBvZiBkdXJhdGlvbnMgdGhhdCBoYXZlIHBhc3NlZCBhbmQKICAgKiBub3QgdGhlIG51bWJlciBvZiBjYWxsYmFjayBpbnZvY2F0aW9ucyB0aGF0IGhhdmUgaGFwcGVuZWQuCiAgICovCiAgaW50IGdldCB0aWNrOwoKICAvKioKICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHRpbWVyIGlzIHN0aWxsIGFjdGl2ZS4KICAgKgogICAqIEEgbm9uLXBlcmlvZGljIHRpbWVyIGlzIGFjdGl2ZSBpZiB0aGUgY2FsbGJhY2sgaGFzIG5vdCBiZWVuIGV4ZWN1dGVkLAogICAqIGFuZCB0aGUgdGltZXIgaGFzIG5vdCBiZWVuIGNhbmNlbGVkLgogICAqCiAgICogQSBwZXJpb2RpYyB0aW1lciBpcyBhY3RpdmUgaWYgaXQgaGFzIG5vdCBiZWVuIGNhbmNlbGVkLgogICAqLwogIGJvb2wgZ2V0IGlzQWN0aXZlOwoKICBleHRlcm5hbCBzdGF0aWMgVGltZXIgX2NyZWF0ZVRpbWVyKER1cmF0aW9uIGR1cmF0aW9uLCB2b2lkIGNhbGxiYWNrKCkpOwogIGV4dGVybmFsIHN0YXRpYyBUaW1lciBfY3JlYXRlUGVyaW9kaWNUaW1lcigKICAgICAgRHVyYXRpb24gZHVyYXRpb24sIHZvaWQgY2FsbGJhY2soVGltZXIgdGltZXIpKTsKfQqAgQBOTjwBFAEESQM7UEQDP0YDRkkaCy8vAyZIMAUHMAkFB0g7Ay8EFwYaBUQFBjYlSiY7BhhMBAEGJAVKKgVGRTQwBUxBSz4GSiVKJkMGUEYEAQZDBUoGJSgEAQYYBVBQIgYRAQZEBUlNBUcxQCpMQAYQAQYwBUsqBT0GFQFKLjYCARVkYXJ0OmFzeW5jL3RpbWVyLmRhcnQxb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi9lcnJvcnNfcGF0Y2guZGFydMAATIEvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCkBwYXRjaApjbGFzcyBFcnJvciB7CiAgQHBhdGNoCiAgc3RhdGljIFN0cmluZyBfb2JqZWN0VG9TdHJpbmcoT2JqZWN0IG9iamVjdCkgewogICAgcmV0dXJuIE9iamVjdC5fdG9TdHJpbmcob2JqZWN0KTsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBTdHJpbmcgX3N0cmluZ1RvU2FmZVN0cmluZyhTdHJpbmcgc3RyaW5nKSB7CiAgICByZXR1cm4ganNvbi5lbmNvZGUoc3RyaW5nKTsKICB9CgogIEBwYXRjaAogIFN0YWNrVHJhY2UgZ2V0IHN0YWNrVHJhY2UgPT4gX3N0YWNrVHJhY2U7CgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBTdGFja1RyYWNlIF9zdGFja1RyYWNlOwp9CgpjbGFzcyBfQXNzZXJ0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciBpbXBsZW1lbnRzIEFzc2VydGlvbkVycm9yIHsKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgX0Fzc2VydGlvbkVycm9yLl9jcmVhdGUoCiAgICAgIHRoaXMuX2ZhaWxlZEFzc2VydGlvbiwgdGhpcy5fdXJsLCB0aGlzLl9saW5lLCB0aGlzLl9jb2x1bW4sIHRoaXMubWVzc2FnZSk7CgogIC8vIEFzc2VydGlvbkVycm9yX3Rocm93TmV3IGluIGVycm9ycy5jYyBmaXNoZXMgdGhlIGFzc2VydGlvbiBzb3VyY2UgY29kZQogIC8vIG91dCBvZiB0aGUgc2NyaXB0LiBJdCBleHBlY3RzIGEgRGFydCBzdGFjayBmcmFtZSBmcm9tIGNsYXNzCiAgLy8gX0Fzc2VydGlvbkVycm9yLiBUaHVzIHdlIG5lZWQgYSBEYXJ0IHN0dWIgdGhhdCBjYWxscyB0aGUgbmF0aXZlIGNvZGUuCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCiAgc3RhdGljIF90aHJvd05ldyhpbnQgYXNzZXJ0aW9uU3RhcnQsIGludCBhc3NlcnRpb25FbmQsIE9iamVjdCBtZXNzYWdlKSB7CiAgICBfZG9UaHJvd05ldyhhc3NlcnRpb25TdGFydCwgYXNzZXJ0aW9uRW5kLCBtZXNzYWdlKTsKICB9CgogIHN0YXRpYyBfZG9UaHJvd05ldyhpbnQgYXNzZXJ0aW9uU3RhcnQsIGludCBhc3NlcnRpb25FbmQsIE9iamVjdCBtZXNzYWdlKQogICAgICBuYXRpdmUgIkFzc2VydGlvbkVycm9yX3Rocm93TmV3IjsKCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCiAgc3RhdGljIF9ldmFsdWF0ZUFzc2VydGlvbihjb25kaXRpb24pIHsKICAgIGlmIChpZGVudGljYWwoY29uZGl0aW9uLCB0cnVlKSB8fCBpZGVudGljYWwoY29uZGl0aW9uLCBmYWxzZSkpIHsKICAgICAgcmV0dXJuIGNvbmRpdGlvbjsKICAgIH0KICAgIGlmIChjb25kaXRpb24gaXMgX0Nsb3N1cmUpIHsKICAgICAgcmV0dXJuIChjb25kaXRpb24gYXMgZHluYW1pYykoKTsKICAgIH0KICAgIGlmIChjb25kaXRpb24gaXMgRnVuY3Rpb24pIHsKICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uKCk7CiAgICB9CiAgICByZXR1cm4gY29uZGl0aW9uOwogIH0KCiAgU3RyaW5nIGdldCBfbWVzc2FnZVN0cmluZyB7CiAgICBpZiAobWVzc2FnZSA9PSBudWxsKSByZXR1cm4gImlzIG5vdCB0cnVlLiI7CiAgICBpZiAobWVzc2FnZSBpcyBTdHJpbmcpIHJldHVybiBtZXNzYWdlOwogICAgcmV0dXJuIEVycm9yLnNhZmVUb1N0cmluZyhtZXNzYWdlKTsKICB9CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIGlmIChfdXJsID09IG51bGwpIHsKICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkgcmV0dXJuIF9mYWlsZWRBc3NlcnRpb24/LnRyaW0oKTsKICAgICAgcmV0dXJuICInJHtfZmFpbGVkQXNzZXJ0aW9uPy50cmltKCl9JzogJF9tZXNzYWdlU3RyaW5nIjsKICAgIH0KICAgIHZhciBjb2x1bW5JbmZvID0gIiI7CiAgICBpZiAoX2NvbHVtbiA+IDApIHsKICAgICAgLy8gT25seSBhZGQgY29sdW1uIGluZm9ybWF0aW9uIGlmIGl0IGlzIHZhbGlkLgogICAgICBjb2x1bW5JbmZvID0gIiBwb3MgJF9jb2x1bW4iOwogICAgfQogICAgcmV0dXJuICInJF91cmwnOiBGYWlsZWQgYXNzZXJ0aW9uOiBsaW5lICRfbGluZSRjb2x1bW5JbmZvOiAiCiAgICAgICAgIickX2ZhaWxlZEFzc2VydGlvbic6ICRfbWVzc2FnZVN0cmluZyI7CiAgfQoKICBmaW5hbCBTdHJpbmcgX2ZhaWxlZEFzc2VydGlvbjsKICBmaW5hbCBTdHJpbmcgX3VybDsKICBmaW5hbCBpbnQgX2xpbmU7CiAgZmluYWwgaW50IF9jb2x1bW47CiAgZmluYWwgT2JqZWN0IG1lc3NhZ2U7Cn0KCmNsYXNzIF9UeXBlRXJyb3IgZXh0ZW5kcyBfQXNzZXJ0aW9uRXJyb3IgaW1wbGVtZW50cyBUeXBlRXJyb3IgewogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBfVHlwZUVycm9yLl9jcmVhdGUoU3RyaW5nIHVybCwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyBlcnJvck1zZykKICAgICAgOiBzdXBlci5fY3JlYXRlKCJpcyBhc3NpZ25hYmxlIiwgdXJsLCBsaW5lLCBjb2x1bW4sIGVycm9yTXNnKTsKCiAgc3RhdGljIF90aHJvd05ldyhpbnQgbG9jYXRpb24sIE9iamVjdCBzcmNfdmFsdWUsIF9UeXBlIGRzdF90eXBlLAogICAgICBTdHJpbmcgZHN0X25hbWUpIG5hdGl2ZSAiVHlwZUVycm9yX3Rocm93TmV3IjsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gc3VwZXIubWVzc2FnZTsKfQoKY2xhc3MgX0Nhc3RFcnJvciBleHRlbmRzIEVycm9yIGltcGxlbWVudHMgQ2FzdEVycm9yIHsKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgX0Nhc3RFcnJvci5fY3JlYXRlKHRoaXMuX3VybCwgdGhpcy5fbGluZSwgdGhpcy5fY29sdW1uLCB0aGlzLl9lcnJvck1zZyk7CgogIC8vIEEgQ2FzdEVycm9yIGlzIGFsbG9jYXRlZCBieSBUeXBlRXJyb3IuX3Rocm93TmV3KCkgd2hlbiBkc3RfbmFtZSBlcXVhbHMKICAvLyBTeW1ib2xzOjpJblR5cGVDYXN0KCkuCgogIFN0cmluZyB0b1N0cmluZygpID0+IF9lcnJvck1zZzsKCiAgLy8gRmllbGRzIF91cmwsIF9saW5lLCBhbmQgX2NvbHVtbiBhcmUgb25seSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCiAgZmluYWwgU3RyaW5nIF91cmw7CiAgZmluYWwgaW50IF9saW5lOwogIGZpbmFsIGludCBfY29sdW1uOwogIGZpbmFsIFN0cmluZyBfZXJyb3JNc2c7Cn0KCkBwYXRjaApjbGFzcyBGYWxsVGhyb3VnaEVycm9yIHsKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgRmFsbFRocm91Z2hFcnJvci5fY3JlYXRlKFN0cmluZyB1cmwsIGludCBsaW5lKQogICAgICA6IF91cmwgPSB1cmwsCiAgICAgICAgX2xpbmUgPSBsaW5lOwoKICBzdGF0aWMgX3Rocm93TmV3KGludCBjYXNlX2NsYXVzZV9wb3MpIG5hdGl2ZSAiRmFsbFRocm91Z2hFcnJvcl90aHJvd05ldyI7CgogIEBwYXRjaAogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAiJyRfdXJsJzogU3dpdGNoIGNhc2UgZmFsbC10aHJvdWdoIGF0IGxpbmUgJF9saW5lLiI7CiAgfQoKICAvLyBUaGVzZSBuZXcgZmllbGRzIGNhbm5vdCBiZSBkZWNsYXJlZCBmaW5hbCwgYmVjYXVzZSBhIGNvbnN0cnVjdG9yIGV4aXN0cwogIC8vIGluIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMgcGF0Y2hlZCBjbGFzcy4KICBTdHJpbmcgX3VybDsKICBpbnQgX2xpbmU7Cn0KCmNsYXNzIF9JbnRlcm5hbEVycm9yIHsKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgY29uc3QgX0ludGVybmFsRXJyb3IodGhpcy5fbXNnKTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiSW50ZXJuYWxFcnJvcjogJyR7X21zZ30nIjsKICBmaW5hbCBTdHJpbmcgX21zZzsKfQoKQHBhdGNoCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgVW5zdXBwb3J0ZWRFcnJvciB7CiAgc3RhdGljIF90aHJvd05ldyhTdHJpbmcgbXNnKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihtc2cpOwogIH0KfQoKQHBhdGNoCmNsYXNzIEN5Y2xpY0luaXRpYWxpemF0aW9uRXJyb3IgewogIHN0YXRpYyBfdGhyb3dOZXcoU3RyaW5nIHZhcmlhYmxlTmFtZSkgewogICAgdGhyb3cgbmV3IEN5Y2xpY0luaXRpYWxpemF0aW9uRXJyb3IodmFyaWFibGVOYW1lKTsKICB9Cn0KCkBwYXRjaApjbGFzcyBBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yIHsKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25FcnJvci5fY3JlYXRlKAogICAgICB0aGlzLl9jbGFzc05hbWUsIHRoaXMuX3VybCwgdGhpcy5fbGluZSk7CgogIHN0YXRpYyBfdGhyb3dOZXcoaW50IGNhc2VfY2xhdXNlX3BvcywgU3RyaW5nIGNsYXNzTmFtZSkKICAgICAgbmF0aXZlICJBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yX3Rocm93TmV3IjsKCiAgQHBhdGNoCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICJDYW5ub3QgaW5zdGFudGlhdGUgYWJzdHJhY3QgY2xhc3MgJF9jbGFzc05hbWU6ICIKICAgICAgICAiX3VybCAnJF91cmwnIGxpbmUgJF9saW5lIjsKICB9CgogIC8vIFRoZXNlIG5ldyBmaWVsZHMgY2Fubm90IGJlIGRlY2xhcmVkIGZpbmFsLCBiZWNhdXNlIGEgY29uc3RydWN0b3IgZXhpc3RzCiAgLy8gaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcyBwYXRjaGVkIGNsYXNzLgogIFN0cmluZyBfdXJsOwogIGludCBfbGluZTsKfQoKQHBhdGNoCmNsYXNzIE5vU3VjaE1ldGhvZEVycm9yIHsKICAvLyBEZXByZWNhdGVkIG1lbWJlcnMgdG8gYmUgcmVtb3ZlZC4KICBTeW1ib2wgX21lbWJlck5hbWU7CiAgTGlzdCBfYXJndW1lbnRzOwogIE1hcDxTeW1ib2wsIGR5bmFtaWM+IF9uYW1lZEFyZ3VtZW50czsKICBMaXN0IF9leGlzdGluZ0FyZ3VtZW50TmFtZXM7CgogIGZpbmFsIE9iamVjdCBfcmVjZWl2ZXI7CiAgZmluYWwgX0ludm9jYXRpb25NaXJyb3IgX2ludm9jYXRpb247CgogIEBwYXRjaAogIE5vU3VjaE1ldGhvZEVycm9yLndpdGhJbnZvY2F0aW9uKE9iamVjdCByZWNlaXZlciwgSW52b2NhdGlvbiBpbnZvY2F0aW9uKQogICAgICA6IF9yZWNlaXZlciA9IHJlY2VpdmVyLAogICAgICAgIF9pbnZvY2F0aW9uID0gaW52b2NhdGlvbiBhcyBfSW52b2NhdGlvbk1pcnJvcjsKCiAgc3RhdGljIHZvaWQgX3Rocm93TmV3SW52b2NhdGlvbihPYmplY3QgcmVjZWl2ZXIsIEludm9jYXRpb24gaW52b2NhdGlvbikgewogICAgdGhyb3cgbmV3IE5vU3VjaE1ldGhvZEVycm9yLndpdGhJbnZvY2F0aW9uKHJlY2VpdmVyLCBpbnZvY2F0aW9uKTsKICB9CgogIC8vIFRoZSBjb21waWxlciBlbWl0cyBhIGNhbGwgdG8gX3Rocm93TmV3IHdoZW4gaXQgY2Fubm90IHJlc29sdmUgYSBzdGF0aWMKICAvLyBtZXRob2QgYXQgY29tcGlsZSB0aW1lLiBUaGUgcmVjZWl2ZXIgaXMgYWN0dWFsbHkgdGhlIGxpdGVyYWwgY2xhc3Mgb2YgdGhlCiAgLy8gdW5yZXNvbHZlZCBtZXRob2QuCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCiAgc3RhdGljIHZvaWQgX3Rocm93TmV3KE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1lbWJlck5hbWUsIGludCBpbnZvY2F0aW9uX3R5cGUsCiAgICAgIE9iamVjdCB0eXBlQXJndW1lbnRzLCBMaXN0IGFyZ3VtZW50cywgTGlzdCBhcmd1bWVudE5hbWVzKSB7CiAgICB0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXJyb3IuX3dpdGhUeXBlKHJlY2VpdmVyLCBtZW1iZXJOYW1lLCBpbnZvY2F0aW9uX3R5cGUsCiAgICAgICAgdHlwZUFyZ3VtZW50cywgYXJndW1lbnRzLCBhcmd1bWVudE5hbWVzKTsKICB9CgogIHN0YXRpYyB2b2lkIF90aHJvd05ld0lmTm90TG9hZGVkKAogICAgICBfTGlicmFyeVByZWZpeCBwcmVmaXgsCiAgICAgIE9iamVjdCByZWNlaXZlciwKICAgICAgU3RyaW5nIG1lbWJlck5hbWUsCiAgICAgIGludCBpbnZvY2F0aW9uX3R5cGUsCiAgICAgIE9iamVjdCB0eXBlQXJndW1lbnRzLAogICAgICBMaXN0IGFyZ3VtZW50cywKICAgICAgTGlzdCBhcmd1bWVudE5hbWVzKSB7CiAgICBpZiAoIXByZWZpeC5pc0xvYWRlZCgpKSB7CiAgICAgIF90aHJvd05ldyhyZWNlaXZlciwgbWVtYmVyTmFtZSwgaW52b2NhdGlvbl90eXBlLCB0eXBlQXJndW1lbnRzLCBhcmd1bWVudHMsCiAgICAgICAgICBhcmd1bWVudE5hbWVzKTsKICAgIH0KICB9CgogIC8vIFRPRE8ocmVnaXMpOiBEZXByZWNhdGVkIG1lbWJlciBzdGlsbCB1c2VkIGJ5IGRhcnQyanMgdG8gYmUgcmVtb3ZlZC4KICAvLyBSZW1lbWJlciB0aGUgdHlwZSBmcm9tIHRoZSBpbnZvY2F0aW9uIG1pcnJvciBvciBzdGF0aWMgY29tcGlsYXRpb24KICAvLyBhbmFseXNpcyB3aGVuIHRocm93biBkaXJlY3RseSB3aXRoIF90aHJvd05ldy4gQSBuZWdhdGl2ZSB2YWx1ZSBtZWFucwogIC8vIHRoYXQgbm8gaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLgogIGludCBfaW52b2NhdGlvbl90eXBlOwoKICAvLyBUT0RPKHJlZ2lzKTogRGVwcmVjYXRlZCBjb25zdHJ1Y3RvciBzdGlsbCB1c2VkIGJ5IGRhcnQyanMgdG8gYmUgcmVtb3ZlZC4KICBAcGF0Y2gKICBOb1N1Y2hNZXRob2RFcnJvcihPYmplY3QgcmVjZWl2ZXIsIFN5bWJvbCBtZW1iZXJOYW1lLAogICAgICBMaXN0IHBvc2l0aW9uYWxBcmd1bWVudHMsIE1hcDxTeW1ib2wsIGR5bmFtaWM+IG5hbWVkQXJndW1lbnRzLAogICAgICBbTGlzdCBleGlzdGluZ0FyZ3VtZW50TmFtZXMgPSBudWxsXSkKICAgICAgOiBfcmVjZWl2ZXIgPSByZWNlaXZlciwKICAgICAgICBfaW52b2NhdGlvbiA9IG51bGwsCiAgICAgICAgX21lbWJlck5hbWUgPSBtZW1iZXJOYW1lLAogICAgICAgIF9hcmd1bWVudHMgPSBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICAgIF9uYW1lZEFyZ3VtZW50cyA9IG5hbWVkQXJndW1lbnRzLAogICAgICAgIF9leGlzdGluZ0FyZ3VtZW50TmFtZXMgPSBleGlzdGluZ0FyZ3VtZW50TmFtZXMsCiAgICAgICAgX2ludm9jYXRpb25fdHlwZSA9IC0xOwoKICAvLyBIZWxwZXIgdG8gYnVpbGQgYSBtYXAgb2YgbmFtZWQgYXJndW1lbnRzLgogIHN0YXRpYyBNYXA8U3ltYm9sLCBkeW5hbWljPiBfTmFtZWRBcmd1bWVudHNNYXAoCiAgICAgIExpc3QgYXJndW1lbnRzLCBMaXN0IGFyZ3VtZW50TmFtZXMpIHsKICAgIE1hcDxTeW1ib2wsIGR5bmFtaWM+IG5hbWVkQXJndW1lbnRzID0gbmV3IE1hcDxTeW1ib2wsIGR5bmFtaWM+KCk7CiAgICBpbnQgbnVtUG9zaXRpb25hbEFyZ3VtZW50cyA9IGFyZ3VtZW50cy5sZW5ndGggLSBhcmd1bWVudE5hbWVzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnROYW1lcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgYXJnX3ZhbHVlID0gYXJndW1lbnRzW251bVBvc2l0aW9uYWxBcmd1bWVudHMgKyBpXTsKICAgICAgbmFtZWRBcmd1bWVudHNbbmV3IFN5bWJvbChhcmd1bWVudE5hbWVzW2ldKV0gPSBhcmdfdmFsdWU7CiAgICB9CiAgICByZXR1cm4gbmFtZWRBcmd1bWVudHM7CiAgfQoKICAvLyBDb25zdHJ1Y3RvciBjYWxsZWQgZnJvbSBFeGNlcHRpb25zOjpUaHJvd0J5VHlwZShrTm9TdWNoTWV0aG9kKSBhbmQgZnJvbQogIC8vIF90aHJvd05ldyBhYm92ZSwgdGFraW5nIGEgVHlwZUFyZ3VtZW50cyBvYmplY3QgcmF0aGVyIHRoYW4gYW4gdW5wYWNrZWQgbGlzdAogIC8vIG9mIHR5cGVzLCBhcyB3ZWxsIGFzIGEgbGlzdCBvZiBhbGwgYXJndW1lbnRzIGFuZCBhIGxpc3Qgb2YgbmFtZXMsIHJhdGhlcgogIC8vIHRoYW4gYSBzZXBhcmF0ZSBsaXN0IG9mIHBvc2l0aW9uYWwgYXJndW1lbnRzIGFuZCBhIG1hcCBvZiBuYW1lZCBhcmd1bWVudHMuCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIE5vU3VjaE1ldGhvZEVycm9yLl93aXRoVHlwZSgKICAgICAgdGhpcy5fcmVjZWl2ZXIsCiAgICAgIFN0cmluZyBtZW1iZXJOYW1lLAogICAgICBpbnQgaW52b2NhdGlvbl90eXBlLAogICAgICBPYmplY3QgdHlwZUFyZ3VtZW50cywKICAgICAgTGlzdCBhcmd1bWVudHMsCiAgICAgIExpc3QgYXJndW1lbnROYW1lcykKICAgICAgOiB0aGlzLl9pbnZvY2F0aW9uID0gbmV3IF9JbnZvY2F0aW9uTWlycm9yLl93aXRoVHlwZSgKICAgICAgICAgICAgbmV3IFN5bWJvbChtZW1iZXJOYW1lKSwKICAgICAgICAgICAgaW52b2NhdGlvbl90eXBlLAogICAgICAgICAgICB0eXBlQXJndW1lbnRzICE9IG51bGwKICAgICAgICAgICAgICAgIC8vIFRPRE8oMzMwNzMpOiBVc2UgYWN0dWFsIGNvdW50IG9mIHR5cGUgYXJndW1lbnRzIGluIHBsYWNlIG9mIDAuCiAgICAgICAgICAgICAgICA/IF9JbnZvY2F0aW9uTWlycm9yLl91bnBhY2tUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMsIDApCiAgICAgICAgICAgICAgICA6IG51bGwsCiAgICAgICAgICAgIGFyZ3VtZW50TmFtZXMgIT0gbnVsbAogICAgICAgICAgICAgICAgPyBhcmd1bWVudHMuc3VibGlzdCgwLCBhcmd1bWVudHMubGVuZ3RoIC0gYXJndW1lbnROYW1lcy5sZW5ndGgpCiAgICAgICAgICAgICAgICA6IGFyZ3VtZW50cywKICAgICAgICAgICAgYXJndW1lbnROYW1lcyAhPSBudWxsCiAgICAgICAgICAgICAgICA/IF9OYW1lZEFyZ3VtZW50c01hcChhcmd1bWVudHMsIGFyZ3VtZW50TmFtZXMpCiAgICAgICAgICAgICAgICA6IG51bGwpOwoKICBzdGF0aWMgU3RyaW5nIF9leGlzdGluZ01ldGhvZFNpZ25hdHVyZShPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLAogICAgICBpbnQgaW52b2NhdGlvblR5cGUpIG5hdGl2ZSAiTm9TdWNoTWV0aG9kRXJyb3JfZXhpc3RpbmdNZXRob2RTaWduYXR1cmUiOwoKICBAcGF0Y2gKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAvLyBUT0RPKHJlZ2lzKTogUmVtb3ZlIHRoaXMgbnVsbCBjaGVjayBvbmNlIGRhcnQyanMgaXMgdXBkYXRlZC4KICAgIGlmIChfaW52b2NhdGlvbiA9PSBudWxsKSB7CiAgICAgIC8vIFVzZSBkZXByZWNhdGVkIHZlcnNpb24gb2YgdG9TdHJpbmcuCiAgICAgIHJldHVybiBfdG9TdHJpbmdEZXByZWNhdGVkKCk7CiAgICB9CiAgICBTdHJpbmcgbWVtYmVyTmFtZSA9CiAgICAgICAgaW50ZXJuYWwuU3ltYm9sLmNvbXB1dGVVbm1hbmdsZWROYW1lKF9pbnZvY2F0aW9uLm1lbWJlck5hbWUpOwogICAgdmFyIGxldmVsID0gKF9pbnZvY2F0aW9uLl90eXBlID4+IF9JbnZvY2F0aW9uTWlycm9yLl9MRVZFTF9TSElGVCkgJgogICAgICAgIF9JbnZvY2F0aW9uTWlycm9yLl9MRVZFTF9NQVNLOwogICAgdmFyIGtpbmQgPSBfaW52b2NhdGlvbi5fdHlwZSAmIF9JbnZvY2F0aW9uTWlycm9yLl9LSU5EX01BU0s7CiAgICBpZiAoa2luZCA9PSBfSW52b2NhdGlvbk1pcnJvci5fTE9DQUxfVkFSKSB7CiAgICAgIHJldHVybiAiTm9TdWNoTWV0aG9kRXJyb3I6IENhbm5vdCBhc3NpZ24gdG8gZmluYWwgdmFyaWFibGUgJyRtZW1iZXJOYW1lJyI7CiAgICB9CgogICAgU3RyaW5nQnVmZmVyIHR5cGVBcmd1bWVudHNCdWYgPSBudWxsOwogICAgdmFyIHR5cGVBcmd1bWVudHMgPSBfaW52b2NhdGlvbi50eXBlQXJndW1lbnRzOwogICAgaWYgKCh0eXBlQXJndW1lbnRzICE9IG51bGwpICYmICh0eXBlQXJndW1lbnRzLmxlbmd0aCA+IDApKSB7CiAgICAgIHR5cGVBcmd1bWVudHNCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgIHR5cGVBcmd1bWVudHNCdWYud3JpdGUoIjwiKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGkgPiAwKSB7CiAgICAgICAgICB0eXBlQXJndW1lbnRzQnVmLndyaXRlKCIsICIpOwogICAgICAgIH0KICAgICAgICB0eXBlQXJndW1lbnRzQnVmLndyaXRlKEVycm9yLnNhZmVUb1N0cmluZyh0eXBlQXJndW1lbnRzW2ldKSk7CiAgICAgIH0KICAgICAgdHlwZUFyZ3VtZW50c0J1Zi53cml0ZSgiPiIpOwogICAgfQogICAgU3RyaW5nQnVmZmVyIGFyZ3VtZW50c0J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHZhciBwb3NpdGlvbmFsQXJndW1lbnRzID0gX2ludm9jYXRpb24ucG9zaXRpb25hbEFyZ3VtZW50czsKICAgIGludCBhcmd1bWVudENvdW50ID0gMDsKICAgIGlmIChwb3NpdGlvbmFsQXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgZm9yICg7IGFyZ3VtZW50Q291bnQgPCBwb3NpdGlvbmFsQXJndW1lbnRzLmxlbmd0aDsgYXJndW1lbnRDb3VudCsrKSB7CiAgICAgICAgaWYgKGFyZ3VtZW50Q291bnQgPiAwKSB7CiAgICAgICAgICBhcmd1bWVudHNCdWYud3JpdGUoIiwgIik7CiAgICAgICAgfQogICAgICAgIGFyZ3VtZW50c0J1ZgogICAgICAgICAgICAud3JpdGUoRXJyb3Iuc2FmZVRvU3RyaW5nKHBvc2l0aW9uYWxBcmd1bWVudHNbYXJndW1lbnRDb3VudF0pKTsKICAgICAgfQogICAgfQogICAgdmFyIG5hbWVkQXJndW1lbnRzID0gX2ludm9jYXRpb24ubmFtZWRBcmd1bWVudHM7CiAgICBpZiAobmFtZWRBcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBuYW1lZEFyZ3VtZW50cy5mb3JFYWNoKChTeW1ib2wga2V5LCB2YXIgdmFsdWUpIHsKICAgICAgICBpZiAoYXJndW1lbnRDb3VudCA+IDApIHsKICAgICAgICAgIGFyZ3VtZW50c0J1Zi53cml0ZSgiLCAiKTsKICAgICAgICB9CiAgICAgICAgYXJndW1lbnRzQnVmLndyaXRlKGludGVybmFsLlN5bWJvbC5jb21wdXRlVW5tYW5nbGVkTmFtZShrZXkpKTsKICAgICAgICBhcmd1bWVudHNCdWYud3JpdGUoIjogIik7CiAgICAgICAgYXJndW1lbnRzQnVmLndyaXRlKEVycm9yLnNhZmVUb1N0cmluZyh2YWx1ZSkpOwogICAgICAgIGFyZ3VtZW50Q291bnQrKzsKICAgICAgfSk7CiAgICB9CiAgICBTdHJpbmcgZXhpc3RpbmdTaWcgPQogICAgICAgIF9leGlzdGluZ01ldGhvZFNpZ25hdHVyZShfcmVjZWl2ZXIsIG1lbWJlck5hbWUsIF9pbnZvY2F0aW9uLl90eXBlKTsKICAgIFN0cmluZyBhcmdzTXNnID0gZXhpc3RpbmdTaWcgIT0gbnVsbCA/ICIgd2l0aCBtYXRjaGluZyBhcmd1bWVudHMiIDogIiI7CgogICAgU3RyaW5nIGtpbmRCdWY7CiAgICBpZiAoa2luZCA+PSAwICYmIGtpbmQgPCA1KSB7CiAgICAgIGtpbmRCdWYgPSAoY29uc3QgWwogICAgICAgICJtZXRob2QiLAogICAgICAgICJnZXR0ZXIiLAogICAgICAgICJzZXR0ZXIiLAogICAgICAgICJnZXR0ZXIgb3Igc2V0dGVyIiwKICAgICAgICAidmFyaWFibGUiCiAgICAgIF0pW2tpbmRdOwogICAgfQoKICAgIFN0cmluZ0J1ZmZlciBtc2dCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJOb1N1Y2hNZXRob2RFcnJvcjogIik7CiAgICBib29sIGlzX3R5cGVfY2FsbCA9IGZhbHNlOwogICAgc3dpdGNoIChsZXZlbCkgewogICAgICBjYXNlIF9JbnZvY2F0aW9uTWlycm9yLl9EWU5BTUlDOgogICAgICAgIHsKICAgICAgICAgIGlmIChfcmVjZWl2ZXIgPT0gbnVsbCkgewogICAgICAgICAgICBpZiAoZXhpc3RpbmdTaWcgIT0gbnVsbCkgewogICAgICAgICAgICAgIG1zZ0J1Zi53cml0ZWxuKCJUaGUgbnVsbCBvYmplY3QgZG9lcyBub3QgaGF2ZSBhICRraW5kQnVmICIKICAgICAgICAgICAgICAgICAgIickbWVtYmVyTmFtZSckYXJnc01zZy4iKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBtc2dCdWYud3JpdGVsbigiVGhlICRraW5kQnVmICckbWVtYmVyTmFtZScgd2FzIGNhbGxlZCBvbiBudWxsLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoX3JlY2VpdmVyIGlzIF9DbG9zdXJlKSB7CiAgICAgICAgICAgICAgbXNnQnVmLndyaXRlbG4oIkNsb3N1cmUgY2FsbCB3aXRoIG1pc21hdGNoZWQgYXJndW1lbnRzOiAiCiAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiAnJG1lbWJlck5hbWUnIik7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoX3JlY2VpdmVyIGlzIF9UeXBlICYmIG1lbWJlck5hbWUgPT0gImNhbGwiKSB7CiAgICAgICAgICAgICAgaXNfdHlwZV9jYWxsID0gdHJ1ZTsKICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IF9yZWNlaXZlci50b1N0cmluZygpOwogICAgICAgICAgICAgIG1zZ0J1Zi53cml0ZWxuKCJBdHRlbXB0ZWQgdG8gdXNlIHR5cGUgJyRuYW1lJyBhcyBhIGZ1bmN0aW9uLiAiCiAgICAgICAgICAgICAgICAgICJTaW5jZSB0eXBlcyBkbyBub3QgZGVmaW5lIGEgbWV0aG9kICdjYWxsJywgdGhpcyBpcyBub3QgIgogICAgICAgICAgICAgICAgICAicG9zc2libGUuIERpZCB5b3UgaW50ZW5kIHRvIGNhbGwgdGhlICRuYW1lIGNvbnN0cnVjdG9yIGFuZCAiCiAgICAgICAgICAgICAgICAgICJmb3JnZXQgdGhlICduZXcnIG9wZXJhdG9yPyIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIG1zZ0J1Zi53cml0ZWxuKCJDbGFzcyAnJHtfcmVjZWl2ZXIucnVudGltZVR5cGV9JyBoYXMgbm8gaW5zdGFuY2UgIgogICAgICAgICAgICAgICAgICAiJGtpbmRCdWYgJyRtZW1iZXJOYW1lJyRhcmdzTXNnLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIGNhc2UgX0ludm9jYXRpb25NaXJyb3IuX1NVUEVSOgogICAgICAgIHsKICAgICAgICAgIG1zZ0J1Zi53cml0ZWxuKCJTdXBlciBjbGFzcyBvZiBjbGFzcyAnJHtfcmVjZWl2ZXIucnVudGltZVR5cGV9JyBoYXMgIgogICAgICAgICAgICAgICJubyBpbnN0YW5jZSAka2luZEJ1ZiAnJG1lbWJlck5hbWUnJGFyZ3NNc2cuIik7CiAgICAgICAgICBtZW1iZXJOYW1lID0gInN1cGVyLiRtZW1iZXJOYW1lIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgY2FzZSBfSW52b2NhdGlvbk1pcnJvci5fU1RBVElDOgogICAgICAgIHsKICAgICAgICAgIG1zZ0J1Zi53cml0ZWxuKCJObyBzdGF0aWMgJGtpbmRCdWYgJyRtZW1iZXJOYW1lJyRhcmdzTXNnICIKICAgICAgICAgICAgICAiZGVjbGFyZWQgaW4gY2xhc3MgJyRfcmVjZWl2ZXInLiIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICBjYXNlIF9JbnZvY2F0aW9uTWlycm9yLl9DT05TVFJVQ1RPUjoKICAgICAgICB7CiAgICAgICAgICBtc2dCdWYud3JpdGVsbigiTm8gY29uc3RydWN0b3IgJyRtZW1iZXJOYW1lJyRhcmdzTXNnIGRlY2xhcmVkICIKICAgICAgICAgICAgICAiaW4gY2xhc3MgJyRfcmVjZWl2ZXInLiIpOwogICAgICAgICAgbWVtYmVyTmFtZSA9ICJuZXcgJG1lbWJlck5hbWUiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICBjYXNlIF9JbnZvY2F0aW9uTWlycm9yLl9UT1BfTEVWRUw6CiAgICAgICAgewogICAgICAgICAgbXNnQnVmLndyaXRlbG4oIk5vIHRvcC1sZXZlbCAka2luZEJ1ZiAnJG1lbWJlck5hbWUnJGFyZ3NNc2cgIgogICAgICAgICAgICAgICJkZWNsYXJlZC4iKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAobGV2ZWwgPT0gX0ludm9jYXRpb25NaXJyb3IuX1RPUF9MRVZFTCkgewogICAgICBtc2dCdWYud3JpdGVsbigiUmVjZWl2ZXI6IHRvcC1sZXZlbCIpOwogICAgfSBlbHNlIHsKICAgICAgbXNnQnVmLndyaXRlbG4oIlJlY2VpdmVyOiAke0Vycm9yLnNhZmVUb1N0cmluZyhfcmVjZWl2ZXIpfSIpOwogICAgfQoKICAgIGlmIChraW5kID09IF9JbnZvY2F0aW9uTWlycm9yLl9NRVRIT0QpIHsKICAgICAgU3RyaW5nIG0gPSBpc190eXBlX2NhbGwgPyAiJF9yZWNlaXZlciIgOiAiJG1lbWJlck5hbWUiOwogICAgICBtc2dCdWYud3JpdGUoIlRyaWVkIGNhbGxpbmc6ICRtIik7CiAgICAgIGlmICh0eXBlQXJndW1lbnRzQnVmICE9IG51bGwpIHsKICAgICAgICBtc2dCdWYud3JpdGUodHlwZUFyZ3VtZW50c0J1Zik7CiAgICAgIH0KICAgICAgbXNnQnVmLndyaXRlKCIoJGFyZ3VtZW50c0J1ZikiKTsKICAgIH0gZWxzZSBpZiAoYXJndW1lbnRDb3VudCA9PSAwKSB7CiAgICAgIG1zZ0J1Zi53cml0ZSgiVHJpZWQgY2FsbGluZzogJG1lbWJlck5hbWUiKTsKICAgIH0gZWxzZSBpZiAoa2luZCA9PSBfSW52b2NhdGlvbk1pcnJvci5fU0VUVEVSKSB7CiAgICAgIG1zZ0J1Zi53cml0ZSgiVHJpZWQgY2FsbGluZzogJG1lbWJlck5hbWUkYXJndW1lbnRzQnVmIik7CiAgICB9IGVsc2UgewogICAgICBtc2dCdWYud3JpdGUoIlRyaWVkIGNhbGxpbmc6ICRtZW1iZXJOYW1lID0gJGFyZ3VtZW50c0J1ZiIpOwogICAgfQoKICAgIGlmIChleGlzdGluZ1NpZyAhPSBudWxsKSB7CiAgICAgIG1zZ0J1Zi53cml0ZSgiXG5Gb3VuZDogJG1lbWJlck5hbWUkZXhpc3RpbmdTaWciKTsKICAgIH0KCiAgICByZXR1cm4gbXNnQnVmLnRvU3RyaW5nKCk7CiAgfQoKICAvLyBUT0RPKHJlZ2lzKTogUmVtb3ZlIHRoaXMgZnVuY3Rpb24gb25jZSBkYXJ0MmpzIGlzIHVwZGF0ZWQuCiAgU3RyaW5nIF90b1N0cmluZ0RlcHJlY2F0ZWQoKSB7CiAgICB2YXIgbGV2ZWwgPSAoX2ludm9jYXRpb25fdHlwZSA+PiBfSW52b2NhdGlvbk1pcnJvci5fTEVWRUxfU0hJRlQpICYKICAgICAgICBfSW52b2NhdGlvbk1pcnJvci5fTEVWRUxfTUFTSzsKICAgIHZhciB0eXBlID0gX2ludm9jYXRpb25fdHlwZSAmIF9JbnZvY2F0aW9uTWlycm9yLl9LSU5EX01BU0s7CiAgICBTdHJpbmcgbWVtYmVyTmFtZSA9IChfbWVtYmVyTmFtZSA9PSBudWxsKQogICAgICAgID8gIiIKICAgICAgICA6IGludGVybmFsLlN5bWJvbC5jb21wdXRlVW5tYW5nbGVkTmFtZShfbWVtYmVyTmFtZSk7CgogICAgaWYgKHR5cGUgPT0gX0ludm9jYXRpb25NaXJyb3IuX0xPQ0FMX1ZBUikgewogICAgICByZXR1cm4gIk5vU3VjaE1ldGhvZEVycm9yOiBDYW5ub3QgYXNzaWduIHRvIGZpbmFsIHZhcmlhYmxlICckbWVtYmVyTmFtZSciOwogICAgfQoKICAgIFN0cmluZ0J1ZmZlciBhcmd1bWVudHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBpbnQgYXJndW1lbnRDb3VudCA9IDA7CiAgICBpZiAoX2FyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGZvciAoOyBhcmd1bWVudENvdW50IDwgX2FyZ3VtZW50cy5sZW5ndGg7IGFyZ3VtZW50Q291bnQrKykgewogICAgICAgIGlmIChhcmd1bWVudENvdW50ID4gMCkgewogICAgICAgICAgYXJndW1lbnRzLndyaXRlKCIsICIpOwogICAgICAgIH0KICAgICAgICBhcmd1bWVudHMud3JpdGUoRXJyb3Iuc2FmZVRvU3RyaW5nKF9hcmd1bWVudHNbYXJndW1lbnRDb3VudF0pKTsKICAgICAgfQogICAgfQogICAgaWYgKF9uYW1lZEFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIF9uYW1lZEFyZ3VtZW50cy5mb3JFYWNoKChTeW1ib2wga2V5LCB2YXIgdmFsdWUpIHsKICAgICAgICBpZiAoYXJndW1lbnRDb3VudCA+IDApIHsKICAgICAgICAgIGFyZ3VtZW50cy53cml0ZSgiLCAiKTsKICAgICAgICB9CiAgICAgICAgYXJndW1lbnRzLndyaXRlKGludGVybmFsLlN5bWJvbC5jb21wdXRlVW5tYW5nbGVkTmFtZShrZXkpKTsKICAgICAgICBhcmd1bWVudHMud3JpdGUoIjogIik7CiAgICAgICAgYXJndW1lbnRzLndyaXRlKEVycm9yLnNhZmVUb1N0cmluZyh2YWx1ZSkpOwogICAgICAgIGFyZ3VtZW50Q291bnQrKzsKICAgICAgfSk7CiAgICB9CiAgICBib29sIGFyZ3NfbWlzbWF0Y2ggPSBfZXhpc3RpbmdBcmd1bWVudE5hbWVzICE9IG51bGw7CiAgICBTdHJpbmcgYXJnc19tZXNzYWdlID0gYXJnc19taXNtYXRjaCA/ICIgd2l0aCBtYXRjaGluZyBhcmd1bWVudHMiIDogIiI7CgogICAgU3RyaW5nIHR5cGVfc3RyOwogICAgaWYgKHR5cGUgPj0gMCAmJiB0eXBlIDwgNSkgewogICAgICB0eXBlX3N0ciA9IChjb25zdCBbCiAgICAgICAgIm1ldGhvZCIsCiAgICAgICAgImdldHRlciIsCiAgICAgICAgInNldHRlciIsCiAgICAgICAgImdldHRlciBvciBzZXR0ZXIiLAogICAgICAgICJ2YXJpYWJsZSIKICAgICAgXSlbdHlwZV07CiAgICB9CgogICAgU3RyaW5nQnVmZmVyIG1zZ19idWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJOb1N1Y2hNZXRob2RFcnJvcjogIik7CiAgICBib29sIGlzX3R5cGVfY2FsbCA9IGZhbHNlOwogICAgc3dpdGNoIChsZXZlbCkgewogICAgICBjYXNlIF9JbnZvY2F0aW9uTWlycm9yLl9EWU5BTUlDOgogICAgICAgIHsKICAgICAgICAgIGlmIChfcmVjZWl2ZXIgPT0gbnVsbCkgewogICAgICAgICAgICBpZiAoYXJnc19taXNtYXRjaCkgewogICAgICAgICAgICAgIG1zZ19idWYud3JpdGVsbigiVGhlIG51bGwgb2JqZWN0IGRvZXMgbm90IGhhdmUgYSAkdHlwZV9zdHIgIgogICAgICAgICAgICAgICAgICAiJyRtZW1iZXJOYW1lJyRhcmdzX21lc3NhZ2UuIik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbXNnX2J1ZgogICAgICAgICAgICAgICAgICAud3JpdGVsbigiVGhlICR0eXBlX3N0ciAnJG1lbWJlck5hbWUnIHdhcyBjYWxsZWQgb24gbnVsbC4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKF9yZWNlaXZlciBpcyBfQ2xvc3VyZSkgewogICAgICAgICAgICAgIG1zZ19idWYud3JpdGVsbigiQ2xvc3VyZSBjYWxsIHdpdGggbWlzbWF0Y2hlZCBhcmd1bWVudHM6ICIKICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uICckbWVtYmVyTmFtZSciKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChfcmVjZWl2ZXIgaXMgX1R5cGUgJiYgbWVtYmVyTmFtZSA9PSAiY2FsbCIpIHsKICAgICAgICAgICAgICBpc190eXBlX2NhbGwgPSB0cnVlOwogICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gX3JlY2VpdmVyLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgbXNnX2J1Zi53cml0ZWxuKCJBdHRlbXB0ZWQgdG8gdXNlIHR5cGUgJyRuYW1lJyBhcyBhIGZ1bmN0aW9uLiAiCiAgICAgICAgICAgICAgICAgICJTaW5jZSB0eXBlcyBkbyBub3QgZGVmaW5lIGEgbWV0aG9kICdjYWxsJywgdGhpcyBpcyBub3QgIgogICAgICAgICAgICAgICAgICAicG9zc2libGUuIERpZCB5b3UgaW50ZW5kIHRvIGNhbGwgdGhlICRuYW1lIGNvbnN0cnVjdG9yIGFuZCAiCiAgICAgICAgICAgICAgICAgICJmb3JnZXQgdGhlICduZXcnIG9wZXJhdG9yPyIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIG1zZ19idWYKICAgICAgICAgICAgICAgICAgLndyaXRlbG4oIkNsYXNzICcke19yZWNlaXZlci5ydW50aW1lVHlwZX0nIGhhcyBubyBpbnN0YW5jZSAiCiAgICAgICAgICAgICAgICAgICAgICAiJHR5cGVfc3RyICckbWVtYmVyTmFtZSckYXJnc19tZXNzYWdlLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIGNhc2UgX0ludm9jYXRpb25NaXJyb3IuX1NVUEVSOgogICAgICAgIHsKICAgICAgICAgIG1zZ19idWYud3JpdGVsbigiU3VwZXIgY2xhc3Mgb2YgY2xhc3MgJyR7X3JlY2VpdmVyLnJ1bnRpbWVUeXBlfScgaGFzICIKICAgICAgICAgICAgICAibm8gaW5zdGFuY2UgJHR5cGVfc3RyICckbWVtYmVyTmFtZSckYXJnc19tZXNzYWdlLiIpOwogICAgICAgICAgbWVtYmVyTmFtZSA9ICJzdXBlci4kbWVtYmVyTmFtZSI7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIGNhc2UgX0ludm9jYXRpb25NaXJyb3IuX1NUQVRJQzoKICAgICAgICB7CiAgICAgICAgICBtc2dfYnVmLndyaXRlbG4oIk5vIHN0YXRpYyAkdHlwZV9zdHIgJyRtZW1iZXJOYW1lJyRhcmdzX21lc3NhZ2UgIgogICAgICAgICAgICAgICJkZWNsYXJlZCBpbiBjbGFzcyAnJF9yZWNlaXZlcicuIik7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIGNhc2UgX0ludm9jYXRpb25NaXJyb3IuX0NPTlNUUlVDVE9SOgogICAgICAgIHsKICAgICAgICAgIG1zZ19idWYud3JpdGVsbigiTm8gY29uc3RydWN0b3IgJyRtZW1iZXJOYW1lJyRhcmdzX21lc3NhZ2UgZGVjbGFyZWQgIgogICAgICAgICAgICAgICJpbiBjbGFzcyAnJF9yZWNlaXZlcicuIik7CiAgICAgICAgICBtZW1iZXJOYW1lID0gIm5ldyAkbWVtYmVyTmFtZSI7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIGNhc2UgX0ludm9jYXRpb25NaXJyb3IuX1RPUF9MRVZFTDoKICAgICAgICB7CiAgICAgICAgICBtc2dfYnVmLndyaXRlbG4oIk5vIHRvcC1sZXZlbCAkdHlwZV9zdHIgJyRtZW1iZXJOYW1lJyRhcmdzX21lc3NhZ2UgIgogICAgICAgICAgICAgICJkZWNsYXJlZC4iKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAobGV2ZWwgPT0gX0ludm9jYXRpb25NaXJyb3IuX1RPUF9MRVZFTCkgewogICAgICBtc2dfYnVmLndyaXRlbG4oIlJlY2VpdmVyOiB0b3AtbGV2ZWwiKTsKICAgIH0gZWxzZSB7CiAgICAgIG1zZ19idWYud3JpdGVsbigiUmVjZWl2ZXI6ICR7RXJyb3Iuc2FmZVRvU3RyaW5nKF9yZWNlaXZlcil9Iik7CiAgICB9CgogICAgaWYgKHR5cGUgPT0gX0ludm9jYXRpb25NaXJyb3IuX01FVEhPRCkgewogICAgICBTdHJpbmcgbSA9IGlzX3R5cGVfY2FsbCA/ICIkX3JlY2VpdmVyIiA6ICIkbWVtYmVyTmFtZSI7CiAgICAgIG1zZ19idWYud3JpdGUoIlRyaWVkIGNhbGxpbmc6ICRtKCRhcmd1bWVudHMpIik7CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50Q291bnQgPT0gMCkgewogICAgICBtc2dfYnVmLndyaXRlKCJUcmllZCBjYWxsaW5nOiAkbWVtYmVyTmFtZSIpOwogICAgfSBlbHNlIGlmICh0eXBlID09IF9JbnZvY2F0aW9uTWlycm9yLl9TRVRURVIpIHsKICAgICAgbXNnX2J1Zi53cml0ZSgiVHJpZWQgY2FsbGluZzogJG1lbWJlck5hbWUkYXJndW1lbnRzIik7CiAgICB9IGVsc2UgewogICAgICBtc2dfYnVmLndyaXRlKCJUcmllZCBjYWxsaW5nOiAkbWVtYmVyTmFtZSA9ICRhcmd1bWVudHMiKTsKICAgIH0KCiAgICBpZiAoYXJnc19taXNtYXRjaCkgewogICAgICBTdHJpbmdCdWZmZXIgZm9ybWFsUGFyYW1ldGVycyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfZXhpc3RpbmdBcmd1bWVudE5hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGkgPiAwKSB7CiAgICAgICAgICBmb3JtYWxQYXJhbWV0ZXJzLndyaXRlKCIsICIpOwogICAgICAgIH0KICAgICAgICBmb3JtYWxQYXJhbWV0ZXJzLndyaXRlKF9leGlzdGluZ0FyZ3VtZW50TmFtZXNbaV0pOwogICAgICB9CiAgICAgIG1zZ19idWYud3JpdGUoIlxuRm91bmQ6ICRtZW1iZXJOYW1lKCRmb3JtYWxQYXJhbWV0ZXJzKSIpOwogICAgfQoKICAgIHJldHVybiBtc2dfYnVmLnRvU3RyaW5nKCk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNz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dGhleSBtYXRjaCB1cC4KICAgIC8vIFRPRE8obHJuKTogU2hvdWxkIHdlPyBXaHkgbm90IHRoZSBzYW1lIGJlbG93IGZvciB0aGUgdW5hcnkgY2FzZT8KICAgIHJldHVybiAoZXJyb3JIYW5kbGVyIGFzIGR5bmFtaWMpKGVycm9yLCBzdGFja1RyYWNlKTsKICB9IGVsc2UgewogICAgWm9uZVVuYXJ5Q2FsbGJhY2sgdW5hcnlFcnJvckhhbmRsZXIgPSBlcnJvckhhbmRsZXI7CiAgICByZXR1cm4gdW5hcnlFcnJvckhhbmRsZXIoZXJyb3IpOwogIH0KfQoVAE5OPAEUARVCQUdLJUg5CzglBAIBG2RhcnQ6YXN5bmMvYXN5bmNfZXJyb3IuZGFydDZvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29sbGVjdGlvbi9jb2xsZWN0aW9uLmRhcnSDMy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gQ2xhc3NlcyBhbmQgdXRpbGl0aWVzIHRoYXQgc3VwcGxlbWVudCB0aGUgY29sbGVjdGlvbiBzdXBwb3J0IGluIGRhcnQ6Y29yZS4KLy8vCi8vLyBUbyB1c2UgdGhpcyBsaWJyYXJ5IGluIHlvdXIgY29kZToKLy8vCi8vLyAgICAgaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOwovLy8KLy8vIHtAY2F0ZWdvcnkgQ29yZX0KbGlicmFyeSBkYXJ0LmNvbGxlY3Rpb247CgppbXBvcnQgJ2RhcnQ6X2ludGVybmFsJyBoaWRlIFN5bWJvbDsKaW1wb3J0ICdkYXJ0Om1hdGgnIHNob3cgUmFuZG9tOyAvLyBVc2VkIGJ5IExpc3RNaXhpbi5zaHVmZmxlLgoKcGFydCAnY29sbGVjdGlvbnMuZGFydCc7CnBhcnQgJ2hhc2hfbWFwLmRhcnQnOwpwYXJ0ICdoYXNoX3NldC5kYXJ0JzsKcGFydCAnaXRlcmFibGUuZGFydCc7CnBhcnQgJ2l0ZXJhdG9yLmRhcnQnOwpwYXJ0ICdsaW5rZWRfaGFzaF9tYXAuZGFydCc7CnBhcnQgJ2xpbmtlZF9oYXNoX3NldC5kYXJ0JzsKcGFydCAnbGlua2VkX2xpc3QuZGFydCc7CnBhcnQgJ2xpc3QuZGFydCc7CnBhcnQgJ21hcHMuZGFydCc7CnBhcnQgJ3F1ZXVlLmRhcnQnOwpwYXJ0ICdzZXQuZGFydCc7CnBhcnQgJ3NwbGF5X3RyZWUuZGFydCc7Ch8ATk48AU8EJgQiBBUZASU+ARkWFhYWHR0ZEhITERgBD2RhcnQ6Y29sbGVjdGlvbjRvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29sbGVjdGlvbi9oYXNoX21hcC5kYXJ0mTMvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvbGxlY3Rpb247CgovLy8gRGVmYXVsdCBmdW5jdGlvbiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbiBpbiBjdXN0b21pemVkIEhhc2hNYXBzCmJvb2wgX2RlZmF1bHRFcXVhbHMoYSwgYikgPT4gYSA9PSBiOwoKLy8vIERlZmF1bHQgZnVuY3Rpb24gZm9yIGhhc2gtY29kZSBjb21wdXRhdGlvbiBpbiBjdXN0b21pemVkIEhhc2hNYXBzCmludCBfZGVmYXVsdEhhc2hDb2RlKGEpID0+IGEuaGFzaENvZGU7CgovLy8gVHlwZSBvZiBjdXN0b20gZXF1YWxpdHkgZnVuY3Rpb24KdHlwZWRlZiBfRXF1YWxpdHk8Sz4gPSBib29sIEZ1bmN0aW9uKEsgYSwgSyBiKTsKCi8vLyBUeXBlIG9mIGN1c3RvbSBoYXNoIGNvZGUgZnVuY3Rpb24uCnR5cGVkZWYgX0hhc2hlcjxLPiA9IGludCBGdW5jdGlvbihLIG9iamVjdCk7CgovLy8gQSBoYXNoLXRhYmxlIGJhc2VkIGltcGxlbWVudGF0aW9uIG9mIFtNYXBdLgovLy8KLy8vIFRoZSBrZXlzIG9mIGEgYEhhc2hNYXBgIG11c3QgaGF2ZSBjb25zaXN0ZW50IFtPYmplY3QuPT1dCi8vLyBhbmQgW09iamVjdC5oYXNoQ29kZV0gaW1wbGVtZW50YXRpb25zLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGA9PWAgb3BlcmF0b3IKLy8vIG11c3QgZGVmaW5lIGEgc3RhYmxlIGVxdWl2YWxlbmNlIHJlbGF0aW9uIG9uIHRoZSBrZXlzIChyZWZsZXhpdmUsCi8vLyBzeW1tZXRyaWMsIHRyYW5zaXRpdmUsIGFuZCBjb25zaXN0ZW50IG92ZXIgdGltZSksIGFuZCB0aGF0IGBoYXNoQ29kZWAKLy8vIG11c3QgYmUgdGhlIHNhbWUgZm9yIG9iamVjdHMgdGhhdCBhcmUgY29uc2lkZXJlZCBlcXVhbCBieSBgPT1gLgovLy8KLy8vIFRoZSBtYXAgYWxsb3dzIGBudWxsYCBhcyBhIGtleS4KLy8vCi8vLyBJdGVyYXRpbmcgdGhlIG1hcCdzIGtleXMsIHZhbHVlcyBvciBlbnRyaWVzICh0aHJvdWdoIFtmb3JFYWNoXSkKLy8vIG1heSBoYXBwZW4gaW4gYW55IG9yZGVyLgovLy8gVGhlIGl0ZXJhdGlvbiBvcmRlciBvbmx5IGNoYW5nZXMgd2hlbiB0aGUgbWFwIGlzIG1vZGlmaWVkLgovLy8gVmFsdWVzIGFyZSBpdGVyYXRlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGVpciBhc3NvY2lhdGVkIGtleXMsCi8vLyBzbyBpdGVyYXRpbmcgdGhlIFtrZXlzXSBhbmQgW3ZhbHVlc10gaW4gcGFyYWxsZWwKLy8vIHdpbGwgZ2l2ZSBtYXRjaGluZyBrZXkgYW5kIHZhbHVlIHBhaXJzLgphYnN0cmFjdCBjbGFzcyBIYXNoTWFwPEssIFY+IGltcGxlbWVudHMgTWFwPEssIFY+IHsKICAvLy8gQ3JlYXRlcyBhbiB1bm9yZGVyZWQgaGFzaC10YWJsZSBiYXNlZCBbTWFwXS4KICAvLy8KICAvLy8gVGhlIGNyZWF0ZWQgbWFwIGlzIG5vdCBvcmRlcmVkIGluIGFueSB3YXkuIFdoZW4gaXRlcmF0aW5nIHRoZSBrZXlzIG9yCiAgLy8vIHZhbHVlcywgdGhlIGl0ZXJhdGlvbiBvcmRlciBpcyB1bnNwZWNpZmllZCBleGNlcHQgdGhhdCBpdCB3aWxsIHN0YXkgdGhlCiAgLy8vIHNhbWUgYXMgbG9uZyBhcyB0aGUgbWFwIGlzbid0IGNoYW5nZWQuCiAgLy8vCiAgLy8vIElmIFtlcXVhbHNdIGlzIHByb3ZpZGVkLCBpdCBpcyB1c2VkIHRvIGNvbXBhcmUgdGhlIGtleXMgaW4gdGhlIHRhYmxlIHdpdGgKICAvLy8gbmV3IGtleXMuIElmIFtlcXVhbHNdIGlzIG9taXR0ZWQsIHRoZSBrZXkncyBvd24gW09iamVjdC49PV0gaXMgdXNlZAogIC8vLyBpbnN0ZWFkLgogIC8vLwogIC8vLyBTaW1pbGFyLCBpZiBbaGFzaENvZGVdIGlzIHByb3ZpZGVkLCBpdCBpcyB1c2VkIHRvIHByb2R1Y2UgYSBoYXNoIHZhbHVlCiAgLy8vIGZvciBrZXlzIGluIG9yZGVyIHRvIHBsYWNlIHRoZW0gaW4gdGhlIGhhc2ggdGFibGUuIElmIGl0IGlzIG9taXR0ZWQsIHRoZQogIC8vLyBrZXkncyBvd24gW09iamVjdC5oYXNoQ29kZV0gaXMgdXNlZC4KICAvLy8KICAvLy8gSWYgdXNpbmcgbWV0aG9kcyBsaWtlIFtvcGVyYXRvciBbXV0sIFtyZW1vdmVdIGFuZCBbY29udGFpbnNLZXldIHRvZ2V0aGVyCiAgLy8vIHdpdGggYSBjdXN0b20gZXF1YWxpdHkgYW5kIGhhc2hjb2RlLCBhbiBleHRyYSBgaXNWYWxpZEtleWAgZnVuY3Rpb24KICAvLy8gY2FuIGJlIHN1cHBsaWVkLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBbZXF1YWxzXSBvcgogIC8vLyBbaGFzaENvZGVdIHdpdGggYW4gYXJndW1lbnQgdGhhdCBtYXkgbm90IGJlIGEgW0tdIGluc3RhbmNlLCBhbmQgaWYgdGhlCiAgLy8vIGNhbGwgcmV0dXJucyBmYWxzZSwgdGhlIGtleSBpcyBhc3N1bWVkIHRvIG5vdCBiZSBpbiB0aGUgc2V0LgogIC8vLyBUaGUgW2lzVmFsaWRLZXldIGZ1bmN0aW9uIGRlZmF1bHRzIHRvIGp1c3QgdGVzdGluZyBpZiB0aGUgb2JqZWN0IGlzIGEKICAvLy8gW0tdIGluc3RhbmNlLgogIC8vLwogIC8vLyBFeGFtcGxlOgogIC8vLwogIC8vLyAgICAgbmV3IEhhc2hNYXA8aW50LGludD4oZXF1YWxzOiAoaW50IGEsIGludCBiKSA9PiAoYiAtIGEpICUgNSA9PSAwLAogIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaENvZGU6IChpbnQgZSkgPT4gZSAlIDUpCiAgLy8vCiAgLy8vIFRoaXMgZXhhbXBsZSBtYXAgZG9lcyBub3QgbmVlZCBhbiBgaXNWYWxpZEtleWAgZnVuY3Rpb24gdG8gYmUgcGFzc2VkLgogIC8vLyBUaGUgZGVmYXVsdCBmdW5jdGlvbiBhY2NlcHRzIG9ubHkgYGludGAgdmFsdWVzLCB3aGljaCBjYW4gc2FmZWx5IGJlCiAgLy8vIHBhc3NlZCB0byBib3RoIHRoZSBgZXF1YWxzYCBhbmQgYGhhc2hDb2RlYCBmdW5jdGlvbnMuCiAgLy8vCiAgLy8vIElmIG5laXRoZXIgYGVxdWFsc2AsIGBoYXNoQ29kZWAsIG5vciBgaXNWYWxpZEtleWAgaXMgcHJvdmlkZWQsCiAgLy8vIHRoZSBkZWZhdWx0IGBpc1ZhbGlkS2V5YCBpbnN0ZWFkIGFjY2VwdHMgYWxsIGtleXMuCiAgLy8vIFRoZSBkZWZhdWx0IGVxdWFsaXR5IGFuZCBoYXNoY29kZSBvcGVyYXRpb25zIGFyZSBhc3N1bWVkIHRvIHdvcmsgb24gYWxsCiAgLy8vIG9iamVjdHMuCiAgLy8vCiAgLy8vIExpa2V3aXNlLCBpZiBgZXF1YWxzYCBpcyBbaWRlbnRpY2FsXSwgYGhhc2hDb2RlYCBpcyBbaWRlbnRpdHlIYXNoQ29kZV0KICAvLy8gYW5kIGBpc1ZhbGlkS2V5YCBpcyBvbWl0dGVkLCB0aGUgcmVzdWx0aW5nIG1hcCBpcyBpZGVudGl0eSBiYXNlZCwKICAvLy8gYW5kIHRoZSBgaXNWYWxpZEtleWAgZGVmYXVsdHMgdG8gYWNjZXB0aW5nIGFsbCBrZXlzLgogIC8vLyBTdWNoIGEgbWFwIGNhbiBiZSBjcmVhdGVkIGRpcmVjdGx5IHVzaW5nIFtIYXNoTWFwLmlkZW50aXR5XS4KICAvLy8KICAvLy8gVGhlIHVzZWQgYGVxdWFsc2AgYW5kIGBoYXNoQ29kZWAgbWV0aG9kIHNob3VsZCBhbHdheXMgYmUgY29uc2lzdGVudCwKICAvLy8gc28gdGhhdCBpZiBgZXF1YWxzKGEsIGIpYCB0aGVuIGBoYXNoQ29kZShhKSA9PSBoYXNoQ29kZShiKWAuIFRoZSBoYXNoCiAgLy8vIG9mIGFuIG9iamVjdCwgb3Igd2hhdCBpdCBjb21wYXJlcyBlcXVhbCB0bywgc2hvdWxkIG5vdCBjaGFuZ2Ugd2hpbGUgdGhlCiAgLy8vIG9iamVjdCBpcyBhIGtleSBpbiB0aGUgbWFwLiBJZiBpdCBkb2VzIGNoYW5nZSwgdGhlIHJlc3VsdCBpcwogIC8vLyB1bnByZWRpY3RhYmxlLgogIC8vLwogIC8vLyBJZiB5b3Ugc3VwcGx5IG9uZSBvZiBbZXF1YWxzXSBhbmQgW2hhc2hDb2RlXSwKICAvLy8geW91IHNob3VsZCBnZW5lcmFsbHkgYWxzbyB0byBzdXBwbHkgdGhlIG90aGVyLgogIGV4dGVybmFsIGZhY3RvcnkgSGFzaE1hcCgKICAgICAge2Jvb2wgZXF1YWxzKEsga2V5MSwgSyBrZXkyKSwKICAgICAgaW50IGhhc2hDb2RlKEsga2V5KSwKICAgICAgYm9vbCBpc1ZhbGlkS2V5KHBvdGVudGlhbEtleSl9KTsKCiAgLy8vIENyZWF0ZXMgYW4gdW5vcmRlcmVkIGlkZW50aXR5LWJhc2VkIG1hcC4KICAvLy8KICAvLy8gRWZmZWN0aXZlbHkgYSBzaG9ydGhhbmQgZm9yOgogIC8vLwogIC8vLyAgICAgbmV3IEhhc2hNYXA8SywgVj4oZXF1YWxzOiBpZGVudGljYWwsCiAgLy8vICAgICAgICAgICAgICAgICAgICAgICBoYXNoQ29kZTogaWRlbnRpdHlIYXNoQ29kZSkKICBleHRlcm5hbCBmYWN0b3J5IEhhc2hNYXAuaWRlbnRpdHkoKTsKCiAgLy8vIENyZWF0ZXMgYSBbSGFzaE1hcF0gdGhhdCBjb250YWlucyBhbGwga2V5L3ZhbHVlIHBhaXJzIG9mIFtvdGhlcl0uCiAgLy8vCiAgLy8vIFRoZSBrZXlzIG11c3QgYWxsIGJlIGluc3RhbmNlcyBvZiBbS10gYW5kIHRoZSB2YWx1ZXMgb2YgW1ZdLgogIC8vLyBUaGUgW290aGVyXSBtYXAgaXRzZWxmIGNhbiBoYXZlIGFueSB0eXBlLgogIGZhY3RvcnkgSGFzaE1hcC5mcm9tKE1hcCBvdGhlcikgewogICAgTWFwPEssIFY+IHJlc3VsdCA9IEhhc2hNYXA8SywgVj4oKTsKICAgIG90aGVyLmZvckVhY2goKGssIHYpIHsKICAgICAgcmVzdWx0W2tdID0gdjsKICAgIH0pOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBDcmVhdGVzIGEgW0hhc2hNYXBdIHRoYXQgY29udGFpbnMgYWxsIGtleS92YWx1ZSBwYWlycyBvZiBbb3RoZXJdLgogIGZhY3RvcnkgSGFzaE1hcC5vZihNYXA8SywgVj4gb3RoZXIpID0+IEhhc2hNYXA8SywgVj4oKS4uYWRkQWxsKG90aGVyKTsKCiAgLy8vIENyZWF0ZXMgYSBbSGFzaE1hcF0gd2hlcmUgdGhlIGtleXMgYW5kIHZhbHVlcyBhcmUgY29tcHV0ZWQgZnJvbSB0aGUKICAvLy8gW2l0ZXJhYmxlXS4KICAvLy8KICAvLy8gRm9yIGVhY2ggZWxlbWVudCBvZiB0aGUgW2l0ZXJhYmxlXSB0aGlzIGNvbnN0cnVjdG9yIGNvbXB1dGVzIGEga2V5L3ZhbHVlCiAgLy8vIHBhaXIsIGJ5IGFwcGx5aW5nIFtrZXldIGFuZCBbdmFsdWVdIHJlc3BlY3RpdmVseS4KICAvLy8KICAvLy8gVGhlIGtleXMgb2YgdGhlIGtleS92YWx1ZSBwYWlycyBkbyBub3QgbmVlZCB0byBiZSB1bmlxdWUuIFRoZSBsYXN0CiAgLy8vIG9jY3VycmVuY2Ugb2YgYSBrZXkgd2lsbCBzaW1wbHkgb3ZlcndyaXRlIGFueSBwcmV2aW91cyB2YWx1ZS4KICAvLy8KICAvLy8gSWYgbm8gdmFsdWVzIGFyZSBzcGVjaWZpZWQgZm9yIFtrZXldIGFuZCBbdmFsdWVdIHRoZSBkZWZhdWx0IGlzIHRoZQogIC8vLyBpZGVudGl0eSBmdW5jdGlvbi4KICBmYWN0b3J5IEhhc2hNYXAuZnJvbUl0ZXJhYmxlKEl0ZXJhYmxlIGl0ZXJhYmxlLAogICAgICB7SyBrZXkoZWxlbWVudCksIFYgdmFsdWUoZWxlbWVudCl9KSB7CiAgICBNYXA8SywgVj4gbWFwID0gSGFzaE1hcDxLLCBWPigpOwogICAgTWFwQmFzZS5fZmlsbE1hcFdpdGhNYXBwZWRJdGVyYWJsZShtYXAsIGl0ZXJhYmxlLCBrZXksIHZhbHVlKTsKICAgIHJldHVybiBtYXA7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIFtIYXNoTWFwXSBhc3NvY2lhdGluZyB0aGUgZ2l2ZW4gW2tleXNdIHRvIFt2YWx1ZXNdLgogIC8vLwogIC8vLyBUaGlzIGNvbnN0cnVjdG9yIGl0ZXJhdGVzIG92ZXIgW2tleXNdIGFuZCBbdmFsdWVzXSBhbmQgbWFwcyBlYWNoIGVsZW1lbnQKICAvLy8gb2YgW2tleXNdIHRvIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgW3ZhbHVlc10uCiAgLy8vCiAgLy8vIElmIFtrZXlzXSBjb250YWlucyB0aGUgc2FtZSBvYmplY3QgbXVsdGlwbGUgdGltZXMsIHRoZSBsYXN0IG9jY3VycmVuY2UKICAvLy8gb3ZlcndyaXRlcyB0aGUgcHJldmlvdXMgdmFsdWUuCiAgLy8vCiAgLy8vIEl0IGlzIGFuIGVycm9yIGlmIHRoZSB0d28gW0l0ZXJhYmxlXXMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGguCiAgZmFjdG9yeSBIYXNoTWFwLmZyb21JdGVyYWJsZXMoSXRlcmFibGU8Sz4ga2V5cywgSXRlcmFibGU8Vj4gdmFsdWVzKSB7CiAgICBNYXA8SywgVj4gbWFwID0gSGFzaE1hcDxLLCBWPigpOwogICAgTWFwQmFzZS5fZmlsbE1hcFdpdGhJdGVyYWJsZXMobWFwLCBrZXlzLCB2YWx1ZXMpOwogICAgcmV0dXJuIG1hcDsKICB9CgogIC8vLyBDcmVhdGVzIGEgW0hhc2hNYXBdIGNvbnRhaW5pbmcgdGhlIGVudHJpZXMgb2YgW2VudHJpZXNdLgogIC8vLwogIC8vLyBSZXR1cm5zIGEgbmV3IGBIYXNoTWFwPEssIFY+YCB3aGVyZSBhbGwgZW50cmllcyBvZiBbZW50cmllc10KICAvLy8gaGF2ZSBiZWVuIGFkZGVkIGluIGl0ZXJhdGlvbiBvcmRlci4KICAvLy8KICAvLy8gSWYgbXVsdGlwbGUgW2VudHJpZXNdIGhhdmUgdGhlIHNhbWUga2V5LAogIC8vLyBsYXRlciBvY2N1cnJlbmNlcyBvdmVyd3JpdGUgdGhlIGVhcmxpZXIgb25lcy4KICBAU2luY2UoIjIuMSIpCiAgZmFjdG9yeSBIYXNoTWFwLmZyb21FbnRyaWVzKEl0ZXJhYmxlPE1hcEVudHJ5PEssIFY+PiBlbnRyaWVzKSA9PgogICAgICBIYXNoTWFwPEssIFY+KCkuLmFkZEVudHJpZXMoZW50cmllcyk7Cn0KgJ4ATk48ARkBRCUBRicBJTABJy0BMAQ9TUZKRAQkBEQdP0Q1LDQzBkxOLQZQSg8GTU8rBk9KSk1DTBQGDwZLOwZMSjwGRTlODwZNSDtDBktMTkMVBjQ1HCQbJwEvBiMGLzgnAUgGQzAkKBsVCBMEAUhJAUoSBk84BklEBkoZMiwlQxAEAUQGTzoGTSUGSEglNhAEAT8GQyoGLzQQQywCAR1kYXJ0OmNvbGxlY3Rpb24vaGFzaF9tYXAuZGFydDZvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29sbGVjdGlvbi9zcGxheV90cmVlLmRhcnTAAGdkLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb2xsZWN0aW9uOwoKdHlwZWRlZiBfUHJlZGljYXRlPFQ+ID0gYm9vbCBGdW5jdGlvbihUIHZhbHVlKTsKCi8vLyBBIG5vZGUgaW4gYSBzcGxheSB0cmVlLiBJdCBob2xkcyB0aGUgc29ydGluZyBrZXkgYW5kIHRoZSBsZWZ0Ci8vLyBhbmQgcmlnaHQgY2hpbGRyZW4gaW4gdGhlIHRyZWUuCmNsYXNzIF9TcGxheVRyZWVOb2RlPEs+IHsKICBmaW5hbCBLIGtleTsKICBfU3BsYXlUcmVlTm9kZTxLPiBsZWZ0OwogIF9TcGxheVRyZWVOb2RlPEs+IHJpZ2h0OwoKICBfU3BsYXlUcmVlTm9kZSh0aGlzLmtleSk7Cn0KCi8vLyBBIG5vZGUgaW4gYSBzcGxheSB0cmVlIGJhc2VkIG1hcC4KLy8vCi8vLyBBIFtfU3BsYXlUcmVlTm9kZV0gdGhhdCBhbHNvIGNvbnRhaW5zIGEgdmFsdWUKY2xhc3MgX1NwbGF5VHJlZU1hcE5vZGU8SywgVj4gZXh0ZW5kcyBfU3BsYXlUcmVlTm9kZTxLPiB7CiAgViB2YWx1ZTsKICBfU3BsYXlUcmVlTWFwTm9kZShLIGtleSwgdGhpcy52YWx1ZSkgOiBzdXBlcihrZXkpOwp9CgovLy8gQSBzcGxheSB0cmVlIGlzIGEgc2VsZi1iYWxhbmNpbmcgYmluYXJ5IHNlYXJjaCB0cmVlLgovLy8KLy8vIEl0IGhhcyB0aGUgYWRkaXRpb25hbCBwcm9wZXJ0eSB0aGF0IHJlY2VudGx5IGFjY2Vzc2VkIGVsZW1lbnRzCi8vLyBhcmUgcXVpY2sgdG8gYWNjZXNzIGFnYWluLgovLy8gSXQgcGVyZm9ybXMgYmFzaWMgb3BlcmF0aW9ucyBzdWNoIGFzIGluc2VydGlvbiwgbG9vay11cCBhbmQKLy8vIHJlbW92YWwsIGluIE8obG9nKG4pKSBhbW9ydGl6ZWQgdGltZS4KYWJzdHJhY3QgY2xhc3MgX1NwbGF5VHJlZTxLLCBOb2RlIGV4dGVuZHMgX1NwbGF5VHJlZU5vZGU8Sz4+IHsKICAvLyBUaGUgcm9vdCBub2RlIG9mIHRoZSBzcGxheSB0cmVlLiBJdCB3aWxsIGNvbnRhaW4gZWl0aGVyIHRoZSBsYXN0CiAgLy8gZWxlbWVudCBpbnNlcnRlZCBvciB0aGUgbGFzdCBlbGVtZW50IGxvb2tlZCB1cC4KICBOb2RlIGdldCBfcm9vdDsKICBzZXQgX3Jvb3QoTm9kZSBuZXdWYWx1ZSk7CgogIC8vIFRoZSBkdW1teSBub2RlIHVzZWQgd2hlbiBwZXJmb3JtaW5nIGEgc3BsYXkgb24gdGhlIHRyZWUuIFJldXNpbmcgaXQKICAvLyBhdm9pZHMgYWxsb2NhdGluZyBhIG5vZGUgZWFjaCB0aW1lIGEgc3BsYXkgaXMgcGVyZm9ybWVkLgogIE5vZGUgZ2V0IF9kdW1teTsKCiAgLy8gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBzcGxheSB0cmVlLgogIGludCBfY291bnQgPSAwOwoKICAvLy8gQ291bnRlciBpbmNyZW1lbnRlZCB3aGVuZXZlciB0aGUga2V5cyBpbiB0aGUgbWFwIGNoYW5nZXMuCiAgLy8vCiAgLy8vIFVzZWQgdG8gZGV0ZWN0IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9ucy4KICBpbnQgX21vZGlmaWNhdGlvbkNvdW50ID0gMDsKCiAgLy8vIENvdW50ZXIgaW5jcmVtZW50ZWQgd2hlbmV2ZXIgdGhlIHRyZWUgc3RydWN0dXJlIGNoYW5nZXMuCiAgLy8vCiAgLy8vIFVzZWQgdG8gZGV0ZWN0IHRoYXQgYW4gaW4tcGxhY2UgdHJhdmVyc2FsIGNhbm5vdCB1c2UKICAvLy8gY2FjaGVkIGluZm9ybWF0aW9uIHRoYXQgcmVsaWVzIG9uIHRoZSB0cmVlIHN0cnVjdHVyZS4KICBpbnQgX3NwbGF5Q291bnQgPSAwOwoKICAvLy8gVGhlIGNvbXBhcmF0b3IgdGhhdCBpcyB1c2VkIGZvciB0aGlzIHNwbGF5IHRyZWUuCiAgQ29tcGFyYXRvcjxLPiBnZXQgX2NvbXBhcmF0b3I7CgogIC8vLyBUaGUgcHJlZGljYXRlIHRvIGRldGVybWluZSB0aGF0IGEgZ2l2ZW4gb2JqZWN0IGlzIGEgdmFsaWQga2V5LgogIF9QcmVkaWNhdGUgZ2V0IF92YWxpZEtleTsKCiAgLy8vIENvbXBhcmlzb24gdXNlZCB0byBjb21wYXJlIGtleXMuCiAgaW50IF9jb21wYXJlKEsga2V5MSwgSyBrZXkyKTsKCiAgLy8vIFBlcmZvcm0gdGhlIHNwbGF5IG9wZXJhdGlvbiBmb3IgdGhlIGdpdmVuIGtleS4gTW92ZXMgdGhlIG5vZGUgd2l0aAogIC8vLyB0aGUgZ2l2ZW4ga2V5IHRvIHRoZSB0b3Agb2YgdGhlIHRyZWUuICBJZiBubyBub2RlIGhhcyB0aGUgZ2l2ZW4KICAvLy8ga2V5LCB0aGUgbGFzdCBub2RlIG9uIHRoZSBzZWFyY2ggcGF0aCBpcyBtb3ZlZCB0byB0aGUgdG9wIG9mIHRoZQogIC8vLyB0cmVlLiBUaGlzIGlzIHRoZSBzaW1wbGlmaWVkIHRvcC1kb3duIHNwbGF5aW5nIGFsZ29yaXRobSBmcm9tOgogIC8vLyAiU2VsZi1hZGp1c3RpbmcgQmluYXJ5IFNlYXJjaCBUcmVlcyIgYnkgU2xlYXRvciBhbmQgVGFyamFuLgogIC8vLwogIC8vLyBSZXR1cm5zIHRoZSByZXN1bHQgb2YgY29tcGFyaW5nIHRoZSBuZXcgcm9vdCBvZiB0aGUgdHJlZSB0byBba2V5XS4KICAvLy8gUmV0dXJucyAtMSBpZiB0aGUgdGFibGUgaXMgZW1wdHkuCiAgaW50IF9zcGxheShLIGtleSkgewogICAgaWYgKF9yb290ID09IG51bGwpIHJldHVybiAtMTsKCiAgICAvLyBUaGUgcmlnaHQgY2hpbGQgb2YgdGhlIGR1bW15IG5vZGUgd2lsbCBob2xkCiAgICAvLyB0aGUgTCB0cmVlIG9mIHRoZSBhbGdvcml0aG0uICBUaGUgbGVmdCBjaGlsZCBvZiB0aGUgZHVtbXkgbm9kZQogICAgLy8gd2lsbCBob2xkIHRoZSBSIHRyZWUgb2YgdGhlIGFsZ29yaXRobS4gIFVzaW5nIGEgZHVtbXkgbm9kZSwgbGVmdAogICAgLy8gYW5kIHJpZ2h0IHdpbGwgYWx3YXlzIGJlIG5vZGVzIGFuZCB3ZSBhdm9pZCBzcGVjaWFsIGNhc2VzLgogICAgTm9kZSBsZWZ0ID0gX2R1bW15OwogICAgTm9kZSByaWdodCA9IF9kdW1teTsKICAgIE5vZGUgY3VycmVudCA9IF9yb290OwogICAgaW50IGNvbXA7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBjb21wID0gX2NvbXBhcmUoY3VycmVudC5rZXksIGtleSk7CiAgICAgIGlmIChjb21wID4gMCkgewogICAgICAgIGlmIChjdXJyZW50LmxlZnQgPT0gbnVsbCkgYnJlYWs7CiAgICAgICAgY29tcCA9IF9jb21wYXJlKGN1cnJlbnQubGVmdC5rZXksIGtleSk7CiAgICAgICAgaWYgKGNvbXAgPiAwKSB7CiAgICAgICAgICAvLyBSb3RhdGUgcmlnaHQuCiAgICAgICAgICBfU3BsYXlUcmVlTm9kZTxLPiB0bXAgPSBjdXJyZW50LmxlZnQ7CiAgICAgICAgICBjdXJyZW50LmxlZnQgPSB0bXAucmlnaHQ7CiAgICAgICAgICB0bXAucmlnaHQgPSBjdXJyZW50OwogICAgICAgICAgY3VycmVudCA9IHRtcDsKICAgICAgICAgIGlmIChjdXJyZW50LmxlZnQgPT0gbnVsbCkgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8vIExpbmsgcmlnaHQuCiAgICAgICAgcmlnaHQubGVmdCA9IGN1cnJlbnQ7CiAgICAgICAgcmlnaHQgPSBjdXJyZW50OwogICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmxlZnQ7CiAgICAgIH0gZWxzZSBpZiAoY29tcCA8IDApIHsKICAgICAgICBpZiAoY3VycmVudC5yaWdodCA9PSBudWxsKSBicmVhazsKICAgICAgICBjb21wID0gX2NvbXBhcmUoY3VycmVudC5yaWdodC5rZXksIGtleSk7CiAgICAgICAgaWYgKGNvbXAgPCAwKSB7CiAgICAgICAgICAvLyBSb3RhdGUgbGVmdC4KICAgICAgICAgIE5vZGUgdG1wID0gY3VycmVudC5yaWdodDsKICAgICAgICAgIGN1cnJlbnQucmlnaHQgPSB0bXAubGVmdDsKICAgICAgICAgIHRtcC5sZWZ0ID0gY3VycmVudDsKICAgICAgICAgIGN1cnJlbnQgPSB0bXA7CiAgICAgICAgICBpZiAoY3VycmVudC5yaWdodCA9PSBudWxsKSBicmVhazsKICAgICAgICB9CiAgICAgICAgLy8gTGluayBsZWZ0LgogICAgICAgIGxlZnQucmlnaHQgPSBjdXJyZW50OwogICAgICAgIGxlZnQgPSBjdXJyZW50OwogICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnJpZ2h0OwogICAgICB9IGVsc2UgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICAvLyBBc3NlbWJsZS4KICAgIGxlZnQucmlnaHQgPSBjdXJyZW50LmxlZnQ7CiAgICByaWdodC5sZWZ0ID0gY3VycmVudC5yaWdodDsKICAgIGN1cnJlbnQubGVmdCA9IF9kdW1teS5yaWdodDsKICAgIGN1cnJlbnQucmlnaHQgPSBfZHVtbXkubGVmdDsKICAgIF9yb290ID0gY3VycmVudDsKCiAgICBfZHVtbXkucmlnaHQgPSBudWxsOwogICAgX2R1bW15LmxlZnQgPSBudWxsOwogICAgX3NwbGF5Q291bnQrKzsKICAgIHJldHVybiBjb21wOwogIH0KCiAgLy8gRW11bGF0ZXMgc3BsYXlpbmcgd2l0aCBhIGtleSB0aGF0IGlzIHNtYWxsZXIgdGhhbiBhbnkgaW4gdGhlIHN1YnRyZWUKICAvLyBhbmNob3JlZCBhdCBbbm9kZV0uCiAgLy8gYW5kIHRoYXQgbm9kZSBpcyByZXR1cm5lZC4gSXQgc2hvdWxkIHJlcGxhY2UgdGhlIHJlZmVyZW5jZSB0byBbbm9kZV0KICAvLyBpbiBhbnkgcGFyZW50IHRyZWUgb3Igcm9vdCBwb2ludGVyLgogIGV4dGVybmFsIE5vZGUgX3NwbGF5TWluKE5vZGUgbm9kZSk7CgogIC8vIEVtdWxhdGVzIHNwbGF5aW5nIHdpdGggYSBrZXkgdGhhdCBpcyBncmVhdGVyIHRoYW4gYW55IGluIHRoZSBzdWJ0cmVlCiAgLy8gYW5jaG9yZWQgYXQgW25vZGVdLgogIC8vIEFmdGVyIHRoaXMsIHRoZSBsYXJnZXN0IGVsZW1lbnQgaW4gdGhlIHRyZWUgaXMgdGhlIHJvb3Qgb2YgdGhlIHN1YnRyZWUsCiAgLy8gYW5kIHRoYXQgbm9kZSBpcyByZXR1cm5lZC4gSXQgc2hvdWxkIHJlcGxhY2UgdGhlIHJlZmVyZW5jZSB0byBbbm9kZV0KICAvLyBpbiBhbnkgcGFyZW50IHRyZWUgb3Igcm9vdCBwb2ludGVyLgogIGV4dGVybmFsIE5vZGUgX3NwbGF5TWF4KE5vZGUgbm9kZSk7CgogIE5vZGUgX3JlbW92ZShLIGtleSkgewogICAgaWYgKF9yb290ID09IG51bGwpIHJldHVybiBudWxsOwogICAgaW50IGNvbXAgPSBfc3BsYXkoa2V5KTsKICAgIGlmIChjb21wICE9IDApIHJldHVybiBudWxsOwogICAgTm9kZSByZXN1bHQgPSBfcm9vdDsKICAgIF9jb3VudC0tOwogICAgLy8gYXNzZXJ0KF9jb3VudCA+PSAwKTsKICAgIGlmIChfcm9vdC5sZWZ0ID09IG51bGwpIHsKICAgICAgX3Jvb3QgPSBfcm9vdC5yaWdodDsKICAgIH0gZWxzZSB7CiAgICAgIE5vZGUgcmlnaHQgPSBfcm9vdC5yaWdodDsKICAgICAgLy8gU3BsYXkgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIG5ldyByb290IGhhcyBhbiBlbXB0eSByaWdodCBjaGlsZC4KICAgICAgX3Jvb3QgPSBfc3BsYXlNYXgoX3Jvb3QubGVmdCk7CiAgICAgIC8vIEluc2VydCB0aGUgb3JpZ2luYWwgcmlnaHQgY2hpbGQgYXMgdGhlIHJpZ2h0IGNoaWxkIG9mIHRoZSBuZXcKICAgICAgLy8gcm9vdC4KICAgICAgX3Jvb3QucmlnaHQgPSByaWdodDsKICAgIH0KICAgIF9tb2RpZmljYXRpb25Db3VudCsrOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBBZGRzIGEgbmV3IHJvb3Qgbm9kZSB3aXRoIHRoZSBnaXZlbiBba2V5XSBvciBbdmFsdWVdLgogIC8vLwogIC8vLyBUaGUgW2NvbXBdIHZhbHVlIGlzIHRoZSByZXN1bHQgb2YgY29tcGFyaW5nIHRoZSBleGlzdGluZyByb290J3Mga2V5CiAgLy8vIHdpdGgga2V5LgogIHZvaWQgX2FkZE5ld1Jvb3QoTm9kZSBub2RlLCBpbnQgY29tcCkgewogICAgX2NvdW50Kys7CiAgICBfbW9kaWZpY2F0aW9uQ291bnQrKzsKICAgIGlmIChfcm9vdCA9PSBudWxsKSB7CiAgICAgIF9yb290ID0gbm9kZTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gYXNzZXJ0KF9jb3VudCA+PSAwKTsKICAgIGlmIChjb21wIDwgMCkgewogICAgICBub2RlLmxlZnQgPSBfcm9vdDsKICAgICAgbm9kZS5yaWdodCA9IF9yb290LnJpZ2h0OwogICAgICBfcm9vdC5yaWdodCA9IG51bGw7CiAgICB9IGVsc2UgewogICAgICBub2RlLnJpZ2h0ID0gX3Jvb3Q7CiAgICAgIG5vZGUubGVmdCA9IF9yb290LmxlZnQ7CiAgICAgIF9yb290LmxlZnQgPSBudWxsOwogICAgfQogICAgX3Jvb3QgPSBub2RlOwogIH0KCiAgTm9kZSBnZXQgX2ZpcnN0IHsKICAgIGlmIChfcm9vdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIF9yb290ID0gX3NwbGF5TWluKF9yb290KTsKICAgIHJldHVybiBfcm9vdDsKICB9CgogIE5vZGUgZ2V0IF9sYXN0IHsKICAgIGlmIChfcm9vdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIF9yb290ID0gX3NwbGF5TWF4KF9yb290KTsKICAgIHJldHVybiBfcm9vdDsKICB9CgogIHZvaWQgX2NsZWFyKCkgewogICAgX3Jvb3QgPSBudWxsOwogICAgX2NvdW50ID0gMDsKICAgIF9tb2RpZmljYXRpb25Db3VudCsrOwogIH0KfQoKY2xhc3MgX1R5cGVUZXN0PFQ+IHsKICBib29sIHRlc3QodikgPT4gdiBpcyBUOwp9CgppbnQgX2R5bmFtaWNDb21wYXJlKGR5bmFtaWMgYSwgZHluYW1pYyBiKSA9PiBDb21wYXJhYmxlLmNvbXBhcmUoYSwgYik7CgpDb21wYXJhdG9yPEs+IF9kZWZhdWx0Q29tcGFyZTxLPigpIHsKICAvLyBJZiBLIDw6IENvbXBhcmFibGUsIHRoZW4gd2UgY2FuIGp1c3QgdXNlIENvbXBhcmFibGUuY29tcGFyZQogIC8vIHdpdGggbm8gY2FzdHMuCiAgT2JqZWN0IGNvbXBhcmUgPSBDb21wYXJhYmxlLmNvbXBhcmU7CiAgaWYgKGNvbXBhcmUgaXMgQ29tcGFyYXRvcjxLPikgewogICAgcmV0dXJuIGNvbXBhcmU7CiAgfQogIC8vIE90aGVyd2lzZSB3cmFwIGFuZCBjYXN0IHRoZSBhcmd1bWVudHMgb24gZWFjaCBjYWxsLgogIHJldHVybiBfZHluYW1pY0NvbXBhcmU7Cn0KCi8vLyBBIFtNYXBdIG9mIG9iamVjdHMgdGhhdCBjYW4gYmUgb3JkZXJlZCByZWxhdGl2ZSB0byBlYWNoIG90aGVyLgovLy8KLy8vIFRoZSBtYXAgaXMgYmFzZWQgb24gYSBzZWxmLWJhbGFuY2luZyBiaW5hcnkgdHJlZS4gSXQgYWxsb3dzIG1vc3Qgb3BlcmF0aW9ucwovLy8gaW4gYW1vcnRpemVkIGxvZ2FyaXRobWljIHRpbWUuCi8vLwovLy8gS2V5cyBvZiB0aGUgbWFwIGFyZSBjb21wYXJlZCB1c2luZyB0aGUgYGNvbXBhcmVgIGZ1bmN0aW9uIHBhc3NlZCBpbgovLy8gdGhlIGNvbnN0cnVjdG9yLCBib3RoIGZvciBvcmRlcmluZyBhbmQgZm9yIGVxdWFsaXR5LgovLy8gSWYgdGhlIG1hcCBjb250YWlucyBvbmx5IHRoZSBrZXkgYGFgLCB0aGVuIGBtYXAuY29udGFpbnNLZXkoYilgCi8vLyB3aWxsIHJldHVybiBgdHJ1ZWAgaWYgYW5kIG9ubHkgaWYgYGNvbXBhcmUoYSwgYikgPT0gMGAsCi8vLyBhbmQgdGhlIHZhbHVlIG9mIGBhID09IGJgIGlzIG5vdCBldmVuIGNoZWNrZWQuCi8vLyBJZiB0aGUgY29tcGFyZSBmdW5jdGlvbiBpcyBvbWl0dGVkLCB0aGUgb2JqZWN0cyBhcmUgYXNzdW1lZCB0byBiZQovLy8gW0NvbXBhcmFibGVdLCBhbmQgYXJlIGNvbXBhcmVkIHVzaW5nIHRoZWlyIFtDb21wYXJhYmxlLmNvbXBhcmVUb10gbWV0aG9kLgovLy8gTm9uLWNvbXBhcmFibGUgb2JqZWN0cyAoaW5jbHVkaW5nIGBudWxsYCkgd2lsbCBub3Qgd29yayBhcyBrZXlzCi8vLyBpbiB0aGF0IGNhc2UuCi8vLwovLy8gVG8gYWxsb3cgY2FsbGluZyBbb3BlcmF0b3IgW11dLCBbcmVtb3ZlXSBvciBbY29udGFpbnNLZXldIHdpdGggb2JqZWN0cwovLy8gdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgYGNvbXBhcmVgIGZ1bmN0aW9uLCBhbiBleHRyYSBgaXNWYWxpZEtleWAKLy8vIHByZWRpY2F0ZSBmdW5jdGlvbiBjYW4gYmUgc3VwcGxpZWQuIFRoaXMgZnVuY3Rpb24gaXMgdGVzdGVkIGJlZm9yZQovLy8gdXNpbmcgdGhlIGBjb21wYXJlYCBmdW5jdGlvbiBvbiBhbiBhcmd1bWVudCB2YWx1ZSB0aGF0IG1heSBub3QgYmUgYSBbS10KLy8vIHZhbHVlLiBJZiBvbWl0dGVkLCB0aGUgYGlzVmFsaWRLZXlgIGZ1bmN0aW9uIGRlZmF1bHRzIHRvIHRlc3RpbmcgaWYgdGhlCi8vLyB2YWx1ZSBpcyBhIFtLXS4KY2xhc3MgU3BsYXlUcmVlTWFwPEssIFY+IGV4dGVuZHMgX1NwbGF5VHJlZTxLLCBfU3BsYXlUcmVlTWFwTm9kZTxLLCBWPj4KICAgIHdpdGggTWFwTWl4aW48SywgVj4gewogIF9TcGxheVRyZWVNYXBOb2RlPEssIFY+IF9yb290OwogIGZpbmFsIF9TcGxheVRyZWVNYXBOb2RlPEssIFY+IF9kdW1teSA9IF9TcGxheVRyZWVNYXBOb2RlPEssIFY+KG51bGwsIG51bGwpOwoKICBDb21wYXJhdG9yPEs+IF9jb21wYXJhdG9yOwogIF9QcmVkaWNhdGUgX3ZhbGlkS2V5OwoKICBTcGxheVRyZWVNYXAoW2ludCBjb21wYXJlKEsga2V5MSwgSyBrZXkyKSwgYm9vbCBpc1ZhbGlkS2V5KHBvdGVudGlhbEtleSldKQogICAgICA6IF9jb21wYXJhdG9yID0gY29tcGFyZSA/PyBfZGVmYXVsdENvbXBhcmU8Sz4oKSwKICAgICAgICBfdmFsaWRLZXkgPSBpc1ZhbGlkS2V5ID8/ICgodikgPT4gdiBpcyBLKTsKCiAgLy8vIENyZWF0ZXMgYSBbU3BsYXlUcmVlTWFwXSB0aGF0IGNvbnRhaW5zIGFsbCBrZXkvdmFsdWUgcGFpcnMgb2YgW290aGVyXS4KICAvLy8KICAvLy8gVGhlIGtleXMgbXVzdCBhbGwgYmUgaW5zdGFuY2VzIG9mIFtLXSBhbmQgdGhlIHZhbHVlcyBvZiBbVl0uCiAgLy8vIFRoZSBbb3RoZXJdIG1hcCBpdHNlbGYgY2FuIGhhdmUgYW55IHR5cGUuCiAgZmFjdG9yeSBTcGxheVRyZWVNYXAuZnJvbShNYXAgb3RoZXIsCiAgICAgIFtpbnQgY29tcGFyZShLIGtleTEsIEsga2V5MiksIGJvb2wgaXNWYWxpZEtleShwb3RlbnRpYWxLZXkpXSkgewogICAgU3BsYXlUcmVlTWFwPEssIFY+IHJlc3VsdCA9IFNwbGF5VHJlZU1hcDxLLCBWPihjb21wYXJlLCBpc1ZhbGlkS2V5KTsKICAgIG90aGVyLmZvckVhY2goKGssIHYpIHsKICAgICAgcmVzdWx0W2tdID0gdjsKICAgIH0pOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBDcmVhdGVzIGEgW1NwbGF5VHJlZU1hcF0gdGhhdCBjb250YWlucyBhbGwga2V5L3ZhbHVlIHBhaXJzIG9mIFtvdGhlcl0uCiAgZmFjdG9yeSBTcGxheVRyZWVNYXAub2YoTWFwPEssIFY+IG90aGVyLAogICAgICAgICAgW2ludCBjb21wYXJlKEsga2V5MSwgSyBrZXkyKSwgYm9vbCBpc1ZhbGlkS2V5KHBvdGVudGlhbEtleSldKSA9PgogICAgICBTcGxheVRyZWVNYXA8SywgVj4oY29tcGFyZSwgaXNWYWxpZEtleSkuLmFkZEFsbChvdGhlcik7CgogIC8vLyBDcmVhdGVzIGEgW1NwbGF5VHJlZU1hcF0gd2hlcmUgdGhlIGtleXMgYW5kIHZhbHVlcyBhcmUgY29tcHV0ZWQgZnJvbSB0aGUKICAvLy8gW2l0ZXJhYmxlXS4KICAvLy8KICAvLy8gRm9yIGVhY2ggZWxlbWVudCBvZiB0aGUgW2l0ZXJhYmxlXSB0aGlzIGNvbnN0cnVjdG9yIGNvbXB1dGVzIGEga2V5L3ZhbHVlCiAgLy8vIHBhaXIsIGJ5IGFwcGx5aW5nIFtrZXldIGFuZCBbdmFsdWVdIHJlc3BlY3RpdmVseS4KICAvLy8KICAvLy8gVGhlIGtleXMgb2YgdGhlIGtleS92YWx1ZSBwYWlycyBkbyBub3QgbmVlZCB0byBiZSB1bmlxdWUuIFRoZSBsYXN0CiAgLy8vIG9jY3VycmVuY2Ugb2YgYSBrZXkgd2lsbCBzaW1wbHkgb3ZlcndyaXRlIGFueSBwcmV2aW91cyB2YWx1ZS4KICAvLy8KICAvLy8gSWYgbm8gZnVuY3Rpb25zIGFyZSBzcGVjaWZpZWQgZm9yIFtrZXldIGFuZCBbdmFsdWVdIHRoZSBkZWZhdWx0IGlzIHRvCiAgLy8vIHVzZSB0aGUgaXRlcmFibGUgdmFsdWUgaXRzZWxmLgogIGZhY3RvcnkgU3BsYXlUcmVlTWFwLmZyb21JdGVyYWJsZShJdGVyYWJsZSBpdGVyYWJsZSwKICAgICAge0sga2V5KGVsZW1lbnQpLAogICAgICBWIHZhbHVlKGVsZW1lbnQpLAogICAgICBpbnQgY29tcGFyZShLIGtleTEsIEsga2V5MiksCiAgICAgIGJvb2wgaXNWYWxpZEtleShwb3RlbnRpYWxLZXkpfSkgewogICAgU3BsYXlUcmVlTWFwPEssIFY+IG1hcCA9IFNwbGF5VHJlZU1hcDxLLCBWPihjb21wYXJlLCBpc1ZhbGlkS2V5KTsKICAgIE1hcEJhc2UuX2ZpbGxNYXBXaXRoTWFwcGVkSXRlcmFibGUobWFwLCBpdGVyYWJsZSwga2V5LCB2YWx1ZSk7CiAgICByZXR1cm4gbWFwOwogIH0KCiAgLy8vIENyZWF0ZXMgYSBbU3BsYXlUcmVlTWFwXSBhc3NvY2lhdGluZyB0aGUgZ2l2ZW4gW2tleXNdIHRvIFt2YWx1ZXNdLgogIC8vLwogIC8vLyBUaGlzIGNvbnN0cnVjdG9yIGl0ZXJhdGVzIG92ZXIgW2tleXNdIGFuZCBbdmFsdWVzXSBhbmQgbWFwcyBlYWNoIGVsZW1lbnQKICAvLy8gb2YgW2tleXNdIHRvIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgW3ZhbHVlc10uCiAgLy8vCiAgLy8vIElmIFtrZXlzXSBjb250YWlucyB0aGUgc2FtZSBvYmplY3QgbXVsdGlwbGUgdGltZXMsIHRoZSBsYXN0IG9jY3VycmVuY2UKICAvLy8gb3ZlcndyaXRlcyB0aGUgcHJldmlvdXMgdmFsdWUuCiAgLy8vCiAgLy8vIEl0IGlzIGFuIGVycm9yIGlmIHRoZSB0d28gW0l0ZXJhYmxlXXMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGguCiAgZmFjdG9yeSBTcGxheVRyZWVNYXAuZnJvbUl0ZXJhYmxlcyhJdGVyYWJsZTxLPiBrZXlzLCBJdGVyYWJsZTxWPiB2YWx1ZXMsCiAgICAgIFtpbnQgY29tcGFyZShLIGtleTEsIEsga2V5MiksIGJvb2wgaXNWYWxpZEtleShwb3RlbnRpYWxLZXkpXSkgewogICAgU3BsYXlUcmVlTWFwPEssIFY+IG1hcCA9IFNwbGF5VHJlZU1hcDxLLCBWPihjb21wYXJlLCBpc1ZhbGlkS2V5KTsKICAgIE1hcEJhc2UuX2ZpbGxNYXBXaXRoSXRlcmFibGVzKG1hcCwga2V5cywgdmFsdWVzKTsKICAgIHJldHVybiBtYXA7CiAgfQoKICBpbnQgX2NvbXBhcmUoSyBrZXkxLCBLIGtleTIpID0+IF9jb21wYXJhdG9yKGtleTEsIGtleTIpOwoKICBTcGxheVRyZWVNYXAuX2ludGVybmFsKCk7CgogIFYgb3BlcmF0b3IgW10oT2JqZWN0IGtleSkgewogICAgaWYgKCFfdmFsaWRLZXkoa2V5KSkgcmV0dXJuIG51bGw7CiAgICBpZiAoX3Jvb3QgIT0gbnVsbCkgewogICAgICBpbnQgY29tcCA9IF9zcGxheShrZXkpOwogICAgICBpZiAoY29tcCA9PSAwKSB7CiAgICAgICAgcmV0dXJuIF9yb290LnZhbHVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIFYgcmVtb3ZlKE9iamVjdCBrZXkpIHsKICAgIGlmICghX3ZhbGlkS2V5KGtleSkpIHJldHVybiBudWxsOwogICAgX1NwbGF5VHJlZU1hcE5vZGU8SywgVj4gbWFwUm9vdCA9IF9yZW1vdmUoa2V5KTsKICAgIGlmIChtYXBSb290ICE9IG51bGwpIHJldHVybiBtYXBSb290LnZhbHVlOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShLIGtleSwgViB2YWx1ZSkgewogICAgaWYgKGtleSA9PSBudWxsKSB0aHJvdyBBcmd1bWVudEVycm9yKGtleSk7CiAgICAvLyBTcGxheSBvbiB0aGUga2V5IHRvIG1vdmUgdGhlIGxhc3Qgbm9kZSBvbiB0aGUgc2VhcmNoIHBhdGggZm9yCiAgICAvLyB0aGUga2V5IHRvIHRoZSByb290IG9mIHRoZSB0cmVlLgogICAgaW50IGNvbXAgPSBfc3BsYXkoa2V5KTsKICAgIGlmIChjb21wID09IDApIHsKICAgICAgX3Jvb3QudmFsdWUgPSB2YWx1ZTsKICAgICAgcmV0dXJuOwogICAgfQogICAgX2FkZE5ld1Jvb3QoX1NwbGF5VHJlZU1hcE5vZGUoa2V5LCB2YWx1ZSksIGNvbXApOwogIH0KCiAgViBwdXRJZkFic2VudChLIGtleSwgViBpZkFic2VudCgpKSB7CiAgICBpZiAoa2V5ID09IG51bGwpIHRocm93IEFyZ3VtZW50RXJyb3Ioa2V5KTsKICAgIGludCBjb21wID0gX3NwbGF5KGtleSk7CiAgICBpZiAoY29tcCA9PSAwKSB7CiAgICAgIHJldHVybiBfcm9vdC52YWx1ZTsKICAgIH0KICAgIGludCBtb2RpZmljYXRpb25Db3VudCA9IF9tb2RpZmljYXRpb25Db3VudDsKICAgIGludCBzcGxheUNvdW50ID0gX3NwbGF5Q291bnQ7CiAgICBWIHZhbHVlID0gaWZBYnNlbnQoKTsKICAgIGlmIChtb2RpZmljYXRpb25Db3VudCAhPSBfbW9kaWZpY2F0aW9uQ291bnQpIHsKICAgICAgdGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgfQogICAgaWYgKHNwbGF5Q291bnQgIT0gX3NwbGF5Q291bnQpIHsKICAgICAgY29tcCA9IF9zcGxheShrZXkpOwogICAgICAvLyBLZXkgaXMgc3RpbGwgbm90IHRoZXJlLCBvdGhlcndpc2UgX21vZGlmaWNhdGlvbkNvdW50IHdvdWxkIGJlIGNoYW5nZWQuCiAgICAgIGFzc2VydChjb21wICE9IDApOwogICAgfQogICAgX2FkZE5ld1Jvb3QoX1NwbGF5VHJlZU1hcE5vZGUoa2V5LCB2YWx1ZSksIGNvbXApOwogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgdm9pZCBhZGRBbGwoTWFwPEssIFY+IG90aGVyKSB7CiAgICBvdGhlci5mb3JFYWNoKChLIGtleSwgViB2YWx1ZSkgewogICAgICB0aGlzW2tleV0gPSB2YWx1ZTsKICAgIH0pOwogIH0KCiAgYm9vbCBnZXQgaXNFbXB0eSB7CiAgICByZXR1cm4gKF9yb290ID09IG51bGwpOwogIH0KCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiAhaXNFbXB0eTsKCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihLIGtleSwgViB2YWx1ZSkpIHsKICAgIEl0ZXJhdG9yPF9TcGxheVRyZWVOb2RlPEs+PiBub2RlcyA9IF9TcGxheVRyZWVOb2RlSXRlcmF0b3I8Sz4odGhpcyk7CiAgICB3aGlsZSAobm9kZXMubW92ZU5leHQoKSkgewogICAgICBfU3BsYXlUcmVlTWFwTm9kZTxLLCBWPiBub2RlID0gbm9kZXMuY3VycmVudDsKICAgICAgZihub2RlLmtleSwgbm9kZS52YWx1ZSk7CiAgICB9CiAgfQoKICBpbnQgZ2V0IGxlbmd0aCB7CiAgICByZXR1cm4gX2NvdW50OwogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIF9jbGVhcigpOwogIH0KCiAgYm9vbCBjb250YWluc0tleShPYmplY3Qga2V5KSB7CiAgICByZXR1cm4gX3ZhbGlkS2V5KGtleSkgJiYgX3NwbGF5KGtleSkgPT0gMDsKICB9CgogIGJvb2wgY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsKICAgIGludCBpbml0aWFsU3BsYXlDb3VudCA9IF9zcGxheUNvdW50OwogICAgYm9vbCB2aXNpdChfU3BsYXlUcmVlTWFwTm9kZSBub2RlKSB7CiAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHsKICAgICAgICBpZiAobm9kZS52YWx1ZSA9PSB2YWx1ZSkgcmV0dXJuIHRydWU7CiAgICAgICAgaWYgKGluaXRpYWxTcGxheUNvdW50ICE9IF9zcGxheUNvdW50KSB7CiAgICAgICAgICB0aHJvdyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgICAgfQogICAgICAgIGlmIChub2RlLnJpZ2h0ICE9IG51bGwgJiYgdmlzaXQobm9kZS5yaWdodCkpIHJldHVybiB0cnVlOwogICAgICAgIG5vZGUgPSBub2RlLmxlZnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHJldHVybiB2aXNpdChfcm9vdCk7CiAgfQoKICBJdGVyYWJsZTxLPiBnZXQga2V5cyA9PiBfU3BsYXlUcmVlS2V5SXRlcmFibGU8Sz4odGhpcyk7CgogIEl0ZXJhYmxlPFY+IGdldCB2YWx1ZXMgPT4gX1NwbGF5VHJlZVZhbHVlSXRlcmFibGU8SywgVj4odGhpcyk7CgogIC8vLyBHZXQgdGhlIGZpcnN0IGtleSBpbiB0aGUgbWFwLiBSZXR1cm5zIFs6bnVsbDpdIGlmIHRoZSBtYXAgaXMgZW1wdHkuCiAgSyBmaXJzdEtleSgpIHsKICAgIGlmIChfcm9vdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBfZmlyc3Qua2V5OwogIH0KCiAgLy8vIEdldCB0aGUgbGFzdCBrZXkgaW4gdGhlIG1hcC4gUmV0dXJucyBbOm51bGw6XSBpZiB0aGUgbWFwIGlzIGVtcHR5LgogIEsgbGFzdEtleSgpIHsKICAgIGlmIChfcm9vdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBfbGFzdC5rZXk7CiAgfQoKICAvLy8gR2V0IHRoZSBsYXN0IGtleSBpbiB0aGUgbWFwIHRoYXQgaXMgc3RyaWN0bHkgc21hbGxlciB0aGFuIFtrZXldLiBSZXR1cm5zCiAgLy8vIFs6bnVsbDpdIGlmIG5vIGtleSB3YXMgbm90IGZvdW5kLgogIEsgbGFzdEtleUJlZm9yZShLIGtleSkgewogICAgaWYgKGtleSA9PSBudWxsKSB0aHJvdyBBcmd1bWVudEVycm9yKGtleSk7CiAgICBpZiAoX3Jvb3QgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBpbnQgY29tcCA9IF9zcGxheShrZXkpOwogICAgaWYgKGNvbXAgPCAwKSByZXR1cm4gX3Jvb3Qua2V5OwogICAgX1NwbGF5VHJlZU5vZGU8Sz4gbm9kZSA9IF9yb290LmxlZnQ7CiAgICBpZiAobm9kZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHdoaWxlIChub2RlLnJpZ2h0ICE9IG51bGwpIHsKICAgICAgbm9kZSA9IG5vZGUucmlnaHQ7CiAgICB9CiAgICByZXR1cm4gbm9kZS5rZXk7CiAgfQoKICAvLy8gR2V0IHRoZSBmaXJzdCBrZXkgaW4gdGhlIG1hcCB0aGF0IGlzIHN0cmljdGx5IGxhcmdlciB0aGFuIFtrZXldLiBSZXR1cm5zCiAgLy8vIFs6bnVsbDpdIGlmIG5vIGtleSB3YXMgbm90IGZvdW5kLgogIEsgZmlyc3RLZXlBZnRlcihLIGtleSkgewogICAgaWYgKGtleSA9PSBudWxsKSB0aHJvdyBBcmd1bWVudEVycm9yKGtleSk7CiAgICBpZiAoX3Jvb3QgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBpbnQgY29tcCA9IF9zcGxheShrZXkpOwogICAgaWYgKGNvbXAgPiAwKSByZXR1cm4gX3Jvb3Qua2V5OwogICAgX1NwbGF5VHJlZU5vZGU8Sz4gbm9kZSA9IF9yb290LnJpZ2h0OwogICAgaWYgKG5vZGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICB3aGlsZSAobm9kZS5sZWZ0ICE9IG51bGwpIHsKICAgICAgbm9kZSA9IG5vZGUubGVmdDsKICAgIH0KICAgIHJldHVybiBub2RlLmtleTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIF9TcGxheVRyZWVJdGVyYXRvcjxLLCBUPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPFQ+IHsKICBmaW5hbCBfU3BsYXlUcmVlPEssIF9TcGxheVRyZWVOb2RlPEs+PiBfdHJlZTsKCiAgLy8vIFdvcmtsaXN0IG9mIG5vZGVzIHRvIHZpc2l0LgogIC8vLwogIC8vLyBUaGVzZSBub2RlcyBoYXZlIGJlZW4gcGFzc2VkIG92ZXIgb24gdGhlIHdheSBkb3duIGluIGEKICAvLy8gZGVwdGgtZmlyc3QgbGVmdC10by1yaWdodCB0cmF2ZXJzYWwuIFZpc2l0aW5nIGVhY2ggbm9kZSwKICAvLy8gYW5kIHRoZWlyIHJpZ2h0IHN1YnRyZWVzIHdpbGwgdmlzaXQgdGhlIHJlbWFpbmRlciBvZgogIC8vLyB0aGUgbm9kZXMgb2YgYSBmdWxsIHRyYXZlcnNhbC4KICAvLy8KICAvLy8gT25seSB2YWxpZCBhcyBsb25nIGFzIHRoZSBvcmlnaW5hbCB0cmVlIGlzbid0IHJlb3JkZXJlZC4KICBmaW5hbCBMaXN0PF9TcGxheVRyZWVOb2RlPEs+PiBfd29ya0xpc3QgPSA8X1NwbGF5VHJlZU5vZGU8Sz4+W107CgogIC8vLyBPcmlnaW5hbCBtb2RpZmljYXRpb24gY291bnRlciBvZiBbX3RyZWVdLgogIC8vLwogIC8vLyBJbmNyZW1lbnRlZCBvbiBbX3RyZWVdIHdoZW4gYSBrZXkgaXMgYWRkZWQgb3IgcmVtb3ZlZC4KICAvLy8gSWYgaXQgY2hhbmdlcywgaXRlcmF0aW9uIGlzIGFib3J0ZWQuCiAgLy8vCiAgLy8vIE5vdCBmaW5hbCBiZWNhdXNlIHNvbWUgaXRlcmF0b3JzIG1heSBtb2RpZnkgdGhlIHRyZWUga25vd2luZ2x5LAogIC8vLyBhbmQgdGhleSB1cGRhdGUgdGhlIG1vZGlmaWNhdGlvbiBjb3VudCBpbiB0aGF0IGNhc2UuCiAgaW50IF9tb2RpZmljYXRpb25Db3VudDsKCiAgLy8vIENvdW50IG9mIHNwbGF5IG9wZXJhdGlvbnMgb24gW190cmVlXSB3aGVuIFtfd29ya0xpc3RdIHdhcyBidWlsdC4KICAvLy8KICAvLy8gSWYgdGhlIHNwbGF5IGNvdW50IG9uIFtfdHJlZV0gaW5jcmVhc2VzLCBbX3dvcmtMaXN0XSBiZWNvbWVzIGludmFsaWQuCiAgaW50IF9zcGxheUNvdW50OwoKICAvLy8gQ3VycmVudCBub2RlLgogIF9TcGxheVRyZWVOb2RlPEs+IF9jdXJyZW50Tm9kZTsKCiAgX1NwbGF5VHJlZUl0ZXJhdG9yKF9TcGxheVRyZWU8SywgX1NwbGF5VHJlZU5vZGU8Sz4+IHRyZWUpCiAgICAgIDogX3RyZWUgPSB0cmVlLAogICAgICAgIF9tb2RpZmljYXRpb25Db3VudCA9IHRyZWUuX21vZGlmaWNhdGlvbkNvdW50LAogICAgICAgIF9zcGxheUNvdW50ID0gdHJlZS5fc3BsYXlDb3VudCB7CiAgICBfZmluZExlZnRNb3N0RGVzY2VuZGVudCh0cmVlLl9yb290KTsKICB9CgogIF9TcGxheVRyZWVJdGVyYXRvci5zdGFydEF0KF9TcGxheVRyZWU8SywgX1NwbGF5VHJlZU5vZGU8Sz4+IHRyZWUsIEsgc3RhcnRLZXkpCiAgICAgIDogX3RyZWUgPSB0cmVlLAogICAgICAgIF9tb2RpZmljYXRpb25Db3VudCA9IHRyZWUuX21vZGlmaWNhdGlvbkNvdW50IHsKICAgIGlmICh0cmVlLl9yb290ID09IG51bGwpIHJldHVybjsKICAgIGludCBjb21wYXJlID0gdHJlZS5fc3BsYXkoc3RhcnRLZXkpOwogICAgX3NwbGF5Q291bnQgPSB0cmVlLl9zcGxheUNvdW50OwogICAgaWYgKGNvbXBhcmUgPCAwKSB7CiAgICAgIC8vIERvbid0IGluY2x1ZGUgdGhlIHJvb3QsIHN0YXJ0IGF0IHRoZSBuZXh0IGVsZW1lbnQgYWZ0ZXIgdGhlIHJvb3QuCiAgICAgIF9maW5kTGVmdE1vc3REZXNjZW5kZW50KHRyZWUuX3Jvb3QucmlnaHQpOwogICAgfSBlbHNlIHsKICAgICAgX3dvcmtMaXN0LmFkZCh0cmVlLl9yb290KTsKICAgIH0KICB9CgogIFQgZ2V0IGN1cnJlbnQgewogICAgaWYgKF9jdXJyZW50Tm9kZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBfZ2V0VmFsdWUoX2N1cnJlbnROb2RlKTsKICB9CgogIHZvaWQgX2ZpbmRMZWZ0TW9zdERlc2NlbmRlbnQoX1NwbGF5VHJlZU5vZGU8Sz4gbm9kZSkgewogICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkgewogICAgICBfd29ya0xpc3QuYWRkKG5vZGUpOwogICAgICBub2RlID0gbm9kZS5sZWZ0OwogICAgfQogIH0KCiAgLy8vIENhbGxlZCB3aGVuIHRoZSB0cmVlIHN0cnVjdHVyZSBvZiB0aGUgdHJlZSBoYXMgY2hhbmdlZC4KICAvLy8KICAvLy8gVGhpcyBjYW4gYmUgY2F1c2VkIGJ5IGEgc3BsYXkgb3BlcmF0aW9uLgogIC8vLyBJZiB0aGUga2V5LXNldCBjaGFuZ2VzLCBpdGVyYXRpb24gaXMgYWJvcnRlZCBiZWZvcmUgZ2V0dGluZwogIC8vLyBoZXJlLCBzbyB3ZSBrbm93IHRoYXQgdGhlIGtleXMgYXJlIHRoZSBzYW1lIGFzIGJlZm9yZSwgaXQncwogIC8vLyBvbmx5IHRoZSB0cmVlIHRoYXQgaGFzIGJlZW4gcmVvcmRlcmVkLgogIHZvaWQgX3JlYnVpbGRXb3JrTGlzdChfU3BsYXlUcmVlTm9kZTxLPiBjdXJyZW50Tm9kZSkgewogICAgYXNzZXJ0KF93b3JrTGlzdC5pc05vdEVtcHR5KTsKICAgIF93b3JrTGlzdC5jbGVhcigpOwogICAgaWYgKGN1cnJlbnROb2RlID09IG51bGwpIHsKICAgICAgX2ZpbmRMZWZ0TW9zdERlc2NlbmRlbnQoX3RyZWUuX3Jvb3QpOwogICAgfSBlbHNlIHsKICAgICAgX3RyZWUuX3NwbGF5KGN1cnJlbnROb2RlLmtleSk7CiAgICAgIF9maW5kTGVmdE1vc3REZXNjZW5kZW50KF90cmVlLl9yb290LnJpZ2h0KTsKICAgICAgYXNzZXJ0KF93b3JrTGlzdC5pc05vdEVtcHR5KTsKICAgIH0KICB9CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBpZiAoX21vZGlmaWNhdGlvbkNvdW50ICE9IF90cmVlLl9tb2RpZmljYXRpb25Db3VudCkgewogICAgICB0aHJvdyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IoX3RyZWUpOwogICAgfQogICAgLy8gUGlja3MgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgd29ya2xpc3QgYXMgY3VycmVudC4KICAgIC8vIFVwZGF0ZXMgdGhlIHdvcmtsaXN0IHdpdGggdGhlIGxlZnQtbW9zdCBwYXRoIG9mIHRoZSBjdXJyZW50IG5vZGUncwogICAgLy8gcmlnaHQtaGFuZCBjaGlsZC4KICAgIC8vIElmIHRoZSB3b3JrbGlzdCBpcyBubyBsb25nZXIgdmFsaWQgKGFmdGVyIGEgc3BsYXkpLCBpdCBpcyByZWJ1aWxkCiAgICAvLyBmcm9tIHNjcmF0Y2guCiAgICBpZiAoX3dvcmtMaXN0LmlzRW1wdHkpIHsKICAgICAgX2N1cnJlbnROb2RlID0gbnVsbDsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKF90cmVlLl9zcGxheUNvdW50ICE9IF9zcGxheUNvdW50ICYmIF9jdXJyZW50Tm9kZSAhPSBudWxsKSB7CiAgICAgIF9yZWJ1aWxkV29ya0xpc3QoX2N1cnJlbnROb2RlKTsKICAgIH0KICAgIF9jdXJyZW50Tm9kZSA9IF93b3JrTGlzdC5yZW1vdmVMYXN0KCk7CiAgICBfZmluZExlZnRNb3N0RGVzY2VuZGVudChfY3VycmVudE5vZGUucmlnaHQpOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBUIF9nZXRWYWx1ZShfU3BsYXlUcmVlTm9kZTxLPiBub2RlKTsKfQoKY2xhc3MgX1NwbGF5VHJlZUtleUl0ZXJhYmxlPEs+IGV4dGVuZHMgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGU8Sz4gewogIF9TcGxheVRyZWU8SywgX1NwbGF5VHJlZU5vZGU8Sz4+IF90cmVlOwogIF9TcGxheVRyZWVLZXlJdGVyYWJsZSh0aGlzLl90cmVlKTsKICBpbnQgZ2V0IGxlbmd0aCA9PiBfdHJlZS5fY291bnQ7CiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfdHJlZS5fY291bnQgPT0gMDsKICBJdGVyYXRvcjxLPiBnZXQgaXRlcmF0b3IgPT4gX1NwbGF5VHJlZUtleUl0ZXJhdG9yPEs+KF90cmVlKTsKCiAgU2V0PEs+IHRvU2V0KCkgewogICAgU3BsYXlUcmVlU2V0PEs+IHNldCA9IFNwbGF5VHJlZVNldDxLPihfdHJlZS5fY29tcGFyYXRvciwgX3RyZWUuX3ZhbGlkS2V5KTsKICAgIHNldC5fY291bnQgPSBfdHJlZS5fY291bnQ7CiAgICBzZXQuX3Jvb3QgPSBzZXQuX2NvcHlOb2RlKF90cmVlLl9yb290KTsKICAgIHJldHVybiBzZXQ7CiAgfQp9CgpjbGFzcyBfU3BsYXlUcmVlVmFsdWVJdGVyYWJsZTxLLCBWPiBleHRlbmRzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPFY+IHsKICBTcGxheVRyZWVNYXA8SywgVj4gX21hcDsKICBfU3BsYXlUcmVlVmFsdWVJdGVyYWJsZSh0aGlzLl9tYXApOwogIGludCBnZXQgbGVuZ3RoID0+IF9tYXAuX2NvdW50OwogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX21hcC5fY291bnQgPT0gMDsKICBJdGVyYXRvcjxWPiBnZXQgaXRlcmF0b3IgPT4gX1NwbGF5VHJlZVZhbHVlSXRlcmF0b3I8SywgVj4oX21hcCk7Cn0KCmNsYXNzIF9TcGxheVRyZWVLZXlJdGVyYXRvcjxLPiBleHRlbmRzIF9TcGxheVRyZWVJdGVyYXRvcjxLLCBLPiB7CiAgX1NwbGF5VHJlZUtleUl0ZXJhdG9yKF9TcGxheVRyZWU8SywgX1NwbGF5VHJlZU5vZGU8Sz4+IG1hcCkgOiBzdXBlcihtYXApOwogIEsgX2dldFZhbHVlKF9TcGxheVRyZWVOb2RlPEs+IG5vZGUpID0+IG5vZGUua2V5Owp9CgpjbGFzcyBfU3BsYXlUcmVlVmFsdWVJdGVyYXRvcjxLLCBWPiBleHRlbmRzIF9TcGxheVRyZWVJdGVyYXRvcjxLLCBWPiB7CiAgX1NwbGF5VHJlZVZhbHVlSXRlcmF0b3IoU3BsYXlUcmVlTWFwPEssIFY+IG1hcCkgOiBzdXBlcihtYXApOwogIFYgX2dldFZhbHVlKF9TcGxheVRyZWVOb2RlPEs+IG5vZGUpIHsKICAgIF9TcGxheVRyZWVNYXBOb2RlPEssIFY+IG1hcE5vZGUgPSBub2RlOwogICAgcmV0dXJuIG1hcE5vZGUudmFsdWU7CiAgfQp9CgpjbGFzcyBfU3BsYXlUcmVlTm9kZUl0ZXJhdG9yPEs+CiAgICBleHRlbmRzIF9TcGxheVRyZWVJdGVyYXRvcjxLLCBfU3BsYXlUcmVlTm9kZTxLPj4gewogIF9TcGxheVRyZWVOb2RlSXRlcmF0b3IoX1NwbGF5VHJlZTxLLCBfU3BsYXlUcmVlTm9kZTxLPj4gdHJlZSkgOiBzdXBlcih0cmVlKTsKICBfU3BsYXlUcmVlTm9kZUl0ZXJhdG9yLnN0YXJ0QXQoCiAgICAgIF9TcGxheVRyZWU8SywgX1NwbGF5VHJlZU5vZGU8Sz4+IHRyZWUsIEsgc3RhcnRLZXkpCiAgICAgIDogc3VwZXIuc3RhcnRBdCh0cmVlLCBzdGFydEtleSk7CiAgX1NwbGF5VHJlZU5vZGU8Sz4gX2dldFZhbHVlKF9TcGxheVRyZWVOb2RlPEs+IG5vZGUpID0+IG5vZGU7Cn0KCi8vLyBBIFtTZXRdIG9mIG9iamVjdHMgdGhhdCBjYW4gYmUgb3JkZXJlZCByZWxhdGl2ZSB0byBlYWNoIG90aGVyLgovLy8KLy8vIFRoZSBzZXQgaXMgYmFzZWQgb24gYSBzZWxmLWJhbGFuY2luZyBiaW5hcnkgdHJlZS4gSXQgYWxsb3dzIG1vc3Qgb3BlcmF0aW9ucwovLy8gaW4gYW1vcnRpemVkIGxvZ2FyaXRobWljIHRpbWUuCi8vLwovLy8gRWxlbWVudHMgb2YgdGhlIHNldCBhcmUgY29tcGFyZWQgdXNpbmcgdGhlIGBjb21wYXJlYCBmdW5jdGlvbiBwYXNzZWQgaW4KLy8vIHRoZSBjb25zdHJ1Y3RvciwgYm90aCBmb3Igb3JkZXJpbmcgYW5kIGZvciBlcXVhbGl0eS4KLy8vIElmIHRoZSBzZXQgY29udGFpbnMgb25seSBhbiBvYmplY3QgYGFgLCB0aGVuIGBzZXQuY29udGFpbnMoYilgCi8vLyB3aWxsIHJldHVybiBgdHJ1ZWAgaWYgYW5kIG9ubHkgaWYgYGNvbXBhcmUoYSwgYikgPT0gMGAsCi8vLyBhbmQgdGhlIHZhbHVlIG9mIGBhID09IGJgIGlzIG5vdCBldmVuIGNoZWNrZWQuCi8vLyBJZiB0aGUgY29tcGFyZSBmdW5jdGlvbiBpcyBvbWl0dGVkLCB0aGUgb2JqZWN0cyBhcmUgYXNzdW1lZCB0byBiZQovLy8gW0NvbXBhcmFibGVdLCBhbmQgYXJlIGNvbXBhcmVkIHVzaW5nIHRoZWlyIFtDb21wYXJhYmxlLmNvbXBhcmVUb10gbWV0aG9kLgovLy8gTm9uLWNvbXBhcmFibGUgb2JqZWN0cyAoaW5jbHVkaW5nIGBudWxsYCkgd2lsbCBub3Qgd29yayBhcyBhbiBlbGVtZW50Ci8vLyBpbiB0aGF0IGNhc2UuCmNsYXNzIFNwbGF5VHJlZVNldDxFPiBleHRlbmRzIF9TcGxheVRyZWU8RSwgX1NwbGF5VHJlZU5vZGU8RT4+CiAgICB3aXRoIEl0ZXJhYmxlTWl4aW48RT4sIFNldE1peGluPEU+IHsKICBfU3BsYXlUcmVlTm9kZTxFPiBfcm9vdDsKICBmaW5hbCBfU3BsYXlUcmVlTm9kZTxFPiBfZHVtbXkgPSBfU3BsYXlUcmVlTm9kZTxFPihudWxsKTsKCiAgQ29tcGFyYXRvcjxFPiBfY29tcGFyYXRvcjsKICBfUHJlZGljYXRlIF92YWxpZEtleTsKCiAgLy8vIENyZWF0ZSBhIG5ldyBbU3BsYXlUcmVlU2V0XSB3aXRoIHRoZSBnaXZlbiBjb21wYXJlIGZ1bmN0aW9uLgogIC8vLwogIC8vLyBJZiB0aGUgW2NvbXBhcmVdIGZ1bmN0aW9uIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIFtDb21wYXJhYmxlLmNvbXBhcmVdLAogIC8vLyBhbmQgdGhlIGVsZW1lbnRzIG11c3QgYmUgY29tcGFyYWJsZS4KICAvLy8KICAvLy8gQSBwcm92aWRlZCBgY29tcGFyZWAgZnVuY3Rpb24gbWF5IG5vdCB3b3JrIG9uIGFsbCBvYmplY3RzLiBJdCBtYXkgbm90IGV2ZW4KICAvLy8gd29yayBvbiBhbGwgYEVgIGluc3RhbmNlcy4KICAvLy8KICAvLy8gRm9yIG9wZXJhdGlvbnMgdGhhdCBhZGQgZWxlbWVudHMgdG8gdGhlIHNldCwgdGhlIHVzZXIgaXMgc3VwcG9zZWQgdG8gbm90CiAgLy8vIHBhc3MgaW4gb2JqZWN0cyB0aGF0IGRvZXNuJ3Qgd29yayB3aXRoIHRoZSBjb21wYXJlIGZ1bmN0aW9uLgogIC8vLwogIC8vLyBUaGUgbWV0aG9kcyBbY29udGFpbnNdLCBbcmVtb3ZlXSwgW2xvb2t1cF0sIFtyZW1vdmVBbGxdIG9yIFtyZXRhaW5BbGxdCiAgLy8vIGFyZSB0eXBlZCB0byBhY2NlcHQgYW55IG9iamVjdChzKSwgYW5kIHRoZSBbaXNWYWxpZEtleV0gdGVzdCBjYW4gdXNlZCB0bwogIC8vLyBmaWx0ZXIgdGhvc2Ugb2JqZWN0cyBiZWZvcmUgaGFuZGluZyB0aGVtIHRvIHRoZSBgY29tcGFyZWAgZnVuY3Rpb24uCiAgLy8vCiAgLy8vIElmIFtpc1ZhbGlkS2V5XSBpcyBwcm92aWRlZCwgb25seSB2YWx1ZXMgc2F0aXNmeWluZyBgaXNWYWxpZEtleShvdGhlcilgCiAgLy8vIGFyZSBjb21wYXJlZCB1c2luZyB0aGUgYGNvbXBhcmVgIG1ldGhvZCBpbiB0aGUgbWV0aG9kcyBtZW50aW9uZWQgYWJvdmUuCiAgLy8vIElmIHRoZSBgaXNWYWxpZEtleWAgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSBmb3IgYW4gb2JqZWN0LCBpdCBpcyBhc3N1bWVkIHRvCiAgLy8vIG5vdCBiZSBpbiB0aGUgc2V0LgogIC8vLwogIC8vLyBJZiBvbWl0dGVkLCB0aGUgYGlzVmFsaWRLZXlgIGZ1bmN0aW9uIGRlZmF1bHRzIHRvIGNoZWNraW5nIGFnYWluc3QgdGhlCiAgLy8vIHR5cGUgcGFyYW1ldGVyOiBgb3RoZXIgaXMgRWAuCiAgU3BsYXlUcmVlU2V0KFtpbnQgY29tcGFyZShFIGtleTEsIEUga2V5MiksIGJvb2wgaXNWYWxpZEtleShwb3RlbnRpYWxLZXkpXSkKICAgICAgOiBfY29tcGFyYXRvciA9IGNvbXBhcmUgPz8gX2RlZmF1bHRDb21wYXJlPEU+KCksCiAgICAgICAgX3ZhbGlkS2V5ID0gaXNWYWxpZEtleSA/PyAoKHYpID0+IHYgaXMgRSk7CgogIC8vLyBDcmVhdGVzIGEgW1NwbGF5VHJlZVNldF0gdGhhdCBjb250YWlucyBhbGwgW2VsZW1lbnRzXS4KICAvLy8KICAvLy8gVGhlIHNldCB3b3JrcyBhcyBpZiBjcmVhdGVkIGJ5IGBuZXcgU3BsYXlUcmVlU2V0PEU+KGNvbXBhcmUsIGlzVmFsaWRLZXkpYC4KICAvLy8KICAvLy8gQWxsIHRoZSBbZWxlbWVudHNdIHNob3VsZCBiZSBpbnN0YW5jZXMgb2YgW0VdIGFuZCB2YWxpZCBhcmd1bWVudHMgdG8KICAvLy8gW2NvbXBhcmVdLgogIC8vLyBUaGUgYGVsZW1lbnRzYCBpdGVyYWJsZSBpdHNlbGYgbWF5IGhhdmUgYW55IGVsZW1lbnQgdHlwZSwgc28gdGhpcwogIC8vLyBjb25zdHJ1Y3RvciBjYW4gYmUgdXNlZCB0byBkb3duLWNhc3QgYSBgU2V0YCwgZm9yIGV4YW1wbGUgYXM6CiAgLy8vIGBgYGRhcnQKICAvLy8gU2V0PFN1cGVyVHlwZT4gc3VwZXJTZXQgPSAuLi47CiAgLy8vIFNldDxTdWJUeXBlPiBzdWJTZXQgPQogIC8vLyAgICAgbmV3IFNwbGF5VHJlZVNldDxTdWJUeXBlPi5mcm9tKHN1cGVyU2V0LndoZXJlVHlwZTxTdWJUeXBlPigpKTsKICAvLy8gYGBgCiAgZmFjdG9yeSBTcGxheVRyZWVTZXQuZnJvbShJdGVyYWJsZSBlbGVtZW50cywKICAgICAgW2ludCBjb21wYXJlKEUga2V5MSwgRSBrZXkyKSwgYm9vbCBpc1ZhbGlkS2V5KHBvdGVudGlhbEtleSldKSB7CiAgICBTcGxheVRyZWVTZXQ8RT4gcmVzdWx0ID0gU3BsYXlUcmVlU2V0PEU+KGNvbXBhcmUsIGlzVmFsaWRLZXkpOwogICAgZm9yIChmaW5hbCBlbGVtZW50IGluIGVsZW1lbnRzKSB7CiAgICAgIEUgZSA9IGVsZW1lbnQ7CiAgICAgIHJlc3VsdC5hZGQoZSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIENyZWF0ZXMgYSBbU3BsYXlUcmVlU2V0XSBmcm9tIFtlbGVtZW50c10uCiAgLy8vCiAgLy8vIFRoZSBzZXQgd29ya3MgYXMgaWYgY3JlYXRlZCBieSBgbmV3IFNwbGF5VHJlZVNldDxFPihjb21wYXJlLCBpc1ZhbGlkS2V5KWAuCiAgLy8vCiAgLy8vIEFsbCB0aGUgW2VsZW1lbnRzXSBzaG91bGQgYmUgdmFsaWQgYXMgYXJndW1lbnRzIHRvIHRoZSBbY29tcGFyZV0gZnVuY3Rpb24uCiAgZmFjdG9yeSBTcGxheVRyZWVTZXQub2YoSXRlcmFibGU8RT4gZWxlbWVudHMsCiAgICAgICAgICBbaW50IGNvbXBhcmUoRSBrZXkxLCBFIGtleTIpLCBib29sIGlzVmFsaWRLZXkocG90ZW50aWFsS2V5KV0pID0+CiAgICAgIFNwbGF5VHJlZVNldChjb21wYXJlLCBpc1ZhbGlkS2V5KS4uYWRkQWxsKGVsZW1lbnRzKTsKCiAgU2V0PFQ+IF9uZXdTZXQ8VD4oKSA9PgogICAgICBTcGxheVRyZWVTZXQ8VD4oKFQgYSwgVCBiKSA9PiBfY29tcGFyYXRvcihhIGFzIEUsIGIgYXMgRSksIF92YWxpZEtleSk7CgogIFNldDxSPiBjYXN0PFI+KCkgPT4gU2V0LmNhc3RGcm9tPEUsIFI+KHRoaXMsIG5ld1NldDogX25ld1NldCk7CiAgaW50IF9jb21wYXJlKEUgZTEsIEUgZTIpID0+IF9jb21wYXJhdG9yKGUxLCBlMik7CgogIC8vIEZyb20gSXRlcmFibGUuCgogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciA9PiBfU3BsYXlUcmVlS2V5SXRlcmF0b3I8RT4odGhpcyk7CgogIGludCBnZXQgbGVuZ3RoID0+IF9jb3VudDsKICBib29sIGdldCBpc0VtcHR5ID0+IF9yb290ID09IG51bGw7CiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBfcm9vdCAhPSBudWxsOwoKICBFIGdldCBmaXJzdCB7CiAgICBpZiAoX2NvdW50ID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgcmV0dXJuIF9maXJzdC5rZXk7CiAgfQoKICBFIGdldCBsYXN0IHsKICAgIGlmIChfY291bnQgPT0gMCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICByZXR1cm4gX2xhc3Qua2V5OwogIH0KCiAgRSBnZXQgc2luZ2xlIHsKICAgIGlmIChfY291bnQgPT0gMCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICBpZiAoX2NvdW50ID4gMSkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgcmV0dXJuIF9yb290LmtleTsKICB9CgogIC8vIEZyb20gU2V0LgogIGJvb2wgY29udGFpbnMoT2JqZWN0IGVsZW1lbnQpIHsKICAgIHJldHVybiBfdmFsaWRLZXkoZWxlbWVudCkgJiYgX3NwbGF5KGVsZW1lbnQpID09IDA7CiAgfQoKICBib29sIGFkZChFIGVsZW1lbnQpIHsKICAgIGludCBjb21wYXJlID0gX3NwbGF5KGVsZW1lbnQpOwogICAgaWYgKGNvbXBhcmUgPT0gMCkgcmV0dXJuIGZhbHNlOwogICAgX2FkZE5ld1Jvb3QoX1NwbGF5VHJlZU5vZGUoZWxlbWVudCksIGNvbXBhcmUpOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBib29sIHJlbW92ZShPYmplY3Qgb2JqZWN0KSB7CiAgICBpZiAoIV92YWxpZEtleShvYmplY3QpKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gX3JlbW92ZShvYmplY3QpICE9IG51bGw7CiAgfQoKICB2b2lkIGFkZEFsbChJdGVyYWJsZTxFPiBlbGVtZW50cykgewogICAgZm9yIChFIGVsZW1lbnQgaW4gZWxlbWVudHMpIHsKICAgICAgaW50IGNvbXBhcmUgPSBfc3BsYXkoZWxlbWVudCk7CiAgICAgIGlmIChjb21wYXJlICE9IDApIHsKICAgICAgICBfYWRkTmV3Um9vdChfU3BsYXlUcmVlTm9kZShlbGVtZW50KSwgY29tcGFyZSk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgcmVtb3ZlQWxsKEl0ZXJhYmxlPE9iamVjdD4gZWxlbWVudHMpIHsKICAgIGZvciAoT2JqZWN0IGVsZW1lbnQgaW4gZWxlbWVudHMpIHsKICAgICAgaWYgKF92YWxpZEtleShlbGVtZW50KSkgX3JlbW92ZShlbGVtZW50KTsKICAgIH0KICB9CgogIHZvaWQgcmV0YWluQWxsKEl0ZXJhYmxlPE9iamVjdD4gZWxlbWVudHMpIHsKICAgIC8vIEJ1aWxkIGEgc2V0IHdpdGggdGhlIHNhbWUgc2Vuc2Ugb2YgZXF1YWxpdHkgYXMgdGhpcyBzZXQuCiAgICBTcGxheVRyZWVTZXQ8RT4gcmV0YWluU2V0ID0gU3BsYXlUcmVlU2V0PEU+KF9jb21wYXJhdG9yLCBfdmFsaWRLZXkpOwogICAgaW50IG1vZGlmaWNhdGlvbkNvdW50ID0gX21vZGlmaWNhdGlvbkNvdW50OwogICAgZm9yIChPYmplY3Qgb2JqZWN0IGluIGVsZW1lbnRzKSB7CiAgICAgIGlmIChtb2RpZmljYXRpb25Db3VudCAhPSBfbW9kaWZpY2F0aW9uQ291bnQpIHsKICAgICAgICAvLyBUaGUgaXRlcmF0b3Igc2hvdWxkIG5vdCBoYXZlIHNpZGUgZWZmZWN0cy4KICAgICAgICB0aHJvdyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgICAgLy8gRXF1aXZhbGVudCB0byB0aGlzLmNvbnRhaW5zKG9iamVjdCkuCiAgICAgIGlmIChfdmFsaWRLZXkob2JqZWN0KSAmJiBfc3BsYXkob2JqZWN0KSA9PSAwKSB7CiAgICAgICAgcmV0YWluU2V0LmFkZChfcm9vdC5rZXkpOwogICAgICB9CiAgICB9CiAgICAvLyBUYWtlIG92ZXIgdGhlIGVsZW1lbnRzIGZyb20gdGhlIHJldGFpbmVkIHNldCwgaWYgaXQgZGlmZmVycy4KICAgIGlmIChyZXRhaW5TZXQuX2NvdW50ICE9IF9jb3VudCkgewogICAgICBfcm9vdCA9IHJldGFpblNldC5fcm9vdDsKICAgICAgX2NvdW50ID0gcmV0YWluU2V0Ll9jb3VudDsKICAgICAgX21vZGlmaWNhdGlvbkNvdW50Kys7CiAgICB9CiAgfQoKICBFIGxvb2t1cChPYmplY3Qgb2JqZWN0KSB7CiAgICBpZiAoIV92YWxpZEtleShvYmplY3QpKSByZXR1cm4gbnVsbDsKICAgIGludCBjb21wID0gX3NwbGF5KG9iamVjdCk7CiAgICBpZiAoY29tcCAhPSAwKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBfcm9vdC5rZXk7CiAgfQoKICBTZXQ8RT4gaW50ZXJzZWN0aW9uKFNldDxPYmplY3Q+IG90aGVyKSB7CiAgICBTZXQ8RT4gcmVzdWx0ID0gU3BsYXlUcmVlU2V0PEU+KF9jb21wYXJhdG9yLCBfdmFsaWRLZXkpOwogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAob3RoZXIuY29udGFpbnMoZWxlbWVudCkpIHJlc3VsdC5hZGQoZWxlbWVudCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgU2V0PEU+IGRpZmZlcmVuY2UoU2V0PE9iamVjdD4gb3RoZXIpIHsKICAgIFNldDxFPiByZXN1bHQgPSBTcGxheVRyZWVTZXQ8RT4oX2NvbXBhcmF0b3IsIF92YWxpZEtleSk7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICghb3RoZXIuY29udGFpbnMoZWxlbWVudCkpIHJlc3VsdC5hZGQoZWxlbWVudCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgU2V0PEU+IHVuaW9uKFNldDxFPiBvdGhlcikgewogICAgcmV0dXJuIF9jbG9uZSgpLi5hZGRBbGwob3RoZXIpOwogIH0KCiAgU3BsYXlUcmVlU2V0PEU+IF9jbG9uZSgpIHsKICAgIHZhciBzZXQgPSBTcGxheVRyZWVTZXQ8RT4oX2NvbXBhcmF0b3IsIF92YWxpZEtleSk7CiAgICBzZXQuX2NvdW50ID0gX2NvdW50OwogICAgc2V0Ll9yb290ID0gX2NvcHlOb2RlKF9yb290KTsKICAgIHJldHVybiBzZXQ7CiAgfQoKICAvLyBDb3BpZXMgdGhlIHN0cnVjdHVyZSBvZiBhIFNwbGF5VHJlZSBpbnRvIGEgbmV3IHNpbWlsYXIgc3RydWN0dXJlLgogIC8vIFdvcmtzIG9uIF9TcGxheVRyZWVNYXBOb2RlIGFzIHdlbGwsIGJ1dCBvbmx5IGNvcGllcyB0aGUga2V5cywKICBfU3BsYXlUcmVlTm9kZTxFPiBfY29weU5vZGUoX1NwbGF5VHJlZU5vZGU8RT4gbm9kZSkgewogICAgaWYgKG5vZGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gX1NwbGF5VHJlZU5vZGU8RT4obm9kZS5rZXkpCiAgICAgIC4ubGVmdCA9IF9jb3B5Tm9kZShub2RlLmxlZnQpCiAgICAgIC4ucmlnaHQgPSBfY29weU5vZGUobm9kZS5yaWdodCk7CiAgfQoKICB2b2lkIGNsZWFyKCkgewogICAgX2NsZWFyKCk7CiAgfQoKICBTZXQ8RT4gdG9TZXQoKSA9PiBfY2xvbmUoKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gSXRlcmFibGVCYXNlLml0ZXJhYmxlVG9GdWxsU3RyaW5nKHRoaXMsICd7JywgJ30nKTsKfQqDQQBOTjwBGQEwAUIkGg8aGwEcAgEmBDI6CzUCATkEQx9AKj9GNRIcAUk+EwErEgFABi8eAT8GOzwXATchAUUcAScgAUlGR0VCBkkoFiIBM0ZIQhgZGg4TKRYpMBgbMCQfGSsKFx4ZIB0qMRgaJCQeGSwKFh4YIQ8PCAYRHyAhIRUBGRgTEQQBShlKKSYBShlNSikmARgkHCAZDhweGw0gSCVHDxsGGhMEATwGShAqDhoZFA4GHBQZIBoNGh4ZBhIEARQkHhIEARMkHhIEARISEBoEAgEVGgIBRwElQRQnIhQEORoCAUMEUCMESDlEPDNGTkQSBEtMR0xMFEgaIU4BHRgBTTczAU0GQzAnRkkbFQgTBAFNK0s+AU8SBk84BklEBkwlNxcYIyhGQxAEAUkGTzoGTSUGSEtGRjYQBAE7ARwBHiYZHhccCAYRBAEZJjQvEQQBJi9FKBwVGw4GNgQBJy8cFRoGMCIaMy8GJRpQGQY2EgQBISUZCAQBFRwEASMBKUkfNB8GBAETEwQBEQ4EASEvBAElKSkdLjAzCkIaCBQGARkEAToBQQFKESQXBAFJECQWBAFPKBsvJBwkKSMhGQYVBAFPKBsvJBwkKiMgGAYVBAIBQTABIgY9PzslBj9DATAGPSsGRjsaAUcGTBMBFCIBPBY2KSkEAVAWNyQpJBdLMQ0hBgQBEiskBAE5GxsYBgQBPgYvQkItOSIXHywNJTIkBgQBFDowBjpKGUkVHRsUBkQmBisxEQQBJwIBRColIik/ARNPHywQBAIBSRsmIShDAgFCTDMCAUdAKCwaBAIBIDdPIjknPwIBQwRQIwRMOUM8M0ZOShI/KRs8AR0YAUMGUSsGUSEGT0MGTU9KBk5OURkGTSRNNzMBPQZRBksRSEQOJRxJCi9GQyYVFQYTBAEwBlEGUTBLOwEZTQFBMwEUAT4BHCUoARA9FwQBDz0WBAERPToWBAEPIjcEARgjJDMRBAEfKiQEASYiJRo3CAYEAS4nMAYEAS5ASTAmNTYxCC42IggGRCYfIRwGBAEcKR8gFgQBKz0eOAYTBAEpPR45BhMEAR8kBAEdNxkiEAQBR0M4IyckJwQBEQ4EAR4BSgIBH2RhcnQ6Y29sbGVjdGlvbi9zcGxheV90cmVlLmRhcnQ1b3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi9jb2xsZWN0aW9uX3BhdGNoLmRhcnTAAGYULy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBOb3RlOiB0aGUgVk0gY29uY2F0ZW5hdGVzIGFsbCBwYXRjaCBmaWxlcyBpbnRvIGEgc2luZ2xlIHBhdGNoIGZpbGUuIFRoaXMKLy8vIGZpbGUgaXMgdGhlIGZpcnN0IHBhdGNoIGluICJkYXJ0OmNvbGxlY3Rpb24iIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgaW1wb3J0cwovLy8gdXNlZCBieSBwYXRjaGVzIG9mIHRoYXQgbGlicmFyeS4gV2UgcGxhbiB0byBjaGFuZ2UgdGhpcyB3aGVuIHdlIGhhdmUgYQovLy8gc2hhcmVkIGZyb250IGVuZCBhbmQgc2ltcGx5IHVzZSBwYXJ0cy4KCmltcG9ydCAiZGFydDpfaW50ZXJuYWwiIGFzIGludGVybmFsOwoKaW1wb3J0ICJkYXJ0Ol9pbnRlcm5hbCIgc2hvdyBwYXRjaCwgSXRlcmFibGVFbGVtZW50RXJyb3I7CgppbXBvcnQgImRhcnQ6dHlwZWRfZGF0YSIgc2hvdyBVaW50MzJMaXN0OwoKLy8vIFRoZXNlIGFyZSB0aGUgYWRkaXRpb25hbCBwYXJ0cyBvZiB0aGlzIHBhdGNoIGxpYnJhcnk6Ci8vIHBhcnQgImNvbXBhY3RfaGFzaC5kYXJ0IjsKCkBwYXRjaApjbGFzcyBIYXNoTWFwPEssIFY+IHsKICBAcGF0Y2gKICBmYWN0b3J5IEhhc2hNYXAoCiAgICAgIHtib29sIGVxdWFscyhLIGtleTEsIEsga2V5MiksCiAgICAgIGludCBoYXNoQ29kZShLIGtleSksCiAgICAgIGJvb2wgaXNWYWxpZEtleShwb3RlbnRpYWxLZXkpfSkgewogICAgaWYgKGlzVmFsaWRLZXkgPT0gbnVsbCkgewogICAgICBpZiAoaGFzaENvZGUgPT0gbnVsbCkgewogICAgICAgIGlmIChlcXVhbHMgPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIG5ldyBfSGFzaE1hcDxLLCBWPigpOwogICAgICAgIH0KICAgICAgICBoYXNoQ29kZSA9IF9kZWZhdWx0SGFzaENvZGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGlkZW50aWNhbChpZGVudGl0eUhhc2hDb2RlLCBoYXNoQ29kZSkgJiYKICAgICAgICAgICAgaWRlbnRpY2FsKGlkZW50aWNhbCwgZXF1YWxzKSkgewogICAgICAgICAgcmV0dXJuIG5ldyBfSWRlbnRpdHlIYXNoTWFwPEssIFY+KCk7CiAgICAgICAgfQogICAgICAgIGVxdWFscyA/Pz0gX2RlZmF1bHRFcXVhbHM7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGhhc2hDb2RlID8/PSBfZGVmYXVsdEhhc2hDb2RlOwogICAgICBlcXVhbHMgPz89IF9kZWZhdWx0RXF1YWxzOwogICAgfQogICAgcmV0dXJuIG5ldyBfQ3VzdG9tSGFzaE1hcDxLLCBWPihlcXVhbHMsIGhhc2hDb2RlLCBpc1ZhbGlkS2V5KTsKICB9CgogIEBwYXRjaAogIGZhY3RvcnkgSGFzaE1hcC5pZGVudGl0eSgpID0+IG5ldyBfSWRlbnRpdHlIYXNoTWFwPEssIFY+KCk7CgogIFNldDxLPiBfbmV3S2V5U2V0KCk7Cn0KCmNvbnN0IGludCBfTU9ESUZJQ0FUSU9OX0NPVU5UX01BU0sgPSAweDNmZmZmZmZmOwoKY2xhc3MgX0hhc2hNYXA8SywgVj4gZXh0ZW5kcyBNYXBCYXNlPEssIFY+IGltcGxlbWVudHMgSGFzaE1hcDxLLCBWPiB7CiAgc3RhdGljIGNvbnN0IGludCBfSU5JVElBTF9DQVBBQ0lUWSA9IDg7CgogIGludCBfZWxlbWVudENvdW50ID0gMDsKICBMaXN0PF9IYXNoTWFwRW50cnk8SywgVj4+IF9idWNrZXRzID0KICAgICAgbmV3IExpc3Q8X0hhc2hNYXBFbnRyeTxLLCBWPj4oX0lOSVRJQUxfQ0FQQUNJVFkpOwogIGludCBfbW9kaWZpY2F0aW9uQ291bnQgPSAwOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfZWxlbWVudENvdW50OwogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2VsZW1lbnRDb3VudCA9PSAwOwogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gX2VsZW1lbnRDb3VudCAhPSAwOwoKICBJdGVyYWJsZTxLPiBnZXQga2V5cyA9PiBuZXcgX0hhc2hNYXBLZXlJdGVyYWJsZTxLLCBWPih0aGlzKTsKICBJdGVyYWJsZTxWPiBnZXQgdmFsdWVzID0+IG5ldyBfSGFzaE1hcFZhbHVlSXRlcmFibGU8SywgVj4odGhpcyk7CgogIGJvb2wgY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewogICAgZmluYWwgaGFzaENvZGUgPSBrZXkuaGFzaENvZGU7CiAgICBmaW5hbCBidWNrZXRzID0gX2J1Y2tldHM7CiAgICBmaW5hbCBpbmRleCA9IGhhc2hDb2RlICYgKGJ1Y2tldHMubGVuZ3RoIC0gMSk7CiAgICB2YXIgZW50cnkgPSBidWNrZXRzW2luZGV4XTsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGlmIChoYXNoQ29kZSA9PSBlbnRyeS5oYXNoQ29kZSAmJiBlbnRyeS5rZXkgPT0ga2V5KSByZXR1cm4gdHJ1ZTsKICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgYm9vbCBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgewogICAgZmluYWwgYnVja2V0cyA9IF9idWNrZXRzOwogICAgZmluYWwgbGVuZ3RoID0gYnVja2V0cy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBlbnRyeSA9IGJ1Y2tldHNbaV07CiAgICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgICAgaWYgKGVudHJ5LnZhbHVlID09IHZhbHVlKSByZXR1cm4gdHJ1ZTsKICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIFYgb3BlcmF0b3IgW10oT2JqZWN0IGtleSkgewogICAgZmluYWwgaGFzaENvZGUgPSBrZXkuaGFzaENvZGU7CiAgICBmaW5hbCBidWNrZXRzID0gX2J1Y2tldHM7CiAgICBmaW5hbCBpbmRleCA9IGhhc2hDb2RlICYgKGJ1Y2tldHMubGVuZ3RoIC0gMSk7CiAgICB2YXIgZW50cnkgPSBidWNrZXRzW2luZGV4XTsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGlmIChoYXNoQ29kZSA9PSBlbnRyeS5oYXNoQ29kZSAmJiBlbnRyeS5rZXkgPT0ga2V5KSB7CiAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlOwogICAgICB9CiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oSyBrZXksIFYgdmFsdWUpIHsKICAgIGZpbmFsIGhhc2hDb2RlID0ga2V5Lmhhc2hDb2RlOwogICAgZmluYWwgYnVja2V0cyA9IF9idWNrZXRzOwogICAgZmluYWwgbGVuZ3RoID0gYnVja2V0cy5sZW5ndGg7CiAgICBmaW5hbCBpbmRleCA9IGhhc2hDb2RlICYgKGxlbmd0aCAtIDEpOwogICAgdmFyIGVudHJ5ID0gYnVja2V0c1tpbmRleF07CiAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewogICAgICBpZiAoaGFzaENvZGUgPT0gZW50cnkuaGFzaENvZGUgJiYgZW50cnkua2V5ID09IGtleSkgewogICAgICAgIGVudHJ5LnZhbHVlID0gdmFsdWU7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKICAgIH0KICAgIF9hZGRFbnRyeShidWNrZXRzLCBpbmRleCwgbGVuZ3RoLCBrZXksIHZhbHVlLCBoYXNoQ29kZSk7CiAgfQoKICBWIHB1dElmQWJzZW50KEsga2V5LCBWIGlmQWJzZW50KCkpIHsKICAgIGZpbmFsIGhhc2hDb2RlID0ga2V5Lmhhc2hDb2RlOwogICAgZmluYWwgYnVja2V0cyA9IF9idWNrZXRzOwogICAgZmluYWwgbGVuZ3RoID0gYnVja2V0cy5sZW5ndGg7CiAgICBmaW5hbCBpbmRleCA9IGhhc2hDb2RlICYgKGxlbmd0aCAtIDEpOwogICAgdmFyIGVudHJ5ID0gYnVja2V0c1tpbmRleF07CiAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewogICAgICBpZiAoaGFzaENvZGUgPT0gZW50cnkuaGFzaENvZGUgJiYgZW50cnkua2V5ID09IGtleSkgewogICAgICAgIHJldHVybiBlbnRyeS52YWx1ZTsKICAgICAgfQogICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CiAgICB9CiAgICBmaW5hbCBzdGFtcCA9IF9tb2RpZmljYXRpb25Db3VudDsKICAgIGZpbmFsIFYgdmFsdWUgPSBpZkFic2VudCgpOwogICAgaWYgKHN0YW1wID09IF9tb2RpZmljYXRpb25Db3VudCkgewogICAgICBfYWRkRW50cnkoYnVja2V0cywgaW5kZXgsIGxlbmd0aCwga2V5LCB2YWx1ZSwgaGFzaENvZGUpOwogICAgfSBlbHNlIHsKICAgICAgdGhpc1trZXldID0gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICB2b2lkIGFkZEFsbChNYXA8SywgVj4gb3RoZXIpIHsKICAgIG90aGVyLmZvckVhY2goKEsga2V5LCBWIHZhbHVlKSB7CiAgICAgIHRoaXNba2V5XSA9IHZhbHVlOwogICAgfSk7CiAgfQoKICB2b2lkIGZvckVhY2godm9pZCBhY3Rpb24oSyBrZXksIFYgdmFsdWUpKSB7CiAgICBmaW5hbCBzdGFtcCA9IF9tb2RpZmljYXRpb25Db3VudDsKICAgIGZpbmFsIGJ1Y2tldHMgPSBfYnVja2V0czsKICAgIGZpbmFsIGxlbmd0aCA9IGJ1Y2tldHMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICB2YXIgZW50cnkgPSBidWNrZXRzW2ldOwogICAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewogICAgICAgIGFjdGlvbihlbnRyeS5rZXksIGVudHJ5LnZhbHVlKTsKICAgICAgICBpZiAoc3RhbXAgIT0gX21vZGlmaWNhdGlvbkNvdW50KSB7CiAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICAgIH0KICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CiAgICAgIH0KICAgIH0KICB9CgogIFYgcmVtb3ZlKE9iamVjdCBrZXkpIHsKICAgIGZpbmFsIGhhc2hDb2RlID0ga2V5Lmhhc2hDb2RlOwogICAgZmluYWwgYnVja2V0cyA9IF9idWNrZXRzOwogICAgZmluYWwgaW5kZXggPSBoYXNoQ29kZSAmIChidWNrZXRzLmxlbmd0aCAtIDEpOwogICAgdmFyIGVudHJ5ID0gYnVja2V0c1tpbmRleF07CiAgICBfSGFzaE1hcEVudHJ5PEssIFY+IHByZXZpb3VzID0gbnVsbDsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGZpbmFsIG5leHQgPSBlbnRyeS5uZXh0OwogICAgICBpZiAoaGFzaENvZGUgPT0gZW50cnkuaGFzaENvZGUgJiYgZW50cnkua2V5ID09IGtleSkgewogICAgICAgIF9yZW1vdmVFbnRyeShlbnRyeSwgcHJldmlvdXMsIGluZGV4KTsKICAgICAgICBfZWxlbWVudENvdW50LS07CiAgICAgICAgX21vZGlmaWNhdGlvbkNvdW50ID0KICAgICAgICAgICAgKF9tb2RpZmljYXRpb25Db3VudCArIDEpICYgX01PRElGSUNBVElPTl9DT1VOVF9NQVNLOwogICAgICAgIHJldHVybiBlbnRyeS52YWx1ZTsKICAgICAgfQogICAgICBwcmV2aW91cyA9IGVudHJ5OwogICAgICBlbnRyeSA9IG5leHQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgY2xlYXIoKSB7CiAgICBfYnVja2V0cyA9IG5ldyBMaXN0KF9JTklUSUFMX0NBUEFDSVRZKTsKICAgIGlmIChfZWxlbWVudENvdW50ID4gMCkgewogICAgICBfZWxlbWVudENvdW50ID0gMDsKICAgICAgX21vZGlmaWNhdGlvbkNvdW50ID0gKF9tb2RpZmljYXRpb25Db3VudCArIDEpICYgX01PRElGSUNBVElPTl9DT1VOVF9NQVNLOwogICAgfQogIH0KCiAgdm9pZCBfcmVtb3ZlRW50cnkoX0hhc2hNYXBFbnRyeTxLLCBWPiBlbnRyeSwKICAgICAgX0hhc2hNYXBFbnRyeTxLLCBWPiBwcmV2aW91c0luQnVja2V0LCBpbnQgYnVja2V0SW5kZXgpIHsKICAgIGlmIChwcmV2aW91c0luQnVja2V0ID09IG51bGwpIHsKICAgICAgX2J1Y2tldHNbYnVja2V0SW5kZXhdID0gZW50cnkubmV4dDsKICAgIH0gZWxzZSB7CiAgICAgIHByZXZpb3VzSW5CdWNrZXQubmV4dCA9IGVudHJ5Lm5leHQ7CiAgICB9CiAgfQoKICB2b2lkIF9hZGRFbnRyeShMaXN0PF9IYXNoTWFwRW50cnk8SywgVj4+IGJ1Y2tldHMsIGludCBpbmRleCwgaW50IGxlbmd0aCwKICAgICAgSyBrZXksIFYgdmFsdWUsIGludCBoYXNoQ29kZSkgewogICAgZmluYWwgZW50cnkgPSBuZXcgX0hhc2hNYXBFbnRyeTxLLCBWPihrZXksIHZhbHVlLCBoYXNoQ29kZSwgYnVja2V0c1tpbmRleF0pOwogICAgYnVja2V0c1tpbmRleF0gPSBlbnRyeTsKICAgIGZpbmFsIG5ld0VsZW1lbnRzID0gX2VsZW1lbnRDb3VudCArIDE7CiAgICBfZWxlbWVudENvdW50ID0gbmV3RWxlbWVudHM7CiAgICAvLyBJZiB3ZSBlbmQgdXAgd2l0aCBtb3JlIHRoYW4gNzUlIG5vbi1lbXB0eSBlbnRyaWVzLCB3ZQogICAgLy8gcmVzaXplIHRoZSBiYWNraW5nIHN0b3JlLgogICAgaWYgKChuZXdFbGVtZW50cyA8PCAyKSA+ICgobGVuZ3RoIDw8IDEpICsgbGVuZ3RoKSkgX3Jlc2l6ZSgpOwogICAgX21vZGlmaWNhdGlvbkNvdW50ID0gKF9tb2RpZmljYXRpb25Db3VudCArIDEpICYgX01PRElGSUNBVElPTl9DT1VOVF9NQVNLOwogIH0KCiAgdm9pZCBfcmVzaXplKCkgewogICAgZmluYWwgb2xkQnVja2V0cyA9IF9idWNrZXRzOwogICAgZmluYWwgb2xkTGVuZ3RoID0gb2xkQnVja2V0cy5sZW5ndGg7CiAgICBmaW5hbCBuZXdMZW5ndGggPSBvbGRMZW5ndGggPDwgMTsKICAgIGZpbmFsIG5ld0J1Y2tldHMgPSBuZXcgTGlzdDxfSGFzaE1hcEVudHJ5PEssIFY+PihuZXdMZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRMZW5ndGg7IGkrKykgewogICAgICB2YXIgZW50cnkgPSBvbGRCdWNrZXRzW2ldOwogICAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewogICAgICAgIGZpbmFsIG5leHQgPSBlbnRyeS5uZXh0OwogICAgICAgIGZpbmFsIGhhc2hDb2RlID0gZW50cnkuaGFzaENvZGU7CiAgICAgICAgZmluYWwgaW5kZXggPSBoYXNoQ29kZSAmIChuZXdMZW5ndGggLSAxKTsKICAgICAgICBlbnRyeS5uZXh0ID0gbmV3QnVja2V0c1tpbmRleF07CiAgICAgICAgbmV3QnVja2V0c1tpbmRleF0gPSBlbnRyeTsKICAgICAgICBlbnRyeSA9IG5leHQ7CiAgICAgIH0KICAgIH0KICAgIF9idWNrZXRzID0gbmV3QnVja2V0czsKICB9CgogIFNldDxLPiBfbmV3S2V5U2V0KCkgPT4gbmV3IF9IYXNoU2V0PEs+KCk7Cn0KCmNsYXNzIF9DdXN0b21IYXNoTWFwPEssIFY+IGV4dGVuZHMgX0hhc2hNYXA8SywgVj4gewogIGZpbmFsIF9FcXVhbGl0eTxLPiBfZXF1YWxzOwogIGZpbmFsIF9IYXNoZXI8Sz4gX2hhc2hDb2RlOwogIGZpbmFsIF9QcmVkaWNhdGUgX3ZhbGlkS2V5OwogIF9DdXN0b21IYXNoTWFwKHRoaXMuX2VxdWFscywgdGhpcy5faGFzaENvZGUsIHZhbGlkS2V5KQogICAgICA6IF92YWxpZEtleSA9ICh2YWxpZEtleSAhPSBudWxsKSA/IHZhbGlkS2V5IDogbmV3IF9UeXBlVGVzdDxLPigpLnRlc3Q7CgogIGJvb2wgY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewogICAgaWYgKCFfdmFsaWRLZXkoa2V5KSkgcmV0dXJuIGZhbHNlOwogICAgZmluYWwgaGFzaENvZGUgPSBfaGFzaENvZGUoa2V5KTsKICAgIGZpbmFsIGJ1Y2tldHMgPSBfYnVja2V0czsKICAgIGZpbmFsIGluZGV4ID0gaGFzaENvZGUgJiAoYnVja2V0cy5sZW5ndGggLSAxKTsKICAgIHZhciBlbnRyeSA9IGJ1Y2tldHNbaW5kZXhdOwogICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgaWYgKGhhc2hDb2RlID09IGVudHJ5Lmhhc2hDb2RlICYmIF9lcXVhbHMoZW50cnkua2V5LCBrZXkpKSByZXR1cm4gdHJ1ZTsKICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgViBvcGVyYXRvciBbXShPYmplY3Qga2V5KSB7CiAgICBpZiAoIV92YWxpZEtleShrZXkpKSByZXR1cm4gbnVsbDsKICAgIGZpbmFsIGhhc2hDb2RlID0gX2hhc2hDb2RlKGtleSk7CiAgICBmaW5hbCBidWNrZXRzID0gX2J1Y2tldHM7CiAgICBmaW5hbCBpbmRleCA9IGhhc2hDb2RlICYgKGJ1Y2tldHMubGVuZ3RoIC0gMSk7CiAgICB2YXIgZW50cnkgPSBidWNrZXRzW2luZGV4XTsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGlmIChoYXNoQ29kZSA9PSBlbnRyeS5oYXNoQ29kZSAmJiBfZXF1YWxzKGVudHJ5LmtleSwga2V5KSkgewogICAgICAgIHJldHVybiBlbnRyeS52YWx1ZTsKICAgICAgfQogICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KEsga2V5LCBWIHZhbHVlKSB7CiAgICBmaW5hbCBoYXNoQ29kZSA9IF9oYXNoQ29kZShrZXkpOwogICAgZmluYWwgYnVja2V0cyA9IF9idWNrZXRzOwogICAgZmluYWwgbGVuZ3RoID0gYnVja2V0cy5sZW5ndGg7CiAgICBmaW5hbCBpbmRleCA9IGhhc2hDb2RlICYgKGxlbmd0aCAtIDEpOwogICAgdmFyIGVudHJ5ID0gYnVja2V0c1tpbmRleF07CiAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewogICAgICBpZiAoaGFzaENvZGUgPT0gZW50cnkuaGFzaENvZGUgJiYgX2VxdWFscyhlbnRyeS5rZXksIGtleSkpIHsKICAgICAgICBlbnRyeS52YWx1ZSA9IHZhbHVlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CiAgICB9CiAgICBfYWRkRW50cnkoYnVja2V0cywgaW5kZXgsIGxlbmd0aCwga2V5LCB2YWx1ZSwgaGFzaENvZGUpOwogIH0KCiAgViBwdXRJZkFic2VudChLIGtleSwgViBpZkFic2VudCgpKSB7CiAgICBmaW5hbCBoYXNoQ29kZSA9IF9oYXNoQ29kZShrZXkpOwogICAgZmluYWwgYnVja2V0cyA9IF9idWNrZXRzOwogICAgZmluYWwgbGVuZ3RoID0gYnVja2V0cy5sZW5ndGg7CiAgICBmaW5hbCBpbmRleCA9IGhhc2hDb2RlICYgKGxlbmd0aCAtIDEpOwogICAgdmFyIGVudHJ5ID0gYnVja2V0c1tpbmRleF07CiAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewogICAgICBpZiAoaGFzaENvZGUgPT0gZW50cnkuaGFzaENvZGUgJiYgX2VxdWFscyhlbnRyeS5rZXksIGtleSkpIHsKICAgICAgICByZXR1cm4gZW50cnkudmFsdWU7CiAgICAgIH0KICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwogICAgfQogICAgaW50IHN0YW1wID0gX21vZGlmaWNhdGlvbkNvdW50OwogICAgViB2YWx1ZSA9IGlmQWJzZW50KCk7CiAgICBpZiAoc3RhbXAgPT0gX21vZGlmaWNhdGlvbkNvdW50KSB7CiAgICAgIF9hZGRFbnRyeShidWNrZXRzLCBpbmRleCwgbGVuZ3RoLCBrZXksIHZhbHVlLCBoYXNoQ29kZSk7CiAgICB9IGVsc2UgewogICAgICB0aGlzW2tleV0gPSB2YWx1ZTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CgogIFYgcmVtb3ZlKE9iamVjdCBrZXkpIHsKICAgIGlmICghX3ZhbGlkS2V5KGtleSkpIHJldHVybiBudWxsOwogICAgZmluYWwgaGFzaENvZGUgPSBfaGFzaENvZGUoa2V5KTsKICAgIGZpbmFsIGJ1Y2tldHMgPSBfYnVja2V0czsKICAgIGZpbmFsIGluZGV4ID0gaGFzaENvZGUgJiAoYnVja2V0cy5sZW5ndGggLSAxKTsKICAgIHZhciBlbnRyeSA9IGJ1Y2tldHNbaW5kZXhdOwogICAgX0hhc2hNYXBFbnRyeTxLLCBWPiBwcmV2aW91cyA9IG51bGw7CiAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewogICAgICBmaW5hbCBuZXh0ID0gZW50cnkubmV4dDsKICAgICAgaWYgKGhhc2hDb2RlID09IGVudHJ5Lmhhc2hDb2RlICYmIF9lcXVhbHMoZW50cnkua2V5LCBrZXkpKSB7CiAgICAgICAgX3JlbW92ZUVudHJ5KGVudHJ5LCBwcmV2aW91cywgaW5kZXgpOwogICAgICAgIF9lbGVtZW50Q291bnQtLTsKICAgICAgICBfbW9kaWZpY2F0aW9uQ291bnQgPQogICAgICAgICAgICAoX21vZGlmaWNhdGlvbkNvdW50ICsgMSkgJiBfTU9ESUZJQ0FUSU9OX0NPVU5UX01BU0s7CiAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlOwogICAgICB9CiAgICAgIHByZXZpb3VzID0gZW50cnk7CiAgICAgIGVudHJ5ID0gbmV4dDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgU2V0PEs+IF9uZXdLZXlTZXQoKSA9PiBuZXcgX0N1c3RvbUhhc2hTZXQ8Sz4oX2VxdWFscywgX2hhc2hDb2RlLCBfdmFsaWRLZXkpOwp9CgpjbGFzcyBfSWRlbnRpdHlIYXNoTWFwPEssIFY+IGV4dGVuZHMgX0hhc2hNYXA8SywgVj4gewogIGJvb2wgY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewogICAgZmluYWwgaGFzaENvZGUgPSBpZGVudGl0eUhhc2hDb2RlKGtleSk7CiAgICBmaW5hbCBidWNrZXRzID0gX2J1Y2tldHM7CiAgICBmaW5hbCBpbmRleCA9IGhhc2hDb2RlICYgKGJ1Y2tldHMubGVuZ3RoIC0gMSk7CiAgICB2YXIgZW50cnkgPSBidWNrZXRzW2luZGV4XTsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGlmIChoYXNoQ29kZSA9PSBlbnRyeS5oYXNoQ29kZSAmJiBpZGVudGljYWwoZW50cnkua2V5LCBrZXkpKSByZXR1cm4gdHJ1ZTsKICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgViBvcGVyYXRvciBbXShPYmplY3Qga2V5KSB7CiAgICBmaW5hbCBoYXNoQ29kZSA9IGlkZW50aXR5SGFzaENvZGUoa2V5KTsKICAgIGZpbmFsIGJ1Y2tldHMgPSBfYnVja2V0czsKICAgIGZpbmFsIGluZGV4ID0gaGFzaENvZGUgJiAoYnVja2V0cy5sZW5ndGggLSAxKTsKICAgIHZhciBlbnRyeSA9IGJ1Y2tldHNbaW5kZXhdOwogICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgaWYgKGhhc2hDb2RlID09IGVudHJ5Lmhhc2hDb2RlICYmIGlkZW50aWNhbChlbnRyeS5rZXksIGtleSkpIHsKICAgICAgICByZXR1cm4gZW50cnkudmFsdWU7CiAgICAgIH0KICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShLIGtleSwgViB2YWx1ZSkgewogICAgZmluYWwgaGFzaENvZGUgPSBpZGVudGl0eUhhc2hDb2RlKGtleSk7CiAgICBmaW5hbCBidWNrZXRzID0gX2J1Y2tldHM7CiAgICBmaW5hbCBsZW5ndGggPSBidWNrZXRzLmxlbmd0aDsKICAgIGZpbmFsIGluZGV4ID0gaGFzaENvZGUgJiAobGVuZ3RoIC0gMSk7CiAgICB2YXIgZW50cnkgPSBidWNrZXRzW2luZGV4XTsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGlmIChoYXNoQ29kZSA9PSBlbnRyeS5oYXNoQ29kZSAmJiBpZGVudGljYWwoZW50cnkua2V5LCBrZXkpKSB7CiAgICAgICAgZW50cnkudmFsdWUgPSB2YWx1ZTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwogICAgfQogICAgX2FkZEVudHJ5KGJ1Y2tldHMsIGluZGV4LCBsZW5ndGgsIGtleSwgdmFsdWUsIGhhc2hDb2RlKTsKICB9CgogIFYgcHV0SWZBYnNlbnQoSyBrZXksIFYgaWZBYnNlbnQoKSkgewogICAgZmluYWwgaGFzaENvZGUgPSBpZGVudGl0eUhhc2hDb2RlKGtleSk7CiAgICBmaW5hbCBidWNrZXRzID0gX2J1Y2tldHM7CiAgICBmaW5hbCBsZW5ndGggPSBidWNrZXRzLmxlbmd0aDsKICAgIGZpbmFsIGluZGV4ID0gaGFzaENvZGUgJiAobGVuZ3RoIC0gMSk7CiAgICB2YXIgZW50cnkgPSBidWNrZXRzW2luZGV4XTsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGlmIChoYXNoQ29kZSA9PSBlbnRyeS5oYXNoQ29kZSAmJiBpZGVudGljYWwoZW50cnkua2V5LCBrZXkpKSB7CiAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlOwogICAgICB9CiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKICAgIH0KICAgIGZpbmFsIHN0YW1wID0gX21vZGlmaWNhdGlvbkNvdW50OwogICAgViB2YWx1ZSA9IGlmQWJzZW50KCk7CiAgICBpZiAoc3RhbXAgPT0gX21vZGlmaWNhdGlvbkNvdW50KSB7CiAgICAgIF9hZGRFbnRyeShidWNrZXRzLCBpbmRleCwgbGVuZ3RoLCBrZXksIHZhbHVlLCBoYXNoQ29kZSk7CiAgICB9IGVsc2UgewogICAgICB0aGlzW2tleV0gPSB2YWx1ZTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CgogIFYgcmVtb3ZlKE9iamVjdCBrZXkpIHsKICAgIGZpbmFsIGhhc2hDb2RlID0gaWRlbnRpdHlIYXNoQ29kZShrZXkpOwogICAgZmluYWwgYnVja2V0cyA9IF9idWNrZXRzOwogICAgZmluYWwgaW5kZXggPSBoYXNoQ29kZSAmIChidWNrZXRzLmxlbmd0aCAtIDEpOwogICAgdmFyIGVudHJ5ID0gYnVja2V0c1tpbmRleF07CiAgICBfSGFzaE1hcEVudHJ5PEssIFY+IHByZXZpb3VzID0gbnVsbDsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGZpbmFsIG5leHQgPSBlbnRyeS5uZXh0OwogICAgICBpZiAoaGFzaENvZGUgPT0gZW50cnkuaGFzaENvZGUgJiYgaWRlbnRpY2FsKGVudHJ5LmtleSwga2V5KSkgewogICAgICAgIF9yZW1vdmVFbnRyeShlbnRyeSwgcHJldmlvdXMsIGluZGV4KTsKICAgICAgICBfZWxlbWVudENvdW50LS07CiAgICAgICAgX21vZGlmaWNhdGlvbkNvdW50ID0KICAgICAgICAgICAgKF9tb2RpZmljYXRpb25Db3VudCArIDEpICYgX01PRElGSUNBVElPTl9DT1VOVF9NQVNLOwogICAgICAgIHJldHVybiBlbnRyeS52YWx1ZTsKICAgICAgfQogICAgICBwcmV2aW91cyA9IGVudHJ5OwogICAgICBlbnRyeSA9IG5leHQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIFNldDxLPiBfbmV3S2V5U2V0KCkgPT4gbmV3IF9JZGVudGl0eUhhc2hTZXQ8Sz4oKTsKfQoKY2xhc3MgX0hhc2hNYXBFbnRyeTxLLCBWPiB7CiAgZmluYWwgSyBrZXk7CiAgViB2YWx1ZTsKICBmaW5hbCBpbnQgaGFzaENvZGU7CiAgX0hhc2hNYXBFbnRyeTxLLCBWPiBuZXh0OwogIF9IYXNoTWFwRW50cnkodGhpcy5rZXksIHRoaXMudmFsdWUsIHRoaXMuaGFzaENvZGUsIHRoaXMubmV4dCk7Cn0KCmFic3RyYWN0IGNsYXNzIF9IYXNoTWFwSXRlcmFibGU8SywgViwgRT4KICAgIGV4dGVuZHMgaW50ZXJuYWwuRWZmaWNpZW50TGVuZ3RoSXRlcmFibGU8RT4gewogIGZpbmFsIF9IYXNoTWFwPEssIFY+IF9tYXA7CiAgX0hhc2hNYXBJdGVyYWJsZSh0aGlzLl9tYXApOwogIGludCBnZXQgbGVuZ3RoID0+IF9tYXAubGVuZ3RoOwogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX21hcC5pc0VtcHR5OwogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gX21hcC5pc05vdEVtcHR5Owp9CgpjbGFzcyBfSGFzaE1hcEtleUl0ZXJhYmxlPEssIFY+IGV4dGVuZHMgX0hhc2hNYXBJdGVyYWJsZTxLLCBWLCBLPiB7CiAgX0hhc2hNYXBLZXlJdGVyYWJsZShfSGFzaE1hcDxLLCBWPiBtYXApIDogc3VwZXIobWFwKTsKICBJdGVyYXRvcjxLPiBnZXQgaXRlcmF0b3IgPT4gbmV3IF9IYXNoTWFwS2V5SXRlcmF0b3I8SywgVj4oX21hcCk7CiAgYm9vbCBjb250YWlucyhPYmplY3Qga2V5KSA9PiBfbWFwLmNvbnRhaW5zS2V5KGtleSk7CiAgdm9pZCBmb3JFYWNoKHZvaWQgYWN0aW9uKEsga2V5KSkgewogICAgX21hcC5mb3JFYWNoKChLIGtleSwgXykgewogICAgICBhY3Rpb24oa2V5KTsKICAgIH0pOwogIH0KCiAgU2V0PEs+IHRvU2V0KCkgPT4gX21hcC5fbmV3S2V5U2V0KCkuLmFkZEFsbCh0aGlzKTsKfQoKY2xhc3MgX0hhc2hNYXBWYWx1ZUl0ZXJhYmxlPEssIFY+IGV4dGVuZHMgX0hhc2hNYXBJdGVyYWJsZTxLLCBWLCBWPiB7CiAgX0hhc2hNYXBWYWx1ZUl0ZXJhYmxlKF9IYXNoTWFwPEssIFY+IG1hcCkgOiBzdXBlcihtYXApOwogIEl0ZXJhdG9yPFY+IGdldCBpdGVyYXRvciA9PiBuZXcgX0hhc2hNYXBWYWx1ZUl0ZXJhdG9yPEssIFY+KF9tYXApOwogIGJvb2wgY29udGFpbnMoT2JqZWN0IHZhbHVlKSA9PiBfbWFwLmNvbnRhaW5zVmFsdWUodmFsdWUpOwogIHZvaWQgZm9yRWFjaCh2b2lkIGFjdGlvbihWIHZhbHVlKSkgewogICAgX21hcC5mb3JFYWNoKChfLCBWIHZhbHVlKSB7CiAgICAgIGFjdGlvbih2YWx1ZSk7CiAgICB9KTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIF9IYXNoTWFwSXRlcmF0b3I8SywgViwgRT4gaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7CiAgZmluYWwgX0hhc2hNYXA8SywgVj4gX21hcDsKICBmaW5hbCBpbnQgX3N0YW1wOwoKICBpbnQgX2luZGV4ID0gMDsKICBfSGFzaE1hcEVudHJ5PEssIFY+IF9lbnRyeTsKCiAgX0hhc2hNYXBJdGVyYXRvcih0aGlzLl9tYXApIDogX3N0YW1wID0gX21hcC5fbW9kaWZpY2F0aW9uQ291bnQ7CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBpZiAoX3N0YW1wICE9IF9tYXAuX21vZGlmaWNhdGlvbkNvdW50KSB7CiAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IoX21hcCk7CiAgICB9CiAgICB2YXIgZW50cnkgPSBfZW50cnk7CiAgICBpZiAoZW50cnkgIT0gbnVsbCkgewogICAgICBmaW5hbCBuZXh0ID0gZW50cnkubmV4dDsKICAgICAgaWYgKG5leHQgIT0gbnVsbCkgewogICAgICAgIF9lbnRyeSA9IG5leHQ7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgX2VudHJ5ID0gbnVsbDsKICAgIH0KICAgIGZpbmFsIGJ1Y2tldHMgPSBfbWFwLl9idWNrZXRzOwogICAgZmluYWwgbGVuZ3RoID0gYnVja2V0cy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gX2luZGV4OyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgZW50cnkgPSBidWNrZXRzW2ldOwogICAgICBpZiAoZW50cnkgIT0gbnVsbCkgewogICAgICAgIF9pbmRleCA9IGkgKyAxOwogICAgICAgIF9lbnRyeSA9IGVudHJ5OwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICBfaW5kZXggPSBsZW5ndGg7CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CgpjbGFzcyBfSGFzaE1hcEtleUl0ZXJhdG9yPEssIFY+IGV4dGVuZHMgX0hhc2hNYXBJdGVyYXRvcjxLLCBWLCBLPiB7CiAgX0hhc2hNYXBLZXlJdGVyYXRvcihfSGFzaE1hcDxLLCBWPiBtYXApIDogc3VwZXIobWFwKTsKICBLIGdldCBjdXJyZW50ID0+IF9lbnRyeT8ua2V5Owp9CgpjbGFzcyBfSGFzaE1hcFZhbHVlSXRlcmF0b3I8SywgVj4gZXh0ZW5kcyBfSGFzaE1hcEl0ZXJhdG9yPEssIFYsIFY+IHsKICBfSGFzaE1hcFZhbHVlSXRlcmF0b3IoX0hhc2hNYXA8SywgVj4gbWFwKSA6IHN1cGVyKG1hcCk7CiAgViBnZXQgY3VycmVudCA9PiBfZW50cnk/LnZhbHVlOwp9CgpAcGF0Y2gKY2xhc3MgSGFzaFNldDxFPiB7CiAgQHBhdGNoCiAgZmFjdG9yeSBIYXNoU2V0KAogICAgICB7Ym9vbCBlcXVhbHMoRSBlMSwgRSBlMiksCiAgICAgIGludCBoYXNoQ29kZShFIGUpLAogICAgICBib29sIGlzVmFsaWRLZXkocG90ZW50aWFsS2V5KX0pIHsKICAgIGlmIChpc1ZhbGlkS2V5ID09IG51bGwpIHsKICAgICAgaWYgKGhhc2hDb2RlID09IG51bGwpIHsKICAgICAgICBpZiAoZXF1YWxzID09IG51bGwpIHsKICAgICAgICAgIHJldHVybiBuZXcgX0hhc2hTZXQ8RT4oKTsKICAgICAgICB9CiAgICAgICAgaGFzaENvZGUgPSBfZGVmYXVsdEhhc2hDb2RlOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChpZGVudGljYWwoaWRlbnRpdHlIYXNoQ29kZSwgaGFzaENvZGUpICYmCiAgICAgICAgICAgIGlkZW50aWNhbChpZGVudGljYWwsIGVxdWFscykpIHsKICAgICAgICAgIHJldHVybiBuZXcgX0lkZW50aXR5SGFzaFNldDxFPigpOwogICAgICAgIH0KICAgICAgICBlcXVhbHMgPz89IF9kZWZhdWx0RXF1YWxzOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBoYXNoQ29kZSA/Pz0gX2RlZmF1bHRIYXNoQ29kZTsKICAgICAgZXF1YWxzID8/PSBfZGVmYXVsdEVxdWFsczsKICAgIH0KICAgIHJldHVybiBuZXcgX0N1c3RvbUhhc2hTZXQ8RT4oZXF1YWxzLCBoYXNoQ29kZSwgaXNWYWxpZEtleSk7CiAgfQoKICBAcGF0Y2gKICBmYWN0b3J5IEhhc2hTZXQuaWRlbnRpdHkoKSA9PiBuZXcgX0lkZW50aXR5SGFzaFNldDxFPigpOwp9CgpjbGFzcyBfSGFzaFNldDxFPiBleHRlbmRzIF9TZXRCYXNlPEU+IGltcGxlbWVudHMgSGFzaFNldDxFPiB7CiAgc3RhdGljIGNvbnN0IGludCBfSU5JVElBTF9DQVBBQ0lUWSA9IDg7CgogIExpc3Q8X0hhc2hTZXRFbnRyeTxFPj4gX2J1Y2tldHMgPQogICAgICBuZXcgTGlzdDxfSGFzaFNldEVudHJ5PEU+PihfSU5JVElBTF9DQVBBQ0lUWSk7CiAgaW50IF9lbGVtZW50Q291bnQgPSAwOwogIGludCBfbW9kaWZpY2F0aW9uQ291bnQgPSAwOwoKICBib29sIF9lcXVhbHMoZTEsIGUyKSA9PiBlMSA9PSBlMjsKICBpbnQgX2hhc2hDb2RlKGUpID0+IGUuaGFzaENvZGU7CgogIHN0YXRpYyBTZXQ8Uj4gX25ld0VtcHR5PFI+KCkgPT4gbmV3IF9IYXNoU2V0PFI+KCk7CgogIC8vIEl0ZXJhYmxlLgoKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3IgPT4gbmV3IF9IYXNoU2V0SXRlcmF0b3I8RT4odGhpcyk7CgogIGludCBnZXQgbGVuZ3RoID0+IF9lbGVtZW50Q291bnQ7CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2VsZW1lbnRDb3VudCA9PSAwOwoKICBib29sIGdldCBpc05vdEVtcHR5ID0+IF9lbGVtZW50Q291bnQgIT0gMDsKCiAgYm9vbCBjb250YWlucyhPYmplY3Qgb2JqZWN0KSB7CiAgICBpbnQgaW5kZXggPSBfaGFzaENvZGUob2JqZWN0KSAmIChfYnVja2V0cy5sZW5ndGggLSAxKTsKICAgIF9IYXNoU2V0RW50cnk8RT4gZW50cnkgPSBfYnVja2V0c1tpbmRleF07CiAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewogICAgICBpZiAoX2VxdWFscyhlbnRyeS5rZXksIG9iamVjdCkpIHJldHVybiB0cnVlOwogICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBFIGxvb2t1cChPYmplY3Qgb2JqZWN0KSB7CiAgICBpbnQgaW5kZXggPSBfaGFzaENvZGUob2JqZWN0KSAmIChfYnVja2V0cy5sZW5ndGggLSAxKTsKICAgIF9IYXNoU2V0RW50cnk8RT4gZW50cnkgPSBfYnVja2V0c1tpbmRleF07CiAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewogICAgICB2YXIga2V5ID0gZW50cnkua2V5OwogICAgICBpZiAoX2VxdWFscyhrZXksIG9iamVjdCkpIHJldHVybiBrZXk7CiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgRSBnZXQgZmlyc3QgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfYnVja2V0cy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgZW50cnkgPSBfYnVja2V0c1tpXTsKICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgICByZXR1cm4gZW50cnkua2V5OwogICAgICB9CiAgICB9CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEUgZ2V0IGxhc3QgewogICAgZm9yIChpbnQgaSA9IF9idWNrZXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIHZhciBlbnRyeSA9IF9idWNrZXRzW2ldOwogICAgICBpZiAoZW50cnkgIT0gbnVsbCkgewogICAgICAgIHdoaWxlIChlbnRyeS5uZXh0ICE9IG51bGwpIHsKICAgICAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGVudHJ5LmtleTsKICAgICAgfQogICAgfQogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICAvLyBTZXQuCgogIGJvb2wgYWRkKEUgZWxlbWVudCkgewogICAgZmluYWwgaGFzaENvZGUgPSBfaGFzaENvZGUoZWxlbWVudCk7CiAgICBmaW5hbCBpbmRleCA9IGhhc2hDb2RlICYgKF9idWNrZXRzLmxlbmd0aCAtIDEpOwogICAgX0hhc2hTZXRFbnRyeTxFPiBlbnRyeSA9IF9idWNrZXRzW2luZGV4XTsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGlmIChfZXF1YWxzKGVudHJ5LmtleSwgZWxlbWVudCkpIHJldHVybiBmYWxzZTsKICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwogICAgfQogICAgX2FkZEVudHJ5KGVsZW1lbnQsIGhhc2hDb2RlLCBpbmRleCk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IG9iamVjdHMpIHsKICAgIGZvciAoRSBvYmplY3QgaW4gb2JqZWN0cykgewogICAgICBhZGQob2JqZWN0KTsKICAgIH0KICB9CgogIGJvb2wgX3JlbW92ZShPYmplY3Qgb2JqZWN0LCBpbnQgaGFzaENvZGUpIHsKICAgIGZpbmFsIGluZGV4ID0gaGFzaENvZGUgJiAoX2J1Y2tldHMubGVuZ3RoIC0gMSk7CiAgICBfSGFzaFNldEVudHJ5PEU+IGVudHJ5ID0gX2J1Y2tldHNbaW5kZXhdOwogICAgX0hhc2hTZXRFbnRyeTxFPiBwcmV2aW91cyA9IG51bGw7CiAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewogICAgICBpZiAoX2VxdWFscyhlbnRyeS5rZXksIG9iamVjdCkpIHsKICAgICAgICBfSGFzaFNldEVudHJ5PEU+IG5leHQgPSBlbnRyeS5yZW1vdmUoKTsKICAgICAgICBpZiAocHJldmlvdXMgPT0gbnVsbCkgewogICAgICAgICAgX2J1Y2tldHNbaW5kZXhdID0gbmV4dDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcHJldmlvdXMubmV4dCA9IG5leHQ7CiAgICAgICAgfQogICAgICAgIF9lbGVtZW50Q291bnQtLTsKICAgICAgICBfbW9kaWZpY2F0aW9uQ291bnQgPQogICAgICAgICAgICAoX21vZGlmaWNhdGlvbkNvdW50ICsgMSkgJiBfTU9ESUZJQ0FUSU9OX0NPVU5UX01BU0s7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcHJldmlvdXMgPSBlbnRyeTsKICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgYm9vbCByZW1vdmUoT2JqZWN0IG9iamVjdCkgPT4gX3JlbW92ZShvYmplY3QsIF9oYXNoQ29kZShvYmplY3QpKTsKCiAgdm9pZCByZW1vdmVBbGwoSXRlcmFibGU8T2JqZWN0PiBvYmplY3RzVG9SZW1vdmUpIHsKICAgIGZvciAoT2JqZWN0IG9iamVjdCBpbiBvYmplY3RzVG9SZW1vdmUpIHsKICAgICAgX3JlbW92ZShvYmplY3QsIF9oYXNoQ29kZShvYmplY3QpKTsKICAgIH0KICB9CgogIHZvaWQgX2ZpbHRlcldoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCBib29sIHJlbW92ZU1hdGNoaW5nKSB7CiAgICBpbnQgbGVuZ3RoID0gX2J1Y2tldHMubGVuZ3RoOwogICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgewogICAgICBfSGFzaFNldEVudHJ5PEU+IGVudHJ5ID0gX2J1Y2tldHNbaW5kZXhdOwogICAgICBfSGFzaFNldEVudHJ5PEU+IHByZXZpb3VzID0gbnVsbDsKICAgICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgICBpbnQgbW9kaWZpY2F0aW9uQ291bnQgPSBfbW9kaWZpY2F0aW9uQ291bnQ7CiAgICAgICAgYm9vbCB0ZXN0UmVzdWx0ID0gdGVzdChlbnRyeS5rZXkpOwogICAgICAgIGlmIChtb2RpZmljYXRpb25Db3VudCAhPSBfbW9kaWZpY2F0aW9uQ291bnQpIHsKICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgICAgfQogICAgICAgIGlmICh0ZXN0UmVzdWx0ID09IHJlbW92ZU1hdGNoaW5nKSB7CiAgICAgICAgICBfSGFzaFNldEVudHJ5PEU+IG5leHQgPSBlbnRyeS5yZW1vdmUoKTsKICAgICAgICAgIGlmIChwcmV2aW91cyA9PSBudWxsKSB7CiAgICAgICAgICAgIF9idWNrZXRzW2luZGV4XSA9IG5leHQ7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDsKICAgICAgICAgIH0KICAgICAgICAgIF9lbGVtZW50Q291bnQtLTsKICAgICAgICAgIF9tb2RpZmljYXRpb25Db3VudCA9CiAgICAgICAgICAgICAgKF9tb2RpZmljYXRpb25Db3VudCArIDEpICYgX01PRElGSUNBVElPTl9DT1VOVF9NQVNLOwogICAgICAgICAgZW50cnkgPSBuZXh0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcmV2aW91cyA9IGVudHJ5OwogICAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgX2ZpbHRlcldoZXJlKHRlc3QsIHRydWUpOwogIH0KCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgX2ZpbHRlcldoZXJlKHRlc3QsIGZhbHNlKTsKICB9CgogIHZvaWQgY2xlYXIoKSB7CiAgICBfYnVja2V0cyA9IG5ldyBMaXN0KF9JTklUSUFMX0NBUEFDSVRZKTsKICAgIGlmIChfZWxlbWVudENvdW50ID4gMCkgewogICAgICBfZWxlbWVudENvdW50ID0gMDsKICAgICAgX21vZGlmaWNhdGlvbkNvdW50ID0gKF9tb2RpZmljYXRpb25Db3VudCArIDEpICYgX01PRElGSUNBVElPTl9DT1VOVF9NQVNLOwogICAgfQogIH0KCiAgdm9pZCBfYWRkRW50cnkoRSBrZXksIGludCBoYXNoQ29kZSwgaW50IGluZGV4KSB7CiAgICBfYnVja2V0c1tpbmRleF0gPSBuZXcgX0hhc2hTZXRFbnRyeTxFPihrZXksIGhhc2hDb2RlLCBfYnVja2V0c1tpbmRleF0pOwogICAgaW50IG5ld0VsZW1lbnRzID0gX2VsZW1lbnRDb3VudCArIDE7CiAgICBfZWxlbWVudENvdW50ID0gbmV3RWxlbWVudHM7CiAgICBpbnQgbGVuZ3RoID0gX2J1Y2tldHMubGVuZ3RoOwogICAgLy8gSWYgd2UgZW5kIHVwIHdpdGggbW9yZSB0aGFuIDc1JSBub24tZW1wdHkgZW50cmllcywgd2UKICAgIC8vIHJlc2l6ZSB0aGUgYmFja2luZyBzdG9yZS4KICAgIGlmICgobmV3RWxlbWVudHMgPDwgMikgPiAoKGxlbmd0aCA8PCAxKSArIGxlbmd0aCkpIF9yZXNpemUoKTsKICAgIF9tb2RpZmljYXRpb25Db3VudCA9IChfbW9kaWZpY2F0aW9uQ291bnQgKyAxKSAmIF9NT0RJRklDQVRJT05fQ09VTlRfTUFTSzsKICB9CgogIHZvaWQgX3Jlc2l6ZSgpIHsKICAgIGludCBvbGRMZW5ndGggPSBfYnVja2V0cy5sZW5ndGg7CiAgICBpbnQgbmV3TGVuZ3RoID0gb2xkTGVuZ3RoIDw8IDE7CiAgICBMaXN0IG9sZEJ1Y2tldHMgPSBfYnVja2V0czsKICAgIExpc3QgbmV3QnVja2V0cyA9IG5ldyBMaXN0PF9IYXNoU2V0RW50cnk8RT4+KG5ld0xlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG9sZExlbmd0aDsgaSsrKSB7CiAgICAgIF9IYXNoU2V0RW50cnk8RT4gZW50cnkgPSBvbGRCdWNrZXRzW2ldOwogICAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewogICAgICAgIF9IYXNoU2V0RW50cnk8RT4gbmV4dCA9IGVudHJ5Lm5leHQ7CiAgICAgICAgaW50IG5ld0luZGV4ID0gZW50cnkuaGFzaENvZGUgJiAobmV3TGVuZ3RoIC0gMSk7CiAgICAgICAgZW50cnkubmV4dCA9IG5ld0J1Y2tldHNbbmV3SW5kZXhdOwogICAgICAgIG5ld0J1Y2tldHNbbmV3SW5kZXhdID0gZW50cnk7CiAgICAgICAgZW50cnkgPSBuZXh0OwogICAgICB9CiAgICB9CiAgICBfYnVja2V0cyA9IG5ld0J1Y2tldHM7CiAgfQoKICBIYXNoU2V0PEU+IF9uZXdTZXQoKSA9PiBuZXcgX0hhc2hTZXQ8RT4oKTsKICBIYXNoU2V0PFI+IF9uZXdTaW1pbGFyU2V0PFI+KCkgPT4gbmV3IF9IYXNoU2V0PFI+KCk7Cn0KCmNsYXNzIF9JZGVudGl0eUhhc2hTZXQ8RT4gZXh0ZW5kcyBfSGFzaFNldDxFPiB7CiAgaW50IF9oYXNoQ29kZShlKSA9PiBpZGVudGl0eUhhc2hDb2RlKGUpOwogIGJvb2wgX2VxdWFscyhlMSwgZTIpID0+IGlkZW50aWNhbChlMSwgZTIpOwoKICBIYXNoU2V0PEU+IF9uZXdTZXQoKSA9PiBuZXcgX0lkZW50aXR5SGFzaFNldDxFPigpOwogIEhhc2hTZXQ8Uj4gX25ld1NpbWlsYXJTZXQ8Uj4oKSA9PiBuZXcgX0lkZW50aXR5SGFzaFNldDxSPigpOwp9CgpjbGFzcyBfQ3VzdG9tSGFzaFNldDxFPiBleHRlbmRzIF9IYXNoU2V0PEU+IHsKICBmaW5hbCBfRXF1YWxpdHk8RT4gX2VxdWFsaXR5OwogIGZpbmFsIF9IYXNoZXI8RT4gX2hhc2hlcjsKICBmaW5hbCBfUHJlZGljYXRlIF92YWxpZEtleTsKICBfQ3VzdG9tSGFzaFNldCh0aGlzLl9lcXVhbGl0eSwgdGhpcy5faGFzaGVyLCBib29sIHZhbGlkS2V5KE9iamVjdCBvKSkKICAgICAgOiBfdmFsaWRLZXkgPSAodmFsaWRLZXkgIT0gbnVsbCkgPyB2YWxpZEtleSA6IG5ldyBfVHlwZVRlc3Q8RT4oKS50ZXN0OwoKICBib29sIHJlbW92ZShPYmplY3QgZWxlbWVudCkgewogICAgaWYgKCFfdmFsaWRLZXkoZWxlbWVudCkpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBzdXBlci5yZW1vdmUoZWxlbWVudCk7CiAgfQoKICBib29sIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KSB7CiAgICBpZiAoIV92YWxpZEtleShlbGVtZW50KSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHN1cGVyLmNvbnRhaW5zKGVsZW1lbnQpOwogIH0KCiAgRSBsb29rdXAoT2JqZWN0IGVsZW1lbnQpIHsKICAgIGlmICghX3ZhbGlkS2V5KGVsZW1lbnQpKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBzdXBlci5sb29rdXAoZWxlbWVudCk7CiAgfQoKICBib29sIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPE9iamVjdD4gZWxlbWVudHMpIHsKICAgIGZvciAoT2JqZWN0IGVsZW1lbnQgaW4gZWxlbWVudHMpIHsKICAgICAgaWYgKCFfdmFsaWRLZXkoZWxlbWVudCkgfHwgIXRoaXMuY29udGFpbnMoZWxlbWVudCkpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgdm9pZCByZW1vdmVBbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cykgewogICAgZm9yIChPYmplY3QgZWxlbWVudCBpbiBlbGVtZW50cykgewogICAgICBpZiAoX3ZhbGlkS2V5KGVsZW1lbnQpKSB7CiAgICAgICAgc3VwZXIuX3JlbW92ZShlbGVtZW50LCBfaGFzaGVyKGVsZW1lbnQpKTsKICAgICAgfQogICAgfQogIH0KCiAgYm9vbCBfZXF1YWxzKGUxLCBlMikgPT4gX2VxdWFsaXR5KGUxLCBlMik7CiAgaW50IF9oYXNoQ29kZShlKSA9PiBfaGFzaGVyKGUpOwoKICBIYXNoU2V0PEU+IF9uZXdTZXQoKSA9PiBuZXcgX0N1c3RvbUhhc2hTZXQ8RT4oX2VxdWFsaXR5LCBfaGFzaGVyLCBfdmFsaWRLZXkpOwogIEhhc2hTZXQ8Uj4gX25ld1NpbWlsYXJTZXQ8Uj4oKSA9PiBuZXcgX0hhc2hTZXQ8Uj4oKTsKfQoKY2xhc3MgX0hhc2hTZXRFbnRyeTxFPiB7CiAgZmluYWwgRSBrZXk7CiAgZmluYWwgaW50IGhhc2hDb2RlOwogIF9IYXNoU2V0RW50cnk8RT4gbmV4dDsKICBfSGFzaFNldEVudHJ5KHRoaXMua2V5LCB0aGlzLmhhc2hDb2RlLCB0aGlzLm5leHQpOwoKICBfSGFzaFNldEVudHJ5PEU+IHJlbW92ZSgpIHsKICAgIGZpbmFsIHJlc3VsdCA9IG5leHQ7CiAgICBuZXh0ID0gbnVsbDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CgpjbGFzcyBfSGFzaFNldEl0ZXJhdG9yPEU+IGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewogIGZpbmFsIF9IYXNoU2V0PEU+IF9zZXQ7CiAgZmluYWwgaW50IF9tb2RpZmljYXRpb25Db3VudDsKICBpbnQgX2luZGV4ID0gMDsKICBfSGFzaFNldEVudHJ5PEU+IF9uZXh0OwogIEUgX2N1cnJlbnQ7CgogIF9IYXNoU2V0SXRlcmF0b3IodGhpcy5fc2V0KSA6IF9tb2RpZmljYXRpb25Db3VudCA9IF9zZXQuX21vZGlmaWNhdGlvbkNvdW50OwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKF9tb2RpZmljYXRpb25Db3VudCAhPSBfc2V0Ll9tb2RpZmljYXRpb25Db3VudCkgewogICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKF9zZXQpOwogICAgfQogICAgaWYgKF9uZXh0ICE9IG51bGwpIHsKICAgICAgX2N1cnJlbnQgPSBfbmV4dC5rZXk7CiAgICAgIF9uZXh0ID0gX25leHQubmV4dDsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBMaXN0PF9IYXNoU2V0RW50cnk8RT4+IGJ1Y2tldHMgPSBfc2V0Ll9idWNrZXRzOwogICAgd2hpbGUgKF9pbmRleCA8IGJ1Y2tldHMubGVuZ3RoKSB7CiAgICAgIF9uZXh0ID0gYnVja2V0c1tfaW5kZXhdOwogICAgICBfaW5kZXggPSBfaW5kZXggKyAxOwogICAgICBpZiAoX25leHQgIT0gbnVsbCkgewogICAgICAgIF9jdXJyZW50ID0gX25leHQua2V5OwogICAgICAgIF9uZXh0ID0gX25leHQubmV4dDsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgX2N1cnJlbnQgPSBudWxsOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgRSBnZXQgY3VycmVudCA9PiBfY3VycmVudDsKfQoKLyoqCiAqIEEgaGFzaC1iYXNlZCBtYXAgdGhhdCBpdGVyYXRlcyBrZXlzIGFuZCB2YWx1ZXMgaW4ga2V5IGluc2VydGlvbiBvcmRlci4KICogVGhpcyBpcyBuZXZlciBhY3R1YWxseSBpbnN0YW50aWF0ZWQgYW55IG1vcmUgLSB0aGUgY29uc3RydWN0b3IgYWx3YXlzCiAqIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgX0NvbXBhY3RMaW5rZWRIYXNoTWFwIG9yIF9JbnRlcm5hbExpbmtlZEhhc2hNYXAsCiAqIHdoaWNoIGRlc3BpdGUgdGhlIG5hbWVzIGRvIG5vdCB1c2UgbGlua3MgKGJ1dCBhcmUgaW5zZXJ0aW9uLW9yZGVyZWQgYXMgaWYKICogdGhleSBkaWQpLgogKi8KQHBhdGNoCmNsYXNzIExpbmtlZEhhc2hNYXA8SywgVj4gewogIEBwYXRjaAogIGZhY3RvcnkgTGlua2VkSGFzaE1hcCgKICAgICAge2Jvb2wgZXF1YWxzKEsga2V5MSwgSyBrZXkyKSwKICAgICAgaW50IGhhc2hDb2RlKEsga2V5KSwKICAgICAgYm9vbCBpc1ZhbGlkS2V5KHBvdGVudGlhbEtleSl9KSB7CiAgICBpZiAoaXNWYWxpZEtleSA9PSBudWxsKSB7CiAgICAgIGlmIChoYXNoQ29kZSA9PSBudWxsKSB7CiAgICAgICAgaWYgKGVxdWFscyA9PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gbmV3IF9JbnRlcm5hbExpbmtlZEhhc2hNYXA8SywgVj4oKTsKICAgICAgICB9CiAgICAgICAgaGFzaENvZGUgPSBfZGVmYXVsdEhhc2hDb2RlOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChpZGVudGljYWwoaWRlbnRpdHlIYXNoQ29kZSwgaGFzaENvZGUpICYmCiAgICAgICAgICAgIGlkZW50aWNhbChpZGVudGljYWwsIGVxdWFscykpIHsKICAgICAgICAgIHJldHVybiBuZXcgX0NvbXBhY3RMaW5rZWRJZGVudGl0eUhhc2hNYXA8SywgVj4oKTsKICAgICAgICB9CiAgICAgICAgZXF1YWxzID8/PSBfZGVmYXVsdEVxdWFsczsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaGFzaENvZGUgPz89IF9kZWZhdWx0SGFzaENvZGU7CiAgICAgIGVxdWFscyA/Pz0gX2RlZmF1bHRFcXVhbHM7CiAgICB9CiAgICByZXR1cm4gbmV3IF9Db21wYWN0TGlua2VkQ3VzdG9tSGFzaE1hcDxLLCBWPihlcXVhbHMsIGhhc2hDb2RlLCBpc1ZhbGlkS2V5KTsKICB9CgogIEBwYXRjaAogIGZhY3RvcnkgTGlua2VkSGFzaE1hcC5pZGVudGl0eSgpID0+IG5ldyBfQ29tcGFjdExpbmtlZElkZW50aXR5SGFzaE1hcDxLLCBWPigpOwp9CgpAcGF0Y2gKY2xhc3MgTGlua2VkSGFzaFNldDxFPiB7CiAgQHBhdGNoCiAgZmFjdG9yeSBMaW5rZWRIYXNoU2V0KAogICAgICB7Ym9vbCBlcXVhbHMoRSBlMSwgRSBlMiksCiAgICAgIGludCBoYXNoQ29kZShFIGUpLAogICAgICBib29sIGlzVmFsaWRLZXkocG90ZW50aWFsS2V5KX0pIHsKICAgIGlmIChpc1ZhbGlkS2V5ID09IG51bGwpIHsKICAgICAgaWYgKGhhc2hDb2RlID09IG51bGwpIHsKICAgICAgICBpZiAoZXF1YWxzID09IG51bGwpIHsKICAgICAgICAgIHJldHVybiBuZXcgX0NvbXBhY3RMaW5rZWRIYXNoU2V0PEU+KCk7CiAgICAgICAgfQogICAgICAgIGhhc2hDb2RlID0gX2RlZmF1bHRIYXNoQ29kZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoaWRlbnRpY2FsKGlkZW50aXR5SGFzaENvZGUsIGhhc2hDb2RlKSAmJgogICAgICAgICAgICBpZGVudGljYWwoaWRlbnRpY2FsLCBlcXVhbHMpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IF9Db21wYWN0TGlua2VkSWRlbnRpdHlIYXNoU2V0PEU+KCk7CiAgICAgICAgfQogICAgICAgIGVxdWFscyA/Pz0gX2RlZmF1bHRFcXVhbHM7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGhhc2hDb2RlID8/PSBfZGVmYXVsdEhhc2hDb2RlOwogICAgICBlcXVhbHMgPz89IF9kZWZhdWx0RXF1YWxzOwogICAgfQogICAgcmV0dXJuIG5ldyBfQ29tcGFjdExpbmtlZEN1c3RvbUhhc2hTZXQ8RT4oZXF1YWxzLCBoYXNoQ29kZSwgaXNWYWxpZEtleSk7CiAgfQoKICBAcGF0Y2gKICBmYWN0b3J5IExpbmtlZEhhc2hTZXQuaWRlbnRpdHkoKSA9PiBuZXcgX0NvbXBhY3RMaW5rZWRJZGVudGl0eUhhc2hTZXQ8RT4oKTsKfQoKQHBhdGNoCmFic3RyYWN0IGNsYXNzIF9TcGxheVRyZWU8SywgTm9kZSBleHRlbmRzIF9TcGxheVRyZWVOb2RlPEs+PiB7CiAgLy8gV2Ugb3ZlcnJpZGUgX3NwbGF5TWluIGFuZCBfc3BsYXlNYXggdG8gb3B0aW1pemUgdHlwZS1jaGVja3MuCiAgQHBhdGNoCiAgTm9kZSBfc3BsYXlNaW4oTm9kZSBub2RlKSB7CiAgICBOb2RlIGN1cnJlbnQgPSBub2RlOwogICAgd2hpbGUgKGN1cnJlbnQubGVmdCAhPSBudWxsKSB7CiAgICAgIE5vZGUgbGVmdCA9IGludGVybmFsLnVuc2FmZUNhc3Q8Tm9kZT4oY3VycmVudC5sZWZ0KTsKICAgICAgY3VycmVudC5sZWZ0ID0gbGVmdC5yaWdodDsKICAgICAgbGVmdC5yaWdodCA9IGN1cnJlbnQ7CiAgICAgIGN1cnJlbnQgPSBsZWZ0Owog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cmlhbGl6YXRpb24uCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQp2b2lkIF9yZWhhc2hPYmplY3RzKExpc3Qgb2JqZWN0cykgewogIGZpbmFsIGludCBsZW5ndGggPSBvYmplY3RzLmxlbmd0aDsKICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICBvYmplY3RzW2ldLl9yZWdlbmVyYXRlSW5kZXgoKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIF9IYXNoRmllbGRCYXNlIHsKICAvLyBFYWNoIG9jY3VwaWVkIGVudHJ5IGluIF9pbmRleCBpcyBhIGZpeGVkLXNpemUgaW50ZWdlciB0aGF0IGVuY29kZXMgYSBwYWlyOgogIC8vICAgWyBoYXNoIHBhdHRlcm4gZm9yIGtleSB8IGluZGV4IG9mIGVudHJ5IGluIF9kYXRhIF0KICAvLyBUaGUgaGFzaCBwYXR0ZXJuIGlzIGJhc2VkIG9uIGhhc2hDb2RlLCBidXQgaXMgZ3VhcmFudGVlZCB0byBiZSBub24temVyby4KICAvLyBUaGUgbGVuZ3RoIG9mIF9pbmRleCBpcyBhbHdheXMgYSBwb3dlciBvZiB0d28sIGFuZCB0aGVyZSBpcyBhbHdheXMgYXQKICAvLyBsZWFzdCBvbmUgdW5vY2N1cGllZCBlbnRyeS4KICAvLyBOT1RFOiBXaGVuIG1hcHMgYXJlIGRlc2VyaWFsaXplZCwgdGhlaXIgX2luZGV4IGFuZCBfaGFzaE1hc2sgaXMgcmVnZW5lcmF0ZWQKICAvLyBlYWdlcmx5IGJ5IF9yZWdlbmVyYXRlSW5kZXguCiAgVWludDMyTGlzdCBfaW5kZXggPSBuZXcgVWludDMyTGlzdChfSGFzaEJhc2UuX0lOSVRJQUxfSU5ERVhfU0laRSk7CgogIC8vIENhY2hlZCBpbi1wbGFjZSBtYXNrIGZvciB0aGUgaGFzaCBwYXR0ZXJuIGNvbXBvbmVudC4KICBpbnQgX2hhc2hNYXNrID0gX0hhc2hCYXNlLl9pbmRleFNpemVUb0hhc2hNYXNrKF9IYXNoQmFzZS5fSU5JVElBTF9JTkRFWF9TSVpFKTsKCiAgLy8gRml4ZWQtbGVuZ3RoIGxpc3Qgb2Yga2V5cyAoc2V0KSBvciBrZXkvdmFsdWUgYXQgZXZlbi9vZGQgaW5kaWNlcyAobWFwKS4KICBMaXN0IF9kYXRhOwoKICAvLyBMZW5ndGggb2YgX2RhdGEgdGhhdCBpcyB1c2VkIChpLmUuLCBrZXlzICsgdmFsdWVzIGZvciBhIG1hcCkuCiAgaW50IF91c2VkRGF0YSA9IDA7CgogIC8vIE51bWJlciBvZiBkZWxldGVkIGtleXMuCiAgaW50IF9kZWxldGVkS2V5cyA9IDA7CgogIC8vIE5vdGU6IEFsbCBmaWVsZHMgYXJlIGluaXRpYWxpemVkIGluIGEgc2luZ2xlIGNvbnN0cnVjdG9yIHNvIHRoYXQgdGhlIFZNCiAgLy8gcmVjb2duaXplcyB0aGV5IGNhbm5vdCBob2xkIG51bGwgdmFsdWVzLiBUaGlzIG1ha2VzIGEgYmlnICgyMCUpIHBlcmZvcm1hbmNlCiAgLy8gZGlmZmVyZW5jZSBvbiBzb21lIG9wZXJhdGlvbnMuCiAgX0hhc2hGaWVsZEJhc2UoaW50IGRhdGFTaXplKSA6IHRoaXMuX2RhdGEgPSBuZXcgTGlzdChkYXRhU2l6ZSk7Cn0KCi8vIEJhc2UgY2xhc3MgZm9yIFZNLWludGVybmFsIGNsYXNzZXM7IGtlZXAgaW4gc3luYyB3aXRoIF9IYXNoRmllbGRCYXNlLgphYnN0cmFjdCBjbGFzcyBfSGFzaFZNQmFzZSB7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDp0eXBlZF9kYXRhI19VaW50MzJMaXN0IikKICBVaW50MzJMaXN0IGdldCBfaW5kZXggbmF0aXZlICJMaW5rZWRIYXNoTWFwX2dldEluZGV4IjsKICB2b2lkIHNldCBfaW5kZXgoVWludDMyTGlzdCB2YWx1ZSkgbmF0aXZlICJMaW5rZWRIYXNoTWFwX3NldEluZGV4IjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBnZXQgX2hhc2hNYXNrIG5hdGl2ZSAiTGlua2VkSGFzaE1hcF9nZXRIYXNoTWFzayI7CiAgdm9pZCBzZXQgX2hhc2hNYXNrKGludCB2YWx1ZSkgbmF0aXZlICJMaW5rZWRIYXNoTWFwX3NldEhhc2hNYXNrIjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19MaXN0IikKICBMaXN0IGdldCBfZGF0YSBuYXRpdmUgIkxpbmtlZEhhc2hNYXBfZ2V0RGF0YSI7CiAgdm9pZCBzZXQgX2RhdGEoTGlzdCB2YWx1ZSkgbmF0aXZlICJMaW5rZWRIYXNoTWFwX3NldERhdGEiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IGdldCBfdXNlZERhdGEgbmF0aXZlICJMaW5rZWRIYXNoTWFwX2dldFVzZWREYXRhIjsKICB2b2lkIHNldCBfdXNlZERhdGEoaW50IHZhbHVlKSBuYXRpdmUgIkxpbmtlZEhhc2hNYXBfc2V0VXNlZERhdGEiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IGdldCBfZGVsZXRlZEtleXMgbmF0aXZlICJMaW5rZWRIYXNoTWFwX2dldERlbGV0ZWRLZXlzIjsKICB2b2lkIHNldCBfZGVsZXRlZEtleXMoaW50IHZhbHVlKSBuYXRpdmUgIkxpbmtlZEhhc2hNYXBfc2V0RGVsZXRlZEtleXMiOwp9CgovLyBUaGlzIG1peGluIGNhbiBiZSBhcHBsaWVkIHRvIF9IYXNoRmllbGRCYXNlIG9yIF9IYXNoVk1CYXNlIChmb3IKLy8gbm9ybWFsIGFuZCBWTS1pbnRlcm5hbGl6ZWQgY2xhc3NlcywgcmVzcGVjdGl2ZWxleSksIHdoaWNoIHByb3ZpZGUgdGhlCi8vIGFjdHVhbCBmaWVsZHMvYWNjZXNzb3JzIHRoYXQgdGhpcyBtaXhpbiBhc3N1bWVzLgovLyBUT0RPKGtvZGEpOiBDb25zaWRlciBtb3ZpbmcgZmllbGQgY29tbWVudHMgdG8gX0hhc2hGaWVsZEJhc2UuCmFic3RyYWN0IGNsYXNzIF9IYXNoQmFzZSBpbXBsZW1lbnRzIF9IYXNoVk1CYXNlIHsKICAvLyBUaGUgbnVtYmVyIG9mIGJpdHMgdXNlZCBmb3IgZWFjaCBjb21wb25lbnQgaXMgZGV0ZXJtaW5lZCBieSB0YWJsZSBzaXplLgogIC8vIFRoZSBsZW5ndGggb2YgX2luZGV4IGlzIHR3aWNlIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBfZGF0YSwgYW5kIGJvdGgKICAvLyBhcmUgZG91YmxlZCB3aGVuIF9kYXRhIGlzIGZ1bGwuIFRodXMsIF9pbmRleCB3aWxsIGhhdmUgYSBtYXggbG9hZCBmYWN0b3IKICAvLyBvZiAxLzIsIHdoaWNoIGVuYWJsZXMgb25lIG1vcmUgYml0IHRvIGJlIHVzZWQgZm9yIHRoZSBoYXNoLgogIC8vIFRPRE8oa29kYSk6IENvbnNpZGVyIGdyb3dpbmcgX2RhdGEgYnkgZmFjdG9yIHNxcnQoMiksIHR3aWNlIGFzIG9mdGVuLgogIHN0YXRpYyBjb25zdCBpbnQgX0lOSVRJQUxfSU5ERVhfQklUUyA9IDM7CiAgc3RhdGljIGNvbnN0IGludCBfSU5JVElBTF9JTkRFWF9TSVpFID0gMSA8PCAoX0lOSVRJQUxfSU5ERVhfQklUUyArIDEpOwoKICAvLyBVbnVzZWQgYW5kIGRlbGV0ZWQgZW50cmllcyBhcmUgbWFya2VkIGJ5IDAgYW5kIDEsIHJlc3BlY3RpdmVseS4KICBzdGF0aWMgY29uc3QgaW50IF9VTlVTRURfUEFJUiA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBfREVMRVRFRF9QQUlSID0gMTsKCiAgLy8gT24gMzItYml0LCB0aGUgdG9wIGJpdHMgYXJlIHdhc3RlZCB0byBhdm9pZCBNaW50IGFsbG9jYXRpb24uCiAgLy8gVE9ETyhrb2RhKTogUmVjbGFpbSB0aGUgYml0cyBieSBtYWtpbmcgdGhlIGNvbXBpbGVyIHRyZWF0IGhhc2ggcGF0dGVybnMKICAvLyBhcyB1bnNpZ25lZCB3b3Jkcy4KICBzdGF0aWMgaW50IF9pbmRleFNpemVUb0hhc2hNYXNrKGludCBpbmRleFNpemUpIHsKICAgIGludCBpbmRleEJpdHMgPSBpbmRleFNpemUuYml0TGVuZ3RoIC0gMjsKICAgIHJldHVybiBpbnRlcm5hbC5pczY0Qml0CiAgICAgICAgPyAoMSA8PCAoMzIgLSBpbmRleEJpdHMpKSAtIDEKICAgICAgICA6ICgxIDw8ICgzMCAtIGluZGV4Qml0cykpIC0gMTsKICB9CgogIHN0YXRpYyBpbnQgX2hhc2hQYXR0ZXJuKGludCBmdWxsSGFzaCwgaW50IGhhc2hNYXNrLCBpbnQgc2l6ZSkgewogICAgZmluYWwgaW50IG1hc2tlZEhhc2ggPSBmdWxsSGFzaCAmIGhhc2hNYXNrOwogICAgLy8gVE9ETyhrb2RhKTogQ29uc2lkZXIga2VlcGluZyBiaXQgbGVuZ3RoIGFuZCB1c2UgbGVmdCBzaGlmdC4KICAgIHJldHVybiAobWFza2VkSGFzaCA9PSAwKSA/IChzaXplID4+IDEpIDogbWFza2VkSGFzaCAqIChzaXplID4+IDEpOwogIH0KCiAgLy8gTGluZWFyIHByb2JpbmcuCiAgc3RhdGljIGludCBfZmlyc3RQcm9iZShpbnQgZnVsbEhhc2gsIGludCBzaXplTWFzaykgewogICAgZmluYWwgaW50IGkgPSBmdWxsSGFzaCAmIHNpemVNYXNrOwogICAgLy8gTGlnaHQsIGZhc3Qgc2h1ZmZsZSB0byBtaXRpZ2F0ZSBiYWQgaGFzaENvZGUgKGUuZy4sIHNlcXVlbnRpYWwpLgogICAgcmV0dXJuICgoaSA8PCAxKSArIGkpICYgc2l6ZU1hc2s7CiAgfQoKICBzdGF0aWMgaW50IF9uZXh0UHJvYmUoaW50IGksIGludCBzaXplTWFzaykgPT4gKGkgKyAxKSAmIHNpemVNYXNrOwoKICAvLyBBIHNlbGYtbG9vcCBpcyB1c2VkIHRvIG1hcmsgYSBkZWxldGVkIGtleSBvciB2YWx1ZS4KICBzdGF0aWMgYm9vbCBfaXNEZWxldGVkKExpc3QgZGF0YSwgT2JqZWN0IGtleU9yVmFsdWUpID0+CiAgICAgIGlkZW50aWNhbChrZXlPclZhbHVlLCBkYXRhKTsKICBzdGF0aWMgdm9pZCBfc2V0RGVsZXRlZEF0KExpc3QgZGF0YSwgaW50IGQpIHsKICAgIGRhdGFbZF0gPSBkYXRhOwogIH0KCiAgLy8gQ29uY3VycmVudCBtb2RpZmljYXRpb24gZGV0ZWN0aW9uIHJlbGllcyBvbiB0aGlzIGNoZWNrc3VtIG1vbm90b25pY2FsbHkKICAvLyBpbmNyZWFzaW5nIGJldHdlZW4gcmVhbGxvY2F0aW9ucyBvZiBfZGF0YS4KICBpbnQgZ2V0IF9jaGVja1N1bSA9PiBfdXNlZERhdGEgKyBfZGVsZXRlZEtleXM7CiAgYm9vbCBfaXNNb2RpZmllZFNpbmNlKExpc3Qgb2xkRGF0YSwgaW50IG9sZENoZWNrU3VtKSA9PgogICAgICAhaWRlbnRpY2FsKF9kYXRhLCBvbGREYXRhKSB8fCAoX2NoZWNrU3VtICE9IG9sZENoZWNrU3VtKTsKCiAgaW50IGdldCBsZW5ndGg7Cn0KCmNsYXNzIF9PcGVyYXRvckVxdWFsc0FuZEhhc2hDb2RlIHsKICBpbnQgX2hhc2hDb2RlKGUpID0+IGUuaGFzaENvZGU7CiAgYm9vbCBfZXF1YWxzKGUxLCBlMikgPT4gZTEgPT0gZTI7Cn0KCmNsYXNzIF9JZGVudGljYWxBbmRJZGVudGl0eUhhc2hDb2RlIHsKICBpbnQgX2hhc2hDb2RlKGUpID0+IGlkZW50aXR5SGFzaENvZGUoZSk7CiAgYm9vbCBfZXF1YWxzKGUxLCBlMikgPT4gaWRlbnRpY2FsKGUxLCBlMik7Cn0KCi8vIFZNLWludGVybmFsaXplZCBpbXBsZW1lbnRhdGlvbiBvZiBhIGRlZmF1bHQtY29uc3RydWN0ZWQgTGlua2VkSGFzaE1hcC4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfSW50ZXJuYWxMaW5rZWRIYXNoTWFwPEssIFY+IGV4dGVuZHMgX0hhc2hWTUJhc2UKICAgIHdpdGgKICAgICAgICBNYXBNaXhpbjxLLCBWPiwKICAgICAgICBfTGlua2VkSGFzaE1hcE1peGluPEssIFY+LAogICAgICAgIF9IYXNoQmFzZSwKICAgICAgICBfT3BlcmF0b3JFcXVhbHNBbmRIYXNoQ29kZQogICAgaW1wbGVtZW50cyBMaW5rZWRIYXNoTWFwPEssIFY+IHsKICBfSW50ZXJuYWxMaW5rZWRIYXNoTWFwKCkgewogICAgX2luZGV4ID0gbmV3IFVpbnQzMkxpc3QoX0hhc2hCYXNlLl9JTklUSUFMX0lOREVYX1NJWkUpOwogICAgX2hhc2hNYXNrID0gX0hhc2hCYXNlLl9pbmRleFNpemVUb0hhc2hNYXNrKF9IYXNoQmFzZS5fSU5JVElBTF9JTkRFWF9TSVpFKTsKICAgIF9kYXRhID0gbmV3IExpc3QoX0hhc2hCYXNlLl9JTklUSUFMX0lOREVYX1NJWkUpOwogICAgX3VzZWREYXRhID0gMDsKICAgIF9kZWxldGVkS2V5cyA9IDA7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBfTGlua2VkSGFzaE1hcE1peGluPEssIFY+IGltcGxlbWVudHMgX0hhc2hCYXNlIHsKICBpbnQgX2hhc2hDb2RlKGUpOwogIGJvb2wgX2VxdWFscyhlMSwgZTIpOwogIGludCBnZXQgX2NoZWNrU3VtOwogIGJvb2wgX2lzTW9kaWZpZWRTaW5jZShMaXN0IG9sZERhdGEsIGludCBvbGRDaGVja1N1bSk7CgogIGludCBnZXQgbGVuZ3RoID0+IChfdXNlZERhdGEgPj4gMSkgLSBfZGVsZXRlZEtleXM7CiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBsZW5ndGggPT0gMDsKICBib29sIGdldCBpc05vdEVtcHR5ID0+ICFpc0VtcHR5OwoKICB2b2lkIF9yZWhhc2goKSB7CiAgICBpZiAoKF9kZWxldGVkS2V5cyA8PCAyKSA+IF91c2VkRGF0YSkgewogICAgICAvLyBUT0RPKGtvZGEpOiBDb25zaWRlciBzaHJpbmtpbmcuCiAgICAgIC8vIFRPRE8oa29kYSk6IENvbnNpZGVyIGluLXBsYWNlIGNvbXBhY3Rpb24gYW5kIG1vcmUgY29zdGx5IENNRSBjaGVjay4KICAgICAgX2luaXQoX2luZGV4Lmxlbmd0aCwgX2hhc2hNYXNrLCBfZGF0YSwgX3VzZWREYXRhKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFRPRE8oa29kYSk6IFN1cHBvcnQgMzItPjY0IGJpdCB0cmFuc2l0aW9uIChhbmQgYWRqdXN0IF9oYXNoTWFzaykuCiAgICAgIF9pbml0KF9pbmRleC5sZW5ndGggPDwgMSwgX2hhc2hNYXNrID4+IDEsIF9kYXRhLCBfdXNlZERhdGEpOwogICAgfQogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIGlmICghaXNFbXB0eSkgewogICAgICBfaW5pdChfSGFzaEJhc2UuX0lOSVRJQUxfSU5ERVhfU0laRSwgX2hhc2hNYXNrLCBudWxsLCAwKTsKICAgIH0KICB9CgogIC8vIEFsbG9jYXRlIG5ldyBfaW5kZXggYW5kIF9kYXRhLCBhbmQgb3B0aW9uYWxseSBjb3B5IGV4aXN0aW5nIGNvbnRlbnRzLgogIHZvaWQgX2luaXQoaW50IHNpemUsIGludCBoYXNoTWFzaywgTGlzdCBvbGREYXRhLCBpbnQgb2xkVXNlZCkgewogICAgYXNzZXJ0KHNpemUgJiAoc2l6ZSAtIDEpID09IDApOwogICAgYXNzZXJ0KF9IYXNoQmFzZS5fVU5VU0VEX1BBSVIgPT0gMCk7CiAgICBfaW5kZXggPSBuZXcgVWludDMyTGlzdChzaXplKTsKICAgIF9oYXNoTWFzayA9IGhhc2hNYXNrOwogICAgX2RhdGEgPSBuZXcgTGlzdChzaXplKTsKICAgIF91c2VkRGF0YSA9IDA7CiAgICBfZGVsZXRlZEtleXMgPSAwOwogICAgaWYgKG9sZERhdGEgIT0gbnVsbCkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9sZFVzZWQ7IGkgKz0gMikgewogICAgICAgIHZhciBrZXkgPSBvbGREYXRhW2ldOwogICAgICAgIGlmICghX0hhc2hCYXNlLl9pc0RlbGV0ZWQob2xkRGF0YSwga2V5KSkgewogICAgICAgICAgLy8gVE9ETyhrb2RhKTogV2hpbGUgdGhlcmUgYXJlIGVub3VnaCBoYXNoIGJpdHMsIGF2b2lkIGhhc2hDb2RlIGNhbGxzLgogICAgICAgICAgdGhpc1trZXldID0gb2xkRGF0YVtpICsgMV07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgW19yZWhhc2hPYmplY3RzXSAoc2VlIGFib3ZlKS4KICB2b2lkIF9yZWdlbmVyYXRlSW5kZXgoKSB7CiAgICBfaW5kZXggPSBuZXcgVWludDMyTGlzdChfZGF0YS5sZW5ndGgpOwogICAgYXNzZXJ0KF9oYXNoTWFzayA9PSAwKTsKICAgIF9oYXNoTWFzayA9IF9IYXNoQmFzZS5faW5kZXhTaXplVG9IYXNoTWFzayhfaW5kZXgubGVuZ3RoKTsKICAgIGZpbmFsIGludCB0bXBVc2VkID0gX3VzZWREYXRhOwogICAgX3VzZWREYXRhID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG1wVXNlZDsgaSArPSAyKSB7CiAgICAgIHRoaXNbX2RhdGFbaV1dID0gX2RhdGFbaSArIDFdOwogICAgfQogIH0KCiAgdm9pZCBfaW5zZXJ0KEsga2V5LCBWIHZhbHVlLCBpbnQgaGFzaFBhdHRlcm4sIGludCBpKSB7CiAgICBpZiAoX3VzZWREYXRhID09IF9kYXRhLmxlbmd0aCkgewogICAgICBfcmVoYXNoKCk7CiAgICAgIHRoaXNba2V5XSA9IHZhbHVlOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KDEgPD0gaGFzaFBhdHRlcm4gJiYgaGFzaFBhdHRlcm4gPCAoMSA8PCAzMikpOwogICAgICBmaW5hbCBpbnQgaW5kZXggPSBfdXNlZERhdGEgPj4gMTsKICAgICAgYXNzZXJ0KChpbmRleCAmIGhhc2hQYXR0ZXJuKSA9PSAwKTsKICAgICAgX2luZGV4W2ldID0gaGFzaFBhdHRlcm4gfCBpbmRleDsKICAgICAgX2RhdGFbX3VzZWREYXRhKytdID0ga2V5OwogICAgICBfZGF0YVtfdXNlZERhdGErK10gPSB2YWx1ZTsKICAgIH0KICB9CgogIC8vIElmIGtleSBpcyBwcmVzZW50LCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgdmFsdWUgaW4gX2RhdGEsIGVsc2UgcmV0dXJucwogIC8vIHRoZSBuZWdhdGVkIGluc2VydGlvbiBwb2ludCBpbiBfaW5kZXguCiAgaW50IF9maW5kVmFsdWVPckluc2VydFBvaW50KEsga2V5LCBpbnQgZnVsbEhhc2gsIGludCBoYXNoUGF0dGVybiwgaW50IHNpemUpIHsKICAgIGZpbmFsIGludCBzaXplTWFzayA9IHNpemUgLSAxOwogICAgZmluYWwgaW50IG1heEVudHJpZXMgPSBzaXplID4+IDE7CiAgICBpbnQgaSA9IF9IYXNoQmFzZS5fZmlyc3RQcm9iZShmdWxsSGFzaCwgc2l6ZU1hc2spOwogICAgaW50IGZpcnN0RGVsZXRlZCA9IC0xOwogICAgaW50IHBhaXIgPSBfaW5kZXhbaV07CiAgICB3aGlsZSAocGFpciAhPSBfSGFzaEJhc2UuX1VOVVNFRF9QQUlSKSB7CiAgICAgIGlmIChwYWlyID09IF9IYXNoQmFzZS5fREVMRVRFRF9QQUlSKSB7CiAgICAgICAgaWYgKGZpcnN0RGVsZXRlZCA8IDApIHsKICAgICAgICAgIGZpcnN0RGVsZXRlZCA9IGk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZpbmFsIGludCBlbnRyeSA9IGhhc2hQYXR0ZXJuIF4gcGFpcjsKICAgICAgICBpZiAoZW50cnkgPCBtYXhFbnRyaWVzKSB7CiAgICAgICAgICBmaW5hbCBpbnQgZCA9IGVudHJ5IDw8IDE7CiAgICAgICAgICBpZiAoX2VxdWFscyhrZXksIF9kYXRhW2RdKSkgewogICAgICAgICAgICByZXR1cm4gZCArIDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGkgPSBfSGFzaEJhc2UuX25leHRQcm9iZShpLCBzaXplTWFzayk7CiAgICAgIHBhaXIgPSBfaW5kZXhbaV07CiAgICB9CiAgICByZXR1cm4gZmlyc3REZWxldGVkID49IDAgPyAtZmlyc3REZWxldGVkIDogLWk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShLIGtleSwgViB2YWx1ZSkgewogICAgZmluYWwgaW50IHNpemUgPSBfaW5kZXgubGVuZ3RoOwogICAgZmluYWwgaW50IGZ1bGxIYXNoID0gX2hhc2hDb2RlKGtleSk7CiAgICBmaW5hbCBpbnQgaGFzaFBhdHRlcm4gPSBfSGFzaEJhc2UuX2hhc2hQYXR0ZXJuKGZ1bGxIYXNoLCBfaGFzaE1hc2ssIHNpemUpOwogICAgZmluYWwgaW50IGQgPSBfZmluZFZhbHVlT3JJbnNlcnRQb2ludChrZXksIGZ1bGxIYXNoLCBoYXNoUGF0dGVybiwgc2l6ZSk7CiAgICBpZiAoZCA+IDApIHsKICAgICAgX2RhdGFbZF0gPSB2YWx1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGZpbmFsIGludCBpID0gLWQ7CiAgICAgIF9pbnNlcnQoa2V5LCB2YWx1ZSwgaGFzaFBhdHRlcm4sIGkpOwogICAgfQogIH0KCiAgViBwdXRJZkFic2VudChLIGtleSwgViBpZkFic2VudCgpKSB7CiAgICBmaW5hbCBpbnQgc2l6ZSA9IF9pbmRleC5sZW5ndGg7CiAgICBmaW5hbCBpbnQgZnVsbEhhc2ggPSBfaGFzaENvZGUoa2V5KTsKICAgIGZpbmFsIGludCBoYXNoUGF0dGVybiA9IF9IYXNoQmFzZS5faGFzaFBhdHRlcm4oZnVsbEhhc2gsIF9oYXNoTWFzaywgc2l6ZSk7CiAgICBmaW5hbCBpbnQgZCA9IF9maW5kVmFsdWVPckluc2VydFBvaW50KGtleSwgZnVsbEhhc2gsIGhhc2hQYXR0ZXJuLCBzaXplKTsKICAgIGlmIChkID4gMCkgewogICAgICByZXR1cm4gX2RhdGFbZF07CiAgICB9CiAgICAvLyAnaWZBYnNlbnQnIGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBtYXAuCiAgICBMaXN0IG9sZERhdGEgPSBfZGF0YTsKICAgIGludCBvbGRDaGVja1N1bSA9IF9jaGVja1N1bTsKICAgIFYgdmFsdWUgPSBpZkFic2VudCgpOwogICAgaWYgKF9pc01vZGlmaWVkU2luY2Uob2xkRGF0YSwgb2xkQ2hlY2tTdW0pKSB7CiAgICAgIHRoaXNba2V5XSA9IHZhbHVlOwogICAgfSBlbHNlIHsKICAgICAgZmluYWwgaW50IGkgPSAtZDsKICAgICAgX2luc2VydChrZXksIHZhbHVlLCBoYXNoUGF0dGVybiwgaSk7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBWIHJlbW92ZShPYmplY3Qga2V5KSB7CiAgICBmaW5hbCBpbnQgc2l6ZSA9IF9pbmRleC5sZW5ndGg7CiAgICBmaW5hbCBpbnQgc2l6ZU1hc2sgPSBzaXplIC0gMTsKICAgIGZpbmFsIGludCBtYXhFbnRyaWVzID0gc2l6ZSA+PiAxOwogICAgZmluYWwgaW50IGZ1bGxIYXNoID0gX2hhc2hDb2RlKGtleSk7CiAgICBmaW5hbCBpbnQgaGFzaFBhdHRlcm4gPSBfSGFzaEJhc2UuX2hhc2hQYXR0ZXJuKGZ1bGxIYXNoLCBfaGFzaE1hc2ssIHNpemUpOwogICAgaW50IGkgPSBfSGFzaEJhc2UuX2ZpcnN0UHJvYmUoZnVsbEhhc2gsIHNpemVNYXNrKTsKICAgIGludCBwYWlyID0gX2luZGV4W2ldOwogICAgd2hpbGUgKHBhaXIgIT0gX0hhc2hCYXNlLl9VTlVTRURfUEFJUikgewogICAgICBpZiAocGFpciAhPSBfSGFzaEJhc2UuX0RFTEVURURfUEFJUikgewogICAgICAgIGZpbmFsIGludCBlbnRyeSA9IGhhc2hQYXR0ZXJuIF4gcGFpcjsKICAgICAgICBpZiAoZW50cnkgPCBtYXhFbnRyaWVzKSB7CiAgICAgICAgICBmaW5hbCBpbnQgZCA9IGVudHJ5IDw8IDE7CiAgICAgICAgICBpZiAoX2VxdWFscyhrZXksIF9kYXRhW2RdKSkgewogICAgICAgICAgICBfaW5kZXhbaV0gPSBfSGFzaEJhc2UuX0RFTEVURURfUEFJUjsKICAgICAgICAgICAgX0hhc2hCYXNlLl9zZXREZWxldGVkQXQoX2RhdGEsIGQpOwogICAgICAgICAgICBWIHZhbHVlID0gX2RhdGFbZCArIDFdOwogICAgICAgICAgICBfSGFzaEJhc2UuX3NldERlbGV0ZWRBdChfZGF0YSwgZCArIDEpOwogICAgICAgICAgICArK19kZWxldGVkS2V5czsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpID0gX0hhc2hCYXNlLl9uZXh0UHJvYmUoaSwgc2l6ZU1hc2spOwogICAgICBwYWlyID0gX2luZGV4W2ldOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLyBJZiBrZXkgaXMgYWJzZW50LCByZXR1cm4gX2RhdGEgKHdoaWNoIGlzIG5ldmVyIGEgdmFsdWUpLgogIE9iamVjdCBfZ2V0VmFsdWVPckRhdGEoT2JqZWN0IGtleSkgewogICAgZmluYWwgaW50IHNpemUgPSBfaW5kZXgubGVuZ3RoOwogICAgZmluYWwgaW50IHNpemVNYXNrID0gc2l6ZSAtIDE7CiAgICBmaW5hbCBpbnQgbWF4RW50cmllcyA9IHNpemUgPj4gMTsKICAgIGZpbmFsIGludCBmdWxsSGFzaCA9IF9oYXNoQ29kZShrZXkpOwogICAgZmluYWwgaW50IGhhc2hQYXR0ZXJuID0gX0hhc2hCYXNlLl9oYXNoUGF0dGVybihmdWxsSGFzaCwgX2hhc2hNYXNrLCBzaXplKTsKICAgIGludCBpID0gX0hhc2hCYXNlLl9maXJzdFByb2JlKGZ1bGxIYXNoLCBzaXplTWFzayk7CiAgICBpbnQgcGFpciA9IF9pbmRleFtpXTsKICAgIHdoaWxlIChwYWlyICE9IF9IYXNoQmFzZS5fVU5VU0VEX1BBSVIpIHsKICAgICAgaWYgKHBhaXIgIT0gX0hhc2hCYXNlLl9ERUxFVEVEX1BBSVIpIHsKICAgICAgICBmaW5hbCBpbnQgZW50cnkgPSBoYXNoUGF0dGVybiBeIHBhaXI7CiAgICAgICAgaWYgKGVudHJ5IDwgbWF4RW50cmllcykgewogICAgICAgICAgZmluYWwgaW50IGQgPSBlbnRyeSA8PCAxOwogICAgICAgICAgaWYgKF9lcXVhbHMoa2V5LCBfZGF0YVtkXSkpIHsKICAgICAgICAgICAgcmV0dXJuIF9kYXRhW2QgKyAxXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaSA9IF9IYXNoQmFzZS5fbmV4dFByb2JlKGksIHNpemVNYXNrKTsKICAgICAgcGFpciA9IF9pbmRleFtpXTsKICAgIH0KICAgIHJldHVybiBfZGF0YTsKICB9CgogIGJvb2wgY29udGFpbnNLZXkoT2JqZWN0IGtleSkgPT4gIWlkZW50aWNhbChfZGF0YSwgX2dldFZhbHVlT3JEYXRhKGtleSkpOwoKICBWIG9wZXJhdG9yIFtdKE9iamVjdCBrZXkpIHsKICAgIHZhciB2ID0gX2dldFZhbHVlT3JEYXRhKGtleSk7CiAgICByZXR1cm4gaWRlbnRpY2FsKF9kYXRhLCB2KSA/IG51bGwgOiBpbnRlcm5hbC51bnNhZmVDYXN0PFY+KHYpOwogIH0KCiAgYm9vbCBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgewogICAgZm9yICh2YXIgdiBpbiB2YWx1ZXMpIHsKICAgICAgLy8gU3BlYy4gc2F5cyB0aGlzIHNob3VsZCBhbHdheXMgdXNlICI9PSIsIGFsc28gZm9yIGlkZW50aXR5IG1hcHMsIGV0Yy4KICAgICAgaWYgKHYgPT0gdmFsdWUpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihLIGtleSwgViB2YWx1ZSkpIHsKICAgIHZhciBraSA9IGtleXMuaXRlcmF0b3I7CiAgICB2YXIgdmkgPSB2YWx1ZXMuaXRlcmF0b3I7CiAgICB3aGlsZSAoa2kubW92ZU5leHQoKSkgewogICAgICB2aS5tb3ZlTmV4dCgpOwogICAgICBmKGtpLmN1cnJlbnQsIHZpLmN1cnJlbnQpOwogICAgfQogIH0KCiAgSXRlcmFibGU8Sz4gZ2V0IGtleXMgPT4KICAgICAgbmV3IF9Db21wYWN0SXRlcmFibGU8Sz4odGhpcywgX2RhdGEsIF91c2VkRGF0YSwgLTIsIDIpOwogIEl0ZXJhYmxlPFY+IGdldCB2YWx1ZXMgPT4KICAgICAgbmV3IF9Db21wYWN0SXRlcmFibGU8Vj4odGhpcywgX2RhdGEsIF91c2VkRGF0YSwgLTEsIDIpOwp9CgpjbGFzcyBfQ29tcGFjdExpbmtlZElkZW50aXR5SGFzaE1hcDxLLCBWPiBleHRlbmRzIF9IYXNoRmllbGRCYXNlCiAgICB3aXRoCiAgICAgICAgTWFwTWl4aW48SywgVj4sCiAgICAgICAgX0xpbmtlZEhhc2hNYXBNaXhpbjxLLCBWPiwKICAgICAgICBfSGFzaEJhc2UsCiAgICAgICAgX0lkZW50aWNhbEFuZElkZW50aXR5SGFzaENvZGUKICAgIGltcGxlbWVudHMgTGlua2VkSGFzaE1hcDxLLCBWPiB7CiAgX0NvbXBhY3RMaW5rZWRJZGVudGl0eUhhc2hNYXAoKSA6IHN1cGVyKF9IYXNoQmFzZS5fSU5JVElBTF9JTkRFWF9TSVpFKTsKfQoKY2xhc3MgX0NvbXBhY3RMaW5rZWRDdXN0b21IYXNoTWFwPEssIFY+IGV4dGVuZHMgX0hhc2hGaWVsZEJhc2UKICAgIHdpdGggTWFwTWl4aW48SywgVj4sIF9MaW5rZWRIYXNoTWFwTWl4aW48SywgVj4sIF9IYXNoQmFzZQogICAgaW1wbGVtZW50cyBMaW5rZWRIYXNoTWFwPEssIFY+IHsKICBmaW5hbCBfZXF1YWxpdHk7CiAgZmluYWwgX2hhc2hlcjsKICBmaW5hbCBfdmFsaWRLZXk7CgogIC8vIFRPRE8oa29kYSk6IEFzayBnYnJhY2hhIHdoeSBJIGNhbm5vdCBoYXZlIGZpZWxkcyBfZXF1YWxzL19oYXNoQ29kZS4KICBpbnQgX2hhc2hDb2RlKGUpID0+IF9oYXNoZXIoZSk7CiAgYm9vbCBfZXF1YWxzKGUxLCBlMikgPT4gX2VxdWFsaXR5KGUxLCBlMik7CgogIGJvb2wgY29udGFpbnNLZXkoT2JqZWN0IG8pID0+IF92YWxpZEtleShvKSA/IHN1cGVyLmNvbnRhaW5zS2V5KG8pIDogZmFsc2U7CiAgViBvcGVyYXRvciBbXShPYmplY3QgbykgPT4gX3ZhbGlkS2V5KG8pID8gc3VwZXJbb10gOiBudWxsOwogIFYgcmVtb3ZlKE9iamVjdCBvKSA9PiBfdmFsaWRLZXkobykgPyBzdXBlci5yZW1vdmUobykgOiBudWxsOwoKICBfQ29tcGFjdExpbmtlZEN1c3RvbUhhc2hNYXAodGhpcy5fZXF1YWxpdHksIHRoaXMuX2hhc2hlciwgdmFsaWRLZXkpCiAgICAgIDogX3ZhbGlkS2V5ID0gKHZhbGlkS2V5ICE9IG51bGwpID8gdmFsaWRLZXkgOiBuZXcgX1R5cGVUZXN0PEs+KCkudGVzdCwKICAgICAgICBzdXBlcihfSGFzaEJhc2UuX0lOSVRJQUxfSU5ERVhfU0laRSk7Cn0KCi8vIEl0ZXJhdGVzIHRocm91Z2ggX2RhdGFbX29mZnNldCArIF9zdGVwXSwgX2RhdGFbX29mZnNldCArIDIqX3N0ZXBdLCAuLi4KLy8gYW5kIGNoZWNrcyBmb3IgY29uY3VycmVudCBtb2RpZmljYXRpb24uCmNsYXNzIF9Db21wYWN0SXRlcmFibGU8RT4gZXh0ZW5kcyBJdGVyYWJsZTxFPiB7CiAgZmluYWwgX0hhc2hCYXNlIF90YWJsZTsKICBmaW5hbCBMaXN0IF9kYXRhOwogIGZpbmFsIGludCBfbGVuOwogIGZpbmFsIGludCBfb2Zmc2V0OwogIGZpbmFsIGludCBfc3RlcDsKCiAgX0NvbXBhY3RJdGVyYWJsZSgKICAgICAgdGhpcy5fdGFibGUsIHRoaXMuX2RhdGEsIHRoaXMuX2xlbiwgdGhpcy5fb2Zmc2V0LCB0aGlzLl9zdGVwKTsKCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yID0+CiAgICAgIG5ldyBfQ29tcGFjdEl0ZXJhdG9yPEU+KF90YWJsZSwgX2RhdGEsIF9sZW4sIF9vZmZzZXQsIF9zdGVwKTsKCiAgaW50IGdldCBsZW5ndGggPT4gX3RhYmxlLmxlbmd0aDsKICBib29sIGdldCBpc0VtcHR5ID0+IGxlbmd0aCA9PSAwOwogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gIWlzRW1wdHk7Cn0KCmNsYXNzIF9Db21wYWN0SXRlcmF0b3I8RT4gaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7CiAgZmluYWwgX0hhc2hCYXNlIF90YWJsZTsKICBmaW5hbCBMaXN0IF9kYXRhOwogIGZpbmFsIGludCBfbGVuOwogIGludCBfb2Zmc2V0OwogIGZpbmFsIGludCBfc3RlcDsKICBmaW5hbCBpbnQgX2NoZWNrU3VtOwogIEUgY3VycmVudDsKCiAgX0NvbXBhY3RJdGVyYXRvcigKICAgICAgX0hhc2hCYXNlIHRhYmxlLCB0aGlzLl9kYXRhLCB0aGlzLl9sZW4sIHRoaXMuX29mZnNldCwgdGhpcy5fc3RlcCkKICAgICAgOiBfdGFibGUgPSB0YWJsZSwKICAgICAgICBfY2hlY2tTdW0gPSB0YWJsZS5fY2hlY2tTdW07CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBpZiAoX3RhYmxlLl9pc01vZGlmaWVkU2luY2UoX2RhdGEsIF9jaGVja1N1bSkpIHsKICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcihfdGFibGUpOwogICAgfQogICAgZG8gewogICAgICBfb2Zmc2V0ICs9IF9zdGVwOwogICAgfSB3aGlsZSAoX29mZnNldCA8IF9sZW4gJiYgX0hhc2hCYXNlLl9pc0RlbGV0ZWQoX2RhdGEsIF9kYXRhW19vZmZzZXRdKSk7CiAgICBpZiAoX29mZnNldCA8IF9sZW4pIHsKICAgICAgY3VycmVudCA9IGludGVybmFsLnVuc2FmZUNhc3Q8RT4oX2RhdGFbX29mZnNldF0pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGN1cnJlbnQgPSBudWxsOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQp9CgovLyBTZXQgaW1wbGVtZW50YXRpb24sIGFuYWxvZ291cyB0byBfQ29tcGFjdExpbmtlZEhhc2hNYXAuCmNsYXNzIF9Db21wYWN0TGlua2VkSGFzaFNldDxFPiBleHRlbmRzIF9IYXNoRmllbGRCYXNlCiAgICB3aXRoIF9IYXNoQmFzZSwgX09wZXJhdG9yRXF1YWxzQW5kSGFzaENvZGUsIFNldE1peGluPEU+CiAgICBpbXBsZW1lbnRzIExpbmtlZEhhc2hTZXQ8RT4gewogIF9Db21wYWN0TGlua2VkSGFzaFNldCgpIDogc3VwZXIoX0hhc2hCYXNlLl9JTklUSUFMX0lOREVYX1NJWkUgPj4gMSkgewogICAgYXNzZXJ0KF9IYXNoQmFzZS5fVU5VU0VEX1BBSVIgPT0gMCk7CiAgfQoKICBzdGF0aWMgU2V0PFI+IF9uZXdFbXB0eTxSPigpID0+IG5ldyBfQ29tcGFjdExpbmtlZEhhc2hTZXQ8Uj4oKTsKCiAgU2V0PFI+IGNhc3Q8Uj4oKSA9PiBTZXQuY2FzdEZyb208RSwgUj4odGhpcywgbmV3U2V0OiBfbmV3RW1wdHkpOwogIGludCBnZXQgbGVuZ3RoID0+IF91c2VkRGF0YSAtIF9kZWxldGVkS2V5czsKCiAgRSBnZXQgZmlyc3QgewogICAgZm9yIChpbnQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgX3VzZWREYXRhOyBvZmZzZXQrKykgewogICAgICBPYmplY3QgY3VycmVudCA9IF9kYXRhW29mZnNldF07CiAgICAgIGlmICghX0hhc2hCYXNlLl9pc0RlbGV0ZWQoX2RhdGEsIGN1cnJlbnQpKSB7CiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CiAgICAgIH0KICAgIH0KICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRSBnZXQgbGFzdCB7CiAgICBmb3IgKGludCBvZmZzZXQgPSBfdXNlZERhdGEgLSAxOyBvZmZzZXQgPj0gMDsgb2Zmc2V0LS0pIHsKICAgICAgT2JqZWN0IGN1cnJlbnQgPSBfZGF0YVtvZmZzZXRdOwogICAgICBpZiAoIV9IYXNoQmFzZS5faXNEZWxldGVkKF9kYXRhLCBjdXJyZW50KSkgewogICAgICAgIHJldHVybiBjdXJyZW50OwogICAgICB9CiAgICB9CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIHZvaWQgX3JlaGFzaCgpIHsKICAgIGlmICgoX2RlbGV0ZWRLZXlzIDw8IDEpID4gX3VzZWREYXRhKSB7CiAgICAgIF9pbml0KF9pbmRleC5sZW5ndGgsIF9oYXNoTWFzaywgX2RhdGEsIF91c2VkRGF0YSk7CiAgICB9IGVsc2UgewogICAgICBfaW5pdChfaW5kZXgubGVuZ3RoIDw8IDEsIF9oYXNoTWFzayA+PiAxLCBfZGF0YSwgX3VzZWREYXRhKTsKICAgIH0KICB9CgogIHZvaWQgY2xlYXIoKSB7CiAgICBpZiAoIWlzRW1wdHkpIHsKICAgICAgX2luaXQoX0hhc2hCYXNlLl9JTklUSUFMX0lOREVYX1NJWkUsIF9oYXNoTWFzaywgbnVsbCwgMCk7CiAgICB9CiAgfQoKICB2b2lkIF9pbml0KGludCBzaXplLCBpbnQgaGFzaE1hc2ssIExpc3Qgb2xkRGF0YSwgaW50IG9sZFVzZWQpIHsKICAgIF9pbmRleCA9IG5ldyBVaW50MzJMaXN0KHNpemUpOwogICAgX2hhc2hNYXNrID0gaGFzaE1hc2s7CiAgICBfZGF0YSA9IG5ldyBMaXN0KHNpemUgPj4gMSk7CiAgICBfdXNlZERhdGEgPSAwOwogICAgX2RlbGV0ZWRLZXlzID0gMDsKICAgIGlmIChvbGREYXRhICE9IG51bGwpIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRVc2VkOyBpICs9IDEpIHsKICAgICAgICB2YXIga2V5ID0gb2xkRGF0YVtpXTsKICAgICAgICBpZiAoIV9IYXNoQmFzZS5faXNEZWxldGVkKG9sZERhdGEsIGtleSkpIHsKICAgICAgICAgIGFkZChrZXkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgYm9vbCBhZGQoRSBrZXkpIHsKICAgIGZpbmFsIGludCBzaXplID0gX2luZGV4Lmxlbmd0aDsKICAgIGZpbmFsIGludCBzaXplTWFzayA9IHNpemUgLSAxOwogICAgZmluYWwgaW50IG1heEVudHJpZXMgPSBzaXplID4+IDE7CiAgICBmaW5hbCBpbnQgZnVsbEhhc2ggPSBfaGFzaENvZGUoa2V5KTsKICAgIGZpbmFsIGludCBoYXNoUGF0dGVybiA9IF9IYXNoQmFzZS5faGFzaFBhdHRlcm4oZnVsbEhhc2gsIF9oYXNoTWFzaywgc2l6ZSk7CiAgICBpbnQgaSA9IF9IYXNoQmFzZS5fZmlyc3RQcm9iZShmdWxsSGFzaCwgc2l6ZU1hc2spOwogICAgaW50IGZpcnN0RGVsZXRlZCA9IC0xOwogICAgaW50IHBhaXIgPSBfaW5kZXhbaV07CiAgICB3aGlsZSAocGFpciAhPSBfSGFzaEJhc2UuX1VOVVNFRF9QQUlSKSB7CiAgICAgIGlmIChwYWlyID09IF9IYXNoQmFzZS5fREVMRVRFRF9QQUlSKSB7CiAgICAgICAgaWYgKGZpcnN0RGVsZXRlZCA8IDApIHsKICAgICAgICAgIGZpcnN0RGVsZXRlZCA9IGk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZpbmFsIGludCBkID0gaGFzaFBhdHRlcm4gXiBwYWlyOwogICAgICAgIGlmIChkIDwgbWF4RW50cmllcyAmJiBfZXF1YWxzKGtleSwgX2RhdGFbZF0pKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIGkgPSBfSGFzaEJhc2UuX25leHRQcm9iZShpLCBzaXplTWFzayk7CiAgICAgIHBhaXIgPSBfaW5kZXhbaV07CiAgICB9CiAgICBpZiAoX3VzZWREYXRhID09IF9kYXRhLmxlbmd0aCkgewogICAgICBfcmVoYXNoKCk7CiAgICAgIGFkZChrZXkpOwogICAgfSBlbHNlIHsKICAgICAgZmluYWwgaW50IGluc2VydGlvblBvaW50ID0gKGZpcnN0RGVsZXRlZCA+PSAwKSA/IGZpcnN0RGVsZXRlZCA6IGk7CiAgICAgIGFzc2VydCgxIDw9IGhhc2hQYXR0ZXJuICYmIGhhc2hQYXR0ZXJuIDwgKDEgPDwgMzIpKTsKICAgICAgYXNzZXJ0KChoYXNoUGF0dGVybiAmIF91c2VkRGF0YSkgPT0gMCk7CiAgICAgIF9pbmRleFtpbnNlcnRpb25Qb2ludF0gPSBoYXNoUGF0dGVybiB8IF91c2VkRGF0YTsKICAgICAgX2RhdGFbX3VzZWREYXRhKytdID0ga2V5OwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvLyBJZiBrZXkgaXMgYWJzZW50LCByZXR1cm4gX2RhdGEgKHdoaWNoIGlzIG5ldmVyIGEgdmFsdWUpLgogIE9iamVjdCBfZ2V0S2V5T3JEYXRhKE9iamVjdCBrZXkpIHsKICAgIGZpbmFsIGludCBzaXplID0gX2luZGV4Lmxlbmd0aDsKICAgIGZpbmFsIGludCBzaXplTWFzayA9IHNpemUgLSAxOwogICAgZmluYWwgaW50IG1heEVudHJpZXMgPSBzaXplID4+IDE7CiAgICBmaW5hbCBpbnQgZnVsbEhhc2ggPSBfaGFzaENvZGUoa2V5KTsKICAgIGZpbmFsIGludCBoYXNoUGF0dGVybiA9IF9IYXNoQmFzZS5faGFzaFBhdHRlcm4oZnVsbEhhc2gsIF9oYXNoTWFzaywgc2l6ZSk7CiAgICBpbnQgaSA9IF9IYXNoQmFzZS5fZmlyc3RQcm9iZShmdWxsSGFzaCwgc2l6ZU1hc2spOwogICAgaW50IHBhaXIgPSBfaW5kZXhbaV07CiAgICB3aGlsZSAocGFpciAhPSBfSGFzaEJhc2UuX1VOVVNFRF9QQUlSKSB7CiAgICAgIGlmIChwYWlyICE9IF9IYXNoQmFzZS5fREVMRVRFRF9QQUlSKSB7CiAgICAgICAgZmluYWwgaW50IGQgPSBoYXNoUGF0dGVybiBeIHBhaXI7CiAgICAgICAgaWYgKGQgPCBtYXhFbnRyaWVzICYmIF9lcXVhbHMoa2V5LCBfZGF0YVtkXSkpIHsKICAgICAgICAgIHJldHVybiBfZGF0YVtkXTsgLy8gTm90ZTogTXVzdCByZXR1cm4gdGhlIGV4aXN0aW5nIGtleS4KICAgICAgICB9CiAgICAgIH0KICAgICAgaSA9IF9IYXNoQmFzZS5fbmV4dFByb2JlKGksIHNpemVNYXNrKTsKICAgICAgcGFpciA9IF9pbmRleFtpXTsKICAgIH0KICAgIHJldHVybiBfZGF0YTsKICB9CgogIEUgbG9va3VwKE9iamVjdCBrZXkpIHsKICAgIHZhciBrID0gX2dldEtleU9yRGF0YShrZXkpOwogICAgcmV0dXJuIGlkZW50aWNhbChfZGF0YSwgaykgPyBudWxsIDogazsKICB9CgogIGJvb2wgY29udGFpbnMoT2JqZWN0IGtleSkgPT4gIWlkZW50aWNhbChfZGF0YSwgX2dldEtleU9yRGF0YShrZXkpKTsKCiAgYm9vbCByZW1vdmUoT2JqZWN0IGtleSkgewogICAgZmluYWwgaW50IHNpemUgPSBfaW5kZXgubGVuZ3RoOwogICAgZmluYWwgaW50IHNpemVNYXNrID0gc2l6ZSAtIDE7CiAgICBmaW5hbCBpbnQgbWF4RW50cmllcyA9IHNpemUgPj4gMTsKICAgIGZpbmFsIGludCBmdWxsSGFzaCA9IF9oYXNoQ29kZShrZXkpOwogICAgZmluYWwgaW50IGhhc2hQYXR0ZXJuID0gX0hhc2hCYXNlLl9oYXNoUGF0dGVybihmdWxsSGFzaCwgX2hhc2hNYXNrLCBzaXplKTsKICAgIGludCBpID0gX0hhc2hCYXNlLl9maXJzdFByb2JlKGZ1bGxIYXNoLCBzaXplTWFzayk7CiAgICBpbnQgcGFpciA9IF9pbmRleFtpXTsKICAgIHdoaWxlIChwYWlyICE9IF9IYXNoQmFzZS5fVU5VU0VEX1BBSVIpIHsKICAgICAgaWYgKHBhaXIgIT0gX0hhc2hCYXNlLl9ERUxFVEVEX1BBSVIpIHsKICAgICAgICBmaW5hbCBpbnQgZCA9IGhhc2hQYXR0ZXJuIF4gcGFpcjsKICAgICAgICBpZiAoZCA8IG1heEVudHJpZXMgJiYgX2VxdWFscyhrZXksIF9kYXRhW2RdKSkgewogICAgICAgICAgX2luZGV4W2ldID0gX0hhc2hCYXNlLl9ERUxFVEVEX1BBSVI7CiAgICAgICAgICBfSGFzaEJhc2UuX3NldERlbGV0ZWRBdChfZGF0YSwgZCk7CiAgICAgICAgICArK19kZWxldGVkS2V5czsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBpID0gX0hhc2hCYXNlLl9uZXh0UHJvYmUoaSwgc2l6ZU1hc2spOwogICAgICBwYWlyID0gX2luZGV4W2ldOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yID0+CiAgICAgIG5ldyBfQ29tcGFjdEl0ZXJhdG9yPEU+KHRoaXMsIF9kYXRhLCBfdXNlZERhdGEsIC0xLCAxKTsKCiAgLy8gUmV0dXJucyBhIHNldCBvZiB0aGUgc2FtZSB0eXBlLCBhbHRob3VnaCB0aGlzCiAgLy8gaXMgbm90IHJlcXVpcmVkIGJ5IHRoZSBzcGVjLiAoRm9yIGluc3RhbmNlLCBhbHdheXMgdXNpbmcgYW4gaWRlbnRpdHkgc2V0CiAgLy8gd291bGQgYmUgdGVjaG5pY2FsbHkgY29ycmVjdCwgYWxiZWl0IHN1cnByaXNpbmcuKQogIFNldDxFPiB0b1NldCgpID0+IG5ldyBfQ29tcGFjdExpbmtlZEhhc2hTZXQ8RT4oKS4uYWRkQWxsKHRoaXMpOwoKICAvLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgW19yZWhhc2hPYmplY3RzXSAoc2VlIGFib3ZlKS4KICB2b2lkIF9yZWdlbmVyYXRlSW5kZXgoKSB7CiAgICBfcmVoYXNoKCk7CiAgfQp9CgpjbGFzcyBfQ29tcGFjdExpbmtlZElkZW50aXR5SGFzaFNldDxFPiBleHRlbmRzIF9Db21wYWN0TGlua2VkSGFzaFNldDxFPgogICAgd2l0aCBfSWRlbnRpY2FsQW5kSWRlbnRpdHlIYXNoQ29kZSB7CiAgU2V0PEU+IHRvU2V0KCkgPT4gbmV3IF9Db21wYWN0TGlua2VkSWRlbnRpdHlIYXNoU2V0PEU+KCkuLmFkZEFsbCh0aGlzKTsKCiAgc3RhdGljIFNldDxSPiBfbmV3RW1wdHk8Uj4oKSA9PiBuZXcgX0NvbXBhY3RMaW5rZWRJZGVudGl0eUhhc2hTZXQ8Uj4oKTsKCiAgU2V0PFI+IGNhc3Q8Uj4oKSA9PiBTZXQuY2FzdEZyb208RSwgUj4odGhpcywgbmV3U2V0OiBfbmV3RW1wdHkpOwp9CgpjbGFzcyBfQ29tcGFjdExpbmtlZEN1c3RvbUhhc2hTZXQ8RT4gZXh0ZW5kcyBfQ29tcGFjdExpbmtlZEhhc2hTZXQ8RT4gewogIGZpbmFsIF9lcXVhbGl0eTsKICBmaW5hbCBfaGFzaGVyOwogIGZpbmFsIF92YWxpZEtleTsKCiAgaW50IF9oYXNoQ29kZShlKSA9PiBfaGFzaGVyKGUpOwogIGJvb2wgX2VxdWFscyhlMSwgZTIpID0+IF9lcXVhbGl0eShlMSwgZTIpOwoKICBib29sIGNvbnRhaW5zKE9iamVjdCBvKSA9PiBfdmFsaWRLZXkobykgPyBzdXBlci5jb250YWlucyhvKSA6IGZhbHNlOwogIEUgbG9va3VwKE9iamVjdCBvKSA9PiBfdmFsaWRLZXkobykgPyBzdXBlci5sb29rdXAobykgOiBudWxsOwogIGJvb2wgcmVtb3ZlKE9iamVjdCBvKSA9PiBfdmFsaWRLZXkobykgPyBzdXBlci5yZW1vdmUobykgOiBmYWxzZTsKCiAgX0NvbXBhY3RMaW5rZWRDdXN0b21IYXNoU2V0KHRoaXMuX2VxdWFsaXR5LCB0aGlzLl9oYXNoZXIsIHZhbGlkS2V5KQogICAgICA6IF92YWxpZEtleSA9ICh2YWxpZEtleSAhPSBudWxsKSA/IHZhbGlkS2V5IDogbmV3IF9UeXBlVGVzdDxFPigpLnRlc3Q7CgogIFNldDxSPiBjYXN0PFI+KCkgPT4gU2V0LmNhc3RGcm9tPEUsIFI+KHRoaXMpOwogIFNldDxFPiB0b1NldCgpID0+CiAgICAgIG5ldyBfQ29tcGFjdExpbmtlZEN1c3RvbUhhc2hTZXQ8RT4oX2VxdWFsaXR5LCBfaGFzaGVyLCBfdmFsaWRLZXkpCiAgICAgICAgLi5hZGRBbGwodGhpcyk7Cn0Kgo4ATk48ASQBTgFRMyIkJSUjBAIBIFA6TkshUSJFATpRAU0OAUMVAR0YAU1RJEICAUkdQTlFATQ4RAE1MT0BNDhEATQ+SgIBQ0k0QTJNTE5BSyxJAUUlJgFCTRgzLRwmJwQBQjBDRwQBFTcnSCYEAUQBOTojMBQEAU0wMTpAARICASMiJAIBJistAgFKGjcJGCMTIyUdPE81ExYEAgFAFBgVOAE1IyMBEyspTTkNS0MGBAERFEAGBAFLQiQpIxocExYbLR4zUSYKCAYEATwcKxw/IxMrJQYEATklERkNOygqJyAiBgQBTixQIyY3GxotLSAcCg8uIiQoGgwKCC0YBjMEASYkKU9NERgNGCsGBAEnJClPTREXBjAaIRoyGQ0YKwYSBAEZJCMmKU83Gi0tLiIkKDEvJDMcGgwKCC0YBhEEAT4nJCMmKU83Gi0tLiIkKCEMCggtGAYSBAFLAR4iQwQBJRxOGBUIBhIEASkcHhwVIQYEARo+HD4CAUEJGCMTJiVKAgE/PiUTERMBSSItAU09PwFGTS4CAUorMBoUEhUTARRFAR5EASMjIwIBMxoUEg8TFw0BFEgYJQEUNTUGCRhNGjgTDRYUBgQCATs2PCJIKQQBQgFDLgEQOSYzGAgGLAQBDz4mMxgIBiwEARMrOQ1DBgQBERRABgQBQiMaIRMWGy0eMxQKCAYEARQkIyYpTzcbGi0tIBwKDyo4GAoILRgGJREQDUk7LjggBhEEAT4lJCMmKU83Gi0tKjhCCggtGAYSBAEZICsEAUYBHCQjJilPNxotLSo4Ly0aFwoILRgGEgQBHj4BM043QgE8HA8EAgFIKUoBSgFDAgFIExETASItAUc/QwFGTQEwFEgYAgEnZGFydDpjb2xsZWN0aW9uLXBhdGNoL2NvbXBhY3RfaGFzaC5kYXJ0MG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb2xsZWN0aW9uL21hcHMuZGFydK1gLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb2xsZWN0aW9uOwoKLy8vIEJhc2UgY2xhc3MgZm9yIGltcGxlbWVudGluZyBhIFtNYXBdLgovLy8KLy8vIFRoaXMgY2xhc3MgaGFzIGEgYmFzaWMgaW1wbGVtZW50YXRpb24gb2YgYWxsIGJ1dCBmaXZlIG9mIHRoZSBtZW1iZXJzIG9mCi8vLyBbTWFwXS4KLy8vIEEgYmFzaWMgYE1hcGAgY2xhc3MgY2FuIGJlIGltcGxlbWVudGVkIGJ5IGV4dGVuZGluZyB0aGlzIGNsYXNzIGFuZAovLy8gaW1wbGVtZW50aW5nIGBrZXlzYCwgYG9wZXJhdG9yW11gLCBgb3BlcmF0b3JbXT1gLCBgcmVtb3ZlYCBhbmQgYGNsZWFyYC4KLy8vIFRoZSByZW1haW5pbmcgb3BlcmF0aW9ucyBhcmUgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgdGhlc2UgZml2ZS4KLy8vCi8vLyBUaGUgYGtleXNgIGl0ZXJhYmxlIHNob3VsZCBoYXZlIGVmZmljaWVudCBbSXRlcmFibGUubGVuZ3RoXSBhbmQKLy8vIFtJdGVyYWJsZS5jb250YWluc10gb3BlcmF0aW9ucywgYW5kIGl0IHNob3VsZCBjYXRjaCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbnMKLy8vIG9mIHRoZSBrZXlzIHdoaWxlIGl0ZXJhdGluZy4KLy8vCi8vLyBBIG1vcmUgZWZmaWNpZW50IGltcGxlbWVudGF0aW9uIGlzIHVzdWFsbHkgcG9zc2libGUgYnkgb3ZlcnJpZGluZwovLy8gc29tZSBvZiB0aGUgb3RoZXIgbWVtYmVycyBhcyB3ZWxsLgphYnN0cmFjdCBjbGFzcyBNYXBCYXNlPEssIFY+IGV4dGVuZHMgTWFwTWl4aW48SywgVj4gewogIHN0YXRpYyBTdHJpbmcgbWFwVG9TdHJpbmcoTWFwIG0pIHsKICAgIC8vIFJldXNlcyB0aGUgbGlzdCBpbiBJdGVyYWJsZUJhc2UgZm9yIGRldGVjdGluZyB0b1N0cmluZyBjeWNsZXMuCiAgICBpZiAoX2lzVG9TdHJpbmdWaXNpdGluZyhtKSkgewogICAgICByZXR1cm4gJ3suLi59JzsKICAgIH0KCiAgICB2YXIgcmVzdWx0ID0gU3RyaW5nQnVmZmVyKCk7CiAgICB0cnkgewogICAgICBfdG9TdHJpbmdWaXNpdGluZy5hZGQobSk7CiAgICAgIHJlc3VsdC53cml0ZSgneycpOwogICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgICAgbS5mb3JFYWNoKChrLCB2KSB7CiAgICAgICAgaWYgKCFmaXJzdCkgewogICAgICAgICAgcmVzdWx0LndyaXRlKCcsICcpOwogICAgICAgIH0KICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICAgIHJlc3VsdC53cml0ZShrKTsKICAgICAgICByZXN1bHQud3JpdGUoJzogJyk7CiAgICAgICAgcmVzdWx0LndyaXRlKHYpOwogICAgICB9KTsKICAgICAgcmVzdWx0LndyaXRlKCd9Jyk7CiAgICB9IGZpbmFsbHkgewogICAgICBhc3NlcnQoaWRlbnRpY2FsKF90b1N0cmluZ1Zpc2l0aW5nLmxhc3QsIG0pKTsKICAgICAgX3RvU3RyaW5nVmlzaXRpbmcucmVtb3ZlTGFzdCgpOwogICAgfQoKICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKICB9CgogIHN0YXRpYyBfaWQoeCkgPT4geDsKCiAgLy8vIEZpbGxzIGEgW01hcF0gd2l0aCBrZXkvdmFsdWUgcGFpcnMgY29tcHV0ZWQgZnJvbSBbaXRlcmFibGVdLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IFtNYXBdIGNsYXNzZXMgaW4gdGhlIG5hbWVkIGNvbnN0cnVjdG9yCiAgLy8vIGBmcm9tSXRlcmFibGVgLgogIHN0YXRpYyB2b2lkIF9maWxsTWFwV2l0aE1hcHBlZEl0ZXJhYmxlKAogICAgICBNYXAgbWFwLCBJdGVyYWJsZSBpdGVyYWJsZSwga2V5KGVsZW1lbnQpLCB2YWx1ZShlbGVtZW50KSkgewogICAga2V5ID8/PSBfaWQ7CiAgICB2YWx1ZSA/Pz0gX2lkOwoKICAgIGZvciAodmFyIGVsZW1lbnQgaW4gaXRlcmFibGUpIHsKICAgICAgbWFwW2tleShlbGVtZW50KV0gPSB2YWx1ZShlbGVtZW50KTsKICAgIH0KICB9CgogIC8vLyBGaWxscyBhIG1hcCBieSBhc3NvY2lhdGluZyB0aGUgW2tleXNdIHRvIFt2YWx1ZXNdLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IFtNYXBdIGNsYXNzZXMgaW4gdGhlIG5hbWVkIGNvbnN0cnVjdG9yCiAgLy8vIGBmcm9tSXRlcmFibGVzYC4KICBzdGF0aWMgdm9pZCBfZmlsbE1hcFdpdGhJdGVyYWJsZXMoTWFwIG1hcCwgSXRlcmFibGUga2V5cywgSXRlcmFibGUgdmFsdWVzKSB7CiAgICBJdGVyYXRvciBrZXlJdGVyYXRvciA9IGtleXMuaXRlcmF0b3I7CiAgICBJdGVyYXRvciB2YWx1ZUl0ZXJhdG9yID0gdmFsdWVzLml0ZXJhdG9yOwoKICAgIGJvb2wgaGFzTmV4dEtleSA9IGtleUl0ZXJhdG9yLm1vdmVOZXh0KCk7CiAgICBib29sIGhhc05leHRWYWx1ZSA9IHZhbHVlSXRlcmF0b3IubW92ZU5leHQoKTsKCiAgICB3aGlsZSAoaGFzTmV4dEtleSAmJiBoYXNOZXh0VmFsdWUpIHsKICAgICAgbWFwW2tleUl0ZXJhdG9yLmN1cnJlbnRdID0gdmFsdWVJdGVyYXRvci5jdXJyZW50OwogICAgICBoYXNOZXh0S2V5ID0ga2V5SXRlcmF0b3IubW92ZU5leHQoKTsKICAgICAgaGFzTmV4dFZhbHVlID0gdmFsdWVJdGVyYXRvci5tb3ZlTmV4dCgpOwogICAgfQoKICAgIGlmIChoYXNOZXh0S2V5IHx8IGhhc05leHRWYWx1ZSkgewogICAgICB0aHJvdyBBcmd1bWVudEVycm9yKCJJdGVyYWJsZXMgZG8gbm90IGhhdmUgc2FtZSBsZW5ndGguIik7CiAgICB9CiAgfQp9CgovLy8gTWl4aW4gaW1wbGVtZW50aW5nIGEgW01hcF0uCi8vLwovLy8gVGhpcyBtaXhpbiBoYXMgYSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiBhbGwgYnV0IGZpdmUgb2YgdGhlIG1lbWJlcnMgb2YKLy8vIFtNYXBdLgovLy8gQSBiYXNpYyBgTWFwYCBjbGFzcyBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgbWl4aW4gaW4gdGhpcyBjbGFzcyBhbmQKLy8vIGltcGxlbWVudGluZyBga2V5c2AsIGBvcGVyYXRvcltdYCwgYG9wZXJhdG9yW109YCwgYHJlbW92ZWAgYW5kIGBjbGVhcmAuCi8vLyBUaGUgcmVtYWluaW5nIG9wZXJhdGlvbnMgYXJlIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHRoZXNlIGZpdmUuCi8vLwovLy8gVGhlIGBrZXlzYCBpdGVyYWJsZSBzaG91bGQgaGF2ZSBlZmZpY2llbnQgW0l0ZXJhYmxlLmxlbmd0aF0gYW5kCi8vLyBbSXRlcmFibGUuY29udGFpbnNdIG9wZXJhdGlvbnMsIGFuZCBpdCBzaG91bGQgY2F0Y2ggY29uY3VycmVudCBtb2RpZmljYXRpb25zCi8vLyBvZiB0aGUga2V5cyB3aGlsZSBpdGVyYXRpbmcuCi8vLwovLy8gQSBtb3JlIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBpcyB1c3VhbGx5IHBvc3NpYmxlIGJ5IG92ZXJyaWRpbmcKLy8vIHNvbWUgb2YgdGhlIG90aGVyIG1lbWJlcnMgYXMgd2VsbC4KYWJzdHJhY3QgY2xhc3MgTWFwTWl4aW48SywgVj4gaW1wbGVtZW50cyBNYXA8SywgVj4gewogIEl0ZXJhYmxlPEs+IGdldCBrZXlzOwogIFYgb3BlcmF0b3IgW10oT2JqZWN0IGtleSk7CiAgb3BlcmF0b3IgW109KEsga2V5LCBWIHZhbHVlKTsKICBWIHJlbW92ZShPYmplY3Qga2V5KTsKICAvLyBUaGUgYGNsZWFyYCBvcGVyYXRpb24gc2hvdWxkIG5vdCBiZSBiYXNlZCBvbiBgcmVtb3ZlYC4KICAvLyBJdCBzaG91bGQgY2xlYXIgdGhlIG1hcCBldmVuIGlmIHNvbWUga2V5cyBhcmUgbm90IGVxdWFsIHRvIHRoZW1zZWx2ZXMuCiAgdm9pZCBjbGVhcigpOwoKICBNYXA8UkssIFJWPiBjYXN0PFJLLCBSVj4oKSA9PiBNYXAuY2FzdEZyb208SywgViwgUkssIFJWPih0aGlzKTsKICB2b2lkIGZvckVhY2godm9pZCBhY3Rpb24oSyBrZXksIFYgdmFsdWUpKSB7CiAgICBmb3IgKEsga2V5IGluIGtleXMpIHsKICAgICAgYWN0aW9uKGtleSwgdGhpc1trZXldKTsKICAgIH0KICB9CgogIHZvaWQgYWRkQWxsKE1hcDxLLCBWPiBvdGhlcikgewogICAgZm9yIChLIGtleSBpbiBvdGhlci5rZXlzKSB7CiAgICAgIHRoaXNba2V5XSA9IG90aGVyW2tleV07CiAgICB9CiAgfQoKICBib29sIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7CiAgICBmb3IgKEsga2V5IGluIGtleXMpIHsKICAgICAgaWYgKHRoaXNba2V5XSA9PSB2YWx1ZSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBWIHB1dElmQWJzZW50KEsga2V5LCBWIGlmQWJzZW50KCkpIHsKICAgIGlmIChjb250YWluc0tleShrZXkpKSB7CiAgICAgIHJldHVybiB0aGlzW2tleV07CiAgICB9CiAgICByZXR1cm4gdGhpc1trZXldID0gaWZBYnNlbnQoKTsKICB9CgogIFYgdXBkYXRlKEsga2V5LCBWIHVwZGF0ZShWIHZhbHVlKSwge1YgaWZBYnNlbnQoKX0pIHsKICAgIGlmICh0aGlzLmNvbnRhaW5zS2V5KGtleSkpIHsKICAgICAgcmV0dXJuIHRoaXNba2V5XSA9IHVwZGF0ZSh0aGlzW2tleV0pOwogICAgfQogICAgaWYgKGlmQWJzZW50ICE9IG51bGwpIHsKICAgICAgcmV0dXJuIHRoaXNba2V5XSA9IGlmQWJzZW50KCk7CiAgICB9CiAgICB0aHJvdyBBcmd1bWVudEVycm9yLnZhbHVlKGtleSwgImtleSIsICJLZXkgbm90IGluIG1hcC4iKTsKICB9CgogIHZvaWQgdXBkYXRlQWxsKFYgdXBkYXRlKEsga2V5LCBWIHZhbHVlKSkgewogICAgZm9yICh2YXIga2V5IGluIHRoaXMua2V5cykgewogICAgICB0aGlzW2tleV0gPSB1cGRhdGUoa2V5LCB0aGlzW2tleV0pOwogICAgfQogIH0KCiAgSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IGdldCBlbnRyaWVzIHsKICAgIHJldHVybiBrZXlzLm1hcCgoSyBrZXkpID0+IE1hcEVudHJ5PEssIFY+KGtleSwgdGhpc1trZXldKSk7CiAgfQoKICBNYXA8SzIsIFYyPiBtYXA8SzIsIFYyPihNYXBFbnRyeTxLMiwgVjI+IHRyYW5zZm9ybShLIGtleSwgViB2YWx1ZSkpIHsKICAgIHZhciByZXN1bHQgPSA8SzIsIFYyPnt9OwogICAgZm9yICh2YXIga2V5IGluIHRoaXMua2V5cykgewogICAgICB2YXIgZW50cnkgPSB0cmFuc2Zvcm0oa2V5LCB0aGlzW2tleV0pOwogICAgICByZXN1bHRbZW50cnkua2V5XSA9IGVudHJ5LnZhbHVlOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgYWRkRW50cmllcyhJdGVyYWJsZTxNYXBFbnRyeTxLLCBWPj4gbmV3RW50cmllcykgewogICAgZm9yICh2YXIgZW50cnkgaW4gbmV3RW50cmllcykgewogICAgICB0aGlzW2VudHJ5LmtleV0gPSBlbnRyeS52YWx1ZTsKICAgIH0KICB9CgogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KEsga2V5LCBWIHZhbHVlKSkgewogICAgdmFyIGtleXNUb1JlbW92ZSA9IDxLPltdOwogICAgZm9yICh2YXIga2V5IGluIGtleXMpIHsKICAgICAgaWYgKHRlc3Qoa2V5LCB0aGlzW2tleV0pKSBrZXlzVG9SZW1vdmUuYWRkKGtleSk7CiAgICB9CiAgICBmb3IgKHZhciBrZXkgaW4ga2V5c1RvUmVtb3ZlKSB7CiAgICAgIHRoaXMucmVtb3ZlKGtleSk7CiAgICB9CiAgfQoKICBib29sIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpID0+IGtleXMuY29udGFpbnMoa2V5KTsKICBpbnQgZ2V0IGxlbmd0aCA9PiBrZXlzLmxlbmd0aDsKICBib29sIGdldCBpc0VtcHR5ID0+IGtleXMuaXNFbXB0eTsKICBib29sIGdldCBpc05vdEVtcHR5ID0+IGtleXMuaXNOb3RFbXB0eTsKICBJdGVyYWJsZTxWPiBnZXQgdmFsdWVzID0+IF9NYXBCYXNlVmFsdWVJdGVyYWJsZTxLLCBWPih0aGlzKTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBNYXBCYXNlLm1hcFRvU3RyaW5nKHRoaXMpOwp9CgovLy8gQmFzaWMgaW1wbGVtZW50YXRpb24gb2YgYW4gdW5tb2RpZmlhYmxlIFtNYXBdLgovLy8KLy8vIFRoaXMgY2xhc3MgaGFzIGEgYmFzaWMgaW1wbGVtZW50YXRpb24gb2YgYWxsIGJ1dCB0d28gb2YgdGhlIG1lbWJlcnMgb2YKLy8vIGFuIHVtb2RpZmlhYmxlIFtNYXBdLgovLy8gQSBzaW1wbGUgdW5tb2RpZmlhYmxlIGBNYXBgIGNsYXNzIGNhbiBiZSBpbXBsZW1lbnRlZCBieSBleHRlbmRpbmcgdGhpcwovLy8gY2xhc3MgYW5kIGltcGxlbWVudGluZyBga2V5c2AgYW5kIGBvcGVyYXRvcltdYC4KLy8vCi8vLyBNb2RpZnlpbmcgb3BlcmF0aW9ucyB0aHJvdyB3aGVuIHVzZWQuCi8vLyBUaGUgcmVtYWluaW5nIG5vbi1tb2RpZnlpbmcgb3BlcmF0aW9ucyBhcmUgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgYGtleXNgCi8vLyBhbmQgYG9wZXJhdG9yW11gLgovLy8KLy8vIFRoZSBga2V5c2AgaXRlcmFibGUgc2hvdWxkIGhhdmUgZWZmaWNpZW50IFtJdGVyYWJsZS5sZW5ndGhdIGFuZAovLy8gW0l0ZXJhYmxlLmNvbnRhaW5zXSBvcGVyYXRpb25zLCBhbmQgaXQgc2hvdWxkIGNhdGNoIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9ucwovLy8gb2YgdGhlIGtleXMgd2hpbGUgaXRlcmF0aW5nLgovLy8KLy8vIEEgbW9yZSBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24gaXMgdXN1YWxseSBwb3NzaWJsZSBieSBvdmVycmlkaW5nCi8vLyBzb21lIG9mIHRoZSBvdGhlciBtZW1iZXJzIGFzIHdlbGwuCmFic3RyYWN0IGNsYXNzIFVubW9kaWZpYWJsZU1hcEJhc2U8SywgVj4gPSBNYXBCYXNlPEssIFY+CiAgICB3aXRoIF9Vbm1vZGlmaWFibGVNYXBNaXhpbjxLLCBWPjsKCi8vLyBJbXBsZW1lbnRhdGlvbiBvZiBbTWFwLnZhbHVlc10gYmFzZWQgb24gdGhlIG1hcCBhbmQgaXRzIFtNYXAua2V5c10gaXRlcmFibGUuCi8vLwovLy8gSXRlcmFibGUgdGhhdCBpdGVyYXRlcyBvdmVyIHRoZSB2YWx1ZXMgb2YgYSBgTWFwYC4KLy8vIEl0IGFjY2Vzc2VzIHRoZSB2YWx1ZXMgYnkgaXRlcmF0aW5nIG92ZXIgdGhlIGtleXMgb2YgdGhlIG1hcCwgYW5kIHVzaW5nIHRoZQovLy8gbWFwJ3MgYG9wZXJhdG9yW11gIHRvIGxvb2t1cCB0aGUga2V5cy4KY2xhc3MgX01hcEJhc2VWYWx1ZUl0ZXJhYmxlPEssIFY+IGV4dGVuZHMgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGU8Vj4gewogIGZpbmFsIE1hcDxLLCBWPiBfbWFwOwogIF9NYXBCYXNlVmFsdWVJdGVyYWJsZSh0aGlzLl9tYXApOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfbWFwLmxlbmd0aDsKICBib29sIGdldCBpc0VtcHR5ID0+IF9tYXAuaXNFbXB0eTsKICBib29sIGdldCBpc05vdEVtcHR5ID0+IF9tYXAuaXNOb3RFbXB0eTsKICBWIGdldCBmaXJzdCA9PiBfbWFwW19tYXAua2V5cy5maXJzdF07CiAgViBnZXQgc2luZ2xlID0+IF9tYXBbX21hcC5rZXlzLnNpbmdsZV07CiAgViBnZXQgbGFzdCA9PiBfbWFwW19tYXAua2V5cy5sYXN0XTsKCiAgSXRlcmF0b3I8Vj4gZ2V0IGl0ZXJhdG9yID0+IF9NYXBCYXNlVmFsdWVJdGVyYXRvcjxLLCBWPihfbWFwKTsKfQoKLy8vIEl0ZXJhdG9yIGNyZWF0ZWQgYnkgW19NYXBCYXNlVmFsdWVJdGVyYWJsZV0uCi8vLwovLy8gSXRlcmF0ZXMgb3ZlciB0aGUgdmFsdWVzIG9mIGEgbWFwIGJ5IGl0ZXJhdGluZyBpdHMga2V5cyBhbmQgbG9va3VwIHVwIHRoZQovLy8gdmFsdWVzLgpjbGFzcyBfTWFwQmFzZVZhbHVlSXRlcmF0b3I8SywgVj4gaW1wbGVtZW50cyBJdGVyYXRvcjxWPiB7CiAgZmluYWwgSXRlcmF0b3I8Sz4gX2tleXM7CiAgZmluYWwgTWFwPEssIFY+IF9tYXA7CiAgViBfY3VycmVudDsKCiAgX01hcEJhc2VWYWx1ZUl0ZXJhdG9yKE1hcDxLLCBWPiBtYXApCiAgICAgIDogX21hcCA9IG1hcCwKICAgICAgICBfa2V5cyA9IG1hcC5rZXlzLml0ZXJhdG9yOwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKF9rZXlzLm1vdmVOZXh0KCkpIHsKICAgICAgX2N1cnJlbnQgPSBfbWFwW19rZXlzLmN1cnJlbnRdOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9jdXJyZW50ID0gbnVsbDsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIFYgZ2V0IGN1cnJlbnQgPT4gX2N1cnJlbnQ7Cn0KCi8vLyBNaXhpbiB0aGF0IG92ZXJyaWRlcyBtdXRhdGluZyBtYXAgb3BlcmF0aW9ucyB3aXRoIGltcGxlbWVudGF0aW9ucyB0aGF0Ci8vLyB0aHJvdy4KYWJzdHJhY3QgY2xhc3MgX1VubW9kaWZpYWJsZU1hcE1peGluPEssIFY+IGltcGxlbWVudHMgTWFwPEssIFY+IHsKICAvLy8gVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbiB1bm1vZGlmaWFibGUgbWFwLgogIHZvaWQgb3BlcmF0b3IgW109KEsga2V5LCBWIHZhbHVlKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IHVubW9kaWZpYWJsZSBtYXAiKTsKICB9CgogIC8vLyBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBtYXAuCiAgdm9pZCBhZGRBbGwoTWFwPEssIFY+IG90aGVyKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IHVubW9kaWZpYWJsZSBtYXAiKTsKICB9CgogIC8vLyBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBtYXAuCiAgdm9pZCBhZGRFbnRyaWVzKEl0ZXJhYmxlPE1hcEVudHJ5PEssIFY+PiBlbnRyaWVzKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IHVubW9kaWZpYWJsZSBtYXAiKTsKICB9CgogIC8vLyBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBtYXAuCiAgdm9pZCBjbGVhcigpIHsKICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBtb2RpZnkgdW5tb2RpZmlhYmxlIG1hcCIpOwogIH0KCiAgLy8vIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIG1hcC4KICBWIHJlbW92ZShPYmplY3Qga2V5KSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IHVubW9kaWZpYWJsZSBtYXAiKTsKICB9CgogIC8vLyBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBtYXAuCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoSyBrZXksIFYgdmFsdWUpKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IHVubW9kaWZpYWJsZSBtYXAiKTsKICB9CgogIC8vLyBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBtYXAuCiAgViBwdXRJZkFic2VudChLIGtleSwgViBpZkFic2VudCgpKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IHVubW9kaWZpYWJsZSBtYXAiKTsKICB9CgogIC8vLyBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBtYXAuCiAgViB1cGRhdGUoSyBrZXksIFYgdXBkYXRlKFYgdmFsdWUpLCB7ViBpZkFic2VudCgpfSkgewogICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IG1vZGlmeSB1bm1vZGlmaWFibGUgbWFwIik7CiAgfQoKICAvLy8gVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbiB1bm1vZGlmaWFibGUgbWFwLgogIHZvaWQgdXBkYXRlQWxsKFYgdXBkYXRlKEsga2V5LCBWIHZhbHVlKSkgewogICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IG1vZGlmeSB1bm1vZGlmaWFibGUgbWFwIik7CiAgfQp9CgovLy8gV3JhcHBlciBhcm91bmQgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgW01hcF0gdGhhdCBvbmx5IGV4cG9zZXMgYE1hcGAKLy8vIG1lbWJlcnMuCi8vLwovLy8gQSBzaW1wbGUgd3JhcHBlciB0aGF0IGRlbGVnYXRlcyBhbGwgYE1hcGAgbWVtYmVycyB0byB0aGUgbWFwIHByb3ZpZGVkIGluIHRoZQovLy8gY29uc3RydWN0b3IuCi8vLwovLy8gQmFzZSBmb3IgZGVsZWdhdGluZyBtYXAgaW1wbGVtZW50YXRpb25zIGxpa2UgW1VubW9kaWZpYWJsZU1hcFZpZXddLgpjbGFzcyBNYXBWaWV3PEssIFY+IGltcGxlbWVudHMgTWFwPEssIFY+IHsKICBmaW5hbCBNYXA8SywgVj4gX21hcDsKICBjb25zdCBNYXBWaWV3KE1hcDxLLCBWPiBtYXApIDogX21hcCA9IG1hcDsKCiAgTWFwPFJLLCBSVj4gY2FzdDxSSywgUlY+KCkgPT4gX21hcC5jYXN0PFJLLCBSVj4oKTsKICBWIG9wZXJhdG9yIFtdKE9iamVjdCBrZXkpID0+IF9tYXBba2V5XTsKICB2b2lkIG9wZXJhdG9yIFtdPShLIGtleSwgViB2YWx1ZSkgewogICAgX21hcFtrZXldID0gdmFsdWU7CiAgfQoKICB2b2lkIGFkZEFsbChNYXA8SywgVj4gb3RoZXIpIHsKICAgIF9tYXAuYWRkQWxsKG90aGVyKTsKICB9CgogIHZvaWQgY2xlYXIoKSB7CiAgICBfbWFwLmNsZWFyKCk7CiAgfQoKICBWIHB1dElmQWJzZW50KEsga2V5LCBWIGlmQWJzZW50KCkpID0+IF9tYXAucHV0SWZBYnNlbnQoa2V5LCBpZkFic2VudCk7CiAgYm9vbCBjb250YWluc0tleShPYmplY3Qga2V5KSA9PiBfbWFwLmNvbnRhaW5zS2V5KGtleSk7CiAgYm9vbCBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgPT4gX21hcC5jb250YWluc1ZhbHVlKHZhbHVlKTsKICB2b2lkIGZvckVhY2godm9pZCBhY3Rpb24oSyBrZXksIFYgdmFsdWUpKSB7CiAgICBfbWFwLmZvckVhY2goYWN0aW9uKTsKICB9CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX21hcC5pc0VtcHR5OwogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gX21hcC5pc05vdEVtcHR5OwogIGludCBnZXQgbGVuZ3RoID0+IF9tYXAubGVuZ3RoOwogIEl0ZXJhYmxlPEs+IGdldCBrZXlzID0+IF9tYXAua2V5czsKICBWIHJlbW92ZShPYmplY3Qga2V5KSA9PiBfbWFwLnJlbW92ZShrZXkpOwogIFN0cmluZyB0b1N0cmluZygpID0+IF9tYXAudG9TdHJpbmcoKTsKICBJdGVyYWJsZTxWPiBnZXQgdmFsdWVzID0+IF9tYXAudmFsdWVzOwoKICBJdGVyYWJsZTxNYXBFbnRyeTxLLCBWPj4gZ2V0IGVudHJpZXMgPT4gX21hcC5lbnRyaWVzOwoKICB2b2lkIGFkZEVudHJpZXMoSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IGVudHJpZXMpIHsKICAgIF9tYXAuYWRkRW50cmllcyhlbnRyaWVzKTsKICB9CgogIE1hcDxLMiwgVjI+IG1hcDxLMiwg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ZSBvZiB0aGUgbWV0aG9kcyBhc3N1bWUgdGhhdCBgdG9TZXRgIGNyZWF0ZXMgYSBtb2RpZmlhYmxlIHNldC4KLy8vIElmIHVzaW5nIHRoaXMgbWl4aW4gZm9yIGFuIHVubW9kaWZpYWJsZSBzZXQsCi8vLyB3aGVyZSBgdG9TZXRgIHNob3VsZCByZXR1cm4gYW4gdW5tb2RpZmlhYmxlIHNldCwKLy8vIGl0J3MgbmVjZXNzYXJ5IHRvIHJlaW1wbGVtZW50Ci8vLyBbcmV0YWluQWxsXSwgW3VuaW9uXSwgW2ludGVyc2VjdGlvbl0gYW5kIFtkaWZmZXJlbmNlXS4KLy8vCi8vLyBJbXBsZW1lbnRhdGlvbnMgb2YgYFNldGAgdXNpbmcgdGhpcyBtaXhpbiBzaG91bGQgY29uc2lkZXIgYWxzbyBpbXBsZW1lbnRpbmcKLy8vIGBjbGVhcmAgaW4gY29uc3RhbnQgdGltZS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd29ya3MgYnkgcmVtb3ZpbmcgZXZlcnkKLy8vIGVsZW1lbnQuCmFic3RyYWN0IGNsYXNzIFNldE1peGluPEU+IGltcGxlbWVudHMgU2V0PEU+IHsKICAvLyBUaGlzIGNsYXNzIHJlaW1wbGVtZW50cyBhbGwgb2YgW0l0ZXJhYmxlTWl4aW5dLgogIC8vIElmL3doZW4gRGFydCBtaXhpbnMgZ2V0IG1vcmUgcG93ZXJmdWwsIHdlIHNob3VsZCBqdXN0IGNyZWF0ZSBhIHNpbmdsZQogIC8vIE1peGluIGNsYXNzIGZyb20gSXRlcmFibGVNaXhpbiBhbmQgdGhlIG5ldyBtZXRob2RzIG9mIHRoaXMgY2xhc3MuCgogIGJvb2wgYWRkKEUgdmFsdWUpOwoKICBib29sIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KTsKCiAgRSBsb29rdXAoT2JqZWN0IGVsZW1lbnQpOwoKICBib29sIHJlbW92ZShPYmplY3QgdmFsdWUpOwoKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3I7CgogIFNldDxFPiB0b1NldCgpOwoKICBpbnQgZ2V0IGxlbmd0aDsKCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBsZW5ndGggPT0gMDsKCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBsZW5ndGggIT0gMDsKCiAgU2V0PFI+IGNhc3Q8Uj4oKSA9PiBTZXQuY2FzdEZyb208RSwgUj4odGhpcyk7CiAgSXRlcmFibGU8RT4gZm9sbG93ZWRCeShJdGVyYWJsZTxFPiBvdGhlcikgPT4KICAgICAgRm9sbG93ZWRCeUl0ZXJhYmxlPEU+LmZpcnN0RWZmaWNpZW50KHRoaXMsIG90aGVyKTsKCiAgSXRlcmFibGU8VD4gd2hlcmVUeXBlPFQ+KCkgPT4gV2hlcmVUeXBlSXRlcmFibGU8VD4odGhpcyk7CgogIHZvaWQgY2xlYXIoKSB7CiAgICByZW1vdmVBbGwodG9MaXN0KCkpOwogIH0KCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gZWxlbWVudHMpIHsKICAgIGZvciAoRSBlbGVtZW50IGluIGVsZW1lbnRzKSBhZGQoZWxlbWVudCk7CiAgfQoKICB2b2lkIHJlbW92ZUFsbChJdGVyYWJsZTxPYmplY3Q+IGVsZW1lbnRzKSB7CiAgICBmb3IgKE9iamVjdCBlbGVtZW50IGluIGVsZW1lbnRzKSByZW1vdmUoZWxlbWVudCk7CiAgfQoKICB2b2lkIHJldGFpbkFsbChJdGVyYWJsZTxPYmplY3Q+IGVsZW1lbnRzKSB7CiAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSBzZXQsIHJlbW92ZSBhbGwgb2YgZWxlbWVudHMgZnJvbSB0aGUgY29weSwKICAgIC8vIHRoZW4gcmVtb3ZlIGFsbCByZW1haW5pbmcgZWxlbWVudHMgaW4gY29weSBmcm9tIHRoaXMuCiAgICBTZXQ8RT4gdG9SZW1vdmUgPSB0b1NldCgpOwogICAgZm9yIChPYmplY3QgbyBpbiBlbGVtZW50cykgewogICAgICB0b1JlbW92ZS5yZW1vdmUobyk7CiAgICB9CiAgICByZW1vdmVBbGwodG9SZW1vdmUpOwogIH0KCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgTGlzdCB0b1JlbW92ZSA9IFtdOwogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAodGVzdChlbGVtZW50KSkgdG9SZW1vdmUuYWRkKGVsZW1lbnQpOwogICAgfQogICAgcmVtb3ZlQWxsKHRvUmVtb3ZlKTsKICB9CgogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIExpc3QgdG9SZW1vdmUgPSBbXTsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHsKICAgICAgaWYgKCF0ZXN0KGVsZW1lbnQpKSB0b1JlbW92ZS5hZGQoZWxlbWVudCk7CiAgICB9CiAgICByZW1vdmVBbGwodG9SZW1vdmUpOwogIH0KCiAgYm9vbCBjb250YWluc0FsbChJdGVyYWJsZTxPYmplY3Q+IG90aGVyKSB7CiAgICBmb3IgKE9iamVjdCBvIGluIG90aGVyKSB7CiAgICAgIGlmICghY29udGFpbnMobykpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgU2V0PEU+IHVuaW9uKFNldDxFPiBvdGhlcikgewogICAgcmV0dXJuIHRvU2V0KCkuLmFkZEFsbChvdGhlcik7CiAgfQoKICBTZXQ8RT4gaW50ZXJzZWN0aW9uKFNldDxPYmplY3Q+IG90aGVyKSB7CiAgICBTZXQ8RT4gcmVzdWx0ID0gdG9TZXQoKTsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHsKICAgICAgaWYgKCFvdGhlci5jb250YWlucyhlbGVtZW50KSkgcmVzdWx0LnJlbW92ZShlbGVtZW50KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBTZXQ8RT4gZGlmZmVyZW5jZShTZXQ8T2JqZWN0PiBvdGhlcikgewogICAgU2V0PEU+IHJlc3VsdCA9IHRvU2V0KCk7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmIChvdGhlci5jb250YWlucyhlbGVtZW50KSkgcmVzdWx0LnJlbW92ZShlbGVtZW50KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBMaXN0PEU+IHRvTGlzdCh7Ym9vbCBncm93YWJsZSA9IHRydWV9KSB7CiAgICBMaXN0PEU+IHJlc3VsdCA9IGdyb3dhYmxlID8gKDxFPltdLi5sZW5ndGggPSBsZW5ndGgpIDogTGlzdDxFPihsZW5ndGgpOwogICAgaW50IGkgPSAwOwogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgcmVzdWx0W2krK10gPSBlbGVtZW50OwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEl0ZXJhYmxlPFQ+IG1hcDxUPihUIGYoRSBlbGVtZW50KSkgPT4KICAgICAgRWZmaWNpZW50TGVuZ3RoTWFwcGVkSXRlcmFibGU8RSwgVD4odGhpcywgZik7CgogIEUgZ2V0IHNpbmdsZSB7CiAgICBpZiAobGVuZ3RoID4gMSkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgSXRlcmF0b3I8RT4gaXQgPSBpdGVyYXRvcjsKICAgIGlmICghaXQubW92ZU5leHQoKSkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICBFIHJlc3VsdCA9IGl0LmN1cnJlbnQ7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gSXRlcmFibGVCYXNlLml0ZXJhYmxlVG9GdWxsU3RyaW5nKHRoaXMsICd7JywgJ30nKTsKCiAgLy8gQ29waWVkIGZyb20gSXRlcmFibGVNaXhpbi4KICAvLyBTaG91bGQgYmUgaW5oZXJpdGVkIGlmIHdlIGhhZCBtdWx0aS1sZXZlbCBtaXhpbnMuCgogIEl0ZXJhYmxlPEU+IHdoZXJlKGJvb2wgZihFIGVsZW1lbnQpKSA9PiBXaGVyZUl0ZXJhYmxlPEU+KHRoaXMsIGYpOwoKICBJdGVyYWJsZTxUPiBleHBhbmQ8VD4oSXRlcmFibGU8VD4gZihFIGVsZW1lbnQpKSA9PgogICAgICBFeHBhbmRJdGVyYWJsZTxFLCBUPih0aGlzLCBmKTsKCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihFIGVsZW1lbnQpKSB7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSBmKGVsZW1lbnQpOwogIH0KCiAgRSByZWR1Y2UoRSBjb21iaW5lKEUgdmFsdWUsIEUgZWxlbWVudCkpIHsKICAgIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcjsKICAgIGlmICghaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIH0KICAgIEUgdmFsdWUgPSBpdGVyYXRvci5jdXJyZW50OwogICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgdmFsdWUgPSBjb21iaW5lKHZhbHVlLCBpdGVyYXRvci5jdXJyZW50KTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CgogIFQgZm9sZDxUPihUIGluaXRpYWxWYWx1ZSwgVCBjb21iaW5lKFQgcHJldmlvdXNWYWx1ZSwgRSBlbGVtZW50KSkgewogICAgdmFyIHZhbHVlID0gaW5pdGlhbFZhbHVlOwogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgdmFsdWUgPSBjb21iaW5lKHZhbHVlLCBlbGVtZW50KTsKICAgIHJldHVybiB2YWx1ZTsKICB9CgogIGJvb2wgZXZlcnkoYm9vbCBmKEUgZWxlbWVudCkpIHsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHsKICAgICAgaWYgKCFmKGVsZW1lbnQpKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIFN0cmluZyBqb2luKFtTdHJpbmcgc2VwYXJhdG9yID0gIiJdKSB7CiAgICBJdGVyYXRvcjxFPiBpdGVyYXRvciA9IHRoaXMuaXRlcmF0b3I7CiAgICBpZiAoIWl0ZXJhdG9yLm1vdmVOZXh0KCkpIHJldHVybiAiIjsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBTdHJpbmdCdWZmZXIoKTsKICAgIGlmIChzZXBhcmF0b3IgPT0gbnVsbCB8fCBzZXBhcmF0b3IgPT0gIiIpIHsKICAgICAgZG8gewogICAgICAgIGJ1ZmZlci53cml0ZShpdGVyYXRvci5jdXJyZW50KTsKICAgICAgfSB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSk7CiAgICB9IGVsc2UgewogICAgICBidWZmZXIud3JpdGUoaXRlcmF0b3IuY3VycmVudCk7CiAgICAgIHdoaWxlIChpdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgICAgYnVmZmVyLndyaXRlKHNlcGFyYXRvcik7CiAgICAgICAgYnVmZmVyLndyaXRlKGl0ZXJhdG9yLmN1cnJlbnQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgfQoKICBib29sIGFueShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAodGVzdChlbGVtZW50KSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBJdGVyYWJsZTxFPiB0YWtlKGludCBuKSB7CiAgICByZXR1cm4gVGFrZUl0ZXJhYmxlPEU+KHRoaXMsIG4pOwogIH0KCiAgSXRlcmFibGU8RT4gdGFrZVdoaWxlKGJvb2wgdGVzdChFIHZhbHVlKSkgewogICAgcmV0dXJuIFRha2VXaGlsZUl0ZXJhYmxlPEU+KHRoaXMsIHRlc3QpOwogIH0KCiAgSXRlcmFibGU8RT4gc2tpcChpbnQgbikgewogICAgcmV0dXJuIFNraXBJdGVyYWJsZTxFPih0aGlzLCBuKTsKICB9CgogIEl0ZXJhYmxlPEU+IHNraXBXaGlsZShib29sIHRlc3QoRSB2YWx1ZSkpIHsKICAgIHJldHVybiBTa2lwV2hpbGVJdGVyYWJsZTxFPih0aGlzLCB0ZXN0KTsKICB9CgogIEUgZ2V0IGZpcnN0IHsKICAgIEl0ZXJhdG9yPEU+IGl0ID0gaXRlcmF0b3I7CiAgICBpZiAoIWl0Lm1vdmVOZXh0KCkpIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB9CiAgICByZXR1cm4gaXQuY3VycmVudDsKICB9CgogIEUgZ2V0IGxhc3QgewogICAgSXRlcmF0b3I8RT4gaXQgPSBpdGVyYXRvcjsKICAgIGlmICghaXQubW92ZU5leHQoKSkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIH0KICAgIEUgcmVzdWx0OwogICAgZG8gewogICAgICByZXN1bHQgPSBpdC5jdXJyZW50OwogICAgfSB3aGlsZSAoaXQubW92ZU5leHQoKSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgRSBmaXJzdFdoZXJlKGJvb2wgdGVzdChFIHZhbHVlKSwge0Ugb3JFbHNlKCl9KSB7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSByZXR1cm4gZWxlbWVudDsKICAgIH0KICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBFIGxhc3RXaGVyZShib29sIHRlc3QoRSB2YWx1ZSksIHtFIG9yRWxzZSgpfSkgewogICAgRSByZXN1bHQ7CiAgICBib29sIGZvdW5kTWF0Y2hpbmcgPSBmYWxzZTsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHsKICAgICAgICByZXN1bHQgPSBlbGVtZW50OwogICAgICAgIGZvdW5kTWF0Y2hpbmcgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBpZiAoZm91bmRNYXRjaGluZykgcmV0dXJuIHJlc3VsdDsKICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBFIHNpbmdsZVdoZXJlKGJvb2wgdGVzdChFIHZhbHVlKSwge0Ugb3JFbHNlKCl9KSB7CiAgICBFIHJlc3VsdDsKICAgIGJvb2wgZm91bmRNYXRjaGluZyA9IGZhbHNlOwogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAodGVzdChlbGVtZW50KSkgewogICAgICAgIGlmIChmb3VuZE1hdGNoaW5nKSB7CiAgICAgICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IGVsZW1lbnQ7CiAgICAgICAgZm91bmRNYXRjaGluZyA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIGlmIChmb3VuZE1hdGNoaW5nKSByZXR1cm4gcmVzdWx0OwogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEUgZWxlbWVudEF0KGludCBpbmRleCkgewogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoaW5kZXgsICJpbmRleCIpOwogICAgUmFuZ2VFcnJvci5jaGVja05vdE5lZ2F0aXZlKGluZGV4LCAiaW5kZXgiKTsKICAgIGludCBlbGVtZW50SW5kZXggPSAwOwogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAoaW5kZXggPT0gZWxlbWVudEluZGV4KSByZXR1cm4gZWxlbWVudDsKICAgICAgZWxlbWVudEluZGV4Kys7CiAgICB9CiAgICB0aHJvdyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiLCBudWxsLCBlbGVtZW50SW5kZXgpOwogIH0KfQoKLy8vIEJhc2UgaW1wbGVtZW50YXRpb24gb2YgW1NldF0uCi8vLwovLy8gVGhpcyBjbGFzcyBwcm92aWRlcyBhIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYSBgU2V0YCB0aGF0IGRlcGVuZHMgb25seQovLy8gb24gdGhlIGFic3RyYWN0IG1lbWJlcnM6IFthZGRdLCBbY29udGFpbnNdLCBbbG9va3VwXSwgW3JlbW92ZV0sCi8vLyBbaXRlcmF0b3JdLCBbbGVuZ3RoXSBhbmQgW3RvU2V0XS4KLy8vCi8vLyBTb21lIG9mIHRoZSBtZXRob2RzIGFzc3VtZSB0aGF0IGB0b1NldGAgY3JlYXRlcyBhIG1vZGlmaWFibGUgc2V0LgovLy8gSWYgdXNpbmcgdGhpcyBiYXNlIGNsYXNzIGZvciBhbiB1bm1vZGlmaWFibGUgc2V0LAovLy8gd2hlcmUgYHRvU2V0YCBzaG91bGQgcmV0dXJuIGFuIHVubW9kaWZpYWJsZSBzZXQsCi8vLyBpdCdzIG5lY2Vzc2FyeSB0byByZWltcGxlbWVudAovLy8gW3JldGFpbkFsbF0sIFt1bmlvbl0sIFtpbnRlcnNlY3Rpb25dIGFuZCBbZGlmZmVyZW5jZV0uCi8vLwovLy8gSW1wbGVtZW50YXRpb25zIG9mIGBTZXRgIHVzaW5nIHRoaXMgYmFzZSBzaG91bGQgY29uc2lkZXIgYWxzbyBpbXBsZW1lbnRpbmcKLy8vIGBjbGVhcmAgaW4gY29uc3RhbnQgdGltZS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd29ya3MgYnkgcmVtb3ZpbmcgZXZlcnkKLy8vIGVsZW1lbnQuCmFic3RyYWN0IGNsYXNzIFNldEJhc2U8RT4gZXh0ZW5kcyBPYmplY3Qgd2l0aCBTZXRNaXhpbjxFPiB7CiAgLy8vIENvbnZlcnQgYSBgU2V0YCB0byBhIHN0cmluZyBhcyBge2VhY2gsIGVsZW1lbnQsIGFzLCBzdHJpbmd9YC4KICAvLy8KICAvLy8gSGFuZGxlcyBjaXJjdWxhciByZWZlcmVuY2VzIHdoZXJlIGNvbnZlcnRpbmcgb25lIG9mIHRoZSBlbGVtZW50cwogIC8vLyB0byBhIHN0cmluZyBlbmRzIHVwIGNvbnZlcnRpbmcgW3NldF0gdG8gYSBzdHJpbmcgYWdhaW4uCiAgc3RhdGljIFN0cmluZyBzZXRUb1N0cmluZyhTZXQgc2V0KSA9PgogICAgICBJdGVyYWJsZUJhc2UuaXRlcmFibGVUb0Z1bGxTdHJpbmcoc2V0LCAneycsICd9Jyk7Cn0KCi8vLyBDb21tb24gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2Ygc29tZSBbU2V0XSBtZXRob2RzLgovLyBUT0RPKDM1NTQ4KTogTWFrZSB0aGlzIG1peC1pbiBTZXRNaXhpbiwgYnkgYWRkaW5nIGB3aXRoIFNldE1peGluPEU+YAovLyBhbmQgcmVtb3ZpbmcgdGhlIGNvcGllZCBtZW1iZXJzIGJlbG93LAovLyB3aGVuIGFuYWx5emVyIHN1cHBvcnRzIGNvbnN0IGNvbnN0cnVjdG9ycyBmb3IgbWl4aW4gYXBwbGljYXRpb25zLgphYnN0cmFjdCBjbGFzcyBfU2V0QmFzZTxFPiBpbXBsZW1lbnRzIFNldDxFPiB7CiAgLy8gVGhlIGZvbGxvd2luZyB0d28gbWV0aG9kcyBvdmVycmlkZSB0aGUgb25lcyBpbiBTZXRCYXNlLgogIC8vIEl0J3MgcG9zc2libGUgdG8gYmUgbW9yZSBlZmZpY2llbnQgaWYgd2UgaGF2ZSBhIHdheSB0byBjcmVhdGUgYW4gZW1wdHkKICAvLyBzZXQgb2YgdGhlIGNvcnJlY3QgdHlwZS4KICBjb25zdCBfU2V0QmFzZSgpOwoKICBTZXQ8RT4gX25ld1NldCgpOwoKICBTZXQ8Uj4gX25ld1NpbWlsYXJTZXQ8Uj4oKTsKCiAgU2V0PFI+IGNhc3Q8Uj4oKSA9PiBTZXQuY2FzdEZyb208RSwgUj4odGhpcywgbmV3U2V0OiBfbmV3U2ltaWxhclNldCk7CgogIFNldDxFPiBkaWZmZXJlbmNlKFNldDxPYmplY3Q+IG90aGVyKSB7CiAgICBTZXQ8RT4gcmVzdWx0ID0gX25ld1NldCgpOwogICAgZm9yICh2YXIgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICghb3RoZXIuY29udGFpbnMoZWxlbWVudCkpIHJlc3VsdC5hZGQoZWxlbWVudCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgU2V0PEU+IGludGVyc2VjdGlvbihTZXQ8T2JqZWN0PiBvdGhlcikgewogICAgU2V0PEU+IHJlc3VsdCA9IF9uZXdTZXQoKTsKICAgIGZvciAodmFyIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAob3RoZXIuY29udGFpbnMoZWxlbWVudCkpIHJlc3VsdC5hZGQoZWxlbWVudCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8gU3ViY2xhc3NlcyBjYW4gb3B0aW1pemUgdGhpcyBmdXJ0aGVyLgogIFNldDxFPiB0b1NldCgpID0+IF9uZXdTZXQoKS4uYWRkQWxsKHRoaXMpOwoKICAvLy8gVE9ETygzNTU0OCk6IFJlbW92ZSB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9ucyBhZ2FpbiB3aGVuIHRoZSBhbmFseXplcgogIC8vLyBzdXBwb3J0cyBtaXhpbnMgd2l0aCBjb25zdCBjb25zdHJ1Y3RvcnMsIGFuZCBtaXggaW4gYFNldE1peGluYCBpbnN0ZWFkLgoKICBib29sIGdldCBpc0VtcHR5ID0+IGxlbmd0aCA9PSAwOwoKICBib29sIGdldCBpc05vdEVtcHR5ID0+IGxlbmd0aCAhPSAwOwoKICBJdGVyYWJsZTxFPiBmb2xsb3dlZEJ5KEl0ZXJhYmxlPEU+IG90aGVyKSA9PgogICAgICBGb2xsb3dlZEJ5SXRlcmFibGU8RT4uZmlyc3RFZmZpY2llbnQodGhpcywgb3RoZXIpOwoKICBJdGVyYWJsZTxUPiB3aGVyZVR5cGU8VD4oKSA9PiBXaGVyZVR5cGVJdGVyYWJsZTxUPih0aGlzKTsKCiAgdm9pZCBjbGVhcigpIHsKICAgIHJlbW92ZUFsbCh0b0xpc3QoKSk7CiAgfQoKICB2b2lkIGFkZEFsbChJdGVyYWJsZTxFPiBlbGVtZW50cykgewogICAgZm9yIChFIGVsZW1lbnQgaW4gZWxlbWVudHMpIGFkZChlbGVtZW50KTsKICB9CgogIHZvaWQgcmVtb3ZlQWxsKEl0ZXJhYmxlPE9iamVjdD4gZWxlbWVudHMpIHsKICAgIGZvciAoT2JqZWN0IGVsZW1lbnQgaW4gZWxlbWVudHMpIHJlbW92ZShlbGVtZW50KTsKICB9CgogIHZvaWQgcmV0YWluQWxsKEl0ZXJhYmxlPE9iamVjdD4gZWxlbWVudHMpIHsKICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIHNldCwgcmVtb3ZlIGFsbCBvZiBlbGVtZW50cyBmcm9tIHRoZSBjb3B5LAogICAgLy8gdGhlbiByZW1vdmUgYWxsIHJlbWFpbmluZyBlbGVtZW50cyBpbiBjb3B5IGZyb20gdGhpcy4KICAgIFNldDxFPiB0b1JlbW92ZSA9IHRvU2V0KCk7CiAgICBmb3IgKE9iamVjdCBvIGluIGVsZW1lbnRzKSB7CiAgICAgIHRvUmVtb3ZlLnJlbW92ZShvKTsKICAgIH0KICAgIHJlbW92ZUFsbCh0b1JlbW92ZSk7CiAgfQoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICBMaXN0IHRvUmVtb3ZlID0gW107CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSB0b1JlbW92ZS5hZGQoZWxlbWVudCk7CiAgICB9CiAgICByZW1vdmVBbGwodG9SZW1vdmUpOwogIH0KCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgTGlzdCB0b1JlbW92ZSA9IFtdOwogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAoIXRlc3QoZWxlbWVudCkpIHRvUmVtb3ZlLmFkZChlbGVtZW50KTsKICAgIH0KICAgIHJlbW92ZUFsbCh0b1JlbW92ZSk7CiAgfQoKICBib29sIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPE9iamVjdD4gb3RoZXIpIHsKICAgIGZvciAoT2JqZWN0IG8gaW4gb3RoZXIpIHsKICAgICAgaWYgKCFjb250YWlucyhvKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBTZXQ8RT4gdW5pb24oU2V0PEU+IG90aGVyKSB7CiAgICByZXR1cm4gdG9TZXQoKS4uYWRkQWxsKG90aGVyKTsKICB9CgogIExpc3Q8RT4gdG9MaXN0KHtib29sIGdyb3dhYmxlID0gdHJ1ZX0pIHsKICAgIExpc3Q8RT4gcmVzdWx0ID0gZ3Jvd2FibGUgPyAoPEU+W10uLmxlbmd0aCA9IGxlbmd0aCkgOiBMaXN0PEU+KGxlbmd0aCk7CiAgICBpbnQgaSA9IDA7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSByZXN1bHRbaSsrXSA9IGVsZW1lbnQ7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgSXRlcmFibGU8VD4gbWFwPFQ+KFQgZihFIGVsZW1lbnQpKSA9PgogICAgICBFZmZpY2llbnRMZW5ndGhNYXBwZWRJdGVyYWJsZTxFLCBUPih0aGlzLCBmKTsKCiAgRSBnZXQgc2luZ2xlIHsKICAgIGlmIChsZW5ndGggPiAxKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgICBJdGVyYXRvcjxFPiBpdCA9IGl0ZXJhdG9yOwogICAgaWYgKCFpdC5tb3ZlTmV4dCgpKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIEUgcmVzdWx0ID0gaXQuY3VycmVudDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBJdGVyYWJsZUJhc2UuaXRlcmFibGVUb0Z1bGxTdHJpbmcodGhpcywgJ3snLCAnfScpOwoKICBJdGVyYWJsZTxFPiB3aGVyZShib29sIGYoRSBlbGVtZW50KSkgPT4gV2hlcmVJdGVyYWJsZTxFPih0aGlzLCBmKTsKCiAgSXRlcmFibGU8VD4gZXhwYW5kPFQ+KEl0ZXJhYmxlPFQ+IGYoRSBlbGVtZW50KSkgPT4KICAgICAgRXhwYW5kSXRlcmFibGU8RSwgVD4odGhpcywgZik7CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoRSBlbGVtZW50KSkgewogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgZihlbGVtZW50KTsKICB9CgogIEUgcmVkdWNlKEUgY29tYmluZShFIHZhbHVlLCBFIGVsZW1lbnQpKSB7CiAgICBJdGVyYXRvcjxFPiBpdGVyYXRvciA9IHRoaXMuaXRlcmF0b3I7CiAgICBpZiAoIWl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB9CiAgICBFIHZhbHVlID0gaXRlcmF0b3IuY3VycmVudDsKICAgIHdoaWxlIChpdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgaXRlcmF0b3IuY3VycmVudCk7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBUIGZvbGQ8VD4oVCBpbml0aWFsVmFsdWUsIFQgY29tYmluZShUIHByZXZpb3VzVmFsdWUsIEUgZWxlbWVudCkpIHsKICAgIHZhciB2YWx1ZSA9IGluaXRpYWxWYWx1ZTsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgZWxlbWVudCk7CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBib29sIGV2ZXJ5KGJvb2wgZihFIGVsZW1lbnQpKSB7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICghZihlbGVtZW50KSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBTdHJpbmcgam9pbihbU3RyaW5nIHNlcGFyYXRvciA9ICIiXSkgewogICAgSXRlcmF0b3I8RT4gaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yOwogICAgaWYgKCFpdGVyYXRvci5tb3ZlTmV4dCgpKSByZXR1cm4gIiI7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gU3RyaW5nQnVmZmVyKCk7CiAgICBpZiAoc2VwYXJhdG9yID09IG51bGwgfHwgc2VwYXJhdG9yID09ICIiKSB7CiAgICAgIGRvIHsKICAgICAgICBidWZmZXIud3JpdGUoaXRlcmF0b3IuY3VycmVudCk7CiAgICAgIH0gd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpOwogICAgfSBlbHNlIHsKICAgICAgYnVmZmVyLndyaXRlKGl0ZXJhdG9yLmN1cnJlbnQpOwogICAgICB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICAgIGJ1ZmZlci53cml0ZShzZXBhcmF0b3IpOwogICAgICAgIGJ1ZmZlci53cml0ZShpdGVyYXRvci5jdXJyZW50KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgYm9vbCBhbnkoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgSXRlcmFibGU8RT4gdGFrZShpbnQgbikgewogICAgcmV0dXJuIFRha2VJdGVyYWJsZTxFPih0aGlzLCBuKTsKICB9CgogIEl0ZXJhYmxlPEU+IHRha2VXaGlsZShib29sIHRlc3QoRSB2YWx1ZSkpIHsKICAgIHJldHVybiBUYWtlV2hpbGVJdGVyYWJsZTxFPih0aGlzLCB0ZXN0KTsKICB9CgogIEl0ZXJhYmxlPEU+IHNraXAoaW50IG4pIHsKICAgIHJldHVybiBTa2lwSXRlcmFibGU8RT4odGhpcywgbik7CiAgfQoKICBJdGVyYWJsZTxFPiBza2lwV2hpbGUoYm9vbCB0ZXN0KEUgdmFsdWUpKSB7CiAgICByZXR1cm4gU2tpcFdoaWxlSXRlcmFibGU8RT4odGhpcywgdGVzdCk7CiAgfQoKICBFIGdldCBmaXJzdCB7CiAgICBJdGVyYXRvcjxFPiBpdCA9IGl0ZXJhdG9yOwogICAgaWYgKCFpdC5tb3ZlTmV4dCgpKSB7CiAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgfQogICAgcmV0dXJuIGl0LmN1cnJlbnQ7CiAgfQoKICBFIGdldCBsYXN0IHsKICAgIEl0ZXJhdG9yPEU+IGl0ID0gaXRlcmF0b3I7CiAgICBpZiAoIWl0Lm1vdmVOZXh0KCkpIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB9CiAgICBFIHJlc3VsdDsKICAgIGRvIHsKICAgICAgcmVzdWx0ID0gaXQuY3VycmVudDsKICAgIH0gd2hpbGUgKGl0Lm1vdmVOZXh0KCkpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEUgZmlyc3RXaGVyZShib29sIHRlc3QoRSB2YWx1ZSksIHtFIG9yRWxzZSgpfSkgewogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAodGVzdChlbGVtZW50KSkgcmV0dXJuIGVsZW1lbnQ7CiAgICB9CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRSBsYXN0V2hlcmUoYm9vbCB0ZXN0KEUgdmFsdWUpLCB7RSBvckVsc2UoKX0pIHsKICAgIEUgcmVzdWx0OwogICAgYm9vbCBmb3VuZE1hdGNoaW5nID0gZmFsc2U7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSB7CiAgICAgICAgcmVzdWx0ID0gZWxlbWVudDsKICAgICAgICBmb3VuZE1hdGNoaW5nID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgaWYgKGZvdW5kTWF0Y2hpbmcpIHJldHVybiByZXN1bHQ7CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRSBzaW5nbGVXaGVyZShib29sIHRlc3QoRSB2YWx1ZSksIHtFIG9yRWxzZSgpfSkgewogICAgRSByZXN1bHQ7CiAgICBib29sIGZvdW5kTWF0Y2hpbmcgPSBmYWxzZTsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHsKICAgICAgICBpZiAoZm91bmRNYXRjaGluZykgewogICAgICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQgPSBlbGVtZW50OwogICAgICAgIGZvdW5kTWF0Y2hpbmcgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBpZiAoZm91bmRNYXRjaGluZykgcmV0dXJuIHJlc3VsdDsKICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBFIGVsZW1lbnRBdChpbnQgaW5kZXgpIHsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKGluZGV4LCAiaW5kZXgiKTsKICAgIFJhbmdlRXJyb3IuY2hlY2tOb3ROZWdhdGl2ZShpbmRleCwgImluZGV4Iik7CiAgICBpbnQgZWxlbWVudEluZGV4ID0gMDsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHsKICAgICAgaWYgKGluZGV4ID09IGVsZW1lbnRJbmRleCkgcmV0dXJuIGVsZW1lbnQ7CiAgICAgIGVsZW1lbnRJbmRleCsrOwogICAgfQogICAgdGhyb3cgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4IiwgbnVsbCwgZWxlbWVudEluZGV4KTsKICB9Cn0KCi8vLyBDbGFzcyB1c2VkIHRvIGltcGxlbWVudCBjb25zdCBzZXRzLgpjbGFzcyBfVW5tb2RpZmlhYmxlU2V0PEU+IGV4dGVuZHMgX1NldEJhc2U8RT4gewogIGZpbmFsIE1hcDxFLCBOdWxsPiBfbWFwOwoKICBjb25zdCBfVW5tb2RpZmlhYmxlU2V0KHRoaXMuX21hcCk7CgogIFNldDxFPiBfbmV3U2V0KCkgPT4gTGlua2VkSGFzaFNldDxFPigpOwoKICBTZXQ8Uj4gX25ld1NpbWlsYXJTZXQ8Uj4oKSA9PiBMaW5rZWRIYXNoU2V0PFI+KCk7CgogIC8vIExvb2t1cHMgdXNlIG1hcCBtZXRob2RzLgoKICBib29sIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KSA9PiBfbWFwLmNvbnRhaW5zS2V5KGVsZW1lbnQpOwoKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3IgPT4gX21hcC5rZXlzLml0ZXJhdG9yOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfbWFwLmxlbmd0aDsKCiAgRSBsb29rdXAoT2JqZWN0IGVsZW1lbnQpIHsKICAgIGZvciAodmFyIGtleSBpbiBfbWFwLmtleXMpIHsKICAgICAgaWYgKGtleSA9PSBlbGVtZW50KSByZXR1cm4ga2V5OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLyBNdXRhdGluZyBtZXRob2RzIHRocm93LgoKICBib29sIGFkZChFIHZhbHVlKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgY2hhbmdlIHVubW9kaWZpYWJsZSBzZXQiKTsKICB9CgogIHZvaWQgY2xlYXIoKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgY2hhbmdlIHVubW9kaWZpYWJsZSBzZXQiKTsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGVsZW1lbnRzKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgY2hhbmdlIHVubW9kaWZpYWJsZSBzZXQiKTsKICB9CgogIHZvaWQgcmVtb3ZlQWxsKEl0ZXJhYmxlPE9iamVjdD4gZWxlbWVudHMpIHsKICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBjaGFuZ2UgdW5tb2RpZmlhYmxlIHNldCIpOwogIH0KCiAgdm9pZCByZXRhaW5BbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cykgewogICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGNoYW5nZSB1bm1vZGlmaWFibGUgc2V0Iik7CiAgfQoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgY2hhbmdlIHVubW9kaWZpYWJsZSBzZXQiKTsKICB9CgogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBjaGFuZ2UgdW5tb2RpZmlhYmxlIHNldCIpOwogIH0KCiAgYm9vbCByZW1vdmUoT2JqZWN0IHZhbHVlKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgY2hhbmdlIHVubW9kaWZpYWJsZSBzZXQiKTsKICB9Cn0KgngATk48ASMZASMES0QmBEYxNSI7BFBRDS81S0cBFQEhARwBHQEcARIBEgEjASYBMC85ATwBERkEASYuBAEuNgQBLkc9HyEaBhkEASsYHjAGGQQBKxgeMQYZBAEtHiYGEQQBHyMEASsdHjwGEwQBKR0eOwYTBAErTA8zEwQBKDQBETofQBsTBAFKASA3AUUBNSUBJCgEASwqIC4GICIwBhIEAUUePRIEASIeJQYRBAEpKikqMAsoJQ0mJCEoCAYeBAEjHiYGEgQBHCUEAS4tBAEcJQQBLi0EARAfGi4GFwQBDx8aLgYOCRsdEwQBMx4pBiksBAEyDiAeGxoeCAYmKSwEATQOIB4bHTAKGh4IBiYpLAQBGzAxGh4xFgZGBAIBIgRLRCYERjY1IjsET1ENPEQGRz4oOAIBOkgqRS89TB4UARQBHgFIASkfIDkGEwQBKx8gOAYTBAErLQFNTgEjASYBLzkBPAERGQQBJi4EAS42BAEuRz0fIRoGGQQBKxgeMAYZBAErGB4xBhkEAS0eJgYRBAEfIwQBK0wPMxMEASg0ARE6H0AbEwQBSgFFATUlASQoBAEsKiAuBiAiMAYSBAFFHj0SBAEiHiUGEQQBKSopKjALKCUNJiQhKAgGHgQBIx4mBhIEARwlBAEuLQQBHCUEAS4tBAEQHxouBhcEAQ8fGi4GDgkbHRMEATMeKQYpLAQBMg4gHhsaHggGJiksBAE0DiAeGx0wChoeCAYmKSwEARswMRoeMRYGRgQCASgwGwElASoBNAEeAT4BMgEhAR0hJgYRBAEdARY+BAERPgQBJj4EAS4+BAEuPgQBKz4EASs+BAEePgQCARhkYXJ0OmNvbGxlY3Rpb24vc2V0LmRhcnQ0b3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvbGxlY3Rpb24vaGFzaF9zZXQuZGFydJN7Ly8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb2xsZWN0aW9uOwoKLy8vIEFuIHVub3JkZXJlZCBoYXNoLXRhYmxlIGJhc2VkIFtTZXRdIGltcGxlbWVudGF0aW9uLgovLy8KLy8vIFRoZSBlbGVtZW50cyBvZiBhIGBIYXNoU2V0YCBtdXN0IGhhdmUgY29uc2lzdGVudCBlcXVhbGl0eQovLy8gYW5kIGhhc2hDb2RlIGltcGxlbWVudGF0aW9ucy4gVGhpcyBtZWFucyB0aGF0IHRoZSBlcXVhbHMgb3BlcmF0aW9uCi8vLyBtdXN0IGRlZmluZSBhIHN0YWJsZSBlcXVpdmFsZW5jZSByZWxhdGlvbiBvbiB0aGUgZWxlbWVudHMgKHJlZmxleGl2ZSwKLy8vIHN5bW1ldHJpYywgdHJhbnNpdGl2ZSwgYW5kIGNvbnNpc3RlbnQgb3ZlciB0aW1lKSwgYW5kIHRoYXQgdGhlIGhhc2hDb2RlCi8vLyBtdXN0IGNvbnNpc3RlbnQgd2l0aCBlcXVhbGl0eSwgc28gdGhhdCB0aGUgc2FtZSBmb3Igb2JqZWN0cyB0aGF0IGFyZQovLy8gY29uc2lkZXJlZCBlcXVhbC4KLy8vCi8vLyBUaGUgc2V0IGFsbG93cyBgbnVsbGAgYXMgYW4gZWxlbWVudC4KLy8vCi8vLyBNb3N0IHNpbXBsZSBvcGVyYXRpb25zIG9uIGBIYXNoU2V0YCBhcmUgZG9uZSBpbiAocG90ZW50aWFsbHkgYW1vcnRpemVkKQovLy8gY29uc3RhbnQgdGltZTogW2FkZF0sIFtjb250YWluc10sIFtyZW1vdmVdLCBhbmQgW2xlbmd0aF0sIHByb3ZpZGVkIHRoZSBoYXNoCi8vLyBjb2RlcyBvZiBvYmplY3RzIGFyZSB3ZWxsIGRpc3RyaWJ1dGVkLgovLy8KLy8vIFRoZSBpdGVyYXRpb24gb3JkZXIgb2YgdGhlIHNldCBpcyBub3Qgc3BlY2lmaWVkIGFuZCBkZXBlbmRzIG9uCi8vLyB0aGUgaGFzaGNvZGVzIG9mIHRoZSBwcm92aWRlZCBlbGVtZW50cy4gSG93ZXZlciwgdGhlIG9yZGVyIGlzIHN0YWJsZToKLy8vIG11bHRpcGxlIGl0ZXJhdGlvbnMgb3ZlciB0aGUgc2FtZSBzZXQgcHJvZHVjZSB0aGUgc2FtZSBvcmRlciwgYXMgbG9uZyBhcwovLy8gdGhlIHNldCBpcyBub3QgbW9kaWZpZWQuCmFic3RyYWN0IGNsYXNzIEhhc2hTZXQ8RT4gaW1wbGVtZW50cyBTZXQ8RT4gewogIC8vLyBDcmVhdGUgYSBoYXNoIHNldCB1c2luZyB0aGUgcHJvdmlkZWQgW2VxdWFsc10gYXMgZXF1YWxpdHkuCiAgLy8vCiAgLy8vIFRoZSBwcm92aWRlZCBbZXF1YWxzXSBtdXN0IGRlZmluZSBhIHN0YWJsZSBlcXVpdmFsZW5jZSByZWxhdGlvbiwgYW5kCiAgLy8vIFtoYXNoQ29kZV0gbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggW2VxdWFsc10uIElmIHRoZSBbZXF1YWxzXSBvciBbaGFzaENvZGVdCiAgLy8vIG1ldGhvZHMgd29uJ3Qgd29yayBvbiBhbGwgb2JqZWN0cywgYnV0IG9ubHkgb24gc29tZSBpbnN0YW5jZXMgb2YgRSwgdGhlCiAgLy8vIFtpc1ZhbGlkS2V5XSBwcmVkaWNhdGUgY2FuIGJlIHVzZWQgdG8gcmVzdHJpY3QgdGhlIGtleXMgdGhhdCB0aGUgZnVuY3Rpb25zCiAgLy8vIGFyZSBhcHBsaWVkIHRvLgogIC8vLyBBbnkga2V5IGZvciB3aGljaCBbaXNWYWxpZEtleV0gcmV0dXJucyBmYWxzZSBpcyBhdXRvbWF0aWNhbGx5IGFzc3VtZWQKICAvLy8gdG8gbm90IGJlIGluIHRoZSBzZXQgd2hlbiBhc2tpbmcgYGNvbnRhaW5zYC4KICAvLy8KICAvLy8gSWYgW2VxdWFsc10gb3IgW2hhc2hDb2RlXSBhcmUgb21pdHRlZCwgdGhlIHNldCB1c2VzCiAgLy8vIHRoZSBlbGVtZW50cycgaW50cmluc2ljIFtPYmplY3QuPT1dIGFuZCBbT2JqZWN0Lmhhc2hDb2RlXS4KICAvLy8KICAvLy8gSWYgeW91IHN1cHBseSBvbmUgb2YgW2VxdWFsc10gYW5kIFtoYXNoQ29kZV0sCiAgLy8vIHlvdSBzaG91bGQgZ2VuZXJhbGx5IGFsc28gdG8gc3VwcGx5IHRoZSBvdGhlci4KICAvLy8KICAvLy8gSWYgdGhlIHN1cHBsaWVkIGBlcXVhbHNgIG9yIGBoYXNoQ29kZWAgZnVuY3Rpb25zIHdvbid0IHdvcmsgb24gYWxsIFtFXQogIC8vLyBvYmplY3RzLCBhbmQgdGhlIG1hcCB3aWxsIGJlIHVzZWQgaW4gYSBzZXR0aW5nIHdoZXJlIGEgbm9uLWBFYCBvYmplY3QKICAvLy8gaXMgcGFzc2VkIHRvLCBlLmcuLCBgY29udGFpbnNgLCB0aGVuIHRoZSBbaXNWYWxpZEtleV0gZnVuY3Rpb24gc2hvdWxkCiAgLy8vIGFsc28gYmUgc3VwcGxpZWQuCiAgLy8vCiAgLy8vIElmIFtpc1ZhbGlkS2V5XSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byB0ZXN0aW5nIGlmIHRoZSBvYmplY3QgaXMgYW4KICAvLy8gW0VdIGluc3RhbmNlLiBUaGF0IG1lYW5zIHRoYXQ6CiAgLy8vCiAgLy8vICAgICBuZXcgSGFzaFNldDxpbnQ+KGVxdWFsczogKGludCBlMSwgaW50IGUyKSA9PiAoZTEgLSBlMikgJSA1ID09IDAsCiAgLy8vICAgICAgICAgICAgICAgICAgICAgIGhhc2hDb2RlOiAoaW50IGUpID0+IGUgJSA1KQogIC8vLwogIC8vLyBkb2VzIG5vdCBuZWVkIGFuIGBpc1ZhbGlkS2V5YCBhcmd1bWVudCwgYmVjYXVzZSBpdCBkZWZhdWx0cyB0byBvbmx5CiAgLy8vIGFjY2VwdGluZyBgaW50YCB2YWx1ZXMgd2hpY2ggYXJlIGFjY2VwdGVkIGJ5IGJvdGggYGVxdWFsc2AgYW5kIGBoYXNoQ29kZWAuCiAgLy8vCiAgLy8vIElmIG5laXRoZXIgYGVxdWFsc2AsIGBoYXNoQ29kZWAsIG5vciBgaXNWYWxpZEtleWAgaXMgcHJvdmlkZWQsCiAgLy8vIHRoZSBkZWZhdWx0IGBpc1ZhbGlkS2V5YCBpbnN0ZWFkIGFjY2VwdHMgYWxsIHZhbHVlcy4KICAvLy8gVGhlIGRlZmF1bHQgZXF1YWxpdHkgYW5kIGhhc2hjb2RlIG9wZXJhdGlvbnMgYXJlIGFzc3VtZWQgdG8gd29yayBvbiBhbGwKICAvLy8gb2JqZWN0cy4KICAvLy8KICAvLy8gTGlrZXdpc2UsIGlmIGBlcXVhbHNgIGlzIFtpZGVudGljYWxdLCBgaGFzaENvZGVgIGlzIFtpZGVudGl0eUhhc2hDb2RlXQogIC8vLyBhbmQgYGlzVmFsaWRLZXlgIGlzIG9taXR0ZWQsIHRoZSByZXN1bHRpbmcgc2V0IGlzIGlkZW50aXR5IGJhc2VkLAogIC8vLyBhbmQgdGhlIGBpc1ZhbGlkS2V5YCBkZWZhdWx0cyB0byBhY2NlcHRpbmcgYWxsIGtleXMuCiAgLy8vIFN1Y2ggYSBtYXAgY2FuIGJlIGNyZWF0ZWQgZGlyZWN0bHkgdXNpbmcgW0hhc2hTZXQuaWRlbnRpdHldLgogIGV4dGVybmFsIGZhY3RvcnkgSGFzaFNldCgKICAgICAge2Jvb2wgZXF1YWxzKEUgZTEsIEUgZTIpLAogICAgICBpbnQgaGFzaENvZGUoRSBlKSwKICAgICAgYm9vbCBpc1ZhbGlkS2V5KHBvdGVudGlhbEtleSl9KTsKCiAgLy8vIENyZWF0ZXMgYW4gdW5vcmRlcmVkIGlkZW50aXR5LWJhc2VkIHNldC4KICAvLy8KICAvLy8gRWZmZWN0aXZlbHkgYSBzaG9ydGhhbmQgZm9yOgogIC8vLwogIC8vLyAgICAgbmV3IEhhc2hTZXQ8RT4oZXF1YWxzOiBpZGVudGljYWwsCiAgLy8vICAgICAgICAgICAgICAgICAgICBoYXNoQ29kZTogaWRlbnRpdHlIYXNoQ29kZSkKICBleHRlcm5hbCBmYWN0b3J5IEhhc2hTZXQuaWRlbnRpdHkoKTsKCiAgLy8vIENyZWF0ZSBhIGhhc2ggc2V0IGNvbnRhaW5pbmcgYWxsIFtlbGVtZW50c10uCiAgLy8vCiAgLy8vIENyZWF0ZXMgYSBoYXNoIHNldCBhcyBieSBgbmV3IEhhc2hTZXQ8RT4oKWAgYW5kIGFkZHMgYWxsIGdpdmVuIFtlbGVtZW50c10KICAvLy8gdG8gdGhlIHNldC4gVGhlIGVsZW1lbnRzIGFyZSBhZGRlZCBpbiBvcmRlci4gSWYgW2VsZW1lbnRzXSBjb250YWlucwogIC8vLyB0d28gZW50cmllcyB0aGF0IGFyZSBlcXVhbCwgYnV0IG5vdCBpZGVudGljYWwsIHRoZW4gdGhlIGZpcnN0IG9uZSBpcwogIC8vLyB0aGUgb25lIGluIHRoZSByZXN1bHRpbmcgc2V0LgogIC8vLwogIC8vLyBBbGwgdGhlIFtlbGVtZW50c10gc2hvdWxkIGJlIGluc3RhbmNlcyBvZiBbRV0uCiAgLy8vIFRoZSBgZWxlbWVudHNgIGl0ZXJhYmxlIGl0c2VsZiBtYXkgaGF2ZSBhbnkgZWxlbWVudCB0eXBlLCBzbyB0aGlzCiAgLy8vIGNvbnN0cnVjdG9yIGNhbiBiZSB1c2VkIHRvIGRvd24tY2FzdCBhIGBTZXRgLCBmb3IgZXhhbXBsZSBhczoKICAvLy8gYGBgZGFydAogIC8vLyBTZXQ8U3VwZXJUeXBlPiBzdXBlclNldCA9IC4uLjsKICAvLy8gU2V0PFN1YlR5cGU+IHN1YlNldCA9CiAgLy8vICAgICBuZXcgSGFzaFNldDxTdWJUeXBlPi5mcm9tKHN1cGVyU2V0LndoZXJlVHlwZTxTdWJUeXBlPigpKTsKICAvLy8gYGBgCiAgZmFjdG9yeSBIYXNoU2V0LmZyb20oSXRlcmFibGUgZWxlbWVudHMpIHsKICAgIEhhc2hTZXQ8RT4gcmVzdWx0ID0gSGFzaFNldDxFPigpOwogICAgZm9yIChmaW5hbCBlIGluIGVsZW1lbnRzKSB7CiAgICAgIHJlc3VsdC5hZGQoZSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIENyZWF0ZSBhIGhhc2ggc2V0IGNvbnRhaW5pbmcgYWxsIFtlbGVtZW50c10uCiAgLy8vCiAgLy8vIENyZWF0ZXMgYSBoYXNoIHNldCBhcyBieSBgbmV3IEhhc2hTZXQ8RT4oKWAgYW5kIGFkZHMgYWxsIGdpdmVuIFtlbGVtZW50c10KICAvLy8gdG8gdGhlIHNldC4gVGhlIGVsZW1lbnRzIGFyZSBhZGRlZCBpbiBvcmRlci4gSWYgW2VsZW1lbnRzXSBjb250YWlucwogIC8vLyB0d28gZW50cmllcyB0aGF0IGFyZSBlcXVhbCwgYnV0IG5vdCBpZGVudGljYWwsIHRoZW4gdGhlIGZpcnN0IG9uZSBpcwogIC8vLyB0aGUgb25lIGluIHRoZSByZXN1bHRpbmcgc2V0LgogIGZhY3RvcnkgSGFzaFNldC5vZihJdGVyYWJsZTxFPiBlbGVtZW50cykgPT4gSGFzaFNldDxFPigpLi5hZGRBbGwoZWxlbWVudHMpOwoKICAvLy8gUHJvdmlkZXMgYW4gaXRlcmF0b3IgdGhhdCBpdGVyYXRlcyBvdmVyIHRoZSBlbGVtZW50cyBvZiB0aGlzIHNldC4KICAvLy8KICAvLy8gVGhlIG9yZGVyIG9mIGl0ZXJhdGlvbiBpcyB1bnNwZWNpZmllZCwKICAvLy8gYnV0IGNvbnNpc3RlbnQgYmV0d2VlbiBjaGFuZ2VzIHRvIHRoZSBzZXQuCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yOwp9CnUATk48ARkBOAQ+R0pMSRYEKQRMUCsEQ0pNHS5BBktRTlEWTDMGOkEGNDUGTUxMGAZNJQZLNwZKUQZFO04PBk1IO0McIBknAS8GIwYsNScBMwZQSkskBjVIRA4lHEQKLCYgFQYTBAEzBlBKSyROAUgGLTEcAgEdZGFydDpjb2xsZWN0aW9uL2hhc2hfc2V0LmRhcnQ0b3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvbGxlY3Rpb24vaXRlcmFibGUuZGFydK7MLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb2xsZWN0aW9uOwoKLy8vIFRoaXMgW0l0ZXJhYmxlXSBtaXhpbiBpbXBsZW1lbnRzIGFsbCBbSXRlcmFibGVdIG1lbWJlcnMgZXhjZXB0IGBpdGVyYXRvcmAuCi8vLwovLy8gQWxsIG90aGVyIG1ldGhvZHMgYXJlIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIGBpdGVyYXRvcmAuCmFic3RyYWN0IGNsYXNzIEl0ZXJhYmxlTWl4aW48RT4gaW1wbGVtZW50cyBJdGVyYWJsZTxFPiB7CiAgLy8gVGhpcyBjbGFzcyBoYXMgbWV0aG9kcyBjb3BpZWQgdmVyYmF0aW0gaW50bzoKICAvLyAtIEl0ZXJhYmxlQmFzZQogIC8vIC0gU2V0TWl4aW4KICAvLyBJZiBjaGFuZ2luZyBhIG1ldGhvZCBoZXJlLCBhbHNvIGNoYW5nZSB0aGUgb3RoZXIgY29waWVzLgoKICBJdGVyYWJsZTxSPiBjYXN0PFI+KCkgPT4gSXRlcmFibGUuY2FzdEZyb208RSwgUj4odGhpcyk7CiAgSXRlcmFibGU8VD4gbWFwPFQ+KFQgZihFIGVsZW1lbnQpKSA9PiBNYXBwZWRJdGVyYWJsZTxFLCBUPih0aGlzLCBmKTsKCiAgSXRlcmFibGU8RT4gd2hlcmUoYm9vbCBmKEUgZWxlbWVudCkpID0+IFdoZXJlSXRlcmFibGU8RT4odGhpcywgZik7CgogIEl0ZXJhYmxlPFQ+IHdoZXJlVHlwZTxUPigpID0+IFdoZXJlVHlwZUl0ZXJhYmxlPFQ+KHRoaXMpOwoKICBJdGVyYWJsZTxUPiBleHBhbmQ8VD4oSXRlcmFibGU8VD4gZihFIGVsZW1lbnQpKSA9PgogICAgICBFeHBhbmRJdGVyYWJsZTxFLCBUPih0aGlzLCBmKTsKCiAgSXRlcmFibGU8RT4gZm9sbG93ZWRCeShJdGVyYWJsZTxFPiBvdGhlcikgewogICAgLy8gVHlwZSB3b3JrYXJvdW5kIGJlY2F1c2UgSXRlcmFibGVNaXhpbjxFPiBkb2Vzbid0IHByb21vdGUKICAgIC8vIHRvIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+LgogICAgSXRlcmFibGU8RT4gc2VsZiA9IHRoaXM7CiAgICBpZiAoc2VsZiBpcyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxFPikgewogICAgICByZXR1cm4gRm9sbG93ZWRCeUl0ZXJhYmxlPEU+LmZpcnN0RWZmaWNpZW50KHNlbGYsIG90aGVyKTsKICAgIH0KICAgIHJldHVybiBGb2xsb3dlZEJ5SXRlcmFibGU8RT4odGhpcywgb3RoZXIpOwogIH0KCiAgYm9vbCBjb250YWlucyhPYmplY3QgZWxlbWVudCkgewogICAgZm9yIChFIGUgaW4gdGhpcykgewogICAgICBpZiAoZSA9PSBlbGVtZW50KSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoRSBlbGVtZW50KSkgewogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgZihlbGVtZW50KTsKICB9CgogIEUgcmVkdWNlKEUgY29tYmluZShFIHZhbHVlLCBFIGVsZW1lbnQpKSB7CiAgICBJdGVyYXRvcjxFPiBpdGVyYXRvciA9IHRoaXMuaXRlcmF0b3I7CiAgICBpZiAoIWl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB9CiAgICBFIHZhbHVlID0gaXRlcmF0b3IuY3VycmVudDsKICAgIHdoaWxlIChpdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgaXRlcmF0b3IuY3VycmVudCk7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBUIGZvbGQ8VD4oVCBpbml0aWFsVmFsdWUsIFQgY29tYmluZShUIHByZXZpb3VzVmFsdWUsIEUgZWxlbWVudCkpIHsKICAgIHZhciB2YWx1ZSA9IGluaXRpYWxWYWx1ZTsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgZWxlbWVudCk7CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBib29sIGV2ZXJ5KGJvb2wgZihFIGVsZW1lbnQpKSB7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICghZihlbGVtZW50KSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBTdHJpbmcgam9pbihbU3RyaW5nIHNlcGFyYXRvciA9ICIiXSkgewogICAgSXRlcmF0b3I8RT4gaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yOwogICAgaWYgKCFpdGVyYXRvci5tb3ZlTmV4dCgpKSByZXR1cm4gIiI7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gU3RyaW5nQnVmZmVyKCk7CiAgICBpZiAoc2VwYXJhdG9yID09IG51bGwgfHwgc2VwYXJhdG9yID09ICIiKSB7CiAgICAgIGRvIHsKICAgICAgICBidWZmZXIud3JpdGUoIiR7aXRlcmF0b3IuY3VycmVudH0iKTsKICAgICAgfSB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSk7CiAgICB9IGVsc2UgewogICAgICBidWZmZXIud3JpdGUoIiR7aXRlcmF0b3IuY3VycmVudH0iKTsKICAgICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgICBidWZmZXIud3JpdGUoc2VwYXJhdG9yKTsKICAgICAgICBidWZmZXIud3JpdGUoIiR7aXRlcmF0b3IuY3VycmVudH0iKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgYm9vbCBhbnkoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgTGlzdDxFPiB0b0xpc3Qoe2Jvb2wgZ3Jvd2FibGUgPSB0cnVlfSkgPT4KICAgICAgTGlzdDxFPi5mcm9tKHRoaXMsIGdyb3dhYmxlOiBncm93YWJsZSk7CgogIFNldDxFPiB0b1NldCgpID0+IFNldDxFPi5mcm9tKHRoaXMpOwoKICBpbnQgZ2V0IGxlbmd0aCB7CiAgICBhc3NlcnQodGhpcyBpcyEgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGUpOwogICAgaW50IGNvdW50ID0gMDsKICAgIEl0ZXJhdG9yIGl0ID0gaXRlcmF0b3I7CiAgICB3aGlsZSAoaXQubW92ZU5leHQoKSkgewogICAgICBjb3VudCsrOwogICAgfQogICAgcmV0dXJuIGNvdW50OwogIH0KCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiAhaXRlcmF0b3IubW92ZU5leHQoKTsKCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiAhaXNFbXB0eTsKCiAgSXRlcmFibGU8RT4gdGFrZShpbnQgY291bnQpIHsKICAgIHJldHVybiBUYWtlSXRlcmFibGU8RT4odGhpcywgY291bnQpOwogIH0KCiAgSXRlcmFibGU8RT4gdGFrZVdoaWxlKGJvb2wgdGVzdChFIHZhbHVlKSkgewogICAgcmV0dXJuIFRha2VXaGlsZUl0ZXJhYmxlPEU+KHRoaXMsIHRlc3QpOwogIH0KCiAgSXRlcmFibGU8RT4gc2tpcChpbnQgY291bnQpIHsKICAgIHJldHVybiBTa2lwSXRlcmFibGU8RT4odGhpcywgY291bnQpOwogIH0KCiAgSXRlcmFibGU8RT4gc2tpcFdoaWxlKGJvb2wgdGVzdChFIHZhbHVlKSkgewogICAgcmV0dXJuIFNraXBXaGlsZUl0ZXJhYmxlPEU+KHRoaXMsIHRlc3QpOwogIH0KCiAgRSBnZXQgZmlyc3QgewogICAgSXRlcmF0b3I8RT4gaXQgPSBpdGVyYXRvcjsKICAgIGlmICghaXQubW92ZU5leHQoKSkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIH0KICAgIHJldHVybiBpdC5jdXJyZW50OwogIH0KCiAgRSBnZXQgbGFzdCB7CiAgICBJdGVyYXRvcjxFPiBpdCA9IGl0ZXJhdG9yOwogICAgaWYgKCFpdC5tb3ZlTmV4dCgpKSB7CiAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgfQogICAgRSByZXN1bHQ7CiAgICBkbyB7CiAgICAgIHJlc3VsdCA9IGl0LmN1cnJlbnQ7CiAgICB9IHdoaWxlIChpdC5tb3ZlTmV4dCgpKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBFIGdldCBzaW5nbGUgewogICAgSXRlcmF0b3I8RT4gaXQgPSBpdGVyYXRvcjsKICAgIGlmICghaXQubW92ZU5leHQoKSkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICBFIHJlc3VsdCA9IGl0LmN1cnJlbnQ7CiAgICBpZiAoaXQubW92ZU5leHQoKSkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEUgZmlyc3RXaGVyZShib29sIHRlc3QoRSB2YWx1ZSksIHtFIG9yRWxzZSgpfSkgewogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAodGVzdChlbGVtZW50KSkgcmV0dXJuIGVsZW1lbnQ7CiAgICB9CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRSBsYXN0V2hlcmUoYm9vbCB0ZXN0KEUgdmFsdWUpLCB7RSBvckVsc2UoKX0pIHsKICAgIEUgcmVzdWx0OwogICAgYm9vbCBmb3VuZE1hdGNoaW5nID0gZmFsc2U7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSB7CiAgICAgICAgcmVzdWx0ID0gZWxlbWVudDsKICAgICAgICBmb3VuZE1hdGNoaW5nID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgaWYgKGZvdW5kTWF0Y2hpbmcpIHJldHVybiByZXN1bHQ7CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRSBzaW5nbGVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwge0Ugb3JFbHNlKCl9KSB7CiAgICBFIHJlc3VsdDsKICAgIGJvb2wgZm91bmRNYXRjaGluZyA9IGZhbHNlOwogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAodGVzdChlbGVtZW50KSkgewogICAgICAgIGlmIChmb3VuZE1hdGNoaW5nKSB7CiAgICAgICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IGVsZW1lbnQ7CiAgICAgICAgZm91bmRNYXRjaGluZyA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIGlmIChmb3VuZE1hdGNoaW5nKSByZXR1cm4gcmVzdWx0OwogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEUgZWxlbWVudEF0KGludCBpbmRleCkgewogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoaW5kZXgsICJpbmRleCIpOwogICAgUmFuZ2VFcnJvci5jaGVja05vdE5lZ2F0aXZlKGluZGV4LCAiaW5kZXgiKTsKICAgIGludCBlbGVtZW50SW5kZXggPSAwOwogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAoaW5kZXggPT0gZWxlbWVudEluZGV4KSByZXR1cm4gZWxlbWVudDsKICAgICAgZWxlbWVudEluZGV4Kys7CiAgICB9CiAgICB0aHJvdyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiLCBudWxsLCBlbGVtZW50SW5kZXgpOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gSXRlcmFibGVCYXNlLml0ZXJhYmxlVG9TaG9ydFN0cmluZyh0aGlzLCAnKCcsICcpJyk7Cn0KCi8vLyBCYXNlIGNsYXNzIGZvciBpbXBsZW1lbnRpbmcgW0l0ZXJhYmxlXS4KLy8vCi8vLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgYWxsIG1ldGhvZHMgb2YgW0l0ZXJhYmxlXSwgZXhjZXB0IFtJdGVyYWJsZS5pdGVyYXRvcl0sCi8vLyBpbiB0ZXJtcyBvZiBgaXRlcmF0b3JgLgphYnN0cmFjdCBjbGFzcyBJdGVyYWJsZUJhc2U8RT4gZXh0ZW5kcyBJdGVyYWJsZTxFPiB7CiAgY29uc3QgSXRlcmFibGVCYXNlKCk7CgogIC8vLyBDb252ZXJ0IGFuIGBJdGVyYWJsZWAgdG8gYSBzdHJpbmcgbGlrZSBbSXRlcmFibGVCYXNlLnRvU3RyaW5nXS4KICAvLy8KICAvLy8gQWxsb3dzIHVzaW5nIG90aGVyIGRlbGltaXRlcnMgdGhhbiAnKCcgYW5kICcpJy4KICAvLy8KICAvLy8gSGFuZGxlcyBjaXJjdWxhciByZWZlcmVuY2VzIHdoZXJlIGNvbnZlcnRpbmcgb25lIG9mIHRoZSBlbGVtZW50cwogIC8vLyB0byBhIHN0cmluZyBlbmRzIHVwIGNvbnZlcnRpbmcgW2l0ZXJhYmxlXSB0byBhIHN0cmluZyBhZ2Fpbi4KICBzdGF0aWMgU3RyaW5nIGl0ZXJhYmxlVG9TaG9ydFN0cmluZyhJdGVyYWJsZSBpdGVyYWJsZSwKICAgICAgW1N0cmluZyBsZWZ0RGVsaW1pdGVyID0gJygnLCBTdHJpbmcgcmlnaHREZWxpbWl0ZXIgPSAnKSddKSB7CiAgICBpZiAoX2lzVG9TdHJpbmdWaXNpdGluZyhpdGVyYWJsZSkpIHsKICAgICAgaWYgKGxlZnREZWxpbWl0ZXIgPT0gIigiICYmIHJpZ2h0RGVsaW1pdGVyID09ICIpIikgewogICAgICAgIC8vIEF2b2lkIGNyZWF0aW5nIGEgbmV3IHN0cmluZyBpbiB0aGUgImNvbW1vbiIgY2FzZS4KICAgICAgICByZXR1cm4gIiguLi4pIjsKICAgICAgfQogICAgICByZXR1cm4gIiRsZWZ0RGVsaW1pdGVyLi4uJHJpZ2h0RGVsaW1pdGVyIjsKICAgIH0KICAgIExpc3Q8U3RyaW5nPiBwYXJ0cyA9IDxTdHJpbmc+W107CiAgICBfdG9TdHJpbmdWaXNpdGluZy5hZGQoaXRlcmFibGUpOwogICAgdHJ5IHsKICAgICAgX2l0ZXJhYmxlUGFydHNUb1N0cmluZ3MoaXRlcmFibGUsIHBhcnRzKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGFzc2VydChpZGVudGljYWwoX3RvU3RyaW5nVmlzaXRpbmcubGFzdCwgaXRlcmFibGUpKTsKICAgICAgX3RvU3RyaW5nVmlzaXRpbmcucmVtb3ZlTGFzdCgpOwogICAgfQogICAgcmV0dXJuIChTdHJpbmdCdWZmZXIobGVmdERlbGltaXRlcikKICAgICAgICAgIC4ud3JpdGVBbGwocGFydHMsICIsICIpCiAgICAgICAgICAuLndyaXRlKHJpZ2h0RGVsaW1pdGVyKSkKICAgICAgICAudG9TdHJpbmcoKTsKICB9CgogIC8vLyBDb252ZXJ0cyBhbiBgSXRlcmFibGVgIHRvIGEgc3RyaW5nLgogIC8vLwogIC8vLyBDb252ZXJ0cyBlYWNoIGVsZW1lbnRzIHRvIGEgc3RyaW5nLCBhbmQgc2VwYXJhdGVzIHRoZSByZXN1bHRzIGJ5ICIsICIuCiAgLy8vIFRoZW4gd3JhcHMgdGhlIHJlc3VsdCBpbiBbbGVmdERlbGltaXRlcl0gYW5kIFtyaWdodERlbGltaXRlcl0uCiAgLy8vCiAgLy8vIFVubGlrZSBbaXRlcmFibGVUb1Nob3J0U3RyaW5nXSwgdGhpcyBjb252ZXJzaW9uIGRvZXNuJ3Qgb21pdCBhbnkKICAvLy8gZWxlbWVudHMgb3IgcHV0cyBhbnkgbGltaXQgb24gdGhlIHNpemUgb2YgdGhlIHJlc3VsdC4KICAvLy8KICAvLy8gSGFuZGxlcyBjaXJjdWxhciByZWZlcmVuY2VzIHdoZXJlIGNvbnZlcnRpbmcgb25lIG9mIHRoZSBlbGVtZW50cwogIC8vLyB0byBhIHN0cmluZyBlbmRzIHVwIGNvbnZlcnRpbmcgW2l0ZXJhYmxlXSB0byBhIHN0cmluZyBhZ2Fpbi4KICBzdGF0aWMgU3RyaW5nIGl0ZXJhYmxlVG9GdWxsU3RyaW5nKEl0ZXJhYmxlIGl0ZXJhYmxlLAogICAgICBbU3RyaW5nIGxlZnREZWxpbWl0ZXIgPSAnKCcsIFN0cmluZyByaWdodERlbGltaXRlciA9ICcpJ10pIHsKICAgIGlmIChfaXNUb1N0cmluZ1Zpc2l0aW5nKGl0ZXJhYmxlKSkgewogICAgICByZXR1cm4gIiRsZWZ0RGVsaW1pdGVyLi4uJHJpZ2h0RGVsaW1pdGVyIjsKICAgIH0KICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBTdHJpbmdCdWZmZXIobGVmdERlbGltaXRlcik7CiAgICBfdG9TdHJpbmdWaXNpdGluZy5hZGQoaXRlcmFibGUpOwogICAgdHJ5IHsKICAgICAgYnVmZmVyLndyaXRlQWxsKGl0ZXJhYmxlLCAiLCAiKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGFzc2VydChpZGVudGljYWwoX3RvU3RyaW5nVmlzaXRpbmcubGFzdCwgaXRlcmFibGUpKTsKICAgICAgX3RvU3RyaW5nVmlzaXRpbmcucmVtb3ZlTGFzdCgpOwogICAgfQogICAgYnVmZmVyLndyaXRlKHJpZ2h0RGVsaW1pdGVyKTsKICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9Cn0KCi8vLyBBIGNvbGxlY3Rpb24gdXNlZCB0byBpZGVudGlmeSBjeWNsaWMgbGlzdHMgZHVyaW5nIHRvU3RyaW5nKCkgY2FsbHMuCmZpbmFsIExpc3QgX3RvU3RyaW5nVmlzaXRpbmcgPSBbXTsKCi8vLyBDaGVjayBpZiB3ZSBhcmUgY3VycmVudGx5IHZpc2l0aW5nIGBvYCBpbiBhIHRvU3RyaW5nIGNhbGwuCmJvb2wgX2lzVG9TdHJpbmdWaXNpdGluZyhPYmplY3QgbykgewogIGZvciAoaW50IGkgPSAwOyBpIDwgX3RvU3RyaW5nVmlzaXRpbmcubGVuZ3RoOyBpKyspIHsKICAgIGlmIChpZGVudGljYWwobywgX3RvU3RyaW5nVmlzaXRpbmdbaV0pKSByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CgovLy8gQ29udmVydCBlbGVtZW50cyBvZiBbaXRlcmFibGVdIHRvIHN0cmluZ3MgYW5kIHN0b3JlIHRoZW0gaW4gW3BhcnRzXS4Kdm9pZCBfaXRlcmFibGVQYXJ0c1RvU3RyaW5ncyhJdGVyYWJsZSBpdGVyYWJsZSwgTGlzdDxTdHJpbmc+IHBhcnRzKSB7CiAgLyoKICAgKiBUaGlzIGlzIHRoZSBjb21wbGljYXRlZCBwYXJ0IG9mIFtpdGVyYWJsZVRvU2hvcnRTdHJpbmddLgogICAqIEl0IGlzIGV4dHJhY3RlZCBhcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGF2b2lkIGhhdmluZyB0b28gbXVjaCBjb2RlCiAgICogaW5zaWRlIHRoZSB0cnkvZmluYWxseS4KICAgKi8KICAvLy8gVHJ5IHRvIHN0YXkgYmVsb3cgdGhpcyBtYW55IGNoYXJhY3RlcnMuCiAgY29uc3QgaW50IGxlbmd0aExpbWl0ID0gODA7CgogIC8vLyBBbHdheXMgYXQgbGVhc3QgdGhpcyBtYW55IGVsZW1lbnRzIGF0IHRoZSBzdGFydC4KICBjb25zdCBpbnQgaGVhZENvdW50ID0gMzsKCiAgLy8vIEFsd2F5cyBhdCBsZWFzdCB0aGlzIG1hbnkgZWxlbWVudHMgYXQgdGhlIGVuZC4KICBjb25zdCBpbnQgdGFpbENvdW50ID0gMjsKCiAgLy8vIFN0b3AgaXRlcmF0aW5nIGFmdGVyIHRoaXMgbWFueSBlbGVtZW50cy4gSXRlcmFibGVzIGNhbiBiZSBpbmZpbml0ZS4KICBjb25zdCBpbnQgbWF4Q291bnQgPSAxMDA7CiAgLy8gUGVyIGVudHJ5IGxlbmd0aCBvdmVyaGVhZC4gSXQncyBmb3IgIiwgIiBmb3IgYWxsIGFmdGVyIHRoZSBmaXJzdCBlbnRyeSwKICAvLyBhbmQgZm9yICIoIiBhbmQgIikiIGZvciB0aGUgaW5pdGlhbCBlbnRyeS4gQnkgcHVyZSBsdWNrLCB0aGF0J3MgdGhlIHNhbWUKICAvLyBudW1iZXIuCiAgY29uc3QgaW50IG92ZXJoZWFkID0gMjsKICBjb25zdCBpbnQgZWxsaXBzaXNTaXplID0gMzsgLy8gIi4uLiIubGVuZ3RoLgoKICBpbnQgbGVuZ3RoID0gMDsKICBpbnQgY291bnQgPSAwOwogIEl0ZXJhdG9yIGl0ID0gaXRlcmFibGUuaXRlcmF0b3I7CiAgLy8gSW5pdGlhbCBydW4gb2YgZWxlbWVudHMsIGF0IGxlYXN0IGhlYWRDb3VudCwgYW5kIHRoZW4gY29udGludWUgdW50aWwKICAvLyBwYXNzaW5nIGF0IG1vc3QgbGVuZ3RoTGltaXQgY2hhcmFjdGVycy4KICB3aGlsZSAobGVuZ3RoIDwgbGVuZ3RoTGltaXQgfHwgY291bnQgPCBoZWFkQ291bnQpIHsKICAgIGlmICghaXQubW92ZU5leHQoKSkgcmV0dXJuOwogICAgU3RyaW5nIG5leHQgPSAiJHtpdC5jdXJyZW50fSI7CiAgICBwYXJ0cy5hZGQobmV4dCk7CiAgICBsZW5ndGggKz0gbmV4dC5sZW5ndGggKyBvdmVyaGVhZDsKICAgIGNvdW50Kys7CiAgfQoKICBTdHJpbmcgcGVudWx0aW1hdGVTdHJpbmc7CiAgU3RyaW5nIHVsdGltYXRlU3RyaW5nOwoKICAvLyBGaW5kIGxhc3QgdHdvIGVsZW1lbnRzLiBPbmUgb3IgbW9yZSBvZiB0aGVtIG1heSBhbHJlYWR5IGJlIGluIHRoZQogIC8vIHBhcnRzIGFycmF5LiBJbmNsdWRlIHRoZWlyIGxlbmd0aCBpbiBgbGVuZ3RoYC4KICBPYmplY3QgcGVudWx0aW1hdGU7CiAgT2JqZWN0IHVsdGltYXRlOwogIGlmICghaXQubW92ZU5leHQoKSkgewogICAgaWYgKGNvdW50IDw9IGhlYWRDb3VudCArIHRhaWxDb3VudCkgcmV0dXJuOwogICAgdWx0aW1hdGVTdHJpbmcgPSBwYXJ0cy5yZW1vdmVMYXN0KCk7CiAgICBwZW51bHRpbWF0ZVN0cmluZyA9IHBhcnRzLnJlbW92ZUxhc3QoKTsKICB9IGVsc2UgewogICAgcGVudWx0aW1hdGUgPSBpdC5jdXJyZW50OwogICAgY291bnQrKzsKICAgIGlmICghaXQubW92ZU5leHQoKSkgewogICAgICBpZiAoY291bnQgPD0gaGVhZENvdW50ICsgMSkgewogICAgICAgIHBhcnRzLmFkZCgiJHBlbnVsdGltYXRlIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHVsdGltYXRlU3RyaW5nID0gIiRwZW51bHRpbWF0ZSI7CiAgICAgIHBlbnVsdGltYXRlU3RyaW5nID0gcGFydHMucmVtb3ZlTGFzdCgpOwogICAgICBsZW5ndGggKz0gdWx0aW1hdGVTdHJpbmcubGVuZ3RoICsgb3ZlcmhlYWQ7CiAgICB9IGVsc2UgewogICAgICB1bHRpbWF0ZSA9IGl0LmN1cnJlbnQ7CiAgICAgIGNvdW50Kys7CiAgICAgIC8vIFRoZW4ga2VlcCBsb29waW5nLCBrZWVwaW5nIHRoZSBsYXN0IHR3byBlbGVtZW50cyBpbiB2YXJpYWJsZXMuCiAgICAgIGFzc2VydChjb3VudCA8IG1heENvdW50KTsKICAgICAgd2hpbGUgKGl0Lm1vdmVOZXh0KCkpIHsKICAgICAgICBwZW51bHRpbWF0ZSA9IHVsdGltYXRlOwogICAgICAgIHVsdGltYXRlID0gaXQuY3VycmVudDsKICAgICAgICBjb3VudCsrOwogICAgICAgIGlmIChjb3VudCA+IG1heENvdW50KSB7CiAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IGZvdW5kIHRoZSBlbmQgYmVmb3JlIG1heENvdW50LCBnaXZlIHVwLgogICAgICAgICAgLy8gVGhpcyBjYW5ub3QgaGFwcGVuIGluIHRoZSBjb2RlIGFib3ZlIGJlY2F1c2UgZWFjaCBlbnRyeQogICAgICAgICAgLy8gaW5jcmVhc2VzIGxlbmd0aCBieSBhdCBsZWFzdCB0d28sIHNvIHRoZXJlIGlzIG5vIHdheSB0bwogICAgICAgICAgLy8gdmlzaXQgbW9yZSB0aGFuIH40MCBlbGVtZW50cyBiZWZvcmUgdGhpcyBsb29wLgoKICAgICAgICAgIC8vIFJlbW92ZSBhbnkgc3VycGx1cyBlbGVtZW50cyB1bnRpbCBsZW5ndGgsIGluY2x1ZGluZyAiLCAuLi4pIiwKICAgICAgICAgIC8vIGlzIGF0IG1vc3QgbGVuZ3RoTGltaXQuCiAgICAgICAgICB3aGlsZSAobGVuZ3RoID4gbGVuZ3RoTGltaXQgLSBlbGxpcHNpc1NpemUgLSBvdmVyaGVhZCAmJgogICAgICAgICAgICAgIGNvdW50ID4gaGVhZENvdW50KSB7CiAgICAgICAgICAgIGxlbmd0aCAtPSBwYXJ0cy5yZW1vdmVMYXN0KCkubGVuZ3RoICsgb3ZlcmhlYWQ7CiAgICAgICAgICAgIGNvdW50LS07CiAgICAgICAgICB9CiAgICAgICAgICBwYXJ0cy5hZGQoIi4uLiIpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgICBwZW51bHRpbWF0ZVN0cmluZyA9ICIkcGVudWx0aW1hdGUiOwogICAgICB1bHRpbWF0ZVN0cmluZyA9ICIkdWx0aW1hdGUiOwogICAgICBsZW5ndGggKz0gdWx0aW1hdGVTdHJpbmcubGVuZ3RoICsgcGVudWx0aW1hdGVTdHJpbmcubGVuZ3RoICsgMiAqIG92ZXJoZWFkOwogICAgfQogIH0KCiAgLy8gSWYgdGhlcmUgaXMgYSBnYXAgYmV0d2VlbiB0aGUgaW5pdGlhbCBydW4gYW5kIHRoZSBsYXN0IHR3bywKICAvLyBwcmVwYXJlIHRvIGFkZCBhbiBlbGxpcHNpcy4KICBTdHJpbmcgZWxpc2lvbjsKICBpZiAoY291bnQgPiBwYXJ0cy5sZW5ndGggKyB0YWlsQ291bnQpIHsKICAgIGVsaXNpb24gPSAiLi4uIjsKICAgIGxlbmd0aCArPSBlbGxpcHNpc1NpemUgKyBvdmVyaGVhZDsKICB9CgogIC8vIElmIHRoZSBsYXN0IHR3byBlbGVtZW50cyB3ZXJlIHZlcnkgbG9uZywgYW5kIHdlIGhhdmUgbW9yZSB0aGFuCiAgLy8gaGVhZENvdW50IGVsZW1lbnRzIGluIHRoZSBpbml0aWFsIHJ1biwgZHJvcCBzb21lIHRvIG1ha2Ugcm9vbSBmb3IKICAvLyB0aGUgbGFzdCB0d28uCiAgd2hpbGUgKGxlbmd0aCA+IGxlbmd0aExpbWl0ICYmIHBhcnRzLmxlbmd0aCA+IGhlYWRDb3VudCkgewogICAgbGVuZ3RoIC09IHBhcnRzLnJlbW92ZUxhc3QoKS5sZW5ndGggKyBvdmVyaGVhZDsKICAgIGlmIChlbGlzaW9uID09IG51bGwpIHsKICAgICAgZWxpc2lvbiA9ICIuLi4iOwogICAgICBsZW5ndGggKz0gZWxsaXBzaXNTaXplICsgb3ZlcmhlYWQ7CiAgICB9CiAgfQogIGlmIChlbGlzaW9uICE9IG51bGwpIHsKICAgIHBhcnRzLmFkZChlbGlzaW9uKTsKICB9CiAgcGFydHMuYWRkKHBlbnVsdGltYXRlU3RyaW5nKTsKICBwYXJ0cy5hZGQodWx0aW1hdGVTdHJpbmcpOwp9CoGUAE5OPAEZAU8EPjkyFBA+ATpHAUUBPAE1JQEuQCYdLkAGLwQBIhglBhIEASQoBAEsKiAuBiAiMAYSBAFFHj0SBAEiHiUGEQQBKSopKjALLSUNKyQhLQgGHgQBIx4mBhIEASwuAScBEy4THBwPBhIEASwBIwEgKQQBLi0EASApBAEuLQQBEB8aLgYXBAEPHxouBg4JGx0TBAERH0AbPRMEATMeKQYpLAQBMg4gHhsaHggGJiksBAE2DiAeGx0wChoeCAYmKSwEARswMRoeMRYGRgQBSwIBLARRHDUYAUYGNgZHQzlDKTs9GAgxBiUlCjAQOyYGKCIjFQQBKgZNRQZHPAZHQzhDKTEGNyUKJxA7JgYiHgQCAUgjAT8lNzkEEAIBSUYFPkodBi4eATcbATUbAUocTU4NGi8BEhEjSi02ICMVJg0EARwZAUc0FhMYMCksCx4NGiQjEAgnLjINHQ9IIB4gHxEgQ0VFPAFLJUMjPBUMHBIKCCokUQYEAUEhEioVJwQBREcTPTQbFykGBBkYBCAdAgEdZGFydDpjb2xsZWN0aW9uL2l0ZXJhYmxlLmRhcnQ0b3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvbGxlY3Rpb24vaXRlcmF0b3IuZGFydIT6Ly8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb2xsZWN0aW9uOwoKLy8vIFRoZSBbSGFzTmV4dEl0ZXJhdG9yXSBjbGFzcyB3cmFwcyBhbiBbSXRlcmF0b3JdIGFuZCBwcm92aWRlcyBtZXRob2RzIHRvCi8vLyBpdGVyYXRlIG92ZXIgYW4gb2JqZWN0IHVzaW5nIGBoYXNOZXh0YCBhbmQgYG5leHRgLgovLy8KLy8vIEFuIFtIYXNOZXh0SXRlcmF0b3JdIGRvZXMgbm90IGltcGxlbWVudCB0aGUgW0l0ZXJhdG9yXSBpbnRlcmZhY2UuCmNsYXNzIEhhc05leHRJdGVyYXRvcjxFPiB7CiAgc3RhdGljIGNvbnN0IGludCBfSEFTX05FWFRfQU5EX05FWFRfSU5fQ1VSUkVOVCA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBfTk9fTkVYVCA9IDE7CiAgc3RhdGljIGNvbnN0IGludCBfTk9UX01PVkVEX1lFVCA9IDI7CgogIEl0ZXJhdG9yPEU+IF9pdGVyYXRvcjsKICBpbnQgX3N0YXRlID0gX05PVF9NT1ZFRF9ZRVQ7CgogIEhhc05leHRJdGVyYXRvcih0aGlzLl9pdGVyYXRvcik7CgogIGJvb2wgZ2V0IGhhc05leHQgewogICAgaWYgKF9zdGF0ZSA9PSBfTk9UX01PVkVEX1lFVCkgX21vdmUoKTsKICAgIHJldHVybiBfc3RhdGUgPT0gX0hBU19ORVhUX0FORF9ORVhUX0lOX0NVUlJFTlQ7CiAgfQoKICBFIG5leHQoKSB7CiAgICAvLyBDYWxsIHRvIGhhc05leHQgaXMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSB3ZSBhcmUgcG9zaXRpb25lZCBhdCB0aGUgZmlyc3QKICAgIC8vIGVsZW1lbnQgd2hlbiB3ZSBzdGFydCBpdGVyYXRpbmcuCiAgICBpZiAoIWhhc05leHQpIHRocm93IFN0YXRlRXJyb3IoIk5vIG1vcmUgZWxlbWVudHMiKTsKICAgIGFzc2VydChfc3RhdGUgPT0gX0hBU19ORVhUX0FORF9ORVhUX0lOX0NVUlJFTlQpOwogICAgRSByZXN1bHQgPSBfaXRlcmF0b3IuY3VycmVudDsKICAgIF9tb3ZlKCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBfbW92ZSgpIHsKICAgIGlmIChfaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICBfc3RhdGUgPSBfSEFTX05FWFRfQU5EX05FWFRfSU5fQ1VSUkVOVDsKICAgIH0gZWxzZSB7CiAgICAgIF9zdGF0ZSA9IF9OT19ORVhUOwogICAgfQogIH0KfQotAE5OPAEZAUw3BEYbNiEnARkfASMBFSs0BAENUCg4NSINEwQBESAuDRkGBAIBHWRhcnQ6Y29sbGVjdGlvbi9pdGVyYXRvci5kYXJ0O29yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb2xsZWN0aW9uL2xpbmtlZF9oYXNoX21hcC5kYXJ0l8svLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvbGxlY3Rpb247CgovLy8gQSBoYXNoLXRhYmxlIGJhc2VkIGltcGxlbWVudGF0aW9uIG9mIFtNYXBdLgovLy8KLy8vIFRoZSBpbnNlcnRpb24gb3JkZXIgb2Yga2V5cyBpcyByZW1lbWJlcmVkLAovLy8gYW5kIGtleXMgYXJlIGl0ZXJhdGVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgaW5zZXJ0ZWQgaW50byB0aGUgbWFwLgovLy8gVmFsdWVzIGFyZSBpdGVyYXRlZCBpbiB0aGVpciBjb3JyZXNwb25kaW5nIGtleSdzIG9yZGVyLgovLy8gQ2hhbmdpbmcgYSBrZXkncyB2YWx1ZSwgd2hlbiB0aGUga2V5IGlzIGFscmVhZHkgaW4gdGhlIG1hcCwKLy8vIGRvZXMgbm90IGNoYW5nZSB0aGUgaXRlcmF0aW9uIG9yZGVyLAovLy8gYnV0IHJlbW92aW5nIHRoZSBrZXkgYW5kIGFkZGluZyBpdCBhZ2FpbgovLy8gd2lsbCBtYWtlIGl0IGJlIGxhc3QgaW4gdGhlIGl0ZXJhdGlvbiBvcmRlci4KLy8vCi8vLyBUaGUga2V5cyBvZiBhIGBMaW5rZWRIYXNoTWFwYCBtdXN0IGhhdmUgY29uc2lzdGVudCBbT2JqZWN0Lj09XQovLy8gYW5kIFtPYmplY3QuaGFzaENvZGVdIGltcGxlbWVudGF0aW9ucy4gVGhpcyBtZWFucyB0aGF0IHRoZSBgPT1gIG9wZXJhdG9yCi8vLyBtdXN0IGRlZmluZSBhIHN0YWJsZSBlcXVpdmFsZW5jZSByZWxhdGlvbiBvbiB0aGUga2V5cyAocmVmbGV4aXZlLAovLy8gc3ltbWV0cmljLCB0cmFuc2l0aXZlLCBhbmQgY29uc2lzdGVudCBvdmVyIHRpbWUpLCBhbmQgdGhhdCBgaGFzaENvZGVgCi8vLyBtdXN0IGJlIHRoZSBzYW1lIGZvciBvYmplY3RzIHRoYXQgYXJlIGNvbnNpZGVyZWQgZXF1YWwgYnkgYD09YC4KLy8vCi8vLyBUaGUgbWFwIGFsbG93cyBgbnVsbGAgYXMgYSBrZXkuCmFic3RyYWN0IGNsYXNzIExpbmtlZEhhc2hNYXA8SywgVj4gaW1wbGVtZW50cyBNYXA8SywgVj4gewogIC8vLyBDcmVhdGVzIGFuIGluc2VydGlvbi1vcmRlcmVkIGhhc2gtdGFibGUgYmFzZWQgW01hcF0uCiAgLy8vCiAgLy8vIElmIFtlcXVhbHNdIGlzIHByb3ZpZGVkLCBpdCBpcyB1c2VkIHRvIGNvbXBhcmUgdGhlIGtleXMgaW4gdGhlIHRhYmxlIHdpdGgKICAvLy8gbmV3IGtleXMuIElmIFtlcXVhbHNdIGlzIG9taXR0ZWQsIHRoZSBrZXkncyBvd24gW09iamVjdC49PV0gaXMgdXNlZAogIC8vLyBpbnN0ZWFkLgogIC8vLwogIC8vLyBTaW1pbGFyLCBpZiBbaGFzaENvZGVdIGlzIHByb3ZpZGVkLCBpdCBpcyB1c2VkIHRvIHByb2R1Y2UgYSBoYXNoIHZhbHVlCiAgLy8vIGZvciBrZXlzIGluIG9yZGVyIHRvIHBsYWNlIHRoZW0gaW4gdGhlIGhhc2ggdGFibGUuIElmIGl0IGlzIG9taXR0ZWQsIHRoZQogIC8vLyBrZXkncyBvd24gW09iamVjdC5oYXNoQ29kZV0gaXMgdXNlZC4KICAvLy8KICAvLy8gSWYgdXNpbmcgbWV0aG9kcyBsaWtlIFtvcGVyYXRvciBbXV0sIFtyZW1vdmVdIGFuZCBbY29udGFpbnNLZXldIHRvZ2V0aGVyCiAgLy8vIHdpdGggYSBjdXN0b20gZXF1YWxpdHkgYW5kIGhhc2hjb2RlLCBhbiBleHRyYSBgaXNWYWxpZEtleWAgZnVuY3Rpb24KICAvLy8gY2FuIGJlIHN1cHBsaWVkLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBbZXF1YWxzXSBvcgogIC8vLyBbaGFzaENvZGVdIHdpdGggYW4gYXJndW1lbnQgdGhhdCBtYXkgbm90IGJlIGEgW0tdIGluc3RhbmNlLCBhbmQgaWYgdGhlCiAgLy8vIGNhbGwgcmV0dXJucyBmYWxzZSwgdGhlIGtleSBpcyBhc3N1bWVkIHRvIG5vdCBiZSBpbiB0aGUgc2V0LgogIC8vLyBUaGUgW2lzVmFsaWRLZXldIGZ1bmN0aW9uIGRlZmF1bHRzIHRvIGp1c3QgdGVzdGluZyBpZiB0aGUgb2JqZWN0IGlzIGEKICAvLy8gW0tdIGluc3RhbmNlLgogIC8vLwogIC8vLyBFeGFtcGxlOgogIC8vLwogIC8vLyAgICAgbmV3IExpbmtlZEhhc2hNYXA8aW50LGludD4oZXF1YWxzOiAoaW50IGEsIGludCBiKSA9PiAoYiAtIGEpICUgNSA9PSAwLAogIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaENvZGU6IChpbnQgZSkgPT4gZSAlIDUpCiAgLy8vCiAgLy8vIFRoaXMgZXhhbXBsZSBtYXAgZG9lcyBub3QgbmVlZCBhbiBgaXNWYWxpZEtleWAgZnVuY3Rpb24gdG8gYmUgcGFzc2VkLgogIC8vLyBUaGUgZGVmYXVsdCBmdW5jdGlvbiBhY2NlcHRzIG9ubHkgYGludGAgdmFsdWVzLCB3aGljaCBjYW4gc2FmZWx5IGJlCiAgLy8vIHBhc3NlZCB0byBib3RoIHRoZSBgZXF1YWxzYCBhbmQgYGhhc2hDb2RlYCBmdW5jdGlvbnMuCiAgLy8vCiAgLy8vIElmIG5laXRoZXIgYGVxdWFsc2AsIGBoYXNoQ29kZWAsIG5vciBgaXNWYWxpZEtleWAgaXMgcHJvdmlkZWQsCiAgLy8vIHRoZSBkZWZhdWx0IGBpc1ZhbGlkS2V5YCBpbnN0ZWFkIGFjY2VwdHMgYWxsIGtleXMuCiAgLy8vIFRoZSBkZWZhdWx0IGVxdWFsaXR5IGFuZCBoYXNoY29kZSBvcGVyYXRpb25zIGFyZSBhc3N1bWVkIHRvIHdvcmsgb24gYWxsCiAgLy8vIG9iamVjdHMuCiAgLy8vCiAgLy8vIExpa2V3aXNlLCBpZiBgZXF1YWxzYCBpcyBbaWRlbnRpY2FsXSwgYGhhc2hDb2RlYCBpcyBbaWRlbnRpdHlIYXNoQ29kZV0KICAvLy8gYW5kIGBpc1ZhbGlkS2V5YCBpcyBvbWl0dGVkLCB0aGUgcmVzdWx0aW5nIG1hcCBpcyBpZGVudGl0eSBiYXNlZCwKICAvLy8gYW5kIHRoZSBgaXNWYWxpZEtleWAgZGVmYXVsdHMgdG8gYWNjZXB0aW5nIGFsbCBrZXlzLgogIC8vLyBTdWNoIGEgbWFwIGNhbiBiZSBjcmVhdGVkIGRpcmVjdGx5IHVzaW5nIFtMaW5rZWRIYXNoTWFwLmlkZW50aXR5XS4KICAvLy8KICAvLy8gVGhlIHVzZWQgYGVxdWFsc2AgYW5kIGBoYXNoQ29kZWAgbWV0aG9kIHNob3VsZCBhbHdheXMgYmUgY29uc2lzdGVudCwKICAvLy8gc28gdGhhdCBpZiBgZXF1YWxzKGEsIGIpYCB0aGVuIGBoYXNoQ29kZShhKSA9PSBoYXNoQ29kZShiKWAuIFRoZSBoYXNoCiAgLy8vIG9mIGFuIG9iamVjdCwgb3Igd2hhdCBpdCBjb21wYXJlcyBlcXVhbCB0bywgc2hvdWxkIG5vdCBjaGFuZ2Ugd2hpbGUgdGhlCiAgLy8vIG9iamVjdCBpcyBpbiB0aGUgdGFibGUuIElmIGl0IGRvZXMgY2hhbmdlLCB0aGUgcmVzdWx0IGlzIHVucHJlZGljdGFibGUuCiAgLy8vCiAgLy8vIElmIHlvdSBzdXBwbHkgb25lIG9mIFtlcXVhbHNdIGFuZCBbaGFzaENvZGVdLAogIC8vLyB5b3Ugc2hvdWxkIGdlbmVyYWxseSBhbHNvIHRvIHN1cHBseSB0aGUgb3RoZXIuCiAgZXh0ZXJuYWwgZmFjdG9yeSBMaW5rZWRIYXNoTWFwKAogICAgICB7Ym9vbCBlcXVhbHMoSyBrZXkxLCBLIGtleTIpLAogICAgICBpbnQgaGFzaENvZGUoSyBrZXkpLAogICAgICBib29sIGlzVmFsaWRLZXkocG90ZW50aWFsS2V5KX0pOwoKICAvLy8gQ3JlYXRlcyBhbiBpbnNlcnRpb24tb3JkZXJlZCBpZGVudGl0eS1iYXNlZCBtYXAuCiAgLy8vCiAgLy8vIEVmZmVjdGl2ZWx5IGEgc2hvcnRoYW5kIGZvcjoKICAvLy8KICAvLy8gICAgIG5ldyBMaW5rZWRIYXNoTWFwPEssIFY+KGVxdWFsczogaWRlbnRpY2FsLAogIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaENvZGU6IGlkZW50aXR5SGFzaENvZGUpCiAgZXh0ZXJuYWwgZmFjdG9yeSBMaW5rZWRIYXNoTWFwLmlkZW50aXR5KCk7CgogIC8vLyBDcmVhdGVzIGEgW0xpbmtlZEhhc2hNYXBdIHRoYXQgY29udGFpbnMgYWxsIGtleSB2YWx1ZSBwYWlycyBvZiBbb3RoZXJdLgogIC8vLwogIC8vLyBUaGUga2V5cyBtdXN0IGFsbCBiZSBpbnN0YW5jZXMgb2YgW0tdIGFuZCB0aGUgdmFsdWVzIHRvIFtWXS4KICAvLy8gVGhlIFtvdGhlcl0gbWFwIGl0c2VsZiBjYW4gaGF2ZSBhbnkgdHlwZS4KICBmYWN0b3J5IExpbmtlZEhhc2hNYXAuZnJvbShNYXAgb3RoZXIpIHsKICAgIExpbmtlZEhhc2hNYXA8SywgVj4gcmVzdWx0ID0gTGlua2VkSGFzaE1hcDxLLCBWPigpOwogICAgb3RoZXIuZm9yRWFjaCgoaywgdikgewogICAgICByZXN1bHRba10gPSB2OwogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIENyZWF0ZXMgYSBbTGlua2VkSGFzaE1hcF0gdGhhdCBjb250YWlucyBhbGwga2V5IHZhbHVlIHBhaXJzIG9mIFtvdGhlcl0uCiAgZmFjdG9yeSBMaW5rZWRIYXNoTWFwLm9mKE1hcDxLLCBWPiBvdGhlcikgPT4KICAgICAgTGlua2VkSGFzaE1hcDxLLCBWPigpLi5hZGRBbGwob3RoZXIpOwoKICAvLy8gQ3JlYXRlcyBhIFtMaW5rZWRIYXNoTWFwXSB3aGVyZSB0aGUga2V5cyBhbmQgdmFsdWVzIGFyZSBjb21wdXRlZCBmcm9tIHRoZQogIC8vLyBbaXRlcmFibGVdLgogIC8vLwogIC8vLyBGb3IgZWFjaCBlbGVtZW50IG9mIHRoZSBbaXRlcmFibGVdIHRoaXMgY29uc3RydWN0b3IgY29tcHV0ZXMgYSBrZXkvdmFsdWUKICAvLy8gcGFpciwgYnkgYXBwbHlpbmcgW2tleV0gYW5kIFt2YWx1ZV0gcmVzcGVjdGl2ZWx5LgogIC8vLwogIC8vLyBUaGUga2V5cyBvZiB0aGUga2V5L3ZhbHVlIHBhaXJzIGRvIG5vdCBuZWVkIHRvIGJlIHVuaXF1ZS4gVGhlIGxhc3QKICAvLy8gb2NjdXJyZW5jZSBvZiBhIGtleSB3aWxsIHNpbXBseSBvdmVyd3JpdGUgYW55IHByZXZpb3VzIHZhbHVlLgogIC8vLwogIC8vLyBJZiBubyB2YWx1ZXMgYXJlIHNwZWNpZmllZCBmb3IgW2tleV0gYW5kIFt2YWx1ZV0gdGhlIGRlZmF1bHQgaXMgdGhlCiAgLy8vIGlkZW50aXR5IGZ1bmN0aW9uLgogIGZhY3RvcnkgTGlua2VkSGFzaE1hcC5mcm9tSXRlcmFibGUoSXRlcmFibGUgaXRlcmFibGUsCiAgICAgIHtLIGtleShlbGVtZW50KSwgViB2YWx1ZShlbGVtZW50KX0pIHsKICAgIExpbmtlZEhhc2hNYXA8SywgVj4gbWFwID0gTGlua2VkSGFzaE1hcDxLLCBWPigpOwogICAgTWFwQmFzZS5fZmlsbE1hcFdpdGhNYXBwZWRJdGVyYWJsZShtYXAsIGl0ZXJhYmxlLCBrZXksIHZhbHVlKTsKICAgIHJldHVybiBtYXA7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIFtMaW5rZWRIYXNoTWFwXSBhc3NvY2lhdGluZyB0aGUgZ2l2ZW4gW2tleXNdIHRvIFt2YWx1ZXNdLgogIC8vLwogIC8vLyBUaGlzIGNvbnN0cnVjdG9yIGl0ZXJhdGVzIG92ZXIgW2tleXNdIGFuZCBbdmFsdWVzXSBhbmQgbWFwcyBlYWNoIGVsZW1lbnQgb2YKICAvLy8gW2tleXNdIHRvIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgW3ZhbHVlc10uCiAgLy8vCiAgLy8vIElmIFtrZXlzXSBjb250YWlucyB0aGUgc2FtZSBvYmplY3QgbXVsdGlwbGUgdGltZXMsIHRoZSBsYXN0IG9jY3VycmVuY2UKICAvLy8gb3ZlcndyaXRlcyB0aGUgcHJldmlvdXMgdmFsdWUuCiAgLy8vCiAgLy8vIEl0IGlzIGFuIGVycm9yIGlmIHRoZSB0d28gW0l0ZXJhYmxlXXMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGguCiAgZmFjdG9yeSBMaW5rZWRIYXNoTWFwLmZyb21JdGVyYWJsZXMoSXRlcmFibGU8Sz4ga2V5cywgSXRlcmFibGU8Vj4gdmFsdWVzKSB7CiAgICBMaW5rZWRIYXNoTWFwPEssIFY+IG1hcCA9IExpbmtlZEhhc2hNYXA8SywgVj4oKTsKICAgIE1hcEJhc2UuX2ZpbGxNYXBXaXRoSXRlcmFibGVzKG1hcCwga2V5cywgdmFsdWVzKTsKICAgIHJldHVybiBtYXA7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIFtMaW5rZWRIYXNoTWFwXSBjb250YWluaW5nIHRoZSBlbnRyaWVzIG9mIFtlbnRyaWVzXS4KICAvLy8KICAvLy8gUmV0dXJucyBhIG5ldyBgTGlua2VkSGFzaE1hcDxLLCBWPmAgd2hlcmUgYWxsIGVudHJpZXMgb2YgW2VudHJpZXNdCiAgLy8vIGhhdmUgYmVlbiBhZGRlZCBpbiBpdGVyYXRpb24gb3JkZXIuCiAgLy8vCiAgLy8vIElmIG11bHRpcGxlIFtlbnRyaWVzXSBoYXZlIHRoZSBzYW1lIGtleSwKICAvLy8gbGF0ZXIgb2NjdXJyZW5jZXMgb3ZlcndyaXRlIHRoZSBlYXJsaWVyIG9uZXMuCiAgQFNpbmNlKCIyLjEiKQogIGZhY3RvcnkgTGlua2VkSGFzaE1hcC5mcm9tRW50cmllcyhJdGVyYWJsZTxNYXBFbnRyeTxLLCBWPj4gZW50cmllcykgPT4KICAgICAgPEssIFY+e30uLmFkZEVudHJpZXMoZW50cmllcyk7Cn0KgI8ATk48ARkBMAQvSDxAKS0xBENNRkpEBCQ6OwZQSg8GTU8rBk9KSk1DTBQGDwZRQQZMSjwGRTlODwZNSDtJBktMTk4GNDUiJBsnATcGIwY1Pi0BTgZDMCo4GxUIEwQBTi8sAVASBk84BklEBkoZOCw1QxAEAUoGUjcGTSUGSE41NhAEAUUGSSoGLzQQSSUCASRkYXJ0OmNvbGxlY3Rpb24vbGlua2VkX2hhc2hfbWFwLmRhcnQ7b3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvbGxlY3Rpb24vbGlua2VkX2hhc2hfc2V0LmRhcnSU0S8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29sbGVjdGlvbjsKCi8vLyBBIFtMaW5rZWRIYXNoU2V0XSBpcyBhIGhhc2gtdGFibGUgYmFzZWQgW1NldF0gaW1wbGVtZW50YXRpb24uCi8vLwovLy8gVGhlIGBMaW5rZWRIYXNoU2V0YCBhbHNvIGtlZXAgdHJhY2sgb2YgdGhlIG9yZGVyIHRoYXQgZWxlbWVudHMgd2VyZSBpbnNlcnRlZAovLy8gaW4sIGFuZCBpdGVyYXRpb24gaGFwcGVucyBpbiBmaXJzdC10by1sYXN0IGluc2VydGlvbiBvcmRlci4KLy8vCi8vLyBUaGUgZWxlbWVudHMgb2YgYSBgTGlua2VkSGFzaFNldGAgbXVzdCBoYXZlIGNvbnNpc3RlbnQgW09iamVjdC49PV0KLy8vIGFuZCBbT2JqZWN0Lmhhc2hDb2RlXSBpbXBsZW1lbnRhdGlvbnMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgYD09YCBvcGVyYXRvcgovLy8gbXVzdCBkZWZpbmUgYSBzdGFibGUgZXF1aXZhbGVuY2UgcmVsYXRpb24gb24gdGhlIGVsZW1lbnRzIChyZWZsZXhpdmUsCi8vLyBzeW1tZXRyaWMsIHRyYW5zaXRpdmUsIGFuZCBjb25zaXN0ZW50IG92ZXIgdGltZSksIGFuZCB0aGF0IGBoYXNoQ29kZWAKLy8vIG11c3QgYmUgdGhlIHNhbWUgZm9yIG9iamVjdHMgdGhhdCBhcmUgY29uc2lkZXJlZCBlcXVhbCBieSBgPT1gLgovLy8KLy8vIFRoZSBzZXQgYWxsb3dzIGBudWxsYCBhcyBhbiBlbGVtZW50LgovLy8KLy8vIEl0ZXJhdGlvbiBvZiBlbGVtZW50cyBpcyBkb25lIGluIGVsZW1lbnQgaW5zZXJ0aW9uIG9yZGVyLgovLy8gQW4gZWxlbWVudCB0aGF0IHdhcyBhZGRlZCBhZnRlciBhbm90aGVyIHdpbGwgb2NjdXIgbGF0ZXIgaW4gdGhlIGl0ZXJhdGlvbi4KLy8vIEFkZGluZyBhbiBlbGVtZW50IHRoYXQgaXMgYWxyZWFkeSBpbiB0aGUgc2V0Ci8vLyBkb2VzIG5vdCBjaGFuZ2UgaXRzIHBvc2l0aW9uIGluIHRoZSBpdGVyYXRpb24gb3JkZXIsCi8vLyBidXQgcmVtb3ZpbmcgYW4gZWxlbWVudCBhbmQgYWRkaW5nIGl0IGFnYWluLAovLy8gd2lsbCBtYWtlIGl0IHRoZSBsYXN0IGVsZW1lbnQgb2YgYW4gaXRlcmF0aW9uLgovLy8KLy8vIE1vc3Qgc2ltcGxlIG9wZXJhdGlvbnMgb24gYEhhc2hTZXRgIGFyZSBkb25lIGluIChwb3RlbnRpYWxseSBhbW9ydGl6ZWQpCi8vLyBjb25zdGFudCB0aW1lOiBbYWRkXSwgW2NvbnRhaW5zXSwgW3JlbW92ZV0sIGFuZCBbbGVuZ3RoXSwgcHJvdmlkZWQgdGhlIGhhc2gKLy8vIGNvZGVzIG9mIG9iamVjdHMgYXJlIHdlbGwgZGlzdHJpYnV0ZWQuLgphYnN0cmFjdCBjbGFzcyBMaW5rZWRIYXNoU2V0PEU+IGltcGxlbWVudHMgU2V0PEU+IHsKICAvLy8gQ3JlYXRlIGFuIGluc2VydGlvbi1vcmRlcmVkIGhhc2ggc2V0IHVzaW5nIHRoZSBwcm92aWRlZAogIC8vLyBbZXF1YWxzXSBhbmQgW2hhc2hDb2RlXS4KICAvLy8KICAvLy8gVGhlIHByb3ZpZGVkIFtlcXVhbHNdIG11c3QgZGVmaW5lIGEgc3RhYmxlIGVxdWl2YWxlbmNlIHJlbGF0aW9uLCBhbmQKICAvLy8gW2hhc2hDb2RlXSBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCBbZXF1YWxzXS4gSWYgdGhlIFtlcXVhbHNdIG9yIFtoYXNoQ29kZV0KICAvLy8gbWV0aG9kcyB3b24ndCB3b3JrIG9uIGFsbCBvYmplY3RzLCBidXQgb25seSBvbiBzb21lIGluc3RhbmNlcyBvZiBFLCB0aGUKICAvLy8gW2lzVmFsaWRLZXldIHByZWRpY2F0ZSBjYW4gYmUgdXNlZCB0byByZXN0cmljdCB0aGUga2V5cyB0aGF0IHRoZSBmdW5jdGlvbnMKICAvLy8gYXJlIGFwcGxpZWQgdG8uCiAgLy8vIEFueSBrZXkgZm9yIHdoaWNoIFtpc1ZhbGlkS2V5XSByZXR1cm5zIGZhbHNlIGlzIGF1dG9tYXRpY2FsbHkgYXNzdW1lZAogIC8vLyB0byBub3QgYmUgaW4gdGhlIHNldCB3aGVuIGFza2luZyBgY29udGFpbnNgLgogIC8vLwogIC8vLyBJZiBbZXF1YWxzXSBvciBbaGFzaENvZGVdIGFyZSBvbWl0dGVkLCB0aGUgc2V0IHVzZXMKICAvLy8gdGhlIGVsZW1lbnRzJyBpbnRyaW5zaWMgW09iamVjdC49PV0gYW5kIFtPYmplY3QuaGFzaENvZGVdLAogIC8vLyBhbmQgW2lzVmFsaWRLZXldIGlzIGlnbm9yZWQgc2luY2UgdGhlc2Ugb3BlcmF0aW9ucyBhcmUgYXNzdW1lZAogIC8vLyB0byB3b3JrIG9uIGFsbCBvYmplY3RzLgogIC8vLwogIC8vLyBJZiB5b3Ugc3VwcGx5IG9uZSBvZiBbZXF1YWxzXSBhbmQgW2hhc2hDb2RlXSwKICAvLy8geW91IHNob3VsZCBnZW5lcmFsbHkgYWxzbyB0byBzdXBwbHkgdGhlIG90aGVyLgogIC8vLwogIC8vLyBJZiB0aGUgc3VwcGxpZWQgYGVxdWFsc2Agb3IgYGhhc2hDb2RlYCBmdW5jdGlvbnMgd29uJ3Qgd29yayBvbiBhbGwgW0VdCiAgLy8vIG9iamVjdHMsIGFuZCB0aGUgbWFwIHdpbGwgYmUgdXNlZCBpbiBhIHNldHRpbmcgd2hlcmUgYSBub24tYEVgIG9iamVjdAogIC8vLyBpcyBwYXNzZWQgdG8sIGUuZy4sIGBjb250YWluc2AsIHRoZW4gdGhlIFtpc1ZhbGlkS2V5XSBmdW5jdGlvbiBzaG91bGQKICAvLy8gYWxzbyBiZSBzdXBwbGllZC4KICAvLy8KICAvLy8gSWYgW2lzVmFsaWRLZXldIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHRlc3RpbmcgaWYgdGhlIG9iamVjdCBpcyBhbgogIC8vLyBbRV0gaW5zdGFuY2UuIFRoYXQgbWVhbnMgdGhhdDoKICAvLy8KICAvLy8gICAgIG5ldyBMaW5rZWRIYXNoU2V0PGludD4oZXF1YWxzOiAoaW50IGUxLCBpbnQgZTIpID0+IChlMSAtIGUyKSAlIDUgPT0gMCwKICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaENvZGU6IChpbnQgZSkgPT4gZSAlIDUpCiAgLy8vCiAgLy8vIGRvZXMgbm90IG5lZWQgYW4gYGlzVmFsaWRLZXlgIGFyZ3VtZW50LCBiZWNhdXNlIGl0IGRlZmF1bHRzIHRvIG9ubHkKICAvLy8gYWNjZXB0aW5nIGBpbnRgIHZhbHVlcyB3aGljaCBhcmUgYWNjZXB0ZWQgYnkgYm90aCBgZXF1YWxzYCBhbmQgYGhhc2hDb2RlYC4KICAvLy8KICAvLy8gSWYgbmVpdGhlciBgZXF1YWxzYCwgYGhhc2hDb2RlYCwgbm9yIGBpc1ZhbGlkS2V5YCBpcyBwcm92aWRlZCwKICAvLy8gdGhlIGRlZmF1bHQgYGlzVmFsaWRLZXlgIGluc3RlYWQgYWNjZXB0cyBhbGwgdmFsdWVzLgogIC8vLyBUaGUgZGVmYXVsdCBlcXVhbGl0eSBhbmQgaGFzaGNvZGUgb3BlcmF0aW9ucyBhcmUgYXNzdW1lZCB0byB3b3JrIG9uIGFsbAogIC8vLyBvYmplY3RzLgogIC8vLwogIC8vLyBMaWtld2lzZSwgaWYgYGVxdWFsc2AgaXMgW2lkZW50aWNhbF0sIGBoYXNoQ29kZWAgaXMgW2lkZW50aXR5SGFzaENvZGVdCiAgLy8vIGFuZCBgaXNWYWxpZEtleWAgaXMgb21pdHRlZCwgdGhlIHJlc3VsdGluZyBzZXQgaXMgaWRlbnRpdHkgYmFzZWQsCiAgLy8vIGFuZCB0aGUgYGlzVmFsaWRLZXlgIGRlZmF1bHRzIHRvIGFjY2VwdGluZyBhbGwga2V5cy4KICAvLy8gU3VjaCBhIG1hcCBjYW4gYmUgY3JlYXRlZCBkaXJlY3RseSB1c2luZyBbTGlua2VkSGFzaFNldC5pZGVudGl0eV0uCiAgZXh0ZXJuYWwgZmFjdG9yeSBMaW5rZWRIYXNoU2V0KAogICAgICB7Ym9vbCBlcXVhbHMoRSBlMSwgRSBlMiksCiAgICAgIGludCBoYXNoQ29kZShFIGUpLAogICAgICBib29sIGlzVmFsaWRLZXkocG90ZW50aWFsS2V5KX0pOwoKICAvLy8gQ3JlYXRlcyBhbiBpbnNlcnRpb24tb3JkZXJlZCBpZGVudGl0eS1iYXNlZCBzZXQuCiAgLy8vCiAgLy8vIEVmZmVjdGl2ZWx5IGEgc2hvcnRoYW5kIGZvcjoKICAvLy8KICAvLy8gICAgIG5ldyBMaW5rZWRIYXNoU2V0PEU+KGVxdWFsczogaWRlbnRpY2FsLAogIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaENvZGU6IGlkZW50aXR5SGFzaENvZGUpCiAgZXh0ZXJuYWwgZmFjdG9yeSBMaW5rZWRIYXNoU2V0LmlkZW50aXR5KCk7CgogIC8vLyBDcmVhdGUgYSBsaW5rZWQgaGFzaCBzZXQgY29udGFpbmluZyBhbGwgW2VsZW1lbnRzXS4KICAvLy8KICAvLy8gQ3JlYXRlcyBhIGxpbmtlZCBoYXNoIHNldCBhcyBieSBgbmV3IExpbmtlZEhhc2hTZXQ8RT4oKWAgYW5kIGFkZHMgZWFjaAogIC8vLyBlbGVtZW50IG9mIGBlbGVtZW50c2AgdG8gdGhpcyBzZXQgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGl0ZXJhdGVkLgogIC8vLwogIC8vLyBBbGwgdGhlIFtlbGVtZW50c10gc2hvdWxkIGJlIGluc3RhbmNlcyBvZiBbRV0uCiAgLy8vIFRoZSBgZWxlbWVudHNgIGl0ZXJhYmxlIGl0c2VsZiBtYXkgaGF2ZSBhbnkgZWxlbWVudCB0eXBlLAogIC8vLyBzbyB0aGlzIGNvbnN0cnVjdG9yIGNhbiBiZSB1c2VkIHRvIGRvd24tY2FzdCBhIGBTZXRgLCBmb3IgZXhhbXBsZSBhczoKICAvLy8KICAvLy8gICAgIFNldDxTdXBlclR5cGU+IHN1cGVyU2V0ID0gLi4uOwogIC8vLyAgICAgSXRlcmFibGU8U3VwZXJUeXBlPiB0bXAgPSBzdXBlclNldC53aGVyZSgoZSkgPT4gZSBpcyBTdWJUeXBlKTsKICAvLy8gICAgIFNldDxTdWJUeXBlPiBzdWJTZXQgPSBuZXcgTGlua2VkSGFzaFNldDxTdWJUeXBlPi5mcm9tKHRtcCk7CiAgZmFjdG9yeSBMaW5rZWRIYXNoU2V0LmZyb20oSXRlcmFibGUgZWxlbWVudHMpIHsKICAgIExpbmtlZEhhc2hTZXQ8RT4gcmVzdWx0ID0gTGlua2VkSGFzaFNldDxFPigpOwogICAgZm9yIChmaW5hbCBlbGVtZW50IGluIGVsZW1lbnRzKSB7CiAgICAgIHJlc3VsdC5hZGQoZWxlbWVudCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIENyZWF0ZSBhIGxpbmtlZCBoYXNoIHNldCBmcm9tIFtlbGVtZW50c10uCiAgLy8vCiAgLy8vIENyZWF0ZXMgYSBsaW5rZWQgaGFzaCBzZXQgYXMgYnkgYG5ldyBMaW5rZWRIYXNoU2V0PEU+KClgIGFuZCBhZGRzIGVhY2gKICAvLy8gZWxlbWVudCBvZiBgZWxlbWVudHNgIHRvIHRoaXMgc2V0IGluIHRoZSBvcmRlciB0aGV5IGFyZSBpdGVyYXRlZC4KICBmYWN0b3J5IExpbmtlZEhhc2hTZXQub2YoSXRlcmFibGU8RT4gZWxlbWVudHMpID0+CiAgICAgIExpbmtlZEhhc2hTZXQ8RT4oKS4uYWRkQWxsKGVsZW1lbnRzKTsKCiAgLy8vIEV4ZWN1dGVzIGEgZnVuY3Rpb24gb24gZWFjaCBlbGVtZW50IG9mIHRoZSBzZXQuCiAgLy8vCiAgLy8vIFRoZSBlbGVtZW50cyBhcmUgaXRlcmF0ZWQgaW4gaW5zZXJ0aW9uIG9yZGVyLgogIHZvaWQgZm9yRWFjaCh2b2lkIGFjdGlvbihFIGVsZW1lbnQpKTsKCiAgLy8vIFByb3ZpZGVzIGFuIGl0ZXJhdG9yIHRoYXQgaXRlcmF0ZXMgb3ZlciB0aGUgZWxlbWVudHMgaW4gaW5zZXJ0aW9uIG9yZGVyLgogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvcjsKfQp6AE5OPAEZAUIEUUAER01KSkQEKQQ+TzE5MTMETFAsND4fBktRTlEWTDMGOkFFHgY0NQZNTEwYBk0lBlE9BkpRBkU7Tg8GTUg7SSIgGScBNwYjBjI7LQE6Bk1IBjVATAYpSUYyMiYbBhMEATAGTUg0LAE2BjQoAU8cAgEkZGFydDpjb2xsZWN0aW9uL2xpbmtlZF9oYXNoX3NldC5kYXJ0N29yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb2xsZWN0aW9uL2xpbmtlZF9saXN0LmRhcnSevS8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29sbGVjdGlvbjsKCi8vLyBBIHNwZWNpYWxpemVkIGRvdWJsZS1saW5rZWQgbGlzdCBvZiBlbGVtZW50cyB0aGF0IGV4dGVuZHMgW0xpbmtlZExpc3RFbnRyeV0uCi8vLwovLy8gVGhpcyBpcyBub3QgYSBnZW5lcmljIGRhdGEgc3RydWN0dXJlLiBJdCBvbmx5IGFjY2VwdHMgZWxlbWVudHMgdGhhdCBleHRlbmQKLy8vIHRoZSBbTGlua2VkTGlzdEVudHJ5XSBjbGFzcy4gU2VlIHRoZSBbUXVldWVdIGltcGxlbWVudGF0aW9ucyBmb3IgZ2VuZXJpYwovLy8gY29sbGVjdGlvbnMgdGhhdCBhbGxvdyBjb25zdGFudCB0aW1lIGFkZGluZyBhbmQgcmVtb3ZpbmcgYXQgdGhlIGVuZHMuCi8vLwovLy8gVGhpcyBpcyBub3QgYSBbTGlzdF0gaW1wbGVtZW50YXRpb24uIERlc3BpdGUgaXRzIG5hbWUsIHRoaXMgY2xhc3MgZG9lcyBub3QKLy8vIGltcGxlbWVudCB0aGUgW0xpc3RdIGludGVyZmFjZS4gSXQgZG9lcyBub3QgYWxsb3cgY29uc3RhbnQgdGltZSBsb29rdXAgYnkKLy8vIGluZGV4LgovLy8KLy8vIEJlY2F1c2UgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgY29udGFpbiB0aGUgbGlua3Mgb2YgdGhpcyBsaW5rZWQgbGlzdCwKLy8vIGVhY2ggZWxlbWVudCBjYW4gYmUgaW4gb25seSBvbmUgbGlzdCBhdCBhIHRpbWUuIFRvIGFkZCBhbiBlbGVtZW50IHRvIGFub3RoZXIKLy8vIGxpc3QsIGl0IG11c3QgZmlyc3QgYmUgcmVtb3ZlZCBmcm9tIGl0cyBjdXJyZW50IGxpc3QgKGlmIGFueSkuCi8vLwovLy8gSW4gcmV0dXJuLCBlYWNoIGVsZW1lbnQga25vd3MgaXRzIG93biBwbGFjZSBpbiB0aGUgbGlua2VkIGxpc3QsIGFzIHdlbGwgYXMKLy8vIHdoaWNoIGxpc3QgaXQgaXMgaW4uIFRoaXMgYWxsb3dzIGNvbnN0YW50IHRpbWUKLy8vIFtMaW5rZWRMaXN0RW50cnkuaW5zZXJ0QWZ0ZXJdLCBbTGlua2VkTGlzdEVudHJ5Lmluc2VydEJlZm9yZV0gYW5kCi8vLyBbTGlua2VkTGlzdEVudHJ5LnVubGlua10gb3BlcmF0aW9ucyB3aGVuIGFsbCB5b3UgaGF2ZSBpcyB0aGUgZWxlbWVudC4KLy8vCi8vLyBBIGBMaW5rZWRMaXN0YCBhbHNvIGFsbG93cyBjb25zdGFudCB0aW1lIGFkZGluZyBhbmQgcmVtb3ZpbmcgYXQgZWl0aGVyIGVuZCwKLy8vIGFuZCBhIGNvbnN0YW50IHRpbWUgbGVuZ3RoIGdldHRlci4KY2xhc3MgTGlua2VkTGlzdDxFIGV4dGVuZHMgTGlua2VkTGlzdEVudHJ5PEU+PiBleHRlbmRzIEl0ZXJhYmxlPEU+IHsKICBpbnQgX21vZGlmaWNhdGlvbkNvdW50ID0gMDsKICBpbnQgX2xlbmd0aCA9IDA7CiAgRSBfZmlyc3Q7CgogIC8vLyBDb25zdHJ1Y3QgYSBuZXcgZW1wdHkgbGlua2VkIGxpc3QuCiAgTGlua2VkTGlzdCgpOwoKICAvLy8gQWRkIFtlbnRyeV0gdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlua2VkIGxpc3QuCiAgdm9pZCBhZGRGaXJzdChFIGVudHJ5KSB7CiAgICBfaW5zZXJ0QmVmb3JlKF9maXJzdCwgZW50cnksIHVwZGF0ZUZpcnN0OiB0cnVlKTsKICAgIF9maXJzdCA9IGVudHJ5OwogIH0KCiAgLy8vIEFkZCBbZW50cnldIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmtlZCBsaXN0LgogIHZvaWQgYWRkKEUgZW50cnkpIHsKICAgIF9pbnNlcnRCZWZvcmUoX2ZpcnN0LCBlbnRyeSwgdXBkYXRlRmlyc3Q6IGZhbHNlKTsKICB9CgogIC8vLyBBZGQgW2VudHJpZXNdIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmtlZCBsaXN0LgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGVudHJpZXMpIHsKICAgIGVudHJpZXMuZm9yRWFjaChhZGQpOwogIH0KCiAgLy8vIFJlbW92ZSBbZW50cnldIGZyb20gdGhlIGxpbmtlZCBsaXN0LgogIC8vLwogIC8vLyBSZXR1cm5zIGZhbHNlIGFuZCBkb2VzIG5vdGhpbmcgaWYgW2VudHJ5XSBpcyBub3QgaW4gdGhpcyBsaW5rZWQgbGlzdC4KICAvLy8KICAvLy8gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgYGVudHJ5LnVubGluaygpYCBpZiB0aGUgZW50cnkgaXMgaW4gdGhpcwogIC8vLyBsaXN0LgogIGJvb2wgcmVtb3ZlKEUgZW50cnkpIHsKICAgIGlmIChlbnRyeS5fbGlzdCAhPSB0aGlzKSByZXR1cm4gZmFsc2U7CiAgICBfdW5saW5rKGVudHJ5KTsgLy8gVW5saW5rIHdpbGwgZGVjcmVtZW50IGxlbmd0aC4KICAgIHJldHVybiB0cnVlOwogIH0KCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yID0+IF9MaW5rZWRMaXN0SXRlcmF0b3I8RT4odGhpcyk7CgogIGludCBnZXQgbGVuZ3RoID0+IF9sZW5ndGg7CgogIC8vLyBSZW1vdmUgYWxsIGVsZW1lbnRzIGZyb20gdGhpcyBsaW5rZWQgbGlzdC4KICB2b2lkIGNsZWFyKCkgewogICAgX21vZGlmaWNhdGlvbkNvdW50Kys7CiAgICBpZiAoaXNFbXB0eSkgcmV0dXJuOwoKICAgIEUgbmV4dCA9IF9maXJzdDsKICAgIGRvIHsKICAgICAgRSBlbnRyeSA9IG5leHQ7CiAgICAgIG5leHQgPSBlbnRyeS5fbmV4dDsKICAgICAgZW50cnkuX25leHQgPSBlbnRyeS5fcHJldmlvdXMgPSBlbnRyeS5fbGlzdCA9IG51bGw7CiAgICB9IHdoaWxlICghaWRlbnRpY2FsKG5leHQsIF9maXJzdCkpOwoKICAgIF9maXJzdCA9IG51bGw7CiAgICBfbGVuZ3RoID0gMDsKICB9CgogIEUgZ2V0IGZpcnN0IHsKICAgIGlmIChpc0VtcHR5KSB7CiAgICAgIHRocm93IFN0YXRlRXJyb3IoJ05vIHN1Y2ggZWxlbWVudCcpOwogICAgfQogICAgcmV0dXJuIF9maXJzdDsKICB9CgogIEUgZ2V0IGxhc3QgewogICAgaWYgKGlzRW1wdHkpIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcignTm8gc3VjaCBlbGVtZW50Jyk7CiAgICB9CiAgICByZXR1cm4gX2ZpcnN0Ll9wcmV2aW91czsKICB9CgogIEUgZ2V0IHNpbmdsZSB7CiAgICBpZiAoaXNFbXB0eSkgewogICAgICB0aHJvdyBTdGF0ZUVycm9yKCdObyBzdWNoIGVsZW1lbnQnKTsKICAgIH0KICAgIGlmIChfbGVuZ3RoID4gMSkgewogICAgICB0aHJvdyBTdGF0ZUVycm9yKCdUb28gbWFueSBlbGVtZW50cycpOwogICAgfQogICAgcmV0dXJuIF9maXJzdDsKICB9CgogIC8vLyBDYWxsIFthY3Rpb25dIHdpdGggZWFjaCBlbnRyeSBpbiB0aGlzIGxpbmtlZCBsaXN0LgogIC8vLwogIC8vLyBJdCdzIGFuIGVycm9yIGlmIFthY3Rpb25dIG1vZGlmeSB0aGUgbGlua2VkIGxpc3QuCiAgdm9pZCBmb3JFYWNoKHZvaWQgYWN0aW9uKEUgZW50cnkpKSB7CiAgICBpbnQgbW9kaWZpY2F0aW9uQ291bnQgPSBfbW9kaWZpY2F0aW9uQ291bnQ7CiAgICBpZiAoaXNFbXB0eSkgcmV0dXJuOwoKICAgIEUgY3VycmVudCA9IF9maXJzdDsKICAgIGRvIHsKICAgICAgYWN0aW9uKGN1cnJlbnQpOwogICAgICBpZiAobW9kaWZpY2F0aW9uQ291bnQgIT0gX21vZGlmaWNhdGlvbkNvdW50KSB7CiAgICAgICAgdGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICB9CiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Ll9uZXh0OwogICAgfSB3aGlsZSAoIWlkZW50aWNhbChjdXJyZW50LCBfZmlyc3QpKTsKICB9CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2xlbmd0aCA9PSAwOwoKICAvLy8gSW5zZXJ0cyBbbmV3RW50cnldIGFzIGxhc3QgZW50cnkgb2YgdGhlIGxpc3QuCiAgLy8vCiAgLy8vIElmIFt1cGRhdGVGaXJzdF0gaXMgdHJ1ZSBhbmQgW2VudHJ5XSBpcyB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGxpc3QsCiAgLy8vIHVwZGF0ZXMgdGhlIFtfZmlyc3RdIGZpZWxkIHRvIHBvaW50IHRvIHRoZSBbbmV3RW50cnldIGFzIGZpcnN0IGVudHJ5LgogIHZvaWQgX2luc2VydEJlZm9yZShFIGVudHJ5LCBFIG5ld0VudHJ5LCB7Ym9vbCB1cGRhdGVGaXJzdH0pIHsKICAgIGlmIChuZXdFbnRyeS5saXN0ICE9IG51bGwpIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcignTGlua2VkTGlzdEVudHJ5IGlzIGFscmVhZHkgaW4gYSBMaW5rZWRMaXN0Jyk7CiAgICB9CiAgICBfbW9kaWZpY2F0aW9uQ291bnQrKzsKCiAgICBuZXdFbnRyeS5fbGlzdCA9IHRoaXM7CiAgICBpZiAoaXNFbXB0eSkgewogICAgICBhc3NlcnQoZW50cnkgPT0gbnVsbCk7CiAgICAgIG5ld0VudHJ5Ll9wcmV2aW91cyA9IG5ld0VudHJ5Ll9uZXh0ID0gbmV3RW50cnk7CiAgICAgIF9maXJzdCA9IG5ld0VudHJ5OwogICAgICBfbGVuZ3RoKys7CiAgICAgIHJldHVybjsKICAgIH0KICAgIEUgcHJlZGVjZXNzb3IgPSBlbnRyeS5fcHJldmlvdXM7CiAgICBFIHN1Y2Nlc3NvciA9IGVudHJ5OwogICAgbmV3RW50cnkuX3ByZXZpb3VzID0gcHJlZGVjZXNzb3I7CiAgICBuZXdFbnRyeS5fbmV4dCA9IHN1Y2Nlc3NvcjsKICAgIHByZWRlY2Vzc29yLl9uZXh0ID0gbmV3RW50cnk7CiAgICBzdWNjZXNzb3IuX3ByZXZpb3VzID0gbmV3RW50cnk7CiAgICBpZiAodXBkYXRlRmlyc3QgJiYgaWRlbnRpY2FsKGVudHJ5LCBfZmlyc3QpKSB7CiAgICAgIF9maXJzdCA9IG5ld0VudHJ5OwogICAgfQogICAgX2xlbmd0aCsrOwogIH0KCiAgdm9pZCBfdW5saW5rKEUgZW50cnkpIHsKICAgIF9tb2RpZmljYXRpb25Db3VudCsrOwogICAgZW50cnkuX25leHQuX3ByZXZpb3VzID0gZW50cnkuX3ByZXZpb3VzOwogICAgRSBuZXh0ID0gZW50cnkuX3ByZXZpb3VzLl9uZXh0ID0gZW50cnkuX25leHQ7CiAgICBfbGVuZ3RoLS07CiAgICBlbnRyeS5fbGlzdCA9IGVudHJ5Ll9uZXh0ID0gZW50cnkuX3ByZXZpb3VzID0gbnVsbDsKICAgIGlmIChpc0VtcHR5KSB7CiAgICAgIF9maXJzdCA9IG51bGw7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbChlbnRyeSwgX2ZpcnN0KSkgewogICAgICBfZmlyc3QgPSBuZXh0OwogICAgfQogIH0KfQoKY2xhc3MgX0xpbmtlZExpc3RJdGVyYXRvcjxFIGV4dGVuZHMgTGlua2VkTGlzdEVudHJ5PEU+PiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKICBmaW5hbCBMaW5rZWRMaXN0PEU+IF9saXN0OwogIGZpbmFsIGludCBfbW9kaWZpY2F0aW9uQ291bnQ7CiAgRSBfY3VycmVudDsKICBMaW5rZWRMaXN0RW50cnk8RT4gX25leHQ7CiAgYm9vbCBfdmlzaXRlZEZpcnN0OwoKICBfTGlua2VkTGlzdEl0ZXJhdG9yKExpbmtlZExpc3Q8RT4gbGlzdCkKICAgICAgOiBfbGlzdCA9IGxpc3QsCiAgICAgICAgX21vZGlmaWNhdGlvbkNvdW50ID0gbGlzdC5fbW9kaWZpY2F0aW9uQ291bnQsCiAgICAgICAgX25leHQgPSBsaXN0Ll9maXJzdCwKICAgICAgICBfdmlzaXRlZEZpcnN0ID0gZmFsc2U7CgogIEUgZ2V0IGN1cnJlbnQgPT4gX2N1cnJlbnQ7CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBpZiAoX21vZGlmaWNhdGlvbkNvdW50ICE9IF9saXN0Ll9tb2RpZmljYXRpb25Db3VudCkgewogICAgICB0aHJvdyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICB9CiAgICBpZiAoX2xpc3QuaXNFbXB0eSB8fCAoX3Zpc2l0ZWRGaXJzdCAmJiBpZGVudGljYWwoX25leHQsIF9saXN0LmZpcnN0KSkpIHsKICAgICAgX2N1cnJlbnQgPSBudWxsOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBfdmlzaXRlZEZpcnN0ID0gdHJ1ZTsKICAgIF9jdXJyZW50ID0gX25leHQ7CiAgICBfbmV4dCA9IF9uZXh0Ll9uZXh0OwogICAgcmV0dXJuIHRydWU7CiAgfQp9CgovLy8gQW4gb2JqZWN0IHRoYXQgY2FuIGJlIGFuIGVsZW1lbnQgaW4gYSBbTGlua2VkTGlzdF0uCi8vLwovLy8gQWxsIGVsZW1lbnRzIG9mIGEgYExpbmtlZExpc3RgIG11c3QgZXh0ZW5kIHRoaXMgY2xhc3MuCi8vLyBUaGUgY2xhc3MgcHJvdmlkZXMgdGhlIGludGVybmFsIGxpbmtzIHRoYXQgbGluayBlbGVtZW50cyB0b2dldGhlcgovLy8gaW4gdGhlIGBMaW5rZWRMaXN0YCwgYW5kIGEgcmVmZXJlbmNlIHRvIHRoZSBsaW5rZWQgbGlzdCBpdHNlbGYKLy8vIHRoYXQgYW4gZWxlbWVudCBpcyBjdXJyZW50bHkgcGFydCBvZi4KLy8vCi8vLyBBbiBlbnRyeSBjYW4gYmUgaW4gYXQgbW9zdCBvbmUgbGlua2VkIGxpc3QgYXQgYSB0aW1lLgovLy8gV2hpbGUgYW4gZW50cnkgaXMgaW4gYSBsaW5rZWQgbGlzdCwgdGhlIFtsaXN0XSBwcm9wZXJ0eSBwb2ludHMgdG8gdGhhdAovLy8gbGlua2VkIGxpc3QsIGFuZCBvdGhlcndpc2UgdGhlIGBsaXN0YCBwcm9wZXJ0eSBpcyBgbnVsbGAuCi8vLwovLy8gV2hlbiBjcmVhdGVkLCBhbiBlbnRyeSBpcyBub3QgaW4gYW55IGxpbmtlZCBsaXN0LgphYnN0cmFjdCBjbGFzcyBMaW5rZWRMaXN0RW50cnk8RSBleHRlbmRzIExpbmtlZExpc3RFbnRyeTxFPj4gewogIExpbmtlZExpc3Q8RT4gX2xpc3Q7CiAgRSBfbmV4dDsKICBFIF9wcmV2aW91czsKCiAgLy8vIEdldCB0aGUgbGlua2VkIGxpc3QgY29udGFpbmluZyB0aGlzIGVsZW1lbnQuCiAgLy8vCiAgLy8vIFJldHVybnMgYG51bGxgIGlmIHRoaXMgZW50cnkgaXMgbm90IGN1cnJlbnRseSBpbiBhbnkgbGlzdC4KICBMaW5rZWRMaXN0PEU+IGdldCBsaXN0ID0+IF9saXN0OwoKICAvLy8gVW5saW5rIHRoZSBlbGVtZW50IGZyb20gaXRzIGxpbmtlZCBsaXN0LgogIC8vLwogIC8vLyBUaGUgZW50cnkgbXVzdCBjdXJyZW50bHkgYmUgaW4gYSBsaW5rZWQgbGlzdCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KICB2b2lkIHVubGluaygpIHsKICAgIF9saXN0Ll91bmxpbmsodGhpcyk7CiAgfQoKICAvLy8gUmV0dXJuIHRoZSBzdWNjZXNzb3Igb2YgdGhpcyBlbGVtZW50IGluIGl0cyBsaW5rZWQgbGlzdC4KICAvLy8KICAvLy8gUmV0dXJucyBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gc3VjY2Vzc29yIGluIHRoZSBsaW5rZWQgbGlzdCwgb3IgaWYgdGhpcwogIC8vLyBlbnRyeSBpcyBub3QgY3VycmVudGx5IGluIGFueSBsaXN0LgogIEUgZ2V0IG5leHQgewogICAgaWYgKF9saXN0ID09IG51bGwgfHwgaWRlbnRpY2FsKF9saXN0LmZpcnN0LCBfbmV4dCkpIHJldHVybiBudWxsOwogICAgcmV0dXJuIF9uZXh0OwogIH0KCiAgLy8vIFJldHVybiB0aGUgcHJlZGVjZXNzb3Igb2YgdGhpcyBlbGVtZW50IGluIGl0cyBsaW5rZWQgbGlzdC4KICAvLy8KICAvLy8gUmV0dXJucyBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gcHJlZGVjZXNzb3IgaW4gdGhlIGxpbmtlZCBsaXN0LCBvciBpZiB0aGlzCiAgLy8vIGVudHJ5IGlzIG5vdCBjdXJyZW50bHkgaW4gYW55IGxpc3QuCiAgRSBnZXQgcHJldmlvdXMgewogICAgaWYgKF9saXN0ID09IG51bGwgfHwgaWRlbnRpY2FsKHRoaXMsIF9saXN0LmZpcnN0KSkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gX3ByZXZpb3VzOwogIH0KCiAgLy8vIEluc2VydCBhbiBlbGVtZW50IGFmdGVyIHRoaXMgZWxlbWVudCBpbiB0aGlzIGVsZW1lbnQncyBsaW5rZWQgbGlzdC4KICAvLy8KICAvLy8gVGhpcyBlbnRyeSBtdXN0IGJlIGluIGEgbGlua2VkIGxpc3Qgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCiAgLy8vIFRoZSBbZW50cnldIG11c3Qgbm90IGJlIGluIGEgbGlua2VkIGxpc3QuCiAgdm9pZCBpbnNlcnRBZnRlcihFIGVudHJ5KSB7CiAgICBfbGlzdC5faW5zZXJ0QmVmb3JlKF9uZXh0LCBlbnRyeSwgdXBkYXRlRmlyc3Q6IGZhbHNlKTsKICB9CgogIC8vLyBJbnNlcnQgYW4gZWxlbWVudCBiZWZvcmUgdGhpcyBlbGVtZW50IGluIHRoaXMgZWxlbWVudCdzIGxpbmtlZCBsaXN0LgogIC8vLwogIC8vLyBUaGlzIGVudHJ5IG11c3QgYmUgaW4gYSBsaW5rZWQgbGlzdCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KICAvLy8gVGhlIFtlbnRyeV0gbXVzdCBub3QgYmUgaW4gYSBsaW5rZWQgbGlzdC4KICB2b2lkIGluc2VydEJlZm9yZShFIGVudHJ5KSB7CiAgICBfbGlzdC5faW5zZXJ0QmVmb3JlKHRoaXMsIGVudHJ5LCB1cGRhdGVGaXJzdDogdHJ1ZSk7CiAgfQp9CoEJAE5OPAEZAVEET01KBE9OCwRLUUMETzNGSgRQJ0UeEwwBKRABNxs1FAQBMRY2BAEzJRoEASsGTAZNDBkrNREEATwBHQExERoZARUJFho6KAETEQQBEBMrBhMEAQ8TKwYdBAEREysGFy0GEwQBOQY4JzAZARgJFzUxCB8rBAEkATQGS0xAIUYGGgEbEx02GREOBiUZJiAiJDMZBg8EARoaLTIPOBMVKxUGBAIBUR0gDhwWASoWNh0fAR0BFDovBk0XFAYaFhkRBAIBOAQ7RkMqBDpLPgQ2PxcLDwEzBkEjAS8GTxIZBAE/Bk0qD0USBAFBBk8qE0QWBAFKBkYwHjsEAUsGRjAfOQQCASBkYXJ0OmNvbGxlY3Rpb24vbGlua2VkX2xpc3QuZGFydDFvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29sbGVjdGlvbi9xdWV1ZS5kYXJ0wABqhS8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29sbGVjdGlvbjsKCi8vLyBBIFtRdWV1ZV0gaXMgYSBjb2xsZWN0aW9uIHRoYXQgY2FuIGJlIG1hbmlwdWxhdGVkIGF0IGJvdGggZW5kcy4gT25lCi8vLyBjYW4gaXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cyBvZiBhIHF1ZXVlIHRocm91Z2ggW2ZvckVhY2hdIG9yIHdpdGgKLy8vIGFuIFtJdGVyYXRvcl0uCi8vLwovLy8gSXQgaXMgZ2VuZXJhbGx5IG5vdCBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgcXVldWUgKGFkZCBvciByZW1vdmUgZW50cmllcykKLy8vIHdoaWxlIGFuIG9wZXJhdGlvbiBvbiB0aGUgcXVldWUgaXMgYmVpbmcgcGVyZm9ybWVkLCBmb3IgZXhhbXBsZSBkdXJpbmcgYQovLy8gY2FsbCB0byBbZm9yRWFjaF0uCi8vLyBNb2RpZnlpbmcgdGhlIHF1ZXVlIHdoaWxlIGl0IGlzIGJlaW5nIGl0ZXJhdGVkIHdpbGwgbW9zdCBsaWtlbHkgYnJlYWsgdGhlCi8vLyBpdGVyYXRpb24uCi8vLyBUaGlzIGdvZXMgYm90aCBmb3IgdXNpbmcgdGhlIFtpdGVyYXRvcl0gZGlyZWN0bHksIG9yIGZvciBpdGVyYXRpbmcgYW4KLy8vIGBJdGVyYWJsZWAgcmV0dXJuZWQgYnkgYSBtZXRob2QgbGlrZSBbbWFwXSBvciBbd2hlcmVdLgphYnN0cmFjdCBjbGFzcyBRdWV1ZTxFPiBpbXBsZW1lbnRzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+IHsKICAvLy8gQ3JlYXRlcyBhIHF1ZXVlLgogIGZhY3RvcnkgUXVldWUoKSA9IExpc3RRdWV1ZTxFPjsKCiAgLy8vIENyZWF0ZXMgYSBxdWV1ZSBjb250YWluaW5nIGFsbCBbZWxlbWVudHNdLgogIC8vLwogIC8vLyBUaGUgZWxlbWVudCBvcmRlciBpbiB0aGUgcXVldWUgaXMgYXMgaWYgdGhlIGVsZW1lbnRzIHdlcmUgYWRkZWQgdXNpbmcKICAvLy8gW2FkZExhc3RdIGluIHRoZSBvcmRlciBwcm92aWRlZCBieSBbZWxlbWVudHMuaXRlcmF0b3JdLgogIC8vLwogIC8vLyBBbGwgdGhlIFtlbGVtZW50c10gc2hvdWxkIGJlIGluc3RhbmNlcyBvZiBbRV0uCiAgLy8vIFRoZSBgZWxlbWVudHNgIGl0ZXJhYmxlIGl0c2VsZiBtYXkgaGF2ZSBhbnkgZWxlbWVudCB0eXBlLCBzbyB0aGlzCiAgLy8vIGNvbnN0cnVjdG9yIGNhbiBiZSB1c2VkIHRvIGRvd24tY2FzdCBhIGBRdWV1ZWAsIGZvciBleGFtcGxlIGFzOgogIC8vLyBgYGBkYXJ0CiAgLy8vIFF1ZXVlPFN1cGVyVHlwZT4gc3VwZXJRdWV1ZSA9IC4uLjsKICAvLy8gUXVldWU8U3ViVHlwZT4gc3ViUXVldWUgPQogIC8vLyAgICAgbmV3IFF1ZXVlPFN1YlR5cGU+LmZyb20oc3VwZXJTZXQud2hlcmVUeXBlPFN1YlR5cGU+KCkpOwogIC8vLyBgYGAKICBmYWN0b3J5IFF1ZXVlLmZyb20oSXRlcmFibGUgZWxlbWVudHMpID0gTGlzdFF1ZXVlPEU+LmZyb207CgogIC8vLyBDcmVhdGVzIGEgcXVldWUgZnJvbSBbZWxlbWVudHNdLgogIC8vLwogIC8vLyBUaGUgZWxlbWVudCBvcmRlciBpbiB0aGUgcXVldWUgaXMgYXMgaWYgdGhlIGVsZW1lbnRzIHdlcmUgYWRkZWQgdXNpbmcKICAvLy8gW2FkZExhc3RdIGluIHRoZSBvcmRlciBwcm92aWRlZCBieSBbZWxlbWVudHMuaXRlcmF0b3JdLgogIGZhY3RvcnkgUXVldWUub2YoSXRlcmFibGU8RT4gZWxlbWVudHMpID0gTGlzdFF1ZXVlPEU+Lm9mOwoKICAvLy8gQWRhcHRzIFtzb3VyY2VdIHRvIGJlIGEgYFF1ZXVlPFQ+YC4KICAvLy8KICAvLy8gQW55IHRpbWUgdGhlIHF1ZXVlIHdvdWxkIHByb2R1Y2UgYW4gZWxlbWVudCB0aGF0IGlzIG5vdCBhIFtUXSwKICAvLy8gdGhlIGVsZW1lbnQgYWNjZXNzIHdpbGwgdGhyb3cuCiAgLy8vCiAgLy8vIEFueSB0aW1lIGEgW1RdIHZhbHVlIGlzIGF0dGVtcHRlZCBzdG9yZWQgaW50byB0aGUgYWRhcHRlZCBxdWV1ZSwKICAvLy8gdGhlIHN0b3JlIHdpbGwgdGhyb3cgdW5sZXNzIHRoZSB2YWx1ZSBpcyBhbHNvIGFuIGluc3RhbmNlIG9mIFtTXS4KICAvLy8KICAvLy8gSWYgYWxsIGFjY2Vzc2VkIGVsZW1lbnRzIG9mIFtzb3VyY2VdIGFyZSBhY3R1YWxseSBpbnN0YW5jZXMgb2YgW1RdLAogIC8vLyBhbmQgaWYgYWxsIGVsZW1lbnRzIHN0b3JlZCBpbnRvIHRoZSByZXR1cm5lZCBxdWV1ZSBhcmUgYWN0dWFsbHkgaW5zdGFuY2UKICAvLy8gb2YgW1NdLAogIC8vLyB0aGVuIHRoZSByZXR1cm5lZCBxdWV1ZSBjYW4gYmUgdXNlZCBhcyBhIGBRdWV1ZTxUPmAuCiAgc3RhdGljIFF1ZXVlPFQ+IGNhc3RGcm9tPFMsIFQ+KFF1ZXVlPFM+IHNvdXJjZSkgPT4gQ2FzdFF1ZXVlPFMsIFQ+KHNvdXJjZSk7CgogIC8vLyBQcm92aWRlcyBhIHZpZXcgb2YgdGhpcyBxdWV1ZSBhcyBhIHF1ZXVlIG9mIFtSXSBpbnN0YW5jZXMsIGlmIG5lY2Vzc2FyeS4KICAvLy8KICAvLy8gSWYgdGhpcyBxdWV1ZSBjb250YWlucyBvbmx5IGluc3RhbmNlcyBvZiBbUl0sIGFsbCByZWFkIG9wZXJhdGlvbnMKICAvLy8gd2lsbCB3b3JrIGNvcnJlY3RseS4gSWYgYW55IG9wZXJhdGlvbiB0cmllcyB0byBhY2Nlc3MgYW4gZWxlbWVudAogIC8vLyB0aGF0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBbUl0sIHRoZSBhY2Nlc3Mgd2lsbCB0aHJvdyBpbnN0ZWFkLgogIC8vLwogIC8vLyBFbGVtZW50cyBhZGRlZCB0byB0aGUgcXVldWUgKGUuZy4sIGJ5IHVzaW5nIFthZGRGaXJzdF0gb3IgW2FkZEFsbF0pCiAgLy8vIG11c3QgYmUgaW5zdGFuY2Ugb2YgW1JdIHRvIGJlIHZhbGlkIGFyZ3VtZW50cyB0byB0aGUgYWRkaW5nIGZ1bmN0aW9uLAogIC8vLyBhbmQgdGhleSBtdXN0IGJlIGluc3RhbmNlcyBvZiBbRV0gYXMgd2VsbCB0byBiZSBhY2NlcHRlZCBieQogIC8vLyB0aGlzIHF1ZXVlIGFzIHdlbGwuCiAgUXVldWU8Uj4gY2FzdDxSPigpOwoKICAvLy8gUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGlzIHF1ZXVlLgogIC8vLwogIC8vLyBUaGUgcXVldWUgbXVzdCBub3QgYmUgZW1wdHkgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCiAgRSByZW1vdmVGaXJzdCgpOwoKICAvLy8gUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBxdWV1ZS4KICAvLy8KICAvLy8gVGhlIHF1ZXVlIG11c3Qgbm90IGJlIGVtcHR5IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLgogIEUgcmVtb3ZlTGFzdCgpOwoKICAvLy8gQWRkcyBbdmFsdWVdIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHF1ZXVlLgogIHZvaWQgYWRkRmlyc3QoRSB2YWx1ZSk7CgogIC8vLyBBZGRzIFt2YWx1ZV0gYXQgdGhlIGVuZCBvZiB0aGUgcXVldWUuCiAgdm9pZCBhZGRMYXN0KEUgdmFsdWUpOwoKICAvLy8gQWRkcyBbdmFsdWVdIGF0IHRoZSBlbmQgb2YgdGhlIHF1ZXVlLgogIHZvaWQgYWRkKEUgdmFsdWUpOwoKICAvLy8gUmVtb3ZlIGEgc2luZ2xlIGluc3RhbmNlIG9mIFt2YWx1ZV0gZnJvbSB0aGUgcXVldWUuCiAgLy8vCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIGEgdmFsdWUgd2FzIHJlbW92ZWQsIG9yIGBmYWxzZWAgaWYgdGhlIHF1ZXVlCiAgLy8vIGNvbnRhaW5lZCBubyBlbGVtZW50IGVxdWFsIHRvIFt2YWx1ZV0uCiAgYm9vbCByZW1vdmUoT2JqZWN0IHZhbHVlKTsKCiAgLy8vIEFkZHMgYWxsIGVsZW1lbnRzIG9mIFtpdGVyYWJsZV0gYXQgdGhlIGVuZCBvZiB0aGUgcXVldWUuIFRoZQogIC8vLyBsZW5ndGggb2YgdGhlIHF1ZXVlIGlzIGV4dGVuZGVkIGJ5IHRoZSBsZW5ndGggb2YgW2l0ZXJhYmxlXS4KICB2b2lkIGFkZEFsbChJdGVyYWJsZTxFPiBpdGVyYWJsZSk7CgogIC8vLyBSZW1vdmVzIGFsbCBlbGVtZW50cyBtYXRjaGVkIGJ5IFt0ZXN0XSBmcm9tIHRoZSBxdWV1ZS4KICAvLy8KICAvLy8gVGhlIGB0ZXN0YCBmdW5jdGlvbiBtdXN0IG5vdCB0aHJvdyBvciBtb2RpZnkgdGhlIHF1ZXVlLgogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpOwoKICAvLy8gUmVtb3ZlcyBhbGwgZWxlbWVudHMgbm90IG1hdGNoZWQgYnkgW3Rlc3RdIGZyb20gdGhlIHF1ZXVlLgogIC8vLwogIC8vLyBUaGUgYHRlc3RgIGZ1bmN0aW9uIG11c3Qgbm90IHRocm93IG9yIG1vZGlmeSB0aGUgcXVldWUuCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSk7CgogIC8vLyBSZW1vdmVzIGFsbCBlbGVtZW50cyBpbiB0aGUgcXVldWUuIFRoZSBzaXplIG9mIHRoZSBxdWV1ZSBiZWNvbWVzIHplcm8uCiAgdm9pZCBjbGVhcigpOwp9CgpjbGFzcyBfRG91YmxlTGluazxMaW5rIGV4dGVuZHMgX0RvdWJsZUxpbms8TGluaz4+IHsKICBMaW5rIF9wcmV2aW91c0xpbms7CiAgTGluayBfbmV4dExpbms7CgogIHZvaWQgX2xpbmsoTGluayBwcmV2aW91cywgTGluayBuZXh0KSB7CiAgICBfbmV4dExpbmsgPSBuZXh0OwogICAgX3ByZXZpb3VzTGluayA9IHByZXZpb3VzOwogICAgaWYgKHByZXZpb3VzICE9IG51bGwpIHByZXZpb3VzLl9uZXh0TGluayA9IHRoaXM7CiAgICBpZiAobmV4dCAhPSBudWxsKSBuZXh0Ll9wcmV2aW91c0xpbmsgPSB0aGlzOwogIH0KCiAgdm9pZCBfdW5saW5rKCkgewogICAgaWYgKF9wcmV2aW91c0xpbmsgIT0gbnVsbCkgX3ByZXZpb3VzTGluay5fbmV4dExpbmsgPSBfbmV4dExpbms7CiAgICBpZiAoX25leHRMaW5rICE9IG51bGwpIF9uZXh0TGluay5fcHJldmlvdXNMaW5rID0gX3ByZXZpb3VzTGluazsKICAgIF9uZXh0TGluayA9IG51bGw7CiAgICBfcHJldmlvdXNMaW5rID0gbnVsbDsKICB9Cn0KCi8vLyBBbiBlbnRyeSBpbiBhIGRvdWJseSBsaW5rZWQgbGlzdC4gSXQgY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSBuZXh0Ci8vLyBlbnRyeSwgdGhlIHByZXZpb3VzIGVudHJ5LCBhbmQgdGhlIGJveGVkIGVsZW1lbnQuCmNsYXNzIERvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4gZXh0ZW5kcyBfRG91YmxlTGluazxEb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+PiB7CiAgLy8vIFRoZSBlbGVtZW50IGluIHRoZSBxdWV1ZS4KICBFIGVsZW1lbnQ7CgogIERvdWJsZUxpbmtlZFF1ZXVlRW50cnkodGhpcy5lbGVtZW50KTsKCiAgLy8vIEFwcGVuZHMgdGhlIGdpdmVuIFtlXSBhcyBlbnRyeSBqdXN0IGFmdGVyIHRoaXMgZW50cnkuCiAgdm9pZCBhcHBlbmQoRSBlKSB7CiAgICBEb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+KGUpLl9saW5rKHRoaXMsIF9uZXh0TGluayk7CiAgfQoKICAvLy8gUHJlcGVuZHMgdGhlIGdpdmVuIFtlXSBhcyBlbnRyeSBqdXN0IGJlZm9yZSB0aGlzIGVudHJ5LgogIHZvaWQgcHJlcGVuZChFIGUpIHsKICAgIERvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4oZSkuX2xpbmsoX3ByZXZpb3VzTGluaywgdGhpcyk7CiAgfQoKICBFIHJlbW92ZSgpIHsKICAgIF91bmxpbmsoKTsKICAgIHJldHVybiBlbGVtZW50OwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHByZXZpb3VzIGVudHJ5IG9yIGBudWxsYCBpZiB0aGVyZSBpcyBub25lLgogIERvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4gcHJldmlvdXNFbnRyeSgpID0+IF9wcmV2aW91c0xpbms7CgogIC8vLyBSZXR1cm5zIHRoZSBuZXh0IGVudHJ5IG9yIGBudWxsYCBpZiB0aGVyZSBpcyBub25lLgogIERvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4gbmV4dEVudHJ5KCkgPT4gX25leHRMaW5rOwp9CgovLy8gSW50ZXJmYWNlIGZvciB0aGUgbGluayBjbGFzc2VzIHVzZWQgYnkgW0RvdWJsZUxpbmtlZFF1ZXVlXS4KLy8vCi8vLyBCb3RoIHRoZSBbX0RvdWJsZUxpbmtlZFF1ZXVlRWxlbWVudF0gYW5kIFtfRG91YmxlTGlua2VkUXVldWVTZW50aW5lbF0KLy8vIGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KLy8vIFRoZSBlbnRyeSBjb250YWlucyBhIGxpbmsgYmFjayB0byB0aGUgcXVldWUsIHNvIGNhbGxpbmcgYGFwcGVuZGAKLy8vIG9yIGBwcmVwZW5kYCBjYW4gY29ycmVjdGx5IHVwZGF0ZSB0aGUgZWxlbWVudCBjb3VudC4KYWJzdHJhY3QgY2xhc3MgX0RvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4gZXh0ZW5kcyBEb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+IHsKICBEb3VibGVMaW5rZWRRdWV1ZTxFPiBfcXVldWU7CiAgX0RvdWJsZUxpbmtlZFF1ZXVlRW50cnkoRSBlbGVtZW50LCB0aGlzLl9xdWV1ZSkgOiBzdXBlcihlbGVtZW50KTsKCiAgRG91YmxlTGlua2VkUXVldWVFbnRyeTxFPiBfYXNOb25TZW50aW5lbEVudHJ5KCk7CgogIHZvaWQgX2FwcGVuZChFIGUpIHsKICAgIF9Eb3VibGVMaW5rZWRRdWV1ZUVsZW1lbnQ8RT4oZSwgX3F1ZXVlKS5fbGluayh0aGlzLCBfbmV4dExpbmspOwogIH0KCiAgdm9pZCBfcHJlcGVuZChFIGUpIHsKICAgIF9Eb3VibGVMaW5rZWRRdWV1ZUVsZW1lbnQ8RT4oZSwgX3F1ZXVlKS5fbGluayhfcHJldmlvdXNMaW5rLCB0aGlzKTsKICB9CgogIEUgX3JlbW92ZSgpOwoKICBFIGdldCBfZWxlbWVudCA9PiBlbGVtZW50OwoKICBEb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+IG5leHRFbnRyeSgpIHsKICAgIF9Eb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+IGVudHJ5ID0gX25leHRMaW5rOwogICAgcmV0dXJuIGVudHJ5Ll9hc05vblNlbnRpbmVsRW50cnkoKTsKICB9CgogIERvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4gcHJldmlvdXNFbnRyeSgpIHsKICAgIF9Eb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+IGVudHJ5ID0gX3ByZXZpb3VzTGluazsKICAgIHJldHVybiBlbnRyeS5fYXNOb25TZW50aW5lbEVudHJ5KCk7CiAgfQp9CgovLy8gVGhlIGFjdHVhbCBlbnRyeSB0eXBlIHVzZWQgYnkgdGhlIFtEb3VibGVMaW5rZWRRdWV1ZV0uCi8vLwovLy8gVGhlIGVudHJ5IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBxdWV1ZSwgYWxsb3dpbmcKLy8vIFthcHBlbmRdL1twcmVwZW5kXSB0byB1cGRhdGUgdGhlIGxpc3QgbGVuZ3RoLgpjbGFzcyBfRG91YmxlTGlua2VkUXVldWVFbGVtZW50PEU+IGV4dGVuZHMgX0RvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4gewogIF9Eb3VibGVMaW5rZWRRdWV1ZUVsZW1lbnQoRSBlbGVtZW50LCBEb3VibGVMaW5rZWRRdWV1ZTxFPiBxdWV1ZSkKICAgICAgOiBzdXBlcihlbGVtZW50LCBxdWV1ZSk7CgogIHZvaWQgYXBwZW5kKEUgZSkgewogICAgX2FwcGVuZChlKTsKICAgIGlmIChfcXVldWUgIT0gbnVsbCkgX3F1ZXVlLl9lbGVtZW50Q291bnQrKzsKICB9CgogIHZvaWQgcHJlcGVuZChFIGUpIHsKICAgIF9wcmVwZW5kKGUpOwogICAgaWYgKF9xdWV1ZSAhPSBudWxsKSBfcXVldWUuX2VsZW1lbnRDb3VudCsrOwogIH0KCiAgRSBfcmVtb3ZlKCkgewogICAgX3F1ZXVlID0gbnVsbDsKICAgIF91bmxpbmsoKTsKICAgIHJldHVybiBlbGVtZW50OwogIH0KCiAgRSByZW1vdmUoKSB7CiAgICBpZiAoX3F1ZXVlICE9IG51bGwpIF9xdWV1ZS5fZWxlbWVudENvdW50LS07CiAgICByZXR1cm4gX3JlbW92ZSgpOwogIH0KCiAgX0RvdWJsZUxpbmtlZFF1ZXVlRWxlbWVudDxFPiBfYXNOb25TZW50aW5lbEVudHJ5KCkgewogICAgcmV0dXJuIHRoaXM7CiAgfQp9CgovLy8gQSBzZW50aW5lbCBpbiBhIGRvdWJsZSBsaW5rZWQgbGlzdCBpcyB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIGxpc3QKLy8vIGF0IGJvdGggZW5kcy4KLy8vIEEgZG91YmxlIGxpbmtlZCBsaXN0IGhhcyBleGFjdGx5IG9uZSBzZW50aW5lbCwKLy8vIHdoaWNoIGlzIHRoZSBvbmx5IGVudHJ5IHdoZW4gdGhlIGxpc3QgaXMgY29uc3RydWN0ZWQuCi8vLyBJbml0aWFsbHksIGEgc2VudGluZWwgaGFzIGl0cyBuZXh0IGFuZCBwcmV2aW91cyBlbnRyeSBwb2ludCB0byBpdHNlbGYuCi8vLyBBIHNlbnRpbmVsIGRvZXMgbm90IGJveCBhbnkgdXNlciBlbGVtZW50LgpjbGFzcyBfRG91YmxlTGlua2VkUXVldWVTZW50aW5lbDxFPiBleHRlbmRzIF9Eb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+IHsKICBfRG91YmxlTGlua2VkUXVldWVTZW50aW5lbChEb3VibGVMaW5rZWRRdWV1ZTxFPiBxdWV1ZSkgOiBzdXBlcihudWxsLCBxdWV1ZSkgewogICAgX3ByZXZpb3VzTGluayA9IHRoaXM7CiAgICBfbmV4dExpbmsgPSB0aGlzOwogIH0KCiAgRG91YmxlTGlua2VkUXVldWVFbnRyeTxFPiBfYXNOb25TZW50aW5lbEVudHJ5KCkgewogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLy8gSGl0IGJ5LCBlLmcuLCBbRG91YmxlTGlua2VkUXVldWUucmVtb3ZlRmlyc3RdIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eS4KICBFIF9yZW1vdmUoKSB7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIC8vLyBIaXQgYnksIGUuZy4sIFtEb3VibGVMaW5rZWRRdWV1ZS5maXJzdF0gaWYgdGhlIHF1ZXVlIGlzIGVtcHR5LgogIEUgZ2V0IF9lbGVtZW50IHsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KfQoKLy8vIEEgW1F1ZXVlXSBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBhIGRvdWJsZS1saW5rZWQgbGlzdC4KLy8vCi8vLyBBbGxvd3MgY29uc3RhbnQgdGltZSBhZGQsIHJlbW92ZS1hdC1lbmRzIGFuZCBwZWVrIG9wZXJhdGlvbnMuCmNsYXNzIERvdWJsZUxpbmtlZFF1ZXVlPEU+IGV4dGVuZHMgSXRlcmFibGU8RT4gaW1wbGVtZW50cyBRdWV1ZTxFPiB7CiAgX0RvdWJsZUxpbmtlZFF1ZXVlU2VudGluZWw8RT4gX3NlbnRpbmVsOwogIGludCBfZWxlbWVudENvdW50ID0gMDsKCiAgRG91YmxlTGlua2VkUXVldWUoKSB7CiAgICBfc2VudGluZWwgPSBfRG91YmxlTGlua2VkUXVldWVTZW50aW5lbDxFPih0aGlzKTsKICB9CgogIC8vLyBDcmVhdGVzIGEgZG91YmxlLWxpbmtlZCBxdWV1ZSBjb250YWluaW5nIGFsbCBbZWxlbWVudHNdLgogIC8vLwogIC8vLyBUaGUgZWxlbWVudCBvcmRlciBpbiB0aGUgcXVldWUgaXMgYXMgaWYgdGhlIGVsZW1lbnRzIHdlcmUgYWRkZWQgdXNpbmcKICAvLy8gW2FkZExhc3RdIGluIHRoZSBvcmRlciBwcm92aWRlZCBieSBbZWxlbWVudHMuaXRlcmF0b3JdLgogIC8vLwogIC8vLyBBbGwgdGhlIFtlbGVtZW50c10gc2hvdWxkIGJlIGluc3RhbmNlcyBvZiBbRV0uCiAgLy8vIFRoZSBgZWxlbWVudHNgIGl0ZXJhYmxlIGl0c2VsZiBtYXkgaGF2ZSBhbnkgZWxlbWVudCB0eXBlLCBzbyB0aGlzCiAgLy8vIGNvbnN0cnVjdG9yIGNhbiBiZSB1c2VkIHRvIGRvd24tY2FzdCBhIGBRdWV1ZWAsIGZvciBleGFtcGxlIGFzOgogIC8vLyBgYGBkYXJ0CiAgLy8vIFF1ZXVlPFN1cGVyVHlwZT4gc3VwZXJRdWV1ZSA9IC4uLjsKICAvLy8gUXVldWU8U3ViVHlwZT4gc3ViUXVldWUgPQogIC8vLyAgICAgbmV3IERvdWJsZUxpbmtlZFF1ZXVlPFN1YlR5cGU+LmZyb20oc3VwZXJRdWV1ZS53aGVyZVR5cGU8U3ViVHlwZT4oKSk7CiAgLy8vIGBgYAogIGZhY3RvcnkgRG91YmxlTGlua2VkUXVldWUuZnJvbShJdGVyYWJsZSBlbGVtZW50cykgewogICAgUXVldWU8RT4gbGlzdCA9IERvdWJsZUxpbmtlZFF1ZXVlPEU+KCk7CiAgICBmb3IgKGZpbmFsIGUgaW4gZWxlbWVudHMpIHsKICAgICAgbGlzdC5hZGRMYXN0KGUpOwogICAgfQogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIGRvdWJsZS1saW5rZWQgcXVldWUgZnJvbSBbZWxlbWVudHNdLgogIC8vLwogIC8vLyBUaGUgZWxlbWVudCBvcmRlciBpbiB0aGUgcXVldWUgaXMgYXMgaWYgdGhlIGVsZW1lbnRzIHdlcmUgYWRkZWQgdXNpbmcKICAvLy8gW2FkZExhc3RdIGluIHRoZSBvcmRlciBwcm92aWRlZCBieSBbZWxlbWVudHMuaXRlcmF0b3JdLgogIGZhY3RvcnkgRG91YmxlTGlua2VkUXVldWUub2YoSXRlcmFibGU8RT4gZWxlbWVudHMpID0+CiAgICAgIERvdWJsZUxpbmtlZFF1ZXVlPEU+KCkuLmFkZEFsbChlbGVtZW50cyk7CgogIFF1ZXVlPFI+IGNhc3Q8Uj4oKSA9PiBRdWV1ZS5jYXN0RnJvbTxFLCBSPih0aGlzKTsKICBpbnQgZ2V0IGxlbmd0aCA9PiBfZWxlbWVudENvdW50OwoKICB2b2lkIGFkZExhc3QoRSB2YWx1ZSkgewogICAgX3NlbnRpbmVsLl9wcmVwZW5kKHZhbHVlKTsKICAgIF9lbGVtZW50Q291bnQrKzsKICB9CgogIHZvaWQgYWRkRmlyc3QoRSB2YWx1ZSkgewogICAgX3NlbnRpbmVsLl9hcHBlbmQodmFsdWUpOwogICAgX2VsZW1lbnRDb3VudCsrOwogIH0KCiAgdm9pZCBhZGQoRSB2YWx1ZSkgewogICAgX3NlbnRpbmVsLl9wcmVwZW5kKHZhbHVlKTsKICAgIF9lbGVtZW50Q291bnQrKzsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CiAgICBmb3IgKGZpbmFsIEUgdmFsdWUgaW4gaXRlcmFibGUpIHsKICAgICAgX3NlbnRpbmVsLl9wcmVwZW5kKHZhbHVlKTsKICAgICAgX2VsZW1lbnRDb3VudCsrOwogICAgfQogIH0KCiAgRSByZW1vdmVMYXN0KCkgewogICAgX0RvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4gbGFzdEVudHJ5ID0gX3NlbnRpbmVsLl9wcmV2aW91c0xpbms7CiAgICBFIHJlc3VsdCA9IGxhc3RFbnRyeS5fcmVtb3ZlKCk7CiAgICBfZWxlbWVudENvdW50LS07CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgRSByZW1vdmVGaXJzdCgpIHsKICAgIF9Eb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+IGZpcnN0RW50cnkgPSBfc2VudGluZWwuX25leHRMaW5rOwogICAgRSByZXN1bHQgPSBmaXJzdEVudHJ5Ll9yZW1vdmUoKTsKICAgIF9lbGVtZW50Q291bnQtLTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBib29sIHJlbW92ZShPYmplY3QgbykgewogICAgX0RvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4gZW50cnkgPSBfc2VudGluZWwuX25leHRMaW5rOwogICAgd2hpbGUgKCFpZGVudGljYWwoZW50cnksIF9zZW50aW5lbCkpIHsKICAgICAgYm9vbCBlcXVhbHMgPSAoZW50cnkuX2VsZW1lbnQgPT0gbyk7CiAgICAgIGlmICghaWRlbnRpY2FsKHRoaXMsIGVudHJ5Ll9xdWV1ZSkpIHsKICAgICAgICAvLyBFbnRyeSBtdXN0IHN0aWxsIGJlIGluIHRoZSBxdWV1ZS4KICAgICAgICB0aHJvdyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgICAgaWYgKGVxdWFscykgewogICAgICAgIGVudHJ5Ll9yZW1vdmUoKTsKICAgICAgICBfZWxlbWVudENvdW50LS07CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgZW50cnkgPSBlbnRyeS5fbmV4dExpbms7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICB2b2lkIF9maWx0ZXIoYm9vbCB0ZXN0KEUgZWxlbWVudCksIGJvb2wgcmVtb3ZlTWF0Y2hpbmcpIHsKICAgIF9Eb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+IGVudHJ5ID0gX3NlbnRpbmVsLl9uZXh0TGluazsKICAgIHdoaWxlICghaWRlbnRpY2FsKGVudHJ5LCBfc2VudGluZWwpKSB7CiAgICAgIGJvb2wgbWF0Y2hlcyA9IHRlc3QoZW50cnkuX2VsZW1lbnQpOwogICAgICBpZiAoIWlkZW50aWNhbCh0aGlzLCBlbnRyeS5fcXVldWUpKSB7CiAgICAgICAgLy8gRW50cnkgbXVzdCBzdGlsbCBiZSBpbiB0aGUgcXVldWUuCiAgICAgICAgdGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICB9CiAgICAgIF9Eb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+IG5leHQgPSBlbnRyeS5fbmV4dExpbms7IC8vIENhbm5vdCBiZSBudWxsLgogICAgICBpZiAoaWRlbnRpY2FsKHJlbW92ZU1hdGNoaW5nLCBtYXRjaGVzKSkgewogICAgICAgIGVudHJ5Ll9yZW1vdmUoKTsKICAgICAgICBfZWxlbWVudENvdW50LS07CiAgICAgIH0KICAgICAgZW50cnkgPSBuZXh0OwogICAgfQogIH0KCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgX2ZpbHRlcih0ZXN0LCB0cnVlKTsKICB9CgogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIF9maWx0ZXIodGVzdCwgZmFsc2UpOwogIH0KCiAgRSBnZXQgZmlyc3QgewogICAgX0RvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4gZmlyc3RFbnRyeSA9IF9zZW50aW5lbC5fbmV4dExpbms7CiAgICByZXR1cm4gZmlyc3RFbnRyeS5fZWxlbWVudDsKICB9CgogIEUgZ2V0IGxhc3QgewogICAgX0RvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4gbGFzdEVudHJ5ID0gX3NlbnRpbmVsLl9wcmV2aW91c0xpbms7CiAgICByZXR1cm4gbGFzdEVudHJ5Ll9lbGVtZW50OwogIH0KCiAgRSBnZXQgc2luZ2xlIHsKICAgIC8vIE5vdGUgdGhhdCB0aGlzIHRocm93cyBjb3JyZWN0bHkgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5CiAgICAvLyBiZWNhdXNlIHJlYWRpbmcgdGhlIGVsZW1lbnQgb2YgdGhlIHNlbnRpbmVsIHRocm93cy4KICAgIGlmIChpZGVudGljYWwoX3NlbnRpbmVsLl9uZXh0TGluaywgX3NlbnRpbmVsLl9wcmV2aW91c0xpbmspKSB7CiAgICAgIF9Eb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+IGVudHJ5ID0gX3NlbnRpbmVsLl9uZXh0TGluazsKICAgICAgcmV0dXJuIGVudHJ5Ll9lbGVtZW50OwogICAgfQogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogIH0KCiAgLy8vIFRoZSBlbnRyeSBvYmplY3Qgb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHF1ZXVlLgogIC8vLwogIC8vLyBFYWNoIGVsZW1lbnQgb2YgdGhlIHF1ZXVlIGhhcyBhbiBhc3NvY2lhdGVkIFtEb3VibGVMaW5rZWRRdWV1ZUVudHJ5XS4KICAvLy8gUmV0dXJucyB0aGUgZW50cnkgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHF1ZXVlLgogIC8vLwogIC8vLyBUaGUgZW50cnkgb2JqZWN0cyBjYW4gYWxzbyBiZSBhY2Nlc3NlZCB1c2luZyBbbGFzdEVudHJ5XSwKICAvLy8gYW5kIHRoZXkgY2FuIGJlIGl0ZXJhdGVkIHVzaW5nIFtEb3VibGVMaW5rZWRRdWV1ZUVudHJ5Lm5leHRFbnRyeSgpXSBhbmQKICAvLy8gW0RvdWJsZUxpbmtlZFF1ZXVlRW50cnkucHJldmlvdXNFbnRyeSgpXS4KICBEb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+IGZpcnN0RW50cnkoKSB7CiAgICByZXR1cm4gX3NlbnRpbmVsLm5leHRFbnRyeSgpOwogIH0KCiAgLy8vIFRoZSBlbnRyeSBvYmplY3Qgb2YgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgcXVldWUuCiAgLy8vCiAgLy8vIEVhY2ggZWxlbWVudCBvZiB0aGUgcXVldWUgaGFzIGFuIGFzc29jaWF0ZWQgW0RvdWJsZUxpbmtlZFF1ZXVlRW50cnldLgogIC8vLyBSZXR1cm5zIHRoZSBlbnRyeSBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBxdWV1ZS4KICAvLy8KICAvLy8gVGhlIGVudHJ5IG9iamVjdHMgY2FuIGFsc28gYmUgYWNjZXNzZWQgdXNpbmcgW2ZpcnN0RW50cnldLAogIC8vLyBhbmQgdGhleSBjYW4gYmUgaXRlcmF0ZWQgdXNpbmcgW0RvdWJsZUxpbmtlZFF1ZXVlRW50cnkubmV4dEVudHJ5KCldIGFuZAogIC8vLyBbRG91YmxlTGlua2VkUXVldWVFbnRyeS5wcmV2aW91c0VudHJ5KCldLgogIERvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4gbGFzdEVudHJ5KCkgewogICAgcmV0dXJuIF9zZW50aW5lbC5wcmV2aW91c0VudHJ5KCk7CiAgfQoKICBib29sIGdldCBpc0VtcHR5IHsKICAgIHJldHVybiAoaWRlbnRpY2FsKF9zZW50aW5lbC5fbmV4dExpbmssIF9zZW50aW5lbCkpOwogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIF9zZW50aW5lbC5fbmV4dExpbmsgPSBfc2VudGluZWw7CiAgICBfc2VudGluZWwuX3ByZXZpb3VzTGluayA9IF9zZW50aW5lbDsKICAgIF9lbGVtZW50Q291bnQgPSAwOwogIH0KCiAgLy8vIENhbGxzIFthY3Rpb25dIGZvciBlYWNoIGVudHJ5IG9iamVjdCBvZiB0aGlzIGRvdWJsZS1saW5rZWQgcXVldWUuCiAgLy8vCiAgLy8vIEVhY2ggZWxlbWVudCBvZiB0aGUgcXVldWUgaGFzIGFuIGFzc29jaWF0ZWQgW0RvdWJsZUxpbmtlZFF1ZXVlRW50cnldLgogIC8vLyBUaGlzIG1ldGhvZCBpdGVyYXRlcyB0aGUgZW50cnkgb2JqZWN0cyBmcm9tIGZpcnN0IHRvIGxhc3QgYW5kIGNhbGxzCiAgLy8vIFthY3Rpb25dIHdpdGggZWFjaCBvYmplY3QgaW4gdHVybi4KICAvLy8KICAvLy8gVGhlIGVudHJ5IG9iamVjdHMgY2FuIGFsc28gYmUgYWNjZXNzZWQgdXNpbmcgW2ZpcnN0RW50cnldIGFuZCBbbGFzdEVudHJ5XSwKICAvLy8gYW5kIGl0ZXJhdGVkIHVzaW5nIFtEb3VibGVMaW5rZWRRdWV1ZUVudHJ5Lm5leHRFbnRyeSgpXSBhbmQKICAvLy8gW0RvdWJsZUxpbmtlZFF1ZXVlRW50cnkucHJldmlvdXNFbnRyeSgpXS4KICAvLy8KICAvLy8gVGhlIFthY3Rpb25dIGZ1bmN0aW9uIGNhbiB1c2UgbWV0aG9kcyBvbiBbRG91YmxlTGlua2VkUXVldWVFbnRyeV0gdG8KICAvLy8gcmVtb3ZlIHRoZSBlbnRyeSBvciBpdCBjYW4gaW5zZXJ0IGVsZW1lbnRzIGJlZm9yZSBvciBhZnRlciB0aGVuIGVudHJ5LgogIC8vLyBJZiB0aGUgY3VycmVudCBlbnRyeSBpcyByZW1vdmVkLCBpdGVyYXRpb24gY29udGludWVzIHdpdGggdGhlIGVudHJ5IHRoYXQKICAvLy8gd2FzIGZvbGxvd2luZyB0aGUgY3VycmVudCBlbnRyeSB3aGVuIFthY3Rpb25dIHdhcyBjYWxsZWQuIEFueSBlbGVtZW50cwogIC8vLyBpbnNlcnRlZCBhZnRlciB0aGUgY3VycmVudCBlbGVtZW50IGJlZm9yZSBpdCBpcyByZW1vdmVkIHdpbGwgbm90IGJlCiAgLy8vIHZpc2l0ZWQgYnkgdGhlIGl0ZXJhdGlvbi4KICB2b2lkIGZvckVhY2hFbnRyeSh2b2lkIGFjdGlvbihEb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+IGVsZW1lbnQpKSB7CiAgICBfRG91YmxlTGlua2VkUXVldWVFbnRyeTxFPiBlbnRyeSA9IF9zZW50aW5lbC5fbmV4dExpbms7CiAgICB3aGlsZSAoIWlkZW50aWNhbChlbnRyeSwgX3NlbnRpbmVsKSkgewogICAgICBfRG91YmxlTGlua2VkUXVldWVFbGVtZW50PEU+IGVsZW1lbnQgPSBlbnRyeTsKICAgICAgX0RvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4gbmV4dCA9IGVsZW1lbnQuX25leHRMaW5rOwogICAgICAvLyBSZW1lbWJlciBib3RoIGVudHJ5IGFuZCBlbnRyeS5fbmV4dExpbmsuCiAgICAgIC8vIElmIHNvbWVvbmUgY2FsbHMgYGVsZW1lbnQucmVtb3ZlKClgIHdlIGNvbnRpbnVlIGZyb20gYG5leHRgLgogICAgICAvLyBPdGhlcndpc2Ugd2UgdXNlIHRoZSB2YWx1ZSBvZiBlbnRyeS5fbmV4dExpbmsgd2hpY2ggbWF5IGhhdmUgYmVlbgogICAgICAvLyB1cGRhdGVkLgogICAgICBhY3Rpb24oZWxlbWVudCk7CiAgICAgIGlmIChpZGVudGljYWwodGhpcywgZW50cnkuX3F1ZXVlKSkgewogICAgICAgIG5leHQgPSBlbnRyeS5fbmV4dExpbms7CiAgICAgIH0gZWxzZSBpZiAoIWlkZW50aWNhbCh0aGlzLCBuZXh0Ll9xdWV1ZSkpIHsKICAgICAgICB0aHJvdyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgICAgZW50cnkgPSBuZXh0OwogICAgfQogIH0KCiAgX0RvdWJsZUxpbmtlZFF1ZXVlSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yIHsKICAgIHJldHVybiBfRG91YmxlTGlua2VkUXVldWVJdGVyYXRvcjxFPihfc2VudGluZWwpOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gSXRlcmFibGVCYXNlLml0ZXJhYmxlVG9GdWxsU3RyaW5nKHRoaXMsICd7JywgJ30nKTsKfQoKY2xhc3MgX0RvdWJsZUxpbmtlZFF1ZXVlSXRlcmF0b3I8RT4gaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7CiAgX0RvdWJsZUxpbmtlZFF1ZXVlU2VudGluZWw8RT4gX3NlbnRpbmVsOwogIF9Eb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+IF9uZXh0RW50cnk7CiAgRSBfY3VycmVudDsKCiAgX0RvdWJsZUxpbmtlZFF1ZXVlSXRlcmF0b3IoX0RvdWJsZUxpbmtlZFF1ZXVlU2VudGluZWw8RT4gc2VudGluZWwpCiAgICAgIDogX3NlbnRpbmVsID0gc2VudGluZWwsCiAgICAgICAgX25leHRFbnRyeSA9IHNlbnRpbmVsLl9uZXh0TGluazsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmIChpZGVudGljYWwoX25leHRFbnRyeSwgX3NlbnRpbmVsKSkgewogICAgICBfY3VycmVudCA9IG51bGw7CiAgICAgIF9uZXh0RW50cnkgPSBudWxsOwogICAgICBfc2VudGluZWwgPSBudWxsOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBfRG91YmxlTGlua2VkUXVldWVFbGVtZW50PEU+IGVsZW1lbnRFbnRyeSA9IF9uZXh0RW50cnk7CiAgICBpZiAoIWlkZW50aWNhbChfc2VudGluZWwuX3F1ZXVlLCBlbGVtZW50RW50cnkuX3F1ZXVlKSkgewogICAgICB0aHJvdyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IoX3NlbnRpbmVsLl9xdWV1ZSk7CiAgICB9CiAgICBfY3VycmVudCA9IGVsZW1lbnRFbnRyeS5fZWxlbWVudDsKICAgIF9uZXh0RW50cnkgPSBlbGVtZW50RW50cnkuX25leHRMaW5rOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBFIGdldCBjdXJyZW50ID0+IF9jdXJyZW50Owp9CgovLy8gTGlzdCBiYXNlZCBbUXVldWVdLgovLy8KLy8vIEtlZXBzIGEgY3ljbGljIGJ1ZmZlciBvZiBlbGVtZW50cywgYW5kIGdyb3dzIHRvIGEgbGFyZ2VyIGJ1ZmZlciB3aGVuCi8vLyBpdCBmaWxscyB1cC4gVGhpcyBndWFyYW50ZWVzIGNvbnN0YW50IHRpbWUgcGVlayBhbmQgcmVtb3ZlIG9wZXJhdGlvbnMsIGFuZAovLy8gYW1vcnRpemVkIGNvbnN0YW50IHRpbWUgYWRkIG9wZXJhdGlvbnMuCi8vLwovLy8gVGhlIHN0cnVjdHVyZSBpcyBlZmZpY2llbnQgZm9yIGFueSBxdWV1ZSBvciBzdGFjayB1c2FnZS4KY2xhc3MgTGlzdFF1ZXVlPEU+IGV4dGVuZHMgTGlzdEl0ZXJhYmxlPEU+IGltcGxlbWVudHMgUXVldWU8RT4gewogIHN0YXRpYyBjb25zdCBpbnQgX0lOSVRJQUxfQ0FQQUNJVFkgPSA4OwogIExpc3Q8RT4gX3RhYmxlOwogIGludCBfaGVhZDsKICBpbnQgX3RhaWw7CiAgaW50IF9tb2RpZmljYXRpb25Db3VudCA9IDA7CgogIC8vLyBDcmVhdGUgYW4gZW1wdHkgcXVldWUuCiAgLy8vCiAgLy8vIElmIFtpbml0aWFsQ2FwYWNpdHldIGlzIGdpdmVuLCBwcmVwYXJlIHRoZSBxdWV1ZSBmb3IgYXQgbGVhc3QgdGhhdCBtYW55CiAgLy8vIGVsZW1lbnRzLgogIExpc3RRdWV1ZShbaW50IGluaXRpYWxDYXBhY2l0eV0pCiAgICAgIDogX2hlYWQgPSAwLAogICAgICAgIF90YWlsID0gMCB7CiAgICBpZiAoaW5pdGlhbENhcGFjaXR5ID09IG51bGwgfHwgaW5pdGlhbENhcGFjaXR5IDwgX0lOSVRJQUxfQ0FQQUNJVFkpIHsKICAgICAgaW5pdGlhbENhcGFjaXR5ID0gX0lOSVRJQUxfQ0FQQUNJVFk7CiAgICB9IGVsc2UgaWYgKCFfaXNQb3dlck9mMihpbml0aWFsQ2FwYWNpdHkpKSB7CiAgICAgIGluaXRpYWxDYXBhY2l0eSA9IF9uZXh0UG93ZXJPZjIoaW5pdGlhbENhcGFjaXR5KTsKICAgIH0KICAgIGFzc2VydChfaXNQb3dlck9mMihpbml0aWFsQ2FwYWNpdHkpKTsKICAgIF90YWJsZSA9IExpc3Q8RT4oaW5pdGlhbENhcGFjaXR5KTsKICB9CgogIC8vLyBDcmVhdGUgYSBgTGlzdFF1ZXVlYCBjb250YWluaW5nIGFsbCBbZWxlbWVudHNdLgogIC8vLwogIC8vLyBUaGUgZWxlbWVudHMgYXJlIGFkZGVkIHRvIHRoZSBxdWV1ZSwgYXMgYnkgW2FkZExhc3RdLCBpbiB0aGUgb3JkZXIgZ2l2ZW4KICAvLy8gYnkgYGVsZW1lbnRzLml0ZXJhdG9yYC4KICAvLy8KICAvLy8gQWxsIHRoZSBbZWxlbWVudHNdIHNob3VsZCBiZSBpbnN0YW5jZXMgb2YgW0VdLgogIC8vLyBUaGUgYGVsZW1lbnRzYCBpdGVyYWJsZSBpdHNlbGYgbWF5IGhhdmUgYW55IGVsZW1lbnQgdHlwZSwgc28gdGhpcwogIC8vLyBjb25zdHJ1Y3RvciBjYW4gYmUgdXNlZCB0byBkb3duLWNhc3QgYSBgUXVldWVgLCBmb3IgZXhhbXBsZSBhczoKICAvLy8gYGBgZGFydAogIC8vLyBRdWV1ZTxTdXBlclR5cGU+IHN1cGVyUXVldWUgPSAuLi47CiAgLy8vIFF1ZXVlPFN1YlR5cGU+IHN1YlF1ZXVlID0KICAvLy8gICAgIG5ldyBMaXN0UXVldWU8U3ViVHlwZT4uZnJvbShzdXBlclF1ZXVlLndoZXJlVHlwZTxTdWJUeXBlPigpKTsKICAvLy8gYGBgCiAgZmFjdG9yeSBMaXN0UXVldWUuZnJvbShJdGVyYWJsZSBlbGVtZW50cykgewogICAgaWYgKGVsZW1lbnRzIGlzIExpc3QpIHsKICAgICAgaW50IGxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDsKICAgICAgTGlzdFF1ZXVlPEU+IHF1ZXVlID0gTGlzdFF1ZXVlPEU+KGxlbmd0aCArIDEpOwogICAgICBhc3NlcnQocXVldWUuX3RhYmxlLmxlbmd0aCA+IGxlbmd0aCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICBxdWV1ZS5fdGFibGVbaV0gPSBlbGVtZW50c1tpXTsKICAgICAgfQogICAgICBxdWV1ZS5fdGFpbCA9IGxlbmd0aDsKICAgICAgcmV0dXJuIHF1ZXVlOwogICAgfSBlbHNlIHsKICAgICAgaW50IGNhcGFjaXR5ID0gX0lOSVRJQUxfQ0FQQUNJVFk7CiAgICAgIGlmIChlbGVtZW50cyBpcyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZSkgewogICAgICAgIGNhcGFjaXR5ID0gZWxlbWVudHMubGVuZ3RoOwogICAgICB9CiAgICAgIExpc3RRdWV1ZTxFPiByZXN1bHQgPSBMaXN0UXVldWU8RT4oY2FwYWNpdHkpOwogICAgICBmb3IgKGZpbmFsIGVsZW1lbnQgaW4gZWxlbWVudHMpIHsKICAgICAgICByZXN1bHQuYWRkTGFzdChlbGVtZW50KTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogIH0KCiAgLy8vIENyZWF0ZSBhIGBMaXN0UXVldWVgIGZyb20gW2VsZW1lbnRzXS4KICAvLy8KICAvLy8gVGhlIGVsZW1lbnRzIGFyZSBhZGRlZCB0byB0aGUgcXVldWUsIGFzIGJ5IFthZGRMYXN0XSwgaW4gdGhlIG9yZGVyIGdpdmVuCiAgLy8vIGJ5IGBlbGVtZW50cy5pdGVyYXRvcmAuCiAgZmFjdG9yeSBMaXN0UXVldWUub2YoSXRlcmFibGU8RT4gZWxlbWVudHMpID0+CiAgICAgIExpc3RRdWV1ZTxFPigpLi5hZGRBbGwoZWxlbWVudHMpOwoKICAvLyBJdGVyYWJsZSBpbnRlcmZhY2UuCgogIFF1ZXVlPFI+IGNhc3Q8Uj4oKSA9PiBRdWV1ZS5jYXN0RnJvbTxFLCBSPih0aGlzKTsKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3IgPT4gX0xpc3RRdWV1ZUl0ZXJhdG9yPEU+KHRoaXMpOwoKICB2b2lkIGZvckVhY2godm9pZCBmKEUgZWxlbWVudCkpIHsKICAgIGludCBtb2RpZmljYXRpb25Db3VudCA9IF9tb2RpZmljYXRpb25Db3VudDsKICAgIGZvciAoaW50IGkgPSBfaGVhZDsgaSAhPSBfdGFpbDsgaSA9IChpICsgMSkgJiAoX3RhYmxlLmxlbmd0aCAtIDEpKSB7CiAgICAgIGYoX3RhYmxlW2ldKTsKICAgICAgX2NoZWNrTW9kaWZpY2F0aW9uKG1vZGlmaWNhdGlvbkNvdW50KTsKICAgIH0KICB9CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2hlYWQgPT0gX3RhaWw7CgogIGludCBnZXQgbGVuZ3RoID0+IChfdGFpbCAtIF9oZWFkKSAmIChfdGFibGUubGVuZ3RoIC0gMSk7CgogIEUgZ2V0IGZpcnN0IHsKICAgIGlmIChfaGVhZCA9PSBfdGFpbCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICByZXR1cm4gX3RhYmxlW19oZWFkXTsKICB9CgogIEUgZ2V0IGxhc3QgewogICAgaWYgKF9oZWFkID09IF90YWlsKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIHJldHVybiBfdGFibGVbKF90YWlsIC0gMSkgJiAoX3RhYmxlLmxlbmd0aCAtIDEpXTsKICB9CgogIEUgZ2V0IHNpbmdsZSB7CiAgICBpZiAoX2hlYWQgPT0gX3RhaWwpIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgaWYgKGxlbmd0aCA+IDEpIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLnRvb01hbnkoKTsKICAgIHJldHVybiBfdGFibGVbX2hlYWRdOwogIH0KCiAgRSBlbGVtZW50QXQoaW50IGluZGV4KSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRJbmRleChpbmRleCwgdGhpcyk7CiAgICByZXR1cm4gX3RhYmxlWyhfaGVhZCArIGluZGV4KSAmIChfdGFibGUubGVuZ3RoIC0gMSldOwogIH0KCiAgTGlzdDxFPiB0b0xpc3Qoe2Jvb2wgZ3Jvd2FibGUgPSB0cnVlfSkgewogICAgTGlzdDxFPiBsaXN0OwogICAgaWYgKGdyb3dhYmxlKSB7CiAgICAgIGxpc3QgPSA8RT5bXS4ubGVuZ3RoID0gbGVuZ3RoOwogICAgfSBlbHNlIHsKICAgICAgbGlzdCA9IExpc3Q8RT4obGVuZ3RoKTsKICAgIH0KICAgIF93cml0ZVRvTGlzdChsaXN0KTsKICAgIHJldHVybiBsaXN0OwogIH0KCiAgLy8gQ29sbGVjdGlvbiBpbnRlcmZhY2UuCgogIHZvaWQgYWRkKEUgdmFsdWUpIHsKICAgIF9hZGQodmFsdWUpOwogIH0KCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gZWxlbWVudHMpIHsKICAgIGlmIChlbGVtZW50cyBpcyBMaXN0PEU+KSB7CiAgICAgIExpc3Q8RT4gbGlzdCA9IGVsZW1lbnRzOwogICAgICBpbnQgYWRkQ291bnQgPSBsaXN0Lmxlbmd0aDsKICAgICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgICBpZiAobGVuZ3RoICsgYWRkQ291bnQgPj0gX3RhYmxlLmxlbmd0aCkgewogICAgICAgIF9wcmVHcm93KGxlbmd0aCArIGFkZENvdW50KTsKICAgICAgICAvLyBBZnRlciBwcmVHcm93LCBhbGwgZWxlbWVudHMgYXJlIGF0IHRoZSBzdGFydCBvZiB0aGUgbGlzdC4KICAgICAgICBfdGFibGUuc2V0UmFuZ2UobGVuZ3RoLCBsZW5ndGggKyBhZGRDb3VudCwgbGlzdCwgMCk7CiAgICAgICAgX3RhaWwgKz0gYWRkQ291bnQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQWRkaW5nIGFkZENvdW50IGVsZW1lbnRzIHdvbid0IHJlYWNoIF9oZWFkLgogICAgICAgIGludCBlbmRTcGFjZSA9IF90YWJsZS5sZW5ndGggLSBfdGFpbDsKICAgICAgICBpZiAoYWRkQ291bnQgPCBlbmRTcGFjZSkgewogICAgICAgICAgX3RhYmxlLnNldFJhbmdlKF90YWlsLCBfdGFpbCArIGFkZENvdW50LCBsaXN0LCAwKTsKICAgICAgICAgIF90YWlsICs9IGFkZENvdW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbnQgcHJlU3BhY2UgPSBhZGRDb3VudCAtIGVuZFNwYWNlOwogICAgICAgICAgX3RhYmxlLnNldFJhbmdlKF90YWlsLCBfdGFpbCArIGVuZFNwYWNlLCBsaXN0LCAwKTsKICAgICAgICAgIF90YWJsZS5zZXRSYW5nZSgwLCBwcmVTcGFjZSwgbGlzdCwgZW5kU3BhY2UpOwogICAgICAgICAgX3RhaWwgPSBwcmVTcGFjZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgX21vZGlmaWNhdGlvbkNvdW50Kys7CiAgICB9IGVsc2UgewogICAgICBmb3IgKEUgZWxlbWVudCBpbiBlbGVtZW50cykgX2FkZChlbGVtZW50KTsKICAgIH0KICB9CgogIGJvb2wgcmVtb3ZlKE9iamVjdCB2YWx1ZSkgewogICAgZm9yIChpbnQgaSA9IF9oZWFkOyBpICE9IF90YWlsOyBpID0gKGkgKyAxKSAmIChfdGFibGUubGVuZ3RoIC0gMSkpIHsKICAgICAgRSBlbGVtZW50ID0gX3RhYmxlW2ldOwogICAgICBpZiAoZWxlbWVudCA9PSB2YWx1ZSkgewogICAgICAgIF9yZW1vdmUoaSk7CiAgICAgICAgX21vZGlmaWNhdGlvbkNvdW50Kys7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIHZvaWQgX2ZpbHRlcldoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCBib29sIHJlbW92ZU1hdGNoaW5nKSB7CiAgICBpbnQgbW9kaWZpY2F0aW9uQ291bnQgPSBfbW9kaWZpY2F0aW9uQ291bnQ7CiAgICBpbnQgaSA9IF9oZWFkOwogICAgd2hpbGUgKGkgIT0gX3RhaWwpIHsKICAgICAgRSBlbGVtZW50ID0gX3RhYmxlW2ldOwogICAgICBib29sIHJlbW92ZSA9IGlkZW50aWNhbChyZW1vdmVNYXRjaGluZywgdGVzdChlbGVtZW50KSk7CiAgICAgIF9jaGVja01vZGlmaWNhdGlvbihtb2RpZmljYXRpb25Db3VudCk7CiAgICAgIGlmIChyZW1vdmUpIHsKICAgICAgICBpID0gX3JlbW92ZShpKTsKICAgICAgICBtb2RpZmljYXRpb25Db3VudCA9ICsrX21vZGlmaWNhdGlvbkNvdW50OwogICAgICB9IGVsc2UgewogICAgICAgIGkgPSAoaSArIDEpICYgKF90YWJsZS5sZW5ndGggLSAxKTsKICAgICAgfQogICAgfQogIH0KCiAgLy8vIFJlbW92ZSBhbGwgZWxlbWVudHMgbWF0Y2hlZCBieSBbdGVzdF0uCiAgLy8vCiAgLy8vIFRoaXMgbWV0aG9kIGlzIGluZWZmaWNpZW50IHNpbmNlIGl0IHdvcmtzIGJ5IHJlcGVhdGVkbHkgcmVtb3Zpbmcgc2luZ2xlCiAgLy8vIGVsZW1lbnRzLCBlYWNoIG9mIHdoaWNoIGNhbiB0YWtlIGxpbmVhciB0aW1lLgogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIF9maWx0ZXJXaGVyZSh0ZXN0LCB0cnVlKTsKICB9CgogIC8vLyBSZW1vdmUgYWxsIGVsZW1lbnRzIG5vdCBtYXRjaGVkIGJ5IFt0ZXN0XS4KICAvLy8KICAvLy8gVGhpcyBtZXRob2QgaXMgaW5lZmZpY2llbnQgc2luY2UgaXQgd29ya3MgYnkgcmVwZWF0ZWRseSByZW1vdmluZyBzaW5nbGUKICAvLy8gZWxlbWVudHMsIGVhY2ggb2Ygd2hpY2ggY2FuIHRha2UgbGluZWFyIHRpbWUuCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgX2ZpbHRlcldoZXJlKHRlc3QsIGZhbHNlKTsKICB9CgogIHZvaWQgY2xlYXIoKSB7CiAgICBpZiAoX2hlYWQgIT0gX3RhaWwpIHsKICAgICAgZm9yIChpbnQgaSA9IF9oZWFkOyBpICE9IF90YWlsOyBpID0gKGkgKyAxKSAmIChfdGFibGUubGVuZ3RoIC0gMSkpIHsKICAgICAgICBfdGFibGVbaV0gPSBudWxsOwogICAgICB9CiAgICAgIF9oZWFkID0gX3RhaWwgPSAwOwogICAgICBfbW9kaWZpY2F0aW9uQ291bnQrKzsKICAgIH0KICB9CgogIFN0cmluZyB0b1N0cmluZygpID0+IEl0ZXJhYmxlQmFzZS5pdGVyYWJsZVRvRnVsbFN0cmluZyh0aGlzLCAieyIsICJ9Iik7CgogIC8vIFF1ZXVlIGludGVyZmFjZS4KCiAgdm9pZCBhZGRMYXN0KEUgdmFsdWUpIHsKICAgIF9hZGQodmFsdWUpOwogIH0KCiAgdm9pZCBhZGRGaXJzdChFIHZhbHVlKSB7CiAgICBfaGVhZCA9IChfaGVhZCAtIDEpICYgKF90YWJsZS5sZW5ndGggLSAxKTsKICAgIF90YWJsZVtfaGVhZF0gPSB2YWx1ZTsKICAgIGlmIChfaGVhZCA9PSBfdGFpbCkgX2dyb3coKTsKICAgIF9tb2RpZmljYXRpb25Db3VudCsrOwogIH0KCiAgRSByZW1vdmVGaXJzdCgpIHsKICAgIGlmIChfaGVhZCA9PSBfdGFpbCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICBfbW9kaWZpY2F0aW9uQ291bnQrKzsKICAgIEUgcmVzdWx0ID0gX3RhYmxlW19oZWFkXTsKICAgIF90YWJsZVtfaGVhZF0gPSBudWxsOwogICAgX2hlYWQgPSAoX2hlYWQgKyAxKSAmIChfdGFibGUubGVuZ3RoIC0gMSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgRSByZW1vdmVMYXN0KCkgewogICAgaWYgKF9oZWFkID09IF90YWlsKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIF9tb2RpZmljYXRpb25Db3VudCsrOwogICAgX3RhaWwgPSAoX3RhaWwgLSAxKSAmIChfdGFibGUubGVuZ3RoIC0gMSk7CiAgICBFIHJlc3VsdCA9IF90YWJsZVtfdGFpbF07CiAgICBfdGFibGVbX3RhaWxdID0gbnVsbDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLyBJbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb25zLgoKICAvLy8gV2hldGhlciBbbnVtYmVyXSBpcyBhIHBvd2VyIG9mIHR3by4KICAvLy8KICAvLy8gT25seSB3b3JrcyBmb3IgcG9zaXRpdmUgbnVtYmVycy4KICBzdGF0aWMgYm9vbCBfaXNQb3dlck9mMihpbnQgbnVtYmVyKSA9PiAobnVtYmVyICYgKG51bWJlciAtIDEpKSA9PSAwOwoKICAvLy8gUm91bmRzIFtudW1iZXJdIHVwIHRvIHRoZSBuZWFyZXN0IHBvd2VyIG9mIDIuCiAgLy8vCiAgLy8vIElmIFtudW1iZXJdIGlzIGEgcG93ZXIgb2YgMiBhbHJlYWR5LCBpdCBpcyByZXR1cm5lZC4KICAvLy8KICAvLy8gT25seSB3b3JrcyBmb3IgcG9zaXRpdmUgbnVtYmVycy4KICBzdGF0aWMgaW50IF9uZXh0UG93ZXJPZjIoaW50IG51bWJlcikgewogICAgYXNzZXJ0KG51bWJlciA+IDApOwogICAgbnVtYmVyID0gKG51bWJlciA8PCAxKSAtIDE7CiAgICBmb3IgKDs7KSB7CiAgICAgIGludCBuZXh0TnVtYmVyID0gbnVtYmVyICYgKG51bWJlciAtIDEpOwogICAgICBpZiAobmV4dE51bWJlciA9PSAwKSByZXR1cm4gbnVtYmVyOwogICAgICBudW1iZXIgPSBuZXh0TnVtYmVyOwogICAgfQogIH0KCiAgLy8vIENoZWNrIGlmIHRoZSBxdWV1ZSBoYXMgYmVlbiBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLgogIHZvaWQgX2NoZWNrTW9kaWZpY2F0aW9uKGludCBleHBlY3RlZE1vZGlmaWNhdGlvbkNvdW50KSB7CiAgICBpZiAoZXhwZWN0ZWRNb2RpZmljYXRpb25Db3VudCAhPSBfbW9kaWZpY2F0aW9uQ291bnQpIHsKICAgICAgdGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgfQogIH0KCiAgLy8vIEFkZHMgZWxlbWVudCBhdCBlbmQgb2YgcXVldWUuIFVzZWQgYnkgYm90aCBbYWRkXSBhbmQgW2FkZEFsbF0uCiAgdm9pZCBfYWRkKEUgZWxlbWVudCkgewogICAgX3RhYmxlW190YWlsXSA9IGVsZW1lbnQ7CiAgICBfdGFpbCA9IChfdGFpbCArIDEpICYgKF90YWJsZS5sZW5ndGggLSAxKTsKICAgIGlmIChfaGVhZCA9PSBfdGFpbCkgX2dyb3coKTsKICAgIF9tb2RpZmljYXRpb25Db3VudCsrOwogIH0KCiAgLy8vIFJlbW92ZXMgdGhlIGVsZW1lbnQgYXQgW29mZnNldF0gaW50byBbX3RhYmxlXS4KICAvLy8KICAvLy8gUmVtb3ZhbCBpcyBwZXJmb3JtZWQgYnkgbGluZWFybHkgbW92aW5nIGVsZW1lbnRzIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIKICAvLy8gW29mZnNldF0gYnkgb25lIHBvc2l0aW9uLgogIC8vLwogIC8vLyBSZXR1cm5zIHRoZSBuZXcgb2Zmc2V0IG9mIHRoZSBmb2xsb3dpbmcgZWxlbWVudC4gVGhpcyBtYXkgYmUgdGhlIHNhbWUKICAvLy8gb2Zmc2V0IG9yIHRoZSBmb2xsb3dpbmcgb2Zmc2V0IGRlcGVuZGluZyBvbiBob3cgZWxlbWVudHMgYXJlIG1vdmVkCiAgLy8vIHRvIGZpbGwgdGhlIGhvbGUuCiAgaW50IF9yZW1vdmUoaW50IG9mZnNldCkgewogICAgaW50IG1hc2sgPSBfdGFibGUubGVuZ3RoIC0gMTsKICAgIGludCBzdGFydERpc3RhbmNlID0gKG9mZnNldCAtIF9oZWFkKSAmIG1hc2s7CiAgICBpbnQgZW5kRGlzdGFuY2UgPSAoX3RhaWwgLSBvZmZzZXQpICYgbWFzazsKICAgIGlmIChzdGFydERpc3RhbmNlIDwgZW5kRGlzdGFuY2UpIHsKICAgICAgLy8gQ2xvc2VzdCB0byBzdGFydC4KICAgICAgaW50IGkgPSBvZmZzZXQ7CiAgICAgIHdoaWxlIChpICE9IF9oZWFkKSB7CiAgICAgICAgaW50IHByZXZPZmZzZXQgPSAoaSAtIDEpICYgbWFzazsKICAgICAgICBfdGFibGVbaV0gPSBfdGFibGVbcHJldk9mZnNldF07CiAgICAgICAgaSA9IHByZXZPZmZzZXQ7CiAgICAgIH0KICAgICAgX3RhYmxlW19oZWFkXSA9IG51bGw7CiAgICAgIF9oZWFkID0gKF9oZWFkICsgMSkgJiBtYXNrOwogICAgICByZXR1cm4gKG9mZnNldCArIDEpICYgbWFzazsKICAgIH0gZWxzZSB7CiAgICAgIF90YWlsID0gKF90YWlsIC0gMSkgJiBtYXNrOwogICAgICBpbnQgaSA9IG9mZnNldDsKICAgICAgd2hpbGUgKGkgIT0gX3RhaWwpIHsKICAgICAgICBpbnQgbmV4dE9mZnNldCA9IChpICsgMSkgJiBtYXNrOwogICAgICAgIF90YWJsZVtpXSA9IF90YWJsZVtuZXh0T2Zmc2V0XTsKICAgICAgICBpID0gbmV4dE9mZnNldDsKICAgICAgfQogICAgICBfdGFibGVbX3RhaWxdID0gbnVsbDsKICAgICAgcmV0dXJuIG9mZnNldDsKICAgIH0KICB9CgogIC8vLyBHcm93IHRoZSB0YWJsZSB3aGVuIGZ1bGwuCiAgdm9pZCBfZ3JvdygpIHsKICAgIExpc3Q8RT4gbmV3VGFibGUgPSBMaXN0PEU+KF90YWJsZS5sZW5ndGggKiAyKTsKICAgIGludCBzcGxpdCA9IF90YWJsZS5sZW5ndGggLSBfaGVhZDsKICAgIG5ld1RhYmxlLnNldFJhbmdlKDAsIHNwbGl0LCBfdGFibGUsIF9oZWFkKTsKICAgIG5ld1RhYmxlLnNldFJhbmdlKHNwbGl0LCBzcGxpdCArIF9oZWFkLCBfdGFibGUsIDApOwogICAgX2hlYWQgPSAwOwogICAgX3RhaWwgPSBfdGFibGUubGVuZ3RoOwogICAgX3RhYmxlID0gbmV3VGFibGU7CiAgfQoKICBpbnQgX3dyaXRlVG9MaXN0KExpc3Q8RT4gdGFyZ2V0KSB7CiAgICBhc3NlcnQodGFyZ2V0Lmxlbmd0aCA+PSBsZW5ndGgpOwogICAgaWYgKF9oZWFkIDw9IF90YWlsKSB7CiAgICAgIGludCBsZW5ndGggPSBfdGFpbCAtIF9oZWFkOwogICAgICB0YXJnZXQuc2V0UmFuZ2UoMCwgbGVuZ3RoLCBfdGFibGUsIF9oZWFkKTsKICAgICAgcmV0dXJuIGxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIGludCBmaXJzdFBhcnRTaXplID0gX3RhYmxlLmxlbmd0aCAtIF9oZWFkOwogICAgICB0YXJnZXQuc2V0UmFuZ2UoMCwgZmlyc3RQYXJ0U2l6ZSwgX3RhYmxlLCBfaGVhZCk7CiAgICAgIHRhcmdldC5zZXRSYW5nZShmaXJzdFBhcnRTaXplLCBmaXJzdFBhcnRTaXplICsgX3RhaWwsIF90YWJsZSwgMCk7CiAgICAgIHJldHVybiBfdGFpbCArIGZpcnN0UGFydFNpemU7CiAgICB9CiAgfQoKICAvLy8gR3Jvd3MgdGhlIHRhYmxlIGV2ZW4gaWYgaXQgaXMgbm90IGZ1bGwuCiAgdm9pZCBfcHJlR3JvdyhpbnQgbmV3RWxlbWVudENvdW50KSB7CiAgICBhc3NlcnQobmV3RWxlbWVudENvdW50ID49IGxlbmd0aCk7CgogICAgLy8gQWRkIHNvbWUgZXh0cmEgcm9vbSB0byBlbnN1cmUgdGhhdCB0aGVyZSdzIHJvb20gZm9yIG1vcmUgZWxlbWVudHMgYWZ0ZXIKICAgIC8vIGV4cGFuc2lvbi4KICAgIG5ld0VsZW1lbnRDb3VudCArPSBuZXdFbGVtZW50Q291bnQgPj4gMTsKICAgIGludCBuZXdDYXBhY2l0eSA9IF9uZXh0UG93ZXJPZjIobmV3RWxlbWVudENvdW50KTsKICAgIExpc3Q8RT4gbmV3VGFibGUgPSBMaXN0PEU+KG5ld0NhcGFjaXR5KTsKICAgIF90YWlsID0gX3dyaXRlVG9MaXN0KG5ld1RhYmxlKTsKICAgIF90YWJsZSA9IG5ld1RhYmxlOwogICAgX2hlYWQgPSAwOwogIH0KfQoKLy8vIEl0ZXJhdG9yIGZvciBhIFtMaXN0UXVldWVdLgovLy8KLy8vIENvbnNpZGVycyBhbnkgYWRkIG9yIHJlbW92ZSBvcGVyYXRpb24gYSBjb25jdXJyZW50IG1vZGlmaWNhdGlvbi4KY2xhc3MgX0xpc3RRdWV1ZUl0ZXJhdG9yPEU+IGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewogIGZpbmFsIExpc3RRdWV1ZTxFPiBfcXVldWU7CiAgZmluYWwgaW50IF9lbmQ7CiAgZmluYWwgaW50IF9tb2RpZmljYXRpb25Db3VudDsKICBpbnQgX3Bvc2l0aW9uOwogIEUgX2N1cnJlbnQ7CgogIF9MaXN0UXVldWVJdGVyYXRvcihM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Zm9yIGNvbW1vbiBkYXRhIHJlcHJlc2VudGF0aW9ucywgdGhpcyBsaWJyYXJ5Ci8vLyBwcm92aWRlcyBzdXBwb3J0IGZvciBpbXBsZW1lbnRpbmcgY29udmVydGVycyBpbiBhIHdheSB3aGljaCBtYWtlcyB0aGVtIGVhc3kgdG8KLy8vIGNoYWluIGFuZCB0byB1c2Ugd2l0aCBzdHJlYW1zLgovLy8KLy8vIFRvIHVzZSB0aGlzIGxpYnJhcnkgaW4geW91ciBjb2RlOgovLy8KLy8vICAgICBpbXBvcnQgJ2RhcnQ6Y29udmVydCc7Ci8vLwovLy8gVHdvIGNvbW1vbmx5IHVzZWQgY29udmVydGVycyBhcmUgdGhlIHRvcC1sZXZlbCBpbnN0YW5jZXMgb2YKLy8vIFtKc29uQ29kZWNdIGFuZCBbVXRmOENvZGVjXSwgbmFtZWQgW2pzb25dIGFuZCBbdXRmOF0sIHJlc3BlY3RpdmVseS4KLy8vCi8vLyBKU09OIGlzIGEgc2ltcGxlIHRleHQgZm9ybWF0IGZvciByZXByZXNlbnRpbmcKLy8vIHN0cnVjdHVyZWQgb2JqZWN0cyBhbmQgY29sbGVjdGlvbnMuCi8vLyBUaGUgSlNPTiBlbmNvZGVyL2RlY29kZXIgdHJhbnNmb3JtcyBiZXR3ZWVuIHN0cmluZ3MgYW5kCi8vLyBvYmplY3Qgc3RydWN0dXJlcywgc3VjaCBhcyBsaXN0cyBhbmQgbWFwcywgdXNpbmcgdGhlIEpTT04gZm9ybWF0LgovLy8KLy8vIFVURi04IGlzIGEgY29tbW9uIHZhcmlhYmxlLXdpZHRoIGVuY29kaW5nIHRoYXQgY2FuIHJlcHJlc2VudAovLy8gZXZlcnkgY2hhcmFjdGVyIGluIHRoZSBVbmljb2RlIGNoYXJhY3RlciBzZXQuCi8vLyBUaGUgVVRGLTggZW5jb2Rlci9kZWNvZGVyIHRyYW5zZm9ybXMgYmV0d2VlbiBTdHJpbmdzIGFuZCBieXRlcy4KLy8vCi8vLyBDb252ZXJ0ZXJzIGFyZSBvZnRlbiB1c2VkIHdpdGggc3RyZWFtcwovLy8gdG8gdHJhbnNmb3JtIHRoZSBkYXRhIHRoYXQgY29tZXMgdGhyb3VnaCB0aGUgc3RyZWFtCi8vLyBhcyBpdCBiZWNvbWVzIGF2YWlsYWJsZS4KLy8vIFRoZSBmb2xsb3dpbmcgY29kZSB1c2VzIHR3byBjb252ZXJ0ZXJzLgovLy8gVGhlIGZpcnN0IGlzIGEgVVRGLTggZGVjb2Rlciwgd2hpY2ggY29udmVydHMgdGhlIGRhdGEgZnJvbSBieXRlcyB0byBVVEYtOAovLy8gYXMgaXQncyByZWFkIGZyb20gYSBmaWxlLAovLy8gVGhlIHNlY29uZCBpcyBhbiBpbnN0YW5jZSBvZiBbTGluZVNwbGl0dGVyXSwKLy8vIHdoaWNoIHNwbGl0cyB0aGUgZGF0YSBvbiBuZXdsaW5lIGJvdW5kYXJpZXMuCi8vLwovLy8gICAgIHZhciBsaW5lTnVtYmVyID0gMTsKLy8vICAgICB2YXIgc3RyZWFtID0gRmlsZSgncXVvdGVzLnR4dCcpLm9wZW5SZWFkKCk7Ci8vLwovLy8gICAgIHN0cmVhbS50cmFuc2Zvcm0odXRmOC5kZWNvZGVyKQovLy8gICAgICAgICAgIC50cmFuc2Zvcm0oY29uc3QgTGluZVNwbGl0dGVyKCkpCi8vLyAgICAgICAgICAgLmxpc3RlbigobGluZSkgewovLy8gICAgICAgICAgICAgaWYgKHNob3dMaW5lTnVtYmVycykgewovLy8gICAgICAgICAgICAgICBzdGRvdXQud3JpdGUoJyR7bGluZU51bWJlcisrfSAnKTsKLy8vICAgICAgICAgICAgIH0KLy8vICAgICAgICAgICAgIHN0ZG91dC53cml0ZWxuKGxpbmUpOwovLy8gICAgICAgICAgIH0pOwovLy8KLy8vIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIFtDb2RlY10gYW5kIFtDb252ZXJ0ZXJdIGNsYXNzZXMKLy8vIGZvciBpbmZvcm1hdGlvbiBhYm91dCBjcmVhdGluZyB5b3VyIG93biBjb252ZXJ0ZXJzLgovLy8KLy8vIHtAY2F0ZWdvcnkgQ29yZX0KbGlicmFyeSBkYXJ0LmNvbnZlcnQ7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CmltcG9ydCAnZGFydDpfaW50ZXJuYWwnIHNob3cgQ2FzdENvbnZlcnRlciwgcGFyc2VIZXhCeXRlOwoKcGFydCAnYXNjaWkuZGFydCc7CnBhcnQgJ2Jhc2U2NC5kYXJ0JzsKcGFydCAnYnl0ZV9jb252ZXJzaW9uLmRhcnQnOwpwYXJ0ICdjaHVua2VkX2NvbnZlcnNpb24uZGFydCc7CnBhcnQgJ2NvZGVjLmRhcnQnOwpwYXJ0ICdjb252ZXJ0ZXIuZGFydCc7CnBhcnQgJ2VuY29kaW5nLmRhcnQnOwpwYXJ0ICdodG1sX2VzY2FwZS5kYXJ0JzsKcGFydCAnanNvbi5kYXJ0JzsKcGFydCAnbGF0aW4xLmRhcnQnOwpwYXJ0ICdsaW5lX3NwbGl0dGVyLmRhcnQnOwpwYXJ0ICdzdHJpbmdfY29udmVyc2lvbi5kYXJ0JzsKcGFydCAndXRmLmRhcnQnOwpKAE5OPAEEUR4ETFMjBCYEHwRASAQyKDxGBEEyRAQrOB0sTh4xMQQcNAQnLx8nNBImEgRCOAQVFgEVGjoBExQdIBMXFhkSFBsfEQEMZGFydDpjb252ZXJ0Mm9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvY29udmVydF9wYXRjaC5kYXJ0wADnsi8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gTm90ZTogdGhlIFZNIGNvbmNhdGVuYXRlcyBhbGwgcGF0Y2ggZmlsZXMgaW50byBhIHNpbmdsZSBwYXRjaCBmaWxlLiBUaGlzCi8vLyBmaWxlIGlzIHRoZSBmaXJzdCBwYXRjaCBpbiAiZGFydDpjb252ZXJ0IiB3aGljaCBjb250YWlucyBhbGwgdGhlIGltcG9ydHMKLy8vIHVzZWQgYnkgcGF0Y2hlcyBvZiB0aGF0IGxpYnJhcnkuIFdlIHBsYW4gdG8gY2hhbmdlIHRoaXMgd2hlbiB3ZSBoYXZlIGEKLy8vIHNoYXJlZCBmcm9udCBlbmQgYW5kIHNpbXBseSB1c2UgcGFydHMuCgppbXBvcnQgImRhcnQ6X2ludGVybmFsIiBzaG93IFBPV0VSU19PRl9URU4sIHBhdGNoLCBDbGFzc0lEOwoKaW1wb3J0ICJkYXJ0OnR5cGVkX2RhdGEiIHNob3cgVWludDhMaXN0LCBVaW50MTZMaXN0OwoKLy8vIFRoaXMgcGF0Y2ggbGlicmFyeSBoYXMgbm8gYWRkaXRpb25hbCBwYXJ0cy4KCi8vIEpTT04gY29udmVyc2lvbi4KCkBwYXRjaApfcGFyc2VKc29uKFN0cmluZyBzb3VyY2UsIHJldml2ZXIoa2V5LCB2YWx1ZSkpIHsKICBfQnVpbGRKc29uTGlzdGVuZXIgbGlzdGVuZXI7CiAgaWYgKHJldml2ZXIgPT0gbnVsbCkgewogICAgbGlzdGVuZXIgPSBuZXcgX0J1aWxkSnNvbkxpc3RlbmVyKCk7CiAgfSBlbHNlIHsKICAgIGxpc3RlbmVyID0gbmV3IF9SZXZpdmVySnNvbkxpc3RlbmVyKHJldml2ZXIpOwogIH0KICB2YXIgcGFyc2VyID0gbmV3IF9Kc29uU3RyaW5nUGFyc2VyKGxpc3RlbmVyKTsKICBwYXJzZXIuY2h1bmsgPSBzb3VyY2U7CiAgcGFyc2VyLmNodW5rRW5kID0gc291cmNlLmxlbmd0aDsKICBwYXJzZXIucGFyc2UoMCk7CiAgcGFyc2VyLmNsb3NlKCk7CiAgcmV0dXJuIGxpc3RlbmVyLnJlc3VsdDsKfQoKQHBhdGNoCmNsYXNzIFV0ZjhEZWNvZGVyIHsKICBAcGF0Y2gKICBDb252ZXJ0ZXI8TGlzdDxpbnQ+LCBUPiBmdXNlPFQ+KENvbnZlcnRlcjxTdHJpbmcsIFQ+IG5leHQpIHsKICAgIGlmIChuZXh0IGlzIEpzb25EZWNvZGVyKSB7CiAgICAgIHJldHVybiBuZXcgX0pzb25VdGY4RGVjb2RlcigKICAgICAgICAgICAgICAobmV4dCBhcyBKc29uRGVjb2RlcikuX3Jldml2ZXIsIHRoaXMuX2FsbG93TWFsZm9ybWVkKQogICAgICAgICAgYXMgZHluYW1pYy8qPUNvbnZlcnRlcjxMaXN0PGludD4sIFQ+Ki87CiAgICB9CiAgICAvLyBUT0RPKGxybik6IFJlY29nbml6ZSBhIGZ1c2VkIGRlY29kZXIgd2hlcmUgdGhlIG5leHQgc3RlcCBpcyBKc29uRGVjb2Rlci4KICAgIHJldHVybiBzdXBlci5mdXNlPFQ+KG5leHQpOwogIH0KCiAgLy8gQWxsb3cgaW50ZXJjZXB0aW5nIG9mIFVURi04IGRlY29kaW5nIHdoZW4gYnVpbHQtaW4gbGlzdHMgYXJlIHBhc3NlZC4KICBAcGF0Y2gKICBzdGF0aWMgU3RyaW5nIF9jb252ZXJ0SW50ZXJjZXB0ZWQoCiAgICAgIGJvb2wgYWxsb3dNYWxmb3JtZWQsIExpc3Q8aW50PiBjb2RlVW5pdHMsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgcmV0dXJuIG51bGw7IC8vIFRoaXMgY2FsbCB3YXMgbm90IGludGVyY2VwdGVkLgogIH0KfQoKY2xhc3MgX0pzb25VdGY4RGVjb2RlciBleHRlbmRzIENvbnZlcnRlcjxMaXN0PGludD4sIE9iamVjdD4gewogIGZpbmFsIEZ1bmN0aW9uKE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgX3Jldml2ZXI7CiAgZmluYWwgYm9vbCBfYWxsb3dNYWxmb3JtZWQ7CgogIF9Kc29uVXRmOERlY29kZXIodGhpcy5fcmV2aXZlciwgdGhpcy5fYWxsb3dNYWxmb3JtZWQpOwoKICBPYmplY3QgY29udmVydChMaXN0PGludD4gaW5wdXQpIHsKICAgIHZhciBwYXJzZXIgPSBfSnNvblV0ZjhEZWNvZGVyU2luay5fY3JlYXRlUGFyc2VyKF9yZXZpdmVyLCBfYWxsb3dNYWxmb3JtZWQpOwogICAgcGFyc2VyLmNodW5rID0gaW5wdXQ7CiAgICBwYXJzZXIuY2h1bmtFbmQgPSBpbnB1dC5sZW5ndGg7CiAgICBwYXJzZXIucGFyc2UoMCk7CiAgICBwYXJzZXIuY2xvc2UoKTsKICAgIHJldHVybiBwYXJzZXIucmVzdWx0OwogIH0KCiAgQnl0ZUNvbnZlcnNpb25TaW5rIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxPYmplY3Q+IHNpbmspIHsKICAgIHJldHVybiBuZXcgX0pzb25VdGY4RGVjb2RlclNpbmsoX3Jldml2ZXIsIHNpbmssIF9hbGxvd01hbGZvcm1lZCk7CiAgfQp9CgovLy8vIEltcGxlbWVudGF0aW9uIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgovLyBTaW1wbGUgQVBJIGZvciBKU09OIHBhcnNpbmcuCgovKioKICogTGlzdGVuZXIgZm9yIHBhcnNpbmcgZXZlbnRzIGZyb20gW19DaHVua2VkSnNvblBhcnNlcl0uCiAqLwphYnN0cmFjdCBjbGFzcyBfSnNvbkxpc3RlbmVyIHsKICB2b2lkIGhhbmRsZVN0cmluZyhTdHJpbmcgdmFsdWUpIHt9CiAgdm9pZCBoYW5kbGVOdW1iZXIobnVtIHZhbHVlKSB7fQogIHZvaWQgaGFuZGxlQm9vbChib29sIHZhbHVlKSB7fQogIHZvaWQgaGFuZGxlTnVsbCgpIHt9CiAgdm9pZCBiZWdpbk9iamVjdCgpIHt9CiAgdm9pZCBwcm9wZXJ0eU5hbWUoKSB7fQogIHZvaWQgcHJvcGVydHlWYWx1ZSgpIHt9CiAgdm9pZCBlbmRPYmplY3QoKSB7fQogIHZvaWQgYmVnaW5BcnJheSgpIHt9CiAgdm9pZCBhcnJheUVsZW1lbnQoKSB7fQogIHZvaWQgZW5kQXJyYXkoKSB7fQoKICAvKioKICAgKiBSZWFkIG91dCB0aGUgZmluYWwgcmVzdWx0IG9mIHBhcnNpbmcgYSBKU09OIHN0cmluZy4KICAgKgogICAqIE11c3Qgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgZW50aXJlIGlucHV0IGhhcyBiZWVuIHBhcnNlZC4KICAgKi8KICBnZXQgcmVzdWx0Owp9CgovKioKICogQSBbX0pzb25MaXN0ZW5lcl0gdGhhdCBidWlsZHMgZGF0YSBvYmplY3RzIGZyb20gdGhlIHBhcnNlciBldmVudHMuCiAqCiAqIFRoaXMgaXMgYSBzaW1wbGUgc3RhY2stYmFzZWQgb2JqZWN0IGJ1aWxkZXIuIEl0IGtlZXBzIHRoZSBtb3N0IHJlY2VudGx5CiAqIHNlZW4gdmFsdWUgaW4gYSB2YXJpYWJsZSwgYW5kIHVzZXMgaXQgZGVwZW5kaW5nIG9uIHRoZSBmb2xsb3dpbmcgZXZlbnQuCiAqLwpjbGFzcyBfQnVpbGRKc29uTGlzdGVuZXIgZXh0ZW5kcyBfSnNvbkxpc3RlbmVyIHsKICAvKioKICAgKiBTdGFjayB1c2VkIHRvIGhhbmRsZSBuZXN0ZWQgY29udGFpbmVycy4KICAgKgogICAqIFRoZSBjdXJyZW50IGNvbnRhaW5lciBpcyBwdXNoZWQgb24gdGhlIHN0YWNrIHdoZW4gYSBuZXcgb25lIGlzCiAgICogc3RhcnRlZC4gSWYgdGhlIGNvbnRhaW5lciBpcyBhIFtNYXBdLCB0aGVyZSBpcyBhbHNvIGEgY3VycmVudCBba2V5XQogICAqIHdoaWNoIGlzIGFsc28gc3RvcmVkIG9uIHRoZSBzdGFjay4KICAgKi8KICBMaXN0IHN0YWNrID0gW107CiAgLyoqIFRoZSBjdXJyZW50IFtNYXBdIG9yIFtMaXN0XSBiZWluZyBidWlsdC4gKi8KICB2YXIgY3VycmVudENvbnRhaW5lcjsKICAvKiogVGhlIG1vc3QgcmVjZW50bHkgcmVhZCBwcm9wZXJ0eSBrZXkuICovCiAgU3RyaW5nIGtleTsKICAvKiogVGhlIG1vc3QgcmVjZW50bHkgcmVhZCB2YWx1ZS4gKi8KICB2YXIgdmFsdWU7CgogIC8qKiBQdXNoZXMgdGhlIGN1cnJlbnRseSBhY3RpdmUgY29udGFpbmVyIChhbmQga2V5LCBpZiBhIFtNYXBdKS4gKi8KICB2b2lkIHB1c2hDb250YWluZXIoKSB7CiAgICBpZiAoY3VycmVudENvbnRhaW5lciBpcyBNYXApIHN0YWNrLmFkZChrZXkpOwogICAgc3RhY2suYWRkKGN1cnJlbnRDb250YWluZXIpOwogIH0KCiAgLyoqIFBvcHMgdGhlIHRvcCBjb250YWluZXIgZnJvbSB0aGUgW3N0YWNrXSwgaW5jbHVkaW5nIGEga2V5IGlmIGFwcGxpY2FibGUuICovCiAgdm9pZCBwb3BDb250YWluZXIoKSB7CiAgICB2YWx1ZSA9IGN1cnJlbnRDb250YWluZXI7CiAgICBjdXJyZW50Q29udGFpbmVyID0gc3RhY2sucmVtb3ZlTGFzdCgpOwogICAgaWYgKGN1cnJlbnRDb250YWluZXIgaXMgTWFwKSBrZXkgPSBzdGFjay5yZW1vdmVMYXN0KCk7CiAgfQoKICB2b2lkIGhhbmRsZVN0cmluZyhTdHJpbmcgdmFsdWUpIHsKICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICB9CgogIHZvaWQgaGFuZGxlTnVtYmVyKG51bSB2YWx1ZSkgewogICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogIH0KCiAgdm9pZCBoYW5kbGVCb29sKGJvb2wgdmFsdWUpIHsKICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICB9CgogIHZvaWQgaGFuZGxlTnVsbCgpIHsKICAgIHRoaXMudmFsdWUgPSBudWxsOwogIH0KCiAgdm9pZCBiZWdpbk9iamVjdCgpIHsKICAgIHB1c2hDb250YWluZXIoKTsKICAgIGN1cnJlbnRDb250YWluZXIgPSA8U3RyaW5nLCBkeW5hbWljPnt9OwogIH0KCiAgdm9pZCBwcm9wZXJ0eU5hbWUoKSB7CiAgICBrZXkgPSB2YWx1ZTsKICAgIHZhbHVlID0gbnVsbDsKICB9CgogIHZvaWQgcHJvcGVydHlWYWx1ZSgpIHsKICAgIE1hcCBtYXAgPSBjdXJyZW50Q29udGFpbmVyOwogICAgbWFwW2tleV0gPSB2YWx1ZTsKICAgIGtleSA9IHZhbHVlID0gbnVsbDsKICB9CgogIHZvaWQgZW5kT2JqZWN0KCkgewogICAgcG9wQ29udGFpbmVyKCk7CiAgfQoKICB2b2lkIGJlZ2luQXJyYXkoKSB7CiAgICBwdXNoQ29udGFpbmVyKCk7CiAgICBjdXJyZW50Q29udGFpbmVyID0gW107CiAgfQoKICB2b2lkIGFycmF5RWxlbWVudCgpIHsKICAgIGN1cnJlbnRDb250YWluZXIuYWRkKHZhbHVlKTsKICAgIHZhbHVlID0gbnVsbDsKICB9CgogIHZvaWQgZW5kQXJyYXkoKSB7CiAgICBwb3BDb250YWluZXIoKTsKICB9CgogIC8qKiBSZWFkIG91dCB0aGUgZmluYWwgcmVzdWx0IG9mIHBhcnNpbmcgYSBKU09OIHN0cmluZy4gKi8KICBnZXQgcmVzdWx0IHsKICAgIGFzc2VydChjdXJyZW50Q29udGFpbmVyID09IG51bGwpOwogICAgcmV0dXJuIHZhbHVlOwogIH0KfQoKY2xhc3MgX1Jldml2ZXJKc29uTGlzdGVuZXIgZXh0ZW5kcyBfQnVpbGRKc29uTGlzdGVuZXIgewogIGZpbmFsIEZ1bmN0aW9uKE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgcmV2aXZlcjsKICBfUmV2aXZlckpzb25MaXN0ZW5lcih0aGlzLnJldml2ZXIpOwoKICB2b2lkIGFycmF5RWxlbWVudCgpIHsKICAgIExpc3QgbGlzdCA9IGN1cnJlbnRDb250YWluZXI7CiAgICB2YWx1ZSA9IHJldml2ZXIobGlzdC5sZW5ndGgsIHZhbHVlKTsKICAgIHN1cGVyLmFycmF5RWxlbWVudCgpOwogIH0KCiAgdm9pZCBwcm9wZXJ0eVZhbHVlKCkgewogICAgdmFsdWUgPSByZXZpdmVyKGtleSwgdmFsdWUpOwogICAgc3VwZXIucHJvcGVydHlWYWx1ZSgpOwogIH0KCiAgZ2V0IHJlc3VsdCB7CiAgICByZXR1cm4gcmV2aXZlcihudWxsLCB2YWx1ZSk7CiAgfQp9CgovKioKICogQnVmZmVyIGhvbGRpbmcgcGFydHMgb2YgYSBudW1lcmFsLgogKgogKiBUaGUgYnVmZmVyIGNvbnRhaW5zIHRoZSBjaGFyYWN0ZXJzIG9mIGEgSlNPTiBudW1iZXIuCiAqIFRoZXNlIGFyZSBhbGwgQVNDSUksIHNvIGFuIFtVaW50OExpc3RdIGlzIHVzZWQgYXMgYmFja2luZyBzdG9yZS4KICoKICogVGhpcyBidWZmZXIgaXMgdXNlZCB3aGVuIGEgSlNPTiBudW1iZXIgaXMgc3BsaXQgYmV0d2VlbiBzZXBhcmF0ZSBjaHVua3MuCiAqCiAqLwpjbGFzcyBfTnVtYmVyQnVmZmVyIHsKICBzdGF0aWMgY29uc3QgaW50IG1pbkNhcGFjaXR5ID0gMTY7CiAgc3RhdGljIGNvbnN0IGludCBrRGVmYXVsdE92ZXJoZWFkID0gNTsKICBVaW50OExpc3QgbGlzdDsKICBpbnQgbGVuZ3RoID0gMDsKICBfTnVtYmVyQnVmZmVyKGludCBpbml0aWFsQ2FwYWNpdHkpCiAgICAgIDogbGlzdCA9IG5ldyBVaW50OExpc3QoX2luaXRpYWxDYXBhY2l0eShpbml0aWFsQ2FwYWNpdHkpKTsKCiAgaW50IGdldCBjYXBhY2l0eSA9PiBsaXN0Lmxlbmd0aDsKCiAgLy8gUGljayBhbiBpbml0aWFsIGNhcGFjaXR5IGdyZWF0ZXIgdGhhbiB0aGUgZmlyc3QgcGFydCdzIHNpemUuCiAgLy8gVGhlIHR5cGljYWwgdXNlIGNhc2UgaGFzIHR3byBwYXJ0cywgdGhpcyBpcyB0aGUgYXR0ZW1wdCBhdAogIC8vIGd1ZXNzaW5nIHRoZSBzaXplIG9mIHRoZSBzZWNvbmQgcGFydCB3aXRob3V0IG92ZXJkb2luZyBpdC4KICAvLyBUaGUgZGVmYXVsdCBlc3RpbWF0ZSBvZiB0aGUgc2Vjb25kIHBhcnQgaXMgW2tEZWZhdWx0T3ZlcmhlYWRdLAogIC8vIHRoZW4gcm91bmQgdG8gbXVsdGlwbHVtIG9mIGZvdXIsIGFuZCByZXR1cm4gdGhlIHJlc3VsdCwKICAvLyBvciBbbWluQ2FwYWNpdHldIGlmIHRoYXQgaXMgZ3JlYXRlci4KICBzdGF0aWMgaW50IF9pbml0aWFsQ2FwYWNpdHkoaW50IG1pbkNhcGFjaXR5KSB7CiAgICBtaW5DYXBhY2l0eSArPSBrRGVmYXVsdE92ZXJoZWFkOwogICAgaWYgKG1pbkNhcGFjaXR5IDwgbWluQ2FwYWNpdHkpIHJldHVybiBtaW5DYXBhY2l0eTsKICAgIG1pbkNhcGFjaXR5ID0gKG1pbkNhcGFjaXR5ICsgMykgJiB+MzsgLy8gUm91bmQgdG8gbXVsdGlwbGUgb2YgZm91ci4KICAgIHJldHVybiBtaW5DYXBhY2l0eTsKICB9CgogIC8vIEdyb3dzIHRvIHRoZSBleGFjdCBzaXplIGFza2VkIGZvci4KICB2b2lkIGVuc3VyZUNhcGFjaXR5KGludCBuZXdDYXBhY2l0eSkgewogICAgVWludDhMaXN0IGxpc3QgPSB0aGlzLmxpc3Q7CiAgICBpZiAobmV3Q2FwYWNpdHkgPD0gbGlzdC5sZW5ndGgpIHJldHVybjsKICAgIFVpbnQ4TGlzdCBuZXdMaXN0ID0gbmV3IFVpbnQ4TGlzdChuZXdDYXBhY2l0eSk7CiAgICBuZXdMaXN0LnNldFJhbmdlKDAsIGxpc3QubGVuZ3RoLCBsaXN0LCAwKTsKICAgIHRoaXMubGlzdCA9IG5ld0xpc3Q7CiAgfQoKICBTdHJpbmcgZ2V0U3RyaW5nKCkgewogICAgU3RyaW5nIHJlc3VsdCA9IG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhsaXN0LCAwLCBsZW5ndGgpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIFRPRE8obHJuKTogU2VlIGlmIHBhcnNpbmcgb2YgbnVtYmVycyBjYW4gYmUgYWJzdHJhY3RlZCB0byBzb21ldGhpbmcKICAvLyBub3Qgb25seSB3b3JraW5nIG9uIHN0cmluZ3MsIGJ1dCBhbHNvIG9uIGNoYXItY29kZSBsaXN0cywgd2l0aG91dCBsb3NzaW5nCiAgLy8gcGVyZm9ybWFuY2UuCiAgbnVtIHBhcnNlTnVtKCkgPT4gbnVtLnBhcnNlKGdldFN0cmluZygpKTsKICBkb3VibGUgcGFyc2VEb3VibGUoKSA9PiBkb3VibGUucGFyc2UoZ2V0U3RyaW5nKCkpOwp9CgovKioKICogQ2h1bmtlZCBKU09OIHBhcnNlci4KICoKICogUmVjZWl2ZXMgaW5wdXRzIGluIGNodW5rcywgZ2l2ZXMgYWNjZXNzIHRvIGluZGl2aWR1YWwgcGFydHMgb2YgdGhlIGlucHV0LAogKiBhbmQgc3RvcmVzIGlucHV0IHN0YXRlIGJldHdlZW4gY2h1bmtzLgogKgogKiBJbXBsZW1lbnRhdGlvbnMgaW5jbHVkZSBbU3RyaW5nXSBhbmQgVVRGLTggcGFyc2Vycy4KICovCmFic3RyYWN0IGNsYXNzIF9DaHVua2VkSnNvblBhcnNlcjxUPiB7CiAgLy8gQSBzaW1wbGUgbm9uLXJlY3Vyc2l2ZSBzdGF0ZS1iYXNlZCBwYXJzZXIgZm9yIEpTT04uCiAgLy8KICAvLyBMaXRlcmFsIHZhbHVlcyBhY2NlcHRlZCBpbiBzdGF0ZXMgQVJSQVlfRU1QVFksIEFSUkFZX0NPTU1BLCBPQkpFQ1RfQ09MT04KICAvLyBhbmQgc3RyaW5ncyBhbHNvIGluIE9CSkVDVF9FTVBUWSwgT0JKRUNUX0NPTU1BLgogIC8vICAgICAgICAgICAgICAgVkFMVUUgIFNUUklORyAgOiAgLCAgfSAgXSAgICAgICAgVHJhbnNpdGlvbnMgdG8KICAvLyBFTVBUWSAgICAgICAgICAgIFggICAgICBYICAgICAgICAgICAgICAgICAgIC0+IEVORAogIC8vIEFSUkFZX0VNUFRZICAgICAgWCAgICAgIFggICAgICAgICAgICAgQCAgICAgLT4gQVJSQVlfVkFMVUUgLyBwb3AKICAvLyBBUlJBWV9WQUxVRSAgICAgICAgICAgICAgICAgICAgIEAgICAgIEAgICAgIC0+IEFSUkFZX0NPTU1BIC8gcG9wCiAgLy8gQVJSQVlfQ09NTUEgICAgICBYICAgICAgWCAgICAgICAgICAgICAgICAgICAtPiBBUlJBWV9WQUxVRQogIC8vIE9CSkVDVF9FTVBUWSAgICAgICAgICAgIFggICAgICAgICAgQCAgICAgICAgLT4gT0JKRUNUX0tFWSAvIHBvcAogIC8vIE9CSkVDVF9LRVkgICAgICAgICAgICAgICAgICAgQCAgICAgICAgICAgICAgLT4gT0JKRUNUX0NPTE9OCiAgLy8gT0JKRUNUX0NPTE9OICAgICBYICAgICAgWCAgICAgICAgICAgICAgICAgICAtPiBPQkpFQ1RfVkFMVUUKICAvLyBPQkpFQ1RfVkFMVUUgICAgICAgICAgICAgICAgICAgIEAgIEAgICAgICAgIC0+IE9CSkVDVF9DT01NQSAvIHBvcAogIC8vIE9CSkVDVF9DT01NQSAgICAgICAgICAgIFggICAgICAgICAgICAgICAgICAgLT4gT0JKRUNUX0tFWQogIC8vIEVORAogIC8vIFN0YXJ0aW5nIGEgbmV3IGFycmF5IG9yIG9iamVjdCB3aWxsIHB1c2ggdGhlIGN1cnJlbnQgc3RhdGUuIFRoZSAicG9wIgogIC8vIGFib3ZlIG1lYW5zIHJlc3RvcmluZyB0aGlzIHN0YXRlIGFuZCB0aGVuIG1hcmtpbmcgaXQgYXMgYW4gZW5kZWQgdmFsdWUuCiAgLy8gWCBtZWFucyBnZW5lcmljIGhhbmRsaW5nLCBAIG1lYW5zIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGp1c3QgdGhhdAogIC8vIHN0YXRlIC0gdGhhdCBpcywgdmFsdWVzIGFyZSBoYW5kbGVkIGdlbmVyaWNhbGx5LCBvbmx5IHB1bmN0dWF0aW9uCiAgLy8gY2FyZXMgYWJvdXQgdGhlIGN1cnJlbnQgc3RhdGUuCiAgLy8gVmFsdWVzIGZvciBzdGF0ZXMgYXJlIGNob3NlbiBzbyBiaXRzIDAgYW5kIDEgdGVsbCB3aGV0aGVyCiAgLy8gYSBzdHJpbmcvdmFsdWUgaXMgYWxsb3dlZCwgYW5kIHNldHRpbmcgYml0cyAwIHRocm91Z2ggMiBhZnRlciBhIHZhbHVlCiAgLy8gZ2V0cyB0byB0aGUgbmV4dCBzdGF0ZSAobm90IGVtcHR5LCBkb2Vzbid0IGFsbG93IGEgdmFsdWUpLgoKICAvLyBTdGF0ZSBidWlsZGluZy1ibG9jayBjb25zdGFudHMuCiAgc3RhdGljIGNvbnN0IGludCBUT1BfTEVWRUwgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgSU5TSURFX0FSUkFZID0gMTsKICBzdGF0aWMgY29uc3QgaW50IElOU0lERV9PQkpFQ1QgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgQUZURVJfQ09MT04gPSAzOyAvLyBBbHdheXMgaW5zaWRlIG9iamVjdC4KCiAgc3RhdGljIGNvbnN0IGludCBBTExPV19TVFJJTkdfTUFTSyA9IDg7IC8vIEFsbG93ZWQgaWYgemVyby4KICBzdGF0aWMgY29uc3QgaW50IEFMTE9XX1ZBTFVFX01BU0sgPSA0OyAvLyBBbGxvd2VkIGlmIHplcm8uCiAgc3RhdGljIGNvbnN0IGludCBBTExPV19WQUxVRSA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBTVFJJTkdfT05MWSA9IDQ7CiAgc3RhdGljIGNvbnN0IGludCBOT19WQUxVRVMgPSAxMjsKCiAgLy8gT2JqZWN0cyBhbmQgYXJyYXlzIGFyZSAiZW1wdHkiIHVudGlsIHRoZWlyIGZpcnN0IHByb3BlcnR5L2VsZW1lbnQuCiAgLy8gQXQgdGhpcyBwb3NpdGlvbiwgdGhleSBtYXkgZWl0aGVyIGhhdmUgYW4gZW50cnkgb3IgYSBjbG9zZS1icmFja2V0LgogIHN0YXRpYyBjb25zdCBpbnQgRU1QVFkgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgTk9OX0VNUFRZID0gMTY7CiAgc3RhdGljIGNvbnN0IGludCBFTVBUWV9NQVNLID0gMTY7IC8vIEVtcHR5IGlmIHplcm8uCgogIC8vIEFjdHVhbCBzdGF0ZXMgICAgICAgICAgICAgICA6IENvbnRleHQgfCBJcyBlbXB0eT8gfCBOZXh0PwogIHN0YXRpYyBjb25zdCBpbnQgU1RBVEVfSU5JVElBTCA9IFRPUF9MRVZFTCB8IEVNUFRZIHwgQUxMT1dfVkFMVUU7CiAgc3RhdGljIGNvbnN0IGludCBTVEFURV9FTkQgPSBUT1BfTEVWRUwgfCBOT05fRU1QVFkgfCBOT19WQUxVRVM7CgogIHN0YXRpYyBjb25zdCBpbnQgU1RBVEVfQVJSQVlfRU1QVFkgPSBJTlNJREVfQVJSQVkgfCBFTVBUWSB8IEFMTE9XX1ZBTFVFOwogIHN0YXRpYyBjb25zdCBpbnQgU1RBVEVfQVJSQVlfVkFMVUUgPSBJTlNJREVfQVJSQVkgfCBOT05fRU1QVFkgfCBOT19WQUxVRVM7CiAgc3RhdGljIGNvbnN0IGludCBTVEFURV9BUlJBWV9DT01NQSA9IElOU0lERV9BUlJBWSB8IE5PTl9FTVBUWSB8IEFMTE9XX1ZBTFVFOwoKICBzdGF0aWMgY29uc3QgaW50IFNUQVRFX09CSkVDVF9FTVBUWSA9IElOU0lERV9PQkpFQ1QgfCBFTVBUWSB8IFNUUklOR19PTkxZOwogIHN0YXRpYyBjb25zdCBpbnQgU1RBVEVfT0JKRUNUX0tFWSA9IElOU0lERV9PQkpFQ1QgfCBOT05fRU1QVFkgfCBOT19WQUxVRVM7CiAgc3RhdGljIGNvbnN0IGludCBTVEFURV9PQkpFQ1RfQ09MT04gPSBBRlRFUl9DT0xPTiB8IE5PTl9FTVBUWSB8IEFMTE9XX1ZBTFVFOwogIHN0YXRpYyBjb25zdCBpbnQgU1RBVEVfT0JKRUNUX1ZBTFVFID0gQUZURVJfQ09MT04gfCBOT05fRU1QVFkgfCBOT19WQUxVRVM7CiAgc3RhdGljIGNvbnN0IGludCBTVEFURV9PQkpFQ1RfQ09NTUEgPSBJTlNJREVfT0JKRUNUIHwgTk9OX0VNUFRZIHwgU1RSSU5HX09OTFk7CgogIC8vIEJpdHMgc2V0IGluIHN0YXRlIGFmdGVyIHN1Y2Nlc3NmdWxseSByZWFkaW5nIGEgdmFsdWUuCiAgLy8gVGhpcyB0cmFuc2l0aW9ucyB0aGUgc3RhdGUgdG8gZXhwZWN0IHRoZSBuZXh0IHB1bmN0dWF0aW9uLgogIHN0YXRpYyBjb25zdCBpbnQgVkFMVUVfUkVBRF9CSVRTID0gTk9OX0VNUFRZIHwgTk9fVkFMVUVTOwoKICAvLyBDaGFyYWN0ZXIgY29kZSBjb25zdGFudHMuCiAgc3RhdGljIGNvbnN0IGludCBCQUNLU1BBQ0UgPSAweDA4OwogIHN0YXRpYyBjb25zdCBpbnQgVEFCID0gMHgwOTsKICBzdGF0aWMgY29uc3QgaW50IE5FV0xJTkUgPSAweDBhOwogIHN0YXRpYyBjb25zdCBpbnQgQ0FSUklBR0VfUkVUVVJOID0gMHgwZDsKICBzdGF0aWMgY29uc3QgaW50IEZPUk1fRkVFRCA9IDB4MGM7CiAgc3RhdGljIGNvbnN0IGludCBTUEFDRSA9IDB4MjA7CiAgc3RhdGljIGNvbnN0IGludCBRVU9URSA9IDB4MjI7CiAgc3RhdGljIGNvbnN0IGludCBQTFVTID0gMHgyYjsKICBzdGF0aWMgY29uc3QgaW50IENPTU1BID0gMHgyYzsKICBzdGF0aWMgY29uc3QgaW50IE1JTlVTID0gMHgyZDsKICBzdGF0aWMgY29uc3QgaW50IERFQ0lNQUxQT0lOVCA9IDB4MmU7CiAgc3RhdGljIGNvbnN0IGludCBTTEFTSCA9IDB4MmY7CiAgc3RhdGljIGNvbnN0IGludCBDSEFSXzAgPSAweDMwOwogIHN0YXRpYyBjb25zdCBpbnQgQ0hBUl85ID0gMHgzOTsKICBzdGF0aWMgY29uc3QgaW50IENPTE9OID0gMHgzYTsKICBzdGF0aWMgY29uc3QgaW50IENIQVJfRSA9IDB4NDU7CiAgc3RhdGljIGNvbnN0IGludCBMQlJBQ0tFVCA9IDB4NWI7CiAgc3RhdGljIGNvbnN0IGludCBCQUNLU0xBU0ggPSAweDVjOwogIHN0YXRpYyBjb25zdCBpbnQgUkJSQUNLRVQgPSAweDVkOwogIHN0YXRpYyBjb25zdCBpbnQgQ0hBUl9hID0gMHg2MTsKICBzdGF0aWMgY29uc3QgaW50IENIQVJfYiA9IDB4NjI7CiAgc3RhdGljIGNvbnN0IGludCBDSEFSX2UgPSAweDY1OwogIHN0YXRpYyBjb25zdCBpbnQgQ0hBUl9mID0gMHg2NjsKICBzdGF0aWMgY29uc3QgaW50IENIQVJfbCA9IDB4NmM7CiAgc3RhdGljIGNvbnN0IGludCBDSEFSX24gPSAweDZlOwogIHN0YXRpYyBjb25zdCBpbnQgQ0hBUl9yID0gMHg3MjsKICBzdGF0aWMgY29uc3QgaW50IENIQVJfcyA9IDB4NzM7CiAgc3RhdGljIGNvbnN0IGludCBDSEFSX3QgPSAweDc0OwogIHN0YXRpYyBjb25zdCBpbnQgQ0hBUl91ID0gMHg3NTsKICBzdGF0aWMgY29uc3QgaW50IExCUkFDRSA9IDB4N2I7CiAgc3RhdGljIGNvbnN0IGludCBSQlJBQ0UgPSAweDdkOwoKICAvLyBTdGF0ZSBvZiBwYXJ0aWFsIHZhbHVlIGF0IGNodW5rIHNwbGl0LgogIHN0YXRpYyBjb25zdCBpbnQgTk9fUEFSVElBTCA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBQQVJUSUFMX1NUUklORyA9IDE7CiAgc3RhdGljIGNvbnN0IGludCBQQVJUSUFMX05VTUVSQUwgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgUEFSVElBTF9LRVlXT1JEID0gMzsKICBzdGF0aWMgY29uc3QgaW50IE1BU0tfUEFSVElBTCA9IDM7CgogIC8vIFBhcnRpYWwgc3RhdGVzIGZvciBudW1lcmFscy4gVmFsdWVzIGNhbiBiZSB8J2VkIHdpdGggUEFSVElBTF9OVU1FUkFMLgogIHN0YXRpYyBjb25zdCBpbnQgTlVNX1NJR04gPSAwOyAvLyBBZnRlciBpbml0aWFsICctJy4KICBzdGF0aWMgY29uc3QgaW50IE5VTV9aRVJPID0gNDsgLy8gQWZ0ZXIgJzAnIGFzIGZpcnN0IGRpZ2l0LgogIHN0YXRpYyBjb25zdCBpbnQgTlVNX0RJR0lUID0gODsgLy8gQWZ0ZXIgZGlnaXQsIG5vICcuJyBvciAnZScgc2Vlbi4KICBzdGF0aWMgY29uc3QgaW50IE5VTV9ET1QgPSAxMjsgLy8gQWZ0ZXIgJy4nLgogIHN0YXRpYyBjb25zdCBpbnQgTlVNX0RPVF9ESUdJVCA9IDE2OyAvLyBBZnRlciBhIGRlY2ltYWwgZGlnaXQgKGFmdGVyICcuJykuCiAgc3RhdGljIGNvbnN0IGludCBOVU1fRSA9IDIwOyAvLyBBZnRlciAnZScgb3IgJ0UnLgogIHN0YXRpYyBjb25zdCBpbnQgTlVNX0VfU0lHTiA9IDI0OyAvLyBBZnRlciAnLScgb3IgJysnIGFmdGVyICdlJyBvciAnRScuCiAgc3RhdGljIGNvbnN0IGludCBOVU1fRV9ESUdJVCA9IDI4OyAvLyBBZnRlciBleHBvbmVudCBkaWdpdC4KICBzdGF0aWMgY29uc3QgaW50IE5VTV9TVUNDRVNTID0gMzI7IC8vIE5ldmVyIHN0b3JlZCBhcyBwYXJ0aWFsIHN0YXRlLgoKICAvLyBQYXJ0aWFsIHN0YXRlcyBmb3Igc3RyaW5ncy4KICBzdGF0aWMgY29uc3QgaW50IFNUUl9QTEFJTiA9IDA7IC8vIEluc2lkZSBzdHJpbmcsIGJ1dCBub3QgZXNjYXBlLgogIHN0YXRpYyBjb25zdCBpbnQgU1RSX0VTQ0FQRSA9IDQ7IC8vIEFmdGVyICdcJy4KICBzdGF0aWMgY29uc3QgaW50IFNUUl9VID0gMTY7IC8vIEFmdGVyICdcdScgYW5kIDAtMyBoZXggZGlnaXRzLgogIHN0YXRpYyBjb25zdCBpbnQgU1RSX1VfQ09VTlRfU0hJRlQgPSAyOyAvLyBIZXggZGlnaXQgY291bnQgaW4gYml0cyAyLTMuCiAgc3RhdGljIGNvbnN0IGludCBTVFJfVV9WQUxVRV9TSElGVCA9IDU7IC8vIEhleCBkaWdpdCB2YWx1ZSBpbiBiaXRzIDUrLgoKICAvLyBQYXJ0aWFsIHN0YXRlcyBmb3Iga2V5d29yZHMuCiAgc3RhdGljIGNvbnN0IGludCBLV0RfVFlQRV9NQVNLID0gMTI7CiAgc3RhdGljIGNvbnN0IGludCBLV0RfVFlQRV9TSElGVCA9IDI7CiAgc3RhdGljIGNvbnN0IGludCBLV0RfTlVMTCA9IDA7IC8vIFByZWZpeCBvZiAibnVsbCIgc2Vlbi4KICBzdGF0aWMgY29uc3QgaW50IEtXRF9UUlVFID0gNDsgLy8gUHJlZml4IG9mICJ0cnVlIiBzZWVuLgogIHN0YXRpYyBjb25zdCBpbnQgS1dEX0ZBTFNFID0gODsgLy8gUHJlZml4IG9mICJmYWxzZSIgc2Vlbi4KICBzdGF0aWMgY29uc3QgaW50IEtXRF9CT00gPSAxMjsgLy8gUHJlZml4IG9mIEJPTSBzZWVuLgogIHN0YXRpYyBjb25zdCBpbnQgS1dEX0NPVU5UX1NISUZUID0gNDsgLy8gUHJlZml4IGxlbmd0aCBpbiBiaXRzIDQrLgoKICAvLyBNYXNrIHVzZWQgdG8gbWFzayBvZmYgdHdvIGxvd2VyIGJpdHMuCiAgc3RhdGljIGNvbnN0IGludCBUV09fQklUX01BU0sgPSAzOwoKICBmaW5hbCBfSnNvbkxpc3RlbmVyIGxpc3RlbmVyOwoKICAvLyBUaGUgY3VycmVudCBwYXJzaW5nIHN0YXRlLgogIGludCBzdGF0ZSA9IFNUQVRFX0lOSVRJQUw7CiAgTGlzdDxpbnQ+IHN0YXRlcyA9IDxpbnQ+W107CgogIC8qKgogICAqIFN0b3JlcyB0b2tlbml6ZXIgc3RhdGUgYmV0d2VlbiBjaHVua3MuCiAgICoKICAgKiBUaGlzIHN0YXRlIGlzIHN0b3JlZCB3aGVuIGEgY2h1bmsgc3RvcHMgaW4gdGhlIG1pZGRsZSBvZiBhCiAgICogdG9rZW4gKHN0cmluZywgbnVtZXJhbCwgYm9vbGVhbiBvciBudWxsKS4KICAgKgogICAqIFRoZSBwYXJ0aWFsIHN0YXRlIGlzIHVzZWQgdG8gY29udGludWUgcGFyc2luZyBvbiB0aGUgbmV4dCBjaHVuay4KICAgKiBUaGUgcHJldmlvdXMgY2h1bmsgaXMgbm90IHJldGFpbmVkLCBhbnkgZGF0YSBuZWVkZWQgYXJlIHN0b3JlZCBpbgogICAqIHRoaXMgaW50ZWdlciwgb3IgaW4gdGhlIFtidWZmZXJdIGZpZWxkIGFzIGEgc3RyaW5nLWJ1aWxkaW5nIGJ1ZmZlcgogICAqIG9yIGEgW19OdW1iZXJCdWZmZXJdLgogICAqCiAgICogUHJlZml4IHN0YXRlIHN0b3JlZCBpbiBbcHJlZml4U3RhdGVdIGFzIGJpdHMuCiAgICoKICAgKiAgICAgICAgICAgIC4uMDAgOiBObyBwYXJ0aWFsIHZhbHVlIChOT19QQVJUSUFMKS4KICAgKgogICAqICAgICAgICAgLi4wMDAwMSA6IFBhcnRpYWwgc3RyaW5nLCBub3QgaW5zaWRlIGVzY2FwZS4KICAgKiAgICAgICAgIC4uMDAxMDEgOiBQYXJ0aWFsIHN0cmluZywgYWZ0ZXIgJ1wnLgogICAqICAgICAuLnZ2dnYxZGQwMSA6IFBhcnRpYWwgXHUgZXNjYXBlLgogICAqICAgICAgICAgICAgICAgICAgIFRoZSAnZGQnIGJpdHMgKDItMykgZW5jb2RlIHRoZSBudW1iZXIgb2YgaGV4IGRpZ2l0cyBzZWVuLgogICAqICAgICAgICAgICAgICAgICAgIEJpdHMgNS0xNiBlbmNvZGUgdGhlIHZhbHVlIG9mIHRoZSBoZXggZGlnaXRzIHNlZW4gc28gZmFyLgogICAqCiAgICogICAgICAgIC4uMGRkZDEwIDogUGFydGlhbCBudW1lcmFsLgogICAqICAgICAgICAgICAgICAgICAgIFRoZSBgZGRkYCBiaXRzIHN0b3JlIHRoZSBwYXJ0cyBvZiBpbiB0aGUgbnVtZXJhbCBzZWVuIHNvCiAgICogICAgICAgICAgICAgICAgICAgZmFyLCBhcyB0aGUgY29uc3RhbnRzIGBOVU1fKmAgZGVmaW5lZCBhYm92ZS4KICAgKiAgICAgICAgICAgICAgICAgICBUaGUgY2hhcmFjdGVycyBvZiB0aGUgbnVtZXJhbCBhcmUgc3RvcmVkIGluIFtidWZmZXJdCiAgICogICAgICAgICAgICAgICAgICAgYXMgYSBbX051bWJlckJ1ZmZlcl0uCiAgICoKICAgKiAgICAgIC4uMGRkZDAwMTEgOiBQYXJ0aWFsICdudWxsJyBrZXl3b3JkLgogICAqICAgICAgLi4wZGRkMDExMSA6IFBhcnRpYWwgJ3RydWUnIGtleXdvcmQuCiAgICogICAgICAuLjBkZGQxMDExIDogUGFydGlhbCAnZmFsc2UnIGtleXdvcmQuCiAgICogICAgICAuLjBkZGQxMTExIDogUGFydGlhbCBVVEYtOCBCT00gYnl0ZSBzZXFldWVuY2UgKCJceEVGXHhCQlx4QkYiKS4KICAgKiAgICAgICAgICAgICAgICAgICBGb3IgYWxsIGtleXdvcmRzLCB0aGUgYGRkZGAgYml0cyBlbmNvZGUgdGhlIG51bWJlcgogICAqICAgICAgICAgICAgICAgICAgIG9mIGxldHRlcnMgc2Vlbi4KICAgKiAgICAgICAgICAgICAgICAgICBUaGUgQk9NIGJ5dGUgc2VxdWVuY2UgaXMgb25seSB1c2VkIGJ5IFtfSnNvblV0ZjhQYXJzZXJdLAogICAqICAgICAgICAgICAgICAgICAgIGFuZCBvbmx5IGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiBpbnB1dC4KICAgKi8KICBpbnQgcGFydGlhbFN0YXRlID0gTk9fUEFSVElBTDsKCiAgLyoqCiAgICogRXh0cmEgZGF0YSBzdG9yZWQgd2hpbGUgcGFyc2luZyBhIHByaW1pdGl2ZSB2YWx1ZS4KICAgKiBNYXkgYmUgc2V0IGR1cmluZyBwYXJzaW5nLCBhbHdheXMgc2V0IGF0IGNodW5rIGVuZCBpZiBhIHZhbHVlIGlzIHBhcnRpYWwuCiAgICoKICAgKiBNYXkgY29udGFpbiBhIHN0cmluZyBidWZmZXIgd2hpbGUgcGFyc2luZyBzdHJpbmdzLgogICAqLwogIHZhciBidWZmZXIgPSBudWxsOwoKICBfQ2h1bmtlZEpzb25QYXJzZXIodGhpcy5saXN0ZW5lcik7CgogIC8qKgogICAqIFB1c2ggdGhlIGN1cnJlbnQgcGFyc2UgW3N0YXRlXSBvbiBhIHN0YWNrLgogICAqCiAgICogU3RhdGUgaXMgcHVzaGVkIHdoZW4gYSBuZXcgYXJyYXkgb3Igb2JqZWN0IGxpdGVyYWwgc3RhcnRzLAogICAqIHNvIHRoZSBwYXJzZXIgY2FuIGdvIGJhY2sgdG8gdGhlIGNvcnJlY3QgdmFsdWUgd2hlbiB0aGUgbGl0ZXJhbCBlbmRzLgogICAqLwogIHZvaWQgc2F2ZVN0YXRlKGludCBzdGF0ZSkgewogICAgc3RhdGVzLmFkZChzdGF0ZSk7CiAgfQoKICAvKioKICAgKiBSZXN0b3JlIGEgc3RhdGUgcHVzaGVkIHdpdGggW3NhdmVTdGF0ZV0uCiAgICovCiAgaW50IHJlc3RvcmVTdGF0ZSgpIHsKICAgIHJldHVybiBzdGF0ZXMucmVtb3ZlTGFzdCgpOyAvLyBUaHJvd3MgaWYgZW1wdHkuCiAgfQoKICAvKioKICAgKiBGaW5hbGl6ZXMgdGhlIHBhcnNpbmcuCiAgICoKICAgKiBUaHJvd3MgaWYgdGhlIHNvdXJjZSByZWFkIHNvIGZhciBkb2Vzbid0IGVuZCB1cCB3aXRoIGEgY29tcGxldGUKICAgKiBwYXJzZWQgdmFsdWUuIFRoYXQgbWVhbnMgaXQgbXVzdCBub3QgYmUgaW5zaWRlIGEgbGlzdCBvciBvYmplY3QKICAgKiBsaXRlcmFsLCBhbmQgYW55IHBhcnRpYWwgdmFsdWUgcmVhZCBzaG91bGQgYWxzbyBiZSBhIHZhbGlkIGNvbXBsZXRlCiAgICogdmFsdWUuCiAgICoKICAgKiBUaGUgb25seSB2YWxpZCBwYXJ0aWFsIHN0YXRlIGlzIGEgbnVtYmVyIHRoYXQgZW5kcyBpbiBhIGRpZ2l0LCBhbmQKICAgKiBvbmx5IGlmIHRoZSBudW1iZXIgaXMgdGhlIGVudGlyZSBKU09OIHZhbHVlIGJlaW5nIHBhcnNlZAogICAqIChvdGhlcndpc2UgaXQgd291bGQgYmUgaW5zaWRlIGEgbGlzdCBvciBvYmplY3QpLgogICAqIFN1Y2ggYSBudW1iZXIgd2lsbCBiZSBjb21wbGV0ZWQuIEFueSBvdGhlciBwYXJ0aWFsIHN0YXRlIGlzIGFuIGVycm9yLgogICAqLwogIHZvaWQgY2xvc2UoKSB7CiAgICBpZiAocGFydGlhbFN0YXRlICE9IE5PX1BBUlRJQUwpIHsKICAgICAgaW50IHBhcnRpYWxUeXBlID0gcGFydGlhbFN0YXRlICYgTUFTS19QQVJUSUFMOwogICAgICBpZiAocGFydGlhbFR5cGUgPT0gUEFSVElBTF9OVU1FUkFMKSB7CiAgICAgICAgaW50IG51bVN0YXRlID0gcGFydGlhbFN0YXRlICYgfk1BU0tfUEFSVElBTDsKICAgICAgICAvLyBBIHBhcnRpYWwgbnVtYmVyIG1pZ2h0IGJlIGEgdmFsaWQgbnVtYmVyIGlmIHdlIGtub3cgaXQncyBkb25lLgogICAgICAgIC8vIFRoZXJlIGlzIGFuIHVubmVjZXNzYXJ5IG92ZXJoZWFkIGlmIGlucHV0IGlzIGEgc2luZ2xlIG51bWJlciwKICAgICAgICAvLyBidXQgdGhpcyBpcyBhc3N1bWVkIHRvIGJlIHJhcmUuCiAgICAgICAgX051bWJlckJ1ZmZlciBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKICAgICAgICB0aGlzLmJ1ZmZlciA9IG51bGw7CiAgICAgICAgZmluaXNoQ2h1bmtOdW1iZXIobnVtU3RhdGUsIDAsIDAsIGJ1ZmZlcik7CiAgICAgIH0gZWxzZSBpZiAocGFydGlhbFR5cGUgPT0gUEFSVElBTF9TVFJJTkcpIHsKICAgICAgICBmYWlsKGNodW5rRW5kLCAiVW50ZXJtaW5hdGVkIHN0cmluZyIpOwogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydChwYXJ0aWFsVHlwZSA9PSBQQVJUSUFMX0tFWVdPUkQpOwogICAgICAgIGZhaWwoY2h1bmtFbmQpOyAvLyBJbmNvbXBsZXRlIGxpdGVyYWwuCiAgICAgIH0KICAgIH0KICAgIGlmIChzdGF0ZSAhPSBTVEFURV9FTkQpIHsKICAgICAgZmFpbChjaHVua0VuZCk7CiAgICB9CiAgfQoKICAvKioKICAgKiBSZWFkIG91dCB0aGUgcmVzdWx0IGFmdGVyIHN1Y2Nlc3NmdWxseSBjbG9zaW5nIHRoZSBwYXJzZXIuCiAgICoKICAgKiBUaGUgcGFyc2VyIGlzIGNsb3NlZCBieSBjYWxsaW5nIFtjbG9zZV0gb3IgY2FsbGluZyBbYWRkU291cmNlQ2h1bmtdIHdpdGgKICAgKiBgdHJ1ZWAgYXMgc2Vjb25kIChgaXNMYXN0YCkgYXJndW1lbnQuCiAgICovCiAgT2JqZWN0IGdldCByZXN1bHQgewogICAgcmV0dXJuIGxpc3RlbmVyLnJlc3VsdDsKICB9CgogIC8qKiBTZXRzIHRoZSBjdXJyZW50IHNvdXJjZSBjaHVuay4gKi8KICB2b2lkIHNldCBjaHVuayhUIHNvdXJjZSk7CgogIC8qKgogICAqIExlbmd0aCBvZiBjdXJyZW50IGNodW5rLgogICAqCiAgICogVGhlIHZhbGlkIGFyZ3VtZW50cyB0byBbZ2V0Q2hhcl0gYXJlIDAgLi4gYGNodW5rRW5kIC0gMWAuCiAgICovCiAgaW50IGdldCBjaHVua0VuZDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgY2h1bmsgaXRzZWxmLgogICAqCiAgICogT25seSB1c2VkIGJ5IFtmYWlsXSB0byBpbmNsdWRlIHRoZSBjaHVuayBpbiB0aGUgdGhyb3duIFtGb3JtYXRFeGNlcHRpb25dLgogICAqLwogIFQgZ2V0IGNodW5rOwoKICAvKioKICAgKiBHZXQgY2hhcmNhY3Rlci9jb2RlIHVuaXQgb2YgY3VycmVudCBjaHVuay4KICAgKgogICAqIFRoZSBbaW5kZXhdIG11c3QgYmUgbm9uLW5lZ2F0aXZlIGFuZCBsZXNzIHRoYW4gYGNodW5rRW5kYC4KICAgKiBJbiBwcmFjdGl2ZSwgW2luZGV4XSB3aWxsIGJlIG5vIHNtYWxsZXIgdGhhbiB0aGUgYHN0YXJ0YCBhcmd1bWVudCBwYXNzZWQKICAgKiB0byBbcGFyc2VdLgogICAqLwogIGludCBnZXRDaGFyKGludCBpbmRleCk7CgogIC8qKgogICAqIENvcHkgQVNDSUkgY2hhcmFjdGVycyBmcm9tIHN0YXJ0IHRvIGVuZCBvZiBjaHVuayBpbnRvIGEgbGlzdC4KICAgKgogICAqIFVzZWQgZm9yIG51bWJlciBidWZmZXIgKGFsd2F5cyBjb3BpZXMgQVNDSUksIHNvIGVuY29kaW5nIGlzIG5vdCBpbXBvcnRhbnQpLgogICAqLwogIHZvaWQgY29weUNoYXJzVG9MaXN0KGludCBzdGFydCwgaW50IGVuZCwgTGlzdDxpbnQ+IHRhcmdldCwgaW50IG9mZnNldCk7CgogIC8qKgogICAqIEJ1aWxkIGEgc3RyaW5nIHVzaW5nIGlucHV0IGNvZGUgdW5pdHMuCiAgICoKICAgKiBDcmVhdGVzIGEgc3RyaW5nIGJ1ZmZlciBhbmQgZW5hYmxlcyBhZGRpbmcgY2hhcmFjdGVycyBhbmQgc2xpY2VzCiAgICogdG8gdGhhdCBidWZmZXIuCiAgICogVGhlIGJ1ZmZlciBpcyBzdG9yZWQgaW4gdGhlIFtidWZmZXJdIGZpZWxkLiBJZiB0aGUgc3RyaW5nIGlzIHVudGVybWluYXRlZCwKICAgKiB0aGUgc2FtZSBidWZmZXIgaXMgdXNlZCB0byBjb250aW51ZSBwYXJzaW5nIGluIHRoZSBuZXh0IGNodW5rLgogICAqLwogIHZvaWQgYmVnaW5TdHJpbmcoKTsKICAvKioKICAgKiBBZGQgc2luZ2xlIGNoYXJhY3RlciBjb2RlIHRvIHN0cmluZyBiZWluZyBidWlsdC4KICAgKgogICAqIFVzZWQgZm9yIHVucGFyc2VkIGVzY2FwZSBzZXF1ZW5jZXMuCiAgICovCiAgdm9pZCBhZGRDaGFyVG9TdHJpbmcoaW50IGNoYXJDb2RlKTsKCiAgLyoqCiAgICogQWRkcyBzbGljZSBvZiBjdXJyZW50IGNodW5rIHRvIHN0cmluZyBiZWluZyBidWlsdC4KICAgKgogICAqIFRoZSBbc3RhcnRdIHBvc2l0aW9ucyBpcyBpbmNsdXNpdmUsIFtlbmRdIGlzIGV4Y2x1c2l2ZS4KICAgKi8KICB2b2lkIGFkZFNsaWNlVG9TdHJpbmcoaW50IHN0YXJ0LCBpbnQgZW5kKTsKCiAgLyoqIEZpbmFsaXplcyB0aGUgc3RyaW5nIGJlaW5nIGJ1aWx0IGFuZCByZXR1cm5zIGl0IGFzIGEgU3RyaW5nLiAqLwogIFN0cmluZyBlbmRTdHJpbmcoKTsKCiAgLyoqCiAgICogRXh0cmFjdHMgYSBsaXRlcmFsIHN0cmluZyBmcm9tIGEgc2xpY2Ugb2YgdGhlIGN1cnJlbnQgY2h1bmsuCiAgICoKICAgKiBObyBpbnRlcnByZXRhdGlvbiBvZiB0aGUgY29udGVudCBpcyBwZXJmb3JtZWQsIGV4Y2VwdCBmb3IgY29udmVydGluZwogICAqIHRoZSBzb3VyY2UgZm9ybWF0IHRvIHN0cmluZy4KICAgKiBUaGlzIGNhbiBiZSBpbXBsZW1lbnRlZCBtb3JlIG9yIGxlc3MgZWZmaWNpZW50bHkgZGVwZW5kaW5nIG9uIHRoZQogICAqIHVuZGVybHlpbmcgc291cmNlLgogICAqCiAgICogVGhpcyBpcyB1c2VkIGZvciBzdHJpbmcgbGl0ZXJhbHMgdGhhdCBjb250YWluIG5vIGVzY2FwZXMuCiAgICoKICAgKiBUaGUgW2JpdHNdIGludGVnZXIgaXMgYW4gdXBwZXIgYm91bmQgb24gdGhlIGNvZGUgcG9pbnQgaW4gdGhlIHJhbmdlCiAgICogZnJvbSBgc3RhcnRgIHRvIGBlbmRgLgogICAqIFVzdWFsbHkgZm91bmQgYnkgZG9pbmcgYml0d2lzZSBvciBvZiBhbGwgdGhlIHZhbHVlcy4KICAgKiBUaGUgZnVuY3Rpb24gbWF5IGNob29zZSB0byBvcHRpbWl6ZSBkZXBlbmRpbmcgb24gdGhlIHZhbHVlLgogICAqLwogIFN0cmluZyBnZXRTdHJpbmcoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgYml0cyk7CgogIC8qKgogICAqIFBhcnNlIGEgc2xpY2Ugb2YgdGhlIGN1cnJlbnQgY2h1bmsgYXMgYSBudW1iZXIuCiAgICoKICAgKiBTaW5jZSBpbnRlZ2VycyBoYXZlIGEgbWF4aW1hbCB2YWx1ZSwgYW5kIHdlIGRvbid0IHRyYWNrIHRoZSB2YWx1ZQogICAqIGluIHRoZSBidWZmZXIsIGEgc2VxdWVuY2Ugb2YgZGlnaXRzIGNhbiBiZSBlaXRoZXIgYW4gaW50IG9yIGEgZG91YmxlLgogICAqIFRoZSBgbnVtLnBhcnNlYCBmdW5jdGlvbiBkb2VzIHRoZSByaWdodCB0aGluZy4KICAgKgogICAqIFRoZSBmb3JtYXQgaXMgZXhwZWN0ZWQgdG8gYmUgY29ycmVjdC4KICAgKi8KICBudW0gcGFyc2VOdW0oaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBjb25zdCBpbnQgYXNjaWlCaXRzID0gMHg3ZjsgLy8gTnVtYmVyIGxpdGVyYWxzIGFyZSBBU0NJSSBvbmx5LgogICAgcmV0dXJuIG51bS5wYXJzZShnZXRTdHJpbmcoc3RhcnQsIGVuZCwgYXNjaWlCaXRzKSk7CiAgfQoKICAvKioKICAgKiBQYXJzZSBhIHNsaWNlIG9mIHRoZSBjdXJyZW50IGNodW5rIGFzIGEgZG91YmxlLgogICAqCiAgICogVGhlIGZvcm1hdCBpcyBleHBlY3RlZCB0byBiZSBjb3JyZWN0LgogICAqIFRoaXMgaXMgdXNlZCBieSBbcGFyc2VOdW1iZXJdIHdoZW4gdGhlIGRvdWJsZSB2YWx1ZSBjYW5ub3QgYmUKICAgKiBidWlsdCBleGFjdGx5IGR1cmluZyBwYXJzaW5nLgogICAqLwogIGRvdWJsZSBwYXJzZURvdWJsZShpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIGNvbnN0IGludCBhc2NpaUJpdHMgPSAweDdmOyAvLyBEb3VibGUgbGl0ZXJhbHMgYXJlIEFTQ0lJIG9ubHkuCiAgICByZXR1cm4gZG91YmxlLnBhcnNlKGdldFN0cmluZyhzdGFydCwgZW5kLCBhc2NpaUJpdHMpKTsKICB9CgogIC8qKgogICAqIENvbnRpbnVlcyBwYXJzaW5nIGEgcGFydGlhbCB2YWx1ZS4KICAgKi8KICBpbnQgcGFyc2VQYXJ0aWFsKGludCBwb3NpdGlvbikgewogICAgaWYgKHBvc2l0aW9uID09IGNodW5rRW5kKSByZXR1cm4gcG9zaXRpb247CiAgICBpbnQgcGFydGlhbFN0YXRlID0gdGhpcy5wYXJ0aWFsU3RhdGU7CiAgICBhc3NlcnQocGFydGlhbFN0YXRlICE9IE5PX1BBUlRJQUwpOwogICAgaW50IHBhcnRpYWxUeXBlID0gcGFydGlhbFN0YXRlICYgTUFTS19QQVJUSUFMOwogICAgdGhpcy5wYXJ0aWFsU3RhdGUgPSBOT19QQVJUSUFMOwogICAgcGFydGlhbFN0YXRlID0gcGFydGlhbFN0YXRlICYgfk1BU0tfUEFSVElBTDsKICAgIGFzc2VydChwYXJ0aWFsVHlwZSAhPSAwKTsKICAgIGlmIChwYXJ0aWFsVHlwZSA9PSBQQVJUSUFMX1NUUklORykgewogICAgICBwb3NpdGlvbiA9IHBhcnNlUGFydGlhbFN0cmluZyhwb3NpdGlvbiwgcGFydGlhbFN0YXRlKTsKICAgIH0gZWxzZSBpZiAocGFydGlhbFR5cGUgPT0gUEFSVElBTF9OVU1FUkFMKSB7CiAgICAgIHBvc2l0aW9uID0gcGFyc2VQYXJ0aWFsTnVtYmVyKHBvc2l0aW9uLCBwYXJ0aWFsU3RhdGUpOwogICAgfSBlbHNlIGlmIChwYXJ0aWFsVHlwZSA9PSBQQVJUSUFMX0tFWVdPUkQpIHsKICAgICAgcG9zaXRpb24gPSBwYXJzZVBhcnRpYWxLZXl3b3JkKHBvc2l0aW9uLCBwYXJ0aWFsU3RhdGUpOwogICAgfQogICAgcmV0dXJuIHBvc2l0aW9uOwogIH0KCiAgLyoqCiAgICogUGFyc2VzIHRoZSByZW1haW5kZXIgb2YgYSBudW1iZXIgaW50byB0aGUgbnVtYmVyIGJ1ZmZlci4KICAgKgogICAqIFN5bnRheCBpcyBjaGVja2VkIHdoaWxlIHBhc2luZy4KICAgKiBTdGFydHMgYXQgcG9zaXRpb24sIHdoaWNoIGlzIGV4cGVjdGVkIHRvIGJlIHRoZSBzdGFydCBvZiB0aGUgY2h1bmssCiAgICogYW5kIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBub24tbnVtYmVyLWxpdGVyYWwgY2hhcmFjdGVyIGZvdW5kLAogICAqIG9yIGNodW5rRW5kIGlmIHRoZSBlbnRpcmUgY2h1bmsgaXMgYSB2YWxpZCBudW1iZXIgY29udGludWF0aW9uLgogICAqIFRocm93cyBpZiBhIHN5bnRheCBlcnJvciBpcyBkZXRlY3RlZC4KICAgKi8KICBpbnQgcGFyc2VQYXJ0aWFsTnVtYmVyKGludCBwb3NpdGlvbiwgaW50IHN0YXRlKSB7CiAgICBpbnQgc3RhcnQgPSBwb3NpdGlvbjsKICAgIC8vIFByaW1pdGl2ZSBpbXBsZW1lbnRhdGlvbiwgY2FuIGJlIG9wdGltaXplZC4KICAgIF9OdW1iZXJCdWZmZXIgYnVmZmVyID0gdGhpcy5idWZmZXI7CiAgICB0aGlzLmJ1ZmZlciA9IG51bGw7CiAgICBpbnQgZW5kID0gY2h1bmtFbmQ7CiAgICB0b0JhaWxvdXQ6CiAgICB7CiAgICAgIGlmIChwb3NpdGlvbiA9PSBlbmQpIGJyZWFrIHRvQmFpbG91dDsKICAgICAgaW50IGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgICAgaW50IGRpZ2l0ID0gY2hhciBeIENIQVJfMDsKICAgICAgaWYgKHN0YXRlID09IE5VTV9TSUdOKSB7CiAgICAgICAgaWYgKGRpZ2l0IDw9IDkpIHsKICAgICAgICAgIGlmIChkaWdpdCA9PSAwKSB7CiAgICAgICAgICAgIHN0YXRlID0gTlVNX1pFUk87CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGF0ZSA9IE5VTV9ESUdJVDsKICAgICAgICAgIH0KICAgICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgICBpZiAocG9zaXRpb24gPT0gZW5kKSBicmVhayB0b0JhaWxvdXQ7CiAgICAgICAgICBjaGFyID0gZ2V0Q2hhcihwb3NpdGlvbik7CiAgICAgICAgICBkaWdpdCA9IGNoYXIgXiBDSEFSXzA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmYWlsKHBvc2l0aW9uKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHN0YXRlID09IE5VTV9aRVJPKSB7CiAgICAgICAgLy8gSlNPTiBkb2VzIG5vdCBhbGxvdyBpbnNpZ25pZmljYW50IGxlYWRpbmcgemVyb3MgKGUuZy4sICIwOSIpLgogICAgICAgIGlmIChkaWdpdCA8PSA5KSByZXR1cm4gZmFpbChwb3NpdGlvbik7CiAgICAgICAgc3RhdGUgPSBOVU1fRElHSVQ7CiAgICAgIH0KICAgICAgd2hpbGUgKHN0YXRlID09IE5VTV9ESUdJVCkgewogICAgICAgIGlmIChkaWdpdCA+IDkpIHsKICAgICAgICAgIGlmIChjaGFyID09IERFQ0lNQUxQT0lOVCkgewogICAgICAgICAgICBzdGF0ZSA9IE5VTV9ET1Q7CiAgICAgICAgICB9IGVsc2UgaWYgKChjaGFyIHwgMHgyMCkgPT0gQ0hBUl9lKSB7CiAgICAgICAgICAgIHN0YXRlID0gTlVNX0U7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmaW5pc2hDaHVua051bWJlcihzdGF0ZSwgc3RhcnQsIHBvc2l0aW9uLCBidWZmZXIpOwogICAgICAgICAgICByZXR1cm4gcG9zaXRpb247CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgaWYgKHBvc2l0aW9uID09IGVuZCkgYnJlYWsgdG9CYWlsb3V0OwogICAgICAgIGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgICAgICBkaWdpdCA9IGNoYXIgXiBDSEFSXzA7CiAgICAgIH0KICAgICAgaWYgKHN0YXRlID09IE5VTV9ET1QpIHsKICAgICAgICBpZiAoZGlnaXQgPiA5KSByZXR1cm4gZmFpbChwb3NpdGlvbik7CiAgICAgICAgc3RhdGUgPSBOVU1fRE9UX0RJR0lUOwogICAgICB9CiAgICAgIHdoaWxlIChzdGF0ZSA9PSBOVU1fRE9UX0RJR0lUKSB7CiAgICAgICAgaWYgKGRpZ2l0ID4gOSkgewogICAgICAgICAgaWYgKChjaGFyIHwgMHgyMCkgPT0gQ0hBUl9lKSB7CiAgICAgICAgICAgIHN0YXRlID0gTlVNX0U7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmaW5pc2hDaHVua051bWJlcihzdGF0ZSwgc3RhcnQsIHBvc2l0aW9uLCBidWZmZXIpOwogICAgICAgICAgICByZXR1cm4gcG9zaXRpb247CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgaWYgKHBvc2l0aW9uID09IGVuZCkgYnJlYWsgdG9CYWlsb3V0OwogICAgICAgIGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgICAgICBkaWdpdCA9IGNoYXIgXiBDSEFSXzA7CiAgICAgIH0KICAgICAgaWYgKHN0YXRlID09IE5VTV9FKSB7CiAgICAgICAgaWYgKGNoYXIgPT0gUExVUyB8fCBjaGFyID09IE1JTlVTKSB7CiAgICAgICAgICBzdGF0ZSA9IE5VTV9FX1NJR047CiAgICAgICAgICBwb3NpdGlvbisrOwogICAgICAgICAgaWYgKHBvc2l0aW9uID09IGVuZCkgYnJlYWsgdG9CYWlsb3V0OwogICAgICAgICAgY2hhciA9IGdldENoYXIocG9zaXRpb24pOwogICAgICAgICAgZGlnaXQgPSBjaGFyIF4gQ0hBUl8wOwogICAgICAgIH0KICAgICAgfQogICAgICBhc3NlcnQoc3RhdGUgPj0gTlVNX0UpOwogICAgICB3aGlsZSAoZGlnaXQgPD0gOSkgewogICAgICAgIHN0YXRlID0gTlVNX0VfRElHSVQ7CiAgICAgICAgcG9zaXRpb24rKzsKICAgICAgICBpZiAocG9zaXRpb24gPT0gZW5kKSBicmVhayB0b0JhaWxvdXQ7CiAgICAgICAgY2hhciA9IGdldENoYXIocG9zaXRpb24pOwogICAgICAgIGRpZ2l0ID0gY2hhciBeIENIQVJfMDsKICAgICAgfQogICAgICBmaW5pc2hDaHVua051bWJlcihzdGF0ZSwgc3RhcnQsIHBvc2l0aW9uLCBidWZmZXIpOwogICAgICByZXR1cm4gcG9zaXRpb247CiAgICB9CiAgICAvLyBCYWlsb3V0IGNvZGUgaW4gY2FzZSB0aGUgY3VycmVudCBjaHVuayBlbmRzIHdoaWxlIHBhcnNpbmcgdGhlIG51bWVyYWwuCiAgICBhc3NlcnQocG9zaXRpb24gPT0gZW5kKTsKICAgIGNvbnRpbnVlQ2h1bmtOdW1iZXIoc3RhdGUsIHN0YXJ0LCBidWZmZXIpOwogICAgcmV0dXJuIGNodW5rRW5kOwogIH0KCiAgLyoqCiAgICogQ29udGludWVzIHBhcnNpbmcgYSBwYXJ0aWFsIHN0cmluZyBsaXRlcmFsLgogICAqCiAgICogSGFuZGxlcyBwYXJ0aWFsIGVzY2FwZXMgYW5kIHRoZW4gaGFuZHMgdGhlIHBhcnNpbmcgb2ZmIHRvCiAgICogW3BhcnNlU3RyaW5nVG9CdWZmZXJdLgogICAqLwogIGludCBwYXJzZVBhcnRpYWxTdHJpbmcoaW50IHBvc2l0aW9uLCBpbnQgcGFydGlhbFN0YXRlKSB7CiAgICBpZiAocGFydGlhbFN0YXRlID09IFNUUl9QTEFJTikgewogICAgICByZXR1cm4gcGFyc2VTdHJpbmdUb0J1ZmZlcihwb3NpdGlvbik7CiAgICB9CiAgICBpZiAocGFydGlhbFN0YXRlID09IFNUUl9FU0NBUEUpIHsKICAgICAgcG9zaXRpb24gPSBwYXJzZVN0cmluZ0VzY2FwZShwb3NpdGlvbik7CiAgICAgIC8vIHBhcnNlU3RyaW5nRXNjYXBlIHNldHMgcGFydGlhbFN0YXRlIGlmIGl0IHNlZXMgdGhlIGVuZC4KICAgICAgaWYgKHBvc2l0aW9uID09IGNodW5rRW5kKSByZXR1cm4gcG9zaXRpb247CiAgICAgIHJldHVybiBwYXJzZVN0cmluZ1RvQnVmZmVyKHBvc2l0aW9uKTsKICAgIH0KICAgIGFzc2VydCgocGFydGlhbFN0YXRlICYgU1RSX1UpICE9IDApOwogICAgaW50IHZhbHVlID0gcGFydGlhbFN0YXRlID4+IFNUUl9VX1ZBTFVFX1NISUZUOwogICAgaW50IGNvdW50ID0gKHBhcnRpYWxTdGF0ZSA+PiBTVFJfVV9DT1VOVF9TSElGVCkgJiBUV09fQklUX01BU0s7CiAgICBmb3IgKGludCBpID0gY291bnQ7IGkgPCA0OyBpKyssIHBvc2l0aW9uKyspIHsKICAgICAgaWYgKHBvc2l0aW9uID09IGNodW5rRW5kKSByZXR1cm4gY2h1bmtTdHJpbmdFc2NhcGVVKGksIHZhbHVlKTsKICAgICAgaW50IGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgICAgaW50IGRpZ2l0ID0gcGFyc2VIZXhEaWdpdChjaGFyKTsKICAgICAgaWYgKGRpZ2l0IDwgMCkgZmFpbChwb3NpdGlvbiwgIkludmFsaWQgaGV4IGRpZ2l0Iik7CiAgICAgIHZhbHVlID0gMTYgKiB2YWx1ZSArIGRpZ2l0OwogICAgfQogICAgYWRkQ2hhclRvU3RyaW5nKHZhbHVlKTsKICAgIHJldHVybiBwYXJzZVN0cmluZ1RvQnVmZmVyKHBvc2l0aW9uKTsKICB9CgogIC8qKgogICAqIENvbnRpbnVlcyBwYXJzaW5nIGEgcGFydGlhbCBrZXl3b3JkLgogICAqLwogIGludCBwYXJzZVBhcnRpYWxLZXl3b3JkKGludCBwb3NpdGlvbiwgaW50IHBhcnRpYWxTdGF0ZSkgewogICAgaW50IGtleXdvcmRUeXBlID0gcGFydGlhbFN0YXRlICYgS1dEX1RZUEVfTUFTSzsKICAgIGludCBjb3VudCA9IHBhcnRpYWxTdGF0ZSA+PiBLV0RfQ09VTlRfU0hJRlQ7CiAgICBpbnQga2V5d29yZFR5cGVJbmRleCA9IGtleXdvcmRUeXBlID4+IEtXRF9UWVBFX1NISUZUOwogICAgU3RyaW5nIGtleXdvcmQgPQogICAgICAgIGNvbnN0IFsibnVsbCIsICJ0cnVlIiwgImZhbHNlIiwgIlx4RUZceEJCXHhCRiJdW2tleXdvcmRUeXBlSW5kZXhdOwogICAgYXNzZXJ0KGNvdW50IDwga2V5d29yZC5sZW5ndGgpOwogICAgZG8gewogICAgICBpZiAocG9zaXRpb24gPT0gY2h1bmtFbmQpIHsKICAgICAgICB0aGlzLnBhcnRpYWxTdGF0ZSA9CiAgICAgICAgICAgIFBBUlRJQUxfS0VZV09SRCB8IGtleXdvcmRUeXBlIHwgKGNvdW50IDw8IEtXRF9DT1VOVF9TSElGVCk7CiAgICAgICAgcmV0dXJuIGNodW5rRW5kOwogICAgICB9CiAgICAgIGludCBleHBlY3RlZENoYXIgPSBrZXl3b3JkLmNvZGVVbml0QXQoY291bnQpOwogICAgICBpZiAoZ2V0Q2hhcihwb3NpdGlvbikgIT0gZXhwZWN0ZWRDaGFyKSB7CiAgICAgICAgaWYgKGNvdW50ID09IDApIHsKICAgICAgICAgIGFzc2VydChrZXl3b3JkVHlwZSA9PSBLV0RfQk9NKTsKICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhaWwocG9zaXRpb24pOwogICAgICB9CiAgICAgIHBvc2l0aW9uKys7CiAgICAgIGNvdW50Kys7CiAgICB9IHdoaWxlIChjb3VudCA8IGtleXdvcmQubGVuZ3RoKTsKICAgIGlmIChrZXl3b3JkVHlwZSA9PSBLV0RfTlVMTCkgewogICAgICBsaXN0ZW5lci5oYW5kbGVOdWxsKCk7CiAgICB9IGVsc2UgaWYgKGtleXdvcmRUeXBlICE9IEtXRF9CT00pIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlQm9vbChrZXl3b3JkVHlwZSA9PSBLV0RfVFJVRSk7CiAgICB9CiAgICByZXR1cm4gcG9zaXRpb247CiAgfQoKICAvKiogQ29udmVydCBoZXgtZGlnaXQgdG8gaXRzIHZhbHVlLiBSZXR1cm5zIC0xIGlmIGNoYXIgaXMgbm90IGEgaGV4IGRpZ2l0LiAqLwogIGludCBwYXJzZUhleERpZ2l0KGludCBjaGFyKSB7CiAgICBpbnQgZGlnaXQgPSBjaGFyIF4gMHgzMDsKICAgIGlmIChkaWdpdCA8PSA5KSByZXR1cm4gZGlnaXQ7CiAgICBpbnQgbGV0dGVyID0gKGNoYXIgfCAweDIwKSBeIDB4NjA7CiAgICAvLyB2YWx1ZXMgMSAuLiA2IGFyZSAnYScgdGhyb3VnaCAnZicKICAgIGlmIChsZXR0ZXIgPD0gNiAmJiBsZXR0ZXIgPiAwKSByZXR1cm4gbGV0dGVyICsgOTsKICAgIHJldHVybiAtMTsKICB9CgogIC8qKgogICAqIFBhcnNlcyB0aGUgY3VycmVudCBjaHVuayBhcyBhIGNodW5rIG9mIEpTT04uCiAgICoKICAgKiBTdGFydHMgcGFyc2luZyBhdCBbcG9zaXRpb25dIGFuZCBjb250aW51ZXMgdW50aWwgW2NodW5rRW5kXS4KICAgKiBDb250aW51ZXMgcGFyc2luZyB3aGVyZSB0aGUgcHJldmlvdXMgY2h1bmsgKGlmIGFueSkgZW5kZWQuCiAgICovCiAgdm9pZCBwYXJzZShpbnQgcG9zaXRpb24pIHsKICAgIGludCBsZW5ndGggPSBjaHVua0VuZDsKICAgIGlmIChwYXJ0aWFsU3RhdGUgIT0gTk9fUEFSVElBTCkgewogICAgICBwb3NpdGlvbiA9IHBhcnNlUGFydGlhbChwb3NpdGlvbik7CiAgICAgIGlmIChwb3NpdGlvbiA9PSBsZW5ndGgpIHJldHVybjsKICAgIH0KICAgIGludCBzdGF0ZSA9IHRoaXMuc3RhdGU7CiAgICB3aGlsZSAocG9zaXRpb24gPCBsZW5ndGgpIHsKICAgICAgaW50IGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgICAgc3dpdGNoIChjaGFyKSB7CiAgICAgICAgY2FzZSBTUEFDRToKICAgICAgICBjYXNlIENBUlJJQUdFX1JFVFVSTjoKICAgICAgICBjYXNlIE5FV0xJTkU6CiAgICAgICAgY2FzZSBUQUI6CiAgICAgICAgICBwb3NpdGlvbisrOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBRVU9URToKICAgICAgICAgIGlmICgoc3RhdGUgJiBBTExPV19TVFJJTkdfTUFTSykgIT0gMCkgcmV0dXJuIGZhaWwocG9zaXRpb24pOwogICAgICAgICAgc3RhdGUgfD0gVkFMVUVfUkVBRF9CSVRTOwogICAgICAgICAgcG9zaXRpb24gPSBwYXJzZVN0cmluZyhwb3NpdGlvbiArIDEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBMQlJBQ0tFVDoKICAgICAgICAgIGlmICgoc3RhdGUgJiBBTExPV19WQUxVRV9NQVNLKSAhPSAwKSByZXR1cm4gZmFpbChwb3NpdGlvbik7CiAgICAgICAgICBsaXN0ZW5lci5iZWdpbkFycmF5KCk7CiAgICAgICAgICBzYXZlU3RhdGUoc3RhdGUpOwogICAgICAgICAgc3RhdGUgPSBTVEFURV9BUlJBWV9FTVBUWTsKICAgICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIExCUkFDRToKICAgICAgICAgIGlmICgoc3RhdGUgJiBBTExPV19WQUxVRV9NQVNLKSAhPSAwKSByZXR1cm4gZmFpbChwb3NpdGlvbik7CiAgICAgICAgICBsaXN0ZW5lci5iZWdpbk9iamVjdCgpOwogICAgICAgICAgc2F2ZVN0YXRlKHN0YXRlKTsKICAgICAgICAgIHN0YXRlID0gU1RBVEVfT0JKRUNUX0VNUFRZOwogICAgICAgICAgcG9zaXRpb24rKzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQ0hBUl9uOgogICAgICAgICAgaWYgKChzdGF0ZSAmIEFMTE9XX1ZBTFVFX01BU0spICE9IDApIHJldHVybiBmYWlsKHBvc2l0aW9uKTsKICAgICAgICAgIHN0YXRlIHw9IFZBTFVFX1JFQURfQklUUzsKICAgICAgICAgIHBvc2l0aW9uID0gcGFyc2VOdWxsKHBvc2l0aW9uKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQ0hBUl9mOgogICAgICAgICAgaWYgKChzdGF0ZSAmIEFMTE9XX1ZBTFVFX01BU0spICE9IDApIHJldHVybiBmYWlsKHBvc2l0aW9uKTsKICAgICAgICAgIHN0YXRlIHw9IFZBTFVFX1JFQURfQklUUzsKICAgICAgICAgIHBvc2l0aW9uID0gcGFyc2VGYWxzZShwb3NpdGlvbik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIENIQVJfdDoKICAgICAgICAgIGlmICgoc3RhdGUgJiBBTExPV19WQUxVRV9NQVNLKSAhPSAwKSByZXR1cm4gZmFpbChwb3NpdGlvbik7CiAgICAgICAgICBzdGF0ZSB8PSBWQUxVRV9SRUFEX0JJVFM7CiAgICAgICAgICBwb3NpdGlvbiA9IHBhcnNlVHJ1ZShwb3NpdGlvbik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIENPTE9OOgogICAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX09CSkVDVF9LRVkpIHJldHVybiBmYWlsKHBvc2l0aW9uKTsKICAgICAgICAgIGxpc3RlbmVyLnByb3BlcnR5TmFtZSgpOwogICAgICAgICAgc3RhdGUgPSBTVEFURV9PQkpFQ1RfQ09MT047CiAgICAgICAgICBwb3NpdGlvbisrOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBDT01NQToKICAgICAgICAgIGlmIChzdGF0ZSA9PSBTVEFURV9PQkpFQ1RfVkFMVUUpIHsKICAgICAgICAgICAgbGlzdGVuZXIucHJvcGVydHlWYWx1ZSgpOwogICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX09CSkVDVF9DT01NQTsKICAgICAgICAgICAgcG9zaXRpb24rKzsKICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gU1RBVEVfQVJSQVlfVkFMVUUpIHsKICAgICAgICAgICAgbGlzdGVuZXIuYXJyYXlFbGVtZW50KCk7CiAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfQVJSQVlfQ09NTUE7CiAgICAgICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gZmFpbChwb3NpdGlvbik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFJCUkFDS0VUOgogICAgICAgICAgaWYgKHN0YXRlID09IFNUQVRFX0FSUkFZX0VNUFRZKSB7CiAgICAgICAgICAgIGxpc3RlbmVyLmVuZEFycmF5KCk7CiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IFNUQVRFX0FSUkFZX1ZBTFVFKSB7CiAgICAgICAgICAgIGxpc3RlbmVyLmFycmF5RWxlbWVudCgpOwogICAgICAgICAgICBsaXN0ZW5lci5lbmRBcnJheSgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGZhaWwocG9zaXRpb24pOwogICAgICAgICAgfQogICAgICAgICAgc3RhdGUgPSByZXN0b3JlU3RhdGUoKSB8IFZBTFVFX1JFQURfQklUUzsKICAgICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFJCUkFDRToKICAgICAgICAgIGlmIChzdGF0ZSA9PSBTVEFURV9PQkpFQ1RfRU1QVFkpIHsKICAgICAgICAgICAgbGlzdGVuZXIuZW5kT2JqZWN0KCk7CiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IFNUQVRFX09CSkVDVF9WQUxVRSkgewogICAgICAgICAgICBsaXN0ZW5lci5wcm9wZXJ0eVZhbHVlKCk7CiAgICAgICAgICAgIGxpc3RlbmVyLmVuZE9iamVjdCgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGZhaWwocG9zaXRpb24pOwogICAgICAgICAgfQogICAgICAgICAgc3RhdGUgPSByZXN0b3JlU3RhdGUoKSB8IFZBTFVFX1JFQURfQklUUzsKICAgICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgaWYgKChzdGF0ZSAmIEFMTE9XX1ZBTFVFX01BU0spICE9IDApIGZhaWwocG9zaXRpb24pOwogICAgICAgICAgc3RhdGUgfD0gVkFMVUVfUkVBRF9CSVRTOwogICAgICAgICAgcG9zaXRpb24gPSBwYXJzZU51bWJlcihjaGFyLCBwb3NpdGlvbik7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgdGhpcy5zdGF0ZSA9IHN0YXRlOwogIH0KCiAgLyoqCiAgICogUGFyc2VzIGEgInRydWUiIGxpdGVyYWwgc3RhcnRpbmcgYXQgW3Bvc2l0aW9uXS4KICAgKgogICAqIFRoZSBjaGFyYWN0ZXIgYHNvdXJjZVtwb3NpdGlvbl1gIG11c3QgYmUgInQiLgogICAqLwogIGludCBwYXJzZVRydWUoaW50IHBvc2l0aW9uKSB7CiAgICBhc3NlcnQoZ2V0Q2hhcihwb3NpdGlvbikgPT0gQ0hBUl90KTsKICAgIGlmIChjaHVua0VuZCA8IHBvc2l0aW9uICsgNCkgewogICAgICByZXR1cm4gcGFyc2VLZXl3b3JkUHJlZml4KHBvc2l0aW9uLCAidHJ1ZSIsIEtXRF9UUlVFKTsKICAgIH0KICAgIGlmIChnZXRDaGFyKHBvc2l0aW9uICsgMSkgIT0gQ0hBUl9yIHx8CiAgICAgICAgZ2V0Q2hhcihwb3NpdGlvbiArIDIpICE9IENIQVJfdSB8fAogICAgICAgIGdldENoYXIocG9zaXRpb24gKyAzKSAhPSBDSEFSX2UpIHsKICAgICAgcmV0dXJuIGZhaWwocG9zaXRpb24pOwogICAgfQogICAgbGlzdGVuZXIuaGFuZGxlQm9vbCh0cnVlKTsKICAgIHJldHVybiBwb3NpdGlvbiArIDQ7CiAgfQoKICAvKioKICAgKiBQYXJzZXMgYSAiZmFsc2UiIGxpdGVyYWwgc3RhcnRpbmcgYXQgW3Bvc2l0aW9uXS4KICAgKgogICAqIFRoZSBjaGFyYWN0ZXIgYHNvdXJjZVtwb3NpdGlvbl1gIG11c3QgYmUgImYiLgogICAqLwogIGludCBwYXJzZUZhbHNlKGludCBwb3NpdGlvbikgewogICAgYXNzZXJ0KGdldENoYXIocG9zaXRpb24pID09IENIQVJfZik7CiAgICBpZiAoY2h1bmtFbmQgPCBwb3NpdGlvbiArIDUpIHsKICAgICAgcmV0dXJuIHBhcnNlS2V5d29yZFByZWZpeChwb3NpdGlvbiwgImZhbHNlIiwgS1dEX0ZBTFNFKTsKICAgIH0KICAgIGlmIChnZXRDaGFyKHBvc2l0aW9uICsgMSkgIT0gQ0hBUl9hIHx8CiAgICAgICAgZ2V0Q2hhcihwb3NpdGlvbiArIDIpICE9IENIQVJfbCB8fAogICAgICAgIGdldENoYXIocG9zaXRpb24gKyAzKSAhPSBDSEFSX3MgfHwKICAgICAgICBnZXRDaGFyKHBvc2l0aW9uICsgNCkgIT0gQ0hBUl9lKSB7CiAgICAgIHJldHVybiBmYWlsKHBvc2l0aW9uKTsKICAgIH0KICAgIGxpc3RlbmVyLmhhbmRsZUJvb2woZmFsc2UpOwogICAgcmV0dXJuIHBvc2l0aW9uICsgNTsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhICJudWxsIiBsaXRlcmFsIHN0YXJ0aW5nIGF0IFtwb3NpdGlvbl0uCiAgICoKICAgKiBUaGUgY2hhcmFjdGVyIGBzb3VyY2VbcG9zaXRpb25dYCBtdXN0IGJlICJuIi4KICAgKi8KICBpbnQgcGFyc2VOdWxsKGludCBwb3NpdGlvbikgewogICAgYXNzZXJ0KGdldENoYXIocG9zaXRpb24pID09IENIQVJfbik7CiAgICBpZiAoY2h1bmtFbmQgPCBwb3NpdGlvbiArIDQpIHsKICAgICAgcmV0dXJuIHBhcnNlS2V5d29yZFByZWZpeChwb3NpdGlvbiwgIm51bGwiLCBLV0RfTlVMTCk7CiAgICB9CiAgICBpZiAoZ2V0Q2hhcihwb3NpdGlvbiArIDEpICE9IENIQVJfdSB8fAogICAgICAgIGdldENoYXIocG9zaXRpb24gKyAyKSAhPSBDSEFSX2wgfHwKICAgICAgICBnZXRDaGFyKHBvc2l0aW9uICsgMykgIT0gQ0hBUl9sKSB7CiAgICAgIHJldHVybiBmYWlsKHBvc2l0aW9uKTsKICAgIH0KICAgIGxpc3RlbmVyLmhhbmRsZU51bGwoKTsKICAgIHJldHVybiBwb3NpdGlvbiArIDQ7CiAgfQoKICBpbnQgcGFyc2VLZXl3b3JkUHJlZml4KGludCBwb3NpdGlvbiwgU3RyaW5nIGNoYXJzLCBpbnQgdHlwZSkgewogICAgYXNzZXJ0KGdldENoYXIocG9zaXRpb24pID09IGNoYXJzLmNvZGVVbml0QXQoMCkpOwogICAgaW50IGxlbmd0aCA9IGNodW5rRW5kOwogICAgaW50IHN0YXJ0ID0gcG9zaXRpb247CiAgICBpbnQgY291bnQgPSAxOwogICAgd2hpbGUgKCsrcG9zaXRpb24gPCBsZW5ndGgpIHsKICAgICAgaW50IGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgICAgaWYgKGNoYXIgIT0gY2hhcnMuY29kZVVuaXRBdChjb3VudCkpIHJldHVybiBmYWlsKHN0YXJ0KTsKICAgICAgY291bnQrKzsKICAgIH0KICAgIHRoaXMucGFydGlhbFN0YXRlID0gUEFSVElBTF9LRVlXT1JEIHwgdHlwZSB8IChjb3VudCA8PCBLV0RfQ09VTlRfU0hJRlQpOwogICAgcmV0dXJuIGxlbmd0aDsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhIHN0cmluZyB2YWx1ZS4KICAgKgogICAqIEluaXRpYWwgW3Bvc2l0aW9uXSBpcyByaWdodCBhZnRlciB0aGUgaW5pdGlhbCBxdW90ZS4KICAgKiBSZXR1cm5lZCBwb3NpdGlvbiByaWdodCBhZnRlciB0aGUgZmluYWwgcXVvdGUuCiAgICovCiAgaW50IHBhcnNlU3RyaW5nKGludCBwb3NpdGlvbikgewogICAgLy8gRm9ybWF0OiAnIicoW15ceDAwLVx4MWZcXFwiXXwnXFwnW2JmbnJ0L1xcIl0pKiciJwogICAgLy8gSW5pdGlhbCBwb3NpdGlvbiBpcyByaWdodCBhZnRlciBmaXJzdCAnIicuCiAgICBpbnQgc3RhcnQgPSBwb3NpdGlvbjsKICAgIGludCBlbmQgPSBjaHVua0VuZDsKICAgIGludCBiaXRzID0gMDsKICAgIHdoaWxlIChwb3NpdGlvbiA8IGVuZCkgewogICAgICBpbnQgY2hhciA9IGdldENoYXIocG9zaXRpb24rKyk7CiAgICAgIGJpdHMgfD0gY2hhcjsgLy8gSW5jbHVkZXMgZmluYWwgJyInLCBidXQgdGhhdCBuZXZlciBtYXR0ZXJzLgogICAgICAvLyBCQUNLU0xBU0ggaXMgbGFyZ2VyIHRoYW4gUVVPVEUgYW5kIFNQQUNFLgogICAgICBpZiAoY2hhciA+IEJBQ0tTTEFTSCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChjaGFyID09IEJBQ0tTTEFTSCkgewogICAgICAgIGJlZ2luU3RyaW5nKCk7CiAgICAgICAgaW50IHNsaWNlRW5kID0gcG9zaXRpb24gLSAxOwogICAgICAgIGlmIChzdGFydCA8IHNsaWNlRW5kKSBhZGRTbGljZVRvU3RyaW5nKHN0YXJ0LCBzbGljZUVuZCk7CiAgICAgICAgcmV0dXJuIHBhcnNlU3RyaW5nVG9CdWZmZXIoc2xpY2VFbmQpOwogICAgICB9CiAgICAgIGlmIChjaGFyID09IFFVT1RFKSB7CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlU3RyaW5nKGdldFN0cmluZyhzdGFydCwgcG9zaXRpb24gLSAxLCBiaXRzKSk7CiAgICAgICAgcmV0dXJuIHBvc2l0aW9uOwogICAgICB9CiAgICAgIGlmIChjaGFyIDwgU1BBQ0UpIHsKICAgICAgICByZXR1cm4gZmFpbChwb3NpdGlvbiAtIDEsICJDb250cm9sIGNoYXJhY3RlciBpbiBzdHJpbmciKTsKICAgICAgfQogICAgfQogICAgYmVnaW5TdHJpbmcoKTsKICAgIGlmIChzdGFydCA8IGVuZCkgYWRkU2xpY2VUb1N0cmluZyhzdGFydCwgZW5kKTsKICAgIHJldHVybiBjaHVua1N0cmluZyhTVFJfUExBSU4pOwogIH0KCiAgLyoqCiAgICogU2V0cyB1cCBhIHBhcnRpYWwgc3RyaW5nIHN0YXRlLgogICAqCiAgICogVGhlIHN0YXRlIGlzIGVpdGhlciBub3QgaW5zaWRlIGFuIGVzY2FwZSwgb3IgcmlnaHQgYWZ0ZXIgYSBiYWNrc2xhc2guCiAgICogRm9yIHBhcnRpYWwgc3RyaW5ncyBlbmRpbmcgaW5zaWRlIGEgVW5pY29kZSBlc2NhcGUsIHVzZQogICAqIFtjaHVua1N0cmluZ0VzY2FwZVVdLgogICAqLwogIGludCBjaHVua1N0cmluZyhpbnQgc3RyaW5nU3RhdGUpIHsKICAgIHBhcnRpYWxTdGF0ZSA9IFBBUlRJQUxfU1RSSU5HIHwgc3RyaW5nU3RhdGU7CiAgICByZXR1cm4gY2h1bmtFbmQ7CiAgfQoKICAvKioKICAgKiBTZXRzIHVwIGEgcGFydGlhbCBzdHJpbmcgc3RhdGUgZm9yIGEgcGFydGlhbGx5IHBhcnNlZCBVbmljb2RlIGVzY2FwZS4KICAgKgogICAqIFRoZSBwYXJ0aWFsIHN0cmluZyBzdGF0ZSBpbmNsdWRlcyB0aGUgY3VycmVudCBbYnVmZmVyXSBhbmQgdGhlCiAgICogbnVtYmVyIG9mIGhleCBkaWdpdHMgb2YgdGhlIFVuaWNvZGUgc2VlbiBzbyBmYXIgKGUuZy4sIGZvciBgIlx1MzAnKQogICAqIHRoZSBzdGF0ZSBrbm93cyB0aGF0IHR3byBkaWdpdHMgaGF2ZSBiZWVuIHNlZW4sIGFuZCB3aGF0IHRoZWlyIHZhbHVlIGlzLgogICAqCiAgICogUmV0dXJucyBbY2h1bmtFbmRdIHNvIGl0IGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgYSByZXR1cm4gc3RhdGVtZW50LgogICAqLwogIGludCBjaHVua1N0cmluZ0VzY2FwZVUoaW50IGNvdW50LCBpbnQgdmFsdWUpIHsKICAgIHBhcnRpYWxTdGF0ZSA9IFBBUlRJQUxfU1RSSU5HIHwKICAgICAgICBTVFJfVSB8CiAgICAgICAgKGNvdW50IDw8IFNUUl9VX0NPVU5UX1NISUZUKSB8CiAgICAgICAgKHZhbHVlIDw8IFNUUl9VX1ZBTFVFX1NISUZUKTsKICAgIHJldHVybiBjaHVua0VuZDsKICB9CgogIC8qKgogICAqIFBhcnNlcyB0aGUgcmVtYWluZGVyIG9mIGEgc3RyaW5nIGxpdGVyYWwgaW50byBhIGJ1ZmZlci4KICAgKgogICAqIFRoZSBidWZmZXIgaXMgc3RvcmVkIGluIFtidWZmZXJdIGFuZCBpdHMgdW5kZXJseWluZyBmb3JtYXQgZGVwZW5kcyBvbgogICAqIHRoZSBpbnB1dCBjaHVuayB0eXBlLiBGb3IgZXhhbXBsZSBVVEYtOCBkZWNvZGluZyBoYXBwZW5zIGluIHRoZQogICAqIGJ1ZmZlciwgbm90IGluIHRoZSBwYXJzZXIsIHNpbmNlIGFsbCBzaWduaWZpY2FudCBKU09OIGNoYXJhY3RlcnMgYXJlIEFTQ0lJLgogICAqCiAgICogVGhpcyBmdW5jdGlvbiBzY2FucyB0aHJvdWdoIHRoZSBzdHJpbmcgbGl0ZXJhbCBmb3IgZXNjYXBlcywgYW5kIGNvcGllcwogICAqIHNsaWNlcyBvZiBub24tZXNjYXBlIGNoYXJhY3RlcnMgdXNpbmcgW2FkZFNsaWNlVG9TdHJpbmddLgogICAqLwogIGludCBwYXJzZVN0cmluZ1RvQnVmZmVyKGludCBwb3NpdGlvbikgewogICAgaW50IGVuZCA9IGNodW5rRW5kOwogICAgaW50IHN0YXJ0ID0gcG9zaXRpb247CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAocG9zaXRpb24gPT0gZW5kKSB7CiAgICAgICAgaWYgKHBvc2l0aW9uID4gc3RhcnQpIHsKICAgICAgICAgIGFkZFNsaWNlVG9TdHJpbmcoc3RhcnQsIHBvc2l0aW9uKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNodW5rU3RyaW5nKFNUUl9QTEFJTik7CiAgICAgIH0KICAgICAgaW50IGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKyspOwogICAgICBpZiAoY2hhciA+IEJBQ0tTTEFTSCkgY29udGludWU7CiAgICAgIGlmIChjaGFyIDwgU1BBQ0UpIHsKICAgICAgICByZXR1cm4gZmFpbChwb3NpdGlvbiAtIDEpOyAvLyBDb250cm9sIGNoYXJhY3RlciBpbiBzdHJpbmcuCiAgICAgIH0KICAgICAgaWYgKGNoYXIgPT0gUVVPVEUpIHsKICAgICAgICBpbnQgcXVvdGVQb3NpdGlvbiA9IHBvc2l0aW9uIC0gMTsKICAgICAgICBpZiAocXVvdGVQb3NpdGlvbiA+IHN0YXJ0KSB7CiAgICAgICAgICBhZGRTbGljZVRvU3RyaW5nKHN0YXJ0LCBxdW90ZVBvc2l0aW9uKTsKICAgICAgICB9CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlU3RyaW5nKGVuZFN0cmluZygpKTsKICAgICAgICByZXR1cm4gcG9zaXRpb247CiAgICAgIH0KICAgICAgaWYgKGNoYXIgIT0gQkFDS1NMQVNIKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgLy8gSGFuZGxlIGVzY2FwZS4KICAgICAgaWYgKHBvc2l0aW9uIC0gMSA+IHN0YXJ0KSB7CiAgICAgICAgYWRkU2xpY2VUb1N0cmluZyhzdGFydCwgcG9zaXRpb24gLSAxKTsKICAgICAgfQogICAgICBpZiAocG9zaXRpb24gPT0gZW5kKSByZXR1cm4gY2h1bmtTdHJpbmcoU1RSX0VTQ0FQRSk7CiAgICAgIHBvc2l0aW9uID0gcGFyc2VTdHJpbmdFc2NhcGUocG9zaXRpb24pOwogICAgICBpZiAocG9zaXRpb24gPT0gZW5kKSByZXR1cm4gcG9zaXRpb247CiAgICAgIHN0YXJ0ID0gcG9zaXRpb247CiAgICB9CiAgICByZXR1cm4gLTE7IC8vIFVOUkVBQ0hBQkxFLgogIH0KCiAgLyoqCiAgICogUGFyc2UgYSBzdHJpbmcgZXNjYXBlLgogICAqCiAgICogUG9zaXRpb24gaXMgcmlnaHQgYWZ0ZXIgdGhlIGluaXRpYWwgYmFja3NsYXNoLgogICAqIFRoZSBmb2xsb3dpbmcgZXNjYXBlIGlzIHBhcnNlZCBpbnRvIGEgY2hhcmFjdGVyIGNvZGUgd2hpY2ggaXMgYWRkZWQgdG8KICAgKiB0aGUgY3VycmVudCBzdHJpbmcgYnVmZmVyIHVzaW5nIFthZGRDaGFyVG9TdHJpbmddLgogICAqCiAgICogUmV0dXJucyBwb3NpdGlvbiBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIGVzY2FwZS4KICAgKi8KICBpbnQgcGFyc2VTdHJpbmdFc2NhcGUoaW50IHBvc2l0aW9uKSB7CiAgICBpbnQgY2hhciA9IGdldENoYXIocG9zaXRpb24rKyk7CiAgICBpbnQgbGVuZ3RoID0gY2h1bmtFbmQ7CiAgICBzd2l0Y2ggKGNoYXIpIHsKICAgICAgY2FzZSBDSEFSX2I6CiAgICAgICAgY2hhciA9IEJBQ0tTUEFDRTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDSEFSX2Y6CiAgICAgICAgY2hhciA9IEZPUk1fRkVFRDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDSEFSX246CiAgICAgICAgY2hhciA9IE5FV0xJTkU7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ0hBUl9yOgogICAgICAgIGNoYXIgPSBDQVJSSUFHRV9SRVRVUk47CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ0hBUl90OgogICAgICAgIGNoYXIgPSBUQUI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU0xBU0g6CiAgICAgIGNhc2UgQkFDS1NMQVNIOgogICAgICBjYXNlIFFVT1RFOgogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENIQVJfdToKICAgICAgICBpbnQgaGV4U3RhcnQgPSBwb3NpdGlvbiAtIDE7CiAgICAgICAgaW50IHZhbHVlID0gMDsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICAgaWYgKHBvc2l0aW9uID09IGxlbmd0aCkgcmV0dXJuIGNodW5rU3RyaW5nRXNjYXBlVShpLCB2YWx1ZSk7CiAgICAgICAgICBjaGFyID0gZ2V0Q2hhcihwb3NpdGlvbisrKTsKICAgICAgICAgIGludCBkaWdpdCA9IGNoYXIgXiAweDMwOwogICAgICAgICAgdmFsdWUgKj0gMTY7CiAgICAgICAgICBpZiAoZGlnaXQgPD0gOSkgewogICAgICAgICAgICB2YWx1ZSArPSBkaWdpdDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGRpZ2l0ID0gKGNoYXIgfCAweDIwKSAtIENIQVJfYTsKICAgICAgICAgICAgaWYgKGRpZ2l0IDwgMCB8fCBkaWdpdCA+IDUpIHsKICAgICAgICAgICAgICByZXR1cm4gZmFpbChoZXhTdGFydCwgIkludmFsaWQgdW5pY29kZSBlc2NhcGUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YWx1ZSArPSBkaWdpdCArIDEwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjaGFyID0gdmFsdWU7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgaWYgKGNoYXIgPCBTUEFDRSkgcmV0dXJuIGZhaWwocG9zaXRpb24sICJDb250cm9sIGNoYXJhY3RlciBpbiBzdHJpbmciKTsKICAgICAgICByZXR1cm4gZmFpbChwb3NpdGlvbiwgIlVucmVjb2duaXplZCBzdHJpbmcgZXNjYXBlIik7CiAgICB9CiAgICBhZGRDaGFyVG9TdHJpbmcoY2hhcik7CiAgICBpZiAocG9zaXRpb24gPT0gbGVuZ3RoKSByZXR1cm4gY2h1bmtTdHJpbmcoU1RSX1BMQUlOKTsKICAgIHJldHVybiBwb3NpdGlvbjsKICB9CgogIC8vLyBTZXRzIHVwIGEgcGFydGlhbCBudW1lcmFsIHN0YXRlLgogIC8vLyBSZXR1cm5zIGNodW5rRW5kIHRvIGFsbG93IGVhc3kgb25lLWxpbmUgYmFpbG91dCB0ZXN0cy4KICBpbnQgYmVnaW5DaHVua051bWJlcihpbnQgc3RhdGUsIGludCBzdGFydCkgewogICAgaW50IGVuZCA9IGNodW5rRW5kOwogICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgdmFyIGJ1ZmZlciA9IG5ldyBfTnVtYmVyQnVmZmVyKGxlbmd0aCk7CiAgICBjb3B5Q2hhcnNUb0xpc3Qoc3RhcnQsIGVuZCwgYnVmZmVyLmxpc3QsIDApOwogICAgYnVmZmVyLmxlbmd0aCA9IGxlbmd0aDsKICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwogICAgdGhpcy5wYXJ0aWFsU3RhdGUgPSBQQVJUSUFMX05VTUVSQUwgfCBzdGF0ZTsKICAgIHJldHVybiBlbmQ7CiAgfQoKICB2b2lkIGFkZE51bWJlckNodW5rKF9OdW1iZXJCdWZmZXIgYnVmZmVyLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBvdmVyaGVhZCkgewogICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgaW50IGNvdW50ID0gYnVmZmVyLmxlbmd0aDsKICAgIGludCBuZXdDb3VudCA9IGNvdW50ICsgbGVuZ3RoOwogICAgaW50IG5ld0NhcGFjaXR5ID0gbmV3Q291bnQgKyBvdmVyaGVhZDsKICAgIGJ1ZmZlci5lbnN1cmVDYXBhY2l0eShuZXdDYXBhY2l0eSk7CiAgICBjb3B5Q2hhcnNUb0xpc3Qoc3RhcnQsIGVuZCwgYnVmZmVyLmxpc3QsIGNvdW50KTsKICAgIGJ1ZmZlci5sZW5ndGggPSBuZXdDb3VudDsKICB9CgogIC8vIENvbnRpbnVlcyBhbiBhbHJlYWR5IGNodW5rZWQgbnVtYmVyIGFjcm9zcyBhbiBlbnRpcmUgY2h1bmsuCiAgaW50IGNvbnRpbnVlQ2h1bmtOdW1iZXIoaW50IHN0YXRlLCBpbnQgc3RhcnQsIF9OdW1iZXJCdWZmZXIgYnVmZmVyKSB7CiAgICBpbnQgZW5kID0gY2h1bmtFbmQ7CiAgICBhZGROdW1iZXJDaHVuayhidWZmZXIsIHN0YXJ0LCBlbmQsIF9OdW1iZXJCdWZmZXIua0RlZmF1bHRPdmVyaGVhZCk7CiAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKICAgIHRoaXMucGFydGlhbFN0YXRlID0gUEFSVElBTF9OVU1FUkFMIHwgc3RhdGU7CiAgICByZXR1cm4gZW5kOwogIH0KCiAgaW50IGZpbmlzaENodW5rTnVtYmVyKGludCBzdGF0ZSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBfTnVtYmVyQnVmZmVyIGJ1ZmZlcikgewogICAgaWYgKHN0YXRlID09IE5VTV9aRVJPKSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZU51bWJlcigwKTsKICAgICAgcmV0dXJuIGVuZDsKICAgIH0KICAgIGlmIChlbmQgPiBzdGFydCkgewogICAgICBhZGROdW1iZXJDaHVuayhidWZmZXIsIHN0YXJ0LCBlbmQsIDApOwogICAgfQogICAgaWYgKHN0YXRlID09IE5VTV9ESUdJVCkgewogICAgICBudW0gdmFsdWUgPSBidWZmZXIucGFyc2VOdW0oKTsKICAgICAgbGlzdGVuZXIuaGFuZGxlTnVtYmVyKHZhbHVlKTsKICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gTlVNX0RPVF9ESUdJVCB8fCBzdGF0ZSA9PSBOVU1fRV9ESUdJVCkgewogICAgICBsaXN0ZW5lci5oYW5kbGVOdW1iZXIoYnVmZmVyLnBhcnNlRG91YmxlKCkpOwogICAgfSBlbHNlIHsKICAgICAgZmFpbChjaHVua0VuZCwgIlVudGVybWluYXRlZCBudW1iZXIgbGl0ZXJhbCIpOwogICAgfQogICAgcmV0dXJuIGVuZDsKICB9CgogIGludCBwYXJzZU51bWJlcihpbnQgY2hhciwgaW50IHBvc2l0aW9uKSB7CiAgICAvLyBBbHNvIGNhbGxlZCBvbiBhbnkgdW5leHBlY3RlZCBjaGFyYWN0ZXIuCiAgICAvLyBGb3JtYXQ6CiAgICAvLyAgJy0nPygnMCd8WzEtOV1bMC05XSopKCcuJ1swLTldKyk/KFtlRV1bKy1dP1swLTldKyk/CiAgICBpbnQgc3RhcnQgPSBwb3NpdGlvbjsKICAgIGludCBsZW5ndGggPSBjaHVua0VuZDsKICAgIC8vIENvbGxlY3RzIGFuIGludCB2YWx1ZSB3aGlsZSBwYXJzaW5nLiBVc2VkIGZvciBib3RoIGFuIGludGVnZXIgbGl0ZXJhbCwKICAgIC8vIGFuZCB0aGUgZXhwb25lbnQgcGFydCBvZiBhIGRvdWJsZSBsaXRlcmFsLgogICAgLy8gU3RvcmVkIGFzIG5lZ2F0aXZlIHRvIGVuc3VyZSB3ZSBjYW4gcmVwcmVzZW50IC0yXjYzLgogICAgaW50IGludFZhbHVlID0gMDsKICAgIGRvdWJsZSBkb3VibGVWYWx1ZSA9IDAuMDsgLy8gQ29sbGVjdCBkb3VibGUgdmFsdWUgd2hpbGUgcGFyc2luZy4KICAgIC8vIDEgaWYgdGhlcmUgaXMgbm8gbGVhZGluZyAtLCAtMSBpZiB0aGVyZSBpcy4KICAgIGludCBzaWduID0gMTsKICAgIGJvb2wgaXNEb3VibGUgPSBmYWxzZTsKICAgIC8vIEJyZWFrIHRoaXMgYmxvY2sgd2hlbiB0aGUgZW5kIG9mIHRoZSBudW1iZXIgbGl0ZXJhbCBpcyByZWFjaGVkLgogICAgLy8gQXQgdGhhdCB0aW1lLCBwb3NpdGlvbiBwb2ludHMgdG8gdGhlIG5leHQgY2hhcmFjdGVyLCBhbmQgaXNEb3VibGUKICAgIC8vIGlzIHNldCBpZiB0aGUgbGl0ZXJhbCBjb250YWlucyBhIGRlY2ltYWwgcG9pbnQgb3IgYW4gZXhwb25lbnRpYWwuCiAgICBpZiAoY2hhciA9PSBNSU5VUykgewogICAgICBzaWduID0gLTE7CiAgICAgIHBvc2l0aW9uKys7CiAgICAgIGlmIChwb3NpdGlvbiA9PSBsZW5ndGgpIHJldHVybiBiZWdpbkNodW5rTnVtYmVyKE5VTV9TSUdOLCBzdGFydCk7CiAgICAgIGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgIH0KICAgIGludCBkaWdpdCA9IGNoYXIgXiBDSEFSXzA7CiAgICBpZiAoZGlnaXQgPiA5KSB7CiAgICAgIGlmIChzaWduIDwgMCkgewogICAgICAgIGZhaWwocG9zaXRpb24sICJNaXNzaW5nIGV4cGVjdGVkIGRpZ2l0Iik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gSWYgaXQgZG9lc24ndCBldmVuIHN0YXJ0IG91dCBhcyBhIG51bWVyYWwuCiAgICAgICAgZmFpbChwb3NpdGlvbik7CiAgICAgIH0KICAgIH0KICAgIGlmIChkaWdpdCA9PSAwKSB7CiAgICAgIHBvc2l0aW9uKys7CiAgICAgIGlmIChwb3NpdGlvbiA9PSBsZW5ndGgpIHJldHVybiBiZWdpbkNodW5rTnVtYmVyKE5VTV9aRVJPLCBzdGFydCk7CiAgICAgIGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgICAgZGlnaXQgPSBjaGFyIF4gQ0hBUl8wOwogICAgICAvLyBJZiBzdGFydGluZyB3aXRoIHplcm8sIG5leHQgY2hhcmFjdGVyIG11c3Qgbm90IGJlIGRpZ2l0LgogICAgICBpZiAoZGlnaXQgPD0gOSkgZmFpbChwb3NpdGlvbik7CiAgICB9IGVsc2UgewogICAgICBpbnQgZGlnaXRDb3VudCA9IDA7CiAgICAgIGRvIHsKICAgICAgICBpZiAoZGlnaXRDb3VudCA+PSAxOCkgewogICAgICAgICAgLy8gQ2hlY2sgZm9yIG92ZXJmbG93LgogICAgICAgICAgLy8gSXMgMSBpZiBkaWdpdCBpcyA4IG9yIDkgYW5kIHNpZ24gPT0gMCwgb3IgZGlnaXQgaXMgOSBhbmQgc2lnbiA8IDA7CiAgICAgICAgICBpbnQgaGlnaERpZ2l0ID0gZGlnaXQgPj4gMzsKICAgICAgICAgIGlmIChzaWduIDwgMCkgaGlnaERpZ2l0ICY9IGRpZ2l0OwogICAgICAgICAgaWYgKGRpZ2l0Q291bnQgPT0gMTkgfHwgaW50VmFsdWUgLSBoaWdoRGlnaXQgPCAtOTIyMzM3MjAzNjg1NDc3NTgwKSB7CiAgICAgICAgICAgIGlzRG91YmxlID0gdHJ1ZTsKICAgICAgICAgICAgLy8gQmlnIHZhbHVlIHRoYXQgd2Uga25vdyBpcyBub3QgdHJ1c3RlZCB0byBiZSBleGFjdCBsYXRlciwKICAgICAgICAgICAgLy8gZm9yY2luZyByZXBhcnNpbmcgdXNpbmcgYGRvdWJsZS5wYXJzZWAuCiAgICAgICAgICAgIGRvdWJsZVZhbHVlID0gOTIyMzM3MjAzNjg1NDc3NTgwOC4wOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpbnRWYWx1ZSA9IDEwICogaW50VmFsdWUgLSBkaWdpdDsKICAgICAgICBkaWdpdENvdW50Kys7CiAgICAgICAgcG9zaXRpb24rKzsKICAgICAgICBpZiAocG9zaXRpb24gPT0gbGVuZ3RoKSByZXR1cm4gYmVnaW5DaHVua051bWJlcihOVU1fRElHSVQsIHN0YXJ0KTsKICAgICAgICBjaGFyID0gZ2V0Q2hhcihwb3NpdGlvbik7CiAgICAgICAgZGlnaXQgPSBjaGFyIF4gQ0hBUl8wOwogICAgICB9IHdoaWxlIChkaWdpdCA8PSA5KTsKICAgIH0KICAgIGlmIChjaGFyID09IERFQ0lNQUxQT0lOVCkgewogICAgICBpZiAoIWlzRG91YmxlKSB7CiAgICAgICAgaXNEb3VibGUgPSB0cnVlOwogICAgICAgIGRvdWJsZVZhbHVlID0gKGludFZhbHVlID09IDApID8gMC4wIDogLWludFZhbHVlLnRvRG91YmxlKCk7CiAgICAgIH0KICAgICAgaW50VmFsdWUgPSAwOwogICAgICBwb3NpdGlvbisrOwogICAgICBpZiAocG9zaXRpb24gPT0gbGVuZ3RoKSByZXR1cm4gYmVnaW5DaHVua051bWJlcihOVU1fRE9ULCBzdGFydCk7CiAgICAgIGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgICAgZGlnaXQgPSBjaGFyIF4gQ0hBUl8wOwogICAgICBpZiAoZGlnaXQgPiA5KSBmYWlsKHBvc2l0aW9uKTsKICAgICAgZG8gewogICAgICAgIGRvdWJsZVZhbHVlID0gMTAuMCAqIGRvdWJsZVZhbHVlICsgZGlnaXQ7CiAgICAgICAgaW50VmFsdWUgLT0gMTsKICAgICAgICBwb3NpdGlvbisrOwogICAgICAgIGlmIChwb3NpdGlvbiA9PSBsZW5ndGgpIHJldHVybiBiZWdpbkNodW5rTnVtYmVyKE5VTV9ET1RfRElHSVQsIHN0YXJ0KTsKICAgICAgICBjaGFyID0gZ2V0Q2hhcihwb3NpdGlvbik7CiAgICAgICAgZGlnaXQgPSBjaGFyIF4gQ0hBUl8wOwogICAgICB9IHdoaWxlIChkaWdpdCA8PSA5KTsKICAgIH0KICAgIGlmICgoY2hhciB8IDB4MjApID09IENIQVJfZSkgewogICAgICBpZiAoIWlzRG91YmxlKSB7CiAgICAgICAgaXNEb3VibGUgPSB0cnVlOwogICAgICAgIGRvdWJsZVZhbHVlID0gKGludFZhbHVlID09IDApID8gMC4wIDogLWludFZhbHVlLnRvRG91YmxlKCk7CiAgICAgICAgaW50VmFsdWUgPSAwOwogICAgICB9CiAgICAgIHBvc2l0aW9uKys7CiAgICAgIGlmIChwb3NpdGlvbiA9PSBsZW5ndGgpIHJldHVybiBiZWdpbkNodW5rTnVtYmVyKE5VTV9FLCBzdGFydCk7CiAgICAgIGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgICAgaW50IGV4cFNpZ24gPSAxOwogICAgICBpbnQgZXhwb25lbnQgPSAwOwogICAgICBpZiAoKChjaGFyICsgMSkgfCAyKSA9PSAweDJlIC8qKyBvciAtKi8pIHsKICAgICAgICBleHBTaWduID0gMHgyQyAtIGNoYXI7IC8vIC0xIGZvciBNSU5VUywgKzEgZm9yIFBMVVMKICAgICAgICBwb3NpdGlvbisrOwogICAgICAgIGlmIChwb3NpdGlvbiA9PSBsZW5ndGgpIHJldHVybiBiZWdpbkNodW5rTnVtYmVyKE5VTV9FX1NJR04sIHN0YXJ0KTsKICAgICAgICBjaGFyID0gZ2V0Q2hhcihwb3NpdGlvbik7CiAgICAgIH0KICAgICAgZGlnaXQgPSBjaGFyIF4gQ0hBUl8wOwogICAgICBpZiAoZGlnaXQgPiA5KSB7CiAgICAgICAgZmFpbChwb3NpdGlvbiwgIk1pc3NpbmcgZXhwZWN0ZWQgZGlnaXQiKTsKICAgICAgfQogICAgICBib29sIGV4cG9uZW50T3ZlcmZsb3cgPSBmYWxzZTsKICAgICAgZG8gewogICAgICAgIGV4cG9uZW50ID0gMTAgKiBleHBvbmVudCArIGRpZ2l0OwogICAgICAgIGlmIChleHBvbmVudCA+IDQwMCkgZXhwb25lbnRPdmVyZmxvdyA9IHRydWU7CiAgICAgICAgcG9zaXRpb24rKzsKICAgICAgICBpZiAocG9zaXRpb24gPT0gbGVuZ3RoKSByZXR1cm4gYmVnaW5DaHVua051bWJlcihOVU1fRV9ESUdJVCwgc3RhcnQpOwogICAgICAgIGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgICAgICBkaWdpdCA9IGNoYXIgXiBDSEFSXzA7CiAgICAgIH0gd2hpbGUgKGRpZ2l0IDw9IDkpOwogICAgICBpZiAoZXhwb25lbnRPdmVyZmxvdykgewogICAgICAgIGlmIChkb3VibGVWYWx1ZSA9PSAwLjAgfHwgZXhwU2lnbiA8IDApIHsKICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZU51bWJlcihzaWduIDwgMCA/IC0wLjAgOiAwLjApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVOdW1iZXIoCiAgICAgICAgICAgICAgc2lnbiA8IDAgPyBkb3VibGUubmVnYXRpdmVJbmZpbml0eSA6IGRvdWJsZS5pbmZpbml0eSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwb3NpdGlvbjsKICAgICAgfQogICAgICBpbnRWYWx1ZSArPSBleHBTaWduICogZXhwb25lbnQ7CiAgICB9CiAgICBpZiAoIWlzRG91YmxlKSB7CiAgICAgIGludCBiaXRGbGFnID0gLShzaWduICsgMSkgPj4gMTsgLy8gMCBpZiBzaWduID09IC0xLCAtMSBpZiBzaWduID09IDEKICAgICAgLy8gTmVnYXRlIGlmIGJpdEZsYWcgaXMgLTEgYnkgZG9pbmcgfmludFZhbHVlICsgMQogICAgICBsaXN0ZW5lci5oYW5kbGVOdW1iZXIoKGludFZhbHVlIF4gYml0RmxhZykgLSBiaXRGbGFnKTsKICAgICAgcmV0dXJuIHBvc2l0aW9uOwogICAgfQogICAgLy8gRG91YmxlIHZhbHVlcyBhdCBvciBhYm92ZSB0aGlzIHZhbHVlICgyICoqIDUzKSBtYXkgaGF2ZSBsb3N0IHByZWNpc2lvbi4KICAgIC8vIE9ubHkgdHJ1c3QgcmVzdWx0cyB0aGF0IGFyZSBiZWxvdyB0aGlzIHZhbHVlLgogICAgY29uc3QgZG91YmxlIG1heEV4YWN0RG91YmxlID0gOTAwNzE5OTI1NDc0MDk5Mi4wOwogICAgaWYgKGRvdWJsZVZhbHVlIDwgbWF4RXhhY3REb3VibGUpIHsKICAgICAgaW50IGV4cG9uZW50ID0gaW50VmFsdWU7CiAgICAgIGRvdWJsZSBzaWduZWRNYW50aXNzYSA9IGRvdWJsZVZhbHVlICogc2lnbjsKICAgICAgaWYgKGV4cG9uZW50ID49IC0yMikgewogICAgICAgIGlmIChleHBvbmVudCA8IDApIHsKICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZU51bWJlcihzaWduZWRNYW50aXNzYSAvIFBPV0VSU19PRl9URU5bLWV4cG9uZW50XSk7CiAgICAgICAgICByZXR1cm4gcG9zaXRpb247CiAgICAgICAgfQogICAgICAgIGlmIChleHBvbmVudCA9PSAwKSB7CiAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVOdW1iZXIoc2lnbmVkTWFudGlzc2EpOwogICAgICAgICAgcmV0dXJuIHBvc2l0aW9uOwogICAgICAgIH0KICAgICAgICBpZiAoZXhwb25lbnQgPD0gMjIpIHsKICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZU51bWJlcihzaWduZWRNYW50aXNzYSAqIFBPV0VSU19PRl9URU5bZXhwb25lbnRdKTsKICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBvdXRzaWRlIHRoZSByYW5nZSArLy1tYXhFeGFjdERvdWJsZSBvcgogICAgLy8gZXhwb25lbnQgaXMgb3V0c2lkZSB0aGUgcmFuZ2UgKy8tMjIsIHRoZW4gd2UgY2FuJ3QgdHJ1c3Qgc2ltcGxlIGRvdWJsZQogICAgLy8gYXJpdGhtZXRpYyB0byBnZXQgdGhlIGV4YWN0IHJlc3VsdCwgc28gd2UgdXNlIHRoZSBzeXN0ZW0gZG91YmxlIHBhcnNpbmcuCiAgICBsaXN0ZW5lci5oYW5kbGVOdW1iZXIocGFyc2VEb3VibGUoc3RhcnQsIHBvc2l0aW9uKSk7CiAgICByZXR1cm4gcG9zaXRpb247CiAgfQoKICBmYWlsKGludCBwb3NpdGlvbiwgW1N0cmluZyBtZXNzYWdlXSkgewogICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewogICAgICBtZXNzYWdlID0gIlVuZXhwZWN0ZWQgY2hhcmFjdGVyIjsKICAgICAgaWYgKHBvc2l0aW9uID09IGNodW5rRW5kKSBtZXNzYWdlID0gIlVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IjsKICAgIH0KICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24obWVzc2FnZSwgY2h1bmssIHBvc2l0aW9uKTsKICB9Cn0KCi8qKgogKiBDaHVua2VkIEpTT04gcGFyc2VyIHRoYXQgcGFyc2VzIFtTdHJpbmddIGNodW5rcy4KICovCmNsYXNzIF9Kc29uU3RyaW5nUGFyc2VyIGV4dGVuZHMgX0NodW5rZWRKc29uUGFyc2VyPFN0cmluZz4gewogIFN0cmluZyBjaHVuazsKICBpbnQgY2h1bmtFbmQ7CgogIF9Kc29uU3RyaW5nUGFyc2VyKF9Kc29uTGlzdGVuZXIgbGlzdGVuZXIpIDogc3VwZXIobGlzdGVuZXIpOwoKICBpbnQgZ2V0Q2hhcihpbnQgcG9zaXRpb24pID0+IGNodW5rLmNvZGVVbml0QXQocG9zaXRpb24pOwoKICBTdHJpbmcgZ2V0U3RyaW5nKGludCBzdGFydCwgaW50IGVuZCwgaW50IGJpdHMpIHsKICAgIHJldHVybiBjaHVuay5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7CiAgfQoKICB2b2lkIGJlZ2luU3RyaW5nKCkgewogICAgdGhpcy5idWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgfQoKICB2b2lkIGFkZFNsaWNlVG9TdHJpbmcoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gdGhpcy5idWZmZXI7CiAgICBidWZmZXIud3JpdGUoY2h1bmsuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKTsKICB9CgogIHZvaWQgYWRkQ2hhclRvU3RyaW5nKGludCBjaGFyQ29kZSkgewogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyOwogICAgYnVmZmVyLndyaXRlQ2hhckNvZGUoY2hhckNvZGUpOwogIH0KCiAgU3RyaW5nIGVuZFN0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKICAgIHRoaXMuYnVmZmVyID0gbnVsbDsKICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9CgogIHZvaWQgY29weUNoYXJzVG9MaXN0KGludCBzdGFydCwgaW50IGVuZCwgTGlzdCB0YXJnZXQsIGludCBvZmZzZXQpIHsKICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgdGFyZ2V0W29mZnNldCArIGldID0gY2h1bmsuY29kZVVuaXRBdChzdGFydCArIGkpOwogICAgfQogIH0KCiAgZG91YmxlIHBhcnNlRG91YmxlKGludCBzdGFydCwgaW50IGVuZCkgewogICAgcmV0dXJuIF9wYXJzZURvdWJsZShjaHVuaywgc3RhcnQsIGVuZCk7CiAgfQp9CgpAcGF0Y2gKY2xhc3MgSnNvbkRlY29kZXIgewogIEBwYXRjaAogIFN0cmluZ0NvbnZlcnNpb25TaW5rIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxPYmplY3Q+IHNpbmspIHsKICAgIHJldHVybiBuZXcgX0pzb25TdHJpbmdEZWNvZGVyU2luayh0aGlzLl9yZXZpdmVyLCBzaW5rKTsKICB9Cn0KCi8qKgogKiBJbXBsZW1lbnRzIHRoZSBjaHVua2VkIGNvbnZlcnNpb24gZnJvbSBhIEpTT04gc3RyaW5nIHRvIGl0cyBjb3JyZXNwb25kaW5nCiAqIG9iamVjdC4KICoKICogVGhlIHNpbmsgb25seSBjcmVhdGVzIG9uZSBvYmplY3QsIGJ1dCBpdHMgaW5wdXQgY2FuIGJlIGNodW5rZWQuCiAqLwpjbGFzcyBfSnNvblN0cmluZ0RlY29kZXJTaW5rIGV4dGVuZHMgU3RyaW5nQ29udmVyc2lvblNpbmtCYXNlIHsKICBfSnNvblN0cmluZ1BhcnNlciBfcGFyc2VyOwogIGZpbmFsIEZ1bmN0aW9uKE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgX3Jldml2ZXI7CiAgZmluYWwgU2luazxPYmplY3Q+IF9zaW5rOwoKICBfSnNvblN0cmluZ0RlY29kZXJTaW5rKHRoaXMuX3Jldml2ZXIsIHRoaXMuX3NpbmspCiAgICAgIDogX3BhcnNlciA9IF9jcmVhdGVQYXJzZXIoX3Jldml2ZXIpOwoKICBzdGF0aWMgX0pzb25TdHJpbmdQYXJzZXIgX2NyZWF0ZVBhcnNlcihyZXZpdmVyKSB7CiAgICBfQnVpbGRKc29uTGlzdGVuZXIgbGlzdGVuZXI7CiAgICBpZiAocmV2aXZlciA9PSBudWxsKSB7CiAgICAgIGxpc3RlbmVyID0gbmV3IF9CdWlsZEpzb25MaXN0ZW5lcigpOwogICAgfSBlbHNlIHsKICAgICAgbGlzdGVuZXIgPSBuZXcgX1Jldml2ZXJKc29uTGlzdGVuZXIocmV2aXZlcik7CiAgICB9CiAgICByZXR1cm4gbmV3IF9Kc29uU3RyaW5nUGFyc2VyKGxpc3RlbmVyKTsKICB9CgogIHZvaWQgYWRkU2xpY2UoU3RyaW5nIGNodW5rLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICBfcGFyc2VyLmNodW5rID0gY2h1bms7CiAgICBfcGFyc2VyLmNodW5rRW5kID0gZW5kOwogICAgX3BhcnNlci5wYXJzZShzdGFydCk7CiAgICBpZiAoaXNMYXN0KSBfcGFyc2VyLmNsb3NlKCk7CiAgfQoKICB2b2lkIGFkZChTdHJpbmcgY2h1bmspIHsKICAgIGFkZFNsaWNlKGNodW5rLCAwLCBjaHVuay5sZW5ndGgsIGZhbHNlKTsKICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBfcGFyc2VyLmNsb3NlKCk7CiAgICB2YXIgZGVjb2RlZCA9IF9wYXJzZXIucmVzdWx0OwogICAgX3NpbmsuYWRkKGRlY29kZWQpOwogICAgX3NpbmsuY2xvc2UoKTsKICB9CgogIEJ5dGVDb252ZXJzaW9uU2luayBhc1V0ZjhTaW5rKGJvb2wgYWxsb3dNYWxmb3JtZWQpIHsKICAgIF9wYXJzZXIgPSBudWxsOwogICAgcmV0dXJuIG5ldyBfSnNvblV0ZjhEZWNvZGVyU2luayhfcmV2aXZlciwgX3NpbmssIGFsbG93TWFsZm9ybWVkKTsKICB9Cn0KCmNsYXNzIF9VdGY4U3RyaW5nQnVmZmVyIHsKICBzdGF0aWMgY29uc3QgaW50IElOSVRJQUxfQ0FQQUNJVFkgPSAzMjsKICAvLyBQYXJ0aWFsIHN0YXRlIGVuY29kaW5nLgogIHN0YXRpYyBjb25zdCBpbnQgTUFTS19UV09fQklUID0gMHgwMzsKICBzdGF0aWMgY29uc3QgaW50IE1BU0tfU0laRSA9IE1BU0tfVFdPX0JJVDsKICBzdGF0aWMgY29uc3QgaW50IFNISUZUX01JU1NJTkcgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgU0hJRlRfVkFMVUUgPSA0OwogIHN0YXRpYyBjb25zdCBpbnQgTk9fUEFSVElBTCA9IDA7CgogIC8vIFVURi04IGVuY29kaW5nIGFuZCBsaW1pdHMuCiAgc3RhdGljIGNvbnN0IGludCBNQVhfQVNDSUkgPSAxMjc7CiAgc3RhdGljIGNvbnN0IGludCBNQVhfVFdPX0JZVEUgPSAweDdmZjsKICBzdGF0aWMgY29uc3QgaW50IE1BWF9USFJFRV9CWVRFID0gMHhmZmZmOwogIHN0YXRpYyBjb25zdCBpbnQgTUFYX1VOSUNPREUgPSAwWDEwZmZmZjsKICBzdGF0aWMgY29uc3QgaW50IE1BU0tfVFdPX0JZVEUgPSAweDFmOwogIHN0YXRpYyBjb25zdCBpbnQgTUFTS19USFJFRV9CWVRFID0gMHgwZjsKICBzdGF0aWMgY29uc3QgaW50IE1BU0tfRk9VUl9CWVRFID0gMHgwNzsKICBzdGF0aWMgY29uc3QgaW50IE1BU0tfQ09OVElOVUVfVEFHID0gMHhDMDsKICBzdGF0aWMgY29uc3QgaW50IE1BU0tfQ09OVElOVUVfVkFMVUUgPSAweDNmOwogIHN0YXRpYyBjb25zdCBpbnQgQ09OVElOVUVfVEFHID0gMHg4MDsKCiAgLy8gVVRGLTE2IHN1cnJvZ2F0ZSBlbmNvZGluZy4KICBzdGF0aWMgY29uc3QgaW50IExFQURfU1VSUk9HQVRFID0gMHhEODAwOwogIHN0YXRpYyBjb25zdCBpbnQgVEFJTF9TVVJST0dBVEUgPSAweERDMDA7CiAgc3RhdGljIGNvbnN0IGludCBTSElGVF9ISUdIX1NVUlJPR0FURSA9IDEwOwogIHN0YXRpYyBjb25zdCBpbnQgTUFTS19MT1dfU1VSUk9HQVRFID0gMHgzZmY7CgogIC8vIFRoZSBpbnRlcm5hbCBidWZmZXIgc3RhcnRzIGFzIFVpbnQ4TGlzdCwgYnV0IG1heSBjaGFuZ2UgdG8gVWludDE2TGlzdAogIC8vIGlmIHRoZSBzdHJpbmcgY29udGFpbnMgbm9uLUxhdGluLTEgY2hhcmFjdGVycy4KICBMaXN0PGludD4gYnVmZmVyID0gbmV3IFVpbnQ4TGlzdChJTklUSUFMX0NBUEFDSVRZKTsKICAvLyBOdW1iZXIgb2YgZWxlbWVudHMgaW4gYnVmZmVyLgogIGludCBsZW5ndGggPSAwOwogIC8vIFBhcnRpYWwgZGVjb2Rpbmcgc3RhdGUsIGZvciBjYXNlcyB3aGVyZSBhbiBVVEYtOCBzZXF1ZW5jZXMgaXMgc3BsaXQKICAvLyBiZXR3ZWVuIGNodW5rcy4KICBpbnQgcGFydGlhbFN0YXRlID0gTk9fUEFSVElBTDsKICAvLyBXaGV0aGVyIGFsbCBjaGFyYWN0ZXJzIHNvIGZhciBoYXZlIGJlZW4gTGF0aW4tMSAoYW5kIHRoZSBidWZmZXIgaXMKICAvLyBzdGlsbCBhIFVpbnQ4TGlzdCkuIFNldCB0byBmYWxzZSB3aGVuIHRoZSBmaXJzdCBub24tTGF0aW4tMSBjaGFyYWN0ZXIKICAvLyBpcyBlbmNvdW50ZXJlZCwgYW5kIHRoZSBidWZmZXIgaXMgdGhlbiBhbHNvIGNvbnZlcnRlZCB0byBhIFVpbnQxNkxpc3QuCiAgYm9vbCBpc0xhdGluMSA9IHRydWU7CiAgLy8gSWYgYWxsb3dpbmcgbWFsZm9ybWVkLCBpbnZhbGlkIFVURi04IHNlcXVlbmNlcyBhcmUgY29udmVydGVkIHRvCiAgLy8gVStGRkZELgogIGJvb2wgYWxsb3dNYWxmb3JtZWQ7CgogIF9VdGY4U3RyaW5nQnVmZmVyKHRoaXMuYWxsb3dNYWxmb3JtZWQpOwoKICAvKioKICAgKiBQYXJzZSB0aGUgY29udGludWF0aW9uIG9mIGEgbXVsdGktYnl0ZSBVVEYtOCBzZXF1ZW5jZS4KICAgKgogICAqIFBhcnNlIFt1dGY4XSBmcm9tIFtwb3NpdGlvbl0gdG8gW2VuZF0uIElmIHRoZSBzZXF1ZW5jZSBleHRlbmRzIGJleW9uZAogICAqIGBlbmRgLCBzdG9yZSB0aGUgcGFydGlhbCBzdGF0ZSBpbiBbcGFydGlhbFN0YXRlXSwgYW5kIGNvbnRpbnVlIGZyb20gdGhlcmUKICAgKiBvbiB0aGUgbmV4dCBhZGRlZCBzbGljZS4KICAgKgogICAqIFRoZSBbc2l6ZV0gaXMgdGhlIG51bWJlciBvZiBleHBlY3RlZCBjb250aW51YXRpb24gYnl0ZXMgdG90YWwsCiAgICogYW5kIFttaXNzaW5nXSBpcyB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBjb250aW51YXRpb24gYnl0ZXMuCiAgICogVGhlIFtzaXplXSBpcyB1c2VkIHRvIGRldGVjdCBvdmVybG9uZyBlbmNvZGluZ3MuCiAgICogVGhlIFt2YWx1ZV0gaXMgdGhlIHZhbHVlIGNvbGxlY3RlZCBzbyBmYXIuCiAgICoKICAgKiBXaGVuIGNhbGxlZCBhZnRlciBzZWVpbmcgdGhlIGZpcnN0IG11bHRpLWJ5dGUgbWFya2VyLCB0aGUgW3NpemVdIGFuZAogICAqIFttaXNzaW5nXSB2YWx1ZXMgYXJlIGFsd2F5cyB0aGUgc2FtZSwgYnV0IHRoZXkgbWF5IGRpZmZlciBpZiBjb250aW51aW5nCiAgICogYWZ0ZXIgYSBwYXJ0aWFsIHNlcXVlbmNlLgogICAqLwogIGludCBhZGRDb250aW51YXRpb24oCiAgICAgIExpc3Q8aW50PiB1dGY4LCBpbnQgcG9zaXRpb24sIGludCBlbmQsIGludCBzaXplLCBpbnQgbWlzc2luZywgaW50IHZhbHVlKSB7CiAgICBpbnQgY29kZUVuZCA9IHBvc2l0aW9uICsgbWlzc2luZzsKICAgIGRvIHsKICAgICAgaWYgKHBvc2l0aW9uID09IGVuZCkgewogICAgICAgIG1pc3NpbmcgPSBjb2RlRW5kIC0gcG9zaXRpb247CiAgICAgICAgcGFydGlhbFN0YXRlID0KICAgICAgICAgICAgc2l6ZSB8IChtaXNzaW5nIDw8IFNISUZUX01JU1NJTkcpIHwgKHZhbHVlIDw8IFNISUZUX1ZBTFVFKTsKICAgICAgICByZXR1cm4gZW5kOwogICAgICB9CiAgICAgIGludCBjaGFyID0gdXRmOFtwb3NpdGlvbl07CiAgICAgIGlmICgoY2hhciAmIE1BU0tfQ09OVElOVUVfVEFHKSAhPSBDT05USU5VRV9UQUcpIHsKICAgICAgICBpZiAoYWxsb3dNYWxmb3JtZWQpIHsKICAgICAgICAgIGFkZENoYXJDb2RlKDB4RkZGRCk7CiAgICAgICAgICByZXR1cm4gcG9zaXRpb247CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAgICJFeHBlY3RlZCBVVEYtOCBjb250aW51YXRpb24gYnl0ZSwgIgogICAgICAgICAgICAiZm91bmQgJGNoYXIiLAogICAgICAgICAgICB1dGY4LAogICAgICAgICAgICBwb3NpdGlvbik7CiAgICAgIH0KICAgICAgdmFsdWUgPSA2NCAqIHZhbHVlICsgKGNoYXIgJiBNQVNLX0NPTlRJTlVFX1ZBTFVFKTsKICAgICAgcG9zaXRpb24rKzsKICAgIH0gd2hpbGUgKHBvc2l0aW9uIDwgY29kZUVuZCk7CiAgICBpZiAodmFsdWUgPD0gY29uc3QgWzAsIE1BWF9BU0NJSSwgTUFYX1RXT19CWVRFLCBNQVhfVEhSRUVfQllURV1bc2l6ZV0pIHsKICAgICAgLy8gT3Zlci1sb25nIGVuY29kaW5nLgogICAgICBpZiAoYWxsb3dNYWxmb3JtZWQpIHsKICAgICAgICB2YWx1ZSA9IDB4RkZGRDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICAgICAiSW52YWxpZCBlbmNvZGluZzogVSske3ZhbHVlLnRvUmFkaXhTdHJpbmcoMTYpLnBhZExlZnQoNCwgJzAnKX0iCiAgICAgICAgICAgICIgZW5jb2RlZCBpbiAke3NpemUgKyAxfSBieXRlcy4iLAogICAgICAgICAgICB1dGY4LAogICAgICAgICAgICBwb3NpdGlvbiAtIDEpOwogICAgICB9CiAgICB9CiAgICBhZGRDaGFyQ29kZSh2YWx1ZSk7CiAgICByZXR1cm4gcG9zaXRpb247CiAgfQoKICB2b2lkIGFkZENoYXJDb2RlKGludCBjaGFyKSB7CiAgICBhc3NlcnQoY2hhciA+PSAwKTsKICAgIGFzc2VydChjaGFyIDw9IE1BWF9VTklDT0RFKTsKICAgIGlmIChwYXJ0aWFsU3RhdGUgIT0gTk9fUEFSVElBTCkgewogICAgICBpZiAoYWxsb3dNYWxmb3JtZWQpIHsKICAgICAgICBwYXJ0aWFsU3RhdGUgPSBOT19QQVJUSUFMOwogICAgICAgIGFkZENoYXJDb2RlKDB4RkZGRCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiSW5jb21wbGV0ZSBVVEYtOCBzZXF1ZW5jZSIpOwogICAgICB9CiAgICB9CiAgICBpZiAoaXNMYXRpbjEgJiYgY2hhciA+IDB4ZmYpIHsKICAgICAgX3RvMTZCaXQoKTsgLy8gQWxzbyBncm93cyBhIGxpdHRsZSBpZiBjbG9zZSB0byBmdWxsLgogICAgfQogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgaWYgKGNoYXIgPD0gTUFYX1RIUkVFX0JZVEUpIHsKICAgICAgaWYgKGxlbmd0aCA9PSBidWZmZXIubGVuZ3RoKSBfZ3JvdygpOwogICAgICBidWZmZXJbbGVuZ3RoXSA9IGNoYXI7CiAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoICsgMTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGxlbmd0aCArIDIgPiBidWZmZXIubGVuZ3RoKSBfZ3JvdygpOwogICAgaW50IGJpdHMgPSBjaGFyIC0gMHgxMDAwMDsKICAgIGJ1ZmZlcltsZW5ndGhdID0gTEVBRF9TVVJST0dBVEUgfCAoYml0cyA+PiBTSElGVF9ISUdIX1NVUlJPR0FURSk7CiAgICBidWZmZXJbbGVuZ3RoICsgMV0gPSBUQUlMX1NVUlJPR0FURSB8IChiaXRzICYgTUFTS19MT1dfU1VSUk9HQVRFKTsKICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoICsgMjsKICB9CgogIHZvaWQgX3RvMTZCaXQoKSB7CiAgICBhc3NlcnQoaXNMYXRpbjEpOwogICAgVWludDE2TGlzdCBuZXdCdWZmZXI7CiAgICBpZiAoKGxlbmd0aCArIElOSVRJQUxfQ0FQQUNJVFkpICogMiA8PSBidWZmZXIubGVuZ3RoKSB7CiAgICAgIC8vIFJldXNlIGV4aXN0aW5nIGJ1ZmZlciBpZiBpdCdzIGJpZyBlbm91Z2guCiAgICAgIG5ld0J1ZmZlciA9IG5ldyBVaW50MTZMaXN0LnZpZXcoKGJ1ZmZlciBhcyBVaW50OExpc3QpLmJ1ZmZlcik7CiAgICB9IGVsc2UgewogICAgICBpbnQgbmV3Q2FwYWNpdHkgPSBidWZmZXIubGVuZ3RoOwogICAgICBpZiAobmV3Q2FwYWNpdHkgLSBsZW5ndGggPCBJTklUSUFMX0NBUEFDSVRZKSB7CiAgICAgICAgbmV3Q2FwYWNpdHkgPSBsZW5ndGggKyBJTklUSUFMX0NBUEFDSVRZOwogICAgICB9CiAgICAgIG5ld0J1ZmZlciA9IG5ldyBVaW50MTZMaXN0KG5ld0NhcGFjaXR5KTsKICAgIH0KICAgIG5ld0J1ZmZlci5zZXRSYW5nZSgwLCBsZW5ndGgsIGJ1ZmZlcik7CiAgICBidWZmZXIgPSBuZXdCdWZmZXI7CiAgICBpc0xhdGluMSA9IGZhbHNlOwogIH0KCiAgdm9pZCBfZ3JvdygpIHsKICAgIGludCBuZXdDYXBhY2l0eSA9IGJ1ZmZlci5sZW5ndGggKiAyOwogICAgTGlzdCBuZXdCdWZmZXI7CiAgICBpZiAoaXNMYXRpbjEpIHsKICAgICAgbmV3QnVmZmVyID0gbmV3IFVpbnQ4TGlzdChuZXdDYXBhY2l0eSk7CiAgICB9IGVsc2UgewogICAgICBuZXdCdWZmZXIgPSBuZXcgVWludDE2TGlzdChuZXdDYXBhY2l0eSk7CiAgICB9CiAgICBuZXdCdWZmZXIuc2V0UmFuZ2UoMCwgbGVuZ3RoLCBidWZmZXIpOwogICAgYnVmZmVyID0gbmV3QnVmZmVyOwogIH0KCiAgdm9pZCBhZGRTbGljZShMaXN0PGludD4gdXRmOCwgaW50IHBvc2l0aW9uLCBpbnQgZW5kKSB7CiAgICBhc3NlcnQocG9zaXRpb24gPCBlbmQpOwogICAgaWYgKHBhcnRpYWxTdGF0ZSA+IDApIHsKICAgICAgaW50IGNvbnRpbnVlQnl0ZUNvdW50ID0gKHBhcnRpYWxTdGF0ZSAmIE1BU0tfVFdPX0JJVCk7CiAgICAgIGludCBtaXNzaW5nID0gKHBhcnRpYWxTdGF0ZSA+PiBTSElGVF9NSVNTSU5HKSAmIE1BU0tfVFdPX0JJVDsKICAgICAgaW50IHZhbHVlID0gcGFydGlhbFN0YXRlID4+IFNISUZUX1ZBTFVFOwogICAgICBwYXJ0aWFsU3RhdGUgPSBOT19QQVJUSUFMOwogICAgICBwb3NpdGlvbiA9IGFkZENvbnRpbnVhdGlvbigKICAgICAgICAgIHV0ZjgsIHBvc2l0aW9uLCBlbmQsIGNvbnRpbnVlQnl0ZUNvdW50LCBtaXNzaW5nLCB2YWx1ZSk7CiAgICAgIGlmIChwb3NpdGlvbiA9PSBlbmQpIHJldHVybjsKICAgIH0KICAgIC8vIEtlZXAgaW5kZXggYW5kIGNhcGFjaXR5IGluIGxvY2FsIHZhcmlhYmxlcyB3aGlsZSBsb29waW5nIG92ZXIKICAgIC8vIEFTQ0lJIGNoYXJhY3RlcnMuCiAgICBpbnQgaW5kZXggPSBsZW5ndGg7CiAgICBpbnQgY2FwYWNpdHkgPSBidWZmZXIubGVuZ3RoOwogICAgd2hpbGUgKHBvc2l0aW9uIDwgZW5kKSB7CiAgICAgIGludCBjaGFyID0gdXRmOFtwb3NpdGlvbl07CiAgICAgIGlmIChjaGFyIDw9IE1BWF9BU0NJSSkgewogICAgICAgIGlmIChpbmRleCA9PSBjYXBhY2l0eSkgewogICAgICAgICAgbGVuZ3RoID0gaW5kZXg7CiAgICAgICAgICBfZ3JvdygpOwogICAgICAgICAgY2FwYWNpdHkgPSBidWZmZXIubGVuZ3RoOwogICAgICAgIH0KICAgICAgICBidWZmZXJbaW5kZXgrK10gPSBjaGFyOwogICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgbGVuZ3RoID0gaW5kZXg7CiAgICAgIGlmICgoY2hhciAmIE1BU0tfQ09OVElOVUVfVEFHKSA9PSBDT05USU5VRV9UQUcpIHsKICAgICAgICBpZiAoYWxsb3dNYWxmb3JtZWQpIHsKICAgICAgICAgIGFkZENoYXJDb2RlKDB4RkZGRCk7CiAgICAgICAgICBwb3NpdGlvbisrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICAgICAgICJVbmV4cGVjdGVkIFVURi04IGNvbnRpbnVhdGlvbiBieXRlIiwgdXRmOCwgcG9zaXRpb24pOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjaGFyIDwgMHhFMCkgewogICAgICAgIC8vIEMwLURGCiAgICAgICAgLy8gVHdvLWJ5dGUuCiAgICAgICAgcG9zaXRpb24gPSBhZGRDb250aW51YXRpb24oCiAgICAgICAgICAgIHV0ZjgsIHBvc2l0aW9uICsgMSwgZW5kLCAxLCAxLCBjaGFyICYgTUFTS19UV09fQllURSk7CiAgICAgIH0gZWxzZSBpZiAoY2hhciA8IDB4RjApIHsKICAgICAgICAvLyBFMC1FRgogICAgICAgIC8vIFRocmVlLWJ5dGUuCiAgICAgICAgcG9zaXRpb24gPSBhZGRDb250aW51YXRpb24oCiAgICAgICAgICAgIHV0ZjgsIHBvc2l0aW9uICsgMSwgZW5kLCAyLCAyLCBjaGFyICYgTUFTS19USFJFRV9CWVRFKTsKICAgICAgfSBlbHNlIGlmIChjaGFyIDwgMHhGOCkgewogICAgICAgIC8vIEYwLUY3CiAgICAgICAgLy8gRm91ci1ieXRlLgogICAgICAgIHBvc2l0aW9uID0gYWRkQ29udGludWF0aW9uKAogICAgICAgICAgICB1dGY4LCBwb3NpdGlvbiArIDEsIGVuZCwgMywgMywgY2hhciAmIE1BU0tfRk9VUl9CWVRFKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoYWxsb3dNYWxmb3JtZWQpIHsKICAgICAgICAgIGFkZENoYXJDb2RlKDB4RkZGRCk7CiAgICAgICAgICBwb3NpdGlvbisrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICAgICAgICJJbnZhbGlkIFVURi04IGJ5dGU6ICRjaGFyIiwgdXRmOCwgcG9zaXRpb24pOwogICAgICAgIH0KICAgICAgfQogICAgICBpbmRleCA9IGxlbmd0aDsKICAgICAgY2FwYWNpdHkgPSBidWZmZXIubGVuZ3RoOwogICAgfQogICAgbGVuZ3RoID0gaW5kZXg7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBpZiAocGFydGlhbFN0YXRlICE9IE5PX1BBUlRJQUwpIHsKICAgICAgaWYgKGFsbG93TWFsZm9ybWVkKSB7CiAgICAgICAgcGFydGlhbFN0YXRlID0gTk9fUEFSVElBTDsKICAgICAgICBhZGRDaGFyQ29kZSgweEZGRkQpOwogICAgICB9IGVsc2UgewogICAgICAgIGludCBjb250aW51ZUJ5dGVDb3VudCA9IChwYXJ0aWFsU3RhdGUgJiBNQVNLX1RXT19CSVQpOwogICAgICAgIGludCBtaXNzaW5nID0gKHBhcnRpYWxTdGF0ZSA+PiBTSElGVF9NSVNTSU5HKSAmIE1BU0tfVFdPX0JJVDsKICAgICAgICBpbnQgdmFsdWUgPSBwYXJ0aWFsU3RhdGUgPj4gU0hJRlRfVkFMVUU7CiAgICAgICAgaW50IHNlZW5CeXRlQ291bnQgPSBjb250aW51ZUJ5dGVDb3VudCAtIG1pc3NpbmcgKyAxOwogICAgICAgIExpc3Qgc291cmNlID0gbmV3IFVpbnQ4TGlzdChzZWVuQnl0ZUNvdW50KTsKICAgICAgICB3aGlsZSAoc2VlbkJ5dGVDb3VudCA+IDEpIHsKICAgICAgICAgIHNlZW5CeXRlQ291bnQtLTsKICAgICAgICAgIHNvdXJjZVtzZWVuQnl0ZUNvdW50XSA9IENPTlRJTlVFX1RBRyB8ICh2YWx1ZSAmIE1BU0tfQ09OVElOVUVfVkFMVUUpOwogICAgICAgICAgdmFsdWUgPj49IDY7CiAgICAgICAgfQogICAgICAgIHNvdXJjZVswXSA9IHZhbHVlIHwgKDB4M2MwID4+IChjb250aW51ZUJ5dGVDb3VudCAtIDEpKTsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICAgICAiSW5jb21wbGV0ZSBVVEYtOCBzZXF1ZW5jZSIsIHNvdXJjZSwgc291cmNlLmxlbmd0aCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoYnVmZmVyLCAwLCBsZW5ndGgpOwogIH0KfQoKLyoqCiAqIENodW5rZWQgSlNPTiBwYXJzZXIgdGhhdCBwYXJzZXMgVVRGLTggY2h1bmtzLgogKi8KY2xhc3MgX0pzb25VdGY4UGFyc2VyIGV4dGVuZHMgX0NodW5rZWRKc29uUGFyc2VyPExpc3Q8aW50Pj4gewogIGZpbmFsIGJvb2wgYWxsb3dNYWxmb3JtZWQ7CiAgTGlzdDxpbnQ+IGNodW5rOwogIGludCBjaHVua0VuZDsKCiAgX0pzb25VdGY4UGFyc2VyKF9Kc29uTGlzdGVuZXIgbGlzdGVuZXIsIHRoaXMuYWxsb3dNYWxmb3JtZWQpCiAgICAgIDogc3VwZXIobGlzdGVuZXIpIHsKICAgIC8vIFN0YXJ0cyBvdXQgY2hlY2tpbmcgZm9yIGFuIG9wdGlvbmFsIEJPTSAoS1dEX0JPTSwgY291bnQgPSAwKS4KICAgIHBhcnRpYWxTdGF0ZSA9CiAgICAgICAgX0NodW5rZWRKc29uUGFyc2VyLlBBUlRJQUxfS0VZV09SRCB8IF9DaHVua2VkSnNvblBhcnNlci5LV0RfQk9NOwogIH0KCiAgaW50IGdldENoYXIoaW50IHBvc2l0aW9uKSA9PiBjaHVua1twb3NpdGlvbl07CgogIFN0cmluZyBnZXRTdHJpbmcoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgYml0cykgewogICAgY29uc3QgaW50IG1heEFzY2lpQ2hhciA9IDB4N2Y7CiAgICBpZiAoYml0cyA8PSBtYXhBc2NpaUNoYXIpIHsKICAgICAgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhjaHVuaywgc3RhcnQsIGVuZCk7CiAgICB9CiAgICBiZWdpblN0cmluZygpOwogICAgaWYgKHN0YXJ0IDwgZW5kKSBhZGRTbGljZVRvU3RyaW5nKHN0YXJ0LCBlbmQpOwogICAgU3RyaW5nIHJlc3VsdCA9IGVuZFN0cmluZygpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgYmVnaW5TdHJpbmcoKSB7CiAgICB0aGlzLmJ1ZmZlciA9IG5ldyBfVXRmOFN0cmluZ0J1ZmZlcihhbGxvd01hbGZvcm1lZCk7CiAgfQoKICB2b2lkIGFkZFNsaWNlVG9TdHJpbmcoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBfVXRmOFN0cmluZ0J1ZmZlciBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKICAgIGJ1ZmZlci5hZGRTbGljZShjaHVuaywgc3RhcnQsIGVuZCk7CiAgfQoKICB2b2lkIGFkZENoYXJUb1N0cmluZyhpbnQgY2hhckNvZGUpIHsKICAgIF9VdGY4U3RyaW5nQnVmZmVyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyOwogICAgYnVmZmVyLmFkZENoYXJDb2RlKGNoYXJDb2RlKTsKICB9CgogIFN0cmluZyBlbmRTdHJpbmcoKSB7CiAgICBfVXRmOFN0cmluZ0J1ZmZlciBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKICAgIHRoaXMuYnVmZmVyID0gbnVsbDsKICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9CgogIHZvaWQgY29weUNoYXJzVG9MaXN0KGludCBzdGFydCwgaW50IGVuZCwgTGlzdCB0YXJnZXQsIGludCBvZmZzZXQpIHsKICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIHRhcmdldC5zZXRSYW5nZShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCwgY2h1bmssIHN0YXJ0KTsKICB9CgogIGRvdWJsZSBwYXJzZURvdWJsZShpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIFN0cmluZyBzdHJpbmcgPSBnZXRTdHJpbmcoc3RhcnQsIGVuZCwgMHg3Zik7CiAgICByZXR1cm4gX3BhcnNlRG91YmxlKHN0cmluZywgMCwgc3RyaW5nLmxlbmd0aCk7CiAgfQp9Cgpkb3VibGUgX3BhcnNlRG91YmxlKFN0cmluZyBzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCkgbmF0aXZlICJEb3VibGVfcGFyc2UiOwoKLyoqCiAqIEltcGxlbWVudHMgdGhlIGNodW5rZWQgY29udmVyc2lvbiBmcm9tIGEgVVRGLTggZW5jb2Rpbmcgb2YgSlNPTgogKiB0byBpdHMgY29ycmVzcG9uZGluZyBvYmplY3QuCiAqLwpjbGFzcyBfSnNvblV0ZjhEZWNvZGVyU2luayBleHRlbmRzIEJ5dGVDb252ZXJzaW9uU2lua0Jhc2UgewogIGZpbmFsIF9Kc29uVXRmOFBhcnNlciBfcGFyc2VyOwogIGZpbmFsIFNpbms8T2JqZWN0PiBfc2luazsKCiAgX0pzb25VdGY4RGVjb2RlclNpbmsocmV2aXZlciwgdGhpcy5fc2luaywgYm9vbCBhbGxvd01hbGZvcm1lZCkKICAgICAgOiBfcGFyc2VyID0gX2NyZWF0ZVBhcnNlcihyZXZpdmVyLCBhbGxvd01hbGZvcm1lZCk7CgogIHN0YXRpYyBfSnNvblV0ZjhQYXJzZXIgX2NyZWF0ZVBhcnNlcihyZXZpdmVyLCBib29sIGFsbG93TWFsZm9ybWVkKSB7CiAgICBfQnVpbGRKc29uTGlzdGVuZXIgbGlzdGVuZXI7CiAgICBpZiAocmV2aXZlciA9PSBudWxsKSB7CiAgICAgIGxpc3RlbmVyID0gbmV3IF9CdWlsZEpzb25MaXN0ZW5lcigpOwogICAgfSBlbHNlIHsKICAgICAgbGlzdGVuZXIgPSBuZXcgX1Jldml2ZXJKc29uTGlzdGVuZXIocmV2aXZlcik7CiAgICB9CiAgICByZXR1cm4gbmV3IF9Kc29uVXRmOFBhcnNlcihsaXN0ZW5lciwgYWxsb3dNYWxmb3JtZWQpOwogIH0KCiAgdm9pZCBhZGRTbGljZShMaXN0PGludD4gY2h1bmssIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIF9hZGRDaHVuayhjaHVuaywgc3RhcnQsIGVuZCk7CiAgICBpZiAoaXNMYXN0KSBjbG9zZSgpOwogIH0KCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGNodW5rKSB7CiAgICBfYWRkQ2h1bmsoY2h1bmssIDAsIGNodW5rLmxlbmd0aCk7CiAgfQoKICB2b2lkIF9hZGRDaHVuayhMaXN0PGludD4gY2h1bmssIGludCBzdGFydCwgaW50IGVuZCkgewogICAgX3BhcnNlci5jaHVuayA9IGNodW5rOwogICAgX3BhcnNlci5jaHVua0VuZCA9IGVuZDsKICAgIF9wYXJzZXIucGFyc2Uoc3RhcnQpOwogIH0KCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9wYXJzZXIuY2xvc2UoKTsKICAgIHZhciBkZWNvZGVkID0gX3BhcnNlci5yZXN1bHQ7CiAgICBfc2luay5hZGQoZGVjb2RlZCk7CiAgICBfc2luay5jbG9zZSgpOwogIH0KfQoKQHBhdGNoCmludCBfc2Nhbk9uZUJ5dGVDaGFyYWN0ZXJzKExpc3Q8aW50PiB1bml0cywgaW50IGZyb20sIGludCBlbmRJbmRleCkgewogIGZpbmFsIHRvID0gZW5kSW5kZXg7CgogIC8vIFNwZWNpYWwgY2FzZSBmb3IgX1VpbnQ4QXJyYXlWaWV3LgogIGlmICh1bml0cyBpcyBVaW50OExpc3QpIHsKICAgIGlmIChmcm9tID49IDAgJiYgdG8gPj0gMCAm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IGFjY2VzcyB0byB0aGUgbW9zdCBjb21tb24gQVNDSUkKLy8vIHVzZSBjYXNlcy4KLy8vCi8vLyBFeGFtcGxlczoKLy8vIGBgYGRhcnQKLy8vIHZhciBlbmNvZGVkID0gYXNjaWkuZW5jb2RlKCJUaGlzIGlzIEFTQ0lJISIpOwovLy8gdmFyIGRlY29kZWQgPSBhc2NpaS5kZWNvZGUoWzB4NTQsIDB4NjgsIDB4NjksIDB4NzMsIDB4MjAsIDB4NjksIDB4NzMsCi8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMCwgMHg0MSwgMHg1MywgMHg0MywgMHg0OSwgMHg0OSwgMHgyMV0pOwovLy8gYGBgCmNvbnN0IEFzY2lpQ29kZWMgYXNjaWkgPSBBc2NpaUNvZGVjKCk7Cgpjb25zdCBpbnQgX2FzY2lpTWFzayA9IDB4N0Y7CgovLy8gQW4gW0FzY2lpQ29kZWNdIGFsbG93cyBlbmNvZGluZyBzdHJpbmdzIGFzIEFTQ0lJIGJ5dGVzCi8vLyBhbmQgZGVjb2RpbmcgQVNDSUkgYnl0ZXMgdG8gc3RyaW5ncy4KY2xhc3MgQXNjaWlDb2RlYyBleHRlbmRzIEVuY29kaW5nIHsKICBmaW5hbCBib29sIF9hbGxvd0ludmFsaWQ7CgogIC8vLyBJbnN0YW50aWF0ZXMgYSBuZXcgW0FzY2lpQ29kZWNdLgogIC8vLwogIC8vLyBJZiBbYWxsb3dJbnZhbGlkXSBpcyB0cnVlLCB0aGUgW2RlY29kZV0gbWV0aG9kIGFuZCB0aGUgY29udmVydGVyCiAgLy8vIHJldHVybmVkIGJ5IFtkZWNvZGVyXSB3aWxsIGRlZmF1bHQgdG8gYWxsb3dpbmcgaW52YWxpZCB2YWx1ZXMuCiAgLy8vIElmIGFsbG93aW5nIGludmFsaWQgdmFsdWVzLCB0aGUgdmFsdWVzIHdpbGwgYmUgZGVjb2RlZCBpbnRvIHRoZSBVbmljb2RlCiAgLy8vIFJlcGxhY2VtZW50IGNoYXJhY3RlciAoVStGRkZEKS4gSWYgbm90LCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCiAgLy8vIENhbGxzIHRvIHRoZSBbZGVjb2RlXSBtZXRob2QgY2FuIGNob29zZSB0byBvdmVycmlkZSB0aGlzIGRlZmF1bHQuCiAgLy8vCiAgLy8vIEVuY29kZXJzIHdpbGwgbm90IGFjY2VwdCBpbnZhbGlkIChub24gQVNDSUkpIGNoYXJhY3RlcnMuCiAgY29uc3QgQXNjaWlDb2RlYyh7Ym9vbCBhbGxvd0ludmFsaWQgPSBmYWxzZX0pIDogX2FsbG93SW52YWxpZCA9IGFsbG93SW52YWxpZDsKCiAgLy8vIFRoZSBuYW1lIG9mIHRoaXMgY29kZWMsICJ1cy1hc2NpaSIuCiAgU3RyaW5nIGdldCBuYW1lID0+ICJ1cy1hc2NpaSI7CgogIFVpbnQ4TGlzdCBlbmNvZGUoU3RyaW5nIHNvdXJjZSkgPT4gZW5jb2Rlci5jb252ZXJ0KHNvdXJjZSk7CgogIC8vLyBEZWNvZGVzIHRoZSBBU0NJSSBbYnl0ZXNdIChhIGxpc3Qgb2YgdW5zaWduZWQgNy1iaXQgaW50ZWdlcnMpIHRvIHRoZQogIC8vLyBjb3JyZXNwb25kaW5nIHN0cmluZy4KICAvLy8KICAvLy8gSWYgW2J5dGVzXSBjb250YWlucyB2YWx1ZXMgdGhhdCBhcmUgbm90IGluIHRoZSByYW5nZSAwIC4uIDEyNywgdGhlIGRlY29kZXIKICAvLy8gd2lsbCBldmVudHVhbGx5IHRocm93IGEgW0Zvcm1hdEV4Y2VwdGlvbl0uCiAgLy8vCiAgLy8vIElmIFthbGxvd0ludmFsaWRdIGlzIG5vdCBwcm92aWRlZCwgaXQgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIHVzZWQgdG8gY3JlYXRlCiAgLy8vIHRoaXMgW0FzY2lpQ29kZWNdLgogIFN0cmluZyBkZWNvZGUoTGlzdDxpbnQ+IGJ5dGVzLCB7Ym9vbCBhbGxvd0ludmFsaWR9KSB7CiAgICBhbGxvd0ludmFsaWQgPz89IF9hbGxvd0ludmFsaWQ7CiAgICBpZiAoYWxsb3dJbnZhbGlkKSB7CiAgICAgIHJldHVybiBjb25zdCBBc2NpaURlY29kZXIoYWxsb3dJbnZhbGlkOiB0cnVlKS5jb252ZXJ0KGJ5dGVzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBjb25zdCBBc2NpaURlY29kZXIoYWxsb3dJbnZhbGlkOiBmYWxzZSkuY29udmVydChieXRlcyk7CiAgICB9CiAgfQoKICBBc2NpaUVuY29kZXIgZ2V0IGVuY29kZXIgPT4gY29uc3QgQXNjaWlFbmNvZGVyKCk7CgogIEFzY2lpRGVjb2RlciBnZXQgZGVjb2RlciA9PiBfYWxsb3dJbnZhbGlkCiAgICAgID8gY29uc3QgQXNjaWlEZWNvZGVyKGFsbG93SW52YWxpZDogdHJ1ZSkKICAgICAgOiBjb25zdCBBc2NpaURlY29kZXIoYWxsb3dJbnZhbGlkOiBmYWxzZSk7Cn0KCi8vIFN1cGVyY2xhc3MgZm9yIFtBc2NpaUVuY29kZXJdIGFuZCBbTGF0aW4xRW5jb2Rlcl0uCi8vIEdlbmVyYWxpemVzIGNvbW1vbiBvcGVyYXRpb25zIHRoYXQgb25seSBkaWZmZXIgYnkgYSBtYXNrOwpjbGFzcyBfVW5pY29kZVN1YnNldEVuY29kZXIgZXh0ZW5kcyBDb252ZXJ0ZXI8U3RyaW5nLCBMaXN0PGludD4+IHsKICBmaW5hbCBpbnQgX3N1YnNldE1hc2s7CgogIGNvbnN0IF9Vbmljb2RlU3Vic2V0RW5jb2Rlcih0aGlzLl9zdWJzZXRNYXNrKTsKCiAgLy8vIENvbnZlcnRzIHRoZSBbU3RyaW5nXSBpbnRvIGEgbGlzdCBvZiBpdHMgY29kZSB1bml0cy4KICAvLy8KICAvLy8gSWYgW3N0YXJ0XSBhbmQgW2VuZF0gYXJlIHByb3ZpZGVkLCBvbmx5IHRoZSBzdWJzdHJpbmcKICAvLy8gYHN0cmluZy5zdWJzdHJpbmcoc3RhcnQsIGVuZClgIGlzIHVzZWQgYXMgaW5wdXQgdG8gdGhlIGNvbnZlcnNpb24uCiAgVWludDhMaXN0IGNvbnZlcnQoU3RyaW5nIHN0cmluZywgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKSB7CiAgICB2YXIgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHN0cmluZ0xlbmd0aCk7CiAgICB2YXIgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICB2YXIgcmVzdWx0ID0gVWludDhMaXN0KGxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBjb2RlVW5pdCA9IHN0cmluZy5jb2RlVW5pdEF0KHN0YXJ0ICsgaSk7CiAgICAgIGlmICgoY29kZVVuaXQgJiB+X3N1YnNldE1hc2spICE9IDApIHsKICAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yLnZhbHVlKAogICAgICAgICAgICBzdHJpbmcsICJzdHJpbmciLCAiQ29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzLiIpOwogICAgICB9CiAgICAgIHJlc3VsdFtpXSA9IGNvZGVVbml0OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBTdGFydHMgYSBjaHVua2VkIGNvbnZlcnNpb24uCiAgLy8vCiAgLy8vIFRoZSBjb252ZXJ0ZXIgd29ya3MgbW9yZSBlZmZpY2llbnRseSBpZiB0aGUgZ2l2ZW4gW3NpbmtdIGlzIGEKICAvLy8gW0J5dGVDb252ZXJzaW9uU2lua10uCiAgU3RyaW5nQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPExpc3Q8aW50Pj4gc2luaykgewogICAgcmV0dXJuIF9Vbmljb2RlU3Vic2V0RW5jb2RlclNpbmsoX3N1YnNldE1hc2ssCiAgICAgICAgc2luayBpcyBCeXRlQ29udmVyc2lvblNpbmsgPyBzaW5rIDogQnl0ZUNvbnZlcnNpb25TaW5rLmZyb20oc2luaykpOwogIH0KCiAgLy8gT3ZlcnJpZGUgdGhlIGJhc2UtY2xhc3MnIGJpbmQsIHRvIHByb3ZpZGUgYSBiZXR0ZXIgdHlwZS4KICBTdHJlYW08TGlzdDxpbnQ+PiBiaW5kKFN0cmVhbTxTdHJpbmc+IHN0cmVhbSkgPT4gc3VwZXIuYmluZChzdHJlYW0pOwp9CgovLy8gVGhpcyBjbGFzcyBjb252ZXJ0cyBzdHJpbmdzIG9mIG9ubHkgQVNDSUkgY2hhcmFjdGVycyB0byBieXRlcy4KY2xhc3MgQXNjaWlFbmNvZGVyIGV4dGVuZHMgX1VuaWNvZGVTdWJzZXRFbmNvZGVyIHsKICBjb25zdCBBc2NpaUVuY29kZXIoKSA6IHN1cGVyKF9hc2NpaU1hc2spOwp9CgovLy8gVGhpcyBjbGFzcyBlbmNvZGVzIGNodW5rZWQgc3RyaW5ncyB0byBieXRlcyAodW5zaWduZWQgOC1iaXQKLy8vIGludGVnZXJzKS4KY2xhc3MgX1VuaWNvZGVTdWJzZXRFbmNvZGVyU2luayBleHRlbmRzIFN0cmluZ0NvbnZlcnNpb25TaW5rQmFzZSB7CiAgZmluYWwgQnl0ZUNvbnZlcnNpb25TaW5rIF9zaW5rOwogIGZpbmFsIGludCBfc3Vic2V0TWFzazsKCiAgX1VuaWNvZGVTdWJzZXRFbmNvZGVyU2luayh0aGlzLl9zdWJzZXRNYXNrLCB0aGlzLl9zaW5rKTsKCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQoKICB2b2lkIGFkZFNsaWNlKFN0cmluZyBzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHNvdXJjZS5sZW5ndGgpOwogICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgdmFyIGNvZGVVbml0ID0gc291cmNlLmNvZGVVbml0QXQoaSk7CiAgICAgIGlmICgoY29kZVVuaXQgJiB+X3N1YnNldE1hc2spICE9IDApIHsKICAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yKAogICAgICAgICAgICAiU291cmNlIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyIHdpdGggY29kZSBwb2ludDogJGNvZGVVbml0LiIpOwogICAgICB9CiAgICB9CiAgICBfc2luay5hZGQoc291cmNlLmNvZGVVbml0cy5zdWJsaXN0KHN0YXJ0LCBlbmQpKTsKICAgIGlmIChpc0xhc3QpIHsKICAgICAgY2xvc2UoKTsKICAgIH0KICB9Cn0KCi8vLyBUaGlzIGNsYXNzIGNvbnZlcnRzIExhdGluLTEgYnl0ZXMgKGxpc3RzIG9mIHVuc2lnbmVkIDgtYml0IGludGVnZXJzKQovLy8gdG8gYSBzdHJpbmcuCmFic3RyYWN0IGNsYXNzIF9Vbmljb2RlU3Vic2V0RGVjb2RlciBleHRlbmRzIENvbnZlcnRlcjxMaXN0PGludD4sIFN0cmluZz4gewogIGZpbmFsIGJvb2wgX2FsbG93SW52YWxpZDsKICBmaW5hbCBpbnQgX3N1YnNldE1hc2s7CgogIC8vLyBJbnN0YW50aWF0ZXMgYSBuZXcgZGVjb2Rlci4KICAvLy8KICAvLy8gVGhlIFtfYWxsb3dJbnZhbGlkXSBhcmd1bWVudCBkZWZpbmVzIGhvdyBbY29udmVydF0gZGVhbHMKICAvLy8gd2l0aCBpbnZhbGlkIGJ5dGVzLgogIC8vLwogIC8vLyBUaGUgW19zdWJzZXRNYXNrXSBhcmd1bWVudCBpcyBhIGJpdCBtYXNrIHVzZWQgdG8gZGVmaW5lIHRoZSBzdWJzZXQKICAvLy8gb2YgVW5pY29kZSBiZWluZyBkZWNvZGVkLiBVc2UgW19MQVRJTjFfTUFTS10gZm9yIExhdGluLTEgKDgtYml0KSBvcgogIC8vLyBbX2FzY2lpTWFza10gZm9yIEFTQ0lJICg3LWJpdCkuCiAgLy8vCiAgLy8vIElmIFtfYWxsb3dJbnZhbGlkXSBpcyBgdHJ1ZWAsIFtjb252ZXJ0XSByZXBsYWNlcyBpbnZhbGlkIGJ5dGVzIHdpdGggdGhlCiAgLy8vIFVuaWNvZGUgUmVwbGFjZW1lbnQgY2hhcmFjdGVyIGBVK0ZGRkRgICjvv70pLgogIC8vLyBPdGhlcndpc2UgaXQgdGhyb3dzIGEgW0Zvcm1hdEV4Y2VwdGlvbl0uCiAgY29uc3QgX1VuaWNvZGVTdWJzZXREZWNvZGVyKHRoaXMuX2FsbG93SW52YWxpZCwgdGhpcy5fc3Vic2V0TWFzayk7CgogIC8vLyBDb252ZXJ0cyB0aGUgW2J5dGVzXSAoYSBsaXN0IG9mIHVuc2lnbmVkIDctIG9yIDgtYml0IGludGVnZXJzKSB0byB0aGUKICAvLy8gY29ycmVzcG9uZGluZyBzdHJpbmcuCiAgLy8vCiAgLy8vIElmIFtzdGFydF0gYW5kIFtlbmRdIGFyZSBwcm92aWRlZCwgb25seSB0aGUgc3ViLWxpc3Qgb2YgYnl0ZXMgZnJvbQogIC8vLyBgc3RhcnRgIHRvIGBlbmRgIChgZW5kYCBub3QgaW5jbHVzaXZlKSBpcyB1c2VkIGFzIGlucHV0IHRvIHRoZSBjb252ZXJzaW9uLgogIFN0cmluZyBjb252ZXJ0KExpc3Q8aW50PiBieXRlcywgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKSB7CiAgICB2YXIgYnl0ZUNvdW50ID0gYnl0ZXMubGVuZ3RoOwogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgYnl0ZUNvdW50KTsKICAgIGVuZCA/Pz0gYnl0ZUNvdW50OwoKICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIHZhciBieXRlID0gYnl0ZXNbaV07CiAgICAgIGlmICgoYnl0ZSAmIH5fc3Vic2V0TWFzaykgIT0gMCkgewogICAgICAgIGlmICghX2FsbG93SW52YWxpZCkgewogICAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKCJJbnZhbGlkIHZhbHVlIGluIGlucHV0OiAkYnl0ZSIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX2NvbnZlcnRJbnZhbGlkKGJ5dGVzLCBzdGFydCwgZW5kKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGVzKGJ5dGVzLCBzdGFydCwgZW5kKTsKICB9CgogIFN0cmluZyBfY29udmVydEludmFsaWQoTGlzdDxpbnQ+IGJ5dGVzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIHZhciBidWZmZXIgPSBTdHJpbmdCdWZmZXIoKTsKICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIHZhciB2YWx1ZSA9IGJ5dGVzW2ldOwogICAgICBpZiAoKHZhbHVlICYgfl9zdWJzZXRNYXNrKSAhPSAwKSB2YWx1ZSA9IDB4RkZGRDsKICAgICAgYnVmZmVyLndyaXRlQ2hhckNvZGUodmFsdWUpOwogICAgfQogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgLy8vIFN0YXJ0cyBhIGNodW5rZWQgY29udmVyc2lvbi4KICAvLy8KICAvLy8gVGhlIGNvbnZlcnRlciB3b3JrcyBtb3JlIGVmZmljaWVudGx5IGlmIHRoZSBnaXZlbiBbc2lua10gaXMgYQogIC8vLyBbU3RyaW5nQ29udmVyc2lvblNpbmtdLgogIEJ5dGVDb252ZXJzaW9uU2luayBzdGFydENodW5rZWRDb252ZXJzaW9uKFNpbms8U3RyaW5nPiBzaW5rKTsKCiAgLy8gT3ZlcnJpZGUgdGhlIGJhc2UtY2xhc3MncyBiaW5kLCB0byBwcm92aWRlIGEgYmV0dGVyIHR5cGUuCiAgU3RyZWFtPFN0cmluZz4gYmluZChTdHJlYW08TGlzdDxpbnQ+PiBzdHJlYW0pID0+IHN1cGVyLmJpbmQoc3RyZWFtKTsKfQoKY2xhc3MgQXNjaWlEZWNvZGVyIGV4dGVuZHMgX1VuaWNvZGVTdWJzZXREZWNvZGVyIHsKICBjb25zdCBBc2NpaURlY29kZXIoe2Jvb2wgYWxsb3dJbnZhbGlkID0gZmFsc2V9KQogICAgICA6IHN1cGVyKGFsbG93SW52YWxpZCwgX2FzY2lpTWFzayk7CgogIC8vLyBTdGFydHMgYSBjaHVua2VkIGNvbnZlcnNpb24uCiAgLy8vCiAgLy8vIFRoZSBjb252ZXJ0ZXIgd29ya3MgbW9yZSBlZmZpY2llbnRseSBpZiB0aGUgZ2l2ZW4gW3NpbmtdIGlzIGEKICAvLy8gW1N0cmluZ0NvbnZlcnNpb25TaW5rXS4KICBCeXRlQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPFN0cmluZz4gc2luaykgewogICAgU3RyaW5nQ29udmVyc2lvblNpbmsgc3RyaW5nU2luazsKICAgIGlmIChzaW5rIGlzIFN0cmluZ0NvbnZlcnNpb25TaW5rKSB7CiAgICAgIHN0cmluZ1NpbmsgPSBzaW5rOwogICAgfSBlbHNlIHsKICAgICAgc3RyaW5nU2luayA9IFN0cmluZ0NvbnZlcnNpb25TaW5rLmZyb20oc2luayk7CiAgICB9CiAgICAvLyBUT0RPKGxybik6IFVzZSBhc1V0ZjE2U2luayB3aGVuIGl0IGJlY29tZXMgYXZhaWxhYmxlLiBJdAogICAgLy8gd29ya3MganVzdCBhcyB3ZWxsLCBpcyBsaWtlbHkgdG8gaGF2ZSBsZXNzIGRlY29kaW5nIG92ZXJoZWFkLAogICAgLy8gYW5kIG1ha2UgYWRkaW5nIFUrRkZGRCBlYXNpZXIuCiAgICAvLyBBdCB0aGF0IHRpbWUsIG1lcmdlIHRoaXMgd2l0aCBfTGF0aW4xRGVjb2RlclNpbms7CiAgICBpZiAoX2FsbG93SW52YWxpZCkgewogICAgICByZXR1cm4gX0Vycm9ySGFuZGxpbmdBc2NpaURlY29kZXJTaW5rKHN0cmluZ1NpbmsuYXNVdGY4U2luayhmYWxzZSkpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9TaW1wbGVBc2NpaURlY29kZXJTaW5rKHN0cmluZ1NpbmspOwogICAgfQogIH0KfQoKY2xhc3MgX0Vycm9ySGFuZGxpbmdBc2NpaURlY29kZXJTaW5rIGV4dGVuZHMgQnl0ZUNvbnZlcnNpb25TaW5rQmFzZSB7CiAgQnl0ZUNvbnZlcnNpb25TaW5rIF91dGY4U2luazsKICBfRXJyb3JIYW5kbGluZ0FzY2lpRGVjb2RlclNpbmsodGhpcy5fdXRmOFNpbmspOwoKICB2b2lkIGNsb3NlKCkgewogICAgX3V0ZjhTaW5rLmNsb3NlKCk7CiAgfQoKICB2b2lkIGFkZChMaXN0PGludD4gc291cmNlKSB7CiAgICBhZGRTbGljZShzb3VyY2UsIDAsIHNvdXJjZS5sZW5ndGgsIGZhbHNlKTsKICB9CgogIHZvaWQgYWRkU2xpY2UoTGlzdDxpbnQ+IHNvdXJjZSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGlzTGFzdCkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgc291cmNlLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICBpZiAoKHNvdXJjZVtpXSAmIH5fYXNjaWlNYXNrKSAhPSAwKSB7CiAgICAgICAgaWYgKGkgPiBzdGFydCkgX3V0ZjhTaW5rLmFkZFNsaWNlKHNvdXJjZSwgc3RhcnQsIGksIGZhbHNlKTsKICAgICAgICAvLyBBZGQgVVRGLTggZW5jb2Rpbmcgb2YgVStGRkZELgogICAgICAgIF91dGY4U2luay5hZGQoY29uc3QgPGludD5bMHhFRiwgMHhCRiwgMHhCRF0pOwogICAgICAgIHN0YXJ0ID0gaSArIDE7CiAgICAgIH0KICAgIH0KICAgIGlmIChzdGFydCA8IGVuZCkgewogICAgICBfdXRmOFNpbmsuYWRkU2xpY2Uoc291cmNlLCBzdGFydCwgZW5kLCBpc0xhc3QpOwogICAgfSBlbHNlIGlmIChpc0xhc3QpIHsKICAgICAgY2xvc2UoKTsKICAgIH0KICB9Cn0KCmNsYXNzIF9TaW1wbGVBc2NpaURlY29kZXJTaW5rIGV4dGVuZHMgQnl0ZUNvbnZlcnNpb25TaW5rQmFzZSB7CiAgU2luayBfc2luazsKICBfU2ltcGxlQXNjaWlEZWNvZGVyU2luayh0aGlzLl9zaW5rKTsKCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQoKICB2b2lkIGFkZChMaXN0PGludD4gc291cmNlKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykgewogICAgICBpZiAoKHNvdXJjZVtpXSAmIH5fYXNjaWlNYXNrKSAhPSAwKSB7CiAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKCJTb3VyY2UgY29udGFpbnMgbm9uLUFTQ0lJIGJ5dGVzLiIpOwogICAgICB9CiAgICB9CiAgICBfc2luay5hZGQoU3RyaW5nLmZyb21DaGFyQ29kZXMoc291cmNlKSk7CiAgfQoKICB2b2lkIGFkZFNsaWNlKExpc3Q8aW50PiBzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIGZpbmFsIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBsZW5ndGgpOwogICAgaWYgKHN0YXJ0IDwgZW5kKSB7CiAgICAgIGlmIChzdGFydCAhPSAwIHx8IGVuZCAhPSBsZW5ndGgpIHsKICAgICAgICBzb3VyY2UgPSBzb3VyY2Uuc3VibGlzdChzdGFydCwgZW5kKTsKICAgICAgfQogICAgICBhZGQoc291cmNlKTsKICAgIH0KICAgIGlmIChpc0xhc3QpIGNsb3NlKCk7CiAgfQp9CoEhAE5OPAEWAUMESA8EDgwySkwIJwEdATspJBwBJwZHRU5LSAY/UAEqIQE+AUscBlExBlEZOCQYRA1FBgQBNAEsLzECATY9QxkBMQE7BjxJPyZAHiQnMywjPwgcBhMEASMGRBxGMkwEAT5HAgFDMywCAUAPQyIZATsBERMEAUI7KCssHU4IBjUSDwYEAgFJEUwcGQEiBj8aBklKJgZOMi9FAUwcBklRPiI3FwEoGygeQgozCAY0BAFAISgcNyMGHgQBIwZEHkABP0cCATMyKQEjBkQeQSUoGQ00BkBFJjkZSw0yBgQCAUYgMgERFwQBHy8EAUU7KCxEKTYXCAYXNhkPBgQCAT8OJwEREwQBHy4sQwgGLQQBRSI0FyktCBMGGQQCARdkYXJ0OmNvbnZlcnQvYXNjaWkuZGFydC9vcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29udmVydC9iYXNlNjQuZGFydMAAet0vLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvbnZlcnQ7CgovLy8gQSBbYmFzZTY0XShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDY0OCkgZW5jb2RlciBhbmQgZGVjb2Rlci4KLy8vCi8vLyBJdCBlbmNvZGVzIHVzaW5nIHRoZSBkZWZhdWx0IGJhc2U2NCBhbHBoYWJldCwKLy8vIGRlY29kZXMgdXNpbmcgYm90aCB0aGUgYmFzZTY0IGFuZCBiYXNlNjR1cmwgYWxwaGFiZXRzLAovLy8gZG9lcyBub3QgYWxsb3cgaW52YWxpZCBjaGFyYWN0ZXJzIGFuZCByZXF1aXJlcyBwYWRkaW5nLgovLy8KLy8vIEV4YW1wbGVzOgovLy8KLy8vICAgICB2YXIgZW5jb2RlZCA9IGJhc2U2NC5lbmNvZGUoWzB4NjIsIDB4NmMsIDB4YzMsIDB4YTUsIDB4NjIsIDB4YzMsIDB4YTYsCi8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcyLCAweDY3LCAweDcyLCAweGMzLCAweGI4LCAweDY0XSk7Ci8vLyAgICAgdmFyIGRlY29kZWQgPSBiYXNlNjQuZGVjb2RlKCJZbXpEcFdMRHBuSm5jc080WkFvPSIpOwovLy8KLy8vIFRoZSB0b3AtbGV2ZWwgW2Jhc2U2NEVuY29kZV0gYW5kIFtiYXNlNjREZWNvZGVdIGZ1bmN0aW9ucyBtYXkgYmUgdXNlZAovLy8gaW5zdGVhZCBpZiBhIGxvY2FsIHZhcmlhYmxlIHNoYWRvd3MgdGhlIFtiYXNlNjRdIGNvbnN0YW50Lgpjb25zdCBCYXNlNjRDb2RlYyBiYXNlNjQgPSBCYXNlNjRDb2RlYygpOwoKLy8vIEEgW2Jhc2U2NHVybF0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ2NDgpIGVuY29kZXIgYW5kIGRlY29kZXIuCi8vLwovLy8gSXQgZW5jb2RlcyBhbmQgZGVjb2RlcyB1c2luZyB0aGUgYmFzZTY0dXJsIGFscGhhYmV0LAovLy8gZGVjb2RlcyB1c2luZyBib3RoIHRoZSBiYXNlNjQgYW5kIGJhc2U2NHVybCBhbHBoYWJldHMsCi8vLyBkb2VzIG5vdCBhbGxvdyBpbnZhbGlkIGNoYXJhY3RlcnMgYW5kIHJlcXVpcmVzIHBhZGRpbmcuCi8vLwovLy8gRXhhbXBsZXM6Ci8vLwovLy8gICAgIHZhciBlbmNvZGVkID0gYmFzZTY0VXJsLmVuY29kZShbMHg2MiwgMHg2YywgMHhjMywgMHhhNSwgMHg2MiwgMHhjMywgMHhhNiwKLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzIsIDB4NjcsIDB4NzIsIDB4YzMsIDB4YjgsIDB4NjRdKTsKLy8vICAgICB2YXIgZGVjb2RlZCA9IGJhc2U2NFVybC5kZWNvZGUoIlltekRwV0xEcG5KbmNzTzRaQW89Iik7CmNvbnN0IEJhc2U2NENvZGVjIGJhc2U2NFVybCA9IEJhc2U2NENvZGVjLnVybFNhZmUoKTsKCi8vLyBFbmNvZGVzIFtieXRlc10gdXNpbmcgW2Jhc2U2NF0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ2NDgpIGVuY29kaW5nLgovLy8KLy8vIFNob3J0aGFuZCBmb3IgW2Jhc2U2NC5lbmNvZGVdLiBVc2VmdWwgaWYgYSBsb2NhbCB2YXJpYWJsZSBzaGFkb3dzIHRoZSBnbG9iYWwKLy8vIFtiYXNlNjRdIGNvbnN0YW50LgpTdHJpbmcgYmFzZTY0RW5jb2RlKExpc3Q8aW50PiBieXRlcykgPT4gYmFzZTY0LmVuY29kZShieXRlcyk7CgovLy8gRW5jb2RlcyBbYnl0ZXNdIHVzaW5nIFtiYXNlNjR1cmxdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0NjQ4KSBlbmNvZGluZy4KLy8vCi8vLyBTaG9ydGhhbmQgZm9yIFtiYXNlNjR1cmwuZW5jb2RlXS4KU3RyaW5nIGJhc2U2NFVybEVuY29kZShMaXN0PGludD4gYnl0ZXMpID0+IGJhc2U2NFVybC5lbmNvZGUoYnl0ZXMpOwoKLy8vIERlY29kZXMgW2Jhc2U2NF0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ2NDgpIG9yIFtiYXNlNjR1cmxdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0NjQ4KSBlbmNvZGVkIGJ5dGVzLgovLy8KLy8vIFNob3J0aGFuZCBmb3IgW2Jhc2U2NC5kZWNvZGVdLiBVc2VmdWwgaWYgYSBsb2NhbCB2YXJpYWJsZSBzaGFkb3dzIHRoZQovLy8gZ2xvYmFsIFtiYXNlNjRdIGNvbnN0YW50LgpVaW50OExpc3QgYmFzZTY0RGVjb2RlKFN0cmluZyBzb3VyY2UpID0+IGJhc2U2NC5kZWNvZGUoc291cmNlKTsKCi8vIENvbnN0YW50cyB1c2VkIGluIG1vcmUgdGhhbiBvbmUgY2xhc3MuCmNvbnN0IGludCBfcGFkZGluZ0NoYXIgPSAweDNkOyAvLyAnPScuCgovLy8gQSBbYmFzZTY0XShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDY0OCkgZW5jb2RlciBhbmQgZGVjb2Rlci4KLy8vCi8vLyBBIFtCYXNlNjRDb2RlY10gYWxsb3dzIGJhc2U2NCBlbmNvZGluZyBieXRlcyBpbnRvIEFTQ0lJIHN0cmluZ3MgYW5kCi8vLyBkZWNvZGluZyB2YWxpZCBlbmNvZGluZ3MgYmFjayB0byBieXRlcy4KLy8vCi8vLyBUaGlzIGltcGxlbWVudGF0aW9uIG9ubHkgaGFuZGxlcyB0aGUgc2ltcGxlc3QgUkZDIDQ2NDggYmFzZTY0IGFuZCBiYXNlNjR1cmwKLy8vIGVuY29kaW5ncy4KLy8vIEl0IGRvZXMgbm90IGFsbG93IGludmFsaWQgY2hhcmFjdGVycyB3aGVuIGRlY29kaW5nIGFuZCBpdCByZXF1aXJlcywKLy8vIGFuZCBnZW5lcmF0ZXMsIHBhZGRpbmcgc28gdGhhdCB0aGUgaW5wdXQgaXMgYWx3YXlzIGEgbXVsdGlwbGUgb2YgZm91cgovLy8gY2hhcmFjdGVycy4KY2xhc3MgQmFzZTY0Q29kZWMgZXh0ZW5kcyBDb2RlYzxMaXN0PGludD4sIFN0cmluZz4gewogIGZpbmFsIEJhc2U2NEVuY29kZXIgX2VuY29kZXI7CiAgY29uc3QgQmFzZTY0Q29kZWMoKSA6IF9lbmNvZGVyID0gY29uc3QgQmFzZTY0RW5jb2RlcigpOwogIGNvbnN0IEJhc2U2NENvZGVjLnVybFNhZmUoKSA6IF9lbmNvZGVyID0gY29uc3QgQmFzZTY0RW5jb2Rlci51cmxTYWZlKCk7CgogIEJhc2U2NEVuY29kZXIgZ2V0IGVuY29kZXIgPT4gX2VuY29kZXI7CgogIEJhc2U2NERlY29kZXIgZ2V0IGRlY29kZXIgPT4gY29uc3QgQmFzZTY0RGVjb2RlcigpOwoKICAvLy8gRGVjb2RlcyBbZW5jb2RlZF0uCiAgLy8vCiAgLy8vIFRoZSBpbnB1dCBpcyBkZWNvZGVkIGFzIGlmIGJ5IGBkZWNvZGVyLmNvbnZlcnRgLgogIC8vLwogIC8vLyBUaGUgcmV0dXJuZWQgW1VpbnQ4TGlzdF0gY29udGFpbnMgZXhhY3RseSB0aGUgZGVjb2RlZCBieXRlcywKICAvLy8gc28gdGhlIFtVaW50OExpc3QubGVuZ3RoXSBpcyBwcmVjaXNlbHkgdGhlIG51bWJlciBvZiBkZWNvZGVkIGJ5dGVzLgogIC8vLyBUaGUgW1VpbnQ4TGlzdC5idWZmZXJdIG1heSBiZSBsYXJnZXIgdGhhbiB0aGUgZGVjb2RlZCBieXRlcy4KICBVaW50OExpc3QgZGVjb2RlKFN0cmluZyBlbmNvZGVkKSA9PiBkZWNvZGVyLmNvbnZlcnQoZW5jb2RlZCk7CgogIC8vLyBWYWxpZGF0ZXMgYW5kIG5vcm1hbGl6ZXMgdGhlIGJhc2U2NCBlbmNvZGVkIGRhdGEgaW4gW3NvdXJjZV0uCiAgLy8vCiAgLy8vIE9ubHkgYWN0cyBvbiB0aGUgc3Vic3RyaW5nIGZyb20gW3N0YXJ0XSB0byBbZW5kXSwgd2l0aCBbZW5kXQogIC8vLyBkZWZhdWx0aW5nIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KICAvLy8KICAvLy8gTm9ybWFsaXphdGlvbiB3aWxsOgogIC8vLyAqIFVuZXNjYXBlIGFueSBgJWAtZXNjYXBlcy4KICAvLy8gKiBPbmx5IGFsbG93IHZhbGlkIGNoYXJhY3RlcnMgKGBBYC1gWmAsIGBhYC1gemAsIGAwYC1gOWAsIGAvYCBhbmQgYCtgKS4KICAvLy8gKiBOb3JtYWxpemUgYSBgX2Agb3IgYC1gIGNoYXJhY3RlciB0byBgL2Agb3IgYCtgLgogIC8vLyAqIFZhbGlkYXRlIHRoYXQgZXhpc3RpbmcgcGFkZGluZyAodHJhaWxpbmcgYD1gIGNoYXJhY3RlcnMpIGlzIGNvcnJlY3QuCiAgLy8vICogSWYgbm8gcGFkZGluZyBleGlzdHMsIGFkZCBjb3JyZWN0IHBhZGRpbmcgaWYgbmVjZXNzYXJ5IGFuZCBwb3NzaWJsZS4KICAvLy8gKiBWYWxpZGF0ZSB0aGF0IHRoZSBsZW5ndGggaXMgY29ycmVjdCAoYSBtdWx0aXBsZSBvZiBmb3VyKS4KICBTdHJpbmcgbm9ybWFsaXplKFN0cmluZyBzb3VyY2UsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgc291cmNlLmxlbmd0aCk7CiAgICBjb25zdCBwZXJjZW50ID0gMHgyNTsKICAgIGNvbnN0IGVxdWFscyA9IDB4M2Q7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyOwogICAgdmFyIHNsaWNlU3RhcnQgPSBzdGFydDsKICAgIHZhciBhbHBoYWJldCA9IF9CYXNlNjRFbmNvZGVyLl9iYXNlNjRBbHBoYWJldDsKICAgIHZhciBpbnZlcnNlQWxwaGFiZXQgPSBfQmFzZTY0RGVjb2Rlci5faW52ZXJzZUFscGhhYmV0OwogICAgdmFyIGZpcnN0UGFkZGluZyA9IC0xOwogICAgdmFyIGZpcnN0UGFkZGluZ1NvdXJjZUluZGV4ID0gLTE7CiAgICB2YXIgcGFkZGluZ0NvdW50ID0gMDsKICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDspIHsKICAgICAgdmFyIHNsaWNlRW5kID0gaTsKICAgICAgdmFyIGNoYXIgPSBzb3VyY2UuY29kZVVuaXRBdChpKyspOwogICAgICB2YXIgb3JpZ2luYWxDaGFyID0gY2hhcjsKICAgICAgLy8gTm9ybWFsaXplIGNoYXIsIGtlZXAgb3JpZ2luYWxDaGFyIHRvIHNlZSBpZiBpdCBtYXRjaGVzIHRoZSBzb3VyY2UuCiAgICAgIGlmIChjaGFyID09IHBlcmNlbnQpIHsKICAgICAgICBpZiAoaSArIDIgPD0gZW5kKSB7CiAgICAgICAgICBjaGFyID0gcGFyc2VIZXhCeXRlKHNvdXJjZSwgaSk7IC8vIE1heSBiZSBuZWdhdGl2ZS4KICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgIC8vIFdlIGtub3cgdGhhdCAlMjUgaXNuJ3QgdmFsaWQsIGJ1dCBvdXIgdGFibGUgY29uc2lkZXJzIGl0CiAgICAgICAgICAvLyBhIHBvdGVudGlhbCBwYWRkaW5nIHN0YXJ0LCBzbyBza2lwIHRoZSBjaGVja3MuCiAgICAgICAgICBpZiAoY2hhciA9PSBwZXJjZW50KSBjaGFyID0gLTE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIEFuIGludmFsaWQgSEVYIGVzY2FwZSAodG9vIHNob3J0KS4KICAgICAgICAgIC8vIEp1c3Qgc2tpcCBwYXN0IHRoZSBoYW5kbGluZyBhbmQgcmVhY2ggdGhlIHRocm93IGJlbG93LgogICAgICAgICAgY2hhciA9IC0xOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBJZiBjaGFyIGlzIG5lZ2F0aXZlIGhlcmUsIGhleC1kZWNvZGluZyBmYWlsZWQgaW4gc29tZSB3YXkuCiAgICAgIGlmICgwIDw9IGNoYXIgJiYgY2hhciA8PSAxMjcpIHsKICAgICAgICB2YXIgdmFsdWUgPSBpbnZlcnNlQWxwaGFiZXRbY2hhcl07CiAgICAgICAgaWYgKHZhbHVlID49IDApIHsKICAgICAgICAgIGNoYXIgPSBhbHBoYWJldC5jb2RlVW5pdEF0KHZhbHVlKTsKICAgICAgICAgIGlmIChjaGFyID09IG9yaWdpbmFsQ2hhcikgY29udGludWU7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBfQmFzZTY0RGVjb2Rlci5fcGFkZGluZykgewogICAgICAgICAgLy8gV2UgaGF2ZSBydWxlZCBvdXQgcGVyY2VudCwgc28gY2hhciBpcyAnPScuCiAgICAgICAgICBpZiAoZmlyc3RQYWRkaW5nIDwgMCkgewogICAgICAgICAgICAvLyBNYXJrIHBvc2l0aW9uIGluIG5vcm1hbGl6ZWQgb3V0cHV0IHdoZXJlIHBhZGRpbmcgb2NjdXJzLgogICAgICAgICAgICBmaXJzdFBhZGRpbmcgPSAoYnVmZmVyPy5sZW5ndGggPz8gMCkgKyAoc2xpY2VFbmQgLSBzbGljZVN0YXJ0KTsKICAgICAgICAgICAgZmlyc3RQYWRkaW5nU291cmNlSW5kZXggPSBzbGljZUVuZDsKICAgICAgICAgIH0KICAgICAgICAgIHBhZGRpbmdDb3VudCsrOwogICAgICAgICAgLy8gSXQgY291bGQgaGF2ZSBiZWVuIGFuIGVzY2FwZWQgZXF1YWxzICglM0QpLgogICAgICAgICAgaWYgKG9yaWdpbmFsQ2hhciA9PSBlcXVhbHMpIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodmFsdWUgIT0gX0Jhc2U2NERlY29kZXIuX2ludmFsaWQpIHsKICAgICAgICAgIGJ1ZmZlciA/Pz0gU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgICBidWZmZXIud3JpdGUoc291cmNlLnN1YnN0cmluZyhzbGljZVN0YXJ0LCBzbGljZUVuZCkpOwogICAgICAgICAgYnVmZmVyLndyaXRlQ2hhckNvZGUoY2hhcik7CiAgICAgICAgICBzbGljZVN0YXJ0ID0gaTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfQogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgYmFzZTY0IGRhdGEiLCBzb3VyY2UsIHNsaWNlRW5kKTsKICAgIH0KICAgIGlmIChidWZmZXIgIT0gbnVsbCkgewogICAgICBidWZmZXIud3JpdGUoc291cmNlLnN1YnN0cmluZyhzbGljZVN0YXJ0LCBlbmQpKTsKICAgICAgaWYgKGZpcnN0UGFkZGluZyA+PSAwKSB7CiAgICAgICAgLy8gVGhlcmUgd2FzIHBhZGRpbmcgaW4gdGhlIHNvdXJjZS4gQ2hlY2sgdGhhdCBpdCBpcyB2YWxpZDoKICAgICAgICAvLyAqIHJlc3VsdCBsZW5ndGggYSBtdWx0aXBsZSBvZiBmb3VyCiAgICAgICAgLy8gKiBvbmUgb3IgdHdvIHBhZGRpbmcgY2hhcmFjdGVycyBhdCB0aGUgZW5kLgogICAgICAgIF9jaGVja1BhZGRpbmcoc291cmNlLCBmaXJzdFBhZGRpbmdTb3VyY2VJbmRleCwgZW5kLCBmaXJzdFBhZGRpbmcsCiAgICAgICAgICAgIHBhZGRpbmdDb3VudCwgYnVmZmVyLmxlbmd0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gTGVuZ3RoIG9mIGxhc3QgY2h1bmsgKDEtNCBjaGFycykgaW4gdGhlIGVuY29kaW5nLgogICAgICAgIHZhciBlbmRMZW5ndGggPSAoKGJ1ZmZlci5sZW5ndGggLSAxKSAlIDQpICsgMTsKICAgICAgICBpZiAoZW5kTGVuZ3RoID09IDEpIHsKICAgICAgICAgIC8vIFRoZSBkYXRhIG11c3QgaGF2ZSBsZW5ndGggMCwgMiBvciAzIG1vZHVsbyA0LgogICAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKCJJbnZhbGlkIGJhc2U2NCBlbmNvZGluZyBsZW5ndGggIiwgc291cmNlLCBlbmQpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoZW5kTGVuZ3RoIDwgNCkgewogICAgICAgICAgYnVmZmVyLndyaXRlKCI9Iik7CiAgICAgICAgICBlbmRMZW5ndGgrKzsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHNvdXJjZS5yZXBsYWNlUmFuZ2Uoc3RhcnQsIGVuZCwgYnVmZmVyLnRvU3RyaW5nKCkpOwogICAgfQogICAgLy8gT3JpZ2luYWwgd2FzIGFscmVhZHkgbm9ybWFsaXplZCwgb25seSBjaGVjayBwYWRkaW5nLgogICAgdmFyIGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKGZpcnN0UGFkZGluZyA+PSAwKSB7CiAgICAgIF9jaGVja1BhZGRpbmcoc291cmNlLCBmaXJzdFBhZGRpbmdTb3VyY2VJbmRleCwgZW5kLCBmaXJzdFBhZGRpbmcsCiAgICAgICAgICBwYWRkaW5nQ291bnQsIGxlbmd0aCk7CiAgICB9IGVsc2UgewogICAgICAvLyBObyBwYWRkaW5nIGdpdmVuLCBzbyBhZGQgc29tZSBpZiBuZWVkZWQgaXQuCiAgICAgIHZhciBlbmRMZW5ndGggPSBsZW5ndGggJSA0OwogICAgICBpZiAoZW5kTGVuZ3RoID09IDEpIHsKICAgICAgICAvLyBUaGUgZGF0YSBtdXN0IGhhdmUgbGVuZ3RoIDAsIDIgb3IgMyBtb2R1bG8gNC4KICAgICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgYmFzZTY0IGVuY29kaW5nIGxlbmd0aCAiLCBzb3VyY2UsIGVuZCk7CiAgICAgIH0KICAgICAgaWYgKGVuZExlbmd0aCA+IDEpIHsKICAgICAgICAvLyBUaGVyZSBpcyBubyAiaW5zZXJ0QXQiIG9uIFN0cmluZywgYnV0IHRoaXMgd29ya3MgYXMgd2VsbC4KICAgICAgICBzb3VyY2UgPSBzb3VyY2UucmVwbGFjZVJhbmdlKGVuZCwgZW5kLCAoZW5kTGVuZ3RoID09IDIpID8gIj09IiA6ICI9Iik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzb3VyY2U7CiAgfQoKICBzdGF0aWMgdm9pZCBfY2hlY2tQYWRkaW5nKFN0cmluZyBzb3VyY2UsIGludCBzb3VyY2VJbmRleCwgaW50IHNvdXJjZUVuZCwKICAgICAgaW50IGZpcnN0UGFkZGluZywgaW50IHBhZGRpbmdDb3VudCwgaW50IGxlbmd0aCkgewogICAgaWYgKGxlbmd0aCAlIDQgIT0gMCkgewogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAiSW52YWxpZCBiYXNlNjQgcGFkZGluZywgcGFkZGVkIGxlbmd0aCBtdXN0IGJlIG11bHRpcGxlIG9mIGZvdXIsICIKICAgICAgICAgICJpcyAkbGVuZ3RoIiwKICAgICAgICAgIHNvdXJjZSwKICAgICAgICAgIHNvdXJjZUVuZCk7CiAgICB9CiAgICBpZiAoZmlyc3RQYWRkaW5nICsgcGFkZGluZ0NvdW50ICE9IGxlbmd0aCkgewogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAiSW52YWxpZCBiYXNlNjQgcGFkZGluZywgJz0nIG5vdCBhdCB0aGUgZW5kIiwgc291cmNlLCBzb3VyY2VJbmRleCk7CiAgICB9CiAgICBpZiAocGFkZGluZ0NvdW50ID4gMikgewogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAiSW52YWxpZCBiYXNlNjQgcGFkZGluZywgbW9yZSB0aGFuIHR3byAnPScgY2hhcmFjdGVycyIsCiAgICAgICAgICBzb3VyY2UsCiAgICAgICAgICBzb3VyY2VJbmRleCk7CiAgICB9CiAgfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gRW5jb2RlcgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLyBCYXNlNjQgYW5kIGJhc2U2NHVybCBlbmNvZGluZyBjb252ZXJ0ZXIuCi8vLwovLy8gRW5jb2RlcyBsaXN0cyBvZiBieXRlcyB1c2luZyBiYXNlNjQgb3IgYmFzZTY0dXJsIGVuY29kaW5nLgovLy8KLy8vIFRoZSByZXN1bHRzIGFyZSBBU0NJSSBzdHJpbmdzIHVzaW5nIGEgcmVzdHJpY3RlZCBhbHBoYWJldC4KY2xhc3MgQmFzZTY0RW5jb2RlciBleHRlbmRzIENvbnZlcnRlcjxMaXN0PGludD4sIFN0cmluZz4gewogIGZpbmFsIGJvb2wgX3VybFNhZmU7CgogIGNvbnN0IEJhc2U2NEVuY29kZXIoKSA6IF91cmxTYWZlID0gZmFsc2U7CiAgY29uc3QgQmFzZTY0RW5jb2Rlci51cmxTYWZlKCkgOiBfdXJsU2FmZSA9IHRydWU7CgogIFN0cmluZyBjb252ZXJ0KExpc3Q8aW50PiBpbnB1dCkgewogICAgaWYgKGlucHV0LmlzRW1wdHkpIHJldHVybiAiIjsKICAgIHZhciBlbmNvZGVyID0gX0Jhc2U2NEVuY29kZXIoX3VybFNhZmUpOwogICAgdmFyIGJ1ZmZlciA9IGVuY29kZXIuZW5jb2RlKGlucHV0LCAwLCBpbnB1dC5sZW5ndGgsIHRydWUpOwogICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGVzKGJ1ZmZlcik7CiAgfQoKICBCeXRlQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPFN0cmluZz4gc2luaykgewogICAgaWYgKHNpbmsgaXMgU3RyaW5nQ29udmVyc2lvblNpbmspIHsKICAgICAgcmV0dXJuIF9VdGY4QmFzZTY0RW5jb2RlclNpbmsoc2luay5hc1V0ZjhTaW5rKGZhbHNlKSwgX3VybFNhZmUpOwogICAgfQogICAgcmV0dXJuIF9Bc2NpaUJhc2U2NEVuY29kZXJTaW5rKHNpbmssIF91cmxTYWZlKTsKICB9Cn0KCi8vLyBIZWxwZXIgY2xhc3MgZm9yIGVuY29kaW5nIGJ5dGVzIHRvIGJhc2U2NC4KY2xhc3MgX0Jhc2U2NEVuY29kZXIgewogIC8vLyBUaGUgUkZDIDQ2NDggYmFzZTY0IGVuY29kaW5nIGFscGhhYmV0LgogIHN0YXRpYyBjb25zdCBTdHJpbmcgX2Jhc2U2NEFscGhhYmV0ID0KICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwoKICAvLy8gVGhlIFJGQyA0NjQ4IGJhc2U2NHVybCBlbmNvZGluZyBhbHBoYWJldC4KICBzdGF0aWMgY29uc3QgU3RyaW5nIF9iYXNlNjRVcmxBbHBoYWJldCA9CiAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fIjsKCiAgLy8vIFNoaWZ0LWNvdW50IHRvIGV4dHJhY3QgdGhlIHZhbHVlcyBzdG9yZWQgaW4gW19zdGF0ZV0uCiAgc3RhdGljIGNvbnN0IGludCBfdmFsdWVTaGlmdCA9IDI7CgogIC8vLyBNYXNrIHRvIGV4dHJhY3QgdGhlIGNvdW50IHZhbHVlIHN0b3JlZCBpbiBbX3N0YXRlXS4KICBzdGF0aWMgY29uc3QgaW50IF9jb3VudE1hc2sgPSAzOwoKICBzdGF0aWMgY29uc3QgaW50IF9zaXhCaXRNYXNrID0gMHgzRjsKCiAgLy8vIEludGVybWVkaWF0ZSBzdGF0ZSBiZXR3ZWVuIGNodW5rcy4KICAvLy8KICAvLy8gRW5jb2RpbmcgaGFuZGxlcyB0aHJlZSBieXRlcyBhdCBhIHRpbWUuCiAgLy8vIElmIGZld2VyIHRoYW4gdGhyZWUgYnl0ZXMgaGFzIGJlZW4gc2VlbiwgdGhpcyB2YWx1ZSBlbmNvZGVzCiAgLy8vIHRoZSBudW1iZXIgb2YgYnl0ZXMgc2VlbiAoMCwgMSBvciAyKSBhbmQgdGhlaXIgdmFsdWVzLgogIGludCBfc3RhdGUgPSAwOwoKICAvLy8gQWxwaGFiZXQgdXNlZCBmb3IgZW5jb2RpbmcuCiAgZmluYWwgU3RyaW5nIF9hbHBoYWJldDsKCiAgX0Jhc2U2NEVuY29kZXIoYm9vbCB1cmxTYWZlKQogICAgICA6IF9hbHBoYWJldCA9IHVybFNhZmUgPyBfYmFzZTY0VXJsQWxwaGFiZXQgOiBfYmFzZTY0QWxwaGFiZXQ7CgogIC8vLyBFbmNvZGUgY291bnQgYW5kIGJpdHMgaW50byBhIHZhbHVlIHRvIGJlIHN0b3JlZCBpbiBbX3N0YXRlXS4KICBzdGF0aWMgaW50IF9lbmNvZGVTdGF0ZShpbnQgY291bnQsIGludCBiaXRzKSB7CiAgICBhc3NlcnQoY291bnQgPD0gX2NvdW50TWFzayk7CiAgICByZXR1cm4gYml0cyA8PCBfdmFsdWVTaGlmdCB8IGNvdW50OwogIH0KCiAgLy8vIEV4dHJhY3QgYml0cyBmcm9tIGVuY29kZWQgc3RhdGUuCiAgc3RhdGljIGludCBfc3RhdGVCaXRzKGludCBzdGF0ZSkgPT4gc3RhdGUgPj4gX3ZhbHVlU2hpZnQ7CgogIC8vLyBFeHRyYWN0IGNvdW50IGZyb20gZW5jb2RlZCBzdGF0ZS4KICBzdGF0aWMgaW50IF9zdGF0ZUNvdW50KGludCBzdGF0ZSkgPT4gc3RhdGUgJiBfY291bnRNYXNrOwoKICAvLy8gQ3JlYXRlIGEgW1VpbnQ4TGlzdF0gd2l0aCB0aGUgcHJvdmlkZWQgbGVuZ3RoLgogIFVpbnQ4TGlzdCBjcmVhdGVCdWZmZXIoaW50IGJ1ZmZlckxlbmd0aCkgPT4gVWludDhMaXN0KGJ1ZmZlckxlbmd0aCk7CgogIC8vLyBFbmNvZGUgW2J5dGVzXSBmcm9tIFtzdGFydF0gdG8gW2VuZF0gYW5kIHRoZSBiaXRzIGluIFtfc3RhdGVdLgogIC8vLwogIC8vLyBSZXR1cm5zIGEgW1VpbnQ4TGlzdF0gb2YgdGhlIEFTQ0lJIGNvZGVzIG9mIHRoZSBlbmNvZGVkIGRhdGEuCiAgLy8vCiAgLy8vIElmIHRoZSBpbnB1dCwgaW5jbHVkaW5nIGxlZnQgb3ZlciBbX3N0YXRlXSBmcm9tIGVhcmxpZXIgZW5jb2RpbmdzLAogIC8vLyBhcmUgbm90IGEgbXVsdGlwbGUgb2YgdGhyZWUgYnl0ZXMsIHRoZW4gdGhlIHBhcnRpYWwgc3RhdGUgaXMgc3RvcmVkCiAgLy8vIGJhY2sgaW50byBbX3N0YXRlXS4KICAvLy8gSWYgW2lzTGFzdF0gaXMgdHJ1ZSwgcGFydGlhbCBzdGF0ZSBpcyBlbmNvZGVkIGluIHRoZSBvdXRwdXQgaW5zdGVhZCwKICAvLy8gd2l0aCB0aGUgbmVjZXNzYXJ5IHBhZGRpbmcuCiAgLy8vCiAgLy8vIFJldHVybnMgYG51bGxgIGlmIHRoZXJlIGlzIG5vIG91dHB1dC4KICBVaW50OExpc3QgZW5jb2RlKExpc3Q8aW50PiBieXRlcywgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGlzTGFzdCkgewogICAgYXNzZXJ0KDAgPD0gc3RhcnQpOwogICAgYXNzZXJ0KHN0YXJ0IDw9IGVuZCk7CiAgICBhc3NlcnQoYnl0ZXMgPT0gbnVsbCB8fCBlbmQgPD0gYnl0ZXMubGVuZ3RoKTsKICAgIHZhciBsZW5ndGggPSBlbmQgLSBzdGFydDsKCiAgICB2YXIgY291bnQgPSBfc3RhdGVDb3VudChfc3RhdGUpOwogICAgdmFyIGJ5dGVDb3VudCA9IChjb3VudCArIGxlbmd0aCk7CiAgICB2YXIgZnVsbENodW5rcyA9IGJ5dGVDb3VudCB+LyAzOwogICAgdmFyIHBhcnRpYWxDaHVua0xlbmd0aCA9IGJ5dGVDb3VudCAtIGZ1bGxDaHVua3MgKiAzOwogICAgdmFyIGJ1ZmZlckxlbmd0aCA9IGZ1bGxDaHVua3MgKiA0OwogICAgaWYgKGlzTGFzdCAmJiBwYXJ0aWFsQ2h1bmtMZW5ndGggPiAwKSB7CiAgICAgIGJ1ZmZlckxlbmd0aCArPSA0OyAvLyBSb29tIGZvciBwYWRkaW5nLgogICAgfQogICAgdmFyIG91dHB1dCA9IGNyZWF0ZUJ1ZmZlcihidWZmZXJMZW5ndGgpOwogICAgX3N0YXRlID0KICAgICAgICBlbmNvZGVDaHVuayhfYWxwaGFiZXQsIGJ5dGVzLCBzdGFydCwgZW5kLCBpc0xhc3QsIG91dHB1dCwgMCwgX3N0YXRlKTsKICAgIGlmIChidWZmZXJMZW5ndGggPiAwKSByZXR1cm4gb3V0cHV0OwogICAgLy8gSWYgdGhlIGlucHV0IHBsdXMgdGhlIGRhdGEgaW4gc3RhdGUgaXMgc3RpbGwgbGVzcyB0aGFuIHRocmVlIGJ5dGVzLAogICAgLy8gdGhlcmUgbWF5IG5vdCBiZSBhbnkgb3V0cHV0LgogICAgcmV0dXJuIG51bGw7CiAgfQoKICBzdGF0aWMgaW50IGVuY29kZUNodW5rKFN0cmluZyBhbHBoYWJldCwgTGlzdDxpbnQ+IGJ5dGVzLCBpbnQgc3RhcnQsIGludCBlbmQsCiAgICAgIGJvb2wgaXNMYXN0LCBVaW50OExpc3Qgb3V0cHV0LCBpbnQgb3V0cHV0SW5kZXgsIGludCBzdGF0ZSkgewogICAgdmFyIGJpdHMgPSBfc3RhdGVCaXRzKHN0YXRlKTsKICAgIC8vIENvdW50IG51bWJlciBvZiBtaXNzaW5nIGJ5dGVzIGluIHRocmVlLWJ5dGUgY2h1bmsuCiAgICB2YXIgZXhwZWN0ZWRDaGFycyA9IDMgLSBfc3RhdGVDb3VudChzdGF0ZSk7CgogICAgLy8gVGhlIGlucHV0IG11c3QgYmUgYSBsaXN0IG9mIGJ5dGVzIChpbnRlZ2VycyBpbiB0aGUgcmFuZ2UgMC4uMjU1KS4KICAgIC8vIFRoZSB2YWx1ZSBvZiBgYnl0ZU9yYCB3aWxsIGJlIHRoZSBiaXR3aXNlIG9yIG9mIGFsbCB0aGUgdmFsdWVzIGluCiAgICAvLyBgYnl0ZXNgIGFuZCBhIGxhdGVyIGNoZWNrIHdpbGwgdmFsaWRhdGUgdGhhdCB0aGV5IHdlcmUgYWxsIHZhbGlkIGJ5dGVzLgogICAgdmFyIGJ5dGVPciA9IDA7CiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICB2YXIgYnl0ZSA9IGJ5dGVzW2ldOwogICAgICBieXRlT3IgfD0gYnl0ZTsKICAgICAgYml0cyA9ICgoYml0cyA8PCA4KSB8IGJ5dGUpICYgMHhGRkZGRkY7IC8vIE5ldmVyIHN0b3JlIG1vcmUgdGhhbiAyNCBiaXRzLgogICAgICBleHBlY3RlZENoYXJzLS07CiAgICAgIGlmIChleHBlY3RlZENoYXJzID09IDApIHsKICAgICAgICBvdXRwdXRbb3V0cHV0SW5kZXgrK10gPSBhbHBoYWJldC5jb2RlVW5pdEF0KChiaXRzID4+IDE4KSAmIF9zaXhCaXRNYXNrKTsKICAgICAgICBvdXRwdXRbb3V0cHV0SW5kZXgrK10gPSBhbHBoYWJldC5jb2RlVW5pdEF0KChiaXRzID4+IDEyKSAmIF9zaXhCaXRNYXNrKTsKICAgICAgICBvdXRwdXRbb3V0cHV0SW5kZXgrK10gPSBhbHBoYWJldC5jb2RlVW5pdEF0KChiaXRzID4+IDYpICYgX3NpeEJpdE1hc2spOwogICAgICAgIG91dHB1dFtvdXRwdXRJbmRleCsrXSA9IGFscGhhYmV0LmNvZGVVbml0QXQoYml0cyAmIF9zaXhCaXRNYXNrKTsKICAgICAgICBleHBlY3RlZENoYXJzID0gMzsKICAgICAgICBiaXRzID0gMDsKICAgICAgfQogICAgfQogICAgaWYgKGJ5dGVPciA+PSAwICYmIGJ5dGVPciA8PSAyNTUpIHsKICAgICAgaWYgKGlzTGFzdCAmJiBleHBlY3RlZENoYXJzIDwgMykgewogICAgICAgIHdyaXRlRmluYWxDaHVuayhhbHBoYWJldCwgb3V0cHV0LCBvdXRwdXRJbmRleCwgMyAtIGV4cGVjdGVkQ2hhcnMsIGJpdHMpOwogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIHJldHVybiBfZW5jb2RlU3RhdGUoMyAtIGV4cGVjdGVkQ2hhcnMsIGJpdHMpOwogICAgfQoKICAgIC8vIFRoZXJlIHdhcyBhbiBpbnZhbGlkIGJ5dGUgdmFsdWUgc29tZXdoZXJlIGluIHRoZSBpbnB1dCAtIGZpbmQgaXQhCiAgICB2YXIgaSA9IHN0YXJ0OwogICAgd2hpbGUgKGkgPCBlbmQpIHsKICAgICAgdmFyIGJ5dGUgPSBieXRlc1tpXTsKICAgICAgaWYgKGJ5dGUgPCAwIHx8IGJ5dGUgPiAyNTUpIGJyZWFrOwogICAgICBpKys7CiAgICB9CiAgICB0aHJvdyBBcmd1bWVudEVycm9yLnZhbHVlKAogICAgICAgIGJ5dGVzLCAiTm90IGEgYnl0ZSB2YWx1ZSBhdCBpbmRleCAkaTogMHgke2J5dGVzW2ldLnRvUmFkaXhTdHJpbmcoMTYpfSIpOwogIH0KCiAgLy8vIFdyaXRlcyBhIGZpbmFsIGVuY29kZWQgZm91ci1jaGFyYWN0ZXIgY2h1bmsuCiAgLy8vCiAgLy8vIE9ubHkgdXNlZCB3aGVuIHRoZSBbX3N0YXRlXSBjb250YWlucyBhIHBhcnRpYWwgKDEgb3IgMiBieXRlKQogIC8vLyBpbnB1dC4KICBzdGF0aWMgdm9pZCB3cml0ZUZpbmFsQ2h1bmsoCiAgICAgIFN0cmluZyBhbHBoYWJldCwgVWludDhMaXN0IG91dHB1dCwgaW50IG91dHB1dEluZGV4LCBpbnQgY291bnQsIGludCBiaXRzKSB7CiAgICBhc3NlcnQoY291bnQgPiAwKTsKICAgIGlmIChjb3VudCA9PSAxKSB7CiAgICAgIG91dHB1dFtvdXRwdXRJbmRleCsrXSA9IGFscGhhYmV0LmNvZGVVbml0QXQoKGJpdHMgPj4gMikgJiBfc2l4Qml0TWFzayk7CiAgICAgIG91dHB1dFtvdXRwdXRJbmRleCsrXSA9IGFscGhhYmV0LmNvZGVVbml0QXQoKGJpdHMgPDwgNCkgJiBfc2l4Qml0TWFzayk7CiAgICAgIG91dHB1dFtvdXRwdXRJbmRleCsrXSA9IF9wYWRkaW5nQ2hhcjsKICAgICAgb3V0cHV0W291dHB1dEluZGV4KytdID0gX3BhZGRpbmdDaGFyOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KGNvdW50ID09IDIpOwogICAgICBvdXRwdXRbb3V0cHV0SW5kZXgrK10gPSBhbHBoYWJldC5jb2RlVW5pdEF0KChiaXRzID4+IDEwKSAmIF9zaXhCaXRNYXNrKTsKICAgICAgb3V0cHV0W291dHB1dEluZGV4KytdID0gYWxwaGFiZXQuY29kZVVuaXRBdCgoYml0cyA+PiA0KSAmIF9zaXhCaXRNYXNrKTsKICAgICAgb3V0cHV0W291dHB1dEluZGV4KytdID0gYWxwaGFiZXQuY29kZVVuaXRBdCgoYml0cyA8PCAyKSAmIF9zaXhCaXRNYXNrKTsKICAgICAgb3V0cHV0W291dHB1dEluZGV4KytdID0gX3BhZGRpbmdDaGFyOwogICAgfQogIH0KfQoKY2xhc3MgX0J1ZmZlckNhY2hpbmdCYXNlNjRFbmNvZGVyIGV4dGVuZHMgX0Jhc2U2NEVuY29kZXIgewogIC8vLyBSZXVzZWQgYnVmZmVyLgogIC8vLwogIC8vLyBXaGVuIHRoZSBidWZmZXIgaXNuJ3QgcmVsZWFzZWQgdG8gdGhlIHNpbmssIG9ubHkgdXNlZCB0byBjcmVhdGUgYW5vdGhlcgogIC8vLyB2YWx1ZSAoYSBzdHJpbmcpLCB0aGUgYnVmZmVyIGNhbiBiZSByZXVzZWQgYmV0d2VlbiBjaHVua3MuCiAgVWludDhMaXN0IGJ1ZmZlckNhY2hlOwoKICBfQnVmZmVyQ2FjaGluZ0Jhc2U2NEVuY29kZXIoYm9vbCB1cmxTYWZlKSA6IHN1cGVyKHVybFNhZmUpOwoKICBVaW50OExpc3QgY3JlYXRlQnVmZmVyKGludCBidWZmZXJMZW5ndGgpIHsKICAgIGlmIChidWZmZXJDYWNoZSA9PSBudWxsIHx8IGJ1ZmZlckNhY2hlLmxlbmd0aCA8IGJ1ZmZlckxlbmd0aCkgewogICAgICBidWZmZXJDYWNoZSA9IFVpbnQ4TGlzdChidWZmZXJMZW5ndGgpOwogICAgfQogICAgLy8gUmV0dXJuIGEgdmlldyBvZiB0aGUgYnVmZmVyLCBzbyBpdCBoYXMgdGhlIHJlcXVlc3RlZCBsZW5ndGguCiAgICByZXR1cm4gVWludDhMaXN0LnZpZXcoYnVmZmVyQ2FjaGUuYnVmZmVyLCAwLCBidWZmZXJMZW5ndGgpOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgX0Jhc2U2NEVuY29kZXJTaW5rIGV4dGVuZHMgQnl0ZUNvbnZlcnNpb25TaW5rQmFzZSB7CiAgdm9pZCBhZGQoTGlzdDxpbnQ+IHNvdXJjZSkgewogICAgX2FkZChzb3VyY2UsIDAsIHNvdXJjZS5sZW5ndGgsIGZhbHNlKTsKICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBfYWRkKG51bGwsIDAsIDAsIHRydWUpOwogIH0KCiAgdm9pZCBhZGRTbGljZShMaXN0PGludD4gc291cmNlLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICBpZiAoZW5kID09IG51bGwpIHRocm93IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgiZW5kIik7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBzb3VyY2UubGVuZ3RoKTsKICAgIF9hZGQoc291cmNlLCBzdGFydCwgZW5kLCBpc0xhc3QpOwogIH0KCiAgdm9pZCBfYWRkKExpc3Q8aW50PiBzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpOwp9CgpjbGFzcyBfQXNjaWlCYXNlNjRFbmNvZGVyU2luayBleHRlbmRzIF9CYXNlNjRFbmNvZGVyU2luayB7CiAgZmluYWwgU2luazxTdHJpbmc+IF9zaW5rOwogIGZpbmFsIF9CYXNlNjRFbmNvZGVyIF9lbmNvZGVyOwoKICBfQXNjaWlCYXNlNjRFbmNvZGVyU2luayh0aGlzLl9zaW5rLCBib29sIHVybFNhZmUpCiAgICAgIDogX2VuY29kZXIgPSBfQnVmZmVyQ2FjaGluZ0Jhc2U2NEVuY29kZXIodXJsU2FmZSk7CgogIHZvaWQgX2FkZChMaXN0PGludD4gc291cmNlLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICB2YXIgYnVmZmVyID0gX2VuY29kZXIuZW5jb2RlKHNvdXJjZSwgc3RhcnQsIGVuZCwgaXNMYXN0KTsKICAgIGlmIChidWZmZXIgIT0gbnVsbCkgewogICAgICB2YXIgc3RyaW5nID0gU3RyaW5nLmZyb21DaGFyQ29kZXMoYnVmZmVyKTsKICAgICAgX3NpbmsuYWRkKHN0cmluZyk7CiAgICB9CiAgICBpZiAoaXNMYXN0KSB7CiAgICAgIF9zaW5rLmNsb3NlKCk7CiAgICB9CiAgfQp9CgpjbGFzcyBfVXRmOEJhc2U2NEVuY29kZXJTaW5rIGV4dGVuZHMgX0Jhc2U2NEVuY29kZXJTaW5rIHsKICBmaW5hbCBCeXRlQ29udmVyc2lvblNpbmsgX3Npbms7CiAgZmluYWwgX0Jhc2U2NEVuY29kZXIgX2VuY29kZXI7CgogIF9VdGY4QmFzZTY0RW5jb2RlclNpbmsodGhpcy5fc2luaywgYm9vbCB1cmxTYWZlKQogICAgICA6IF9lbmNvZGVyID0gX0Jhc2U2NEVuY29kZXIodXJsU2FmZSk7CgogIHZvaWQgX2FkZChMaXN0PGludD4gc291cmNlLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICB2YXIgYnVmZmVyID0gX2VuY29kZXIuZW5jb2RlKHNvdXJjZSwgc3RhcnQsIGVuZCwgaXNMYXN0KTsKICAgIGlmIChidWZmZXIgIT0gbnVsbCkgewogICAgICBfc2luay5hZGRTbGljZShidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIGlzTGFzdCk7CiAgICB9CiAgfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gRGVjb2RlcgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLyBEZWNvZGVyIGZvciBiYXNlNjQgZW5jb2RlZCBkYXRhLgovLy8KLy8vIFRoaXMgZGVjb2RlciBhY2NlcHRzIGJvdGggYmFzZTY0IGFuZCBiYXNlNjR1cmwgKCJ1cmwtc2FmZSIpIGVuY29kaW5ncy4KLy8vCi8vLyBUaGUgZW5jb2RpbmcgaXMgcmVxdWlyZWQgdG8gYmUgcHJvcGVybHkgcGFkZGVkLgpjbGFzcyBCYXNlNjREZWNvZGVyIGV4dGVuZHMgQ29udmVydGVyPFN0cmluZywgTGlzdDxpbnQ+PiB7CiAgY29uc3QgQmFzZTY0RGVjb2RlcigpOwoKICAvLy8gRGVjb2RlcyB0aGUgY2hhcmFjdGVycyBvZiBbaW5wdXRdIGZyb20gW3N0YXJ0XSB0byBbZW5kXSBhcyBiYXNlNjQuCiAgLy8vCiAgLy8vIElmIFtzdGFydF0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gdGhlIHN0YXJ0IG9mIFtpbnB1dF0uCiAgLy8vIElmIFtlbmRdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBlbmQgb2YgW2lucHV0XS4KICAvLy8KICAvLy8gVGhlIHJldHVybmVkIFtVaW50OExpc3RdIGNvbnRhaW5zIGV4YWN0bHkgdGhlIGRlY29kZWQgYnl0ZXMsCiAgLy8vIHNvIHRoZSBbVWludDhMaXN0Lmxlbmd0aF0gaXMgcHJlY2lzZWx5IHRoZSBudW1iZXIgb2YgZGVjb2RlZCBieXRlcy4KICAvLy8gVGhlIFtVaW50OExpc3QuYnVmZmVyXSBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIGRlY29kZWQgYnl0ZXMuCiAgVWludDhMaXN0IGNvbnZlcnQoU3RyaW5nIGlucHV0LCBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pIHsKICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIGlucHV0Lmxlbmd0aCk7CiAgICBpZiAoc3RhcnQgPT0gZW5kKSByZXR1cm4gVWludDhMaXN0KDApOwogICAgdmFyIGRlY29kZXIgPSBfQmFzZTY0RGVjb2RlcigpOwogICAgdmFyIGJ1ZmZlciA9IGRlY29kZXIuZGVjb2RlKGlucHV0LCBzdGFydCwgZW5kKTsKICAgIGRlY29kZXIuY2xvc2UoaW5wdXQsIGVuZCk7CiAgICByZXR1cm4gYnVmZmVyOwogIH0KCiAgU3RyaW5nQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPExpc3Q8aW50Pj4gc2luaykgewogICAgcmV0dXJuIF9CYXNlNjREZWNvZGVyU2luayhzaW5rKTsKICB9Cn0KCi8vLyBIZWxwZXIgY2xhc3MgaW1wbGVtZW50aW5nIGJhc2U2NCBkZWNvZGluZyB3aXRoIGludGVybWVkaWF0ZSBzdGF0ZS4KY2xhc3MgX0Jhc2U2NERlY29kZXIgewogIC8vLyBTaGlmdC1jb3VudCB0byBleHRyYWN0IHRoZSB2YWx1ZXMgc3RvcmVkIGluIFtfc3RhdGVdLgogIHN0YXRpYyBjb25zdCBpbnQgX3ZhbHVlU2hpZnQgPSAyOwoKICAvLy8gTWFzayB0byBleHRyYWN0IHRoZSBjb3VudCB2YWx1ZSBzdG9yZWQgaW4gW19zdGF0ZV0uCiAgc3RhdGljIGNvbnN0IGludCBfY291bnRNYXNrID0gMzsKCiAgLy8vIEludmFsaWQgY2hhcmFjdGVyIGluIGRlY29kaW5nIHRhYmxlLgogIHN0YXRpYyBjb25zdCBpbnQgX2ludmFsaWQgPSAtMjsKCiAgLy8vIFBhZGRpbmcgY2hhcmFjdGVyIGluIGRlY29kaW5nIHRhYmxlLgogIHN0YXRpYyBjb25zdCBpbnQgX3BhZGRpbmcgPSAtMTsKCiAgLy8gU2hvcnRoYW5kcyB0byBtYWtlIHRoZSB0YWJsZSBtb3JlIHJlYWRhYmxlLgogIHN0YXRpYyBjb25zdCBpbnQgX18gPSBfaW52YWxpZDsKICBzdGF0aWMgY29uc3QgaW50IF9wID0gX3BhZGRpbmc7CgogIC8vLyBNYXBwaW5nIGZyb20gQVNDSUkgY2hhcmFjdGVycyB0byB0aGVpciBpbmRleCBpbiB0aGUgYmFzZTY0IGFscGhhYmV0LgogIC8vLwogIC8vLyBVc2VzIFtfaW52YWxpZF0gZm9yIGludmFsaWQgaW5kaWNlcyBhbmQgW19wYWRkaW5nXSBmb3IgdGhlIHBhZGRpbmcKICAvLy8gY2hhcmFjdGVyLgogIC8vLwogIC8vLyBBY2NlcHRzIHRoZSAiVVJMLXNhZmUiIGFscGhhYmV0IGFzIHdlbGwgKGAtYCBhbmQgYF9gIGFyZSB0aGUKICAvLy8gNjJuZCBhbmQgNjNyZCBhbHBoYWJldCBjaGFyYWN0ZXJzKSwgYW5kIGNvbnNpZGVycyBgJWAgYSBwYWRkaW5nCiAgLy8vIGNoYXJhY3Rlciwgd2hpY2ggbXVzdCB0aGVuIGJlIGZvbGxvd2VkIGJ5IGAzRGAsIHRoZSBwZXJjZW50LWVzY2FwZQogIC8vLyBmb3IgYD1gLgogIHN0YXRpYyBmaW5hbCBMaXN0PGludD4gX2ludmVyc2VBbHBoYWJldCA9IEludDhMaXN0LmZyb21MaXN0KFsKICAgIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCAvLwogICAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIC8vCiAgICBfXywgX18sIF9fLCBfXywgX18sIF9wLCBfXywgX18sIF9fLCBfXywgX18sIDYyLCBfXywgNjIsIF9fLCA2MywgLy8KICAgIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCBfXywgX18sIF9fLCBfcCwgX18sIF9fLCAvLwogICAgX18sIDAwLCAwMSwgMDIsIDAzLCAwNCwgMDUsIDA2LCAwNywgMDgsIDA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIC8vCiAgICAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIF9fLCBfXywgX18sIF9fLCA2MywgLy8KICAgIF9fLCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCAvLwogICAgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCBfXywgX18sIF9fLCBfXywgX18sIC8vCiAgXSk7CgogIC8vIENoYXJhY3RlciBjb25zdGFudHMuCiAgc3RhdGljIGNvbnN0IGludCBfY2hhcl9wZXJjZW50ID0gMHgyNTsgLy8gJyUnLgogIHN0YXRpYyBjb25zdCBpbnQgX2NoYXJfMyA9IDB4MzM7IC8vICczJy4KICBzdGF0aWMgY29uc3QgaW50IF9jaGFyX2QgPSAweDY0OyAvLyAnZCcuCgogIC8vLyBNYWludGFpbnMgdGhlIGludGVybWVkaWF0ZSBzdGF0ZSBvZiBhIHBhcnRseS1kZWNvZGVkIGlucHV0LgogIC8vLwogIC8vLyBCYXNlNjQgaXMgZGVjb2RlZCBpbiBjaHVua3Mgb2YgZm91ciBjaGFyYWN0ZXJzLiBJZiBhIGNodW5rIGRvZXMgbm90CiAgLy8vIGNvbnRhaW4gYSBmdWxsIGJsb2NrLCB0aGUgZGVjb2RlZCBiaXRzIChzaXggcGVyIGNoYXJhY3Rlcikgb2YgdGhlCiAgLy8vIGF2YWlsYWJsZSBjaGFyYWN0ZXJzIGFyZSBzdG9yZWQgaW4gW19zdGF0ZV0gdW50aWwgdGhlIG5leHQgY2FsbCB0bwogIC8vLyBbX2RlY29kZV0gb3IgW19jbG9zZV0uCiAgLy8vCiAgLy8vIElmIG5vIHBhZGRpbmcgaGFzIGJlZW4gc2VlbiwgdGhlIHZhbHVlIGlzCiAgLy8vICAgYG51bWJlck9mQ2hhcmFjdGVyc1NlZW4gfCAoZGVjb2RlZEJpdHMgPDwgMilgCiAgLy8vIHdoZXJlIGBudW1iZXJPZkNoYXJhY3RlcnNTZWVuYCBpcyBiZXR3ZWVuIDAgYW5kIDMgYW5kIGRlY29kZWQgYml0cwogIC8vLyBjb250YWlucyBzaXggYml0cyBwZXIgc2VlbiBjaGFyYWN0ZXIuCiAgLy8vCiAgLy8vIElmIHBhZGRpbmcgaGFzIGJlZW4gc2VlbiB0aGUgdmFsdWUgaXMgbmVnYXRpdmUuIEl0J3MgdGhlIGJpdHdpc2UgbmVnYXRpb24KICAvLy8gb2YgdGhlIG51bWJlciBvZiByZW1haW5pbmcgYWxsb3dlZCBwYWRkaW5nIGNoYXJhY3RlcnMgKGFsd2F5cyB+MCBvciB+MSkuCiAgLy8vCiAgLy8vIEEgc3RhdGUgb2YgYDBgIG9yIGB+MGAgYXJlIHZhbGlkIHBsYWNlcyB0byBlbmQgZGVjb2RpbmcsIGFsbCBvdGhlciB2YWx1ZXMKICAvLy8gbWVhbiB0aGF0IGEgZm91ci1jaGFyYWN0ZXIgYmxvY2sgaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC4KICBpbnQgX3N0YXRlID0gMDsKCiAgLy8vIEVuY29kZXMgW2NvdW50XSBhbmQgW2JpdHNdIGFzIGEgdmFsdWUgdG8gYmUgc3RvcmVkIGluIFtfc3RhdGVdLgogIHN0YXRpYyBpbnQgX2VuY29kZUNoYXJhY3RlclN0YXRlKGludCBjb3VudCwgaW50IGJpdHMpIHsKICAgIGFzc2VydChjb3VudCA9PSAoY291bnQgJiBfY291bnRNYXNrKSk7CiAgICByZXR1cm4gKGJpdHMgPDwgX3ZhbHVlU2hpZnQgfCBjb3VudCk7CiAgfQoKICAvLy8gRXh0cmFjdHMgY291bnQgZnJvbSBhIFtfc3RhdGVdIHZhbHVlLgogIHN0YXRpYyBpbnQgX3N0YXRlQ291bnQoaW50IHN0YXRlKSB7CiAgICBhc3NlcnQoc3RhdGUgPj0gMCk7CiAgICByZXR1cm4gc3RhdGUgJiBfY291bnRNYXNrOwogIH0KCiAgLy8vIEV4dHJhY3RzIHZhbHVlIGJpdHMgZnJvbSBhIFtfc3RhdGVdIHZhbHVlLgogIHN0YXRpYyBpbnQgX3N0YXRlQml0cyhpbnQgc3RhdGUpIHsKICAgIGFzc2VydChzdGF0ZSA+PSAwKTsKICAgIHJldHVybiBzdGF0ZSA+PiBfdmFsdWVTaGlmdDsKICB9CgogIC8vLyBFbmNvZGVzIGEgbnVtYmVyIG9mIGV4cGVjdGVkIHBhZGRpbmcgY2hhcmFjdGVycyB0byBiZSBzdG9yZWQgaW4gW19zdGF0ZV0uCiAgc3RhdGljIGludCBfZW5jb2RlUGFkZGluZ1N0YXRlKGludCBleHBlY3RlZFBhZGRpbmcpIHsKICAgIGFzc2VydChleHBlY3RlZFBhZGRpbmcgPj0gMCk7CiAgICBhc3NlcnQoZXhwZWN0ZWRQYWRkaW5nIDw9IDUpOwogICAgcmV0dXJuIC1leHBlY3RlZFBhZGRpbmcgLSAxOyAvLyB+ZXhwZWN0ZWRQYWRkaW5nIGFkYXB0ZWQgdG8gZGFydDJqcy4KICB9CgogIC8vLyBFeHRyYWN0cyBleHBlY3RlZCBwYWRkaW5nIGNoYXJhY3RlciBjb3VudCBmcm9tIGEgW19zdGF0ZV0gdmFsdWUuCiAgc3RhdGljIGludCBfc3RhdGVQYWRkaW5nKGludCBzdGF0ZSkgewogICAgYXNzZXJ0KHN0YXRlIDwgMCk7CiAgICByZXR1cm4gLXN0YXRlIC0gMTsgLy8gfnN0YXRlIGFkYXB0ZWQgdG8gZGFydDJqcy4KICB9CgogIHN0YXRpYyBib29sIF9oYXNTZWVuUGFkZGluZyhpbnQgc3RhdGUpID0+IHN0YXRlIDwgMDsKCiAgLy8vIERlY29kZXMgW2lucHV0XSBmcm9tIFtzdGFydF0gdG8gW2VuZF0uCiAgLy8vCiAgLy8vIFJldHVybnMgYSBbVWludDhMaXN0XSB3aXRoIHRoZSBkZWNvZGVkIGJ5dGVzLgogIC8vLyBJZiBhIHByZXZpb3VzIGNhbGwgaGFkIGFuIGluY29tcGxldGUgZm91ci1jaGFyYWN0ZXIgYmxvY2ssIHRoZSBiaXRzIGZyb20KICAvLy8gdGhvc2UgYXJlIGluY2x1ZGVkIGluIGRlY29kaW5nCiAgVWludDhMaXN0IGRlY29kZShTdHJpbmcgaW5wdXQsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgYXNzZXJ0KDAgPD0gc3RhcnQpOwogICAgYXNzZXJ0KHN0YXJ0IDw9IGVuZCk7CiAgICBhc3NlcnQoZW5kIDw9IGlucHV0Lmxlbmd0aCk7CiAgICBpZiAoX2hhc1NlZW5QYWRkaW5nKF9zdGF0ZSkpIHsKICAgICAgX3N0YXRlID0gX2NoZWNrUGFkZGluZyhpbnB1dCwgc3RhcnQsIGVuZCwgX3N0YXRlKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoc3RhcnQgPT0gZW5kKSByZXR1cm4gVWludDhMaXN0KDApOwogICAgdmFyIGJ1ZmZlciA9IF9hbGxvY2F0ZUJ1ZmZlcihpbnB1dCwgc3RhcnQsIGVuZCwgX3N0YXRlKTsKICAgIF9zdGF0ZSA9IGRlY29kZUNodW5rKGlucHV0LCBzdGFydCwgZW5kLCBidWZmZXIsIDAsIF9zdGF0ZSk7CiAgICByZXR1cm4gYnVmZmVyOwogIH0KCiAgLy8vIENoZWNrcyB0aGF0IFtfc3RhdGVdIHJlcHJlc2VudHMgYSB2YWxpZCBkZWNvZGluZy4KICB2b2lkIGNsb3NlKFN0cmluZyBpbnB1dCwgaW50IGVuZCkgewogICAgaWYgKF9zdGF0ZSA8IF9lbmNvZGVQYWRkaW5nU3RhdGUoMCkpIHsKICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKCJNaXNzaW5nIHBhZGRpbmcgY2hhcmFjdGVyIiwgaW5wdXQsIGVuZCk7CiAgICB9CiAgICBpZiAoX3N0YXRlID4gMCkgewogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAiSW52YWxpZCBsZW5ndGgsIG11c3QgYmUgbXVsdGlwbGUgb2YgZm91ciIsIGlucHV0LCBlbmQpOwogICAgfQogICAgX3N0YXRlID0gX2VuY29kZVBhZGRpbmdTdGF0ZSgwKTsKICB9CgogIC8vLyBEZWNvZGVzIFtpbnB1dF0gZnJvbSBbc3RhcnRdIHRvIFtlbmRdLgogIC8vLwogIC8vLyBJbmNsdWRlcyB0aGUgc3RhdGUgcmV0dXJuZWQgYnkgYSBwcmV2aW91cyBjYWxsIGluIHRoZSBkZWNvZGluZy4KICAvLy8gV3JpdGVzIHRoZSBkZWNvZGluZyB0byBbb3V0cHV0XSBhdCBbb3V0SW5kZXhdLCBhbmQgdGhlcmUgbXVzdAogIC8vLyBiZSByb29tIGluIHRoZSBvdXRwdXQuCiAgc3RhdGljIGludCBkZWNvZGVDaHVuayhTdHJpbmcgaW5wdXQsIGludCBzdGFydCwgaW50IGVuZCwgVWludDhMaXN0IG91dHB1dCwKICAgICAgaW50IG91dEluZGV4LCBpbnQgc3RhdGUpIHsKICAgIGFzc2VydCghX2hhc1NlZW5QYWRkaW5nKHN0YXRlKSk7CiAgICBjb25zdCBhc2NpaU1hc2sgPSAxMjc7CiAgICBjb25zdCBhc2NpaU1heCA9IDEyNzsKICAgIGNvbnN0IGVpZ2h0Qml0TWFzayA9IDB4RkY7CiAgICBjb25zdCBiaXRzUGVyQ2hhcmFjdGVyID0gNjsKCiAgICB2YXIgYml0cyA9IF9zdGF0ZUJpdHMoc3RhdGUpOwogICAgdmFyIGNvdW50ID0gX3N0YXRlQ291bnQoc3RhdGUpOwogICAgLy8gU3RyaW5nIGNvbnRlbnRzIHNob3VsZCBiZSBhbGwgQVNDSUkuCiAgICAvLyBJbnN0ZWFkIG9mIGNoZWNraW5nIGZvciBlYWNoIGNoYXJhY3Rlciwgd2UgY29sbGVjdCB0aGUgYml0d2lzZS1vciBvZgogICAgLy8gYWxsIHRoZSBjaGFyYWN0ZXJzIGluIGBjaGFyT3JgIGFuZCBsYXRlciB2YWxpZGF0ZSB0aGF0IGFsbCBjaGFyYWN0ZXJzCiAgICAvLyB3ZXJlIEFTQ0lJLgogICAgdmFyIGNoYXJPciA9IDA7CiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICB2YXIgY2hhciA9IGlucHV0LmNvZGVVbml0QXQoaSk7CiAgICAgIGNoYXJPciB8PSBjaGFyOwogICAgICB2YXIgY29kZSA9IF9pbnZlcnNlQWxwaGFiZXRbY2hhciAmIGFzY2lpTWFza107CiAgICAgIGlmIChjb2RlID49IDApIHsKICAgICAgICBiaXRzID0gKChiaXRzIDw8IGJpdHNQZXJDaGFyYWN0ZXIpIHwgY29kZSkgJiAweEZGRkZGRjsKICAgICAgICBjb3VudCA9IChjb3VudCArIDEpICYgMzsKICAgICAgICBpZiAoY291bnQgPT0gMCkgewogICAgICAgICAgYXNzZXJ0KG91dEluZGV4ICsgMyA8PSBvdXRwdXQubGVuZ3RoKTsKICAgICAgICAgIG91dHB1dFtvdXRJbmRleCsrXSA9IChiaXRzID4+IDE2KSAmIGVpZ2h0Qml0TWFzazsKICAgICAgICAgIG91dHB1dFtvdXRJbmRleCsrXSA9IChiaXRzID4+IDgpICYgZWlnaHRCaXRNYXNrOwogICAgICAgICAgb3V0cHV0W291dEluZGV4KytdID0gYml0cyAmIGVpZ2h0Qml0TWFzazsKICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgIH0KICAgICAgICBjb250aW51ZTsKICAgICAgfSBlbHNlIGlmIChjb2RlID09IF9wYWRkaW5nICYmIGNvdW50ID4gMSkgewogICAgICAgIGlmIChjaGFyT3IgPCAwIHx8IGNoYXJPciA+IGFzY2lpTWF4KSBicmVhazsKICAgICAgICBpZiAoY291bnQgPT0gMykgewogICAgICAgICAgaWYgKChiaXRzICYgMHgwMykgIT0gMCkgewogICAgICAgICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgZW5jb2RpbmcgYmVmb3JlIHBhZGRpbmciLCBpbnB1dCwgaSk7CiAgICAgICAgICB9CiAgICAgICAgICBvdXRwdXRbb3V0SW5kZXgrK10gPSBiaXRzID4+IDEwOwogICAgICAgICAgb3V0cHV0W291dEluZGV4KytdID0gYml0cyA+PiAyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoKGJpdHMgJiAweDBGKSAhPSAwKSB7CiAgICAgICAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCBlbmNvZGluZyBiZWZvcmUgcGFkZGluZyIsIGlucHV0LCBpKTsKICAgICAgICAgIH0KICAgICAgICAgIG91dHB1dFtvdXRJbmRleCsrXSA9IGJpdHMgPj4gNDsKICAgICAgICB9CiAgICAgICAgLy8gRXhwZWN0ZWQgcGFkZGluZyBpcyB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIHBhZGRpbmcgY2hhcmFjdGVycywKICAgICAgICAvLyB3aGVyZSBgPWAgY291bnRzIGFzIHRocmVlIGFuZCBgJTNEYCBjb3VudHMgYXMgb25lIHBlciBjaGFyYWN0ZXIuCiAgICAgICAgLy8KICAgICAgICAvLyBFeHBlY3QgZWl0aGVyIHplcm8gb3Igb25lIHBhZGRpbmcgZGVwZW5kaW5nIG9uIGNvdW50ICgyIG9yIDMpLAogICAgICAgIC8vIHBsdXMgdHdvIG1vcmUgY2hhcmFjdGVycyBpZiB0aGUgY29kZSB3YXMgYCVgIChhIHBhcnRpYWwgcGFkZGluZykuCiAgICAgICAgdmFyIGV4cGVjdGVkUGFkZGluZyA9ICgzIC0gY291bnQpICogMzsKICAgICAgICBpZiAoY2hhciA9PSBfY2hhcl9wZXJjZW50KSBleHBlY3RlZFBhZGRpbmcgKz0gMjsKICAgICAgICBzdGF0ZSA9IF9lbmNvZGVQYWRkaW5nU3RhdGUoZXhwZWN0ZWRQYWRkaW5nKTsKICAgICAgICByZXR1cm4gX2NoZWNrUGFkZGluZyhpbnB1dCwgaSArIDEsIGVuZCwgc3RhdGUpOwogICAgICB9CiAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCBjaGFyYWN0ZXIiLCBpbnB1dCwgaSk7CiAgICB9CiAgICBpZiAoY2hhck9yID49IDAgJiYgY2hhck9yIDw9IGFzY2lpTWF4KSB7CiAgICAgIHJldHVybiBfZW5jb2RlQ2hhcmFjdGVyU3RhdGUoY291bnQsIGJpdHMpOwogICAgfQogICAgLy8gVGhlcmUgaXMgYW4gaW52YWxpZCAobm9uLUFTQ0lJKSBjaGFyYWN0ZXIgaW4gdGhlIGlucHV0LgogICAgaW50IGk7CiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIHZhciBjaGFyID0gaW5wdXQuY29kZVVuaXRBdChpKTsKICAgICAgaWYgKGNoYXIgPCAwIHx8IGNoYXIgPiBhc2NpaU1heCkgYnJlYWs7CiAgICB9CiAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgY2hhcmFjdGVyIiwgaW5wdXQsIGkpOwogIH0KCiAgLy8vIEFsbG9jYXRlcyBhIGJ1ZmZlciB3aXRoIHJvb20gZm9yIHRoZSBkZWNvZGluZyBvZiBhIHN1YnN0cmluZyBvZiBbaW5wdXRdLgogIC8vLwogIC8vLyBJbmNsdWRlcyByb29tIGZvciB0aGUgY2hhcmFjdGVycyBpbiBbc3RhdGVdLCBhbmQgaGFuZGxlcyBwYWRkaW5nIGNvcnJlY3RseS4KICBzdGF0aWMgVWludDhMaXN0IF9hbGxvY2F0ZUJ1ZmZlcigKICAgICAgU3RyaW5nIGlucHV0LCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBzdGF0ZSkgewogICAgYXNzZXJ0KHN0YXRlID49IDApOwogICAgdmFyIHBhZGRpbmdTdGFydCA9IF90cmltUGFkZGluZ0NoYXJzKGlucHV0LCBzdGFydCwgZW5kKTsKICAgIHZhciBsZW5ndGggPSBfc3RhdGVDb3VudChzdGF0ZSkgKyAocGFkZGluZ1N0YXJ0IC0gc3RhcnQpOwogICAgLy8gVGhyZWUgYnl0ZXMgcGVyIGZ1bGwgZm91ciBieXRlcyBpbiB0aGUgaW5wdXQuCiAgICB2YXIgYnVmZmVyTGVuZ3RoID0gKGxlbmd0aCA+PiAyKSAqIDM7CiAgICAvLyBJZiBwYWRkaW5nIHdhcyBzZWVuLCB0aGVuIHRoaXMgaXMgdGhlIGxhc3QgY2h1bmssIGFuZCB0aGUgZmluYWwgcGFydGlhbAogICAgLy8gY2h1bmsgc2hvdWxkIGJlIGRlY29kZWQgdG9vLgogICAgdmFyIHJlbWFpbmRlckxlbmd0aCA9IGxlbmd0aCAmIDM7CiAgICBpZiAocmVtYWluZGVyTGVuZ3RoICE9IDAgJiYgcGFkZGluZ1N0YXJ0IDwgZW5kKSB7CiAgICAgIGJ1ZmZlckxlbmd0aCArPSByZW1haW5kZXJMZW5ndGggLSAxOwogICAgfQogICAgaWYgKGJ1ZmZlckxlbmd0aCA+IDApIHJldHVybiBVaW50OExpc3QoYnVmZmVyTGVuZ3RoKTsKICAgIC8vIElmIHRoZSBpbnB1dCBwbHVzIHN0YXRlIGlzIGxlc3MgdGhhbiBmb3VyIGNoYXJhY3RlcnMsIGFuZCBpdCdzIG5vdAogICAgLy8gYXQgdGhlIGVuZCBvZiBpbnB1dCwgbm8gYnVmZmVyIGlzIG5lZWRlZC4KICAgIHJldHVybiBudWxsOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBzdGFydCBvZiBwYWRkaW5nIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0LgogIC8vLwogIC8vLyBSZXR1cm5zIHRoZSBlbmQgb2YgaW5wdXQgaWYgdGhlcmUgaXMgbm8gcGFkZGluZy4KICAvLy8KICAvLy8gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHRoZSBkZWNvZGluZyBidWZmZXIgaGFzIHRoZSBleGFjdCBzaXplCiAgLy8vIGl0IG5lZWRzIHdoZW4gaW5wdXQgaXMgdmFsaWQsIGFuZCBhdCBsZWFzdCBlbm91Z2ggYnl0ZXMgdG8gcmVhY2ggdGhlIGVycm9yCiAgLy8vIHdoZW4gaW5wdXQgaXMgaW52YWxpZC4KICAvLy8KICAvLy8gTmV2ZXIgY291bnQgbW9yZSB0aGFuIHR3byBwYWRkaW5nIHNlcXVlbmNlcyBzaW5jZSBhbnkgbW9yZSB0aGFuIHRoYXQKICAvLy8gd2lsbCByYWlzZSBhbiBlcnJvciBhbnl3YXksIGFuZCB3ZSBvbmx5IGNhcmUgYWJvdXQgYmVpbmcgcHJlY2lzZSBmb3IKICAvLy8gc3VjY2Vzc2Z1bCBjb252ZXJzaW9ucy4KICBzdGF0aWMgaW50IF90cmltUGFkZGluZ0NoYXJzKFN0cmluZyBpbnB1dCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICAvLyBUaGlzIG1heSBjb3VudCAnJT0nIGFzIHR3byBwYWRkaW5ncy4gVGhhdCdzIG9rLCBpdCB3aWxsIGVyciBsYXRlciwKICAgIC8vIGJ1dCB0aGUgYnVmZmVyIHdpbGwgYmUgbGFyZ2UgZW5vdWdoIHRvIHJlYWNoIHRoZSBlcnJvci4KICAgIHZhciBwYWRkaW5nID0gMDsKICAgIHZhciBpbmRleCA9IGVuZDsKICAgIHZhciBuZXdFbmQgPSBlbmQ7CiAgICB3aGlsZSAoaW5kZXggPiBzdGFydCAmJiBwYWRkaW5nIDwgMikgewogICAgICBpbmRleC0tOwogICAgICB2YXIgY2hhciA9IGlucHV0LmNvZGVVbml0QXQoaW5kZXgpOwogICAgICBpZiAoY2hhciA9PSBfcGFkZGluZ0NoYXIpIHsKICAgICAgICBwYWRkaW5nKys7CiAgICAgICAgbmV3RW5kID0gaW5kZXg7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKChjaGFyIHwgMHgyMCkgPT0gX2NoYXJfZCkgewogICAgICAgIGlmIChpbmRleCA9PSBzdGFydCkgYnJlYWs7CiAgICAgICAgaW5kZXgtLTsKICAgICAgICBjaGFyID0gaW5wdXQuY29kZVVuaXRBdChpbmRleCk7CiAgICAgIH0KICAgICAgaWYgKGNoYXIgPT0gX2NoYXJfMykgewogICAgICAgIGlmIChpbmRleCA9PSBzdGFydCkgYnJlYWs7CiAgICAgICAgaW5kZXgtLTsKICAgICAgICBjaGFyID0gaW5wdXQuY29kZVVuaXRBdChpbmRleCk7CiAgICAgIH0KICAgICAgaWYgKGNoYXIgPT0gX2NoYXJfcGVyY2VudCkgewogICAgICAgIHBhZGRpbmcrKzsKICAgICAgICBuZXdFbmQgPSBpbmRleDsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBuZXdFbmQ7CiAgfQoKICAvLy8gQ2hlY2sgdGhhdCB0aGUgcmVtYWluZGVyIG9mIHRoZSBzdHJpbmcgaXMgdmFsaWQgcGFkZGluZy4KICAvLy8KICAvLy8gVmFsaWQgcGFkZGluZyBpcyBhIGNvcnJlY3QgbnVtYmVyICgwLCAxIG9yIDIpIG9mIGA9YCBjaGFyYWN0ZXJzCiAgLy8vIG9yIGAlM0RgIHNlcXVlbmNlcyBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBwcmVjZWRpbmcgYmFzZTY0IGNoYXJhY3RlcnMuCiAgLy8vIFRoZSBbc3RhdGVdIHBhcmFtZXRlciBlbmNvZGVzIHdoaWNoIHBhZGRpbmcgY29udGludWF0aW9ucyBhcmUgYWxsb3dlZAogIC8vLyBhcyB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGNoYXJhY3RlcnMuIFRoYXQgbnVtYmVyIGlzIHRoZSBudW1iZXIgb2YKICAvLy8gZXhwZWN0ZWQgcGFkZGluZyBjaGFyYWN0ZXJzIHRpbWVzIDMgbWludXMgdGhlIG51bWJlciBvZiBwYWRkaW5nIGNoYXJhY3RlcnMKICAvLy8gc2VlbiBzbyBmYXIsIHdoZXJlIGA9YCBjb3VudHMgYXMgMyBjb3VudHMgYXMgdGhyZWUgY2hhcmFjdGVycywKICAvLy8gYW5kIHRoZSBwYWRkaW5nIHNlcXVlbmNlIGAlM0RgIGNvdW50cyBhcyBvbmUgY2hhcmFjdGVyIHBlciBjaGFyYWN0ZXIuCiAgLy8vCiAgLy8vIFRoZSBudW1iZXIgb2YgbWlzc2luZyBjaGFyYWN0ZXJzIGlzIGFsd2F5cyBiZXR3ZWVuIDAgYW5kIDUgYmVjYXVzZSB3ZQogIC8vLyBvbmx5IGNhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciBoYXZpbmcgc2VlbiBhdCBsZWFzdCBvbmUgYD1gIG9yIGAlYAogIC8vLyBjaGFyYWN0ZXIuCiAgLy8vIElmIHRoZSBudW1iZXIgb2YgbWlzc2luZyBjaGFyYWN0ZXJzIGlzIG5vdCAzIG9yIDAsIHdlIGhhdmUgc2VlbiAoYXQgbGVhc3QpCiAgLy8vIGEgYCVgIGNoYXJhY3RlciBhbmQgZXhwZWN0cyB0aGUgcmVzdCBvZiB0aGUgYCUzRGAgc2VxdWVuY2UsIGFuZCBhIGA9YCBpcwogIC8vLyBub3QgYWxsb3dlZC4gV2hlbiBtaXNzaW5nIDMgY2hhcmFjdGVycywgZWl0aGVyIGA9YCBvciBgJWAgaXMgYWxsb3dlZC4KICAvLy8KICAvLy8gV2hlbiB0aGUgdmFsdWUgaXMgMCwgbm8gbW9yZSBwYWRkaW5nIChvciBhbnkgb3RoZXIgY2hhcmFjdGVyKSBpcyBhbGxvd2VkLgogIHN0YXRpYyBpbnQgX2NoZWNrUGFkZGluZyhTdHJpbmcgaW5wdXQsIGludCBzdGFydCwgaW50IGVuZCwgaW50IHN0YXRlKSB7CiAgICBhc3NlcnQoX2hhc1NlZW5QYWRkaW5nKHN0YXRlKSk7CiAgICBpZiAoc3RhcnQgPT0gZW5kKSByZXR1cm4gc3RhdGU7CiAgICB2YXIgZXhwZWN0ZWRQYWRkaW5nID0gX3N0YXRlUGFkZGluZyhzdGF0ZSk7CiAgICBhc3NlcnQoZXhwZWN0ZWRQYWRkaW5nID49IDApOwogICAgYXNzZXJ0KGV4cGVjdGVkUGFkZGluZyA8IDYpOwogICAgd2hpbGUgKGV4cGVjdGVkUGFkZGluZyA+IDApIHsKICAgICAgdmFyIGNoYXIgPSBpbnB1dC5jb2RlVW5pdEF0KHN0YXJ0KTsKICAgICAgaWYgKGV4cGVjdGVkUGFkZGluZyA9PSAzKSB7CiAgICAgICAgaWYgKGNoYXIgPT0gX3BhZGRpbmdDaGFyKSB7CiAgICAgICAgICBleHBlY3RlZFBhZGRpbmcgLT0gMzsKICAgICAgICAgIHN0YXJ0Kys7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGNoYXIgPT0gX2NoYXJfcGVyY2VudCkgewogICAgICAgICAgZXhwZWN0ZWRQYWRkaW5nLS07CiAgICAgICAgICBzdGFydCsrOwogICAgICAgICAgaWYgKHN0YXJ0ID09IGVuZCkgYnJlYWs7CiAgICAgICAgICBjaGFyID0gaW5wdXQuY29kZVVuaXRBdChzdGFydCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBQYXJ0aWFsIHBhZGRpbmcgbWVhbnMgd2UgaGF2ZSBzZWVuIHBhcnQgb2YgYSAiJTNEIiBlc2NhcGUuCiAgICAgIHZhciBleHBlY3RlZFBhcnRpYWxQYWRkaW5nID0gZXhwZWN0ZWRQYWRkaW5nOwogICAgICBpZiAoZXhwZWN0ZWRQYXJ0aWFsUGFkZGluZyA+IDMpIGV4cGVjdGVkUGFydGlhbFBhZGRpbmcgLT0gMzsKICAgICAgaWYgKGV4cGVjdGVkUGFydGlhbFBhZGRpbmcgPT0gMikgewogICAgICAgIC8vIEV4cGVjdHMgJzMnCiAgICAgICAgaWYgKGNoYXIgIT0gX2NoYXJfMykgYnJlYWs7CiAgICAgICAgc3RhcnQrKzsKICAgICAgICBleHBlY3RlZFBhZGRpbmctLTsKICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKSBicmVhazsKICAgICAgICBjaGFyID0gaW5wdXQuY29kZVVuaXRBdChzdGFydCk7CiAgICAgIH0KICAgICAgLy8gRXhwZWN0cyAnRCcgb3IgJ2QnLgogICAgICBpZiAoKGNoYXIgfCAweDIwKSAhPSBfY2hhcl9kKSBicmVhazsKICAgICAgc3RhcnQrKzsKICAgICAgZXhwZWN0ZWRQYWRkaW5nLS07CiAgICAgIGlmIChzdGFydCA9PSBlbmQpIGJyZWFrOwogICAgfQogICAgaWYgKHN0YXJ0ICE9IGVuZCkgewogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgcGFkZGluZyBjaGFyYWN0ZXIiLCBpbnB1dCwgc3RhcnQpOwogICAgfQogICAgcmV0dXJuIF9lbmNvZGVQYWRkaW5nU3RhdGUoZXhwZWN0ZWRQYWRkaW5nKTsKICB9Cn0KCmNsYXNzIF9CYXNlNjREZWNvZGVyU2luayBleHRlbmRzIFN0cmluZ0NvbnZlcnNpb25TaW5rQmFzZSB7CiAgLy8vIE91dHB1dCBzaW5rCiAgZmluYWwgU2luazxMaXN0PGludD4+IF9zaW5rOwogIGZpbmFsIF9CYXNlNjREZWNvZGVyIF9kZWNvZGVyID0gX0Jhc2U2NERlY29kZXIoKTsKCiAgX0Jhc2U2NERlY29kZXJTaW5rKHRoaXMuX3NpbmspOwoKICB2b2lkIGFkZChTdHJpbmcgc3RyaW5nKSB7CiAgICBpZiAoc3RyaW5nLmlzRW1wdHkpIHJldHVybjsKICAgIHZhciBidWZmZXIgPSBfZGVjb2Rlci5kZWNvZGUoc3RyaW5nLCAwLCBzdHJpbmcubGVuZ3RoKTsKICAgIGlmIChi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a2VkIGxpc3Qgb2YgYnl0ZXMgaXQKLy8vIGFjY2VwdHMgaXRzIGlucHV0IGluIGNodW5rcyAodGhlbXNlbHZlcyBiZWluZyBsaXN0cyBvZiBieXRlcykuCi8vLwovLy8gVGhpcyBhYnN0cmFjdCBjbGFzcyB3aWxsIGxpa2VseSBnZXQgbW9yZSBtZXRob2RzIG92ZXIgdGltZS4gSW1wbGVtZW50ZXJzIGFyZQovLy8gdXJnZWQgdG8gZXh0ZW5kIG9yIG1peCBpbiBbQnl0ZUNvbnZlcnNpb25TaW5rQmFzZV0gdG8gZW5zdXJlIHRoYXQgdGhlaXIKLy8vIGNsYXNzIGNvdmVycyB0aGUgbmV3bHkgYWRkZWQgbWV0aG9kcy4KYWJzdHJhY3QgY2xhc3MgQnl0ZUNvbnZlcnNpb25TaW5rIGV4dGVuZHMgQ2h1bmtlZENvbnZlcnNpb25TaW5rPExpc3Q8aW50Pj4gewogIEJ5dGVDb252ZXJzaW9uU2luaygpOwogIGZhY3RvcnkgQnl0ZUNvbnZlcnNpb25TaW5rLndpdGhDYWxsYmFjaygKICAgICAgdm9pZCBjYWxsYmFjayhMaXN0PGludD4gYWNjdW11bGF0ZWQpKSA9IF9CeXRlQ2FsbGJhY2tTaW5rOwogIGZhY3RvcnkgQnl0ZUNvbnZlcnNpb25TaW5rLmZyb20oU2luazxMaXN0PGludD4+IHNpbmspID0gX0J5dGVBZGFwdGVyU2luazsKCiAgLy8vIEFkZHMgdGhlIG5leHQgW2NodW5rXSB0byBgdGhpc2AuCiAgLy8vCiAgLy8vIEFkZHMgdGhlIGJ5dGVzIGRlZmluZWQgYnkgW3N0YXJ0XSBhbmQgW2VuZF0tZXhjbHVzaXZlIHRvIGB0aGlzYC4KICAvLy8KICAvLy8gSWYgW2lzTGFzdF0gaXMgYHRydWVgIGNsb3NlcyBgdGhpc2AuCiAgLy8vCiAgLy8vIENvbnRyYXJ5IHRvIGBhZGRgIHRoZSBnaXZlbiBbY2h1bmtdIG11c3Qgbm90IGJlIGhlbGQgb250by4gT25jZSB0aGUgbWV0aG9kCiAgLy8vIHJldHVybnMsIGl0IGlzIHNhZmUgdG8gb3ZlcndyaXRlIHRoZSBkYXRhIGluIGl0LgogIHZvaWQgYWRkU2xpY2UoTGlzdDxpbnQ+IGNodW5rLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KTsKCiAgLy8gVE9ETyhmbG9pdHNjaCk6IGFkZCBtb3JlIG1ldGhvZHM6CiAgLy8gLSBpdGVyYXRlQnl0ZXMuCn0KCi8vLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgYmFzZS1jbGFzcyBmb3IgY29udmVydGVycyB0aGF0IG5lZWQgdG8gYWNjZXB0IGJ5dGUKLy8vIGlucHV0cy4KYWJzdHJhY3QgY2xhc3MgQnl0ZUNvbnZlcnNpb25TaW5rQmFzZSBleHRlbmRzIEJ5dGVDb252ZXJzaW9uU2luayB7CiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGNodW5rKTsKICB2b2lkIGNsb3NlKCk7CgogIHZvaWQgYWRkU2xpY2UoTGlzdDxpbnQ+IGNodW5rLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICBhZGQoY2h1bmsuc3VibGlzdChzdGFydCwgZW5kKSk7CiAgICBpZiAoaXNMYXN0KSBjbG9zZSgpOwogIH0KfQoKLy8vIFRoaXMgY2xhc3MgYWRhcHRzIGEgc2ltcGxlIFtTaW5rXSB0byBhIFtCeXRlQ29udmVyc2lvblNpbmtdLgovLy8KLy8vIEFsbCBhZGRpdGlvbmFsIG1ldGhvZHMgb2YgdGhlIFtCeXRlQ29udmVyc2lvblNpbmtdIChjb21wYXJlZCB0byB0aGUKLy8vIENodW5rZWRDb252ZXJzaW9uU2luaykgYXJlIHJlZGlyZWN0ZWQgdG8gdGhlIGBhZGRgIG1ldGhvZC4KY2xhc3MgX0J5dGVBZGFwdGVyU2luayBleHRlbmRzIEJ5dGVDb252ZXJzaW9uU2lua0Jhc2UgewogIGZpbmFsIFNpbms8TGlzdDxpbnQ+PiBfc2luazsKCiAgX0J5dGVBZGFwdGVyU2luayh0aGlzLl9zaW5rKTsKCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGNodW5rKSB7CiAgICBfc2luay5hZGQoY2h1bmspOwogIH0KCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQp9CgovLy8gVGhpcyBjbGFzcyBhY2N1bXVsYXRlcyBhbGwgY2h1bmtzIGludG8gb25lIGxpc3Qgb2YgYnl0ZXMKLy8vIGFuZCBpbnZva2VzIGEgY2FsbGJhY2sgd2hlbiB0aGUgc2luayBpcyBjbG9zZWQuCi8vLwovLy8gVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byB0ZXJtaW5hdGUgYSBjaHVua2VkIGNvbnZlcnNpb24uCmNsYXNzIF9CeXRlQ2FsbGJhY2tTaW5rIGV4dGVuZHMgQnl0ZUNvbnZlcnNpb25TaW5rQmFzZSB7CiAgc3RhdGljIGNvbnN0IF9JTklUSUFMX0JVRkZFUl9TSVpFID0gMTAyNDsKCiAgZmluYWwgdm9pZCBGdW5jdGlvbihMaXN0PGludD4pIF9jYWxsYmFjazsKICBMaXN0PGludD4gX2J1ZmZlciA9IFVpbnQ4TGlzdChfSU5JVElBTF9CVUZGRVJfU0laRSk7CiAgaW50IF9idWZmZXJJbmRleCA9IDA7CgogIF9CeXRlQ2FsbGJhY2tTaW5rKHZvaWQgY2FsbGJhY2soTGlzdDxpbnQ+IGFjY3VtdWxhdGVkKSkKICAgICAgOiBfY2FsbGJhY2sgPSBjYWxsYmFjazsKCiAgdm9pZCBhZGQoSXRlcmFibGU8aW50PiBjaHVuaykgewogICAgdmFyIGZyZWVDb3VudCA9IF9idWZmZXIubGVuZ3RoIC0gX2J1ZmZlckluZGV4OwogICAgaWYgKGNodW5rLmxlbmd0aCA+IGZyZWVDb3VudCkgewogICAgICAvLyBHcm93IHRoZSBidWZmZXIuCiAgICAgIHZhciBvbGRMZW5ndGggPSBfYnVmZmVyLmxlbmd0aDsKICAgICAgdmFyIG5ld0xlbmd0aCA9IF9yb3VuZFRvUG93ZXJPZjIoY2h1bmsubGVuZ3RoICsgb2xkTGVuZ3RoKSAqIDI7CiAgICAgIHZhciBncm93biA9IFVpbnQ4TGlzdChuZXdMZW5ndGgpOwogICAgICBncm93bi5zZXRSYW5nZSgwLCBfYnVmZmVyLmxlbmd0aCwgX2J1ZmZlcik7CiAgICAgIF9idWZmZXIgPSBncm93bjsKICAgIH0KICAgIF9idWZmZXIuc2V0UmFuZ2UoX2J1ZmZlckluZGV4LCBfYnVmZmVySW5kZXggKyBjaHVuay5sZW5ndGgsIGNodW5rKTsKICAgIF9idWZmZXJJbmRleCArPSBjaHVuay5sZW5ndGg7CiAgfQoKICBzdGF0aWMgaW50IF9yb3VuZFRvUG93ZXJPZjIoaW50IHYpIHsKICAgIGFzc2VydCh2ID4gMCk7CiAgICB2LS07CiAgICB2IHw9IHYgPj4gMTsKICAgIHYgfD0gdiA+PiAyOwogICAgdiB8PSB2ID4+IDQ7CiAgICB2IHw9IHYgPj4gODsKICAgIHYgfD0gdiA+PiAxNjsKICAgIHYrKzsKICAgIHJldHVybiB2OwogIH0KCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9jYWxsYmFjayhfYnVmZmVyLnN1Ymxpc3QoMCwgX2J1ZmZlckluZGV4KSk7CiAgfQp9Cm8ATk48ARYBRSQESkMEUUwqTRgrQUwBJwZHBisGUTdDAScVAgFNDEMdEAFEJBkEAgFBBEg/OB8BIAEeFgQBERMEAgE9NAQ+OSwBLDcYAToeASIzJBomRigyFwZIIgQBJxMJERERERIJDgQBETEEAgEhZGFydDpjb252ZXJ0L2J5dGVfY29udmVyc2lvbi5kYXJ0O29yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb252ZXJ0L2NodW5rZWRfY29udmVyc2lvbi5kYXJ0im8vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvbnZlcnQ7CgovLy8gQSBbQ2h1bmtlZENvbnZlcnNpb25TaW5rXSBpcyB1c2VkIHRvIHRyYW5zbWl0IGRhdGEgbW9yZSBlZmZpY2llbnRseSBiZXR3ZWVuCi8vLyB0d28gY29udmVydGVycyBkdXJpbmcgY2h1bmtlZCBjb252ZXJzaW9ucy4KLy8vCi8vLyBUaGUgYmFzaWMgYENodW5rZWRDb252ZXJzaW9uU2lua2AgaXMganVzdCBhIFtTaW5rXSwgYW5kIGNvbnZlcnRlcnMgc2hvdWxkCi8vLyB3b3JrIHdpdGggYSBwbGFpbiBgU2lua2AsIGJ1dCBtYXkgd29yayBtb3JlIGVmZmljaWVudGx5IHdpdGggY2VydGFpbgovLy8gc3BlY2lhbGl6ZWQgdHlwZXMgb2YgYENodW5rZWRDb252ZXJzaW9uU2lua2AuCi8vLwovLy8gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YgYENodW5rZWRDb252ZXJzaW9uU2lua2AgZXh0ZW5kCi8vLyB0aGlzIGNsYXNzLCB0byBpbmhlcml0IGFueSBmdXJ0aGVyIG1ldGhvZHMgdGhhdCBtYXkgYmUgYWRkZWQgdG8gdGhlIGNsYXNzLgphYnN0cmFjdCBjbGFzcyBDaHVua2VkQ29udmVyc2lvblNpbms8VD4gaW1wbGVtZW50cyBTaW5rPFQ+IHsKICBDaHVua2VkQ29udmVyc2lvblNpbmsoKTsKICBmYWN0b3J5IENodW5rZWRDb252ZXJzaW9uU2luay53aXRoQ2FsbGJhY2soCiAgICAgIHZvaWQgY2FsbGJhY2soTGlzdDxUPiBhY2N1bXVsYXRlZCkpID0gX1NpbXBsZUNhbGxiYWNrU2luazxUPjsKCiAgLy8vIEFkZHMgY2h1bmtlZCBkYXRhIHRvIHRoaXMgc2luay4KICAvLy8KICAvLy8gVGhpcyBtZXRob2QgaXMgYWxzbyB1c2VkIHdoZW4gY29udmVydGVycyBhcmUgdXNlZCBhcyBbU3RyZWFtVHJhbnNmb3JtZXJdcy4KICB2b2lkIGFkZChUIGNodW5rKTsKCiAgLy8vIENsb3NlcyB0aGUgc2luay4KICAvLy8KICAvLy8gVGhpcyBzaWduYWxzIHRoZSBlbmQgb2YgdGhlIGNodW5rZWQgY29udmVyc2lvbi4gVGhpcyBtZXRob2QgaXMgY2FsbGVkCiAgLy8vIHdoZW4gY29udmVydGVycyBhcmUgdXNlZCBhcyBbU3RyZWFtVHJhbnNmb3JtZXJdJ3MuCiAgdm9pZCBjbG9zZSgpOwp9CgovLy8gVGhpcyBjbGFzcyBhY2N1bXVsYXRlcyBhbGwgY2h1bmtzIGFuZCBpbnZva2VzIGEgY2FsbGJhY2sgd2l0aCBhIGxpc3Qgb2YKLy8vIHRoZSBjaHVua3Mgd2hlbiB0aGUgc2luayBpcyBjbG9zZWQuCi8vLwovLy8gVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byB0ZXJtaW5hdGUgYSBjaHVua2VkIGNvbnZlcnNpb24uCmNsYXNzIF9TaW1wbGVDYWxsYmFja1Npbms8VD4gZXh0ZW5kcyBDaHVua2VkQ29udmVyc2lvblNpbms8VD4gewogIGZpbmFsIHZvaWQgRnVuY3Rpb24oTGlzdDxUPikgX2NhbGxiYWNrOwogIGZpbmFsIExpc3Q8VD4gX2FjY3VtdWxhdGVkID0gPFQ+W107CgogIF9TaW1wbGVDYWxsYmFja1NpbmsodGhpcy5fY2FsbGJhY2spOwoKICB2b2lkIGFkZChUIGNodW5rKSB7CiAgICBfYWNjdW11bGF0ZWQuYWRkKGNodW5rKTsKICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBfY2FsbGJhY2soX2FjY3VtdWxhdGVkKTsKICB9Cn0KCi8vLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGxvZ2ljIGZvciBhIGNodW5rZWQgY29udmVyc2lvbiBhcyBhCi8vLyBzdHJlYW0gdHJhbnNmb3JtZXIuCi8vLwovLy8gSXQgaXMgdXNlZCBhcyBzdHJhdGVneSBpbiB0aGUgW0V2ZW50VHJhbnNmb3JtU3RyZWFtXS4KLy8vCi8vLyBJdCBhbHNvIGltcGxlbWVudHMgdGhlIFtDaHVua2VkQ29udmVyc2lvblNpbmtdIGludGVyZmFjZSBzbyB0aGF0IGl0Ci8vLyBjYW4gYmUgdXNlZCBhcyBvdXRwdXQgc2luayBpbiBhIGNodW5rZWQgY29udmVyc2lvbi4KY2xhc3MgX0NvbnZlcnRlclN0cmVhbUV2ZW50U2luazxTLCBUPiBpbXBsZW1lbnRzIEV2ZW50U2luazxTPiB7CiAgLy8vIFRoZSBvdXRwdXQgc2luayBmb3IgdGhlIGNvbnZlcnRlci4KICBmaW5hbCBFdmVudFNpbms8VD4gX2V2ZW50U2luazsKCiAgLy8vIFRoZSBpbnB1dCBzaW5rIGZvciBuZXcgZGF0YS4gQWxsIGRhdGEgdGhhdCBpcyByZWNlaXZlZCB3aXRoCiAgLy8vIFtoYW5kbGVEYXRhXSBpcyBhZGRlZCBpbnRvIHRoaXMgc2luay4KICBmaW5hbCBTaW5rPFM+IF9jaHVua2VkU2luazsKCiAgX0NvbnZlcnRlclN0cmVhbUV2ZW50U2luayhDb252ZXJ0ZXI8UywgVD4gY29udmVydGVyLCBFdmVudFNpbms8VD4gc2luaykKICAgICAgOiBfZXZlbnRTaW5rID0gc2luaywKICAgICAgICBfY2h1bmtlZFNpbmsgPSBjb252ZXJ0ZXIuc3RhcnRDaHVua2VkQ29udmVyc2lvbihzaW5rKTsKCiAgdm9pZCBhZGQoUyBvKSB7CiAgICBfY2h1bmtlZFNpbmsuYWRkKG8pOwogIH0KCiAgdm9pZCBhZGRFcnJvcihPYmplY3QgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICBfZXZlbnRTaW5rLmFkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBfY2h1bmtlZFNpbmsuY2xvc2UoKTsKICB9Cn0KVABOTjwBFgFQLwROSTIETU89Gy5EASYGURUBFwZMORACAUwoBD5AKiYBJwEWHQQBER0EAgFCGAQ6BEg4QCkhAUIsHgFKGz8BEhkEATksBAERGgQCASRkYXJ0OmNvbnZlcnQvY2h1bmtlZF9jb252ZXJzaW9uLmRhcnQub3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvbnZlcnQvY29kZWMuZGFydIyKLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb252ZXJ0OwoKLy8vIEEgW0NvZGVjXSBlbmNvZGVzIGFuZCAoaWYgc3VwcG9ydGVkKSBkZWNvZGVzIGRhdGEuCi8vLwovLy8gQ29kZWNzIGNhbiBiZSBmdXNlZC4gRm9yIGV4YW1wbGUgZnVzaW5nIFtqc29uXSBhbmQgW3V0ZjhdIHByb2R1Y2VzCi8vLyBhbiBlbmNvZGVyIHRoYXQgY2FuIGNvbnZlcnQgSnNvbiBvYmplY3RzIGRpcmVjdGx5IHRvIGJ5dGVzLCBvciBjYW4gZGVjb2RlCi8vLyBieXRlcyBkaXJlY3RseSB0byBqc29uIG9iamVjdHMuCi8vLwovLy8gRnVzZWQgY29kZWNzIGdlbmVyYWxseSBhdHRlbXB0IHRvIG9wdGltaXplIHRoZSBvcGVyYXRpb25zIGFuZCBjYW4gYmUgZmFzdGVyCi8vLyB0aGFuIGV4ZWN1dGluZyBlYWNoIHN0ZXAgb2YgYW4gZW5jb2Rpbmcgc2VwYXJhdGVseS4KYWJzdHJhY3QgY2xhc3MgQ29kZWM8UywgVD4gewogIGNvbnN0IENvZGVjKCk7CgogIC8vLyBFbmNvZGVzIFtpbnB1dF0uCiAgLy8vCiAgLy8vIFRoZSBpbnB1dCBpcyBlbmNvZGVkIGFzIGlmIGJ5IGBlbmNvZGVyLmNvbnZlcnRgLgogIFQgZW5jb2RlKFMgaW5wdXQpID0+IGVuY29kZXIuY29udmVydChpbnB1dCk7CgogIC8vLyBEZWNvZGVzIFtlbmNvZGVkXSBkYXRhLgogIC8vLwogIC8vLyBUaGUgaW5wdXQgaXMgZGVjb2RlZCBhcyBpZiBieSBgZGVjb2Rlci5jb252ZXJ0YC4KICBTIGRlY29kZShUIGVuY29kZWQpID0+IGRlY29kZXIuY29udmVydChlbmNvZGVkKTsKCiAgLy8vIFJldHVybnMgdGhlIGVuY29kZXIgZnJvbSBbU10gdG8gW1RdLgogIC8vLwogIC8vLyBJdCBtYXkgYmUgc3RhdGVmdWwgYW5kIHNob3VsZCBub3QgYmUgcmV1c2VkLgogIENvbnZlcnRlcjxTLCBUPiBnZXQgZW5jb2RlcjsKCiAgLy8vIFJldHVybnMgdGhlIGRlY29kZXIgb2YgYHRoaXNgLCBjb252ZXJ0aW5nIGZyb20gW1RdIHRvIFtTXS4KICAvLy8KICAvLy8gSXQgbWF5IGJlIHN0YXRlZnVsIGFuZCBzaG91bGQgbm90IGJlIHJldXNlZC4KICBDb252ZXJ0ZXI8VCwgUz4gZ2V0IGRlY29kZXI7CgogIC8vLyBGdXNlcyBgdGhpc2Agd2l0aCBgb3RoZXJgLgogIC8vLwogIC8vLyBXaGVuIGVuY29kaW5nLCB0aGUgcmVzdWx0aW5nIGNvZGVjIGVuY29kZXMgd2l0aCBgdGhpc2AgYmVmb3JlCiAgLy8vIGVuY29kaW5nIHdpdGggW290aGVyXS4KICAvLy8KICAvLy8gV2hlbiBkZWNvZGluZywgdGhlIHJlc3VsdGluZyBjb2RlYyBkZWNvZGVzIHdpdGggW290aGVyXSBiZWZvcmUgZGVjb2RpbmcKICAvLy8gd2l0aCBgdGhpc2AuCiAgLy8vCiAgLy8vIEluIHNvbWUgY2FzZXMgb25lIG5lZWRzIHRvIHVzZSB0aGUgW2ludmVydGVkXSBjb2RlY3MgdG8gYmUgYWJsZSB0byBmdXNlCiAgLy8vIHRoZW0gY29ycmVjdGx5LiBUaGF0IGlzLCB0aGUgb3V0cHV0IHR5cGUgb2YgYHRoaXNgIChbVF0pIG11c3QgbWF0Y2ggdGhlCiAgLy8vIGlucHV0IHR5cGUgb2YgdGhlIHNlY29uZCBjb2RlYyBbb3RoZXJdLgogIC8vLwogIC8vLyBFeGFtcGxlczoKICAvLy8gYGBgZGFydAogIC8vLyBmaW5hbCBqc29uVG9CeXRlcyA9IGpzb24uZnVzZSh1dGY4KTsKICAvLy8gTGlzdDxpbnQ+IGJ5dGVzID0ganNvblRvQnl0ZXMuZW5jb2RlKFsianNvbi1vYmplY3QiXSk7CiAgLy8vIHZhciBkZWNvZGVkID0ganNvblRvQnl0ZXMuZGVjb2RlKGJ5dGVzKTsKICAvLy8gYXNzZXJ0KGRlY29kZWQgaXMgTGlzdCAmJiBkZWNvZGVkWzBdID09ICJqc29uLW9iamVjdCIpOwogIC8vLwogIC8vLyB2YXIgaW52ZXJ0ZWQgPSBqc29uLmludmVydGVkOwogIC8vLyB2YXIganNvbklkZW50aXR5ID0ganNvbi5mdXNlKGludmVydGVkKTsKICAvLy8gdmFyIGpzb25PYmplY3QgPSBqc29uSWRlbnRpdHkuZW5jb2RlKFsiMSIsIDJdKTsKICAvLy8gYXNzZXJ0KGpzb25PYmplY3QgaXMgTGlzdCAmJiBqc29uT2JqZWN0WzBdID09ICIxIiAmJiBqc29uT2JqZWN0WzFdID09IDIpOwogIC8vLyBgYGAKICAvLyBUT0RPKGZsb2l0c2NoKTogdXNlIGJldHRlciBleGFtcGxlIHdpdGggbGluZS1zcGxpdHRlciBvbmNlIHRoYXQgb25lIGlzCiAgLy8gaW4gdGhpcyBsaWJyYXJ5LgogIENvZGVjPFMsIFI+IGZ1c2U8Uj4oQ29kZWM8VCwgUj4gb3RoZXIpIHsKICAgIHJldHVybiBfRnVzZWRDb2RlYzxTLCBULCBSPih0aGlzLCBvdGhlcik7CiAgfQoKICAvLy8gSW52ZXJ0cyBgdGhpc2AuCiAgLy8vCiAgLy8vIFRoZSBbZW5jb2Rlcl0gYW5kIFtkZWNvZGVyXSBvZiB0aGUgcmVzdWx0aW5nIGNvZGVjIGFyZSBzd2FwcGVkLgogIENvZGVjPFQsIFM+IGdldCBpbnZlcnRlZCA9PiBfSW52ZXJ0ZWRDb2RlYzxULCBTPih0aGlzKTsKfQoKLy8vIEZ1c2VzIHRoZSBnaXZlbiBjb2RlY3MuCi8vLwovLy8gSW4gdGhlIG5vbi1jaHVua2VkIGNvbnZlcnNpb24gc2ltcGx5IGludm9rZXMgdGhlIG5vbi1jaHVua2VkIGNvbnZlcnNpb25zIGluCi8vLyBzZXF1ZW5jZS4KY2xhc3MgX0Z1c2VkQ29kZWM8UywgTSwgVD4gZXh0ZW5kcyBDb2RlYzxTLCBUPiB7CiAgZmluYWwgQ29kZWM8UywgTT4gX2ZpcnN0OwogIGZpbmFsIENvZGVjPE0sIFQ+IF9zZWNvbmQ7CgogIENvbnZlcnRlcjxTLCBUPiBnZXQgZW5jb2RlciA9PiBfZmlyc3QuZW5jb2Rlci5mdXNlPFQ+KF9zZWNvbmQuZW5jb2Rlcik7CiAgQ29udmVydGVyPFQsIFM+IGdldCBkZWNvZGVyID0+IF9zZWNvbmQuZGVjb2Rlci5mdXNlPFM+KF9maXJzdC5kZWNvZGVyKTsKCiAgX0Z1c2VkQ29kZWModGhpcy5fZmlyc3QsIHRoaXMuX3NlY29uZCk7Cn0KCmNsYXNzIF9JbnZlcnRlZENvZGVjPFQsIFM+IGV4dGVuZHMgQ29kZWM8VCwgUz4gewogIGZpbmFsIENvZGVjPFMsIFQ+IF9jb2RlYzsKCiAgX0ludmVydGVkQ29kZWMoQ29kZWM8UywgVD4gY29kZWMpIDogX2NvZGVjID0gY29kZWM7CgogIENvbnZlcnRlcjxULCBTPiBnZXQgZW5jb2RlciA9PiBfY29kZWMuZGVjb2RlcjsKICBDb252ZXJ0ZXI8UywgVD4gZ2V0IGRlY29kZXIgPT4gX2NvZGVjLmVuY29kZXI7CgogIENvZGVjPFMsIFQ+IGdldCBpbnZlcnRlZCA9PiBfY29kZWM7Cn0KYwBOTjwBFgE3BEdOJARQOB0RARcGNy8BHgY3MwErBjMfAUEGMx8BIQZEHQZOEwZOTi4GEA4rPS8+BiQuNlAKTBYrLgQBFgZGOgIBHARQDjEcHQFKSgEqAgExHAE2ATExASYCARdkYXJ0OmNvbnZlcnQvY29kZWMuZGFydDJvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29udmVydC9jb252ZXJ0ZXIuZGFydIqVLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb252ZXJ0OwoKLy8vIEEgW0NvbnZlcnRlcl0gY29udmVydHMgZGF0YSBmcm9tIG9uZSByZXByZXNlbnRhdGlvbiBpbnRvIGFub3RoZXIuCi8vLwovLy8gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YgYENvbnZlcnRlcmAgZXh0ZW5kIHRoaXMgY2xhc3MsCi8vLyB0byBpbmhlcml0IGFueSBmdXJ0aGVyIG1ldGhvZHMgdGhhdCBtYXkgYmUgYWRkZWQgdG8gdGhlIGNsYXNzLgphYnN0cmFjdCBjbGFzcyBDb252ZXJ0ZXI8UywgVD4gZXh0ZW5kcyBTdHJlYW1UcmFuc2Zvcm1lckJhc2U8UywgVD4gewogIGNvbnN0IENvbnZlcnRlcigpOwoKICAvLy8gQWRhcHRzIFtzb3VyY2VdIHRvIGJlIGEgYENvbnZlcnRlcjxUUywgVFQ+YC4KICAvLy8KICAvLy8gVGhpcyBhbGxvd3MgW3NvdXJjZV0gdG8gYmUgdXNlZCBhdCB0aGUgbmV3IHR5cGUsIGJ1dCBhdCBydW4tdGltZSBpdAogIC8vLyBtdXN0IHNhdGlzZnkgdGhlIHJlcXVpcmVtZW50cyBvZiBib3RoIHRoZSBuZXcgdHlwZSBhbmQgaXRzIG9yaWdpbmFsIHR5cGUuCiAgLy8vCiAgLy8vIENvbnZlcnNpb24gaW5wdXQgbXVzdCBiZSBib3RoIFtTU10gYW5kIFtUU10gYW5kIHRoZSBvdXRwdXQgY3JlYXRlZCBieQogIC8vLyBbc291cmNlXSBmb3IgdGhvc2UgaW5wdXQgbXVzdCBiZSBib3RoIFtTVF0gYW5kIFtUVF0uCiAgc3RhdGljIENvbnZlcnRlcjxUUywgVFQ+IGNhc3RGcm9tPFNTLCBTVCwgVFMsIFRUPihDb252ZXJ0ZXI8U1MsIFNUPiBzb3VyY2UpID0+CiAgICAgIENhc3RDb252ZXJ0ZXI8U1MsIFNULCBUUywgVFQ+KHNvdXJjZSk7CgogIC8vLyBDb252ZXJ0cyBbaW5wdXRdIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGNvbnZlcnNpb24uCiAgVCBjb252ZXJ0KFMgaW5wdXQpOwoKICAvLy8gRnVzZXMgYHRoaXNgIHdpdGggW290aGVyXS4KICAvLy8KICAvLy8gRW5jb2Rpbmcgd2l0aCB0aGUgcmVzdWx0aW5nIGNvbnZlcnRlciBpcyBlcXVpdmFsZW50IHRvIGNvbnZlcnRpbmcgd2l0aAogIC8vLyBgdGhpc2AgYmVmb3JlIGNvbnZlcnRpbmcgd2l0aCBgb3RoZXJgLgogIENvbnZlcnRlcjxTLCBUVD4gZnVzZTxUVD4oQ29udmVydGVyPFQsIFRUPiBvdGhlcikgewogICAgcmV0dXJuIF9GdXNlZENvbnZlcnRlcjxTLCBULCBUVD4odGhpcywgb3RoZXIpOwogIH0KCiAgLy8vIFN0YXJ0cyBhIGNodW5rZWQgY29udmVyc2lvbi4KICAvLy8KICAvLy8gVGhlIHJldHVybmVkIHNpbmsgc2VydmVzIGFzIGlucHV0IGZvciB0aGUgbG9uZy1ydW5uaW5nIGNvbnZlcnNpb24uIFRoZQogIC8vLyBnaXZlbiBbc2lua10gc2VydmVzIGFzIG91dHB1dC4KICBTaW5rPFM+IHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxUPiBzaW5rKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJUaGlzIGNvbnZlcnRlciBkb2VzIG5vdCBzdXBwb3J0IGNodW5rZWQgY29udmVyc2lvbnM6ICR0aGlzIik7CiAgfQoKICBTdHJlYW08VD4gYmluZChTdHJlYW08Uz4gc3RyZWFtKSB7CiAgICByZXR1cm4gU3RyZWFtPFQ+LmV2ZW50VHJhbnNmb3JtZWQoCiAgICAgICAgc3RyZWFtLCAoRXZlbnRTaW5rIHNpbmspID0+IF9Db252ZXJ0ZXJTdHJlYW1FdmVudFNpbmsodGhpcywgc2luaykpOwogIH0KCiAgLy8vIFByb3ZpZGVzIGEgYENvbnZlcnRlcjxSUywgUlQ+YCB2aWV3IG9mIHRoaXMgc3RyZWFtIHRyYW5zZm9ybWVyLgogIC8vLwogIC8vLyBUaGUgcmVzdWx0aW5nIHRyYW5zZm9ybWVyIHdpbGwgY2hlY2sgYXQgcnVuLXRpbWUgdGhhdCBhbGwgY29udmVyc2lvbgogIC8vLyBpbnB1dHMgYXJlIGFjdHVhbGx5IGluc3RhbmNlcyBvZiBbU10sCiAgLy8vIGFuZCBpdCB3aWxsIGNoZWNrIHRoYXQgYWxsIGNvbnZlcnNpb24gb3V0cHV0IHByb2R1Y2VkIGJ5IHRoaXMgY29udmVydGVyCiAgLy8vIGFyZSBhY3R1YWxseSBpbnN0YW5jZXMgb2YgW1JUXS4KICBDb252ZXJ0ZXI8UlMsIFJUPiBjYXN0PFJTLCBSVD4oKSA9PiBDb252ZXJ0ZXIuY2FzdEZyb208UywgVCwgUlMsIFJUPih0aGlzKTsKfQoKLy8vIEZ1c2VzIHR3byBjb252ZXJ0ZXJzLgovLy8KLy8vIEZvciBhIG5vbi1jaHVua2VkIGNvbnZlcnNpb24gY29udmVydHMgdGhlIGlucHV0IGluIHNlcXVlbmNlLgpjbGFzcyBfRnVzZWRDb252ZXJ0ZXI8UywgTSwgVD4gZXh0ZW5kcyBDb252ZXJ0ZXI8UywgVD4gewogIGZpbmFsIENvbnZlcnRlcjxTLCBNPiBfZmlyc3Q7CiAgZmluYWwgQ29udmVydGVyPE0sIFQ+IF9zZWNvbmQ7CgogIF9GdXNlZENvbnZlcnRlcih0aGlzLl9maXJzdCwgdGhpcy5fc2Vjb25kKTsKCiAgVCBjb252ZXJ0KFMgaW5wdXQpID0+IF9zZWNvbmQuY29udmVydChfZmlyc3QuY29udmVydChpbnB1dCkpOwoKICBTaW5rPFM+IHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxUPiBzaW5rKSB7CiAgICByZXR1cm4gX2ZpcnN0LnN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oX3NlY29uZC5zdGFydENodW5rZWRDb252ZXJzaW9uKHNpbmspKTsKICB9Cn0KSgBOTjwBFgFGBE1DRRUBMwZKUAZMO1EtAUEWASEGTS02MwQBIwZNJTEcRwQBJSdMBAFGBkssTiZOAgEaBEE5ICEBLgFAATFQBAIBG2RhcnQ6Y29udmVydC9jb252ZXJ0ZXIuZGFydDFvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29udmVydC9lbmNvZGluZy5kYXJ0igYvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvbnZlcnQ7CgovLy8gT3Blbi1lbmRlZCBFbmNvZGluZyBlbnVtLgphYnN0cmFjdCBjbGFzcyBFbmNvZGluZyBleHRlbmRzIENvZGVjPFN0cmluZywgTGlzdDxpbnQ+PiB7CiAgY29uc3QgRW5jb2RpbmcoKTsKCiAgLy8vIFJldHVybnMgdGhlIGVuY29kZXIgZnJvbSBgU3RyaW5nYCB0byBgTGlzdDxpbnQ+YC4KICAvLy8KICAvLy8gSXQgbWF5IGJlIHN0YXRlZnVsIGFuZCBzaG91bGQgbm90IGJlIHJldXNlZC4KICBDb252ZXJ0ZXI8U3RyaW5nLCBMaXN0PGludD4+IGdldCBlbmNvZGVyOwoKICAvLy8gUmV0dXJucyB0aGUgZGVjb2RlciBvZiBgdGhpc2AsIGNvbnZlcnRpbmcgZnJvbSBgTGlzdDxpbnQ+YCB0byBgU3RyaW5nYC4KICAvLy8KICAvLy8gSXQgbWF5IGJlIHN0YXRlZnVsIGFuZCBzaG91bGQgbm90IGJlIHJldXNlZC4KICBDb252ZXJ0ZXI8TGlzdDxpbnQ+LCBTdHJpbmc+IGdldCBkZWNvZGVyOwoKICBGdXR1cmU8U3RyaW5nPiBkZWNvZGVTdHJlYW0oU3RyZWFtPExpc3Q8aW50Pj4gYnl0ZVN0cmVhbSkgewogICAgcmV0dXJuIGJ5dGVTdHJlYW0KICAgICAgICAudHJhbnNmb3JtPFN0cmluZz4oZGVjb2RlcikKICAgICAgICAuZm9sZChTdHJpbmdCdWZmZXIoKSwKICAgICAgICAgICAgKFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyBzdHJpbmcpID0+IGJ1ZmZlci4ud3JpdGUoc3RyaW5nKSkKICAgICAgICAudGhlbigoU3RyaW5nQnVmZmVyIGJ1ZmZlcikgPT4gYnVmZmVyLnRvU3RyaW5nKCkpOwogIH0KCiAgLy8vIE5hbWUgb2YgdGhlIGVuY29kaW5nLgogIC8vLwogIC8vLyBJZiB0aGUgZW5jb2RpbmcgaXMgc3RhbmRhcmRpemVkLCB0aGlzIGlzIHRoZSBsb3dlci1jYXNlIHZlcnNpb24gb2Ygb25lIG9mCiAgLy8vIHRoZSBJQU5BIG9mZmljaWFsIG5hbWVzIGZvciB0aGUgY2hhcmFjdGVyIHNldCAoc2VlCiAgLy8vIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvY2hhcmFjdGVyLXNldHMvY2hhcmFjdGVyLXNldHMueG1sKQogIFN0cmluZyBnZXQgbmFtZTsKCiAgLy8gQWxsIGFsaWFzZXMgKGluIGxvd2VyY2FzZSkgb2Ygc3VwcG9ydGVkIGVuY29kaW5nIGZyb20KICAvLyBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2NoYXJhY3Rlci1zZXRzL2NoYXJhY3Rlci1zZXRzLnhtbC4KICBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgRW5jb2Rpbmc+IF9uYW1lVG9FbmNvZGluZyA9IDxTdHJpbmcsIEVuY29kaW5nPnsKICAgIC8vIElTT184ODU5LTE6MTk4Ny4KICAgICJpc29fODg1OS0xOjE5ODciOiBsYXRpbjEsCiAgICAiaXNvLWlyLTEwMCI6IGxhdGluMSwKICAgICJpc29fODg1OS0xIjogbGF0aW4xLAogICAgImlzby04ODU5LTEiOiBsYXRpbjEsCiAgICAibGF0aW4xIjogbGF0aW4xLAogICAgImwxIjogbGF0aW4xLAogICAgImlibTgxOSI6IGxhdGluMSwKICAgICJjcDgxOSI6IGxhdGluMSwKICAgICJjc2lzb2xhdGluMSI6IGxhdGluMSwKCiAgICAvLyBVUy1BU0NJSS4KICAgICJpc28taXItNiI6IGFzY2lpLAogICAgImFuc2lfeDMuNC0xOTY4IjogYXNjaWksCiAgICAiYW5zaV94My40LTE5ODYiOiBhc2NpaSwKICAgICJpc29fNjQ2LmlydjoxOTkxIjogYXNjaWksCiAgICAiaXNvNjQ2LXVzIjogYXNjaWksCiAgICAidXMtYXNjaWkiOiBhc2NpaSwKICAgICJ1cyI6IGFzY2lpLAogICAgImlibTM2NyI6IGFzY2lpLAogICAgImNwMzY3IjogYXNjaWksCiAgICAiY3Nhc2NpaSI6IGFzY2lpLAogICAgImFzY2lpIjogYXNjaWksIC8vIFRoaXMgaXMgbm90IGluIHRoZSBJQU5BIG9mZmljaWFsIG5hbWVzLgoKICAgIC8vIFVURi04LgogICAgImNzdXRmOCI6IHV0ZjgsCiAgICAidXRmLTgiOiB1dGY4CiAgfTsKCiAgLy8vIEdldHMgYW4gW0VuY29kaW5nXSBvYmplY3QgZnJvbSB0aGUgbmFtZSBvZiB0aGUgY2hhcmFjdGVyIHNldAogIC8vLyBuYW1lLiBUaGUgbmFtZXMgdXNlZCBhcmUgdGhlIElBTkEgb2ZmaWNpYWwgbmFtZXMgZm9yIHRoZQogIC8vLyBjaGFyYWN0ZXIgc2V0IChzZWUKICAvLy8gaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9jaGFyYWN0ZXItc2V0cy9jaGFyYWN0ZXItc2V0cy54bWwpLgogIC8vLwogIC8vLyBUaGUgW25hbWVdIHBhc3NlZCBpcyBjYXNlIGluc2Vuc2l0aXZlLgogIC8vLwogIC8vLyBJZiBjaGFyYWN0ZXIgc2V0IGlzIG5vdCBzdXBwb3J0ZWQgWzpudWxsOl0gaXMgcmV0dXJuZWQuCiAgc3RhdGljIEVuY29kaW5nIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewogICAgaWYgKG5hbWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwogICAgcmV0dXJuIF9uYW1lVG9FbmNvZGluZ1tuYW1lXTsKICB9Cn0KUwBOTjwBFgEeOxQBOAYzLAFOBjMsAT4WJB5LOwQBHAZQOUkTATtISxgfGhoaFhIWFRsBERcdHR8YFxEVFBY/AQ4UEgUBQz8ZSgYtBj4rIx8iBAIBGmRhcnQ6Y29udmVydC9lbmNvZGluZy5kYXJ0NG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb252ZXJ0L2h0bWxfZXNjYXBlLmRhcnSfxy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29udmVydDsKCi8vLyBBIGBTdHJpbmdgIGNvbnZlcnRlciB0aGF0IGNvbnZlcnRzIGNoYXJhY3RlcnMgdG8gSFRNTCBlbnRpdGllcy4KLy8vCi8vLyBUaGlzIGlzIGludGVuZGVkIHRvIHNhbml0aXplIHRleHQgYmVmb3JlIGluc2VydGluZyB0aGUgdGV4dCBpbnRvIGFuIEhUTUwKLy8vIGRvY3VtZW50LiBDaGFyYWN0ZXJzIHRoYXQgYXJlIG1lYW5pbmdmdWwgaW4gSFRNTCBhcmUgY29udmVydGVkIHRvCi8vLyBIVE1MIGVudGl0aWVzIChsaWtlIGAmYW1wO2AgZm9yIGAmYCkuCi8vLwovLy8gVGhlIGdlbmVyYWwgY29udmVydGVyIGVzY2FwZXMgYWxsIGNoYXJhY3RlcnMgdGhhdCBhcmUgbWVhbmluZ2Z1bCBpbiBIVE1MCi8vLyBhdHRyaWJ1dGVzIG9yIG5vcm1hbCBlbGVtZW50IGNvbnRleHQuIEVsZW1lbnRzIHdpdGggc3BlY2lhbCBjb250ZW50IHR5cGVzCi8vLyAobGlrZSBDU1Mgb3IgSmF2YVNjcmlwdCkgbWF5IG5lZWQgYSBtb3JlIHNwZWNpYWxpemVkIGVzY2FwaW5nIHRoYXQKLy8vIHVuZGVyc3RhbmRzIHRoYXQgY29udGVudCB0eXBlLgovLy8KLy8vIElmIHRoZSBjb250ZXh0IHdoZXJlIHRoZSB0ZXh0IHdpbGwgYmUgaW5zZXJ0ZWQgaXMga25vd24gaW4gbW9yZSBkZXRhaWwsCi8vLyBpdCdzIHBvc3NpYmxlIHRvIG9taXQgZXNjYXBpbmcgc29tZSBjaGFyYWN0ZXJzIChsaWtlIHF1b3RlcyB3aGVuIG5vdAovLy8gaW5zaWRlIGFuIGF0dHJpYnV0ZSB2YWx1ZSkuCi8vLwovLy8gVGhlIGVzY2FwZWQgdGV4dCBzaG91bGQgb25seSBiZSB1c2VkIGluc2lkZSBxdW90ZWQgSFRNTCBhdHRyaWJ1dGVzIHZhbHVlcwovLy8gb3IgYXMgdGV4dCBjb250ZW50IG9mIGEgbm9ybWFsIGVsZW1lbnQuIFVzaW5nIHRoZSBlc2NhcGVkIHRleHQgaW5zaWRlIGEKLy8vIHRhZywgYnV0IG5vdCBpbnNpZGUgYSBxdW90ZWQgYXR0cmlidXRlIHZhbHVlLCBpcyBzdGlsbCBkYW5nZXJvdXMuCmNvbnN0IEh0bWxFc2NhcGUgaHRtbEVzY2FwZSA9IEh0bWxFc2NhcGUoKTsKCi8vLyBIVE1MIGVzY2FwZSBtb2Rlcy4KLy8vCi8vLyBBbGxvd3Mgc3BlY2lmeWluZyBhIG1vZGUgZm9yIEhUTUwgZXNjYXBpbmcgdGhhdCBkZXBlbmQgb24gdGhlIGNvbnRleHQKLy8vIHdoZXJlIHRoZSBlc2NhcGVkIHJlc3VsdCBpcyBnb2luZyB0byBiZSB1c2VkLgovLy8gVGhlIHJlbGV2YW50IGNvbnRleHRzIGFyZToKLy8vCi8vLyAqIGFzIHRleHQgY29udGVudCBvZiBhbiBIVE1MIGVsZW1lbnQuCi8vLyAqIGFzIHZhbHVlIG9mIGEgKHNpbmdsZS0gb3IgZG91YmxlLSkgcXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZS4KLy8vCi8vLyBBbGwgbW9kZXMgcmVxdWlyZSBlc2NhcGluZyBvZiBgJmAgKGFtcGVyc2FuZCkgY2hhcmFjdGVycywgYW5kIG1heQovLy8gZW5hYmxlIGVzY2FwaW5nIG9mIG1vcmUgY2hhcmFjdGVycy4KLy8vCi8vLyBDdXN0b20gZXNjYXBlIG1vZGVzIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoZSBbSHRtbEVzY2FwZU1vZGUuSHRtbEVzY2FwZU1vZGVdCi8vLyBjb25zdHJ1Y3Rvci4KY2xhc3MgSHRtbEVzY2FwZU1vZGUgewogIGZpbmFsIFN0cmluZyBfbmFtZTsKCiAgLy8vIFdoZXRoZXIgdG8gZXNjYXBlICc8JyBhbmQgJz4nLgogIGZpbmFsIGJvb2wgZXNjYXBlTHRHdDsKCiAgLy8vIFdoZXRoZXIgdG8gZXNjYXBlICciJyAocXVvdGUpLgogIGZpbmFsIGJvb2wgZXNjYXBlUXVvdDsKCiAgLy8vIFdoZXRoZXIgdG8gZXNjYXBlICInIiAoYXBvc3Ryb3BoZSkuCiAgZmluYWwgYm9vbCBlc2NhcGVBcG9zOwoKICAvLy8gV2hldGhlciB0byBlc2NhcGUgIi8iIChmb3J3YXJkIHNsYXNoLCBzb2xpZHVzKS4KICAvLy8KICAvLy8gRXNjYXBpbmcgYSBzbGFzaCBpcyByZWNvbW1lbmRlZCB0byBhdm9pZCBjcm9zcy1zaXRlIHNjcmlwdGluZyBhdHRhY2tzIGJ5CiAgLy8vIFt0aGUgT3BlbiBXZWIgQXBwbGljYXRpb24gU2VjdXJpdHkgUHJvamVjdF0oaHR0cHM6Ly93d3cub3dhc3Aub3JnL2luZGV4LnBocC9YU1NfKENyb3NzX1NpdGVfU2NyaXB0aW5nKV9QcmV2ZW50aW9uX0NoZWF0X1NoZWV0I1JVTEVfLjIzMV8tX0hUTUxfRXNjYXBlX0JlZm9yZV9JbnNlcnRpbmdfVW50cnVzdGVkX0RhdGFfaW50b19IVE1MX0VsZW1lbnRfQ29udGVudCkKICBmaW5hbCBib29sIGVzY2FwZVNsYXNoOwoKICAvLy8gRGVmYXVsdCBlc2NhcGluZyBtb2RlIHdoaWNoIGVzY2FwZSBhbGwgY2hhcmFjdGVycy4KICAvLy8KICAvLy8gVGhlIHJlc3VsdCBvZiBzdWNoIGFuIGVzY2FwaW5nIGlzIHVzYWJsZSBib3RoIGluIGVsZW1lbnQgY29udGVudCBhbmQKICAvLy8gaW4gYW55IGF0dHJpYnV0ZSB2YWx1ZS4KICAvLy8KICAvLy8gVGhlIGVzY2FwaW5nIG9ubHkgd29ya3MgZm9yIGVsZW1lbnRzIHdpdGggbm9ybWFsIEhUTUwgY29udGVudCwKICAvLy8gYW5kIG5vdCBmb3IsIGZvciBleGFtcGxlLCBzY3JpcHQgb3Igc3R5bGUgZWxlbWVudCBjb250ZW50LAogIC8vLyB3aGljaCByZXF1aXJlIGVzY2FwZXMgbWF0Y2hpbmcgdGhlaXIgcGFydGljdWxhciBjb250ZW50IHN5bnRheC4KICBzdGF0aWMgY29uc3QgSHRtbEVzY2FwZU1vZGUgdW5rbm93biA9CiAgICAgIEh0bWxFc2NhcGVNb2RlLl8oJ3Vua25vd24nLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKCiAgLy8vIEVzY2FwaW5nIG1vZGUgZm9yIHRleHQgZ29pbmcgaW50byBkb3VibGUtcXVvdGVkIEhUTUwgYXR0cmlidXRlIHZhbHVlcy4KICAvLy8KICAvLy8gVGhlIHJlc3VsdCBzaG91bGQgbm90IGJlIHVzZWQgYXMgdGhlIGNvbnRlbnQgb2YgYW4gdW5xdW90ZWQKICAvLy8gb3Igc2luZ2xlLXF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUuCiAgLy8vCiAgLy8vIEVzY2FwZXMgZG91YmxlIHF1b3RlcyAoYCJgKSBidXQgbm90IHNpbmdsZSBxdW90ZXMgKGAnYCksCiAgLy8vIGFuZCBlc2NhcGVzIGA8YCBhbmQgYD5gIGNoYXJhY3RlcnMgYmVjYXVzZSB0aGV5IGFyZSBub3QgYWxsb3dlZAogIC8vLyBpbiBzdHJpY3QgWEhUTUwgYXR0cmlidXRlcwogIHN0YXRpYyBjb25zdCBIdG1sRXNjYXBlTW9kZSBhdHRyaWJ1dGUgPQogICAgICBIdG1sRXNjYXBlTW9kZS5fKCdhdHRyaWJ1dGUnLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UpOwoKICAvLy8gRXNjYXBpbmcgbW9kZSBmb3IgdGV4dCBnb2luZyBpbnRvIHNpbmdsZS1xdW90ZWQgSFRNTCBhdHRyaWJ1dGUgdmFsdWVzLgogIC8vLwogIC8vLyBUaGUgcmVzdWx0IHNob3VsZCBub3QgYmUgdXNlZCBhcyB0aGUgY29udGVudCBvZiBhbiB1bnF1b3RlZAogIC8vLyBvciBkb3VibGUtcXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZS4KICAvLy8KICAvLy8gRXNjYXBlcyBzaW5nbGUgcXVvdGVzIChgJ2ApIGJ1dCBub3QgZG91YmxlIHF1b3RlcyAoYCJgKSwKICAvLy8gYW5kIGVzY2FwZXMgYDxgIGFuZCBgPmAgY2hhcmFjdGVycyBiZWNhdXNlIHRoZXkgYXJlIG5vdCBhbGxvd2VkCiAgLy8vIGluIHN0cmljdCBYSFRNTCBhdHRyaWJ1dGVzCiAgc3RhdGljIGNvbnN0IEh0bWxFc2NhcGVNb2RlIHNxQXR0cmlidXRlID0KICAgICAgSHRtbEVzY2FwZU1vZGUuXygnYXR0cmlidXRlJywgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlKTsKCiAgLy8vIEVzY2FwaW5nIG1vZGUgZm9yIHRleHQgZ29pbmcgaW50byBIVE1MIGVsZW1lbnQgY29udGVudC4KICAvLy8KICAvLy8gVGhlIGVzY2FwaW5nIG9ubHkgd29ya3MgZm9yIGVsZW1lbnRzIHdpdGggbm9ybWFsIEhUTUwgY29udGVudCwKICAvLy8gYW5kIG5vdCBmb3IsIGZvciBleGFtcGxlLCBzY3JpcHQgb3Igc3R5bGUgZWxlbWVudCBjb250ZW50LAogIC8vLyB3aGljaCByZXF1aXJlIGVzY2FwZXMgbWF0Y2hpbmcgdGhlaXIgcGFydGljdWxhciBjb250ZW50IHN5bnRheC4KICAvLy8KICAvLy8gRXNjYXBlcyBgPGAgYW5kIGA+YCBjaGFyYWN0ZXJzLgogIHN0YXRpYyBjb25zdCBIdG1sRXNjYXBlTW9kZSBlbGVtZW50ID0KICAgICAgSHRtbEVzY2FwZU1vZGUuXygnZWxlbWVudCcsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwoKICBjb25zdCBIdG1sRXNjYXBlTW9kZS5fKHRoaXMuX25hbWUsIHRoaXMuZXNjYXBlTHRHdCwgdGhpcy5lc2NhcGVRdW90LAogICAgICB0aGlzLmVzY2FwZUFwb3MsIHRoaXMuZXNjYXBlU2xhc2gpOwoKICAvLy8gQ3JlYXRlIGEgY3VzdG9tIGVzY2FwaW5nIG1vZGUuCiAgLy8vCiAgLy8vIEFsbCBtb2RlcyBlc2NhcGUgYCZgLgogIC8vLyBUaGUgbW9kZSBjYW4gZnVydGhlciBiZSBzZXQgdG8gZXNjYXBlIGA8YCBhbmQgYD5gIChbZXNjYXBlTHRHdF0pLAogIC8vLyBgImAgKFtlc2NhcGVRdW90XSksIGAnYCAoW2VzY2FwZUFwb3NdKSwgYW5kL29yIGAvYCAoW2VzY2FwZVNsYXNoXSkuCiAgY29uc3QgSHRtbEVzY2FwZU1vZGUoCiAgICAgIHtTdHJpbmcgbmFtZSA9ICJjdXN0b20iLAogICAgICB0aGlzLmVzY2FwZUx0R3QgPSBmYWxzZSwKICAgICAgdGhpcy5lc2NhcGVRdW90ID0gZmFsc2UsCiAgICAgIHRoaXMuZXNjYXBlQXBvcyA9IGZhbHNlLAogICAgICB0aGlzLmVzY2FwZVNsYXNoID0gZmFsc2V9KQogICAgICA6IF9uYW1lID0gbmFtZTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gX25hbWU7Cn0KCi8vLyBDb252ZXJ0ZXIgd2hpY2ggZXNjYXBlcyBjaGFyYWN0ZXJzIHdpdGggc3BlY2lhbCBtZWFuaW5nIGluIEhUTUwuCi8vLwovLy8gVGhlIGNvbnZlcnRlciBmaW5kcyBjaGFyYWN0ZXJzIHRoYXQgYXJlIHNpZ25pZmljYW50IGluIEhUTUwgc291cmNlIGFuZAovLy8gcmVwbGFjZXMgdGhlbSB3aXRoIGNvcnJlc3BvbmRpbmcgSFRNTCBlbnRpdGllcy4KLy8vCi8vLyBUaGUgY2hhcmFjdGVycyB0aGF0IG5lZWQgZXNjYXBpbmcgaW4gSFRNTCBhcmU6Ci8vLwovLy8gKiBgJmAgKGFtcGVyc2FuZCkgYWx3YXlzIG5lZWQgdG8gYmUgZXNjYXBlZC4KLy8vICogYDxgIChsZXNzIHRoYW4pIGFuZCAnPicgKGdyZWF0ZXIgdGhhbikgd2hlbiBpbnNpZGUgYW4gZWxlbWVudC4KLy8vICogYCJgIChxdW90ZSkgd2hlbiBpbnNpZGUgYSBkb3VibGUtcXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZS4KLy8vICogYCdgIChhcG9zdHJvcGhlKSB3aGVuIGluc2lkZSBhIHNpbmdsZS1xdW90ZWQgYXR0cmlidXRlIHZhbHVlLgovLy8gICAgICAgQXBvc3Ryb3BoZSBpcyBlc2NhcGVkIGFzIGAmIzM5O2AgaW5zdGVhZCBvZiBgJmFwb3M7YCBzaW5jZQovLy8gICAgICAgbm90IGFsbCBicm93c2VycyB1bmRlcnN0YW5kIGAmYXBvcztgLgovLy8gKiBgL2AgKHNsYXNoKSBpcyByZWNvbW1lbmRlZCB0byBiZSBlc2NhcGVkIGJlY2F1c2UgaXQgbWF5IGJlIHVzZWQKLy8vICAgICAgIHRvIHRlcm1pbmF0ZSBhbiBlbGVtZW50IGluIHNvbWUgSFRNTCBkaWFsZWN0cy4KLy8vCi8vLyBFc2NhcGluZyBgPmAgKGdyZWF0ZXIgdGhhbikgaXNuJ3QgbmVjZXNzYXJ5LCBidXQgdGhlIHJlc3VsdCBpcyBvZnRlbgovLy8gZm91bmQgdG8gYmUgZWFzaWVyIHRvIHJlYWQgaWYgZ3JlYXRlci10aGFuIGlzIGFsc28gZXNjYXBlZCB3aGVuZXZlcgovLy8gbGVzcy10aGFuIGlzLgpjbGFzcyBIdG1sRXNjYXBlIGV4dGVuZHMgQ29udmVydGVyPFN0cmluZywgU3RyaW5nPiB7CiAgLy8vIFRoZSBbSHRtbEVzY2FwZU1vZGVdIHVzZWQgYnkgdGhlIGNvbnZlcnRlci4KICBmaW5hbCBIdG1sRXNjYXBlTW9kZSBtb2RlOwoKICAvLy8gQ3JlYXRlIGNvbnZlcnRlciB0aGF0IGVzY2FwZXMgSFRNTCBjaGFyYWN0ZXJzLgogIC8vLwogIC8vLyBJZiBbbW9kZV0gaXMgcHJvdmlkZWQgYXMgZWl0aGVyIFtIdG1sRXNjYXBlTW9kZS5hdHRyaWJ1dGVdIG9yCiAgLy8vIFtIdG1sRXNjYXBlTW9kZS5lbGVtZW50XSwgb25seSB0aGUgY29ycmVzcG9uZGluZyBzdWJzZXQgb2YgSFRNTAogIC8vLyBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkLgogIC8vLyBUaGUgZGVmYXVsdCBpcyB0byBlc2NhcGUgYWxsIEhUTUwgY2hhcmFjdGVycy4KICBjb25zdCBIdG1sRXNjYXBlKFt0aGlzLm1vZGUgPSBIdG1sRXNjYXBlTW9kZS51bmtub3duXSk7CgogIFN0cmluZyBjb252ZXJ0KFN0cmluZyB0ZXh0KSB7CiAgICB2YXIgdmFsID0gX2NvbnZlcnQodGV4dCwgMCwgdGV4dC5sZW5ndGgpOwogICAgcmV0dXJuIHZhbCA9PSBudWxsID8gdGV4dCA6IHZhbDsKICB9CgogIC8vLyBDb252ZXJ0cyB0aGUgc3Vic3RyaW5nIG9mIHRleHQgZnJvbSBzdGFydCB0byBlbmQuCiAgLy8vCiAgLy8vIFJldHVybnMgYG51bGxgIGlmIG5vIGNoYW5nZXMgd2VyZSBuZWNlc3NhcnksIG90aGVyd2lzZSByZXR1cm5zCiAgLy8vIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLgogIFN0cmluZyBfY29udmVydChTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBTdHJpbmdCdWZmZXIgcmVzdWx0OwogICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgdmFyIGNoID0gdGV4dFtpXTsKICAgICAgU3RyaW5nIHJlcGxhY2VtZW50OwogICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgY2FzZSAnJic6CiAgICAgICAgICByZXBsYWNlbWVudCA9ICcmYW1wOyc7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICciJzoKICAgICAgICAgIGlmIChtb2RlLmVzY2FwZVF1b3QpIHJlcGxhY2VtZW50ID0gJyZxdW90Oyc7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICInIjoKICAgICAgICAgIGlmIChtb2RlLmVzY2FwZUFwb3MpIHJlcGxhY2VtZW50ID0gJyYjMzk7JzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJzwnOgogICAgICAgICAgaWYgKG1vZGUuZXNjYXBlTHRHdCkgcmVwbGFjZW1lbnQgPSAnJmx0Oyc7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICc+JzoKICAgICAgICAgIGlmIChtb2RlLmVzY2FwZUx0R3QpIHJlcGxhY2VtZW50ID0gJyZndDsnOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnLyc6CiAgICAgICAgICBpZiAobW9kZS5lc2NhcGVTbGFzaCkgcmVwbGFjZW1lbnQgPSAnJiM0NzsnOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHsKICAgICAgICByZXN1bHQgPz89IFN0cmluZ0J1ZmZlcigpOwogICAgICAgIGlmIChpID4gc3RhcnQpIHJlc3VsdC53cml0ZSh0ZXh0LnN1YnN0cmluZyhzdGFydCwgaSkpOwogICAgICAgIHJlc3VsdC53cml0ZShyZXBsYWNlbWVudCk7CiAgICAgICAgc3RhcnQgPSBpICsgMTsKICAgICAgfQogICAgfQogICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGlmIChlbmQgPiBzdGFydCkgcmVzdWx0LndyaXRlKHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKTsKICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKICB9CgogIFN0cmluZ0NvbnZlcnNpb25TaW5rIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxTdHJpbmc+IHNpbmspIHsKICAgIHJldHVybiBfSHRtbEVzY2FwZVNpbmsodGhpcywKICAgICAgICBzaW5rIGlzIFN0cmluZ0NvbnZlcnNpb25TaW5rID8gc2luayA6IFN0cmluZ0NvbnZlcnNpb25TaW5rLmZyb20oc2luaykpOwogIH0KfQoKY2xhc3MgX0h0bWxFc2NhcGVTaW5rIGV4dGVuZHMgU3RyaW5nQ29udmVyc2lvblNpbmtCYXNlIHsKICBmaW5hbCBIdG1sRXNjYXBlIF9lc2NhcGU7CiAgZmluYWwgU3RyaW5nQ29udmVyc2lvblNpbmsgX3Npbms7CgogIF9IdG1sRXNjYXBlU2luayh0aGlzLl9lc2NhcGUsIHRoaXMuX3NpbmspOwoKICB2b2lkIGFkZFNsaWNlKFN0cmluZyBjaHVuaywgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGlzTGFzdCkgewogICAgdmFyIHZhbCA9IF9lc2NhcGUuX2NvbnZlcnQoY2h1bmssIHN0YXJ0LCBlbmQpOwogICAgaWYgKHZhbCA9PSBudWxsKSB7CiAgICAgIF9zaW5rLmFkZFNsaWNlKGNodW5rLCBzdGFydCwgZW5kLCBpc0xhc3QpOwogICAgfSBlbHNlIHsKICAgICAgX3NpbmsuYWRkKHZhbCk7CiAgICAgIGlmIChpc0xhc3QpIF9zaW5rLmNsb3NlKCk7CiAgICB9CiAgfQoKICB2b2lkIGNsb3NlKCkgewogICAgX3NpbmsuY2xvc2UoKTsKICB9Cn0KgOEATk48ARYBRARNRioETU5HIwRMSSAETkxGLAEXBEoyHwQqQQRGKARRERcWASUZASUZASoZATYGT4DXGgE5BkseBkVBRig7AU0GQigGP0YhKj8BTQZCKAY/RiEsPwE+BkVBRgYmKD4BRyoBJQYcSEoYHx8fHyEWAR4CAUUESzQEMwQxRT9ERTBGOQRJSBI1Mh0BNQZERh40OgEgLiUEATgGRRw1GSgYGhQSIRESNxESNhESNRESNRESNxEIISM/IxcIBiU/HgQBQyFQBAIBORwkAS0BQTMXMQ0WIQYEARETBAIBHWRhcnQ6Y29udmVydC9odG1sX2VzY2FwZS5kYXJ0LW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb252ZXJ0L2pzb24uZGFydMAAiowvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvbnZlcnQ7CgovLy8gRXJyb3IgdGhyb3duIGJ5IEpTT04gc2VyaWFsaXphdGlvbiBpZiBhbiBvYmplY3QgY2Fubm90IGJlIHNlcmlhbGl6ZWQuCi8vLwovLy8gVGhlIFt1bnN1cHBvcnRlZE9iamVjdF0gZmllbGQgaG9sZHMgdGhhdCBvYmplY3QgdGhhdCBmYWlsZWQgdG8gYmUgc2VyaWFsaXplZC4KLy8vCi8vLyBJZiBhbiBvYmplY3QgaXNuJ3QgZGlyZWN0bHkgc2VyaWFsaXphYmxlLCB0aGUgc2VyaWFsaXplciBjYWxscyB0aGUgYHRvSnNvbmAKLy8vIG1ldGhvZCBvbiB0aGUgb2JqZWN0LiBJZiB0aGF0IGNhbGwgZmFpbHMsIHRoZSBlcnJvciB3aWxsIGJlIHN0b3JlZCBpbiB0aGUKLy8vIFtjYXVzZV0gZmllbGQuIElmIHRoZSBjYWxsIHJldHVybnMgYW4gb2JqZWN0IHRoYXQgaXNuJ3QgZGlyZWN0bHkKLy8vIHNlcmlhbGl6YWJsZSwgdGhlIFtjYXVzZV0gaXMgbnVsbC4KY2xhc3MgSnNvblVuc3VwcG9ydGVkT2JqZWN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7CiAgLy8vIFRoZSBvYmplY3QgdGhhdCBjb3VsZCBub3QgYmUgc2VyaWFsaXplZC4KICBmaW5hbCBPYmplY3QgdW5zdXBwb3J0ZWRPYmplY3Q7CgogIC8vLyBUaGUgZXhjZXB0aW9uIHRocm93biB3aGVuIHRyeWluZyB0byBjb252ZXJ0IHRoZSBvYmplY3QuCiAgZmluYWwgT2JqZWN0IGNhdXNlOwoKICAvLy8gVGhlIHBhcnRpYWwgcmVzdWx0IG9mIHRoZSBjb252ZXJzaW9uLCB1cCB1bnRpbCB0aGUgZXJyb3IgaGFwcGVuZWQuCiAgLy8vCiAgLy8vIE1heSBiZSBudWxsLgogIGZpbmFsIFN0cmluZyBwYXJ0aWFsUmVzdWx0OwoKICBKc29uVW5zdXBwb3J0ZWRPYmplY3RFcnJvcih0aGlzLnVuc3VwcG9ydGVkT2JqZWN0LAogICAgICB7dGhpcy5jYXVzZSwgdGhpcy5wYXJ0aWFsUmVzdWx0fSk7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHZhciBzYWZlU3RyaW5nID0gRXJyb3Iuc2FmZVRvU3RyaW5nKHVuc3VwcG9ydGVkT2JqZWN0KTsKICAgIFN0cmluZyBwcmVmaXg7CiAgICBpZiAoY2F1c2UgIT0gbnVsbCkgewogICAgICBwcmVmaXggPSAiQ29udmVydGluZyBvYmplY3QgdG8gYW4gZW5jb2RhYmxlIG9iamVjdCBmYWlsZWQ6IjsKICAgIH0gZWxzZSB7CiAgICAgIHByZWZpeCA9ICJDb252ZXJ0aW5nIG9iamVjdCBkaWQgbm90IHJldHVybiBhbiBlbmNvZGFibGUgb2JqZWN0OiI7CiAgICB9CiAgICByZXR1cm4gIiRwcmVmaXggJHNhZmVTdHJpbmciOwogIH0KfQoKLy8vIFJlcG9ydHMgdGhhdCBhbiBvYmplY3QgY291bGQgbm90IGJlIHN0cmluZ2lmaWVkIGR1ZSB0byBjeWNsaWMgcmVmZXJlbmNlcy4KLy8vCi8vLyBBbiBvYmplY3QgdGhhdCByZWZlcmVuY2VzIGl0c2VsZiBjYW5ub3QgYmUgc2VyaWFsaXplZCBieQovLy8gW0pzb25Db2RlYy5lbmNvZGVdL1tKc29uRW5jb2Rlci5jb252ZXJ0XS4KLy8vIFdoZW4gdGhlIGN5Y2xlIGlzIGRldGVjdGVkLCBhIFtKc29uQ3ljbGljRXJyb3JdIGlzIHRocm93bi4KY2xhc3MgSnNvbkN5Y2xpY0Vycm9yIGV4dGVuZHMgSnNvblVuc3VwcG9ydGVkT2JqZWN0RXJyb3IgewogIC8vLyBUaGUgZmlyc3Qgb2JqZWN0IHRoYXQgd2FzIGRldGVjdGVkIGFzIHBhcnQgb2YgYSBjeWNsZS4KICBKc29uQ3ljbGljRXJyb3IoT2JqZWN0IG9iamVjdCkgOiBzdXBlcihvYmplY3QpOwogIFN0cmluZyB0b1N0cmluZygpID0+ICJDeWNsaWMgZXJyb3IgaW4gSlNPTiBzdHJpbmdpZnkiOwp9CgovLy8gQW4gaW5zdGFuY2Ugb2YgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFtKc29uQ29kZWNdLgovLy8KLy8vIFRoaXMgaW5zdGFuY2UgcHJvdmlkZXMgYSBjb252ZW5pZW50IGFjY2VzcyB0byB0aGUgbW9zdCBjb21tb24gSlNPTgovLy8gdXNlIGNhc2VzLgovLy8KLy8vIEV4YW1wbGVzOgovLy8KLy8vICAgICB2YXIgZW5jb2RlZCA9IGpzb24uZW5jb2RlKFsxLCAyLCB7ICJhIjogbnVsbCB9XSk7Ci8vLyAgICAgdmFyIGRlY29kZWQgPSBqc29uLmRlY29kZSgnWyJmb28iLCB7ICJiYXIiOiA0OTkgfV0nKTsKLy8vCi8vLyBUaGUgdG9wLWxldmVsIFtqc29uRW5jb2RlXSBhbmQgW2pzb25EZWNvZGVdIGZ1bmN0aW9ucyBtYXkgYmUgdXNlZCBpbnN0ZWFkIGlmCi8vLyBhIGxvY2FsIHZhcmlhYmxlIHNoYWRvd3MgdGhlIFtqc29uXSBjb25zdGFudC4KY29uc3QgSnNvbkNvZGVjIGpzb24gPSBKc29uQ29kZWMoKTsKCi8vLyBDb252ZXJ0cyBbdmFsdWVdIHRvIGEgSlNPTiBzdHJpbmcuCi8vLwovLy8gSWYgdmFsdWUgY29udGFpbnMgb2JqZWN0cyB0aGF0IGFyZSBub3QgZGlyZWN0bHkgZW5jb2RhYmxlIHRvIGEgSlNPTgovLy8gc3RyaW5nIChhIHZhbHVlIHRoYXQgaXMgbm90IGEgbnVtYmVyLCBib29sZWFuLCBzdHJpbmcsIG51bGwsIGxpc3Qgb3IgYSBtYXAKLy8vIHdpdGggc3RyaW5nIGtleXMpLCB0aGUgW3RvRW5jb2RhYmxlXSBmdW5jdGlvbiBpcyB1c2VkIHRvIGNvbnZlcnQgaXQgdG8gYW4KLy8vIG9iamVjdCB0aGF0IG11c3QgYmUgZGlyZWN0bHkgZW5jb2RhYmxlLgovLy8KLy8vIElmIFt0b0VuY29kYWJsZV0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlCi8vLyByZXN1bHQgb2YgY2FsbGluZyBgLnRvSnNvbigpYCBvbiB0aGUgdW5lbmNvZGFibGUgb2JqZWN0LgovLy8KLy8vIFNob3J0aGFuZCBmb3IgW2pzb24uZW5jb2RlXS4gVXNlZnVsIGlmIGEgbG9jYWwgdmFyaWFibGUgc2hhZG93cyB0aGUgZ2xvYmFsCi8vLyBbanNvbl0gY29uc3RhbnQuClN0cmluZyBqc29uRW5jb2RlKE9iamVjdCBvYmplY3QsIHtPYmplY3QgdG9FbmNvZGFibGUoT2JqZWN0IG5vbkVuY29kYWJsZSl9KSA9PgogICAganNvbi5lbmNvZGUob2JqZWN0LCB0b0VuY29kYWJsZTogdG9FbmNvZGFibGUpOwoKLy8vIFBhcnNlcyB0aGUgc3RyaW5nIGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgSnNvbiBvYmplY3QuCi8vLwovLy8gVGhlIG9wdGlvbmFsIFtyZXZpdmVyXSBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBvYmplY3Qgb3IgbGlzdAovLy8gcHJvcGVydHkgdGhhdCBoYXMgYmVlbiBwYXJzZWQgZHVyaW5nIGRlY29kaW5nLiBUaGUgYGtleWAgYXJndW1lbnQgaXMgZWl0aGVyCi8vLyB0aGUgaW50ZWdlciBsaXN0IGluZGV4IGZvciBhIGxpc3QgcHJvcGVydHksIHRoZSBzdHJpbmcgbWFwIGtleSBmb3Igb2JqZWN0Ci8vLyBwcm9wZXJ0aWVzLCBvciBgbnVsbGAgZm9yIHRoZSBmaW5hbCByZXN1bHQuCi8vLwovLy8gVGhlIGRlZmF1bHQgW3Jldml2ZXJdICh3aGVuIG5vdCBwcm92aWRlZCkgaXMgdGhlIGlkZW50aXR5IGZ1bmN0aW9uLgovLy8KLy8vIFNob3J0aGFuZCBmb3IgW2pzb24uZGVjb2RlXS4gVXNlZnVsIGlmIGEgbG9jYWwgdmFyaWFibGUgc2hhZG93cyB0aGUgZ2xvYmFsCi8vLyBbanNvbl0gY29uc3RhbnQuCmR5bmFtaWMganNvbkRlY29kZShTdHJpbmcgc291cmNlLCB7T2JqZWN0IHJldml2ZXIoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKX0pID0+CiAgICBqc29uLmRlY29kZShzb3VyY2UsIHJldml2ZXI6IHJldml2ZXIpOwoKLy8vIEEgW0pzb25Db2RlY10gZW5jb2RlcyBKU09OIG9iamVjdHMgdG8gc3RyaW5ncyBhbmQgZGVjb2RlcyBzdHJpbmdzIHRvCi8vLyBKU09OIG9iamVjdHMuCi8vLwovLy8gRXhhbXBsZXM6Ci8vLwovLy8gICAgIHZhciBlbmNvZGVkID0ganNvbi5lbmNvZGUoWzEsIDIsIHsgImEiOiBudWxsIH1dKTsKLy8vICAgICB2YXIgZGVjb2RlZCA9IGpzb24uZGVjb2RlKCdbImZvbyIsIHsgImJhciI6IDQ5OSB9XScpOwpjbGFzcyBKc29uQ29kZWMgZXh0ZW5kcyBDb2RlYzxPYmplY3QsIFN0cmluZz4gewogIGZpbmFsIEZ1bmN0aW9uKE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgX3Jldml2ZXI7CiAgZmluYWwgRnVuY3Rpb24oZHluYW1pYykgX3RvRW5jb2RhYmxlOwoKICAvLy8gQ3JlYXRlcyBhIGBKc29uQ29kZWNgIHdpdGggdGhlIGdpdmVuIHJldml2ZXIgYW5kIGVuY29kaW5nIGZ1bmN0aW9uLgogIC8vLwogIC8vLyBUaGUgW3Jldml2ZXJdIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgZGVjb2RpbmcuIEl0IGlzIGludm9rZWQgb25jZSBmb3IKICAvLy8gZWFjaCBvYmplY3Qgb3IgbGlzdCBwcm9wZXJ0eSB0aGF0IGhhcyBiZWVuIHBhcnNlZC4KICAvLy8gVGhlIGBrZXlgIGFyZ3VtZW50IGlzIGVpdGhlciB0aGUgaW50ZWdlciBsaXN0IGluZGV4IGZvciBhIGxpc3QgcHJvcGVydHksCiAgLy8vIHRoZSBzdHJpbmcgbWFwIGtleSBmb3Igb2JqZWN0IHByb3BlcnRpZXMsIG9yIGBudWxsYCBmb3IgdGhlIGZpbmFsIHJlc3VsdC4KICAvLy8KICAvLy8gSWYgW3Jldml2ZXJdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgdmFsdWUgYXJndW1lbnQuCiAgLy8vCiAgLy8vIFRoZSBbdG9FbmNvZGFibGVdIGZ1bmN0aW9uIGlzIHVzZWQgZHVyaW5nIGVuY29kaW5nLiBJdCBpcyBpbnZva2VkIGZvcgogIC8vLyB2YWx1ZXMgdGhhdCBhcmUgbm90IGRpcmVjdGx5IGVuY29kYWJsZSB0byBhIHN0cmluZyAoYSB2YWx1ZSB0aGF0IGlzIG5vdCBhCiAgLy8vIG51bWJlciwgYm9vbGVhbiwgc3RyaW5nLCBudWxsLCBsaXN0IG9yIGEgbWFwIHdpdGggc3RyaW5nIGtleXMpLiBUaGUKICAvLy8gZnVuY3Rpb24gbXVzdCByZXR1cm4gYW4gb2JqZWN0IHRoYXQgaXMgZGlyZWN0bHkgZW5jb2RhYmxlLiBUaGUgZWxlbWVudHMgb2YKICAvLy8gYSByZXR1cm5lZCBsaXN0IGFuZCB2YWx1ZXMgb2YgYSByZXR1cm5lZCBtYXAgZG8gbm90IG5lZWQgdG8gYmUgZGlyZWN0bHkKICAvLy8gZW5jb2RhYmxlLCBhbmQgaWYgdGhleSBhcmVuJ3QsIGB0b0VuY29kYWJsZWAgd2lsbCBiZSB1c2VkIG9uIHRoZW0gYXMgd2VsbC4KICAvLy8gUGxlYXNlIG5vdGljZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGNhdXNlIGFuIGluZmluaXRlIHJlY3Vyc2l2ZSByZWdyZXNzCiAgLy8vIGluIHRoaXMgd2F5LCBieSBlZmZlY3RpdmVseSBjcmVhdGluZyBhbiBpbmZpbml0ZSBkYXRhIHN0cnVjdHVyZSB0aHJvdWdoCiAgLy8vIHJlcGVhdGVkIGNhbGwgdG8gYHRvRW5jb2RhYmxlYC4KICAvLy8KICAvLy8gSWYgW3RvRW5jb2RhYmxlXSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUKICAvLy8gcmVzdWx0IG9mIGNhbGxpbmcgYC50b0pzb24oKWAgb24gdGhlIHVuZW5jb2RhYmxlIG9iamVjdC4KICBjb25zdCBKc29uQ29kZWMoe3Jldml2ZXIoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSwgdG9FbmNvZGFibGUodmFyIG9iamVjdCl9KQogICAgICA6IF9yZXZpdmVyID0gcmV2aXZlciwKICAgICAgICBfdG9FbmNvZGFibGUgPSB0b0VuY29kYWJsZTsKCiAgLy8vIENyZWF0ZXMgYSBgSnNvbkNvZGVjYCB3aXRoIHRoZSBnaXZlbiByZXZpdmVyLgogIC8vLwogIC8vLyBUaGUgW3Jldml2ZXJdIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIG9iamVjdCBvciBsaXN0IHByb3BlcnR5CiAgLy8vIHRoYXQgaGFzIGJlZW4gcGFyc2VkIGR1cmluZyBkZWNvZGluZy4gVGhlIGBrZXlgIGFyZ3VtZW50IGlzIGVpdGhlciB0aGUKICAvLy8gaW50ZWdlciBsaXN0IGluZGV4IGZvciBhIGxpc3QgcHJvcGVydHksIHRoZSBzdHJpbmcgbWFwIGtleSBmb3Igb2JqZWN0CiAgLy8vIHByb3BlcnRpZXMsIG9yIGBudWxsYCBmb3IgdGhlIGZpbmFsIHJlc3VsdC4KICBKc29uQ29kZWMud2l0aFJldml2ZXIocmV2aXZlcihPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpKQogICAgICA6IHRoaXMocmV2aXZlcjogcmV2aXZlcik7CgogIC8vLyBQYXJzZXMgdGhlIHN0cmluZyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIEpzb24gb2JqZWN0LgogIC8vLwogIC8vLyBUaGUgb3B0aW9uYWwgW3Jldml2ZXJdIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIG9iamVjdCBvciBsaXN0CiAgLy8vIHByb3BlcnR5IHRoYXQgaGFzIGJlZW4gcGFyc2VkIGR1cmluZyBkZWNvZGluZy4gVGhlIGBrZXlgIGFyZ3VtZW50IGlzIGVpdGhlcgogIC8vLyB0aGUgaW50ZWdlciBsaXN0IGluZGV4IGZvciBhIGxpc3QgcHJvcGVydHksIHRoZSBzdHJpbmcgbWFwIGtleSBmb3Igb2JqZWN0CiAgLy8vIHByb3BlcnRpZXMsIG9yIGBudWxsYCBmb3IgdGhlIGZpbmFsIHJlc3VsdC4KICAvLy8KICAvLy8gVGhlIGRlZmF1bHQgW3Jldml2ZXJdICh3aGVuIG5vdCBwcm92aWRlZCkgaXMgdGhlIGlkZW50aXR5IGZ1bmN0aW9uLgogIGR5bmFtaWMgZGVjb2RlKFN0cmluZyBzb3VyY2UsIHtyZXZpdmVyKE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSl9KSB7CiAgICByZXZpdmVyID8/PSBfcmV2aXZlcjsKICAgIGlmIChyZXZpdmVyID09IG51bGwpIHJldHVybiBkZWNvZGVyLmNvbnZlcnQoc291cmNlKTsKICAgIHJldHVybiBKc29uRGVjb2RlcihyZXZpdmVyKS5jb252ZXJ0KHNvdXJjZSk7CiAgfQoKICAvLy8gQ29udmVydHMgW3ZhbHVlXSB0byBhIEpTT04gc3RyaW5nLgogIC8vLwogIC8vLyBJZiB2YWx1ZSBjb250YWlucyBvYmplY3RzIHRoYXQgYXJlIG5vdCBkaXJlY3RseSBlbmNvZGFibGUgdG8gYSBKU09OCiAgLy8vIHN0cmluZyAoYSB2YWx1ZSB0aGF0IGlzIG5vdCBhIG51bWJlciwgYm9vbGVhbiwgc3RyaW5nLCBudWxsLCBsaXN0IG9yIGEgbWFwCiAgLy8vIHdpdGggc3RyaW5nIGtleXMpLCB0aGUgW3RvRW5jb2RhYmxlXSBmdW5jdGlvbiBpcyB1c2VkIHRvIGNvbnZlcnQgaXQgdG8gYW4KICAvLy8gb2JqZWN0IHRoYXQgbXVzdCBiZSBkaXJlY3RseSBlbmNvZGFibGUuCiAgLy8vCiAgLy8vIElmIFt0b0VuY29kYWJsZV0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlCiAgLy8vIHJlc3VsdCBvZiBjYWxsaW5nIGAudG9Kc29uKClgIG9uIHRoZSB1bmVuY29kYWJsZSBvYmplY3QuCiAgU3RyaW5nIGVuY29kZShPYmplY3QgdmFsdWUsIHt0b0VuY29kYWJsZShvYmplY3QpfSkgewogICAgdG9FbmNvZGFibGUgPz89IF90b0VuY29kYWJsZTsKICAgIGlmICh0b0VuY29kYWJsZSA9PSBudWxsKSByZXR1cm4gZW5jb2Rlci5jb252ZXJ0KHZhbHVlKTsKICAgIHJldHVybiBKc29uRW5jb2Rlcih0b0VuY29kYWJsZSkuY29udmVydCh2YWx1ZSk7CiAgfQoKICBKc29uRW5jb2RlciBnZXQgZW5jb2RlciB7CiAgICBpZiAoX3RvRW5jb2RhYmxlID09IG51bGwpIHJldHVybiBjb25zdCBKc29uRW5jb2RlcigpOwogICAgcmV0dXJuIEpzb25FbmNvZGVyKF90b0VuY29kYWJsZSk7CiAgfQoKICBKc29uRGVjb2RlciBnZXQgZGVjb2RlciB7CiAgICBpZiAoX3Jldml2ZXIgPT0gbnVsbCkgcmV0dXJuIGNvbnN0IEpzb25EZWNvZGVyKCk7CiAgICByZXR1cm4gSnNvbkRlY29kZXIoX3Jldml2ZXIpOwogIH0KfQoKLy8vIFRoaXMgY2xhc3MgY29udmVydHMgSlNPTiBvYmplY3RzIHRvIHN0cmluZ3MuCmNsYXNzIEpzb25FbmNvZGVyIGV4dGVuZHMgQ29udmVydGVyPE9iamVjdCwgU3RyaW5nPiB7CiAgLy8vIFRoZSBzdHJpbmcgdXNlZCBmb3IgaW5kZW50aW9uLgogIC8vLwogIC8vLyBXaGVuIGdlbmVyYXRpbmcgbXVsdGktbGluZSBvdXRwdXQsIHRoaXMgc3RyaW5nIGlzIGluc2VydGVkIG9uY2UgYXQgdGhlCiAgLy8vIGJlZ2lubmluZyBvZiBlYWNoIGluZGVudGVkIGxpbmUgZm9yIGVhY2ggbGV2ZWwgb2YgaW5kZW50YXRpb24uCiAgLy8vCiAgLy8vIElmIGBudWxsYCwgdGhlIG91dHB1dCBpcyBlbmNvZGVkIGFzIGEgc2luZ2xlIGxpbmUuCiAgZmluYWwgU3RyaW5nIGluZGVudDsKCiAgLy8vIEZ1bmN0aW9uIGNhbGxlZCBvbiBub24tZW5jb2RhYmxlIG9iamVjdHMgdG8gcmV0dXJuIGEgcmVwbGFjZW1lbnQKICAvLy8gZW5jb2RhYmxlIG9iamVjdCB0aGF0IHdpbGwgYmUgZW5jb2RlZCBpbiB0aGUgb3JpZ25hbCdzIHBsYWNlLgogIGZpbmFsIEZ1bmN0aW9uKGR5bmFtaWMpIF90b0VuY29kYWJsZTsKCiAgLy8vIENyZWF0ZXMgYSBKU09OIGVuY29kZXIuCiAgLy8vCiAgLy8vIFRoZSBKU09OIGVuY29kZXIgaGFuZGxlcyBudW1iZXJzLCBzdHJpbmdzLCBib29sZWFucywgbnVsbCwgbGlzdHMgYW5kCiAgLy8vIG1hcHMgd2l0aCBzdHJpbmcga2V5cyBkaXJlY3RseS4KICAvLy8KICAvLy8gQW55IG90aGVyIG9iamVjdCBpcyBhdHRlbXB0ZWQgY29udmVydGVkIGJ5IFt0b0VuY29kYWJsZV0gdG8gYW4KICAvLy8gb2JqZWN0IHRoYXQgaXMgb2Ygb25lIG9mIHRoZSBjb252ZXJ0aWJsZSB0eXBlcy4KICAvLy8KICAvLy8gSWYgW3RvRW5jb2RhYmxlXSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBjYWxsaW5nIGAudG9Kc29uKClgIG9uCiAgLy8vIHRoZSBvYmplY3QuCiAgY29uc3QgSnNvbkVuY29kZXIoW3RvRW5jb2RhYmxlKG9iamVjdCldKQogICAgICA6IGluZGVudCA9IG51bGwsCiAgICAgICAgX3RvRW5jb2RhYmxlID0gdG9FbmNvZGFibGU7CgogIC8vLyBDcmVhdGVzIGEgSlNPTiBlbmNvZGVyIHRoYXQgY3JlYXRlcyBtdWx0aS1saW5lIEpTT04uCiAgLy8vCiAgLy8vIFRoZSBlbmNvZGluZyBvZiBlbGVtZW50cyBvZiBsaXN0cyBhbmQgbWFwcyBhcmUgaW5kZW50ZWQgYW5kIHB1dCBvbiBzZXBhcmF0ZQogIC8vLyBsaW5lcy4gVGhlIFtpbmRlbnRdIHN0cmluZyBpcyBwcmVwZW5kZWQgdG8gdGhlc2UgZWxlbWVudHMsIG9uY2UgZm9yIGVhY2gKICAvLy8gbGV2ZWwgb2YgaW5kZW50YXRpb24uCiAgLy8vCiAgLy8vIElmIFtpbmRlbnRdIGlzIGBudWxsYCwgdGhlIG91dHB1dCBpcyBlbmNvZGVkIGFzIGEgc2luZ2xlIGxpbmUuCiAgLy8vCiAgLy8vIFRoZSBKU09OIGVuY29kZXIgaGFuZGxlcyBudW1iZXJzLCBzdHJpbmdzLCBib29sZWFucywgbnVsbCwgbGlzdHMgYW5kCiAgLy8vIG1hcHMgd2l0aCBzdHJpbmcga2V5cyBkaXJlY3RseS4KICAvLy8KICAvLy8gQW55IG90aGVyIG9iamVjdCBpcyBhdHRlbXB0ZWQgY29udmVydGVkIGJ5IFt0b0VuY29kYWJsZV0gdG8gYW4KICAvLy8gb2JqZWN0IHRoYXQgaXMgb2Ygb25lIG9mIHRoZSBjb252ZXJ0aWJsZSB0eXBlcy4KICAvLy8KICAvLy8gSWYgW3RvRW5jb2RhYmxlXSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBjYWxsaW5nIGAudG9Kc29uKClgIG9uCiAgLy8vIHRoZSBvYmplY3QuCiAgY29uc3QgSnNvbkVuY29kZXIud2l0aEluZGVudCh0aGlzLmluZGVudCwgW3RvRW5jb2RhYmxlKG9iamVjdCldKQogICAgICA6IF90b0VuY29kYWJsZSA9IHRvRW5jb2RhYmxlOwoKICAvLy8gQ29udmVydHMgW29iamVjdF0gdG8gYSBKU09OIFtTdHJpbmddLgogIC8vLwogIC8vLyBEaXJlY3RseSBzZXJpYWxpemFibGUgdmFsdWVzIGFyZSBbbnVtXSwgW1N0cmluZ10sIFtib29sXSwgYW5kIFtOdWxsXSwgYXMKICAvLy8gd2VsbCBhcyBzb21lIFtMaXN0XSBhbmQgW01hcF0gdmFsdWVzLiBGb3IgW0xpc3RdLCB0aGUgZWxlbWVudHMgbXVzdCBhbGwgYmUKICAvLy8gc2VyaWFsaXphYmxlLiBGb3IgW01hcF0sIHRoZSBrZXlzIG11c3QgYmUgW1N0cmluZ10gYW5kIHRoZSB2YWx1ZXMgbXVzdCBiZQogIC8vLyBzZXJpYWxpemFibGUuCiAgLy8vCiAgLy8vIElmIGEgdmFsdWUgb2YgYW55IG90aGVyIHR5cGUgaXMgYXR0ZW1wdGVkIHRvIGJlIHNlcmlhbGl6ZWQsIHRoZQogIC8vLyBgdG9FbmNvZGFibGVgIGZ1bmN0aW9uIHByb3ZpZGVkIGluIHRoZSBjb25zdHJ1Y3RvciBpcyBjYWxsZWQgd2l0aCB0aGUgdmFsdWUKICAvLy8gYXMgYXJndW1lbnQuIFRoZSByZXN1bHQsIHdoaWNoIG11c3QgYmUgYSBkaXJlY3RseSBzZXJpYWxpemFibGUgdmFsdWUsIGlzCiAgLy8vIHNlcmlhbGl6ZWQgaW5zdGVhZCBvZiB0aGUgb3JpZ2luYWwgdmFsdWUuCiAgLy8vCiAgLy8vIElmIHRoZSBjb252ZXJzaW9uIHRocm93cywgb3IgcmV0dXJucyBhIHZhbHVlIHRoYXQgaXMgbm90IGRpcmVjdGx5CiAgLy8vIHNlcmlhbGl6YWJsZSwgYSBbSnNvblVuc3VwcG9ydGVkT2JqZWN0RXJyb3JdIGV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgLy8vIElmIHRoZSBjYWxsIHRocm93cywgdGhlIGVycm9yIGlzIGNhdWdodCBhbmQgc3RvcmVkIGluIHRoZQogIC8vLyBbSnNvblVuc3VwcG9ydGVkT2JqZWN0RXJyb3JdJ3MgWzpjYXVzZTpdIGZpZWxkLgogIC8vLwogIC8vLyBJZiBhIFtMaXN0XSBvciBbTWFwXSBjb250YWlucyBhIHJlZmVyZW5jZSB0byBpdHNlbGYsIGRpcmVjdGx5IG9yIHRocm91Z2gKICAvLy8gb3RoZXIgbGlzdHMgb3IgbWFwcywgaXQgY2Fubm90IGJlIHNlcmlhbGl6ZWQgYW5kIGEgW0pzb25DeWNsaWNFcnJvcl0gaXMKICAvLy8gdGhyb3duLgogIC8vLwogIC8vLyBbb2JqZWN0XSBzaG91bGQgbm90IGNoYW5nZSBkdXJpbmcgc2VyaWFsaXphdGlvbi4KICAvLy8KICAvLy8gSWYgYW4gb2JqZWN0IGlzIHNlcmlhbGl6ZWQgbW9yZSB0aGFuIG9uY2UsIFtjb252ZXJ0XSBtYXkgY2FjaGUgdGhlIHRleHQKICAvLy8gZm9yIGl0LiBJbiBvdGhlciB3b3JkcywgaWYgdGhlIGNvbnRlbnQgb2YgYW4gb2JqZWN0IGNoYW5nZXMgYWZ0ZXIgaXQgaXMKICAvLy8gZmlyc3Qgc2VyaWFsaXplZCwgdGhlIG5ldyB2YWx1ZXMgbWF5IG5vdCBiZSByZWZsZWN0ZWQgaW4gdGhlIHJlc3VsdC4KICBTdHJpbmcgY29udmVydChPYmplY3Qgb2JqZWN0KSA9PgogICAgICBfSnNvblN0cmluZ1N0cmluZ2lmaWVyLnN0cmluZ2lmeShvYmplY3QsIF90b0VuY29kYWJsZSwgaW5kZW50KTsKCiAgLy8vIFN0YXJ0cyBhIGNodW5rZWQgY29udmVyc2lvbi4KICAvLy8KICAvLy8gVGhlIGNvbnZlcnRlciB3b3JrcyBtb3JlIGVmZmljaWVudGx5IGlmIHRoZSBnaXZlbiBbc2lua10gaXMgYQogIC8vLyBbU3RyaW5nQ29udmVyc2lvblNpbmtdLgogIC8vLwogIC8vLyBSZXR1cm5zIGEgY2h1bmtlZC1jb252ZXJzaW9uIHNpbmsgdGhhdCBhY2NlcHRzIGF0IG1vc3Qgb25lIG9iamVjdC4gSXQgaXMKICAvLy8gYW4gZXJyb3IgdG8gaW52b2tlIGBhZGRgIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSByZXR1cm5lZCBzaW5rLgogIENodW5rZWRDb252ZXJzaW9uU2luazxPYmplY3Q+IHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxTdHJpbmc+IHNpbmspIHsKICAgIGlmIChzaW5rIGlzIF9VdGY4RW5jb2RlclNpbmspIHsKICAgICAgcmV0dXJuIF9Kc29uVXRmOEVuY29kZXJTaW5rKAogICAgICAgICAgc2luay5fc2luaywKICAgICAgICAgIF90b0VuY29kYWJsZSwKICAgICAgICAgIEpzb25VdGY4RW5jb2Rlci5fdXRmOEVuY29kZShpbmRlbnQpLAogICAgICAgICAgSnNvblV0ZjhFbmNvZGVyLl9kZWZhdWx0QnVmZmVyU2l6ZSk7CiAgICB9CiAgICByZXR1cm4gX0pzb25FbmNvZGVyU2luaygKICAgICAgICBzaW5rIGlzIFN0cmluZ0NvbnZlcnNpb25TaW5rID8gc2luayA6IFN0cmluZ0NvbnZlcnNpb25TaW5rLmZyb20oc2luayksCiAgICAgICAgX3RvRW5jb2RhYmxlLAogICAgICAgIGluZGVudCk7CiAgfQoKICAvLyBPdmVycmlkZSB0aGUgYmFzZSBjbGFzcydzIGJpbmQsIHRvIHByb3ZpZGUgYSBiZXR0ZXIgdHlwZS4KICBTdHJlYW08U3RyaW5nPiBiaW5kKFN0cmVhbTxPYmplY3Q+IHN0cmVhbSkgPT4gc3VwZXIuYmluZChzdHJlYW0pOwoKICBDb252ZXJ0ZXI8T2JqZWN0LCBUPiBmdXNlPFQ+KENvbnZlcnRlcjxTdHJpbmcsIFQ+IG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMgVXRmOEVuY29kZXIgJiYgVCBpcyBMaXN0PGludD4pIHsKICAgICAgLy8gVGhlIGluc3RhbmNlIGNoZWNrIGd1YXJhbnRlZXMgdGhhdCBgVGAgaXMgKGEgc3VidHlwZSBvZikgTGlzdDxpbnQ+LAogICAgICAvLyBidXQgdGhlIHN0YXRpYyB0eXBlIHN5c3RlbSBkb2Vzbid0IGtub3cgdGhhdCwgYW5kIHNvIHdlIGNhc3QuCiAgICAgIC8vIENhc3QgdGhyb3VnaCBkeW5hbWljIHRvIGtlZXAgdGhlIGNhc3QgaW1wbGljaXQgZm9yIGJ1aWxkcyB1c2luZwogICAgICAvLyB1bmNoZWNrZWQgaW1wbGljaXQgY2FzdHMuCiAgICAgIHJldHVybiBKc29uVXRmOEVuY29kZXIoaW5kZW50LCBfdG9FbmNvZGFibGUpIGFzIGR5bmFtaWM7CiAgICB9CiAgICByZXR1cm4gc3VwZXIuZnVzZTxUPihvdGhlcik7CiAgfQp9CgovLy8gRW5jb2RlciB0aGF0IGVuY29kZXMgYSBzaW5nbGUgb2JqZWN0IGFzIGEgVVRGLTggZW5jb2RlZCBKU09OIHN0cmluZy4KLy8vCi8vLyBUaGlzIGVuY29kZXIgd29ya3MgZXF1aXZhbGVudGx5IHRvIGZpcnN0IGNvbnZlcnRpbmcgdGhlIG9iamVjdCB0bwovLy8gYSBKU09OIHN0cmluZywgYW5kIHRoZW4gVVRGLTggZW5jb2RpbmcgdGhlIHN0cmluZywgYnV0IHdpdGhvdXQKLy8vIGNyZWF0aW5nIGFuIGludGVybWVkaWF0ZSBzdHJpbmcuCmNsYXNzIEpzb25VdGY4RW5jb2RlciBleHRlbmRzIENvbnZlcnRlcjxPYmplY3QsIExpc3Q8aW50Pj4gewogIC8vLyBEZWZhdWx0IGJ1ZmZlciBzaXplIHVzZWQgYnkgdGhlIEpTT04tdG8tVVRGLTggZW5jb2Rlci4KICBzdGF0aWMgY29uc3QgaW50IF9kZWZhdWx0QnVmZmVyU2l6ZSA9IDI1NjsKICBAZGVwcmVjYXRlZAogIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IF9kZWZhdWx0QnVmZmVyU2l6ZTsKCiAgLy8vIEluZGVudGF0aW9uIHVzZWQgaW4gcHJldHR5LXByaW50IG1vZGUsIGBudWxsYCBpZiBub3QgcHJldHR5LgogIGZpbmFsIExpc3Q8aW50PiBfaW5kZW50OwoKICAvLy8gRnVuY3Rpb24gY2FsbGVkIHdpdGggZWFjaCB1bi1lbmNvZGFibGUgb2JqZWN0IGVuY291bnRlcmVkLgogIGZpbmFsIEZ1bmN0aW9uKGR5bmFtaWMpIF90b0VuY29kYWJsZTsKCiAgLy8vIFVURi04IGJ1ZmZlciBzaXplLgogIGZpbmFsIGludCBfYnVmZmVyU2l6ZTsKCiAgLy8vIENyZWF0ZSBjb252ZXJ0ZXIuCiAgLy8vCiAgLy8vIElmIFtpbmRlbnRdIGlzIG5vbi1gbnVsbGAsIHRoZSBjb252ZXJ0ZXIgYXR0ZW1wdHMgdG8gInByZXR0eS1wcmludCIgdGhlCiAgLy8vIEpTT04sIGFuZCB1c2VzIGBpbmRlbnRgIGFzIHRoZSBpbmRlbnRhdGlvbi4gT3RoZXJ3aXNlIHRoZSByZXN1bHQgaGFzIG5vCiAgLy8vIHdoaXRlc3BhY2Ugb3V0c2lkZSBvZiBzdHJpbmcgbGl0ZXJhbHMuCiAgLy8vIElmIGBpbmRlbnRgIGNvbnRhaW5zIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IHZhbGlkIEpTT04gd2hpdGVzcGFjZQogIC8vLyBjaGFyYWN0ZXJzLCB0aGUgcmVzdWx0IHdpbGwgbm90IGJlIHZhbGlkIEpTT04uIEpTT04gd2hpdGVzcGFjZSBjaGFyYWN0ZXJzCiAgLy8vIGFyZSBzcGFjZSAoVSswMDIwKSwgdGFiIChVKzAwMDkpLCBsaW5lIGZlZWQgKFUrMDAwYSkgYW5kIGNhcnJpYWdlIHJldHVybgogIC8vLyAoVSswMDBkKSAoW0VDTUEKICAvLy8gNDA0XShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvcHVibGljYXRpb25zL3N0YW5kYXJkcy9FY21hLTQwNC5odG0pKS4KICAvLy8KICAvLy8gVGhlIFtidWZmZXJTaXplXSBpcyB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJuYWwgYnVmZmVycyB1c2VkIHRvIGNvbGxlY3QKICAvLy8gVVRGLTggY29kZSB1bml0cy4KICAvLy8gSWYgdXNpbmcgW3N0YXJ0Q2h1bmtlZENvbnZlcnNpb25dLCBpdCB3aWxsIGJlIHRoZSBzaXplIG9mIHRoZSBjaHVua3MuCiAgLy8vCiAgLy8vIFRoZSBKU09OIGVuY29kZXIgaGFuZGxlcyBudW1iZXJzLCBzdHJpbmdzLCBib29sZWFucywgbnVsbCwgbGlzdHMgYW5kIG1hcHMKICAvLy8gZGlyZWN0bHkuCiAgLy8vCiAgLy8vIEFueSBvdGhlciBvYmplY3QgaXMgYXR0ZW1wdGVkIGNvbnZlcnRlZCBieSBbdG9FbmNvZGFibGVdIHRvIGFuIG9iamVjdCB0aGF0CiAgLy8vIGlzIG9mIG9uZSBvZiB0aGUgY29udmVydGlibGUgdHlwZXMuCiAgLy8vCiAgLy8vIElmIFt0b0VuY29kYWJsZV0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gY2FsbGluZyBgLnRvSnNvbigpYCBvbiB0aGUKICAvLy8gb2JqZWN0LgogIEpzb25VdGY4RW5jb2RlcigKICAgICAgW1N0cmluZyBpbmRlbnQsIHRvRW5jb2RhYmxlKG9iamVjdCksIGludCBidWZmZXJTaXplID0gX2RlZmF1bHRCdWZmZXJTaXplXSkKICAgICAgOiBfaW5kZW50ID0gX3V0ZjhFbmNvZGUoaW5kZW50KSwKICAgICAgICBfdG9FbmNvZGFibGUgPSB0b0VuY29kYWJsZSwKICAgICAgICBfYnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemU7CgogIHN0YXRpYyBMaXN0PGludD4gX3V0ZjhFbmNvZGUoU3RyaW5nIHN0cmluZykgewogICAgaWYgKHN0cmluZyA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGlmIChzdHJpbmcuaXNFbXB0eSkgcmV0dXJuIFVpbnQ4TGlzdCgwKTsKICAgIGNoZWNrQXNjaWk6CiAgICB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKHN0cmluZy5jb2RlVW5pdEF0KGkpID49IDB4ODApIGJyZWFrIGNoZWNrQXNjaWk7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0cmluZy5jb2RlVW5pdHM7CiAgICB9CiAgICByZXR1cm4gdXRmOC5lbmNvZGUoc3RyaW5nKTsKICB9CgogIC8vLyBDb252ZXJ0IFtvYmplY3RdIGludG8gVVRGLTggZW5jb2RlZCBKU09OLgogIExpc3Q8aW50PiBjb252ZXJ0KE9iamVjdCBvYmplY3QpIHsKICAgIHZhciBieXRlcyA9IDxMaXN0PGludD4+W107CiAgICAvLyBUaGUgYHN0cmluZ2lmeWAgZnVuY3Rpb24gYWx3YXlzIGNvbnZlcnRzIGludG8gY2h1bmtzLgogICAgLy8gQ29sbGVjdCB0aGUgY2h1bmtzIGludG8gdGhlIGBieXRlc2AgbGlzdCwgdGhlbiBjb21iaW5lIHRoZW0gYWZ0ZXJ3YXJkcy4KICAgIHZvaWQgYWRkQ2h1bmsoVWludDhMaXN0IGNodW5rLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgaWYgKHN0YXJ0ID4gMCB8fCBlbmQgPCBjaHVuay5sZW5ndGgpIHsKICAgICAgICB2YXIgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICAgICAgY2h1bmsgPQogICAgICAgICAgICBVaW50OExpc3QudmlldyhjaHVuay5idWZmZXIsIGNodW5rLm9mZnNldEluQnl0ZXMgKyBzdGFydCwgbGVuZ3RoKTsKICAgICAgfQogICAgICBieXRlcy5hZGQoY2h1bmspOwogICAgfQoKICAgIF9Kc29uVXRmOFN0cmluZ2lmaWVyLnN0cmluZ2lmeSgKICAgICAgICBvYmplY3QsIF9pbmRlbnQsIF90b0VuY29kYWJsZSwgX2J1ZmZlclNpemUsIGFkZENodW5rKTsKICAgIGlmIChieXRlcy5sZW5ndGggPT0gMSkgcmV0dXJuIGJ5dGVzWzBdOwogICAgdmFyIGxlbmd0aCA9IDA7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxlbmd0aCArPSBieXRlc1tpXS5sZW5ndGg7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gVWludDhMaXN0KGxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gMCwgb2Zmc2V0ID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBieXRlTGlzdCA9IGJ5dGVzW2ldOwogICAgICBpbnQgZW5kID0gb2Zmc2V0ICsgYnl0ZUxpc3QubGVuZ3RoOwogICAgICByZXN1bHQuc2V0UmFuZ2Uob2Zmc2V0LCBlbmQsIGJ5dGVMaXN0KTsKICAgICAgb2Zmc2V0ID0gZW5kOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBTdGFydCBhIGNodW5rZWQgY29udmVyc2lvbi4KICAvLy8KICAvLy8gT25seSBvbmUgb2JqZWN0IGNhbiBiZSBwYXNzZWQgaW50byB0aGUgcmV0dXJuZWQgc2luay4KICAvLy8KICAvLy8gVGhlIGFyZ3VtZW50IFtzaW5rXSB3aWxsIHJlY2VpdmUgYnl0ZSBsaXN0cyBpbiBzaXplcyBkZXBlbmRpbmcgb24gdGhlCiAgLy8vIGBidWZmZXJTaXplYCBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIHdoZW4gY3JlYXRpbmcgdGhpcyBlbmNvZGVyLgogIENodW5rZWRDb252ZXJzaW9uU2luazxPYmplY3Q+IHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxMaXN0PGludD4+IHNpbmspIHsKICAgIEJ5dGVDb252ZXJzaW9uU2luayBieXRlU2luazsKICAgIGlmIChzaW5rIGlzIEJ5dGVDb252ZXJzaW9uU2luaykgewogICAgICBieXRlU2luayA9IHNpbms7CiAgICB9IGVsc2UgewogICAgICBieXRlU2luayA9IEJ5dGVDb252ZXJzaW9uU2luay5mcm9tKHNpbmspOwogICAgfQogICAgcmV0dXJuIF9Kc29uVXRmOEVuY29kZXJTaW5rKGJ5dGVTaW5rLCBfdG9FbmNvZGFibGUsIF9pbmRlbnQsIF9idWZmZXJTaXplKTsKICB9CgogIC8vIE92ZXJyaWRlIHRoZSBiYXNlIGNsYXNzJ3MgYmluZCwgdG8gcHJvdmlkZSBhIGJldHRlciB0eXBlLgogIFN0cmVhbTxMaXN0PGludD4+IGJpbmQoU3RyZWFtPE9iamVjdD4gc3RyZWFtKSB7CiAgICByZXR1cm4gc3VwZXIuYmluZChzdHJlYW0pOwogIH0KfQoKLy8vIEltcGxlbWVudHMgdGhlIGNodW5rZWQgY29udmVyc2lvbiBmcm9tIG9iamVjdCB0byBpdHMgSlNPTiByZXByZXNlbnRhdGlvbi4KLy8vCi8vLyBUaGUgc2luayBvbmx5IGFjY2VwdHMgb25lIHZhbHVlLCBidXQgd2lsbCBwcm9kdWNlIG91dHB1dCBpbiBhIGNodW5rZWQgd2F5LgpjbGFzcyBfSnNvbkVuY29kZXJTaW5rIGV4dGVuZHMgQ2h1bmtlZENvbnZlcnNpb25TaW5rPE9iamVjdD4gewogIGZpbmFsIFN0cmluZyBfaW5kZW50OwogIGZpbmFsIEZ1bmN0aW9uKGR5bmFtaWMpIF90b0VuY29kYWJsZTsKICBmaW5hbCBTdHJpbmdDb252ZXJzaW9uU2luayBfc2luazsKICBib29sIF9pc0RvbmUgPSBmYWxzZTsKCiAgX0pzb25FbmNvZGVyU2luayh0aGlzLl9zaW5rLCB0aGlzLl90b0VuY29kYWJsZSwgdGhpcy5faW5kZW50KTsKCiAgLy8vIEVuY29kZXMgdGhlIGdpdmVuIG9iamVjdCBbb10uCiAgLy8vCiAgLy8vIEl0IGlzIGFuIGVycm9yIHRvIGludm9rZSB0aGlzIG1ldGhvZCBtb3JlIHRoYW4gb25jZSBvbiBhbnkgaW5zdGFuY2UuIFdoaWxlCiAgLy8vIHRoaXMgbWFrZXMgdGhlIGlucHV0IGVmZmVjdGl2ZWx5IG5vbi1jaHVua2VkIHRoZSBvdXRwdXQgd2lsbCBiZSBnZW5lcmF0ZWQKICAvLy8gaW4gYSBjaHVua2VkIHdheS4KICB2b2lkIGFkZChPYmplY3QgbykgewogICAgaWYgKF9pc0RvbmUpIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcigiT25seSBvbmUgY2FsbCB0byBhZGQgYWxsb3dlZCIpOwogICAgfQogICAgX2lzRG9uZSA9IHRydWU7CiAgICB2YXIgc3RyaW5nU2luayA9IF9zaW5rLmFzU3RyaW5nU2luaygpOwogICAgX0pzb25TdHJpbmdTdHJpbmdpZmllci5wcmludE9uKG8sIHN0cmluZ1NpbmssIF90b0VuY29kYWJsZSwgX2luZGVudCk7CiAgICBzdHJpbmdTaW5rLmNsb3NlKCk7CiAgfQoKICB2b2lkIGNsb3NlKCkgey8qIGRvIG5vdGhpbmcgKi99Cn0KCi8vLyBTaW5rIHJldHVybmVkIHdoZW4gc3RhcnRpbmcgYSBjaHVua2VkIGNvbnZlcnNpb24gZnJvbSBvYmplY3QgdG8gYnl0ZXMuCmNsYXNzIF9Kc29uVXRmOEVuY29kZXJTaW5rIGV4dGVuZHMgQ2h1bmtlZENvbnZlcnNpb25TaW5rPE9iamVjdD4gewogIC8vLyBUaGUgYnl0ZSBzaW5rIHJlY2VpdmVpbmcgdGhlIGVuY29kZWQgY2h1bmtzLgogIGZpbmFsIEJ5dGVDb252ZXJzaW9uU2luayBfc2luazsKICBmaW5hbCBMaXN0PGludD4gX2luZGVudDsKICBmaW5hbCBGdW5jdGlvbihkeW5hbWljKSBfdG9FbmNvZGFibGU7CiAgZmluYWwgaW50IF9idWZmZXJTaXplOwogIGJvb2wgX2lzRG9uZSA9IGZhbHNlOwogIF9Kc29uVXRmOEVuY29kZXJTaW5rKAogICAgICB0aGlzLl9zaW5rLCB0aGlzLl90b0VuY29kYWJsZSwgdGhpcy5faW5kZW50LCB0aGlzLl9idWZmZXJTaXplKTsKCiAgLy8vIENhbGxiYWNrIGNhbGxlZCBmb3IgZWFjaCBzbGljZSBvZiByZXN1bHQgYnl0ZXMuCiAgdm9pZCBfYWRkQ2h1bmsoVWludDhMaXN0IGNodW5rLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIF9zaW5rLmFkZFNsaWNlKGNodW5rLCBzdGFydCwgZW5kLCBmYWxzZSk7CiAgfQoKICB2b2lkIGFkZChPYmplY3Qgb2JqZWN0KSB7CiAgICBpZiAoX2lzRG9uZSkgewogICAgICB0aHJvdyBTdGF0ZUVycm9yKCJPbmx5IG9uZSBjYWxsIHRvIGFkZCBhbGxvd2VkIik7CiAgICB9CiAgICBfaXNEb25lID0gdHJ1ZTsKICAgIF9Kc29uVXRmOFN0cmluZ2lmaWVyLnN0cmluZ2lmeSgKICAgICAgICBvYmplY3QsIF9pbmRlbnQsIF90b0VuY29kYWJsZSwgX2J1ZmZlclNpemUsIF9hZGRDaHVuayk7CiAgICBfc2luay5jbG9zZSgpOwogIH0KCiAgdm9pZCBjbG9zZSgpIHsKICAgIGlmICghX2lzRG9uZSkgewogICAgICBfaXNEb25lID0gdHJ1ZTsKICAgICAgX3NpbmsuY2xvc2UoKTsKICAgIH0KICB9Cn0KCi8vLyBUaGlzIGNsYXNzIHBhcnNlcyBKU09OIHN0cmluZ3MgYW5kIGJ1aWxkcyB0aGUgY29ycmVzcG9uZGluZyBvYmplY3RzLgpjbGFzcyBKc29uRGVjb2RlciBleHRlbmRzIENvbnZlcnRlcjxTdHJpbmcsIE9iamVjdD4gewogIGZpbmFsIEZ1bmN0aW9uKE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgX3Jldml2ZXI7CgogIC8vLyBDb25zdHJ1Y3RzIGEgbmV3IEpzb25EZWNvZGVyLgogIC8vLwogIC8vLyBUaGUgW3Jldml2ZXJdIG1heSBiZSBgbnVsbGAuCiAgY29uc3QgSnNvbkRlY29kZXIoW3Jldml2ZXIoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKV0pIDogX3Jldml2ZXIgPSByZXZpdmVyOwoKICAvLy8gQ29udmVydHMgdGhlIGdpdmVuIEpTT04tc3RyaW5nIFtpbnB1dF0gdG8gaXRzIGNvcnJlc3BvbmRpbmcgb2JqZWN0LgogIC8vLwogIC8vLyBQYXJzZWQgSlNPTiB2YWx1ZXMgYXJlIG9mIHRoZSB0eXBlcyBbbnVtXSwgW1N0cmluZ10sIFtib29sXSwgW051bGxdLAogIC8vLyBbTGlzdF1zIG9mIHBhcnNlZCBKU09OIHZhbHVlcyBvciBbTWFwXXMgZnJvbSBbU3RyaW5nXSB0byBwYXJzZWQgSlNPTgogIC8vLyB2YWx1ZXMuCiAgLy8vCiAgLy8vIElmIGB0aGlzYCB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBhIHJldml2ZXIsIHRoZW4gdGhlIHBhcnNpbmcgb3BlcmF0aW9uCiAgLy8vIGludm9rZXMgdGhlIHJldml2ZXIgb24gZXZlcnkgb2JqZWN0IG9yIGxpc3QgcHJvcGVydHkgdGhhdCBoYXMgYmVlbiBwYXJzZWQuCiAgLy8vIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBwcm9wZXJ0eSBuYW1lIChbU3RyaW5nXSkgb3IgbGlzdCBpbmRleCAoW2ludF0pLCBhbmQKICAvLy8gdGhlIHZhbHVlIGlzIHRoZSBwYXJzZWQgdmFsdWUuIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHJldml2ZXIgaXMgdXNlZCBhcwogIC8vLyB0aGUgdmFsdWUgb2YgdGhhdCBwcm9wZXJ0eSBpbnN0ZWFkIHRoZSBwYXJzZWQgdmFsdWUuCiAgLy8vCiAgLy8vIFRocm93cyBbRm9ybWF0RXhjZXB0aW9uXSBpZiB0aGUgaW5wdXQgaXMgbm90IHZhbGlkIEpTT04gdGV4dC4KICBkeW5hbWljIGNvbnZlcnQoU3RyaW5nIGlucHV0KSA9PiBfcGFyc2VKc29uKGlucHV0LCBfcmV2aXZlcik7CgogIC8vLyBTdGFydHMgYSBjb252ZXJzaW9uIGZyb20gYSBjaHVua2VkIEpTT04gc3RyaW5nIHRvIGl0cyBjb3JyZXNwb25kaW5nIG9iamVjdC4KICAvLy8KICAvLy8gVGhlIG91dHB1dCBbc2lua10gcmVjZWl2ZXMgZXhhY3RseSBvbmUgZGVjb2RlZCBlbGVtZW50IHRocm91Z2ggYGFkZGAuCiAgZXh0ZXJuYWwgU3RyaW5nQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPE9iamVjdD4gc2luayk7CgogIC8vIE92ZXJyaWRlIHRoZSBiYXNlIGNsYXNzJ3MgYmluZCwgdG8gcHJvdmlkZSBhIGJldHRlciB0eXBlLgogIFN0cmVhbTxPYmplY3Q+IGJpbmQoU3RyZWFtPFN0cmluZz4gc3RyZWFtKSA9PiBzdXBlci5iaW5kKHN0cmVhbSk7Cn0KCi8vIEludGVybmFsIG9wdGltaXplZCBKU09OIHBhcnNpbmcgaW1wbGVtZW50YXRpb24uCmV4dGVybmFsIF9wYXJzZUpzb24oU3RyaW5nIHNvdXJjZSwgcmV2aXZlcihrZXksIHZhbHVlKSk7CgovLyBJbXBsZW1lbnRhdGlvbiBvZiBlbmNvZGVyL3N0cmluZ2lmaWVyLgoKZHluYW1pYyBfZGVmYXVsdFRvRW5jb2RhYmxlKGR5bmFtaWMgb2JqZWN0KSA9PiBvYmplY3QudG9Kc29uKCk7CgovLy8gSlNPTiBlbmNvZGVyIHRoYXQgdHJhdmVyc2VzIGFuIG9iamVjdCBzdHJ1Y3R1cmUgYW5kIHdyaXRlcyBKU09OIHNvdXJjZS4KLy8vCi8vLyBUaGlzIGlzIGFuIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIHRoYXQgZG9lc24ndCBkZWNpZGUgb24gdGhlIG91dHB1dAovLy8gZm9ybWF0LCBidXQgd3JpdGVzIHRoZSBKU09OIHRocm91Z2ggYWJzdHJhY3QgbWV0aG9kcyBsaWtlIFt3cml0ZVN0cmluZ10uCmFic3RyYWN0IGNsYXNzIF9Kc29uU3RyaW5naWZpZXIgewogIC8vIENoYXJhY3RlciBjb2RlIGNvbnN0YW50cy4KICBzdGF0aWMgY29uc3QgaW50IGJhY2tzcGFjZSA9IDB4MDg7CiAgc3RhdGljIGNvbnN0IGludCB0YWIgPSAweDA5OwogIHN0YXRpYyBjb25zdCBpbnQgbmV3bGluZSA9IDB4MGE7CiAgc3RhdGljIGNvbnN0IGludCBjYXJyaWFnZVJldHVybiA9IDB4MGQ7CiAgc3RhdGljIGNvbnN0IGludCBmb3JtRmVlZCA9IDB4MGM7CiAgc3RhdGljIGNvbnN0IGludCBxdW90ZSA9IDB4MjI7CiAgc3RhdGljIGNvbnN0IGludCBjaGFyXzAgPSAweDMwOwogIHN0YXRpYyBjb25zdCBpbnQgYmFja3NsYXNoID0gMHg1YzsKICBzdGF0aWMgY29uc3QgaW50IGNoYXJfYiA9IDB4NjI7CiAgc3RhdGljIGNvbnN0IGludCBjaGFyX2YgPSAweDY2OwogIHN0YXRpYyBjb25zdCBpbnQgY2hhcl9uID0gMHg2ZTsKICBzdGF0aWMgY29uc3QgaW50IGNoYXJfciA9IDB4NzI7CiAgc3RhdGljIGNvbnN0IGludCBjaGFyX3QgPSAweDc0OwogIHN0YXRpYyBjb25zdCBpbnQgY2hhcl91ID0gMHg3NTsKCiAgLy8vIExpc3Qgb2Ygb2JqZWN0cyBjdXJyZW50bHkgYmVpbmcgdHJhdmVyc2VkLiBVc2VkIHRvIGRldGVjdCBjeWNsZXMuCiAgZmluYWwgTGlzdCBfc2VlbiA9IFtdOwoKICAvLy8gRnVuY3Rpb24gY2FsbGVkIGZvciBlYWNoIHVuLWVuY29kYWJsZSBvYmplY3QgZW5jb3VudGVyZWQuCiAgZmluYWwgRnVuY3Rpb24oZHluYW1pYykgX3RvRW5jb2RhYmxlOwoKICBfSnNvblN0cmluZ2lmaWVyKHRvRW5jb2RhYmxlKG8pKQogICAgICA6IF90b0VuY29kYWJsZSA9IHRvRW5jb2RhYmxlID8/IF9kZWZhdWx0VG9FbmNvZGFibGU7CgogIFN0cmluZyBnZXQgX3BhcnRpYWxSZXN1bHQ7CgogIC8vLyBBcHBlbmQgYSBzdHJpbmcgdG8gdGhlIEpTT04gb3V0cHV0LgogIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIGNoYXJhY3RlcnMpOwoKICAvLy8gQXBwZW5kIHBhcnQgb2YgYSBzdHJpbmcgdG8gdGhlIEpTT04gb3V0cHV0LgogIHZvaWQgd3JpdGVTdHJpbmdTbGljZShTdHJpbmcgY2hhcmFjdGVycywgaW50IHN0YXJ0LCBpbnQgZW5kKTsKCiAgLy8vIEFwcGVuZCBhIHNpbmdsZSBjaGFyYWN0ZXIsIGdpdmVuIGJ5IGl0cyBjb2RlIHBvaW50LCB0byB0aGUgSlNPTiBvdXRwdXQuCiAgdm9pZCB3cml0ZUNoYXJDb2RlKGludCBjaGFyQ29kZSk7CgogIC8vLyBXcml0ZSBhIG51bWJlciB0byB0aGUgSlNPTiBvdXRwdXQuCiAgdm9pZCB3cml0ZU51bWJlcihudW0gbnVtYmVyKTsKCiAgLy8gKCcwJyArIHgpIG9yICgnYScgKyB4IC0gMTApCiAgc3RhdGljIGludCBoZXhEaWdpdChpbnQgeCkgPT4geCA8IDEwID8gNDggKyB4IDogODcgKyB4OwoKICAvLy8gV3JpdGUsIGFuZCBzdWl0YWJseSBlc2NhcGUsIGEgc3RyaW5nJ3MgY29udGVudCBhcyBhIEpTT04gc3RyaW5nIGxpdGVyYWwuCiAgdm9pZCB3cml0ZVN0cmluZ0NvbnRlbnQoU3RyaW5nIHMpIHsKICAgIHZhciBvZmZzZXQgPSAwOwogICAgZmluYWwgbGVuZ3RoID0gcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBjaGFyQ29kZSA9IHMuY29kZVVuaXRBdChpKTsKICAgICAgaWYgKGNoYXJDb2RlID4gYmFja3NsYXNoKSBjb250aW51ZTsKICAgICAgaWYgKGNoYXJDb2RlIDwgMzIpIHsKICAgICAgICBpZiAoaSA+IG9mZnNldCkgd3JpdGVTdHJpbmdTbGljZShzLCBvZmZzZXQsIGkpOwogICAgICAgIG9mZnNldCA9IGkgKyAxOwogICAgICAgIHdyaXRlQ2hhckNvZGUoYmFja3NsYXNoKTsKICAgICAgICBzd2l0Y2ggKGNoYXJDb2RlKSB7CiAgICAgICAgICBjYXNlIGJhY2tzcGFjZToKICAgICAgICAgICAgd3JpdGVDaGFyQ29kZShjaGFyX2IpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgdGFiOgogICAgICAgICAgICB3cml0ZUNoYXJDb2RlKGNoYXJfdCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBuZXdsaW5lOgogICAgICAgICAgICB3cml0ZUNoYXJDb2RlKGNoYXJfbik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBmb3JtRmVlZDoKICAgICAgICAgICAgd3JpdGVDaGFyQ29kZShjaGFyX2YpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgY2FycmlhZ2VSZXR1cm46CiAgICAgICAgICAgIHdyaXRlQ2hhckNvZGUoY2hhcl9yKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB3cml0ZUNoYXJDb2RlKGNoYXJfdSk7CiAgICAgICAgICAgIHdyaXRlQ2hhckNvZGUoY2hhcl8wKTsKICAgICAgICAgICAgd3JpdGVDaGFyQ29kZShjaGFyXzApOwogICAgICAgICAgICB3cml0ZUNoYXJDb2RlKGhleERpZ2l0KChjaGFyQ29kZSA+PiA0KSAmIDB4ZikpOwogICAgICAgICAgICB3cml0ZUNoYXJDb2RlKGhleERpZ2l0KGNoYXJDb2RlICYgMHhmKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjaGFyQ29kZSA9PSBxdW90ZSB8fCBjaGFyQ29kZSA9PSBiYWNrc2xhc2gpIHsKICAgICAgICBpZiAoaSA+IG9mZnNldCkgd3JpdGVTdHJpbmdTbGljZShzLCBvZmZzZXQsIGkpOwogICAgICAgIG9mZnNldCA9IGkgKyAxOwogICAgICAgIHdyaXRlQ2hhckNvZGUoYmFja3NsYXNoKTsKICAgICAgICB3cml0ZUNoYXJDb2RlKGNoYXJDb2RlKTsKICAgICAgfQogICAgfQogICAgaWYgKG9mZnNldCA9PSAwKSB7CiAgICAgIHdyaXRlU3RyaW5nKHMpOwogICAgfSBlbHNlIGlmIChvZmZzZXQgPCBsZW5ndGgpIHsKICAgICAgd3JpdGVTdHJpbmdTbGljZShzLCBvZmZzZXQsIGxlbmd0aCk7CiAgICB9CiAgfQoKICAvLy8gQ2hlY2sgaWYgYW4gZW5jb3VudGVyZWQgb2JqZWN0IGlzIGFscmVhZHkgYmVpbmcgdHJhdmVyc2VkLgogIC8vLwogIC8vLyBSZWNvcmRzIHRoZSBvYmplY3QgaWYgaXQgaXNuJ3QgYWxyZWFkeSBzZWVuLiBTaG91bGQgaGF2ZSBhIG1hdGNoaW5nIGNhbGwgdG8KICAvLy8gW19yZW1vdmVTZWVuXSB3aGVuIHRoZSBvYmplY3QgaXMgbm8gbG9uZ2VyIGJlaW5nIHRyYXZlcnNlZC4KICB2b2lkIF9jaGVja0N5Y2xlKG9iamVjdCkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfc2Vlbi5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaWRlbnRpY2FsKG9iamVjdCwgX3NlZW5baV0pKSB7CiAgICAgICAgdGhyb3cgSnNvbkN5Y2xpY0Vycm9yKG9iamVjdCk7CiAgICAgIH0KICAgIH0KICAgIF9zZWVuLmFkZChvYmplY3QpOwogIH0KCiAgLy8vIFJlbW92ZSBbb2JqZWN0XSBmcm9tIHRoZSBsaXN0IG9mIGN1cnJlbnRseSB0cmF2ZXJzZWQgb2JqZWN0cy4KICAvLy8KICAvLy8gU2hvdWxkIGJlIGNhbGxlZCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIgb2YgdGhlIG1hdGNoaW5nIFtfY2hlY2tDeWNsZV0KICAvLy8gY2FsbHMuCiAgdm9pZCBfcmVtb3ZlU2VlbihvYmplY3QpIHsKICAgIGFzc2VydChfc2Vlbi5pc05vdEVtcHR5KTsKICAgIGFzc2VydChpZGVudGljYWwoX3NlZW4ubGFzdCwgb2JqZWN0KSk7CiAgICBfc2Vlbi5yZW1vdmVMYXN0KCk7CiAgfQoKICAvLy8gV3JpdGUgYW4gb2JqZWN0LgogIC8vLwogIC8vLyBJZiBbb2JqZWN0XSBpc24ndCBkaXJlY3RseSBlbmNvZGFibGUsIHRoZSBbX3RvRW5jb2RhYmxlXSBmdW5jdGlvbiBnZXRzIG9uZQogIC8vLyBjaGFuY2UgdG8gcmV0dXJuIGEgcmVwbGFjZW1lbnQgd2hpY2ggaXMgZW5jb2RhYmxlLgogIHZvaWQgd3JpdGVPYmplY3Qob2JqZWN0KSB7CiAgICAvLyBUcmllcyBzdHJpbmdpZnlpbmcgb2JqZWN0IGRpcmVjdGx5LiBJZiBpdCdzIG5vdCBhIHNpbXBsZSB2YWx1ZSwgTGlzdCBvcgogICAgLy8gTWFwLCBjYWxsIHRvSnNvbigpIHRvIGdldCBhIGN1c3RvbSByZXByZXNlbnRhdGlvbiBhbmQgdHJ5IHNlcmlhbGl6aW5nCiAgICAvLyB0aGF0LgogICAgaWYgKHdyaXRlSnNvblZhbHVlKG9iamVjdCkpIHJldHVybjsKICAgIF9jaGVja0N5Y2xlKG9iamVjdCk7CiAgICB0cnkgewogICAgICB2YXIgY3VzdG9tSnNvbiA9IF90b0VuY29kYWJsZShvYmplY3QpOwogICAgICBpZiAoIXdyaXRlSnNvblZhbHVlKGN1c3RvbUpzb24pKSB7CiAgICAgICAgdGhyb3cgSnNvblVuc3VwcG9ydGVkT2JqZWN0RXJyb3Iob2JqZWN0LCBwYXJ0aWFsUmVzdWx0OiBfcGFydGlhbFJlc3VsdCk7CiAgICAgIH0KICAgICAgX3JlbW92ZVNlZW4ob2JqZWN0KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgdGhyb3cgSnNvblVuc3VwcG9ydGVkT2JqZWN0RXJyb3Iob2JqZWN0LAogICAgICAgICAgY2F1c2U6IGUsIHBhcnRpYWxSZXN1bHQ6IF9wYXJ0aWFsUmVzdWx0KTsKICAgIH0KICB9CgogIC8vLyBTZXJpYWxpemUgYSBbbnVtXSwgW1N0cmluZ10sIFtib29sXSwgW051bGxdLCBbTGlzdF0gb3IgW01hcF0gdmFsdWUuCiAgLy8vCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgb25lIG9mIHRoZXNlIHR5cGVzLCBhbmQgZmFsc2UgaWYgbm90LgogIC8vLyBJZiBhIHZhbHVlIGlzIGJvdGggYSBbTGlzdF0gYW5kIGEgW01hcF0sIGl0J3Mgc2VyaWFsaXplZCBhcyBhIFtMaXN0XS4KICBib29sIHdyaXRlSnNvblZhbHVlKG9iamVjdCkgewogICAgaWYgKG9iamVjdCBpcyBudW0pIHsKICAgICAgaWYgKCFvYmplY3QuaXNGaW5pdGUpIHJldHVybiBmYWxzZTsKICAgICAgd3JpdGVOdW1iZXIob2JqZWN0KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbChvYmplY3QsIHRydWUpKSB7CiAgICAgIHdyaXRlU3RyaW5nKCd0cnVlJyk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwob2JqZWN0LCBmYWxzZSkpIHsKICAgICAgd3JpdGVTdHJpbmcoJ2ZhbHNlJyk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIGlmIChvYmplY3QgPT0gbnVsbCkgewogICAgICB3cml0ZVN0cmluZygnbnVsbCcpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSBpZiAob2JqZWN0IGlzIFN0cmluZykgewogICAgICB3cml0ZVN0cmluZygnIicpOwogICAgICB3cml0ZVN0cmluZ0NvbnRlbnQob2JqZWN0KTsKICAgICAgd3JpdGVTdHJpbmcoJyInKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgaWYgKG9iamVjdCBpcyBMaXN0KSB7CiAgICAgIF9jaGVja0N5Y2xlKG9iamVjdCk7CiAgICAgIHdyaXRlTGlzdChvYmplY3QpOwogICAgICBfcmVtb3ZlU2VlbihvYmplY3QpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSBpZiAob2JqZWN0IGlzIE1hcCkgewogICAgICBfY2hlY2tDeWNsZShvYmplY3QpOwogICAgICAvLyB3cml0ZU1hcCBjYW4gZmFpbCBpZiBrZXlzIGFyZSBub3QgYWxsIHN0cmluZ3MuCiAgICAgIHZhciBzdWNjZXNzID0gd3JpdGVNYXAob2JqZWN0KTsKICAgICAgX3JlbW92ZVNlZW4ob2JqZWN0KTsKICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvLy8gU2VyaWFsaXplIGEgW0xpc3RdLgogIHZvaWQgd3JpdGVMaXN0KExpc3QgbGlzdCkgewogICAgd3JpdGVTdHJpbmcoJ1snKTsKICAgIGlmIChsaXN0LmlzTm90RW1wdHkpIHsKICAgICAgd3JpdGVPYmplY3QobGlzdFswXSk7CiAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgIHdyaXRlU3RyaW5nKCcsJyk7CiAgICAgICAgd3JpdGVPYmplY3QobGlzdFtpXSk7CiAgICAgIH0KICAgIH0KICAgIHdyaXRlU3RyaW5nKCddJyk7CiAgfQoKICAvLy8gU2VyaWFsaXplIGEgW01hcF0uCiAgYm9vbCB3cml0ZU1hcChNYXAgbWFwKSB7CiAgICBpZiAobWFwLmlzRW1wdHkpIHsKICAgICAgd3JpdGVTdHJpbmcoInt9Iik7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgdmFyIGtleVZhbHVlTGlzdCA9IExpc3QobWFwLmxlbmd0aCAqIDIpOwogICAgdmFyIGkgPSAwOwogICAgdmFyIGFsbFN0cmluZ0tleXMgPSB0cnVlOwogICAgbWFwLmZvckVhY2goKGtleSwgdmFsdWUpIHsKICAgICAgaWYgKGtleSBpcyEgU3RyaW5nKSB7CiAgICAgICAgYWxsU3RyaW5nS2V5cyA9IGZhbHNlOwogICAgICB9CiAgICAgIGtleVZhbHVlTGlzdFtpKytdID0ga2V5OwogICAgICBrZXlWYWx1ZUxpc3RbaSsrXSA9IHZhbHVlOwogICAgfSk7CiAgICBpZiAoIWFsbFN0cmluZ0tleXMpIHJldHVybiBmYWxzZTsKICAgIHdyaXRlU3RyaW5nKCd7Jyk7CiAgICB2YXIgc2VwYXJhdG9yID0gJyInOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlWYWx1ZUxpc3QubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgd3JpdGVTdHJpbmcoc2VwYXJhdG9yKTsKICAgICAgc2VwYXJhdG9yID0gJywiJzsKICAgICAgd3JpdGVTdHJpbmdDb250ZW50KGtleVZhbHVlTGlzdFtpXSk7CiAgICAgIHdyaXRlU3RyaW5nKCciOicpOwogICAgICB3cml0ZU9iamVjdChrZXlWYWx1ZUxpc3RbaSArIDFdKTsKICAgIH0KICAgIHdyaXRlU3RyaW5nKCd9Jyk7CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn0KCi8vLyBBIG1vZGlmaWNhdGlvbiBvZiBbX0pzb25TdHJpbmdpZmllcl0gd2hpY2ggaW5kZW50cyB0aGUgY29udGVudHMgb2YgW0xpc3RdIGFuZAovLy8gW01hcF0gb2JqZWN0cyB1c2luZyB0aGUgc3BlY2lmaWVkIGluZGVudCB2YWx1ZS4KLy8vCi8vLyBTdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgW3dyaXRlSW5kZW50YXRpb25dLgphYnN0cmFjdCBjbGFzcyBfSnNvblByZXR0eVByaW50TWl4aW4gaW1wbGVtZW50cyBfSnNvblN0cmluZ2lmaWVyIHsKICBpbnQgX2luZGVudExldmVsID0gMDsKCiAgLy8vIEFkZCBbaW5kZW50TGV2ZWxdIGluZGVudGF0aW9ucyB0byB0aGUgSlNPTiBvdXRwdXQuCiAgdm9pZCB3cml0ZUluZGVudGF0aW9uKGludCBpbmRlbnRMZXZlbCk7CgogIHZvaWQgd3JpdGVMaXN0KExpc3QgbGlzdCkgewogICAgaWYgKGxpc3QuaXNFbXB0eSkgewogICAgICB3cml0ZVN0cmluZygnW10nKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlU3RyaW5nKCdbXG4nKTsKICAgICAgX2luZGVudExldmVsKys7CiAgICAgIHdyaXRlSW5kZW50YXRpb24oX2luZGVudExldmVsKTsKICAgICAgd3JpdGVPYmplY3QobGlzdFswXSk7CiAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgIHdyaXRlU3RyaW5nKCcsXG4nKTsKICAgICAgICB3cml0ZUluZGVudGF0aW9uKF9pbmRlbnRMZXZlbCk7CiAgICAgICAgd3JpdGVPYmplY3QobGlzdFtpXSk7CiAgICAgIH0KICAgICAgd3JpdGVTdHJpbmcoJ1xuJyk7CiAgICAgIF9pbmRlbnRMZXZlbC0tOwogICAgICB3cml0ZUluZGVudGF0aW9uKF9pbmRlbnRMZXZlbCk7CiAgICAgIHdyaXRlU3RyaW5nKCddJyk7CiAgICB9CiAgfQoKICBib29sIHdyaXRlTWFwKE1hcCBtYXApIHsKICAgIGlmIChtYXAuaXNFbXB0eSkgewogICAgICB3cml0ZVN0cmluZygie30iKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICB2YXIga2V5VmFsdWVMaXN0ID0gTGlzdChtYXAubGVuZ3RoICogMik7CiAgICB2YXIgaSA9IDA7CiAgICB2YXIgYWxsU3RyaW5nS2V5cyA9IHRydWU7CiAgICBtYXAuZm9yRWFjaCgoa2V5LCB2YWx1ZSkgewogICAgICBpZiAoa2V5IGlzISBTdHJpbmcpIHsKICAgICAgICBhbGxTdHJpbmdLZXlzID0gZmFsc2U7CiAgICAgIH0KICAgICAga2V5VmFsdWVMaXN0W2krK10gPSBrZXk7CiAgICAgIGtleVZhbHVlTGlzdFtpKytdID0gdmFsdWU7CiAgICB9KTsKICAgIGlmICghYWxsU3RyaW5nS2V5cykgcmV0dXJuIGZhbHNlOwogICAgd3JpdGVTdHJpbmcoJ3tcbicpOwogICAgX2luZGVudExldmVsKys7CiAgICB2YXIgc2VwYXJhdG9yID0gIiI7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleVZhbHVlTGlzdC5sZW5ndGg7IGkgKz0gMikgewogICAgICB3cml0ZVN0cmluZyhzZXBhcmF0b3IpOwogICAgICBzZXBhcmF0b3IgPSAiLFxuIjsKICAgICAgd3JpdGVJbmRlbnRhdGlvbihfaW5kZW50TGV2ZWwpOwogICAgICB3cml0ZVN0cmluZygnIicpOwogICAgICB3cml0ZVN0cmluZ0NvbnRlbnQoa2V5VmFsdWVMaXN0W2ldKTsKICAgICAgd3JpdGVTdHJpbmcoJyI6ICcpOwogICAgICB3cml0ZU9iamVjdChrZXlWYWx1ZUxpc3RbaSArIDFdKTsKICAgIH0KICAgIHdyaXRlU3RyaW5nKCdcbicpOwogICAgX2luZGVudExldmVsLS07CiAgICB3cml0ZUluZGVudGF0aW9uKF9pbmRlbnRMZXZlbCk7CiAgICB3cml0ZVN0cmluZygnfScpOwogICAgcmV0dXJuIHRydWU7CiAgfQp9CgovLy8gQSBzcGVjaWFsaXphdGlvbiBvZiBbX0pzb25TdHJpbmdpZmllcl0gdGhhdCB3cml0ZXMgaXRzIEpTT04gdG8gYSBzdHJpbmcuCmNsYXNzIF9Kc29uU3RyaW5nU3RyaW5naWZpZXIgZXh0ZW5kcyBfSnNvblN0cmluZ2lmaWVyIHsKICBmaW5hbCBTdHJpbmdTaW5rIF9zaW5rOwoKICBfSnNvblN0cmluZ1N0cmluZ2lmaWVyKHRoaXMuX3NpbmssIGR5bmFtaWMgRnVuY3Rpb24oZHluYW1pYykgX3RvRW5jb2RhYmxlKQogICAgICA6IHN1cGVyKF90b0VuY29kYWJsZSk7CgogIC8vLyBDb252ZXJ0IG9iamVjdCB0byBhIHN0cmluZy4KICAvLy8KICAvLy8gVGhlIFt0b0VuY29kYWJsZV0gZnVuY3Rpb24gaXMgdXNlZCB0byBjb252ZXJ0IG5vbi1lbmNvZGFibGUgb2JqZWN0cwogIC8vLyB0byBlbmNvZGFibGUgb25lcy4KICAvLy8KICAvLy8gSWYgW2luZGVudF0gaXMgbm90IGBudWxsYCwgdGhlIHJlc3VsdGluZyBKU09OIHdpbGwgYmUgInByZXR0eS1wcmludGVkIgogIC8vLyB3aXRoIG5ld2xpbmVzIGFuZCBpbmRlbnRhdGlvbi4gVGhlIGBpbmRlbnRgIHN0cmluZyBpcyBhZGRlZCBhcyBpbmRlbnRhdGlvbgogIC8vLyBmb3IgZWFjaCBpbmRlbnRhdGlvbiBsZXZlbC4gSXQgc2hvdWxkIG9ubHkgY29udGFpbiB2YWxpZCBKU09OIHdoaXRlc3BhY2UKICAvLy8gY2hhcmFjdGVycyAoc3BhY2UsIHRhYiwgY2FycmlhZ2UgcmV0dXJuIG9yIGxpbmUgZmVlZCkuCiAgc3RhdGljIFN0cmluZyBzdHJpbmdpZnkob2JqZWN0LCB0b0VuY29kYWJsZShvKSwgU3RyaW5nIGluZGVudCkgewogICAgdmFyIG91dHB1dCA9IFN0cmluZ0J1ZmZlcigpOwogICAgcHJpbnRPbihvYmplY3QsIG91dHB1dCwgdG9FbmNvZGFibGUsIGluZGVudCk7CiAgICByZXR1cm4gb3V0cHV0LnRvU3RyaW5nKCk7CiAgfQoKICAvLy8gQ29udmVydCBvYmplY3QgdG8gYSBzdHJpbmcsIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZSBbb3V0cHV0XSBzaW5rLgogIC8vLwogIC8vLyBUaGUgcmVzdWx0IGlzIHdyaXR0ZW4gcGllY2VtYWxseSB0byB0aGUgc2luay4KICBzdGF0aWMgdm9pZCBwcmludE9uKAogICAgICBvYmplY3QsIFN0cmluZ1Npbmsgb3V0cHV0LCB0b0VuY29kYWJsZShvKSwgU3RyaW5nIGluZGVudCkgewogICAgX0pzb25TdHJpbmdpZmllciBzdHJpbmdpZmllcjsKICAgIGlmIChpbmRlbnQgPT0gbnVsbCkgewogICAgICBzdHJpbmdpZmllciA9IF9Kc29uU3RyaW5nU3RyaW5naWZpZXIob3V0cHV0LCB0b0VuY29kYWJsZSk7CiAgICB9IGVsc2UgewogICAgICBzdHJpbmdpZmllciA9IF9Kc29uU3RyaW5nU3RyaW5naWZpZXJQcmV0dHkob3V0cHV0LCB0b0VuY29kYWJsZSwgaW5kZW50KTsKICAgIH0KICAgIHN0cmluZ2lmaWVyLndyaXRlT2JqZWN0KG9iamVjdCk7CiAgfQoKICBTdHJpbmcgZ2V0IF9wYXJ0aWFsUmVzdWx0ID0+IF9zaW5rIGlzIFN0cmluZ0J1ZmZlciA/IF9zaW5rLnRvU3RyaW5nKCkgOiBudWxsOwoKICB2b2lkIHdyaXRlTnVtYmVyKG51bSBudW1iZXIpIHsKICAgIF9zaW5rLndyaXRlKG51bWJlci50b1N0cmluZygpKTsKICB9CgogIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cmluZykgewogICAgX3Npbmsud3JpdGUoc3RyaW5nKTsKICB9CgogIHZvaWQgd3JpdGVTdHJpbmdTbGljZShTdHJpbmcgc3RyaW5nLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIF9zaW5rLndyaXRlKHN0cmluZy5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOwogIH0KCiAgdm9pZCB3cml0ZUNoYXJDb2RlKGludCBjaGFyQ29kZSkgewogICAgX3Npbmsud3JpdGVDaGFyQ29kZShjaGFyQ29kZSk7CiAgfQp9CgpjbGFzcyBfSnNvblN0cmluZ1N0cmluZ2lmaWVyUHJldHR5IGV4dGVuZHMgX0pzb25TdHJpbmdTdHJpbmdpZmllcgogICAgd2l0aCBfSnNvblByZXR0eVByaW50TWl4aW4gewogIGZpbmFsIFN0cmluZyBfaW5kZW50OwoKICBfSnNvblN0cmluZ1N0cmluZ2lmaWVyUHJldHR5KFN0cmluZ1Npbmsgc2luaywgdG9FbmNvZGFibGUobyksIHRoaXMuX2luZGVudCkKICAgICAgOiBzdXBlcihzaW5rLCB0b0VuY29kYWJsZSk7CgogIHZvaWQgd3JpdGVJbmRlbnRhdGlvbihpbnQgY291bnQpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgd3JpdGVTdHJpbmcoX2luZGVudCk7CiAgfQp9CgovLy8gU3BlY2lhbGl6YXRpb24gb2YgW19Kc29uU3RyaW5naWZpZXJdIHRoYXQgd3JpdGVzIHRoZSBKU09OIGFzIFVURi04LgovLy8KLy8vIFRoZSBKU09OIHRleHQgaXMgVVRGLTggZW5jb2RlZCBhbmQgd3JpdHRlbiB0byBbVWludDhMaXN0XSBidWZmZXJzLgovLy8gVGhlIGJ1ZmZlcnMgYXJlIHRoZW4gcGFzc2VkIGJhY2sgdG8gYSB1c2VyIHByb3ZpZGVkIGNhbGxiYWNrIG1ldGhvZC4KY2xhc3MgX0pzb25VdGY4U3RyaW5naWZpZXIgZXh0ZW5kcyBfSnNvblN0cmluZ2lmaWVyIHsKICBmaW5hbCBpbnQgYnVmZmVyU2l6ZTsKICBmaW5hbCB2b2lkIEZ1bmN0aW9uKFVpbnQ4TGlzdCBsaXN0LCBpbnQgc3RhcnQsIGludCBlbmQpIGFkZENodW5rOwogIFVpbnQ4TGlzdCBidWZmZXI7CiAgaW50IGluZGV4ID0gMDsKCiAgX0pzb25VdGY4U3RyaW5naWZpZXIodG9FbmNvZGFibGUobyksIHRoaXMuYnVmZmVyU2l6ZSwgdGhpcy5hZGRDaHVuaykKICAgICAgOiBidWZmZXIgPSBVaW50OExpc3QoYnVmZmVyU2l6ZSksCiAgICAgICAgc3VwZXIodG9FbmNvZGFibGUpOwoKICAvLy8gQ29udmVydCBbb2JqZWN0XSB0byBVVEYtOCBlbmNvZGVkIEpTT04uCiAgLy8vCiAgLy8vIENhbGxzIFthZGRDaHVua10gd2l0aCBzbGljZXMgb2YgVVRGLTggY29kZSB1bml0cy4KICAvLy8gVGhlc2Ugd2lsbCB0eXBpY2FsbHkgaGF2ZSBzaXplIFtidWZmZXJTaXplXSwgYnV0IG1heSBiZSBzaG9ydGVyLgogIC8vLyBUaGUgYnVmZmVycyBhcmUgbm90IHJldXNlZCwgc28gdGhlIFthZGRDaHVua10gY2FsbCBtYXkga2VlcCBhbmQgcmV1c2UgdGhlCiAgLy8vIGNodW5rcy4KICAvLy8KICAvLy8gSWYgW2luZGVudF0gaXMgbm9uLWBudWxsYCwgdGhlIHJlc3VsdCB3aWxsIGJlICJwcmV0dHktcHJpbnRlZCIgd2l0aCBleHRyYQogIC8vLyBuZXdsaW5lcyBhbmQgaW5kZW50YXRpb24sIHVzaW5nIFtpbmRlbnRdIGFzIHRoZSBpbmRlbnRhdGlvbi4KICBzdGF0aWMgdm9pZCBzdHJpbmdpZnkoT2JqZWN0IG9iamVjdCwgTGlzdDxpbnQ+IGluZGVudCwgdG9FbmNvZGFibGUobyksCiAgICAgIGludCBidWZmZXJTaXplLCB2b2lkIGFkZENodW5rKFVpbnQ4TGlzdCBjaHVuaywgaW50IHN0YXJ0LCBpbnQgZW5kKSkgewogICAgX0pzb25VdGY4U3RyaW5naWZpZXIgc3RyaW5naWZpZXI7CiAgICBpZiAoaW5kZW50ICE9IG51bGwpIHsKICAgICAgc3RyaW5naWZpZXIgPQogICAgICAgICAgX0pzb25VdGY4U3RyaW5naWZpZXJQcmV0dHkodG9FbmNvZGFibGUsIGluZGVudCwgYnVmZmVyU2l6ZSwgYWRkQ2h1bmspOwogICAgfSBlbHNlIHsKICAgICAgc3RyaW5naWZpZXIgPSBfSnNvblV0ZjhTdHJpbmdpZmllcih0b0VuY29kYWJsZSwgYnVmZmVyU2l6ZSwgYWRkQ2h1bmspOwogICAgfQogICAgc3RyaW5naWZpZXIud3JpdGVPYmplY3Qob2JqZWN0KTsKICAgIHN0cmluZ2lmaWVyLmZsdXNoKCk7CiAgfQoKICAvLy8gTXVzdCBiZSBjYWxsZWQgYXQgdGhlIGVuZCB0byBwdXNoIHRoZSBsYXN0IGNodW5rIHRvIHRoZSBbYWRkQ2h1bmtdCiAgLy8vIGNhbGxiYWNrLgogIHZvaWQgZmx1c2goKSB7CiAgICBpZiAoaW5kZXggPiAwKSB7CiAgICAgIGFkZENodW5rKGJ1ZmZlciwgMCwgaW5kZXgpOwogICAgfQogICAgYnVmZmVyID0gbnVsbDsKICAgIGluZGV4ID0gMDsKICB9CgogIFN0cmluZyBnZXQgX3BhcnRpYWxSZXN1bHQgPT4gbnVsbDsKCiAgdm9pZCB3cml0ZU51bWJlcihudW0gbnVtYmVyKSB7CiAgICB3cml0ZUFzY2lpU3RyaW5nKG51bWJlci50b1N0cmluZygpKTsKICB9CgogIC8vLyBXcml0ZSBhIHN0cmluZyB0aGF0IGlzIGtub3duIHRvIG5vdCBoYXZlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLgogIHZvaWQgd3JpdGVBc2NpaVN0cmluZyhTdHJpbmcgc3RyaW5nKSB7CiAgICAvLyBUT0RPKGxybik6IE9wdGltaXplIGJ5IGNvcHlpbmcgZGlyZWN0bHkgaW50byBidWZmZXIgaW5zdGVhZCBvZiBnb2luZwogICAgLy8gdGhyb3VnaCB3cml0ZUNoYXJDb2RlOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGNoYXIgPSBzdHJpbmcuY29kZVVuaXRBdChpKTsKICAgICAgYXNzZXJ0KGNoYXIgPD0gMHg3Zik7CiAgICAgIHdyaXRlQnl0ZShjaGFyKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cmluZykgewogICAgd3JpdGVTdHJpbmdTbGljZShzdHJpbmcsIDAsIHN0cmluZy5sZW5ndGgpOwogIH0KCiAgdm9pZCB3cml0ZVN0cmluZ1NsaWNlKFN0cmluZyBzdHJpbmcsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgLy8gVE9ETyhscm4pOiBPcHRpbWl6ZSBieSBjb3B5aW5nIGRpcmVjdGx5IGludG8gYnVmZmVyIGluc3RlYWQgb2YgZ29pbmcKICAgIC8vIHRocm91Z2ggd3JpdGVDaGFyQ29kZS93cml0ZUJ5dGUuIEFzc3VtcHRpb24gaXMgdGhlIG1vc3QgY2hhcmFjdGVycwogICAgLy8gaW4gc3RhcmluZ3MgYXJlIHBsYWluIEFTQ0lJLgogICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgdmFyIGNoYXIgPSBzdHJpbmcuY29kZVVuaXRBdChpKTsKICAgICAgaWYgKGNoYXIgPD0gMHg3ZikgewogICAgICAgIHdyaXRlQnl0ZShjaGFyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoKGNoYXIgJiAweEZDMDApID09IDB4RDgwMCAmJiBpICsgMSA8IGVuZCkgewogICAgICAgICAgLy8gTGVhZCBzdXJyb2dhdGUuCiAgICAgICAgICB2YXIgbmV4dENoYXIgPSBzdHJpbmcuY29kZVVuaXRBdChpICsgMSk7CiAgICAgICAgICBpZiAoKG5leHRDaGFyICYgMHhGQzAwKSA9PSAweERDMDApIHsKICAgICAgICAgICAgLy8gVGFpbCBzdXJyb2dhdGUuCiAgICAgICAgICAgIGNoYXIgPSAweDEwMDAwICsgKChjaGFyICYgMHgzZmYpIDw8IDEwKSArIChuZXh0Q2hhciAmIDB4M2ZmKTsKICAgICAgICAgICAgd3JpdGVGb3VyQnl0ZUNoYXJDb2RlKGNoYXIpOwogICAgICAgICAgICBpKys7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB3cml0ZU11bHRpQnl0ZUNoYXJDb2RlKGNoYXIpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlQ2hhckNvZGUoaW50IGNoYXJDb2RlKSB7CiAgICBpZiAoY2hhckNvZGUgPD0gMHg3ZikgewogICAgICB3cml0ZUJ5dGUoY2hhckNvZGUpOwogICAgICByZXR1cm47CiAgICB9CiAgICB3cml0ZU11bHRpQnl0ZUNoYXJDb2RlKGNoYXJDb2RlKTsKICB9CgogIHZvaWQgd3JpdGVNdWx0aUJ5dGVDaGFyQ29kZShpbnQgY2hhckNvZGUpIHsKICAgIGlmIChjaGFyQ29kZSA8PSAweDdmZikgewogICAgICB3cml0ZUJ5dGUoMHhDMCB8IChjaGFyQ29kZSA+PiA2KSk7CiAgICAgIHdyaXRlQnl0ZSgweDgwIHwgKGNoYXJDb2RlICYgMHgzZikpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoY2hhckNvZGUgPD0gMHhmZmZmKSB7CiAgICAgIHdyaXRlQnl0ZSgweEUwIHwgKGNoYXJDb2RlID4+IDEyKSk7CiAgICAgIHdyaXRlQnl0ZSgweDgwIHwgKChjaGFyQ29kZSA+PiA2KSAmIDB4M2YpKTsKICAgICAgd3JpdGVCeXRlKDB4ODAgfCAoY2hhckNvZGUgJiAweDNmKSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHdyaXRlRm91ckJ5dGVDaGFyQ29kZShjaGFyQ29kZSk7CiAgfQoKICB2b2lkIHdyaXRlRm91ckJ5dGVDaGFyQ29kZShpbnQgY2hhckNvZGUpIHsKICAgIGFzc2VydChjaGFyQ29kZSA8PSAweDEwZmZmZik7CiAgICB3cml0ZUJ5dGUoMHhGMCB8IChjaGFyQ29kZSA+PiAxOCkpOwogICAgd3JpdGVCeXRlKDB4ODAgfCAoKGNoYXJDb2RlID4+IDEyKSAmIDB4M2YpKTsKICAgIHdyaXRlQnl0ZSgweDgwIHwgKChjaGFyQ29kZSA+PiA2KSAmIDB4M2YpKTsKICAgIHdyaXRlQnl0ZSgweDgwIHwgKGNoYXJDb2RlICYgMHgzZikpOwogIH0KCiAgdm9pZCB3cml0ZUJ5dGUoaW50IGJ5dGUpIHsKICAgIGFzc2VydChieXRlIDw9IDB4ZmYpOwogICAgaWYgKGluZGV4ID09IGJ1ZmZlci5sZW5ndGgpIHsKICAgICAgYWRkQ2h1bmsoYnVmZmVyLCAwLCBpbmRleCk7CiAgICAgIGJ1ZmZlciA9IFVpbnQ4TGlzdChidWZmZXJTaXplKTsKICAgICAgaW5kZXggPSAwOwogICAgfQogICAgYnVmZmVyW2luZGV4KytdID0gYnl0ZTsKICB9Cn0KCi8vLyBQcmV0dHktcHJpbnRpbmcgdmVyc2lvbiBvZiBbX0pzb25VdGY4U3RyaW5naWZpZXJdLgpjbGFzcyBfSnNvblV0ZjhTdHJpbmdpZmllclByZXR0eSBleHRlbmRzIF9Kc29uVXRmOFN0cmluZ2lmaWVyCiAgICB3aXRoIF9Kc29uUHJldHR5UHJpbnRNaXhpbiB7CiAgZmluYWwgTGlzdDxpbnQ+IGluZGVudDsKICBfSnNvblV0ZjhTdHJpbmdpZmllclByZXR0eSh0b0VuY29kYWJsZShvKSwgdGhpcy5pbmRlbnQsIGludCBidWZmZXJTaXplLAogICAgICB2b2lkIGFkZENodW5rKFVpbnQ4TGlzdCBidWZmZXIsIGludCBzdGFydCwgaW50IGVuZCkpCiAgICAgIDogc3VwZXIodG9FbmNvZGFibGUsIGJ1ZmZlclNpemUsIGFkZENodW5rKTsKCiAgdm9pZCB3cml0ZUluZGVudGF0aW9uKGludCBjb3VudCkgewogICAgdmFyIGluZGVudCA9IHRoaXMuaW5kZW50OwogICAgdmFyIGluZGVudExlbmd0aCA9IGluZGVudC5sZW5ndGg7CiAgICBp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cnQ7CgovLy8gQW4gaW5zdGFuY2Ugb2YgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFtMYXRpbjFDb2RlY10uCi8vLwovLy8gVGhpcyBpbnN0YW5jZSBwcm92aWRlcyBhIGNvbnZlbmllbnQgYWNjZXNzIHRvIHRoZSBtb3N0IGNvbW1vbiBJU08gTGF0aW4gMQovLy8gdXNlIGNhc2VzLgovLy8KLy8vIEV4YW1wbGVzOgovLy8gYGBgZGFydAovLy8gdmFyIGVuY29kZWQgPSBsYXRpbjEuZW5jb2RlKCJibMOlYsOmcmdyw7hkIik7Ci8vLyB2YXIgZGVjb2RlZCA9IGxhdGluMS5kZWNvZGUoWzB4NjIsIDB4NmMsIDB4ZTUsIDB4NjIsIDB4ZTYsCi8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzIsIDB4NjcsIDB4NzIsIDB4ZjgsIDB4NjRdKTsKLy8vIGBgYApjb25zdCBMYXRpbjFDb2RlYyBsYXRpbjEgPSBMYXRpbjFDb2RlYygpOwoKY29uc3QgaW50IF9sYXRpbjFNYXNrID0gMHhGRjsKCi8vLyBBIFtMYXRpbjFDb2RlY10gZW5jb2RlcyBzdHJpbmdzIHRvIElTTyBMYXRpbi0xIChha2EgSVNPLTg4NTktMSkgYnl0ZXMKLy8vIGFuZCBkZWNvZGVzIExhdGluLTEgYnl0ZXMgdG8gc3RyaW5ncy4KY2xhc3MgTGF0aW4xQ29kZWMgZXh0ZW5kcyBFbmNvZGluZyB7CiAgZmluYWwgYm9vbCBfYWxsb3dJbnZhbGlkOwoKICAvLy8gSW5zdGFudGlhdGVzIGEgbmV3IFtMYXRpbjFDb2RlY10uCiAgLy8vCiAgLy8vIElmIFthbGxvd0ludmFsaWRdIGlzIHRydWUsIHRoZSBbZGVjb2RlXSBtZXRob2QgYW5kIHRoZSBjb252ZXJ0ZXIKICAvLy8gcmV0dXJuZWQgYnkgW2RlY29kZXJdIHdpbGwgZGVmYXVsdCB0byBhbGxvd2luZyBpbnZhbGlkIHZhbHVlcy4gSW52YWxpZAogIC8vLyB2YWx1ZXMgYXJlIGRlY29kZWQgaW50byB0aGUgVW5pY29kZSBSZXBsYWNlbWVudCBjaGFyYWN0ZXIgKFUrRkZGRCkuCiAgLy8vIENhbGxzIHRvIHRoZSBbZGVjb2RlXSBtZXRob2QgY2FuIG92ZXJyaWRlIHRoaXMgZGVmYXVsdC4KICAvLy8KICAvLy8gRW5jb2RlcnMgd2lsbCBub3QgYWNjZXB0IGludmFsaWQgKG5vbiBMYXRpbi0xKSBjaGFyYWN0ZXJzLgogIGNvbnN0IExhdGluMUNvZGVjKHtib29sIGFsbG93SW52YWxpZCA9IGZhbHNlfSkgOiBfYWxsb3dJbnZhbGlkID0gYWxsb3dJbnZhbGlkOwoKICAvLy8gVGhlIG5hbWUgb2YgdGhpcyBjb2RlYywgImlzby04ODU5LTEiLgogIFN0cmluZyBnZXQgbmFtZSA9PiAiaXNvLTg4NTktMSI7CgogIFVpbnQ4TGlzdCBlbmNvZGUoU3RyaW5nIHNvdXJjZSkgPT4gZW5jb2Rlci5jb252ZXJ0KHNvdXJjZSk7CgogIC8vLyBEZWNvZGVzIHRoZSBMYXRpbi0xIFtieXRlc10gKGEgbGlzdCBvZiB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VycykgdG8gdGhlCiAgLy8vIGNvcnJlc3BvbmRpbmcgc3RyaW5nLgogIC8vLwogIC8vLyBJZiBbYnl0ZXNdIGNvbnRhaW5zIHZhbHVlcyB0aGF0IGFyZSBub3QgaW4gdGhlIHJhbmdlIDAgLi4gMjU1LCB0aGUgZGVjb2RlcgogIC8vLyB3aWxsIGV2ZW50dWFsbHkgdGhyb3cgYSBbRm9ybWF0RXhjZXB0aW9uXS4KICAvLy8KICAvLy8gSWYgW2FsbG93SW52YWxpZF0gaXMgbm90IHByb3ZpZGVkLCBpdCBkZWZhdWx0cyB0byB0aGUgdmFsdWUgdXNlZCB0byBjcmVhdGUKICAvLy8gdGhpcyBbTGF0aW4xQ29kZWNdLgogIFN0cmluZyBkZWNvZGUoTGlzdDxpbnQ+IGJ5dGVzLCB7Ym9vbCBhbGxvd0ludmFsaWR9KSB7CiAgICBhbGxvd0ludmFsaWQgPz89IF9hbGxvd0ludmFsaWQ7CiAgICBpZiAoYWxsb3dJbnZhbGlkKSB7CiAgICAgIHJldHVybiBjb25zdCBMYXRpbjFEZWNvZGVyKGFsbG93SW52YWxpZDogdHJ1ZSkuY29udmVydChieXRlcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gY29uc3QgTGF0aW4xRGVjb2RlcihhbGxvd0ludmFsaWQ6IGZhbHNlKS5jb252ZXJ0KGJ5dGVzKTsKICAgIH0KICB9CgogIExhdGluMUVuY29kZXIgZ2V0IGVuY29kZXIgPT4gY29uc3QgTGF0aW4xRW5jb2RlcigpOwoKICBMYXRpbjFEZWNvZGVyIGdldCBkZWNvZGVyID0+IF9hbGxvd0ludmFsaWQKICAgICAgPyBjb25zdCBMYXRpbjFEZWNvZGVyKGFsbG93SW52YWxpZDogdHJ1ZSkKICAgICAgOiBjb25zdCBMYXRpbjFEZWNvZGVyKGFsbG93SW52YWxpZDogZmFsc2UpOwp9CgovLy8gVGhpcyBjbGFzcyBjb252ZXJ0cyBzdHJpbmdzIG9mIG9ubHkgSVNPIExhdGluLTEgY2hhcmFjdGVycyB0byBieXRlcy4KY2xhc3MgTGF0aW4xRW5jb2RlciBleHRlbmRzIF9Vbmljb2RlU3Vic2V0RW5jb2RlciB7CiAgY29uc3QgTGF0aW4xRW5jb2RlcigpIDogc3VwZXIoX2xhdGluMU1hc2spOwp9CgovLy8gVGhpcyBjbGFzcyBjb252ZXJ0cyBMYXRpbi0xIGJ5dGVzIChsaXN0cyBvZiB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VycykKLy8vIHRvIGEgc3RyaW5nLgpjbGFzcyBMYXRpbjFEZWNvZGVyIGV4dGVuZHMgX1VuaWNvZGVTdWJzZXREZWNvZGVyIHsKICAvLy8gSW5zdGFudGlhdGVzIGEgbmV3IFtMYXRpbjFEZWNvZGVyXS4KICAvLy8KICAvLy8gVGhlIG9wdGlvbmFsIFthbGxvd0ludmFsaWRdIGFyZ3VtZW50IGRlZmluZXMgaG93IFtjb252ZXJ0XSBkZWFscwogIC8vLyB3aXRoIGludmFsaWQgYnl0ZXMuCiAgLy8vCiAgLy8vIElmIGl0IGlzIGB0cnVlYCwgW2NvbnZlcnRdIHJlcGxhY2VzIGludmFsaWQgYnl0ZXMgd2l0aCB0aGUgVW5pY29kZQogIC8vLyBSZXBsYWNlbWVudCBjaGFyYWN0ZXIgYFUrRkZGRGAgKO+/vSkuCiAgLy8vIE90aGVyd2lzZSBpdCB0aHJvd3MgYSBbRm9ybWF0RXhjZXB0aW9uXS4KICBjb25zdCBMYXRpbjFEZWNvZGVyKHtib29sIGFsbG93SW52YWxpZCA9IGZhbHNlfSkKICAgICAgOiBzdXBlcihhbGxvd0ludmFsaWQsIF9sYXRpbjFNYXNrKTsKCiAgLy8vIFN0YXJ0cyBhIGNodW5rZWQgY29udmVyc2lvbi4KICAvLy8KICAvLy8gVGhlIGNvbnZlcnRlciB3b3JrcyBtb3JlIGVmZmljaWVudGx5IGlmIHRoZSBnaXZlbiBbc2lua10gaXMgYQogIC8vLyBbU3RyaW5nQ29udmVyc2lvblNpbmtdLgogIEJ5dGVDb252ZXJzaW9uU2luayBzdGFydENodW5rZWRDb252ZXJzaW9uKFNpbms8U3RyaW5nPiBzaW5rKSB7CiAgICBTdHJpbmdDb252ZXJzaW9uU2luayBzdHJpbmdTaW5rOwogICAgaWYgKHNpbmsgaXMgU3RyaW5nQ29udmVyc2lvblNpbmspIHsKICAgICAgc3RyaW5nU2luayA9IHNpbms7CiAgICB9IGVsc2UgewogICAgICBzdHJpbmdTaW5rID0gU3RyaW5nQ29udmVyc2lvblNpbmsuZnJvbShzaW5rKTsKICAgIH0KICAgIC8vIFRPRE8obHJuKTogVXNlIHN0cmluZ1NpbmsuYXNVdGYxNlNpbmsoKSBpZiBpdCBiZWNvbWVzIGF2YWlsYWJsZS4KICAgIGlmICghX2FsbG93SW52YWxpZCkgcmV0dXJuIF9MYXRpbjFEZWNvZGVyU2luayhzdHJpbmdTaW5rKTsKICAgIHJldHVybiBfTGF0aW4xQWxsb3dJbnZhbGlkRGVjb2RlclNpbmsoc3RyaW5nU2luayk7CiAgfQp9CgpjbGFzcyBfTGF0aW4xRGVjb2RlclNpbmsgZXh0ZW5kcyBCeXRlQ29udmVyc2lvblNpbmtCYXNlIHsKICBTdHJpbmdDb252ZXJzaW9uU2luayBfc2luazsKICBfTGF0aW4xRGVjb2RlclNpbmsodGhpcy5fc2luayk7CgogIHZvaWQgY2xvc2UoKSB7CiAgICBfc2luay5jbG9zZSgpOwogICAgX3NpbmsgPSBudWxsOwogIH0KCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IHNvdXJjZSkgewogICAgYWRkU2xpY2Uoc291cmNlLCAwLCBzb3VyY2UubGVuZ3RoLCBmYWxzZSk7CiAgfQoKICB2b2lkIF9hZGRTbGljZVRvU2luayhMaXN0PGludD4gc291cmNlLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICAvLyBJZiBfc2luayB3YXMgYSBVVEYtMTYgY29udmVyc2lvbiBzaW5rLCBqdXN0IGFkZCB0aGUgc2xpY2UgZGlyZWN0bHkgd2l0aAogICAgLy8gX3NpbmsuYWRkU2xpY2Uoc291cmNlLCBzdGFydCwgZW5kLCBpc0xhc3QpLgogICAgLy8gVGhlIGNvZGUgYmVsb3cgaXMgYW4gbW9kZXJhdGVseSBzdHVwaWQgd29ya2Fyb3VuZCB1bnRpbCBhIHJlYWwKICAgIC8vIHNvbHV0aW9uIGNhbiBiZSBtYWRlLgogICAgX3NpbmsuYWRkKFN0cmluZy5mcm9tQ2hhckNvZGVzKHNvdXJjZSwgc3RhcnQsIGVuZCkpOwogICAgaWYgKGlzTGFzdCkgY2xvc2UoKTsKICB9CgogIHZvaWQgYWRkU2xpY2UoTGlzdDxpbnQ+IHNvdXJjZSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGlzTGFzdCkgewogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgc291cmNlLmxlbmd0aCk7CiAgICBpZiAoc3RhcnQgPT0gZW5kKSByZXR1cm47CiAgICBpZiAoc291cmNlIGlzISBVaW50OExpc3QpIHsKICAgICAgLy8gTGlzdCBtYXkgY29udGFpbiB2YWx1ZSBvdXRzaWRlIG9mIHRoZSAwLi4yNTUgcmFuZ2UuIElmIHNvLCB0aHJvdy4KICAgICAgLy8gVGVjaG5pY2FsbHksIHdlIGNvdWxkIGV4Y3VzZSBVaW50OENsYW1wZWRMaXN0IGFzIHdlbGwsIGJ1dCBpdCB1bmxpa2VseQogICAgICAvLyB0byBiZSByZWxldmFudC4KICAgICAgX2NoZWNrVmFsaWRMYXRpbjEoc291cmNlLCBzdGFydCwgZW5kKTsKICAgIH0KICAgIF9hZGRTbGljZVRvU2luayhzb3VyY2UsIHN0YXJ0LCBlbmQsIGlzTGFzdCk7CiAgfQoKICBzdGF0aWMgdm9pZCBfY2hlY2tWYWxpZExhdGluMShMaXN0PGludD4gc291cmNlLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIHZhciBtYXNrID0gMDsKICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIG1hc2sgfD0gc291cmNlW2ldOwogICAgfQogICAgaWYgKG1hc2sgPj0gMCAmJiBtYXNrIDw9IF9sYXRpbjFNYXNrKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIF9yZXBvcnRJbnZhbGlkTGF0aW4xKHNvdXJjZSwgc3RhcnQsIGVuZCk7IC8vIEFsd2F5cyB0aHJvd3MuCiAgfQoKICBzdGF0aWMgdm9pZCBfcmVwb3J0SW52YWxpZExhdGluMShMaXN0PGludD4gc291cmNlLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBub24tTGF0aW4tMSBjaGFyYWN0ZXIgY29kZS4KICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIHZhciBjaGFyID0gc291cmNlW2ldOwogICAgICBpZiAoY2hhciA8IDAgfHwgY2hhciA+IF9sYXRpbjFNYXNrKSB7CiAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICAgICAiU291cmNlIGNvbnRhaW5zIG5vbi1MYXRpbi0xIGNoYXJhY3RlcnMuIiwgc291cmNlLCBpKTsKICAgICAgfQogICAgfQogICAgLy8gVW5yZWFjaGFibGUgLSB3ZSBvbmx5IGNhbGwgdGhlIGZ1bmN0aW9uIGlmIHRoZSBsb29wIGFib3ZlIHRocm93cy4KICAgIGFzc2VydChmYWxzZSk7CiAgfQp9CgpjbGFzcyBfTGF0aW4xQWxsb3dJbnZhbGlkRGVjb2RlclNpbmsgZXh0ZW5kcyBfTGF0aW4xRGVjb2RlclNpbmsgewogIF9MYXRpbjFBbGxvd0ludmFsaWREZWNvZGVyU2luayhTdHJpbmdDb252ZXJzaW9uU2luayBzaW5rKSA6IHN1cGVyKHNpbmspOwoKICB2b2lkIGFkZFNsaWNlKExpc3Q8aW50PiBzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHNvdXJjZS5sZW5ndGgpOwogICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgdmFyIGNoYXIgPSBzb3VyY2VbaV07CiAgICAgIGlmIChjaGFyID4gX2xhdGluMU1hc2sgfHwgY2hhciA8IDApIHsKICAgICAgICBpZiAoaSA+IHN0YXJ0KSBfYWRkU2xpY2VUb1Npbmsoc291cmNlLCBzdGFydCwgaSwgZmFsc2UpOwogICAgICAgIC8vIEFkZCBVVEYtOCBlbmNvZGluZyBvZiBVK0ZGRkQuCiAgICAgICAgX2FkZFNsaWNlVG9TaW5rKGNvbnN0IFsweEZGRkRdLCAwLCAxLCBmYWxzZSk7CiAgICAgICAgc3RhcnQgPSBpICsgMTsKICAgICAgfQogICAgfQogICAgaWYgKHN0YXJ0IDwgZW5kKSB7CiAgICAgIF9hZGRTbGljZVRvU2luayhzb3VyY2UsIHN0YXJ0LCBlbmQsIGlzTGFzdCk7CiAgICB9CiAgICBpZiAoaXNMYXN0KSB7CiAgICAgIGNsb3NlKCk7CiAgICB9CiAgfQp9CoC4AE5OPAEWAUQETg8EDgwvP0EIKgEeAUoqJRwBKAZHTUo+BkFRASwjAT4BTRwGUTEGURo4JBhFDUYGBAE2AS0wMgIBSTQuAgFJETQqBkcaBkkqLzMqASMGRB5BJSgZDTQGSD83BAIBOh4iARETEgQBHy8EAUxPM0YdORkEAUVBHiBLUBktBjEEAUgSKBkGLA4GQAQBSz8oHCwfQwgGSRMEAgFCSwFFOygcLEEpNhcIBhczBhIPBgQCARhkYXJ0OmNvbnZlcnQvbGF0aW4xLmRhcnQ2b3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvbnZlcnQvbGluZV9zcGxpdHRlci5kYXJ0k3wvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvbnZlcnQ7CgovLyBDaGFyYWN0ZXIgY29uc3RhbnRzLgpjb25zdCBpbnQgX0xGID0gMTA7CmNvbnN0IGludCBfQ1IgPSAxMzsKCi8vLyBBIFtTdHJlYW1UcmFuc2Zvcm1lcl0gdGhhdCBzcGxpdHMgYSBbU3RyaW5nXSBpbnRvIGluZGl2aWR1YWwgbGluZXMuCi8vLwovLy8gQSBsaW5lIGlzIHRlcm1pbmF0ZWQgYnkgZWl0aGVyIGEgQ1IgKFUrMDAwRCksIGEgTEYgKFUrMDAwQSksIGEKLy8vIENSK0xGIHNlcXVlbmNlIChET1MgbGluZSBlbmRpbmcpLAovLy8gYW5kIGEgZmluYWwgbm9uLWVtcHR5IGxpbmUgY2FuIGJlIGVuZGVkIGJ5IHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KLy8vCi8vLyBUaGUgcmV0dXJuZWQgbGluZXMgZG8gbm90IGNvbnRhaW4gdGhlIGxpbmUgdGVybWluYXRvcnMuCgpjbGFzcyBMaW5lU3BsaXR0ZXIgZXh0ZW5kcyBTdHJlYW1UcmFuc2Zvcm1lckJhc2U8U3RyaW5nLCBTdHJpbmc+IHsKICBjb25zdCBMaW5lU3BsaXR0ZXIoKTsKCiAgLy8vIFNwbGl0IFtsaW5lc10gaW50byBpbmRpdmlkdWFsIGxpbmVzLgogIC8vLwogIC8vLyBJZiBbc3RhcnRdIGFuZCBbZW5kXSBhcmUgcHJvdmlkZWQsIG9ubHkgc3BsaXQgdGhlIGNvbnRlbnRzIG9mCiAgLy8vIGBsaW5lcy5zdWJzdHJpbmcoc3RhcnQsIGVuZClgLiBUaGUgW3N0YXJ0XSBhbmQgW2VuZF0gdmFsdWVzIG11c3QKICAvLy8gc3BlY2lmeSBhIHZhbGlkIHN1Yi1yYW5nZSBvZiBbbGluZXNdCiAgLy8vIChgMCA8PSBzdGFydCA8PSBlbmQgPD0gbGluZXMubGVuZ3RoYCkuCiAgc3RhdGljIEl0ZXJhYmxlPFN0cmluZz4gc3BsaXQoU3RyaW5nIGxpbmVzLCBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pIHN5bmMqIHsKICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIGxpbmVzLmxlbmd0aCk7CiAgICB2YXIgc2xpY2VTdGFydCA9IHN0YXJ0OwogICAgdmFyIGNoYXIgPSAwOwogICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgdmFyIHByZXZpb3VzQ2hhciA9IGNoYXI7CiAgICAgIGNoYXIgPSBsaW5lcy5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoY2hhciAhPSBfQ1IpIHsKICAgICAgICBpZiAoY2hhciAhPSBfTEYpIGNvbnRpbnVlOwogICAgICAgIGlmIChwcmV2aW91c0NoYXIgPT0gX0NSKSB7CiAgICAgICAgICBzbGljZVN0YXJ0ID0gaSArIDE7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgeWllbGQgbGluZXMuc3Vic3RyaW5nKHNsaWNlU3RhcnQsIGkpOwogICAgICBzbGljZVN0YXJ0ID0gaSArIDE7CiAgICB9CiAgICBpZiAoc2xpY2VTdGFydCA8IGVuZCkgewogICAgICB5aWVsZCBsaW5lcy5zdWJzdHJpbmcoc2xpY2VTdGFydCwgZW5kKTsKICAgIH0KICB9CgogIExpc3Q8U3RyaW5nPiBjb252ZXJ0KFN0cmluZyBkYXRhKSB7CiAgICB2YXIgbGluZXMgPSA8U3RyaW5nPltdOwogICAgdmFyIGVuZCA9IGRhdGEubGVuZ3RoOwogICAgdmFyIHNsaWNlU3RhcnQgPSAwOwogICAgdmFyIGNoYXIgPSAwOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbmQ7IGkrKykgewogICAgICB2YXIgcHJldmlvdXNDaGFyID0gY2hhcjsKICAgICAgY2hhciA9IGRhdGEuY29kZVVuaXRBdChpKTsKICAgICAgaWYgKGNoYXIgIT0gX0NSKSB7CiAgICAgICAgaWYgKGNoYXIgIT0gX0xGKSBjb250aW51ZTsKICAgICAgICBpZiAocHJldmlvdXNDaGFyID09IF9DUikgewogICAgICAgICAgc2xpY2VTdGFydCA9IGkgKyAxOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxpbmVzLmFkZChkYXRhLnN1YnN0cmluZyhzbGljZVN0YXJ0LCBpKSk7CiAgICAgIHNsaWNlU3RhcnQgPSBpICsgMTsKICAgIH0KICAgIGlmIChzbGljZVN0YXJ0IDwgZW5kKSB7CiAgICAgIGxpbmVzLmFkZChkYXRhLnN1YnN0cmluZyhzbGljZVN0YXJ0LCBlbmQpKTsKICAgIH0KICAgIHJldHVybiBsaW5lczsKICB9CgogIFN0cmluZ0NvbnZlcnNpb25TaW5rIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxTdHJpbmc+IHNpbmspIHsKICAgIHJldHVybiBfTGluZVNwbGl0dGVyU2luaygKICAgICAgICBzaW5rIGlzIFN0cmluZ0NvbnZlcnNpb25TaW5rID8gc2luayA6IFN0cmluZ0NvbnZlcnNpb25TaW5rLmZyb20oc2luaykpOwogIH0KCiAgU3RyZWFtPFN0cmluZz4gYmluZChTdHJlYW08U3RyaW5nPiBzdHJlYW0pIHsKICAgIHJldHVybiBTdHJlYW08U3RyaW5nPi5ldmVudFRyYW5zZm9ybWVkKAogICAgICAgIHN0cmVhbSwgKEV2ZW50U2luazxTdHJpbmc+IHNpbmspID0+IF9MaW5lU3BsaXR0ZXJFdmVudFNpbmsoc2luaykpOwogIH0KfQoKLy8gVE9ETyhmbG9pdHNjaCk6IGRlYWwgd2l0aCB1dGY4LgpjbGFzcyBfTGluZVNwbGl0dGVyU2luayBleHRlbmRzIFN0cmluZ0NvbnZlcnNpb25TaW5rQmFzZSB7CiAgZmluYWwgU3RyaW5nQ29udmVyc2lvblNpbmsgX3Npbms7CgogIC8vLyBUaGUgY2Fycnktb3ZlciBmcm9tIHRoZSBwcmV2aW91cyBjaHVuay4KICAvLy8KICAvLy8gSWYgdGhlIHByZXZpb3VzIHNsaWNlIGVuZGVkIGluIGEgbGluZSB3aXRob3V0IGEgbGluZSB0ZXJtaW5hdG9yLAogIC8vLyB0aGVuIHRoZSBuZXh0IHNsaWNlIG1heSBjb250aW51ZSB0aGUgbGluZS4KICBTdHJpbmcgX2NhcnJ5OwoKICAvLy8gV2hldGhlciB0byBza2lwIGEgbGVhZGluZyBMRiBjaGFyYWN0ZXIgZnJvbSB0aGUgbmV4dCBzbGljZS4KICAvLy8KICAvLy8gSWYgdGhlIHByZXZpb3VzIHNsaWNlIGVuZGVkIG9uIGEgQ1IgY2hhcmFjdGVyLCBhIGZvbGxvd2luZyBMRgogIC8vLyB3b3VsZCBiZSBwYXJ0IG9mIHRoZSBzYW1lIGxpbmUgdGVybWluYXRpb24sIGFuZCBzaG91bGQgYmUgaWdub3JlZC4KICAvLy8KICAvLy8gT25seSBgdHJ1ZWAgd2hlbiBbX2NhcnJ5XSBpcyBgbnVsbGAuCiAgYm9vbCBfc2tpcExlYWRpbmdMRiA9IGZhbHNlOwoKICBfTGluZVNwbGl0dGVyU2luayh0aGlzLl9zaW5rKTsKCiAgdm9pZCBhZGRTbGljZShTdHJpbmcgY2h1bmssIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIGNodW5rLmxlbmd0aCk7CiAgICAvLyBJZiB0aGUgY2h1bmsgaXMgZW1wdHksIGl0J3MgcHJvYmFibHkgYmVjYXVzZSBpdCdzIHRoZSBsYXN0IG9uZS4KICAgIC8vIEhhbmRsZSB0aGF0IGhlcmUsIHNvIHdlIGtub3cgdGhlIHJhbmdlIGlzIG5vbi1lbXB0eSBiZWxvdy4KICAgIGlmIChzdGFydCA+PSBlbmQpIHsKICAgICAgaWYgKGlzTGFzdCkgY2xvc2UoKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKF9jYXJyeSAhPSBudWxsKSB7CiAgICAgIGFzc2VydCghX3NraXBMZWFkaW5nTEYpOwogICAgICBjaHVuayA9IF9jYXJyeSArIGNodW5rLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKICAgICAgc3RhcnQgPSAwOwogICAgICBlbmQgPSBjaHVuay5sZW5ndGg7CiAgICAgIF9jYXJyeSA9IG51bGw7CiAgICB9IGVsc2UgaWYgKF9za2lwTGVhZGluZ0xGKSB7CiAgICAgIGlmIChjaHVuay5jb2RlVW5pdEF0KHN0YXJ0KSA9PSBfTEYpIHsKICAgICAgICBzdGFydCArPSAxOwogICAgICB9CiAgICAgIF9za2lwTGVhZGluZ0xGID0gZmFsc2U7CiAgICB9CiAgICBfYWRkTGluZXMoY2h1bmssIHN0YXJ0LCBlbmQpOwogICAgaWYgKGlzTGFzdCkgY2xvc2UoKTsKICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBpZiAoX2NhcnJ5ICE9IG51bGwpIHsKICAgICAgX3NpbmsuYWRkKF9jYXJyeSk7CiAgICAgIF9jYXJyeSA9IG51bGw7CiAgICB9CiAgICBfc2luay5jbG9zZSgpOwogIH0KCiAgdm9pZCBfYWRkTGluZXMoU3RyaW5nIGxpbmVzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIHZhciBzbGljZVN0YXJ0ID0gc3RhcnQ7CiAgICB2YXIgY2hhciA9IDA7CiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICB2YXIgcHJldmlvdXNDaGFyID0gY2hhcjsKICAgICAgY2hhciA9IGxpbmVzLmNvZGVVbml0QXQoaSk7CiAgICAgIGlmIChjaGFyICE9IF9DUikgewogICAgICAgIGlmIChjaGFyICE9IF9MRikgY29udGludWU7CiAgICAgICAgaWYgKHByZXZpb3VzQ2hhciA9PSBfQ1IpIHsKICAgICAgICAgIHNsaWNlU3RhcnQgPSBpICsgMTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBfc2luay5hZGQobGluZXMuc3Vic3RyaW5nKHNsaWNlU3RhcnQsIGkpKTsKICAgICAgc2xpY2VTdGFydCA9IGkgKyAxOwogICAgfQogICAgaWYgKHNsaWNlU3RhcnQgPCBlbmQpIHsKICAgICAgX2NhcnJ5ID0gbGluZXMuc3Vic3RyaW5nKHNsaWNlU3RhcnQsIGVuZCk7CiAgICB9IGVsc2UgewogICAgICBfc2tpcExlYWRpbmdMRiA9IChjaGFyID09IF9DUik7CiAgICB9CiAgfQp9CgpjbGFzcyBfTGluZVNwbGl0dGVyRXZlbnRTaW5rIGV4dGVuZHMgX0xpbmVTcGxpdHRlclNpbmsKICAgIGltcGxlbWVudHMgRXZlbnRTaW5rPFN0cmluZz4gewogIGZpbmFsIEV2ZW50U2luazxTdHJpbmc+IF9ldmVudFNpbms7CgogIF9MaW5lU3BsaXR0ZXJFdmVudFNpbmsoRXZlbnRTaW5rPFN0cmluZz4gZXZlbnRTaW5rKQogICAgICA6IF9ldmVudFNpbmsgPSBldmVudFNpbmssCiAgICAgICAgc3VwZXIoU3RyaW5nQ29udmVyc2lvblNpbmsuZnJvbShldmVudFNpbmspKTsKCiAgdm9pZCBhZGRFcnJvcihPYmplY3QgbywgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pIHsKICAgIF9ldmVudFNpbmsuYWRkRXJyb3Iobywgc3RhY2tUcmFjZSk7CiAgfQp9CoCuAE5OPAEWARgUFAFIBEMmRgQ8AUMYASsGREcrLVBAHBIoHyIZIyMeFAoILBoGHC4GBAEmHBsYEiQfIRkjIx4UCggwGgYcMgYSBAFDHlAEAS8sSwQCASM7JAEuBkcxEQFCBkRJBisfASEBQUBHQhgbDgYaHzQRGhUhLBQIHgYiGQQBERoZFQYTBAE1HBIoHyIZIyMeFAoIMRoGHDENJgYEAgE3IyYBNiA1ATUoBAIBH2RhcnQ6Y29udmVydC9saW5lX3NwbGl0dGVyLmRhcnQ6b3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvbnZlcnQvc3RyaW5nX2NvbnZlcnNpb24uZGFydKWCLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb252ZXJ0OwoKLy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBjb252ZXJ0ZXJzIHRvCi8vLyBlZmZpY2llbnRseSB0cmFuc21pdCBTdHJpbmcgZGF0YS4KLy8vCi8vLyBJbnN0ZWFkIG9mIGxpbWl0aW5nIHRoZSBpbnRlcmZhY2UgdG8gb25lIG5vbi1jaHVua2VkIFN0cmluZyBpdCBhY2NlcHRzCi8vLyBwYXJ0aWFsIHN0cmluZ3Mgb3IgY2FuIGJlIHRyYW5zZm9ybWVkIGludG8gYSBieXRlIHNpbmsgdGhhdAovLy8gYWNjZXB0cyBVVEYtOCBjb2RlIHVuaXRzLgovLy8KLy8vIFRoaXMgYWJzdHJhY3QgY2xhc3Mgd2lsbCBsaWtlbHkgZ2V0IG1vcmUgbWV0aG9kcyBvdmVyIHRpbWUuIEltcGxlbWVudGVycyBhcmUKLy8vIHVyZ2VkIHRvIGV4dGVuZCBbU3RyaW5nQ29udmVyc2lvblNpbmtCYXNlXSBvciB0byBtaXggaW4KLy8vIFtTdHJpbmdDb252ZXJzaW9uU2lua01peGluXSwgdG8gZW5zdXJlIHRoYXQgdGhlaXIgY2xhc3MgY292ZXJzIHRoZSBuZXdseQovLy8gYWRkZWQgbWV0aG9kcy4KYWJzdHJhY3QgY2xhc3MgU3RyaW5nQ29udmVyc2lvblNpbmsgZXh0ZW5kcyBDaHVua2VkQ29udmVyc2lvblNpbms8U3RyaW5nPiB7CiAgU3RyaW5nQ29udmVyc2lvblNpbmsoKTsKICBmYWN0b3J5IFN0cmluZ0NvbnZlcnNpb25TaW5rLndpdGhDYWxsYmFjayh2b2lkIGNhbGxiYWNrKFN0cmluZyBhY2N1bXVsYXRlZCkpID0KICAgICAgX1N0cmluZ0NhbGxiYWNrU2luazsKICBmYWN0b3J5IFN0cmluZ0NvbnZlcnNpb25TaW5rLmZyb20oU2luazxTdHJpbmc+IHNpbmspID0gX1N0cmluZ0FkYXB0ZXJTaW5rOwoKICAvLy8gQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSB3cmFwcGluZyB0aGUgZ2l2ZW4gW3NpbmtdLgogIC8vLwogIC8vLyBFdmVyeSBzdHJpbmcgdGhhdCBpcyBhZGRlZCB0byB0aGUgcmV0dXJuZWQgaW5zdGFuY2UgaXMgZm9yd2FyZGVkIHRvCiAgLy8vIHRoZSBbc2lua10uIFRoZSBpbnN0YW5jZSBpcyBhbGxvd2VkIHRvIGJ1ZmZlciBhbmQgaXMgbm90IHJlcXVpcmVkIHRvCiAgLy8vIGZvcndhcmQgaW1tZWRpYXRlbHkuCiAgZmFjdG9yeSBTdHJpbmdDb252ZXJzaW9uU2luay5mcm9tU3RyaW5nU2luayhTdHJpbmdTaW5rIHNpbmspID0KICAgICAgX1N0cmluZ1NpbmtDb252ZXJzaW9uU2luazxTdHJpbmdTaW5rPjsKCiAgLy8vIEFkZHMgdGhlIG5leHQgW2NodW5rXSB0byBgdGhpc2AuCiAgLy8vCiAgLy8vIEFkZHMgdGhlIHN1YnN0cmluZyBkZWZpbmVkIGJ5IFtzdGFydF0gYW5kIFtlbmRdLWV4Y2x1c2l2ZSB0byBgdGhpc2AuCiAgLy8vCiAgLy8vIElmIFtpc0xhc3RdIGlzIGB0cnVlYCBjbG9zZXMgYHRoaXNgLgogIHZvaWQgYWRkU2xpY2UoU3RyaW5nIGNodW5rLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KTsKCiAgLy8vIFJldHVybnMgYHRoaXNgIGFzIGEgc2luayB0aGF0IGFjY2VwdHMgVVRGLTggaW5wdXQuCiAgLy8vCiAgLy8vIElmIHVzZWQsIHRoaXMgbWV0aG9kIG11c3QgYmUgdGhlIGZpcnN0IGFuZCBvbmx5IGNhbGwgdG8gYHRoaXNgLiBJdAogIC8vLyBpbnZhbGlkYXRlcyBgdGhpc2AuIEFsbCBmdXJ0aGVyIG9wZXJhdGlvbnMgbXVzdCBiZSBwZXJmb3JtZWQgb24gdGhlIHJlc3VsdC4KICBCeXRlQ29udmVyc2lvblNpbmsgYXNVdGY4U2luayhib29sIGFsbG93TWFsZm9ybWVkKTsKICAvLyAtIGFzUnVuZVNpbmsKICAvLyAtIGFzQ29kZVVuaXRzU2luawoKICAvLy8gUmV0dXJucyBgdGhpc2AgYXMgYSBbQ2xvc2FibGVTdHJpbmdTaW5rXS4KICAvLy8KICAvLy8gSWYgdXNlZCwgdGhpcyBtZXRob2QgbXVzdCBiZSB0aGUgZmlyc3QgYW5kIG9ubHkgY2FsbCB0byBgdGhpc2AuIEl0CiAgLy8vIGludmFsaWRhdGVzIGB0aGlzYC4gQWxsIGZ1cnRoZXIgb3BlcmF0aW9ucyBtdXN0IGJlIHBlcmZvcm1lZCBvbiB0aGUgcmVzdWx0LgogIENsb3NhYmxlU3RyaW5nU2luayBhc1N0cmluZ1NpbmsoKTsKfQoKLy8vIEEgW0Nsb3NhYmxlU3RyaW5nU2lua10gZXh0ZW5kcyB0aGUgW1N0cmluZ1NpbmtdIGludGVyZmFjZSBieSBhZGRpbmcgYQovLy8gYGNsb3NlYCBtZXRob2QuCmFic3RyYWN0IGNsYXNzIENsb3NhYmxlU3RyaW5nU2luayBleHRlbmRzIFN0cmluZ1NpbmsgewogIC8vLyBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGNvbWJpbmluZyBhIFtTdHJpbmdTaW5rXSBbc2lua10gYW5kIGEgY2FsbGJhY2sKICAvLy8gW29uQ2xvc2VdIHdoaWNoIGlzIGludm9rZWQgd2hlbiB0aGUgcmV0dXJuZWQgaW5zdGFuY2UgaXMgY2xvc2VkLgogIGZhY3RvcnkgQ2xvc2FibGVTdHJpbmdTaW5rLmZyb21TdHJpbmdTaW5rKFN0cmluZ1Npbmsgc2luaywgdm9pZCBvbkNsb3NlKCkpID0KICAgICAgX0Nsb3NhYmxlU3RyaW5nU2luazsKCiAgLy8vIENsb3NlcyBgdGhpc2AgYW5kIGZsdXNoZXMgYW55IG91dHN0YW5kaW5nIGRhdGEuCiAgdm9pZCBjbG9zZSgpOwp9CgovLy8gVGhpcyBjbGFzcyB3cmFwcyBhbiBleGlzdGluZyBbU3RyaW5nU2lua10gYW5kIGludm9rZXMgYQovLy8gY2xvc3VyZSB3aGVuIFtjbG9zZV0gaXMgaW52b2tlZC4KY2xhc3MgX0Nsb3NhYmxlU3RyaW5nU2luayBpbXBsZW1lbnRzIENsb3NhYmxlU3RyaW5nU2luayB7CiAgZmluYWwgdm9pZCBGdW5jdGlvbigpIF9jYWxsYmFjazsKICBmaW5hbCBTdHJpbmdTaW5rIF9zaW5rOwoKICBfQ2xvc2FibGVTdHJpbmdTaW5rKHRoaXMuX3NpbmssIHRoaXMuX2NhbGxiYWNrKTsKCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9jYWxsYmFjaygpOwogIH0KCiAgdm9pZCB3cml0ZUNoYXJDb2RlKGludCBjaGFyQ29kZSkgewogICAgX3Npbmsud3JpdGVDaGFyQ29kZShjaGFyQ29kZSk7CiAgfQoKICB2b2lkIHdyaXRlKE9iamVjdCBvKSB7CiAgICBfc2luay53cml0ZShvKTsKICB9CgogIHZvaWQgd3JpdGVsbihbT2JqZWN0IG8gPSAiIl0pIHsKICAgIF9zaW5rLndyaXRlbG4obyk7CiAgfQoKICB2b2lkIHdyaXRlQWxsKEl0ZXJhYmxlIG9iamVjdHMsIFtTdHJpbmcgc2VwYXJhdG9yID0gIiJdKSB7CiAgICBfc2luay53cml0ZUFsbChvYmplY3RzLCBzZXBhcmF0b3IpOwogIH0KfQoKLy8vIFRoaXMgY2xhc3Mgd3JhcHMgYW4gZXhpc3RpbmcgW1N0cmluZ0NvbnZlcnNpb25TaW5rXSBhbmQgZXhwb3NlcyBhCi8vLyBbQ2xvc2FibGVTdHJpbmdTaW5rXSBpbnRlcmZhY2UuIFRoZSB3cmFwcGVkIHNpbmsgb25seSBuZWVkcyB0byBpbXBsZW1lbnQKLy8vIGBhZGRgIGFuZCBgY2xvc2VgLgovLyBUT0RPKGZsb2l0c2NoKTogbWFrZSB0aGlzIGNsYXNzIHB1YmxpYz8KY2xhc3MgX1N0cmluZ0NvbnZlcnNpb25TaW5rQXNTdHJpbmdTaW5rQWRhcHRlciBpbXBsZW1lbnRzIENsb3NhYmxlU3RyaW5nU2luayB7CiAgc3RhdGljIGNvbnN0IF9NSU5fU1RSSU5HX1NJWkUgPSAxNjsKCiAgU3RyaW5nQnVmZmVyIF9idWZmZXI7CiAgU3RyaW5nQ29udmVyc2lvblNpbmsgX2NodW5rZWRTaW5rOwoKICBfU3RyaW5nQ29udmVyc2lvblNpbmtBc1N0cmluZ1NpbmtBZGFwdGVyKHRoaXMuX2NodW5rZWRTaW5rKQogICAgICA6IF9idWZmZXIgPSBTdHJpbmdCdWZmZXIoKTsKCiAgdm9pZCBjbG9zZSgpIHsKICAgIGlmIChfYnVmZmVyLmlzTm90RW1wdHkpIF9mbHVzaCgpOwogICAgX2NodW5rZWRTaW5rLmNsb3NlKCk7CiAgfQoKICB2b2lkIHdyaXRlQ2hhckNvZGUoaW50IGNoYXJDb2RlKSB7CiAgICBfYnVmZmVyLndyaXRlQ2hhckNvZGUoY2hhckNvZGUpOwogICAgaWYgKF9idWZmZXIubGVuZ3RoID4gX01JTl9TVFJJTkdfU0laRSkgX2ZsdXNoKCk7CiAgfQoKICB2b2lkIHdyaXRlKE9iamVjdCBvKSB7CiAgICBpZiAoX2J1ZmZlci5pc05vdEVtcHR5KSBfZmx1c2goKTsKICAgIF9jaHVua2VkU2luay5hZGQoby50b1N0cmluZygpKTsKICB9CgogIHZvaWQgd3JpdGVsbihbT2JqZWN0IG8gPSAiIl0pIHsKICAgIF9idWZmZXIud3JpdGVsbihvKTsKICAgIGlmIChfYnVmZmVyLmxlbmd0aCA+IF9NSU5fU1RSSU5HX1NJWkUpIF9mbHVzaCgpOwogIH0KCiAgdm9pZCB3cml0ZUFsbChJdGVyYWJsZSBvYmplY3RzLCBbU3RyaW5nIHNlcGFyYXRvciA9ICIiXSkgewogICAgaWYgKF9idWZmZXIuaXNOb3RFbXB0eSkgX2ZsdXNoKCk7CiAgICB2YXIgaXRlcmF0b3IgPSBvYmplY3RzLml0ZXJhdG9yOwogICAgaWYgKCFpdGVyYXRvci5tb3ZlTmV4dCgpKSByZXR1cm47CiAgICBpZiAoc2VwYXJhdG9yLmlzRW1wdHkpIHsKICAgICAgZG8gewogICAgICAgIF9jaHVua2VkU2luay5hZGQoaXRlcmF0b3IuY3VycmVudC50b1N0cmluZygpKTsKICAgICAgfSB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSk7CiAgICB9IGVsc2UgewogICAgICBfY2h1bmtlZFNpbmsuYWRkKGl0ZXJhdG9yLmN1cnJlbnQudG9TdHJpbmcoKSk7CiAgICAgIHdoaWxlIChpdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgICAgd3JpdGUoc2VwYXJhdG9yKTsKICAgICAgICBfY2h1bmtlZFNpbmsuYWRkKGl0ZXJhdG9yLmN1cnJlbnQudG9TdHJpbmcoKSk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgX2ZsdXNoKCkgewogICAgdmFyIGFjY3VtdWxhdGVkID0gX2J1ZmZlci50b1N0cmluZygpOwogICAgX2J1ZmZlci5jbGVhcigpOwogICAgX2NodW5rZWRTaW5rLmFkZChhY2N1bXVsYXRlZCk7CiAgfQp9CgovLy8gVGhpcyBjbGFzcyBwcm92aWRlcyBhIGJhc2UtY2xhc3MgZm9yIGNvbnZlcnRlcnMgdGhhdCBuZWVkIHRvIGFjY2VwdCBTdHJpbmcKLy8vIGlucHV0cy4KYWJzdHJhY3QgY2xhc3MgU3RyaW5nQ29udmVyc2lvblNpbmtCYXNlIGV4dGVuZHMgU3RyaW5nQ29udmVyc2lvblNpbmtNaXhpbiB7fQoKLy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBtaXhpbiBmb3IgY29udmVydGVycyB0aGF0IG5lZWQgdG8gYWNjZXB0IFN0cmluZwovLy8gaW5wdXRzLgphYnN0cmFjdCBjbGFzcyBTdHJpbmdDb252ZXJzaW9uU2lua01peGluIGltcGxlbWVudHMgU3RyaW5nQ29udmVyc2lvblNpbmsgewogIHZvaWQgYWRkU2xpY2UoU3RyaW5nIHN0ciwgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGlzTGFzdCk7CiAgdm9pZCBjbG9zZSgpOwoKICB2b2lkIGFkZChTdHJpbmcgc3RyKSB7CiAgICBhZGRTbGljZShzdHIsIDAsIHN0ci5sZW5ndGgsIGZhbHNlKTsKICB9CgogIEJ5dGVDb252ZXJzaW9uU2luayBhc1V0ZjhTaW5rKGJvb2wgYWxsb3dNYWxmb3JtZWQpIHsKICAgIHJldHVybiBfVXRmOENvbnZlcnNpb25TaW5rKHRoaXMsIGFsbG93TWFsZm9ybWVkKTsKICB9CgogIENsb3NhYmxlU3RyaW5nU2luayBhc1N0cmluZ1NpbmsoKSB7CiAgICByZXR1cm4gX1N0cmluZ0NvbnZlcnNpb25TaW5rQXNTdHJpbmdTaW5rQWRhcHRlcih0aGlzKTsKICB9Cn0KCi8vLyBUaGlzIGNsYXNzIGlzIGEgW1N0cmluZ0NvbnZlcnNpb25TaW5rXSB0aGF0IHdyYXBzIGEgW1N0cmluZ1NpbmtdLgpjbGFzcyBfU3RyaW5nU2lua0NvbnZlcnNpb25TaW5rPFRTdHJpbmdTaW5rIGV4dGVuZHMgU3RyaW5nU2luaz4KICAgIGV4dGVuZHMgU3RyaW5nQ29udmVyc2lvblNpbmtCYXNlIHsKICBUU3RyaW5nU2luayBfc3RyaW5nU2luazsKICBfU3RyaW5nU2lua0NvbnZlcnNpb25TaW5rKHRoaXMuX3N0cmluZ1NpbmspOwoKICB2b2lkIGNsb3NlKCkge30KICB2b2lkIGFkZFNsaWNlKFN0cmluZyBzdHIsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIGlmIChzdGFydCAhPSAwIHx8IGVuZCAhPSBzdHIubGVuZ3RoKSB7CiAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgICAgX3N0cmluZ1Npbmsud3JpdGVDaGFyQ29kZShzdHIuY29kZVVuaXRBdChpKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIF9zdHJpbmdTaW5rLndyaXRlKHN0cik7CiAgICB9CiAgICBpZiAoaXNMYXN0KSBjbG9zZSgpOwogIH0KCiAgdm9pZCBhZGQoU3RyaW5nIHN0cikgewogICAgX3N0cmluZ1Npbmsud3JpdGUoc3RyKTsKICB9CgogIEJ5dGVDb252ZXJzaW9uU2luayBhc1V0ZjhTaW5rKGJvb2wgYWxsb3dNYWxmb3JtZWQpIHsKICAgIHJldHVybiBfVXRmOFN0cmluZ1NpbmtBZGFwdGVyKHRoaXMsIF9zdHJpbmdTaW5rLCBhbGxvd01hbGZvcm1lZCk7CiAgfQoKICBDbG9zYWJsZVN0cmluZ1NpbmsgYXNTdHJpbmdTaW5rKCkgewogICAgcmV0dXJuIENsb3NhYmxlU3RyaW5nU2luay5mcm9tU3RyaW5nU2luayhfc3RyaW5nU2luaywgY2xvc2UpOwogIH0KfQoKLy8vIFRoaXMgY2xhc3MgYWNjdW11bGF0ZXMgYWxsIGNodW5rcyBpbnRvIG9uZSBzdHJpbmcKLy8vIGFuZCBpbnZva2VzIGEgY2FsbGJhY2sgd2hlbiB0aGUgc2luayBpcyBjbG9zZWQuCi8vLwovLy8gVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byB0ZXJtaW5hdGUgYSBjaHVua2VkIGNvbnZlcnNpb24uCmNsYXNzIF9TdHJpbmdDYWxsYmFja1NpbmsgZXh0ZW5kcyBfU3RyaW5nU2lua0NvbnZlcnNpb25TaW5rPFN0cmluZ0J1ZmZlcj4gewogIGZpbmFsIHZvaWQgRnVuY3Rpb24oU3RyaW5nKSBfY2FsbGJhY2s7CiAgX1N0cmluZ0NhbGxiYWNrU2luayh0aGlzLl9jYWxsYmFjaykgOiBzdXBlcihTdHJpbmdCdWZmZXIoKSk7CgogIHZvaWQgY2xvc2UoKSB7CiAgICB2YXIgYWNjdW11bGF0ZWQgPSBfc3RyaW5nU2luay50b1N0cmluZygpOwogICAgX3N0cmluZ1NpbmsuY2xlYXIoKTsKICAgIF9jYWxsYmFjayhhY2N1bXVsYXRlZCk7CiAgfQoKICBCeXRlQ29udmVyc2lvblNpbmsgYXNVdGY4U2luayhib29sIGFsbG93TWFsZm9ybWVkKSB7CiAgICByZXR1cm4gX1V0ZjhTdHJpbmdTaW5rQWRhcHRlcih0aGlzLCBfc3RyaW5nU2luaywgYWxsb3dNYWxmb3JtZWQpOwogIH0KfQoKLy8vIFRoaXMgY2xhc3MgYWRhcHRzIGEgc2ltcGxlIFtDaHVua2VkQ29udmVyc2lvblNpbmtdIHRvIGEKLy8vIFtTdHJpbmdDb252ZXJzaW9uU2lua10uCi8vLwovLy8gQWxsIGFkZGl0aW9uYWwgbWV0aG9kcyBvZiB0aGUgW1N0cmluZ0NvbnZlcnNpb25TaW5rXSAoY29tcGFyZWQgdG8gdGhlCi8vLyBDaHVua2VkQ29udmVyc2lvblNpbmspIGFyZSByZWRpcmVjdGVkIHRvIHRoZSBgYWRkYCBtZXRob2QuCmNsYXNzIF9TdHJpbmdBZGFwdGVyU2luayBleHRlbmRzIFN0cmluZ0NvbnZlcnNpb25TaW5rQmFzZSB7CiAgZmluYWwgU2luazxTdHJpbmc+IF9zaW5rOwoKICBfU3RyaW5nQWRhcHRlclNpbmsodGhpcy5fc2luayk7CgogIHZvaWQgYWRkKFN0cmluZyBzdHIpIHsKICAgIF9zaW5rLmFkZChzdHIpOwogIH0KCiAgdm9pZCBhZGRTbGljZShTdHJpbmcgc3RyLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICBpZiAoc3RhcnQgPT0gMCAmJiBlbmQgPT0gc3RyLmxlbmd0aCkgewogICAgICBhZGQoc3RyKTsKICAgIH0gZWxzZSB7CiAgICAgIGFkZChzdHIuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKTsKICAgIH0KICAgIGlmIChpc0xhc3QpIGNsb3NlKCk7CiAgfQoKICB2b2lkIGNsb3NlKCkgewogICAgX3NpbmsuY2xvc2UoKTsKICB9Cn0KCi8vLyBEZWNvZGVzIFVURi04IGNvZGUgdW5pdHMgYW5kIHN0b3JlcyB0aGVtIGluIGEgW1N0cmluZ1NpbmtdLgpjbGFzcyBfVXRmOFN0cmluZ1NpbmtBZGFwdGVyIGV4dGVuZHMgQnl0ZUNvbnZlcnNpb25TaW5rIHsKICBmaW5hbCBfVXRmOERlY29kZXIgX2RlY29kZXI7CiAgZmluYWwgU2luayBfc2luazsKCiAgX1V0ZjhTdHJpbmdTaW5rQWRhcHRlcih0aGlzLl9zaW5rLCBTdHJpbmdTaW5rIHN0cmluZ1NpbmssIGJvb2wgYWxsb3dNYWxmb3JtZWQpCiAgICAgIDogX2RlY29kZXIgPSBfVXRmOERlY29kZXIoc3RyaW5nU2luaywgYWxsb3dNYWxmb3JtZWQpOwoKICB2b2lkIGNsb3NlKCkgewogICAgX2RlY29kZXIuY2xvc2UoKTsKICAgIGlmIChfc2luayAhPSBudWxsKSBfc2luay5jbG9zZSgpOwogIH0KCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGNodW5rKSB7CiAgICBhZGRTbGljZShjaHVuaywgMCwgY2h1bmsubGVuZ3RoLCBmYWxzZSk7CiAgfQoKICB2b2lkIGFkZFNsaWNlKAogICAgICBMaXN0PGludD4gY29kZVVuaXRzLCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4LCBib29sIGlzTGFzdCkgewogICAgX2RlY29kZXIuY29udmVydChjb2RlVW5pdHMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTsKICAgIGlmIChpc0xhc3QpIGNsb3NlKCk7CiAgfQp9CgovLy8gRGVjb2RlcyBVVEYtOCBjb2RlIHVuaXRzLgovLy8KLy8vIEZvcndhcmRzIHRoZSBkZWNvZGVkIHN0cmluZ3MgdG8gdGhlIGdpdmVuIFtTdHJpbmdDb252ZXJzaW9uU2lua10uCi8vIFRPRE8oZmxvaXRzY2gpOiBtYWtlIHRoaXMgY2xhc3MgcHVibGljPwpjbGFzcyBfVXRmOENvbnZlcnNpb25TaW5rIGV4dGVuZHMgQnl0ZUNvbnZlcnNpb25TaW5rIHsKICBmaW5hbCBfVXRmOERlY29kZXIgX2RlY29kZXI7CiAgZmluYWwgU3RyaW5nQ29udmVyc2lvblNpbmsgX2NodW5rZWRTaW5rOwogIGZpbmFsIFN0cmluZ0J1ZmZlciBfYnVmZmVyOwogIF9VdGY4Q29udmVyc2lvblNpbmsoU3RyaW5nQ29udmVyc2lvblNpbmsgc2luaywgYm9vbCBhbGxvd01hbGZvcm1lZCkKICAgICAgOiB0aGlzLl8oc2luaywgU3RyaW5nQnVmZmVyKCksIGFsbG93TWFsZm9ybWVkKTsKCiAgX1V0ZjhDb252ZXJzaW9uU2luay5fKAogICAgICB0aGlzLl9jaHVua2VkU2luaywgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciwgYm9vbCBhbGxvd01hbGZvcm1lZCkKICAgICAgOiBfZGVjb2RlciA9IF9VdGY4RGVjb2RlcihzdHJpbmdCdWZmZXIsIGFsbG93TWFsZm9ybWVkKSwKICAgICAgICBfYnVmZmVyID0gc3RyaW5nQnVmZmVyOwoKICB2b2lkIGNsb3NlKCkgewogICAgX2RlY29kZXIuY2xvc2UoKTsKICAgIGlmIChfYnVmZmVyLmlzTm90RW1wdHkpIHsKICAgICAgdmFyIGFjY3VtdWxhdGVkID0gX2J1ZmZlci50b1N0cmluZygpOwogICAgICBfYnVmZmVyLmNsZWFyKCk7CiAgICAgIF9jaHVua2VkU2luay5hZGRTbGljZShhY2N1bXVsYXRlZCwgMCwgYWNjdW11bGF0ZWQubGVuZ3RoLCB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIF9jaHVua2VkU2luay5jbG9zZSgpOwogICAgfQogIH0KCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGNodW5rKSB7CiAgICBhZGRTbGljZShjaHVuaywgMCwgY2h1bmsubGVuZ3RoLCBmYWxzZSk7CiAgfQoKICB2b2lkIGFkZFNsaWNlKExpc3Q8aW50PiBjaHVuaywgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCwgYm9vbCBpc0xhc3QpIHsKICAgIF9kZWNvZGVyLmNvbnZlcnQoY2h1bmssIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTsKICAgIGlmIChfYnVmZmVyLmlzTm90RW1wdHkpIHsKICAgICAgdmFyIGFjY3VtdWxhdGVkID0gX2J1ZmZlci50b1N0cmluZygpOwogICAgICBfY2h1bmtlZFNpbmsuYWRkU2xpY2UoYWNjdW11bGF0ZWQsIDAsIGFjY3VtdWxhdGVkLmxlbmd0aCwgaXNMYXN0KTsKICAgICAgX2J1ZmZlci5jbGVhcigpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoaXNMYXN0KSBjbG9zZSgpOwogIH0KfQqBQABOTjwBFgE3JgRLQB4EUTxNE0waURtNATgGSksbQS0BJwZLBitAATkGSVI2EhcBMAZJUiUCAUoUN0xHTxsBNhACATwlOiMaATMBEREEASUjBAEZFAQBIhYEAT0oBAIBRk0XK08mARglAT4iAREmGgQBJSU1BAEZJiQEASIYNQQBPSYlJh0LNyUNNSQaNwgGBAESKhUjBAIBTwxNAUoMSz4QARkpBAE3NgQBJjsEAgFGQCcbLwESPysqNggNHgYZBAEZHAQBN0YEASZCBAIBNjQEPkwpPwERLhkcBAE3RgQCATwcBEo/PBwBIgEZFAQBPysQDSYGGQQBERMEAgFAOh8UAVE9AREWJgQBHi0EARFINxkEAgEeBEYrNx8rHkY2ARlJPyABERYeLBdHDRwGBAEeLQQBTjMeLEkXDgYZBAIBI2RhcnQ6Y29udmVydC9zdHJpbmdfY29udmVyc2lvbi5kYXJ0LG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb252ZXJ0L3V0Zi5kYXJ0wABOhy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29udmVydDsKCi8vLyBUaGUgVW5pY29kZSBSZXBsYWNlbWVudCBjaGFyYWN0ZXIgYFUrRkZGRGAgKO+/vSkuCmNvbnN0IGludCB1bmljb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXJSdW5lID0gMHhGRkZEOwoKLy8vIFRoZSBVbmljb2RlIEJ5dGUgT3JkZXIgTWFya2VyIChCT00pIGNoYXJhY3RlciBgVStGRUZGYC4KY29uc3QgaW50IHVuaWNvZGVCb21DaGFyYWN0ZXJSdW5lID0gMHhGRUZGOwoKLy8vIEFuIGluc3RhbmNlIG9mIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBbVXRmOENvZGVjXS4KLy8vCi8vLyBUaGlzIGluc3RhbmNlIHByb3ZpZGVzIGEgY29udmVuaWVudCBhY2Nlc3MgdG8gdGhlIG1vc3QgY29tbW9uIFVURi04Ci8vLyB1c2UgY2FzZXMuCi8vLwovLy8gRXhhbXBsZXM6Ci8vLwovLy8gICAgIHZhciBlbmNvZGVkID0gdXRmOC5lbmNvZGUoIsOOw7HFo8OpcsOxw6XFo8Ouw7bDscOlxLzDrsW+w6XFo8Ou4budw7EiKTsKLy8vICAgICB2YXIgZGVjb2RlZCA9IHV0ZjguZGVjb2RlKFsweDYyLCAweDZjLCAweGMzLCAweGE1LCAweDYyLCAweGMzLCAweGE2LAovLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzIsIDB4NjcsIDB4NzIsIDB4YzMsIDB4YjgsIDB4NjRdKTsKY29uc3QgVXRmOENvZGVjIHV0ZjggPSBVdGY4Q29kZWMoKTsKCi8vLyBBIFtVdGY4Q29kZWNdIGVuY29kZXMgc3RyaW5ncyB0byB1dGYtOCBjb2RlIHVuaXRzIChieXRlcykgYW5kIGRlY29kZXMKLy8vIFVURi04IGNvZGUgdW5pdHMgdG8gc3RyaW5ncy4KY2xhc3MgVXRmOENvZGVjIGV4dGVuZHMgRW5jb2RpbmcgewogIGZpbmFsIGJvb2wgX2FsbG93TWFsZm9ybWVkOwoKICAvLy8gSW5zdGFudGlhdGVzIGEgbmV3IFtVdGY4Q29kZWNdLgogIC8vLwogIC8vLyBUaGUgb3B0aW9uYWwgW2FsbG93TWFsZm9ybWVkXSBhcmd1bWVudCBkZWZpbmVzIGhvdyBbZGVjb2Rlcl0gKGFuZCBbZGVjb2RlXSkKICAvLy8gZGVhbCB3aXRoIGludmFsaWQgb3IgdW50ZXJtaW5hdGVkIGNoYXJhY3RlciBzZXF1ZW5jZXMuCiAgLy8vCiAgLy8vIElmIGl0IGlzIGB0cnVlYCAoYW5kIG5vdCBvdmVycmlkZGVuIGF0IHRoZSBtZXRob2QgaW52b2NhdGlvbikgW2RlY29kZV0gYW5kCiAgLy8vIHRoZSBbZGVjb2Rlcl0gcmVwbGFjZSBpbnZhbGlkIChvciB1bnRlcm1pbmF0ZWQpIG9jdGV0CiAgLy8vIHNlcXVlbmNlcyB3aXRoIHRoZSBVbmljb2RlIFJlcGxhY2VtZW50IGNoYXJhY3RlciBgVStGRkZEYCAo77+9KS4gT3RoZXJ3aXNlCiAgLy8vIHRoZXkgdGhyb3cgYSBbRm9ybWF0RXhjZXB0aW9uXS4KICBjb25zdCBVdGY4Q29kZWMoe2Jvb2wgYWxsb3dNYWxmb3JtZWQgPSBmYWxzZX0pCiAgICAgIDogX2FsbG93TWFsZm9ybWVkID0gYWxsb3dNYWxmb3JtZWQ7CgogIC8vLyBUaGUgbmFtZSBvZiB0aGlzIGNvZGVjLCAidXRmLTgiLgogIFN0cmluZyBnZXQgbmFtZSA9PiAidXRmLTgiOwoKICAvLy8gRGVjb2RlcyB0aGUgVVRGLTggW2NvZGVVbml0c10gKGEgbGlzdCBvZiB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VycykgdG8gdGhlCiAgLy8vIGNvcnJlc3BvbmRpbmcgc3RyaW5nLgogIC8vLwogIC8vLyBJZiB0aGUgW2NvZGVVbml0c10gc3RhcnQgd2l0aCB0aGUgZW5jb2Rpbmcgb2YgYQogIC8vLyBbdW5pY29kZUJvbUNoYXJhY3RlclJ1bmVdLCB0aGF0IGNoYXJhY3RlciBpcyBkaXNjYXJkZWQuCiAgLy8vCiAgLy8vIElmIFthbGxvd01hbGZvcm1lZF0gaXMgYHRydWVgIHRoZSBkZWNvZGVyIHJlcGxhY2VzIGludmFsaWQgKG9yCiAgLy8vIHVudGVybWluYXRlZCkgY2hhcmFjdGVyIHNlcXVlbmNlcyB3aXRoIHRoZSBVbmljb2RlIFJlcGxhY2VtZW50IGNoYXJhY3RlcgogIC8vLyBgVStGRkZEYCAo77+9KS4gT3RoZXJ3aXNlIGl0IHRocm93cyBhIFtGb3JtYXRFeGNlcHRpb25dLgogIC8vLwogIC8vLyBJZiBbYWxsb3dNYWxmb3JtZWRdIGlzIG5vdCBnaXZlbiwgaXQgZGVmYXVsdHMgdG8gdGhlIGBhbGxvd01hbGZvcm1lZGAgdGhhdAogIC8vLyB3YXMgdXNlZCB0byBpbnN0YW50aWF0ZSBgdGhpc2AuCiAgU3RyaW5nIGRlY29kZShMaXN0PGludD4gY29kZVVuaXRzLCB7Ym9vbCBhbGxvd01hbGZvcm1lZH0pIHsKICAgIGFsbG93TWFsZm9ybWVkID8/PSBfYWxsb3dNYWxmb3JtZWQ7CiAgICByZXR1cm4gVXRmOERlY29kZXIoYWxsb3dNYWxmb3JtZWQ6IGFsbG93TWFsZm9ybWVkKS5jb252ZXJ0KGNvZGVVbml0cyk7CiAgfQoKICBVdGY4RW5jb2RlciBnZXQgZW5jb2RlciA9PiBjb25zdCBVdGY4RW5jb2RlcigpOwogIFV0ZjhEZWNvZGVyIGdldCBkZWNvZGVyIHsKICAgIHJldHVybiBVdGY4RGVjb2RlcihhbGxvd01hbGZvcm1lZDogX2FsbG93TWFsZm9ybWVkKTsKICB9Cn0KCi8vLyBUaGlzIGNsYXNzIGNvbnZlcnRzIHN0cmluZ3MgdG8gdGhlaXIgVVRGLTggY29kZSB1bml0cyAoYSBsaXN0IG9mCi8vLyB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VycykuCmNsYXNzIFV0ZjhFbmNvZGVyIGV4dGVuZHMgQ29udmVydGVyPFN0cmluZywgTGlzdDxpbnQ+PiB7CiAgY29uc3QgVXRmOEVuY29kZXIoKTsKCiAgLy8vIENvbnZlcnRzIFtzdHJpbmddIHRvIGl0cyBVVEYtOCBjb2RlIHVuaXRzIChhIGxpc3Qgb2YKICAvLy8gdW5zaWduZWQgOC1iaXQgaW50ZWdlcnMpLgogIC8vLwogIC8vLyBJZiBbc3RhcnRdIGFuZCBbZW5kXSBhcmUgcHJvdmlkZWQsIG9ubHkgdGhlIHN1YnN0cmluZwogIC8vLyBgc3RyaW5nLnN1YnN0cmluZyhzdGFydCwgZW5kKWAgaXMgY29udmVydGVkLgogIExpc3Q8aW50PiBjb252ZXJ0KFN0cmluZyBzdHJpbmcsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogICAgdmFyIHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7CiAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBzdHJpbmdMZW5ndGgpOwogICAgdmFyIGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gVWludDhMaXN0KDApOwogICAgLy8gQ3JlYXRlIGEgbmV3IGVuY29kZXIgd2l0aCBhIGxlbmd0aCB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgYmlnIGVub3VnaC4KICAgIC8vIEEgc2luZ2xlIGNvZGUgdW5pdCB1c2VzIGF0IG1vc3QgMyBieXRlcywgYSBzdXJyb2dhdGUgcGFpciBhdCBtb3N0IDQuCiAgICB2YXIgZW5jb2RlciA9IF9VdGY4RW5jb2Rlci53aXRoQnVmZmVyU2l6ZShsZW5ndGggKiAzKTsKICAgIHZhciBlbmRQb3NpdGlvbiA9IGVuY29kZXIuX2ZpbGxCdWZmZXIoc3RyaW5nLCBzdGFydCwgZW5kKTsKICAgIGFzc2VydChlbmRQb3NpdGlvbiA+PSBlbmQgLSAxKTsKICAgIGlmIChlbmRQb3NpdGlvbiAhPSBlbmQpIHsKICAgICAgLy8gRW5jb2Rpbmcgc2tpcHBlZCB0aGUgbGFzdCBjb2RlIHVuaXQuCiAgICAgIC8vIFRoYXQgY2FuIG9ubHkgaGFwcGVuIGlmIHRoZSBsYXN0IGNvZGUgdW5pdCBpcyBhIGxlYWRzdXJyb2dhdGUuCiAgICAgIC8vIEZvcmNlIGVuY29kaW5nIG9mIHRoZSBsZWFkIHN1cnJvZ2F0ZSBieSBpdHNlbGYuCiAgICAgIHZhciBsYXN0Q29kZVVuaXQgPSBzdHJpbmcuY29kZVVuaXRBdChlbmQgLSAxKTsKICAgICAgYXNzZXJ0KF9pc0xlYWRTdXJyb2dhdGUobGFzdENvZGVVbml0KSk7CiAgICAgIC8vIFdlIHVzZSBhIG5vbi1zdXJyb2dhdGUgYXMgYG5leHRVbml0YCBzbyB0aGF0IF93cml0ZVN1cnJvZ2F0ZSBqdXN0CiAgICAgIC8vIHdyaXRlcyB0aGUgbGVhZC1zdXJyb2dhdGUuCiAgICAgIHZhciB3YXNDb21iaW5lZCA9IGVuY29kZXIuX3dyaXRlU3Vycm9nYXRlKGxhc3RDb2RlVW5pdCwgMCk7CiAgICAgIGFzc2VydCghd2FzQ29tYmluZWQpOwogICAgfQogICAgcmV0dXJuIGVuY29kZXIuX2J1ZmZlci5zdWJsaXN0KDAsIGVuY29kZXIuX2J1ZmZlckluZGV4KTsKICB9CgogIC8vLyBTdGFydHMgYSBjaHVua2VkIGNvbnZlcnNpb24uCiAgLy8vCiAgLy8vIFRoZSBjb252ZXJ0ZXIgd29ya3MgbW9yZSBlZmZpY2llbnRseSBpZiB0aGUgZ2l2ZW4gW3NpbmtdIGlzIGEKICAvLy8gW0J5dGVDb252ZXJzaW9uU2lua10uCiAgU3RyaW5nQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPExpc3Q8aW50Pj4gc2luaykgewogICAgcmV0dXJuIF9VdGY4RW5jb2RlclNpbmsoCiAgICAgICAgc2luayBpcyBCeXRlQ29udmVyc2lvblNpbmsgPyBzaW5rIDogQnl0ZUNvbnZlcnNpb25TaW5rLmZyb20oc2luaykpOwogIH0KCiAgLy8gT3ZlcnJpZGUgdGhlIGJhc2UtY2xhc3NlcyBiaW5kLCB0byBwcm92aWRlIGEgYmV0dGVyIHR5cGUuCiAgU3RyZWFtPExpc3Q8aW50Pj4gYmluZChTdHJlYW08U3RyaW5nPiBzdHJlYW0pID0+IHN1cGVyLmJpbmQoc3RyZWFtKTsKfQoKLy8vIFRoaXMgY2xhc3MgZW5jb2RlcyBTdHJpbmdzIHRvIFVURi04IGNvZGUgdW5pdHMgKHVuc2lnbmVkIDggYml0IGludGVnZXJzKS4KLy8gVE9ETyhmbG9pdHNjaCk6IG1ha2UgdGhpcyBjbGFzcyBwdWJsaWMuCmNsYXNzIF9VdGY4RW5jb2RlciB7CiAgaW50IF9jYXJyeSA9IDA7CiAgaW50IF9idWZmZXJJbmRleCA9IDA7CiAgZmluYWwgTGlzdDxpbnQ+IF9idWZmZXI7CgogIHN0YXRpYyBjb25zdCBfREVGQVVMVF9CWVRFX0JVRkZFUl9TSVpFID0gMTAyNDsKCiAgX1V0ZjhFbmNvZGVyKCkgOiB0aGlzLndpdGhCdWZmZXJTaXplKF9ERUZBVUxUX0JZVEVfQlVGRkVSX1NJWkUpOwoKICBfVXRmOEVuY29kZXIud2l0aEJ1ZmZlclNpemUoaW50IGJ1ZmZlclNpemUpCiAgICAgIDogX2J1ZmZlciA9IF9jcmVhdGVCdWZmZXIoYnVmZmVyU2l6ZSk7CgogIC8vLyBBbGxvdyBhbiBpbXBsZW1lbnRhdGlvbiB0byBwaWNrIHRoZSBtb3N0IGVmZmljaWVudCB3YXkgb2Ygc3RvcmluZyBieXRlcy4KICBzdGF0aWMgTGlzdDxpbnQ+IF9jcmVhdGVCdWZmZXIoaW50IHNpemUpID0+IFVpbnQ4TGlzdChzaXplKTsKCiAgLy8vIFRyaWVzIHRvIGNvbWJpbmUgdGhlIGdpdmVuIFtsZWFkaW5nU3Vycm9nYXRlXSB3aXRoIHRoZSBbbmV4dENvZGVVbml0XSBhbmQKICAvLy8gd3JpdGVzIGl0IHRvIFtfYnVmZmVyXS4KICAvLy8KICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBbbmV4dENvZGVVbml0XSB3YXMgY29tYmluZWQgd2l0aCB0aGUKICAvLy8gW2xlYWRpbmdTdXJyb2dhdGVdLiBJZiBpdCB3YXNuJ3QgdGhlbiBuZXh0Q29kZVVuaXQgd2FzIG5vdCBhIHRyYWlsaW5nCiAgLy8vIHN1cnJvZ2F0ZSBhbmQgaGFzIG5vdCBiZWVuIHdyaXR0ZW4geWV0LgogIC8vLwogIC8vLyBJdCBpcyBzYWZlIHRvIHBhc3MgMCBmb3IgW25leHRDb2RlVW5pdF0gaW4gd2hpY2ggY2FzZSBvbmx5IHRoZSBsZWFkaW5nCiAgLy8vIHN1cnJvZ2F0ZSBpcyB3cml0dGVuLgogIGJvb2wgX3dyaXRlU3Vycm9nYXRlKGludCBsZWFkaW5nU3Vycm9nYXRlLCBpbnQgbmV4dENvZGVVbml0KSB7CiAgICBpZiAoX2lzVGFpbFN1cnJvZ2F0ZShuZXh0Q29kZVVuaXQpKSB7CiAgICAgIHZhciBydW5lID0gX2NvbWJpbmVTdXJyb2dhdGVQYWlyKGxlYWRpbmdTdXJyb2dhdGUsIG5leHRDb2RlVW5pdCk7CiAgICAgIC8vIElmIHRoZSBydW5lIGlzIGVuY29kZWQgd2l0aCAyIGNvZGUtdW5pdHMgdGhlbiBpdCBtdXN0IGJlIGVuY29kZWQKICAgICAgLy8gd2l0aCA0IGJ5dGVzIGluIFVURi04LgogICAgICBhc3NlcnQocnVuZSA+IF9USFJFRV9CWVRFX0xJTUlUKTsKICAgICAgYXNzZXJ0KHJ1bmUgPD0gX0ZPVVJfQllURV9MSU1JVCk7CiAgICAgIF9idWZmZXJbX2J1ZmZlckluZGV4KytdID0gMHhGMCB8IChydW5lID4+IDE4KTsKICAgICAgX2J1ZmZlcltfYnVmZmVySW5kZXgrK10gPSAweDgwIHwgKChydW5lID4+IDEyKSAmIDB4M2YpOwogICAgICBfYnVmZmVyW19idWZmZXJJbmRleCsrXSA9IDB4ODAgfCAoKHJ1bmUgPj4gNikgJiAweDNmKTsKICAgICAgX2J1ZmZlcltfYnVmZmVySW5kZXgrK10gPSAweDgwIHwgKHJ1bmUgJiAweDNmKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICAvLyBUT0RPKGZsb2l0c2NoKTogYWxsb3cgdG8gdGhyb3cgb24gbWFsZm9ybWVkIHN0cmluZ3MuCiAgICAgIC8vIEVuY29kZSB0aGUgaGFsZi1zdXJyb2dhdGUgZGlyZWN0bHkgaW50byBVVEYtOC4gVGhpcyB5aWVsZHMKICAgICAgLy8gaW52YWxpZCBVVEYtOCwgYnV0IHdlIHN0YXJ0ZWQgb3V0IHdpdGggaW52YWxpZCBVVEYtMTYuCgogICAgICAvLyBTdXJyb2dhdGVzIGFyZSBhbHdheXMgZW5jb2RlZCBpbiAzIGJ5dGVzIGluIFVURi04LgogICAgICBfYnVmZmVyW19idWZmZXJJbmRleCsrXSA9IDB4RTAgfCAobGVhZGluZ1N1cnJvZ2F0ZSA+PiAxMik7CiAgICAgIF9idWZmZXJbX2J1ZmZlckluZGV4KytdID0gMHg4MCB8ICgobGVhZGluZ1N1cnJvZ2F0ZSA+PiA2KSAmIDB4M2YpOwogICAgICBfYnVmZmVyW19idWZmZXJJbmRleCsrXSA9IDB4ODAgfCAobGVhZGluZ1N1cnJvZ2F0ZSAmIDB4M2YpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvLy8gRmlsbHMgdGhlIFtfYnVmZmVyXSB3aXRoIGFzIG1hbnkgY2hhcmFjdGVycyBhcyBwb3NzaWJsZS4KICAvLy8KICAvLy8gRG9lcyBub3QgZW5jb2RlIGFueSB0cmFpbGluZyBsZWFkLXN1cnJvZ2F0ZS4gVGhpcyBtdXN0IGJlIGRvbmUgYnkgdGhlCiAgLy8vIGNhbGxlci4KICAvLy8KICAvLy8gUmV0dXJucyB0aGUgcG9zaXRpb24gaW4gdGhlIHN0cmluZy4gVGhlIHJldHVybmVkIGluZGV4IHBvaW50cyB0byB0aGUKICAvLy8gZmlyc3QgY29kZSB1bml0IHRoYXQgaGFzbid0IGJlZW4gZW5jb2RlZC4KICBpbnQgX2ZpbGxCdWZmZXIoU3RyaW5nIHN0ciwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBpZiAoc3RhcnQgIT0gZW5kICYmIF9pc0xlYWRTdXJyb2dhdGUoc3RyLmNvZGVVbml0QXQoZW5kIC0gMSkpKSB7CiAgICAgIC8vIERvbid0IGhhbmRsZSBhIHRyYWlsaW5nIGxlYWQtc3Vycm9nYXRlIGluIHRoaXMgbG9vcC4gVGhlIGNhbGxlciBoYXMKICAgICAgLy8gdG8gZGVhbCB3aXRoIHRob3NlLgogICAgICBlbmQtLTsKICAgIH0KICAgIGludCBzdHJpbmdJbmRleDsKICAgIGZvciAoc3RyaW5nSW5kZXggPSBzdGFydDsgc3RyaW5nSW5kZXggPCBlbmQ7IHN0cmluZ0luZGV4KyspIHsKICAgICAgdmFyIGNvZGVVbml0ID0gc3RyLmNvZGVVbml0QXQoc3RyaW5nSW5kZXgpOwogICAgICAvLyBBU0NJSSBoYXMgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24gaW4gVVRGLTggYW5kIFVURi0xNi4KICAgICAgaWYgKGNvZGVVbml0IDw9IF9PTkVfQllURV9MSU1JVCkgewogICAgICAgIGlmIChfYnVmZmVySW5kZXggPj0gX2J1ZmZlci5sZW5ndGgpIGJyZWFrOwogICAgICAgIF9idWZmZXJbX2J1ZmZlckluZGV4KytdID0gY29kZVVuaXQ7CiAgICAgIH0gZWxzZSBpZiAoX2lzTGVhZFN1cnJvZ2F0ZShjb2RlVW5pdCkpIHsKICAgICAgICBpZiAoX2J1ZmZlckluZGV4ICsgMyA+PSBfYnVmZmVyLmxlbmd0aCkgYnJlYWs7CiAgICAgICAgLy8gTm90ZSB0aGF0IGl0IGlzIHNhZmUgdG8gcmVhZCB0aGUgbmV4dCBjb2RlIHVuaXQuIFdlIGRlY3JlbWVudGVkCiAgICAgICAgLy8gW2VuZF0gYWJvdmUgd2hlbiB0aGUgbGFzdCB2YWxpZCBjb2RlIHVuaXQgd2FzIGEgbGVhZGluZyBzdXJyb2dhdGUuCiAgICAgICAgdmFyIG5leHRDb2RlVW5pdCA9IHN0ci5jb2RlVW5pdEF0KHN0cmluZ0luZGV4ICsgMSk7CiAgICAgICAgdmFyIHdhc0NvbWJpbmVkID0gX3dyaXRlU3Vycm9nYXRlKGNvZGVVbml0LCBuZXh0Q29kZVVuaXQpOwogICAgICAgIGlmICh3YXNDb21iaW5lZCkgc3RyaW5nSW5kZXgrKzsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgcnVuZSA9IGNvZGVVbml0OwogICAgICAgIGlmIChydW5lIDw9IF9UV09fQllURV9MSU1JVCkgewogICAgICAgICAgaWYgKF9idWZmZXJJbmRleCArIDEgPj0gX2J1ZmZlci5sZW5ndGgpIGJyZWFrOwogICAgICAgICAgX2J1ZmZlcltfYnVmZmVySW5kZXgrK10gPSAweEMwIHwgKHJ1bmUgPj4gNik7CiAgICAgICAgICBfYnVmZmVyW19idWZmZXJJbmRleCsrXSA9IDB4ODAgfCAocnVuZSAmIDB4M2YpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhc3NlcnQocnVuZSA8PSBfVEhSRUVfQllURV9MSU1JVCk7CiAgICAgICAgICBpZiAoX2J1ZmZlckluZGV4ICsgMiA+PSBfYnVmZmVyLmxlbmd0aCkgYnJlYWs7CiAgICAgICAgICBfYnVmZmVyW19idWZmZXJJbmRleCsrXSA9IDB4RTAgfCAocnVuZSA+PiAxMik7CiAgICAgICAgICBfYnVmZmVyW19idWZmZXJJbmRleCsrXSA9IDB4ODAgfCAoKHJ1bmUgPj4gNikgJiAweDNmKTsKICAgICAgICAgIF9idWZmZXJbX2J1ZmZlckluZGV4KytdID0gMHg4MCB8IChydW5lICYgMHgzZik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gc3RyaW5nSW5kZXg7CiAgfQp9CgovLy8gVGhpcyBjbGFzcyBlbmNvZGVzIGNodW5rZWQgc3RyaW5ncyB0byBVVEYtOCBjb2RlIHVuaXRzICh1bnNpZ25lZCA4LWJpdAovLy8gaW50ZWdlcnMpLgpjbGFzcyBfVXRmOEVuY29kZXJTaW5rIGV4dGVuZHMgX1V0ZjhFbmNvZGVyIHdpdGggU3RyaW5nQ29udmVyc2lvblNpbmtNaXhpbiB7CiAgZmluYWwgQnl0ZUNvbnZlcnNpb25TaW5rIF9zaW5rOwoKICBfVXRmOEVuY29kZXJTaW5rKHRoaXMuX3NpbmspOwoKICB2b2lkIGNsb3NlKCkgewogICAgaWYgKF9jYXJyeSAhPSAwKSB7CiAgICAgIC8vIGFkZFNsaWNlIHdpbGwgY2FsbCBjbG9zZSBhZ2FpbiwgYnV0IHRoZW4gdGhlIGNhcnJ5IG11c3QgYmUgZXF1YWwgdG8gMC4KICAgICAgYWRkU2xpY2UoIiIsIDAsIDAsIHRydWUpOwogICAgICByZXR1cm47CiAgICB9CiAgICBfc2luay5jbG9zZSgpOwogIH0KCiAgdm9pZCBhZGRTbGljZShTdHJpbmcgc3RyLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICBfYnVmZmVySW5kZXggPSAwOwoKICAgIGlmIChzdGFydCA9PSBlbmQgJiYgIWlzTGFzdCkgewogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKF9jYXJyeSAhPSAwKSB7CiAgICAgIHZhciBuZXh0Q29kZVVuaXQgPSAwOwogICAgICBpZiAoc3RhcnQgIT0gZW5kKSB7CiAgICAgICAgbmV4dENvZGVVbml0ID0gc3RyLmNvZGVVbml0QXQoc3RhcnQpOwogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydChpc0xhc3QpOwogICAgICB9CiAgICAgIHZhciB3YXNDb21iaW5lZCA9IF93cml0ZVN1cnJvZ2F0ZShfY2FycnksIG5leHRDb2RlVW5pdCk7CiAgICAgIC8vIEVpdGhlciB3ZSBnb3QgYSBub24tZW1wdHkgc3RyaW5nLCBvciB3ZSBtdXN0IG5vdCBoYXZlIGJlZW4gY29tYmluZWQuCiAgICAgIGFzc2VydCghd2FzQ29tYmluZWQgfHwgc3RhcnQgIT0gZW5kKTsKICAgICAgaWYgKHdhc0NvbWJpbmVkKSBzdGFydCsrOwogICAgICBfY2FycnkgPSAwOwogICAgfQogICAgZG8gewogICAgICBzdGFydCA9IF9maWxsQnVmZmVyKHN0ciwgc3RhcnQsIGVuZCk7CiAgICAgIHZhciBpc0xhc3RTbGljZSA9IGlzTGFzdCAmJiAoc3RhcnQgPT0gZW5kKTsKICAgICAgaWYgKHN0YXJ0ID09IGVuZCAtIDEgJiYgX2lzTGVhZFN1cnJvZ2F0ZShzdHIuY29kZVVuaXRBdChzdGFydCkpKSB7CiAgICAgICAgaWYgKGlzTGFzdCAmJiBfYnVmZmVySW5kZXggPCBfYnVmZmVyLmxlbmd0aCAtIDMpIHsKICAgICAgICAgIC8vIFRoZXJlIGlzIHN0aWxsIHNwYWNlIGZvciB0aGUgbGFzdCBpbmNvbXBsZXRlIHN1cnJvZ2F0ZS4KICAgICAgICAgIC8vIFdlIHVzZSBhIG5vbi1zdXJyb2dhdGUgYXMgc2Vjb25kIGFyZ3VtZW50LiBUaGlzIHdheSB0aGUKICAgICAgICAgIC8vIGZ1bmN0aW9uIHdpbGwganVzdCBhZGQgdGhlIHN1cnJvZ2F0ZS1oYWxmIHRvIHRoZSBidWZmZXIuCiAgICAgICAgICB2YXIgaGFzQmVlbkNvbWJpbmVkID0gX3dyaXRlU3Vycm9nYXRlKHN0ci5jb2RlVW5pdEF0KHN0YXJ0KSwgMCk7CiAgICAgICAgICBhc3NlcnQoIWhhc0JlZW5Db21iaW5lZCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIE90aGVyd2lzZSBzdG9yZSBpdCBpbiB0aGUgY2FycnkuIElmIGlzTGFzdCBpcyB0cnVlLCB0aGVuCiAgICAgICAgICAvLyBjbG9zZSB3aWxsIGZsdXNoIHRoZSBsYXN0IGNhcnJ5LgogICAgICAgICAgX2NhcnJ5ID0gc3RyLmNvZGVVbml0QXQoc3RhcnQpOwogICAgICAgIH0KICAgICAgICBzdGFydCsrOwogICAgICB9CiAgICAgIF9zaW5rLmFkZFNsaWNlKF9idWZmZXIsIDAsIF9idWZmZXJJbmRleCwgaXNMYXN0U2xpY2UpOwogICAgICBfYnVmZmVySW5kZXggPSAwOwogICAgfSB3aGlsZSAoc3RhcnQgPCBlbmQpOwogICAgaWYgKGlzTGFzdCkgY2xvc2UoKTsKICB9CgogIC8vIFRPRE8oZmxvaXRzY2gpOiBpbXBsZW1lbnQgYXNVdGY4U2luay4gU2xpZ3RobHkgY29tcGxpY2F0ZWQgYmVjYXVzZSBpdAogIC8vIG5lZWRzIHRvIGRlYWwgd2l0aCBtYWxmb3JtZWQgaW5wdXQuCn0KCi8vLyBUaGlzIGNsYXNzIGNvbnZlcnRzIFVURi04IGNvZGUgdW5pdHMgKGxpc3RzIG9mIHVuc2lnbmVkIDgtYml0IGludGVnZXJzKQovLy8gdG8gYSBzdHJpbmcuCmNsYXNzIFV0ZjhEZWNvZGVyIGV4dGVuZHMgQ29udmVydGVyPExpc3Q8aW50PiwgU3RyaW5nPiB7CiAgZmluYWwgYm9vbCBfYWxsb3dNYWxmb3JtZWQ7CgogIC8vLyBJbnN0YW50aWF0ZXMgYSBuZXcgW1V0ZjhEZWNvZGVyXS4KICAvLy8KICAvLy8gVGhlIG9wdGlvbmFsIFthbGxvd01hbGZvcm1lZF0gYXJndW1lbnQgZGVmaW5lcyBob3cgW2NvbnZlcnRdIGRlYWxzCiAgLy8vIHdpdGggaW52YWxpZCBvciB1bnRlcm1pbmF0ZWQgY2hhcmFjdGVyIHNlcXVlbmNlcy4KICAvLy8KICAvLy8gSWYgaXQgaXMgYHRydWVgIFtjb252ZXJ0XSByZXBsYWNlcyBpbnZhbGlkIChvciB1bnRlcm1pbmF0ZWQpIGNoYXJhY3RlcgogIC8vLyBzZXF1ZW5jZXMgd2l0aCB0aGUgVW5pY29kZSBSZXBsYWNlbWVudCBjaGFyYWN0ZXIgYFUrRkZGRGAgKO+/vSkuIE90aGVyd2lzZQogIC8vLyBpdCB0aHJvd3MgYSBbRm9ybWF0RXhjZXB0aW9uXS4KICBjb25zdCBVdGY4RGVjb2Rlcih7Ym9vbCBhbGxvd01hbGZvcm1lZCA9IGZhbHNlfSkKICAgICAgOiBfYWxsb3dNYWxmb3JtZWQgPSBhbGxvd01hbGZvcm1lZDsKCiAgLy8vIENvbnZlcnRzIHRoZSBVVEYtOCBbY29kZVVuaXRzXSAoYSBsaXN0IG9mIHVuc2lnbmVkIDgtYml0IGludGVnZXJzKSB0byB0aGUKICAvLy8gY29ycmVzcG9uZGluZyBzdHJpbmcuCiAgLy8vCiAgLy8vIFVzZXMgdGhlIGNvZGUgdW5pdHMgZnJvbSBbc3RhcnRdIHRvLCBidXQgbm8gaW5jbHVkaW5nLCBbZW5kXS4KICAvLy8gSWYgW2VuZF0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYGNvZGVVbml0cy5sZW5ndGhgLgogIC8vLwogIC8vLyBJZiB0aGUgW2NvZGVVbml0c10gc3RhcnQgd2l0aCB0aGUgZW5jb2Rpbmcgb2YgYQogIC8vLyBbdW5pY29kZUJvbUNoYXJhY3RlclJ1bmVdLCB0aGF0IGNoYXJhY3RlciBpcyBkaXNjYXJkZWQuCiAgU3RyaW5nIGNvbnZlcnQoTGlzdDxpbnQ+IGNvZGVVbml0cywgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKSB7CiAgICAvLyBBbGxvdyB0aGUgaW1wbGVtZW50YXRpb24gdG8gaW50ZXJjZXB0IGFuZCBzcGVjaWFsaXplIGJhc2VkIG9uIHRoZSB0eXBlCiAgICAvLyBvZiBjb2RlVW5pdHMuCiAgICB2YXIgcmVzdWx0ID0gX2NvbnZlcnRJbnRlcmNlcHRlZChfYWxsb3dNYWxmb3JtZWQsIGNvZGVVbml0cywgc3RhcnQsIGVuZCk7CiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICB2YXIgbGVuZ3RoID0gY29kZVVuaXRzLmxlbmd0aDsKICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIGxlbmd0aCk7CgogICAgLy8gRmFzdCBjYXNlIGZvciBBU0NJSSBzdHJpbmdzIGF2b2lkcyBTdHJpbmdCdWZmZXIvX1V0ZjhEZWNvZGVyLgogICAgaW50IG9uZUJ5dGVzID0gX3NjYW5PbmVCeXRlQ2hhcmFjdGVycyhjb2RlVW5pdHMsIHN0YXJ0LCBlbmQpOwogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlcjsKICAgIGJvb2wgaXNGaXJzdENoYXJhY3RlciA9IHRydWU7CiAgICBpZiAob25lQnl0ZXMgPiAwKSB7CiAgICAgIHZhciBmaXJzdFBhcnQgPSBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RlVW5pdHMsIHN0YXJ0LCBzdGFydCArIG9uZUJ5dGVzKTsKICAgICAgc3RhcnQgKz0gb25lQnl0ZXM7CiAgICAgIGlmIChzdGFydCA9PSBlbmQpIHsKICAgICAgICByZXR1cm4gZmlyc3RQYXJ0OwogICAgICB9CiAgICAgIGJ1ZmZlciA9IFN0cmluZ0J1ZmZlcihmaXJzdFBhcnQpOwogICAgICBpc0ZpcnN0Q2hhcmFjdGVyID0gZmFsc2U7CiAgICB9CgogICAgYnVmZmVyID8/PSBTdHJpbmdCdWZmZXIoKTsKICAgIHZhciBkZWNvZGVyID0gX1V0ZjhEZWNvZGVyKGJ1ZmZlciwgX2FsbG93TWFsZm9ybWVkKTsKICAgIGRlY29kZXIuX2lzRmlyc3RDaGFyYWN0ZXIgPSBpc0ZpcnN0Q2hhcmFjdGVyOwogICAgZGVjb2Rlci5jb252ZXJ0KGNvZGVVbml0cywgc3RhcnQsIGVuZCk7CiAgICBkZWNvZGVyLmZsdXNoKGNvZGVVbml0cywgZW5kKTsKICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9CgogIC8vLyBTdGFydHMgYSBjaHVua2VkIGNvbnZlcnNpb24uCiAgLy8vCiAgLy8vIFRoZSBjb252ZXJ0ZXIgd29ya3MgbW9yZSBlZmZpY2llbnRseSBpZiB0aGUgZ2l2ZW4gW3NpbmtdIGlzIGEKICAvLy8gW1N0cmluZ0NvbnZlcnNpb25TaW5rXS4KICBCeXRlQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPFN0cmluZz4gc2luaykgewogICAgU3RyaW5nQ29udmVyc2lvblNpbmsgc3RyaW5nU2luazsKICAgIGlmIChzaW5rIGlzIFN0cmluZ0NvbnZlcnNpb25TaW5rKSB7CiAgICAgIHN0cmluZ1NpbmsgPSBzaW5rOwogICAgfSBlbHNlIHsKICAgICAgc3RyaW5nU2luayA9IFN0cmluZ0NvbnZlcnNpb25TaW5rLmZyb20oc2luayk7CiAgICB9CiAgICByZXR1cm4gc3RyaW5nU2luay5hc1V0ZjhTaW5rKF9hbGxvd01hbGZvcm1lZCk7CiAgfQoKICAvLyBPdmVycmlkZSB0aGUgYmFzZS1jbGFzc2VzIGJpbmQsIHRvIHByb3ZpZGUgYSBiZXR0ZXIgdHlwZS4KICBTdHJlYW08U3RyaW5nPiBiaW5kKFN0cmVhbTxMaXN0PGludD4+IHN0cmVhbSkgPT4gc3VwZXIuYmluZChzdHJlYW0pOwoKICBleHRlcm5hbCBDb252ZXJ0ZXI8TGlzdDxpbnQ+LCBUPiBmdXNlPFQ+KENvbnZlcnRlcjxTdHJpbmcsIFQ+IG5leHQpOwoKICBleHRlcm5hbCBzdGF0aWMgU3RyaW5nIF9jb252ZXJ0SW50ZXJjZXB0ZWQoCiAgICAgIGJvb2wgYWxsb3dNYWxmb3JtZWQsIExpc3Q8aW50PiBjb2RlVW5pdHMsIGludCBzdGFydCwgaW50IGVuZCk7Cn0KCi8vIFVURi04IGNvbnN0YW50cy4KY29uc3QgaW50IF9PTkVfQllURV9MSU1JVCA9IDB4N2Y7IC8vIDcgYml0cwpjb25zdCBpbnQgX1RXT19CWVRFX0xJTUlUID0gMHg3ZmY7IC8vIDExIGJpdHMKY29uc3QgaW50IF9USFJFRV9CWVRFX0xJTUlUID0gMHhmZmZmOyAvLyAxNiBiaXRzCmNvbnN0IGludCBfRk9VUl9CWVRFX0xJTUlUID0gMHgxMGZmZmY7IC8vIDIxIGJpdHMsIHRydW5jYXRlZCB0byBVbmljb2RlIG1heC4KCi8vIFVURi0xNiBjb25zdGFudHMuCmNvbnN0IGludCBfU1VSUk9HQVRFX1RBR19NQVNLID0gMHhGQzAwOwpjb25zdCBpbnQgX1NVUlJPR0FURV9WQUxVRV9NQVNLID0gMHgzRkY7CmNvbnN0IGludCBfTEVBRF9TVVJST0dBVEVfTUlOID0gMHhEODAwOwpjb25zdCBpbnQgX1RBSUxfU1VSUk9HQVRFX01JTiA9IDB4REMwMDsKCmJvb2wgX2lzTGVhZFN1cnJvZ2F0ZShpbnQgY29kZVVuaXQpID0+CiAgICAoY29kZVVuaXQgJiBfU1VSUk9HQVRFX1RBR19NQVNLKSA9PSBfTEVBRF9TVVJST0dBVEVfTUlOOwpib29sIF9pc1RhaWxTdXJyb2dhdGUoaW50IGNvZGVVbml0KSA9PgogICAgKGNvZGVVbml0ICYgX1NVUlJPR0FURV9UQUdfTUFTSykgPT0gX1RBSUxfU1VSUk9HQVRFX01JTjsKaW50IF9jb21iaW5lU3Vycm9nYXRlUGFpcihpbnQgbGVhZCwgaW50IHRhaWwpID0+CiAgICAweDEwMDAwICsgKChsZWFkICYgX1NVUlJPR0FURV9WQUxVRV9NQVNLKSA8PCAxMCkgfAogICAgKHRhaWwgJiBfU1VSUk9HQVRFX1ZBTFVFX01BU0spOwoKLy8vIERlY29kZXMgVVRGLTguCi8vLwovLy8gVGhlIGRlY29kZXIgaGFuZGxlcyBjaHVua2VkIGlucHV0LgovLyBUT0RPKGZsb2l0c2NoKTogbWFrZSB0aGlzIGNsYXNzIHB1YmxpYy4KY2xhc3MgX1V0ZjhEZWNvZGVyIHsKICBmaW5hbCBib29sIF9hbGxvd01hbGZvcm1lZDsKICBmaW5hbCBTdHJpbmdTaW5rIF9zdHJpbmdTaW5rOwogIGJvb2wgX2lzRmlyc3RDaGFyYWN0ZXIgPSB0cnVlOwogIGludCBfdmFsdWUgPSAwOwogIGludCBfZXhwZWN0ZWRVbml0cyA9IDA7CiAgaW50IF9leHRyYVVuaXRzID0gMDsKCiAgX1V0ZjhEZWNvZGVyKHRoaXMuX3N0cmluZ1NpbmssIHRoaXMuX2FsbG93TWFsZm9ybWVkKTsKCiAgYm9vbCBnZXQgaGFzUGFydGlhbElucHV0ID0+IF9leHBlY3RlZFVuaXRzID4gMDsKCiAgLy8gTGltaXRzIG9mIG9uZSB0aHJvdWdoIGZvdXIgYnl0ZSBlbmNvZGluZ3MuCiAgc3RhdGljIGNvbnN0IExpc3Q8aW50PiBfTElNSVRTID0gPGludD5bCiAgICBfT05FX0JZVEVfTElNSVQsCiAgICBfVFdPX0JZVEVfTElNSVQsCiAgICBfVEhSRUVfQllURV9MSU1JVCwKICAgIF9GT1VSX0JZVEVfTElNSVQKICBdOwoKICB2b2lkIGNsb3NlKCkgewogICAgZmx1c2goKTsKICB9CgogIC8vLyBGbHVzaGVzIHRoaXMgZGVjb2RlciBhcyBpZiBjbG9zZWQuCiAgLy8vCiAgLy8vIFRoaXMgbWV0aG9kIHRocm93cyBpZiB0aGUgaW5wdXQgd2FzIHBhcnRpYWwgYW5kIHRoZSBkZWNvZGVyIHdhcwogIC8vLyBjb25zdHJ1Y3RlZCB3aXRoIGBhbGxvd01hbGZvcm1lZGAgc2V0IHRvIGBmYWxzZWAuCiAgLy8vCiAgLy8vIFRoZSBbc291cmNlXSBhbmQgW29mZnNldF0gb2YgdGhlIGN1cnJlbnQgcG9zaXRpb24gbWF5IGJlIHByb3ZpZGVkLAogIC8vLyBhbmQgYXJlIGluY2x1ZGVkIGluIHRoZSBleGNlcHRpb24gaWYgb25lIGlzIHRocm93bi4KICB2b2lkIGZsdXNoKFtMaXN0PGludD4gc291cmNlLCBpbnQgb2Zmc2V0XSkgewogICAgaWYgKGhhc1BhcnRpYWxJbnB1dCkgewogICAgICBpZiAoIV9hbGxvd01hbGZvcm1lZCkgewogICAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigKICAgICAgICAgICAgIlVuZmluaXNoZWQgVVRGLTggb2N0ZXQgc2VxdWVuY2UiLCBzb3VyY2UsIG9mZnNldCk7CiAgICAgIH0KICAgICAgX3N0cmluZ1Npbmsud3JpdGVDaGFyQ29kZSh1bmljb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXJSdW5lKTsKICAgICAgX3ZhbHVlID0gMDsKICAgICAgX2V4cGVjdGVkVW5pdHMgPSAwOwogICAgICBfZXh0cmFVbml0cyA9IDA7CiAgICB9CiAgfQoKICB2b2lkIGNvbnZlcnQoTGlzdDxpbnQ+IGNvZGVVbml0cywgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkgewogICAgdmFyIHZhbHVlID0gX3ZhbHVlOwogICAgdmFyIGV4cGVjdGVkVW5pdHMgPSBfZXhwZWN0ZWRVbml0czsKICAgIHZhciBleHRyYVVuaXRzID0gX2V4dHJhVW5pdHM7CiAgICBfdmFsdWUgPSAwOwogICAgX2V4cGVjdGVkVW5pdHMgPSAwOwogICAgX2V4dHJhVW5pdHMgPSAwOwoKICAgIHZhciBpID0gc3RhcnRJbmRleDsKICAgIGxvb3A6CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBtdWx0aWJ5dGU6CiAgICAgIGlmIChleHBlY3RlZFVuaXRzID4gMCkgewogICAgICAgIGRvIHsKICAgICAgICAgIGlmIChpID09IGVuZEluZGV4KSB7CiAgICAgICAgICAgIGJyZWFrIGxvb3A7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgdW5pdCA9IGNvZGVVbml0c1tpXTsKICAgICAgICAgIGlmICgodW5pdCAmIDB4QzApICE9IDB4ODApIHsKICAgICAgICAgICAgZXhwZWN0ZWRVbml0cyA9IDA7CiAgICAgICAgICAgIGlmICghX2FsbG93TWFsZm9ybWVkKSB7CiAgICAgICAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAiQmFkIFVURi04IGVuY29kaW5nIDB4JHt1bml0LnRvUmFkaXhTdHJpbmcoMTYpfSIsCiAgICAgICAgICAgICAgICAgIGNvZGVVbml0cywKICAgICAgICAgICAgICAgICAgaSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX2lzRmlyc3RDaGFyYWN0ZXIgPSBmYWxzZTsKICAgICAgICAgICAgX3N0cmluZ1Npbmsud3JpdGVDaGFyQ29kZSh1bmljb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXJSdW5lKTsKICAgICAgICAgICAgYnJlYWsgbXVsdGlieXRlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgPDwgNikgfCAodW5pdCAmIDB4M2YpOwogICAgICAgICAgICBleHBlY3RlZFVuaXRzLS07CiAgICAgICAgICAgIGkrKzsKICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlIChleHBlY3RlZFVuaXRzID4gMCk7CiAgICAgICAgaWYgKHZhbHVlIDw9IF9MSU1JVFNbZXh0cmFVbml0cyAtIDFdKSB7CiAgICAgICAgICAvLyBPdmVybHkgbG9uZyBlbmNvZGluZy4gVGhlIHZhbHVlIGNvdWxkIGJlIGVuY29kZWQgd2l0aCBhIHNob3J0ZXIKICAgICAgICAgIC8vIGVuY29kaW5nLgogICAgICAgICAgaWYgKCFfYWxsb3dNYWxmb3JtZWQpIHsKICAgICAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICAgICAgICAgIk92ZXJsb25nIGVuY29kaW5nIG9mIDB4JHt2YWx1ZS50b1JhZGl4U3RyaW5nKDE2KX0iLAogICAgICAgICAgICAgICAgY29kZVVuaXRzLAogICAgICAgICAgICAgICAgaSAtIGV4dHJhVW5pdHMgLSAxKTsKICAgICAgICAgIH0KICAgICAgICAgIGV4cGVjdGVkVW5pdHMgPSBleHRyYVVuaXRzID0gMDsKICAgICAgICAgIHZhbHVlID0gdW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyUnVuZTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhbHVlID4gX0ZPVVJfQllURV9MSU1JVCkgewogICAgICAgICAgaWYgKCFfYWxsb3dNYWxmb3JtZWQpIHsKICAgICAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICAgICAgICAgIkNoYXJhY3RlciBvdXRzaWRlIHZhbGlkIFVuaWNvZGUgcmFuZ2U6ICIKICAgICAgICAgICAgICAgICIweCR7dmFsdWUudG9SYWRpeFN0cmluZygxNil9IiwKICAgICAgICAgICAgICAgIGNvZGVVbml0cywKICAgICAgICAgICAgICAgIGkgLSBleHRyYVVuaXRzIC0gMSk7CiAgICAgICAgICB9CiAgICAgICAgICB2YWx1ZSA9IHVuaWNvZGVSZXBsYWNlbWVudENoYXJhY3RlclJ1bmU7CiAgICAgICAgfQogICAgICAgIGlmICghX2lzRmlyc3RDaGFyYWN0ZXIgfHwgdmFsdWUgIT0gdW5pY29kZUJvbUNoYXJhY3RlclJ1bmUpIHsKICAgICAgICAgIF9zdHJpbmdTaW5rLndyaXRlQ2hhckNvZGUodmFsdWUpOwogICAgICAgIH0KICAgICAgICBfaXNGaXJzdENoYXJhY3RlciA9IGZhbHNlOwogICAgICB9CgogICAgICB3aGlsZSAoaSA8IGVuZEluZGV4KSB7CiAgICAgICAgdmFyIG9uZUJ5dGVzID0gX3NjYW5PbmVCeXRlQ2hhcmFjdGVycyhjb2RlVW5pdHMsIGksIGVuZEluZGV4KTsKICAgICAgICBpZiAob25lQnl0ZXMgPiAwKSB7CiAgICAgICAgICBfaXNGaXJzdENoYXJhY3RlciA9IGZhbHNlOwogICAgICAgICAgYXNzZXJ0KGkgKyBvbmVCeXRlcyA8PSBlbmRJbmRleCk7CiAgICAgICAgICBfc3RyaW5nU2luay53cml0ZShTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RlVW5pdHMsIGksIGkgKyBvbmVCeXRlcykpOwoKICAgICAgICAgIGkgKz0gb25lQnl0ZXM7CiAgICAgICAgICBpZiAoaSA9PSBlbmRJbmRleCkgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHZhciB1bml0ID0gY29kZVVuaXRzW2krK107CiAgICAgICAgLy8gVE9ETyhmbG9pdHNjaCk6IHRoZSB3YXkgd2UgdGVzdCB3ZSBjb3VsZCBwb3RlbnRpYWxseSBhbGxvdwogICAgICAgIC8vIHVuaXRzIHRoYXQgYXJlIHRvbyBsYXJnZSwgaWYgdGhleSBoYXBwZW4gdG8gaGF2ZSB0aGUKICAgICAgICAvLyByaWdodCBiaXQtcGF0dGVybi4gKFNhbWUgaXMgdHJ1ZSBmb3IgdGhlIG11bHRpYnl0ZSBsb29wIGFib3ZlKS4KICAgICAgICAvLyBUT0RPKGZsb2l0c2NoKTogb3B0aW1pemUgdGhpcyBsb29wLiBTZWU6CiAgICAgICAgLy8gaHR0cHM6Ly9jb2RlcmV2aWV3LmNocm9taXVtLm9yZy8yMjkyOTAyMi9kaWZmLzEvc2RrL2xpYi9jb252ZXJ0L3V0Zi5kYXJ0P2NvbHVtbl93aWR0aD04MAogICAgICAgIGlmICh1bml0IDwgMCkgewogICAgICAgICAgLy8gVE9ETyhmbG9pdHNjaCk6IHNob3VsZCB0aGlzIGJlIHVuaXQgPD0gMCA/CiAgICAgICAgICBpZiAoIV9hbGxvd01hbGZvcm1lZCkgewogICAgICAgICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAiTmVnYXRpdmUgVVRGLTggY29kZSB1bml0OiAtMHgkeygtdW5pdCkudG9SYWRpeFN0cmluZygxNil9IiwKICAgICAgICAgICAgICAgIGNvZGVVbml0cywKICAgICAgICAgICAgICAgIGkgLSAxKTsKICAgICAgICAgIH0KICAgICAgICAgIF9zdHJpbmdTaW5rLndyaXRlQ2hhckNvZGUodW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyUnVuZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFzc2VydCh1bml0ID4gX09ORV9CWVRFX0xJTUlUKTsKICAgICAgICAgIGlmICgodW5pdCAmIDB4RTApID09IDB4QzApIHsKICAgICAgICAgICAgdmFsdWUgPSB1bml0ICYgMHgxRjsKICAgICAgICAgICAgZXhwZWN0ZWRVbml0cyA9IGV4dHJhVW5pdHMgPSAxOwogICAgICAgICAgICBjb250aW51ZSBsb29wOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCh1bml0ICYgMHhGMCkgPT0gMHhFMCkgewogICAgICAgICAgICB2YWx1ZSA9IHVuaXQgJiAweDBGOwogICAgICAgICAgICBleHBlY3RlZFVuaXRzID0gZXh0cmFVbml0cyA9IDI7CiAgICAgICAgICAgIGNvbnRpbnVlIGxvb3A7CiAgICAgICAgICB9CiAgICAgICAgICAvLyAweEY1LCAweEY2IC4uLiAweEZGIG5ldmVyIGFwcGVhciBpbiB2YWxpZCBVVEYtOCBzZXF1ZW5jZXMuCiAgICAgICAgICBpZiAoKHVuaXQgJiAweEY4KSA9PSAweEYwICYmIHVuaXQgPCAweEY1KSB7CiAgICAgICAgICAgIHZhbHVlID0gdW5pdCAmIDB4MDc7CiAgICAgICAgICAgIGV4cGVjdGVkVW5pdHMgPSBleHRyYVVuaXRzID0gMzsKICAgICAgICAgICAgY29udGludWUgbG9vcDsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghX2FsbG93TWFsZm9ybWVkKSB7CiAgICAgICAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICJCYWQgVVRGLTggZW5jb2RpbmcgMHgke3VuaXQudG9SYWRpeFN0cmluZygxNil9IiwKICAgICAgICAgICAgICAgIGNvZGVVbml0cywKICAgICAgICAgICAgICAgIGkgLSAxKTsKICAgICAgICAgIH0KICAgICAgICAgIHZhbHVlID0gdW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyUnVuZTsKICAgICAgICAgIGV4cGVjdGVkVW5pdHMgPSBleHRyYVVuaXRzID0gMDsKICAgICAgICAgIF9pc0ZpcnN0Q2hhcmFjdGVyID0gZmFsc2U7CiAgICAgICAgICBfc3RyaW5nU2luay53cml0ZUNoYXJDb2RlKHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYnJlYWsgbG9vcDsKICAgIH0KICAgIGlmIChleHBlY3RlZFVuaXRzID4gMCkgewogICAgICBfdmFsdWUgPSB2YWx1ZTsKICAgICAgX2V4cGVjdGVkVW5pdHMgPSBleHBlY3RlZFVuaXRzOwogICAgICBfZXh0cmFVbml0cyA9IGV4dHJhVW5pdHM7CiAgICB9CiAgfQp9CgovLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gW3VuaXRzXSBzdGFydGluZyBhdCBvZmZzZXQgW2Zyb21dIHdoaWNoIGhhdmUKLy8gdGhlIGxlZnRtb3N0IGJpdCBzZXQgdG8gMC4KLy8KLy8gVG8gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugb2YgdGhpcyBjcml0aWNhbCBtZXRob2Qgd2UgaGF2ZSBhIHNwZWNpYWwgdmFyaWFudCBvZgovLyBpdCBpbXBsZW1lbnRlZCBpbiB0aGUgVk0ncyBwYXRjaCBmaWxlcywgd2hpY2ggaXMgd2h5IHdlIG1ha2UgaXQgZXh0ZXJuYWwuCmV4dGVybmFsIGludCBfc2Nhbk9uZUJ5dGVDaGFyYWN0ZXJzKExpc3Q8aW50PiB1bml0cywgaW50IGZyb20sIGludCBlbmRJbmRleCk7CoIuAE5OPAEWATQ0ATwsAUIESA8EDgQ7TUkkAUohIx4BJgZSPQZRPE8mMSoBJx4BTxwGNj4GRU89BlEmPihLBAEyHDkEAgFFHjkXATsgBjwzPyZAHipPTDs/JB4uSDk1LkskQhwGPQQBIwZEHEYdTAQBP0cCAU4rFRIYGwExAUMBLi0BTz8BUB4GP0wuBk0cQSpISiAoKDU+PTYTDT5EQAE8QUlCFAYEAT8GTA4GSzA0RU0dDQYVQjJAKTMsLzdLTjxDKA8dJzk4OhEtOTlBOgoIBhgEAgFLD00iASABERdQIA4GEwQBPxYBIw4GARccGi4PGAg/TiwgEgYJLDJJO0VFRkskEUYuKgoRCD0YGxkEAUspAgFMETkeASgGSTgGTU8lMyoBUBwGRD4GNj5CThVOGhUGASM6AUVCGSIYUBkaGggoIAYBHzkyLCMeBAEjBkQeQSUoGQ00BjMEAT9HAUcBLkUCARQsLjFNARUoKSgoASc9Jz0xNyQBEwQnKxUeICESGhcBOAEyATAqFRUXFQUBEQ0EASkGRjgGSTovGx4fQAhCEhoXBgQBRBgoIhAYFQEYChMRHw0fGAwjJx8kJUQdFg4nSB0TMh0RDCUwTRciI0UbJQwqMwooIiM6MBslDDMKRiwKIwgBHUccJSxPARkkCiNGQEs0ZBg4IiNNGxgMRhEqJyEsGwwnISwbDEg2ISwbDCIjQhsYDDMqJSwKCBIGHRYmIAYEAgFPHgNQTU4BFWRhcnQ6Y29udmVydC91dGYuZGFydDRvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvZGV2ZWxvcGVyL2RldmVsb3Blci5kYXJ0iWwvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIEludGVyYWN0IHdpdGggZGV2ZWxvcGVyIHRvb2xzIHN1Y2ggYXMgdGhlIGRlYnVnZ2VyIGFuZCBpbnNwZWN0b3IuCi8vLwovLy8gVGhpcyBsaWJyYXJ5IGlzIHBsYXRmb3JtIGRlcGVuZGVudCBhbmQgaGFzIHNlcGFyYXRlIGltcGxlbWVudGF0aW9ucyBmb3IKLy8vIGJvdGggd2ViIGFuZCB0aGUgRGFydCBWTS4gQSBzcGVjaWZpYyBwbGF0Zm9ybSBtYXkgbm90IHN1cHBvcnQgYWxsCi8vLyBvcGVyYXRpb25zLgovLy8KLy8vIFRvIHVzZSB0aGlzIGxpYnJhcnkgaW4geW91ciBjb2RlOgovLy8KLy8vICAgICBpbXBvcnQgJ2RhcnQ6ZGV2ZWxvcGVyJzsKLy8vCi8vLyB7QGNhdGVnb3J5IENvcmV9CmxpYnJhcnkgZGFydC5kZXZlbG9wZXI7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnOwppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CmltcG9ydCAnZGFydDppc29sYXRlJyBzaG93IElzb2xhdGUsIFJhd1JlY2VpdmVQb3J0LCBTZW5kUG9ydDsKCnBhcnQgJ2V4dGVuc2lvbi5kYXJ0JzsKcGFydCAncHJvZmlsZXIuZGFydCc7CnBhcnQgJ3NlcnZpY2UuZGFydCc7CnBhcnQgJ3RpbWVsaW5lLmRhcnQnOwoKLy8vIElmIFt3aGVuXSBpcyB0cnVlLCBzdG9wIHRoZSBwcm9ncmFtIGFzIGlmIGEgYnJlYWtwb2ludCB3ZXJlIGhpdCBhdCB0aGUKLy8vIGZvbGxvd2luZyBzdGF0ZW1lbnQuCi8vLwovLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgW3doZW5dLiBTb21lIGRlYnVnZ2VycyBtYXkgZGlzcGxheSBbbWVzc2FnZV0uCi8vLwovLy8gTk9URTogV2hlbiBpbnZva2VkLCB0aGUgaXNvbGF0ZSB3aWxsIG5vdCByZXR1cm4gdW50aWwgYSBkZWJ1Z2dlcgovLy8gY29udGludWVzIGV4ZWN1dGlvbi4gV2hlbiBydW5uaW5nIGluIHRoZSBEYXJ0IFZNLCB0aGUgYmVoYXZpb3VyIGlzIHRoZSBzYW1lCi8vLyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IGEgZGVidWdnZXIgaXMgY29ubmVjdGVkLiBXaGVuIGNvbXBpbGVkIHRvCi8vLyBKYXZhU2NyaXB0LCB0aGlzIHVzZXMgdGhlICJkZWJ1Z2dlciIgc3RhdGVtZW50LCBhbmQgYmVoYXZlcyBleGFjdGx5IGFzCi8vLyB0aGF0IGRvZXMuCmV4dGVybmFsIGJvb2wgZGVidWdnZXIoe2Jvb2wgd2hlbjogdHJ1ZSwgU3RyaW5nIG1lc3NhZ2V9KTsKCi8vLyBTZW5kIGEgcmVmZXJlbmNlIHRvIFtvYmplY3RdIHRvIGFueSBhdHRhY2hlZCBkZWJ1Z2dlcnMuCi8vLwovLy8gRGVidWdnZXJzIG1heSBvcGVuIGFuIGluc3BlY3RvciBvbiB0aGUgb2JqZWN0LiBSZXR1cm5zIHRoZSBhcmd1bWVudC4KZXh0ZXJuYWwgT2JqZWN0IGluc3BlY3QoT2JqZWN0IG9iamVjdCk7CgovLy8gRW1pdCBhIGxvZyBldmVudC4KLy8vCi8vLyBUaGlzIGZ1bmN0aW9uIHdhcyBkZXNpZ25lZCB0byBtYXAgY2xvc2VseSB0byB0aGUgbG9nZ2luZyBpbmZvcm1hdGlvbgovLy8gY29sbGVjdGVkIGJ5IGBwYWNrYWdlOmxvZ2dpbmdgLgovLy8KLy8vIC0gW21lc3NhZ2VdIGlzIHRoZSBsb2cgbWVzc2FnZQovLy8gLSBbdGltZV0gKG9wdGlvbmFsKSBpcyB0aGUgdGltZXN0YW1wCi8vLyAtIFtzZXF1ZW5jZU51bWJlcl0gKG9wdGlvbmFsKSBpcyBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBzZXF1ZW5jZSBudW1iZXIKLy8vIC0gW2xldmVsXSAob3B0aW9uYWwpIGlzIHRoZSBzZXZlcml0eSBsZXZlbCAoYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDIwMDApOyBzZWUKLy8vICAgdGhlIGBwYWNrYWdlOmxvZ2dpbmdgIGBMZXZlbGAgY2xhc3MgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBwb3NzaWJsZSB2YWx1ZXMKLy8vIC0gW25hbWVdIChvcHRpb25hbCkgaXMgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBvZiB0aGUgbG9nIG1lc3NhZ2UKLy8vIC0gW3pvbmVdIChvcHRpb25hbCkgdGhlIHpvbmUgd2hlcmUgdGhlIGxvZyB3YXMgZW1pdHRlZAovLy8gLSBbZXJyb3JdIChvcHRpb25hbCkgYW4gZXJyb3Igb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxvZyBldmVudAovLy8gLSBbc3RhY2tUcmFjZV0gKG9wdGlvbmFsKSBhIHN0YWNrIHRyYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxvZyBldmVudApleHRlcm5hbCB2b2lkIGxvZygKICBTdHJpbmcgbWVzc2FnZSwgewogIERhdGVUaW1lIHRpbWUsCiAgaW50IHNlcXVlbmNlTnVtYmVyLAogIGludCBsZXZlbDogMCwKICBTdHJpbmcgbmFtZTogJycsCiAgWm9uZSB6b25lLAogIE9iamVjdCBlcnJvciwKICBTdGFja1RyYWNlIHN0YWNrVHJhY2UsCn0pOwpFAE5OPAFGBExGEAQmBCEEFRgBFRc+ARcWFRYBSxkERwRFUEtLDzsBPARJKAEWBEkkBCMpUFFRRTtISxMUERYQEw0QGQQBDmRhcnQ6ZGV2ZWxvcGVyNG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9kZXZlbG9wZXIvZXh0ZW5zaW9uLmRhcnSW/S8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuZGV2ZWxvcGVyOwoKLy8vIEEgcmVzcG9uc2UgdG8gYSBzZXJ2aWNlIHByb3RvY29sIGV4dGVuc2lvbiBSUEMuCi8vLwovLy8gSWYgdGhlIFJQQyB3YXMgc3VjY2Vzc2Z1bCwgdXNlIFtTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2UucmVzdWx0XSwgb3RoZXJ3aXNlCi8vLyB1c2UgW1NlcnZpY2VFeHRlbnNpb25SZXNwb25zZS5lcnJvcl0uCmNsYXNzIFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZSB7CiAgZmluYWwgU3RyaW5nIF9yZXN1bHQ7CiAgZmluYWwgaW50IF9lcnJvckNvZGU7CiAgZmluYWwgU3RyaW5nIF9lcnJvckRldGFpbDsKCiAgLy8vIENyZWF0ZXMgYSBzdWNjZXNzZnVsIHJlc3BvbnNlIHRvIGEgc2VydmljZSBwcm90b2NvbCBleHRlbnNpb24gUlBDLgogIC8vLwogIC8vLyBSZXF1aXJlcyBbcmVzdWx0XSB0byBiZSBhIEpTT04gb2JqZWN0IGVuY29kZWQgYXMgYSBzdHJpbmcuIFdoZW4gZm9ybWluZwogIC8vLyB0aGUgSlNPTi1SUEMgbWVzc2FnZSBbcmVzdWx0XSB3aWxsIGJlIGlubGluZWQgZGlyZWN0bHkuCiAgU2VydmljZUV4dGVuc2lvblJlc3BvbnNlLnJlc3VsdChTdHJpbmcgcmVzdWx0KQogICAgICA6IF9yZXN1bHQgPSByZXN1bHQsCiAgICAgICAgX2Vycm9yQ29kZSA9IG51bGwsCiAgICAgICAgX2Vycm9yRGV0YWlsID0gbnVsbCB7CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChfcmVzdWx0LCAicmVzdWx0Iik7CiAgfQoKICAvLy8gQ3JlYXRlcyBhbiBlcnJvciByZXNwb25zZSB0byBhIHNlcnZpY2UgcHJvdG9jb2wgZXh0ZW5zaW9uIFJQQy4KICAvLy8KICAvLy8gUmVxdWlyZXMgW2Vycm9yQ29kZV0gdG8gYmUgW2ludmFsaWRQYXJhbXNdIG9yIGJldHdlZW4gW2V4dGVuc2lvbkVycm9yTWluXQogIC8vLyBhbmQgW2V4dGVuc2lvbkVycm9yTWF4XS4gUmVxdWlyZXMgW2Vycm9yRGV0YWlsXSB0byBiZSBhIEpTT04gb2JqZWN0CiAgLy8vIGVuY29kZWQgYXMgYSBzdHJpbmcuIFdoZW4gZm9ybWluZyB0aGUgSlNPTi1SUEMgbWVzc2FnZSBbZXJyb3JEZXRhaWxdIHdpbGwKICAvLy8gYmUgaW5saW5lZCBkaXJlY3RseS4KICBTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2UuZXJyb3IoaW50IGVycm9yQ29kZSwgU3RyaW5nIGVycm9yRGV0YWlsKQogICAgICA6IF9yZXN1bHQgPSBudWxsLAogICAgICAgIF9lcnJvckNvZGUgPSBlcnJvckNvZGUsCiAgICAgICAgX2Vycm9yRGV0YWlsID0gZXJyb3JEZXRhaWwgewogICAgX3ZhbGlkYXRlRXJyb3JDb2RlKF9lcnJvckNvZGUpOwogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoX2Vycm9yRGV0YWlsLCAiZXJyb3JEZXRhaWwiKTsKICB9CgogIC8vLyBJbnZhbGlkIG1ldGhvZCBwYXJhbWV0ZXIocykgZXJyb3IgY29kZS4KICBAZGVwcmVjYXRlZAogIHN0YXRpYyBjb25zdCBrSW52YWxpZFBhcmFtcyA9IGludmFsaWRQYXJhbXM7CgogIC8vLyBHZW5lcmljIGV4dGVuc2lvbiBlcnJvciBjb2RlLgogIEBkZXByZWNhdGVkCiAgc3RhdGljIGNvbnN0IGtFeHRlbnNpb25FcnJvciA9IGV4dGVuc2lvbkVycm9yOwoKICAvLy8gTWF4aW11bSBleHRlbnNpb24gcHJvdmlkZWQgZXJyb3IgY29kZS4KICBAZGVwcmVjYXRlZAogIHN0YXRpYyBjb25zdCBrRXh0ZW5zaW9uRXJyb3JNYXggPSBleHRlbnNpb25FcnJvck1heDsKCiAgLy8vIE1pbmltdW0gZXh0ZW5zaW9uIHByb3ZpZGVkIGVycm9yIGNvZGUuCiAgQGRlcHJlY2F0ZWQKICBzdGF0aWMgY29uc3Qga0V4dGVuc2lvbkVycm9yTWluID0gZXh0ZW5zaW9uRXJyb3JNaW47CgogIC8vLyBJbnZhbGlkIG1ldGhvZCBwYXJhbWV0ZXIocykgZXJyb3IgY29kZS4KICBzdGF0aWMgY29uc3QgaW52YWxpZFBhcmFtcyA9IC0zMjYwMjsKCiAgLy8vIEdlbmVyaWMgZXh0ZW5zaW9uIGVycm9yIGNvZGUuCiAgc3RhdGljIGNvbnN0IGV4dGVuc2lvbkVycm9yID0gLTMyMDAwOwoKICAvLy8gTWF4aW11bSBleHRlbnNpb24gcHJvdmlkZWQgZXJyb3IgY29kZS4KICBzdGF0aWMgY29uc3QgZXh0ZW5zaW9uRXJyb3JNYXggPSAtMzIwMDA7CgogIC8vLyBNaW5pbXVtIGV4dGVuc2lvbiBwcm92aWRlZCBlcnJvciBjb2RlLgogIHN0YXRpYyBjb25zdCBleHRlbnNpb25FcnJvck1pbiA9IC0zMjAxNjsKCiAgc3RhdGljIFN0cmluZyBfZXJyb3JDb2RlTWVzc2FnZShpbnQgZXJyb3JDb2RlKSB7CiAgICBfdmFsaWRhdGVFcnJvckNvZGUoZXJyb3JDb2RlKTsKICAgIGlmIChlcnJvckNvZGUgPT0gaW52YWxpZFBhcmFtcykgewogICAgICByZXR1cm4gIkludmFsaWQgcGFyYW1zIjsKICAgIH0KICAgIHJldHVybiAiU2VydmVyIGVycm9yIjsKICB9CgogIHN0YXRpYyBfdmFsaWRhdGVFcnJvckNvZGUoaW50IGVycm9yQ29kZSkgewogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoZXJyb3JDb2RlLCAiZXJyb3JDb2RlIik7CiAgICBpZiAoZXJyb3JDb2RlID09IGludmFsaWRQYXJhbXMpIHJldHVybjsKICAgIGlmICgoZXJyb3JDb2RlID49IGV4dGVuc2lvbkVycm9yTWluKSAmJiAoZXJyb3JDb2RlIDw9IGV4dGVuc2lvbkVycm9yTWF4KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZShlcnJvckNvZGUsICJlcnJvckNvZGUiLCAiT3V0IG9mIHJhbmdlIik7CiAgfQoKICAvLyBpZ25vcmU6IHVudXNlZF9lbGVtZW50LCBjYWxsZWQgZnJvbSBydW50aW1lL2xpYi9kZXZlbG9wZXIuZGFydAogIGJvb2wgX2lzRXJyb3IoKSA9PiAoX2Vycm9yQ29kZSAhPSBudWxsKSAmJiAoX2Vycm9yRGV0YWlsICE9IG51bGwpOwoKICAvLyBpZ25vcmU6IHVudXNlZF9lbGVtZW50LCBjYWxsZWQgZnJvbSBydW50aW1lL2xpYi9kZXZlbG9wZXIuZGFydAogIFN0cmluZyBfdG9TdHJpbmcoKSB7CiAgICBpZiAoX3Jlc3VsdCAhPSBudWxsKSB7CiAgICAgIHJldHVybiBfcmVzdWx0OwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KF9lcnJvckNvZGUgIT0gbnVsbCk7CiAgICAgIGFzc2VydChfZXJyb3JEZXRhaWwgIT0gbnVsbCk7CiAgICAgIHJldHVybiBqc29uLmVuY29kZSh7CiAgICAgICAgJ2NvZGUnOiBfZXJyb3JDb2RlLAogICAgICAgICdtZXNzYWdlJzogX2Vycm9yQ29kZU1lc3NhZ2UoX2Vycm9yQ29kZSksCiAgICAgICAgJ2RhdGEnOiB7J2RldGFpbHMnOiBfZXJyb3JEZXRhaWx9CiAgICAgIH0pOwogICAgfQogIH0KfQoKLy8vIEEgc2VydmljZSBwcm90b2NvbCBleHRlbnNpb24gaGFuZGxlci4gUmVnaXN0ZXJlZCB3aXRoIFtyZWdpc3RlckV4dGVuc2lvbl0uCi8vLwovLy8gTXVzdCBjb21wbGV0ZSB0byBhIFtTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2VdLiBbbWV0aG9kXSBpcyB0aGUgbWV0aG9kIG5hbWUKLy8vIG9mIHRoZSBzZXJ2aWNlIHByb3RvY29sIHJlcXVlc3QsIGFuZCBbcGFyYW1ldGVyc10gaXMgYSBtYXAgaG9sZGluZyB0aGUKLy8vIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZpY2UgcHJvdG9jb2wgcmVxdWVzdC4KLy8vCi8vLyAqTk9URSo6IGFsbCBwYXJhbWV0ZXIgbmFtZXMgYW5kIHZhbHVlcyBhcmUgZW5jb2RlZCBhcyBzdHJpbmdzLgp0eXBlZGVmIEZ1dHVyZTxTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2U+IFNlcnZpY2VFeHRlbnNpb25IYW5kbGVyKAogICAgU3RyaW5nIG1ldGhvZCwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKTsKCi8vLyBSZWdpc3RlciBhIFtTZXJ2aWNlRXh0ZW5zaW9uSGFuZGxlcl0gdGhhdCB3aWxsIGJlIGludm9rZWQgaW4gdGhpcyBpc29sYXRlCi8vLyBmb3IgW21ldGhvZF0uICpOT1RFKjogU2VydmljZSBwcm90b2NvbCBleHRlbnNpb25zIG11c3QgYmUgcmVnaXN0ZXJlZAovLy8gaW4gZWFjaCBpc29sYXRlLgovLy8KLy8vICpOT1RFKjogW21ldGhvZF0gbXVzdCBiZWdpbiB3aXRoICdleHQuJyBhbmQgeW91IHNob3VsZCB1c2UgdGhlIGZvbGxvd2luZwovLy8gc3RydWN0dXJlIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG90aGVyIHBhY2thZ2VzOiAnZXh0LnBhY2thZ2UuY29tbWFuZCcuCi8vLyBUaGF0IGlzLCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlICdleHQuJyBwcmVmaXgsIHNob3VsZCBiZSB0aGUgcmVnaXN0ZXJpbmcKLy8vIHBhY2thZ2UgbmFtZSBmb2xsb3dlZCBieSBhbm90aGVyIHBlcmlvZCAoJy4nKSBhbmQgdGhlbiB0aGUgY29tbWFuZCBuYW1lLgovLy8gRm9yIGV4YW1wbGU6ICdleHQuZGFydC5pby5nZXRPcGVuRmlsZXMnLgovLy8KLy8vIEJlY2F1c2Ugc2VydmljZSBleHRlbnNpb25zIGFyZSBpc29sYXRlIHNwZWNpZmljLCBjbGllbnRzIHVzaW5nIGV4dGVuc2lvbnMKLy8vIG11c3QgYWx3YXlzIGluY2x1ZGUgYW4gJ2lzb2xhdGVJZCcgcGFyYW1ldGVyIHdpdGggZWFjaCBSUEMuCnZvaWQgcmVnaXN0ZXJFeHRlbnNpb24oU3RyaW5nIG1ldGhvZCwgU2VydmljZUV4dGVuc2lvbkhhbmRsZXIgaGFuZGxlcikgewogIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKG1ldGhvZCwgJ21ldGhvZCcpOwogIGlmICghbWV0aG9kLnN0YXJ0c1dpdGgoJ2V4dC4nKSkgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUobWV0aG9kLCAnbWV0aG9kJywgJ011c3QgYmVnaW4gd2l0aCBleHQuJyk7CiAgfQogIGlmIChfbG9va3VwRXh0ZW5zaW9uKG1ldGhvZCkgIT0gbnVsbCkgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ0V4dGVuc2lvbiBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICRtZXRob2QnKTsKICB9CiAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoaGFuZGxlciwgJ2hhbmRsZXInKTsKICBfcmVnaXN0ZXJFeHRlbnNpb24obWV0aG9kLCBoYW5kbGVyKTsKfQoKLy8vIFBvc3QgYW4gZXZlbnQgb2YgW2V2ZW50S2luZF0gd2l0aCBwYXlsb2FkIG9mIFtldmVudERhdGFdIHRvIHRoZSBgRXh0ZW5zaW9uYAovLy8gZXZlbnQgc3RyZWFtLgp2b2lkIHBvc3RFdmVudChTdHJpbmcgZXZlbnRLaW5kLCBNYXAgZXZlbnREYXRhKSB7CiAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoZXZlbnRLaW5kLCAnZXZlbnRLaW5kJyk7CiAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoZXZlbnREYXRhLCAnZXZlbnREYXRhJyk7CiAgU3RyaW5nIGV2ZW50RGF0YUFzU3RyaW5nID0ganNvbi5lbmNvZGUoZXZlbnREYXRhKTsKICBfcG9zdEV2ZW50KGV2ZW50S2luZCwgZXZlbnREYXRhQXNTdHJpbmcpOwp9CgpleHRlcm5hbCB2b2lkIF9wb3N0RXZlbnQoU3RyaW5nIGV2ZW50S2luZCwgU3RyaW5nIGV2ZW50RGF0YSk7CgovLyBCb3RoIG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgd3JpdHRlbiBpbnNpZGUgQysrIHRvIGF2b2lkIHVwZGF0aW5nIHRoZSBkYXRhCi8vIHN0cnVjdHVyZXMgaW4gRGFydCwgZ2V0dGluZyBhbiBPT0IsIGFuZCBvYnNlcnZpbmcgc3RhbGUgc3RhdGUuIERvIG5vdCBtb3ZlCi8vIHRoZXNlIGludG8gRGFydCBjb2RlIHVubGVzcyB5b3UgY2FuIGVuc3VyZSB0aGF0IHRoZSBvcGVyYXRpb25zIHdpbGwgY2FuIGJlCi8vIGRvbmUgYXRvbWljYWxseS4gTmF0aXZlIGNvZGUgbGl2ZXMgaW4gdm0vaXNvbGF0ZS5jYy0KLy8gTG9va3VwU2VydmljZUV4dGVuc2lvbkhhbmRsZXIgYW5kIFJlZ2lzdGVyU2VydmljZUV4dGVuc2lvbkhhbmRsZXIuCmV4dGVybmFsIFNlcnZpY2VFeHRlbnNpb25IYW5kbGVyIF9sb29rdXBFeHRlbnNpb24oU3RyaW5nIG1ldGhvZCk7CmV4dGVybmFsIF9yZWdpc3RlckV4dGVuc2lvbihTdHJpbmcgbWV0aG9kLCBTZXJ2aWNlRXh0ZW5zaW9uSGFuZGxlciBoYW5kbGVyKTsKgJ4ATk48ARgBNARQKiEYGB0BSQZOPjEaGx4zBAFFBlBKUBtEGCAlJD0EAS4OLwEkDjEBLQ43AS0ONwEuJwEkKAEtKwEtKwEzIyYfBhsEAS04LFAOBksEAURFAUQXGxYNIiQbHDIqCgYEAgFPBE9LMARDQjQBTkkVBE1NUE0tBE5ASTAkTQQqRgQyJwIBUBIyNjY1LAIBPgFNTk44RkJNAR1kYXJ0OmRldmVsb3Blci9leHRlbnNpb24uZGFydDNvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvZGV2ZWxvcGVyL3RpbWVsaW5lLmRhcnSp/i8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuZGV2ZWxvcGVyOwoKY29uc3QgYm9vbCBfaGFzVGltZWxpbmUgPQogICAgY29uc3QgYm9vbC5mcm9tRW52aXJvbm1lbnQoImRhcnQuZGV2ZWxvcGVyLnRpbWVsaW5lIiwgZGVmYXVsdFZhbHVlOiB0cnVlKTsKCi8vLyBBIHR5cGVkZWYgZm9yIHRoZSBmdW5jdGlvbiBhcmd1bWVudCB0byBbVGltZWxpbmUudGltZVN5bmNdLgp0eXBlZGVmIFRpbWVsaW5lU3luY0Z1bmN0aW9uPFQ+ID0gVCBGdW5jdGlvbigpOwoKLy8gVE9ETzogVGhpcyB0eXBlZGVmIGlzIG5vdCB1c2VkLgp0eXBlZGVmIEZ1dHVyZSBUaW1lbGluZUFzeW5jRnVuY3Rpb24oKTsKCi8vLyBBIGNsYXNzIHRvIHJlcHJlc2VudCBGbG93IGV2ZW50cy4KLy8vCi8vLyBbRmxvd10gb2JqZWN0cyBhcmUgdXNlZCB0byB0aHJlYWQgZmxvdyBldmVudHMgYmV0d2VlbiB0aW1lbGluZSBzbGljZXMsCi8vLyBmb3IgZXhhbXBsZSwgdGhvc2UgY3JlYXRlZCB3aXRoIHRoZSBbVGltZWxpbmVdIGNsYXNzIGJlbG93LiBBZGRpbmcKLy8vIFtGbG93XSBvYmplY3RzIGNhdXNlIGFycm93cyB0byBiZSBkcmF3biBiZXR3ZWVuIHNsaWNlcyBpbiBDaHJvbWUncyB0cmFjZQovLy8gdmlld2VyLiBUaGUgYXJyb3dzIHN0YXJ0IGF0IGUuZyBbVGltZWxpbmVdIGV2ZW50cyB0aGF0IGFyZSBwYXNzZWQgYQovLy8gW0Zsb3cuYmVnaW5dIG9iamVjdCwgZ28gdGhyb3VnaCBbVGltZWxpbmVdIGV2ZW50cyB0aGF0IGFyZSBwYXNzZWQgYQovLy8gW0Zsb3cuc3RlcF0gb2JqZWN0LCBhbmQgZW5kIGF0IFtUaW1lbGluZV0gZXZlbnRzIHRoYXQgYXJlIHBhc3NlZCBhCi8vLyBbRmxvdy5lbmRdIG9iamVjdCwgYWxsIGhhdmluZyB0aGUgc2FtZSBbRmxvdy5pZF0uIEZvciBleGFtcGxlOgovLy8KLy8vIGBgYGRhcnQKLy8vIHZhciBmbG93ID0gRmxvdy5iZWdpbigpOwovLy8gVGltZWxpbmUudGltZVN5bmMoJ2Zsb3dfdGVzdCcsICgpIHsKLy8vICAgZG9Tb21ldGhpbmcoKTsKLy8vIH0sIGZsb3c6IGZsb3cpOwovLy8KLy8vIFRpbWVsaW5lLnRpbWVTeW5jKCdmbG93X3Rlc3QnLCAoKSB7Ci8vLyAgIGRvU29tZXRoaW5nKCk7Ci8vLyB9LCBmbG93OiBGbG93LnN0ZXAoZmxvdy5pZCkpOwovLy8KLy8vIFRpbWVsaW5lLnRpbWVTeW5jKCdmbG93X3Rlc3QnLCAoKSB7Ci8vLyAgIGRvU29tZXRoaW5nKCk7Ci8vLyB9LCBmbG93OiBGbG93LmVuZChmbG93LmlkKSk7Ci8vLyBgYGAKY2xhc3MgRmxvdyB7CiAgLy8gVGhlc2UgdmFsdWVzIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGVudW0gIkV2ZW50VHlwZSIgaW4KICAvLyBydW50aW1lL3ZtL3RpbWVsaW5lLmguCiAgc3RhdGljIGNvbnN0IGludCBfYmVnaW4gPSA5OwogIHN0YXRpYyBjb25zdCBpbnQgX3N0ZXAgPSAxMDsKICBzdGF0aWMgY29uc3QgaW50IF9lbmQgPSAxMTsKCiAgZmluYWwgaW50IF90eXBlOwoKICAvLy8gVGhlIGZsb3cgaWQgb2YgdGhlIGZsb3cgZXZlbnQuCiAgZmluYWwgaW50IGlkOwoKICBGbG93Ll8odGhpcy5fdHlwZSwgdGhpcy5pZCk7CgogIC8vLyBBICJiZWdpbiIgRmxvdyBldmVudC4KICAvLy8KICAvLy8gV2hlbiBwYXNzZWQgdG8gYSBbVGltZWxpbmVdIG1ldGhvZCwgZ2VuZXJhdGVzIGEgImJlZ2luIiBGbG93IGV2ZW50LgogIC8vLyBJZiBbaWRdIGlzIG5vdCBwcm92aWRlZCwgYW4gaWQgdGhhdCBjb25mbGljdHMgd2l0aCBubyBvdGhlciBEYXJ0LWdlbmVyYXRlZAogIC8vLyBmbG93IGlkJ3Mgd2lsbCBiZSBnZW5lcmF0ZWQuCiAgc3RhdGljIEZsb3cgYmVnaW4oe2ludCBpZH0pIHsKICAgIHJldHVybiBuZXcgRmxvdy5fKF9iZWdpbiwgaWQgPz8gX2dldE5leHRBc3luY0lkKCkpOwogIH0KCiAgLy8vIEEgInN0ZXAiIEZsb3cgZXZlbnQuCiAgLy8vCiAgLy8vIFdoZW4gcGFzc2VkIHRvIGEgW1RpbWVsaW5lXSBtZXRob2QsIGdlbmVyYXRlcyBhICJzdGVwIiBGbG93IGV2ZW50LgogIC8vLyBUaGUgW2lkXSBhcmd1bWVudCBpcyByZXF1aXJlZC4gSXQgY2FuIGNvbWUgZWl0aGVyIGZyb20gYW5vdGhlciBbRmxvd10KICAvLy8gZXZlbnQsIG9yIHNvbWUgaWQgdGhhdCBjb21lcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4KICBzdGF0aWMgRmxvdyBzdGVwKGludCBpZCkgPT4gbmV3IEZsb3cuXyhfc3RlcCwgaWQpOwoKICAvLy8gQW4gImVuZCIgRmxvdyBldmVudC4KICAvLy8KICAvLy8gV2hlbiBwYXNzZWQgdG8gYSBbVGltZWxpbmVdIG1ldGhvZCwgZ2VuZXJhdGVzIGEgImVuZCIgRmxvdyBldmVudC4KICAvLy8gVGhlIFtpZF0gYXJndW1lbnQgaXMgcmVxdWlyZWQuIEl0IGNhbiBjb21lIGVpdGhlciBmcm9tIGFub3RoZXIgW0Zsb3ddCiAgLy8vIGV2ZW50LCBvciBzb21lIGlkIHRoYXQgY29tZXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuCiAgc3RhdGljIEZsb3cgZW5kKGludCBpZCkgPT4gbmV3IEZsb3cuXyhfZW5kLCBpZCk7Cn0KCi8vLyBBZGQgdG8gdGhlIHRpbWVsaW5lLgovLy8KLy8vIFtUaW1lbGluZV0ncyBtZXRob2RzIGFkZCBzeW5jaHJvbm91cyBldmVudHMgdG8gdGhlIHRpbWVsaW5lLiBXaGVuCi8vLyBnZW5lcmF0aW5nIGEgdGltZWxpbmUgaW4gQ2hyb21lJ3MgdHJhY2luZyBmb3JtYXQsIHVzaW5nIFtUaW1lbGluZV0gZ2VuZXJhdGVzCi8vLyAiQ29tcGxldGUiIGV2ZW50cy4gW1RpbWVsaW5lXSdzIFtzdGFydFN5bmNdIGFuZCBbZmluaXNoU3luY10gY2FuIGJlIHVzZWQKLy8vIGV4cGxpY2l0bHksIG9yIGltcGxpY2l0bHkgYnkgd3JhcHBpbmcgYSBjbG9zdXJlIGluIFt0aW1lU3luY10uIEZvciBleGFtcGxlOgovLy8KLy8vIGBgYGRhcnQKLy8vIFRpbWVsaW5lLnN0YXJ0U3luYygiRG9pbmcgU29tZXRoaW5nIik7Ci8vLyBkb1NvbWV0aGluZygpOwovLy8gVGltZWxpbmUuZmluaXNoU3luYygpOwovLy8gYGBgCi8vLwovLy8gT3I6Ci8vLwovLy8gYGBgZGFydAovLy8gVGltZWxpbmUudGltZVN5bmMoIkRvaW5nIFNvbWV0aGluZyIsICgpIHsKLy8vICAgZG9Tb21ldGhpbmcoKTsKLy8vIH0pOwovLy8gYGBgCmNsYXNzIFRpbWVsaW5lIHsKICAvLy8gU3RhcnQgYSBzeW5jaHJvbm91cyBvcGVyYXRpb24gbGFiZWxlZCBbbmFtZV0uIE9wdGlvbmFsbHkgdGFrZXMKICAvLy8gYSBbTWFwXSBvZiBbYXJndW1lbnRzXS4gVGhpcyBzbGljZSBtYXkgYWxzbyBvcHRpb25hbGx5IGJlIGFzc29jaWF0ZWQgd2l0aAogIC8vLyBhIFtGbG93XSBldmVudC4gVGhpcyBvcGVyYXRpb24gbXVzdCBiZSBmaW5pc2hlZCBiZWZvcmUKICAvLy8gcmV0dXJuaW5nIHRvIHRoZSBldmVudCBxdWV1ZS4KICBzdGF0aWMgdm9pZCBzdGFydFN5bmMoU3RyaW5nIG5hbWUsIHtNYXAgYXJndW1lbnRzLCBGbG93IGZsb3d9KSB7CiAgICBpZiAoIV9oYXNUaW1lbGluZSkgcmV0dXJuOwogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwobmFtZSwgJ25hbWUnKTsKICAgIGlmICghX2lzRGFydFN0cmVhbUVuYWJsZWQoKSkgewogICAgICAvLyBQdXNoIGEgbnVsbCBvbnRvIHRoZSBzdGFjayBhbmQgcmV0dXJuLgogICAgICBfc3RhY2suYWRkKG51bGwpOwogICAgICByZXR1cm47CiAgICB9CiAgICB2YXIgYmxvY2sgPSBuZXcgX1N5bmNCbG9jay5fKG5hbWUsIF9nZXRUcmFjZUNsb2NrKCksIF9nZXRUaHJlYWRDcHVDbG9jaygpKTsKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBibG9jay5fYXJndW1lbnRzID0gYXJndW1lbnRzOwogICAgfQogICAgaWYgKGZsb3cgIT0gbnVsbCkgewogICAgICBibG9jay5mbG93ID0gZmxvdzsKICAgIH0KICAgIF9zdGFjay5hZGQoYmxvY2spOwogIH0KCiAgLy8vIEZpbmlzaCB0aGUgbGFzdCBzeW5jaHJvbm91cyBvcGVyYXRpb24gdGhhdCB3YXMgc3RhcnRlZC4KICBzdGF0aWMgdm9pZCBmaW5pc2hTeW5jKCkgewogICAgaWYgKCFfaGFzVGltZWxpbmUpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKF9zdGFjay5sZW5ndGggPT0gMCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcignVW5ldmVuIGNhbGxzIHRvIHN0YXJ0U3luYyBhbmQgZmluaXNoU3luYycpOwogICAgfQogICAgLy8gUG9wIHRvcCBpdGVtIG9mZiBvZiBzdGFjay4KICAgIHZhciBibG9jayA9IF9zdGFjay5yZW1vdmVMYXN0KCk7CiAgICBpZiAoYmxvY2sgPT0gbnVsbCkgewogICAgICAvLyBEYXJ0IHN0cmVhbSB3YXMgZGlzYWJsZWQgd2hlbiBzdGFydFN5bmMgd2FzIGNhbGxlZC4KICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gRmluaXNoIGl0LgogICAgYmxvY2suZmluaXNoKCk7CiAgfQoKICAvLy8gRW1pdCBhbiBpbnN0YW50IGV2ZW50LgogIHN0YXRpYyB2b2lkIGluc3RhbnRTeW5jKFN0cmluZyBuYW1lLCB7TWFwIGFyZ3VtZW50c30pIHsKICAgIGlmICghX2hhc1RpbWVsaW5lKSByZXR1cm47CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChuYW1lLCAnbmFtZScpOwogICAgaWYgKCFfaXNEYXJ0U3RyZWFtRW5hYmxlZCgpKSB7CiAgICAgIC8vIFN0cmVhbSBpcyBkaXNhYmxlZC4KICAgICAgcmV0dXJuOwogICAgfQogICAgTWFwIGluc3RhbnRBcmd1bWVudHM7CiAgICBpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgaW5zdGFudEFyZ3VtZW50cyA9IG5ldyBNYXAuZnJvbShhcmd1bWVudHMpOwogICAgfQogICAgX3JlcG9ydEluc3RhbnRFdmVudCgKICAgICAgICBfZ2V0VHJhY2VDbG9jaygpLCAnRGFydCcsIG5hbWUsIF9hcmd1bWVudHNBc0pzb24oaW5zdGFudEFyZ3VtZW50cykpOwogIH0KCiAgLy8vIEEgdXRpbGl0eSBtZXRob2QgdG8gdGltZSBhIHN5bmNocm9ub3VzIFtmdW5jdGlvbl0uIEludGVybmFsbHkgY2FsbHMKICAvLy8gW2Z1bmN0aW9uXSBicmFja2V0ZWQgYnkgY2FsbHMgdG8gW3N0YXJ0U3luY10gYW5kIFtmaW5pc2hTeW5jXS4KICBzdGF0aWMgVCB0aW1lU3luYzxUPihTdHJpbmcgbmFtZSwgVGltZWxpbmVTeW5jRnVuY3Rpb248VD4gZnVuY3Rpb24sCiAgICAgIHtNYXAgYXJndW1lbnRzLCBGbG93IGZsb3d9KSB7CiAgICBzdGFydFN5bmMobmFtZSwgYXJndW1lbnRzOiBhcmd1bWVudHMsIGZsb3c6IGZsb3cpOwogICAgdHJ5IHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCk7CiAgICB9IGZpbmFsbHkgewogICAgICBmaW5pc2hTeW5jKCk7CiAgICB9CiAgfQoKICAvLy8gVGhlIGN1cnJlbnQgdGltZSBzdGFtcCBmcm9tIHRoZSBjbG9jayB1c2VkIGJ5IHRoZSB0aW1lbGluZS4gVW5pdHMgYXJlCiAgLy8vIG1pY3Jvc2Vjb25kcy4KICBzdGF0aWMgaW50IGdldCBub3cgPT4gX2dldFRyYWNlQ2xvY2soKTsKICBzdGF0aWMgZmluYWwgTGlzdDxfU3luY0Jsb2NrPiBfc3RhY2sgPSBuZXcgTGlzdDxfU3luY0Jsb2NrPigpOwp9CgovLy8gQW4gYXN5bmNocm9ub3VzIHRhc2sgb24gdGhlIHRpbWVsaW5lLiBBbiBhc3luY2hyb25vdXMgdGFzayBjYW4gaGF2ZSBtYW55Ci8vLyAobmVzdGVkKSBzeW5jaHJvbm91cyBvcGVyYXRpb25zLiBTeW5jaHJvbm91cyBvcGVyYXRpb25zIGNhbiBsaXZlIGxvbmdlciB0aGFuCi8vLyB0aGUgY3VycmVudCBpc29sYXRlIGV2ZW50LiBUbyBwYXNzIGEgW1RpbWVsaW5lVGFza10gdG8gYW5vdGhlciBpc29sYXRlLAovLy8geW91IG11c3QgZmlyc3QgY2FsbCBbcGFzc10gdG8gZ2V0IHRoZSB0YXNrIGlkIGFuZCB0aGVuIGNvbnN0cnVjdCBhIG5ldwovLy8gW1RpbWVsaW5lVGFza10gaW4gdGhlIG90aGVyIGlzb2xhdGUuCmNsYXNzIFRpbWVsaW5lVGFzayB7CiAgLy8vIENyZWF0ZSBhIHRhc2suIFRoZSB0YXNrIElEIHdpbGwgYmUgc2V0IGJ5IHRoZSBzeXN0ZW0uCiAgVGltZWxpbmVUYXNrKCkgOiBfdGFza0lkID0gX2dldE5leHRBc3luY0lkKCkge30KCiAgLy8vIENyZWF0ZSBhIHRhc2sgd2l0aCBhbiBleHBsaWNpdCBbdGFza0lkXS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGFyZQogIC8vLyBwYXNzaW5nIGEgdGFzayBmcm9tIG9uZSBpc29sYXRlIHRvIGFub3RoZXIuCiAgVGltZWxpbmVUYXNrLndpdGhUYXNrSWQoaW50IHRhc2tJZCkgOiBfdGFza0lkID0gdGFza0lkIHsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKHRhc2tJZCwgJ3Rhc2tJZCcpOwogIH0KCiAgLy8vIFN0YXJ0IGEgc3luY2hyb25vdXMgb3BlcmF0aW9uIHdpdGhpbiB0aGlzIHRhc2sgbmFtZWQgW25hbWVdLgogIC8vLyBPcHRpb25hbGx5IHRha2VzIGEgW01hcF0gb2YgW2FyZ3VtZW50c10uCiAgdm9pZCBzdGFydChTdHJpbmcgbmFtZSwge01hcCBhcmd1bWVudHN9KSB7CiAgICBpZiAoIV9oYXNUaW1lbGluZSkgcmV0dXJuOwogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwobmFtZSwgJ25hbWUnKTsKICAgIHZhciBibG9jayA9IG5ldyBfQXN5bmNCbG9jay5fKG5hbWUsIF90YXNrSWQpOwogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGJsb2NrLl9hcmd1bWVudHMgPSBhcmd1bWVudHM7CiAgICB9CiAgICBfc3RhY2suYWRkKGJsb2NrKTsKICAgIGJsb2NrLl9zdGFydCgpOwogIH0KCiAgLy8vIEVtaXQgYW4gaW5zdGFudCBldmVudCBmb3IgdGhpcyB0YXNrLgogIHZvaWQgaW5zdGFudChTdHJpbmcgbmFtZSwge01hcCBhcmd1bWVudHN9KSB7CiAgICBpZiAoIV9oYXNUaW1lbGluZSkgcmV0dXJuOwogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwobmFtZSwgJ25hbWUnKTsKICAgIE1hcCBpbnN0YW50QXJndW1lbnRzOwogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGluc3RhbnRBcmd1bWVudHMgPSBuZXcgTWFwLmZyb20oYXJndW1lbnRzKTsKICAgIH0KICAgIF9yZXBvcnRUYXNrRXZlbnQoX2dldFRyYWNlQ2xvY2soKSwgX3Rhc2tJZCwgJ24nLCAnRGFydCcsIG5hbWUsCiAgICAgICAgX2FyZ3VtZW50c0FzSnNvbihpbnN0YW50QXJndW1lbnRzKSk7CiAgfQoKICAvLy8gRmluaXNoIHRoZSBsYXN0IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB0aGF0IHdhcyBzdGFydGVkLgogIHZvaWQgZmluaXNoKCkgewogICAgaWYgKCFfaGFzVGltZWxpbmUpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKF9zdGFjay5sZW5ndGggPT0gMCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcignVW5ldmVuIGNhbGxzIHRvIHN0YXJ0IGFuZCBmaW5pc2gnKTsKICAgIH0KICAgIC8vIFBvcCB0b3AgaXRlbSBvZmYgb2Ygc3RhY2suCiAgICB2YXIgYmxvY2sgPSBfc3RhY2sucmVtb3ZlTGFzdCgpOwogICAgYmxvY2suX2ZpbmlzaCgpOwogIH0KCiAgLy8vIFJldHJpZXZlIHRoZSBbVGltZWxpbmVUYXNrXSdzIHRhc2sgaWQuIFdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZQogIC8vLyBzdGFjayBpcyBub3QgZW1wdHkuCiAgaW50IHBhc3MoKSB7CiAgICBpZiAoX3N0YWNrLmxlbmd0aCA+IDApIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoCiAgICAgICAgICAnWW91IGNhbm5vdCBwYXNzIGEgVGltZWxpbmVUYXNrIHdpdGhvdXQgZmluaXNoaW5nIGFsbCBzdGFydGVkICcKICAgICAgICAgICdvcGVyYXRpb25zJyk7CiAgICB9CiAgICBpbnQgciA9IF90YXNrSWQ7CiAgICByZXR1cm4gcjsKICB9CgogIGZpbmFsIGludCBfdGFza0lkOwogIGZpbmFsIExpc3Q8X0FzeW5jQmxvY2s+IF9zdGFjayA9IFtdOwp9CgovLy8gQW4gYXN5bmNocm9ub3VzIGJsb2NrIG9mIHRpbWUgb24gdGhlIHRpbWVsaW5lLiBUaGlzIGJsb2NrIGNhbiBiZSBrZXB0Ci8vLyBvcGVuIGFjcm9zcyBpc29sYXRlIG1lc3NhZ2VzLgpjbGFzcyBfQXN5bmNCbG9jayB7CiAgLy8vIFRoZSBjYXRlZ29yeSB0aGlzIGJsb2NrIGJlbG9uZ3MgdG8uCiAgZmluYWwgU3RyaW5nIGNhdGVnb3J5ID0gJ0RhcnQnOwoKICAvLy8gVGhlIG5hbWUgb2YgdGhpcyBibG9jay4KICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgLy8vIFRoZSBhc3luY2hyb25vdXMgdGFzayBpZC4KICBmaW5hbCBpbnQgX3Rhc2tJZDsKCiAgLy8vIEFuIChvcHRpb25hbCkgc2V0IG9mIGFyZ3VtZW50cyB3aGljaCB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gSlNPTiBhbmQKICAvLy8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmxvY2suCiAgTWFwIF9hcmd1bWVudHM7CgogIF9Bc3luY0Jsb2NrLl8odGhpcy5uYW1lLCB0aGlzLl90YXNrSWQpOwoKICAvLyBFbWl0IHRoZSBzdGFydCBldmVudC4KICB2b2lkIF9zdGFydCgpIHsKICAgIF9yZXBvcnRUYXNrRXZlbnQoCiAgICAgICAgX2dldFRyYWNlQ2xvY2soKSwgX3Rhc2tJZCwgJ2InLCBjYXRlZ29yeSwgbmFtZSwgX2FyZ3VtZW50c0FzSnNvbihudWxsKSk7CiAgfQoKICAvLyBFbWl0IHRoZSBmaW5pc2ggZXZlbnQuCiAgdm9pZCBfZmluaXNoKCkgewogICAgX3JlcG9ydFRhc2tFdmVudChfZ2V0VHJhY2VDbG9jaygpLCBfdGFza0lkLCAnZScsIGNhdGVnb3J5LCBuYW1lLAogICAgICAgIF9hcmd1bWVudHNBc0pzb24oX2FyZ3VtZW50cykpOwogIH0KfQoKLy8vIEEgc3luY2hyb25vdXMgYmxvY2sgb2YgdGltZSBvbiB0aGUgdGltZWxpbmUuIFRoaXMgYmxvY2sgc2hvdWxkIG5vdCBiZQovLy8ga2VwdCBvcGVuIGFjcm9zcyBpc29sYXRlIG1lc3NhZ2VzLgpjbGFzcyBfU3luY0Jsb2NrIHsKICAvLy8gVGhlIGNhdGVnb3J5IHRoaXMgYmxvY2sgYmVsb25ncyB0by4KICBmaW5hbCBTdHJpbmcgY2F0ZWdvcnkgPSAnRGFydCc7CgogIC8vLyBUaGUgbmFtZSBvZiB0aGlzIGJsb2NrLgogIGZpbmFsIFN0cmluZyBuYW1lOwoKICAvLy8gQW4gKG9wdGlvbmFsKSBzZXQgb2YgYXJndW1lbnRzIHdoaWNoIHdpbGwgYmUgc2VyaWFsaXplZCB0byBKU09OIGFuZAogIC8vLyBhc3NvY2lhdGVkIHdpdGggdGhpcyBibG9jay4KICBNYXAgX2FyZ3VtZW50czsKICAvLyBUaGUgc3RhcnQgdGltZSBzdGFtcC4KICBmaW5hbCBpbnQgX3N0YXJ0OwogIC8vIFRoZSBzdGFydCB0aW1lIHN0YW1wIG9mIHRoZSB0aHJlYWQgY3B1IGNsb2NrLgogIGZpbmFsIGludCBfc3RhcnRDcHU7CgogIC8vLyBBbiAob3B0aW9uYWwpIGZsb3cgZXZlbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmxvY2suCiAgRmxvdyBfZmxvdzsKCiAgX1N5bmNCbG9jay5fKHRoaXMubmFtZSwgdGhpcy5fc3RhcnQsIHRoaXMuX3N0YXJ0Q3B1KTsKCiAgLy8vIEZpbmlzaCB0aGlzIGJsb2NrIG9mIHRpbWUuIEF0IHRoaXMgcG9pbnQsIHRoaXMgYmxvY2sgY2FuIG5vIGxvbmdlciBiZQogIC8vLyB1c2VkLgogIHZvaWQgZmluaXNoKCkgewogICAgLy8gUmVwb3J0IGV2ZW50IHRvIHJ1bnRpbWUuCiAgICBfcmVwb3J0Q29tcGxldGVFdmVudCgKICAgICAgICBfc3RhcnQsIF9zdGFydENwdSwgY2F0ZWdvcnksIG5hbWUsIF9hcmd1bWVudHNBc0pzb24oX2FyZ3VtZW50cykpOwogICAgaWYgKF9mbG93ICE9IG51bGwpIHsKICAgICAgX3JlcG9ydEZsb3dFdmVudChfc3RhcnQsIF9zdGFydENwdSwgY2F0ZWdvcnksIG5hbWUsIF9mbG93Ll90eXBlLCBfZmxvdy5pZCwKICAgICAgICAgIF9hcmd1bWVudHNBc0pzb24obnVsbCkpOwogICAgfQogIH0KCiAgdm9pZCBzZXQgZmxvdyhGbG93IGYpIHsKICAgIF9mbG93ID0gZjsKICB9Cn0KClN0cmluZyBfYXJndW1lbnRzQXNKc29uKE1hcCBhcmd1bWVudHMpIHsKICBpZiAoKGFyZ3VtZW50cyA9PSBudWxsKSB8fCAoYXJndW1lbnRzLmxlbmd0aCA9PSAwKSkgewogICAgLy8gRmFzdCBwYXRoIG5vIGFyZ3VtZW50cy4gQXZvaWQgY2FsbGluZyBqc29uRW5jb2RlLgogICAgcmV0dXJuICd7fSc7CiAgfQogIHJldHVybiBqc29uLmVuY29kZShhcmd1bWVudHMpOwp9CgovLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBEYXJ0IFRpbWVsaW5lIHN0cmVhbSBpcyBlbmFibGVkLgpleHRlcm5hbCBib29sIF9pc0RhcnRTdHJlYW1FbmFibGVkKCk7CgovLy8gUmV0dXJucyB0aGUgbmV4dCBhc3luYyB0YXNrIGlkLgpleHRlcm5hbCBpbnQgX2dldE5leHRBc3luY0lkKCk7CgovLy8gUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZSB0cmFjZSBjbG9jay4KZXh0ZXJuYWwgaW50IF9nZXRUcmFjZUNsb2NrKCk7CgovLy8gUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZSB0aHJlYWQgQ1BVIHVzYWdlIGNsb2NrLgpleHRlcm5hbCBpbnQgX2dldFRocmVhZENwdUNsb2NrKCk7CgovLy8gUmVwb3J0cyBhbiBldmVudCBmb3IgYSB0YXNrLgpleHRlcm5hbCB2b2lkIF9yZXBvcnRUYXNrRXZlbnQoaW50IHN0YXJ0LCBpbnQgdGFza0lkLCBTdHJpbmcgcGhhc2UsCiAgICBTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBuYW1lLCBTdHJpbmcgYXJndW1lbnRzQXNKc29uKTsKCi8vLyBSZXBvcnRzIGEgY29tcGxldGUgc3luY2hyb25vdXMgZXZlbnQuCmV4dGVybmFsIHZvaWQgX3JlcG9ydENvbXBsZXRlRXZlbnQoaW50IHN0YXJ0LCBpbnQgc3RhcnRDcHUsIFN0cmluZyBjYXRlZ29yeSwKICAgIFN0cmluZyBuYW1lLCBTdHJpbmcgYXJndW1lbnRzQXNKc29uKTsKCi8vLyBSZXBvcnRzIGEgZmxvdyBldmVudC4KZXh0ZXJuYWwgdm9pZCBfcmVwb3J0Rmxvd0V2ZW50KGludCBzdGFydCwgaW50IHN0YXJ0Q3B1LCBTdHJpbmcgY2F0ZWdvcnksCiAgICBTdHJpbmcgbmFtZSwgaW50IHR5cGUsIGludCBpZCwgU3RyaW5nIGFyZ3VtZW50c0FzSnNvbik7CgovLy8gUmVwb3J0cyBhbiBpbnN0YW50IGV2ZW50LgpleHRlcm5hbCB2b2lkIF9yZXBvcnRJbnN0YW50RXZlbnQoCiAgICBpbnQgc3RhcnQsIFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG5hbWUsIFN0cmluZyBhcmd1bWVudHNBc0pzb24pOwqBXABOTjwBGAEaTwFAMAEjKAEmBEtHTUhIR0MEDB0oFRQEKBUiBCgVIQgNRBwfHx4BEwElEAEfARwGSlEjIDgEARsGSUw5NQEbBkhMOTMCARkERlFNUAQMKxMbCAQIBAwuFQgIEUVQPSRDHy4jMBgOBlAdJAYYGQYXBAE+HRkOBh5IBiIlGT0OBhIUBAEdOh8uIx0OBhodMgYZTQQBSkVGJDcKGRAUBgQBTBQqQQIBTVFMSykVPDIBSTI7MgQBQy8tHy4yHSQGFxQEASsvHy4aHTIGQy0EAT4SGQ4GHkAGIiUVBAFMGg8dHEoZBhUOBAEVJwIBSiIUKiIBHhUBIBUBSiISASoBGxIWUQQBHBNFJwQCAUonEyoiAR4VAUoiEhsUMxcBOw4BOAFMDBIgGkoZUSMGBAEaDwQCASk4OREEIQIBOSYBJCABNB8BPyMBIUQ7ASpNKgEaSTwBHiNGARxkYXJ0OmRldmVsb3Blci90aW1lbGluZS5kYXJ0LW9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvcHJvZmlsZXIuZGFydIMcLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImRldmVsb3Blci5kYXJ0IjsKCkBwYXRjaApjbGFzcyBVc2VyVGFnIHsKICBAcGF0Y2gKICBmYWN0b3J5IFVzZXJUYWcoU3RyaW5nIGxhYmVsKSB7CiAgICByZXR1cm4gbmV3IF9Vc2VyVGFnKGxhYmVsKTsKICB9CiAgQHBhdGNoCiAgc3RhdGljIFVzZXJUYWcgZ2V0IGRlZmF1bHRUYWcgPT4gX2dldERlZmF1bHRUYWcoKTsKfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfVXNlclRhZyBpbXBsZW1lbnRzIFVzZXJUYWcgewogIGZhY3RvcnkgX1VzZXJUYWcoU3RyaW5nIGxhYmVsKSBuYXRpdmUgIlVzZXJUYWdfbmV3IjsKICBTdHJpbmcgZ2V0IGxhYmVsIG5hdGl2ZSAiVXNlclRhZ19sYWJlbCI7CiAgVXNlclRhZyBtYWtlQ3VycmVudCgpIG5hdGl2ZSAiVXNlclRhZ19tYWtlQ3VycmVudCI7Cn0KCkBwYXRjaApVc2VyVGFnIGdldEN1cnJlbnRUYWcoKSA9PiBfZ2V0Q3VycmVudFRhZygpOwpVc2VyVGFnIF9nZXRDdXJyZW50VGFnKCkgbmF0aXZlICJQcm9maWxlcl9nZXRDdXJyZW50VGFnIjsKClVzZXJUYWcgX2dldERlZmF1bHRUYWcoKSBuYXRpdmUgIlVzZXJUYWdfZGVmYXVsdFRhZyI7Ch4ATk48AR0BBxAJIiAECTUCARokNys2AgEHLToBNgEiZGFydDpkZXZlbG9wZXItcGF0Y2gvcHJvZmlsZXIuZGFydDNvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvZGV2ZWxvcGVyL3Byb2ZpbGVyLmRhcnSPYS8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuZGV2ZWxvcGVyOwoKLy8vIEEgVXNlclRhZyBjYW4gYmUgdXNlZCB0byBncm91cCBzYW1wbGVzIGluIHRoZSBPYnNlcnZhdG9yeSBwcm9maWxlci4KYWJzdHJhY3QgY2xhc3MgVXNlclRhZyB7CiAgLy8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBVc2VyVGFnIGluc3RhbmNlcyB0aGF0IGNhbiBiZSBjcmVhdGVkIGJ5IGEgcHJvZ3JhbS4KICBzdGF0aWMgY29uc3QgTUFYX1VTRVJfVEFHUyA9IDY0OwoKICBleHRlcm5hbCBmYWN0b3J5IFVzZXJUYWcoU3RyaW5nIGxhYmVsKTsKCiAgLy8vIExhYmVsIG9mIFt0aGlzXS4KICBTdHJpbmcgZ2V0IGxhYmVsOwoKICAvLy8gTWFrZSBbdGhpc10gdGhlIGN1cnJlbnQgdGFnIGZvciB0aGUgaXNvbGF0ZS4gUmV0dXJucyB0aGUgY3VycmVudCB0YWcKICAvLy8gYmVmb3JlIHNldHRpbmcuCiAgVXNlclRhZyBtYWtlQ3VycmVudCgpOwoKICAvLy8gVGhlIGRlZmF1bHQgW1VzZXJUYWddIHdpdGggbGFiZWwgJ0RlZmF1bHQnLgogIGV4dGVybmFsIHN0YXRpYyBVc2VyVGFnIGdldCBkZWZhdWx0VGFnOwp9CgovLy8gUmV0dXJucyB0aGUgY3VycmVudCBbVXNlclRhZ10gZm9yIHRoZSBpc29sYXRlLgpleHRlcm5hbCBVc2VyVGFnIGdldEN1cnJlbnRUYWcoKTsKCi8vLyBBYnN0cmFjdCBbTWV0cmljXSBjbGFzcy4gTWV0cmljIG5hbWVzIG11c3QgYmUgdW5pcXVlLCBhcmUgaGllcmFyY2hpY2FsLAovLy8gYW5kIHVzZSBwZXJpb2RzIGFzIHNlcGFyYXRvcnMuIEZvciBleGFtcGxlLCAnYS5iLmMnLiBVbmlxdWVuZXNzIGlzIG9ubHkKLy8vIGVuZm9yY2VkIHdoZW4gYSBNZXRyaWMgaXMgcmVnaXN0ZXJlZC4gVGhlIG5hbWUgb2YgYSBtZXRyaWMgY2Fubm90IGNvbnRhaW4KLy8vIHRoZSBzbGFzaCAoJy8nKSBjaGFyYWN0ZXIuCmFic3RyYWN0IGNsYXNzIE1ldHJpYyB7CiAgLy8vIFtuYW1lXSBvZiB0aGlzIG1ldHJpYy4KICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgLy8vIFtkZXNjcmlwdGlvbl0gb2YgdGhpcyBtZXRyaWMuCiAgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uOwoKICBNZXRyaWModGhpcy5uYW1lLCB0aGlzLmRlc2NyaXB0aW9uKSB7CiAgICBpZiAoKG5hbWUgPT0gJ3ZtJykgfHwgbmFtZS5jb250YWlucygnLycpKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdJbnZhbGlkIE1ldHJpYyBuYW1lLicpOwogICAgfQogIH0KCiAgTWFwIF90b0pTT04oKTsKfQoKLy8vIEEgbWVhc3VyZWQgdmFsdWUgd2l0aCBhIG1pbiBhbmQgbWF4LiBJbml0aWFsIHZhbHVlIGlzIG1pbi4gVmFsdWUgd2lsbAovLy8gYmUgY2xhbXBlZCB0byB0aGUgaW50ZXJ2YWwgW21pbiwgbWF4XS4KY2xhc3MgR2F1Z2UgZXh0ZW5kcyBNZXRyaWMgewogIGZpbmFsIGRvdWJsZSBtaW47CiAgZmluYWwgZG91YmxlIG1heDsKCiAgZG91YmxlIF92YWx1ZTsKICBkb3VibGUgZ2V0IHZhbHVlID0+IF92YWx1ZTsKICBzZXQgdmFsdWUoZG91YmxlIHYpIHsKICAgIGlmICh2IDwgbWluKSB7CiAgICAgIHYgPSBtaW47CiAgICB9IGVsc2UgaWYgKHYgPiBtYXgpIHsKICAgICAgdiA9IG1heDsKICAgIH0KICAgIF92YWx1ZSA9IHY7CiAgfQoKICBHYXVnZShTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uLCB0aGlzLm1pbiwgdGhpcy5tYXgpCiAgICAgIDogc3VwZXIobmFtZSwgZGVzY3JpcHRpb24pIHsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKG1pbiwgJ21pbicpOwogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwobWF4LCAnbWF4Jyk7CiAgICBpZiAoIShtaW4gPCBtYXgpKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignbWluIG11c3QgYmUgbGVzcyB0aGFuIG1heCcpOwogICAgX3ZhbHVlID0gbWluOwogIH0KCiAgTWFwIF90b0pTT04oKSB7CiAgICB2YXIgbWFwID0gewogICAgICAndHlwZSc6ICdHYXVnZScsCiAgICAgICdpZCc6ICdtZXRyaWNzLyRuYW1lJywKICAgICAgJ25hbWUnOiBuYW1lLAogICAgICAnZGVzY3JpcHRpb24nOiBkZXNjcmlwdGlvbiwKICAgICAgJ3ZhbHVlJzogdmFsdWUsCiAgICAgICdtaW4nOiBtaW4sCiAgICAgICdtYXgnOiBtYXgsCiAgICB9OwogICAgcmV0dXJuIG1hcDsKICB9Cn0KCi8vLyBBIGNoYW5naW5nIHZhbHVlLiBJbml0aWFsIHZhbHVlIGlzIDAuMC4KY2xhc3MgQ291bnRlciBleHRlbmRzIE1ldHJpYyB7CiAgQ291bnRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSA6IHN1cGVyKG5hbWUsIGRlc2NyaXB0aW9uKTsKCiAgZG91YmxlIF92YWx1ZSA9IDAuMDsKICBkb3VibGUgZ2V0IHZhbHVlID0+IF92YWx1ZTsKICBzZXQgdmFsdWUoZG91YmxlIHYpIHsKICAgIF92YWx1ZSA9IHY7CiAgfQoKICBNYXAgX3RvSlNPTigpIHsKICAgIHZhciBtYXAgPSB7CiAgICAgICd0eXBlJzogJ0NvdW50ZXInLAogICAgICAnaWQnOiAnbWV0cmljcy8kbmFtZScsCiAgICAgICduYW1lJzogbmFtZSwKICAgICAgJ2Rlc2NyaXB0aW9uJzogZGVzY3JpcHRpb24sCiAgICAgICd2YWx1ZSc6IHZhbHVlLAogICAgfTsKICAgIHJldHVybiBtYXA7CiAgfQp9CgpjbGFzcyBNZXRyaWNzIHsKICBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgTWV0cmljPiBfbWV0cmljcyA9IG5ldyBNYXA8U3RyaW5nLCBNZXRyaWM+KCk7CgogIC8vLyBSZWdpc3RlciBbTWV0cmljXXMgdG8gbWFrZSB0aGVtIHZpc2libGUgdG8gT2JzZXJ2YXRvcnkuCiAgc3RhdGljIHZvaWQgcmVnaXN0ZXIoTWV0cmljIG1ldHJpYykgewogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwobWV0cmljLCAnbWV0cmljJyk7CiAgICBpZiAoX21ldHJpY3NbbWV0cmljLm5hbWVdICE9IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ1JlZ2lzdGVyZWQgbWV0cmljcyBoYXZlIHVuaXF1ZSBuYW1lcycpOwogICAgfQogICAgX21ldHJpY3NbbWV0cmljLm5hbWVdID0gbWV0cmljOwogIH0KCiAgLy8vIERlcmVnaXN0ZXIgW01ldHJpY11zIHRvIG1ha2UgdGhlbSBub3QgdmlzaWJsZSB0byBPYnNlcnZhdG9yeS4KICBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyKE1ldHJpYyBtZXRyaWMpIHsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKG1ldHJpYywgJ21ldHJpYycpOwogICAgX21ldHJpY3MucmVtb3ZlKG1ldHJpYy5uYW1lKTsKICB9CgogIC8vIGlnbm9yZTogdW51c2VkX2VsZW1lbnQsIGNhbGxlZCBmcm9tIG5hdGl2ZSBjb2RlCiAgc3RhdGljIFN0cmluZyBfcHJpbnRNZXRyaWMoU3RyaW5nIGlkKSB7CiAgICB2YXIgbWV0cmljID0gX21ldHJpY3NbaWRdOwogICAgaWYgKG1ldHJpYyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIGpzb24uZW5jb2RlKG1ldHJpYy5fdG9KU09OKCkpOwogIH0KCiAgLy8gaWdub3JlOiB1bnVzZWRfZWxlbWVudCwgY2FsbGVkIGZyb20gbmF0aXZlIGNvZGUKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICFjb25zdCBib29sLmZyb21FbnZpcm9ubWVudCgiZGFydC52bS5wcm9kdWN0IikpCiAgc3RhdGljIFN0cmluZyBfcHJpbnRNZXRyaWNzKCkgewogICAgdmFyIG1ldHJpY3MgPSBbXTsKICAgIGZvciAodmFyIG1ldHJpYyBpbiBfbWV0cmljcy52YWx1ZXMpIHsKICAgICAgbWV0cmljcy5hZGQobWV0cmljLl90b0pTT04oKSk7CiAgICB9CiAgICB2YXIgbWFwID0gewogICAgICAndHlwZSc6ICdNZXRyaWNMaXN0JywKICAgICAgJ21ldHJpY3MnOiBtZXRyaWNzLAogICAgfTsKICAgIHJldHVybiBqc29uLmVuY29kZShtYXApOwogIH0KfQqAlwBOTjwBGAFIGVAjASoBFxQBSxYZATIqAgEzIgFMTE4fGB0VASQcASgwNwYEARECAUorHRQUAREeGBMPGg8GEAQBPSMsLEwSBAESEBcdFCIWEhIHEAQCASwfRwEXHhgQBAESEBkdFCIWBxAEAgEQSQE+KDIpRwYkBAFEKjIiBAE1Kh8aEwYqBAE1TCIWKiUGEBwaBx0EAgEcZGFydDpkZXZlbG9wZXIvcHJvZmlsZXIuZGFydDJvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvZGV2ZWxvcGVyL3NlcnZpY2UuZGFydI+BLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5kZXZlbG9wZXI7CgovLy8gU2VydmljZSBwcm90b2NvbCBpcyB0aGUgcHJvdG9jb2wgdGhhdCBhIGNsaWVudCBsaWtlIHRoZSBPYnNlcnZhdG9yeQovLy8gY291bGQgdXNlIHRvIGFjY2VzcyB0aGUgc2VydmljZXMgcHJvdmlkZWQgYnkgdGhlIERhcnQgVk0gZm9yCi8vLyBkZWJ1Z2dpbmcgYW5kIGluc3BlY3RpbmcgRGFydCBwcm9ncmFtcy4gVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgdGhlCi8vLyB2ZXJzaW9uIG51bWJlciBhbmQgVXJpIGZvciBhY2Nlc3NpbmcgdGhpcyBzZXJ2aWNlLgpjbGFzcyBTZXJ2aWNlUHJvdG9jb2xJbmZvIHsKICAvLy8gVGhlIG1ham9yIHZlcnNpb24gb2YgdGhlIHByb3RvY29sLiBJZiB0aGUgcnVubmluZyBEYXJ0IGVudmlyb25tZW50IGRvZXMKICAvLy8gbm90IHN1cHBvcnQgdGhlIHNlcnZpY2UgcHJvdG9jb2wsIHRoaXMgaXMgMC4KICBmaW5hbCBpbnQgbWFqb3JWZXJzaW9uID0gX2dldFNlcnZpY2VNYWpvclZlcnNpb24oKTsKCiAgLy8vIFRoZSBtaW5vciB2ZXJzaW9uIG9mIHRoZSBwcm90b2NvbC4gSWYgdGhlIHJ1bm5pbmcgRGFydCBlbnZpcm9ubWVudCBkb2VzCiAgLy8vIG5vdCBzdXBwb3J0IHRoZSBzZXJ2aWNlIHByb3RvY29sLCB0aGlzIGlzIDAuCiAgZmluYWwgaW50IG1pbm9yVmVyc2lvbiA9IF9nZXRTZXJ2aWNlTWlub3JWZXJzaW9uKCk7CgogIC8vLyBUaGUgVXJpIHRvIGFjY2VzcyB0aGUgc2VydmljZS4gSWYgdGhlIHdlYiBzZXJ2ZXIgaXMgbm90IHJ1bm5pbmcsIHRoaXMKICAvLy8gd2lsbCBiZSBudWxsLgogIGZpbmFsIFVyaSBzZXJ2ZXJVcmk7CgogIFNlcnZpY2VQcm90b2NvbEluZm8odGhpcy5zZXJ2ZXJVcmkpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBpZiAoc2VydmVyVXJpICE9IG51bGwpIHsKICAgICAgcmV0dXJuICdEYXJ0IFZNIFNlcnZpY2UgUHJvdG9jb2wgdiRtYWpvclZlcnNpb24uJG1pbm9yVmVyc2lvbiAnCiAgICAgICAgICAnbGlzdGVuaW5nIG9uICRzZXJ2ZXJVcmknOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICdEYXJ0IFZNIFNlcnZpY2UgUHJvdG9jb2wgdiRtYWpvclZlcnNpb24uJG1pbm9yVmVyc2lvbic7CiAgICB9CiAgfQp9CgovLy8gQWNjZXNzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZXJ2aWNlIHByb3RvY29sIGFuZCBjb250cm9sIHRoZSB3ZWIgc2VydmVyCi8vLyB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgc2VydmljZXMgcHJvdmlkZWQgYnkgdGhlIERhcnQgVk0gZm9yCi8vLyBkZWJ1Z2dpbmcgYW5kIGluc3BlY3RpbmcgRGFydCBwcm9ncmFtcy4KY2xhc3MgU2VydmljZSB7CiAgLy8vIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VydmljZSBwcm90b2NvbCAodmVyc2lvbiBudW1iZXIgYW5kCiAgLy8vIFVyaSB0byBhY2Nlc3MgdGhlIHNlcnZpY2UpLgogIHN0YXRpYyBGdXR1cmU8U2VydmljZVByb3RvY29sSW5mbz4gZ2V0SW5mbygpIGFzeW5jIHsKICAgIC8vIFBvcnQgdG8gcmVjZWl2ZSByZXNwb25zZSBmcm9tIHNlcnZpY2UgaXNvbGF0ZS4KICAgIGZpbmFsIFJhd1JlY2VpdmVQb3J0IHJlY2VpdmVQb3J0ID0gbmV3IFJhd1JlY2VpdmVQb3J0KCk7CiAgICBmaW5hbCBDb21wbGV0ZXI8VXJpPiB1cmlDb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPFVyaT4oKTsKICAgIHJlY2VpdmVQb3J0LmhhbmRsZXIgPSAoVXJpIHVyaSkgPT4gdXJpQ29tcGxldGVyLmNvbXBsZXRlKHVyaSk7CiAgICAvLyBSZXF1ZXN0IHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzZXJ2aWNlIGlzb2xhdGUuCiAgICBfZ2V0U2VydmVySW5mbyhyZWNlaXZlUG9ydC5zZW5kUG9ydCk7CiAgICAvLyBBd2FpdCB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmljZSBpc29sYXRlLgogICAgVXJpIHVyaSA9IGF3YWl0IHVyaUNvbXBsZXRlci5mdXR1cmU7CiAgICAvLyBDbG9zZSB0aGUgcG9ydC4KICAgIHJlY2VpdmVQb3J0LmNsb3NlKCk7CiAgICByZXR1cm4gbmV3IFNlcnZpY2VQcm90b2NvbEluZm8odXJpKTsKICB9CgogIC8vLyBDb250cm9sIHRoZSB3ZWIgc2VydmVyIHRoYXQgdGhlIHNlcnZpY2UgcHJvdG9jb2wgaXMgYWNjZXNzZWQgdGhyb3VnaC4KICAvLy8gVGhlIFtlbmFibGVdIGFyZ3VtZW50IG11c3QgYmUgYSBib29sZWFuIGFuZCBpcyB1c2VkIGFzIGEgdG9nZ2xlIHRvCiAgLy8vIGVuYWJsZSAodHJ1ZSkgb3IgZGlzYWJsZSAoZmFsc2UpIHRoZSB3ZWIgc2VydmVyIHNlcnZpY2luZyByZXF1ZXN0cy4KICBzdGF0aWMgRnV0dXJlPFNlcnZpY2VQcm90b2NvbEluZm8+IGNvbnRyb2xXZWJTZXJ2ZXIoCiAgICAgIHtib29sIGVuYWJsZTogZmFsc2V9KSBhc3luYyB7CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChlbmFibGUsICdlbmFibGUnKTsKICAgIC8vIFBvcnQgdG8gcmVjZWl2ZSByZXNwb25zZSBmcm9tIHNlcnZpY2UgaXNvbGF0ZS4KICAgIGZpbmFsIFJhd1JlY2VpdmVQb3J0IHJlY2VpdmVQb3J0ID0gbmV3IFJhd1JlY2VpdmVQb3J0KCk7CiAgICBmaW5hbCBDb21wbGV0ZXI8VXJpPiB1cmlDb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPFVyaT4oKTsKICAgIHJlY2VpdmVQb3J0LmhhbmRsZXIgPSAoVXJpIHVyaSkgPT4gdXJpQ29tcGxldGVyLmNvbXBsZXRlKHVyaSk7CiAgICAvLyBSZXF1ZXN0IHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzZXJ2aWNlIGlzb2xhdGUuCiAgICBfd2ViU2VydmVyQ29udHJvbChyZWNlaXZlUG9ydC5zZW5kUG9ydCwgZW5hYmxlKTsKICAgIC8vIEF3YWl0IHRoZSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2aWNlIGlzb2xhdGUuCiAgICBVcmkgdXJpID0gYXdhaXQgdXJpQ29tcGxldGVyLmZ1dHVyZTsKICAgIC8vIENsb3NlIHRoZSBwb3J0LgogICAgcmVjZWl2ZVBvcnQuY2xvc2UoKTsKICAgIHJldHVybiBuZXcgU2VydmljZVByb3RvY29sSW5mbyh1cmkpOwogIH0KCiAgLy8vIFJldHVybnMgYSBbU3RyaW5nXSB0b2tlbiByZXByZXNlbnRpbmcgdGhlIElEIG9mIFtpc29sYXRlXS4KICAvLy8KICAvLy8gUmV0dXJucyBudWxsIGlmIHRoZSBydW5uaW5nIERhcnQgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc2VydmljZQogIC8vLyBwcm90b2NvbC4KICBzdGF0aWMgU3RyaW5nIGdldElzb2xhdGVJRChJc29sYXRlIGlzb2xhdGUpIHsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKGlzb2xhdGUsICdpc29sYXRlJyk7CiAgICByZXR1cm4gX2dldElzb2xhdGVJREZyb21TZW5kUG9ydChpc29sYXRlLmNvbnRyb2xQb3J0KTsKICB9Cn0KCi8vLyBbc2VuZFBvcnRdIHdpbGwgcmVjZWl2ZSBhIFVyaSBvciBudWxsLgpleHRlcm5hbCB2b2lkIF9nZXRTZXJ2ZXJJbmZvKFNlbmRQb3J0IHNlbmRQb3J0KTsKCi8vLyBbc2VuZFBvcnRdIHdpbGwgcmVjZWl2ZSBhIFVyaSBvciBudWxsLgpleHRlcm5hbCB2b2lkIF93ZWJTZXJ2ZXJDb250cm9sKFNlbmRQb3J0IHNlbmRQb3J0LCBib29sIGVuYWJsZSk7CgovLy8gUmV0dXJucyB0aGUgbWFqb3IgdmVyc2lvbiBvZiB0aGUgc2VydmljZSBwcm90b2NvbC4KZXh0ZXJuYWwgaW50IF9nZXRTZXJ2aWNlTWFqb3JWZXJzaW9uKCk7CgovLy8gUmV0dXJucyB0aGUgbWlub3IgdmVyc2lvbiBvZiB0aGUgc2VydmljZSBwcm90b2NvbC4KZXh0ZXJuYWwgaW50IF9nZXRTZXJ2aWNlTWlub3JWZXJzaW9uKCk7CgovLy8gUmV0dXJucyB0aGUgc2VydmljZSBpZCBmb3IgdGhlIGlzb2xhdGUgdGhhdCBvd25zIFtzZW5kUG9ydF0uCmV4dGVybmFsIFN0cmluZyBfZ2V0SXNvbGF0ZUlERnJvbVNlbmRQb3J0KFNlbmRQb3J0IHNlbmRQb3J0KTsKZABOTjwBGAFIQUg3HE4zNgFOMzYBTBQXAScBFh1GJQ1GBgQCAU1FLBBFIjc2PT5DOSo0KRcZKQQBTElKNyQyNj0+Qzk1NCkXGSkEAUEGUBAwNDsEAgErMQErQQE3KAE3KAFBPgEbZGFydDpkZXZlbG9wZXIvc2VydmljZS5kYXJ0Lm9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvZGV2ZWxvcGVyLmRhcnSU9y8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gTm90ZTogdGhlIFZNIGNvbmNhdGVuYXRlcyBhbGwgcGF0Y2ggZmlsZXMgaW50byBhIHNpbmdsZSBwYXRjaCBmaWxlLiBUaGlzCi8vLyBmaWxlIGlzIHRoZSBmaXJzdCBwYXRjaCBpbiAiZGFydDpkZXZlbG9wZXIiIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgaW1wb3J0cwovLy8gdXNlZCBieSBwYXRjaGVzIG9mIHRoYXQgbGlicmFyeS4gV2UgcGxhbiB0byBjaGFuZ2UgdGhpcyB3aGVuIHdlIGhhdmUgYQovLy8gc2hhcmVkIGZyb250IGVuZCBhbmQgc2ltcGx5IHVzZSBwYXJ0cy4KCmltcG9ydCAiZGFydDpfaW50ZXJuYWwiIHNob3cgcGF0Y2g7CgppbXBvcnQgImRhcnQ6YXN5bmMiIHNob3cgRnV0dXJlLCBab25lOwoKaW1wb3J0ICJkYXJ0Omlzb2xhdGUiIHNob3cgU2VuZFBvcnQ7CgovLy8gVGhlc2UgYXJlIHRoZSBhZGRpdGlvbmFsIHBhcnRzIG9mIHRoaXMgcGF0Y2ggbGlicmFyeToKLy8gcGFydCAicHJvZmlsZXIuZGFydCIKLy8gcGFydCAidGltZWxpbmUuZGFydCIKCkBwYXRjaApib29sIGRlYnVnZ2VyKHtib29sIHdoZW46IHRydWUsIFN0cmluZyBtZXNzYWdlfSkgbmF0aXZlICJEZXZlbG9wZXJfZGVidWdnZXIiOwoKQHBhdGNoCk9iamVjdCBpbnNwZWN0KE9iamVjdCBvYmplY3QpIG5hdGl2ZSAiRGV2ZWxvcGVyX2luc3BlY3QiOwoKQHBhdGNoCnZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLAogICAge0RhdGVUaW1lIHRpbWUsCiAgICBpbnQgc2VxdWVuY2VOdW1iZXIsCiAgICBpbnQgbGV2ZWw6IDAsCiAgICBTdHJpbmcgbmFtZTogJycsCiAgICBab25lIHpvbmUsCiAgICBPYmplY3QgZXJyb3IsCiAgICBTdGFja1RyYWNlIHN0YWNrVHJhY2V9KSB7CiAgaWYgKG1lc3NhZ2UgaXMhIFN0cmluZykgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUobWVzc2FnZSwgIm1lc3NhZ2UiLCAiTXVzdCBiZSBhIFN0cmluZyIpOwogIH0KICB0aW1lID8/PSBuZXcgRGF0ZVRpbWUubm93KCk7CiAgaWYgKHRpbWUgaXMhIERhdGVUaW1lKSB7CiAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZSh0aW1lLCAidGltZSIsICJNdXN0IGJlIGEgRGF0ZVRpbWUiKTsKICB9CiAgaWYgKHNlcXVlbmNlTnVtYmVyID09IG51bGwpIHsKICAgIHNlcXVlbmNlTnVtYmVyID0gX25leHRTZXF1ZW5jZU51bWJlcisrOwogIH0gZWxzZSB7CiAgICBfbmV4dFNlcXVlbmNlTnVtYmVyID0gc2VxdWVuY2VOdW1iZXIgKyAxOwogIH0KICBfbG9nKG1lc3NhZ2UsIHRpbWUubWlsbGlzZWNvbmRzU2luY2VFcG9jaCwgc2VxdWVuY2VOdW1iZXIsIGxldmVsLCBuYW1lLCB6b25lLAogICAgICBlcnJvciwgc3RhY2tUcmFjZSk7Cn0KCmludCBfbmV4dFNlcXVlbmNlTnVtYmVyID0gMDsKCl9sb2coU3RyaW5nIG1lc3NhZ2UsIGludCB0aW1lc3RhbXAsIGludCBzZXF1ZW5jZU51bWJlciwgaW50IGxldmVsLCBTdHJpbmcgbmFtZSwKICAgIFpvbmUgem9uZSwgT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIG5hdGl2ZSAiRGV2ZWxvcGVyX2xvZyI7CgpAcGF0Y2gKdm9pZCBfcG9zdEV2ZW50KFN0cmluZyBldmVudEtpbmQsIFN0cmluZyBldmVudERhdGEpCiAgICBuYXRpdmUgIkRldmVsb3Blcl9wb3N0RXZlbnQiOwoKQHBhdGNoClNlcnZpY2VFeHRlbnNpb25IYW5kbGVyIF9sb29rdXBFeHRlbnNpb24oU3RyaW5nIG1ldGhvZCkKICAgIG5hdGl2ZSAiRGV2ZWxvcGVyX2xvb2t1cEV4dGVuc2lvbiI7CgpAcGF0Y2gKX3JlZ2lzdGVyRXh0ZW5zaW9uKFN0cmluZyBtZXRob2QsIFNlcnZpY2VFeHRlbnNpb25IYW5kbGVyIGhhbmRsZXIpCiAgICBuYXRpdmUgIkRldmVsb3Blcl9yZWdpc3RlckV4dGVuc2lvbiI7CgovLyBUaGlzIGNvZGUgaXMgb25seSBpbnZva2VkIHdoZW4gdGhlcmUgaXMgbm8gb3RoZXIgRGFydCBjb2RlIG9uIHRoZSBzdGFjay4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAhY29uc3QgYm9vbC5mcm9tRW52aXJvbm1lbnQoImRhcnQudm0ucHJvZHVjdCIpKQpfcnVuRXh0ZW5zaW9uKAogICAgU2VydmljZUV4dGVuc2lvbkhhbmRsZXIgaGFuZGxlciwKICAgIFN0cmluZyBtZXRob2QsCiAgICBMaXN0PFN0cmluZz4gcGFyYW1ldGVyS2V5cywKICAgIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJWYWx1ZXMsCiAgICBTZW5kUG9ydCByZXBseVBvcnQsCiAgICBPYmplY3QgaWQsCiAgICBib29sIHRyYWNlX3NlcnZpY2UpIHsKICB2YXIgcGFyYW1ldGVycyA9IDxTdHJpbmcsIFN0cmluZz57fTsKICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtZXRlcktleXMubGVuZ3RoOyBpKyspIHsKICAgIHBhcmFtZXRlcnNbcGFyYW1ldGVyS2V5c1tpXV0gPSBwYXJhbWV0ZXJWYWx1ZXNbaV07CiAgfQogIHZhciByZXNwb25zZTsKICB0cnkgewogICAgcmVzcG9uc2UgPSBoYW5kbGVyKG1ldGhvZCwgcGFyYW1ldGVycyk7CiAgfSBjYXRjaCAoZSwgc3QpIHsKICAgIHZhciBlcnJvckRldGFpbHMgPSAoc3QgPT0gbnVsbCkgPyAnJGUnIDogJyRlXG4kc3QnOwogICAgcmVzcG9uc2UgPSBuZXcgU2VydmljZUV4dGVuc2lvblJlc3BvbnNlLmVycm9yKAogICAgICAgIFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZS5rRXh0ZW5zaW9uRXJyb3IsIGVycm9yRGV0YWlscyk7CiAgICBfcG9zdFJlc3BvbnNlKHJlcGx5UG9ydCwgaWQsIHJlc3BvbnNlLCB0cmFjZV9zZXJ2aWNlKTsKICAgIHJldHVybjsKICB9CiAgaWYgKHJlc3BvbnNlIGlzISBGdXR1cmUpIHsKICAgIHJlc3BvbnNlID0gbmV3IFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZS5lcnJvcigKICAgICAgICBTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2Uua0V4dGVuc2lvbkVycm9yLAogICAgICAgICJFeHRlbnNpb24gaGFuZGxlciBtdXN0IHJldHVybiBhIEZ1dHVyZSIpOwogICAgX3Bvc3RSZXNwb25zZShyZXBseVBvcnQsIGlkLCByZXNwb25zZSwgdHJhY2Vfc2VydmljZSk7CiAgICByZXR1cm47CiAgfQogIHJlc3BvbnNlLmNhdGNoRXJyb3IoKGUsIHN0KSB7CiAgICAvLyBDYXRjaCBhbnkgZXJyb3JzIGVhZ2VybHkgYW5kIHdyYXAgdGhlbSBpbiBhIFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZS4KICAgIHZhciBlcnJvckRldGFpbHMgPSAoc3QgPT0gbnVsbCkgPyAnJGUnIDogJyRlXG4kc3QnOwogICAgcmV0dXJuIG5ldyBTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2UuZXJyb3IoCiAgICAgICAgU2VydmljZUV4dGVuc2lvblJlc3BvbnNlLmtFeHRlbnNpb25FcnJvciwgZXJyb3JEZXRhaWxzKTsKICB9KS50aGVuKChyZXNwb25zZSkgewogICAgLy8gUG9zdCB0aGUgdmFsaWQgcmVzcG9uc2Ugb3IgdGhlIHdyYXBwZWQgZXJyb3IgYWZ0ZXIgdmVyaWZ5aW5nIHRoYXQKICAgIC8vIHRoZSByZXNwb25zZSBpcyBhIFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZS4KICAgIGlmIChyZXNwb25zZSBpcyEgU2VydmljZUV4dGVuc2lvblJlc3BvbnNlKSB7CiAgICAgIHJlc3BvbnNlID0gbmV3IFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZS5lcnJvcigKICAgICAgICAgIFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZS5rRXh0ZW5zaW9uRXJyb3IsCiAgICAgICAgICAiRXh0ZW5zaW9uIGhhbmRsZXIgbXVzdCBjb21wbGV0ZSB0byBhIFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZSIpOwogICAgfQogICAgX3Bvc3RSZXNwb25zZShyZXBseVBvcnQsIGlkLCByZXNwb25zZSwgdHJhY2Vfc2VydmljZSk7CiAgfSkuY2F0Y2hFcnJvcigoZSwgc3QpIHsKICAgIC8vIFdlIGRvIG5vdCBleHBlY3QgYW55IGVycm9ycyB0byBvY2N1ciBpbiB0aGUgLnRoZW4gb3IgLmNhdGNoRXJyb3IgYmxvY2tzCiAgICAvLyBidXQsIHN1cHByZXNzIHRoZW0ganVzdCBpbiBjYXNlLgogIH0pOwp9CgovLyBUaGlzIGNvZGUgaXMgb25seSBpbnZva2VkIGJ5IF9ydW5FeHRlbnNpb24uCl9wb3N0UmVzcG9uc2UoU2VuZFBvcnQgcmVwbHlQb3J0LCBPYmplY3QgaWQsIFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZSByZXNwb25zZSwKICAgIGJvb2wgdHJhY2Vfc2VydmljZSkgewogIGFzc2VydChyZXBseVBvcnQgIT0gbnVsbCk7CiAgaWYgKGlkID09IG51bGwpIHsKICAgIGlmICh0cmFjZV9zZXJ2aWNlKSB7CiAgICAgIHByaW50KCJ2bS1zZXJ2aWNlOiBwb3N0aW5nIG5vIHJlc3BvbnNlIGZvciByZXF1ZXN0Iik7CiAgICB9CiAgICAvLyBObyBpZCAtPiBubyByZXNwb25zZS4KICAgIHJlcGx5UG9ydC5zZW5kKG51bGwpOwogICAgcmV0dXJuOwogIH0KICBhc3NlcnQoaWQgIT0gbnVsbCk7CiAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogIHNiLndyaXRlKCd7Impzb25ycGMiOiIyLjAiLCcpOwogIGlmIChyZXNwb25zZS5faXNFcnJvcigpKSB7CiAgICBpZiAodHJhY2Vfc2VydmljZSkgewogICAgICBwcmludCgidm0tc2VydmljZTogcG9zdGluZyBlcnJvciByZXNwb25zZSBmb3IgcmVxdWVzdCAkaWQiKTsKICAgIH0KICAgIHNiLndyaXRlKCciZXJyb3IiOicpOwogIH0gZWxzZSB7CiAgICBpZiAodHJhY2Vfc2VydmljZSkgewogICAgICBwcmludCgidm0tc2VydmljZTogcG9zdGluZyByZXNwb25zZSBmb3IgcmVxdWVzdCAkaWQiKTsKICAgIH0KICAgIHNiLndyaXRlKCcicmVzdWx0IjonKTsKICB9CiAgc2Iud3JpdGUoJyR7cmVzcG9uc2UuX3RvU3RyaW5nKCl9LCcpOwogIGlmIChpZCBpcyBTdHJpbmcpIHsKICAgIHNiLndyaXRlKCciaWQiOiIkaWQifScpOwogIH0gZWxzZSB7CiAgICBzYi53cml0ZSgnImlkIjokaWR9Jyk7CiAgfQogIHJlcGx5UG9ydC5zZW5kKHNiLnRvU3RyaW5nKCkpOwp9CgpAcGF0Y2gKaW50IF9nZXRTZXJ2aWNlTWFqb3JWZXJzaW9uKCkgbmF0aXZlICJEZXZlbG9wZXJfZ2V0U2VydmljZU1ham9yVmVyc2lvbiI7CgpAcGF0Y2gKaW50IF9nZXRTZXJ2aWNlTWlub3JWZXJzaW9uKCkgbmF0aXZlICJEZXZlbG9wZXJfZ2V0U2VydmljZU1pbm9yVmVyc2lvbiI7CgpAcGF0Y2gKdm9pZCBfZ2V0U2VydmVySW5mbyhTZW5kUG9ydCBzZW5kUG9ydCkgbmF0aXZlICJEZXZlbG9wZXJfZ2V0U2VydmVySW5mbyI7CgpAcGF0Y2gKdm9pZCBfd2ViU2VydmVyQ29udHJvbChTZW5kUG9ydCBzZW5kUG9ydCwgYm9vbCBlbmFibGUpCiAgICBuYXRpdmUgIkRldmVsb3Blcl93ZWJTZXJ2ZXJDb250cm9sIjsKCkBwYXRjaApTdHJpbmcgX2dldElzb2xhdGVJREZyb21TZW5kUG9ydChTZW5kUG9ydCBzZW5kUG9ydCkKICAgIG5hdGl2ZSAiRGV2ZWxvcGVyX2dldElzb2xhdGVJREZyb21TZW5kUG9ydCI7CoCrAE5OPAFNT0srASQBJwElAToYGAEHTgEHOgEHGRQYEhUPEh4cSwQfG0cEICwLLgRQGgIBHQFQTAEHNCIBBzgoAQdDKgFMSg8lEyAiGA8aJzM3BBAILBQ4M0E7DAQdMzIzOwwEIE04L0EXSTMxNTRMBjsaTygGAgEvUBodFBk8Bh0aDAQWKCEdGUMGGgsZPQYbBCgWHQsbBCECAQdJAQdJAQdJAQc3KQEHNDEBI2RhcnQ6ZGV2ZWxvcGVyLXBhdGNoL2RldmVsb3Blci5kYXJ0LW9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvdGltZWxpbmUuZGFydIRzLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImRldmVsb3Blci5kYXJ0IjsKCkBwYXRjaApib29sIF9pc0RhcnRTdHJlYW1FbmFibGVkKCkgbmF0aXZlICJUaW1lbGluZV9pc0RhcnRTdHJlYW1FbmFibGVkIjsKCkBwYXRjaAppbnQgX2dldFRyYWNlQ2xvY2soKSBuYXRpdmUgIlRpbWVsaW5lX2dldFRyYWNlQ2xvY2siOwoKQHBhdGNoCmludCBfZ2V0VGhyZWFkQ3B1Q2xvY2soKSBuYXRpdmUgIlRpbWVsaW5lX2dldFRocmVhZENwdUNsb2NrIjsKCkBwYXRjaAppbnQgX2dldE5leHRBc3luY0lkKCkgbmF0aXZlICJUaW1lbGluZV9nZXROZXh0QXN5bmNJZCI7CgpAcGF0Y2gKdm9pZCBfcmVwb3J0VGFza0V2ZW50KGludCBzdGFydCwgaW50IHRhc2tJZCwgU3RyaW5nIHBoYXNlLCBTdHJpbmcgY2F0ZWdvcnksCiAgICBTdHJpbmcgbmFtZSwgU3RyaW5nIGFyZ3VtZW50c0FzSnNvbikgbmF0aXZlICJUaW1lbGluZV9yZXBvcnRUYXNrRXZlbnQiOwoKQHBhdGNoCnZvaWQgX3JlcG9ydENvbXBsZXRlRXZlbnQoaW50IHN0YXJ0LCBpbnQgc3RhcnRDcHUsIFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG5hbWUsCiAgICBTdHJpbmcgYXJndW1lbnRzQXNKc29uKSBuYXRpdmUgIlRpbWVsaW5lX3JlcG9ydENvbXBsZXRlRXZlbnQiOwoKQHBhdGNoCnZvaWQgX3JlcG9ydEZsb3dFdmVudChpbnQgc3RhcnQsIGludCBzdGFydENwdSwgU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbmFtZSwKICAgIGludCB0eXBlLCBpbnQgaWQsIFN0cmluZyBhcmd1bWVudHNBc0pzb24pIG5hdGl2ZSAiVGltZWxpbmVfcmVwb3J0Rmxvd0V2ZW50IjsKCkBwYXRjaAp2b2lkIF9yZXBvcnRJbnN0YW50RXZlbnQoaW50IHN0YXJ0LCBTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBuYW1lLAogICAgU3RyaW5nIGFyZ3VtZW50c0FzSnNvbikgbmF0aXZlICJUaW1lbGluZV9yZXBvcnRJbnN0YW50RXZlbnQiOwojAE5OPAEdAQdDAQc2AQc+AQc4AQdMTAEHUUMBB01RAQdCQgEiZGFydDpkZXZlbG9wZXItcGF0Y2gvdGltZWxpbmUuZGFydChvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvZmZpL2ZmaS5kYXJ0jnMvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCgovLy8ge0BjYXRlZ29yeSBWTX0KLy8vIHtAbm9kb2N9CmxpYnJhcnkgZGFydC5mZmk7CgpwYXJ0ICJuYXRpdmVfdHlwZS5kYXJ0IjsKcGFydCAiYW5ub3RhdGlvbnMuZGFydCI7CnBhcnQgImR5bmFtaWNfbGlicmFyeS5kYXJ0IjsKCi8vLyBBbGxvY2F0ZSBbY291bnRdIGVsZW1lbnRzIG9mIHR5cGUgW1RdIG9uIHRoZSBDIGhlYXAgd2l0aCBtYWxsb2MoKSBhbmQgcmV0dXJuCi8vLyBhIHBvaW50ZXIgdG8gdGhlIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkuCi8vLwovLy8gTm90ZSB0aGF0IHRoZSBtZW1vcnkgYXJlIHVuaW5pdGlhbGl6ZWQuCi8vLwovLy8gVE9ETyhkYWNvaGFya2VzKTogY2hhbmdlIHNpZ25hdHVyZSB0byBUIGFsbG9jYXRlPFQgZXh0ZW5kcyBQb2ludGVyPigpID8KLy8vIFRoaXMgd291bGQgZW5hYmxlIHVzIHRvIGFsbG9jYXRlIHN0cnVjdHMuIEhvd2V2ZXIgaG93IGRvIHdlIGtub3cgdGhlIHNpemUgb2YKLy8vIHN0cnVjdHM/IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8zNTc4MgpleHRlcm5hbCBQb2ludGVyPFQ+IGFsbG9jYXRlPFQgZXh0ZW5kcyBOYXRpdmVUeXBlPih7aW50IGNvdW50OiAxfSk7CgovLy8gQ29uc3RydWN0aW9uIGZyb20gcmF3IHZhbHVlCmV4dGVybmFsIFQgZnJvbUFkZHJlc3M8VCBleHRlbmRzIFBvaW50ZXI+KGludCBwdHIpOwoKLy8vIG51bWJlciBvZiBieXRlcyB1c2VkIGJ5IG5hdGl2ZSB0eXBlIFQKZXh0ZXJuYWwgaW50IHNpemVPZjxUIGV4dGVuZHMgTmF0aXZlVHlwZT4oKTsKCi8vLyBDb252ZXJ0IERhcnQgZnVuY3Rpb24gdG8gYSBDIGZ1bmN0aW9uIHBvaW50ZXIsIGF1dG9tYXRpY2FsbHkgbWFyc2hhbGxpbmcKLy8vIHRoZSBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZQovLy8KLy8vIE5vdGU6IHRoaXMgaXMgbm90IGltcGxlbWVudGVkLCBhbHdheXMgcmV0dXJucyBQb2ludGVyIHdpdGggYWRkcmVzcyAwLgovLy8KLy8vIFRPRE8oZGFjb2hhcmtlcyk6IEltcGxlbWVudCB0aGlzIGZlYXR1cmUuCi8vLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMzU3NjEKZXh0ZXJuYWwgUG9pbnRlcjxOYXRpdmVGdW5jdGlvbjxUPj4gZnJvbUZ1bmN0aW9uPFQgZXh0ZW5kcyBGdW5jdGlvbj4oCiAgICBARGFydFJlcHJlc2VudGF0aW9uT2YoIlQiKSBGdW5jdGlvbiBmKTsKCi8qCi8vLyBUT0RPKGRhY29oYXJrZXMpOiBJbXBsZW1lbnQgdGhpcyBmZWF0dXJlLgovLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzM1NzcwCi8vLyBSZXR1cm4gYSBwb2ludGVyIG9iamVjdCB0aGF0IGhhcyBhIGZpbmFsaXplciBhdHRhY2hlZCB0byBpdC4gV2hlbiB0aGlzCi8vLyBwb2ludGVyIG9iamVjdCBpcyBjb2xsZWN0ZWQgYnkgR0MgdGhlIGdpdmVuIGZpbmFsaXplciBpcyBpbnZva2VkLgovLy8KLy8vIE5vdGU6IHRoZSBwb2ludGVyIG9iamVjdCBwYXNzZWQgdG8gdGhlIGZpbmFsaXplciBpcyBub3QgdGhlIHNhbWUgYXMKLy8vIHRoZSBwb2ludGVyIG9iamVjdCB0aGF0IGlzIHJldHVybmVkIGZyb20gW2ZpbmFsaXphYmxlXSAtIGl0IHBvaW50cwovLy8gdG8gdGhlIHNhbWUgbWVtb3J5IHJlZ2lvbiBidXQgaGFzIGRpZmZlcmVudCBpZGVudGl0eS4KZXh0ZXJuYWwgUG9pbnRlcjxUPiBmaW5hbGl6YWJsZTxUIGV4dGVuZHMgTmF0aXZlVHlwZT4oCiAgICBQb2ludGVyPFQ+IHAsIHZvaWQgZmluYWxpemVyKFBvaW50ZXI8VD4gcHRyKSk7CiovCgovLy8gUmVwcmVzZW50cyBhIHBvaW50ZXIgaW50byB0aGUgbmF0aXZlIEMgbWVtb3J5LgpjbGFzcyBQb2ludGVyPFQgZXh0ZW5kcyBOYXRpdmVUeXBlPiBleHRlbmRzIE5hdGl2ZVR5cGUgewogIGNvbnN0IFBvaW50ZXIoKTsKCiAgLy8vIFN0b3JlIGEgRGFydCB2YWx1ZSBpbnRvIHRoaXMgbG9jYXRpb24uCiAgLy8vCiAgLy8vIFRoZSBbdmFsdWVdIGlzIGF1dG9tYXRpY2FsbHkgbWFyc2hhbGxlZCBpbnRvIGl0cyBDIHJlcHJlc2VudGF0aW9uLgogIC8vLyBOb3RlIHRoYXQgaW50cyB3aGljaCBkbyBub3QgZml0IGluIFtUXSBhcmUgdHJ1bmNhdGVkIGFuZCBzaWduIGV4dGVuZGVkLAogIC8vLyBhbmQgZG91YmxlcyBzdG9yZWQgaW50byBQb2ludGVyPFtGbG9hdF0+IGxvc2UgcHJlY2lzaW9uLgogIGV4dGVybmFsIHZvaWQgc3RvcmUoQERhcnRSZXByZXNlbnRhdGlvbk9mKCJUIikgT2JqZWN0IHZhbHVlKTsKCiAgLy8vIExvYWQgYSBEYXJ0IHZhbHVlIGZyb20gdGhpcyBsb2NhdGlvbi4KICAvLy8KICAvLy8gVGhlIHZhbHVlIGlzIGF1dG9tYXRpY2FsbHkgdW5tYXJzaGFsbGVkIGZyb20gaXRzIEMgcmVwcmVzZW50YXRpb24uCiAgZXh0ZXJuYWwgUiBsb2FkPEBEYXJ0UmVwcmVzZW50YXRpb25PZigiVCIpIFI+KCk7CgogIC8vLyBBY2Nlc3MgdG8gdGhlIHJhdyBwb2ludGVyIHZhbHVlLgogIGV4dGVybmFsIGludCBnZXQgYWRkcmVzczsKCiAgLy8vIFBvaW50ZXIgYXJpdGhtZXRpYyAodGFrZXMgZWxlbWVudCBzaXplIGludG8gYWNjb3VudCkuCiAgZXh0ZXJuYWwgUG9pbnRlcjxUPiBlbGVtZW50QXQoaW50IGluZGV4KTsKCiAgLy8vIFBvaW50ZXIgYXJpdGhtZXRpYyAoYnl0ZSBvZmZzZXQpLgogIC8vLwogIC8vLyBUT0RPKGRhY29oYXJrZXMpOiByZW1vdmUgdGhpcz8KICAvLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzM1ODgzCiAgZXh0ZXJuYWwgUG9pbnRlcjxUPiBvZmZzZXRCeShpbnQgb2Zmc2V0SW5CeXRlcyk7CgogIC8vLyBDYXN0IFBvaW50ZXI8VD4gdG8gYSAoc3VidHlwZSBvZikgUG9pbnRlcjxWPi4KICBleHRlcm5hbCBVIGNhc3Q8VSBleHRlbmRzIFBvaW50ZXI+KCk7CgogIC8vLyBDb252ZXJ0IHRvIERhcnQgZnVuY3Rpb24sIGF1dG9tYXRpY2FsbHkgbWFyc2hhbGxpbmcgdGhlIGFyZ3VtZW50cwogIC8vLyBhbmQgcmV0dXJuIHZhbHVlLgogIC8vLwogIC8vLyBDYW4gb25seSBiZSBjYWxsZWQgb24gW1BvaW50ZXJdPFtOYXRpdmVGdW5jdGlvbl0+LgogIGV4dGVybmFsIFIgYXNGdW5jdGlvbjxARGFydFJlcHJlc2VudGF0aW9uT2YoIlQiKSBSIGV4dGVuZHMgRnVuY3Rpb24+KCk7CgogIC8vLyBGcmVlIG1lbW9yeSBvbiB0aGUgQyBoZWFwIHBvaW50ZWQgdG8gYnkgdGhpcyBwb2ludGVyIHdpdGggZnJlZSgpLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgdGhpcyB6ZXJvcyBvdXQgdGhlIGFkZHJlc3MuCiAgZXh0ZXJuYWwgdm9pZCBmcmVlKCk7CgogIC8vLyBFcXVhbGl0eSBmb3IgUG9pbnRlcnMgb25seSBkZXBlbmRzIG9uIHRoZWlyIGFkZHJlc3MuCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKG90aGVyID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBhZGRyZXNzID09IG90aGVyLmFkZHJlc3M7CiAgfQoKICAvLy8gVGhlIGhhc2ggY29kZSBmb3IgYSBQb2ludGVyIG9ubHkgZGVwZW5kcyBvbiBpdHMgYWRkcmVzcy4KICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIHJldHVybiBhZGRyZXNzLmhhc2hDb2RlOwogIH0KfQpqAE5OOwETDRIBGRkdAVEtBCwETFE7RAEgNAEqLQFNIwRKBC4yRiwBAy4yS0YESEc6NzMDATM5EwEtBklOP0ABLAZJMwEnHAE8LAEoBiU0MwE0KAFIGAY5SgFIBiwYATscJSUEAT8VHQQCAQhkYXJ0OmZmaS5vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2ZmaV9wYXRjaC5kYXJ0hokvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICJkYXJ0Ol9pbnRlcm5hbCIgc2hvdyBwYXRjaDsKCkBwYXRjaApQb2ludGVyPFQ+IGFsbG9jYXRlPFQgZXh0ZW5kcyBOYXRpdmVUeXBlPih7aW50IGNvdW50OiAxfSkgbmF0aXZlICJGZmlfYWxsb2NhdGUiOwoKQHBhdGNoClQgZnJvbUFkZHJlc3M8VCBleHRlbmRzIFBvaW50ZXI+KGludCBwdHIpIG5hdGl2ZSAiRmZpX2Zyb21BZGRyZXNzIjsKCkBwYXRjaAppbnQgc2l6ZU9mPFQgZXh0ZW5kcyBOYXRpdmVUeXBlPigpIG5hdGl2ZSAiRmZpX3NpemVPZiI7CgpAcGF0Y2gKUG9pbnRlcjxOYXRpdmVGdW5jdGlvbjxUPj4gZnJvbUZ1bmN0aW9uPFQgZXh0ZW5kcyBGdW5jdGlvbj4oCiAgICBARGFydFJlcHJlc2VudGF0aW9uT2YoIlQiKSBGdW5jdGlvbiBmKSBuYXRpdmUgIkZmaV9mcm9tRnVuY3Rpb24iOwoKQHBhdGNoCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgUG9pbnRlcjxUIGV4dGVuZHMgTmF0aXZlVHlwZT4gewogIEBwYXRjaAogIHZvaWQgc3RvcmUoT2JqZWN0IHZhbHVlKSBuYXRpdmUgIkZmaV9zdG9yZSI7CgogIEBwYXRjaAogIFIgbG9hZDxSPigpIG5hdGl2ZSAiRmZpX2xvYWQiOwoKICBAcGF0Y2gKICBpbnQgZ2V0IGFkZHJlc3MgbmF0aXZlICJGZmlfYWRkcmVzcyI7CgogIC8vIE5vdGUgdGhpcyBjb3VsZCBhbHNvIGJlIGltcGxtZW50ZWQgd2l0aG91dCBhbiBleHRyYSBuYXRpdmUgYXMgb2Zmc2V0QnkKICAvLyAoZWxlbWVudFNpemUoKSppbmRleCkuIFRoaXMgd291bGQgYmUgMiBuYXRpdmUgY2FsbHMgcmF0aGVyIHRoYW4gb25lLiBXaGF0CiAgLy8gd291bGQgYmUgYmV0dGVyPwogIEBwYXRjaAogIFBvaW50ZXI8VD4gZWxlbWVudEF0KGludCBpbmRleCkgbmF0aXZlICJGZmlfZWxlbWVudEF0IjsKCiAgLy8gTm90ZSB0aGlzIGNvdWxkIGFsc28gYmUgaW1wbG1lbnRlZCB3aXRob3V0IGFuIGV4dHJhICBuYXRpdmUgYXMKICAvLyBmcm9tQWRkcmVzcyhhZGRyZXNzKS4gVGhpcyB3b3VsZCBiZSAyIG5hdGl2ZSBjYWxscyByYXRoZXIgdGhhbiBvbmUuCiAgLy8gV2hhdCB3b3VsZCBiZSBiZXR0ZXI/CiAgQHBhdGNoCiAgUG9pbnRlcjxUPiBvZmZzZXRCeShpbnQgb2Zmc2V0SW5CeXRlcykgbmF0aXZlICJGZmlfb2Zmc2V0QnkiOwoKICAvLyBOb3RlIHRoaXMgY291bGQgYWxzbyBiZSBpbXBsZW1lbnRlZCB3aXRob3V0IGFuIGV4dHJhIG5hdGl2ZSBhcwogIC8vIGZyb21BZGRyZXNzKGFkZHJlc3MpLiBUaGlzIHdvdWxkIGJlIDIgbmF0aXZlIGNhbGxzIHJhdGhlciB0aGFuIG9uZS4KICAvLyBXaGF0IHdvdWxkIGJlIGJldHRlcj8KICBAcGF0Y2gKICBVIGNhc3Q8VSBleHRlbmRzIFBvaW50ZXI+KCkgbmF0aXZlICJGZmlfY2FzdCI7CgogIEBwYXRjaAogIFIgYXNGdW5jdGlvbjxSIGV4dGVuZHMgRnVuY3Rpb24+KCkgbmF0aXZlICJGZmlfYXNGdW5jdGlvbiI7CgogIEBwYXRjaAogIHZvaWQgZnJlZSgpIG5hdGl2ZSAiRmZpX2ZyZWUiOwp9CjkATk48ASQBB1EBB0QBBzgBBz1GAQcaJgkvAQkhAQkoAUxPFgk6AURJGwlAAURJGwkxAQk+AQkhAgEdZGFydDpmZmktcGF0Y2gvZmZpX3BhdGNoLmRhcnQwb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2ZmaS9uYXRpdmVfdHlwZS5kYXJ0jsEvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmZmaTsKCi8vLyBbTmF0aXZlVHlwZV0ncyBzdWJ0eXBlcyByZXByZXNlbnQgYSBuYXRpdmUgdHlwZSBpbiBDLgovLy8KLy8vIFtOYXRpdmVUeXBlXSdzIHN1YnR5cGVzIGFyZSBub3QgY29uc3RydWN0aWJsZSBpbiB0aGUgRGFydCBjb2RlIGFuZCBzZXJ2ZQovLy8gcHVyZWx5IGFzIG1hcmtlcnMgaW4gdHlwZSBzaWduYXR1cmVzLgpjbGFzcyBOYXRpdmVUeXBlIHsKICBjb25zdCBOYXRpdmVUeXBlKCk7Cn0KCi8vLyBbX05hdGl2ZUludGVnZXJdJ3Mgc3VidHlwZXMgcmVwcmVzZW50IGEgbmF0aXZlIGludGVnZXIgaW4gQy4KLy8vCi8vLyBbX05hdGl2ZUludGVnZXJdJ3Mgc3VidHlwZXMgYXJlIG5vdCBjb25zdHJ1Y3RpYmxlIGluIHRoZSBEYXJ0IGNvZGUgYW5kIHNlcnZlCi8vLyBwdXJlbHkgYXMgbWFya2VycyBpbiB0eXBlIHNpZ25hdHVyZXMuCmNsYXNzIF9OYXRpdmVJbnRlZ2VyIGV4dGVuZHMgTmF0aXZlVHlwZSB7CiAgY29uc3QgX05hdGl2ZUludGVnZXIoKTsKfQoKLy8vIFtfTmF0aXZlRG91YmxlXSdzIHN1YnR5cGVzIHJlcHJlc2VudCBhIG5hdGl2ZSBmbG9hdCBvciBkb3VibGUgaW4gQy4KLy8vCi8vLyBbX05hdGl2ZURvdWJsZV0ncyBzdWJ0eXBlcyBhcmUgbm90IGNvbnN0cnVjdGlibGUgaW4gdGhlIERhcnQgY29kZSBhbmQgc2VydmUKLy8vIHB1cmVseSBhcyBtYXJrZXJzIGluIHR5cGUgc2lnbmF0dXJlcy4KY2xhc3MgX05hdGl2ZURvdWJsZSBleHRlbmRzIE5hdGl2ZVR5cGUgewogIGNvbnN0IF9OYXRpdmVEb3VibGUoKTsKfQoKLy8vIFJlcHJlc2VudHMgYSBuYXRpdmUgc2lnbmVkIDggYml0IGludGVnZXIgaW4gQy4KLy8vCi8vLyBbSW50OF0gaXMgbm90IGNvbnN0cnVjdGlibGUgaW4gdGhlIERhcnQgY29kZSBhbmQgc2VydmVzIHB1cmVseSBhcyBtYXJrZXIgaW4KLy8vIHR5cGUgc2lnbmF0dXJlcy4KY2xhc3MgSW50OCBleHRlbmRzIF9OYXRpdmVJbnRlZ2VyIHsKICBjb25zdCBJbnQ4KCk7Cn0KCi8vLyBSZXByZXNlbnRzIGEgbmF0aXZlIHNpZ25lZCAxNiBiaXQgaW50ZWdlciBpbiBDLgovLy8KLy8vIFtJbnQxNl0gaXMgbm90IGNvbnN0cnVjdGlibGUgaW4gdGhlIERhcnQgY29kZSBhbmQgc2VydmVzIHB1cmVseSBhcyBtYXJrZXIgaW4KLy8vIHR5cGUgc2lnbmF0dXJlcy4KY2xhc3MgSW50MTYgZXh0ZW5kcyBfTmF0aXZlSW50ZWdlciB7CiAgY29uc3QgSW50MTYoKTsKfQoKLy8vIFJlcHJlc2VudHMgYSBuYXRpdmUgc2lnbmVkIDMyIGJpdCBpbnRlZ2VyIGluIEMuCi8vLwovLy8gW0ludDMyXSBpcyBub3QgY29uc3RydWN0aWJsZSBpbiB0aGUgRGFydCBjb2RlIGFuZCBzZXJ2ZXMgcHVyZWx5IGFzIG1hcmtlciBpbgovLy8gdHlwZSBzaWduYXR1cmVzLgpjbGFzcyBJbnQzMiBleHRlbmRzIF9OYXRpdmVJbnRlZ2VyIHsKICBjb25zdCBJbnQzMigpOwp9CgovLy8gUmVwcmVzZW50cyBhIG5hdGl2ZSBzaWduZWQgNjQgYml0IGludGVnZXIgaW4gQy4KLy8vCi8vLyBbSW50NjRdIGlzIG5vdCBjb25zdHJ1Y3RpYmxlIGluIHRoZSBEYXJ0IGNvZGUgYW5kIHNlcnZlcyBwdXJlbHkgYXMgbWFya2VyIGluCi8vLyB0eXBlIHNpZ25hdHVyZXMuCmNsYXNzIEludDY0IGV4dGVuZHMgX05hdGl2ZUludGVnZXIgewogIGNvbnN0IEludDY0KCk7Cn0KCi8vLyBSZXByZXNlbnRzIGEgbmF0aXZlIHVuc2lnbmVkIDggYml0IGludGVnZXIgaW4gQy4KLy8vCi8vLyBbVWludDhdIGlzIG5vdCBjb25zdHJ1Y3RpYmxlIGluIHRoZSBEYXJ0IGNvZGUgYW5kIHNlcnZlcyBwdXJlbHkgYXMgbWFya2VyIGluCi8vLyB0eXBlIHNpZ25hdHVyZXMuCmNsYXNzIFVpbnQ4IGV4dGVuZHMgX05hdGl2ZUludGVnZXIgewogIGNvbnN0IFVpbnQ4KCk7Cn0KCi8vLyBSZXByZXNlbnRzIGEgbmF0aXZlIHVuc2lnbmVkIDE2IGJpdCBpbnRlZ2VyIGluIEMuCi8vLwovLy8gW1VpbnQxNl0gaXMgbm90IGNvbnN0cnVjdGlibGUgaW4gdGhlIERhcnQgY29kZSBhbmQgc2VydmVzIHB1cmVseSBhcyBtYXJrZXIKLy8vIGluIHR5cGUgc2lnbmF0dXJlcy4KY2xhc3MgVWludDE2IGV4dGVuZHMgX05hdGl2ZUludGVnZXIgewogIGNvbnN0IFVpbnQxNigpOwp9CgovLy8gUmVwcmVzZW50cyBhIG5hdGl2ZSB1bnNpZ25lZCAzMiBiaXQgaW50ZWdlciBpbiBDLgovLy8KLy8vIFtVaW50MzJdIGlzIG5vdCBjb25zdHJ1Y3RpYmxlIGluIHRoZSBEYXJ0IGNvZGUgYW5kIHNlcnZlcyBwdXJlbHkgYXMgbWFya2VyCi8vLyBpbiB0eXBlIHNpZ25hdHVyZXMuCmNsYXNzIFVpbnQzMiBleHRlbmRzIF9OYXRpdmVJbnRlZ2VyIHsKICBjb25zdCBVaW50MzIoKTsKfQoKLy8vIFJlcHJlc2VudHMgYSBuYXRpdmUgdW5zaWduZWQgNjQgYml0IGludGVnZXIgaW4gQy4KLy8vCi8vLyBbVWludDY0XSBpcyBub3QgY29uc3RydWN0aWJsZSBpbiB0aGUgRGFydCBjb2RlIGFuZCBzZXJ2ZXMgcHVyZWx5IGFzIG1hcmtlcgovLy8gaW4gdHlwZSBzaWduYXR1cmVzLgpjbGFzcyBVaW50NjQgZXh0ZW5kcyBfTmF0aXZlSW50ZWdlciB7CiAgY29uc3QgVWludDY0KCk7Cn0KCi8vLyBSZXByZXNlbnRzIGEgbmF0aXZlIHBvaW50ZXItc2l6ZWQgaW50ZWdlciBpbiBDLgovLy8KLy8vIFtJbnRQdHJdIGlzIG5vdCBjb25zdHJ1Y3RpYmxlIGluIHRoZSBEYXJ0IGNvZGUgYW5kIHNlcnZlcyBwdXJlbHkgYXMgbWFya2VyCi8vLyBpbiB0eXBlIHNpZ25hdHVyZXMuCmNsYXNzIEludFB0ciBleHRlbmRzIF9OYXRpdmVJbnRlZ2VyIHsKICBjb25zdCBJbnRQdHIoKTsKfQoKLy8vIFJlcHJlc2VudHMgYSBuYXRpdmUgMzIgYml0IGZsb2F0IGluIEMuCi8vLwovLy8gW0Zsb2F0XSBpcyBub3QgY29uc3RydWN0aWJsZSBpbiB0aGUgRGFydCBjb2RlIGFuZCBzZXJ2ZXMgcHVyZWx5IGFzIG1hcmtlcgovLy8gaW4gdHlwZSBzaWduYXR1cmVzLgpjbGFzcyBGbG9hdCBleHRlbmRzIF9OYXRpdmVEb3VibGUgewogIGNvbnN0IEZsb2F0KCk7Cn0KCi8vLyBSZXByZXNlbnRzIGEgbmF0aXZlIDY0IGJpdCBkb3VibGUgaW4gQy4KLy8vCi8vLyBbRG91YmxlXSBpcyBub3QgY29uc3RydWN0aWJsZSBpbiB0aGUgRGFydCBjb2RlIGFuZCBzZXJ2ZXMgcHVyZWx5IGFzIG1hcmtlcgovLy8gaW4gdHlwZSBzaWduYXR1cmVzLgpjbGFzcyBEb3VibGUgZXh0ZW5kcyBfTmF0aXZlRG91YmxlIHsKICBjb25zdCBEb3VibGUoKTsKfQoKLy8vIFJlcHJlc2VudHMgYSB2b2lkIHR5cGUgaW4gQy4KLy8vCi8vLyBbVm9pZF0gaXMgbm90IGNvbnN0cnVjdGlibGUgaW4gdGhlIERhcnQgY29kZSBhbmQgc2VydmVzIHB1cmVseSBhcyBtYXJrZXIgaW4KLy8vIHR5cGUgc2lnbmF0dXJlcy4KQHVuc2l6ZWQKY2xhc3MgVm9pZCBleHRlbmRzIE5hdGl2ZVR5cGUgewogIGNvbnN0IFZvaWQoKTsKfQoKLy8vIFJlcHJlc2VudHMgYSBmdW5jdGlvbiB0eXBlIGluIEMuCi8vLwovLy8gW05hdGl2ZUZ1bmN0aW9uXSBpcyBub3QgY29uc3RydWN0aWJsZSBpbiB0aGUgRGFydCBjb2RlIGFuZCBzZXJ2ZXMgcHVyZWx5IGFzCi8vLyBtYXJrZXIgaW4gdHlwZSBzaWduYXR1cmVzLgpAdW5zaXplZApjbGFzcyBOYXRpdmVGdW5jdGlvbjxUIGV4dGVuZHMgRnVuY3Rpb24+IGV4dGVuZHMgTmF0aXZlVHlwZSB7fQqAhwBOTjwBEgE6BE0qExYCAUEEUSoqGgIBSARQKikZAgEzBFAVJBACATQEURUlEQIBNARRFSURAgE0BFEVJRECATUEURUlEQIBNgRPGCYSAgE2BE8YJhICATYETxgmEgIBNARPGCYSAgErBE4YJBECASwETxglEgIBIQRQFQkgEAIBJQRQHwk/ARlkYXJ0OmZmaS9uYXRpdmVfdHlwZS5kYXJ0MG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9mZmkvYW5ub3RhdGlvbnMuZGFydIc9Ly8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5mZmk7CgpjbGFzcyBTdHJ1Y3QgewogIGNvbnN0IFN0cnVjdCgpOwp9CgovLy8gVGhpcyBEYXJ0IGNsYXNzIHJlcHJlc2VudHMgYSBDIHN0cnVjdC4KLy8vCi8vLyBGaWVsZHMgaW4gdGhpcyBzdHJ1Y3QsIGFubm90YXRlZCB3aXRoIGEgc3VidHlwZSBvZiBbTmF0aXZlVHlwZV0sIGFyZQovLy8gYXV0b21hdGljYWxseSB0cmFuc2Zvcm1lZCBpbnRvIHdyYXBwZXJzIHRvIGFjY2VzcyB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QKLy8vIGluIEMgbWVtb3J5LgovLy8KLy8vIEZpZWxkcyB3aXRob3V0IGEgW05hdGl2ZVR5cGVdIGFubm90YXRpb24gYXJlIG5vdCBzdXBwb3J0ZWQuCmNvbnN0IHN0cnVjdCA9IGNvbnN0IFN0cnVjdCgpOwoKY2xhc3MgRGFydFJlcHJlc2VudGF0aW9uT2YgewogIC8vLyBSZXByZXNlbnRzIHRoZSBEYXJ0IHR5cGUgY29ycmVzcG9uZGluZyB0byBhIFtOYXRpdmVUeXBlXS4KICAvLy8KICAvLy8gW0ludDhdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IFtpbnRdCiAgLy8vIFtJbnQxNl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBbaW50XQogIC8vLyBbSW50MzJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gW2ludF0KICAvLy8gW0ludDY0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IFtpbnRdCiAgLy8vIFtVaW50OF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBbaW50XQogIC8vLyBbVWludDE2XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gW2ludF0KICAvLy8gW1VpbnQzMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IFtpbnRdCiAgLy8vIFtVaW50NjRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBbaW50XQogIC8vLyBbSW50UHRyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gW2ludF0KICAvLy8gW0RvdWJsZV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IFtkb3VibGVdCiAgLy8vIFtGbG9hdF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBbZG91YmxlXQogIC8vLyBbUG9pbnRlcl08VD4gICAgICAgICAgICAgICAgICAgICAgICAgLT4gW1BvaW50ZXJdPFQ+CiAgLy8vIFQgZXh0ZW5kcyBbUG9pbnRlcl0gICAgICAgICAgICAgICAgICAtPiBUCiAgLy8vIFtOYXRpdmVGdW5jdGlvbl08VDEgRnVuY3Rpb24oVDIsIFQzKSAtPiBTMSBGdW5jdGlvbihTMiwgUzMpCiAgLy8vICAgIHdoZXJlIERhcnRSZXByZXNlbnRhdGlvbk9mKFRuKSAtPiBTbgogIGNvbnN0IERhcnRSZXByZXNlbnRhdGlvbk9mKFN0cmluZyBuYXRpdmVUeXBlKTsKfQoKY2xhc3MgVW5zaXplZCB7CiAgY29uc3QgVW5zaXplZCgpOwp9CgovLy8gVGhpcyBbTmF0aXZlVHlwZV0gZG9lcyBub3QgaGF2ZSBwcmVkZWZpbmVkIHNpemUuCi8vLwovLy8gVW5zaXplZCBOYXRpdmVUeXBlcyBkbyBub3Qgc3VwcG9ydCBbc2l6ZU9mXSBiZWNhdXNlIHRoZWlyIHNpemUgaXMgdW5rbm93bi4KLy8vIENvbnNlcXVlbnRseSwgW2FsbG9jYXRlXSwgW1BvaW50ZXIubG9hZF0sIFtQb2ludGVyLnN0b3JlXSwgYW5kCi8vLyBbUG9pbnRlci5lbGVtZW50QXRdIGFyZSBub3QgYXZhaWxhYmxlLgpjb25zdCB1bnNpemVkID0gY29uc3QgVW5zaXplZCgpOwo0AE5OPAESAQ8SAgErBElPEQRAHwEdQAY0NDQ0NDQ0NDQ3NzswQi4xAgEQEwIBNQRPQyshARlkYXJ0OmZmaS9hbm5vdGF0aW9ucy5kYXJ0NG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9mZmkvZHluYW1pY19saWJyYXJ5LmRhcnSE8C8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuZmZpOwoKLy8vIFJlcHJlc2VudHMgYSBkeW5hbWljYWxseSBsb2FkZWQgQyBsaWJyYXJ5LgpjbGFzcyBEeW5hbWljTGlicmFyeSB7CiAgLy8vIExvYWRzIGEgZHluYW1pYyBsaWJyYXJ5IGZpbGUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgZGxvcGVuLgogIC8vLwogIC8vLyBUaHJvd3MgYW4gW0FyZ3VtZW50RXJyb3JdIGlmIGxvYWRpbmcgdGhlIGR5bmFtaWMgbGlicmFyeSBmYWlscy4KICAvLy8KICAvLy8gTm90ZSB0aGF0IGl0IGxvYWRzIHRoZSBmdW5jdGlvbnMgaW4gdGhlIGxpYnJhcnkgbGF6aWx5IChSVExEX0xBWlkpLgogIGV4dGVybmFsIGZhY3RvcnkgRHluYW1pY0xpYnJhcnkub3BlbihTdHJpbmcgbmFtZSk7CgogIC8vLyBMb29rcyB1cCBhIHN5bWJvbCBpbiB0aGUgW0R5bmFtaWNMaWJyYXJ5XSBhbmQgcmV0dXJucyBpdHMgYWRkcmVzcyBpbgogIC8vLyBtZW1vcnkuIEVxdWl2YWxlbnQgb2YgZGxzeW0uCiAgLy8vCiAgLy8vIFRocm93cyBhbiBbQXJndW1lbnRFcnJvcl0gaWYgaXQgZmFpbHMgdG8gbG9va3VwIHRoZSBzeW1ib2wuCiAgZXh0ZXJuYWwgUG9pbnRlcjxUPiBsb29rdXA8VCBleHRlbmRzIE5hdGl2ZVR5cGU+KFN0cmluZyBzeW1ib2xOYW1lKTsKCiAgLy8vIEhlbHBlciB0aGF0IGNvbWJpbmVzIGxvb2t1cCBhbmQgY2FzdCB0byBhIERhcnQgZnVuY3Rpb24uCiAgRiBsb29rdXBGdW5jdGlvbjxUIGV4dGVuZHMgRnVuY3Rpb24sIEYgZXh0ZW5kcyBGdW5jdGlvbj4oU3RyaW5nIHN5bWJvbE5hbWUpIHsKICAgIHJldHVybiBsb29rdXA8TmF0aXZlRnVuY3Rpb248VD4+KHN5bWJvbE5hbWUpPy5hc0Z1bmN0aW9uPEY+KCk7CiAgfQoKICAvLy8gRHluYW1pYyBsaWJyYXJpZXMgYXJlIGVxdWFsIGlmIHRoZXkgbG9hZCB0aGUgc2FtZSBsaWJyYXJ5LgogIGV4dGVybmFsIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpOwoKICAvLy8gVGhlIGhhc2ggY29kZSBmb3IgYSBEeW5hbWljTGlicmFyeSBvbmx5IGRlcGVuZHMgb24gdGhlIGxvYWRlZCBsaWJyYXJ5CiAgZXh0ZXJuYWwgaW50IGdldCBoYXNoQ29kZTsKfQoiAE5OPAESAS8XRgZGBko1AUsjBkJHAT9QQwQBQSQBTB0CAR1kYXJ0OmZmaS9keW5hbWljX2xpYnJhcnkuZGFydD5vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2ZmaV9keW5hbWljX2xpYnJhcnlfcGF0Y2guZGFydIOJLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAiZGFydDpfaW50ZXJuYWwiIHNob3cgcGF0Y2g7CgpEeW5hbWljTGlicmFyeSBfb3BlbihTdHJpbmcgbmFtZSkgbmF0aXZlICJGZmlfZGxfb3BlbiI7CgpAcGF0Y2gKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBEeW5hbWljTGlicmFyeSB7CiAgQHBhdGNoCiAgZmFjdG9yeSBEeW5hbWljTGlicmFyeS5vcGVuKFN0cmluZyBuYW1lKSB7CiAgICByZXR1cm4gX29wZW4obmFtZSk7CiAgfQoKICBAcGF0Y2gKICBQb2ludGVyPFQ+IGxvb2t1cDxUIGV4dGVuZHMgTmF0aXZlVHlwZT4oU3RyaW5nIHN5bWJvbE5hbWUpCiAgICAgIG5hdGl2ZSAiRmZpX2RsX2xvb2t1cCI7CgogIC8vIFRPRE8oZGFjb2hhcmtlcyk6IEV4cG9zZSB0aGlzIHRvIHVzZXJzLCBvciBleHRlbmQgUG9pbnRlcj8KICAvLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMzU4ODEKICBpbnQgZ2V0SGFuZGxlKCkgbmF0aXZlICJGZmlfZGxfZ2V0SGFuZGxlIjsKCiAgQHBhdGNoCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKG90aGVyID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBnZXRIYW5kbGUoKSA9PSBvdGhlci5nZXRIYW5kbGUoKTsKICB9CgogIEBwYXRjaAogIGludCBnZXQgaGFzaENvZGUgewogICAgcmV0dXJuIGdldEhhbmRsZSgpLmhhc2hDb2RlOwogIH0KfQolAE5OPAEkATgBBxoXCS0YBAEJPR4BQDMtAQkcJS0EAQkVIQQCAS1kYXJ0OmZmaS1wYXRjaC9mZmlfZHluYW1pY19saWJyYXJ5X3BhdGNoLmRhcnQyb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2ludGVybmFsL2ludGVybmFsLmRhcnS1ji8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQuX2ludGVybmFsOwoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJwogICAgc2hvdwogICAgICAgIEZ1dHVyZSwKICAgICAgICBTdHJlYW0sCiAgICAgICAgU3RyZWFtU3Vic2NyaXB0aW9uLAogICAgICAgIFN0cmVhbVRyYW5zZm9ybWVyLAogICAgICAgIFN0cmVhbVRyYW5zZm9ybWVyQmFzZSwKICAgICAgICBab25lOwppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBDb252ZXJ0ZXI7CmltcG9ydCAnZGFydDpjb3JlJyBoaWRlIFN5bWJvbDsKaW1wb3J0ICdkYXJ0OmNvcmUnIGFzIGNvcmU7CmltcG9ydCAnZGFydDptYXRoJyBzaG93IFJhbmRvbTsKCnBhcnQgJ2FzeW5jX2Nhc3QuZGFydCc7CnBhcnQgJ2Nhc3QuZGFydCc7CnBhcnQgJ2l0ZXJhYmxlLmRhcnQnOwpwYXJ0ICdsaXN0LmRhcnQnOwpwYXJ0ICdwcmludC5kYXJ0JzsKcGFydCAnc29ydC5kYXJ0JzsKcGFydCAnc3ltYm9sLmRhcnQnOwpwYXJ0ICdsaW5rZWRfbGlzdC5kYXJ0JzsKCi8vIFBvd2VycyBvZiAxMCB1cCB0byAxMF4yMiBhcmUgcmVwcmVzZW50YWJsZSBhcyBkb3VibGVzLgovLyBQb3dlcnMgb2YgMTAgYWJvdmUgdGhhdCBhcmUgb25seSBhcHByb3hpbWF0ZSBkdWUgdG8gbGFjayBvZiBwcmVjaXNzaW9uLgovLyBVc2VkIGJ5IGRvdWJsZS1wYXJzaW5nLgpjb25zdCBQT1dFUlNfT0ZfVEVOID0gY29uc3QgWwogIDEuMCwgLy8gMAogIDEwLjAsCiAgMTAwLjAsCiAgMTAwMC4wLAogIDEwMDAwLjAsCiAgMTAwMDAwLjAsIC8vIDUKICAxMDAwMDAwLjAsCiAgMTAwMDAwMDAuMCwKICAxMDAwMDAwMDAuMCwKICAxMDAwMDAwMDAwLjAsCiAgMTAwMDAwMDAwMDAuMCwgLy8gMTAKICAxMDAwMDAwMDAwMDAuMCwKICAxMDAwMDAwMDAwMDAwLjAsCiAgMTAwMDAwMDAwMDAwMDAuMCwKICAxMDAwMDAwMDAwMDAwMDAuMCwKICAxMDAwMDAwMDAwMDAwMDAwLjAsIC8vIDE1CiAgMTAwMDAwMDAwMDAwMDAwMDAuMCwKICAxMDAwMDAwMDAwMDAwMDAwMDAuMCwKICAxMDAwMDAwMDAwMDAwMDAwMDAwLjAsCiAgMTAwMDAwMDAwMDAwMDAwMDAwMDAuMCwKICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAuMCwgLy8gMjAKICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwLjAsCiAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuMCwKXTsKCi8qKgogKiBBbiBbSXRlcmFibGVdIG9mIHRoZSBVVEYtMTYgY29kZSB1bml0cyBvZiBhIFtTdHJpbmddIGluIGluZGV4IG9yZGVyLgogKi8KY2xhc3MgQ29kZVVuaXRzIGV4dGVuZHMgVW5tb2RpZmlhYmxlTGlzdEJhc2U8aW50PiB7CiAgLyoqIFRoZSBzdHJpbmcgdGhhdCB0aGlzIGlzIHRoZSBjb2RlIHVuaXRzIG9mLiAqLwogIGZpbmFsIFN0cmluZyBfc3RyaW5nOwoKICBDb2RlVW5pdHModGhpcy5fc3RyaW5nKTsKCiAgaW50IGdldCBsZW5ndGggPT4gX3N0cmluZy5sZW5ndGg7CiAgaW50IG9wZXJhdG9yIFtdKGludCBpKSA9PiBfc3RyaW5nLmNvZGVVbml0QXQoaSk7CgogIHN0YXRpYyBTdHJpbmcgc3RyaW5nT2YoQ29kZVVuaXRzIHUpID0+IHUuX3N0cmluZzsKfQoKLy8vIE1hcmtzIGEgZnVuY3Rpb24gb3IgbGlicmFyeSBhcyBoYXZpbmcgYW4gZXh0ZXJuYWwgaW1wbGVtZW50YXRpb24gKCJuYXRpdmUiCi8vLyBpbiB0aGUgRGFydCBWTSkuCi8vLwovLy8gT24gYSBmdW5jdGlvbiwgdGhpcyBwcm92aWRlcyBhIGJhY2tlbmQtc3BlY2lmaWMgU3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgdG8KLy8vIGlkZW50aWZ5IHRoZSBmdW5jdGlvbidzIGltcGxlbWVudGF0aW9uLgovLy8KLy8vIE9uIGEgbGlicmFyeSwgaXQgcHJvdmlkZXMgYSBVcmkgdGhhdCBjYW4gYmUgdXNlZCB0byBsb2NhdGUgdGhlIG5hdGl2ZQovLy8gbGlicmFyeSdzIGltcGxlbWVudGF0aW9uLgpjbGFzcyBFeHRlcm5hbE5hbWUgewogIGZpbmFsIFN0cmluZyBuYW1lOwogIGNvbnN0IEV4dGVybmFsTmFtZSh0aGlzLm5hbWUpOwp9CgovLyBTaGFyZWQgaGV4LXBhcnNpbmcgdXRpbGl0aWVzLgoKLy8vIFBhcnNlcyBhIHNpbmdsZSBoZXgtZGlnaXQgYXMgY29kZSB1bml0LgovLy8KLy8vIFJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZSBpZiB0aGUgY2hhcmFjdGVyIGlzIG5vdCBhIHZhbGlkIGhleC1kaWdpdC4KaW50IGhleERpZ2l0VmFsdWUoaW50IGNoYXIpIHsKICBhc3NlcnQoY2hhciA+PSAwICYmIGNoYXIgPD0gMHhGRkZGKTsKICBjb25zdCBpbnQgZGlnaXQwID0gMHgzMDsKICBjb25zdCBpbnQgYSA9IDB4NjE7CiAgY29uc3QgaW50IGYgPSAweDY2OwogIGludCBkaWdpdCA9IGNoYXIgXiBkaWdpdDA7CiAgaWYgKGRpZ2l0IDw9IDkpIHJldHVybiBkaWdpdDsKICBpbnQgbGV0dGVyID0gKGNoYXIgfCAweDIwKTsKICBpZiAoYSA8PSBsZXR0ZXIgJiYgbGV0dGVyIDw9IGYpIHJldHVybiBsZXR0ZXIgLSAoYSAtIDEwKTsKICByZXR1cm4gLTE7Cn0KCi8vLyBQYXJzZXMgdHdvIGhleCBkaWdpdHMgaW4gYSBzdHJpbmcuCi8vLwovLy8gUmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlIGlmIGVpdGhlciBkaWdpdCBpc24ndCB2YWxpZC4KaW50IHBhcnNlSGV4Qnl0ZShTdHJpbmcgc291cmNlLCBpbnQgaW5kZXgpIHsKICBhc3NlcnQoaW5kZXggKyAyIDw9IHNvdXJjZS5sZW5ndGgpOwogIGludCBkaWdpdDEgPSBoZXhEaWdpdFZhbHVlKHNvdXJjZS5jb2RlVW5pdEF0KGluZGV4KSk7CiAgaW50IGRpZ2l0MiA9IGhleERpZ2l0VmFsdWUoc291cmNlLmNvZGVVbml0QXQoaW5kZXggKyAxKSk7CiAgcmV0dXJuIGRpZ2l0MSAqIDE2ICsgZGlnaXQyIC0gKGRpZ2l0MiAmIDI1Nik7Cn0KCi8vLyBHaXZlbiBhbiBbaW5zdGFuY2VdIG9mIHNvbWUgZ2VuZXJpYyB0eXBlIFtUXSwgYW5kIFtleHRyYWN0XSwgYSBmaXJzdC1jbGFzcwovLy8gZ2VuZXJpYyBmdW5jdGlvbiB0aGF0IHRha2VzIHRoZSBzYW1lIG51bWJlciBvZiB0eXBlIHBhcmFtZXRlcnMgYXMgW1RdLAovLy8gaW52b2tlcyB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSB0eXBlIGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIHRvIFQKLy8vIHdoZW4gW2luc3RhbmNlXSB3YXMgY29uc3RydWN0ZWQuCi8vLwovLy8gRXhhbXBsZToKLy8vCi8vLyBgYGBkYXJ0Ci8vLyBjbGFzcyBUd288QSwgQj4ge30KLy8vCi8vLyBwcmludChleHRyYWN0VHlwZUFyZ3VtZW50czxMaXN0Pig8aW50PltdLCA8VD4oKSA9PiBuZXcgU2V0PFQ+KCkpKTsKLy8vIC8vIFByaW50czogSW5zdGFuY2Ugb2YgJ1NldDxpbnQ+Jy4KLy8vCi8vLyBwcmludChleHRyYWN0VHlwZUFyZ3VtZW50czxNYXA+KDxTdHJpbmcsIGJvb2w+e30sCi8vLyAgICAgPFQsIFM+KCkgPT4gbmV3IFR3bzxULCBTPikpOwovLy8gLy8gUHJpbnRzOiBJbnN0YW5jZSBvZiAnVHdvPFN0cmluZywgYm9vbD4nLgovLy8gYGBgCi8vLwovLy8gVGhlIHR5cGUgYXJndW1lbnQgVCBpcyBpbXBvcnRhbnQgdG8gY2hvb3NlIHdoaWNoIHNwZWNpZmljIHR5cGUgcGFyYW1ldGVyCi8vLyBsaXN0IGluIFtpbnN0YW5jZV0ncyB0eXBlIGhpZXJhcmNoeSBpcyBiZWluZyBleHRyYWN0ZWQuIENvbnNpZGVyOgovLy8KLy8vIGBgYGRhcnQKLy8vIGNsYXNzIEE8VD4ge30KLy8vIGNsYXNzIEI8VD4ge30KLy8vCi8vLyBjbGFzcyBDIGltcGxlbWVudHMgQTxpbnQ+LCBCPFN0cmluZz4ge30KLy8vCi8vLyBtYWluKCkgewovLy8gICB2YXIgYyA9IG5ldyBDKCk7Ci8vLyAgIHByaW50KGV4dHJhY3RUeXBlQXJndW1lbnRzPEE+KGMsIDxUPigpID0+IDxUPltdKSk7Ci8vLyAgIC8vIFByaW50czogSW5zdGFuY2Ugb2YgJ0xpc3Q8aW50PicuCi8vLwovLy8gICBwcmludChleHRyYWN0VHlwZUFyZ3VtZW50czxCPihjLCA8VD4oKSA9PiA8VD5bXSkpOwovLy8gICAvLyBQcmludHM6IEluc3RhbmNlIG9mICdMaXN0PFN0cmluZz4nLgovLy8gfQovLy8gYGBgCi8vLwovLy8gQSBjYWxsZXIgbXVzdCBub3Q6Ci8vLwovLy8gKiAgIFBhc3MgYG51bGxgIGZvciBbaW5zdGFuY2VdLgovLy8gKiAgIFVzZSBhIG5vbi1jbGFzcyB0eXBlIChpLmUuIGEgZnVuY3Rpb24gdHlwZSkgZm9yIFtUXS4KLy8vICogICBVc2UgYSBub24tZ2VuZXJpYyB0eXBlIGZvciBbVF0uCi8vLyAqICAgUGFzcyBhbiBpbnN0YW5jZSBvZiBhIGdlbmVyaWMgdHlwZSBhbmQgYSBmdW5jdGlvbiB0aGF0IGRvbid0IGJvdGggdGFrZQovLy8gICAgIHRoZSBzYW1lIG51bWJlciBvZiB0eXBlIGFyZ3VtZW50czoKLy8vCi8vLyAgICAgYGBgZGFydAovLy8gICAgIGV4dHJhY3RUeXBlQXJndW1lbnRzPExpc3Q+KDxpbnQ+W10sIDxULCBTPigpID0+IG51bGwpOwovLy8gICAgIGBgYAovLy8KLy8vIFNlZSB0aGlzIGlzc3VlIGZvciBtb3JlIGNvbnRleHQ6Ci8vLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMzEzNzEKZXh0ZXJuYWwgT2JqZWN0IGV4dHJhY3RUeXBlQXJndW1lbnRzPFQ+KFQgaW5zdGFuY2UsIEZ1bmN0aW9uIGV4dHJhY3QpOwoKLy8vIEFubm90YXRpb24gY2xhc3MgbWFya2luZyB0aGUgdmVyc2lvbiB3aGVyZSBTREsgQVBJIHdhcyBhZGRlZC4KLy8vCi8vLyBBIGBTaW5jZWAgYW5ub3RhdGlvbiBjYW4gYmUgYXBwbGllZCB0byBhIGxpYnJhcnkgZGVjbGFyYXRpb24sCi8vLyBhbnkgcHVibGljIGRlY2xhcmF0aW9uIGluIGEgbGlicmFyeSwgb3IgaW4gYSBjbGFzcywgb3IgdG8KLy8vIGFuIG9wdGlvbmFsIHBhcmFtZXRlci4KLy8vCi8vLyBJdCBzaWduaWZpZXMgdGhhdCB0aGUgZXhwb3J0LCBtZW1iZXIgb3IgcGFyYW1ldGVyIHdhcyAqYWRkZWQqIGluCi8vLyB0aGF0IHZlcnNpb24uCi8vLwovLy8gV2hlbiBhcHBsaWVkIHRvIGEgbGlicmFyeSBkZWNsYXJhdGlvbiwgaXQgYWxzbyBhIGFwcGxpZXMgdG8KLy8vIGFsbCBtZW1iZXJzIGRlY2xhcmVkIG9yIGV4cG9ydGVkIGJ5IHRoYXQgbGlicmFyeS4KLy8vIElmIGFwcGxpZWQgdG8gYSBjbGFzcywgaXQgYWxzbyBhcHBsaWVzIHRvIGFsbCBtZW1iZXJzIGFuZCBjb25zdHJ1Y3RvcnMKLy8vIG9mIHRoYXQgY2xhc3MuCi8vLyBJZiBhcHBsaWVkIHRvIGEgY2xhc3MgbWV0aG9kLCBvciBwYXJhbWV0ZXIgb2Ygc3VjaCwKLy8vIGFueSBtZXRob2QgaW1wbGVtZW50aW5nIHRoYXQgaW50ZXJmYWNlIG1ldGhvZCBpcyBhbHNvIGFubm90YXRlZC4KLy8vIEkgbXVsdGlwbGUgYFNpbmNlYCBhbm5vdGF0aW9ucyBhcHBseSB0byB0aGUgc2FtZSBkZWNsYXJhdGlvbiBvcgovLy8gcGFyYW1ldGVyLCB0aGUgbGF0ZXN0IHZlcnNpb24gdGFrZXMgcHJlY2VuZGVuY2UuCi8vLwovLy8gQW55IHVzZSBvZiBhIG1hcmtlZCBBUEkgbWF5IHRyaWdnZXIgYSB3YXJuaW5nIGlmIHRoZSB1c2luZyBjb2RlCi8vLyBkb2VzIG5vdCByZXF1aXJlIGFuIFNESyB2ZXJzaW9uIGd1YXJhbnRlZWluZyB0aGF0IHRoZSBBUEkgaXMgYXZhaWxhYmxlLAovLy8gdW5sZXNzIHRoZSBBUEkgZmVhdHVyZSBpcyBhbHNvIHByb3ZpZGVkIGJ5IHNvbWV0aGluZyBlbHNlLgovLy8gSXQgaXMgb25seSBhIHByb2JsZW0gaWYgYW4gYW5ub3RhdGVkIGZlYXR1cmUgaXMgdXNlZCwgYW5kIHRoZSBhbm5vdGF0ZWQKLy8vIEFQSSBpcyB0aGUgKm9ubHkqIHRoaW5nIHByb3ZpZGluZyB0aGUgZnVuY3Rpb25hbGl0eS4KLy8vIEZvciBleGFtcGxlLCB1c2luZyBgRnV0dXJlYCBleHBvcnRlZCBieSBgZGFydDpjb3JlYCBpcyBub3QgYSBwcm9ibGVtCi8vLyBpZiB0aGUgc2FtZSBsaWJyYXJ5IGFsc28gaW1wb3J0cyBgZGFydDphc3luY2AsIGFuZCB1c2luZyBhbiBvcHRpb25hbAovLy8gcGFyYW1ldGVyIG9uIGFuIGludGVyZmFjZSBpcyBub3QgYSBwcm9ibGVtIGlmIHRoZSBzYW1lIHR5cGUgYWxzbwovLy8gaW1wbGVtZW50cyBhbm90aGVyIGludGVyZmFjZSBwcm92aWRpbmcgdGhlIHNhbWUgcGFyYW1ldGVyLgovLy8KLy8vIFRoZSB2ZXJzaW9uIG11c3QgYmUgYSBzZW1hbnRpYyB2ZXJzaW9uIChsaWtlIGAxLjQuMmAgb3IgYDAuOS40LXJlYy40YCksCi8vLyBvciB0aGUgZmlyc3QgdHdvIG51bWJlcnMgb2YgYSBzZW1hbnRpYyB2ZXJzaW9uIChsaWtlIGAxLjBgIG9yIGAyLjJgKSwKLy8vIHJlcHJlc2VudGluZyBhIHN0YWJsZSByZWxlYXNlLCBhbmQgZXF1aXZhbGVudCB0byB0aGUgc2VtYW50aWMgdmVyc2lvbgovLy8geW91IGdldCBieSBhcHBlbmRpbmcgYSBgLjBgLgpAU2luY2UoIjIuMiIpCmNsYXNzIFNpbmNlIHsKICBmaW5hbCBTdHJpbmcgdmVyc2lvbjsKICBjb25zdCBTaW5jZSh0aGlzLnZlcnNpb24pOwp9CgovKioKICogSFRUUCBzdGF0dXMgY29kZXMuICBFeHBvcnRlZCBpbiBkYXJ0OmlvIGFuZCBkYXJ0Omh0bWwuCiAqLwphYnN0cmFjdCBjbGFzcyBIdHRwU3RhdHVzIHsKICBzdGF0aWMgY29uc3QgaW50IGNvbnRpbnVlXyA9IDEwMDsKICBzdGF0aWMgY29uc3QgaW50IHN3aXRjaGluZ1Byb3RvY29scyA9IDEwMTsKICBAU2luY2UoIjIuMSIpCiAgc3RhdGljIGNvbnN0IGludCBwcm9jZXNzaW5nID0gMTAyOwogIHN0YXRpYyBjb25zdCBpbnQgb2sgPSAyMDA7CiAgc3RhdGljIGNvbnN0IGludCBjcmVhdGVkID0gMjAxOwogIHN0YXRpYyBjb25zdCBpbnQgYWNjZXB0ZWQgPSAyMDI7CiAgc3RhdGljIGNvbnN0IGludCBub25BdXRob3JpdGF0aXZlSW5mb3JtYXRpb24gPSAyMDM7CiAgc3RhdGljIGNvbnN0IGludCBub0NvbnRlbnQgPSAyMDQ7CiAgc3RhdGljIGNvbnN0IGludCByZXNldENvbnRlbnQgPSAyMDU7CiAgc3RhdGljIGNvbnN0IGludCBwYXJ0aWFsQ29udGVudCA9IDIwNjsKICBAU2luY2UoIjIuMSIpCiAgc3RhdGljIGNvbnN0IGludCBtdWx0aVN0YXR1cyA9IDIwNzsKICBAU2luY2UoIjIuMSIpCiAgc3RhdGljIGNvbnN0IGludCBhbHJlYWR5UmVwb3J0ZWQgPSAyMDg7CiAgQFNpbmNlKCIyLjEiKQogIHN0YXRpYyBjb25zdCBpbnQgaW1Vc2VkID0gMjI2OwogIHN0YXRpYyBjb25zdCBpbnQgbXVsdGlwbGVDaG9pY2VzID0gMzAwOwogIHN0YXRpYyBjb25zdCBpbnQgbW92ZWRQZXJtYW5lbnRseSA9IDMwMTsKICBzdGF0aWMgY29uc3QgaW50IGZvdW5kID0gMzAyOwogIHN0YXRpYyBjb25zdCBpbnQgbW92ZWRUZW1wb3JhcmlseSA9IDMwMjsgLy8gQ29tbW9uIGFsaWFzIGZvciBmb3VuZC4KICBzdGF0aWMgY29uc3QgaW50IHNlZU90aGVyID0gMzAzOwogIHN0YXRpYyBjb25zdCBpbnQgbm90TW9kaWZpZWQgPSAzMDQ7CiAgc3RhdGljIGNvbnN0IGludCB1c2VQcm94eSA9IDMwNTsKICBzdGF0aWMgY29uc3QgaW50IHRlbXBvcmFyeVJlZGlyZWN0ID0gMzA3OwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgY29uc3QgaW50IHBlcm1hbmVudFJlZGlyZWN0ID0gMzA4OwogIHN0YXRpYyBjb25zdCBpbnQgYmFkUmVxdWVzdCA9IDQwMDsKICBzdGF0aWMgY29uc3QgaW50IHVuYXV0aG9yaXplZCA9IDQwMTsKICBzdGF0aWMgY29uc3QgaW50IHBheW1lbnRSZXF1aXJlZCA9IDQwMjsKICBzdGF0aWMgY29uc3QgaW50IGZvcmJpZGRlbiA9IDQwMzsKICBzdGF0aWMgY29uc3QgaW50IG5vdEZvdW5kID0gNDA0OwogIHN0YXRpYyBjb25zdCBpbnQgbWV0aG9kTm90QWxsb3dlZCA9IDQwNTsKICBzdGF0aWMgY29uc3QgaW50IG5vdEFjY2VwdGFibGUgPSA0MDY7CiAgc3RhdGljIGNvbnN0IGludCBwcm94eUF1dGhlbnRpY2F0aW9uUmVxdWlyZWQgPSA0MDc7CiAgc3RhdGljIGNvbnN0IGludCByZXF1ZXN0VGltZW91dCA9IDQwODsKICBzdGF0aWMgY29uc3QgaW50IGNvbmZsaWN0ID0gNDA5OwogIHN0YXRpYyBjb25zdCBpbnQgZ29uZSA9IDQxMDsKICBzdGF0aWMgY29uc3QgaW50IGxlbmd0aFJlcXVpcmVkID0gNDExOwogIHN0YXRpYyBjb25zdCBpbnQgcHJlY29uZGl0aW9uRmFpbGVkID0gNDEyOwogIHN0YXRpYyBjb25zdCBpbnQgcmVxdWVzdEVudGl0eVRvb0xhcmdlID0gNDEzOwogIHN0YXRpYyBjb25zdCBpbnQgcmVxdWVzdFVyaVRvb0xvbmcgPSA0MTQ7CiAgc3RhdGljIGNvbnN0IGludCB1bnN1cHBvcnRlZE1lZGlhVHlwZSA9IDQxNTsKICBzdGF0aWMgY29uc3QgaW50IHJlcXVlc3RlZFJhbmdlTm90U2F0aXNmaWFibGUgPSA0MTY7CiAgc3RhdGljIGNvbnN0IGludCBleHBlY3RhdGlvbkZhaWxlZCA9IDQxNzsKICBAU2luY2UoIjIuMSIpCiAgc3RhdGljIGNvbnN0IGludCBtaXNkaXJlY3RlZFJlcXVlc3QgPSA0MjE7CiAgQFNpbmNlKCIyLjEiKQogIHN0YXRpYyBjb25zdCBpbnQgdW5wcm9jZXNzYWJsZUVudGl0eSA9IDQyMjsKICBAU2luY2UoIjIuMSIpCiAgc3RhdGljIGNvbnN0IGludCBsb2NrZWQgPSA0MjM7CiAgQFNpbmNlKCIyLjEiKQogIHN0YXRpYyBjb25zdCBpbnQgZmFpbGVkRGVwZW5kZW5jeSA9IDQyNDsKICBzdGF0aWMgY29uc3QgaW50IHVwZ3JhZGVSZXF1aXJlZCA9IDQyNjsKICBAU2luY2UoIjIuMSIpCiAgc3RhdGljIGNvbnN0IGludCBwcmVjb25kaXRpb25SZXF1aXJlZCA9IDQyODsKICBAU2luY2UoIjIuMSIpCiAgc3RhdGljIGNvbnN0IGludCB0b29NYW55UmVxdWVzdHMgPSA0Mjk7CiAgQFNpbmNlKCIyLjEiKQogIHN0YXRpYyBjb25zdCBpbnQgcmVxdWVzdEhlYWRlckZpZWxkc1Rvb0xhcmdlID0gNDMxOwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgY29uc3QgaW50IGNvbm5lY3Rpb25DbG9zZWRXaXRob3V0UmVzcG9uc2UgPSA0NDQ7CiAgQFNpbmNlKCIyLjEiKQogIHN0YXRpYyBjb25zdCBpbnQgdW5hdmFpbGFibGVGb3JMZWdhbFJlYXNvbnMgPSA0NTE7CiAgQFNpbmNlKCIyLjEiKQogIHN0YXRpYyBjb25zdCBpbnQgY2xpZW50Q2xvc2VkUmVxdWVzdCA9IDQ5OTsKICBzdGF0aWMgY29uc3QgaW50IGludGVybmFsU2VydmVyRXJyb3IgPSA1MDA7CiAgc3RhdGljIGNvbnN0IGludCBub3RJbXBsZW1lbnRlZCA9IDUwMTsKICBzdGF0aWMgY29uc3QgaW50IGJhZEdhdGV3YXkgPSA1MDI7CiAgc3RhdGljIGNvbnN0IGludCBzZXJ2aWNlVW5hdmFpbGFibGUgPSA1MDM7CiAgc3RhdGljIGNvbnN0IGludCBnYXRld2F5VGltZW91dCA9IDUwNDsKICBzdGF0aWMgY29uc3QgaW50IGh0dHBWZXJzaW9uTm90U3VwcG9ydGVkID0gNTA1OwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgY29uc3QgaW50IHZhcmlhbnRBbHNvTmVnb3RpYXRlcyA9IDUwNjsKICBAU2luY2UoIjIuMSIpCiAgc3RhdGljIGNvbnN0IGludCBpbnN1ZmZpY2llbnRTdG9yYWdlID0gNTA3OwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgY29uc3QgaW50IGxvb3BEZXRlY3RlZCA9IDUwODsKICBAU2luY2UoIjIuMSIpCiAgc3RhdGljIGNvbnN0IGludCBub3RFeHRlbmRlZCA9IDUxMDsKICBAU2luY2UoIjIuMSIpCiAgc3RhdGljIGNvbnN0IGludCBuZXR3b3JrQXV0aGVudGljYXRpb25SZXF1aXJlZCA9IDUxMTsKICAvLyBDbGllbnQgZ2VuZXJhdGVkIHN0YXR1cyBjb2RlLgogIHN0YXRpYyBjb25zdCBpbnQgbmV0d29ya0Nvbm5lY3RUaW1lb3V0RXJyb3IgPSA1OTk7CgogIEBEZXByZWNhdGVkKCJVc2UgY29udGludWVfIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgQ09OVElOVUUgPSBjb250aW51ZV87CiAgQERlcHJlY2F0ZWQoIlVzZSBzd2l0Y2hpbmdQcm90b2NvbHMgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBTV0lUQ0hJTkdfUFJPVE9DT0xTID0gc3dpdGNoaW5nUHJvdG9jb2xzOwogIEBEZXByZWNhdGVkKCJVc2Ugb2sgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBPSyA9IG9rOwogIEBEZXByZWNhdGVkKCJVc2UgY3JlYXRlZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IENSRUFURUQgPSBjcmVhdGVkOwogIEBEZXByZWNhdGVkKCJVc2UgYWNjZXB0ZWQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBBQ0NFUFRFRCA9IGFjY2VwdGVkOwogIEBEZXByZWNhdGVkKCJVc2Ugbm9uQXV0aG9yaXRhdGl2ZUluZm9ybWF0aW9uIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgTk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04gPSBub25BdXRob3JpdGF0aXZlSW5mb3JtYXRpb247CiAgQERlcHJlY2F0ZWQoIlVzZSBub0NvbnRlbnQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBOT19DT05URU5UID0gbm9Db250ZW50OwogIEBEZXByZWNhdGVkKCJVc2UgcmVzZXRDb250ZW50IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgUkVTRVRfQ09OVEVOVCA9IHJlc2V0Q29udGVudDsKICBARGVwcmVjYXRlZCgiVXNlIHBhcnRpYWxDb250ZW50IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgUEFSVElBTF9DT05URU5UID0gcGFydGlhbENvbnRlbnQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBtdWx0aXBsZUNob2ljZXMgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBNVUxUSVBMRV9DSE9JQ0VTID0gbXVsdGlwbGVDaG9pY2VzOwogIEBEZXByZWNhdGVkKCJVc2UgbW92ZWRQZXJtYW5lbnRseSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE1PVkVEX1BFUk1BTkVOVExZID0gbW92ZWRQZXJtYW5lbnRseTsKICBARGVwcmVjYXRlZCgiVXNlIGZvdW5kIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgRk9VTkQgPSBmb3VuZDsKICBARGVwcmVjYXRlZCgiVXNlIG1vdmVkVGVtcG9yYXJpbHkgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBNT1ZFRF9URU1QT1JBUklMWSA9IG1vdmVkVGVtcG9yYXJpbHk7CiAgQERlcHJlY2F0ZWQoIlVzZSBzZWVPdGhlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IFNFRV9PVEhFUiA9IHNlZU90aGVyOwogIEBEZXByZWNhdGVkKCJVc2Ugbm90TW9kaWZpZWQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBOT1RfTU9ESUZJRUQgPSBub3RNb2RpZmllZDsKICBARGVwcmVjYXRlZCgiVXNlIHVzZVByb3h5IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgVVNFX1BST1hZID0gdXNlUHJveHk7CiAgQERlcHJlY2F0ZWQoIlVzZSB0ZW1wb3JhcnlSZWRpcmVjdCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IFRFTVBPUkFSWV9SRURJUkVDVCA9IHRlbXBvcmFyeVJlZGlyZWN0OwogIEBEZXByZWNhdGVkKCJVc2UgYmFkUmVxdWVzdCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IEJBRF9SRVFVRVNUID0gYmFkUmVxdWVzdDsKICBARGVwcmVjYXRlZCgiVXNlIHVuYXV0aG9yaXplZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IFVOQVVUSE9SSVpFRCA9IHVuYXV0aG9yaXplZDsKICBARGVwcmVjYXRlZCgiVXNlIHBheW1lbnRSZXF1aXJlZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IFBBWU1FTlRfUkVRVUlSRUQgPSBwYXltZW50UmVxdWlyZWQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBmb3JiaWRkZW4gaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBGT1JCSURERU4gPSBmb3JiaWRkZW47CiAgQERlcHJlY2F0ZWQoIlVzZSBub3RGb3VuZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE5PVF9GT1VORCA9IG5vdEZvdW5kOwogIEBEZXByZWNhdGVkKCJVc2UgbWV0aG9kTm90QWxsb3dlZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE1FVEhPRF9OT1RfQUxMT1dFRCA9IG1ldGhvZE5vdEFsbG93ZWQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBub3RBY2NlcHRhYmxlIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgTk9UX0FDQ0VQVEFCTEUgPSBub3RBY2NlcHRhYmxlOwogIEBEZXByZWNhdGVkKCJVc2UgcHJveHlBdXRoZW50aWNhdGlvblJlcXVpcmVkIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQgPSBwcm94eUF1dGhlbnRpY2F0aW9uUmVxdWlyZWQ7CiAgQERlcHJlY2F0ZWQoIlVzZSByZXF1ZXN0VGltZW91dCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IFJFUVVFU1RfVElNRU9VVCA9IHJlcXVlc3RUaW1lb3V0OwogIEBEZXByZWNhdGVkKCJVc2UgY29uZmxpY3QgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBDT05GTElDVCA9IGNvbmZsaWN0OwogIEBEZXByZWNhdGVkKCJVc2UgZ29uZSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IEdPTkUgPSBnb25lOwogIEBEZXByZWNhdGVkKCJVc2UgbGVuZ3RoUmVxdWlyZWQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBMRU5HVEhfUkVRVUlSRUQgPSBsZW5ndGhSZXF1aXJlZDsKICBARGVwcmVjYXRlZCgiVXNlIHByZWNvbmRpdGlvbkZhaWxlZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IFBSRUNPTkRJVElPTl9GQUlMRUQgPSBwcmVjb25kaXRpb25GYWlsZWQ7CiAgQERlcHJlY2F0ZWQoIlVzZSByZXF1ZXN0RW50aXR5VG9vTGFyZ2UgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBSRVFVRVNUX0VOVElUWV9UT09fTEFSR0UgPSByZXF1ZXN0RW50aXR5VG9vTGFyZ2U7CiAgQERlcHJlY2F0ZWQoIlVzZSByZXF1ZXN0VXJpVG9vTG9uZyBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IFJFUVVFU1RfVVJJX1RPT19MT05HID0gcmVxdWVzdFVyaVRvb0xvbmc7CiAgQERlcHJlY2F0ZWQoIlVzZSB1bnN1cHBvcnRlZE1lZGlhVHlwZSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IFVOU1VQUE9SVEVEX01FRElBX1RZUEUgPSB1bnN1cHBvcnRlZE1lZGlhVHlwZTsKICBARGVwcmVjYXRlZCgiVXNlIHJlcXVlc3RlZFJhbmdlTm90U2F0aXNmaWFibGUgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBSRVFVRVNURURfUkFOR0VfTk9UX1NBVElTRklBQkxFID0KICAgICAgcmVxdWVzdGVkUmFuZ2VOb3RTYXRpc2ZpYWJsZTsKICBARGVwcmVjYXRlZCgiVXNlIGV4cGVjdGF0aW9uRmFpbGVkIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgRVhQRUNUQVRJT05fRkFJTEVEID0gZXhwZWN0YXRpb25GYWlsZWQ7CiAgQERlcHJlY2F0ZWQoIlVzZSB1cGdyYWRlUmVxdWlyZWQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBVUEdSQURFX1JFUVVJUkVEID0gdXBncmFkZVJlcXVpcmVkOwogIEBEZXByZWNhdGVkKCJVc2UgaW50ZXJuYWxTZXJ2ZXJFcnJvciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IElOVEVSTkFMX1NFUlZFUl9FUlJPUiA9IGludGVybmFsU2VydmVyRXJyb3I7CiAgQERlcHJlY2F0ZWQoIlVzZSBub3RJbXBsZW1lbnRlZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE5PVF9JTVBMRU1FTlRFRCA9IG5vdEltcGxlbWVudGVkOwogIEBEZXByZWNhdGVkKCJVc2UgYmFkR2F0ZXdheSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IEJBRF9HQVRFV0FZID0gYmFkR2F0ZXdheTsKICBARGVwcmVjYXRlZCgiVXNlIHNlcnZpY2VVbmF2YWlsYWJsZSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IFNFUlZJQ0VfVU5BVkFJTEFCTEUgPSBzZXJ2aWNlVW5hdmFpbGFibGU7CiAgQERlcHJlY2F0ZWQoIlVzZSBnYXRld2F5VGltZW91dCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IEdBVEVXQVlfVElNRU9VVCA9IGdhdGV3YXlUaW1lb3V0OwogIEBEZXByZWNhdGVkKCJVc2UgaHR0cFZlcnNpb25Ob3RTdXBwb3J0ZWQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRCA9IGh0dHBWZXJzaW9uTm90U3VwcG9ydGVkOwogIEBEZXByZWNhdGVkKCJVc2UgbmV0d29ya0Nvbm5lY3RUaW1lb3V0RXJyb3IgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBORVRXT1JLX0NPTk5FQ1RfVElNRU9VVF9FUlJPUiA9IG5ldHdvcmtDb25uZWN0VGltZW91dEVycm9yOwp9CoGAAE5OPAEYARoBFAkQEBwbHw4mIBwgARgSFhITEhQZATpLGx4MCAkKCxENDg8QFxITFBUcFxgZGiEcHQMBBEgENDQYARsBJDMBNAIBTxUETywESh4VFSECASEBLARIHicbFhYdIB48DQIBJwQ6LSY4PDACAU9LTCUEDQQMFwRHJwQ2JTAIBE1GBAwSEgQsBA0XOSoEOS0GCAQXBCQ9KE8rBBA/DAQlMkcBQgRCPhsERRIEQDZLEzhFRDUEREw/TDlJSUU/BExKSiEODhgdAgEEOgQcJC0QJR0iIzYkJykQJhAqECEqKyBGIyYjLBAsJScqJCMrKDYpIx8pLTAsLzcsEC0QLhAhECsqEC8QKhA2EDoQNRAuLiklLSkyEDAQLhAnECYQOCM1AScpMD0gHCUmJig5UCcrKjEsNS03LjkjIi45JikpLyYpLzsoLSowLTcnKiYpLjorMzlQLDUmKCIgLDUwPTNFLz0yQjo1JC87LTcxQCw1KC0wPSw1NUk4TwIBDmRhcnQ6X2ludGVybmFsMm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pbnRlcm5hbC9pdGVyYWJsZS5kYXJ0wABeVS8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuX2ludGVybmFsOwoKLyoqCiAqIE1hcmtlciBpbnRlcmZhY2UgZm9yIFtJdGVyYWJsZV0gc3ViY2xhc3NlcyB0aGF0IGhhdmUgYW4gZWZmaWNpZW50CiAqIFtsZW5ndGhdIGltcGxlbWVudGF0aW9uLgogKi8KYWJzdHJhY3QgY2xhc3MgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGU8VD4gZXh0ZW5kcyBJdGVyYWJsZTxUPiB7CiAgY29uc3QgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGUoKTsKICAvKioKICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGl0ZXJhYmxlLgogICAqCiAgICogVGhpcyBpcyBhbiBlZmZpY2llbnQgb3BlcmF0aW9uIHRoYXQgZG9lc24ndCByZXF1aXJlIGl0ZXJhdGluZyB0aHJvdWdoCiAgICogdGhlIGVsZW1lbnRzLgogICAqLwogIGludCBnZXQgbGVuZ3RoOwp9CgovKioKICogQW4gW0l0ZXJhYmxlXSBmb3IgY2xhc3NlcyB0aGF0IGhhdmUgZWZmaWNpZW50IFtsZW5ndGhdIGFuZCBbZWxlbWVudEF0XS4KICoKICogQWxsIG90aGVyIG1ldGhvZHMgYXJlIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIFtsZW5ndGhdIGFuZCBbZWxlbWVudEF0XSwKICogaW5jbHVkaW5nIFtpdGVyYXRvcl0uCiAqLwphYnN0cmFjdCBjbGFzcyBMaXN0SXRlcmFibGU8RT4gZXh0ZW5kcyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxFPiB7CiAgaW50IGdldCBsZW5ndGg7CiAgRSBlbGVtZW50QXQoaW50IGkpOwoKICBjb25zdCBMaXN0SXRlcmFibGUoKTsKCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yID0+IG5ldyBMaXN0SXRlcmF0b3I8RT4odGhpcyk7CgogIHZvaWQgZm9yRWFjaCh2b2lkIGFjdGlvbihFIGVsZW1lbnQpKSB7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGFjdGlvbihlbGVtZW50QXQoaSkpOwogICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgfQogIH0KCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBsZW5ndGggPT0gMDsKCiAgRSBnZXQgZmlyc3QgewogICAgaWYgKGxlbmd0aCA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIHJldHVybiBlbGVtZW50QXQoMCk7CiAgfQoKICBFIGdldCBsYXN0IHsKICAgIGlmIChsZW5ndGggPT0gMCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICByZXR1cm4gZWxlbWVudEF0KGxlbmd0aCAtIDEpOwogIH0KCiAgRSBnZXQgc2luZ2xlIHsKICAgIGlmIChsZW5ndGggPT0gMCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICBpZiAobGVuZ3RoID4gMSkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgcmV0dXJuIGVsZW1lbnRBdCgwKTsKICB9CgogIGJvb2wgY29udGFpbnMoT2JqZWN0IGVsZW1lbnQpIHsKICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGVsZW1lbnRBdChpKSA9PSBlbGVtZW50KSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGJvb2wgZXZlcnkoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKCF0ZXN0KGVsZW1lbnRBdChpKSkpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgYm9vbCBhbnkoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKHRlc3QoZWxlbWVudEF0KGkpKSkgcmV0dXJuIHRydWU7CiAgICAgIGlmIChsZW5ndGggIT0gdGhpcy5sZW5ndGgpIHsKICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBFIGZpcnN0V2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIHtFIG9yRWxzZSgpfSkgewogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBFIGVsZW1lbnQgPSBlbGVtZW50QXQoaSk7CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSByZXR1cm4gZWxlbWVudDsKICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBFIGxhc3RXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwge0Ugb3JFbHNlKCl9KSB7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gbGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgRSBlbGVtZW50ID0gZWxlbWVudEF0KGkpOwogICAgICBpZiAodGVzdChlbGVtZW50KSkgcmV0dXJuIGVsZW1lbnQ7CiAgICAgIGlmIChsZW5ndGggIT0gdGhpcy5sZW5ndGgpIHsKICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICB9CiAgICB9CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRSBzaW5nbGVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwge0Ugb3JFbHNlKCl9KSB7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBFIG1hdGNoID0gbnVsbDsKICAgIGJvb2wgbWF0Y2hGb3VuZCA9IGZhbHNlOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBFIGVsZW1lbnQgPSBlbGVtZW50QXQoaSk7CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSB7CiAgICAgICAgaWYgKG1hdGNoRm91bmQpIHsKICAgICAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLnRvb01hbnkoKTsKICAgICAgICB9CiAgICAgICAgbWF0Y2hGb3VuZCA9IHRydWU7CiAgICAgICAgbWF0Y2ggPSBlbGVtZW50OwogICAgICB9CiAgICAgIGlmIChsZW5ndGggIT0gdGhpcy5sZW5ndGgpIHsKICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICB9CiAgICB9CiAgICBpZiAobWF0Y2hGb3VuZCkgcmV0dXJuIG1hdGNoOwogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIFN0cmluZyBqb2luKFtTdHJpbmcgc2VwYXJhdG9yID0gIiJdKSB7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBpZiAoIXNlcGFyYXRvci5pc0VtcHR5KSB7CiAgICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuICIiOwogICAgICBTdHJpbmcgZmlyc3QgPSAiJHtlbGVtZW50QXQoMCl9IjsKICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoZmlyc3QpOwogICAgICBmb3IgKGludCBpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgYnVmZmVyLndyaXRlKHNlcGFyYXRvcik7CiAgICAgICAgYnVmZmVyLndyaXRlKGVsZW1lbnRBdChpKSk7CiAgICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogICAgfSBlbHNlIHsKICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgIGJ1ZmZlci53cml0ZShlbGVtZW50QXQoaSkpOwogICAgICAgIGlmIChsZW5ndGggIT0gdGhpcy5sZW5ndGgpIHsKICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICAgIH0KICB9CgogIEl0ZXJhYmxlPEU+IHdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBzdXBlci53aGVyZSh0ZXN0KTsKCiAgSXRlcmFibGU8VD4gbWFwPFQ+KFQgZihFIGVsZW1lbnQpKSA9PiBuZXcgTWFwcGVkTGlzdEl0ZXJhYmxlPEUsIFQ+KHRoaXMsIGYpOwoKICBFIHJlZHVjZShFIGNvbWJpbmUoRSB2YWx1ZSwgRSBlbGVtZW50KSkgewogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgaWYgKGxlbmd0aCA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIEUgdmFsdWUgPSBlbGVtZW50QXQoMCk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgZWxlbWVudEF0KGkpKTsKICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CgogIFQgZm9sZDxUPihUIGluaXRpYWxWYWx1ZSwgVCBjb21iaW5lKFQgcHJldmlvdXNWYWx1ZSwgRSBlbGVtZW50KSkgewogICAgdmFyIHZhbHVlID0gaW5pdGlhbFZhbHVlOwogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICB2YWx1ZSA9IGNvbWJpbmUodmFsdWUsIGVsZW1lbnRBdChpKSk7CiAgICAgIGlmIChsZW5ndGggIT0gdGhpcy5sZW5ndGgpIHsKICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBJdGVyYWJsZTxFPiBza2lwKGludCBjb3VudCkgPT4gbmV3IFN1Ykxpc3RJdGVyYWJsZTxFPih0aGlzLCBjb3VudCwgbnVsbCk7CgogIEl0ZXJhYmxlPEU+IHNraXBXaGlsZShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gc3VwZXIuc2tpcFdoaWxlKHRlc3QpOwoKICBJdGVyYWJsZTxFPiB0YWtlKGludCBjb3VudCkgPT4gbmV3IFN1Ykxpc3RJdGVyYWJsZTxFPih0aGlzLCAwLCBjb3VudCk7CgogIEl0ZXJhYmxlPEU+IHRha2VXaGlsZShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gc3VwZXIudGFrZVdoaWxlKHRlc3QpOwoKICBMaXN0PEU+IHRvTGlzdCh7Ym9vbCBncm93YWJsZTogdHJ1ZX0pIHsKICAgIExpc3Q8RT4gcmVzdWx0OwogICAgaWYgKGdyb3dhYmxlKSB7CiAgICAgIHJlc3VsdCA9IDxFPltdLi5sZW5ndGggPSBsZW5ndGg7CiAgICB9IGVsc2UgewogICAgICByZXN1bHQgPSBuZXcgTGlzdDxFPihsZW5ndGgpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICByZXN1bHRbaV0gPSBlbGVtZW50QXQoaSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgU2V0PEU+IHRvU2V0KCkgewogICAgU2V0PEU+IHJlc3VsdCA9IG5ldyBTZXQ8RT4oKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0LmFkZChlbGVtZW50QXQoaSkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KCmNsYXNzIFN1Ykxpc3RJdGVyYWJsZTxFPiBleHRlbmRzIExpc3RJdGVyYWJsZTxFPiB7CiAgZmluYWwgSXRlcmFibGU8RT4gX2l0ZXJhYmxlOyAvLyBIYXMgZWZmaWNpZW50IGxlbmd0aCBhbmQgZWxlbWVudEF0LgogIGZpbmFsIGludCBfc3RhcnQ7CiAgLyoqIElmIG51bGwsIHJlcHJlc2VudHMgdGhlIGxlbmd0aCBvZiB0aGUgaXRlcmFibGUuICovCiAgZmluYWwgaW50IF9lbmRPckxlbmd0aDsKCiAgU3ViTGlzdEl0ZXJhYmxlKHRoaXMuX2l0ZXJhYmxlLCB0aGlzLl9zdGFydCwgdGhpcy5fZW5kT3JMZW5ndGgpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tOb3ROZWdhdGl2ZShfc3RhcnQsICJzdGFydCIpOwogICAgaWYgKF9lbmRPckxlbmd0aCAhPSBudWxsKSB7CiAgICAgIFJhbmdlRXJyb3IuY2hlY2tOb3ROZWdhdGl2ZShfZW5kT3JMZW5ndGgsICJlbmQiKTsKICAgICAgaWYgKF9zdGFydCA+IF9lbmRPckxlbmd0aCkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKF9zdGFydCwgMCwgX2VuZE9yTGVuZ3RoLCAic3RhcnQiKTsKICAgICAgfQogICAgfQogIH0KCiAgaW50IGdldCBfZW5kSW5kZXggewogICAgaW50IGxlbmd0aCA9IF9pdGVyYWJsZS5sZW5ndGg7CiAgICBpZiAoX2VuZE9yTGVuZ3RoID09IG51bGwgfHwgX2VuZE9yTGVuZ3RoID4gbGVuZ3RoKSByZXR1cm4gbGVuZ3RoOwogICAgcmV0dXJuIF9lbmRPckxlbmd0aDsKICB9CgogIGludCBnZXQgX3N0YXJ0SW5kZXggewogICAgaW50IGxlbmd0aCA9IF9pdGVyYWJsZS5sZW5ndGg7CiAgICBpZiAoX3N0YXJ0ID4gbGVuZ3RoKSByZXR1cm4gbGVuZ3RoOwogICAgcmV0dXJuIF9zdGFydDsKICB9CgogIGludCBnZXQgbGVuZ3RoIHsKICAgIGludCBsZW5ndGggPSBfaXRlcmFibGUubGVuZ3RoOwogICAgaWYgKF9zdGFydCA+PSBsZW5ndGgpIHJldHVybiAwOwogICAgaWYgKF9lbmRPckxlbmd0aCA9PSBudWxsIHx8IF9lbmRPckxlbmd0aCA+PSBsZW5ndGgpIHsKICAgICAgcmV0dXJuIGxlbmd0aCAtIF9zdGFydDsKICAgIH0KICAgIHJldHVybiBfZW5kT3JMZW5ndGggLSBfc3RhcnQ7CiAgfQoKICBFIGVsZW1lbnRBdChpbnQgaW5kZXgpIHsKICAgIGludCByZWFsSW5kZXggPSBfc3RhcnRJbmRleCArIGluZGV4OwogICAgaWYgKGluZGV4IDwgMCB8fCByZWFsSW5kZXggPj0gX2VuZEluZGV4KSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfaXRlcmFibGUuZWxlbWVudEF0KHJlYWxJbmRleCk7CiAgfQoKICBJdGVyYWJsZTxFPiBza2lwKGludCBjb3VudCkgewogICAgUmFuZ2VFcnJvci5jaGVja05vdE5lZ2F0aXZlKGNvdW50LCAiY291bnQiKTsKICAgIGludCBuZXdTdGFydCA9IF9zdGFydCArIGNvdW50OwogICAgaWYgKF9lbmRPckxlbmd0aCAhPSBudWxsICYmIG5ld1N0YXJ0ID49IF9lbmRPckxlbmd0aCkgewogICAgICByZXR1cm4gbmV3IEVtcHR5SXRlcmFibGU8RT4oKTsKICAgIH0KICAgIHJldHVybiBuZXcgU3ViTGlzdEl0ZXJhYmxlPEU+KF9pdGVyYWJsZSwgbmV3U3RhcnQsIF9lbmRPckxlbmd0aCk7CiAgfQoKICBJdGVyYWJsZTxFPiB0YWtlKGludCBjb3VudCkgewogICAgUmFuZ2VFcnJvci5jaGVja05vdE5lZ2F0aXZlKGNvdW50LCAiY291bnQiKTsKICAgIGlmIChfZW5kT3JMZW5ndGggPT0gbnVsbCkgewogICAgICByZXR1cm4gbmV3IFN1Ykxpc3RJdGVyYWJsZTxFPihfaXRlcmFibGUsIF9zdGFydCwgX3N0YXJ0ICsgY291bnQpOwogICAgfSBlbHNlIHsKICAgICAgaW50IG5ld0VuZCA9IF9zdGFydCArIGNvdW50OwogICAgICBpZiAoX2VuZE9yTGVuZ3RoIDwgbmV3RW5kKSByZXR1cm4gdGhpczsKICAgICAgcmV0dXJuIG5ldyBTdWJMaXN0SXRlcmFibGU8RT4oX2l0ZXJhYmxlLCBfc3RhcnQsIG5ld0VuZCk7CiAgICB9CiAgfQoKICBMaXN0PEU+IHRvTGlzdCh7Ym9vbCBncm93YWJsZTogdHJ1ZX0pIHsKICAgIGludCBzdGFydCA9IF9zdGFydDsKICAgIGludCBlbmQgPSBfaXRlcmFibGUubGVuZ3RoOwogICAgaWYgKF9lbmRPckxlbmd0aCAhPSBudWxsICYmIF9lbmRPckxlbmd0aCA8IGVuZCkgZW5kID0gX2VuZE9yTGVuZ3RoOwogICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKGxlbmd0aCA8IDApIGxlbmd0aCA9IDA7CiAgICBMaXN0PEU+IHJlc3VsdCA9CiAgICAgICAgZ3Jvd2FibGUgPyAobmV3IExpc3Q8RT4oKS4ubGVuZ3RoID0gbGVuZ3RoKSA6IG5ldyBMaXN0PEU+KGxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc3VsdFtpXSA9IF9pdGVyYWJsZS5lbGVtZW50QXQoc3RhcnQgKyBpKTsKICAgICAgaWYgKF9pdGVyYWJsZS5sZW5ndGggPCBlbmQpIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQoKLyoqCiAqIEFuIFtJdGVyYXRvcl0gdGhhdCBpdGVyYXRlcyBhIGxpc3QtbGlrZSBbSXRlcmFibGVdLgogKgogKiBBbGwgaXRlcmF0aW9ucyBpcyBkb25lIGluIHRlcm1zIG9mIFtJdGVyYWJsZS5sZW5ndGhdIGFuZAogKiBbSXRlcmFibGUuZWxlbWVudEF0XS4gVGhlc2Ugb3BlcmF0aW9ucyBhcmUgZmFzdCBmb3IgbGlzdC1saWtlCiAqIGl0ZXJhYmxlcy4KICovCmNsYXNzIExpc3RJdGVyYXRvcjxFPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKICBmaW5hbCBJdGVyYWJsZTxFPiBfaXRlcmFibGU7CiAgZmluYWwgaW50IF9sZW5ndGg7CiAgaW50IF9pbmRleDsKICBFIF9jdXJyZW50OwoKICBMaXN0SXRlcmF0b3IoSXRlcmFibGU8RT4gaXRlcmFibGUpCiAgICAgIDogX2l0ZXJhYmxlID0gaXRlcmFibGUsCiAgICAgICAgX2xlbmd0aCA9IGl0ZXJhYmxlLmxlbmd0aCwKICAgICAgICBfaW5kZXggPSAwOwoKICBFIGdldCBjdXJyZW50ID0+IF9jdXJyZW50OwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaW50IGxlbmd0aCA9IF9pdGVyYWJsZS5sZW5ndGg7CiAgICBpZiAoX2xlbmd0aCAhPSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcihfaXRlcmFibGUpOwogICAgfQogICAgaWYgKF9pbmRleCA+PSBsZW5ndGgpIHsKICAgICAgX2N1cnJlbnQgPSBudWxsOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBfY3VycmVudCA9IF9pdGVyYWJsZS5lbGVtZW50QXQoX2luZGV4KTsKICAgIF9pbmRleCsrOwogICAgcmV0dXJuIHRydWU7CiAgfQp9Cgp0eXBlZGVmIFQgX1RyYW5zZm9ybWF0aW9uPFMsIFQ+KFMgdmFsdWUpOwoKY2xhc3MgTWFwcGVkSXRlcmFibGU8UywgVD4gZXh0ZW5kcyBJdGVyYWJsZTxUPiB7CiAgZmluYWwgSXRlcmFibGU8Uz4gX2l0ZXJhYmxlOwogIGZpbmFsIF9UcmFuc2Zvcm1hdGlvbjxTLCBUPiBfZjsKCiAgZmFjdG9yeSBNYXBwZWRJdGVyYWJsZShJdGVyYWJsZTxTPiBpdGVyYWJsZSwgVCBmdW5jdGlvbihTIHZhbHVlKSkgewogICAgaWYgKGl0ZXJhYmxlIGlzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlKSB7CiAgICAgIHJldHVybiBuZXcgRWZmaWNpZW50TGVuZ3RoTWFwcGVkSXRlcmFibGU8UywgVD4oaXRlcmFibGUsIGZ1bmN0aW9uKTsKICAgIH0KICAgIHJldHVybiBuZXcgTWFwcGVkSXRlcmFibGU8UywgVD4uXyhpdGVyYWJsZSwgZnVuY3Rpb24pOwogIH0KCiAgTWFwcGVkSXRlcmFibGUuXyh0aGlzLl9pdGVyYWJsZSwgdGhpcy5fZik7CgogIEl0ZXJhdG9yPFQ+IGdldCBpdGVyYXRvciA9PiBuZXcgTWFwcGVkSXRlcmF0b3I8UywgVD4oX2l0ZXJhYmxlLml0ZXJhdG9yLCBfZik7CgogIC8vIExlbmd0aCByZWxhdGVkIGZ1bmN0aW9ucyBhcmUgaW5kZXBlbmRlbnQgb2YgdGhlIG1hcHBpbmcuCiAgaW50IGdldCBsZW5ndGggPT4gX2l0ZXJhYmxlLmxlbmd0aDsKICBib29sIGdldCBpc0VtcHR5ID0+IF9pdGVyYWJsZS5pc0VtcHR5OwoKICAvLyBJbmRleCBiYXNlZCBsb29rdXAgY2FuIGJlIGRvbmUgYmVmb3JlIHRyYW5zZm9ybWluZy4KICBUIGdldCBmaXJzdCA9PiBfZihfaXRlcmFibGUuZmlyc3QpOwogIFQgZ2V0IGxhc3QgPT4gX2YoX2l0ZXJhYmxlLmxhc3QpOwogIFQgZ2V0IHNpbmdsZSA9PiBfZihfaXRlcmFibGUuc2luZ2xlKTsKICBUIGVsZW1lbnRBdChpbnQgaW5kZXgpID0+IF9mKF9pdGVyYWJsZS5lbGVtZW50QXQoaW5kZXgpKTsKfQoKY2xhc3MgRWZmaWNpZW50TGVuZ3RoTWFwcGVkSXRlcmFibGU8UywgVD4gZXh0ZW5kcyBNYXBwZWRJdGVyYWJsZTxTLCBUPgogICAgaW1wbGVtZW50cyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxUPiB7CiAgRWZmaWNpZW50TGVuZ3RoTWFwcGVkSXRlcmFibGUoSXRlcmFibGU8Uz4gaXRlcmFibGUsIFQgZnVuY3Rpb24oUyB2YWx1ZSkpCiAgICAgIDogc3VwZXIuXyhpdGVyYWJsZSwgZnVuY3Rpb24pOwp9CgpjbGFzcyBNYXBwZWRJdGVyYXRvcjxTLCBUPiBleHRlbmRzIEl0ZXJhdG9yPFQ+IHsKICBUIF9jdXJyZW50OwogIGZpbmFsIEl0ZXJhdG9yPFM+IF9pdGVyYXRvcjsKICBmaW5hbCBfVHJhbnNmb3JtYXRpb248UywgVD4gX2Y7CgogIE1hcHBlZEl0ZXJhdG9yKHRoaXMuX2l0ZXJhdG9yLCB0aGlzLl9mKTsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmIChfaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICBfY3VycmVudCA9IF9mKF9pdGVyYXRvci5jdXJyZW50KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBfY3VycmVudCA9IG51bGw7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBUIGdldCBjdXJyZW50ID0+IF9jdXJyZW50Owp9CgovKioKICogU3BlY2lhbGl6ZWQgYWx0ZXJuYXRpdmUgdG8gW01hcHBlZEl0ZXJhYmxlXSBmb3IgbWFwcGVkIFtMaXN0XXMuCiAqCiAqIEV4cGVjdHMgZWZmaWNpZW50IGBsZW5ndGhgIGFuZCBgZWxlbWVudEF0YCBvbiB0aGUgc291cmNlIGl0ZXJhYmxlLgogKi8KY2xhc3MgTWFwcGVkTGlzdEl0ZXJhYmxlPFMsIFQ+IGV4dGVuZHMgTGlzdEl0ZXJhYmxlPFQ+IHsKICBmaW5hbCBJdGVyYWJsZTxTPiBfc291cmNlOwogIGZpbmFsIF9UcmFuc2Zvcm1hdGlvbjxTLCBUPiBfZjsKCiAgTWFwcGVkTGlzdEl0ZXJhYmxlKHRoaXMuX3NvdXJjZSwgdGhpcy5fZik7CgogIGludCBnZXQgbGVuZ3RoID0+IF9zb3VyY2UubGVuZ3RoOwogIFQgZWxlbWVudEF0KGludCBpbmRleCkgPT4gX2YoX3NvdXJjZS5lbGVtZW50QXQoaW5kZXgpKTsKfQoKdHlwZWRlZiBib29sIF9FbGVtZW50UHJlZGljYXRlPEU+KEUgZWxlbWVudCk7CgpjbGFzcyBXaGVyZUl0ZXJhYmxlPEU+IGV4dGVuZHMgSXRlcmFibGU8RT4gewogIGZpbmFsIEl0ZXJhYmxlPEU+IF9pdGVyYWJsZTsKICBmaW5hbCBfRWxlbWVudFByZWRpY2F0ZTxFPiBfZjsKCiAgV2hlcmVJdGVyYWJsZSh0aGlzLl9pdGVyYWJsZSwgdGhpcy5fZik7CgogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciA9PiBuZXcgV2hlcmVJdGVyYXRvcjxFPihfaXRlcmFibGUuaXRlcmF0b3IsIF9mKTsKCiAgLy8gU3BlY2lhbGl6YXRpb24gb2YgW0l0ZXJhYmxlLm1hcF0gdG8gbm9uLUVmZmljaWVudExlbmd0aEl0ZXJhYmxlLgogIEl0ZXJhYmxlPFQ+IG1hcDxUPihUIGYoRSBlbGVtZW50KSkgPT4gbmV3IE1hcHBlZEl0ZXJhYmxlPEUsIFQ+Ll8odGhpcywgZik7Cn0KCmNsYXNzIFdoZXJlSXRlcmF0b3I8RT4gZXh0ZW5kcyBJdGVyYXRvcjxFPiB7CiAgZmluYWwgSXRlcmF0b3I8RT4gX2l0ZXJhdG9yOwogIGZpbmFsIF9FbGVtZW50UHJlZGljYXRlPEU+IF9mOwoKICBXaGVyZUl0ZXJhdG9yKHRoaXMuX2l0ZXJhdG9yLCB0aGlzLl9mKTsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIHdoaWxlIChfaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICBpZiAoX2YoX2l0ZXJhdG9yLmN1cnJlbnQpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEUgZ2V0IGN1cnJlbnQgPT4gX2l0ZXJhdG9yLmN1cnJlbnQ7Cn0KCnR5cGVkZWYgSXRlcmFibGU8VD4gX0V4cGFuZEZ1bmN0aW9uPFMsIFQ+KFMgc291cmNlRWxlbWVudCk7CgpjbGFzcyBFeHBhbmRJdGVyYWJsZTxTLCBUPiBleHRlbmRzIEl0ZXJhYmxlPFQ+IHsKICBmaW5hbCBJdGVyYWJsZTxTPiBfaXRlcmFibGU7CiAgZmluYWwgX0V4cGFuZEZ1bmN0aW9uPFMsIFQ+IF9mOwoKICBFeHBhbmRJdGVyYWJsZSh0aGlzLl9pdGVyYWJsZSwgdGhpcy5fZik7CgogIEl0ZXJhdG9yPFQ+IGdldCBpdGVyYXRvciA9PiBuZXcgRXhwYW5kSXRlcmF0b3I8UywgVD4oX2l0ZXJhYmxlLml0ZXJhdG9yLCBfZik7Cn0KCmNsYXNzIEV4cGFuZEl0ZXJhdG9yPFMsIFQ+IGltcGxlbWVudHMgSXRlcmF0b3I8VD4gewogIGZpbmFsIEl0ZXJhdG9yPFM+IF9pdGVyYXRvcjsKICBmaW5hbCBfRXhwYW5kRnVuY3Rpb248UywgVD4gX2Y7CiAgLy8gSW5pdGlhbGl6ZSBfY3VycmVudEV4cGFuc2lvbiB0byBhbiBlbXB0eSBpdGVyYWJsZS4gQSBudWxsIHZhbHVlCiAgLy8gbWFya3MgdGhlIGVuZCBvZiBpdGVyYXRpb24sIGFuZCB3ZSBkb24ndCB3YW50IHRvIGNhbGwgX2YgYmVmb3JlCiAgLy8gdGhlIGZpcnN0IG1vdmVOZXh0IGNhbGwuCiAgSXRlcmF0b3I8VD4gX2N1cnJlbnRFeHBhbnNpb24gPSBjb25zdCBFbXB0eUl0ZXJhdG9yKCk7CiAgVCBfY3VycmVudDsKCiAgRXhwYW5kSXRlcmF0b3IodGhpcy5faXRlcmF0b3IsIHRoaXMuX2YpOwoKICBUIGdldCBjdXJyZW50ID0+IF9jdXJyZW50OwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKF9jdXJyZW50RXhwYW5zaW9uID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIHdoaWxlICghX2N1cnJlbnRFeHBhbnNpb24ubW92ZU5leHQoKSkgewogICAgICBfY3VycmVudCA9IG51bGw7CiAgICAgIGlmIChfaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICAgIC8vIElmIF9mIHRocm93cywgdGhpcyBlbmRzIGl0ZXJhdGlvbi4gT3RoZXJ3aXNlIF9jdXJyZW50RXhwYW5zaW9uIGFuZAogICAgICAgIC8vIF9jdXJyZW50IHdpbGwgYmUgc2V0IGFnYWluIGJlbG93LgogICAgICAgIF9jdXJyZW50RXhwYW5zaW9uID0gbnVsbDsKICAgICAgICBfY3VycmVudEV4cGFuc2lvbiA9IF9mKF9pdGVyYXRvci5jdXJyZW50KS5pdGVyYXRvcjsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIF9jdXJyZW50ID0gX2N1cnJlbnRFeHBhbnNpb24uY3VycmVudDsKICAgIHJldHVybiB0cnVlOwogIH0KfQoKY2xhc3MgVGFrZUl0ZXJhYmxlPEU+IGV4dGVuZHMgSXRlcmFibGU8RT4gewogIGZpbmFsIEl0ZXJhYmxlPEU+IF9pdGVyYWJsZTsKICBmaW5hbCBpbnQgX3Rha2VDb3VudDsKCiAgZmFjdG9yeSBUYWtlSXRlcmFibGUoSXRlcmFibGU8RT4gaXRlcmFibGUsIGludCB0YWtlQ291bnQpIHsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKHRha2VDb3VudCwgInRha2VDb3VudCIpOwogICAgUmFuZ2VFcnJvci5jaGVja05vdE5lZ2F0aXZlKHRha2VDb3VudCwgInRha2VDb3VudCIpOwogICAgaWYgKGl0ZXJhYmxlIGlzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlKSB7CiAgICAgIHJldHVybiBuZXcgRWZmaWNpZW50TGVuZ3RoVGFrZUl0ZXJhYmxlPEU+KGl0ZXJhYmxlLCB0YWtlQ291bnQpOwogICAgfQogICAgcmV0dXJuIG5ldyBUYWtlSXRlcmFibGU8RT4uXyhpdGVyYWJsZSwgdGFrZUNvdW50KTsKICB9CgogIFRha2VJdGVyYWJsZS5fKHRoaXMuX2l0ZXJhYmxlLCB0aGlzLl90YWtlQ291bnQpOwoKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3IgewogICAgcmV0dXJuIG5ldyBUYWtlSXRlcmF0b3I8RT4oX2l0ZXJhYmxlLml0ZXJhdG9yLCBfdGFrZUNvdW50KTsKICB9Cn0KCmNsYXNzIEVmZmljaWVudExlbmd0aFRha2VJdGVyYWJsZTxFPiBleHRlbmRzIFRha2VJdGVyYWJsZTxFPgogICAgaW1wbGVtZW50cyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxFPiB7CiAgRWZmaWNpZW50TGVuZ3RoVGFrZUl0ZXJhYmxlKEl0ZXJhYmxlPEU+IGl0ZXJhYmxlLCBpbnQgdGFrZUNvdW50KQogICAgICA6IHN1cGVyLl8oaXRlcmFibGUsIHRha2VDb3VudCk7CgogIGludCBnZXQgbGVuZ3RoIHsKICAgIGludCBpdGVyYWJsZUxlbmd0aCA9IF9pdGVyYWJsZS5sZW5ndGg7CiAgICBpZiAoaXRlcmFibGVMZW5ndGggPiBfdGFrZUNvdW50KSByZXR1cm4gX3Rha2VDb3VudDsKICAgIHJldHVybiBpdGVyYWJsZUxlbmd0aDsKICB9Cn0KCmNsYXNzIFRha2VJdGVyYXRvcjxFPiBleHRlbmRzIEl0ZXJhdG9yPEU+IHsKICBmaW5hbCBJdGVyYXRvcjxFPiBfaXRlcmF0b3I7CiAgaW50IF9yZW1haW5pbmc7CgogIFRha2VJdGVyYXRvcih0aGlzLl9pdGVyYXRvciwgdGhpcy5fcmVtYWluaW5nKSB7CiAgICBhc3NlcnQoX3JlbWFpbmluZyA+PSAwKTsKICB9CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBfcmVtYWluaW5nLS07CiAgICBpZiAoX3JlbWFpbmluZyA+PSAwKSB7CiAgICAgIHJldHVybiBfaXRlcmF0b3IubW92ZU5leHQoKTsKICAgIH0KICAgIF9yZW1haW5pbmcgPSAtMTsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEUgZ2V0IGN1cnJlbnQgewogICAgaWYgKF9yZW1haW5pbmcgPCAwKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBfaXRlcmF0b3IuY3VycmVudDsKICB9Cn0KCmNsYXNzIFRha2VXaGlsZUl0ZXJhYmxlPEU+IGV4dGVuZHMgSXRlcmFibGU8RT4gewogIGZpbmFsIEl0ZXJhYmxlPEU+IF9pdGVyYWJsZTsKICBmaW5hbCBfRWxlbWVudFByZWRpY2F0ZTxFPiBfZjsKCiAgVGFrZVdoaWxlSXRlcmFibGUodGhpcy5faXRlcmFibGUsIHRoaXMuX2YpOwoKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3IgewogICAgcmV0dXJuIG5ldyBUYWtlV2hpbGVJdGVyYXRvcjxFPihfaXRlcmFibGUuaXRlcmF0b3IsIF9mKTsKICB9Cn0KCmNsYXNzIFRha2VXaGlsZUl0ZXJhdG9yPEU+IGV4dGVuZHMgSXRlcmF0b3I8RT4gewogIGZpbmFsIEl0ZXJhdG9yPEU+IF9pdGVyYXRvcjsKICBmaW5hbCBfRWxlbWVudFByZWRpY2F0ZTxFPiBfZjsKICBib29sIF9pc0ZpbmlzaGVkID0gZmFsc2U7CgogIFRha2VXaGlsZUl0ZXJhdG9yKHRoaXMuX2l0ZXJhdG9yLCB0aGlzLl9mKTsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmIChfaXNGaW5pc2hlZCkgcmV0dXJuIGZhbHNlOwogICAgaWYgKCFfaXRlcmF0b3IubW92ZU5leHQoKSB8fCAhX2YoX2l0ZXJhdG9yLmN1cnJlbnQpKSB7CiAgICAgIF9pc0ZpbmlzaGVkID0gdHJ1ZTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBFIGdldCBjdXJyZW50IHsKICAgIGlmIChfaXNGaW5pc2hlZCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gX2l0ZXJhdG9yLmN1cnJlbnQ7CiAgfQp9CgpjbGFzcyBTa2lwSXRlcmFibGU8RT4gZXh0ZW5kcyBJdGVyYWJsZTxFPiB7CiAgZmluYWwgSXRlcmFibGU8RT4gX2l0ZXJhYmxlOwogIGZpbmFsIGludCBfc2tpcENvdW50OwoKICBmYWN0b3J5IFNraXBJdGVyYWJsZShJdGVyYWJsZTxFPiBpdGVyYWJsZSwgaW50IGNvdW50KSB7CiAgICBpZiAoaXRlcmFibGUgaXMgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGUpIHsKICAgICAgcmV0dXJuIG5ldyBFZmZpY2llbnRMZW5ndGhTa2lwSXRlcmFibGU8RT4oaXRlcmFibGUsIGNvdW50KTsKICAgIH0KICAgIHJldHVybiBuZXcgU2tpcEl0ZXJhYmxlPEU+Ll8oaXRlcmFibGUsIF9jaGVja0NvdW50KGNvdW50KSk7CiAgfQoKICBTa2lwSXRlcmFibGUuXyh0aGlzLl9pdGVyYWJsZSwgdGhpcy5fc2tpcENvdW50KTsKCiAgSXRlcmFibGU8RT4gc2tpcChpbnQgY291bnQpIHsKICAgIHJldHVybiBuZXcgU2tpcEl0ZXJhYmxlPEU+Ll8oX2l0ZXJhYmxlLCBfc2tpcENvdW50ICsgX2NoZWNrQ291bnQoY291bnQpKTsKICB9CgogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciB7CiAgICByZXR1cm4gbmV3IFNraXBJdGVyYXRvcjxFPihfaXRlcmFibGUuaXRlcmF0b3IsIF9za2lwQ291bnQpOwogIH0KfQoKY2xhc3MgRWZmaWNpZW50TGVuZ3RoU2tpcEl0ZXJhYmxlPEU+IGV4dGVuZHMgU2tpcEl0ZXJhYmxlPEU+CiAgICBpbXBsZW1lbnRzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+IHsKICBmYWN0b3J5IEVmZmljaWVudExlbmd0aFNraXBJdGVyYWJsZShJdGVyYWJsZTxFPiBpdGVyYWJsZSwgaW50IGNvdW50KSB7CiAgICByZXR1cm4gbmV3IEVmZmljaWVudExlbmd0aFNraXBJdGVyYWJsZTxFPi5fKGl0ZXJhYmxlLCBfY2hlY2tDb3VudChjb3VudCkpOwogIH0KCiAgRWZmaWNpZW50TGVuZ3RoU2tpcEl0ZXJhYmxlLl8oSXRlcmFibGU8RT4gaXRlcmFibGUsIGludCBjb3VudCkKICAgICAgOiBzdXBlci5fKGl0ZXJhYmxlLCBjb3VudCk7CgogIGludCBnZXQgbGVuZ3RoIHsKICAgIGludCBsZW5ndGggPSBfaXRlcmFibGUubGVuZ3RoIC0gX3NraXBDb3VudDsKICAgIGlmIChsZW5ndGggPj0gMCkgcmV0dXJuIGxlbmd0aDsKICAgIHJldHVybiAwOwogIH0KCiAgSXRlcmFibGU8RT4gc2tpcChpbnQgY291bnQpIHsKICAgIHJldHVybiBuZXcgRWZmaWNpZW50TGVuZ3RoU2tpcEl0ZXJhYmxlPEU+Ll8oCiAgICAgICAgX2l0ZXJhYmxlLCBfc2tpcENvdW50ICsgX2NoZWNrQ291bnQoY291bnQpKTsKICB9Cn0KCmludCBfY2hlY2tDb3VudChpbnQgY291bnQpIHsKICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChjb3VudCwgImNvdW50Iik7CiAgUmFuZ2VFcnJvci5jaGVja05vdE5lZ2F0aXZlKGNvdW50LCAiY291bnQiKTsKICByZXR1cm4gY291bnQ7Cn0KCmNsYXNzIFNraXBJdGVyYXRvcjxFPiBleHRlbmRzIEl0ZXJhdG9yPEU+IHsKICBmaW5hbCBJdGVyYXRvcjxFPiBfaXRlcmF0b3I7CiAgaW50IF9za2lwQ291bnQ7CgogIFNraXBJdGVyYXRvcih0aGlzLl9pdGVyYXRvciwgdGhpcy5fc2tpcENvdW50KSB7CiAgICBhc3NlcnQoX3NraXBDb3VudCA+PSAwKTsKICB9CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IF9za2lwQ291bnQ7IGkrKykgX2l0ZXJhdG9yLm1vdmVOZXh0KCk7CiAgICBfc2tpcENvdW50ID0gMDsKICAgIHJldHVybiBfaXRlcmF0b3IubW92ZU5leHQoKTsKICB9CgogIEUgZ2V0IGN1cnJlbnQgPT4gX2l0ZXJhdG9yLmN1cnJlbnQ7Cn0KCmNsYXNzIFNraXBXaGlsZUl0ZXJhYmxlPEU+IGV4dGVuZHMgSXRlcmFibGU8RT4gewogIGZpbmFsIEl0ZXJhYmxlPEU+IF9pdGVyYWJsZTsKICBmaW5hbCBfRWxlbWVudFByZWRpY2F0ZTxFPiBfZjsKCiAgU2tpcFdoaWxlSXRlcmFibGUodGhpcy5faXRlcmFibGUsIHRoaXMuX2YpOwoKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3IgewogICAgcmV0dXJuIG5ldyBTa2lwV2hpbGVJdGVyYXRvcjxFPihfaXRlcmFibGUuaXRlcmF0b3IsIF9mKTsKICB9Cn0KCmNsYXNzIFNraXBXaGlsZUl0ZXJhdG9yPEU+IGV4dGVuZHMgSXRlcmF0b3I8RT4gewogIGZpbmFsIEl0ZXJhdG9yPEU+IF9pdGVyYXRvcjsKICBmaW5hbCBfRWxlbWVudFByZWRpY2F0ZTxFPiBfZjsKICBib29sIF9oYXNTa2lwcGVkID0gZmFsc2U7CgogIFNraXBXaGlsZUl0ZXJhdG9yKHRoaXMuX2l0ZXJhdG9yLCB0aGlzLl9mKTsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmICghX2hhc1NraXBwZWQpIHsKICAgICAgX2hhc1NraXBwZWQgPSB0cnVlOwogICAgICB3aGlsZSAoX2l0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgICBpZiAoIV9mKF9pdGVyYXRvci5jdXJyZW50KSkgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfaXRlcmF0b3IubW92ZU5leHQoKTsKICB9CgogIEUgZ2V0IGN1cnJlbnQgPT4gX2l0ZXJhdG9yLmN1cnJlbnQ7Cn0KCi8qKgogKiBUaGUgYWx3YXlzIGVtcHR5IFtJdGVyYWJsZV0uCiAqLwpjbGFzcyBFbXB0eUl0ZXJhYmxlPEU+IGV4dGVuZHMgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGU8RT4gewogIGNvbnN0IEVtcHR5SXRlcmFibGUoKTsKCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yID0+IGNvbnN0IEVtcHR5SXRlcmF0b3IoKTsKCiAgdm9pZCBmb3JFYWNoKHZvaWQgYWN0aW9uKEUgZWxlbWVudCkpIHt9CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gdHJ1ZTsKCiAgaW50IGdldCBsZW5ndGggPT4gMDsKCiAgRSBnZXQgZmlyc3QgewogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBFIGdldCBsYXN0IHsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRSBnZXQgc2luZ2xlIHsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRSBlbGVtZW50QXQoaW50IGluZGV4KSB7CiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShpbmRleCwgMCwgMCwgImluZGV4Iik7CiAgfQoKICBib29sIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KSA9PiBmYWxzZTsKCiAgYm9vbCBldmVyeShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gdHJ1ZTsKCiAgYm9vbCBhbnkoYm9vbCB0ZXN0KEUgZWxlbWVudCkpID0+IGZhbHNlOwoKICBFIGZpcnN0V2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIHtFIG9yRWxzZSgpfSkgewogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEUgbGFzdFdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCB7RSBvckVsc2UoKX0pIHsKICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBFIHNpbmdsZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCB7RSBvckVsc2UoKX0pIHsKICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBTdHJpbmcgam9pbihbU3RyaW5nIHNlcGFyYXRvciA9ICIiXSkgPT4gIiI7CgogIEl0ZXJhYmxlPEU+IHdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiB0aGlzOwoKICBJdGVyYWJsZTxUPiBtYXA8VD4oVCBmKEUgZWxlbWVudCkpID0+IG5ldyBFbXB0eUl0ZXJhYmxlPFQ+KCk7CgogIEUgcmVkdWNlKEUgY29tYmluZShFIHZhbHVlLCBFIGVsZW1lbnQpKSB7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIFQgZm9sZDxUPihUIGluaXRpYWxWYWx1ZSwgVCBjb21iaW5lKFQgcHJldmlvdXNWYWx1ZSwgRSBlbGVtZW50KSkgewogICAgcmV0dXJuIGluaXRpYWxWYWx1ZTsKICB9CgogIEl0ZXJhYmxlPEU+IHNraXAoaW50IGNvdW50KSB7CiAgICBSYW5nZUVycm9yLmNoZWNrTm90TmVnYXRpdmUoY291bnQsICJjb3VudCIpOwogICAgcmV0dXJuIHRoaXM7CiAgfQoKICBJdGVyYWJsZTxFPiBza2lwV2hpbGUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpID0+IHRoaXM7CgogIEl0ZXJhYmxlPEU+IHRha2UoaW50IGNvdW50KSB7CiAgICBSYW5nZUVycm9yLmNoZWNrTm90TmVnYXRpdmUoY291bnQsICJjb3VudCIpOwogICAgcmV0dXJuIHRoaXM7CiAgfQoKICBJdGVyYWJsZTxFPiB0YWtlV2hpbGUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpID0+IHRoaXM7CgogIExpc3Q8RT4gdG9MaXN0KHtib29sIGdyb3dhYmxlOiB0cnVlfSkgPT4gZ3Jvd2FibGUgPyA8RT5bXSA6IG5ldyBMaXN0PEU+KDApOwoKICBTZXQ8RT4gdG9TZXQoKSA9PiBuZXcgU2V0PEU+KCk7Cn0KCi8qKiBUaGUgYWx3YXlzIGVtcHR5IGl0ZXJhdG9yLiAqLwpjbGFzcyBFbXB0eUl0ZXJhdG9yPEU+IGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewogIGNvbnN0IEVtcHR5SXRlcmF0b3IoKTsKICBib29sIG1vdmVOZXh0KCkgPT4gZmFsc2U7CiAgRSBnZXQgY3VycmVudCA9PiBudWxsOwp9CgpjbGFzcyBGb2xsb3dlZEJ5SXRlcmFibGU8RT4gZXh0ZW5kcyBJdGVyYWJsZTxFPiB7CiAgZmluYWwgSXRlcmFibGU8RT4gX2ZpcnN0OwogIGZpbmFsIEl0ZXJhYmxlPEU+IF9zZWNvbmQ7CiAgRm9sbG93ZWRCeUl0ZXJhYmxlKHRoaXMuX2ZpcnN0LCB0aGlzLl9zZWNvbmQpOwoKICBmYWN0b3J5IEZvbGxvd2VkQnlJdGVyYWJsZS5maXJzdEVmZmljaWVudCgKICAgICAgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGU8RT4gZmlyc3QsIEl0ZXJhYmxlPEU+IHNlY29uZCkgewogICAgaWYgKHNlY29uZCBpcyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxFPikgewogICAgICByZXR1cm4gbmV3IEVmZmljaWVudExlbmd0aEZvbGxvd2VkQnlJdGVyYWJsZTxFPihmaXJzdCwgc2Vjb25kKTsKICAgIH0KICAgIHJldHVybiBuZXcgRm9sbG93ZWRCeUl0ZXJhYmxlPEU+KGZpcnN0LCBzZWNvbmQpOwogIH0KCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yID0+IG5ldyBGb2xsb3dlZEJ5SXRlcmF0b3IoX2ZpcnN0LCBfc2Vjb25kKTsKCiAgaW50IGdldCBsZW5ndGggPT4gX2ZpcnN0Lmxlbmd0aCArIF9zZWNvbmQubGVuZ3RoOwogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2ZpcnN0LmlzRW1wdHkgJiYgX3NlY29uZC5pc0VtcHR5OwogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gX2ZpcnN0LmlzTm90RW1wdHkgfHwgX3NlY29uZC5pc05vdEVtcHR5OwoKICAvLyBNYXkgYmUgbW9yZSBlZmZpY2llbnQgaWYgZWl0aGVyIGl0ZXJhYmxlIGlzIGEgU2V0LgogIGJvb2wgY29udGFpbnMoT2JqZWN0IHZhbHVlKSA9PgogICAgICBfZmlyc3QuY29udGFpbnModmFsdWUpIHx8IF9zZWNvbmQuY29udGFpbnModmFsdWUpOwoKICBFIGdldCBmaXJzdCB7CiAgICB2YXIgaXRlcmF0b3IgPSBfZmlyc3QuaXRlcmF0b3I7CiAgICBpZiAoaXRlcmF0b3IubW92ZU5leHQoKSkgcmV0dXJuIGl0ZXJhdG9yLmN1cnJlbnQ7CiAgICByZXR1cm4gX3NlY29uZC5maXJzdDsKICB9CgogIEUgZ2V0IGxhc3QgewogICAgdmFyIGl0ZXJhdG9yID0gX3NlY29uZC5pdGVyYXRvcjsKICAgIGlmIChpdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgIEUgbGFzdCA9IGl0ZXJhdG9yLmN1cnJlbnQ7CiAgICAgIHdoaWxlIChpdGVyYXRvci5tb3ZlTmV4dCgpKSBsYXN0ID0gaXRlcmF0b3IuY3VycmVudDsKICAgICAgcmV0dXJuIGxhc3Q7CiAgICB9CiAgICByZXR1cm4gX2ZpcnN0Lmxhc3Q7CiAgfQoKICAvLyBJZiBsaW5lYXIgc2VxdWVuY2VzIG9mIGBmb2xsb3dlZEJ5YCBiZWNvbWVzIGFuIGlzc3VlLCB3ZSBjYW4gZmxhdHRlbgogIC8vIGludG8gYSBsaXN0IG9mIGl0ZXJhYmxlcyBpbnN0ZWFkIG9mIGEgdHJlZSBvciBzcGluZS4KfQoKY2xhc3MgRWZmaWNpZW50TGVuZ3RoRm9sbG93ZWRCeUl0ZXJhYmxlPEU+IGV4dGVuZHMgRm9sbG93ZWRCeUl0ZXJhYmxlPEU+CiAgICBpbXBsZW1lbnRzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+IHsKICBFZmZpY2llbnRMZW5ndGhGb2xsb3dlZEJ5SXRlcmFibGUoCiAgICAgIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+IGZpcnN0LCBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxFPiBzZWNvbmQpCiAgICAgIDogc3VwZXIoZmlyc3QsIHNlY29uZCk7CgogIEl0ZXJhYmxlPEU+IHNraXAoaW50IGNvdW50KSB7CiAgICBpbnQgZmlyc3RMZW5ndGggPSBfZmlyc3QubGVuZ3RoOwogICAgaWYgKGNvdW50ID49IGZpcnN0TGVuZ3RoKSByZXR1cm4gX3NlY29uZC5za2lwKGNvdW50IC0gZmlyc3RMZW5ndGgpOwogICAgcmV0dXJuIG5ldyBFZmZpY2llbnRMZW5ndGhGb2xsb3dlZEJ5SXRlcmFibGU8RT4oCiAgICAgICAgX2ZpcnN0LnNraXAoY291bnQpLCBfc2Vjb25kKTsKICB9CgogIEl0ZXJhYmxlPEU+IHRha2UoaW50IGNvdW50KSB7CiAgICBpbnQgZmlyc3RMZW5ndGggPSBfZmlyc3QubGVuZ3RoOwogICAgaWYgKGNvdW50IDw9IGZpcnN0TGVuZ3RoKSByZXR1cm4gX2ZpcnN0LnRha2UoY291bnQpOwogICAgcmV0dXJuIG5ldyBFZmZpY2llbnRMZW5ndGhGb2xsb3dlZEJ5SXRlcmFibGU8RT4oCiAgICAgICAgX2ZpcnN0LCBfc2Vjb25kLnRha2UoY291bnQgLSBmaXJzdExlbmd0aCkpOwogIH0KCiAgRSBlbGVtZW50QXQoaW50IGluZGV4KSB7CiAgICBpbnQgZmlyc3RMZW5ndGggPSBfZmlyc3QubGVuZ3RoOwogICAgaWYgKGluZGV4IDwgZmlyc3RMZW5ndGgpIHJldHVybiBfZmlyc3QuZWxlbWVudEF0KGluZGV4KTsKICAgIHJldHVybiBfc2Vjb25kLmVsZW1lbnRBdChpbmRleCAtIGZpcnN0TGVuZ3RoKTsKICB9CgogIEUgZ2V0IGZpcnN0IHsKICAgIGlmIChfZmlyc3QuaXNOb3RFbXB0eSkgcmV0dXJuIF9maXJzdC5maXJzdDsKICAgIHJldHVybiBfc2Vjb25kLmZpcnN0OwogIH0KCiAgRSBnZXQgbGFzdCB7CiAgICBpZiAoX3NlY29uZC5pc05vdEVtcHR5KSByZXR1cm4gX3NlY29uZC5sYXN0OwogICAgcmV0dXJuIF9maXJzdC5sYXN0OwogIH0KfQoKY2xhc3MgRm9sbG93ZWRCeUl0ZXJhdG9yPEU+IGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewogIEl0ZXJhdG9yPEU+IF9jdXJyZW50SXRlcmF0b3I7CiAgSXRlcmFibGU8RT4gX25leHRJdGVyYWJsZTsKCiAgRm9sbG93ZWRCeUl0ZXJhdG9yKEl0ZXJhYmxlPEU+IGZpcnN0LCB0aGlzLl9uZXh0SXRlcmFibGUpCiAgICAgIDogX2N1cnJlbnRJdGVyYXRvciA9IGZpcnN0Lml0ZXJhdG9yOwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKF9jdXJyZW50SXRlcmF0b3IubW92ZU5leHQoKSkgcmV0dXJuIHRydWU7CiAgICBpZiAoX25leHRJdGVyYWJsZSAhPSBudWxsKSB7CiAgICAgIF9jdXJyZW50SXRlcmF0b3IgPSBfbmV4dEl0ZXJhYmxlLml0ZXJhdG9yOwogICAgICBfbmV4dEl0ZXJhYmxlID0gbnVsbDsKICAgICAgcmV0dXJuIF9jdXJyZW50SXRlcmF0b3IubW92ZU5leHQoKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEUgZ2V0IGN1cnJlbnQgPT4gX2N1cnJlbnRJdGVyYXRvci5jdXJyZW50Owp9CgpjbGFzcyBXaGVyZVR5cGVJdGVyYWJsZTxUPiBleHRlbmRzIEl0ZXJhYmxlPFQ+IHsKICBmaW5hbCBJdGVyYWJsZTxPYmplY3Q+IF9zb3VyY2U7CiAgV2hlcmVUeXBlSXRlcmFibGUodGhpcy5fc291cmNlKTsKICBJdGVyYXRvcjxUPiBnZXQgaXRlcmF0b3IgPT4gbmV3IFdoZXJlVHlwZUl0ZXJhdG9yPFQ+KF9zb3VyY2UuaXRlcmF0b3IpOwp9CgpjbGFzcyBXaGVyZVR5cGVJdGVyYXRvcjxUPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPFQ+IHsKICBmaW5hbCBJdGVyYXRvcjxPYmplY3Q+IF9zb3VyY2U7CiAgV2hlcmVUeXBlSXRlcmF0b3IodGhpcy5fc291cmNlKTsKICBib29sIG1vdmVOZXh0KCkgewogICAgd2hpbGUgKF9zb3VyY2UubW92ZU5leHQoKSkgewogICAgICBpZiAoX3NvdXJjZS5jdXJyZW50IGlzIFQpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgVCBnZXQgY3VycmVudCA9PiBfc291cmNlLmN1cnJlbnQ7Cn0KCi8qKgogKiBDcmVhdGVzIGVycm9ycyB0aHJvdyBieSBbSXRlcmFibGVdIHdoZW4gdGhlIGVsZW1lbnQgY291bnQgaXMgd3JvbmcuCiAqLwphYnN0cmFjdCBjbGFzcyBJdGVyYWJsZUVsZW1lbnRFcnJvciB7CiAgLyoqIEVycm9yIHRocm93biB0aHJvd24gYnksIGUuZy4sIFtJdGVyYWJsZS5maXJzdF0gd2hlbiB0aGVyZSBpcyBubyByZXN1bHQuICovCiAgc3RhdGljIFN0YXRlRXJyb3Igbm9FbGVtZW50KCkgPT4gbmV3IFN0YXRlRXJyb3IoIk5vIGVsZW1lbnQiKTsKICAvKiogRXJyb3IgdGhyb3duIGJ5LCBlLmcuLCBbSXRlcmFibGUuc2luZ2xlXSBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgcmVzdWx0cy4gKi8KICBzdGF0aWMgU3RhdGVFcnJvciB0b29NYW55KCkgPT4gbmV3IFN0YXRlRXJyb3IoIlRvbyBtYW55IGVsZW1lbnRzIik7CiAgLyoqIEVycm9yIHRocm93biBieSwgZS5nLiwgW0xpc3Quc2V0UmFuZ2VdIGlmIHRoZXJlIGFyZSB0b28gZmV3IGVsZW1lbnRzLiAqLwogIHN0YXRpYyBTdGF0ZUVycm9yIHRvb0ZldygpID0+IG5ldyBTdGF0ZUVycm9yKCJUb28gZmV3IGVsZW1lbnRzIik7Cn0Kg4IATk48ARgBBEUcBEAjBjUFSxMGEgIBBEsDSxkERBIWARgBOQEpHiccIzUIBgQBIwEQPRkEAQ89IgQBET06GQQBIh4nMCM1CAYSBAElHictIzUIBhEEASMeJysjNQgGEgQBNR4nICkjNQgGKSwEATQeLCApIzUIBiksBAE2HhQdJyAbGjAKGxkIIzUIBiIpLAQBKR4eIigjNQg1KSEkJTcKCCANMCkkJTcKCCAGBAFAAU8BLB49HCcsIzUIBhIEAUUeHicsIzUIBhIEAUwBSAFJAUgBKhQUJw0kBicgBhMEARMiJyAGEwQCATNGFDkaAUQyIDgjRggGBAEWI0YZBAEYIygTBAETIyQ6HgYiBAEbKS84BisEASAxIzwlBkYEASAxIEgNIy5ABgQBKhggSB4gFUsnMk8GEwQCAQQ3AzxBDgQvHxUODgElHiMUAR0BFCMdOAYcFxQGLA4RBAIBKgExHyIBRi9KBjsEAS0BUAE+JikBOSYkKDwCAUcsSyUCATEOHyIBKwEUICgTBhUSBAEdAgEEQwNGBDkdIgEtASQ6AgEuAS0fIQEqAUwBRk0CAS0fIQEqARQjIxUIBhIEASYCATwBMR8iASsBUAIBNB8iRUUeOQ4BKwEdARQxLBciTi0iPA8WCAYqEQQCASwfGAE+ODkvRgY3BAEzAR1ABAIBPSxDJgETKzgbBAIBLB8SATIdBAEUEhsjBhUSBAESJR4EAgExHyEBLgEdPQQCATEfIRwBLgEUIzsaFAYRBAESIh4EAgEsHxgBOi9CBkAEATMBIE4EAR1ABAIBPSxJTwQBQSIBEzAkDgQBIDE1BAIBHS4vEAIBLB8SATIdBAEUPxQhBAEmAgExHyEBLgEdPQQCATEfIRwBLgEUGBolMQgGIQQBJgIBBCAEPBkBNQEqARwBFwEQLAQBDywEAREsBAEbNgQBKgEsASsBNSksBAE0KSwEATYpLAQBLgEzAUABLCwEAUUZBAEgMREEATcBIDERBAE3AU4BIgIBIjAZHBkCATIcHTEBLT4wRgY1BAFHATQ5QgE4ITkBECQ2GgQBDyUfITsTBhgEAUo6AgFJLCVLHgEgJUg1JgQBICU5NTQEARslPTMEARAwGgQBDzEYBAIBNSAdATwrARQyITEcKgYSBAEtAgExIiNKAgE0IiMUIS0GEgQBJAIBBEcEJlFBUUZPRAIBHGRhcnQ6X2ludGVybmFsL2l0ZXJhYmxlLmRhcnQzb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi9pbnRlcm5hbF9wYXRjaC5kYXJ0j/8vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIE5vdGU6IHRoZSBWTSBjb25jYXRlbmF0ZXMgYWxsIHBhdGNoIGZpbGVzIGludG8gYSBzaW5nbGUgcGF0Y2ggZmlsZS4gVGhpcwovLy8gZmlsZSBpcyB0aGUgZmlyc3QgcGF0Y2ggaW4gImRhcnQ6X2ludGVybmFsIiB3aGljaCBjb250YWlucyBhbGwgdGhlIGltcG9ydHMKLy8vIHVzZWQgYnkgcGF0Y2hlcyBvZiB0aGF0IGxpYnJhcnkuIFdlIHBsYW4gdG8gY2hhbmdlIHRoaXMgd2hlbiB3ZSBoYXZlIGEKLy8vIHNoYXJlZCBmcm9udCBlbmQgYW5kIHNpbXBseSB1c2UgcGFydHMuCgppbXBvcnQgImRhcnQ6Y29yZSIgaGlkZSBTeW1ib2w7CgppbXBvcnQgImRhcnQ6dHlwZWRfZGF0YSIgc2hvdyBJbnQzMkxpc3Q7CgovLy8gVGhlc2UgYXJlIHRoZSBhZGRpdGlvbmFsIHBhcnRzIG9mIHRoaXMgcGF0Y2ggbGlicmFyeToKLy8gcGFydCAiY2xhc3NfaWRfZmFzdGEuZGFydCI7Ci8vIHBhcnQgInByaW50X3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJzeW1ib2xfcGF0Y2guZGFydCI7CgpAcGF0Y2gKTGlzdDxUPiBtYWtlTGlzdEZpeGVkTGVuZ3RoPFQ+KExpc3Q8VD4gZ3Jvd2FibGVMaXN0KQogICAgbmF0aXZlICJJbnRlcm5hbF9tYWtlTGlzdEZpeGVkTGVuZ3RoIjsKCkBwYXRjaApMaXN0PFQ+IG1ha2VGaXhlZExpc3RVbm1vZGlmaWFibGU8VD4oTGlzdDxUPiBmaXhlZExlbmd0aExpc3QpCiAgICBuYXRpdmUgIkludGVybmFsX21ha2VGaXhlZExpc3RVbm1vZGlmaWFibGUiOwoKQHBhdGNoCk9iamVjdCBleHRyYWN0VHlwZUFyZ3VtZW50czxUPihUIGluc3RhbmNlLCBGdW5jdGlvbiBleHRyYWN0KQogICAgbmF0aXZlICJJbnRlcm5hbF9leHRyYWN0VHlwZUFyZ3VtZW50cyI7CgpjbGFzcyBWTUxpYnJhcnlIb29rcyB7CiAgLy8gRXhhbXBsZTogImRhcnQ6aXNvbGF0ZSBfVGltZXIuX2ZhY3RvcnkiCiAgc3RhdGljIHZhciB0aW1lckZhY3Rvcnk7CgogIC8vIEV4YW1wbGU6ICJkYXJ0OmlvIF9FdmVudEhhbmRsZXIuX3NlbmREYXRhIgogIHN0YXRpYyB2YXIgZXZlbnRIYW5kbGVyU2VuZERhdGE7CgogIC8vIEEgbnVsbGFyeSBjbG9zdXJlIHRoYXQgYW5zd2VycyB0aGUgY3VycmVudCBjbG9jayB2YWx1ZSBpbiBtaWxsaXNlY29uZHMuCiAgLy8gRXhhbXBsZTogImRhcnQ6aW8gX0V2ZW50SGFuZGxlci5fdGltZXJNaWxsaXNlY29uZENsb2NrIgogIHN0YXRpYyB2YXIgdGltZXJNaWxsaXNlY29uZENsb2NrOwoKICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBSZXNvdXJjZS5yZWFkQXNCeXRlcy4KICBzdGF0aWMgdmFyIHJlc291cmNlUmVhZEFzQnl0ZXM7CgogIC8vIEltcGxlbWVudGF0aW9uIG9mIHBhY2thZ2Ugcm9vdC9tYXAgcHJvdmlzaW9uLgogIHN0YXRpYyB2YXIgcGFja2FnZVJvb3RTdHJpbmc7CiAgc3RhdGljIHZhciBwYWNrYWdlQ29uZmlnU3RyaW5nOwogIHN0YXRpYyB2YXIgcGFja2FnZVJvb3RVcmlGdXR1cmU7CiAgc3RhdGljIHZhciBwYWNrYWdlQ29uZmlnVXJpRnV0dXJlOwogIHN0YXRpYyB2YXIgcmVzb2x2ZVBhY2thZ2VVcmlGdXR1cmU7CgogIHN0YXRpYyB2YXIgX2NvbXB1dGVTY3JpcHRVcmk7CiAgc3RhdGljIHZhciBfY2FjaGVkU2NyaXB0OwogIHN0YXRpYyBzZXQgcGxhdGZvcm1TY3JpcHQodmFyIGYpIHsKICAgIF9jb21wdXRlU2NyaXB0VXJpID0gZjsKICAgIF9jYWNoZWRTY3JpcHQgPSBudWxsOwogIH0KCiAgc3RhdGljIGdldCBwbGF0Zm9ybVNjcmlwdCB7CiAgICBpZiAoX2NhY2hlZFNjcmlwdCA9PSBudWxsICYmIF9jb21wdXRlU2NyaXB0VXJpICE9IG51bGwpIHsKICAgICAgX2NhY2hlZFNjcmlwdCA9IF9jb21wdXRlU2NyaXB0VXJpKCk7CiAgICB9CiAgICByZXR1cm4gX2NhY2hlZFNjcmlwdDsKICB9Cn0KCmZpbmFsIGJvb2wgaXM2NEJpdCA9IF9pbnF1aXJlSXM2NEJpdCgpOwoKYm9vbCBfaW5xdWlyZUlzNjRCaXQoKSBuYXRpdmUgIkludGVybmFsX2lucXVpcmVJczY0Qml0IjsKCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQpAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCmJvb2wgX2NsYXNzUmFuZ2VDaGVjayhpbnQgY2lkLCBpbnQgbG93ZXJMaW1pdCwgaW50IHVwcGVyTGltaXQpIHsKICByZXR1cm4gY2lkID49IGxvd2VyTGltaXQgJiYgY2lkIDw9IHVwcGVyTGltaXQ7Cn0KCmJvb2wgX2NsYXNzUmFuZ2VDaGVja05lZ2F0aXZlKGludCBjaWQsIGludCBsb3dlckxpbWl0LCBpbnQgdXBwZXJMaW1pdCkgewogIHJldHVybiBjaWQgPCBsb3dlckxpbWl0IHx8IGNpZCA+IHVwcGVyTGltaXQ7Cn0KCi8vIFV0aWxpdHkgY2xhc3Mgbm93IG9ubHkgdXNlZCBieSB0aGUgVk0uCmNsYXNzIExpc3RzIHsKICBzdGF0aWMgdm9pZCBjb3B5KExpc3Qgc3JjLCBpbnQgc3JjU3RhcnQsIExpc3QgZHN0LCBpbnQgZHN0U3RhcnQsIGludCBjb3VudCkgewogICAgaWYgKHNyY1N0YXJ0IDwgZHN0U3RhcnQpIHsKICAgICAgZm9yIChpbnQgaSA9IHNyY1N0YXJ0ICsgY291bnQgLSAxLCBqID0gZHN0U3RhcnQgKyBjb3VudCAtIDE7CiAgICAgICAgICBpID49IHNyY1N0YXJ0OwogICAgICAgICAgaS0tLCBqLS0pIHsKICAgICAgICBkc3Rbal0gPSBzcmNbaV07CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAoaW50IGkgPSBzcmNTdGFydCwgaiA9IGRzdFN0YXJ0OyBpIDwgc3JjU3RhcnQgKyBjb3VudDsgaSsrLCBqKyspIHsKICAgICAgICBkc3Rbal0gPSBzcmNbaV07CiAgICAgIH0KICAgIH0KICB9Cn0KCi8vIFByZXBlbmQgdGhlIHBhcmVudCB0eXBlIGFyZ3VtZW50cyAobWF5YmUgbnVsbCkgb2YgbGVuZ3RoICdwYXJlbnRMZW4nIHRvIHRoZQovLyBmdW5jdGlvbiB0eXBlIGFyZ3VtZW50cyAobWF5IGJlIG51bGwpLiBUaGUgcmVzdWx0IGlzIG51bGwgaWYgYm90aCBpbnB1dAovLyB2ZWN0b3JzIGFyZSBudWxsIG9yIGlzIGEgbmV3bHkgYWxsb2NhdGVkIGFuZCBjYW5vbmljYWxpemVkIHZlY3RvciBvZiBsZW5ndGgKLy8gJ3RvdGFsTGVuJy4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCl9wcmVwZW5kVHlwZUFyZ3VtZW50cyhmdW5jdGlvblR5cGVBcmd1bWVudHMsIHBhcmVudFR5cGVBcmd1bWVudHMsIHBhcmVudExlbiwKICAgIHRvdGFsTGVuKSBuYXRpdmUgIkludGVybmFsX3ByZXBlbmRUeXBlQXJndW1lbnRzIjsKCi8vIENoZWNrIHRoYXQgYSBzZXQgb2YgdHlwZSBhcmd1bWVudHMgc2F0aXNmeSB0aGUgdHlwZSBwYXJhbWV0ZXIgYm91bmRzIG9uIGEKLy8gY2xvc3VyZS4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCl9ib3VuZHNDaGVja0ZvclBhcnRpYWxJbnN0YW50aWF0aW9uKGNsb3N1cmUsIHR5cGVBcmdzKQogICAgbmF0aXZlICJJbnRlcm5hbF9ib3VuZHNDaGVja0ZvclBhcnRpYWxJbnN0YW50aWF0aW9uIjsKCi8vIENhbGxlZCBieSBJUlJlZ0V4cE1hY3JvQXNzZW1ibGVyOjpHcm93U3RhY2suCkludDMyTGlzdCBfZ3Jvd1JlZ0V4cFN0YWNrKEludDMyTGlzdCBzdGFjaykgewogIGZpbmFsIG5ld1N0YWNrID0gbmV3IEludDMyTGlzdChzdGFjay5sZW5ndGggKiAyKTsKICBmb3IgKGludCBpID0gMDsgaSA8IHN0YWNrLmxlbmd0aDsgaSsrKSB7CiAgICBuZXdTdGFja1tpXSA9IHN0YWNrW2ldOwogIH0KICByZXR1cm4gbmV3U3RhY2s7Cn0KCi8vIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gc2tpcCBpbXBsaWNpdCBvciBleHBsaWNpdCBjaGVja2VkIGRvd24gY2FzdHMgaW4KLy8gdGhlIHBhcnRzIG9mIHRoZSBjb3JlIGxpYnJhcnkgaW1wbGVtZW50YXRpb24gd2hlcmUgd2Uga25vdyBieSBjb25zdHJ1Y3Rpb24gdGhlCi8vIHR5cGUgb2YgYSB2YWx1ZS4KLy8KLy8gSW1wb3J0YW50OiB0aGlzIGlzIHVuc2FmZSBhbmQgbXVzdCBiZSB1c2VkIHdpdGggY2FyZS4KVCB1bnNhZmVDYXN0PFQ+KE9iamVjdCB2KSBuYXRpdmUgIkludGVybmFsX3Vuc2FmZUNhc3QiOwqAgABOTjwBTU9LKwEgASkBOh8cHQEHNSsBBz4xAQc9LAEXLRsBMCMBTT0kAS0iATMgIiMlJgEgHCUbGgQBHj4rBhoEAgEoATkBIiZBMQIBSS8CASoOUB9DGRYZCA1NGQgGBAIBT0tPDyJNNgFNDCI3OgEwLjQrHAQTAgFQUhQDOTgBKGRhcnQ6X2ludGVybmFsLXBhdGNoL2ludGVybmFsX3BhdGNoLmRhcnQzb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi9jbGFzc19pZF9mYXN0YS5kYXJ0g6UvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiaW50ZXJuYWxfcGF0Y2guZGFydCI7CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIENsYXNzSUQgewogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBzdGF0aWMgaW50IGdldElEKE9iamVjdCB2YWx1ZSkgbmF0aXZlICJDbGFzc0lEX2dldElEIjsKCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIHN0YXRpYyBmaW5hbCBpbnQgY2lkQXJyYXkgPSAwOwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBzdGF0aWMgZmluYWwgaW50IGNpZEV4dGVybmFsT25lQnl0ZVN0cmluZyA9IDA7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIHN0YXRpYyBmaW5hbCBpbnQgY2lkR3Jvd2FibGVPYmplY3RBcnJheSA9IDA7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIHN0YXRpYyBmaW5hbCBpbnQgY2lkSW1tdXRhYmxlQXJyYXkgPSAwOwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBzdGF0aWMgZmluYWwgaW50IGNpZE9uZUJ5dGVTdHJpbmcgPSAwOwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBzdGF0aWMgZmluYWwgaW50IGNpZFR3b0J5dGVTdHJpbmcgPSAwOwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBzdGF0aWMgZmluYWwgaW50IGNpZFVpbnQ4QXJyYXlWaWV3ID0gMDsKfQodAE5OPAEiARoQJDQ5ARwhHDEcLxwqHCkcKRwqAgEoZGFydDpfaW50ZXJuYWwtcGF0Y2gvY2xhc3NfaWRfZmFzdGEuZGFydC9vcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW50ZXJuYWwvcGF0Y2guZGFydIE9Ly8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgImRhcnQ6X2ludGVybmFsIjsKCmNsYXNzIF9QYXRjaCB7CiAgY29uc3QgX1BhdGNoKCk7Cn0KCmNvbnN0IF9QYXRjaCBwYXRjaCA9IGNvbnN0IF9QYXRjaCgpOwoNAE5OPAEaAQ8SAgElAR9kYXJ0Ol9pbnRlcm5hbC1wYXRjaC9wYXRjaC5kYXJ0NG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pbnRlcm5hbC9hc3luY19jYXN0LmRhcnSNYC8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuX2ludGVybmFsOwoKLy8gQ2FzdGluZyB3cmFwcGVycyBmb3IgYXN5bmNocm9ub3VzIGNsYXNzZXMuCgpjbGFzcyBDYXN0U3RyZWFtPFMsIFQ+IGV4dGVuZHMgU3RyZWFtPFQ+IHsKICBmaW5hbCBTdHJlYW08Uz4gX3NvdXJjZTsKICBDYXN0U3RyZWFtKHRoaXMuX3NvdXJjZSk7CiAgYm9vbCBnZXQgaXNCcm9hZGNhc3QgPT4gX3NvdXJjZS5pc0Jyb2FkY2FzdDsKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IGxpc3Rlbih2b2lkIG9uRGF0YShUIGRhdGEpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSkgewogICAgcmV0dXJuIG5ldyBDYXN0U3RyZWFtU3Vic2NyaXB0aW9uPFMsIFQ+KAogICAgICAgIF9zb3VyY2UubGlzdGVuKG51bGwsIG9uRG9uZTogb25Eb25lLCBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKSkKICAgICAgLi5vbkRhdGEob25EYXRhKQogICAgICAuLm9uRXJyb3Iob25FcnJvcik7CiAgfQoKICBTdHJlYW08Uj4gY2FzdDxSPigpID0+IG5ldyBDYXN0U3RyZWFtPFMsIFI+KF9zb3VyY2UpOwp9CgpjbGFzcyBDYXN0U3RyZWFtU3Vic2NyaXB0aW9uPFMsIFQ+IGltcGxlbWVudHMgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHsKICBmaW5hbCBTdHJlYW1TdWJzY3JpcHRpb248Uz4gX3NvdXJjZTsKCiAgLy8vIFpvbmUgd2hlcmUgbGlzdGVuIHdhcyBjYWxsZWQuCiAgZmluYWwgWm9uZSBfem9uZSA9IFpvbmUuY3VycmVudDsKCiAgLy8vIFVzZXIncyBkYXRhIGhhbmRsZXIuIE1heSBiZSBudWxsLgogIHZvaWQgRnVuY3Rpb24oVCkgX2hhbmRsZURhdGE7CgogIC8vLyBDb3B5IG9mIF9zb3VyY2UncyBoYW5kbGVFcnJvciBzbyB3ZSBjYW4gcmVwb3J0IGVycm9ycyBpbiBvbkRhdGEuCiAgLy8vIE1heSBiZSBudWxsLgogIEZ1bmN0aW9uIF9oYW5kbGVFcnJvcjsKCiAgQ2FzdFN0cmVhbVN1YnNjcmlwdGlvbih0aGlzLl9zb3VyY2UpIHsKICAgIF9zb3VyY2Uub25EYXRhKF9vbkRhdGEpOwogIH0KCiAgRnV0dXJlIGNhbmNlbCgpID0+IF9zb3VyY2UuY2FuY2VsKCk7CgogIHZvaWQgb25EYXRhKHZvaWQgaGFuZGxlRGF0YShUIGRhdGEpKSB7CiAgICBfaGFuZGxlRGF0YSA9IGhhbmRsZURhdGEgPT0gbnVsbAogICAgICAgID8gbnVsbAogICAgICAgIDogX3pvbmUucmVnaXN0ZXJVbmFyeUNhbGxiYWNrPGR5bmFtaWMsIFQ+KGhhbmRsZURhdGEpOwogIH0KCiAgdm9pZCBvbkVycm9yKEZ1bmN0aW9uIGhhbmRsZUVycm9yKSB7CiAgICBfc291cmNlLm9uRXJyb3IoaGFuZGxlRXJyb3IpOwogICAgaWYgKGhhbmRsZUVycm9yID09IG51bGwpIHsKICAgICAgX2hhbmRsZUVycm9yID0gbnVsbDsKICAgIH0gZWxzZSBpZiAoaGFuZGxlRXJyb3IgaXMgRnVuY3Rpb24oTnVsbCwgTnVsbCkpIHsKICAgICAgX2hhbmRsZUVycm9yID0gX3pvbmUKICAgICAgICAgIC5yZWdpc3RlckJpbmFyeUNhbGxiYWNrPGR5bmFtaWMsIE9iamVjdCwgU3RhY2tUcmFjZT4oaGFuZGxlRXJyb3IpOwogICAgfSBlbHNlIHsKICAgICAgX2hhbmRsZUVycm9yID0gX3pvbmUucmVnaXN0ZXJVbmFyeUNhbGxiYWNrPGR5bmFtaWMsIE9iamVjdD4oaGFuZGxlRXJyb3IpOwogICAgfQogIH0KCiAgdm9pZCBvbkRvbmUodm9pZCBoYW5kbGVEb25lKCkpIHsKICAgIF9zb3VyY2Uub25Eb25lKGhhbmRsZURvbmUpOwogIH0KCiAgdm9pZCBfb25EYXRhKFMgZGF0YSkgewogICAgaWYgKF9oYW5kbGVEYXRhID09IG51bGwpIHJldHVybjsKICAgIFQgdGFyZ2V0RGF0YTsKICAgIHRyeSB7CiAgICAgIHRhcmdldERhdGEgPSBkYXRhIGFzIFQ7CiAgICB9IGNhdGNoIChlcnJvciwgc3RhY2spIHsKICAgICAgaWYgKF9oYW5kbGVFcnJvciA9PSBudWxsKSB7CiAgICAgICAgX3pvbmUuaGFuZGxlVW5jYXVnaHRFcnJvcihlcnJvciwgc3RhY2spOwogICAgICB9IGVsc2UgaWYgKF9oYW5kbGVFcnJvciBpcyBGdW5jdGlvbihOdWxsLCBOdWxsKSkgewogICAgICAgIF96b25lLnJ1bkJpbmFyeUd1YXJkZWQoX2hhbmRsZUVycm9yLCBlcnJvciwgc3RhY2spOwogICAgICB9IGVsc2UgewogICAgICAgIF96b25lLnJ1blVuYXJ5R3VhcmRlZChfaGFuZGxlRXJyb3IsIGVycm9yKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBfem9uZS5ydW5VbmFyeUd1YXJkZWQoX2hhbmRsZURhdGEsIHRhcmdldERhdGEpOwogIH0KCiAgdm9pZCBwYXVzZShbRnV0dXJlIHJlc3VtZVNpZ25hbF0pIHsKICAgIF9zb3VyY2UucGF1c2UocmVzdW1lU2lnbmFsKTsKICB9CgogIHZvaWQgcmVzdW1lKCkgewogICAgX3NvdXJjZS5yZXN1bWUoKTsKICB9CgogIGJvb2wgZ2V0IGlzUGF1c2VkID0+IF9zb3VyY2UuaXNQYXVzZWQ7CgogIEZ1dHVyZTxFPiBhc0Z1dHVyZTxFPihbRSBmdXR1cmVWYWx1ZV0pID0+IF9zb3VyY2UuYXNGdXR1cmU8RT4oZnV0dXJlVmFsdWUpOwp9CgpjbGFzcyBDYXN0U3RyZWFtVHJhbnNmb3JtZXI8U1MsIFNULCBUUywgVFQ+CiAgICBleHRlbmRzIFN0cmVhbVRyYW5zZm9ybWVyQmFzZTxUUywgVFQ+IHsKICBmaW5hbCBTdHJlYW1UcmFuc2Zvcm1lcjxTUywgU1Q+IF9zb3VyY2U7CiAgQ2FzdFN0cmVhbVRyYW5zZm9ybWVyKHRoaXMuX3NvdXJjZSk7CgogIFN0cmVhbVRyYW5zZm9ybWVyPFJTLCBSVD4gY2FzdDxSUywgUlQ+KCkgPT4KICAgICAgbmV3IENhc3RTdHJlYW1UcmFuc2Zvcm1lcjxTUywgU1QsIFJTLCBSVD4oX3NvdXJjZSk7CiAgU3RyZWFtPFRUPiBiaW5kKFN0cmVhbTxUUz4gc3RyZWFtKSA9PgogICAgICBfc291cmNlLmJpbmQoc3RyZWFtLmNhc3Q8U1M+KCkpLmNhc3Q8VFQ+KCk7Cn0KCmNsYXNzIENhc3RDb252ZXJ0ZXI8U1MsIFNULCBUUywgVFQ+IGV4dGVuZHMgQ29udmVydGVyPFRTLCBUVD4gewogIGZpbmFsIENvbnZlcnRlcjxTUywgU1Q+IF9zb3VyY2U7CiAgQ2FzdENvbnZlcnRlcih0aGlzLl9zb3VyY2UpOwoKICBUVCBjb252ZXJ0KFRTIGlucHV0KSA9PiBfc291cmNlLmNvbnZlcnQoaW5wdXQgYXMgU1MpIGFzIFRUOwoKICAvLyBjYXN0IGlzIGluaGVyaXRlZCBmcm9tIENvbnZlcnRlci4KCiAgU3RyZWFtPFRUPiBiaW5kKFN0cmVhbTxUUz4gc3RyZWFtKSA9PgogICAgICBfc291cmNlLmJpbmQoc3RyZWFtLmNhc3Q8U1M+KCkpLmNhc3Q8VFQ+KCk7CgogIENvbnZlcnRlcjxSUywgUlQ+IGNhc3Q8UlMsIFJUPigpID0+CiAgICAgIG5ldyBDYXN0Q29udmVydGVyPFNTLCBTVCwgUlMsIFJUPihfc291cmNlKTsKfQp7AE5OPAEYAS4BKxscLwE0Py1MFxoEATgCAUYnASQjASggAUcTGQEpHQQBJwEpJQ8/BAEnIh8bNhtNDVAGBAEjIAQBGSUSCh4dIjE5PA80CA4GNAQBJiEEARIWBAEpAU4CASwsKycBLjooMgIBQCMfAT4BJwEoMgEmMgIBHmRhcnQ6X2ludGVybmFsL2FzeW5jX2Nhc3QuZGFydC5vcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW50ZXJuYWwvY2FzdC5kYXJ0pkovLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0Ll9pbnRlcm5hbDsKCi8vIENhc3Rpbmcgd3JhcHBlcnMgZm9yIGNvbGxlY3Rpb24gY2xhc3Nlcy4KCmFic3RyYWN0IGNsYXNzIF9DYXN0SXRlcmFibGVCYXNlPFMsIFQ+IGV4dGVuZHMgSXRlcmFibGU8VD4gewogIEl0ZXJhYmxlPFM+IGdldCBfc291cmNlOwoKICBJdGVyYXRvcjxUPiBnZXQgaXRlcmF0b3IgPT4gbmV3IENhc3RJdGVyYXRvcjxTLCBUPihfc291cmNlLml0ZXJhdG9yKTsKCiAgLy8gVGhlIGZvbGxvd2luZyBtZW1iZXJzIHVzZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvbiB0aGUKICAvLyB0aHJvd2luZyBpdGVyYXRvci4gVGhlc2UgYXJlIGFsbCBvcGVyYXRpb25zIHRoYXQgaGF2ZSBubyBtb3JlIGVmZmljaWVudAogIC8vIGltcGxlbWVudGF0aW9uIHRoYW4gdmlzaXRpbmcgZXZlcnkgZWxlbWVudCBpbiBvcmRlciwKICAvLyBvciB0aGF0IGhhcyBubyBtb3JlIGVmZmljaWVudCB3YXkgdG8gZ2V0IHRoZSBjb3JyZWN0IHR5cGUgKHRvTGlzdCwgdG9TZXQpLgogIC8vCiAgLy8gKiBtYXAKICAvLyAqIHdoZXJlCiAgLy8gKiBleHBhbmQKICAvLyAqIGZvckVhY2gKICAvLyAqIHJlZHVjZQogIC8vICogZm9sZAogIC8vICogZXZlcnkKICAvLyAqIGFueQogIC8vICogam9pbgogIC8vICogdG9MaXN0CiAgLy8gKiB0b1NldAogIC8vICogc2tpcFdoaWxlCiAgLy8gKiB0YWtlV2hpbGUKICAvLyAqIGZpcnN0V2hlcmUKICAvLyAqIHNpbmdsZVdoZXJlCgogIGludCBnZXQgbGVuZ3RoID0+IF9zb3VyY2UubGVuZ3RoOwogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX3NvdXJjZS5pc0VtcHR5OwogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gX3NvdXJjZS5pc05vdEVtcHR5OwoKICBJdGVyYWJsZTxUPiBza2lwKGludCBjb3VudCkgPT4gbmV3IENhc3RJdGVyYWJsZTxTLCBUPihfc291cmNlLnNraXAoY291bnQpKTsKICBJdGVyYWJsZTxUPiB0YWtlKGludCBjb3VudCkgPT4gbmV3IENhc3RJdGVyYWJsZTxTLCBUPihfc291cmNlLnRha2UoY291bnQpKTsKCiAgVCBlbGVtZW50QXQoaW50IGluZGV4KSA9PiBfc291cmNlLmVsZW1lbnRBdChpbmRleCkgYXMgVDsKICBUIGdldCBmaXJzdCA9PiBfc291cmNlLmZpcnN0IGFzIFQ7CiAgVCBnZXQgbGFzdCA9PiBfc291cmNlLmxhc3QgYXMgVDsKICBUIGdldCBzaW5nbGUgPT4gX3NvdXJjZS5zaW5nbGUgYXMgVDsKCiAgYm9vbCBjb250YWlucyhPYmplY3Qgb3RoZXIpID0+IF9zb3VyY2UuY29udGFpbnMob3RoZXIpOwoKICAvLyBNaWdodCBiZSBpbXBsZW1lbnRlZCBieSB0ZXN0aW5nIGJhY2t3YXJkcyBmcm9tIHRoZSBlbmQsCiAgLy8gc28gdXNlIHRoZSBfc291cmNlJ3MgaW1wbGVtZW50YXRpb24uCiAgVCBsYXN0V2hlcmUoYm9vbCB0ZXN0KFQgZWxlbWVudCksIHtUIG9yRWxzZSgpfSkgPT4KICAgICAgX3NvdXJjZS5sYXN0V2hlcmUoKFMgZWxlbWVudCkgPT4gdGVzdChlbGVtZW50IGFzIFQpLAogICAgICAgICAgb3JFbHNlOiAob3JFbHNlID09IG51bGwpID8gbnVsbCA6ICgpID0+IG9yRWxzZSgpIGFzIFMpIGFzIFQ7CgogIFN0cmluZyB0b1N0cmluZygpID0+IF9zb3VyY2UudG9TdHJpbmcoKTsKfQoKY2xhc3MgQ2FzdEl0ZXJhdG9yPFMsIFQ+IGltcGxlbWVudHMgSXRlcmF0b3I8VD4gewogIEl0ZXJhdG9yPFM+IF9zb3VyY2U7CiAgQ2FzdEl0ZXJhdG9yKHRoaXMuX3NvdXJjZSk7CiAgYm9vbCBtb3ZlTmV4dCgpID0+IF9zb3VyY2UubW92ZU5leHQoKTsKICBUIGdldCBjdXJyZW50ID0+IF9zb3VyY2UuY3VycmVudCBhcyBUOwp9CgpjbGFzcyBDYXN0SXRlcmFibGU8UywgVD4gZXh0ZW5kcyBfQ2FzdEl0ZXJhYmxlQmFzZTxTLCBUPiB7CiAgZmluYWwgSXRlcmFibGU8Uz4gX3NvdXJjZTsKCiAgQ2FzdEl0ZXJhYmxlLl8odGhpcy5fc291cmNlKTsKCiAgZmFjdG9yeSBDYXN0SXRlcmFibGUoSXRlcmFibGU8Uz4gc291cmNlKSB7CiAgICBpZiAoc291cmNlIGlzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPFM+KSB7CiAgICAgIHJldHVybiBuZXcgX0VmZmljaWVudExlbmd0aENhc3RJdGVyYWJsZTxTLCBUPihzb3VyY2UpOwogICAgfQogICAgcmV0dXJuIG5ldyBDYXN0SXRlcmFibGU8UywgVD4uXyhzb3VyY2UpOwogIH0KCiAgSXRlcmFibGU8Uj4gY2FzdDxSPigpID0+IG5ldyBDYXN0SXRlcmFibGU8UywgUj4oX3NvdXJjZSk7Cn0KCmNsYXNzIF9FZmZpY2llbnRMZW5ndGhDYXN0SXRlcmFibGU8UywgVD4gZXh0ZW5kcyBDYXN0SXRlcmFibGU8UywgVD4KICAgIGltcGxlbWVudHMgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGU8VD4gewogIF9FZmZpY2llbnRMZW5ndGhDYXN0SXRlcmFibGUoRWZmaWNpZW50TGVuZ3RoSXRlcmFibGU8Uz4gc291cmNlKQogICAgICA6IHN1cGVyLl8oc291cmNlKTsKfQoKYWJzdHJhY3QgY2xhc3MgX0Nhc3RMaXN0QmFzZTxTLCBUPiBleHRlbmRzIF9DYXN0SXRlcmFibGVCYXNlPFMsIFQ+CiAgICB3aXRoIExpc3RNaXhpbjxUPiB7CiAgTGlzdDxTPiBnZXQgX3NvdXJjZTsKCiAgLy8gVXNpbmcgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZnJvbSBMaXN0TWl4aW46CiAgLy8gKiByZXZlcnNlZAogIC8vICogc2h1ZmZsZQogIC8vICogaW5kZXhPZgogIC8vICogbGFzdEluZGV4T2YKICAvLyAqIGNsZWFyCiAgLy8gKiBzdWJsaXN0CiAgLy8gKiBhc01hcAoKICBUIG9wZXJhdG9yIFtdKGludCBpbmRleCkgPT4gX3NvdXJjZVtpbmRleF0gYXMgVDsKCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBUIHZhbHVlKSB7CiAgICBfc291cmNlW2luZGV4XSA9IHZhbHVlIGFzIFM7CiAgfQoKICB2b2lkIHNldCBsZW5ndGgoaW50IGxlbmd0aCkgewogICAgX3NvdXJjZS5sZW5ndGggPSBsZW5ndGg7CiAgfQoKICB2b2lkIGFkZChUIHZhbHVlKSB7CiAgICBfc291cmNlLmFkZCh2YWx1ZSBhcyBTKTsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPFQ+IHZhbHVlcykgewogICAgX3NvdXJjZS5hZGRBbGwobmV3IENhc3RJdGVyYWJsZTxULCBTPih2YWx1ZXMpKTsKICB9CgogIHZvaWQgc29ydChbaW50IGNvbXBhcmUoVCB2MSwgVCB2MildKSB7CiAgICBfc291cmNlLnNvcnQoCiAgICAgICAgY29tcGFyZSA9PSBudWxsID8gbnVsbCA6IChTIHYxLCBTIHYyKSA9PiBjb21wYXJlKHYxIGFzIFQsIHYyIGFzIFQpKTsKICB9CgogIHZvaWQgc2h1ZmZsZShbUmFuZG9tIHJhbmRvbV0pIHsKICAgIF9zb3VyY2Uuc2h1ZmZsZShyYW5kb20pOwogIH0KCiAgdm9pZCBpbnNlcnQoaW50IGluZGV4LCBUIGVsZW1lbnQpIHsKICAgIF9zb3VyY2UuaW5zZXJ0KGluZGV4LCBlbGVtZW50IGFzIFMpOwogIH0KCiAgdm9pZCBpbnNlcnRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxUPiBlbGVtZW50cykgewogICAgX3NvdXJjZS5pbnNlcnRBbGwoaW5kZXgsIG5ldyBDYXN0SXRlcmFibGU8VCwgUz4oZWxlbWVudHMpKTsKICB9CgogIHZvaWQgc2V0QWxsKGludCBpbmRleCwgSXRlcmFibGU8VD4gZWxlbWVudHMpIHsKICAgIF9zb3VyY2Uuc2V0QWxsKGluZGV4LCBuZXcgQ2FzdEl0ZXJhYmxlPFQsIFM+KGVsZW1lbnRzKSk7CiAgfQoKICBib29sIHJlbW92ZShPYmplY3QgdmFsdWUpID0+IF9zb3VyY2UucmVtb3ZlKHZhbHVlKTsKCiAgVCByZW1vdmVBdChpbnQgaW5kZXgpID0+IF9zb3VyY2UucmVtb3ZlQXQoaW5kZXgpIGFzIFQ7CgogIFQgcmVtb3ZlTGFzdCgpID0+IF9zb3VyY2UucmVtb3ZlTGFzdCgpIGFzIFQ7CgogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KFQgZWxlbWVudCkpIHsKICAgIF9zb3VyY2UucmVtb3ZlV2hlcmUoKFMgZWxlbWVudCkgPT4gdGVzdChlbGVtZW50IGFzIFQpKTsKICB9CgogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KFQgZWxlbWVudCkpIHsKICAgIF9zb3VyY2UucmV0YWluV2hlcmUoKFMgZWxlbWVudCkgPT4gdGVzdChlbGVtZW50IGFzIFQpKTsKICB9CgogIEl0ZXJhYmxlPFQ+IGdldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCkgPT4KICAgICAgbmV3IENhc3RJdGVyYWJsZTxTLCBUPihfc291cmNlLmdldFJhbmdlKHN0YXJ0LCBlbmQpKTsKCiAgdm9pZCBzZXRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlPFQ+IGl0ZXJhYmxlLCBbaW50IHNraXBDb3VudCA9IDBdKSB7CiAgICBfc291cmNlLnNldFJhbmdlKHN0YXJ0LCBlbmQsIG5ldyBDYXN0SXRlcmFibGU8VCwgUz4oaXRlcmFibGUpLCBza2lwQ291bnQpOwogIH0KCiAgdm9pZCByZW1vdmVSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIF9zb3VyY2UucmVtb3ZlUmFuZ2Uoc3RhcnQsIGVuZCk7CiAgfQoKICB2b2lkIGZpbGxSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIFtUIGZpbGxWYWx1ZV0pIHsKICAgIF9zb3VyY2UuZmlsbFJhbmdlKHN0YXJ0LCBlbmQsIGZpbGxWYWx1ZSBhcyBTKTsKICB9CgogIHZvaWQgcmVwbGFjZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGU8VD4gcmVwbGFjZW1lbnQpIHsKICAgIF9zb3VyY2UucmVwbGFjZVJhbmdlKHN0YXJ0LCBlbmQsIG5ldyBDYXN0SXRlcmFibGU8VCwgUz4ocmVwbGFjZW1lbnQpKTsKICB9Cn0KCmNsYXNzIENhc3RMaXN0PFMsIFQ+IGV4dGVuZHMgX0Nhc3RMaXN0QmFzZTxTLCBUPiB7CiAgZmluYWwgTGlzdDxTPiBfc291cmNlOwogIENhc3RMaXN0KHRoaXMuX3NvdXJjZSk7CgogIExpc3Q8Uj4gY2FzdDxSPigpID0+IG5ldyBDYXN0TGlzdDxTLCBSPihfc291cmNlKTsKfQoKY2xhc3MgQ2FzdFNldDxTLCBUPiBleHRlbmRzIF9DYXN0SXRlcmFibGVCYXNlPFMsIFQ+IGltcGxlbWVudHMgU2V0PFQ+IHsKICBmaW5hbCBTZXQ8Uz4gX3NvdXJjZTsKCiAgLy8vIENyZWF0ZXMgYSBuZXcgZW1wdHkgc2V0IG9mIHRoZSBzYW1lICpraW5kKiBhcyBbX3NvdXJjZV0sCiAgLy8vIGJ1dCB3aXRoIGA8Uj5gIGFzIHR5cGUgYXJndW1lbnQuCiAgLy8vIFVzZWQgYnkgW3RvU2V0XSBhbmQgW3VuaW9uXS4KICBmaW5hbCBTZXQ8Uj4gRnVuY3Rpb248Uj4oKSBfZW1wdHlTZXQ7CgogIENhc3RTZXQodGhpcy5fc291cmNlLCB0aGlzLl9lbXB0eVNldCk7CgogIHN0YXRpYyBTZXQ8Uj4gX2RlZmF1bHRFbXB0eVNldDxSPigpID0+IG5ldyBTZXQ8Uj4oKTsKCiAgU2V0PFI+IGNhc3Q8Uj4oKSA9PiBuZXcgQ2FzdFNldDxTLCBSPihfc291cmNlLCBfZW1wdHlTZXQpOwogIGJvb2wgYWRkKFQgdmFsdWUpID0+IF9zb3VyY2UuYWRkKHZhbHVlIGFzIFMpOwoKICB2b2lkIGFkZEFsbChJdGVyYWJsZTxUPiBlbGVtZW50cykgewogICAgX3NvdXJjZS5hZGRBbGwobmV3IENhc3RJdGVyYWJsZTxULCBTPihlbGVtZW50cykpOwogIH0KCiAgYm9vbCByZW1vdmUoT2JqZWN0IG9iamVjdCkgPT4gX3NvdXJjZS5yZW1vdmUob2JqZWN0KTsKCiAgdm9pZCByZW1vdmVBbGwoSXRlcmFibGU8T2JqZWN0PiBvYmplY3RzKSB7CiAgICBfc291cmNlLnJlbW92ZUFsbChvYmplY3RzKTsKICB9CgogIHZvaWQgcmV0YWluQWxsKEl0ZXJhYmxlPE9iamVjdD4gb2JqZWN0cykgewogICAgX3NvdXJjZS5yZXRhaW5BbGwob2JqZWN0cyk7CiAgfQoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChUIGVsZW1lbnQpKSB7CiAgICBfc291cmNlLnJlbW92ZVdoZXJlKChTIGVsZW1lbnQpID0+IHRlc3QoZWxlbWVudCBhcyBUKSk7CiAgfQoKICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChUIGVsZW1lbnQpKSB7CiAgICBfc291cmNlLnJldGFpbldoZXJlKChTIGVsZW1lbnQpID0+IHRlc3QoZWxlbWVudCBhcyBUKSk7CiAgfQoKICBib29sIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPE9iamVjdD4gb2JqZWN0cykgPT4gX3NvdXJjZS5jb250YWluc0FsbChvYmplY3RzKTsKCiAgU2V0PFQ+IGludGVyc2VjdGlvbihTZXQ8T2JqZWN0PiBvdGhlcikgewogICAgaWYgKF9lbXB0eVNldCAhPSBudWxsKSByZXR1cm4gX2NvbmRpdGlvbmFsQWRkKG90aGVyLCB0cnVlKTsKICAgIHJldHVybiBuZXcgQ2FzdFNldDxTLCBUPihfc291cmNlLmludGVyc2VjdGlvbihvdGhlciksIG51bGwpOwogIH0KCiAgU2V0PFQ+IGRpZmZlcmVuY2UoU2V0PE9iamVjdD4gb3RoZXIpIHsKICAgIGlmIChfZW1wdHlTZXQgIT0gbnVsbCkgcmV0dXJuIF9jb25kaXRpb25hbEFkZChvdGhlciwgZmFsc2UpOwogICAgcmV0dXJuIG5ldyBDYXN0U2V0PFMsIFQ+KF9zb3VyY2UuZGlmZmVyZW5jZShvdGhlciksIG51bGwpOwogIH0KCiAgU2V0PFQ+IF9jb25kaXRpb25hbEFkZChTZXQ8T2JqZWN0PiBvdGhlciwgYm9vbCBvdGhlckNvbnRhaW5zKSB7CiAgICBTZXQ8VD4gcmVzdWx0ID0gKF9lbXB0eVNldCA9PSBudWxsKSA/IG5ldyBTZXQ8VD4oKSA6IF9lbXB0eVNldDxUPigpOwogICAgZm9yICh2YXIgZWxlbWVudCBpbiBfc291cmNlKSB7CiAgICAgIFQgY2FzdEVsZW1lbnQgPSBlbGVtZW50IGFzIFQ7CiAgICAgIGlmIChvdGhlckNvbnRhaW5zID09IG90aGVyLmNvbnRhaW5zKGNhc3RFbGVtZW50KSkgcmVzdWx0LmFkZChjYXN0RWxlbWVudCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgU2V0PFQ+IHVuaW9uKFNldDxUPiBvdGhlcikgPT4gX2Nsb25lKCkuLmFkZEFsbChvdGhlcik7CgogIHZvaWQgY2xlYXIoKSB7CiAgICBfc291cmNlLmNsZWFyKCk7CiAgfQoKICBTZXQ8VD4gX2Nsb25lKCkgewogICAgU2V0PFQ+IHJlc3VsdCA9IChfZW1wdHlTZXQgPT0gbnVsbCkgPyBuZXcgU2V0PFQ+KCkgOiBfZW1wdHlTZXQ8VD4oKTsKICAgIHJlc3VsdC5hZGRBbGwodGhpcyk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgU2V0PFQ+IHRvU2V0KCkgPT4gX2Nsb25lKCk7CgogIFQgbG9va3VwKE9iamVjdCBrZXkpID0+IF9zb3VyY2UubG9va3VwKGtleSkgYXMgVDsKfQoKY2xhc3MgQ2FzdE1hcDxTSywgU1YsIEssIFY+IGV4dGVuZHMgTWFwQmFzZTxLLCBWPiB7CiAgZmluYWwgTWFwPFNLLCBTVj4gX3NvdXJjZTsKCiAgQ2FzdE1hcCh0aGlzLl9zb3VyY2UpOwoKICBNYXA8UkssIFJWPiBjYXN0PFJLLCBSVj4oKSA9PiBuZXcgQ2FzdE1hcDxTSywgU1YsIFJLLCBSVj4oX3NvdXJjZSk7CgogIGJvb2wgY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpID0+IF9zb3VyY2UuY29udGFpbnNWYWx1ZSh2YWx1ZSk7CgogIGJvb2wgY29udGFpbnNLZXkoT2JqZWN0IGtleSkgPT4gX3NvdXJjZS5jb250YWluc0tleShrZXkpOwoKICBWIG9wZXJhdG9yIFtdKE9iamVjdCBrZXkpID0+IF9zb3VyY2Vba2V5XSBhcyBWOwoKICB2b2lkIG9wZXJhdG9yIFtdPShLIGtleSwgViB2YWx1ZSkgewogICAgX3NvdXJjZVtrZXkgYXMgU0tdID0gdmFsdWUgYXMgU1Y7CiAgfQoKICBWIHB1dElmQWJzZW50KEsga2V5LCBWIGlmQWJzZW50KCkpID0+IF9zb3VyY2UucHV0SWZBYnNlbnQoCiAgICAgIGtleSBhcyBTSywgKGlmQWJzZW50ID09IG51bGwpID8gbnVsbCA6ICgpID0+IGlmQWJzZW50KCkgYXMgU1YpIGFzIFY7CgogIHZvaWQgYWRkQWxsKE1hcDxLLCBWPiBvdGhlcikgewogICAgX3NvdXJjZS5hZGRBbGwobmV3IENhc3RNYXA8SywgViwgU0ssIFNWPihvdGhlcikpOwogIH0KCiAgViByZW1vdmUoT2JqZWN0IGtleSkgPT4gX3NvdXJjZS5yZW1vdmUoa2V5KSBhcyBWOwoKICB2b2lkIGNsZWFyKCkgewogICAgX3NvdXJjZS5jbGVhcigpOwogIH0KCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihLIGtleSwgViB2YWx1ZSkpIHsKICAgIF9zb3VyY2UuZm9yRWFjaCgoU0sga2V5LCBTViB2YWx1ZSkgewogICAgICBmKGtleSBhcyBLLCB2YWx1ZSBhcyBWKTsKICAgIH0pOwogIH0KCiAgSXRlcmFibGU8Sz4gZ2V0IGtleXMgPT4gbmV3IENhc3RJdGVyYWJsZTxTSywgSz4oX3NvdXJjZS5rZXlzKTsKCiAgSXRlcmFibGU8Vj4gZ2V0IHZhbHVlcyA9PiBuZXcgQ2FzdEl0ZXJhYmxlPFNWLCBWPihfc291cmNlLnZhbHVlcyk7CgogIGludCBnZXQgbGVuZ3RoID0+IF9zb3VyY2UubGVuZ3RoOwoKICBib29sIGdldCBpc0VtcHR5ID0+IF9zb3VyY2UuaXNFbXB0eTsKCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBfc291cmNlLmlzTm90RW1wdHk7CgogIFYgdXBkYXRlKEsga2V5LCBWIHVwZGF0ZShWIHZhbHVlKSwge1YgaWZBYnNlbnQoKX0pIHsKICAgIHJldHVybiBfc291cmNlLnVwZGF0ZShrZXkgYXMgU0ssIChTViB2YWx1ZSkgPT4gdXBkYXRlKHZhbHVlIGFzIFYpIGFzIFNWLAogICAgICAgIGlmQWJzZW50OiAoaWZBYnNlbnQgPT0gbnVsbCkgPyBudWxsIDogKCkgPT4gaWZBYnNlbnQoKSBhcyBTVikgYXMgVjsKICB9CgogIHZvaWQgdXBkYXRlQWxsKFYgdXBkYXRlKEsga2V5LCBWIHZhbHVlKSkgewogICAgX3NvdXJjZS51cGRhdGVBbGwoKFNLIGtleSwgU1YgdmFsdWUpID0+IHVwZGF0ZShrZXkgYXMgSywgdmFsdWUgYXMgVikgYXMgU1YpOwogIH0KCiAgSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IGdldCBlbnRyaWVzIHsKICAgIHJldHVybiBfc291cmNlLmVudHJpZXMubWFwPE1hcEVudHJ5PEssIFY+PigKICAgICAgICAoTWFwRW50cnk8U0ssIFNWPiBlKSA9PiBuZXcgTWFwRW50cnk8SywgVj4oZS5rZXkgYXMgSywgZS52YWx1ZSBhcyBWKSk7CiAgfQoKICB2b2lkIGFkZEVudHJpZXMoSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IGVudHJpZXMpIHsKICAgIGZvciAodmFyIGVudHJ5IGluIGVudHJpZXMpIHsKICAgICAgX3NvdXJjZVtlbnRyeS5rZXkgYXMgU0tdID0gZW50cnkudmFsdWUgYXMgU1Y7CiAgICB9CiAgfQoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChLIGtleSwgViB2YWx1ZSkpIHsKICAgIF9zb3VyY2UucmVtb3ZlV2hlcmUoKFNLIGtleSwgU1YgdmFsdWUpID0+IHRlc3Qoa2V5IGFzIEssIHZhbHVlIGFzIFYpKTsKICB9Cn0KCmNsYXNzIENhc3RRdWV1ZTxTLCBUPiBleHRlbmRzIF9DYXN0SXRlcmFibGVCYXNlPFMsIFQ+IGltcGxlbWVudHMgUXVldWU8VD4gewogIGZpbmFsIFF1ZXVlPFM+IF9zb3VyY2U7CiAgQ2FzdFF1ZXVlKHRoaXMuX3NvdXJjZSk7CiAgUXVldWU8Uj4gY2FzdDxSPigpID0+IG5ldyBDYXN0UXVldWU8UywgUj4oX3NvdXJjZSk7CgogIFQgcmVtb3ZlRmlyc3QoKSA9PiBfc291cmNlLnJlbW92ZUZpcnN0KCkgYXMgVDsKICBUIHJlbW92ZUxhc3QoKSA9PiBfc291cmNlLnJlbW92ZUxhc3QoKSBhcyBUOwoKICB2b2lkIGFkZChUIHZhbHVlKSB7CiAgICBfc291cmNlLmFkZCh2YWx1ZSBhcyBTKTsKICB9CgogIHZvaWQgYWRkRmlyc3QoVCB2YWx1ZSkgewogICAgX3NvdXJjZS5hZGRGaXJzdCh2YWx1ZSBhcyBTKTsKICB9CgogIHZvaWQgYWRkTGFzdChUIHZhbHVlKSB7CiAgICBfc291cmNlLmFkZExhc3QodmFsdWUgYXMgUyk7CiAgfQoKICBib29sIHJlbW92ZShPYmplY3Qgb3RoZXIpID0+IF9zb3VyY2UucmVtb3ZlKG90aGVyKTsKICB2b2lkIGFkZEFsbChJdGVyYWJsZTxUPiBlbGVtZW50cykgewogICAgX3NvdXJjZS5hZGRBbGwobmV3IENhc3RJdGVyYWJsZTxULCBTPihlbGVtZW50cykpOwogIH0KCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoVCBlbGVtZW50KSkgewogICAgX3NvdXJjZS5yZW1vdmVXaGVyZSgoUyBlbGVtZW50KSA9PiB0ZXN0KGVsZW1lbnQgYXMgVCkpOwogIH0KCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoVCBlbGVtZW50KSkgewogICAgX3NvdXJjZS5yZXRhaW5XaGVyZSgoUyBlbGVtZW50KSA9PiB0ZXN0KGVsZW1lbnQgYXMgVCkpOwogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIF9zb3VyY2UuY2xlYXIoKTsKICB9Cn0KgWsATk48ARgBLAE9GwFIAUFNOlAFCw0ODw4MDQsMDg0RERITASQnLQFOTgE7JSMnAToBPSo1O0cBKwIBMhceKSkCATsdASABLTA9Bi0EATwCAUQsQhkCAUMYFwE2EA8PEw0PDQEzASohBAEgHQQBFh0EASQ0BAEpEk0EASIdBAEmKQQBNEAEATE9BAE2ATkBLwErPAQBKzwEAS48AVFPBAEpJQQBNjMEAUNLBAIBMxkaATQCAUgYAT8nIygBKQE3AT0wASY2BAE4AS0gBAEtIAQBKzwEASs8BAFOAStAQQQBKUE/BAFCSSMkUQYTBAE5AREVBAEUSRkTBAEeATQCATQdARkBRgFEATwBMgEmJgQBPUsBITYEATQBERUEASkpHwgEAUEBRQEkAScBLQE3TUwEAS1RBAEpME8EATYhNAYEATBLBAIBTBobNgExLwEWHQQBGyIEARohBAE2JjYEASs8BAErPAQBERUEAgEYZGFydDpfaW50ZXJuYWwvY2FzdC5kYXJ0Lm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pbnRlcm5hbC9saXN0LmRhcnSu0S8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuX2ludGVybmFsOwoKLyoqCiAqIE1peGluIHRoYXQgdGhyb3dzIG9uIHRoZSBsZW5ndGggY2hhbmdpbmcgb3BlcmF0aW9ucyBvZiBbTGlzdF0uCiAqCiAqIEludGVuZGVkIHRvIG1peC1pbiBvbiB0b3Agb2YgW0xpc3RNaXhpbl0gZm9yIGZpeGVkLWxlbmd0aCBsaXN0cy4KICovCmFic3RyYWN0IGNsYXNzIEZpeGVkTGVuZ3RoTGlzdE1peGluPEU+IHsKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhIGZpeGVkIGxlbmd0aCBsaXN0LiAqLwogIHNldCBsZW5ndGgoaW50IG5ld0xlbmd0aCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIkNhbm5vdCBjaGFuZ2UgdGhlIGxlbmd0aCBvZiBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhIGZpeGVkIGxlbmd0aCBsaXN0LiAqLwogIHZvaWQgYWRkKEUgdmFsdWUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgYWRkIHRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGEgZml4ZWQgbGVuZ3RoIGxpc3QuICovCiAgdm9pZCBpbnNlcnQoaW50IGluZGV4LCBFIHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGFkZCB0byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhIGZpeGVkIGxlbmd0aCBsaXN0LiAqLwogIHZvaWQgaW5zZXJ0QWxsKGludCBhdCwgSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgYWRkIHRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGEgZml4ZWQgbGVuZ3RoIGxpc3QuICovCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgYWRkIHRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGEgZml4ZWQgbGVuZ3RoIGxpc3QuICovCiAgYm9vbCByZW1vdmUoT2JqZWN0IGVsZW1lbnQpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYSBmaXhlZCBsZW5ndGggbGlzdC4gKi8KICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGEgZml4ZWQgbGVuZ3RoIGxpc3QuICovCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhIGZpeGVkIGxlbmd0aCBsaXN0LiAqLwogIHZvaWQgY2xlYXIoKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGNsZWFyIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGEgZml4ZWQgbGVuZ3RoIGxpc3QuICovCiAgRSByZW1vdmVBdChpbnQgaW5kZXgpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYSBmaXhlZCBsZW5ndGggbGlzdC4gKi8KICBFIHJlbW92ZUxhc3QoKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGEgZml4ZWQgbGVuZ3RoIGxpc3QuICovCiAgdm9pZCByZW1vdmVSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYSBmaXhlZCBsZW5ndGggbGlzdC4gKi8KICB2b2lkIHJlcGxhY2VSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9Cn0KCi8qKgogKiBNaXhpbiBmb3IgYW4gdW5tb2RpZmlhYmxlIFtMaXN0XSBjbGFzcy4KICoKICogVGhpcyBvdmVycmlkZXMgYWxsIG11dGF0aW5nIG1ldGhvZHMgd2l0aCBtZXRob2RzIHRoYXQgdGhyb3cuCiAqIFRoaXMgbWl4aW4gaXMgaW50ZW5kZWQgdG8gYmUgbWl4ZWQgaW4gb24gdG9wIG9mIFtMaXN0TWl4aW5dIG9uCiAqIHVubW9kaWZpYWJsZSBsaXN0cy4KICovCmFic3RyYWN0IGNsYXNzIFVubW9kaWZpYWJsZUxpc3RNaXhpbjxFPiBpbXBsZW1lbnRzIExpc3Q8RT4gewogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBsaXN0LiAqLwogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgRSB2YWx1ZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBsaXN0LiAqLwogIHNldCBsZW5ndGgoaW50IG5ld0xlbmd0aCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIkNhbm5vdCBjaGFuZ2UgdGhlIGxlbmd0aCBvZiBhbiB1bm1vZGlmaWFibGUgbGlzdCIpOwogIH0KCiAgc2V0IGZpcnN0KEUgZWxlbWVudCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QiKTsKICB9CgogIHNldCBsYXN0KEUgZWxlbWVudCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBsaXN0LiAqLwogIHZvaWQgc2V0QWxsKGludCBhdCwgSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbiB1bm1vZGlmaWFibGUgbGlzdC4gKi8KICB2b2lkIGFkZChFIHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGFkZCB0byBhbiB1bm1vZGlmaWFibGUgbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QuICovCiAgdm9pZCBpbnNlcnQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgYWRkIHRvIGFuIHVubW9kaWZpYWJsZSBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbiB1bm1vZGlmaWFibGUgbGlzdC4gKi8KICB2b2lkIGluc2VydEFsbChpbnQgYXQsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGFkZCB0byBhbiB1bm1vZGlmaWFibGUgbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QuICovCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgYWRkIHRvIGFuIHVubW9kaWZpYWJsZSBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbiB1bm1vZGlmaWFibGUgbGlzdC4gKi8KICBib29sIHJlbW92ZShPYmplY3QgZWxlbWVudCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhbiB1bm1vZGlmaWFibGUgbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QuICovCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhbiB1bm1vZGlmaWFibGUgbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QuICovCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhbiB1bm1vZGlmaWFibGUgbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QuICovCiAgdm9pZCBzb3J0KFtDb21wYXJhdG9yPEU+IGNvbXBhcmVdKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QuICovCiAgdm9pZCBzaHVmZmxlKFtSYW5kb20gcmFuZG9tXSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBsaXN0LiAqLwogIHZvaWQgY2xlYXIoKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGNsZWFyIGFuIHVubW9kaWZpYWJsZSBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbiB1bm1vZGlmaWFibGUgbGlzdC4gKi8KICBFIHJlbW92ZUF0KGludCBpbmRleCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhbiB1bm1vZGlmaWFibGUgbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QuICovCiAgRSByZW1vdmVMYXN0KCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhbiB1bm1vZGlmaWFibGUgbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QuICovCiAgdm9pZCBzZXRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlLCBbaW50IHNraXBDb3VudCA9IDBdKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QuICovCiAgdm9pZCByZW1vdmVSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYW4gdW5tb2RpZmlhYmxlIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBsaXN0LiAqLwogIHZvaWQgcmVwbGFjZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYW4gdW5tb2RpZmlhYmxlIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBsaXN0LiAqLwogIHZvaWQgZmlsbFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgW0UgZmlsbFZhbHVlXSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QiKTsKICB9Cn0KCi8qKgogKiBBYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiBhIGZpeGVkLWxlbmd0aCBsaXN0LgogKgogKiBBbGwgb3BlcmF0aW9ucyBhcmUgZGVmaW5lZCBpbiB0ZXJtcyBvZiBgbGVuZ3RoYCwgYG9wZXJhdG9yW11gIGFuZAogKiBgb3BlcmF0b3JbXT1gLCB3aGljaCBuZWVkIHRvIGJlIGltcGxlbWVudGVkLgogKi8KYWJzdHJhY3QgY2xhc3MgRml4ZWRMZW5ndGhMaXN0QmFzZTxFPiA9IExpc3RCYXNlPEU+CiAgICB3aXRoIEZpeGVkTGVuZ3RoTGlzdE1peGluPEU+OwoKLyoqCiAqIEFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIGFuIHVubW9kaWZpYWJsZSBsaXN0LgogKgogKiBBbGwgb3BlcmF0aW9ucyBhcmUgZGVmaW5lZCBpbiB0ZXJtcyBvZiBgbGVuZ3RoYCBhbmQgYG9wZXJhdG9yW11gLAogKiB3aGljaCBuZWVkIHRvIGJlIGltcGxlbWVudGVkLgogKi8KYWJzdHJhY3QgY2xhc3MgVW5tb2RpZmlhYmxlTGlzdEJhc2U8RT4gPSBMaXN0QmFzZTxFPgogICAgd2l0aCBVbm1vZGlmaWFibGVMaXN0TWl4aW48RT47CgpjbGFzcyBfTGlzdEluZGljZXNJdGVyYWJsZSBleHRlbmRzIExpc3RJdGVyYWJsZTxpbnQ+IHsKICBMaXN0IF9iYWNrZWRMaXN0OwoKICBfTGlzdEluZGljZXNJdGVyYWJsZSh0aGlzLl9iYWNrZWRMaXN0KTsKCiAgaW50IGdldCBsZW5ndGggPT4gX2JhY2tlZExpc3QubGVuZ3RoOwogIGludCBlbGVtZW50QXQoaW50IGluZGV4KSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRJbmRleChpbmRleCwgdGhpcyk7CiAgICByZXR1cm4gaW5kZXg7CiAgfQp9CgpjbGFzcyBMaXN0TWFwVmlldzxFPiBleHRlbmRzIFVubW9kaWZpYWJsZU1hcEJhc2U8aW50LCBFPiB7CiAgTGlzdDxFPiBfdmFsdWVzOwoKICBMaXN0TWFwVmlldyh0aGlzLl92YWx1ZXMpOwoKICBFIG9wZXJhdG9yIFtdKE9iamVjdCBrZXkpID0+IGNvbnRhaW5zS2V5KGtleSkgPyBfdmFsdWVzW2tleV0gOiBudWxsOwogIGludCBnZXQgbGVuZ3RoID0+IF92YWx1ZXMubGVuZ3RoOwoKICBJdGVyYWJsZTxFPiBnZXQgdmFsdWVzID0+IG5ldyBTdWJMaXN0SXRlcmFibGU8RT4oX3ZhbHVlcywgMCwgbnVsbCk7CiAgSXRlcmFibGU8aW50PiBnZXQga2V5cyA9PiBuZXcgX0xpc3RJbmRpY2VzSXRlcmFibGUoX3ZhbHVlcyk7CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX3ZhbHVlcy5pc0VtcHR5OwogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gX3ZhbHVlcy5pc05vdEVtcHR5OwogIGJvb2wgY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpID0+IF92YWx1ZXMuY29udGFpbnModmFsdWUpOwogIGJvb2wgY29udGFpbnNLZXkoT2JqZWN0IGtleSkgPT4ga2V5IGlzIGludCAmJiBrZXkgPj0gMCAmJiBrZXkgPCBsZW5ndGg7CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoaW50IGtleSwgRSB2YWx1ZSkpIHsKICAgIGludCBsZW5ndGggPSBfdmFsdWVzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgZihpLCBfdmFsdWVzW2ldKTsKICAgICAgaWYgKGxlbmd0aCAhPSBfdmFsdWVzLmxlbmd0aCkgewogICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IoX3ZhbHVlcyk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmNsYXNzIFJldmVyc2VkTGlzdEl0ZXJhYmxlPEU+IGV4dGVuZHMgTGlzdEl0ZXJhYmxlPEU+IHsKICBJdGVyYWJsZTxFPiBfc291cmNlOwogIFJldmVyc2VkTGlzdEl0ZXJhYmxlKHRoaXMuX3NvdXJjZSk7CgogIGludCBnZXQgbGVuZ3RoID0+IF9zb3VyY2UubGVuZ3RoOwoKICBFIGVsZW1lbnRBdChpbnQgaW5kZXgpID0+IF9zb3VyY2UuZWxlbWVudEF0KF9zb3VyY2UubGVuZ3RoIC0gMSAtIGluZGV4KTsKfQoKLyoqCiAqIENyZWF0ZXMgZXJyb3JzIHRocm93biBieSB1bm1vZGlmaWFibGUgbGlzdHMgd2hlbiB0aGV5IGFyZSBhdHRlbXB0ZWQgbW9kaWZpZWQuCiAqCiAqIFRoaXMgY2xhc3MgY3JlYXRlcyBbVW5zdXBwb3J0ZWRFcnJvcl1zIHdpdGggc3BlY2lhbGl6ZWQgbWVzc2FnZXMuCiAqLwphYnN0cmFjdCBjbGFzcyBVbm1vZGlmaWFibGVMaXN0RXJyb3IgewogIC8qKiBFcnJvciB0aHJvd24gd2hlbiB0cnlpbmcgdG8gYWRkIGVsZW1lbnRzIHRvIGFuIHVubW9kaWZpYWJsZSBsaXN0LiAqLwogIHN0YXRpYyBVbnN1cHBvcnRlZEVycm9yIGFkZCgpID0+CiAgICAgIG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgYWRkIHRvIHVubW9kaWZpYWJsZSBMaXN0Iik7CgogIC8qKiBFcnJvciB0aHJvd24gd2hlbiB0cnlpbmcgdG8gYWRkIGVsZW1lbnRzIHRvIGFuIHVubW9kaWZpYWJsZSBsaXN0LiAqLwogIHN0YXRpYyBVbnN1cHBvcnRlZEVycm9yIGNoYW5nZSgpID0+CiAgICAgIG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgY2hhbmdlIHRoZSBjb250ZW50IG9mIGFuIHVubW9kaWZpYWJsZSBMaXN0Iik7CgogIC8qKiBFcnJvciB0aHJvd24gd2hlbiB0cnlpbmcgdG8gY2hhbmdlIHRoZSBsZW5ndGggb2YgYW4gdW5tb2RpZmlhYmxlIGxpc3QuICovCiAgc3RhdGljIFVuc3VwcG9ydGVkRXJyb3IgbGVuZ3RoKCkgPT4KICAgICAgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBjaGFuZ2UgbGVuZ3RoIG9mIHVubW9kaWZpYWJsZSBMaXN0Iik7CgogIC8qKiBFcnJvciB0aHJvd24gd2hlbiB0cnlpbmcgdG8gcmVtb3ZlIGVsZW1lbnRzIGZyb20gYW4gdW5tb2RpZmlhYmxlIGxpc3QuICovCiAgc3RhdGljIFVuc3VwcG9ydGVkRXJyb3IgcmVtb3ZlKCkgPT4KICAgICAgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSB1bm1vZGlmaWFibGUgTGlzdCIpOwp9CgovKioKICogQ3JlYXRlcyBlcnJvcnMgdGhyb3duIGJ5IG5vbi1ncm93YWJsZSBsaXN0cyB3aGVuIHRoZXkgYXJlIGF0dGVtcHRlZCBtb2RpZmllZC4KICoKICogVGhpcyBjbGFzcyBjcmVhdGVzIFtVbnN1cHBvcnRlZEVycm9yXXMgd2l0aCBzcGVjaWFsaXplZCBtZXNzYWdlcy4KICovCmFic3RyYWN0IGNsYXNzIE5vbkdyb3dhYmxlTGlzdEVycm9yIHsKICAvKiogRXJyb3IgdGhyb3duIHdoZW4gdHJ5aW5nIHRvIGFkZCBlbGVtZW50cyB0byBhbiBub24tZ3Jvd2FibGUgbGlzdC4gKi8KICBzdGF0aWMgVW5zdXBwb3J0ZWRFcnJvciBhZGQoKSA9PgogICAgICBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGFkZCB0byBub24tZ3Jvd2FibGUgTGlzdCIpOwoKICAvKiogRXJyb3IgdGhyb3duIHdoZW4gdHJ5aW5nIHRvIGNoYW5nZSB0aGUgbGVuZ3RoIG9mIGFuIG5vbi1ncm93YWJsZSBsaXN0LiAqLwogIHN0YXRpYyBVbnN1cHBvcnRlZEVycm9yIGxlbmd0aCgpID0+CiAgICAgIG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgY2hhbmdlIGxlbmd0aCBvZiBub24tZ3Jvd2FibGUgTGlzdCIpOwoKICAvKiogRXJyb3IgdGhyb3duIHdoZW4gdHJ5aW5nIHRvIHJlbW92ZSBlbGVtZW50cyBmcm9tIGFuIG5vbi1ncm93YWJsZSBsaXN0LiAqLwogIHN0YXRpYyBVbnN1cHBvcnRlZEVycm9yIHJlbW92ZSgpID0+CiAgICAgIG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gbm9uLWdyb3dhYmxlIExpc3QiKTsKfQoKLyoqCiAqIENvbnZlcnRzIGEgZ3Jvd2FibGUgbGlzdCB0byBhIGZpeGVkIGxlbmd0aCBsaXN0IHdpdGggdGhlIHNhbWUgZWxlbWVudHMuCiAqCiAqIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KICogT25seSB3b3JrcyBvbiBncm93YWJsZSBsaXN0cyBhcyBjcmVhdGVkIGJ5IGBbXWAgb3IgYG5ldyBMaXN0KClgLgogKiBNYXkgdGhyb3cgb24gYW55IG90aGVyIGxpc3QuCiAqCiAqIFRoZSBvcGVyYXRpb24gaXMgZWZmaWNpZW50LiBJdCBkb2Vzbid0IGNvcHkgdGhlIGVsZW1lbnRzLCBidXQgY29udmVydHMKICogdGhlIGV4aXN0aW5nIGxpc3QgZGlyZWN0bHkgdG8gYSBmaXhlZCBsZW5ndGggbGlzdC4KICogVGhhdCBtZWFucyB0aGF0IGl0IGlzIGEgZGVzdHJ1Y3RpdmUgY29udmVyc2lvbi4KICogVGhlIG9yaWdpbmFsIGxpc3Qgc2hvdWxkIG5vdCBiZSB1c2VkIGFmdGVyd2FyZHMuCiAqCiAqIFRoZSByZXR1cm5lZCBsaXN0IG1heSBiZSB0aGUgc2FtZSBsaXN0IGFzIHRoZSBvcmlnaW5hbCwKICogb3IgaXQgbWF5IGJlIGEgZGlmZmVyZW50IGxpc3QgKGFjY29yZGluZyB0byBbaWRlbnRpY2FsXSkuCiAqIFRoZSBvcmlnaW5hbCBsaXN0IG1heSBoYXZlIGNoYW5nZWQgdHlwZSB0byBiZSBhIGZpeGVkIGxpc3QsCiAqIG9yIGJlY29tZSBlbXB0eSBvciBiZWVuIG90aGVyd2lzZSBtb2RpZmllZC4KICogSXQgd2lsbCBzdGlsbCBiZSBhIHZhbGlkIG9iamVjdCwgc28gcmVmZXJlbmNlcyB0byBpdCB3aWxsIG5vdCwgZS5nLiwgY3Jhc2gKICogdGhlIHJ1bnRpbWUgaWYgYWNjZXNzZWQsIGJ1dCBubyBwcm9taXNlcyBhcmUgbWFkZSB3cnQuIGl0cyBjb250ZW50cy4KICoKICogVGhpcyB1bnNwZWNpZmllZCBiZWhhdmlvciBpcyB0aGUgcmVhc29uIHRoZSBmdW5jdGlvbiBpcyBub3QgZXhwb3NlZCB0bwogKiB1c2Vycy4gV2UgYWxsb3cgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gdG8gbWFrZSB0aGUgbW9zdCBlZmZpY2llbnQKICogY29udmVyc2lvbiwgYXQgdGhlIGNvc3Qgb2YgbGVhdmluZyB0aGUgb3JpZ2luYWwgbGlzdCBpbiBhbiB1bnNwZWNpZmllZAogKiBzdGF0ZS4KICovCmV4dGVybmFsIExpc3Q8VD4gbWFrZUxpc3RGaXhlZExlbmd0aDxUPihMaXN0PFQ+IGdyb3dhYmxlTGlzdCk7CgovKioKICogQ29udmVydHMgYSBmaXhlZC1sZW5ndGggbGlzdCB0byBhbiB1bm1vZGlmaWFibGUgbGlzdC4KICoKICogRm9yIGludGVybmFsIHVzZSBvbmx5LgogKiBPbmx5IHdvcmtzIGZvciBjb3JlIGZpeGVkLWxlbmd0aCBsaXN0cyBhcyBjcmVhdGVkIGJ5IGBuZXcgTGlzdChsZW5ndGgpYCwKICogb3IgYXMgcmV0dXJuZWQgYnkgW21ha2VMaXN0Rml4ZWRMZW5ndGhdLgogKgogKiBUaGUgb3BlcmF0aW9uIGlzIGVmZmljaWVudC4gSXQgZG9lc24ndCBjb3B5IHRoZSBlbGVtZW50cywgYnV0IGNvbnZlcnRzCiAqIHRoZSBleGlzdGluZyBsaXN0IGRpcmVjdGx5IHRvIGEgZml4ZWQgbGVuZ3RoIGxpc3QuCiAqIFRoYXQgbWVhbnMgdGhhdCBpdCBpcyBhIGRlc3RydWN0aXZlIGNvbnZlcnNpb24uCiAqIFRoZSBvcmlnaW5hbCBsaXN0IHNob3VsZCBub3QgYmUgdXNlZCBhZnRlcndhcmRzLgogKgogKiBUaGUgdW5tb2RpZmlhYmxlIGxpc3QgdHlwZSBpcyBzaW1pbGFyIHRvIHRoZSBvbmUgdXNlZCBieSBjb25zdCBsaXN0cy4KICovCmV4dGVybmFsIExpc3Q8VD4gbWFrZUZpeGVkTGlzdFVubW9kaWZpYWJsZTxUPihMaXN0PFQ+IGZpeGVkTGVuZ3RoTGlzdCk7CoFXAE5OPAEYAQRCA0QEKUEeIDwEAUEWRQQBQSRFBAFBMUUEAUEmRQQBQSBKBAFBK0oEAUErSgQBQRFEBAFBGkoEAUETSgQBQSlKBAFBQEoEAgEEKwNAQhcEPUIqRgQBQh4gPQQBGUYEARhGBAFCLkYEAUIWRgQBQiZGBAFCMUYEAUImRgQBQiBLBAFCK0sEAUIrSwQBQidGBAFCIkYEAUIRRQQBQhpLBAFCE0sEAUJRRgQBQilLBAFCQEsEAUI2RgQCAQQzA0UwBDQiAQQ0A0UhBDUjATcUASoBKB0tEgQCATsTAR0BRyQBRj8BJy0/SgErIScYJjgIBgQCATgXJgEkAUsCAQRRA0UEJ0sjPwFLJlEBUCZJAVAmRAIBBFEDRQQmSyM/AVAmSQFQJkQCAQRLAxpEIANKNjM0Azs9Py9OSANKTEoKBD8BBDkDGkwsA0o2MzQDSQRIARhkYXJ0Ol9pbnRlcm5hbC9saXN0LmRhcnQub3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2ludGVybmFsL3NvcnQuZGFydK/FLy8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5faW50ZXJuYWw7CgovKioKICogRHVhbC1QaXZvdCBRdWlja3NvcnQgYWxnb3JpdGhtLgogKgogKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGR1YWwtcGl2b3QgcXVpY2tzb3J0IGFsZ29yaXRobSBhcyBwcmVzZW50ZWQgaW4KICogVmxhZGltaXIgWWFyb3NsYXZza2l5J3MgcGFwZXIuCiAqCiAqIFNvbWUgaW1wcm92ZW1lbnRzIGhhdmUgYmVlbiBjb3BpZWQgZnJvbSBBbmRyb2lkJ3MgaW1wbGVtZW50YXRpb24uCiAqLwpjbGFzcyBTb3J0IHsKICAvLyBXaGVuIGEgbGlzdCBoYXMgbGVzcyB0aGVuIFs6X0lOU0VSVElPTl9TT1JUX1RIUkVTSE9MRDpdIGVsZW1lbnRzIGl0IHdpbGwKICAvLyBiZSBzb3J0ZWQgYnkgYW4gaW5zZXJ0aW9uIHNvcnQuCiAgc3RhdGljIGNvbnN0IGludCBfSU5TRVJUSU9OX1NPUlRfVEhSRVNIT0xEID0gMzI7CgogIC8qKgogICAqIFNvcnRzIGFsbCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gbGlzdCBbOmE6XSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuCiAgICogWzpjb21wYXJlOl0gZnVuY3Rpb24uCiAgICoKICAgKiBUaGUgWzpjb21wYXJlOl0gZnVuY3Rpb24gdGFrZXMgdHdvIGFyZ3VtZW50cyBbOng6XSBhbmQgWzp5Ol0gYW5kIHJldHVybnMKICAgKiAgLTEgaWYgWzp4IDwgeTpdLAogICAqICAgMCBpZiBbOnggPT0geTpdLCBhbmQKICAgKiAgIDEgaWYgWzp4ID4geTpdLgogICAqCiAgICogVGhlIGZ1bmN0aW9uJ3MgYmVoYXZpb3IgbXVzdCBiZSBjb25zaXN0ZW50LiBJdCBtdXN0IG5vdCByZXR1cm4gZGlmZmVyZW50CiAgICogcmVzdWx0cyBmb3IgdGhlIHNhbWUgdmFsdWVzLgogICAqLwogIHN0YXRpYyB2b2lkIHNvcnQ8RT4oTGlzdDxFPiBhLCBpbnQgY29tcGFyZShFIGEsIEUgYikpIHsKICAgIF9kb1NvcnQoYSwgMCwgYS5sZW5ndGggLSAxLCBjb21wYXJlKTsKICB9CgogIC8qKgogICAqIFNvcnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgWzpmcm9tOl0gKGluY2x1c2l2ZSkgdG8gWzp0bzpdIChleGNsdXNpdmUpCiAgICogb2YgdGhlIGdpdmVuIGxpc3QgWzphOl0uCiAgICoKICAgKiBJZiB0aGUgZ2l2ZW4gcmFuZ2UgaXMgaW52YWxpZCBhbiAiT3V0T2ZSYW5nZSIgZXJyb3IgaXMgcmFpc2VkLgogICAqIFRPRE8oZmxvaXRzY2gpOiBkbyB3ZSB3YW50IGFuIGVycm9yPwogICAqCiAgICogU2VlIFs6c29ydDpdIGZvciByZXF1aXJlbWVudHMgb2YgdGhlIFs6Y29tcGFyZTpdIGZ1bmN0aW9uLgogICAqLwogIHN0YXRpYyB2b2lkIHNvcnRSYW5nZTxFPihMaXN0PEU+IGEsIGludCBmcm9tLCBpbnQgdG8sIGludCBjb21wYXJlKEUgYSwgRSBiKSkgewogICAgaWYgKChmcm9tIDwgMCkgfHwgKHRvID4gYS5sZW5ndGgpIHx8ICh0byA8IGZyb20pKSB7CiAgICAgIHRocm93ICJPdXRPZlJhbmdlIjsKICAgIH0KICAgIF9kb1NvcnQoYSwgZnJvbSwgdG8gLSAxLCBjb21wYXJlKTsKICB9CgogIC8qKgogICAqIFNvcnRzIHRoZSBsaXN0IGluIHRoZSBpbnRlcnZhbCBbOmxlZnQ6XSB0byBbOnJpZ2h0Ol0gKGJvdGggaW5jbHVzaXZlKS4KICAgKi8KICBzdGF0aWMgdm9pZCBfZG9Tb3J0PEU+KAogICAgICBMaXN0PEU+IGEsIGludCBsZWZ0LCBpbnQgcmlnaHQsIGludCBjb21wYXJlKEUgYSwgRSBiKSkgewogICAgaWYgKChyaWdodCAtIGxlZnQpIDw9IF9JTlNFUlRJT05fU09SVF9USFJFU0hPTEQpIHsKICAgICAgX2luc2VydGlvblNvcnQoYSwgbGVmdCwgcmlnaHQsIGNvbXBhcmUpOwogICAgfSBlbHNlIHsKICAgICAgX2R1YWxQaXZvdFF1aWNrc29ydChhLCBsZWZ0LCByaWdodCwgY29tcGFyZSk7CiAgICB9CiAgfQoKICBzdGF0aWMgdm9pZCBfaW5zZXJ0aW9uU29ydDxFPigKICAgICAgTGlzdDxFPiBhLCBpbnQgbGVmdCwgaW50IHJpZ2h0LCBpbnQgY29tcGFyZShFIGEsIEUgYikpIHsKICAgIGZvciAoaW50IGkgPSBsZWZ0ICsgMTsgaSA8PSByaWdodDsgaSsrKSB7CiAgICAgIHZhciBlbCA9IGFbaV07CiAgICAgIGludCBqID0gaTsKICAgICAgd2hpbGUgKChqID4gbGVmdCkgJiYgKGNvbXBhcmUoYVtqIC0gMV0sIGVsKSA+IDApKSB7CiAgICAgICAgYVtqXSA9IGFbaiAtIDFdOwogICAgICAgIGotLTsKICAgICAgfQogICAgICBhW2pdID0gZWw7CiAgICB9CiAgfQoKICBzdGF0aWMgdm9pZCBfZHVhbFBpdm90UXVpY2tzb3J0PEU+KAogICAgICBMaXN0PEU+IGEsIGludCBsZWZ0LCBpbnQgcmlnaHQsIGludCBjb21wYXJlKEUgYSwgRSBiKSkgewogICAgYXNzZXJ0KHJpZ2h0IC0gbGVmdCA+IF9JTlNFUlRJT05fU09SVF9USFJFU0hPTEQpOwoKICAgIC8vIENvbXB1dGUgdGhlIHR3byBwaXZvdHMgYnkgbG9va2luZyBhdCA1IGVsZW1lbnRzLgogICAgaW50IHNpeHRoID0gKHJpZ2h0IC0gbGVmdCArIDEpIH4vIDY7CiAgICBpbnQgaW5kZXgxID0gbGVmdCArIHNpeHRoOwogICAgaW50IGluZGV4NSA9IHJpZ2h0IC0gc2l4dGg7CiAgICBpbnQgaW5kZXgzID0gKGxlZnQgKyByaWdodCkgfi8gMjsgLy8gVGhlIG1pZHBvaW50LgogICAgaW50IGluZGV4MiA9IGluZGV4MyAtIHNpeHRoOwogICAgaW50IGluZGV4NCA9IGluZGV4MyArIHNpeHRoOwoKICAgIHZhciBlbDEgPSBhW2luZGV4MV07CiAgICB2YXIgZWwyID0gYVtpbmRleDJdOwogICAgdmFyIGVsMyA9IGFbaW5kZXgzXTsKICAgIHZhciBlbDQgPSBhW2luZGV4NF07CiAgICB2YXIgZWw1ID0gYVtpbmRleDVdOwoKICAgIC8vIFNvcnQgdGhlIHNlbGVjdGVkIDUgZWxlbWVudHMgdXNpbmcgYSBzb3J0aW5nIG5ldHdvcmsuCiAgICBpZiAoY29tcGFyZShlbDEsIGVsMikgPiAwKSB7CiAgICAgIHZhciB0ID0gZWwxOwogICAgICBlbDEgPSBlbDI7CiAgICAgIGVsMiA9IHQ7CiAgICB9CiAgICBpZiAoY29tcGFyZShlbDQsIGVsNSkgPiAwKSB7CiAgICAgIHZhciB0ID0gZWw0OwogICAgICBlbDQgPSBlbDU7CiAgICAgIGVsNSA9IHQ7CiAgICB9CiAgICBpZiAoY29tcGFyZShlbDEsIGVsMykgPiAwKSB7CiAgICAgIHZhciB0ID0gZWwxOwogICAgICBlbDEgPSBlbDM7CiAgICAgIGVsMyA9IHQ7CiAgICB9CiAgICBpZiAoY29tcGFyZShlbDIsIGVsMykgPiAwKSB7CiAgICAgIHZhciB0ID0gZWwyOwogICAgICBlbDIgPSBlbDM7CiAgICAgIGVsMyA9IHQ7CiAgICB9CiAgICBpZiAoY29tcGFyZShlbDEsIGVsNCkgPiAwKSB7CiAgICAgIHZhciB0ID0gZWwxOwogICAgICBlbDEgPSBlbDQ7CiAgICAgIGVsNCA9IHQ7CiAgICB9CiAgICBpZiAoY29tcGFyZShlbDMsIGVsNCkgPiAwKSB7CiAgICAgIHZhciB0ID0gZWwzOwogICAgICBlbDMgPSBlbDQ7CiAgICAgIGVsNCA9IHQ7CiAgICB9CiAgICBpZiAoY29tcGFyZShlbDIsIGVsNSkgPiAwKSB7CiAgICAgIHZhciB0ID0gZWwyOwogICAgICBlbDIgPSBlbDU7CiAgICAgIGVsNSA9IHQ7CiAgICB9CiAgICBpZiAoY29tcGFyZShlbDIsIGVsMykgPiAwKSB7CiAgICAgIHZhciB0ID0gZWwyOwogICAgICBlbDIgPSBlbDM7CiAgICAgIGVsMyA9IHQ7CiAgICB9CiAgICBpZiAoY29tcGFyZShlbDQsIGVsNSkgPiAwKSB7CiAgICAgIHZhciB0ID0gZWw0OwogICAgICBlbDQgPSBlbDU7CiAgICAgIGVsNSA9IHQ7CiAgICB9CgogICAgdmFyIHBpdm90MSA9IGVsMjsKICAgIHZhciBwaXZvdDIgPSBlbDQ7CgogICAgLy8gZWwyIGFuZCBlbDQgaGF2ZSBiZWVuIHNhdmVkIGluIHRoZSBwaXZvdCB2YXJpYWJsZXMuIFRoZXkgd2lsbCBiZSB3cml0dGVuCiAgICAvLyBiYWNrLCBvbmNlIHRoZSBwYXJ0aXRpb25pbmcgaXMgZmluaXNoZWQuCiAgICBhW2luZGV4MV0gPSBlbDE7CiAgICBhW2luZGV4M10gPSBlbDM7CiAgICBhW2luZGV4NV0gPSBlbDU7CgogICAgYVtpbmRleDJdID0gYVtsZWZ0XTsKICAgIGFbaW5kZXg0XSA9IGFbcmlnaHRdOwoKICAgIGludCBsZXNzID0gbGVmdCArIDE7IC8vIEZpcnN0IGVsZW1lbnQgaW4gdGhlIG1pZGRsZSBwYXJ0aXRpb24uCiAgICBpbnQgZ3JlYXQgPSByaWdodCAtIDE7IC8vIExhc3QgZWxlbWVudCBpbiB0aGUgbWlkZGxlIHBhcnRpdGlvbi4KCiAgICBib29sIHBpdm90c19hcmVfZXF1YWwgPSAoY29tcGFyZShwaXZvdDEsIHBpdm90MikgPT0gMCk7CiAgICBpZiAocGl2b3RzX2FyZV9lcXVhbCkgewogICAgICB2YXIgcGl2b3QgPSBwaXZvdDE7CiAgICAgIC8vIERlZ2VuZXJhdGVkIGNhc2Ugd2hlcmUgdGhlIHBhcnRpdGlvbmluZyBiZWNvbWVzIGEgRHV0Y2ggbmF0aW9uYWwgZmxhZwogICAgICAvLyBwcm9ibGVtLgogICAgICAvLwogICAgICAvLyBbIHwgIDwgcGl2b3QgIHwgPT0gcGl2b3QgfCB1bnBhcnRpdGlvbmVkIHwgPiBwaXZvdCAgfCBdCiAgICAgIC8vICBeICAgICAgICAgICAgIF4gICAgICAgICAgXiAgICAgICAgICAgICBeICAgICAgICAgICAgXgogICAgICAvLyBsZWZ0ICAgICAgICAgbGVzcyAgICAgICAgIGsgICAgICAgICAgIGdyZWF0ICAgICAgICAgcmlnaHQKICAgICAgLy8KICAgICAgLy8gYVtsZWZ0XSBhbmQgYVtyaWdodF0gYXJlIHVuZGVmaW5lZCBhbmQgYXJlIGZpbGxlZCBhZnRlciB0aGUKICAgICAgLy8gcGFydGl0aW9uaW5nLgogICAgICAvLwogICAgICAvLyBJbnZhcmlhbnRzOgogICAgICAvLyAgIDEpIGZvciB4IGluIF1sZWZ0LCBsZXNzWyA6IHggPCBwaXZvdC4KICAgICAgLy8gICAyKSBmb3IgeCBpbiBbbGVzcywga1sgOiB4ID09IHBpdm90LgogICAgICAvLyAgIDMpIGZvciB4IGluIF1ncmVhdCwgcmlnaHRbIDogeCA+IHBpdm90LgogICAgICBmb3IgKGludCBrID0gbGVzczsgayA8PSBncmVhdDsgaysrKSB7CiAgICAgICAgdmFyIGFrID0gYVtrXTsKICAgICAgICBpbnQgY29tcCA9IGNvbXBhcmUoYWssIHBpdm90KTsKICAgICAgICBpZiAoY29tcCA9PSAwKSBjb250aW51ZTsKICAgICAgICBpZiAoY29tcCA8IDApIHsKICAgICAgICAgIGlmIChrICE9IGxlc3MpIHsKICAgICAgICAgICAgYVtrXSA9IGFbbGVzc107CiAgICAgICAgICAgIGFbbGVzc10gPSBhazsKICAgICAgICAgIH0KICAgICAgICAgIGxlc3MrKzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gY29tcCA+IDAuCiAgICAgICAgICAvLwogICAgICAgICAgLy8gRmluZCB0aGUgZmlyc3QgZWxlbWVudCA8PSBwaXZvdCBpbiB0aGUgcmFuZ2UgW2sgLSAxLCBncmVhdF0gYW5kCiAgICAgICAgICAvLyBwdXQgWzphazpdIHRoZXJlLiBXZSBrbm93IHRoYXQgc3VjaCBhbiBlbGVtZW50IG11c3QgZXhpc3Q6CiAgICAgICAgICAvLyBXaGVuIGsgPT0gbGVzcywgdGhlbiBlbDMgKHdoaWNoIGlzIGVxdWFsIHRvIHBpdm90KSBsaWVzIGluIHRoZQogICAgICAgICAgLy8gaW50ZXJ2YWwuIE90aGVyd2lzZSBhW2sgLSAxXSA9PSBwaXZvdCBhbmQgdGhlIHNlYXJjaCBzdG9wcyBhdCBrLTEuCiAgICAgICAgICAvLyBOb3RlIHRoYXQgaW4gdGhlIGxhdHRlciBjYXNlIGludmFyaWFudCAyIHdpbGwgYmUgdmlvbGF0ZWQgZm9yIGEKICAgICAgICAgIC8vIHNob3J0IGFtb3VudCBvZiB0aW1lLiBUaGUgaW52YXJpYW50IHdpbGwgYmUgcmVzdG9yZWQgd2hlbiB0aGUKICAgICAgICAgIC8vIHBpdm90cyBhcmUgcHV0IGludG8gdGhlaXIgZmluYWwgcG9zaXRpb25zLgogICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgY29tcCA9IGNvbXBhcmUoYVtncmVhdF0sIHBpdm90KTsKICAgICAgICAgICAgaWYgKGNvbXAgPiAwKSB7CiAgICAgICAgICAgICAgZ3JlYXQtLTsKICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBvbmx5IGxvY2F0aW9uIGluIHRoZSB3aGlsZS1sb29wIHdoZXJlIGEgbmV3CiAgICAgICAgICAgICAgLy8gaXRlcmF0aW9uIGlzIHN0YXJ0ZWQuCiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcCA8IDApIHsKICAgICAgICAgICAgICAvLyBUcmlwbGUgZXhjaGFuZ2UuCiAgICAgICAgICAgICAgYVtrXSA9IGFbbGVzc107CiAgICAgICAgICAgICAgYVtsZXNzKytdID0gYVtncmVhdF07CiAgICAgICAgICAgICAgYVtncmVhdC0tXSA9IGFrOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIC8vIGNvbXAgPT0gMDsKICAgICAgICAgICAgICBhW2tdID0gYVtncmVhdF07CiAgICAgICAgICAgICAgYVtncmVhdC0tXSA9IGFrOwogICAgICAgICAgICAgIC8vIE5vdGU6IGlmIGdyZWF0IDwgayB0aGVuIHdlIHdpbGwgZXhpdCB0aGUgb3V0ZXIgbG9vcCBhbmQgZml4CiAgICAgICAgICAgICAgLy8gaW52YXJpYW50IDIgKHdoaWNoIHdlIGp1c3QgdmlvbGF0ZWQpLgogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBXZSBwYXJ0aXRpb24gdGhlIGxpc3QgaW50byB0aHJlZSBwYXJ0czoKICAgICAgLy8gIDEuIDwgcGl2b3QxCiAgICAgIC8vICAyLiA+PSBwaXZvdDEgJiYgPD0gcGl2b3QyCiAgICAgIC8vICAzLiA+IHBpdm90MgogICAgICAvLwogICAgICAvLyBEdXJpbmcgdGhlIGxvb3Agd2UgaGF2ZToKICAgICAgLy8gWyB8IDwgcGl2b3QxIHwgPj0gcGl2b3QxICYmIDw9IHBpdm90MiB8IHVucGFydGl0aW9uZWQgIHwgPiBwaXZvdDIgIHwgXQogICAgICAvLyAgXiAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAgICBeICAgICAgICAgICAgICBeICAgICAgICAgICAgIF4KICAgICAgLy8gbGVmdCAgICAgICAgIGxlc3MgICAgICAgICAgICAgICAgICAgICBrICAgICAgICAgICAgICBncmVhdCAgICAgICAgcmlnaHQKICAgICAgLy8KICAgICAgLy8gYVtsZWZ0XSBhbmQgYVtyaWdodF0gYXJlIHVuZGVmaW5lZCBhbmQgYXJlIGZpbGxlZCBhZnRlciB0aGUKICAgICAgLy8gcGFydGl0aW9uaW5nLgogICAgICAvLwogICAgICAvLyBJbnZhcmlhbnRzOgogICAgICAvLyAgIDEuIGZvciB4IGluIF1sZWZ0LCBsZXNzWyA6IHggPCBwaXZvdDEKICAgICAgLy8gICAyLiBmb3IgeCBpbiBbbGVzcywga1sgOiBwaXZvdDEgPD0geCAmJiB4IDw9IHBpdm90MgogICAgICAvLyAgIDMuIGZvciB4IGluIF1ncmVhdCwgcmlnaHRbIDogeCA+IHBpdm90MgogICAgICBmb3IgKGludCBrID0gbGVzczsgayA8PSBncmVhdDsgaysrKSB7CiAgICAgICAgdmFyIGFrID0gYVtrXTsKICAgICAgICBpbnQgY29tcF9waXZvdDEgPSBjb21wYXJlKGFrLCBwaXZvdDEpOwogICAgICAgIGlmIChjb21wX3Bpdm90MSA8IDApIHsKICAgICAgICAgIGlmIChrICE9IGxlc3MpIHsKICAgICAgICAgICAgYVtrXSA9IGFbbGVzc107CiAgICAgICAgICAgIGFbbGVzc10gPSBhazsKICAgICAgICAgIH0KICAgICAgICAgIGxlc3MrKzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW50IGNvbXBfcGl2b3QyID0gY29tcGFyZShhaywgcGl2b3QyKTsKICAgICAgICAgIGlmIChjb21wX3Bpdm90MiA+IDApIHsKICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICBpbnQgY29tcCA9IGNvbXBhcmUoYVtncmVhdF0sIHBpdm90Mik7CiAgICAgICAgICAgICAgaWYgKGNvbXAgPiAwKSB7CiAgICAgICAgICAgICAgICBncmVhdC0tOwogICAgICAgICAgICAgICAgaWYgKGdyZWF0IDwgaykgYnJlYWs7CiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBvbmx5IGxvY2F0aW9uIGluc2lkZSB0aGUgbG9vcCB3aGVyZSBhIG5ldwogICAgICAgICAgICAgICAgLy8gaXRlcmF0aW9uIGlzIHN0YXJ0ZWQuCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gYVtncmVhdF0gPD0gcGl2b3QyLgogICAgICAgICAgICAgICAgY29tcCA9IGNvbXBhcmUoYVtncmVhdF0sIHBpdm90MSk7CiAgICAgICAgICAgICAgICBpZiAoY29tcCA8IDApIHsKICAgICAgICAgICAgICAgICAgLy8gVHJpcGxlIGV4Y2hhbmdlLgogICAgICAgICAgICAgICAgICBhW2tdID0gYVtsZXNzXTsKICAgICAgICAgICAgICAgICAgYVtsZXNzKytdID0gYVtncmVhdF07CiAgICAgICAgICAgICAgICAgIGFbZ3JlYXQtLV0gPSBhazsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIC8vIGFbZ3JlYXRdID49IHBpdm90MS4KICAgICAgICAgICAgICAgICAgYVtrXSA9IGFbZ3JlYXRdOwogICAgICAgICAgICAgICAgICBhW2dyZWF0LS1dID0gYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBNb3ZlIHBpdm90cyBpbnRvIHRoZWlyIGZpbmFsIHBvc2l0aW9ucy4KICAgIC8vIFdlIHNocnVuayB0aGUgbGlzdCBmcm9tIGJvdGggc2lkZXMgKGFbbGVmdF0gYW5kIGFbcmlnaHRdIGhhdmUKICAgIC8vIG1lYW5pbmdsZXNzIHZhbHVlcyBpbiB0aGVtKSBhbmQgbm93IHdlIG1vdmUgZWxlbWVudHMgZnJvbSB0aGUgZmlyc3QKICAgIC8vIGFuZCB0aGlyZCBwYXJ0aXRpb24gaW50byB0aGVzZSBsb2NhdGlvbnMgc28gdGhhdCB3ZSBjYW4gc3RvcmUgdGhlCiAgICAvLyBwaXZvdHMuCiAgICBhW2xlZnRdID0gYVtsZXNzIC0gMV07CiAgICBhW2xlc3MgLSAxXSA9IHBpdm90MTsKICAgIGFbcmlnaHRdID0gYVtncmVhdCArIDFdOwogICAgYVtncmVhdCArIDFdID0gcGl2b3QyOwoKICAgIC8vIFRoZSBsaXN0IGlzIG5vdyBwYXJ0aXRpb25lZCBpbnRvIHRocmVlIHBhcnRpdGlvbnM6CiAgICAvLyBbIDwgcGl2b3QxICAgfCA+PSBwaXZvdDEgJiYgPD0gcGl2b3QyICAgfCAgPiBwaXZvdDIgICBdCiAgICAvLyAgXiAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAgICBeICAgICAgICAgICAgIF4KICAgIC8vIGxlZnQgICAgICAgICBsZXNzICAgICAgICAgICAgICAgICAgICAgZ3JlYXQgICAgICAgIHJpZ2h0CgogICAgLy8gUmVjdXJzaXZlIGRlc2NlbnQuIChEb24ndCBpbmNsdWRlIHRoZSBwaXZvdCB2YWx1ZXMuKQogICAgX2RvU29ydChhLCBsZWZ0LCBsZXNzIC0gMiwgY29tcGFyZSk7CiAgICBfZG9Tb3J0KGEsIGdyZWF0ICsgMiwgcmlnaHQsIGNvbXBhcmUpOwoKICAgIGlmIChwaXZvdHNfYXJlX2VxdWFsKSB7CiAgICAgIC8vIEFsbCBlbGVtZW50cyBpbiB0aGUgc2Vjb25kIHBhcnRpdGlvbiBhcmUgZXF1YWwgdG8gdGhlIHBpdm90LiBObwogICAgICAvLyBuZWVkIHRvIHNvcnQgdGhlbS4KICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIEluIHRoZW9yeSBpdCBzaG91bGQgYmUgZW5vdWdoIHRvIGNhbGwgX2RvU29ydCByZWN1cnNpdmVseSBvbiB0aGUgc2Vjb25kCiAgICAvLyBwYXJ0aXRpb24uCiAgICAvLyBUaGUgQW5kcm9pZCBzb3VyY2UgaG93ZXZlciByZW1vdmVzIHRoZSBwaXZvdCBlbGVtZW50cyBmcm9tIHRoZSByZWN1cnNpdmUKICAgIC8vIGNhbGwgaWYgdGhlIHNlY29uZCBwYXJ0aXRpb24gaXMgdG9vIGxhcmdlIChtb3JlIHRoYW4gMi8zIG9mIHRoZSBsaXN0KS4KICAgIGlmIChsZXNzIDwgaW5kZXgxICYmIGdyZWF0ID4gaW5kZXg1KSB7CiAgICAgIHdoaWxlIChjb21wYXJlKGFbbGVzc10sIHBpdm90MSkgPT0gMCkgewogICAgICAgIGxlc3MrKzsKICAgICAgfQogICAgICB3aGlsZSAoY29tcGFyZShhW2dyZWF0XSwgcGl2b3QyKSA9PSAwKSB7CiAgICAgICAgZ3JlYXQtLTsKICAgICAgfQoKICAgICAgLy8gQ29weSBwYXN0ZSBvZiB0aGUgcHJldmlvdXMgMy13YXkgcGFydGl0aW9uaW5nIHdpdGggYWRhcHRpb25zLgogICAgICAvLwogICAgICAvLyBXZSBwYXJ0aXRpb24gdGhlIGxpc3QgaW50byB0aHJlZSBwYXJ0czoKICAgICAgLy8gIDEuID09IHBpdm90MQogICAgICAvLyAgMi4gPiBwaXZvdDEgJiYgPCBwaXZvdDIKICAgICAgLy8gIDMuID09IHBpdm90MgogICAgICAvLwogICAgICAvLyBEdXJpbmcgdGhlIGxvb3Agd2UgaGF2ZToKICAgICAgLy8gWyA9PSBwaXZvdDEgfCA+IHBpdm90MSAmJiA8IHBpdm90MiB8IHVucGFydGl0aW9uZWQgIHwgPT0gcGl2b3QyIF0KICAgICAgLy8gICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgXgogICAgICAvLyAgICAgICAgICAgIGxlc3MgICAgICAgICAgICAgICAgICAgICBrICAgICAgICAgICAgICBncmVhdAogICAgICAvLwogICAgICAvLyBJbnZhcmlhbnRzOgogICAgICAvLyAgIDEuIGZvciB4IGluIFsgKiwgbGVzc1sgOiB4ID09IHBpdm90MQogICAgICAvLyAgIDIuIGZvciB4IGluIFtsZXNzLCBrWyA6IHBpdm90MSA8IHggJiYgeCA8IHBpdm90MgogICAgICAvLyAgIDMuIGZvciB4IGluIF1ncmVhdCwgKiBdIDogeCA9PSBwaXZvdDIKICAgICAgZm9yIChpbnQgayA9IGxlc3M7IGsgPD0gZ3JlYXQ7IGsrKykgewogICAgICAgIHZhciBhayA9IGFba107CiAgICAgICAgaW50IGNvbXBfcGl2b3QxID0gY29tcGFyZShhaywgcGl2b3QxKTsKICAgICAgICBpZiAoY29tcF9waXZvdDEgPT0gMCkgewogICAgICAgICAgaWYgKGsgIT0gbGVzcykgewogICAgICAgICAgICBhW2tdID0gYVtsZXNzXTsKICAgICAgICAgICAgYVtsZXNzXSA9IGFrOwogICAgICAgICAgfQogICAgICAgICAgbGVzcysrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbnQgY29tcF9waXZvdDIgPSBjb21wYXJlKGFrLCBwaXZvdDIpOwogICAgICAgICAgaWYgKGNvbXBfcGl2b3QyID09IDApIHsKICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICBpbnQgY29tcCA9IGNvbXBhcmUoYVtncmVhdF0sIHBpdm90Mik7CiAgICAgICAgICAgICAgaWYgKGNvbXAgPT0gMCkgewogICAgICAgICAgICAgICAgZ3JlYXQtLTsKICAgICAgICAgICAgICAgIGlmIChncmVhdCA8IGspIGJyZWFrOwogICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgb25seSBsb2NhdGlvbiBpbnNpZGUgdGhlIGxvb3Agd2hlcmUgYSBuZXcKICAgICAgICAgICAgICAgIC8vIGl0ZXJhdGlvbiBpcyBzdGFydGVkLgogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIGFbZ3JlYXRdIDwgcGl2b3QyLgogICAgICAgICAgICAgICAgY29tcCA9IGNvbXBhcmUoYVtncmVhdF0sIHBpdm90MSk7CiAgICAgICAgICAgICAgICBpZiAoY29tcCA8IDApIHsKICAgICAgICAgICAgICAgICAgLy8gVHJpcGxlIGV4Y2hhbmdlLgogICAgICAgICAgICAgICAgICBhW2tdID0gYVtsZXNzXTsKICAgICAgICAgICAgICAgICAgYVtsZXNzKytdID0gYVtncmVhdF07CiAgICAgICAgICAgICAgICAgIGFbZ3JlYXQtLV0gPSBhazsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIC8vIGFbZ3JlYXRdID09IHBpdm90MS4KICAgICAgICAgICAgICAgICAgYVtrXSA9IGFbZ3JlYXRdOwogICAgICAgICAgICAgICAgICBhW2dyZWF0LS1dID0gYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gVGhlIHNlY29uZCBwYXJ0aXRpb24gaGFzIG5vdyBiZWVuIGNsZWFyZWQgb2YgcGl2b3QgZWxlbWVudHMgYW5kIGxvb2tzCiAgICAgIC8vIGFzIGZvbGxvd3M6CiAgICAgIC8vIFsgICogIHwgID4gcGl2b3QxICYmIDwgcGl2b3QyICB8ICogXQogICAgICAvLyAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICBeCiAgICAgIC8vICAgICAgIGxlc3MgICAgICAgICAgICAgICAgICBncmVhdAogICAgICAvLyBTb3J0IHRoZSBzZWNvbmQgcGFydGl0aW9uIHVzaW5nIHJlY3Vyc2l2ZSBkZXNjZW50LgogICAgICBfZG9Tb3J0KGEsIGxlc3MsIGdyZWF0LCBjb21wYXJlKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFRoZSBzZWNvbmQgcGFydGl0aW9uIGxvb2tzIGFzIGZvbGxvd3M6CiAgICAgIC8vIFsgICogIHwgID49IHBpdm90MSAmJiA8PSBwaXZvdDIgIHwgKiBdCiAgICAgIC8vICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgICAgXgogICAgICAvLyAgICAgICBsZXNzICAgICAgICAgICAgICAgICAgICBncmVhdAogICAgICAvLyBTaW1wbHkgc29ydCBpdCBieSByZWN1cnNpdmUgZGVzY2VudC4KICAgICAgX2RvU29ydChhLCBsZXNzLCBncmVhdCwgY29tcGFyZSk7CiAgICB9CiAgfQp9CoGDAE5OPAEYAQQjA0wiA0UEDU4lMwEGRxsFThccFwVOIgY6KgQBBlAeBUQqBUAGUTgaBicEAQZMBho/Ny8NNAYEASE/LhUROhkNCBEGBAEmPzYBOCkfIDchIQEZGRkZGQE9IRMRDwYhExEPBiETEQ8GIRMRDwYhExEPBiETEQ8GIRMRDwYhExEPBiETEQ8GARYWAVAwFRUVARkaAUNEATwcGk8SCUFAQwlFFwkVMS8zLBcnIRgbHBoMEhEXDU1ITFBNSzgZLRwXSScYIyIeJB8VFRwfH003FQ4MCggNMRYkFgkiUE9RCUUXCRUxPjMsFy8fGxwaDBIRMSEbNB4ZJkkpGhcnMiAmIigjGSkjIxIXEA4MCggGAS9FS0kPGxodGwE6Pz5AATwpKwEcSRwOBgFPElBOKy4QCC8RCAFHCTEXIhcJIks+QgkVMDwxLBcvIBscGgwSETEiGzQfGSZJKRoXJjIgJiIoIxkpIyMSFxAODAoITxUuKSs8KA0wMCstLigGBAIBGGRhcnQ6X2ludGVybmFsL3NvcnQuZGFydDBvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW50ZXJuYWwvc3ltYm9sLmRhcnSSty8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuX2ludGVybmFsOwoKLyoqCiAqIEltcGxlbWVudGF0aW9uIG9mIFtjb3JlLlN5bWJvbF0uICBUaGlzIGNsYXNzIHVzZXMgdGhlIHNhbWUgbmFtZSBhcwogKiBhIGNvcmUgY2xhc3Mgc28gYSB1c2VyIGNhbid0IHRlbGwgdGhlIGRpZmZlcmVuY2UuCiAqCiAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gaGlkZSBbX25hbWVdIGZyb20gdXNlciBjb2RlLCBidXQKICogbWFrZSBpdCBhY2Nlc3NpYmxlIHRvIERhcnQgcGxhdGZvcm0gY29kZSB2aWEgdGhlIHN0YXRpYyBtZXRob2QKICogW2dldE5hbWVdLgogKi8KY2xhc3MgU3ltYm9sIGltcGxlbWVudHMgY29yZS5TeW1ib2wgewogIGZpbmFsIFN0cmluZyBfbmFtZTsKCiAgLyoqCiAgICogU291cmNlIG9mIFJlZ0V4cCBtYXRjaGluZyBEYXJ0IHJlc2VydmVkIHdvcmRzLgogICAqCiAgICogUmVzZXJ2ZWQgd29yZHMgYXJlIG5vdCBhbGxvd2VkIGFzIGlkZW50aWZpZXJzLgogICAqLwogIHN0YXRpYyBjb25zdCBTdHJpbmcgcmVzZXJ2ZWRXb3JkUkUgPQogICAgICByJyg/OmFzc2VydHxicmVha3xjKD86YSg/OnNlfHRjaCl8bGFzc3xvbig/OnN0fHRpbnVlKSl8ZCg/OmVmYXVsdHxvKXwnCiAgICAgIHInZSg/OmxzZXxudW18eHRlbmRzKXxmKD86YWxzZXxpbmFsKD86bHkpP3xvcil8aVtmbnNdfG4oPzpld3x1bGwpfCcKICAgICAgcidyZXQoPzpocm93fHVybil8cyg/OnVwZXJ8d2l0Y2gpfHQoPzpoKD86aXN8cm93KXxyKD86dWV8eSkpfCcKICAgICAgcid2KD86YXJ8b2lkKXx3KD86aGlsZXxpdGgpKSc7CiAgLyoqCiAgICogU291cmNlIG9mIFJlZ0V4cCBtYXRjaGluZyBhbnkgcHVibGljIGlkZW50aWZpZXIuCiAgICoKICAgKiBBIHB1YmxpYyBpZGVudGlmaWVyIGlzIGEgdmFsaWQgaWRlbnRpZmllciAobm90IGEgcmVzZXJ2ZWQgd29yZCkKICAgKiB0aGF0IGRvZXNuJ3Qgc3RhcnQgd2l0aCAnXycuCiAgICovCiAgc3RhdGljIGNvbnN0IFN0cmluZyBwdWJsaWNJZGVudGlmaWVyUkUgPQogICAgICByJyg/IScgJyRyZXNlcnZlZFdvcmRSRScgcidcYig/IVwkKSlbYS16QS1aJF1bXHckXSonOwogIC8qKgogICAqIFNvdXJjZSBvZiBSZWdFeHAgbWF0Y2hpbmcgYW55IGlkZW50aWZpZXIuCiAgICoKICAgKiBJdCBtYXRjaGVzIGlkZW50aWZpZXJzIGJ1dCBub3QgcmVzZXJ2ZWQgd29yZHMuIFRoZSBpZGVudGlmaWVycwogICAqIG1heSBzdGFydCB3aXRoICdfJy4KICAgKi8KICBzdGF0aWMgY29uc3QgU3RyaW5nIGlkZW50aWZpZXJSRSA9CiAgICAgIHInKD8hJyAnJHJlc2VydmVkV29yZFJFJyByJ1xiKD8hXCQpKVthLXpBLVokX11bXHckXSonOwogIC8qKgogICAqIFNvdXJjZSBvZiBSZWdFeHAgbWF0Y2hpbmcgYSBkZWNsYXJhYmxlIG9wZXJhdG9yIG5hbWVzLgogICAqCiAgICogVGhlIG9wZXJhdG9ycyB0aGF0IGNhbiBiZSBkZWNsYXJlZCB1c2luZyBgb3BlcmF0b3JgIGRlY2xhcmF0aW9ucyBhcmUKICAgKiBhbHNvIHRoZSBvbmx5IG9uZXMgYWxsb3dlZCBhcyBzeW1ib2xzLiBUaGUgbmFtZSBvZiB0aGUgb3BlcmF0b3JzIGlzCiAgICogdGhlIHNhbWUgYXMgdGhlIG9wZXJhdG9yIGl0c2VsZiBleGNlcHQgZm9yIHVuYXJ5IG1pbnVzLCB3aGVyZSB0aGUgbmFtZQogICAqIGlzICJ1bmFyeS0iLgogICAqLwogIHN0YXRpYyBjb25zdCBTdHJpbmcgb3BlcmF0b3JSRSA9CiAgICAgIHInKD86W1wtKyovJSZ8Xl18XFtcXT0/fD09fH4vP3w8Wzw9XT98Pls+PV0/fHVuYXJ5LSknOwoKICAvLyBHcmFtbWFyIGlmIHN5bWJvbHM6CiAgLy8gICAgc3ltYm9sIDo6PSBxdWFsaWZpZWROYW1lIHwgPGVtcHR5PgogIC8vICAgIHF1YWxpZmllZE5hbWUgOjo9IHB1YmxpY0lkZW50aWZpZXIgJy4nIHF1YWxpZmllZE5hbWUgfCBuYW1lCiAgLy8gICAgbmFtZSA6Oj0gcHVibGljSWRlbnRpZmllcgogIC8vICAgICAgICAgICB8IHB1YmxpY0lkZW50aWZpZXIgJz0nCiAgLy8gICAgICAgICAgIHwgb3BlcmF0b3IKICAvLyB3aGVyZSBwdWJsaWNJZGVudGlmaWVyIGlzIGFueSB2YWxpZCBpZGVudGlmaWVyIChub3QgYSByZXNlcnZlZCB3b3JkKQogIC8vIHRoYXQgaXNuJ3QgcHJpdmF0ZSAoZG9lc24ndCBzdGFydCB3aXRoICdfJykuCiAgLy8KICAvLyBSYWlscm9hZCBkaWFncmFtIG9mIHRoZSBhY2NlcHRlZCBncmFtbWFyOgogIC8vCiAgLy8gICAgLy0tLS0tLS0tLS0tLS0tLS1cCiAgLy8gICAgfCAgICAgICAgICAgICAgICB8CiAgLy8gICAgfCAgICAgICAgICAvLVsuXS0vICAgICAvLVs9XS1cCiAgLy8gICAgXCAgICAgICAgIC8gICAgICAgICAgIC8gICAgICAgXAogIC8vICAtLS0tLS0tW2lkXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+CiAgLy8gICAgICAgXCAgICAgICAgICAgICAgICAgICAgIC8KICAvLyAgICAgICAgXC0tLS0tLVtvcGVyYXRvcl0tLS0vCiAgLy8gICAgICAgICAgICBcICAgICAgICAgICAgICAvCiAgLy8gICAgICAgICAgICAgXC0tLS0tLS0tLS0tLS8KICAvLwoKICAvKioKICAgKiBSZWdFeHAgdGhhdCB2YWxpZGF0ZXMgYSBub24tZW1wdHkgbm9uLXByaXZhdGUgc3ltYm9sLgogICAqCiAgICogVGhlIGVtcHR5IHN5bWJvbCBpcyBoYW5kbGVkIGJlZm9yZSB0aGlzIHJlZ2V4cCBpcyB1c2VkLCBhbmQgaXMgbm90CiAgICogYWNjZXB0ZWQuCiAgICovCiAgc3RhdGljIGZpbmFsIFJlZ0V4cCBwdWJsaWNTeW1ib2xQYXR0ZXJuID0gbmV3IFJlZ0V4cCgKICAgICAgJ14oPzokb3BlcmF0b3JSRVwkfCRwdWJsaWNJZGVudGlmaWVyUkUoPzo9P1wkfFsuXSg/IVwkKSkpKz9cJCcpOwoKICAvLyBUaGUgZ3JhbW1hciBvZiBzeW1ib2xzIHRoYXQgbWF5IGJlIHByaXZhdGUgaXMgdGhlIHNhbWUgYXMgZm9yIHB1YmxpYwogIC8vIHN5bWJvbHMsIGV4Y2VwdCB0aGF0ICJwdWJsaWNJZGVudGlmaWVyIiBpcyByZXBsYWNlZCBieSAiaWRlbnRpZmllciIsCiAgLy8gd2hpY2ggbWF0Y2hlcyBhbnkgaWRlbnRpZmllci4KCiAgLyoqCiAgICogUmVnRXhwIHRoYXQgdmFsaWRhdGVzIGEgbm9uLWVtcHR5IHN5bWJvbC4KICAgKgogICAqIFByaXZhdGUgc3ltYm9scyBhcmUgYWNjZXB0ZWQuCiAgICoKICAgKiBUaGUgZW1wdHkgc3ltYm9sIGlzIGhhbmRsZWQgYmVmb3JlIHRoaXMgcmVnZXhwIGlzIHVzZWQsIGFuZCBpcyBub3QKICAgKiBhY2NlcHRlZC4KICAgKi8KICBzdGF0aWMgZmluYWwgUmVnRXhwIHN5bWJvbFBhdHRlcm4gPQogICAgICBuZXcgUmVnRXhwKCdeKD86JG9wZXJhdG9yUkVcJHwkaWRlbnRpZmllclJFKD86PT9cJHxbLl0oPyFcJCkpKSs/XCQnKTsKCiAgZXh0ZXJuYWwgY29uc3QgU3ltYm9sKFN0cmluZyBuYW1lKTsKCiAgLyoqCiAgICogUGxhdGZvcm0tcHJpdmF0ZSBtZXRob2QgdXNlZCBieSB0aGUgbWlycm9yIHN5c3RlbSB0byBjcmVhdGUKICAgKiBvdGhlcndpc2UgaW52YWxpZCBuYW1lcy4KICAgKi8KICBjb25zdCBTeW1ib2wudW52YWxpZGF0ZWQodGhpcy5fbmFtZSk7CgogIC8vIFRoaXMgaXMgY2FsbGVkIGJ5IGRhcnQyanMuCiAgU3ltYm9sLnZhbGlkYXRlZChTdHJpbmcgbmFtZSkgOiB0aGlzLl9uYW1lID0gdmFsaWRhdGVQdWJsaWNTeW1ib2wobmFtZSk7CgogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+IG90aGVyIGlzIFN5bWJvbCAmJiBfbmFtZSA9PSBvdGhlci5fbmFtZTsKCiAgZXh0ZXJuYWwgaW50IGdldCBoYXNoQ29kZTsKCiAgZXh0ZXJuYWwgdG9TdHJpbmcoKTsKCiAgLy8vIFBsYXRmb3JtLXByaXZhdGUgYWNjZXNzb3Igd2hpY2ggY2Fubm90IGJlIGNhbGxlZCBmcm9tIHVzZXIgbGlicmFyaWVzLgogIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShTeW1ib2wgc3ltYm9sKSA9PiBzeW1ib2wuX25hbWU7CgogIHN0YXRpYyBTdHJpbmcgdmFsaWRhdGVQdWJsaWNTeW1ib2woU3RyaW5nIG5hbWUpIHsKICAgIGlmIChuYW1lLmlzRW1wdHkgfHwgcHVibGljU3ltYm9sUGF0dGVybi5oYXNNYXRjaChuYW1lKSkgcmV0dXJuIG5hbWU7CiAgICBpZiAobmFtZS5zdGFydHNXaXRoKCdfJykpIHsKICAgICAgLy8gVGhlcmUgbWF5IGJlIG90aGVyIHByaXZhdGUgcGFydHMgaW4gYSBxdWFsaWZpZWQgbmFtZSB0aGFuIHRoZSBmaXJzdAogICAgICAvLyBvbmUsIGJ1dCB0aGlzIGlzIGEgY29tbW9uIGNhc2UgdGhhdCBkZXNlcnZlcyBhIHNwZWNpZmljIGVycm9yCiAgICAgIC8vIG1lc3NhZ2UuCiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCciJG5hbWUiIGlzIGEgcHJpdmF0ZSBpZGVudGlmaWVyJyk7CiAgICB9CiAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignIiRuYW1lIiBpcyBub3QgYSB2YWxpZCAocXVhbGlmaWVkKSBzeW1ib2wgbmFtZScpOwogIH0KCiAgLyoqCiAgICogQ2hlY2tzIHdoZXRoZXIgbmFtZSBpcyBhIHZhbGlkIHN5bWJvbCBuYW1lLgogICAqCiAgICogVGhpcyB0ZXN0IGFsbG93cyBib3RoIHByaXZhdGUgYW5kIG5vbi1wcml2YXRlIHN5bWJvbHMuCiAgICovCiAgc3RhdGljIGJvb2wgaXNWYWxpZFN5bWJvbChTdHJpbmcgbmFtZSkgewogICAgcmV0dXJuIChuYW1lLmlzRW1wdHkgfHwgc3ltYm9sUGF0dGVybi5oYXNNYXRjaChuYW1lKSk7CiAgfQoKICBleHRlcm5hbCBzdGF0aWMgU3RyaW5nIGNvbXB1dGVVbm1hbmdsZWROYW1lKFN5bWJvbCBzeW1ib2wpOwp9CoCQAE5OPAEYAQRGNQNEQg4EJhYBBjQFNAYnTUpFJQY2BUUiBis8Bi8FRBkGJT0GPAVKSUwSBiM9ARkrRCImGkoyBS8FGxsnKCwjIiEgBQEGOwVIDwY4RwFKSiMBBi8FIwVIDwYmTAEmAQZBHgYoASBLAUYBHQEXAUw4ATRJIE1HEkIGTwQBBjEFPAYrOwQBPgIBGmRhcnQ6X2ludGVybmFsL3N5bWJvbC5kYXJ0MW9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvc3ltYm9sX3BhdGNoLmRhcnSGgy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJpbnRlcm5hbF9wYXRjaC5kYXJ0IjsKCkBwYXRjaApjbGFzcyBTeW1ib2wgewogIEBwYXRjaAogIGNvbnN0IFN5bWJvbChTdHJpbmcgbmFtZSkgOiB0aGlzLl9uYW1lID0gbmFtZTsKCiAgQHBhdGNoCiAgdG9TdHJpbmcoKSA9PiAnU3ltYm9sKCIke2NvbXB1dGVVbm1hbmdsZWROYW1lKHRoaXMpfSIpJzsKCiAgQHBhdGNoCiAgc3RhdGljIFN0cmluZyBjb21wdXRlVW5tYW5nbGVkTmFtZShTeW1ib2wgc3ltYm9sKSB7CiAgICBTdHJpbmcgc3RyaW5nID0gU3ltYm9sLmdldE5hbWUoc3ltYm9sKTsKCiAgICAvLyBnZXQ6Zm9vIC0+IGZvbwogICAgLy8gc2V0OmZvbyAtPiBmb289CiAgICAvLyBnZXQ6X2Zvb0B4eHggLT4gX2ZvbwogICAgLy8gc2V0Ol9mb29AeHh4IC0+IF9mb289CiAgICAvLyBDbGFzcy5fY29uc3RydWN0b3JAeHh4IC0+IENsYXNzLl9jb25zdHJ1Y3RvcgogICAgLy8gX0NsYXNzQHh4eC5fY29uc3RydWN0b3JAeHh4IC0+IF9DbGFzcy5fY29uc3RydWN0b3IKICAgIC8vIGxpYi5fU0B4eHggd2l0aCBsaWIuX00xQHh4eCwgbGliLl9NMkB4eHggLT4gbGliLl9TIHdpdGggbGliLl9NMSwgbGliLl9NMgogICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGJvb2wgYWRkX3NldHRlcl9zdWZmaXggPSBmYWxzZTsKICAgIHZhciBwb3MgPSAwOwogICAgaWYgKHN0cmluZy5sZW5ndGggPj0gNCAmJiBzdHJpbmdbM10gPT0gJzonKSB7CiAgICAgIC8vIERyb3AgJ2dldDonIG9yICdzZXQ6JyBwcmVmaXguCiAgICAgIHBvcyA9IDQ7CiAgICAgIGlmIChzdHJpbmdbMF0gPT0gJ3MnKSB7CiAgICAgICAgYWRkX3NldHRlcl9zdWZmaXggPSB0cnVlOwogICAgICB9CiAgICB9CiAgICAvLyBTa2lwIGV2ZXJ5dGhpbmcgYmV0d2VlbiBBVCBhbmQgUEVSSU9ELCBTUEFDRSwgQ09NTUEgb3IgRU5ECiAgICBib29sIHNraXAgPSBmYWxzZTsKICAgIGZvciAoOyBwb3MgPCBzdHJpbmcubGVuZ3RoOyBwb3MrKykgewogICAgICB2YXIgY2hhciA9IHN0cmluZ1twb3NdOwogICAgICBpZiAoY2hhciA9PSAnQCcpIHsKICAgICAgICBza2lwID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChjaGFyID09ICcuJyB8fCBjaGFyID09ICcgJyB8fCBjaGFyID09ICcsJykgewogICAgICAgIHNraXAgPSBmYWxzZTsKICAgICAgfQogICAgICBpZiAoIXNraXApIHsKICAgICAgICByZXN1bHQud3JpdGUoY2hhcik7CiAgICAgIH0KICAgIH0KICAgIGlmIChhZGRfc2V0dGVyX3N1ZmZpeCkgewogICAgICByZXN1bHQud3JpdGUoJz0nKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKICB9CgogIEBwYXRjaAogIGludCBnZXQgaGFzaENvZGUgewogICAgY29uc3QgYXJiaXRyYXJ5UHJpbWUgPSA2NjQ1OTc7CiAgICByZXR1cm4gMHgxZmZmZmZmZiAmIChhcmJpdHJhcnlQcmltZSAqIF9uYW1lLmhhc2hDb2RlKTsKICB9Cn0KPgBOTjwBIgEHDwkxAQk7AQk2LAEWFxwdNDpQLiQRMicPHiIIBkIXKR4ZFT4WCBMcCAYdGQYeBAEJFSM7BAIBJmRhcnQ6X2ludGVybmFsLXBhdGNoL3N5bWJvbF9wYXRjaC5kYXJ0NW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pbnRlcm5hbC9saW5rZWRfbGlzdC5kYXJ0jMUvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0Ll9pbnRlcm5hbDsKCi8vLyBBIHJ1ZGltZW50YXJ5IGxpbmtlZCBsaXN0LgpjbGFzcyBMaW5rZWRMaXN0PFQgZXh0ZW5kcyBMaW5rZWRMaXN0RW50cnk8VD4+IGV4dGVuZHMgSXRlcmFibGVCYXNlPFQ+IHsKICBUIGZpcnN0OwogIFQgbGFzdDsKICBpbnQgbGVuZ3RoID0gMDsKCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBsZW5ndGggPT0gMDsKCiAgLyoqCiAgICogQWRkcyBbbmV3TGFzdF0gdG8gdGhlIGVuZCBvZiB0aGlzIGxpbmtlZCBsaXN0LgogICAqLwogIHZvaWQgYWRkKFQgbmV3TGFzdCkgewogICAgYXNzZXJ0KG5ld0xhc3QuX25leHQgPT0gbnVsbCAmJiBuZXdMYXN0Ll9wcmV2aW91cyA9PSBudWxsKTsKICAgIGlmIChsYXN0ICE9IG51bGwpIHsKICAgICAgYXNzZXJ0KGxhc3QuX25leHQgPT0gbnVsbCk7CiAgICAgIGxhc3QuX25leHQgPSBuZXdMYXN0OwogICAgfSBlbHNlIHsKICAgICAgZmlyc3QgPSBuZXdMYXN0OwogICAgfQogICAgbmV3TGFzdC5fcHJldmlvdXMgPSBsYXN0OwogICAgbGFzdCA9IG5ld0xhc3Q7CiAgICBsYXN0Ll9saXN0ID0gdGhpczsKICAgIGxlbmd0aCsrOwogIH0KCiAgLyoqCiAgICogQWRkcyBbbmV3Rmlyc3RdIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBsaW5rZWQgbGlzdC4KICAgKi8KICB2b2lkIGFkZEZpcnN0KFQgbmV3Rmlyc3QpIHsKICAgIGlmIChmaXJzdCAhPSBudWxsKSB7CiAgICAgIGFzc2VydChmaXJzdC5fcHJldmlvdXMgPT0gbnVsbCk7CiAgICAgIGZpcnN0Ll9wcmV2aW91cyA9IG5ld0ZpcnN0OwogICAgfSBlbHNlIHsKICAgICAgbGFzdCA9IG5ld0ZpcnN0OwogICAgfQogICAgbmV3Rmlyc3QuX25leHQgPSBmaXJzdDsKICAgIGZpcnN0ID0gbmV3Rmlyc3Q7CiAgICBmaXJzdC5fbGlzdCA9IHRoaXM7CiAgICBsZW5ndGgrKzsKICB9CgogIC8qKgogICAqIFJlbW92ZXMgdGhlIGdpdmVuIFtub2RlXSBmcm9tIHRoaXMgbGlzdC4KICAgKgogICAqIElmIHRoZSBlbnRyeSBpcyBub3QgaW4gdGhpcyBsaW5rZWQgbGlzdCBub3RoaW5nIGhhcHBlbnMuCiAgICoKICAgKiBBbHNvIHNlZSBbTGlua2VkTGlzdEVudHJ5LnVubGlua10uCiAgICovCiAgdm9pZCByZW1vdmUoVCBub2RlKSB7CiAgICBpZiAobm9kZS5fbGlzdCAhPSB0aGlzKSByZXR1cm47CiAgICBsZW5ndGgtLTsKICAgIGlmIChub2RlLl9wcmV2aW91cyA9PSBudWxsKSB7CiAgICAgIGFzc2VydChpZGVudGljYWwobm9kZSwgZmlyc3QpKTsKICAgICAgZmlyc3QgPSBub2RlLl9uZXh0OwogICAgfSBlbHNlIHsKICAgICAgbm9kZS5fcHJldmlvdXMuX25leHQgPSBub2RlLl9uZXh0OwogICAgfQogICAgaWYgKG5vZGUuX25leHQgPT0gbnVsbCkgewogICAgICBhc3NlcnQoaWRlbnRpY2FsKG5vZGUsIGxhc3QpKTsKICAgICAgbGFzdCA9IG5vZGUuX3ByZXZpb3VzOwogICAgfSBlbHNlIHsKICAgICAgbm9kZS5fbmV4dC5fcHJldmlvdXMgPSBub2RlLl9wcmV2aW91czsKICAgIH0KICAgIG5vZGUuX25leHQgPSBub2RlLl9wcmV2aW91cyA9IG51bGw7CiAgICBub2RlLl9saXN0ID0gbnVsbDsKICB9CgogIEl0ZXJhdG9yPFQ+IGdldCBpdGVyYXRvciA9PiBuZXcgX0xpbmtlZExpc3RJdGVyYXRvcjxUPih0aGlzKTsKfQoKY2xhc3MgTGlua2VkTGlzdEVudHJ5PFQgZXh0ZW5kcyBMaW5rZWRMaXN0RW50cnk8VD4+IHsKICBUIF9uZXh0OwogIFQgX3ByZXZpb3VzOwogIExpbmtlZExpc3Q8VD4gX2xpc3Q7CgogIC8qKgogICAqIFVubGlua3MgdGhlIGVsZW1lbnQgZnJvbSBpdHMgbGlua2VkIGxpc3QuCiAgICoKICAgKiBJZiB0aGUgZW50cnkgaXMgbm90IGluIGEgbGlua2VkIGxpc3QsIGRvZXMgbm90aGluZy4gT3RoZXJ3aXNlLCB0aGlzCiAgICogaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIFtMaW5rZWRMaXN0LnJlbW92ZV0gb24gdGhlIGxpc3QgdGhpcyBlbnRyeQogICAqIGlzIGN1cnJlbnRseSBpbi4KICAgKi8KICB2b2lkIHVubGluaygpIHsKICAgIGlmIChfbGlzdCA9PSBudWxsKSByZXR1cm47CiAgICBfbGlzdC5yZW1vdmUodGhpcyk7CiAgfQp9CgpjbGFzcyBfTGlua2VkTGlzdEl0ZXJhdG9yPFQgZXh0ZW5kcyBMaW5rZWRMaXN0RW50cnk8VD4+IGltcGxlbWVudHMgSXRlcmF0b3I8VD4gewogIC8vLyBUaGUgY3VycmVudCBlbGVtZW50IG9mIHRoZSBpdGVyYXRvci4KICAvLyBUaGlzIGZpZWxkIGlzIHdyaXRlYWJsZSwgYnV0IHNob3VsZCBvbmx5IHJlYWQgYnkgdXNlcnMgb2YgdGhpcyBjbGFzcy4KICBUIGN1cnJlbnQ7CgogIC8vLyBUaGUgbGlzdCB0aGUgaXRlcmF0b3IgaXRlcmF0ZXMgb3Zlci4KICAvLy8KICAvLy8gU2V0IHRvIFtudWxsXSBpZiB0aGUgcHJvdmlkZWQgbGlzdCB3YXMgZW1wdHkgKGluZGljYXRpbmcgdGhhdCB0aGVyZSB3ZXJlCiAgLy8vIG5vIGVudHJpZXMgdG8gaXRlcmF0ZSBvdmVyKS4KICAvLy8KICAvLy8gU2V0IHRvIFtudWxsXSBhcyBzb29uIGFzIFttb3ZlTmV4dF0gd2FzIGludm9rZWQgKGluZGljYXRpbmcgdGhhdCB0aGUKICAvLy8gaXRlcmF0b3IgaGFzIHRvIHdvcmsgd2l0aCBbY3VycmVudF0gZnJvbSBub3cgb24uCiAgTGlua2VkTGlzdDxUPiBfbGlzdDsKCiAgX0xpbmtlZExpc3RJdGVyYXRvcih0aGlzLl9saXN0KSB7CiAgICBpZiAoX2xpc3QubGVuZ3RoID09IDApIF9saXN0ID0gbnVsbDsKICB9CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICAvLyBjdXJyZW50IGlzIG51bGwgaWYgdGhlIGl0ZXJhdG9yIGhhc24ndCBzdGFydGVkIGl0ZXJhdGluZywgb3IgaWYgdGhlCiAgICAvLyBpdGVyYXRpb24gaXMgZmluaXNoZWQuIEluIHRoZSBmaXJzdCBjYXNlLCB0aGUgW19saXN0XSBmaWVsZCBpcyBub3QgbnVsbC4KICAgIGlmIChjdXJyZW50ID09IG51bGwpIHsKICAgICAgaWYgKF9saXN0ID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgICAgYXNzZXJ0KF9saXN0Lmxlbmd0aCA+IDApOwogICAgICBjdXJyZW50ID0gX2xpc3QuZmlyc3Q7CiAgICAgIF9saXN0ID0gbnVsbDsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBjdXJyZW50ID0gY3VycmVudC5fbmV4dDsKICAgIHJldHVybiBjdXJyZW50ICE9IG51bGw7CiAgfQp9CoCAAE5OPAEYAR9JCwoSASMBBjQGGEAYIhwNFwYeFBcOBAEGOwYeGSciDRcGHBYYDgQBBi4FPgUoBhgkDiImGg0pBh4lHQ0tBigXBAFAAgE2Cw8XAQYvBUlJFgYSHxgEAgFRK0sNASsGTyMGSzcXASQpBAEUS1AbJyAdFBMGHRwEAgEfZGFydDpfaW50ZXJuYWwvbGlua2VkX2xpc3QuZGFydDBvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL3ByaW50X3BhdGNoLmRhcnSC/C8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJpbnRlcm5hbF9wYXRjaC5kYXJ0IjsKCi8vIEEgcHJpbnQtY2xvc3VyZSBnZXRzIGEgU3RyaW5nIHRoYXQgc2hvdWxkIGJlIHByaW50ZWQuIEluIGdlbmVyYWwgdGhlCi8vIHN0cmluZyBpcyBhIGxpbmUsIGJ1dCBpdCBtYXkgY29udGFpbiAiXG4iIGNoYXJhY3RlcnMuCnR5cGVkZWYgdm9pZCBfUHJpbnRDbG9zdXJlKFN0cmluZyBsaW5lKTsKCkBwYXRjaAp2b2lkIHByaW50VG9Db25zb2xlKFN0cmluZyBsaW5lKSB7CiAgX3ByaW50Q2xvc3VyZShsaW5lKTsKfQoKdm9pZCBfdW5zdXBwb3J0ZWRQcmludChTdHJpbmcgbGluZSkgewogIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCIncHJpbnQnIGlzIG5vdCBzdXBwb3J0ZWQiKTsKfQoKLy8gX3ByaW50Q2xvc3VyZSBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGVtYmVkZGVyIHRvIHN1cHBseSBhIGRpZmZlcmVudAovLyBwcmludCBpbXBsZW1lbnRhdGlvbi4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpfUHJpbnRDbG9zdXJlIF9wcmludENsb3N1cmUgPSBfdW5zdXBwb3J0ZWRQcmludDsKGQBOTjwBIgFIOSkBByMXAgEmOgIBShkaMQElZGFydDpfaW50ZXJuYWwtcGF0Y2gvcHJpbnRfcGF0Y2guZGFydC9vcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW50ZXJuYWwvcHJpbnQuZGFydII1Ly8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5faW50ZXJuYWw7CgovKioKICogVGhpcyBmdW5jdGlvbiBpcyBzZXQgYnkgdGhlIGZpcnN0IGFsbG9jYXRpb24gb2YgYSBab25lLgogKgogKiBPbmNlIHRoZSBmdW5jdGlvbiBpcyBzZXQgdGhlIGNvcmUgYHByaW50YCBmdW5jdGlvbiBjYWxscyB0aGlzIGNsb3N1cmUgaW5zdGVhZAogKiBvZiBbcHJpbnRUb0NvbnNvbGVdLgogKgogKiBUaGlzIGRlY291cGxlcyB0aGUgY29yZSBsaWJyYXJ5IGZyb20gdGhlIGFzeW5jIGxpYnJhcnkuCiAqLwp2b2lkIEZ1bmN0aW9uKFN0cmluZykgcHJpbnRUb1pvbmUgPSBudWxsOwoKZXh0ZXJuYWwgdm9pZCBwcmludFRvQ29uc29sZShTdHJpbmcgbGluZSk7ChMATk48ARgBBDsDURgDOwQqASsBGWRhcnQ6X2ludGVybmFsL3ByaW50LmRhcnQwb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2lzb2xhdGUvaXNvbGF0ZS5kYXJ0wABx/S8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovKioKICogQ29uY3VycmVudCBwcm9ncmFtbWluZyB1c2luZyBfaXNvbGF0ZXNfOgogKiBpbmRlcGVuZGVudCB3b3JrZXJzIHRoYXQgYXJlIHNpbWlsYXIgdG8gdGhyZWFkcwogKiBidXQgZG9uJ3Qgc2hhcmUgbWVtb3J5LAogKiBjb21tdW5pY2F0aW5nIG9ubHkgdmlhIG1lc3NhZ2VzLgogKgogKiBUbyB1c2UgdGhpcyBsaWJyYXJ5IGluIHlvdXIgY29kZToKICoKICogICAgIGltcG9ydCAnZGFydDppc29sYXRlJzsKICoKICoge0BjYXRlZ29yeSBWTX0KICovCmxpYnJhcnkgZGFydC5pc29sYXRlOwoKaW1wb3J0ICJkYXJ0OmFzeW5jIjsKCnBhcnQgImNhcGFiaWxpdHkuZGFydCI7CgovKioKICogVGhyb3duIHdoZW4gYW4gaXNvbGF0ZSBjYW5ub3QgYmUgY3JlYXRlZC4KICovCmNsYXNzIElzb2xhdGVTcGF3bkV4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbiB7CiAgLyoqIEVycm9yIG1lc3NhZ2UgcmVwb3J0ZWQgYnkgdGhlIHNwYXduIG9wZXJhdGlvbi4gKi8KICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgSXNvbGF0ZVNwYXduRXhjZXB0aW9uKHRoaXMubWVzc2FnZSk7CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIklzb2xhdGVTcGF3bkV4Y2VwdGlvbjogJG1lc3NhZ2UiOwp9CgovKioKICogQW4gaXNvbGF0ZWQgRGFydCBleGVjdXRpb24gY29udGV4dC4KICoKICogQWxsIERhcnQgY29kZSBydW5zIGluIGFuIGlzb2xhdGUsIGFuZCBjb2RlIGNhbiBhY2Nlc3MgY2xhc3NlcyBhbmQgdmFsdWVzCiAqIG9ubHkgZnJvbSB0aGUgc2FtZSBpc29sYXRlLiBEaWZmZXJlbnQgaXNvbGF0ZXMgY2FuIGNvbW11bmljYXRlIGJ5IHNlbmRpbmcKICogdmFsdWVzIHRocm91Z2ggcG9ydHMgKHNlZSBbUmVjZWl2ZVBvcnRdLCBbU2VuZFBvcnRdKS4KICoKICogQW4gYElzb2xhdGVgIG9iamVjdCBpcyBhIHJlZmVyZW5jZSB0byBhbiBpc29sYXRlLCB1c3VhbGx5IGRpZmZlcmVudCBmcm9tCiAqIHRoZSBjdXJyZW50IGlzb2xhdGUuCiAqIEl0IHJlcHJlc2VudHMsIGFuZCBjYW4gYmUgdXNlZCB0byBjb250cm9sLCB0aGUgb3RoZXIgaXNvbGF0ZS4KICoKICogV2hlbiBzcGF3bmluZyBhIG5ldyBpc29sYXRlLCB0aGUgc3Bhd25pbmcgaXNvbGF0ZSByZWNlaXZlcyBhbiBgSXNvbGF0ZWAKICogb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgbmV3IGlzb2xhdGUgd2hlbiB0aGUgc3Bhd24gb3BlcmF0aW9uIHN1Y2NlZWRzLgogKgogKiBJc29sYXRlcyBydW4gY29kZSBpbiBpdHMgb3duIGV2ZW50IGxvb3AsIGFuZCBlYWNoIGV2ZW50IG1heSBydW4gc21hbGxlciB0YXNrcwogKiBpbiBhIG5lc3RlZCBtaWNyb3Rhc2sgcXVldWUuCiAqCiAqIEFuIGBJc29sYXRlYCBvYmplY3QgYWxsb3dzIG90aGVyIGlzb2xhdGVzIHRvIGNvbnRyb2wgdGhlIGV2ZW50IGxvb3AKICogb2YgdGhlIGlzb2xhdGUgdGhhdCBpdCByZXByZXNlbnRzLCBhbmQgdG8gaW5zcGVjdCB0aGUgaXNvbGF0ZSwKICogZm9yIGV4YW1wbGUgYnkgcGF1c2luZyB0aGUgaXNvbGF0ZSBvciBieSBnZXR0aW5nIGV2ZW50cyB3aGVuIHRoZSBpc29sYXRlCiAqIGhhcyBhbiB1bmNhdWdodCBlcnJvci4KICoKICogVGhlIFtjb250cm9sUG9ydF0gaWRlbnRpZmllcyBhbmQgZ2l2ZXMgYWNjZXNzIHRvIGNvbnRyb2xsaW5nIHRoZSBpc29sYXRlLAogKiBhbmQgdGhlIFtwYXVzZUNhcGFiaWxpdHldIGFuZCBbdGVybWluYXRlQ2FwYWJpbGl0eV0gZ3VhcmQgYWNjZXNzCiAqIHRvIHNvbWUgY29udHJvbCBvcGVyYXRpb25zLgogKiBGb3IgZXhhbXBsZSwgY2FsbGluZyBbcGF1c2VdIG9uIGFuIGBJc29sYXRlYCBvYmplY3QgY3JlYXRlZCB3aXRob3V0IGEKICogW3BhdXNlQ2FwYWJpbGl0eV0sIGhhcyBubyBlZmZlY3QuCiAqCiAqIFRoZSBgSXNvbGF0ZWAgb2JqZWN0IHByb3ZpZGVkIGJ5IGEgc3Bhd24gb3BlcmF0aW9uIHdpbGwgaGF2ZSB0aGUKICogY29udHJvbCBwb3J0IGFuZCBjYXBhYmlsaXRpZXMgbmVlZGVkIHRvIGNvbnRyb2wgdGhlIGlzb2xhdGUuCiAqIE5ldyBpc29sYXRlIG9iamVjdHMgY2FuIGJlIGNyZWF0ZWQgd2l0aG91dCBzb21lIG9mIHRoZXNlIGNhcGFiaWxpdGllcwogKiBpZiBuZWNlc3NhcnksIHVzaW5nIHRoZSBbSXNvbGF0ZS5Jc29sYXRlXSBjb25zdHJ1Y3Rvci4KICoKICogQW4gYElzb2xhdGVgIG9iamVjdCBjYW5ub3QgYmUgc2VudCBvdmVyIGEgYFNlbmRQb3J0YCwgYnV0IHRoZSBjb250cm9sIHBvcnQKICogYW5kIGNhcGFiaWxpdGllcyBjYW4gYmUgc2VudCwgYW5kIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbmluZwogKiBgSXNvbGF0ZWAgb2JqZWN0IGluIHRoZSByZWNlaXZpbmcgcG9ydCdzIGlzb2xhdGUuCiAqLwpjbGFzcyBJc29sYXRlIHsKICAvKiogQXJndW1lbnQgdG8gYHBpbmdgIGFuZCBga2lsbGA6IEFzayBmb3IgaW1tZWRpYXRlIGFjdGlvbi4gKi8KICBzdGF0aWMgY29uc3QgaW50IGltbWVkaWF0ZSA9IDA7CiAgLyoqIEFyZ3VtZW50IHRvIGBwaW5nYCBhbmQgYGtpbGxgOiBBc2sgZm9yIGFjdGlvbiBiZWZvcmUgdGhlIG5leHQgZXZlbnQuICovCiAgc3RhdGljIGNvbnN0IGludCBiZWZvcmVOZXh0RXZlbnQgPSAxOwoKICAvKioKICAgKiBDb250cm9sIHBvcnQgdXNlZCB0byBzZW5kIGNvbnRyb2wgbWVzc2FnZXMgdG8gdGhlIGlzb2xhdGUuCiAgICoKICAgKiBUaGUgY29udHJvbCBwb3J0IGlkZW50aWZpZXMgdGhlIGlzb2xhdGUuCiAgICoKICAgKiBBbiBgSXNvbGF0ZWAgb2JqZWN0IGFsbG93cyBzZW5kaW5nIGNvbnRyb2wgbWVzc2FnZXMKICAgKiB0aHJvdWdoIHRoZSBjb250cm9sIHBvcnQuCiAgICoKICAgKiBTb21lIGNvbnRyb2wgbWVzc2FnZXMgcmVxdWlyZSBhIHNwZWNpZmljIGNhcGFiaWxpdHkgdG8gYmUgcGFzc2VkIGFsb25nCiAgICogd2l0aCB0aGUgbWVzc2FnZSAoc2VlIFtwYXVzZUNhcGFiaWxpdHldIGFuZCBbdGVybWluYXRlQ2FwYWJpbGl0eV0pLAogICAqIG90aGVyd2lzZSB0aGUgbWVzc2FnZSBpcyBpZ25vcmVkIGJ5IHRoZSBpc29sYXRlLgogICAqLwogIGZpbmFsIFNlbmRQb3J0IGNvbnRyb2xQb3J0OwoKICAvKioKICAgKiBDYXBhYmlsaXR5IGdyYW50aW5nIHRoZSBhYmlsaXR5IHRvIHBhdXNlIHRoZSBpc29sYXRlLgogICAqCiAgICogVGhpcyBjYXBhYmlsaXR5IGlzIHJlcXVpcmVkIGJ5IFtwYXVzZV0uCiAgICogSWYgdGhlIGNhcGFiaWxpdHkgaXMgYG51bGxgLCBvciBpZiBpdCBpcyBub3QgdGhlIGNvcnJlY3QgcGF1c2UgY2FwYWJpbGl0eQogICAqIG9mIHRoZSBpc29sYXRlIGlkZW50aWZpZWQgYnkgW2NvbnRyb2xQb3J0XSwKICAgKiB0aGVuIGNhbGxzIHRvIFtwYXVzZV0gd2lsbCBoYXZlIG5vIGVmZmVjdC4KICAgKgogICAqIElmIHRoZSBpc29sYXRlIGlzIHNwYXduZWQgaW4gYSBwYXVzZWQgc3RhdGUsIHVzZSB0aGlzIGNhcGFiaWxpdHkgYXMKICAgKiBhcmd1bWVudCB0byB0aGUgW3Jlc3VtZV0gbWV0aG9kIGluIG9yZGVyIHRvIHJlc3VtZSB0aGUgcGF1c2VkIGlzb2xhdGUuCiAgICovCiAgZmluYWwgQ2FwYWJpbGl0eSBwYXVzZUNhcGFiaWxpdHk7CgogIC8qKgogICAqIENhcGFiaWxpdHkgZ3JhbnRpbmcgdGhlIGFiaWxpdHkgdG8gdGVybWluYXRlIHRoZSBpc29sYXRlLgogICAqCiAgICogVGhpcyBjYXBhYmlsaXR5IGlzIHJlcXVpcmVkIGJ5IFtraWxsXSBhbmQgW3NldEVycm9yc0ZhdGFsXS4KICAgKiBJZiB0aGUgY2FwYWJpbGl0eSBpcyBgbnVsbGAsIG9yIGlmIGl0IGlzIG5vdCB0aGUgY29ycmVjdCB0ZXJtaW5hdGlvbgogICAqIGNhcGFiaWxpdHkgb2YgdGhlIGlzb2xhdGUgaWRlbnRpZmllZCBieSBbY29udHJvbFBvcnRdLAogICAqIHRoZW4gY2FsbHMgdG8gdGhvc2UgbWV0aG9kcyB3aWxsIGhhdmUgbm8gZWZmZWN0LgogICAqLwogIGZpbmFsIENhcGFiaWxpdHkgdGVybWluYXRlQ2FwYWJpbGl0eTsKCiAgLyoqCiAgICogVGhlIG5hbWUgb2YgdGhlIFtJc29sYXRlXSBkaXNwbGF5ZWQgZm9yIGRlYnVnIHB1cnBvc2VzLgogICAqCiAgICogVGhpcyBjYW4gYmUgc2V0IHVzaW5nIHRoZSBgZGVidWdOYW1lYCBwYXJhbWV0ZXIgaW4gW3NwYXduXSBhbmQgW3NwYXduVXJpXS4KICAgKgogICAqIFRoaXMgbmFtZSBkb2VzIG5vdCB1bmlxdWVseSBpZGVudGlmeSBhbiBpc29sYXRlLiBNdWx0aXBsZSBpc29sYXRlcyBpbiB0aGUKICAgKiBzYW1lIHByb2Nlc3MgbWF5IGhhdmUgdGhlIHNhbWUgYGRlYnVnTmFtZWAuCiAgICoKICAgKiBGb3IgYSBnaXZlbiBpc29sYXRlLCB0aGlzIHZhbHVlIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIHZhbHVlcyByZXR1cm5lZCBieQogICAqIGBEYXJ0X0RlYnVnTmFtZWAgaW4gdGhlIEMgZW1iZWRkaW5nIEFQSSBhbmQgdGhlIGBkZWJ1Z05hbWVgIHByb3BlcnR5IGluCiAgICogW0lzb2xhdGVNaXJyb3JdLgogICAqLwogIGV4dGVybmFsIFN0cmluZyBnZXQgZGVidWdOYW1lOwoKICAvKioKICAgKiBDcmVhdGUgYSBuZXcgW0lzb2xhdGVdIG9iamVjdCB3aXRoIGEgcmVzdHJpY3RlZCBzZXQgb2YgY2FwYWJpbGl0aWVzLgogICAqCiAgICogVGhlIHBvcnQgc2hvdWxkIGJlIGEgY29udHJvbCBwb3J0IGZvciBhbiBpc29sYXRlLCBhcyB0YWtlbiBmcm9tCiAgICogYW5vdGhlciBgSXNvbGF0ZWAgb2JqZWN0LgogICAqCiAgICogVGhlIGNhcGFiaWxpdGllcyBzaG91bGQgYmUgdGhlIHN1YnNldCBvZiB0aGUgY2FwYWJpbGl0aWVzIHRoYXQgYXJlCiAgICogYXZhaWxhYmxlIHRvIHRoZSBvcmlnaW5hbCBpc29sYXRlLgogICAqIENhcGFiaWxpdGllcyBvZiBhbiBpc29sYXRlIGFyZSBsb2NrZWQgdG8gdGhhdCBpc29sYXRlLCBhbmQgaGF2ZSBubyBlZmZlY3QKICAgKiBhbnl3aGVyZSBlbHNlLCBzbyB0aGUgY2FwYWJpbGl0aWVzIHNob3VsZCBjb21lIGZyb20gdGhlIHNhbWUgaXNvbGF0ZSBhcwogICAqIHRoZSBjb250cm9sIHBvcnQuCiAgICoKICAgKiBDYW4gYWxzbyBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBbSXNvbGF0ZV0gb2JqZWN0IGZyb20gYSBjb250cm9sIHBvcnQsIGFuZAogICAqIGFueSBhdmFpbGFibGUgY2FwYWJpbGl0aWVzLCB0aGF0IGhhdmUgYmVlbiBzZW50IHRocm91Z2ggYSBbU2VuZFBvcnRdLgogICAqCiAgICogRXhhbXBsZToKICAgKiBgYGBkYXJ0CiAgICogSXNvbGF0ZSBpc29sYXRlID0gZmluZFNvbWVJc29sYXRlKCk7CiAgICogSXNvbGF0ZSByZXN0cmljdGVkSXNvbGF0ZSA9IG5ldyBJc29sYXRlKGlzb2xhdGUuY29udHJvbFBvcnQpOwogICAqIHVudHJ1c3RlZENvZGUocmVzdHJpY3RlZElzb2xhdGUpOwogICAqIGBgYAogICAqIFRoaXMgZXhhbXBsZSBjcmVhdGVzIGEgbmV3IGBJc29sYXRlYCBvYmplY3QgdGhhdCBjYW5ub3QgYmUgdXNlZCB0bwogICAqIHBhdXNlIG9yIHRlcm1pbmF0ZSB0aGUgaXNvbGF0ZS4gQWxsIHRoZSB1bnRydXN0ZWQgY29kZSBjYW4gZG8gaXMgdG8KICAgKiBpbnNwZWN0IHRoZSBpc29sYXRlIGFuZCBzZWUgdW5jYXVnaHQgZXJyb3JzIG9yIHdoZW4gaXQgdGVybWluYXRlcy4KICAgKi8KICBJc29sYXRlKHRoaXMuY29udHJvbFBvcnQsIHt0aGlzLnBhdXNlQ2FwYWJpbGl0eSwgdGhpcy50ZXJtaW5hdGVDYXBhYmlsaXR5fSk7CgogIC8qKgogICAqIFJldHVybiBhbiBbSXNvbGF0ZV0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBpc29sYXRlLgogICAqCiAgICogVGhlIGN1cnJlbnQgaXNvbGF0ZSBmb3IgY29kZSB1c2luZyBbY3VycmVudF0KICAgKiBpcyB0aGUgaXNvbGF0ZSBydW5uaW5nIHRoZSBjb2RlLgogICAqCiAgICogVGhlIGlzb2xhdGUgb2JqZWN0IHByb3ZpZGVzIHRoZSBjYXBhYmlsaXRpZXMgcmVxdWlyZWQgdG8gaW5zcGVjdCwKICAgKiBwYXVzZSBvciBraWxsIHRoZSBpc29sYXRlLCBhbmQgYWxsb3dzIGdyYW50aW5nIHRoZXNlIGNhcGFiaWxpdGllcwogICAqIHRvIG90aGVycy4KICAgKgogICAqIEl0IGlzIHBvc3NpYmxlIHRvIHBhdXNlIHRoZSBjdXJyZW50IGlzb2xhdGUsIGJ1dCBkb2luZyBzbyAqd2l0aG91dCoKICAgKiBmaXJzdCBwYXNzaW5nIHRoZSBhYmlsaXR5IHRvIHJlc3VtZSBpdCBhZ2FpbiB0byBhbm90aGVyIGlzb2xhdGUsCiAgICogaXMgYSBzdXJlIHdheSB0byBoYW5nIHlvdXIgcHJvZ3JhbS4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgSXNvbGF0ZSBnZXQgY3VycmVudDsKCiAgLyoqCiAgICogVGhlIGxvY2F0aW9uIG9mIHRoZSBwYWNrYWdlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGN1cnJlbnQgaXNvbGF0ZSwgaWYgYW55LgogICAqCiAgICogVGhpcyBnZXR0ZXIgcmV0dXJucyBgbnVsbGAsIGFzIHRoZSBgcGFja2FnZXMvYCBkaXJlY3RvcnkgaXMgbm90IHN1cHBvcnRlZAogICAqIGluIERhcnQgMi4KICAgKi8KICBARGVwcmVjYXRlZCgncGFja2FnZXMvIGRpcmVjdG9yeSByZXNvbHV0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gRGFydCAyLicpCiAgZXh0ZXJuYWwgc3RhdGljIEZ1dHVyZTxVcmk+IGdldCBwYWNrYWdlUm9vdDsKCiAgLyoqCiAgICogVGhlIHBhY2thZ2Ugcm9vdCBvZiB0aGUgY3VycmVudCBpc29sYXRlLCBpZiBhbnkuCiAgICoKICAgKiBJZiB0aGUgaXNvbGF0ZSBpcyB1c2luZyBhIFtwYWNrYWdlUm9vdF0gb3IgdGhlIGlzb2xhdGUgaGFzIG5vdCBiZWVuCiAgICogc2V0dXAgZm9yIHBhY2thZ2UgcmVzb2x1dGlvbiwgdGhpcyBnZXR0ZXIgcmV0dXJucyBgbnVsbGAsIG90aGVyd2lzZSBpdAogICAqIHJldHVybnMgdGhlIHBhY2thZ2UgY29uZmlnIFVSSS4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgRnV0dXJlPFVyaT4gZ2V0IHBhY2thZ2VDb25maWc7CgogIC8qKgogICAqIE1hcHMgYSBwYWNrYWdlOiBVUkkgdG8gYSBub24tcGFja2FnZSBVcmkuCiAgICoKICAgKiBJZiB0aGVyZSBpcyBubyB2YWxpZCBtYXBwaW5nIGZyb20gdGhlIHBhY2thZ2U6IFVSSSBpbiB0aGUgY3VycmVudAogICAqIGlzb2xhdGUsIHRoZW4gdGhpcyBjYWxsIHJldHVybnMgYG51bGxgLiBOb24tcGFja2FnZTogVVJJcyBhcmUKICAgKiByZXR1cm5lZCB1bm1vZGlmaWVkLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBGdXR1cmU8VXJpPiByZXNvbHZlUGFja2FnZVVyaShVcmkgcGFja2FnZVVyaSk7CgogIC8qKgogICAqIENyZWF0ZXMgYW5kIHNwYXducyBhbiBpc29sYXRlIHRoYXQgc2hhcmVzIHRoZSBzYW1lIGNvZGUgYXMgdGhlIGN1cnJlbnQKICAgKiBpc29sYXRlLgogICAqCiAgICogVGhlIGFyZ3VtZW50IFtlbnRyeVBvaW50XSBzcGVjaWZpZXMgdGhlIGluaXRpYWwgZnVuY3Rpb24gdG8gY2FsbAogICAqIGluIHRoZSBzcGF3bmVkIGlzb2xhdGUuCiAgICogVGhlIGVudHJ5LXBvaW50IGZ1bmN0aW9uIGlzIGludm9rZWQgaW4gdGhlIG5ldyBpc29sYXRlIHdpdGggW21lc3NhZ2VdCiAgICogYXMgdGhlIG9ubHkgYXJndW1lbnQuCiAgICoKICAgKiBUaGUgZnVuY3Rpb24gbXVzdCBiZSBhIHRvcC1sZXZlbCBmdW5jdGlvbiBvciBhIHN0YXRpYyBtZXRob2QKICAgKiB0aGF0IGNhbiBiZSBjYWxsZWQgd2l0aCBhIHNpbmdsZSBhcmd1bWVudCwKICAgKiB0aGF0IGlzLCBhIGNvbXBpbGUtdGltZSBjb25zdGFudCBmdW5jdGlvbiB2YWx1ZQogICAqIHdoaWNoIGFjY2VwdHMgYXQgbGVhc3Qgb25lIHBvc2l0aW9uYWwgcGFyYW1ldGVyCiAgICogYW5kIGhhcyBhdCBtb3N0IG9uZSByZXF1aXJlZCBwb3NpdGlvbmFsIHBhcmFtZXRlci4KICAgKiBUaGUgZnVuY3Rpb24gbWF5IGFjY2VwdCBhbnkgbnVtYmVyIG9mIG9wdGlvbmFsIHBhcmFtZXRlcnMsCiAgICogYXMgbG9uZyBhcyBpdCAqY2FuKiBiZSBjYWxsZWQgd2l0aCBqdXN0IGEgc2luZ2xlIGFyZ3VtZW50LgogICAqIFRoZSBmdW5jdGlvbiBtdXN0IG5vdCBiZSB0aGUgdmFsdWUgb2YgYSBmdW5jdGlvbiBleHByZXNzaW9uCiAgICogb3IgYW4gaW5zdGFuY2UgbWV0aG9kIHRlYXItb2ZmLgogICAqCiAgICogVXN1YWxseSB0aGUgaW5pdGlhbCBbbWVzc2FnZV0gY29udGFpbnMgYSBbU2VuZFBvcnRdIHNvCiAgICogdGhhdCB0aGUgc3Bhd25lciBhbmQgc3Bhd25lZSBjYW4gY29tbXVuaWNhdGUgd2l0aCBlYWNoIG90aGVyLgogICAqCiAgICogSWYgdGhlIFtwYXVzZWRdIHBhcmFtZXRlciBpcyBzZXQgdG8gYHRydWVgLAogICAqIHRoZSBpc29sYXRlIHdpbGwgc3RhcnQgdXAgaW4gYSBwYXVzZWQgc3RhdGUsCiAgICoganVzdCBiZWZvcmUgY2FsbGluZyB0aGUgW2VudHJ5UG9pbnRdIGZ1bmN0aW9uIHdpdGggdGhlIFttZXNzYWdlXSwKICAgKiBhcyBpZiBieSBhbiBpbml0aWFsIGNhbGwgb2YgYGlzb2xhdGUucGF1c2UoaXNvbGF0ZS5wYXVzZUNhcGFiaWxpdHkpYC4KICAgKiBUbyByZXN1bWUgdGhlIGlzb2xhdGUsIGNhbGwgYGlzb2xhdGUucmVzdW1lKGlzb2xhdGUucGF1c2VDYXBhYmlsaXR5KWAuCiAgICoKICAgKiBJZiB0aGUgW2Vycm9yc0FyZUZhdGFsXSwgW29uRXhpdF0gYW5kL29yIFtvbkVycm9yXSBwYXJhbWV0ZXJzIGFyZSBwcm92aWRlZCwKICAgKiB0aGUgaXNvbGF0ZSB3aWxsIGFjdCBhcyBpZiwgcmVzcGVjdGl2ZWx5LCBbc2V0RXJyb3JzRmF0YWxdLAogICAqIFthZGRPbkV4aXRMaXN0ZW5lcl0gYW5kIFthZGRFcnJvckxpc3RlbmVyXSB3ZXJlIGNhbGxlZCB3aXRoIHRoZQogICAqIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIGFuZCB3YXMgcHJvY2Vzc2VkIGJlZm9yZSB0aGUgaXNvbGF0ZSBzdGFydHMKICAgKiBydW5uaW5nLgogICAqCiAgICogSWYgW2RlYnVnTmFtZV0gaXMgcHJvdmlkZWQsIHRoZSBzcGF3bmVkIFtJc29sYXRlXSB3aWxsIGJlIGlkZW50aWZpYWJsZSBieQogICAqIHRoaXMgbmFtZSBpbiBkZWJ1Z2dlcnMgYW5kIGxvZ2dpbmcuCiAgICoKICAgKiBJZiBbZXJyb3JzQXJlRmF0YWxdIGlzIG9taXR0ZWQsIHRoZSBwbGF0Zm9ybSBtYXkgY2hvb3NlIGEgZGVmYXVsdCBiZWhhdmlvcgogICAqIG9yIGluaGVyaXQgdGhlIGN1cnJlbnQgaXNvbGF0ZSdzIGJlaGF2aW9yLgogICAqCiAgICogWW91IGNhbiBhbHNvIGNhbGwgdGhlIFtzZXRFcnJvcnNGYXRhbF0sIFthZGRPbkV4aXRMaXN0ZW5lcl0gYW5kCiAgICogW2FkZEVycm9yTGlzdGVuZXJdIG1ldGhvZHMgb24gdGhlIHJldHVybmVkIGlzb2xhdGUsIGJ1dCB1bmxlc3MgdGhlCiAgICogaXNvbGF0ZSB3YXMgc3RhcnRlZCBhcyBbcGF1c2VkXSwgaXQgbWF5IGFscmVhZHkgaGF2ZSB0ZXJtaW5hdGVkCiAgICogYmVmb3JlIHRob3NlIG1ldGhvZHMgY2FuIGNvbXBsZXRlLgogICAqCiAgICogUmV0dXJucyBhIGZ1dHVyZSB3aGljaCB3aWxsIGNvbXBsZXRlIHdpdGggYW4gW0lzb2xhdGVdIGluc3RhbmNlIGlmIHRoZQogICAqIHNwYXduaW5nIHN1Y2NlZWRlZC4gSXQgd2lsbCBjb21wbGV0ZSB3aXRoIGFuIGVycm9yIG90aGVyd2lzZS4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgRnV0dXJlPElzb2xhdGU+IHNwYXduPFQ+KAogICAgICB2b2lkIGVudHJ5UG9pbnQoVCBtZXNzYWdlKSwgVCBtZXNzYWdlLAogICAgICB7Ym9vbCBwYXVzZWQ6IGZhbHNlLAogICAgICBib29sIGVycm9yc0FyZUZhdGFsLAogICAgICBTZW5kUG9ydCBvbkV4aXQsCiAgICAgIFNlbmRQb3J0IG9uRXJyb3IsCiAgICAgIFN0cmluZyBkZWJ1Z05hbWV9KTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbmQgc3Bhd25zIGFuIGlzb2xhdGUgdGhhdCBydW5zIHRoZSBjb2RlIGZyb20gdGhlIGxpYnJhcnkgd2l0aAogICAqIHRoZSBzcGVjaWZpZWQgVVJJLgogICAqCiAgICogVGhlIGlzb2xhdGUgc3RhcnRzIGV4ZWN1dGluZyB0aGUgdG9wLWxldmVsIGBtYWluYCBmdW5jdGlvbiBvZiB0aGUgbGlicmFyeQogICAqIHdpdGggdGhlIGdpdmVuIFVSSS4KICAgKgogICAqIFRoZSB0YXJnZXQgYG1haW5gIG11c3QgYmUgY2FsbGFibGUgd2l0aCB6ZXJvLCBvbmUgb3IgdHdvIGFyZ3VtZW50cy4KICAgKiBFeGFtcGxlczoKICAgKgogICAqICogYG1haW4oKWAKICAgKiAqIGBtYWluKGFyZ3MpYAogICAqICogYG1haW4oYXJncywgbWVzc2FnZSlgCiAgICoKICAgKiBXaGVuIHByZXNlbnQsIHRoZSBwYXJhbWV0ZXIgYGFyZ3NgIGlzIHNldCB0byB0aGUgcHJvdmlkZWQgW2FyZ3NdIGxpc3QuCiAgICogV2hlbiBwcmVzZW50LCB0aGUgcGFyYW1ldGVyIGBtZXNzYWdlYCBpcyBzZXQgdG8gdGhlIGluaXRpYWwgW21lc3NhZ2VdLgogICAqCiAgICogSWYgdGhlIFtwYXVzZWRdIHBhcmFtZXRlciBpcyBzZXQgdG8gYHRydWVgLAogICAqIHRoZSBpc29sYXRlIHdpbGwgc3RhcnQgdXAgaW4gYSBwYXVzZWQgc3RhdGUsCiAgICogYXMgaWYgYnkgYW4gaW5pdGlhbCBjYWxsIG9mIGBpc29sYXRlLnBhdXNlKGlzb2xhdGUucGF1c2VDYXBhYmlsaXR5KWAuCiAgICogVG8gcmVzdW1lIHRoZSBpc29sYXRlLCBjYWxsIGBpc29sYXRlLnJlc3VtZShpc29sYXRlLnBhdXNlQ2FwYWJpbGl0eSlgLgogICAqCiAgICogSWYgdGhlIFtlcnJvcnNBcmVGYXRhbF0sIFtvbkV4aXRdIGFuZC9vciBbb25FcnJvcl0gcGFyYW1ldGVycyBhcmUgcHJvdmlkZWQsCiAgICogdGhlIGlzb2xhdGUgd2lsbCBhY3QgYXMgaWYsIHJlc3BlY3RpdmVseSwgW3NldEVycm9yc0ZhdGFsXSwKICAgKiBbYWRkT25FeGl0TGlzdGVuZXJdIGFuZCBbYWRkRXJyb3JMaXN0ZW5lcl0gd2VyZSBjYWxsZWQgd2l0aCB0aGUKICAgKiBjb3JyZXNwb25kaW5nIHBhcmFtZXRlciBhbmQgd2FzIHByb2Nlc3NlZCBiZWZvcmUgdGhlIGlzb2xhdGUgc3RhcnRzCiAgICogcnVubmluZy4KICAgKgogICAqIFlvdSBjYW4gYWxzbyBjYWxsIHRoZSBbc2V0RXJyb3JzRmF0YWxdLCBbYWRkT25FeGl0TGlzdGVuZXJdIGFuZAogICAqIFthZGRFcnJvckxpc3RlbmVyXSBtZXRob2RzIG9uIHRoZSByZXR1cm5lZCBpc29sYXRlLCBidXQgdW5sZXNzIHRoZQogICAqIGlzb2xhdGUgd2FzIHN0YXJ0ZWQgYXMgW3BhdXNlZF0sIGl0IG1heSBhbHJlYWR5IGhhdmUgdGVybWluYXRlZAogICAqIGJlZm9yZSB0aG9zZSBtZXRob2RzIGNhbiBjb21wbGV0ZS4KICAgKgogICAqIElmIHRoZSBbY2hlY2tlZF0gcGFyYW1ldGVyIGlzIHNldCB0byBgdHJ1ZWAgb3IgYGZhbHNlYCwKICAgKiB0aGUgbmV3IGlzb2xhdGUgd2lsbCBydW4gY29kZSBpbiBjaGVja2VkIG1vZGUgKGVuYWJsaW5nIGFzc2VydHMgYW5kIHR5cGUKICAgKiBjaGVja3MpLCByZXNwZWN0aXZlbHkgaW4gcHJvZHVjdGlvbiBtb2RlIChkaXNhYmxpbmcgYXNzZXJ0cyBhbmQgdHlwZQogICAqIGNoZWNrcyksIGlmIHBvc3NpYmxlLiBJZiB0aGUgcGFyYW1ldGVyIGlzIG9taXR0ZWQsIHRoZSBuZXcgaXNvbGF0ZSB3aWxsCiAgICogaW5oZXJpdCB0aGUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCBpc29sYXRlLgogICAqCiAgICogSW4gRGFydDIgc3Ryb25nIG1vZGUsIHRoZSBgY2hlY2tlZGAgcGFyYW1ldGVyIG9ubHkgY29udHJvbHMgYXNzZXJ0cywgYnV0CiAgICogbm90IHR5cGUgY2hlY2tzLgogICAqCiAgICogSXQgbWF5IG5vdCBhbHdheXMgYmUgcG9zc2libGUgdG8gaG9ub3IgdGhlIGBjaGVja2VkYCBwYXJhbWV0ZXIuCiAgICogSWYgdGhlIGlzb2xhdGUgY29kZSB3YXMgcHJlLWNvbXBpbGVkLCBpdCBtYXkgbm90IGJlIHBvc3NpYmxlIHRvIGNoYW5nZQogICAqIHRoZSBjaGVja2VkIG1vZGUgc2V0dGluZyBkeW5hbWljYWxseS4KICAgKiBJbiB0aGF0IGNhc2UsIHRoZSBgY2hlY2tlZGAgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCiAgICoKICAgKiBXQVJOSU5HOiBUaGUgW2NoZWNrZWRdIHBhcmFtZXRlciBpcyBub3QgaW1wbGVtZW50ZWQgb24gYWxsIHBsYXRmb3JtcyB5ZXQuCiAgICoKICAgKiBJZiB0aGUgW3BhY2thZ2VDb25maWddIHBhcmFtZXRlciBpcyBwcm92aWRlZCwgdGhlbiBpdCBpcyB1c2VkIHRvIGZpbmQgdGhlCiAgICogbG9jYXRpb24gb2YgYSBwYWNrYWdlIHJlc29sdXRpb24gY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgc3Bhd25lZAogICAqIGlzb2xhdGUuCiAgICoKICAgKiBJZiB0aGUgW2F1dG9tYXRpY1BhY2thZ2VSZXNvbHV0aW9uXSBwYXJhbWV0ZXIgaXMgcHJvdmlkZWQsIHRoZW4gdGhlCiAgICogbG9jYXRpb24gb2YgdGhlIHBhY2thZ2Ugc291cmNlcyBpbiB0aGUgc3Bhd25lZCBpc29sYXRlIGlzIGF1dG9tYXRpY2FsbHkKICAgKiBkZXRlcm1pbmVkLgogICAqCiAgICogVGhlIFtlbnZpcm9ubWVudF0gaXMgYSBtYXBwaW5nIGZyb20gc3RyaW5ncyB0byBzdHJpbmdzIHdoaWNoIHRoZQogICAqIHNwYXduZWQgaXNvbGF0ZSB1c2VzIHdoZW4gbG9va2luZyB1cCBbU3RyaW5nLmZyb21FbnZpcm9ubWVudF0gdmFsdWVzLgogICAqIFRoZSBzeXN0ZW0gbWF5IGFkZCBpdHMgb3duIGVudHJpZXMgdG8gZW52aXJvbm1lbnQgYXMgd2VsbC4KICAgKiBJZiBgZW52aXJvbm1lbnRgIGlzIG9taXR0ZWQsIHRoZSBzcGF3bmVkIGlzb2xhdGUgaGFzIHRoZSBzYW1lIGVudmlyb25tZW50CiAgICogZGVjbGFyYXRpb25zIGFzIHRoZSBzcGF3bmluZyBpc29sYXRlLgogICAqCiAgICogV0FSTklORzogVGhlIFtlbnZpcm9ubWVudF0gcGFyYW1ldGVyIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiBhbGwKICAgKiBwbGF0Zm9ybXMgeWV0LgogICAqCiAgICogSWYgW2RlYnVnTmFtZV0gaXMgcHJvdmlkZWQsIHRoZSBzcGF3bmVkIFtJc29sYXRlXSB3aWxsIGJlIGlkZW50aWZpYWJsZSBieQogICAqIHRoaXMgbmFtZSBpbiBkZWJ1Z2dlcnMgYW5kIGxvZ2dpbmcuCiAgICoKICAgKiBSZXR1cm5zIGEgZnV0dXJlIHRoYXQgd2lsbCBjb21wbGV0ZSB3aXRoIGFuIFtJc29sYXRlXSBpbnN0YW5jZSBpZiB0aGUKICAgKiBzcGF3bmluZyBzdWNjZWVkZWQuIEl0IHdpbGwgY29tcGxldGUgd2l0aCBhbiBlcnJvciBvdGhlcndpc2UuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIEZ1dHVyZTxJc29sYXRlPiBzcGF3blVyaSgKICAgICAgVXJpIHVyaSwKICAgICAgTGlzdDxTdHJpbmc+IGFyZ3MsCiAgICAgIHZhciBtZXNzYWdlLAogICAgICB7Ym9vbCBwYXVzZWQ6IGZhbHNlLAogICAgICBTZW5kUG9ydCBvbkV4aXQsCiAgICAgIFNlbmRQb3J0IG9uRXJyb3IsCiAgICAgIGJvb2wgZXJyb3JzQXJlRmF0YWwsCiAgICAgIGJvb2wgY2hlY2tlZCwKICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudCwKICAgICAgQERlcHJlY2F0ZWQoJ1RoZSBwYWNrYWdlcy8gZGlyIGlzIG5vdCBzdXBwb3J0ZWQgaW4gRGFydCAyJykKICAgICAgICAgIFVyaSBwYWNrYWdlUm9vdCwKICAgICAgVXJpIHBhY2thZ2VDb25maWcsCiAgICAgIGJvb2wgYXV0b21hdGljUGFja2FnZVJlc29sdXRpb246IGZhbHNlLAogICAgICBTdHJpbmcgZGVidWdOYW1lfSk7CgogIC8qKgogICAqIFJlcXVlc3RzIHRoZSBpc29sYXRlIHRvIHBhdXNlLgogICAqCiAgICogV2hlbiB0aGUgaXNvbGF0ZSByZWNlaXZlcyB0aGUgcGF1c2UgY29tbWFuZCwgaXQgc3RvcHMKICAgKiBwcm9jZXNzaW5nIGV2ZW50cyBmcm9tIHRoZSBldmVudCBsb29wIHF1ZXVlLgogICAqIEl0IG1heSBzdGlsbCBhZGQgbmV3IGV2ZW50cyB0byB0aGUgcXVldWUgaW4gcmVzcG9uc2UgdG8sIGUuZy4sIHRpbWVycwogICAqIG9yIHJlY2VpdmUtcG9ydCBtZXNzYWdlcy4gV2hlbiB0aGUgaXNvbGF0ZSBpcyByZXN1bWVkLAogICAqIGl0IHN0YXJ0cyBoYW5kbGluZyB0aGUgYWxyZWFkeSBlbnF1ZXVlZCBldmVudHMuCiAgICoKICAgKiBUaGUgcGF1c2UgcmVxdWVzdCBpcyBzZW50IHRocm91Z2ggdGhlIGlzb2xhdGUncyBjb21tYW5kIHBvcnQsCiAgICogd2hpY2ggYnlwYXNzZXMgdGhlIHJlY2VpdmluZyBpc29sYXRlJ3MgZXZlbnQgbG9vcC4KICAgKiBUaGUgcGF1c2UgdGFrZXMgZWZmZWN0IHdoZW4gaXQgaXMgcmVjZWl2ZWQsIHBhdXNpbmcgdGhlIGV2ZW50IGxvb3AKICAgKiBhcyBpdCBpcyBhdCB0aGF0IHRpbWUuCiAgICoKICAgKiBUaGUgW3Jlc3VtZUNhcGFiaWxpdHldIGlzIHVzZWQgdG8gaWRlbnRpdHkgdGhlIHBhdXNlLAogICAqIGFuZCBtdXN0IGJlIHVzZWQgYWdhaW4gdG8gZW5kIHRoZSBwYXVzZSB1c2luZyBbcmVzdW1lXS4KICAgKiBJZiBbcmVzdW1lQ2FwYWJpbGl0eV0gaXMgb21pdHRlZCwgYSBuZXcgY2FwYWJpbGl0eSBvYmplY3QgaXMgY3JlYXRlZAogICAqIGFuZCB1c2VkIGluc3RlYWQuCiAgICoKICAgKiBJZiBhbiBpc29sYXRlIGlzIHBhdXNlZCBtb3JlIHRoYW4gb25jZSB1c2luZyB0aGUgc2FtZSBjYXBhYmlsaXR5LAogICAqIG9ubHkgb25lIHJlc3VtZSB3aXRoIHRoYXQgY2FwYWJpbGl0eSBpcyBuZWVkZWQgdG8gZW5kIHRoZSBwYXVzZS4KICAgKgogICAqIElmIGFuIGlzb2xhdGUgaXMgcGF1c2VkIHVzaW5nIG1vcmUgdGhhbiBvbmUgY2FwYWJpbGl0eSwKICAgKiBlYWNoIHBhdXNlIG11c3QgYmUgaW5kaXZpZHVhbGx5IGVuZGVkIGJlZm9yZSB0aGUgaXNvbGF0ZSByZXN1bWVzLgogICAqCiAgICogUmV0dXJucyB0aGUgY2FwYWJpbGl0eSB0aGF0IG11c3QgYmUgdXNlZCB0byBlbmQgdGhlIHBhdXNlLgogICAqIFRoaXMgaXMgZWl0aGVyIFtyZXN1bWVDYXBhYmlsaXR5XSwgb3IgYSBuZXcgY2FwYWJpbGl0eSB3aGVuCiAgICogW3Jlc3VtZUNhcGFiaWxpdHldIGlzIG9taXR0ZWQuCiAgICoKICAgKiBJZiBbcGF1c2VDYXBhYmlsaXR5XSBpcyBgbnVsbGAsIG9yIGl0J3Mgbm90IHRoZSBwYXVzZSBjYXBhYmlsaXR5CiAgICogb2YgdGhlIGlzb2xhdGUgaWRlbnRpZmllZCBieSBbY29udHJvbFBvcnRdLAogICAqIHRoZSBwYXVzZSByZXF1ZXN0IGlzIGlnbm9yZWQgYnkgdGhlIHJlY2VpdmluZyBpc29sYXRlLgogICAqLwogIENhcGFiaWxpdHkgcGF1c2UoW0NhcGFiaWxpdHkgcmVzdW1lQ2FwYWJpbGl0eV0pIHsKICAgIHJlc3VtZUNhcGFiaWxpdHkgPz89IG5ldyBDYXBhYmlsaXR5KCk7CiAgICBfcGF1c2UocmVzdW1lQ2FwYWJpbGl0eSk7CiAgICByZXR1cm4gcmVzdW1lQ2FwYWJpbGl0eTsKICB9CgogIC8qKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiBbcGF1c2VdLiAqLwogIGV4dGVybmFsIHZvaWQgX3BhdXNlKENhcGFiaWxpdHkgcmVzdW1lQ2FwYWJpbGl0eSk7CgogIC8qKgogICAqIFJlc3VtZXMgYSBwYXVzZWQgaXNvbGF0ZS4KICAgKgogICAqIFNlbmRzIGEgbWVzc2FnZSB0byBhbiBpc29sYXRlIHJlcXVlc3RpbmcgdGhhdCBpdCBlbmRzIGEgcGF1c2UKICAgKiB0aGF0IHdhcyBwcmV2aW91c2x5IHJlcXVlc3RlZC4KICAgKgogICAqIFdoZW4gYWxsIGFjdGl2ZSBwYXVzZSByZXF1ZXN0cyBoYXZlIGJlZW4gY2FuY2VsbGVkLCB0aGUgaXNvbGF0ZQogICAqIHdpbGwgY29udGludWUgcHJvY2Vzc2luZyBldmVudHMgYW5kIGhhbmRsaW5nIG5vcm1hbCBtZXNzYWdlcy4KICAgKgogICAqIElmIHRoZSBbcmVzdW1lQ2FwYWJpbGl0eV0gaXMgbm90IG9uZSB0aGF0IGhhcyBwcmV2aW91c2x5IGJlZW4gdXNlZAogICAqIHRvIHBhdXNlIHRoZSBpc29sYXRlLCBvciBpdCBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgdG8gcmVzdW1lIGZyb20KICAgKiB0aGF0IHBhdXNlLCB0aGUgcmVzdW1lIGNhbGwgaGFzIG5vIGVmZmVjdC4KICAgKi8KICBleHRlcm5hbCB2b2lkIHJlc3VtZShDYXBhYmlsaXR5IHJlc3VtZUNhcGFiaWxpdHkpOwoKICAvKioKICAgKiBSZXF1ZXN0cyBhbiBleGl0IG1lc3NhZ2Ugb24gW3Jlc3BvbnNlUG9ydF0gd2hlbiB0aGUgaXNvbGF0ZSB0ZXJtaW5hdGVzLgogICAqCiAgICogVGhlIGlzb2xhdGUgd2lsbCBzZW5kIFtyZXNwb25zZV0gYXMgYSBtZXNzYWdlIG9uIFtyZXNwb25zZVBvcnRdIGFzIHRoZSBsYXN0CiAgICogdGhpbmcgYmVmb3JlIGl0IHRlcm1pbmF0ZXMuIEl0IHdpbGwgcnVuIG5vIGZ1cnRoZXIgY29kZSBhZnRlciB0aGUgbWVzc2FnZQogICAqIGhhcyBiZWVuIHNlbnQuCiAgICoKICAgKiBBZGRpbmcgdGhlIHNhbWUgcG9ydCBtb3JlIHRoYW4gb25jZSB3aWxsIG9ubHkgY2F1c2UgaXQgdG8gcmVjZWl2ZSBvbmUgZXhpdAogICAqIG1lc3NhZ2UsIHVzaW5nIHRoZSBsYXN0IHJlc3BvbnNlIHZhbHVlIHRoYXQgd2FzIGFkZGVkLAogICAqIGFuZCBpdCBvbmx5IG5lZWRzIHRvIGJlIHJlbW92ZWQgb25jZSB1c2luZyBbcmVtb3ZlT25FeGl0TGlzdGVuZXJdLgogICAqCiAgICogSWYgdGhlIGlzb2xhdGUgaGFzIHRlcm1pbmF0ZWQgYmVmb3JlIGl0IGNhbiByZWNlaXZlIHRoaXMgcmVxdWVzdCwKICAgKiBubyBleGl0IG1lc3NhZ2Ugd2lsbCBiZSBzZW50LgogICAqCiAgICogVGhlIFtyZXNwb25zZV0gb2JqZWN0IG11c3QgZm9sbG93IHRoZSBzYW1lIHJlc3RyaWN0aW9ucyBhcyBlbmZvcmNlZCBieQogICAqIFtTZW5kUG9ydC5zZW5kXS4KICAgKiBJdCBpcyByZWNvbW1lbmRlZCB0byBvbmx5IHVzZSBzaW1wbGUgdmFsdWVzIHRoYXQgY2FuIGJlIHNlbnQgdG8gYWxsCiAgICogaXNvbGF0ZXMsIGxpa2UgYG51bGxgLCBib29sZWFucywgbnVtYmVycyBvciBzdHJpbmdzLgogICAqCiAgICogU2luY2UgaXNvbGF0ZXMgcnVuIGNvbmN1cnJlbnRseSwgaXQncyBwb3NzaWJsZSBmb3IgaXQgdG8gZXhpdCBiZWZvcmUgdGhlCiAgICogZXhpdCBsaXN0ZW5lciBpcyBlc3RhYmxpc2hlZCwgYW5kIGluIHRoYXQgY2FzZSBubyByZXNwb25zZSB3aWxsIGJlCiAgICogc2VudCBvbiBbcmVzcG9uc2VQb3J0XS4KICAgKiBUbyBhdm9pZCB0aGlzLCBlaXRoZXIgdXNlIHRoZSBjb3JyZXNwb25kaW5nIHBhcmFtZXRlciB0byB0aGUgc3Bhd24KICAgKiBmdW5jdGlvbiwgb3Igc3RhcnQgdGhlIGlzb2xhdGUgcGF1c2VkLCBhZGQgdGhlIGxpc3RlbmVyIGFuZAogICAqIHRoZW4gcmVzdW1lIHRoZSBpc29sYXRlLgogICAqLwogIC8qIFRPRE8obHJuKTogQ2FuIHdlIGRvIGJldHRlcj8gQ2FuIHRoZSBzeXN0ZW0gcmVjb2duaXplIHRoaXMgbWVzc2FnZSBhbmQKICAgKiBzZW5kIGEgcmVwbHkgaWYgdGhlIHJlY2VpdmluZyBpc29sYXRlIGlzIGRlYWQ/CiAgICovCiAgZXh0ZXJuYWwgdm9pZCBhZGRPbkV4aXRMaXN0ZW5lcihTZW5kUG9ydCByZXNwb25zZVBvcnQsIHtPYmplY3QgcmVzcG9uc2V9KTsKCiAgLyoqCiAgICogU3RvcHMgbGlzdGVuaW5nIGZvciBleGl0IG1lc3NhZ2VzIGZyb20gdGhlIGlzb2xhdGUuCiAgICoKICAgKiBSZXF1ZXN0cyBmb3IgdGhlIGlzb2xhdGUgdG8gbm90IHNlbmQgZXhpdCBtZXNzYWdlcyBvbiBbcmVzcG9uc2VQb3J0XS4KICAgKiBJZiB0aGUgaXNvbGF0ZSBpc24ndCBleHBlY3RpbmcgdG8gc2VuZCBleGl0IG1lc3NhZ2VzIG9uIFtyZXNwb25zZVBvcnRdLAogICAqIGJlY2F1c2UgdGhlIHBvcnQgaGFzbid0IGJlZW4gYWRkZWQgdXNpbmcgW2FkZE9uRXhpdExpc3RlbmVyXSwKICAgKiBvciBiZWNhdXNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZCwgdGhlIHJlcXVlc3QgaXMgaWdub3JlZC4KICAgKgogICAqIElmIHRoZSBzYW1lIHBvcnQgaGFzIGJlZW4gcGFzc2VkIHZpYSBbYWRkT25FeGl0TGlzdGVuZXJdIG1vcmUgdGhhbiBvbmNlLAogICAqIG9ubHkgb25lIGNhbGwgdG8gYHJlbW92ZU9uRXhpdExpc3RlbmVyYCBpcyBuZWVkZWQgdG8gc3RvcCBpdCBmcm9tIHJlY2VpdmluZwogICAqIGV4aXQgbWVzc2FnZXMuCiAgICoKICAgKiBDbG9zaW5nIHRoZSByZWNlaXZlIHBvcnQgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIFtyZXNwb25zZVBvcnRdIGRvZXMKICAgKiBub3Qgc3RvcCB0aGUgaXNvbGF0ZSBmcm9tIHNlbmRpbmcgdW5jYXVnaHQgZXJyb3JzLCB0aGV5IGFyZSBqdXN0IGdvaW5nIHRvCiAgICogYmUgbG9zdC4KICAgKgogICAqIEFuIGV4aXQgbWVzc2FnZSBtYXkgc3RpbGwgYmUgc2VudCBpZiB0aGUgaXNvbGF0ZSB0ZXJtaW5hdGVzCiAgICogYmVmb3JlIHRoaXMgcmVxdWVzdCBpcyByZWNlaXZlZCBhbmQgcHJvY2Vzc2VkLgogICAqLwogIGV4dGVybmFsIHZvaWQgcmVtb3ZlT25FeGl0TGlzdGVuZXIoU2VuZFBvcnQgcmVzcG9uc2VQb3J0KTsKCiAgLyoqCiAgICogU2V0cyB3aGV0aGVyIHVuY2F1Z2h0IGVycm9ycyB3aWxsIHRlcm1pbmF0ZSB0aGUgaXNvbGF0ZS4KICAgKgogICAqIElmIGVycm9ycyBhcmUgZmF0YWwsIGFueSB1bmNhdWdodCBlcnJvciB3aWxsIHRlcm1pbmF0ZSB0aGUgaXNvbGF0ZQogICAqIGV2ZW50IGxvb3AgYW5kIHNodXQgZG93biB0aGUgaXNvbGF0ZS4KICAgKgogICAqIFRoaXMgY2FsbCByZXF1aXJlcyB0aGUgW3Rlcm1pbmF0ZUNhcGFiaWxpdHldIGZvciB0aGUgaXNvbGF0ZS4KICAgKiBJZiB0aGUgY2FwYWJpbGl0eSBpcyBhYnNlbnQgb3IgaW5jb3JyZWN0LCBubyBjaGFuZ2UgaXMgbWFkZS4KICAgKgogICAqIFNpbmNlIGlzb2xhdGVzIHJ1biBjb25jdXJyZW50bHksIGl0J3MgcG9zc2libGUgZm9yIHRoZSByZWNlaXZpbmcgaXNvbGF0ZQogICAqIHRvIGV4aXQgZHVlIHRvIGFuIGVycm9yLCBiZWZvcmUgYSByZXF1ZXN0LCB1c2luZyB0aGlzIG1ldGhvZCwgaGFzIGJlZW4KICAgKiByZWNlaXZlZCBhbmQgcHJvY2Vzc2VkLgogICAqIFRvIGF2b2lkIHRoaXMsIGVpdGhlciB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIHRvIHRoZSBzcGF3bgogICAqIGZ1bmN0aW9uLCBvciBzdGFydCB0aGUgaXNvbGF0ZSBwYXVzZWQsIHNldCBlcnJvcnMgbm9uLWZhdGFsIGFuZAogICAqIHRoZW4gcmVzdW1lIHRoZSBpc29sYXRlLgogICAqLwogIGV4dGVybmFsIHZvaWQgc2V0RXJyb3JzRmF0YWwoYm9vbCBlcnJvcnNBcmVGYXRhbCk7CgogIC8qKgogICAqIFJlcXVlc3RzIHRoZSBpc29sYXRlIHRvIHNodXQgZG93bi4KICAgKgogICAqIFRoZSBpc29sYXRlIGlzIHJlcXVlc3RlZCB0byB0ZXJtaW5hdGUgaXRzZWxmLgogICAqIFRoZSBbcHJpb3JpdHldIGFyZ3VtZW50IHNwZWNpZmllcyB3aGVuIHRoaXMgbXVzdCBoYXBwZW4uCiAgICoKICAgKiBUaGUgW3ByaW9yaXR5XSwgd2hlbiBwcm92aWRlZCwgbXVzdCBiZSBvbmUgb2YgW2ltbWVkaWF0ZV0gb3IKICAgKiBbYmVmb3JlTmV4dEV2ZW50XSAodGhlIGRlZmF1bHQpLgogICAqIFRoZSBzaHV0ZG93biBpcyBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHRpbWVzIGRlcGVuZGluZyBvbiB0aGUgcHJpb3JpdHk6CiAgICoKICAgKiAqIGBpbW1lZGlhdGVgOiBUaGUgaXNvbGF0ZSBzaHV0cyBkb3duIGFzIHNvb24gYXMgcG9zc2libGUuCiAgICogICAgIENvbnRyb2wgbWVzc2FnZXMgYXJlIGhhbmRsZWQgaW4gb3JkZXIsIHNvIGFsbCBwcmV2aW91c2x5IHNlbnQgY29udHJvbAogICAqICAgICBldmVudHMgZnJvbSB0aGlzIGlzb2xhdGUgd2lsbCBhbGwgaGF2ZSBiZWVuIHByb2Nlc3NlZC4KICAgKiAgICAgVGhlIHNodXRkb3duIHNob3VsZCBoYXBwZW4gbm8gbGF0ZXIgdGhhbiBpZiBzZW50IHdpdGgKICAgKiAgICAgYGJlZm9yZU5leHRFdmVudGAuCiAgICogICAgIEl0IG1heSBoYXBwZW4gZWFybGllciBpZiB0aGUgc3lzdGVtIGhhcyBhIHdheSB0byBzaHV0IGRvd24gY2xlYW5seQogICAqICAgICBhdCBhbiBlYXJsaWVyIHRpbWUsIGV2ZW4gZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgYW5vdGhlciBldmVudC4KICAgKiAqIGBiZWZvcmVOZXh0RXZlbnRgOiBUaGUgc2h1dGRvd24gaXMgc2NoZWR1bGVkIGZvciB0aGUgbmV4dCB0aW1lCiAgICogICAgIGNvbnRyb2wgcmV0dXJucyB0byB0aGUgZXZlbnQgbG9vcCBvZiB0aGUgcmVjZWl2aW5nIGlzb2xhdGUsCiAgICogICAgIGFmdGVyIHRoZSBjdXJyZW50IGV2ZW50LCBhbmQgYW55IGFscmVhZHkgc2NoZWR1bGVkIGNvbnRyb2wgZXZlbnRzLAogICAqICAgICBhcmUgY29tcGxldGVkLgogICAqCiAgICogSWYgW3Rlcm1pbmF0ZUNhcGFiaWxpdHldIGlzIGBudWxsYCwgb3IgaXQncyBub3QgdGhlIHRlcm1pbmF0ZSBjYXBhYmlsaXR5CiAgICogb2YgdGhlIGlzb2xhdGUgaWRlbnRpZmllZCBieSBbY29udHJvbFBvcnRdLAogICAqIHRoZSBraWxsIHJlcXVlc3QgaXMgaWdub3JlZCBieSB0aGUgcmVjZWl2aW5nIGlzb2xhdGUuCiAgICovCiAgZXh0ZXJuYWwgdm9pZCBraWxsKHtpbnQgcHJpb3JpdHk6IGJlZm9yZU5leHRFdmVudH0pOwoKICAvKioKICAgKiBSZXF1ZXN0cyB0aGF0IHRoZSBpc29sYXRlIHNlbmQgW3Jlc3BvbnNlXSBvbiB0aGUgW3Jlc3BvbnNlUG9ydF0uCiAgICoKICAgKiBUaGUgW3Jlc3BvbnNlXSBvYmplY3QgbXVzdCBmb2xsb3cgdGhlIHNhbWUgcmVzdHJpY3Rpb25zIGFzIGVuZm9yY2VkIGJ5CiAgICogW1NlbmRQb3J0LnNlbmRdLgogICAqIEl0IGlzIHJlY29tbWVuZGVkIHRvIG9ubHkgdXNlIHNpbXBsZSB2YWx1ZXMgdGhhdCBjYW4gYmUgc2VudCB0byBhbGwKICAgKiBpc29sYXRlcywgbGlrZSBgbnVsbGAsIGJvb2xlYW5zLCBudW1iZXJzIG9yIHN0cmluZ3MuCiAgICoKICAgKiBJZiB0aGUgaXNvbGF0ZSBpcyBhbGl2ZSwgaXQgd2lsbCBldmVudHVhbGx5IHNlbmQgYHJlc3BvbnNlYAogICAqIChkZWZhdWx0aW5nIHRvIGBudWxsYCkgb24gdGhlIHJlc3BvbnNlIHBvcnQuCiAgICoKICAgKiBUaGUgW3ByaW9yaXR5XSBtdXN0IGJlIG9uZSBvZiBbaW1tZWRpYXRlXSBvciBbYmVmb3JlTmV4dEV2ZW50XS4KICAgKiBUaGUgcmVzcG9uc2UgaXMgc2VudCBhdCBkaWZmZXJlbnQgdGltZXMgZGVwZW5kaW5nIG9uIHRoZSBwaW5nIHR5cGU6CiAgICoKICAgKiAqIGBpbW1lZGlhdGVgOiBUaGUgaXNvbGF0ZSByZXNwb25kcyBhcyBzb29uIGFzIGl0IHJlY2VpdmVzIHRoZQogICAqICAgICBjb250cm9sIG1lc3NhZ2UuIFRoaXMgaXMgYWZ0ZXIgYW55IHByZXZpb3VzIGNvbnRyb2wgbWVzc2FnZQogICAqICAgICBmcm9tIHRoZSBzYW1lIGlzb2xhdGUgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIHByb2Nlc3NlZCwKICAgKiAgICAgYnV0IG1heSBiZSBkdXJpbmcgZXhlY3V0aW9uIG9mIGFub3RoZXIgZXZlbnQuCiAgICogKiBgYmVmb3JlTmV4dEV2ZW50YDogVGhlIHJlc3BvbnNlIGlzIHNjaGVkdWxlZCBmb3IgdGhlIG5leHQgdGltZQogICAqICAgICBjb250cm9sIHJldHVybnMgdG8gdGhlIGV2ZW50IGxvb3Agb2YgdGhlIHJlY2VpdmluZyBpc29sYXRlLAogICAqICAgICBhZnRlciB0aGUgY3VycmVudCBldmVudCwgYW5kIGFueSBhbHJlYWR5IHNjaGVkdWxlZCBjb250cm9sIGV2ZW50cywKICAgKiAgICAgYXJlIGNvbXBsZXRlZC4KICAgKi8KICBleHRlcm5hbCB2b2lkIHBpbmcoU2VuZFBvcnQgcmVzcG9uc2VQb3J0LAogICAgICB7T2JqZWN0IHJlc3BvbnNlLCBpbnQgcHJpb3JpdHk6IGltbWVkaWF0ZX0pOwoKICAvKioKICAgKiBSZXF1ZXN0cyB0aGF0IHVuY2F1Z2h0IGVycm9ycyBvZiB0aGUgaXNvbGF0ZSBhcmUgc2VudCBiYWNrIHRvIFtwb3J0XS4KICAgKgogICAqIFRoZSBlcnJvcnMgYXJlIHNlbnQgYmFjayBhcyB0d28gZWxlbWVudHMgbGlzdHMuCiAgICogVGhlIGZpcnN0IGVsZW1lbnQgaXMgYSBgU3RyaW5nYCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IsIHVzdWFsbHkKICAgKiBjcmVhdGVkIGJ5IGNhbGxpbmcgYHRvU3RyaW5nYCBvbiB0aGUgZXJyb3IuCiAgICogVGhlIHNlY29uZCBlbGVtZW50IGlzIGEgYFN0cmluZ2AgcmVwcmVzZW50YXRpb24gb2YgYW4gYWNjb21wYW55aW5nCiAgICogc3RhY2sgdHJhY2UsIG9yIGBudWxsYCBpZiBubyBzdGFjayB0cmFjZSB3YXMgcHJvdmlkZWQuCiAgICogVG8gY29udmVydCB0aGlzIGJhY2sgdG8gYSBbU3RhY2tUcmFjZV0gb2JqZWN0LCB1c2UgW1N0YWNrVHJhY2UuZnJvbVN0cmluZ10uCiAgICoKICAgKiBMaXN0ZW5pbmcgdXNpbmcgdGhlIHNhbWUgcG9ydCBtb3JlIHRoYW4gb25jZSBkb2VzIG5vdGhpbmcuCiAgICogQSBwb3J0IHdpbGwgb25seSByZWNlaXZlIGVhY2ggZXJyb3Igb25jZSwKICAgKiBhbmQgd2lsbCBvbmx5IG5lZWQgdG8gYmUgcmVtb3ZlZCBvbmNlIHVzaW5nIFtyZW1vdmVFcnJvckxpc3RlbmVyXS4KCiAgICogQ2xvc2luZyB0aGUgcmVjZWl2ZSBwb3J0IHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb3J0IGRvZXMgbm90IHN0b3AKICAgKiB0aGUgaXNvbGF0ZSBmcm9tIHNlbmRpbmcgdW5jYXVnaHQgZXJyb3JzLCB0aGV5IGFyZSBqdXN0IGdvaW5nIHRvIGJlIGxvc3QuCiAgICogSW5zdGVhZCB1c2UgW3JlbW92ZUVycm9yTGlzdGVuZXJdIHRvIHN0b3AgcmVjZWl2aW5nIGVycm9ycyBvbiBbcG9ydF0uCiAgICoKICAgKiBTaW5jZSBpc29sYXRlcyBydW4gY29uY3VycmVudGx5LCBpdCdzIHBvc3NpYmxlIGZvciBpdCB0byBleGl0IGJlZm9yZSB0aGUKICAgKiBlcnJvciBsaXN0ZW5lciBpcyBlc3RhYmxpc2hlZC4gVG8gYXZvaWQgdGhpcywgc3RhcnQgdGhlIGlzb2xhdGUgcGF1c2VkLAogICAqIGFkZCB0aGUgbGlzdGVuZXIgYW5kIHRoZW4gcmVzdW1lIHRoZSBpc29sYXRlLgogICAqLwogIGV4dGVybmFsIHZvaWQgYWRkRXJyb3JMaXN0ZW5lcihTZW5kUG9ydCBwb3J0KTsKCiAgLyoqCiAgICogU3RvcHMgbGlzdGVuaW5nIGZvciB1bmNhdWdodCBlcnJvcnMgZnJvbSB0aGUgaXNvbGF0ZS4KICAgKgogICAqIFJlcXVlc3RzIGZvciB0aGUgaXNvbGF0ZSB0byBub3Qgc2VuZCB1bmNhdWdodCBlcnJvcnMgb24gW3BvcnRdLgogICAqIElmIHRoZSBpc29sYXRlIGlzbid0IGV4cGVjdGluZyB0byBzZW5kIHVuY2F1Z2h0IGVycm9ycyBvbiBbcG9ydF0sCiAgICogYmVjYXVzZSB0aGUgcG9ydCBoYXNuJ3QgYmVlbiBhZGRlZCB1c2luZyBbYWRkRXJyb3JMaXN0ZW5lcl0sCiAgICogb3IgYmVjYXVzZSBpdCBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQsIHRoZSByZXF1ZXN0IGlzIGlnbm9yZWQuCiAgICoKICAgKiBJZiB0aGUgc2FtZSBwb3J0IGhhcyBiZWVuIHBhc3NlZCB2aWEgW2FkZEVycm9yTGlzdGVuZXJdIG1vcmUgdGhhbiBvbmNlLAogICAqIG9ubHkgb25lIGNhbGwgdG8gYHJlbW92ZUVycm9yTGlzdGVuZXJgIGlzIG5lZWRlZCB0byBzdG9wIGl0IGZyb20gcmVjZWl2aW5nCiAgICogdW5jYXVnaHQgZXJyb3JzLgogICAqCiAgICogVW5jYXVnaHQgZXJyb3JzIG1lc3NhZ2UgbWF5IHN0aWxsIGJlIHNlbnQgYnkgdGhlIGlzb2xhdGUKICAgKiB1bnRpbCB0aGlzIHJlcXVlc3QgaXMgcmVjZWl2ZWQgYW5kIHByb2Nlc3NlZC4KICAgKi8KICBleHRlcm5hbCB2b2lkIHJlbW92ZUVycm9yTGlzdGVuZXIoU2VuZFBvcnQgcG9ydCk7CgogIC8qKgogICAqIFJldHVybnMgYSBicm9hZGNhc3Qgc3RyZWFtIG9mIHVuY2F1Z2h0IGVycm9ycyBmcm9tIHRoZSBpc29sYXRlLgogICAqCiAgICogRWFjaCBlcnJvciBpcyBwcm92aWRlZCBhcyBhbiBlcnJvciBldmVudCBvbiB0aGUgc3RyZWFtLgogICAqCiAgICogVGhlIGFjdHVhbCBlcnJvciBvYmplY3QgYW5kIHN0YWNrVHJhY2VzIHdpbGwgbm90IG5lY2Vzc2FyaWx5CiAgICogYmUgdGhlIHNhbWUgb2JqZWN0IHR5cGVzIGFzIGluIHRoZSBhY3R1YWwgaXNvbGF0ZSwgYnV0IHRoZXkgd2lsbAogICAqIGFsd2F5cyBoYXZlIHRoZSBzYW1lIFtPYmplY3QudG9TdHJpbmddIHJlc3VsdC4KICAgKgogICAqIFRoaXMgc3RyZWFtIGlzIGJhc2VkIG9uIFthZGRFcnJvckxpc3RlbmVyXSBhbmQgW3JlbW92ZUVycm9yTGlzdGVuZXJdLgogICAqLwogIFN0cmVhbSBnZXQgZXJyb3JzIHsKICAgIFN0cmVhbUNvbnRyb2xsZXIgY29udHJvbGxlcjsKICAgIFJhd1JlY2VpdmVQb3J0IHBvcnQ7CiAgICB2b2lkIGhhbmRsZUVycm9yKG1lc3NhZ2UpIHsKICAgICAgTGlzdCBsaXN0TWVzc2FnZSA9IG1lc3NhZ2U7CiAgICAgIFN0cmluZyBlcnJvckRlc2NyaXB0aW9uID0gbGlzdE1lc3NhZ2VbMF07CiAgICAgIFN0cmluZyBzdGFja0Rlc2NyaXB0aW9uID0gbGlzdE1lc3NhZ2VbMV07CiAgICAgIHZhciBlcnJvciA9IG5ldyBSZW1vdGVFcnJvcihlcnJvckRlc2NyaXB0aW9uLCBzdGFja0Rlc2NyaXB0aW9uKTsKICAgICAgY29udHJvbGxlci5hZGRFcnJvcihlcnJvciwgZXJyb3Iuc3RhY2tUcmFjZSk7CiAgICB9CgogICAgY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdCgKICAgICAgICBzeW5jOiB0cnVlLAogICAgICAgIG9uTGlzdGVuOiAoKSB7CiAgICAgICAgICBwb3J0ID0gbmV3IFJhd1JlY2VpdmVQb3J0KGhhbmRsZUVycm9yKTsKICAgICAgICAgIHRoaXMuYWRkRXJyb3JMaXN0ZW5lcihwb3J0LnNlbmRQb3J0KTsKICAgICAgICB9LAogICAgICAgIG9uQ2FuY2VsOiAoKSB7CiAgICAgICAgICB0aGlzLnJlbW92ZUVycm9yTGlzdGVuZXIocG9ydC5zZW5kUG9ydCk7CiAgICAgICAgICBwb3J0LmNsb3NlKCk7CiAgICAgICAgICBwb3J0ID0gbnVsbDsKICAgICAgICB9KTsKICAgIHJldHVybiBjb250cm9sbGVyLnN0cmVhbTsKICB9Cn0KCi8qKgogKiBTZW5kcyBtZXNzYWdlcyB0byBpdHMgW1JlY2VpdmVQb3J0XXMuCiAqCiAqIFtTZW5kUG9ydF1zIGFyZSBjcmVhdGVkIGZyb20gW1JlY2VpdmVQb3J0XXMuIEFueSBtZXNzYWdlIHNlbnQgdGhyb3VnaAogKiBhIFtTZW5kUG9ydF0gaXMgZGVsaXZlcmVkIHRvIGl0cyBjb3JyZXNwb25kaW5nIFtSZWNlaXZlUG9ydF0uIFRoZXJlIG1pZ2h0IGJlCiAqIG1hbnkgW1NlbmRQb3J0XXMgZm9yIHRoZSBzYW1lIFtSZWNlaXZlUG9ydF0uCiAqCiAqIFtTZW5kUG9ydF1zIGNhbiBiZSB0cmFuc21pdHRlZCB0byBvdGhlciBpc29sYXRlcywgYW5kIHRoZXkgcHJlc2VydmUgZXF1YWxpdHkKICogd2hlbiBzZW50LgogKi8KYWJzdHJhY3QgY2xhc3MgU2VuZFBvcnQgaW1wbGVtZW50cyBDYXBhYmlsaXR5IHsKICAvKioKICAgKiBTZW5kcyBhbiBhc3luY2hyb25vdXMgW21lc3NhZ2VdIHRocm91Z2ggdGhpcyBzZW5kIHBvcnQsIHRvIGl0cwogICAqIGNvcnJlc3BvbmRpbmcgYFJlY2VpdmVQb3J0YC4KICAgKgogICAqIFRoZSBjb250ZW50IG9mIFttZXNzYWdlXSBjYW4gYmU6IHByaW1pdGl2ZSB2YWx1ZXMgKG51bGwsIG51bSwgYm9vbCwgZG91YmxlLAogICAqIFN0cmluZyksIGluc3RhbmNlcyBvZiBbU2VuZFBvcnRdLCBhbmQgbGlzdHMgYW5kIG1hcHMgd2hvc2UgZWxlbWVudHMgYXJlIGFueQogICAqIG9mIHRoZXNlLiBMaXN0IGFuZCBtYXBzIGFyZSBhbHNvIGFsbG93ZWQgdG8gYmUgY3ljbGljLgogICAqCiAgICogSW4gdGhlIHNwZWNpYWwgY2lyY3Vtc3RhbmNlcyB3aGVuIHR3byBpc29sYXRlcyBzaGFyZSB0aGUgc2FtZSBjb2RlIGFuZCBhcmUKICAgKiBydW5uaW5nIGluIHRoZSBzYW1lIHByb2Nlc3MgKGUuZy4gaXNvbGF0ZXMgY3JlYXRlZCB2aWEgW0lzb2xhdGUuc3Bhd25dKSwgaXQKICAgKiBpcyBhbHNvIHBvc3NpYmxlIHRvIHNlbmQgb2JqZWN0IGluc3RhbmNlcyAod2hpY2ggd291bGQgYmUgY29waWVkIGluIHRoZQogICAqIHByb2Nlc3MpLiBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBieSB0aGUgZGFydHZtLiAgRm9yIG5vdywgdGhlCiAgICogZGFydDJqcyBjb21waWxlciBvbmx5IHN1cHBvcnRzIHRoZSByZXN0cmljdGVkIG1lc3NhZ2VzIGRlc2NyaWJlZCBhYm92ZS4KICAgKgogICAqIFRoZSBzZW5kIGhhcHBlbnMgaW1tZWRpYXRlbHkgYW5kIGRvZXNuJ3QgYmxvY2suICBUaGUgY29ycmVzcG9uZGluZyByZWNlaXZlCiAgICogcG9ydCBjYW4gcmVjZWl2ZSB0aGUgbWVzc2FnZSBhcyBzb29uIGFzIGl0cyBpc29sYXRlJ3MgZXZlbnQgbG9vcCBpcyByZWFkeQogICAqIHRvIGRlbGl2ZXIgaXQsIGluZGVwZW5kZW50bHkgb2Ygd2hhdCB0aGUgc2VuZGluZyBpc29sYXRlIGlzIGRvaW5nLgogICAqLwogIHZvaWQgc2VuZCh2YXIgbWVzc2FnZSk7CgogIC8qKgogICAqIFRlc3RzIHdoZXRoZXIgW290aGVyXSBpcyBhIFtTZW5kUG9ydF0gcG9pbnRpbmcgdG8gdGhlIHNhbWUKICAgKiBbUmVjZWl2ZVBvcnRdIGFzIHRoaXMgb25lLgogICAqLwogIGJvb2wgb3BlcmF0b3IgPT0odmFyIG90aGVyKTsKCiAgLyoqCiAgICogUmV0dXJucyBhbiBpbW11dGFibGUgaGFzaCBjb2RlIGZvciB0aGlzIHNlbmQgcG9ydCB0aGF0IGlzCiAgICogY29uc2lzdGVudCB3aXRoIHRoZSA9PSBvcGVyYXRvci4KICAgKi8KICBpbnQgZ2V0IGhhc2hDb2RlOwp9CgovKioKICogVG9nZXRoZXIgd2l0aCBbU2VuZFBvcnRdLCB0aGUgb25seSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIGJldHdlZW4gaXNvbGF0ZXMuCiAqCiAqIFtSZWNlaXZlUG9ydF1zIGhhdmUgYSBgc2VuZFBvcnRgIGdldHRlciB3aGljaCByZXR1cm5zIGEgW1NlbmRQb3J0XS4KICogQW55IG1lc3NhZ2UgdGhhdCBpcyBzZW50IHRocm91Z2ggdGhpcyBbU2VuZFBvcnRdCiAqIGlzIGRlbGl2ZXJlZCB0byB0aGUgW1JlY2VpdmVQb3J0XSBpdCBoYXMgYmVlbiBjcmVhdGVkIGZyb20uIFRoZXJlLCB0aGUKICogbWVzc2FnZSBpcyBkaXNwYXRjaGVkIHRvIHRoZSBgUmVjZWl2ZVBvcnRgJ3MgbGlzdGVuZXIuCiAqCiAqIEEgW1JlY2VpdmVQb3J0XSBpcyBhIG5vbi1icm9hZGNhc3Qgc3RyZWFtLiBUaGlzIG1lYW5zIHRoYXQgaXQgYnVmZmVycwogKiBpbmNvbWluZyBtZXNzYWdlcyB1bnRpbCBhIGxpc3RlbmVyIGlzIHJlZ2lzdGVyZWQuIE9ubHkgb25lIGxpc3RlbmVyIGNhbgogKiByZWNlaXZlIG1lc3NhZ2VzLiBTZWUgW1N0cmVhbS5hc0Jyb2FkY2FzdFN0cmVhbV0gZm9yIHRyYW5zZm9ybWluZyB0aGUgcG9ydAogKiB0byBhIGJyb2FkY2FzdCBzdHJlYW0uCiAqCiAqIEEgW1JlY2VpdmVQb3J0XSBtYXkgaGF2ZSBtYW55IFtTZW5kUG9ydF1zLgogKi8KYWJzdHJhY3QgY2xhc3MgUmVjZWl2ZVBvcnQgaW1wbGVtZW50cyBTdHJlYW0gewogIC8qKgogICAqIE9wZW5zIGEgbG9uZy1saXZlZCBwb3J0IGZvciByZWNlaXZpbmcgbWVzc2FnZXMuCiAgICoKICAgKiBBIFtSZWNlaXZlUG9ydF0gaXMgYSBub24tYnJvYWRjYXN0IHN0cmVhbS4gVGhpcyBtZWFucyB0aGF0IGl0IGJ1ZmZlcnMKICAgKiBpbmNvbWluZyBtZXNzYWdlcyB1bnRpbCBhIGxpc3RlbmVyIGlzIHJlZ2lzdGVyZWQuIE9ubHkgb25lIGxpc3RlbmVyIGNhbgogICAqIHJlY2VpdmUgbWVzc2FnZXMuIFNlZSBbU3RyZWFtLmFzQnJvYWRjYXN0U3RyZWFtXSBmb3IgdHJhbnNmb3JtaW5nIHRoZSBwb3J0CiAgICogdG8gYSBicm9hZGNhc3Qgc3RyZWFtLgogICAqCiAgICogQSByZWNlaXZlIHBvcnQgaXMgY2xvc2VkIGJ5IGNhbmNlbGluZyBpdHMgc3Vic2NyaXB0aW9uLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgUmVjZWl2ZVBvcnQoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtSZWNlaXZlUG9ydF0gZnJvbSBhIFtSYXdSZWNlaXZlUG9ydF0uCiAgICoKICAgKiBUaGUgaGFuZGxlciBvZiB0aGUgZ2l2ZW4gW3Jhd1BvcnRdIGlzIG92ZXJ3cml0dGVuIGR1cmluZyB0aGUgY29uc3RydWN0aW9uCiAgICogb2YgdGhlIHJlc3VsdC4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IFJlY2VpdmVQb3J0LmZyb21SYXdSZWNlaXZlUG9ydChSYXdSZWNlaXZlUG9ydCByYXdQb3J0KTsKCiAgLyoqCiAgICogSW5oZXJpdGVkIGZyb20gW1N0cmVhbV0uCiAgICoKICAgKiBOb3RlIHRoYXQgW29uRXJyb3JdIGFuZCBbY2FuY2VsT25FcnJvcl0gYXJlIGlnbm9yZWQgc2luY2UgYSBSZWNlaXZlUG9ydAogICAqIHdpbGwgbmV2ZXIgcmVjZWl2ZSBhbiBlcnJvci4KICAgKgogICAqIFRoZSBbb25Eb25lXSBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSBjbG9zZXMuCiAgICogVGhlIHN0cmVhbSBjbG9zZXMgd2hlbiBbY2xvc2VdIGlzIGNhbGxlZC4KICAgKi8KICBTdHJlYW1TdWJzY3JpcHRpb24gbGlzdGVuKHZvaWQgb25EYXRhKHZhciBtZXNzYWdlKSwKICAgICAge0Z1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcn0pOwoKICAvKioKICAgKiBDbG9zZXMgYHRoaXNgLgogICAqCiAgICogSWYgdGhlIHN0cmVhbSBoYXMgbm90IGJlZW4gY2FuY2VsZWQgeWV0LCBhZGRzIGEgY2xvc2UtZXZlbnQgdG8gdGhlIGV2ZW50CiAgICogcXVldWUgYW5kIGRpc2NhcmRzIGFueSBmdXJ0aGVyIGluY29taW5nIG1lc3NhZ2VzLgogICAqCiAgICogSWYgdGhlIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGNhbmNlbGVkIHRoaXMgbWV0aG9kIGhhcyBubyBlZmZlY3QuCiAgICovCiAgdm9pZCBjbG9zZSgpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgW1NlbmRQb3J0XSB0aGF0IHNlbmRzIHRvIHRoaXMgcmVjZWl2ZSBwb3J0LgogICAqLwogIFNlbmRQb3J0IGdldCBzZW5kUG9ydDsKfQoKYWJzdHJhY3QgY2xhc3MgUmF3UmVjZWl2ZVBvcnQgewogIC8qKgogICAqIE9wZW5zIGEgbG9uZy1saXZlZCBwb3J0IGZvciByZWNlaXZpbmcgbWVzc2FnZXMuCiAgICoKICAgKiBBIFtSYXdSZWNlaXZlUG9ydF0gaXMgbG93IGxldmVsIGFuZCBkb2VzIG5vdCB3b3JrIHdpdGggW1pvbmVdcy4gSXQKICAgKiBjYW4gbm90IGJlIHBhdXNlZC4gVGhlIGRhdGEtaGFuZGxlciBtdXN0IGJlIHNldCBiZWZvcmUgdGhlIGZpcnN0CiAgICogZXZlbnQgaXMgcmVjZWl2ZWQuCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBSYXdSZWNlaXZlUG9ydChbRnVuY3Rpb24gaGFuZGxlcl0pOwoKICAvKioKICAgKiBTZXRzIHRoZSBoYW5kbGVyIHRoYXQgaXMgaW52b2tlZCBmb3IgZXZlcnkgaW5jb21pbmcgbWVzc2FnZS4KICAgKgogICAqIFRoZSBoYW5kbGVyIGlzIGludm9rZWQgaW4gdGhlIHJvb3Qtem9uZSAoW1pvbmUucm9vdF0pLgogICAqLwogIHZvaWQgc2V0IGhhbmRsZXIoRnVuY3Rpb24gbmV3SGFuZGxlcik7CgogIC8qKgogICAqIENsb3NlcyB0aGUgcG9ydC4KICAgKgogICAqIEFmdGVyIGEgY2FsbCB0byB0aGlzIG1ldGhvZCBhbnkgaW5jb21pbmcgbWVzc2FnZSBpcyBzaWxlbnRseSBkcm9wcGVkLgogICAqLwogIHZvaWQgY2xvc2UoKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIFtTZW5kUG9ydF0gdGhhdCBzZW5kcyB0byB0aGlzIHJhdyByZWNlaXZlIHBvcnQuCiAgICovCiAg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dmUgYQovLy8gc2hhcmVkIGZyb250IGVuZCBhbmQgc2ltcGx5IHVzZSBwYXJ0cy4KCmltcG9ydCAiZGFydDpfaW50ZXJuYWwiIHNob3cgVk1MaWJyYXJ5SG9va3MsIHBhdGNoOwoKaW1wb3J0ICJkYXJ0OmFzeW5jIgogICAgc2hvdyBDb21wbGV0ZXIsIEZ1dHVyZSwgU3RyZWFtLCBTdHJlYW1Db250cm9sbGVyLCBTdHJlYW1TdWJzY3JpcHRpb24sIFRpbWVyOwoKaW1wb3J0ICJkYXJ0OmNvbGxlY3Rpb24iIHNob3cgSGFzaE1hcDsKCi8vLyBUaGVzZSBhcmUgdGhlIGFkZGl0aW9uYWwgcGFydHMgb2YgdGhpcyBwYXRjaCBsaWJyYXJ5OgovLyBwYXJ0ICJ0aW1lcl9pbXBsLmRhcnQiOwoKQHBhdGNoCmNsYXNzIFJlY2VpdmVQb3J0IHsKICBAcGF0Y2gKICBmYWN0b3J5IFJlY2VpdmVQb3J0KCkgPT4gbmV3IF9SZWNlaXZlUG9ydEltcGwoKTsKCiAgQHBhdGNoCiAgZmFjdG9yeSBSZWNlaXZlUG9ydC5mcm9tUmF3UmVjZWl2ZVBvcnQoUmF3UmVjZWl2ZVBvcnQgcmF3UG9ydCkgewogICAgcmV0dXJuIG5ldyBfUmVjZWl2ZVBvcnRJbXBsLmZyb21SYXdSZWNlaXZlUG9ydChyYXdQb3J0KTsKICB9Cn0KCkBwYXRjaApjbGFzcyBDYXBhYmlsaXR5IHsKICBAcGF0Y2gKICBmYWN0b3J5IENhcGFiaWxpdHkoKSA9PiBuZXcgX0NhcGFiaWxpdHlJbXBsKCk7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0NhcGFiaWxpdHlJbXBsIGltcGxlbWVudHMgQ2FwYWJpbGl0eSB7CiAgZmFjdG9yeSBfQ2FwYWJpbGl0eUltcGwoKSBuYXRpdmUgIkNhcGFiaWxpdHlJbXBsX2ZhY3RvcnkiOwoKICBib29sIG9wZXJhdG9yID09KHZhciBvdGhlcikgewogICAgcmV0dXJuIChvdGhlciBpcyBfQ2FwYWJpbGl0eUltcGwpICYmIF9lcXVhbHMob3RoZXIpOwogIH0KCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICByZXR1cm4gX2dldF9oYXNoY29kZSgpOwogIH0KCiAgX2VxdWFscyhvdGhlcikgbmF0aXZlICJDYXBhYmlsaXR5SW1wbF9lcXVhbHMiOwogIF9nZXRfaGFzaGNvZGUoKSBuYXRpdmUgIkNhcGFiaWxpdHlJbXBsX2dldF9oYXNoY29kZSI7Cn0KCkBwYXRjaApjbGFzcyBSYXdSZWNlaXZlUG9ydCB7CiAgLyoqCiAgICogT3BlbnMgYSBsb25nLWxpdmVkIHBvcnQgZm9yIHJlY2VpdmluZyBtZXNzYWdlcy4KICAgKgogICAqIEEgW1Jhd1JlY2VpdmVQb3J0XSBpcyBsb3cgbGV2ZWwgYW5kIGRvZXMgbm90IHdvcmsgd2l0aCBbWm9uZV1zLiBJdAogICAqIGNhbiBub3QgYmUgcGF1c2VkLiBUaGUgZGF0YS1oYW5kbGVyIG11c3QgYmUgc2V0IGJlZm9yZSB0aGUgZmlyc3QKICAgKiBldmVudCBpcyByZWNlaXZlZC4KICAgKi8KICBAcGF0Y2gKICBmYWN0b3J5IFJhd1JlY2VpdmVQb3J0KFtGdW5jdGlvbiBoYW5kbGVyXSkgewogICAgX1Jhd1JlY2VpdmVQb3J0SW1wbCByZXN1bHQgPSBuZXcgX1Jhd1JlY2VpdmVQb3J0SW1wbCgpOwogICAgcmVzdWx0LmhhbmRsZXIgPSBoYW5kbGVyOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KCmNsYXNzIF9SZWNlaXZlUG9ydEltcGwgZXh0ZW5kcyBTdHJlYW0gaW1wbGVtZW50cyBSZWNlaXZlUG9ydCB7CiAgX1JlY2VpdmVQb3J0SW1wbCgpIDogdGhpcy5mcm9tUmF3UmVjZWl2ZVBvcnQobmV3IFJhd1JlY2VpdmVQb3J0KCkpOwoKICBfUmVjZWl2ZVBvcnRJbXBsLmZyb21SYXdSZWNlaXZlUG9ydCh0aGlzLl9yYXdQb3J0KSB7CiAgICBfY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyKG9uQ2FuY2VsOiBjbG9zZSwgc3luYzogdHJ1ZSk7CiAgICBfcmF3UG9ydC5oYW5kbGVyID0gX2NvbnRyb2xsZXIuYWRkOwogIH0KCiAgU2VuZFBvcnQgZ2V0IHNlbmRQb3J0IHsKICAgIHJldHVybiBfcmF3UG9ydC5zZW5kUG9ydDsKICB9CgogIFN0cmVhbVN1YnNjcmlwdGlvbiBsaXN0ZW4odm9pZCBvbkRhdGEodmFyIG1lc3NhZ2UpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSkgewogICAgcmV0dXJuIF9jb250cm9sbGVyLnN0cmVhbS5saXN0ZW4ob25EYXRhLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsIG9uRG9uZTogb25Eb25lLCBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKTsKICB9CgogIGNsb3NlKCkgewogICAgX3Jhd1BvcnQuY2xvc2UoKTsKICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgfQoKICBmaW5hbCBSYXdSZWNlaXZlUG9ydCBfcmF3UG9ydDsKICBTdHJlYW1Db250cm9sbGVyIF9jb250cm9sbGVyOwp9Cgp0eXBlZGVmIHZvaWQgX0ltbWVkaWF0ZUNhbGxiYWNrKCk7CgovLy8gVGhlIGNhbGxiYWNrIHRoYXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB0aHJvdWdoIGBzY2hlZHVsZUltbWVkaWF0ZWAuCl9JbW1lZGlhdGVDYWxsYmFjayBfcGVuZGluZ0ltbWVkaWF0ZUNhbGxiYWNrOwoKLy8vIFRoZSBjbG9zdXJlIHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgc2NoZWR1bGVJbW1lZGlhdGVDbG9zdXJlLCB3aGVuIHRoZSBWTQovLy8gaXMgcmVzcG9uc2libGUgZm9yIHRoZSBldmVudCBsb29wLgp2b2lkIF9pc29sYXRlU2NoZWR1bGVJbW1lZGlhdGUodm9pZCBjYWxsYmFjaygpKSB7CiAgYXNzZXJ0KChfcGVuZGluZ0ltbWVkaWF0ZUNhbGxiYWNrID09IG51bGwpIHx8CiAgICAgIChfcGVuZGluZ0ltbWVkaWF0ZUNhbGxiYWNrID09IGNhbGxiYWNrKSk7CiAgX3BlbmRpbmdJbW1lZGlhdGVDYWxsYmFjayA9IGNhbGxiYWNrOwp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKdm9pZCBfcnVuUGVuZGluZ0ltbWVkaWF0ZUNhbGxiYWNrKCkgewogIGlmIChfcGVuZGluZ0ltbWVkaWF0ZUNhbGxiYWNrICE9IG51bGwpIHsKICAgIHZhciBjYWxsYmFjayA9IF9wZW5kaW5nSW1tZWRpYXRlQ2FsbGJhY2s7CiAgICBfcGVuZGluZ0ltbWVkaWF0ZUNhbGxiYWNrID0gbnVsbDsKICAgIGNhbGxiYWNrKCk7CiAgfQp9CgpfSW1tZWRpYXRlQ2FsbGJhY2sgX3JlbW92ZVBlbmRpbmdJbW1lZGlhdGVDYWxsYmFjaygpIHsKICB2YXIgY2FsbGJhY2sgPSBfcGVuZGluZ0ltbWVkaWF0ZUNhbGxiYWNrOwogIF9wZW5kaW5nSW1tZWRpYXRlQ2FsbGJhY2sgPSBudWxsOwogIHJldHVybiBjYWxsYmFjazsKfQoKLy8vIFRoZSBlbWJlZGRlciBjYW4gZXhlY3V0ZSB0aGlzIGZ1bmN0aW9uIHRvIGdldCBob2xkIG9mCi8vLyBbX2lzb2xhdGVTY2hlZHVsZUltbWVkaWF0ZV0gYWJvdmUuCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQpGdW5jdGlvbiBfZ2V0SXNvbGF0ZVNjaGVkdWxlSW1tZWRpYXRlQ2xvc3VyZSgpIHsKICByZXR1cm4gX2lzb2xhdGVTY2hlZHVsZUltbWVkaWF0ZTsKfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfUmF3UmVjZWl2ZVBvcnRJbXBsIGltcGxlbWVudHMgUmF3UmVjZWl2ZVBvcnQgewogIGZhY3RvcnkgX1Jhd1JlY2VpdmVQb3J0SW1wbCgpIG5hdGl2ZSAiUmF3UmVjZWl2ZVBvcnRJbXBsX2ZhY3RvcnkiOwoKICBjbG9zZSgpIHsKICAgIC8vIENsb3NlIHRoZSBwb3J0IGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgaGFuZGxlciBtYXAuCiAgICBfaGFuZGxlck1hcC5yZW1vdmUodGhpcy5fY2xvc2VJbnRlcm5hbCgpKTsKICB9CgogIFNlbmRQb3J0IGdldCBzZW5kUG9ydCB7CiAgICByZXR1cm4gX2dldF9zZW5kcG9ydCgpOwogIH0KCiAgYm9vbCBvcGVyYXRvciA9PSh2YXIgb3RoZXIpIHsKICAgIHJldHVybiAob3RoZXIgaXMgX1Jhd1JlY2VpdmVQb3J0SW1wbCkgJiYKICAgICAgICAodGhpcy5fZ2V0X2lkKCkgPT0gb3RoZXIuX2dldF9pZCgpKTsKICB9CgogIGludCBnZXQgaGFzaENvZGUgewogICAgcmV0dXJuIHNlbmRQb3J0Lmhhc2hDb2RlOwogIH0KCiAgLyoqKiogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlscyAqKioqLwogIF9nZXRfaWQoKSBuYXRpdmUgIlJhd1JlY2VpdmVQb3J0SW1wbF9nZXRfaWQiOwogIF9nZXRfc2VuZHBvcnQoKSBuYXRpdmUgIlJhd1JlY2VpdmVQb3J0SW1wbF9nZXRfc2VuZHBvcnQiOwoKICAvLyBDYWxsZWQgZnJvbSB0aGUgVk0gdG8gcmV0cmlldmUgdGhlIGhhbmRsZXIgZm9yIGEgbWVzc2FnZS4KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICBzdGF0aWMgX2xvb2t1cEhhbmRsZXIoaW50IGlkKSB7CiAgICB2YXIgcmVzdWx0ID0gX2hhbmRsZXJNYXBbaWRdOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIENhbGxlZCBmcm9tIHRoZSBWTSB0byBkaXNwYXRjaCB0byB0aGUgaGFuZGxlci4KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICBzdGF0aWMgdm9pZCBfaGFuZGxlTWVzc2FnZShGdW5jdGlvbiBoYW5kbGVyLCB2YXIgbWVzc2FnZSkgewogICAgLy8gVE9ETyhmbG9pdHNjaCk6IHRoaXMgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgYW55IGV4Y2VwdGlvbiBhYm9ydHMgdGhlCiAgICAvLyBWTS4gT25jZSB3ZSBoYXZlIG5vbi1mYXRhbCBnbG9iYWwgZXhjZXB0aW9ucyB3ZSBuZWVkIHRvIGNhdGNoIGVycm9ycwogICAgLy8gc28gdGhhdCB3ZSBjYW4gcnVuIHRoZSBpbW1lZGlhdGUgY2FsbGJhY2tzLgogICAgaGFuZGxlcihtZXNzYWdlKTsKICAgIF9ydW5QZW5kaW5nSW1tZWRpYXRlQ2FsbGJhY2soKTsKICB9CgogIC8vIENhbGwgaW50byB0aGUgVk0gdG8gY2xvc2UgdGhlIFZNIG1haW50YWluZWQgbWFwcGluZ3MuCiAgX2Nsb3NlSW50ZXJuYWwoKSBuYXRpdmUgIlJhd1JlY2VpdmVQb3J0SW1wbF9jbG9zZUludGVybmFsIjsKCiAgdm9pZCBzZXQgaGFuZGxlcihGdW5jdGlvbiB2YWx1ZSkgewogICAgX2hhbmRsZXJNYXBbdGhpcy5fZ2V0X2lkKCldID0gdmFsdWU7CiAgfQoKICAvLyBUT0RPKGlwb3N2YSk6IElkZWFsbHkga2VlcCB0aGlzIG1hcCBpbiB0aGUgVk0uCiAgLy8gaWQgdG8gaGFuZGxlciBtYXBwaW5nLgogIHN0YXRpYyBfaW5pdEhhbmRsZXJNYXAoKSB7CiAgICAvLyBUT0RPKDE4NTExKTogV29ya2Fyb3VuZCBiYWQgQ2hlY2tTbWkgaG9pc3RpbmcuCiAgICB2YXIgdGVtcE1hcCA9IG5ldyBIYXNoTWFwKCk7CiAgICAvLyBDb2xsZWN0IGZlZWRiYWNrIHRoYXQgbm90IGFsbCBrZXlzIGFyZSBTbWlzLgogICAgdGVtcE1hcFsiLiJdID0gMTsKICAgIHRlbXBNYXBbIi4iXSA9IDI7CgogICAgcmV0dXJuIG5ldyBIYXNoTWFwKCk7CiAgfQoKICBzdGF0aWMgZmluYWwgTWFwIF9oYW5kbGVyTWFwID0gX2luaXRIYW5kbGVyTWFwKCk7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX1NlbmRQb3J0SW1wbCBpbXBsZW1lbnRzIFNlbmRQb3J0IHsKICAvKi0tLSBwdWJsaWMgaW50ZXJmYWNlIC0tLSovCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCiAgdm9pZCBzZW5kKHZhciBtZXNzYWdlKSB7CiAgICBfc2VuZEludGVybmFsKG1lc3NhZ2UpOwogIH0KCiAgYm9vbCBvcGVyYXRvciA9PSh2YXIgb3RoZXIpIHsKICAgIHJldHVybiAob3RoZXIgaXMgX1NlbmRQb3J0SW1wbCkgJiYgKHRoaXMuX2dldF9pZCgpID09IG90aGVyLl9nZXRfaWQoKSk7CiAgfQoKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIHJldHVybiBfZ2V0X2hhc2hjb2RlKCk7CiAgfQoKICAvKi0tLSBwcml2YXRlIGltcGxlbWVudGF0aW9uIC0tLSovCiAgX2dldF9pZCgpIG5hdGl2ZSAiU2VuZFBvcnRJbXBsX2dldF9pZCI7CiAgX2dldF9oYXNoY29kZSgpIG5hdGl2ZSAiU2VuZFBvcnRJbXBsX2dldF9oYXNoY29kZSI7CgogIC8vIEZvcndhcmQgdGhlIGltcGxlbWVudGF0aW9uIG9mIHNlbmRpbmcgbWVzc2FnZXMgdG8gdGhlIFZNLgogIHZvaWQgX3NlbmRJbnRlcm5hbCh2YXIgbWVzc2FnZSkgbmF0aXZlICJTZW5kUG9ydEltcGxfc2VuZEludGVybmFsXyI7Cn0KCnR5cGVkZWYgX051bGxhcnlGdW5jdGlvbigpOwp0eXBlZGVmIF9VbmFyeUZ1bmN0aW9uKE51bGwgYXJncyk7CnR5cGVkZWYgX0JpbmFyeUZ1bmN0aW9uKE51bGwgYXJncywgTnVsbCBtZXNzYWdlKTsKCi8qKgogKiBUYWtlcyB0aGUgcmVhbCBlbnRyeSBwb2ludCBhcyBhcmd1bWVudCBhbmQgaW52b2tlcyBpdCB3aXRoIHRoZQogKiBpbml0aWFsIG1lc3NhZ2UuICBEZWZlcnMgZXhlY3V0aW9uIG9mIHRoZSBlbnRyeSBwb2ludCB1bnRpbCB0aGUKICogaXNvbGF0ZSBpcyBpbiB0aGUgbWVzc2FnZSBsb29wLgogKi8KQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCnZvaWQgX3N0YXJ0TWFpbklzb2xhdGUoRnVuY3Rpb24gZW50cnlQb2ludCwgTGlzdDxTdHJpbmc+IGFyZ3MpIHsKICBfc3RhcnRJc29sYXRlKAogICAgICBudWxsLCAvLyBubyBwYXJlbnQgcG9ydAogICAgICBlbnRyeVBvaW50LAogICAgICBhcmdzLAogICAgICBudWxsLCAvLyBubyBtZXNzYWdlCiAgICAgIHRydWUsIC8vIGlzU3Bhd25VcmkKICAgICAgbnVsbCwgLy8gbm8gY29udHJvbCBwb3J0CiAgICAgIG51bGwpOyAvLyBubyBjYXBhYmlsaXRpZXMKfQoKLyoqCiAqIFJldHVybnMgdGhlIF9zdGFydE1haW5Jc29sYXRlIGZ1bmN0aW9uLiBUaGlzIGNsb3N1cml6YXRpb24gYWxsb3dzIGVtYmVkZGVycwogKiB0byBzZXR1cCB0cmFtcG9saW5lcyB0byB0aGUgbWFpbiBmdW5jdGlvbi4gVGhpcyB3b3JrYXJvdW5kIGNhbiBiZSByZW1vdmVkCiAqIG9uY2Ugc3VwcG9ydCBmb3IgQHByYWdtYSgidm06ZW50cnlfcG9pbnQiLCAiZ2V0IikgYXMgZG9jdW1lbnRlZCBpbgogKiBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMzU3MjAgbGFuZHMuCiAqLwpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKRnVuY3Rpb24gX2dldFN0YXJ0TWFpbklzb2xhdGVGdW5jdGlvbigpIHsKICByZXR1cm4gX3N0YXJ0TWFpbklzb2xhdGU7Cn0KCi8qKgogKiBUYWtlcyB0aGUgcmVhbCBlbnRyeSBwb2ludCBhcyBhcmd1bWVudCBhbmQgaW52b2tlcyBpdCB3aXRoIHRoZSBpbml0aWFsCiAqIG1lc3NhZ2UuCiAqLwpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKdm9pZCBfc3RhcnRJc29sYXRlKAogICAgU2VuZFBvcnQgcGFyZW50UG9ydCwKICAgIEZ1bmN0aW9uIGVudHJ5UG9pbnQsCiAgICBMaXN0PFN0cmluZz4gYXJncywKICAgIHZhciBtZXNzYWdlLAogICAgYm9vbCBpc1NwYXduVXJpLAogICAgUmF3UmVjZWl2ZVBvcnQgY29udHJvbFBvcnQsCiAgICBMaXN0IGNhcGFiaWxpdGllcykgewogIC8vIFRoZSBjb250cm9sIHBvcnQgKGFrYSB0aGUgbWFpbiBpc29sYXRlIHBvcnQpIGRvZXMgbm90IGhhbmRsZSBhbnkgbWVzc2FnZXMuCiAgaWYgKGNvbnRyb2xQb3J0ICE9IG51bGwpIHsKICAgIGNvbnRyb2xQb3J0LmhhbmRsZXIgPSAoXykge307IC8vIE5vYm9keSBob21lIG9uIHRoZSBjb250cm9sIHBvcnQuCiAgfQoKICBpZiAocGFyZW50UG9ydCAhPSBudWxsKSB7CiAgICAvLyBCdWlsZCBhIG1lc3NhZ2UgdG8gb3VyIHBhcmVudCBpc29sYXRlIHByb3ZpZGluZyBhY2Nlc3MgdG8gdGhlCiAgICAvLyBjdXJyZW50IGlzb2xhdGUncyBjb250cm9sIHBvcnQgYW5kIGNhcGFiaWxpdGllcy4KICAgIC8vCiAgICAvLyBUT0RPKGZsb2l0c2NoKTogU2VuZCBhbiBlcnJvciBtZXNzYWdlIGlmIHdlIGNhbid0IGZpbmQgdGhlIGVudHJ5IHBvaW50LgogICAgdmFyIHJlYWR5TWVzc2FnZSA9IG5ldyBMaXN0KDIpOwogICAgcmVhZHlNZXNzYWdlWzBdID0gY29udHJvbFBvcnQuc2VuZFBvcnQ7CiAgICByZWFkeU1lc3NhZ2VbMV0gPSBjYXBhYmlsaXRpZXM7CgogICAgLy8gT3V0IG9mIGFuIGV4Y2VzcyBvZiBwYXJhbm9pYSB3ZSBjbGVhciB0aGUgY2FwYWJpbGl0aWVzIGZyb20gdGhlCiAgICAvLyBzdGFjay4gIE5vdCByZWFsbHkgbmVjZXNzYXJ5LgogICAgY2FwYWJpbGl0aWVzID0gbnVsbDsKICAgIHBhcmVudFBvcnQuc2VuZChyZWFkeU1lc3NhZ2UpOwogIH0KICBhc3NlcnQoY2FwYWJpbGl0aWVzID09IG51bGwpOwoKICAvLyBEZWxheSBhbGwgdXNlciBjb2RlIGhhbmRsaW5nIHRvIHRoZSBuZXh0IHJ1biBvZiB0aGUgbWVzc2FnZSBsb29wLiBUaGlzCiAgLy8gYWxsb3dzIHVzIHRvIGludGVyY2VwdCBjZXJ0YWluIGNvbmRpdGlvbnMgaW4gdGhlIGV2ZW50IGRpc3BhdGNoLCBzdWNoIGFzCiAgLy8gc3RhcnRpbmcgaW4gcGF1c2VkIHN0YXRlLgogIFJhd1JlY2VpdmVQb3J0IHBvcnQgPSBuZXcgUmF3UmVjZWl2ZVBvcnQoKTsKICBwb3J0LmhhbmRsZXIgPSAoXykgewogICAgcG9ydC5jbG9zZSgpOwoKICAgIGlmIChpc1NwYXduVXJpKSB7CiAgICAgIGlmIChlbnRyeVBvaW50IGlzIF9CaW5hcnlGdW5jdGlvbikgewogICAgICAgIChlbnRyeVBvaW50IGFzIGR5bmFtaWMpKGFyZ3MsIG1lc3NhZ2UpOwogICAgICB9IGVsc2UgaWYgKGVudHJ5UG9pbnQgaXMgX1VuYXJ5RnVuY3Rpb24pIHsKICAgICAgICAoZW50cnlQb2ludCBhcyBkeW5hbWljKShhcmdzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlbnRyeVBvaW50KCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGVudHJ5UG9pbnQobWVzc2FnZSk7CiAgICB9CiAgfTsKICAvLyBNYWtlIHN1cmUgdGhlIG1lc3NhZ2UgaGFuZGxlciBpcyB0cmlnZ2VyZWQuCiAgcG9ydC5zZW5kUG9ydC5zZW5kKG51bGwpOwp9CgpAcGF0Y2gKY2xhc3MgSXNvbGF0ZSB7CiAgc3RhdGljIGZpbmFsIF9jdXJyZW50SXNvbGF0ZSA9IF9nZXRDdXJyZW50SXNvbGF0ZSgpOwogIHN0YXRpYyBmaW5hbCBfcm9vdFVyaSA9IF9nZXRDdXJyZW50Um9vdFVyaSgpOwoKICBAcGF0Y2gKICBzdGF0aWMgSXNvbGF0ZSBnZXQgY3VycmVudCA9PiBfY3VycmVudElzb2xhdGU7CgogIEBwYXRjaAogIFN0cmluZyBnZXQgZGVidWdOYW1lID0+IF9nZXREZWJ1Z05hbWUoY29udHJvbFBvcnQpOwoKICBAcGF0Y2gKICBzdGF0aWMgRnV0dXJlPFVyaT4gZ2V0IHBhY2thZ2VSb290IHsKICAgIHZhciBob29rID0gVk1MaWJyYXJ5SG9va3MucGFja2FnZVJvb3RVcmlGdXR1cmU7CiAgICBpZiAoaG9vayA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJJc29sYXRlLnBhY2thZ2VSb290Iik7CiAgICB9CiAgICByZXR1cm4gaG9vaygpOwogIH0KCiAgQHBhdGNoCiAgc3RhdGljIEZ1dHVyZTxVcmk+IGdldCBwYWNrYWdlQ29uZmlnIHsKICAgIHZhciBob29rID0gVk1MaWJyYXJ5SG9va3MucGFja2FnZUNvbmZpZ1VyaUZ1dHVyZTsKICAgIGlmIChob29rID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIklzb2xhdGUucGFja2FnZUNvbmZpZyIpOwogICAgfQogICAgcmV0dXJuIGhvb2soKTsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBGdXR1cmU8VXJpPiByZXNvbHZlUGFja2FnZVVyaShVcmkgcGFja2FnZVVyaSkgewogICAgdmFyIGhvb2sgPSBWTUxpYnJhcnlIb29rcy5yZXNvbHZlUGFja2FnZVVyaUZ1dHVyZTsKICAgIGlmIChob29rID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIklzb2xhdGUucmVzb2x2ZVBhY2thZ2VVcmkiKTsKICAgIH0KICAgIHJldHVybiBob29rKHBhY2thZ2VVcmkpOwogIH0KCiAgc3RhdGljIGJvb2wgX3BhY2thZ2VTdXBwb3J0ZWQoKSA9PgogICAgICAoVk1MaWJyYXJ5SG9va3MucGFja2FnZVJvb3RVcmlGdXR1cmUgIT0gbnVsbCkgJiYKICAgICAgKFZNTGlicmFyeUhvb2tzLnBhY2thZ2VDb25maWdVcmlGdXR1cmUgIT0gbnVsbCkgJiYKICAgICAgKFZNTGlicmFyeUhvb2tzLnJlc29sdmVQYWNrYWdlVXJpRnV0dXJlICE9IG51bGwpOwoKICBAcGF0Y2gKICBzdGF0aWMgRnV0dXJlPElzb2xhdGU+IHNwYXduPFQ+KHZvaWQgZW50cnlQb2ludChUIG1lc3NhZ2UpLCBUIG1lc3NhZ2UsCiAgICAgIHtib29sIHBhdXNlZDogZmFsc2UsCiAgICAgIGJvb2wgZXJyb3JzQXJlRmF0YWwsCiAgICAgIFNlbmRQb3J0IG9uRXhpdCwKICAgICAgU2VuZFBvcnQgb25FcnJvciwKICAgICAgU3RyaW5nIGRlYnVnTmFtZX0pIGFzeW5jIHsKICAgIC8vIGBwYXVzZWRgIGlzbid0IGhhbmRsZWQgeWV0LgogICAgUmF3UmVjZWl2ZVBvcnQgcmVhZHlQb3J0OwogICAgdHJ5IHsKICAgICAgLy8gQ2hlY2sgZm9yIHRoZSB0eXBlIG9mIGBlbnRyeVBvaW50YCBvbiB0aGUgc3Bhd25pbmcgaXNvbGF0ZSB0byBtYWtlCiAgICAgIC8vIGVycm9yLWhhbmRsaW5nIGVhc2llci4KICAgICAgaWYgKGVudHJ5UG9pbnQgaXMhIF9VbmFyeUZ1bmN0aW9uKSB7CiAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoZW50cnlQb2ludCk7CiAgICAgIH0KICAgICAgLy8gVGhlIFZNIHdpbGwgaW52b2tlIFtfc3RhcnRJc29sYXRlXSB3aXRoIGVudHJ5UG9pbnQgYXMgYXJndW1lbnQuCiAgICAgIHJlYWR5UG9ydCA9IG5ldyBSYXdSZWNlaXZlUG9ydCgpOwoKICAgICAgLy8gV2UgZG8gbm90IGluaGVyaXQgdGhlIHBhY2thZ2UgY29uZmlnIHNldHRpbmdzIGZyb20gdGhlIHBhcmVudCBpc29sYXRlLAogICAgICAvLyBpbnN0ZWFkIHdlIHVzZSB0aGUgdmFsdWVzIHRoYXQgd2VyZSBzZXQgb24gdGhlIGNvbW1hbmQgbGluZS4KICAgICAgdmFyIHBhY2thZ2VDb25maWcgPSBWTUxpYnJhcnlIb29rcy5wYWNrYWdlQ29uZmlnU3RyaW5nOwogICAgICB2YXIgc2NyaXB0ID0gVk1MaWJyYXJ5SG9va3MucGxhdGZvcm1TY3JpcHQ7CiAgICAgIGlmIChzY3JpcHQgPT0gbnVsbCkgewogICAgICAgIC8vIFdlIGRvIG5vdCBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBzdXBwb3J0IHNwYXduaW5nIHRoZSBuZXcKICAgICAgICAvLyBpc29sYXRlLgogICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJJc29sYXRlLnNwYXduIik7CiAgICAgIH0KICAgICAgaWYgKHNjcmlwdC5zY2hlbWUgPT0gInBhY2thZ2UiKSB7CiAgICAgICAgc2NyaXB0ID0gYXdhaXQgSXNvbGF0ZS5yZXNvbHZlUGFja2FnZVVyaShzY3JpcHQpOwogICAgICB9CgogICAgICBfc3Bhd25GdW5jdGlvbigKICAgICAgICAgIHJlYWR5UG9ydC5zZW5kUG9ydCwKICAgICAgICAgIHNjcmlwdC50b1N0cmluZygpLAogICAgICAgICAgZW50cnlQb2ludCwKICAgICAgICAgIG1lc3NhZ2UsCiAgICAgICAgICBwYXVzZWQsCiAgICAgICAgICBlcnJvcnNBcmVGYXRhbCwKICAgICAgICAgIG9uRXhpdCwKICAgICAgICAgIG9uRXJyb3IsCiAgICAgICAgICBudWxsLAogICAgICAgICAgcGFja2FnZUNvbmZpZywKICAgICAgICAgIGRlYnVnTmFtZSk7CiAgICAgIHJldHVybiBhd2FpdCBfc3Bhd25Db21tb24ocmVhZHlQb3J0KTsKICAgIH0gY2F0Y2ggKGUsIHN0KSB7CiAgICAgIGlmIChyZWFkeVBvcnQgIT0gbnVsbCkgewogICAgICAgIHJlYWR5UG9ydC5jbG9zZSgpOwogICAgICB9CiAgICAgIHJldHVybiBhd2FpdCBuZXcgRnV0dXJlPElzb2xhdGU+LmVycm9yKGUsIHN0KTsKICAgIH0KICB9CgogIEBwYXRjaAogIHN0YXRpYyBGdXR1cmU8SXNvbGF0ZT4gc3Bhd25VcmkoVXJpIHVyaSwgTGlzdDxTdHJpbmc+IGFyZ3MsIHZhciBtZXNzYWdlLAogICAgICB7Ym9vbCBwYXVzZWQ6IGZhbHNlLAogICAgICBTZW5kUG9ydCBvbkV4aXQsCiAgICAgIFNlbmRQb3J0IG9uRXJyb3IsCiAgICAgIGJvb2wgZXJyb3JzQXJlRmF0YWwsCiAgICAgIGJvb2wgY2hlY2tlZCwKICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudCwKICAgICAgVXJpIHBhY2thZ2VSb290LAogICAgICBVcmkgcGFja2FnZUNvbmZpZywKICAgICAgYm9vbCBhdXRvbWF0aWNQYWNrYWdlUmVzb2x1dGlvbjogZmFsc2UsCiAgICAgIFN0cmluZyBkZWJ1Z05hbWV9KSBhc3luYyB7CiAgICBSYXdSZWNlaXZlUG9ydCByZWFkeVBvcnQ7CiAgICBpZiAoZW52aXJvbm1lbnQgIT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCJlbnZpcm9ubWVudCIpOwogICAgfQoKICAgIC8vIFZlcmlmeSB0aGF0IG5vIG11dHVhbGx5IGV4Y2x1c2l2ZSBhcmd1bWVudHMgaGF2ZSBiZWVuIHBhc3NlZC4KICAgIGlmIChhdXRvbWF0aWNQYWNrYWdlUmVzb2x1dGlvbikgewogICAgICBpZiAocGFja2FnZVJvb3QgIT0gbnVsbCkgewogICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJDYW5ub3Qgc2ltdWx0YW5lb3VzbHkgcmVxdWVzdCAiCiAgICAgICAgICAgICJhdXRvbWF0aWNQYWNrYWdlUmVzb2x1dGlvbiBhbmQgc3BlY2lmeSBhIgogICAgICAgICAgICAicGFja2FnZVJvb3QuIik7CiAgICAgIH0KICAgICAgaWYgKHBhY2thZ2VDb25maWcgIT0gbnVsbCkgewogICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJDYW5ub3Qgc2ltdWx0YW5lb3VzbHkgcmVxdWVzdCAiCiAgICAgICAgICAgICJhdXRvbWF0aWNQYWNrYWdlUmVzb2x1dGlvbiBhbmQgc3BlY2lmeSBhIgogICAgICAgICAgICAicGFja2FnZUNvbmZpZy4iKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKChwYWNrYWdlUm9vdCAhPSBudWxsKSAmJiAocGFja2FnZUNvbmZpZyAhPSBudWxsKSkgewogICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJDYW5ub3Qgc2ltdWx0YW5lb3VzbHkgc3BlY2lmeSBhICIKICAgICAgICAgICAgInBhY2thZ2VSb290IGFuZCBhIHBhY2thZ2VDb25maWcuIik7CiAgICAgIH0KICAgIH0KICAgIHRyeSB7CiAgICAgIC8vIFJlc29sdmUgdGhlIHVyaSBhZ2FpbnN0IHRoZSBjdXJyZW50IGlzb2xhdGUncyByb290IFVyaSBmaXJzdC4KICAgICAgdmFyIHNwYXduZWRVcmkgPSBfcm9vdFVyaS5yZXNvbHZlVXJpKHVyaSk7CgogICAgICAvLyBJbmhlcml0IHRoaXMgaXNvbGF0ZSdzIHBhY2thZ2UgcmVzb2x1dGlvbiBzZXR1cCBpZiBub3Qgb3ZlcnJpZGRlbi4KICAgICAgaWYgKCFhdXRvbWF0aWNQYWNrYWdlUmVzb2x1dGlvbiAmJgogICAgICAgICAgKHBhY2thZ2VSb290ID09IG51bGwpICYmCiAgICAgICAgICAocGFja2FnZUNvbmZpZyA9PSBudWxsKSkgewogICAgICAgIGlmIChJc29sYXRlLl9wYWNrYWdlU3VwcG9ydGVkKCkpIHsKICAgICAgICAgIHBhY2thZ2VSb290ID0gYXdhaXQgSXNvbGF0ZS5wYWNrYWdlUm9vdDsKICAgICAgICAgIHBhY2thZ2VDb25maWcgPSBhd2FpdCBJc29sYXRlLnBhY2thZ2VDb25maWc7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBFbnN1cmUgdG8gcmVzb2x2ZSBwYWNrYWdlOiBVUklzIGJlaW5nIGhhbmRlZCBpbiBhcyBwYXJhbWV0ZXJzLgogICAgICBpZiAocGFja2FnZVJvb3QgIT0gbnVsbCkgewogICAgICAgIC8vIGBwYWNrYWdlcy9gIGRpcmVjdG9yeSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiBGb3JjZSBpdCBudWxsLgogICAgICAgIC8vIFRPRE8obWZhaXJodXJzdCkgU2hvdWxkIHRoaXMgdGhyb3cgYW4gZXhjZXB0aW9uPwogICAgICAgIHBhY2thZ2VSb290ID0gbnVsbDsKICAgICAgfSBlbHNlIGlmIChwYWNrYWdlQ29uZmlnICE9IG51bGwpIHsKICAgICAgICAvLyBBdm9pZCBjYWxsaW5nIHJlc29sdmVQYWNrYWdlVXJpIGlmIG5vdCBzdHJpY3RseSBuZWNlc3NhcnkgaW4gY2FzZQogICAgICAgIC8vIHRoZSBBUEkgaXMgbm90IHN1cHBvcnRlZC4KICAgICAgICBpZiAocGFja2FnZUNvbmZpZy5zY2hlbWUgPT0gInBhY2thZ2UiKSB7CiAgICAgICAgICBwYWNrYWdlQ29uZmlnID0gYXdhaXQgSXNvbGF0ZS5yZXNvbHZlUGFja2FnZVVyaShwYWNrYWdlQ29uZmlnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIFRoZSBWTSB3aWxsIGludm9rZSBbX3N0YXJ0SXNvbGF0ZV0gYW5kIG5vdCBgbWFpbmAuCiAgICAgIHJlYWR5UG9ydCA9IG5ldyBSYXdSZWNlaXZlUG9ydCgpOwogICAgICB2YXIgcGFja2FnZVJvb3RTdHJpbmcgPSBwYWNrYWdlUm9vdD8udG9TdHJpbmcoKTsKICAgICAgdmFyIHBhY2thZ2VDb25maWdTdHJpbmcgPSBwYWNrYWdlQ29uZmlnPy50b1N0cmluZygpOwoKICAgICAgX3NwYXduVXJpKAogICAgICAgICAgcmVhZHlQb3J0LnNlbmRQb3J0LAogICAgICAgICAgc3Bhd25lZFVyaS50b1N0cmluZygpLAogICAgICAgICAgYXJncywKICAgICAgICAgIG1lc3NhZ2UsCiAgICAgICAgICBwYXVzZWQsCiAgICAgICAgICBvbkV4aXQsCiAgICAgICAgICBvbkVycm9yLAogICAgICAgICAgZXJyb3JzQXJlRmF0YWwsCiAgICAgICAgICBjaGVja2VkLAogICAgICAgICAgbnVsbCwKICAgICAgICAgIC8qIGVudmlyb25tZW50ICovCiAgICAgICAgICBwYWNrYWdlUm9vdFN0cmluZywKICAgICAgICAgIHBhY2thZ2VDb25maWdTdHJpbmcsCiAgICAgICAgICBkZWJ1Z05hbWUpOwogICAgICByZXR1cm4gYXdhaXQgX3NwYXduQ29tbW9uKHJlYWR5UG9ydCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGlmIChyZWFkeVBvcnQgIT0gbnVsbCkgewogICAgICAgIHJlYWR5UG9ydC5jbG9zZSgpOwogICAgICB9CiAgICAgIHJldGhyb3c7CiAgICB9CiAgfQoKICBzdGF0aWMgRnV0dXJlPElzb2xhdGU+IF9zcGF3bkNvbW1vbihSYXdSZWNlaXZlUG9ydCByZWFkeVBvcnQpIHsKICAgIENvbXBsZXRlciBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPElzb2xhdGU+LnN5bmMoKTsKICAgIHJlYWR5UG9ydC5oYW5kbGVyID0gKHJlYWR5TWVzc2FnZSkgewogICAgICByZWFkeVBvcnQuY2xvc2UoKTsKICAgICAgaWYgKHJlYWR5TWVzc2FnZSBpcyBMaXN0ICYmIHJlYWR5TWVzc2FnZS5sZW5ndGggPT0gMikgewogICAgICAgIFNlbmRQb3J0IGNvbnRyb2xQb3J0ID0gcmVhZHlNZXNzYWdlWzBdOwogICAgICAgIExpc3QgY2FwYWJpbGl0aWVzID0gcmVhZHlNZXNzYWdlWzFdOwogICAgICAgIGNvbXBsZXRlci5jb21wbGV0ZShuZXcgSXNvbGF0ZShjb250cm9sUG9ydCwKICAgICAgICAgICAgcGF1c2VDYXBhYmlsaXR5OiBjYXBhYmlsaXRpZXNbMF0sCiAgICAgICAgICAgIHRlcm1pbmF0ZUNhcGFiaWxpdHk6IGNhcGFiaWxpdGllc1sxXSkpOwogICAgICB9IGVsc2UgaWYgKHJlYWR5TWVzc2FnZSBpcyBTdHJpbmcpIHsKICAgICAgICAvLyBXZSBlbmNvdW50ZXJlZCBhbiBlcnJvciB3aGlsZSBzdGFydGluZyB0aGUgbmV3IGlzb2xhdGUuCiAgICAgICAgY29tcGxldGVyLmNvbXBsZXRlRXJyb3IobmV3IElzb2xhdGVTcGF3bkV4Y2VwdGlvbigKICAgICAgICAgICAgJ1VuYWJsZSB0byBzcGF3biBpc29sYXRlOiAke3JlYWR5TWVzc2FnZX0nKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuLgogICAgICAgIGNvbXBsZXRlci5jb21wbGV0ZUVycm9yKG5ldyBJc29sYXRlU3Bhd25FeGNlcHRpb24oCiAgICAgICAgICAgICJJbnRlcm5hbCBlcnJvcjogdW5leHBlY3RlZCBmb3JtYXQgZm9yIHJlYWR5IG1lc3NhZ2U6ICIKICAgICAgICAgICAgIicke3JlYWR5TWVzc2FnZX0nIikpOwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIGNvbXBsZXRlci5mdXR1cmU7CiAgfQoKICAvLyBUT0RPKGlwb3N2YSk6IENsZWFudXAgdG8gaGF2ZSBvbmx5IG9uZSBkZWZpbml0aW9uLgogIC8vIFRoZXNlIHZhbHVlcyBuZWVkIHRvIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBjbGFzcyBJc29sYXRlTWVzc2FnZUhhbmRsZXIKICAvLyBpbiB2bS9pc29sYXRlLmNjLgogIHN0YXRpYyBjb25zdCBfUEFVU0UgPSAxOwogIHN0YXRpYyBjb25zdCBfUkVTVU1FID0gMjsKICBzdGF0aWMgY29uc3QgX1BJTkcgPSAzOwogIHN0YXRpYyBjb25zdCBfS0lMTCA9IDQ7CiAgc3RhdGljIGNvbnN0IF9BRERfRVhJVCA9IDU7CiAgc3RhdGljIGNvbnN0IF9ERUxfRVhJVCA9IDY7CiAgc3RhdGljIGNvbnN0IF9BRERfRVJST1IgPSA3OwogIHN0YXRpYyBjb25zdCBfREVMX0VSUk9SID0gODsKICBzdGF0aWMgY29uc3QgX0VSUk9SX0ZBVEFMID0gOTsKCiAgc3RhdGljIHZvaWQgX3NwYXduRnVuY3Rpb24oCiAgICAgIFNlbmRQb3J0IHJlYWR5UG9ydCwKICAgICAgU3RyaW5nIHVyaSwKICAgICAgRnVuY3Rpb24gdG9wTGV2ZWxGdW5jdGlvbiwKICAgICAgdmFyIG1lc3NhZ2UsCiAgICAgIGJvb2wgcGF1c2VkLAogICAgICBib29sIGVycm9yc0FyZUZhdGFsLAogICAgICBTZW5kUG9ydCBvbkV4aXQsCiAgICAgIFNlbmRQb3J0IG9uRXJyb3IsCiAgICAgIFN0cmluZyBwYWNrYWdlUm9vdCwKICAgICAgU3RyaW5nIHBhY2thZ2VDb25maWcsCiAgICAgIFN0cmluZyBkZWJ1Z05hbWUpIG5hdGl2ZSAiSXNvbGF0ZV9zcGF3bkZ1bmN0aW9uIjsKCiAgc3RhdGljIHZvaWQgX3NwYXduVXJpKAogICAgICBTZW5kUG9ydCByZWFkeVBvcnQsCiAgICAgIFN0cmluZyB1cmksCiAgICAgIExpc3Q8U3RyaW5nPiBhcmdzLAogICAgICB2YXIgbWVzc2FnZSwKICAgICAgYm9vbCBwYXVzZWQsCiAgICAgIFNlbmRQb3J0IG9uRXhpdCwKICAgICAgU2VuZFBvcnQgb25FcnJvciwKICAgICAgYm9vbCBlcnJvcnNBcmVGYXRhbCwKICAgICAgYm9vbCBjaGVja2VkLAogICAgICBMaXN0IGVudmlyb25tZW50LAogICAgICBTdHJpbmcgcGFja2FnZVJvb3QsCiAgICAgIFN0cmluZyBwYWNrYWdlQ29uZmlnLAogICAgICBTdHJpbmcgZGVidWdOYW1lKSBuYXRpdmUgIklzb2xhdGVfc3Bhd25VcmkiOwoKICBzdGF0aWMgdm9pZCBfc2VuZE9PQihwb3J0LCBtc2cpIG5hdGl2ZSAiSXNvbGF0ZV9zZW5kT09CIjsKCiAgc3RhdGljIFN0cmluZyBfZ2V0RGVidWdOYW1lKFNlbmRQb3J0IGNvbnRyb2xQb3J0KQogICAgICBuYXRpdmUgIklzb2xhdGVfZ2V0RGVidWdOYW1lIjsKCiAgQHBhdGNoCiAgdm9pZCBfcGF1c2UoQ2FwYWJpbGl0eSByZXN1bWVDYXBhYmlsaXR5KSB7CiAgICB2YXIgbXNnID0gbmV3IExpc3QoNCkKICAgICAgLi5bMF0gPSAwIC8vIE1ha2Ugcm9vbSBmb3IgT09CIG1lc3NhZ2UgdHlwZS4KICAgICAgLi5bMV0gPSBfUEFVU0UKICAgICAgLi5bMl0gPSBwYXVzZUNhcGFiaWxpdHkKICAgICAgLi5bM10gPSByZXN1bWVDYXBhYmlsaXR5OwogICAgX3NlbmRPT0IoY29udHJvbFBvcnQsIG1zZyk7CiAgfQoKICBAcGF0Y2gKICB2b2lkIHJlc3VtZShDYXBhYmlsaXR5IHJlc3VtZUNhcGFiaWxpdHkpIHsKICAgIHZhciBtc2cgPSBuZXcgTGlzdCg0KQogICAgICAuLlswXSA9IDAgLy8gTWFrZSByb29tIGZvciBPT0IgbWVzc2FnZSB0eXBlLgogICAgICAuLlsxXSA9IF9SRVNVTUUKICAgICAgLi5bMl0gPSBwYXVzZUNhcGFiaWxpdHkKICAgICAgLi5bM10gPSByZXN1bWVDYXBhYmlsaXR5OwogICAgX3NlbmRPT0IoY29udHJvbFBvcnQsIG1zZyk7CiAgfQoKICBAcGF0Y2gKICB2b2lkIGFkZE9uRXhpdExpc3RlbmVyKFNlbmRQb3J0IHJlc3BvbnNlUG9ydCwge09iamVjdCByZXNwb25zZX0pIHsKICAgIHZhciBtc2cgPSBuZXcgTGlzdCg0KQogICAgICAuLlswXSA9IDAgLy8gTWFrZSByb29tIGZvciBPT0IgbWVzc2FnZSB0eXBlLgogICAgICAuLlsxXSA9IF9BRERfRVhJVAogICAgICAuLlsyXSA9IHJlc3BvbnNlUG9ydAogICAgICAuLlszXSA9IHJlc3BvbnNlOwogICAgX3NlbmRPT0IoY29udHJvbFBvcnQsIG1zZyk7CiAgfQoKICBAcGF0Y2gKICB2b2lkIHJlbW92ZU9uRXhpdExpc3RlbmVyKFNlbmRQb3J0IHJlc3BvbnNlUG9ydCkgewogICAgdmFyIG1zZyA9IG5ldyBMaXN0KDMpCiAgICAgIC4uWzBdID0gMCAvLyBNYWtlIHJvb20gZm9yIE9PQiBtZXNzYWdlIHR5cGUuCiAgICAgIC4uWzFdID0gX0RFTF9FWElUCiAgICAgIC4uWzJdID0gcmVzcG9uc2VQb3J0OwogICAgX3NlbmRPT0IoY29udHJvbFBvcnQsIG1zZyk7CiAgfQoKICBAcGF0Y2gKICB2b2lkIHNldEVycm9yc0ZhdGFsKGJvb2wgZXJyb3JzQXJlRmF0YWwpIHsKICAgIHZhciBtc2cgPSBuZXcgTGlzdCg0KQogICAgICAuLlswXSA9IDAgLy8gTWFrZSByb29tIGZvciBPT0IgbWVzc2FnZSB0eXBlLgogICAgICAuLlsxXSA9IF9FUlJPUl9GQVRBTAogICAgICAuLlsyXSA9IHRlcm1pbmF0ZUNhcGFiaWxpdHkKICAgICAgLi5bM10gPSBlcnJvcnNBcmVGYXRhbDsKICAgIF9zZW5kT09CKGNvbnRyb2xQb3J0LCBtc2cpOwogIH0KCiAgQHBhdGNoCiAgdm9pZCBraWxsKHtpbnQgcHJpb3JpdHk6IGJlZm9yZU5leHRFdmVudH0pIHsKICAgIHZhciBtc2cgPSBuZXcgTGlzdCg0KQogICAgICAuLlswXSA9IDAgLy8gTWFrZSByb29tIGZvciBPT0IgbWVzc2FnZSB0eXBlLgogICAgICAuLlsxXSA9IF9LSUxMCiAgICAgIC4uWzJdID0gdGVybWluYXRlQ2FwYWJpbGl0eQogICAgICAuLlszXSA9IHByaW9yaXR5OwogICAgX3NlbmRPT0IoY29udHJvbFBvcnQsIG1zZyk7CiAgfQoKICBAcGF0Y2gKICB2b2lkIHBpbmcoU2VuZFBvcnQgcmVzcG9uc2VQb3J0LCB7T2JqZWN0IHJlc3BvbnNlLCBpbnQgcHJpb3JpdHk6IGltbWVkaWF0ZX0pIHsKICAgIHZhciBtc2cgPSBuZXcgTGlzdCg1KQogICAgICAuLlswXSA9IDAgLy8gTWFrZSByb29tIGZvciBPT00gbWVzc2FnZSB0eXBlLgogICAgICAuLlsxXSA9IF9QSU5HCiAgICAgIC4uWzJdID0gcmVzcG9uc2VQb3J0CiAgICAgIC4uWzNdID0gcHJpb3JpdHkKICAgICAgLi5bNF0gPSByZXNwb25zZTsKICAgIF9zZW5kT09CKGNvbnRyb2xQb3J0LCBtc2cpOwogIH0KCiAgQHBhdGNoCiAgdm9pZCBhZGRFcnJvckxpc3RlbmVyKFNlbmRQb3J0IHBvcnQpIHsKICAgIHZhciBtc2cgPSBuZXcgTGlzdCgzKQogICAgICAuLlswXSA9IDAgLy8gTWFrZSByb29tIGZvciBPT0IgbWVzc2FnZSB0eXBlLgogICAgICAuLlsxXSA9IF9BRERfRVJST1IKICAgICAgLi5bMl0gPSBwb3J0OwogICAgX3NlbmRPT0IoY29udHJvbFBvcnQsIG1zZyk7CiAgfQoKICBAcGF0Y2gKICB2b2lkIHJlbW92ZUVycm9yTGlzdGVuZXIoU2VuZFBvcnQgcG9ydCkgewogICAgdmFyIG1zZyA9IG5ldyBMaXN0KDMpCiAgICAgIC4uWzBdID0gMCAvLyBNYWtlIHJvb20gZm9yIE9PQiBtZXNzYWdlIHR5cGUuCiAgICAgIC4uWzFdID0gX0RFTF9FUlJPUgogICAgICAuLlsyXSA9IHBvcnQ7CiAgICBfc2VuZE9PQihjb250cm9sUG9ydCwgbXNnKTsKICB9CgogIHN0YXRpYyBJc29sYXRlIF9nZXRDdXJyZW50SXNvbGF0ZSgpIHsKICAgIExpc3QgcG9ydEFuZENhcGFiaWxpdGllcyA9IF9nZXRQb3J0QW5kQ2FwYWJpbGl0aWVzT2ZDdXJyZW50SXNvbGF0ZSgpOwogICAgcmV0dXJuIG5ldyBJc29sYXRlKHBvcnRBbmRDYXBhYmlsaXRpZXNbMF0sCiAgICAgICAgcGF1c2VDYXBhYmlsaXR5OiBwb3J0QW5kQ2FwYWJpbGl0aWVzWzFdLAogICAgICAgIHRlcm1pbmF0ZUNhcGFiaWxpdHk6IHBvcnRBbmRDYXBhYmlsaXRpZXNbMl0pOwogIH0KCiAgc3RhdGljIExpc3QgX2dldFBvcnRBbmRDYXBhYmlsaXRpZXNPZkN1cnJlbnRJc29sYXRlKCkKICAgICAgbmF0aXZlICJJc29sYXRlX2dldFBvcnRBbmRDYXBhYmlsaXRpZXNPZkN1cnJlbnRJc29sYXRlIjsKCiAgc3RhdGljIFVyaSBfZ2V0Q3VycmVudFJvb3RVcmkoKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gVXJpLnBhcnNlKF9nZXRDdXJyZW50Um9vdFVyaVN0cigpKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICBzdGF0aWMgU3RyaW5nIF9nZXRDdXJyZW50Um9vdFVyaVN0cigpIG5hdGl2ZSAiSXNvbGF0ZV9nZXRDdXJyZW50Um9vdFVyaVN0ciI7Cn0KgqMATk48AU1NSysBNAEUUQEnATobAQcUCTMBCUM9BAIBBxMJMQIBGi49ASA5BAEVHAQBMTgCAQcXBjUFSEYYBgkvPB4TBAIBP0YBN0UoBAEaHgQBNj8tSQQBDBYZBAEhIAIBIwFHLgFNJzIwMCgCASImKy4mEAQCATcsJBMCATonIjEkAgEaNkUBDDovBAEaHAQBIC0tBAEVHgQBLjA8AT8kIiITBAE0JD5NTDMWJAQBOz4BJSkEATQcHTYhNBYWARoEATQCARoqHyQbHAQBIEwEARUcBAElKjYBP0cCARwjMgEEQkMjBCJBER4SDBoaHyACAQRPTUY4BCIqHAIBBEoMBCIUGRkXERUgGVAdRgQBHEU4B08kLCQBRyUZIwQgAUxOHy4XEgEWKzAxJw8WCA0bBgUxHAIBBxA3MAEJMQEJNgEJJzQYOQYTBAEJKTYYOwYTBAEJOTcYPwYdBAElNzk4AQlJGxsXGCEjHgpMICstCEkoAVBGPjIcSRQ1CCg6CAEWHh0WExIaEhMQGRYsFh8bCDUGBAEJSxsXGBsUJxcZLiEeHzMGAUUmIUE3HQgjQTcfCA0+QzEIBgpHMQFMKSMlKzM3CggBSCFIPBwqTSUxSgoIATwoNzsBER4hEBMSEhMaExAcHR8WLBIfGwgPBgQBQjkpGT4wLTQuNCtDOzoPIjtEIwgHHQQBOE8XGxwaGh4eHx8hAR4aEiETExsXGBocOAEZGhIZExMXGBsUGBocMwE8ATQlAQktGjMVHiAgBAEJLRozFh4gIAQBCUUaMxgbGCAEAQk1GjMYHCAEAQktGjMbIh4gBAEJLxozFCIYIAQBCVEaMxQbFxggBAEJKRozGRQgBAEJLBozGRQgBAEoSi8xNgQBOD8BJAoxEhMGBAFPAgElZGFydDppc29sYXRlLXBhdGNoL2lzb2xhdGVfcGF0Y2guZGFydC9vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL3RpbWVyX2ltcGwuZGFydLpjLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImlzb2xhdGVfcGF0Y2guZGFydCI7CgovLyBUaW1lciBoZWFwIGltcGxlbWVudGVkIGFzIGEgYXJyYXktYmFzZWQgYmluYXJ5IGhlYXBbMF0uCi8vIFRoaXMgYWxsb3dzIGZvciBPKDEpIGBmaXJzdGAsIE8obG9nKG4pKSBgcmVtb3ZlYC9gcmVtb3ZlRmlyc3RgIGFuZCBPKGxvZyhuKSkKLy8gYGFkZGAuCi8vCi8vIFRvIGVuc3VyZSB0aGUgdGltZXJzIGFyZSBvcmRlcmVkIGJ5IGluc2VydGlvbiB0aW1lLCB0aGUgX1RpbWVyIGNsYXNzIGhhcyBhCi8vIGBfaWRgIGZpZWxkIHNldCB3aGVuIGFkZGVkIHRvIHRoZSBoZWFwLgovLwovLyBbMF0gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaW5hcnlfaGVhcApjbGFzcyBfVGltZXJIZWFwIHsKICBMaXN0PF9UaW1lcj4gX2xpc3Q7CiAgaW50IF91c2VkID0gMDsKCiAgX1RpbWVySGVhcChbaW50IGluaXRTaXplID0gN10pIDogX2xpc3QgPSBuZXcgTGlzdDxfVGltZXI+KGluaXRTaXplKTsKCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfdXNlZCA9PSAwOwoKICBfVGltZXIgZ2V0IGZpcnN0ID0+IF9saXN0WzBdOwoKICBib29sIGlzRmlyc3QoX1RpbWVyIHRpbWVyKSA9PiB0aW1lci5faW5kZXhPck5leHQgPT0gMDsKCiAgdm9pZCBhZGQoX1RpbWVyIHRpbWVyKSB7CiAgICBpZiAoX3VzZWQgPT0gX2xpc3QubGVuZ3RoKSB7CiAgICAgIF9yZXNpemUoKTsKICAgIH0KICAgIHRpbWVyLl9pbmRleE9yTmV4dCA9IF91c2VkKys7CiAgICBfbGlzdFt0aW1lci5faW5kZXhPck5leHRdID0gdGltZXI7CiAgICBfYnViYmxlVXAodGltZXIpOwogIH0KCiAgX1RpbWVyIHJlbW92ZUZpcnN0KCkgewogICAgdmFyIGYgPSBmaXJzdDsKICAgIHJlbW92ZShmKTsKICAgIHJldHVybiBmOwogIH0KCiAgdm9pZCByZW1vdmUoX1RpbWVyIHRpbWVyKSB7CiAgICBfdXNlZC0tOwogICAgaWYgKGlzRW1wdHkpIHsKICAgICAgX2xpc3RbMF0gPSBudWxsOwogICAgICB0aW1lci5faW5kZXhPck5leHQgPSBudWxsOwogICAgICByZXR1cm47CiAgICB9CiAgICB2YXIgbGFzdCA9IF9saXN0W191c2VkXTsKICAgIGlmICghaWRlbnRpY2FsKGxhc3QsIHRpbWVyKSkgewogICAgICBsYXN0Ll9pbmRleE9yTmV4dCA9IHRpbWVyLl9pbmRleE9yTmV4dDsKICAgICAgX2xpc3RbbGFzdC5faW5kZXhPck5leHRdID0gbGFzdDsKICAgICAgaWYgKGxhc3QuX2NvbXBhcmVUbyh0aW1lcikgPCAwKSB7CiAgICAgICAgX2J1YmJsZVVwKGxhc3QpOwogICAgICB9IGVsc2UgewogICAgICAgIF9idWJibGVEb3duKGxhc3QpOwogICAgICB9CiAgICB9CiAgICBfbGlzdFtfdXNlZF0gPSBudWxsOwogICAgdGltZXIuX2luZGV4T3JOZXh0ID0gbnVsbDsKICB9CgogIHZvaWQgX3Jlc2l6ZSgpIHsKICAgIHZhciBuZXdMaXN0ID0gbmV3IExpc3Q8X1RpbWVyPihfbGlzdC5sZW5ndGggKiAyICsgMSk7CiAgICBuZXdMaXN0LnNldFJhbmdlKDAsIF91c2VkLCBfbGlzdCk7CiAgICBfbGlzdCA9IG5ld0xpc3Q7CiAgfQoKICB2b2lkIF9idWJibGVVcChfVGltZXIgdGltZXIpIHsKICAgIHdoaWxlICghaXNGaXJzdCh0aW1lcikpIHsKICAgICAgVGltZXIgcGFyZW50ID0gX3BhcmVudCh0aW1lcik7CiAgICAgIGlmICh0aW1lci5fY29tcGFyZVRvKHBhcmVudCkgPCAwKSB7CiAgICAgICAgX3N3YXAodGltZXIsIHBhcmVudCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgX2J1YmJsZURvd24oX1RpbWVyIHRpbWVyKSB7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpbnQgbGVmdEluZGV4ID0gX2xlZnRDaGlsZEluZGV4KHRpbWVyLl9pbmRleE9yTmV4dCk7CiAgICAgIGludCByaWdodEluZGV4ID0gX3JpZ2h0Q2hpbGRJbmRleCh0aW1lci5faW5kZXhPck5leHQpOwogICAgICBfVGltZXIgbmV3ZXN0ID0gdGltZXI7CiAgICAgIGlmIChsZWZ0SW5kZXggPCBfdXNlZCAmJiBfbGlzdFtsZWZ0SW5kZXhdLl9jb21wYXJlVG8obmV3ZXN0KSA8IDApIHsKICAgICAgICBuZXdlc3QgPSBfbGlzdFtsZWZ0SW5kZXhdOwogICAgICB9CiAgICAgIGlmIChyaWdodEluZGV4IDwgX3VzZWQgJiYgX2xpc3RbcmlnaHRJbmRleF0uX2NvbXBhcmVUbyhuZXdlc3QpIDwgMCkgewogICAgICAgIG5ld2VzdCA9IF9saXN0W3JpZ2h0SW5kZXhdOwogICAgICB9CiAgICAgIGlmIChpZGVudGljYWwobmV3ZXN0LCB0aW1lcikpIHsKICAgICAgICAvLyBXZSBhcmUgd2hlcmUgd2Ugc2hvdWxkIGJlLCBicmVhay4KICAgICAgICBicmVhazsKICAgICAgfQogICAgICBfc3dhcChuZXdlc3QsIHRpbWVyKTsKICAgIH0KICB9CgogIHZvaWQgX3N3YXAoX1RpbWVyIGZpcnN0LCBfVGltZXIgc2Vjb25kKSB7CiAgICBpbnQgdG1wID0gZmlyc3QuX2luZGV4T3JOZXh0OwogICAgZmlyc3QuX2luZGV4T3JOZXh0ID0gc2Vjb25kLl9pbmRleE9yTmV4dDsKICAgIHNlY29uZC5faW5kZXhPck5leHQgPSB0bXA7CiAgICBfbGlzdFtmaXJzdC5faW5kZXhPck5leHRdID0gZmlyc3Q7CiAgICBfbGlzdFtzZWNvbmQuX2luZGV4T3JOZXh0XSA9IHNlY29uZDsKICB9CgogIFRpbWVyIF9wYXJlbnQoX1RpbWVyIHRpbWVyKSA9PiBfbGlzdFtfcGFyZW50SW5kZXgodGltZXIuX2luZGV4T3JOZXh0KV07CiAgVGltZXIgX2xlZnRDaGlsZChfVGltZXIgdGltZXIpID0+IF9saXN0W19sZWZ0Q2hpbGRJbmRleCh0aW1lci5faW5kZXhPck5leHQpXTsKICBUaW1lciBfcmlnaHRDaGlsZChfVGltZXIgdGltZXIpID0+CiAgICAgIF9saXN0W19yaWdodENoaWxkSW5kZXgodGltZXIuX2luZGV4T3JOZXh0KV07CgogIHN0YXRpYyBpbnQgX3BhcmVudEluZGV4KGludCBpbmRleCkgPT4gKGluZGV4IC0gMSkgfi8gMjsKICBzdGF0aWMgaW50IF9sZWZ0Q2hpbGRJbmRleChpbnQgaW5kZXgpID0+IDIgKiBpbmRleCArIDE7CiAgc3RhdGljIGludCBfcmlnaHRDaGlsZEluZGV4KGludCBpbmRleCkgPT4gMiAqIGluZGV4ICsgMjsKfQoKY2xhc3MgX1RpbWVyIGltcGxlbWVudHMgVGltZXIgewogIC8vIENhbmNlbHMgdGhlIHRpbWVyIGluIHRoZSBldmVudCBoYW5kbGVyLgogIHN0YXRpYyBjb25zdCBfTk9fVElNRVIgPSAtMTsKCiAgLy8gV2UgZGlzdGluZ3Vpc2ggd2hhdCBraW5kIG9mIG1lc3NhZ2UgYXJyaXZlZCBiYXNlZCBvbiB0aGUgdmFsdWUgYmVpbmcgc2VudC4KICBzdGF0aWMgY29uc3QgX1pFUk9fRVZFTlQgPSAxOwogIHN0YXRpYyBjb25zdCBfVElNRU9VVF9FVkVOVCA9IG51bGw7CgogIC8vIFRpbWVycyBhcmUgb3JkZXJlZCBieSB3YWtldXAgdGltZS4gVGltZXJzIHdpdGggYSB0aW1lb3V0IHZhbHVlIG9mID4gMCBkbwogIC8vIGVuZCB1cCBvbiB0aGUgVGltZXJIZWFwLiBUaW1lcnMgd2l0aCBhIHRpbWVvdXQgb2YgMCBhcmUgcXVldWVkIGluIGEgbGlzdC4KICBzdGF0aWMgZmluYWwgX2hlYXAgPSBuZXcgX1RpbWVySGVhcCgpOwogIHN0YXRpYyBfVGltZXIgX2ZpcnN0WmVyb1RpbWVyOwogIHN0YXRpYyBfVGltZXIgX2xhc3RaZXJvVGltZXI7CgogIC8vIFdlIHVzZSBhbiBpZCB0byBiZSBhYmxlIHRvIHNvcnQgdGltZXJzIHdpdGggdGhlIHNhbWUgZXhwaXJhdGlvbiB0aW1lLgogIC8vIGlkcyBhcmUgcmVjeWNsZWQgYWZ0ZXIgSURfTUFTSyBlbnF1ZXVlcyBvciB3aGVuIHRoZSB0aW1lciBxdWV1ZSBpcyBlbXB0eS4KICBzdGF0aWMgY29uc3QgX0lEX01BU0sgPSAweDFmZmZmZmZmOwogIHN0YXRpYyBpbnQgX2lkQ291bnQgPSAwOwoKICBzdGF0aWMgUmF3UmVjZWl2ZVBvcnQgX3JlY2VpdmVQb3J0OwogIHN0YXRpYyBTZW5kUG9ydCBfc2VuZFBvcnQ7CiAgc3RhdGljIGludCBfc2NoZWR1bGVkV2FrZXVwVGltZTsKCiAgc3RhdGljIGJvb2wgX2hhbmRsaW5nQ2FsbGJhY2tzID0gZmFsc2U7CgogIEZ1bmN0aW9uIF9jYWxsYmFjazsgLy8gQ2xvc3VyZSB0byBjYWxsIHdoZW4gdGltZXIgZmlyZXMuIG51bGwgaWYgY2FuY2VsZWQuCiAgaW50IF93YWtldXBUaW1lOyAvLyBFeHBpcmF0aW9uIHRpbWUuCiAgZmluYWwgaW50IF9taWxsaVNlY29uZHM7IC8vIER1cmF0aW9uIHNwZWNpZmllZCBhdCBjcmVhdGlvbi4KICBmaW5hbCBib29sIF9yZXBlYXRpbmc7IC8vIEluZGljYXRlcyBwZXJpb2RpYyB0aW1lcnMuCiAgdmFyIF9pbmRleE9yTmV4dDsgLy8gSW5kZXggaWYgcGFydCBvZiB0aGUgVGltZXJIZWFwLCBsaW5rIG90aGVyd2lzZS4KICBpbnQgX2lkOyAvLyBJbmNyZW1lbnRpbmcgaWQgdG8gZW5hYmxlIHNvcnRpbmcgb2YgdGltZXJzIHdpdGggc2FtZSBleHBpcnkuCgogIGludCBfdGljayA9IDA7IC8vIEJhY2tpbmcgZm9yIFt0aWNrXSwKCiAgLy8gR2V0IHRoZSBuZXh0IGF2YWlsYWJsZSBpZC4gV2UgYWNjZXB0IGNvbGxpc2lvbnMgYW5kIHJlb3JkZXJpbmcgd2hlbiB0aGUKICAvLyBfaWRDb3VudCBvdmVyZmxvd3MgYW5kIHRoZSB0aW1lcnMgZXhwaXJlIGF0IHRoZSBzYW1lIG1pbGxpc2Vjb25kLgogIHN0YXRpYyBpbnQgX25leHRJZCgpIHsKICAgIHZhciByZXN1bHQgPSBfaWRDb3VudDsKICAgIF9pZENvdW50ID0gKF9pZENvdW50ICsgMSkgJiBfSURfTUFTSzsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBfVGltZXIuX2ludGVybmFsKAogICAgICB0aGlzLl9jYWxsYmFjaywgdGhpcy5fd2FrZXVwVGltZSwgdGhpcy5fbWlsbGlTZWNvbmRzLCB0aGlzLl9yZXBlYXRpbmcpCiAgICAgIDogX2lkID0gX25leHRJZCgpOwoKICBzdGF0aWMgVGltZXIgX2NyZWF0ZVRpbWVyKAogICAgICB2b2lkIGNhbGxiYWNrKFRpbWVyIHRpbWVyKSwgaW50IG1pbGxpU2Vjb25kcywgYm9vbCByZXBlYXRpbmcpIHsKICAgIC8vIE5lZ2F0aXZlIHRpbWVvdXRzIGFyZSB0cmVhdGVkIGFzIGlmIDAgdGltZW91dC4KICAgIGlmIChtaWxsaVNlY29uZHMgPCAwKSB7CiAgICAgIG1pbGxpU2Vjb25kcyA9IDA7CiAgICB9CiAgICAvLyBBZGQgb25lIGJlY2F1c2UgRGF0ZVRpbWUubm93KCkgaXMgYXNzdW1lZCB0byByb3VuZCBkb3duCiAgICAvLyB0byBuZWFyZXN0IG1pbGxpc2Vjb25kLCBub3QgdXAsIHNvIHRoYXQgdGltZSArIGR1cmF0aW9uIGlzIGJlZm9yZQogICAgLy8gZHVyYXRpb24gbWlsbGlzZWNvbmRzIGZyb20gbm93LiBVc2luZyBtaWNyb3NlY29uZCB0aW1lcnMgbGlrZQogICAgLy8gU3RvcHdhdGNoIGFsbG93cyBkZXRlY3RpbmcgdGhhdCB0aGUgdGltZXIgZmlyZXMgZWFybHkuCiAgICBpbnQgbm93ID0gVk1MaWJyYXJ5SG9va3MudGltZXJNaWxsaXNlY29uZENsb2NrKCk7CiAgICBpbnQgd2FrZXVwVGltZSA9IChtaWxsaVNlY29uZHMgPT0gMCkgPyBub3cgOiAobm93ICsgMSArIG1pbGxpU2Vjb25kcyk7CgogICAgX1RpbWVyIHRpbWVyID0KICAgICAgICBuZXcgX1RpbWVyLl9pbnRlcm5hbChjYWxsYmFjaywgd2FrZXVwVGltZSwgbWlsbGlTZWNvbmRzLCByZXBlYXRpbmcpOwogICAgLy8gRW5xdWV1ZSB0aGlzIG5ld2x5IGNyZWF0ZWQgdGltZXIgaW4gdGhlIGFwcHJvcHJpYXRlIHN0cnVjdHVyZSBhbmQKICAgIC8vIG5vdGlmeSBpZiBuZWNlc3NhcnkuCiAgICB0aW1lci5fZW5xdWV1ZSgpOwogICAgcmV0dXJuIHRpbWVyOwogIH0KCiAgZmFjdG9yeSBfVGltZXIoaW50IG1pbGxpU2Vjb25kcywgdm9pZCBjYWxsYmFjayhUaW1lciB0aW1lcikpIHsKICAgIHJldHVybiBfY3JlYXRlVGltZXIoY2FsbGJhY2ssIG1pbGxpU2Vjb25kcywgZmFsc2UpOwogIH0KCiAgZmFjdG9yeSBfVGltZXIucGVyaW9kaWMoaW50IG1pbGxpU2Vjb25kcywgdm9pZCBjYWxsYmFjayhUaW1lciB0aW1lcikpIHsKICAgIHJldHVybiBfY3JlYXRlVGltZXIoY2FsbGJhY2ssIG1pbGxpU2Vjb25kcywgdHJ1ZSk7CiAgfQoKICBib29sIGdldCBfaXNJbkhlYXAgPT4gX2luZGV4T3JOZXh0IGlzIGludDsKCiAgaW50IF9jb21wYXJlVG8oX1RpbWVyIG90aGVyKSB7CiAgICBpbnQgYyA9IF93YWtldXBUaW1lIC0gb3RoZXIuX3dha2V1cFRpbWU7CiAgICBpZiAoYyAhPSAwKSByZXR1cm4gYzsKICAgIHJldHVybiBfaWQgLSBvdGhlci5faWQ7CiAgfQoKICBib29sIGdldCBpc0FjdGl2ZSA9PiBfY2FsbGJhY2sgIT0gbnVsbDsKCiAgaW50IGdldCB0aWNrID0+IF90aWNrOwoKICAvLyBDYW5jZWxzIGEgc2V0IHRpbWVyLiBUaGUgdGltZXIgaXMgcmVtb3ZlZCBmcm9tIHRoZSB0aW1lciBoZWFwIGlmIGl0IGlzIGEKICAvLyBub24temVybyB0aW1lci4gWmVybyB0aW1lcnMgYXJlIGtlcHQgaW4gdGhlIGxpc3QgYXMgdGhleSBuZWVkIHRvIGNvbnN1bWUKICAvLyB0aGUgY29ycmVzcG9uZGluZyBwZW5kaW5nIG1lc3NhZ2UuCiAgdm9pZCBjYW5jZWwoKSB7CiAgICBfY2FsbGJhY2sgPSBudWxsOwogICAgLy8gT25seSBoZWFwIHRpbWVycyBhcmUgcmVhbGx5IHJlbW92ZWQuIFplcm8gdGltZXJzIG5lZWQgdG8gY29uc3VtZSB0aGVpcgogICAgLy8gY29ycmVzcG9uZGluZyB3YWtldXAgbWVzc2FnZSBzbyB0aGV5IGFyZSBsZWZ0IGluIHRoZSBxdWV1ZS4KICAgIGlmICghX2lzSW5IZWFwKSByZXR1cm47CiAgICBib29sIHVwZGF0ZSA9IF9oZWFwLmlzRmlyc3QodGhpcyk7CiAgICBfaGVhcC5yZW1vdmUodGhpcyk7CiAgICBpZiAodXBkYXRlKSB7CiAgICAgIF9ub3RpZnlFdmVudEhhbmRsZXIoKTsKICAgIH0KICB9CgogIHZvaWQgX2FkdmFuY2VXYWtldXBUaW1lKCkgewogICAgLy8gUmVjYWxjdWxhdGUgdGhlIG5leHQgd2FrZXVwIHRpbWUuIEZvciByZXBlYXRpbmcgdGltZXJzIHdpdGggYSAwIHRpbWVvdXQKICAgIC8vIHRoZSBuZXh0IHdha2V1cCB0aW1lIGlzIG5vdy4KICAgIF9pZCA9IF9uZXh0SWQoKTsKICAgIGlmIChfbWlsbGlTZWNvbmRzID4gMCkgewogICAgICBfd2FrZXVwVGltZSArPSBfbWlsbGlTZWNvbmRzOwogICAgfSBlbHNlIHsKICAgICAgX3dha2V1cFRpbWUgPSBWTUxpYnJhcnlIb29rcy50aW1lck1pbGxpc2Vjb25kQ2xvY2soKTsKICAgIH0KICB9CgogIC8vIEFkZHMgYSB0aW1lciB0byB0aGUgaGVhcCBvciB0aW1lciBsaXN0LiBUaW1lcnMgd2l0aCB0aGUgc2FtZSB3YWtldXAgdGltZQogIC8vIGFyZSBlbnF1ZXVlZCBpbiBvcmRlciBhbmQgbm90aWZpZWQgaW4gRklGTyBvcmRlci4KICB2b2lkIF9lbnF1ZXVlKCkgewogICAgaWYgKF9taWxsaVNlY29uZHMgPT0gMCkgewogICAgICBpZiAoX2ZpcnN0WmVyb1RpbWVyID09IG51bGwpIHsKICAgICAgICBfbGFzdFplcm9UaW1lciA9IHRoaXM7CiAgICAgICAgX2ZpcnN0WmVyb1RpbWVyID0gdGhpczsKICAgICAgfSBlbHNlIHsKICAgICAgICBfbGFzdFplcm9UaW1lci5faW5kZXhPck5leHQgPSB0aGlzOwogICAgICAgIF9sYXN0WmVyb1RpbWVyID0gdGhpczsKICAgICAgfQogICAgICAvLyBFdmVyeSB6ZXJvIHRpbWVyIGdldHMgaXRzIG93biBldmVudC4KICAgICAgX25vdGlmeVplcm9IYW5kbGVyKCk7CiAgICB9IGVsc2UgewogICAgICBfaGVhcC5hZGQodGhpcyk7CiAgICAgIGlmIChfaGVhcC5pc0ZpcnN0KHRoaXMpKSB7CiAgICAgICAgX25vdGlmeUV2ZW50SGFuZGxlcigpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBFbnF1ZXVlIG9uZSBtZXNzYWdlIGZvciBlYWNoIHplcm8gdGltZXIuIFRvIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2ggZnJvbQogIC8vIEV2ZW50SGFuZGxlciBtZXNzYWdlcyB3ZSBzZW5kIGEgX1pFUk9fRVZFTlQgaW5zdGVhZCBvZiBhIF9USU1FT1VUX0VWRU5ULgogIHN0YXRpYyB2b2lkIF9ub3RpZnlaZXJvSGFuZGxlcigpIHsKICAgIGlmIChfc2VuZFBvcnQgPT0gbnVsbCkgewogICAgICBfY3JlYXRlVGltZXJIYW5kbGVyKCk7CiAgICB9CiAgICBfc2VuZFBvcnQuc2VuZChfWkVST19FVkVOVCk7CiAgfQoKICAvLyBIYW5kbGUgdGhlIG5vdGlmaWNhdGlvbiBvZiBhIHplcm8gdGltZXIuIE1ha2Ugc3VyZSB0byBhbHNvIGV4ZWN1dGUgbm9uLXplcm8KICAvLyB0aW1lcnMgd2l0aCBhIGxvd2VyIGV4cGlyYXRpb24gdGltZS4KICBzdGF0aWMgTGlzdCBfcXVldWVGcm9tWmVyb0V2ZW50KCkgewogICAgdmFyIHBlbmRpbmdUaW1lcnMgPSBuZXcgTGlzdCgpOwogICAgYXNzZXJ0KF9maXJzdFplcm9UaW1lciAhPSBudWxsKTsKICAgIC8vIENvbGxlY3QgcGVuZGluZyB0aW1lcnMgZnJvbSB0aGUgdGltZXIgaGVhcCB0aGF0IGhhdmUgYW4gZXhwaXJhdGlvbiBwcmlvcgogICAgLy8gdG8gdGhlIGN1cnJlbnRseSBub3RpZmllZCB6ZXJvIHRpbWVyLgogICAgdmFyIHRpbWVyOwogICAgd2hpbGUgKCFfaGVhcC5pc0VtcHR5ICYmIChfaGVhcC5maXJzdC5fY29tcGFyZVRvKF9maXJzdFplcm9UaW1lcikgPCAwKSkgewogICAgICB0aW1lciA9IF9oZWFwLnJlbW92ZUZpcnN0KCk7CiAgICAgIHBlbmRpbmdUaW1lcnMuYWRkKHRpbWVyKTsKICAgIH0KICAgIC8vIEFwcGVuZCB0aGUgZmlyc3QgemVybyB0aW1lciB0byB0aGUgcGVuZGluZyB0aW1lcnMuCiAgICB0aW1lciA9IF9maXJzdFplcm9UaW1lcjsKICAgIF9maXJzdFplcm9UaW1lciA9IHRpbWVyLl9pbmRleE9yTmV4dDsKICAgIHRpbWVyLl9pbmRleE9yTmV4dCA9IG51bGw7CiAgICBwZW5kaW5nVGltZXJzLmFkZCh0aW1lcik7CiAgICByZXR1cm4gcGVuZGluZ1RpbWVyczsKICB9CgogIHN0YXRpYyB2b2lkIF9ub3RpZnlFdmVudEhhbmRsZXIoKSB7CiAgICBpZiAoX2hhbmRsaW5nQ2FsbGJhY2tzKSB7CiAgICAgIC8vIFdoaWxlIHdlIGFyZSBhbHJlYWR5IGhhbmRsaW5nIGNhbGxiYWNrcyB3ZSB3aWxsIG5vdCBub3RpZnkgdGhlIGV2ZW50CiAgICAgIC8vIGhhbmRsZXIuIF9oYW5kbGVUaW1lb3V0IHdpbGwgY2FsbCBfbm90aWZ5RXZlbnRIYW5kbGVyIG9uY2UgYWxsIHBlbmRpbmcKICAgICAgLy8gdGltZXJzIGFyZSBwcm9jZXNzZWQuCiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBJZiB0aGVyZSBhcmUgbm8gcGVuZGluZyB0aW1lcnMuIENsb3NlIGRvd24gdGhlIHJlY2VpdmUgcG9ydC4KICAgIGlmICgoX2ZpcnN0WmVyb1RpbWVyID09IG51bGwpICYmIF9oZWFwLmlzRW1wdHkpIHsKICAgICAgLy8gTm8gcGVuZGluZyB0aW1lcnM6IENsb3NlIHRoZSByZWNlaXZlIHBvcnQgYW5kIGxldCB0aGUgZXZlbnQgaGFuZGxlcgogICAgICAvLyBrbm93LgogICAgICBpZiAoX3NlbmRQb3J0ICE9IG51bGwpIHsKICAgICAgICBfY2FuY2VsV2FrZXVwKCk7CiAgICAgICAgX3NodXRkb3duVGltZXJIYW5kbGVyKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfSBlbHNlIGlmIChfaGVhcC5pc0VtcHR5KSB7CiAgICAgIC8vIE9ubHkgemVybyB0aW1lcnMgYXJlIGxlZnQuIENhbmNlbCBhbnkgc2NoZWR1bGVkIHdha2V1cHMuCiAgICAgIF9jYW5jZWxXYWtldXAoKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIE9ubHkgc2VuZCBhIG1lc3NhZ2UgaWYgdGhlIHJlcXVlc3RlZCB3YWtldXAgdGltZSBkaWZmZXJzIGZyb20gdGhlCiAgICAvLyBhbHJlYWR5IHNjaGVkdWxlZCB3YWtldXAgdGltZS4KICAgIHZhciB3YWtldXBUaW1lID0gX2hlYXAuZmlyc3QuX3dha2V1cFRpbWU7CiAgICBpZiAoKF9zY2hlZHVsZWRXYWtldXBUaW1lID09IG51bGwpIHx8CiAgICAgICAgKHdha2V1cFRpbWUgIT0gX3NjaGVkdWxlZFdha2V1cFRpbWUpKSB7CiAgICAgIF9zY2hlZHVsZVdha2V1cCh3YWtldXBUaW1lKTsKICAgIH0KICB9CgogIHN0YXRpYyBMaXN0IF9xdWV1ZUZyb21UaW1lb3V0RXZlbnQoKSB7CiAgICB2YXIgcGVuZGluZ1RpbWVycyA9IG5ldyBMaXN0KCk7CiAgICBpZiAoX2ZpcnN0WmVyb1RpbWVyICE9IG51bGwpIHsKICAgICAgLy8gQ29sbGVjdCBwZW5kaW5nIHRpbWVycyBmcm9tIHRoZSB0aW1lciBoZWFwIHRoYXQgaGF2ZSBhbiBleHBpcmF0aW9uCiAgICAgIC8vIHByaW9yIHRvIHRoZSBuZXh0IHplcm8gdGltZXIuCiAgICAgIC8vIEJ5IGRlZmluaXRpb24gdGhlIGZpcnN0IHplcm8gdGltZXIgaGFzIGJlZW4gc2NoZWR1bGVkIGJlZm9yZSB0aGUKICAgICAgLy8gY3VycmVudCB0aW1lLCBtZWFuaW5nIGFsbCB0aW1lcnMgd2hpY2ggYXJlICJsZXNzIHRoYW4iIHRoZSBmaXJzdCB6ZXJvCiAgICAgIC8vIHRpbWVyIGFyZSBleHBpcmVkLiBUaGUgZmlyc3QgemVybyB0aW1lciB3aWxsIGJlIGRpc3BhdGNoZWQgd2hlbiBpdHMKICAgICAgLy8gY29ycmVzcG9uZGluZyBtZXNzYWdlIGlzIGRlbGl2ZXJlZC4KICAgICAgdmFyIHRpbWVyOwogICAgICB3aGlsZSAoIV9oZWFwLmlzRW1wdHkgJiYgKF9oZWFwLmZpcnN0Ll9jb21wYXJlVG8oX2ZpcnN0WmVyb1RpbWVyKSA8IDApKSB7CiAgICAgICAgdGltZXIgPSBfaGVhcC5yZW1vdmVGaXJzdCgpOwogICAgICAgIHBlbmRpbmdUaW1lcnMuYWRkKHRpbWVyKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gQ29sbGVjdCBwZW5kaW5nIHRpbWVycyBmcm9tIHRoZSB0aW1lciBoZWFwIHdoaWNoIGhhdmUgZXhwaXJlZCBhdCB0aGlzCiAgICAgIC8vIHRpbWUuCiAgICAgIHZhciBjdXJyZW50VGltZSA9IFZNTGlicmFyeUhvb2tzLnRpbWVyTWlsbGlzZWNvbmRDbG9jaygpOwogICAgICB2YXIgdGltZXI7CiAgICAgIHdoaWxlICghX2hlYXAuaXNFbXB0eSAmJiAoX2hlYXAuZmlyc3QuX3dha2V1cFRpbWUgPD0gY3VycmVudFRpbWUpKSB7CiAgICAgICAgdGltZXIgPSBfaGVhcC5yZW1vdmVGaXJzdCgpOwogICAgICAgIHBlbmRpbmdUaW1lcnMuYWRkKHRpbWVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBlbmRpbmdUaW1lcnM7CiAgfQoKICBzdGF0aWMgdm9pZCBfcnVuVGltZXJzKExpc3QgcGVuZGluZ1RpbWVycykgewogICAgLy8gSWYgdGhlcmUgYXJlIG5vIHBlbmRpbmcgdGltZXJzIGN1cnJlbnRseSByZXNldCB0aGUgaWQgc3BhY2UgYmVmb3JlIHdlCiAgICAvLyBoYXZlIGEgY2hhbmNlIHRvIGVucXVldWUgbmV3IHRpbWVycy4KICAgIGlmIChfaGVhcC5pc0VtcHR5ICYmIChfZmlyc3RaZXJvVGltZXIgPT0gbnVsbCkpIHsKICAgICAgX2lkQ291bnQgPSAwOwogICAgfQoKICAgIC8vIEZhc3QgZXhpdCBpZiBubyBwZW5kaW5nIHRpbWVycy4KICAgIGlmIChwZW5kaW5nVGltZXJzLmxlbmd0aCA9PSAwKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBUcmlnZ2VyIGFsbCBvZiB0aGUgcGVuZGluZyB0aW1lcnMuIE5ldyB0aW1lcnMgYWRkZWQgYXMgcGFydCBvZiB0aGUKICAgIC8vIGNhbGxiYWNrcyB3aWxsIGJlIGVucXVldWVkIG5vdyBhbmQgbm90aWZpZWQgaW4gdGhlIG5leHQgc3BpbiBhdCB0aGUKICAgIC8vIGVhcmxpZXN0LgogICAgX2hhbmRsaW5nQ2FsbGJhY2tzID0gdHJ1ZTsKICAgIHZhciBpID0gMDsKICAgIHRyeSB7CiAgICAgIGZvciAoOyBpIDwgcGVuZGluZ1RpbWVycy5sZW5ndGg7IGkrKykgewogICAgICAgIC8vIE5leHQgcGVuZGluZyB0aW1lci4KICAgICAgICB2YXIgdGltZXIgPSBwZW5kaW5nVGltZXJzW2ldOwogICAgICAgIHRpbWVyLl9pbmRleE9yTmV4dCA9IG51bGw7CgogICAgICAgIC8vIE9uZSBvZiB0aGUgdGltZXJzIGluIHRoZSBwZW5kaW5nX3RpbWVycyBsaXN0IGNhbiBjYW5jZWwKICAgICAgICAvLyBvbmUgb2YgdGhlIGxhdGVyIHRpbWVycyB3aGljaCB3aWxsIHNldCB0aGUgY2FsbGJhY2sgdG8KICAgICAgICAvLyBudWxsLiBPciB0aGUgcGVuZGluZyB6ZXJvIHRpbWVyIGhhcyBiZWVuIGNhbmNlbGVkIGVhcmxpZXIuCiAgICAgICAgaWYgKHRpbWVyLl9jYWxsYmFjayAhPSBudWxsKSB7CiAgICAgICAgICB2YXIgY2FsbGJhY2sgPSB0aW1lci5fY2FsbGJhY2s7CiAgICAgICAgICBpZiAoIXRpbWVyLl9yZXBlYXRpbmcpIHsKICAgICAgICAgICAgLy8gTWFyayB0aW1lciBhcyBpbmFjdGl2ZS4KICAgICAgICAgICAgdGltZXIuX2NhbGxiYWNrID0gbnVsbDsKICAgICAgICAgIH0gZWxzZSBpZiAodGltZXIuX21pbGxpU2Vjb25kcyA+IDApIHsKICAgICAgICAgICAgdmFyIG1zID0gdGltZXIuX21pbGxpU2Vjb25kczsKICAgICAgICAgICAgaW50IG92ZXJkdWUgPQogICAgICAgICAgICAgICAgVk1MaWJyYXJ5SG9va3MudGltZXJNaWxsaXNlY29uZENsb2NrKCkgLSB0aW1lci5fd2FrZXVwVGltZTsKICAgICAgICAgICAgaWYgKG92ZXJkdWUgPiBtcykgewogICAgICAgICAgICAgIGludCBtaXNzZWRUaWNrcyA9IG92ZXJkdWUgfi8gbXM7CiAgICAgICAgICAgICAgdGltZXIuX3dha2V1cFRpbWUgKz0gbWlzc2VkVGlja3MgKiBtczsKICAgICAgICAgICAgICB0aW1lci5fdGljayArPSBtaXNzZWRUaWNrczsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdGltZXIuX3RpY2sgKz0gMTsKCiAgICAgICAgICBjYWxsYmFjayh0aW1lcik7CiAgICAgICAgICAvLyBSZS1pbnNlcnQgcmVwZWF0aW5nIHRpbWVyIGlmIG5vdCBjYW5jZWxlZC4KICAgICAgICAgIGlmICh0aW1lci5fcmVwZWF0aW5nICYmICh0aW1lci5fY2FsbGJhY2sgIT0gbnVsbCkpIHsKICAgICAgICAgICAgdGltZXIuX2FkdmFuY2VXYWtldXBUaW1lKCk7CiAgICAgICAgICAgIHRpbWVyLl9lbnF1ZXVlKCk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBFeGVjdXRlIHBlbmRpbmcgbWljcm8gdGFza3MuCiAgICAgICAgICB2YXIgaW1tZWRpYXRlQ2FsbGJhY2sgPSBfcmVtb3ZlUGVuZGluZ0ltbWVkaWF0ZUNhbGxiYWNrKCk7CiAgICAgICAgICBpZiAoaW1tZWRpYXRlQ2FsbGJhY2sgIT0gbnVsbCkgewogICAgICAgICAgICBpbW1lZGlhdGVDYWxsYmFjaygpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSBmaW5hbGx5IHsKICAgICAgX2hhbmRsaW5nQ2FsbGJhY2tzID0gZmFsc2U7CiAgICAgIC8vIFJlLXF1ZXVlIHRpbWVycyB3ZSBkaWRuJ3QgZ2V0IHRvLgogICAgICBmb3IgKGkrKzsgaSA8IHBlbmRpbmdUaW1lcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgdGltZXIgPSBwZW5kaW5nVGltZXJzW2ldOwogICAgICAgIHRpbWVyLl9lbnF1ZXVlKCk7CiAgICAgIH0KICAgICAgX25vdGlmeUV2ZW50SGFuZGxlcigpOwogICAgfQogIH0KCiAgc3RhdGljIHZvaWQgX2hhbmRsZU1lc3NhZ2UobXNnKSB7CiAgICB2YXIgcGVuZGluZ1RpbWVyczsKICAgIGlmIChtc2cgPT0gX1pFUk9fRVZFTlQpIHsKICAgICAgcGVuZGluZ1RpbWVycyA9IF9xdWV1ZUZyb21aZXJvRXZlbnQoKTsKICAgICAgYXNzZXJ0KHBlbmRpbmdUaW1lcnMubGVuZ3RoID4gMCk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQobXNnID09IF9USU1FT1VUX0VWRU5UKTsKICAgICAgX3NjaGVkdWxlZFdha2V1cFRpbWUgPSBudWxsOyAvLyBDb25zdW1lZCB0aGUgbGFzdCBzY2hlZHVsZWQgd2FrZXVwIG5vdy4KICAgICAgcGVuZGluZ1RpbWVycyA9IF9xdWV1ZUZyb21UaW1lb3V0RXZlbnQoKTsKICAgIH0KICAgIF9ydW5UaW1lcnMocGVuZGluZ1RpbWVycyk7CiAgICAvLyBOb3RpZnkgdGhlIGV2ZW50IGhhbmRsZXIgb3Igc2h1dGRvd24gdGhlIHBvcnQgaWYgbm8gbW9yZSBwZW5kaW5nCiAgICAvLyB0aW1lcnMgYXJlIHByZXNlbnQuCiAgICBfbm90aWZ5RXZlbnRIYW5kbGVyKCk7CiAgfQoKICAvLyBUZWxsIHRoZSBldmVudCBoYW5kbGVyIHRvIHdha2UgdGhpcyBpc29sYXRlIGF0IGEgc3BlY2lmaWMgdGltZS4KICBzdGF0aWMgdm9pZCBfc2NoZWR1bGVXYWtldXAoaW50IHdha2V1cFRpbWUpIHsKICAgIGlmIChfc2VuZFBvcnQgPT0gbnVsbCkgewogICAgICBfY3JlYXRlVGltZXJIYW5kbGVyKCk7CiAgICB9CiAgICBWTUxpYnJhcnlIb29rcy5ldmVudEhhbmRsZXJTZW5kRGF0YShudWxsLCBfc2VuZFBvcnQsIHdha2V1cFRpbWUpOwogICAgX3NjaGVkdWxlZFdha2V1cFRpbWUgPSB3YWtldXBUaW1lOwogIH0KCiAgLy8gQ2FuY2VsIHBlbmRpbmcgd2FrZXVwcyBpbiB0aGUgZXZlbnQgaGFuZGxlci4KICBzdGF0aWMgdm9pZCBfY2FuY2VsV2FrZXVwKCkgewogICAgaWYgKF9zZW5kUG9ydCAhPSBudWxsKSB7CiAgICAgIFZNTGlicmFyeUhvb2tzLmV2ZW50SGFuZGxlclNlbmREYXRhKG51bGwsIF9zZW5kUG9ydCwgX05PX1RJTUVSKTsKICAgICAgX3NjaGVkdWxlZFdha2V1cFRpbWUgPSBudWxsOwogICAgfQogIH0KCiAgLy8gQ3JlYXRlIGEgcmVjZWl2ZSBwb3J0IGFuZCByZWdpc3RlciBhIG1lc3NhZ2UgaGFuZGxlciBmb3IgdGhlIHRpbWVyCiAgLy8gZXZlbnRzLgogIHN0YXRpYyB2b2lkIF9jcmVhdGVUaW1lckhhbmRsZXIoKSB7CiAgICBhc3NlcnQoX3JlY2VpdmVQb3J0ID09IG51bGwpOwogICAgYXNzZXJ0KF9zZW5kUG9ydCA9PSBudWxsKTsKICAgIF9yZWNlaXZlUG9ydCA9IG5ldyBSYXdSZWNlaXZlUG9ydChfaGFuZGxlTWVzc2FnZSk7CiAgICBfc2VuZFBvcnQgPSBfcmVjZWl2ZVBvcnQuc2VuZFBvcnQ7CiAgICBfc2NoZWR1bGVkV2FrZXVwVGltZSA9IG51bGw7CiAgfQoKICBzdGF0aWMgdm9pZCBfc2h1dGRvd25UaW1lckhhbmRsZXIoKSB7CiAgICBfcmVjZWl2ZVBvcnQuY2xvc2UoKTsKICAgIF9yZWNlaXZlUG9ydCA9IG51bGw7CiAgICBfc2VuZFBvcnQgPSBudWxsOwogICAgX3NjaGVkdWxlZFdha2V1cFRpbWUgPSBudWxsOwogIH0KCiAgLy8gVGhlIFRpbWVyIGZhY3RvcnkgcmVnaXN0ZXJlZCB3aXRoIHRoZSBkYXJ0OmFzeW5jIGxpYnJhcnkgYnkgdGhlIGVtYmVkZGVyLgogIHN0YXRpYyBUaW1lciBfZmFjdG9yeSgKICAgICAgaW50IG1pbGxpU2Vjb25kcywgdm9pZCBjYWxsYmFjayhUaW1lciB0aW1lciksIGJvb2wgcmVwZWF0aW5nKSB7CiAgICBpZiAocmVwZWF0aW5nKSB7CiAgICAgIHJldHVybiBuZXcgX1RpbWVyLnBlcmlvZGljKG1pbGxpU2Vjb25kcywgY2FsbGJhY2spOwogICAgfQogICAgcmV0dXJuIG5ldyBfVGltZXIobWlsbGlTZWNvbmRzLCBjYWxsYmFjayk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKX3NldHVwSG9va3MoKSB7CiAgVk1MaWJyYXJ5SG9va3MudGltZXJGYWN0b3J5ID0gX1RpbWVyLl9mYWN0b3J5Owp9CoHXAE5OPAEhATtQCgNOKwMwExYRAUcBIgEgATkBGyERBiInFgQBGRMPDgQBHg0TFyEOBh0jLicoGQ8bCAYZHwQBEzonFQQBIR4lKh4PDwgGBAEjEzs9HUojCEwkCCYtDwgcBgQBLCIuHycpBAFKUCUzATo6OwIBIC0fAVAgJgFOTykhIAFLTyYbASYdIwEqAU0nPjdHTAEoAU1HGRsqEwQBFE0ZAR1GNhwYBj9JRT42SwETTUkcFhIEAUE4BAFKNwQBLQEhLRocBAEqARkBTk4oEhZOQxwnGBIdBgQBHk8kFR0kDTwGBAFONxQeJR8gDywfCC4cDRchHwgGBAFNTiUdHQYhBAFRKiYkJVAtD04jIAY6HSofHhoEASYeTlAfDgYBRDZNDx8ZIQgOIEIXDgYBSSYuKjAjBgQBKSQjTCdKT00tEVAlIggNTw9AEUslIggGGgQBL00sNhQGASclDgYBSksRHw8KLh8mIwFDQkYnKiMnJDAqGkwgLzUqDgwcARs4PygeDCpFKyEMCggQIisxJhoIHQYEASQXHi0oDSVOMAYfSBsbBAFFMB0dBkYnBAEyIB1HIwYEAUgNJiIfNychBAEoGhkWIQQBTxlGFToGLwQCASIQMQIBImRhcnQ6aXNvbGF0ZS1wYXRjaC90aW1lcl9pbXBsLmRhcnQzb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2lzb2xhdGUvY2FwYWJpbGl0eS5kYXJ0hOkvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0Lmlzb2xhdGU7CgovKioKICogQW4gdW5mb3JnZWFibGUgb2JqZWN0IHRoYXQgY29tZXMgYmFjayBhcyBlcXVhbCB3aGVuIHBhc3NlZCB0aHJvdWdoIG90aGVyCiAqIGlzb2xhdGVzLgogKgogKiBTZW5kaW5nIGEgY2FwYWJpbGl0eSBvYmplY3QgdG8gYW5vdGhlciBpc29sYXRlLCBhbmQgZ2V0dGluZyBpdCBiYWNrLAogKiB3aWxsIHByb2R1Y2UgYW4gb2JqZWN0IHRoYXQgaXMgZXF1YWwgdG8gdGhlIG9yaWdpbmFsLgogKiBUaGVyZSBpcyBubyBvdGhlciB3YXkgdG8gY3JlYXRlIG9iamVjdHMgZXF1YWwgdG8gYSBjYXBhYmlsaXR5IG9iamVjdC4KICoKICogQ2FwYWJpbGl0aWVzIGNhbiBiZSB1c2VkIGFzIGFjY2VzcyBndWFyZHM6IEEgcmVtb3RlIGlzb2xhdGUgY2FuIHNlbmQKICogYSByZXF1ZXN0IGZvciBhbiBvcGVyYXRpb24sIGJ1dCBpdCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIHJlcXVlc3QgY29udGFpbnMKICogdGhlIGNvcnJlY3QgY2FwYWJpbGl0eSBvYmplY3QuCiAqCiAqIFRoaXMgYWxsb3dzIGV4cG9zaW5nIHRoZSBzYW1lIGludGVyZmFjZSB0byBtdWx0aXBsZSBjbGllbnRzLAogKiBidXQgcmVzdHJpY3Rpbmcgc29tZSBvcGVyYXRpb25zIHRvIG9ubHkgdGhvc2UgY2xpZW50cwogKiB0aGF0IGhhdmUgYWxzbyBiZWVuIGdpdmVuIHRoZSBjb3JyZXNwb25kaW5nIGNhcGFiaWxpdHkuCiAqCiAqIENhcGFiaWxpdGllcyBjYW4gYmUgdXNlZCBpbnNpZGUgYSBzaW5nbGUgaXNvbGF0ZSwKICogYnV0IHRoZXkgaGF2ZSBubyBhZHZhbnRhZ2Ugb3ZlcgogKiBqdXN0IHVzaW5nIGBuZXcgT2JqZWN0YCB0byBjcmVhdGUgYSB1bmlxdWUgb2JqZWN0LAogKiBhbmQgaXQgb2ZmZXJzIG5vIHJlYWwgc2VjdXJpdHkgYWdhaW5zdCBvdGhlciBjb2RlCiAqIHJ1bm5pbmcgaW4gdGhlIHNhbWUgaXNvbGF0ZS4KICovCmNsYXNzIENhcGFiaWxpdHkgewogIC8qKgogICAqIENyZWF0ZSBhIG5ldyB1bmZvcmdlYWJsZSBjYXBhYmlsaXR5IG9iamVjdC4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IENhcGFiaWxpdHkoKTsKfQokAE5OPAEWAQRMDQNIOUkDSE4iA0A5OwM1IzY1IAQTBjEGIQIBHGRhcnQ6aXNvbGF0ZS9jYXBhYmlsaXR5LmRhcnQqb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL21hdGgvbWF0aC5kYXJ0mUgvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIE1hdGhlbWF0aWNhbCBjb25zdGFudHMgYW5kIGZ1bmN0aW9ucywgcGx1cyBhIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgovLy8KLy8vIFRvIHVzZSB0aGlzIGxpYnJhcnkgaW4geW91ciBjb2RlOgovLy8KLy8vICAgICBpbXBvcnQgJ2RhcnQ6bWF0aCc7Ci8vLwovLy8ge0BjYXRlZ29yeSBDb3JlfQpsaWJyYXJ5IGRhcnQubWF0aDsKCnBhcnQgImplbmtpbnNfc21pX2hhc2guZGFydCI7CnBhcnQgInBvaW50LmRhcnQiOwpwYXJ0ICJyYW5kb20uZGFydCI7CnBhcnQgInJlY3RhbmdsZS5kYXJ0IjsKCi8vLyBCYXNlIG9mIHRoZSBuYXR1cmFsIGxvZ2FyaXRobXMuCi8vLwovLy8gVHlwaWNhbGx5IHdyaXR0ZW4gYXMgImUiLgpjb25zdCBkb3VibGUgZSA9IDIuNzE4MjgxODI4NDU5MDQ1OwoKLy8vIE5hdHVyYWwgbG9nYXJpdGhtIG9mIDEwLgovLy8KLy8vIFRoZSBuYXR1cmFsIGxvZ2FyaXRobSBvZiAxMCBpcyB0aGUgbnVtYmVyIHN1Y2ggdGhhdCBgcG93KEUsIExOMTApID09IDEwYC4KLy8vIFRoaXMgdmFsdWUgaXMgbm90IGV4YWN0LCBidXQgaXQgaXMgdGhlIGNsb3Nlc3QgcmVwcmVzZW50YWJsZSBkb3VibGUgdG8gdGhlCi8vLyBleGFjdCBtYXRoZW1hdGljYWwgdmFsdWUuCmNvbnN0IGRvdWJsZSBsbjEwID0gMi4zMDI1ODUwOTI5OTQwNDY7CgovLy8gTmF0dXJhbCBsb2dhcml0aG0gb2YgMi4KLy8vCi8vLyBUaGUgbmF0dXJhbCBsb2dhcml0aG0gb2YgMiBpcyB0aGUgbnVtYmVyIHN1Y2ggdGhhdCBgcG93KEUsIExOMikgPT0gMmAuCi8vLyBUaGlzIHZhbHVlIGlzIG5vdCBleGFjdCwgYnV0IGl0IGlzIHRoZSBjbG9zZXN0IHJlcHJlc2VudGFibGUgZG91YmxlIHRvIHRoZQovLy8gZXhhY3QgbWF0aGVtYXRpY2FsIHZhbHVlLgpjb25zdCBkb3VibGUgbG4yID0gMC42OTMxNDcxODA1NTk5NDUzOwoKLy8vIEJhc2UtMiBsb2dhcml0aG0gb2YgW2VdLgpjb25zdCBkb3VibGUgbG9nMmUgPSAxLjQ0MjY5NTA0MDg4ODk2MzQ7CgovLy8gQmFzZS0xMCBsb2dhcml0aG0gb2YgW2VdLgpjb25zdCBkb3VibGUgbG9nMTBlID0gMC40MzQyOTQ0ODE5MDMyNTE4OwoKLy8vIFRoZSBQSSBjb25zdGFudC4KY29uc3QgZG91YmxlIHBpID0gMy4xNDE1OTI2NTM1ODk3OTMyOwoKLy8vIFNxdWFyZSByb290IG9mIDEvMi4KY29uc3QgZG91YmxlIHNxcnQxXzIgPSAwLjcwNzEwNjc4MTE4NjU0NzY7CgovLy8gU3F1YXJlIHJvb3Qgb2YgMi4KY29uc3QgZG91YmxlIHNxcnQyID0gMS40MTQyMTM1NjIzNzMwOTUxOwoKLy8vIFJldHVybnMgdGhlIGxlc3NlciBvZiB0d28gbnVtYmVycy4KLy8vCi8vLyBSZXR1cm5zIE5hTiBpZiBlaXRoZXIgYXJndW1lbnQgaXMgTmFOLgovLy8gVGhlIGxlc3NlciBvZiBgLTAuMGAgYW5kIGAwLjBgIGlzIGAtMC4wYC4KLy8vIElmIHRoZSBhcmd1bWVudHMgYXJlIG90aGVyd2lzZSBlcXVhbCAoaW5jbHVkaW5nIGludCBhbmQgZG91YmxlcyB3aXRoIHRoZQovLy8gc2FtZSBtYXRoZW1hdGljYWwgdmFsdWUpIHRoZW4gaXQgaXMgdW5zcGVjaWZpZWQgd2hpY2ggb2YgdGhlIHR3byBhcmd1bWVudHMKLy8vIGlzIHJldHVybmVkLgpleHRlcm5hbCBUIG1pbjxUIGV4dGVuZHMgbnVtPihUIGEsIFQgYik7CgovLy8gUmV0dXJucyB0aGUgbGFyZ2VyIG9mIHR3byBudW1iZXJzLgovLy8KLy8vIFJldHVybnMgTmFOIGlmIGVpdGhlciBhcmd1bWVudCBpcyBOYU4uCi8vLyBUaGUgbGFyZ2VyIG9mIGAtMC4wYCBhbmQgYDAuMGAgaXMgYDAuMGAuIElmIHRoZSBhcmd1bWVudHMgYXJlCi8vLyBvdGhlcndpc2UgZXF1YWwgKGluY2x1ZGluZyBpbnQgYW5kIGRvdWJsZXMgd2l0aCB0aGUgc2FtZSBtYXRoZW1hdGljYWwgdmFsdWUpCi8vLyB0aGVuIGl0IGlzIHVuc3BlY2lmaWVkIHdoaWNoIG9mIHRoZSB0d28gYXJndW1lbnRzIGlzIHJldHVybmVkLgpleHRlcm5hbCBUIG1heDxUIGV4dGVuZHMgbnVtPihUIGEsIFQgYik7CgovLy8gQSB2YXJpYW50IG9mIFthdGFuXS4KLy8vCi8vLyBDb252ZXJ0cyBib3RoIGFyZ3VtZW50cyB0byBbZG91YmxlXXMuCi8vLwovLy8gUmV0dXJucyB0aGUgYW5nbGUgaW4gcmFkaWFucyBiZXR3ZWVuIHRoZSBwb3NpdGl2ZSB4LWF4aXMKLy8vIGFuZCB0aGUgdmVjdG9yIChbYl0sW2FdKS4KLy8vIFRoZSByZXN1bHQgaXMgaW4gdGhlIHJhbmdlIC1QSS4uUEkuCi8vLwovLy8gSWYgW2JdIGlzIHBvc2l0aXZlLCB0aGlzIGlzIHRoZSBzYW1lIGFzIGBhdGFuKGIvYSlgLgovLy8KLy8vIFRoZSByZXN1bHQgaXMgbmVnYXRpdmUgd2hlbiBbYV0gaXMgbmVnYXRpdmUgKGluY2x1ZGluZyB3aGVuIFthXSBpcyB0aGUKLy8vIGRvdWJsZSAtMC4wKS4KLy8vCi8vLyBJZiBbYV0gaXMgZXF1YWwgdG8gemVybywgdGhlIHZlY3RvciAoW2JdLFthXSkgaXMgY29uc2lkZXJlZCBwYXJhbGxlbCB0bwovLy8gdGhlIHgtYXhpcywgZXZlbiBpZiBbYl0gaXMgYWxzbyBlcXVhbCB0byB6ZXJvLiBUaGUgc2lnbiBvZiBbYl0gZGV0ZXJtaW5lcwovLy8gdGhlIGRpcmVjdGlvbiBvZiB0aGUgdmVjdG9yIGFsb25nIHRoZSB4LWF4aXMuCi8vLwovLy8gUmV0dXJucyBOYU4gaWYgZWl0aGVyIGFyZ3VtZW50IGlzIE5hTi4KZXh0ZXJuYWwgZG91YmxlIGF0YW4yKG51bSBhLCBudW0gYik7CgovLy8gUmV0dXJucyBbeF0gdG8gdGhlIHBvd2VyIG9mIFtleHBvbmVudF0uCi8vLwovLy8gSWYgW3hdIGlzIGFuIFtpbnRdIGFuZCBbZXhwb25lbnRdIGlzIGEgbm9uLW5lZ2F0aXZlIFtpbnRdLCB0aGUgcmVzdWx0IGlzCi8vLyBhbiBbaW50XSwgb3RoZXJ3aXNlIGJvdGggYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgdG8gZG91YmxlcyBmaXJzdCwgYW5kIHRoZQovLy8gcmVzdWx0IGlzIGEgW2RvdWJsZV0uCi8vLwovLy8gRm9yIGludGVnZXJzLCB0aGUgcG93ZXIgaXMgYWx3YXlzIGVxdWFsIHRvIHRoZSBtYXRoZW1hdGljYWwgcmVzdWx0IG9mIGB4YCB0bwovLy8gdGhlIHBvd2VyIGBleHBvbmVudGAsIG9ubHkgbGltaXRlZCBieSB0aGUgYXZhaWxhYmxlIG1lbW9yeS4KLy8vCi8vLyBGb3IgZG91YmxlcywgYHBvdyh4LCB5KWAgaGFuZGxlcyBlZGdlIGNhc2VzIGFzIGZvbGxvd3M6Ci8vLwovLy8gLSBpZiBgeWAgaXMgemVybyAoMC4wIG9yIC0wLjApLCB0aGUgcmVzdWx0IGlzIGFsd2F5cyAxLjAuCi8vLyAtIGlmIGB4YCBpcyAxLjAsIHRoZSByZXN1bHQgaXMgYWx3YXlzIDEuMC4KLy8vIC0gb3RoZXJ3aXNlLCBpZiBlaXRoZXIgYHhgIG9yIGB5YCBpcyBOYU4gdGhlbiB0aGUgcmVzdWx0IGlzIE5hTi4KLy8vIC0gaWYgYHhgIGlzIG5lZ2F0aXZlIChidXQgbm90IC0wLjApIGFuZCBgeWAgaXMgYSBmaW5pdGUgbm9uLWludGVnZXIsIHRoZQovLy8gICByZXN1bHQgaXMgTmFOLgovLy8gLSBpZiBgeGAgaXMgSW5maW5pdHkgYW5kIGB5YCBpcyBuZWdhdGl2ZSwgdGhlIHJlc3VsdCBpcyAwLjAuCi8vLyAtIGlmIGB4YCBpcyBJbmZpbml0eSBhbmQgYHlgIGlzIHBvc2l0aXZlLCB0aGUgcmVzdWx0IGlzIEluZmluaXR5LgovLy8gLSBpZiBgeGAgaXMgMC4wIGFuZCBgeWAgaXMgbmVnYXRpdmUsIHRoZSByZXN1bHQgaXMgSW5maW5pdHkuCi8vLyAtIGlmIGB4YCBpcyAwLjAgYW5kIGB5YCBpcyBwb3NpdGl2ZSwgdGhlIHJlc3VsdCBpcyAwLjAuCi8vLyAtIGlmIGB4YCBpcyAtSW5maW5pdHkgb3IgLTAuMCBhbmQgYHlgIGlzIGFuIG9kZCBpbnRlZ2VyLCB0aGVuIHRoZSByZXN1bHQgaXMKLy8vICAgYC1wb3coLXggLHkpYC4KLy8vIC0gaWYgYHhgIGlzIC1JbmZpbml0eSBvciAtMC4wIGFuZCBgeWAgaXMgbm90IGFuIG9kZCBpbnRlZ2VyLCB0aGVuIHRoZSByZXN1bHQKLy8vICAgaXMgdGhlIHNhbWUgYXMgYHBvdygteCAsIHkpYC4KLy8vIC0gaWYgYHlgIGlzIEluZmluaXR5IGFuZCB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgYHhgIGlzIGxlc3MgdGhhbiAxLCB0aGUKLy8vICAgcmVzdWx0IGlzIDAuMC4KLy8vIC0gaWYgYHlgIGlzIEluZmluaXR5IGFuZCBgeGAgaXMgLTEsIHRoZSByZXN1bHQgaXMgMS4wLgovLy8gLSBpZiBgeWAgaXMgSW5maW5pdHkgYW5kIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBgeGAgaXMgZ3JlYXRlciB0aGFuIDEsCi8vLyAgIHRoZSByZXN1bHQgaXMgSW5maW5pdHkuCi8vLyAtIGlmIGB5YCBpcyAtSW5maW5pdHksIHRoZSByZXN1bHQgaXMgYDEvcG93KHgsIEluZmluaXR5KWAuCi8vLwovLy8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYHBvd2AgZnVuY3Rpb24gZGVmaW5lZCBpbiB0aGUgSUVFRSBTdGFuZGFyZAovLy8gNzU0LTIwMDguCi8vLwovLy8gTm90aWNlIHRoYXQgdGhlIHJlc3VsdCBtYXkgb3ZlcmZsb3cuIElmIGludGVnZXJzIGFyZSByZXByZXNlbnRlZCBhcyA2NC1iaXQKLy8vIG51bWJlcnMsIGFuIGludGVnZXIgcmVzdWx0IG1heSBiZSB0cnVuY2F0ZWQsIGFuZCBhIGRvdWJsZSByZXN1bHQgbWF5Ci8vLyBvdmVyZmxvdyB0byBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBbZG91YmxlLmluZmluaXR5XS4KZXh0ZXJuYWwgbnVtIHBvdyhudW0geCwgbnVtIGV4cG9uZW50KTsKCi8vLyBDb252ZXJ0cyBbcmFkaWFuc10gdG8gYSBbZG91YmxlXSBhbmQgcmV0dXJucyB0aGUgc2luZSBvZiB0aGUgdmFsdWUuCi8vLwovLy8gSWYgW3JhZGlhbnNdIGlzIG5vdCBhIGZpbml0ZSBudW1iZXIsIHRoZSByZXN1bHQgaXMgTmFOLgpleHRlcm5hbCBkb3VibGUgc2luKG51bSByYWRpYW5zKTsKCi8vLyBDb252ZXJ0cyBbcmFkaWFuc10gdG8gYSBbZG91YmxlXSBhbmQgcmV0dXJucyB0aGUgY29zaW5lIG9mIHRoZSB2YWx1ZS4KLy8vCi8vLyBJZiBbcmFkaWFuc10gaXMgbm90IGEgZmluaXRlIG51bWJlciwgdGhlIHJlc3VsdCBpcyBOYU4uCmV4dGVybmFsIGRvdWJsZSBjb3MobnVtIHJhZGlhbnMpOwoKLy8vIENvbnZlcnRzIFtyYWRpYW5zXSB0byBhIFtkb3VibGVdIGFuZCByZXR1cm5zIHRoZSB0YW5nZW50IG9mIHRoZSB2YWx1ZS4KLy8vCi8vLyBUaGUgdGFuZ2VudCBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGBzaW4ocmFkaWFucykvY29zKHJhZGlhbnMpYCBhbmQgbWF5IGJlCi8vLyBpbmZpbml0ZSAocG9zaXRpdmUgb3IgbmVnYXRpdmUpIHdoZW4gYGNvcyhyYWRpYW5zKWAgaXMgZXF1YWwgdG8gemVyby4KLy8vIElmIFtyYWRpYW5zXSBpcyBub3QgYSBmaW5pdGUgbnVtYmVyLCB0aGUgcmVzdWx0IGlzIE5hTi4KZXh0ZXJuYWwgZG91YmxlIHRhbihudW0gcmFkaWFucyk7CgovLy8gQ29udmVydHMgW3hdIHRvIGEgW2RvdWJsZV0gYW5kIHJldHVybnMgaXRzIGFyYyBjb3NpbmUgaW4gcmFkaWFucy4KLy8vCi8vLyBSZXR1cm5zIGEgdmFsdWUgaW4gdGhlIHJhbmdlIDAuLlBJLCBvciBOYU4gaWYgW3hdIGlzIG91dHNpZGUKLy8vIHRoZSByYW5nZSAtMS4uMS4KZXh0ZXJuYWwgZG91YmxlIGFjb3MobnVtIHgpOwoKLy8vIENvbnZlcnRzIFt4XSB0byBhIFtkb3VibGVdIGFuZCByZXR1cm5zIGl0cyBhcmMgc2luZSBpbiByYWRpYW5zLgovLy8KLy8vIFJldHVybnMgYSB2YWx1ZSBpbiB0aGUgcmFuZ2UgLVBJLzIuLlBJLzIsIG9yIE5hTiBpZiBbeF0gaXMgb3V0c2lkZQovLy8gdGhlIHJhbmdlIC0xLi4xLgpleHRlcm5hbCBkb3VibGUgYXNpbihudW0geCk7CgovLy8gQ29udmVydHMgW3hdIHRvIGEgW2RvdWJsZV0gYW5kIHJldHVybnMgaXRzIGFyYyB0YW5nZW50IGluIHJhZGlhbnMuCi8vLwovLy8gUmV0dXJucyBhIHZhbHVlIGluIHRoZSByYW5nZSAtUEkvMi4uUEkvMiwgb3IgTmFOIGlmIFt4XSBpcyBOYU4uCmV4dGVybmFsIGRvdWJsZSBhdGFuKG51bSB4KTsKCi8vLyBDb252ZXJ0cyBbeF0gdG8gYSBbZG91YmxlXSBhbmQgcmV0dXJucyB0aGUgcG9zaXRpdmUgc3F1YXJlIHJvb3Qgb2YgdGhlCi8vLyB2YWx1ZS4KLy8vCi8vLyBSZXR1cm5zIC0wLjAgaWYgW3hdIGlzIC0wLjAsIGFuZCBOYU4gaWYgW3hdIGlzIG90aGVyd2lzZSBuZWdhdGl2ZSBvciBOYU4uCmV4dGVybmFsIGRvdWJsZSBzcXJ0KG51bSB4KTsKCi8vLyBDb252ZXJ0cyBbeF0gdG8gYSBbZG91YmxlXSBhbmQgcmV0dXJucyB0aGUgbmF0dXJhbCBleHBvbmVudCwgW2VdLAovLy8gdG8gdGhlIHBvd2VyIFt4XS4KLy8vCi8vLyBSZXR1cm5zIE5hTiBpZiBbeF0gaXMgTmFOLgpleHRlcm5hbCBkb3VibGUgZXhwKG51bSB4KTsKCi8vLyBDb252ZXJ0cyBbeF0gdG8gYSBbZG91YmxlXSBhbmQgcmV0dXJucyB0aGUgbmF0dXJhbCBsb2dhcml0aG0gb2YgdGhlIHZhbHVlLgovLy8KLy8vIFJldHVybnMgbmVnYXRpdmUgaW5maW5pdHkgaWYgW3hdIGlzIGVxdWFsIHRvIHplcm8uCi8vLyBSZXR1cm5zIE5hTiBpZiBbeF0gaXMgTmFOIG9yIGxlc3MgdGhhbiB6ZXJvLgpleHRlcm5hbCBkb3VibGUgbG9nKG51bSB4KTsKgLUATk48AUoEJgQcBBUTAR4TFBcBJAQeJAEdBE5PHicBHARLTx4nAR0pAR4qARUmARgrARYpAScEKy5NTxEpAScEK0JRQykBGQQqBD0eKAQ5BEsSBExOMgQrJQEsBE1PGgRRQAQ8BD4vRU0VQUZBPFAVUSRLFTtKHj8ESA4ET0k4JwFIBDwiAUoEPCIBSwRRSjwiAUYEQRUdAUQERxUdAUcERB0BSwsETh0BRhYEHxwBTwQ3MRwBCWRhcnQ6bWF0aC9vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL21hdGhfcGF0Y2guZGFydKPQLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBOb3RlOiB0aGUgVk0gY29uY2F0ZW5hdGVzIGFsbCBwYXRjaCBmaWxlcyBpbnRvIGEgc2luZ2xlIHBhdGNoIGZpbGUuIFRoaXMKLy8vIGZpbGUgaXMgdGhlIGZpcnN0IHBhdGNoIGluICJkYXJ0Om1hdGgiIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgaW1wb3J0cyB1c2VkCi8vLyBieSBwYXRjaGVzIG9mIHRoYXQgbGlicmFyeS4gV2UgcGxhbiB0byBjaGFuZ2UgdGhpcyB3aGVuIHdlIGhhdmUgYSBzaGFyZWQKLy8vIGZyb250IGVuZCBhbmQgc2ltcGx5IHVzZSBwYXJ0cy4KCmltcG9ydCAiZGFydDpfaW50ZXJuYWwiIHNob3cgcGF0Y2g7CgppbXBvcnQgImRhcnQ6dHlwZWRfZGF0YSIgc2hvdyBVaW50MzJMaXN0OwoKLy8vIFRoZXJlIGFyZSBubyBwYXJ0cyBvZiB0aGlzIHBhdGNoIGxpYnJhcnkuCgpAcGF0Y2gKVCBtaW48VCBleHRlbmRzIG51bT4oVCBhLCBUIGIpIHsKICAvLyBUaGVzZSBwYXJ0aWFsbHkgcmVkdW5kYW50IHR5cGUgY2hlY2tzIGltcHJvdmUgY29kZSBxdWFsaXR5IGZvciBkYXJ0MmpzLgogIC8vIE1vc3Qgb2YgdGhlIGltcHJvdmVtZW50IGlzIGF0IGNhbGwgc2l0ZXMgZnJvbSB0aGUgaW5mZXJyZWQgbm9uLW51bGwgbnVtCiAgLy8gcmV0dXJuIHR5cGUuCiAgaWYgKGEgaXMhIG51bSkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoYSk7CiAgaWYgKGIgaXMhIG51bSkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoYik7CgogIGlmIChhID4gYikgcmV0dXJuIGI7CiAgaWYgKGEgPCBiKSByZXR1cm4gYTsKICBpZiAoYiBpcyBkb3VibGUpIHsKICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgTmFOIGFuZCAtMC4wLiBJZiBvbmUgYXJndW1lbnQgaXMgTmFOIHJldHVybiBOYU4uCiAgICAvLyBbbWluXSBtdXN0IGFsc28gZGlzdGluZ3Vpc2ggYmV0d2VlbiAtMC4wIGFuZCAwLjAuCiAgICBpZiAoYSBpcyBkb3VibGUpIHsKICAgICAgaWYgKGEgPT0gMC4wKSB7CiAgICAgICAgLy8gYSBpcyBlaXRoZXIgMC4wIG9yIC0wLjAuIGIgaXMgZWl0aGVyIDAuMCwgLTAuMCBvciBOYU4uCiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyByZXR1cm5zIC0wLjAgaWYgZWl0aGVyIGEgb3IgYiBpcyAtMC4wLCBhbmQgaXQKICAgICAgICAvLyByZXR1cm5zIE5hTiBpZiBiIGlzIE5hTi4KICAgICAgICBudW0gbiA9IChhICsgYikgKiBhICogYjsKICAgICAgICByZXR1cm4gbjsKICAgICAgfQogICAgfQogICAgLy8gQ2hlY2sgZm9yIE5hTiBhbmQgYiA9PSAtMC4wLgogICAgaWYgKGEgPT0gMCAmJiBiLmlzTmVnYXRpdmUgfHwgYi5pc05hTikgcmV0dXJuIGI7CiAgICByZXR1cm4gYTsKICB9CiAgcmV0dXJuIGE7Cn0KCkBwYXRjaApUIG1heDxUIGV4dGVuZHMgbnVtPihUIGEsIFQgYikgewogIC8vIFRoZXNlIHBhcnRpYWxseSByZWR1bmRhbnQgdHlwZSBjaGVja3MgaW1wcm92ZSBjb2RlIHF1YWxpdHkgZm9yIGRhcnQyanMuCiAgLy8gTW9zdCBvZiB0aGUgaW1wcm92ZW1lbnQgaXMgYXQgY2FsbCBzaXRlcyBmcm9tIHRoZSBpbmZlcnJlZCBub24tbnVsbCBudW0KICAvLyByZXR1cm4gdHlwZS4KICBpZiAoYSBpcyEgbnVtKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihhKTsKICBpZiAoYiBpcyEgbnVtKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihiKTsKCiAgaWYgKGEgPiBiKSByZXR1cm4gYTsKICBpZiAoYSA8IGIpIHJldHVybiBiOwogIGlmIChiIGlzIGRvdWJsZSkgewogICAgLy8gU3BlY2lhbCBjYXNlIGZvciBOYU4gYW5kIC0wLjAuIElmIG9uZSBhcmd1bWVudCBpcyBOYU4gcmV0dXJuIE5hTi4KICAgIC8vIFttYXhdIG11c3QgYWxzbyBkaXN0aW5ndWlzaCBiZXR3ZWVuIC0wLjAgYW5kIDAuMC4KICAgIGlmIChhIGlzIGRvdWJsZSkgewogICAgICBpZiAoYSA9PSAwLjApIHsKICAgICAgICAvLyBhIGlzIGVpdGhlciAwLjAgb3IgLTAuMC4gYiBpcyBlaXRoZXIgMC4wLCAtMC4wLCBvciBOYU4uCiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyByZXR1cm5zIDAuMCBpZiBlaXRoZXIgYSBvciBiIGlzIDAuMCwgYW5kIGl0CiAgICAgICAgLy8gcmV0dXJucyBOYU4gaWYgYiBpcyBOYU4uCiAgICAgICAgbnVtIG4gPSBhICsgYjsKICAgICAgICByZXR1cm4gbjsKICAgICAgfQogICAgfQogICAgLy8gQ2hlY2sgZm9yIE5hTi4KICAgIGlmIChiLmlzTmFOKSByZXR1cm4gYjsKICAgIHJldHVybiBhOwogIH0KICAvLyBtYXgoLTAuMCwgMCkgbXVzdCByZXR1cm4gMC4KICBpZiAoYiA9PSAwICYmIGEuaXNOZWdhdGl2ZSkgcmV0dXJuIGI7CiAgcmV0dXJuIGE7Cn0KCi8vIElmIFt4XSBpcyBhbiBbaW50XSBhbmQgW2V4cG9uZW50XSBpcyBhIG5vbi1uZWdhdGl2ZSBbaW50XSwgdGhlIHJlc3VsdCBpcwovLyBhbiBbaW50XSwgb3RoZXJ3aXNlIHRoZSByZXN1bHQgaXMgYSBbZG91YmxlXS4KQHBhdGNoCm51bSBwb3cobnVtIHgsIG51bSBleHBvbmVudCkgewogIGlmICgoeCBpcyBpbnQpICYmIChleHBvbmVudCBpcyBpbnQpICYmIChleHBvbmVudCA+PSAwKSkgewogICAgcmV0dXJuIF9pbnRQb3coeCwgZXhwb25lbnQpOwogIH0KICByZXR1cm4gX2RvdWJsZVBvdyh4LnRvRG91YmxlKCksIGV4cG9uZW50LnRvRG91YmxlKCkpOwp9CgpAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX0RvdWJsZSIpCmRvdWJsZSBfZG91YmxlUG93KGRvdWJsZSBiYXNlLCBkb3VibGUgZXhwb25lbnQpIHsKICBpZiAoZXhwb25lbnQgPT0gMC4wKSB7CiAgICByZXR1cm4gMS4wOyAvLyBFQ01BLTI2MiAxNS44LjIuMTMKICB9CiAgLy8gU3BlZWQgdXAgc2ltcGxlIGNhc2VzLgogIGlmIChleHBvbmVudCA9PSAxLjApIHJldHVybiBiYXNlOwogIGlmIChleHBvbmVudCA9PSAyLjApIHJldHVybiBiYXNlICogYmFzZTsKICBpZiAoZXhwb25lbnQgPT0gMy4wKSByZXR1cm4gYmFzZSAqIGJhc2UgKiBiYXNlOwoKICBpZiAoYmFzZSA9PSAxLjApIHJldHVybiAxLjA7CgogIGlmIChiYXNlLmlzTmFOIHx8IGV4cG9uZW50LmlzTmFOKSB7CiAgICByZXR1cm4gZG91YmxlLm5hbjsKICB9CiAgaWYgKChiYXNlICE9IC1kb3VibGUuaW5maW5pdHkpICYmIChleHBvbmVudCA9PSAwLjUpKSB7CiAgICBpZiAoYmFzZSA9PSAwLjApIHsKICAgICAgcmV0dXJuIDAuMDsKICAgIH0KICAgIHJldHVybiBzcXJ0KGJhc2UpOwogIH0KICByZXR1cm4gX3BvdyhiYXNlLnRvRG91YmxlKCksIGV4cG9uZW50LnRvRG91YmxlKCkpOwp9Cgpkb3VibGUgX3Bvdyhkb3VibGUgYmFzZSwgZG91YmxlIGV4cG9uZW50KSBuYXRpdmUgIk1hdGhfZG91YmxlUG93IjsKCmludCBfaW50UG93KGludCBiYXNlLCBpbnQgZXhwb25lbnQpIHsKICAvLyBFeHBvbmVudGlhdGlvbiBieSBzcXVhcmluZy4KICBpbnQgcmVzdWx0ID0gMTsKICB3aGlsZSAoZXhwb25lbnQgIT0gMCkgewogICAgaWYgKChleHBvbmVudCAmIDEpID09IDEpIHsKICAgICAgcmVzdWx0ICo9IGJhc2U7CiAgICB9CiAgICBleHBvbmVudCA+Pj0gMTsKICAgIC8vIFNraXAgdW5uZWNlc3Nhcnkgb3BlcmF0aW9uIChjYW4gb3ZlcmZsb3cgdG8gTWludCkuCiAgICBpZiAoZXhwb25lbnQgIT0gMCkgewogICAgICBiYXNlICo9IGJhc2U7CiAgICB9CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KCkBwYXRjaApAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX0RvdWJsZSIpCmRvdWJsZSBhdGFuMihudW0gYSwgbnVtIGIpID0+IF9hdGFuMihhLnRvRG91YmxlKCksIGIudG9Eb3VibGUoKSk7CkBwYXRjaApAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX0RvdWJsZSIpCmRvdWJsZSBzaW4obnVtIHJhZGlhbnMpID0+IF9zaW4ocmFkaWFucy50b0RvdWJsZSgpKTsKQHBhdGNoCkBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfRG91YmxlIikKZG91YmxlIGNvcyhudW0gcmFkaWFucykgPT4gX2NvcyhyYWRpYW5zLnRvRG91YmxlKCkpOwpAcGF0Y2gKQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19Eb3VibGUiKQpkb3VibGUgdGFuKG51bSByYWRpYW5zKSA9PiBfdGFuKHJhZGlhbnMudG9Eb3VibGUoKSk7CkBwYXRjaApAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX0RvdWJsZSIpCmRvdWJsZSBhY29zKG51bSB4KSA9PiBfYWNvcyh4LnRvRG91YmxlKCkpOwpAcGF0Y2gKQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19Eb3VibGUiKQpkb3VibGUgYXNpbihudW0geCkgPT4gX2FzaW4oeC50b0RvdWJsZSgpKTsKQHBhdGNoCkBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfRG91YmxlIikKZG91YmxlIGF0YW4obnVtIHgpID0+IF9hdGFuKHgudG9Eb3VibGUoKSk7CkBwYXRjaApAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX0RvdWJsZSIpCmRvdWJsZSBzcXJ0KG51bSB4KSA9PiBfc3FydCh4LnRvRG91YmxlKCkpOwpAcGF0Y2gKZG91YmxlIGV4cChudW0geCkgPT4gX2V4cCh4LnRvRG91YmxlKCkpOwpAcGF0Y2gKZG91YmxlIGxvZyhudW0geCkgPT4gX2xvZyh4LnRvRG91YmxlKCkpOwoKZG91YmxlIF9hdGFuMihkb3VibGUgYSwgZG91YmxlIGIpIG5hdGl2ZSAiTWF0aF9hdGFuMiI7CmRvdWJsZSBfc2luKGRvdWJsZSB4KSBuYXRpdmUgIk1hdGhfc2luIjsKZG91YmxlIF9jb3MoZG91YmxlIHgpIG5hdGl2ZSAiTWF0aF9jb3MiOwpkb3VibGUgX3Rhbihkb3VibGUgeCkgbmF0aXZlICJNYXRoX3RhbiI7CmRvdWJsZSBfYWNvcyhkb3VibGUgeCkgbmF0aXZlICJNYXRoX2Fjb3MiOwpkb3VibGUgX2FzaW4oZG91YmxlIHgpIG5hdGl2ZSAiTWF0aF9hc2luIjsKZG91YmxlIF9hdGFuKGRvdWJsZSB4KSBuYXRpdmUgIk1hdGhfYXRhbiI7CmRvdWJsZSBfc3FydChkb3VibGUgeCkgbmF0aXZlICJNYXRoX3NxcnQiOwpkb3VibGUgX2V4cChkb3VibGUgeCkgbmF0aXZlICJNYXRoX2V4cCI7CmRvdWJsZSBfbG9nKGRvdWJsZSB4KSBuYXRpdmUgIk1hdGhfbG9nIjsKCi8vIFRPRE8oaXBvc3ZhKTogSGFuZGxlIHBhdGNoIG1ldGhvZHMgd2l0aGluIGEgcGF0Y2ggY2xhc3MgY29ycmVjdGx5LgpAcGF0Y2gKY2xhc3MgUmFuZG9tIHsKICBAcGF0Y2gKICBmYWN0b3J5IFJhbmRvbShbaW50IHNlZWRdKSB7CiAgICB2YXIgc3RhdGUgPSBfUmFuZG9tLl9zZXR1cFNlZWQoKHNlZWQgPT0gbnVsbCkgPyBfUmFuZG9tLl9uZXh0U2VlZCgpIDogc2VlZCk7CiAgICAvLyBDcmFuayBhIGNvdXBsZSBvZiB0aW1lcyB0byBkaXN0cmlidXRlIHRoZSBzZWVkIGJpdHMgYSBiaXQgZnVydGhlci4KICAgIHJldHVybiBuZXcgX1JhbmRvbS5fd2l0aFN0YXRlKHN0YXRlKQogICAgICAuLl9uZXh0U3RhdGUoKQogICAgICAuLl9uZXh0U3RhdGUoKQogICAgICAuLl9uZXh0U3RhdGUoKQogICAgICAuLl9uZXh0U3RhdGUoKTsKICB9CgogIEBwYXRjaAogIGZhY3RvcnkgUmFuZG9tLnNlY3VyZSgpIHsKICAgIHJldHVybiBuZXcgX1NlY3VyZVJhbmRvbSgpOwogIH0KfQoKY2xhc3MgX1JhbmRvbSBpbXBsZW1lbnRzIFJhbmRvbSB7CiAgLy8gSW50ZXJuYWwgc3RhdGUgb2YgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBmaW5hbCBVaW50MzJMaXN0IF9zdGF0ZTsKICBzdGF0aWMgY29uc3QgX2tTVEFURV9MTyA9IDA7CiAgc3RhdGljIGNvbnN0IF9rU1RBVEVfSEkgPSAxOyAvLyBVbnVzZWQgaW4gRGFydCBjb2RlLgoKICBfUmFuZG9tLl93aXRoU3RhdGUodGhpcy5fc3RhdGUpOwoKICAvLyBUaGUgYWxnb3JpdGhtIHVzZWQgaGVyZSBpcyBNdWx0aXBseSB3aXRoIENhcnJ5IChNV0MpIHdpdGggYSBCYXNlIGIgPSAyXjMyLgogIC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTXVsdGlwbHktd2l0aC1jYXJyeQogIC8vIFRoZSBjb25zdGFudCBBIGlzIHNlbGVjdGVkIGZyb20gIk51bWVyaWNhbCBSZWNpcGVzIDNyZCBFZGl0aW9uIiBwLjM0OCBCMS4KCiAgLy8gSW1wbGVtZW50czoKICAvLyAgIGNvbnN0IF9BID0gMHhmZmZmZGE2MTsKICAvLyAgIHZhciBzdGF0ZSA9CiAgLy8gICAgICAgKChfQSAqIChfc3RhdGVbX2tTVEFURV9MT10pKSArIF9zdGF0ZVtfa1NUQVRFX0hJXSkgJiAoKDEgPDwgNjQpIC0gMSk7CiAgLy8gICBfc3RhdGVbX2tTVEFURV9MT10gPSBzdGF0ZSAmICgoMSA8PCAzMikgLSAxKTsKICAvLyAgIF9zdGF0ZVtfa1NUQVRFX0hJXSA9IHN0YXRlID4+IDMyOwogIC8vIFRoaXMgaXMgYSBuYXRpdmUgdG8gcHJldmVudCA2NC1iaXQgb3BlcmF0aW9ucyBpbiBEYXJ0LCB3aGljaAogIC8vIGZhaWwgd2l0aCAtLXRocm93X29uX2phdmFzY3JpcHRfaW50X292ZXJmbG93LgogIC8vIFRPRE8ocmVnaXMpOiBJbXBsZW1lbnQgaW4gRGFydCBhbmQgcmVtb3ZlIFJhbmRvbV9uZXh0U3RhdGUgaW4gbWF0aC5jYy4KICB2b2lkIF9uZXh0U3RhdGUoKSBuYXRpdmUgIlJhbmRvbV9uZXh0U3RhdGUiOwoKICBpbnQgbmV4dEludChpbnQgbWF4KSB7CiAgICBjb25zdCBsaW1pdCA9IDB4M0ZGRkZGRkY7CiAgICBpZiAoKG1heCA8PSAwKSB8fCAoKG1heCA+IGxpbWl0KSAmJiAobWF4ID4gX1BPVzJfMzIpKSkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZSgKICAgICAgICAgIG1heCwgMSwgX1BPVzJfMzIsICJtYXgiLCAiTXVzdCBiZSBwb3NpdGl2ZSBhbmQgPD0gMl4zMiIpOwogICAgfQogICAgaWYgKChtYXggJiAtbWF4KSA9PSBtYXgpIHsKICAgICAgLy8gRmFzdCBjYXNlIGZvciBwb3dlcnMgb2YgdHdvLgogICAgICBfbmV4dFN0YXRlKCk7CiAgICAgIHJldHVybiBfc3RhdGVbX2tTVEFURV9MT10gJiAobWF4IC0gMSk7CiAgICB9CgogICAgdmFyIHJuZDMyOwogICAgdmFyIHJlc3VsdDsKICAgIGRvIHsKICAgICAgX25leHRTdGF0ZSgpOwogICAgICBybmQzMiA9IF9zdGF0ZVtfa1NUQVRFX0xPXTsKICAgICAgcmVzdWx0ID0gcm5kMzIgJSBtYXg7CiAgICB9IHdoaWxlICgocm5kMzIgLSByZXN1bHQgKyBtYXgpID4gX1BPVzJfMzIpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGRvdWJsZSBuZXh0RG91YmxlKCkgewogICAgcmV0dXJuICgobmV4dEludCgxIDw8IDI2KSAqIF9QT1cyXzI3X0QpICsgbmV4dEludCgxIDw8IDI3KSkgLyBfUE9XMl81M19EOwogIH0KCiAgYm9vbCBuZXh0Qm9vbCgpIHsKICAgIHJldHVybiBuZXh0SW50KDIpID09IDA7CiAgfQoKICAvLyBDb25zdGFudHMgdXNlZCBieSB0aGUgYWxnb3JpdGhtLgogIHN0YXRpYyBjb25zdCBfUE9XMl8zMiA9IDEgPDwgMzI7CiAgc3RhdGljIGNvbnN0IF9QT1cyXzUzX0QgPSAxLjAgKiAoMSA8PCA1Myk7CiAgc3RhdGljIGNvbnN0IF9QT1cyXzI3X0QgPSAxLjAgKiAoMSA8PCAyNyk7CgogIC8vIFVzZSBhIHNpbmdsZXRvbiBSYW5kb20gb2JqZWN0IHRvIGdldCBhIG5ldyBzZWVkIGlmIG5vIHNlZWQgd2FzIHBhc3NlZC4KICBzdGF0aWMgZmluYWwgX3BybmcgPSBuZXcgX1JhbmRvbS5fd2l0aFN0YXRlKF9pbml0aWFsU2VlZCgpKTsKCiAgLy8gVGhpcyBpcyBhIG5hdGl2ZSB0byBwcmV2ZW50IDY0LWJpdCBvcGVyYXRpb25zIGluIERhcnQsIHdoaWNoCiAgLy8gZmFpbCB3aXRoIC0tdGhyb3dfb25famF2YXNjcmlwdF9pbnRfb3ZlcmZsb3cuCiAgLy8gVE9ETyhyZWdpcyk6IEltcGxlbWVudCBoZXJlIGluIERhcnQgYW5kIHJlbW92ZSBuYXRpdmUgaW4gbWF0aC5jYy4KICBzdGF0aWMgVWludDMyTGlzdCBfc2V0dXBTZWVkKGludCBzZWVkKSBuYXRpdmUgIlJhbmRvbV9zZXR1cFNlZWQiOwogIC8vIEdldCBhIHNlZWQgZnJvbSB0aGUgVk0ncyByYW5kb20gbnVtYmVyIHByb3ZpZGVyLgogIHN0YXRpYyBVaW50MzJMaXN0IF9pbml0aWFsU2VlZCgpIG5hdGl2ZSAiUmFuZG9tX2luaXRpYWxTZWVkIjsKCiAgc3RhdGljIGludCBfbmV4dFNlZWQoKSB7CiAgICAvLyBUcmlnZ2VyIHRoZSBQUk5HIG9uY2UgdG8gY2hhbmdlIHRoZSBpbnRlcm5hbCBzdGF0ZS4KICAgIF9wcm5nLl9uZXh0U3RhdGUoKTsKICAgIHJldHVybiBfcHJuZy5fc3RhdGVbX2tTVEFURV9MT107CiAgfQp9CgpjbGFzcyBfU2VjdXJlUmFuZG9tIGltcGxlbWVudHMgUmFuZG9tIHsKICBfU2VjdXJlUmFuZG9tKCkgewogICAgLy8gVGhyb3cgZWFybHkgaW4gY29uc3RydWN0b3IgaWYgZW50cm9weSBzb3VyY2UgaXMgbm90IGhvb2tlZCB1cC4KICAgIF9nZXRCeXRlcygxKTsKICB9CgogIC8vIFJldHVybiBjb3VudCBieXRlcyBvZiBlbnRyb3B5IGFzIGEgcG9zaXRpdmUgaW50ZWdlcjsgY291bnQgPD0gOC4KICBzdGF0aWMgaW50IF9nZXRCeXRlcyhpbnQgY291bnQpIG5hdGl2ZSAiU2VjdXJlUmFuZG9tX2dldEJ5dGVzIjsKCiAgaW50IG5leHRJbnQoaW50IG1heCkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbHVlSW5JbnRlcnZhbCgKICAgICAgICBtYXgsIDEsIF9QT1cyXzMyLCAibWF4IiwgIk11c3QgYmUgcG9zaXRpdmUgYW5kIDw9IDJeMzIiKTsKICAgIGZpbmFsIGJ5dGVDb3VudCA9ICgobWF4IC0gMSkuYml0TGVuZ3RoICsgNykgPj4gMzsKICAgIGlmIChieXRlQ291bnQgPT0gMCkgewogICAgICByZXR1cm4gMDsgLy8gTm90IHJhbmRvbSBpZiBtYXggPT0gMS4KICAgIH0KICAgIHZhciBybmQ7CiAgICB2YXIgcmVzdWx0OwogICAgZG8gewogICAgICBybmQgPSBfZ2V0Qnl0ZXMoYnl0ZUNvdW50KTsKICAgICAgcmVzdWx0ID0gcm5kICUgbWF4OwogICAgfSB3aGlsZSAoKHJuZCAtIHJlc3VsdCArIG1heCkgPiAoMSA8PCAoYnl0ZUNvdW50IDw8IDMpKSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgZG91YmxlIG5leHREb3VibGUoKSB7CiAgICByZXR1cm4gKF9nZXRCeXRlcyg3KSA+PiAzKSAvIF9QT1cyXzUzX0Q7CiAgfQoKICBib29sIG5leHRCb29sKCkgewogICAgcmV0dXJuIF9nZXRCeXRlcygxKS5pc0V2ZW47CiAgfQoKICAvLyBDb25zdGFudHMgdXNlZCBieSB0aGUgYWxnb3JpdGhtLgogIHN0YXRpYyBjb25zdCBfUE9XMl8zMiA9IDEgPDwgMzI7CiAgc3RhdGljIGNvbnN0IF9QT1cyXzUzX0QgPSAxLjAgKiAoMSA8PCA1Myk7Cn0KgS4ATk48AU1PTSQBJAEqAS4BByFNTRItLQEXFxVJORcWQkckIRIIBiQ1DgQMAgEHIU1NEi0tARcXFUk5FxZDRSQXEggGFhsOBCEoDAIBTDEHHzwhBDgCATUyGSYEHCQrMgEfASYXBDkXEgYXBDUCAUMBJiESGh8WBhQ6GRQGBBECAQc1Qgc1NQc1NQc1NQc1Kwc1Kwc1Kwc1KwcpBykBNykpKSsrKyspKQFGBw8JH1FKKRUVFRYEAQkcIAQCASI0HBsfNwEjAVA2TwERHhNRNSlCM0wvARkePSJEBh8mFC0GAQ8QCRQiHDETBAEYTgQBFBwEASYjLS0BTD8BQjNHRDZAARs7GCUEAgEoFEYSBAFGQgEZJUI2GisGDRAJIho+EwQBGC0EARQgBAEmIy0CAR9kYXJ0Om1hdGgtcGF0Y2gvbWF0aF9wYXRjaC5kYXJ0Nm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9tYXRoL2plbmtpbnNfc21pX2hhc2guZGFydIUzLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KcGFydCBvZiBkYXJ0Lm1hdGg7CgovLy8gVGhpcyBpcyB0aGUgW0plbmtpbnMgaGFzaCBmdW5jdGlvbl1bMV0gYnV0IHVzaW5nIG1hc2tpbmcgdG8ga2VlcAovLy8gdmFsdWVzIGluIFNNSSByYW5nZS4KLy8vCi8vLyBbMV06IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSmVua2luc19oYXNoX2Z1bmN0aW9uCi8vLwovLy8gVXNlOgovLy8gSGFzaCBlYWNoIHZhbHVlIHdpdGggdGhlIGhhc2ggb2YgdGhlIHByZXZpb3VzIHZhbHVlLCB0aGVuIGdldCB0aGUgZmluYWwKLy8vIGhhc2ggYnkgY2FsbGluZyBmaW5pc2guCi8vLwovLy8gICAgIHZhciBoYXNoID0gMDsKLy8vICAgICBmb3IgKHZhciB2YWx1ZSBpbiB2YWx1ZXMpIHsKLy8vICAgICAgIGhhc2ggPSBKZW5raW5zU21pSGFzaC5jb21iaW5lKGhhc2gsIHZhbHVlLmhhc2hDb2RlKTsKLy8vICAgICB9Ci8vLyAgICAgaGFzaCA9IEplbmtpbnNTbWlIYXNoLmZpbmlzaChoYXNoKTsKY2xhc3MgX0plbmtpbnNTbWlIYXNoIHsKICAvLyBUT0RPKDExNjE3KTogVGhpcyBjbGFzcyBzaG91bGQgYmUgb3B0aW1pemVkIGFuZCBzdGFuZGFyZGl6ZWQgZWxzZXdoZXJlLgoKICBzdGF0aWMgaW50IGNvbWJpbmUoaW50IGhhc2gsIGludCB2YWx1ZSkgewogICAgaGFzaCA9IDB4MWZmZmZmZmYgJiAoaGFzaCArIHZhbHVlKTsKICAgIGhhc2ggPSAweDFmZmZmZmZmICYgKGhhc2ggKyAoKDB4MDAwN2ZmZmYgJiBoYXNoKSA8PCAxMCkpOwogICAgcmV0dXJuIGhhc2ggXiAoaGFzaCA+PiA2KTsKICB9CgogIHN0YXRpYyBpbnQgZmluaXNoKGludCBoYXNoKSB7CiAgICBoYXNoID0gMHgxZmZmZmZmZiAmIChoYXNoICsgKCgweDAzZmZmZmZmICYgaGFzaCkgPDwgMykpOwogICAgaGFzaCA9IGhhc2ggXiAoaGFzaCA+PiAxMSk7CiAgICByZXR1cm4gMHgxZmZmZmZmZiAmIChoYXNoICsgKCgweDAwMDAzZmZmICYgaGFzaCkgPDwgMTUpKTsKICB9CgogIHN0YXRpYyBpbnQgaGFzaDIoYSwgYikgPT4gZmluaXNoKGNvbWJpbmUoY29tYmluZSgwLCBhKSwgYikpOwoKICBzdGF0aWMgaW50IGhhc2g0KGEsIGIsIGMsIGQpID0+CiAgICAgIGZpbmlzaChjb21iaW5lKGNvbWJpbmUoY29tYmluZShjb21iaW5lKDAsIGEpLCBiKSwgYyksIGQpKTsKfQopAE5OPBMBRRkEPAQJTBwEFiQ/CiwYTQEsKD4fBAEgPSA+BAE/ASJBAgEfZGFydDptYXRoL2plbmtpbnNfc21pX2hhc2guZGFydCtvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvbWF0aC9wb2ludC5kYXJ0ifIvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgpwYXJ0IG9mIGRhcnQubWF0aDsKCi8vLyBBIHV0aWxpdHkgY2xhc3MgZm9yIHJlcHJlc2VudGluZyB0d28tZGltZW5zaW9uYWwgcG9zaXRpb25zLgpjbGFzcyBQb2ludDxUIGV4dGVuZHMgbnVtPiB7CiAgZmluYWwgVCB4OwogIGZpbmFsIFQgeTsKCiAgY29uc3QgUG9pbnQoVCB4LCBUIHkpCiAgICAgIDogdGhpcy54ID0geCwKICAgICAgICB0aGlzLnkgPSB5OwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnUG9pbnQoJHgsICR5KSc7CgogIC8vLyBBIGBQb2ludGAgaXMgb25seSBlcXVhbCB0byBhbm90aGVyIGBQb2ludGAgd2l0aCB0aGUgc2FtZSBjb29yZGluYXRlcy4KICAvLy8KICAvLy8gVGhpcyBwb2ludCBpcyBlcXVhbCB0byBgb3RoZXJgIGlmLCBhbmQgb25seSBpZiwKICAvLy8gYG90aGVyYCBpcyBhIGBQb2ludGAgd2l0aAogIC8vLyBbeF0gZXF1YWwgdG8gYG90aGVyLnhgIGFuZCBbeV0gZXF1YWwgdG8gYG90aGVyLnlgLgogIGJvb2wgb3BlcmF0b3IgPT0oZHluYW1pYyBvdGhlcikgPT4KICAgICAgLy8gQ2Fubm90IGNoYW5nZSBwYXJhbWV0ZXIgdHlwZSB0byBgT2JqZWN0YCBpbiBjYXNlIHNvbWUgY2xhc3MKICAgICAgLy8gaW5oZXJpdHMgdGhlIHR5cGUgYW5kIHVzZXMgdGhlaXIgYXJndW1lbnQgZHluYW1pY2FsbHkuCiAgICAgIG90aGVyIGlzIFBvaW50ICYmIHggPT0gb3RoZXIueCAmJiB5ID09IG90aGVyLnk7CgogIGludCBnZXQgaGFzaENvZGUgPT4gX0plbmtpbnNTbWlIYXNoLmhhc2gyKHguaGFzaENvZGUsIHkuaGFzaENvZGUpOwoKICAvLy8gQWRkIFtvdGhlcl0gdG8gYHRoaXNgLCBhcyBpZiBib3RoIHBvaW50cyB3ZXJlIHZlY3RvcnMuCiAgLy8vCiAgLy8vIFJldHVybnMgdGhlIHJlc3VsdGluZyAidmVjdG9yIiBhcyBhIFBvaW50LgogIFBvaW50PFQ+IG9wZXJhdG9yICsoUG9pbnQ8VD4gb3RoZXIpIHsKICAgIHJldHVybiBQb2ludDxUPih4ICsgb3RoZXIueCwgeSArIG90aGVyLnkpOwogIH0KCiAgLy8vIFN1YnRyYWN0IFtvdGhlcl0gZnJvbSBgdGhpc2AsIGFzIGlmIGJvdGggcG9pbnRzIHdlcmUgdmVjdG9ycy4KICAvLy8KICAvLy8gUmV0dXJucyB0aGUgcmVzdWx0aW5nICJ2ZWN0b3IiIGFzIGEgUG9pbnQuCiAgUG9pbnQ8VD4gb3BlcmF0b3IgLShQb2ludDxUPiBvdGhlcikgewogICAgcmV0dXJuIFBvaW50PFQ+KHggLSBvdGhlci54LCB5IC0gb3RoZXIueSk7CiAgfQoKICAvLy8gU2NhbGUgdGhpcyBwb2ludCBieSBbZmFjdG9yXSBhcyBpZiBpdCB3ZXJlIGEgdmVjdG9yLgogIC8vLwogIC8vLyAqSW1wb3J0YW50KiAqTm90ZSo6IFRoaXMgZnVuY3Rpb24gYWNjZXB0cyBhIGBudW1gIGFzIGl0cyBhcmd1bWVudCBvbmx5IHNvCiAgLy8vIHRoYXQgeW91IGNhbiBzY2FsZSBQb2ludDxkb3VibGU+IG9iamVjdHMgYnkgYW4gYGludGAgZmFjdG9yLiBCZWNhdXNlIHRoZQogIC8vLyBzdGFyIG9wZXJhdG9yIGFsd2F5cyByZXR1cm5zIHRoZSBzYW1lIHR5cGUgb2YgUG9pbnQgdGhhdCBvcmlnaW5hbGx5IGNhbGxlZAogIC8vLyBpdCwgcGFzc2luZyBpbiBhIGRvdWJsZSBbZmFjdG9yXSBvbiBhIGBQb2ludDxpbnQ+YCBfY2F1c2VzXyBfYV8KICAvLy8gX3J1bnRpbWVfIF9lcnJvcl8gaW4gY2hlY2tlZCBtb2RlLgogIFBvaW50PFQ+IG9wZXJhdG9yICoobnVtIC8qVHxpbnQqLyBmYWN0b3IpIHsKICAgIHJldHVybiBQb2ludDxUPigoeCAqIGZhY3RvciksICh5ICogZmFjdG9yKSk7CiAgfQoKICAvLy8gR2V0IHRoZSBzdHJhaWdodCBsaW5lIChFdWNsaWRlYW4pIGRpc3RhbmNlIGJldHdlZW4gdGhlIG9yaWdpbiAoMCwgMCkgYW5kCiAgLy8vIHRoaXMgcG9pbnQuCiAgZG91YmxlIGdldCBtYWduaXR1ZGUgPT4gc3FydCh4ICogeCArIHkgKiB5KTsKCiAgLy8vIFJldHVybnMgdGhlIGRpc3RhbmNlIGJldHdlZW4gYHRoaXNgIGFuZCBbb3RoZXJdLgogIGRvdWJsZSBkaXN0YW5jZVRvKFBvaW50PFQ+IG90aGVyKSB7CiAgICB2YXIgZHggPSB4IC0gb3RoZXIueDsKICAgIHZhciBkeSA9IHkgLSBvdGhlci55OwogICAgcmV0dXJuIHNxcnQoZHggKiBkeCArIGR5ICogZHkpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiBgdGhpc2AgYW5kIFtvdGhlcl0uCiAgLy8vCiAgLy8vIFNxdWFyZWQgZGlzdGFuY2VzIGNhbiBiZSB1c2VkIGZvciBjb21wYXJpc29ucyB3aGVuIHRoZSBhY3R1YWwgdmFsdWUgaXMgbm90CiAgLy8vIHJlcXVpcmVkLgogIFQgc3F1YXJlZERpc3RhbmNlVG8oUG9pbnQ8VD4gb3RoZXIpIHsKICAgIHZhciBkeCA9IHggLSBvdGhlci54OwogICAgdmFyIGR5ID0geSAtIG90aGVyLnk7CiAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7CiAgfQp9CkwATk48EwFAHQ0NARgUFAEoAUwGNiA5JUVANgFFAT0GMSgvBAFEBjEoLwQBOwZQT1FGKS4xBAFPEi8BNyYaGiQEAT8GURAoGhoeBAIBFGRhcnQ6bWF0aC9wb2ludC5kYXJ0LG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9tYXRoL3JhbmRvbS5kYXJ0hfwvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0Lm1hdGg7CgovLy8gQSBnZW5lcmF0b3Igb2YgcmFuZG9tIGJvb2wsIGludCwgb3IgZG91YmxlIHZhbHVlcy4KLy8vCi8vLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzdXBwbGllcyBhIHN0cmVhbSBvZiBwc2V1ZG8tcmFuZG9tIGJpdHMgdGhhdCBhcmUKLy8vIG5vdCBzdWl0YWJsZSBmb3IgY3J5cHRvZ3JhcGhpYyBwdXJwb3Nlcy4KLy8vCi8vLyBVc2UgdGhlIFtSYW5kb20uc2VjdXJlXSgpIGNvbnN0cnVjdG9yIGZvciBjcnlwdG9ncmFwaGljIHB1cnBvc2VzLgphYnN0cmFjdCBjbGFzcyBSYW5kb20gewogIC8vLyBDcmVhdGVzIGEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCiAgLy8vCiAgLy8vIFRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgW3NlZWRdIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUKICAvLy8gaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGdlbmVyYXRvci4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZQogIC8vLyByYW5kb20gc3RyZWFtIGNhbiBjaGFuZ2UgYmV0d2VlbiByZWxlYXNlcyBvZiB0aGUgbGlicmFyeS4KICBleHRlcm5hbCBmYWN0b3J5IFJhbmRvbShbaW50IHNlZWRdKTsKCiAgLy8vIENyZWF0ZXMgYSBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCiAgLy8vCiAgLy8vIElmIHRoZSBwcm9ncmFtIGNhbm5vdCBwcm92aWRlIGEgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlCiAgLy8vIHNvdXJjZSBvZiByYW5kb20gbnVtYmVycywgaXQgdGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXS4KICBleHRlcm5hbCBmYWN0b3J5IFJhbmRvbS5zZWN1cmUoKTsKCiAgLy8vIEdlbmVyYXRlcyBhIG5vbi1uZWdhdGl2ZSByYW5kb20gaW50ZWdlciB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgaW4gdGhlIHJhbmdlCiAgLy8vIGZyb20gMCwgaW5jbHVzaXZlLCB0byBbbWF4XSwgZXhjbHVzaXZlLgogIC8vLwogIC8vLyBJbXBsZW1lbnRhdGlvbiBub3RlOiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBbbWF4XSB2YWx1ZXMKICAvLy8gYmV0d2VlbiAxIGFuZCAoMTw8MzIpIGluY2x1c2l2ZS4KICBpbnQgbmV4dEludChpbnQgbWF4KTsKCiAgLy8vIEdlbmVyYXRlcyBhIG5vbi1uZWdhdGl2ZSByYW5kb20gZmxvYXRpbmcgcG9pbnQgdmFsdWUgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkCiAgLy8vIGluIHRoZSByYW5nZSBmcm9tIDAuMCwgaW5jbHVzaXZlLCB0byAxLjAsIGV4Y2x1c2l2ZS4KICBkb3VibGUgbmV4dERvdWJsZSgpOwoKICAvLy8gR2VuZXJhdGVzIGEgcmFuZG9tIGJvb2xlYW4gdmFsdWUuCiAgYm9vbCBuZXh0Qm9vbCgpOwp9CioATk48ARMBNwRQLQRGGCkGPkFAJwFCBj9BJAFRLgZMJxgBUTsXASgTAgEVZGFydDptYXRoL3JhbmRvbS5kYXJ0L29yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9tYXRoL3JlY3RhbmdsZS5kYXJ0oVwvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgpwYXJ0IG9mIGRhcnQubWF0aDsKCi8vLyBBIGJhc2UgY2xhc3MgZm9yIHJlcHJlc2VudGluZyB0d28tZGltZW5zaW9uYWwgYXhpcy1hbGlnbmVkIHJlY3RhbmdsZXMuCi8vLwovLy8gVGhpcyByZWN0YW5nbGUgdXNlcyBhIGxlZnQtaGFuZGVkIENhcnRlc2lhbiBjb29yZGluYXRlIHN5c3RlbSwgd2l0aCB4Ci8vLyBkaXJlY3RlZCB0byB0aGUgcmlnaHQgYW5kIHkgZGlyZWN0ZWQgZG93biwgYXMgcGVyIHRoZSBjb252ZW50aW9uIGluIDJECi8vLyBjb21wdXRlciBncmFwaGljcy4KLy8vCi8vLyBTZWUgYWxzbzoKLy8vICAgIFtXM0MgQ29vcmRpbmF0ZSBTeXN0ZW1zIFNwZWNpZmljYXRpb25dKGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9jb29yZHMuaHRtbCNJbml0aWFsQ29vcmRpbmF0ZVN5c3RlbSkuCi8vLwovLy8gVGhlIHJlY3RhbmdsZSBpcyB0aGUgc2V0IG9mIHBvaW50cyB3aXRoIHJlcHJlc2VudGFibGUgY29vcmRpbmF0ZXMgZ3JlYXRlcgovLy8gdGhhbiBvciBlcXVhbCB0byBsZWZ0L3RvcCwgYW5kIHdpdGggZGlzdGFuY2UgdG8gbGVmdC90b3Agbm8gZ3JlYXRlciB0aGFuCi8vLyB3aWR0aC9oZWlnaHQgKHRvIHRoZSBsaW1pdCBvZiB0aGUgcHJlY2lzaW9uIG9mIHRoZSBjb29yZGluYXRlcykuCmFic3RyYWN0IGNsYXNzIF9SZWN0YW5nbGVCYXNlPFQgZXh0ZW5kcyBudW0+IHsKICBjb25zdCBfUmVjdGFuZ2xlQmFzZSgpOwoKICAvLy8gVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgbGVmdCBlZGdlLgogIFQgZ2V0IGxlZnQ7CgogIC8vLyBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSB0b3AgZWRnZS4KICBUIGdldCB0b3A7CgogIC8vLyBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KICBUIGdldCB3aWR0aDsKCiAgLy8vIFRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KICBUIGdldCBoZWlnaHQ7CgogIC8vLyBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSByaWdodCBlZGdlLgogIFQgZ2V0IHJpZ2h0ID0+IGxlZnQgKyB3aWR0aDsKCiAgLy8vIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGJvdHRvbSBlZGdlLgogIFQgZ2V0IGJvdHRvbSA9PiB0b3AgKyBoZWlnaHQ7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnUmVjdGFuZ2xlICgkbGVmdCwgJHRvcCkgJHdpZHRoIHggJGhlaWdodCc7CiAgfQoKICBib29sIG9wZXJhdG9yID09KGR5bmFtaWMgb3RoZXIpID0+CiAgICAgIC8vIENhbid0IGNoYW5nZSBhcmd1bWVudCB0eXBlIHRvIGBPYmplY3RgIHNpbmNlIHN1YmNsYXNzZXMgaW5oZXJpdCBpdAogICAgICAvLyBhbmQgdXNlcyB0aGVpciBhcmd1bWVudCBkeW5hbWljYWxseS4KICAgICAgb3RoZXIgaXMgUmVjdGFuZ2xlICYmCiAgICAgIGxlZnQgPT0gb3RoZXIubGVmdCAmJgogICAgICB0b3AgPT0gb3RoZXIudG9wICYmCiAgICAgIHJpZ2h0ID09IG90aGVyLnJpZ2h0ICYmCiAgICAgIGJvdHRvbSA9PSBvdGhlci5ib3R0b207CgogIGludCBnZXQgaGFzaENvZGUgPT4gX0plbmtpbnNTbWlIYXNoLmhhc2g0KAogICAgICBsZWZ0Lmhhc2hDb2RlLCB0b3AuaGFzaENvZGUsIHJpZ2h0Lmhhc2hDb2RlLCBib3R0b20uaGFzaENvZGUpOwoKICAvLy8gQ29tcHV0ZXMgdGhlIGludGVyc2VjdGlvbiBvZiBgdGhpc2AgYW5kIFtvdGhlcl0uCiAgLy8vCiAgLy8vIFRoZSBpbnRlcnNlY3Rpb24gb2YgdHdvIGF4aXMtYWxpZ25lZCByZWN0YW5nbGVzLCBpZiBhbnksIGlzIGFsd2F5cyBhbm90aGVyCiAgLy8vIGF4aXMtYWxpZ25lZCByZWN0YW5nbGUuCiAgLy8vCiAgLy8vIFJldHVybnMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIGFuZCBgb3RoZXJgLCBvciBgbnVsbGAgaWYgdGhleSBkb24ndAogIC8vLyBpbnRlcnNlY3QuCiAgUmVjdGFuZ2xlPFQ+IGludGVyc2VjdGlvbihSZWN0YW5nbGU8VD4gb3RoZXIpIHsKICAgIHZhciB4MCA9IG1heChsZWZ0LCBvdGhlci5sZWZ0KTsKICAgIHZhciB4MSA9IG1pbihsZWZ0ICsgd2lkdGgsIG90aGVyLmxlZnQgKyBvdGhlci53aWR0aCk7CgogICAgaWYgKHgwIDw9IHgxKSB7CiAgICAgIHZhciB5MCA9IG1heCh0b3AsIG90aGVyLnRvcCk7CiAgICAgIHZhciB5MSA9IG1pbih0b3AgKyBoZWlnaHQsIG90aGVyLnRvcCArIG90aGVyLmhlaWdodCk7CgogICAgICBpZiAoeTAgPD0geTEpIHsKICAgICAgICByZXR1cm4gUmVjdGFuZ2xlPFQ+KHgwLCB5MCwgeDEgLSB4MCwgeTEgLSB5MCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiBgdGhpc2AgaW50ZXJzZWN0cyBbb3RoZXJdLgogIGJvb2wgaW50ZXJzZWN0cyhSZWN0YW5nbGU8bnVtPiBvdGhlcikgewogICAgcmV0dXJuIChsZWZ0IDw9IG90aGVyLmxlZnQgKyBvdGhlci53aWR0aCAmJgogICAgICAgIG90aGVyLmxlZnQgPD0gbGVmdCArIHdpZHRoICYmCiAgICAgICAgdG9wIDw9IG90aGVyLnRvcCArIG90aGVyLmhlaWdodCAmJgogICAgICAgIG90aGVyLnRvcCA8PSB0b3AgKyBoZWlnaHQpOwogIH0KCiAgLy8vIFJldHVybnMgYSBuZXcgcmVjdGFuZ2xlIHdoaWNoIGNvbXBsZXRlbHkgY29udGFpbnMgYHRoaXNgIGFuZCBbb3RoZXJdLgogIFJlY3RhbmdsZTxUPiBib3VuZGluZ0JveChSZWN0YW5nbGU8VD4gb3RoZXIpIHsKICAgIHZhciByaWdodCA9IG1heCh0aGlzLmxlZnQgKyB0aGlzLndpZHRoLCBvdGhlci5sZWZ0ICsgb3RoZXIud2lkdGgpOwogICAgdmFyIGJvdHRvbSA9IG1heCh0aGlzLnRvcCArIHRoaXMuaGVpZ2h0LCBvdGhlci50b3AgKyBvdGhlci5oZWlnaHQpOwoKICAgIHZhciBsZWZ0ID0gbWluKHRoaXMubGVmdCwgb3RoZXIubGVmdCk7CiAgICB2YXIgdG9wID0gbWluKHRoaXMudG9wLCBvdGhlci50b3ApOwoKICAgIHJldHVybiBSZWN0YW5nbGU8VD4obGVmdCwgdG9wLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7CiAgfQoKICAvLy8gVGVzdHMgd2hldGhlciBgdGhpc2AgZW50aXJlbHkgY29udGFpbnMgW2Fub3RoZXJdLgogIGJvb2wgY29udGFpbnNSZWN0YW5nbGUoUmVjdGFuZ2xlPG51bT4gYW5vdGhlcikgewogICAgcmV0dXJuIGxlZnQgPD0gYW5vdGhlci5sZWZ0ICYmCiAgICAgICAgbGVmdCArIHdpZHRoID49IGFub3RoZXIubGVmdCArIGFub3RoZXIud2lkdGggJiYKICAgICAgICB0b3AgPD0gYW5vdGhlci50b3AgJiYKICAgICAgICB0b3AgKyBoZWlnaHQgPj0gYW5vdGhlci50b3AgKyBhbm90aGVyLmhlaWdodDsKICB9CgogIC8vLyBUZXN0cyB3aGV0aGVyIFthbm90aGVyXSBpcyBpbnNpZGUgb3IgYWxvbmcgdGhlIGVkZ2VzIG9mIGB0aGlzYC4KICBib29sIGNvbnRhaW5zUG9pbnQoUG9pbnQ8bnVtPiBhbm90aGVyKSB7CiAgICByZXR1cm4gYW5vdGhlci54ID49IGxlZnQgJiYKICAgICAgICBhbm90aGVyLnggPD0gbGVmdCArIHdpZHRoICYmCiAgICAgICAgYW5vdGhlci55ID49IHRvcCAmJgogICAgICAgIGFub3RoZXIueSA8PSB0b3AgKyBoZWlnaHQ7CiAgfQoKICBQb2ludDxUPiBnZXQgdG9wTGVmdCA9PiBQb2ludDxUPih0aGlzLmxlZnQsIHRoaXMudG9wKTsKICBQb2ludDxUPiBnZXQgdG9wUmlnaHQgPT4gUG9pbnQ8VD4odGhpcy5sZWZ0ICsgdGhpcy53aWR0aCwgdGhpcy50b3ApOwogIFBvaW50PFQ+IGdldCBib3R0b21SaWdodCA9PgogICAgICBQb2ludDxUPih0aGlzLmxlZnQgKyB0aGlzLndpZHRoLCB0aGlzLnRvcCArIHRoaXMuaGVpZ2h0KTsKICBQb2ludDxUPiBnZXQgYm90dG9tTGVmdCA9PiBQb2ludDxUPih0aGlzLmxlZnQsIHRoaXMudG9wICsgdGhpcy5oZWlnaHQpOwp9CgovLy8gQSBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIHR3by1kaW1lbnNpb25hbCByZWN0YW5nbGVzIHdob3NlIHByb3BlcnRpZXMgYXJlCi8vLyBpbW11dGFibGUuCmNsYXNzIFJlY3RhbmdsZTxUIGV4dGVuZHMgbnVtPiBleHRlbmRzIF9SZWN0YW5nbGVCYXNlPFQ+IHsKICBmaW5hbCBUIGxlZnQ7CiAgZmluYWwgVCB0b3A7CiAgZmluYWwgVCB3aWR0aDsKICBmaW5hbCBUIGhlaWdodDsKCiAgLy8vIENyZWF0ZSBhIHJlY3RhbmdsZSBzcGFubmVkIGJ5IGAobGVmdCwgdG9wKWAgYW5kCiAgLy8vIGAobGVmdCt3aWR0aCwgdG9wK2hlaWdodClgLgogIC8vLwogIC8vLyBUaGUgcmVjdGFuZ2xlIGNvbnRhaW5zIHRoZSBwb2ludHMKICAvLy8gd2l0aCB4LWNvb3JkaW5hdGUgYmV0d2VlbiBgbGVmdGAgYW5kIGBsZWZ0ICsgd2lkdGhgLCBhbmQKICAvLy8gd2l0aCB5LWNvb3JkaW5hdGUgYmV0d2VlbiBgdG9wYCBhbmQgYHRvcCArIGhlaWdodGAsIGJvdGggaW5jbHVzaXZlLgogIC8vLwogIC8vLyBUaGUgYHdpZHRoYCBhbmQgYGhlaWdodGAgc2hvdWxkIGJlIG5vbi1uZWdhdGl2ZS4KICAvLy8gSWYgYHdpZHRoYCBvciBgaGVpZ2h0YCBhcmUgbmVnYXRpdmUsIHRoZXkgYXJlIGNsYW1wZWQgdG8gemVyby4KICAvLy8KICAvLy8gSWYgYHdpZHRoYCBhbmQgYGhlaWdodGAgYXJlIHplcm8sIHRoZSAicmVjdGFuZ2xlIiBjb21wcmlzZXMgb25seSB0aGUKICAvLy8gc2luZ2xlIHBvaW50IGAobGVmdCwgdG9wKWAuCiAgY29uc3QgUmVjdGFuZ2xlKHRoaXMubGVmdCwgdGhpcy50b3AsIFQgd2lkdGgsIFQgaGVpZ2h0KQogICAgICA6IHRoaXMud2lkdGggPSAod2lkdGggPCAwKSA/IC13aWR0aCAqIDAgOiB3aWR0aCwgLy8gSW5saW5lIF9jbGFtcFRvWmVyby4KICAgICAgICB0aGlzLmhlaWdodCA9IChoZWlnaHQgPCAwKSA/IC1oZWlnaHQgKiAwIDogaGVpZ2h0OwoKICAvLy8gQ3JlYXRlIGEgcmVjdGFuZ2xlIHNwYW5uZWQgYnkgdGhlIHBvaW50cyBbYV0gYW5kIFtiXTsKICAvLy8KICAvLy8gVGhlIHJlY3RhbmdsZSBjb250YWlucyB0aGUgcG9pbnRzCiAgLy8vIHdpdGggeC1jb29yZGluYXRlIGJldHdlZW4gYGEueGAgYW5kIGBiLnhgLCBhbmQKICAvLy8gd2l0aCB5LWNvb3JkaW5hdGUgYmV0d2VlbiBgYS55YCBhbmQgYGIueWAsIGJvdGggaW5jbHVzaXZlLgogIC8vLwogIC8vLyBJZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiBgYS54YCBhbmQgYGIueGAgaXMgbm90IHJlcHJlc2VudGFibGUKICAvLy8gKHdoaWNoIGNhbiBoYXBwZW4gaWYgb25lIG9yIGJvdGggaXMgYSBkb3VibGUpLAogIC8vLyB0aGUgYWN0dWFsIHJpZ2h0IGVkZ2UgbWlnaHQgYmUgc2xpZ2h0bHkgb2ZmIGZyb20gYG1heChhLngsIGIueClgLgogIC8vLyBTaW1pbGFyIGZvciB0aGUgeS1jb29yZGluYXRlcyBhbmQgdGhlIGJvdHRvbSBlZGdlLgogIGZhY3RvcnkgUmVjdGFuZ2xlLmZyb21Qb2ludHMoUG9pbnQ8VD4gYSwgUG9pbnQ8VD4gYikgewogICAgVCBsZWZ0ID0gbWluKGEueCwgYi54KTsKICAgIFQgd2lkdGggPSBtYXgoYS54LCBiLngpIC0gbGVmdDsKICAgIFQgdG9wID0gbWluKGEueSwgYi55KTsKICAgIFQgaGVpZ2h0ID0gbWF4KGEueSwgYi55KSAtIHRvcDsKICAgIHJldHVybiBSZWN0YW5nbGU8VD4obGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KTsKICB9Cn0KCi8vLyBBIGNsYXNzIGZvciByZXByZXNlbnRpbmcgdHdvLWRpbWVuc2lvbmFsIGF4aXMtYWxpZ25lZCByZWN0YW5nbGVzIHdpdGgKLy8vIG11dGFibGUgcHJvcGVydGllcy4KY2xhc3MgTXV0YWJsZVJlY3RhbmdsZTxUIGV4dGVuZHMgbnVtPiBleHRlbmRzIF9SZWN0YW5nbGVCYXNlPFQ+CiAgICBpbXBsZW1lbnRzIFJlY3RhbmdsZTxUPiB7CiAgLy8vIFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGxlZnQgZWRnZS4KICAvLy8KICAvLy8gU2V0dGluZyB0aGUgdmFsdWUgd2lsbCBtb3ZlIHRoZSByZWN0YW5nbGUgd2l0aG91dCBjaGFuZ2luZyBpdHMgd2lkdGguCiAgVCBsZWZ0OwoKICAvLy8gVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgbGVmdCBlZGdlLgogIC8vLwogIC8vLyBTZXR0aW5nIHRoZSB2YWx1ZSB3aWxsIG1vdmUgdGhlIHJlY3RhbmdsZSB3aXRob3V0IGNoYW5naW5nIGl0cyBoZWlnaHQuCiAgVCB0b3A7CiAgVCBfd2lkdGg7CiAgVCBfaGVpZ2h0OwoKICAvLy8gQ3JlYXRlIGEgbXV0YWJsZSByZWN0YW5nbGUgc3Bhbm5lZCBieSBgKGxlZnQsIHRvcClgIGFuZAogIC8vLyBgKGxlZnQrd2lkdGgsIHRvcCtoZWlnaHQpYC4KICAvLy8KICAvLy8gVGhlIHJlY3RhbmdsZSBjb250YWlucyB0aGUgcG9pbnRzCiAgLy8vIHdpdGggeC1jb29yZGluYXRlIGJldHdlZW4gYGxlZnRgIGFuZCBgbGVmdCArIHdpZHRoYCwgYW5kCiAgLy8vIHdpdGggeS1jb29yZGluYXRlIGJldHdlZW4gYHRvcGAgYW5kIGB0b3AgKyBoZWlnaHRgLCBib3RoIGluY2x1c2l2ZS4KICAvLy8KICAvLy8gVGhlIGB3aWR0aGAgYW5kIGBoZWlnaHRgIHNob3VsZCBiZSBub24tbmVnYXRpdmUuCiAgLy8vIElmIGB3aWR0aGAgb3IgYGhlaWdodGAgYXJlIG5lZ2F0aXZlLCB0aGV5IGFyZSBjbGFtcGVkIHRvIHplcm8uCiAgLy8vCiAgLy8vIElmIGB3aWR0aGAgYW5kIGBoZWlnaHRgIGFyZSB6ZXJvLCB0aGUgInJlY3RhbmdsZSIgY29tcHJpc2VzIG9ubHkgdGhlCiAgLy8vIHNpbmdsZSBwb2ludCBgKGxlZnQsIHRvcClgLgogIE11dGFibGVSZWN0YW5nbGUodGhpcy5sZWZ0LCB0aGlzLnRvcCwgVCB3aWR0aCwgVCBoZWlnaHQpCiAgICAgIDogdGhpcy5fd2lkdGggPSAod2lkdGggPCAwKSA/IF9jbGFtcFRvWmVybzxUPih3aWR0aCkgOiB3aWR0aCwKICAgICAgICB0aGlzLl9oZWlnaHQgPSAoaGVpZ2h0IDwgMCkgPyBfY2xhbXBUb1plcm88VD4oaGVpZ2h0KSA6IGhlaWdodDsKCiAgLy8vIENyZWF0ZSBhIG11dGFibGUgcmVjdGFuZ2xlIHNwYW5uZWQgYnkgdGhlIHBvaW50cyBbYV0gYW5kIFtiXTsKICAvLy8KICAvLy8gVGhlIHJlY3RhbmdsZSBjb250YWlucyB0aGUgcG9pbnRzCiAgLy8vIHdpdGggeC1jb29yZGluYXRlIGJldHdlZW4gYGEueGAgYW5kIGBiLnhgLCBhbmQKICAvLy8gd2l0aCB5LWNvb3JkaW5hdGUgYmV0d2VlbiBgYS55YCBhbmQgYGIueWAsIGJvdGggaW5jbHVzaXZlLgogIC8vLwogIC8vLyBJZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiBgYS54YCBhbmQgYGIueGAgaXMgbm90IHJlcHJlc2VudGFibGUKICAvLy8gKHdoaWNoIGNhbiBoYXBwZW4gaWYgb25lIG9yIGJvdGggaXMgYSBkb3VibGUpLAogIC8vLyB0aGUgYWN0dWFsIHJpZ2h0IGVkZ2UgbWlnaHQgYmUgc2xpZ2h0bHkgb2ZmIGZyb20gYG1heChhLngsIGIueClgLgogIC8vLyBTaW1pbGFyIGZvciB0aGUgeS1jb29yZGluYXRlcyBhbmQgdGhlIGJvdHRvbSBlZGdlLgogIGZhY3RvcnkgTXV0YWJsZVJlY3RhbmdsZS5mcm9tUG9pbnRzKFBvaW50PFQ+IGEsIFBvaW50PFQ+IGIpIHsKICAgIFQgbGVmdCA9IG1pbihhLngsIGIueCk7CiAgICBUIHdpZHRoID0gbWF4KGEueCwgYi54KSAtIGxlZnQ7CiAgICBUIHRvcCA9IG1pbihhLnksIGIueSk7CiAgICBUIGhlaWdodCA9IG1heChhLnksIGIueSkgLSB0b3A7CiAgICByZXR1cm4gTXV0YWJsZVJlY3RhbmdsZTxUPihsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpOwogIH0KCiAgVCBnZXQgd2lkdGggPT4gX3dpZHRoOwoKICAvLy8gU2V0cyB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KICAvLy8KICAvLy8gVGhlIHdpZHRoIG11c3QgYmUgbm9uLW5lZ2F0aXZlLgogIC8vLyBJZiBhIG5lZ2F0aXZlIHdpZHRoIGlzIHN1cHBsaWVkLCBpdCBpcyBjbGFtcGVkIHRvIHplcm8uCiAgLy8vCiAgLy8vIFNldHRpbmcgdGhlIHZhbHVlIHdpbGwgY2hhbmdlIHRoZSByaWdodCBlZGdlIG9mIHRoZSByZWN0YW5nbGUsCiAgLy8vIGJ1dCB3aWxsIG5vdCBjaGFuZ2UgW2xlZnRdLgogIHNldCB3aWR0aChUIHdpZHRoKSB7CiAgICBpZiAod2lkdGggPCAwKSB3aWR0aCA9IF9jbGFtcFRvWmVybzxUPih3aWR0aCk7CiAgICBfd2lkdGggPSB3aWR0aDsKICB9CgogIFQgZ2V0IGhlaWdodCA9PiBfaGVpZ2h0OwoKICAvLy8gU2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCiAgLy8vCiAgLy8vIFRoZSBoZWlnaHQgbXVzdCBiZSBub24tbmVnYXRpdmUuCiAgLy8vIElmIGEgbmVnYXRpdmUgaGVpZ2h0IGlzIHN1cHBsaWVkLCBpdCBpcyBjbGFtcGVkIHRvIHplcm8uCiAgLy8vCiAgLy8vIFNldHRpbmcgdGhlIHZhbHVlIHdpbGwgY2hhbmdlIHRoZSBib3R0b20gZWRnZSBvZiB0aGUgcmVjdGFuZ2xlLAogIC8vLyBidXQgd2lsbCBub3QgY2hhbmdlIFt0b3BdLgogIHNldCBoZWlnaHQoVCBoZWlnaHQpIHsKICAgIGlmIChoZWlnaHQgPCAwKSBoZWlnaHQgPSBfY2xhbXBUb1plcm88VD4oaGVpZ2h0KTsKICAgIF9oZWlnaHQgPSBoZWlnaHQ7CiAgfQp9CgovLy8gQ29udmVydHMgYSBuZWdhdGl2ZSBbaW50XSBvciBbZG91YmxlXSB0byBhIHplcm8tdmFsdWUgb2YgdGhlIHNhbWUgdHlwZS4KLy8vCi8vLyBSZXR1cm5zIGAwYCBpZiB2YWx1ZSBpcyBpbnQsIGAwLjBgIGlmIHZhbHVlIGlzIGRvdWJsZS4KVCBfY2xhbXBUb1plcm88VCBleHRlbmRzIG51bT4oVCB2YWx1ZSkgewogIGFzc2VydCh2YWx1ZSA8IDApOwogIHJldHVybiAtdmFsdWUgKiAwOwp9CoD5AE5OPBMBSwRKSxcEDm0ETk1FLxoBKQ4BKA0BIg8BIxABKh8BKyABFjcEASVMLhwcGh4eAS1FATcGUR4GTBEyJDoBFCQ8ARY3CAYRBAExKjAmKyQEAUwxR0gBKygBQAQBODMjOB42BAFGKyAlHCMEATlHHkBKAgFNDzsQDxESATYiBig/SgY3RQZLIjpPOwE8Big1QQZDNUg5ORwkGyQzBAIBShhAHikGTAoBKQZNCQwNAT4iBig/SgY3RQZLIjtESAFEBig1QQZDNUg5QBwkGyQ6BAEZAScGJj4GRSIXMxQEARsBKAYnPwZGIRk2FgQCAUwEOykVFQIBGGRhcnQ6bWF0aC9yZWN0YW5nbGUuZGFydDBvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvbWlycm9ycy9taXJyb3JzLmRhcnTAAMKXLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEZvciB0aGUgcHVycG9zZXMgb2YgdGhlIG1pcnJvcnMgbGlicmFyeSwgd2UgYWRvcHQgYSBuYW1pbmcKLy8gY29udmVudGlvbiB3aXRoIHJlc3BlY3QgdG8gZ2V0dGVycyBhbmQgc2V0dGVycy4gIFNwZWNpZmljYWxseSwgZm9yCi8vIHNvbWUgdmFyaWFibGUgb3IgZmllbGQuLi4KLy8KLy8gICB2YXIgbXlGaWVsZDsKLy8KLy8gLi4udGhlIGdldHRlciBpcyBuYW1lZCAnbXlGaWVsZCcgYW5kIHRoZSBzZXR0ZXIgaXMgbmFtZWQKLy8gJ215RmllbGQ9Jy4gIFRoaXMgYWxsb3dzIHVzIHRvIGFzc2lnbiB1bmlxdWUgbmFtZXMgdG8gZ2V0dGVycyBhbmQKLy8gc2V0dGVycyBmb3IgdGhlIHB1cnBvc2VzIG9mIG1lbWJlciBsb29rdXAuCgovKioKICogQmFzaWMgcmVmbGVjdGlvbiBpbiBEYXJ0LAogKiB3aXRoIHN1cHBvcnQgZm9yIGludHJvc3BlY3Rpb24gYW5kIGR5bmFtaWMgaW52b2NhdGlvbi4KICoKICogKkludHJvc3BlY3Rpb24qIGlzIHRoYXQgc3Vic2V0IG9mIHJlZmxlY3Rpb24gYnkgd2hpY2ggYSBydW5uaW5nCiAqIHByb2dyYW0gY2FuIGV4YW1pbmUgaXRzIG93biBzdHJ1Y3R1cmUuIEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uCiAqIHRoYXQgcHJpbnRzIG91dCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBtZW1iZXJzIG9mIGFuIGFyYml0cmFyeSBvYmplY3QuCiAqCiAqICpEeW5hbWljIGludm9jYXRpb24qIHJlZmVycyB0aGUgYWJpbGl0eSB0byBldmFsdWF0ZSBjb2RlIHRoYXQKICogaGFzIG5vdCBiZWVuIGxpdGVyYWxseSBzcGVjaWZpZWQgYXQgY29tcGlsZSB0aW1lLCBzdWNoIGFzIGNhbGxpbmcgYSBtZXRob2QKICogd2hvc2UgbmFtZSBpcyBwcm92aWRlZCBhcyBhbiBhcmd1bWVudCAoYmVjYXVzZSBpdCBpcyBsb29rZWQgdXAKICogaW4gYSBkYXRhYmFzZSwgb3IgcHJvdmlkZWQgaW50ZXJhY3RpdmVseSBieSB0aGUgdXNlcikuCiAqCiAqICMjIEhvdyB0byBpbnRlcnByZXQgdGhpcyBsaWJyYXJ5J3MgZG9jdW1lbnRhdGlvbgogKgogKiBBcyBhIHJ1bGUsIHRoZSBuYW1lcyBvZiBEYXJ0IGRlY2xhcmF0aW9ucyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcKICogaW5zdGFuY2VzIG9mIGNsYXNzIFtTeW1ib2xdLiBXaGVuZXZlciB0aGUgZG9jIHNwZWFrcyBvZiBhbiBvYmplY3QgKnMqCiAqIG9mIGNsYXNzIFtTeW1ib2xdIGRlbm90aW5nIGEgbmFtZSwgaXQgbWVhbnMgdGhlIHN0cmluZyB0aGF0CiAqIHdhcyB1c2VkIHRvIGNvbnN0cnVjdCAqcyouCiAqCiAqIFRoZSBkb2N1bWVudGF0aW9uIGZyZXF1ZW50bHkgYWJ1c2VzIG5vdGF0aW9uIHdpdGgKICogRGFydCBwc2V1ZG8tY29kZSBzdWNoIGFzIFs6by54KGEpOl0sIHdoZXJlCiAqIG8gYW5kIGEgYXJlIGRlZmluZWQgdG8gYmUgb2JqZWN0czsgd2hhdCBpcyBhY3R1YWxseSBtZWFudCBpbiB0aGVzZQogKiBjYXNlcyBpcyBbOm8nLngoYScpOl0gd2hlcmUgKm8nKiBhbmQgKmEnKiBhcmUgRGFydCB2YXJpYWJsZXMKICogYm91bmQgdG8gKm8qIGFuZCAqYSogcmVzcGVjdGl2ZWx5LiBGdXJ0aGVybW9yZSwgKm8nKiBhbmQgKmEnKgogKiBhcmUgYXNzdW1lZCB0byBiZSBmcmVzaCB2YXJpYWJsZXMgKG1lYW5pbmcgdGhhdCB0aGV5IGFyZQogKiBkaXN0aW5jdCBmcm9tIGFueSBvdGhlciB2YXJpYWJsZXMgaW4gdGhlIHByb2dyYW0pLgogKgogKiBTb21ldGltZXMgdGhlIGRvY3VtZW50YXRpb24gcmVmZXJzIHRvICpzZXJpYWxpemFibGUqIG9iamVjdHMuCiAqIEFuIG9iamVjdCBpcyBzZXJpYWxpemFibGUgYWNyb3NzIGlzb2xhdGVzIGlmIGFuZCBvbmx5IGlmIGl0IGlzIGFuIGluc3RhbmNlIG9mCiAqIG51bSwgYm9vbCwgU3RyaW5nLCBhIGxpc3Qgb2Ygb2JqZWN0cyB0aGF0IGFyZSBzZXJpYWxpemFibGUKICogYWNyb3NzIGlzb2xhdGVzLCBvciBhIG1hcCB3aXRoIGtleXMgYW5kIHZhbHVlcyB0aGF0IGFyZSBhbGwgc2VyaWFsaXphYmxlIGFjcm9zcwogKiBpc29sYXRlcy4KICoKICogIyMgU3RhdHVzOiBVbnN0YWJsZQogKgogKiBUaGUgZGFydDptaXJyb3JzIGxpYnJhcnkgaXMgdW5zdGFibGUgYW5kIGl0cyBBUEkgbWlnaHQgY2hhbmdlIHNsaWdodGx5IGFzIGEKICogcmVzdWx0IG9mIHVzZXIgZmVlZGJhY2suIFRoaXMgbGlicmFyeSBpcyBwbGF0Zm9ybSBkZXBlbmRlbnQgYW5kIHRoZXJlZm9yZSBpdAogKiBoYXMgaW1wbGVtZW50YXRpb25zIGZvciBib3RoIGRhcnQyanMgYW5kIHRoZSBEYXJ0IFZNLiBCb3RoIGFyZSB1bmRlcgogKiBkZXZlbG9wbWVudCBhbmQgbWF5IG5vdCBzdXBwb3J0IGFsbCBvcGVyYXRpb25zIHlldC4KICoKICoge0BjYXRlZ29yeSBWTX0KICovCmxpYnJhcnkgZGFydC5taXJyb3JzOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJyBzaG93IEZ1dHVyZTsKCi8qKgogKiBBIFtNaXJyb3JTeXN0ZW1dIGlzIHRoZSBtYWluIGludGVyZmFjZSB1c2VkIHRvIHJlZmxlY3Qgb24gYSBzZXQgb2YKICogYXNzb2NpYXRlZCBsaWJyYXJpZXMuCiAqCiAqIEF0IHJ1bnRpbWUgZWFjaCBydW5uaW5nIGlzb2xhdGUgaGFzIGEgZGlzdGluY3QgW01pcnJvclN5c3RlbV0uCiAqCiAqIEl0IGlzIGFsc28gcG9zc2libGUgdG8gaGF2ZSBhIFtNaXJyb3JTeXN0ZW1dIHdoaWNoIHJlcHJlc2VudHMgYSBzZXQKICogb2YgbGlicmFyaWVzIHdoaWNoIGFyZSBub3QgcnVubmluZyAtLSBwZXJoYXBzIGF0IGNvbXBpbGUtdGltZS4gIEluCiAqIHRoaXMgY2FzZSwgYWxsIGF2YWlsYWJsZSByZWZsZWN0aXZlIGZ1bmN0aW9uYWxpdHkgd291bGQgYmUKICogc3VwcG9ydGVkLCBidXQgcnVudGltZSBmdW5jdGlvbmFsaXR5IChzdWNoIGFzIGludm9raW5nIGEgZnVuY3Rpb24KICogb3IgaW5zcGVjdGluZyB0aGUgY29udGVudHMgb2YgYSB2YXJpYWJsZSkgd291bGQgZmFpbCBkeW5hbWljYWxseS4KICovCmFic3RyYWN0IGNsYXNzIE1pcnJvclN5c3RlbSB7CiAgLyoqCiAgICogQWxsIGxpYnJhcmllcyBrbm93biB0byB0aGUgbWlycm9yIHN5c3RlbSwgaW5kZXhlZCBieSB0aGVpciBVUkkuCiAgICoKICAgKiBSZXR1cm5zIGFuIHVubW9kaWZpYWJsZSBtYXAgb2YgdGhlIGxpYnJhcmllcyB3aXRoIFtMaWJyYXJ5TWlycm9yLnVyaV0gYXMKICAgKiBrZXlzLgogICAqCiAgICogRm9yIGEgcnVudGltZSBtaXJyb3Igc3lzdGVtLCBvbmx5IGxpYnJhcmllcyB3aGljaCBhcmUgY3VycmVudGx5IGxvYWRlZAogICAqIGFyZSBpbmNsdWRlZCwgYW5kIHJlcGVhdGVkIGNhbGxzIG9mIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gZGlmZmVyZW50IG1hcHMKICAgKiBhcyBsaWJyYXJpZXMgYXJlIGxvYWRlZC4KICAgKi8KICBNYXA8VXJpLCBMaWJyYXJ5TWlycm9yPiBnZXQgbGlicmFyaWVzOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSB1bmlxdWUgbGlicmFyeSBuYW1lZCBbbGlicmFyeU5hbWVdIGlmIGl0IGV4aXN0cy4KICAgKgogICAqIElmIG5vIHVuaXF1ZSBsaWJyYXJ5IGV4aXN0cywgYW4gZXJyb3IgaXMgdGhyb3duLgogICAqLwogIGV4dGVybmFsIExpYnJhcnlNaXJyb3IgZmluZExpYnJhcnkoU3ltYm9sIGxpYnJhcnlOYW1lKTsKCiAgLyoqCiAgICogQSBtaXJyb3Igb24gdGhlIGlzb2xhdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgW01pcnJvclN5c3RlbV0uCiAgICoKICAgKiBUaGlzIG1heSBiZSBudWxsIGlmIHRoaXMgbWlycm9yIHN5c3RlbSBpcyBub3QgcnVubmluZy4KICAgKi8KICBJc29sYXRlTWlycm9yIGdldCBpc29sYXRlOwoKICAvKioKICAgKiBBIG1pcnJvciBvbiB0aGUgWzpkeW5hbWljOl0gdHlwZS4KICAgKi8KICBUeXBlTWlycm9yIGdldCBkeW5hbWljVHlwZTsKCiAgLyoqCiAgICogQSBtaXJyb3Igb24gdGhlIFs6dm9pZDpdIHR5cGUuCiAgICovCiAgVHlwZU1pcnJvciBnZXQgdm9pZFR5cGU7CgogIC8qKgogICAqIFJldHVybnMgdGhlIG5hbWUgb2YgW3N5bWJvbF0uCiAgICoKICAgKiBUaGUgZm9sbG93aW5nIHRleHQgaXMgbm9uLW5vcm1hdGl2ZToKICAgKgogICAqIFVzaW5nIHRoaXMgbWV0aG9kIG1heSByZXN1bHQgaW4gbGFyZ2VyIG91dHB1dC4gIElmIHBvc3NpYmxlLCB1c2UKICAgKiBbTWlycm9yc1VzZWRdIHRvIHNwZWNpZnkgd2hpY2ggc3ltYm9scyBtdXN0IGJlIHJldGFpbmVkIGluIGNsZWFyIHRleHQuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIFN0cmluZyBnZXROYW1lKFN5bWJvbCBzeW1ib2wpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgc3ltYm9sIGZvciBbbmFtZV0uCiAgICoKICAgKiBJZiBbbGlicmFyeV0gaXMgbm90IGEgW0xpYnJhcnlNaXJyb3JdIG9yIGlmIFtuYW1lXSBpcyBhIHByaXZhdGUgaWRlbnRpZmllcgogICAqIGFuZCBbbGlicmFyeV0gaXMgYG51bGxgLCB0aHJvd3MgYW4gW0FyZ3VtZW50RXJyb3JdLiBJZiBbbmFtZV0gaXMgYSBwcml2YXRlCiAgICogaWRlbnRpZmllciwgdGhlIHN5bWJvbCByZXR1cm5lZCBpcyB3aXRoIHJlc3BlY3QgdG8gW2xpYnJhcnldLgogICAqCiAgICogVGhlIGZvbGxvd2luZyB0ZXh0IGlzIG5vbi1ub3JtYXRpdmU6CiAgICoKICAgKiBVc2luZyB0aGlzIG1ldGhvZCBtYXkgcmVzdWx0IGluIGxhcmdlciBvdXRwdXQuICBJZiBwb3NzaWJsZSwgdXNlCiAgICogdGhlIGNvbnN0IGNvbnN0cnVjdG9yIG9mIFtTeW1ib2xdIG9yIHN5bWJvbCBsaXRlcmFscy4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgU3ltYm9sIGdldFN5bWJvbChTdHJpbmcgbmFtZSwgW0xpYnJhcnlNaXJyb3IgbGlicmFyeV0pOwp9CgovKioKICogUmV0dXJucyBhIFtNaXJyb3JTeXN0ZW1dIGZvciB0aGUgY3VycmVudCBpc29sYXRlLgogKi8KZXh0ZXJuYWwgTWlycm9yU3lzdGVtIGN1cnJlbnRNaXJyb3JTeXN0ZW0oKTsKCi8qKgogKiBSZWZsZWN0cyBhbiBpbnN0YW5jZS4KICoKICogUmV0dXJucyBhbiBbSW5zdGFuY2VNaXJyb3JdIHJlZmxlY3RpbmcgW3JlZmxlY3RlZV0uIElmIFtyZWZsZWN0ZWVdIGlzIGEKICogZnVuY3Rpb24gb3IgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGhhcyBhIFs6Y2FsbDpdIG1ldGhvZCwgdGhlIHJldHVybmVkCiAqIGluc3RhbmNlIG1pcnJvciB3aWxsIGJlIGEgW0Nsb3N1cmVNaXJyb3JdLgogKgogKiBOb3RlIHRoYXQgc2luY2Ugb25lIGNhbm5vdCBvYnRhaW4gYW4gb2JqZWN0IGZyb20gYW5vdGhlciBpc29sYXRlLCB0aGlzCiAqIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgdG8gb2J0YWluICBtaXJyb3JzIG9uIG9iamVjdHMgb2YgdGhlIGN1cnJlbnQKICogaXNvbGF0ZS4KICovCmV4dGVybmFsIEluc3RhbmNlTWlycm9yIHJlZmxlY3QoT2JqZWN0IHJlZmxlY3RlZSk7CgovKioKICogUmVmbGVjdHMgYSBjbGFzcyBkZWNsYXJhdGlvbi4KICoKICogTGV0ICpDKiBiZSB0aGUgb3JpZ2luYWwgY2xhc3MgZGVjbGFyYXRpb24gb2YgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IFtrZXldLgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBbQ2xhc3NNaXJyb3JdIHJlZmxlY3RpbmcgKkMqLgogKgogKiBJZiBba2V5XSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgW1R5cGVdLCB0aGVuIHRoaXMgZnVuY3Rpb24gdGhyb3dzIGFuCiAqIFtBcmd1bWVudEVycm9yXS4gSWYgW2tleV0gaXMgdGhlIFR5cGUgZm9yIGR5bmFtaWMgb3IgYSBmdW5jdGlvbiB0eXBlZGVmLAogKiB0aHJvd3MgYW4gW0FyZ3VtZW50RXJyb3JdLgogKgogKiBOb3RlIHRoYXQgc2luY2Ugb25lIGNhbm5vdCBvYnRhaW4gYSBbVHlwZV0gb2JqZWN0IGZyb20gYW5vdGhlciBpc29sYXRlLCB0aGlzCiAqIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgdG8gb2J0YWluIGNsYXNzIG1pcnJvcnMgb24gY2xhc3NlcyBvZiB0aGUgY3VycmVudAogKiBpc29sYXRlLgogKi8KZXh0ZXJuYWwgQ2xhc3NNaXJyb3IgcmVmbGVjdENsYXNzKFR5cGUga2V5KTsKCi8qKgogKiBSZWZsZWN0cyB0aGUgdHlwZSByZXByZXNlbnRlZCBieSBba2V5XS4KICoKICogSWYgW2tleV0gaXMgbm90IGFuIGluc3RhbmNlIG9mIFtUeXBlXSwgdGhlbiB0aGlzIGZ1bmN0aW9uIHRocm93cyBhbgogKiBbQXJndW1lbnRFcnJvcl0uCiAqCiAqIE9wdGlvbmFsbHkgdGFrZXMgYSBsaXN0IG9mIFt0eXBlQXJndW1lbnRzXSBmb3IgZ2VuZXJpYyBjbGFzc2VzLiBJZiB0aGUgbGlzdAogKiBpcyBwcm92aWRlZCwgdGhlbiB0aGUgW2tleV0gbXVzdCBiZSBhIGdlbmVyaWMgY2xhc3MgdHlwZSwgYW5kIHRoZSBudW1iZXIgb2YKICogdGhlIHByb3ZpZGVkIHR5cGUgYXJndW1lbnRzIG11c3QgYmUgZXF1YWwgdG8gdGhlIG51bWJlciBvZiB0eXBlIHZhcmlhYmxlcwogKiBkZWNsYXJlZCBieSB0aGUgY2xhc3MuCiAqCiAqIE5vdGUgdGhhdCBzaW5jZSBvbmUgY2Fubm90IG9idGFpbiBhIFtUeXBlXSBvYmplY3QgZnJvbSBhbm90aGVyIGlzb2xhdGUsIHRoaXMKICogZnVuY3Rpb24gY2FuIG9ubHkgYmUgdXNlZCB0byBvYnRhaW4gdHlwZSBtaXJyb3JzIG9uIHR5cGVzIG9mIHRoZSBjdXJyZW50CiAqIGlzb2xhdGUuCiAqLwpleHRlcm5hbCBUeXBlTWlycm9yIHJlZmxlY3RUeXBlKFR5cGUga2V5LCBbTGlzdDxUeXBlPiB0eXBlQXJndW1lbnRzXSk7CgovKioKICogQSBbTWlycm9yXSByZWZsZWN0cyBzb21lIERhcnQgbGFuZ3VhZ2UgZW50aXR5LgogKgogKiBFdmVyeSBbTWlycm9yXSBvcmlnaW5hdGVzIGZyb20gc29tZSBbTWlycm9yU3lzdGVtXS4KICovCmFic3RyYWN0IGNsYXNzIE1pcnJvciB7fQoKLyoqCiAqIEFuIFtJc29sYXRlTWlycm9yXSByZWZsZWN0cyBhbiBpc29sYXRlLgogKi8KYWJzdHJhY3QgY2xhc3MgSXNvbGF0ZU1pcnJvciBpbXBsZW1lbnRzIE1pcnJvciB7CiAgLyoqCiAgICogQSB1bmlxdWUgbmFtZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBpc29sYXRlIGluIGRlYnVnZ2luZyBtZXNzYWdlcy4KICAgKi8KICBTdHJpbmcgZ2V0IGRlYnVnTmFtZTsKCiAgLyoqCiAgICogV2hldGhlciB0aGlzIG1pcnJvciByZWZsZWN0cyB0aGUgY3VycmVudGx5IHJ1bm5pbmcgaXNvbGF0ZS4KICAgKi8KICBib29sIGdldCBpc0N1cnJlbnQ7CgogIC8qKgogICAqIFRoZSByb290IGxpYnJhcnkgZm9yIHRoZSByZWZsZWN0ZWQgaXNvbGF0ZS4KICAgKi8KICBMaWJyYXJ5TWlycm9yIGdldCByb290TGlicmFyeTsKCiAgLyoqCiAgICogV2hldGhlciBbb3RoZXJdIGlzIGFuIFtJc29sYXRlTWlycm9yXSBvbiB0aGUgc2FtZSBpc29sYXRlIGFzIHRoaXMgbWlycm9yLgogICAqCiAgICogVGhlIGVxdWFsaXR5IGhvbGRzIGlmIGFuZCBvbmx5IGlmCiAgICoKICAgKiAxLiBbb3RoZXJdIGlzIGEgbWlycm9yIG9mIHRoZSBzYW1lIGtpbmQsIGFuZAogICAqIDIuIHRoZSBpc29sYXRlIGJlaW5nIHJlZmxlY3RlZCBieSB0aGlzIG1pcnJvciBpcyB0aGUgc2FtZSBpc29sYXRlIGJlaW5nCiAgICogICAgcmVmbGVjdGVkIGJ5IFtvdGhlcl0uCiAgICovCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcik7CgogIC8qKgogICAqIExvYWRzIHRoZSBsaWJyYXJ5IGF0IHRoZSBnaXZlbiB1cmkgaW50byB0aGlzIGlzb2xhdGUuCiAgICoKICAgKiBXQVJOSU5HOiBZb3UgYXJlIHN0cm9uZ2x5IGVuY291cmFnZWQgdG8gdXNlIElzb2xhdGUuc3Bhd25VcmkgaW5zdGVhZCB3aGVuCiAgICogcG9zc2libGUuIElzb2xhdGVNaXJyb3IubG9hZFVyaSBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gc3luY2hyb25vdXMKICAgKiBjb21tdW5pY2F0aW9uIG9yIHNoYXJlZCBzdGF0ZSB3aXRoIGR5bmFtaWNhbGx5IGxvYWRlZCBjb2RlIGlzIG5lZWRlZC4KICAgKgogICAqIElmIGEgbGlicmFyeSB3aXRoIHRoZSBzYW1lIGNhbm9uaWNhbGl6ZWQgdXJpIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkLAogICAqIHRoZSBleGlzdGluZyBsaWJyYXJ5IHdpbGwgYmUgcmV0dXJuZWQuIChUaGUgaXNvbGF0ZSB3aWxsIG5vdCBsb2FkIGEgbmV3CiAgICogY29weSBvZiB0aGUgbGlicmFyeS4pCiAgICoKICAgKiBUaGlzIGJlaGF2aW9yIGlzIHNpbWlsYXIgdG8gdGhlIGJlaGF2aW9yIG9mIGFuIGltcG9ydCBzdGF0ZW1lbnQgdGhhdAogICAqIGFwcGVhcnMgaW4gdGhlIHJvb3QgbGlicmFyeSwgZXhjZXB0IHRoYXQgdGhlIGltcG9ydCBzY29wZSBvZiB0aGUgcm9vdAogICAqIGxpYnJhcnkgaXMgbm90IGNoYW5nZWQuCiAgICovCiAgRnV0dXJlPExpYnJhcnlNaXJyb3I+IGxvYWRVcmkoVXJpIHVyaSk7Cn0KCi8qKgogKiBBIFtEZWNsYXJhdGlvbk1pcnJvcl0gcmVmbGVjdHMgc29tZSBlbnRpdHkgZGVjbGFyZWQgaW4gYSBEYXJ0IHByb2dyYW0uCiAqLwphYnN0cmFjdCBjbGFzcyBEZWNsYXJhdGlvbk1pcnJvciBpbXBsZW1lbnRzIE1pcnJvciB7CiAgLyoqCiAgICogVGhlIHNpbXBsZSBuYW1lIGZvciB0aGlzIERhcnQgbGFuZ3VhZ2UgZW50aXR5LgogICAqCiAgICogVGhlIHNpbXBsZSBuYW1lIGlzIGluIG1vc3QgY2FzZXMgdGhlIGlkZW50aWZpZXIgbmFtZSBvZiB0aGUgZW50aXR5LAogICAqIHN1Y2ggYXMgJ215TWV0aG9kJyBmb3IgYSBtZXRob2QsIFs6dm9pZCBteU1ldGhvZCgpIHsuLi59Ol0gb3IgJ215bGlicmFyeScKICAgKiBmb3IgYSBbOmxpYnJhcnkgJ215bGlicmFyeSc7Ol0gZGVjbGFyYXRpb24uCiAgICovCiAgU3ltYm9sIGdldCBzaW1wbGVOYW1lOwoKICAvKioKICAgKiBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgZm9yIHRoaXMgRGFydCBsYW5ndWFnZSBlbnRpdHkuCiAgICoKICAgKiBUaGlzIG5hbWUgaXMgcXVhbGlmaWVkIGJ5IHRoZSBuYW1lIG9mIHRoZSBvd25lci4gRm9yIGluc3RhbmNlLAogICAqIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiBhIG1ldGhvZCAnbWV0aG9kJyBpbiBjbGFzcyAnQ2xhc3MnIGluCiAgICogbGlicmFyeSAnbGlicmFyeScgaXMgJ2xpYnJhcnkuQ2xhc3MubWV0aG9kJy4KICAgKgogICAqIFJldHVybnMgYSBbU3ltYm9sXSBjb25zdHJ1Y3RlZCBmcm9tIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUKICAgKiBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgcmVmbGVjdGVlLgogICAqIExldCAqbyogYmUgdGhlIFtvd25lcl0gb2YgdGhpcyBtaXJyb3IsIGxldCAqciogYmUgdGhlIHJlZmxlY3RlZSBvZgogICAqIHRoaXMgbWlycm9yLCBsZXQgKnAqIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQKICAgKiBuYW1lIG9mIHRoZSByZWZsZWN0ZWUgb2YgKm8qLCBhbmQgbGV0ICpzKiBiZSB0aGUgc2ltcGxlIG5hbWUgb2YgKnIqCiAgICogY29tcHV0ZWQgYnkgW3NpbXBsZU5hbWVdLgogICAqIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiAqciogaXMgdGhlCiAgICogY29uY2F0ZW5hdGlvbiBvZiAqcCosICcuJywgYW5kICpzKi4KICAgKgogICAqIEJlY2F1c2UgYW4gaXNvbGF0ZSBjYW4gY29udGFpbiBtb3JlIHRoYW4gb25lIGxpYnJhcnkgd2l0aCB0aGUgc2FtZSBuYW1lIChhdAogICAqIGRpZmZlcmVudCBVUklzKSwgYSBmdWxseS1xdWFsaWZpZWQgbmFtZSBkb2VzIG5vdCB1bmlxdWVseSBpZGVudGlmeSBhbnkKICAgKiBsYW5ndWFnZSBlbnRpdHkuCiAgICovCiAgU3ltYm9sIGdldCBxdWFsaWZpZWROYW1lOwoKICAvKioKICAgKiBBIG1pcnJvciBvbiB0aGUgb3duZXIgb2YgdGhpcyBEYXJ0IGxhbmd1YWdlIGVudGl0eS4KICAgKgogICAqIFRoZSBvd25lciBpcyB0aGUgZGVjbGFyYXRpb24gaW1tZWRpYXRlbHkgc3Vycm91bmRpbmcgdGhlIHJlZmxlY3RlZToKICAgKgogICAqICogRm9yIGEgbGlicmFyeSwgdGhlIG93bmVyIGlzIFs6bnVsbDpdLgogICAqICogRm9yIGEgY2xhc3MgZGVjbGFyYXRpb24sIHR5cGVkZWYgb3IgdG9wIGxldmVsIGZ1bmN0aW9uIG9yIHZhcmlhYmxlLCB0aGUKICAgKiAgIG93bmVyIGlzIHRoZSBlbmNsb3NpbmcgbGlicmFyeS4KICAgKiAqIEZvciBhIG1peGluIGFwcGxpY2F0aW9uIGBTIHdpdGggTWAsIHRoZSBvd25lciBpcyB0aGUgb3duZXIgb2YgYE1gLgogICAqICogRm9yIGEgY29uc3RydWN0b3IsIHRoZSBvd25lciBpcyB0aGUgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGNsYXNzLgogICAqICogRm9yIGEgbWV0aG9kLCBpbnN0YW5jZSB2YXJpYWJsZSBvciBhIHN0YXRpYyB2YXJpYWJsZSwgdGhlIG93bmVyIGlzIHRoZQogICAqICAgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGNsYXNzLCB1bmxlc3MgdGhlIGNsYXNzIGlzIGEgbWl4aW4gYXBwbGljYXRpb24KICAgKiAgIGBTIHdpdGggTWAsIGluIHdoaWNoIGNhc2UgdGhlIG93bmVyIGlzIGBNYC4gTm90ZSB0aGF0IGBNYCBtYXkgYmUgYW4KICAgKiAgIGludm9jYXRpb24gb2YgYSBnZW5lcmljLgogICAqICogRm9yIGEgcGFyYW1ldGVyLCBsb2NhbCB2YXJpYWJsZSBvciBsb2NhbCBmdW5jdGlvbiB0aGUgb3duZXIgaXMgdGhlCiAgICogICBpbW1lZGlhdGVseSBlbmNsb3NpbmcgZnVuY3Rpb24uCiAgICovCiAgRGVjbGFyYXRpb25NaXJyb3IgZ2V0IG93bmVyOwoKICAvKioKICAgKiBXaGV0aGVyIHRoaXMgZGVjbGFyYXRpb24gaXMgbGlicmFyeSBwcml2YXRlLgogICAqCiAgICogQWx3YXlzIHJldHVybnMgYGZhbHNlYCBmb3IgYSBsaWJyYXJ5IGRlY2xhcmF0aW9uLAogICAqIG90aGVyd2lzZSByZXR1cm5zIGB0cnVlYCBpZiB0aGUgZGVjbGFyYXRpb24ncyBuYW1lIHN0YXJ0cyB3aXRoIGFuCiAgICogdW5kZXJzY29yZSBjaGFyYWN0ZXIgKGBfYCksIGFuZCBgZmFsc2VgIGlmIGl0IGRvZXNuJ3QuCiAgICovCiAgYm9vbCBnZXQgaXNQcml2YXRlOwoKICAvKioKICAgKiBXaGV0aGVyIHRoaXMgZGVjbGFyYXRpb24gaXMgdG9wLWxldmVsLgogICAqCiAgICogQSBkZWNsYXJhdGlvbiBpcyBjb25zaWRlcmVkIHRvcC1sZXZlbCBpZiBpdHMgW293bmVyXSBpcyBhIFtMaWJyYXJ5TWlycm9yXS4KICAgKi8KICBib29sIGdldCBpc1RvcExldmVsOwoKICAvKioKICAgKiBUaGUgc291cmNlIGxvY2F0aW9uIG9mIHRoaXMgRGFydCBsYW5ndWFnZSBlbnRpdHksIG9yIFs6bnVsbDpdIGlmIHRoZQogICAqIGVudGl0eSBpcyBzeW50aGV0aWMuCiAgICoKICAgKiBJZiB0aGUgcmVmbGVjdGVlIGlzIGEgdmFyaWFibGUsIHRoZSByZXR1cm5lZCBsb2NhdGlvbiBnaXZlcyB0aGUgcG9zaXRpb24KICAgKiBvZiB0aGUgdmFyaWFibGUgbmFtZSBhdCBpdHMgcG9pbnQgb2YgZGVjbGFyYXRpb24uCiAgICoKICAgKiBJZiB0aGUgcmVmbGVjdGVlIGlzIGEgbGlicmFyeSwgY2xhc3MsIHR5cGVkZWYsIGZ1bmN0aW9uIG9yIHR5cGUgdmFyaWFibGUKICAgKiB3aXRoIGFzc29jaWF0ZWQgbWV0YWRhdGEsIHRoZSByZXR1cm5lZCBsb2NhdGlvbiBnaXZlcyB0aGUgcG9zaXRpb24gb2YgdGhlCiAgICogZmlyc3QgbWV0YWRhdGEgZGVjbGFyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSByZWZsZWN0ZWUuCiAgICoKICAgKiBPdGhlcndpc2U6CiAgICoKICAgKiBJZiB0aGUgcmVmbGVjdGVlIGlzIGEgbGlicmFyeSwgdGhlIHJldHVybmVkIGxvY2F0aW9uIGdpdmVzIHRoZSBwb3NpdGlvbiBvZgogICAqIHRoZSBrZXl3b3JkICdsaWJyYXJ5JyBhdCB0aGUgcmVmbGVjdGVlJ3MgcG9pbnQgb2YgZGVjbGFyYXRpb24sIGlmIHRoZQogICAqIHJlZmxlY3RlZSBpcyBhIG5hbWVkIGxpYnJhcnksIG9yIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGZpcnN0IGxpbmUgaW4KICAgKiB0aGUgY29tcGlsYXRpb24gdW5pdCBkZWZpbmluZyB0aGUgcmVmbGVjdGVlIGlmIHRoZSByZWZsZWN0ZWUgaXMgYW5vbnltb3VzLgogICAqCiAgICogSWYgdGhlIHJlZmxlY3RlZSBpcyBhbiBhYnN0cmFjdCBjbGFzcywgdGhlIHJldHVybmVkIGxvY2F0aW9uIGdpdmVzIHRoZQogICAqIHBvc2l0aW9uIG9mIHRoZSBrZXl3b3JkICdhYnN0cmFjdCcgYXQgdGhlIHJlZmxlY3RlZSdzIHBvaW50IG9mIGRlY2xhcmF0aW9uLgogICAqIE90aGVyd2lzZSwgaWYgdGhlIHJlZmxlY3RlZSBpcyBhIGNsYXNzLCB0aGUgcmV0dXJuZWQgbG9jYXRpb24gZ2l2ZXMgdGhlCiAgICogcG9zaXRpb24gb2YgdGhlIGtleXdvcmQgJ2NsYXNzJyBhdCB0aGUgcmVmbGVjdGVlJ3MgcG9pbnQgb2YgZGVjbGFyYXRpb24uCiAgICoKICAgKiBJZiB0aGUgcmVmbGVjdGVlIGlzIGEgdHlwZWRlZiB0aGUgcmV0dXJuZWQgbG9jYXRpb24gZ2l2ZXMgdGhlIHBvc2l0aW9uIG9mCiAgICogdGhlIG9mIHRoZSBrZXl3b3JkICd0eXBlZGVmJyBhdCB0aGUgcmVmbGVjdGVlJ3MgcG9pbnQgb2YgZGVjbGFyYXRpb24uCiAgICoKICAgKiBJZiB0aGUgcmVmbGVjdGVlIGlzIGEgZnVuY3Rpb24gd2l0aCBhIGRlY2xhcmVkIHJldHVybiB0eXBlLCB0aGUgcmV0dXJuZWQKICAgKiBsb2NhdGlvbiBnaXZlcyB0aGUgcG9zaXRpb24gb2YgdGhlIGZ1bmN0aW9uJ3MgcmV0dXJuIHR5cGUgYXQgdGhlCiAgICogcmVmbGVjdGVlJ3MgcG9pbnQgb2YgZGVjbGFyYXRpb24uIE90aGVyd2lzZS4gdGhlIHJldHVybmVkIGxvY2F0aW9uIGdpdmVzCiAgICogdGhlIHBvc2l0aW9uIG9mIHRoZSBmdW5jdGlvbidzIG5hbWUgYXQgdGhlIHJlZmxlY3RlZSdzIHBvaW50IG9mCiAgICogZGVjbGFyYXRpb24uCiAgICoKICAgKiBUaGlzIG9wZXJhdGlvbiBpcyBvcHRpb25hbCBhbmQgbWF5IHRocm93IGFuIFtVbnN1cHBvcnRlZEVycm9yXS4KICAgKi8KICBTb3VyY2VMb2NhdGlvbiBnZXQgbG9jYXRpb247CgogIC8qKgogICAqIEEgbGlzdCBvZiB0aGUgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGVjbGFyYXRpb24uCiAgICoKICAgKiBMZXQgKkQqIGJlIHRoZSBkZWNsYXJhdGlvbiB0aGlzIG1pcnJvciByZWZsZWN0cy4KICAgKiBJZiAqRCogaXMgZGVjb3JhdGVkIHdpdGggYW5ub3RhdGlvbnMgKkExLCAuLi4sIEFuKgogICAqIHdoZXJlICpuID4gMCosIHRoZW4gZm9yIGVhY2ggYW5ub3RhdGlvbiAqQWkqIGFzc29jaWF0ZWQKICAgKiB3aXRoICpELCAxIDw9IGkgPD0gbiosIGxldCAqY2kqIGJlIHRoZSBjb25zdGFudCBvYmplY3QKICAgKiBzcGVjaWZpZWQgYnkgKkFpKi4gVGhlbiB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCB3aG9zZQogICAqIG1lbWJlcnMgYXJlIGluc3RhbmNlIG1pcnJvcnMgb24gKmMxLCAuLi4sIGNuKi4KICAgKiBJZiBubyBhbm5vdGF0aW9ucyBhcmUgYXNzb2NpYXRlZCB3aXRoICpEKiwgdGhlbgogICAqIGFuIGVtcHR5IGxpc3QgaXMgcmV0dXJuZWQuCiAgICoKICAgKiBJZiBldmFsdWF0aW5nIGFueSBvZiAqYzEsIC4uLiwgY24qIHdvdWxkIGNhdXNlIGEKICAgKiBjb21waWxhdGlvbiBlcnJvcgogICAqIHRoZSBlZmZlY3QgaXMgdGhlIHNhbWUgYXMgaWYgYSBub24tcmVmbGVjdGl2ZSBjb21waWxhdGlvbiBlcnJvcgogICAqIGhhZCBiZWVuIGVuY291bnRlcmVkLgogICAqLwogIExpc3Q8SW5zdGFuY2VNaXJyb3I+IGdldCBtZXRhZGF0YTsKfQoKLyoqCiAqIEFuIFtPYmplY3RNaXJyb3JdIGlzIGEgY29tbW9uIHN1cGVyaW50ZXJmYWNlIG9mIFtJbnN0YW5jZU1pcnJvcl0sCiAqIFtDbGFzc01pcnJvcl0sIGFuZCBbTGlicmFyeU1pcnJvcl0gdGhhdCByZXByZXNlbnRzIHRoZWlyIHNoYXJlZAogKiBmdW5jdGlvbmFsaXR5LgogKgogKiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoZSBtaXJyb3JzIGxpYnJhcnksIHRoZXNlIHR5cGVzIGFyZSBhbGwKICogb2JqZWN0LWxpa2UsIGluIHRoYXQgdGhleSBzdXBwb3J0IG1ldGhvZCBpbnZvY2F0aW9uIGFuZCBmaWVsZAogKiBhY2Nlc3MuICBSZWFsIERhcnQgb2JqZWN0cyBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlIFtJbnN0YW5jZU1pcnJvcl0KICogdHlwZS4KICoKICogU2VlIFtJbnN0YW5jZU1pcnJvcl0sIFtDbGFzc01pcnJvcl0sIGFuZCBbTGlicmFyeU1pcnJvcl0uCiAqLwphYnN0cmFjdCBjbGFzcyBPYmplY3RNaXJyb3IgaW1wbGVtZW50cyBNaXJyb3IgewogIC8qKgogICAqIEludm9rZXMgdGhlIG5hbWVkIGZ1bmN0aW9uIGFuZCByZXR1cm5zIGEgbWlycm9yIG9uIHRoZSByZXN1bHQuCiAgICoKICAgKiBMZXQgKm8qIGJlIHRoZSBvYmplY3QgcmVmbGVjdGVkIGJ5IHRoaXMgbWlycm9yLCBsZXQgKmYqIGJlIHRoZSBzaW1wbGUgbmFtZQogICAqIG9mIHRoZSBtZW1iZXIgZGVub3RlZCBieSBbbWVtYmVyTmFtZV0sIGxldCAqYTEsIC4uLiwgYW4qIGJlIHRoZSBlbGVtZW50cwogICAqIG9mIFtwb3NpdGlvbmFsQXJndW1lbnRzXSwgbGV0ICprMSwgLi4uLCBrbSogYmUgdGhlIGlkZW50aWZpZXJzIGRlbm90ZWQgYnkKICAgKiB0aGUgZWxlbWVudHMgb2YgW25hbWVkQXJndW1lbnRzLmtleXNdLCBhbmQgbGV0ICp2MSwgLi4uLCB2bSogYmUgdGhlCiAgICogZWxlbWVudHMgb2YgW25hbWVkQXJndW1lbnRzLnZhbHVlc10uIFRoZW4gdGhpcyBtZXRob2Qgd2lsbCBwZXJmb3JtIHRoZQogICAqIG1ldGhvZCBpbnZvY2F0aW9uICpvLmYoYTEsIC4uLiwgYW4sIGsxOiB2MSwgLi4uLCBrbTogdm0pKiBpbiBhIHNjb3BlIHRoYXQKICAgKiBoYXMgYWNjZXNzIHRvIHRoZSBwcml2YXRlIG1lbWJlcnMgb2YgKm8qIChpZiAqbyogaXMgYSBjbGFzcyBvciBsaWJyYXJ5KSBvcgogICAqIHRoZSBwcml2YXRlIG1lbWJlcnMgb2YgdGhlIGNsYXNzIG9mICpvKiAob3RoZXJ3aXNlKS4KICAgKgogICAqIElmIHRoZSBpbnZvY2F0aW9uIHJldHVybnMgYSByZXN1bHQgKnIqLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSByZXN1bHQgb2YKICAgKiBjYWxsaW5nIFtyZWZsZWN0XVwoKnIqXCkuCiAgICoKICAgKiBJZiB0aGUgaW52b2NhdGlvbiBjYXVzZXMgYSBjb21waWxhdGlvbiBlcnJvciB0aGUgZWZmZWN0IGlzIHRoZSBzYW1lIGFzIGlmCiAgICogYSBub24tcmVmbGVjdGl2ZSBjb21waWxhdGlvbiBlcnJvciBoYWQgYmVlbiBlbmNvdW50ZXJlZC4KICAgKgogICAqIElmIHRoZSBpbnZvY2F0aW9uIHRocm93cyBhbiBleGNlcHRpb24gKmUqICh0aGF0IGl0IGRvZXMgbm90IGNhdGNoKSwgdGhpcwogICAqIG1ldGhvZCB0aHJvd3MgKmUqLgogICAqLwogIC8qCiAgICogVE9ETyh0dXJuaWRnZSk6IEhhbmRsZSBhbWJpZ3VvdXMgbmFtZXMuCiAgICogVE9ETyh0dXJuaWRnZSk6IEhhbmRsZSBvcHRpb25hbCAmIG5hbWVkIGFyZ3VtZW50cy4KICAgKi8KICBJbnN0YW5jZU1pcnJvciBpbnZva2UoU3ltYm9sIG1lbWJlck5hbWUsIExpc3QgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgW01hcDxTeW1ib2wsIGR5bmFtaWM+IG5hbWVkQXJndW1lbnRzXSk7CgogIC8qKgogICAqIEludm9rZXMgYSBnZXR0ZXIgYW5kIHJldHVybnMgYSBtaXJyb3Igb24gdGhlIHJlc3VsdC4KICAgKgogICAqIFRoZSBnZXR0ZXIgY2FuIGJlIHRoZSBpbXBsaWNpdCBnZXR0ZXIgZm9yIGEgZmllbGQgb3IgYSB1c2VyLWRlZmluZWQgZ2V0dGVyCiAgICogbWV0aG9kLgogICAqCiAgICogTGV0ICpvKiBiZSB0aGUgb2JqZWN0IHJlZmxlY3RlZCBieSB0aGlzIG1pcnJvciwKICAgKiBsZXQgKmYqIGJlIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgZ2V0dGVyIGRlbm90ZWQgYnkgW2ZpZWxkTmFtZV0uCiAgICoKICAgKiBUaGVuIHRoaXMgbWV0aG9kIHdpbGwgcGVyZm9ybSB0aGUgZ2V0dGVyIGludm9jYXRpb24gKm8uZiogaW4gYSBzY29wZSB0aGF0CiAgICogaGFzIGFjY2VzcyB0byB0aGUgcHJpdmF0ZSBtZW1iZXJzIG9mICpvKiAoaWYgKm8qIGlzIGEgY2xhc3Mgb3IgbGlicmFyeSkgb3IKICAgKiB0aGUgcHJpdmF0ZSBtZW1iZXJzIG9mIHRoZSBjbGFzcyBvZiAqbyogKG90aGVyd2lzZSkuCiAgICoKICAgKiBJZiB0aGlzIG1pcnJvciBpcyBhbiBbSW5zdGFuY2VNaXJyb3JdLCBhbmQgW2ZpZWxkTmFtZV0gZGVub3RlcyBhbiBpbnN0YW5jZQogICAqIG1ldGhvZCBvbiBpdHMgcmVmbGVjdGVlLCB0aGUgcmVzdWx0IG9mIHRoZSBpbnZvY2F0aW9uIGlzIGFuIGluc3RhbmNlCiAgICogbWlycm9yIG9uIGEgY2xvc3VyZSBjb3JyZXNwb25kaW5nIHRvIHRoYXQgbWV0aG9kLgogICAqCiAgICogSWYgdGhpcyBtaXJyb3IgaXMgYSBbTGlicmFyeU1pcnJvcl0sIGFuZCBbZmllbGROYW1lXSBkZW5vdGVzIGEgdG9wLWxldmVsCiAgICogbWV0aG9kIGluIHRoZSBjb3JyZXNwb25kaW5nIGxpYnJhcnksIHRoZSByZXN1bHQgb2YgdGhlIGludm9jYXRpb24gaXMgYW4KICAgKiBpbnN0YW5jZSBtaXJyb3Igb24gYSBjbG9zdXJlIGNvcnJlc3BvbmRpbmcgdG8gdGhhdCBtZXRob2QuCiAgICoKICAgKiBJZiB0aGlzIG1pcnJvciBpcyBhIFtDbGFzc01pcnJvcl0sIGFuZCBbZmllbGROYW1lXSBkZW5vdGVzIGEgc3RhdGljIG1ldGhvZAogICAqIGluIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzLCB0aGUgcmVzdWx0IG9mIHRoZSBpbnZvY2F0aW9uIGlzIGFuIGluc3RhbmNlCiAgICogbWlycm9yIG9uIGEgY2xvc3VyZSBjb3JyZXNwb25kaW5nIHRvIHRoYXQgbWV0aG9kLgogICAqCiAgICogSWYgdGhlIGludm9jYXRpb24gcmV0dXJucyBhIHJlc3VsdCAqciosIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHJlc3VsdCBvZgogICAqIGNhbGxpbmcgW3JlZmxlY3RdXCgqcipcKS4KICAgKgogICAqIElmIHRoZSBpbnZvY2F0aW9uIGNhdXNlcyBhIGNvbXBpbGF0aW9uIGVycm9yLCB0aGUgZWZmZWN0IGlzIHRoZSBzYW1lIGFzIGlmCiAgICogYSBub24tcmVmbGVjdGl2ZSBjb21waWxhdGlvbiBlcnJvciBoYWQgYmVlbiBlbmNvdW50ZXJlZC4KICAgKgogICAqIElmIHRoZSBpbnZvY2F0aW9uIHRocm93cyBhbiBleGNlcHRpb24gKmUqICh0aGF0IGl0IGRvZXMgbm90IGNhdGNoKSwgdGhpcwogICAqIG1ldGhvZCB0aHJvd3MgKmUqLgogICAqLwogIC8vIFRPRE8oYWhlKTogUmVtb3ZlIHN0dWZmIGFib3V0IHNjb3BlIGFuZCBwcml2YXRlIG1lbWJlcnMuIFtmaWVsZE5hbWVdIGlzIGEKICAvLyBjYXBhYmlsaXR5IGdpdmluZyBhY2Nlc3MgdG8gcHJpdmF0ZSBtZW1iZXJzLgogIEluc3RhbmNlTWlycm9yIGdldEZpZWxkKFN5bWJvbCBmaWVsZE5hbWUpOwoKICAvKioKICAgKiBJbnZva2VzIGEgc2V0dGVyIGFuZCByZXR1cm5zIGEgbWlycm9yIG9uIHRoZSByZXN1bHQuCiAgICoKICAgKiBUaGUgc2V0dGVyIG1heSBiZSBlaXRoZXIgdGhlIGltcGxpY2l0IHNldHRlciBmb3IgYSBub24tZmluYWwgZmllbGQgb3IgYQogICAqIHVzZXItZGVmaW5lZCBzZXR0ZXIgbWV0aG9kLgogICAqCiAgICogTGV0ICpvKiBiZSB0aGUgb2JqZWN0IHJlZmxlY3RlZCBieSB0aGlzIG1pcnJvciwKICAgKiBsZXQgKmYqIGJlIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgZ2V0dGVyIGRlbm90ZWQgYnkgW2ZpZWxkTmFtZV0sCiAgICogYW5kIGxldCAqYSogYmUgdGhlIG9iamVjdCBib3VuZCB0byBbdmFsdWVdLgogICAqCiAgICogVGhlbiB0aGlzIG1ldGhvZCB3aWxsIHBlcmZvcm0gdGhlIHNldHRlciBpbnZvY2F0aW9uICpvLmYgPSBhKiBpbiBhIHNjb3BlCiAgICogdGhhdCBoYXMgYWNjZXNzIHRvIHRoZSBwcml2YXRlIG1lbWJlcnMgb2YgKm8qIChpZiAqbyogaXMgYSBjbGFzcyBvcgogICAqIGxpYnJhcnkpIG9yIHRoZSBwcml2YXRlIG1lbWJlcnMgb2YgdGhlIGNsYXNzIG9mICpvKiAob3RoZXJ3aXNlKS4KICAgKgogICAqIElmIHRoZSBpbnZvY2F0aW9uIHJldHVybnMgYSByZXN1bHQgKnIqLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSByZXN1bHQgb2YKICAgKiBjYWxsaW5nIFtyZWZsZWN0XVwoW3ZhbHVlXVwpLgogICAqCiAgICogSWYgdGhlIGludm9jYXRpb24gY2F1c2VzIGEgY29tcGlsYXRpb24gZXJyb3IsIHRoZSBlZmZlY3QgaXMgdGhlIHNhbWUgYXMgaWYKICAgKiBhIG5vbi1yZWZsZWN0aXZlIGNvbXBpbGF0aW9uIGVycm9yIGhhZCBiZWVuIGVuY291bnRlcmVkLgogICAqCiAgICogSWYgdGhlIGludm9jYXRpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiAqZSogKHRoYXQgaXQgZG9lcyBub3QgY2F0Y2gpIHRoaXMKICAgKiBtZXRob2QgdGhyb3dzICplKi4KICAgKi8KICAvKiBUT0RPKHR1cm5pZGdlKTogSGFuZGxlIGFtYmlndW91cyBuYW1lcy4qLwogIEluc3RhbmNlTWlycm9yIHNldEZpZWxkKFN5bWJvbCBmaWVsZE5hbWUsIE9iamVjdCB2YWx1ZSk7CgogIC8qKgogICAqIFBlcmZvcm1zIFtpbnZvY2F0aW9uXSBvbiB0aGUgcmVmbGVjdGVlIG9mIHRoaXMgW09iamVjdE1pcnJvcl0uCiAgICoKICAgKiBFcXVpdmFsZW50IHRvCiAgICoKICAgKiAgICAgaWYgKGludm9jYXRpb24uaXNHZXR0ZXIpIHsKICAgKiAgICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZChpbnZvY2F0aW9uLm1lbWJlck5hbWUpLnJlZmxlY3RlZTsKICAgKiAgICAgfSBlbHNlIGlmIChpbnZvY2F0aW9uLmlzU2V0dGVyKSB7CiAgICogICAgICAgcmV0dXJuIHRoaXMuc2V0RmllbGQoaW52b2NhdGlvbi5tZW1iZXJOYW1lLAogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb24ucG9zaXRpb25hbEFyZ3VtZW50c1swXSkucmVmbGVjdGVlOwogICAqICAgICB9IGVsc2UgewogICAqICAgICAgIHJldHVybiB0aGlzLmludm9rZShpbnZvY2F0aW9uLm1lbWJlck5hbWUsCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb24ucG9zaXRpb25hbEFyZ3VtZW50cywKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbi5uYW1lZEFyZ3VtZW50cykucmVmbGVjdGVlOwogICAqICAgICB9CiAgICovCiAgZGVsZWdhdGUoSW52b2NhdGlvbiBpbnZvY2F0aW9uKTsKfQoKLyoqCiAqIEFuIFtJbnN0YW5jZU1pcnJvcl0gcmVmbGVjdHMgYW4gaW5zdGFuY2Ugb2YgYSBEYXJ0IGxhbmd1YWdlIG9iamVjdC4KICovCmFic3RyYWN0IGNsYXNzIEluc3RhbmNlTWlycm9yIGltcGxlbWVudHMgT2JqZWN0TWlycm9yIHsKICAvKioKICAgKiBBIG1pcnJvciBvbiB0aGUgdHlwZSBvZiB0aGUgcmVmbGVjdGVlLgogICAqCiAgICogUmV0dXJucyBhIG1pcnJvciBvbiB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSByZWZsZWN0ZWUuCiAgICogVGhlIGNsYXNzIG9mIHRoZSByZWZsZWN0ZWUgbWF5IGRpZmZlciBmcm9tCiAgICogdGhlIG9iamVjdCByZXR1cm5lZCBieSBpbnZva2luZyBbcnVudGltZVR5cGVdIG9uCiAgICogdGhlIHJlZmxlY3RlZS4KICAgKi8KICBDbGFzc01pcnJvciBnZXQgdHlwZTsKCiAgLyoqCiAgICogV2hldGhlciBbcmVmbGVjdGVlXSB3aWxsIHJldHVybiB0aGUgaW5zdGFuY2UgcmVmbGVjdGVkIGJ5IHRoaXMgbWlycm9yLgogICAqCiAgICogVGhpcyB3aWxsIGFsd2F5cyBiZSB0cnVlIGluIHRoZSBsb2NhbCBjYXNlIChyZWZsZWN0aW5nIGluc3RhbmNlcyBpbiB0aGUKICAgKiBzYW1lIGlzb2xhdGUpLCBidXQgb25seSB0cnVlIGluIHRoZSByZW1vdGUgY2FzZSBpZiB0aGlzIG1pcnJvciByZWZsZWN0cyBhCiAgICogc2ltcGxlIHZhbHVlLgogICAqCiAgICogQSB2YWx1ZSBpcyBzaW1wbGUgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaG9sZHM6CiAgICoKICAgKiAqIHRoZSB2YWx1ZSBpcyBbOm51bGw6XQogICAqICogdGhlIHZhbHVlIGlzIG9mIHR5cGUgW251bV0KICAgKiAqIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIFtib29sXQogICAqICogdGhlIHZhbHVlIGlzIG9mIHR5cGUgW1N0cmluZ10KICAgKi8KICBib29sIGdldCBoYXNSZWZsZWN0ZWU7CgogIC8qKgogICAqIElmIHRoZSBbSW5zdGFuY2VNaXJyb3JdIHJlZmxlY3RzIGFuIGluc3RhbmNlIGl0IGlzIG1lYW5pbmdmdWwgdG8KICAgKiBoYXZlIGEgbG9jYWwgcmVmZXJlbmNlIHRvLCB3ZSBwcm92aWRlIGFjY2VzcyB0byB0aGUgYWN0dWFsCiAgICogaW5zdGFuY2UgaGVyZS4KICAgKgogICAqIElmIHlvdSBhY2Nlc3MgW3JlZmxlY3RlZV0gd2hlbiBbaGFzUmVmbGVjdGVlXSBpcyBmYWxzZSwgYW4KICAgKiBleGNlcHRpb24gaXMgdGhyb3duLgogICAqLwogIGdldCByZWZsZWN0ZWU7CgogIC8qKgogICAqIFdoZXRoZXIgdGhpcyBtaXJyb3IgaXMgZXF1YWwgdG8gW290aGVyXS4KICAgKgogICAqIFRoZSBlcXVhbGl0eSBob2xkcyBpZiBhbmQgb25seSBpZgogICAqCiAgICogMS4gW290aGVyXSBpcyBhIG1pcnJvciBvZiB0aGUgc2FtZSBraW5kLCBhbmQKICAgKiAyLiBlaXRoZXIKICAgKgogICAqICAgIGEuIFtoYXNSZWZsZWN0ZWVdIGlzIHRydWUgYW5kIHNvIGlzCiAgICogICAgWzppZGVudGljYWwocmVmbGVjdGVlLCBvdGhlci5yZWZsZWN0ZWUpOl0sIG9yCiAgICoKICAgKiAgICBiLiB0aGUgcmVtb3RlIG9iamVjdHMgcmVmbGVjdGVkIGJ5IHRoaXMgbWlycm9yIGFuZCBieSBbb3RoZXJdIGFyZQogICAqICAgIGlkZW50aWNhbC4KICAgKi8KICBib29sIG9wZXJhdG9yID09KG90aGVyKTsKfQoKLyoqCiAqIEEgW0Nsb3N1cmVNaXJyb3JdIHJlZmxlY3RzIGEgY2xvc3VyZS4KICoKICogQSBbQ2xvc3VyZU1pcnJvcl0gcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZXhlY3V0ZSBpdHMgcmVmbGVjdGVlIGFuZAogKiBpbnRyb3NwZWN0IGl0cyBmdW5jdGlvbi4KICovCmFic3RyYWN0IGNsYXNzIENsb3N1cmVNaXJyb3IgaW1wbGVtZW50cyBJbnN0YW5jZU1pcnJvciB7CiAgLyoqCiAgICogQSBtaXJyb3Igb24gdGhlIGZ1bmN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNsb3N1cmUuCiAgICoKICAgKiBUaGUgZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoIGFuIGltcGxpY2l0IGNsb3N1cmUgb2YgYSBmdW5jdGlvbiBpcyB0aGF0CiAgICogZnVuY3Rpb24uCiAgICoKICAgKiBUaGUgZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBoYXMgYSBbOmNhbGw6XQogICAqIG1ldGhvZCBpcyB0aGF0IFs6Y2FsbDpdIG1ldGhvZC4KICAgKgogICAqIEEgRGFydCBpbXBsZW1lbnRhdGlvbiBtaWdodCBjaG9vc2UgdG8gY3JlYXRlIGEgY2xhc3MgZm9yIGVhY2ggY2xvc3VyZQogICAqIGV4cHJlc3Npb24sIGluIHdoaWNoIGNhc2UgWzpmdW5jdGlvbjpdIHdvdWxkIGJlIHRoZSBzYW1lIGFzCiAgICogWzp0eXBlLmRlY2xhcmF0aW9uc1sjY2FsbF06XS4gQnV0IHRoZSBEYXJ0IGxhbmd1YWdlIG1vZGVsIGRvZXMgbm90IHJlcXVpcmUKICAgKiB0aGlzLiBBIG1vcmUgdHlwaWNhbCBpbXBsZW1lbnRhdGlvbiBpbnZvbHZlcyBhIHNpbmdsZSBjbG9zdXJlIGNsYXNzIGZvcgogICAqIGVhY2ggdHlwZSBzaWduYXR1cmUsIHdoZXJlIHRoZSBjYWxsIG1ldGhvZCBkaXNwYXRjaGVzIHRvIGEgZnVuY3Rpb24gaGVsZAogICAqIGluIHRoZSBjbG9zdXJlIHJhdGhlciB0aGUgY2FsbCBtZXRob2QKICAgKiBkaXJlY3RseSBpbXBsZW1lbnRpbmcgdGhlIGNsb3N1cmUgYm9keS4gU28gb25lIGNhbm5vdCByZWx5IG9uIGNsb3N1cmVzIGZyb20KICAgKiBkaXN0aW5jdCBjbG9zdXJlIGV4cHJlc3Npb25zIGhhdmluZyBkaXN0aW5jdCBjbGFzc2VzIChbOnR5cGU6XSksIGJ1dCBvbmUKICAgKiBjYW4gcmVseSBvbiB0aGVtIGhhdmluZyBkaXN0aW5jdCBmdW5jdGlvbnMgKFs6ZnVuY3Rpb246XSkuCiAgICovCiAgTWV0aG9kTWlycm9yIGdldCBmdW5jdGlvbjsKCiAgLyoqCiAgICogRXhlY3V0ZXMgdGhlIGNsb3N1cmUgYW5kIHJldHVybnMgYSBtaXJyb3Igb24gdGhlIHJlc3VsdC4KICAgKgogICAqIExldCAqZiogYmUgdGhlIGNsb3N1cmUgcmVmbGVjdGVkIGJ5IHRoaXMgbWlycm9yLAogICAqIGxldCAqYTEsIC4uLiwgYW4qIGJlIHRoZSBlbGVtZW50cyBvZiBbcG9zaXRpb25hbEFyZ3VtZW50c10sCiAgICogbGV0ICprMSwgLi4uLCBrbSogYmUgdGhlIGlkZW50aWZpZXJzIGRlbm90ZWQgYnkgdGhlIGVsZW1lbnRzIG9mCiAgICogW25hbWVkQXJndW1lbnRzLmtleXNdLAogICAqIGFuZCBsZXQgKnYxLCAuLi4sIHZtKiBiZSB0aGUgZWxlbWVudHMgb2YgW25hbWVkQXJndW1lbnRzLnZhbHVlc10uCiAgICoKICAgKiBUaGVuIHRoaXMgbWV0aG9kIHdpbGwgcGVyZm9ybSB0aGUgbWV0aG9kIGludm9jYXRpb24KICAgKiAqZihhMSwgLi4uLCBhbiwgazE6IHYxLCAuLi4sIGttOiB2bSkqLgogICAqCiAgICogSWYgdGhlIGludm9jYXRpb24gcmV0dXJucyBhIHJlc3VsdCAqciosIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHJlc3VsdCBvZgogICAqIGNhbGxpbmcgW3JlZmxlY3RdXCgqcipcKS4KICAgKgogICAqIElmIHRoZSBpbnZvY2F0aW9uIGNhdXNlcyBhIGNvbXBpbGF0aW9uIGVycm9yLCB0aGUgZWZmZWN0IGlzIHRoZSBzYW1lIGFzIGlmCiAgICogYSBub24tcmVmbGVjdGl2ZSBjb21waWxhdGlvbiBlcnJvciBoYWQgYmVlbiBlbmNvdW50ZXJlZC4KICAgKgogICAqIElmIHRoZSBpbnZvY2F0aW9uIHRocm93cyBhbiBleGNlcHRpb24gKmUqICh0aGF0IGl0IGRvZXMgbm90IGNhdGNoKSwgdGhpcwogICAqIG1ldGhvZCB0aHJvd3MgKmUqLgogICAqLwogIEluc3RhbmNlTWlycm9yIGFwcGx5KExpc3QgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgW01hcDxTeW1ib2wsIGR5bmFtaWM+IG5hbWVkQXJndW1lbnRzXSk7Cn0KCi8qKgogKiBBIFtMaWJyYXJ5TWlycm9yXSByZWZsZWN0cyBhIERhcnQgbGFuZ3VhZ2UgbGlicmFyeSwgcHJvdmlkaW5nCiAqIGFjY2VzcyB0byB0aGUgdmFyaWFibGVzLCBmdW5jdGlvbnMsIGFuZCBjbGFzc2VzIG9mIHRoZQogKiBsaWJyYXJ5LgogKi8KYWJzdHJhY3QgY2xhc3MgTGlicmFyeU1pcnJvciBpbXBsZW1lbnRzIERlY2xhcmF0aW9uTWlycm9yLCBPYmplY3RNaXJyb3IgewogIC8qKgogICAqIFRoZSBhYnNvbHV0ZSB1cmkgb2YgdGhlIGxpYnJhcnkuCiAgICovCiAgVXJpIGdldCB1cmk7CgogIC8qKgogICAqIFJldHVybnMgYW4gaW1tdXRhYmxlIG1hcCBvZiB0aGUgZGVjbGFyYXRpb25zIGFjdHVhbGx5IGdpdmVuIGluIHRoZSBsaWJyYXJ5LgogICAqCiAgICogVGhpcyBtYXAgaW5jbHVkZXMgYWxsIHJlZ3VsYXIgbWV0aG9kcywgZ2V0dGVycywgc2V0dGVycywgZmllbGRzLCBjbGFzc2VzCiAgICogYW5kIHR5cGVkZWZzIGFjdHVhbGx5IGRlY2xhcmVkIGluIHRoZSBsaWJyYXJ5LiBUaGUgbWFwIGlzIGtleWVkIGJ5IHRoZQogICAqIHNpbXBsZSBuYW1lcyBvZiB0aGUgZGVjbGFyYXRpb25zLgogICAqLwogIE1hcDxTeW1ib2wsIERlY2xhcmF0aW9uTWlycm9yPiBnZXQgZGVjbGFyYXRpb25zOwoKICAvKioKICAgKiBXaGV0aGVyIHRoaXMgbWlycm9yIGlzIGVxdWFsIHRvIFtvdGhlcl0uCiAgICoKICAgKiBUaGUgZXF1YWxpdHkgaG9sZHMgaWYgYW5kIG9ubHkgaWYKICAgKgogICAqIDEuIFtvdGhlcl0gaXMgYSBtaXJyb3Igb2YgdGhlIHNhbWUga2luZCwgYW5kCiAgICogMi4gVGhlIGxpYnJhcnkgYmVpbmcgcmVmbGVjdGVkIGJ5IHRoaXMgbWlycm9yIGFuZCB0aGUgbGlicmFyeSBiZWluZwogICAqICAgIHJlZmxlY3RlZCBieSBbb3RoZXJdIGFyZSB0aGUgc2FtZSBsaWJyYXJ5IGluIHRoZSBzYW1lIGlzb2xhdGUuCiAgICovCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcik7CgogIC8qKgogICAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBpbXBvcnRzIGFuZCBleHBvcnRzIGluIHRoaXMgbGlicmFyeTsKICAgKi8KICBMaXN0PExpYnJhcnlEZXBlbmRlbmN5TWlycm9yPiBnZXQgbGlicmFyeURlcGVuZGVuY2llczsKfQoKLy8vIEEgbWlycm9yIG9uIGFuIGltcG9ydCBvciBleHBvcnQgZGVjbGFyYXRpb24uCmFic3RyYWN0IGNsYXNzIExpYnJhcnlEZXBlbmRlbmN5TWlycm9yIGltcGxlbWVudHMgTWlycm9yIHsKICAvLy8gSXMgYHRydWVgIGlmIHRoaXMgZGVwZW5kZW5jeSBpcyBhbiBpbXBvcnQuCiAgYm9vbCBnZXQgaXNJbXBvcnQ7CgogIC8vLyBJcyBgdHJ1ZWAgaWYgdGhpcyBkZXBlbmRlbmN5IGlzIGFuIGV4cG9ydC4KICBib29sIGdldCBpc0V4cG9ydDsKCiAgLy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBkZXBlbmRlbmN5IGlzIGEgZGVmZXJyZWQgaW1wb3J0LiBPdGhlcndpc2UgcmV0dXJucwogIC8vLyBmYWxzZS4KICBib29sIGdldCBpc0RlZmVycmVkOwoKICAvLy8gUmV0dXJucyB0aGUgbGlicmFyeSBtaXJyb3Igb2YgdGhlIGxpYnJhcnkgdGhhdCBpbXBvcnRzIG9yIGV4cG9ydHMgdGhlCiAgLy8vIFt0YXJnZXRMaWJyYXJ5XS4KICBMaWJyYXJ5TWlycm9yIGdldCBzb3VyY2VMaWJyYXJ5OwoKICAvLy8gUmV0dXJucyB0aGUgbGlicmFyeSBtaXJyb3Igb2YgdGhlIGxpYnJhcnkgdGhhdCBpcyBpbXBvcnRlZCBvciBleHBvcnRlZCwKICAvLy8gb3IgbnVsbCBpZiB0aGUgbGlicmFyeSBpcyBub3QgbG9hZGVkLgogIExpYnJhcnlNaXJyb3IgZ2V0IHRhcmdldExpYnJhcnk7CgogIC8vLyBSZXR1cm5zIHRoZSBwcmVmaXggaWYgdGhpcyBpcyBhIHByZWZpeGVkIGltcG9ydCBhbmQgYG51bGxgIG90aGVyd2lzZS4KICBTeW1ib2wgZ2V0IHByZWZpeDsKCiAgLy8vIFJldHVybnMgdGhlIGxpc3Qgb2Ygc2hvdy9oaWRlIGNvbWJpbmF0b3JzIG9uIHRoZSBpbXBvcnQvZXhwb3J0CiAgLy8vIGRlY2xhcmF0aW9uLgogIExpc3Q8Q29tYmluYXRvck1pcnJvcj4gZ2V0IGNvbWJpbmF0b3JzOwoKICAvLy8gUmV0dXJucyB0aGUgc291cmNlIGxvY2F0aW9uIGZvciB0aGlzIGltcG9ydC9leHBvcnQgZGVjbGFyYXRpb24uCiAgU291cmNlTG9jYXRpb24gZ2V0IGxvY2F0aW9uOwoKICBMaXN0PEluc3RhbmNlTWlycm9yPiBnZXQgbWV0YWRhdGE7CgogIC8vLyBSZXR1cm5zIGEgZnV0dXJlIHRoYXQgY29tcGxldGVzIHdpdGggYSBsaWJyYXJ5IG1pcnJvciBvbiB0aGUgbGlicmFyeSBiZWluZwogIC8vLyBpbXBvcnRlZCBvciBleHBvcnRlZCB3aGVuIGl0IGlzIGxvYWRlZCwgYW5kIGluaXRpYXRlcyBhIGxvYWQgb2YgdGhhdAogIC8vLyBsaWJyYXJ5IGlmIGl0IGlzIG5vdCBsb2FkZWQuCiAgRnV0dXJlPExpYnJhcnlNaXJyb3I+IGxvYWRMaWJyYXJ5KCk7Cn0KCi8vLyBBIG1pcnJvciBvbiBhIHNob3cvaGlkZSBjb21iaW5hdG9yIGRlY2xhcmVkIG9uIGEgbGlicmFyeSBkZXBlbmRlbmN5LgphYnN0cmFjdCBjbGFzcyBDb21iaW5hdG9yTWlycm9yIGltcGxlbWVudHMgTWlycm9yIHsKICAvLy8gVGhlIGxpc3Qgb2YgaWRlbnRpZmllcnMgb24gdGhlIGNvbWJpbmF0b3IuCiAgTGlzdDxTeW1ib2w+IGdldCBpZGVudGlmaWVyczsKCiAgLy8vIElzIGB0cnVlYCBpZiB0aGlzIGlzIGEgJ3Nob3cnIGNvbWJpbmF0b3IuCiAgYm9vbCBnZXQgaXNTaG93OwoKICAvLy8gSXMgYHRydWVgIGlmIHRoaXMgaXMgYSAnaGlkZScgY29tYmluYXRvci4KICBib29sIGdldCBpc0hpZGU7Cn0KCi8qKgogKiBBIFtUeXBlTWlycm9yXSByZWZsZWN0cyBhIERhcnQgbGFuZ3VhZ2UgY2xhc3MsIHR5cGVkZWYsCiAqIGZ1bmN0aW9uIHR5cGUgb3IgdHlwZSB2YXJpYWJsZS4KICovCmFic3RyYWN0IGNsYXNzIFR5cGVNaXJyb3IgaW1wbGVtZW50cyBEZWNsYXJhdGlvbk1pcnJvciB7CiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbWlycm9yIHJlZmxlY3RzIGR5bmFtaWMsIGEgbm9uLWdlbmVyaWMgY2xhc3Mgb3IKICAgKiB0eXBlZGVmLCBvciBhbiBpbnN0YW50aWF0ZWQgZ2VuZXJpYyBjbGFzcyBvciB0eXBlZGVmIGluIHRoZSBjdXJyZW50CiAgICogaXNvbGF0ZS4gT3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlLgogICAqLwogIGJvb2wgZ2V0IGhhc1JlZmxlY3RlZFR5cGU7CgogIC8qKgogICAqIElmIFs6aGFzUmVmbGVjdGVkVHlwZTpdIHJldHVybnMgdHJ1ZSwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBbVHlwZV0uCiAgICogT3RoZXJ3aXNlLCBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0gaXMgdGhyb3duLgogICAqLwogIFR5cGUgZ2V0IHJlZmxlY3RlZFR5cGU7CgogIC8qKgogICAqIEFuIGltbXV0YWJsZSBsaXN0IHdpdGggbWlycm9ycyBmb3IgYWxsIHR5cGUgdmFyaWFibGVzIGZvciB0aGlzIHR5cGUuCiAgICoKICAgKiBJZiB0aGlzIHR5cGUgaXMgYSBnZW5lcmljIGRlY2xhcmF0aW9uIG9yIGFuIGludm9jYXRpb24gb2YgYSBnZW5lcmljCiAgICogZGVjbGFyYXRpb24sIHRoZSByZXR1cm5lZCBsaXN0IGNvbnRhaW5zIG1pcnJvcnMgb24gdGhlIHR5cGUgdmFyaWFibGVzCiAgICogZGVjbGFyZWQgaW4gdGhlIG9yaWdpbmFsIGRlY2xhcmF0aW9uLgogICAqIE90aGVyd2lzZSwgdGhlIHJldHVybmVkIGxpc3QgaXMgZW1wdHkuCiAgICoKICAgKiBUaGlzIGxpc3QgcHJlc2VydmVzIHRoZSBvcmRlciBvZiBkZWNsYXJhdGlvbiBvZiB0aGUgdHlwZSB2YXJpYWJsZXMuCiAgICovCiAgTGlzdDxUeXBlVmFyaWFibGVNaXJyb3I+IGdldCB0eXBlVmFyaWFibGVzOwoKICAvKioKICAgKiBBbiBpbW11dGFibGUgbGlzdCB3aXRoIG1pcnJvcnMgZm9yIGFsbCB0eXBlIGFyZ3VtZW50cyBmb3IKICAgKiB0aGlzIHR5cGUuCiAgICoKICAgKiBJZiB0aGUgcmVmbGVjdGVlIGlzIGFuIGludm9jYXRpb24gb2YgYSBnZW5lcmljIGNsYXNzLAogICAqIHRoZSB0eXBlIGFyZ3VtZW50cyBhcmUgdGhlIGJpbmRpbmdzIG9mIGl0cyB0eXBlIHBhcmFtZXRlcnMuCiAgICogSWYgdGhlIHJlZmxlY3RlZSBpcyB0aGUgb3JpZ2luYWwgZGVjbGFyYXRpb24gb2YgYSBnZW5lcmljLAogICAqIGl0IGhhcyBubyB0eXBlIGFyZ3VtZW50cyBhbmQgdGhpcyBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBsaXN0LgogICAqIElmIHRoZSByZWZsZWN0ZWUgaXMgbm90IGdlbmVyaWMsIHRoZW4KICAgKiBpdCBoYXMgbm8gdHlwZSBhcmd1bWVudHMgYW5kIHRoaXMgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgbGlzdC4KICAgKgogICAqIFRoaXMgbGlzdCBwcmVzZXJ2ZXMgdGhlIG9yZGVyIG9mIGRlY2xhcmF0aW9uIG9mIHRoZSB0eXBlIHZhcmlhYmxlcy4KICAgKi8KICBMaXN0PFR5cGVNaXJyb3I+IGdldCB0eXBlQXJndW1lbnRzOwoKICAvKioKICAgKiBJcyB0aGlzIHRoZSBvcmlnaW5hbCBkZWNsYXJhdGlvbiBvZiB0aGlzIHR5cGU/CiAgICoKICAgKiBGb3IgbW9zdCBjbGFzc2VzLCB0aGV5IGFyZSB0aGVpciBvd24gb3JpZ2luYWwgZGVjbGFyYXRpb24uICBGb3IKICAgKiBnZW5lcmljIGNsYXNzZXMsIGhvd2V2ZXIsIHRoZXJlIGlzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiB0aGUKICAgKiBvcmlnaW5hbCBjbGFzcyBkZWNsYXJhdGlvbiwgd2hpY2ggaGFzIHVuYm91bmQgdHlwZSB2YXJpYWJsZXMsIGFuZAogICAqIHRoZSBpbnN0YW50aWF0aW9ucyBvZiBnZW5lcmljIGNsYXNzZXMsIHdoaWNoIGhhdmUgYm91bmQgdHlwZQogICAqIHZhcmlhYmxlcy4KICAgKi8KICBib29sIGdldCBpc09yaWdpbmFsRGVjbGFyYXRpb247CgogIC8qKgogICAqIEEgbWlycm9yIG9uIHRoZSBvcmlnaW5hbCBkZWNsYXJhdGlvbiBvZiB0aGlzIHR5cGUuCiAgICoKICAgKiBGb3IgbW9zdCBjbGFzc2VzLCB0aGV5IGFyZSB0aGVpciBvd24gb3JpZ2luYWwgZGVjbGFyYXRpb24uICBGb3IKICAgKiBnZW5lcmljIGNsYXNzZXMsIGhvd2V2ZXIsIHRoZXJlIGlzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiB0aGUKICAgKiBvcmlnaW5hbCBjbGFzcyBkZWNsYXJhdGlvbiwgd2hpY2ggaGFzIHVuYm91bmQgdHlwZSB2YXJpYWJsZXMsIGFuZAogICAqIHRoZSBpbnN0YW50aWF0aW9ucyBvZiBnZW5lcmljIGNsYXNzZXMsIHdoaWNoIGhhdmUgYm91bmQgdHlwZQogICAqIHZhcmlhYmxlcy4KICAgKi8KICBUeXBlTWlycm9yIGdldCBvcmlnaW5hbERlY2xhcmF0aW9uOwoKICAvKioKICAgKiBDaGVja3MgdGhlIHN1YnR5cGUgcmVsYXRpb25zaGlwLCBkZW5vdGVkIGJ5IGA8OmAgaW4gdGhlIGxhbmd1YWdlCiAgICogc3BlY2lmaWNhdGlvbi4KICAgKgogICAqIFRoaXMgaXMgdGhlIHR5cGUgcmVsYXRpb25zaGlwIHVzZWQgaW4gYGlzYCB0ZXN0IGNoZWNrcy4KICAgKi8KICBib29sIGlzU3VidHlwZU9mKFR5cGVNaXJyb3Igb3RoZXIpOwoKICAvKioKICAgKiBDaGVja3MgdGhlIGFzc2lnbmFiaWxpdHkgcmVsYXRpb25zaGlwLCBkZW5vdGVkIGJ5IGA8PT5gIGluIHRoZSBsYW5ndWFnZQogICAqIHNwZWNpZmljYXRpb24uCiAgICoKICAgKiBUaGlzIGlzIHRoZSB0eXBlIHJlbGF0aW9uc2hpcCB0ZXN0ZWQgb24gYXNzaWdubWVudCBpbiBjaGVja2VkIG1vZGUuCiAgICovCiAgYm9vbCBpc0Fzc2lnbmFibGVUbyhUeXBlTWlycm9yIG90aGVyKTsKfQoKLyoqCiAqIEEgW0NsYXNzTWlycm9yXSByZWZsZWN0cyBhIERhcnQgbGFuZ3VhZ2UgY2xhc3MuCiAqLwphYnN0cmFjdCBjbGFzcyBDbGFzc01pcnJvciBpbXBsZW1lbnRzIFR5cGVNaXJyb3IsIE9iamVjdE1pcnJvciB7CiAgLyoqCiAgICogQSBtaXJyb3Igb24gdGhlIHN1cGVyY2xhc3Mgb24gdGhlIHJlZmxlY3RlZS4KICAgKgogICAqIElmIHRoaXMgdHlwZSBpcyBbOk9iamVjdDpdLCB0aGUgc3VwZXJjbGFzcyB3aWxsIGJlIG51bGwuCiAgICovCiAgQ2xhc3NNaXJyb3IgZ2V0IHN1cGVyY2xhc3M7CgogIC8qKgogICAqIEEgbGlzdCBvZiBtaXJyb3JzIG9uIHRoZSBzdXBlcmludGVyZmFjZXMgb2YgdGhlIHJlZmxlY3RlZS4KICAgKi8KICBMaXN0PENsYXNzTWlycm9yPiBnZXQgc3VwZXJpbnRlcmZhY2VzOwoKICAvKioKICAgKiBJcyB0aGUgcmVmbGVjdGVlIGFic3RyYWN0PwogICAqLwogIGJvb2wgZ2V0IGlzQWJzdHJhY3Q7CgogIC8qKgogICAqIElzIHRoZSByZWZsZWN0ZWUgYW4gZW51bT8KICAgKi8KICBib29sIGdldCBpc0VudW07CgogIC8qKgogICAqIFJldHVybnMgYW4gaW1tdXRhYmxlIG1hcCBvZiB0aGUgZGVjbGFyYXRpb25zIGFjdHVhbGx5IGdpdmVuIGluIHRoZSBjbGFzcwogICAqIGRlY2xhcmF0aW9uLgogICAqCiAgICogVGhpcyBtYXAgaW5jbHVkZXMgYWxsIHJlZ3VsYXIgbWV0aG9kcywgZ2V0dGVycywgc2V0dGVycywgZmllbGRzLAogICAqIGNvbnN0cnVjdG9ycyBhbmQgdHlwZSB2YXJpYWJsZXMgYWN0dWFsbHkgZGVjbGFyZWQgaW4gdGhlIGNsYXNzLiBCb3RoCiAgICogc3RhdGljIGFuZCBpbnN0YW5jZSBtZW1iZXJzIGFyZSBpbmNsdWRlZCwgYnV0IG5vIGluaGVyaXRlZCBtZW1iZXJzIGFyZQogICAqIGluY2x1ZGVkLiBUaGUgbWFwIGlzIGtleWVkIGJ5IHRoZSBzaW1wbGUgbmFtZXMgb2YgdGhlIGRlY2xhcmF0aW9ucy4KICAgKgogICAqIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBpbmhlcml0ZWQgbWVtYmVycy4KICAgKi8KICBNYXA8U3ltYm9sLCBEZWNsYXJhdGlvbk1pcnJvcj4gZ2V0IGRlY2xhcmF0aW9uczsKCiAgLyoqCiAgICogUmV0dXJucyBhIG1hcCBvZiB0aGUgbWV0aG9kcywgZ2V0dGVycyBhbmQgc2V0dGVycyBvZiBhbiBpbnN0YW5jZSBvZiB0aGUKICAgKiBjbGFzcy4KICAgKgogICAqIFRoZSBpbnRlbnQgaXMgdG8gY2FwdHVyZSB0aG9zZSBtZW1iZXJzIHRoYXQgY29uc3RpdHV0ZSB0aGUgQVBJIG9mIGFuCiAgICogaW5zdGFuY2UuIEhlbmNlIGZpZWxkcyBhcmUgbm90IGluY2x1ZGVkLCBidXQgdGhlIGdldHRlcnMgYW5kIHNldHRlcnMKICAgKiBpbXBsaWNpdGx5IGludHJvZHVjZWQgYnkgZmllbGRzIGFyZSBpbmNsdWRlZC4gVGhlIG1hcCBpbmNsdWRlcyBtZXRob2RzLAogICAqIGdldHRlcnMgYW5kIHNldHRlcnMgdGhhdCBhcmUgaW5oZXJpdGVkIGFzIHdlbGwgYXMgdGhvc2UgaW50cm9kdWNlZCBieSB0aGUKICAgKiBjbGFzcyBpdHNlbGYuCiAgICoKICAgKiBUaGUgbWFwIGlzIGtleWVkIGJ5IHRoZSBzaW1wbGUgbmFtZXMgb2YgdGhlIG1lbWJlcnMuCiAgICovCiAgTWFwPFN5bWJvbCwgTWV0aG9kTWlycm9yPiBnZXQgaW5zdGFuY2VNZW1iZXJzOwoKICAvKioKICAgKiBSZXR1cm5zIGEgbWFwIG9mIHRoZSBzdGF0aWMgbWV0aG9kcywgZ2V0dGVycyBhbmQgc2V0dGVycyBvZiB0aGUgY2xhc3MuCiAgICoKICAgKiBUaGUgaW50ZW50IGlzIHRvIGNhcHR1cmUgdGhvc2UgbWVtYmVycyB0aGF0IGNvbnN0aXR1dGUgdGhlIEFQSSBvZiBhIGNsYXNzLgogICAqIEhlbmNlIGZpZWxkcyBhcmUgbm90IGluY2x1ZGVkLCBidXQgdGhlIGdldHRlcnMgYW5kIHNldHRlcnMgaW1wbGljaXRseQogICAqIGludHJvZHVjZWQgYnkgZmllbGRzIGFyZSBpbmNsdWRlZC4KICAgKgogICAqIFRoZSBtYXAgaXMga2V5ZWQgYnkgdGhlIHNpbXBsZSBuYW1lcyBvZiB0aGUgbWVtYmVycy4KICAgKi8KICBNYXA8U3ltYm9sLCBNZXRob2RNaXJyb3I+IGdldCBzdGF0aWNNZW1iZXJzOwoKICAvKioKICAgKiBUaGUgbWl4aW4gb2YgdGhpcyBjbGFzcy4KICAgKgogICAqIElmIHRoaXMgY2xhc3MgaXMgdGhlIHJlc3VsdCBvZiBhIG1peGluIGFwcGxpY2F0aW9uIG9mIHRoZSBmb3JtIFMgd2l0aCBNLAogICAqIHJldHVybnMgYSBjbGFzcyBtaXJyb3Igb24gTS4gT3RoZXJ3aXNlIHJldHVybnMgYSBjbGFzcyBtaXJyb3Igb24KICAgKiB0aGUgcmVmbGVjdGVlLgogICAqLwogIENsYXNzTWlycm9yIGdldCBtaXhpbjsKCiAgLy8gVE9ETyhhaGUpOiBXaGF0IGFib3V0OgogIC8vIC8vLyBGaW5kcyB0aGUgaW5zdGFuY2UgbWVtYmVyIG5hbWVkIFtuYW1lXSBkZWNsYXJlZCBvciBpbmhlcml0ZWQgaW4gdGhlCiAgLy8gLy8vIHJlZmxlY3RlZCBjbGFzcy4KICAvLyBEZWNsYXJhdGlvbk1pcnJvciBpbnN0YW5jZUxvb2t1cChTeW1ib2wgbmFtZSk7CgogIC8qKgogICAqIEludm9rZXMgdGhlIG5hbWVkIGNvbnN0cnVjdG9yIGFuZCByZXR1cm5zIGEgbWlycm9yIG9uIHRoZSByZXN1bHQuCiAgICoKICAgKiBMZXQgKmMqIGJlIHRoZSBjbGFzcyByZWZsZWN0ZWQgYnkgdGhpcyBtaXJyb3IsCiAgICogbGV0ICphMSwgLi4uLCBhbiogYmUgdGhlIGVsZW1lbnRzIG9mIFtwb3NpdGlvbmFsQXJndW1lbnRzXSwKICAgKiBsZXQgKmsxLCAuLi4sIGttKiBiZSB0aGUgaWRlbnRpZmllcnMgZGVub3RlZCBieSB0aGUgZWxlbWVudHMgb2YKICAgKiBbbmFtZWRBcmd1bWVudHMua2V5c10sCiAgICogYW5kIGxldCAqdjEsIC4uLiwgdm0qIGJlIHRoZSBlbGVtZW50cyBvZiBbbmFtZWRBcmd1bWVudHMudmFsdWVzXS4KICAgKgogICAqIElmIFtjb25zdHJ1Y3Rvck5hbWVdIHdhcyBjcmVhdGVkIGZyb20gdGhlIGVtcHR5IHN0cmluZywgdGhlbiB0aGlzIG1ldGhvZAogICAqIHdpbGwgZXhlY3V0ZSB0aGUgaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbgogICAqICpuZXcgYyhhMSwgLi4uLCBhbiwgazE6IHYxLCAuLi4sIGttOiB2bSkqIGluIGEgc2NvcGUgdGhhdCBoYXMgYWNjZXNzIHRvCiAgICogdGhlIHByaXZhdGUgbWVtYmVycyBvZiAqYyouCiAgICoKICAgKiBPdGhlcndpc2UsIGxldCAqZiogYmUgdGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBjb25zdHJ1Y3RvciBkZW5vdGVkIGJ5CiAgICogW2NvbnN0cnVjdG9yTmFtZV0uIFRoZW4gdGhpcyBtZXRob2Qgd2lsbCBleGVjdXRlIHRoZSBpbnN0YW5jZSBjcmVhdGlvbgogICAqIGV4cHJlc3Npb24gKm5ldyBjLmYoYTEsIC4uLiwgYW4sIGsxOiB2MSwgLi4uLCBrbTogdm0pKiBpbiBhIHNjb3BlIHRoYXQgaGFzCiAgICogYWNjZXNzIHRvIHRoZSBwcml2YXRlIG1lbWJlcnMgb2YgKmMqLgogICAqCiAgICogSW4gZWl0aGVyIGNhc2U6CiAgICoKICAgKiAqIElmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIHJlc3VsdCAqciosIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlCiAgICogICByZXN1bHQgb2YgY2FsbGluZyBbcmVmbGVjdF1cKCpyKlwpLgogICAqICogSWYgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbiBjYXVzZXMgYSBjb21waWxhdGlvbiBlcnJvciwgdGhlIGVmZmVjdCBpcwogICAqICAgdGhlIHNhbWUgYXMgaWYgYSBub24tcmVmbGVjdGl2ZSBjb21waWxhdGlvbiBlcnJvciBoYWQgYmVlbiBlbmNvdW50ZXJlZC4KICAgKiAqIElmIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiAqZSogKHRoYXQgaXQgZG9lcyBub3QKICAgKiAgIGNhdGNoKSwgdGhpcyBtZXRob2QgdGhyb3dzICplKi4KICAgKi8KICBJbnN0YW5jZU1pcnJvciBuZXdJbnN0YW5jZShTeW1ib2wgY29uc3RydWN0b3JOYW1lLCBMaXN0IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIFtNYXA8U3ltYm9sLCBkeW5hbWljPiBuYW1lZEFyZ3VtZW50c10pOwoKICAvKioKICAgKiBXaGV0aGVyIHRoaXMgbWlycm9yIGlzIGVxdWFsIHRvIFtvdGhlcl0uCiAgICoKICAgKiBUaGUgZXF1YWxpdHkgaG9sZHMgaWYgYW5kIG9ubHkgaWYKICAgKgogICAqIDEuIFtvdGhlcl0gaXMgYSBtaXJyb3Igb2YgdGhlIHNhbWUga2luZCwgYW5kCiAgICogMi4gVGhpcyBtaXJyb3IgYW5kIFtvdGhlcl0gcmVmbGVjdCB0aGUgc2FtZSBjbGFzcy4KICAgKgogICAqIE5vdGUgdGhhdCBpZiB0aGUgcmVmbGVjdGVkIGNsYXNzIGlzIGFuIGludm9jYXRpb24gb2YgYSBnZW5lcmljIGNsYXNzLCAyLgogICAqIGltcGxpZXMgdGhhdCB0aGUgcmVmbGVjdGVkIGNsYXNzIGFuZCBbb3RoZXJdIGhhdmUgZXF1YWwgdHlwZSBhcmd1bWVudHMuCiAgICovCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcik7CgogIC8qKgogICAqIFJldHVybnMgd2hldGhlciB0aGUgY2xhc3MgZGVub3RlZCBieSB0aGUgcmVjZWl2ZXIgaXMgYSBzdWJjbGFzcyBvZiB0aGUKICAgKiBjbGFzcyBkZW5vdGVkIGJ5IHRoZSBhcmd1bWVudC4KICAgKgogICAqIE5vdGUgdGhhdCB0aGUgc3ViY2xhc3MgcmVsYXRpb25zaGlwIGlzIHJlZmxleGl2ZS4KICAgKi8KICBib29sIGlzU3ViY2xhc3NPZihDbGFzc01pcnJvciBvdGhlcik7Cn0KCi8qKgogKiBBIFtGdW5jdGlvblR5cGVNaXJyb3JdIHJlcHJlc2VudHMgdGhlIHR5cGUgb2YgYSBmdW5jdGlvbiBpbiB0aGUKICogRGFydCBsYW5ndWFnZS4KICovCmFic3RyYWN0IGNsYXNzIEZ1bmN0aW9uVHlwZU1pcnJvciBpbXBsZW1lbnRzIENsYXNzTWlycm9yIHsKICAvKioKICAgKiBSZXR1cm5zIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgcmVmbGVjdGVlLgogICAqLwogIFR5cGVNaXJyb3IgZ2V0IHJldHVyblR5cGU7CgogIC8qKgogICAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBwYXJhbWV0ZXIgdHlwZXMgb2YgdGhlIHJlZmxlY3RlZS4KICAgKi8KICBMaXN0PFBhcmFtZXRlck1pcnJvcj4gZ2V0IHBhcmFtZXRlcnM7CgogIC8qKgogICAqIEEgbWlycm9yIG9uIHRoZSBbOmNhbGw6XSBtZXRob2QgZm9yIHRoZSByZWZsZWN0ZWUuCiAgICovCiAgLy8gVGhpcyBpcyBvbmx5IGhlcmUgYmVjYXVzZSBpbiB0aGUgcGFzdCB0aGUgVk0gZGlkIG5vdCBpbXBsZW1lbnQgYSBjYWxsCiAgLy8gbWV0aG9kIG9uIGNsb3N1cmVzLgogIE1ldGhvZE1pcnJvciBnZXQgY2FsbE1ldGhvZDsKfQoKLyoqCiAqIEEgW1R5cGVWYXJpYWJsZU1pcnJvcl0gcmVwcmVzZW50cyBhIHR5cGUgcGFyYW1ldGVyIG9mIGEgZ2VuZXJpYyB0eXBlLgogKi8KYWJzdHJhY3QgY2xhc3MgVHlwZVZhcmlhYmxlTWlycm9yIGV4dGVuZHMgVHlwZU1pcnJvciB7CiAgLyoqCiAgICogQSBtaXJyb3Igb24gdGhlIHR5cGUgdGhhdCBpcyB0aGUgdXBwZXIgYm91bmQgb2YgdGhpcyB0eXBlIHZhcmlhYmxlLgogICAqLwogIFR5cGVNaXJyb3IgZ2V0IHVwcGVyQm91bmQ7CgogIC8qKgogICAqIElzIHRoZSByZWZsZWN0ZWUgc3RhdGljPwogICAqCiAgICogRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGUgbWlycm9ycyBsaWJyYXJ5LCB0eXBlIHZhcmlhYmxlcyBhcmUgY29uc2lkZXJlZAogICAqIG5vbi1zdGF0aWMuCiAgICovCiAgYm9vbCBnZXQgaXNTdGF0aWM7CgogIC8qKgogICAqIFdoZXRoZXIgW290aGVyXSBpcyBhIFtUeXBlVmFyaWFibGVNaXJyb3JdIG9uIHRoZSBzYW1lIHR5cGUgdmFyaWFibGUgYXMgdGhpcwogICAqIG1pcnJvci4KICAgKgogICAqIFRoZSBlcXVhbGl0eSBob2xkcyBpZiBhbmQgb25seSBpZgogICAqCiAgICogMS4gW290aGVyXSBpcyBhIG1pcnJvciBvZiB0aGUgc2FtZSBraW5kLCBhbmQKICAgKiAyLiBbOnNpbXBsZU5hbWUgPT0gb3RoZXIuc2ltcGxlTmFtZTpdIGFuZCBbOm93bmVyID09IG90aGVyLm93bmVyOl0uCiAgICovCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcik7Cn0KCi8qKgogKiBBIFtUeXBlZGVmTWlycm9yXSByZXByZXNlbnRzIGEgdHlwZWRlZiBpbiBhIERhcnQgbGFuZ3VhZ2UgcHJvZ3JhbS4KICovCmFic3RyYWN0IGNsYXNzIFR5cGVkZWZNaXJyb3IgaW1wbGVtZW50cyBUeXBlTWlycm9yIHsKICAvKioKICAgKiBUaGUgZGVmaW5pbmcgdHlwZSBmb3IgdGhpcyB0eXBlZGVmLgogICAqCiAgICogSWYgdGhlIHR5cGUgcmVmZXJyZWQgdG8gYnkgdGhlIHJlZmxlY3RlZSBpcyBhIGZ1bmN0aW9uIHR5cGUgKkYqLCB0aGUKICAgKiByZXN1bHQgd2lsbCBiZSBbOkZ1bmN0aW9uVHlwZU1pcnJvcjpdIHJlZmxlY3RpbmcgKkYqIHdoaWNoIGlzIGFic3RyYWN0CiAgICogYW5kIGhhcyBhbiBhYnN0cmFjdCBtZXRob2QgWzpjYWxsOl0gd2hvc2Ugc2lnbmF0dXJlIGNvcnJlc3BvbmRzIHRvICpGKi4KICAgKiBGb3IgaW5zdGFuY2UgWzp2b2lkIGYoaW50KTpdIGlzIHRoZSByZWZlcmVudCBmb3IgWzp0eXBlZGVmIHZvaWQgZihpbnQpOl0uCiAgICovCiAgRnVuY3Rpb25UeXBlTWlycm9yIGdldCByZWZlcmVudDsKfQoKLyoqCiAqIEEgW01ldGhvZE1pcnJvcl0gcmVmbGVjdHMgYSBEYXJ0IGxhbmd1YWdlIGZ1bmN0aW9uLCBtZXRob2QsCiAqIGNvbnN0cnVjdG9yLCBnZXR0ZXIsIG9yIHNldHRlci4KICovCmFic3RyYWN0IGNsYXNzIE1ldGhvZE1pcnJvciBpbXBsZW1lbnRzIERlY2xhcmF0aW9uTWlycm9yIHsKICAvKioKICAgKiBBIG1pcnJvciBvbiB0aGUgcmV0dXJuIHR5cGUgZm9yIHRoZSByZWZsZWN0ZWUuCiAgICovCiAgVHlwZU1pcnJvciBnZXQgcmV0dXJuVHlwZTsKCiAgLyoqCiAgICogVGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgcmVmbGVjdGVlLCBpZiBhdmFpbGFibGUuIE90aGVyd2lzZSBudWxsLgogICAqLwogIFN0cmluZyBnZXQgc291cmNlOwoKICAvKioKICAgKiBBIGxpc3Qgb2YgbWlycm9ycyBvbiB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIHJlZmxlY3RlZS4KICAgKi8KICBMaXN0PFBhcmFtZXRlck1pcnJvcj4gZ2V0IHBhcmFtZXRlcnM7CgogIC8qKgogICAqIEEgZnVuY3Rpb24gaXMgY29uc2lkZXJlZCBub24tc3RhdGljIGlmZiBpdCBpcyBwZXJtaXRlZCB0byByZWZlciB0byAndGhpcycuCiAgICoKICAgKiBOb3RlIHRoYXQgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvcnMgYXJlIGNvbnNpZGVyZWQgbm9uLXN0YXRpYywgd2hlcmVhcwogICAqIGZhY3RvcnkgY29uc3RydWN0b3JzIGFyZSBjb25zaWRlcmVkIHN0YXRpYy4KICAgKi8KICBib29sIGdldCBpc1N0YXRpYzsKCiAgLyoqCiAgICogSXMgdGhlIHJlZmxlY3RlZSBhYnN0cmFjdD8KICAgKi8KICBib29sIGdldCBpc0Fic3RyYWN0OwoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlZmxlY3RlZSBpcyBzeW50aGV0aWMsIGFuZCByZXR1cm5zIGZhbHNlIG90aGVyd2lzZS4KICAgKgogICAqIEEgcmVmbGVjdGVlIGlzIHN5bnRoZXRpYyBpZiBpdCBpcyBhIGdldHRlciBvciBzZXR0ZXIgaW1wbGljaXRseSBpbnRyb2R1Y2VkCiAgICogZm9yIGEgZmllbGQgb3IgVHlwZSwgb3IgaWYgaXQgaXMgYSBjb25zdHJ1Y3RvciB0aGF0IHdhcyBpbXBsaWNpdGx5CiAgICogaW50cm9kdWNlZCBhcyBhIGRlZmF1bHQgY29uc3RydWN0b3Igb3IgYXMgcGFydCBvZiBhIG1peGluIGFwcGxpY2F0aW9uLgogICAqLwogIGJvb2wgZ2V0IGlzU3ludGhldGljOwoKICAvKioKICAgKiBJcyB0aGUgcmVmbGVjdGVlIGEgcmVndWxhciBmdW5jdGlvbiBvciBtZXRob2Q/CiAgICoKICAgKiBBIGZ1bmN0aW9uIG9yIG1ldGhvZCBpcyByZWd1bGFyIGlmIGl0IGlzIG5vdCBhIGdldHRlciwgc2V0dGVyLCBvcgogICAqIGNvbnN0cnVjdG9yLiAgTm90ZSB0aGF0IG9wZXJhdG9ycywgYnkgdGhpcyBkZWZpbml0aW9uLCBhcmUKICAgKiByZWd1bGFyIG1ldGhvZHMuCiAgICovCiAgYm9vbCBnZXQgaXNSZWd1bGFyTWV0aG9kOwoKICAvKioKICAgKiBJcyB0aGUgcmVmbGVjdGVlIGFuIG9wZXJhdG9yPwogICAqLwogIGJvb2wgZ2V0IGlzT3BlcmF0b3I7CgogIC8qKgogICAqIElzIHRoZSByZWZsZWN0ZWUgYSBnZXR0ZXI/CiAgICovCiAgYm9vbCBnZXQgaXNHZXR0ZXI7CgogIC8qKgogICAqIElzIHRoZSByZWZsZWN0ZWUgYSBzZXR0ZXI/CiAgICovCiAgYm9vbCBnZXQgaXNTZXR0ZXI7CgogIC8qKgogICAqIElzIHRoZSByZWZsZWN0ZWUgYSBjb25zdHJ1Y3Rvcj8KICAgKi8KICBib29sIGdldCBpc0NvbnN0cnVjdG9yOwoKICAvKioKICAgKiBUaGUgY29uc3RydWN0b3IgbmFtZSBmb3IgbmFtZWQgY29uc3RydWN0b3JzIGFuZCBmYWN0b3J5IG1ldGhvZHMuCiAgICoKICAgKiBGb3IgdW5uYW1lZCBjb25zdHJ1Y3RvcnMsIHRoaXMgaXMgdGhlIGVtcHR5IHN0cmluZy4gIEZvcgogICAqIG5vbi1jb25zdHJ1Y3RvcnMsIHRoaXMgaXMgdGhlIGVtcHR5IHN0cmluZy4KICAgKgogICAqIEZvciBleGFtcGxlLCBbOidiYXInOl0gaXMgdGhlIGNvbnN0cnVjdG9yIG5hbWUgZm9yIGNvbnN0cnVjdG9yCiAgICogWzpGb28uYmFyOl0gb2YgdHlwZSBbOkZvbzpdLgogICAqLwogIFN5bWJvbCBnZXQgY29uc3RydWN0b3JOYW1lOwoKICAvKioKICAgKiBJcyB0aGUgcmVmbGVjdGVlIGEgY29uc3QgY29uc3RydWN0b3I/CiAgICovCiAgYm9vbCBnZXQgaXNDb25zdENvbnN0cnVjdG9yOwoKICAvKioKICAgKiBJcyB0aGUgcmVmbGVjdGVlIGEgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3Rvcj8KICAgKi8KICBib29sIGdldCBpc0dlbmVyYXRpdmVDb25zdHJ1Y3RvcjsKCiAgLyoqCiAgICogSXMgdGhlIHJlZmxlY3RlZSBhIHJlZGlyZWN0aW5nIGNvbnN0cnVjdG9yPwogICAqLwogIGJvb2wgZ2V0IGlzUmVkaXJlY3RpbmdDb25zdHJ1Y3RvcjsKCiAgLyoqCiAgICogSXMgdGhlIHJlZmxlY3RlZSBhIGZhY3RvcnkgY29uc3RydWN0b3I/CiAgICovCiAgYm9vbCBnZXQgaXNGYWN0b3J5Q29uc3RydWN0b3I7CgogIC8qKgogICAqIFdoZXRoZXIgdGhpcyBtaXJyb3IgaXMgZXF1YWwgdG8gW290aGVyXS4KICAgKgogICAqIFRoZSBlcXVhbGl0eSBob2xkcyBpZiBhbmQgb25seSBpZgogICAqCiAgICogMS4gW290aGVyXSBpcyBhIG1pcnJvciBvZiB0aGUgc2FtZSBraW5kLCBhbmQKICAgKiAyLiBbOnNpbXBsZU5hbWUgPT0gb3RoZXIuc2ltcGxlTmFtZTpdIGFuZCBbOm93bmVyID09IG90aGVyLm93bmVyOl0uCiAgICovCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcik7Cn0KCi8qKgogKiBBIFtWYXJpYWJsZU1pcnJvcl0gcmVmbGVjdHMgYSBEYXJ0IGxhbmd1YWdlIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgogKi8KYWJzdHJhY3QgY2xhc3MgVmFyaWFibGVNaXJyb3IgaW1wbGVtZW50cyBEZWNsYXJhdGlvbk1pcnJvciB7CiAgLyoqCiAgICogUmV0dXJucyBhIG1pcnJvciBvbiB0aGUgdHlwZSBvZiB0aGUgcmVmbGVjdGVlLgogICAqLwogIFR5cGVNaXJyb3IgZ2V0IHR5cGU7CgogIC8qKgogICAqIFJldHVybnMgWzp0cnVlOl0gaWYgdGhlIHJlZmxlY3RlZSBpcyBhIHN0YXRpYyB2YXJpYWJsZS4KICAgKiBPdGhlcndpc2UgcmV0dXJucyBbOmZhbHNlOl0uCiAgICoKICAgKiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoZSBtaXJyb3IgbGlicmFyeSwgdG9wLWxldmVsIHZhcmlhYmxlcyBhcmUKICAgKiBpbXBsaWNpdGx5IGRlY2xhcmVkIHN0YXRpYy4KICAgKi8KICBib29sIGdldCBpc1N0YXRpYzsKCiAgLyoqCiAgICogUmV0dXJucyBbOnRydWU6XSBpZiB0aGUgcmVmbGVjdGVlIGlzIGEgZmluYWwgdmFyaWFibGUuCiAgICogT3RoZXJ3aXNlIHJldHVybnMgWzpmYWxzZTpdLgogICAqLwogIGJvb2wgZ2V0IGlzRmluYWw7CgogIC8qKgogICAqIFJldHVybnMgWzp0cnVlOl0gaWYgdGhlIHJlZmxlY3RlZSBpcyBkZWNsYXJlZCBbOmNvbnN0Ol0uCiAgICogT3RoZXJ3aXNlIHJldHVybnMgWzpmYWxzZTpdLgogICAqLwogIGJvb2wgZ2V0IGlzQ29uc3Q7CgogIC8qKgogICAqIFdoZXRoZXIgdGhpcyBtaXJyb3IgaXMgZXF1YWwgdG8gW290aGVyXS4KICAgKgogICAqIFRoZSBlcXVhbGl0eSBob2xkcyBpZiBhbmQgb25seSBpZgogICAqCiAgICogMS4gW290aGVyXSBpcyBhIG1pcnJvciBvZiB0aGUgc2FtZSBraW5kLCBhbmQKICAgKiAyLiBbOnNpbXBsZU5hbWUgPT0gb3RoZXIuc2ltcGxlTmFtZTpdIGFuZCBbOm93bmVyID09IG90aGVyLm93bmVyOl0uCiAgICovCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcik7Cn0KCi8qKgogKiBBIFtQYXJhbWV0ZXJNaXJyb3JdIHJlZmxlY3RzIGEgRGFydCBmb3JtYWwgcGFyYW1ldGVyIGRlY2xhcmF0aW9uLgogKi8KYWJzdHJhY3QgY2xhc3MgUGFyYW1ldGVyTWlycm9yIGltcGxlbWVudHMgVmFyaWFibGVNaXJyb3IgewogIC8qKgogICAqIEEgbWlycm9yIG9uIHRoZSB0eXBlIG9mIHRoaXMgcGFyYW1ldGVyLgogICAqLwogIFR5cGVNaXJyb3IgZ2V0IHR5cGU7CgogIC8qKgogICAqIFJldHVybnMgWzp0cnVlOl0gaWYgdGhlIHJlZmxlY3RlZSBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIuCiAgICogT3RoZXJ3aXNlIHJldHVybnMgWzpmYWxzZTpdLgogICAqLwogIGJvb2wgZ2V0IGlzT3B0aW9uYWw7CgogIC8qKgogICAqIFJldHVybnMgWzp0cnVlOl0gaWYgdGhlIHJlZmxlY3RlZSBpcyBhIG5hbWVkIHBhcmFtZXRlci4KICAgKiBPdGhlcndpc2UgcmV0dXJucyBbOmZhbHNlOl0uCiAgICovCiAgYm9vbCBnZXQgaXNOYW1lZDsKCiAgLyoqCiAgICogUmV0dXJucyBbOnRydWU6XSBpZiB0aGUgcmVmbGVjdGVlIGhhcyBleHBsaWNpdGx5IGRlY2xhcmVkIGEgZGVmYXVsdCB2YWx1ZS4KICAgKiBPdGhlcndpc2UgcmV0dXJucyBbOmZhbHNlOl0uCiAgICovCiAgYm9vbCBnZXQgaGFzRGVmYXVsdFZhbHVlOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGFuIG9wdGlvbmFsIHBhcmFtZXRlci4KICAgKgogICAqIFJldHVybnMgYW4gW0luc3RhbmNlTWlycm9yXSBvbiB0aGUgKGNvbXBpbGUtdGltZSBjb25zdGFudCkKICAgKiBkZWZhdWx0IHZhbHVlIGZvciBhbiBvcHRpb25hbCBwYXJhbWV0ZXIuCiAgICogSWYgbm8gZGVmYXVsdCB2YWx1ZSBpcyBkZWNsYXJlZCwgaXQgZGVmYXVsdHMgdG8gYG51bGxgCiAgICogYW5kIGEgbWlycm9yIG9mIGBudWxsYCBpcyByZXR1cm5lZC4KICAgKgogICAqIFJldHVybnMgYG51bGxgIGZvciBhIHJlcXVpcmVkIHBhcmFtZXRlci4KICAgKi8KICBJbnN0YW5jZU1pcnJvciBnZXQgZGVmYXVsdFZhbHVlOwp9CgovKioKICogQSBbU291cmNlTG9jYXRpb25dIGRlc2NyaWJlcyB0aGUgc3BhbiBvZiBhbiBlbnRpdHkgaW4gRGFydCBzb3VyY2UgY29kZS4KICovCmFic3RyYWN0IGNsYXNzIFNvdXJjZUxvY2F0aW9uIHsKICAvKioKICAgKiBUaGUgMS1iYXNlZCBsaW5lIG51bWJlciBmb3IgdGhpcyBzb3VyY2UgbG9jYXRpb24uCiAgICoKICAgKiBBIHZhbHVlIG9mIDAgbWVhbnMgdGhhdCB0aGUgbGluZSBudW1iZXIgaXMgdW5rbm93bi4KICAgKi8KICBpbnQgZ2V0IGxpbmU7CgogIC8qKgogICAqIFRoZSAxLWJhc2VkIGNvbHVtbiBudW1iZXIgZm9yIHRoaXMgc291cmNlIGxvY2F0aW9uLgogICAqCiAgICogQSB2YWx1ZSBvZiAwIG1lYW5zIHRoYXQgdGhlIGNvbHVtbiBudW1iZXIgaXMgdW5rbm93bi4KICAgKi8KICBpbnQgZ2V0IGNvbHVtbjsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgVVJJIHdoZXJlIHRoZSBzb3VyY2Ugb3JpZ2luYXRlZC4KICAgKi8KICBVcmkgZ2V0IHNvdXJjZVVyaTsKfQoKLyoqCiAqIENsYXNzIHVzZWQgZm9yIGVuY29kaW5nIGNvbW1lbnRzIGFzIG1ldGFkYXRhIGFubm90YXRpb25zLgogKi8KY2xhc3MgQ29tbWVudCB7CiAgLyoqCiAgICogVGhlIGNvbW1lbnQgdGV4dCBhcyB3cml0dGVuIGluIHRoZSBzb3VyY2UgdGV4dC4KICAgKi8KICBmaW5hbCBTdHJpbmcgdGV4dDsKCiAgLyoqCiAgICogVGhlIGNvbW1lbnQgdGV4dCB3aXRob3V0IHRoZSBzdGFydCwgZW5kLCBhbmQgcGFkZGluZyB0ZXh0LgogICAqCiAgICogRm9yIGV4YW1wbGUsIGlmIFt0ZXh0XSBpcyBbOiAvKiogQ29tbWVudCB0ZXh0LiAqLyA6XSB0aGVuIHRoZSBbdHJpbW1lZFRleHRdCiAgICogaXMgWzogQ29tbWVudCB0ZXh0LiA6XS4KICAgKi8KICBmaW5hbCBTdHJpbmcgdHJpbW1lZFRleHQ7CgogIC8qKgogICAqIElzIFs6dHJ1ZTpdIGlmIHRoaXMgY29tbWVudCBpcyBhIGRvY3VtZW50YXRpb24gY29tbWVudC4KICAgKgogICAqIFRoYXQgaXMsIHRoYXQgdGhlIGNvbW1lbnQgaXMgZWl0aGVyIGVuY2xvc2VkIGluIFs6IC8qKiAuLi4gKi8gOl0gb3Igc3RhcnRzCiAgICogd2l0aCBbOiAvLy8gOl0uCiAgICovCiAgZmluYWwgYm9vbCBpc0RvY0NvbW1lbnQ7CgogIGNvbnN0IENvbW1lbnQodGhpcy50ZXh0LCB0aGlzLnRyaW1tZWRUZXh0LCB0aGlzLmlzRG9jQ29tbWVudCk7Cn0KCi8qKgogKiBBbm5vdGF0aW9uIGRlc2NyaWJpbmcgaG93ICJkYXJ0Om1pcnJvcnMiIGlzIHVzZWQgKEVYUEVSSU1FTlRBTCkuCiAqCiAqIFdoZW4gdXNlZCBhcyBtZXRhZGF0YSBvbiBhbiBpbXBvcnQgb2YgImRhcnQ6bWlycm9ycyIgaW4gbGlicmFyeSAqTCosIHRoaXMKICogY2xhc3MgZGVzY3JpYmVzIGhvdyAiZGFydDptaXJyb3JzIiBpcyB1c2VkIGJ5IGxpYnJhcnkgKkwqIHVubGVzcyBvdmVycmlkZGVuLgogKiBTZWUgW292ZXJyaWRlXS4KICoKICogVGhlIGZvbGxvd2luZyB0ZXh0IGlzIG5vbi1ub3JtYXRpdmU6CiAqCiAqIEluIHNvbWUgc2NlbmFyaW9zLCBmb3IgZXhhbXBsZSwgd2hlbiBtaW5pZnlpbmcgRGFydCBjb2RlLCBvciB3aGVuIGdlbmVyYXRpbmcKICogSmF2YVNjcmlwdCBjb2RlIGZyb20gYSBEYXJ0IHByb2dyYW0sIHRoZSBzaXplIGFuZCBwZXJmb3JtYW5jZSBvZiB0aGUgb3V0cHV0CiAqIGNhbiBzdWZmZXIgZnJvbSB1c2Ugb2YgcmVmbGVjdGlvbi4gIEluIHRob3NlIGNhc2VzLCB0ZWxsaW5nIHRoZSBjb21waWxlcgogKiB3aGF0IGlzIHVzZWQsIGNhbiBoYXZlIGEgc2lnbmlmaWNhbnQgaW1wYWN0LgogKgogKiBFeGFtcGxlIHVzYWdlOgogKgogKiAgICAgQE1pcnJvcnNVc2VkKHN5bWJvbHM6ICdmb28nKQogKiAgICAgaW1wb3J0ICdkYXJ0Om1pcnJvcnMnOwogKgogKiAgICAgY2xhc3MgRm9vIHsKICogICAgICAgbm9TdWNoTWV0aG9kKEludm9jYXRpb24gaW52b2NhdGlvbikgewogKiAgICAgICAgIHByaW50KE1pcnJvclN5c3RlbS5nZXROYW1lKGludm9jYXRpb24ubWVtYmVyTmFtZSkpOwogKiAgICAgICB9CiAqICAgICB9CiAqCiAqICAgICBtYWluKCkgewogKiAgICAgICBuZXcgRm9vKCkuZm9vKCk7IC8vIFByaW50cyAiZm9vIi4KICogICAgICAgbmV3IEZvbygpLmJhcigpOyAvLyBNaWdodCBwcmludCBhbiBhcmJpdHJhcnkgKG1hbmdsZWQpIG5hbWUsICJiYXIiLgogKiAgICAgfQogKgogKiBGb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgcGFyYW1ldGVycyB0byB0aGUgW01pcnJvcnNVc2VkXSBjb25zdHJ1Y3RvcgogKiBzZWUgdGhlIGNvbW1lbnRzIGZvciBbc3ltYm9sc10sIFt0YXJnZXRzXSwgW21ldGFUYXJnZXRzXSBhbmQgW292ZXJyaWRlXS4KICoKICogQW4gaW1wb3J0IG9mIGBkYXJ0Om1pcnJvcnNgIG1heSBoYXZlIG11bHRpcGxlIFtNaXJyb3JzVXNlZF0gYW5ub3RhdGlvbnMuIFRoaXMKICogaXMgcGFydGljdWxhcmx5IGhlbHBmdWwgdG8gc3BlY2lmeSBvdmVycmlkZXMgZm9yIHNwZWNpZmljIGxpYnJhcmllcy4gRm9yCiAqIGV4YW1wbGU6CiAqCiAqICAgICBATWlycm9yc1VzZWQodGFyZ2V0czogJ2Zvby5CYXInLCBvdmVycmlkZTogJ2ZvbycpCiAqICAgICBATWlycm9yc1VzZWQodGFyZ2V0czogJ0JhcicpCiAqICAgICBpbXBvcnQgJ2RhcnQ6bWlycm9ycyc7CiAqCiAqIHdpbGwgZW5zdXJlIHRoYXQgdGhlIHRhcmdldCBgQmFyYCBmcm9tIHRoZSBjdXJyZW50IGxpYnJhcnkgYW5kIGZyb20gbGlicmFyeQogKiBgZm9vYCBpcyBhdmFpbGFibGUgZm9yIHJlZmxlY3Rpb24uIFNlZSBhbHNvIFtvdmVycmlkZV0uCiAqLwpARGVwcmVjYXRlZCgiTm8gbG9uZ2VyIGhhcyBhbnkgZWZmZWN0LiBXaWxsIGJlIHJlbW92ZWQgaW4gYSBsYXRlciByZWxlYXNlLiIpCmNsYXNzIE1pcnJvcnNVc2VkIHsKICAvLyBOb3RlOiB0aGUgZmllbGRzIG9mIHRoaXMgY2xhc3MgYXJlIHVudHlwZWQuICBUaGlzIGlzIGJlY2F1c2UgdGhlIG1vc3QKICAvLyBjb252ZW5pZW50IHdheSB0byBzcGVjaWZ5IHN5bWJvbHMgdG9kYXkgaXMgdXNpbmcgYSBzaW5nbGUgc3RyaW5nLiBJbgogIC8vIHNvbWUgY2FzZXMsIGEgY29uc3QgbGlzdCBvZiBjbGFzc2VzIG1pZ2h0IGJlIGNvbnZlbmllbnQuIFNvbWUKICAvLyBtaWdodCBwcmVmZXIgdG8gdXNlIGEgY29uc3QgbGlzdCBvZiBzeW1ib2xzLgoKICAvKioKICAgKiBUaGUgbGlzdCBvZiBzdHJpbmdzIHBhc3NlZCB0byBuZXcgW1N5bWJvbF0sIGFuZCBzeW1ib2xzIHRoYXQgbWlnaHQgYmUKICAgKiBwYXNzZWQgdG8gW01pcnJvclN5c3RlbS5nZXROYW1lXS4KICAgKgogICAqIENvbWJpbmVkIHdpdGggdGhlIG5hbWVzIG9mIFt0YXJnZXRzXSwgW21ldGFUYXJnZXRzXSBhbmQgdGhlaXIgbWVtYmVycywKICAgKiB0aGlzIGZvcm1zIHRoZSBjb21wbGV0ZSBsaXN0IG9mIHN0cmluZ3MgcGFzc2VkIHRvIG5ldyBbU3ltYm9sXSwgYW5kCiAgICogc3ltYm9scyB0aGF0IG1pZ2h0IGJlIHBhc3NlZCB0byBbTWlycm9yU3lzdGVtLmdldE5hbWVdIGJ5IHRoZSBsaWJyYXJ5IHRvCiAgICogd2hpY2ggdGhpcyBtZXRhZGF0YSBhcHBsaWVzLgogICAqCiAgICogVGhlIGZvbGxvd2luZyB0ZXh0IGlzIG5vbi1ub3JtYXRpdmU6CiAgICoKICAgKiBEYXJ0MmpzIGN1cnJlbnRseSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGZvcm1hdHMgdG8gc3BlY2lmeSBzeW1ib2xzOgogICAqCiAgICogKiBBIGNvbnN0YW50IFtMaXN0XSBvZiBbU3RyaW5nXSBjb25zdGFudHMgcmVwcmVzZW50aW5nIHN5bWJvbCBuYW1lcywKICAgKiAgIGUuZy4sIGBjb25zdCBbJ2ZvbycsICdiYXInXWAuCiAgICogKiBBIHNpbmdsZSBbU3RyaW5nXSBjb25zdGFudCB3aG9zZSB2YWx1ZSBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mCiAgICogICBzeW1ib2wgbmFtZXMsIGUuZy4sIGAiZm9vLCBiYXIiYC4KICAgKgogICAqIFNwZWNpZnlpbmcgdGhlIGBzeW1ib2xzYCBmaWVsZCB0dXJucyBvZmYgdGhlIGZvbGxvd2luZyB3YXJuaW5ncyBlbWl0dGVkIGJ5CiAgICogZGFydDJqczoKICAgKgogICAqICogVXNpbmcgIk1pcnJvclN5c3RlbS5nZXROYW1lIiBtYXkgcmVzdWx0IGluIGxhcmdlciBvdXRwdXQuCiAgICogKiBVc2luZyAibmV3IFN5bWJvbCIgbWF5IHJlc3VsdCBpbiBsYXJnZXIgb3V0cHV0LgogICAqCiAgICogRm9yIGV4YW1wbGUsIGlmIHlvdSdyZSB1c2luZyBbbm9TdWNoTWV0aG9kXSB0byBpbnRlcmFjdCB3aXRoIGEgZGF0YWJhc2UsCiAgICogZXh0cmFjdCBhbGwgdGhlIHBvc3NpYmxlIGNvbHVtbiBuYW1lcyBhbmQgaW5jbHVkZSB0aGVtIGluIHRoaXMgbGlzdC4KICAgKiBTaW1pbGFybHksIGlmIHlvdSdyZSB1c2luZyBbbm9TdWNoTWV0aG9kXSB0byBpbnRlcmFjdCB3aXRoIGFub3RoZXIKICAgKiBsYW5ndWFnZSAoSmF2YVNjcmlwdCwgZm9yIGV4YW1wbGUpIGV4dHJhY3QgYWxsIHRoZSBpZGVudGlmaWVycyBmcm9tIHRoZQogICAqIEFQSSB5b3UgdXNlIGFuZCBpbmNsdWRlIHRoZW0gaW4gdGhpcyBsaXN0LgogICAqCiAgICogTm90ZSB0aGF0IHNwZWNpZnlpbmcgYSBzeW1ib2wgb25seSBlbnN1cmVzIHRoYXQgdGhlIHN5bWJvbCB3aWxsIGJlCiAgICogYXZhaWxhYmxlIHVuZGVyIHRoYXQgbmFtZSBhdCBydW50aW1lLiBJdCBkb2VzIG5vdCBtYXJrIHRhcmdldHMgd2l0aAogICAqIHRoYXQgbmFtZSBhcyBhdmFpbGFibGUgZm9yIHJlZmxlY3Rpb24uIFNlZSBbdGFyZ2V0c10gYW5kIFttZXRhVGFyZ2V0c10KICAgKiBmb3IgdGhhdCBwdXJwb3NlLgogICAqLwogIGZpbmFsIHN5bWJvbHM7CgogIC8qKgogICAqIEEgbGlzdCBvZiByZWZsZWN0aXZlIHRhcmdldHMuCiAgICoKICAgKiBDb21iaW5lZCB3aXRoIFttZXRhVGFyZ2V0c10sIHRoaXMgcHJvdmlkZXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgcmVmbGVjdGl2ZQogICAqIHRhcmdldHMgdXNlZCBieSB0aGUgbGlicmFyeSB0byB3aGljaCB0aGlzIG1ldGFkYXRhIGFwcGxpZXMuCiAgICoKICAgKiBUaGUgZm9sbG93aW5nIHRleHQgaXMgbm9uLW5vcm1hdGl2ZToKICAgKgogICAqIEZvciBub3csIHRoZXJlIGlzIG5vIGZvcm1hbCBkZXNjcmlwdGlvbiBvZiB3aGF0IGEgcmVmbGVjdGl2ZSB0YXJnZXQgaXMuCiAgICogSW5mb3JtYWxseSwgYSB0YXJnZXQgaXMgYSBsaWJyYXJ5LCBhIGNsYXNzLCBhIG1ldGhvZCBvciBhIGZpZWxkLgogICAqCiAgICogRGFydDJqcyBjdXJyZW50bHkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBmb3JtYXRzIHRvIHNwZWNpZnkgdGFyZ2V0czoKICAgKgogICAqICogQSBjb25zdGFudCBbTGlzdF0gY29udGFpbmluZyBbU3RyaW5nXSBjb25zdGFudHMgcmVwcmVzZW50aW5nIChxdWFsaWZpZWQpCiAgICogICBuYW1lcyBvZiB0YXJnZXRzIGFuZCBEYXJ0IHR5cGVzLgogICAqICogQSBzaW5nbGUgW1N0cmluZ10gY29uc3RhbnQgd2hvc2UgdmFsdWUgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZgogICAqICAgKHF1YWxpZmllZCkgbmFtZXMuCiAgICogKiBBIHNpbmdsZSBEYXJ0IHR5cGUuCiAgICoKICAgKiBBIChxdWFsaWZpZWQpIG5hbWUgaXMgcmVzb2x2ZWQgdG8gYSB0YXJnZXQgYXMgZm9sbG93czoKICAgKgogICAqIDEuIElmIHRoZSBxdWFsaWZpZWQgbmFtZSBtYXRjaGVzIGEgbGlicmFyeSBuYW1lLCB0aGUgbWF0Y2hpbmcgbGlicmFyeSBpcwogICAqICAgIHRoZSB0YXJnZXQuCiAgICogMi4gRWxzZSwgZmluZCB0aGUgbG9uZ2VzdCBwcmVmaXggb2YgdGhlIG5hbWUgc3VjaCB0aGF0IHRoZSBwcmVmaXggZW5kcwogICAqICAgIGp1c3QgYmVmb3JlIGEgYC5gIGFuZCBpcyBhIGxpYnJhcnkgbmFtZS4KICAgKiAzLiBVc2UgdGhhdCBsaWJyYXJ5IGFzIGN1cnJlbnQgc2NvcGUuIElmIG5vIG1hdGNoaW5nIHByZWZpeCB3YXMgZm91bmQsIHVzZQogICAqICAgIHRoZSBjdXJyZW50IGxpYnJhcnksIGkuZS4sIHRoZSBsaWJyYXJ5IHdoZXJlIHRoZSBbTWlycm9yc1VzZWRdCiAgICogICAgYW5ub3RhdGlvbiB3YXMgcGxhY2VkLgogICAqIDQuIFNwbGl0IHRoZSByZW1haW5pbmcgc3VmZml4ICh0aGUgZW50aXJlIG5hbWUgaWYgbm8gbGlicmFyeSBuYW1lIHdhcwogICAqICAgIGZvdW5kIGluIHN0ZXAgMykgaW50byBhIGxpc3Qgb2YgW1N0cmluZ10gdXNpbmcgYC5gIGFzIGEKICAgKiAgICBzZXBhcmF0b3IuCiAgICogNS4gU2VsZWN0IGFsbCB0YXJnZXRzIGluIHRoZSBjdXJyZW50IHNjb3BlIHdob3NlIG5hbWUgbWF0Y2hlcyBhIFtTdHJpbmddCiAgICogICAgZnJvbSB0aGUgbGlzdC4KICAgKgogICAqIEZvciBleGFtcGxlOgogICAqCiAgICogICAgIGxpYnJhcnkgbXkubGlicmFyeS5vbmU7CiAgICoKICAgKiAgICAgY2xhc3MgQSB7CiAgICogICAgICAgdmFyIGFGaWVsZDsKICAgKiAgICAgfQogICAqCiAgICogICAgIGxpYnJhcnkgbWFpbjsKICAgKgogICAqICAgICBATWlycm9yc1VzZWQodGFyZ2V0czogIm15LmxpYnJhcnkub25lLkEuYUZpZWxkIikKICAgKiAgICAgaW1wb3J0ICJkYXJ0Om1pcnJvcnMiOwogICAqCiAgICogVGhlIFtNaXJyb3JzVXNlZF0gYW5ub3RhdGlvbiBzcGVjaWZpZXMgYEFgIGFuZCBgYUZpZWxkYCBmcm9tIGxpYnJhcnkKICAgKiBgbXkubGlicmFyeS5vbmVgIGFzIHRhcmdldHMuIFRoaXMgd2lsbCBtYXJrIHRoZSBjbGFzcyBgQWAgYXMgYSByZWZsZWN0aXZlCiAgICogdGFyZ2V0LiBUaGUgdGFyZ2V0IHNwZWNpZmljYXRpb24gZm9yIGBhRmllbGRgIGhhcyBubyBlZmZlY3QsIGFzIHRoZXJlIGlzCiAgICogbm8gdGFyZ2V0IGluIGBteS5saWJyYXJ5Lm9uZWAgd2l0aCB0aGF0IG5hbWUuCiAgICoKICAgKiBOb3RlIHRoYXQgZXZlcnl0aGluZyB3aXRoaW4gYSB0YXJnZXQgYWxzbyBpcyBhdmFpbGFibGUgZm9yIHJlZmxlY3Rpb24uCiAgICogU28sIGlmIGEgbGlicmFyeSBpcyBzcGVjaWZpZWQgYXMgdGFyZ2V0LCBhbGwgY2xhc3NlcyBpbiB0aGF0IGxpYnJhcnkKICAgKiBiZWNvbWUgdGFyZ2V0cyBmb3IgcmVmbGVjdGlvbi4gTGlrZXdpc2UsIGlmIGEgY2xhc3MgaXMgYSB0YXJnZXQsIGFsbAogICAqIGl0cyBtZXRob2RzIGFuZCBmaWVsZHMgYmVjb21lIHRhcmdldHMgZm9yIHJlZmxlY3Rpb24uIEFzIGEgY29uc2VxdWVuY2UsCiAgICogYGFGaWVsZGAgaW4gdGhlIGFib3ZlIGV4YW1wbGUgaXMgYWxzbyBhIHJlZmxlY3RpdmUgdGFyZ2V0LgogICAqCiAgICovCiAgZmluYWwgdGFyZ2V0czsKCiAgLyoqCiAgICogQSBsaXN0IG9mIGNsYXNzZXMgdGhhdCB3aGVuIHVzZWQgYXMgbWV0YWRhdGEgaW5kaWNhdGVzIGEgcmVmbGVjdGl2ZQogICAqIHRhcmdldC4gU2VlIGFsc28gW3RhcmdldHNdLgogICAqCiAgICogVGhlIGZvbGxvd2luZyB0ZXh0IGlzIG5vbi1ub3JtYXRpdmU6CiAgICoKICAgKiBUaGUgZm9ybWF0IGZvciBzcGVjaWZ5aW5nIHRoZSBsaXN0IG9mIGNsYXNzZXMgaXMgdGhlIHNhbWUgYXMgdXNlZCBmb3IKICAgKiBzcGVjaWZ5aW5nIFt0YXJnZXRzXS4gSG93ZXZlciwgYXMgYSBsaWJyYXJ5IGNhbm5vdCBiZSB1c2VkIGFzIGEgbWV0YWRhdGEKICAgKiBhbm5vdGF0aW9uIGluIERhcnQsIGFkZGluZyBhIGxpYnJhcnkgdG8gdGhlIGxpc3Qgb2YgW21ldGFUYXJnZXRzXSBoYXMgbm8KICAgKiBlZmZlY3QuIEluIHBhcnRpY3VsYXIsIGFkZGluZyBhIGxpYnJhcnkgdG8gW21ldGFUYXJnZXRzXSBkb2VzIG5vdCBtYWtlCiAgICogdGhlIGxpYnJhcnkncyBjbGFzc2VzIHZhbGlkIG1ldGFkYXRhIGFubm90YXRpb25zIHRvIGVuYWJsZSByZWZsZWN0aW9uLgogICAqCiAgICogSWYgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyBzcGVjaWZpZWQgaW4gW21ldGFUYXJnZXRzXSBpcyB1c2VkIGFzCiAgICogbWV0YWRhdGEgYW5ub3RhdGlvbiBvbiBhIGxpYnJhcnksIGNsYXNzLCBmaWVsZCBvciBtZXRob2QsIHRoYXQgbGlicmFyeSwKICAgKiBjbGFzcywgZmllbGQgb3IgIG1ldGhvZCBpcyBhZGRlZCB0byB0aGUgc2V0IG9mIHRhcmdldHMgZm9yIHJlZmxlY3Rpb24uCiAgICoKICAgKiBFeGFtcGxlIHVzYWdlOgogICAqCiAgICogICAgIGxpYnJhcnkgZXhhbXBsZTsKICAgKiAgICAgQE1pcnJvcnNVc2VkKG1ldGFUYXJnZXRzOiAiZXhhbXBsZS5SZWZsZWN0YWJsZSIpCiAgICogICAgIGltcG9ydCAiZGFydDptaXJyb3JzIjsKICAgKgogICAqICAgICBjbGFzcyBSZWZsZWN0YWJsZSB7CiAgICogICAgICAgY29uc3QgUmVmbGVjdGFibGUoKTsKICAgKiAgICAgfQogICAqCiAgICogICAgIGNsYXNzIEZvbyB7CiAgICogICAgICAgQFJlZmxlY3RhYmxlKCkKICAgKiAgICAgICByZWZsZWN0YWJsZU1ldGhvZCgpIHsgLi4uIH0KICAgKgogICAqICAgICAgIG5vblJlZmxlY3RhYmxlTWV0aG9kKCkgeyAuLi4gfQogICAqICAgICB9CiAgICoKICAgKiBJbiB0aGUgYWJvdmUgZXhhbXBsZS4gYHJlZmxlY3RhYmxlTWV0aG9kYCBpcyBtYXJrZWQgYXMgcmVmbGVjdGFibGUgYnkKICAgKiB1c2luZyB0aGUgYFJlZmxlY3RhYmxlYCBjbGFzcywgd2hpY2ggaW4gdHVybiBpcyBzcGVjaWZpZWQgaW4gdGhlCiAgICogW21ldGFUYXJnZXRzXSBhbm5vdGF0aW9uLgogICAqCiAgICogVGhlIG1ldGhvZCBgbm9uUmVmbGVjdGFibGVNZXRob2RgIGxhY2tzIGEgbWV0YWRhdGEgYW5ub3RhdGlvbiBhbmQgdGh1cwogICAqIHdpbGwgbm90IGJlIHJlZmxlY3RhYmxlIGF0IHJ1bnRpbWUuCiAgICovCiAgZmluYWwgbWV0YVRhcmdldHM7CgogIC8qKgogICAqIEEgbGlzdCBvZiBsaWJyYXJ5IG5hbWVzIG9yICIqIi4KICAgKgogICAqIFdoZW4gdXNlZCBhcyBtZXRhZGF0YSBvbiBhbiBpbXBvcnQgb2YgImRhcnQ6bWlycm9ycyIsIHRoaXMgbWV0YWRhdGEgZG9lcwogICAqIG5vdCBhcHBseSB0byB0aGUgbGlicmFyeSBpbiB3aGljaCB0aGUgYW5ub3RhdGlvbiBpcyB1c2VkLCBidXQgaW5zdGVhZAogICAqIGFwcGxpZXMgdG8gdGhlIG90aGVyIGxpYnJhcmllcyAoYWxsIGxpYnJhcmllcyBpZiAiKiIgaXMgdXNlZCkuCiAgICoKICAgKiBUaGUgZm9sbG93aW5nIHRleHQgaXMgbm9uLW5vcm1hdGl2ZToKICAgKgogICAqIERhcnQyanMgY3VycmVudGx5IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgZm9ybWF0cyB0byBzcGVjaWZ5IGxpYnJhcmllczoKICAgKgogICAqICogQSBjb25zdGFudCBbTGlzdF0gY29udGFpbmluZyBbU3RyaW5nXSBjb25zdGFudHMgcmVwcmVzZW50aW5nIG5hbWVzIG9mCiAgICogICBsaWJyYXJpZXMuCiAgICogKiBBIHNpbmdsZSBbU3RyaW5nXSBjb25zdGFudCB3aG9zZSB2YWx1ZSBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mCiAgICogICBsaWJyYXJ5IG5hbWVzLgogICAqCiAgICogQ29uY2VwdHVhbGx5LCBhIFtNaXJyb3JzVXNlZF0gYW5ub3RhdGlvbiB3aXRoIFtvdmVycmlkZV0gaGFzIHRoZSBzYW1lCiAgICogZWZmZWN0IGFzIHBsYWNpbmcgdGhlIGFubm90YXRpb24gZGlyZWN0bHkgb24gdGhlIGltcG9ydCBvZiBgZGFydDptaXJyb3JzYAogICAqIGluIGVhY2ggb2YgdGhlIHJlZmVyZW5jZWQgbGlicmFyaWVzLiBUaHVzLCBpZiB0aGUgbGlicmFyeSBoYWQgbm8KICAgKiBbTWlycm9yc1VzZWRdIGFubm90YXRpb24gYmVmb3JlLCBpdHMgdW5jb25kaXRpb25hbCBpbXBvcnQgb2YKICAgKiBgZGFydDptaXJyb3JzYCBpcyBvdmVycmlkZGVuIGJ5IGFuIGFubm90YXRlZCBpbXBvcnQuCiAgICoKICAgKiBOb3RlIHRoYXQsIGxpa2UgbXVsdGlwbGUgZXhwbGljaXQgW01pcnJvcnNVc2VkXSBhbm5vdGF0aW9ucywgdXNpbmcKICAgKiBvdmVycmlkZSBvbiBhIGxpYnJhcnkgd2l0aCBhbiBleGlzdGluZyBbTWlycm9yc1VzZWRdIGFubm90YXRpb24gaXMKICAgKiBhZGRpdGl2ZS4gVGhhdCBpcywgdGhlIG92ZXJhbGwgc2V0IG9mIHJlZmxlY3RpdmUgdGFyZ2V0cyBpcyB0aGUgdW5pb24KICAgKiBvZiB0aGUgcmVmbGVjdGl2ZSB0YXJnZXRzIHRoYXQgYXJpc2UgZnJvbSB0aGUgb3JpZ2luYWwgYW5kIHRoZQogICAqIG92ZXJyaWRpbmcgW01pcnJvcnNVc2VkXSBhbm5vdGF0aW9ucy4KICAgKgogICAqIFRoZSB1c2Ugb2YgW292ZXJyaWRlXSBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIGxpYnJhcmllcyB0aGF0IGhhdmUgYW4KICAgKiBpbXBvcnQgb2YgYGRhcnQ6bWlycm9yc2Agd2l0aG91dCBhbm5vdGF0aW9uIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IHdvdWxkCiAgICogd29yayBleGFjdGx5IHRoZSBzYW1lIHdheSB3aXRob3V0IHRoZSBbb3ZlcnJpZGVdIHBhcmFtZXRlci4KICAgKgogICAqIFdoaWxlIHRoZSBhbm5vdGF0aW9uIHdpbGwgYXBwbHkgdG8gdGhlIGdpdmVuIHRhcmdldCBsaWJyYXJpZXMsIHRoZQogICAqIFtzeW1ib2xzXSwgW3RhcmdldHNdIGFuZCBbbWV0YVRhcmdldHNdIGFyZSBzdGlsbCBldmFsdWF0ZWQgaW4gdGhlCiAgICogc2NvcGUgb2YgdGhlIGFubm90YXRpb24uIFRodXMsIHRvIHNlbGVjdCBhIHRhcmdldCBmcm9tIGxpYnJhcnkgYGZvb2AsCiAgICogYSBxdWFsaWZpZWQgbmFtZSBoYXMgdG8gYmUgdXNlZCBvciwgaWYgdGhlIHRhcmdldCBpcyB2aXNpYmxlIGluIHRoZQogICAqIGN1cnJlbnQgc2NvcGUsIGl0cyB0eXBlIG1heSBiZSByZWZlcmVuY2VkLgogICAqCiAgICogRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZSBtYXJrcyBhbGwgdGFyZ2V0cyBpbiB0aGUgbGlicmFyeSBgZm9vYAogICAqIGFzIHJlZmxlY3RhYmxlIHRoYXQgaGF2ZSBhIG1ldGFkYXRhIGFubm90YXRpb24gdXNpbmcgdGhlIGBSZWZsZWN0YWJs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IG5hbWUpIHsKICBpZiAobmFtZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICByZXR1cm4gbmV3IGludGVybmFsLlN5bWJvbC51bnZhbGlkYXRlZChuYW1lKTsKfQoKU3ltYm9sIF9jb21wdXRlUXVhbGlmaWVkTmFtZShEZWNsYXJhdGlvbk1pcnJvciBvd25lciwgU3ltYm9sIHNpbXBsZU5hbWUpIHsKICBpZiAob3duZXIgPT0gbnVsbCkgcmV0dXJuIHNpbXBsZU5hbWU7CiAgcmV0dXJuIF9zKCcke19uKG93bmVyLnF1YWxpZmllZE5hbWUpfS4ke19uKHNpbXBsZU5hbWUpfScpOwp9CgpTdHJpbmcgX21ha2VTaWduYXR1cmVTdHJpbmcoCiAgICBUeXBlTWlycm9yIHJldHVyblR5cGUsIExpc3Q8UGFyYW1ldGVyTWlycm9yPiBwYXJhbWV0ZXJzKSB7CiAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICBidWYud3JpdGUoJygnKTsKICBib29sIGZvdW5kX29wdGlvbmFsX3Bvc2l0aW9uYWwgPSBmYWxzZTsKICBib29sIGZvdW5kX29wdGlvbmFsX25hbWVkID0gZmFsc2U7CgogIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgdmFyIHBhcmFtID0gcGFyYW1ldGVyc1tpXTsKICAgIGlmIChwYXJhbS5pc09wdGlvbmFsICYmIHBhcmFtLmlzTmFtZWQgJiYgIWZvdW5kX29wdGlvbmFsX25hbWVkKSB7CiAgICAgIGJ1Zi53cml0ZSgneycpOwogICAgICBmb3VuZF9vcHRpb25hbF9uYW1lZCA9IHRydWU7CiAgICB9CiAgICBpZiAocGFyYW0uaXNPcHRpb25hbCAmJiAhcGFyYW0uaXNOYW1lZCAmJiAhZm91bmRfb3B0aW9uYWxfcG9zaXRpb25hbCkgewogICAgICBidWYud3JpdGUoJ1snKTsKICAgICAgZm91bmRfb3B0aW9uYWxfcG9zaXRpb25hbCA9IHRydWU7CiAgICB9CiAgICBpZiAocGFyYW0uaXNOYW1lZCkgewogICAgICBidWYud3JpdGUoX24ocGFyYW0uc2ltcGxlTmFtZSkpOwogICAgICBidWYud3JpdGUoJzogJyk7CiAgICB9CiAgICBidWYud3JpdGUoX24ocGFyYW0udHlwZS5xdWFsaWZpZWROYW1lKSk7CiAgICBpZiAoaSA8IChwYXJhbWV0ZXJzLmxlbmd0aCAtIDEpKSB7CiAgICAgIGJ1Zi53cml0ZSgnLCAnKTsKICAgIH0KICB9CiAgaWYgKGZvdW5kX29wdGlvbmFsX25hbWVkKSB7CiAgICBidWYud3JpdGUoJ30nKTsKICB9CiAgaWYgKGZvdW5kX29wdGlvbmFsX3Bvc2l0aW9uYWwpIHsKICAgIGJ1Zi53cml0ZSgnXScpOwogIH0KICBidWYud3JpdGUoJykgLT4gJyk7CiAgYnVmLndyaXRlKF9uKHJldHVyblR5cGUucXVhbGlmaWVkTmFtZSkpOwogIHJldHVybiBidWYudG9TdHJpbmcoKTsKfQoKU291cmNlTG9jYXRpb24gX2xvY2F0aW9uKHJlZmxlY3RlZSkgbmF0aXZlICJEZWNsYXJhdGlvbk1pcnJvcl9sb2NhdGlvbiI7CgpMaXN0PGR5bmFtaWM+IF9tZXRhZGF0YShyZWZsZWN0ZWUpIG5hdGl2ZSAnRGVjbGFyYXRpb25NaXJyb3JfbWV0YWRhdGEnOwoKYm9vbCBfc3VidHlwZVRlc3QoVHlwZSBhLCBUeXBlIGIpIG5hdGl2ZSAnVHlwZU1pcnJvcl9zdWJ0eXBlVGVzdCc7CgpjbGFzcyBfTG9jYWxNaXJyb3JTeXN0ZW0gZXh0ZW5kcyBNaXJyb3JTeXN0ZW0gewogIGZpbmFsIFR5cGVNaXJyb3IgZHluYW1pY1R5cGUgPSBuZXcgX1NwZWNpYWxUeXBlTWlycm9yKCdkeW5hbWljJyk7CiAgZmluYWwgVHlwZU1pcnJvciB2b2lkVHlwZSA9IG5ldyBfU3BlY2lhbFR5cGVNaXJyb3IoJ3ZvaWQnKTsKCiAgdmFyIF9saWJyYXJpZXM7CiAgTWFwPFVyaSwgTGlicmFyeU1pcnJvcj4gZ2V0IGxpYnJhcmllcyB7CiAgICBpZiAoKF9saWJyYXJpZXMgPT0gbnVsbCkgfHwgX2RpcnR5KSB7CiAgICAgIF9saWJyYXJpZXMgPSBuZXcgTWFwPFVyaSwgTGlicmFyeU1pcnJvcj4oKTsKICAgICAgZm9yIChMaWJyYXJ5TWlycm9yIGxpYiBpbiBfY29tcHV0ZUxpYnJhcmllcygpKSB7CiAgICAgICAgX2xpYnJhcmllc1tsaWIudXJpXSA9IGxpYjsKICAgICAgfQogICAgICBfbGlicmFyaWVzID0gbmV3IFVubW9kaWZpYWJsZU1hcFZpZXc8VXJpLCBMaWJyYXJ5TWlycm9yPihfbGlicmFyaWVzKTsKICAgICAgX2RpcnR5ID0gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gX2xpYnJhcmllczsKICB9CgogIHN0YXRpYyBMaXN0PGR5bmFtaWM+IF9jb21wdXRlTGlicmFyaWVzKCkgbmF0aXZlICJNaXJyb3JTeXN0ZW1fbGlicmFyaWVzIjsKCiAgSXNvbGF0ZU1pcnJvciBfaXNvbGF0ZTsKICBJc29sYXRlTWlycm9yIGdldCBpc29sYXRlIHsKICAgIGlmIChfaXNvbGF0ZSA9PSBudWxsKSB7CiAgICAgIF9pc29sYXRlID0gX2NvbXB1dGVJc29sYXRlKCk7CiAgICB9CiAgICByZXR1cm4gX2lzb2xhdGU7CiAgfQoKICBzdGF0aWMgSXNvbGF0ZU1pcnJvciBfY29tcHV0ZUlzb2xhdGUoKSBuYXRpdmUgIk1pcnJvclN5c3RlbV9pc29sYXRlIjsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIk1pcnJvclN5c3RlbSBmb3IgaXNvbGF0ZSAnJHtpc29sYXRlLmRlYnVnTmFtZX0nIjsKfQoKY2xhc3MgX1NvdXJjZUxvY2F0aW9uIGltcGxlbWVudHMgU291cmNlTG9jYXRpb24gewogIF9Tb3VyY2VMb2NhdGlvbih1cmlTdHJpbmcsIHRoaXMubGluZSwgdGhpcy5jb2x1bW4pCiAgICAgIDogdGhpcy5zb3VyY2VVcmkgPSBVcmkucGFyc2UodXJpU3RyaW5nKTsKCiAgLy8gTGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucyBhcmUgMS1vcmlnaW4sIG9yIDAgaWYgdW5rbm93bi4KICBmaW5hbCBpbnQgbGluZTsKICBmaW5hbCBpbnQgY29sdW1uOwoKICBmaW5hbCBVcmkgc291cmNlVXJpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gY29sdW1uID09IDAgPyAiJHNvdXJjZVVyaTokbGluZSIgOiAiJHNvdXJjZVVyaTokbGluZTokY29sdW1uIjsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIF9Mb2NhbE1pcnJvciBpbXBsZW1lbnRzIE1pcnJvciB7fQoKY2xhc3MgX0xvY2FsSXNvbGF0ZU1pcnJvciBleHRlbmRzIF9Mb2NhbE1pcnJvciBpbXBsZW1lbnRzIElzb2xhdGVNaXJyb3IgewogIGZpbmFsIFN0cmluZyBkZWJ1Z05hbWU7CiAgZmluYWwgTGlicmFyeU1pcnJvciByb290TGlicmFyeTsKCiAgX0xvY2FsSXNvbGF0ZU1pcnJvcih0aGlzLmRlYnVnTmFtZSwgdGhpcy5yb290TGlicmFyeSk7CgogIGJvb2wgZ2V0IGlzQ3VycmVudCA9PiB0cnVlOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiSXNvbGF0ZU1pcnJvciBvbiAnJGRlYnVnTmFtZSciOwoKICBGdXR1cmU8TGlicmFyeU1pcnJvcj4gbG9hZFVyaShVcmkgdXJpKSBhc3luYyB7CiAgICB2YXIgcmVzdWx0ID0gX2xvYWRVcmkodXJpLnRvU3RyaW5nKCkpOwogICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CiAgICAgIC8vIENlbnNvcmVkIGxpYnJhcnkuCiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkNhbm5vdCBsb2FkICR1cmkiKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMgTGlicmFyeU1pcnJvciBfbG9hZFVyaShTdHJpbmcgdXJpKSBuYXRpdmUgIklzb2xhdGVNaXJyb3JfbG9hZFVyaSI7Cn0KCmNsYXNzIF9TeW50aGV0aWNBY2Nlc3NvciBpbXBsZW1lbnRzIE1ldGhvZE1pcnJvciB7CiAgZmluYWwgRGVjbGFyYXRpb25NaXJyb3Igb3duZXI7CiAgZmluYWwgU3ltYm9sIHNpbXBsZU5hbWU7CiAgZmluYWwgYm9vbCBpc0dldHRlcjsKICBmaW5hbCBib29sIGlzU3RhdGljOwogIGZpbmFsIGJvb2wgaXNUb3BMZXZlbDsKICBmaW5hbCBfdGFyZ2V0OwoKICBfU3ludGhldGljQWNjZXNzb3IodGhpcy5vd25lciwgdGhpcy5zaW1wbGVOYW1lLCB0aGlzLmlzR2V0dGVyLCB0aGlzLmlzU3RhdGljLAogICAgICB0aGlzLmlzVG9wTGV2ZWwsIHRoaXMuX3RhcmdldCk7CgogIGJvb2wgZ2V0IGlzU3ludGhldGljID0+IHRydWU7CiAgYm9vbCBnZXQgaXNSZWd1bGFyTWV0aG9kID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzT3BlcmF0b3IgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNDb25zdHJ1Y3RvciA9PiBmYWxzZTsKICBib29sIGdldCBpc0NvbnN0Q29uc3RydWN0b3IgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNHZW5lcmF0aXZlQ29uc3RydWN0b3IgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNGYWN0b3J5Q29uc3RydWN0b3IgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNFeHRlcm5hbCA9PiBmYWxzZTsKICBib29sIGdldCBpc1JlZGlyZWN0aW5nQ29uc3RydWN0b3IgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNBYnN0cmFjdCA9PiBmYWxzZTsKCiAgYm9vbCBnZXQgaXNTZXR0ZXIgPT4gIWlzR2V0dGVyOwogIGJvb2wgZ2V0IGlzUHJpdmF0ZSA9PiBfbihzaW1wbGVOYW1lKS5zdGFydHNXaXRoKCdfJyk7CgogIFN5bWJvbCBnZXQgcXVhbGlmaWVkTmFtZSA9PiBfY29tcHV0ZVF1YWxpZmllZE5hbWUob3duZXIsIHNpbXBsZU5hbWUpOwogIFN5bWJvbCBnZXQgY29uc3RydWN0b3JOYW1lID0+IFN5bWJvbC5lbXB0eTsKCiAgVHlwZU1pcnJvciBnZXQgcmV0dXJuVHlwZSA9PiBfdGFyZ2V0LnR5cGU7CiAgTGlzdDxQYXJhbWV0ZXJNaXJyb3I+IGdldCBwYXJhbWV0ZXJzIHsKICAgIGlmIChpc0dldHRlcikgcmV0dXJuIGNvbnN0IDxQYXJhbWV0ZXJNaXJyb3I+W107CiAgICByZXR1cm4gbmV3IFVubW9kaWZpYWJsZUxpc3RWaWV3PFBhcmFtZXRlck1pcnJvcj4oCiAgICAgICAgPFBhcmFtZXRlck1pcnJvcj5bbmV3IF9TeW50aGV0aWNTZXR0ZXJQYXJhbWV0ZXIodGhpcywgdGhpcy5fdGFyZ2V0KV0pOwogIH0KCiAgU291cmNlTG9jYXRpb24gZ2V0IGxvY2F0aW9uID0+IG51bGw7CiAgTGlzdDxJbnN0YW5jZU1pcnJvcj4gZ2V0IG1ldGFkYXRhID0+IGNvbnN0IDxJbnN0YW5jZU1pcnJvcj5bXTsKICBTdHJpbmcgZ2V0IHNvdXJjZSA9PiBudWxsOwp9CgpjbGFzcyBfU3ludGhldGljU2V0dGVyUGFyYW1ldGVyIGltcGxlbWVudHMgUGFyYW1ldGVyTWlycm9yIHsKICBmaW5hbCBEZWNsYXJhdGlvbk1pcnJvciBvd25lcjsKICBmaW5hbCBWYXJpYWJsZU1pcnJvciBfdGFyZ2V0OwoKICBfU3ludGhldGljU2V0dGVyUGFyYW1ldGVyKHRoaXMub3duZXIsIHRoaXMuX3RhcmdldCk7CgogIFN5bWJvbCBnZXQgc2ltcGxlTmFtZSA9PiBfdGFyZ2V0LnNpbXBsZU5hbWU7CiAgU3ltYm9sIGdldCBxdWFsaWZpZWROYW1lID0+IF9jb21wdXRlUXVhbGlmaWVkTmFtZShvd25lciwgc2ltcGxlTmFtZSk7CiAgVHlwZU1pcnJvciBnZXQgdHlwZSA9PiBfdGFyZ2V0LnR5cGU7CgogIGJvb2wgZ2V0IGlzT3B0aW9uYWwgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNOYW1lZCA9PiBmYWxzZTsKICBib29sIGdldCBpc1N0YXRpYyA9PiBmYWxzZTsKICBib29sIGdldCBpc1RvcExldmVsID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzQ29uc3QgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNGaW5hbCA9PiB0cnVlOwogIGJvb2wgZ2V0IGlzUHJpdmF0ZSA9PiBmYWxzZTsKICBib29sIGdldCBoYXNEZWZhdWx0VmFsdWUgPT4gZmFsc2U7CiAgSW5zdGFuY2VNaXJyb3IgZ2V0IGRlZmF1bHRWYWx1ZSA9PiBudWxsOwogIFNvdXJjZUxvY2F0aW9uIGdldCBsb2NhdGlvbiA9PiBudWxsOwogIExpc3Q8SW5zdGFuY2VNaXJyb3I+IGdldCBtZXRhZGF0YSA9PiBjb25zdCA8SW5zdGFuY2VNaXJyb3I+W107Cn0KCmFic3RyYWN0IGNsYXNzIF9Mb2NhbE9iamVjdE1pcnJvciBleHRlbmRzIF9Mb2NhbE1pcnJvciBpbXBsZW1lbnRzIE9iamVjdE1pcnJvciB7CiAgX2ludm9rZShyZWZsZWN0ZWUsIGZ1bmN0aW9uTmFtZSwgYXJndW1lbnRzLCBhcmd1bWVudE5hbWVzKTsKICBfaW52b2tlR2V0dGVyKHJlZmxlY3RlZSwgZ2V0dGVyTmFtZSk7CiAgX2ludm9rZVNldHRlcihyZWZsZWN0ZWUsIHNldHRlck5hbWUsIHZhbHVlKTsKCiAgZmluYWwgX3JlZmxlY3RlZTsgLy8gTWF5IGJlIGEgTWlycm9yUmVmZXJlbmNlIG9yIGFuIG9yZGluYXJ5IG9iamVjdC4KCiAgX0xvY2FsT2JqZWN0TWlycm9yKHRoaXMuX3JlZmxlY3RlZSk7CgogIEluc3RhbmNlTWlycm9yIGludm9rZShTeW1ib2wgbWVtYmVyTmFtZSwgTGlzdCBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBbTWFwPFN5bWJvbCwgZHluYW1pYz4gbmFtZWRBcmd1bWVudHNdKSB7CiAgICBpbnQgbnVtUG9zaXRpb25hbEFyZ3VtZW50cyA9IHBvc2l0aW9uYWxBcmd1bWVudHMubGVuZ3RoOwogICAgaW50IG51bU5hbWVkQXJndW1lbnRzID0gbmFtZWRBcmd1bWVudHMgIT0gbnVsbCA/IG5hbWVkQXJndW1lbnRzLmxlbmd0aCA6IDA7CiAgICBpbnQgbnVtQXJndW1lbnRzID0gbnVtUG9zaXRpb25hbEFyZ3VtZW50cyArIG51bU5hbWVkQXJndW1lbnRzOwogICAgTGlzdCBhcmd1bWVudHMgPSBuZXcgTGlzdChudW1Bcmd1bWVudHMpOwogICAgYXJndW1lbnRzLnNldFJhbmdlKDAsIG51bVBvc2l0aW9uYWxBcmd1bWVudHMsIHBvc2l0aW9uYWxBcmd1bWVudHMpOwogICAgTGlzdCBuYW1lcyA9IG5ldyBMaXN0KG51bU5hbWVkQXJndW1lbnRzKTsKICAgIGludCBhcmd1bWVudEluZGV4ID0gbnVtUG9zaXRpb25hbEFyZ3VtZW50czsKICAgIGludCBuYW1lSW5kZXggPSAwOwogICAgaWYgKG51bU5hbWVkQXJndW1lbnRzID4gMCkgewogICAgICBuYW1lZEFyZ3VtZW50cy5mb3JFYWNoKChuYW1lLCB2YWx1ZSkgewogICAgICAgIGFyZ3VtZW50c1thcmd1bWVudEluZGV4KytdID0gdmFsdWU7CiAgICAgICAgbmFtZXNbbmFtZUluZGV4KytdID0gX24obmFtZSk7CiAgICAgIH0pOwogICAgfQoKICAgIHJldHVybiByZWZsZWN0KHRoaXMuX2ludm9rZShfcmVmbGVjdGVlLCBfbihtZW1iZXJOYW1lKSwgYXJndW1lbnRzLCBuYW1lcykpOwogIH0KCiAgSW5zdGFuY2VNaXJyb3IgZ2V0RmllbGQoU3ltYm9sIG1lbWJlck5hbWUpIHsKICAgIHJldHVybiByZWZsZWN0KHRoaXMuX2ludm9rZUdldHRlcihfcmVmbGVjdGVlLCBfbihtZW1iZXJOYW1lKSkpOwogIH0KCiAgSW5zdGFuY2VNaXJyb3Igc2V0RmllbGQoU3ltYm9sIG1lbWJlck5hbWUsIE9iamVjdCB2YWx1ZSkgewogICAgdGhpcy5faW52b2tlU2V0dGVyKF9yZWZsZWN0ZWUsIF9uKG1lbWJlck5hbWUpLCB2YWx1ZSk7CiAgICByZXR1cm4gcmVmbGVjdCh2YWx1ZSk7CiAgfQoKICBkZWxlZ2F0ZShJbnZvY2F0aW9uIGludm9jYXRpb24pIHsKICAgIGlmIChpbnZvY2F0aW9uLmlzTWV0aG9kKSB7CiAgICAgIHJldHVybiB0aGlzCiAgICAgICAgICAuaW52b2tlKGludm9jYXRpb24ubWVtYmVyTmFtZSwgaW52b2NhdGlvbi5wb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICAgICAgICAgIGludm9jYXRpb24ubmFtZWRBcmd1bWVudHMpCiAgICAgICAgICAucmVmbGVjdGVlOwogICAgfQogICAgaWYgKGludm9jYXRpb24uaXNHZXR0ZXIpIHsKICAgICAgcmV0dXJuIHRoaXMuZ2V0RmllbGQoaW52b2NhdGlvbi5tZW1iZXJOYW1lKS5yZWZsZWN0ZWU7CiAgICB9CiAgICBpZiAoaW52b2NhdGlvbi5pc1NldHRlcikgewogICAgICB2YXIgdW53cmFwcGVkID0gX24oaW52b2NhdGlvbi5tZW1iZXJOYW1lKTsKICAgICAgdmFyIHdpdGhvdXRFcXVhbCA9IF9zKHVud3JhcHBlZC5zdWJzdHJpbmcoMCwgdW53cmFwcGVkLmxlbmd0aCAtIDEpKTsKICAgICAgdmFyIGFyZyA9IGludm9jYXRpb24ucG9zaXRpb25hbEFyZ3VtZW50c1swXTsKICAgICAgdGhpcy5zZXRGaWVsZCh3aXRob3V0RXF1YWwsIGFyZykucmVmbGVjdGVlOwogICAgICByZXR1cm4gYXJnOwogICAgfQogICAgdGhyb3cgIlVOUkVBQ0hBQkxFIjsKICB9Cn0KCmNsYXNzIF9Mb2NhbEluc3RhbmNlTWlycm9yIGV4dGVuZHMgX0xvY2FsT2JqZWN0TWlycm9yCiAgICBpbXBsZW1lbnRzIEluc3RhbmNlTWlycm9yIHsKICBfTG9jYWxJbnN0YW5jZU1pcnJvcihyZWZsZWN0ZWUpIDogc3VwZXIocmVmbGVjdGVlKTsKCiAgQ2xhc3NNaXJyb3IgX3R5cGU7CiAgQ2xhc3NNaXJyb3IgZ2V0IHR5cGUgewogICAgaWYgKF90eXBlID09IG51bGwpIHsKICAgICAgLy8gTm90ZSBpdCBub3Qgc2FmZSB0byB1c2UgcmVmbGVjdGVlLnJ1bnRpbWVUeXBlIGJlY2F1c2UgcnVudGltZVR5cGUgbWF5CiAgICAgIC8vIGJlIG92ZXJyaWRkZW4uCiAgICAgIF90eXBlID0gcmVmbGVjdFR5cGUoX2NvbXB1dGVUeXBlKHJlZmxlY3RlZSkpOwogICAgfQogICAgcmV0dXJuIF90eXBlOwogIH0KCiAgLy8gTG9jYWxJbnN0YW5jZU1pcnJvcnMgYWx3YXlzIHJlZmxlY3QgbG9jYWwgaW5zdGFuY2VzCiAgYm9vbCBnZXQgaGFzUmVmbGVjdGVlID0+IHRydWU7CgogIGdldCByZWZsZWN0ZWUgPT4gX3JlZmxlY3RlZTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0luc3RhbmNlTWlycm9yIG9uICR7RXJyb3Iuc2FmZVRvU3RyaW5nKF9yZWZsZWN0ZWUpfSc7CgogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIHJldHVybiBvdGhlciBpcyBfTG9jYWxJbnN0YW5jZU1pcnJvciAmJgogICAgICAgIGlkZW50aWNhbChfcmVmbGVjdGVlLCBvdGhlci5fcmVmbGVjdGVlKTsKICB9CgogIGludCBnZXQgaGFzaENvZGUgewogICAgLy8gQXZvaWQgaGFzaCBjb2xsaXNpb25zIHdpdGggdGhlIHJlZmxlY3RlZS4gVGhpcyBjb25zdGFudCBpcyBpbiBTbWkgcmFuZ2UKICAgIC8vIGFuZCBoYXBwZW5zIHRvIGJlIHRoZSBpbm5lciBwYWRkaW5nIGZyb20gUkZDIDIxMDQuCiAgICByZXR1cm4gaWRlbnRpdHlIYXNoQ29kZShfcmVmbGVjdGVlKSBeIDB4MzYzNjM2MzY7CiAgfQoKICBJbnN0YW5jZU1pcnJvciBnZXRGaWVsZChTeW1ib2wgbWVtYmVyTmFtZSkgewogICAgcmV0dXJuIHJlZmxlY3QoX2ludm9rZUdldHRlcihfcmVmbGVjdGVlLCBfbihtZW1iZXJOYW1lKSkpOwogIH0KCiAgSW5zdGFuY2VNaXJyb3Igc2V0RmllbGQoU3ltYm9sIG1lbWJlck5hbWUsIGFyZykgewogICAgX2ludm9rZVNldHRlcihfcmVmbGVjdGVlLCBfbihtZW1iZXJOYW1lKSwgYXJnKTsKICAgIHJldHVybiByZWZsZWN0KGFyZyk7CiAgfQoKICAvLyBPdmVycmlkZSB0byBpbmNsdWRlIHRoZSByZWNlaXZlciBpbiB0aGUgYXJndW1lbnRzLgogIEluc3RhbmNlTWlycm9yIGludm9rZShTeW1ib2wgbWVtYmVyTmFtZSwgTGlzdCBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBbTWFwPFN5bWJvbCwgZHluYW1pYz4gbmFtZWRBcmd1bWVudHNdKSB7CiAgICBpbnQgbnVtUG9zaXRpb25hbEFyZ3VtZW50cyA9IHBvc2l0aW9uYWxBcmd1bWVudHMubGVuZ3RoICsgMTsgLy8gUmVjZWl2ZXIuCiAgICBpbnQgbnVtTmFtZWRBcmd1bWVudHMgPSBuYW1lZEFyZ3VtZW50cyAhPSBudWxsID8gbmFtZWRBcmd1bWVudHMubGVuZ3RoIDogMDsKICAgIGludCBudW1Bcmd1bWVudHMgPSBudW1Qb3NpdGlvbmFsQXJndW1lbnRzICsgbnVtTmFtZWRBcmd1bWVudHM7CiAgICBMaXN0IGFyZ3VtZW50cyA9IG5ldyBMaXN0KG51bUFyZ3VtZW50cyk7CiAgICBhcmd1bWVudHNbMF0gPSBfcmVmbGVjdGVlOyAvLyBSZWNlaXZlci4KICAgIGFyZ3VtZW50cy5zZXRSYW5nZSgxLCBudW1Qb3NpdGlvbmFsQXJndW1lbnRzLCBwb3NpdGlvbmFsQXJndW1lbnRzKTsKICAgIExpc3QgbmFtZXMgPSBuZXcgTGlzdChudW1OYW1lZEFyZ3VtZW50cyk7CiAgICBpbnQgYXJndW1lbnRJbmRleCA9IG51bVBvc2l0aW9uYWxBcmd1bWVudHM7CiAgICBpbnQgbmFtZUluZGV4ID0gMDsKICAgIGlmIChudW1OYW1lZEFyZ3VtZW50cyA+IDApIHsKICAgICAgbmFtZWRBcmd1bWVudHMuZm9yRWFjaCgobmFtZSwgdmFsdWUpIHsKICAgICAgICBhcmd1bWVudHNbYXJndW1lbnRJbmRleCsrXSA9IHZhbHVlOwogICAgICAgIG5hbWVzW25hbWVJbmRleCsrXSA9IF9uKG5hbWUpOwogICAgICB9KTsKICAgIH0KCiAgICByZXR1cm4gcmVmbGVjdCh0aGlzLl9pbnZva2UoX3JlZmxlY3RlZSwgX24obWVtYmVyTmFtZSksIGFyZ3VtZW50cywgbmFtZXMpKTsKICB9CgogIF9pbnZva2UocmVmbGVjdGVlLCBmdW5jdGlvbk5hbWUsIGFyZ3VtZW50cywgYXJndW1lbnROYW1lcykKICAgICAgbmF0aXZlICdJbnN0YW5jZU1pcnJvcl9pbnZva2UnOwoKICBfaW52b2tlR2V0dGVyKHJlZmxlY3RlZSwgZ2V0dGVyTmFtZSkgbmF0aXZlICdJbnN0YW5jZU1pcnJvcl9pbnZva2VHZXR0ZXInOwoKICBfaW52b2tlU2V0dGVyKHJlZmxlY3RlZSwgc2V0dGVyTmFtZSwgdmFsdWUpCiAgICAgIG5hdGl2ZSAnSW5zdGFuY2VNaXJyb3JfaW52b2tlU2V0dGVyJzsKCiAgc3RhdGljIF9jb21wdXRlVHlwZShyZWZsZWN0ZWUpIG5hdGl2ZSAnSW5zdGFuY2VNaXJyb3JfY29tcHV0ZVR5cGUnOwp9CgpjbGFzcyBfTG9jYWxDbG9zdXJlTWlycm9yIGV4dGVuZHMgX0xvY2FsSW5zdGFuY2VNaXJyb3IKICAgIGltcGxlbWVudHMgQ2xvc3VyZU1pcnJvciB7CiAgX0xvY2FsQ2xvc3VyZU1pcnJvcihyZWZsZWN0ZWUpIDogc3VwZXIocmVmbGVjdGVlKTsKCiAgTWV0aG9kTWlycm9yIF9mdW5jdGlvbjsKICBNZXRob2RNaXJyb3IgZ2V0IGZ1bmN0aW9uIHsKICAgIGlmIChfZnVuY3Rpb24gPT0gbnVsbCkgewogICAgICBfZnVuY3Rpb24gPSBfY29tcHV0ZUZ1bmN0aW9uKHJlZmxlY3RlZSk7CiAgICB9CiAgICByZXR1cm4gX2Z1bmN0aW9uOwogIH0KCiAgSW5zdGFuY2VNaXJyb3IgYXBwbHkoTGlzdDxPYmplY3Q+IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIFtNYXA8U3ltYm9sLCBPYmplY3Q+IG5hbWVkQXJndW1lbnRzXSkgewogICAgcmV0dXJuIHRoaXMuaW52b2tlKCNjYWxsLCBwb3NpdGlvbmFsQXJndW1lbnRzLCBuYW1lZEFyZ3VtZW50cyk7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiQ2xvc3VyZU1pcnJvciBvbiAnJHtFcnJvci5zYWZlVG9TdHJpbmcoX3JlZmxlY3RlZSl9JyI7CgogIHN0YXRpYyBfY29tcHV0ZUZ1bmN0aW9uKHJlZmxlY3RlZSkgbmF0aXZlICdDbG9zdXJlTWlycm9yX2Z1bmN0aW9uJzsKfQoKYWJzdHJhY3QgY2xhc3MgX0xvY2FsVHlwZU1pcnJvciB7CiAgVHlwZSBnZXQgX3JlZmxlY3RlZFR5cGU7Cn0KCmNsYXNzIF9Mb2NhbENsYXNzTWlycm9yIGV4dGVuZHMgX0xvY2FsT2JqZWN0TWlycm9yCiAgICBpbXBsZW1lbnRzIENsYXNzTWlycm9yLCBfTG9jYWxUeXBlTWlycm9yIHsKICBmaW5hbCBUeXBlIF9yZWZsZWN0ZWRUeXBlOwogIFN5bWJvbCBfc2ltcGxlTmFtZTsKICBEZWNsYXJhdGlvbk1pcnJvciBfb3duZXI7CiAgZmluYWwgYm9vbCBpc0Fic3RyYWN0OwogIGZpbmFsIGJvb2wgX2lzR2VuZXJpYzsKCiAgLy8gU2luY2UgRGFydCAyLCBtaXhpbnMgYXJlIGVyYXNlZCBieSBrZXJuZWwgdHJhbnNmb3JtYXRpb24uCiAgLy8gUmVzdWx0aW5nIGNsYXNzZXMgaGF2ZSB0aGlzIGZsYWcgc2V0LCBhbmQgbWl4ZWQtaW4gdHlwZSBpcyBwdWxsZWQgaW50bwogIC8vIHRoZSBlbmQgb2YgaW50ZXJmYWNlcyBsaXN0LgogIGZpbmFsIGJvb2wgX2lzVHJhbnNmb3JtZWRNaXhpbkFwcGxpY2F0aW9uOwoKICBmaW5hbCBib29sIF9pc0dlbmVyaWNEZWNsYXJhdGlvbjsKICBmaW5hbCBib29sIGlzRW51bTsKICBUeXBlIF9pbnN0YW50aWF0b3I7CgogIF9Mb2NhbENsYXNzTWlycm9yKAogICAgICByZWZsZWN0ZWUsCiAgICAgIHJlZmxlY3RlZFR5cGUsCiAgICAgIFN0cmluZyBzaW1wbGVOYW1lLAogICAgICB0aGlzLl9vd25lciwKICAgICAgdGhpcy5pc0Fic3RyYWN0LAogICAgICB0aGlzLl9pc0dlbmVyaWMsCiAgICAgIHRoaXMuX2lzVHJhbnNmb3JtZWRNaXhpbkFwcGxpY2F0aW9uLAogICAgICB0aGlzLl9pc0dlbmVyaWNEZWNsYXJhdGlvbiwKICAgICAgdGhpcy5pc0VudW0pCiAgICAgIDogdGhpcy5fc2ltcGxlTmFtZSA9IF9zKHNpbXBsZU5hbWUpLAogICAgICAgIHRoaXMuX3JlZmxlY3RlZFR5cGUgPSByZWZsZWN0ZWRUeXBlLAogICAgICAgIHRoaXMuX2luc3RhbnRpYXRvciA9IHJlZmxlY3RlZFR5cGUsCiAgICAgICAgc3VwZXIocmVmbGVjdGVlKTsKCiAgYm9vbCBnZXQgaGFzUmVmbGVjdGVkVHlwZSA9PiAhX2lzR2VuZXJpY0RlY2xhcmF0aW9uOwogIFR5cGUgZ2V0IHJlZmxlY3RlZFR5cGUgewogICAgaWYgKCFoYXNSZWZsZWN0ZWRUeXBlKSB7CiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICAgIkRlY2xhcmF0aW9ucyBvZiBnZW5lcmljcyBoYXZlIG5vIHJlZmxlY3RlZCB0eXBlIik7CiAgICB9CiAgICByZXR1cm4gX3JlZmxlY3RlZFR5cGU7CiAgfQoKICBTeW1ib2wgZ2V0IHNpbXBsZU5hbWUgewogICAgLy8gQWxsIGJ1dCBhbm9ueW1vdXMgbWl4aW4gYXBwbGljYXRpb25zIGhhdmUgdGhlaXIgbmFtZSBzZXQgYXQgY29uc3RydWN0aW9uLgogICAgaWYgKF9zaW1wbGVOYW1lID09IG51bGwpIHsKICAgICAgX3NpbXBsZU5hbWUgPSB0aGlzLl9taXhpbkFwcGxpY2F0aW9uTmFtZTsKICAgIH0KICAgIHJldHVybiBfc2ltcGxlTmFtZTsKICB9CgogIFN5bWJvbCBfcXVhbGlmaWVkTmFtZTsKICBTeW1ib2wgZ2V0IHF1YWxpZmllZE5hbWUgewogICAgaWYgKF9xdWFsaWZpZWROYW1lID09IG51bGwpIHsKICAgICAgX3F1YWxpZmllZE5hbWUgPSBfY29tcHV0ZVF1YWxpZmllZE5hbWUob3duZXIsIHNpbXBsZU5hbWUpOwogICAgfQogICAgcmV0dXJuIF9xdWFsaWZpZWROYW1lOwogIH0KCiAgRGVjbGFyYXRpb25NaXJyb3IgZ2V0IG93bmVyIHsKICAgIGlmIChfb3duZXIgPT0gbnVsbCkgewogICAgICB2YXIgdXJpID0gX0xvY2FsQ2xhc3NNaXJyb3IuX2xpYnJhcnlVcmkoX3JlZmxlY3RlZSk7CiAgICAgIF9vd25lciA9IGN1cnJlbnRNaXJyb3JTeXN0ZW0oKS5saWJyYXJpZXNbVXJpLnBhcnNlKHVyaSldOwogICAgfQogICAgcmV0dXJuIF9vd25lcjsKICB9CgogIGJvb2wgZ2V0IGlzUHJpdmF0ZSA9PiBfbihzaW1wbGVOYW1lKS5zdGFydHNXaXRoKCdfJyk7CgogIGJvb2wgZ2V0IGlzVG9wTGV2ZWwgPT4gdHJ1ZTsKCiAgU291cmNlTG9jYXRpb24gZ2V0IGxvY2F0aW9uIHsKICAgIHJldHVybiBfbG9jYXRpb24oX3JlZmxlY3RlZSk7CiAgfQoKICBfTG9jYWxDbGFzc01pcnJvciBfdHJ1ZVN1cGVyY2xhc3NGaWVsZDsKICBfTG9jYWxDbGFzc01pcnJvciBnZXQgX3RydWVTdXBlcmNsYXNzIHsKICAgIGlmIChfdHJ1ZVN1cGVyY2xhc3NGaWVsZCA9PSBudWxsKSB7CiAgICAgIFR5cGUgc3VwZXJ0eXBlID0gaXNPcmlnaW5hbERlY2xhcmF0aW9uCiAgICAgICAgICA/IF9zdXBlcnR5cGUoX3JlZmxlY3RlZFR5cGUpCiAgICAgICAgICA6IF9zdXBlcnR5cGVJbnN0YW50aWF0ZWQoX3JlZmxlY3RlZFR5cGUpOwogICAgICBpZiAoc3VwZXJ0eXBlID09IG51bGwpIHsKICAgICAgICAvLyBPYmplY3QgaGFzIG5vIHN1cGVyY2xhc3MuCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgX3RydWVTdXBlcmNsYXNzRmllbGQgPSByZWZsZWN0VHlwZShzdXBlcnR5cGUpOwogICAgICBfdHJ1ZVN1cGVyY2xhc3NGaWVsZC5faW5zdGFudGlhdG9yID0gX2luc3RhbnRpYXRvcjsKICAgIH0KICAgIHJldHVybiBfdHJ1ZVN1cGVyY2xhc3NGaWVsZDsKICB9CgogIENsYXNzTWlycm9yIGdldCBzdXBlcmNsYXNzIHsKICAgIHJldHVybiBfdHJ1ZVN1cGVyY2xhc3M7CiAgfQoKICB2YXIgX3N1cGVyaW50ZXJmYWNlczsKICBMaXN0PENsYXNzTWlycm9yPiBnZXQgc3VwZXJpbnRlcmZhY2VzIHsKICAgIGlmIChfc3VwZXJpbnRlcmZhY2VzID09IG51bGwpIHsKICAgICAgdmFyIGludGVyZmFjZVR5cGVzID0gaXNPcmlnaW5hbERlY2xhcmF0aW9uCiAgICAgICAgICA/IF9uYXRpdmVJbnRlcmZhY2VzKF9yZWZsZWN0ZWRUeXBlKQogICAgICAgICAgOiBfbmF0aXZlSW50ZXJmYWNlc0luc3RhbnRpYXRlZChfcmVmbGVjdGVkVHlwZSk7CiAgICAgIGlmIChfaXNUcmFuc2Zvcm1lZE1peGluQXBwbGljYXRpb24pIHsKICAgICAgICBpbnRlcmZhY2VUeXBlcyA9IGludGVyZmFjZVR5cGVzLnN1Ymxpc3QoMCwgaW50ZXJmYWNlVHlwZXMubGVuZ3RoIC0gMSk7CiAgICAgIH0KICAgICAgdmFyIGludGVyZmFjZU1pcnJvcnMgPSBuZXcgTGlzdDxDbGFzc01pcnJvcj4oKTsKICAgICAgZm9yICh2YXIgaW50ZXJmYWNlVHlwZSBpbiBpbnRlcmZhY2VUeXBlcykgewogICAgICAgIGludGVyZmFjZU1pcnJvcnMuYWRkKHJlZmxlY3RUeXBlKGludGVyZmFjZVR5cGUpKTsKICAgICAgfQogICAgICBfc3VwZXJpbnRlcmZhY2VzID0KICAgICAgICAgIG5ldyBVbm1vZGlmaWFibGVMaXN0VmlldzxDbGFzc01pcnJvcj4oaW50ZXJmYWNlTWlycm9ycyk7CiAgICB9CiAgICByZXR1cm4gX3N1cGVyaW50ZXJmYWNlczsKICB9CgogIGdldCBfbWl4aW5BcHBsaWNhdGlvbk5hbWUgewogICAgdmFyIG1peGlucyA9IG5ldyBMaXN0PENsYXNzTWlycm9yPigpOwogICAgdmFyIGtsYXNzID0gdGhpczsKICAgIHdoaWxlIChfbmF0aXZlTWl4aW4oa2xhc3MuX3JlZmxlY3RlZFR5cGUpICE9IG51bGwpIHsKICAgICAgbWl4aW5zLmFkZChrbGFzcy5taXhpbik7CiAgICAgIGtsYXNzID0ga2xhc3Muc3VwZXJjbGFzczsKICAgIH0KICAgIHJldHVybiBfcyhfbihrbGFzcy5xdWFsaWZpZWROYW1lKSArCiAgICAgICAgJyB3aXRoICcgKwogICAgICAgIG1peGlucy5yZXZlcnNlZC5tYXAoKG0pID0+IF9uKG0ucXVhbGlmaWVkTmFtZSkpLmpvaW4oJywgJykpOwogIH0KCiAgdmFyIF9taXhpbjsKICBDbGFzc01pcnJvciBnZXQgbWl4aW4gewogICAgaWYgKF9taXhpbiA9PSBudWxsKSB7CiAgICAgIFR5cGUgbWl4aW5UeXBlID0KICAgICAgICAgIF9uYXRpdmVNaXhpbkluc3RhbnRpYXRlZChfcmVmbGVjdGVkVHlwZSwgX2luc3RhbnRpYXRvcik7CiAgICAgIGlmIChtaXhpblR5cGUgPT0gbnVsbCkgewogICAgICAgIC8vIFRoZSByZWZsZWN0ZWUgaXMgbm90IGEgbWl4aW4gYXBwbGljYXRpb24uCiAgICAgICAgX21peGluID0gdGhpczsKICAgICAgfSBlbHNlIHsKICAgICAgICBfbWl4aW4gPSByZWZsZWN0VHlwZShtaXhpblR5cGUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gX21peGluOwogIH0KCiAgdmFyIF9jYWNoZWRTdGF0aWNNZW1iZXJzOwogIE1hcDxTeW1ib2wsIE1ldGhvZE1pcnJvcj4gZ2V0IHN0YXRpY01lbWJlcnMgewogICAgaWYgKF9jYWNoZWRTdGF0aWNNZW1iZXJzID09IG51bGwpIHsKICAgICAgdmFyIHJlc3VsdCA9IG5ldyBNYXA8U3ltYm9sLCBNZXRob2RNaXJyb3I+KCk7CiAgICAgIGRlY2xhcmF0aW9ucy52YWx1ZXMuZm9yRWFjaCgoZGVjbCkgewogICAgICAgIGlmIChkZWNsIGlzIE1ldGhvZE1pcnJvciAmJiBkZWNsLmlzU3RhdGljICYmICFkZWNsLmlzQ29uc3RydWN0b3IpIHsKICAgICAgICAgIHJlc3VsdFtkZWNsLnNpbXBsZU5hbWVdID0gZGVjbDsKICAgICAgICB9CiAgICAgICAgaWYgKGRlY2wgaXMgVmFyaWFibGVNaXJyb3IgJiYgZGVjbC5pc1N0YXRpYykgewogICAgICAgICAgdmFyIGdldHRlck5hbWUgPSBkZWNsLnNpbXBsZU5hbWU7CiAgICAgICAgICByZXN1bHRbZ2V0dGVyTmFtZV0gPQogICAgICAgICAgICAgIG5ldyBfU3ludGhldGljQWNjZXNzb3IodGhpcywgZ2V0dGVyTmFtZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGRlY2wpOwogICAgICAgICAgaWYgKCFkZWNsLmlzRmluYWwpIHsKICAgICAgICAgICAgdmFyIHNldHRlck5hbWUgPSBfYXNTZXR0ZXIoZGVjbC5zaW1wbGVOYW1lLCB0aGlzLm93bmVyKTsKICAgICAgICAgICAgcmVzdWx0W3NldHRlck5hbWVdID0gbmV3IF9TeW50aGV0aWNBY2Nlc3NvcigKICAgICAgICAgICAgICAgIHRoaXMsIHNldHRlck5hbWUsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZGVjbCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgX2NhY2hlZFN0YXRpY01lbWJlcnMgPQogICAgICAgICAgbmV3IFVubW9kaWZpYWJsZU1hcFZpZXc8U3ltYm9sLCBNZXRob2RNaXJyb3I+KHJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gX2NhY2hlZFN0YXRpY01lbWJlcnM7CiAgfQoKICB2YXIgX2NhY2hlZEluc3RhbmNlTWVtYmVyczsKICBNYXA8U3ltYm9sLCBNZXRob2RNaXJyb3I+IGdldCBpbnN0YW5jZU1lbWJlcnMgewogICAgaWYgKF9jYWNoZWRJbnN0YW5jZU1lbWJlcnMgPT0gbnVsbCkgewogICAgICB2YXIgcmVzdWx0ID0gbmV3IE1hcDxTeW1ib2wsIE1ldGhvZE1pcnJvcj4oKTsKICAgICAgaWYgKHN1cGVyY2xhc3MgIT0gbnVsbCkgewogICAgICAgIHJlc3VsdC5hZGRBbGwoc3VwZXJjbGFzcy5pbnN0YW5jZU1lbWJlcnMpOwogICAgICB9CiAgICAgIGRlY2xhcmF0aW9ucy52YWx1ZXMuZm9yRWFjaCgoZGVjbCkgewogICAgICAgIGlmIChkZWNsIGlzIE1ldGhvZE1pcnJvciAmJgogICAgICAgICAgICAhZGVjbC5pc1N0YXRpYyAmJgogICAgICAgICAgICAhZGVjbC5pc0NvbnN0cnVjdG9yICYmCiAgICAgICAgICAgICFkZWNsLmlzQWJzdHJhY3QpIHsKICAgICAgICAgIHJlc3VsdFtkZWNsLnNpbXBsZU5hbWVdID0gZGVjbDsKICAgICAgICB9CiAgICAgICAgaWYgKGRlY2wgaXMgVmFyaWFibGVNaXJyb3IgJiYgIWRlY2wuaXNTdGF0aWMpIHsKICAgICAgICAgIHZhciBnZXR0ZXJOYW1lID0gZGVjbC5zaW1wbGVOYW1lOwogICAgICAgICAgcmVzdWx0W2dldHRlck5hbWVdID0gbmV3IF9TeW50aGV0aWNBY2Nlc3NvcigKICAgICAgICAgICAgICB0aGlzLCBnZXR0ZXJOYW1lLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGRlY2wpOwogICAgICAgICAgaWYgKCFkZWNsLmlzRmluYWwpIHsKICAgICAgICAgICAgdmFyIHNldHRlck5hbWUgPSBfYXNTZXR0ZXIoZGVjbC5zaW1wbGVOYW1lLCB0aGlzLm93bmVyKTsKICAgICAgICAgICAgcmVzdWx0W3NldHRlck5hbWVdID0gbmV3IF9TeW50aGV0aWNBY2Nlc3NvcigKICAgICAgICAgICAgICAgIHRoaXMsIHNldHRlck5hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGRlY2wpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIF9jYWNoZWRJbnN0YW5jZU1lbWJlcnMgPQogICAgICAgICAgbmV3IFVubW9kaWZpYWJsZU1hcFZpZXc8U3ltYm9sLCBNZXRob2RNaXJyb3I+KHJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gX2NhY2hlZEluc3RhbmNlTWVtYmVyczsKICB9CgogIE1hcDxTeW1ib2wsIERlY2xhcmF0aW9uTWlycm9yPiBfZGVjbGFyYXRpb25zOwogIE1hcDxTeW1ib2wsIERlY2xhcmF0aW9uTWlycm9yPiBnZXQgZGVjbGFyYXRpb25zIHsKICAgIGlmIChfZGVjbGFyYXRpb25zICE9IG51bGwpIHJldHVybiBfZGVjbGFyYXRpb25zOwoKICAgIHZhciBkZWNscyA9IG5ldyBNYXA8U3ltYm9sLCBEZWNsYXJhdGlvbk1pcnJvcj4oKTsKCiAgICB2YXIgbWVtYmVycyA9IChtaXhpbiBhcyBfTG9jYWxDbGFzc01pcnJvcikuX2NvbXB1dGVNZW1iZXJzKAogICAgICAgIF9pbnN0YW50aWF0b3IsIChtaXhpbiBhcyBfTG9jYWxDbGFzc01pcnJvcikuX3JlZmxlY3RlZSk7CiAgICBmb3IgKHZhciBtZW1iZXIgaW4gbWVtYmVycykgewogICAgICBkZWNsc1ttZW1iZXIuc2ltcGxlTmFtZV0gPSBtZW1iZXI7CiAgICB9CgogICAgdmFyIGNvbnN0cnVjdG9ycyA9IF9jb21wdXRlQ29uc3RydWN0b3JzKF9pbnN0YW50aWF0b3IsIF9yZWZsZWN0ZWUpOwogICAgdmFyIHN0cmluZ05hbWUgPSBfbihzaW1wbGVOYW1lKTsKICAgIGZvciAodmFyIGNvbnN0cnVjdG9yIGluIGNvbnN0cnVjdG9ycykgewogICAgICBjb25zdHJ1Y3Rvci5fcGF0Y2hDb25zdHJ1Y3Rvck5hbWUoc3RyaW5nTmFtZSk7CiAgICAgIGRlY2xzW2NvbnN0cnVjdG9yLnNpbXBsZU5hbWVdID0gY29uc3RydWN0b3I7CiAgICB9CgogICAgZm9yICh2YXIgdHlwZVZhcmlhYmxlIGluIHR5cGVWYXJpYWJsZXMpIHsKICAgICAgZGVjbHNbdHlwZVZhcmlhYmxlLnNpbXBsZU5hbWVdID0gdHlwZVZhcmlhYmxlOwogICAgfQoKICAgIHJldHVybiBfZGVjbGFyYXRpb25zID0KICAgICAgICBuZXcgVW5tb2RpZmlhYmxlTWFwVmlldzxTeW1ib2wsIERlY2xhcmF0aW9uTWlycm9yPihkZWNscyk7CiAgfQoKICAvLyBOb3RlOiByZXR1cm5zIGNvcnJlY3QgcmVzdWx0IG9ubHkgZm9yIERhcnQgMSBhbm9ueW1vdXMgbWl4aW4gYXBwbGljYXRpb25zLgogIGJvb2wgZ2V0IF9pc0Fub255bW91c01peGluQXBwbGljYXRpb24gewogICAgaWYgKG1peGluID09IHRoaXMpIHJldHVybiBmYWxzZTsgLy8gTm90IGEgbWl4aW4gYXBwbGljYXRpb24uCiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIExpc3Q8VHlwZVZhcmlhYmxlTWlycm9yPiBfdHlwZVZhcmlhYmxlczsKICBMaXN0PFR5cGVWYXJpYWJsZU1pcnJvcj4gZ2V0IHR5cGVWYXJpYWJsZXMgewogICAgaWYgKF90eXBlVmFyaWFibGVzID09IG51bGwpIHsKICAgICAgaWYgKCFfaXNUcmFuc2Zvcm1lZE1peGluQXBwbGljYXRpb24gJiYgX2lzQW5vbnltb3VzTWl4aW5BcHBsaWNhdGlvbikgewogICAgICAgIHJldHVybiBfdHlwZVZhcmlhYmxlcyA9IGNvbnN0IDxUeXBlVmFyaWFibGVNaXJyb3I+W107CiAgICAgIH0KICAgICAgX3R5cGVWYXJpYWJsZXMgPSBuZXcgTGlzdDxUeXBlVmFyaWFibGVNaXJyb3I+KCk7CgogICAgICBMaXN0IHBhcmFtcyA9IF9DbGFzc01pcnJvcl90eXBlX3ZhcmlhYmxlcyhfcmVmbGVjdGVlKTsKICAgICAgQ2xhc3NNaXJyb3Igb3duZXIgPSBvcmlnaW5hbERlY2xhcmF0aW9uOwogICAgICB2YXIgbWlycm9yOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgIG1pcnJvciA9IG5ldyBfTG9jYWxUeXBlVmFyaWFibGVNaXJyb3IocGFyYW1zW2kgKyAxXSwgcGFyYW1zW2ldLCBvd25lcik7CiAgICAgICAgX3R5cGVWYXJpYWJsZXMuYWRkKG1pcnJvcik7CiAgICAgIH0KICAgICAgX3R5cGVWYXJpYWJsZXMgPQogICAgICAgICAgbmV3IFVubW9kaWZpYWJsZUxpc3RWaWV3PFR5cGVWYXJpYWJsZU1pcnJvcj4oX3R5cGVWYXJpYWJsZXMpOwogICAgfQogICAgcmV0dXJuIF90eXBlVmFyaWFibGVzOwogIH0KCiAgTGlzdDxUeXBlTWlycm9yPiBfdHlwZUFyZ3VtZW50czsKICBMaXN0PFR5cGVNaXJyb3I+IGdldCB0eXBlQXJndW1lbnRzIHsKICAgIGlmIChfdHlwZUFyZ3VtZW50cyA9PSBudWxsKSB7CiAgICAgIGlmIChfaXNHZW5lcmljRGVjbGFyYXRpb24gfHwKICAgICAgICAgICghX2lzVHJhbnNmb3JtZWRNaXhpbkFwcGxpY2F0aW9uICYmIF9pc0Fub255bW91c01peGluQXBwbGljYXRpb24pKSB7CiAgICAgICAgX3R5cGVBcmd1bWVudHMgPSBjb25zdCA8VHlwZU1pcnJvcj5bXTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfdHlwZUFyZ3VtZW50cyA9IG5ldyBVbm1vZGlmaWFibGVMaXN0VmlldzxUeXBlTWlycm9yPigKICAgICAgICAgICAgX2NvbXB1dGVUeXBlQXJndW1lbnRzKF9yZWZsZWN0ZWRUeXBlKS5jYXN0PFR5cGVNaXJyb3I+KCkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gX3R5cGVBcmd1bWVudHM7CiAgfQoKICBib29sIGdldCBpc09yaWdpbmFsRGVjbGFyYXRpb24gPT4gIV9pc0dlbmVyaWMgfHwgX2lzR2VuZXJpY0RlY2xhcmF0aW9uOwoKICBDbGFzc01pcnJvciBnZXQgb3JpZ2luYWxEZWNsYXJhdGlvbiB7CiAgICBpZiAoaXNPcmlnaW5hbERlY2xhcmF0aW9uKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHJlZmxlY3RDbGFzcyhfcmVmbGVjdGVkVHlwZSk7CiAgICB9CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiQ2xhc3NNaXJyb3Igb24gJyR7TWlycm9yU3lzdGVtLmdldE5hbWUoc2ltcGxlTmFtZSl9JyI7CgogIEluc3RhbmNlTWlycm9yIG5ld0luc3RhbmNlKFN5bWJvbCBjb25zdHJ1Y3Rvck5hbWUsIExpc3QgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgW01hcDxTeW1ib2wsIGR5bmFtaWM+IG5hbWVkQXJndW1lbnRzXSkgewogICAgLy8gTmF0aXZlIGNvZGUgd2lsbCBhZGQgdGhlIDEgb3IgMiBpbXBsaWNpdCBhcmd1bWVudHMgZGVwZW5kaW5nIG9uIHdoZXRoZXIKICAgIC8vIHdlIGVuZCB1cCBpbnZva2luZyBhIGZhY3Rvcnkgb3IgY29uc3RydWN0b3IgcmVzcGVjdGl2ZWx5LgogICAgaW50IG51bVBvc2l0aW9uYWxBcmd1bWVudHMgPSBwb3NpdGlvbmFsQXJndW1lbnRzLmxlbmd0aDsKICAgIGludCBudW1OYW1lZEFyZ3VtZW50cyA9IG5hbWVkQXJndW1lbnRzICE9IG51bGwgPyBuYW1lZEFyZ3VtZW50cy5sZW5ndGggOiAwOwogICAgaW50IG51bUFyZ3VtZW50cyA9IG51bVBvc2l0aW9uYWxBcmd1bWVudHMgKyBudW1OYW1lZEFyZ3VtZW50czsKICAgIExpc3QgYXJndW1lbnRzID0gbmV3IExpc3QobnVtQXJndW1lbnRzKTsKICAgIGFyZ3VtZW50cy5zZXRSYW5nZSgwLCBudW1Qb3NpdGlvbmFsQXJndW1lbnRzLCBwb3NpdGlvbmFsQXJndW1lbnRzKTsKICAgIExpc3QgbmFtZXMgPSBuZXcgTGlzdChudW1OYW1lZEFyZ3VtZW50cyk7CiAgICBpbnQgYXJndW1lbnRJbmRleCA9IG51bVBvc2l0aW9uYWxBcmd1bWVudHM7CiAgICBpbnQgbmFtZUluZGV4ID0gMDsKICAgIGlmIChudW1OYW1lZEFyZ3VtZW50cyA+IDApIHsKICAgICAgbmFtZWRBcmd1bWVudHMuZm9yRWFjaCgobmFtZSwgdmFsdWUpIHsKICAgICAgICBhcmd1bWVudHNbYXJndW1lbnRJbmRleCsrXSA9IHZhbHVlOwogICAgICAgIG5hbWVzW25hbWVJbmRleCsrXSA9IF9uKG5hbWUpOwogICAgICB9KTsKICAgIH0KCiAgICByZXR1cm4gcmVmbGVjdChfaW52b2tlQ29uc3RydWN0b3IoCiAgICAgICAgX3JlZmxlY3RlZSwgX3JlZmxlY3RlZFR5cGUsIF9uKGNvbnN0cnVjdG9yTmFtZSksIGFyZ3VtZW50cywgbmFtZXMpKTsKICB9CgogIExpc3Q8SW5zdGFuY2VNaXJyb3I+IGdldCBtZXRhZGF0YSB7CiAgICAvLyBHZXQgdGhlIG1ldGFkYXRhIG9iamVjdHMsIGNvbnZlcnQgdGhlbSBpbnRvIEluc3RhbmNlTWlycm9ycyB1c2luZwogICAgLy8gcmVmbGVjdCgpIGFuZCB0aGVuIG1ha2UgdGhlbSBpbnRvIGEgRGFydCBsaXN0LgogICAgcmV0dXJuIG5ldyBVbm1vZGlmaWFibGVMaXN0VmlldzxJbnN0YW5jZU1pcnJvcj4oCiAgICAgICAgX21ldGFkYXRhKF9yZWZsZWN0ZWUpLm1hcChyZWZsZWN0KSk7CiAgfQoKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICByZXR1cm4gdGhpcy5ydW50aW1lVHlwZSA9PSBvdGhlci5ydW50aW1lVHlwZSAmJgogICAgICAgIHRoaXMuX3JlZmxlY3RlZSA9PSBvdGhlci5fcmVmbGVjdGVlICYmCiAgICAgICAgdGhpcy5fcmVmbGVjdGVkVHlwZSA9PSBvdGhlci5fcmVmbGVjdGVkVHlwZSAmJgogICAgICAgIHRoaXMuX2lzR2VuZXJpY0RlY2xhcmF0aW9uID09IG90aGVyLl9pc0dlbmVyaWNEZWNsYXJhdGlvbjsKICB9CgogIGludCBnZXQgaGFzaENvZGUgPT4gc2ltcGxlTmFtZS5oYXNoQ29kZTsKCiAgYm9vbCBpc1N1YnR5cGVPZihUeXBlTWlycm9yIG90aGVyKSB7CiAgICBpZiAob3RoZXIgPT0gY3VycmVudE1pcnJvclN5c3RlbSgpLmR5bmFtaWNUeXBlKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciA9PSBjdXJyZW50TWlycm9yU3lzdGVtKCkudm9pZFR5cGUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBfc3VidHlwZVRlc3QoCiAgICAgICAgX3JlZmxlY3RlZFR5cGUsIChvdGhlciBhcyBfTG9jYWxUeXBlTWlycm9yKS5fcmVmbGVjdGVkVHlwZSk7CiAgfQoKICBib29sIGlzQXNzaWduYWJsZVRvKFR5cGVNaXJyb3Igb3RoZXIpIHsKICAgIGlmIChvdGhlciA9PSBjdXJyZW50TWlycm9yU3lzdGVtKCkuZHluYW1pY1R5cGUpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyID09IGN1cnJlbnRNaXJyb3JTeXN0ZW0oKS52b2lkVHlwZSkgcmV0dXJuIGZhbHNlOwogICAgZmluYWwgb3RoZXJSZWZsZWN0ZWRUeXBlID0gKG90aGVyIGFzIF9Mb2NhbFR5cGVNaXJyb3IpLl9yZWZsZWN0ZWRUeXBlOwogICAgcmV0dXJuIF9zdWJ0eXBlVGVzdChfcmVmbGVjdGVkVHlwZSwgb3RoZXJSZWZsZWN0ZWRUeXBlKSB8fAogICAgICAgIF9zdWJ0eXBlVGVzdChvdGhlclJlZmxlY3RlZFR5cGUsIF9yZWZsZWN0ZWRUeXBlKTsKICB9CgogIGJvb2wgaXNTdWJjbGFzc09mKENsYXNzTWlycm9yIG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMhIENsYXNzTWlycm9yKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihvdGhlcik7CiAgICBDbGFzc01pcnJvciBvdGhlckRlY2xhcmF0aW9uID0gb3RoZXIub3JpZ2luYWxEZWNsYXJhdGlvbjsKICAgIENsYXNzTWlycm9yIGMgPSB0aGlzOwogICAgd2hpbGUgKGMgIT0gbnVsbCkgewogICAgICBjID0gYy5vcmlnaW5hbERlY2xhcmF0aW9uOwogICAgICBpZiAoYyA9PSBvdGhlckRlY2xhcmF0aW9uKSByZXR1cm4gdHJ1ZTsKICAgICAgYyA9IGMuc3VwZXJjbGFzczsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIHN0YXRpYyBTdHJpbmcgX2xpYnJhcnlVcmkocmVmbGVjdGVlKSBuYXRpdmUgIkNsYXNzTWlycm9yX2xpYnJhcnlVcmkiOwoKICBzdGF0aWMgVHlwZSBfc3VwZXJ0eXBlKHJlZmxlY3RlZFR5cGUpIG5hdGl2ZSAiQ2xhc3NNaXJyb3Jfc3VwZXJ0eXBlIjsKCiAgc3RhdGljIFR5cGUgX3N1cGVydHlwZUluc3RhbnRpYXRlZChyZWZsZWN0ZWRUeXBlKQogICAgICBuYXRpdmUgIkNsYXNzTWlycm9yX3N1cGVydHlwZV9pbnN0YW50aWF0ZWQiOwoKICBzdGF0aWMgTGlzdDxkeW5hbWljPiBfbmF0aXZlSW50ZXJmYWNlcyhyZWZsZWN0ZWRUeXBlKQogICAgICBuYXRpdmUgIkNsYXNzTWlycm9yX2ludGVyZmFjZXMiOwoKICBzdGF0aWMgTGlzdDxkeW5hbWljPiBfbmF0aXZlSW50ZXJmYWNlc0luc3RhbnRpYXRlZChyZWZsZWN0ZWRUeXBlKQogICAgICBuYXRpdmUgIkNsYXNzTWlycm9yX2ludGVyZmFjZXNfaW5zdGFudGlhdGVkIjsKCiAgc3RhdGljIFR5cGUgX25hdGl2ZU1peGluKHJlZmxlY3RlZFR5cGUpIG5hdGl2ZSAiQ2xhc3NNaXJyb3JfbWl4aW4iOwoKICBzdGF0aWMgVHlwZSBfbmF0aXZlTWl4aW5JbnN0YW50aWF0ZWQocmVmbGVjdGVkVHlwZSwgaW5zdGFudGlhdG9yKQogICAgICBuYXRpdmUgIkNsYXNzTWlycm9yX21peGluX2luc3RhbnRpYXRlZCI7CgogIExpc3Q8ZHluYW1pYz4gX2NvbXB1dGVNZW1iZXJzKHJlZmxlY3RlZSwgaW5zdGFudGlhdG9yKQogICAgICBuYXRpdmUgIkNsYXNzTWlycm9yX21lbWJlcnMiOwoKICBMaXN0PGR5bmFtaWM+IF9jb21wdXRlQ29uc3RydWN0b3JzKHJlZmxlY3RlZSwgaW5zdGFudGlhdG9yKQogICAgICBuYXRpdmUgIkNsYXNzTWlycm9yX2NvbnN0cnVjdG9ycyI7CgogIF9pbnZva2UocmVmbGVjdGVlLCBtZW1iZXJOYW1lLCBhcmd1bWVudHMsIGFyZ3VtZW50TmFtZXMpCiAgICAgIG5hdGl2ZSAnQ2xhc3NNaXJyb3JfaW52b2tlJzsKCiAgX2ludm9rZUdldHRlcihyZWZsZWN0ZWUsIGdldHRlck5hbWUpIG5hdGl2ZSAnQ2xhc3NNaXJyb3JfaW52b2tlR2V0dGVyJzsKCiAgX2ludm9rZVNldHRlcihyZWZsZWN0ZWUsIHNldHRlck5hbWUsIHZhbHVlKSBuYXRpdmUgJ0NsYXNzTWlycm9yX2ludm9rZVNldHRlcic7CgogIHN0YXRpYyBfaW52b2tlQ29uc3RydWN0b3IocmVmbGVjdGVlLCB0eXBlLCBjb25zdHJ1Y3Rvck5hbWUsIGFyZ3VtZW50cywKICAgICAgYXJndW1lbnROYW1lcykgbmF0aXZlICdDbGFzc01pcnJvcl9pbnZva2VDb25zdHJ1Y3Rvcic7CgogIHN0YXRpYyBMaXN0PGR5bmFtaWM+IF9DbGFzc01pcnJvcl90eXBlX3ZhcmlhYmxlcyhyZWZsZWN0ZWUpCiAgICAgIG5hdGl2ZSAiQ2xhc3NNaXJyb3JfdHlwZV92YXJpYWJsZXMiOwoKICBzdGF0aWMgTGlzdDxkeW5hbWljPiBfY29tcHV0ZVR5cGVBcmd1bWVudHMocmVmbGVjdGVlKQogICAgICBuYXRpdmUgIkNsYXNzTWlycm9yX3R5cGVfYXJndW1lbnRzIjsKfQoKY2xhc3MgX0xvY2FsRnVuY3Rpb25UeXBlTWlycm9yIGV4dGVuZHMgX0xvY2FsQ2xhc3NNaXJyb3IKICAgIGltcGxlbWVudHMgRnVuY3Rpb25UeXBlTWlycm9yIHsKICBmaW5hbCBfZnVuY3Rpb25SZWZsZWN0ZWU7CiAgX0xvY2FsRnVuY3Rpb25UeXBlTWlycm9yKHJlZmxlY3RlZSwgdGhpcy5fZnVuY3Rpb25SZWZsZWN0ZWUsIHJlZmxlY3RlZFR5cGUpCiAgICAgIDogc3VwZXIocmVmbGVjdGVlLCByZWZsZWN0ZWRUeXBlLCBudWxsLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwKICAgICAgICAgICAgZmFsc2UpOwoKICBib29sIGdldCBfaXNBbm9ueW1vdXNNaXhpbkFwcGxpY2F0aW9uID0+IGZhbHNlOwoKICAvLyBGdW5jdGlvblR5cGVNaXJyb3JzIGhhdmUgYSBzaW1wbGVOYW1lIGdlbmVyYXRlZCBmcm9tIHRoZWlyIHNpZ25hdHVyZS4KICBTeW1ib2wgX3NpbXBsZU5hbWU7CiAgU3ltYm9sIGdldCBzaW1wbGVOYW1lIHsKICAgIGlmIChfc2ltcGxlTmFtZSA9PSBudWxsKSB7CiAgICAgIF9zaW1wbGVOYW1lID0gX3MoX21ha2VTaWduYXR1cmVTdHJpbmcocmV0dXJuVHlwZSwgcGFyYW1ldGVycykpOwogICAgfQogICAgcmV0dXJuIF9zaW1wbGVOYW1lOwogIH0KCiAgTWV0aG9kTWlycm9yIF9jYWxsTWV0aG9kOwogIE1ldGhvZE1pcnJvciBnZXQgY2FsbE1ldGhvZCB7CiAgICBpZiAoX2NhbGxNZXRob2QgPT0gbnVsbCkgewogICAgICBfY2FsbE1ldGhvZCA9IF9GdW5jdGlvblR5cGVNaXJyb3JfY2FsbF9tZXRob2QoX2Z1bmN0aW9uUmVmbGVjdGVlKTsKICAgIH0KICAgIHJldHVybiBfY2FsbE1ldGhvZDsKICB9CgogIFR5cGVNaXJyb3IgX3JldHVyblR5cGU7CiAgVHlwZU1pcnJvciBnZXQgcmV0dXJuVHlwZSB7CiAgICBpZiAoX3JldHVyblR5cGUgPT0gbnVsbCkgewogICAgICBfcmV0dXJuVHlwZSA9CiAgICAgICAgICByZWZsZWN0VHlwZShfRnVuY3Rpb25UeXBlTWlycm9yX3JldHVybl90eXBlKF9mdW5jdGlvblJlZmxlY3RlZSkpOwogICAgfQogICAgcmV0dXJuIF9yZXR1cm5UeXBlOwogIH0KCiAgTGlzdDxQYXJhbWV0ZXJNaXJyb3I+IF9wYXJhbWV0ZXJzOwogIExpc3Q8UGFyYW1ldGVyTWlycm9yPiBnZXQgcGFyYW1ldGVycyB7CiAgICBpZiAoX3BhcmFtZXRlcnMgPT0gbnVsbCkgewogICAgICBfcGFyYW1ldGVycyA9IF9GdW5jdGlvblR5cGVNaXJyb3JfcGFyYW1ldGVycyhfZnVuY3Rpb25SZWZsZWN0ZWUpCiAgICAgICAgICAuY2FzdDxQYXJhbWV0ZXJNaXJyb3I+KCk7CiAgICAgIF9wYXJhbWV0ZXJzID0gbmV3IFVubW9kaWZpYWJsZUxpc3RWaWV3PFBhcmFtZXRlck1pcnJvcj4oX3BhcmFtZXRlcnMpOwogICAgfQogICAgcmV0dXJuIF9wYXJhbWV0ZXJzOwogIH0KCiAgYm9vbCBnZXQgaXNPcmlnaW5hbERlY2xhcmF0aW9uID0+IHRydWU7CiAgQ2xhc3NNaXJyb3IgZ2V0IG9yaWdpbmFsRGVjbGFyYXRpb24gPT4gdGhpczsKICBnZXQgdHlwZVZhcmlhYmxlcyA9PiBjb25zdCA8VHlwZVZhcmlhYmxlTWlycm9yPltdOwogIGdldCB0eXBlQXJndW1lbnRzID0+IGNvbnN0IDxUeXBlTWlycm9yPltdOwogIGdldCBtZXRhZGF0YSA9PiBjb25zdCA8SW5zdGFuY2VNaXJyb3I+W107CiAgZ2V0IGxvY2F0aW9uID0+IG51bGw7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJGdW5jdGlvblR5cGVNaXJyb3Igb24gJyR7X24oc2ltcGxlTmFtZSl9JyI7CgogIE1ldGhvZE1pcnJvciBfRnVuY3Rpb25UeXBlTWlycm9yX2NhbGxfbWV0aG9kKGZ1bmN0aW9uUmVmbGVjdGVlKQogICAgICBuYXRpdmUgIkZ1bmN0aW9uVHlwZU1pcnJvcl9jYWxsX21ldGhvZCI7CgogIHN0YXRpYyBUeXBlIF9GdW5jdGlvblR5cGVNaXJyb3JfcmV0dXJuX3R5cGUoZnVuY3Rpb25SZWZsZWN0ZWUpCiAgICAgIG5hdGl2ZSAiRnVuY3Rpb25UeXBlTWlycm9yX3JldHVybl90eXBlIjsKCiAgTGlzdDxkeW5hbWljPiBfRnVuY3Rpb25UeXBlTWlycm9yX3BhcmFtZXRlcnMoZnVuY3Rpb25SZWZsZWN0ZWUpCiAgICAgIG5hdGl2ZSAiRnVuY3Rpb25UeXBlTWlycm9yX3BhcmFtZXRlcnMiOwp9CgphYnN0cmFjdCBjbGFzcyBfTG9jYWxEZWNsYXJhdGlvbk1pcnJvciBleHRlbmRzIF9Mb2NhbE1pcnJvcgogICAgaW1wbGVtZW50cyBEZWNsYXJhdGlvbk1pcnJvciB7CiAgZmluYWwgX3JlZmxlY3RlZTsKICBTeW1ib2wgX3NpbXBsZU5hbWU7CgogIF9Mb2NhbERlY2xhcmF0aW9uTWlycm9yKHRoaXMuX3JlZmxlY3RlZSwgdGhpcy5fc2ltcGxlTmFtZSk7CgogIFN5bWJvbCBnZXQgc2ltcGxlTmFtZSA9PiBfc2ltcGxlTmFtZTsKCiAgU3ltYm9sIF9xdWFsaWZpZWROYW1lOwogIFN5bWJvbCBnZXQgcXVhbGlmaWVkTmFtZSB7CiAgICBpZiAoX3F1YWxpZmllZE5hbWUgPT0gbnVsbCkgewogICAgICBfcXVhbGlmaWVkTmFtZSA9IF9jb21wdXRlUXVhbGlmaWVkTmFtZShvd25lciwgc2ltcGxlTmFtZSk7CiAgICB9CiAgICByZXR1cm4gX3F1YWxpZmllZE5hbWU7CiAgfQoKICBib29sIGdldCBpc1ByaXZhdGUgPT4gX24oc2ltcGxlTmFtZSkuc3RhcnRzV2l0aCgnXycpOwoKICBTb3VyY2VMb2NhdGlvbiBnZXQgbG9jYXRpb24gewogICAgcmV0dXJuIF9sb2NhdGlvbihfcmVmbGVjdGVlKTsKICB9CgogIExpc3Q8SW5zdGFuY2VNaXJyb3I+IGdldCBtZXRhZGF0YSB7CiAgICAvLyBHZXQgdGhlIG1ldGFkYXRhIG9iamVjdHMsIGNvbnZlcnQgdGhlbSBpbnRvIEluc3RhbmNlTWlycm9ycyB1c2luZwogICAgLy8gcmVmbGVjdCgpIGFuZCB0aGVuIG1ha2UgdGhlbSBpbnRvIGEgRGFydCBsaXN0LgogICAgcmV0dXJuIG5ldyBVbm1vZGlmaWFibGVMaXN0VmlldzxJbnN0YW5jZU1pcnJvcj4oCiAgICAgICAgX21ldGFkYXRhKF9yZWZsZWN0ZWUpLm1hcChyZWZsZWN0KSk7CiAgfQoKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICByZXR1cm4gdGhpcy5ydW50aW1lVHlwZSA9PSBvdGhlci5ydW50aW1lVHlwZSAmJgogICAgICAgIHRoaXMuX3JlZmxlY3RlZSA9PSBvdGhlci5fcmVmbGVjdGVlOwogIH0KCiAgaW50IGdldCBoYXNoQ29kZSA9PiBzaW1wbGVOYW1lLmhhc2hDb2RlOwp9CgpjbGFzcyBfTG9jYWxUeXBlVmFyaWFibGVNaXJyb3IgZXh0ZW5kcyBfTG9jYWxEZWNsYXJhdGlvbk1pcnJvcgogICAgaW1wbGVtZW50cyBUeXBlVmFyaWFibGVNaXJyb3IsIF9Mb2NhbFR5cGVNaXJyb3IgewogIF9Mb2NhbFR5cGVWYXJpYWJsZU1pcnJvcihyZWZsZWN0ZWUsIFN0cmluZyBzaW1wbGVOYW1lLCB0aGlzLl9vd25lcikKICAgICAgOiBzdXBlcihyZWZsZWN0ZWUsIF9zKHNpbXBsZU5hbWUpKTsKCiAgRGVjbGFyYXRpb25NaXJyb3IgX293bmVyOwogIERlY2xhcmF0aW9uTWlycm9yIGdldCBvd25lciB7CiAgICBpZiAoX293bmVyID09IG51bGwpIHsKICAgICAgX293bmVyID0gKF9UeXBlVmFyaWFibGVNaXJyb3Jfb3duZXIoX3JlZmxlY3RlZSkgYXMgVHlwZU1pcnJvcikKICAgICAgICAgIC5vcmlnaW5hbERlY2xhcmF0aW9uOwogICAgfQogICAgcmV0dXJuIF9vd25lcjsKICB9CgogIGJvb2wgZ2V0IGlzU3RhdGljID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzVG9wTGV2ZWwgPT4gZmFsc2U7CgogIFR5cGVNaXJyb3IgX3VwcGVyQm91bmQ7CiAgVHlwZU1pcnJvciBnZXQgdXBwZXJCb3VuZCB7CiAgICBpZiAoX3VwcGVyQm91bmQgPT0gbnVsbCkgewogICAgICBfdXBwZXJCb3VuZCA9IHJlZmxlY3RUeXBlKF9UeXBlVmFyaWFibGVNaXJyb3JfdXBwZXJfYm91bmQoX3JlZmxlY3RlZSkpOwogICAgfQogICAgcmV0dXJuIF91cHBlckJvdW5kOwogIH0KCiAgYm9vbCBnZXQgaGFzUmVmbGVjdGVkVHlwZSA9PiBmYWxzZTsKICBUeXBlIGdldCByZWZsZWN0ZWRUeXBlIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdUeXBlIHZhcmlhYmxlcyBoYXZlIG5vIHJlZmxlY3RlZCB0eXBlJyk7CiAgfQoKICBUeXBlIGdldCBfcmVmbGVjdGVkVHlwZSA9PiBfcmVmbGVjdGVlOwoKICBMaXN0PFR5cGVWYXJpYWJsZU1pcnJvcj4gZ2V0IHR5cGVWYXJpYWJsZXMgPT4gY29uc3QgPFR5cGVWYXJpYWJsZU1pcnJvcj5bXTsKICBMaXN0PFR5cGVNaXJyb3I+IGdldCB0eXBlQXJndW1lbnRzID0+IGNvbnN0IDxUeXBlTWlycm9yPltdOwoKICBib29sIGdldCBpc09yaWdpbmFsRGVjbGFyYXRpb24gPT4gdHJ1ZTsKICBUeXBlTWlycm9yIGdldCBvcmlnaW5hbERlY2xhcmF0aW9uID0+IHRoaXM7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJUeXBlVmFyaWFibGVNaXJyb3Igb24gJyR7X24oc2ltcGxlTmFtZSl9JyI7CgogIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICByZXR1cm4gb3RoZXIgaXMgVHlwZVZhcmlhYmxlTWlycm9yICYmCiAgICAgICAgc2ltcGxlTmFtZSA9PSBvdGhlci5zaW1wbGVOYW1lICYmCiAgICAgICAgb3duZXIgPT0gb3RoZXIub3duZXI7CiAgfQoKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHNpbXBsZU5hbWUuaGFzaENvZGU7CgogIGJvb2wgaXNTdWJ0eXBlT2YoVHlwZU1pcnJvciBvdGhlcikgewogICAgaWYgKG90aGVyID09IGN1cnJlbnRNaXJyb3JTeXN0ZW0oKS5keW5hbWljVHlwZSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgPT0gY3VycmVudE1pcnJvclN5c3RlbSgpLnZvaWRUeXBlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gX3N1YnR5cGVUZXN0KAogICAgICAgIF9yZWZsZWN0ZWRUeXBlLCAob3RoZXIgYXMgX0xvY2FsVHlwZU1pcnJvcikuX3JlZmxlY3RlZFR5cGUpOwogIH0KCiAgYm9vbCBpc0Fzc2lnbmFibGVUbyhUeXBlTWlycm9yIG90aGVyKSB7CiAgICBpZiAob3RoZXIgPT0gY3VycmVudE1pcnJvclN5c3RlbSgpLmR5bmFtaWNUeXBlKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciA9PSBjdXJyZW50TWlycm9yU3lzdGVtKCkudm9pZFR5cGUpIHJldHVybiBmYWxzZTsKICAgIGZpbmFsIG90aGVyUmVmbGVjdGVkVHlwZSA9IChvdGhlciBhcyBfTG9jYWxUeXBlTWlycm9yKS5fcmVmbGVjdGVkVHlwZTsKICAgIHJldHVybiBfc3VidHlwZVRlc3QoX3JlZmxlY3RlZFR5cGUsIG90aGVyUmVmbGVjdGVkVHlwZSkgfHwKICAgICAgICBfc3VidHlwZVRlc3Qob3RoZXJSZWZsZWN0ZWRUeXBlLCBfcmVmbGVjdGVkVHlwZSk7CiAgfQoKICBzdGF0aWMgRGVjbGFyYXRpb25NaXJyb3IgX1R5cGVWYXJpYWJsZU1pcnJvcl9vd25lcihyZWZsZWN0ZWUpCiAgICAgIG5hdGl2ZSAiVHlwZVZhcmlhYmxlTWlycm9yX293bmVyIjsKCiAgc3RhdGljIFR5cGUgX1R5cGVWYXJpYWJsZU1pcnJvcl91cHBlcl9ib3VuZChyZWZsZWN0ZWUpCiAgICAgIG5hdGl2ZSAiVHlwZVZhcmlhYmxlTWlycm9yX3VwcGVyX2JvdW5kIjsKfQoKY2xhc3MgX0xvY2FsVHlwZWRlZk1pcnJvciBleHRlbmRzIF9Mb2NhbERlY2xhcmF0aW9uTWlycm9yCiAgICBpbXBsZW1lbnRzIFR5cGVkZWZNaXJyb3IsIF9Mb2NhbFR5cGVNaXJyb3IgewogIGZpbmFsIFR5cGUgX3JlZmxlY3RlZFR5cGU7CiAgZmluYWwgYm9vbCBfaXNHZW5lcmljOwogIGZpbmFsIGJvb2wgX2lzR2VuZXJpY0RlY2xhcmF0aW9uOwoKICBfTG9jYWxUeXBlZGVmTWlycm9yKHJlZmxlY3RlZSwgdGhpcy5fcmVmbGVjdGVkVHlwZSwgU3RyaW5nIHNpbXBsZU5hbWUsCiAgICAgIHRoaXMuX2lzR2VuZXJpYywgdGhpcy5faXNHZW5lcmljRGVjbGFyYXRpb24sIHRoaXMuX293bmVyKQogICAgICA6IHN1cGVyKHJlZmxlY3RlZSwgX3Moc2ltcGxlTmFtZSkpOwoKICBib29sIGdldCBpc1RvcExldmVsID0+IHRydWU7CgogIERlY2xhcmF0aW9uTWlycm9yIF9vd25lcjsKICBEZWNsYXJhdGlvbk1pcnJvciBnZXQgb3duZXIgewogICAgaWYgKF9vd25lciA9PSBudWxsKSB7CiAgICAgIHZhciB1cmkgPSBfTG9jYWxDbGFzc01pcnJvci5fbGlicmFyeVVyaShfcmVmbGVjdGVlKTsKICAgICAgX293bmVyID0gY3VycmVudE1pcnJvclN5c3RlbSgpLmxpYnJhcmllc1tVcmkucGFyc2UodXJpKV07CiAgICB9CiAgICByZXR1cm4gX293bmVyOwogIH0KCiAgX0xvY2FsRnVuY3Rpb25UeXBlTWlycm9yIF9yZWZlcmVudDsKICBGdW5jdGlvblR5cGVNaXJyb3IgZ2V0IHJlZmVyZW50IHsKICAgIGlmIChfcmVmZXJlbnQgPT0gbnVsbCkgewogICAgICBfcmVmZXJlbnQgPSBfbmF0aXZlUmVmZXJlbnQoX3JlZmxlY3RlZFR5cGUpOwogICAgICBfcmVmZXJlbnQuX2luc3RhbnRpYXRvciA9IF9yZWZsZWN0ZWRUeXBlOwogICAgfQogICAgcmV0dXJuIF9yZWZlcmVudDsKICB9CgogIGJvb2wgZ2V0IGhhc1JlZmxlY3RlZFR5cGUgPT4gIV9pc0dlbmVyaWNEZWNsYXJhdGlvbjsKICBUeXBlIGdldCByZWZsZWN0ZWRUeXBlIHsKICAgIGlmICghaGFzUmVmbGVjdGVkVHlwZSkgewogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICJEZWNsYXJhdGlvbnMgb2YgZ2VuZXJpY3MgaGF2ZSBubyByZWZsZWN0ZWQgdHlwZSIpOwogICAgfQogICAgcmV0dXJuIF9yZWZsZWN0ZWRUeXBlOwogIH0KCiAgYm9vbCBnZXQgaXNPcmlnaW5hbERlY2xhcmF0aW9uID0+ICFfaXNHZW5lcmljIHx8IF9pc0dlbmVyaWNEZWNsYXJhdGlvbjsKCiAgVHlwZWRlZk1pcnJvciBnZXQgb3JpZ2luYWxEZWNsYXJhdGlvbiB7CiAgICBpZiAoaXNPcmlnaW5hbERlY2xhcmF0aW9uKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9uYXRpdmVEZWNsYXJhdGlvbihfcmVmbGVjdGVkVHlwZSk7CiAgICB9CiAgfQoKICBMaXN0PFR5cGVWYXJpYWJsZU1pcnJvcj4gX3R5cGVWYXJpYWJsZXM7CiAgTGlzdDxUeXBlVmFyaWFibGVNaXJyb3I+IGdldCB0eXBlVmFyaWFibGVzIHsKICAgIGlmIChfdHlwZVZhcmlhYmxlcyA9PSBudWxsKSB7CiAgICAgIF90eXBlVmFyaWFibGVzID0gbmV3IExpc3Q8VHlwZVZhcmlhYmxlTWlycm9yPigpOwogICAgICBMaXN0IHBhcmFtcyA9IF9Mb2NhbENsYXNzTWlycm9yLl9DbGFzc01pcnJvcl90eXBlX3ZhcmlhYmxlcyhfcmVmbGVjdGVlKTsKICAgICAgVHlwZWRlZk1pcnJvciBvd25lciA9IG9yaWdpbmFsRGVjbGFyYXRpb247CiAgICAgIHZhciBtaXJyb3I7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgbWlycm9yID0gbmV3IF9Mb2NhbFR5cGVWYXJpYWJsZU1pcnJvcihwYXJhbXNbaSArIDFdLCBwYXJhbXNbaV0sIG93bmVyKTsKICAgICAgICBfdHlwZVZhcmlhYmxlcy5hZGQobWlycm9yKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIF90eXBlVmFyaWFibGVzOwogIH0KCiAgTGlzdDxUeXBlTWlycm9yPiBfdHlwZUFyZ3VtZW50czsKICBMaXN0PFR5cGVNaXJyb3I+IGdldCB0eXBlQXJndW1lbnRzIHsKICAgIGlmIChfdHlwZUFyZ3VtZW50cyA9PSBudWxsKSB7CiAgICAgIGlmIChfaXNHZW5lcmljRGVjbGFyYXRpb24pIHsKICAgICAgICBfdHlwZUFyZ3VtZW50cyA9IGNvbnN0IDxUeXBlTWlycm9yPltdOwogICAgICB9IGVsc2UgewogICAgICAgIF90eXBlQXJndW1lbnRzID0gbmV3IFVubW9kaWZpYWJsZUxpc3RWaWV3PFR5cGVNaXJyb3I+KF9Mb2NhbENsYXNzTWlycm9yCiAgICAgICAgICAgIC5fY29tcHV0ZVR5cGVBcmd1bWVudHMoX3JlZmxlY3RlZFR5cGUpCiAgICAgICAgICAgIC5jYXN0PFR5cGVNaXJyb3I+KCkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gX3R5cGVBcmd1bWVudHM7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiVHlwZWRlZk1pcnJvciBvbiAnJHtfbihzaW1wbGVOYW1lKX0nIjsKCiAgYm9vbCBpc1N1YnR5cGVPZihUeXBlTWlycm9yIG90aGVyKSB7CiAgICBpZiAob3RoZXIgPT0gY3VycmVudE1pcnJvclN5c3RlbSgpLmR5bmFtaWNUeXBlKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciA9PSBjdXJyZW50TWlycm9yU3lzdGVtKCkudm9pZFR5cGUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBfc3VidHlwZVRlc3QoCiAgICAgICAgX3JlZmxlY3RlZFR5cGUsIChvdGhlciBhcyBfTG9jYWxUeXBlTWlycm9yKS5fcmVmbGVjdGVkVHlwZSk7CiAgfQoKICBib29sIGlzQXNzaWduYWJsZVRvKFR5cGVNaXJyb3Igb3RoZXIpIHsKICAgIGlmIChvdGhlciA9PSBjdXJyZW50TWlycm9yU3lzdGVtKCkuZHluYW1pY1R5cGUpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyID09IGN1cnJlbnRNaXJyb3JTeXN0ZW0oKS52b2lkVHlwZSkgcmV0dXJuIGZhbHNlOwogICAgZmluYWwgb3RoZXJSZWZsZWN0ZWRUeXBlID0gKG90aGVyIGFzIF9Mb2NhbFR5cGVNaXJyb3IpLl9yZWZsZWN0ZWRUeXBlOwogICAgcmV0dXJuIF9zdWJ0eXBlVGVzdChfcmVmbGVjdGVkVHlwZSwgb3RoZXJSZWZsZWN0ZWRUeXBlKSB8fAogICAgICAgIF9zdWJ0eXBlVGVzdChvdGhlclJlZmxlY3RlZFR5cGUsIF9yZWZsZWN0ZWRUeXBlKTsKICB9CgogIHN0YXRpYyBGdW5jdGlvblR5cGVNaXJyb3IgX25hdGl2ZVJlZmVyZW50KHJlZmxlY3RlZFR5cGUpCiAgICAgIG5hdGl2ZSAiVHlwZWRlZk1pcnJvcl9yZWZlcmVudCI7CgogIHN0YXRpYyBUeXBlZGVmTWlycm9yIF9uYXRpdmVEZWNsYXJhdGlvbihyZWZsZWN0ZWRUeXBlKQogICAgICBuYXRpdmUgIlR5cGVkZWZNaXJyb3JfZGVjbGFyYXRpb24iOwp9CgpTeW1ib2wgX2FzU2V0dGVyKFN5bWJvbCBnZXR0ZXIsIExpYnJhcnlNaXJyb3IgbGlicmFyeSkgewogIHZhciB1bndyYXBwZWQgPSBNaXJyb3JTeXN0ZW0uZ2V0TmFtZShnZXR0ZXIpOwogIHJldHVybiBNaXJyb3JTeXN0ZW0uZ2V0U3ltYm9sKCcke3Vud3JhcHBlZH09JywgbGlicmFyeSk7Cn0KCmNsYXNzIF9Mb2NhbExpYnJhcnlNaXJyb3IgZXh0ZW5kcyBfTG9jYWxPYmplY3RNaXJyb3IgaW1wbGVtZW50cyBMaWJyYXJ5TWlycm9yIHsKICBmaW5hbCBTeW1ib2wgc2ltcGxlTmFtZTsKICBmaW5hbCBVcmkgdXJpOwoKICBfTG9jYWxMaWJyYXJ5TWlycm9yKHJlZmxlY3RlZSwgU3RyaW5nIHNpbXBsZU5hbWUsIFN0cmluZyB1cmwpCiAgICAgIDogdGhpcy5zaW1wbGVOYW1lID0gX3Moc2ltcGxlTmFtZSksCiAgICAgICAgdGhpcy51cmkgPSBVcmkucGFyc2UodXJsKSwKICAgICAgICBzdXBlcihyZWZsZWN0ZWUpOwoKICAvLyBUaGUgc2ltcGxlIG5hbWUgYW5kIHRoZSBxdWFsaWZpZWQgbmFtZSBhcmUgdGhlIHNhbWUgZm9yIGEgbGlicmFyeS4KICBTeW1ib2wgZ2V0IHF1YWxpZmllZE5hbWUgPT4gc2ltcGxlTmFtZTsKCiAgRGVjbGFyYXRpb25NaXJyb3IgZ2V0IG93bmVyID0+IG51bGw7CgogIGJvb2wgZ2V0IGlzUHJpdmF0ZSA9PiBmYWxzZTsKICBib29sIGdldCBpc1RvcExldmVsID0+IGZhbHNlOwoKICBUeXBlIGdldCBfaW5zdGFudGlhdG9yID0+IG51bGw7CgogIE1hcDxTeW1ib2wsIERlY2xhcmF0aW9uTWlycm9yPiBfZGVjbGFyYXRpb25zOwogIE1hcDxTeW1ib2wsIERlY2xhcmF0aW9uTWlycm9yPiBnZXQgZGVjbGFyYXRpb25zIHsKICAgIGlmIChfZGVjbGFyYXRpb25zICE9IG51bGwpIHJldHVybiBfZGVjbGFyYXRpb25zOwoKICAgIHZhciBkZWNscyA9IG5ldyBNYXA8U3ltYm9sLCBEZWNsYXJhdGlvbk1pcnJvcj4oKTsKICAgIHZhciBtZW1iZXJzID0gX2NvbXB1dGVNZW1iZXJzKF9yZWZsZWN0ZWUpOwogICAgZm9yICh2YXIgbWVtYmVyIGluIG1lbWJlcnMpIHsKICAgICAgZGVjbHNbbWVtYmVyLnNpbXBsZU5hbWVdID0gbWVtYmVyOwogICAgfQoKICAgIHJldHVybiBfZGVjbGFyYXRpb25zID0KICAgICAgICBuZXcgVW5tb2RpZmlhYmxlTWFwVmlldzxTeW1ib2wsIERlY2xhcmF0aW9uTWlycm9yPihkZWNscyk7CiAgfQoKICBTb3VyY2VMb2NhdGlvbiBnZXQgbG9jYXRpb24gewogICAgcmV0dXJuIF9sb2NhdGlvbihfcmVmbGVjdGVlKTsKICB9CgogIExpc3Q8SW5zdGFuY2VNaXJyb3I+IGdldCBtZXRhZGF0YSB7CiAgICAvLyBHZXQgdGhlIG1ldGFkYXRhIG9iamVjdHMsIGNvbnZlcnQgdGhlbSBpbnRvIEluc3RhbmNlTWlycm9ycyB1c2luZwogICAgLy8gcmVmbGVjdCgpIGFuZCB0aGVuIG1ha2UgdGhlbSBpbnRvIGEgRGFydCBsaXN0LgogICAgcmV0dXJuIG5ldyBVbm1vZGlmaWFibGVMaXN0VmlldzxJbnN0YW5jZU1pcnJvcj4oCiAgICAgICAgX21ldGFkYXRhKF9yZWZsZWN0ZWUpLm1hcChyZWZsZWN0KSk7CiAgfQoKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICByZXR1cm4gdGhpcy5ydW50aW1lVHlwZSA9PSBvdGhlci5ydW50aW1lVHlwZSAmJgogICAgICAgIHRoaXMuX3JlZmxlY3RlZSA9PSBvdGhlci5fcmVmbGVjdGVlOwogIH0KCiAgaW50IGdldCBoYXNoQ29kZSA9PiBzaW1wbGVOYW1lLmhhc2hDb2RlOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiTGlicmFyeU1pcnJvciBvbiAnJHtfbihzaW1wbGVOYW1lKX0nIjsKCiAgdmFyIF9jYWNoZWRMaWJyYXJ5RGVwZW5kZW5jaWVzOwogIGdldCBsaWJyYXJ5RGVwZW5kZW5jaWVzIHsKICAgIGlmIChfY2FjaGVkTGlicmFyeURlcGVuZGVuY2llcyA9PSBudWxsKSB7CiAgICAgIF9jYWNoZWRMaWJyYXJ5RGVwZW5kZW5jaWVzID0KICAgICAgICAgIG5ldyBVbm1vZGlmaWFibGVMaXN0VmlldzxMaWJyYXJ5RGVwZW5kZW5jeU1pcnJvcj4oCiAgICAgICAgICAgICAgX2xpYnJhcnlEZXBlbmRlbmNpZXMoX3JlZmxlY3RlZSkuY2FzdDxMaWJyYXJ5RGVwZW5kZW5jeU1pcnJvcj4oKSk7CiAgICB9CiAgICByZXR1cm4gX2NhY2hlZExpYnJhcnlEZXBlbmRlbmNpZXM7CiAgfQoKICBMaXN0PGR5bmFtaWM+IF9saWJyYXJ5RGVwZW5kZW5jaWVzKHJlZmxlY3RlZSkKICAgICAgbmF0aXZlICdMaWJyYXJ5TWlycm9yX2xpYnJhcnlEZXBlbmRlbmNpZXMnOwoKICBfaW52b2tlKHJlZmxlY3RlZSwgbWVtYmVyTmFtZSwgYXJndW1lbnRzLCBhcmd1bWVudE5hbWVzKQogICAgICBuYXRpdmUgJ0xpYnJhcnlNaXJyb3JfaW52b2tlJzsKCiAgX2ludm9rZUdldHRlcihyZWZsZWN0ZWUsIGdldHRlck5hbWUpIG5hdGl2ZSAnTGlicmFyeU1pcnJvcl9pbnZva2VHZXR0ZXInOwoKICBfaW52b2tlU2V0dGVyKHJlZmxlY3RlZSwgc2V0dGVyTmFtZSwgdmFsdWUpCiAgICAgIG5hdGl2ZSAnTGlicmFyeU1pcnJvcl9pbnZva2VTZXR0ZXInOwoKICBMaXN0PGR5bmFtaWM+IF9jb21wdXRlTWVtYmVycyhyZWZsZWN0ZWUpIG5hdGl2ZSAiTGlicmFyeU1pcnJvcl9tZW1iZXJzIjsKfQoKY2xhc3MgX0xvY2FsTGlicmFyeURlcGVuZGVuY3lNaXJyb3IgZXh0ZW5kcyBfTG9jYWxNaXJyb3IKICAgIGltcGxlbWVudHMgTGlicmFyeURlcGVuZGVuY3lNaXJyb3IgewogIGZpbmFsIExpYnJhcnlNaXJyb3Igc291cmNlTGlicmFyeTsKICB2YXIgX3RhcmdldE1pcnJvck9yUHJlZml4OwogIGZpbmFsIExpc3Q8Q29tYmluYXRvck1pcnJvcj4gY29tYmluYXRvcnM7CiAgZmluYWwgU3ltYm9sIHByZWZpeDsKICBmaW5hbCBib29sIGlzSW1wb3J0OwogIGZpbmFsIGJvb2wgaXNEZWZlcnJlZDsKICBmaW5hbCBMaXN0PEluc3RhbmNlTWlycm9yPiBtZXRhZGF0YTsKCiAgX0xvY2FsTGlicmFyeURlcGVuZGVuY3lNaXJyb3IoCiAgICAgIHRoaXMuc291cmNlTGlicmFyeSwKICAgICAgdGhpcy5fdGFyZ2V0TWlycm9yT3JQcmVmaXgsCiAgICAgIExpc3Q8ZHluYW1pYz4gbXV0YWJsZUNvbWJpbmF0b3JzLAogICAgICBwcmVmaXhTdHJpbmcsCiAgICAgIHRoaXMuaXNJbXBvcnQsCiAgICAgIHRoaXMuaXNEZWZlcnJlZCwKICAgICAgTGlzdDxkeW5hbWljPiB1bndyYXBwZWRNZXRhZGF0YSkKICAgICAgOiBwcmVmaXggPSBfcyhwcmVmaXhTdHJpbmcpLAogICAgICAgIGNvbWJpbmF0b3JzID0gbmV3IFVubW9kaWZpYWJsZUxpc3RWaWV3PENvbWJpbmF0b3JNaXJyb3I+KAogICAgICAgICAgICBtdXRhYmxlQ29tYmluYXRvcnMuY2FzdDxDb21iaW5hdG9yTWlycm9yPigpKSwKICAgICAgICBtZXRhZGF0YSA9IG5ldyBVbm1vZGlmaWFibGVMaXN0VmlldzxJbnN0YW5jZU1pcnJvcj4oCiAgICAgICAgICAgIHVud3JhcHBlZE1ldGFkYXRhLm1hcChyZWZsZWN0KSk7CgogIGJvb2wgZ2V0IGlzRXhwb3J0ID0+ICFpc0ltcG9ydDsKCiAgTGlicmFyeU1pcnJvciBnZXQgdGFyZ2V0TGlicmFyeSB7CiAgICBpZiAoX3RhcmdldE1pcnJvck9yUHJlZml4IGlzIF9Mb2NhbExpYnJhcnlNaXJyb3IpIHsKICAgICAgcmV0dXJuIF90YXJnZXRNaXJyb3JPclByZWZpeDsKICAgIH0KICAgIHZhciBtaXJyb3JPck51bGwgPSBfdHJ5VXBncmFkZVByZWZpeChfdGFyZ2V0TWlycm9yT3JQcmVmaXgpOwogICAgaWYgKG1pcnJvck9yTnVsbCAhPSBudWxsKSB7CiAgICAgIF90YXJnZXRNaXJyb3JPclByZWZpeCA9IG1pcnJvck9yTnVsbDsKICAgIH0KICAgIHJldHVybiBtaXJyb3JPck51bGw7CiAgfQoKICBGdXR1cmU8TGlicmFyeU1pcnJvcj4gbG9hZExpYnJhcnkoKSB7CiAgICBpZiAoX3RhcmdldE1pcnJvck9yUHJlZml4IGlzIF9Mb2NhbExpYnJhcnlNaXJyb3IpIHsKICAgICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUoX3RhcmdldE1pcnJvck9yUHJlZml4KTsKICAgIH0KICAgIHZhciBzYXZlZFByZWZpeCA9IF90YXJnZXRNaXJyb3JPclByZWZpeDsKICAgIHJldHVybiBzYXZlZFByZWZpeC5sb2FkTGlicmFyeSgpLnRoZW4oKF8pIHsKICAgICAgcmV0dXJuIF90cnlVcGdyYWRlUHJlZml4KHNhdmVkUHJlZml4KTsKICAgIH0pOwogIH0KCiAgc3RhdGljIExpYnJhcnlNaXJyb3IgX3RyeVVwZ3JhZGVQcmVmaXgobGlicmFyeVByZWZpeCkKICAgICAgbmF0aXZlICJMaWJyYXJ5TWlycm9yX2Zyb21QcmVmaXgiOwoKICBTb3VyY2VMb2NhdGlvbiBnZXQgbG9jYXRpb24gPT4gbnVsbDsKfQoKY2xhc3MgX0xvY2FsQ29tYmluYXRvck1pcnJvciBleHRlbmRzIF9Mb2NhbE1pcnJvciBpbXBsZW1lbnRzIENvbWJpbmF0b3JNaXJyb3IgewogIGZpbmFsIExpc3Q8U3ltYm9sPiBpZGVudGlmaWVyczsKICBmaW5hbCBib29sIGlzU2hvdzsKCiAgX0xvY2FsQ29tYmluYXRvck1pcnJvcihpZGVudGlmaWVyU3RyaW5nLCB0aGlzLmlzU2hvdykKICAgICAgOiB0aGlzLmlkZW50aWZpZXJzID0KICAgICAgICAgICAgbmV3IFVubW9kaWZpYWJsZUxpc3RWaWV3PFN5bWJvbD4oPFN5bWJvbD5bX3MoaWRlbnRpZmllclN0cmluZyldKTsKCiAgYm9vbCBnZXQgaXNIaWRlID0+ICFpc1Nob3c7Cn0KCmNsYXNzIF9Mb2NhbE1ldGhvZE1pcnJvciBleHRlbmRzIF9Mb2NhbERlY2xhcmF0aW9uTWlycm9yCiAgICBpbXBsZW1lbnRzIE1ldGhvZE1pcnJvciB7CiAgZmluYWwgVHlwZSBfaW5zdGFudGlhdG9yOwogIGZpbmFsIGJvb2wgaXNTdGF0aWM7CiAgZmluYWwgaW50IF9raW5kRmxhZ3M7CgogIF9Mb2NhbE1ldGhvZE1pcnJvcihyZWZsZWN0ZWUsIFN0cmluZyBzaW1wbGVOYW1lLCB0aGlzLl9vd25lciwKICAgICAgdGhpcy5faW5zdGFudGlhdG9yLCB0aGlzLmlzU3RhdGljLCB0aGlzLl9raW5kRmxhZ3MpCiAgICAgIDogc3VwZXIocmVmbGVjdGVlLCBfcyhzaW1wbGVOYW1lKSk7CgogIHN0YXRpYyBjb25zdCBrQWJzdHJhY3QgPSAwOwogIHN0YXRpYyBjb25zdCBrR2V0dGVyID0gMTsKICBzdGF0aWMgY29uc3Qga1NldHRlciA9IDI7CiAgc3RhdGljIGNvbnN0IGtDb25zdHJ1Y3RvciA9IDM7CiAgc3RhdGljIGNvbnN0IGtDb25zdEN0b3IgPSA0OwogIHN0YXRpYyBjb25zdCBrR2VuZXJhdGl2ZUN0b3IgPSA1OwogIHN0YXRpYyBjb25zdCBrUmVkaXJlY3RpbmdDdG9yID0gNjsKICBzdGF0aWMgY29uc3Qga0ZhY3RvcnlDdG9yID0gNzsKICBzdGF0aWMgY29uc3Qga0V4dGVybmFsID0gODsKICBzdGF0aWMgY29uc3Qga1N5bnRoZXRpYyA9IDk7CgogIC8vIFRoZXNlIG9mZnNldHMgbXVjaCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aG9zZSBpbiBtaXJyb3JzLmguCiAgYm9vbCBnZXQgaXNBYnN0cmFjdCA9PiAwICE9IChfa2luZEZsYWdzICYgKDEgPDwga0Fic3RyYWN0KSk7CiAgYm9vbCBnZXQgaXNHZXR0ZXIgPT4gMCAhPSAoX2tpbmRGbGFncyAmICgxIDw8IGtHZXR0ZXIpKTsKICBib29sIGdldCBpc1NldHRlciA9PiAwICE9IChfa2luZEZsYWdzICYgKDEgPDwga1NldHRlcikpOwogIGJvb2wgZ2V0IGlzQ29uc3RydWN0b3IgPT4gMCAhPSAoX2tpbmRGbGFncyAmICgxIDw8IGtDb25zdHJ1Y3RvcikpOwogIGJvb2wgZ2V0IGlzQ29uc3RDb25zdHJ1Y3RvciA9PiAwICE9IChfa2luZEZsYWdzICYgKDEgPDwga0NvbnN0Q3RvcikpOwogIGJvb2wgZ2V0IGlzR2VuZXJhdGl2ZUNvbnN0cnVjdG9yID0+CiAgICAgIDAgIT0gKF9raW5kRmxhZ3MgJiAoMSA8PCBrR2VuZXJhdGl2ZUN0b3IpKTsKICBib29sIGdldCBpc1JlZGlyZWN0aW5nQ29uc3RydWN0b3IgPT4KICAgICAgMCAhPSAoX2tpbmRGbGFncyAmICgxIDw8IGtSZWRpcmVjdGluZ0N0b3IpKTsKICBib29sIGdldCBpc0ZhY3RvcnlDb25zdHJ1Y3RvciA9PiAwICE9IChfa2luZEZsYWdzICYgKDEgPDwga0ZhY3RvcnlDdG9yKSk7CiAgYm9vbCBnZXQgaXNFeHRlcm5hbCA9PiAwICE9IChfa2luZEZsYWdzICYgKDEgPDwga0V4dGVybmFsKSk7CiAgYm9vbCBnZXQgaXNTeW50aGV0aWMgPT4gMCAhPSAoX2tpbmRGbGFncyAmICgxIDw8IGtTeW50aGV0aWMpKTsKCiAgc3RhdGljIGNvbnN0IF9vcGVyYXRvcnMgPSBjb25zdCBbCiAgICAiJSIsICImIiwgIioiLCAiKyIsICItIiwgIi8iLCAiPCIsICI8PCIsIC8vCiAgICAiPD0iLCAiPT0iLCAiPiIsICI+PSIsICI+PiIsICJbXSIsICJbXT0iLAogICAgIl4iLCAifCIsICJ+IiwgInVuYXJ5LSIsICJ+LyIsCiAgXTsKICBib29sIGdldCBpc09wZXJhdG9yID0+IF9vcGVyYXRvcnMuY29udGFpbnMoX24oc2ltcGxlTmFtZSkpOwoKICBEZWNsYXJhdGlvbk1pcnJvciBfb3duZXI7CiAgRGVjbGFyYXRpb25NaXJyb3IgZ2V0IG93bmVyIHsKICAgIC8vIEZvciBuZXN0ZWQgY2xvc3VyZXMgaXQgaXMgcG9zc2libGUsIHRoYXQgdGhlIG1pcnJvciBmb3IgdGhlIG93bmVyIGhhcyBub3QKICAgIC8vIGJlZW4gY3JlYXRlZCB5ZXQuCiAgICBpZiAoX293bmVyID09IG51bGwpIHsKICAgICAgX293bmVyID0gX01ldGhvZE1pcnJvcl9vd25lcihfcmVmbGVjdGVlLCBfaW5zdGFudGlhdG9yKTsKICAgIH0KICAgIHJldHVybiBfb3duZXI7CiAgfQoKICBib29sIGdldCBpc1ByaXZhdGUgPT4KICAgICAgX24oc2ltcGxlTmFtZSkuc3RhcnRzV2l0aCgnXycpIHx8IF9uKGNvbnN0cnVjdG9yTmFtZSkuc3RhcnRzV2l0aCgnXycpOwoKICBib29sIGdldCBpc1RvcExldmVsID0+IG93bmVyIGlzIExpYnJhcnlNaXJyb3I7CgogIFR5cGVNaXJyb3IgX3JldHVyblR5cGU7CiAgVHlwZU1pcnJvciBnZXQgcmV0dXJuVHlwZSB7CiAgICBpZiAoX3JldHVyblR5cGUgPT0gbnVsbCkgewogICAgICBpZiAoaXNDb25zdHJ1Y3RvcikgewogICAgICAgIF9yZXR1cm5UeXBlID0gb3duZXI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX3JldHVyblR5cGUgPQogICAgICAgICAgICByZWZsZWN0VHlwZShfTWV0aG9kTWlycm9yX3JldHVybl90eXBlKF9yZWZsZWN0ZWUsIF9pbnN0YW50aWF0b3IpKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIF9yZXR1cm5UeXBlOwogIH0KCiAgTGlzdDxQYXJhbWV0ZXJNaXJyb3I+IF9wYXJhbWV0ZXJzOwogIExpc3Q8UGFyYW1ldGVyTWlycm9yPiBnZXQgcGFyYW1ldGVycyB7CiAgICBpZiAoX3BhcmFtZXRlcnMgPT0gbnVsbCkgewogICAgICBfcGFyYW1ldGVycyA9IG5ldyBVbm1vZGlmaWFibGVMaXN0VmlldzxQYXJhbWV0ZXJNaXJyb3I+KAogICAgICAgICAgX01ldGhvZE1pcnJvcl9wYXJhbWV0ZXJzKF9yZWZsZWN0ZWUpLmNhc3Q8UGFyYW1ldGVyTWlycm9yPigpKTsKICAgIH0KICAgIHJldHVybiBfcGFyYW1ldGVyczsKICB9CgogIGJvb2wgZ2V0IGlzUmVndWxhck1ldGhvZCA9PiAhaXNHZXR0ZXIgJiYgIWlzU2V0dGVyICYmICFpc0NvbnN0cnVjdG9yOwoKICBTeW1ib2wgX2NvbnN0cnVjdG9yTmFtZTsKICBTeW1ib2wgZ2V0IGNvbnN0cnVjdG9yTmFtZSB7CiAgICBpZiAoX2NvbnN0cnVjdG9yTmFtZSA9PSBudWxsKSB7CiAgICAgIGlmICghaXNDb25zdHJ1Y3RvcikgewogICAgICAgIF9jb25zdHJ1Y3Rvck5hbWUgPSBfcygnJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHBhcnRzID0gTWlycm9yU3lzdGVtLmdldE5hbWUoc2ltcGxlTmFtZSkuc3BsaXQoJy4nKTsKICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMikgewogICAgICAgICAgdGhyb3cgbmV3IF9JbnRlcm5hbE1pcnJvckVycm9yKAogICAgICAgICAgICAgICdJbnRlcm5hbCBlcnJvciBpbiBNZXRob2RNaXJyb3IuY29uc3RydWN0b3JOYW1lOiAnCiAgICAgICAgICAgICAgJ21hbGZvcm1lZCBuYW1lIDwkc2ltcGxlTmFtZT4nKTsKICAgICAgICB9IGVsc2UgaWYgKHBhcnRzLmxlbmd0aCA9PSAyKSB7CiAgICAgICAgICBMaWJyYXJ5TWlycm9yIGRlZmluaW5nTGlicmFyeSA9IG93bmVyLm93bmVyOwogICAgICAgICAgX2NvbnN0cnVjdG9yTmFtZSA9IE1pcnJvclN5c3RlbS5nZXRTeW1ib2wocGFydHNbMV0sIGRlZmluaW5nTGlicmFyeSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIF9jb25zdHJ1Y3Rvck5hbWUgPSBfcygnJyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gX2NvbnN0cnVjdG9yTmFtZTsKICB9CgogIFN0cmluZyBnZXQgc291cmNlID0+IF9NZXRob2RNaXJyb3Jfc291cmNlKF9yZWZsZWN0ZWUpOwoKICB2b2lkIF9wYXRjaENvbnN0cnVjdG9yTmFtZShvd25lck5hbWUpIHsKICAgIHZhciBjbiA9IF9uKGNvbnN0cnVjdG9yTmFtZSk7CiAgICBpZiAoY24gPT0gJycpIHsKICAgICAgX3NpbXBsZU5hbWUgPSBfcyhvd25lck5hbWUpOwogICAgfSBlbHNlIHsKICAgICAgX3NpbXBsZU5hbWUgPSBfcyhvd25lck5hbWUgKyAiLiIgKyBjbik7CiAgICB9CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiTWV0aG9kTWlycm9yIG9uICcke01pcnJvclN5c3RlbS5nZXROYW1lKHNpbXBsZU5hbWUpfSciOwoKICBzdGF0aWMgZHluYW1pYyBfTWV0aG9kTWlycm9yX293bmVyKHJlZmxlY3RlZSwgaW5zdGFudGlhdG9yKQogICAgICBuYXRpdmUgIk1ldGhvZE1pcnJvcl9vd25lciI7CgogIHN0YXRpYyBkeW5hbWljIF9NZXRob2RNaXJyb3JfcmV0dXJuX3R5cGUocmVmbGVjdGVlLCBpbnN0YW50aWF0b3IpCiAgICAgIG5hdGl2ZSAiTWV0aG9kTWlycm9yX3JldHVybl90eXBlIjsKCiAgTGlzdDxkeW5hbWljPiBfTWV0aG9kTWlycm9yX3BhcmFtZXRlcnMocmVmbGVjdGVlKQogICAgICBuYXRpdmUgIk1ldGhvZE1pcnJvcl9wYXJhbWV0ZXJzIjsKCiAgc3RhdGljIFN0cmluZyBfTWV0aG9kTWlycm9yX3NvdXJjZShyZWZsZWN0ZWUpIG5hdGl2ZSAiTWV0aG9kTWlycm9yX3NvdXJjZSI7Cn0KCmNsYXNzIF9Mb2NhbFZhcmlhYmxlTWlycm9yIGV4dGVuZHMgX0xvY2FsRGVjbGFyYXRpb25NaXJyb3IKICAgIGltcGxlbWVudHMgVmFyaWFibGVNaXJyb3IgewogIGZpbmFsIERlY2xhcmF0aW9uTWlycm9yIG93bmVyOwogIGZpbmFsIGJvb2wgaXNTdGF0aWM7CiAgZmluYWwgYm9vbCBpc0ZpbmFsOwogIGZpbmFsIGJvb2wgaXNDb25zdDsKCiAgX0xvY2FsVmFyaWFibGVNaXJyb3IocmVmbGVjdGVlLCBTdHJpbmcgc2ltcGxlTmFtZSwgdGhpcy5vd25lciwgdGhpcy5fdHlwZSwKICAgICAgdGhpcy5pc1N0YXRpYywgdGhpcy5pc0ZpbmFsLCB0aGlzLmlzQ29uc3QpCiAgICAgIDogc3VwZXIocmVmbGVjdGVlLCBfcyhzaW1wbGVOYW1lKSk7CgogIGJvb2wgZ2V0IGlzVG9wTGV2ZWwgPT4gb3duZXIgaXMgTGlicmFyeU1pcnJvcjsKCiAgVHlwZSBnZXQgX2luc3RhbnRpYXRvciB7CiAgICBmaW5hbCBvID0gb3duZXI7IC8vIE5vdGU6IG5lZWQgbG9jYWwgdmFyaWFibGUgZm9yIHByb21vdGlvbiB0byBoYXBwZW4uCiAgICBpZiAobyBpcyBfTG9jYWxDbGFzc01pcnJvcikgewogICAgICByZXR1cm4gby5faW5zdGFudGlhdG9yOwogICAgfSBlbHNlIGlmIChvIGlzIF9Mb2NhbE1ldGhvZE1pcnJvcikgewogICAgICByZXR1cm4gby5faW5zdGFudGlhdG9yOwogICAgfSBlbHNlIGlmIChvIGlzIF9Mb2NhbExpYnJhcnlNaXJyb3IpIHsKICAgICAgcmV0dXJuIG8uX2luc3RhbnRpYXRvcjsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJ1bmV4cGVjdGVkIG93bmVyICR7b3duZXJ9Iik7CiAgICB9CiAgfQoKICBUeXBlTWlycm9yIF90eXBlOwogIFR5cGVNaXJyb3IgZ2V0IHR5cGUgewogICAgaWYgKF90eXBlID09IG51bGwpIHsKICAgICAgX3R5cGUgPSByZWZsZWN0VHlwZShfVmFyaWFibGVNaXJyb3JfdHlwZShfcmVmbGVjdGVlLCBfaW5zdGFudGlhdG9yKSk7CiAgICB9CiAgICByZXR1cm4gX3R5cGU7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PgogICAgICAiVmFyaWFibGVNaXJyb3Igb24gJyR7TWlycm9yU3lzdGVtLmdldE5hbWUoc2ltcGxlTmFtZSl9JyI7CgogIHN0YXRpYyBfVmFyaWFibGVNaXJyb3JfdHlwZShyZWZsZWN0ZWUsIGluc3RhbnRpYXRvcikKICAgICAgbmF0aXZlICJWYXJpYWJsZU1pcnJvcl90eXBlIjsKfQoKY2xhc3MgX0xvY2FsUGFyYW1ldGVyTWlycm9yIGV4dGVuZHMgX0xvY2FsVmFyaWFibGVNaXJyb3IKICAgIGltcGxlbWVudHMgUGFyYW1ldGVyTWlycm9yIHsKICBmaW5hbCBpbnQgX3Bvc2l0aW9uOwogIGZpbmFsIGJvb2wgaXNPcHRpb25hbDsKICBmaW5hbCBib29sIGlzTmFtZWQ7CiAgZmluYWwgTGlzdCBfdW5taXJyb3JlZE1ldGFkYXRhOwoKICBfTG9jYWxQYXJhbWV0ZXJNaXJyb3IoCiAgICAgIHJlZmxlY3RlZSwKICAgICAgU3RyaW5nIHNpbXBsZU5hbWUsCiAgICAgIERlY2xhcmF0aW9uTWlycm9yIG93bmVyLAogICAgICB0aGlzLl9wb3NpdGlvbiwKICAgICAgdGhpcy5pc09wdGlvbmFsLAogICAgICB0aGlzLmlzTmFtZWQsCiAgICAgIGJvb2wgaXNGaW5hbCwKICAgICAgdGhpcy5fZGVmYXVsdFZhbHVlUmVmbGVjdGVlLAogICAgICB0aGlzLl91bm1pcnJvcmVkTWV0YWRhdGEpCiAgICAgIDogc3VwZXIoCiAgICAgICAgICAgIHJlZmxlY3RlZSwKICAgICAgICAgICAgc2ltcGxlTmFtZSwKICAgICAgICAgICAgb3duZXIsCiAgICAgICAgICAgIG51bGwsIC8vIFdlIG92ZXJyaWRlIHRoZSB0eXBlLgogICAgICAgICAgICBmYWxzZSwgLy8gaXNTdGF0aWMgZG9lcyBub3QgYXBwbHkuCiAgICAgICAgICAgIGlzRmluYWwsCiAgICAgICAgICAgIGZhbHNlIC8vIE5vdCBjb25zdC4KICAgICAgICAgICAgKTsKCiAgT2JqZWN0IF9kZWZhdWx0VmFsdWVSZWZsZWN0ZWU7CiAgSW5zdGFuY2VNaXJyb3IgX2RlZmF1bHRWYWx1ZTsKICBJbnN0YW5jZU1pcnJvciBnZXQgZGVmYXVsdFZhbHVlIHsKICAgIGlmICghaXNPcHRpb25hbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChfZGVmYXVsdFZhbHVlID09IG51bGwpIHsKICAgICAgX2RlZmF1bHRWYWx1ZSA9IHJlZmxlY3QoX2RlZmF1bHRWYWx1ZVJlZmxlY3RlZSk7CiAgICB9CiAgICByZXR1cm4gX2RlZmF1bHRWYWx1ZTsKICB9CgogIGJvb2wgZ2V0IGhhc0RlZmF1bHRWYWx1ZSA9PiBfZGVmYXVsdFZhbHVlUmVmbGVjdGVlICE9IG51bGw7CgogIFNvdXJjZUxvY2F0aW9uIGdldCBsb2NhdGlvbiB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiUGFyYW1ldGVyTWlycm9yLmxvY2F0aW9uIHVuaW1wbGVtZW50ZWQiKTsKICB9CgogIExpc3Q8SW5zdGFuY2VNaXJyb3I+IGdldCBtZXRhZGF0YSB7CiAgICBpZiAoX3VubWlycm9yZWRNZXRhZGF0YSA9PSBudWxsKSByZXR1cm4gY29uc3QgPEluc3RhbmNlTWlycm9yPltdOwogICAgcmV0dXJuIG5ldyBVbm1vZGlmaWFibGVMaXN0VmlldzxJbnN0YW5jZU1pcnJvcj4oCiAgICAgICAgX3VubWlycm9yZWRNZXRhZGF0YS5tYXAocmVmbGVjdCkpOwogIH0KCiAgVHlwZU1pcnJvciBfdHlwZTsKICBUeXBlTWlycm9yIGdldCB0eXBlIHsKICAgIGlmIChfdHlwZSA9PSBudWxsKSB7CiAgICAgIF90eXBlID0gcmVmbGVjdFR5cGUoCiAgICAgICAgICBfUGFyYW1ldGVyTWlycm9yX3R5cGUoX3JlZmxlY3RlZSwgX3Bvc2l0aW9uLCBfaW5zdGFudGlhdG9yKSk7CiAgICB9CiAgICByZXR1cm4gX3R5cGU7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiUGFyYW1ldGVyTWlycm9yIG9uICcke19uKHNpbXBsZU5hbWUpfSciOwoKICBzdGF0aWMgVHlwZSBfUGFyYW1ldGVyTWlycm9yX3R5cGUoX3JlZmxlY3RlZSwgX3Bvc2l0aW9uLCBpbnN0YW50aWF0b3IpCiAgICAgIG5hdGl2ZSAiUGFyYW1ldGVyTWlycm9yX3R5cGUiOwp9CgpjbGFzcyBfU3BlY2lhbFR5cGVNaXJyb3IgZXh0ZW5kcyBfTG9jYWxNaXJyb3IKICAgIGltcGxlbWVudHMgVHlwZU1pcnJvciwgRGVjbGFyYXRpb25NaXJyb3IgewogIGZpbmFsIFN5bWJvbCBzaW1wbGVOYW1lOwoKICBfU3BlY2lhbFR5cGVNaXJyb3IoU3RyaW5nIG5hbWUpIDogc2ltcGxlTmFtZSA9IF9zKG5hbWUpOwoKICBib29sIGdldCBpc1ByaXZhdGUgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNUb3BMZXZlbCA9PiB0cnVlOwoKICBEZWNsYXJhdGlvbk1pcnJvciBnZXQgb3duZXIgPT4gbnVsbDsKCiAgU291cmNlTG9jYXRpb24gZ2V0IGxvY2F0aW9uID0+IG51bGw7CiAgTGlzdDxJbnN0YW5jZU1pcnJvcj4gZ2V0IG1ldGFkYXRhID0+IGNvbnN0IDxJbnN0YW5jZU1pcnJvcj5bXTsKCiAgYm9vbCBnZXQgaGFzUmVmbGVjdGVkVHlwZSA9PiBzaW1wbGVOYW1lID09ICNkeW5hbWljOwogIFR5cGUgZ2V0IHJlZmxlY3RlZFR5cGUgewogICAgaWYgKHNpbXBsZU5hbWUgPT0gI2R5bmFtaWMpIHJldHVybiBkeW5hbWljOwogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoInZvaWQgaGFzIG5vIHJlZmxlY3RlZCB0eXBlIik7CiAgfQoKICBMaXN0PFR5cGVWYXJpYWJsZU1pcnJvcj4gZ2V0IHR5cGVWYXJpYWJsZXMgPT4gY29uc3QgPFR5cGVWYXJpYWJsZU1pcnJvcj5bXTsKICBMaXN0PFR5cGVNaXJyb3I+IGdldCB0eXBlQXJndW1lbnRzID0+IGNvbnN0IDxUeXBlTWlycm9yPltdOwoKICBib29sIGdldCBpc09yaWdpbmFsRGVjbGFyYXRpb24gPT4gdHJ1ZTsKICBUeXBlTWlycm9yIGdldCBvcmlnaW5hbERlY2xhcmF0aW9uID0+IHRoaXM7CgogIFN5bWJvbCBnZXQgcXVhbGlmaWVkTmFtZSA9PiBzaW1wbGVOYW1lOwoKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMhIF9TcGVjaWFsVHlwZU1pcnJvcikgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdGhpcy5zaW1wbGVOYW1lID09IG90aGVyLnNpbXBsZU5hbWU7CiAgfQoKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHNpbXBsZU5hbWUuaGFzaENvZGU7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJUeXBlTWlycm9yIG9uICcke19uKHNpbXBsZU5hbWUpfSciOwoKICBib29sIGlzU3VidHlwZU9mKFR5cGVNaXJyb3Igb3RoZXIpIHsKICAgIHJldHVybiBzaW1wbGVOYW1lID09ICNkeW5hbWljIHx8IG90aGVyIGlzIF9TcGVjaWFsVHlwZU1pcnJvcjsKICB9CgogIGJvb2wgaXNBc3NpZ25hYmxlVG8oVHlwZU1pcnJvciBvdGhlcikgewogICAgcmV0dXJuIHNpbXBsZU5hbWUgPT0gI2R5bmFtaWMgfHwgb3RoZXIgaXMgX1NwZWNpYWxUeXBlTWlycm9yOwogIH0KfQoKY2xhc3MgX01pcnJvcnMgewogIHN0YXRpYyBNaXJyb3JTeXN0ZW0gX2N1cnJlbnRNaXJyb3JTeXN0ZW0gPSBuZXcgX0xvY2FsTWlycm9yU3lzdGVtKCk7CiAgc3RhdGljIE1pcnJvclN5c3RlbSBjdXJyZW50TWlycm9yU3lzdGVtKCkgewogICAgcmV0dXJuIF9jdXJyZW50TWlycm9yU3lzdGVtOwogIH0KCiAgLy8gQ3JlYXRlcyBhIG5ldyBsb2NhbCBtaXJyb3IgZm9yIHNvbWUgT2JqZWN0LgogIHN0YXRpYyBJbnN0YW5jZU1pcnJvciByZWZsZWN0KE9iamVjdCByZWZsZWN0ZWUpIHsKICAgIHJldHVybiByZWZsZWN0ZWUgaXMgRnVuY3Rpb24KICAgICAgICA/IG5ldyBfTG9jYWxDbG9zdXJlTWlycm9yKHJlZmxlY3RlZSkKICAgICAgICA6IG5ldyBfTG9jYWxJbnN0YW5jZU1pcnJvcihyZWZsZWN0ZWUpOwogIH0KCiAgc3RhdGljIENsYXNzTWlycm9yIG1ha2VMb2NhbENsYXNzTWlycm9yKFR5cGUga2V5KQogICAgICBuYXRpdmUgIk1pcnJvcnNfbWFrZUxvY2FsQ2xhc3NNaXJyb3IiOwogIHN0YXRpYyBUeXBlTWlycm9yIG1ha2VMb2NhbFR5cGVNaXJyb3IoVHlwZSBrZXkpCiAgICAgIG5hdGl2ZSAiTWlycm9yc19tYWtlTG9jYWxUeXBlTWlycm9yIjsKICBzdGF0aWMgVHlwZSBpbnN0YW50aWF0ZUdlbmVyaWNUeXBlKFR5cGUga2V5LCB0eXBlQXJndW1lbnRzKQogICAgICBuYXRpdmUgIk1pcnJvcnNfaW5zdGFudGlhdGVHZW5lcmljVHlwZSI7CgogIHN0YXRpYyBFeHBhbmRvPF9Mb2NhbENsYXNzTWlycm9yPiBfZGVjbGFyYXRpb25DYWNoZSA9CiAgICAgIG5ldyBFeHBhbmRvKCJDbGFzc01pcnJvciIpOwogIHN0YXRpYyBFeHBhbmRvPFR5cGVNaXJyb3I+IF9pbnN0YW50aWF0aW9uQ2FjaGUgPSBuZXcgRXhwYW5kbygiVHlwZU1pcnJvciIpOwoKICBzdGF0aWMgQ2xhc3NNaXJyb3IgcmVmbGVjdENsYXNzKFR5cGUga2V5KSB7CiAgICB2YXIgY2xhc3NNaXJyb3IgPSBfZGVjbGFyYXRpb25DYWNoZVtrZXldOwogICAgaWYgKGNsYXNzTWlycm9yID09IG51bGwpIHsKICAgICAgY2xhc3NNaXJyb3IgPSBtYWtlTG9jYWxDbGFzc01pcnJvcihrZXkpOwogICAgICBfZGVjbGFyYXRpb25DYWNoZVtrZXldID0gY2xhc3NNaXJyb3I7CiAgICAgIGlmICghY2xhc3NNaXJyb3IuX2lzR2VuZXJpYykgewogICAgICAgIF9pbnN0YW50aWF0aW9uQ2FjaGVba2V5XSA9IGNsYXNzTWlycm9yOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gY2xhc3NNaXJyb3I7CiAgfQoKICBzdGF0aWMgVHlwZU1pcnJvciByZWZsZWN0VHlwZShUeXBlIGtleSwgW0xpc3Q8VHlwZT4gdHlwZUFyZ3VtZW50c10pIHsKICAgIGlmICh0eXBlQXJndW1lbnRzICE9IG51bGwpIHsKICAgICAga2V5ID0gX2luc3RhbnRpYXRlVHlwZShrZXksIHR5cGVBcmd1bWVudHMpOwogICAgfQogICAgdmFyIHR5cGVNaXJyb3IgPSBfaW5zdGFudGlhdGlvbkNhY2hlW2tleV07CiAgICBpZiAodHlwZU1pcnJvciA9PSBudWxsKSB7CiAgICAgIHR5cGVNaXJyb3IgPSBtYWtlTG9jYWxUeXBlTWlycm9yKGtleSk7CiAgICAgIF9pbnN0YW50aWF0aW9uQ2FjaGVba2V5XSA9IHR5cGVNaXJyb3I7CiAgICAgIGlmICh0eXBlTWlycm9yIGlzIF9Mb2NhbENsYXNzTWlycm9yICYmICF0eXBlTWlycm9yLl9pc0dlbmVyaWMpIHsKICAgICAgICBfZGVjbGFyYXRpb25DYWNoZVtrZXldID0gdHlwZU1pcnJvcjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHR5cGVNaXJyb3I7CiAgfQoKICBzdGF0aWMgVHlwZSBfaW5zdGFudGlhdGVUeXBlKFR5cGUga2V5LCBMaXN0PFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIGlmICh0eXBlQXJndW1lbnRzLmlzRW1wdHkpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUodHlwZUFyZ3VtZW50cywgJ3R5cGVBcmd1bWVudHMnLAogICAgICAgICAgJ1R5cGUgYXJndW1lbnRzIGxpc3QgY2Fubm90IGJlIGVtcHR5LicpOwogICAgfQogICAgcmV0dXJuIGluc3RhbnRpYXRlR2VuZXJpY1R5cGUoa2V5LCB0eXBlQXJndW1lbnRzLnRvTGlzdChncm93YWJsZTogZmFsc2UpKTsKICB9Cn0KheQATk48ASEBTQErFSMdAgE9ARkhMAIBSyg9AgEdPykSKiUBMB9GFiMGTBYoBhknFwYtJxcGBB4UBCMUBBYrGQIBSQFIAUMBMEQ+ARIqKjI3IwhMFgYXBAFMARoeHCQGFQQBSAFKAgEyNS8B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YWN0b3J5IF9NaXJyb3JSZWZlcmVuY2UuX3VuaW5zdGFudGlhYmxlKCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoImNsYXNzIF9NaXJyb3JSZWZlcmVuY2UgY2Fubm90IGJlIGluc3RhbnRpYXRlZCIpOwogIH0KCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgbmF0aXZlICJNaXJyb3JSZWZlcmVuY2VfZXF1YWxzIjsKfQoQAE5OPAEhARoZL1EEATsCAShkYXJ0Om1pcnJvcnMtcGF0Y2gvbWlycm9yX3JlZmVyZW5jZS5kYXJ0Mm9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvbWlycm9yc19wYXRjaC5kYXJ0irovLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIE5vdGU6IHRoZSBWTSBjb25jYXRlbmF0ZXMgYWxsIHBhdGNoIGZpbGVzIGludG8gYSBzaW5nbGUgcGF0Y2ggZmlsZS4gVGhpcwovLy8gZmlsZSBpcyB0aGUgZmlyc3QgcGF0Y2ggaW4gImRhcnQ6X2ludGVybmFsIiB3aGljaCBjb250YWlucyBhbGwgdGhlIGltcG9ydHMKLy8vIHVzZWQgYnkgcGF0Y2hlcyBvZiB0aGF0IGxpYnJhcnkuIFdlIHBsYW4gdG8gY2hhbmdlIHRoaXMgd2hlbiB3ZSBoYXZlIGEKLy8vIHNoYXJlZCBmcm9udCBlbmQgYW5kIHNpbXBseSB1c2UgcGFydHMuCgppbXBvcnQgImRhcnQ6X2ludGVybmFsIiBhcyBpbnRlcm5hbDsKCmltcG9ydCAiZGFydDpfaW50ZXJuYWwiIHNob3cgcGF0Y2g7CgppbXBvcnQgImRhcnQ6YXN5bmMiIHNob3cgRnV0dXJlOwoKaW1wb3J0ICJkYXJ0OmNvbGxlY3Rpb24iIHNob3cgVW5tb2RpZmlhYmxlTGlzdFZpZXcsIFVubW9kaWZpYWJsZU1hcFZpZXc7CgovLy8gVGhlc2UgYXJlIHRoZSBhZGRpdGlvbmFsIHBhcnRzIG9mIHRoaXMgcGF0Y2ggbGlicmFyeToKLy8gcGFydCAibWlycm9yc19pbXBsLmRhcnQiOwovLyBwYXJ0ICJtaXJyb3JfcmVmZXJlbmNlLmRhcnQiOwoKLyoqCiAqIFJldHVybnMgYSBbTWlycm9yU3lzdGVtXSBmb3IgdGhlIGN1cnJlbnQgaXNvbGF0ZS4KICovCkBwYXRjaApNaXJyb3JTeXN0ZW0gY3VycmVudE1pcnJvclN5c3RlbSgpIHsKICByZXR1cm4gX01pcnJvcnMuY3VycmVudE1pcnJvclN5c3RlbSgpOwp9CgovKioKICogUmV0dXJucyBhbiBbSW5zdGFuY2VNaXJyb3JdIGZvciBzb21lIERhcnQgbGFuZ3VhZ2Ugb2JqZWN0LgogKgogKiBUaGlzIG9ubHkgd29ya3MgaWYgdGhpcyBtaXJyb3Igc3lzdGVtIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUKICogY3VycmVudCBydW5uaW5nIGlzb2xhdGUuCiAqLwpAcGF0Y2gKSW5zdGFuY2VNaXJyb3IgcmVmbGVjdChPYmplY3QgcmVmbGVjdGVlKSB7CiAgcmV0dXJuIF9NaXJyb3JzLnJlZmxlY3QocmVmbGVjdGVlKTsKfQoKLyoqCiAqIFJldHVybnMgYSBbQ2xhc3NNaXJyb3JdIGZvciB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgYSBEYXJ0CiAqIFR5cGUgb2JqZWN0LgogKgogKiBUaGlzIG9ubHkgd29ya3Mgd2l0aCBvYmplY3RzIGxvY2FsIHRvIHRoZSBjdXJyZW50IGlzb2xhdGUuCiAqLwpAcGF0Y2gKQ2xhc3NNaXJyb3IgcmVmbGVjdENsYXNzKFR5cGUga2V5KSB7CiAgcmV0dXJuIF9NaXJyb3JzLnJlZmxlY3RDbGFzcyhrZXkpOwp9CgpAcGF0Y2gKVHlwZU1pcnJvciByZWZsZWN0VHlwZShUeXBlIGtleSwgW0xpc3Q8VHlwZT4gdHlwZUFyZ3VtZW50c10pIHsKICByZXR1cm4gX01pcnJvcnMucmVmbGVjdFR5cGUoa2V5LCB0eXBlQXJndW1lbnRzKTsKfQoKQHBhdGNoCmNsYXNzIE1pcnJvclN5c3RlbSB7CiAgQHBhdGNoCiAgTGlicmFyeU1pcnJvciBmaW5kTGlicmFyeShTeW1ib2wgbGlicmFyeU5hbWUpIHsKICAgIHZhciBjYW5kaWRhdGVzID0KICAgICAgICBsaWJyYXJpZXMudmFsdWVzLndoZXJlKChsaWIpID0+IGxpYi5zaW1wbGVOYW1lID09IGxpYnJhcnlOYW1lKTsKICAgIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHJldHVybiBjYW5kaWRhdGVzLnNpbmdsZTsKICAgIH0KICAgIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA+IDEpIHsKICAgICAgdmFyIHVyaXMgPSBjYW5kaWRhdGVzLm1hcCgobGliKSA9PiBsaWIudXJpLnRvU3RyaW5nKCkpLnRvTGlzdCgpOwogICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGVyZSBhcmUgbXVsdGlwbGUgbGlicmFyaWVzIG5hbWVkICIKICAgICAgICAgICInJHtnZXROYW1lKGxpYnJhcnlOYW1lKX0nOiAkdXJpcyIpOwogICAgfQogICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gbGlicmFyeSBuYW1lZCAnJHtnZXROYW1lKGxpYnJhcnlOYW1lKX0nIik7CiAgfQoKICBAcGF0Y2gKICBzdGF0aWMgU3RyaW5nIGdldE5hbWUoU3ltYm9sIHN5bWJvbCkgewogICAgcmV0dXJuIGludGVybmFsLlN5bWJvbC5jb21wdXRlVW5tYW5nbGVkTmFtZShzeW1ib2wpOwogIH0KCiAgQHBhdGNoCiAgc3RhdGljIFN5bWJvbCBnZXRTeW1ib2woU3RyaW5nIG5hbWUsIFtMaWJyYXJ5TWlycm9yIGxpYnJhcnldKSB7CiAgICBpZiAoKGxpYnJhcnkgIT0gbnVsbCAmJiBsaWJyYXJ5IGlzISBfTG9jYWxMaWJyYXJ5TWlycm9yKSB8fAogICAgICAgICgobmFtZS5sZW5ndGggPiAwKSAmJiAobmFtZVswXSA9PSAnXycpICYmIChsaWJyYXJ5ID09IG51bGwpKSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihsaWJyYXJ5KTsKICAgIH0KICAgIGlmIChsaWJyYXJ5ICE9IG51bGwpIHsKICAgICAgbmFtZSA9IF9tYW5nbGVOYW1lKG5hbWUsIChsaWJyYXJ5IGFzIF9Mb2NhbExpYnJhcnlNaXJyb3IpLl9yZWZsZWN0ZWUpOwogICAgfQogICAgcmV0dXJuIG5ldyBpbnRlcm5hbC5TeW1ib2wudW52YWxpZGF0ZWQobmFtZSk7CiAgfQoKICBzdGF0aWMgX21hbmdsZU5hbWUoU3RyaW5nIG5hbWUsIF9NaXJyb3JSZWZlcmVuY2UgbGliKQogICAgICBuYXRpdmUgIk1pcnJvcnNfbWFuZ2xlTmFtZSI7Cn0KXwBOTjwBTU9LKwElASQBIQFJATodIQEENQQHJSkCAQQ+A0AcBAcrJgIBBD8QAz4EByUlAgEHPzMCAQcVCTIVSCIgBiFHQC8GUAQBCSk5BAEJQkBIKAYbTQYyBAE4IwIBJWRhcnQ6bWlycm9ycy1wYXRjaC9taXJyb3JzX3BhdGNoLmRhcnQyb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL3Byb2ZpbGVyL3Byb2ZpbGVyLmRhcnSBiS8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gUGxlYXNlIHNlZSAnZGFydDpkZXZlbG9wZXInLgpARGVwcmVjYXRlZCgiRGFydCBTREsgMS4xMiIpCmxpYnJhcnkgZGFydC5wcm9maWxlcjsKCmV4cG9ydCAnZGFydDpkZXZlbG9wZXInCiAgICBzaG93IGdldEN1cnJlbnRUYWcsIENvdW50ZXIsIEdhdWdlLCBNZXRyaWMsIE1ldHJpY3MsIFVzZXJUYWc7CgwATk48ASEdFwEYQgENZGFydDpwcm9maWxlcjZvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvdHlwZWRfZGF0YS90eXBlZF9kYXRhLmRhcnTAAS7BLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBMaXN0cyB0aGF0IGVmZmljaWVudGx5IGhhbmRsZSBmaXhlZCBzaXplZCBkYXRhCi8vLyAoZm9yIGV4YW1wbGUsIHVuc2lnbmVkIDggYnl0ZSBpbnRlZ2VycykgYW5kIFNJTUQgbnVtZXJpYyB0eXBlcy4KLy8vCi8vLyBUbyB1c2UgdGhpcyBsaWJyYXJ5IGluIHlvdXIgY29kZToKLy8vCi8vLyAgICAgaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnOwovLy8KLy8vIHtAY2F0ZWdvcnkgQ29yZX0KbGlicmFyeSBkYXJ0LnR5cGVkX2RhdGE7CgppbXBvcnQgImRhcnQ6X2ludGVybmFsIiBzaG93IFVubW9kaWZpYWJsZUxpc3RCYXNlOwoKcGFydCAidW5tb2RpZmlhYmxlX3R5cGVkX2RhdGEuZGFydCI7CgovKioKICogQSBzZXF1ZW5jZSBvZiBieXRlcyB1bmRlcmx5aW5nIGEgdHlwZWQgZGF0YSBvYmplY3QuCiAqCiAqIFVzZWQgdG8gcHJvY2VzcyBsYXJnZSBxdWFudGl0aWVzIG9mIGJpbmFyeSBvciBudW1lcmljYWwgZGF0YQogKiBtb3JlIGVmZmljaWVudGx5IHVzaW5nIGEgdHlwZWQgdmlldy4KICovCmFic3RyYWN0IGNsYXNzIEJ5dGVCdWZmZXIgewogIC8qKgogICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGlzIGJ5dGUgYnVmZmVyLCBpbiBieXRlcy4KICAgKi8KICBpbnQgZ2V0IGxlbmd0aEluQnl0ZXM7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbVWludDhMaXN0XSBfdmlld18gb2YgYSByZWdpb24gb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRoZSB2aWV3IGlzIGJhY2tlZCBieSB0aGUgYnl0ZXMgb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKiBBbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBgVWludDhMaXN0YCB3aWxsIGFsc28gY2hhbmdlIHRoZSBidWZmZXIsCiAgICogYW5kIHZpY2UgdmVyc2EuCiAgICoKICAgKiBUaGUgdmlld2VkIHJlZ2lvbiBzdGFydCBhdCBbb2Zmc2V0SW5CeXRlc10gYW5kIGNvbnRhaW5zIFtsZW5ndGhdIGJ5dGVzLgogICAqIElmIFtsZW5ndGhdIGlzIG9taXR0ZWQsIHRoZSByYW5nZSBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KICAgKgogICAqIFRoZSBzdGFydCBpbmRleCBhbmQgbGVuZ3RoIG11c3QgZGVzY3JpYmUgYSB2YWxpZCByYW5nZSBvZiB0aGUgYnVmZmVyOgogICAqCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBub3QgYmUgbmVnYXRpdmUsCiAgICogKiBgbGVuZ3RoYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwgYW5kCiAgICogKiBgb2Zmc2V0SW5CeXRlcyArIGxlbmd0aGAgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIFtsZW5ndGhJbkJ5dGVzXS4KICAgKi8KICBVaW50OExpc3QgYXNVaW50OExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0ludDhMaXN0XSBfdmlld18gb2YgYSByZWdpb24gb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRoZSB2aWV3IGlzIGJhY2tlZCBieSB0aGUgYnl0ZXMgb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKiBBbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBgSW50OExpc3RgIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIGJ1ZmZlciwKICAgKiBhbmQgdmljZSB2ZXJzYS4KICAgKgogICAqIFRoZSB2aWV3ZWQgcmVnaW9uIHN0YXJ0IGF0IFtvZmZzZXRJbkJ5dGVzXSBhbmQgY29udGFpbnMgW2xlbmd0aF0gYnl0ZXMuCiAgICogSWYgW2xlbmd0aF0gaXMgb21pdHRlZCwgdGhlIHJhbmdlIGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgogICAqCiAgICogVGhlIHN0YXJ0IGluZGV4IGFuZCBsZW5ndGggbXVzdCBkZXNjcmliZSBhIHZhbGlkIHJhbmdlIG9mIHRoZSBidWZmZXI6CiAgICoKICAgKiAqIGBvZmZzZXRJbkJ5dGVzYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwKICAgKiAqIGBsZW5ndGhgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLCBhbmQKICAgKiAqIGBvZmZzZXRJbkJ5dGVzICsgbGVuZ3RoYCBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gW2xlbmd0aEluQnl0ZXNdLgogICAqLwogIEludDhMaXN0IGFzSW50OExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW1VpbnQ4Q2xhbXBlZExpc3RdIF92aWV3XyBvZiBhIHJlZ2lvbiBvZiB0aGlzIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhlIHZpZXcgaXMgYmFja2VkIGJ5IHRoZSBieXRlcyBvZiB0aGlzIGJ5dGUgYnVmZmVyLgogICAqIEFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGBVaW50OENsYW1wZWRMaXN0YCB3aWxsIGFsc28gY2hhbmdlIHRoZSBidWZmZXIsCiAgICogYW5kIHZpY2UgdmVyc2EuCiAgICoKICAgKiBUaGUgdmlld2VkIHJlZ2lvbiBzdGFydCBhdCBbb2Zmc2V0SW5CeXRlc10gYW5kIGNvbnRhaW5zIFtsZW5ndGhdIGJ5dGVzLgogICAqIElmIFtsZW5ndGhdIGlzIG9taXR0ZWQsIHRoZSByYW5nZSBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KICAgKgogICAqIFRoZSBzdGFydCBpbmRleCBhbmQgbGVuZ3RoIG11c3QgZGVzY3JpYmUgYSB2YWxpZCByYW5nZSBvZiB0aGUgYnVmZmVyOgogICAqCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBub3QgYmUgbmVnYXRpdmUsCiAgICogKiBgbGVuZ3RoYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwgYW5kCiAgICogKiBgb2Zmc2V0SW5CeXRlcyArIGxlbmd0aGAgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIFtsZW5ndGhJbkJ5dGVzXS4KICAgKi8KICBVaW50OENsYW1wZWRMaXN0IGFzVWludDhDbGFtcGVkTGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbVWludDE2TGlzdF0gX3ZpZXdfIG9mIGEgcmVnaW9uIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaGUgdmlldyBpcyBiYWNrZWQgYnkgdGhlIGJ5dGVzIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICogQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgYFVpbnQxNkxpc3RgIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIGJ1ZmZlciwKICAgKiBhbmQgdmljZSB2ZXJzYS4KICAgKgogICAqIFRoZSB2aWV3ZWQgcmVnaW9uIHN0YXJ0IGF0IFtvZmZzZXRJbkJ5dGVzXSwgd2hpY2ggbXVzdCBiZSAxNi1iaXQgYWxpZ25lZCwKICAgKiBhbmQgY29udGFpbnMgW2xlbmd0aF0gMTYtYml0IGludGVnZXJzLgogICAqIElmIFtsZW5ndGhdIGlzIG9taXR0ZWQsIHRoZSByYW5nZSBleHRlbmRzIGFzIGZhciB0b3dhcmRzIHRoZSBlbmQgb2YKICAgKiB0aGUgYnVmZmVyIGFzIHBvc3NpYmxlIC0KICAgKiBpZiBbbGVuZ3RoSW5CeXRlc10gaXMgbm90IGV2ZW4sIHRoZSBsYXN0IGJ5dGUgY2FuJ3QgYmUgcGFydCBvZiB0aGUgdmlldy4KICAgKgogICAqIFRoZSBzdGFydCBpbmRleCBhbmQgbGVuZ3RoIG11c3QgZGVzY3JpYmUgYSB2YWxpZCAxNi1iaXQgYWxpZ25lZCByYW5nZQogICAqIG9mIHRoZSBidWZmZXI6CiAgICoKICAgKiAqIGBvZmZzZXRJbkJ5dGVzYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwKICAgKiAqIGBvZmZzZXRJbkJ5dGVzYCBtdXN0IGJlIGRpdmlzaWJsZSBieSB0d28sCiAgICogKiBgbGVuZ3RoYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwgYW5kCiAgICogKiBgb2Zmc2V0SW5CeXRlcyArIGxlbmd0aCAqIDJgIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiBbbGVuZ3RoSW5CeXRlc10uCiAgICovCiAgVWludDE2TGlzdCBhc1VpbnQxNkxpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0ludDE2TGlzdF0gX3ZpZXdfIG9mIGEgcmVnaW9uIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaGUgdmlldyBpcyBiYWNrZWQgYnkgdGhlIGJ5dGVzIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICogQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgYEludDE2TGlzdGAgd2lsbCBhbHNvIGNoYW5nZSB0aGUgYnVmZmVyLAogICAqIGFuZCB2aWNlIHZlcnNhLgogICAqCiAgICogVGhlIHZpZXdlZCByZWdpb24gc3RhcnQgYXQgW29mZnNldEluQnl0ZXNdLCB3aGljaCBtdXN0IGJlIDE2LWJpdCBhbGlnbmVkLAogICAqIGFuZCBjb250YWlucyBbbGVuZ3RoXSAxNi1iaXQgaW50ZWdlcnMuCiAgICogSWYgW2xlbmd0aF0gaXMgb21pdHRlZCwgdGhlIHJhbmdlIGV4dGVuZHMgYXMgZmFyIHRvd2FyZHMgdGhlIGVuZCBvZgogICAqIHRoZSBidWZmZXIgYXMgcG9zc2libGUgLQogICAqIGlmIFtsZW5ndGhJbkJ5dGVzXSBpcyBub3QgZXZlbiwgdGhlIGxhc3QgYnl0ZSBjYW4ndCBiZSBwYXJ0IG9mIHRoZSB2aWV3LgogICAqCiAgICogVGhlIHN0YXJ0IGluZGV4IGFuZCBsZW5ndGggbXVzdCBkZXNjcmliZSBhIHZhbGlkIDE2LWJpdCBhbGlnbmVkIHJhbmdlCiAgICogb2YgdGhlIGJ1ZmZlcjoKICAgKgogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLAogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3QgYmUgZGl2aXNpYmxlIGJ5IHR3bywKICAgKiAqIGBsZW5ndGhgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLCBhbmQKICAgKiAqIGBvZmZzZXRJbkJ5dGVzICsgbGVuZ3RoICogMmAgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIFtsZW5ndGhJbkJ5dGVzXS4KICAgKi8KICBJbnQxNkxpc3QgYXNJbnQxNkxpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW1VpbnQzMkxpc3RdIF92aWV3XyBvZiBhIHJlZ2lvbiBvZiB0aGlzIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhlIHZpZXcgaXMgYmFja2VkIGJ5IHRoZSBieXRlcyBvZiB0aGlzIGJ5dGUgYnVmZmVyLgogICAqIEFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGBVaW50MzJMaXN0YCB3aWxsIGFsc28gY2hhbmdlIHRoZSBidWZmZXIsCiAgICogYW5kIHZpY2UgdmVyc2EuCiAgICoKICAgKiBUaGUgdmlld2VkIHJlZ2lvbiBzdGFydCBhdCBbb2Zmc2V0SW5CeXRlc10sIHdoaWNoIG11c3QgYmUgMzItYml0IGFsaWduZWQsCiAgICogYW5kIGNvbnRhaW5zIFtsZW5ndGhdIDMyLWJpdCBpbnRlZ2Vycy4KICAgKiBJZiBbbGVuZ3RoXSBpcyBvbWl0dGVkLCB0aGUgcmFuZ2UgZXh0ZW5kcyBhcyBmYXIgdG93YXJkcyB0aGUgZW5kIG9mCiAgICogdGhlIGJ1ZmZlciBhcyBwb3NzaWJsZSAtCiAgICogaWYgW2xlbmd0aEluQnl0ZXNdIGlzIG5vdCBkaXZpc2libGUgYnkgZm91ciwgdGhlIGxhc3QgYnl0ZXMgY2FuJ3QgYmUgcGFydAogICAqIG9mIHRoZSB2aWV3LgogICAqCiAgICogVGhlIHN0YXJ0IGluZGV4IGFuZCBsZW5ndGggbXVzdCBkZXNjcmliZSBhIHZhbGlkIDMyLWJpdCBhbGlnbmVkIHJhbmdlCiAgICogb2YgdGhlIGJ1ZmZlcjoKICAgKgogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLAogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3QgYmUgZGl2aXNpYmxlIGJ5IGZvdXIsCiAgICogKiBgbGVuZ3RoYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwgYW5kCiAgICogKiBgb2Zmc2V0SW5CeXRlcyArIGxlbmd0aCAqIDRgIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiBbbGVuZ3RoSW5CeXRlc10uCiAgICovCiAgVWludDMyTGlzdCBhc1VpbnQzMkxpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0ludDMyTGlzdF0gX3ZpZXdfIG9mIGEgcmVnaW9uIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaGUgdmlldyBpcyBiYWNrZWQgYnkgdGhlIGJ5dGVzIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICogQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgYEludDMyTGlzdGAgd2lsbCBhbHNvIGNoYW5nZSB0aGUgYnVmZmVyLAogICAqIGFuZCB2aWNlIHZlcnNhLgogICAqCiAgICogVGhlIHZpZXdlZCByZWdpb24gc3RhcnQgYXQgW29mZnNldEluQnl0ZXNdLCB3aGljaCBtdXN0IGJlIDMyLWJpdCBhbGlnbmVkLAogICAqIGFuZCBjb250YWlucyBbbGVuZ3RoXSAzMi1iaXQgaW50ZWdlcnMuCiAgICogSWYgW2xlbmd0aF0gaXMgb21pdHRlZCwgdGhlIHJhbmdlIGV4dGVuZHMgYXMgZmFyIHRvd2FyZHMgdGhlIGVuZCBvZgogICAqIHRoZSBidWZmZXIgYXMgcG9zc2libGUgLQogICAqIGlmIFtsZW5ndGhJbkJ5dGVzXSBpcyBub3QgZGl2aXNpYmxlIGJ5IGZvdXIsIHRoZSBsYXN0IGJ5dGVzIGNhbid0IGJlIHBhcnQKICAgKiBvZiB0aGUgdmlldy4KICAgKgogICAqIFRoZSBzdGFydCBpbmRleCBhbmQgbGVuZ3RoIG11c3QgZGVzY3JpYmUgYSB2YWxpZCAzMi1iaXQgYWxpZ25lZCByYW5nZQogICAqIG9mIHRoZSBidWZmZXI6CiAgICoKICAgKiAqIGBvZmZzZXRJbkJ5dGVzYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwKICAgKiAqIGBvZmZzZXRJbkJ5dGVzYCBtdXN0IGJlIGRpdmlzaWJsZSBieSBmb3VyLAogICAqICogYGxlbmd0aGAgbXVzdCBub3QgYmUgbmVnYXRpdmUsIGFuZAogICAqICogYG9mZnNldEluQnl0ZXMgKyBsZW5ndGggKiA0YCBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gW2xlbmd0aEluQnl0ZXNdLgogICAqLwogIEludDMyTGlzdCBhc0ludDMyTGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbVWludDY0TGlzdF0gX3ZpZXdfIG9mIGEgcmVnaW9uIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaGUgdmlldyBpcyBiYWNrZWQgYnkgdGhlIGJ5dGVzIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICogQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgYFVpbnQ2NExpc3RgIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIGJ1ZmZlciwKICAgKiBhbmQgdmljZSB2ZXJzYS4KICAgKgogICAqIFRoZSB2aWV3ZWQgcmVnaW9uIHN0YXJ0IGF0IFtvZmZzZXRJbkJ5dGVzXSwgd2hpY2ggbXVzdCBiZSA2NC1iaXQgYWxpZ25lZCwKICAgKiBhbmQgY29udGFpbnMgW2xlbmd0aF0gNjQtYml0IGludGVnZXJzLgogICAqIElmIFtsZW5ndGhdIGlzIG9taXR0ZWQsIHRoZSByYW5nZSBleHRlbmRzIGFzIGZhciB0b3dhcmRzIHRoZSBlbmQgb2YKICAgKiB0aGUgYnVmZmVyIGFzIHBvc3NpYmxlIC0KICAgKiBpZiBbbGVuZ3RoSW5CeXRlc10gaXMgbm90IGRpdmlzaWJsZSBieSBlaWdodCwgdGhlIGxhc3QgYnl0ZXMgY2FuJ3QgYmUgcGFydAogICAqIG9mIHRoZSB2aWV3LgogICAqCiAgICogVGhlIHN0YXJ0IGluZGV4IGFuZCBsZW5ndGggbXVzdCBkZXNjcmliZSBhIHZhbGlkIDY0LWJpdCBhbGlnbmVkIHJhbmdlCiAgICogb2YgdGhlIGJ1ZmZlcjoKICAgKgogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLAogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3QgYmUgZGl2aXNpYmxlIGJ5IGVpZ2h0LAogICAqICogYGxlbmd0aGAgbXVzdCBub3QgYmUgbmVnYXRpdmUsIGFuZAogICAqICogYG9mZnNldEluQnl0ZXMgKyBsZW5ndGggKiA4YCBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gW2xlbmd0aEluQnl0ZXNdLgogICAqLwogIFVpbnQ2NExpc3QgYXNVaW50NjRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtJbnQ2NExpc3RdIF92aWV3XyBvZiBhIHJlZ2lvbiBvZiB0aGlzIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhlIHZpZXcgaXMgYmFja2VkIGJ5IHRoZSBieXRlcyBvZiB0aGlzIGJ5dGUgYnVmZmVyLgogICAqIEFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGBJbnQ2NExpc3RgIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIGJ1ZmZlciwKICAgKiBhbmQgdmljZSB2ZXJzYS4KICAgKgogICAqIFRoZSB2aWV3ZWQgcmVnaW9uIHN0YXJ0IGF0IFtvZmZzZXRJbkJ5dGVzXSwgd2hpY2ggbXVzdCBiZSA2NC1iaXQgYWxpZ25lZCwKICAgKiBhbmQgY29udGFpbnMgW2xlbmd0aF0gNjQtYml0IGludGVnZXJzLgogICAqIElmIFtsZW5ndGhdIGlzIG9taXR0ZWQsIHRoZSByYW5nZSBleHRlbmRzIGFzIGZhciB0b3dhcmRzIHRoZSBlbmQgb2YKICAgKiB0aGUgYnVmZmVyIGFzIHBvc3NpYmxlIC0KICAgKiBpZiBbbGVuZ3RoSW5CeXRlc10gaXMgbm90IGRpdmlzaWJsZSBieSBlaWdodCwgdGhlIGxhc3QgYnl0ZXMgY2FuJ3QgYmUgcGFydAogICAqIG9mIHRoZSB2aWV3LgogICAqCiAgICogVGhlIHN0YXJ0IGluZGV4IGFuZCBsZW5ndGggbXVzdCBkZXNjcmliZSBhIHZhbGlkIDY0LWJpdCBhbGlnbmVkIHJhbmdlCiAgICogb2YgdGhlIGJ1ZmZlcjoKICAgKgogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLAogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3QgYmUgZGl2aXNpYmxlIGJ5IGVpZ2h0LAogICAqICogYGxlbmd0aGAgbXVzdCBub3QgYmUgbmVnYXRpdmUsIGFuZAogICAqICogYG9mZnNldEluQnl0ZXMgKyBsZW5ndGggKiA4YCBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gW2xlbmd0aEluQnl0ZXNdLgogICAqLwogIEludDY0TGlzdCBhc0ludDY0TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbSW50MzJ4NExpc3RdIF92aWV3XyBvZiBhIHJlZ2lvbiBvZiB0aGlzIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhlIHZpZXcgaXMgYmFja2VkIGJ5IHRoZSBieXRlcyBvZiB0aGlzIGJ5dGUgYnVmZmVyLgogICAqIEFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGBJbnQzMng0TGlzdGAgd2lsbCBhbHNvIGNoYW5nZSB0aGUgYnVmZmVyLAogICAqIGFuZCB2aWNlIHZlcnNhLgogICAqCiAgICogVGhlIHZpZXdlZCByZWdpb24gc3RhcnQgYXQgW29mZnNldEluQnl0ZXNdLCB3aGljaCBtdXN0IGJlIDEyOC1iaXQgYWxpZ25lZCwKICAgKiBhbmQgY29udGFpbnMgW2xlbmd0aF0gMTI4LWJpdCBpbnRlZ2Vycy4KICAgKiBJZiBbbGVuZ3RoXSBpcyBvbWl0dGVkLCB0aGUgcmFuZ2UgZXh0ZW5kcyBhcyBmYXIgdG93YXJkcyB0aGUgZW5kIG9mCiAgICogdGhlIGJ1ZmZlciBhcyBwb3NzaWJsZSAtCiAgICogaWYgW2xlbmd0aEluQnl0ZXNdIGlzIG5vdCBkaXZpc2libGUgYnkgMTYsIHRoZSBsYXN0IGJ5dGVzIGNhbid0IGJlIHBhcnQKICAgKiBvZiB0aGUgdmlldy4KICAgKgogICAqIFRoZSBzdGFydCBpbmRleCBhbmQgbGVuZ3RoIG11c3QgZGVzY3JpYmUgYSB2YWxpZCAxMjgtYml0IGFsaWduZWQgcmFuZ2UKICAgKiBvZiB0aGUgYnVmZmVyOgogICAqCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBub3QgYmUgbmVnYXRpdmUsCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBiZSBkaXZpc2libGUgYnkgc2l4dGVlbiwKICAgKiAqIGBsZW5ndGhgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLCBhbmQKICAgKiAqIGBvZmZzZXRJbkJ5dGVzICsgbGVuZ3RoICogMTZgIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiBbbGVuZ3RoSW5CeXRlc10uCiAgICovCiAgSW50MzJ4NExpc3QgYXNJbnQzMng0TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbRmxvYXQzMkxpc3RdIF92aWV3XyBvZiBhIHJlZ2lvbiBvZiB0aGlzIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhlIHZpZXcgaXMgYmFja2VkIGJ5IHRoZSBieXRlcyBvZiB0aGlzIGJ5dGUgYnVmZmVyLgogICAqIEFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGBGbG9hdDMyTGlzdGAgd2lsbCBhbHNvIGNoYW5nZSB0aGUgYnVmZmVyLAogICAqIGFuZCB2aWNlIHZlcnNhLgogICAqCiAgICogVGhlIHZpZXdlZCByZWdpb24gc3RhcnQgYXQgW29mZnNldEluQnl0ZXNdLCB3aGljaCBtdXN0IGJlIDMyLWJpdCBhbGlnbmVkLAogICAqIGFuZCBjb250YWlucyBbbGVuZ3RoXSAzMi1iaXQgaW50ZWdlcnMuCiAgICogSWYgW2xlbmd0aF0gaXMgb21pdHRlZCwgdGhlIHJhbmdlIGV4dGVuZHMgYXMgZmFyIHRvd2FyZHMgdGhlIGVuZCBvZgogICAqIHRoZSBidWZmZXIgYXMgcG9zc2libGUgLQogICAqIGlmIFtsZW5ndGhJbkJ5dGVzXSBpcyBub3QgZGl2aXNpYmxlIGJ5IGZvdXIsIHRoZSBsYXN0IGJ5dGVzIGNhbid0IGJlIHBhcnQKICAgKiBvZiB0aGUgdmlldy4KICAgKgogICAqIFRoZSBzdGFydCBpbmRleCBhbmQgbGVuZ3RoIG11c3QgZGVzY3JpYmUgYSB2YWxpZCAzMi1iaXQgYWxpZ25lZCByYW5nZQogICAqIG9mIHRoZSBidWZmZXI6CiAgICoKICAgKiAqIGBvZmZzZXRJbkJ5dGVzYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwKICAgKiAqIGBvZmZzZXRJbkJ5dGVzYCBtdXN0IGJlIGRpdmlzaWJsZSBieSBmb3VyLAogICAqICogYGxlbmd0aGAgbXVzdCBub3QgYmUgbmVnYXRpdmUsIGFuZAogICAqICogYG9mZnNldEluQnl0ZXMgKyBsZW5ndGggKiA0YCBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gW2xlbmd0aEluQnl0ZXNdLgogICAqLwogIEZsb2F0MzJMaXN0IGFzRmxvYXQzMkxpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0Zsb2F0NjRMaXN0XSBfdmlld18gb2YgYSByZWdpb24gb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRoZSB2aWV3IGlzIGJhY2tlZCBieSB0aGUgYnl0ZXMgb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKiBBbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBgRmxvYXQ2NExpc3RgIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIGJ1ZmZlciwKICAgKiBhbmQgdmljZSB2ZXJzYS4KICAgKgogICAqIFRoZSB2aWV3ZWQgcmVnaW9uIHN0YXJ0IGF0IFtvZmZzZXRJbkJ5dGVzXSwgd2hpY2ggbXVzdCBiZSA2NC1iaXQgYWxpZ25lZCwKICAgKiBhbmQgY29udGFpbnMgW2xlbmd0aF0gNjQtYml0IGludGVnZXJzLgogICAqIElmIFtsZW5ndGhdIGlzIG9taXR0ZWQsIHRoZSByYW5nZSBleHRlbmRzIGFzIGZhciB0b3dhcmRzIHRoZSBlbmQgb2YKICAgKiB0aGUgYnVmZmVyIGFzIHBvc3NpYmxlIC0KICAgKiBpZiBbbGVuZ3RoSW5CeXRlc10gaXMgbm90IGRpdmlzaWJsZSBieSBlaWdodCwgdGhlIGxhc3QgYnl0ZXMgY2FuJ3QgYmUgcGFydAogICAqIG9mIHRoZSB2aWV3LgogICAqCiAgICogVGhlIHN0YXJ0IGluZGV4IGFuZCBsZW5ndGggbXVzdCBkZXNjcmliZSBhIHZhbGlkIDY0LWJpdCBhbGlnbmVkIHJhbmdlCiAgICogb2YgdGhlIGJ1ZmZlcjoKICAgKgogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLAogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3QgYmUgZGl2aXNpYmxlIGJ5IGVpZ2h0LAogICAqICogYGxlbmd0aGAgbXVzdCBub3QgYmUgbmVnYXRpdmUsIGFuZAogICAqICogYG9mZnNldEluQnl0ZXMgKyBsZW5ndGggKiA4YCBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gW2xlbmd0aEluQnl0ZXNdLgogICAqLwogIEZsb2F0NjRMaXN0IGFzRmxvYXQ2NExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0Zsb2F0MzJ4NExpc3RdIF92aWV3XyBvZiBhIHJlZ2lvbiBvZiB0aGlzIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhlIHZpZXcgaXMgYmFja2VkIGJ5IHRoZSBieXRlcyBvZiB0aGlzIGJ5dGUgYnVmZmVyLgogICAqIEFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGBGbG9hdDMyeDRMaXN0YCB3aWxsIGFsc28gY2hhbmdlIHRoZSBidWZmZXIsCiAgICogYW5kIHZpY2UgdmVyc2EuCiAgICoKICAgKiBUaGUgdmlld2VkIHJlZ2lvbiBzdGFydCBhdCBbb2Zmc2V0SW5CeXRlc10sIHdoaWNoIG11c3QgYmUgMTI4LWJpdCBhbGlnbmVkLAogICAqIGFuZCBjb250YWlucyBbbGVuZ3RoXSAxMjgtYml0IGludGVnZXJzLgogICAqIElmIFtsZW5ndGhdIGlzIG9taXR0ZWQsIHRoZSByYW5nZSBleHRlbmRzIGFzIGZhciB0b3dhcmRzIHRoZSBlbmQgb2YKICAgKiB0aGUgYnVmZmVyIGFzIHBvc3NpYmxlIC0KICAgKiBpZiBbbGVuZ3RoSW5CeXRlc10gaXMgbm90IGRpdmlzaWJsZSBieSAxNiwgdGhlIGxhc3QgYnl0ZXMgY2FuJ3QgYmUgcGFydAogICAqIG9mIHRoZSB2aWV3LgogICAqCiAgICogVGhlIHN0YXJ0IGluZGV4IGFuZCBsZW5ndGggbXVzdCBkZXNjcmliZSBhIHZhbGlkIDEyOC1iaXQgYWxpZ25lZCByYW5nZQogICAqIG9mIHRoZSBidWZmZXI6CiAgICoKICAgKiAqIGBvZmZzZXRJbkJ5dGVzYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwKICAgKiAqIGBvZmZzZXRJbkJ5dGVzYCBtdXN0IGJlIGRpdmlzaWJsZSBieSBzaXh0ZWVuLAogICAqICogYGxlbmd0aGAgbXVzdCBub3QgYmUgbmVnYXRpdmUsIGFuZAogICAqICogYG9mZnNldEluQnl0ZXMgKyBsZW5ndGggKiAxNmAgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIFtsZW5ndGhJbkJ5dGVzXS4KICAgKi8KICBGbG9hdDMyeDRMaXN0IGFzRmxvYXQzMng0TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbRmxvYXQ2NHgyTGlzdF0gX3ZpZXdfIG9mIGEgcmVnaW9uIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaGUgdmlldyBpcyBiYWNrZWQgYnkgdGhlIGJ5dGVzIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICogQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgYEZsb2F0NjR4Mkxpc3RgIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIGJ1ZmZlciwKICAgKiBhbmQgdmljZSB2ZXJzYS4KICAgKgogICAqIFRoZSB2aWV3ZWQgcmVnaW9uIHN0YXJ0IGF0IFtvZmZzZXRJbkJ5dGVzXSwgd2hpY2ggbXVzdCBiZSAxMjgtYml0IGFsaWduZWQsCiAgICogYW5kIGNvbnRhaW5zIFtsZW5ndGhdIDEyOC1iaXQgaW50ZWdlcnMuCiAgICogSWYgW2xlbmd0aF0gaXMgb21pdHRlZCwgdGhlIHJhbmdlIGV4dGVuZHMgYXMgZmFyIHRvd2FyZHMgdGhlIGVuZCBvZgogICAqIHRoZSBidWZmZXIgYXMgcG9zc2libGUgLQogICAqIGlmIFtsZW5ndGhJbkJ5dGVzXSBpcyBub3QgZGl2aXNpYmxlIGJ5IDE2LCB0aGUgbGFzdCBieXRlcyBjYW4ndCBiZSBwYXJ0CiAgICogb2YgdGhlIHZpZXcuCiAgICoKICAgKiBUaGUgc3RhcnQgaW5kZXggYW5kIGxlbmd0aCBtdXN0IGRlc2NyaWJlIGEgdmFsaWQgMTI4LWJpdCBhbGlnbmVkIHJhbmdlCiAgICogb2YgdGhlIGJ1ZmZlcjoKICAgKgogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLAogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3QgYmUgZGl2aXNpYmxlIGJ5IHNpeHRlZW4sCiAgICogKiBgbGVuZ3RoYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwgYW5kCiAgICogKiBgb2Zmc2V0SW5CeXRlcyArIGxlbmd0aCAqIDE2YCBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gW2xlbmd0aEluQnl0ZXNdLgogICAqLwogIEZsb2F0NjR4Mkxpc3QgYXNGbG9hdDY0eDJMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtCeXRlRGF0YV0gX3ZpZXdfIG9mIGEgcmVnaW9uIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaGUgdmlldyBpcyBiYWNrZWQgYnkgdGhlIGJ5dGVzIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICogQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgYEJ5dGVEYXRhYCB3aWxsIGFsc28gY2hhbmdlIHRoZSBidWZmZXIsCiAgICogYW5kIHZpY2UgdmVyc2EuCiAgICoKICAgKiBUaGUgdmlld2VkIHJlZ2lvbiBzdGFydCBhdCBbb2Zmc2V0SW5CeXRlc10gYW5kIGNvbnRhaW5zIFtsZW5ndGhdIGJ5dGVzLgogICAqIElmIFtsZW5ndGhdIGlzIG9taXR0ZWQsIHRoZSByYW5nZSBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KICAgKgogICAqIFRoZSBzdGFydCBpbmRleCBhbmQgbGVuZ3RoIG11c3QgZGVzY3JpYmUgYSB2YWxpZCByYW5nZSBvZiB0aGUgYnVmZmVyOgogICAqCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBub3QgYmUgbmVnYXRpdmUsCiAgICogKiBgbGVuZ3RoYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwgYW5kCiAgICogKiBgb2Zmc2V0SW5CeXRlcyArIGxlbmd0aGAgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIFtsZW5ndGhJbkJ5dGVzXS4KICAgKi8KICBCeXRlRGF0YSBhc0J5dGVEYXRhKFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKTsKfQoKLyoqCiAqIEEgdHlwZWQgdmlldyBvZiBhIHNlcXVlbmNlIG9mIGJ5dGVzLgogKi8KYWJzdHJhY3QgY2xhc3MgVHlwZWREYXRhIHsKICAvKioKICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHJlcHJlc2VudGF0aW9uIG9mIGVhY2ggZWxlbWVudCBpbiB0aGlzCiAgICogbGlzdC4KICAgKi8KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlczsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgb2Zmc2V0IGluIGJ5dGVzIGludG8gdGhlIHVuZGVybHlpbmcgYnl0ZSBidWZmZXIgb2YgdGhpcyB2aWV3LgogICAqLwogIGludCBnZXQgb2Zmc2V0SW5CeXRlczsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoaXMgdmlldywgaW4gYnl0ZXMuCiAgICovCiAgaW50IGdldCBsZW5ndGhJbkJ5dGVzOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBieXRlIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuCiAgICovCiAgQnl0ZUJ1ZmZlciBnZXQgYnVmZmVyOwp9CgphYnN0cmFjdCBjbGFzcyBfVHlwZWRJbnRMaXN0IGV4dGVuZHMgVHlwZWREYXRhIHsKICAvKioKICAgKiBSZXR1cm5zIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoaXMgbGlzdCBhbmQgW290aGVyXS4KICAgKgogICAqIElmIG90aGVyIGlzIGFsc28gYSB0eXBlZC1kYXRhIGludGVnZXIgbGlzdCwgdGhlIHJldHVybmVkIGxpc3Qgd2lsbAogICAqIGJlIGEgdHlwZS1kYXRhIGludGVnZXIgbGlzdCBjYXBhYmxlIG9mIGNvbnRhaW5pbmcgYWxsIHRoZSBlbGVtZW50cyBvZgogICAqIHRoaXMgbGlzdCBhbmQgb2YgW290aGVyXS4KICAgKiBPdGhlcndpc2UgdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBhIG5vcm1hbCBncm93YWJsZSBgTGlzdDxpbnQ+YC4KICAgKi8KICBMaXN0PGludD4gb3BlcmF0b3IgKyhMaXN0PGludD4gb3RoZXIpOwp9CgphYnN0cmFjdCBjbGFzcyBfVHlwZWRGbG9hdExpc3QgZXh0ZW5kcyBUeXBlZERhdGEgewogIC8qKgogICAqIFJldHVybnMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhpcyBsaXN0IGFuZCBbb3RoZXJdLgogICAqCiAgICogSWYgb3RoZXIgaXMgYWxzbyBhIHR5cGVkLWRhdGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGxpc3QsCiAgICogdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBhIHR5cGUtZGF0YSBmbG9hdCBsaXN0IGNhcGFibGUgb2YgY29udGFpbmluZwogICAqIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhpcyBsaXN0IGFuZCBvZiBbb3RoZXJdLgogICAqIE90aGVyd2lzZSB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIGEgbm9ybWFsIGdyb3dhYmxlIGBMaXN0PGRvdWJsZT5gLgogICAqLwogIExpc3Q8ZG91YmxlPiBvcGVyYXRvciArKExpc3Q8ZG91YmxlPiBvdGhlcik7Cn0KCi8qKgogKiBEZXNjcmliZXMgZW5kaWFubmVzcyB0byBiZSB1c2VkIHdoZW4gYWNjZXNzaW5nIG9yIHVwZGF0aW5nIGEKICogc2VxdWVuY2Ugb2YgYnl0ZXMuCiAqLwpjbGFzcyBFbmRpYW4gewogIGZpbmFsIGJvb2wgX2xpdHRsZUVuZGlhbjsKICBjb25zdCBFbmRpYW4uXyh0aGlzLl9saXR0bGVFbmRpYW4pOwoKICBzdGF0aWMgY29uc3QgRW5kaWFuIGJpZyA9IGNvbnN0IEVuZGlhbi5fKGZhbHNlKTsKICBzdGF0aWMgY29uc3QgRW5kaWFuIGxpdHRsZSA9IGNvbnN0IEVuZGlhbi5fKHRydWUpOwogIHN0YXRpYyBmaW5hbCBFbmRpYW4gaG9zdCA9CiAgICAgIChuZXcgQnl0ZURhdGEudmlldyhuZXcgVWludDE2TGlzdC5mcm9tTGlzdChbMV0pLmJ1ZmZlcikpLmdldEludDgoMCkgPT0gMQogICAgICAgICAgPyBsaXR0bGUKICAgICAgICAgIDogYmlnOwp9CgovKioKICogQSBmaXhlZC1sZW5ndGgsIHJhbmRvbS1hY2Nlc3Mgc2VxdWVuY2Ugb2YgYnl0ZXMgdGhhdCBhbHNvIHByb3ZpZGVzIHJhbmRvbQogKiBhbmQgdW5hbGlnbmVkIGFjY2VzcyB0byB0aGUgZml4ZWQtd2lkdGggaW50ZWdlcnMgYW5kIGZsb2F0aW5nIHBvaW50CiAqIG51bWJlcnMgcmVwcmVzZW50ZWQgYnkgdGhvc2UgYnl0ZXMuCiAqCiAqIGBCeXRlRGF0YWAgbWF5IGJlIHVzZWQgdG8gcGFjayBhbmQgdW5wYWNrIGRhdGEgZnJvbSBleHRlcm5hbCBzb3VyY2VzCiAqIChzdWNoIGFzIG5ldHdvcmtzIG9yIGZpbGVzIHN5c3RlbXMpLCBhbmQgdG8gcHJvY2VzcyBsYXJnZSBxdWFudGl0aWVzCiAqIG9mIG51bWVyaWNhbCBkYXRhIG1vcmUgZWZmaWNpZW50bHkgdGhhbiB3b3VsZCBiZSBwb3NzaWJsZQogKiB3aXRoIG9yZGluYXJ5IFtMaXN0XSBpbXBsZW1lbnRhdGlvbnMuCiAqIGBCeXRlRGF0YWAgY2FuIHNhdmUgc3BhY2UsIGJ5IGVsaW1pbmF0aW5nIHRoZSBuZWVkIGZvciBvYmplY3QgaGVhZGVycywKICogYW5kIHRpbWUsIGJ5IGVsaW1pbmF0aW5nIHRoZSBuZWVkIGZvciBkYXRhIGNvcGllcy4KICogRmluYWxseSwgYEJ5dGVEYXRhYCBtYXkgYmUgdXNlZCB0byBpbnRlbnRpb25hbGx5IHJlaW50ZXJwcmV0IHRoZSBieXRlcwogKiByZXByZXNlbnRpbmcgb25lIGFyaXRobWV0aWMgdHlwZSBhcyBhbm90aGVyLgogKiBGb3IgZXhhbXBsZSB0aGlzIGNvZGUgZnJhZ21lbnQgZGV0ZXJtaW5lIHdoYXQgMzItYml0IHNpZ25lZCBpbnRlZ2VyCiAqIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBieXRlcyBvZiBhIDMyLWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXI6CiAqCiAqICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4TGlzdCg4KS5idWZmZXI7CiAqICAgICB2YXIgYmRhdGEgPSBuZXcgQnl0ZURhdGEudmlldyhidWZmZXIpOwogKiAgICAgYmRhdGEuc2V0RmxvYXQzMigwLCAzLjA0KTsKICogICAgIGludCBodWggPSBiZGF0YS5nZXRJbnQzMigwKTsKICovCmFic3RyYWN0IGNsYXNzIEJ5dGVEYXRhIGltcGxlbWVudHMgVHlwZWREYXRhIHsKICAvKioKICAgKiBDcmVhdGVzIGEgW0J5dGVEYXRhXSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLCBhbGwgb2YKICAgKiB3aG9zZSBieXRlcyBhcmUgaW5pdGlhbGx5IHplcm8uCiAgICovCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGV4dGVybmFsIGZhY3RvcnkgQnl0ZURhdGEoaW50IGxlbmd0aCk7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gW0J5dGVEYXRhXSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4gW2J1ZmZlcl0uCiAgICoKICAgKiBDaGFuZ2VzIGluIHRoZSBbQnl0ZURhdGFdIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgYnl0ZQogICAqIGJ1ZmZlciBhbmQgdmljZSB2ZXJzYS4KICAgKiBJZiB0aGUgW29mZnNldEluQnl0ZXNdIGluZGV4IG9mIHRoZSByZWdpb24gaXMgbm90IHNwZWNpZmllZCwKICAgKiBpdCBkZWZhdWx0cyB0byB6ZXJvICh0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgYnl0ZSBidWZmZXIpLgogICAqIElmIHRoZSBsZW5ndGggaXMgbm90IHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gYG51bGxgLAogICAqIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSB2aWV3IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBvciBbbGVuZ3RoXSBhcmUgbmVnYXRpdmUsIG9yCiAgICogaWYgW29mZnNldEluQnl0ZXNdICsgKFtsZW5ndGhdICogZWxlbWVudFNpemVJbkJ5dGVzKSBpcyBncmVhdGVyIHRoYW4KICAgKiB0aGUgbGVuZ3RoIG9mIFtidWZmZXJdLgogICAqLwogIGZhY3RvcnkgQnl0ZURhdGEudmlldyhCeXRlQnVmZmVyIGJ1ZmZlciwKICAgICAgW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIHJldHVybiBidWZmZXIuYXNCeXRlRGF0YShvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgKHBvc3NpYmx5IG5lZ2F0aXZlKSBpbnRlZ2VyIHJlcHJlc2VudGVkIGJ5IHRoZSBieXRlIGF0IHRoZQogICAqIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QsIGluIHR3bydzIGNvbXBsZW1lbnQgYmluYXJ5CiAgICogcmVwcmVzZW50YXRpb24uCiAgICoKICAgKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYmV0d2VlbiAtMTI4IGFuZCAxMjcsIGluY2x1c2l2ZS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgogICAqLwogIGludCBnZXRJbnQ4KGludCBieXRlT2Zmc2V0KTsKCiAgLyoqCiAgICogU2V0cyB0aGUgYnl0ZSBhdCB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdCB0byB0aGUKICAgKiB0d28ncyBjb21wbGVtZW50IGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIFt2YWx1ZV0sIHdoaWNoCiAgICogbXVzdCBmaXQgaW4gYSBzaW5nbGUgYnl0ZS4KICAgKgogICAqIEluIG90aGVyIHdvcmRzLCBbdmFsdWVdIG11c3QgYmUgYmV0d2VlbiAtMTI4IGFuZCAxMjcsIGluY2x1c2l2ZS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgogICAqLwogIHZvaWQgc2V0SW50OChpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcG9zaXRpdmUgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgYnl0ZSBhdCB0aGUgc3BlY2lmaWVkCiAgICogW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0LCBpbiB1bnNpZ25lZCBiaW5hcnkgZm9ybS4KICAgKgogICAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBiZXR3ZWVuIDAgYW5kIDI1NSwgaW5jbHVzaXZlLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCiAgICogZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgaW50IGdldFVpbnQ4KGludCBieXRlT2Zmc2V0KTsKCiAgLyoqCiAgICogU2V0cyB0aGUgYnl0ZSBhdCB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdCB0byB0aGUKICAgKiB1bnNpZ25lZCBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBbdmFsdWVdLCB3aGljaCBtdXN0IGZpdAogICAqIGluIGEgc2luZ2xlIGJ5dGUuCiAgICoKICAgKiBJbiBvdGhlciB3b3JkcywgW3ZhbHVlXSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMjU1LCBpbmNsdXNpdmUuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwKICAgKiBvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KICAgKi8KICB2b2lkIHNldFVpbnQ4KGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSAocG9zc2libHkgbmVnYXRpdmUpIGludGVnZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHR3byBieXRlcyBhdAogICAqIHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0LCBpbiB0d28ncyBjb21wbGVtZW50IGJpbmFyeQogICAqIGZvcm0uCiAgICoKICAgKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYmV0d2VlbiAtMjxzdXA+MTU8L3N1cD4gYW5kIDI8c3VwPjE1PC9zdXA+IC0gMSwKICAgKiBpbmNsdXNpdmUuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKICAgKiBgYnl0ZU9mZnNldCArIDJgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgogICAqLwogIGludCBnZXRJbnQxNihpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSk7CgogIC8qKgogICAqIFNldHMgdGhlIHR3byBieXRlcyBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzCiAgICogb2JqZWN0IHRvIHRoZSB0d28ncyBjb21wbGVtZW50IGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkCiAgICogW3ZhbHVlXSwgd2hpY2ggbXVzdCBmaXQgaW4gdHdvIGJ5dGVzLgogICAqCiAgICogSW4gb3RoZXIgd29yZHMsIFt2YWx1ZV0gbXVzdCBsaWUKICAgKiBiZXR3ZWVuIC0yPHN1cD4xNTwvc3VwPiBhbmQgMjxzdXA+MTU8L3N1cD4gLSAxLCBpbmNsdXNpdmUuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKICAgKiBgYnl0ZU9mZnNldCArIDJgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgogICAqLwogIHZvaWQgc2V0SW50MTYoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHBvc2l0aXZlIGludGVnZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHR3byBieXRlcyBzdGFydGluZwogICAqIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0LCBpbiB1bnNpZ25lZCBiaW5hcnkKICAgKiBmb3JtLgogICAqCiAgICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGJldHdlZW4gMCBhbmQgIDI8c3VwPjE2PC9zdXA+IC0gMSwgaW5jbHVzaXZlLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCiAgICogYGJ5dGVPZmZzZXQgKyAyYCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KICAgKi8KICBpbnQgZ2V0VWludDE2KGludCBieXRlT2Zmc2V0LCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKTsKCiAgLyoqCiAgICogU2V0cyB0aGUgdHdvIGJ5dGVzIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0CiAgICogdG8gdGhlIHVuc2lnbmVkIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIFt2YWx1ZV0sCiAgICogd2hpY2ggbXVzdCBmaXQgaW4gdHdvIGJ5dGVzLgogICAqCiAgICogSW4gb3RoZXIgd29yZHMsIFt2YWx1ZV0gbXVzdCBiZSBiZXR3ZWVuCiAgICogMCBhbmQgMjxzdXA+MTY8L3N1cD4gLSAxLCBpbmNsdXNpdmUuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKICAgKiBgYnl0ZU9mZnNldCArIDJgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgogICAqLwogIHZvaWQgc2V0VWludDE2KGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSAocG9zc2libHkgbmVnYXRpdmUpIGludGVnZXIgcmVwcmVzZW50ZWQgYnkgdGhlIGZvdXIgYnl0ZXMgYXQKICAgKiB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdCwgaW4gdHdvJ3MgY29tcGxlbWVudCBiaW5hcnkKICAgKiBmb3JtLgogICAqCiAgICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGJldHdlZW4gLTI8c3VwPjMxPC9zdXA+IGFuZCAyPHN1cD4zMTwvc3VwPiAtIDEsCiAgICogaW5jbHVzaXZlLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCiAgICogYGJ5dGVPZmZzZXQgKyA0YCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KICAgKi8KICBpbnQgZ2V0SW50MzIoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pOwoKICAvKioKICAgKiBTZXRzIHRoZSBmb3VyIGJ5dGVzIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMKICAgKiBvYmplY3QgdG8gdGhlIHR3bydzIGNvbXBsZW1lbnQgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQKICAgKiBbdmFsdWVdLCB3aGljaCBtdXN0IGZpdCBpbiBmb3VyIGJ5dGVzLgogICAqCiAgICogSW4gb3RoZXIgd29yZHMsIFt2YWx1ZV0gbXVzdCBsaWUKICAgKiBiZXR3ZWVuIC0yPHN1cD4zMTwvc3VwPiBhbmQgMjxzdXA+MzE8L3N1cD4gLSAxLCBpbmNsdXNpdmUuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKICAgKiBgYnl0ZU9mZnNldCArIDRgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgogICAqLwogIHZvaWQgc2V0SW50MzIoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHBvc2l0aXZlIGludGVnZXIgcmVwcmVzZW50ZWQgYnkgdGhlIGZvdXIgYnl0ZXMgc3RhcnRpbmcKICAgKiBhdCB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdCwgaW4gdW5zaWduZWQgYmluYXJ5CiAgICogZm9ybS4KICAgKgogICAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBiZXR3ZWVuIDAgYW5kICAyPHN1cD4zMjwvc3VwPiAtIDEsIGluY2x1c2l2ZS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGBieXRlT2Zmc2V0ICsgNGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgaW50IGdldFVpbnQzMihpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSk7CgogIC8qKgogICAqIFNldHMgdGhlIGZvdXIgYnl0ZXMgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QKICAgKiB0byB0aGUgdW5zaWduZWQgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgW3ZhbHVlXSwKICAgKiB3aGljaCBtdXN0IGZpdCBpbiBmb3VyIGJ5dGVzLgogICAqCiAgICogSW4gb3RoZXIgd29yZHMsIFt2YWx1ZV0gbXVzdCBiZSBiZXR3ZWVuCiAgICogMCBhbmQgMjxzdXA+MzI8L3N1cD4gLSAxLCBpbmNsdXNpdmUuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKICAgKiBgYnl0ZU9mZnNldCArIDRgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgogICAqLwogIHZvaWQgc2V0VWludDMyKGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSAocG9zc2libHkgbmVnYXRpdmUpIGludGVnZXIgcmVwcmVzZW50ZWQgYnkgdGhlIGVpZ2h0IGJ5dGVzIGF0CiAgICogdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QsIGluIHR3bydzIGNvbXBsZW1lbnQgYmluYXJ5CiAgICogZm9ybS4KICAgKgogICAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBiZXR3ZWVuIC0yPHN1cD42Mzwvc3VwPiBhbmQgMjxzdXA+NjM8L3N1cD4gLSAxLAogICAqIGluY2x1c2l2ZS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGBieXRlT2Zmc2V0ICsgOGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgaW50IGdldEludDY0KGludCBieXRlT2Zmc2V0LCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKTsKCiAgLyoqCiAgICogU2V0cyB0aGUgZWlnaHQgYnl0ZXMgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcwogICAqIG9iamVjdCB0byB0aGUgdHdvJ3MgY29tcGxlbWVudCBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZAogICAqIFt2YWx1ZV0sIHdoaWNoIG11c3QgZml0IGluIGVpZ2h0IGJ5dGVzLgogICAqCiAgICogSW4gb3RoZXIgd29yZHMsIFt2YWx1ZV0gbXVzdCBsaWUKICAgKiBiZXR3ZWVuIC0yPHN1cD42Mzwvc3VwPiBhbmQgMjxzdXA+NjM8L3N1cD4gLSAxLCBpbmNsdXNpdmUuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKICAgKiBgYnl0ZU9mZnNldCArIDhgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgogICAqLwogIHZvaWQgc2V0SW50NjQoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHBvc2l0aXZlIGludGVnZXIgcmVwcmVzZW50ZWQgYnkgdGhlIGVpZ2h0IGJ5dGVzIHN0YXJ0aW5nCiAgICogYXQgdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QsIGluIHVuc2lnbmVkIGJpbmFyeQogICAqIGZvcm0uCiAgICoKICAgKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYmV0d2VlbiAwIGFuZCAgMjxzdXA+NjQ8L3N1cD4gLSAxLCBpbmNsdXNpdmUuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKICAgKiBgYnl0ZU9mZnNldCArIDhgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgogICAqLwogIGludCBnZXRVaW50NjQoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pOwoKICAvKioKICAgKiBTZXRzIHRoZSBlaWdodCBieXRlcyBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdAogICAqIHRvIHRoZSB1bnNpZ25lZCBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBbdmFsdWVdLAogICAqIHdoaWNoIG11c3QgZml0IGluIGVpZ2h0IGJ5dGVzLgogICAqCiAgICogSW4gb3RoZXIgd29yZHMsIFt2YWx1ZV0gbXVzdCBiZSBiZXR3ZWVuCiAgICogMCBhbmQgMjxzdXA+NjQ8L3N1cD4gLSAxLCBpbmNsdXNpdmUuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKICAgKiBgYnl0ZU9mZnNldCArIDhgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgogICAqLwogIHZvaWQgc2V0VWludDY0KGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBmbG9hdGluZyBwb2ludCBudW1iZXIgcmVwcmVzZW50ZWQgYnkgdGhlIGZvdXIgYnl0ZXMgYXQKICAgKiB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdCwgaW4gSUVFRSA3NTQKICAgKiBzaW5nbGUtcHJlY2lzaW9uIGJpbmFyeSBmbG9hdGluZy1wb2ludCBmb3JtYXQgKGJpbmFyeTMyKS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGBieXRlT2Zmc2V0ICsgNGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgZG91YmxlIGdldEZsb2F0MzIoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pOwoKICAvKioKICAgKiBTZXRzIHRoZSBmb3VyIGJ5dGVzIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMKICAgKiBvYmplY3QgdG8gdGhlIElFRUUgNzU0IHNpbmdsZS1wcmVjaXNpb24gYmluYXJ5IGZsb2F0aW5nLXBvaW50CiAgICogKGJpbmFyeTMyKSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIFt2YWx1ZV0uCiAgICoKICAgKiAqKk5vdGUgdGhhdCB0aGlzIG1ldGhvZCBjYW4gbG9zZSBwcmVjaXNpb24uKiogVGhlIGlucHV0IFt2YWx1ZV0gaXMKICAgKiBhIDY0LWJpdCBmbG9hdGluZyBwb2ludCB2YWx1ZSwgd2hpY2ggd2lsbCBiZSBjb252ZXJ0ZWQgdG8gMzItYml0CiAgICogZmxvYXRpbmcgcG9pbnQgdmFsdWUgYnkgSUVFRSA3NTQgcm91bmRpbmcgcnVsZXMgYmVmb3JlIGl0IGlzIHN0b3JlZC4KICAgKiBJZiBbdmFsdWVdIGNhbm5vdCBiZSByZXByZXNlbnRlZCBleGFjdGx5IGFzIGEgYmluYXJ5MzIsIGl0IHdpbGwgYmUKICAgKiBjb252ZXJ0ZWQgdG8gdGhlIG5lYXJlc3QgYmluYXJ5MzIgdmFsdWUuICBJZiB0d28gYmluYXJ5MzIgdmFsdWVzIGFyZQogICAqIGVxdWFsbHkgY2xvc2UsIHRoZSBvbmUgd2hvc2UgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IGlzIHplcm8gd2lsbCBiZSB1c2VkLgogICAqIE5vdGUgdGhhdCBmaW5pdGUgKGJ1dCBsYXJnZSkgdmFsdWVzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gaW5maW5pdHksIGFuZAogICAqIHNtYWxsIG5vbi16ZXJvIHZhbHVlcyBjYW4gYmUgY29udmVydGVkIHRvIHplcm8uCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKICAgKiBgYnl0ZU9mZnNldCArIDRgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgogICAqLwogIHZvaWQgc2V0RmxvYXQzMihpbnQgYnl0ZU9mZnNldCwgZG91YmxlIHZhbHVlLCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHJlcHJlc2VudGVkIGJ5IHRoZSBlaWdodCBieXRlcyBhdAogICAqIHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0LCBpbiBJRUVFIDc1NAogICAqIGRvdWJsZS1wcmVjaXNpb24gYmluYXJ5IGZsb2F0aW5nLXBvaW50IGZvcm1hdCAoYmluYXJ5NjQpLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCiAgICogYGJ5dGVPZmZzZXQgKyA4YCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KICAgKi8KICBkb3VibGUgZ2V0RmxvYXQ2NChpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSk7CgogIC8qKgogICAqIFNldHMgdGhlIGVpZ2h0IGJ5dGVzIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMKICAgKiBvYmplY3QgdG8gdGhlIElFRUUgNzU0IGRvdWJsZS1wcmVjaXNpb24gYmluYXJ5IGZsb2F0aW5nLXBvaW50CiAgICogKGJpbmFyeTY0KSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIFt2YWx1ZV0uCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKICAgKiBgYnl0ZU9mZnNldCArIDhgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgogICAqLwogIHZvaWQgc2V0RmxvYXQ2NChpbnQgYnl0ZU9mZnNldCwgZG91YmxlIHZhbHVlLCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKTsKfQoKLyoqCiAqIEEgZml4ZWQtbGVuZ3RoIGxpc3Qgb2YgOC1iaXQgc2lnbmVkIGludGVnZXJzLgogKgogKiBGb3IgbG9uZyBsaXN0cywgdGhpcyBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgY29uc2lkZXJhYmx5CiAqIG1vcmUgc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KICoKICogSW50ZWdlcnMgc3RvcmVkIGluIHRoZSBsaXN0IGFyZSB0cnVuY2F0ZWQgdG8gdGhlaXIgbG93IGVpZ2h0IGJpdHMsCiAqIGludGVycHJldGVkIGFzIGEgc2lnbmVkIDgtYml0IHR3bydzIGNvbXBsZW1lbnQgaW50ZWdlciB3aXRoIHZhbHVlcyBpbiB0aGUKICogcmFuZ2UgLTEyOCB0byArMTI3LgogKi8KYWJzdHJhY3QgY2xhc3MgSW50OExpc3QgaW1wbGVtZW50cyBMaXN0PGludD4sIF9UeXBlZEludExpc3QgewogIC8qKgogICAqIENyZWF0ZXMgYW4gW0ludDhMaXN0XSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLCBhbGwgb2YKICAgKiB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IHplcm8uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBJbnQ4TGlzdChpbnQgbGVuZ3RoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtJbnQ4TGlzdF0gd2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIFtlbGVtZW50c10gbGlzdAogICAqIGFuZCBjb3BpZXMgb3ZlciB0aGUgZWxlbWVudHMuCiAgICoKICAgKiBWYWx1ZXMgYXJlIHRydW5jYXRlZCB0byBmaXQgaW4gdGhlIGxpc3Qgd2hlbiB0aGV5IGFyZSBjb3BpZWQsCiAgICogdGhlIHNhbWUgd2F5IHN0b3JpbmcgdmFsdWVzIHRydW5jYXRlcyB0aGVtLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgSW50OExpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBbSW50OExpc3RdIF92aWV3XyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBpbiBbYnVmZmVyXS4KICAgKgogICAqIENoYW5nZXMgaW4gdGhlIFtJbnQ4TGlzdF0gd2lsbCBiZSB2aXNpYmxlIGluIHRoZSBieXRlCiAgICogYnVmZmVyIGFuZCB2aWNlIHZlcnNhLgogICAqIElmIHRoZSBbb2Zmc2V0SW5CeXRlc10gaW5kZXggb2YgdGhlIHJlZ2lvbiBpcyBub3Qgc3BlY2lmaWVkLAogICAqIGl0IGRlZmF1bHRzIHRvIHplcm8gKHRoZSBmaXJzdCBieXRlIGluIHRoZSBieXRlIGJ1ZmZlcikuCiAgICogSWYgdGhlIGxlbmd0aCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBgbnVsbGAsCiAgICogd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHZpZXcgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIG9yIFtsZW5ndGhdIGFyZSBuZWdhdGl2ZSwgb3IKICAgKiBpZiBbb2Zmc2V0SW5CeXRlc10gKyAoW2xlbmd0aF0gKiBlbGVtZW50U2l6ZUluQnl0ZXMpIGlzIGdyZWF0ZXIgdGhhbgogICAqIHRoZSBsZW5ndGggb2YgW2J1ZmZlcl0uCiAgICovCiAgZmFjdG9yeSBJbnQ4TGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAogICAgICBbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgcmV0dXJuIGJ1ZmZlci5hc0ludDhMaXN0KG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICBzdGF0aWMgY29uc3QgaW50IGJ5dGVzUGVyRWxlbWVudCA9IDE7Cn0KCi8qKgogKiBBIGZpeGVkLWxlbmd0aCBsaXN0IG9mIDgtYml0IHVuc2lnbmVkIGludGVnZXJzLgogKgogKiBGb3IgbG9uZyBsaXN0cywgdGhpcyBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgY29uc2lkZXJhYmx5CiAqIG1vcmUgc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KICoKICogSW50ZWdlcnMgc3RvcmVkIGluIHRoZSBsaXN0IGFyZSB0cnVuY2F0ZWQgdG8gdGhlaXIgbG93IGVpZ2h0IGJpdHMsCiAqIGludGVycHJldGVkIGFzIGFuIHVuc2lnbmVkIDgtYml0IGludGVnZXIgd2l0aCB2YWx1ZXMgaW4gdGhlCiAqIHJhbmdlIDAgdG8gMjU1LgogKi8KYWJzdHJhY3QgY2xhc3MgVWludDhMaXN0IGltcGxlbWVudHMgTGlzdDxpbnQ+LCBfVHlwZWRJbnRMaXN0IHsKICAvKioKICAgKiBDcmVhdGVzIGEgW1VpbnQ4TGlzdF0gb2YgdGhlIHNwZWNpZmllZCBsZW5ndGggKGluIGVsZW1lbnRzKSwgYWxsIG9mCiAgICogd2hvc2UgZWxlbWVudHMgYXJlIGluaXRpYWxseSB6ZXJvLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgVWludDhMaXN0KGludCBsZW5ndGgpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW1VpbnQ4TGlzdF0gd2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIFtlbGVtZW50c10gbGlzdAogICAqIGFuZCBjb3BpZXMgb3ZlciB0aGUgZWxlbWVudHMuCiAgICoKICAgKiBWYWx1ZXMgYXJlIHRydW5jYXRlZCB0byBmaXQgaW4gdGhlIGxpc3Qgd2hlbiB0aGV5IGFyZSBjb3BpZWQsCiAgICogdGhlIHNhbWUgd2F5IHN0b3JpbmcgdmFsdWVzIHRydW5jYXRlcyB0aGVtLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgVWludDhMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cyk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbVWludDhMaXN0XSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4gW2J1ZmZlcl0uCiAgICoKICAgKiBDaGFuZ2VzIGluIHRoZSBbVWludDhMaXN0XSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUKICAgKiBidWZmZXIgYW5kIHZpY2UgdmVyc2EuCiAgICogSWYgdGhlIFtvZmZzZXRJbkJ5dGVzXSBpbmRleCBvZiB0aGUgcmVnaW9uIGlzIG5vdCBzcGVjaWZpZWQsCiAgICogaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGBudWxsYCwKICAgKiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gb3IgW2xlbmd0aF0gYXJlIG5lZ2F0aXZlLCBvcgogICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCiAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KICAgKi8KICBmYWN0b3J5IFVpbnQ4TGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAogICAgICBbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgcmV0dXJuIGJ1ZmZlci5hc1VpbnQ4TGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhIGNvbmNhdGVuYXRpb24gb2YgdGhpcyBsaXN0IGFuZCBbb3RoZXJdLgogICAqCiAgICogSWYgW290aGVyXSBpcyBhbHNvIGEgdHlwZWQtZGF0YSBsaXN0LCB0aGVuIHRoZSByZXR1cm4gbGlzdCB3aWxsIGJlIGEKICAgKiB0eXBlZCBkYXRhIGxpc3QgY2FwYWJsZSBvZiBob2xkaW5nIGJvdGggdW5zaWduZWQgOC1iaXQgaW50ZWdlcnMgYW5kCiAgICogdGhlIGVsZW1lbnRzIG9mIFtvdGhlcl0sIG90aGVyd2lzZSBpdCdsbCBiZSBhIG5vcm1hbCBsaXN0IG9mIGludGVnZXJzLgogICAqLwogIExpc3Q8aW50PiBvcGVyYXRvciArKExpc3Q8aW50PiBvdGhlcik7CgogIHN0YXRpYyBjb25zdCBpbnQgYnl0ZXNQZXJFbGVtZW50ID0gMTsKfQoKLyoqCiAqIEEgZml4ZWQtbGVuZ3RoIGxpc3Qgb2YgOC1iaXQgdW5zaWduZWQgaW50ZWdlcnMuCiAqCiAqIEZvciBsb25nIGxpc3RzLCB0aGlzIGltcGxlbWVudGF0aW9uIGNhbiBiZSBjb25zaWRlcmFibHkKICogbW9yZSBzcGFjZS0gYW5kIHRpbWUtZWZmaWNpZW50IHRoYW4gdGhlIGRlZmF1bHQgW0xpc3RdIGltcGxlbWVudGF0aW9uLgogKgogKiBJbnRlZ2VycyBzdG9yZWQgaW4gdGhlIGxpc3QgYXJlIGNsYW1wZWQgdG8gYW4gdW5zaWduZWQgZWlnaHQgYml0IHZhbHVlLgogKiBUaGF0IGlzLCBhbGwgdmFsdWVzIGJlbG93IHplcm8gYXJlIHN0b3JlZCBhcyB6ZXJvCiAqIGFuZCBhbGwgdmFsdWVzIGFib3ZlIDI1NSBhcmUgc3RvcmVkIGFzIDI1NS4KICovCmFic3RyYWN0IGNsYXNzIFVpbnQ4Q2xhbXBlZExpc3QgaW1wbGVtZW50cyBMaXN0PGludD4sIF9UeXBlZEludExpc3QgewogIC8qKgogICAqIENyZWF0ZXMgYSBbVWludDhDbGFtcGVkTGlzdF0gb2YgdGhlIHNwZWNpZmllZCBsZW5ndGggKGluIGVsZW1lbnRzKSwgYWxsIG9mCiAgICogd2hvc2UgZWxlbWVudHMgYXJlIGluaXRpYWxseSB6ZXJvLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgVWludDhDbGFtcGVkTGlzdChpbnQgbGVuZ3RoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtVaW50OENsYW1wZWRMaXN0XSBvZiB0aGUgc2FtZSBzaXplIGFzIHRoZSBbZWxlbWVudHNdCiAgICogbGlzdCBhbmQgY29waWVzIG92ZXIgdGhlIHZhbHVlcyBjbGFtcGluZyB3aGVuIG5lZWRlZC4KICAgKgogICAqIFZhbHVlcyBhcmUgY2xhbXBlZCB0byBmaXQgaW4gdGhlIGxpc3Qgd2hlbiB0aGV5IGFyZSBjb3BpZWQsCiAgICogdGhlIHNhbWUgd2F5IHN0b3JpbmcgdmFsdWVzIGNsYW1wcyB0aGVtLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgVWludDhDbGFtcGVkTGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW1VpbnQ4Q2xhbXBlZExpc3RdIF92aWV3XyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBpbiB0aGUKICAgKiBzcGVjaWZpZWQgYnl0ZSBbYnVmZmVyXS4KICAgKgogICAqIENoYW5nZXMgaW4gdGhlIFtVaW50OExpc3RdIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgYnl0ZSBidWZmZXIKICAgKiBhbmQgdmljZSB2ZXJzYS4KICAgKiBJZiB0aGUgW29mZnNldEluQnl0ZXNdIGluZGV4IG9mIHRoZSByZWdpb24gaXMgbm90IHNwZWNpZmllZCwKICAgKiBpdCBkZWZhdWx0cyB0byB6ZXJvICh0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgYnl0ZSBidWZmZXIpLgogICAqIElmIHRoZSBsZW5ndGggaXMgbm90IHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gYG51bGxgLAogICAqIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSB2aWV3IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBvciBbbGVuZ3RoXSBhcmUgbmVnYXRpdmUsIG9yCiAgICogaWYgW29mZnNldEluQnl0ZXNdICsgKFtsZW5ndGhdICogZWxlbWVudFNpemVJbkJ5dGVzKSBpcyBncmVhdGVyIHRoYW4KICAgKiB0aGUgbGVuZ3RoIG9mIFtidWZmZXJdLgogICAqLwogIGZhY3RvcnkgVWludDhDbGFtcGVkTGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAogICAgICBbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgcmV0dXJuIGJ1ZmZlci5hc1VpbnQ4Q2xhbXBlZExpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIHN0YXRpYyBjb25zdCBpbnQgYnl0ZXNQZXJFbGVtZW50ID0gMTsKfQoKLyoqCiAqIEEgZml4ZWQtbGVuZ3RoIGxpc3Qgb2YgMTYtYml0IHNpZ25lZCBpbnRlZ2VycyB0aGF0IGlzIHZpZXdhYmxlIGFzIGEKICogW1R5cGVkRGF0YV0uCiAqCiAqIEZvciBsb25nIGxpc3RzLCB0aGlzIGltcGxlbWVudGF0aW9uIGNhbiBiZSBjb25zaWRlcmFibHkKICogbW9yZSBzcGFjZS0gYW5kIHRpbWUtZWZmaWNpZW50IHRoYW4gdGhlIGRlZmF1bHQgW0xpc3RdIGltcGxlbWVudGF0aW9uLgogKgogKiBJbnRlZ2VycyBzdG9yZWQgaW4gdGhlIGxpc3QgYXJlIHRydW5jYXRlZCB0byB0aGVpciBsb3cgMTYgYml0cywKICogaW50ZXJwcmV0ZWQgYXMgYSBzaWduZWQgMTYtYml0IHR3bydzIGNvbXBsZW1lbnQgaW50ZWdlciB3aXRoIHZhbHVlcyBpbiB0aGUKICogcmFuZ2UgLTMyNzY4IHRvICszMjc2Ny4KICovCmFic3RyYWN0IGNsYXNzIEludDE2TGlzdCBpbXBsZW1lbnRzIExpc3Q8aW50PiwgX1R5cGVkSW50TGlzdCB7CiAgLyoqCiAgICogQ3JlYXRlcyBhbiBbSW50MTZMaXN0XSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLCBhbGwgb2YKICAgKiB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IHplcm8uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBJbnQxNkxpc3QoaW50IGxlbmd0aCk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbSW50MTZMaXN0XSB3aXRoIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgW2VsZW1lbnRzXSBsaXN0CiAgICogYW5kIGNvcGllcyBvdmVyIHRoZSBlbGVtZW50cy4KICAgKgogICAqIFZhbHVlcyBhcmUgdHJ1bmNhdGVkIHRvIGZpdCBpbiB0aGUgbGlzdCB3aGVuIHRoZXkgYXJlIGNvcGllZCwKICAgKiB0aGUgc2FtZSB3YXkgc3RvcmluZyB2YWx1ZXMgdHJ1bmNhdGVzIHRoZW0uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBJbnQxNkxpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBbSW50MTZMaXN0XSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4gW2J1ZmZlcl0uCiAgICoKICAgKiBDaGFuZ2VzIGluIHRoZSBbSW50MTZMaXN0XSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUKICAgKiBidWZmZXIgYW5kIHZpY2UgdmVyc2EuCiAgICogSWYgdGhlIFtvZmZzZXRJbkJ5dGVzXSBpbmRleCBvZiB0aGUgcmVnaW9uIGlzIG5vdCBzcGVjaWZpZWQsCiAgICogaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGBudWxsYCwKICAgKiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gb3IgW2xlbmd0aF0gYXJlIG5lZ2F0aXZlLCBvcgogICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCiAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KICAgKgogICAqIFRocm93cyBbQXJndW1lbnRFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIGlzIG5vdCBhIG11bHRpcGxlIG9mCiAgICogW2J5dGVzUGVyRWxlbWVudF0uCiAgICovCiAgZmFjdG9yeSBJbnQxNkxpc3QudmlldyhCeXRlQnVmZmVyIGJ1ZmZlciwKICAgICAgW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIHJldHVybiBidWZmZXIuYXNJbnQxNkxpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIHN0YXRpYyBjb25zdCBpbnQgYnl0ZXNQZXJFbGVtZW50ID0gMjsKfQoKLyoqCiAqIEEgZml4ZWQtbGVuZ3RoIGxpc3Qgb2YgMTYtYml0IHVuc2lnbmVkIGludGVnZXJzIHRoYXQgaXMgdmlld2FibGUgYXMgYQogKiBbVHlwZWREYXRhXS4KICoKICogRm9yIGxvbmcgbGlzdHMsIHRoaXMgaW1wbGVtZW50YXRpb24gY2FuIGJlIGNvbnNpZGVyYWJseQogKiBtb3JlIHNwYWNlLSBhbmQgdGltZS1lZmZpY2llbnQgdGhhbiB0aGUgZGVmYXVsdCBbTGlzdF0gaW1wbGVtZW50YXRpb24uCiAqCiAqIEludGVnZXJzIHN0b3JlZCBpbiB0aGUgbGlzdCBhcmUgdHJ1bmNhdGVkIHRvIHRoZWlyIGxvdyAxNiBiaXRzLAogKiBpbnRlcnByZXRlZCBhcyBhbiB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlciB3aXRoIHZhbHVlcyBpbiB0aGUKICogcmFuZ2UgMCB0byA2NTUzNS4KICovCmFic3RyYWN0IGNsYXNzIFVpbnQxNkxpc3QgaW1wbGVtZW50cyBMaXN0PGludD4sIF9UeXBlZEludExpc3QgewogIC8qKgogICAqIENyZWF0ZXMgYSBbVWludDE2TGlzdF0gb2YgdGhlIHNwZWNpZmllZCBsZW5ndGggKGluIGVsZW1lbnRzKSwgYWxsCiAgICogb2Ygd2hvc2UgZWxlbWVudHMgYXJlIGluaXRpYWxseSB6ZXJvLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgVWludDE2TGlzdChpbnQgbGVuZ3RoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtVaW50MTZMaXN0XSB3aXRoIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgW2VsZW1lbnRzXSBsaXN0CiAgICogYW5kIGNvcGllcyBvdmVyIHRoZSBlbGVtZW50cy4KICAgKgogICAqIFZhbHVlcyBhcmUgdHJ1bmNhdGVkIHRvIGZpdCBpbiB0aGUgbGlzdCB3aGVuIHRoZXkgYXJlIGNvcGllZCwKICAgKiB0aGUgc2FtZSB3YXkgc3RvcmluZyB2YWx1ZXMgdHJ1bmNhdGVzIHRoZW0uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBVaW50MTZMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cyk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbVWludDE2TGlzdF0gX3ZpZXdfIG9mIHRoZSBzcGVjaWZpZWQgcmVnaW9uIGluCiAgICogdGhlIHNwZWNpZmllZCBieXRlIGJ1ZmZlci4KICAgKgogICAqIENoYW5nZXMgaW4gdGhlIFtVaW50MTZMaXN0XSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUgYnVmZmVyCiAgICogYW5kIHZpY2UgdmVyc2EuCiAgICogSWYgdGhlIFtvZmZzZXRJbkJ5dGVzXSBpbmRleCBvZiB0aGUgcmVnaW9uIGlzIG5vdCBzcGVjaWZpZWQsCiAgICogaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGBudWxsYCwKICAgKiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gb3IgW2xlbmd0aF0gYXJlIG5lZ2F0aXZlLCBvcgogICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCiAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KICAgKgogICAqIFRocm93cyBbQXJndW1lbnRFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIGlzIG5vdCBhIG11bHRpcGxlIG9mCiAgICogW2J5dGVzUGVyRWxlbWVudF0uCiAgICovCiAgZmFjdG9yeSBVaW50MTZMaXN0LnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsCiAgICAgIFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICByZXR1cm4gYnVmZmVyLmFzVWludDE2TGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgc3RhdGljIGNvbnN0IGludCBieXRlc1BlckVsZW1lbnQgPSAyOwp9CgovKioKICogQSBmaXhlZC1sZW5ndGggbGlzdCBvZiAzMi1iaXQgc2lnbmVkIGludGVnZXJzIHRoYXQgaXMgdmlld2FibGUgYXMgYQogKiBbVHlwZWREYXRhXS4KICoKICogRm9yIGxvbmcgbGlzdHMsIHRoaXMgaW1wbGVtZW50YXRpb24gY2FuIGJlIGNvbnNpZGVyYWJseQogKiBtb3JlIHNwYWNlLSBhbmQgdGltZS1lZmZpY2llbnQgdGhhbiB0aGUgZGVmYXVsdCBbTGlzdF0gaW1wbGVtZW50YXRpb24uCiAqCiAqIEludGVnZXJzIHN0b3JlZCBpbiB0aGUgbGlzdCBhcmUgdHJ1bmNhdGVkIHRvIHRoZWlyIGxvdyAzMiBiaXRzLAogKiBpbnRlcnByZXRlZCBhcyBhIHNpZ25lZCAzMi1iaXQgdHdvJ3MgY29tcGxlbWVudCBpbnRlZ2VyIHdpdGggdmFsdWVzIGluIHRoZQogKiByYW5nZSAtMjE0NzQ4MzY0OCB0byAyMTQ3NDgzNjQ3LgogKi8KYWJzdHJhY3QgY2xhc3MgSW50MzJMaXN0IGltcGxlbWVudHMgTGlzdDxpbnQ+LCBfVHlwZWRJbnRMaXN0IHsKICAvKioKICAgKiBDcmVhdGVzIGFuIFtJbnQzMkxpc3RdIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIChpbiBlbGVtZW50cyksIGFsbCBvZgogICAqIHdob3NlIGVsZW1lbnRzIGFyZSBpbml0aWFsbHkgemVyby4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IEludDMyTGlzdChpbnQgbGVuZ3RoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtJbnQzMkxpc3RdIHdpdGggdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBbZWxlbWVudHNdIGxpc3QKICAgKiBhbmQgY29waWVzIG92ZXIgdGhlIGVsZW1lbnRzLgogICAqCiAgICogVmFsdWVzIGFyZSB0cnVuY2F0ZWQgdG8gZml0IGluIHRoZSBsaXN0IHdoZW4gdGhleSBhcmUgY29waWVkLAogICAqIHRoZSBzYW1lIHdheSBzdG9yaW5nIHZhbHVlcyB0cnVuY2F0ZXMgdGhlbS4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IEludDMyTGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpOwoKICAvKioKICAgKiBDcmVhdGVzIGFuIFtJbnQzMkxpc3RdIF92aWV3XyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBpbiBbYnVmZmVyXS4KICAgKgogICAqIENoYW5nZXMgaW4gdGhlIFtJbnQzMkxpc3RdIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgYnl0ZQogICAqIGJ1ZmZlciBhbmQgdmljZSB2ZXJzYS4KICAgKiBJZiB0aGUgW29mZnNldEluQnl0ZXNdIGluZGV4IG9mIHRoZSByZWdpb24gaXMgbm90IHNwZWNpZmllZCwKICAgKiBpdCBkZWZhdWx0cyB0byB6ZXJvICh0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgYnl0ZSBidWZmZXIpLgogICAqIElmIHRoZSBsZW5ndGggaXMgbm90IHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gYG51bGxgLAogICAqIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSB2aWV3IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBvciBbbGVuZ3RoXSBhcmUgbmVnYXRpdmUsIG9yCiAgICogaWYgW29mZnNldEluQnl0ZXNdICsgKFtsZW5ndGhdICogZWxlbWVudFNpemVJbkJ5dGVzKSBpcyBncmVhdGVyIHRoYW4KICAgKiB0aGUgbGVuZ3RoIG9mIFtidWZmZXJdLgogICAqCiAgICogVGhyb3dzIFtBcmd1bWVudEVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gaXMgbm90IGEgbXVsdGlwbGUgb2YKICAgKiBbYnl0ZXNQZXJFbGVtZW50XS4KICAgKi8KICBmYWN0b3J5IEludDMyTGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAogICAgICBbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgcmV0dXJuIGJ1ZmZlci5hc0ludDMyTGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgc3RhdGljIGNvbnN0IGludCBieXRlc1BlckVsZW1lbnQgPSA0Owp9CgovKioKICogQSBmaXhlZC1sZW5ndGggbGlzdCBvZiAzMi1iaXQgdW5zaWduZWQgaW50ZWdlcnMgdGhhdCBpcyB2aWV3YWJsZSBhcyBhCiAqIFtUeXBlZERhdGFdLgogKgogKiBGb3IgbG9uZyBsaXN0cywgdGhpcyBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgY29uc2lkZXJhYmx5CiAqIG1vcmUgc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KICoKICogSW50ZWdlcnMgc3RvcmVkIGluIHRoZSBsaXN0IGFyZSB0cnVuY2F0ZWQgdG8gdGhlaXIgbG93IDMyIGJpdHMsCiAqIGludGVycHJldGVkIGFzIGFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHdpdGggdmFsdWVzIGluIHRoZQogKiByYW5nZSAwIHRvIDQyOTQ5NjcyOTUuCiAqLwphYnN0cmFjdCBjbGFzcyBVaW50MzJMaXN0IGltcGxlbWVudHMgTGlzdDxpbnQ+LCBfVHlwZWRJbnRMaXN0IHsKICAvKioKICAgKiBDcmVhdGVzIGEgW1VpbnQzMkxpc3RdIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIChpbiBlbGVtZW50cyksIGFsbAogICAqIG9mIHdob3NlIGVsZW1lbnRzIGFyZSBpbml0aWFsbHkgemVyby4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IFVpbnQzMkxpc3QoaW50IGxlbmd0aCk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbVWludDMyTGlzdF0gd2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIFtlbGVtZW50c10gbGlzdAogICAqIGFuZCBjb3BpZXMgb3ZlciB0aGUgZWxlbWVudHMuCiAgICoKICAgKiBWYWx1ZXMgYXJlIHRydW5jYXRlZCB0byBmaXQgaW4gdGhlIGxpc3Qgd2hlbiB0aGV5IGFyZSBjb3BpZWQsCiAgICogdGhlIHNhbWUgd2F5IHN0b3JpbmcgdmFsdWVzIHRydW5jYXRlcyB0aGVtLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgVWludDMyTGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW1VpbnQzMkxpc3RdIF92aWV3XyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBpbgogICAqIHRoZSBzcGVjaWZpZWQgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBDaGFuZ2VzIGluIHRoZSBbVWludDMyTGlzdF0gd2lsbCBiZSB2aXNpYmxlIGluIHRoZSBieXRlIGJ1ZmZlcgogICAqIGFuZCB2aWNlIHZlcnNhLgogICAqIElmIHRoZSBbb2Zmc2V0SW5CeXRlc10gaW5kZXggb2YgdGhlIHJlZ2lvbiBpcyBub3Qgc3BlY2lmaWVkLAogICAqIGl0IGRlZmF1bHRzIHRvIHplcm8gKHRoZSBmaXJzdCBieXRlIGluIHRoZSBieXRlIGJ1ZmZlcikuCiAgICogSWYgdGhlIGxlbmd0aCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBgbnVsbGAsCiAgICogd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHZpZXcgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIG9yIFtsZW5ndGhdIGFyZSBuZWdhdGl2ZSwgb3IKICAgKiBpZiBbb2Zmc2V0SW5CeXRlc10gKyAoW2xlbmd0aF0gKiBlbGVtZW50U2l6ZUluQnl0ZXMpIGlzIGdyZWF0ZXIgdGhhbgogICAqIHRoZSBsZW5ndGggb2YgW2J1ZmZlcl0uCiAgICoKICAgKiBUaHJvd3MgW0FyZ3VtZW50RXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBpcyBub3QgYSBtdWx0aXBsZSBvZgogICAqIFtieXRlc1BlckVsZW1lbnRdLgogICAqLwogIGZhY3RvcnkgVWludDMyTGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAogICAgICBbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgcmV0dXJuIGJ1ZmZlci5hc1VpbnQzMkxpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIHN0YXRpYyBjb25zdCBpbnQgYnl0ZXNQZXJFbGVtZW50ID0gNDsKfQoKLyoqCiAqIEEgZml4ZWQtbGVuZ3RoIGxpc3Qgb2YgNjQtYml0IHNpZ25lZCBpbnRlZ2VycyB0aGF0IGlzIHZpZXdhYmxlIGFzIGEKICogW1R5cGVkRGF0YV0uCiAqCiAqIEZvciBsb25nIGxpc3RzLCB0aGlzIGltcGxlbWVudGF0aW9uIGNhbiBiZSBjb25zaWRlcmFibHkKICogbW9yZSBzcGFjZS0gYW5kIHRpbWUtZWZmaWNpZW50IHRoYW4gdGhlIGRlZmF1bHQgW0xpc3RdIGltcGxlbWVudGF0aW9uLgogKgogKiBJbnRlZ2VycyBzdG9yZWQgaW4gdGhlIGxpc3QgYXJlIHRydW5jYXRlZCB0byB0aGVpciBsb3cgNjQgYml0cywKICogaW50ZXJwcmV0ZWQgYXMgYSBzaWduZWQgNjQtYml0IHR3bydzIGNvbXBsZW1lbnQgaW50ZWdlciB3aXRoIHZhbHVlcyBpbiB0aGUKICogcmFuZ2UgLTkyMjMzNzIwMzY4NTQ3NzU4MDggdG8gKzkyMjMzNzIwMzY4NTQ3NzU4MDcuCiAqLwphYnN0cmFjdCBjbGFzcyBJbnQ2NExpc3QgaW1wbGVtZW50cyBMaXN0PGludD4sIF9UeXBlZEludExpc3QgewogIC8qKgogICAqIENyZWF0ZXMgYW4gW0ludDY0TGlzdF0gb2YgdGhlIHNwZWNpZmllZCBsZW5ndGggKGluIGVsZW1lbnRzKSwgYWxsIG9mCiAgICogd2hvc2UgZWxlbWVudHMgYXJlIGluaXRpYWxseSB6ZXJvLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgSW50NjRMaXN0KGludCBsZW5ndGgpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0ludDY0TGlzdF0gd2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIFtlbGVtZW50c10gbGlzdAogICAqIGFuZCBjb3BpZXMgb3ZlciB0aGUgZWxlbWVudHMuCiAgICoKICAgKiBWYWx1ZXMgYXJlIHRydW5jYXRlZCB0byBmaXQgaW4gdGhlIGxpc3Qgd2hlbiB0aGV5IGFyZSBjb3BpZWQsCiAgICogdGhlIHNhbWUgd2F5IHN0b3JpbmcgdmFsdWVzIHRydW5jYXRlcyB0aGVtLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgSW50NjRMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cyk7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gW0ludDY0TGlzdF0gX3ZpZXdfIG9mIHRoZSBzcGVjaWZpZWQgcmVnaW9uIGluIFtidWZmZXJdLgogICAqCiAgICogQ2hhbmdlcyBpbiB0aGUgW0ludDY0TGlzdF0gd2lsbCBiZSB2aXNpYmxlIGluIHRoZSBieXRlIGJ1ZmZlcgogICAqIGFuZCB2aWNlIHZlcnNhLgogICAqIElmIHRoZSBbb2Zmc2V0SW5CeXRlc10gaW5kZXggb2YgdGhlIHJlZ2lvbiBpcyBub3Qgc3BlY2lmaWVkLAogICAqIGl0IGRlZmF1bHRzIHRvIHplcm8gKHRoZSBmaXJzdCBieXRlIGluIHRoZSBieXRlIGJ1ZmZlcikuCiAgICogSWYgdGhlIGxlbmd0aCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBgbnVsbGAsCiAgICogd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHZpZXcgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIG9yIFtsZW5ndGhdIGFyZSBuZWdhdGl2ZSwgb3IKICAgKiBpZiBbb2Zmc2V0SW5CeXRlc10gKyAoW2xlbmd0aF0gKiBlbGVtZW50U2l6ZUluQnl0ZXMpIGlzIGdyZWF0ZXIgdGhhbgogICAqIHRoZSBsZW5ndGggb2YgW2J1ZmZlcl0uCiAgICoKICAgKiBUaHJvd3MgW0FyZ3VtZW50RXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBpcyBub3QgYSBtdWx0aXBsZSBvZgogICAqIFtieXRlc1BlckVsZW1lbnRdLgogICAqLwogIGZhY3RvcnkgSW50NjRMaXN0LnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsCiAgICAgIFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICByZXR1cm4gYnVmZmVyLmFzSW50NjRMaXN0KG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICBzdGF0aWMgY29uc3QgaW50IGJ5dGVzUGVyRWxlbWVudCA9IDg7Cn0KCi8qKgogKiBBIGZpeGVkLWxlbmd0aCBsaXN0IG9mIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VycyB0aGF0IGlzIHZpZXdhYmxlIGFzIGEKICogW1R5cGVkRGF0YV0uCiAqCiAqIEZvciBsb25nIGxpc3RzLCB0aGlzIGltcGxlbWVudGF0aW9uIGNhbiBiZSBjb25zaWRlcmFibHkKICogbW9yZSBzcGFjZS0gYW5kIHRpbWUtZWZmaWNpZW50IHRoYW4gdGhlIGRlZmF1bHQgW0xpc3RdIGltcGxlbWVudGF0aW9uLgogKgogKiBJbnRlZ2VycyBzdG9yZWQgaW4gdGhlIGxpc3QgYXJlIHRydW5jYXRlZCB0byB0aGVpciBsb3cgNjQgYml0cywKICogaW50ZXJwcmV0ZWQgYXMgYW4gdW5zaWduZWQgNjQtYml0IGludGVnZXIgd2l0aCB2YWx1ZXMgaW4gdGhlCiAqIHJhbmdlIDAgdG8gMTg0NDY3NDQwNzM3MDk1NTE2MTUuCiAqLwphYnN0cmFjdCBjbGFzcyBVaW50NjRMaXN0IGltcGxlbWVudHMgTGlzdDxpbnQ+LCBfVHlwZWRJbnRMaXN0IHsKICAvKioKICAgKiBDcmVhdGVzIGEgW1VpbnQ2NExpc3RdIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIChpbiBlbGVtZW50cyksIGFsbAogICAqIG9mIHdob3NlIGVsZW1lbnRzIGFyZSBpbml0aWFsbHkgemVyby4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IFVpbnQ2NExpc3QoaW50IGxlbmd0aCk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbVWludDY0TGlzdF0gd2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIFtlbGVtZW50c10gbGlzdAogICAqIGFuZCBjb3BpZXMgb3ZlciB0aGUgZWxlbWVudHMuCiAgICoKICAgKiBWYWx1ZXMgYXJlIHRydW5jYXRlZCB0byBmaXQgaW4gdGhlIGxpc3Qgd2hlbiB0aGV5IGFyZSBjb3BpZWQsCiAgICogdGhlIHNhbWUgd2F5IHN0b3JpbmcgdmFsdWVzIHRydW5jYXRlcyB0aGVtLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgVWludDY0TGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpOwoKICAvKioKICAgKiBDcmVhdGVzIGFuIFtVaW50NjRMaXN0XSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4KICAgKiB0aGUgc3BlY2lmaWVkIGJ5dGUgYnVmZmVyLgogICAqCiAgICogQ2hhbmdlcyBpbiB0aGUgW1VpbnQ2NExpc3RdIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgYnl0ZSBidWZmZXIKICAgKiBhbmQgdmljZSB2ZXJzYS4KICAgKiBJZiB0aGUgW29mZnNldEluQnl0ZXNdIGluZGV4IG9mIHRoZSByZWdpb24gaXMgbm90IHNwZWNpZmllZCwKICAgKiBpdCBkZWZhdWx0cyB0byB6ZXJvICh0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgYnl0ZSBidWZmZXIpLgogICAqIElmIHRoZSBsZW5ndGggaXMgbm90IHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gYG51bGxgLAogICAqIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSB2aWV3IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBvciBbbGVuZ3RoXSBhcmUgbmVnYXRpdmUsIG9yCiAgICogaWYgW29mZnNldEluQnl0ZXNdICsgKFtsZW5ndGhdICogZWxlbWVudFNpemVJbkJ5dGVzKSBpcyBncmVhdGVyIHRoYW4KICAgKiB0aGUgbGVuZ3RoIG9mIFtidWZmZXJdLgogICAqCiAgICogVGhyb3dzIFtBcmd1bWVudEVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gaXMgbm90IGEgbXVsdGlwbGUgb2YKICAgKiBbYnl0ZXNQZXJFbGVtZW50XS4KICAgKi8KICBmYWN0b3J5IFVpbnQ2NExpc3QudmlldyhCeXRlQnVmZmVyIGJ1ZmZlciwKICAgICAgW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIHJldHVybiBidWZmZXIuYXNVaW50NjRMaXN0KG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICBzdGF0aWMgY29uc3QgaW50IGJ5dGVzUGVyRWxlbWVudCA9IDg7Cn0KCi8qKgogKiBBIGZpeGVkLWxlbmd0aCBsaXN0IG9mIElFRUUgNzU0IHNpbmdsZS1wcmVjaXNpb24gYmluYXJ5IGZsb2F0aW5nLXBvaW50CiAqIG51bWJlcnMgdGhhdCBpcyB2aWV3YWJsZSBhcyBhIFtUeXBlZERhdGFdLgogKgogKiBGb3IgbG9uZyBsaXN0cywgdGhpcwogKiBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgY29uc2lkZXJhYmx5IG1vcmUgc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuCiAqIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KICoKICogRG91YmxlIHZhbHVlcyBzdG9yZWQgaW4gdGhlIGxpc3QgYXJlIGNvbnZlcnRlZCB0byB0aGUgbmVhcmVzdAogKiBzaW5nbGUtcHJlY2lzaW9uIHZhbHVlLiBWYWx1ZXMgcmVhZCBhcmUgY29udmVydGVkIHRvIGEgZG91YmxlCiAqIHZhbHVlIHdpdGggdGhlIHNhbWUgdmFsdWUuCiAqLwphYnN0cmFjdCBjbGFzcyBGbG9hdDMyTGlzdCBpbXBsZW1lbnRzIExpc3Q8ZG91YmxlPiwgX1R5cGVkRmxvYXRMaXN0IHsKICAvKioKICAgKiBDcmVhdGVzIGEgW0Zsb2F0MzJMaXN0XSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLCBhbGwgb2YKICAgKiB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IHplcm8uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBGbG9hdDMyTGlzdChpbnQgbGVuZ3RoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtGbG9hdDMyTGlzdF0gd2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIFtlbGVtZW50c10gbGlzdAogICAqIGFuZCBjb3BpZXMgb3ZlciB0aGUgZWxlbWVudHMuCiAgICoKICAgKiBWYWx1ZXMgYXJlIHRydW5jYXRlZCB0byBmaXQgaW4gdGhlIGxpc3Qgd2hlbiB0aGV5IGFyZSBjb3BpZWQsCiAgICogdGhlIHNhbWUgd2F5IHN0b3JpbmcgdmFsdWVzIHRydW5jYXRlcyB0aGVtLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgRmxvYXQzMkxpc3QuZnJvbUxpc3QoTGlzdDxkb3VibGU+IGVsZW1lbnRzKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtGbG9hdDMyTGlzdF0gX3ZpZXdfIG9mIHRoZSBzcGVjaWZpZWQgcmVnaW9uIGluIFtidWZmZXJdLgogICAqCiAgICogQ2hhbmdlcyBpbiB0aGUgW0Zsb2F0MzJMaXN0XSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUKICAgKiBidWZmZXIgYW5kIHZpY2UgdmVyc2EuCiAgICogSWYgdGhlIFtvZmZzZXRJbkJ5dGVzXSBpbmRleCBvZiB0aGUgcmVnaW9uIGlzIG5vdCBzcGVjaWZpZWQsCiAgICogaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGBudWxsYCwKICAgKiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gb3IgW2xlbmd0aF0gYXJlIG5lZ2F0aXZlLCBvcgogICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCiAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KICAgKgogICAqIFRocm93cyBbQXJndW1lbnRFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIGlzIG5vdCBhIG11bHRpcGxlIG9mCiAgICogW2J5dGVzUGVyRWxlbWVudF0uCiAgICovCiAgZmFjdG9yeSBGbG9hdDMyTGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAogICAgICBbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgcmV0dXJuIGJ1ZmZlci5hc0Zsb2F0MzJMaXN0KG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICBzdGF0aWMgY29uc3QgaW50IGJ5dGVzUGVyRWxlbWVudCA9IDQ7Cn0KCi8qKgogKiBBIGZpeGVkLWxlbmd0aCBsaXN0IG9mIElFRUUgNzU0IGRvdWJsZS1wcmVjaXNpb24gYmluYXJ5IGZsb2F0aW5nLXBvaW50CiAqIG51bWJlcnMgIHRoYXQgaXMgdmlld2FibGUgYXMgYSBbVHlwZWREYXRhXS4KICoKICogRm9yIGxvbmcgbGlzdHMsIHRoaXMKICogaW1wbGVtZW50YXRpb24gY2FuIGJlIGNvbnNpZGVyYWJseSBtb3JlIHNwYWNlLSBhbmQgdGltZS1lZmZpY2llbnQgdGhhbgogKiB0aGUgZGVmYXVsdCBbTGlzdF0gaW1wbGVtZW50YXRpb24uCiAqLwphYnN0cmFjdCBjbGFzcyBGbG9hdDY0TGlzdCBpbXBsZW1lbnRzIExpc3Q8ZG91YmxlPiwgX1R5cGVkRmxvYXRMaXN0IHsKICAvKioKICAgKiBDcmVhdGVzIGEgW0Zsb2F0NjRMaXN0XSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLCBhbGwgb2YKICAgKiB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IHplcm8uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBGbG9hdDY0TGlzdChpbnQgbGVuZ3RoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtGbG9hdDY0TGlzdF0gd2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIFtlbGVtZW50c10gbGlzdAogICAqIGFuZCBjb3BpZXMgb3ZlciB0aGUgZWxlbWVudHMuCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBGbG9hdDY0TGlzdC5mcm9tTGlzdChMaXN0PGRvdWJsZT4gZWxlbWVudHMpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0Zsb2F0NjRMaXN0XSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4gW2J1ZmZlcl0uCiAgICoKICAgKiBDaGFuZ2VzIGluIHRoZSBbRmxvYXQ2NExpc3RdIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgYnl0ZQogICAqIGJ1ZmZlciBhbmQgdmljZSB2ZXJzYS4KICAgKiBJZiB0aGUgW29mZnNldEluQnl0ZXNdIGluZGV4IG9mIHRoZSByZWdpb24gaXMgbm90IHNwZWNpZmllZCwKICAgKiBpdCBkZWZhdWx0cyB0byB6ZXJvICh0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgYnl0ZSBidWZmZXIpLgogICAqIElmIHRoZSBsZW5ndGggaXMgbm90IHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gYG51bGxgLAogICAqIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSB2aWV3IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBvciBbbGVuZ3RoXSBhcmUgbmVnYXRpdmUsIG9yCiAgICogaWYgW29mZnNldEluQnl0ZXNdICsgKFtsZW5ndGhdICogZWxlbWVudFNpemVJbkJ5dGVzKSBpcyBncmVhdGVyIHRoYW4KICAgKiB0aGUgbGVuZ3RoIG9mIFtidWZmZXJdLgogICAqCiAgICogVGhyb3dzIFtBcmd1bWVudEVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gaXMgbm90IGEgbXVsdGlwbGUgb2YKICAgKiBbYnl0ZXNQZXJFbGVtZW50XS4KICAgKi8KICBmYWN0b3J5IEZsb2F0NjRMaXN0LnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsCiAgICAgIFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICByZXR1cm4gYnVmZmVyLmFzRmxvYXQ2NExpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIHN0YXRpYyBjb25zdCBpbnQgYnl0ZXNQZXJFbGVtZW50ID0gODsKfQoKLyoqCiAqIEEgZml4ZWQtbGVuZ3RoIGxpc3Qgb2YgRmxvYXQzMng0IG51bWJlcnMgdGhhdCBpcyB2aWV3YWJsZSBhcyBhCiAqIFtUeXBlZERhdGFdLgogKgogKiBGb3IgbG9uZyBsaXN0cywgdGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIGNvbnNpZGVyYWJseSBtb3JlCiAqIHNwYWNlLSBhbmQgdGltZS1lZmZpY2llbnQgdGhhbiB0aGUgZGVmYXVsdCBbTGlzdF0gaW1wbGVtZW50YXRpb24uCiAqLwphYnN0cmFjdCBjbGFzcyBGbG9hdDMyeDRMaXN0IGltcGxlbWVudHMgTGlzdDxGbG9hdDMyeDQ+LCBUeXBlZERhdGEgewogIC8qKgogICAqIENyZWF0ZXMgYSBbRmxvYXQzMng0TGlzdF0gb2YgdGhlIHNwZWNpZmllZCBsZW5ndGggKGluIGVsZW1lbnRzKSwKICAgKiBhbGwgb2Ygd2hvc2UgZWxlbWVudHMgYXJlIGluaXRpYWxseSB6ZXJvLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgRmxvYXQzMng0TGlzdChpbnQgbGVuZ3RoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtGbG9hdDMyeDRMaXN0XSB3aXRoIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgW2VsZW1lbnRzXSBsaXN0CiAgICogYW5kIGNvcGllcyBvdmVyIHRoZSBlbGVtZW50cy4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IEZsb2F0MzJ4NExpc3QuZnJvbUxpc3QoTGlzdDxGbG9hdDMyeDQ+IGVsZW1lbnRzKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtGbG9hdDMyeDRMaXN0XSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4gW2J1ZmZlcl0uCiAgICoKICAgKiBDaGFuZ2VzIGluIHRoZSBbRmxvYXQzMng0TGlzdF0gd2lsbCBiZSB2aXNpYmxlIGluIHRoZSBieXRlCiAgICogYnVmZmVyIGFuZCB2aWNlIHZlcnNhLgogICAqIElmIHRoZSBbb2Zmc2V0SW5CeXRlc10gaW5kZXggb2YgdGhlIHJlZ2lvbiBpcyBub3Qgc3BlY2lmaWVkLAogICAqIGl0IGRlZmF1bHRzIHRvIHplcm8gKHRoZSBmaXJzdCBieXRlIGluIHRoZSBieXRlIGJ1ZmZlcikuCiAgICogSWYgdGhlIGxlbmd0aCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBgbnVsbGAsCiAgICogd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHZpZXcgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIG9yIFtsZW5ndGhdIGFyZSBuZWdhdGl2ZSwgb3IKICAgKiBpZiBbb2Zmc2V0SW5CeXRlc10gKyAoW2xlbmd0aF0gKiBlbGVtZW50U2l6ZUluQnl0ZXMpIGlzIGdyZWF0ZXIgdGhhbgogICAqIHRoZSBsZW5ndGggb2YgW2J1ZmZlcl0uCiAgICoKICAgKiBUaHJvd3MgW0FyZ3VtZW50RXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBpcyBub3QgYSBtdWx0aXBsZSBvZgogICAqIFtieXRlc1BlckVsZW1lbnRdLgogICAqLwogIGZhY3RvcnkgRmxvYXQzMng0TGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAogICAgICBbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgcmV0dXJuIGJ1ZmZlci5hc0Zsb2F0MzJ4NExpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhpcyBsaXN0IGFuZCBbb3RoZXJdLgogICAqCiAgICogSWYgW290aGVyXSBpcyBhbHNvIGEgW0Zsb2F0MzJ4NExpc3RdLCB0aGUgcmVzdWx0IGlzIGEgbmV3IFtGbG9hdDMyeDRMaXN0XSwKICAgKiBvdGhlcndpc2UgdGhlIHJlc3VsdCBpcyBhIG5vcm1hbCBncm93YWJsZSBgTGlzdDxGbG9hdDMyeDQ+YC4KICAgKi8KICBMaXN0PEZsb2F0MzJ4ND4gb3BlcmF0b3IgKyhMaXN0PEZsb2F0MzJ4ND4gb3RoZXIpOwoKICBzdGF0aWMgY29uc3QgaW50IGJ5dGVzUGVyRWxlbWVudCA9IDE2Owp9CgovKioKICogQSBmaXhlZC1sZW5ndGggbGlzdCBvZiBJbnQzMng0IG51bWJlcnMgdGhhdCBpcyB2aWV3YWJsZSBhcyBhCiAqIFtUeXBlZERhdGFdLgogKgogKiBGb3IgbG9uZyBsaXN0cywgdGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIGNvbnNpZGVyYWJseSBtb3JlCiAqIHNwYWNlLSBhbmQgdGltZS1lZmZpY2llbnQgdGhhbiB0aGUgZGVmYXVsdCBbTGlzdF0gaW1wbGVtZW50YXRpb24uCiAqLwphYnN0cmFjdCBjbGFzcyBJbnQzMng0TGlzdCBpbXBsZW1lbnRzIExpc3Q8SW50MzJ4ND4sIFR5cGVkRGF0YSB7CiAgLyoqCiAgICogQ3JlYXRlcyBhIFtJbnQzMng0TGlzdF0gb2YgdGhlIHNwZWNpZmllZCBsZW5ndGggKGluIGVsZW1lbnRzKSwKICAgKiBhbGwgb2Ygd2hvc2UgZWxlbWVudHMgYXJlIGluaXRpYWxseSB6ZXJvLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgSW50MzJ4NExpc3QoaW50IGxlbmd0aCk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbSW50MzJ4NExpc3RdIHdpdGggdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBbZWxlbWVudHNdIGxpc3QKICAgKiBhbmQgY29waWVzIG92ZXIgdGhlIGVsZW1lbnRzLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgSW50MzJ4NExpc3QuZnJvbUxpc3QoTGlzdDxJbnQzMng0PiBlbGVtZW50cyk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbSW50MzJ4NExpc3RdIF92aWV3XyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBpbiBbYnVmZmVyXS4KICAgKgogICAqIENoYW5nZXMgaW4gdGhlIFtJbnQzMng0TGlzdF0gd2lsbCBiZSB2aXNpYmxlIGluIHRoZSBieXRlCiAgICogYnVmZmVyIGFuZCB2aWNlIHZlcnNhLgogICAqIElmIHRoZSBbb2Zmc2V0SW5CeXRlc10gaW5kZXggb2YgdGhlIHJlZ2lvbiBpcyBub3Qgc3BlY2lmaWVkLAogICAqIGl0IGRlZmF1bHRzIHRvIHplcm8gKHRoZSBmaXJzdCBieXRlIGluIHRoZSBieXRlIGJ1ZmZlcikuCiAgICogSWYgdGhlIGxlbmd0aCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBgbnVsbGAsCiAgICogd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHZpZXcgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIG9yIFtsZW5ndGhdIGFyZSBuZWdhdGl2ZSwgb3IKICAgKiBpZiBbb2Zmc2V0SW5CeXRlc10gKyAoW2xlbmd0aF0gKiBlbGVtZW50U2l6ZUluQnl0ZXMpIGlzIGdyZWF0ZXIgdGhhbgogICAqIHRoZSBsZW5ndGggb2YgW2J1ZmZlcl0uCiAgICoKICAgKiBUaHJvd3MgW0FyZ3VtZW50RXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBpcyBub3QgYSBtdWx0aXBsZSBvZgogICAqIFtieXRlc1BlckVsZW1lbnRdLgogICAqLwogIGZhY3RvcnkgSW50MzJ4NExpc3QudmlldyhCeXRlQnVmZmVyIGJ1ZmZlciwKICAgICAgW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIHJldHVybiBidWZmZXIuYXNJbnQzMng0TGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGlzIGxpc3QgYW5kIFtvdGhlcl0uCiAgICoKICAgKiBJZiBbb3RoZXJdIGlzIGFsc28gYSBbSW50MzJ4NExpc3RdLCB0aGUgcmVzdWx0IGlzIGEgbmV3IFtJbnQzMng0TGlzdF0sCiAgICogb3RoZXJ3aXNlIHRoZSByZXN1bHQgaXMgYSBub3JtYWwgZ3Jvd2FibGUgYExpc3Q8SW50MzJ4ND5gLgogICAqLwogIExpc3Q8SW50MzJ4ND4gb3BlcmF0b3IgKyhMaXN0PEludDMyeDQ+IG90aGVyKTsKCiAgc3RhdGljIGNvbnN0IGludCBieXRlc1BlckVsZW1lbnQgPSAxNjsKfQoKLyoqCiAqIEEgZml4ZWQtbGVuZ3RoIGxpc3Qgb2YgRmxvYXQ2NHgyIG51bWJlcnMgdGhhdCBpcyB2aWV3YWJsZSBhcyBhCiAqIFtUeXBlZERhdGFdLgogKgogKiBGb3IgbG9uZyBsaXN0cywgdGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIGNvbnNpZGVyYWJseSBtb3JlCiAqIHNwYWNlLSBhbmQgdGltZS1lZmZpY2llbnQgdGhhbiB0aGUgZGVmYXVsdCBbTGlzdF0gaW1wbGVtZW50YXRpb24uCiAqLwphYnN0cmFjdCBjbGFzcyBGbG9hdDY0eDJMaXN0IGltcGxlbWVudHMgTGlzdDxGbG9hdDY0eDI+LCBUeXBlZERhdGEgewogIC8qKgogICAqIENyZWF0ZXMgYSBbRmxvYXQ2NHgyTGlzdF0gb2YgdGhlIHNwZWNpZmllZCBsZW5ndGggKGluIGVsZW1lbnRzKSwKICAgKiBhbGwgb2Ygd2hvc2UgZWxlbWVudHMgaGF2ZSBhbGwgbGFuZXMgc2V0IHRvIHplcm8uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBGbG9hdDY0eDJMaXN0KGludCBsZW5ndGgpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0Zsb2F0NjR4Mkxpc3RdIHdpdGggdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBbZWxlbWVudHNdIGxpc3QKICAgKiBhbmQgY29waWVzIG92ZXIgdGhlIGVsZW1lbnRzLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgRmxvYXQ2NHgyTGlzdC5mcm9tTGlzdChMaXN0PEZsb2F0NjR4Mj4gZWxlbWVudHMpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoaXMgbGlzdCBhbmQgW290aGVyXS4KICAgKgogICAqIElmIFtvdGhlcl0gaXMgYWxzbyBhIFtGbG9hdDY0eDJMaXN0XSwgdGhlIHJlc3VsdCBpcyBhIG5ldyBbRmxvYXQ2NHgyTGlzdF0sCiAgICogb3RoZXJ3aXNlIHRoZSByZXN1bHQgaXMgYSBub3JtYWwgZ3Jvd2FibGUgYExpc3Q8RmxvYXQ2NHgyPmAuCiAgICovCiAgTGlzdDxGbG9hdDY0eDI+IG9wZXJhdG9yICsoTGlzdDxGbG9hdDY0eDI+IG90aGVyKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtGbG9hdDY0eDJMaXN0XSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4gW2J1ZmZlcl0uCiAgICoKICAgKiBDaGFuZ2VzIGluIHRoZSBbRmxvYXQ2NHgyTGlzdF0gd2lsbCBiZSB2aXNpYmxlIGluIHRoZSBieXRlCiAgICogYnVmZmVyIGFuZCB2aWNlIHZlcnNhLgogICAqIElmIHRoZSBbb2Zmc2V0SW5CeXRlc10gaW5kZXggb2YgdGhlIHJlZ2lvbiBpcyBub3Qgc3BlY2lmaWVkLAogICAqIGl0IGRlZmF1bHRzIHRvIHplcm8gKHRoZSBmaXJzdCBieXRlIGluIHRoZSBieXRlIGJ1ZmZlcikuCiAgICogSWYgdGhlIGxlbmd0aCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBgbnVsbGAsCiAgICogd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHZpZXcgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIG9yIFtsZW5ndGhdIGFyZSBuZWdhdGl2ZSwgb3IKICAgKiBpZiBbb2Zmc2V0SW5CeXRlc10gKyAoW2xlbmd0aF0gKiBlbGVtZW50U2l6ZUluQnl0ZXMpIGlzIGdyZWF0ZXIgdGhhbgogICAqIHRoZSBsZW5ndGggb2YgW2J1ZmZlcl0uCiAgICoKICAgKiBUaHJvd3MgW0FyZ3VtZW50RXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBpcyBub3QgYSBtdWx0aXBsZSBvZgogICAqIFtieXRlc1BlckVsZW1lbnRdLgogICAqLwogIGZhY3RvcnkgRmxvYXQ2NHgyTGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAogICAgICBbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgcmV0dXJuIGJ1ZmZlci5hc0Zsb2F0NjR4Mkxpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIHN0YXRpYyBjb25zdCBpbnQgYnl0ZXNQZXJFbGVtZW50ID0gMTY7Cn0KCi8qKgogKiBGbG9hdDMyeDQgaW1tdXRhYmxlIHZhbHVlIHR5cGUgYW5kIG9wZXJhdGlvbnMuCiAqCiAqIEZsb2F0MzJ4NCBzdG9yZXMgNCAzMi1iaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWVzIGluICJsYW5lcyIuCiAqIFRoZSBsYW5lcyBhcmUgIngiLCAieSIsICJ6IiwgYW5kICJ3IiByZXNwZWN0aXZlbHkuCiAqLwphYnN0cmFjdCBjbGFzcyBGbG9hdDMyeDQgewogIGV4dGVybmFsIGZhY3RvcnkgRmxvYXQzMng0KGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHosIGRvdWJsZSB3KTsKICBleHRlcm5hbCBmYWN0b3J5IEZsb2F0MzJ4NC5zcGxhdChkb3VibGUgdik7CiAgZXh0ZXJuYWwgZmFjdG9yeSBGbG9hdDMyeDQuemVybygpOwogIGV4dGVybmFsIGZhY3RvcnkgRmxvYXQzMng0LmZyb21JbnQzMng0Qml0cyhJbnQzMng0IHgpOwoKICAvLy8gU2V0cyB0aGUgeCBhbmQgeSBsYW5lcyB0byB0aGVpciByZXNwZWN0aXZlIHZhbHVlcyBpbiBbdl0gYW5kIHNldHMgdGhlIHoKICAvLy8gYW5kIHcgbGFuZXMgdG8gMC4wLgogIGV4dGVybmFsIGZhY3RvcnkgRmxvYXQzMng0LmZyb21GbG9hdDY0eDIoRmxvYXQ2NHgyIHYpOwoKICAvLy8gQWRkaXRpb24gb3BlcmF0b3IuCiAgRmxvYXQzMng0IG9wZXJhdG9yICsoRmxvYXQzMng0IG90aGVyKTsKCiAgLy8vIE5lZ2F0ZSBvcGVyYXRvci4KICBGbG9hdDMyeDQgb3BlcmF0b3IgLSgpOwoKICAvLy8gU3VidHJhY3Rpb24gb3BlcmF0b3IuCiAgRmxvYXQzMng0IG9wZXJhdG9yIC0oRmxvYXQzMng0IG90aGVyKTsKCiAgLy8vIE11bHRpcGxpY2F0aW9uIG9wZXJhdG9yLgogIEZsb2F0MzJ4NCBvcGVyYXRvciAqKEZsb2F0MzJ4NCBvdGhlcik7CgogIC8vLyBEaXZpc2lvbiBvcGVyYXRvci4KICBGbG9hdDMyeDQgb3BlcmF0b3IgLyhGbG9hdDMyeDQgb3RoZXIpOwoKICAvLy8gUmVsYXRpb25hbCBsZXNzIHRoYW4uCiAgSW50MzJ4NCBsZXNzVGhhbihGbG9hdDMyeDQgb3RoZXIpOwoKICAvLy8gUmVsYXRpb25hbCBsZXNzIHRoYW4gb3IgZXF1YWwuCiAgSW50MzJ4NCBsZXNzVGhhbk9yRXF1YWwoRmxvYXQzMng0IG90aGVyKTsKCiAgLy8vIFJlbGF0aW9uYWwgZ3JlYXRlciB0aGFuLgogIEludDMyeDQgZ3JlYXRlclRoYW4oRmxvYXQzMng0IG90aGVyKTsKCiAgLy8vIFJlbGF0aW9uYWwgZ3JlYXRlciB0aGFuIG9yIGVxdWFsLgogIEludDMyeDQgZ3JlYXRlclRoYW5PckVxdWFsKEZsb2F0MzJ4NCBvdGhlcik7CgogIC8vLyBSZWxhdGlvbmFsIGVxdWFsLgogIEludDMyeDQgZXF1YWwoRmxvYXQzMng0IG90aGVyKTsKCiAgLy8vIFJlbGF0aW9uYWwgbm90LWVxdWFsLgogIEludDMyeDQgbm90RXF1YWwoRmxvYXQzMng0IG90aGVyKTsKCiAgLy8vIFJldHVybnMgYSBjb3B5IG9mIFt0aGlzXSBlYWNoIGxhbmUgYmVpbmcgc2NhbGVkIGJ5IFtzXS4KICAvLy8gRXF1aXZhbGVudCB0byB0aGlzICogbmV3IEZsb2F0MzJ4NC5zcGxhdChzKQogIEZsb2F0MzJ4NCBzY2FsZShkb3VibGUgcyk7CgogIC8vLyBSZXR1cm5zIHRoZSBsYW5lLXdpc2UgYWJzb2x1dGUgdmFsdWUgb2YgdGhpcyBbRmxvYXQzMng0XS4KICBGbG9hdDMyeDQgYWJzKCk7CgogIC8vLyBMYW5lLXdpc2UgY2xhbXAgW3RoaXNdIHRvIGJlIGluIHRoZSByYW5nZSBbbG93ZXJMaW1pdF0tW3VwcGVyTGltaXRdLgogIEZsb2F0MzJ4NCBjbGFtcChGbG9hdDMyeDQgbG93ZXJMaW1pdCwgRmxvYXQzMng0IHVwcGVyTGltaXQpOwoKICAvLy8gRXh0cmFjdGVkIHggdmFsdWUuCiAgZG91YmxlIGdldCB4OwoKICAvLy8gRXh0cmFjdGVkIHkgdmFsdWUuCiAgZG91YmxlIGdldCB5OwoKICAvLy8gRXh0cmFjdGVkIHogdmFsdWUuCiAgZG91YmxlIGdldCB6OwoKICAvLy8gRXh0cmFjdGVkIHcgdmFsdWUuCiAgZG91YmxlIGdldCB3OwoKICAvLy8gRXh0cmFjdCB0aGUgc2lnbiBiaXRzIGZyb20gZWFjaCBsYW5lIHJldHVybiB0aGVtIGluIHRoZSBmaXJzdCA0IGJpdHMuCiAgLy8vICJ4IiBsYW5lIGlzIGJpdCAwLgogIC8vLyAieSIgbGFuZSBpcyBiaXQgMS4KICAvLy8gInoiIGxhbmUgaXMgYml0IDIuCiAgLy8vICJ3IiBsYW5lIGlzIGJpdCAzLgogIGludCBnZXQgc2lnbk1hc2s7CgogIC8vLyBNYXNrIHBhc3NlZCB0byBbc2h1ZmZsZV0gb3IgW3NodWZmbGVNaXhdLgogIHN0YXRpYyBjb25zdCBpbnQgeHh4eCA9IDB4MDsKICBzdGF0aWMgY29uc3QgaW50IHh4eHkgPSAweDQwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh4eiA9IDB4ODA7CiAgc3RhdGljIGNvbnN0IGludCB4eHh3ID0gMHhDMDsKICBzdGF0aWMgY29uc3QgaW50IHh4eXggPSAweDEwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh5eSA9IDB4NTA7CiAgc3RhdGljIGNvbnN0IGludCB4eHl6ID0gMHg5MDsKICBzdGF0aWMgY29uc3QgaW50IHh4eXcgPSAweEQwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh6eCA9IDB4MjA7CiAgc3RhdGljIGNvbnN0IGludCB4eHp5ID0gMHg2MDsKICBzdGF0aWMgY29uc3QgaW50IHh4enogPSAweEEwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh6dyA9IDB4RTA7CiAgc3RhdGljIGNvbnN0IGludCB4eHd4ID0gMHgzMDsKICBzdGF0aWMgY29uc3QgaW50IHh4d3kgPSAweDcwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh3eiA9IDB4QjA7CiAgc3RhdGljIGNvbnN0IGludCB4eHd3ID0gMHhGMDsKICBzdGF0aWMgY29uc3QgaW50IHh5eHggPSAweDQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXh5ID0gMHg0NDsKICBzdGF0aWMgY29uc3QgaW50IHh5eHogPSAweDg0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl4dyA9IDB4QzQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXl4ID0gMHgxNDsKICBzdGF0aWMgY29uc3QgaW50IHh5eXkgPSAweDU0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl5eiA9IDB4OTQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXl3ID0gMHhENDsKICBzdGF0aWMgY29uc3QgaW50IHh5enggPSAweDI0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl6eSA9IDB4NjQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXp6ID0gMHhBNDsKICBzdGF0aWMgY29uc3QgaW50IHh5encgPSAweEU0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl3eCA9IDB4MzQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXd5ID0gMHg3NDsKICBzdGF0aWMgY29uc3QgaW50IHh5d3ogPSAweEI0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl3dyA9IDB4RjQ7CiAgc3RhdGljIGNvbnN0IGludCB4enh4ID0gMHg4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp4eSA9IDB4NDg7CiAgc3RhdGljIGNvbnN0IGludCB4enh6ID0gMHg4ODsKICBzdGF0aWMgY29uc3QgaW50IHh6eHcgPSAweEM4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp5eCA9IDB4MTg7CiAgc3RhdGljIGNvbnN0IGludCB4enl5ID0gMHg1ODsKICBzdGF0aWMgY29uc3QgaW50IHh6eXogPSAweDk4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp5dyA9IDB4RDg7CiAgc3RhdGljIGNvbnN0IGludCB4enp4ID0gMHgyODsKICBzdGF0aWMgY29uc3QgaW50IHh6enkgPSAweDY4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp6eiA9IDB4QTg7CiAgc3RhdGljIGNvbnN0IGludCB4enp3ID0gMHhFODsKICBzdGF0aWMgY29uc3QgaW50IHh6d3ggPSAweDM4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp3eSA9IDB4Nzg7CiAgc3RhdGljIGNvbnN0IGludCB4end6ID0gMHhCODsKICBzdGF0aWMgY29uc3QgaW50IHh6d3cgPSAweEY4OwogIHN0YXRpYyBjb25zdCBpbnQgeHd4eCA9IDB4QzsKICBzdGF0aWMgY29uc3QgaW50IHh3eHkgPSAweDRDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd4eiA9IDB4OEM7CiAgc3RhdGljIGNvbnN0IGludCB4d3h3ID0gMHhDQzsKICBzdGF0aWMgY29uc3QgaW50IHh3eXggPSAweDFDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd5eSA9IDB4NUM7CiAgc3RhdGljIGNvbnN0IGludCB4d3l6ID0gMHg5QzsKICBzdGF0aWMgY29uc3QgaW50IHh3eXcgPSAweERDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd6eCA9IDB4MkM7CiAgc3RhdGljIGNvbnN0IGludCB4d3p5ID0gMHg2QzsKICBzdGF0aWMgY29uc3QgaW50IHh3enogPSAweEFDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd6dyA9IDB4RUM7CiAgc3RhdGljIGNvbnN0IGludCB4d3d4ID0gMHgzQzsKICBzdGF0aWMgY29uc3QgaW50IHh3d3kgPSAweDdDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd3eiA9IDB4QkM7CiAgc3RhdGljIGNvbnN0IGludCB4d3d3ID0gMHhGQzsKICBzdGF0aWMgY29uc3QgaW50IHl4eHggPSAweDE7CiAgc3RhdGljIGNvbnN0IGludCB5eHh5ID0gMHg0MTsKICBzdGF0aWMgY29uc3QgaW50IHl4eHogPSAweDgxOwogIHN0YXRpYyBjb25zdCBpbnQgeXh4dyA9IDB4QzE7CiAgc3RhdGljIGNvbnN0IGludCB5eHl4ID0gMHgxMTsKICBzdGF0aWMgY29uc3QgaW50IHl4eXkgPSAweDUxOwogIHN0YXRpYyBjb25zdCBpbnQgeXh5eiA9IDB4OTE7CiAgc3RhdGljIGNvbnN0IGludCB5eHl3ID0gMHhEMTsKICBzdGF0aWMgY29uc3QgaW50IHl4enggPSAweDIxOwogIHN0YXRpYyBjb25zdCBpbnQgeXh6eSA9IDB4NjE7CiAgc3RhdGljIGNvbnN0IGludCB5eHp6ID0gMHhBMTsKICBzdGF0aWMgY29uc3QgaW50IHl4encgPSAweEUxOwogIHN0YXRpYyBjb25zdCBpbnQgeXh3eCA9IDB4MzE7CiAgc3RhdGljIGNvbnN0IGludCB5eHd5ID0gMHg3MTsKICBzdGF0aWMgY29uc3QgaW50IHl4d3ogPSAweEIxOwogIHN0YXRpYyBjb25zdCBpbnQgeXh3dyA9IDB4RjE7CiAgc3RhdGljIGNvbnN0IGludCB5eXh4ID0gMHg1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl4eSA9IDB4NDU7CiAgc3RhdGljIGNvbnN0IGludCB5eXh6ID0gMHg4NTsKICBzdGF0aWMgY29uc3QgaW50IHl5eHcgPSAweEM1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl5eCA9IDB4MTU7CiAgc3RhdGljIGNvbnN0IGludCB5eXl5ID0gMHg1NTsKICBzdGF0aWMgY29uc3QgaW50IHl5eXogPSAweDk1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl5dyA9IDB4RDU7CiAgc3RhdGljIGNvbnN0IGludCB5eXp4ID0gMHgyNTsKICBzdGF0aWMgY29uc3QgaW50IHl5enkgPSAweDY1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl6eiA9IDB4QTU7CiAgc3RhdGljIGNvbnN0IGludCB5eXp3ID0gMHhFNTsKICBzdGF0aWMgY29uc3QgaW50IHl5d3ggPSAweDM1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl3eSA9IDB4NzU7CiAgc3RhdGljIGNvbnN0IGludCB5eXd6ID0gMHhCNTsKICBzdGF0aWMgY29uc3QgaW50IHl5d3cgPSAweEY1OwogIHN0YXRpYyBjb25zdCBpbnQgeXp4eCA9IDB4OTsKICBzdGF0aWMgY29uc3QgaW50IHl6eHkgPSAweDQ5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp4eiA9IDB4ODk7CiAgc3RhdGljIGNvbnN0IGludCB5enh3ID0gMHhDOTsKICBzdGF0aWMgY29uc3QgaW50IHl6eXggPSAweDE5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp5eSA9IDB4NTk7CiAgc3RhdGljIGNvbnN0IGludCB5enl6ID0gMHg5OTsKICBzdGF0aWMgY29uc3QgaW50IHl6eXcgPSAweEQ5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp6eCA9IDB4Mjk7CiAgc3RhdGljIGNvbnN0IGludCB5enp5ID0gMHg2OTsKICBzdGF0aWMgY29uc3QgaW50IHl6enogPSAweEE5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp6dyA9IDB4RTk7CiAgc3RhdGljIGNvbnN0IGludCB5end4ID0gMHgzOTsKICBzdGF0aWMgY29uc3QgaW50IHl6d3kgPSAweDc5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp3eiA9IDB4Qjk7CiAgc3RhdGljIGNvbnN0IGludCB5end3ID0gMHhGOTsKICBzdGF0aWMgY29uc3QgaW50IHl3eHggPSAweEQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3h5ID0gMHg0RDsKICBzdGF0aWMgY29uc3QgaW50IHl3eHogPSAweDhEOwogIHN0YXRpYyBjb25zdCBpbnQgeXd4dyA9IDB4Q0Q7CiAgc3RhdGljIGNvbnN0IGludCB5d3l4ID0gMHgxRDsKICBzdGF0aWMgY29uc3QgaW50IHl3eXkgPSAweDVEOwogIHN0YXRpYyBjb25zdCBpbnQgeXd5eiA9IDB4OUQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3l3ID0gMHhERDsKICBzdGF0aWMgY29uc3QgaW50IHl3enggPSAweDJEOwogIHN0YXRpYyBjb25zdCBpbnQgeXd6eSA9IDB4NkQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3p6ID0gMHhBRDsKICBzdGF0aWMgY29uc3QgaW50IHl3encgPSAweEVEOwogIHN0YXRpYyBjb25zdCBpbnQgeXd3eCA9IDB4M0Q7CiAgc3RhdGljIGNvbnN0IGludCB5d3d5ID0gMHg3RDsKICBzdGF0aWMgY29uc3QgaW50IHl3d3ogPSAweEJEOwogIHN0YXRpYyBjb25zdCBpbnQgeXd3dyA9IDB4RkQ7CiAgc3RhdGljIGNvbnN0IGludCB6eHh4ID0gMHgyOwogIHN0YXRpYyBjb25zdCBpbnQgenh4eSA9IDB4NDI7CiAgc3RhdGljIGNvbnN0IGludCB6eHh6ID0gMHg4MjsKICBzdGF0aWMgY29uc3QgaW50IHp4eHcgPSAweEMyOwogIHN0YXRpYyBjb25zdCBpbnQgenh5eCA9IDB4MTI7CiAgc3RhdGljIGNvbnN0IGludCB6eHl5ID0gMHg1MjsKICBzdGF0aWMgY29uc3QgaW50IHp4eXogPSAweDkyOwogIHN0YXRpYyBjb25zdCBpbnQgenh5dyA9IDB4RDI7CiAgc3RhdGljIGNvbnN0IGludCB6eHp4ID0gMHgyMjsKICBzdGF0aWMgY29uc3QgaW50IHp4enkgPSAweDYyOwogIHN0YXRpYyBjb25zdCBpbnQgenh6eiA9IDB4QTI7CiAgc3RhdGljIGNvbnN0IGludCB6eHp3ID0gMHhFMjsKICBzdGF0aWMgY29uc3QgaW50IHp4d3ggPSAweDMyOwogIHN0YXRpYyBjb25zdCBpbnQgenh3eSA9IDB4NzI7CiAgc3RhdGljIGNvbnN0IGludCB6eHd6ID0gMHhCMjsKICBzdGF0aWMgY29uc3QgaW50IHp4d3cgPSAweEYyOwogIHN0YXRpYyBjb25zdCBpbnQgenl4eCA9IDB4NjsKICBzdGF0aWMgY29uc3QgaW50IHp5eHkgPSAweDQ2OwogIHN0YXRpYyBjb25zdCBpbnQgenl4eiA9IDB4ODY7CiAgc3RhdGljIGNvbnN0IGludCB6eXh3ID0gMHhDNjsKICBzdGF0aWMgY29uc3QgaW50IHp5eXggPSAweDE2OwogIHN0YXRpYyBjb25zdCBpbnQgenl5eSA9IDB4NTY7CiAgc3RhdGljIGNvbnN0IGludCB6eXl6ID0gMHg5NjsKICBzdGF0aWMgY29uc3QgaW50IHp5eXcgPSAweEQ2OwogIHN0YXRpYyBjb25zdCBpbnQgenl6eCA9IDB4MjY7CiAgc3RhdGljIGNvbnN0IGludCB6eXp5ID0gMHg2NjsKICBzdGF0aWMgY29uc3QgaW50IHp5enogPSAweEE2OwogIHN0YXRpYyBjb25zdCBpbnQgenl6dyA9IDB4RTY7CiAgc3RhdGljIGNvbnN0IGludCB6eXd4ID0gMHgzNjsKICBzdGF0aWMgY29uc3QgaW50IHp5d3kgPSAweDc2OwogIHN0YXRpYyBjb25zdCBpbnQgenl3eiA9IDB4QjY7CiAgc3RhdGljIGNvbnN0IGludCB6eXd3ID0gMHhGNjsKICBzdGF0aWMgY29uc3QgaW50IHp6eHggPSAweEE7CiAgc3RhdGljIGNvbnN0IGludCB6enh5ID0gMHg0QTsKICBzdGF0aWMgY29uc3QgaW50IHp6eHogPSAweDhBOwogIHN0YXRpYyBjb25zdCBpbnQgenp4dyA9IDB4Q0E7CiAgc3RhdGljIGNvbnN0IGludCB6enl4ID0gMHgxQTsKICBzdGF0aWMgY29uc3QgaW50IHp6eXkgPSAweDVBOwogIHN0YXRpYyBjb25zdCBpbnQgenp5eiA9IDB4OUE7CiAgc3RhdGljIGNvbnN0IGludCB6enl3ID0gMHhEQTsKICBzdGF0aWMgY29uc3QgaW50IHp6enggPSAweDJBOwogIHN0YXRpYyBjb25zdCBpbnQgenp6eSA9IDB4NkE7CiAgc3RhdGljIGNvbnN0IGludCB6enp6ID0gMHhBQTsKICBzdGF0aWMgY29uc3QgaW50IHp6encgPSAweEVBOwogIHN0YXRpYyBjb25zdCBpbnQgenp3eCA9IDB4M0E7CiAgc3RhdGljIGNvbnN0IGludCB6end5ID0gMHg3QTsKICBzdGF0aWMgY29uc3QgaW50IHp6d3ogPSAweEJBOwogIHN0YXRpYyBjb25zdCBpbnQgenp3dyA9IDB4RkE7CiAgc3RhdGljIGNvbnN0IGludCB6d3h4ID0gMHhFOwogIHN0YXRpYyBjb25zdCBpbnQgend4eSA9IDB4NEU7CiAgc3RhdGljIGNvbnN0IGludCB6d3h6ID0gMHg4RTsKICBzdGF0aWMgY29uc3QgaW50IHp3eHcgPSAweENFOwogIHN0YXRpYyBjb25zdCBpbnQgend5eCA9IDB4MUU7CiAgc3RhdGljIGNvbnN0IGludCB6d3l5ID0gMHg1RTsKICBzdGF0aWMgY29uc3QgaW50IHp3eXogPSAweDlFOwogIHN0YXRpYyBjb25zdCBpbnQgend5dyA9IDB4REU7CiAgc3RhdGljIGNvbnN0IGludCB6d3p4ID0gMHgyRTsKICBzdGF0aWMgY29uc3QgaW50IHp3enkgPSAweDZFOwogIHN0YXRpYyBjb25zdCBpbnQgend6eiA9IDB4QUU7CiAgc3RhdGljIGNvbnN0IGludCB6d3p3ID0gMHhFRTsKICBzdGF0aWMgY29uc3QgaW50IHp3d3ggPSAweDNFOwogIHN0YXRpYyBjb25zdCBpbnQgend3eSA9IDB4N0U7CiAgc3RhdGljIGNvbnN0IGludCB6d3d6ID0gMHhCRTsKICBzdGF0aWMgY29uc3QgaW50IHp3d3cgPSAweEZFOwogIHN0YXRpYyBjb25zdCBpbnQgd3h4eCA9IDB4MzsKICBzdGF0aWMgY29uc3QgaW50IHd4eHkgPSAweDQzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h4eiA9IDB4ODM7CiAgc3RhdGljIGNvbnN0IGludCB3eHh3ID0gMHhDMzsKICBzdGF0aWMgY29uc3QgaW50IHd4eXggPSAweDEzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h5eSA9IDB4NTM7CiAgc3RhdGljIGNvbnN0IGludCB3eHl6ID0gMHg5MzsKICBzdGF0aWMgY29uc3QgaW50IHd4eXcgPSAweEQzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h6eCA9IDB4MjM7CiAgc3RhdGljIGNvbnN0IGludCB3eHp5ID0gMHg2MzsKICBzdGF0aWMgY29uc3QgaW50IHd4enogPSAweEEzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h6dyA9IDB4RTM7CiAgc3RhdGljIGNvbnN0IGludCB3eHd4ID0gMHgzMzsKICBzdGF0aWMgY29uc3QgaW50IHd4d3kgPSAweDczOwogIHN0YXRpYyBjb25zdCBpbnQgd3h3eiA9IDB4QjM7CiAgc3RhdGljIGNvbnN0IGludCB3eHd3ID0gMHhGMzsKICBzdGF0aWMgY29uc3QgaW50IHd5eHggPSAweDc7CiAgc3RhdGljIGNvbnN0IGludCB3eXh5ID0gMHg0NzsKICBzdGF0aWMgY29uc3QgaW50IHd5eHogPSAweDg3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l4dyA9IDB4Qzc7CiAgc3RhdGljIGNvbnN0IGludCB3eXl4ID0gMHgxNzsKICBzdGF0aWMgY29uc3QgaW50IHd5eXkgPSAweDU3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l5eiA9IDB4OTc7CiAgc3RhdGljIGNvbnN0IGludCB3eXl3ID0gMHhENzsKICBzdGF0aWMgY29uc3QgaW50IHd5enggPSAweDI3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l6eSA9IDB4Njc7CiAgc3RhdGljIGNvbnN0IGludCB3eXp6ID0gMHhBNzsKICBzdGF0aWMgY29uc3QgaW50IHd5encgPSAweEU3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l3eCA9IDB4Mzc7CiAgc3RhdGljIGNvbnN0IGludCB3eXd5ID0gMHg3NzsKICBzdGF0aWMgY29uc3QgaW50IHd5d3ogPSAweEI3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l3dyA9IDB4Rjc7CiAgc3RhdGljIGNvbnN0IGludCB3enh4ID0gMHhCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p4eSA9IDB4NEI7CiAgc3RhdGljIGNvbnN0IGludCB3enh6ID0gMHg4QjsKICBzdGF0aWMgY29uc3QgaW50IHd6eHcgPSAweENCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p5eCA9IDB4MUI7CiAgc3RhdGljIGNvbnN0IGludCB3enl5ID0gMHg1QjsKICBzdGF0aWMgY29uc3QgaW50IHd6eXogPSAweDlCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p5dyA9IDB4REI7CiAgc3RhdGljIGNvbnN0IGludCB3enp4ID0gMHgyQjsKICBzdGF0aWMgY29uc3QgaW50IHd6enkgPSAweDZCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p6eiA9IDB4QUI7CiAgc3RhdGljIGNvbnN0IGludCB3enp3ID0gMHhFQjsKICBzdGF0aWMgY29uc3QgaW50IHd6d3ggPSAweDNCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p3eSA9IDB4N0I7CiAgc3RhdGljIGNvbnN0IGludCB3end6ID0gMHhCQjsKICBzdGF0aWMgY29uc3QgaW50IHd6d3cgPSAweEZCOwogIHN0YXRpYyBjb25zdCBpbnQgd3d4eCA9IDB4RjsKICBzdGF0aWMgY29uc3QgaW50IHd3eHkgPSAweDRGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d4eiA9IDB4OEY7CiAgc3RhdGljIGNvbnN0IGludCB3d3h3ID0gMHhDRjsKICBzdGF0aWMgY29uc3QgaW50IHd3eXggPSAweDFGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d5eSA9IDB4NUY7CiAgc3RhdGljIGNvbnN0IGludCB3d3l6ID0gMHg5RjsKICBzdGF0aWMgY29uc3QgaW50IHd3eXcgPSAweERGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d6eCA9IDB4MkY7CiAgc3RhdGljIGNvbnN0IGludCB3d3p5ID0gMHg2RjsKICBzdGF0aWMgY29uc3QgaW50IHd3enogPSAweEFGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d6dyA9IDB4RUY7CiAgc3RhdGljIGNvbnN0IGludCB3d3d4ID0gMHgzRjsKICBzdGF0aWMgY29uc3QgaW50IHd3d3kgPSAweDdGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d3eiA9IDB4QkY7CiAgc3RhdGljIGNvbnN0IGludCB3d3d3ID0gMHhGRjsKCiAgLy8vIFNodWZmbGUgdGhlIGxhbmUgdmFsdWVzLiBbbWFza10gbXVzdCBiZSBvbmUgb2YgdGhlIDI1NiBzaHVmZmxlIGNvbnN0YW50cy4KICBGbG9hdDMyeDQgc2h1ZmZsZShpbnQgbWFzayk7CgogIC8vLyBTaHVmZmxlIHRoZSBsYW5lIHZhbHVlcyBpbiBbdGhpc10gYW5kIFtvdGhlcl0uIFRoZSByZXR1cm5lZAogIC8vLyBGbG9hdDMyeDQgd2lsbCBoYXZlIFhZIGxhbmVzIGZyb20gW3RoaXNdIGFuZCBaVyBsYW5lcyBmcm9tIFtvdGhlcl0uCiAgLy8vIFVzZXMgdGhlIHNhbWUgW21hc2tdIGFzIFtzaHVmZmxlXS4KICBGbG9hdDMyeDQgc2h1ZmZsZU1peChGbG9hdDMyeDQgb3RoZXIsIGludCBtYXNrKTsKCiAgLy8vIFJldHVybnMgYSBuZXcgW0Zsb2F0MzJ4NF0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgeCB2YWx1ZS4KICBGbG9hdDMyeDQgd2l0aFgoZG91YmxlIHgpOwoKICAvLy8gUmV0dXJucyBhIG5ldyBbRmxvYXQzMng0XSBjb3BpZWQgZnJvbSBbdGhpc10gd2l0aCBhIG5ldyB5IHZhbHVlLgogIEZsb2F0MzJ4NCB3aXRoWShkb3VibGUgeSk7CgogIC8vLyBSZXR1cm5zIGEgbmV3IFtGbG9hdDMyeDRdIGNvcGllZCBmcm9tIFt0aGlzXSB3aXRoIGEgbmV3IHogdmFsdWUuCiAgRmxvYXQzMng0IHdpdGhaKGRvdWJsZSB6KTsKCiAgLy8vIFJldHVybnMgYSBuZXcgW0Zsb2F0MzJ4NF0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgdyB2YWx1ZS4KICBGbG9hdDMyeDQgd2l0aFcoZG91YmxlIHcpOwoKICAvLy8gUmV0dXJucyB0aGUgbGFuZS13aXNlIG1pbmltdW0gdmFsdWUgaW4gW3RoaXNdIG9yIFtvdGhlcl0uCiAgRmxvYXQzMng0IG1pbihGbG9hdDMyeDQgb3RoZXIpOwoKICAvLy8gUmV0dXJucyB0aGUgbGFuZS13aXNlIG1heGltdW0gdmFsdWUgaW4gW3RoaXNdIG9yIFtvdGhlcl0uCiAgRmxvYXQzMng0IG1heChGbG9hdDMyeDQgb3RoZXIpOwoKICAvLy8gUmV0dXJucyB0aGUgc3F1YXJlIHJvb3Qgb2YgW3RoaXNdLgogIEZsb2F0MzJ4NCBzcXJ0KCk7CgogIC8vLyBSZXR1cm5zIHRoZSByZWNpcHJvY2FsIG9mIFt0aGlzXS4KICBGbG9hdDMyeDQgcmVjaXByb2NhbCgpOwoKICAvLy8gUmV0dXJucyB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIHJlY2lwcm9jYWwgb2YgW3RoaXNdLgogIEZsb2F0MzJ4NCByZWNpcHJvY2FsU3FydCgpOwp9CgovKioKICogSW50MzJ4NCBhbmQgb3BlcmF0aW9ucy4KICoKICogSW50MzJ4NCBzdG9yZXMgNCAzMi1iaXQgYml0LW1hc2tzIGluICJsYW5lcyIuCiAqIFRoZSBsYW5lcyBhcmUgIngiLCAieSIsICJ6IiwgYW5kICJ3IiByZXNwZWN0aXZlbHkuCiAqLwphYnN0cmFjdCBjbGFzcyBJbnQzMng0IHsKICBleHRlcm5hbCBmYWN0b3J5IEludDMyeDQoaW50IHgsIGludCB5LCBpbnQgeiwgaW50IHcpOwogIGV4dGVybmFsIGZhY3RvcnkgSW50MzJ4NC5ib29sKGJvb2wgeCwgYm9vbCB5LCBib29sIHosIGJvb2wgdyk7CiAgZXh0ZXJuYWwgZmFjdG9yeSBJbnQzMng0LmZyb21GbG9hdDMyeDRCaXRzKEZsb2F0MzJ4NCB4KTsKCiAgLy8vIFRoZSBiaXQtd2lzZSBvciBvcGVyYXRvci4KICBJbnQzMng0IG9wZXJhdG9yIHwoSW50MzJ4NCBvdGhlcik7CgogIC8vLyBUaGUgYml0LXdpc2UgYW5kIG9wZXJhdG9yLgogIEludDMyeDQgb3BlcmF0b3IgJihJbnQzMng0IG90aGVyKTsKCiAgLy8vIFRoZSBiaXQtd2lzZSB4b3Igb3BlcmF0b3IuCiAgSW50MzJ4NCBvcGVyYXRvciBeKEludDMyeDQgb3RoZXIpOwoKICAvLy8gQWRkaXRpb24gb3BlcmF0b3IuCiAgSW50MzJ4NCBvcGVyYXRvciArKEludDMyeDQgb3RoZXIpOwoKICAvLy8gU3VidHJhY3Rpb24gb3BlcmF0b3IuCiAgSW50MzJ4NCBvcGVyYXRvciAtKEludDMyeDQgb3RoZXIpOwoKICAvLy8gRXh0cmFjdCAzMi1iaXQgbWFzayBmcm9tIHggbGFuZS4KICBpbnQgZ2V0IHg7CgogIC8vLyBFeHRyYWN0IDMyLWJpdCBtYXNrIGZyb20geSBsYW5lLgogIGludCBnZXQgeTsKCiAgLy8vIEV4dHJhY3QgMzItYml0IG1hc2sgZnJvbSB6IGxhbmUuCiAgaW50IGdldCB6OwoKICAvLy8gRXh0cmFjdCAzMi1iaXQgbWFzayBmcm9tIHcgbGFuZS4KICBpbnQgZ2V0IHc7CgogIC8vLyBFeHRyYWN0IHRoZSB0b3AgYml0IGZyb20gZWFjaCBsYW5lIHJldHVybiB0aGVtIGluIHRoZSBmaXJzdCA0IGJpdHMuCiAgLy8vICJ4IiBsYW5lIGlzIGJpdCAwLgogIC8vLyAieSIgbGFuZSBpcyBiaXQgMS4KICAvLy8gInoiIGxhbmUgaXMgYml0IDIuCiAgLy8vICJ3IiBsYW5lIGlzIGJpdCAzLgogIGludCBnZXQgc2lnbk1hc2s7CgogIC8vLyBNYXNrIHBhc3NlZCB0byBbc2h1ZmZsZV0gb3IgW3NodWZmbGVNaXhdLgogIHN0YXRpYyBjb25zdCBpbnQgeHh4eCA9IDB4MDsKICBzdGF0aWMgY29uc3QgaW50IHh4eHkgPSAweDQwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh4eiA9IDB4ODA7CiAgc3RhdGljIGNvbnN0IGludCB4eHh3ID0gMHhDMDsKICBzdGF0aWMgY29uc3QgaW50IHh4eXggPSAweDEwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh5eSA9IDB4NTA7CiAgc3RhdGljIGNvbnN0IGludCB4eHl6ID0gMHg5MDsKICBzdGF0aWMgY29uc3QgaW50IHh4eXcgPSAweEQwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh6eCA9IDB4MjA7CiAgc3RhdGljIGNvbnN0IGludCB4eHp5ID0gMHg2MDsKICBzdGF0aWMgY29uc3QgaW50IHh4enogPSAweEEwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh6dyA9IDB4RTA7CiAgc3RhdGljIGNvbnN0IGludCB4eHd4ID0gMHgzMDsKICBzdGF0aWMgY29uc3QgaW50IHh4d3kgPSAweDcwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh3eiA9IDB4QjA7CiAgc3RhdGljIGNvbnN0IGludCB4eHd3ID0gMHhGMDsKICBzdGF0aWMgY29uc3QgaW50IHh5eHggPSAweDQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXh5ID0gMHg0NDsKICBzdGF0aWMgY29uc3QgaW50IHh5eHogPSAweDg0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl4dyA9IDB4QzQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXl4ID0gMHgxNDsKICBzdGF0aWMgY29uc3QgaW50IHh5eXkgPSAweDU0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl5eiA9IDB4OTQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXl3ID0gMHhENDsKICBzdGF0aWMgY29uc3QgaW50IHh5enggPSAweDI0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl6eSA9IDB4NjQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXp6ID0gMHhBNDsKICBzdGF0aWMgY29uc3QgaW50IHh5encgPSAweEU0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl3eCA9IDB4MzQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXd5ID0gMHg3NDsKICBzdGF0aWMgY29uc3QgaW50IHh5d3ogPSAweEI0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl3dyA9IDB4RjQ7CiAgc3RhdGljIGNvbnN0IGludCB4enh4ID0gMHg4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp4eSA9IDB4NDg7CiAgc3RhdGljIGNvbnN0IGludCB4enh6ID0gMHg4ODsKICBzdGF0aWMgY29uc3QgaW50IHh6eHcgPSAweEM4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp5eCA9IDB4MTg7CiAgc3RhdGljIGNvbnN0IGludCB4enl5ID0gMHg1ODsKICBzdGF0aWMgY29uc3QgaW50IHh6eXogPSAweDk4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp5dyA9IDB4RDg7CiAgc3RhdGljIGNvbnN0IGludCB4enp4ID0gMHgyODsKICBzdGF0aWMgY29uc3QgaW50IHh6enkgPSAweDY4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp6eiA9IDB4QTg7CiAgc3RhdGljIGNvbnN0IGludCB4enp3ID0gMHhFODsKICBzdGF0aWMgY29uc3QgaW50IHh6d3ggPSAweDM4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp3eSA9IDB4Nzg7CiAgc3RhdGljIGNvbnN0IGludCB4end6ID0gMHhCODsKICBzdGF0aWMgY29uc3QgaW50IHh6d3cgPSAweEY4OwogIHN0YXRpYyBjb25zdCBpbnQgeHd4eCA9IDB4QzsKICBzdGF0aWMgY29uc3QgaW50IHh3eHkgPSAweDRDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd4eiA9IDB4OEM7CiAgc3RhdGljIGNvbnN0IGludCB4d3h3ID0gMHhDQzsKICBzdGF0aWMgY29uc3QgaW50IHh3eXggPSAweDFDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd5eSA9IDB4NUM7CiAgc3RhdGljIGNvbnN0IGludCB4d3l6ID0gMHg5QzsKICBzdGF0aWMgY29uc3QgaW50IHh3eXcgPSAweERDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd6eCA9IDB4MkM7CiAgc3RhdGljIGNvbnN0IGludCB4d3p5ID0gMHg2QzsKICBzdGF0aWMgY29uc3QgaW50IHh3enogPSAweEFDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd6dyA9IDB4RUM7CiAgc3RhdGljIGNvbnN0IGludCB4d3d4ID0gMHgzQzsKICBzdGF0aWMgY29uc3QgaW50IHh3d3kgPSAweDdDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd3eiA9IDB4QkM7CiAgc3RhdGljIGNvbnN0IGludCB4d3d3ID0gMHhGQzsKICBzdGF0aWMgY29uc3QgaW50IHl4eHggPSAweDE7CiAgc3RhdGljIGNvbnN0IGludCB5eHh5ID0gMHg0MTsKICBzdGF0aWMgY29uc3QgaW50IHl4eHogPSAweDgxOwogIHN0YXRpYyBjb25zdCBpbnQgeXh4dyA9IDB4QzE7CiAgc3RhdGljIGNvbnN0IGludCB5eHl4ID0gMHgxMTsKICBzdGF0aWMgY29uc3QgaW50IHl4eXkgPSAweDUxOwogIHN0YXRpYyBjb25zdCBpbnQgeXh5eiA9IDB4OTE7CiAgc3RhdGljIGNvbnN0IGludCB5eHl3ID0gMHhEMTsKICBzdGF0aWMgY29uc3QgaW50IHl4enggPSAweDIxOwogIHN0YXRpYyBjb25zdCBpbnQgeXh6eSA9IDB4NjE7CiAgc3RhdGljIGNvbnN0IGludCB5eHp6ID0gMHhBMTsKICBzdGF0aWMgY29uc3QgaW50IHl4encgPSAweEUxOwogIHN0YXRpYyBjb25zdCBpbnQgeXh3eCA9IDB4MzE7CiAgc3RhdGljIGNvbnN0IGludCB5eHd5ID0gMHg3MTsKICBzdGF0aWMgY29uc3QgaW50IHl4d3ogPSAweEIxOwogIHN0YXRpYyBjb25zdCBpbnQgeXh3dyA9IDB4RjE7CiAgc3RhdGljIGNvbnN0IGludCB5eXh4ID0gMHg1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl4eSA9IDB4NDU7CiAgc3RhdGljIGNvbnN0IGludCB5eXh6ID0gMHg4NTsKICBzdGF0aWMgY29uc3QgaW50IHl5eHcgPSAweEM1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl5eCA9IDB4MTU7CiAgc3RhdGljIGNvbnN0IGludCB5eXl5ID0gMHg1NTsKICBzdGF0aWMgY29uc3QgaW50IHl5eXogPSAweDk1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl5dyA9IDB4RDU7CiAgc3RhdGljIGNvbnN0IGludCB5eXp4ID0gMHgyNTsKICBzdGF0aWMgY29uc3QgaW50IHl5enkgPSAweDY1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl6eiA9IDB4QTU7CiAgc3RhdGljIGNvbnN0IGludCB5eXp3ID0gMHhFNTsKICBzdGF0aWMgY29uc3QgaW50IHl5d3ggPSAweDM1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl3eSA9IDB4NzU7CiAgc3RhdGljIGNvbnN0IGludCB5eXd6ID0gMHhCNTsKICBzdGF0aWMgY29uc3QgaW50IHl5d3cgPSAweEY1OwogIHN0YXRpYyBjb25zdCBpbnQgeXp4eCA9IDB4OTsKICBzdGF0aWMgY29uc3QgaW50IHl6eHkgPSAweDQ5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp4eiA9IDB4ODk7CiAgc3RhdGljIGNvbnN0IGludCB5enh3ID0gMHhDOTsKICBzdGF0aWMgY29uc3QgaW50IHl6eXggPSAweDE5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp5eSA9IDB4NTk7CiAgc3RhdGljIGNvbnN0IGludCB5enl6ID0gMHg5OTsKICBzdGF0aWMgY29uc3QgaW50IHl6eXcgPSAweEQ5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp6eCA9IDB4Mjk7CiAgc3RhdGljIGNvbnN0IGludCB5enp5ID0gMHg2OTsKICBzdGF0aWMgY29uc3QgaW50IHl6enogPSAweEE5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp6dyA9IDB4RTk7CiAgc3RhdGljIGNvbnN0IGludCB5end4ID0gMHgzOTsKICBzdGF0aWMgY29uc3QgaW50IHl6d3kgPSAweDc5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp3eiA9IDB4Qjk7CiAgc3RhdGljIGNvbnN0IGludCB5end3ID0gMHhGOTsKICBzdGF0aWMgY29uc3QgaW50IHl3eHggPSAweEQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3h5ID0gMHg0RDsKICBzdGF0aWMgY29uc3QgaW50IHl3eHogPSAweDhEOwogIHN0YXRpYyBjb25zdCBpbnQgeXd4dyA9IDB4Q0Q7CiAgc3RhdGljIGNvbnN0IGludCB5d3l4ID0gMHgxRDsKICBzdGF0aWMgY29uc3QgaW50IHl3eXkgPSAweDVEOwogIHN0YXRpYyBjb25zdCBpbnQgeXd5eiA9IDB4OUQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3l3ID0gMHhERDsKICBzdGF0aWMgY29uc3QgaW50IHl3enggPSAweDJEOwogIHN0YXRpYyBjb25zdCBpbnQgeXd6eSA9IDB4NkQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3p6ID0gMHhBRDsKICBzdGF0aWMgY29uc3QgaW50IHl3encgPSAweEVEOwogIHN0YXRpYyBjb25zdCBpbnQgeXd3eCA9IDB4M0Q7CiAgc3RhdGljIGNvbnN0IGludCB5d3d5ID0gMHg3RDsKICBzdGF0aWMgY29uc3QgaW50IHl3d3ogPSAweEJEOwogIHN0YXRpYyBjb25zdCBpbnQgeXd3dyA9IDB4RkQ7CiAgc3RhdGljIGNvbnN0IGludCB6eHh4ID0gMHgyOwogIHN0YXRpYyBjb25zdCBpbnQgenh4eSA9IDB4NDI7CiAgc3RhdGljIGNvbnN0IGludCB6eHh6ID0gMHg4MjsKICBzdGF0aWMgY29uc3QgaW50IHp4eHcgPSAweEMyOwogIHN0YXRpYyBjb25zdCBpbnQgenh5eCA9IDB4MTI7CiAgc3RhdGljIGNvbnN0IGludCB6eHl5ID0gMHg1MjsKICBzdGF0aWMgY29uc3QgaW50IHp4eXogPSAweDkyOwogIHN0YXRpYyBjb25zdCBpbnQgenh5dyA9IDB4RDI7CiAgc3RhdGljIGNvbnN0IGludCB6eHp4ID0gMHgyMjsKICBzdGF0aWMgY29uc3QgaW50IHp4enkgPSAweDYyOwogIHN0YXRpYyBjb25zdCBpbnQgenh6eiA9IDB4QTI7CiAgc3RhdGljIGNvbnN0IGludCB6eHp3ID0gMHhFMjsKICBzdGF0aWMgY29uc3QgaW50IHp4d3ggPSAweDMyOwogIHN0YXRpYyBjb25zdCBpbnQgenh3eSA9IDB4NzI7CiAgc3RhdGljIGNvbnN0IGludCB6eHd6ID0gMHhCMjsKICBzdGF0aWMgY29uc3QgaW50IHp4d3cgPSAweEYyOwogIHN0YXRpYyBjb25zdCBpbnQgenl4eCA9IDB4NjsKICBzdGF0aWMgY29uc3QgaW50IHp5eHkgPSAweDQ2OwogIHN0YXRpYyBjb25zdCBpbnQgenl4eiA9IDB4ODY7CiAgc3RhdGljIGNvbnN0IGludCB6eXh3ID0gMHhDNjsKICBzdGF0aWMgY29uc3QgaW50IHp5eXggPSAweDE2OwogIHN0YXRpYyBjb25zdCBpbnQgenl5eSA9IDB4NTY7CiAgc3RhdGljIGNvbnN0IGludCB6eXl6ID0gMHg5NjsKICBzdGF0aWMgY29uc3QgaW50IHp5eXcgPSAweEQ2OwogIHN0YXRpYyBjb25zdCBpbnQgenl6eCA9IDB4MjY7CiAgc3RhdGljIGNvbnN0IGludCB6eXp5ID0gMHg2NjsKICBzdGF0aWMgY29uc3QgaW50IHp5enogPSAweEE2OwogIHN0YXRpYyBjb25zdCBpbnQgenl6dyA9IDB4RTY7CiAgc3RhdGljIGNvbnN0IGludCB6eXd4ID0gMHgzNjsKICBzdGF0aWMgY29uc3QgaW50IHp5d3kgPSAweDc2OwogIHN0YXRpYyBjb25zdCBpbnQgenl3eiA9IDB4QjY7CiAgc3RhdGljIGNvbnN0IGludCB6eXd3ID0gMHhGNjsKICBzdGF0aWMgY29uc3QgaW50IHp6eHggPSAweEE7CiAgc3RhdGljIGNvbnN0IGludCB6enh5ID0gMHg0QTsKICBzdGF0aWMgY29uc3QgaW50IHp6eHogPSAweDhBOwogIHN0YXRpYyBjb25zdCBpbnQgenp4dyA9IDB4Q0E7CiAgc3RhdGljIGNvbnN0IGludCB6enl4ID0gMHgxQTsKICBzdGF0aWMgY29uc3QgaW50IHp6eXkgPSAweDVBOwogIHN0YXRpYyBjb25zdCBpbnQgenp5eiA9IDB4OUE7CiAgc3RhdGljIGNvbnN0IGludCB6enl3ID0gMHhEQTsKICBzdGF0aWMgY29uc3QgaW50IHp6enggPSAweDJBOwogIHN0YXRpYyBjb25zdCBpbnQgenp6eSA9IDB4NkE7CiAgc3RhdGljIGNvbnN0IGludCB6enp6ID0gMHhBQTsKICBzdGF0aWMgY29uc3QgaW50IHp6encgPSAweEVBOwogIHN0YXRpYyBjb25zdCBpbnQgenp3eCA9IDB4M0E7CiAgc3RhdGljIGNvbnN0IGludCB6end5ID0gMHg3QTsKICBzdGF0aWMgY29uc3QgaW50IHp6d3ogPSAweEJBOwogIHN0YXRpYyBjb25zdCBpbnQgenp3dyA9IDB4RkE7CiAgc3RhdGljIGNvbnN0IGludCB6d3h4ID0gMHhFOwogIHN0YXRpYyBjb25zdCBpbnQgend4eSA9IDB4NEU7CiAgc3RhdGljIGNvbnN0IGludCB6d3h6ID0gMHg4RTsKICBzdGF0aWMgY29uc3QgaW50IHp3eHcgPSAweENFOwogIHN0YXRpYyBjb25zdCBpbnQgend5eCA9IDB4MUU7CiAgc3RhdGljIGNvbnN0IGludCB6d3l5ID0gMHg1RTsKICBzdGF0aWMgY29uc3QgaW50IHp3eXogPSAweDlFOwogIHN0YXRpYyBjb25zdCBpbnQgend5dyA9IDB4REU7CiAgc3RhdGljIGNvbnN0IGludCB6d3p4ID0gMHgyRTsKICBzdGF0aWMgY29uc3QgaW50IHp3enkgPSAweDZFOwogIHN0YXRpYyBjb25zdCBpbnQgend6eiA9IDB4QUU7CiAgc3RhdGljIGNvbnN0IGludCB6d3p3ID0gMHhFRTsKICBzdGF0aWMgY29uc3QgaW50IHp3d3ggPSAweDNFOwogIHN0YXRpYyBjb25zdCBpbnQgend3eSA9IDB4N0U7CiAgc3RhdGljIGNvbnN0IGludCB6d3d6ID0gMHhCRTsKICBzdGF0aWMgY29uc3QgaW50IHp3d3cgPSAweEZFOwogIHN0YXRpYyBjb25zdCBpbnQgd3h4eCA9IDB4MzsKICBzdGF0aWMgY29uc3QgaW50IHd4eHkgPSAweDQzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h4eiA9IDB4ODM7CiAgc3RhdGljIGNvbnN0IGludCB3eHh3ID0gMHhDMzsKICBzdGF0aWMgY29uc3QgaW50IHd4eXggPSAweDEzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h5eSA9IDB4NTM7CiAgc3RhdGljIGNvbnN0IGludCB3eHl6ID0gMHg5MzsKICBzdGF0aWMgY29uc3QgaW50IHd4eXcgPSAweEQzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h6eCA9IDB4MjM7CiAgc3RhdGljIGNvbnN0IGludCB3eHp5ID0gMHg2MzsKICBzdGF0aWMgY29uc3QgaW50IHd4enogPSAweEEzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h6dyA9IDB4RTM7CiAgc3RhdGljIGNvbnN0IGludCB3eHd4ID0gMHgzMzsKICBzdGF0aWMgY29uc3QgaW50IHd4d3kgPSAweDczOwogIHN0YXRpYyBjb25zdCBpbnQgd3h3eiA9IDB4QjM7CiAgc3RhdGljIGNvbnN0IGludCB3eHd3ID0gMHhGMzsKICBzdGF0aWMgY29uc3QgaW50IHd5eHggPSAweDc7CiAgc3RhdGljIGNvbnN0IGludCB3eXh5ID0gMHg0NzsKICBzdGF0aWMgY29uc3QgaW50IHd5eHogPSAweDg3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l4dyA9IDB4Qzc7CiAgc3RhdGljIGNvbnN0IGludCB3eXl4ID0gMHgxNzsKICBzdGF0aWMgY29uc3QgaW50IHd5eXkgPSAweDU3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l5eiA9IDB4OTc7CiAgc3RhdGljIGNvbnN0IGludCB3eXl3ID0gMHhENzsKICBzdGF0aWMgY29uc3QgaW50IHd5enggPSAweDI3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l6eSA9IDB4Njc7CiAgc3RhdGljIGNvbnN0IGludCB3eXp6ID0gMHhBNzsKICBzdGF0aWMgY29uc3QgaW50IHd5encgPSAweEU3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l3eCA9IDB4Mzc7CiAgc3RhdGljIGNvbnN0IGludCB3eXd5ID0gMHg3NzsKICBzdGF0aWMgY29uc3QgaW50IHd5d3ogPSAweEI3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l3dyA9IDB4Rjc7CiAgc3RhdGljIGNvbnN0IGludCB3enh4ID0gMHhCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p4eSA9IDB4NEI7CiAgc3RhdGljIGNvbnN0IGludCB3enh6ID0gMHg4QjsKICBzdGF0aWMgY29uc3QgaW50IHd6eHcgPSAweENCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p5eCA9IDB4MUI7CiAgc3RhdGljIGNvbnN0IGludCB3enl5ID0gMHg1QjsKICBzdGF0aWMgY29uc3QgaW50IHd6eXogPSAweDlCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p5dyA9IDB4REI7CiAgc3RhdGljIGNvbnN0IGludCB3enp4ID0gMHgyQjsKICBzdGF0aWMgY29uc3QgaW50IHd6enkgPSAweDZCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p6eiA9IDB4QUI7CiAgc3RhdGljIGNvbnN0IGludCB3enp3ID0gMHhFQjsKICBzdGF0aWMgY29uc3QgaW50IHd6d3ggPSAweDNCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p3eSA9IDB4N0I7CiAgc3RhdGljIGNvbnN0IGludCB3end6ID0gMHhCQjsKICBzdGF0aWMgY29uc3QgaW50IHd6d3cgPSAweEZCOwogIHN0YXRpYyBjb25zdCBpbnQgd3d4eCA9IDB4RjsKICBzdGF0aWMgY29uc3QgaW50IHd3eHkgPSAweDRGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d4eiA9IDB4OEY7CiAgc3RhdGljIGNvbnN0IGludCB3d3h3ID0gMHhDRjsKICBzdGF0aWMgY29uc3QgaW50IHd3eXggPSAweDFGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d5eSA9IDB4NUY7CiAgc3RhdGljIGNvbnN0IGludCB3d3l6ID0gMHg5RjsKICBzdGF0aWMgY29uc3QgaW50IHd3eXcgPSAweERGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d6eCA9IDB4MkY7CiAgc3RhdGljIGNvbnN0IGludCB3d3p5ID0gMHg2RjsKICBzdGF0aWMgY29uc3QgaW50IHd3enogPSAweEFGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d6dyA9IDB4RUY7CiAgc3RhdGljIGNvbnN0IGludCB3d3d4ID0gMHgzRjsKICBzdGF0aWMgY29uc3QgaW50IHd3d3kgPSAweDdGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d3eiA9IDB4QkY7CiAgc3RhdGljIGNvbnN0IGludCB3d3d3ID0gMHhGRjsKCiAgLy8vIFNodWZmbGUgdGhlIGxhbmUgdmFsdWVzLiBbbWFza10gbXVzdCBiZSBvbmUgb2YgdGhlIDI1NiBzaHVmZmxlIGNvbnN0YW50cy4KICBJbnQzMng0IHNodWZmbGUoaW50IG1hc2spOwoKICAvLy8gU2h1ZmZsZSB0aGUgbGFuZSB2YWx1ZXMgaW4gW3RoaXNdIGFuZCBbb3RoZXJdLiBUaGUgcmV0dXJuZWQKICAvLy8gSW50MzJ4NCB3aWxsIGhhdmUgWFkgbGFuZXMgZnJvbSBbdGhpc10gYW5kIFpXIGxhbmVzIGZyb20gW290aGVyXS4KICAvLy8gVXNlcyB0aGUgc2FtZSBbbWFza10gYXMgW3NodWZmbGVdLgogIEludDMyeDQgc2h1ZmZsZU1peChJbnQzMng0IG90aGVyLCBpbnQgbWFzayk7CgogIC8vLyBSZXR1cm5zIGEgbmV3IFtJbnQzMng0XSBjb3BpZWQgZnJvbSBbdGhpc10gd2l0aCBhIG5ldyB4IHZhbHVlLgogIEludDMyeDQgd2l0aFgoaW50IHgpOwoKICAvLy8gUmV0dXJucyBhIG5ldyBbSW50MzJ4NF0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgeSB2YWx1ZS4KICBJbnQzMng0IHdpdGhZKGludCB5KTsKCiAgLy8vIFJldHVybnMgYSBuZXcgW0ludDMyeDRdIGNvcGllZCBmcm9tIFt0aGlzXSB3aXRoIGEgbmV3IHogdmFsdWUuCiAgSW50MzJ4NCB3aXRoWihpbnQgeik7CgogIC8vLyBSZXR1cm5zIGEgbmV3IFtJbnQzMng0XSBjb3BpZWQgZnJvbSBbdGhpc10gd2l0aCBhIG5ldyB3IHZhbHVlLgogIEludDMyeDQgd2l0aFcoaW50IHcpOwoKICAvLy8gRXh0cmFjdGVkIHggdmFsdWUuIFJldHVybnMgZmFsc2UgZm9yIDAsIHRydWUgZm9yIGFueSBvdGhlciB2YWx1ZS4KICBib29sIGdldCBmbGFnWDsKCiAgLy8vIEV4dHJhY3RlZCB5IHZhbHVlLiBSZXR1cm5zIGZhbHNlIGZvciAwLCB0cnVlIGZvciBhbnkgb3RoZXIgdmFsdWUuCiAgYm9vbCBnZXQgZmxhZ1k7CgogIC8vLyBFeHRyYWN0ZWQgeiB2YWx1ZS4gUmV0dXJucyBmYWxzZSBmb3IgMCwgdHJ1ZSBmb3IgYW55IG90aGVyIHZhbHVlLgogIGJvb2wgZ2V0IGZsYWdaOwoKICAvLy8gRXh0cmFjdGVkIHcgdmFsdWUuIFJldHVybnMgZmFsc2UgZm9yIDAsIHRydWUgZm9yIGFueSBvdGhlciB2YWx1ZS4KICBib29sIGdldCBmbGFnVzsKCiAgLy8vIFJldHVybnMgYSBuZXcgW0ludDMyeDRdIGNvcGllZCBmcm9tIFt0aGlzXSB3aXRoIGEgbmV3IHggdmFsdWUuCiAgSW50MzJ4NCB3aXRoRmxhZ1goYm9vbCB4KTsKCiAgLy8vIFJldHVybnMgYSBuZXcgW0ludDMyeDRdIGNvcGllZCBmcm9tIFt0aGlzXSB3aXRoIGEgbmV3IHkgdmFsdWUuCiAgSW50MzJ4NCB3aXRoRmxhZ1koYm9vbCB5KTsKCiAgLy8vIFJldHVybnMgYSBuZXcgW0ludDMyeDRdIGNvcGllZCBmcm9tIFt0aGlzXSB3aXRoIGEgbmV3IHogdmFsdWUuCiAgSW50MzJ4NCB3aXRoRmxhZ1ooYm9vbCB6KTsKCiAgLy8vIFJldHVybnMgYSBuZXcgW0ludDMyeDRdIGNvcGllZCBmcm9tIFt0aGlzXSB3aXRoIGEgbmV3IHcgdmFsdWUuCiAgSW50MzJ4NCB3aXRoRmxhZ1coYm9vbCB3KTsKCiAgLy8vIE1lcmdlIFt0cnVlVmFsdWVdIGFuZCBbZmFsc2VWYWx1ZV0gYmFzZWQgb24gW3RoaXNdJyBiaXQgbWFzazoKICAvLy8gU2VsZWN0IGJpdCBmcm9tIFt0cnVlVmFsdWVdIHdoZW4gYml0IGluIFt0aGlzXSBpcyBvbi4KICAvLy8gU2VsZWN0IGJpdCBmcm9tIFtmYWxzZVZhbHVlXSB3aGVuIGJpdCBpbiBbdGhpc10gaXMgb2ZmLgogIEZsb2F0MzJ4NCBzZWxlY3QoRmxvYXQzMng0IHRydWVWYWx1ZSwgRmxvYXQzMng0IGZhbHNlVmFsdWUpOwp9CgovKioKICogRmxvYXQ2NHgyIGltbXV0YWJsZSB2YWx1ZSB0eXBlIGFuZCBvcGVyYXRpb25zLgogKgogKiBGbG9hdDY0eDIgc3RvcmVzIDIgNjQtYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlcyBpbiAibGFuZXMiLgogKiBUaGUgbGFuZXMgYXJlICJ4IiBhbmQgInkiIHJlc3BlY3RpdmVseS4KICovCmFic3RyYWN0IGNsYXNzIEZsb2F0NjR4MiB7CiAgZXh0ZXJuYWwgZmFjdG9yeSBGbG9hdDY0eDIoZG91YmxlIHgsIGRvdWJsZSB5KTsKICBleHRlcm5hbCBmYWN0b3J5IEZsb2F0NjR4Mi5zcGxhdChkb3VibGUgdik7CiAgZXh0ZXJuYWwgZmFjdG9yeSBGbG9hdDY0eDIuemVybygpOwoKICAvLy8gVXNlcyB0aGUgIngiIGFuZCAieSIgbGFuZXMgZnJvbSBbdl0uCiAgZXh0ZXJuYWwgZmFjdG9yeSBGbG9hdDY0eDIuZnJvbUZsb2F0MzJ4NChGbG9hdDMyeDQgdik7CgogIC8vLyBBZGRpdGlvbiBvcGVyYXRvci4KICBGbG9hdDY0eDIgb3BlcmF0b3IgKyhGbG9hdDY0eDIgb3RoZXIpOwoKICAvLy8gTmVnYXRlIG9wZXJhdG9yLgogIEZsb2F0NjR4MiBvcGVyYXRvciAtKCk7CgogIC8vLyBTdWJ0cmFjdGlvbiBvcGVyYXRvci4KICBGbG9hdDY0eDIgb3BlcmF0b3IgLShGbG9hdDY0eDIgb3RoZXIpOwoKICAvLy8gTXVsdGlwbGljYXRpb24gb3BlcmF0b3IuCiAgRmxvYXQ2NHgyIG9wZXJhdG9yICooRmxvYXQ2NHgyIG90aGVyKTsKCiAgLy8vIERpdmlzaW9uIG9wZXJhdG9yLgogIEZsb2F0NjR4MiBvcGVyYXRvciAvKEZsb2F0NjR4MiBvdGhlcik7CgogIC8vLyBSZXR1cm5zIGEgY29weSBvZiBbdGhpc10gZWFjaCBsYW5lIGJlaW5nIHNjYWxlZCBieSBbc10uCiAgLy8vIEVxdWl2YWxlbnQgdG8gdGhpcyAqIG5ldyBGbG9hdDY0eDIuc3BsYXQocykKICBGbG9hdDY0eDIgc2NhbGUoZG91YmxlIHMpOwoKICAvLy8gUmV0dXJucyB0aGUgbGFuZS13aXNlIGFic29sdXRlIHZhbHVlIG9mIHRoaXMgW0Zsb2F0NjR4Ml0uCiAgRmxvYXQ2NHgyIGFicygpOwoKICAvLy8gTGFuZS13aXNlIGNsYW1wIFt0aGlzXSB0byBiZSBpbiB0aGUgcmFuZ2UgW2xvd2VyTGltaXRdLVt1cHBlckxpbWl0XS4KICBGbG9hdDY0eDIgY2xhbXAoRmxvYXQ2NHgyIGxvd2VyTGltaXQsIEZsb2F0NjR4MiB1cHBlckxpbWl0KTsKCiAgLy8vIEV4dHJhY3RlZCB4IHZhbHVlLgogIGRvdWJsZSBnZXQgeDsKCiAgLy8vIEV4dHJhY3RlZCB5IHZhbHVlLgogIGRvdWJsZSBnZXQgeTsKCiAgLy8vIEV4dHJhY3QgdGhlIHNpZ24gYml0cyBmcm9tIGVhY2ggbGFuZSByZXR1cm4gdGhlbSBpbiB0aGUgZmlyc3QgMiBiaXRzLgogIC8vLyAieCIgbGFuZSBpcyBiaXQgMC4KICAvLy8gInkiIGxhbmUgaXMgYml0IDEuCiAgaW50IGdldCBzaWduTWFzazsKCiAgLy8vIFJldHVybnMgYSBuZXcgW0Zsb2F0NjR4Ml0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgeCB2YWx1ZS4KICBGbG9hdDY0eDIgd2l0aFgoZG91YmxlIHgpOwoKICAvLy8gUmV0dXJucyBhIG5ldyBbRmxvYXQ2NHgyXSBjb3BpZWQgZnJvbSBbdGhpc10gd2l0aCBhIG5ldyB5IHZhbHVlLgogIEZsb2F0NjR4MiB3aXRoWShkb3VibGUgeSk7CgogIC8vLyBSZXR1cm5zIHRoZSBsYW5lLXdpc2UgbWluaW11bSB2YWx1ZSBpbiBbdGhpc10g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ICAgICAfICAgICAgICAgICAgICAgHyAgICAgICAgICAgICAgIB8gICAgICAgICAgICAgICAfICAgICAgICAgICAgICAgHyAgICAgICAgICAgICAgIB8gICAgICAgICAgICAgICAfICAgICAgICAgICAgICAgHyAgICAgICAgICAgICAgIB8gICAgICAgICAgICAgICAfICAgICAgICAgICAgICAgHyAgICAgICAgICAgICAgIB8gICAgICAgICAgICAgICAfICAgICAgICAgICAgICAgAVAfAUJKKTMBRx0BRx0BRx0BRx0BQCIBQCIBKRQBKBoBOx4CAQQbAzE2BBk4QTsBICUBISUBISUBGSUBHCUBJw0BJw0BJw0BJw0BShkZGRkUATAfICAgICAgICAgICAgICAgHyAgICAgICAgICAgICAgIB8gICAgICAgICAgICAgICAfICAgICAgICAgICAgICAgHyAgICAgICAgICAgICAgIB8gICAgICAgICAgICAgICAfICAgICAgICAgICAgICAgHyAgICAgICAgICAgICAgIB8gICAgICAgICAgICAgICAfICAgICAgICAgICAgICAgHyAgICAgICAgICAgICAgIB8gICAgICAgICAgICAgICAfICAgICAgICAgICAgICAgHyAgICAgICAgICAgICAgIB8gICAgICAgICAgICAgICAfICAgICAgICAgICAgICAgAVAdAUJIKS8BRRgBRRgBRRgBRRgBSBIBSBIBSBIBSBIBRR0BRR0BRR0BRR0BRDw+PwIBBDIDPysEGzIuJQErOQEZKQEXGgEcKQEfKQEZKQE+Mh0BQBMBSz8BGRABGRABTBkZFAFHHQFHHQFAIgFAIgEzFAIBD2RhcnQ6dHlwZWRfZGF0YTVvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL3R5cGVkX2RhdGFfcGF0Y2guZGFydMACAyIvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIE5vdGU6IHRoZSBWTSBjb25jYXRlbmF0ZXMgYWxsIHBhdGNoIGZpbGVzIGludG8gYSBzaW5nbGUgcGF0Y2ggZmlsZS4gVGhpcwovLy8gZmlsZSBpcyB0aGUgZmlyc3QgcGF0Y2ggaW4gImRhcnQ6dHlwZWRfZGF0YSIgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBpbXBvcnRzCi8vLyB1c2VkIGJ5IHBhdGNoZXMgb2YgdGhhdCBsaWJyYXJ5LiBXZSBwbGFuIHRvIGNoYW5nZSB0aGlzIHdoZW4gd2UgaGF2ZSBhCi8vLyBzaGFyZWQgZnJvbnQgZW5kIGFuZCBzaW1wbHkgdXNlIHBhcnRzLgoKaW1wb3J0ICJkYXJ0Ol9pbnRlcm5hbCIKICAgIHNob3cKICAgICAgICBDbGFzc0lELAogICAgICAgIENvZGVVbml0cywKICAgICAgICBFeHBhbmRJdGVyYWJsZSwKICAgICAgICBGb2xsb3dlZEJ5SXRlcmFibGUsCiAgICAgICAgSXRlcmFibGVFbGVtZW50RXJyb3IsCiAgICAgICAgTGlzdE1hcFZpZXcsCiAgICAgICAgTGlzdHMsCiAgICAgICAgTWFwcGVkSXRlcmFibGUsCiAgICAgICAgTWFwcGVkSXRlcmFibGUsCiAgICAgICAgUmV2ZXJzZWRMaXN0SXRlcmFibGUsCiAgICAgICAgU2tpcFdoaWxlSXRlcmFibGUsCiAgICAgICAgU29ydCwKICAgICAgICBTdWJMaXN0SXRlcmFibGUsCiAgICAgICAgVGFrZVdoaWxlSXRlcmFibGUsCiAgICAgICAgV2hlcmVJdGVyYWJsZSwKICAgICAgICBXaGVyZVR5cGVJdGVyYWJsZSwKICAgICAgICBwYXRjaDsKCmltcG9ydCAiZGFydDpjb2xsZWN0aW9uIiBzaG93IExpc3RCYXNlOwoKaW1wb3J0ICdkYXJ0Om1hdGgnIHNob3cgUmFuZG9tOwoKLy8vIFRoZXJlIGFyZSBubyBwYXJ0cyBpbiBwYXRjaCBsaWJyYXJ5OgoKQHBhdGNoCmNsYXNzIEJ5dGVEYXRhIGltcGxlbWVudHMgVHlwZWREYXRhIHsKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgZmFjdG9yeSBCeXRlRGF0YShpbnQgbGVuZ3RoKSB7CiAgICBmaW5hbCBsaXN0ID0gbmV3IFVpbnQ4TGlzdChsZW5ndGgpIGFzIF9UeXBlZExpc3Q7CiAgICBfcmFuZ2VDaGVjayhsaXN0Lmxlbmd0aEluQnl0ZXMsIDAsIGxlbmd0aCk7CiAgICByZXR1cm4gbmV3IF9CeXRlRGF0YVZpZXcobGlzdCwgMCwgbGVuZ3RoKTsKICB9CgogIC8vIENhbGxlZCBkaXJlY3RseSBmcm9tIEMgY29kZS4KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgZmFjdG9yeSBCeXRlRGF0YS5fdmlldyhfVHlwZWRMaXN0IHR5cGVkRGF0YSwgaW50IG9mZnNldEluQnl0ZXMsIGludCBsZW5ndGgpIHsKICAgIF9yYW5nZUNoZWNrKHR5cGVkRGF0YS5sZW5ndGhJbkJ5dGVzLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogICAgcmV0dXJuIG5ldyBfQnl0ZURhdGFWaWV3KHR5cGVkRGF0YSwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9Cn0KCi8vIEJhc2VkIGNsYXNzIGZvciBfVHlwZWRMaXN0IHRoYXQgcHJvdmlkZXMgY29tbW9uIG1ldGhvZHMgZm9yIGltcGxlbWVudGluZwovLyB0aGUgY29sbGVjdGlvbiBhbmQgbGlzdCBpbnRlcmZhY2VzLgovLyBUaGlzIGNsYXNzIGRvZXMgbm90IGV4dGVuZCBMaXN0QmFzZTxUPiBzaW5jZSB0aGF0IHdvdWxkIGFkZCB0eXBlIGFyZ3VtZW50cwovLyB0byBpbnN0YW5jZXMgb2YgX1R5cGVMaXN0QmFzZS4gSW5zdGVhZCB0aGUgc3ViY2xhc3NlcyB1c2UgdHlwZSBzcGVjaWZpYwovLyBtaXhpbnMgKGxpa2UgX0ludExpc3RNaXhpbiwgX0RvdWJsZUxpc3RNaXhpbikgdG8gaW1wbGVtZW50IExpc3RCYXNlPFQ+LgphYnN0cmFjdCBjbGFzcyBfVHlwZWRMaXN0QmFzZSB7CiAgaW50IGdldCBsZW5ndGg7CiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXM7CiAgaW50IGdldCBvZmZzZXRJbkJ5dGVzOwogIF9CeXRlQnVmZmVyIGdldCBidWZmZXI7CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIENvbGxlY3Rpb24gaW50ZXJmYWNlLgogIFN0cmluZyBqb2luKFtTdHJpbmcgc2VwYXJhdG9yID0gIiJdKSB7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgYnVmZmVyLndyaXRlQWxsKHRoaXMgYXMgSXRlcmFibGUsIHNlcGFyYXRvcik7CiAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgfQoKICBib29sIGdldCBpc0VtcHR5IHsKICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PSAwOwogIH0KCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiAhaXNFbXB0eTsKCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCgogIHNldCBsZW5ndGgobmV3TGVuZ3RoKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlc2l6ZSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIGNsZWFyKCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICBib29sIHJlbW92ZShPYmplY3QgZWxlbWVudCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIHJlbW92ZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIHJlcGxhY2VSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlIGl0ZXJhYmxlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgT2JqZWN0IGludGVyZmFjZS4KICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBMaXN0QmFzZS5saXN0VG9TdHJpbmcodGhpcyBhcyBMaXN0KTsKCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgoKICAvLyBSZXR1cm5zIHRydWUgaWYgb3BlcmF0aW9uIHN1Y2NlZWRzLgogIC8vICdmcm9tQ2lkJyBhbmQgJ3RvQ2lkJyBtYXkgYmUgY2lkLXMgb2YgdGhlIHZpZXdzIGFuZCB0aGVyZWZvcmUgbWF5IG5vdAogIC8vIG1hdGNoIHRoZSBjaWRzIG9mICd0aGlzJyBhbmQgJ2Zyb20nLgogIC8vIFVzZXMgdG9DaWQgYW5kIGZyb21DaWQgdG8gZGVjaWRlIGlmIGNsYW1waW5nIGlzIG5lY2Vzc2FyeS4KICAvLyBFbGVtZW50IHNpemUgb2YgdG9DaWQgYW5kIGZyb21DaWQgbXVzdCBtYXRjaCAodGVzdCBhdCBjYWxsZXIpLgogIGJvb2wgX3NldFJhbmdlKGludCBzdGFydEluQnl0ZXMsIGludCBsZW5ndGhJbkJ5dGVzLCBfVHlwZWRMaXN0QmFzZSBmcm9tLAogICAgICBpbnQgc3RhcnRGcm9tSW5CeXRlcywgaW50IHRvQ2lkLCBpbnQgZnJvbUNpZCkgbmF0aXZlICJUeXBlZERhdGFfc2V0UmFuZ2UiOwp9CgphYnN0cmFjdCBjbGFzcyBfSW50TGlzdE1peGluIGltcGxlbWVudHMgTGlzdDxpbnQ+IHsKICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlczsKICBpbnQgZ2V0IG9mZnNldEluQnl0ZXM7CiAgX0J5dGVCdWZmZXIgZ2V0IGJ1ZmZlcjsKCiAgTGlzdDxpbnQ+IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpOwoKICBJdGVyYWJsZTxUPiB3aGVyZVR5cGU8VD4oKSA9PiBuZXcgV2hlcmVUeXBlSXRlcmFibGU8VD4odGhpcyk7CgogIEl0ZXJhYmxlPGludD4gZm9sbG93ZWRCeShJdGVyYWJsZTxpbnQ+IG90aGVyKSA9PgogICAgICBuZXcgRm9sbG93ZWRCeUl0ZXJhYmxlPGludD4uZmlyc3RFZmZpY2llbnQodGhpcywgb3RoZXIpOwoKICBMaXN0PFI+IGNhc3Q8Uj4oKSA9PiBMaXN0LmNhc3RGcm9tPGludCwgUj4odGhpcyk7CiAgdm9pZCBzZXQgZmlyc3QoaW50IHZhbHVlKSB7CiAgICBpZiAodGhpcy5sZW5ndGggPT0gMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoMCwgdGhpcyk7CiAgICB0aGlzWzBdID0gdmFsdWU7CiAgfQoKICB2b2lkIHNldCBsYXN0KGludCB2YWx1ZSkgewogICAgaWYgKHRoaXMubGVuZ3RoID09IDApIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KDAsIHRoaXMpOwogICAgdGhpc1t0aGlzLmxlbmd0aCAtIDFdID0gdmFsdWU7CiAgfQoKICBpbnQgaW5kZXhXaGVyZShib29sIHRlc3QoaW50IGVsZW1lbnQpLCBbaW50IHN0YXJ0ID0gMF0pIHsKICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMDsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0ZXN0KHRoaXNbaV0pKSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIGludCBsYXN0SW5kZXhXaGVyZShib29sIHRlc3QoaW50IGVsZW1lbnQpLCBbaW50IHN0YXJ0XSkgewogICAgaWYgKHN0YXJ0ID09IG51bGwgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHN0YXJ0ID0gdGhpcy5sZW5ndGggLSAxOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpID49IDA7IGktLSkgewogICAgICBpZiAodGVzdCh0aGlzW2ldKSkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICBMaXN0PGludD4gb3BlcmF0b3IgKyhMaXN0PGludD4gb3RoZXIpIHsKICAgIGludCB0b3RhbExlbmd0aCA9IHRoaXMubGVuZ3RoICsgb3RoZXIubGVuZ3RoOwogICAgcmV0dXJuIDxpbnQ+W10KICAgICAgLi5sZW5ndGggPSB0b3RhbExlbmd0aAogICAgICAuLnNldFJhbmdlKDAsIHRoaXMubGVuZ3RoLCB0aGlzKQogICAgICAuLnNldFJhbmdlKHRoaXMubGVuZ3RoLCB0b3RhbExlbmd0aCwgb3RoZXIpOwogIH0KCiAgYm9vbCBjb250YWlucyhPYmplY3QgZWxlbWVudCkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgICBpZiAodGhpc1tpXSA9PSBlbGVtZW50KSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIHZvaWQgc2h1ZmZsZShbUmFuZG9tIHJhbmRvbV0pIHsKICAgIHJhbmRvbSA/Pz0gbmV3IFJhbmRvbSgpOwogICAgdmFyIGkgPSB0aGlzLmxlbmd0aDsKICAgIHdoaWxlIChpID4gMSkgewogICAgICBpbnQgcG9zID0gcmFuZG9tLm5leHRJbnQoaSk7CiAgICAgIGkgLT0gMTsKICAgICAgdmFyIHRtcCA9IHRoaXNbaV07CiAgICAgIHRoaXNbaV0gPSB0aGlzW3Bvc107CiAgICAgIHRoaXNbcG9zXSA9IHRtcDsKICAgIH0KICB9CgogIHZvaWQgc2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZTxpbnQ+IGZyb20sIFtpbnQgc2tpcENvdW50ID0gMF0pIHsKICAgIC8vIENoZWNrIHJhbmdlcy4KICAgIGlmICgwID4gc3RhcnQgfHwgc3RhcnQgPiBlbmQgfHwgZW5kID4gbGVuZ3RoKSB7CiAgICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIGxlbmd0aCk7IC8vIEFsd2F5cyB0aHJvd3MuCiAgICAgIGFzc2VydChmYWxzZSk7CiAgICB9CiAgICBpZiAoc2tpcENvdW50IDwgMCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihza2lwQ291bnQpOwogICAgfQoKICAgIGZpbmFsIGNvdW50ID0gZW5kIC0gc3RhcnQ7CiAgICBpZiAoKGZyb20ubGVuZ3RoIC0gc2tpcENvdW50KSA8IGNvdW50KSB7CiAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLnRvb0ZldygpOwogICAgfQoKICAgIGlmIChjb3VudCA9PSAwKSByZXR1cm47CgogICAgaWYgKGZyb20gaXMgX1R5cGVkTGlzdEJhc2UpIHsKICAgICAgLy8gTm90ZTogX1R5cGVkTGlzdEJhc2UgaXMgbm90IHJlbGF0ZWQgdG8gSXRlcmFibGU8aW50PiBzbyB0aGVyZSBpcwogICAgICAvLyBubyBwcm9tb3Rpb24gaGVyZS4KICAgICAgZmluYWwgZnJvbUFzVHlwZWRMaXN0ID0gZnJvbSBhcyBfVHlwZWRMaXN0QmFzZTsKICAgICAgaWYgKHRoaXMuZWxlbWVudFNpemVJbkJ5dGVzID09IGZyb21Bc1R5cGVkTGlzdC5lbGVtZW50U2l6ZUluQnl0ZXMpIHsKICAgICAgICBpZiAoKGNvdW50IDwgMTApICYmIChmcm9tQXNUeXBlZExpc3QuYnVmZmVyICE9IHRoaXMuYnVmZmVyKSkgewogICAgICAgICAgTGlzdHMuY29weShmcm9tIGFzIExpc3Q8aW50Piwgc2tpcENvdW50LCB0aGlzLCBzdGFydCwgY291bnQpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5idWZmZXIuX2RhdGEuX3NldFJhbmdlKAogICAgICAgICAgICBzdGFydCAqIGVsZW1lbnRTaXplSW5CeXRlcyArIHRoaXMub2Zmc2V0SW5CeXRlcywKICAgICAgICAgICAgY291bnQgKiBlbGVtZW50U2l6ZUluQnl0ZXMsCiAgICAgICAgICAgIGZyb21Bc1R5cGVkTGlzdC5idWZmZXIuX2RhdGEsCiAgICAgICAgICAgIHNraXBDb3VudCAqIGVsZW1lbnRTaXplSW5CeXRlcyArIGZyb21Bc1R5cGVkTGlzdC5vZmZzZXRJbkJ5dGVzLAogICAgICAgICAgICBDbGFzc0lELmdldElEKHRoaXMpLAogICAgICAgICAgICBDbGFzc0lELmdldElEKGZyb20pKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChmcm9tQXNUeXBlZExpc3QuYnVmZmVyID09IHRoaXMuYnVmZmVyKSB7CiAgICAgICAgLy8gRGlmZmVyZW50IGVsZW1lbnQgc2l6ZXMsIGJ1dCBzYW1lIGJ1ZmZlciBtZWFucyB0aGF0IHdlIG5lZWQKICAgICAgICAvLyBhbiBpbnRlcm1lZGlhdGUgc3RydWN0dXJlLgogICAgICAgIC8vIFRPRE8oc3JkamFuKTogT3B0aW1pemUgdG8gc2tpcCBjb3B5aW5nIGlmIHRoZSByYW5nZSBkb2VzIG5vdCBvdmVybGFwLgogICAgICAgIGZpbmFsIGZyb21Bc0xpc3QgPSBmcm9tIGFzIExpc3Q8aW50PjsKICAgICAgICBmaW5hbCB0ZW1wQnVmZmVyID0gX2NyZWF0ZUxpc3QoY291bnQpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgdGVtcEJ1ZmZlcltpXSA9IGZyb21Bc0xpc3Rbc2tpcENvdW50ICsgaV07CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgICAgICB0aGlzW2ldID0gdGVtcEJ1ZmZlcltpIC0gc3RhcnRdOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICBMaXN0IG90aGVyTGlzdDsKICAgIGludCBvdGhlclN0YXJ0OwogICAgaWYgKGZyb20gaXMgTGlzdDxpbnQ+KSB7CiAgICAgIG90aGVyTGlzdCA9IGZyb207CiAgICAgIG90aGVyU3RhcnQgPSBza2lwQ291bnQ7CiAgICB9IGVsc2UgewogICAgICBvdGhlckxpc3QgPSBmcm9tLnNraXAoc2tpcENvdW50KS50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICAgICAgb3RoZXJTdGFydCA9IDA7CiAgICB9CiAgICBpZiAob3RoZXJTdGFydCArIGNvdW50ID4gb3RoZXJMaXN0Lmxlbmd0aCkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29GZXcoKTsKICAgIH0KICAgIExpc3RzLmNvcHkob3RoZXJMaXN0LCBvdGhlclN0YXJ0LCB0aGlzLCBzdGFydCwgY291bnQpOwogIH0KCiAgSXRlcmFibGU8aW50PiB3aGVyZShib29sIGYoaW50IGVsZW1lbnQpKSA9PiBuZXcgV2hlcmVJdGVyYWJsZTxpbnQ+KHRoaXMsIGYpOwoKICBJdGVyYWJsZTxpbnQ+IHRha2UoaW50IG4pID0+IG5ldyBTdWJMaXN0SXRlcmFibGU8aW50Pih0aGlzLCAwLCBuKTsKCiAgSXRlcmFibGU8aW50PiB0YWtlV2hpbGUoYm9vbCB0ZXN0KGludCBlbGVtZW50KSkgPT4KICAgICAgbmV3IFRha2VXaGlsZUl0ZXJhYmxlPGludD4odGhpcywgdGVzdCk7CgogIEl0ZXJhYmxlPGludD4gc2tpcChpbnQgbikgPT4gbmV3IFN1Ykxpc3RJdGVyYWJsZTxpbnQ+KHRoaXMsIG4sIG51bGwpOwoKICBJdGVyYWJsZTxpbnQ+IHNraXBXaGlsZShib29sIHRlc3QoaW50IGVsZW1lbnQpKSA9PgogICAgICBuZXcgU2tpcFdoaWxlSXRlcmFibGU8aW50Pih0aGlzLCB0ZXN0KTsKCiAgSXRlcmFibGU8aW50PiBnZXQgcmV2ZXJzZWQgPT4gbmV3IFJldmVyc2VkTGlzdEl0ZXJhYmxlPGludD4odGhpcyk7CgogIE1hcDxpbnQsIGludD4gYXNNYXAoKSA9PiBuZXcgTGlzdE1hcFZpZXc8aW50Pih0aGlzKTsKCiAgSXRlcmFibGU8aW50PiBnZXRSYW5nZShpbnQgc3RhcnQsIFtpbnQgZW5kXSkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgcmV0dXJuIG5ldyBTdWJMaXN0SXRlcmFibGU8aW50Pih0aGlzLCBzdGFydCwgZW5kKTsKICB9CgogIEl0ZXJhdG9yPGludD4gZ2V0IGl0ZXJhdG9yID0+IG5ldyBfVHlwZWRMaXN0SXRlcmF0b3I8aW50Pih0aGlzKTsKCiAgTGlzdDxpbnQ+IHRvTGlzdCh7Ym9vbCBncm93YWJsZTogdHJ1ZX0pIHsKICAgIHJldHVybiBuZXcgTGlzdDxpbnQ+LmZyb20odGhpcywgZ3Jvd2FibGU6IGdyb3dhYmxlKTsKICB9CgogIFNldDxpbnQ+IHRvU2V0KCkgewogICAgcmV0dXJuIG5ldyBTZXQ8aW50Pi5mcm9tKHRoaXMpOwogIH0KCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihpbnQgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgZih0aGlzW2ldKTsKICAgIH0KICB9CgogIGludCByZWR1Y2UoaW50IGNvbWJpbmUoaW50IHZhbHVlLCBpbnQgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGlmIChsZW4gPT0gMCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB2YXIgdmFsdWUgPSB0aGlzWzBdOwogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBsZW47ICsraSkgewogICAgICB2YWx1ZSA9IGNvbWJpbmUodmFsdWUsIHRoaXNbaV0pOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgVCBmb2xkPFQ+KFQgaW5pdGlhbFZhbHVlLCBUIGNvbWJpbmUoVCBpbml0aWFsVmFsdWUsIGludCBlbGVtZW50KSkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgICBpbml0aWFsVmFsdWUgPSBjb21iaW5lKGluaXRpYWxWYWx1ZSwgdGhpc1tpXSk7CiAgICB9CiAgICByZXR1cm4gaW5pdGlhbFZhbHVlOwogIH0KCiAgSXRlcmFibGU8VD4gbWFwPFQ+KFQgZihpbnQgZWxlbWVudCkpID0+IG5ldyBNYXBwZWRJdGVyYWJsZTxpbnQsIFQ+KHRoaXMsIGYpOwoKICBJdGVyYWJsZTxUPiBleHBhbmQ8VD4oSXRlcmFibGU8VD4gZihpbnQgZWxlbWVudCkpID0+CiAgICAgIG5ldyBFeHBhbmRJdGVyYWJsZTxpbnQsIFQ+KHRoaXMsIGYpOwoKICBib29sIGV2ZXJ5KGJvb2wgZihpbnQgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaWYgKCFmKHRoaXNbaV0pKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGJvb2wgYW55KGJvb2wgZihpbnQgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaWYgKGYodGhpc1tpXSkpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgaW50IGZpcnN0V2hlcmUoYm9vbCB0ZXN0KGludCBlbGVtZW50KSwge2ludCBvckVsc2UoKX0pIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzW2ldOwogICAgICBpZiAodGVzdChlbGVtZW50KSkgcmV0dXJuIGVsZW1lbnQ7CiAgICB9CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgaW50IGxhc3RXaGVyZShib29sIHRlc3QoaW50IGVsZW1lbnQpLCB7aW50IG9yRWxzZSgpfSkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IGxlbiAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgIHZhciBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHsKICAgICAgICByZXR1cm4gZWxlbWVudDsKICAgICAgfQogICAgfQogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIGludCBzaW5nbGVXaGVyZShib29sIHRlc3QoaW50IGVsZW1lbnQpLCB7aW50IG9yRWxzZSgpfSkgewogICAgdmFyIHJlc3VsdCA9IG51bGw7CiAgICBib29sIGZvdW5kTWF0Y2hpbmcgPSBmYWxzZTsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzW2ldOwogICAgICBpZiAodGVzdChlbGVtZW50KSkgewogICAgICAgIGlmIChmb3VuZE1hdGNoaW5nKSB7CiAgICAgICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IGVsZW1lbnQ7CiAgICAgICAgZm91bmRNYXRjaGluZyA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIGlmIChmb3VuZE1hdGNoaW5nKSByZXR1cm4gcmVzdWx0OwogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIGludCBlbGVtZW50QXQoaW50IGluZGV4KSB7CiAgICByZXR1cm4gdGhpc1tpbmRleF07CiAgfQoKICB2b2lkIGFkZChpbnQgdmFsdWUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgYWRkIHRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPGludD4gdmFsdWUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgYWRkIHRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgaW5zZXJ0KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGluc2VydCBpbnRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgaW5zZXJ0QWxsKGludCBpbmRleCwgSXRlcmFibGU8aW50PiB2YWx1ZXMpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgaW5zZXJ0IGludG8gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgdm9pZCBzb3J0KFtpbnQgY29tcGFyZShpbnQgYSwgaW50IGIpXSkgewogICAgU29ydC5zb3J0KHRoaXMsIGNvbXBhcmUgPz8gQ29tcGFyYWJsZS5jb21wYXJlKTsKICB9CgogIGludCBpbmRleE9mKGludCBlbGVtZW50LCBbaW50IHN0YXJ0ID0gMF0pIHsKICAgIGlmIChzdGFydCA+PSB0aGlzLmxlbmd0aCkgewogICAgICByZXR1cm4gLTE7CiAgICB9IGVsc2UgaWYgKHN0YXJ0IDwgMCkgewogICAgICBzdGFydCA9IDA7CiAgICB9CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0aGlzW2ldID09IGVsZW1lbnQpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgaW50IGxhc3RJbmRleE9mKGludCBlbGVtZW50LCBbaW50IHN0YXJ0ID0gbnVsbF0pIHsKICAgIGlmIChzdGFydCA9PSBudWxsIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB7CiAgICAgIHN0YXJ0ID0gdGhpcy5sZW5ndGggLSAxOwogICAgfSBlbHNlIGlmIChzdGFydCA8IDApIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpID49IDA7IGktLSkgewogICAgICBpZiAodGhpc1tpXSA9PSBlbGVtZW50KSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIGludCByZW1vdmVMYXN0KCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICBpbnQgcmVtb3ZlQXQoaW50IGluZGV4KSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KGludCBlbGVtZW50KSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChpbnQgZWxlbWVudCkpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgaW50IGdldCBmaXJzdCB7CiAgICBpZiAobGVuZ3RoID4gMCkgcmV0dXJuIHRoaXNbMF07CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIGludCBnZXQgbGFzdCB7CiAgICBpZiAobGVuZ3RoID4gMCkgcmV0dXJuIHRoaXNbbGVuZ3RoIC0gMV07CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIGludCBnZXQgc2luZ2xlIHsKICAgIGlmIChsZW5ndGggPT0gMSkgcmV0dXJuIHRoaXNbMF07CiAgICBpZiAobGVuZ3RoID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogIH0KCiAgTGlzdDxpbnQ+IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgIHZhciBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIExpc3Q8aW50PiByZXN1bHQgPSBfY3JlYXRlTGlzdChsZW5ndGgpOwogICAgcmVzdWx0LnNldFJhbmdlKDAsIGxlbmd0aCwgdGhpcywgc3RhcnQpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgc2V0QWxsKGludCBpbmRleCwgSXRlcmFibGU8aW50PiBpdGVyYWJsZSkgewogICAgZmluYWwgZW5kID0gaXRlcmFibGUubGVuZ3RoICsgaW5kZXg7CiAgICBzZXRSYW5nZShpbmRleCwgZW5kLCBpdGVyYWJsZSk7CiAgfQoKICB2b2lkIGZpbGxSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIFtpbnQgZmlsbFZhbHVlXSkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHsKICAgICAgdGhpc1tpXSA9IGZpbGxWYWx1ZTsKICAgIH0KICB9Cn0KCmFic3RyYWN0IGNsYXNzIF9Eb3VibGVMaXN0TWl4aW4gaW1wbGVtZW50cyBMaXN0PGRvdWJsZT4gewogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzOwogIGludCBnZXQgb2Zmc2V0SW5CeXRlczsKICBfQnl0ZUJ1ZmZlciBnZXQgYnVmZmVyOwoKICBMaXN0PGRvdWJsZT4gX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCk7CgogIEl0ZXJhYmxlPFQ+IHdoZXJlVHlwZTxUPigpID0+IG5ldyBXaGVyZVR5cGVJdGVyYWJsZTxUPih0aGlzKTsKCiAgSXRlcmFibGU8ZG91YmxlPiBmb2xsb3dlZEJ5KEl0ZXJhYmxlPGRvdWJsZT4gb3RoZXIpID0+CiAgICAgIG5ldyBGb2xsb3dlZEJ5SXRlcmFibGU8ZG91YmxlPi5maXJzdEVmZmljaWVudCh0aGlzLCBvdGhlcik7CgogIExpc3Q8Uj4gY2FzdDxSPigpID0+IExpc3QuY2FzdEZyb208ZG91YmxlLCBSPih0aGlzKTsKICB2b2lkIHNldCBmaXJzdChkb3VibGUgdmFsdWUpIHsKICAgIGlmICh0aGlzLmxlbmd0aCA9PSAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleCgwLCB0aGlzKTsKICAgIHRoaXNbMF0gPSB2YWx1ZTsKICB9CgogIHZvaWQgc2V0IGxhc3QoZG91YmxlIHZhbHVlKSB7CiAgICBpZiAodGhpcy5sZW5ndGggPT0gMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoMCwgdGhpcyk7CiAgICB0aGlzW3RoaXMubGVuZ3RoIC0gMV0gPSB2YWx1ZTsKICB9CgogIGludCBpbmRleFdoZXJlKGJvb2wgdGVzdChkb3VibGUgZWxlbWVudCksIFtpbnQgc3RhcnQgPSAwXSkgewogICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKHRlc3QodGhpc1tpXSkpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgaW50IGxhc3RJbmRleFdoZXJlKGJvb2wgdGVzdChkb3VibGUgZWxlbWVudCksIFtpbnQgc3RhcnRdKSB7CiAgICBpZiAoc3RhcnQgPT0gbnVsbCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgc3RhcnQgPSB0aGlzLmxlbmd0aCAtIDE7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGlmICh0ZXN0KHRoaXNbaV0pKSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIExpc3Q8ZG91YmxlPiBvcGVyYXRvciArKExpc3Q8ZG91YmxlPiBvdGhlcikgewogICAgaW50IHRvdGFsTGVuZ3RoID0gdGhpcy5sZW5ndGggKyBvdGhlci5sZW5ndGg7CiAgICByZXR1cm4gPGRvdWJsZT5bXQogICAgICAuLmxlbmd0aCA9IHRvdGFsTGVuZ3RoCiAgICAgIC4uc2V0UmFuZ2UoMCwgdGhpcy5sZW5ndGgsIHRoaXMpCiAgICAgIC4uc2V0UmFuZ2UodGhpcy5sZW5ndGgsIHRvdGFsTGVuZ3RoLCBvdGhlcik7CiAgfQoKICBib29sIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIGlmICh0aGlzW2ldID09IGVsZW1lbnQpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgdm9pZCBzaHVmZmxlKFtSYW5kb20gcmFuZG9tXSkgewogICAgcmFuZG9tID8/PSBuZXcgUmFuZG9tKCk7CiAgICB2YXIgaSA9IHRoaXMubGVuZ3RoOwogICAgd2hpbGUgKGkgPiAxKSB7CiAgICAgIGludCBwb3MgPSByYW5kb20ubmV4dEludChpKTsKICAgICAgaSAtPSAxOwogICAgICB2YXIgdG1wID0gdGhpc1tpXTsKICAgICAgdGhpc1tpXSA9IHRoaXNbcG9zXTsKICAgICAgdGhpc1twb3NdID0gdG1wOwogICAgfQogIH0KCiAgdm9pZCBzZXRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlPGRvdWJsZT4gZnJvbSwKICAgICAgW2ludCBza2lwQ291bnQgPSAwXSkgewogICAgLy8gQ2hlY2sgcmFuZ2VzLgogICAgaWYgKDAgPiBzdGFydCB8fCBzdGFydCA+IGVuZCB8fCBlbmQgPiBsZW5ndGgpIHsKICAgICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgbGVuZ3RoKTsgLy8gQWx3YXlzIHRocm93cy4KICAgICAgYXNzZXJ0KGZhbHNlKTsKICAgIH0KICAgIGlmIChza2lwQ291bnQgPCAwKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKHNraXBDb3VudCk7CiAgICB9CgogICAgZmluYWwgY291bnQgPSBlbmQgLSBzdGFydDsKICAgIGlmICgoZnJvbS5sZW5ndGggLSBza2lwQ291bnQpIDwgY291bnQpIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vRmV3KCk7CiAgICB9CgogICAgaWYgKGNvdW50ID09IDApIHJldHVybjsKCiAgICBpZiAoZnJvbSBpcyBfVHlwZWRMaXN0QmFzZSkgewogICAgICAvLyBOb3RlOiBfVHlwZWRMaXN0QmFzZSBpcyBub3QgcmVsYXRlZCB0byBJdGVyYWJsZTxkb3VibGU+IHNvIHRoZXJlIGlzCiAgICAgIC8vIG5vIHByb21vdGlvbiBoZXJlLgogICAgICBmaW5hbCBmcm9tQXNUeXBlZExpc3QgPSBmcm9tIGFzIF9UeXBlZExpc3RCYXNlOwogICAgICBpZiAodGhpcy5lbGVtZW50U2l6ZUluQnl0ZXMgPT0gZnJvbUFzVHlwZWRMaXN0LmVsZW1lbnRTaXplSW5CeXRlcykgewogICAgICAgIGlmICgoY291bnQgPCAxMCkgJiYgKGZyb21Bc1R5cGVkTGlzdC5idWZmZXIgIT0gdGhpcy5idWZmZXIpKSB7CiAgICAgICAgICBMaXN0cy5jb3B5KGZyb20gYXMgTGlzdDxkb3VibGU+LCBza2lwQ291bnQsIHRoaXMsIHN0YXJ0LCBjb3VudCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmJ1ZmZlci5fZGF0YS5fc2V0UmFuZ2UoCiAgICAgICAgICAgIHN0YXJ0ICogZWxlbWVudFNpemVJbkJ5dGVzICsgdGhpcy5vZmZzZXRJbkJ5dGVzLAogICAgICAgICAgICBjb3VudCAqIGVsZW1lbnRTaXplSW5CeXRlcywKICAgICAgICAgICAgZnJvbUFzVHlwZWRMaXN0LmJ1ZmZlci5fZGF0YSwKICAgICAgICAgICAgc2tpcENvdW50ICogZWxlbWVudFNpemVJbkJ5dGVzICsgZnJvbUFzVHlwZWRMaXN0Lm9mZnNldEluQnl0ZXMsCiAgICAgICAgICAgIENsYXNzSUQuZ2V0SUQodGhpcyksCiAgICAgICAgICAgIENsYXNzSUQuZ2V0SUQoZnJvbSkpKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGZyb21Bc1R5cGVkTGlzdC5idWZmZXIgPT0gdGhpcy5idWZmZXIpIHsKICAgICAgICAvLyBEaWZmZXJlbnQgZWxlbWVudCBzaXplcywgYnV0IHNhbWUgYnVmZmVyIG1lYW5zIHRoYXQgd2UgbmVlZAogICAgICAgIC8vIGFuIGludGVybWVkaWF0ZSBzdHJ1Y3R1cmUuCiAgICAgICAgLy8gVE9ETyhzcmRqYW4pOiBPcHRpbWl6ZSB0byBza2lwIGNvcHlpbmcgaWYgdGhlIHJhbmdlIGRvZXMgbm90IG92ZXJsYXAuCiAgICAgICAgZmluYWwgZnJvbUFzTGlzdCA9IGZyb20gYXMgTGlzdDxkb3VibGU+OwogICAgICAgIGZpbmFsIHRlbXBCdWZmZXIgPSBfY3JlYXRlTGlzdChjb3VudCk7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICB0ZW1wQnVmZmVyW2ldID0gZnJvbUFzTGlzdFtza2lwQ291bnQgKyBpXTsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgICAgIHRoaXNbaV0gPSB0ZW1wQnVmZmVyW2kgLSBzdGFydF07CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQoKICAgIExpc3Qgb3RoZXJMaXN0OwogICAgaW50IG90aGVyU3RhcnQ7CiAgICBpZiAoZnJvbSBpcyBMaXN0PGRvdWJsZT4pIHsKICAgICAgb3RoZXJMaXN0ID0gZnJvbTsKICAgICAgb3RoZXJTdGFydCA9IHNraXBDb3VudDsKICAgIH0gZWxzZSB7CiAgICAgIG90aGVyTGlzdCA9IGZyb20uc2tpcChza2lwQ291bnQpLnRvTGlzdChncm93YWJsZTogZmFsc2UpOwogICAgICBvdGhlclN0YXJ0ID0gMDsKICAgIH0KICAgIGlmIChvdGhlclN0YXJ0ICsgY291bnQgPiBvdGhlckxpc3QubGVuZ3RoKSB7CiAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLnRvb0ZldygpOwogICAgfQogICAgTGlzdHMuY29weShvdGhlckxpc3QsIG90aGVyU3RhcnQsIHRoaXMsIHN0YXJ0LCBjb3VudCk7CiAgfQoKICBJdGVyYWJsZTxkb3VibGU+IHdoZXJlKGJvb2wgZihkb3VibGUgZWxlbWVudCkpID0+CiAgICAgIG5ldyBXaGVyZUl0ZXJhYmxlPGRvdWJsZT4odGhpcywgZik7CgogIEl0ZXJhYmxlPGRvdWJsZT4gdGFrZShpbnQgbikgPT4gbmV3IFN1Ykxpc3RJdGVyYWJsZTxkb3VibGU+KHRoaXMsIDAsIG4pOwoKICBJdGVyYWJsZTxkb3VibGU+IHRha2VXaGlsZShib29sIHRlc3QoZG91YmxlIGVsZW1lbnQpKSA9PgogICAgICBuZXcgVGFrZVdoaWxlSXRlcmFibGU8ZG91YmxlPih0aGlzLCB0ZXN0KTsKCiAgSXRlcmFibGU8ZG91YmxlPiBza2lwKGludCBuKSA9PiBuZXcgU3ViTGlzdEl0ZXJhYmxlPGRvdWJsZT4odGhpcywgbiwgbnVsbCk7CgogIEl0ZXJhYmxlPGRvdWJsZT4gc2tpcFdoaWxlKGJvb2wgdGVzdChkb3VibGUgZWxlbWVudCkpID0+CiAgICAgIG5ldyBTa2lwV2hpbGVJdGVyYWJsZTxkb3VibGU+KHRoaXMsIHRlc3QpOwoKICBJdGVyYWJsZTxkb3VibGU+IGdldCByZXZlcnNlZCA9PiBuZXcgUmV2ZXJzZWRMaXN0SXRlcmFibGU8ZG91YmxlPih0aGlzKTsKCiAgTWFwPGludCwgZG91YmxlPiBhc01hcCgpID0+IG5ldyBMaXN0TWFwVmlldzxkb3VibGU+KHRoaXMpOwoKICBJdGVyYWJsZTxkb3VibGU+IGdldFJhbmdlKGludCBzdGFydCwgW2ludCBlbmRdKSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICByZXR1cm4gbmV3IFN1Ykxpc3RJdGVyYWJsZTxkb3VibGU+KHRoaXMsIHN0YXJ0LCBlbmQpOwogIH0KCiAgSXRlcmF0b3I8ZG91YmxlPiBnZXQgaXRlcmF0b3IgPT4gbmV3IF9UeXBlZExpc3RJdGVyYXRvcjxkb3VibGU+KHRoaXMpOwoKICBMaXN0PGRvdWJsZT4gdG9MaXN0KHtib29sIGdyb3dhYmxlOiB0cnVlfSkgewogICAgcmV0dXJuIG5ldyBMaXN0PGRvdWJsZT4uZnJvbSh0aGlzLCBncm93YWJsZTogZ3Jvd2FibGUpOwogIH0KCiAgU2V0PGRvdWJsZT4gdG9TZXQoKSB7CiAgICByZXR1cm4gbmV3IFNldDxkb3VibGU+LmZyb20odGhpcyk7CiAgfQoKICB2b2lkIGZvckVhY2godm9pZCBmKGRvdWJsZSBlbGVtZW50KSkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBmKHRoaXNbaV0pOwogICAgfQogIH0KCiAgZG91YmxlIHJlZHVjZShkb3VibGUgY29tYmluZShkb3VibGUgdmFsdWUsIGRvdWJsZSBlbGVtZW50KSkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgaWYgKGxlbiA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIHZhciB2YWx1ZSA9IHRoaXNbMF07CiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGxlbjsgKytpKSB7CiAgICAgIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgdGhpc1tpXSk7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBUIGZvbGQ8VD4oVCBpbml0aWFsVmFsdWUsIFQgY29tYmluZShUIGluaXRpYWxWYWx1ZSwgZG91YmxlIGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIGluaXRpYWxWYWx1ZSA9IGNvbWJpbmUoaW5pdGlhbFZhbHVlLCB0aGlzW2ldKTsKICAgIH0KICAgIHJldHVybiBpbml0aWFsVmFsdWU7CiAgfQoKICBJdGVyYWJsZTxUPiBtYXA8VD4oVCBmKGRvdWJsZSBlbGVtZW50KSkgPT4KICAgICAgbmV3IE1hcHBlZEl0ZXJhYmxlPGRvdWJsZSwgVD4odGhpcywgZik7CgogIEl0ZXJhYmxlPFQ+IGV4cGFuZDxUPihJdGVyYWJsZTxUPiBmKGRvdWJsZSBlbGVtZW50KSkgPT4KICAgICAgbmV3IEV4cGFuZEl0ZXJhYmxlPGRvdWJsZSwgVD4odGhpcywgZik7CgogIGJvb2wgZXZlcnkoYm9vbCBmKGRvdWJsZSBlbGVtZW50KSkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgICBpZiAoIWYodGhpc1tpXSkpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgYm9vbCBhbnkoYm9vbCBmKGRvdWJsZSBlbGVtZW50KSkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgICBpZiAoZih0aGlzW2ldKSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBkb3VibGUgZmlyc3RXaGVyZShib29sIHRlc3QoZG91YmxlIGVsZW1lbnQpLCB7ZG91YmxlIG9yRWxzZSgpfSkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgICB2YXIgZWxlbWVudCA9IHRoaXNbaV07CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSByZXR1cm4gZWxlbWVudDsKICAgIH0KICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBkb3VibGUgbGFzdFdoZXJlKGJvb2wgdGVzdChkb3VibGUgZWxlbWVudCksIHtkb3VibGUgb3JFbHNlKCl9KSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzW2ldOwogICAgICBpZiAodGVzdChlbGVtZW50KSkgewogICAgICAgIHJldHVybiBlbGVtZW50OwogICAgICB9CiAgICB9CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgZG91YmxlIHNpbmdsZVdoZXJlKGJvb2wgdGVzdChkb3VibGUgZWxlbWVudCksIHtkb3VibGUgb3JFbHNlKCl9KSB7CiAgICB2YXIgcmVzdWx0ID0gbnVsbDsKICAgIGJvb2wgZm91bmRNYXRjaGluZyA9IGZhbHNlOwogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgICB2YXIgZWxlbWVudCA9IHRoaXNbaV07CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSB7CiAgICAgICAgaWYgKGZvdW5kTWF0Y2hpbmcpIHsKICAgICAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLnRvb01hbnkoKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0ID0gZWxlbWVudDsKICAgICAgICBmb3VuZE1hdGNoaW5nID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgaWYgKGZvdW5kTWF0Y2hpbmcpIHJldHVybiByZXN1bHQ7CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgZG91YmxlIGVsZW1lbnRBdChpbnQgaW5kZXgpIHsKICAgIHJldHVybiB0aGlzW2luZGV4XTsKICB9CgogIHZvaWQgYWRkKGRvdWJsZSB2YWx1ZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBhZGQgdG8gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8ZG91YmxlPiB2YWx1ZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBhZGQgdG8gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgdm9pZCBpbnNlcnQoaW50IGluZGV4LCBkb3VibGUgdmFsdWUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgaW5zZXJ0IGludG8gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgdm9pZCBpbnNlcnRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxkb3VibGU+IHZhbHVlcykgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBpbnNlcnQgaW50byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIHNvcnQoW2ludCBjb21wYXJlKGRvdWJsZSBhLCBkb3VibGUgYildKSB7CiAgICBTb3J0LnNvcnQodGhpcywgY29tcGFyZSA/PyBDb21wYXJhYmxlLmNvbXBhcmUpOwogIH0KCiAgaW50IGluZGV4T2YoZG91YmxlIGVsZW1lbnQsIFtpbnQgc3RhcnQgPSAwXSkgewogICAgaWYgKHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0gZWxzZSBpZiAoc3RhcnQgPCAwKSB7CiAgICAgIHN0YXJ0ID0gMDsKICAgIH0KICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKHRoaXNbaV0gPT0gZWxlbWVudCkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICBpbnQgbGFzdEluZGV4T2YoZG91YmxlIGVsZW1lbnQsIFtpbnQgc3RhcnQgPSBudWxsXSkgewogICAgaWYgKHN0YXJ0ID09IG51bGwgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHsKICAgICAgc3RhcnQgPSB0aGlzLmxlbmd0aCAtIDE7CiAgICB9IGVsc2UgaWYgKHN0YXJ0IDwgMCkgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGlmICh0aGlzW2ldID09IGVsZW1lbnQpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgZG91YmxlIHJlbW92ZUxhc3QoKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIGRvdWJsZSByZW1vdmVBdChpbnQgaW5kZXgpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoZG91YmxlIGVsZW1lbnQpKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KGRvdWJsZSBlbGVtZW50KSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICBkb3VibGUgZ2V0IGZpcnN0IHsKICAgIGlmIChsZW5ndGggPiAwKSByZXR1cm4gdGhpc1swXTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgZG91YmxlIGdldCBsYXN0IHsKICAgIGlmIChsZW5ndGggPiAwKSByZXR1cm4gdGhpc1tsZW5ndGggLSAxXTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgZG91YmxlIGdldCBzaW5nbGUgewogICAgaWYgKGxlbmd0aCA9PSAxKSByZXR1cm4gdGhpc1swXTsKICAgIGlmIChsZW5ndGggPT0gMCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgfQoKICBMaXN0PGRvdWJsZT4gc3VibGlzdChpbnQgc3RhcnQsIFtpbnQgZW5kXSkgewogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgdmFyIGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgTGlzdDxkb3VibGU+IHJlc3VsdCA9IF9jcmVhdGVMaXN0KGxlbmd0aCk7CiAgICByZXN1bHQuc2V0UmFuZ2UoMCwgbGVuZ3RoLCB0aGlzLCBzdGFydCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBzZXRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxkb3VibGU+IGl0ZXJhYmxlKSB7CiAgICBmaW5hbCBlbmQgPSBpdGVyYWJsZS5sZW5ndGggKyBpbmRleDsKICAgIHNldFJhbmdlKGluZGV4LCBlbmQsIGl0ZXJhYmxlKTsKICB9CgogIHZvaWQgZmlsbFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgW2RvdWJsZSBmaWxsVmFsdWVdKSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkgewogICAgICB0aGlzW2ldID0gZmlsbFZhbHVlOwogICAgfQogIH0KfQoKYWJzdHJhY3QgY2xhc3MgX0Zsb2F0MzJ4NExpc3RNaXhpbiBpbXBsZW1lbnRzIExpc3Q8RmxvYXQzMng0PiB7CiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXM7CiAgaW50IGdldCBvZmZzZXRJbkJ5dGVzOwogIF9CeXRlQnVmZmVyIGdldCBidWZmZXI7CgogIExpc3Q8RmxvYXQzMng0PiBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKTsKCiAgSXRlcmFibGU8VD4gd2hlcmVUeXBlPFQ+KCkgPT4gbmV3IFdoZXJlVHlwZUl0ZXJhYmxlPFQ+KHRoaXMpOwoKICBJdGVyYWJsZTxGbG9hdDMyeDQ+IGZvbGxvd2VkQnkoSXRlcmFibGU8RmxvYXQzMng0PiBvdGhlcikgPT4KICAgICAgbmV3IEZvbGxvd2VkQnlJdGVyYWJsZTxGbG9hdDMyeDQ+LmZpcnN0RWZmaWNpZW50KHRoaXMsIG90aGVyKTsKCiAgTGlzdDxSPiBjYXN0PFI+KCkgPT4gTGlzdC5jYXN0RnJvbTxGbG9hdDMyeDQsIFI+KHRoaXMpOwogIHZvaWQgc2V0IGZpcnN0KEZsb2F0MzJ4NCB2YWx1ZSkgewogICAgaWYgKHRoaXMubGVuZ3RoID09IDApIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KDAsIHRoaXMpOwogICAgdGhpc1swXSA9IHZhbHVlOwogIH0KCiAgdm9pZCBzZXQgbGFzdChGbG9hdDMyeDQgdmFsdWUpIHsKICAgIGlmICh0aGlzLmxlbmd0aCA9PSAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleCgwLCB0aGlzKTsKICAgIHRoaXNbdGhpcy5sZW5ndGggLSAxXSA9IHZhbHVlOwogIH0KCiAgaW50IGluZGV4V2hlcmUoYm9vbCB0ZXN0KEZsb2F0MzJ4NCBlbGVtZW50KSwgW2ludCBzdGFydCA9IDBdKSB7CiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDA7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBpZiAodGVzdCh0aGlzW2ldKSkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICBpbnQgbGFzdEluZGV4V2hlcmUoYm9vbCB0ZXN0KEZsb2F0MzJ4NCBlbGVtZW50KSwgW2ludCBzdGFydF0pIHsKICAgIGlmIChzdGFydCA9PSBudWxsIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSBzdGFydCA9IHRoaXMubGVuZ3RoIC0gMTsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA+PSAwOyBpLS0pIHsKICAgICAgaWYgKHRlc3QodGhpc1tpXSkpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgTGlzdDxGbG9hdDMyeDQ+IG9wZXJhdG9yICsoTGlzdDxGbG9hdDMyeDQ+IG90aGVyKSB7CiAgICBpbnQgdG90YWxMZW5ndGggPSB0aGlzLmxlbmd0aCArIG90aGVyLmxlbmd0aDsKICAgIHJldHVybiA8RmxvYXQzMng0PltdCiAgICAgIC4ubGVuZ3RoID0gdG90YWxMZW5ndGgKICAgICAgLi5zZXRSYW5nZSgwLCB0aGlzLmxlbmd0aCwgdGhpcykKICAgICAgLi5zZXRSYW5nZSh0aGlzLmxlbmd0aCwgdG90YWxMZW5ndGgsIG90aGVyKTsKICB9CgogIGJvb2wgY29udGFpbnMoT2JqZWN0IGVsZW1lbnQpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaWYgKHRoaXNbaV0gPT0gZWxlbWVudCkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICB2b2lkIHNodWZmbGUoW1JhbmRvbSByYW5kb21dKSB7CiAgICByYW5kb20gPz89IG5ldyBSYW5kb20oKTsKICAgIHZhciBpID0gdGhpcy5sZW5ndGg7CiAgICB3aGlsZSAoaSA+IDEpIHsKICAgICAgaW50IHBvcyA9IHJhbmRvbS5uZXh0SW50KGkpOwogICAgICBpIC09IDE7CiAgICAgIHZhciB0bXAgPSB0aGlzW2ldOwogICAgICB0aGlzW2ldID0gdGhpc1twb3NdOwogICAgICB0aGlzW3Bvc10gPSB0bXA7CiAgICB9CiAgfQoKICB2b2lkIHNldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGU8RmxvYXQzMng0PiBmcm9tLAogICAgICBbaW50IHNraXBDb3VudCA9IDBdKSB7CiAgICAvLyBDaGVjayByYW5nZXMuCiAgICBpZiAoMCA+IHN0YXJ0IHx8IHN0YXJ0ID4gZW5kIHx8IGVuZCA+IGxlbmd0aCkgewogICAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBsZW5ndGgpOyAvLyBBbHdheXMgdGhyb3dzLgogICAgICBhc3NlcnQoZmFsc2UpOwogICAgfQogICAgaWYgKHNraXBDb3VudCA8IDApIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Ioc2tpcENvdW50KTsKICAgIH0KCiAgICBmaW5hbCBjb3VudCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKChmcm9tLmxlbmd0aCAtIHNraXBDb3VudCkgPCBjb3VudCkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29GZXcoKTsKICAgIH0KCiAgICBpZiAoY291bnQgPT0gMCkgcmV0dXJuOwoKICAgIGlmIChmcm9tIGlzIF9UeXBlZExpc3RCYXNlKSB7CiAgICAgIC8vIE5vdGU6IF9UeXBlZExpc3RCYXNlIGlzIG5vdCByZWxhdGVkIHRvIEl0ZXJhYmxlPEZsb2F0MzJ4ND4gc28gdGhlcmUgaXMKICAgICAgLy8gbm8gcHJvbW90aW9uIGhlcmUuCiAgICAgIGZpbmFsIGZyb21Bc1R5cGVkTGlzdCA9IGZyb20gYXMgX1R5cGVkTGlzdEJhc2U7CiAgICAgIGlmICh0aGlzLmVsZW1lbnRTaXplSW5CeXRlcyA9PSBmcm9tQXNUeXBlZExpc3QuZWxlbWVudFNpemVJbkJ5dGVzKSB7CiAgICAgICAgaWYgKChjb3VudCA8IDEwKSAmJiAoZnJvbUFzVHlwZWRMaXN0LmJ1ZmZlciAhPSB0aGlzLmJ1ZmZlcikpIHsKICAgICAgICAgIExpc3RzLmNvcHkoZnJvbSBhcyBMaXN0PEZsb2F0MzJ4ND4sIHNraXBDb3VudCwgdGhpcywgc3RhcnQsIGNvdW50KTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYnVmZmVyLl9kYXRhLl9zZXRSYW5nZSgKICAgICAgICAgICAgc3RhcnQgKiBlbGVtZW50U2l6ZUluQnl0ZXMgKyB0aGlzLm9mZnNldEluQnl0ZXMsCiAgICAgICAgICAgIGNvdW50ICogZWxlbWVudFNpemVJbkJ5dGVzLAogICAgICAgICAgICBmcm9tQXNUeXBlZExpc3QuYnVmZmVyLl9kYXRhLAogICAgICAgICAgICBza2lwQ291bnQgKiBlbGVtZW50U2l6ZUluQnl0ZXMgKyBmcm9tQXNUeXBlZExpc3Qub2Zmc2V0SW5CeXRlcywKICAgICAgICAgICAgQ2xhc3NJRC5nZXRJRCh0aGlzKSwKICAgICAgICAgICAgQ2xhc3NJRC5nZXRJRChmcm9tKSkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZnJvbUFzVHlwZWRMaXN0LmJ1ZmZlciA9PSB0aGlzLmJ1ZmZlcikgewogICAgICAgIC8vIERpZmZlcmVudCBlbGVtZW50IHNpemVzLCBidXQgc2FtZSBidWZmZXIgbWVhbnMgdGhhdCB3ZSBuZWVkCiAgICAgICAgLy8gYW4gaW50ZXJtZWRpYXRlIHN0cnVjdHVyZS4KICAgICAgICAvLyBUT0RPKHNyZGphbik6IE9wdGltaXplIHRvIHNraXAgY29weWluZyBpZiB0aGUgcmFuZ2UgZG9lcyBub3Qgb3ZlcmxhcC4KICAgICAgICBmaW5hbCBmcm9tQXNMaXN0ID0gZnJvbSBhcyBMaXN0PEZsb2F0MzJ4ND47CiAgICAgICAgZmluYWwgdGVtcEJ1ZmZlciA9IF9jcmVhdGVMaXN0KGNvdW50KTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgIHRlbXBCdWZmZXJbaV0gPSBmcm9tQXNMaXN0W3NraXBDb3VudCArIGldOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICAgICAgdGhpc1tpXSA9IHRlbXBCdWZmZXJbaSAtIHN0YXJ0XTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CgogICAgTGlzdCBvdGhlckxpc3Q7CiAgICBpbnQgb3RoZXJTdGFydDsKICAgIGlmIChmcm9tIGlzIExpc3Q8RmxvYXQzMng0PikgewogICAgICBvdGhlckxpc3QgPSBmcm9tOwogICAgICBvdGhlclN0YXJ0ID0gc2tpcENvdW50OwogICAgfSBlbHNlIHsKICAgICAgb3RoZXJMaXN0ID0gZnJvbS5za2lwKHNraXBDb3VudCkudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICAgIG90aGVyU3RhcnQgPSAwOwogICAgfQogICAgaWYgKG90aGVyU3RhcnQgKyBjb3VudCA+IG90aGVyTGlzdC5sZW5ndGgpIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vRmV3KCk7CiAgICB9CiAgICBMaXN0cy5jb3B5KG90aGVyTGlzdCwgb3RoZXJTdGFydCwgdGhpcywgc3RhcnQsIGNvdW50KTsKICB9CgogIEl0ZXJhYmxlPEZsb2F0MzJ4ND4gd2hlcmUoYm9vbCBmKEZsb2F0MzJ4NCBlbGVtZW50KSkgPT4KICAgICAgbmV3IFdoZXJlSXRlcmFibGU8RmxvYXQzMng0Pih0aGlzLCBmKTsKCiAgSXRlcmFibGU8RmxvYXQzMng0PiB0YWtlKGludCBuKSA9PiBuZXcgU3ViTGlzdEl0ZXJhYmxlPEZsb2F0MzJ4ND4odGhpcywgMCwgbik7CgogIEl0ZXJhYmxlPEZsb2F0MzJ4ND4gdGFrZVdoaWxlKGJvb2wgdGVzdChGbG9hdDMyeDQgZWxlbWVudCkpID0+CiAgICAgIG5ldyBUYWtlV2hpbGVJdGVyYWJsZTxGbG9hdDMyeDQ+KHRoaXMsIHRlc3QpOwoKICBJdGVyYWJsZTxGbG9hdDMyeDQ+IHNraXAoaW50IG4pID0+CiAgICAgIG5ldyBTdWJMaXN0SXRlcmFibGU8RmxvYXQzMng0Pih0aGlzLCBuLCBudWxsKTsKCiAgSXRlcmFibGU8RmxvYXQzMng0PiBza2lwV2hpbGUoYm9vbCB0ZXN0KEZsb2F0MzJ4NCBlbGVtZW50KSkgPT4KICAgICAgbmV3IFNraXBXaGlsZUl0ZXJhYmxlPEZsb2F0MzJ4ND4odGhpcywgdGVzdCk7CgogIEl0ZXJhYmxlPEZsb2F0MzJ4ND4gZ2V0IHJldmVyc2VkID0+IG5ldyBSZXZlcnNlZExpc3RJdGVyYWJsZTxGbG9hdDMyeDQ+KHRoaXMpOwoKICBNYXA8aW50LCBGbG9hdDMyeDQ+IGFzTWFwKCkgPT4gbmV3IExpc3RNYXBWaWV3PEZsb2F0MzJ4ND4odGhpcyk7CgogIEl0ZXJhYmxlPEZsb2F0MzJ4ND4gZ2V0UmFuZ2UoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgIHJldHVybiBuZXcgU3ViTGlzdEl0ZXJhYmxlPEZsb2F0MzJ4ND4odGhpcywgc3RhcnQsIGVuZCk7CiAgfQoKICBJdGVyYXRvcjxGbG9hdDMyeDQ+IGdldCBpdGVyYXRvciA9PiBuZXcgX1R5cGVkTGlzdEl0ZXJhdG9yPEZsb2F0MzJ4ND4odGhpcyk7CgogIExpc3Q8RmxvYXQzMng0PiB0b0xpc3Qoe2Jvb2wgZ3Jvd2FibGU6IHRydWV9KSB7CiAgICByZXR1cm4gbmV3IExpc3Q8RmxvYXQzMng0Pi5mcm9tKHRoaXMsIGdyb3dhYmxlOiBncm93YWJsZSk7CiAgfQoKICBTZXQ8RmxvYXQzMng0PiB0b1NldCgpIHsKICAgIHJldHVybiBuZXcgU2V0PEZsb2F0MzJ4ND4uZnJvbSh0aGlzKTsKICB9CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoRmxvYXQzMng0IGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGYodGhpc1tpXSk7CiAgICB9CiAgfQoKICBGbG9hdDMyeDQgcmVkdWNlKEZsb2F0MzJ4NCBjb21iaW5lKEZsb2F0MzJ4NCB2YWx1ZSwgRmxvYXQzMng0IGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBpZiAobGVuID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgdmFyIHZhbHVlID0gdGhpc1swXTsKICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyArK2kpIHsKICAgICAgdmFsdWUgPSBjb21iaW5lKHZhbHVlLCB0aGlzW2ldKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CgogIFQgZm9sZDxUPihUIGluaXRpYWxWYWx1ZSwgVCBjb21iaW5lKFQgaW5pdGlhbFZhbHVlLCBGbG9hdDMyeDQgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaW5pdGlhbFZhbHVlID0gY29tYmluZShpbml0aWFsVmFsdWUsIHRoaXNbaV0pOwogICAgfQogICAgcmV0dXJuIGluaXRpYWxWYWx1ZTsKICB9CgogIEl0ZXJhYmxlPFQ+IG1hcDxUPihUIGYoRmxvYXQzMng0IGVsZW1lbnQpKSA9PgogICAgICBuZXcgTWFwcGVkSXRlcmFibGU8RmxvYXQzMng0LCBUPih0aGlzLCBmKTsKCiAgSXRlcmFibGU8VD4gZXhwYW5kPFQ+KEl0ZXJhYmxlPFQ+IGYoRmxvYXQzMng0IGVsZW1lbnQpKSA9PgogICAgICBuZXcgRXhwYW5kSXRlcmFibGU8RmxvYXQzMng0LCBUPih0aGlzLCBmKTsKCiAgYm9vbCBldmVyeShib29sIGYoRmxvYXQzMng0IGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIGlmICghZih0aGlzW2ldKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBib29sIGFueShib29sIGYoRmxvYXQzMng0IGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIGlmIChmKHRoaXNbaV0pKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEZsb2F0MzJ4NCBmaXJzdFdoZXJlKGJvb2wgdGVzdChGbG9hdDMyeDQgZWxlbWVudCksIHtGbG9hdDMyeDQgb3JFbHNlKCl9KSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIHZhciBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHJldHVybiBlbGVtZW50OwogICAgfQogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEZsb2F0MzJ4NCBsYXN0V2hlcmUoYm9vbCB0ZXN0KEZsb2F0MzJ4NCBlbGVtZW50KSwge0Zsb2F0MzJ4NCBvckVsc2UoKX0pIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkgewogICAgICB2YXIgZWxlbWVudCA9IHRoaXNbaV07CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSB7CiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CiAgICAgIH0KICAgIH0KICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBGbG9hdDMyeDQgc2luZ2xlV2hlcmUoYm9vbCB0ZXN0KEZsb2F0MzJ4NCBlbGVtZW50KSwge0Zsb2F0MzJ4NCBvckVsc2UoKX0pIHsKICAgIHZhciByZXN1bHQgPSBudWxsOwogICAgYm9vbCBmb3VuZE1hdGNoaW5nID0gZmFsc2U7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIHZhciBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHsKICAgICAgICBpZiAoZm91bmRNYXRjaGluZykgewogICAgICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQgPSBlbGVtZW50OwogICAgICAgIGZvdW5kTWF0Y2hpbmcgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBpZiAoZm91bmRNYXRjaGluZykgcmV0dXJuIHJlc3VsdDsKICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBGbG9hdDMyeDQgZWxlbWVudEF0KGludCBpbmRleCkgewogICAgcmV0dXJuIHRoaXNbaW5kZXhdOwogIH0KCiAgdm9pZCBhZGQoRmxvYXQzMng0IHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGFkZCB0byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIGFkZEFsbChJdGVyYWJsZTxGbG9hdDMyeDQ+IHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGFkZCB0byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIGluc2VydChpbnQgaW5kZXgsIEZsb2F0MzJ4NCB2YWx1ZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBpbnNlcnQgaW50byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIGluc2VydEFsbChpbnQgaW5kZXgsIEl0ZXJhYmxlPEZsb2F0MzJ4ND4gdmFsdWVzKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGluc2VydCBpbnRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgc29ydChbaW50IGNvbXBhcmUoRmxvYXQzMng0IGEsIEZsb2F0MzJ4NCBiKV0pIHsKICAgIGlmIChjb21wYXJlID09IG51bGwpIHsKICAgICAgdGhyb3cgIlNJTUQgZG9uJ3QgaGF2ZSBkZWZhdWx0IGNvbXBhcmUuIjsKICAgIH0KICAgIFNvcnQuc29ydCh0aGlzLCBjb21wYXJlKTsKICB9CgogIGludCBpbmRleE9mKEZsb2F0MzJ4NCBlbGVtZW50LCBbaW50IHN0YXJ0ID0gMF0pIHsKICAgIGlmIChzdGFydCA+PSB0aGlzLmxlbmd0aCkgewogICAgICByZXR1cm4gLTE7CiAgICB9IGVsc2UgaWYgKHN0YXJ0IDwgMCkgewogICAgICBzdGFydCA9IDA7CiAgICB9CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0aGlzW2ldID09IGVsZW1lbnQpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgaW50IGxhc3RJbmRleE9mKEZsb2F0MzJ4NCBlbGVtZW50LCBbaW50IHN0YXJ0ID0gbnVsbF0pIHsKICAgIGlmIChzdGFydCA9PSBudWxsIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB7CiAgICAgIHN0YXJ0ID0gdGhpcy5sZW5ndGggLSAxOwogICAgfSBlbHNlIGlmIChzdGFydCA8IDApIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpID49IDA7IGktLSkgewogICAgICBpZiAodGhpc1tpXSA9PSBlbGVtZW50KSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIEZsb2F0MzJ4NCByZW1vdmVMYXN0KCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICBGbG9hdDMyeDQgcmVtb3ZlQXQoaW50IGluZGV4KSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KEZsb2F0MzJ4NCBlbGVtZW50KSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChGbG9hdDMyeDQgZWxlbWVudCkpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgRmxvYXQzMng0IGdldCBmaXJzdCB7CiAgICBpZiAobGVuZ3RoID4gMCkgcmV0dXJuIHRoaXNbMF07CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEZsb2F0MzJ4NCBnZXQgbGFzdCB7CiAgICBpZiAobGVuZ3RoID4gMCkgcmV0dXJuIHRoaXNbbGVuZ3RoIC0gMV07CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEZsb2F0MzJ4NCBnZXQgc2luZ2xlIHsKICAgIGlmIChsZW5ndGggPT0gMSkgcmV0dXJuIHRoaXNbMF07CiAgICBpZiAobGVuZ3RoID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogIH0KCiAgTGlzdDxGbG9hdDMyeDQ+IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgIHZhciBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIExpc3Q8RmxvYXQzMng0PiByZXN1bHQgPSBfY3JlYXRlTGlzdChsZW5ndGgpOwogICAgcmVzdWx0LnNldFJhbmdlKDAsIGxlbmd0aCwgdGhpcywgc3RhcnQpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgc2V0QWxsKGludCBpbmRleCwgSXRlcmFibGU8RmxvYXQzMng0PiBpdGVyYWJsZSkgewogICAgZmluYWwgZW5kID0gaXRlcmFibGUubGVuZ3RoICsgaW5kZXg7CiAgICBzZXRSYW5nZShpbmRleCwgZW5kLCBpdGVyYWJsZSk7CiAgfQoKICB2b2lkIGZpbGxSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIFtGbG9hdDMyeDQgZmlsbFZhbHVlXSkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHsKICAgICAgdGhpc1tpXSA9IGZpbGxWYWx1ZTsKICAgIH0KICB9Cn0KCmFic3RyYWN0IGNsYXNzIF9JbnQzMng0TGlzdE1peGluIGltcGxlbWVudHMgTGlzdDxJbnQzMng0PiB7CiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXM7CiAgaW50IGdldCBvZmZzZXRJbkJ5dGVzOwogIF9CeXRlQnVmZmVyIGdldCBidWZmZXI7CgogIExpc3Q8SW50MzJ4ND4gX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCk7CgogIEl0ZXJhYmxlPFQ+IHdoZXJlVHlwZTxUPigpID0+IG5ldyBXaGVyZVR5cGVJdGVyYWJsZTxUPih0aGlzKTsKCiAgSXRlcmFibGU8SW50MzJ4ND4gZm9sbG93ZWRCeShJdGVyYWJsZTxJbnQzMng0PiBvdGhlcikgPT4KICAgICAgbmV3IEZvbGxvd2VkQnlJdGVyYWJsZTxJbnQzMng0Pi5maXJzdEVmZmljaWVudCh0aGlzLCBvdGhlcik7CgogIExpc3Q8Uj4gY2FzdDxSPigpID0+IExpc3QuY2FzdEZyb208SW50MzJ4NCwgUj4odGhpcyk7CiAgdm9pZCBzZXQgZmlyc3QoSW50MzJ4NCB2YWx1ZSkgewogICAgaWYgKHRoaXMubGVuZ3RoID09IDApIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KDAsIHRoaXMpOwogICAgdGhpc1swXSA9IHZhbHVlOwogIH0KCiAgdm9pZCBzZXQgbGFzdChJbnQzMng0IHZhbHVlKSB7CiAgICBpZiAodGhpcy5sZW5ndGggPT0gMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoMCwgdGhpcyk7CiAgICB0aGlzW3RoaXMubGVuZ3RoIC0gMV0gPSB2YWx1ZTsKICB9CgogIGludCBpbmRleFdoZXJlKGJvb2wgdGVzdChJbnQzMng0IGVsZW1lbnQpLCBbaW50IHN0YXJ0ID0gMF0pIHsKICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMDsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0ZXN0KHRoaXNbaV0pKSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIGludCBsYXN0SW5kZXhXaGVyZShib29sIHRlc3QoSW50MzJ4NCBlbGVtZW50KSwgW2ludCBzdGFydF0pIHsKICAgIGlmIChzdGFydCA9PSBudWxsIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSBzdGFydCA9IHRoaXMubGVuZ3RoIC0gMTsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA+PSAwOyBpLS0pIHsKICAgICAgaWYgKHRlc3QodGhpc1tpXSkpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgTGlzdDxJbnQzMng0PiBvcGVyYXRvciArKExpc3Q8SW50MzJ4ND4gb3RoZXIpIHsKICAgIGludCB0b3RhbExlbmd0aCA9IHRoaXMubGVuZ3RoICsgb3RoZXIubGVuZ3RoOwogICAgcmV0dXJuIDxJbnQzMng0PltdCiAgICAgIC4ubGVuZ3RoID0gdG90YWxMZW5ndGgKICAgICAgLi5zZXRSYW5nZSgwLCB0aGlzLmxlbmd0aCwgdGhpcykKICAgICAgLi5zZXRSYW5nZSh0aGlzLmxlbmd0aCwgdG90YWxMZW5ndGgsIG90aGVyKTsKICB9CgogIGJvb2wgY29udGFpbnMoT2JqZWN0IGVsZW1lbnQpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaWYgKHRoaXNbaV0gPT0gZWxlbWVudCkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICB2b2lkIHNodWZmbGUoW1JhbmRvbSByYW5kb21dKSB7CiAgICByYW5kb20gPz89IG5ldyBSYW5kb20oKTsKICAgIHZhciBpID0gdGhpcy5sZW5ndGg7CiAgICB3aGlsZSAoaSA+IDEpIHsKICAgICAgaW50IHBvcyA9IHJhbmRvbS5uZXh0SW50KGkpOwogICAgICBpIC09IDE7CiAgICAgIHZhciB0bXAgPSB0aGlzW2ldOwogICAgICB0aGlzW2ldID0gdGhpc1twb3NdOwogICAgICB0aGlzW3Bvc10gPSB0bXA7CiAgICB9CiAgfQoKICB2b2lkIHNldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGU8SW50MzJ4ND4gZnJvbSwKICAgICAgW2ludCBza2lwQ291bnQgPSAwXSkgewogICAgLy8gQ2hlY2sgcmFuZ2VzLgogICAgaWYgKDAgPiBzdGFydCB8fCBzdGFydCA+IGVuZCB8fCBlbmQgPiBsZW5ndGgpIHsKICAgICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgbGVuZ3RoKTsgLy8gQWx3YXlzIHRocm93cy4KICAgICAgYXNzZXJ0KGZhbHNlKTsKICAgIH0KICAgIGlmIChza2lwQ291bnQgPCAwKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKHNraXBDb3VudCk7CiAgICB9CgogICAgZmluYWwgY291bnQgPSBlbmQgLSBzdGFydDsKICAgIGlmICgoZnJvbS5sZW5ndGggLSBza2lwQ291bnQpIDwgY291bnQpIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vRmV3KCk7CiAgICB9CgogICAgaWYgKGNvdW50ID09IDApIHJldHVybjsKCiAgICBpZiAoZnJvbSBpcyBfVHlwZWRMaXN0QmFzZSkgewogICAgICAvLyBOb3RlOiBfVHlwZWRMaXN0QmFzZSBpcyBub3QgcmVsYXRlZCB0byBJdGVyYWJsZTxJbnQzMng0PiBzbyB0aGVyZSBpcwogICAgICAvLyBubyBwcm9tb3Rpb24gaGVyZS4KICAgICAgZmluYWwgZnJvbUFzVHlwZWRMaXN0ID0gZnJvbSBhcyBfVHlwZWRMaXN0QmFzZTsKICAgICAgaWYgKHRoaXMuZWxlbWVudFNpemVJbkJ5dGVzID09IGZyb21Bc1R5cGVkTGlzdC5lbGVtZW50U2l6ZUluQnl0ZXMpIHsKICAgICAgICBpZiAoKGNvdW50IDwgMTApICYmIChmcm9tQXNUeXBlZExpc3QuYnVmZmVyICE9IHRoaXMuYnVmZmVyKSkgewogICAgICAgICAgTGlzdHMuY29weShmcm9tIGFzIExpc3Q8SW50MzJ4ND4sIHNraXBDb3VudCwgdGhpcywgc3RhcnQsIGNvdW50KTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYnVmZmVyLl9kYXRhLl9zZXRSYW5nZSgKICAgICAgICAgICAgc3RhcnQgKiBlbGVtZW50U2l6ZUluQnl0ZXMgKyB0aGlzLm9mZnNldEluQnl0ZXMsCiAgICAgICAgICAgIGNvdW50ICogZWxlbWVudFNpemVJbkJ5dGVzLAogICAgICAgICAgICBmcm9tQXNUeXBlZExpc3QuYnVmZmVyLl9kYXRhLAogICAgICAgICAgICBza2lwQ291bnQgKiBlbGVtZW50U2l6ZUluQnl0ZXMgKyBmcm9tQXNUeXBlZExpc3Qub2Zmc2V0SW5CeXRlcywKICAgICAgICAgICAgQ2xhc3NJRC5nZXRJRCh0aGlzKSwKICAgICAgICAgICAgQ2xhc3NJRC5nZXRJRChmcm9tKSkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZnJvbUFzVHlwZWRMaXN0LmJ1ZmZlciA9PSB0aGlzLmJ1ZmZlcikgewogICAgICAgIC8vIERpZmZlcmVudCBlbGVtZW50IHNpemVzLCBidXQgc2FtZSBidWZmZXIgbWVhbnMgdGhhdCB3ZSBuZWVkCiAgICAgICAgLy8gYW4gaW50ZXJtZWRpYXRlIHN0cnVjdHVyZS4KICAgICAgICAvLyBUT0RPKHNyZGphbik6IE9wdGltaXplIHRvIHNraXAgY29weWluZyBpZiB0aGUgcmFuZ2UgZG9lcyBub3Qgb3ZlcmxhcC4KICAgICAgICBmaW5hbCBmcm9tQXNMaXN0ID0gZnJvbSBhcyBMaXN0PEludDMyeDQ+OwogICAgICAgIGZpbmFsIHRlbXBCdWZmZXIgPSBfY3JlYXRlTGlzdChjb3VudCk7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICB0ZW1wQnVmZmVyW2ldID0gZnJvbUFzTGlzdFtza2lwQ291bnQgKyBpXTsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgICAgIHRoaXNbaV0gPSB0ZW1wQnVmZmVyW2kgLSBzdGFydF07CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQoKICAgIExpc3Qgb3RoZXJMaXN0OwogICAgaW50IG90aGVyU3RhcnQ7CiAgICBpZiAoZnJvbSBpcyBMaXN0PEludDMyeDQ+KSB7CiAgICAgIG90aGVyTGlzdCA9IGZyb207CiAgICAgIG90aGVyU3RhcnQgPSBza2lwQ291bnQ7CiAgICB9IGVsc2UgewogICAgICBvdGhlckxpc3QgPSBmcm9tLnNraXAoc2tpcENvdW50KS50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICAgICAgb3RoZXJTdGFydCA9IDA7CiAgICB9CiAgICBpZiAob3RoZXJTdGFydCArIGNvdW50ID4gb3RoZXJMaXN0Lmxlbmd0aCkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29GZXcoKTsKICAgIH0KICAgIExpc3RzLmNvcHkob3RoZXJMaXN0LCBvdGhlclN0YXJ0LCB0aGlzLCBzdGFydCwgY291bnQpOwogIH0KCiAgSXRlcmFibGU8SW50MzJ4ND4gd2hlcmUoYm9vbCBmKEludDMyeDQgZWxlbWVudCkpID0+CiAgICAgIG5ldyBXaGVyZUl0ZXJhYmxlPEludDMyeDQ+KHRoaXMsIGYpOwoKICBJdGVyYWJsZTxJbnQzMng0PiB0YWtlKGludCBuKSA9PiBuZXcgU3ViTGlzdEl0ZXJhYmxlPEludDMyeDQ+KHRoaXMsIDAsIG4pOwoKICBJdGVyYWJsZTxJbnQzMng0PiB0YWtlV2hpbGUoYm9vbCB0ZXN0KEludDMyeDQgZWxlbWVudCkpID0+CiAgICAgIG5ldyBUYWtlV2hpbGVJdGVyYWJsZTxJbnQzMng0Pih0aGlzLCB0ZXN0KTsKCiAgSXRlcmFibGU8SW50MzJ4ND4gc2tpcChpbnQgbikgPT4gbmV3IFN1Ykxpc3RJdGVyYWJsZTxJbnQzMng0Pih0aGlzLCBuLCBudWxsKTsKCiAgSXRlcmFibGU8SW50MzJ4ND4gc2tpcFdoaWxlKGJvb2wgdGVzdChJbnQzMng0IGVsZW1lbnQpKSA9PgogICAgICBuZXcgU2tpcFdoaWxlSXRlcmFibGU8SW50MzJ4ND4odGhpcywgdGVzdCk7CgogIEl0ZXJhYmxlPEludDMyeDQ+IGdldCByZXZlcnNlZCA9PiBuZXcgUmV2ZXJzZWRMaXN0SXRlcmFibGU8SW50MzJ4ND4odGhpcyk7CgogIE1hcDxpbnQsIEludDMyeDQ+IGFzTWFwKCkgPT4gbmV3IExpc3RNYXBWaWV3PEludDMyeDQ+KHRoaXMpOwoKICBJdGVyYWJsZTxJbnQzMng0PiBnZXRSYW5nZShpbnQgc3RhcnQsIFtpbnQgZW5kXSkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgcmV0dXJuIG5ldyBTdWJMaXN0SXRlcmFibGU8SW50MzJ4ND4odGhpcywgc3RhcnQsIGVuZCk7CiAgfQoKICBJdGVyYXRvcjxJbnQzMng0PiBnZXQgaXRlcmF0b3IgPT4gbmV3IF9UeXBlZExpc3RJdGVyYXRvcjxJbnQzMng0Pih0aGlzKTsKCiAgTGlzdDxJbnQzMng0PiB0b0xpc3Qoe2Jvb2wgZ3Jvd2FibGU6IHRydWV9KSB7CiAgICByZXR1cm4gbmV3IExpc3Q8SW50MzJ4ND4uZnJvbSh0aGlzLCBncm93YWJsZTogZ3Jvd2FibGUpOwogIH0KCiAgU2V0PEludDMyeDQ+IHRvU2V0KCkgewogICAgcmV0dXJuIG5ldyBTZXQ8SW50MzJ4ND4uZnJvbSh0aGlzKTsKICB9CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoSW50MzJ4NCBlbGVtZW50KSkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBmKHRoaXNbaV0pOwogICAgfQogIH0KCiAgSW50MzJ4NCByZWR1Y2UoSW50MzJ4NCBjb21iaW5lKEludDMyeDQgdmFsdWUsIEludDMyeDQgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGlmIChsZW4gPT0gMCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB2YXIgdmFsdWUgPSB0aGlzWzBdOwogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBsZW47ICsraSkgewogICAgICB2YWx1ZSA9IGNvbWJpbmUodmFsdWUsIHRoaXNbaV0pOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgVCBmb2xkPFQ+KFQgaW5pdGlhbFZhbHVlLCBUIGNvbWJpbmUoVCBpbml0aWFsVmFsdWUsIEludDMyeDQgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaW5pdGlhbFZhbHVlID0gY29tYmluZShpbml0aWFsVmFsdWUsIHRoaXNbaV0pOwogICAgfQogICAgcmV0dXJuIGluaXRpYWxWYWx1ZTsKICB9CgogIEl0ZXJhYmxlPFQ+IG1hcDxUPihUIGYoSW50MzJ4NCBlbGVtZW50KSkgPT4KICAgICAgbmV3IE1hcHBlZEl0ZXJhYmxlPEludDMyeDQsIFQ+KHRoaXMsIGYpOwoKICBJdGVyYWJsZTxUPiBleHBhbmQ8VD4oSXRlcmFibGU8VD4gZihJbnQzMng0IGVsZW1lbnQpKSA9PgogICAgICBuZXcgRXhwYW5kSXRlcmFibGU8SW50MzJ4NCwgVD4odGhpcywgZik7CgogIGJvb2wgZXZlcnkoYm9vbCBmKEludDMyeDQgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaWYgKCFmKHRoaXNbaV0pKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGJvb2wgYW55KGJvb2wgZihJbnQzMng0IGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIGlmIChmKHRoaXNbaV0pKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEludDMyeDQgZmlyc3RXaGVyZShib29sIHRlc3QoSW50MzJ4NCBlbGVtZW50KSwge0ludDMyeDQgb3JFbHNlKCl9KSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIHZhciBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHJldHVybiBlbGVtZW50OwogICAgfQogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEludDMyeDQgbGFzdFdoZXJlKGJvb2wgdGVzdChJbnQzMng0IGVsZW1lbnQpLCB7SW50MzJ4NCBvckVsc2UoKX0pIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkgewogICAgICB2YXIgZWxlbWVudCA9IHRoaXNbaV07CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSB7CiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CiAgICAgIH0KICAgIH0KICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBJbnQzMng0IHNpbmdsZVdoZXJlKGJvb2wgdGVzdChJbnQzMng0IGVsZW1lbnQpLCB7SW50MzJ4NCBvckVsc2UoKX0pIHsKICAgIHZhciByZXN1bHQgPSBudWxsOwogICAgYm9vbCBmb3VuZE1hdGNoaW5nID0gZmFsc2U7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIHZhciBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHsKICAgICAgICBpZiAoZm91bmRNYXRjaGluZykgewogICAgICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQgPSBlbGVtZW50OwogICAgICAgIGZvdW5kTWF0Y2hpbmcgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBpZiAoZm91bmRNYXRjaGluZykgcmV0dXJuIHJlc3VsdDsKICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBJbnQzMng0IGVsZW1lbnRBdChpbnQgaW5kZXgpIHsKICAgIHJldHVybiB0aGlzW2luZGV4XTsKICB9CgogIHZvaWQgYWRkKEludDMyeDQgdmFsdWUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgYWRkIHRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEludDMyeDQ+IHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGFkZCB0byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIGluc2VydChpbnQgaW5kZXgsIEludDMyeDQgdmFsdWUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgaW5zZXJ0IGludG8gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgdm9pZCBpbnNlcnRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxJbnQzMng0PiB2YWx1ZXMpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgaW5zZXJ0IGludG8gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgdm9pZCBzb3J0KFtpbnQgY29tcGFyZShJbnQzMng0IGEsIEludDMyeDQgYildKSB7CiAgICBpZiAoY29tcGFyZSA9PSBudWxsKSB7CiAgICAgIHRocm93ICJTSU1EIGRvbid0IGhhdmUgZGVmYXVsdCBjb21wYXJlLiI7CiAgICB9CiAgICBTb3J0LnNvcnQodGhpcywgY29tcGFyZSk7CiAgfQoKICBpbnQgaW5kZXhPZihJbnQzMng0IGVsZW1lbnQsIFtpbnQgc3RhcnQgPSAwXSkgewogICAgaWYgKHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0gZWxzZSBpZiAoc3RhcnQgPCAwKSB7CiAgICAgIHN0YXJ0ID0gMDsKICAgIH0KICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKHRoaXNbaV0gPT0gZWxlbWVudCkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICBpbnQgbGFzdEluZGV4T2YoSW50MzJ4NCBlbGVtZW50LCBbaW50IHN0YXJ0ID0gbnVsbF0pIHsKICAgIGlmIChzdGFydCA9PSBudWxsIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB7CiAgICAgIHN0YXJ0ID0gdGhpcy5sZW5ndGggLSAxOwogICAgfSBlbHNlIGlmIChzdGFydCA8IDApIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpID49IDA7IGktLSkgewogICAgICBpZiAodGhpc1tpXSA9PSBlbGVtZW50KSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIEludDMyeDQgcmVtb3ZlTGFzdCgpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgSW50MzJ4NCByZW1vdmVBdChpbnQgaW5kZXgpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoSW50MzJ4NCBlbGVtZW50KSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChJbnQzMng0IGVsZW1lbnQpKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIEludDMyeDQgZ2V0IGZpcnN0IHsKICAgIGlmIChsZW5ndGggPiAwKSByZXR1cm4gdGhpc1swXTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgSW50MzJ4NCBnZXQgbGFzdCB7CiAgICBpZiAobGVuZ3RoID4gMCkgcmV0dXJuIHRoaXNbbGVuZ3RoIC0gMV07CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEludDMyeDQgZ2V0IHNpbmdsZSB7CiAgICBpZiAobGVuZ3RoID09IDEpIHJldHVybiB0aGlzWzBdOwogICAgaWYgKGxlbmd0aCA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLnRvb01hbnkoKTsKICB9CgogIExpc3Q8SW50MzJ4ND4gc3VibGlzdChpbnQgc3RhcnQsIFtpbnQgZW5kXSkgewogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgdmFyIGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgTGlzdDxJbnQzMng0PiByZXN1bHQgPSBfY3JlYXRlTGlzdChsZW5ndGgpOwogICAgcmVzdWx0LnNldFJhbmdlKDAsIGxlbmd0aCwgdGhpcywgc3RhcnQpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgc2V0QWxsKGludCBpbmRleCwgSXRlcmFibGU8SW50MzJ4ND4gaXRlcmFibGUpIHsKICAgIGZpbmFsIGVuZCA9IGl0ZXJhYmxlLmxlbmd0aCArIGluZGV4OwogICAgc2V0UmFuZ2UoaW5kZXgsIGVuZCwgaXRlcmFibGUpOwogIH0KCiAgdm9pZCBmaWxsUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBbSW50MzJ4NCBmaWxsVmFsdWVdKSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkgewogICAgICB0aGlzW2ldID0gZmlsbFZhbHVlOwogICAgfQogIH0KfQoKYWJzdHJhY3QgY2xhc3MgX0Zsb2F0NjR4Mkxpc3RNaXhpbiBpbXBsZW1lbnRzIExpc3Q8RmxvYXQ2NHgyPiB7CiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXM7CiAgaW50IGdldCBvZmZzZXRJbkJ5dGVzOwogIF9CeXRlQnVmZmVyIGdldCBidWZmZXI7CgogIExpc3Q8RmxvYXQ2NHgyPiBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKTsKCiAgSXRlcmFibGU8VD4gd2hlcmVUeXBlPFQ+KCkgPT4gbmV3IFdoZXJlVHlwZUl0ZXJhYmxlPFQ+KHRoaXMpOwoKICBJdGVyYWJsZTxGbG9hdDY0eDI+IGZvbGxvd2VkQnkoSXRlcmFibGU8RmxvYXQ2NHgyPiBvdGhlcikgPT4KICAgICAgbmV3IEZvbGxvd2VkQnlJdGVyYWJsZTxGbG9hdDY0eDI+LmZpcnN0RWZmaWNpZW50KHRoaXMsIG90aGVyKTsKCiAgTGlzdDxSPiBjYXN0PFI+KCkgPT4gTGlzdC5jYXN0RnJvbTxGbG9hdDY0eDIsIFI+KHRoaXMpOwogIHZvaWQgc2V0IGZpcnN0KEZsb2F0NjR4MiB2YWx1ZSkgewogICAgaWYgKHRoaXMubGVuZ3RoID09IDApIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KDAsIHRoaXMpOwogICAgdGhpc1swXSA9IHZhbHVlOwogIH0KCiAgdm9pZCBzZXQgbGFzdChGbG9hdDY0eDIgdmFsdWUpIHsKICAgIGlmICh0aGlzLmxlbmd0aCA9PSAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleCgwLCB0aGlzKTsKICAgIHRoaXNbdGhpcy5sZW5ndGggLSAxXSA9IHZhbHVlOwogIH0KCiAgaW50IGluZGV4V2hlcmUoYm9vbCB0ZXN0KEZsb2F0NjR4MiBlbGVtZW50KSwgW2ludCBzdGFydCA9IDBdKSB7CiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDA7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBpZiAodGVzdCh0aGlzW2ldKSkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICBpbnQgbGFzdEluZGV4V2hlcmUoYm9vbCB0ZXN0KEZsb2F0NjR4MiBlbGVtZW50KSwgW2ludCBzdGFydF0pIHsKICAgIGlmIChzdGFydCA9PSBudWxsIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSBzdGFydCA9IHRoaXMubGVuZ3RoIC0gMTsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA+PSAwOyBpLS0pIHsKICAgICAgaWYgKHRlc3QodGhpc1tpXSkpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgTGlzdDxGbG9hdDY0eDI+IG9wZXJhdG9yICsoTGlzdDxGbG9hdDY0eDI+IG90aGVyKSB7CiAgICBpbnQgdG90YWxMZW5ndGggPSB0aGlzLmxlbmd0aCArIG90aGVyLmxlbmd0aDsKICAgIHJldHVybiA8RmxvYXQ2NHgyPltdCiAgICAgIC4ubGVuZ3RoID0gdG90YWxMZW5ndGgKICAgICAgLi5zZXRSYW5nZSgwLCB0aGlzLmxlbmd0aCwgdGhpcykKICAgICAgLi5zZXRSYW5nZSh0aGlzLmxlbmd0aCwgdG90YWxMZW5ndGgsIG90aGVyKTsKICB9CgogIGJvb2wgY29udGFpbnMoT2JqZWN0IGVsZW1lbnQpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaWYgKHRoaXNbaV0gPT0gZWxlbWVudCkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICB2b2lkIHNodWZmbGUoW1JhbmRvbSByYW5kb21dKSB7CiAgICByYW5kb20gPz89IG5ldyBSYW5kb20oKTsKICAgIHZhciBpID0gdGhpcy5sZW5ndGg7CiAgICB3aGlsZSAoaSA+IDEpIHsKICAgICAgaW50IHBvcyA9IHJhbmRvbS5uZXh0SW50KGkpOwogICAgICBpIC09IDE7CiAgICAgIHZhciB0bXAgPSB0aGlzW2ldOwogICAgICB0aGlzW2ldID0gdGhpc1twb3NdOwogICAgICB0aGlzW3Bvc10gPSB0bXA7CiAgICB9CiAgfQoKICB2b2lkIHNldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGU8RmxvYXQ2NHgyPiBmcm9tLAogICAgICBbaW50IHNraXBDb3VudCA9IDBdKSB7CiAgICAvLyBDaGVjayByYW5nZXMuCiAgICBpZiAoMCA+IHN0YXJ0IHx8IHN0YXJ0ID4gZW5kIHx8IGVuZCA+IGxlbmd0aCkgewogICAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBsZW5ndGgpOyAvLyBBbHdheXMgdGhyb3dzLgogICAgICBhc3NlcnQoZmFsc2UpOwogICAgfQogICAgaWYgKHNraXBDb3VudCA8IDApIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Ioc2tpcENvdW50KTsKICAgIH0KCiAgICBmaW5hbCBjb3VudCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKChmcm9tLmxlbmd0aCAtIHNraXBDb3VudCkgPCBjb3VudCkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29GZXcoKTsKICAgIH0KCiAgICBpZiAoY291bnQgPT0gMCkgcmV0dXJuOwoKICAgIGlmIChmcm9tIGlzIF9UeXBlZExpc3RCYXNlKSB7CiAgICAgIC8vIE5vdGU6IF9UeXBlZExpc3RCYXNlIGlzIG5vdCByZWxhdGVkIHRvIEl0ZXJhYmxlPEZsb2F0NjR4Mj4gc28gdGhlcmUgaXMKICAgICAgLy8gbm8gcHJvbW90aW9uIGhlcmUuCiAgICAgIGZpbmFsIGZyb21Bc1R5cGVkTGlzdCA9IGZyb20gYXMgX1R5cGVkTGlzdEJhc2U7CiAgICAgIGlmICh0aGlzLmVsZW1lbnRTaXplSW5CeXRlcyA9PSBmcm9tQXNUeXBlZExpc3QuZWxlbWVudFNpemVJbkJ5dGVzKSB7CiAgICAgICAgaWYgKChjb3VudCA8IDEwKSAmJiAoZnJvbUFzVHlwZWRMaXN0LmJ1ZmZlciAhPSB0aGlzLmJ1ZmZlcikpIHsKICAgICAgICAgIExpc3RzLmNvcHkoZnJvbSBhcyBMaXN0PEZsb2F0NjR4Mj4sIHNraXBDb3VudCwgdGhpcywgc3RhcnQsIGNvdW50KTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYnVmZmVyLl9kYXRhLl9zZXRSYW5nZSgKICAgICAgICAgICAgc3RhcnQgKiBlbGVtZW50U2l6ZUluQnl0ZXMgKyB0aGlzLm9mZnNldEluQnl0ZXMsCiAgICAgICAgICAgIGNvdW50ICogZWxlbWVudFNpemVJbkJ5dGVzLAogICAgICAgICAgICBmcm9tQXNUeXBlZExpc3QuYnVmZmVyLl9kYXRhLAogICAgICAgICAgICBza2lwQ291bnQgKiBlbGVtZW50U2l6ZUluQnl0ZXMgKyBmcm9tQXNUeXBlZExpc3Qub2Zmc2V0SW5CeXRlcywKICAgICAgICAgICAgQ2xhc3NJRC5nZXRJRCh0aGlzKSwKICAgICAgICAgICAgQ2xhc3NJRC5nZXRJRChmcm9tKSkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZnJvbUFzVHlwZWRMaXN0LmJ1ZmZlciA9PSB0aGlzLmJ1ZmZlcikgewogICAgICAgIC8vIERpZmZlcmVudCBlbGVtZW50IHNpemVzLCBidXQgc2FtZSBidWZmZXIgbWVhbnMgdGhhdCB3ZSBuZWVkCiAgICAgICAgLy8gYW4gaW50ZXJtZWRpYXRlIHN0cnVjdHVyZS4KICAgICAgICAvLyBUT0RPKHNyZGphbik6IE9wdGltaXplIHRvIHNraXAgY29weWluZyBpZiB0aGUgcmFuZ2UgZG9lcyBub3Qgb3ZlcmxhcC4KICAgICAgICBmaW5hbCBmcm9tQXNMaXN0ID0gZnJvbSBhcyBMaXN0PEZsb2F0NjR4Mj47CiAgICAgICAgZmluYWwgdGVtcEJ1ZmZlciA9IF9jcmVhdGVMaXN0KGNvdW50KTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgIHRlbXBCdWZmZXJbaV0gPSBmcm9tQXNMaXN0W3NraXBDb3VudCArIGldOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICAgICAgdGhpc1tpXSA9IHRlbXBCdWZmZXJbaSAtIHN0YXJ0XTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CgogICAgTGlzdCBvdGhlckxpc3Q7CiAgICBpbnQgb3RoZXJTdGFydDsKICAgIGlmIChmcm9tIGlzIExpc3Q8RmxvYXQ2NHgyPikgewogICAgICBvdGhlckxpc3QgPSBmcm9tOwogICAgICBvdGhlclN0YXJ0ID0gc2tpcENvdW50OwogICAgfSBlbHNlIHsKICAgICAgb3RoZXJMaXN0ID0gZnJvbS5za2lwKHNraXBDb3VudCkudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICAgIG90aGVyU3RhcnQgPSAwOwogICAgfQogICAgaWYgKG90aGVyU3RhcnQgKyBjb3VudCA+IG90aGVyTGlzdC5sZW5ndGgpIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vRmV3KCk7CiAgICB9CiAgICBMaXN0cy5jb3B5KG90aGVyTGlzdCwgb3RoZXJTdGFydCwgdGhpcywgc3RhcnQsIGNvdW50KTsKICB9CgogIEl0ZXJhYmxlPEZsb2F0NjR4Mj4gd2hlcmUoYm9vbCBmKEZsb2F0NjR4MiBlbGVtZW50KSkgPT4KICAgICAgbmV3IFdoZXJlSXRlcmFibGU8RmxvYXQ2NHgyPih0aGlzLCBmKTsKCiAgSXRlcmFibGU8RmxvYXQ2NHgyPiB0YWtlKGludCBuKSA9PiBuZXcgU3ViTGlzdEl0ZXJhYmxlPEZsb2F0NjR4Mj4odGhpcywgMCwgbik7CgogIEl0ZXJhYmxlPEZsb2F0NjR4Mj4gdGFrZVdoaWxlKGJvb2wgdGVzdChGbG9hdDY0eDIgZWxlbWVudCkpID0+CiAgICAgIG5ldyBUYWtlV2hpbGVJdGVyYWJsZTxGbG9hdDY0eDI+KHRoaXMsIHRlc3QpOwoKICBJdGVyYWJsZTxGbG9hdDY0eDI+IHNraXAoaW50IG4pID0+CiAgICAgIG5ldyBTdWJMaXN0SXRlcmFibGU8RmxvYXQ2NHgyPih0aGlzLCBuLCBudWxsKTsKCiAgSXRlcmFibGU8RmxvYXQ2NHgyPiBza2lwV2hpbGUoYm9vbCB0ZXN0KEZsb2F0NjR4MiBlbGVtZW50KSkgPT4KICAgICAgbmV3IFNraXBXaGlsZUl0ZXJhYmxlPEZsb2F0NjR4Mj4odGhpcywgdGVzdCk7CgogIEl0ZXJhYmxlPEZsb2F0NjR4Mj4gZ2V0IHJldmVyc2VkID0+IG5ldyBSZXZlcnNlZExpc3RJdGVyYWJsZTxGbG9hdDY0eDI+KHRoaXMpOwoKICBNYXA8aW50LCBGbG9hdDY0eDI+IGFzTWFwKCkgPT4gbmV3IExpc3RNYXBWaWV3PEZsb2F0NjR4Mj4odGhpcyk7CgogIEl0ZXJhYmxlPEZsb2F0NjR4Mj4gZ2V0UmFuZ2UoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgIHJldHVybiBuZXcgU3ViTGlzdEl0ZXJhYmxlPEZsb2F0NjR4Mj4odGhpcywgc3RhcnQsIGVuZCk7CiAgfQoKICBJdGVyYXRvcjxGbG9hdDY0eDI+IGdldCBpdGVyYXRvciA9PiBuZXcgX1R5cGVkTGlzdEl0ZXJhdG9yPEZsb2F0NjR4Mj4odGhpcyk7CgogIExpc3Q8RmxvYXQ2NHgyPiB0b0xpc3Qoe2Jvb2wgZ3Jvd2FibGU6IHRydWV9KSB7CiAgICByZXR1cm4gbmV3IExpc3Q8RmxvYXQ2NHgyPi5mcm9tKHRoaXMsIGdyb3dhYmxlOiBncm93YWJsZSk7CiAgfQoKICBTZXQ8RmxvYXQ2NHgyPiB0b1NldCgpIHsKICAgIHJldHVybiBuZXcgU2V0PEZsb2F0NjR4Mj4uZnJvbSh0aGlzKTsKICB9CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoRmxvYXQ2NHgyIGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGYodGhpc1tpXSk7CiAgICB9CiAgfQoKICBGbG9hdDY0eDIgcmVkdWNlKEZsb2F0NjR4MiBjb21iaW5lKEZsb2F0NjR4MiB2YWx1ZSwgRmxvYXQ2NHgyIGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBpZiAobGVuID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgdmFyIHZhbHVlID0gdGhpc1swXTsKICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyArK2kpIHsKICAgICAgdmFsdWUgPSBjb21iaW5lKHZhbHVlLCB0aGlzW2ldKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CgogIFQgZm9sZDxUPihUIGluaXRpYWxWYWx1ZSwgVCBjb21iaW5lKFQgaW5pdGlhbFZhbHVlLCBGbG9hdDY0eDIgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaW5pdGlhbFZhbHVlID0gY29tYmluZShpbml0aWFsVmFsdWUsIHRoaXNbaV0pOwogICAgfQogICAgcmV0dXJuIGluaXRpYWxWYWx1ZTsKICB9CgogIEl0ZXJhYmxlPFQ+IG1hcDxUPihUIGYoRmxvYXQ2NHgyIGVsZW1lbnQpKSA9PgogICAgICBuZXcgTWFwcGVkSXRlcmFibGU8RmxvYXQ2NHgyLCBUPih0aGlzLCBmKTsKCiAgSXRlcmFibGU8VD4gZXhwYW5kPFQ+KEl0ZXJhYmxlPFQ+IGYoRmxvYXQ2NHgyIGVsZW1lbnQpKSA9PgogICAgICBuZXcgRXhwYW5kSXRlcmFibGU8RmxvYXQ2NHgyLCBUPih0aGlzLCBmKTsKCiAgYm9vbCBldmVyeShib29sIGYoRmxvYXQ2NHgyIGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIGlmICghZih0aGlzW2ldKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBib29sIGFueShib29sIGYoRmxvYXQ2NHgyIGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIGlmIChmKHRoaXNbaV0pKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEZsb2F0NjR4MiBmaXJzdFdoZXJlKGJvb2wgdGVzdChGbG9hdDY0eDIgZWxlbWVudCksIHtGbG9hdDY0eDIgb3JFbHNlKCl9KSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIHZhciBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHJldHVybiBlbGVtZW50OwogICAgfQogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEZsb2F0NjR4MiBsYXN0V2hlcmUoYm9vbCB0ZXN0KEZsb2F0NjR4MiBlbGVtZW50KSwge0Zsb2F0NjR4MiBvckVsc2UoKX0pIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkgewogICAgICB2YXIgZWxlbWVudCA9IHRoaXNbaV07CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSB7CiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CiAgICAgIH0KICAgIH0KICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBGbG9hdDY0eDIgc2luZ2xlV2hlcmUoYm9vbCB0ZXN0KEZsb2F0NjR4MiBlbGVtZW50KSwge0Zsb2F0NjR4MiBvckVsc2UoKX0pIHsKICAgIHZhciByZXN1bHQgPSBudWxsOwogICAgYm9vbCBmb3VuZE1hdGNoaW5nID0gZmFsc2U7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIHZhciBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHsKICAgICAgICBpZiAoZm91bmRNYXRjaGluZykgewogICAgICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQgPSBlbGVtZW50OwogICAgICAgIGZvdW5kTWF0Y2hpbmcgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBpZiAoZm91bmRNYXRjaGluZykgcmV0dXJuIHJlc3VsdDsKICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBGbG9hdDY0eDIgZWxlbWVudEF0KGludCBpbmRleCkgewogICAgcmV0dXJuIHRoaXNbaW5kZXhdOwogIH0KCiAgdm9pZCBhZGQoRmxvYXQ2NHgyIHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGFkZCB0byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIGFkZEFsbChJdGVyYWJsZTxGbG9hdDY0eDI+IHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGFkZCB0byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIGluc2VydChpbnQgaW5kZXgsIEZsb2F0NjR4MiB2YWx1ZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBpbnNlcnQgaW50byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIGluc2VydEFsbChpbnQgaW5kZXgsIEl0ZXJhYmxlPEZsb2F0NjR4Mj4gdmFsdWVzKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGluc2VydCBpbnRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgc29ydChbaW50IGNvbXBhcmUoRmxvYXQ2NHgyIGEsIEZsb2F0NjR4MiBiKV0pIHsKICAgIGlmIChjb21wYXJlID09IG51bGwpIHsKICAgICAgdGhyb3cgIlNJTUQgZG9uJ3QgaGF2ZSBkZWZhdWx0IGNvbXBhcmUuIjsKICAgIH0KICAgIFNvcnQuc29ydCh0aGlzLCBjb21wYXJlKTsKICB9CgogIGludCBpbmRleE9mKEZsb2F0NjR4MiBlbGVtZW50LCBbaW50IHN0YXJ0ID0gMF0pIHsKICAgIGlmIChzdGFydCA+PSB0aGlzLmxlbmd0aCkgewogICAgICByZXR1cm4gLTE7CiAgICB9IGVsc2UgaWYgKHN0YXJ0IDwgMCkgewogICAgICBzdGFydCA9IDA7CiAgICB9CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0aGlzW2ldID09IGVsZW1lbnQpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgaW50IGxhc3RJbmRleE9mKEZsb2F0NjR4MiBlbGVtZW50LCBbaW50IHN0YXJ0ID0gbnVsbF0pIHsKICAgIGlmIChzdGFydCA9PSBudWxsIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB7CiAgICAgIHN0YXJ0ID0gdGhpcy5sZW5ndGggLSAxOwogICAgfSBlbHNlIGlmIChzdGFydCA8IDApIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpID49IDA7IGktLSkgewogICAgICBpZiAodGhpc1tpXSA9PSBlbGVtZW50KSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIEZsb2F0NjR4MiByZW1vdmVMYXN0KCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICBGbG9hdDY0eDIgcmVtb3ZlQXQoaW50IGluZGV4KSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KEZsb2F0NjR4MiBlbGVtZW50KSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChGbG9hdDY0eDIgZWxlbWVudCkpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgRmxvYXQ2NHgyIGdldCBmaXJzdCB7CiAgICBpZiAobGVuZ3RoID4gMCkgcmV0dXJuIHRoaXNbMF07CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEZsb2F0NjR4MiBnZXQgbGFzdCB7CiAgICBpZiAobGVuZ3RoID4gMCkgcmV0dXJuIHRoaXNbbGVuZ3RoIC0gMV07CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEZsb2F0NjR4MiBnZXQgc2luZ2xlIHsKICAgIGlmIChsZW5ndGggPT0gMSkgcmV0dXJuIHRoaXNbMF07CiAgICBpZiAobGVuZ3RoID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogIH0KCiAgTGlzdDxGbG9hdDY0eDI+IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgIHZhciBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIExpc3Q8RmxvYXQ2NHgyPiByZXN1bHQgPSBfY3JlYXRlTGlzdChsZW5ndGgpOwogICAgcmVzdWx0LnNldFJhbmdlKDAsIGxlbmd0aCwgdGhpcywgc3RhcnQpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgc2V0QWxsKGludCBpbmRleCwgSXRlcmFibGU8RmxvYXQ2NHgyPiBpdGVyYWJsZSkgewogICAgZmluYWwgZW5kID0gaXRlcmFibGUubGVuZ3RoICsgaW5kZXg7CiAgICBzZXRSYW5nZShpbmRleCwgZW5kLCBpdGVyYWJsZSk7CiAgfQoKICB2b2lkIGZpbGxSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIFtGbG9hdDY0eDIgZmlsbFZhbHVlXSkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHsKICAgICAgdGhpc1tpXSA9IGZpbGxWYWx1ZTsKICAgIH0KICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0J5dGVCdWZmZXIgaW1wbGVtZW50cyBCeXRlQnVmZmVyIHsKICBmaW5hbCBfVHlwZWRMaXN0IF9kYXRhOwoKICBfQnl0ZUJ1ZmZlcih0aGlzLl9kYXRhKTsKCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGZhY3RvcnkgX0J5dGVCdWZmZXIuX05ldyhkYXRhKSA9PiBuZXcgX0J5dGVCdWZmZXIoZGF0YSk7CgogIC8vIEZvcndhcmQgY2FsbHMgdG8gX2RhdGEuCiAgaW50IGdldCBsZW5ndGhJbkJ5dGVzID0+IF9kYXRhLmxlbmd0aEluQnl0ZXM7CiAgaW50IGdldCBoYXNoQ29kZSA9PiBfZGF0YS5oYXNoQ29kZTsKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgPT4KICAgICAgKG90aGVyIGlzIF9CeXRlQnVmZmVyKSAmJiBpZGVudGljYWwoX2RhdGEsIG90aGVyLl9kYXRhKTsKCiAgQnl0ZURhdGEgYXNCeXRlRGF0YShbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgbGVuZ3RoID8/PSB0aGlzLmxlbmd0aEluQnl0ZXMgLSBvZmZzZXRJbkJ5dGVzOwogICAgX3JhbmdlQ2hlY2sodGhpcy5fZGF0YS5sZW5ndGhJbkJ5dGVzLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogICAgcmV0dXJuIG5ldyBfQnl0ZURhdGFWaWV3KHRoaXMuX2RhdGEsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICBJbnQ4TGlzdCBhc0ludDhMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICBsZW5ndGggPz89ICh0aGlzLmxlbmd0aEluQnl0ZXMgLSBvZmZzZXRJbkJ5dGVzKSB+LyBJbnQ4TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgICBfcmFuZ2VDaGVjaygKICAgICAgICB0aGlzLmxlbmd0aEluQnl0ZXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCAqIEludDhMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICByZXR1cm4gbmV3IF9JbnQ4QXJyYXlWaWV3KHRoaXMuX2RhdGEsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICBVaW50OExpc3QgYXNVaW50OExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIGxlbmd0aCA/Pz0KICAgICAgICAodGhpcy5sZW5ndGhJbkJ5dGVzIC0gb2Zmc2V0SW5CeXRlcykgfi8gVWludDhMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICAgIF9yYW5nZUNoZWNrKAogICAgICAgIHRoaXMubGVuZ3RoSW5CeXRlcywgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoICogVWludDhMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICByZXR1cm4gbmV3IF9VaW50OEFycmF5Vmlldyh0aGlzLl9kYXRhLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgVWludDhDbGFtcGVkTGlzdCBhc1VpbnQ4Q2xhbXBlZExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIGxlbmd0aCA/Pz0gKHRoaXMubGVuZ3RoSW5CeXRlcyAtIG9mZnNldEluQnl0ZXMpIH4vCiAgICAgICAgVWludDhDbGFtcGVkTGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgICBfcmFuZ2VDaGVjayh0aGlzLmxlbmd0aEluQnl0ZXMsIG9mZnNldEluQnl0ZXMsCiAgICAgICAgbGVuZ3RoICogVWludDhDbGFtcGVkTGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgcmV0dXJuIG5ldyBfVWludDhDbGFtcGVkQXJyYXlWaWV3KHRoaXMuX2RhdGEsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICBJbnQxNkxpc3QgYXNJbnQxNkxpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIGxlbmd0aCA/Pz0KICAgICAgICAodGhpcy5sZW5ndGhJbkJ5dGVzIC0gb2Zmc2V0SW5CeXRlcykgfi8gSW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICAgIF9yYW5nZUNoZWNrKAogICAgICAgIHRoaXMubGVuZ3RoSW5CeXRlcywgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoICogSW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICBfb2Zmc2V0QWxpZ25tZW50Q2hlY2sob2Zmc2V0SW5CeXRlcywgSW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICByZXR1cm4gbmV3IF9JbnQxNkFycmF5Vmlldyh0aGlzLl9kYXRhLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgVWludDE2TGlzdCBhc1VpbnQxNkxpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIGxlbmd0aCA/Pz0KICAgICAgICAodGhpcy5sZW5ndGhJbkJ5dGVzIC0gb2Zmc2V0SW5CeXRlcykgfi8gVWludDE2TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgICBfcmFuZ2VDaGVjaygKICAgICAgICB0aGlzLmxlbmd0aEluQnl0ZXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCAqIFVpbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICAgIF9vZmZzZXRBbGlnbm1lbnRDaGVjayhvZmZzZXRJbkJ5dGVzLCBVaW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICByZXR1cm4gbmV3IF9VaW50MTZBcnJheVZpZXcodGhpcy5fZGF0YSwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIEludDMyTGlzdCBhc0ludDMyTGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgbGVuZ3RoID8/PQogICAgICAgICh0aGlzLmxlbmd0aEluQnl0ZXMgLSBvZmZzZXRJbkJ5dGVzKSB+LyBJbnQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogICAgX3JhbmdlQ2hlY2soCiAgICAgICAgdGhpcy5sZW5ndGhJbkJ5dGVzLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGggKiBJbnQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICAgIF9vZmZzZXRBbGlnbm1lbnRDaGVjayhvZmZzZXRJbkJ5dGVzLCBJbnQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICAgIHJldHVybiBuZXcgX0ludDMyQXJyYXlWaWV3KHRoaXMuX2RhdGEsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICBVaW50MzJMaXN0IGFzVWludDMyTGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgbGVuZ3RoID8/PQogICAgICAgICh0aGlzLmxlbmd0aEluQnl0ZXMgLSBvZmZzZXRJbkJ5dGVzKSB+LyBVaW50MzJMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICAgIF9yYW5nZUNoZWNrKAogICAgICAgIHRoaXMubGVuZ3RoSW5CeXRlcywgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoICogVWludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgX29mZnNldEFsaWdubWVudENoZWNrKG9mZnNldEluQnl0ZXMsIFVpbnQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICAgIHJldHVybiBuZXcgX1VpbnQzMkFycmF5Vmlldyh0aGlzLl9kYXRhLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgSW50NjRMaXN0IGFzSW50NjRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICBsZW5ndGggPz89CiAgICAgICAgKHRoaXMubGVuZ3RoSW5CeXRlcyAtIG9mZnNldEluQnl0ZXMpIH4vIEludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgICBfcmFuZ2VDaGVjaygKICAgICAgICB0aGlzLmxlbmd0aEluQnl0ZXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCAqIEludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgX29mZnNldEFsaWdubWVudENoZWNrKG9mZnNldEluQnl0ZXMsIEludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgcmV0dXJuIG5ldyBfSW50NjRBcnJheVZpZXcodGhpcy5fZGF0YSwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIFVpbnQ2NExpc3QgYXNVaW50NjRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICBsZW5ndGggPz89CiAgICAgICAgKHRoaXMubGVuZ3RoSW5CeXRlcyAtIG9mZnNldEluQnl0ZXMpIH4vIFVpbnQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50OwogICAgX3JhbmdlQ2hlY2soCiAgICAgICAgdGhpcy5sZW5ndGhJbkJ5dGVzLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGggKiBVaW50NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICBfb2Zmc2V0QWxpZ25tZW50Q2hlY2sob2Zmc2V0SW5CeXRlcywgVWludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgcmV0dXJuIG5ldyBfVWludDY0QXJyYXlWaWV3KHRoaXMuX2RhdGEsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICBGbG9hdDMyTGlzdCBhc0Zsb2F0MzJMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICBsZW5ndGggPz89CiAgICAgICAgKHRoaXMubGVuZ3RoSW5CeXRlcyAtIG9mZnNldEluQnl0ZXMpIH4vIEZsb2F0MzJMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICAgIF9yYW5nZUNoZWNrKHRoaXMubGVuZ3RoSW5CeXRlcywgb2Zmc2V0SW5CeXRlcywKICAgICAgICBsZW5ndGggKiBGbG9hdDMyTGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgX29mZnNldEFsaWdubWVudENoZWNrKG9mZnNldEluQnl0ZXMsIEZsb2F0MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICByZXR1cm4gbmV3IF9GbG9hdDMyQXJyYXlWaWV3KHRoaXMuX2RhdGEsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICBGbG9hdDY0TGlzdCBhc0Zsb2F0NjRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICBsZW5ndGggPz89CiAgICAgICAgKHRoaXMubGVuZ3RoSW5CeXRlcyAtIG9mZnNldEluQnl0ZXMpIH4vIEZsb2F0NjRMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICAgIF9yYW5nZUNoZWNrKHRoaXMubGVuZ3RoSW5CeXRlcywgb2Zmc2V0SW5CeXRlcywKICAgICAgICBsZW5ndGggKiBGbG9hdDY0TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgX29mZnNldEFsaWdubWVudENoZWNrKG9mZnNldEluQnl0ZXMsIEZsb2F0NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICByZXR1cm4gbmV3IF9GbG9hdDY0QXJyYXlWaWV3KHRoaXMuX2RhdGEsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICBGbG9hdDMyeDRMaXN0IGFzRmxvYXQzMng0TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgbGVuZ3RoID8/PQogICAgICAgICh0aGlzLmxlbmd0aEluQnl0ZXMgLSBvZmZzZXRJbkJ5dGVzKSB+LyBGbG9hdDMyeDRMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICAgIF9yYW5nZUNoZWNrKHRoaXMubGVuZ3RoSW5CeXRlcywgb2Zmc2V0SW5CeXRlcywKICAgICAgICBsZW5ndGggKiBGbG9hdDMyeDRMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICBfb2Zmc2V0QWxpZ25tZW50Q2hlY2sob2Zmc2V0SW5CeXRlcywgRmxvYXQzMng0TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgcmV0dXJuIG5ldyBfRmxvYXQzMng0QXJyYXlWaWV3KHRoaXMuX2RhdGEsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICBJbnQzMng0TGlzdCBhc0ludDMyeDRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICBsZW5ndGggPz89CiAgICAgICAgKHRoaXMubGVuZ3RoSW5CeXRlcyAtIG9mZnNldEluQnl0ZXMpIH4vIEludDMyeDRMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICAgIF9yYW5nZUNoZWNrKHRoaXMubGVuZ3RoSW5CeXRlcywgb2Zmc2V0SW5CeXRlcywKICAgICAgICBsZW5ndGggKiBJbnQzMng0TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgX29mZnNldEFsaWdubWVudENoZWNrKG9mZnNldEluQnl0ZXMsIEludDMyeDRMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICByZXR1cm4gbmV3IF9JbnQzMng0QXJyYXlWaWV3KHRoaXMuX2RhdGEsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICBGbG9hdDY0eDJMaXN0IGFzRmxvYXQ2NHgyTGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgbGVuZ3RoID8/PQogICAgICAgICh0aGlzLmxlbmd0aEluQnl0ZXMgLSBvZmZzZXRJbkJ5dGVzKSB+LyBGbG9hdDY0eDJMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICAgIF9yYW5nZUNoZWNrKHRoaXMubGVuZ3RoSW5CeXRlcywgb2Zmc2V0SW5CeXRlcywKICAgICAgICBsZW5ndGggKiBGbG9hdDY0eDJMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICBfb2Zmc2V0QWxpZ25tZW50Q2hlY2sob2Zmc2V0SW5CeXRlcywgRmxvYXQ2NHgyTGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgcmV0dXJuIG5ldyBfRmxvYXQ2NHgyQXJyYXlWaWV3KHRoaXMuX2RhdGEsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBfVHlwZWRMaXN0IGV4dGVuZHMgX1R5cGVkTGlzdEJhc2UgewogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzOwoKICAvLyBEZWZhdWx0IG1ldGhvZCBpbXBsZW1lbnRpbmcgcGFydHMgb2YgdGhlIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBvZmZzZXRJbkJ5dGVzIHsKICAgIHJldHVybiAwOwogIH0KCiAgaW50IGdldCBsZW5ndGhJbkJ5dGVzIHsKICAgIHJldHVybiBsZW5ndGggKiBlbGVtZW50U2l6ZUluQnl0ZXM7CiAgfQoKICBfQnl0ZUJ1ZmZlciBnZXQgYnVmZmVyID0+IG5ldyBfQnl0ZUJ1ZmZlcih0aGlzKTsKCiAgLy8gTWV0aG9kcyBpbXBsZW1lbnRpbmcgdGhlIGNvbGxlY3Rpb24gaW50ZXJmYWNlLgoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IGdldCBsZW5ndGggbmF0aXZlICJUeXBlZERhdGFfbGVuZ3RoIjsKCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IF9nZXRJbnQ4KGludCBvZmZzZXRJbkJ5dGVzKSBuYXRpdmUgIlR5cGVkRGF0YV9HZXRJbnQ4IjsKICB2b2lkIF9zZXRJbnQ4KGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgdmFsdWUpIG5hdGl2ZSAiVHlwZWREYXRhX1NldEludDgiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IF9nZXRVaW50OChpbnQgb2Zmc2V0SW5CeXRlcykgbmF0aXZlICJUeXBlZERhdGFfR2V0VWludDgiOwogIHZvaWQgX3NldFVpbnQ4KGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgdmFsdWUpIG5hdGl2ZSAiVHlwZWREYXRhX1NldFVpbnQ4IjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBfZ2V0SW50MTYoaW50IG9mZnNldEluQnl0ZXMpIG5hdGl2ZSAiVHlwZWREYXRhX0dldEludDE2IjsKICB2b2lkIF9zZXRJbnQxNihpbnQgb2Zmc2V0SW5CeXRlcywgaW50IHZhbHVlKSBuYXRpdmUgIlR5cGVkRGF0YV9TZXRJbnQxNiI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgX2dldFVpbnQxNihpbnQgb2Zmc2V0SW5CeXRlcykgbmF0aXZlICJUeXBlZERhdGFfR2V0VWludDE2IjsKICB2b2lkIF9zZXRVaW50MTYoaW50IG9mZnNldEluQnl0ZXMsIGludCB2YWx1ZSkgbmF0aXZlICJUeXBlZERhdGFfU2V0VWludDE2IjsKCiAgaW50IF9nZXRJbnQzMihpbnQgb2Zmc2V0SW5CeXRlcykgbmF0aXZlICJUeXBlZERhdGFfR2V0SW50MzIiOwogIHZvaWQgX3NldEludDMyKGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgdmFsdWUpIG5hdGl2ZSAiVHlwZWREYXRhX1NldEludDMyIjsKCiAgaW50IF9nZXRVaW50MzIoaW50IG9mZnNldEluQnl0ZXMpIG5hdGl2ZSAiVHlwZWREYXRhX0dldFVpbnQzMiI7CiAgdm9pZCBfc2V0VWludDMyKGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgdmFsdWUpIG5hdGl2ZSAiVHlwZWREYXRhX1NldFVpbnQzMiI7CgogIGludCBfZ2V0SW50NjQoaW50IG9mZnNldEluQnl0ZXMpIG5hdGl2ZSAiVHlwZWREYXRhX0dldEludDY0IjsKICB2b2lkIF9zZXRJbnQ2NChpbnQgb2Zmc2V0SW5CeXRlcywgaW50IHZhbHVlKSBuYXRpdmUgIlR5cGVkRGF0YV9TZXRJbnQ2NCI7CgogIGludCBfZ2V0VWludDY0KGludCBvZmZzZXRJbkJ5dGVzKSBuYXRpdmUgIlR5cGVkRGF0YV9HZXRVaW50NjQiOwogIHZvaWQgX3NldFVpbnQ2NChpbnQgb2Zmc2V0SW5CeXRlcywgaW50IHZhbHVlKSBuYXRpdmUgIlR5cGVkRGF0YV9TZXRVaW50NjQiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX0RvdWJsZSIpCiAgZG91YmxlIF9nZXRGbG9hdDMyKGludCBvZmZzZXRJbkJ5dGVzKSBuYXRpdmUgIlR5cGVkRGF0YV9HZXRGbG9hdDMyIjsKICB2b2lkIF9zZXRGbG9hdDMyKGludCBvZmZzZXRJbkJ5dGVzLCBkb3VibGUgdmFsdWUpCiAgICAgIG5hdGl2ZSAiVHlwZWREYXRhX1NldEZsb2F0MzIiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX0RvdWJsZSIpCiAgZG91YmxlIF9nZXRGbG9hdDY0KGludCBvZmZzZXRJbkJ5dGVzKSBuYXRpdmUgIlR5cGVkRGF0YV9HZXRGbG9hdDY0IjsKICB2b2lkIF9zZXRGbG9hdDY0KGludCBvZmZzZXRJbkJ5dGVzLCBkb3VibGUgdmFsdWUpCiAgICAgIG5hdGl2ZSAiVHlwZWREYXRhX1NldEZsb2F0NjQiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyeDQpCiAgRmxvYXQzMng0IF9nZXRGbG9hdDMyeDQoaW50IG9mZnNldEluQnl0ZXMpIG5hdGl2ZSAiVHlwZWREYXRhX0dldEZsb2F0MzJ4NCI7CiAgdm9pZCBfc2V0RmxvYXQzMng0KGludCBvZmZzZXRJbkJ5dGVzLCBGbG9hdDMyeDQgdmFsdWUpCiAgICAgIG5hdGl2ZSAiVHlwZWREYXRhX1NldEZsb2F0MzJ4NCI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0ludDMyeDQpCiAgSW50MzJ4NCBfZ2V0SW50MzJ4NChpbnQgb2Zmc2V0SW5CeXRlcykgbmF0aXZlICJUeXBlZERhdGFfR2V0SW50MzJ4NCI7CiAgdm9pZCBfc2V0SW50MzJ4NChpbnQgb2Zmc2V0SW5CeXRlcywgSW50MzJ4NCB2YWx1ZSkKICAgICAgbmF0aXZlICJUeXBlZERhdGFfU2V0SW50MzJ4NCI7CgogIEZsb2F0NjR4MiBfZ2V0RmxvYXQ2NHgyKGludCBvZmZzZXRJbkJ5dGVzKSBuYXRpdmUgIlR5cGVkRGF0YV9HZXRGbG9hdDY0eDIiOwogIHZvaWQgX3NldEZsb2F0NjR4MihpbnQgb2Zmc2V0SW5CeXRlcywgRmxvYXQ2NHgyIHZhbHVlKQogICAgICBuYXRpdmUgIlR5cGVkRGF0YV9TZXRGbG9hdDY0eDIiOwoKICAvKioKICAgKiBTdG9yZXMgdGhlIFtDb2RlVW5pdHNdIGFzIFVURi0xNiB1bml0cyBpbnRvIHRoaXMgVHlwZWREYXRhIGF0CiAgICogcG9zaXRpb25zIFtzdGFydF0uLltlbmRdICh1aW50MTYgaW5kaWNlcykuCiAgICovCiAgdm9pZCBfc2V0Q29kZVVuaXRzKAogICAgICBDb2RlVW5pdHMgdW5pdHMsIGludCBieXRlU3RhcnQsIGludCBsZW5ndGgsIGludCBza2lwQ291bnQpIHsKICAgIGFzc2VydChieXRlU3RhcnQgKyBsZW5ndGggKiBVaW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudCA8PSBsZW5ndGhJbkJ5dGVzKTsKICAgIFN0cmluZyBzdHJpbmcgPSBDb2RlVW5pdHMuc3RyaW5nT2YodW5pdHMpOwogICAgaW50IHNsaWNlRW5kID0gc2tpcENvdW50ICsgbGVuZ3RoOwogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2UoCiAgICAgICAgc2tpcENvdW50LCBzbGljZUVuZCwgc3RyaW5nLmxlbmd0aCwgInNraXBDb3VudCIsICJza2lwQ291bnQgKyBsZW5ndGgiKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgX3NldFVpbnQxNihieXRlU3RhcnQgKyBpICogVWludDE2TGlzdC5ieXRlc1BlckVsZW1lbnQsCiAgICAgICAgICBzdHJpbmcuY29kZVVuaXRBdChza2lwQ291bnQgKyBpKSk7CiAgICB9CiAgfQp9CgpAcGF0Y2gKY2xhc3MgSW50OExpc3QgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0ludDhMaXN0KQogIGZhY3RvcnkgSW50OExpc3QoaW50IGxlbmd0aCkgbmF0aXZlICJUeXBlZERhdGFfSW50OEFycmF5X25ldyI7CgogIEBwYXRjaAogIGZhY3RvcnkgSW50OExpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IEludDhMaXN0KGVsZW1lbnRzLmxlbmd0aCkKICAgICAgLi5zZXRSYW5nZSgwLCBlbGVtZW50cy5sZW5ndGgsIGVsZW1lbnRzKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0ludDhMaXN0IGV4dGVuZHMgX1R5cGVkTGlzdCB3aXRoIF9JbnRMaXN0TWl4aW4gaW1wbGVtZW50cyBJbnQ4TGlzdCB7CiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBMaXN0IGludGVyZmFjZS4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbnQ4KGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW50OChpbmRleCwgX3RvSW50OCh2YWx1ZSkpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBJbnQ4TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgSW50OExpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBJbnQ4TGlzdChsZW5ndGgpOwogIH0KfQoKQHBhdGNoCmNsYXNzIFVpbnQ4TGlzdCB7CiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfVWludDhMaXN0KQogIGZhY3RvcnkgVWludDhMaXN0KGludCBsZW5ndGgpIG5hdGl2ZSAiVHlwZWREYXRhX1VpbnQ4QXJyYXlfbmV3IjsKCiAgQHBhdGNoCiAgZmFjdG9yeSBVaW50OExpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IFVpbnQ4TGlzdChlbGVtZW50cy5sZW5ndGgpCiAgICAgIC4uc2V0UmFuZ2UoMCwgZWxlbWVudHMubGVuZ3RoLCBlbGVtZW50cyk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9VaW50OExpc3QgZXh0ZW5kcyBfVHlwZWRMaXN0IHdpdGggX0ludExpc3RNaXhpbiBpbXBsZW1lbnRzIFVpbnQ4TGlzdCB7CiAgLy8gTWV0aG9kcyBpbXBsZW1lbnRpbmcgTGlzdCBpbnRlcmZhY2UuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0VWludDgoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRVaW50OChpbmRleCwgX3RvVWludDgodmFsdWUpKTsKICB9CgogIC8vIE1ldGhvZHMgaW1wbGVtZW50aW5nIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIFVpbnQ4TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgVWludDhMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgVWludDhMaXN0KGxlbmd0aCk7CiAgfQp9CgpAcGF0Y2gKY2xhc3MgVWludDhDbGFtcGVkTGlzdCB7CiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfVWludDhDbGFtcGVkTGlzdCkKICBmYWN0b3J5IFVpbnQ4Q2xhbXBlZExpc3QoaW50IGxlbmd0aCkgbmF0aXZlICJUeXBlZERhdGFfVWludDhDbGFtcGVkQXJyYXlfbmV3IjsKCiAgQHBhdGNoCiAgZmFjdG9yeSBVaW50OENsYW1wZWRMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cykgewogICAgcmV0dXJuIG5ldyBVaW50OENsYW1wZWRMaXN0KGVsZW1lbnRzLmxlbmd0aCkKICAgICAgLi5zZXRSYW5nZSgwLCBlbGVtZW50cy5sZW5ndGgsIGVsZW1lbnRzKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX1VpbnQ4Q2xhbXBlZExpc3QgZXh0ZW5kcyBfVHlwZWRMaXN0CiAgICB3aXRoIF9JbnRMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgVWludDhDbGFtcGVkTGlzdCB7CiAgLy8gTWV0aG9kcyBpbXBsZW1lbnRpbmcgTGlzdCBpbnRlcmZhY2UuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0VWludDgoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRVaW50OChpbmRleCwgX3RvQ2xhbXBlZFVpbnQ4KHZhbHVlKSk7CiAgfQoKICAvLyBNZXRob2RzIGltcGxlbWVudGluZyBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBVaW50OExpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIFVpbnQ4Q2xhbXBlZExpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBVaW50OENsYW1wZWRMaXN0KGxlbmd0aCk7CiAgfQp9CgpAcGF0Y2gKY2xhc3MgSW50MTZMaXN0IHsKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQxNkxpc3QpCiAgZmFjdG9yeSBJbnQxNkxpc3QoaW50IGxlbmd0aCkgbmF0aXZlICJUeXBlZERhdGFfSW50MTZBcnJheV9uZXciOwoKICBAcGF0Y2gKICBmYWN0b3J5IEludDE2TGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpIHsKICAgIHJldHVybiBuZXcgSW50MTZMaXN0KGVsZW1lbnRzLmxlbmd0aCkKICAgICAgLi5zZXRSYW5nZSgwLCBlbGVtZW50cy5sZW5ndGgsIGVsZW1lbnRzKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0ludDE2TGlzdCBleHRlbmRzIF9UeXBlZExpc3Qgd2l0aCBfSW50TGlzdE1peGluIGltcGxlbWVudHMgSW50MTZMaXN0IHsKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIExpc3QgaW50ZXJmYWNlLgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldEluZGV4ZWRJbnQxNihpbmRleCk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3NldEluZGV4ZWRJbnQxNihpbmRleCwgX3RvSW50MTYodmFsdWUpKTsKICB9CgogIHZvaWQgc2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZSBpdGVyYWJsZSwgW2ludCBza2lwQ291bnQgPSAwXSkgewogICAgaWYgKGl0ZXJhYmxlIGlzIENvZGVVbml0cykgewogICAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgICAgaW50IGJ5dGVTdGFydCA9IHRoaXMub2Zmc2V0SW5CeXRlcyArIHN0YXJ0ICogSW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICAgICAgX3NldENvZGVVbml0cyhpdGVyYWJsZSwgYnl0ZVN0YXJ0LCBsZW5ndGgsIHNraXBDb3VudCk7CiAgICB9IGVsc2UgewogICAgICBzdXBlci5zZXRSYW5nZShzdGFydCwgZW5kLCBpdGVyYWJsZSwgc2tpcENvdW50KTsKICAgIH0KICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gSW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBJbnQxNkxpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBJbnQxNkxpc3QobGVuZ3RoKTsKICB9CgogIGludCBfZ2V0SW5kZXhlZEludDE2KGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRJbnQxNihpbmRleCAqIEludDE2TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZEludDE2KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBfc2V0SW50MTYoaW5kZXggKiBJbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50LCB2YWx1ZSk7CiAgfQp9CgpAcGF0Y2gKY2xhc3MgVWludDE2TGlzdCB7CiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfVWludDE2TGlzdCkKICBmYWN0b3J5IFVpbnQxNkxpc3QoaW50IGxlbmd0aCkgbmF0aXZlICJUeXBlZERhdGFfVWludDE2QXJyYXlfbmV3IjsKCiAgQHBhdGNoCiAgZmFjdG9yeSBVaW50MTZMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cykgewogICAgcmV0dXJuIG5ldyBVaW50MTZMaXN0KGVsZW1lbnRzLmxlbmd0aCkKICAgICAgLi5zZXRSYW5nZSgwLCBlbGVtZW50cy5sZW5ndGgsIGVsZW1lbnRzKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX1VpbnQxNkxpc3QgZXh0ZW5kcyBfVHlwZWRMaXN0IHdpdGggX0ludExpc3RNaXhpbiBpbXBsZW1lbnRzIFVpbnQxNkxpc3QgewogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIExpc3QgaW50ZXJmYWNlLgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldEluZGV4ZWRVaW50MTYoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkVWludDE2KGluZGV4LCBfdG9VaW50MTYodmFsdWUpKTsKICB9CgogIHZvaWQgc2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZSBpdGVyYWJsZSwgW2ludCBza2lwQ291bnQgPSAwXSkgewogICAgaWYgKGl0ZXJhYmxlIGlzIENvZGVVbml0cykgewogICAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgICAgaW50IGJ5dGVTdGFydCA9IHRoaXMub2Zmc2V0SW5CeXRlcyArIHN0YXJ0ICogVWludDE2TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgICAgIF9zZXRDb2RlVW5pdHMoaXRlcmFibGUsIGJ5dGVTdGFydCwgbGVuZ3RoLCBza2lwQ291bnQpOwogICAgfSBlbHNlIHsKICAgICAgc3VwZXIuc2V0UmFuZ2Uoc3RhcnQsIGVuZCwgaXRlcmFibGUsIHNraXBDb3VudCk7CiAgICB9CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBVaW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBVaW50MTZMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgVWludDE2TGlzdChsZW5ndGgpOwogIH0KCiAgaW50IF9nZXRJbmRleGVkVWludDE2KGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRVaW50MTYoaW5kZXggKiBVaW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkVWludDE2KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBfc2V0VWludDE2KGluZGV4ICogVWludDE2TGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwYXRjaApjbGFzcyBJbnQzMkxpc3QgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0ludDMyTGlzdCkKICBmYWN0b3J5IEludDMyTGlzdChpbnQgbGVuZ3RoKSBuYXRpdmUgIlR5cGVkRGF0YV9JbnQzMkFycmF5X25ldyI7CgogIEBwYXRjaAogIGZhY3RvcnkgSW50MzJMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cykgewogICAgcmV0dXJuIG5ldyBJbnQzMkxpc3QoZWxlbWVudHMubGVuZ3RoKQogICAgICAuLnNldFJhbmdlKDAsIGVsZW1lbnRzLmxlbmd0aCwgZWxlbWVudHMpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfSW50MzJMaXN0IGV4dGVuZHMgX1R5cGVkTGlzdCB3aXRoIF9JbnRMaXN0TWl4aW4gaW1wbGVtZW50cyBJbnQzMkxpc3QgewogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIExpc3QgaW50ZXJmYWNlLgogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0SW5kZXhlZEludDMyKGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZEludDMyKGluZGV4LCBfdG9JbnQzMih2YWx1ZSkpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBJbnQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEludDMyTGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEludDMyTGlzdChsZW5ndGgpOwogIH0KCiAgaW50IF9nZXRJbmRleGVkSW50MzIoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2dldEludDMyKGluZGV4ICogSW50MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkSW50MzIoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIF9zZXRJbnQzMihpbmRleCAqIEludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwYXRjaApjbGFzcyBVaW50MzJMaXN0IHsKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9VaW50MzJMaXN0KQogIGZhY3RvcnkgVWludDMyTGlzdChpbnQgbGVuZ3RoKSBuYXRpdmUgIlR5cGVkRGF0YV9VaW50MzJBcnJheV9uZXciOwoKICBAcGF0Y2gKICBmYWN0b3J5IFVpbnQzMkxpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IFVpbnQzMkxpc3QoZWxlbWVudHMubGVuZ3RoKQogICAgICAuLnNldFJhbmdlKDAsIGVsZW1lbnRzLmxlbmd0aCwgZWxlbWVudHMpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfVWludDMyTGlzdCBleHRlbmRzIF9UeXBlZExpc3Qgd2l0aCBfSW50TGlzdE1peGluIGltcGxlbWVudHMgVWludDMyTGlzdCB7CiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkVWludDMyKGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZFVpbnQzMihpbmRleCwgX3RvVWludDMyKHZhbHVlKSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBVaW50MzJMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBVaW50MzJMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgVWludDMyTGlzdChsZW5ndGgpOwogIH0KCiAgaW50IF9nZXRJbmRleGVkVWludDMyKGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRVaW50MzIoaW5kZXggKiBVaW50MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkVWludDMyKGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBfc2V0VWludDMyKGluZGV4ICogVWludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwYXRjaApjbGFzcyBJbnQ2NExpc3QgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0ludDY0TGlzdCkKICBmYWN0b3J5IEludDY0TGlzdChpbnQgbGVuZ3RoKSBuYXRpdmUgIlR5cGVkRGF0YV9JbnQ2NEFycmF5X25ldyI7CgogIEBwYXRjaAogIGZhY3RvcnkgSW50NjRMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cykgewogICAgcmV0dXJuIG5ldyBJbnQ2NExpc3QoZWxlbWVudHMubGVuZ3RoKQogICAgICAuLnNldFJhbmdlKDAsIGVsZW1lbnRzLmxlbmd0aCwgZWxlbWVudHMpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfSW50NjRMaXN0IGV4dGVuZHMgX1R5cGVkTGlzdCB3aXRoIF9JbnRMaXN0TWl4aW4gaW1wbGVtZW50cyBJbnQ2NExpc3QgewogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIExpc3QgaW50ZXJmYWNlLgogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0SW5kZXhlZEludDY0KGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZEludDY0KGluZGV4LCB2YWx1ZSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBJbnQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEludDY0TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEludDY0TGlzdChsZW5ndGgpOwogIH0KCiAgaW50IF9nZXRJbmRleGVkSW50NjQoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2dldEludDY0KGluZGV4ICogSW50NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkSW50NjQoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIF9zZXRJbnQ2NChpbmRleCAqIEludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwYXRjaApjbGFzcyBVaW50NjRMaXN0IHsKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9VaW50NjRMaXN0KQogIGZhY3RvcnkgVWludDY0TGlzdChpbnQgbGVuZ3RoKSBuYXRpdmUgIlR5cGVkRGF0YV9VaW50NjRBcnJheV9uZXciOwoKICBAcGF0Y2gKICBmYWN0b3J5IFVpbnQ2NExpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IFVpbnQ2NExpc3QoZWxlbWVudHMubGVuZ3RoKQogICAgICAuLnNldFJhbmdlKDAsIGVsZW1lbnRzLmxlbmd0aCwgZWxlbWVudHMpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfVWludDY0TGlzdCBleHRlbmRzIF9UeXBlZExpc3Qgd2l0aCBfSW50TGlzdE1peGluIGltcGxlbWVudHMgVWludDY0TGlzdCB7CiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkVWludDY0KGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZFVpbnQ2NChpbmRleCwgdmFsdWUpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gVWludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgVWludDY0TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IFVpbnQ2NExpc3QobGVuZ3RoKTsKICB9CgogIGludCBfZ2V0SW5kZXhlZFVpbnQ2NChpbnQgaW5kZXgpIHsKICAgIHJldHVybiBfZ2V0VWludDY0KGluZGV4ICogVWludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZFVpbnQ2NChpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgX3NldFVpbnQ2NChpbmRleCAqIFVpbnQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50LCB2YWx1ZSk7CiAgfQp9CgpAcGF0Y2gKY2xhc3MgRmxvYXQzMkxpc3QgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJMaXN0KQogIGZhY3RvcnkgRmxvYXQzMkxpc3QoaW50IGxlbmd0aCkgbmF0aXZlICJUeXBlZERhdGFfRmxvYXQzMkFycmF5X25ldyI7CgogIEBwYXRjaAogIGZhY3RvcnkgRmxvYXQzMkxpc3QuZnJvbUxpc3QoTGlzdDxkb3VibGU+IGVsZW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IEZsb2F0MzJMaXN0KGVsZW1lbnRzLmxlbmd0aCkKICAgICAgLi5zZXRSYW5nZSgwLCBlbGVtZW50cy5sZW5ndGgsIGVsZW1lbnRzKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0Zsb2F0MzJMaXN0IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfRG91YmxlTGlzdE1peGluCiAgICBpbXBsZW1lbnRzIEZsb2F0MzJMaXN0IHsKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBMaXN0IGludGVyZmFjZS4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX0RvdWJsZSIpCiAgZG91YmxlIG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkRmxvYXQzMihpbmRleCk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3NldEluZGV4ZWRGbG9hdDMyKGluZGV4LCB2YWx1ZSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBGbG9hdDMyTGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgRmxvYXQzMkxpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBGbG9hdDMyTGlzdChsZW5ndGgpOwogIH0KCiAgZG91YmxlIF9nZXRJbmRleGVkRmxvYXQzMihpbnQgaW5kZXgpIHsKICAgIHJldHVybiBfZ2V0RmxvYXQzMihpbmRleCAqIEZsb2F0MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkRmxvYXQzMihpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSkgewogICAgX3NldEZsb2F0MzIoaW5kZXggKiBGbG9hdDMyTGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwYXRjaApjbGFzcyBGbG9hdDY0TGlzdCB7CiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQ2NExpc3QpCiAgZmFjdG9yeSBGbG9hdDY0TGlzdChpbnQgbGVuZ3RoKSBuYXRpdmUgIlR5cGVkRGF0YV9GbG9hdDY0QXJyYXlfbmV3IjsKCiAgQHBhdGNoCiAgZmFjdG9yeSBGbG9hdDY0TGlzdC5mcm9tTGlzdChMaXN0PGRvdWJsZT4gZWxlbWVudHMpIHsKICAgIHJldHVybiBuZXcgRmxvYXQ2NExpc3QoZWxlbWVudHMubGVuZ3RoKQogICAgICAuLnNldFJhbmdlKDAsIGVsZW1lbnRzLmxlbmd0aCwgZWxlbWVudHMpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfRmxvYXQ2NExpc3QgZXh0ZW5kcyBfVHlwZWRMaXN0CiAgICB3aXRoIF9Eb3VibGVMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgRmxvYXQ2NExpc3QgewogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIExpc3QgaW50ZXJmYWNlLgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfRG91YmxlIikKICBkb3VibGUgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldEluZGV4ZWRGbG9hdDY0KGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgZG91YmxlIHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZEZsb2F0NjQoaW5kZXgsIHZhbHVlKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIEZsb2F0NjRMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBGbG9hdDY0TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEZsb2F0NjRMaXN0KGxlbmd0aCk7CiAgfQoKICBkb3VibGUgX2dldEluZGV4ZWRGbG9hdDY0KGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRGbG9hdDY0KGluZGV4ICogRmxvYXQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICB9CgogIHZvaWQgX3NldEluZGV4ZWRGbG9hdDY0KGludCBpbmRleCwgZG91YmxlIHZhbHVlKSB7CiAgICBfc2V0RmxvYXQ2NChpbmRleCAqIEZsb2F0NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCwgdmFsdWUpOwogIH0KfQoKQHBhdGNoCmNsYXNzIEZsb2F0MzJ4NExpc3QgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NExpc3QpCiAgZmFjdG9yeSBGbG9hdDMyeDRMaXN0KGludCBsZW5ndGgpIG5hdGl2ZSAiVHlwZWREYXRhX0Zsb2F0MzJ4NEFycmF5X25ldyI7CgogIEBwYXRjaAogIGZhY3RvcnkgRmxvYXQzMng0TGlzdC5mcm9tTGlzdChMaXN0PEZsb2F0MzJ4ND4gZWxlbWVudHMpIHsKICAgIHJldHVybiBuZXcgRmxvYXQzMng0TGlzdChlbGVtZW50cy5sZW5ndGgpCiAgICAgIC4uc2V0UmFuZ2UoMCwgZWxlbWVudHMubGVuZ3RoLCBlbGVtZW50cyk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9GbG9hdDMyeDRMaXN0IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfRmxvYXQzMng0TGlzdE1peGluCiAgICBpbXBsZW1lbnRzIEZsb2F0MzJ4NExpc3QgewogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBGbG9hdDMyeDQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldEluZGV4ZWRGbG9hdDMyeDQoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBGbG9hdDMyeDQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkRmxvYXQzMng0KGluZGV4LCB2YWx1ZSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBGbG9hdDMyeDRMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBGbG9hdDMyeDRMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgRmxvYXQzMng0TGlzdChsZW5ndGgpOwogIH0KCiAgRmxvYXQzMng0IF9nZXRJbmRleGVkRmxvYXQzMng0KGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRGbG9hdDMyeDQoaW5kZXggKiBGbG9hdDMyeDRMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkRmxvYXQzMng0KGludCBpbmRleCwgRmxvYXQzMng0IHZhbHVlKSB7CiAgICBfc2V0RmxvYXQzMng0KGluZGV4ICogRmxvYXQzMng0TGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwYXRjaApjbGFzcyBJbnQzMng0TGlzdCB7CiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NExpc3QpCiAgZmFjdG9yeSBJbnQzMng0TGlzdChpbnQgbGVuZ3RoKSBuYXRpdmUgIlR5cGVkRGF0YV9JbnQzMng0QXJyYXlfbmV3IjsKCiAgQHBhdGNoCiAgZmFjdG9yeSBJbnQzMng0TGlzdC5mcm9tTGlzdChMaXN0PEludDMyeDQ+IGVsZW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IEludDMyeDRMaXN0KGVsZW1lbnRzLmxlbmd0aCkKICAgICAgLi5zZXRSYW5nZSgwLCBlbGVtZW50cy5sZW5ndGgsIGVsZW1lbnRzKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0ludDMyeDRMaXN0IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfSW50MzJ4NExpc3RNaXhpbgogICAgaW1wbGVtZW50cyBJbnQzMng0TGlzdCB7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NCkKICBJbnQzMng0IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkSW50MzJ4NChpbmRleCk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIEludDMyeDQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkSW50MzJ4NChpbmRleCwgdmFsdWUpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gSW50MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEludDMyeDRMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgSW50MzJ4NExpc3QobGVuZ3RoKTsKICB9CgogIEludDMyeDQgX2dldEluZGV4ZWRJbnQzMng0KGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRJbnQzMng0KGluZGV4ICogSW50MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICB9CgogIHZvaWQgX3NldEluZGV4ZWRJbnQzMng0KGludCBpbmRleCwgSW50MzJ4NCB2YWx1ZSkgewogICAgX3NldEludDMyeDQoaW5kZXggKiBJbnQzMng0TGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwYXRjaApjbGFzcyBGbG9hdDY0eDJMaXN0IHsKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDY0eDJMaXN0KQogIGZhY3RvcnkgRmxvYXQ2NHgyTGlzdChpbnQgbGVuZ3RoKSBuYXRpdmUgIlR5cGVkRGF0YV9GbG9hdDY0eDJBcnJheV9uZXciOwoKICBAcGF0Y2gKICBmYWN0b3J5IEZsb2F0NjR4Mkxpc3QuZnJvbUxpc3QoTGlzdDxGbG9hdDY0eDI+IGVsZW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IEZsb2F0NjR4Mkxpc3QoZWxlbWVudHMubGVuZ3RoKQogICAgICAuLnNldFJhbmdlKDAsIGVsZW1lbnRzLmxlbmd0aCwgZWxlbWVudHMpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfRmxvYXQ2NHgyTGlzdCBleHRlbmRzIF9UeXBlZExpc3QKICAgIHdpdGggX0Zsb2F0NjR4Mkxpc3RNaXhpbgogICAgaW1wbGVtZW50cyBGbG9hdDY0eDJMaXN0IHsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDY0eDIpCiAgRmxvYXQ2NHgyIG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkRmxvYXQ2NHgyKGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgRmxvYXQ2NHgyIHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZEZsb2F0NjR4MihpbmRleCwgdmFsdWUpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gRmxvYXQ2NHgyTGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgRmxvYXQ2NHgyTGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEZsb2F0NjR4Mkxpc3QobGVuZ3RoKTsKICB9CgogIEZsb2F0NjR4MiBfZ2V0SW5kZXhlZEZsb2F0NjR4MihpbnQgaW5kZXgpIHsKICAgIHJldHVybiBfZ2V0RmxvYXQ2NHgyKGluZGV4ICogRmxvYXQ2NHgyTGlzdC5ieXRlc1BlckVsZW1lbnQpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZEZsb2F0NjR4MihpbnQgaW5kZXgsIEZsb2F0NjR4MiB2YWx1ZSkgewogICAgX3NldEZsb2F0NjR4MihpbmRleCAqIEZsb2F0NjR4Mkxpc3QuYnl0ZXNQZXJFbGVtZW50LCB2YWx1ZSk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9FeHRlcm5hbEludDhBcnJheSBleHRlbmRzIF9UeXBlZExpc3QKICAgIHdpdGggX0ludExpc3RNaXhpbgogICAgaW1wbGVtZW50cyBJbnQ4TGlzdCB7CiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbnQ4KGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW50OChpbmRleCwgdmFsdWUpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gSW50OExpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEludDhMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgSW50OExpc3QobGVuZ3RoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0V4dGVybmFsVWludDhBcnJheSBleHRlbmRzIF9UeXBlZExpc3QKICAgIHdpdGggX0ludExpc3RNaXhpbgogICAgaW1wbGVtZW50cyBVaW50OExpc3QgewogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIExpc3QgaW50ZXJmYWNlLgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldFVpbnQ4KGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0VWludDgoaW5kZXgsIF90b1VpbnQ4KHZhbHVlKSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBVaW50OExpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIFVpbnQ4TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IFVpbnQ4TGlzdChsZW5ndGgpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfRXh0ZXJuYWxVaW50OENsYW1wZWRBcnJheSBleHRlbmRzIF9UeXBlZExpc3QKICAgIHdpdGggX0ludExpc3RNaXhpbgogICAgaW1wbGVtZW50cyBVaW50OENsYW1wZWRMaXN0IHsKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBMaXN0IGludGVyZmFjZS4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRVaW50OChpbmRleCk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3NldFVpbnQ4KGluZGV4LCBfdG9DbGFtcGVkVWludDgodmFsdWUpKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIFVpbnQ4TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgVWludDhDbGFtcGVkTGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IFVpbnQ4Q2xhbXBlZExpc3QobGVuZ3RoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0V4dGVybmFsSW50MTZBcnJheSBleHRlbmRzIF9UeXBlZExpc3QKICAgIHdpdGggX0ludExpc3RNaXhpbgogICAgaW1wbGVtZW50cyBJbnQxNkxpc3QgewogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIExpc3QgaW50ZXJmYWNlLgoKICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldEluZGV4ZWRJbnQxNihpbmRleCk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3NldEluZGV4ZWRJbnQxNihpbmRleCwgX3RvSW50MTYodmFsdWUpKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIEludDE2TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgSW50MTZMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgSW50MTZMaXN0KGxlbmd0aCk7CiAgfQoKICBpbnQgX2dldEluZGV4ZWRJbnQxNihpbnQgaW5kZXgpIHsKICAgIHJldHVybiBfZ2V0SW50MTYoaW5kZXggKiBJbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICB9CgogIHZvaWQgX3NldEluZGV4ZWRJbnQxNihpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgX3NldEludDE2KGluZGV4ICogSW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudCwgdmFsdWUpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfRXh0ZXJuYWxVaW50MTZBcnJheSBleHRlbmRzIF9UeXBlZExpc3QKICAgIHdpdGggX0ludExpc3RNaXhpbgogICAgaW1wbGVtZW50cyBVaW50MTZMaXN0IHsKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBMaXN0IGludGVyZmFjZS4KCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkVWludDE2KGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZFVpbnQxNihpbmRleCwgX3RvVWludDE2KHZhbHVlKSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBVaW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBVaW50MTZMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgVWludDE2TGlzdChsZW5ndGgpOwogIH0KCiAgaW50IF9nZXRJbmRleGVkVWludDE2KGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRVaW50MTYoaW5kZXggKiBVaW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkVWludDE2KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBfc2V0VWludDE2KGluZGV4ICogVWludDE2TGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0V4dGVybmFsSW50MzJBcnJheSBleHRlbmRzIF9UeXBlZExpc3QKICAgIHdpdGggX0ludExpc3RNaXhpbgogICAgaW1wbGVtZW50cyBJbnQzMkxpc3QgewogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIExpc3QgaW50ZXJmYWNlLgogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0SW5kZXhlZEludDMyKGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZEludDMyKGluZGV4LCBfdG9JbnQzMih2YWx1ZSkpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gSW50MzJMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBJbnQzMkxpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBJbnQzMkxpc3QobGVuZ3RoKTsKICB9CgogIGludCBfZ2V0SW5kZXhlZEludDMyKGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRJbnQzMihpbmRleCAqIEludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZEludDMyKGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBfc2V0SW50MzIoaW5kZXggKiBJbnQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50LCB2YWx1ZSk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9FeHRlcm5hbFVpbnQzMkFycmF5IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfSW50TGlzdE1peGluCiAgICBpbXBsZW1lbnRzIFVpbnQzMkxpc3QgewogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIExpc3QgaW50ZXJmYWNlLgoKICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldEluZGV4ZWRVaW50MzIoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkVWludDMyKGluZGV4LCBfdG9VaW50MzIodmFsdWUpKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIFVpbnQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIFVpbnQzMkxpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBVaW50MzJMaXN0KGxlbmd0aCk7CiAgfQoKICBpbnQgX2dldEluZGV4ZWRVaW50MzIoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2dldFVpbnQzMihpbmRleCAqIFVpbnQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICB9CgogIHZvaWQgX3NldEluZGV4ZWRVaW50MzIoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIF9zZXRVaW50MzIoaW5kZXggKiBVaW50MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCwgdmFsdWUpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfRXh0ZXJuYWxJbnQ2NEFycmF5IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfSW50TGlzdE1peGluCiAgICBpbXBsZW1lbnRzIEludDY0TGlzdCB7CiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCgogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0SW5kZXhlZEludDY0KGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZEludDY0KGluZGV4LCB2YWx1ZSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBJbnQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEludDY0TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEludDY0TGlzdChsZW5ndGgpOwogIH0KCiAgaW50IF9nZXRJbmRleGVkSW50NjQoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2dldEludDY0KGluZGV4ICogSW50NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkSW50NjQoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIF9zZXRJbnQ2NChpbmRleCAqIEludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0V4dGVybmFsVWludDY0QXJyYXkgZXh0ZW5kcyBfVHlwZWRMaXN0CiAgICB3aXRoIF9JbnRMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgVWludDY0TGlzdCB7CiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCgogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0SW5kZXhlZFVpbnQ2NChpbmRleCk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3NldEluZGV4ZWRVaW50NjQoaW5kZXgsIHZhbHVlKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIFVpbnQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIFVpbnQ2NExpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBVaW50NjRMaXN0KGxlbmd0aCk7CiAgfQoKICBpbnQgX2dldEluZGV4ZWRVaW50NjQoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2dldFVpbnQ2NChpbmRleCAqIFVpbnQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICB9CgogIHZvaWQgX3NldEluZGV4ZWRVaW50NjQoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIF9zZXRVaW50NjQoaW5kZXggKiBVaW50NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCwgdmFsdWUpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfRXh0ZXJuYWxGbG9hdDMyQXJyYXkgZXh0ZW5kcyBfVHlwZWRMaXN0CiAgICB3aXRoIF9Eb3VibGVMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgRmxvYXQzMkxpc3QgewogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIExpc3QgaW50ZXJmYWNlLgoKICBkb3VibGUgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldEluZGV4ZWRGbG9hdDMyKGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgZG91YmxlIHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZEZsb2F0MzIoaW5kZXgsIHZhbHVlKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIEZsb2F0MzJMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBGbG9hdDMyTGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEZsb2F0MzJMaXN0KGxlbmd0aCk7CiAgfQoKICBkb3VibGUgX2dldEluZGV4ZWRGbG9hdDMyKGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRGbG9hdDMyKGluZGV4ICogRmxvYXQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICB9CgogIHZvaWQgX3NldEluZGV4ZWRGbG9hdDMyKGludCBpbmRleCwgZG91YmxlIHZhbHVlKSB7CiAgICBfc2V0RmxvYXQzMihpbmRleCAqIEZsb2F0MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCwgdmFsdWUpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfRXh0ZXJuYWxGbG9hdDY0QXJyYXkgZXh0ZW5kcyBfVHlwZWRMaXN0CiAgICB3aXRoIF9Eb3VibGVMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgRmxvYXQ2NExpc3QgewogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIExpc3QgaW50ZXJmYWNlLgoKICBkb3VibGUgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldEluZGV4ZWRGbG9hdDY0KGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgZG91YmxlIHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZEZsb2F0NjQoaW5kZXgsIHZhbHVlKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIEZsb2F0NjRMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBGbG9hdDY0TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEZsb2F0NjRMaXN0KGxlbmd0aCk7CiAgfQoKICBkb3VibGUgX2dldEluZGV4ZWRGbG9hdDY0KGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRGbG9hdDY0KGluZGV4ICogRmxvYXQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICB9CgogIHZvaWQgX3NldEluZGV4ZWRGbG9hdDY0KGludCBpbmRleCwgZG91YmxlIHZhbHVlKSB7CiAgICBfc2V0RmxvYXQ2NChpbmRleCAqIEZsb2F0NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCwgdmFsdWUpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfRXh0ZXJuYWxGbG9hdDMyeDRBcnJheSBleHRlbmRzIF9UeXBlZExpc3QKICAgIHdpdGggX0Zsb2F0MzJ4NExpc3RNaXhpbgogICAgaW1wbGVtZW50cyBGbG9hdDMyeDRMaXN0IHsKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBMaXN0IGludGVyZmFjZS4KCiAgRmxvYXQzMng0IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkRmxvYXQzMng0KGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgRmxvYXQzMng0IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZEZsb2F0MzJ4NChpbmRleCwgdmFsdWUpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gRmxvYXQzMng0TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgRmxvYXQzMng0TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEZsb2F0MzJ4NExpc3QobGVuZ3RoKTsKICB9CgogIEZsb2F0MzJ4NCBfZ2V0SW5kZXhlZEZsb2F0MzJ4NChpbnQgaW5kZXgpIHsKICAgIHJldHVybiBfZ2V0RmxvYXQzMng0KGluZGV4ICogRmxvYXQzMng0TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZEZsb2F0MzJ4NChpbnQgaW5kZXgsIEZsb2F0MzJ4NCB2YWx1ZSkgewogICAgX3NldEZsb2F0MzJ4NChpbmRleCAqIEZsb2F0MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50LCB2YWx1ZSk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9FeHRlcm5hbEludDMyeDRBcnJheSBleHRlbmRzIF9UeXBlZExpc3QKICAgIHdpdGggX0ludDMyeDRMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgSW50MzJ4NExpc3QgewogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIExpc3QgaW50ZXJmYWNlLgoKICBJbnQzMng0IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkSW50MzJ4NChpbmRleCk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIEludDMyeDQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkSW50MzJ4NChpbmRleCwgdmFsdWUpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gSW50MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEludDMyeDRMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgSW50MzJ4NExpc3QobGVuZ3RoKTsKICB9CgogIEludDMyeDQgX2dldEluZGV4ZWRJbnQzMng0KGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRJbnQzMng0KGluZGV4ICogSW50MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICB9CgogIHZvaWQgX3NldEluZGV4ZWRJbnQzMng0KGludCBpbmRleCwgSW50MzJ4NCB2YWx1ZSkgewogICAgX3NldEludDMyeDQoaW5kZXggKiBJbnQzMng0TGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0V4dGVybmFsRmxvYXQ2NHgyQXJyYXkgZXh0ZW5kcyBfVHlwZWRMaXN0CiAgICB3aXRoIF9GbG9hdDY0eDJMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgRmxvYXQ2NHgyTGlzdCB7CiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCiAgRmxvYXQ2NHgyIG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkRmxvYXQ2NHgyKGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgRmxvYXQ2NHgyIHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZEZsb2F0NjR4MihpbmRleCwgdmFsdWUpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gRmxvYXQ2NHgyTGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgRmxvYXQ2NHgyTGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEZsb2F0NjR4Mkxpc3QobGVuZ3RoKTsKICB9CgogIEZsb2F0NjR4MiBfZ2V0SW5kZXhlZEZsb2F0NjR4MihpbnQgaW5kZXgpIHsKICAgIHJldHVybiBfZ2V0RmxvYXQ2NHgyKGluZGV4ICogRmxvYXQ2NHgyTGlzdC5ieXRlc1BlckVsZW1lbnQpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZEZsb2F0NjR4MihpbnQgaW5kZXgsIEZsb2F0NjR4MiB2YWx1ZSkgewogICAgX3NldEZsb2F0NjR4MihpbmRleCAqIEZsb2F0NjR4Mkxpc3QuYnl0ZXNQZXJFbGVtZW50LCB2YWx1ZSk7CiAgfQp9CgpAcGF0Y2gKY2xhc3MgRmxvYXQzMng0IHsKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyeDQpCiAgZmFjdG9yeSBGbG9hdDMyeDQoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeiwgZG91YmxlIHcpCiAgICAgIG5hdGl2ZSAiRmxvYXQzMng0X2Zyb21Eb3VibGVzIjsKCiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIGZhY3RvcnkgRmxvYXQzMng0LnNwbGF0KGRvdWJsZSB2KSBuYXRpdmUgIkZsb2F0MzJ4NF9zcGxhdCI7CgogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBmYWN0b3J5IEZsb2F0MzJ4NC56ZXJvKCkgbmF0aXZlICJGbG9hdDMyeDRfemVybyI7CgogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBmYWN0b3J5IEZsb2F0MzJ4NC5mcm9tSW50MzJ4NEJpdHMoSW50MzJ4NCB4KQogICAgICBuYXRpdmUgIkZsb2F0MzJ4NF9mcm9tSW50MzJ4NEJpdHMiOwoKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyeDQpCiAgZmFjdG9yeSBGbG9hdDMyeDQuZnJvbUZsb2F0NjR4MihGbG9hdDY0eDIgdikgbmF0aXZlICJGbG9hdDMyeDRfZnJvbUZsb2F0NjR4MiI7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0Zsb2F0MzJ4NCBpbXBsZW1lbnRzIEZsb2F0MzJ4NCB7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCBvcGVyYXRvciArKEZsb2F0MzJ4NCBvdGhlcikgbmF0aXZlICJGbG9hdDMyeDRfYWRkIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyeDQpCiAgRmxvYXQzMng0IG9wZXJhdG9yIC0oKSBuYXRpdmUgIkZsb2F0MzJ4NF9uZWdhdGUiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBGbG9hdDMyeDQgb3BlcmF0b3IgLShGbG9hdDMyeDQgb3RoZXIpIG5hdGl2ZSAiRmxvYXQzMng0X3N1YiI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCBvcGVyYXRvciAqKEZsb2F0MzJ4NCBvdGhlcikgbmF0aXZlICJGbG9hdDMyeDRfbXVsIjsKICBGbG9hdDMyeDQgb3BlcmF0b3IgLyhGbG9hdDMyeDQgb3RoZXIpIG5hdGl2ZSAiRmxvYXQzMng0X2RpdiI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NCkKICBJbnQzMng0IGxlc3NUaGFuKEZsb2F0MzJ4NCBvdGhlcikgbmF0aXZlICJGbG9hdDMyeDRfY21wbHQiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0ludDMyeDQpCiAgSW50MzJ4NCBsZXNzVGhhbk9yRXF1YWwoRmxvYXQzMng0IG90aGVyKSBuYXRpdmUgIkZsb2F0MzJ4NF9jbXBsdGUiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0ludDMyeDQpCiAgSW50MzJ4NCBncmVhdGVyVGhhbihGbG9hdDMyeDQgb3RoZXIpIG5hdGl2ZSAiRmxvYXQzMng0X2NtcGd0IjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQzMng0KQogIEludDMyeDQgZ3JlYXRlclRoYW5PckVxdWFsKEZsb2F0MzJ4NCBvdGhlcikgbmF0aXZlICJGbG9hdDMyeDRfY21wZ3RlIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQzMng0KQogIEludDMyeDQgZXF1YWwoRmxvYXQzMng0IG90aGVyKSBuYXRpdmUgIkZsb2F0MzJ4NF9jbXBlcXVhbCI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NCkKICBJbnQzMng0IG5vdEVxdWFsKEZsb2F0MzJ4NCBvdGhlcikgbmF0aXZlICJGbG9hdDMyeDRfY21wbmVxdWFsIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyeDQpCiAgRmxvYXQzMng0IHNjYWxlKGRvdWJsZSBzKSBuYXRpdmUgIkZsb2F0MzJ4NF9zY2FsZSI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCBhYnMoKSBuYXRpdmUgIkZsb2F0MzJ4NF9hYnMiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBGbG9hdDMyeDQgY2xhbXAoRmxvYXQzMng0IGxvd2VyTGltaXQsIEZsb2F0MzJ4NCB1cHBlckxpbWl0KQogICAgICBuYXRpdmUgIkZsb2F0MzJ4NF9jbGFtcCI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19Eb3VibGUiKQogIGRvdWJsZSBnZXQgeCBuYXRpdmUgIkZsb2F0MzJ4NF9nZXRYIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX0RvdWJsZSIpCiAgZG91YmxlIGdldCB5IG5hdGl2ZSAiRmxvYXQzMng0X2dldFkiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfRG91YmxlIikKICBkb3VibGUgZ2V0IHogbmF0aXZlICJGbG9hdDMyeDRfZ2V0WiI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19Eb3VibGUiKQogIGRvdWJsZSBnZXQgdyBuYXRpdmUgIkZsb2F0MzJ4NF9nZXRXIjsKICBpbnQgZ2V0IHNpZ25NYXNrIG5hdGl2ZSAiRmxvYXQzMng0X2dldFNpZ25NYXNrIjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCBzaHVmZmxlKGludCBtYXNrKSBuYXRpdmUgIkZsb2F0MzJ4NF9zaHVmZmxlIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyeDQpCiAgRmxvYXQzMng0IHNodWZmbGVNaXgoRmxvYXQzMng0IHp3LCBpbnQgbWFzaykgbmF0aXZlICJGbG9hdDMyeDRfc2h1ZmZsZU1peCI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBGbG9hdDMyeDQgd2l0aFgoZG91YmxlIHgpIG5hdGl2ZSAiRmxvYXQzMng0X3NldFgiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBGbG9hdDMyeDQgd2l0aFkoZG91YmxlIHkpIG5hdGl2ZSAiRmxvYXQzMng0X3NldFkiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBGbG9hdDMyeDQgd2l0aFooZG91YmxlIHopIG5hdGl2ZSAiRmxvYXQzMng0X3NldFoiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBGbG9hdDMyeDQgd2l0aFcoZG91YmxlIHcpIG5hdGl2ZSAiRmxvYXQzMng0X3NldFciOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBGbG9hdDMyeDQgbWluKEZsb2F0MzJ4NCBvdGhlcikgbmF0aXZlICJGbG9hdDMyeDRfbWluIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyeDQpCiAgRmxvYXQzMng0IG1heChGbG9hdDMyeDQgb3RoZXIpIG5hdGl2ZSAiRmxvYXQzMng0X21heCI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCBzcXJ0KCkgbmF0aXZlICJGbG9hdDMyeDRfc3FydCI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCByZWNpcHJvY2FsKCkgbmF0aXZlICJGbG9hdDMyeDRfcmVjaXByb2NhbCI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCByZWNpcHJvY2FsU3FydCgpIG5hdGl2ZSAiRmxvYXQzMng0X3JlY2lwcm9jYWxTcXJ0IjsKfQoKQHBhdGNoCmNsYXNzIEludDMyeDQgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0ludDMyeDQpCiAgZmFjdG9yeSBJbnQzMng0KGludCB4LCBpbnQgeSwgaW50IHosIGludCB3KSBuYXRpdmUgIkludDMyeDRfZnJvbUludHMiOwoKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQzMng0KQogIGZhY3RvcnkgSW50MzJ4NC5ib29sKGJvb2wgeCwgYm9vbCB5LCBib29sIHosIGJvb2wgdykKICAgICAgbmF0aXZlICJJbnQzMng0X2Zyb21Cb29scyI7CgogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0ludDMyeDQpCiAgZmFjdG9yeSBJbnQzMng0LmZyb21GbG9hdDMyeDRCaXRzKEZsb2F0MzJ4NCB4KQogICAgICBuYXRpdmUgIkludDMyeDRfZnJvbUZsb2F0MzJ4NEJpdHMiOwp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9JbnQzMng0IGltcGxlbWVudHMgSW50MzJ4NCB7CiAgSW50MzJ4NCBvcGVyYXRvciB8KEludDMyeDQgb3RoZXIpIG5hdGl2ZSAiSW50MzJ4NF9vciI7CiAgSW50MzJ4NCBvcGVyYXRvciAmKEludDMyeDQgb3RoZXIpIG5hdGl2ZSAiSW50MzJ4NF9hbmQiOwogIEludDMyeDQgb3BlcmF0b3IgXihJbnQzMng0IG90aGVyKSBuYXRpdmUgIkludDMyeDRfeG9yIjsKICBJbnQzMng0IG9wZXJhdG9yICsoSW50MzJ4NCBvdGhlcikgbmF0aXZlICJJbnQzMng0X2FkZCI7CiAgSW50MzJ4NCBvcGVyYXRvciAtKEludDMyeDQgb3RoZXIpIG5hdGl2ZSAiSW50MzJ4NF9zdWIiOwogIGludCBnZXQgeCBuYXRpdmUgIkludDMyeDRfZ2V0WCI7CiAgaW50IGdldCB5IG5hdGl2ZSAiSW50MzJ4NF9nZXRZIjsKICBpbnQgZ2V0IHogbmF0aXZlICJJbnQzMng0X2dldFoiOwogIGludCBnZXQgdyBuYXRpdmUgIkludDMyeDRfZ2V0VyI7CiAgaW50IGdldCBzaWduTWFzayBuYXRpdmUgIkludDMyeDRfZ2V0U2lnbk1hc2siOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0ludDMyeDQpCiAgSW50MzJ4NCBzaHVmZmxlKGludCBtYXNrKSBuYXRpdmUgIkludDMyeDRfc2h1ZmZsZSI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NCkKICBJbnQzMng0IHNodWZmbGVNaXgoSW50MzJ4NCB6dywgaW50IG1hc2spIG5hdGl2ZSAiSW50MzJ4NF9zaHVmZmxlTWl4IjsKICBJbnQzMng0IHdpdGhYKGludCB4KSBuYXRpdmUgIkludDMyeDRfc2V0WCI7CiAgSW50MzJ4NCB3aXRoWShpbnQgeSkgbmF0aXZlICJJbnQzMng0X3NldFkiOwogIEludDMyeDQgd2l0aFooaW50IHopIG5hdGl2ZSAiSW50MzJ4NF9zZXRaIjsKICBJbnQzMng0IHdpdGhXKGludCB3KSBuYXRpdmUgIkludDMyeDRfc2V0VyI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgZ2V0IGZsYWdYIG5hdGl2ZSAiSW50MzJ4NF9nZXRGbGFnWCI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgZ2V0IGZsYWdZIG5hdGl2ZSAiSW50MzJ4NF9nZXRGbGFnWSI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgZ2V0IGZsYWdaIG5hdGl2ZSAiSW50MzJ4NF9nZXRGbGFnWiI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgZ2V0IGZsYWdXIG5hdGl2ZSAiSW50MzJ4NF9nZXRGbGFnVyI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NCkKICBJbnQzMng0IHdpdGhGbGFnWChib29sIHgpIG5hdGl2ZSAiSW50MzJ4NF9zZXRGbGFnWCI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NCkKICBJbnQzMng0IHdpdGhGbGFnWShib29sIHkpIG5hdGl2ZSAiSW50MzJ4NF9zZXRGbGFnWSI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NCkKICBJbnQzMng0IHdpdGhGbGFnWihib29sIHopIG5hdGl2ZSAiSW50MzJ4NF9zZXRGbGFnWiI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NCkKICBJbnQzMng0IHdpdGhGbGFnVyhib29sIHcpIG5hdGl2ZSAiSW50MzJ4NF9zZXRGbGFnVyI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCBzZWxlY3QoRmxvYXQzMng0IHRydWVWYWx1ZSwgRmxvYXQzMng0IGZhbHNlVmFsdWUpCiAgICAgIG5hdGl2ZSAiSW50MzJ4NF9zZWxlY3QiOwp9CgpAcGF0Y2gKY2xhc3MgRmxvYXQ2NHgyIHsKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDY0eDIpCiAgZmFjdG9yeSBGbG9hdDY0eDIoZG91YmxlIHgsIGRvdWJsZSB5KSBuYXRpdmUgIkZsb2F0NjR4Ml9mcm9tRG91YmxlcyI7CgogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0NjR4MikKICBmYWN0b3J5IEZsb2F0NjR4Mi5zcGxhdChkb3VibGUgdikgbmF0aXZlICJGbG9hdDY0eDJfc3BsYXQiOwoKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDY0eDIpCiAgZmFjdG9yeSBGbG9hdDY0eDIuemVybygpIG5hdGl2ZSAiRmxvYXQ2NHgyX3plcm8iOwoKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDY0eDIpCiAgZmFjdG9yeSBGbG9hdDY0eDIuZnJvbUZsb2F0MzJ4NChGbG9hdDMyeDQgdikgbmF0aXZlICJGbG9hdDY0eDJfZnJvbUZsb2F0MzJ4NCI7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0Zsb2F0NjR4MiBpbXBsZW1lbnRzIEZsb2F0NjR4MiB7CiAgRmxvYXQ2NHgyIG9wZXJhdG9yICsoRmxvYXQ2NHgyIG90aGVyKSBuYXRpdmUgIkZsb2F0NjR4Ml9hZGQiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0NjR4MikKICBGbG9hdDY0eDIgb3BlcmF0b3IgLSgpIG5hdGl2ZSAiRmxvYXQ2NHgyX25lZ2F0ZSI7CiAgRmxvYXQ2NHgyIG9wZXJhdG9yIC0oRmxvYXQ2NHgyIG90aGVyKSBuYXRpdmUgIkZsb2F0NjR4Ml9zdWIiOwogIEZsb2F0NjR4MiBvcGVyYXRvciAqKEZsb2F0NjR4MiBvdGhlcikgbmF0aXZlICJGbG9hdDY0eDJfbXVsIjsKICBGbG9hdDY0eDIgb3BlcmF0b3IgLyhGbG9hdDY0eDIgb3RoZXIpIG5hdGl2ZSAiRmxvYXQ2NHgyX2RpdiI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQ2NHgyKQogIEZsb2F0NjR4MiBzY2FsZShkb3VibGUgcykgbmF0aXZlICJGbG9hdDY0eDJfc2NhbGUiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0NjR4MikKICBGbG9hdDY0eDIgYWJzKCkgbmF0aXZlICJGbG9hdDY0eDJfYWJzIjsKICBGbG9hdDY0eDIgY2xhbXAoRmxvYXQ2NHgyIGxvd2VyTGltaXQsIEZsb2F0NjR4MiB1cHBlckxpbWl0KQogICAgICBuYXRpdmUgIkZsb2F0NjR4Ml9jbGFtcCI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19Eb3VibGUiKQogIGRvdWJsZSBnZXQgeCBuYXRpdmUgIkZsb2F0NjR4Ml9nZXRYIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX0RvdWJsZSIpCiAgZG91YmxlIGdldCB5IG5hdGl2ZSAiRmxvYXQ2NHgyX2dldFkiOwogIGludCBnZXQgc2lnbk1hc2sgbmF0aXZlICJGbG9hdDY0eDJfZ2V0U2lnbk1hc2siOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0NjR4MikKICBGbG9hdDY0eDIgd2l0aFgoZG91YmxlIHgpIG5hdGl2ZSAiRmxvYXQ2NHgyX3NldFgiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0NjR4MikKICBGbG9hdDY0eDIgd2l0aFkoZG91YmxlIHkpIG5hdGl2ZSAiRmxvYXQ2NHgyX3NldFkiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0NjR4MikKICBGbG9hdDY0eDIgbWluKEZsb2F0NjR4MiBvdGhlcikgbmF0aXZlICJGbG9hdDY0eDJfbWluIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDY0eDIpCiAgRmxvYXQ2NHgyIG1heChGbG9hdDY0eDIgb3RoZXIpIG5hdGl2ZSAiRmxvYXQ2NHgyX21heCI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQ2NHgyKQogIEZsb2F0NjR4MiBzcXJ0KCkgbmF0aXZlICJGbG9hdDY0eDJfc3FydCI7Cn0KCmNsYXNzIF9UeXBlZExpc3RJdGVyYXRvcjxFPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKICBmaW5hbCBMaXN0PEU+IF9hcnJheTsKICBmaW5hbCBpbnQgX2xlbmd0aDsKICBpbnQgX3Bvc2l0aW9uOwogIEUgX2N1cnJlbnQ7CgogIF9UeXBlZExpc3RJdGVyYXRvcihMaXN0IGFycmF5KQogICAgICA6IF9hcnJheSA9IGFycmF5LAogICAgICAgIF9sZW5ndGggPSBhcnJheS5sZW5ndGgsCiAgICAgICAgX3Bvc2l0aW9uID0gLTEgewogICAgYXNzZXJ0KGFycmF5IGlzIF9UeXBlZExpc3QgfHwgYXJyYXkgaXMgX1R5cGVkTGlzdFZpZXcpOwogIH0KCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGludCBuZXh0UG9zaXRpb24gPSBfcG9zaXRpb24gKyAxOwogICAgaWYgKG5leHRQb3NpdGlvbiA8IF9sZW5ndGgpIHsKICAgICAgX2N1cnJlbnQgPSBfYXJyYXlbbmV4dFBvc2l0aW9uXTsKICAgICAgX3Bvc2l0aW9uID0gbmV4dFBvc2l0aW9uOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9wb3NpdGlvbiA9IF9sZW5ndGg7CiAgICBfY3VycmVudCA9IG51bGw7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBFIGdldCBjdXJyZW50ID0+IF9jdXJyZW50Owp9CgphYnN0cmFjdCBjbGFzcyBfVHlwZWRMaXN0VmlldyBleHRlbmRzIF9UeXBlZExpc3RCYXNlIGltcGxlbWVudHMgVHlwZWREYXRhIHsKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgoKICBpbnQgZ2V0IGxlbmd0aEluQnl0ZXMgewogICAgcmV0dXJuIGxlbmd0aCAqIGVsZW1lbnRTaXplSW5CeXRlczsKICB9CgogIF9CeXRlQnVmZmVyIGdldCBidWZmZXIgewogICAgcmV0dXJuIF90eXBlZERhdGEuYnVmZmVyOwogIH0KCiAgQHByYWdtYSgidm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBlIikKICBfVHlwZWRMaXN0IGdldCBfdHlwZWREYXRhIG5hdGl2ZSAiVHlwZWREYXRhVmlld190eXBlZERhdGEiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IGdldCBvZmZzZXRJbkJ5dGVzIG5hdGl2ZSAiVHlwZWREYXRhVmlld19vZmZzZXRJbkJ5dGVzIjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBnZXQgbGVuZ3RoIG5hdGl2ZSAiVHlwZWREYXRhVmlld19sZW5ndGgiOwp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9JbnQ4QXJyYXlWaWV3IGV4dGVuZHMgX1R5cGVkTGlzdFZpZXcKICAgIHdpdGggX0ludExpc3RNaXhpbgogICAgaW1wbGVtZW50cyBJbnQ4TGlzdCB7CiAgLy8gQ29uc3RydWN0b3IuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50OEFycmF5VmlldykKICBmYWN0b3J5IF9JbnQ4QXJyYXlWaWV3KF9UeXBlZExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0SW5CeXRlcywgaW50IGxlbmd0aCkKICAgICAgbmF0aXZlICJUeXBlZERhdGFWaWV3X0ludDhBcnJheVZpZXdfbmV3IjsKCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBMaXN0IGludGVyZmFjZS4KICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX3R5cGVkRGF0YQogICAgICAgIC5fZ2V0SW50OChvZmZzZXRJbkJ5dGVzICsgKGluZGV4ICogSW50OExpc3QuYnl0ZXNQZXJFbGVtZW50KSk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3R5cGVkRGF0YS5fc2V0SW50OCgKICAgICAgICBvZmZzZXRJbkJ5dGVzICsgKGluZGV4ICogSW50OExpc3QuYnl0ZXNQZXJFbGVtZW50KSwgX3RvSW50OCh2YWx1ZSkpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBJbnQ4TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgSW50OExpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBJbnQ4TGlzdChsZW5ndGgpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfVWludDhBcnJheVZpZXcgZXh0ZW5kcyBfVHlwZWRMaXN0VmlldwogICAgd2l0aCBfSW50TGlzdE1peGluCiAgICBpbXBsZW1lbnRzIFVpbnQ4TGlzdCB7CiAgLy8gQ29uc3RydWN0b3IuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfVWludDhBcnJheVZpZXcpCiAgZmFjdG9yeSBfVWludDhBcnJheVZpZXcoX1R5cGVkTGlzdCBidWZmZXIsIGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgbGVuZ3RoKQogICAgICBuYXRpdmUgIlR5cGVkRGF0YVZpZXdfVWludDhBcnJheVZpZXdfbmV3IjsKCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBMaXN0IGludGVyZmFjZS4KICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX3R5cGVkRGF0YQogICAgICAgIC5fZ2V0VWludDgob2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIFVpbnQ4TGlzdC5ieXRlc1BlckVsZW1lbnQpKTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfdHlwZWREYXRhLl9zZXRVaW50OCgKICAgICAgICBvZmZzZXRJbkJ5dGVzICsgKGluZGV4ICogVWludDhMaXN0LmJ5dGVzUGVyRWxlbWVudCksIF90b1VpbnQ4KHZhbHVlKSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIFVpbnQ4TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgVWludDhMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgVWludDhMaXN0KGxlbmd0aCk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9VaW50OENsYW1wZWRBcnJheVZpZXcgZXh0ZW5kcyBfVHlwZWRMaXN0VmlldwogICAgd2l0aCBfSW50TGlzdE1peGluCiAgICBpbXBsZW1lbnRzIFVpbnQ4Q2xhbXBlZExpc3QgewogIC8vIENvbnN0cnVjdG9yLgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX1VpbnQ4Q2xhbXBlZEFycmF5VmlldykKICBmYWN0b3J5IF9VaW50OENsYW1wZWRBcnJheVZpZXcoX1R5cGVkTGlzdCBidWZmZXIsIGludCBvZmZzZXRJbkJ5dGVzLAogICAgICBpbnQgbGVuZ3RoKSBuYXRpdmUgIlR5cGVkRGF0YVZpZXdfVWludDhDbGFtcGVkQXJyYXlWaWV3X25ldyI7CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgTGlzdCBpbnRlcmZhY2UuCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF90eXBlZERhdGEKICAgICAgICAuX2dldFVpbnQ4KG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBVaW50OExpc3QuYnl0ZXNQZXJFbGVtZW50KSk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3R5cGVkRGF0YS5fc2V0VWludDgob2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIFVpbnQ4TGlzdC5ieXRlc1BlckVsZW1lbnQpLAogICAgICAgIF90b0NsYW1wZWRVaW50OCh2YWx1ZSkpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBVaW50OExpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIFVpbnQ4Q2xhbXBlZExpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBVaW50OENsYW1wZWRMaXN0KGxlbmd0aCk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9JbnQxNkFycmF5VmlldyBleHRlbmRzIF9UeXBlZExpc3RWaWV3CiAgICB3aXRoIF9JbnRMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgSW50MTZMaXN0IHsKICAvLyBDb25zdHJ1Y3Rvci4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQxNkFycmF5VmlldykKICBmYWN0b3J5IF9JbnQxNkFycmF5VmlldyhfVHlwZWRMaXN0IGJ1ZmZlciwgaW50IG9mZnNldEluQnl0ZXMsIGludCBsZW5ndGgpCiAgICAgIG5hdGl2ZSAiVHlwZWREYXRhVmlld19JbnQxNkFycmF5Vmlld19uZXciOwoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIExpc3QgaW50ZXJmYWNlLgogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfdHlwZWREYXRhCiAgICAgICAgLl9nZXRJbnQxNihvZmZzZXRJbkJ5dGVzICsgKGluZGV4ICogSW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudCkpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF90eXBlZERhdGEuX3NldEludDE2KAogICAgICAgIG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBJbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50KSwgX3RvSW50MTYodmFsdWUpKTsKICB9CgogIHZvaWQgc2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZSBpdGVyYWJsZSwgW2ludCBza2lwQ291bnQgPSAwXSkgewogICAgaWYgKGl0ZXJhYmxlIGlzIENvZGVVbml0cykgewogICAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgICAgaW50IGJ5dGVTdGFydCA9IHRoaXMub2Zmc2V0SW5CeXRlcyArIHN0YXJ0ICogSW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICAgICAgX3R5cGVkRGF0YS5fc2V0Q29kZVVuaXRzKGl0ZXJhYmxlLCBieXRlU3RhcnQsIGxlbmd0aCwgc2tpcENvdW50KTsKICAgIH0gZWxzZSB7CiAgICAgIHN1cGVyLnNldFJhbmdlKHN0YXJ0LCBlbmQsIGl0ZXJhYmxlLCBza2lwQ291bnQpOwogICAgfQogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBUeXBlZERhdGEgaW50ZXJmYWNlLgoKICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gSW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBJbnQxNkxpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBJbnQxNkxpc3QobGVuZ3RoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX1VpbnQxNkFycmF5VmlldyBleHRlbmRzIF9UeXBlZExpc3RWaWV3CiAgICB3aXRoIF9JbnRMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgVWludDE2TGlzdCB7CiAgLy8gQ29uc3RydWN0b3IuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfVWludDE2QXJyYXlWaWV3KQogIGZhY3RvcnkgX1VpbnQxNkFycmF5VmlldyhfVHlwZWRMaXN0IGJ1ZmZlciwgaW50IG9mZnNldEluQnl0ZXMsIGludCBsZW5ndGgpCiAgICAgIG5hdGl2ZSAiVHlwZWREYXRhVmlld19VaW50MTZBcnJheVZpZXdfbmV3IjsKCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBMaXN0IGludGVyZmFjZS4KICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX3R5cGVkRGF0YQogICAgICAgIC5fZ2V0VWludDE2KG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBVaW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudCkpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF90eXBlZERhdGEuX3NldFVpbnQxNigKICAgICAgICBvZmZzZXRJbkJ5dGVzICsgKGluZGV4ICogVWludDE2TGlzdC5ieXRlc1BlckVsZW1lbnQpLCBfdG9VaW50MTYodmFsdWUpKTsKICB9CgogIHZvaWQgc2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZSBpdGVyYWJsZSwgW2ludCBza2lwQ291bnQgPSAwXSkgewogICAgaWYgKGl0ZXJhYmxlIGlzIENvZGVVbml0cykgewogICAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgICAgaW50IGJ5dGVTdGFydCA9IHRoaXMub2Zmc2V0SW5CeXRlcyArIHN0YXJ0ICogVWludDE2TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgICAgIF90eXBlZERhdGEuX3NldENvZGVVbml0cyhpdGVyYWJsZSwgYnl0ZVN0YXJ0LCBsZW5ndGgsIHNraXBDb3VudCk7CiAgICB9IGVsc2UgewogICAgICBzdXBlci5zZXRSYW5nZShzdGFydCwgZW5kLCBpdGVyYWJsZSwgc2tpcENvdW50KTsKICAgIH0KICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgVHlwZWREYXRhIGludGVyZmFjZS4KCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIFVpbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgoKICBVaW50MTZMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgVWludDE2TGlzdChsZW5ndGgpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfSW50MzJBcnJheVZpZXcgZXh0ZW5kcyBfVHlwZWRMaXN0VmlldwogICAgd2l0aCBfSW50TGlzdE1peGluCiAgICBpbXBsZW1lbnRzIEludDMyTGlzdCB7CiAgLy8gQ29uc3RydWN0b3IuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJBcnJheVZpZXcpCiAgZmFjdG9yeSBfSW50MzJBcnJheVZpZXcoX1R5cGVkTGlzdCBidWZmZXIsIGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgbGVuZ3RoKQogICAgICBuYXRpdmUgIlR5cGVkRGF0YVZpZXdfSW50MzJBcnJheVZpZXdfbmV3IjsKCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBMaXN0IGludGVyZmFjZS4KICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX3R5cGVkRGF0YQogICAgICAgIC5fZ2V0SW50MzIob2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIEludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQpKTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfdHlwZWREYXRhLl9zZXRJbnQzMigKICAgICAgICBvZmZzZXRJbkJ5dGVzICsgKGluZGV4ICogSW50MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCksIF90b0ludDMyKHZhbHVlKSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIEludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgSW50MzJMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgSW50MzJMaXN0KGxlbmd0aCk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9VaW50MzJBcnJheVZpZXcgZXh0ZW5kcyBfVHlwZWRMaXN0VmlldwogICAgd2l0aCBfSW50TGlzdE1peGluCiAgICBpbXBsZW1lbnRzIFVpbnQzMkxpc3QgewogIC8vIENvbnN0cnVjdG9yLgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX1VpbnQzMkFycmF5VmlldykKICBmYWN0b3J5IF9VaW50MzJBcnJheVZpZXcoX1R5cGVkTGlzdCBidWZmZXIsIGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgbGVuZ3RoKQogICAgICBuYXRpdmUgIlR5cGVkRGF0YVZpZXdfVWludDMyQXJyYXlWaWV3X25ldyI7CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgTGlzdCBpbnRlcmZhY2UuCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF90eXBlZERhdGEKICAgICAgICAuX2dldFVpbnQzMihvZmZzZXRJbkJ5dGVzICsgKGluZGV4ICogVWludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQpKTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfdHlwZWREYXRhLl9zZXRVaW50MzIoCiAgICAgICAgb2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIFVpbnQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50KSwgX3RvVWludDMyKHZhbHVlKSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIFVpbnQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIFVpbnQzMkxpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBVaW50MzJMaXN0KGxlbmd0aCk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9JbnQ2NEFycmF5VmlldyBleHRlbmRzIF9UeXBlZExpc3RWaWV3CiAgICB3aXRoIF9JbnRMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgSW50NjRMaXN0IHsKICAvLyBDb25zdHJ1Y3Rvci4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQ2NEFycmF5VmlldykKICBmYWN0b3J5IF9JbnQ2NEFycmF5VmlldyhfVHlwZWRMaXN0IGJ1ZmZlciwgaW50IG9mZnNldEluQnl0ZXMsIGludCBsZW5ndGgpCiAgICAgIG5hdGl2ZSAiVHlwZWREYXRhVmlld19JbnQ2NEFycmF5Vmlld19uZXciOwoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIExpc3QgaW50ZXJmYWNlLgogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfdHlwZWREYXRhCiAgICAgICAgLl9nZXRJbnQ2NChvZmZzZXRJbkJ5dGVzICsgKGluZGV4ICogSW50NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCkpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF90eXBlZERhdGEuX3NldEludDY0KAogICAgICAgIG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBJbnQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50KSwgdmFsdWUpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBJbnQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEludDY0TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEludDY0TGlzdChsZW5ndGgpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfVWludDY0QXJyYXlWaWV3IGV4dGVuZHMgX1R5cGVkTGlzdFZpZXcKICAgIHdpdGggX0ludExpc3RNaXhpbgogICAgaW1wbGVtZW50cyBVaW50NjRMaXN0IHsKICAvLyBDb25zdHJ1Y3Rvci4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9VaW50NjRBcnJheVZpZXcpCiAgZmFjdG9yeSBfVWludDY0QXJyYXlWaWV3KF9UeXBlZExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0SW5CeXRlcywgaW50IGxlbmd0aCkKICAgICAgbmF0aXZlICJUeXBlZERhdGFWaWV3X1VpbnQ2NEFycmF5Vmlld19uZXciOwoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIExpc3QgaW50ZXJmYWNlLgogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfdHlwZWREYXRhCiAgICAgICAgLl9nZXRVaW50NjQob2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIFVpbnQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50KSk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3R5cGVkRGF0YS5fc2V0VWludDY0KAogICAgICAgIG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBVaW50NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCksIHZhbHVlKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gVWludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgVWludDY0TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IFVpbnQ2NExpc3QobGVuZ3RoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0Zsb2F0MzJBcnJheVZpZXcgZXh0ZW5kcyBfVHlwZWRMaXN0VmlldwogICAgd2l0aCBfRG91YmxlTGlzdE1peGluCiAgICBpbXBsZW1lbnRzIEZsb2F0MzJMaXN0IHsKICAvLyBDb25zdHJ1Y3Rvci4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyQXJyYXlWaWV3KQogIGZhY3RvcnkgX0Zsb2F0MzJBcnJheVZpZXcoX1R5cGVkTGlzdCBidWZmZXIsIGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgbGVuZ3RoKQogICAgICBuYXRpdmUgIlR5cGVkRGF0YVZpZXdfRmxvYXQzMkFycmF5Vmlld19uZXciOwoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIExpc3QgaW50ZXJmYWNlLgogIGRvdWJsZSBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfdHlwZWREYXRhCiAgICAgICAgLl9nZXRGbG9hdDMyKG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBGbG9hdDMyTGlzdC5ieXRlc1BlckVsZW1lbnQpKTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgZG91YmxlIHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfdHlwZWREYXRhLl9zZXRGbG9hdDMyKAogICAgICAgIG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBGbG9hdDMyTGlzdC5ieXRlc1BlckVsZW1lbnQpLCB2YWx1ZSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIEZsb2F0MzJMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBGbG9hdDMyTGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEZsb2F0MzJMaXN0KGxlbmd0aCk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9GbG9hdDY0QXJyYXlWaWV3IGV4dGVuZHMgX1R5cGVkTGlzdFZpZXcKICAgIHdpdGggX0RvdWJsZUxpc3RNaXhpbgogICAgaW1wbGVtZW50cyBGbG9hdDY0TGlzdCB7CiAgLy8gQ29uc3RydWN0b3IuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQ2NEFycmF5VmlldykKICBmYWN0b3J5IF9GbG9hdDY0QXJyYXlWaWV3KF9UeXBlZExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0SW5CeXRlcywgaW50IGxlbmd0aCkKICAgICAgbmF0aXZlICJUeXBlZERhdGFWaWV3X0Zsb2F0NjRBcnJheVZpZXdfbmV3IjsKCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBMaXN0IGludGVyZmFjZS4KICBkb3VibGUgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX3R5cGVkRGF0YQogICAgICAgIC5fZ2V0RmxvYXQ2NChvZmZzZXRJbkJ5dGVzICsgKGluZGV4ICogRmxvYXQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50KSk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3R5cGVkRGF0YS5fc2V0RmxvYXQ2NCgKICAgICAgICBvZmZzZXRJbkJ5dGVzICsgKGluZGV4ICogRmxvYXQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50KSwgdmFsdWUpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBGbG9hdDY0TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgRmxvYXQ2NExpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBGbG9hdDY0TGlzdChsZW5ndGgpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfRmxvYXQzMng0QXJyYXlWaWV3IGV4dGVuZHMgX1R5cGVkTGlzdFZpZXcKICAgIHdpdGggX0Zsb2F0MzJ4NExpc3RNaXhpbgogICAgaW1wbGVtZW50cyBGbG9hdDMyeDRMaXN0IHsKICAvLyBDb25zdHJ1Y3Rvci4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyeDRBcnJheVZpZXcpCiAgZmFjdG9yeSBfRmxvYXQzMng0QXJyYXlWaWV3KF9UeXBlZExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0SW5CeXRlcywgaW50IGxlbmd0aCkKICAgICAgbmF0aXZlICJUeXBlZERhdGFWaWV3X0Zsb2F0MzJ4NEFycmF5Vmlld19uZXciOwoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIExpc3QgaW50ZXJmYWNlLgogIEZsb2F0MzJ4NCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfdHlwZWREYXRhCiAgICAgICAgLl9nZXRGbG9hdDMyeDQob2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIEZsb2F0MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50KSk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIEZsb2F0MzJ4NCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3R5cGVkRGF0YS5fc2V0RmxvYXQzMng0KAogICAgICAgIG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBGbG9hdDMyeDRMaXN0LmJ5dGVzUGVyRWxlbWVudCksIHZhbHVlKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gRmxvYXQzMng0TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgRmxvYXQzMng0TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEZsb2F0MzJ4NExpc3QobGVuZ3RoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0ludDMyeDRBcnJheVZpZXcgZXh0ZW5kcyBfVHlwZWRMaXN0VmlldwogICAgd2l0aCBfSW50MzJ4NExpc3RNaXhpbgogICAgaW1wbGVtZW50cyBJbnQzMng0TGlzdCB7CiAgLy8gQ29uc3RydWN0b3IuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NEFycmF5VmlldykKICBmYWN0b3J5IF9JbnQzMng0QXJyYXlWaWV3KF9UeXBlZExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0SW5CeXRlcywgaW50IGxlbmd0aCkKICAgICAgbmF0aXZlICJUeXBlZERhdGFWaWV3X0ludDMyeDRBcnJheVZpZXdfbmV3IjsKCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBMaXN0IGludGVyZmFjZS4KICBJbnQzMng0IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF90eXBlZERhdGEKICAgICAgICAuX2dldEludDMyeDQob2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIEludDMyeDRMaXN0LmJ5dGVzUGVyRWxlbWVudCkpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBJbnQzMng0IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfdHlwZWREYXRhLl9zZXRJbnQzMng0KAogICAgICAgIG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBJbnQzMng0TGlzdC5ieXRlc1BlckVsZW1lbnQpLCB2YWx1ZSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIEludDMyeDRMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBJbnQzMng0TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEludDMyeDRMaXN0KGxlbmd0aCk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9GbG9hdDY0eDJBcnJheVZpZXcgZXh0ZW5kcyBfVHlwZWRMaXN0VmlldwogICAgd2l0aCBfRmxvYXQ2NHgyTGlzdE1peGluCiAgICBpbXBsZW1lbnRzIEZsb2F0NjR4Mkxpc3QgewogIC8vIENvbnN0cnVjdG9yLgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0NjR4MkFycmF5VmlldykKICBmYWN0b3J5IF9GbG9hdDY0eDJBcnJheVZpZXcoX1R5cGVkTGlzdCBidWZmZXIsIGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgbGVuZ3RoKQogICAgICBuYXRpdmUgIlR5cGVkRGF0YVZpZXdfRmxvYXQ2NHgyQXJyYXlWaWV3X25ldyI7CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgTGlzdCBpbnRlcmZhY2UuCiAgRmxvYXQ2NHgyIG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF90eXBlZERhdGEKICAgICAgICAuX2dldEZsb2F0NjR4MihvZmZzZXRJbkJ5dGVzICsgKGluZGV4ICogRmxvYXQ2NHgyTGlzdC5ieXRlc1BlckVsZW1lbnQpKTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgRmxvYXQ2NHgyIHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfdHlwZWREYXRhLl9zZXRGbG9hdDY0eDIoCiAgICAgICAgb2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIEZsb2F0NjR4Mkxpc3QuYnl0ZXNQZXJFbGVtZW50KSwgdmFsdWUpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBGbG9hdDY0eDJMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBGbG9hdDY0eDJMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgRmxvYXQ2NHgyTGlzdChsZW5ndGgpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfQnl0ZURhdGFWaWV3IGltcGxlbWVudHMgQnl0ZURhdGEgewogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0J5dGVEYXRhVmlldykKICBmYWN0b3J5IF9CeXRlRGF0YVZpZXcoX1R5cGVkTGlzdCBidWZmZXIsIGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgbGVuZ3RoKQogICAgICBuYXRpdmUgIlR5cGVkRGF0YVZpZXdfQnl0ZURhdGFWaWV3X25ldyI7CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgVHlwZWREYXRhIGludGVyZmFjZS4KICBfQnl0ZUJ1ZmZlciBnZXQgYnVmZmVyIHsKICAgIHJldHVybiBfdHlwZWREYXRhLmJ1ZmZlcjsKICB9CgogIGludCBnZXQgbGVuZ3RoSW5CeXRlcyB7CiAgICByZXR1cm4gbGVuZ3RoOwogIH0KCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIDE7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIEJ5dGVEYXRhIGludGVyZmFjZS4KCiAgaW50IGdldEludDgoaW50IGJ5dGVPZmZzZXQpIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChieXRlT2Zmc2V0LCB0aGlzLCAiYnl0ZU9mZnNldCIpOwogICAgfQogICAgcmV0dXJuIF90eXBlZERhdGEuX2dldEludDgob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQpOwogIH0KCiAgdm9pZCBzZXRJbnQ4KGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUpIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChieXRlT2Zmc2V0LCB0aGlzLCAiYnl0ZU9mZnNldCIpOwogICAgfQogICAgX3R5cGVkRGF0YS5fc2V0SW50OChvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCwgdmFsdWUpOwogIH0KCiAgaW50IGdldFVpbnQ4KGludCBieXRlT2Zmc2V0KSB7CiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYnl0ZU9mZnNldCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoYnl0ZU9mZnNldCwgdGhpcywgImJ5dGVPZmZzZXQiKTsKICAgIH0KICAgIHJldHVybiBfdHlwZWREYXRhLl9nZXRVaW50OChvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCk7CiAgfQoKICB2b2lkIHNldFVpbnQ4KGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUpIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChieXRlT2Zmc2V0LCB0aGlzLCAiYnl0ZU9mZnNldCIpOwogICAgfQogICAgX3R5cGVkRGF0YS5fc2V0VWludDgob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQsIHZhbHVlKTsKICB9CgogIGludCBnZXRJbnQxNihpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgewogICAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGJ5dGVPZmZzZXQgKyAxID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShieXRlT2Zmc2V0LCAwLCBsZW5ndGggLSAyLCAiYnl0ZU9mZnNldCIpOwogICAgfQogICAgdmFyIHJlc3VsdCA9IF90eXBlZERhdGEuX2dldEludDE2KG9mZnNldEluQnl0ZXMgKyBieXRlT2Zmc2V0KTsKICAgIGlmIChpZGVudGljYWwoZW5kaWFuLCBFbmRpYW4uaG9zdCkpIHsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIHJldHVybiBfYnl0ZVN3YXAxNihyZXN1bHQpLnRvU2lnbmVkKDE2KTsKICB9CgogIHZvaWQgc2V0SW50MTYoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgewogICAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGJ5dGVPZmZzZXQgKyAxID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShieXRlT2Zmc2V0LCAwLCBsZW5ndGggLSAyLCAiYnl0ZU9mZnNldCIpOwogICAgfQogICAgX3R5cGVkRGF0YS5fc2V0SW50MTYob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQsCiAgICAgICAgaWRlbnRpY2FsKGVuZGlhbiwgRW5kaWFuLmhvc3QpID8gdmFsdWUgOiBfYnl0ZVN3YXAxNih2YWx1ZSkpOwogIH0KCiAgaW50IGdldFVpbnQxNihpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgewogICAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGJ5dGVPZmZzZXQgKyAxID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShieXRlT2Zmc2V0LCAwLCBsZW5ndGggLSAyLCAiYnl0ZU9mZnNldCIpOwogICAgfQogICAgdmFyIHJlc3VsdCA9IF90eXBlZERhdGEuX2dldFVpbnQxNihvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCk7CiAgICBpZiAoaWRlbnRpY2FsKGVuZGlhbiwgRW5kaWFuLmhvc3QpKSB7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gX2J5dGVTd2FwMTYocmVzdWx0KTsKICB9CgogIHZvaWQgc2V0VWludDE2KGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ICsgMSA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoYnl0ZU9mZnNldCwgMCwgbGVuZ3RoIC0gMiwgImJ5dGVPZmZzZXQiKTsKICAgIH0KICAgIF90eXBlZERhdGEuX3NldFVpbnQxNihvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCwKICAgICAgICBpZGVudGljYWwoZW5kaWFuLCBFbmRpYW4uaG9zdCkgPyB2YWx1ZSA6IF9ieXRlU3dhcDE2KHZhbHVlKSk7CiAgfQoKICBpbnQgZ2V0SW50MzIoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ICsgMyA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoYnl0ZU9mZnNldCwgMCwgbGVuZ3RoIC0gNCwgImJ5dGVPZmZzZXQiKTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBfdHlwZWREYXRhLl9nZXRJbnQzMihvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCk7CiAgICBpZiAoaWRlbnRpY2FsKGVuZGlhbiwgRW5kaWFuLmhvc3QpKSB7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gX2J5dGVTd2FwMzIocmVzdWx0KS50b1NpZ25lZCgzMik7CiAgfQoKICB2b2lkIHNldEludDMyKGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ICsgMyA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoYnl0ZU9mZnNldCwgMCwgbGVuZ3RoIC0gNCwgImJ5dGVPZmZzZXQiKTsKICAgIH0KICAgIF90eXBlZERhdGEuX3NldEludDMyKG9mZnNldEluQnl0ZXMgKyBieXRlT2Zmc2V0LAogICAgICAgIGlkZW50aWNhbChlbmRpYW4sIEVuZGlhbi5ob3N0KSA/IHZhbHVlIDogX2J5dGVTd2FwMzIodmFsdWUpKTsKICB9CgogIGludCBnZXRVaW50MzIoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ICsgMyA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoYnl0ZU9mZnNldCwgMCwgbGVuZ3RoIC0gNCwgImJ5dGVPZmZzZXQiKTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBfdHlwZWREYXRhLl9nZXRVaW50MzIob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQpOwogICAgaWYgKGlkZW50aWNhbChlbmRpYW4sIEVuZGlhbi5ob3N0KSkgewogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIF9ieXRlU3dhcDMyKHJlc3VsdCk7CiAgfQoKICB2b2lkIHNldFVpbnQzMihpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlLCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSB7CiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYnl0ZU9mZnNldCArIDMgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGJ5dGVPZmZzZXQsIDAsIGxlbmd0aCAtIDQsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICBfdHlwZWREYXRhLl9zZXRVaW50MzIob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQsCiAgICAgICAgaWRlbnRpY2FsKGVuZGlhbiwgRW5kaWFuLmhvc3QpID8gdmFsdWUgOiBfYnl0ZVN3YXAzMih2YWx1ZSkpOwogIH0KCiAgaW50IGdldEludDY0KGludCBieXRlT2Zmc2V0LCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSB7CiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYnl0ZU9mZnNldCArIDcgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGJ5dGVPZmZzZXQsIDAsIGxlbmd0aCAtIDgsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gX3R5cGVkRGF0YS5fZ2V0SW50NjQob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQpOwogICAgaWYgKGlkZW50aWNhbChlbmRpYW4sIEVuZGlhbi5ob3N0KSkgewogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIF9ieXRlU3dhcDY0KHJlc3VsdCkudG9TaWduZWQoNjQpOwogIH0KCiAgdm9pZCBzZXRJbnQ2NChpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlLCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSB7CiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYnl0ZU9mZnNldCArIDcgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGJ5dGVPZmZzZXQsIDAsIGxlbmd0aCAtIDgsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICBfdHlwZWREYXRhLl9zZXRJbnQ2NChvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCwKICAgICAgICBpZGVudGljYWwoZW5kaWFuLCBFbmRpYW4uaG9zdCkgPyB2YWx1ZSA6IF9ieXRlU3dhcDY0KHZhbHVlKSk7CiAgfQoKICBpbnQgZ2V0VWludDY0KGludCBieXRlT2Zmc2V0LCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSB7CiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYnl0ZU9mZnNldCArIDcgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGJ5dGVPZmZzZXQsIDAsIGxlbmd0aCAtIDgsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gX3R5cGVkRGF0YS5fZ2V0VWludDY0KG9mZnNldEluQnl0ZXMgKyBieXRlT2Zmc2V0KTsKICAgIGlmIChpZGVudGljYWwoZW5kaWFuLCBFbmRpYW4uaG9zdCkpIHsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIHJldHVybiBfYnl0ZVN3YXA2NChyZXN1bHQpOwogIH0KCiAgdm9pZCBzZXRVaW50NjQoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgewogICAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGJ5dGVPZmZzZXQgKyA3ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShieXRlT2Zmc2V0LCAwLCBsZW5ndGggLSA4LCAiYnl0ZU9mZnNldCIpOwogICAgfQogICAgX3R5cGVkRGF0YS5fc2V0VWludDY0KG9mZnNldEluQnl0ZXMgKyBieXRlT2Zmc2V0LAogICAgICAgIGlkZW50aWNhbChlbmRpYW4sIEVuZGlhbi5ob3N0KSA/IHZhbHVlIDogX2J5dGVTd2FwNjQodmFsdWUpKTsKICB9CgogIGRvdWJsZSBnZXRGbG9hdDMyKGludCBieXRlT2Zmc2V0LCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSB7CiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYnl0ZU9mZnNldCArIDMgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGJ5dGVPZmZzZXQsIDAsIGxlbmd0aCAtIDQsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICBpZiAoaWRlbnRpY2FsKGVuZGlhbiwgRW5kaWFuLmhvc3QpKSB7CiAgICAgIHJldHVybiBfdHlwZWREYXRhLl9nZXRGbG9hdDMyKG9mZnNldEluQnl0ZXMgKyBieXRlT2Zmc2V0KTsKICAgIH0KICAgIF9jb252VTMyWzBdID0KICAgICAgICBfYnl0ZVN3YXAzMihfdHlwZWREYXRhLl9nZXRVaW50MzIob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQpKTsKICAgIHJldHVybiBfY29udkYzMlswXTsKICB9CgogIHZvaWQgc2V0RmxvYXQzMihpbnQgYnl0ZU9mZnNldCwgZG91YmxlIHZhbHVlLCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSB7CiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYnl0ZU9mZnNldCArIDMgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGJ5dGVPZmZzZXQsIDAsIGxlbmd0aCAtIDQsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICBpZiAoaWRlbnRpY2FsKGVuZGlhbiwgRW5kaWFuLmhvc3QpKSB7CiAgICAgIF90eXBlZERhdGEuX3NldEZsb2F0MzIob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQsIHZhbHVlKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgX2NvbnZGMzJbMF0gPSB2YWx1ZTsKICAgIF90eXBlZERhdGEuX3NldFVpbnQzMihvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCwgX2J5dGVTd2FwMzIoX2NvbnZVMzJbMF0pKTsKICB9CgogIGRvdWJsZSBnZXRGbG9hdDY0KGludCBieXRlT2Zmc2V0LCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSB7CiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYnl0ZU9mZnNldCArIDcgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGJ5dGVPZmZzZXQsIDAsIGxlbmd0aCAtIDgsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICBpZiAoaWRlbnRpY2FsKGVuZGlhbiwgRW5kaWFuLmhvc3QpKSB7CiAgICAgIHJldHVybiBfdHlwZWREYXRhLl9nZXRGbG9hdDY0KG9mZnNldEluQnl0ZXMgKyBieXRlT2Zmc2V0KTsKICAgIH0KICAgIF9jb252VTY0WzBdID0KICAgICAgICBfYnl0ZVN3YXA2NChfdHlwZWREYXRhLl9nZXRVaW50NjQob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQpKTsKICAgIHJldHVybiBfY29udkY2NFswXTsKICB9CgogIHZvaWQgc2V0RmxvYXQ2NChpbnQgYnl0ZU9mZnNldCwgZG91YmxlIHZhbHVlLCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSB7CiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYnl0ZU9mZnNldCArIDcgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGJ5dGVPZmZzZXQsIDAsIGxlbmd0aCAtIDgsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICBpZiAoaWRlbnRpY2FsKGVuZGlhbiwgRW5kaWFuLmhvc3QpKSB7CiAgICAgIF90eXBlZERhdGEuX3NldEZsb2F0NjQob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQsIHZhbHVlKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgX2NvbnZGNjRbMF0gPSB2YWx1ZTsKICAgIF90eXBlZERhdGEuX3NldFVpbnQ2NChvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCwgX2J5dGVTd2FwNjQoX2NvbnZVNjRbMF0pKTsKICB9CgogIEZsb2F0MzJ4NCBnZXRGbG9hdDMyeDQoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ICsgMyA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoYnl0ZU9mZnNldCwgMCwgbGVuZ3RoIC0gNCwgImJ5dGVPZmZzZXQiKTsKICAgIH0KICAgIC8vIFRPRE8oam9obm1jY3V0Y2hhbikgOiBOZWVkIHRvIHJlc29sdmUgdGhpcyBmb3IgZW5kaWFuaXR5LgogICAgcmV0dXJuIF90eXBlZERhdGEuX2dldEZsb2F0MzJ4NChvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCk7CiAgfQoKICB2b2lkIHNldEZsb2F0MzJ4NChpbnQgYnl0ZU9mZnNldCwgRmxvYXQzMng0IHZhbHVlLAogICAgICBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSB7CiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYnl0ZU9mZnNldCArIDMgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGJ5dGVPZmZzZXQsIDAsIGxlbmd0aCAtIDQsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICAvLyBUT0RPKGpvaG5tY2N1dGNoYW4pIDogTmVlZCB0byByZXNvbHZlIHRoaXMgZm9yIGVuZGlhbml0eS4KICAgIF90eXBlZERhdGEuX3NldEZsb2F0MzJ4NChvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCwgdmFsdWUpOwogIH0KCiAgQHByYWdtYSgidm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBlIikKICBfVHlwZWRMaXN0IGdldCBfdHlwZWREYXRhIG5hdGl2ZSAiVHlwZWREYXRhVmlld190eXBlZERhdGEiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IGdldCBvZmZzZXRJbkJ5dGVzIG5hdGl2ZSAiVHlwZWREYXRhVmlld19vZmZzZXRJbkJ5dGVzIjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBnZXQgbGVuZ3RoIG5hdGl2ZSAiVHlwZWREYXRhVmlld19sZW5ndGgiOwp9CgppbnQgX2J5dGVTd2FwMTYoaW50IHZhbHVlKSB7CiAgcmV0dXJuICgodmFsdWUgJiAweEZGMDApID4+IDgpIHwgKCh2YWx1ZSAmIDB4MDBGRikgPDwgOCk7Cn0KCmludCBfYnl0ZVN3YXAzMihpbnQgdmFsdWUpIHsKICB2YWx1ZSA9ICgodmFsdWUgJiAweEZGMDBGRjAwKSA+PiA4KSB8ICgodmFsdWUgJiAweDAwRkYwMEZGKSA8PCA4KTsKICB2YWx1ZSA9ICgodmFsdWUgJiAweEZGRkYwMDAwKSA+PiAxNikgfCAoKHZhbHVlICYgMHgwMDAwRkZGRikgPDwgMTYpOwogIHJldHVybiB2YWx1ZTsKfQoKaW50IF9ieXRlU3dhcDY0KGludCB2YWx1ZSkgewogIHJldHVybiAoX2J5dGVTd2FwMzIodmFsdWUpIDw8IDMyKSB8IF9ieXRlU3dhcDMyKHZhbHVlID4+IDMyKTsKfQoKZmluYWwgX2NvbnZVMzIgPSBuZXcgVWludDMyTGlzdCgyKTsKZmluYWwgX2NvbnZVNjQgPSBuZXcgVWludDY0TGlzdC52aWV3KF9jb252VTMyLmJ1ZmZlcik7CmZpbmFsIF9jb252RjMyID0gbmV3IEZsb2F0MzJMaXN0LnZpZXcoX2NvbnZVMzIuYnVmZmVyKTsKZmluYWwgX2NvbnZGNjQgPSBuZXcgRmxvYXQ2NExpc3QudmlldyhfY29udlUzMi5idWZmZXIpOwoKLy8gVG9wIGxldmVsIHV0aWxpdHkgbWV0aG9kcy4KaW50IF90b0ludChpbnQgdmFsdWUsIGludCBtYXNrKSB7CiAgdmFsdWUgJj0gbWFzazsKICBpZiAodmFsdWUgPiAobWFzayA+PiAxKSkgdmFsdWUgLT0gbWFzayArIDE7CiAgcmV0dXJuIHZhbHVlOwp9CgppbnQgX3RvSW50OChpbnQgdmFsdWUpIHsKICByZXR1cm4gX3RvSW50KHZhbHVlLCAweEZGKTsKfQoKaW50IF90b1VpbnQ4KGludCB2YWx1ZSkgewogIHJldHVybiB2YWx1ZSAmIDB4RkY7Cn0KCkBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKaW50IF90b0NsYW1wZWRVaW50OChpbnQgdmFsdWUpIHsKICBpZiAodmFsdWUgPCAwKSByZXR1cm4gMDsKICBpZiAodmFsdWUgPiAweEZGKSByZXR1cm4gMHhGRjsKICByZXR1cm4gdmFsdWU7Cn0KCmludCBfdG9JbnQxNihpbnQgdmFsdWUpIHsKICByZXR1cm4gX3RvSW50KHZhbHVlLCAweEZGRkYpOwp9CgppbnQgX3RvVWludDE2KGludCB2YWx1ZSkgewogIHJldHVybiB2YWx1ZSAmIDB4RkZGRjsKfQoKaW50IF90b0ludDMyKGludCB2YWx1ZSkgewogIHJldHVybiBfdG9JbnQodmFsdWUsIDB4RkZGRkZGRkYpOwp9CgppbnQgX3RvVWludDMyKGludCB2YWx1ZSkgewogIHJldHVybiB2YWx1ZSAmIDB4RkZGRkZGRkY7Cn0KCi8vIEluIGFkZGl0aW9uIHRvIGV4cGxpY2l0bHkgY2hlY2tpbmcgdGhlIHJhbmdlLCB0aGlzIG1ldGhvZCBpbXBsaWNpdGx5IGVuc3VyZXMKLy8gdGhhdCBhbGwgYXJndW1lbnRzIGFyZSBub24tbnVsbCAoYSBubyBzdWNoIG1ldGhvZCBlcnJvciBnZXRzIHRocm93bgovLyBvdGhlcndpc2UpLgp2b2lkIF9yYW5nZUNoZWNrKGludCBsaXN0TGVuZ3RoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKICBpZiAobGVuZ3RoIDwgMCkgewogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IudmFsdWUobGVuZ3RoKTsKICB9CiAgaWYgKHN0YXJ0IDwgMCkgewogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IudmFsdWUoc3RhcnQpOwogIH0KICBpZiAoc3RhcnQgKyBsZW5ndGggPiBsaXN0TGVuZ3RoKSB7CiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci52YWx1ZShzdGFydCArIGxlbmd0aCk7CiAgfQp9Cgp2b2lkIF9vZmZzZXRBbGlnbm1lbnRDaGVjayhpbnQgb2Zmc2V0LCBpbnQgYWxpZ25tZW50KSB7CiAgaWYgKChvZmZzZXQgJSBhbGlnbm1lbnQpICE9IDApIHsKICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdPZmZzZXQgKCRvZmZzZXQpIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAnCiAgICAgICAgJ0JZVEVTX1BFUl9FTEVNRU5UICgkYWxpZ25tZW50KScpOwogIH0KfQqRaABOTjwBTVBLKwEYCRETGBweFQ8YGB4bDhkbFxsPASgBIAEpAQcmCRwhNjAvBAEiHFBBQAQCAUwnTktLIBIeGRoBNikuMh4EARUdBAEjATABGkUEARFKBAEgSgQBKUoEAT1KBAEuPAEfASlLKkBES1ECATQeGRoBJQFAATM/ATQePxUEAR0/IwQBPB4rIwYPBAE8SCcjBg8EASoyEx0nMwQBIhskKwYSBAEiHRkUIw4ZGxcGBAFPFTRIFQYZKgYBHy0rBgEcASJKHDZLR0gSMD0oKkwhJBIKOkcmUS4vKjUKLCsKEAgGARQUHRgeDUAWBjErBjsEAU8BRQE1LgFIATUuAUUBNwExOTcEAUMBLDkEARUkBAEmGyQSBgQBNBs6GSQnBhIEAUYbJDUGGQQBTwE3KwEkGyQlBhEEASIbJCMGEgQBOxskHSkGKSwEATobKR0bGAgGKSwEATwXIBskHRsdMAoaHggGJiksBAEdGAQBGEUEASVFBAEmSgQBNEoEASs0BAEuIBEcEQYwKAYPBAE1MR8cEQYnKAYPBAEVSgQBHEoEAS1KBAEtSgQBEiQsBAERLSwEARMlPSoEASw/HiwtEwQBMykkBAE4OSgbBgQCAToeGRoBKAFAATlCATchPxUEASA/IwQBPx4rIwYPBAE/SCcjBg8EATAyFh0nMwQBIhskKwYSBAEiHRkUIw4ZGxcGBAE7HRU0SBUGGSoGAR8tKwYBHAEiTRw2S0dLEjA9KCpMISQSCjpHJlExLyo1CiwrChAIBgEUFCAYHg1AFgYxKwY7BAE0KgFLATsxAU4BOzEBSwE9ATQ5OgQBSQEvPAQBGCcEASkbJBIGBAFAGzoZJCcGEgQBSRskNQYZBAEtLgE6LgEnGyQlBhEEASUbJCMGEgQBRBskHSkGKSwEAUMbKR0bGAgGKSwEAUUXIBskHRsdMAoaHggGJiksBAEgGAQBG0UEAShFBAEpSgQBN0oEATE0BAExIBEcEQYwKAYPBAE4MR8cEQYnKAYPBAEYSgQBH0oEATBKBAEwSgQBFSQsBAEULSwEARYlPSoEAS8/Hi8tEwQBNikkBAE7OSgbBgQCAUAeGRoBKwFAAT9FATokPxUEASM/IwQBQh4rIwYPBAFCSCcjBg8EATYyGR0nMwQBIhskKwYSBAEiHRkUIw4ZGxcGBAE+HRU0SBUGGSoGAR8tKwYBHAEiUBw2S0dOEjA9KCpMISQSCjpHJlE0Lyo1CiwrChAIBgEUFCMYHg1AFgYxKwY7BAE6LQFRAUE0ASU1AUE0AVEBQwE3OT0EAU8BMj8EARsqBAEsGyQSBgQBTBs6GSQnBhIEAUwbJDUGGQQBMDEBPTEBKhskJQYRBAEoGyQjBhIEAU0bJB0pBiksBAFMGykdGxgIBiksBAFOFyAbJB0bHTAKGh4IBiYpLAQBIxgEAR5FBAErRQQBLEoEATpKBAE3GzAGHgQBNCARHBEGMCgGDwQBOzEfHBEGJygGDwQBG0oEASJKBAEzSgQBM0oEARgkLAQBFy0sBAEZJT0qBAEyPx4yLRMEATkpJAQBPjkoGwYEAgE8HhkaASkBQAE7QwE4Ij8VBAEhPyMEAUAeKyMGDwQBQEgnIwYPBAEyMhcdJzMEASIbJCsGEgQBIh0ZFCMOGRsXBgQBPB0VNEgVBhkqBgEfLSsGARwBIk4cNktHTBIwPSgqTCEkEgo6RyZRMi8qNQosKwoQCAYBFBQhGB4NQBYGMSsGOwQBNisBTQE9MgFQAT0yAU0BPwE1OTsEAUsBMD0EARkoBAEqGyQSBgQBRBs6GSQnBhIEAUobJDUGGQQBLi8BOy8BKBskJQYRBAEmGyQjBhIEAUcbJB0pBiksBAFGGykdGxgIBiksBAFIFyAbJB0bHTAKGh4IBiYpLAQBIRgEARxFBAEpRQQBKkoEAThKBAEzGzAGHgQBMiARHBEGMCgGDwQBOTEfHBEGJygGDwQBGUoEASBKBAExSgQBMUoEARYkLAQBFS0sBAEXJT0qBAEwPx4wLRMEATcpJAQBPDkoGwYEAgFAHhkaASsBQAE/RQE6JD8VBAEjPyMEAUIeKyMGDwQBQkgnIwYPBAE2MhkdJzMEASIbJCsGEgQBIh0ZFCMOGRsXBgQBPh0VNEgVBhkqBgEfLSsGARwBIlAcNktHThIwPSgqTCEkEgo6RyZRNC8qNQosKwoQCAYBFBQjGB4NQBYGMSsGOwQBOi0BUQFBNAElNQFBNAFRAUMBNzk9BAFPATI/BAEbKgQBLBskEgYEAUwbOhkkJwYSBAFMGyQ1BhkEATAxAT0xASobJCUGEQQBKBskIwYSBAFNGyQdKQYpLAQBTBspHRsYCAYpLAQBThcgGyQdGx0wChoeCAYmKSwEASMYBAEeRQQBK0UEASxKBAE6SgQBNxswBh4EATQgERwRBjAoBg8EATsxHxwRBicoBg8EARtKBAEiSgQBM0oEATNKBAEYJCwEARctLAQBGSU9KgQBMj8eMi0TBAE5KSQEAT45KBsGBAIBGioaARsBHDsBHTAmJD8BPTNCQQQBPVERT0IEAT8PSxFQQwQBTTcqMzRKBAE/D0sRUEVDBAFBD0wRUUZEBAE/D0sRUEVDBAFBD0wRUUZEBAE/D0sRUEVDBAFBD0wRUUZEBAFDD00zL0dFBAFDD00zL0dFBAFHD08zMUlHBAFDD00zL0dFBAFHD08zMUlHBAIBMx4BQxoOBAEaKAQBMwE0ATQsAR8BND5KATRATAE0QEwBNEJOAUBMAUJOAUBMAUJOATdHNCUBN0c0JQEuTjknASxINSUBTjknAQZDMAYWQ04vJyBQJz0tBgQCAQcRCS1BAQkyKTAEAgEaTCw0Hyg4BhwEASwoOAYlBAExHyUEAR8lIQQCAQcSCS5DAQkzKjAEAgEaTio0Hyg4Bh0EASwoOAYnBAEvHyYEAR8mIgQCAQcZCTVRAQk6MTAEAgEaKxciKjQfKDgGHQQBLCg4Bi4EAS8fJgQBHy0pBAIBBxIJLkMBCTMqMAQCARpOLDQfKDgGJAQBLCg4Bi4EAU4hQSBOPQ03BgQBMR8mBAEfJiIEASQ5BAEwOQQCAQcTCS9FAQk0KzAEAgEaUDA0Hyg4BiUEASwoOAYwBAFOIUEgTz0NNwYEATUfJwQBHycjBAElOwQBMTsEAgEHEgkuQwEJMyowBAIBGk4wHyg4BiQEASwoOAYuBAExHyYEAR8mIgQBJDkEATA5BAIBBxMJL0UBCTQrMAQCARpQMB8oOAYlBAEsKDgGMAQBNR8nBAEfJyMEASU7BAExOwQCAQcSCS5DAQkzKjAEAgEaTjAfKDgGJAQBLCg4BiQEATUfJgQBHyYiBAEkOQQBMDkEAgEHEwkvRQEJNCswBAIBGlAwHyg4BiUEASwoOAYlBAE1HycEAR8nIwQBJTsEATE7BAIBBxQJMEcBCTgsMAQCARomGh0wNyIoOAYmBAEvKDgGJgQBNR8oBAEfKCQEASk9BAE1PQQCAQcUCTBHAQk4LDAEAgEaJhodMDciKDgGJgQBLyg4BiYEATUfKAQBHygkBAEpPQQBNT0EAgEHFgkySwEJPS4wBAIBGigdHy4lKDgGKAQBMig4BigEATUfKgQBHyomBAEuQQQBOkEEAgEHFAkwRwEJOSwwBAIBGiYbHSwjKDgGJgQBMCg4BiYEATUfKAQBHygkBAEqPQQBNj0EAgEHFgkySwEJPS4wBAIBGigdHy4lKDgGKAQBMig4BigEATUfKgQBHyomBAEuQQQBOkEEAgEaLBcaMB8oOAYcBAEsKDgGHAQBNR8lBAEfJSEEAgEaLRcbMDQfKDgGHQQBLCg4BicEATUfJgQBHyYiBAIBGjQXIjA0Hyg4Bh0EASwoOAYuBAE1HyYEAR8tKQQCARotFxswAR8oOAYkBAEsKDgGLgQBNR8mBAEfJiIEASQ5BAEwOQQCARouFxwwAR8oOAYlBAEsKDgGMAQBNR8nBAEfJyMEASU7BAExOwQCARotFxswHyg4BiQEASwoOAYuBAE1HyYEAR8mIgQBJDkEATA5BAIBGi4XHDABHyg4BiUEASwoOAYwBAE1HycEAR8nIwQBJTsEATE7BAIBGi0XGzABHyg4BiQEASwoOAYkBAE1HyYEAR8mIgQBJDkEATA5BAIBGi4XHDABHyg4BiUEASwoOAYlBAE1HycEAR8nIwQBJTsEATE7BAIBGi8aHTABIig4BiYEAS8oOAYmBAE1HygEAR8oJAQBKT0EATU9BAIBGi8aHTABIig4BiYEAS8oOAYmBAE1HygEAR8oJAQBKT0EATU9BAIBGjEdHzABJSg4BigEATIoOAYoBAE1HyoEAR8qJgQBLkEEATpBBAIBGi8bHTABIyg4BiYEATAoOAYmBAE1HygEAR8oJAQBKj0EATY9BAIBGjEdHzAlKDgGKAQBMig4BigEATUfKgQBHyomBAEuQQQBOkEEAgEHEgkuPCYBCS4+AQkuNAEJLi8qAQkuUQIBGiguQC40LkAuQEAsPixGLEEsSSw+LEIuNi4qLj4gNyg3KDcoNygzAS46Lk4BLjUuNS41LjUuOS45LiwuOC5AAgEHEAksSQEJLDciAQksMSoCARokOTo6OjojIyMjMSw2LEguLi4uKCwoLCgsKCwsNyw3LDcsNy4+HwIBBxIJLkgBCS4+AQkuNAEJLlECARooQC40QEBALjYuKj4gNyg3KDMuNS41LjkuOS4sAgE1GBURDgEhGCAZPAQBFCYiJyATBhkVEgQBHQIBTDUBGigEARseBAEpPgE0PgE0MAIBGiwXGhIySzABLB8oOAYWRwQBLCg4BhlNBAExHyUEAR8lIQQCARotFxsSM0wxASwfKDgGFkkEASwoOAYaTwQBMR8mBAEfJiIEAgEaNBciEjpHRAEsHyg4BhZJBAEsKDgGTiEEATEfJgQBHy0pBAIBGi0XGxIzTDEBLB8oOAYWSQQBLCg4BhpPBAFOIUEgTkgNNwYEATEBHyYEAR8mIgQCARouFxwSNE0yASwfKDgGFksEASwoOAYbUQQBTiFBIE9IDTcGBAExAR8nBAEfAScjBAIBGi0XGxIzTDEBLB8oOAYWSQQBLCg4BhpPBAExHyYEAR8mIgQCARouFxwSNE0yASwfKDgGFksEASwoOAYbUQQBMR8nBAEfJyMEAgEaLRcbEjNMMQEsHyg4BhZJBAEsKDgGGkUEATEfJgQBHyYiBAIBGi4XHBI0TTIBLB8oOAYWSwQBLCg4BhtGBAExHycEAR8nIwQCARovGh0SNU4zASwiKDgGFk0EAS8oOAYcRwQBMR8oBAEfKCQEAgEaLxodEjVOMwEsIig4BhZNBAEvKDgGHEcEATEfKAQBHygkBAIBGjEdHxI3UDUBLCUoOAYWUQQBMig4Bh5JBAExHyoEAR8qJgQCARovGx0SNU4zASwjKDgGFk0EATAoOAYcRwQBMR8oBAEfKCQEAgEaMR0fEjdQNQEsJSg4BhZRBAEyKDgGHkkEATEfKgQBHyomBAIBGioxSi8BMRseBAEaEwQBHw4EATABIDJCBjwEASwyQgY8BAEhMkIGPQQBLTJCBj0EAT82SwZDKhUGLQQBSzZLBjVGBAFANksGRCoVBiAEAUw2SwY2RgQBPzZLBkMqFQYtBAFLNksGNUYEAUA2SwZEKhUGIAQBTDZLBjZGBAE/NksGQyoVBi0EAUs2SwY1RgQBQDZLBkQqFQYgBAFMNksGNkYEAUQ2SwYqQQYSSBgEAVA2SwYqQQ4GGVEEAUQ2SwYqQQYSSBgEAVA2SwYqQQ4GGVEEAUk2SwZBQQQBNSY2SwZBQQQBKT4BND4BNDACAR08AgEdRUcQAgEdQAIBJDc4OAEeIhEuEAIBGR4CARoXAgEyIRshEAIBGiACARsZAgEaJAIBGx0CAVBHDzoUKAQTJwQlMAQCATgjQysEAgErZGFydDp0eXBlZF9kYXRhLXBhdGNoL3R5cGVkX2RhdGFfcGF0Y2guZGFydENvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvdHlwZWRfZGF0YS91bm1vZGlmaWFibGVfdHlwZWRfZGF0YS5kYXJ0p70vLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LnR5cGVkX2RhdGE7CgovKioKICogQSByZWFkLW9ubHkgdmlldyBvZiBhIFtCeXRlQnVmZmVyXS4KICovCmNsYXNzIFVubW9kaWZpYWJsZUJ5dGVCdWZmZXJWaWV3IGltcGxlbWVudHMgQnl0ZUJ1ZmZlciB7CiAgZmluYWwgQnl0ZUJ1ZmZlciBfZGF0YTsKCiAgVW5tb2RpZmlhYmxlQnl0ZUJ1ZmZlclZpZXcoQnl0ZUJ1ZmZlciBkYXRhKSA6IF9kYXRhID0gZGF0YTsKCiAgaW50IGdldCBsZW5ndGhJbkJ5dGVzID0+IF9kYXRhLmxlbmd0aEluQnl0ZXM7CgogIFVpbnQ4TGlzdCBhc1VpbnQ4TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgPT4KICAgICAgbmV3IFVubW9kaWZpYWJsZVVpbnQ4TGlzdFZpZXcoX2RhdGEuYXNVaW50OExpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKSk7CgogIEludDhMaXN0IGFzSW50OExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pID0+CiAgICAgIG5ldyBVbm1vZGlmaWFibGVJbnQ4TGlzdFZpZXcoX2RhdGEuYXNJbnQ4TGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpKTsKCiAgVWludDhDbGFtcGVkTGlzdCBhc1VpbnQ4Q2xhbXBlZExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pID0+CiAgICAgIG5ldyBVbm1vZGlmaWFibGVVaW50OENsYW1wZWRMaXN0VmlldygKICAgICAgICAgIF9kYXRhLmFzVWludDhDbGFtcGVkTGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpKTsKCiAgVWludDE2TGlzdCBhc1VpbnQxNkxpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pID0+CiAgICAgIG5ldyBVbm1vZGlmaWFibGVVaW50MTZMaXN0VmlldyhfZGF0YS5hc1VpbnQxNkxpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKSk7CgogIEludDE2TGlzdCBhc0ludDE2TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgPT4KICAgICAgbmV3IFVubW9kaWZpYWJsZUludDE2TGlzdFZpZXcoX2RhdGEuYXNJbnQxNkxpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKSk7CgogIFVpbnQzMkxpc3QgYXNVaW50MzJMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSA9PgogICAgICBuZXcgVW5tb2RpZmlhYmxlVWludDMyTGlzdFZpZXcoX2RhdGEuYXNVaW50MzJMaXN0KG9mZnNldEluQnl0ZXMsIGxlbmd0aCkpOwoKICBJbnQzMkxpc3QgYXNJbnQzMkxpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pID0+CiAgICAgIG5ldyBVbm1vZGlmaWFibGVJbnQzMkxpc3RWaWV3KF9kYXRhLmFzSW50MzJMaXN0KG9mZnNldEluQnl0ZXMsIGxlbmd0aCkpOwoKICBVaW50NjRMaXN0IGFzVWludDY0TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgPT4KICAgICAgbmV3IFVubW9kaWZpYWJsZVVpbnQ2NExpc3RWaWV3KF9kYXRhLmFzVWludDY0TGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpKTsKCiAgSW50NjRMaXN0IGFzSW50NjRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSA9PgogICAgICBuZXcgVW5tb2RpZmlhYmxlSW50NjRMaXN0VmlldyhfZGF0YS5hc0ludDY0TGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpKTsKCiAgSW50MzJ4NExpc3QgYXNJbnQzMng0TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgPT4KICAgICAgbmV3IFVubW9kaWZpYWJsZUludDMyeDRMaXN0VmlldygKICAgICAgICAgIF9kYXRhLmFzSW50MzJ4NExpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKSk7CgogIEZsb2F0MzJMaXN0IGFzRmxvYXQzMkxpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pID0+CiAgICAgIG5ldyBVbm1vZGlmaWFibGVGbG9hdDMyTGlzdFZpZXcoCiAgICAgICAgICBfZGF0YS5hc0Zsb2F0MzJMaXN0KG9mZnNldEluQnl0ZXMsIGxlbmd0aCkpOwoKICBGbG9hdDY0TGlzdCBhc0Zsb2F0NjRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSA9PgogICAgICBuZXcgVW5tb2RpZmlhYmxlRmxvYXQ2NExpc3RWaWV3KAogICAgICAgICAgX2RhdGEuYXNGbG9hdDY0TGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpKTsKCiAgRmxvYXQzMng0TGlzdCBhc0Zsb2F0MzJ4NExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pID0+CiAgICAgIG5ldyBVbm1vZGlmaWFibGVGbG9hdDMyeDRMaXN0VmlldygKICAgICAgICAgIF9kYXRhLmFzRmxvYXQzMng0TGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpKTsKCiAgRmxvYXQ2NHgyTGlzdCBhc0Zsb2F0NjR4Mkxpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pID0+CiAgICAgIG5ldyBVbm1vZGlmaWFibGVGbG9hdDY0eDJMaXN0VmlldygKICAgICAgICAgIF9kYXRhLmFzRmxvYXQ2NHgyTGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpKTsKCiAgQnl0ZURhdGEgYXNCeXRlRGF0YShbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgPT4KICAgICAgbmV3IFVubW9kaWZpYWJsZUJ5dGVEYXRhVmlldyhfZGF0YS5hc0J5dGVEYXRhKG9mZnNldEluQnl0ZXMsIGxlbmd0aCkpOwp9CgovKioKICogQSByZWFkLW9ubHkgdmlldyBvZiBhIFtCeXRlRGF0YV0uCiAqLwpjbGFzcyBVbm1vZGlmaWFibGVCeXRlRGF0YVZpZXcgaW1wbGVtZW50cyBCeXRlRGF0YSB7CiAgZmluYWwgQnl0ZURhdGEgX2RhdGE7CgogIFVubW9kaWZpYWJsZUJ5dGVEYXRhVmlldyhCeXRlRGF0YSBkYXRhKSA6IF9kYXRhID0gZGF0YTsKCiAgaW50IGdldEludDgoaW50IGJ5dGVPZmZzZXQpID0+IF9kYXRhLmdldEludDgoYnl0ZU9mZnNldCk7CgogIHZvaWQgc2V0SW50OChpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlKSA9PiBfdW5zdXBwb3J0ZWQoKTsKCiAgaW50IGdldFVpbnQ4KGludCBieXRlT2Zmc2V0KSA9PiBfZGF0YS5nZXRVaW50OChieXRlT2Zmc2V0KTsKCiAgdm9pZCBzZXRVaW50OChpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlKSA9PiBfdW5zdXBwb3J0ZWQoKTsKCiAgaW50IGdldEludDE2KGludCBieXRlT2Zmc2V0LCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSA9PgogICAgICBfZGF0YS5nZXRJbnQxNihieXRlT2Zmc2V0LCBlbmRpYW4pOwoKICB2b2lkIHNldEludDE2KGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pID0+CiAgICAgIF91bnN1cHBvcnRlZCgpOwoKICBpbnQgZ2V0VWludDE2KGludCBieXRlT2Zmc2V0LCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSA9PgogICAgICBfZGF0YS5nZXRVaW50MTYoYnl0ZU9mZnNldCwgZW5kaWFuKTsKCiAgdm9pZCBzZXRVaW50MTYoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgPT4KICAgICAgX3Vuc3VwcG9ydGVkKCk7CgogIGludCBnZXRJbnQzMihpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgPT4KICAgICAgX2RhdGEuZ2V0SW50MzIoYnl0ZU9mZnNldCwgZW5kaWFuKTsKCiAgdm9pZCBzZXRJbnQzMihpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlLCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSA9PgogICAgICBfdW5zdXBwb3J0ZWQoKTsKCiAgaW50IGdldFVpbnQzMihpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgPT4KICAgICAgX2RhdGEuZ2V0VWludDMyKGJ5dGVPZmZzZXQsIGVuZGlhbik7CgogIHZvaWQgc2V0VWludDMyKGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pID0+CiAgICAgIF91bnN1cHBvcnRlZCgpOwoKICBpbnQgZ2V0SW50NjQoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pID0+CiAgICAgIF9kYXRhLmdldEludDY0KGJ5dGVPZmZzZXQsIGVuZGlhbik7CgogIHZvaWQgc2V0SW50NjQoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgPT4KICAgICAgX3Vuc3VwcG9ydGVkKCk7CgogIGludCBnZXRVaW50NjQoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pID0+CiAgICAgIF9kYXRhLmdldFVpbnQ2NChieXRlT2Zmc2V0LCBlbmRpYW4pOwoKICB2b2lkIHNldFVpbnQ2NChpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlLCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSA9PgogICAgICBfdW5zdXBwb3J0ZWQoKTsKCiAgZG91YmxlIGdldEZsb2F0MzIoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pID0+CiAgICAgIF9kYXRhLmdldEZsb2F0MzIoYnl0ZU9mZnNldCwgZW5kaWFuKTsKCiAgdm9pZCBzZXRGbG9hdDMyKGludCBieXRlT2Zmc2V0LCBkb3VibGUgdmFsdWUsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pID0+CiAgICAgIF91bnN1cHBvcnRlZCgpOwoKICBkb3VibGUgZ2V0RmxvYXQ2NChpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgPT4KICAgICAgX2RhdGEuZ2V0RmxvYXQ2NChieXRlT2Zmc2V0LCBlbmRpYW4pOwoKICB2b2lkIHNldEZsb2F0NjQoaW50IGJ5dGVPZmZzZXQsIGRvdWJsZSB2YWx1ZSwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgPT4KICAgICAgX3Vuc3VwcG9ydGVkKCk7CgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzID0+IF9kYXRhLmVsZW1lbnRTaXplSW5CeXRlczsKCiAgaW50IGdldCBvZmZzZXRJbkJ5dGVzID0+IF9kYXRhLm9mZnNldEluQnl0ZXM7CgogIGludCBnZXQgbGVuZ3RoSW5CeXRlcyA9PiBfZGF0YS5sZW5ndGhJbkJ5dGVzOwoKICBCeXRlQnVmZmVyIGdldCBidWZmZXIgPT4gbmV3IFVubW9kaWZpYWJsZUJ5dGVCdWZmZXJWaWV3KF9kYXRhLmJ1ZmZlcik7CgogIHZvaWQgX3Vuc3VwcG9ydGVkKCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIkFuIFVubW9kaWZpYWJsZUJ5dGVEYXRhVmlldyBtYXkgbm90IGJlIG1vZGlmaWVkIik7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBfVW5tb2RpZmlhYmxlTGlzdE1peGluPE4sIEwgZXh0ZW5kcyBMaXN0PE4+LAogICAgVEQgZXh0ZW5kcyBUeXBlZERhdGE+IHsKICBMIGdldCBfbGlzdDsKICBURCBnZXQgX2RhdGEgPT4gKF9saXN0IGFzIFREKTsKCiAgaW50IGdldCBsZW5ndGggPT4gX2xpc3QubGVuZ3RoOwoKICBOIG9wZXJhdG9yIFtdKGludCBpbmRleCkgPT4gX2xpc3RbaW5kZXhdOwoKICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyA9PiBfZGF0YS5lbGVtZW50U2l6ZUluQnl0ZXM7CgogIGludCBnZXQgb2Zmc2V0SW5CeXRlcyA9PiBfZGF0YS5vZmZzZXRJbkJ5dGVzOwoKICBpbnQgZ2V0IGxlbmd0aEluQnl0ZXMgPT4gX2RhdGEubGVuZ3RoSW5CeXRlczsKCiAgQnl0ZUJ1ZmZlciBnZXQgYnVmZmVyID0+IG5ldyBVbm1vZGlmaWFibGVCeXRlQnVmZmVyVmlldyhfZGF0YS5idWZmZXIpOwp9CgovKioKICogVmlldyBvZiBhIFtVaW50OExpc3RdIHRoYXQgZGlzYWxsb3dzIG1vZGlmaWNhdGlvbi4KICovCmNsYXNzIFVubW9kaWZpYWJsZVVpbnQ4TGlzdFZpZXcgZXh0ZW5kcyBVbm1vZGlmaWFibGVMaXN0QmFzZTxpbnQ+CiAgICB3aXRoIF9Vbm1vZGlmaWFibGVMaXN0TWl4aW48aW50LCBVaW50OExpc3QsIFVpbnQ4TGlzdD4KICAgIGltcGxlbWVudHMgVWludDhMaXN0IHsKICBmaW5hbCBVaW50OExpc3QgX2xpc3Q7CiAgVW5tb2RpZmlhYmxlVWludDhMaXN0VmlldyhVaW50OExpc3QgbGlzdCkgOiBfbGlzdCA9IGxpc3Q7Cn0KCi8qKgogKiBWaWV3IG9mIGEgW0ludDhMaXN0XSB0aGF0IGRpc2FsbG93cyBtb2RpZmljYXRpb24uCiAqLwpjbGFzcyBVbm1vZGlmaWFibGVJbnQ4TGlzdFZpZXcgZXh0ZW5kcyBVbm1vZGlmaWFibGVMaXN0QmFzZTxpbnQ+CiAgICB3aXRoIF9Vbm1vZGlmaWFibGVMaXN0TWl4aW48aW50LCBJbnQ4TGlzdCwgSW50OExpc3Q+CiAgICBpbXBsZW1lbnRzIEludDhMaXN0IHsKICBmaW5hbCBJbnQ4TGlzdCBfbGlzdDsKICBVbm1vZGlmaWFibGVJbnQ4TGlzdFZpZXcoSW50OExpc3QgbGlzdCkgOiBfbGlzdCA9IGxpc3Q7Cn0KCi8qKgogKiBWaWV3IG9mIGEgW1VpbnQ4Q2xhbXBlZExpc3RdIHRoYXQgZGlzYWxsb3dzIG1vZGlmaWNhdGlvbi4KICovCmNsYXNzIFVubW9kaWZpYWJsZVVpbnQ4Q2xhbXBlZExpc3RWaWV3IGV4dGVuZHMgVW5tb2RpZmlhYmxlTGlzdEJhc2U8aW50PgogICAgd2l0aCBfVW5tb2RpZmlhYmxlTGlzdE1peGluPGludCwgVWludDhDbGFtcGVkTGlzdCwgVWludDhDbGFtcGVkTGlzdD4KICAgIGltcGxlbWVudHMgVWludDhDbGFtcGVkTGlzdCB7CiAgZmluYWwgVWludDhDbGFtcGVkTGlzdCBfbGlzdDsKICBVbm1vZGlmaWFibGVVaW50OENsYW1wZWRMaXN0VmlldyhVaW50OENsYW1wZWRMaXN0IGxpc3QpIDogX2xpc3QgPSBsaXN0Owp9CgovKioKICogVmlldyBvZiBhIFtVaW50MTZMaXN0XSB0aGF0IGRpc2FsbG93cyBtb2RpZmljYXRpb24uCiAqLwpjbGFzcyBVbm1vZGlmaWFibGVVaW50MTZMaXN0VmlldyBleHRlbmRzIFVubW9kaWZpYWJsZUxpc3RCYXNlPGludD4KICAgIHdpdGggX1VubW9kaWZpYWJsZUxpc3RNaXhpbjxpbnQsIFVpbnQxNkxpc3QsIFVpbnQxNkxpc3Q+CiAgICBpbXBsZW1lbnRzIFVpbnQxNkxpc3QgewogIGZpbmFsIFVpbnQxNkxpc3QgX2xpc3Q7CiAgVW5tb2RpZmlhYmxlVWludDE2TGlzdFZpZXcoVWludDE2TGlzdCBsaXN0KSA6IF9saXN0ID0gbGlzdDsKfQoKLyoqCiAqIFZpZXcgb2YgYSBbSW50MTZMaXN0XSB0aGF0IGRpc2FsbG93cyBtb2RpZmljYXRpb24uCiAqLwpjbGFzcyBVbm1vZGlmaWFibGVJbnQxNkxpc3RWaWV3IGV4dGVuZHMgVW5tb2RpZmlhYmxlTGlzdEJhc2U8aW50PgogICAgd2l0aCBfVW5tb2RpZmlhYmxlTGlzdE1peGluPGludCwgSW50MTZMaXN0LCBJbnQxNkxpc3Q+CiAgICBpbXBsZW1lbnRzIEludDE2TGlzdCB7CiAgZmluYWwgSW50MTZMaXN0IF9saXN0OwogIFVubW9kaWZpYWJsZUludDE2TGlzdFZpZXcoSW50MTZMaXN0IGxpc3QpIDogX2xpc3QgPSBsaXN0Owp9CgovKioKICogVmlldyBvZiBhIFtVaW50MzJMaXN0XSB0aGF0IGRpc2FsbG93cyBtb2RpZmljYXRpb24uCiAqLwpjbGFzcyBVbm1vZGlmaWFibGVVaW50MzJMaXN0VmlldyBleHRlbmRzIFVubW9kaWZpYWJsZUxpc3RCYXNlPGludD4KICAgIHdpdGggX1VubW9kaWZpYWJsZUxpc3RNaXhpbjxpbnQsIFVpbnQzMkxpc3QsIFVpbnQzMkxpc3Q+CiAgICBpbXBsZW1lbnRzIFVpbnQzMkxpc3QgewogIGZpbmFsIFVpbnQzMkxpc3QgX2xpc3Q7CiAgVW5tb2RpZmlhYmxlVWludDMyTGlzdFZpZXcoVWludDMyTGlzdCBsaXN0KSA6IF9saXN0ID0gbGlzdDsKfQoKLyoqCiAqIFZpZXcgb2YgYSBbSW50MzJMaXN0XSB0aGF0IGRpc2FsbG93cyBtb2RpZmljYXRpb24uCiAqLwpjbGFzcyBVbm1vZGlmaWFibGVJbnQzMkxpc3RWaWV3IGV4dGVuZHMgVW5tb2RpZmlhYmxlTGlzdEJhc2U8aW50PgogICAgd2l0aCBfVW5tb2RpZmlhYmxlTGlzdE1peGluPGludCwgSW50MzJMaXN0LCBJbnQzMkxpc3Q+CiAgICBpbXBsZW1lbnRzIEludDMyTGlzdCB7CiAgZmluYWwgSW50MzJMaXN0IF9saXN0OwogIFVubW9kaWZpYWJsZUludDMyTGlzdFZpZXcoSW50MzJMaXN0IGxpc3QpIDogX2xpc3QgPSBsaXN0Owp9CgovKioKICogVmlldyBvZiBhIFtVaW50NjRMaXN0XSB0aGF0IGRpc2FsbG93cyBtb2RpZmljYXRpb24uCiAqLwpjbGFzcyBVbm1vZGlmaWFibGVVaW50NjRMaXN0VmlldyBleHRlbmRzIFVubW9kaWZpYWJsZUxpc3RCYXNlPGludD4KICAgIHdpdGggX1VubW9kaWZpYWJsZUxpc3RNaXhpbjxpbnQsIFVpbnQ2NExpc3QsIFVpbnQ2NExpc3Q+CiAgICBpbXBsZW1lbnRzIFVpbnQ2NExpc3QgewogIGZpbmFsIFVpbnQ2NExpc3QgX2xpc3Q7CiAgVW5tb2RpZmlhYmxlVWludDY0TGlzdFZpZXcoVWludDY0TGlzdCBsaXN0KSA6IF9saXN0ID0gbGlzdDsKfQoKLyoqCiAqIFZpZXcgb2YgYSBbSW50NjRMaXN0XSB0aGF0IGRpc2FsbG93cyBtb2RpZmljYXRpb24uCiAqLwpjbGFzcyBVbm1vZGlmaWFibGVJbnQ2NExpc3RWaWV3IGV4dGVuZHMgVW5tb2RpZmlhYmxlTGlzdEJhc2U8aW50PgogICAgd2l0aCBfVW5tb2RpZmlhYmxlTGlzdE1peGluPGludCwgSW50NjRMaXN0LCBJbnQ2NExpc3Q+CiAgICBpbXBsZW1lbnRzIEludDY0TGlzdCB7CiAgZmluYWwgSW50NjRMaXN0IF9saXN0OwogIFVubW9kaWZpYWJsZUludDY0TGlzdFZpZXcoSW50NjRMaXN0IGxpc3QpIDogX2xpc3QgPSBsaXN0Owp9CgovKioKICogVmlldyBvZiBhIFtJbnQzMng0TGlzdF0gdGhhdCBkaXNhbGxvd3MgbW9kaWZpY2F0aW9uLgogKi8KY2xhc3MgVW5tb2RpZmlhYmxlSW50MzJ4NExpc3RWaWV3IGV4dGVuZHMgVW5tb2RpZmlhYmxlTGlzdEJhc2U8SW50MzJ4ND4KICAgIHdpdGggX1VubW9kaWZpYWJsZUxpc3RNaXhpbjxJbnQzMng0LCBJbnQzMng0TGlzdCwgSW50MzJ4NExpc3Q+CiAgICBpbXBsZW1lbnRzIEludDMyeDRMaXN0IHsKICBmaW5hbCBJbnQzMng0TGlzdCBfbGlzdDsKICBVbm1vZGlmaWFibGVJbnQzMng0TGlzdFZpZXcoSW50MzJ4NExpc3QgbGlzdCkgOiBfbGlzdCA9IGxpc3Q7Cn0KCi8qKgogKiBWaWV3IG9mIGEgW0Zsb2F0MzJ4NExpc3RdIHRoYXQgZGlzYWxsb3dzIG1vZGlmaWNhdGlvbi4KICovCmNsYXNzIFVubW9kaWZpYWJsZUZsb2F0MzJ4NExpc3RWaWV3IGV4dGVuZHMgVW5tb2RpZmlhYmxlTGlzdEJhc2U8RmxvYXQzMng0PgogICAgd2l0aCBfVW5tb2RpZmlhYmxlTGlzdE1peGluPEZsb2F0MzJ4NCwgRmxvYXQzMng0TGlzdCwgRmxvYXQzMng0TGlzdD4KICAgIGltcGxlbWVudHMgRmxvYXQzMng0TGlzdCB7CiAgZmluYWwgRmxvYXQzMng0TGlzdCBfbGlzdDsKICBVbm1vZGlmaWFibGVGbG9hdDMyeDRMaXN0VmlldyhGbG9hdDMyeDRMaXN0IGxpc3QpIDogX2xpc3QgPSBsaXN0Owp9CgovKioKICogVmlldyBvZiBhIFtGbG9hdDY0eDJMaXN0XSB0aGF0IGRpc2FsbG93cyBtb2RpZmljYXRpb24uCiAqLwpjbGFzcyBVbm1vZGlmaWFibGVGbG9hdDY0eDJMaXN0VmlldyBleHRlbmRzIFVubW9kaWZpYWJsZUxpc3RCYXNlPEZsb2F0NjR4Mj4KICAgIHdpdGggX1VubW9kaWZpYWJsZUxpc3RNaXhpbjxGbG9hdDY0eDIsIEZsb2F0NjR4Mkxpc3QsIEZsb2F0NjR4Mkxpc3Q+CiAgICBpbXBsZW1lbnRzIEZsb2F0NjR4Mkxpc3QgewogIGZpbmFsIEZsb2F0NjR4Mkxpc3QgX2xpc3Q7CiAgVW5tb2RpZmlhYmxlRmxvYXQ2NHgyTGlzdFZpZXcoRmxvYXQ2NHgyTGlzdCBsaXN0KSA6IF9saXN0ID0gbGlzdDsKfQoKLyoqCiAqIFZpZXcgb2YgYSBbRmxvYXQzMkxpc3RdIHRoYXQgZGlzYWxsb3dzIG1vZGlmaWNhdGlvbi4KICovCmNsYXNzIFVubW9kaWZpYWJsZUZsb2F0MzJMaXN0VmlldyBleHRlbmRzIFVubW9kaWZpYWJsZUxpc3RCYXNlPGRvdWJsZT4KICAgIHdpdGggX1VubW9kaWZpYWJsZUxpc3RNaXhpbjxkb3VibGUsIEZsb2F0MzJMaXN0LCBGbG9hdDMyTGlzdD4KICAgIGltcGxlbWVudHMgRmxvYXQzMkxpc3QgewogIGZpbmFsIEZsb2F0MzJMaXN0IF9saXN0OwogIFVubW9kaWZpYWJsZUZsb2F0MzJMaXN0VmlldyhGbG9hdDMyTGlzdCBsaXN0KSA6IF9saXN0ID0gbGlzdDsKfQoKLyoqCiAqIFZpZXcgb2YgYSBbRmxvYXQ2NExpc3RdIHRoYXQgZGlzYWxsb3dzIG1vZGlmaWNhdGlvbi4KICovCmNsYXNzIFVubW9kaWZpYWJsZUZsb2F0NjRMaXN0VmlldyBleHRlbmRzIFVubW9kaWZpYWJsZUxpc3RCYXNlPGRvdWJsZT4KICAgIHdpdGggX1VubW9kaWZpYWJsZUxpc3RNaXhpbjxkb3VibGUsIEZsb2F0NjRMaXN0LCBGbG9hdDY0TGlzdD4KICAgIGltcGxlbWVudHMgRmxvYXQ2NExpc3QgewogIGZpbmFsIEZsb2F0NjRMaXN0IF9saXN0OwogIFVubW9kaWZpYWJsZUZsb2F0NjRMaXN0VmlldyhGbG9hdDY0TGlzdCBsaXN0KSA6IF9saXN0ID0gbGlzdDsKfQqBMQBOTjwBGQEEJwQ5GgE+ATABQE8BPk0BTiw8AUJRAUBPAUJRAUBPAUJRAUBPAUQnNwFEJzcBRCc3AUgpOQFIKTkBPk0CAQQlBDUYAToBPAE9AT4BPgFAKgFMFgFBKwFNFgFAKgFMFgFBKwFNFgFAKgFMFgFBKwFNFgFFLAFRFgFFLAFRFgE6ATABMAFJARggPAQCATwcDyEBIgEsAToBMAEwAUkCAQQ2BEI7Gxk8AgEENQRBORoYOgIBBD0ESUkiIEoCAQQ3BEM9HBo+AgEENgRCOxsZPAIBBDcEQz0cGj4CAQQ2BEI7Gxk8AgEENwRDPRwaPgIBBDYEQjsbGTwCAQQ4BEhDHRtAAgEEOgRMSR8dRAIBBDoETEkfHUQCAQQ4BEdCHRtAAgEEOARHQh0bQAIBLGRhcnQ6dHlwZWRfZGF0YS91bm1vZGlmaWFibGVfdHlwZWRfZGF0YS5kYXJ0O29yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9iaW4vdm1zZXJ2aWNlL3Ztc2VydmljZV9pby5kYXJ0nVQvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSB2bXNlcnZpY2VfaW87CgppbXBvcnQgJ2RhcnQ6YXN5bmMnOwppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CmltcG9ydCAnZGFydDpjb252ZXJ0JzsKaW1wb3J0ICdkYXJ0OmlvJzsKaW1wb3J0ICdkYXJ0Omlzb2xhdGUnOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CmltcG9ydCAnZGFydDpfdm1zZXJ2aWNlJzsKCnBhcnQgJ2xvYWRlci5kYXJ0JzsKcGFydCAnc2VydmVyLmRhcnQnOwoKLy8gVGhlIFRDUCBpcC9wb3J0IHRoYXQgdGhlIEhUVFAgc2VydmVyIGxpc3RlbnMgb24uCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKaW50IF9wb3J0OwpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpClN0cmluZyBfaXA7Ci8vIFNob3VsZCB0aGUgSFRUUCBzZXJ2ZXIgYXV0byBzdGFydD8KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpib29sIF9hdXRvU3RhcnQ7Ci8vIFNob3VsZCB0aGUgSFRUUCBzZXJ2ZXIgcmVxdWlyZSBhbiBhdXRoIGNvZGU/CkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKYm9vbCBfYXV0aENvZGVzRGlzYWJsZWQ7Ci8vIFNob3VsZCB0aGUgSFRUUCBzZXJ2ZXIgcnVuIGluIGRldm1vZGU/CkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKYm9vbCBfb3JpZ2luQ2hlY2tEaXNhYmxlZDsKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpib29sIF9pc1dpbmRvd3MgPSBmYWxzZTsKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpib29sIF9pc0Z1Y2hzaWEgPSBmYWxzZTsKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQp2YXIgX3NpZ25hbFdhdGNoOwp2YXIgX3NpZ25hbFN1YnNjcmlwdGlvbjsKCi8vIEhUVFAgc2VydmVyLgpTZXJ2ZXIgc2VydmVyOwpGdXR1cmU8U2VydmVyPiBzZXJ2ZXJGdXR1cmU7CgpfbGF6eVNlcnZlckJvb3QoKSB7CiAgaWYgKHNlcnZlciAhPSBudWxsKSB7CiAgICByZXR1cm47CiAgfQogIC8vIExhemlseSBjcmVhdGUgc2VydmljZS4KICB2YXIgc2VydmljZSA9IG5ldyBWTVNlcnZpY2UoKTsKICAvLyBMYXppbHkgY3JlYXRlIHNlcnZlci4KICBzZXJ2ZXIgPQogICAgICBuZXcgU2VydmVyKHNlcnZpY2UsIF9pcCwgX3BvcnQsIF9vcmlnaW5DaGVja0Rpc2FibGVkLCBfYXV0aENvZGVzRGlzYWJsZWQpOwp9CgpGdXR1cmUgY2xlYW51cENhbGxiYWNrKCkgYXN5bmMgewogIHNodXRkb3duTG9hZGVycygpOwogIC8vIENhbmNlbCB0aGUgc2lncXVpdCBzdWJzY3JpcHRpb24uCiAgaWYgKF9zaWduYWxTdWJzY3JpcHRpb24gIT0gbnVsbCkgewogICAgYXdhaXQgX3NpZ25hbFN1YnNjcmlwdGlvbi5jYW5jZWwoKTsKICAgIF9zaWduYWxTdWJzY3JpcHRpb24gPSBudWxsOwogIH0KICBpZiAoc2VydmVyICE9IG51bGwpIHsKICAgIHRyeSB7CiAgICAgIGF3YWl0IHNlcnZlci5jbGVhbnVwKHRydWUpOwogICAgfSBjYXRjaCAoZSwgc3QpIHsKICAgICAgcHJpbnQoIkVycm9yIGluIHZtLXNlcnZpY2Ugc2h1dGRvd246ICRlXG4kc3RcbiIpOwogICAgfQogIH0KICBpZiAoX3JlZ2lzdGVyU2lnbmFsSGFuZGxlclRpbWVyICE9IG51bGwpIHsKICAgIF9yZWdpc3RlclNpZ25hbEhhbmRsZXJUaW1lci5jYW5jZWwoKTsKICAgIF9yZWdpc3RlclNpZ25hbEhhbmRsZXJUaW1lciA9IG51bGw7CiAgfQogIC8vIENhbGwgb3V0IHRvIGVtYmVkZGVyJ3Mgc2h1dGRvd24gY2FsbGJhY2suCiAgX3NodXRkb3duKCk7Cn0KCkZ1dHVyZTxVcmk+IGNyZWF0ZVRlbXBEaXJDYWxsYmFjayhTdHJpbmcgYmFzZSkgYXN5bmMgewogIERpcmVjdG9yeSB0ZW1wID0gYXdhaXQgRGlyZWN0b3J5LnN5c3RlbVRlbXAuY3JlYXRlVGVtcChiYXNlKTsKICAvLyBVbmRlcm5lYXRoIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBjcmVhdGUgYSBkaXJlY3Rvcnkgd2l0aCB0aGUKICAvLyBzYW1lIG5hbWUgYXMgdGhlIERldkZTIG5hbWUgW2Jhc2VdLgogIHZhciBmc1VyaSA9IHRlbXAudXJpLnJlc29sdmVVcmkobmV3IFVyaS5kaXJlY3RvcnkoYmFzZSkpOwogIGF3YWl0IG5ldyBEaXJlY3RvcnkuZnJvbVVyaShmc1VyaSkuY3JlYXRlKCk7CiAgcmV0dXJuIGZzVXJpOwp9CgpGdXR1cmUgZGVsZXRlRGlyQ2FsbGJhY2soVXJpIHBhdGgpIGFzeW5jIHsKICBEaXJlY3RvcnkgZGlyID0gbmV3IERpcmVjdG9yeS5mcm9tVXJpKHBhdGgpOwogIGF3YWl0IGRpci5kZWxldGUocmVjdXJzaXZlOiB0cnVlKTsKfQoKY2xhc3MgUGVuZGluZ1dyaXRlIHsKICBQZW5kaW5nV3JpdGUodGhpcy51cmksIHRoaXMuYnl0ZXMpOwogIGZpbmFsIENvbXBsZXRlciBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyKCk7CiAgZmluYWwgVXJpIHVyaTsKICBmaW5hbCBMaXN0PGludD4gYnl0ZXM7CgogIEZ1dHVyZSB3cml0ZSgpIGFzeW5jIHsKICAgIHZhciBmaWxlID0gbmV3IEZpbGUuZnJvbVVyaSh1cmkpOwogICAgdmFyIHBhcmVudF9kaXJlY3RvcnkgPSBmaWxlLnBhcmVudDsKICAgIGF3YWl0IHBhcmVudF9kaXJlY3RvcnkuY3JlYXRlKHJlY3Vyc2l2ZTogdHJ1ZSk7CiAgICBpZiAoYXdhaXQgZmlsZS5leGlzdHMoKSkgewogICAgICBhd2FpdCBmaWxlLmRlbGV0ZSgpOwogICAgfQogICAgdmFyIHJlc3VsdCA9IGF3YWl0IGZpbGUud3JpdGVBc0J5dGVzKGJ5dGVzKTsKICAgIGNvbXBsZXRlci5jb21wbGV0ZShudWxsKTsKICAgIFdyaXRlTGltaXRlci5fd3JpdGVDb21wbGV0ZWQoKTsKICB9Cn0KCmNsYXNzIFdyaXRlTGltaXRlciB7CiAgc3RhdGljIGZpbmFsIExpc3Q8UGVuZGluZ1dyaXRlPiBwZW5kaW5nV3JpdGVzID0gbmV3IExpc3Q8UGVuZGluZ1dyaXRlPigpOwoKICAvLyBub24tcm9vdGVkIEFuZHJvaWQgZGV2aWNlcyBoYXZlIGEgdmVyeSBsb3cgbGltaXQgZm9yIHRoZSBudW1iZXIgb2YKICAvLyBvcGVuIGZpbGVzLiBBcnRpZmljaWFsbHkgY2FwIG91cnNlbHZlcyB0byAxNi4KICBzdGF0aWMgY29uc3Qga01heE9wZW5Xcml0ZXMgPSAxNjsKICBzdGF0aWMgaW50IG9wZW5Xcml0ZXMgPSAwOwoKICBzdGF0aWMgRnV0dXJlIHNjaGVkdWxlV3JpdGUoVXJpIHBhdGgsIExpc3Q8aW50PiBieXRlcykgYXN5bmMgewogICAgLy8gQ3JlYXRlIGEgbmV3IHBlbmRpbmcgd3JpdGUuCiAgICBQZW5kaW5nV3JpdGUgcHcgPSBuZXcgUGVuZGluZ1dyaXRlKHBhdGgsIGJ5dGVzKTsKICAgIHBlbmRpbmdXcml0ZXMuYWRkKHB3KTsKICAgIF9tYXliZVdyaXRlRmlsZXMoKTsKICAgIHJldHVybiBwdy5jb21wbGV0ZXIuZnV0dXJlOwogIH0KCiAgc3RhdGljIF9tYXliZVdyaXRlRmlsZXMoKSB7CiAgICB3aGlsZSAob3BlbldyaXRlcyA8IGtNYXhPcGVuV3JpdGVzKSB7CiAgICAgIGlmIChwZW5kaW5nV3JpdGVzLmxlbmd0aCA+IDApIHsKICAgICAgICBQZW5kaW5nV3JpdGUgcHcgPSBwZW5kaW5nV3JpdGVzLnJlbW92ZUxhc3QoKTsKICAgICAgICBwdy53cml0ZSgpOwogICAgICAgIG9wZW5Xcml0ZXMrKzsKICAgICAgfSBlbHNlIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KCiAgc3RhdGljIF93cml0ZUNvbXBsZXRlZCgpIHsKICAgIG9wZW5Xcml0ZXMtLTsKICAgIGFzc2VydChvcGVuV3JpdGVzID49IDApOwogICAgX21heWJlV3JpdGVGaWxlcygpOwogIH0KfQoKRnV0dXJlIHdyaXRlRmlsZUNhbGxiYWNrKFVyaSBwYXRoLCBMaXN0PGludD4gYnl0ZXMpIGFzeW5jIHsKICByZXR1cm4gV3JpdGVMaW1pdGVyLnNjaGVkdWxlV3JpdGUocGF0aCwgYnl0ZXMpOwp9CgpGdXR1cmUgd3JpdGVTdHJlYW1GaWxlQ2FsbGJhY2soVXJpIHBhdGgsIFN0cmVhbTxMaXN0PGludD4+IGJ5dGVzKSBhc3luYyB7CiAgdmFyIGZpbGUgPSBuZXcgRmlsZS5mcm9tVXJpKHBhdGgpOwogIHZhciBwYXJlbnRfZGlyZWN0b3J5ID0gZmlsZS5wYXJlbnQ7CiAgYXdhaXQgcGFyZW50X2RpcmVjdG9yeS5jcmVhdGUocmVjdXJzaXZlOiB0cnVlKTsKICBpZiAoYXdhaXQgZmlsZS5leGlzdHMoKSkgewogICAgYXdhaXQgZmlsZS5kZWxldGUoKTsKICB9CiAgSU9TaW5rIHNpbmsgPSBhd2FpdCBmaWxlLm9wZW5Xcml0ZSgpOwogIGF3YWl0IHNpbmsuYWRkU3RyZWFtKGJ5dGVzKTsKICBhd2FpdCBzaW5rLmNsb3NlKCk7Cn0KCkZ1dHVyZTxMaXN0PGludD4+IHJlYWRGaWxlQ2FsbGJhY2soVXJpIHBhdGgpIGFzeW5jIHsKICB2YXIgZmlsZSA9IG5ldyBGaWxlLmZyb21VcmkocGF0aCk7CiAgcmV0dXJuIGF3YWl0IGZpbGUucmVhZEFzQnl0ZXMoKTsKfQoKRnV0dXJlPExpc3Q8TWFwPFN0cmluZywgZHluYW1pYz4+PiBsaXN0RmlsZXNDYWxsYmFjayhVcmkgZGlyUGF0aCkgYXN5bmMgewogIHZhciBkaXIgPSBuZXcgRGlyZWN0b3J5LmZyb21VcmkoZGlyUGF0aCk7CiAgdmFyIGRpclBhdGhTdHIgPSBkaXJQYXRoLnBhdGg7CiAgdmFyIHN0cmVhbSA9IGRpci5saXN0KHJlY3Vyc2l2ZTogdHJ1ZSk7CiAgdmFyIHJlc3VsdCA9IDxNYXA8U3RyaW5nLCBkeW5hbWljPj5bXTsKICBhd2FpdCBmb3IgKHZhciBmaWxlRW50aXR5IGluIHN0cmVhbSkgewogICAgdmFyIGZpbGVQYXRoID0gbmV3IFVyaS5maWxlKGZpbGVFbnRpdHkucGF0aCkucGF0aDsKICAgIHZhciBzdGF0ID0gYXdhaXQgZmlsZUVudGl0eS5zdGF0KCk7CiAgICBpZiAoc3RhdC50eXBlID09IEZpbGVTeXN0ZW1FbnRpdHlUeXBlLkZJTEUgJiYKICAgICAgICBmaWxlUGF0aC5zdGFydHNXaXRoKGRpclBhdGhTdHIpKSB7CiAgICAgIHZhciBtYXAgPSA8U3RyaW5nLCBkeW5hbWljPnt9OwogICAgICBtYXBbJ25hbWUnXSA9ICcvJyArIGZpbGVQYXRoLnN1YnN0cmluZyhkaXJQYXRoU3RyLmxlbmd0aCk7CiAgICAgIG1hcFsnc2l6ZSddID0gc3RhdC5zaXplOwogICAgICBtYXBbJ21vZGlmaWVkJ10gPSBzdGF0Lm1vZGlmaWVkLm1pbGxpc2Vjb25kc1NpbmNlRXBvY2g7CiAgICAgIHJlc3VsdC5hZGQobWFwKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlc3VsdDsKfQoKRnV0dXJlPFVyaT4gc2VydmVySW5mb3JtYXRpb25DYWxsYmFjaygpIGFzeW5jIHsKICBfbGF6eVNlcnZlckJvb3QoKTsKICByZXR1cm4gc2VydmVyLnNlcnZlckFkZHJlc3M7Cn0KCkZ1dHVyZTxVcmk+IHdlYlNlcnZlckNvbnRyb2xDYWxsYmFjayhib29sIGVuYWJsZSkgYXN5bmMgewogIF9sYXp5U2VydmVyQm9vdCgpOwogIGlmIChzZXJ2ZXIucnVubmluZyA9PSBlbmFibGUpIHsKICAgIC8vIE5vIGNoYW5nZS4KICAgIHJldHVybiBzZXJ2ZXIuc2VydmVyQWRkcmVzczsKICB9CgogIGlmIChlbmFibGUpIHsKICAgIGF3YWl0IHNlcnZlci5zdGFydHVwKCk7CiAgICByZXR1cm4gc2VydmVyLnNlcnZlckFkZHJlc3M7CiAgfSBlbHNlIHsKICAgIGF3YWl0IHNlcnZlci5zaHV0ZG93bih0cnVlKTsKICAgIHJldHVybiBzZXJ2ZXIuc2VydmVyQWRkcmVzczsKICB9Cn0KCk51bGwgX2NsZWFyRnV0dXJlKF8pIHsKICBzZXJ2ZXJGdXR1cmUgPSBudWxsOwp9Cgpfb25TaWduYWwoUHJvY2Vzc1NpZ25hbCBzaWduYWwpIHsKICBpZiAoc2VydmVyRnV0dXJlICE9IG51bGwpIHsKICAgIC8vIFN0aWxsIHdhaXRpbmcuCiAgICByZXR1cm47CiAgfQogIF9sYXp5U2VydmVyQm9vdCgpOwogIC8vIFRvZ2dsZSBIVFRQIHNlcnZlci4KICBpZiAoc2VydmVyLnJ1bm5pbmcpIHsKICAgIHNlcnZlckZ1dHVyZSA9IHNlcnZlci5zaHV0ZG93bih0cnVlKS50aGVuKF9jbGVhckZ1dHVyZSk7CiAgfSBlbHNlIHsKICAgIHNlcnZlckZ1dHVyZSA9IHNlcnZlci5zdGFydHVwKCkudGhlbihfY2xlYXJGdXR1cmUpOwogIH0KfQoKVGltZXIgX3JlZ2lzdGVyU2lnbmFsSGFuZGxlclRpbWVyOwoKX3JlZ2lzdGVyU2lnbmFsSGFuZGxlcigpIHsKICBfcmVnaXN0ZXJTaWduYWxIYW5kbGVyVGltZXIgPSBudWxsOwogIGlmIChfc2lnbmFsV2F0Y2ggPT0gbnVsbCkgewogICAgLy8gQ2Fubm90IHJlZ2lzdGVyIGZvciBzaWduYWxzLgogICAgcmV0dXJuOwogIH0KICBpZiAoX2lzV2luZG93cyB8fCBfaXNGdWNoc2lhKSB7CiAgICAvLyBDYW5ub3QgcmVnaXN0ZXIgZm9yIHNpZ25hbHMgb24gV2luZG93cyBvciBGdWNoc2lhLgogICAgcmV0dXJuOwogIH0KICBfc2lnbmFsU3Vic2NyaXB0aW9uID0gX3NpZ25hbFdhdGNoKFByb2Nlc3NTaWduYWwuU0lHUVVJVCkubGlzdGVuKF9vblNpZ25hbCk7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgIWNvbnN0IGJvb2wuZnJvbUVudmlyb25tZW50KCJkYXJ0LnZtLnByb2R1Y3QiKSkKbWFpbigpIHsKICAvLyBTZXQgZW1iZWRkZXIgaG9va3MuCiAgVk1TZXJ2aWNlRW1iZWRkZXJIb29rcy5jbGVhbnVwID0gY2xlYW51cENhbGxiYWNrOwogIFZNU2VydmljZUVtYmVkZGVySG9va3MuY3JlYXRlVGVtcERpciA9IGNyZWF0ZVRlbXBEaXJDYWxsYmFjazsKICBWTVNlcnZpY2VFbWJlZGRlckhvb2tzLmRlbGV0ZURpciA9IGRlbGV0ZURpckNhbGxiYWNrOwogIFZNU2VydmljZUVtYmVkZGVySG9va3Mud3JpdGVGaWxlID0gd3JpdGVGaWxlQ2FsbGJhY2s7CiAgVk1TZXJ2aWNlRW1iZWRkZXJIb29rcy53cml0ZVN0cmVhbUZpbGUgPSB3cml0ZVN0cmVhbUZpbGVDYWxsYmFjazsKICBWTVNlcnZpY2VFbWJlZGRlckhvb2tzLnJlYWRGaWxlID0gcmVhZEZpbGVDYWxsYmFjazsKICBWTVNlcnZpY2VFbWJlZGRlckhvb2tzLmxpc3RGaWxlcyA9IGxpc3RGaWxlc0NhbGxiYWNrOwogIFZNU2VydmljZUVtYmVkZGVySG9va3Muc2VydmVySW5mb3JtYXRpb24gPSBzZXJ2ZXJJbmZvcm1hdGlvbkNhbGxiYWNrOwogIFZNU2VydmljZUVtYmVkZGVySG9va3Mud2ViU2VydmVyQ29udHJvbCA9IHdlYlNlcnZlckNvbnRyb2xDYWxsYmFjazsKICAvLyBBbHdheXMgaW5zdGFudGlhdGUgdGhlIHZtc2VydmljZSBvYmplY3Qgc28gdGhhdCB0aGUgZXhpdCBtZXNzYWdlCiAgLy8gY2FuIGJlIGRlbGl2ZXJlZCBhbmQgd2FpdGluZyBsb2FkZXJzIGNhbiBiZSBjYW5jZWxsZWQuCiAgbmV3IFZNU2VydmljZSgpOwogIGlmIChfYXV0b1N0YXJ0KSB7CiAgICBfbGF6eVNlcnZlckJvb3QoKTsKICAgIHNlcnZlci5zdGFydHVwKCk7CiAgICAvLyBJdCdzIGp1c3QgaGVyZSB0byBwdXNoIGFuIGV2ZW50IG9uIHRoZSBldmVudCBsb29wIHNvIHRoYXQgd2UgaW52b2tlIHRoZQogICAgLy8gc2NoZWR1bGVkIG1pY3JvdGFza3MuCiAgICBUaW1lci5ydW4oKCkge30pOwogIH0KICBzY3JpcHRMb2FkUG9ydC5oYW5kbGVyID0gX3Byb2Nlc3NMb2FkUmVxdWVzdDsKICAvLyBSZWdpc3RlciBzaWduYWwgaGFuZGxlciBhZnRlciBhIHNtYWxsIGRlbGF5IHRvIGF2b2lkIHN0YWxsaW5nIG1haW4KICAvLyBpc29sYXRlIHN0YXJ0dXAuCiAgX3JlZ2lzdGVyU2lnbmFsSGFuZGxlclRpbWVyID0gbmV3IFRpbWVyKHNob3J0RGVsYXksIF9yZWdpc3RlclNpZ25hbEhhbmRsZXIpOwogIHJldHVybiBzY3JpcHRMb2FkUG9ydDsKfQoKX3NodXRkb3duKCkgbmF0aXZlICJWTVNlcnZpY2VJT19TaHV0ZG93biI7CoEPAE5OPAEWARUaFxIXGhoBFBQBNBoLGgwmGhEwGhkqGhsaGRoZGhIZARAPHQEUGAwEHCEbC1ECASEVJiUoIAQYCiIWOAYELSooBC8PAgE3QEUpPC8QAgErLyUCARUmLxEZARkmKDQfGwYxHiQEAgEVTAFIMyQdAUEjNRsYIAQBHiomNhQWDw8IBgQBHRIdGAQCATwyAgFKJSYyHRkEKB8WAgE1JSMCAUosISopKTcoMislQR8+FwYEEQIBMBUfAgE6FSISIQQBEBwhCyEhBAIBFxcCASIeFgwEFRkYPQs4BAIBIwEbJh4kDAQiOgwETwIBSgkZNEA4OEQ2OEhGRjwTFBcWTx0WBDBIFk8ZAgErARFkYXJ0OnZtc2VydmljZV9pbzVvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvYmluL3Ztc2VydmljZS9sb2FkZXIuZGFydMAAiOsvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiB2bXNlcnZpY2VfaW87Cgpfc2FuaXRpemVXaW5kb3dzUGF0aChwYXRoKSB7CiAgLy8gRm9yIFdpbmRvd3Mgd2UgbmVlZCB0byBtYXNzYWdlIHRoZSBwYXRocyBhIGJpdCBhY2NvcmRpbmcgdG8KICAvLyBodHRwOi8vYmxvZ3MubXNkbi5jb20vYi9pZS9hcmNoaXZlLzIwMDYvMTIvMDYvZmlsZS11cmlzLWluLXdpbmRvd3MuYXNweAogIC8vCiAgLy8gQ29udmVydAogIC8vIEM6XG9uZVx0d29cdGhyZWUKICAvLyB0bwogIC8vIC9DOi9vbmUvdHdvL3RocmVlCgogIGlmIChfaXNXaW5kb3dzID09IGZhbHNlKSB7CiAgICAvLyBEbyBub3RoaW5nIHdoZW4gbm90IHJ1bm5pbmcgV2luZG93cy4KICAgIHJldHVybiBwYXRoOwogIH0KCiAgdmFyIGZpeGVkUGF0aCA9ICIke3BhdGgucmVwbGFjZUFsbCgnXFwnLCAnLycpfSI7CgogIGlmICgocGF0aC5sZW5ndGggPiAyKSAmJiAocGF0aFsxXSA9PSAnOicpKSB7CiAgICAvLyBQYXRoIGJlZ2lucyB3aXRoIGEgZHJpdmUgbGV0dGVyLgogICAgcmV0dXJuICcvJGZpeGVkUGF0aCc7CiAgfQoKICByZXR1cm4gZml4ZWRQYXRoOwp9CgpfdHJpbVdpbmRvd3NQYXRoKHBhdGgpIHsKICAvLyBDb252ZXJ0IC9YOi8gdG8gWDovLgogIGlmIChfaXNXaW5kb3dzID09IGZhbHNlKSB7CiAgICAvLyBEbyBub3RoaW5nIHdoZW4gbm90IHJ1bm5pbmcgV2luZG93cy4KICAgIHJldHVybiBwYXRoOwogIH0KICBpZiAoIXBhdGguc3RhcnRzV2l0aCgnLycpIHx8IChwYXRoLmxlbmd0aCA8IDMpKSB7CiAgICByZXR1cm4gcGF0aDsKICB9CiAgLy8gTWF0Y2ggJy8/OicuCiAgaWYgKChwYXRoWzBdID09ICcvJykgJiYgKHBhdGhbMl0gPT0gJzonKSkgewogICAgLy8gUmVtb3ZlIGxlYWRpbmcgJy8nLgogICAgcmV0dXJuIHBhdGguc3Vic3RyaW5nKDEpOwogIH0KICByZXR1cm4gcGF0aDsKfQoKLy8gRW5zdXJlIHdlIGhhdmUgYSB0cmFpbGluZyBzbGFzaCBjaGFyYWN0ZXIuCl9lbmZvcmNlVHJhaWxpbmdTbGFzaCh1cmkpIHsKICBpZiAoIXVyaS5lbmRzV2l0aCgnLycpKSB7CiAgICByZXR1cm4gJyR1cmkvJzsKICB9CiAgcmV0dXJuIHVyaTsKfQoKY2xhc3MgRmlsZVJlcXVlc3QgewogIGZpbmFsIFNlbmRQb3J0IHNwOwogIGZpbmFsIGludCB0YWc7CiAgZmluYWwgVXJpIHVyaTsKICBmaW5hbCBVcmkgcmVzb2x2ZWRVcmk7CiAgZmluYWwgU3RyaW5nIGxpYnJhcnlVcmw7CiAgRmlsZVJlcXVlc3QodGhpcy5zcCwgdGhpcy50YWcsIHRoaXMudXJpLCB0aGlzLnJlc29sdmVkVXJpLCB0aGlzLmxpYnJhcnlVcmwpOwp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmJvb2wgX3RyYWNlTG9hZGluZyA9IGZhbHNlOwpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmJvb2wgX2RldGVybWluaXN0aWMgPSBmYWxzZTsKCi8vIFN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaXNvbGF0ZSB0aGF0IGlzIHVzZWQgZm9yIGxvYWRpbmcuCmNsYXNzIElzb2xhdGVMb2FkZXJTdGF0ZSBleHRlbmRzIElzb2xhdGVFbWJlZGRlckRhdGEgewogIElzb2xhdGVMb2FkZXJTdGF0ZSh0aGlzLmlzb2xhdGVJZCk7CgogIGZpbmFsIGludCBpc29sYXRlSWQ7CiAgYm9vbCBfZGVhZCA9IGZhbHNlOwogIFNlbmRQb3J0IHNwOwoKICB2b2lkIGluaXQoU3RyaW5nIHBhY2thZ2VSb290RmxhZywgU3RyaW5nIHBhY2thZ2VzQ29uZmlnRmxhZywKICAgICAgU3RyaW5nIHdvcmtpbmdEaXJlY3RvcnksIFN0cmluZyByb290U2NyaXB0KSB7CiAgICBpZiAoX2RlYWQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gX3dvcmtpbmdEaXJlY3RvcnkgbXVzdCBiZSBzZXQgZmlyc3QuCiAgICBfd29ya2luZ0RpcmVjdG9yeSA9IG5ldyBVcmkuZGlyZWN0b3J5KHdvcmtpbmdEaXJlY3RvcnkpOwogICAgaWYgKHJvb3RTY3JpcHQgIT0gbnVsbCkgewogICAgICBfcm9vdFNjcmlwdCA9IFVyaS5wYXJzZShyb290U2NyaXB0KTsKICAgIH0KICAgIC8vIElmIHRoZSAtLXBhY2thZ2Utcm9vdCBmbGFnIHdhcyBwYXNzZWQuCiAgICBpZiAocGFja2FnZVJvb3RGbGFnICE9IG51bGwpIHsKICAgICAgX3NldFBhY2thZ2VSb290KHBhY2thZ2VSb290RmxhZyk7CiAgICB9CiAgICAvLyBJZiB0aGUgLS1wYWNrYWdlcyBmbGFnIHdhcyBwYXNzZWQuCiAgICBpZiAocGFja2FnZXNDb25maWdGbGFnICE9IG51bGwpIHsKICAgICAgX3NldFBhY2thZ2VzQ29uZmlnKHBhY2thZ2VzQ29uZmlnRmxhZyk7CiAgICB9CiAgfQoKICB2b2lkIHVwZGF0ZVBhY2thZ2VNYXAoU3RyaW5nIHBhY2thZ2VzQ29uZmlnRmxhZykgewogICAgaWYgKHBhY2thZ2VzQ29uZmlnRmxhZyA9PSBudWxsKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIF9wYWNrYWdlTWFwID0gbnVsbDsKICAgIF9zZXRQYWNrYWdlc0NvbmZpZyhwYWNrYWdlc0NvbmZpZ0ZsYWcpOwogIH0KCiAgdm9pZCBjbGVhbnVwKCkgewogICAgX2RlYWQgPSB0cnVlOwogICAgaWYgKF9wYWNrYWdlc1BvcnQgIT0gbnVsbCkgewogICAgICBfcGFja2FnZXNQb3J0LmNsb3NlKCk7CiAgICAgIF9wYWNrYWdlc1BvcnQgPSBudWxsOwogICAgfQogIH0KCiAgLy8gVGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdoZW4gdGhlIGVtYmVkZGVyIHN0YXJ0ZWQuCiAgVXJpIF93b3JraW5nRGlyZWN0b3J5OwoKICAvLyBUaGUgcm9vdCBzY3JpcHQncyB1cmkuCiAgVXJpIF9yb290U2NyaXB0OwoKICAvLyBQYWNrYWdlcyBhcmUgZWl0aGVyIHJlc29sdmVkIGxvb2tpbmcgdXAgaW4gYSBtYXAgb3IgcmVzb2x2ZWQgZnJvbSB3aXRoaW4gYQogIC8vIHBhY2thZ2Ugcm9vdC4KICBib29sIGdldCBfcGFja2FnZXNSZWFkeSA9PgogICAgICAoX3BhY2thZ2VSb290ICE9IG51bGwpIHx8CiAgICAgIChfcGFja2FnZU1hcCAhPSBudWxsKSB8fAogICAgICAoX3BhY2thZ2VFcnJvciAhPSBudWxsKTsKCiAgLy8gRXJyb3Igc3RyaW5nIHNldCBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVzb2x2aW5nIHBhY2thZ2UgY29uZmlndXJhdGlvbi4KICAvLyBGb3IgZXhhbXBsZSBub3QgZmluZGluZyBhIC5wYWNrYWdlcyBmaWxlIG9yIHBhY2thZ2VzLyBkaXJlY3RvcnksIG1hbGZvcm1lZAogIC8vIC5wYWNrYWdlcyBmaWxlIG9yIGFueSBvdGhlciByZWxhdGVkIGVycm9yLgogIFN0cmluZyBfcGFja2FnZUVycm9yID0gbnVsbDsKCiAgLy8gVGhlIGRpcmVjdG9yeSB0byBsb29rIGluIHRvIHJlc29sdmUgInBhY2thZ2U6IiBzY2hlbWUgVVJJcy4gQnkgZGVmYXVsdCBpdAogIC8vIGlzIHRoZSAncGFja2FnZXMnIGRpcmVjdG9yeSByaWdodCBuZXh0IHRvIHRoZSBzY3JpcHQuCiAgVXJpIF9wYWNrYWdlUm9vdCA9IG51bGw7CgogIC8vIFRoZSBtYXAgZGVzY3JpYmluZyBob3cgY2VydGFpbiBwYWNrYWdlIG5hbWVzIGFyZSBtYXBwZWQgdG8gVXJpcy4KICBVcmkgX3BhY2thZ2VDb25maWcgPSBudWxsOwogIE1hcDxTdHJpbmcsIFVyaT4gX3BhY2thZ2VNYXAgPSBudWxsOwoKICAvLyBXZSBpc3N1ZSBvbmx5IDE2IGNvbmN1cnJlbnQgY2FsbHMgdG8gRmlsZS5yZWFkQXNCeXRlcygpIHRvIHN0YXkgd2l0aGluCiAgLy8gcGxhdGZvcm0tc3BlY2lmaWMgcmVzb3VyY2UgbGltaXRzIChlLmcuIG1heCBvcGVuIGZpbGVzKS4gVGhlIHJlc3QgZ28gb24KICAvLyBfZmlsZVJlcXVlc3RRdWV1ZSBhbmQgYXJlIHByb2Nlc3NlZCB3aGVuIHdlIGNhbiBzYWZlbHkgaXNzdWUgdGhlbS4KICBzdGF0aWMgZmluYWwgaW50IF9tYXhGaWxlUmVxdWVzdHMgPSBfZGV0ZXJtaW5pc3RpYyA/IDEgOiAxNjsKICBpbnQgY3VycmVudEZpbGVSZXF1ZXN0cyA9IDA7CiAgZmluYWwgTGlzdDxGaWxlUmVxdWVzdD4gX2ZpbGVSZXF1ZXN0UXVldWUgPSBuZXcgTGlzdDxGaWxlUmVxdWVzdD4oKTsKCiAgYm9vbCBnZXQgc2hvdWxkSXNzdWVGaWxlUmVxdWVzdCA9PiBjdXJyZW50RmlsZVJlcXVlc3RzIDwgX21heEZpbGVSZXF1ZXN0czsKICB2b2lkIGVucXVldWVGaWxlUmVxdWVzdChGaWxlUmVxdWVzdCBmcikgewogICAgX2ZpbGVSZXF1ZXN0UXVldWUuYWRkKGZyKTsKICB9CgogIEZpbGVSZXF1ZXN0IGRlcXVldWVGaWxlUmVxdWVzdCgpIHsKICAgIGlmIChfZmlsZVJlcXVlc3RRdWV1ZS5sZW5ndGggPT0gMCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBfZmlsZVJlcXVlc3RRdWV1ZS5yZW1vdmVBdCgwKTsKICB9CgogIF9zZXRQYWNrYWdlUm9vdChTdHJpbmcgcGFja2FnZVJvb3QpIHsKICAgIHBhY2thZ2VSb290ID0gX3Nhbml0aXplV2luZG93c1BhdGgocGFja2FnZVJvb3QpOwogICAgaWYgKHBhY2thZ2VSb290LnN0YXJ0c1dpdGgoJ2ZpbGU6JykgfHwKICAgICAgICBwYWNrYWdlUm9vdC5zdGFydHNXaXRoKCdodHRwOicpIHx8CiAgICAgICAgcGFja2FnZVJvb3Quc3RhcnRzV2l0aCgnaHR0cHM6JykpIHsKICAgICAgcGFja2FnZVJvb3QgPSBfZW5mb3JjZVRyYWlsaW5nU2xhc2gocGFja2FnZVJvb3QpOwogICAgICBfcGFja2FnZVJvb3QgPSBfd29ya2luZ0RpcmVjdG9yeS5yZXNvbHZlKHBhY2thZ2VSb290KTsKICAgIH0gZWxzZSB7CiAgICAgIHBhY2thZ2VSb290ID0gX3Nhbml0aXplV2luZG93c1BhdGgocGFja2FnZVJvb3QpOwogICAgICBwYWNrYWdlUm9vdCA9IF90cmltV2luZG93c1BhdGgocGFja2FnZVJvb3QpOwogICAgICBfcGFja2FnZVJvb3QgPQogICAgICAgICAgX3dvcmtpbmdEaXJlY3RvcnkucmVzb2x2ZVVyaShuZXcgVXJpLmRpcmVjdG9yeShwYWNrYWdlUm9vdCkpOwogICAgfQogIH0KCiAgX3NldFBhY2thZ2VzQ29uZmlnKFN0cmluZyBwYWNrYWdlc1BhcmFtKSB7CiAgICB2YXIgcGFja2FnZXNOYW1lID0gX3Nhbml0aXplV2luZG93c1BhdGgocGFja2FnZXNQYXJhbSk7CiAgICB2YXIgcGFja2FnZXNVcmkgPSBVcmkucGFyc2UocGFja2FnZXNOYW1lKTsKICAgIGlmIChwYWNrYWdlc1VyaS5zY2hlbWUgPT0gJycpIHsKICAgICAgLy8gU2NyaXB0IGRvZXMgbm90IGhhdmUgYSBzY2hlbWUsIGFzc3VtZSB0aGF0IGl0IGlzIGEgcGF0aCwKICAgICAgLy8gcmVzb2x2ZSBpdCBhZ2FpbnN0IHRoZSB3b3JraW5nIGRpcmVjdG9yeS4KICAgICAgcGFja2FnZXNVcmkgPSBfd29ya2luZ0RpcmVjdG9yeS5yZXNvbHZlVXJpKHBhY2thZ2VzVXJpKTsKICAgIH0KICAgIF9yZXF1ZXN0UGFja2FnZXNNYXAocGFja2FnZXNVcmkpOwogICAgX3BlbmRpbmdQYWNrYWdlTG9hZHMuYWRkKCgpIHsKICAgICAgLy8gRHVtbXkgYWN0aW9uLgogICAgfSk7CiAgfQoKICAvLyBIYW5kbGluZyBvZiBhY2Nlc3MgdG8gdGhlIHBhY2thZ2Ugcm9vdCBvciBwYWNrYWdlIG1hcCBmcm9tIHVzZXIgY29kZS4KICBfdHJpZ2dlclBhY2thZ2VSZXNvbHV0aW9uKGFjdGlvbikgewogICAgaWYgKF9wYWNrYWdlc1JlYWR5KSB7CiAgICAgIC8vIFBhY2thZ2VzIGFyZSByZWFkeS4gRXhlY3V0ZSB0aGUgYWN0aW9uIG5vdy4KICAgICAgYWN0aW9uKCk7CiAgICB9IGVsc2UgewogICAgICBpZiAoX3BlbmRpbmdQYWNrYWdlTG9hZHMuaXNFbXB0eSkgewogICAgICAgIC8vIFBhY2thZ2UgcmVzb2x1dGlvbiBoYXMgbm90IGJlZW4gc2V0dXAgeWV0LCBhbmQgdGhpcyBpcyB0aGUgZmlyc3QKICAgICAgICAvLyByZXF1ZXN0IGZvciBwYWNrYWdlIHJlc29sdXRpb24gJiBsb2FkaW5nLgogICAgICAgIF9yZXF1ZXN0UGFja2FnZXNNYXAoKTsKICAgICAgfQogICAgICAvLyBSZWdpc3RlciB0aGUgYWN0aW9uIGZvciB3aGVuIHRoZSBwYWNrYWdlIHJlc29sdXRpb24gaXMgcmVhZHkuCiAgICAgIF9wZW5kaW5nUGFja2FnZUxvYWRzLmFkZChhY3Rpb24pOwogICAgfQogIH0KCiAgLy8gQSBsaXN0IG9mIGNhbGxiYWNrcyB3aGljaCBzaG91bGQgYmUgaW52b2tlZCBhZnRlciB0aGUgcGFja2FnZSBtYXAgaGFzIGJlZW4KICAvLyBsb2FkZWQuCiAgTGlzdDxGdW5jdGlvbj4gX3BlbmRpbmdQYWNrYWdlTG9hZHMgPSBbXTsKCiAgLy8gR2l2ZW4gYSB1cmkgd2l0aCBhICdwYWNrYWdlJyBzY2hlbWUsIHJldHVybiBhIFVyaSB0aGF0IGlzIHByZWZpeGVkIHdpdGgKICAvLyB0aGUgcGFja2FnZSByb290IG9yIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZSBwYWNrYWdlIGNvbmZpZ3VyYXRpb24uCiAgVXJpIF9yZXNvbHZlUGFja2FnZVVyaShVcmkgdXJpKSB7CiAgICBhc3NlcnQodXJpLnNjaGVtZSA9PSAicGFja2FnZSIpOwogICAgYXNzZXJ0KF9wYWNrYWdlc1JlYWR5KTsKCiAgICBpZiAodXJpLmhvc3QuaXNOb3RFbXB0eSkgewogICAgICB2YXIgcGF0aCA9ICcke3VyaS5ob3N0fSR7dXJpLnBhdGh9JzsKICAgICAgdmFyIHJpZ2h0ID0gJ3BhY2thZ2U6JHBhdGgnOwogICAgICB2YXIgd3JvbmcgPSAncGFja2FnZTovLyRwYXRoJzsKCiAgICAgIHRocm93ICJVUklzIHVzaW5nIHRoZSAncGFja2FnZTonIHNjaGVtZSBzaG91bGQgbG9vayBsaWtlICIKICAgICAgICAgICInJHJpZ2h0Jywgbm90ICckd3JvbmcnLiI7CiAgICB9CgogICAgdmFyIHBhY2thZ2VOYW1lRW5kID0gdXJpLnBhdGguaW5kZXhPZignLycpOwogICAgaWYgKHBhY2thZ2VOYW1lRW5kID09IDApIHsKICAgICAgLy8gUGFja2FnZSBVUklzIG11c3QgaGF2ZSBhIG5vbi1lbXB0eSBwYWNrYWdlIG5hbWUgKG5vdCBzdGFydCB3aXRoICIvIikuCiAgICAgIHRocm93ICJVUklTIHVzaW5nIHRoZSAncGFja2FnZTonIHNjaGVtZSBzaG91bGQgbG9vayBsaWtlICIKICAgICAgICAgICIncGFja2FnZTpwYWNrYWdlTmFtZSR7dXJpLnBhdGh9Jywgbm90ICdwYWNrYWdlOiR7dXJpLnBhdGh9JyI7CiAgICB9CiAgICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgICBfbG9nKCdSZXNvbHZpbmcgcGFja2FnZSB3aXRoIHVyaSBwYXRoOiAke3VyaS5wYXRofScpOwogICAgfQogICAgdmFyIHJlc29sdmVkVXJpOwogICAgaWYgKF9wYWNrYWdlRXJyb3IgIT0gbnVsbCkgewogICAgICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgICAgIF9sb2coIlJlc29sdmluZyBwYWNrYWdlIHdpdGggcGVuZGluZyByZXNvbHV0aW9uIGVycm9yOiAkX3BhY2thZ2VFcnJvciIpOwogICAgICB9CiAgICAgIHRocm93IF9wYWNrYWdlRXJyb3I7CiAgICB9IGVsc2UgaWYgKF9wYWNrYWdlUm9vdCAhPSBudWxsKSB7CiAgICAgIHJlc29sdmVkVXJpID0gX3BhY2thZ2VSb290LnJlc29sdmUodXJpLnBhdGgpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKHBhY2thZ2VOYW1lRW5kIDwgMCkgewogICAgICAgIC8vIFBhY2thZ2UgVVJJcyBtdXN0IGhhdmUgYSBwYXRoIGFmdGVyIHRoZSBwYWNrYWdlIG5hbWUsIGV2ZW4gaWYgaXQncwogICAgICAgIC8vIGp1c3QgIi8iLgogICAgICAgIHRocm93ICJVUklTIHVzaW5nIHRoZSAncGFja2FnZTonIHNjaGVtZSBzaG91bGQgbG9vayBsaWtlICIKICAgICAgICAgICAgIidwYWNrYWdlOiR7dXJpLnBhdGh9LycsIG5vdCAncGFja2FnZToke3VyaS5wYXRofSciOwogICAgICB9CiAgICAgIHZhciBwYWNrYWdlTmFtZSA9IHVyaS5wYXRoLnN1YnN0cmluZygwLCBwYWNrYWdlTmFtZUVuZCk7CiAgICAgIHZhciBtYXBwaW5nID0gX3BhY2thZ2VNYXBbcGFja2FnZU5hbWVdOwogICAgICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgICAgIF9sb2coIk1hcHBlZCAnJHBhY2thZ2VOYW1lJyBwYWNrYWdlIHRvICckbWFwcGluZyciKTsKICAgICAgfQogICAgICBpZiAobWFwcGluZyA9PSBudWxsKSB7CiAgICAgICAgdGhyb3cgIk5vIG1hcHBpbmcgZm9yICckcGFja2FnZU5hbWUnIHBhY2thZ2Ugd2hlbiByZXNvbHZpbmcgJyR1cmknLiI7CiAgICAgIH0KICAgICAgdmFyIHBhdGg7CiAgICAgIGFzc2VydCh1cmkucGF0aC5sZW5ndGggPiBwYWNrYWdlTmFtZS5sZW5ndGgpOwogICAgICBwYXRoID0gdXJpLnBhdGguc3Vic3RyaW5nKHBhY2thZ2VOYW1lLmxlbmd0aCArIDEpOwogICAgICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgICAgIF9sb2coIlBhdGggdG8gYmUgcmVzb2x2ZWQgaW4gcGFja2FnZTogJHBhdGgiKTsKICAgICAgfQogICAgICByZXNvbHZlZFVyaSA9IG1hcHBpbmcucmVzb2x2ZShwYXRoKTsKICAgIH0KICAgIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICAgIF9sb2coIlJlc29sdmVkICckdXJpJyB0byAnJHJlc29sdmVkVXJpJy4iKTsKICAgIH0KICAgIHJldHVybiByZXNvbHZlZFVyaTsKICB9CgogIFJhd1JlY2VpdmVQb3J0IF9wYWNrYWdlc1BvcnQ7CgogIHZvaWQgX3JlcXVlc3RQYWNrYWdlc01hcChbVXJpIHBhY2thZ2VDb25maWddKSB7CiAgICBpZiAoX3BhY2thZ2VzUG9ydCAhPSBudWxsKSB7CiAgICAgIC8vIEFscmVhZHkgc2NoZWR1bGVkLgogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBDcmVhdGUgYSBwb3J0IHRvIHJlY2VpdmUgdGhlIHBhY2thZ2VzIG1hcCBvbi4KICAgIF9wYWNrYWdlc1BvcnQgPSBuZXcgUmF3UmVjZWl2ZVBvcnQoX2hhbmRsZVBhY2thZ2VzUmVwbHkpOwogICAgdmFyIHNwID0gX3BhY2thZ2VzUG9ydC5zZW5kUG9ydDsKCiAgICBpZiAocGFja2FnZUNvbmZpZyAhPSBudWxsKSB7CiAgICAgIC8vIEV4cGxpY2l0bHkgc3BlY2lmaWVkIC5wYWNrYWdlcyBwYXRoLgogICAgICBfaGFuZGxlUGFja2FnZXNSZXF1ZXN0KHNwLCBfdHJhY2VMb2FkaW5nLCAtMiwgcGFja2FnZUNvbmZpZyk7CiAgICB9IGVsc2UgewogICAgICAvLyBTZWFyY2ggZm9yIC5wYWNrYWdlcyBzdGFydGluZyBhdCB0aGUgcm9vdCBzY3JpcHQuCiAgICAgIF9oYW5kbGVQYWNrYWdlc1JlcXVlc3Qoc3AsIF90cmFjZUxvYWRpbmcsIC0xLCBfcm9vdFNjcmlwdCk7CiAgICB9CgogICAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgICAgX2xvZygiUmVxdWVzdGVkIHBhY2thZ2VzIG1hcCBmb3IgJyRfcm9vdFNjcmlwdCcuIik7CiAgICB9CiAgfQoKICB2b2lkIF9oYW5kbGVQYWNrYWdlc1JlcGx5KG1zZykgewogICAgaWYgKF9wYWNrYWdlc1BvcnQgPT0gbnVsbCkgewogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBNYWtlIHN1cmUgdG8gY2xvc2UgdGhlIF9wYWNrYWdlUG9ydCBiZWZvcmUgYW55IG90aGVyIGFjdGlvbi4KICAgIF9wYWNrYWdlc1BvcnQuY2xvc2UoKTsKICAgIF9wYWNrYWdlc1BvcnQgPSBudWxsOwoKICAgIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICAgIF9sb2coIkdvdCBwYWNrYWdlcyByZXBseTogJG1zZyIpOwogICAgfQogICAgaWYgKG1zZyBpcyBTdHJpbmcpIHsKICAgICAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgICAgICBfbG9nKCJHb3QgZmFpbHVyZSByZXNwb25zZSBvbiBwYWNrYWdlIHBvcnQ6ICckbXNnJyIpOwogICAgICB9CiAgICAgIC8vIFJlbWVtYmVyIHRoZSBlcnJvciBtZXNzYWdlLgogICAgICBfcGFja2FnZUVycm9yID0gbXNnOwogICAgfSBlbHNlIGlmIChtc2cgaXMgTGlzdCkgewogICAgICBpZiAobXNnLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgICAgICAgIF9sb2coIlJlY2VpdmVkIHBhY2thZ2Ugcm9vdDogJyR7bXNnWzBdfSciKTsKICAgICAgICB9CiAgICAgICAgX3BhY2thZ2VSb290ID0gVXJpLnBhcnNlKG1zZ1swXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gRmlyc3QgZW50cnkgY29udGFpbnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBsb2FkZWQgLnBhY2thZ2VzIGZpbGUuCiAgICAgICAgYXNzZXJ0KChtc2cubGVuZ3RoICUgMikgPT0gMCk7CiAgICAgICAgYXNzZXJ0KG1zZy5sZW5ndGggPj0gMik7CiAgICAgICAgYXNzZXJ0KG1zZ1sxXSA9PSBudWxsKTsKICAgICAgICBfcGFja2FnZUNvbmZpZyA9IFVyaS5wYXJzZShtc2dbMF0pOwogICAgICAgIF9wYWNrYWdlTWFwID0gbmV3IE1hcDxTdHJpbmcsIFVyaT4oKTsKICAgICAgICBmb3IgKHZhciBpID0gMjsgaSA8IG1zZy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgLy8gVE9ETyhpcG9zdmEpOiBDb21wbGFpbiBhYm91dCBkdXBsaWNhdGUgZW50cmllcy4KICAgICAgICAgIF9wYWNrYWdlTWFwW21zZ1tpXV0gPSBVcmkucGFyc2UobXNnW2kgKyAxXSk7CiAgICAgICAgfQogICAgICAgIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICAgICAgICBfbG9nKCJTZXR1cCBwYWNrYWdlIG1hcDogJF9wYWNrYWdlTWFwIik7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBfcGFja2FnZUVycm9yID0gIkJhZCB0eXBlIG9mIHBhY2thZ2VzIHJlcGx5OiAke21zZy5ydW50aW1lVHlwZX0iOwogICAgICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgICAgIF9sb2coX3BhY2thZ2VFcnJvcik7CiAgICAgIH0KICAgIH0KCiAgICAvLyBSZXNvbHZlIGFsbCBwZW5kaW5nIHBhY2thZ2UgbG9hZHMgbm93IHRoYXQgd2Uga25vdyBob3cgdG8gcmVzb2x2ZSB0aGVtLgogICAgd2hpbGUgKF9wZW5kaW5nUGFja2FnZUxvYWRzLmxlbmd0aCA+IDApIHsKICAgICAgLy8gT3JkZXIgZG9lcyBub3QgbWF0dGVyIGFzIHdlIHF1ZXVlIGFsbCBvZiB0aGUgcmVxdWVzdHMgdXAgcmlnaHQgbm93LgogICAgICB2YXIgcmVxID0gX3BlbmRpbmdQYWNrYWdlTG9hZHMucmVtb3ZlTGFzdCgpOwogICAgICAvLyBDYWxsIHRoZSByZWdpc3RlcmVkIGNsb3N1cmUsIHRvIGhhbmRsZSB0aGUgZGVsYXllZCBhY3Rpb24uCiAgICAgIHJlcSgpOwogICAgfQogICAgLy8gUmVzZXQgdGhlIHBlbmRpbmcgcGFja2FnZSBsb2FkcyB0byBlbXB0eS4gU28gdGhhdCB3ZSBldmVudHVhbGx5IGNhbgogICAgLy8gZmluaXNoIGxvYWRpbmcuCiAgICBfcGVuZGluZ1BhY2thZ2VMb2FkcyA9IFtdOwogIH0KfQoKX2xvZyhtc2cpIHsKICBwcmludCgiJSAkbXNnIik7Cn0KCnZhciBfaHR0cENsaWVudDsKCi8vIFNlbmQgYSByZXNwb25zZSB0byB0aGUgcmVxdWVzdGluZyBpc29sYXRlLgp2b2lkIF9zZW5kUmVzb3VyY2VSZXNwb25zZShTZW5kUG9ydCBzcCwgaW50IHRhZywgVXJpIHVyaSwgVXJpIHJlc29sdmVkVXJpLAogICAgU3RyaW5nIGxpYnJhcnlVcmwsIGR5bmFtaWMgZGF0YSkgewogIGFzc2VydCgoZGF0YSBpcyBMaXN0PGludD4pIHx8IChkYXRhIGlzIFN0cmluZykpOwogIHZhciBtc2cgPSBuZXcgTGlzdCg1KTsKICBpZiAoZGF0YSBpcyBTdHJpbmcpIHsKICAgIC8vIFdlIGVuY291bnRlcmVkIGFuIGVycm9yLCBmbGlwIHRoZSBzaWduIG9mIHRoZSB0YWcgdG8gaW5kaWNhdGUgdGhhdC4KICAgIHRhZyA9IC10YWc7CiAgICBpZiAobGlicmFyeVVybCA9PSBudWxsKSB7CiAgICAgIGRhdGEgPSAnQ291bGQgbm90IGxvYWQgIiR1cmkiOiAkZGF0YSc7CiAgICB9IGVsc2UgewogICAgICBkYXRhID0gJ0NvdWxkIG5vdCBpbXBvcnQgIiR1cmkiIGZyb20gIiRsaWJyYXJ5VXJsIjogJGRhdGEnOwogICAgfQogIH0KICBtc2dbMF0gPSB0YWc7CiAgbXNnWzFdID0gdXJpLnRvU3RyaW5nKCk7CiAgbXNnWzJdID0gcmVzb2x2ZWRVcmkudG9TdHJpbmcoKTsKICBtc2dbM10gPSBsaWJyYXJ5VXJsOwogIG1zZ1s0XSA9IGRhdGE7CiAgc3Auc2VuZChtc2cpOwp9CgovLyBTZW5kIGEgcmVzcG9uc2UgdG8gdGhlIHJlcXVlc3RpbmcgaXNvbGF0ZS4Kdm9pZCBfc2VuZEV4dGVuc2lvbkltcG9ydFJlc3BvbnNlKAogICAgU2VuZFBvcnQgc3AsIFVyaSB1cmksIFN0cmluZyBsaWJyYXJ5VXJsLCBTdHJpbmcgcmVzb2x2ZWRVcmkpIHsKICB2YXIgbXNnID0gbmV3IExpc3QoNSk7CiAgaW50IHRhZyA9IF9EYXJ0X2tJbXBvcnRFeHRlbnNpb247CiAgaWYgKHJlc29sdmVkVXJpID09IG51bGwpIHsKICAgIC8vIFdlIGNvdWxkIG5vdCByZXNvbHZlIHRoZSBkYXJ0LWV4dDogdXJpLgogICAgdGFnID0gLXRhZzsKICAgIHJlc29sdmVkVXJpID0gJ0NvdWxkIG5vdCByZXNvbHZlICIkdXJpIiBmcm9tICIkbGlicmFyeVVybCInOwogIH0KICBtc2dbMF0gPSB0YWc7CiAgbXNnWzFdID0gdXJpLnRvU3RyaW5nKCk7CiAgbXNnWzJdID0gcmVzb2x2ZWRVcmk7CiAgbXNnWzNdID0gbGlicmFyeVVybDsKICBtc2dbNF0gPSByZXNvbHZlZFVyaTsKICBzcC5zZW5kKG1zZyk7Cn0KCnZvaWQgX2xvYWRIdHRwKAogICAgU2VuZFBvcnQgc3AsIGludCB0YWcsIFVyaSB1cmksIFVyaSByZXNvbHZlZFVyaSwgU3RyaW5nIGxpYnJhcnlVcmwpIHsKICBpZiAoX2h0dHBDbGllbnQgPT0gbnVsbCkgewogICAgX2h0dHBDbGllbnQgPSBuZXcgSHR0cENsaWVudCgpLi5tYXhDb25uZWN0aW9uc1Blckhvc3QgPSA2OwogIH0KICBfaHR0cENsaWVudAogICAgICAuZ2V0VXJsKHJlc29sdmVkVXJpKQogICAgICAudGhlbigoSHR0cENsaWVudFJlcXVlc3QgcmVxdWVzdCkgPT4gcmVxdWVzdC5jbG9zZSgpKQogICAgICAudGhlbigoSHR0cENsaWVudFJlc3BvbnNlIHJlc3BvbnNlKSB7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBCeXRlc0J1aWxkZXIoY29weTogZmFsc2UpOwogICAgcmVzcG9uc2UubGlzdGVuKGJ1aWxkZXIuYWRkLCBvbkRvbmU6ICgpIHsKICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT0gMjAwKSB7CiAgICAgICAgdmFyIG1zZyA9ICJGYWlsdXJlIGdldHRpbmcgJHJlc29sdmVkVXJpOlxuIgogICAgICAgICAgICAiICAke3Jlc3BvbnNlLnN0YXR1c0NvZGV9ICR7cmVzcG9uc2UucmVhc29uUGhyYXNlfSI7CiAgICAgICAgX3NlbmRSZXNvdXJjZVJlc3BvbnNlKHNwLCB0YWcsIHVyaSwgcmVzb2x2ZWRVcmksIGxpYnJhcnlVcmwsIG1zZyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX3NlbmRSZXNvdXJjZVJlc3BvbnNlKAogICAgICAgICAgICBzcCwgdGFnLCB1cmksIHJlc29sdmVkVXJpLCBsaWJyYXJ5VXJsLCBidWlsZGVyLnRha2VCeXRlcygpKTsKICAgICAgfQogICAgfSwgb25FcnJvcjogKGUpIHsKICAgICAgX3NlbmRSZXNvdXJjZVJlc3BvbnNlKAogICAgICAgICAgc3AsIHRhZywgdXJpLCByZXNvbHZlZFVyaSwgbGlicmFyeVVybCwgZS50b1N0cmluZygpKTsKICAgIH0pOwogIH0pLmNhdGNoRXJyb3IoKGUpIHsKICAgIF9zZW5kUmVzb3VyY2VSZXNwb25zZShzcCwgdGFnLCB1cmksIHJlc29sdmVkVXJpLCBsaWJyYXJ5VXJsLCBlLnRvU3RyaW5nKCkpOwogIH0pOwogIC8vIEl0J3MganVzdCBoZXJlIHRvIHB1c2ggYW4gZXZlbnQgb24gdGhlIGV2ZW50IGxvb3Agc28gdGhhdCB3ZSBpbnZva2UgdGhlCiAgLy8gc2NoZWR1bGVkIG1pY3JvdGFza3MuCiAgVGltZXIucnVuKCgpIHt9KTsKfQoKdm9pZCBfbG9hZEZpbGUoSXNvbGF0ZUxvYWRlclN0YXRlIGxvYWRlclN0YXRlLCBTZW5kUG9ydCBzcCwgaW50IHRhZywgVXJpIHVyaSwKICAgIFVyaSByZXNvbHZlZFVyaSwgU3RyaW5nIGxpYnJhcnlVcmwpIHsKICB2YXIgcGF0aCA9IHJlc29sdmVkVXJpLnRvRmlsZVBhdGgoKTsKICB2YXIgc291cmNlRmlsZSA9IG5ldyBGaWxlKHBhdGgpOwogIHNvdXJjZUZpbGUucmVhZEFzQnl0ZXMoKS50aGVuKChkYXRhKSB7CiAgICBfc2VuZFJlc291cmNlUmVzcG9uc2Uoc3AsIHRhZywgdXJpLCByZXNvbHZlZFVyaSwgbGlicmFyeVVybCwgZGF0YSk7CiAgfSwgb25FcnJvcjogKGUpIHsKICAgIF9zZW5kUmVzb3VyY2VSZXNwb25zZShzcCwgdGFnLCB1cmksIHJlc29sdmVkVXJpLCBsaWJyYXJ5VXJsLCBlLnRvU3RyaW5nKCkpOwogIH0pLndoZW5Db21wbGV0ZSgoKSB7CiAgICBsb2FkZXJTdGF0ZS5jdXJyZW50RmlsZVJlcXVlc3RzLS07CiAgICB3aGlsZSAobG9hZGVyU3RhdGUuc2hvdWxkSXNzdWVGaWxlUmVxdWVzdCkgewogICAgICBGaWxlUmVxdWVzdCBmciA9IGxvYWRlclN0YXRlLmRlcXVldWVGaWxlUmVxdWVzdCgpOwogICAgICBpZiAoZnIgPT0gbnVsbCkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIF9sb2FkRmlsZSgKICAgICAgICAgIGxvYWRlclN0YXRlLCBmci5zcCwgZnIudGFnLCBmci51cmksIGZyLnJlc29sdmVkVXJpLCBmci5saWJyYXJ5VXJsKTsKICAgICAgbG9hZGVyU3RhdGUuY3VycmVudEZpbGVSZXF1ZXN0cysrOwogICAgfQogIH0pOwp9Cgp2b2lkIF9sb2FkRGF0YVVyaSgKICAgIFNlbmRQb3J0IHNwLCBpbnQgdGFnLCBVcmkgdXJpLCBVcmkgcmVzb2x2ZWRVcmksIFN0cmluZyBsaWJyYXJ5VXJsKSB7CiAgdHJ5IHsKICAgIHZhciBtaW1lID0gdXJpLmRhdGEubWltZVR5cGU7CiAgICBpZiAoKG1pbWUgIT0gImFwcGxpY2F0aW9uL2RhcnQiKSAmJiAobWltZSAhPSAidGV4dC9wbGFpbiIpKSB7CiAgICAgIHRocm93ICJNSU1FLXR5cGUgbXVzdCBiZSBhcHBsaWNhdGlvbi9kYXJ0IG9yIHRleHQvcGxhaW46ICRtaW1lIGdpdmVuLiI7CiAgICB9CiAgICB2YXIgY2hhcnNldCA9IHVyaS5kYXRhLmNoYXJzZXQ7CiAgICBpZiAoKGNoYXJzZXQgIT0gInV0Zi04IikgJiYgKGNoYXJzZXQgIT0gIlVTLUFTQ0lJIikpIHsKICAgICAgLy8gVGhlIEMrKyBwb3J0aW9uIG9mIHRoZSBlbWJlZGRlciBhc3N1bWVzIFVURi04LgogICAgICB0aHJvdyAiT25seSB1dGYtOCBvciBVUy1BU0NJSSBlbmNvZGluZ3MgYXJlIHN1cHBvcnRlZDogJGNoYXJzZXQgZ2l2ZW4uIjsKICAgIH0KICAgIF9zZW5kUmVzb3VyY2VSZXNwb25zZSgKICAgICAgICBzcCwgdGFnLCB1cmksIHJlc29sdmVkVXJpLCBsaWJyYXJ5VXJsLCB1cmkuZGF0YS5jb250ZW50QXNCeXRlcygpKTsKICB9IGNhdGNoIChlKSB7CiAgICBfc2VuZFJlc291cmNlUmVzcG9uc2Uoc3AsIHRhZywgdXJpLCByZXNvbHZlZFVyaSwgbGlicmFyeVVybCwKICAgICAgICAiSW52YWxpZCBkYXRhIHVyaSAoJHVyaSk6XG4gICRlIik7CiAgfQp9CgovLyBMb2FkaW5nIGEgcGFja2FnZSBVUkkgbmVlZHMgdG8gZmlyc3QgbWFwIHRoZSBwYWNrYWdlIG5hbWUgdG8gYSBsb2FkYWJsZQovLyBVUkkuCl9sb2FkUGFja2FnZShJc29sYXRlTG9hZGVyU3RhdGUgbG9hZGVyU3RhdGUsIFNlbmRQb3J0IHNwLCBib29sIHRyYWNlTG9hZGluZywKICAgIGludCB0YWcsIFVyaSB1cmksIFVyaSByZXNvbHZlZFVyaSwgU3RyaW5nIGxpYnJhcnlVcmwpIHsKICBpZiAobG9hZGVyU3RhdGUuX3BhY2thZ2VzUmVhZHkpIHsKICAgIHZhciByZXNvbHZlZFVyaTsKICAgIHRyeSB7CiAgICAgIHJlc29sdmVkVXJpID0gbG9hZGVyU3RhdGUuX3Jlc29sdmVQYWNrYWdlVXJpKHVyaSk7CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgICBfbG9nKCJFeGNlcHRpb24gKCRlKSB3aGVuIHJlc29sdmluZyBwYWNrYWdlIFVSSTogJHVyaSIpOwogICAgICB9CiAgICAgIC8vIFJlcG9ydCBlcnJvci4KICAgICAgX3NlbmRSZXNvdXJjZVJlc3BvbnNlKAogICAgICAgICAgc3AsIHRhZywgdXJpLCByZXNvbHZlZFVyaSwgbGlicmFyeVVybCwgZS50b1N0cmluZygpKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gUmVjdXJzaXZlbHkgY2FsbCB3aXRoIHRoZSBuZXcgcmVzb2x2ZWQgdXJpLgogICAgX2hhbmRsZVJlc291cmNlUmVxdWVzdCgKICAgICAgICBsb2FkZXJTdGF0ZSwgc3AsIHRyYWNlTG9hZGluZywgdGFnLCB1cmksIHJlc29sdmVkVXJpLCBsaWJyYXJ5VXJsKTsKICB9IGVsc2UgewogICAgaWYgKGxvYWRlclN0YXRlLl9wZW5kaW5nUGFja2FnZUxvYWRzLmlzRW1wdHkpIHsKICAgICAgLy8gUGFja2FnZSByZXNvbHV0aW9uIGhhcyBub3QgYmVlbiBzZXR1cCB5ZXQsIGFuZCB0aGlzIGlzIHRoZSBmaXJzdAogICAgICAvLyByZXF1ZXN0IGZvciBwYWNrYWdlIHJlc29sdXRpb24gJiBsb2FkaW5nLgogICAgICBsb2FkZXJTdGF0ZS5fcmVxdWVzdFBhY2thZ2VzTWFwKCk7CiAgICB9CiAgICAvLyBSZWdpc3RlciB0aGUgYWN0aW9uIG9mIGxvYWRpbmcgdGhpcyBwYWNrYWdlIG9uY2UgdGhlIHBhY2thZ2UgcmVzb2x1dGlvbgogICAgLy8gaXMgcmVhZHkuCiAgICBsb2FkZXJTdGF0ZS5fcGVuZGluZ1BhY2thZ2VMb2Fkcy5hZGQoKCkgewogICAgICBfaGFuZGxlUmVzb3VyY2VSZXF1ZXN0KAogICAgICAgICAgbG9hZGVyU3RhdGUsIHNwLCB0cmFjZUxvYWRpbmcsIHRhZywgdXJpLCB1cmksIGxpYnJhcnlVcmwpOwogICAgfSk7CiAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgIF9sb2coIlBlbmRpbmcgcGFja2FnZSBsb2FkIG9mICckdXJpJzogIgogICAgICAgICAgIiR7bG9hZGVyU3RhdGUuX3BlbmRpbmdQYWNrYWdlTG9hZHMubGVuZ3RofSBwZW5kaW5nIik7CiAgICB9CiAgfQp9CgovLyBUT0RPKGpvaG5tY2N1dGNoYW4pOiBUaGlzIGFuZCBtb3N0IG90aGVyIHRvcCBsZXZlbCBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlCi8vIHNob3VsZCBiZSB0dXJuZWQgaW50byBtZXRob2RzIG9uIHRoZSBJc29sYXRlTG9hZGVyU3RhdGUgY2xhc3MuCl9oYW5kbGVSZXNvdXJjZVJlcXVlc3QoSXNvbGF0ZUxvYWRlclN0YXRlIGxvYWRlclN0YXRlLCBTZW5kUG9ydCBzcCwKICAgIGJvb2wgdHJhY2VMb2FkaW5nLCBpbnQgdGFnLCBVcmkgdXJpLCBVcmkgcmVzb2x2ZWRVcmksIFN0cmluZyBsaWJyYXJ5VXJsKSB7CiAgaWYgKHJlc29sdmVkVXJpLnNjaGVtZSA9PSAnJyB8fCByZXNvbHZlZFVyaS5zY2hlbWUgPT0gJ2ZpbGUnKSB7CiAgICBpZiAobG9hZGVyU3RhdGUuc2hvdWxkSXNzdWVGaWxlUmVxdWVzdCkgewogICAgICBfbG9hZEZpbGUobG9hZGVyU3RhdGUsIHNwLCB0YWcsIHVyaSwgcmVzb2x2ZWRVcmksIGxpYnJhcnlVcmwpOwogICAgICBsb2FkZXJTdGF0ZS5jdXJyZW50RmlsZVJlcXVlc3RzKys7CiAgICB9IGVsc2UgewogICAgICBGaWxlUmVxdWVzdCBmciA9IG5ldyBGaWxlUmVxdWVzdChzcCwgdGFnLCB1cmksIHJlc29sdmVkVXJpLCBsaWJyYXJ5VXJsKTsKICAgICAgbG9hZGVyU3RhdGUuZW5xdWV1ZUZpbGVSZXF1ZXN0KGZyKTsKICAgIH0KICB9IGVsc2UgaWYgKChyZXNvbHZlZFVyaS5zY2hlbWUgPT0gJ2h0dHAnKSB8fAogICAgICAocmVzb2x2ZWRVcmkuc2NoZW1lID09ICdodHRwcycpKSB7CiAgICBfbG9hZEh0dHAoc3AsIHRhZywgdXJpLCByZXNvbHZlZFVyaSwgbGlicmFyeVVybCk7CiAgfSBlbHNlIGlmICgocmVzb2x2ZWRVcmkuc2NoZW1lID09ICdkYXRhJykpIHsKICAgIF9sb2FkRGF0YVVyaShzcCwgdGFnLCB1cmksIHJlc29sdmVkVXJpLCBsaWJyYXJ5VXJsKTsKICB9IGVsc2UgaWYgKChyZXNvbHZlZFVyaS5zY2hlbWUgPT0gJ3BhY2thZ2UnKSkgewogICAgX2xvYWRQYWNrYWdlKAogICAgICAgIGxvYWRlclN0YXRlLCBzcCwgdHJhY2VMb2FkaW5nLCB0YWcsIHVyaSwgcmVzb2x2ZWRVcmksIGxpYnJhcnlVcmwpOwogIH0gZWxzZSB7CiAgICBfc2VuZFJlc291cmNlUmVzcG9uc2UoCiAgICAgICAgc3AsCiAgICAgICAgdGFnLAogICAgICAgIHVyaSwKICAgICAgICByZXNvbHZlZFVyaSwKICAgICAgICBsaWJyYXJ5VXJsLAogICAgICAgICdVbmtub3duIHNjaGVtZSAoJHtyZXNvbHZlZFVyaS5zY2hlbWV9KSBmb3IgJwogICAgICAgICckcmVzb2x2ZWRVcmknKTsKICB9Cn0KCi8vIEhhbmRsaW5nIG9mIHBhY2thZ2VzIHJlcXVlc3RzLiBGaW5kaW5nIGFuZCBwYXJzaW5nIG9mIC5wYWNrYWdlcyBmaWxlIG9yCi8vIHBhY2thZ2VzLyBkaXJlY3Rvcmllcy4KY29uc3QgX0xGID0gMHgwQTsKY29uc3QgX0NSID0gMHgwRDsKY29uc3QgX1NQQUNFID0gMHgyMDsKY29uc3QgX0hBU0ggPSAweDIzOwpjb25zdCBfRE9UID0gMHgyRTsKY29uc3QgX0NPTE9OID0gMHgzQTsKY29uc3QgX0RFTCA9IDB4N0Y7Cgpjb25zdCBfaW52YWxpZFBhY2thZ2VOYW1lQ2hhcnMgPSBjb25zdCBbCiAgdHJ1ZSwgLy8gIHNwYWNlCiAgZmFsc2UsIC8vICEKICB0cnVlLCAvLyAgIgogIHRydWUsIC8vICAjCiAgZmFsc2UsIC8vICQKICB0cnVlLCAvLyAgJQogIGZhbHNlLCAvLyAmCiAgZmFsc2UsIC8vICcKICBmYWxzZSwgLy8gKAogIGZhbHNlLCAvLyApCiAgZmFsc2UsIC8vICoKICBmYWxzZSwgLy8gKwogIGZhbHNlLCAvLyAsCiAgZmFsc2UsIC8vIC0KICBmYWxzZSwgLy8gLgogIHRydWUsIC8vICAvCiAgZmFsc2UsIC8vIDAKICBmYWxzZSwgLy8gMQogIGZhbHNlLCAvLyAyCiAgZmFsc2UsIC8vIDMKICBmYWxzZSwgLy8gNAogIGZhbHNlLCAvLyA1CiAgZmFsc2UsIC8vIDYKICBmYWxzZSwgLy8gNwogIGZhbHNlLCAvLyA4CiAgZmFsc2UsIC8vIDkKICB0cnVlLCAvLyAgOgogIGZhbHNlLCAvLyA7CiAgdHJ1ZSwgLy8gIDwKICBmYWxzZSwgLy8gPQogIHRydWUsIC8vICA+CiAgdHJ1ZSwgLy8gID8KICBmYWxzZSwgLy8gQAogIGZhbHNlLCAvLyBBCiAgZmFsc2UsIC8vIEIKICBmYWxzZSwgLy8gQwogIGZhbHNlLCAvLyBECiAgZmFsc2UsIC8vIEUKICBmYWxzZSwgLy8gRgogIGZhbHNlLCAvLyBHCiAgZmFsc2UsIC8vIEgKICBmYWxzZSwgLy8gSQogIGZhbHNlLCAvLyBKCiAgZmFsc2UsIC8vIEsKICBmYWxzZSwgLy8gTAogIGZhbHNlLCAvLyBNCiAgZmFsc2UsIC8vIE4KICBmYWxzZSwgLy8gTwogIGZhbHNlLCAvLyBQCiAgZmFsc2UsIC8vIFEKICBmYWxzZSwgLy8gUgogIGZhbHNlLCAvLyBTCiAgZmFsc2UsIC8vIFQKICBmYWxzZSwgLy8gVQogIGZhbHNlLCAvLyBWCiAgZmFsc2UsIC8vIFcKICBmYWxzZSwgLy8gWAogIGZhbHNlLCAvLyBZCiAgZmFsc2UsIC8vIFoKICB0cnVlLCAvLyAgWwogIHRydWUsIC8vICBcCiAgdHJ1ZSwgLy8gIF0KICB0cnVlLCAvLyAgXgogIGZhbHNlLCAvLyBfCiAgdHJ1ZSwgLy8gIGAKICBmYWxzZSwgLy8gYQogIGZhbHNlLCAvLyBiCiAgZmFsc2UsIC8vIGMKICBmYWxzZSwgLy8gZAogIGZhbHNlLCAvLyBlCiAgZmFsc2UsIC8vIGYKICBmYWxzZSwgLy8gZwogIGZhbHNlLCAvLyBoCiAgZmFsc2UsIC8vIGkKICBmYWxzZSwgLy8gagogIGZhbHNlLCAvLyBrCiAgZmFsc2UsIC8vIGwKICBmYWxzZSwgLy8gbQogIGZhbHNlLCAvLyBuCiAgZmFsc2UsIC8vIG8KICBmYWxzZSwgLy8gcAogIGZhbHNlLCAvLyBxCiAgZmFsc2UsIC8vIHIKICBmYWxzZSwgLy8gcwogIGZhbHNlLCAvLyB0CiAgZmFsc2UsIC8vIHUKICBmYWxzZSwgLy8gdgogIGZhbHNlLCAvLyB3CiAgZmFsc2UsIC8vIHgKICBmYWxzZSwgLy8geQogIGZhbHNlLCAvLyB6CiAgdHJ1ZSwgLy8gIHsKICB0cnVlLCAvLyAgfAogIHRydWUsIC8vICB9CiAgZmFsc2UsIC8vIH4KICB0cnVlLCAvLyAgREVMCl07CgpfcGFyc2VQYWNrYWdlc0ZpbGUoCiAgICBTZW5kUG9ydCBzcCwgYm9vbCB0cmFjZUxvYWRpbmcsIFVyaSBwYWNrYWdlc0ZpbGUsIExpc3Q8aW50PiBkYXRhKSB7CiAgLy8gVGhlIGZpcnN0IGVudHJ5IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgaWRlbnRpZmllZCAucGFja2FnZXMgZmlsZQogIC8vIGluc3RlYWQgb2YgYSBtYXBwaW5nLgogIHZhciByZXN1bHQgPSBbcGFja2FnZXNGaWxlLnRvU3RyaW5nKCksIG51bGxdOwogIHZhciBpbmRleCA9IDA7CiAgdmFyIGxlbiA9IGRhdGEubGVuZ3RoOwogIHdoaWxlIChpbmRleCA8IGxlbikgewogICAgdmFyIHN0YXJ0ID0gaW5kZXg7CiAgICB2YXIgY2hhciA9IGRhdGFbaW5kZXhdOwogICAgaWYgKChjaGFyID09IF9DUikgfHwgKGNoYXIgPT0gX0xGKSkgewogICAgICAvLyBTa2lwcGluZyBlbXB0eSBsaW5lcy4KICAgICAgaW5kZXgrKzsKICAgICAgY29udGludWU7CiAgICB9CgogICAgLy8gSWRlbnRpZnkgc3BsaXQgd2l0aGluIHRoZSBsaW5lIGFuZCBlbmQgb2YgdGhlIGxpbmUuCiAgICB2YXIgc2VwYXJhdG9yID0gLTE7CiAgICB2YXIgZW5kID0gbGVuOwogICAgLy8gVmVyaWZ5aW5nIHZhbGlkaXR5IG9mIHBhY2thZ2UgbmFtZSB3aGlsZSBzY2FubmluZyB0aGUgbGluZS4KICAgIHZhciBub25Eb3QgPSBmYWxzZTsKICAgIHZhciBpbnZhbGlkUGFja2FnZU5hbWUgPSBmYWxzZTsKCiAgICAvLyBTY2FuIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUgb3IgZGF0YS4KICAgIHdoaWxlIChpbmRleCA8IGxlbikgewogICAgICBjaGFyID0gZGF0YVtpbmRleCsrXTsKICAgICAgLy8gSWYgd2UgaGF2ZSBub3QgcmVhY2hlZCB0aGUgc2VwYXJhdG9yIHlldCwgZGV0ZXJtaW5lIHdoZXRoZXIgd2UgYXJlCiAgICAgIC8vIHNjYW5uaW5nIGxlZ2FsIHBhY2thZ2UgbmFtZSBjaGFyYWN0ZXJzLgogICAgICBpZiAoc2VwYXJhdG9yID09IC0xKSB7CiAgICAgICAgaWYgKChjaGFyID09IF9DT0xPTikpIHsKICAgICAgICAgIC8vIFRoZSBmaXJzdCBjb2xvbiBvbiBhIGxpbmUgaXMgdGhlIHNlcGFyYXRvciBiZXR3ZWVuIHBhY2thZ2UgbmFtZSBhbmQKICAgICAgICAgIC8vIHJlbGF0ZWQgVVJJLgogICAgICAgICAgc2VwYXJhdG9yID0gaW5kZXggLSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBTdGlsbCBzY2FubmluZyB0aGUgcGFja2FnZSBuYW1lIHBhcnQuIENoZWNrIGZvciB0aGUgdmFsaWRpdHkgb2YKICAgICAgICAgIC8vIHRoZSBjaGFyYWN0ZXJzLgogICAgICAgICAgbm9uRG90ID0gbm9uRG90IHx8IChjaGFyICE9IF9ET1QpOwogICAgICAgICAgaW52YWxpZFBhY2thZ2VOYW1lID0gaW52YWxpZFBhY2thZ2VOYW1lIHx8CiAgICAgICAgICAgICAgKGNoYXIgPCBfU1BBQ0UpIHx8CiAgICAgICAgICAgICAgKGNoYXIgPiBfREVMKSB8fAogICAgICAgICAgICAgIF9pbnZhbGlkUGFja2FnZU5hbWVDaGFyc1tjaGFyIC0gX1NQQUNFXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gSWRlbnRpZnkgZW5kIG9mIGxpbmUuCiAgICAgIGlmICgoY2hhciA9PSBfQ1IpIHx8IChjaGFyID09IF9MRikpIHsKICAgICAgICBlbmQgPSBpbmRleCAtIDE7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICAvLyBObyBmdXJ0aGVyIGhhbmRsaW5nIG5lZWRlZCBmb3IgY29tbWVudCBsaW5lcy4KICAgIGlmIChkYXRhW3N0YXJ0XSA9PSBfSEFTSCkgewogICAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgICAgX2xvZygiU2tpcHBpbmcgY29tbWVudCBpbiAkcGFja2FnZXNGaWxlOlxuIgogICAgICAgICAgICAiJHtuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoZGF0YSwgc3RhcnQsIGVuZCl9Iik7CiAgICAgIH0KICAgICAgY29udGludWU7CiAgICB9CgogICAgLy8gQ2hlY2sgZm9yIGEgYmFkbHkgZm9ybWF0dGVkIGxpbmUsIHN0YXJ0aW5nIHdpdGggYSAnOicuCiAgICBpZiAoc2VwYXJhdG9yID09IHN0YXJ0KSB7CiAgICAgIHZhciBsaW5lID0gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKGRhdGEsIHN0YXJ0LCBlbmQpOwogICAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgICAgX2xvZygiTGluZSBzdGFydHMgd2l0aCAnOicgaW4gJHBhY2thZ2VzRmlsZTpcbiIKICAgICAgICAgICAgIiRsaW5lIik7CiAgICAgIH0KICAgICAgc3Auc2VuZCgiTWlzc2luZyBwYWNrYWdlIG5hbWUgaW4gJHBhY2thZ2VzRmlsZTpcbiIKICAgICAgICAgICIkbGluZSIpOwogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gRW5zdXJlIHRoZXJlIGlzIGEgc2VwYXJhdG9yIG9uIHRoZSBsaW5lLgogICAgaWYgKHNlcGFyYXRvciA9PSAtMSkgewogICAgICB2YXIgbGluZSA9IG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhkYXRhLCBzdGFydCwgZW5kKTsKICAgICAgaWYgKHRyYWNlTG9hZGluZykgewogICAgICAgIF9sb2coIkxpbmUgaGFzIG5vICc6JyBpbiAkcGFja2FnZXNGaWxlOlxuIgogICAgICAgICAgICAiJGxpbmUiKTsKICAgICAgfQogICAgICBzcC5zZW5kKCJNaXNzaW5nICc6JyBzZXBhcmF0b3IgaW4gJHBhY2thZ2VzRmlsZTpcbiIKICAgICAgICAgICIkbGluZSIpOwogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIHBhY2thZ2VOYW1lID0gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKGRhdGEsIHN0YXJ0LCBzZXBhcmF0b3IpOwoKICAgIC8vIENoZWNrIGZvciB2YWxpZCBwYWNrYWdlIG5hbWUuCiAgICBpZiAoaW52YWxpZFBhY2thZ2VOYW1lIHx8ICFub25Eb3QpIHsKICAgICAgdmFyIGxpbmUgPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoZGF0YSwgc3RhcnQsIGVuZCk7CiAgICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgICBfbG9nKCJJbnZhbGlkIHBhY2thZ2UgbmFtZSAkcGFja2FnZU5hbWUgaW4gJHBhY2thZ2VzRmlsZSIpOwogICAgICB9CiAgICAgIHNwLnNlbmQoIkludmFsaWQgcGFja2FnZSBuYW1lICckcGFja2FnZU5hbWUnIGluICRwYWNrYWdlc0ZpbGU6XG4iCiAgICAgICAgICAiJGxpbmUiKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgX2xvZygicGFja2FnZU5hbWU6ICRwYWNrYWdlTmFtZSIpOwogICAgfQogICAgdmFyIHBhY2thZ2VVcmkgPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoZGF0YSwgc2VwYXJhdG9yICsgMSwgZW5kKTsKICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgX2xvZygib3JpZ2luYWwgcGFja2FnZVVyaTogJHBhY2thZ2VVcmkiKTsKICAgIH0KICAgIC8vIEVuc3VyZSB0aGUgcGFja2FnZSB1cmkgZW5kcyB3aXRoIGEgLy4KICAgIGlmICghcGFja2FnZVVyaS5lbmRzV2l0aCgiLyIpKSB7CiAgICAgIHBhY2thZ2VVcmkgPSAiJHBhY2thZ2VVcmkvIjsKICAgIH0KICAgIHBhY2thZ2VVcmkgPSBwYWNrYWdlc0ZpbGUucmVzb2x2ZShwYWNrYWdlVXJpKS50b1N0cmluZygpOwogICAgaWYgKHRyYWNlTG9hZGluZykgewogICAgICBfbG9nKCJtYXBwaW5nOiAkcGFja2FnZU5hbWUgLT4gJHBhY2thZ2VVcmkiKTsKICAgIH0KICAgIHJlc3VsdC5hZGQocGFja2FnZU5hbWUpOwogICAgcmVzdWx0LmFkZChwYWNrYWdlVXJpKTsKICB9CgogIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgIF9sb2coIlBhcnNlZCBwYWNrYWdlcyBmaWxlIGF0ICRwYWNrYWdlc0ZpbGUuIFNlbmRpbmc6XG4kcmVzdWx0Iik7CiAgfQogIHNwLnNlbmQocmVzdWx0KTsKfQoKX2xvYWRQYWNrYWdlc0ZpbGUoU2VuZFBvcnQgc3AsIGJvb2wgdHJhY2VMb2FkaW5nLCBVcmkgcGFja2FnZXNGaWxlKSBhc3luYyB7CiAgdHJ5IHsKICAgIHZhciBkYXRhID0gYXdhaXQgbmV3IEZpbGUuZnJvbVVyaShwYWNrYWdlc0ZpbGUpLnJlYWRBc0J5dGVzKCk7CiAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgIF9sb2coIkxvYWRlZCBwYWNrYWdlcyBmaWxlIGZyb20gJHBhY2thZ2VzRmlsZTpcbiIKICAgICAgICAgICIke25ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhkYXRhKX0iKTsKICAgIH0KICAgIF9wYXJzZVBhY2thZ2VzRmlsZShzcCwgdHJhY2VMb2FkaW5nLCBwYWNrYWdlc0ZpbGUsIGRhdGEpOwogIH0gY2F0Y2ggKGUsIHMpIHsKICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgX2xvZygiRXJyb3IgbG9hZGluZyBwYWNrYWdlczogJGVcbiRzIik7CiAgICB9CiAgICBzcC5zZW5kKCJVbmNhdWdodCBlcnJvciAoJGUpIGxvYWRpbmcgcGFja2FnZXMgZmlsZS4iKTsKICB9Cn0KCl9maW5kUGFja2FnZXNGaWxlKFNlbmRQb3J0IHNwLCBib29sIHRyYWNlTG9hZGluZywgVXJpIGJhc2UpIGFzeW5jIHsKICB0cnkgewogICAgLy8gV2FsayB1cCB0aGUgZGlyZWN0b3J5IGhpZXJhcmNoeSB0byBjaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZgogICAgLy8gLnBhY2thZ2VzIGZpbGVzIGluIHBhcmVudCBkaXJlY3RvcmllcyBhbmQgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYQogICAgLy8gcGFja2FnZXMvIGRpcmVjdG9yeSBvbiB0aGUgZmlyc3QgaXRlcmF0aW9uLgogICAgdmFyIGRpciA9IG5ldyBGaWxlLmZyb21VcmkoYmFzZSkucGFyZW50OwogICAgdmFyIHByZXYgPSBudWxsOwogICAgLy8gS2VlcCBzZWFyY2hpbmcgdW50aWwgd2UgcmVhY2ggdGhlIHJvb3QuCiAgICB3aGlsZSAoKHByZXYgPT0gbnVsbCkgfHwgKHByZXYucGF0aCAhPSBkaXIucGF0aCkpIHsKICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYSAucGFja2FnZXMgZmlsZSBhbmQgaWYgaXQgZXhpc3RzIHRyeSB0bwogICAgICAvLyBsb2FkIGFuZCBwYXJzZSBpdC4KICAgICAgdmFyIGRpclVyaSA9IGRpci51cmk7CiAgICAgIHZhciBwYWNrYWdlc0ZpbGUgPSBkaXJVcmkucmVzb2x2ZSgiLnBhY2thZ2VzIik7CiAgICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgICBfbG9nKCJDaGVja2luZyBmb3IgJHBhY2thZ2VzRmlsZSBmaWxlLiIpOwogICAgICB9CiAgICAgIHZhciBleGlzdHMgPSBhd2FpdCBuZXcgRmlsZS5mcm9tVXJpKHBhY2thZ2VzRmlsZSkuZXhpc3RzKCk7CiAgICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgICBfbG9nKCIkcGFja2FnZXNGaWxlIGV4aXN0czogJGV4aXN0cyIpOwogICAgICB9CiAgICAgIGlmIChleGlzdHMpIHsKICAgICAgICBfbG9hZFBhY2thZ2VzRmlsZShzcCwgdHJhY2VMb2FkaW5nLCBwYWNrYWdlc0ZpbGUpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBNb3ZlIHVwIG9uZSBsZXZlbC4KICAgICAgcHJldiA9IGRpcjsKICAgICAgZGlyID0gZGlyLnBhcmVudDsKICAgIH0KCiAgICAvLyBObyAucGFja2FnZXMgZmlsZSB3YXMgZm91bmQuCiAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgIF9sb2coIkNvdWxkIG5vdCByZXNvbHZlIGEgcGFja2FnZSBsb2NhdGlvbiBmcm9tICRiYXNlIik7CiAgICB9CiAgICBzcC5zZW5kKCJDb3VsZCBub3QgcmVzb2x2ZSBhIHBhY2thZ2UgbG9jYXRpb24gZm9yIGJhc2UgYXQgJGJhc2UiKTsKICB9IGNhdGNoIChlLCBzKSB7CiAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgIF9sb2coIkVycm9yIGxvYWRpbmcgcGFja2FnZXM6ICRlXG4kcyIpOwogICAgfQogICAgc3Auc2VuZCgiVW5jYXVnaHQgZXJyb3IgKCRlKSBsb2FkaW5nIHBhY2thZ2VzIGZpbGUuIik7CiAgfQp9CgpGdXR1cmU8Ym9vbD4gX2xvYWRIdHRwUGFja2FnZXNGaWxlKAogICAgU2VuZFBvcnQgc3AsIGJvb2wgdHJhY2VMb2FkaW5nLCBVcmkgcmVzb3VyY2UpIGFzeW5jIHsKICB0cnkgewogICAgaWYgKF9odHRwQ2xpZW50ID09IG51bGwpIHsKICAgICAgX2h0dHBDbGllbnQgPSBuZXcgSHR0cENsaWVudCgpLi5tYXhDb25uZWN0aW9uc1Blckhvc3QgPSA2OwogICAgfQogICAgaWYgKHRyYWNlTG9hZGluZykgewogICAgICBfbG9nKCJGZXRjaGluZyBwYWNrYWdlcyBmaWxlIGZyb20gJyRyZXNvdXJjZScuIik7CiAgICB9CiAgICB2YXIgcmVxID0gYXdhaXQgX2h0dHBDbGllbnQuZ2V0VXJsKHJlc291cmNlKTsKICAgIHZhciByc3AgPSBhd2FpdCByZXEuY2xvc2UoKTsKICAgIHZhciBidWlsZGVyID0gbmV3IEJ5dGVzQnVpbGRlcihjb3B5OiBmYWxzZSk7CiAgICBhd2FpdCBmb3IgKHZhciBieXRlcyBpbiByc3ApIHsKICAgICAgYnVpbGRlci5hZGQoYnl0ZXMpOwogICAgfQogICAgaWYgKHJzcC5zdGF0dXNDb2RlICE9IDIwMCkgewogICAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgICAgX2xvZygiR290IHN0YXR1cyAke3JzcC5zdGF0dXNDb2RlfSBmZXRjaGluZyAnJHJlc291cmNlJy4iKTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICB2YXIgZGF0YSA9IGJ1aWxkZXIudGFrZUJ5dGVzKCk7CiAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgIF9sb2coIkxvYWRlZCBwYWNrYWdlcyBmaWxlIGZyb20gJyRyZXNvdXJjZSc6XG4iCiAgICAgICAgICAiJHtuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoZGF0YSl9Iik7CiAgICB9CiAgICBfcGFyc2VQYWNrYWdlc0ZpbGUoc3AsIHRyYWNlTG9hZGluZywgcmVzb3VyY2UsIGRhdGEpOwogIH0gY2F0Y2ggKGUsIHMpIHsKICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgX2xvZygiRXJyb3IgbG9hZGluZyBwYWNrYWdlcyBmaWxlIGZyb20gJyRyZXNvdXJjZSc6ICRlXG4kcyIpOwogICAgfQogICAgc3Auc2VuZCgiVW5jYXVnaHQgZXJyb3IgKCRlKSBsb2FkaW5nIHBhY2thZ2VzIGZpbGUgZnJvbSAnJHJlc291cmNlJy4iKTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CgpfbG9hZFBhY2thZ2VzRGF0YShzcCwgdHJhY2VMb2FkaW5nLCByZXNvdXJjZSkgewogIHRyeSB7CiAgICB2YXIgZGF0YSA9IHJlc291cmNlLmRhdGE7CiAgICB2YXIgbWltZSA9IGRhdGEubWltZVR5cGU7CiAgICBpZiAobWltZSAhPSAidGV4dC9wbGFpbiIpIHsKICAgICAgdGhyb3cgIk1JTUUtdHlwZSBtdXN0IGJlIHRleHQvcGxhaW46ICRtaW1lIGdpdmVuLiI7CiAgICB9CiAgICB2YXIgY2hhcnNldCA9IGRhdGEuY2hhcnNldDsKICAgIGlmICgoY2hhcnNldCAhPSAidXRmLTgiKSAmJiAoY2hhcnNldCAhPSAiVVMtQVNDSUkiKSkgewogICAgICAvLyBUaGUgQysrIHBvcnRpb24gb2YgdGhlIGVtYmVkZGVyIGFzc3VtZXMgVVRGLTguCiAgICAgIHRocm93ICJPbmx5IHV0Zi04IG9yIFVTLUFTQ0lJIGVuY29kaW5ncyBhcmUgc3VwcG9ydGVkOiAkY2hhcnNldCBnaXZlbi4iOwogICAgfQogICAgX3BhcnNlUGFja2FnZXNGaWxlKHNwLCB0cmFjZUxvYWRpbmcsIHJlc291cmNlLCBkYXRhLmNvbnRlbnRBc0J5dGVzKCkpOwogIH0gY2F0Y2ggKGUpIHsKICAgIHNwLnNlbmQoIlVuY2F1Z2h0IGVycm9yICgkZSkgbG9hZGluZyBwYWNrYWdlcyBkYXRhLiIpOwogIH0KfQoKLy8gVGhpcyBjb2RlIHVzZWQgdG8gZXhpc3QgaW4gYSBzZWNvbmQgaXNvbGF0ZSBhbmQgc28gaXQgdXNlcyBhIFNlbmRQb3J0IHRvCi8vIHJlcG9ydCBpdCdzIHJldHVybiB2YWx1ZS4gVGhpcyBjb3VsZCBiZSByZWZhY3RvcmVkIHNvIHRoYXQgaXQgcmV0dXJucyBpdCdzCi8vIHZhbHVlIGFuZCB0aGUgY2FsbGVyIGNvdWxkIHdhaXQgb24gdGhlIGZ1dHVyZSByYXRoZXIgdGhhbiBhIG1lc3NhZ2Ugb24KLy8gU2VuZFBvcnQuCl9oYW5kbGVQYWNrYWdlc1JlcXVlc3QoCiAgICBTZW5kUG9ydCBzcCwgYm9vbCB0cmFjZUxvYWRpbmcsIGludCB0YWcsIFVyaSByZXNvdXJjZSkgYXN5bmMgewogIHRyeSB7CiAgICBpZiAodGFnID09IC0xKSB7CiAgICAgIGlmIChyZXNvdXJjZS5zY2hlbWUgPT0gJycgfHwgcmVzb3VyY2Uuc2NoZW1lID09ICdmaWxlJykgewogICAgICAgIF9maW5kUGFja2FnZXNGaWxlKHNwLCB0cmFjZUxvYWRpbmcsIHJlc291cmNlKTsKICAgICAgfSBlbHNlIGlmICgocmVzb3VyY2Uuc2NoZW1lID09ICdodHRwJykgfHwgKHJlc291cmNlLnNjaGVtZSA9PSAnaHR0cHMnKSkgewogICAgICAgIC8vIFRyeSB0byBsb2FkIHRoZSAucGFja2FnZXMgZmlsZSBuZXh0IHRvIHRoZSByZXNvdXJjZS4KICAgICAgICB2YXIgcGFja2FnZXNVcmkgPSByZXNvdXJjZS5yZXNvbHZlKCIucGFja2FnZXMiKTsKICAgICAgICB2YXIgZXhpc3RzID0gYXdhaXQgX2xvYWRIdHRwUGFja2FnZXNGaWxlKHNwLCB0cmFjZUxvYWRpbmcsIHBhY2thZ2VzVXJpKTsKICAgICAgICBpZiAoIWV4aXN0cykgewogICAgICAgICAgLy8gTG9hZGluZyBvZiB0aGUgLnBhY2thZ2VzIGZpbGUgZmFpbGVkIGZvciBodHRwL2h0dHBzIGJhc2VkIHNjcmlwdHMKICAgICAgICAgIHNwLnNlbmQoW251bGxdKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3Auc2VuZCgiVW5zdXBwb3J0ZWQgc2NoZW1lIHVzZWQgdG8gbG9jYXRlIC5wYWNrYWdlcyBmaWxlOiAiCiAgICAgICAgICAgICInJHJlc291cmNlJy4iKTsKICAgICAgfQogICAgfSBlbHNlIGlmICh0YWcgPT0gLTIpIHsKICAgICAgaWYgKHRyYWNlTG9hZGluZykgewogICAgICAgIF9sb2coIkhhbmRsaW5nIGxvYWQgb2YgcGFja2FnZXMgbWFwOiAnJHJlc291cmNlJy4iKTsKICAgICAgfQogICAgICBpZiAocmVzb3VyY2Uuc2NoZW1lID09ICcnIHx8IHJlc291cmNlLnNjaGVtZSA9PSAnZmlsZScpIHsKICAgICAgICB2YXIgZXhpc3RzID0gYXdhaXQgbmV3IEZpbGUuZnJvbVVyaShyZXNvdXJjZSkuZXhpc3RzKCk7CiAgICAgICAgaWYgKGV4aXN0cykgewogICAgICAgICAgX2xvYWRQYWNrYWdlc0ZpbGUoc3AsIHRyYWNlTG9hZGluZywgcmVzb3VyY2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzcC5zZW5kKCJQYWNrYWdlcyBmaWxlICckcmVzb3VyY2UnIG5vdCBmb3VuZC4iKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoKHJlc291cmNlLnNjaGVtZSA9PSAnaHR0cCcpIHx8IChyZXNvdXJjZS5zY2hlbWUgPT0gJ2h0dHBzJykpIHsKICAgICAgICB2YXIgZXhpc3RzID0gYXdhaXQgX2xvYWRIdHRwUGFja2FnZXNGaWxlKHNwLCB0cmFjZUxvYWRpbmcsIHJlc291cmNlKTsKICAgICAgICBpZiAoIWV4aXN0cykgewogICAgICAgICAgc3Auc2VuZCgiUGFja2FnZXMgZmlsZSAnJHJlc291cmNlJyBub3QgZm91bmQuIik7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHJlc291cmNlLnNjaGVtZSA9PSAnZGF0YScpIHsKICAgICAgICBfbG9hZFBhY2thZ2VzRGF0YShzcCwgdHJhY2VMb2FkaW5nLCByZXNvdXJjZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3Auc2VuZCgiVW5rbm93biBzY2hlbWUgKCR7cmVzb3VyY2Uuc2NoZW1lfSkgZm9yIHBhY2thZ2UgZmlsZSBhdCAiCiAgICAgICAgICAgICInJHJlc291cmNlJy4iKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgc3Auc2VuZCgiVW5rbm93biBwYWNrYWdlcyByZXF1ZXN0IHRhZzogJHRhZyBmb3IgJyRyZXNvdXJjZScuIik7CiAgICB9CiAgfSBjYXRjaCAoZSwgcykgewogICAgaWYgKHRyYWNlTG9hZGluZykgewogICAgICBfbG9nKCJFcnJvciBoYW5kbGluZyBwYWNrYWdlcyByZXF1ZXN0OiAkZVxuJHMiKTsKICAgIH0KICAgIHNwLnNlbmQoIlVuY2F1Z2h0IGVycm9yICgkZSkgaGFuZGxpbmcgcGFja2FnZXMgcmVxdWVzdC4iKTsKICB9Cn0KCi8vIFNodXRkb3duIGFsbCBhY3RpdmUgbG9hZGVycyBieSBzZW5kaW5nIGFuIGVycm9yIG1lc3NhZ2UuCnZvaWQgc2h1dGRvd25Mb2FkZXJzKCkgewogIFN0cmluZyBtZXNzYWdlID0gJ1NlcnZpY2Ugc2h1dGRvd24nOwogIGlmIChfaHR0cENsaWVudCAhPSBudWxsKSB7CiAgICBfaHR0cENsaWVudC5jbG9zZShmb3JjZTogdHJ1ZSk7CiAgICBfaHR0cENsaWVudCA9IG51bGw7CiAgfQogIGlzb2xhdGVFbWJlZGRlckRhdGEudmFsdWVzLnRvTGlzdCgpLmZvckVhY2goKGllZCkgewogICAgSXNvbGF0ZUxvYWRlclN0YXRlIGlscyA9IGllZDsKICAgIGlscy5jbGVhbnVwKCk7CiAgICBhc3NlcnQoaWxzLnNwICE9IG51bGwpOwogICAgX3NlbmRSZXNvdXJjZVJlc3BvbnNlKGlscy5zcCwgMSwgbnVsbCwgbnVsbCwgbnVsbCwgbWVzc2FnZSk7CiAgfSk7Cn0KCi8vIFNlZSBEYXJ0X0xpYnJhcnlUYWcgaW4gZGFydF9hcGkuaApjb25zdCBfRGFydF9rQ2Fub25pY2FsaXplVXJsID0gMDsgLy8gQ2Fub25pY2FsaXplIHRoZSBVUkwuCmNvbnN0IF9EYXJ0X2tTY3JpcHRUYWcgPSAxOyAvLyBMb2FkIHRoZSByb290IHNjcmlwdC4KY29uc3QgX0RhcnRfa1NvdXJjZVRhZyA9IDI7IC8vIExvYWQgYSBwYXJ0IHNvdXJjZS4KY29uc3QgX0RhcnRfa0ltcG9ydFRhZyA9IDM7IC8vIEltcG9ydCBhIGxpYnJhcnkuCgovLyBFeHRyYSByZXF1ZXN0cy4gS2VlcCB0aGVzZSBpbiBzeW5jIGJldHdlZW4gbG9hZGVyLmRhcnQgYW5kIGJ1aWx0aW4uZGFydC4KY29uc3QgX0RhcnRfa0luaXRMb2FkZXIgPSA0OyAvLyBJbml0aWFsaXplIHRoZSBsb2FkZXIuCmNvbnN0IF9EYXJ0X2tSZXNvdXJjZUxvYWQgPSA1OyAvLyBSZXNvdXJjZSBjbGFzcyBzdXBwb3J0Lgpjb25zdCBfRGFydF9rR2V0UGFja2FnZVJvb3RVcmkgPSA2OyAvLyBVcmkgb2YgdGhlIHBhY2thZ2VzLyBkaXJlY3RvcnkuCmNvbnN0IF9EYXJ0X2tHZXRQYWNrYWdlQ29uZmlnVXJpID0gNzsgLy8gVXJpIG9mIHRoZSAucGFja2FnZXMgZmlsZS4KY29uc3QgX0RhcnRfa1Jlc29sdmVQYWNrYWdlVXJpID0gODsgLy8gUmVzb2x2ZSBhIHBhY2thZ2U6IHVyaS4KCi8vIEV4dHJhIHJlcXVlc3RzLiBLZWVwIHRoZXNlIGluIHN5bmMgYmV0d2VlbiBsb2FkZXIuZGFydCBhbmQgbG9hZGVyLmNjLgpjb25zdCBfRGFydF9rSW1wb3J0RXh0ZW5zaW9uID0gOTsgLy8gSW1wb3J0IGEgZGFydC1leHQ6IGZpbGUuCmNvbnN0IF9EYXJ0X2tSZXNvbHZlQXNGaWxlUGF0aCA9IDEwOyAvLyBSZXNvbHZlIHVyaSB0byBmaWxlIHBhdGguCgovLyBFeHRlcm5hbCBlbnRyeSBwb2ludCBmb3IgbG9hZGVyIHJlcXVlc3RzLgpfcHJvY2Vzc0xvYWRSZXF1ZXN0KHJlcXVlc3QpIHsKICBhc3NlcnQocmVxdWVzdCBpcyBMaXN0KTsKICBhc3NlcnQocmVxdWVzdC5sZW5ndGggPiA0KTsKCiAgLy8gU2hvdWxkIHdlIHRyYWNlIGxvYWRpbmc/CiAgYm9vbCB0cmFjZUxvYWRpbmcgPSByZXF1ZXN0WzBdOwoKICAvLyBUaGlzIGlzIHRoZSBzZW5kaW5nIGlzb2xhdGUncyBEYXJ0X0dldE1haW5Qb3J0SWQoKS4KICBpbnQgaXNvbGF0ZUlkID0gcmVxdWVzdFsxXTsKCiAgLy8gVGhlIHRhZyBkZXNjcmliaW5nIHRoZSBvcGVyYXRpb24uCiAgaW50IHRhZyA9IHJlcXVlc3RbMl07CgogIC8vIFRoZSBzZW5kIHBvcnQgdG8gc2VuZCB0aGUgcmVzcG9uc2Ugb24uCiAgU2VuZFBvcnQgc3AgPSByZXF1ZXN0WzNdOwoKICAvLyBHcmFiIHRoZSBsb2FkZXIgc3RhdGUgZm9yIHRoZSByZXF1ZXN0aW5nIGlzb2xhdGUuCiAgSXNvbGF0ZUxvYWRlclN0YXRlIGxvYWRlclN0YXRlID0gaXNvbGF0ZUVtYmVkZGVyRGF0YVtpc29sYXRlSWRdOwoKICAvLyBXZSBhcmUgZWl0aGVyIGFib3V0IHRvIGluaXRpYWxpemUgdGhlIGxvYWRlciwgb3IsIHdlIGFscmVhZHkgaGF2ZS4KICBhc3NlcnQoKHRhZyA9PSBfRGFydF9rSW5pdExvYWRlcikgfHwgKGxvYWRlclN0YXRlICE9IG51bGwpKTsKCiAgLy8gSGFuZGxlIHRoZSByZXF1ZXN0IHNwZWNpZmllZCBpbiB0aGUgdGFnLgogIHN3aXRjaCAodGFnKSB7CiAgICBjYXNlIF9EYXJ0X2tJbml0TG9hZGVyOgogICAgICB7CiAgICAgICAgU3RyaW5nIHBhY2thZ2VSb290ID0gcmVxdWVzdFs0XTsKICAgICAgICBTdHJpbmcgcGFja2FnZXNGaWxlID0gcmVxdWVzdFs1XTsKICAgICAgICBTdHJpbmcgd29ya2luZ0RpcmVjdG9yeSA9IHJlcXVlc3RbNl07CiAgICAgICAgU3RyaW5nIHJvb3RTY3JpcHQgPSByZXF1ZXN0WzddOwogICAgICAgIGJvb2wgaXNSZWxvYWRpbmcgPSByZXF1ZXN0WzhdOwogICAgICAgIGlmIChsb2FkZXJTdGF0ZSA9PSBudWxsKSB7CiAgICAgICAgICBsb2FkZXJTdGF0ZSA9IG5ldyBJc29sYXRlTG9hZGVyU3RhdGUoaXNvbGF0ZUlkKTsKICAgICAgICAgIGlzb2xhdGVFbWJlZGRlckRhdGFbaXNvbGF0ZUlkXSA9IGxvYWRlclN0YXRlOwogICAgICAgICAgbG9hZGVyU3RhdGUuaW5pdCgKICAgICAgICAgICAgICBwYWNrYWdlUm9vdCwgcGFja2FnZXNGaWxlLCB3b3JraW5nRGlyZWN0b3J5LCByb290U2NyaXB0KTsKICAgICAgICB9IGVsc2UgaWYgKGlzUmVsb2FkaW5nKSB7CiAgICAgICAgICBsb2FkZXJTdGF0ZS51cGRhdGVQYWNrYWdlTWFwKHBhY2thZ2VzRmlsZSk7CiAgICAgICAgfQogICAgICAgIGxvYWRlclN0YXRlLnNwID0gc3A7CiAgICAgICAgYXNzZXJ0KGlzb2xhdGVFbWJlZGRlckRhdGFbaXNvbGF0ZUlkXSA9PSBsb2FkZXJTdGF0ZSk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIF9EYXJ0X2tSZXNvdXJjZUxvYWQ6CiAgICAgIHsKICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKHJlcXVlc3RbNF0pOwogICAgICAgIF9oYW5kbGVSZXNvdXJjZVJlcXVlc3QoCiAgICAgICAgICAgIGxvYWRlclN0YXRlLCBzcCwgdHJhY2VMb2FkaW5nLCB0YWcsIHVyaSwgdXJpLCBudWxsKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgX0RhcnRfa0dldFBhY2thZ2VSb290VXJpOgogICAgICBsb2FkZXJTdGF0ZS5fdHJpZ2dlclBhY2thZ2VSZXNvbHV0aW9uKCgpIHsKICAgICAgICAvLyBUaGUgcGFja2FnZSByb290IGlzIGRlcHJlY2F0ZWQgYW5kIG5vdyBhbHdheXMgcmV0dXJucyBudWxsLgogICAgICAgIHNwLnNlbmQobnVsbCk7CiAgICAgIH0pOwogICAgICBicmVhazsKICAgIGNhc2UgX0RhcnRfa0dldFBhY2thZ2VDb25maWdVcmk6CiAgICAgIGxvYWRlclN0YXRlLl90cmlnZ2VyUGFja2FnZVJlc29sdXRpb24oKCkgewogICAgICAgIC8vIFJlc3BvbmQgd2l0aCB0aGUgcGFja2FnZXMgY29uZmlnIChpZiBhbnkpIGFmdGVyIHBhY2thZ2UgcmVzb2x1dGlvbi4KICAgICAgICBzcC5zZW5kKGxvYWRlclN0YXRlLl9wYWNrYWdlQ29uZmlnKTsKICAgICAgfSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBfRGFydF9rUmVzb2x2ZVBhY2thZ2VVcmk6CiAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UocmVxdWVzdFs0XSk7CiAgICAgIGxvYWRlclN0YXRlLl90cmlnZ2VyUGFja2FnZVJlc29sdXRpb24oKCkgewogICAgICAgIC8vIFJlc3BvbmQgd2l0aCB0aGUgcmVzb2x2ZWQgcGFja2FnZSB1cmkgYWZ0ZXIgcGFja2FnZSByZXNvbHV0aW9uLgogICAgICAgIFVyaSByZXNvbHZlZFVyaTsKICAgICAgICB0cnkgewogICAgICAgICAgcmVzb2x2ZWRVcmkgPSBsb2FkZXJTdGF0ZS5fcmVzb2x2ZVBhY2thZ2VVcmkodXJpKTsKICAgICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgICAgICAgIF9sb2coIkV4Y2VwdGlvbiAoJGUpIHdoZW4gcmVzb2x2aW5nIHBhY2thZ2UgVVJJOiAkdXJpIik7CiAgICAgICAgICB9CiAgICAgICAgICByZXNvbHZlZFVyaSA9IG51bGw7CiAgICAgICAgfQogICAgICAgIHNwLnNlbmQocmVzb2x2ZWRVcmkpOwogICAgICB9KTsKICAgICAgYnJlYWs7CiAgICBjYXNlIF9EYXJ0X2tJbXBvcnRFeHRlbnNpb246CiAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UocmVxdWVzdFs0XSk7CiAgICAgIFN0cmluZyBsaWJyYXJ5VXJpID0gcmVxdWVzdFs1XTsKICAgICAgLy8gU3RyaXAgYW55IGZpbGVuYW1lIG9mZiBvZiB0aGUgbGlicmFyeVVyaSdzIHBhdGguCiAgICAgIGludCBpbmRleCA9IGxpYnJhcnlVcmkubGFzdEluZGV4T2YoJy8nKTsKICAgICAgdmFyIHBhdGg7CiAgICAgIGlmIChpbmRleCA9PSAtMSkgewogICAgICAgIHBhdGggPSAnLi8nOwogICAgICB9IGVsc2UgewogICAgICAgIHBhdGggPSBsaWJyYXJ5VXJpLnN1YnN0cmluZygwLCBpbmRleCArIDEpOwogICAgICB9CiAgICAgIHZhciBwYXRoVXJpID0gVXJpLnBhcnNlKHBhdGgpOwogICAgICBzd2l0Y2ggKHBhdGhVcmkuc2NoZW1lKSB7CiAgICAgICAgY2FzZSAnJzoKICAgICAgICBjYXNlICdmaWxlJzoKICAgICAgICAgIF9zZW5kRXh0ZW5zaW9uSW1wb3J0UmVzcG9uc2UoCiAgICAgICAgICAgICAgc3AsIHVyaSwgbGlicmFyeVVyaSwgcGF0aFVyaS50b0ZpbGVQYXRoKCkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnZGF0YSc6CiAgICAgICAgY2FzZSAnaHR0cCc6CiAgICAgICAgY2FzZSAnaHR0cHMnOgogICAgICAgICAgX3NlbmRFeHRlbnNpb25JbXBvcnRSZXNwb25zZShzcCwgdXJpLCBsaWJyYXJ5VXJpLCBwYXRoVXJpLnRvU3RyaW5nKCkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncGFja2FnZSc6CiAgICAgICAgICAvLyBTdGFydCBwYWNrYWdlIHJlc29sdXRpb24uCiAgICAgICAgICBsb2FkZXJTdGF0ZS5fdHJpZ2dlclBhY2thZ2VSZXNvbHV0aW9uKCgpIHsKICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBmaW5kIHRoZSBmdWxseSByZXNvbHZlZCB1cmkgb2YgW3BhdGhdLgogICAgICAgICAgICBVcmkgcmVzb2x2ZWRVcmk7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgcmVzb2x2ZWRVcmkgPSBsb2FkZXJTdGF0ZS5fcmVzb2x2ZVBhY2thZ2VVcmkocGF0aFVyaSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgICAgICAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgICAgICAgICAgICBfbG9nKCJFeGNlcHRpb24gKCRlKSB3aGVuIHJlc29sdmluZyBwYWNrYWdlIFVSSTogJHVyaSIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXNvbHZlZFVyaSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX3NlbmRFeHRlbnNpb25JbXBvcnRSZXNwb25zZSgKICAgICAgICAgICAgICAgIHNwLCB1cmksIGxpYnJhcnlVcmksIHJlc29sdmVkVXJpLnRvU3RyaW5nKCkpOwogICAgICAgICAgfSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgaWYgKHRyYWNlTG9hZGluZykgewogICAgICAgICAgICBfbG9nKCdVbmtub3duIHNjaGVtZSAoJHtwYXRoVXJpLnNjaGVtZX0pIGluICRwYXRoVXJpLicpOwogICAgICAgICAgfQogICAgICAgICAgX3NlbmRFeHRlbnNpb25JbXBvcnRSZXNwb25zZShzcCwgdXJpLCBsaWJyYXJ5VXJpLCBudWxsKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSBfRGFydF9rUmVzb2x2ZUFzRmlsZVBhdGg6CiAgICAgIGxvYWRlclN0YXRlLl90cmlnZ2VyUGFja2FnZVJlc29sdXRpb24oKCkgewogICAgICAgIFN0cmluZyB1cmkgPSByZXF1ZXN0WzRdOwogICAgICAgIFVyaSByZXNvbHZlZFVyaSA9IFVyaS5wYXJzZShfc2FuaXRpemVXaW5kb3dzUGF0aCh1cmkpKTsKICAgICAgICB0cnkgewogICAgICAgICAgaWYgKHJlc29sdmVkVXJpLnNjaGVtZSA9PSAncGFja2FnZScpIHsKICAgICAgICAgICAgcmVzb2x2ZWRVcmkgPSBsb2FkZXJTdGF0ZS5fcmVzb2x2ZVBhY2thZ2VVcmkocmVzb2x2ZWRVcmkpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHJlc29sdmVkVXJpLnNjaGVtZSA9PSAnJyB8fCByZXNvbHZlZFVyaS5zY2hlbWUgPT0gJ2ZpbGUnKSB7CiAgICAgICAgICAgIHJlc29sdmVk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HggpIEEIDSMxRxcKDSUxTy0KDSMnMUsZDj0ZHkUMHgoeCg0hJyY6LxAZFQ8zCCUgERUoOhEVFRZRERgnNUEdEkUdIkkQIg4qPg4RER5FDEMRCA0jMSFADjFHDEpRIxoaLRsvGhNPJQwWIRkYKxkhGAoKDQ0/BAIBHWRhcnQ6dm1zZXJ2aWNlX2lvL2xvYWRlci5kYXJ0NW9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9iaW4vdm1zZXJ2aWNlL3NlcnZlci5kYXJ0tAIvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiB2bXNlcnZpY2VfaW87CgpmaW5hbCBib29sIHNpbGVudE9ic2VydmF0b3J5ID0gbmV3IGJvb2wuZnJvbUVudmlyb25tZW50KCdTSUxFTlRfT0JTRVJWQVRPUlknKTsKCnZvaWQgc2VydmVyUHJpbnQoU3RyaW5nIHMpIHsKICBpZiAoc2lsZW50T2JzZXJ2YXRvcnkpIHsKICAgIC8vIFdlJ3ZlIGJlZW4gcmVxdWVzdGVkIHRvIGJlIHNpbGVudC4KICAgIHJldHVybjsKICB9CiAgcHJpbnQocyk7Cn0KCmNsYXNzIFdlYlNvY2tldENsaWVudCBleHRlbmRzIENsaWVudCB7CiAgc3RhdGljIGNvbnN0IGludCBQQVJTRV9FUlJPUl9DT0RFID0gNDAwMDsKICBzdGF0aWMgY29uc3QgaW50IEJJTkFSWV9NRVNTQUdFX0VSUk9SX0NPREUgPSA0MDAxOwogIHN0YXRpYyBjb25zdCBpbnQgTk9UX01BUF9FUlJPUl9DT0RFID0gNDAwMjsKICBzdGF0aWMgY29uc3QgaW50IElEX0VSUk9SX0NPREUgPSA0MDAzOwogIGZpbmFsIFdlYlNvY2tldCBzb2NrZXQ7CgogIFdlYlNvY2tldENsaWVudCh0aGlzLnNvY2tldCwgVk1TZXJ2aWNlIHNlcnZpY2UpIDogc3VwZXIoc2VydmljZSkgewogICAgc29ja2V0Lmxpc3RlbigobWVzc2FnZSkgPT4gb25XZWJTb2NrZXRNZXNzYWdlKG1lc3NhZ2UpKTsKICAgIHNvY2tldC5kb25lLnRoZW4oKF8pID0+IGNsb3NlKCkpOwogIH0KCiAgZGlzY29ubmVjdCgpIHsKICAgIGlmIChzb2NrZXQgIT0gbnVsbCkgewogICAgICBzb2NrZXQuY2xvc2UoKTsKICAgIH0KICB9CgogIHZvaWQgb25XZWJTb2NrZXRNZXNzYWdlKG1lc3NhZ2UpIHsKICAgIGlmIChtZXNzYWdlIGlzIFN0cmluZykgewogICAgICB2YXIgbWFwOwogICAgICB0cnkgewogICAgICAgIG1hcCA9IGpzb24uZGVjb2RlKG1lc3NhZ2UpOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgc29ja2V0LmNsb3NlKFBBUlNFX0VSUk9SX0NPREUsICdNZXNzYWdlIHBhcnNlIGVycm9yOiAkZScpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAobWFwIGlzISBNYXApIHsKICAgICAgICBzb2NrZXQuY2xvc2UoTk9UX01BUF9FUlJPUl9DT0RFLCAnTWVzc2FnZSBtdXN0IGJlIGEgSlNPTiBtYXAuJyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgZmluYWwgcnBjID0gbmV3IE1lc3NhZ2UuZnJvbUpzb25ScGModGhpcywgbWFwKTsKICAgICAgICBzd2l0Y2ggKHJwYy50eXBlKSB7CiAgICAgICAgICBjYXNlIE1lc3NhZ2VUeXBlLlJlcXVlc3Q6CiAgICAgICAgICAgIG9uUmVxdWVzdChycGMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgTWVzc2FnZVR5cGUuTm90aWZpY2F0aW9uOgogICAgICAgICAgICBvbk5vdGlmaWNhdGlvbihycGMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgTWVzc2FnZVR5cGUuUmVzcG9uc2U6CiAgICAgICAgICAgIG9uUmVzcG9uc2UocnBjKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgc29ja2V0LmNsb3NlKElEX0VSUk9SX0NPREUsIGUubWVzc2FnZSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHNvY2tldC5jbG9zZShCSU5BUllfTUVTU0FHRV9FUlJPUl9DT0RFLCAnTWVzc2FnZSBtdXN0IGJlIGEgc3RyaW5nLicpOwogICAgfQogIH0KCiAgdm9pZCBwb3N0KFJlc3BvbnNlIHJlc3VsdCkgewogICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CiAgICAgIC8vIERvIG5vdGhpbmcuCiAgICAgIHJldHVybjsKICAgIH0KICAgIHRyeSB7CiAgICAgIHN3aXRjaCAocmVzdWx0LmtpbmQpIHsKICAgICAgICBjYXNlIFJlc3BvbnNlUGF5bG9hZEtpbmQuU3RyaW5nOgogICAgICAgIGNhc2UgUmVzcG9uc2VQYXlsb2FkS2luZC5CaW5hcnk6CiAgICAgICAgICBzb2NrZXQuYWRkKHJlc3VsdC5wYXlsb2FkKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUmVzcG9uc2VQYXlsb2FkS2luZC5VdGY4U3RyaW5nOgogICAgICAgICAgc29ja2V0LmFkZFV0ZjhUZXh0KHJlc3VsdC5wYXlsb2FkKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9IG9uIFN0YXRlRXJyb3IgY2F0Y2ggKF8pIHsKICAgICAgLy8gVk0gaGFzIHNodXRkb3duLCBkbyBub3RoaW5nLgogICAgICByZXR1cm47CiAgICB9CiAgfQoKICBkeW5hbWljIHRvSnNvbigpIHsKICAgIE1hcCBtYXAgPSBzdXBlci50b0pzb24oKTsKICAgIG1hcFsndHlwZSddID0gJ1dlYlNvY2tldENsaWVudCc7CiAgICBtYXBbJ3NvY2tldCddID0gJyRzb2NrZXQnOwogICAgcmV0dXJuIG1hcDsKICB9Cn0KCmNsYXNzIEh0dHBSZXF1ZXN0Q2xpZW50IGV4dGVuZHMgQ2xpZW50IHsKICBzdGF0aWMgQ29udGVudFR5cGUganNvbkNvbnRlbnRUeXBlID0KICAgICAgbmV3IENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbiIsICJqc29uIiwgY2hhcnNldDogInV0Zi04Iik7CiAgZmluYWwgSHR0cFJlcXVlc3QgcmVxdWVzdDsKCiAgSHR0cFJlcXVlc3RDbGllbnQodGhpcy5yZXF1ZXN0LCBWTVNlcnZpY2Ugc2VydmljZSkKICAgICAgOiBzdXBlcihzZXJ2aWNlLCBzZW5kRXZlbnRzOiBmYWxzZSk7CgogIGRpc2Nvbm5lY3QoKSB7CiAgICByZXF1ZXN0LnJlc3BvbnNlLmNsb3NlKCk7CiAgICBjbG9zZSgpOwogIH0KCiAgdm9pZCBwb3N0KFJlc3BvbnNlIHJlc3VsdCkgewogICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CiAgICAgIGNsb3NlKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIEh0dHBSZXNwb25zZSByZXNwb25zZSA9IHJlcXVlc3QucmVzcG9uc2U7CiAgICAvLyBXZSBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gZm9yIGJhZCBvcmlnaW5zIGVhcmxpZXIuCiAgICByZXNwb25zZS5oZWFkZXJzLmFkZCgnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJywgJyonKTsKICAgIHJlc3BvbnNlLmhlYWRlcnMuY29udGVudFR5cGUgPSBqc29uQ29udGVudFR5cGU7CiAgICBzd2l0Y2ggKHJlc3VsdC5raW5kKSB7CiAgICAgIGNhc2UgUmVzcG9uc2VQYXlsb2FkS2luZC5TdHJpbmc6CiAgICAgICAgcmVzcG9uc2Uud3JpdGUocmVzdWx0LnBheWxvYWQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFJlc3BvbnNlUGF5bG9hZEtpbmQuVXRmOFN0cmluZzoKICAgICAgICByZXNwb25zZS5hZGQocmVzdWx0LnBheWxvYWQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFJlc3BvbnNlUGF5bG9hZEtpbmQuQmluYXJ5OgogICAgICAgIHRocm93ICdDYW4gbm90IGhhbmRsZSBiaW5hcnkgcmVzcG9uc2VzJzsKICAgIH0KICAgIHJlc3BvbnNlLmNsb3NlKCk7CiAgICBjbG9zZSgpOwogIH0KCiAgZHluYW1pYyB0b0pzb24oKSB7CiAgICBNYXAgbWFwID0gc3VwZXIudG9Kc29uKCk7CiAgICBtYXBbJ3R5cGUnXSA9ICdIdHRwUmVxdWVzdENsaWVudCc7CiAgICBtYXBbJ3JlcXVlc3QnXSA9ICckcmVxdWVzdCc7CiAgICByZXR1cm4gbWFwOwogIH0KfQoKY2xhc3MgU2VydmVyIHsKICBzdGF0aWMgY29uc3QgV0VCU09DS0VUX1BBVEggPSAnL3dzJzsKICBzdGF0aWMgY29uc3QgUk9PVF9SRURJUkVDVF9QQVRIID0gJy9pbmRleC5odG1sJzsKCiAgZmluYWwgVk1TZXJ2aWNlIF9zZXJ2aWNlOwogIGZpbmFsIFN0cmluZyBfaXA7CiAgZmluYWwgaW50IF9wb3J0OwogIGZpbmFsIGJvb2wgX29yaWdpbkNoZWNrRGlzYWJsZWQ7CiAgZmluYWwgYm9vbCBfYXV0aENvZGVzRGlzYWJsZWQ7CiAgSHR0cFNlcnZlciBfc2VydmVyOwogIGJvb2wgZ2V0IHJ1bm5pbmcgPT4gX3NlcnZlciAhPSBudWxsOwoKICAvLy8gUmV0dXJucyB0aGUgc2VydmVyIGFkZHJlc3MgaW5jbHVkaW5nIHRoZSBhdXRoIHRva2VuLgogIFVyaSBnZXQgc2VydmVyQWRkcmVzcyB7CiAgICBpZiAoIXJ1bm5pbmcpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB2YXIgaXAgPSBfc2VydmVyLmFkZHJlc3MuYWRkcmVzczsKICAgIHZhciBwb3J0ID0gX3NlcnZlci5wb3J0OwogICAgdmFyIHBhdGggPSAhX2F1dGhDb2Rlc0Rpc2FibGVkID8gIiRzZXJ2aWNlQXV0aFRva2VuLyIgOiAiLyI7CiAgICByZXR1cm4gbmV3IFVyaShzY2hlbWU6ICdodHRwJywgaG9zdDogaXAsIHBvcnQ6IHBvcnQsIHBhdGg6IHBhdGgpOwogIH0KCiAgLy8gT24gRnVjaHNpYSwgYXV0aGVudGljYXRpb24gY29kZXMgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQuIFRvIGVuYWJsZSwgdGhlIGF1dGhlbnRpY2F0aW9uIHRva2VuCiAgLy8gd291bGQgaGF2ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGh1YiBhbG9uZ3NpZGUgdGhlIHBvcnQgbnVtYmVyLgogIFNlcnZlcih0aGlzLl9zZXJ2aWNlLCB0aGlzLl9pcCwgdGhpcy5fcG9ydCwgdGhpcy5fb3JpZ2luQ2hlY2tEaXNhYmxlZCwKICAgICAgYm9vbCBhdXRoQ29kZXNEaXNhYmxlZCkKICAgICAgOiBfYXV0aENvZGVzRGlzYWJsZWQgPSAoYXV0aENvZGVzRGlzYWJsZWQgfHwgUGxhdGZvcm0uaXNGdWNoc2lhKTsKCiAgYm9vbCBfaXNBbGxvd2VkT3JpZ2luKFN0cmluZyBvcmlnaW4pIHsKICAgIFVyaSB1cmk7CiAgICB0cnkgewogICAgICB1cmkgPSBVcmkucGFyc2Uob3JpZ2luKTsKICAgIH0gY2F0Y2ggKF8pIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIEV4cGxpY2l0bHkgYWRkIGxvY2FsaG9zdCBhbmQgMTI3LjAuMC4xIG9uIGFueSBwb3J0IChuZWNlc3NhcnkgZm9yCiAgICAvLyBhZGIgcG9ydCBmb3J3YXJkaW5nKS4KICAgIGlmICgodXJpLmhvc3QgPT0gJ2xvY2FsaG9zdCcpIHx8CiAgICAgICAgKHVyaS5ob3N0ID09ICc6OjEnKSB8fAogICAgICAgICh1cmkuaG9zdCA9PSAnMTI3LjAuMC4xJykpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgaWYgKCh1cmkucG9ydCA9PSBfc2VydmVyLnBvcnQpICYmCiAgICAgICAgKCh1cmkuaG9zdCA9PSBfc2VydmVyLmFkZHJlc3MuYWRkcmVzcykgfHwKICAgICAgICAgICAgKHVyaS5ob3N0ID09IF9zZXJ2ZXIuYWRkcmVzcy5ob3N0KSkpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgYm9vbCBfb3JpZ2luQ2hlY2soSHR0cFJlcXVlc3QgcmVxdWVzdCkgewogICAgaWYgKF9vcmlnaW5DaGVja0Rpc2FibGVkKSB7CiAgICAgIC8vIEFsd2F5cyBhbGxvdy4KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvLyBGaXJzdCBjaGVjayB0aGUgd2ViLXNvY2tldCBzcGVjaWZpYyBvcmlnaW4uCiAgICBMaXN0PFN0cmluZz4gb3JpZ2lucyA9IHJlcXVlc3QuaGVhZGVyc1siU2VjLVdlYlNvY2tldC1PcmlnaW4iXTsKICAgIGlmIChvcmlnaW5zID09IG51bGwpIHsKICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBnZW5lcmFsIE9yaWdpbiBmaWVsZC4KICAgICAgb3JpZ2lucyA9IHJlcXVlc3QuaGVhZGVyc1siT3JpZ2luIl07CiAgICB9CiAgICBpZiAob3JpZ2lucyA9PSBudWxsKSB7CiAgICAgIC8vIE5vIG9yaWdpbiBzZW50LiBUaGlzIGlzIGEgbm9uLWJyb3dzZXIgY2xpZW50IG9yIGEgc2FtZS1vcmlnaW4gcmVxdWVzdC4KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmb3IgKFN0cmluZyBvcmlnaW4gaW4gb3JpZ2lucykgewogICAgICBpZiAoX2lzQWxsb3dlZE9yaWdpbihvcmlnaW4pKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vLyBDaGVja3MgdGhlIFtyZXF1ZXN0VXJpXSBmb3IgdGhlIHNlcnZpY2UgYXV0aCB0b2tlbiBhbmQgcmV0dXJucyB0aGUgcGF0aC4KICAvLy8gSWYgdGhlIHNlcnZpY2UgYXV0aCB0b2tlbiBjaGVjayBmYWlscywgcmV0dXJucyBudWxsLgogIFN0cmluZyBfY2hlY2tBdXRoVG9rZW5BbmRHZXRQYXRoKFVyaSByZXF1ZXN0VXJpKSB7CiAgICBpZiAoX2F1dGhDb2Rlc0Rpc2FibGVkKSB7CiAgICAgIHJldHVybiByZXF1ZXN0VXJpLnBhdGggPT0gJy8nID8gUk9PVF9SRURJUkVDVF9QQVRIIDogcmVxdWVzdFVyaS5wYXRoOwogICAgfQogICAgZmluYWwgTGlzdDxTdHJpbmc+IHJlcXVlc3RQYXRoU2VnbWVudHMgPSByZXF1ZXN0VXJpLnBhdGhTZWdtZW50czsKICAgIGlmIChyZXF1ZXN0UGF0aFNlZ21lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgLy8gTWFsZm9ybWVkLgogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8vIENoZWNrIHRoYXQgd2Ugd2VyZSBnaXZlbiB0aGUgYXV0aCB0b2tlbi4KICAgIGZpbmFsIFN0cmluZyBhdXRoVG9rZW4gPSByZXF1ZXN0UGF0aFNlZ21lbnRzWzBdOwogICAgaWYgKGF1dGhUb2tlbiAhPSBzZXJ2aWNlQXV0aFRva2VuKSB7CiAgICAgIC8vIE1hbGZvcm1lZC4KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvLyBDb25zdHJ1Y3QgdGhlIGFjdHVhbCByZXF1ZXN0IHBhdGggYnkgY2hvcHBpbmcgb2ZmIHRoZSBhdXRoIHRva2VuLgogICAgcmV0dXJuIChyZXF1ZXN0UGF0aFNlZ21lbnRzWzFdID09ICcnKQogICAgICAgID8gUk9PVF9SRURJUkVDVF9QQVRICiAgICAgICAgOiAnLyR7cmVxdWVzdFBhdGhTZWdtZW50cy5zdWJsaXN0KDEpLmpvaW4oJy8nKX0nOwogIH0KCiAgRnV0dXJlIF9yZXF1ZXN0SGFuZGxlcihIdHRwUmVxdWVzdCByZXF1ZXN0KSBhc3luYyB7CiAgICBpZiAoIV9vcmlnaW5DaGVjayhyZXF1ZXN0KSkgewogICAgICAvLyBUaGlzIGlzIGEgY3Jvc3Mgb3JpZ2luIGF0dGVtcHQgdG8gY29ubmVjdAogICAgICByZXF1ZXN0LnJlc3BvbnNlLnN0YXR1c0NvZGUgPSBIdHRwU3RhdHVzLmZvcmJpZGRlbjsKICAgICAgcmVxdWVzdC5yZXNwb25zZS53cml0ZSgiZm9yYmlkZGVuIG9yaWdpbiIpOwogICAgICByZXF1ZXN0LnJlc3BvbnNlLmNsb3NlKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChyZXF1ZXN0Lm1ldGhvZCA9PSAnUFVUJykgewogICAgICAvLyBQVVQgcmVxdWVzdHMgYXJlIGZvcndhcmRlZCB0byBEZXZGUyBmb3IgcHJvY2Vzc2luZy4KCiAgICAgIExpc3QgZnNOYW1lTGlzdDsKICAgICAgTGlzdCBmc1BhdGhMaXN0OwogICAgICBMaXN0IGZzUGF0aEJhc2U2NExpc3Q7CiAgICAgIExpc3QgZnNVcmlCYXNlNjRMaXN0OwogICAgICBPYmplY3QgZnNOYW1lOwogICAgICBPYmplY3QgZnNQYXRoOwogICAgICBPYmplY3QgZnNVcmk7CgogICAgICB0cnkgewogICAgICAgIC8vIEV4dHJhY3QgdGhlIGZzIG5hbWUgYW5kIGZzIHBhdGggZnJvbSB0aGUgcmVxdWVzdCBoZWFkZXJzLgogICAgICAgIGZzTmFtZUxpc3QgPSByZXF1ZXN0LmhlYWRlcnNbJ2Rldl9mc19uYW1lJ107CiAgICAgICAgZnNOYW1lID0gZnNOYW1lTGlzdFswXTsKCiAgICAgICAgLy8gUHJlZmVyIFVyaSBlbmNvZGluZyBmaXJzdC4KICAgICAgICBmc1VyaUJhc2U2NExpc3QgPSByZXF1ZXN0LmhlYWRlcnNbJ2Rldl9mc191cmlfYjY0J107CiAgICAgICAgaWYgKChmc1VyaUJhc2U2NExpc3QgIT0gbnVsbCkgJiYgKGZzVXJpQmFzZTY0TGlzdC5sZW5ndGggPiAwKSkgewogICAgICAgICAgU3RyaW5nIGRlY29kZWRGc1VyaSA9IHV0ZjguZGVjb2RlKGJhc2U2NC5kZWNvZGUoZnNVcmlCYXNlNjRMaXN0WzBdKSk7CiAgICAgICAgICBmc1VyaSA9IFVyaS5wYXJzZShkZWNvZGVkRnNVcmkpOwogICAgICAgIH0KCiAgICAgICAgLy8gRmFsbGJhY2sgdG8gcGF0aCBlbmNvZGluZy4KICAgICAgICBpZiAoZnNVcmkgPT0gbnVsbCkgewogICAgICAgICAgZnNQYXRoTGlzdCA9IHJlcXVlc3QuaGVhZGVyc1snZGV2X2ZzX3BhdGgnXTsKICAgICAgICAgIGZzUGF0aEJhc2U2NExpc3QgPSByZXF1ZXN0LmhlYWRlcnNbJ2Rldl9mc19wYXRoX2I2NCddOwogICAgICAgICAgLy8gSWYgdGhlICdkZXZfZnNfcGF0aF9iNjQnIGhlYWRlciBmaWVsZCB3YXMgc2VudCwgdXNlIHRoYXQgaW5zdGVhZC4KICAgICAgICAgIGlmICgoZnNQYXRoQmFzZTY0TGlzdCAhPSBudWxsKSAmJiAoZnNQYXRoQmFzZTY0TGlzdC5sZW5ndGggPiAwKSkgewogICAgICAgICAgICBmc1BhdGggPSB1dGY4LmRlY29kZShiYXNlNjQuZGVjb2RlKGZzUGF0aEJhc2U2NExpc3RbMF0pKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZzUGF0aCA9IGZzUGF0aExpc3RbMF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7LyogaWdub3JlICovfQoKICAgICAgU3RyaW5nIHJlc3VsdDsKICAgICAgdHJ5IHsKICAgICAgICByZXN1bHQgPSBhd2FpdCBfc2VydmljZS5kZXZmcy5oYW5kbGVQdXRTdHJlYW0oCiAgICAgICAgICAgIGZzTmFtZSwgZnNQYXRoLCBmc1VyaSwgcmVxdWVzdC50cmFuc2Zvcm0oR1pJUC5kZWNvZGVyKSk7CiAgICAgIH0gY2F0Y2ggKGUpIHsvKiBpZ25vcmUgKi99CgogICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKICAgICAgICByZXF1ZXN0LnJlc3BvbnNlLmhlYWRlcnMuY29udGVudFR5cGUgPQogICAgICAgICAgICBIdHRwUmVxdWVzdENsaWVudC5qc29uQ29udGVudFR5cGU7CiAgICAgICAgcmVxdWVzdC5yZXNwb25zZS53cml0ZShyZXN1bHQpOwogICAgICB9CiAgICAgIHJlcXVlc3QucmVzcG9uc2UuY2xvc2UoKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHJlcXVlc3QubWV0aG9kICE9ICdHRVQnKSB7CiAgICAgIC8vIE5vdCBhIEdFVCByZXF1ZXN0LiBEbyBub3RoaW5nLgogICAgICByZXF1ZXN0LnJlc3BvbnNlLnN0YXR1c0NvZGUgPSBIdHRwU3RhdHVzLm1ldGhvZE5vdEFsbG93ZWQ7CiAgICAgIHJlcXVlc3QucmVzcG9uc2Uud3JpdGUoIm1ldGhvZCBub3QgYWxsb3dlZCIpOwogICAgICByZXF1ZXN0LnJlc3BvbnNlLmNsb3NlKCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBmaW5hbCBTdHJpbmcgcGF0aCA9IF9jaGVja0F1dGhUb2tlbkFuZEdldFBhdGgocmVxdWVzdC51cmkpOwogICAgaWYgKHBhdGggPT0gbnVsbCkgewogICAgICAvLyBFaXRoZXIgbm8gYXV0aGVudGljYXRpb24gY29kZSB3YXMgcHJvdmlkZWQgd2hlbiBvbmUgd2FzIGV4cGVjdGVkIG9yIGFuCiAgICAgIC8vIGluY29ycmVjdCBhdXRoZW50aWNhdGlvbiBjb2RlIHdhcyBwcm92aWRlZC4KICAgICAgcmVxdWVzdC5yZXNwb25zZS5zdGF0dXNDb2RlID0gSHR0cFN0YXR1cy5mb3JiaWRkZW47CiAgICAgIHJlcXVlc3QucmVzcG9uc2Uud3JpdGUoIm1pc3Npbmcgb3IgaW52YWxpZCBhdXRoZW50aWNhdGlvbiBjb2RlIik7CiAgICAgIHJlcXVlc3QucmVzcG9uc2UuY2xvc2UoKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChwYXRoID09IFdFQlNPQ0tFVF9QQVRIKSB7CiAgICAgIFdlYlNvY2tldFRyYW5zZm9ybWVyLnVwZ3JhZGUocmVxdWVzdCkudGhlbigoV2ViU29ja2V0IHdlYlNvY2tldCkgewogICAgICAgIG5ldyBXZWJTb2NrZXRDbGllbnQod2ViU29ja2V0LCBfc2VydmljZSk7CiAgICAgIH0pOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGFzc2V0cyA9PSBudWxsKSB7CiAgICAgIHJlcXVlc3QucmVzcG9uc2UuaGVhZGVycy5jb250ZW50VHlwZSA9IENvbnRlbnRUeXBlLlRFWFQ7CiAgICAgIHJlcXVlc3QucmVzcG9uc2Uud3JpdGUoIlRoaXMgVk0gd2FzIGJ1aWx0IHdpdGhvdXQgdGhlIE9ic2VydmF0b3J5IFVJLiIpOwogICAgICByZXF1ZXN0LnJlc3BvbnNlLmNsb3NlKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIEFzc2V0IGFzc2V0ID0gYXNzZXRzW3BhdGhdOwogICAgaWYgKGFzc2V0ICE9IG51bGwpIHsKICAgICAgLy8gU2VydmluZyB1cCBhIHN0YXRpYyBhc3NldCAoZS5nLiAuY3NzLCAuaHRtbCwgLnBuZykuCiAgICAgIHJlcXVlc3QucmVzcG9uc2UuaGVhZGVycy5jb250ZW50VHlwZSA9IENvbnRlbnRUeXBlLnBhcnNlKGFzc2V0Lm1pbWVUeXBlKTsKICAgICAgcmVxdWVzdC5yZXNwb25zZS5hZGQoYXNzZXQuZGF0YSk7CiAgICAgIHJlcXVlc3QucmVzcG9uc2UuY2xvc2UoKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gSFRUUCBiYXNlZCBzZXJ2aWNlIHJlcXVlc3QuCiAgICBmaW5hbCBjbGllbnQgPSBuZXcgSHR0cFJlcXVlc3RDbGllbnQocmVxdWVzdCwgX3NlcnZpY2UpOwogICAgZmluYWwgbWVzc2FnZSA9IG5ldyBNZXNzYWdlLmZyb21VcmkoY2xpZW50LCBVcmkucGFyc2UocGF0aCkpOwogICAgY2xpZW50Lm9uUmVxdWVzdChtZXNzYWdlKTsgLy8gZXhjZXB0aW9uIGZyZWUsIG5vIG5lZWQgdG8gdHJ5IGNhdGNoCiAgfQoKICBGdXR1cmUgc3RhcnR1cCgpIGFzeW5jIHsKICAgIGlmIChfc2VydmVyICE9IG51bGwpIHsKICAgICAgLy8gQWxyZWFkeSBydW5uaW5nLgogICAgICByZXR1cm4gdGhpczsKICAgIH0KCiAgICAvLyBTdGFydHVwIEhUVFAgc2VydmVyLgogICAgdmFyIHBvbGxFcnJvcjsKICAgIHZhciBwb2xsU3RhY2s7CiAgICBGdXR1cmU8Ym9vbD4gcG9sbCgpIGFzeW5jIHsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgYWRkcmVzczsKICAgICAgICB2YXIgYWRkcmVzc2VzID0gYXdhaXQgSW50ZXJuZXRBZGRyZXNzLmxvb2t1cChfaXApOwogICAgICAgIC8vIFByZWZlciBJUHY0IGFkZHJlc3Nlcy4KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFkZHJlc3Nlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgYWRkcmVzcyA9IGFkZHJlc3Nlc1tpXTsKICAgICAgICAgIGlmIChhZGRyZXNzLnR5cGUgPT0gSW50ZXJuZXRBZGRyZXNzVHlwZS5JUF9WNCkgYnJlYWs7CiAgICAgICAgfQogICAgICAgIF9zZXJ2ZXIgPSBhd2FpdCBIdHRwU2VydmVyLmJpbmQoYWRkcmVzcywgX3BvcnQpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9IGNhdGNoIChlLCBzdCkgewogICAgICAgIHBvbGxFcnJvciA9IGU7CiAgICAgICAgcG9sbFN0YWNrID0gc3Q7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CgogICAgLy8gcG9sbCBmb3IgdGhlIG5ldHdvcmsgZm9yIH4xMCBzZWNvbmRzLgogICAgaW50IGF0dGVtcHRzID0gMDsKICAgIGZpbmFsIGludCBtYXhBdHRlbXB0cyA9IDEwOwogICAgd2hpbGUgKCFhd2FpdCBwb2xsKCkpIHsKICAgICAgYXR0ZW1wdHMrKzsKICAgICAgc2VydmVyUHJpbnQoIk9ic2VydmF0b3J5IHNlcnZlciBmYWlsZWQgdG8gc3RhcnQgYWZ0ZXIgJGF0dGVtcHRzIHRyaWVzIik7CiAgICAgIGlmIChhdHRlbXB0cyA+IG1heEF0dGVtcHRzKSB7CiAgICAgICAgc2VydmVyUHJpbnQoJ0NvdWxkIG5vdCBzdGFydCBPYnNlcnZhdG9yeSBIVFRQIHNlcnZlcjpcbicKICAgICAgICAgICAgJyRwb2xsRXJyb3JcbiRwb2xsU3RhY2tcbicpOwogICAgICAgIF9ub3RpZnlTZXJ2ZXJTdGF0ZSgiIik7CiAgICAgICAgb25TZXJ2ZXJBZGRyZXNzQ2hhbmdlKG51bGwpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIGF3YWl0IG5ldyBGdXR1cmU8TnVsbD4uZGVsYXllZChjb25zdCBEdXJhdGlvbihzZWNvbmRzOiAxKSk7CiAgICB9CiAgICBpZiAoX3NlcnZpY2UuaXNFeGl0aW5nKSB7CiAgICAgIHNlcnZlclByaW50KCdPYnNlcnZhdG9yeSBIVFRQIHNlcnZlciBleGl0aW5nIGJlZm9yZSBsaXN0ZW5pbmcgYXMgJwogICAgICAgICAgJ3ZtIHNlcnZpY2UgaGFzIHJlY2VpdmVkIGV4aXQgcmVxdWVzdFxuJyk7CiAgICAgIGF3YWl0IHNodXRkb3duKHRydWUpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIF9zZXJ2ZXIubGlzdGVuKF9yZXF1ZXN0SGFuZGxlciwgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICBzZXJ2ZXJQcmludCgnT2JzZXJ2YXRvcnkgbGlzdGVuaW5nIG9uICRzZXJ2ZXJBZGRyZXNzJyk7CiAgICBpZiAoUGxhdGZvcm0uaXNGdWNoc2lhKSB7CiAgICAgIC8vIENyZWF0ZSBhIGZpbGUgd2l0aCB0aGUgcG9ydCBudW1iZXIuCiAgICAgIFN0cmluZyB0bXAgPSBEaXJlY3Rvcnkuc3lzdGVtVGVtcC5wYXRoOwogICAgICBTdHJpbmcgcGF0aCA9ICIkdG1wL2RhcnQuc2VydmljZXMvJHtfc2VydmVyLnBvcnR9IjsKICAgICAgc2VydmVyUHJpbnQoIkNyZWF0aW5nICRwYXRoIik7CiAgICAgIG5ldyBGaWxlKHBhdGgpLi5jcmVhdGVTeW5jKHJlY3Vyc2l2ZTogdHJ1ZSk7CiAgICB9CiAgICAvLyBTZXJ2ZXIgaXMgdXAgYW5kIHJ1bm5pbmcuCiAgICBfbm90aWZ5U2VydmVyU3RhdGUoc2VydmVyQWRkcmVzcy50b1N0cmluZygpKTsKICAgIG9uU2VydmVyQWRkcmVzc0NoYW5nZSgnJHNlcnZlckFkZHJlc3MnKTsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgRnV0dXJlIGNsZWFudXAoYm9vbCBmb3JjZSkgewogICAgaWYgKF9zZXJ2ZXIgPT0gbnVsbCkgewogICAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZShudWxsKTsKICAgIH0KICAgIGlmIChQbGF0Zm9ybS5pc0Z1Y2hzaWEpIHsKICAgICAgLy8gUmVtb3ZlIHRoZSBmaWxlIHdpdGggdGhlIHBvcnQgbnVtYmVyLgogICAgICBTdHJpbmcgdG1wID0gRGlyZWN0b3J5LnN5c3RlbVRlbXAucGF0aDsKICAgICAgU3RyaW5nIHBhdGggPSAiJHRtcC9kYXJ0LnNlcnZpY2VzLyR7X3NlcnZlci5wb3J0fSI7CiAgICAgIHNlcnZlclByaW50KCJEZWxldGluZyAkcGF0aCIpOwogICAgICBuZXcgRmlsZShwYXRoKS4uZGVsZXRlU3luYygpOwogICAgfQogICAgcmV0dXJuIF9zZXJ2ZXIuY2xvc2UoZm9yY2U6IGZvcmNlKTsKICB9CgogIEZ1dHVyZSBzaHV0ZG93bihib29sIGZvcmNlZCkgewogICAgaWYgKF9zZXJ2ZXIgPT0gbnVsbCkgewogICAgICAvLyBOb3Qgc3RhcnRlZC4KICAgICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUodGhpcyk7CiAgICB9CgogICAgLy8gU2h1dGRvd24gSFRUUCBzZXJ2ZXIgYW5kIHN1YnNjcmlwdGlvbi4KICAgIFVyaSBvbGRTZXJ2ZXJBZGRyZXNzID0gc2VydmVyQWRkcmVzczsKICAgIHJldHVybiBjbGVhbnVwKGZvcmNlZCkudGhlbigoXykgewogICAgICBzZXJ2ZXJQcmludCgnT2JzZXJ2YXRvcnkgbm8gbG9uZ2VyIGxpc3RlbmluZyBvbiAkb2xkU2VydmVyQWRkcmVzcycpOwogICAgICBfc2VydmVyID0gbnVsbDsKICAgICAgX25vdGlmeVNlcnZlclN0YXRlKCIiKTsKICAgICAgb25TZXJ2ZXJBZGRyZXNzQ2hhbmdlKG51bGwpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0pLmNhdGNoRXJyb3IoKGUsIHN0KSB7CiAgICAgIF9zZXJ2ZXIgPSBudWxsOwogICAgICBzZXJ2ZXJQcmludCgnQ291bGQgbm90IHNodXRkb3duIE9ic2VydmF0b3J5IEhUVFAgc2VydmVyOlxuJGVcbiRzdFxuJyk7CiAgICAgIF9ub3RpZnlTZXJ2ZXJTdGF0ZSgiIik7CiAgICAgIG9uU2VydmVyQWRkcmVzc0NoYW5nZShudWxsKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KTsKICB9Cn0KCnZvaWQgX25vdGlmeVNlcnZlclN0YXRlKFN0cmluZyB1cmkpIG5hdGl2ZSAiVk1TZXJ2aWNlSU9fTm90aWZ5U2VydmVyU3RhdGUiOwqBwABOTjwBFgFPAR0bKgwEDAIBJyw1LikaAUU9JgQBERoWBgQBJR0PDCQUQxAIGUkQCAw4HCQcEykhEyUdEwoUMAgNTAYEAR8aFQ4GCh0pKSYRLS4RCCAmDgYEARUeJR8QBAIBKSdAHQE1KwERHg0EAR8aDw4GLjk+NBsnKA8rJg8nMQYWDQQBFR4nIRAEAgEPJzMBHBQTIyEWJwE7GhQTBiYdQUYEAWNGSR5IASkNCh8SFAYBSR0lHyUTBgEmMjMTBgESBAErIBcTBjNEGzArBhtQEwYlJhUIBhIEAU87NR5MBkYqFBMGMDUpFBMGSSodOgQBNiIzOjIgDgYjPQEXFx0cFRUUAQxFNSABJj1JUCsKASYdN0FPTUYTJAwKIQEVDDdFIQEcLy8oCCAOBiMoQTQgDgYBQBhQNTpIIA4GASJJMgoOBgEaP08gDgYgGT1QKCAOBiM9QkcEARsbGhMGARwTEyAMFTsiNSJACjkVGBcYFggGAS0WIBwSTyRBKSAlFQhCBh5JNRwTBjo8Hi0uOiUzBiEyLREEAR8bJQYeLy46JSQGKAQBIRsWJQYBLiomSxYeIxMcFk0eIxMIBAIBTAEdZGFydDp2bXNlcnZpY2VfaW8vc2VydmVyLmRhcnQ0b3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL3Ztc2VydmljZS92bXNlcnZpY2UuZGFydMAAUfMvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0Ll92bXNlcnZpY2U7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnOwppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CmltcG9ydCAnZGFydDpjb252ZXJ0JzsKaW1wb3J0ICdkYXJ0Omlzb2xhdGUnOwppbXBvcnQgJ2RhcnQ6bWF0aCc7CmltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKCnBhcnQgJ2Fzc2V0LmRhcnQnOwpwYXJ0ICdjbGllbnQuZGFydCc7CnBhcnQgJ2RldmZzLmRhcnQnOwpwYXJ0ICdjb25zdGFudHMuZGFydCc7CnBhcnQgJ3J1bm5pbmdfaXNvbGF0ZS5kYXJ0JzsKcGFydCAncnVubmluZ19pc29sYXRlcy5kYXJ0JzsKcGFydCAnbWVzc2FnZS5kYXJ0JzsKcGFydCAnbWVzc2FnZV9yb3V0ZXIuZGFydCc7CnBhcnQgJ25hbWVkX2xvb2t1cC5kYXJ0JzsKCmZpbmFsIFJhd1JlY2VpdmVQb3J0IGlzb2xhdGVDb250cm9sUG9ydCA9IG5ldyBSYXdSZWNlaXZlUG9ydCgpOwpmaW5hbCBSYXdSZWNlaXZlUG9ydCBzY3JpcHRMb2FkUG9ydCA9IG5ldyBSYXdSZWNlaXZlUG9ydCgpOwoKYWJzdHJhY3QgY2xhc3MgSXNvbGF0ZUVtYmVkZGVyRGF0YSB7CiAgdm9pZCBjbGVhbnVwKCk7Cn0KClN0cmluZyBfbWFrZUF1dGhUb2tlbigpIHsKICBmaW5hbCBrVG9rZW5CeXRlU2l6ZSA9IDg7CiAgVWludDhMaXN0IGJ5dGVzID0gbmV3IFVpbnQ4TGlzdChrVG9rZW5CeXRlU2l6ZSk7CiAgUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20uc2VjdXJlKCk7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBrVG9rZW5CeXRlU2l6ZTsgaSsrKSB7CiAgICBieXRlc1tpXSA9IHJhbmRvbS5uZXh0SW50KDI1Nik7CiAgfQogIHJldHVybiBiYXNlNjRVcmwuZW5jb2RlKGJ5dGVzKTsKfQoKLy8gVGhlIHJhbmRvbWx5IGdlbmVyYXRlZCBhdXRoIHRva2VuIHVzZWQgdG8gYWNjZXNzIHRoZSBWTSBzZXJ2aWNlLgpmaW5hbCBTdHJpbmcgc2VydmljZUF1dGhUb2tlbiA9IF9tYWtlQXV0aFRva2VuKCk7CgovLyBUaGlzIGlzIGZvciB1c2UgYnkgdGhlIGVtYmVkZGVyLiBJdCBpcyBhIG1hcCBmcm9tIHRoZSBpc29sYXRlSWQgdG8KLy8gYW55dGhpbmcgaW1wbGVtZW50aW5nIElzb2xhdGVFbWJlZGRlckRhdGEuIFdoZW4gYW4gaXNvbGF0ZSBnb2VzIGF3YXksCi8vIHRoZSBjbGVhbnVwIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgYWZ0ZXIgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBtYXAuCmZpbmFsIE1hcDxpbnQsIElzb2xhdGVFbWJlZGRlckRhdGE+IGlzb2xhdGVFbWJlZGRlckRhdGEgPQogICAgbmV3IE1hcDxpbnQsIElzb2xhdGVFbWJlZGRlckRhdGE+KCk7CgovLyBUaGVzZSBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBkZWNsYXJhdGlvbnMgaW4gdm0vanNvbl9zdHJlYW0uaC4KY29uc3Qga1BhcnNlRXJyb3IgPSAtMzI3MDA7CmNvbnN0IGtJbnZhbGlkUmVxdWVzdCA9IC0zMjYwMDsKY29uc3Qga01ldGhvZE5vdEZvdW5kID0gLTMyNjAxOwpjb25zdCBrSW52YWxpZFBhcmFtcyA9IC0zMjYwMjsKY29uc3Qga0ludGVybmFsRXJyb3IgPSAtMzI2MDM7Cgpjb25zdCBrRXh0ZW5zaW9uRXJyb3IgPSAtMzIwMDA7Cgpjb25zdCBrRmVhdHVyZURpc2FibGVkID0gMTAwOwpjb25zdCBrQ2Fubm90QWRkQnJlYWtwb2ludCA9IDEwMjsKY29uc3Qga1N0cmVhbUFscmVhZHlTdWJzY3JpYmVkID0gMTAzOwpjb25zdCBrU3RyZWFtTm90U3Vic2NyaWJlZCA9IDEwNDsKY29uc3Qga0lzb2xhdGVNdXN0QmVSdW5uYWJsZSA9IDEwNTsKY29uc3Qga0lzb2xhdGVNdXN0QmVQYXVzZWQgPSAxMDY7CmNvbnN0IGtDYW5ub3RSZXN1bWUgPSAxMDc7CmNvbnN0IGtJc29sYXRlSXNSZWxvYWRpbmcgPSAxMDg7CmNvbnN0IGtJc29sYXRlUmVsb2FkQmFycmVkID0gMTA5Owpjb25zdCBrSXNvbGF0ZU11c3RIYXZlUmVsb2FkZWQgPSAxMTA7CmNvbnN0IGtTZXJ2aWNlQWxyZWFkeVJlZ2lzdGVyZWQgPSAxMTE7CmNvbnN0IGtTZXJ2aWNlRGlzYXBwZWFyZWQgPSAxMTI7CmNvbnN0IGtFeHByZXNzaW9uQ29tcGlsYXRpb25FcnJvciA9IDExMzsKCi8vIEV4cGVyaW1lbnRhbCAodXNlZCBpbiBwcml2YXRlIHJwY3MpLgpjb25zdCBrRmlsZVN5c3RlbUFscmVhZHlFeGlzdHMgPSAxMDAxOwpjb25zdCBrRmlsZVN5c3RlbURvZXNOb3RFeGlzdCA9IDEwMDI7CmNvbnN0IGtGaWxlRG9lc05vdEV4aXN0ID0gMTAwMzsKCnZhciBfZXJyb3JNZXNzYWdlcyA9IHsKICBrSW52YWxpZFBhcmFtczogJ0ludmFsaWQgcGFyYW1zJywKICBrSW50ZXJuYWxFcnJvcjogJ0ludGVybmFsIGVycm9yJywKICBrRmVhdHVyZURpc2FibGVkOiAnRmVhdHVyZSBpcyBkaXNhYmxlZCcsCiAga1N0cmVhbUFscmVhZHlTdWJzY3JpYmVkOiAnU3RyZWFtIGFscmVhZHkgc3Vic2NyaWJlZCcsCiAga1N0cmVhbU5vdFN1YnNjcmliZWQ6ICdTdHJlYW0gbm90IHN1YnNjcmliZWQnLAogIGtGaWxlU3lzdGVtQWxyZWFkeUV4aXN0czogJ0ZpbGUgc3lzdGVtIGFscmVhZHkgZXhpc3RzJywKICBrRmlsZVN5c3RlbURvZXNOb3RFeGlzdDogJ0ZpbGUgc3lzdGVtIGRvZXMgbm90IGV4aXN0JywKICBrRmlsZURvZXNOb3RFeGlzdDogJ0ZpbGUgZG9lcyBub3QgZXhpc3QnLAogIGtTZXJ2aWNlQWxyZWFkeVJlZ2lzdGVyZWQ6ICdTZXJ2aWNlIGFscmVhZHkgcmVnaXN0ZXJlZCcsCiAga1NlcnZpY2VEaXNhcHBlYXJlZDogJ1NlcnZpY2UgaGFzIGRpc2FwcGVhcmVkJywKICBrRXhwcmVzc2lvbkNvbXBpbGF0aW9uRXJyb3I6ICdFeHByZXNzaW9uIGNvbXBpbGF0aW9uIGVycm9yJywKfTsKClN0cmluZyBlbmNvZGVScGNFcnJvcihNZXNzYWdlIG1lc3NhZ2UsIGludCBjb2RlLCB7U3RyaW5nIGRldGFpbHN9KSB7CiAgdmFyIHJlc3BvbnNlID0gewogICAgJ2pzb25ycGMnOiAnMi4wJywKICAgICdpZCc6IG1lc3NhZ2Uuc2VyaWFsLAogICAgJ2Vycm9yJzogewogICAgICAnY29kZSc6IGNvZGUsCiAgICAgICdtZXNzYWdlJzogX2Vycm9yTWVzc2FnZXNbY29kZV0sCiAgICB9LAogIH07CiAgaWYgKGRldGFpbHMgIT0gbnVsbCkgewogICAgcmVzcG9uc2VbJ2Vycm9yJ11bJ2RhdGEnXSA9IHsKICAgICAgJ2RldGFpbHMnOiBkZXRhaWxzLAogICAgfTsKICB9CiAgcmV0dXJuIGpzb24uZW5jb2RlKHJlc3BvbnNlKTsKfQoKU3RyaW5nIGVuY29kZU1pc3NpbmdQYXJhbUVycm9yKE1lc3NhZ2UgbWVzc2FnZSwgU3RyaW5nIHBhcmFtKSB7CiAgcmV0dXJuIGVuY29kZVJwY0Vycm9yKG1lc3NhZ2UsIGtJbnZhbGlkUGFyYW1zLAogICAgICBkZXRhaWxzOiAiJHttZXNzYWdlLm1ldGhvZH0gZXhwZWN0cyB0aGUgJyR7cGFyYW19JyBwYXJhbWV0ZXIiKTsKfQoKU3RyaW5nIGVuY29kZUludmFsaWRQYXJhbUVycm9yKE1lc3NhZ2UgbWVzc2FnZSwgU3RyaW5nIHBhcmFtKSB7CiAgdmFyIHZhbHVlID0gbWVzc2FnZS5wYXJhbXNbcGFyYW1dOwogIHJldHVybiBlbmNvZGVScGNFcnJvcihtZXNzYWdlLCBrSW52YWxpZFBhcmFtcywKICAgICAgZGV0YWlsczogIiR7bWVzc2FnZS5tZXRob2R9OiBpbnZhbGlkICcke3BhcmFtfScgcGFyYW1ldGVyOiAke3ZhbHVlfSIpOwp9CgpTdHJpbmcgZW5jb2RlQ29tcGlsYXRpb25FcnJvcihNZXNzYWdlIG1lc3NhZ2UsIFN0cmluZyBkaWFnbm9zdGljKSB7CiAgcmV0dXJuIGVuY29kZVJwY0Vycm9yKG1lc3NhZ2UsIGtFeHByZXNzaW9uQ29tcGlsYXRpb25FcnJvciwKICAgICAgZGV0YWlsczogZGlhZ25vc3RpYyk7Cn0KClN0cmluZyBlbmNvZGVSZXN1bHQoTWVzc2FnZSBtZXNzYWdlLCBNYXAgcmVzdWx0KSB7CiAgdmFyIHJlc3BvbnNlID0gewogICAgJ2pzb25ycGMnOiAnMi4wJywKICAgICdpZCc6IG1lc3NhZ2Uuc2VyaWFsLAogICAgJ3Jlc3VsdCc6IHJlc3VsdCwKICB9OwogIHJldHVybiBqc29uLmVuY29kZShyZXNwb25zZSk7Cn0KClN0cmluZyBlbmNvZGVTdWNjZXNzKE1lc3NhZ2UgbWVzc2FnZSkgewogIHJldHVybiBlbmNvZGVSZXN1bHQobWVzc2FnZSwgeyd0eXBlJzogJ1N1Y2Nlc3MnfSk7Cn0KCmNvbnN0IHNob3J0RGVsYXkgPSBjb25zdCBEdXJhdGlvbihtaWxsaXNlY29uZHM6IDEwKTsKCi8vLyBDYWxsZWQgd2hlbiB0aGUgc2VydmVyIHNob3VsZCBiZSBzdGFydGVkLgp0eXBlZGVmIEZ1dHVyZSBTZXJ2ZXJTdGFydENhbGxiYWNrKCk7CgovLy8gQ2FsbGVkIHdoZW4gdGhlIHNlcnZlciBzaG91bGQgYmUgc3RvcHBlZC4KdHlwZWRlZiBGdXR1cmUgU2VydmVyU3RvcENhbGxiYWNrKCk7CgovLy8gQ2FsbGVkIHdoZW4gdGhlIHNlcnZpY2UgaXMgZXhpdGluZy4KdHlwZWRlZiBGdXR1cmUgQ2xlYW51cENhbGxiYWNrKCk7CgovLy8gQ2FsbGVkIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkKdHlwZWRlZiBGdXR1cmU8VXJpPiBDcmVhdGVUZW1wRGlyQ2FsbGJhY2soU3RyaW5nIGJhc2UpOwoKLy8vIENhbGxlZCB0byBkZWxldGUgYSBkaXJlY3RvcnkKdHlwZWRlZiBGdXR1cmUgRGVsZXRlRGlyQ2FsbGJhY2soVXJpIHBhdGgpOwoKLy8vIENhbGxlZCB0byB3cml0ZSBhIGZpbGUuCnR5cGVkZWYgRnV0dXJlIFdyaXRlRmlsZUNhbGxiYWNrKFVyaSBwYXRoLCBMaXN0PGludD4gYnl0ZXMpOwoKLy8vIENhbGxlZCB0byB3cml0ZSBhIHN0cmVhbSBpbnRvIGEgZmlsZS4KdHlwZWRlZiBGdXR1cmUgV3JpdGVTdHJlYW1GaWxlQ2FsbGJhY2soVXJpIHBhdGgsIFN0cmVhbTxMaXN0PGludD4+IGJ5dGVzKTsKCi8vLyBDYWxsZWQgdG8gcmVhZCBhIGZpbGUuCnR5cGVkZWYgRnV0dXJlPExpc3Q8aW50Pj4gUmVhZEZpbGVDYWxsYmFjayhVcmkgcGF0aCk7CgovLy8gQ2FsbGVkIHRvIGxpc3QgYWxsIGZpbGVzIHVuZGVyIHNvbWUgcGF0aC4KdHlwZWRlZiBGdXR1cmU8TGlzdDxNYXA8U3RyaW5nLCBkeW5hbWljPj4+IExpc3RGaWxlc0NhbGxiYWNrKFVyaSBwYXRoKTsKCi8vLyBDYWxsZWQgd2hlbiB3ZSBuZWVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZXJ2ZXIuCnR5cGVkZWYgRnV0dXJlPFVyaT4gU2VydmVySW5mb3JtYW1lc3NhZ2Vfcm91dGVydGlvbkNhbGxiYWNrKCk7CgovLy8gQ2FsbGVkIHdoZW4gd2UgbmVlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VydmVyLgp0eXBlZGVmIEZ1dHVyZTxVcmk+IFNlcnZlckluZm9ybWF0aW9uQ2FsbGJhY2soKTsKCi8vLyBDYWxsZWQgd2hlbiB3ZSB3YW50IHRvIFtlbmFibGVdIG9yIGRpc2FibGUgdGhlIHdlYiBzZXJ2ZXIuCnR5cGVkZWYgRnV0dXJlPFVyaT4gV2ViU2VydmVyQ29udHJvbENhbGxiYWNrKGJvb2wgZW5hYmxlKTsKCi8vLyBIb29rcyB0aGF0IGFyZSBzZXR1cCBieSB0aGUgZW1iZWRkZXIuCmNsYXNzIFZNU2VydmljZUVtYmVkZGVySG9va3MgewogIHN0YXRpYyBTZXJ2ZXJTdGFydENhbGxiYWNrIHNlcnZlclN0YXJ0OwogIHN0YXRpYyBTZXJ2ZXJTdG9wQ2FsbGJhY2sgc2VydmVyU3RvcDsKICBzdGF0aWMgQ2xlYW51cENhbGxiYWNrIGNsZWFudXA7CiAgc3RhdGljIENyZWF0ZVRlbXBEaXJDYWxsYmFjayBjcmVhdGVUZW1wRGlyOwogIHN0YXRpYyBEZWxldGVEaXJDYWxsYmFjayBkZWxldGVEaXI7CiAgc3RhdGljIFdyaXRlRmlsZUNhbGxiYWNrIHdyaXRlRmlsZTsKICBzdGF0aWMgV3JpdGVTdHJlYW1GaWxlQ2FsbGJhY2sgd3JpdGVTdHJlYW1GaWxlOwogIHN0YXRpYyBSZWFkRmlsZUNhbGxiYWNrIHJlYWRGaWxlOwogIHN0YXRpYyBMaXN0RmlsZXNDYWxsYmFjayBsaXN0RmlsZXM7CiAgc3RhdGljIFNlcnZlckluZm9ybWF0aW9uQ2FsbGJhY2sgc2VydmVySW5mb3JtYXRpb247CiAgc3RhdGljIFdlYlNlcnZlckNvbnRyb2xDYWxsYmFjayB3ZWJTZXJ2ZXJDb250cm9sOwp9CgpjbGFzcyBWTVNlcnZpY2UgZXh0ZW5kcyBNZXNzYWdlUm91dGVyIHsKICBzdGF0aWMgVk1TZXJ2aWNlIF9pbnN0YW5jZTsKCiAgc3RhdGljIGNvbnN0IHNlcnZpY2VOYW1lc3BhY2UgPSAncyc7CgogIC8vLyBDb2xsZWN0aW9uIG9mIGN1cnJlbnRseSBjb25uZWN0ZWQgY2xpZW50cy4KICBmaW5hbCBOYW1lZExvb2t1cDxDbGllbnQ+IGNsaWVudHMgPQogICAgICBuZXcgTmFtZWRMb29rdXA8Q2xpZW50Pihwcm9sb2d1ZTogc2VydmljZU5hbWVzcGFjZSk7CiAgZmluYWwgSWRHZW5lcmF0b3IgX3NlcnZpY2VSZXF1ZXN0cyA9IG5ldyBJZEdlbmVyYXRvcihwcm9sb2d1ZTogJ3NyJyk7CgogIC8vLyBDb2xsZWN0aW9uIG9mIGN1cnJlbnRseSBydW5uaW5nIGlzb2xhdGVzLgogIFJ1bm5pbmdJc29sYXRlcyBydW5uaW5nSXNvbGF0ZXMgPSBuZXcgUnVubmluZ0lzb2xhdGVzKCk7CgogIC8vLyBGbGFnIHRvIGluZGljYXRlIFZNIHNlcnZpY2UgaXMgZXhpdGluZy4KICBib29sIGlzRXhpdGluZyA9IGZhbHNlOwoKICAvLy8gQSBwb3J0IHVzZWQgdG8gcmVjZWl2ZSBldmVudHMgZnJvbSB0aGUgVk0uCiAgZmluYWwgUmF3UmVjZWl2ZVBvcnQgZXZlbnRQb3J0OwoKICBmaW5hbCBkZXZmcyA9IG5ldyBEZXZGUygpOwoKICB2b2lkIF9hZGRDbGllbnQoQ2xpZW50IGNsaWVudCkgewogICAgYXNzZXJ0KGNsaWVudC5zdHJlYW1zLmlzRW1wdHkpOwogICAgYXNzZXJ0KGNsaWVudC5zZXJ2aWNlcy5pc0VtcHR5KTsKICAgIGNsaWVudHMuYWRkKGNsaWVudCk7CiAgfQoKICB2b2lkIF9yZW1vdmVDbGllbnQoQ2xpZW50IGNsaWVudCkgewogICAgZmluYWwgbmFtZXNwYWNlID0gY2xpZW50cy5rZXlPZihjbGllbnQpOwogICAgY2xpZW50cy5yZW1vdmUoY2xpZW50KTsKICAgIGZvciAodmFyIHN0cmVhbUlkIGluIGNsaWVudC5zdHJlYW1zKSB7CiAgICAgIGlmICghX2lzQW55Q2xpZW50U3Vic2NyaWJlZChzdHJlYW1JZCkpIHsKICAgICAgICBfdm1DYW5jZWxTdHJlYW0oc3RyZWFtSWQpOwogICAgICB9CiAgICB9CiAgICBmb3IgKHZhciBzZXJ2aWNlIGluIGNsaWVudC5zZXJ2aWNlcy5rZXlzKSB7CiAgICAgIF9ldmVudE1lc3NhZ2VIYW5kbGVyKAogICAgICAgICAgJ19TZXJ2aWNlJywKICAgICAgICAgIG5ldyBSZXNwb25zZS5qc29uKHsKICAgICAgICAgICAgJ2pzb25ycGMnOiAnMi4wJywKICAgICAgICAgICAgJ21ldGhvZCc6ICdzdHJlYW1Ob3RpZnknLAogICAgICAgICAgICAncGFyYW1zJzogewogICAgICAgICAgICAgICdzdHJlYW1JZCc6ICdfU2VydmljZScsCiAgICAgICAgICAgICAgJ2V2ZW50JzogewogICAgICAgICAgICAgICAgInR5cGUiOiAiRXZlbnQiLAogICAgICAgICAgICAgICAgImtpbmQiOiAiU2VydmljZVVucmVnaXN0ZXJlZCIsCiAgICAgICAgICAgICAgICAndGltZXN0YW1wJzogbmV3IERhdGVUaW1lLm5vdygpLm1pbGxpc2Vjb25kc1NpbmNlRXBvY2gsCiAgICAgICAgICAgICAgICAnc2VydmljZSc6IHNlcnZpY2UsCiAgICAgICAgICAgICAgICAnbWV0aG9kJzogbmFtZXNwYWNlICsgJy4nICsgc2VydmljZSwKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pKTsKICAgIH0KICAgIC8vIENvbXBsZXRlIGFsbCByZXF1ZXN0cyBhcyBmYWlsZWQKICAgIGZvciAodmFyIGhhbmRsZSBpbiBjbGllbnQuc2VydmljZUhhbmRsZXMudmFsdWVzKSB7CiAgICAgIGhhbmRsZShudWxsKTsKICAgIH0KICB9CgogIHZvaWQgX2V2ZW50TWVzc2FnZUhhbmRsZXIoU3RyaW5nIHN0cmVhbUlkLCBSZXNwb25zZSBldmVudCkgewogICAgZm9yICh2YXIgY2xpZW50IGluIGNsaWVudHMpIHsKICAgICAgaWYgKGNsaWVudC5zZW5kRXZlbnRzICYmIGNsaWVudC5zdHJlYW1zLmNvbnRhaW5zKHN0cmVhbUlkKSkgewogICAgICAgIGNsaWVudC5wb3N0KGV2ZW50KTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBfY29udHJvbE1lc3NhZ2VIYW5kbGVyKGludCBjb2RlLCBpbnQgcG9ydElkLCBTZW5kUG9ydCBzcCwgU3RyaW5nIG5hbWUpIHsKICAgIHN3aXRjaCAoY29kZSkgewogICAgICBjYXNlIENvbnN0YW50cy5JU09MQVRFX1NUQVJUVVBfTUVTU0FHRV9JRDoKICAgICAgICBydW5uaW5nSXNvbGF0ZXMuaXNvbGF0ZVN0YXJ0dXAocG9ydElkLCBzcCwgbmFtZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ29uc3RhbnRzLklTT0xBVEVfU0hVVERPV05fTUVTU0FHRV9JRDoKICAgICAgICBydW5uaW5nSXNvbGF0ZXMuaXNvbGF0ZVNodXRkb3duKHBvcnRJZCwgc3ApOwogICAgICAgIElzb2xhdGVFbWJlZGRlckRhdGEgaWVkID0gaXNvbGF0ZUVtYmVkZGVyRGF0YS5yZW1vdmUocG9ydElkKTsKICAgICAgICBpZiAoaWVkICE9IG51bGwpIHsKICAgICAgICAgIGllZC5jbGVhbnVwKCk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgRnV0dXJlPE51bGw+IF9zZXJ2ZXJNZXNzYWdlSGFuZGxlcihpbnQgY29kZSwgU2VuZFBvcnQgc3AsIGJvb2wgZW5hYmxlKSBhc3luYyB7CiAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgY2FzZSBDb25zdGFudHMuV0VCX1NFUlZFUl9DT05UUk9MX01FU1NBR0VfSUQ6CiAgICAgICAgaWYgKFZNU2VydmljZUVtYmVkZGVySG9va3Mud2ViU2VydmVyQ29udHJvbCA9PSBudWxsKSB7CiAgICAgICAgICBzcC5zZW5kKG51bGwpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBVcmkgdXJpID0gYXdhaXQgVk1TZXJ2aWNlRW1iZWRkZXJIb29rcy53ZWJTZXJ2ZXJDb250cm9sKGVuYWJsZSk7CiAgICAgICAgc3Auc2VuZCh1cmkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENvbnN0YW50cy5TRVJWRVJfSU5GT19NRVNTQUdFX0lEOgogICAgICAgIGlmIChWTVNlcnZpY2VFbWJlZGRlckhvb2tzLnNlcnZlckluZm9ybWF0aW9uID09IG51bGwpIHsKICAgICAgICAgIHNwLnNlbmQobnVsbCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIFVyaSB1cmkgPSBhd2FpdCBWTVNlcnZpY2VFbWJlZGRlckhvb2tzLnNlcnZlckluZm9ybWF0aW9uKCk7CiAgICAgICAgc3Auc2VuZCh1cmkpOwogICAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgRnV0dXJlPE51bGw+IF9oYW5kbGVOYXRpdmVScGNDYWxsKG1lc3NhZ2UsIFNlbmRQb3J0IHJlcGx5UG9ydCkgYXN5bmMgewogICAgLy8gS2VlcCBpbiBzeW5jIHdpdGggInJ1bnRpbWUvdm0vc2VydmljZV9pc29sYXRlLmNjOkludm9rZVNlcnZpY2VScGMiLgogICAgUmVzcG9uc2UgcmVzcG9uc2U7CgogICAgdHJ5IHsKICAgICAgZmluYWwgTWVzc2FnZSBycGMgPSBuZXcgTWVzc2FnZS5mcm9tSnNvblJwYygKICAgICAgICAgIG51bGwsIGpzb24uZGVjb2RlKHV0ZjguZGVjb2RlKG1lc3NhZ2UgYXMgTGlzdDxpbnQ+KSkpOwogICAgICBpZiAocnBjLnR5cGUgIT0gTWVzc2FnZVR5cGUuUmVxdWVzdCkgewogICAgICAgIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlLmludGVybmFsRXJyb3IoCiAgICAgICAgICAgICdUaGUgY2xpZW50IHNlbnQgYSBub24tcmVxdWVzdCBqc29uLXJwYyBtZXNzYWdlLicpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc3BvbnNlID0gYXdhaXQgcm91dGVSZXF1ZXN0KHRoaXMsIHJwYyk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgewogICAgICByZXNwb25zZSA9IG5ldyBSZXNwb25zZS5pbnRlcm5hbEVycm9yKAogICAgICAgICAgJ1RoZSBycGMgY2FsbCByZXN1bHRlZCBpbiBleGNlcHRpb246ICRleGNlcHRpb24uJyk7CiAgICB9CiAgICBMaXN0PGludD4gYnl0ZXM7CiAgICBzd2l0Y2ggKHJlc3BvbnNlLmtpbmQpIHsKICAgICAgY2FzZSBSZXNwb25zZVBheWxvYWRLaW5kLlN0cmluZzoKICAgICAgICBieXRlcyA9IHV0ZjguZW5jb2RlKHJlc3BvbnNlLnBheWxvYWQpOwogICAgICAgIGJ5dGVzID0gYnl0ZXMgaXMgVWludDhMaXN0ID8gYnl0ZXMgOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KGJ5dGVzKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBSZXNwb25zZVBheWxvYWRLaW5kLkJpbmFyeToKICAgICAgY2FzZSBSZXNwb25zZVBheWxvYWRLaW5kLlV0ZjhTdHJpbmc6CiAgICAgICAgYnl0ZXMgPSByZXNwb25zZS5wYXlsb2FkIGFzIFVpbnQ4TGlzdDsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJlcGx5UG9ydC5zZW5kKGJ5dGVzKTsKICB9CgogIEZ1dHVyZSBfZXhpdCgpIGFzeW5jIHsKICAgIGlzRXhpdGluZyA9IHRydWU7CgogICAgLy8gU3RvcCB0aGUgc2VydmVyLgogICAgaWYgKFZNU2VydmljZUVtYmVkZGVySG9va3Muc2VydmVyU3RvcCAhPSBudWxsKSB7CiAgICAgIGF3YWl0IFZNU2VydmljZUVtYmVkZGVySG9va3Muc2VydmVyU3RvcCgpOwogICAgfQoKICAgIC8vIENsb3NlIHJlY2VpdmUgcG9ydHMuCiAgICBpc29sYXRlQ29udHJvbFBvcnQuY2xvc2UoKTsKICAgIHNjcmlwdExvYWRQb3J0LmNsb3NlKCk7CgogICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgc2V0IGFzIGEgbGlzdCBiZWNhdXNlIGNsaWVudC5kaXNjb25uZWN0KCkgd2lsbAogICAgLy8gYWx0ZXIgdGhlIGNvbm5lY3RlZCBjbGllbnRzIHNldC4KICAgIHZhciBjbGllbnRzTGlzdCA9IGNsaWVudHMudG9MaXN0KCk7CiAgICBmb3IgKHZhciBjbGllbnQgaW4gY2xpZW50c0xpc3QpIHsKICAgICAgY2xpZW50LmRpc2Nvbm5lY3QoKTsKICAgIH0KICAgIGRldmZzLmNsZWFudXAoKTsKICAgIGlmIChWTVNlcnZpY2VFbWJlZGRlckhvb2tzLmNsZWFudXAgIT0gbnVsbCkgewogICAgICBhd2FpdCBWTVNlcnZpY2VFbWJlZGRlckhvb2tzLmNsZWFudXAoKTsKICAgIH0KCiAgICAvLyBOb3RpZnkgdGhlIFZNIHRoYXQgd2UgaGF2ZSBleGl0ZWQuCiAgICBfb25FeGl0KCk7CiAgfQoKICB2b2lkIG1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UpIHsKICAgIGlmIChtZXNzYWdlIGlzIExpc3QpIHsKICAgICAgaWYgKG1lc3NhZ2UubGVuZ3RoID09IDIpIHsKICAgICAgICAvLyBUaGlzIGlzIGFuIGV2ZW50LgogICAgICAgIF9ldmVudE1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2VbMF0sIG5ldyBSZXNwb25zZS5mcm9tKG1lc3NhZ2VbMV0pKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKG1lc3NhZ2UubGVuZ3RoID09IDEpIHsKICAgICAgICAvLyBUaGlzIGlzIGEgY29udHJvbCBtZXNzYWdlIGRpcmVjdGluZyB0aGUgdm0gc2VydmljZSB0byBleGl0LgogICAgICAgIGFzc2VydChtZXNzYWdlWzBdID09IENvbnN0YW50cy5TRVJWSUNFX0VYSVRfTUVTU0FHRV9JRCk7CiAgICAgICAgX2V4aXQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKG1lc3NhZ2UubGVuZ3RoID09IDMpIHsKICAgICAgICBmaW5hbCBvcGNvZGUgPSBtZXNzYWdlWzBdOwogICAgICAgIGlmIChvcGNvZGUgPT0gQ29uc3RhbnRzLk1FVEhPRF9DQUxMX0ZST01fTkFUSVZFKSB7CiAgICAgICAgICBfaGFuZGxlTmF0aXZlUnBjQ2FsbChtZXNzYWdlWzFdLCBtZXNzYWdlWzJdKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gVGhpcyBpcyBhIG1lc3NhZ2UgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgd2ViIHNlcnZlci4KICAgICAgICAgIGFzc2VydCgob3Bjb2RlID09IENvbnN0YW50cy5XRUJfU0VSVkVSX0NPTlRST0xfTUVTU0FHRV9JRCkgfHwKICAgICAgICAgICAgICAob3Bjb2RlID09IENvbnN0YW50cy5TRVJWRVJfSU5GT19NRVNTQUdFX0lEKSk7CiAgICAgICAgICBfc2VydmVyTWVzc2FnZUhhbmRsZXIobWVzc2FnZVswXSwgbWVzc2FnZVsxXSwgbWVzc2FnZVsyXSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChtZXNzYWdlLmxlbmd0aCA9PSA0KSB7CiAgICAgICAgLy8gVGhpcyBpcyBhIG1lc3NhZ2UgaW5mb3JtaW5nIHVzIG9mIHRoZSBiaXJ0aCBvciBkZWF0aCBvZiBhbgogICAgICAgIC8vIGlzb2xhdGUuCiAgICAgICAgX2NvbnRyb2xNZXNzYWdlSGFuZGxlcihtZXNzYWdlWzBdLCBtZXNzYWdlWzFdLCBtZXNzYWdlWzJdLCBtZXNzYWdlWzNdKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgIHByaW50KCdJbnRlcm5hbCB2bS1zZXJ2aWNlIGVycm9yOiBpZ25vcmluZyBpbGxlZ2FsIG1lc3NhZ2U6ICRtZXNzYWdlJyk7CiAgfQoKICBWTVNlcnZpY2UuX2ludGVybmFsKCkgOiBldmVudFBvcnQgPSBpc29sYXRlQ29udHJvbFBvcnQgewogICAgZXZlbnRQb3J0LmhhbmRsZXIgPSBtZXNzYWdlSGFuZGxlcjsKICB9CgogIGZhY3RvcnkgVk1TZXJ2aWNlKCkgewogICAgaWYgKFZNU2VydmljZS5faW5zdGFuY2UgPT0gbnVsbCkgewogICAgICBWTVNlcnZpY2UuX2luc3RhbmNlID0gbmV3IFZNU2VydmljZS5faW50ZXJuYWwoKTsKICAgICAgX29uU3RhcnQoKTsKICAgIH0KICAgIHJldHVybiBfaW5zdGFuY2U7CiAgfQoKICBib29sIF9pc0FueUNsaWVudFN1YnNjcmliZWQoU3RyaW5nIHN0cmVhbUlkKSB7CiAgICBmb3IgKHZhciBjbGllbnQgaW4gY2xpZW50cykgewogICAgICBpZiAoY2xpZW50LnN0cmVhbXMuY29udGFpbnMoc3RyZWFtSWQpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIENsaWVudCBfZmluZEZpcnN0Q2xpZW50VGhhdEhhbmRsZXNTZXJ2aWNlKFN0cmluZyBzZXJ2aWNlKSB7CiAgICBpZiAoY2xpZW50cyAhPSBudWxsKSB7CiAgICAgIGZvciAoQ2xpZW50IGMgaW4gY2xpZW50cykgewogICAgICAgIGlmIChjLnNlcnZpY2VzLmNvbnRhaW5zS2V5KHNlcnZpY2UpKSB7CiAgICAgICAgICByZXR1cm4gYzsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgc3RhdGljIGNvbnN0IGtTZXJ2aWNlU3RyZWFtID0gJ19TZXJ2aWNlJzsKICBzdGF0aWMgY29uc3Qgc2VydmljZVN0cmVhbXMgPSBjb25zdCBba1NlcnZpY2VTdHJlYW1dOwoKICBGdXR1cmU8U3RyaW5nPiBfc3RyZWFtTGlzdGVuKE1lc3NhZ2UgbWVzc2FnZSkgYXN5bmMgewogICAgdmFyIGNsaWVudCA9IG1lc3NhZ2UuY2xpZW50OwogICAgdmFyIHN0cmVhbUlkID0gbWVzc2FnZS5wYXJhbXNbJ3N0cmVhbUlkJ107CgogICAgaWYgKGNsaWVudC5zdHJlYW1zLmNvbnRhaW5zKHN0cmVhbUlkKSkgewogICAgICByZXR1cm4gZW5jb2RlUnBjRXJyb3IobWVzc2FnZSwga1N0cmVhbUFscmVhZHlTdWJzY3JpYmVkKTsKICAgIH0KICAgIGlmICghX2lzQW55Q2xpZW50U3Vic2NyaWJlZChzdHJlYW1JZCkpIHsKICAgICAgaWYgKCFzZXJ2aWNlU3RyZWFtcy5jb250YWlucyhzdHJlYW1JZCkgJiYgIV92bUxpc3RlblN0cmVhbShzdHJlYW1JZCkpIHsKICAgICAgICByZXR1cm4gZW5jb2RlUnBjRXJyb3IobWVzc2FnZSwga0ludmFsaWRQYXJhbXMsCiAgICAgICAgICAgIGRldGFpbHM6ICJzdHJlYW1MaXN0ZW46IGludmFsaWQgJ3N0cmVhbUlkJyBwYXJhbWV0ZXI6ICR7c3RyZWFtSWR9Iik7CiAgICAgIH0KICAgIH0KCiAgICAvLyBTb21lIHN0cmVhbXMgY2FuIGdlbmVyYXRlIGV2ZW50cyBvciBzaWRlIGVmZmVjdHMgYWZ0ZXIgcmVnaXN0cmF0aW9uCiAgICBzd2l0Y2ggKHN0cmVhbUlkKSB7CiAgICAgIGNhc2Uga1NlcnZpY2VTdHJlYW06CiAgICAgICAgZm9yIChDbGllbnQgYyBpbiBjbGllbnRzKSB7CiAgICAgICAgICBpZiAoYyA9PSBjbGllbnQpIGNvbnRpbnVlOwogICAgICAgICAgZm9yIChTdHJpbmcgc2VydmljZSBpbiBjLnNlcnZpY2VzLmtleXMpIHsKICAgICAgICAgICAgX3NlbmRTZXJ2aWNlUmVnaXN0ZXJlZEV2ZW50KGMsIHNlcnZpY2UsIHRhcmdldDogY2xpZW50KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgOwogICAgICAgIGJyZWFrOwogICAgfQoKICAgIGNsaWVudC5zdHJlYW1zLmFkZChzdHJlYW1JZCk7CiAgICByZXR1cm4gZW5jb2RlU3VjY2VzcyhtZXNzYWdlKTsKICB9CgogIEZ1dHVyZTxTdHJpbmc+IF9zdHJlYW1DYW5jZWwoTWVzc2FnZSBtZXNzYWdlKSBhc3luYyB7CiAgICB2YXIgY2xpZW50ID0gbWVzc2FnZS5jbGllbnQ7CiAgICB2YXIgc3RyZWFtSWQgPSBtZXNzYWdlLnBhcmFtc1snc3RyZWFtSWQnXTsKCiAgICBpZiAoIWNsaWVudC5zdHJlYW1zLmNvbnRhaW5zKHN0cmVhbUlkKSkgewogICAgICByZXR1cm4gZW5jb2RlUnBjRXJyb3IobWVzc2FnZSwga1N0cmVhbU5vdFN1YnNjcmliZWQpOwogICAgfQogICAgY2xpZW50LnN0cmVhbXMucmVtb3ZlKHN0cmVhbUlkKTsKICAgIGlmICghc2VydmljZVN0cmVhbXMuY29udGFpbnMoc3RyZWFtSWQpICYmCiAgICAgICAgIV9pc0FueUNsaWVudFN1YnNjcmliZWQoc3RyZWFtSWQpKSB7CiAgICAgIF92bUNhbmNlbFN0cmVhbShzdHJlYW1JZCk7CiAgICB9CgogICAgcmV0dXJuIGVuY29kZVN1Y2Nlc3MobWVzc2FnZSk7CiAgfQoKICBzdGF0aWMgYm9vbCBfaGFzTmFtZXNwYWNlKFN0cmluZyBtZXRob2QpID0+CiAgICAgIG1ldGhvZC5jb250YWlucygnLicpICYmCiAgICAgIF9nZXROYW1lc3BhY2UobWV0aG9kKS5zdGFydHNXaXRoKHNlcnZpY2VOYW1lc3BhY2UpOwogIHN0YXRpYyBTdHJpbmcgX2dldE5hbWVzcGFjZShTdHJpbmcgbWV0aG9kKSA9PiBtZXRob2Quc3BsaXQoJy4nKS5maXJzdDsKICBzdGF0aWMgU3RyaW5nIF9nZXRNZXRob2QoU3RyaW5nIG1ldGhvZCkgPT4gbWV0aG9kLnNwbGl0KCcuJykubGFzdDsKCiAgRnV0dXJlPFN0cmluZz4gX3JlZ2lzdGVyU2VydmljZShNZXNzYWdlIG1lc3NhZ2UpIGFzeW5jIHsKICAgIGZpbmFsIGNsaWVudCA9IG1lc3NhZ2UuY2xpZW50OwogICAgZmluYWwgc2VydmljZSA9IG1lc3NhZ2UucGFyYW1zWydzZXJ2aWNlJ107CiAgICBmaW5hbCBhbGlhcyA9IG1lc3NhZ2UucGFyYW1zWydhbGlhcyddOwoKICAgIGlmIChzZXJ2aWNlIGlzISBTdHJpbmcgfHwgc2VydmljZSA9PSAnJykgewogICAgICByZXR1cm4gZW5jb2RlUnBjRXJyb3IobWVzc2FnZSwga0ludmFsaWRQYXJhbXMsCiAgICAgICAgICBkZXRhaWxzOiAicmVnaXN0ZXJTZXJ2aWNlOiBpbnZhbGlkICdzZXJ2aWNlJyBwYXJhbWV0ZXI6ICR7c2VydmljZX0iKTsKICAgIH0KICAgIGlmIChhbGlhcyBpcyEgU3RyaW5nIHx8IGFsaWFzID09ICcnKSB7CiAgICAgIHJldHVybiBlbmNvZGVScGNFcnJvcihtZXNzYWdlLCBrSW52YWxpZFBhcmFtcywKICAgICAgICAgIGRldGFpbHM6ICJyZWdpc3RlclNlcnZpY2U6IGludmFsaWQgJ2FsaWFzJyBwYXJhbWV0ZXI6ICR7YWxpYXN9Iik7CiAgICB9CiAgICBpZiAoY2xpZW50LnNlcnZpY2VzLmNvbnRhaW5zS2V5KHNlcnZpY2UpKSB7CiAgICAgIHJldHVybiBlbmNvZGVScGNFcnJvcihtZXNzYWdlLCBrU2VydmljZUFscmVhZHlSZWdpc3RlcmVkKTsKICAgIH0KICAgIGNsaWVudC5zZXJ2aWNlc1tzZXJ2aWNlXSA9IGFsaWFzOwoKICAgIGJvb2wgcmVtb3ZlZDsKICAgIHRyeSB7CiAgICAgIC8vIERvIG5vdCBzZW5kIHN0cmVhbWluZyBldmVudHMgdG8gdGhlIGNsaWVudCB3aGljaCByZWdpc3RlcnMgdGhlIHNlcnZpY2UKICAgICAgcmVtb3ZlZCA9IGNsaWVudC5zdHJlYW1zLnJlbW92ZShrU2VydmljZVN0cmVhbSk7CiAgICAgIGF3YWl0IF9zZW5kU2VydmljZVJlZ2lzdGVyZWRFdmVudChjbGllbnQsIHNlcnZpY2UpOwogICAgfSBmaW5hbGx5IHsKICAgICAgaWYgKHJlbW92ZWQpIGNsaWVudC5zdHJlYW1zLmFkZChrU2VydmljZVN0cmVhbSk7CiAgICB9CgogICAgcmV0dXJuIGVuY29kZVN1Y2Nlc3MobWVzc2FnZSk7CiAgfQoKICBfc2VuZFNlcnZpY2VSZWdpc3RlcmVkRXZlbnQoQ2xpZW50IGNsaWVudCwgU3RyaW5nIHNlcnZpY2UsCiAgICAgIHtDbGllbnQgdGFyZ2V0fSkgYXN5bmMgewogICAgZmluYWwgbmFtZXNwYWNlID0gY2xpZW50cy5rZXlPZihjbGllbnQpOwogICAgZmluYWwgYWxpYXMgPSBjbGllbnQuc2VydmljZXNbc2VydmljZV07CiAgICBmaW5hbCBldmVudCA9IG5ldyBSZXNwb25zZS5qc29uKHsKICAgICAgJ2pzb25ycGMnOiAnMi4wJywKICAgICAgJ21ldGhvZCc6ICdzdHJlYW1Ob3RpZnknLAogICAgICAncGFyYW1zJzogewogICAgICAgICdzdHJlYW1JZCc6IGtTZXJ2aWNlU3RyZWFtLAogICAgICAgICdldmVudCc6IHsKICAgICAgICAgICJ0eXBlIjogIkV2ZW50IiwKICAgICAgICAgICJraW5kIjogIlNlcnZpY2VSZWdpc3RlcmVkIiwKICAgICAgICAgICd0aW1lc3RhbXAnOiBuZXcgRGF0ZVRpbWUubm93KCkubWlsbGlzZWNvbmRzU2luY2VFcG9jaCwKICAgICAgICAgICdzZXJ2aWNlJzogc2VydmljZSwKICAgICAgICAgICdtZXRob2QnOiBuYW1lc3BhY2UgKyAnLicgKyBzZXJ2aWNlLAogICAgICAgICAgJ2FsaWFzJzogYWxpYXMKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgaWYgKHRhcmdldCA9PSBudWxsKSB7CiAgICAgIF9ldmVudE1lc3NhZ2VIYW5kbGVyKGtTZXJ2aWNlU3RyZWFtLCBldmVudCk7CiAgICB9IGVsc2UgewogICAgICB0YXJnZXQucG9zdChldmVudCk7CiAgICB9CiAgfQoKICBGdXR1cmU8U3RyaW5nPiBfaGFuZGxlU2VydmljZShNZXNzYWdlIG1lc3NhZ2UpIGFzeW5jIHsKICAgIGZpbmFsIG5hbWVzcGFjZSA9IF9nZXROYW1lc3BhY2UobWVzc2FnZS5tZXRob2QpOwogICAgZmluYWwgbWV0aG9kID0gX2dldE1ldGhvZChtZXNzYWdlLm1ldGhvZCk7CiAgICBmaW5hbCBjbGllbnQgPSBjbGllbnRzW25hbWVzcGFjZV07CiAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKICAgICAgaWYgKGNsaWVudC5zZXJ2aWNlcy5jb250YWluc0tleShtZXRob2QpKSB7CiAgICAgICAgZmluYWwgaWQgPSBfc2VydmljZVJlcXVlc3RzLm5ld0lkKCk7CiAgICAgICAgZmluYWwgb2xkSWQgPSBtZXNzYWdlLnNlcmlhbDsKICAgICAgICBmaW5hbCBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPFN0cmluZz4oKTsKICAgICAgICBjbGllbnQuc2VydmljZUhhbmRsZXNbaWRdID0gKE1lc3NhZ2UgbSkgewogICAgICAgICAgaWYgKG0gIT0gbnVsbCkgewogICAgICAgICAgICBjb21wbGV0ZXIuY29tcGxldGUoanNvbi5lbmNvZGUobS5mb3J3YXJkVG9Kc29uKHsnaWQnOiBvbGRJZH0pKSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb21wbGV0ZXIuY29tcGxldGUoZW5jb2RlUnBjRXJyb3IobWVzc2FnZSwga1NlcnZpY2VEaXNhcHBlYXJlZCkpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgY2xpZW50LnBvc3QobmV3IFJlc3BvbnNlLmpzb24oCiAgICAgICAgICAgIG1lc3NhZ2UuZm9yd2FyZFRvSnNvbih7J2lkJzogaWQsICdtZXRob2QnOiBtZXRob2R9KSkpOwogICAgICAgIHJldHVybiBjb21wbGV0ZXIuZnV0dXJlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZW5jb2RlUnBjRXJyb3IobWVzc2FnZSwga01ldGhvZE5vdEZvdW5kLAogICAgICAgIGRldGFpbHM6ICJVbmtub3duIHNlcnZpY2U6ICR7bWVzc2FnZS5tZXRob2R9Iik7CiAgfQoKICBGdXR1cmU8U3RyaW5nPiBfc3Bhd25VcmkoTWVzc2FnZSBtZXNzYWdlKSBhc3luYyB7CiAgICB2YXIgdG9rZW4gPSBtZXNzYWdlLnBhcmFtc1sndG9rZW4nXTsKICAgIGlmICh0b2tlbiA9PSBudWxsKSB7CiAgICAgIHJldHVybiBlbmNvZGVNaXNzaW5nUGFyYW1FcnJvcihtZXNzYWdlLCAndG9rZW4nKTsKICAgIH0KICAgIGlmICh0b2tlbiBpcyEgU3RyaW5nKSB7CiAgICAgIHJldHVybiBlbmNvZGVJbnZhbGlkUGFyYW1FcnJvcihtZXNzYWdlLCAndG9rZW4nKTsKICAgIH0KICAgIHZhciB1cmkgPSBtZXNzYWdlLnBhcmFtc1sndXJpJ107CiAgICBpZiAodXJpID09IG51bGwpIHsKICAgICAgcmV0dXJuIGVuY29kZU1pc3NpbmdQYXJhbUVycm9yKG1lc3NhZ2UsICd1cmknKTsKICAgIH0KICAgIGlmICh1cmkgaXMhIFN0cmluZykgewogICAgICByZXR1cm4gZW5jb2RlSW52YWxpZFBhcmFtRXJyb3IobWVzc2FnZSwgJ3VyaScpOwogICAgfQogICAgdmFyIGFyZ3MgPSBtZXNzYWdlLnBhcmFtc1snYXJncyddOwogICAgdmFyIGFyZ3NPZlN0cmluZyA9IG5ldyBMaXN0PFN0cmluZz4oKTsKICAgIGlmIChhcmdzICE9IG51bGwpIHsKICAgICAgaWYgKGFyZ3MgaXMhIExpc3QpIHsKICAgICAgICByZXR1cm4gZW5jb2RlSW52YWxpZFBhcmFtRXJyb3IobWVzc2FnZSwgJ2FyZ3MnKTsKICAgICAgfQogICAgICBmb3IgKHZhciBhcmcgaW4gYXJncykgewogICAgICAgIGlmIChhcmcgaXMhIFN0cmluZykgewogICAgICAgICAgcmV0dXJuIGVuY29kZUludmFsaWRQYXJhbUVycm9yKG1lc3NhZ2UsICdhcmdzJyk7CiAgICAgICAgfQogICAgICAgIGFyZ3NPZlN0cmluZy5hZGQoYXJnKTsKICAgICAgfQogICAgfQogICAgdmFyIG1zZyA9IG1lc3NhZ2UucGFyYW1zWydtZXNzYWdlJ107CgogICAgSXNvbGF0ZS5zcGF3blVyaShVcmkucGFyc2UodXJpKSwgYXJnc09mU3RyaW5nLCBtc2cpLnRoZW4oKGlzb2xhdGUpIHsKICAgICAgX3NwYXduVXJpTm90aWZ5KGlzb2xhdGUuY29udHJvbFBvcnQsIHRva2VuKTsKICAgIH0pLmNhdGNoRXJyb3IoKGUpIHsKICAgICAgX3NwYXduVXJpTm90aWZ5KGUudG9TdHJpbmcoKSwgdG9rZW4pOwogICAgfSk7CgogICAgcmV0dXJuIGVuY29kZVN1Y2Nlc3MobWVzc2FnZSk7CiAgfQoKICBGdXR1cmU8UmVzcG9uc2U+IHJvdXRlUmVxdWVzdChWTVNlcnZpY2UgXywgTWVzc2FnZSBtZXNzYWdlKSBhc3luYyB7CiAgICByZXR1cm4gbmV3IFJlc3BvbnNlLmZyb20oYXdhaXQgX3JvdXRlUmVxdWVzdEltcGwobWVzc2FnZSkpOwogIH0KCiAgRnV0dXJlIF9yb3V0ZVJlcXVlc3RJbXBsKE1lc3NhZ2UgbWVzc2FnZSkgYXN5bmMgewogICAgdHJ5IHsKICAgICAgaWYgKG1lc3NhZ2UuY29tcGxldGVkKSB7CiAgICAgICAgcmV0dXJuIGF3YWl0IG1lc3NhZ2UucmVzcG9uc2U7CiAgICAgIH0KICAgICAgaWYgKG1lc3NhZ2UubWV0aG9kID09ICdzdHJlYW1MaXN0ZW4nKSB7CiAgICAgICAgcmV0dXJuIGF3YWl0IF9zdHJlYW1MaXN0ZW4obWVzc2FnZSk7CiAgICAgIH0KICAgICAgaWYgKG1lc3NhZ2UubWV0aG9kID09ICdzdHJlYW1DYW5jZWwnKSB7CiAgICAgICAgcmV0dXJuIGF3YWl0IF9zdHJlYW1DYW5jZWwobWVzc2FnZSk7CiAgICAgIH0KICAgICAgaWYgKG1lc3NhZ2UubWV0aG9kID09ICdfcmVnaXN0ZXJTZXJ2aWNlJykgewogICAgICAgIHJldHVybiBhd2FpdCBfcmVnaXN0ZXJTZXJ2aWNlKG1lc3NhZ2UpOwogICAgICB9CiAgICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PSAnX3NwYXduVXJpJykgewogICAgICAgIHJldHVybiBhd2FpdCBfc3Bhd25VcmkobWVzc2FnZSk7CiAgICAgIH0KICAgICAgaWYgKGRldmZzLnNob3VsZEhhbmRsZU1lc3NhZ2UobWVzc2FnZSkpIHsKICAgICAgICByZXR1cm4gYXdhaXQgZGV2ZnMuaGFuZGxlTWVzc2FnZShtZXNzYWdlKTsKICAgICAgfQogICAgICBpZiAoX2hhc05hbWVzcGFjZShtZXNzYWdlLm1ldGhvZCkpIHsKICAgICAgICByZXR1cm4gYXdhaXQgX2hhbmRsZVNlcnZpY2UobWVzc2FnZSk7CiAgICAgIH0KICAgICAgaWYgKG1lc3NhZ2UucGFyYW1zWydpc29sYXRlSWQnXSAhPSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bm5pbmdJc29sYXRlcy5yb3V0ZVJlcXVlc3QodGhpcywgbWVzc2FnZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGF3YWl0IG1lc3NhZ2Uuc2VuZFRvVk0oKTsKICAgIH0gY2F0Y2ggKGUsIHN0KSB7CiAgICAgIG1lc3NhZ2Uuc2V0RXJyb3JSZXNwb25zZShrSW50ZXJuYWxFcnJvciwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uOiRlXG4kc3QnKTsKICAgICAgcmV0dXJuIG1lc3NhZ2UucmVzcG9uc2U7CiAgICB9CiAgfQoKICB2b2lkIHJvdXRlUmVzcG9uc2UobWVzc2FnZSkgewogICAgZmluYWwgY2xpZW50ID0gbWVzc2FnZS5jbGllbnQ7CiAgICBpZiAoY2xpZW50LnNlcnZpY2VIYW5kbGVzLmNvbnRhaW5zS2V5KG1lc3NhZ2Uuc2VyaWFsKSkgewogICAgICBjbGllbnQuc2VydmljZUhhbmRsZXMucmVtb3ZlKG1lc3NhZ2Uuc2VyaWFsKShtZXNzYWdlKTsKICAgICAgX3NlcnZpY2VSZXF1ZXN0cy5yZWxlYXNlKG1lc3NhZ2Uuc2VyaWFsKTsKICAgIH0KICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQpSYXdSZWNlaXZlUG9ydCBib290KCkgewogIC8vIFJldHVybiB0aGUgcG9ydCB3ZSBleHBlY3QgaXNvbGF0ZSBjb250cm9sIG1lc3NhZ2VzIG9uLgogIHJldHVybiBpc29sYXRlQ29udHJvbFBvcnQ7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgIWNvbnN0IGJvb2wuZnJvbUVudmlyb25tZW50KCJkYXJ0LnZtLnByb2R1Y3QiKSkKdm9pZCBfcmVnaXN0ZXJJc29sYXRlKGludCBwb3J0X2lkLCBTZW5kUG9ydCBzcCwgU3RyaW5nIG5hbWUpIHsKICB2YXIgc2VydmljZSA9IG5ldyBWTVNlcnZpY2UoKTsKICBzZXJ2aWNlLnJ1bm5pbmdJc29sYXRlcy5pc29sYXRlU3RhcnR1cChwb3J0X2lkLCBzcCwgbmFtZSk7Cn0KCi8vLyBOb3RpZnkgdGhlIFZNIHRoYXQgdGhlIHNlcnZpY2UgaXMgcnVubmluZy4Kdm9pZCBfb25TdGFydCgpIG5hdGl2ZSAiVk1TZXJ2aWNlX09uU3RhcnQiOwoKLy8vIE5vdGlmeSB0aGUgVk0gdGhhdCB0aGUgc2VydmljZSBpcyBubyBsb25nZXIgcnVubmluZy4Kdm9pZCBfb25FeGl0KCkgbmF0aXZlICJWTVNlcnZpY2VfT25FeGl0IjsKCi8vLyBOb3RpZnkgdGhlIFZNIHRoYXQgdGhlIHNlcnZlcidzIGFkZHJlc3MgaGFzIGNoYW5nZWQuCnZvaWQgb25TZXJ2ZXJBZGRyZXNzQ2hhbmdlKFN0cmluZyBhZGRyZXNzKQogICAgbmF0aXZlICJWTVNlcnZpY2VfT25TZXJ2ZXJBZGRyZXNzQ2hhbmdlIjsKCi8vLyBTdWJzY3JpYmUgdG8gYSBzZXJ2aWNlIHN0cmVhbS4KYm9vbCBfdm1MaXN0ZW5TdHJlYW0oU3RyaW5nIHN0cmVhbUlkKSBuYXRpdmUgIlZNU2VydmljZV9MaXN0ZW5TdHJlYW0iOwoKLy8vIENhbmNlbCBhIHN1YnNjcmlwdGlvbiB0byBhIHNlcnZpY2Ugc3RyZWFtLgp2b2lkIF92bUNhbmNlbFN0cmVhbShTdHJpbmcgc3RyZWFtSWQpIG5hdGl2ZSAiVk1TZXJ2aWNlX0NhbmNlbFN0cmVhbSI7CgovLy8gR2V0IHRoZSBieXRlcyB0byB0aGUgdGFyIGFyY2hpdmUuClVpbnQ4TGlzdCBfcmVxdWVzdEFzc2V0cygpIG5hdGl2ZSAiVk1TZXJ2aWNlX1JlcXVlc3RBc3NldHMiOwoKLy8vIE5vdGlmeSB0aGUgdm0gc2VydmljZSB0aGF0IGFuIGlzb2xhdGUgaGFzIGJlZW4gc3Bhd25lZCB2aWEgcnBjLgp2b2lkIF9zcGF3blVyaU5vdGlmeShvYmosIFN0cmluZyB0b2tlbikgbmF0aXZlICJWTVNlcnZpY2Vfc3Bhd25VcmlOb3RpZnkiOwqCpABOTjwBGQEVGhcXFBoBExQTFx0eFRwaAUA8ASUSAgEaHDMnLSQEIgIBRDIBRklIOikBSRwgIB8fASABHiImIiQiGyEiJichKQEoJyYgARckJCs5MTo5LDsyPwMBRRMWGg8UJwcFGSIaBwQgAgFAMUYCAUAlMU0CAUQ+HAIBMxMWGhYFIAIBKDUCATUBLiYBLiUBKCIBKzgBISwBHD0BKksBGzYBLkgBNj8BNjEBPzsBKh8qKCIuJiYyJCY2NAIBKB4BJwExJjtIATA7AS4aATEiAR0BIyQlGQQBJi0cKy8jCAYwHBYeHiYYJhkhL0gkNRAODwYnNxQGBAE/IkQcCAYEAVAUMToPMjVGGxkKDwYEAVEUND8ZEgpJFg8tQBkSCkQWDwYEAUlLFwEKM0EtL0APMggaLT4GFR0nL0wPJysvDwYbBAEZFgEYNTEGARwgHAFLKCgmGwYVMi4GASoPBAEhGyEdSRAIIUdBERAIISM7OBIRQEg9RRIKCCFGFFAQCAZMBAE7KAQBGCc3EgYWBAExIi8VCAYSBAE+GyIvFAoIBhEEASw4ATghLwEtQAYtTjdRCAYBSxgbJCU0RQwKCg8GASIjBAE4IS8BLjwGJS4tIQYBIwQBLh46SUUBOyMvKwEvNVAGKzVMBjBBBiYBEgpQNzoQNwYBIwQBPR8tLCYYIBIkExsnQh4vGQoICBozDRoGBAE5NS8nGjEtJjMyG00TTgwLJ0MhCAY0OAQBNCkZOAYcOAYlFzYGGjYGJysYGzkIHh47Ch8IBikBSTMYLAgBIwQBRkAEATQKHycILi0ILi0IMjAIKykIMDMIKy4IMUIIJxZQHwYEASAjPT0wBgQCASIYPB0CAUo/IT0CAS8sATkqATkrLgEjRwEvRwEmPQFESwEPZGFydDpfdm1zZXJ2aWNlMW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi92bXNlcnZpY2UvY2xpZW50LmRhcnSH+y8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuX3Ztc2VydmljZTsKCnR5cGVkZWYgdm9pZCBDbGllbnRTZXJ2aWNlSGFuZGxlKE1lc3NhZ2UgcmVzcG9uc2UpOwoKLy8gQSBzZXJ2aWNlIGNsaWVudC4KYWJzdHJhY3QgY2xhc3MgQ2xpZW50IHsKICBmaW5hbCBWTVNlcnZpY2Ugc2VydmljZTsKICBmaW5hbCBib29sIHNlbmRFdmVudHM7CgogIC8vLyBBIHNldCBzdHJlYW1JZHMgd2hpY2ggZGVzY3JpYmVzIHRoZSBzdHJlYW1zIHRoZSBjbGllbnQgaXMgY29ubmVjdGVkIHRvCiAgZmluYWwgU2V0PFN0cmluZz4gc3RyZWFtcyA9IG5ldyBTZXQ8U3RyaW5nPigpOwoKICAvLy8gU2VydmljZXMgcmVnaXN0ZXJlZCBhbmQgdGhlaXIgYWxpYXNlcwogIC8vLyBrZXk6IHNlcnZpY2UKICAvLy8gdmFsdWU6IGFsaWFzCiAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBzZXJ2aWNlcyA9IG5ldyBNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CgogIC8vLyBDYWxsYmFja3MgcmVnaXN0ZXJlZCBmb3Igc2VydmljZSBpbnZvY2F0aW9ucyBzZXQgdG8gdGhlIGNsaWVudAogIC8vLyBrZXk6IFJQQyBpZCB1c2VkIGZvciB0aGUgcmVxdWVzdAogIC8vLyB2YWx1ZTogY2FsbGJhY2sgdGhhdCBzaG91bGQgYmUgaW52b2tlZAogIGZpbmFsIE1hcDxTdHJpbmcsIENsaWVudFNlcnZpY2VIYW5kbGU+IHNlcnZpY2VIYW5kbGVzID0KICAgICAgbmV3IE1hcDxTdHJpbmcsIENsaWVudFNlcnZpY2VIYW5kbGU+KCk7CgogIENsaWVudCh0aGlzLnNlcnZpY2UsIHtib29sIHNlbmRFdmVudHM6IHRydWV9KSA6IHRoaXMuc2VuZEV2ZW50cyA9IHNlbmRFdmVudHMgewogICAgc2VydmljZS5fYWRkQ2xpZW50KHRoaXMpOwogIH0KCiAgLy8gRGlzY29ubmVjdHMgdGhlIGNsaWVudC4KICBkaXNjb25uZWN0KCk7CgogIC8vLyBXaGVuIGltcGxlbWVudGluZywgY2FsbCBbY2xvc2VdIHdoZW4gdGhlIG5ldHdvcmsgY29ubmVjdGlvbiBjbG9zZXMuCiAgdm9pZCBjbG9zZSgpIHsKICAgIHNlcnZpY2UuX3JlbW92ZUNsaWVudCh0aGlzKTsKICB9CgogIC8vLyBDYWxsIHRvIHByb2Nlc3MgYSByZXF1ZXN0LiBSZXNwb25zZSB3aWxsIGJlIHBvc3RlZCB3aXRoICdzZXEnLgogIHZvaWQgb25SZXF1ZXN0KE1lc3NhZ2UgbWVzc2FnZSkgewogICAgLy8gSW4gSlNPTi1SUEMgMi4wIG1lc3NhZ2VzIHdpdGggYW5kIGlkIGFyZSBSZXF1ZXN0IGFuZCBtdXN0IGJlIGFuc3dlcmVkCiAgICAvLyBodHRwOi8vd3d3Lmpzb25ycGMub3JnL3NwZWNpZmljYXRpb24jbm90aWZpY2F0aW9uCiAgICBzZXJ2aWNlLnJvdXRlUmVxdWVzdChzZXJ2aWNlLCBtZXNzYWdlKS50aGVuKHBvc3QpOwogIH0KCiAgdm9pZCBvblJlc3BvbnNlKE1lc3NhZ2UgbWVzc2FnZSkgewogICAgc2VydmljZS5yb3V0ZVJlc3BvbnNlKG1lc3NhZ2UpOwogIH0KCiAgLy8vIENhbGwgdG8gcHJvY2VzcyBhIG5vdGlmaWNhdGlvbi4gUmVzcG9uc2Ugd2lsbCBub3QgYmUgcG9zdGVkLgogIHZvaWQgb25Ob3RpZmljYXRpb24oTWVzc2FnZSBtZXNzYWdlKSB7CiAgICAvLyBJbiBKU09OLVJQQyAyLjAgbWVzc2FnZXMgd2l0aG91dCBhbiBpZCBhcmUgTm90aWZpY2F0aW9uCiAgICAvLyBhbmQgc2hvdWxkIG5vdCBiZSBhbnN3ZXJlZAogICAgLy8gaHR0cDovL3d3dy5qc29ucnBjLm9yZy9zcGVjaWZpY2F0aW9uI25vdGlmaWNhdGlvbgogICAgc2VydmljZS5yb3V0ZVJlcXVlc3Qoc2VydmljZSwgbWVzc2FnZSk7CiAgfQoKICAvLyBTZW5kcyBhIHJlc3VsdCB0byB0aGUgY2xpZW50LiAgSW1wbGVtZW50ZWQgaW4gc3ViY2xhc3Nlcy4KICB2b2lkIHBvc3QoUmVzcG9uc2UgcmVzdWx0KTsKCiAgZHluYW1pYyB0b0pzb24oKSB7CiAgICByZXR1cm4ge307CiAgfQp9CkMATk48ARkBNAEVGBsZAU0xASwTE0IBRSctOi4BUR4EAR0QAUoRIQQBRSRNOTcEASUkBAFDKT8iOSwEAT8eARUPBAIBG2RhcnQ6X3Ztc2VydmljZS9jbGllbnQuZGFydDBvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvdm1zZXJ2aWNlL2Fzc2V0LmRhcnSHBy8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuX3Ztc2VydmljZTsKCmNsYXNzIEFzc2V0IHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBmaW5hbCBVaW50OExpc3QgZGF0YTsKCiAgQXNzZXQodGhpcy5uYW1lLCB0aGlzLmRhdGEpOwoKICBTdHJpbmcgZ2V0IG1pbWVUeXBlIHsKICAgIHZhciBleHRlbnNpb25TdGFydCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKICAgIHZhciBleHRlbnNpb24gPSBuYW1lLnN1YnN0cmluZyhleHRlbnNpb25TdGFydCArIDEpOwogICAgc3dpdGNoIChleHRlbnNpb24pIHsKICAgICAgY2FzZSAnaHRtbCc6CiAgICAgICAgcmV0dXJuICd0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgnOwogICAgICBjYXNlICdkYXJ0JzoKICAgICAgICByZXR1cm4gJ2FwcGxpY2F0aW9uL2RhcnQ7IGNoYXJzZXQ9VVRGLTgnOwogICAgICBjYXNlICdqcyc6CiAgICAgICAgcmV0dXJuICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0OyBjaGFyc2V0PVVURi04JzsKICAgICAgY2FzZSAnY3NzJzoKICAgICAgICByZXR1cm4gJ3RleHQvY3NzOyBjaGFyc2V0PVVURi04JzsKICAgICAgY2FzZSAnZ2lmJzoKICAgICAgICByZXR1cm4gJ2ltYWdlL2dpZic7CiAgICAgIGNhc2UgJ3BuZyc6CiAgICAgICAgcmV0dXJuICdpbWFnZS9wbmcnOwogICAgICBjYXNlICdqcGcnOgogICAgICAgIHJldHVybiAnaW1hZ2UvanBlZyc7CiAgICAgIGNhc2UgJ2pwZWcnOgogICAgICAgIHJldHVybiAnaW1hZ2UvanBlZyc7CiAgICAgIGNhc2UgJ3N2Zyc6CiAgICAgICAgcmV0dXJuICdpbWFnZS9zdmcreG1sJzsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gJ3RleHQvcGxhaW4nOwogICAgfQogIH0KCiAgc3RhdGljIE1hcDxTdHJpbmcsIEFzc2V0PiByZXF1ZXN0KCkgewogICAgVWludDhMaXN0IHRhckJ5dGVzID0gX3JlcXVlc3RBc3NldHMoKTsKICAgIGlmICh0YXJCeXRlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgTGlzdCBhc3NldExpc3QgPSBfZGVjb2RlQXNzZXRzKHRhckJ5dGVzKTsKICAgIE1hcDxTdHJpbmcsIEFzc2V0PiBhc3NldHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFzc2V0PigpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhc3NldExpc3QubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgdmFyIGEgPSBuZXcgQXNzZXQoYXNzZXRMaXN0W2ldLCBhc3NldExpc3RbaSArIDFdKTsKICAgICAgYXNzZXRzW2EubmFtZV0gPSBhOwogICAgfQogICAgcmV0dXJuIGFzc2V0czsKICB9CgogIFN0cmluZyB0b1N0cmluZygpID0+ICckbmFtZSAoJG1pbWVUeXBlKSc7Cn0KCkxpc3QgX2RlY29kZUFzc2V0cyhVaW50OExpc3QgZGF0YSkgbmF0aXZlICJWTVNlcnZpY2VfRGVjb2RlQXNzZXRzIjsKCk1hcDxTdHJpbmcsIEFzc2V0PiBfYXNzZXRzOwpNYXA8U3RyaW5nLCBBc3NldD4gZ2V0IGFzc2V0cyB7CiAgaWYgKF9hc3NldHMgPT0gbnVsbCkgewogICAgdHJ5IHsKICAgICAgX2Fzc2V0cyA9IEFzc2V0LnJlcXVlc3QoKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcHJpbnQoJ0NvdWxkIG5vdCBsb2FkIE9ic2VydmF0b3J5IGFzc2V0czogJGUnKTsKICAgIH0KICB9CiAgcmV0dXJuIF9hc3NldHM7Cn0KRwBOTjwBGQEOFRgBHwEYMDgZEysTMhE4EioSHBIcEh0THRIgDx0GBAEoKxwTBi4+NDkaBhMEASwCAUQBHCAZCiESNgYEEgIBGmRhcnQ6X3Ztc2VydmljZS9hc3NldC5kYXJ0MG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi92bXNlcnZpY2UvZGV2ZnMuZGFydK8SLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5fdm1zZXJ2aWNlOwoKU3RyaW5nIF9lbmNvZGVEZXZGU0Rpc2FibGVkRXJyb3IoTWVzc2FnZSBtZXNzYWdlKSB7CiAgcmV0dXJuIGVuY29kZVJwY0Vycm9yKG1lc3NhZ2UsIGtGZWF0dXJlRGlzYWJsZWQsCiAgICAgIGRldGFpbHM6ICJEZXZGUyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgRGFydCBpbXBsZW1lbnRhdGlvbiIpOwp9CgpTdHJpbmcgX2VuY29kZUZpbGVTeXN0ZW1BbHJlYWR5RXhpc3RzRXJyb3IoTWVzc2FnZSBtZXNzYWdlLCBTdHJpbmcgZnNOYW1lKSB7CiAgcmV0dXJuIGVuY29kZVJwY0Vycm9yKG1lc3NhZ2UsIGtGaWxlU3lzdGVtQWxyZWFkeUV4aXN0cywKICAgICAgZGV0YWlsczogIiR7bWVzc2FnZS5tZXRob2R9OiBmaWxlIHN5c3RlbSAnJHtmc05hbWV9JyBhbHJlYWR5IGV4aXN0cyIpOwp9CgpTdHJpbmcgX2VuY29kZUZpbGVTeXN0ZW1Eb2VzTm90RXhpc3RFcnJvcihNZXNzYWdlIG1lc3NhZ2UsIFN0cmluZyBmc05hbWUpIHsKICByZXR1cm4gZW5jb2RlUnBjRXJyb3IobWVzc2FnZSwga0ZpbGVTeXN0ZW1Eb2VzTm90RXhpc3QsCiAgICAgIGRldGFpbHM6ICIke21lc3NhZ2UubWV0aG9kfTogZmlsZSBzeXN0ZW0gJyR7ZnNOYW1lfScgZG9lcyBub3QgZXhpc3QiKTsKfQoKY2xhc3MgX0ZpbGVTeXN0ZW0gewogIF9GaWxlU3lzdGVtKHRoaXMubmFtZSwgdGhpcy51cmkpOwoKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBmaW5hbCBVcmkgdXJpOwoKICBVcmkgcmVzb2x2ZVBhdGgoU3RyaW5nIHBhdGgpIHsKICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoJy8nKSkgewogICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMSk7CiAgICB9CiAgICBpZiAocGF0aC5pc0VtcHR5KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgVXJpIHBhdGhVcmk7CiAgICB0cnkgewogICAgICBwYXRoVXJpID0gbmV3IFVyaS5maWxlKHBhdGgpOwogICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gY2F0Y2ggKGUpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcmV0dXJuIHJlc29sdmUocGF0aFVyaSk7CiAgfQoKICBVcmkgcmVzb2x2ZShVcmkgcGF0aFVyaSkgewogICAgdHJ5IHsKICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhpcyBwYXRoVXJpIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBmaWxlIHBhdGguCiAgICAgIHBhdGhVcmkudG9GaWxlUGF0aCgpOwogICAgfSBvbiBVbnN1cHBvcnRlZEVycm9yIGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIFVyaSByZXNvbHZlZFVyaSA9IHVyaS5yZXNvbHZlVXJpKHBhdGhVcmkpOwogICAgaWYgKCFyZXNvbHZlZFVyaS50b1N0cmluZygpLnN0YXJ0c1dpdGgodXJpLnRvU3RyaW5nKCkpKSB7CiAgICAgIC8vIFJlc29sdmVkIHVyaSBtdXN0IGJlIHdpdGhpbiB0aGUgZmlsZXN5c3RlbSdzIGJhc2UgdXJpLgogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiByZXNvbHZlZFVyaTsKICB9CgogIE1hcCB0b01hcCgpIHsKICAgIHJldHVybiB7CiAgICAgICd0eXBlJzogJ0ZpbGVTeXN0ZW0nLAogICAgICAnbmFtZSc6IG5hbWUsCiAgICAgICd1cmknOiB1cmkudG9TdHJpbmcoKSwKICAgIH07CiAgfQp9CgpjbGFzcyBEZXZGUyB7CiAgRGV2RlMoKTsKCiAgTWFwPFN0cmluZywgX0ZpbGVTeXN0ZW0+IF9mc01hcCA9IHt9OwoKICBmaW5hbCBTZXQgX3JwY05hbWVzID0gbmV3IFNldC5mcm9tKFsKICAgICdfbGlzdERldkZTJywKICAgICdfY3JlYXRlRGV2RlMnLAogICAgJ19kZWxldGVEZXZGUycsCiAgICAnX3JlYWREZXZGU0ZpbGUnLAogICAgJ193cml0ZURldkZTRmlsZScsCiAgICAnX3dyaXRlRGV2RlNGaWxlcycsCiAgICAnX2xpc3REZXZGU0ZpbGVzJywKICBdKTsKCiAgdm9pZCBjbGVhbnVwKCkgewogICAgdmFyIGRlbGV0ZURpciA9IFZNU2VydmljZUVtYmVkZGVySG9va3MuZGVsZXRlRGlyOwogICAgaWYgKGRlbGV0ZURpciA9PSBudWxsKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBkZWxldGlvbnMgPSA8RnV0dXJlPltdOwogICAgZm9yICh2YXIgZnMgaW4gX2ZzTWFwLnZhbHVlcykgewogICAgICBkZWxldGlvbnMuYWRkKGRlbGV0ZURpcihmcy51cmkpKTsKICAgIH0KICAgIEZ1dHVyZS53YWl0KGRlbGV0aW9ucyk7CiAgICBfZnNNYXAuY2xlYXIoKTsKICB9CgogIGJvb2wgc2hvdWxkSGFuZGxlTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKICAgIHJldHVybiBfcnBjTmFtZXMuY29udGFpbnMobWVzc2FnZS5tZXRob2QpOwogIH0KCiAgRnV0dXJlPFN0cmluZz4gaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIGFzeW5jIHsKICAgIHN3aXRjaCAobWVzc2FnZS5tZXRob2QpIHsKICAgICAgY2FzZSAnX2xpc3REZXZGUyc6CiAgICAgICAgcmV0dXJuIF9saXN0RGV2RlMobWVzc2FnZSk7CiAgICAgIGNhc2UgJ19jcmVhdGVEZXZGUyc6CiAgICAgICAgcmV0dXJuIF9jcmVhdGVEZXZGUyhtZXNzYWdlKTsKICAgICAgY2FzZSAnX2RlbGV0ZURldkZTJzoKICAgICAgICByZXR1cm4gX2RlbGV0ZURldkZTKG1lc3NhZ2UpOwogICAgICBjYXNlICdfcmVhZERldkZTRmlsZSc6CiAgICAgICAgcmV0dXJuIF9yZWFkRGV2RlNGaWxlKG1lc3NhZ2UpOwogICAgICBjYXNlICdfd3JpdGVEZXZGU0ZpbGUnOgogICAgICAgIHJldHVybiBfd3JpdGVEZXZGU0ZpbGUobWVzc2FnZSk7CiAgICAgIGNhc2UgJ193cml0ZURldkZTRmlsZXMnOgogICAgICAgIHJldHVybiBfd3JpdGVEZXZGU0ZpbGVzKG1lc3NhZ2UpOwogICAgICBjYXNlICdfbGlzdERldkZTRmlsZXMnOgogICAgICAgIHJldHVybiBfbGlzdERldkZTRmlsZXMobWVzc2FnZSk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIGVuY29kZVJwY0Vycm9yKG1lc3NhZ2UsIGtJbnRlcm5hbEVycm9yLAogICAgICAgICAgICBkZXRhaWxzOiAnVW5leHBlY3RlZCBycGMgJHttZXNzYWdlLm1ldGhvZH0nKTsKICAgIH0KICB9CgogIEZ1dHVyZTxTdHJpbmc+IGhhbmRsZVB1dFN0cmVhbSgKICAgICAgT2JqZWN0IGZzTmFtZSwgT2JqZWN0IHBhdGgsIFVyaSBmc1VyaSwgU3RyZWFtPExpc3Q8aW50Pj4gYnl0ZXMpIGFzeW5jIHsKICAgIC8vIEEgZHVtbXkgTWVzc2FnZSBmb3IgZXJyb3IgbWVzc2FnZSBjb25zdHJ1Y3Rpb24uCiAgICBNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZS5mb3JNZXRob2QoJ193cml0ZURldkZTRmlsZScpOwogICAgdmFyIHdyaXRlU3RyZWFtRmlsZSA9IFZNU2VydmljZUVtYmVkZGVySG9va3Mud3JpdGVTdHJlYW1GaWxlOwogICAgaWYgKHdyaXRlU3RyZWFtRmlsZSA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfZW5jb2RlRGV2RlNEaXNhYmxlZEVycm9yKG1lc3NhZ2UpOwogICAgfQogICAgaWYgKGZzTmFtZSA9PSBudWxsKSB7CiAgICAgIHJldHVybiBlbmNvZGVNaXNzaW5nUGFyYW1FcnJvcihtZXNzYWdlLCAnZnNOYW1lJyk7CiAgICB9CiAgICBpZiAoZnNOYW1lIGlzISBTdHJpbmcpIHsKICAgICAgcmV0dXJuIGVuY29kZUludmFsaWRQYXJhbUVycm9yKG1lc3NhZ2UsICdmc05hbWUnKTsKICAgIH0KICAgIHZhciBmcyA9IF9mc01hcFtmc05hbWVdOwogICAgaWYgKGZzID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9lbmNvZGVGaWxlU3lzdGVtRG9lc05vdEV4aXN0RXJyb3IobWVzc2FnZSwgZnNOYW1lKTsKICAgIH0KICAgIFVyaSB1cmkgPSBmc1VyaTsKICAgIGlmICh1cmkgPT0gbnVsbCkgewogICAgICBpZiAocGF0aCA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGVuY29kZU1pc3NpbmdQYXJhbUVycm9yKG1lc3NhZ2UsICdwYXRoJyk7CiAgICAgIH0KICAgICAgaWYgKHBhdGggaXMhIFN0cmluZykgewogICAgICAgIHJldHVybiBlbmNvZGVJbnZhbGlkUGFyYW1FcnJvcihtZXNzYWdlLCAncGF0aCcpOwogICAgICB9CiAgICAgIHVyaSA9IGZzLnJlc29sdmVQYXRoKHBhdGgpOwogICAgICBpZiAodXJpID09IG51bGwpIHsKICAgICAgICByZXR1cm4gZW5jb2RlSW52YWxpZFBhcmFtRXJyb3IobWVzc2FnZSwgJ3BhdGgnKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdXJpID0gZnMucmVzb2x2ZSh1cmkpOwogICAgICBpZiAodXJpID09IG51bGwpIHsKICAgICAgICByZXR1cm4gZW5jb2RlSW52YWxpZFBhcmFtRXJyb3IobWVzc2FnZSwgJ3VyaScpOwogICAgICB9CiAgICB9CiAgICBhd2FpdCB3cml0ZVN0cmVhbUZpbGUodXJpLCBieXRlcyk7CiAgICByZXR1cm4gZW5jb2RlU3VjY2VzcyhtZXNzYWdlKTsKICB9CgogIEZ1dHVyZTxTdHJpbmc+IF9saXN0RGV2RlMoTWVzc2FnZSBtZXNzYWdlKSBhc3luYyB7CiAgICB2YXIgcmVzdWx0ID0ge307CiAgICByZXN1bHRbJ3R5cGUnXSA9ICdGaWxlU3lzdGVtTGlzdCc7CiAgICByZXN1bHRbJ2ZzTmFtZXMnXSA9IF9mc01hcC5rZXlzLnRvTGlzdCgpOwogICAgcmV0dXJuIGVuY29kZVJlc3VsdChtZXNzYWdlLCByZXN1bHQpOwogIH0KCiAgRnV0dXJlPFN0cmluZz4gX2NyZWF0ZURldkZTKE1lc3NhZ2UgbWVzc2FnZSkgYXN5bmMgewogICAgdmFyIGNyZWF0ZVRlbXBEaXIgPSBWTVNlcnZpY2VFbWJlZGRlckhvb2tzLmNyZWF0ZVRlbXBEaXI7CiAgICBpZiAoY3JlYXRlVGVtcERpciA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfZW5jb2RlRGV2RlNEaXNhYmxlZEVycm9yKG1lc3NhZ2UpOwogICAgfQogICAgdmFyIGZzTmFtZSA9IG1lc3NhZ2UucGFyYW1zWydmc05hbWUnXTsKICAgIGlmIChmc05hbWUgPT0gbnVsbCkgewogICAgICByZXR1cm4gZW5jb2RlTWlzc2luZ1BhcmFtRXJyb3IobWVzc2FnZSwgJ2ZzTmFtZScpOwogICAgfQogICAgaWYgKGZzTmFtZSBpcyEgU3RyaW5nKSB7CiAgICAgIHJldHVybiBlbmNvZGVJbnZhbGlkUGFyYW1FcnJvcihtZXNzYWdlLCAnZnNOYW1lJyk7CiAgICB9CiAgICB2YXIgZnMgPSBfZnNNYXBbZnNOYW1lXTsKICAgIGlmIChmcyAhPSBudWxsKSB7CiAgICAgIHJldHVybiBfZW5jb2RlRmlsZVN5c3RlbUFscmVhZHlFeGlzdHNFcnJvcihtZXNzYWdlLCBmc05hbWUpOwogICAgfQogICAgdmFyIHRlbXBEaXIgPSBhd2FpdCBjcmVhdGVUZW1wRGlyKGZzTmFtZSk7CiAgICBmcyA9IG5ldyBfRmlsZVN5c3RlbShmc05hbWUsIHRlbXBEaXIpOwogICAgX2ZzTWFwW2ZzTmFtZV0gPSBmczsKICAgIHJldHVybiBlbmNvZGVSZXN1bHQobWVzc2FnZSwgZnMudG9NYXAoKSk7CiAgfQoKICBGdXR1cmU8U3RyaW5nPiBfZGVsZXRlRGV2RlMoTWVzc2FnZSBtZXNzYWdlKSBhc3luYyB7CiAgICB2YXIgZGVsZXRlRGlyID0gVk1TZXJ2aWNlRW1iZWRkZXJIb29rcy5kZWxldGVEaXI7CiAgICBpZiAoZGVsZXRlRGlyID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9lbmNvZGVEZXZGU0Rpc2FibGVkRXJyb3IobWVzc2FnZSk7CiAgICB9CiAgICB2YXIgZnNOYW1lID0gbWVzc2FnZS5wYXJhbXNbJ2ZzTmFtZSddOwogICAgaWYgKGZzTmFtZSA9PSBudWxsKSB7CiAgICAgIHJldHVybiBlbmNvZGVNaXNzaW5nUGFyYW1FcnJvcihtZXNzYWdlLCAnZnNOYW1lJyk7CiAgICB9CiAgICBpZiAoZnNOYW1lIGlzISBTdHJpbmcpIHsKICAgICAgcmV0dXJuIGVuY29kZUludmFsaWRQYXJhbUVycm9yKG1lc3NhZ2UsICdmc05hbWUnKTsKICAgIH0KICAgIHZhciBmcyA9IF9mc01hcC5yZW1vdmUoZnNOYW1lKTsKICAgIGlmIChmcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfZW5jb2RlRmlsZVN5c3RlbURvZXNOb3RFeGlzdEVycm9yKG1lc3NhZ2UsIGZzTmFtZSk7CiAgICB9CiAgICBhd2FpdCBkZWxldGVEaXIoZnMudXJpKTsKICAgIHJldHVybiBlbmNvZGVTdWNjZXNzKG1lc3NhZ2UpOwogIH0KCiAgRnV0dXJlPFN0cmluZz4gX3JlYWREZXZGU0ZpbGUoTWVzc2FnZSBtZXNzYWdlKSBhc3luYyB7CiAgICB2YXIgcmVhZEZpbGUgPSBWTVNlcnZpY2VFbWJlZGRlckhvb2tzLnJlYWRGaWxlOwogICAgaWYgKHJlYWRGaWxlID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9lbmNvZGVEZXZGU0Rpc2FibGVkRXJyb3IobWVzc2FnZSk7CiAgICB9CiAgICB2YXIgZnNOYW1lID0gbWVzc2FnZS5wYXJhbXNbJ2ZzTmFtZSddOwogICAgaWYgKGZzTmFtZSA9PSBudWxsKSB7CiAgICAgIHJldHVybiBlbmNvZGVNaXNzaW5nUGFyYW1FcnJvcihtZXNzYWdlLCAnZnNOYW1lJyk7CiAgICB9CiAgICBpZiAoZnNOYW1lIGlzISBTdHJpbmcpIHsKICAgICAgcmV0dXJuIGVuY29kZUludmFsaWRQYXJhbUVycm9yKG1lc3NhZ2UsICdmc05hbWUnKTsKICAgIH0KICAgIHZhciBmcyA9IF9mc01hcFtmc05hbWVdOwogICAgaWYgKGZzID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9lbmNvZGVGaWxlU3lzdGVtRG9lc05vdEV4aXN0RXJyb3IobWVzc2FnZSwgZnNOYW1lKTsKICAgIH0KICAgIFVyaSB1cmk7CiAgICBpZiAobWVzc2FnZS5wYXJhbXNbJ3VyaSddICE9IG51bGwpIHsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgdXJpUGFyYW0gPSBtZXNzYWdlLnBhcmFtc1sndXJpJ107CiAgICAgICAgaWYgKHVyaVBhcmFtIGlzISBTdHJpbmcpIHsKICAgICAgICAgIHJldHVybiBlbmNvZGVJbnZhbGlkUGFyYW1FcnJvcihtZXNzYWdlLCAndXJpJyk7CiAgICAgICAgfQogICAgICAgIFVyaSBwYXJzZWRVcmkgPSBVcmkucGFyc2UodXJpUGFyYW0pOwogICAgICAgIHVyaSA9IGZzLnJlc29sdmUocGFyc2VkVXJpKTsKICAgICAgICBpZiAodXJpID09IG51bGwpIHsKICAgICAgICAgIHJldHVybiBlbmNvZGVJbnZhbGlkUGFyYW1FcnJvcihtZXNzYWdlLCAndXJpJyk7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcmV0dXJuIGVuY29kZUludmFsaWRQYXJhbUVycm9yKG1lc3NhZ2UsICd1cmknKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdmFyIHBhdGggPSBtZXNzYWdlLnBhcmFtc1sncGF0aCddOwogICAgICBpZiAocGF0aCA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGVuY29kZU1pc3NpbmdQYXJhbUVycm9yKG1lc3NhZ2UsICdwYXRoJyk7CiAgICAgIH0KICAgICAgaWYgKHBhdGggaXMhIFN0cmluZykgewogICAgICAgIHJldHVybiBlbmNvZGVJbnZhbGlkUGFyYW1FcnJvcihtZXNzYWdlLCAncGF0aCcpOwogICAgICB9CiAgICAgIHVyaSA9IGZzLnJlc29sdmVQYXRoKHBhdGgpOwogICAgICBpZiAodXJpID09IG51bGwpIHsKICAgICAgICByZXR1cm4gZW5jb2RlSW52YWxpZFBhcmFtRXJyb3IobWVzc2FnZSwgJ3BhdGgnKTsKICAgICAgfQogICAgfQogICAgdHJ5IHsKICAgICAgTGlzdDxpbnQ+IGJ5dGVzID0gYXdhaXQgcmVhZEZpbGUodXJpKTsKICAgICAgdmFyIHJlc3VsdCA9IHsndHlwZSc6ICdGU0ZpbGUnLCAnZmlsZUNvbnRlbnRzJzogYmFzZTY0LmVuY29kZShieXRlcyl9OwogICAgICByZXR1cm4gZW5jb2RlUmVzdWx0KG1lc3NhZ2UsIHJlc3VsdCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBlbmNvZGVScGNFcnJvcihtZXNzYWdlLCBrRmlsZURvZXNOb3RFeGlzdCwKICAgICAgICAgIGRldGFpbHM6ICJfcmVhZERldkZTRmlsZTogJGUiKTsKICAgIH0KICB9CgogIEZ1dHVyZTxTdHJpbmc+IF93cml0ZURldkZTRmlsZShNZXNzYWdlIG1lc3NhZ2UpIGFzeW5jIHsKICAgIHZhciB3cml0ZUZpbGUgPSBWTVNlcnZpY2VFbWJlZGRlckhvb2tzLndyaXRlRmlsZTsKICAgIGlmICh3cml0ZUZpbGUgPT0gbnVsbCkgewogICAgICByZXR1cm4gX2VuY29kZURldkZTRGlzYWJsZWRFcnJvcihtZXNzYWdlKTsKICAgIH0KICAgIHZhciBmc05hbWUgPSBtZXNzYWdlLnBhcmFtc1snZnNOYW1lJ107CiAgICBpZiAoZnNOYW1lID09IG51bGwpIHsKICAgICAgcmV0dXJuIGVuY29kZU1pc3NpbmdQYXJhbUVycm9yKG1lc3NhZ2UsICdmc05hbWUnKTsKICAgIH0KICAgIGlmIChmc05hbWUgaXMhIFN0cmluZykgewogICAgICByZXR1cm4gZW5jb2RlSW52YWxpZFBhcmFtRXJyb3IobWVzc2FnZSwgJ2ZzTmFtZScpOwogICAgfQogICAgdmFyIGZzID0gX2ZzTWFwW2ZzTmFtZV07CiAgICBpZiAoZnMgPT0gbnVsbCkgewogICAgICByZXR1cm4gX2VuY29kZUZpbGVTeXN0ZW1Eb2VzTm90RXhpc3RFcnJvcihtZXNzYWdlLCBmc05hbWUpOwogICAgfQogICAgVXJpIHVyaTsKICAgIGlmIChtZXNzYWdlLnBhcmFtc1sndXJpJ10gIT0gbnVsbCkgewogICAgICB0cnkgewogICAgICAgIHZhciB1cmlQYXJhbSA9IG1lc3NhZ2UucGFyYW1zWyd1cmknXTsKICAgICAgICBpZiAodXJpUGFyYW0gaXMhIFN0cmluZykgewogICAgICAgICAgcmV0dXJuIGVuY29kZUludmFsaWRQYXJhbUVycm9yKG1lc3NhZ2UsICd1cmknKTsKICAgICAgICB9CiAgICAgICAgVXJpIHBhcnNlZFVyaSA9IFVyaS5wYXJzZSh1cmlQYXJhbSk7CiAgICAgICAgdXJpID0gZnMucmVzb2x2ZShwYXJzZWRVcmkpOwogICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIGVuY29kZUludmFsaWRQYXJhbUVycm9yKG1lc3NhZ2UsICd1cmknKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICByZXR1cm4gZW5jb2RlSW52YWxpZFBhcmFtRXJyb3IobWVzc2FnZSwgJ3VyaScpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB2YXIgcGF0aCA9IG1lc3NhZ2UucGFyYW1zWydwYXRoJ107CiAgICAgIGlmIChwYXRoID09IG51bGwpIHsKICAgICAgICByZXR1cm4gZW5jb2RlTWlzc2luZ1BhcmFtRXJyb3IobWVzc2FnZSwgJ3BhdGgnKTsKICAgICAgfQogICAgICBpZiAocGF0aCBpcyEgU3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIGVuY29kZUludmFsaWRQYXJhbUVycm9yKG1lc3NhZ2UsICdwYXRoJyk7CiAgICAgIH0KICAgICAgdXJpID0gZnMucmVzb2x2ZVBhdGgocGF0aCk7CiAgICAgIGlmICh1cmkgPT0gbnVsbCkgewogICAgICAgIHJldHVybiBlbmNvZGVJbnZhbGlkUGFyYW1FcnJvcihtZXNzYWdlLCAncGF0aCcpOwogICAgICB9CiAgICB9CiAgICB2YXIgZmlsZUNvbnRlbnRzID0gbWVzc2FnZS5wYXJhbXNbJ2ZpbGVDb250ZW50cyddOwogICAgaWYgKGZpbGVDb250ZW50cyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBlbmNvZGVNaXNzaW5nUGFyYW1FcnJvcihtZXNzYWdlLCAnZmlsZUNvbnRlbnRzJyk7CiAgICB9CiAgICBpZiAoZmlsZUNvbnRlbnRzIGlzISBTdHJpbmcpIHsKICAgICAgcmV0dXJuIGVuY29kZUludmFsaWRQYXJhbUVycm9yKG1lc3NhZ2UsICdmaWxlQ29udGVudHMnKTsKICAgIH0KICAgIExpc3Q8aW50PiBkZWNvZGVkRmlsZUNvbnRlbnRzID0gYmFzZTY0LmRlY29kZShmaWxlQ29udGVudHMpOwoKICAgIGF3YWl0IHdyaXRlRmlsZSh1cmksIGRlY29kZWRGaWxlQ29udGVudHMpOwogICAgcmV0dXJuIGVuY29kZVN1Y2Nlc3MobWVzc2FnZSk7CiAgfQoKICBGdXR1cmU8U3RyaW5nPiBfd3JpdGVEZXZGU0ZpbGVzKE1lc3NhZ2UgbWVzc2FnZSkgYXN5bmMgewogICAgdmFyIHdyaXRlRmlsZSA9IFZNU2VydmljZUVtYmVkZGVySG9va3Mud3JpdGVGaWxlOwogICAgaWYgKHdyaXRlRmlsZSA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfZW5jb2RlRGV2RlNEaXNhYmxlZEVycm9yKG1lc3NhZ2UpOwogICAgfQogICAgdmFyIGZzTmFtZSA9IG1lc3NhZ2UucGFyYW1zWydmc05hbWUnXTsKICAgIGlmIChmc05hbWUgPT0gbnVsbCkgewogICAgICByZXR1cm4gZW5jb2RlTWlzc2luZ1BhcmFtRXJyb3IobWVzc2FnZSwgJ2ZzTmFtZScpOwogICAgfQogICAgaWYgKGZzTmFtZSBpcyEgU3RyaW5nKSB7CiAgICAgIHJldHVybiBlbmNvZGVJbnZhbGlkUGFyYW1FcnJvcihtZXNzYWdlLCAnZnNOYW1lJyk7CiAgICB9CiAgICB2YXIgZnMgPSBfZnNNYXBbZnNOYW1lXTsKICAgIGlmIChmcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfZW5jb2RlRmlsZVN5c3RlbURvZXNOb3RFeGlzdEVycm9yKG1lc3NhZ2UsIGZzTmFtZSk7CiAgICB9CiAgICB2YXIgZmlsZXMgPSBtZXNzYWdlLnBhcmFtc1snZmlsZXMnXTsKICAgIGlmIChmaWxlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBlbmNvZGVNaXNzaW5nUGFyYW1FcnJvcihtZXNzYWdlLCAnZmlsZXMnKTsKICAgIH0KICAgIGlmIChmaWxlcyBpcyEgTGlzdCkgewogICAgICByZXR1cm4gZW5jb2RlSW52YWxpZFBhcmFtRXJyb3IobWVzc2FnZSwgJ2ZpbGVzJyk7CiAgICB9CiAgICB2YXIgdXJpcyA9IFtdOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgZmlsZUluZm8gPSBmaWxlc1tpXTsKICAgICAgaWYgKGZpbGVJbmZvIGlzISBMaXN0IHx8CiAgICAgICAgICBmaWxlSW5mby5sZW5ndGggIT0gMiB8fAogICAgICAgICAgZmlsZUluZm9bMF0gaXMhIFN0cmluZyB8fAogICAgICAgICAgZmlsZUluZm9bMV0gaXMhIFN0cmluZykgewogICAgICAgIHJldHVybiBlbmNvZGVScGNFcnJvcihtZXNzYWdlLCBrSW52YWxpZFBhcmFtcywKICAgICAgICAgICAgZGV0YWlsczogIiR7bWVzc2FnZS5tZXRob2R9OiBpbnZhbGlkICdmaWxlcycgcGFyYW1ldGVyICIKICAgICAgICAgICAgICAgICJhdCBpbmRleCAke2l9OiAke2ZpbGVJbmZvfSIpOwogICAgICB9CiAgICAgIHZhciB1cmkgPSBmcy5yZXNvbHZlUGF0aChmaWxlSW5mb1swXSk7CiAgICAgIGlmICh1cmkgPT0gbnVsbCkgewogICAgICAgIHJldHVybiBlbmNvZGVScGNFcnJvcihtZXNzYWdlLCBrSW52YWxpZFBhcmFtcywKICAgICAgICAgICAgZGV0YWlsczogIiR7bWVzc2FnZS5tZXRob2R9OiBpbnZhbGlkICdmaWxlcycgcGFyYW1ldGVyICIKICAgICAgICAgICAgICAgICJhdCBpbmRleCAke2l9OiAke2ZpbGVJbmZvfSIpOwogICAgICB9CiAgICAgIHVyaXMuYWRkKHVyaSk7CiAgICB9CiAgICB2YXIgcGVuZGluZ1dyaXRlcyA9IDxGdXR1cmU+W107CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHVyaXMubGVuZ3RoOyBpKyspIHsKICAgICAgTGlzdDxpbnQ+IGRlY29kZWRGaWxlQ29udGVudHMgPSBiYXNlNjQuZGVjb2RlKGZpbGVzW2ldWzFdKTsKICAgICAgcGVuZGluZ1dyaXRlcy5hZGQod3JpdGVGaWxlKHVyaXNbaV0sIGRlY29kZWRGaWxlQ29udGVudHMpKTsKICAgIH0KICAgIGF3YWl0IEZ1dHVyZS53YWl0KHBlbmRpbmdXcml0ZXMpOwogICAgcmV0dXJuIGVuY29kZVN1Y2Nlc3MobWVzc2FnZSk7CiAgfQoKICBGdXR1cmU8U3RyaW5nPiBfbGlzdERldkZTRmlsZXMoTWVzc2FnZSBtZXNzYWdlKSBhc3luYyB7CiAgICB2YXIgbGlzdEZpbGVzID0gVk1TZXJ2aWNlRW1iZWRkZXJIb29rcy5saXN0RmlsZXM7CiAgICBpZiAobGlzdEZpbGVzID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9lbmNvZGVEZXZGU0Rpc2FibGVkRXJyb3IobWVzc2FnZSk7CiAgICB9CiAgICB2YXIgZnNOYW1lID0gbWVzc2FnZS5wYXJhbXNbJ2ZzTmFtZSddOwogICAgaWYgKGZzTmFtZSA9PSBudWxsKSB7CiAgICAgIHJldHVybiBlbmNvZGVNaXNzaW5nUGFyYW1FcnJvcihtZXNzYWdlLCAnZnNOYW1lJyk7CiAgICB9CiAgICBpZiAoZnNOYW1lIGlzISBTdHJpbmcpIHsKICAgICAgcmV0dXJuIGVuY29kZUludmFsaWRQYXJhbUVycm9yKG1lc3NhZ2UsICdmc05hbWUnKTsKICAgIH0KICAgIHZhciBmcyA9IF9mc01hcFtmc05hbWVdOwogICAgaWYgKGZzID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9lbmNvZGVGaWxlU3lzdGVtRG9lc05vdEV4aXN0RXJyb3IobWVzc2FnZSwgZnNOYW1lKTsKICAgIH0KICAgIHZhciBmaWxlTGlzdCA9IGF3YWl0IGxpc3RGaWxlcyhmcy51cmkpOwogICAgLy8gUmVtb3ZlIGFueSB1cmwtZW5jb2RpbmcgaW4gdGhlIGZpbGVuYW1lcy4KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgZmlsZUxpc3RbaV1bJ25hbWUnXSA9IFVyaS5kZWNvZGVGdWxsKGZpbGVMaXN0W2ldWyduYW1lJ10pOwogICAgfQogICAgdmFyIHJlc3VsdCA9IHsndHlwZSc6ICdGU0ZpbGVMaXN0JywgJ2ZpbGVzJzogZmlsZUxpc3R9OwogICAgcmV0dXJuIGVuY29kZVJlc3VsdChtZXNzYWdlLCByZXN1bHQpOwogIH0KfQqBkQBOTjwBGQE0M0YCAU07TQIBTDpNAgEUJAEVEQEhICAGGBMGEQokJRMGAR0EAR0KRhwmEwYBLz5AEwYYBAEQDRwUHQcEAgEOCwEoAScSFBQWFxgXBgETNh0OBiAkKAYcFAQBLi8EATgeGSQbJhsmHSgeKR8qHikPNzoGBAEiTjdAQiMxBho5Bh05Bh0WQgYVFxo5CB05CCIZOQgNHRk4CAYnIwQBNRUnLioEATc+ITEGKxo5Bh05Bh0WQwYvKxkuBAE3Nh0xBisaOQYdOQYkFkIGHSMEATk0HDEGKxo5Bh05Bh0WQgYNKQwuIzoKLSUbOgoUOAgNKRo5CB05CCIZOQgGCi1NLBI4KgYEATo2HTEGKxo5Bh05Bh0WQgYNKQwuIzoKLSUbOgoUOAgNKRo5CB05CCIZOQgGNyA/BiM/BkEBLyMEATs2HTEGKxo5Bh05Bh0WQgYpGTgGGjgGEy0fHyIkJDdFLwgtGTdFLwgVBiQsQkIGJiMEATo2HTEGKxo5Bh05Bh0WQgYsMTBBBjwqBAIBGmRhcnQ6X3Ztc2VydmljZS9kZXZmcy5kYXJ0NG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi92bXNlcnZpY2UvY29uc3RhbnRzLmRhcnSDry8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuX3Ztc2VydmljZTsKCi8vIFRoZXNlIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggcnVudGltZS92bS9zZXJ2aWNlLmNjLgpjbGFzcyBDb25zdGFudHMgewogIHN0YXRpYyBjb25zdCBpbnQgU0VSVklDRV9FWElUX01FU1NBR0VfSUQgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgSVNPTEFURV9TVEFSVFVQX01FU1NBR0VfSUQgPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgSVNPTEFURV9TSFVURE9XTl9NRVNTQUdFX0lEID0gMjsKICBzdGF0aWMgY29uc3QgaW50IFdFQl9TRVJWRVJfQ09OVFJPTF9NRVNTQUdFX0lEID0gMzsKICBzdGF0aWMgY29uc3QgaW50IFNFUlZFUl9JTkZPX01FU1NBR0VfSUQgPSA0OwoKICAvLy8gU2lnbmFscyBhbiBSUEMgY29taW5nIGZyb20gbmF0aXZlIGNvZGUgKGluc3RlYWQgb2YgZnJvbSBhIHdlYnNvY2tldAogIC8vLyBjb25uZWN0aW9uKS4gIFRoZXNlIGNhbGxzIGFyZSBsaW1pdGVkIHRvIHNpbXBsZSByZXF1ZXN0LXJlc3BvbnNlIGFuZCBkbwogIC8vLyBub3QgYWxsb3cgYXJiaXRyYXJ5IGpzb24tcnBjIG1lc3NhZ2VzLgogIC8vLwogIC8vLyBUaGUgbWVzc2FnZXMgYXJlIGFuIGFycmF5IG9mIGxlbmd0aCAzOgogIC8vLyAgIChNRVRIT0RfQ0FMTF9GUk9NX05BVElWRSwgU3RyaW5nIGpzb25SZXF1ZXN0LCBQb3J0SWQgcmVwbHlQb3J0KS4KICBzdGF0aWMgY29uc3QgaW50IE1FVEhPRF9DQUxMX0ZST01fTkFUSVZFID0gNTsKfQoYAE5OPAEZAToSMDM0Ni8BSk4tBi1JMAIBHmRhcnQ6X3Ztc2VydmljZS9jb25zdGFudHMuZGFydDpvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvdm1zZXJ2aWNlL3J1bm5pbmdfaXNvbGF0ZS5kYXJ0gqsvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0Ll92bXNlcnZpY2U7CgpjbGFzcyBSdW5uaW5nSXNvbGF0ZSBpbXBsZW1lbnRzIE1lc3NhZ2VSb3V0ZXIgewogIGZpbmFsIGludCBwb3J0SWQ7CiAgZmluYWwgU2VuZFBvcnQgc2VuZFBvcnQ7CiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIFJ1bm5pbmdJc29sYXRlKHRoaXMucG9ydElkLCB0aGlzLnNlbmRQb3J0LCB0aGlzLm5hbWUpOwoKICBTdHJpbmcgZ2V0IHNlcnZpY2VJZCA9PiAnaXNvbGF0ZXMvJHBvcnRJZCc7CgogIEBvdmVycmlkZQogIEZ1dHVyZTxSZXNwb25zZT4gcm91dGVSZXF1ZXN0KFZNU2VydmljZSBzZXJ2aWNlLCBNZXNzYWdlIG1lc3NhZ2UpIHsKICAgIC8vIFNlbmQgbWVzc2FnZSB0byBpc29sYXRlLgogICAgcmV0dXJuIG1lc3NhZ2Uuc2VuZFRvSXNvbGF0ZShzZW5kUG9ydCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJvdXRlUmVzcG9uc2UoTWVzc2FnZSBtZXNzYWdlKSB7fQp9ChoATk48ARkBMBQbFQE5AS4BDEYgLAQBDCkCASRkYXJ0Ol92bXNlcnZpY2UvcnVubmluZ19pc29sYXRlLmRhcnQ7b3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL3Ztc2VydmljZS9ydW5uaW5nX2lzb2xhdGVzLmRhcnScdy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuX3Ztc2VydmljZTsKCmNsYXNzIFJ1bm5pbmdJc29sYXRlcyBpbXBsZW1lbnRzIE1lc3NhZ2VSb3V0ZXIgewogIGZpbmFsIE1hcDxpbnQsIFJ1bm5pbmdJc29sYXRlPiBpc29sYXRlcyA9IG5ldyBNYXA8aW50LCBSdW5uaW5nSXNvbGF0ZT4oKTsKICBpbnQgX3Jvb3RQb3J0SWQ7CgogIFJ1bm5pbmdJc29sYXRlcygpOwoKICB2b2lkIGlzb2xhdGVTdGFydHVwKGludCBwb3J0SWQsIFNlbmRQb3J0IHNwLCBTdHJpbmcgbmFtZSkgewogICAgaWYgKF9yb290UG9ydElkID09IG51bGwpIHsKICAgICAgX3Jvb3RQb3J0SWQgPSBwb3J0SWQ7CiAgICB9CiAgICB2YXIgcmkgPSBuZXcgUnVubmluZ0lzb2xhdGUocG9ydElkLCBzcCwgbmFtZSk7CiAgICBpc29sYXRlc1twb3J0SWRdID0gcmk7CiAgfQoKICB2b2lkIGlzb2xhdGVTaHV0ZG93bihpbnQgcG9ydElkLCBTZW5kUG9ydCBzcCkgewogICAgaWYgKF9yb290UG9ydElkID09IHBvcnRJZCkgewogICAgICBfcm9vdFBvcnRJZCA9IG51bGw7CiAgICB9CiAgICBpc29sYXRlcy5yZW1vdmUocG9ydElkKTsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxSZXNwb25zZT4gcm91dGVSZXF1ZXN0KFZNU2VydmljZSBzZXJ2aWNlLCBNZXNzYWdlIG1lc3NhZ2UpIHsKICAgIFN0cmluZyBpc29sYXRlUGFyYW0gPSBtZXNzYWdlLnBhcmFtc1snaXNvbGF0ZUlkJ107CiAgICBpbnQgaXNvbGF0ZUlkOwogICAgaWYgKCFpc29sYXRlUGFyYW0uc3RhcnRzV2l0aCgnaXNvbGF0ZXMvJykpIHsKICAgICAgbWVzc2FnZS5zZXRFcnJvclJlc3BvbnNlKAogICAgICAgICAga0ludmFsaWRQYXJhbXMsICJpbnZhbGlkICdpc29sYXRlSWQnIHBhcmFtZXRlcjogJGlzb2xhdGVQYXJhbSIpOwogICAgICByZXR1cm4gbWVzc2FnZS5yZXNwb25zZTsKICAgIH0KICAgIGlzb2xhdGVQYXJhbSA9IGlzb2xhdGVQYXJhbS5zdWJzdHJpbmcoJ2lzb2xhdGVzLycubGVuZ3RoKTsKICAgIGlmIChpc29sYXRlUGFyYW0gPT0gJ3Jvb3QnKSB7CiAgICAgIGlzb2xhdGVJZCA9IF9yb290UG9ydElkOwogICAgfSBlbHNlIHsKICAgICAgdHJ5IHsKICAgICAgICBpc29sYXRlSWQgPSBpbnQucGFyc2UoaXNvbGF0ZVBhcmFtKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIG1lc3NhZ2Uuc2V0RXJyb3JSZXNwb25zZSgKICAgICAgICAgICAga0ludmFsaWRQYXJhbXMsICJpbnZhbGlkICdpc29sYXRlSWQnIHBhcmFtZXRlcjogJGlzb2xhdGVQYXJhbSIpOwogICAgICAgIHJldHVybiBtZXNzYWdlLnJlc3BvbnNlOwogICAgICB9CiAgICB9CiAgICB2YXIgaXNvbGF0ZSA9IGlzb2xhdGVzW2lzb2xhdGVJZF07CiAgICBpZiAoaXNvbGF0ZSA9PSBudWxsKSB7CiAgICAgIC8vIFRoZXJlIGlzIHNvbWUgY2hhbmNlIHRoYXQgdGhpcyBpc29sYXRlIG1heSBoYXZlIGxpdmVkIGJlZm9yZSwKICAgICAgLy8gc28gcmV0dXJuIGEgc2VudGluZWwgcmF0aGVyIHRoYW4gYW4gZXJyb3IuCiAgICAgIHZhciByZXN1bHQgPSB7CiAgICAgICAgJ3R5cGUnOiAnU2VudGluZWwnLAogICAgICAgICdraW5kJzogJ0NvbGxlY3RlZCcsCiAgICAgICAgJ3ZhbHVlQXNTdHJpbmcnOiAnPGNvbGxlY3RlZD4nLAogICAgICB9OwogICAgICBtZXNzYWdlLnNldFJlc3BvbnNlKGVuY29kZVJlc3VsdChtZXNzYWdlLCByZXN1bHQpKTsKICAgICAgcmV0dXJuIG1lc3NhZ2UucmVzcG9uc2U7CiAgICB9CgogICAgaWYgKG1lc3NhZ2UubWV0aG9kID09ICdldmFsdWF0ZUluRnJhbWUnIHx8IG1lc3NhZ2UubWV0aG9kID09ICdldmFsdWF0ZScpIHsKICAgICAgcmV0dXJuIG5ldyBfRXZhbHVhdG9yKG1lc3NhZ2UsIGlzb2xhdGUsIHNlcnZpY2UpLnJ1bigpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGlzb2xhdGUucm91dGVSZXF1ZXN0KHNlcnZpY2UsIG1lc3NhZ2UpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByb3V0ZVJlc3BvbnNlKE1lc3NhZ2UgbWVzc2FnZSkge30KfQoKLy8vIENsYXNzIHRoYXQga25vd3MgaG93IHRvIG9yY2hlc3RyYXRlIGV4cHJlc3Npb24gZXZhbHVhdGlvbiBpbiBkYXJ0MiB3b3JsZC4KY2xhc3MgX0V2YWx1YXRvciB7CiAgX0V2YWx1YXRvcih0aGlzLl9tZXNzYWdlLCB0aGlzLl9pc29sYXRlLCB0aGlzLl9zZXJ2aWNlKTsKCiAgRnV0dXJlPFJlc3BvbnNlPiBydW4oKSBhc3luYyB7CiAgICBSZXNwb25zZSBidWlsZFNjb3BlUmVzcG9uc2UgPSBhd2FpdCBfYnVpbGRTY29wZSgpOwogICAgTWFwPFN0cmluZywgZHluYW1pYz4gcmVzcG9uc2VKc29uID0gYnVpbGRTY29wZVJlc3BvbnNlLmRlY29kZUpzb24oKTsKCiAgICBpZiAocmVzcG9uc2VKc29uLmNvbnRhaW5zS2V5KCdlcnJvcicpKSB7CiAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UuZnJvbShlbmNvZGVDb21waWxhdGlvbkVycm9yKAogICAgICAgICAgX21lc3NhZ2UsIHJlc3BvbnNlSnNvblsnZXJyb3InXVsnZGF0YSddWydkZXRhaWxzJ10pKTsKICAgIH0KCiAgICBTdHJpbmcga2VybmVsQmFzZTY0OwogICAgdHJ5IHsKICAgICAga2VybmVsQmFzZTY0ID0gYXdhaXQgX2NvbXBpbGVFeHByZXNzaW9uKHJlc3BvbnNlSnNvblsncmVzdWx0J10pOwogICAgfSBjYXRjaCAoZSkgewogICAgICByZXR1cm4gbmV3IFJlc3BvbnNlLmZyb20oZW5jb2RlQ29tcGlsYXRpb25FcnJvcihfbWVzc2FnZSwgZS50b1N0cmluZygpKSk7CiAgICB9CiAgICByZXR1cm4gX2V2YWx1YXRlQ29tcGlsZWRFeHByZXNzaW9uKGtlcm5lbEJhc2U2NCk7CiAgfQoKICBNZXNzYWdlIF9tZXNzYWdlOwogIFJ1bm5pbmdJc29sYXRlIF9pc29sYXRlOwogIFZNU2VydmljZSBfc2VydmljZTsKCiAgRnV0dXJlPFJlc3BvbnNlPiBfYnVpbGRTY29wZSgpIHsKICAgIE1hcDxTdHJpbmcsIGR5bmFtaWM+IHBhcmFtcyA9IF9zZXR1cFBhcmFtcygpOwogICAgcGFyYW1zWydpc29sYXRlSWQnXSA9IF9tZXNzYWdlLnBhcmFtc1snaXNvbGF0ZUlkJ107CiAgICBNYXAgYnVpbGRTY29wZVBhcmFtcyA9IHsKICAgICAgJ21ldGhvZCc6ICdfYnVpbGRFeHByZXNzaW9uRXZhbHVhdGlvblNjb3BlJywKICAgICAgJ2lkJzogX21lc3NhZ2Uuc2VyaWFsLAogICAgICAncGFyYW1zJzogcGFyYW1zLAogICAgfTsKICAgIGlmIChfbWVzc2FnZS5wYXJhbXNbJ3Njb3BlJ10gIT0gbnVsbCkgewogICAgICBidWlsZFNjb3BlUGFyYW1zWydwYXJhbXMnXVsnc2NvcGUnXSA9IF9tZXNzYWdlLnBhcmFtc1snc2NvcGUnXTsKICAgIH0KICAgIHZhciBidWlsZFNjb3BlID0KICAgICAgICBuZXcgTWVzc2FnZS5fZnJvbUpzb25ScGNSZXF1ZXN0KF9tZXNzYWdlLmNsaWVudCwgYnVpbGRTY29wZVBhcmFtcyk7CgogICAgLy8gRGVjb2RlIHRoZSBKU09OIGFuZCBhbmQgaW5zZXJ0IGl0IGludG8gdGhlIG1hcC4gVGhlIG1hcCBrZXkKICAgIC8vIGlzIHRoZSByZXF1ZXN0IFVyaS4KICAgIHJldHVybiBfaXNvbGF0ZS5yb3V0ZVJlcXVlc3QoX3NlcnZpY2UsIGJ1aWxkU2NvcGUpOwogIH0KCiAgRnV0dXJlPFN0cmluZz4gX2NvbXBpbGVFeHByZXNzaW9uKAogICAgICBNYXA8U3RyaW5nLCBkeW5hbWljPiBidWlsZFNjb3BlUmVzcG9uc2VSZXN1bHQpIHsKICAgIENsaWVudCBleHRlcm5hbENsaWVudCA9CiAgICAgICAgX3NlcnZpY2UuX2ZpbmRGaXJzdENsaWVudFRoYXRIYW5kbGVzU2VydmljZSgnY29tcGlsZUV4cHJlc3Npb24nKTsKCiAgICBNYXAgY29tcGlsZVBhcmFtcyA9IHsKICAgICAgJ2lzb2xhdGVJZCc6IF9tZXNzYWdlLnBhcmFtc1snaXNvbGF0ZUlkJ10sCiAgICAgICdleHByZXNzaW9uJzogX21lc3NhZ2UucGFyYW1zWydleHByZXNzaW9uJ10sCiAgICAgICdkZWZpbml0aW9ucyc6IGJ1aWxkU2NvcGVSZXNwb25zZVJlc3VsdFsncGFyYW1fbmFtZXMnXSwKICAgICAgJ3R5cGVEZWZpbml0aW9ucyc6IGJ1aWxkU2NvcGVSZXNwb25zZVJlc3VsdFsndHlwZV9wYXJhbXNfbmFtZXMnXSwKICAgICAgJ2xpYnJhcnlVcmknOiBidWlsZFNjb3BlUmVzcG9uc2VSZXN1bHRbJ2xpYnJhcnlVcmknXSwKICAgICAgJ2lzU3RhdGljJzogYnVpbGRTY29wZVJlc3BvbnNlUmVzdWx0Wydpc1N0YXRpYyddLAogICAgfTsKICAgIGR5bmFtaWMga2xhc3MgPSBidWlsZFNjb3BlUmVzcG9uc2VSZXN1bHRbJ2tsYXNzJ107CiAgICBpZiAoa2xhc3MgIT0gbnVsbCkgewogICAgICBjb21waWxlUGFyYW1zWydrbGFzcyddID0ga2xhc3M7CiAgICB9CiAgICBpZiAoZXh0ZXJuYWxDbGllbnQgIT0gbnVsbCkgewogICAgICB2YXIgY29tcGlsZUV4cHJlc3Npb24gPSBuZXcgTWVzc2FnZS5mb3JNZXRob2QoJ2NvbXBpbGVFeHByZXNzaW9uJyk7CiAgICAgIGNvbXBpbGVFeHByZXNzaW9uLmNsaWVudCA9IGV4dGVybmFsQ2xpZW50OwogICAgICBjb21waWxlRXhwcmVzc2lvbi5wYXJhbXMuYWRkQWxsKGNvbXBpbGVQYXJhbXMpOwoKICAgICAgZmluYWwgaWQgPSBfc2VydmljZS5fc2VydmljZVJlcXVlc3RzLm5ld0lkKCk7CiAgICAgIGZpbmFsIG9sZElkID0gX21lc3NhZ2Uuc2VyaWFsOwogICAgICBmaW5hbCBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPFN0cmluZz4oKTsKICAgICAgZXh0ZXJuYWxDbGllbnQuc2VydmljZUhhbmRsZXNbaWRdID0gKE1lc3NhZ2UgbSkgewogICAgICAgIGlmIChtICE9IG51bGwpIHsKICAgICAgICAgIGNvbXBsZXRlci5jb21wbGV0ZShqc29uLmVuY29kZShtLmZvcndhcmRUb0pzb24oeydpZCc6IG9sZElkfSkpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29tcGxldGVyLmNvbXBsZXRlKGVuY29kZVJwY0Vycm9yKF9tZXNzYWdlLCBrU2VydmljZURpc2FwcGVhcmVkKSk7CiAgICAgICAgfQogICAgICB9OwogICAgICBleHRlcm5hbENsaWVudC5wb3N0KG5ldyBSZXNwb25zZS5qc29uKGNvbXBpbGVFeHByZXNzaW9uCiAgICAgICAgICAuZm9yd2FyZFRvSnNvbih7J2lkJzogaWQsICdtZXRob2QnOiAnY29tcGlsZUV4cHJlc3Npb24nfSkpKTsKICAgICAgcmV0dXJuIGNvbXBsZXRlci5mdXR1cmUKICAgICAgICAgIC50aGVuKChTdHJpbmcgcykgPT4ganNvbkRlY29kZShzKSkKICAgICAgICAgIC50aGVuKChkeW5hbWljIGpzb24pIHsKICAgICAgICBNYXA8U3RyaW5nLCBkeW5hbWljPiBqc29uTWFwID0ganNvbjsKICAgICAgICBpZiAoanNvbk1hcC5jb250YWluc0tleSgnZXJyb3InKSkgewogICAgICAgICAgdGhyb3cganNvbk1hcFsnZXJyb3InXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGpzb25NYXBbJ3Jlc3VsdCddWydyZXN1bHQnXVsna2VybmVsQnl0ZXMnXTsKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICAvLyBmYWxsYmFjayB0byBjb21waWxlIHVzaW5nIGtlcm5lbCBzZXJ2aWNlCiAgICAgIE1hcCBjb21waWxlRXhwcmVzc2lvblBhcmFtcyA9IHsKICAgICAgICAnbWV0aG9kJzogJ19jb21waWxlRXhwcmVzc2lvbicsCiAgICAgICAgJ2lkJzogX21lc3NhZ2Uuc2VyaWFsLAogICAgICAgICdwYXJhbXMnOiBjb21waWxlUGFyYW1zLAogICAgICB9OwogICAgICB2YXIgY29tcGlsZUV4cHJlc3Npb24gPSBuZXcgTWVzc2FnZS5fZnJvbUpzb25ScGNSZXF1ZXN0KAogICAgICAgICAgX21lc3NhZ2UuY2xpZW50LCBjb21waWxlRXhwcmVzc2lvblBhcmFtcyk7CgogICAgICByZXR1cm4gX2lzb2xhdGUKICAgICAgICAgIC5yb3V0ZVJlcXVlc3QoX3NlcnZpY2UsIGNvbXBpbGVFeHByZXNzaW9uKQogICAgICAgICAgLnRoZW4oKFJlc3BvbnNlIHJlc3BvbnNlKSA9PiByZXNwb25zZS5kZWNvZGVKc29uKCkpCiAgICAgICAgICAudGhlbigoZHluYW1pYyBqc29uKSB7CiAgICAgICAgaWYgKGpzb25bJ3Jlc3VsdCddICE9IG51bGwpIHsKICAgICAgICAgIHJldHVybiBqc29uWydyZXN1bHQnXVsna2VybmVsQnl0ZXMnXTsKICAgICAgICB9CiAgICAgICAgdGhyb3cganNvblsnZXJyb3InXVsnZGF0YSddWydkZXRhaWxzJ107CiAgICAgIH0pOwogICAgfQogIH0KCiAgRnV0dXJlPFJlc3BvbnNlPiBfZXZhbHVhdGVDb21waWxlZEV4cHJlc3Npb24oU3RyaW5nIGtlcm5lbEJhc2U2NCkgewogICAgaWYgKGtlcm5lbEJhc2U2NC5pc05vdEVtcHR5KSB7CiAgICAgIE1hcDxTdHJpbmcsIGR5bmFtaWM+IHBhcmFtcyA9IF9zZXR1cFBhcmFtcygpOwogICAgICBwYXJhbXNbJ2lzb2xhdGVJZCddID0gX21lc3NhZ2UucGFyYW1zWydpc29sYXRlSWQnXTsKICAgICAgcGFyYW1zWydrZXJuZWxCeXRlcyddID0ga2VybmVsQmFzZTY0OwogICAgICBwYXJhbXNbJ2Rpc2FibGVCcmVha3BvaW50cyddID0gX21lc3NhZ2UucGFyYW1zWydkaXNhYmxlQnJlYWtwb2ludHMnXTsKICAgICAgTWFwIHJ1blBhcmFtcyA9IHsKICAgICAgICAnbWV0aG9kJzogJ19ldmFsdWF0ZUNvbXBpbGVkRXhwcmVzc2lvbicsCiAgICAgICAgJ2lkJzogX21lc3NhZ2Uuc2VyaWFsLAogICAgICAgICdwYXJhbXMnOiBwYXJhbXMsCiAgICAgIH07CiAgICAgIGlmIChfbWVzc2FnZS5wYXJhbXNbJ3Njb3BlJ10gIT0gbnVsbCkgewogICAgICAgIHJ1blBhcmFtc1sncGFyYW1zJ11bJ3Njb3BlJ10gPSBfbWVzc2FnZS5wYXJhbXNbJ3Njb3BlJ107CiAgICAgIH0KICAgICAgdmFyIHJ1bkV4cHJlc3Npb24gPQogICAgICAgICAgbmV3IE1lc3NhZ2UuX2Zyb21Kc29uUnBjUmVxdWVzdChfbWVzc2FnZS5jbGllbnQsIHJ1blBhcmFtcyk7CiAgICAgIHJldHVybiBfaXNvbGF0ZS5yb3V0ZVJlcXVlc3QoX3NlcnZpY2UsIHJ1bkV4cHJlc3Npb24pOyAvLyBfbWVzc2FnZQogICAgfSBlbHNlIHsKICAgICAgLy8gZW1wdHkga2VybmVsIGluZGljYXRlcyBkYXJ0MSBtb2RlCiAgICAgIHJldHVybiBfaXNvbGF0ZS5yb3V0ZVJlcXVlc3QoX3NlcnZpY2UsIF9tZXNzYWdlKTsKICAgIH0KICB9CgogIE1hcDxTdHJpbmcsIGR5bmFtaWM+IF9zZXR1cFBhcmFtcygpIHsKICAgIGlmIChfbWVzc2FnZS5tZXRob2QgPT0gJ2V2YWx1YXRlSW5GcmFtZScpIHsKICAgICAgcmV0dXJuIDxTdHJpbmcsIGR5bmFtaWM+eydmcmFtZUluZGV4JzogX21lc3NhZ2UucGFyYW1zWydmcmFtZUluZGV4J119OwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KF9tZXNzYWdlLm1ldGhvZCA9PSAnZXZhbHVhdGUnKTsKICAgICAgcmV0dXJuIDxTdHJpbmcsIGR5bmFtaWM+eyd0YXJnZXRJZCc6IF9tZXNzYWdlLnBhcmFtc1sndGFyZ2V0SWQnXX07CiAgICB9CiAgfQp9CoDYAE5OPAEZATFMEwEVAT4fHAYzGwQBMiEaBh0EAQxGNxMxIEsfBj8iHw0MLRQiTSEIBicbRzQVHB0oCTofBgFPPg01BgQBDCkCAU4TOwEhN0kBLTdABgEZCkcSUAY2BAEUGxYBIzI4HTMdGAcsRgYVTAFDGzgEASU3HEoBGjEzPkg8OAc3GSYGIkoxNgE0JTE4GUsRTQoJPkceLSEtLCIKOwoNMiYoHyEJPzUBFjU+ISYwCjAKBgQBRiM0OixMGDEfGgkuQQgaR0kNKzgGBAEoME0NLUkGBAIBJWRhcnQ6X3Ztc2VydmljZS9ydW5uaW5nX2lzb2xhdGVzLmRhcnQyb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL3Ztc2VydmljZS9tZXNzYWdlLmRhcnSeSS8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuX3Ztc2VydmljZTsKCmVudW0gTWVzc2FnZVR5cGUgeyBSZXF1ZXN0LCBOb3RpZmljYXRpb24sIFJlc3BvbnNlIH0KCmNsYXNzIE1lc3NhZ2UgewogIGZpbmFsIENvbXBsZXRlcjxSZXNwb25zZT4gX2NvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXI8UmVzcG9uc2U+LnN5bmMoKTsKICBib29sIGdldCBjb21wbGV0ZWQgPT4gX2NvbXBsZXRlci5pc0NvbXBsZXRlZDsKCiAgLy8vIEZ1dHVyZSBvZiByZXNwb25zZS4KICBGdXR1cmU8UmVzcG9uc2U+IGdldCByZXNwb25zZSA9PiBfY29tcGxldGVyLmZ1dHVyZTsKICBDbGllbnQgY2xpZW50OwoKICAvLyBJcyBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlIChubyBzZXJpYWwpCiAgZmluYWwgTWVzc2FnZVR5cGUgdHlwZTsKCiAgLy8gQ2xpZW50LXNpZGUgaWRlbnRpZmllciBmb3IgdGhpcyBtZXNzYWdlLgogIGZpbmFsIHNlcmlhbDsKCiAgZmluYWwgU3RyaW5nIG1ldGhvZDsKCiAgZmluYWwgTWFwIHBhcmFtcyA9IG5ldyBNYXAoKTsKICBmaW5hbCBNYXAgcmVzdWx0ID0gbmV3IE1hcCgpOwogIGZpbmFsIE1hcCBlcnJvciA9IG5ldyBNYXAoKTsKCiAgZmFjdG9yeSBNZXNzYWdlLmZyb21Kc29uUnBjKENsaWVudCBjbGllbnQsIE1hcCBtYXApIHsKICAgIGlmIChtYXAuY29udGFpbnNLZXkoJ2lkJykpIHsKICAgICAgZmluYWwgaWQgPSBtYXBbJ2lkJ107CiAgICAgIGlmIChpZCAhPSBudWxsICYmIGlkIGlzISBudW0gJiYgaWQgaXMhIFN0cmluZykgewogICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJyJpZCIgbXVzdCBiZSBhIG51bWJlciwgc3RyaW5nLCBvciBudWxsLicpOwogICAgICB9CiAgICAgIGlmIChtYXAuY29udGFpbnNLZXkoJ21ldGhvZCcpKSB7CiAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlLl9mcm9tSnNvblJwY1JlcXVlc3QoY2xpZW50LCBtYXApOwogICAgICB9CiAgICAgIGlmIChtYXAuY29udGFpbnNLZXkoJ3Jlc3VsdCcpKSB7CiAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlLl9mcm9tSnNvblJwY1Jlc3VsdChjbGllbnQsIG1hcCk7CiAgICAgIH0KICAgICAgaWYgKG1hcC5jb250YWluc0tleSgnZXJyb3InKSkgewogICAgICAgIHJldHVybiBuZXcgTWVzc2FnZS5fZnJvbUpzb25ScGNFcnJvcihjbGllbnQsIG1hcCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobWFwLmNvbnRhaW5zS2V5KCdtZXRob2QnKSkgewogICAgICByZXR1cm4gbmV3IE1lc3NhZ2UuX2Zyb21Kc29uUnBjTm90aWZpY2F0aW9uKGNsaWVudCwgbWFwKTsKICAgIH0KICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ0ludmFsaWQgbWVzc2FnZSBmb3JtYXQnKTsKICB9CgogIC8vIGh0dHA6Ly93d3cuanNvbnJwYy5vcmcvc3BlY2lmaWNhdGlvbiNyZXF1ZXN0X29iamVjdAogIE1lc3NhZ2UuX2Zyb21Kc29uUnBjUmVxdWVzdChDbGllbnQgY2xpZW50LCBNYXAgbWFwKQogICAgICA6IGNsaWVudCA9IGNsaWVudCwKICAgICAgICB0eXBlID0gTWVzc2FnZVR5cGUuUmVxdWVzdCwKICAgICAgICBzZXJpYWwgPSBtYXBbJ2lkJ10sCiAgICAgICAgbWV0aG9kID0gbWFwWydtZXRob2QnXSB7CiAgICBpZiAobWFwWydwYXJhbXMnXSAhPSBudWxsKSB7CiAgICAgIHBhcmFtcy5hZGRBbGwobWFwWydwYXJhbXMnXSk7CiAgICB9CiAgfQoKICAvLyBodHRwOi8vd3d3Lmpzb25ycGMub3JnL3NwZWNpZmljYXRpb24jbm90aWZpY2F0aW9uCiAgTWVzc2FnZS5fZnJvbUpzb25ScGNOb3RpZmljYXRpb24oQ2xpZW50IGNsaWVudCwgTWFwIG1hcCkKICAgICAgOiBjbGllbnQgPSBjbGllbnQsCiAgICAgICAgdHlwZSA9IE1lc3NhZ2VUeXBlLk5vdGlmaWNhdGlvbiwKICAgICAgICBtZXRob2QgPSBtYXBbJ21ldGhvZCddLAogICAgICAgIHNlcmlhbCA9IG51bGwgewogICAgaWYgKG1hcFsncGFyYW1zJ10gIT0gbnVsbCkgewogICAgICBwYXJhbXMuYWRkQWxsKG1hcFsncGFyYW1zJ10pOwogICAgfQogIH0KCiAgLy8gaHR0cDovL3d3dy5qc29ucnBjLm9yZy9zcGVjaWZpY2F0aW9uI3Jlc3BvbnNlX29iamVjdAogIE1lc3NhZ2UuX2Zyb21Kc29uUnBjUmVzdWx0KENsaWVudCBjbGllbnQsIE1hcCBtYXApCiAgICAgIDogY2xpZW50ID0gY2xpZW50LAogICAgICAgIHR5cGUgPSBNZXNzYWdlVHlwZS5SZXNwb25zZSwKICAgICAgICBzZXJpYWwgPSBtYXBbJ2lkJ10sCiAgICAgICAgbWV0aG9kID0gbnVsbCB7CiAgICByZXN1bHQuYWRkQWxsKG1hcFsncmVzdWx0J10pOwogIH0KCiAgLy8gaHR0cDovL3d3dy5qc29ucnBjLm9yZy9zcGVjaWZpY2F0aW9uI3Jlc3BvbnNlX29iamVjdAogIE1lc3NhZ2UuX2Zyb21Kc29uUnBjRXJyb3IoQ2xpZW50IGNsaWVudCwgTWFwIG1hcCkKICAgICAgOiBjbGllbnQgPSBjbGllbnQsCiAgICAgICAgdHlwZSA9IE1lc3NhZ2VUeXBlLlJlc3BvbnNlLAogICAgICAgIHNlcmlhbCA9IG1hcFsnaWQnXSwKICAgICAgICBtZXRob2QgPSBudWxsIHsKICAgIGVycm9yLmFkZEFsbChtYXBbJ2Vycm9yJ10pOwogIH0KCiAgc3RhdGljIFN0cmluZyBfbWV0aG9kTmFtZUZyb21VcmkoVXJpIHVyaSkgewogICAgaWYgKHVyaSA9PSBudWxsKSB7CiAgICAgIHJldHVybiAnJzsKICAgIH0KICAgIGlmICh1cmkucGF0aFNlZ21lbnRzLmxlbmd0aCA9PSAwKSB7CiAgICAgIHJldHVybiAnJzsKICAgIH0KICAgIHJldHVybiB1cmkucGF0aFNlZ21lbnRzWzBdOwogIH0KCiAgTWVzc2FnZS5mb3JNZXRob2QoU3RyaW5nIG1ldGhvZCkKICAgICAgOiBjbGllbnQgPSBudWxsLAogICAgICAgIG1ldGhvZCA9IG1ldGhvZCwKICAgICAgICB0eXBlID0gTWVzc2FnZVR5cGUuUmVxdWVzdCwKICAgICAgICBzZXJpYWwgPSAnJzsKCiAgTWVzc2FnZS5mcm9tVXJpKHRoaXMuY2xpZW50LCBVcmkgdXJpKQogICAgICA6IHR5cGUgPSBNZXNzYWdlVHlwZS5SZXF1ZXN0LAogICAgICAgIHNlcmlhbCA9ICcnLAogICAgICAgIG1ldGhvZCA9IF9tZXRob2ROYW1lRnJvbVVyaSh1cmkpIHsKICAgIHBhcmFtcy5hZGRBbGwodXJpLnF1ZXJ5UGFyYW1ldGVycyk7CiAgfQoKICBNZXNzYWdlLmZvcklzb2xhdGUodGhpcy5jbGllbnQsIFVyaSB1cmksIFJ1bm5pbmdJc29sYXRlIGlzb2xhdGUpCiAgICAgIDogdHlwZSA9IE1lc3NhZ2VUeXBlLlJlcXVlc3QsCiAgICAgICAgc2VyaWFsID0gJycsCiAgICAgICAgbWV0aG9kID0gX21ldGhvZE5hbWVGcm9tVXJpKHVyaSkgewogICAgcGFyYW1zLmFkZEFsbCh1cmkucXVlcnlQYXJhbWV0ZXJzKTsKICAgIHBhcmFtc1snaXNvbGF0ZUlkJ10gPSBpc29sYXRlLnNlcnZpY2VJZDsKICB9CgogIFVyaSB0b1VyaSgpIHsKICAgIHJldHVybiBuZXcgVXJpKHBhdGg6IG1ldGhvZCwgcXVlcnlQYXJhbWV0ZXJzOiBwYXJhbXMpOwogIH0KCiAgZHluYW1pYyB0b0pzb24oKSB7CiAgICB0aHJvdyAndW5zdXBwb3J0ZWQnOwogIH0KCiAgZHluYW1pYyBmb3J3YXJkVG9Kc29uKFtNYXAgb3ZlcmxvYWRzXSkgewogICAgTWFwPGR5bmFtaWMsIGR5bmFtaWM+IGpzb24gPSB7J2pzb25ycGMnOiAnMi4wJywgJ2lkJzogc2VyaWFsfTsKICAgIHN3aXRjaCAodHlwZSkgewogICAgICBjYXNlIE1lc3NhZ2VUeXBlLlJlcXVlc3Q6CiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuTm90aWZpY2F0aW9uOgogICAgICAgIGpzb25bJ21ldGhvZCddID0gbWV0aG9kOwogICAgICAgIGlmIChwYXJhbXMuaXNOb3RFbXB0eSkgewogICAgICAgICAganNvblsncGFyYW1zJ10gPSBwYXJhbXM7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE1lc3NhZ2VUeXBlLlJlc3BvbnNlOgogICAgICAgIGlmIChyZXN1bHQuaXNOb3RFbXB0eSkgewogICAgICAgICAganNvblsncmVzdWx0J10gPSByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIGlmIChlcnJvci5pc05vdEVtcHR5KSB7CiAgICAgICAgICBqc29uWydlcnJvciddID0gZXJyb3I7CiAgICAgICAgfQogICAgfQogICAgaWYgKG92ZXJsb2FkcyAhPSBudWxsKSB7CiAgICAgIGpzb24uYWRkQWxsKG92ZXJsb2Fkcyk7CiAgICB9CiAgICByZXR1cm4ganNvbjsKICB9CgogIC8vIENhbGxzIHRvU3RyaW5nIG9uIGFsbCBub24tU3RyaW5nIGVsZW1lbnRzIG9mIFtsaXN0XS4gV2UgZG8gdGhpcyBzbyBhbGwKICAvLyBlbGVtZW50cyBpbiB0aGUgbGlzdCBhcmUgc3RyaW5ncywgbWFraW5nIGNvbnN1bXB0aW9uIGJ5IEMrKyBzaW1wbGVyLgogIC8vIFRoaXMgaGFzIGEgc2lkZSBlZmZlY3QgdGhhdCBib29sZWFuIGxpdGVyYWwgdmFsdWVzIGxpa2UgdHJ1ZSBiZWNvbWUgJ3RydWUnCiAgLy8gYW5kIHRodXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgc3RyaW5nIGxpdGVyYWwgJ3RydWUnLgogIExpc3Q8U3RyaW5nPiBfbWFrZUFsbFN0cmluZyhMaXN0IGxpc3QpIHsKICAgIGlmIChsaXN0ID09IG51bGwpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB2YXIgbmV3X2xpc3QgPSBuZXcgTGlzdDxTdHJpbmc+KGxpc3QubGVuZ3RoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICBuZXdfbGlzdFtpXSA9IGxpc3RbaV0udG9TdHJpbmcoKTsKICAgIH0KICAgIHJldHVybiBuZXdfbGlzdDsKICB9CgogIEZ1dHVyZTxSZXNwb25zZT4gc2VuZFRvSXNvbGF0ZShTZW5kUG9ydCBzZW5kUG9ydCkgewogICAgZmluYWwgcmVjZWl2ZVBvcnQgPSBuZXcgUmF3UmVjZWl2ZVBvcnQoKTsKICAgIHJlY2VpdmVQb3J0LmhhbmRsZXIgPSAodmFsdWUpIHsKICAgICAgcmVjZWl2ZVBvcnQuY2xvc2UoKTsKICAgICAgX3NldFJlc3BvbnNlRnJvbVBvcnQodmFsdWUpOwogICAgfTsKICAgIHZhciBrZXlzID0gX21ha2VBbGxTdHJpbmcocGFyYW1zLmtleXMudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSkpOwogICAgdmFyIHZhbHVlcyA9IF9tYWtlQWxsU3RyaW5nKHBhcmFtcy52YWx1ZXMudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSkpOwogICAgdmFyIHJlcXVlc3QgPSBuZXcgTGlzdCg2KQogICAgICAuLlswXSA9IDAgLy8gTWFrZSByb29tIGZvciBPT0IgbWVzc2FnZSB0eXBlLgogICAgICAuLlsxXSA9IHJlY2VpdmVQb3J0LnNlbmRQb3J0CiAgICAgIC4uWzJdID0gc2VyaWFsCiAgICAgIC4uWzNdID0gbWV0aG9kCiAgICAgIC4uWzRdID0ga2V5cwogICAgICAuLls1XSA9IHZhbHVlczsKICAgIGlmICghc2VuZElzb2xhdGVTZXJ2aWNlTWVzc2FnZShzZW5kUG9ydCwgcmVxdWVzdCkpIHsKICAgICAgcmVjZWl2ZVBvcnQuY2xvc2UoKTsKICAgICAgX2NvbXBsZXRlci5jb21wbGV0ZShuZXcgUmVzcG9uc2UuaW50ZXJuYWxFcnJvcigKICAgICAgICAgICdjb3VsZCBub3Qgc2VuZCBtZXNzYWdlIFske3NlcmlhbH1dIHRvIGlzb2xhdGUnKSk7CiAgICB9CiAgICByZXR1cm4gX2NvbXBsZXRlci5mdXR1cmU7CiAgfQoKICAvLyBXZSBjdXJyZW50bHkgc3VwcG9ydCB0d28gd2F5cyBvZiBwYXNzaW5nIHBhcmFtZXRlcnMgZnJvbSBEYXJ0IGNvZGUgdG8gQwogIC8vIGNvZGUuIFRoZSBvcmlnaW5hbCB3YXkgYWx3YXlzIGNvbnZlcnRzIHRoZSBwYXJhbWV0ZXJzIHRvIHN0cmluZ3MgYmVmb3JlCiAgLy8gcGFzc2luZyB0aGVtIG92ZXIuIE91ciBnb2FsIGlzIHRvIGNvbnZlcnQgYWxsIEMgaGFuZGxlcnMgdG8gdGFrZSB0aGUKICAvLyBwYXJhbWV0ZXJzIGFzIERhcnQgb2JqZWN0cyBidXQgdW50aWwgdGhlIGNvbnZlcnNpb24gaXMgY29tcGxldGUsIHdlCiAgLy8gbWFpbnRhaW4gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIG1ldGhvZHMgYmVsb3cuCiAgYm9vbCBfbWV0aG9kTmVlZHNPYmplY3RQYXJhbWV0ZXJzKFN0cmluZyBtZXRob2QpIHsKICAgIHN3aXRjaCAobWV0aG9kKSB7CiAgICAgIGNhc2UgJ19saXN0RGV2RlMnOgogICAgICBjYXNlICdfbGlzdERldkZTRmlsZXMnOgogICAgICBjYXNlICdfY3JlYXRlRGV2RlMnOgogICAgICBjYXNlICdfZGVsZXRlRGV2RlMnOgogICAgICBjYXNlICdfd3JpdGVEZXZGU0ZpbGUnOgogICAgICBjYXNlICdfd3JpdGVEZXZGU0ZpbGVzJzoKICAgICAgY2FzZSAnX3JlYWREZXZGU0ZpbGUnOgogICAgICBjYXNlICdfc3Bhd25VcmknOgogICAgICAgIHJldHVybiB0cnVlOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIEZ1dHVyZTxSZXNwb25zZT4gc2VuZFRvVk0oKSB7CiAgICBmaW5hbCByZWNlaXZlUG9ydCA9IG5ldyBSYXdSZWNlaXZlUG9ydCgpOwogICAgcmVjZWl2ZVBvcnQuaGFuZGxlciA9ICh2YWx1ZSkgewogICAgICByZWNlaXZlUG9ydC5jbG9zZSgpOwogICAgICBfc2V0UmVzcG9uc2VGcm9tUG9ydCh2YWx1ZSk7CiAgICB9OwogICAgdmFyIGtleXMgPSBwYXJhbXMua2V5cy50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICAgIHZhciB2YWx1ZXMgPSBwYXJhbXMudmFsdWVzLnRvTGlzdChncm93YWJsZTogZmFsc2UpOwogICAgaWYgKCFfbWV0aG9kTmVlZHNPYmplY3RQYXJhbWV0ZXJzKG1ldGhvZCkpIHsKICAgICAga2V5cyA9IF9tYWtlQWxsU3RyaW5nKGtleXMpOwogICAgICB2YWx1ZXMgPSBfbWFrZUFsbFN0cmluZyh2YWx1ZXMpOwogICAgfQoKICAgIGZpbmFsIHJlcXVlc3QgPSBuZXcgTGlzdCg2KQogICAgICAuLlswXSA9IDAgLy8gTWFrZSByb29tIGZvciBPT0IgbWVzc2FnZSB0eXBlLgogICAgICAuLlsxXSA9IHJlY2VpdmVQb3J0LnNlbmRQb3J0CiAgICAgIC4uWzJdID0gc2VyaWFsCiAgICAgIC4uWzNdID0gbWV0aG9kCiAgICAgIC4uWzRdID0ga2V5cwogICAgICAuLls1XSA9IHZhbHVlczsKCiAgICBpZiAoX21ldGhvZE5lZWRzT2JqZWN0UGFyYW1ldGVycyhtZXRob2QpKSB7CiAgICAgIC8vIFdlIHVzZSBhIGRpZmZlcmVudCBtZXRob2QgaW52b2NhdGlvbiBwYXRoIGhlcmUuCiAgICAgIHNlbmRPYmplY3RSb290U2VydmljZU1lc3NhZ2UocmVxdWVzdCk7CiAgICB9IGVsc2UgewogICAgICBzZW5kUm9vdFNlcnZpY2VNZXNzYWdlKHJlcXVlc3QpOwogICAgfQoKICAgIHJldHVybiBfY29tcGxldGVyLmZ1dHVyZTsKICB9CgogIHZvaWQgX3NldFJlc3BvbnNlRnJvbVBvcnQoZHluYW1pYyByZXNwb25zZSkgewogICAgX2NvbXBsZXRlci5jb21wbGV0ZShuZXcgUmVzcG9uc2UuZnJvbShyZXNwb25zZSkpOwogIH0KCiAgdm9pZCBzZXRSZXNwb25zZShTdHJpbmcgcmVzcG9uc2UpIHsKICAgIF9jb21wbGV0ZXIuY29tcGxldGUobmV3IFJlc3BvbnNlKFJlc3BvbnNlUGF5bG9hZEtpbmQuU3RyaW5nLCByZXNwb25zZSkpOwogIH0KCiAgdm9pZCBzZXRFcnJvclJlc3BvbnNlKGludCBjb2RlLCBTdHJpbmcgZGV0YWlscykgewogICAgc2V0UmVzcG9uc2UoZW5jb2RlUnBjRXJyb3IodGhpcywgY29kZSwgZGV0YWlsczogJyRtZXRob2Q6ICRkZXRhaWxzJykpOwogIH0KfQoKYm9vbCBzZW5kSXNvbGF0ZVNlcnZpY2VNZXNzYWdlKFNlbmRQb3J0IHNwLCBMaXN0IG0pCiAgICBuYXRpdmUgIlZNU2VydmljZV9TZW5kSXNvbGF0ZVNlcnZpY2VNZXNzYWdlIjsKCnZvaWQgc2VuZFJvb3RTZXJ2aWNlTWVzc2FnZShMaXN0IG0pIG5hdGl2ZSAiVk1TZXJ2aWNlX1NlbmRSb290U2VydmljZU1lc3NhZ2UiOwoKdm9pZCBzZW5kT2JqZWN0Um9vdFNlcnZpY2VNZXNzYWdlKExpc3QgbSkKICAgIG5hdGl2ZSAiVk1TZXJ2aWNlX1NlbmRPYmplY3RSb290U2VydmljZU1lc3NhZ2UiOwqBCABOTjwBGQE1ARBJMAEaNhEBKxoBLhABFwEgIB8BOCEcN0gIJz0IJzwIJjsILEAGMwQBOTYZJBwhISQGBAE3OxkpIBghJAYEATo1GSUcGCIEATo0GSUcGCAEAS4XEQYoEQYgBAEjFxkkFQEoJBUrKAQBQyQVKygtBAEQOwQBFRkEAStDFCAlISEjCg8hISMKICEKBh0eBhEEAUxKUEArGBMGMiwoBhUEATYuJBsjB0RIHjMjFRUTFjkbNj0GHgQBTU1KSTM1FhkeGxseHx0YFQ8WBgQBIC4kGyMHNDgxIycGASAzIxUVExYBMDktDScGAR4EATA2BAEmTQQBNEsEAgE0MgFPASo1ARxkYXJ0Ol92bXNlcnZpY2UvbWVzc2FnZS5kYXJ0OW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi92bXNlcnZpY2UvbWVzc2FnZV9yb3V0ZXIuZGFydInALy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5fdm1zZXJ2aWNlOwoKYWJzdHJhY3QgY2xhc3MgTWVzc2FnZVJvdXRlciB7CiAgRnV0dXJlPFJlc3BvbnNlPiByb3V0ZVJlcXVlc3QoVk1TZXJ2aWNlIHNlcnZpY2UsIE1lc3NhZ2UgbWVzc2FnZSk7CiAgdm9pZCByb3V0ZVJlc3BvbnNlKE1lc3NhZ2UgbWVzc2FnZSk7Cn0KCmVudW0gUmVzcG9uc2VQYXlsb2FkS2luZCB7CiAgLy8vIFJlc3BvbnNlIHBheWxvYWQgaXMgYSBEYXJ0IHN0cmluZy4KICBTdHJpbmcsCgogIC8vLyBSZXNwb25zZSBwYXlsb2FkIGlzIGEgYmluYXJ5IChVaW50OExpc3QpLgogIEJpbmFyeSwKCiAgLy8vIFJlc3BvbnNlIHBheWxvYWQgaXMgYSBzdHJpbmcgZW5jb2RlZCBhcyBVVEY4IGJ5dGVzIChVaW50OExpc3QpLgogIFV0ZjhTdHJpbmcsCn0KCmNsYXNzIFJlc3BvbnNlIHsKICBmaW5hbCBSZXNwb25zZVBheWxvYWRLaW5kIGtpbmQ7CiAgZmluYWwgcGF5bG9hZDsKCiAgLy8vIENvbnN0cnVjdCByZXNwb25zZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gW3BheWxvYWRdIGFuZCBba2luZF0uCiAgUmVzcG9uc2UodGhpcy5raW5kLCB0aGlzLnBheWxvYWQpIHsKICAgIGFzc2VydCgoKSB7CiAgICAgIHN3aXRjaCAoa2luZCkgewogICAgICAgIGNhc2UgUmVzcG9uc2VQYXlsb2FkS2luZC5TdHJpbmc6CiAgICAgICAgICByZXR1cm4gcGF5bG9hZCBpcyBTdHJpbmc7CiAgICAgICAgY2FzZSBSZXNwb25zZVBheWxvYWRLaW5kLkJpbmFyeToKICAgICAgICBjYXNlIFJlc3BvbnNlUGF5bG9hZEtpbmQuVXRmOFN0cmluZzoKICAgICAgICAgIHJldHVybiBwYXlsb2FkIGlzIFVpbnQ4TGlzdDsKICAgICAgfQogICAgfSgpKTsKICB9CgogIC8vLyBDb25zdHJ1Y3QgYSBzdHJpbmcgcmVzcG9uc2UgZnJvbSB0aGUgZ2l2ZW4gW3ZhbHVlXSBieSBlbmNvZGluZyBpdAogIC8vLyBhcyBKU09OLgogIFJlc3BvbnNlLmpzb24oT2JqZWN0IHZhbHVlKQogICAgICA6IHRoaXMoUmVzcG9uc2VQYXlsb2FkS2luZC5TdHJpbmcsIGpzb24uZW5jb2RlKHZhbHVlKSk7CgogIGZhY3RvcnkgUmVzcG9uc2UuaW50ZXJuYWxFcnJvcihTdHJpbmcgbWVzc2FnZSkgewogICAgcmV0dXJuIG5ldyBSZXNwb25zZS5qc29uKHsKICAgICAgJ3R5cGUnOiAnU2VydmljZUVycm9yJywKICAgICAgJ2lkJzogJycsCiAgICAgICdraW5kJzogJ0ludGVybmFsRXJyb3InLAogICAgICAnbWVzc2FnZSc6IG1lc3NhZ2UsCiAgICB9KTsKICB9CgogIC8vLyBDb25zdHJ1Y3QgcmVzcG9uc2UgZnJvbSB0aGUgcmVzcG9uc2UgW3ZhbHVlXSB3aGljaCBjYW4gYmUgZWl0aGVyOgogIC8vLyAgICAgU3RyaW5nOiBhIHN0cmluZwogIC8vLyAgICAgQmluYXJ5OiBhIFVpbnQ4TGlzdAogIC8vLyAgICAgVXRmOFN0cmluZzogYSBzaW5nbGUgZWxlbWVudCBsaXN0IGNvbnRhaW5pbmcgVWludDhMaXN0CiAgZmFjdG9yeSBSZXNwb25zZS5mcm9tKE9iamVjdCB2YWx1ZSkgewogICAgaWYgKHZhbHVlIGlzIFN0cmluZykgewogICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKFJlc3BvbnNlUGF5bG9hZEtpbmQuU3RyaW5nLCB2YWx1ZSk7CiAgICB9IGVsc2UgaWYgKHZhbHVlIGlzIFVpbnQ4TGlzdCkgewogICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKFJlc3BvbnNlUGF5bG9hZEtpbmQuQmluYXJ5LCB2YWx1ZSk7CiAgICB9IGVsc2UgaWYgKHZhbHVlIGlzIExpc3QpIHsKICAgICAgYXNzZXJ0KHZhbHVlLmxlbmd0aCA9PSAxKTsKICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSgKICAgICAgICAgIFJlc3BvbnNlUGF5bG9hZEtpbmQuVXRmOFN0cmluZywgdmFsdWVbMF0gYXMgVWludDhMaXN0KTsKICAgIH0gZWxzZSBpZiAodmFsdWUgaXMgUmVzcG9uc2UpIHsKICAgICAgcmV0dXJuIHZhbHVlOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgJ1VucmVjb2duaXplZCByZXNwb25zZTogJHt2YWx1ZX0nOwogICAgfQogIH0KCiAgLy8vIERlY29kZSBKU09OIGNvbnRhaW5lZCBpbiB0aGlzIHJlc3BvbnNlLgogIGR5bmFtaWMgZGVjb2RlSnNvbigpIHsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIFJlc3BvbnNlUGF5bG9hZEtpbmQuU3RyaW5nOgogICAgICAgIHJldHVybiBqc29uLmRlY29kZShwYXlsb2FkKTsKICAgICAgY2FzZSBSZXNwb25zZVBheWxvYWRLaW5kLlV0ZjhTdHJpbmc6CiAgICAgICAgcmV0dXJuIGpzb24uZnVzZSh1dGY4KS5kZWNvZGUocGF5bG9hZCk7CiAgICAgIGNhc2UgUmVzcG9uc2VQYXlsb2FkS2luZC5CaW5hcnk6CiAgICAgICAgdGhyb3cgJ0JpbmFyeSByZXNwb25zZXMgY2FuIG5vdCBiZSBkZWNvZGVkJzsKICAgIH0KICB9Cn0KVwBOTjwBGQEfRScCARspCgEwCgFGDgIBESIRAUUmEBYpJCktJwgKBAFIDx4+ATMfHhAfGggEAUgbHkEoGz4lPiAhG0IkFA0vBgQBLhkUJyUrMCc1BgQCASNkYXJ0Ol92bXNlcnZpY2UvbWVzc2FnZV9yb3V0ZXIuZGFydDdvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvdm1zZXJ2aWNlL25hbWVkX2xvb2t1cC5kYXJ0hv0vLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0Ll92bXNlcnZpY2U7CgovLy8gU2V0IGxpa2UgY29udGFpbmVzIHdoaWNoIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIFN0cmluZyBpZHMgZm9yIGl0cyBpdGVtcwpjbGFzcyBOYW1lZExvb2t1cDxFPiBleHRlbmRzIE9iamVjdCB3aXRoIEl0ZXJhYmxlTWl4aW48RT4gewogIGZpbmFsIElkR2VuZXJhdG9yIF9nZW5lcmF0b3I7CiAgZmluYWwgTWFwPFN0cmluZywgRT4gX2VsZW1lbnRzID0gbmV3IE1hcDxTdHJpbmcsIEU+KCk7CiAgZmluYWwgTWFwPEUsIFN0cmluZz4gX2lkcyA9IG5ldyBNYXA8RSwgU3RyaW5nPigpOwoKICBOYW1lZExvb2t1cCh7U3RyaW5nIHByb2xvZ3VlID0gJyd9KQogICAgICA6IF9nZW5lcmF0b3IgPSBuZXcgSWRHZW5lcmF0b3IocHJvbG9ndWU6IHByb2xvZ3VlKTsKCiAgdm9pZCBhZGQoRSBlKSB7CiAgICBmaW5hbCBpZCA9IF9nZW5lcmF0b3IubmV3SWQoKTsKICAgIF9lbGVtZW50c1tpZF0gPSBlOwogICAgX2lkc1tlXSA9IGlkOwogIH0KCiAgdm9pZCByZW1vdmUoRSBlKSB7CiAgICBmaW5hbCBpZCA9IF9pZHMucmVtb3ZlKGUpOwogICAgX2VsZW1lbnRzLnJlbW92ZShpZCk7CiAgICBfZ2VuZXJhdG9yLnJlbGVhc2UoaWQpOwogIH0KCiAgRSBvcGVyYXRvciBbXShTdHJpbmcgaWQpID0+IF9lbGVtZW50c1tpZF07CiAgU3RyaW5nIGtleU9mKEUgZSkgPT4gX2lkc1tlXTsKCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yID0+IF9pZHMua2V5cy5pdGVyYXRvcjsKfQoKLy8vIEdlbmVyYXRvciBmb3IgdW5pcXVlIGlkcyB3aGljaCByZWN5Y2xlcyBleHBpcmVkIG9uZXMKY2xhc3MgSWRHZW5lcmF0b3IgewogIC8vLyBGaXhlZCBpbml0aWFsIHBhcnQgb2YgdGhlIGlkCiAgZmluYWwgU3RyaW5nIHByb2xvZ3VlOwogIC8vIElkcyBpbiB1c2UKICBmaW5hbCBTZXQ8U3RyaW5nPiBfdXNlZCA9IG5ldyBTZXQ8U3RyaW5nPigpOwoKICAvLy8gSWRzIHRoYXQgaGFzIGJlZW4gcmVsZWFzZWQgKHVzZSB0aGVzZSBiZWZvcmUgZ2VuZXJhdGUgbmV3IG9uZXMpCiAgZmluYWwgU2V0PFN0cmluZz4gX2ZyZWUgPSBuZXcgU2V0PFN0cmluZz4oKTsKCiAgLy8vIE5leHQgaWQgdG8gZ2VuZXJhdGUgaWYgbm8gb25lIGNhbiBiZSByZWN5Y2xlZCAoZmlyc3QgdXNlIF9mcmVlKTsKICBpbnQgX25leHQgPSAwOwoKICBJZEdlbmVyYXRvcih7dGhpcy5wcm9sb2d1ZSA9ICcnfSk7CgogIC8vLyBSZXR1cm5zIGEgbmV3IElkIChwb3NzaWJseSByZWN5Y2xlZCkKICBTdHJpbmcgbmV3SWQoKSB7CiAgICB2YXIgaWQ7CiAgICBpZiAoX2ZyZWUuaXNFbXB0eSkgewogICAgICBpZCA9IHByb2xvZ3VlICsgKF9uZXh0KyspLnRvU3RyaW5nKCk7CiAgICB9IGVsc2UgewogICAgICBpZCA9IF9mcmVlLmZpcnN0OwogICAgfQogICAgX2ZyZWUucmVtb3ZlKGlkKTsKICAgIF91c2VkLmFkZChpZCk7CiAgICByZXR1cm4gaWQ7CiAgfQoKICAvLy8gUmVsZWFzZXMgdGhlIGlkIGFuZCBtYXJrIGl0IGZvciByZWN5Y2xlCiAgdm9pZCByZWxlYXNlKFN0cmluZyBpZCkgewogICAgaWYgKF91c2VkLnJlbW92ZShpZCkpIHsKICAgICAgX2ZyZWUuYWRkKGlkKTsKICAgIH0KICB9Cn0KRgBOTjwBGQFOPCA5NAEmOgESIxcSBAEVHxocBAEtIAEyAgE5FCMZEC8BRi8BRxEBJQErEwwZLA0YBhYTDwQBLhwcFQYEAgEhZGFydDpfdm1zZXJ2aWNlL25hbWVkX2xvb2t1cC5kYXJ0LG9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9iaW4vYnVpbHRpbi5kYXJ0qSQvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBidWlsdGluOwoKLy8gTk9URTogRG8gbm90IGltcG9ydCAnZGFydDppbycgaW4gYnVpbHRpbi4KaW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nIGhpZGUgTGlua2VkTGlzdCwgTGlua2VkTGlzdEVudHJ5OwppbXBvcnQgJ2RhcnQ6X2ludGVybmFsJyBoaWRlIFN5bWJvbDsKaW1wb3J0ICdkYXJ0Omlzb2xhdGUnOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CgovLyBFbWJlZGRlciBzZXRzIHRoaXMgdG8gdHJ1ZSBpZiB0aGUgLS10cmFjZS1sb2FkaW5nIGZsYWcgd2FzIHBhc3NlZCBvbiB0aGUKLy8gY29tbWFuZCBsaW5lLgpib29sIF90cmFjZUxvYWRpbmcgPSBmYWxzZTsKCi8vIEJlZm9yZSBoYW5kbGluZyBhbiBlbWJlZGRlciBlbnRyeXBvaW50IHdlIGZpbmFsaXplIHRoZSBzZXR1cCBvZiB0aGUKLy8gZGFydDpfYnVpbHRpbiBsaWJyYXJ5Lgpib29sIF9zZXR1cENvbXBsZXRlZCA9IGZhbHNlOwoKLy8gJ3ByaW50JyBpbXBsZW1lbnRhdGlvbi4KLy8gVGhlIHN0YW5kYWxvbmUgZW1iZWRkZXIgcmVnaXN0ZXJzIHRoZSBjbG9zdXJpemVkIF9wcmludCBmdW5jdGlvbiB3aXRoIHRoZQovLyBkYXJ0OmNvcmUgbGlicmFyeS4Kdm9pZCBfcHJpbnRTdHJpbmcoU3RyaW5nIHMpIG5hdGl2ZSAiQnVpbHRpbl9QcmludFN0cmluZyI7Cgp2b2lkIF9wcmludChhcmcpIHsKICBfcHJpbnRTdHJpbmcoYXJnLnRvU3RyaW5nKCkpOwp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCl9nZXRQcmludENsb3N1cmUoKSA9PiBfcHJpbnQ7CgovLyBBc3luY2hyb25vdXMgbG9hZGluZyBvZiByZXNvdXJjZXMuCi8vIFRoZSBlbWJlZGRlciBmb3J3YXJkcyBsb2FkaW5nIHJlcXVlc3RzIHRvIHRoZSBzZXJ2aWNlIGlzb2xhdGUuCgovLyBBIHBvcnQgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgc2VydmljZSBpc29sYXRlIGZvciBJL08uCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKU2VuZFBvcnQgX2xvYWRQb3J0OwoKLy8gVGhlIGlzb2xhdGVJZCB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHNlcnZpY2UgaXNvbGF0ZSBmb3IgSS9PLgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmludCBfaXNvbGF0ZUlkOwoKLy8gUmVxdWVzdHMgbWFkZSB0byB0aGUgc2VydmljZSBpc29sYXRlIG92ZXIgdGhlIGxvYWQgcG9ydC4KCi8vIEV4dHJhIHJlcXVlc3RzLiBLZWVwIHRoZXNlIGluIHN5bmMgYmV0d2VlbiBsb2FkZXIuZGFydCBhbmQgYnVpbHRpbi5kYXJ0Lgpjb25zdCBfRGFydF9rSW5pdExvYWRlciA9IDQ7IC8vIEluaXRpYWxpemUgdGhlIGxvYWRlci4KY29uc3QgX0RhcnRfa1Jlc291cmNlTG9hZCA9IDU7IC8vIFJlc291cmNlIGNsYXNzIHN1cHBvcnQuCmNvbnN0IF9EYXJ0X2tHZXRQYWNrYWdlUm9vdFVyaSA9IDY7IC8vIFVyaSBvZiB0aGUgcGFja2FnZXMvIGRpcmVjdG9yeS4KY29uc3QgX0RhcnRfa0dldFBhY2thZ2VDb25maWdVcmkgPSA3OyAvLyBVcmkgb2YgdGhlIC5wYWNrYWdlcyBmaWxlLgpjb25zdCBfRGFydF9rUmVzb2x2ZVBhY2thZ2VVcmkgPSA4OyAvLyBSZXNvbHZlIGEgcGFja2FnZTogdXJpLgoKLy8gTWFrZSBhIHJlcXVlc3QgdG8gdGhlIGxvYWRlci4gRnV0dXJlIHdpbGwgY29tcGxldGUgd2l0aCByZXN1bHQgd2hpY2ggaXMKLy8gZWl0aGVyIGEgVXJpIG9yIGEgTGlzdDxpbnQ+LgpGdXR1cmU8VD4gX21ha2VMb2FkZXJSZXF1ZXN0PFQ+KGludCB0YWcsIFN0cmluZyB1cmkpIHsKICBhc3NlcnQoX2lzb2xhdGVJZCAhPSBudWxsKTsKICBpZiAoX2xvYWRQb3J0ID09IG51bGwpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJTZXJ2aWNlIGlzb2xhdGUgaXMgbm90IGF2YWlsYWJsZS4iKTsKICB9CiAgQ29tcGxldGVyIGNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXI8VD4oKTsKICBSYXdSZWNlaXZlUG9ydCBwb3J0ID0gbmV3IFJhd1JlY2VpdmVQb3J0KCk7CiAgcG9ydC5oYW5kbGVyID0gKG1zZykgewogICAgLy8gQ2xvc2UgdGhlIHBvcnQuCiAgICBwb3J0LmNsb3NlKCk7CiAgICBjb21wbGV0ZXIuY29tcGxldGUobXNnKTsKICB9OwogIF9sb2FkUG9ydC5zZW5kKFtfdHJhY2VMb2FkaW5nLCBfaXNvbGF0ZUlkLCB0YWcsIHBvcnQuc2VuZFBvcnQsIHVyaV0pOwogIHJldHVybiBjb21wbGV0ZXIuZnV0dXJlOwp9CgovLyBUaGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSB3aGVuIHRoZSBlbWJlZGRlciB3YXMgbGF1bmNoZWQuClVyaSBfd29ya2luZ0RpcmVjdG9yeTsKLy8gVGhlIFVSSSB0aGF0IHRoZSByb290IHNjcmlwdCB3YXMgbG9hZGVkIGZyb20uIFJlbWVtYmVyZWQgc28gdGhhdAovLyBwYWNrYWdlIGltcG9ydHMgY2FuIGJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIGl0LiBUaGUgcm9vdCBzY3JpcHQgaXMgdGhlIGJhc2lzCi8vIGZvciB0aGUgcm9vdCBsaWJyYXJ5IGluIHRoZSBWTS4KVXJpIF9yb290U2NyaXB0OwovLyBUaGUgcGFja2FnZSByb290IHNldCBvbiB0aGUgY29tbWFuZCBsaW5lLgpVcmkgX3BhY2thZ2VSb290OwoKLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgV2luZG93cyBwYXRocyBzbyB0aGF0IHRoZXkgYXJlIGNvbXBhdGlibGUgd2l0aCBVUkkKLy8gaGFuZGxpbmcuCi8vIEVtYmVkZGVyIHNldHMgdGhpcyB0byB0cnVlIGlmIHdlIGFyZSBydW5uaW5nIG9uIFdpbmRvd3MuCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKYm9vbCBfaXNXaW5kb3dzID0gZmFsc2U7CgovLyBMb2dnaW5nIGZyb20gYnVpbHRpbi5kYXJ0IGlzIHByZWZpeGVkIHdpdGggYSAnKicuClN0cmluZyBfbG9nSWQgPSAoSXNvbGF0ZS5jdXJyZW50Lmhhc2hDb2RlICUgMHgxMDAwMDApLnRvUmFkaXhTdHJpbmcoMTYpOwpfbG9nKG1zZykgewogIF9wcmludCgiKiAkX2xvZ0lkICRtc2ciKTsKfQoKX3Nhbml0aXplV2luZG93c1BhdGgocGF0aCkgewogIC8vIEZvciBXaW5kb3dzIHdlIG5lZWQgdG8gbWFzc2FnZSB0aGUgcGF0aHMgYSBiaXQgYWNjb3JkaW5nIHRvCiAgLy8gaHR0cDovL2Jsb2dzLm1zZG4uY29tL2IvaWUvYXJjaGl2ZS8yMDA2LzEyLzA2L2ZpbGUtdXJpcy1pbi13aW5kb3dzLmFzcHgKICAvLwogIC8vIENvbnZlcnQKICAvLyBDOlxvbmVcdHdvXHRocmVlCiAgLy8gdG8KICAvLyAvQzovb25lL3R3by90aHJlZQoKICBpZiAoX2lzV2luZG93cyA9PSBmYWxzZSkgewogICAgLy8gRG8gbm90aGluZyB3aGVuIG5vdCBydW5uaW5nIFdpbmRvd3MuCiAgICByZXR1cm4gcGF0aDsKICB9CgogIHZhciBmaXhlZFBhdGggPSAiJHtwYXRoLnJlcGxhY2VBbGwoJ1xcJywgJy8nKX0iOwoKICBpZiAoKHBhdGgubGVuZ3RoID4gMikgJiYgKHBhdGhbMV0gPT0gJzonKSkgewogICAgLy8gUGF0aCBiZWdpbnMgd2l0aCBhIGRyaXZlIGxldHRlci4KICAgIHJldHVybiAnLyRmaXhlZFBhdGgnOwogIH0KCiAgcmV0dXJuIGZpeGVkUGF0aDsKfQoKX3RyaW1XaW5kb3dzUGF0aChwYXRoKSB7CiAgLy8gQ29udmVydCAvWDovIHRvIFg6Ly4KICBpZiAoX2lzV2luZG93cyA9PSBmYWxzZSkgewogICAgLy8gRG8gbm90aGluZyB3aGVuIG5vdCBydW5uaW5nIFdpbmRvd3MuCiAgICByZXR1cm4gcGF0aDsKICB9CiAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoJy8nKSB8fCAocGF0aC5sZW5ndGggPCAzKSkgewogICAgcmV0dXJuIHBhdGg7CiAgfQogIC8vIE1hdGNoICcvPzonLgogIGlmICgocGF0aFswXSA9PSAnLycpICYmIChwYXRoWzJdID09ICc6JykpIHsKICAgIC8vIFJlbW92ZSBsZWFkaW5nICcvJy4KICAgIHJldHVybiBwYXRoLnN1YnN0cmluZygxKTsKICB9CiAgcmV0dXJuIHBhdGg7Cn0KCi8vIEVuc3VyZSB3ZSBoYXZlIGEgdHJhaWxpbmcgc2xhc2ggY2hhcmFjdGVyLgpfZW5mb3JjZVRyYWlsaW5nU2xhc2godXJpKSB7CiAgaWYgKCF1cmkuZW5kc1dpdGgoJy8nKSkgewogICAgcmV0dXJuICckdXJpLyc7CiAgfQogIHJldHVybiB1cmk7Cn0KCi8vIEVtYmVkZGVyIEVudHJ5cG9pbnQ6Ci8vIFRoZSBlbWJlZGRlciBjYWxscyB0aGlzIG1ldGhvZCB3aXRoIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCnZvaWQgX3NldFdvcmtpbmdEaXJlY3RvcnkoU3RyaW5nIGN3ZCkgewogIGlmICghX3NldHVwQ29tcGxldGVkKSB7CiAgICBfc2V0dXBIb29rcygpOwogIH0KICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgX2xvZygnU2V0dGluZyB3b3JraW5nIGRpcmVjdG9yeTogJGN3ZCcpOwogIH0KICBfd29ya2luZ0RpcmVjdG9yeSA9IG5ldyBVcmkuZGlyZWN0b3J5KGN3ZCk7CiAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgIF9sb2coJ1dvcmtpbmcgZGlyZWN0b3J5IFVSSTogJF93b3JraW5nRGlyZWN0b3J5Jyk7CiAgfQp9CgovLyBFbWJlZGRlciBFbnRyeXBvaW50OgovLyBUaGUgZW1iZWRkZXIgY2FsbHMgdGhpcyBtZXRob2Qgd2l0aCBhIGN1c3RvbSBwYWNrYWdlIHJvb3QuCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKU3RyaW5nIF9zZXRQYWNrYWdlUm9vdChTdHJpbmcgcGFja2FnZVJvb3QpIHsKICBpZiAoIV9zZXR1cENvbXBsZXRlZCkgewogICAgX3NldHVwSG9va3MoKTsKICB9CiAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgIF9sb2coJ1NldHRpbmcgcGFja2FnZSByb290OiAkcGFja2FnZVJvb3QnKTsKICB9CiAgaWYgKHBhY2thZ2VSb290LnN0YXJ0c1dpdGgoJ2ZpbGU6JykgfHwKICAgICAgcGFja2FnZVJvb3Quc3RhcnRzV2l0aCgnaHR0cDonKSB8fAogICAgICBwYWNrYWdlUm9vdC5zdGFydHNXaXRoKCdodHRwczonKSkgewogICAgcGFja2FnZVJvb3QgPSBfZW5mb3JjZVRyYWlsaW5nU2xhc2gocGFja2FnZVJvb3QpOwogICAgX3BhY2thZ2VSb290ID0gX3dvcmtpbmdEaXJlY3RvcnkucmVzb2x2ZShwYWNrYWdlUm9vdCk7CiAgfSBlbHNlIHsKICAgIHBhY2thZ2VSb290ID0gX3Nhbml0aXplV2luZG93c1BhdGgocGFja2FnZVJvb3QpOwogICAgcGFja2FnZVJvb3QgPSBfdHJpbVdpbmRvd3NQYXRoKHBhY2thZ2VSb290KTsKICAgIF9wYWNrYWdlUm9vdCA9IF93b3JraW5nRGlyZWN0b3J5LnJlc29sdmVVcmkobmV3IFVyaS5kaXJlY3RvcnkocGFja2FnZVJvb3QpKTsKICB9CiAgLy8gTm93IHRoYXQgd2UgaGF2ZSBkZXRlcm1pbmVkIHRoZSBwYWNrYWdlUm9vdCB2YWx1ZSBiZWluZyB1c2VkLCBzZXQgaXQKICAvLyB1cCBmb3IgdXNlIGluIFBsYXRmb3JtLnBhY2thZ2VSb290LiBUaGlzIGlzIG9ubHkgc2V0IHdoZW4gdGhlIGVtYmVkZGVyCiAgLy8gc2V0cyB1cCB0aGUgcGFja2FnZSByb290LiBBdXRvbWF0aWNhbGx5IGRpc2NvdmVyZWQgcGFja2FnZSByb290IHdpbGwKICAvLyBub3QgdXBkYXRlIHRoZSBWTUxpYnJhcnlIb29rcyB2YWx1ZS4KICB2YXIgcGFja2FnZVJvb3RTdHIgPSBfcGFja2FnZVJvb3QudG9TdHJpbmcoKTsKICBWTUxpYnJhcnlIb29rcy5wYWNrYWdlUm9vdFN0cmluZyA9IHBhY2thZ2VSb290U3RyOwogIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICBfbG9nKCdQYWNrYWdlIHJvb3QgVVJJOiAkX3BhY2thZ2VSb290Jyk7CiAgfQogIHJldHVybiBwYWNrYWdlUm9vdFN0cjsKfQoKLy8gRW1iZWRkZXIgRW50cnlwb2ludDoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpTdHJpbmcgX3NldFBhY2thZ2VzTWFwKFN0cmluZyBwYWNrYWdlc1BhcmFtKSB7CiAgaWYgKCFfc2V0dXBDb21wbGV0ZWQpIHsKICAgIF9zZXR1cEhvb2tzKCk7CiAgfQogIC8vIEZpcnN0IGNvbnZlcnQgdGhlIHBhY2thZ2VzIHBhcmFtZXRlciBmcm9tIHRoZSBjb21tYW5kIGxpbmUgdG8gYSBVUkkgd2hpY2gKICAvLyBjYW4gYmUgaGFuZGxlZCBieSB0aGUgbG9hZGVyIGNvZGUuCiAgLy8gVE9ETyhpcG9zdmEpOiBDb25zaWRlciByZWZhY3RvcmluZyB0aGUgY29tbW9uIGNvZGUgYmVsb3cgd2hpY2ggaXMgYWxtb3N0CiAgLy8gc2hhcmVkIHdpdGggcmVzb2x1dGlvbiBvZiB0aGUgcm9vdCBzY3JpcHQuCiAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgIF9sb2coIlJlc29sdmluZyBwYWNrYWdlcyBtYXA6ICRwYWNrYWdlc1BhcmFtIik7CiAgfQogIGlmIChfd29ya2luZ0RpcmVjdG9yeSA9PSBudWxsKSB7CiAgICB0aHJvdyAnTm8gY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBzZXQuJzsKICB9CiAgdmFyIHBhY2thZ2VzTmFtZSA9IF9zYW5pdGl6ZVdpbmRvd3NQYXRoKHBhY2thZ2VzUGFyYW0pOwogIHZhciBwYWNrYWdlc1VyaSA9IFVyaS5wYXJzZShwYWNrYWdlc05hbWUpOwogIGlmIChwYWNrYWdlc1VyaS5zY2hlbWUgPT0gJycpIHsKICAgIC8vIFNjcmlwdCBkb2VzIG5vdCBoYXZlIGEgc2NoZW1lLCBhc3N1bWUgdGhhdCBpdCBpcyBhIHBhdGgsCiAgICAvLyByZXNvbHZlIGl0IGFnYWluc3QgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LgogICAgcGFja2FnZXNVcmkgPSBfd29ya2luZ0RpcmVjdG9yeS5yZXNvbHZlVXJpKHBhY2thZ2VzVXJpKTsKICB9CiAgdmFyIHBhY2thZ2VzVXJpU3RyID0gcGFja2FnZXNVcmkudG9TdHJpbmcoKTsKICBWTUxpYnJhcnlIb29rcy5wYWNrYWdlQ29uZmlnU3RyaW5nID0gcGFja2FnZXNVcmlTdHI7CiAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgIF9sb2coJ1Jlc29sdmVkIHBhY2thZ2VzIG1hcCB0bzogJHBhY2thZ2VzVXJpJyk7CiAgfQogIHJldHVybiBwYWNrYWdlc1VyaVN0cjsKfQoKLy8gUmVzb2x2ZXMgdGhlIHNjcmlwdCB1cmkgaW4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaWZmIHRoZSBnaXZlbiB1cmkKLy8gZGlkIG5vdCBzcGVjaWZ5IGEgc2NoZW1lIChlLmcuIGEgcGF0aCB0byBhIHNjcmlwdCBmaWxlIG9uIHRoZSBjb21tYW5kIGxpbmUpLgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpClN0cmluZyBfcmVzb2x2ZVNjcmlwdFVyaShTdHJpbmcgc2NyaXB0TmFtZSkgewogIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICBfbG9nKCJSZXNvbHZpbmcgc2NyaXB0OiAkc2NyaXB0TmFtZSIpOwogIH0KICBpZiAoX3dvcmtpbmdEaXJlY3RvcnkgPT0gbnVsbCkgewogICAgdGhyb3cgJ05vIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgc2V0Lic7CiAgfQogIHNjcmlwdE5hbWUgPSBfc2FuaXRpemVXaW5kb3dzUGF0aChzY3JpcHROYW1lKTsKCiAgdmFyIHNjcmlwdFVyaSA9IFVyaS5wYXJzZShzY3JpcHROYW1lKTsKICBpZiAoc2NyaXB0VXJpLnNjaGVtZSA9PSAnJykgewogICAgLy8gU2NyaXB0IGRvZXMgbm90IGhhdmUgYSBzY2hlbWUsIGFzc3VtZSB0aGF0IGl0IGlzIGEgcGF0aCwKICAgIC8vIHJlc29sdmUgaXQgYWdhaW5zdCB0aGUgd29ya2luZyBkaXJlY3RvcnkuCiAgICBzY3JpcHRVcmkgPSBfd29ya2luZ0RpcmVjdG9yeS5yZXNvbHZlVXJpKHNjcmlwdFVyaSk7CiAgfQoKICAvLyBSZW1lbWJlciB0aGUgcm9vdCBzY3JpcHQgVVJJIHNvIHRoYXQgd2UgY2FuIHJlc29sdmUgcGFja2FnZXMgYmFzZWQgb24KICAvLyB0aGlzIGxvY2F0aW9uLgogIF9yb290U2NyaXB0ID0gc2NyaXB0VXJpOwoKICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgX2xvZygnUmVzb2x2ZWQgZW50cnkgcG9pbnQgdG86ICRfcm9vdFNjcmlwdCcpOwogIH0KICByZXR1cm4gc2NyaXB0VXJpLnRvU3RyaW5nKCk7Cn0KCi8vIE9ubHkgdXNlZCBieSB2bS9jYyB1bml0IHRlc3RzLgpVcmkgX3Jlc29sdmVQYWNrYWdlVXJpKFVyaSB1cmkpIHsKICBhc3NlcnQoX3BhY2thZ2VSb290ICE9IG51bGwpOwogIHJldHVybiBfcGFja2FnZVJvb3QucmVzb2x2ZSh1cmkucGF0aCk7Cn0KCi8vIFJldHVybnMgZWl0aGVyIGEgZmlsZSBwYXRoIG9yIGEgVVJJIHN0YXJ0aW5nIHdpdGggaHR0cFtzXTosIGFzIGEgU3RyaW5nLgpTdHJpbmcgX2ZpbGVQYXRoRnJvbVVyaShTdHJpbmcgdXNlclVyaSkgewogIHZhciB1cmkgPSBVcmkucGFyc2UodXNlclVyaSk7CiAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgIF9sb2coJ0dldHRpbmcgZmlsZSBwYXRoIGZyb206ICR1cmknKTsKICB9CgogIHZhciBwYXRoOwogIHN3aXRjaCAodXJpLnNjaGVtZSkgewogICAgY2FzZSAnJzoKICAgIGNhc2UgJ2ZpbGUnOgogICAgICByZXR1cm4gdXJpLnRvRmlsZVBhdGgoKTsKICAgIGNhc2UgJ3BhY2thZ2UnOgogICAgICByZXR1cm4gX2ZpbGVQYXRoRnJvbVVyaShfcmVzb2x2ZVBhY2thZ2VVcmkodXJpKS50b1N0cmluZygpKTsKICAgIGNhc2UgJ2RhdGEnOgogICAgY2FzZSAnaHR0cCc6CiAgICBjYXNlICdodHRwcyc6CiAgICAgIHJldHVybiB1cmkudG9TdHJpbmcoKTsKICAgIGRlZmF1bHQ6CiAgICAgIC8vIE9ubHkgaGFuZGxpbmcgZmlsZSwgaHR0cCwgYW5kIHBhY2thZ2UgVVJJcwogICAgICAvLyBpbiBzdGFuZGFsb25lIGJpbmFyeS4KICAgICAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgICAgICBfbG9nKCdVbmtub3duIHNjaGVtZSAoJHt1cmkuc2NoZW1lfSkgaW4gJHVyaS4nKTsKICAgICAgfQogICAgICB0aHJvdyAnTm90IGEga25vd24gc2NoZW1lOiAkdXJpJzsKICB9Cn0KCi8vIFJlZ2lzdGVyIGNhbGxiYWNrcyBhbmQgaG9va3Mgd2l0aCB0aGUgcmVzdCBvZiB0aGUgY29yZSBsaWJyYXJpZXMuCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKX3NldHVwSG9va3MoKSB7CiAgX3NldHVwQ29tcGxldGVkID0gdHJ1ZTsKICBWTUxpYnJhcnlIb29rcy5yZXNvdXJjZVJlYWRBc0J5dGVzID0gX3Jlc291cmNlUmVhZEFzQnl0ZXM7CgogIFZNTGlicmFyeUhvb2tzLnBhY2thZ2VSb290VXJpRnV0dXJlID0gX2dldFBhY2thZ2VSb290RnV0dXJlOwogIFZNTGlicmFyeUhvb2tzLnBhY2thZ2VDb25maWdVcmlGdXR1cmUgPSBfZ2V0UGFja2FnZUNvbmZpZ0Z1dHVyZTsKICBWTUxpYnJhcnlIb29rcy5yZXNvbHZlUGFja2FnZVVyaUZ1dHVyZSA9IF9yZXNvbHZlUGFja2FnZVVyaUZ1dHVyZTsKfQoKLy8gSGFuZGxpbmcgb2YgUmVzb3VyY2UgY2xhc3MgYnkgZGlzcGF0Y2hpbmcgdG8gdGhlIGxvYWQgcG9ydC4KRnV0dXJlPExpc3Q8aW50Pj4gX3Jlc291cmNlUmVhZEFzQnl0ZXMoVXJpIHVyaSkgYXN5bmMgewogIExpc3QgcmVzcG9uc2UgPQogICAgICBhd2FpdCBfbWFrZUxvYWRlclJlcXVlc3Q8TGlzdDxpbnQ+PihfRGFydF9rUmVzb3VyY2VMb2FkLCB1cmkudG9TdHJpbmcoKSk7CiAgaWYgKHJlc3BvbnNlWzRdIGlzIFN0cmluZykgewogICAgLy8gVGhyb3cgdGhlIGVycm9yLgogICAgdGhyb3cgcmVzcG9uc2VbNF07CiAgfSBlbHNlIHsKICAgIHJldHVybiByZXNwb25zZVs0XTsKICB9Cn0KCi8vIFRPRE8obWZhaXJodXJzdCk6IHJlbW92ZSB0aGlzCkZ1dHVyZTxVcmk+IF9nZXRQYWNrYWdlUm9vdEZ1dHVyZSgpIHsKICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgX2xvZygiUmVxdWVzdCBmb3IgcGFja2FnZSByb290IGZyb20gdXNlciBjb2RlLiIpOwogIH0KICAvLyBSZXR1cm4gbnVsbCwgYXMgdGhlIGBwYWNrYWdlcy9gIGRpcmVjdG9yeSBpcyBub3Qgc3VwcG9ydGVkIGluIGRhcnQgMi4KICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZShudWxsKTsKfQoKRnV0dXJlPFVyaT4gX2dldFBhY2thZ2VDb25maWdGdXR1cmUoKSB7CiAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgIF9sb2coIlJlcXVlc3QgZm9yIHBhY2thZ2UgY29uZmlnIGZyb20gdXNlciBjb2RlLiIpOwogIH0KICBhc3NlcnQoX2xvYWRQb3J0ICE9IG51bGwpOwogIHJldHVybiBfbWFrZUxvYWRlclJlcXVlc3Q8VXJpPihfRGFydF9rR2V0UGFja2FnZUNvbmZpZ1VyaSwgbnVsbCk7Cn0KCkZ1dHVyZTxVcmk+IF9yZXNvbHZlUGFja2FnZVVyaUZ1dHVyZShVcmkgcGFja2FnZVVyaSkgYXN5bmMgewogIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICBfbG9nKCJSZXF1ZXN0IGZvciBwYWNrYWdlIFVyaSByZXNvbHV0aW9uIGZyb20gdXNlciBjb2RlOiAkcGFja2FnZVVyaSIpOwogIH0KICBpZiAocGFja2FnZVVyaS5zY2hlbWUgIT0gInBhY2thZ2UiKSB7CiAgICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgICBfbG9nKCJOb24tcGFja2FnZSBVcmksIHJldHVybmluZyB1bm1vZGlmaWVkOiAkcGFja2FnZVVyaSIpOwogICAgfQogICAgLy8gUmV0dXJuIHRoZSBpbmNvbWluZyBwYXJhbWV0ZXIgaWYgbm90IHBhc3NlZCBhIHBhY2thZ2U6IFVSSS4KICAgIHJldHVybiBwYWNrYWdlVXJpOwogIH0KICB2YXIgcmVzdWx0ID0gYXdhaXQgX21ha2VMb2FkZXJSZXF1ZXN0PFVyaT4oCiAgICAgIF9EYXJ0X2tSZXNvbHZlUGFja2FnZVVyaSwgcGFja2FnZVVyaS50b1N0cmluZygpKTsKICBpZiAocmVzdWx0IGlzISBVcmkpIHsKICAgIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICAgIF9sb2coIkV4Y2VwdGlvbiB3aGVuIHJlc29sdmluZyBwYWNrYWdlIFVSSTogJHBhY2thZ2VVcmkiKTsKICAgIH0KICAgIHJlc3VsdCA9IG51bGw7CiAgfQogIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICBfbG9nKCJSZXNvbHZlZCAnJHBhY2thZ2VVcmknIHRvICckcmVzdWx0JyIpOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CoFdAE5OPAERAS0VOyUXGgFMERwBRxoeARtNFjoBEyACARoeASZCAT4aFAFHGhABPAFMNzpHRD8BSyA3HhtFBCwuGRcSHQVIGwIBQRdEUCMRLRIBSw08GhkBNUkMHAIBHUFNBQ0WCBcBHSwRBAEzAS8oGgQBFAIBGRodLBEENBEEEi4bHgQPAgEuHRwUBA4CARhGGigaEwQXLQQuFzcEAgEYPhotGhMEFzAEKSkqNjsLNTFRBEpMSiowNRctBBkCARgaLxoTBE8oTjAXNAQjLwQ6LSJAMT0ELzcXNAQZAgFOUBouFysEIy8EMQEpIEAxOQQBSxQbARczBB8CASIiICkCAUwqIBcqBAEMGA0RHxRDERESHQ00Hxs5CCgEAgFFGhAaPQE/Q0UCAT84ElAfGBcLGAQCASEmFzYESyECASgXOAQdRAIBPRdMBCgZQgZDFwQuOBgZQQYTBBcxBBECAQ1kYXJ0Ol9idWlsdGluPG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9odG1sL2RhcnRpdW0vbmF0aXZld3JhcHBlcnMuZGFydIF9Ly8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgbmF0aXZld3JhcHBlcnM7CgpjbGFzcyBOYXRpdmVGaWVsZFdyYXBwZXJDbGFzczEge30KCmNsYXNzIE5hdGl2ZUZpZWxkV3JhcHBlckNsYXNzMiB7fQoKY2xhc3MgTmF0aXZlRmllbGRXcmFwcGVyQ2xhc3MzIHt9CgpjbGFzcyBOYXRpdmVGaWVsZFdyYXBwZXJDbGFzczQge30KDwBOTjwBGAEiASIBIgEiARNkYXJ0Om5hdGl2ZXdyYXBwZXJzJm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9pby5kYXJ0nxovLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLyoqCiAqIEZpbGUsIHNvY2tldCwgSFRUUCwgYW5kIG90aGVyIEkvTyBzdXBwb3J0IGZvciBub24td2ViIGFwcGxpY2F0aW9ucy4KICoKICogKipJbXBvcnRhbnQ6KiogQnJvd3Nlci1iYXNlZCBhcHBsaWNhdGlvbnMgY2FuJ3QgdXNlIHRoaXMgbGlicmFyeS4KICogT25seSBzZXJ2ZXJzLCBjb21tYW5kLWxpbmUgc2NyaXB0cywgYW5kIEZsdXR0ZXIgbW9iaWxlIGFwcHMgY2FuIGltcG9ydAogKiBhbmQgdXNlIGRhcnQ6aW8uCiAqCiAqIFRoaXMgbGlicmFyeSBhbGxvd3MgeW91IHRvIHdvcmsgd2l0aCBmaWxlcywgZGlyZWN0b3JpZXMsCiAqIHNvY2tldHMsIHByb2Nlc3NlcywgSFRUUCBzZXJ2ZXJzIGFuZCBjbGllbnRzLCBhbmQgbW9yZS4KICogTWFueSBvcGVyYXRpb25zIHJlbGF0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCBhcmUgYXN5bmNocm9ub3VzCiAqIGFuZCBhcmUgaGFuZGxlZCB1c2luZyBbRnV0dXJlXXMgb3IgW1N0cmVhbV1zLCBib3RoIG9mIHdoaWNoCiAqIGFyZSBkZWZpbmVkIGluIHRoZSBbZGFydDphc3luYwogKiBsaWJyYXJ5XSguLi9kYXJ0LWFzeW5jL2RhcnQtYXN5bmMtbGlicmFyeS5odG1sKS4KICoKICogVG8gdXNlIHRoZSBkYXJ0OmlvIGxpYnJhcnkgaW4geW91ciBjb2RlOgogKgogKiAgICAgaW1wb3J0ICdkYXJ0OmlvJzsKICoKICogRm9yIGFuIGludHJvZHVjdGlvbiB0byBJL08gaW4gRGFydCwgc2VlIHRoZSBbZGFydDppbyBsaWJyYXJ5CiAqIHRvdXJdKGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy9kYXJ0LXZtL2lvLWxpYnJhcnktdG91cikuCiAqCiAqICMjIEZpbGUsIERpcmVjdG9yeSwgYW5kIExpbmsKICoKICogQW4gaW5zdGFuY2Ugb2YgW0ZpbGVdLCBbRGlyZWN0b3J5XSwgb3IgW0xpbmtdIHJlcHJlc2VudHMgYSBmaWxlLAogKiBkaXJlY3RvcnksIG9yIGxpbmssIHJlc3BlY3RpdmVseSwgaW4gdGhlIG5hdGl2ZSBmaWxlIHN5c3RlbS4KICoKICogWW91IGNhbiBtYW5pcHVsYXRlIHRoZSBmaWxlIHN5c3RlbSB0aHJvdWdoIG9iamVjdHMgb2YgdGhlc2UgdHlwZXMuCiAqIEZvciBleGFtcGxlLCB5b3UgY2FuIHJlbmFtZSBhIGZpbGUgb3IgZGlyZWN0b3J5OgogKgogKiAgICAgRmlsZSBteUZpbGUgPSBuZXcgRmlsZSgnbXlGaWxlLnR4dCcpOwogKiAgICAgbXlGaWxlLnJlbmFtZSgneW91ckZpbGUudHh0JykudGhlbigoXykgPT4gcHJpbnQoJ2ZpbGUgcmVuYW1lZCcpKTsKICoKICogTWFueSBtZXRob2RzIHByb3ZpZGVkIGJ5IHRoZSBGaWxlLCBEaXJlY3RvcnksIGFuZCBMaW5rIGNsYXNzZXMKICogcnVuIGFzeW5jaHJvbm91c2x5IGFuZCByZXR1cm4gYSBGdXR1cmUuCiAqCiAqICMjIEZpbGVTeXN0ZW1FbnRpdHkKICoKICogRmlsZSwgRGlyZWN0b3J5LCBhbmQgTGluayBhbGwgZXh0ZW5kIFtGaWxlU3lzdGVtRW50aXR5XS4KICogSW4gYWRkaXRpb24gdG8gYmVpbmcgdGhlIHN1cGVyY2xhc3MgZm9yIHRoZXNlIGNsYXNzZXMsCiAqIEZpbGVTeXN0ZW1FbnRpdHkgaGFzIGEgbnVtYmVyIG9mIHN0YXRpYyBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggcGF0aHMuCiAqCiAqIFRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHBhdGgsCiAqIHlvdSBjYW4gdXNlIHRoZSBGaWxlU3lzdGVtRW50aXR5IHN0YXRpYyBtZXRob2RzCiAqIHN1Y2ggYXMgJ2lzRGlyZWN0b3J5JywgJ2lzRmlsZScsIGFuZCAnZXhpc3RzJy4KICogQmVjYXVzZSBmaWxlIHN5c3RlbSBhY2Nlc3MgaW52b2x2ZXMgSS9PLCB0aGVzZSBtZXRob2RzCiAqIGFyZSBhc3luY2hyb25vdXMgYW5kIHJldHVybiBhIEZ1dHVyZS4KICoKICogICAgIEZpbGVTeXN0ZW1FbnRpdHkuaXNEaXJlY3RvcnkobXlQYXRoKS50aGVuKChpc0RpcikgewogKiAgICAgICBpZiAoaXNEaXIpIHsKICogICAgICAgICBwcmludCgnJG15UGF0aCBpcyBhIGRpcmVjdG9yeScpOwogKiAgICAgICB9IGVsc2UgewogKiAgICAgICAgIHByaW50KCckbXlQYXRoIGlzIG5vdCBhIGRpcmVjdG9yeScpOwogKiAgICAgICB9CiAqICAgICB9KTsKICoKICogIyMgSHR0cFNlcnZlciBhbmQgSHR0cENsaWVudAogKgogKiBUaGUgY2xhc3NlcyBbSHR0cFNlcnZlcl0gYW5kIFtIdHRwQ2xpZW50XQogKiBwcm92aWRlIEhUVFAgc2VydmVyIGFuZCBIVFRQIGNsaWVudCBmdW5jdGlvbmFsaXR5LgogKgogKiBUaGUgW0h0dHBTZXJ2ZXJdIGNsYXNzIHByb3ZpZGVzIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IGZvcgogKiBpbXBsZW1lbnRpbmcgYW4gSFRUUCBzZXJ2ZXIuCiAqIEZvciBzb21lIGhpZ2hlci1sZXZlbCBidWlsZGluZy1ibG9ja3MsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSB0cnkKICogdGhlIFtzaGVsZl0oaHR0cHM6Ly9wdWIuZGFydGxhbmcub3JnL3BhY2thZ2VzL3NoZWxmKQogKiBwdWIgcGFja2FnZSwgd2hpY2ggY29udGFpbnMKICogYSBzZXQgb2YgaGlnaC1sZXZlbCBjbGFzc2VzIHRoYXQsIHRvZ2V0aGVyIHdpdGggdGhlIFtIdHRwU2VydmVyXSBjbGFzcwogKiBpbiB0aGlzIGxpYnJhcnksIG1ha2UgaXQgZWFzaWVyIHRvIGltcGxlbWVudCBIVFRQIHNlcnZlcnMuCiAqCiAqICMjIFByb2Nlc3MKICoKICogVGhlIFtQcm9jZXNzXSBjbGFzcyBwcm92aWRlcyBhIHdheSB0byBydW4gYSBwcm9jZXNzIG9uCiAqIHRoZSBuYXRpdmUgbWFjaGluZS4KICogRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZSBzcGF3bnMgYSBwcm9jZXNzIHRoYXQgcmVjdXJzaXZlbHkgbGlzdHMKICogdGhlIGZpbGVzIHVuZGVyIGB3ZWJgLgogKgogKiAgICAgUHJvY2Vzcy5zdGFydCgnbHMnLCBbJy1SJywgJ3dlYiddKS50aGVuKChwcm9jZXNzKSB7CiAqICAgICAgIHN0ZG91dC5hZGRTdHJlYW0ocHJvY2Vzcy5zdGRvdXQpOwogKiAgICAgICBzdGRlcnIuYWRkU3RyZWFtKHByb2Nlc3Muc3RkZXJyKTsKICogICAgICAgcHJvY2Vzcy5leGl0Q29kZS50aGVuKHByaW50KTsKICogICAgIH0pOwogKgogKiBVc2luZyBgc3RhcnQoKWAgcmV0dXJucyBhIEZ1dHVyZSwgd2hpY2ggY29tcGxldGVzIHdpdGggYSBbUHJvY2Vzc10gb2JqZWN0CiAqIHdoZW4gdGhlIHByb2Nlc3MgaGFzIHN0YXJ0ZWQuIFRoaXMgW1Byb2Nlc3NdIG9iamVjdCBhbGxvd3MgeW91IHRvIGludGVyYWN0CiAqIHdpdGggdGhlIHByb2Nlc3Mgd2hpbGUgaXQgaXMgcnVubmluZy4gVXNpbmcgYHJ1bigpYCByZXR1cm5zIGEgRnV0dXJlLCB3aGljaAogKiBjb21wbGV0ZXMgd2l0aCBhIFtQcm9jZXNzUmVzdWx0XSBvYmplY3Qgd2hlbiB0aGUgc3Bhd25lZCBwcm9jZXNzIGhhcwogKiB0ZXJtaW5hdGVkLiBUaGlzIFtQcm9jZXNzUmVzdWx0XSBvYmplY3QgY29sbGVjdHMgdGhlIG91dHB1dCBhbmQgZXhpdCBjb2RlCiAqIGZyb20gdGhlIHByb2Nlc3MuCiAqCiAqIFdoZW4gdXNpbmcgYHN0YXJ0KClgLAogKiB5b3UgbmVlZCB0byByZWFkIGFsbCBkYXRhIGNvbWluZyBvbiB0aGUgc3Rkb3V0IGFuZCBzdGRlcnIgc3RyZWFtcyBvdGhlcndpc2UKICogdGhlIHN5c3RlbSByZXNvdXJjZXMgd2lsbCBub3QgYmUgZnJlZWQuCiAqCiAqICMjIFdlYlNvY2tldAogKgogKiBUaGUgW1dlYlNvY2tldF0gY2xhc3MgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIHdlYiBzb2NrZXQgcHJvdG9jb2wuIFRoaXMKICogYWxsb3dzIGZ1bGwtZHVwbGV4IGNvbW11bmljYXRpb25zIGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgYXBwbGljYXRpb25zLgogKgogKiBBIHdlYiBzb2NrZXQgc2VydmVyIHVzZXMgYSBub3JtYWwgSFRUUCBzZXJ2ZXIgZm9yIGFjY2VwdGluZyB3ZWIgc29ja2V0CiAqIGNvbm5lY3Rpb25zLiBUaGUgaW5pdGlhbCBoYW5kc2hha2UgaXMgYSBIVFRQIHJlcXVlc3Qgd2hpY2ggaXMgdGhlbiB1cGdyYWRlZCB0byBhCiAqIHdlYiBzb2NrZXQgY29ubmVjdGlvbi4KICogVGhlIHNlcnZlciB1cGdyYWRlcyB0aGUgcmVxdWVzdCB1c2luZyBbV2ViU29ja2V0VHJhbnNmb3JtZXJdCiAqIGFuZCBsaXN0ZW5zIGZvciB0aGUgZGF0YSBvbiB0aGUgcmV0dXJuZWQgd2ViIHNvY2tldC4KICogRm9yIGV4YW1wbGUsIGhlcmUncyBhIG1pbmkgc2VydmVyIHRoYXQgbGlzdGVucyBmb3IgJ3dzJyBkYXRhCiAqIG9uIGEgV2ViU29ja2V0OgogKgogKiAgICAgcnVuWm9uZWQoKCkgYXN5bmMgewogKiAgICAgICB2YXIgc2VydmVyID0gYXdhaXQgSHR0cFNlcnZlci5iaW5kKCcxMjcuMC4wLjEnLCA0MDQwKTsKICogICAgICAgc2VydmVyLmxpc3RlbigoSHR0cFJlcXVlc3QgcmVxKSBhc3luYyB7CiAqICAgICAgICAgaWYgKHJlcS51cmkucGF0aCA9PSAnL3dzJykgewogKiAgICAgICAgICAgdmFyIHNvY2tldCA9IGF3YWl0IFdlYlNvY2tldFRyYW5zZm9ybWVyLnVwZ3JhZGUocmVxKTsKICogICAgICAgICAgIHNvY2tldC5saXN0ZW4oaGFuZGxlTXNnKTsKICogICAgICAgICB9CiAqICAgICAgIH0pOwogKiAgICAgfSwgb25FcnJvcjogKGUpID0+IHByaW50KCJBbiBlcnJvciBvY2N1cnJlZC4iKSk7CiAqCiAqIFRoZSBjbGllbnQgY29ubmVjdHMgdG8gdGhlIFdlYlNvY2tldCB1c2luZyB0aGUgYGNvbm5lY3QoKWAgbWV0aG9kCiAqIGFuZCBhIFVSSSB0aGF0IHVzZXMgdGhlIFdlYiBTb2NrZXQgcHJvdG9jb2wuCiAqIFRoZSBjbGllbnQgY2FuIHdyaXRlIHRvIHRoZSBXZWJTb2NrZXQgd2l0aCB0aGUgYGFkZCgpYCBtZXRob2QuCiAqIEZvciBleGFtcGxlLAogKgogKiAgICAgdmFyIHNvY2tldCA9IGF3YWl0IFdlYlNvY2tldC5jb25uZWN0KCd3czovLzEyNy4wLjAuMTo0MDQwL3dzJyk7CiAqICAgICBzb2NrZXQuYWRkKCdIZWxsbywgV29ybGQhJyk7CiAqCiAqIENoZWNrIG91dCB0aGUKICogW3dlYnNvY2tldF9zYW1wbGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvZGFydC1zYW1wbGVzL3RyZWUvbWFzdGVyL2h0bWw1L3dlYi93ZWJzb2NrZXRzL2Jhc2ljcykKICogYXBwLCB3aGljaCB1c2VzIFdlYlNvY2tldHMgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHNlcnZlci4KICoKICogIyMgU29ja2V0IGFuZCBTZXJ2ZXJTb2NrZXQKICoKICogQ2xpZW50cyBhbmQgc2VydmVycyB1c2UgW1NvY2tldF1zIHRvIGNvbW11bmljYXRlIHVzaW5nIHRoZSBUQ1AgcHJvdG9jb2wuCiAqIFVzZSBbU2VydmVyU29ja2V0XSBvbiB0aGUgc2VydmVyIHNpZGUgYW5kIFtTb2NrZXRdIG9uIHRoZSBjbGllbnQuCiAqIFRoZSBzZXJ2ZXIgY3JlYXRlcyBhIGxpc3RlbmluZyBzb2NrZXQgdXNpbmcgdGhlIGBiaW5kKClgIG1ldGhvZCBhbmQKICogdGhlbiBsaXN0ZW5zIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucyBvbiB0aGUgc29ja2V0LiBGb3IgZXhhbXBsZToKICoKICogICAgIFNlcnZlclNvY2tldC5iaW5kKCcxMjcuMC4wLjEnLCA0MDQxKQogKiAgICAgICAudGhlbigoc2VydmVyU29ja2V0KSB7CiAqICAgICAgICAgc2VydmVyU29ja2V0Lmxpc3Rlbigoc29ja2V0KSB7CiAqICAgICAgICAgICBzb2NrZXQudHJhbnNmb3JtKHV0ZjguZGVjb2RlcikubGlzdGVuKHByaW50KTsKICogICAgICAgICB9KTsKICogICAgICAgfSk7CiAqCiAqIEEgY2xpZW50IGNvbm5lY3RzIGEgU29ja2V0IHVzaW5nIHRoZSBgY29ubmVjdCgpYCBtZXRob2QsCiAqIHdoaWNoIHJldHVybnMgYSBGdXR1cmUuCiAqIFVzaW5nIGB3cml0ZSgpYCwgYHdyaXRlbG4oKWAsIG9yIGB3cml0ZUFsbCgpYCBhcmUgdGhlIGVhc2llc3Qgd2F5cyB0bwogKiBzZW5kIGRhdGEgb3ZlciB0aGUgc29ja2V0LgogKiBGb3IgZXhhbXBsZToKICoKICogICAgIFNvY2tldC5jb25uZWN0KCcxMjcuMC4wLjEnLCA0MDQxKS50aGVuKChzb2NrZXQpIHsKICogICAgICAgc29ja2V0LndyaXRlKCdIZWxsbywgV29ybGQhJyk7CiAqICAgICB9KTsKICoKICogQmVzaWRlcyBbU29ja2V0XSBhbmQgW1NlcnZlclNvY2tldF0sIHRoZSBbUmF3U29ja2V0XSBhbmQKICogW1Jhd1NlcnZlclNvY2tldF0gY2xhc3NlcyBhcmUgYXZhaWxhYmxlIGZvciBsb3dlci1sZXZlbCBhY2Nlc3MKICogdG8gYXN5bmMgc29ja2V0IElPLgogKgogKiAjIyBTdGFuZGFyZCBvdXRwdXQsIGVycm9yLCBhbmQgaW5wdXQgc3RyZWFtcwogKgogKiBUaGlzIGxpYnJhcnkgcHJvdmlkZXMgdGhlIHN0YW5kYXJkIG91dHB1dCwgZXJyb3IsIGFuZCBpbnB1dAogKiBzdHJlYW1zLCBuYW1lZCAnc3Rkb3V0JywgJ3N0ZGVycicsIGFuZCAnc3RkaW4nLCByZXNwZWN0aXZlbHkuCiAqCiAqIFRoZSBzdGRvdXQgYW5kIHN0ZGVyciBzdHJlYW1zIGFyZSBib3RoIFtJT1NpbmtdcyBhbmQgaGF2ZSB0aGUgc2FtZSBzZXQKICogb2YgbWV0aG9kcyBhbmQgcHJvcGVydGllcy4KICoKICogVG8gd3JpdGUgYSBzdHJpbmcgdG8gJ3N0ZG91dCc6CiAqCiAqICAgICBzdGRvdXQud3JpdGVsbignSGVsbG8sIFdvcmxkIScpOwogKgogKiBUbyB3cml0ZSBhIGxpc3Qgb2Ygb2JqZWN0cyB0byAnc3RkZXJyJzoKICoKICogICAgIHN0ZGVyci53cml0ZUFsbChbICdUaGF0ICcsICdpcyAnLCAnYW4gJywgJ2Vycm9yLicsICdcbiddKTsKICoKICogVGhlIHN0YW5kYXJkIGlucHV0IHN0cmVhbSBpcyBhIHRydWUgW1N0cmVhbV0sIHNvIGl0IGluaGVyaXRzCiAqIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgZnJvbSB0aGUgU3RyZWFtIGNsYXNzLgogKgogKiBUbyByZWFkIHRleHQgc3luY2hyb25vdXNseSBmcm9tIHRoZSBjb21tYW5kIGxpbmUKICogKHRoZSBwcm9ncmFtIGJsb2NrcyB3YWl0aW5nIGZvciB1c2VyIHRvIHR5cGUgaW5mb3JtYXRpb24pOgogKgogKiAgICAgIFN0cmluZyBpbnB1dFRleHQgPSBzdGRpbi5yZWFkTGluZVN5bmMoKTsKICoKICoge0BjYXRlZ29yeSBWTX0KICovCmxpYnJhcnkgZGFydC5pbzsKCmltcG9ydCAnZGFydDphc3luYyc7CmltcG9ydCAnZGFydDpfaW50ZXJuYWwnIGhpZGUgU3ltYm9sOwppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbicKICAgIHNob3cgSGFzaE1hcCwgSGFzaFNldCwgUXVldWUsIExpc3RRdWV1ZSwgTWFwQmFzZSwgVW5tb2RpZmlhYmxlTWFwVmlldzsKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwppbXBvcnQgJ2RhcnQ6ZGV2ZWxvcGVyJyBoaWRlIGxvZzsKaW1wb3J0ICdkYXJ0Omlzb2xhdGUnOwppbXBvcnQgJ2RhcnQ6bWF0aCc7CmltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKCmV4cG9ydCAnZGFydDpfaHR0cCc7CmV4cG9ydCAnZGFydDpfaW50ZXJuYWwnIHNob3cgSHR0cFN0YXR1czsKCnBhcnQgJ2J5dGVzX2J1aWxkZXIuZGFydCc7CnBhcnQgJ2NvbW1vbi5kYXJ0JzsKcGFydCAnZGF0YV90cmFuc2Zvcm1lci5kYXJ0JzsKcGFydCAnZGlyZWN0b3J5LmRhcnQnOwpwYXJ0ICdkaXJlY3RvcnlfaW1wbC5kYXJ0JzsKcGFydCAnZW1iZWRkZXJfY29uZmlnLmRhcnQnOwpwYXJ0ICdldmVudGhhbmRsZXIuZGFydCc7CnBhcnQgJ2ZpbGUuZGFydCc7CnBhcnQgJ2ZpbGVfaW1wbC5kYXJ0JzsKcGFydCAnZmlsZV9zeXN0ZW1fZW50aXR5LmRhcnQnOwpwYXJ0ICdpb19yZXNvdXJjZV9pbmZvLmRhcnQnOwpwYXJ0ICdpb19zaW5rLmRhcnQnOwpwYXJ0ICdpb19zZXJ2aWNlLmRhcnQnOwpwYXJ0ICdsaW5rLmRhcnQnOwpwYXJ0ICduYW1lc3BhY2VfaW1wbC5kYXJ0JzsKcGFydCAnb3ZlcnJpZGVzLmRhcnQnOwpwYXJ0ICdwbGF0Zm9ybS5kYXJ0JzsKcGFydCAncGxhdGZvcm1faW1wbC5kYXJ0JzsKcGFydCAncHJvY2Vzcy5kYXJ0JzsKcGFydCAnc2VjdXJlX3NlcnZlcl9zb2NrZXQuZGFydCc7CnBhcnQgJ3NlY3VyZV9zb2NrZXQuZGFydCc7CnBhcnQgJ3NlY3VyaXR5X2NvbnRleHQuZGFydCc7CnBhcnQgJ3NlcnZpY2Vfb2JqZWN0LmRhcnQnOwpwYXJ0ICdzb2NrZXQuZGFydCc7CnBhcnQgJ3N0ZGlvLmRhcnQnOwpwYXJ0ICdzdHJpbmdfdHJhbnNmb3JtZXIuZGFydCc7CnBhcnQgJ3N5bmNfc29ja2V0LmRhcnQnOwqA5QBOTjwBBEcDRUoUAzw7QD8iNAMsAxkDQDwDIANEQANGNAMtSQNCKwMXAzw6SwMkMzI6KQM7FiwSMAsLAyADLTYDPyBEOB9KPgMOAzoXSxoDOysrJwsDTU5PSE0VAxlPKwMQA0xNA0pUGkA4QBMDG0AxKEMnDQ04A0UwQhADRyQDEWk8Ax4DTEVHRQMsICo7Dw0DPBtJHhADOSgLAzxCFwMwAz9BA0oeAyIDKAMrA0IDQDEDND4DMQMSBBEBFSUZSxciFxQaARUpARsUHhccHRoSFyAeFRgSHBcWGxUiGx4cFBMgGQEHZGFydDppbzRvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvYmluL2RpcmVjdG9yeV9wYXRjaC5kYXJ0iS4vLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29tbW9uX3BhdGNoLmRhcnQiOwoKQHBhdGNoCmNsYXNzIF9EaXJlY3RvcnkgewogIEBwYXRjaAogIHN0YXRpYyBfY3VycmVudChfTmFtZXNwYWNlIG5hbWVzcGFjZSkgbmF0aXZlICJEaXJlY3RvcnlfQ3VycmVudCI7CiAgQHBhdGNoCiAgc3RhdGljIF9zZXRDdXJyZW50KF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCkKICAgICAgbmF0aXZlICJEaXJlY3RvcnlfU2V0Q3VycmVudCI7CiAgQHBhdGNoCiAgc3RhdGljIF9jcmVhdGVUZW1wKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCkKICAgICAgbmF0aXZlICJEaXJlY3RvcnlfQ3JlYXRlVGVtcCI7CiAgQHBhdGNoCiAgc3RhdGljIFN0cmluZyBfc3lzdGVtVGVtcChfTmFtZXNwYWNlIG5hbWVzcGFjZSkgbmF0aXZlICJEaXJlY3RvcnlfU3lzdGVtVGVtcCI7CiAgQHBhdGNoCiAgc3RhdGljIF9leGlzdHMoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoKQogICAgICBuYXRpdmUgIkRpcmVjdG9yeV9FeGlzdHMiOwogIEBwYXRjaAogIHN0YXRpYyBfY3JlYXRlKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCkKICAgICAgbmF0aXZlICJEaXJlY3RvcnlfQ3JlYXRlIjsKICBAcGF0Y2gKICBzdGF0aWMgX2RlbGV0ZU5hdGl2ZShfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgsIGJvb2wgcmVjdXJzaXZlKQogICAgICBuYXRpdmUgIkRpcmVjdG9yeV9EZWxldGUiOwogIEBwYXRjaAogIHN0YXRpYyBfcmVuYW1lKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCwgU3RyaW5nIG5ld1BhdGgpCiAgICAgIG5hdGl2ZSAiRGlyZWN0b3J5X1JlbmFtZSI7CiAgQHBhdGNoCiAgc3RhdGljIHZvaWQgX2ZpbGxXaXRoRGlyZWN0b3J5TGlzdGluZygKICAgICAgX05hbWVzcGFjZSBuYW1lc3BhY2UsCiAgICAgIExpc3Q8RmlsZVN5c3RlbUVudGl0eT4gbGlzdCwKICAgICAgVWludDhMaXN0IHJhd1BhdGgsCiAgICAgIGJvb2wgcmVjdXJzaXZlLAogICAgICBib29sIGZvbGxvd0xpbmtzKSBuYXRpdmUgIkRpcmVjdG9yeV9GaWxsV2l0aERpcmVjdG9yeUxpc3RpbmciOwp9CgpAcGF0Y2gKY2xhc3MgX0FzeW5jRGlyZWN0b3J5TGlzdGVyT3BzIHsKICBAcGF0Y2gKICBmYWN0b3J5IF9Bc3luY0RpcmVjdG9yeUxpc3Rlck9wcyhpbnQgcG9pbnRlcikgPT4KICAgICAgbmV3IF9Bc3luY0RpcmVjdG9yeUxpc3Rlck9wc0ltcGwocG9pbnRlcik7Cn0KCmNsYXNzIF9Bc3luY0RpcmVjdG9yeUxpc3Rlck9wc0ltcGwgZXh0ZW5kcyBOYXRpdmVGaWVsZFdyYXBwZXJDbGFzczEKICAgIGltcGxlbWVudHMgX0FzeW5jRGlyZWN0b3J5TGlzdGVyT3BzIHsKICBfQXN5bmNEaXJlY3RvcnlMaXN0ZXJPcHNJbXBsLl8oKTsKCiAgZmFjdG9yeSBfQXN5bmNEaXJlY3RvcnlMaXN0ZXJPcHNJbXBsKGludCBwb2ludGVyKSA9PgogICAgICBuZXcgX0FzeW5jRGlyZWN0b3J5TGlzdGVyT3BzSW1wbC5fKCkuLl9zZXRQb2ludGVyKHBvaW50ZXIpOwoKICB2b2lkIF9zZXRQb2ludGVyKGludCBwb2ludGVyKQogICAgICBuYXRpdmUgIkRpcmVjdG9yeV9TZXRBc3luY0RpcmVjdG9yeUxpc3RlclBvaW50ZXIiOwogIGludCBnZXRQb2ludGVyKCkgbmF0aXZlICJEaXJlY3RvcnlfR2V0QXN5bmNEaXJlY3RvcnlMaXN0ZXJQb2ludGVyIjsKfQoKLy8gQ29yZWxpYiAnVXJpLmJhc2UnIGltcGxlbWVudGF0aW9uLgovLyBVcmkuYmFzZSBpcyBzdXNjZXB0aWJsZSB0byBjaGFuZ2VzIGluIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgpVcmkgX3VyaUJhc2VDbG9zdXJlKCkgewogIHZhciByZXN1bHQgPSBfRGlyZWN0b3J5Ll9jdXJyZW50KF9OYW1lc3BhY2UuX25hbWVzcGFjZSk7CiAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigKICAgICAgICAiR2V0dGluZyBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZhaWxlZCIsICIiLCByZXN1bHQpOwogIH0KICByZXR1cm4gbmV3IFVyaS5kaXJlY3RvcnkocmVzdWx0KTsKfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCl9nZXRVcmlCYXNlQ2xvc3VyZSgpID0+IF91cmlCYXNlQ2xvc3VyZTsKSQBOTjwBIAEHEwlECT4lCT4lCVEJOiEJOiEJUCEJSiEJKRwjGRZFAgEHIQkzMQIBRCokATdCASA5RgIBJkgYOxsjQQQkAgEiKQEiZGFydDppby1wYXRjaC9kaXJlY3RvcnlfcGF0Y2guZGFydC9vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvYmluL2ZpbGVfcGF0Y2guZGFydLPZLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvbW1vbl9wYXRjaC5kYXJ0IjsKCkBwYXRjaApjbGFzcyBfRmlsZSB7CiAgQHBhdGNoCiAgc3RhdGljIF9leGlzdHMoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoKSBuYXRpdmUgIkZpbGVfRXhpc3RzIjsKICBAcGF0Y2gKICBzdGF0aWMgX2NyZWF0ZShfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpIG5hdGl2ZSAiRmlsZV9DcmVhdGUiOwogIEBwYXRjaAogIHN0YXRpYyBfY3JlYXRlTGluayhfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgsIFN0cmluZyB0YXJnZXQpCiAgICAgIG5hdGl2ZSAiRmlsZV9DcmVhdGVMaW5rIjsKICBAcGF0Y2gKICBzdGF0aWMgX2xpbmtUYXJnZXQoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoKQogICAgICBuYXRpdmUgIkZpbGVfTGlua1RhcmdldCI7CiAgQHBhdGNoCiAgc3RhdGljIF9kZWxldGVOYXRpdmUoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoKQogICAgICBuYXRpdmUgIkZpbGVfRGVsZXRlIjsKICBAcGF0Y2gKICBzdGF0aWMgX2RlbGV0ZUxpbmtOYXRpdmUoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoKQogICAgICBuYXRpdmUgIkZpbGVfRGVsZXRlTGluayI7CiAgQHBhdGNoCiAgc3RhdGljIF9yZW5hbWUoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCBvbGRQYXRoLCBTdHJpbmcgbmV3UGF0aCkKICAgICAgbmF0aXZlICJGaWxlX1JlbmFtZSI7CiAgQHBhdGNoCiAgc3RhdGljIF9yZW5hbWVMaW5rKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3Qgb2xkUGF0aCwgU3RyaW5nIG5ld1BhdGgpCiAgICAgIG5hdGl2ZSAiRmlsZV9SZW5hbWVMaW5rIjsKICBAcGF0Y2gKICBzdGF0aWMgX2NvcHkoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCBvbGRQYXRoLCBTdHJpbmcgbmV3UGF0aCkKICAgICAgbmF0aXZlICJGaWxlX0NvcHkiOwogIEBwYXRjaAogIHN0YXRpYyBfbGVuZ3RoRnJvbVBhdGgoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoKQogICAgICBuYXRpdmUgIkZpbGVfTGVuZ3RoRnJvbVBhdGgiOwogIEBwYXRjaAogIHN0YXRpYyBfbGFzdE1vZGlmaWVkKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCkKICAgICAgbmF0aXZlICJGaWxlX0xhc3RNb2RpZmllZCI7CiAgQHBhdGNoCiAgc3RhdGljIF9zZXRMYXN0TW9kaWZpZWQoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoLCBpbnQgbWlsbGlzKQogICAgICBuYXRpdmUgIkZpbGVfU2V0TGFzdE1vZGlmaWVkIjsKICBAcGF0Y2gKICBzdGF0aWMgX2xhc3RBY2Nlc3NlZChfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpCiAgICAgIG5hdGl2ZSAiRmlsZV9MYXN0QWNjZXNzZWQiOwogIEBwYXRjaAogIHN0YXRpYyBfc2V0TGFzdEFjY2Vzc2VkKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCwgaW50IG1pbGxpcykKICAgICAgbmF0aXZlICJGaWxlX1NldExhc3RBY2Nlc3NlZCI7CiAgQHBhdGNoCiAgc3RhdGljIF9vcGVuKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCwgaW50IG1vZGUpCiAgICAgIG5hdGl2ZSAiRmlsZV9PcGVuIjsKICBAcGF0Y2gKICBzdGF0aWMgaW50IF9vcGVuU3RkaW8oaW50IGZkKSBuYXRpdmUgIkZpbGVfT3BlblN0ZGlvIjsKfQoKQHBhdGNoCmNsYXNzIF9SYW5kb21BY2Nlc3NGaWxlT3BzIHsKICBAcGF0Y2gKICBmYWN0b3J5IF9SYW5kb21BY2Nlc3NGaWxlT3BzKGludCBwb2ludGVyKSA9PgogICAgICBuZXcgX1JhbmRvbUFjY2Vzc0ZpbGVPcHNJbXBsKHBvaW50ZXIpOwp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9SYW5kb21BY2Nlc3NGaWxlT3BzSW1wbCBleHRlbmRzIE5hdGl2ZUZpZWxkV3JhcHBlckNsYXNzMQogICAgaW1wbGVtZW50cyBfUmFuZG9tQWNjZXNzRmlsZU9wcyB7CiAgX1JhbmRvbUFjY2Vzc0ZpbGVPcHNJbXBsLl8oKTsKCiAgZmFjdG9yeSBfUmFuZG9tQWNjZXNzRmlsZU9wc0ltcGwoaW50IHBvaW50ZXIpID0+CiAgICAgIG5ldyBfUmFuZG9tQWNjZXNzRmlsZU9wc0ltcGwuXygpLi5fc2V0UG9pbnRlcihwb2ludGVyKTsKCiAgdm9pZCBfc2V0UG9pbnRlcihpbnQgcG9pbnRlcikgbmF0aXZlICJGaWxlX1NldFBvaW50ZXIiOwoKICBpbnQgZ2V0UG9pbnRlcigpIG5hdGl2ZSAiRmlsZV9HZXRQb2ludGVyIjsKICBpbnQgY2xvc2UoKSBuYXRpdmUgIkZpbGVfQ2xvc2UiOwogIHJlYWRCeXRlKCkgbmF0aXZlICJGaWxlX1JlYWRCeXRlIjsKICByZWFkKGludCBieXRlcykgbmF0aXZlICJGaWxlX1JlYWQiOwogIHJlYWRJbnRvKExpc3Q8aW50PiBidWZmZXIsIGludCBzdGFydCwgaW50IGVuZCkgbmF0aXZlICJGaWxlX1JlYWRJbnRvIjsKICB3cml0ZUJ5dGUoaW50IHZhbHVlKSBuYXRpdmUgIkZpbGVfV3JpdGVCeXRlIjsKICB3cml0ZUZyb20oTGlzdDxpbnQ+IGJ1ZmZlciwgaW50IHN0YXJ0LCBpbnQgZW5kKSBuYXRpdmUgIkZpbGVfV3JpdGVGcm9tIjsKICBwb3NpdGlvbigpIG5hdGl2ZSAiRmlsZV9Qb3NpdGlvbiI7CiAgc2V0UG9zaXRpb24oaW50IHBvc2l0aW9uKSBuYXRpdmUgIkZpbGVfU2V0UG9zaXRpb24iOwogIHRydW5jYXRlKGludCBsZW5ndGgpIG5hdGl2ZSAiRmlsZV9UcnVuY2F0ZSI7CiAgbGVuZ3RoKCkgbmF0aXZlICJGaWxlX0xlbmd0aCI7CiAgZmx1c2goKSBuYXRpdmUgIkZpbGVfRmx1c2giOwogIGxvY2soaW50IGxvY2ssIGludCBzdGFydCwgaW50IGVuZCkgbmF0aXZlICJGaWxlX0xvY2siOwp9CgpjbGFzcyBfV2F0Y2hlclBhdGggewogIGZpbmFsIGludCBwYXRoSWQ7CiAgZmluYWwgU3RyaW5nIHBhdGg7CiAgZmluYWwgaW50IGV2ZW50czsKICBpbnQgY291bnQgPSAwOwogIF9XYXRjaGVyUGF0aCh0aGlzLnBhdGhJZCwgdGhpcy5wYXRoLCB0aGlzLmV2ZW50cyk7Cn0KCkBwYXRjaApjbGFzcyBfRmlsZVN5c3RlbVdhdGNoZXIgewogIHZvaWQgX3BhdGhXYXRjaGVkRW5kKCk7CgogIHN0YXRpYyBpbnQgX2lkOwogIHN0YXRpYyBmaW5hbCBNYXA8aW50LCBfV2F0Y2hlclBhdGg+IF9pZE1hcCA9IHt9OwoKICBmaW5hbCBTdHJpbmcgX3BhdGg7CiAgZmluYWwgaW50IF9ldmVudHM7CiAgZmluYWwgYm9vbCBfcmVjdXJzaXZlOwoKICBfV2F0Y2hlclBhdGggX3dhdGNoZXJQYXRoOwoKICBTdHJlYW1Db250cm9sbGVyPEZpbGVTeXN0ZW1FdmVudD4gX2Jyb2FkY2FzdENvbnRyb2xsZXI7CgogIEBwYXRjaAogIHN0YXRpYyBTdHJlYW08RmlsZVN5c3RlbUV2ZW50PiBfd2F0Y2goCiAgICAgIFN0cmluZyBwYXRoLCBpbnQgZXZlbnRzLCBib29sIHJlY3Vyc2l2ZSkgewogICAgaWYgKFBsYXRmb3JtLmlzTGludXgpIHsKICAgICAgcmV0dXJuIG5ldyBfSW5vdGlmeUZpbGVTeXN0ZW1XYXRjaGVyKHBhdGgsIGV2ZW50cywgcmVjdXJzaXZlKS5fc3RyZWFtOwogICAgfQogICAgaWYgKFBsYXRmb3JtLmlzV2luZG93cykgewogICAgICByZXR1cm4gbmV3IF9XaW4zMkZpbGVTeXN0ZW1XYXRjaGVyKHBhdGgsIGV2ZW50cywgcmVjdXJzaXZlKS5fc3RyZWFtOwogICAgfQogICAgaWYgKFBsYXRmb3JtLmlzTWFjT1MpIHsKICAgICAgcmV0dXJuIG5ldyBfRlNFdmVudFN0cmVhbUZpbGVTeXN0ZW1XYXRjaGVyKHBhdGgsIGV2ZW50cywgcmVjdXJzaXZlKQogICAgICAgICAgLl9zdHJlYW07CiAgICB9CiAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigKICAgICAgICAiRmlsZSBzeXN0ZW0gd2F0Y2hpbmcgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7CiAgfQoKICBfRmlsZVN5c3RlbVdhdGNoZXIuXyh0aGlzLl9wYXRoLCB0aGlzLl9ldmVudHMsIHRoaXMuX3JlY3Vyc2l2ZSkgewogICAgaWYgKCFpc1N1cHBvcnRlZCkgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigKICAgICAgICAgICJGaWxlIHN5c3RlbSB3YXRjaGluZyBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0iLCBfcGF0aCk7CiAgICB9CiAgICBfYnJvYWRjYXN0Q29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyPEZpbGVTeXN0ZW1FdmVudD4uYnJvYWRjYXN0KAogICAgICAgIG9uTGlzdGVuOiBfbGlzdGVuLCBvbkNhbmNlbDogX2NhbmNlbCk7CiAgfQoKICBTdHJlYW08RmlsZVN5c3RlbUV2ZW50PiBnZXQgX3N0cmVhbSA9PiBfYnJvYWRjYXN0Q29udHJvbGxlci5zdHJlYW07CgogIHZvaWQgX2xpc3RlbigpIHsKICAgIGlmIChfaWQgPT0gbnVsbCkgewogICAgICB0cnkgewogICAgICAgIF9pZCA9IF9pbml0V2F0Y2hlcigpOwogICAgICAgIF9uZXdXYXRjaGVyKCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBfYnJvYWRjYXN0Q29udHJvbGxlci5hZGRFcnJvcihuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigKICAgICAgICAgICAgIkZhaWxlZCB0byBpbml0aWFsaXplIGZpbGUgc3lzdGVtIGVudGl0eSB3YXRjaGVyIiwgbnVsbCwgZSkpOwogICAgICAgIF9icm9hZGNhc3RDb250cm9sbGVyLmNsb3NlKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICB2YXIgcGF0aElkOwogICAgdHJ5IHsKICAgICAgcGF0aElkID0KICAgICAgICAgIF93YXRjaFBhdGgoX2lkLCBfTmFtZXNwYWNlLl9uYW1lc3BhY2UsIF9wYXRoLCBfZXZlbnRzLCBfcmVjdXJzaXZlKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgX2Jyb2FkY2FzdENvbnRyb2xsZXIKICAgICAgICAgIC5hZGRFcnJvcihuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigiRmFpbGVkIHRvIHdhdGNoIHBhdGgiLCBfcGF0aCwgZSkpOwogICAgICBfYnJvYWRjYXN0Q29udHJvbGxlci5jbG9zZSgpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIV9pZE1hcC5jb250YWluc0tleShwYXRoSWQpKSB7CiAgICAgIF9pZE1hcFtwYXRoSWRdID0gbmV3IF9XYXRjaGVyUGF0aChwYXRoSWQsIF9wYXRoLCBfZXZlbnRzKTsKICAgIH0KICAgIF93YXRjaGVyUGF0aCA9IF9pZE1hcFtwYXRoSWRdOwogICAgX3dhdGNoZXJQYXRoLmNvdW50Kys7CiAgICBfcGF0aFdhdGNoZWQoKS5waXBlKF9icm9hZGNhc3RDb250cm9sbGVyKTsKICB9CgogIHZvaWQgX2NhbmNlbCgpIHsKICAgIGlmIChfd2F0Y2hlclBhdGggIT0gbnVsbCkgewogICAgICBhc3NlcnQoX3dhdGNoZXJQYXRoLmNvdW50ID4gMCk7CiAgICAgIF93YXRjaGVyUGF0aC5jb3VudC0tOwogICAgICBpZiAoX3dhdGNoZXJQYXRoLmNvdW50ID09IDApIHsKICAgICAgICBfdW53YXRjaFBhdGgoX2lkLCBfd2F0Y2hlclBhdGgucGF0aElkKTsKICAgICAgICBfcGF0aFdhdGNoZWRFbmQoKTsKICAgICAgICBfaWRNYXAucmVtb3ZlKF93YXRjaGVyUGF0aC5wYXRoSWQpOwogICAgICB9CiAgICAgIF93YXRjaGVyUGF0aCA9IG51bGw7CiAgICB9CiAgICBpZiAoX2lkTWFwLmlzRW1wdHkgJiYgX2lkICE9IG51bGwpIHsKICAgICAgX2Nsb3NlV2F0Y2hlcihfaWQpOwogICAgICBfZG9uZVdhdGNoZXIoKTsKICAgICAgX2lkID0gbnVsbDsKICAgIH0KICB9CgogIC8vIENhbGxlZCB3aGVuIChhbmQgYWZ0ZXIpIGEgbmV3IHdhdGNoZXIgaW5zdGFuY2UgaXMgY3JlYXRlZCBhbmQgYXZhaWxhYmxlLgogIHZvaWQgX25ld1dhdGNoZXIoKSB7fQogIC8vIENhbGxlZCB3aGVuIGEgd2F0Y2hlciBpcyBubyBsb25nZXIgbmVlZGVkLgogIHZvaWQgX2RvbmVXYXRjaGVyKCkge30KICAvLyBDYWxsZWQgd2hlbiBhIG5ldyBwYXRoIGlzIGJlaW5nIHdhdGNoZWQuCiAgU3RyZWFtIF9wYXRoV2F0Y2hlZCgpIHt9CiAgLy8gQ2FsbGVkIHdoZW4gYSBwYXRoIGlzIG5vIGxvbmdlciBiZWluZyB3YXRjaGVkLgogIHZvaWQgX2RvbmVQYXRoV2F0Y2hlZCgpIHt9CgogIHN0YXRpYyBfV2F0Y2hlclBhdGggX3BhdGhGcm9tUGF0aElkKGludCBwYXRoSWQpIHsKICAgIHJldHVybiBfaWRNYXBbcGF0aElkXTsKICB9CgogIHN0YXRpYyBTdHJlYW0gX2xpc3Rlbk9uU29ja2V0KGludCBzb2NrZXRJZCwgaW50IGlkLCBpbnQgcGF0aElkKSB7CiAgICB2YXIgbmF0aXZlID0gbmV3IF9OYXRpdmVTb2NrZXQud2F0Y2goc29ja2V0SWQpOwogICAgdmFyIHNvY2tldCA9IG5ldyBfUmF3U29ja2V0KG5hdGl2ZSk7CiAgICByZXR1cm4gc29ja2V0LmV4cGFuZCgoZXZlbnQpIHsKICAgICAgdmFyIHN0b3BzID0gW107CiAgICAgIHZhciBldmVudHMgPSBbXTsKICAgICAgdmFyIHBhaXIgPSB7fTsKICAgICAgaWYgKGV2ZW50ID09IFJhd1NvY2tldEV2ZW50LnJlYWQpIHsKICAgICAgICBTdHJpbmcgZ2V0UGF0aChldmVudCkgewogICAgICAgICAgdmFyIHBhdGggPSBfcGF0aEZyb21QYXRoSWQoZXZlbnRbNF0pLnBhdGg7CiAgICAgICAgICBpZiAoZXZlbnRbMl0gIT0gbnVsbCAmJiBldmVudFsyXS5pc05vdEVtcHR5KSB7CiAgICAgICAgICAgIHBhdGggKz0gUGxhdGZvcm0ucGF0aFNlcGFyYXRvcjsKICAgICAgICAgICAgcGF0aCArPSBldmVudFsyXTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBwYXRoOwogICAgICAgIH0KCiAgICAgICAgYm9vbCBnZXRJc0RpcihldmVudCkgewogICAgICAgICAgaWYgKFBsYXRmb3JtLmlzV2luZG93cykgewogICAgICAgICAgICAvLyBXaW5kb3dzIGRvZXMgbm90IGdldCAnaXNEaXInIGFzIHBhcnQgb2YgdGhlIGV2ZW50LgogICAgICAgICAgICByZXR1cm4gRmlsZVN5c3RlbUVudGl0eS5pc0RpcmVjdG9yeVN5bmMoZ2V0UGF0aChldmVudCkpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIChldmVudFswXSAmIEZpbGVTeXN0ZW1FdmVudC5faXNEaXIpICE9IDA7CiAgICAgICAgfQoKICAgICAgICB2b2lkIGFkZChpZCwgZXZlbnQpIHsKICAgICAgICAgIGlmICgoZXZlbnQudHlwZSAmIF9wYXRoRnJvbVBhdGhJZChpZCkuZXZlbnRzKSA9PSAwKSByZXR1cm47CiAgICAgICAgICBldmVudHMuYWRkKFtpZCwgZXZlbnRdKTsKICAgICAgICB9CgogICAgICAgIHZvaWQgcmV3cml0ZU1vdmUoZXZlbnQsIGlzRGlyKSB7CiAgICAgICAgICBpZiAoZXZlbnRbM10pIHsKICAgICAgICAgICAgYWRkKGV2ZW50WzRdLCBuZXcgRmlsZVN5c3RlbUNyZWF0ZUV2ZW50Ll8oZ2V0UGF0aChldmVudCksIGlzRGlyKSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhZGQoZXZlbnRbNF0sIG5ldyBGaWxlU3lzdGVtRGVsZXRlRXZlbnQuXyhnZXRQYXRoKGV2ZW50KSwgaXNEaXIpKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGludCBldmVudENvdW50OwogICAgICAgIGRvIHsKICAgICAgICAgIGV2ZW50Q291bnQgPSAwOwogICAgICAgICAgZm9yICh2YXIgZXZlbnQgaW4gX3JlYWRFdmVudHMoaWQsIHBhdGhJZCkpIHsKICAgICAgICAgICAgaWYgKGV2ZW50ID09IG51bGwpIGNvbnRpbnVlOwogICAgICAgICAgICBldmVudENvdW50Kys7CiAgICAgICAgICAgIGludCBwYXRoSWQgPSBldmVudFs0XTsKICAgICAgICAgICAgaWYgKCFfaWRNYXAuY29udGFpbnNLZXkocGF0aElkKSkgewogICAgICAgICAgICAgIC8vIFBhdGggaXMgbm8gbG9uZ2VyIGJlaW5nIHdhdGhlZC4KICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBib29sIGlzRGlyID0gZ2V0SXNEaXIoZXZlbnQpOwogICAgICAgICAgICB2YXIgcGF0aCA9IGdldFBhdGgoZXZlbnQpOwogICAgICAgICAgICBpZiAoKGV2ZW50WzBdICYgRmlsZVN5c3RlbUV2ZW50LmNyZWF0ZSkgIT0gMCkgewogICAgICAgICAgICAgIGFkZChldmVudFs0XSwgbmV3IEZpbGVTeXN0ZW1DcmVhdGVFdmVudC5fKHBhdGgsIGlzRGlyKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKChldmVudFswXSAmIEZpbGVTeXN0ZW1FdmVudC5tb2RpZnkpICE9IDApIHsKICAgICAgICAgICAgICBhZGQoZXZlbnRbNF0sIG5ldyBGaWxlU3lzdGVtTW9kaWZ5RXZlbnQuXyhwYXRoLCBpc0RpciwgdHJ1ZSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgoZXZlbnRbMF0gJiBGaWxlU3lzdGVtRXZlbnQuX21vZGlmeUF0dHJpYnV0ZXMpICE9IDApIHsKICAgICAgICAgICAgICBhZGQoZXZlbnRbNF0sIG5ldyBGaWxlU3lzdGVtTW9kaWZ5RXZlbnQuXyhwYXRoLCBpc0RpciwgZmFsc2UpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKGV2ZW50WzBdICYgRmlsZVN5c3RlbUV2ZW50Lm1vdmUpICE9IDApIHsKICAgICAgICAgICAgICBpbnQgbGluayA9IGV2ZW50WzFdOwogICAgICAgICAgICAgIGlmIChsaW5rID4gMCkgewogICAgICAgICAgICAgICAgcGFpci5wdXRJZkFic2VudChwYXRoSWQsICgpID0+IHt9KTsKICAgICAgICAgICAgICAgIGlmIChwYWlyW3BhdGhJZF0uY29udGFpbnNLZXkobGluaykpIHsKICAgICAgICAgICAgICAgICAgYWRkKAogICAgICAgICAgICAgICAgICAgICAgZXZlbnRbNF0sCiAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZVN5c3RlbU1vdmVFdmVudC5fKAogICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhdGgocGFpcltwYXRoSWRdW2xpbmtdKSwgaXNEaXIsIHBhdGgpKTsKICAgICAgICAgICAgICAgICAgcGFpcltwYXRoSWRdLnJlbW92ZShsaW5rKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHBhaXJbcGF0aElkXVtsaW5rXSA9IGV2ZW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXdyaXRlTW92ZShldmVudCwgaXNEaXIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKGV2ZW50WzBdICYgRmlsZVN5c3RlbUV2ZW50LmRlbGV0ZSkgIT0gMCkgewogICAgICAgICAgICAgIGFkZChldmVudFs0XSwgbmV3IEZpbGVTeXN0ZW1EZWxldGVFdmVudC5fKHBhdGgsIGlzRGlyKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKChldmVudFswXSAmIEZpbGVTeXN0ZW1FdmVudC5fZGVsZXRlU2VsZikgIT0gMCkgewogICAgICAgICAgICAgIGFkZChldmVudFs0XSwgbmV3IEZpbGVTeXN0ZW1EZWxldGVFdmVudC5fKHBhdGgsIGlzRGlyKSk7CiAgICAgICAgICAgICAgLy8gU2lnbmFsIGRvbmUgZXZlbnQuCiAgICAgICAgICAgICAgc3RvcHMuYWRkKFtldmVudFs0XSwgbnVsbF0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSB3aGlsZSAoZXZlbnRDb3VudCA+IDApOwogICAgICAgIC8vIEJlIHN1cmUgdG8gY2xlYXIgdGhpcyBtYW51YWxseSwgYXMgdGhlIHNvY2tldHMgYXJlIG5vdCByZWFkIHRocm91Z2gKICAgICAgICAvLyB0aGUgX05hdGl2ZVNvY2tldCBpbnRlcmZhY2UuCiAgICAgICAgbmF0aXZlLmF2YWlsYWJsZSA9IDA7CiAgICAgICAgZm9yICh2YXIgbWFwIGluIHBhaXIudmFsdWVzKSB7CiAgICAgICAgICBmb3IgKHZhciBldmVudCBpbiBtYXAudmFsdWVzKSB7CiAgICAgICAgICAgIHJld3JpdGVNb3ZlKGV2ZW50LCBnZXRJc0RpcihldmVudCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBSYXdTb2NrZXRFdmVudC5jbG9zZWQpIHsKICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBSYXdTb2NrZXRFdmVudC5yZWFkQ2xvc2VkKSB7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXNzZXJ0KGZhbHNlKTsKICAgICAgfQogICAgICBldmVudHMuYWRkQWxsKHN0b3BzKTsKICAgICAgcmV0dXJuIGV2ZW50czsKICAgIH0pOwogIH0KCiAgQHBhdGNoCiAgc3RhdGljIGJvb2wgZ2V0IGlzU3VwcG9ydGVkIG5hdGl2ZSAiRmlsZVN5c3RlbVdhdGNoZXJfSXNTdXBwb3J0ZWQiOwoKICBzdGF0aWMgaW50IF9pbml0V2F0Y2hlcigpIG5hdGl2ZSAiRmlsZVN5c3RlbVdhdGNoZXJfSW5pdFdhdGNoZXIiOwogIHN0YXRpYyB2b2lkIF9jbG9zZVdhdGNoZXIoaW50IGlkKSBuYXRpdmUgIkZpbGVTeXN0ZW1XYXRjaGVyX0Nsb3NlV2F0Y2hlciI7CgogIHN0YXRpYyBpbnQgX3dhdGNoUGF0aChpbnQgaWQsIF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBTdHJpbmcgcGF0aCwgaW50IGV2ZW50cywKICAgICAgYm9vbCByZWN1cnNpdmUpIG5hdGl2ZSAiRmlsZVN5c3RlbVdhdGNoZXJfV2F0Y2hQYXRoIjsKICBzdGF0aWMgdm9pZCBfdW53YXRjaFBhdGgoaW50IGlkLCBpbnQgcGF0aF9pZCkKICAgICAgbmF0aXZlICJGaWxlU3lzdGVtV2F0Y2hlcl9VbndhdGNoUGF0aCI7CiAgc3RhdGljIExpc3QgX3JlYWRFdmVudHMoaW50IGlkLCBpbnQgcGF0aF9pZCkKICAgICAgbmF0aXZlICJGaWxlU3lzdGVtV2F0Y2hlcl9SZWFkRXZlbnRzIjsKICBzdGF0aWMgaW50IF9nZXRTb2NrZXRJZChpbnQgaWQsIGludCBwYXRoX2lkKQogICAgICBuYXRpdmUgIkZpbGVTeXN0ZW1XYXRjaGVyX0dldFNvY2tldElkIjsKfQoKY2xhc3MgX0lub3RpZnlGaWxlU3lzdGVtV2F0Y2hlciBleHRlbmRzIF9GaWxlU3lzdGVtV2F0Y2hlciB7CiAgc3RhdGljIGZpbmFsIE1hcDxpbnQsIFN0cmVhbUNvbnRyb2xsZXI+IF9pZE1hcCA9IHt9OwogIHN0YXRpYyBTdHJlYW1TdWJzY3JpcHRpb24gX3N1YnNjcmlwdGlvbjsKCiAgX0lub3RpZnlGaWxlU3lzdGVtV2F0Y2hlcihwYXRoLCBldmVudHMsIHJlY3Vyc2l2ZSkKICAgICAgOiBzdXBlci5fKHBhdGgsIGV2ZW50cywgcmVjdXJzaXZlKTsKCiAgdm9pZCBfbmV3V2F0Y2hlcigpIHsKICAgIGludCBpZCA9IF9GaWxlU3lzdGVtV2F0Y2hlci5faWQ7CiAgICBfc3Vic2NyaXB0aW9uID0KICAgICAgICBfRmlsZVN5c3RlbVdhdGNoZXIuX2xpc3Rlbk9uU29ja2V0KGlkLCBpZCwgMCkubGlzdGVuKChldmVudCkgewogICAgICBpZiAoX2lkTWFwLmNvbnRhaW5zS2V5KGV2ZW50WzBdKSkgewogICAgICAgIGlmIChldmVudFsxXSAhPSBudWxsKSB7CiAgICAgICAgICBfaWRNYXBbZXZlbnRbMF1dLmFkZChldmVudFsxXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIF9pZE1hcFtldmVudFswXV0uY2xvc2UoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgdm9pZCBfZG9uZVdhdGNoZXIoKSB7CiAgICBfc3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogIH0KCiAgU3RyZWFtIF9wYXRoV2F0Y2hlZCgpIHsKICAgIHZhciBwYXRoSWQgPSBfd2F0Y2hlclBhdGgucGF0aElkOwogICAgaWYgKCFfaWRNYXAuY29udGFpbnNLZXkocGF0aElkKSkgewogICAgICBfaWRNYXBbcGF0aElkXSA9IG5ldyBTdHJlYW1Db250cm9sbGVyPEZpbGVTeXN0ZW1FdmVudD4uYnJvYWRjYXN0KCk7CiAgICB9CiAgICByZXR1cm4gX2lkTWFwW3BhdGhJZF0uc3RyZWFtOwogIH0KCiAgdm9pZCBfcGF0aFdhdGNoZWRFbmQoKSB7CiAgICB2YXIgcGF0aElkID0gX3dhdGNoZXJQYXRoLnBhdGhJZDsKICAgIGlmICghX2lkTWFwLmNvbnRhaW5zS2V5KHBhdGhJZCkpIHJldHVybjsKICAgIF9pZE1hcFtwYXRoSWRdLmNsb3NlKCk7CiAgICBfaWRNYXAucmVtb3ZlKHBhdGhJZCk7CiAgfQp9CgpjbGFzcyBfV2luMzJGaWxlU3lzdGVtV2F0Y2hlciBleHRlbmRzIF9GaWxlU3lzdGVtV2F0Y2hlciB7CiAgU3RyZWFtU3Vic2NyaXB0aW9uIF9zdWJzY3JpcHRpb247CiAgU3RyZWFtQ29udHJvbGxlciBfY29udHJvbGxlcjsKCiAgX1dpbjMyRmlsZVN5c3RlbVdhdGNoZXIocGF0aCwgZXZlbnRzLCByZWN1cnNpdmUpCiAgICAgIDogc3VwZXIuXyhwYXRoLCBldmVudHMsIHJlY3Vyc2l2ZSk7CgogIFN0cmVhbSBfcGF0aFdhdGNoZWQoKSB7CiAgICB2YXIgcGF0aElkID0gX3dhdGNoZXJQYXRoLnBhdGhJZDsKICAgIF9jb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8RmlsZVN5c3RlbUV2ZW50PigpOwogICAgX3N1YnNjcmlwdGlvbiA9CiAgICAgICAgX0ZpbGVTeXN0ZW1XYXRjaGVyLl9saXN0ZW5PblNvY2tldChwYXRoSWQsIDAsIHBhdGhJZCkubGlzdGVuKChldmVudCkgewogICAgICBhc3NlcnQoZXZlbnRbMF0gPT0gcGF0aElkKTsKICAgICAgaWYgKGV2ZW50WzFdICE9IG51bGwpIHsKICAgICAgICBfY29udHJvbGxlci5hZGQoZXZlbnRbMV0pOwogICAgICB9IGVsc2UgewogICAgICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIF9jb250cm9sbGVyLnN0cmVhbTsKICB9CgogIHZvaWQgX3BhdGhXYXRjaGVkRW5kKCkgewogICAgX3N1YnNjcmlwdGlvbi5jYW5jZWwoKTsKICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgfQp9CgpjbGFzcyBfRlNFdmVudFN0cmVhbUZpbGVTeXN0ZW1XYXRjaGVyIGV4dGVuZHMgX0ZpbGVTeXN0ZW1XYXRjaGVyIHsKICBTdHJlYW1TdWJzY3JpcHRpb24gX3N1YnNjcmlwdGlvbjsKICBTdHJlYW1Db250cm9sbGVyIF9jb250cm9sbGVyOwoKICBfRlNFdmVudFN0cmVhbUZpbGVTeXN0ZW1XYXRjaGVyKHBhdGgsIGV2ZW50cywgcmVjdXJzaXZlKQogICAgICA6IHN1cGVyLl8ocGF0aCwgZXZlbnRzLCByZWN1cnNpdmUpOwoKICBTdHJlYW0gX3BhdGhXYXRjaGVkKCkgewogICAgdmFyIHBhdGhJZCA9IF93YXRjaGVyUGF0aC5wYXRoSWQ7CiAgICB2YXIgc29ja2V0SWQgPSBfRmlsZVN5c3RlbVdhdGNoZXIuX2dldFNvY2tldElkKDAsIHBhdGhJZCk7CiAgICBfY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyPEZpbGVTeXN0ZW1FdmVudD4oKTsKICAgIF9zdWJzY3JpcHRpb24gPQogICAgICAgIF9GaWxlU3lzdGVtV2F0Y2hlci5fbGlzdGVuT25Tb2NrZXQoc29ja2V0SWQsIDAsIHBhdGhJZCkubGlzdGVuKChldmVudCkgewogICAgICBpZiAoZXZlbnRbMV0gIT0gbnVsbCkgewogICAgICAgIF9jb250cm9sbGVyLmFkZChldmVudFsxXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gX2NvbnRyb2xsZXIuc3RyZWFtOwogIH0KCiAgdm9pZCBfcGF0aFdhdGNoZWRFbmQoKSB7CiAgICBfc3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQpVaW50OExpc3QgX21ha2VVaW50OExpc3RWaWV3KFVpbnQ4TGlzdCBzb3VyY2UsIGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgbGVuZ3RoKSB7CiAgcmV0dXJuIG5ldyBVaW50OExpc3Qudmlldyhzb3VyY2UuYnVmZmVyLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwp9CoGnAE5OPAEgAQcOCVAJUAlNIAk+IAlAHAlEIAlKHAlOIAlIGglCJAlAIglPJQlAIglPJQlCGgk5AgEHHQkvLQIBGkAmIAEzPgE6AS0jJSZJMEslNy8hHzkCARUUFRQRNQIBBxsaARIzARYVGQEdAToBCSkxHE0GHksGHEoUBiNDBAFEGCVMBkwvBAFGARMXDB4XFD9KJhAIBhAKD04SG1AkDgYnQQYjGi8EARMgJhwlMBssCBsGKRoWEgYEAU4YMBkuGzQdATQbBAFENCkjFhcVKiA1OSweDBcKAR8kQkUMOwoBHkYjCgEpGk8TTwwKARgNGjcpGiMvMRgOKic8Rw48TQ5HTg46Ix40NhcgMUYtGS4SFysQDjxHDkFHJCsODCJPKB4nKjEMCjM3DxcIHBUIBAEJRgFETQFPPDAuLy0vLgIBPTcrATUqARclFEcqICoRJAoICAQBGBwEARomJ0oGIgQBGyYtHBsEAgE7JCABMyoBGiY7FE8iHiMPHQgIHwQBGxwZBAIBQyQgATsqARomPzsUUR4jDx0ICB8EARscGQQCASJQQwIBHWRhcnQ6aW8tcGF0Y2gvZmlsZV9wYXRjaC5kYXJ0MW9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9iaW4vZmlsdGVyX3BhdGNoLmRhcnSGri8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb21tb25fcGF0Y2guZGFydCI7CgpjbGFzcyBfRmlsdGVySW1wbCBleHRlbmRzIE5hdGl2ZUZpZWxkV3JhcHBlckNsYXNzMSBpbXBsZW1lbnRzIFJhd1pMaWJGaWx0ZXIgewogIHZvaWQgcHJvY2VzcyhMaXN0PGludD4gZGF0YSwgaW50IHN0YXJ0LCBpbnQgZW5kKSBuYXRpdmUgIkZpbHRlcl9Qcm9jZXNzIjsKCiAgTGlzdDxpbnQ+IHByb2Nlc3NlZCh7Ym9vbCBmbHVzaDogdHJ1ZSwgYm9vbCBlbmQ6IGZhbHNlfSkKICAgICAgbmF0aXZlICJGaWx0ZXJfUHJvY2Vzc2VkIjsKfQoKY2xhc3MgX1pMaWJJbmZsYXRlRmlsdGVyIGV4dGVuZHMgX0ZpbHRlckltcGwgewogIF9aTGliSW5mbGF0ZUZpbHRlcihpbnQgd2luZG93Qml0cywgTGlzdDxpbnQ+IGRpY3Rpb25hcnksIGJvb2wgcmF3KSB7CiAgICBfaW5pdCh3aW5kb3dCaXRzLCBkaWN0aW9uYXJ5LCByYXcpOwogIH0KICB2b2lkIF9pbml0KGludCB3aW5kb3dCaXRzLCBMaXN0PGludD4gZGljdGlvbmFyeSwgYm9vbCByYXcpCiAgICAgIG5hdGl2ZSAiRmlsdGVyX0NyZWF0ZVpMaWJJbmZsYXRlIjsKfQoKY2xhc3MgX1pMaWJEZWZsYXRlRmlsdGVyIGV4dGVuZHMgX0ZpbHRlckltcGwgewogIF9aTGliRGVmbGF0ZUZpbHRlcihib29sIGd6aXAsIGludCBsZXZlbCwgaW50IHdpbmRvd0JpdHMsIGludCBtZW1MZXZlbCwKICAgICAgaW50IHN0cmF0ZWd5LCBMaXN0PGludD4gZGljdGlvbmFyeSwgYm9vbCByYXcpIHsKICAgIF9pbml0KGd6aXAsIGxldmVsLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3ksIGRpY3Rpb25hcnksIHJhdyk7CiAgfQogIHZvaWQgX2luaXQoYm9vbCBnemlwLCBpbnQgbGV2ZWwsIGludCB3aW5kb3dCaXRzLCBpbnQgbWVtTGV2ZWwsIGludCBzdHJhdGVneSwKICAgICAgTGlzdDxpbnQ+IGRpY3Rpb25hcnksIGJvb2wgcmF3KSBuYXRpdmUgIkZpbHRlcl9DcmVhdGVaTGliRGVmbGF0ZSI7Cn0KCkBwYXRjaApjbGFzcyBSYXdaTGliRmlsdGVyIHsKICBAcGF0Y2gKICBzdGF0aWMgUmF3WkxpYkZpbHRlciBfbWFrZVpMaWJEZWZsYXRlRmlsdGVyKAogICAgICAgICAgYm9vbCBnemlwLAogICAgICAgICAgaW50IGxldmVsLAogICAgICAgICAgaW50IHdpbmRvd0JpdHMsCiAgICAgICAgICBpbnQgbWVtTGV2ZWwsCiAgICAgICAgICBpbnQgc3RyYXRlZ3ksCiAgICAgICAgICBMaXN0PGludD4gZGljdGlvbmFyeSwKICAgICAgICAgIGJvb2wgcmF3KSA9PgogICAgICBuZXcgX1pMaWJEZWZsYXRlRmlsdGVyKAogICAgICAgICAgZ3ppcCwgbGV2ZWwsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSwgZGljdGlvbmFyeSwgcmF3KTsKICBAcGF0Y2gKICBzdGF0aWMgUmF3WkxpYkZpbHRlciBfbWFrZVpMaWJJbmZsYXRlRmlsdGVyKAogICAgICAgICAgaW50IHdpbmRvd0JpdHMsIExpc3Q8aW50PiBkaWN0aW9uYXJ5LCBib29sIHJhdykgPT4KICAgICAgbmV3IF9aTGliSW5mbGF0ZUZpbHRlcih3aW5kb3dCaXRzLCBkaWN0aW9uYXJ5LCByYXcpOwp9CjIATk48ASABTkwBOyECAS9HKAQ9KQIBL0k2SQRPSQIBBxYJLxUVGhgYIBceSQkvPTsCAR9kYXJ0OmlvLXBhdGNoL2ZpbHRlcl9wYXRjaC5kYXJ0NW9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9iaW4vaW9fc2VydmljZV9wYXRjaC5kYXJ0i30vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29tbW9uX3BhdGNoLmRhcnQiOwoKY2xhc3MgX0lPU2VydmljZVBvcnRzIHsKICAvLyBXZSBsaW1pdCB0aGUgbnVtYmVyIG9mIElPIFNlcnZpY2UgcG9ydHMgcGVyIGlzb2xhdGUgc28gdGhhdCB3ZSBkb24ndAogIC8vIHNwYXduIHRvbyBtYW55IHRocmVhZHMgYWxsIGF0IG9uY2UsIHdoaWNoIGNhbiBjcmFzaCB0aGUgVk0gb24gV2luZG93cy4KICBzdGF0aWMgY29uc3QgaW50IG1heFBvcnRzID0gMzI7CiAgTGlzdDxTZW5kUG9ydD4gX3BvcnRzID0gPFNlbmRQb3J0PltdOwogIExpc3Q8U2VuZFBvcnQ+IF9mcmVlUG9ydHMgPSA8U2VuZFBvcnQ+W107CiAgTWFwPGludCwgU2VuZFBvcnQ+IF91c2VkUG9ydHMgPSBuZXcgSGFzaE1hcDxpbnQsIFNlbmRQb3J0PigpOwoKICBfSU9TZXJ2aWNlUG9ydHMoKTsKCiAgU2VuZFBvcnQgX2dldFBvcnQoaW50IGZvclJlcXVlc3RJZCkgewogICAgaWYgKF9mcmVlUG9ydHMuaXNFbXB0eSAmJiBfdXNlZFBvcnRzLmxlbmd0aCA8IG1heFBvcnRzKSB7CiAgICAgIGZpbmFsIFNlbmRQb3J0IHBvcnQgPSBfbmV3U2VydmljZVBvcnQoKTsKICAgICAgX3BvcnRzLmFkZChwb3J0KTsKICAgICAgX2ZyZWVQb3J0cy5hZGQocG9ydCk7CiAgICB9CiAgICBpZiAoIV9mcmVlUG9ydHMuaXNFbXB0eSkgewogICAgICBmaW5hbCBTZW5kUG9ydCBwb3J0ID0gX2ZyZWVQb3J0cy5yZW1vdmVMYXN0KCk7CiAgICAgIGFzc2VydCghX3VzZWRQb3J0cy5jb250YWluc0tleShmb3JSZXF1ZXN0SWQpKTsKICAgICAgX3VzZWRQb3J0c1tmb3JSZXF1ZXN0SWRdID0gcG9ydDsKICAgICAgcmV0dXJuIHBvcnQ7CiAgICB9CiAgICAvLyBXZSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHRoZSBtYXggbnVtYmVyIG9mIHBvcnRzLiBSZS11c2UgYW4KICAgIC8vIGV4aXN0aW5nIG9uZS4KICAgIGZpbmFsIFNlbmRQb3J0IHBvcnQgPSBfcG9ydHNbZm9yUmVxdWVzdElkICUgbWF4UG9ydHNdOwogICAgX3VzZWRQb3J0c1tmb3JSZXF1ZXN0SWRdID0gcG9ydDsKICAgIHJldHVybiBwb3J0OwogIH0KCiAgdm9pZCBfcmV0dXJuUG9ydChpbnQgZm9yUmVxdWVzdElkKSB7CiAgICBmaW5hbCBTZW5kUG9ydCBwb3J0ID0gX3VzZWRQb3J0cy5yZW1vdmUoZm9yUmVxdWVzdElkKTsKICAgIGlmICghX3VzZWRQb3J0cy52YWx1ZXMuY29udGFpbnMocG9ydCkpIHsKICAgICAgX2ZyZWVQb3J0cy5hZGQocG9ydCk7CiAgICB9CiAgfQoKICBzdGF0aWMgU2VuZFBvcnQgX25ld1NlcnZpY2VQb3J0KCkgbmF0aXZlICJJT1NlcnZpY2VfTmV3U2VydmljZVBvcnQiOwp9CgpAcGF0Y2gKY2xhc3MgX0lPU2VydmljZSB7CiAgc3RhdGljIF9JT1NlcnZpY2VQb3J0cyBfc2VydmljZVBvcnRzID0gbmV3IF9JT1NlcnZpY2VQb3J0cygpOwogIHN0YXRpYyBSYXdSZWNlaXZlUG9ydCBfcmVjZWl2ZVBvcnQ7CiAgc3RhdGljIFNlbmRQb3J0IF9yZXBseVRvUG9ydDsKICBzdGF0aWMgSGFzaE1hcDxpbnQsIENvbXBsZXRlcj4gX21lc3NhZ2VNYXAgPSBuZXcgSGFzaE1hcDxpbnQsIENvbXBsZXRlcj4oKTsKICBzdGF0aWMgaW50IF9pZCA9IDA7CgogIEBwYXRjaAogIHN0YXRpYyBGdXR1cmUgX2Rpc3BhdGNoKGludCByZXF1ZXN0LCBMaXN0IGRhdGEpIHsKICAgIGludCBpZDsKICAgIGRvIHsKICAgICAgaWQgPSBfZ2V0TmV4dElkKCk7CiAgICB9IHdoaWxlIChfbWVzc2FnZU1hcC5jb250YWluc0tleShpZCkpOwogICAgZmluYWwgU2VuZFBvcnQgc2VydmljZVBvcnQgPSBfc2VydmljZVBvcnRzLl9nZXRQb3J0KGlkKTsKICAgIF9lbnN1cmVJbml0aWFsaXplKCk7CiAgICBmaW5hbCBDb21wbGV0ZXIgY29tcGxldGVyID0gbmV3IENvbXBsZXRlcigpOwogICAgX21lc3NhZ2VNYXBbaWRdID0gY29tcGxldGVyOwogICAgdHJ5IHsKICAgICAgc2VydmljZVBvcnQuc2VuZChbaWQsIF9yZXBseVRvUG9ydCwgcmVxdWVzdCwgZGF0YV0pOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgX21lc3NhZ2VNYXAucmVtb3ZlKGlkKS5jb21wbGV0ZShlcnJvcik7CiAgICAgIGlmIChfbWVzc2FnZU1hcC5sZW5ndGggPT0gMCkgewogICAgICAgIF9maW5hbGl6ZSgpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gY29tcGxldGVyLmZ1dHVyZTsKICB9CgogIHN0YXRpYyB2b2lkIF9lbnN1cmVJbml0aWFsaXplKCkgewogICAgaWYgKF9yZWNlaXZlUG9ydCA9PSBudWxsKSB7CiAgICAgIF9yZWNlaXZlUG9ydCA9IG5ldyBSYXdSZWNlaXZlUG9ydCgpOwogICAgICBfcmVwbHlUb1BvcnQgPSBfcmVjZWl2ZVBvcnQuc2VuZFBvcnQ7CiAgICAgIF9yZWNlaXZlUG9ydC5oYW5kbGVyID0gKGRhdGEpIHsKICAgICAgICBhc3NlcnQoZGF0YSBpcyBMaXN0ICYmIGRhdGEubGVuZ3RoID09IDIpOwogICAgICAgIF9tZXNzYWdlTWFwLnJlbW92ZShkYXRhWzBdKS5jb21wbGV0ZShkYXRhWzFdKTsKICAgICAgICBfc2VydmljZVBvcnRzLl9yZXR1cm5Qb3J0KGRhdGFbMF0pOwogICAgICAgIGlmIChfbWVzc2FnZU1hcC5sZW5ndGggPT0gMCkgewogICAgICAgICAgX2ZpbmFsaXplKCk7CiAgICAgICAgfQogICAgICB9OwogICAgfQogIH0KCiAgc3RhdGljIHZvaWQgX2ZpbmFsaXplKCkgewogICAgX2lkID0gMDsKICAgIF9yZWNlaXZlUG9ydC5jbG9zZSgpOwogICAgX3JlY2VpdmVQb3J0ID0gbnVsbDsKICB9CgogIHN0YXRpYyBpbnQgX2dldE5leHRJZCgpIHsKICAgIGlmIChfaWQgPT0gMHg3RkZGRkZGRikgX2lkID0gMDsKICAgIHJldHVybiBfaWQrKzsKICB9Cn0KZgBOTjwBIAEYSkwiKCxAARUBKD4vGBwGHzU1JxMGRBU7JREEASc7LRwGBAFHAgEHE0AmIE4WAQk0DAkZKz0ZMSEKOxYuJRUIBh0EASQgKywmMjcsJxcKCQYEARwNGhkEARwkEgQCASNkYXJ0OmlvLXBhdGNoL2lvX3NlcnZpY2VfcGF0Y2guZGFydDRvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvYmluL25hbWVzcGFjZV9wYXRjaC5kYXJ0hlsvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfTmFtZXNwYWNlSW1wbCBleHRlbmRzIE5hdGl2ZUZpZWxkV3JhcHBlckNsYXNzMSBpbXBsZW1lbnRzIF9OYW1lc3BhY2UgewogIF9OYW1lc3BhY2VJbXBsLl8oKTsKCiAgc3RhdGljIF9OYW1lc3BhY2VJbXBsIF9jcmVhdGUoX05hbWVzcGFjZUltcGwgbmFtZXNwYWNlLCB2YXIgbikKICAgICAgbmF0aXZlICJOYW1lc3BhY2VfQ3JlYXRlIjsKICBzdGF0aWMgaW50IF9nZXRQb2ludGVyKF9OYW1lc3BhY2VJbXBsIG5hbWVzcGFjZSkKICAgICAgbmF0aXZlICJOYW1lc3BhY2VfR2V0UG9pbnRlciI7CiAgc3RhdGljIGludCBfZ2V0RGVmYXVsdCgpIG5hdGl2ZSAiTmFtZXNwYWNlX0dldERlZmF1bHQiOwoKICAvLyBJZiB0aGUgcGxhdGZvcm0gc3VwcG9ydHMgIm5hbWVzcGFjZXMiLCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlCiAgLy8gZW1iZWRkZXIgd2l0aCB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgbmFtZXNwYWNlIGluZm9ybWF0aW9uLgogIHN0YXRpYyBfTmFtZXNwYWNlSW1wbCBfY2FjaGVkTmFtZXNwYWNlID0gbnVsbDsKICBzdGF0aWMgdm9pZCBfc2V0dXBOYW1lc3BhY2UodmFyIG5hbWVzcGFjZSkgewogICAgX2NhY2hlZE5hbWVzcGFjZSA9IF9jcmVhdGUobmV3IF9OYW1lc3BhY2VJbXBsLl8oKSwgbmFtZXNwYWNlKTsKICB9CgogIHN0YXRpYyBfTmFtZXNwYWNlSW1wbCBnZXQgX25hbWVzcGFjZSB7CiAgICBpZiAoX2NhY2hlZE5hbWVzcGFjZSA9PSBudWxsKSB7CiAgICAgIC8vIFRoZSBlbWJlZGRlciBoYXMgbm90IHN1cHBsaWVkIGEgbmFtZXNwYWNlIGJlZm9yZSBvbmUgaXMgbmVlZGVkLCBzbwogICAgICAvLyBpbnN0ZWFkIHVzZSBhIHNhZmUtaXNoIGRlZmF1bHQgdmFsdWUuCiAgICAgIF9jYWNoZWROYW1lc3BhY2UgPSBfY3JlYXRlKG5ldyBfTmFtZXNwYWNlSW1wbC5fKCksIF9nZXREZWZhdWx0KCkpOwogICAgfQogICAgcmV0dXJuIF9jYWNoZWROYW1lc3BhY2U7CiAgfQoKICBzdGF0aWMgaW50IGdldCBfbmFtZXNwYWNlUG9pbnRlciA9PiBfZ2V0UG9pbnRlcihfbmFtZXNwYWNlKTsKfQoKQHBhdGNoCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX05hbWVzcGFjZSB7CiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCiAgc3RhdGljIHZvaWQgX3NldHVwTmFtZXNwYWNlKHZhciBuYW1lc3BhY2UpIHsKICAgIF9OYW1lc3BhY2VJbXBsLl9zZXR1cE5hbWVzcGFjZShuYW1lc3BhY2UpOwogIH0KCiAgQHBhdGNoCiAgc3RhdGljIF9OYW1lc3BhY2UgZ2V0IF9uYW1lc3BhY2UgPT4gX05hbWVzcGFjZUltcGwuX25hbWVzcGFjZTsKCiAgQHBhdGNoCiAgc3RhdGljIGludCBnZXQgX25hbWVzcGFjZVBvaW50ZXIgPT4gX05hbWVzcGFjZUltcGwuX25hbWVzcGFjZVBvaW50ZXI7Cn0KMgBOTjwBGk4WAUEhMyU6AUlAMS9DBAEpJEwvSQYdBAE/AgEHGhMJJC8vBAEJQQEJSAIBImRhcnQ6aW8tcGF0Y2gvbmFtZXNwYWNlX3BhdGNoLmRhcnQyb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2Jpbi9wcm9jZXNzX3BhdGNoLmRhcnTAAEo/Ly8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvbW1vbl9wYXRjaC5kYXJ0IjsKCkBwYXRjaApjbGFzcyBfV2luZG93c0NvZGVQYWdlRGVjb2RlciB7CiAgQHBhdGNoCiAgc3RhdGljIFN0cmluZyBfZGVjb2RlQnl0ZXMoTGlzdDxpbnQ+IGJ5dGVzKSBuYXRpdmUgIlN5c3RlbUVuY29kaW5nVG9TdHJpbmciOwp9CgpAcGF0Y2gKY2xhc3MgX1dpbmRvd3NDb2RlUGFnZUVuY29kZXIgewogIEBwYXRjaAogIHN0YXRpYyBMaXN0PGludD4gX2VuY29kZVN0cmluZyhTdHJpbmcgc3RyaW5nKSBuYXRpdmUgIlN0cmluZ1RvU3lzdGVtRW5jb2RpbmciOwp9CgpAcGF0Y2gKY2xhc3MgUHJvY2VzcyB7CiAgQHBhdGNoCiAgc3RhdGljIEZ1dHVyZTxQcm9jZXNzPiBzdGFydChTdHJpbmcgZXhlY3V0YWJsZSwgTGlzdDxTdHJpbmc+IGFyZ3VtZW50cywKICAgICAge1N0cmluZyB3b3JraW5nRGlyZWN0b3J5LAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50LAogICAgICBib29sIGluY2x1ZGVQYXJlbnRFbnZpcm9ubWVudDogdHJ1ZSwKICAgICAgYm9vbCBydW5JblNoZWxsOiBmYWxzZSwKICAgICAgUHJvY2Vzc1N0YXJ0TW9kZSBtb2RlOiBQcm9jZXNzU3RhcnRNb2RlLm5vcm1hbH0pIHsKICAgIF9Qcm9jZXNzSW1wbCBwcm9jZXNzID0gbmV3IF9Qcm9jZXNzSW1wbCgKICAgICAgICBleGVjdXRhYmxlLAogICAgICAgIGFyZ3VtZW50cywKICAgICAgICB3b3JraW5nRGlyZWN0b3J5LAogICAgICAgIGVudmlyb25tZW50LAogICAgICAgIGluY2x1ZGVQYXJlbnRFbnZpcm9ubWVudCwKICAgICAgICBydW5JblNoZWxsLAogICAgICAgIG1vZGUpOwogICAgcmV0dXJuIHByb2Nlc3MuX3N0YXJ0KCk7CiAgfQoKICBAcGF0Y2gKICBzdGF0aWMgRnV0dXJlPFByb2Nlc3NSZXN1bHQ+IHJ1bihTdHJpbmcgZXhlY3V0YWJsZSwgTGlzdDxTdHJpbmc+IGFyZ3VtZW50cywKICAgICAge1N0cmluZyB3b3JraW5nRGlyZWN0b3J5LAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50LAogICAgICBib29sIGluY2x1ZGVQYXJlbnRFbnZpcm9ubWVudDogdHJ1ZSwKICAgICAgYm9vbCBydW5JblNoZWxsOiBmYWxzZSwKICAgICAgRW5jb2Rpbmcgc3Rkb3V0RW5jb2Rpbmc6IHN5c3RlbUVuY29kaW5nLAogICAgICBFbmNvZGluZyBzdGRlcnJFbmNvZGluZzogc3lzdGVtRW5jb2Rpbmd9KSB7CiAgICByZXR1cm4gX3J1bk5vbkludGVyYWN0aXZlUHJvY2VzcygKICAgICAgICBleGVjdXRhYmxlLAogICAgICAgIGFyZ3VtZW50cywKICAgICAgICB3b3JraW5nRGlyZWN0b3J5LAogICAgICAgIGVudmlyb25tZW50LAogICAgICAgIGluY2x1ZGVQYXJlbnRFbnZpcm9ubWVudCwKICAgICAgICBydW5JblNoZWxsLAogICAgICAgIHN0ZG91dEVuY29kaW5nLAogICAgICAgIHN0ZGVyckVuY29kaW5nKTsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBQcm9jZXNzUmVzdWx0IHJ1blN5bmMoU3RyaW5nIGV4ZWN1dGFibGUsIExpc3Q8U3RyaW5nPiBhcmd1bWVudHMsCiAgICAgIHtTdHJpbmcgd29ya2luZ0RpcmVjdG9yeSwKICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudCwKICAgICAgYm9vbCBpbmNsdWRlUGFyZW50RW52aXJvbm1lbnQ6IHRydWUsCiAgICAgIGJvb2wgcnVuSW5TaGVsbDogZmFsc2UsCiAgICAgIEVuY29kaW5nIHN0ZG91dEVuY29kaW5nOiBzeXN0ZW1FbmNvZGluZywKICAgICAgRW5jb2Rpbmcgc3RkZXJyRW5jb2Rpbmc6IHN5c3RlbUVuY29kaW5nfSkgewogICAgcmV0dXJuIF9ydW5Ob25JbnRlcmFjdGl2ZVByb2Nlc3NTeW5jKAogICAgICAgIGV4ZWN1dGFibGUsCiAgICAgICAgYXJndW1lbnRzLAogICAgICAgIHdvcmtpbmdEaXJlY3RvcnksCiAgICAgICAgZW52aXJvbm1lbnQsCiAgICAgICAgaW5jbHVkZVBhcmVudEVudmlyb25tZW50LAogICAgICAgIHJ1bkluU2hlbGwsCiAgICAgICAgc3Rkb3V0RW5jb2RpbmcsCiAgICAgICAgc3RkZXJyRW5jb2RpbmcpOwogIH0KCiAgQHBhdGNoCiAgc3RhdGljIGJvb2wga2lsbFBpZChpbnQgcGlkLCBbUHJvY2Vzc1NpZ25hbCBzaWduYWwgPSBQcm9jZXNzU2lnbmFsLnNpZ3Rlcm1dKSB7CiAgICBpZiAoc2lnbmFsIGlzISBQcm9jZXNzU2lnbmFsKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJBcmd1bWVudCAnc2lnbmFsJyBtdXN0IGJlIGEgUHJvY2Vzc1NpZ25hbCIpOwogICAgfQogICAgcmV0dXJuIF9Qcm9jZXNzVXRpbHMuX2tpbGxQaWQocGlkLCBzaWduYWwuX3NpZ25hbE51bWJlcik7CiAgfQp9CgpMaXN0PF9TaWduYWxDb250cm9sbGVyPiBfc2lnbmFsQ29udHJvbGxlcnMgPSBuZXcgTGlzdCgzMik7CgpjbGFzcyBfU2lnbmFsQ29udHJvbGxlciB7CiAgZmluYWwgUHJvY2Vzc1NpZ25hbCBzaWduYWw7CgogIFN0cmVhbUNvbnRyb2xsZXI8UHJvY2Vzc1NpZ25hbD4gX2NvbnRyb2xsZXI7CiAgdmFyIF9pZDsKCiAgX1NpZ25hbENvbnRyb2xsZXIodGhpcy5zaWduYWwpIHsKICAgIF9jb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8UHJvY2Vzc1NpZ25hbD4uYnJvYWRjYXN0KAogICAgICAgIG9uTGlzdGVuOiBfbGlzdGVuLCBvbkNhbmNlbDogX2NhbmNlbCk7CiAgfQoKICBTdHJlYW08UHJvY2Vzc1NpZ25hbD4gZ2V0IHN0cmVhbSA9PiBfY29udHJvbGxlci5zdHJlYW07CgogIHZvaWQgX2xpc3RlbigpIHsKICAgIHZhciBpZCA9IF9zZXRTaWduYWxIYW5kbGVyKHNpZ25hbC5fc2lnbmFsTnVtYmVyKTsKICAgIGlmIChpZCBpcyEgaW50KSB7CiAgICAgIF9jb250cm9sbGVyCiAgICAgICAgICAuYWRkRXJyb3IobmV3IFNpZ25hbEV4Y2VwdGlvbigiRmFpbGVkIHRvIGxpc3RlbiBmb3IgJHNpZ25hbCIsIGlkKSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIF9pZCA9IGlkOwogICAgdmFyIHNvY2tldCA9IG5ldyBfUmF3U29ja2V0KG5ldyBfTmF0aXZlU29ja2V0LndhdGNoU2lnbmFsKGlkKSk7CiAgICBzb2NrZXQubGlzdGVuKChldmVudCkgewogICAgICBpZiAoZXZlbnQgPT0gUmF3U29ja2V0RXZlbnQucmVhZCkgewogICAgICAgIHZhciBieXRlcyA9IHNvY2tldC5yZWFkKCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgX2NvbnRyb2xsZXIuYWRkKHNpZ25hbCk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9CgogIHZvaWQgX2NhbmNlbCgpIHsKICAgIGlmIChfaWQgIT0gbnVsbCkgewogICAgICBfY2xlYXJTaWduYWxIYW5kbGVyKHNpZ25hbC5fc2lnbmFsTnVtYmVyKTsKICAgICAgX2lkID0gbnVsbDsKICAgIH0KICB9CgogIHN0YXRpYyBfc2V0U2lnbmFsSGFuZGxlcihpbnQgc2lnbmFsKSBuYXRpdmUgIlByb2Nlc3NfU2V0U2lnbmFsSGFuZGxlciI7CiAgc3RhdGljIGludCBfY2xlYXJTaWduYWxIYW5kbGVyKGludCBzaWduYWwpCiAgICAgIG5hdGl2ZSAiUHJvY2Vzc19DbGVhclNpZ25hbEhhbmRsZXIiOwp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKRnVuY3Rpb24gX2dldFdhdGNoU2lnbmFsSW50ZXJuYWwoKSA9PiBfUHJvY2Vzc1V0aWxzLl93YXRjaFNpZ25hbEludGVybmFsOwoKQHBhdGNoCmNsYXNzIF9Qcm9jZXNzVXRpbHMgewogIEBwYXRjaAogIHN0YXRpYyB2b2lkIF9leGl0KGludCBzdGF0dXMpIG5hdGl2ZSAiUHJvY2Vzc19FeGl0IjsKICBAcGF0Y2gKICBzdGF0aWMgdm9pZCBfc2V0RXhpdENvZGUoaW50IHN0YXR1cykgbmF0aXZlICJQcm9jZXNzX1NldEV4aXRDb2RlIjsKICBAcGF0Y2gKICBzdGF0aWMgaW50IF9nZXRFeGl0Q29kZSgpIG5hdGl2ZSAiUHJvY2Vzc19HZXRFeGl0Q29kZSI7CiAgQHBhdGNoCiAgc3RhdGljIHZvaWQgX3NsZWVwKGludCBtaWxsaXMpIG5hdGl2ZSAiUHJvY2Vzc19TbGVlcCI7CiAgQHBhdGNoCiAgc3RhdGljIGludCBfcGlkKFByb2Nlc3MgcHJvY2VzcykgbmF0aXZlICJQcm9jZXNzX1BpZCI7CiAgc3RhdGljIGJvb2wgX2tpbGxQaWQoaW50IHBpZCwgaW50IHNpZ25hbCkgbmF0aXZlICJQcm9jZXNzX0tpbGxQaWQiOwogIEBwYXRjaAogIHN0YXRpYyBTdHJlYW08UHJvY2Vzc1NpZ25hbD4gX3dhdGNoU2lnbmFsKFByb2Nlc3NTaWduYWwgc2lnbmFsKSB7CiAgICBpZiAoc2lnbmFsICE9IFByb2Nlc3NTaWduYWwuc2lnaHVwICYmCiAgICAgICAgc2lnbmFsICE9IFByb2Nlc3NTaWduYWwuc2lnaW50ICYmCiAgICAgICAgc2lnbmFsICE9IFByb2Nlc3NTaWduYWwuc2lndGVybSAmJgogICAgICAgIChQbGF0Zm9ybS5pc1dpbmRvd3MgfHwKICAgICAgICAgICAgKHNpZ25hbCAhPSBQcm9jZXNzU2lnbmFsLnNpZ3VzcjEgJiYKICAgICAgICAgICAgICAgIHNpZ25hbCAhPSBQcm9jZXNzU2lnbmFsLnNpZ3VzcjIgJiYKICAgICAgICAgICAgICAgIHNpZ25hbCAhPSBQcm9jZXNzU2lnbmFsLnNpZ3dpbmNoKSkpIHsKICAgICAgdGhyb3cgbmV3IFNpZ25hbEV4Y2VwdGlvbigKICAgICAgICAgICJMaXN0ZW5pbmcgZm9yIHNpZ25hbCAkc2lnbmFsIGlzIG5vdCBzdXBwb3J0ZWQiKTsKICAgIH0KICAgIHJldHVybiBfd2F0Y2hTaWduYWxJbnRlcm5hbChzaWduYWwpOwogIH0KCiAgc3RhdGljIFN0cmVhbTxQcm9jZXNzU2lnbmFsPiBfd2F0Y2hTaWduYWxJbnRlcm5hbChQcm9jZXNzU2lnbmFsIHNpZ25hbCkgewogICAgaWYgKF9zaWduYWxDb250cm9sbGVyc1tzaWduYWwuX3NpZ25hbE51bWJlcl0gPT0gbnVsbCkgewogICAgICBfc2lnbmFsQ29udHJvbGxlcnNbc2lnbmFsLl9zaWduYWxOdW1iZXJdID0gbmV3IF9TaWduYWxDb250cm9sbGVyKHNpZ25hbCk7CiAgICB9CiAgICByZXR1cm4gX3NpZ25hbENvbnRyb2xsZXJzW3NpZ25hbC5fc2lnbmFsTnVtYmVyXS5zdHJlYW07CiAgfQp9CgpAcGF0Y2gKY2xhc3MgUHJvY2Vzc0luZm8gewogIEBwYXRjaAogIHN0YXRpYyBpbnQgZ2V0IG1heFJzcyB7CiAgICB2YXIgcmVzdWx0ID0gX21heFJzcygpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IHJlc3VsdDsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAcGF0Y2gKICBzdGF0aWMgaW50IGdldCBjdXJyZW50UnNzIHsKICAgIHZhciByZXN1bHQgPSBfY3VycmVudFJzcygpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IHJlc3VsdDsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMgX21heFJzcygpIG5hdGl2ZSAiUHJvY2Vzc0luZm9fTWF4UlNTIjsKICBzdGF0aWMgX2N1cnJlbnRSc3MoKSBuYXRpdmUgIlByb2Nlc3NJbmZvX0N1cnJlbnRSU1MiOwp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9Qcm9jZXNzU3RhcnRTdGF0dXMgewogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgInNldCIpCiAgaW50IF9lcnJvckNvZGU7IC8vIFNldCB0byBPUyBlcnJvciBjb2RlIGlmIHByb2Nlc3Mgc3RhcnQgZmFpbGVkLgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgInNldCIpCiAgU3RyaW5nIF9lcnJvck1lc3NhZ2U7IC8vIFNldCB0byBPUyBlcnJvciBtZXNzYWdlIGlmIHByb2Nlc3Mgc3RhcnQgZmFpbGVkLgp9CgovLyBUaGUgTmF0aXZlRmllbGRXcmFwcGVyQ2xhc3MxIGNhbiBub3QgYmUgdXNlZCB3aXRoIGEgbWl4aW4sIGR1ZSB0byBtaXNzaW5nCi8vIGltcGxpY2l0IGNvbnN0cnVjdG9yLgpjbGFzcyBfUHJvY2Vzc0ltcGxOYXRpdmVXcmFwcGVyIGV4dGVuZHMgTmF0aXZlRmllbGRXcmFwcGVyQ2xhc3MxIHt9CgpjbGFzcyBfUHJvY2Vzc0ltcGwgZXh0ZW5kcyBfUHJvY2Vzc0ltcGxOYXRpdmVXcmFwcGVyIGltcGxlbWVudHMgUHJvY2VzcyB7CiAgX1Byb2Nlc3NSZXNvdXJjZUluZm8gX3Jlc291cmNlSW5mbzsKICBzdGF0aWMgYm9vbCBjb25uZWN0ZWRSZXNvdXJjZUhhbmRsZXIgPSBmYWxzZTsKCiAgX1Byb2Nlc3NJbXBsKAogICAgICBTdHJpbmcgcGF0aCwKICAgICAgTGlzdDxTdHJpbmc+IGFyZ3VtZW50cywKICAgICAgdGhpcy5fd29ya2luZ0RpcmVjdG9yeSwKICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudCwKICAgICAgYm9vbCBpbmNsdWRlUGFyZW50RW52aXJvbm1lbnQsCiAgICAgIGJvb2wgcnVuSW5TaGVsbCwKICAgICAgUHJvY2Vzc1N0YXJ0TW9kZSBtb2RlKQogICAgICA6IHN1cGVyKCkgewogICAgaWYgKCFjb25uZWN0ZWRSZXNvdXJjZUhhbmRsZXIpIHsKICAgICAgcmVnaXN0ZXJFeHRlbnNpb24oCiAgICAgICAgICAnZXh0LmRhcnQuaW8uZ2V0UHJvY2Vzc2VzJywgX1Byb2Nlc3NSZXNvdXJjZUluZm8uZ2V0U3RhcnRlZFByb2Nlc3Nlcyk7CiAgICAgIHJlZ2lzdGVyRXh0ZW5zaW9uKCdleHQuZGFydC5pby5nZXRQcm9jZXNzQnlJZCcsCiAgICAgICAgICBfUHJvY2Vzc1Jlc291cmNlSW5mby5nZXRQcm9jZXNzSW5mb01hcEJ5SWQpOwogICAgICBjb25uZWN0ZWRSZXNvdXJjZUhhbmRsZXIgPSB0cnVlOwogICAgfQoKICAgIGlmIChydW5JblNoZWxsKSB7CiAgICAgIGFyZ3VtZW50cyA9IF9nZXRTaGVsbEFyZ3VtZW50cyhwYXRoLCBhcmd1bWVudHMpOwogICAgICBwYXRoID0gX2dldFNoZWxsQ29tbWFuZCgpOwogICAgfQoKICAgIGlmIChwYXRoIGlzISBTdHJpbmcpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIlBhdGggaXMgbm90IGEgU3RyaW5nOiAkcGF0aCIpOwogICAgfQogICAgX3BhdGggPSBwYXRoOwoKICAgIGlmIChhcmd1bWVudHMgaXMhIExpc3QpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkFyZ3VtZW50cyBpcyBub3QgYSBMaXN0OiAkYXJndW1lbnRzIik7CiAgICB9CiAgICBpbnQgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsKICAgIF9hcmd1bWVudHMgPSBuZXcgTGlzdDxTdHJpbmc+KGxlbik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIHZhciBhcmcgPSBhcmd1bWVudHNbaV07CiAgICAgIGlmIChhcmcgaXMhIFN0cmluZykgewogICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJOb24tc3RyaW5nIGFyZ3VtZW50OiAkYXJnIik7CiAgICAgIH0KICAgICAgX2FyZ3VtZW50c1tpXSA9IGFyZ3VtZW50c1tpXTsKICAgICAgaWYgKFBsYXRmb3JtLmlzV2luZG93cykgewogICAgICAgIF9hcmd1bWVudHNbaV0gPSBfd2luZG93c0FyZ3VtZW50RXNjYXBlKF9hcmd1bWVudHNbaV0pOwogICAgICB9CiAgICB9CgogICAgaWYgKF93b3JraW5nRGlyZWN0b3J5ICE9IG51bGwgJiYgX3dvcmtpbmdEaXJlY3RvcnkgaXMhIFN0cmluZykgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigKICAgICAgICAgICJXb3JraW5nRGlyZWN0b3J5IGlzIG5vdCBhIFN0cmluZzogJF93b3JraW5nRGlyZWN0b3J5Iik7CiAgICB9CgogICAgX2Vudmlyb25tZW50ID0gW107CiAgICAvLyBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgbm9uLW51bGwgZW52aXJvbm1lbnQuCiAgICBlbnZpcm9ubWVudCA9IChlbnZpcm9ubWVudCA9PSBudWxsKSA/IChjb25zdCB7fSkgOiBlbnZpcm9ubWVudDsKICAgIGlmIChlbnZpcm9ubWVudCBpcyEgTWFwKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJFbnZpcm9ubWVudCBpcyBub3QgYSBtYXA6ICRlbnZpcm9ubWVudCIpOwogICAgfQogICAgZW52aXJvbm1lbnQuZm9yRWFjaCgoa2V5LCB2YWx1ZSkgewogICAgICBpZiAoa2V5IGlzISBTdHJpbmcgfHwgdmFsdWUgaXMhIFN0cmluZykgewogICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKAogICAgICAgICAgICAiRW52aXJvbm1lbnQga2V5IG9yIHZhbHVlIGlzIG5vdCBhIHN0cmluZzogKCRrZXksICR2YWx1ZSkiKTsKICAgICAgfQogICAgICBfZW52aXJvbm1lbnQuYWRkKCcka2V5PSR2YWx1ZScpOwogICAgfSk7CiAgICBpZiAoaW5jbHVkZVBhcmVudEVudmlyb25tZW50KSB7CiAgICAgIFBsYXRmb3JtLmVudmlyb25tZW50LmZvckVhY2goKGtleSwgdmFsdWUpIHsKICAgICAgICBhc3NlcnQoa2V5IGlzIFN0cmluZyk7CiAgICAgICAgYXNzZXJ0KHZhbHVlIGlzIFN0cmluZyk7CiAgICAgICAgLy8gRG8gbm90IG92ZXJyaWRlIGtleXMgYWxyZWFkeSBzZXQgYXMgcGFydCBvZiBlbnZpcm9ubWVudC4KICAgICAgICBpZiAoIWVudmlyb25tZW50LmNvbnRhaW5zS2V5KGtleSkpIHsKICAgICAgICAgIF9lbnZpcm9ubWVudC5hZGQoJyRrZXk9JHZhbHVlJyk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgICBpZiAobW9kZSBpcyEgUHJvY2Vzc1N0YXJ0TW9kZSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiTW9kZSBpcyBub3QgYSBQcm9jZXNzU3RhcnRNb2RlOiAkbW9kZSIpOwogICAgfQogICAgX21vZGUgPSBtb2RlOwoKICAgIGlmIChfbW9kZUhhc1N0ZGlvKG1vZGUpKSB7CiAgICAgIC8vIHN0ZGluIGdvaW5nIHRvIHByb2Nlc3MuCiAgICAgIF9zdGRpbiA9IG5ldyBfU3RkU2luayhuZXcgX1NvY2tldC5fd3JpdGVQaXBlKCkuLl9vd25lciA9IHRoaXMpOwogICAgICAvLyBzdGRvdXQgY29taW5nIGZyb20gcHJvY2Vzcy4KICAgICAgX3N0ZG91dCA9IG5ldyBfU3RkU3RyZWFtKG5ldyBfU29ja2V0Ll9yZWFkUGlwZSgpLi5fb3duZXIgPSB0aGlzKTsKICAgICAgLy8gc3RkZXJyIGNvbWluZyBmcm9tIHByb2Nlc3MuCiAgICAgIF9zdGRlcnIgPSBuZXcgX1N0ZFN0cmVhbShuZXcgX1NvY2tldC5fcmVhZFBpcGUoKS4uX293bmVyID0gdGhpcyk7CiAgICB9CiAgICBpZiAoX21vZGVJc0F0dGFjaGVkKG1vZGUpKSB7CiAgICAgIF9leGl0SGFuZGxlciA9IG5ldyBfU29ja2V0Ll9yZWFkUGlwZSgpOwogICAgfQogICAgX2VuZGVkID0gZmFsc2U7CiAgICBfc3RhcnRlZCA9IGZhbHNlOwogIH0KCiAgX05hdGl2ZVNvY2tldCBnZXQgX3N0ZGluTmF0aXZlU29ja2V0ID0+CiAgICAgIChfc3RkaW4uX3NpbmsgYXMgX1NvY2tldCkuX25hdGl2ZVNvY2tldDsKICBfTmF0aXZlU29ja2V0IGdldCBfc3Rkb3V0TmF0aXZlU29ja2V0ID0+CiAgICAgIChfc3Rkb3V0Ll9zdHJlYW0gYXMgX1NvY2tldCkuX25hdGl2ZVNvY2tldDsKICBfTmF0aXZlU29ja2V0IGdldCBfc3RkZXJyTmF0aXZlU29ja2V0ID0+CiAgICAgIChfc3RkZXJyLl9zdHJlYW0gYXMgX1NvY2tldCkuX25hdGl2ZVNvY2tldDsKCiAgc3RhdGljIGJvb2wgX21vZGVJc0F0dGFjaGVkKFByb2Nlc3NTdGFydE1vZGUgbW9kZSkgewogICAgcmV0dXJuIChtb2RlID09IFByb2Nlc3NTdGFydE1vZGUubm9ybWFsKSB8fAogICAgICAgIChtb2RlID09IFByb2Nlc3NTdGFydE1vZGUuaW5oZXJpdFN0ZGlvKTsKICB9CgogIHN0YXRpYyBib29sIF9tb2RlSGFzU3RkaW8oUHJvY2Vzc1N0YXJ0TW9kZSBtb2RlKSB7CiAgICByZXR1cm4gKG1vZGUgPT0gUHJvY2Vzc1N0YXJ0TW9kZS5ub3JtYWwpIHx8CiAgICAgICAgKG1vZGUgPT0gUHJvY2Vzc1N0YXJ0TW9kZS5kZXRhY2hlZFdpdGhTdGRpbyk7CiAgfQoKICBzdGF0aWMgU3RyaW5nIF9nZXRTaGVsbENvbW1hbmQoKSB7CiAgICBpZiAoUGxhdGZvcm0uaXNXaW5kb3dzKSB7CiAgICAgIHJldHVybiAnY21kLmV4ZSc7CiAgICB9CiAgICByZXR1cm4gJy9iaW4vc2gnOwogIH0KCiAgc3RhdGljIExpc3Q8U3RyaW5nPiBfZ2V0U2hlbGxBcmd1bWVudHMoCiAgICAgIFN0cmluZyBleGVjdXRhYmxlLCBMaXN0PFN0cmluZz4gYXJndW1lbnRzKSB7CiAgICBMaXN0PFN0cmluZz4gc2hlbGxBcmd1bWVudHMgPSBbXTsKICAgIGlmIChQbGF0Zm9ybS5pc1dpbmRvd3MpIHsKICAgICAgc2hlbGxBcmd1bWVudHMuYWRkKCcvYycpOwogICAgICBzaGVsbEFyZ3VtZW50cy5hZGQoZXhlY3V0YWJsZSk7CiAgICAgIGZvciAodmFyIGFyZyBpbiBhcmd1bWVudHMpIHsKICAgICAgICBzaGVsbEFyZ3VtZW50cy5hZGQoYXJnKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdmFyIGNvbW1hbmRMaW5lID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICBleGVjdXRhYmxlID0gZXhlY3V0YWJsZS5yZXBsYWNlQWxsKCInIiwgIidcIidcIiciKTsKICAgICAgY29tbWFuZExpbmUud3JpdGUoIickZXhlY3V0YWJsZSciKTsKICAgICAgc2hlbGxBcmd1bWVudHMuYWRkKCItYyIpOwogICAgICBmb3IgKHZhciBhcmcgaW4gYXJndW1lbnRzKSB7CiAgICAgICAgYXJnID0gYXJnLnJlcGxhY2VBbGwoIiciLCAiJ1wiJ1wiJyIpOwogICAgICAgIGNvbW1hbmRMaW5lLndyaXRlKCIgJyRhcmcnIik7CiAgICAgIH0KICAgICAgc2hlbGxBcmd1bWVudHMuYWRkKGNvbW1hbmRMaW5lLnRvU3RyaW5nKCkpOwogICAgfQogICAgcmV0dXJuIHNoZWxsQXJndW1lbnRzOwogIH0KCiAgU3RyaW5nIF93aW5kb3dzQXJndW1lbnRFc2NhcGUoU3RyaW5nIGFyZ3VtZW50KSB7CiAgICB2YXIgcmVzdWx0ID0gYXJndW1lbnQ7CiAgICBpZiAoYXJndW1lbnQuY29udGFpbnMoJ1x0JykgfHwKICAgICAgICBhcmd1bWVudC5jb250YWlucygnICcpIHx8CiAgICAgICAgYXJndW1lbnQuY29udGFpbnMoJyInKSkgewogICAgICAvLyBQcm9kdWNlIHNvbWV0aGluZyB0aGF0IHRoZSBDIHJ1bnRpbWUgb24gV2luZG93cyB3aWxsIHBhcnNlCiAgICAgIC8vIGJhY2sgYXMgdGhpcyBzdHJpbmcuCgogICAgICAvLyBSZXBsYWNlIGFueSBudW1iZXIgb2YgJ1wnIGZvbGxvd2VkIGJ5ICciJyB3aXRoCiAgICAgIC8vIHR3aWNlIGFzIG1hbnkgJ1wnIGZvbGxvd2VkIGJ5ICdcIicuCiAgICAgIHZhciBiYWNrc2xhc2ggPSAnXFwnLmNvZGVVbml0QXQoMCk7CiAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgdmFyIG5leHRQb3MgPSAwOwogICAgICB2YXIgcXVvdGVQb3MgPSBhcmd1bWVudC5pbmRleE9mKCciJywgbmV4dFBvcyk7CiAgICAgIHdoaWxlIChxdW90ZVBvcyAhPSAtMSkgewogICAgICAgIHZhciBudW1CYWNrc2xhc2ggPSAwOwogICAgICAgIHZhciBwb3MgPSBxdW90ZVBvcyAtIDE7CiAgICAgICAgd2hpbGUgKHBvcyA+PSAwICYmIGFyZ3VtZW50LmNvZGVVbml0QXQocG9zKSA9PSBiYWNrc2xhc2gpIHsKICAgICAgICAgIG51bUJhY2tzbGFzaCsrOwogICAgICAgICAgcG9zLS07CiAgICAgICAgfQogICAgICAgIHNiLndyaXRlKGFyZ3VtZW50LnN1YnN0cmluZyhuZXh0UG9zLCBxdW90ZVBvcyAtIG51bUJhY2tzbGFzaCkpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtQmFja3NsYXNoOyBpKyspIHsKICAgICAgICAgIHNiLndyaXRlKHInXFwnKTsKICAgICAgICB9CiAgICAgICAgc2Iud3JpdGUocidcIicpOwogICAgICAgIG5leHRQb3MgPSBxdW90ZVBvcyArIDE7CiAgICAgICAgcXVvdGVQb3MgPSBhcmd1bWVudC5pbmRleE9mKCciJywgbmV4dFBvcyk7CiAgICAgIH0KICAgICAgc2Iud3JpdGUoYXJndW1lbnQuc3Vic3RyaW5nKG5leHRQb3MsIGFyZ3VtZW50Lmxlbmd0aCkpOwogICAgICByZXN1bHQgPSBzYi50b1N0cmluZygpOwoKICAgICAgLy8gQWRkICciJyBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgYW5kIHJlcGxhY2UgYWxsICdcJyBhdAogICAgICAvLyB0aGUgZW5kIHdpdGggdHdvICdcJy4KICAgICAgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCciJyk7CiAgICAgIHNiLndyaXRlKHJlc3VsdCk7CiAgICAgIG5leHRQb3MgPSBhcmd1bWVudC5sZW5ndGggLSAxOwogICAgICB3aGlsZSAoYXJndW1lbnQuY29kZVVuaXRBdChuZXh0UG9zKSA9PSBiYWNrc2xhc2gpIHsKICAgICAgICBzYi53cml0ZSgnXFwnKTsKICAgICAgICBuZXh0UG9zLS07CiAgICAgIH0KICAgICAgc2Iud3JpdGUoJyInKTsKICAgICAgcmVzdWx0ID0gc2IudG9TdHJpbmcoKTsKICAgIH0KCiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgaW50IF9pbnRGcm9tQnl0ZXMoTGlzdDxpbnQ+IGJ5dGVzLCBpbnQgb2Zmc2V0KSB7CiAgICByZXR1cm4gKGJ5dGVzW29mZnNldF0gKwogICAgICAgIChieXRlc1tvZmZzZXQgKyAxXSA8PCA4KSArCiAgICAgICAgKGJ5dGVzW29mZnNldCArIDJdIDw8IDE2KSArCiAgICAgICAgKGJ5dGVzW29mZnNldCArIDNdIDw8IDI0KSk7CiAgfQoKICBGdXR1cmU8UHJvY2Vzcz4gX3N0YXJ0KCkgewogICAgdmFyIGNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXI8UHJvY2Vzcz4oKTsKICAgIGlmIChfbW9kZUlzQXR0YWNoZWQoX21vZGUpKSB7CiAgICAgIF9leGl0Q29kZSA9IG5ldyBDb21wbGV0ZXI8aW50PigpOwogICAgfQogICAgLy8gVE9ETyhhZ2VyKTogTWFrZSB0aGUgYWN0dWFsIHByb2Nlc3Mgc3RhcnRpbmcgcmVhbGx5IGFzeW5jIGluc3RlYWQgb2YKICAgIC8vIHNpbXVsYXRpbmcgaXQgd2l0aCBhIHRpbWVyLgogICAgVGltZXIucnVuKCgpIHsKICAgICAgdmFyIHN0YXR1cyA9IG5ldyBfUHJvY2Vzc1N0YXJ0U3RhdHVzKCk7CiAgICAgIGJvb2wgc3VjY2VzcyA9IF9zdGFydE5hdGl2ZSgKICAgICAgICAgIF9OYW1lc3BhY2UuX25hbWVzcGFjZSwKICAgICAgICAgIF9wYXRoLAogICAgICAgICAgX2FyZ3VtZW50cywKICAgICAgICAgIF93b3JraW5nRGlyZWN0b3J5LAogICAgICAgICAgX2Vudmlyb25tZW50LAogICAgICAgICAgX21vZGUuX21vZGUsCiAgICAgICAgICBfbW9kZUhhc1N0ZGlvKF9tb2RlKSA/IF9zdGRpbk5hdGl2ZVNvY2tldCA6IG51bGwsCiAgICAgICAgICBfbW9kZUhhc1N0ZGlvKF9tb2RlKSA/IF9zdGRvdXROYXRpdmVTb2NrZXQgOiBudWxsLAogICAgICAgICAgX21vZGVIYXNTdGRpbyhfbW9kZSkgPyBfc3RkZXJyTmF0aXZlU29ja2V0IDogbnVsbCwKICAgICAgICAgIF9tb2RlSXNBdHRhY2hlZChfbW9kZSkgPyBfZXhpdEhhbmRsZXIuX25hdGl2ZVNvY2tldCA6IG51bGwsCiAgICAgICAgICBzdGF0dXMpOwogICAgICBpZiAoIXN1Y2Nlc3MpIHsKICAgICAgICBjb21wbGV0ZXIuY29tcGxldGVFcnJvcihuZXcgUHJvY2Vzc0V4Y2VwdGlvbigKICAgICAgICAgICAgX3BhdGgsIF9hcmd1bWVudHMsIHN0YXR1cy5fZXJyb3JNZXNzYWdlLCBzdGF0dXMuX2Vycm9yQ29kZSkpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgX3N0YXJ0ZWQgPSB0cnVlOwogICAgICBfcmVzb3VyY2VJbmZvID0gbmV3IF9Qcm9jZXNzUmVzb3VyY2VJbmZvKHRoaXMpOwoKICAgICAgLy8gU2V0dXAgYW4gZXhpdCBoYW5kbGVyIHRvIGhhbmRsZSBpbnRlcm5hbCBjbGVhbnVwIGFuZCBwb3NzaWJsZQogICAgICAvLyBjYWxsYmFjayB3aGVuIGEgcHJvY2VzcyB0ZXJtaW5hdGVzLgogICAgICBpZiAoX21vZGVJc0F0dGFjaGVkKF9tb2RlKSkgewogICAgICAgIGludCBleGl0RGF0YVJlYWQgPSAwOwogICAgICAgIGZpbmFsIGludCBFWElUX0RBVEFfU0laRSA9IDg7CiAgICAgICAgTGlzdDxpbnQ+IGV4aXREYXRhQnVmZmVyID0gbmV3IExpc3Q8aW50PihFWElUX0RBVEFfU0laRSk7CiAgICAgICAgX2V4aXRIYW5kbGVyLmxpc3RlbigoZGF0YSkgewogICAgICAgICAgaW50IGV4aXRDb2RlKExpc3Q8aW50PiBpbnRzKSB7CiAgICAgICAgICAgIHZhciBjb2RlID0gX2ludEZyb21CeXRlcyhpbnRzLCAwKTsKICAgICAgICAgICAgdmFyIG5lZ2F0aXZlID0gX2ludEZyb21CeXRlcyhpbnRzLCA0KTsKICAgICAgICAgICAgYXNzZXJ0KG5lZ2F0aXZlID09IDAgfHwgbmVnYXRpdmUgPT0gMSk7CiAgICAgICAgICAgIHJldHVybiAobmVnYXRpdmUgPT0gMCkgPyBjb2RlIDogLWNvZGU7CiAgICAgICAgICB9CgogICAgICAgICAgdm9pZCBoYW5kbGVFeGl0KCkgewogICAgICAgICAgICBfZW5kZWQgPSB0cnVlOwogICAgICAgICAgICBfZXhpdENvZGUuY29tcGxldGUoZXhpdENvZGUoZXhpdERhdGFCdWZmZXIpKTsKICAgICAgICAgICAgLy8gS2lsbCBzdGRpbiwgaGVscGluZyBoYW5kIGlmIHRoZSB1c2VyIGZvcmdvdCB0byBkbyBpdC4KICAgICAgICAgICAgaWYgKF9tb2RlSGFzU3RkaW8oX21vZGUpKSB7CiAgICAgICAgICAgICAgKF9zdGRpbi5fc2luayBhcyBfU29ja2V0KS5kZXN0cm95KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX3Jlc291cmNlSW5mby5zdG9wcGVkKCk7CiAgICAgICAgICB9CgogICAgICAgICAgZXhpdERhdGFCdWZmZXIuc2V0UmFuZ2UoCiAgICAgICAgICAgICAgZXhpdERhdGFSZWFkLCBleGl0RGF0YVJlYWQgKyBkYXRhLmxlbmd0aCwgZGF0YSk7CiAgICAgICAgICBleGl0RGF0YVJlYWQgKz0gZGF0YS5sZW5ndGg7CiAgICAgICAgICBpZiAoZXhpdERhdGFSZWFkID09IEVYSVRfREFUQV9TSVpFKSB7CiAgICAgICAgICAgIGhhbmRsZUV4aXQoKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQoKICAgICAgY29tcGxldGVyLmNvbXBsZXRlKHRoaXMpOwogICAgfSk7CiAgICByZXR1cm4gY29tcGxldGVyLmZ1dHVyZTsKICB9CgogIFByb2Nlc3NSZXN1bHQgX3J1bkFuZFdhaXQoRW5jb2Rpbmcgc3Rkb3V0RW5jb2RpbmcsIEVuY29kaW5nIHN0ZGVyckVuY29kaW5nKSB7CiAgICB2YXIgc3RhdHVzID0gbmV3IF9Qcm9jZXNzU3RhcnRTdGF0dXMoKTsKICAgIF9leGl0Q29kZSA9IG5ldyBDb21wbGV0ZXI8aW50PigpOwogICAgYm9vbCBzdWNjZXNzID0gX3N0YXJ0TmF0aXZlKAogICAgICAgIF9OYW1lc3BhY2UuX25hbWVzcGFjZSwKICAgICAgICBfcGF0aCwKICAgICAgICBfYXJndW1lbnRzLAogICAgICAgIF93b3JraW5nRGlyZWN0b3J5LAogICAgICAgIF9lbnZpcm9ubWVudCwKICAgICAgICBQcm9jZXNzU3RhcnRNb2RlLm5vcm1hbC5fbW9kZSwKICAgICAgICBfc3RkaW5OYXRpdmVTb2NrZXQsCiAgICAgICAgX3N0ZG91dE5hdGl2ZVNvY2tldCwKICAgICAgICBfc3RkZXJyTmF0aXZlU29ja2V0LAogICAgICAgIF9leGl0SGFuZGxlci5fbmF0aXZlU29ja2V0LAogICAgICAgIHN0YXR1cyk7CiAgICBpZiAoIXN1Y2Nlc3MpIHsKICAgICAgdGhyb3cgbmV3IFByb2Nlc3NFeGNlcHRpb24oCiAgICAgICAgICBfcGF0aCwgX2FyZ3VtZW50cywgc3RhdHVzLl9lcnJvck1lc3NhZ2UsIHN0YXR1cy5fZXJyb3JDb2RlKTsKICAgIH0KCiAgICBfcmVzb3VyY2VJbmZvID0gbmV3IF9Qcm9jZXNzUmVzb3VyY2VJbmZvKHRoaXMpOwoKICAgIHZhciByZXN1bHQgPSBfd2FpdChfc3RkaW5OYXRpdmVTb2NrZXQsIF9zdGRvdXROYXRpdmVTb2NrZXQsCiAgICAgICAgX3N0ZGVyck5hdGl2ZVNvY2tldCwgX2V4aXRIYW5kbGVyLl9uYXRpdmVTb2NrZXQpOwoKICAgIGdldE91dHB1dChvdXRwdXQsIGVuY29kaW5nKSB7CiAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSByZXR1cm4gb3V0cHV0OwogICAgICByZXR1cm4gZW5jb2RpbmcuZGVjb2RlKG91dHB1dCk7CiAgICB9CgogICAgX3Jlc291cmNlSW5mby5zdG9wcGVkKCk7CgogICAgcmV0dXJuIG5ldyBQcm9jZXNzUmVzdWx0KAogICAgICAgIHJlc3VsdFswXSwKICAgICAgICByZXN1bHRbMV0sCiAgICAgICAgZ2V0T3V0cHV0KHJlc3VsdFsyXSwgc3Rkb3V0RW5jb2RpbmcpLAogICAgICAgIGdldE91dHB1dChyZXN1bHRbM10sIHN0ZGVyckVuY29kaW5nKSk7CiAgfQoKICBib29sIF9zdGFydE5hdGl2ZSgKICAgICAgX05hbWVzcGFjZSBuYW1lc3BhY2UsCiAgICAgIFN0cmluZyBwYXRoLAogICAgICBMaXN0PFN0cmluZz4gYXJndW1lbnRzLAogICAgICBTdHJpbmcgd29ya2luZ0RpcmVjdG9yeSwKICAgICAgTGlzdDxTdHJpbmc+IGVudmlyb25tZW50LAogICAgICBpbnQgbW9kZSwKICAgICAgX05hdGl2ZVNvY2tldCBzdGRpbiwKICAgICAgX05hdGl2ZVNvY2tldCBzdGRvdXQsCiAgICAgIF9OYXRpdmVTb2NrZXQgc3RkZXJyLAogICAgICBfTmF0aXZlU29ja2V0IGV4aXRIYW5kbGVyLAogICAgICBfUHJvY2Vzc1N0YXJ0U3RhdHVzIHN0YXR1cykgbmF0aXZlICJQcm9jZXNzX1N0YXJ0IjsKCiAgX3dhaXQoX05hdGl2ZVNvY2tldCBzdGRpbiwgX05hdGl2ZVNvY2tldCBzdGRvdXQsIF9OYXRpdmVTb2NrZXQgc3RkZXJyLAogICAgICBfTmF0aXZlU29ja2V0IGV4aXRIYW5kbGVyKSBuYXRpdmUgIlByb2Nlc3NfV2FpdCI7CgogIFN0cmVhbTxMaXN0PGludD4+IGdldCBzdGRvdXQgewogICAgcmV0dXJuIF9zdGRvdXQ7CiAgfQoKICBTdHJlYW08TGlzdDxpbnQ+PiBnZXQgc3RkZXJyIHsKICAgIHJldHVybiBfc3RkZXJyOwogIH0KCiAgSU9TaW5rIGdldCBzdGRpbiB7CiAgICByZXR1cm4gX3N0ZGluOwogIH0KCiAgRnV0dXJlPGludD4gZ2V0IGV4aXRDb2RlID0+IF9leGl0Q29kZSAhPSBudWxsID8gX2V4aXRDb2RlLmZ1dHVyZSA6IG51bGw7CgogIGJvb2wga2lsbChbUHJvY2Vzc1NpZ25hbCBzaWduYWwgPSBQcm9jZXNzU2lnbmFsLnNpZ3Rlcm1dKSB7CiAgICBpZiAoc2lnbmFsIGlzISBQcm9jZXNzU2lnbmFsKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJBcmd1bWVudCAnc2lnbmFsJyBtdXN0IGJlIGEgUHJvY2Vzc1NpZ25hbCIpOwogICAgfQogICAgYXNzZXJ0KF9zdGFydGVkKTsKICAgIGlmIChfZW5kZWQpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBfUHJvY2Vzc1V0aWxzLl9raWxsUGlkKHBpZCwgc2lnbmFsLl9zaWduYWxOdW1iZXIpOwogIH0KCiAgaW50IGdldCBwaWQgPT4gX1Byb2Nlc3NVdGlscy5fcGlkKHRoaXMpOwoKICBTdHJpbmcgX3BhdGg7CiAgTGlzdDxTdHJpbmc+IF9hcmd1bWVudHM7CiAgU3RyaW5nIF93b3JraW5nRGlyZWN0b3J5OwogIExpc3Q8U3RyaW5nPiBfZW52aXJvbm1lbnQ7CiAgUHJvY2Vzc1N0YXJ0TW9kZSBfbW9kZTsKICAvLyBQcml2YXRlIG1ldGhvZHMgb2YgU29ja2V0IGFyZSB1c2VkIGJ5IF9pbiwgX291dCwgYW5kIF9lcnIuCiAgX1N0ZFNpbmsgX3N0ZGluOwogIF9TdGRTdHJlYW0gX3N0ZG91dDsKICBfU3RkU3RyZWFtIF9zdGRlcnI7CiAgX1NvY2tldCBfZXhpdEhhbmRsZXI7CiAgYm9vbCBfZW5kZWQ7CiAgYm9vbCBfc3RhcnRlZDsKICBDb21wbGV0ZXI8aW50PiBfZXhpdENvZGU7Cn0KCi8vIF9Ob25JbnRlcmFjdGl2ZVByb2Nlc3MgaXMgYSB3cmFwcGVyIGFyb3VuZCBhbiBpbnRlcmFjdGl2ZSBwcm9jZXNzCi8vIHRoYXQgYnVmZmVycyBvdXRwdXQgc28gaXQgY2FuIGJlIGRlbGl2ZXJlZCB3aGVuIHRoZSBwcm9jZXNzIGV4aXRzLgovLyBfTm9uSW50ZXJhY3RpdmVQcm9jZXNzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBQcm9jZXNzLnJ1bgovLyBtZXRob2QuCkZ1dHVyZTxQcm9jZXNzUmVzdWx0PiBfcnVuTm9uSW50ZXJhY3RpdmVQcm9jZXNzKAogICAgU3RyaW5nIHBhdGgsCiAgICBMaXN0PFN0cmluZz4gYXJndW1lbnRzLAogICAgU3RyaW5nIHdvcmtpbmdEaXJlY3RvcnksCiAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50LAogICAgYm9vbCBpbmNsdWRlUGFyZW50RW52aXJvbm1lbnQsCiAgICBib29sIHJ1bkluU2hlbGwsCiAgICBFbmNvZGluZyBzdGRvdXRFbmNvZGluZywKICAgIEVuY29kaW5nIHN0ZGVyckVuY29kaW5nKSB7CiAgLy8gU3RhcnQgdGhlIHVuZGVybHlpbmcgcHJvY2Vzcy4KICByZXR1cm4gUHJvY2Vzcy5zdGFydChwYXRoLCBhcmd1bWVudHMsCiAgICAgICAgICB3b3JraW5nRGlyZWN0b3J5OiB3b3JraW5nRGlyZWN0b3J5LAogICAgICAgICAgZW52aXJvbm1lbnQ6IGVudmlyb25tZW50LAogICAgICAgICAgaW5jbHVkZVBhcmVudEVudmlyb25tZW50OiBpbmNsdWRlUGFyZW50RW52aXJvbm1lbnQsCiAgICAgICAgICBydW5JblNoZWxsOiBydW5JblNoZWxsKQogICAgICAudGhlbigoUHJvY2VzcyBwKSB7CiAgICBpbnQgcGlkID0gcC5waWQ7CgogICAgLy8gTWFrZSBzdXJlIHRoZSBwcm9jZXNzIHN0ZGluIGlzIGNsb3NlZC4KICAgIHAuc3RkaW4uY2xvc2UoKTsKCiAgICAvLyBTZXR1cCBzdGRvdXQgYW5kIHN0ZGVyciBoYW5kbGluZy4KICAgIEZ1dHVyZSBmb2xkU3RyZWFtKFN0cmVhbTxMaXN0PGludD4+IHN0cmVhbSwgRW5jb2RpbmcgZW5jb2RpbmcpIHsKICAgICAgaWYgKGVuY29kaW5nID09IG51bGwpIHsKICAgICAgICByZXR1cm4gc3RyZWFtCiAgICAgICAgICAgIC5mb2xkKG5ldyBCeXRlc0J1aWxkZXIoKSwgKGJ1aWxkZXIsIGRhdGEpID0+IGJ1aWxkZXIuLmFkZChkYXRhKSkKICAgICAgICAgICAgLnRoZW4oKGJ1aWxkZXIpID0+IGJ1aWxkZXIudGFrZUJ5dGVzKCkpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBzdHJlYW0udHJhbnNmb3JtKGVuY29kaW5nLmRlY29kZXIpLmZvbGQobmV3IFN0cmluZ0J1ZmZlcigpLAogICAgICAgICAgICAoYnVmLCBkYXRhKSB7CiAgICAgICAgICBidWYud3JpdGUoZGF0YSk7CiAgICAgICAgICByZXR1cm4gYnVmOwogICAgICAgIH0pLnRoZW4oKHNiKSA9PiBzYi50b1N0cmluZygpKTsKICAgICAgfQogICAgfQoKICAgIEZ1dHVyZSBzdGRvdXQgPSBmb2xkU3RyZWFtKHAuc3Rkb3V0LCBzdGRvdXRFbmNvZGluZyk7CiAgICBGdXR1cmUgc3RkZXJyID0gZm9sZFN0cmVhbShwLnN0ZGVyciwgc3RkZXJyRW5jb2RpbmcpOwoKICAgIHJldHVybiBGdXR1cmUud2FpdChbcC5leGl0Q29kZSwgc3Rkb3V0LCBzdGRlcnJdKS50aGVuKChyZXN1bHQpIHsKICAgICAgcmV0dXJuIG5ldyBQcm9jZXNzUmVzdWx0KHBpZCwgcmVzdWx0WzBdLCByZXN1bHRbMV0sIHJlc3VsdFsyXSk7CiAgICB9KTsKICB9KTsKfQoKUHJvY2Vzc1Jlc3VsdCBfcnVuTm9uSW50ZXJhY3RpdmVQcm9jZXNzU3luYygKICAgIFN0cmluZyBleGVjdXRhYmxlLAogICAgTGlzdDxTdHJpbmc+IGFyZ3VtZW50cywKICAgIFN0cmluZyB3b3JraW5nRGlyZWN0b3J5LAogICAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudCwKICAgIGJvb2wgaW5jbHVkZVBhcmVudEVudmlyb25tZW50LAogICAgYm9vbCBydW5JblNoZWxsLAogICAgRW5jb2Rpbmcgc3Rkb3V0RW5jb2RpbmcsCiAgICBFbmNvZGluZyBzdGRlcnJFbmNvZGluZykgewogIHZhciBwcm9jZXNzID0gbmV3IF9Qcm9jZXNzSW1wbCgKICAgICAgZXhlY3V0YWJsZSwKICAgICAgYXJndW1lbnRzLAogICAgICB3b3JraW5nRGlyZWN0b3J5LAogICAgICBlbnZpcm9ubWVudCwKICAgICAgaW5jbHVkZVBhcmVudEVudmlyb25tZW50LAogICAgICBydW5JblNoZWxsLAogICAgICBQcm9jZXNzU3RhcnRNb2RlLm5vcm1hbCk7CiAgcmV0dXJuIHByb2Nlc3MuX3J1bkFuZFdhaXQoc3Rkb3V0RW5jb2RpbmcsIHN0ZGVyckVuY29kaW5nKTsKfQqCfQBOTjwBIAEHIAlPAgEHIAlRAgEHEAlKICcrHjktFBMaFSIUDx0EAQlOICcrHi8yJhQTGhUiFBgZBAEJSiAnKx4vMioUExoVIhQYGQQBCVEkTAY+BAIBOwEaHgEvCwEjQS8EAToBEzYWEk4OBg5EHCojMSMKCAgEARMXMRIGBAFKLSsCASJKAQcWCTcJRQk6CTkJOUYJRCoqKx8wMzYhPAYpBAFMPFAGPAQCAQcUCRocHRQGEwQBCR4gHRQGEwQBMDgCARocI0MjTAIBTRlEAUomMAEQEx4eJyUXHRIlGVE2NycGARY3IQYBGz4GEgEeRgYgKCQeHD4IJCA/CAYBRR9DBgEXM0QfSQYnMCFJCCcIJDIfIUQtKwoKBgElSAYSAR8hRiVIJUgGIS4GFBYEASovKzIrMgE3MDEEATUwNgQBJR4YBhYEASozJh4gJiMhCA0sOiogIy4mCDIGGwQBMxsjIiJEHgE4LSojFzUfHiBEGhEKSDEbChkgMwg+HgFBHyIYJToYEwgVHgYBEwQBMxwjJCQEAR0uIigGTCMTLiMhERYdGBc8PT1GExY2ShAIARc2AUctJB4mQiUpLzM0MwwBHhs6RSgzDiUMASM/JzAaDAwIASAIHQQBUCwmIR8PFBsWJxwdHSQRFCJHBgE0AUA6ASIrJgYBHQEeExMuLwQBFRwTHh8gEBscHCE6AUk4ASEUBAEhFAQBFRMEAUsBPiRMBhYePgQBKwEQGxwdGkATFhYYDxEcAgFFRj8LMREcHSUjFR0fIyguJD4iGhUBLhUBKUUeFk01D0saGxYoCAYBOjoBRUYIBgIBLRccHSUjFR0fIhIRGBMgEiA+AgEgZGFydDppby1wYXRjaC9wcm9jZXNzX3BhdGNoLmRhcnQxb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2Jpbi9zb2NrZXRfcGF0Y2guZGFydMAA8AIvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29tbW9uX3BhdGNoLmRhcnQiOwoKQHBhdGNoCmNsYXNzIFJhd1NlcnZlclNvY2tldCB7CiAgQHBhdGNoCiAgc3RhdGljIEZ1dHVyZTxSYXdTZXJ2ZXJTb2NrZXQ+IGJpbmQoYWRkcmVzcywgaW50IHBvcnQsCiAgICAgIHtpbnQgYmFja2xvZzogMCwgYm9vbCB2Nk9ubHk6IGZhbHNlLCBib29sIHNoYXJlZDogZmFsc2V9KSB7CiAgICByZXR1cm4gX1Jhd1NlcnZlclNvY2tldC5iaW5kKGFkZHJlc3MsIHBvcnQsIGJhY2tsb2csIHY2T25seSwgc2hhcmVkKTsKICB9Cn0KCkBwYXRjaApjbGFzcyBSYXdTb2NrZXQgewogIEBwYXRjaAogIHN0YXRpYyBGdXR1cmU8UmF3U29ja2V0PiBjb25uZWN0KGhvc3QsIGludCBwb3J0LAogICAgICB7c291cmNlQWRkcmVzcywgRHVyYXRpb24gdGltZW91dH0pIHsKICAgIHJldHVybiBfUmF3U29ja2V0LmNvbm5lY3QoaG9zdCwgcG9ydCwgc291cmNlQWRkcmVzcywgdGltZW91dCk7CiAgfQoKICBAcGF0Y2gKICBzdGF0aWMgRnV0dXJlPENvbm5lY3Rpb25UYXNrPFJhd1NvY2tldD4+IHN0YXJ0Q29ubmVjdChob3N0LCBpbnQgcG9ydCwKICAgICAge3NvdXJjZUFkZHJlc3N9KSB7CiAgICByZXR1cm4gX1Jhd1NvY2tldC5zdGFydENvbm5lY3QoaG9zdCwgcG9ydCwgc291cmNlQWRkcmVzcyk7CiAgfQp9CgpAcGF0Y2gKY2xhc3MgUmF3U29ja2V0T3B0aW9uIHsKICBzdGF0aWMgZmluYWwgTGlzdDxpbnQ+IF9vcHRpb25zQ2FjaGUgPQogICAgICBMaXN0PGludD4oX1Jhd1NvY2tldE9wdGlvbnMudmFsdWVzLmxlbmd0aCk7CgogIEBwYXRjaAogIHN0YXRpYyBpbnQgX2dldE9wdGlvblZhbHVlKGludCBrZXkpIHsKICAgIGlmIChrZXkgPiBfUmF3U29ja2V0T3B0aW9ucy52YWx1ZXMubGVuZ3RoKSB7CiAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IudmFsdWUoa2V5LCAna2V5Jyk7CiAgICB9CiAgICBfb3B0aW9uc0NhY2hlW2tleV0gPz89IF9nZXROYXRpdmVPcHRpb25WYWx1ZShrZXkpOwogICAgcmV0dXJuIF9vcHRpb25zQ2FjaGVba2V5XTsKICB9CgogIHN0YXRpYyBpbnQgX2dldE5hdGl2ZU9wdGlvblZhbHVlKGludCBrZXkpCiAgICAgIG5hdGl2ZSAiUmF3U29ja2V0T3B0aW9uX0dldE9wdGlvblZhbHVlIjsKfQoKQHBhdGNoCmNsYXNzIEludGVybmV0QWRkcmVzcyB7CiAgQHBhdGNoCiAgc3RhdGljIEludGVybmV0QWRkcmVzcyBnZXQgTE9PUEJBQ0tfSVBfVjQgewogICAgcmV0dXJuIF9JbnRlcm5ldEFkZHJlc3MubG9vcGJhY2tJUHY0OwogIH0KCiAgQHBhdGNoCiAgc3RhdGljIEludGVybmV0QWRkcmVzcyBnZXQgTE9PUEJBQ0tfSVBfVjYgewogICAgcmV0dXJuIF9JbnRlcm5ldEFkZHJlc3MubG9vcGJhY2tJUHY2OwogIH0KCiAgQHBhdGNoCiAgc3RhdGljIEludGVybmV0QWRkcmVzcyBnZXQgQU5ZX0lQX1Y0IHsKICAgIHJldHVybiBfSW50ZXJuZXRBZGRyZXNzLmFueUlQdjQ7CiAgfQoKICBAcGF0Y2gKICBzdGF0aWMgSW50ZXJuZXRBZGRyZXNzIGdldCBBTllfSVBfVjYgewogICAgcmV0dXJuIF9JbnRlcm5ldEFkZHJlc3MuYW55SVB2NjsKICB9CgogIEBwYXRjaAogIGZhY3RvcnkgSW50ZXJuZXRBZGRyZXNzKFN0cmluZyBhZGRyZXNzKSB7CiAgICByZXR1cm4gbmV3IF9JbnRlcm5ldEFkZHJlc3MucGFyc2UoYWRkcmVzcyk7CiAgfQoKICBAcGF0Y2gKICBzdGF0aWMgRnV0dXJlPExpc3Q8SW50ZXJuZXRBZGRyZXNzPj4gbG9va3VwKFN0cmluZyBob3N0LAogICAgICB7SW50ZXJuZXRBZGRyZXNzVHlwZSB0eXBlOiBJbnRlcm5ldEFkZHJlc3NUeXBlLmFueX0pIHsKICAgIHJldHVybiBfTmF0aXZlU29ja2V0Lmxvb2t1cChob3N0LCB0eXBlOiB0eXBlKTsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBJbnRlcm5ldEFkZHJlc3MgX2Nsb25lV2l0aE5ld0hvc3QoCiAgICAgIEludGVybmV0QWRkcmVzcyBhZGRyZXNzLCBTdHJpbmcgaG9zdCkgewogICAgcmV0dXJuIChhZGRyZXNzIGFzIF9JbnRlcm5ldEFkZHJlc3MpLl9jbG9uZVdpdGhOZXdIb3N0KGhvc3QpOwogIH0KfQoKQHBhdGNoCmNsYXNzIE5ldHdvcmtJbnRlcmZhY2UgewogIEBwYXRjaAogIHN0YXRpYyBib29sIGdldCBsaXN0U3VwcG9ydGVkIHsKICAgIHJldHVybiBfbGlzdFN1cHBvcnRlZCgpOwogIH0KCiAgQHBhdGNoCiAgc3RhdGljIEZ1dHVyZTxMaXN0PE5ldHdvcmtJbnRlcmZhY2U+PiBsaXN0KAogICAgICB7Ym9vbCBpbmNsdWRlTG9vcGJhY2s6IGZhbHNlLAogICAgICBib29sIGluY2x1ZGVMaW5rTG9jYWw6IGZhbHNlLAogICAgICBJbnRlcm5ldEFkZHJlc3NUeXBlIHR5cGU6IEludGVybmV0QWRkcmVzc1R5cGUuYW55fSkgewogICAgcmV0dXJuIF9OYXRpdmVTb2NrZXQubGlzdEludGVyZmFjZXMoCiAgICAgICAgaW5jbHVkZUxvb3BiYWNrOiBpbmNsdWRlTG9vcGJhY2ssCiAgICAgICAgaW5jbHVkZUxpbmtMb2NhbDogaW5jbHVkZUxpbmtMb2NhbCwKICAgICAgICB0eXBlOiB0eXBlKTsKICB9CgogIHN0YXRpYyBib29sIF9saXN0U3VwcG9ydGVkKCkgbmF0aXZlICJOZXR3b3JrSW50ZXJmYWNlX0xpc3RTdXBwb3J0ZWQiOwp9Cgp2b2lkIF90aHJvd09uQmFkUG9ydChpbnQgcG9ydCkgewogIGlmICgocG9ydCA9PSBudWxsKSB8fCAocG9ydCA8IDApIHx8IChwb3J0ID4gMHhGRkZGKSkgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkludmFsaWQgcG9ydCAkcG9ydCIpOwogIH0KfQoKdm9pZCBfdGhyb3dPbkJhZFR0bChpbnQgdHRsKSB7CiAgaWYgKHR0bCA9PSBudWxsIHx8IHR0bCA8IDEgfHwgdHRsID4gMjU1KSB7CiAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignSW52YWxpZCB0dGwgJHR0bCcpOwogIH0KfQoKY2xhc3MgX0ludGVybmV0QWRkcmVzcyBpbXBsZW1lbnRzIEludGVybmV0QWRkcmVzcyB7CiAgc3RhdGljIGNvbnN0IGludCBfYWRkcmVzc0xvb3BiYWNrSVB2NCA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBfYWRkcmVzc0xvb3BiYWNrSVB2NiA9IDE7CiAgc3RhdGljIGNvbnN0IGludCBfYWRkcmVzc0FueUlQdjQgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgX2FkZHJlc3NBbnlJUHY2ID0gMzsKICBzdGF0aWMgY29uc3QgaW50IF9JUHY0QWRkckxlbmd0aCA9IDQ7CiAgc3RhdGljIGNvbnN0IGludCBfSVB2NkFkZHJMZW5ndGggPSAxNjsKCiAgc3RhdGljIF9JbnRlcm5ldEFkZHJlc3MgbG9vcGJhY2tJUHY0ID0KICAgICAgbmV3IF9JbnRlcm5ldEFkZHJlc3MuZml4ZWQoX2FkZHJlc3NMb29wYmFja0lQdjQpOwogIHN0YXRpYyBfSW50ZXJuZXRBZGRyZXNzIGxvb3BiYWNrSVB2NiA9CiAgICAgIG5ldyBfSW50ZXJuZXRBZGRyZXNzLmZpeGVkKF9hZGRyZXNzTG9vcGJhY2tJUHY2KTsKICBzdGF0aWMgX0ludGVybmV0QWRkcmVzcyBhbnlJUHY0ID0gbmV3IF9JbnRlcm5ldEFkZHJlc3MuZml4ZWQoX2FkZHJlc3NBbnlJUHY0KTsKICBzdGF0aWMgX0ludGVybmV0QWRkcmVzcyBhbnlJUHY2ID0gbmV3IF9JbnRlcm5ldEFkZHJlc3MuZml4ZWQoX2FkZHJlc3NBbnlJUHY2KTsKCiAgZmluYWwgU3RyaW5nIGFkZHJlc3M7CiAgZmluYWwgU3RyaW5nIF9ob3N0OwogIGZpbmFsIFVpbnQ4TGlzdCBfaW5fYWRkcjsKCiAgSW50ZXJuZXRBZGRyZXNzVHlwZSBnZXQgdHlwZSA9PiBfaW5fYWRkci5sZW5ndGggPT0gX0lQdjRBZGRyTGVuZ3RoCiAgICAgID8gSW50ZXJuZXRBZGRyZXNzVHlwZS5JUHY0CiAgICAgIDogSW50ZXJuZXRBZGRyZXNzVHlwZS5JUHY2OwoKICBTdHJpbmcgZ2V0IGhvc3QgPT4gX2hvc3QgIT0gbnVsbCA/IF9ob3N0IDogYWRkcmVzczsKCiAgTGlzdDxpbnQ+IGdldCByYXdBZGRyZXNzID0+IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoX2luX2FkZHIpOwoKICBib29sIGdldCBpc0xvb3BiYWNrIHsKICAgIHN3aXRjaCAodHlwZSkgewogICAgICBjYXNlIEludGVybmV0QWRkcmVzc1R5cGUuSVB2NDoKICAgICAgICByZXR1cm4gX2luX2FkZHJbMF0gPT0gMTI3OwoKICAgICAgY2FzZSBJbnRlcm5ldEFkZHJlc3NUeXBlLklQdjY6CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfSVB2NkFkZHJMZW5ndGggLSAxOyBpKyspIHsKICAgICAgICAgIGlmIChfaW5fYWRkcltpXSAhPSAwKSByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfaW5fYWRkcltfSVB2NkFkZHJMZW5ndGggLSAxXSA9PSAxOwogICAgfQogIH0KCiAgYm9vbCBnZXQgaXNMaW5rTG9jYWwgewogICAgc3dpdGNoICh0eXBlKSB7CiAgICAgIGNhc2UgSW50ZXJuZXRBZGRyZXNzVHlwZS5JUHY0OgogICAgICAgIC8vIENoZWNraW5nIGZvciAxNjkuMjU0LjAuMC8xNi4KICAgICAgICByZXR1cm4gX2luX2FkZHJbMF0gPT0gMTY5ICYmIF9pbl9hZGRyWzFdID09IDI1NDsKCiAgICAgIGNhc2UgSW50ZXJuZXRBZGRyZXNzVHlwZS5JUHY2OgogICAgICAgIC8vIENoZWNraW5nIGZvciBmZTgwOjovMTAuCiAgICAgICAgcmV0dXJuIF9pbl9hZGRyWzBdID09IDB4RkUgJiYgKF9pbl9hZGRyWzFdICYgMHhCMCkgPT0gMHg4MDsKICAgIH0KICB9CgogIGJvb2wgZ2V0IGlzTXVsdGljYXN0IHsKICAgIHN3aXRjaCAodHlwZSkgewogICAgICBjYXNlIEludGVybmV0QWRkcmVzc1R5cGUuSVB2NDoKICAgICAgICAvLyBDaGVja2luZyBmb3IgMjI0LjAuMC4wIHRocm91Z2ggMjM5LjI1NS4yNTUuMjU1LgogICAgICAgIHJldHVybiBfaW5fYWRkclswXSA+PSAyMjQgJiYgX2luX2FkZHJbMF0gPCAyNDA7CgogICAgICBjYXNlIEludGVybmV0QWRkcmVzc1R5cGUuSVB2NjoKICAgICAgICAvLyBDaGVja2luZyBmb3IgZmYwMDo6LzguCiAgICAgICAgcmV0dXJuIF9pbl9hZGRyWzBdID09IDB4RkY7CiAgICB9CiAgfQoKICBGdXR1cmU8SW50ZXJuZXRBZGRyZXNzPiByZXZlcnNlKCkgPT4gX05hdGl2ZVNvY2tldC5yZXZlcnNlTG9va3VwKHRoaXMpOwoKICBfSW50ZXJuZXRBZGRyZXNzKHRoaXMuYWRkcmVzcywgdGhpcy5faG9zdCwgdGhpcy5faW5fYWRkcik7CgogIGZhY3RvcnkgX0ludGVybmV0QWRkcmVzcy5wYXJzZShTdHJpbmcgYWRkcmVzcykgewogICAgaWYgKGFkZHJlc3MgaXMhIFN0cmluZykgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiSW52YWxpZCBpbnRlcm5ldCBhZGRyZXNzICRhZGRyZXNzIik7CiAgICB9CiAgICB2YXIgaW5fYWRkciA9IF9wYXJzZShhZGRyZXNzKTsKICAgIGlmIChpbl9hZGRyID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkludmFsaWQgaW50ZXJuZXQgYWRkcmVzcyAkYWRkcmVzcyIpOwogICAgfQogICAgcmV0dXJuIG5ldyBfSW50ZXJuZXRBZGRyZXNzKGFkZHJlc3MsIG51bGwsIGluX2FkZHIpOwogIH0KCiAgZmFjdG9yeSBfSW50ZXJuZXRBZGRyZXNzLmZpeGVkKGludCBpZCkgewogICAgc3dpdGNoIChpZCkgewogICAgICBjYXNlIF9hZGRyZXNzTG9vcGJhY2tJUHY0OgogICAgICAgIHZhciBpbl9hZGRyID0gbmV3IFVpbnQ4TGlzdChfSVB2NEFkZHJMZW5ndGgpOwogICAgICAgIGluX2FkZHJbMF0gPSAxMjc7CiAgICAgICAgaW5fYWRkcltfSVB2NEFkZHJMZW5ndGggLSAxXSA9IDE7CiAgICAgICAgcmV0dXJuIG5ldyBfSW50ZXJuZXRBZGRyZXNzKCIxMjcuMC4wLjEiLCBudWxsLCBpbl9hZGRyKTsKICAgICAgY2FzZSBfYWRkcmVzc0xvb3BiYWNrSVB2NjoKICAgICAgICB2YXIgaW5fYWRkciA9IG5ldyBVaW50OExpc3QoX0lQdjZBZGRyTGVuZ3RoKTsKICAgICAgICBpbl9hZGRyW19JUHY2QWRkckxlbmd0aCAtIDFdID0gMTsKICAgICAgICByZXR1cm4gbmV3IF9JbnRlcm5ldEFkZHJlc3MoIjo6MSIsIG51bGwsIGluX2FkZHIpOwogICAgICBjYXNlIF9hZGRyZXNzQW55SVB2NDoKICAgICAgICB2YXIgaW5fYWRkciA9IG5ldyBVaW50OExpc3QoX0lQdjRBZGRyTGVuZ3RoKTsKICAgICAgICByZXR1cm4gbmV3IF9JbnRlcm5ldEFkZHJlc3MoIjAuMC4wLjAiLCAiMC4wLjAuMCIsIGluX2FkZHIpOwogICAgICBjYXNlIF9hZGRyZXNzQW55SVB2NjoKICAgICAgICB2YXIgaW5fYWRkciA9IG5ldyBVaW50OExpc3QoX0lQdjZBZGRyTGVuZ3RoKTsKICAgICAgICByZXR1cm4gbmV3IF9JbnRlcm5ldEFkZHJlc3MoIjo6IiwgIjo6IiwgaW5fYWRkcik7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgYXNzZXJ0KGZhbHNlKTsKICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigpOwogICAgfQogIH0KCiAgLy8gQ3JlYXRlIGEgY2xvbmUgb2YgdGhpcyBfSW50ZXJuZXRBZGRyZXNzIHJlcGxhY2luZyB0aGUgaG9zdC4KICBfSW50ZXJuZXRBZGRyZXNzIF9jbG9uZVdpdGhOZXdIb3N0KFN0cmluZyBob3N0KSB7CiAgICByZXR1cm4gbmV3IF9JbnRlcm5ldEFkZHJlc3MoCiAgICAgICAgYWRkcmVzcywgaG9zdCwgbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChfaW5fYWRkcikpOwogIH0KCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKCEob3RoZXIgaXMgX0ludGVybmV0QWRkcmVzcykpIHJldHVybiBmYWxzZTsKICAgIGlmIChvdGhlci50eXBlICE9IHR5cGUpIHJldHVybiBmYWxzZTsKICAgIGJvb2wgZXF1YWxzID0gdHJ1ZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2luX2FkZHIubGVuZ3RoICYmIGVxdWFsczsgaSsrKSB7CiAgICAgIGVxdWFscyA9IG90aGVyLl9pbl9hZGRyW2ldID09IF9pbl9hZGRyW2ldOwogICAgfQogICAgcmV0dXJuIGVxdWFsczsKICB9CgogIGludCBnZXQgaGFzaENvZGUgewogICAgaW50IHJlc3VsdCA9IDE7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IF9pbl9hZGRyLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc3VsdCA9IChyZXN1bHQgKiAzMSArIF9pbl9hZGRyW2ldKSAmIDB4M0ZGRkZGRkY7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICJJbnRlcm5ldEFkZHJlc3MoJyRhZGRyZXNzJywgJHt0eXBlLm5hbWV9KSI7CiAgfQoKICBzdGF0aWMgVWludDhMaXN0IF9wYXJzZShTdHJpbmcgYWRkcmVzcykgbmF0aXZlICJJbnRlcm5ldEFkZHJlc3NfUGFyc2UiOwp9CgpjbGFzcyBfTmV0d29ya0ludGVyZmFjZSBpbXBsZW1lbnRzIE5ldHdvcmtJbnRlcmZhY2UgewogIGZpbmFsIFN0cmluZyBuYW1lOwogIGZpbmFsIGludCBpbmRleDsKICBmaW5hbCBMaXN0PEludGVybmV0QWRkcmVzcz4gYWRkcmVzc2VzID0gW107CgogIF9OZXR3b3JrSW50ZXJmYWNlKHRoaXMubmFtZSwgdGhpcy5pbmRleCk7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAiTmV0d29ya0ludGVyZmFjZSgnJG5hbWUnLCAkYWRkcmVzc2VzKSI7CiAgfQp9CgovLyBUaGUgTmF0aXZlRmllbGRXcmFwcGVyQ2xhc3MxIGNhbm5vdCBiZSB1c2VkIHdpdGggYSBtaXhpbiwgZHVlIHRvIG1pc3NpbmcKLy8gaW1wbGljaXQgY29uc3RydWN0b3IuCmNsYXNzIF9OYXRpdmVTb2NrZXROYXRpdmVXcmFwcGVyIGV4dGVuZHMgTmF0aXZlRmllbGRXcmFwcGVyQ2xhc3MxIHt9CgovLyBUaGUgX05hdGl2ZVNvY2tldCBjbGFzcyBlbmNhcHN1bGF0ZXMgYW4gT1Mgc29ja2V0LgpjbGFzcyBfTmF0aXZlU29ja2V0IGV4dGVuZHMgX05hdGl2ZVNvY2tldE5hdGl2ZVdyYXBwZXIgd2l0aCBfU2VydmljZU9iamVjdCB7CiAgLy8gQml0IGZsYWdzIHVzZWQgd2hlbiBjb21tdW5pY2F0aW5nIGJldHdlZW4gdGhlIGV2ZW50aGFuZGxlciBhbmQKICAvLyBkYXJ0IGNvZGUuIFRoZSBFVkVOVCBmbGFncyBhcmUgdXNlZCB0byBpbmRpY2F0ZSBldmVudHMgb2YKICAvLyBpbnRlcmVzdCB3aGVuIHNlbmRpbmcgYSBtZXNzYWdlIGZyb20gZGFydCBjb2RlIHRvIHRoZQogIC8vIGV2ZW50aGFuZGxlci4gV2hlbiByZWNlaXZpbmcgYSBtZXNzYWdlIGZyb20gdGhlIGV2ZW50aGFuZGxlciB0aGUKICAvLyBFVkVOVCBmbGFncyBpbmRpY2F0ZSB0aGUgZXZlbnRzIHRoYXQgYWN0dWFsbHkgaGFwcGVuZWQuIFRoZQogIC8vIENPTU1BTkQgZmxhZ3MgYXJlIHVzZWQgdG8gc2VuZCBjb21tYW5kcyBmcm9tIGRhcnQgdG8gdGhlCiAgLy8gZXZlbnRoYW5kbGVyLiBDT01NQU5EIGZsYWdzIGFyZSBuZXZlciByZWNlaXZlZCBmcm9tIHRoZQogIC8vIGV2ZW50aGFuZGxlci4gQWRkaXRpb25hbCBmbGFncyBhcmUgdXNlZCB0byBjb21tdW5pY2F0ZSBvdGhlcgogIC8vIGluZm9ybWF0aW9uLgogIHN0YXRpYyBjb25zdCBpbnQgcmVhZEV2ZW50ID0gMDsKICBzdGF0aWMgY29uc3QgaW50IHdyaXRlRXZlbnQgPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgZXJyb3JFdmVudCA9IDI7CiAgc3RhdGljIGNvbnN0IGludCBjbG9zZWRFdmVudCA9IDM7CiAgc3RhdGljIGNvbnN0IGludCBkZXN0cm95ZWRFdmVudCA9IDQ7CiAgc3RhdGljIGNvbnN0IGludCBmaXJzdEV2ZW50ID0gcmVhZEV2ZW50OwogIHN0YXRpYyBjb25zdCBpbnQgbGFzdEV2ZW50ID0gZGVzdHJveWVkRXZlbnQ7CiAgc3RhdGljIGNvbnN0IGludCBldmVudENvdW50ID0gbGFzdEV2ZW50IC0gZmlyc3RFdmVudCArIDE7CgogIHN0YXRpYyBjb25zdCBpbnQgY2xvc2VDb21tYW5kID0gODsKICBzdGF0aWMgY29uc3QgaW50IHNodXRkb3duUmVhZENvbW1hbmQgPSA5OwogIHN0YXRpYyBjb25zdCBpbnQgc2h1dGRvd25Xcml0ZUNvbW1hbmQgPSAxMDsKICAvLyBUaGUgbG93ZXIgYml0cyBvZiByZXR1cm5Ub2tlbkNvbW1hbmQgbWVzc2FnZXMgY29udGFpbnMgdGhlIG51bWJlcgogIC8vIG9mIHRva2VucyByZXR1cm5lZC4KICBzdGF0aWMgY29uc3QgaW50IHJldHVyblRva2VuQ29tbWFuZCA9IDExOwogIHN0YXRpYyBjb25zdCBpbnQgc2V0RXZlbnRNYXNrQ29tbWFuZCA9IDEyOwogIHN0YXRpYyBjb25zdCBpbnQgZmlyc3RDb21tYW5kID0gY2xvc2VDb21tYW5kOwogIHN0YXRpYyBjb25zdCBpbnQgbGFzdENvbW1hbmQgPSBzZXRFdmVudE1hc2tDb21tYW5kOwoKICAvLyBUeXBlIGZsYWcgc2VuZCB0byB0aGUgZXZlbnRoYW5kbGVyIHByb3ZpZGluZyBhZGRpdGlvbmFsCiAgLy8gaW5mb3JtYXRpb24gb24gdGhlIHR5cGUgb2YgdGhlIGZpbGUgZGVzY3JpcHRvci4KICBzdGF0aWMgY29uc3QgaW50IGxpc3RlbmluZ1NvY2tldCA9IDE2OwogIHN0YXRpYyBjb25zdCBpbnQgcGlwZVNvY2tldCA9IDE3OwogIHN0YXRpYyBjb25zdCBpbnQgdHlwZU5vcm1hbFNvY2tldCA9IDA7CiAgc3RhdGljIGNvbnN0IGludCB0eXBlTGlzdGVuaW5nU29ja2V0ID0gMSA8PCBsaXN0ZW5pbmdTb2NrZXQ7CiAgc3RhdGljIGNvbnN0IGludCB0eXBlUGlwZSA9IDEgPDwgcGlwZVNvY2tldDsKICBzdGF0aWMgY29uc3QgaW50IHR5cGVUeXBlTWFzayA9IHR5cGVMaXN0ZW5pbmdTb2NrZXQgfCBwaXBlU29ja2V0OwoKICAvLyBQcm90b2NvbCBmbGFncy4KICAvLyBLZWVwIGluIHN5bmMgd2l0aCBTb2NrZXRUeXBlIGVudW0gaW4gc29ja2V0LmguCiAgc3RhdGljIGNvbnN0IGludCB0Y3BTb2NrZXQgPSAxODsKICBzdGF0aWMgY29uc3QgaW50IHVkcFNvY2tldCA9IDE5OwogIHN0YXRpYyBjb25zdCBpbnQgaW50ZXJuYWxTb2NrZXQgPSAyMDsKICBzdGF0aWMgY29uc3QgaW50IGludGVybmFsU2lnbmFsU29ja2V0ID0gMjE7CiAgc3RhdGljIGNvbnN0IGludCB0eXBlVGNwU29ja2V0ID0gMSA8PCB0Y3BTb2NrZXQ7CiAgc3RhdGljIGNvbnN0IGludCB0eXBlVWRwU29ja2V0ID0gMSA8PCB1ZHBTb2NrZXQ7CiAgc3RhdGljIGNvbnN0IGludCB0eXBlSW50ZXJuYWxTb2NrZXQgPSAxIDw8IGludGVybmFsU29ja2V0OwogIHN0YXRpYyBjb25zdCBpbnQgdHlwZUludGVybmFsU2lnbmFsU29ja2V0ID0gMSA8PCBpbnRlcm5hbFNpZ25hbFNvY2tldDsKICBzdGF0aWMgY29uc3QgaW50IHR5cGVQcm90b2NvbE1hc2sgPSB0eXBlVGNwU29ja2V0IHwKICAgICAgdHlwZVVkcFNvY2tldCB8CiAgICAgIHR5cGVJbnRlcm5hbFNvY2tldCB8CiAgICAgIHR5cGVJbnRlcm5hbFNpZ25hbFNvY2tldDsKCiAgLy8gTmF0aXZlIHBvcnQgbWVzc2FnZXMuCiAgc3RhdGljIGNvbnN0IGhvc3ROYW1lTG9va3VwTWVzc2FnZSA9IDA7CiAgc3RhdGljIGNvbnN0IGxpc3RJbnRlcmZhY2VzTWVzc2FnZSA9IDE7CiAgc3RhdGljIGNvbnN0IHJldmVyc2VMb29rdXBNZXNzYWdlID0gMjsKCiAgLy8gUHJvdG9jb2wgZmxhZ3MuCiAgc3RhdGljIGNvbnN0IGludCBwcm90b2NvbElQdjQgPSAxIDw8IDA7CiAgc3RhdGljIGNvbnN0IGludCBwcm90b2NvbElQdjYgPSAxIDw8IDE7CgogIHN0YXRpYyBjb25zdCBpbnQgbm9ybWFsVG9rZW5CYXRjaFNpemUgPSA4OwogIHN0YXRpYyBjb25zdCBpbnQgbGlzdGVuaW5nVG9rZW5CYXRjaFNpemUgPSAyOwoKICBzdGF0aWMgY29uc3QgRHVyYXRpb24gX3JldHJ5RHVyYXRpb24gPSBjb25zdCBEdXJhdGlvbihtaWxsaXNlY29uZHM6IDI1MCk7CiAgc3RhdGljIGNvbnN0IER1cmF0aW9uIF9yZXRyeUR1cmF0aW9uTG9vcGJhY2sgPQogICAgICBjb25zdCBEdXJhdGlvbihtaWxsaXNlY29uZHM6IDI1KTsKCiAgLy8gU29ja2V0IGNsb3NlIHN0YXRlCiAgYm9vbCBpc0Nsb3NlZCA9IGZhbHNlOwogIGJvb2wgaXNDbG9zaW5nID0gZmFsc2U7CiAgYm9vbCBpc0Nsb3NlZFJlYWQgPSBmYWxzZTsKICBib29sIGNsb3NlZFJlYWRFdmVudFNlbnQgPSBmYWxzZTsKICBib29sIGlzQ2xvc2VkV3JpdGUgPSBmYWxzZTsKICBDb21wbGV0ZXIgY2xvc2VDb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyLnN5bmMoKTsKCiAgLy8gSGFuZGxlcnMgYW5kIHJlY2VpdmUgcG9ydCBmb3Igc29ja2V0IGV2ZW50cyBmcm9tIHRoZSBldmVudCBoYW5kbGVyLgogIGZpbmFsIExpc3QgZXZlbnRIYW5kbGVycyA9IG5ldyBMaXN0KGV2ZW50Q291bnQgKyAxKTsKICBSYXdSZWNlaXZlUG9ydCBldmVudFBvcnQ7CiAgYm9vbCBmbGFnc1NlbnQgPSBmYWxzZTsKCiAgLy8gVGhlIHR5cGUgZmxhZ3MgZm9yIHRoaXMgc29ja2V0LgogIGZpbmFsIGludCB0eXBlRmxhZ3M7CgogIC8vIEhvbGRzIHRoZSBwb3J0IG9mIHRoZSBzb2NrZXQsIDAgaWYgbm90IGtub3duLgogIGludCBsb2NhbFBvcnQgPSAwOwoKICAvLyBIb2xkcyB0aGUgYWRkcmVzcyB1c2VkIHRvIGNvbm5lY3Qgb3IgYmluZCB0aGUgc29ja2V0LgogIEludGVybmV0QWRkcmVzcyBsb2NhbEFkZHJlc3M7CgogIGludCBhdmFpbGFibGUgPSAwOwoKICBpbnQgdG9rZW5zID0gMDsKCiAgYm9vbCBzZW5kUmVhZEV2ZW50cyA9IGZhbHNlOwogIGJvb2wgcmVhZEV2ZW50SXNzdWVkID0gZmFsc2U7CgogIGJvb2wgc2VuZFdyaXRlRXZlbnRzID0gZmFsc2U7CiAgYm9vbCB3cml0ZUV2ZW50SXNzdWVkID0gZmFsc2U7CiAgYm9vbCB3cml0ZUF2YWlsYWJsZSA9IGZhbHNlOwoKICBzdGF0aWMgYm9vbCBjb25uZWN0ZWRSZXNvdXJjZUhhbmRsZXIgPSBmYWxzZTsKICBfUmVhZFdyaXRlUmVzb3VyY2VJbmZvIHJlc291cmNlSW5mbzsKCiAgLy8gVGhlIG93bmVyIG9iamVjdCBpcyB0aGUgb2JqZWN0IHRoYXQgdGhlIFNvY2tldCBpcyBiZWluZyB1c2VkIGJ5LCBlLmcuCiAgLy8gYSBIdHRwU2VydmVyLCBhIFdlYlNvY2tldCBjb25uZWN0aW9uLCBhIHByb2Nlc3MgcGlwZSwgZXRjLgogIE9iamVjdCBvd25lcjsKCiAgc3RhdGljIEZ1dHVyZTxMaXN0PEludGVybmV0QWRkcmVzcz4+IGxvb2t1cChTdHJpbmcgaG9zdCwKICAgICAge0ludGVybmV0QWRkcmVzc1R5cGUgdHlwZTogSW50ZXJuZXRBZGRyZXNzVHlwZS5hbnl9KSB7CiAgICByZXR1cm4gX0lPU2VydmljZS5fZGlzcGF0Y2goX0lPU2VydmljZS5zb2NrZXRMb29rdXAsIFtob3N0LCB0eXBlLl92YWx1ZV0pCiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChpc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgY3JlYXRlRXJyb3IocmVzcG9uc2UsICJGYWlsZWQgaG9zdCBsb29rdXA6ICckaG9zdCciKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gcmVzcG9uc2Uuc2tpcCgxKS5tYXA8SW50ZXJuZXRBZGRyZXNzPigocmVzdWx0KSB7CiAgICAgICAgICB2YXIgdHlwZSA9IG5ldyBJbnRlcm5ldEFkZHJlc3NUeXBlLl9mcm9tKHJlc3VsdFswXSk7CiAgICAgICAgICByZXR1cm4gbmV3IF9JbnRlcm5ldEFkZHJlc3MocmVzdWx0WzFdLCBob3N0LCByZXN1bHRbMl0pOwogICAgICAgIH0pLnRvTGlzdCgpOwogICAgICB9CiAgICB9KTsKICB9CgogIHN0YXRpYyBGdXR1cmU8SW50ZXJuZXRBZGRyZXNzPiByZXZlcnNlTG9va3VwKEludGVybmV0QWRkcmVzcyBhZGRyKSB7CiAgICByZXR1cm4gX0lPU2VydmljZS5fZGlzcGF0Y2goX0lPU2VydmljZS5zb2NrZXRSZXZlcnNlTG9va3VwLAogICAgICAgIFsoYWRkciBhcyBfSW50ZXJuZXRBZGRyZXNzKS5faW5fYWRkcl0pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChpc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgY3JlYXRlRXJyb3IocmVzcG9uc2UsICJGYWlsZWQgcmV2ZXJzZSBob3N0IGxvb2t1cCIsIGFkZHIpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAoYWRkciBhcyBfSW50ZXJuZXRBZGRyZXNzKS5fY2xvbmVXaXRoTmV3SG9zdChyZXNwb25zZSk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgc3RhdGljIEZ1dHVyZTxMaXN0PE5ldHdvcmtJbnRlcmZhY2U+PiBsaXN0SW50ZXJmYWNlcygKICAgICAge2Jvb2wgaW5jbHVkZUxvb3BiYWNrOiBmYWxzZSwKICAgICAgYm9vbCBpbmNsdWRlTGlua0xvY2FsOiBmYWxzZSwKICAgICAgSW50ZXJuZXRBZGRyZXNzVHlwZSB0eXBlOiBJbnRlcm5ldEFkZHJlc3NUeXBlLmFueX0pIHsKICAgIHJldHVybiBfSU9TZXJ2aWNlLl9kaXNwYXRjaChfSU9TZXJ2aWNlLnNvY2tldExpc3RJbnRlcmZhY2VzLCBbdHlwZS5fdmFsdWVdKQogICAgICAgIC50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IGNyZWF0ZUVycm9yKHJlc3BvbnNlLCAiRmFpbGVkIGxpc3RpbmcgaW50ZXJmYWNlcyIpOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBtYXAgPSByZXNwb25zZS5za2lwKDEpLmZvbGQobmV3IE1hcDxTdHJpbmcsIE5ldHdvcmtJbnRlcmZhY2U+KCksCiAgICAgICAgICAgIChtYXAsIHJlc3VsdCkgewogICAgICAgICAgdmFyIHR5cGUgPSBuZXcgSW50ZXJuZXRBZGRyZXNzVHlwZS5fZnJvbShyZXN1bHRbMF0pOwogICAgICAgICAgdmFyIG5hbWUgPSByZXN1bHRbM107CiAgICAgICAgICB2YXIgaW5kZXggPSByZXN1bHRbNF07CiAgICAgICAgICB2YXIgYWRkcmVzcyA9IG5ldyBfSW50ZXJuZXRBZGRyZXNzKHJlc3VsdFsxXSwgIiIsIHJlc3VsdFsyXSk7CiAgICAgICAgICBpZiAoIWluY2x1ZGVMaW5rTG9jYWwgJiYgYWRkcmVzcy5pc0xpbmtMb2NhbCkgcmV0dXJuIG1hcDsKICAgICAgICAgIGlmICghaW5jbHVkZUxvb3BiYWNrICYmIGFkZHJlc3MuaXNMb29wYmFjaykgcmV0dXJuIG1hcDsKICAgICAgICAgIG1hcC5wdXRJZkFic2VudChuYW1lLCAoKSA9PiBuZXcgX05ldHdvcmtJbnRlcmZhY2UobmFtZSwgaW5kZXgpKTsKICAgICAgICAgIG1hcFtuYW1lXS5hZGRyZXNzZXMuYWRkKGFkZHJlc3MpOwogICAgICAgICAgcmV0dXJuIG1hcDsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gbWFwLnZhbHVlcy50b0xpc3QoKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBzdGF0aWMgRnV0dXJlPENvbm5lY3Rpb25UYXNrPF9OYXRpdmVTb2NrZXQ+PiBzdGFydENvbm5lY3QoCiAgICAgIGhvc3QsIGludCBwb3J0LCBzb3VyY2VBZGRyZXNzKSB7CiAgICBfdGhyb3dPbkJhZFBvcnQocG9ydCk7CiAgICBpZiAoc291cmNlQWRkcmVzcyAhPSBudWxsICYmIHNvdXJjZUFkZHJlc3MgaXMhIF9JbnRlcm5ldEFkZHJlc3MpIHsKICAgICAgaWYgKHNvdXJjZUFkZHJlc3MgaXMgU3RyaW5nKSB7CiAgICAgICAgc291cmNlQWRkcmVzcyA9IG5ldyBJbnRlcm5ldEFkZHJlc3Moc291cmNlQWRkcmVzcyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKGhvc3QpLnRoZW4oKGhvc3QpIHsKICAgICAgaWYgKGhvc3QgaXMgX0ludGVybmV0QWRkcmVzcykgcmV0dXJuIFtob3N0XTsKICAgICAgcmV0dXJuIGxvb2t1cChob3N0KS50aGVuKChhZGRyZXNzZXMpIHsKICAgICAgICBpZiAoYWRkcmVzc2VzLmlzRW1wdHkpIHsKICAgICAgICAgIHRocm93IGNyZWF0ZUVycm9yKG51bGwsICJGYWlsZWQgaG9zdCBsb29rdXA6ICckaG9zdCciKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFkZHJlc3NlczsKICAgICAgfSk7CiAgICB9KS50aGVuKChhZGRyZXNzZXMpIHsKICAgICAgdmFyIGNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXI8X05hdGl2ZVNvY2tldD4oKTsKICAgICAgdmFyIGl0ID0gKGFkZHJlc3NlcyBhcyBMaXN0PEludGVybmV0QWRkcmVzcz4pLml0ZXJhdG9yOwogICAgICB2YXIgZXJyb3IgPSBudWxsOwogICAgICB2YXIgY29ubmVjdGluZyA9IG5ldyBIYXNoTWFwKCk7CgogICAgICB2b2lkIGNvbm5lY3ROZXh0KCkgewogICAgICAgIGlmICghaXQubW92ZU5leHQoKSkgewogICAgICAgICAgaWYgKGNvbm5lY3RpbmcuaXNFbXB0eSkgewogICAgICAgICAgICBhc3NlcnQoZXJyb3IgIT0gbnVsbCk7CiAgICAgICAgICAgIGNvbXBsZXRlci5jb21wbGV0ZUVycm9yKGVycm9yKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZmluYWwgX0ludGVybmV0QWRkcmVzcyBhZGRyZXNzID0gaXQuY3VycmVudDsKICAgICAgICB2YXIgc29ja2V0ID0gbmV3IF9OYXRpdmVTb2NrZXQubm9ybWFsKCk7CiAgICAgICAgc29ja2V0LmxvY2FsQWRkcmVzcyA9IGFkZHJlc3M7CiAgICAgICAgdmFyIHJlc3VsdDsKICAgICAgICBpZiAoc291cmNlQWRkcmVzcyA9PSBudWxsKSB7CiAgICAgICAgICByZXN1bHQgPSBzb2NrZXQubmF0aXZlQ3JlYXRlQ29ubmVjdChhZGRyZXNzLl9pbl9hZGRyLCBwb3J0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXNzZXJ0KHNvdXJjZUFkZHJlc3MgaXMgX0ludGVybmV0QWRkcmVzcyk7CiAgICAgICAgICByZXN1bHQgPSBzb2NrZXQubmF0aXZlQ3JlYXRlQmluZENvbm5lY3QoCiAgICAgICAgICAgICAgYWRkcmVzcy5faW5fYWRkciwgcG9ydCwgc291cmNlQWRkcmVzcy5faW5fYWRkcik7CiAgICAgICAgfQogICAgICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICAgICAgLy8gS2VlcCBmaXJzdCBlcnJvciwgaWYgcHJlc2VudC4KICAgICAgICAgIGlmIChlcnJvciA9PSBudWxsKSB7CiAgICAgICAgICAgIGludCBlcnJvckNvZGUgPSByZXN1bHQuZXJyb3JDb2RlOwogICAgICAgICAgICBpZiAoZXJyb3JDb2RlICE9IG51bGwgJiYgc29ja2V0LmlzQmluZEVycm9yKGVycm9yQ29kZSkpIHsKICAgICAgICAgICAgICBlcnJvciA9IGNyZWF0ZUVycm9yKHJlc3VsdCwgIkJpbmQgZmFpbGVkIiwgc291cmNlQWRkcmVzcyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZXJyb3IgPSBjcmVhdGVFcnJvcihyZXN1bHQsICJDb25uZWN0aW9uIGZhaWxlZCIsIGFkZHJlc3MsIHBvcnQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBjb25uZWN0TmV4dCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBRdWVyeSB0aGUgbG9jYWwgcG9ydCBmb3IgZXJyb3IgbWVzc2FnZXMuCiAgICAgICAgICB0cnkgewogICAgICAgICAgICBzb2NrZXQucG9ydDsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgaWYgKGVycm9yID09IG51bGwpIHsKICAgICAgICAgICAgICBlcnJvciA9IGNyZWF0ZUVycm9yKGUsICJDb25uZWN0aW9uIGZhaWxlZCIsIGFkZHJlc3MsIHBvcnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbm5lY3ROZXh0KCk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBTZXQgdXAgdGltZXIgZm9yIHdoZW4gd2Ugc2hvdWxkIHJldHJ5IHRoZSBuZXh0IGFkZHJlc3MKICAgICAgICAgIC8vIChpZiBhbnkpLgogICAgICAgICAgdmFyIGR1cmF0aW9uID0KICAgICAgICAgICAgICBhZGRyZXNzLmlzTG9vcGJhY2sgPyBfcmV0cnlEdXJhdGlvbkxvb3BiYWNrIDogX3JldHJ5RHVyYXRpb247CiAgICAgICAgICB2YXIgdGltZXIgPSBuZXcgVGltZXIoZHVyYXRpb24sIGNvbm5lY3ROZXh0KTsKICAgICAgICAgIHNldHVwUmVzb3VyY2VJbmZvKHNvY2tldCk7CgogICAgICAgICAgY29ubmVjdGluZ1tzb2NrZXRdID0gdGltZXI7CiAgICAgICAgICAvLyBTZXR1cCBoYW5kbGVycyBmb3IgcmVjZWl2aW5nIHRoZSBmaXJzdCB3cml0ZSBldmVudCB3aGljaAogICAgICAgICAgLy8gaW5kaWNhdGUgdGhhdCB0aGUgc29ja2V0IGlzIGZ1bGx5IGNvbm5lY3RlZC4KICAgICAgICAgIHNvY2tldC5zZXRIYW5kbGVycyh3cml0ZTogKCkgewogICAgICAgICAgICB0aW1lci5jYW5jZWwoKTsKICAgICAgICAgICAgc29ja2V0LnNldExpc3RlbmluZyhyZWFkOiBmYWxzZSwgd3JpdGU6IGZhbHNlKTsKICAgICAgICAgICAgY29tcGxldGVyLmNvbXBsZXRlKHNvY2tldCk7CiAgICAgICAgICAgIGNvbm5lY3RpbmcucmVtb3ZlKHNvY2tldCk7CiAgICAgICAgICAgIGNvbm5lY3RpbmcuZm9yRWFjaCgocywgdCkgewogICAgICAgICAgICAgIHQuY2FuY2VsKCk7CiAgICAgICAgICAgICAgcy5jbG9zZSgpOwogICAgICAgICAgICAgIHMuc2V0SGFuZGxlcnMoKTsKICAgICAgICAgICAgICBzLnNldExpc3RlbmluZyhyZWFkOiBmYWxzZSwgd3JpdGU6IGZhbHNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbm5lY3RpbmcuY2xlYXIoKTsKICAgICAgICAgIH0sIGVycm9yOiAoZSkgewogICAgICAgICAgICB0aW1lci5jYW5jZWwoKTsKICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7CiAgICAgICAgICAgIC8vIEtlZXAgZmlyc3QgZXJyb3IsIGlmIHByZXNlbnQuCiAgICAgICAgICAgIGlmIChlcnJvciA9PSBudWxsKSBlcnJvciA9IGU7CiAgICAgICAgICAgIGNvbm5lY3RpbmcucmVtb3ZlKHNvY2tldCk7CiAgICAgICAgICAgIGlmIChjb25uZWN0aW5nLmlzRW1wdHkpIGNvbm5lY3ROZXh0KCk7CiAgICAgICAgICB9KTsKICAgICAgICAgIHNvY2tldC5zZXRMaXN0ZW5pbmcocmVhZDogZmFsc2UsIHdyaXRlOiB0cnVlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZvaWQgb25DYW5jZWwoKSB7CiAgICAgICAgY29ubmVjdGluZy5mb3JFYWNoKChzLCB0KSB7CiAgICAgICAgICB0LmNhbmNlbCgpOwogICAgICAgICAgcy5jbG9zZSgpOwogICAgICAgICAgcy5zZXRIYW5kbGVycygpOwogICAgICAgICAgcy5zZXRMaXN0ZW5pbmcocmVhZDogZmFsc2UsIHdyaXRlOiBmYWxzZSk7CiAgICAgICAgICBpZiAoZXJyb3IgPT0gbnVsbCkgewogICAgICAgICAgICBlcnJvciA9IGNyZWF0ZUVycm9yKG51bGwsCiAgICAgICAgICAgICAgICAiQ29ubmVjdGlvbiBhdHRlbXB0IGNhbmNlbGxlZCwgaG9zdDogJHtob3N0fSwgcG9ydDogJHtwb3J0fSIpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGNvbm5lY3RpbmcuY2xlYXIoKTsKICAgICAgICBpZiAoIWNvbXBsZXRlci5pc0NvbXBsZXRlZCkgewogICAgICAgICAgY29tcGxldGVyLmNvbXBsZXRlRXJyb3IoZXJyb3IpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgY29ubmVjdE5leHQoKTsKICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uVGFzazxfTmF0aXZlU29ja2V0Pi5fKAogICAgICAgICAgc29ja2V0OiBjb21wbGV0ZXIuZnV0dXJlLCBvbkNhbmNlbDogb25DYW5jZWwpOwogICAgfSk7CiAgfQoKICBzdGF0aWMgRnV0dXJlPF9OYXRpdmVTb2NrZXQ+IGNvbm5lY3QoCiAgICAgIGhvc3QsIGludCBwb3J0LCBzb3VyY2VBZGRyZXNzLCBEdXJhdGlvbiB0aW1lb3V0KSB7CiAgICByZXR1cm4gc3RhcnRDb25uZWN0KGhvc3QsIHBvcnQsIHNvdXJjZUFkZHJlc3MpCiAgICAgICAgLnRoZW4oKENvbm5lY3Rpb25UYXNrPF9OYXRpdmVTb2NrZXQ+IHRhc2spIHsKICAgICAgRnV0dXJlPF9OYXRpdmVTb2NrZXQ+IHNvY2tldEZ1dHVyZSA9IHRhc2suc29ja2V0OwogICAgICBpZiAodGltZW91dCAhPSBudWxsKSB7CiAgICAgICAgc29ja2V0RnV0dXJlID0gc29ja2V0RnV0dXJlLnRpbWVvdXQodGltZW91dCwgb25UaW1lb3V0OiAoKSB7CiAgICAgICAgICB0YXNrLmNhbmNlbCgpOwogICAgICAgICAgdGhyb3cgY3JlYXRlRXJyb3IoCiAgICAgICAgICAgICAgbnVsbCwgIkNvbm5lY3Rpb24gdGltZWQgb3V0LCBob3N0OiAke2hvc3R9LCBwb3J0OiAke3BvcnR9Iik7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHNvY2tldEZ1dHVyZTsKICAgIH0pOwogIH0KCiAgc3RhdGljIEZ1dHVyZTxfSW50ZXJuZXRBZGRyZXNzPiBfcmVzb2x2ZUhvc3QoaG9zdCkgYXN5bmMgewogICAgaWYgKGhvc3QgaXMgX0ludGVybmV0QWRkcmVzcykgewogICAgICByZXR1cm4gaG9zdDsKICAgIH0gZWxzZSB7CiAgICAgIGZpbmFsIGxpc3QgPSBhd2FpdCBsb29rdXAoaG9zdCk7CiAgICAgIGlmIChsaXN0LmlzRW1wdHkpIHsKICAgICAgICB0aHJvdyBjcmVhdGVFcnJvcihudWxsLCAiRmFpbGVkIGhvc3QgbG9va3VwOiAnJGhvc3QnIik7CiAgICAgIH0KICAgICAgcmV0dXJuIGxpc3QuZmlyc3QgYXMgX0ludGVybmV0QWRkcmVzczsKICAgIH0KICB9CgogIHN0YXRpYyBGdXR1cmU8X05hdGl2ZVNvY2tldD4gYmluZCgKICAgICAgaG9zdCwgaW50IHBvcnQsIGludCBiYWNrbG9nLCBib29sIHY2T25seSwgYm9vbCBzaGFyZWQpIGFzeW5jIHsKICAgIF90aHJvd09uQmFkUG9ydChwb3J0KTsKCiAgICBmaW5hbCBhZGRyZXNzID0gYXdhaXQgX3Jlc29sdmVIb3N0KGhvc3QpOwoKICAgIHZhciBzb2NrZXQgPSBuZXcgX05hdGl2ZVNvY2tldC5saXN0ZW4oKTsKICAgIHNvY2tldC5sb2NhbEFkZHJlc3MgPSBhZGRyZXNzOwogICAgdmFyIHJlc3VsdCA9IHNvY2tldC5uYXRpdmVDcmVhdGVCaW5kTGlzdGVuKAogICAgICAgIGFkZHJlc3MuX2luX2FkZHIsIHBvcnQsIGJhY2tsb2csIHY2T25seSwgc2hhcmVkKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgU29ja2V0RXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIHNlcnZlciBzb2NrZXQiLAogICAgICAgICAgb3NFcnJvcjogcmVzdWx0LCBhZGRyZXNzOiBhZGRyZXNzLCBwb3J0OiBwb3J0KTsKICAgIH0KICAgIGlmIChwb3J0ICE9IDApIHNvY2tldC5sb2NhbFBvcnQgPSBwb3J0OwogICAgc2V0dXBSZXNvdXJjZUluZm8oc29ja2V0KTsKICAgIHNvY2tldC5jb25uZWN0VG9FdmVudEhhbmRsZXIoKTsKICAgIHJldHVybiBzb2NrZXQ7CiAgfQoKICBzdGF0aWMgdm9pZCBzZXR1cFJlc291cmNlSW5mbyhfTmF0aXZlU29ja2V0IHNvY2tldCkgewogICAgc29ja2V0LnJlc291cmNlSW5mbyA9IG5ldyBfU29ja2V0UmVzb3VyY2VJbmZvKHNvY2tldCk7CiAgfQoKICBzdGF0aWMgRnV0dXJlPF9OYXRpdmVTb2NrZXQ+IGJpbmREYXRhZ3JhbSgKICAgICAgaG9zdCwgaW50IHBvcnQsIGJvb2wgcmV1c2VBZGRyZXNzLCBib29sIHJldXNlUG9ydCwgaW50IHR0bCkgYXN5bmMgewogICAgX3Rocm93T25CYWRQb3J0KHBvcnQpOwogICAgX3Rocm93T25CYWRUdGwodHRsKTsKCiAgICBmaW5hbCBhZGRyZXNzID0gYXdhaXQgX3Jlc29sdmVIb3N0KGhvc3QpOwoKICAgIHZhciBzb2NrZXQgPSBuZXcgX05hdGl2ZVNvY2tldC5kYXRhZ3JhbShhZGRyZXNzKTsKICAgIHZhciByZXN1bHQgPSBzb2NrZXQubmF0aXZlQ3JlYXRlQmluZERhdGFncmFtKAogICAgICAgIGFkZHJlc3MuX2luX2FkZHIsIHBvcnQsIHJldXNlQWRkcmVzcywgcmV1c2VQb3J0LCB0dGwpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBTb2NrZXRFeGNlcHRpb24oIkZhaWxlZCB0byBjcmVhdGUgZGF0YWdyYW0gc29ja2V0IiwKICAgICAgICAgIG9zRXJyb3I6IHJlc3VsdCwgYWRkcmVzczogYWRkcmVzcywgcG9ydDogcG9ydCk7CiAgICB9CiAgICBpZiAocG9ydCAhPSAwKSBzb2NrZXQubG9jYWxQb3J0ID0gcG9ydDsKICAgIHNldHVwUmVzb3VyY2VJbmZvKHNvY2tldCk7CiAgICByZXR1cm4gc29ja2V0OwogIH0KCiAgX05hdGl2ZVNvY2tldC5kYXRhZ3JhbSh0aGlzLmxvY2FsQWRkcmVzcykKICAgICAgOiB0eXBlRmxhZ3MgPSB0eXBlTm9ybWFsU29ja2V0IHwgdHlwZVVkcFNvY2tldDsKCiAgX05hdGl2ZVNvY2tldC5ub3JtYWwoKSA6IHR5cGVGbGFncyA9IHR5cGVOb3JtYWxTb2NrZXQgfCB0eXBlVGNwU29ja2V0OwoKICBfTmF0aXZlU29ja2V0Lmxpc3RlbigpIDogdHlwZUZsYWdzID0gdHlwZUxpc3RlbmluZ1NvY2tldCB8IHR5cGVUY3BTb2NrZXQgewogICAgaXNDbG9zZWRXcml0ZSA9IHRydWU7CiAgfQoKICBfTmF0aXZlU29ja2V0LnBpcGUoKSA6IHR5cGVGbGFncyA9IHR5cGVQaXBlOwoKICBfTmF0aXZlU29ja2V0Ll93YXRjaENvbW1vbihpbnQgaWQsIGludCB0eXBlKQogICAgICA6IHR5cGVGbGFncyA9IHR5cGVOb3JtYWxTb2NrZXQgfCB0eXBlIHsKICAgIGlzQ2xvc2VkV3JpdGUgPSB0cnVlOwogICAgbmF0aXZlU2V0U29ja2V0SWQoaWQsIHR5cGVGbGFncyk7CiAgfQoKICBfTmF0aXZlU29ja2V0LndhdGNoU2lnbmFsKGludCBpZCkKICAgICAgOiB0aGlzLl93YXRjaENvbW1vbihpZCwgdHlwZUludGVybmFsU2lnbmFsU29ja2V0KTsKCiAgX05hdGl2ZVNvY2tldC53YXRjaChpbnQgaWQpIDogdGhpcy5fd2F0Y2hDb21tb24oaWQsIHR5cGVJbnRlcm5hbFNvY2tldCk7CgogIGJvb2wgZ2V0IGlzTGlzdGVuaW5nID0+ICh0eXBlRmxhZ3MgJiB0eXBlTGlzdGVuaW5nU29ja2V0KSAhPSAwOwogIGJvb2wgZ2V0IGlzUGlwZSA9PiAodHlwZUZsYWdzICYgdHlwZVBpcGUpICE9IDA7CiAgYm9vbCBnZXQgaXNJbnRlcm5hbCA9PiAodHlwZUZsYWdzICYgdHlwZUludGVybmFsU29ja2V0KSAhPSAwOwogIGJvb2wgZ2V0IGlzSW50ZXJuYWxTaWduYWwgPT4gKHR5cGVGbGFncyAmIHR5cGVJbnRlcm5hbFNpZ25hbFNvY2tldCkgIT0gMDsKICBib29sIGdldCBpc1RjcCA9PiAodHlwZUZsYWdzICYgdHlwZVRjcFNvY2tldCkgIT0gMDsKICBib29sIGdldCBpc1VkcCA9PiAodHlwZUZsYWdzICYgdHlwZVVkcFNvY2tldCkgIT0gMDsKCiAgTWFwIF90b0pTT04oYm9vbCByZWYpID0+IHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKICBTdHJpbmcgZ2V0IF9zZXJ2aWNlVHlwZVBhdGggPT4gdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOwogIFN0cmluZyBnZXQgX3NlcnZpY2VUeXBlTmFtZSA9PiB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7CgogIExpc3Q8aW50PiByZWFkKGludCBsZW4pIHsKICAgIGlmIChsZW4gIT0gbnVsbCAmJiBsZW4gPD0gMCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiSWxsZWdhbCBsZW5ndGggJGxlbiIpOwogICAgfQogICAgaWYgKGlzQ2xvc2luZyB8fCBpc0Nsb3NlZCkgcmV0dXJuIG51bGw7CiAgICBsZW4gPSBtaW4oYXZhaWxhYmxlLCBsZW4gPT0gbnVsbCA/IGF2YWlsYWJsZSA6IGxlbik7CiAgICBpZiAobGVuID09IDApIHJldHVybiBudWxsOwogICAgdmFyIHJlc3VsdCA9IG5hdGl2ZVJlYWQobGVuKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICByZXBvcnRFcnJvcihyZXN1bHQsICJSZWFkIGZhaWxlZCIpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewogICAgICBhdmFpbGFibGUgLT0gcmVzdWx0Lmxlbmd0aDsKICAgICAgLy8gVE9ETyhyaWNvdyk6IFJlbW92ZSB3aGVuIHdlIHRyYWNrIGludGVybmFsIGFuZCBwaXBlIHVzZXMuCiAgICAgIGFzc2VydChyZXNvdXJjZUluZm8gIT0gbnVsbCB8fCBpc1BpcGUgfHwgaXNJbnRlcm5hbCB8fCBpc0ludGVybmFsU2lnbmFsKTsKICAgICAgaWYgKHJlc291cmNlSW5mbyAhPSBudWxsKSB7CiAgICAgICAgcmVzb3VyY2VJbmZvLnRvdGFsUmVhZCArPSByZXN1bHQubGVuZ3RoOwogICAgICB9CiAgICB9CiAgICAvLyBUT0RPKHJpY293KTogUmVtb3ZlIHdoZW4gd2UgdHJhY2sgaW50ZXJuYWwgYW5kIHBpcGUgdXNlcy4KICAgIGFzc2VydChyZXNvdXJjZUluZm8gIT0gbnVsbCB8fCBpc1BpcGUgfHwgaXNJbnRlcm5hbCB8fCBpc0ludGVybmFsU2lnbmFsKTsKICAgIGlmIChyZXNvdXJjZUluZm8gIT0gbnVsbCkgewogICAgICByZXNvdXJjZUluZm8uZGlkUmVhZCgpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIERhdGFncmFtIHJlY2VpdmUoKSB7CiAgICBpZiAoaXNDbG9zaW5nIHx8IGlzQ2xvc2VkKSByZXR1cm4gbnVsbDsKICAgIHZhciByZXN1bHQgPSBuYXRpdmVSZWN2RnJvbSgpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHJlcG9ydEVycm9yKHJlc3VsdCwgIlJlY2VpdmUgZmFpbGVkIik7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CiAgICAgIC8vIFJlYWQgdGhlIG5leHQgYXZhaWxhYmxlLiBBdmFpbGFibGUgaXMgb25seSBmb3IgdGhlIG5leHQgZGF0YWdyYW0sIG5vdAogICAgICAvLyB0aGUgc3VtIG9mIGFsbCBkYXRhZ3JhbXMgcGVuZGluZywgc28gd2UgbmVlZCB0byBjYWxsIGFmdGVyIGVhY2gKICAgICAgLy8gcmVjZWl2ZS4gSWYgYXZhaWxhYmxlIGJlY29tZXMgPiAwLCB0aGUgX05hdGl2ZVNvY2tldCB3aWxsIGNvbnRpbnVlIHRvCiAgICAgIC8vIGVtaXQgcmVhZCBldmVudHMuCiAgICAgIGF2YWlsYWJsZSA9IG5hdGl2ZUF2YWlsYWJsZSgpOwogICAgICAvLyBUT0RPKHJpY293KTogUmVtb3ZlIHdoZW4gd2UgdHJhY2sgaW50ZXJuYWwgYW5kIHBpcGUgdXNlcy4KICAgICAgYXNzZXJ0KHJlc291cmNlSW5mbyAhPSBudWxsIHx8IGlzUGlwZSB8fCBpc0ludGVybmFsIHx8IGlzSW50ZXJuYWxTaWduYWwpOwogICAgICBpZiAocmVzb3VyY2VJbmZvICE9IG51bGwpIHsKICAgICAgICByZXNvdXJjZUluZm8udG90YWxSZWFkICs9IHJlc3VsdC5kYXRhLmxlbmd0aDsKICAgICAgfQogICAgfQogICAgLy8gVE9ETyhyaWNvdyk6IFJlbW92ZSB3aGVuIHdlIHRyYWNrIGludGVybmFsIGFuZCBwaXBlIHVzZXMuCiAgICBhc3NlcnQocmVzb3VyY2VJbmZvICE9IG51bGwgfHwgaXNQaXBlIHx8IGlzSW50ZXJuYWwgfHwgaXNJbnRlcm5hbFNpZ25hbCk7CiAgICBpZiAocmVzb3VyY2VJbmZvICE9IG51bGwpIHsKICAgICAgcmVzb3VyY2VJbmZvLmRpZFJlYWQoKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBpbnQgd3JpdGUoTGlzdDxpbnQ+IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGJ5dGVzKSB7CiAgICBpZiAoYnVmZmVyIGlzISBMaXN0KSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigpOwogICAgaWYgKG9mZnNldCA9PSBudWxsKSBvZmZzZXQgPSAwOwogICAgaWYgKGJ5dGVzID09IG51bGwpIHsKICAgICAgaWYgKG9mZnNldCA+IGJ1ZmZlci5sZW5ndGgpIHsKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci52YWx1ZShvZmZzZXQpOwogICAgICB9CiAgICAgIGJ5dGVzID0gYnVmZmVyLmxlbmd0aCAtIG9mZnNldDsKICAgIH0KICAgIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvci52YWx1ZShvZmZzZXQpOwogICAgaWYgKGJ5dGVzIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IudmFsdWUoYnl0ZXMpOwogICAgaWYgKChvZmZzZXQgKyBieXRlcykgPiBidWZmZXIubGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnZhbHVlKG9mZnNldCArIGJ5dGVzKTsKICAgIH0KICAgIGlmIChvZmZzZXQgaXMhIGludCB8fCBieXRlcyBpcyEgaW50KSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50cyB0byB3cml0ZSBvbiBTb2NrZXQiKTsKICAgIH0KICAgIGlmIChpc0Nsb3NpbmcgfHwgaXNDbG9zZWQpIHJldHVybiAwOwogICAgaWYgKGJ5dGVzID09IDApIHJldHVybiAwOwogICAgX0J1ZmZlckFuZFN0YXJ0IGJ1ZmZlckFuZFN0YXJ0ID0KICAgICAgICBfZW5zdXJlRmFzdEFuZFNlcmlhbGl6YWJsZUJ5dGVEYXRhKGJ1ZmZlciwgb2Zmc2V0LCBvZmZzZXQgKyBieXRlcyk7CiAgICB2YXIgcmVzdWx0ID0KICAgICAgICBuYXRpdmVXcml0ZShidWZmZXJBbmRTdGFydC5idWZmZXIsIGJ1ZmZlckFuZFN0YXJ0LnN0YXJ0LCBieXRlcyk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgT1NFcnJvciBvc0Vycm9yID0gcmVzdWx0OwogICAgICBzY2hlZHVsZU1pY3JvdGFzaygoKSA9PiByZXBvcnRFcnJvcihvc0Vycm9yLCAiV3JpdGUgZmFpbGVkIikpOwogICAgICByZXN1bHQgPSAwOwogICAgfQogICAgLy8gVGhlIHJlc3VsdCBtYXkgYmUgbmVnYXRpdmUsIGlmIHdlIGZvcmNlZCBhIHNob3J0IHdyaXRlIGZvciB0ZXN0aW5nCiAgICAvLyBwdXJwb3NlLiBJbiBzdWNoIGNhc2UsIGRvbid0IG1hcmsgd3JpdGVBdmFpbGFibGUgYXMgZmFsc2UsIGFzIHdlIGRvbid0CiAgICAvLyBrbm93IGlmIHdlJ2xsIHJlY2VpdmUgYW4gZXZlbnQuIEl0J3MgYmV0dGVyIHRvIGp1c3QgcmV0cnkuCiAgICBpZiAocmVzdWx0ID49IDAgJiYgcmVzdWx0IDwgYnl0ZXMpIHsKICAgICAgd3JpdGVBdmFpbGFibGUgPSBmYWxzZTsKICAgIH0KICAgIC8vIE5lZ2F0ZSB0aGUgcmVzdWx0LCBhcyBzdGF0ZWQgYWJvdmUuCiAgICBpZiAocmVzdWx0IDwgMCkgcmVzdWx0ID0gLXJlc3VsdDsKICAgIC8vIFRPRE8ocmljb3cpOiBSZW1vdmUgd2hlbiB3ZSB0cmFjayBpbnRlcm5hbCBhbmQgcGlwZSB1c2VzLgogICAgYXNzZXJ0KHJlc291cmNlSW5mbyAhPSBudWxsIHx8IGlzUGlwZSB8fCBpc0ludGVybmFsIHx8IGlzSW50ZXJuYWxTaWduYWwpOwogICAgaWYgKHJlc291cmNlSW5mbyAhPSBudWxsKSB7CiAgICAgIHJlc291cmNlSW5mby5hZGRXcml0ZShyZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGludCBzZW5kKExpc3Q8aW50PiBidWZmZXIsIGludCBvZmZzZXQsIGludCBieXRlcywgSW50ZXJuZXRBZGRyZXNzIGFkZHJlc3MsCiAgICAgIGludCBwb3J0KSB7CiAgICBfdGhyb3dPbkJhZFBvcnQocG9ydCk7CiAgICBpZiAoaXNDbG9zaW5nIHx8IGlzQ2xvc2VkKSByZXR1cm4gMDsKICAgIF9CdWZmZXJBbmRTdGFydCBidWZmZXJBbmRTdGFydCA9CiAgICAgICAgX2Vuc3VyZUZhc3RBbmRTZXJpYWxpemFibGVCeXRlRGF0YShidWZmZXIsIG9mZnNldCwgYnl0ZXMpOwogICAgdmFyIHJlc3VsdCA9IG5hdGl2ZVNlbmRUbyhidWZmZXJBbmRTdGFydC5idWZmZXIsIGJ1ZmZlckFuZFN0YXJ0LnN0YXJ0LAogICAgICAgIGJ5dGVzLCAoYWRkcmVzcyBhcyBfSW50ZXJuZXRBZGRyZXNzKS5faW5fYWRkciwgcG9ydCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgT1NFcnJvciBvc0Vycm9yID0gcmVzdWx0OwogICAgICBzY2hlZHVsZU1pY3JvdGFzaygoKSA9PiByZXBvcnRFcnJvcihvc0Vycm9yLCAiU2VuZCBmYWlsZWQiKSk7CiAgICAgIHJlc3VsdCA9IDA7CiAgICB9CiAgICAvLyBUT0RPKHJpY293KTogUmVtb3ZlIHdoZW4gd2UgdHJhY2sgaW50ZXJuYWwgYW5kIHBpcGUgdXNlcy4KICAgIGFzc2VydChyZXNvdXJjZUluZm8gIT0gbnVsbCB8fCBpc1BpcGUgfHwgaXNJbnRlcm5hbCB8fCBpc0ludGVybmFsU2lnbmFsKTsKICAgIGlmIChyZXNvdXJjZUluZm8gIT0gbnVsbCkgewogICAgICByZXNvdXJjZUluZm8uYWRkV3JpdGUocmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBfTmF0aXZlU29ja2V0IGFjY2VwdCgpIHsKICAgIC8vIERvbid0IGlzc3VlIGFjY2VwdCBpZiB3ZSdyZSBjbG9zaW5nLgogICAgaWYgKGlzQ2xvc2luZyB8fCBpc0Nsb3NlZCkgcmV0dXJuIG51bGw7CiAgICBhc3NlcnQoYXZhaWxhYmxlID4gMCk7CiAgICBhdmFpbGFibGUtLTsKICAgIHRva2VucysrOwogICAgcmV0dXJuVG9rZW5zKGxpc3RlbmluZ1Rva2VuQmF0Y2hTaXplKTsKICAgIHZhciBzb2NrZXQgPSBuZXcgX05hdGl2ZVNvY2tldC5ub3JtYWwoKTsKICAgIGlmIChuYXRpdmVBY2NlcHQoc29ja2V0KSAhPSB0cnVlKSByZXR1cm4gbnVsbDsKICAgIHNvY2tldC5sb2NhbFBvcnQgPSBsb2NhbFBvcnQ7CiAgICBzb2NrZXQubG9jYWxBZGRyZXNzID0gYWRkcmVzczsKICAgIHNldHVwUmVzb3VyY2VJbmZvKHNvY2tldCk7CiAgICAvLyBUT0RPKHJpY293KTogUmVtb3ZlIHdoZW4gd2UgdHJhY2sgaW50ZXJuYWwgYW5kIHBpcGUgdXNlcy4KICAgIGFzc2VydChyZXNvdXJjZUluZm8gIT0gbnVsbCB8fCBpc1BpcGUgfHwgaXNJbnRlcm5hbCB8fCBpc0ludGVybmFsU2lnbmFsKTsKICAgIGlmIChyZXNvdXJjZUluZm8gIT0gbnVsbCkgewogICAgICAvLyBXZSB0cmFjayB0aGlzIGFzIHJlYWQgb25lIGJ5dGUuCiAgICAgIHJlc291cmNlSW5mby5hZGRSZWFkKDEpOwogICAgfQogICAgcmV0dXJuIHNvY2tldDsKICB9CgogIGludCBnZXQgcG9ydCB7CiAgICBpZiAobG9jYWxQb3J0ICE9IDApIHJldHVybiBsb2NhbFBvcnQ7CiAgICBpZiAoaXNDbG9zaW5nIHx8IGlzQ2xvc2VkKSB0aHJvdyBjb25zdCBTb2NrZXRFeGNlcHRpb24uY2xvc2VkKCk7CiAgICB2YXIgcmVzdWx0ID0gbmF0aXZlR2V0UG9ydCgpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB0aHJvdyByZXN1bHQ7CiAgICByZXR1cm4gbG9jYWxQb3J0ID0gcmVzdWx0OwogIH0KCiAgaW50IGdldCByZW1vdGVQb3J0IHsKICAgIGlmIChpc0Nsb3NpbmcgfHwgaXNDbG9zZWQpIHRocm93IGNvbnN0IFNvY2tldEV4Y2VwdGlvbi5jbG9zZWQoKTsKICAgIHZhciByZXN1bHQgPSBuYXRpdmVHZXRSZW1vdGVQZWVyKCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHRocm93IHJlc3VsdDsKICAgIHJldHVybiByZXN1bHRbMV07CiAgfQoKICBJbnRlcm5ldEFkZHJlc3MgZ2V0IGFkZHJlc3MgPT4gbG9jYWxBZGRyZXNzOwoKICBJbnRlcm5ldEFkZHJlc3MgZ2V0IHJlbW90ZUFkZHJlc3MgewogICAgaWYgKGlzQ2xvc2luZyB8fCBpc0Nsb3NlZCkgdGhyb3cgY29uc3QgU29ja2V0RXhjZXB0aW9uLmNsb3NlZCgpOwogICAgdmFyIHJlc3VsdCA9IG5hdGl2ZUdldFJlbW90ZVBlZXIoKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgdGhyb3cgcmVzdWx0OwogICAgdmFyIGFkZHIgPSByZXN1bHRbMF07CiAgICB2YXIgdHlwZSA9IG5ldyBJbnRlcm5ldEFkZHJlc3NUeXBlLl9mcm9tKGFkZHJbMF0pOwogICAgcmV0dXJuIG5ldyBfSW50ZXJuZXRBZGRyZXNzKGFkZHJbMV0sIG51bGwsIGFkZHJbMl0pOwogIH0KCiAgdm9pZCBpc3N1ZVJlYWRFdmVudCgpIHsKICAgIGlmIChjbG9zZWRSZWFkRXZlbnRTZW50KSByZXR1cm47CiAgICBpZiAocmVhZEV2ZW50SXNzdWVkKSByZXR1cm47CiAgICByZWFkRXZlbnRJc3N1ZWQgPSB0cnVlOwogICAgdm9pZCBpc3N1ZSgpIHsKICAgICAgcmVhZEV2ZW50SXNzdWVkID0gZmFsc2U7CiAgICAgIGlmIChpc0Nsb3NpbmcpIHJldHVybjsKICAgICAgaWYgKCFzZW5kUmVhZEV2ZW50cykgcmV0dXJuOwogICAgICBpZiAoYXZhaWxhYmxlID09IDApIHsKICAgICAgICBpZiAoaXNDbG9zZWRSZWFkICYmICFjbG9zZWRSZWFkRXZlbnRTZW50KSB7CiAgICAgICAgICBpZiAoaXNDbG9zZWRXcml0ZSkgY2xvc2UoKTsKICAgICAgICAgIHZhciBoYW5kbGVyID0gZXZlbnRIYW5kbGVyc1tjbG9zZWRFdmVudF07CiAgICAgICAgICBpZiAoaGFuZGxlciA9PSBudWxsKSByZXR1cm47CiAgICAgICAgICBjbG9zZWRSZWFkRXZlbnRTZW50ID0gdHJ1ZTsKICAgICAgICAgIGhhbmRsZXIoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBoYW5kbGVyID0gZXZlbnRIYW5kbGVyc1tyZWFkRXZlbnRdOwogICAgICBpZiAoaGFuZGxlciA9PSBudWxsKSByZXR1cm47CiAgICAgIHJlYWRFdmVudElzc3VlZCA9IHRydWU7CiAgICAgIGhhbmRsZXIoKTsKICAgICAgc2NoZWR1bGVNaWNyb3Rhc2soaXNzdWUpOwogICAgfQoKICAgIHNjaGVkdWxlTWljcm90YXNrKGlzc3VlKTsKICB9CgogIHZvaWQgaXNzdWVXcml0ZUV2ZW50KHtib29sIGRlbGF5ZWQ6IHRydWV9KSB7CiAgICBpZiAod3JpdGVFdmVudElzc3VlZCkgcmV0dXJuOwogICAgaWYgKCF3cml0ZUF2YWlsYWJsZSkgcmV0dXJuOwogICAgdm9pZCBpc3N1ZSgpIHsKICAgICAgd3JpdGVFdmVudElzc3VlZCA9IGZhbHNlOwogICAgICBpZiAoIXdyaXRlQXZhaWxhYmxlKSByZXR1cm47CiAgICAgIGlmIChpc0Nsb3NpbmcpIHJldHVybjsKICAgICAgaWYgKCFzZW5kV3JpdGVFdmVudHMpIHJldHVybjsKICAgICAgc2VuZFdyaXRlRXZlbnRzID0gZmFsc2U7CiAgICAgIHZhciBoYW5kbGVyID0gZXZlbnRIYW5kbGVyc1t3cml0ZUV2ZW50XTsKICAgICAgaWYgKGhhbmRsZXIgPT0gbnVsbCkgcmV0dXJuOwogICAgICBoYW5kbGVyKCk7CiAgICB9CgogICAgaWYgKGRlbGF5ZWQpIHsKICAgICAgd3JpdGVFdmVudElzc3VlZCA9IHRydWU7CiAgICAgIHNjaGVkdWxlTWljcm90YXNrKGlzc3VlKTsKICAgIH0gZWxzZSB7CiAgICAgIGlzc3VlKCk7CiAgICB9CiAgfQoKICAvLyBNdWx0aXBsZXhlcyBzb2NrZXQgZXZlbnRzIHRvIHRoZSBzb2NrZXQgaGFuZGxlcnMuCiAgdm9pZCBtdWx0aXBsZXgoT2JqZWN0IGV2ZW50c09iaikgewogICAgLy8gVE9ETyhwYXVsYmVycnkpOiB3aGVuIGlzc3VlICMzMTMwNSBpcyBmaXhlZCwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gc2ltcGx5CiAgICAvLyBkZWNsYXJlIGBldmVudHNgIGFzIGEgYGNvdmFyaWFudCBpbnRgIHBhcmFtZXRlci4KICAgIGludCBldmVudHMgPSBldmVudHNPYmo7CiAgICBmb3IgKGludCBpID0gZmlyc3RFdmVudDsgaSA8PSBsYXN0RXZlbnQ7IGkrKykgewogICAgICBpZiAoKChldmVudHMgJiAoMSA8PCBpKSkgIT0gMCkpIHsKICAgICAgICBpZiAoKGkgPT0gY2xvc2VkRXZlbnQgfHwgaSA9PSByZWFkRXZlbnQpICYmIGlzQ2xvc2VkUmVhZCkgY29udGludWU7CiAgICAgICAgaWYgKGlzQ2xvc2luZyAmJiBpICE9IGRlc3Ryb3llZEV2ZW50KSBjb250aW51ZTsKICAgICAgICBpZiAoaSA9PSBjbG9zZWRFdmVudCAmJiAhaXNMaXN0ZW5pbmcgJiYgIWlzQ2xvc2luZyAmJiAhaXNDbG9zZWQpIHsKICAgICAgICAgIGlzQ2xvc2VkUmVhZCA9IHRydWU7CiAgICAgICAgICBpc3N1ZVJlYWRFdmVudCgpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoaSA9PSB3cml0ZUV2ZW50KSB7CiAgICAgICAgICB3cml0ZUF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICBpc3N1ZVdyaXRlRXZlbnQoZGVsYXllZDogZmFsc2UpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoaSA9PSByZWFkRXZlbnQpIHsKICAgICAgICAgIGlmIChpc0xpc3RlbmluZykgewogICAgICAgICAgICBhdmFpbGFibGUrKzsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGF2YWlsYWJsZSA9IG5hdGl2ZUF2YWlsYWJsZSgpOwogICAgICAgICAgICBpc3N1ZVJlYWRFdmVudCgpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHZhciBoYW5kbGVyID0gZXZlbnRIYW5kbGVyc1tpXTsKICAgICAgICBpZiAoaSA9PSBkZXN0cm95ZWRFdmVudCkgewogICAgICAgICAgYXNzZXJ0KGlzQ2xvc2luZyk7CiAgICAgICAgICBhc3NlcnQoIWlzQ2xvc2VkKTsKICAgICAgICAgIC8vIFRPRE8ocmljb3cpOiBSZW1vdmUvdXBkYXRlIHdoZW4gd2UgdHJhY2sgaW50ZXJuYWwgYW5kIHBpcGUgdXNlcy4KICAgICAgICAgIGFzc2VydCgKICAgICAgICAgICAgICByZXNvdXJjZUluZm8gIT0gbnVsbCB8fCBpc1BpcGUgfHwgaXNJbnRlcm5hbCB8fCBpc0ludGVybmFsU2lnbmFsKTsKICAgICAgICAgIGlmIChyZXNvdXJjZUluZm8gIT0gbnVsbCkgewogICAgICAgICAgICBfU29ja2V0UmVzb3VyY2VJbmZvLlNvY2tldENsb3NlZChyZXNvdXJjZUluZm8pOwogICAgICAgICAgfQogICAgICAgICAgaXNDbG9zZWQgPSB0cnVlOwogICAgICAgICAgY2xvc2VDb21wbGV0ZXIuY29tcGxldGUoKTsKICAgICAgICAgIGRpc2Nvbm5lY3RGcm9tRXZlbnRIYW5kbGVyKCk7CiAgICAgICAgICBpZiAoaGFuZGxlciAhPSBudWxsKSBoYW5kbGVyKCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGlmIChpID09IGVycm9yRXZlbnQpIHsKICAgICAgICAgIGlmICghaXNDbG9zaW5nKSB7CiAgICAgICAgICAgIHJlcG9ydEVycm9yKG5hdGl2ZUdldEVycm9yKCksICIiKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCFpc0Nsb3NlZCkgewogICAgICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkIHJpZ2h0IGFmdGVyIGl0J3MgYWNjZXB0ZWQsIHRoZXJlJ3MgYQogICAgICAgICAgLy8gY2hhbmNlIHRoZSBjbG9zZS1oYW5kbGVyIGlzIG5vdCBzZXQuCiAgICAgICAgICBpZiAoaGFuZGxlciAhPSBudWxsKSBoYW5kbGVyKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoIWlzTGlzdGVuaW5nKSB7CiAgICAgIHRva2VucysrOwogICAgICByZXR1cm5Ub2tlbnMobm9ybWFsVG9rZW5CYXRjaFNpemUpOwogICAgfQogIH0KCiAgdm9pZCByZXR1cm5Ub2tlbnMoaW50IHRva2VuQmF0Y2hTaXplKSB7CiAgICBpZiAoIWlzQ2xvc2luZyAmJiAhaXNDbG9zZWQpIHsKICAgICAgYXNzZXJ0KGV2ZW50UG9ydCAhPSBudWxsKTsKICAgICAgLy8gUmV0dXJuIGluIGJhdGNoZXMuCiAgICAgIGlmICh0b2tlbnMgPT0gdG9rZW5CYXRjaFNpemUpIHsKICAgICAgICBhc3NlcnQodG9rZW5zIDwgKDEgPDwgZmlyc3RDb21tYW5kKSk7CiAgICAgICAgc2VuZFRvRXZlbnRIYW5kbGVyKCgxIDw8IHJldHVyblRva2VuQ29tbWFuZCkgfCB0b2tlbnMpOwogICAgICAgIHRva2VucyA9IDA7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgc2V0SGFuZGxlcnMoe3JlYWQsIHdyaXRlLCBlcnJvciwgY2xvc2VkLCBkZXN0cm95ZWR9KSB7CiAgICBldmVudEhhbmRsZXJzW3JlYWRFdmVudF0gPSByZWFkOwogICAgZXZlbnRIYW5kbGVyc1t3cml0ZUV2ZW50XSA9IHdyaXRlOwogICAgZXZlbnRIYW5kbGVyc1tlcnJvckV2ZW50XSA9IGVycm9yOwogICAgZXZlbnRIYW5kbGVyc1tjbG9zZWRFdmVudF0gPSBjbG9zZWQ7CiAgICBldmVudEhhbmRsZXJzW2Rlc3Ryb3llZEV2ZW50XSA9IGRlc3Ryb3llZDsKICB9CgogIHZvaWQgc2V0TGlzdGVuaW5nKHtyZWFkOiB0cnVlLCB3cml0ZTogdHJ1ZX0pIHsKICAgIHNlbmRSZWFkRXZlbnRzID0gcmVhZDsKICAgIHNlbmRXcml0ZUV2ZW50cyA9IHdyaXRlOwogICAgaWYgKHJlYWQpIGlzc3VlUmVhZEV2ZW50KCk7CiAgICBpZiAod3JpdGUpIGlzc3VlV3JpdGVFdmVudCgpOwogICAgaWYgKCFmbGFnc1NlbnQgJiYgIWlzQ2xvc2luZykgewogICAgICBmbGFnc1NlbnQgPSB0cnVlOwogICAgICBpbnQgZmxhZ3MgPSAxIDw8IHNldEV2ZW50TWFza0NvbW1hbmQ7CiAgICAgIGlmICghaXNDbG9zZWRSZWFkKSBmbGFncyB8PSAxIDw8IHJlYWRFdmVudDsKICAgICAgaWYgKCFpc0Nsb3NlZFdyaXRlKSBmbGFncyB8PSAxIDw8IHdyaXRlRXZlbnQ7CiAgICAgIHNlbmRUb0V2ZW50SGFuZGxlcihmbGFncyk7CiAgICB9CiAgfQoKICBGdXR1cmUgY2xvc2UoKSB7CiAgICBpZiAoIWlzQ2xvc2luZyAmJiAhaXNDbG9zZWQpIHsKICAgICAgc2VuZFRvRXZlbnRIYW5kbGVyKDEgPDwgY2xvc2VDb21tYW5kKTsKICAgICAgaXNDbG9zaW5nID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBjbG9zZUNvbXBsZXRlci5mdXR1cmU7CiAgfQoKICB2b2lkIHNodXRkb3duKFNvY2tldERpcmVjdGlvbiBkaXJlY3Rpb24pIHsKICAgIGlmICghaXNDbG9zaW5nICYmICFpc0Nsb3NlZCkgewogICAgICBzd2l0Y2ggKGRpcmVjdGlvbikgewogICAgICAgIGNhc2UgU29ja2V0RGlyZWN0aW9uLnJlY2VpdmU6CiAgICAgICAgICBzaHV0ZG93blJlYWQoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU29ja2V0RGlyZWN0aW9uLnNlbmQ6CiAgICAgICAgICBzaHV0ZG93bldyaXRlKCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFNvY2tldERpcmVjdGlvbi5ib3RoOgogICAgICAgICAgY2xvc2UoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihkaXJlY3Rpb24pOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHNodXRkb3duV3JpdGUoKSB7CiAgICBpZiAoIWlzQ2xvc2luZyAmJiAhaXNDbG9zZWQpIHsKICAgICAgaWYgKGNsb3NlZFJlYWRFdmVudFNlbnQpIHsKICAgICAgICBjbG9zZSgpOwogICAgICB9IGVsc2UgewogICAgICAgIHNlbmRUb0V2ZW50SGFuZGxlcigxIDw8IHNodXRkb3duV3JpdGVDb21tYW5kKTsKICAgICAgfQogICAgICBpc0Nsb3NlZFdyaXRlID0gdHJ1ZTsKICAgIH0KICB9CgogIHZvaWQgc2h1dGRvd25SZWFkKCkgewogICAgaWYgKCFpc0Nsb3NpbmcgJiYgIWlzQ2xvc2VkKSB7CiAgICAgIGlmIChpc0Nsb3NlZFdyaXRlKSB7CiAgICAgICAgY2xvc2UoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzZW5kVG9FdmVudEhhbmRsZXIoMSA8PCBzaHV0ZG93blJlYWRDb21tYW5kKTsKICAgICAgfQogICAgICBpc0Nsb3NlZFJlYWQgPSB0cnVlOwogICAgfQogIH0KCiAgdm9pZCBzZW5kVG9FdmVudEhhbmRsZXIoaW50IGRhdGEpIHsKICAgIGludCBmdWxsRGF0YSA9ICh0eXBlRmxhZ3MgJiB0eXBlVHlwZU1hc2spIHwgZGF0YTsKICAgIGFzc2VydCghaXNDbG9zaW5nKTsKICAgIGNvbm5lY3RUb0V2ZW50SGFuZGxlcigpOwogICAgX0V2ZW50SGFuZGxlci5fc2VuZERhdGEodGhpcywgZXZlbnRQb3J0LnNlbmRQb3J0LCBmdWxsRGF0YSk7CiAgfQoKICB2b2lkIGNvbm5lY3RUb0V2ZW50SGFuZGxlcigpIHsKICAgIGFzc2VydCghaXNDbG9zZWQpOwogICAgaWYgKGV2ZW50UG9ydCA9PSBudWxsKSB7CiAgICAgIGV2ZW50UG9ydCA9IG5ldyBSYXdSZWNlaXZlUG9ydChtdWx0aXBsZXgpOwogICAgfQogICAgaWYgKCFjb25uZWN0ZWRSZXNvdXJjZUhhbmRsZXIpIHsKICAgICAgcmVnaXN0ZXJFeHRlbnNpb24oCiAgICAgICAgICAnZXh0LmRhcnQuaW8uZ2V0T3BlblNvY2tldHMnLCBfU29ja2V0UmVzb3VyY2VJbmZvLmdldE9wZW5Tb2NrZXRzKTsKICAgICAgcmVnaXN0ZXJFeHRlbnNpb24oJ2V4dC5kYXJ0LmlvLmdldFNvY2tldEJ5SUQnLAogICAgICAgICAgX1NvY2tldFJlc291cmNlSW5mby5nZXRTb2NrZXRJbmZvTWFwQnlJRCk7CgogICAgICBjb25uZWN0ZWRSZXNvdXJjZUhhbmRsZXIgPSB0cnVlOwogICAgfQogIH0KCiAgdm9pZCBkaXNjb25uZWN0RnJvbUV2ZW50SGFuZGxlcigpIHsKICAgIGFzc2VydChldmVudFBvcnQgIT0gbnVsbCk7CiAgICBldmVudFBvcnQuY2xvc2UoKTsKICAgIGV2ZW50UG9ydCA9IG51bGw7CiAgICAvLyBOb3cgdGhhdCB3ZSBkb24ndCB0cmFjayB0aGlzIFNvY2tldCBhbnltb3JlLCB3ZSBjYW4gY2xlYXIgdGhlIG93bmVyCiAgICAvLyBmaWVsZC4KICAgIG93bmVyID0gbnVsbDsKICB9CgogIC8vIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhbiBlcnJvciByZXNwb25zZSBmcm9tIGEgbmF0aXZlIHBvcnQgY2FsbC4KICBzdGF0aWMgYm9vbCBpc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpIHsKICAgIHJldHVybiByZXNwb25zZSBpcyBMaXN0ICYmIHJlc3BvbnNlWzBdICE9IF9zdWNjZXNzUmVzcG9uc2U7CiAgfQoKICAvLyBDcmVhdGUgdGhlIGFwcHJvcHJpYXRlIGVycm9yL2V4Y2VwdGlvbiBmcm9tIGRpZmZlcmVudCByZXR1cm5lZAogIC8vIGVycm9yIG9iamVjdHMuCiAgc3RhdGljIGNyZWF0ZUVycm9yKGVycm9yLCBTdHJpbmcgbWVzc2FnZSwKICAgICAgW0ludGVybmV0QWRkcmVzcyBhZGRyZXNzLCBpbnQgcG9ydF0pIHsKICAgIGlmIChlcnJvciBpcyBPU0Vycm9yKSB7CiAgICAgIHJldHVybiBuZXcgU29ja2V0RXhjZXB0aW9uKG1lc3NhZ2UsCiAgICAgICAgICBvc0Vycm9yOiBlcnJvciwgYWRkcmVzczogYWRkcmVzcywgcG9ydDogcG9ydCk7CiAgICB9IGVsc2UgaWYgKGVycm9yIGlzIExpc3QpIHsKICAgICAgYXNzZXJ0KGlzRXJyb3JSZXNwb25zZShlcnJvcikpOwogICAgICBzd2l0Y2ggKGVycm9yWzBdKSB7CiAgICAgICAgY2FzZSBfaWxsZWdhbEFyZ3VtZW50UmVzcG9uc2U6CiAgICAgICAgICByZXR1cm4gbmV3IEFyZ3VtZW50RXJyb3IoKTsKICAgICAgICBjYXNlIF9vc0Vycm9yUmVzcG9uc2U6CiAgICAgICAgICByZXR1cm4gbmV3IFNvY2tldEV4Y2VwdGlvbihtZXNzYWdlLAogICAgICAgICAgICAgIG9zRXJyb3I6IG5ldyBPU0Vycm9yKGVycm9yWzJdLCBlcnJvclsxXSksCiAgICAgICAgICAgICAgYWRkcmVzczogYWRkcmVzcywKICAgICAgICAgICAgICBwb3J0OiBwb3J0KTsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIG5ldyBFeGNlcHRpb24oIlVua25vd24gZXJyb3IiKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBTb2NrZXRFeGNlcHRpb24obWVzc2FnZSwgYWRkcmVzczogYWRkcmVzcywgcG9ydDogcG9ydCk7CiAgICB9CiAgfQoKICB2b2lkIHJlcG9ydEVycm9yKGVycm9yLCBTdHJpbmcgbWVzc2FnZSkgewogICAgdmFyIGUgPSBjcmVhdGVFcnJvcihlcnJvciwgbWVzc2FnZSwgYWRkcmVzcywgbG9jYWxQb3J0KTsKICAgIC8vIEludm9rZSB0aGUgZXJyb3IgaGFuZGxlciBpZiBhbnkuCiAgICBpZiAoZXZlbnRIYW5kbGVyc1tlcnJvckV2ZW50XSAhPSBudWxsKSB7CiAgICAgIGV2ZW50SGFuZGxlcnNbZXJyb3JFdmVudF0oZSk7CiAgICB9CiAgICAvLyBGb3IgYWxsIGVycm9ycyB3ZSBjbG9zZSB0aGUgc29ja2V0CiAgICBjbG9zZSgpOwogIH0KCiAgZ2V0T3B0aW9uKFNvY2tldE9wdGlvbiBvcHRpb24pIHsKICAgIGlmIChvcHRpb24gPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgib3B0aW9uIik7CiAgICB2YXIgcmVzdWx0ID0gbmF0aXZlR2V0T3B0aW9uKG9wdGlvbi5fdmFsdWUsIGFkZHJlc3MudHlwZS5fdmFsdWUpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB0aHJvdyByZXN1bHQ7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgYm9vbCBzZXRPcHRpb24oU29ja2V0T3B0aW9uIG9wdGlvbiwgdmFsdWUpIHsKICAgIGlmIChvcHRpb24gPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgib3B0aW9uIik7CiAgICB2YXIgcmVzdWx0ID0gbmF0aXZlU2V0T3B0aW9uKG9wdGlvbi5fdmFsdWUsIGFkZHJlc3MudHlwZS5fdmFsdWUsIHZhbHVlKTsKICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgdGhyb3cgcmVzdWx0OwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBVaW50OExpc3QgZ2V0UmF3T3B0aW9uKFJhd1NvY2tldE9wdGlvbiBvcHRpb24pIHsKICAgIGlmIChvcHRpb24gPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgib3B0aW9uIik7CiAgICBpZiAob3B0aW9uLnZhbHVlID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoIm9wdGlvbi52YWx1ZSIpOwoKICAgIHZhciByZXN1bHQgPSBuYXRpdmVHZXRSYXdPcHRpb24ob3B0aW9uLmxldmVsLCBvcHRpb24ub3B0aW9uLCBvcHRpb24udmFsdWUpOwogICAgaWYgKHJlc3VsdCAhPSBudWxsKSB0aHJvdyByZXN1bHQ7CiAgICByZXR1cm4gb3B0aW9uLnZhbHVlOwogIH0KCiAgdm9pZCBzZXRSYXdPcHRpb24oUmF3U29ja2V0T3B0aW9uIG9wdGlvbikgewogICAgaWYgKG9wdGlvbiA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJvcHRpb24iKTsKICAgIGlmIChvcHRpb24udmFsdWUgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgib3B0aW9uLnZhbHVlIik7CgogICAgdmFyIHJlc3VsdCA9IG5hdGl2ZVNldFJhd09wdGlvbihvcHRpb24ubGV2ZWwsIG9wdGlvbi5vcHRpb24sIG9wdGlvbi52YWx1ZSk7CiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHRocm93IHJlc3VsdDsKICB9CgogIEludGVybmV0QWRkcmVzcyBtdWx0aWNhc3RBZGRyZXNzKAogICAgICBJbnRlcm5ldEFkZHJlc3MgYWRkciwgTmV0d29ya0ludGVyZmFjZSBpbnRlcmZhY2UpIHsKICAgIC8vIE9uIE1hYyBPUyB1c2luZyB0aGUgaW50ZXJmYWNlIGluZGV4IGZvciBqb2luaW5nIElQdjQgbXVsdGljYXN0IGdyb3VwcwogICAgLy8gaXMgbm90IHN1cHBvcnRlZC4gSGVyZSB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgaW50ZXJmYWNlIGlzIG5lZWRlZC4KICAgIGlmIChQbGF0Zm9ybS5pc01hY09TICYmIGFkZHIudHlwZSA9PSBJbnRlcm5ldEFkZHJlc3NUeXBlLklQdjQpIHsKICAgICAgaWYgKGludGVyZmFjZSAhPSBudWxsKSB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2UuYWRkcmVzc2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBpZiAoaW50ZXJmYWNlLmFkZHJlc3Nlc1tpXS50eXBlID09IEludGVybmV0QWRkcmVzc1R5cGUuSVB2NCkgewogICAgICAgICAgICByZXR1cm4gaW50ZXJmYWNlLmFkZHJlc3Nlc1tpXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gTm8gSVB2NCBhZGRyZXNzIGZvdW5kIG9uIHRoZSBpbnRlcmZhY2UuCiAgICAgICAgdGhyb3cgbmV3IFNvY2tldEV4Y2VwdGlvbigKICAgICAgICAgICAgIlRoZSBuZXR3b3JrIGludGVyZmFjZSBkb2VzIG5vdCBoYXZlIGFuIGFkZHJlc3MgIgogICAgICAgICAgICAib2YgdGhlIHNhbWUgZmFtaWx5IGFzIHRoZSBtdWx0aWNhc3QgYWRkcmVzcyIpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIERlZmF1bHQgdG8gdGhlIEFOWSBhZGRyZXNzIGlmIG5vIGludGVyZmFjZSBpcyBzcGVjaWZpZWQuCiAgICAgICAgcmV0dXJuIEludGVybmV0QWRkcmVzcy5hbnlJUHY0OwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIHZvaWQgam9pbk11bHRpY2FzdChJbnRlcm5ldEFkZHJlc3MgYWRkciwgTmV0d29ya0ludGVyZmFjZSBpbnRlcmZhY2UpIHsKICAgIF9JbnRlcm5ldEFkZHJlc3MgaW50ZXJmYWNlQWRkciA9IG11bHRpY2FzdEFkZHJlc3MoYWRkciwgaW50ZXJmYWNlKTsKICAgIHZhciBpbnRlcmZhY2VJbmRleCA9IGludGVyZmFjZSA9PSBudWxsID8gMCA6IGludGVyZmFjZS5pbmRleDsKICAgIHZhciByZXN1bHQgPSBuYXRpdmVKb2luTXVsdGljYXN0KChhZGRyIGFzIF9JbnRlcm5ldEFkZHJlc3MpLl9pbl9hZGRyLAogICAgICAgIGludGVyZmFjZUFkZHI/Ll9pbl9hZGRyLCBpbnRlcmZhY2VJbmRleCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHRocm93IHJlc3VsdDsKICB9CgogIHZvaWQgbGVhdmVNdWx0aWNhc3QoSW50ZXJuZXRBZGRyZXNzIGFkZHIsIE5ldHdvcmtJbnRlcmZhY2UgaW50ZXJmYWNlKSB7CiAgICBfSW50ZXJuZXRBZGRyZXNzIGludGVyZmFjZUFkZHIgPSBtdWx0aWNhc3RBZGRyZXNzKGFkZHIsIGludGVyZmFjZSk7CiAgICB2YXIgaW50ZXJmYWNlSW5kZXggPSBpbnRlcmZhY2UgPT0gbnVsbCA/IDAgOiBpbnRlcmZhY2UuaW5kZXg7CiAgICB2YXIgcmVzdWx0ID0gbmF0aXZlTGVhdmVNdWx0aWNhc3QoKGFkZHIgYXMgX0ludGVybmV0QWRkcmVzcykuX2luX2FkZHIsCiAgICAgICAgaW50ZXJmYWNlQWRkcj8uX2luX2FkZHIsIGludGVyZmFjZUluZGV4KTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgdGhyb3cgcmVzdWx0OwogIH0KCiAgdm9pZCBuYXRpdmVTZXRTb2NrZXRJZChpbnQgaWQsIGludCB0eXBlRmxhZ3MpIG5hdGl2ZSAiU29ja2V0X1NldFNvY2tldElkIjsKICBuYXRpdmVBdmFpbGFibGUoKSBuYXRpdmUgIlNvY2tldF9BdmFpbGFibGUiOwogIG5hdGl2ZVJlYWQoaW50IGxlbikgbmF0aXZlICJTb2NrZXRfUmVhZCI7CiAgbmF0aXZlUmVjdkZyb20oKSBuYXRpdmUgIlNvY2tldF9SZWN2RnJvbSI7CiAgbmF0aXZlV3JpdGUoTGlzdDxpbnQ+IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGJ5dGVzKQogICAgICBuYXRpdmUgIlNvY2tldF9Xcml0ZUxpc3QiOwogIG5hdGl2ZVNlbmRUbyhMaXN0PGludD4gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgYnl0ZXMsIExpc3Q8aW50PiBhZGRyZXNzLAogICAgICBpbnQgcG9ydCkgbmF0aXZlICJTb2NrZXRfU2VuZFRvIjsKICBuYXRpdmVDcmVhdGVDb25uZWN0KExpc3Q8aW50PiBhZGRyLCBpbnQgcG9ydCkgbmF0aXZlICJTb2NrZXRfQ3JlYXRlQ29ubmVjdCI7CiAgbmF0aXZlQ3JlYXRlQmluZENvbm5lY3QoTGlzdDxpbnQ+IGFkZHIsIGludCBwb3J0LCBMaXN0PGludD4gc291cmNlQWRkcikKICAgICAgbmF0aXZlICJTb2NrZXRfQ3JlYXRlQmluZENvbm5lY3QiOwogIGJvb2wgaXNCaW5kRXJyb3IoaW50IGVycm9yTnVtYmVyKSBuYXRpdmUgIlNvY2tldEJhc2VfSXNCaW5kRXJyb3IiOwogIG5hdGl2ZUNyZWF0ZUJpbmRMaXN0ZW4oTGlzdDxpbnQ+IGFkZHIsIGludCBwb3J0LCBpbnQgYmFja2xvZywgYm9vbCB2Nk9ubHksCiAgICAgIGJvb2wgc2hhcmVkKSBuYXRpdmUgIlNlcnZlclNvY2tldF9DcmVhdGVCaW5kTGlzdGVuIjsKICBuYXRpdmVDcmVhdGVCaW5kRGF0YWdyYW0oTGlzdDxpbnQ+IGFkZHIsIGludCBwb3J0LCBib29sIHJldXNlQWRkcmVzcywKICAgICAgYm9vbCByZXVzZVBvcnQsIGludCB0dGwpIG5hdGl2ZSAiU29ja2V0X0NyZWF0ZUJpbmREYXRhZ3JhbSI7CiAgbmF0aXZlQWNjZXB0KF9OYXRpdmVTb2NrZXQgc29ja2V0KSBuYXRpdmUgIlNlcnZlclNvY2tldF9BY2NlcHQiOwogIGludCBuYXRpdmVHZXRQb3J0KCkgbmF0aXZlICJTb2NrZXRfR2V0UG9ydCI7CiAgTGlzdCBuYXRpdmVHZXRSZW1vdGVQZWVyKCkgbmF0aXZlICJTb2NrZXRfR2V0UmVtb3RlUGVlciI7CiAgaW50IG5hdGl2ZUdldFNvY2tldElkKCkgbmF0aXZlICJTb2NrZXRfR2V0U29ja2V0SWQiOwogIE9TRXJyb3IgbmF0aXZlR2V0RXJyb3IoKSBuYXRpdmUgIlNvY2tldF9HZXRFcnJvciI7CiAgbmF0aXZlR2V0T3B0aW9uKGludCBvcHRpb24sIGludCBwcm90b2NvbCkgbmF0aXZlICJTb2NrZXRfR2V0T3B0aW9uIjsKICBPU0Vycm9yIG5hdGl2ZUdldFJhd09wdGlvbihpbnQgbGV2ZWwsIGludCBvcHRpb24sIFVpbnQ4TGlzdCBkYXRhKQogICAgICBuYXRpdmUgIlNvY2tldF9HZXRSYXdPcHRpb24iOwogIE9TRXJyb3IgbmF0aXZlU2V0T3B0aW9uKGludCBvcHRpb24sIGludCBwcm90b2NvbCwgdmFsdWUpCiAgICAgIG5hdGl2ZSAiU29ja2V0X1NldE9wdGlvbiI7CiAgT1NFcnJvciBuYXRpdmVTZXRSYXdPcHRpb24oaW50IGxldmVsLCBpbnQgb3B0aW9uLCBVaW50OExpc3QgZGF0YSkKICAgICAgbmF0aXZlICJTb2NrZXRfU2V0UmF3T3B0aW9uIjsKICBPU0Vycm9yIG5hdGl2ZUpvaW5NdWx0aWNhc3QoTGlzdDxpbnQ+IGFkZHIsIExpc3Q8aW50PiBpbnRlcmZhY2VBZGRyLAogICAgICBpbnQgaW50ZXJmYWNlSW5kZXgpIG5hdGl2ZSAiU29ja2V0X0pvaW5NdWx0aWNhc3QiOwogIGJvb2wgbmF0aXZlTGVhdmVNdWx0aWNhc3QoTGlzdDxpbnQ+IGFkZHIsIExpc3Q8aW50PiBpbnRlcmZhY2VBZGRyLAogICAgICBpbnQgaW50ZXJmYWNlSW5kZXgpIG5hdGl2ZSAiU29ja2V0X0xlYXZlTXVsdGljYXN0IjsKfQoKY2xhc3MgX1Jhd1NlcnZlclNvY2tldCBleHRlbmRzIFN0cmVhbTxSYXdTb2NrZXQ+IGltcGxlbWVudHMgUmF3U2VydmVyU29ja2V0IHsKICBmaW5hbCBfTmF0aXZlU29ja2V0IF9zb2NrZXQ7CiAgU3RyZWFtQ29udHJvbGxlcjxSYXdTb2NrZXQ+IF9jb250cm9sbGVyOwogIFJlY2VpdmVQb3J0IF9yZWZlcmVuY2VQb3J0OwogIGJvb2wgX3Y2T25seTsKCiAgc3RhdGljIEZ1dHVyZTxfUmF3U2VydmVyU29ja2V0PiBiaW5kKAogICAgICBhZGRyZXNzLCBpbnQgcG9ydCwgaW50IGJhY2tsb2csIGJvb2wgdjZPbmx5LCBib29sIHNoYXJlZCkgewogICAgX3Rocm93T25CYWRQb3J0KHBvcnQpOwogICAgaWYgKGJhY2tsb2cgPCAwKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiSW52YWxpZCBiYWNrbG9nICRiYWNrbG9nIik7CiAgICByZXR1cm4gX05hdGl2ZVNvY2tldC5iaW5kKGFkZHJlc3MsIHBvcnQsIGJhY2tsb2csIHY2T25seSwgc2hhcmVkKQogICAgICAgIC50aGVuKChzb2NrZXQpID0+IG5ldyBfUmF3U2VydmVyU29ja2V0KHNvY2tldCwgdjZPbmx5KSk7CiAgfQoKICBfUmF3U2VydmVyU29ja2V0KHRoaXMuX3NvY2tldCwgdGhpcy5fdjZPbmx5KTsKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFJhd1NvY2tldD4gbGlzdGVuKHZvaWQgb25EYXRhKFJhd1NvY2tldCBldmVudCksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICBpZiAoX2NvbnRyb2xsZXIgIT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiU3RyZWFtIHdhcyBhbHJlYWR5IGxpc3RlbmVkIHRvIik7CiAgICB9CiAgICB2YXIgem9uZSA9IFpvbmUuY3VycmVudDsKICAgIF9jb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIoCiAgICAgICAgc3luYzogdHJ1ZSwKICAgICAgICBvbkxpc3RlbjogX29uU3Vic2NyaXB0aW9uU3RhdGVDaGFuZ2UsCiAgICAgICAgb25DYW5jZWw6IF9vblN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlLAogICAgICAgIG9uUGF1c2U6IF9vblBhdXNlU3RhdGVDaGFuZ2UsCiAgICAgICAgb25SZXN1bWU6IF9vblBhdXNlU3RhdGVDaGFuZ2UpOwogICAgX3NvY2tldC5zZXRIYW5kbGVycyhyZWFkOiB6b25lLmJpbmRDYWxsYmFja0d1YXJkZWQoKCkgewogICAgICB3aGlsZSAoX3NvY2tldC5hdmFpbGFibGUgPiAwKSB7CiAgICAgICAgdmFyIHNvY2tldCA9IF9zb2NrZXQuYWNjZXB0KCk7CiAgICAgICAgaWYgKHNvY2tldCA9PSBudWxsKSByZXR1cm47CiAgICAgICAgX2NvbnRyb2xsZXIuYWRkKG5ldyBfUmF3U29ja2V0KHNvY2tldCkpOwogICAgICAgIGlmIChfY29udHJvbGxlci5pc1BhdXNlZCkgcmV0dXJuOwogICAgICB9CiAgICB9KSwgZXJyb3I6IHpvbmUuYmluZFVuYXJ5Q2FsbGJhY2tHdWFyZGVkKChlKSB7CiAgICAgIF9jb250cm9sbGVyLmFkZEVycm9yKGUpOwogICAgICBfY29udHJvbGxlci5jbG9zZSgpOwogICAgfSksIGRlc3Ryb3llZDogKCkgewogICAgICBfY29udHJvbGxlci5jbG9zZSgpOwogICAgICBpZiAoX3JlZmVyZW5jZVBvcnQgIT0gbnVsbCkgewogICAgICAgIF9yZWZlcmVuY2VQb3J0LmNsb3NlKCk7CiAgICAgICAgX3JlZmVyZW5jZVBvcnQgPSBudWxsOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiBfY29udHJvbGxlci5zdHJlYW0ubGlzdGVuKG9uRGF0YSwKICAgICAgICBvbkVycm9yOiBvbkVycm9yLCBvbkRvbmU6IG9uRG9uZSwgY2FuY2VsT25FcnJvcjogY2FuY2VsT25FcnJvcik7CiAgfQoKICBpbnQgZ2V0IHBvcnQgPT4gX3NvY2tldC5wb3J0OwoKICBJbnRlcm5ldEFkZHJlc3MgZ2V0IGFkZHJlc3MgPT4gX3NvY2tldC5hZGRyZXNzOwoKICBGdXR1cmU8UmF3U2VydmVyU29ja2V0PiBjbG9zZSgpIHsKICAgIHJldHVybiBfc29ja2V0LmNsb3NlKCkudGhlbjxSYXdTZXJ2ZXJTb2NrZXQ+KChfKSB7CiAgICAgIGlmIChfcmVmZXJlbmNlUG9ydCAhPSBudWxsKSB7CiAgICAgICAgX3JlZmVyZW5jZVBvcnQuY2xvc2UoKTsKICAgICAgICBfcmVmZXJlbmNlUG9ydCA9IG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KTsKICB9CgogIHZvaWQgX3BhdXNlKCkgewogICAgX3NvY2tldC5zZXRMaXN0ZW5pbmcocmVhZDogZmFsc2UsIHdyaXRlOiBmYWxzZSk7CiAgfQoKICB2b2lkIF9yZXN1bWUoKSB7CiAgICBfc29ja2V0LnNldExpc3RlbmluZyhyZWFkOiB0cnVlLCB3cml0ZTogZmFsc2UpOwogIH0KCiAgdm9pZCBfb25TdWJzY3JpcHRpb25TdGF0ZUNoYW5nZSgpIHsKICAgIGlmIChfY29udHJvbGxlci5oYXNMaXN0ZW5lcikgewogICAgICBfcmVzdW1lKCk7CiAgICB9IGVsc2UgewogICAgICBfc29ja2V0LmNsb3NlKCk7CiAgICB9CiAgfQoKICB2b2lkIF9vblBhdXNlU3RhdGVDaGFuZ2UoKSB7CiAgICBpZiAoX2NvbnRyb2xsZXIuaXNQYXVzZWQpIHsKICAgICAgX3BhdXNlKCk7CiAgICB9IGVsc2UgewogICAgICBfcmVzdW1lKCk7CiAgICB9CiAgfQoKICB2b2lkIHNldCBfb3duZXIob3duZXIpIHsKICAgIF9zb2NrZXQub3duZXIgPSBvd25lcjsKICB9Cn0KCmNsYXNzIF9SYXdTb2NrZXQgZXh0ZW5kcyBTdHJlYW08UmF3U29ja2V0RXZlbnQ+IGltcGxlbWVudHMgUmF3U29ja2V0IHsKICBmaW5hbCBfTmF0aXZlU29ja2V0IF9zb2NrZXQ7CiAgU3RyZWFtQ29udHJvbGxlcjxSYXdTb2NrZXRFdmVudD4gX2NvbnRyb2xsZXI7CiAgYm9vbCBfcmVhZEV2ZW50c0VuYWJsZWQgPSB0cnVlOwogIGJvb2wgX3dyaXRlRXZlbnRzRW5hYmxlZCA9IHRydWU7CgogIC8vIEZsYWcgdG8gaGFuZGxlIEN0cmwtRCBjbG9zaW5nIG9mIHN0ZGlvIG9uIE1hYyBPUy4KICBib29sIF9pc01hY09TVGVybWluYWxJbnB1dCA9IGZhbHNlOwoKICBzdGF0aWMgRnV0dXJlPFJhd1NvY2tldD4gY29ubmVjdCgKICAgICAgaG9zdCwgaW50IHBvcnQsIHNvdXJjZUFkZHJlc3MsIER1cmF0aW9uIHRpbWVvdXQpIHsKICAgIHJldHVybiBfTmF0aXZlU29ja2V0LmNvbm5lY3QoaG9zdCwgcG9ydCwgc291cmNlQWRkcmVzcywgdGltZW91dCkKICAgICAgICAudGhlbigoc29ja2V0KSA9PiBuZXcgX1Jhd1NvY2tldChzb2NrZXQpKTsKICB9CgogIHN0YXRpYyBGdXR1cmU8Q29ubmVjdGlvblRhc2s8X1Jhd1NvY2tldD4+IHN0YXJ0Q29ubmVjdCgKICAgICAgaG9zdCwgaW50IHBvcnQsIHNvdXJjZUFkZHJlc3MpIHsKICAgIHJldHVybiBfTmF0aXZlU29ja2V0LnN0YXJ0Q29ubmVjdChob3N0LCBwb3J0LCBzb3VyY2VBZGRyZXNzKQogICAgICAgIC50aGVuKChDb25uZWN0aW9uVGFzazxfTmF0aXZlU29ja2V0PiBuYXRpdmVUYXNrKSB7CiAgICAgIGZpbmFsIEZ1dHVyZTxfUmF3U29ja2V0PiByYXcgPSBuYXRpdmVUYXNrLnNvY2tldAogICAgICAgICAgLnRoZW4oKF9OYXRpdmVTb2NrZXQgbmF0aXZlU29ja2V0KSA9PiBuZXcgX1Jhd1NvY2tldChuYXRpdmVTb2NrZXQpKTsKICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uVGFzazxfUmF3U29ja2V0Pi5fKAogICAgICAgICAgc29ja2V0OiByYXcsIG9uQ2FuY2VsOiBuYXRpdmVUYXNrLl9vbkNhbmNlbCk7CiAgICB9KTsKICB9CgogIF9SYXdTb2NrZXQodGhpcy5fc29ja2V0KSB7CiAgICB2YXIgem9uZSA9IFpvbmUuY3VycmVudDsKICAgIF9jb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIoCiAgICAgICAgc3luYzogdHJ1ZSwKICAgICAgICBvbkxpc3RlbjogX29uU3Vic2NyaXB0aW9uU3RhdGVDaGFuZ2UsCiAgICAgICAgb25DYW5jZWw6IF9vblN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlLAogICAgICAgIG9uUGF1c2U6IF9vblBhdXNlU3RhdGVDaGFuZ2UsCiAgICAgICAgb25SZXN1bWU6IF9vblBhdXNlU3RhdGVDaGFuZ2UpOwogICAgX3NvY2tldC5zZXRIYW5kbGVycygKICAgICAgICByZWFkOiAoKSA9PiBfY29udHJvbGxlci5hZGQoUmF3U29ja2V0RXZlbnQucmVhZCksCiAgICAgICAgd3JpdGU6ICgpIHsKICAgICAgICAgIC8vIFRoZSB3cml0ZSBldmVudCBoYW5kbGVyIGlzIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQgYnkgdGhlCiAgICAgICAgICAvLyBldmVudCBoYW5kbGVyIHdoZW4gaXQgZmlyZXMuCiAgICAgICAgICB3cml0ZUV2ZW50c0VuYWJsZWQgPSBmYWxzZTsKICAgICAgICAgIF9jb250cm9sbGVyLmFkZChSYXdTb2NrZXRFdmVudC53cml0ZSk7CiAgICAgICAgfSwKICAgICAgICBjbG9zZWQ6ICgpID0+IF9jb250cm9sbGVyLmFkZChSYXdTb2NrZXRFdmVudC5yZWFkQ2xvc2VkKSwKICAgICAgICBkZXN0cm95ZWQ6ICgpIHsKICAgICAgICAgIF9jb250cm9sbGVyLmFkZChSYXdTb2NrZXRFdmVudC5jbG9zZWQpOwogICAgICAgICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICAgICAgICB9LAogICAgICAgIGVycm9yOiB6b25lLmJpbmRVbmFyeUNhbGxiYWNrR3VhcmRlZCgoZSkgewogICAgICAgICAgX2NvbnRyb2xsZXIuYWRkRXJyb3IoZSk7CiAgICAgICAgICBfc29ja2V0LmNsb3NlKCk7CiAgICAgICAgfSkpOwogIH0KCiAgZmFjdG9yeSBfUmF3U29ja2V0Ll93cml0ZVBpcGUoKSB7CiAgICB2YXIgbmF0aXZlID0gbmV3IF9OYXRpdmVTb2NrZXQucGlwZSgpOwogICAgbmF0aXZlLmlzQ2xvc2VkUmVhZCA9IHRydWU7CiAgICBuYXRpdmUuY2xvc2VkUmVhZEV2ZW50U2VudCA9IHRydWU7CiAgICByZXR1cm4gbmV3IF9SYXdTb2NrZXQobmF0aXZlKTsKICB9CgogIGZhY3RvcnkgX1Jhd1NvY2tldC5fcmVhZFBpcGUoaW50IGZkKSB7CiAgICB2YXIgbmF0aXZlID0gbmV3IF9OYXRpdmVTb2NrZXQucGlwZSgpOwogICAgbmF0aXZlLmlzQ2xvc2VkV3JpdGUgPSB0cnVlOwogICAgaWYgKGZkICE9IG51bGwpIF9nZXRTdGRpb0hhbmRsZShuYXRpdmUsIGZkKTsKICAgIHZhciByZXN1bHQgPSBuZXcgX1Jhd1NvY2tldChuYXRpdmUpOwogICAgaWYgKGZkICE9IG51bGwpIHsKICAgICAgdmFyIHNvY2tldFR5cGUgPSBfU3RkSU9VdGlscy5fbmF0aXZlU29ja2V0VHlwZShyZXN1bHQuX3NvY2tldCk7CiAgICAgIHJlc3VsdC5faXNNYWNPU1Rlcm1pbmFsSW5wdXQgPQogICAgICAgICAgUGxhdGZvcm0uaXNNYWNPUyAmJiBzb2NrZXRUeXBlID09IF9zdGRpb0hhbmRsZVR5cGVUZXJtaW5hbDsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBTdHJlYW1TdWJzY3JpcHRpb248UmF3U29ja2V0RXZlbnQ+IGxpc3Rlbih2b2lkIG9uRGF0YShSYXdTb2NrZXRFdmVudCBldmVudCksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICByZXR1cm4gX2NvbnRyb2xsZXIuc3RyZWFtLmxpc3RlbihvbkRhdGEsCiAgICAgICAgb25FcnJvcjogb25FcnJvciwgb25Eb25lOiBvbkRvbmUsIGNhbmNlbE9uRXJyb3I6IGNhbmNlbE9uRXJyb3IpOwogIH0KCiAgaW50IGF2YWlsYWJsZSgpID0+IF9zb2NrZXQuYXZhaWxhYmxlOwoKICBMaXN0PGludD4gcmVhZChbaW50IGxlbl0pIHsKICAgIGlmIChfaXNNYWNPU1Rlcm1pbmFsSW5wdXQpIHsKICAgICAgdmFyIGF2YWlsYWJsZSA9IHRoaXMuYXZhaWxhYmxlKCk7CiAgICAgIGlmIChhdmFpbGFibGUgPT0gMCkgcmV0dXJuIG51bGw7CiAgICAgIHZhciBkYXRhID0gX3NvY2tldC5yZWFkKGxlbik7CiAgICAgIGlmIChkYXRhID09IG51bGwgfHwgZGF0YS5sZW5ndGggPCBhdmFpbGFibGUpIHsKICAgICAgICAvLyBSZWFkaW5nIGxlc3MgdGhhbiBhdmFpbGFibGUgZnJvbSBhIE1hYyBPUyB0ZXJtaW5hbCBpbmRpY2F0ZSBDdHJsLUQuCiAgICAgICAgLy8gVGhpcyBpcyBpbnRlcnByZXRlZCBhcyByZWFkIGNsb3NlZC4KICAgICAgICBzY2hlZHVsZU1pY3JvdGFzaygoKSA9PiBfY29udHJvbGxlci5hZGQoUmF3U29ja2V0RXZlbnQucmVhZENsb3NlZCkpOwogICAgICB9CiAgICAgIHJldHVybiBkYXRhOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9zb2NrZXQucmVhZChsZW4pOwogICAgfQogIH0KCiAgaW50IHdyaXRlKExpc3Q8aW50PiBidWZmZXIsIFtpbnQgb2Zmc2V0LCBpbnQgY291bnRdKSA9PgogICAgICBfc29ja2V0LndyaXRlKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCk7CgogIEZ1dHVyZTxSYXdTb2NrZXQ+IGNsb3NlKCkgPT4gX3NvY2tldC5jbG9zZSgpLnRoZW48UmF3U29ja2V0PigoXykgPT4gdGhpcyk7CgogIHZvaWQgc2h1dGRvd24oU29ja2V0RGlyZWN0aW9uIGRpcmVjdGlvbikgPT4gX3NvY2tldC5zaHV0ZG93bihkaXJlY3Rpb24pOwoKICBpbnQgZ2V0IHBvcnQgPT4gX3NvY2tldC5wb3J0OwoKICBpbnQgZ2V0IHJlbW90ZVBvcnQgPT4gX3NvY2tldC5yZW1vdGVQb3J0OwoKICBJbnRlcm5ldEFkZHJlc3MgZ2V0IGFkZHJlc3MgPT4gX3NvY2tldC5hZGRyZXNzOwoKICBJbnRlcm5ldEFkZHJlc3MgZ2V0IHJlbW90ZUFkZHJlc3MgPT4gX3NvY2tldC5yZW1vdGVBZGRyZXNzOwoKICBib29sIGdldCByZWFkRXZlbnRzRW5hYmxlZCA9PiBfcmVhZEV2ZW50c0VuYWJsZWQ7CiAgdm9pZCBzZXQgcmVhZEV2ZW50c0VuYWJsZWQoYm9vbCB2YWx1ZSkgewogICAgaWYgKHZhbHVlICE9IF9yZWFkRXZlbnRzRW5hYmxlZCkgewogICAgICBfcmVhZEV2ZW50c0VuYWJsZWQgPSB2YWx1ZTsKICAgICAgaWYgKCFfY29udHJvbGxlci5pc1BhdXNlZCkgX3Jlc3VtZSgpOwogICAgfQogIH0KCiAgYm9vbCBnZXQgd3JpdGVFdmVudHNFbmFibGVkID0+IF93cml0ZUV2ZW50c0VuYWJsZWQ7CiAgdm9pZCBzZXQgd3JpdGVFdmVudHNFbmFibGVkKGJvb2wgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSAhPSBfd3JpdGVFdmVudHNFbmFibGVkKSB7CiAgICAgIF93cml0ZUV2ZW50c0VuYWJsZWQgPSB2YWx1ZTsKICAgICAgaWYgKCFfY29udHJvbGxlci5pc1BhdXNlZCkgX3Jlc3VtZSgpOwogICAgfQogIH0KCiAgYm9vbCBzZXRPcHRpb24oU29ja2V0T3B0aW9uIG9wdGlvbiwgYm9vbCBlbmFibGVkKSA9PgogICAgICBfc29ja2V0LnNldE9wdGlvbihvcHRpb24sIGVuYWJsZWQpOwoKICBVaW50OExpc3QgZ2V0UmF3T3B0aW9uKFJhd1NvY2tldE9wdGlvbiBvcHRpb24pID0+CiAgICAgIF9zb2NrZXQuZ2V0UmF3T3B0aW9uKG9wdGlvbik7CiAgdm9pZCBzZXRSYXdPcHRpb24oUmF3U29ja2V0T3B0aW9uIG9wdGlvbikgPT4gX3NvY2tldC5zZXRSYXdPcHRpb24ob3B0aW9uKTsKCiAgX3BhdXNlKCkgewogICAgX3NvY2tldC5zZXRMaXN0ZW5pbmcocmVhZDogZmFsc2UsIHdyaXRlOiBmYWxzZSk7CiAgfQoKICB2b2lkIF9yZXN1bWUoKSB7CiAgICBfc29ja2V0LnNldExpc3RlbmluZyhyZWFkOiBfcmVhZEV2ZW50c0VuYWJsZWQsIHdyaXRlOiBfd3JpdGVFdmVudHNFbmFibGVkKTsKICB9CgogIHZvaWQgX29uUGF1c2VTdGF0ZUNoYW5nZSgpIHsKICAgIGlmIChfY29udHJvbGxlci5pc1BhdXNlZCkgewogICAgICBfcGF1c2UoKTsKICAgIH0gZWxzZSB7CiAgICAgIF9yZXN1bWUoKTsKICAgIH0KICB9CgogIHZvaWQgX29uU3Vic2NyaXB0aW9uU3RhdGVDaGFuZ2UoKSB7CiAgICBpZiAoX2NvbnRyb2xsZXIuaGFzTGlzdGVuZXIpIHsKICAgICAgX3Jlc3VtZSgpOwogICAgfSBlbHNlIHsKICAgICAgX3NvY2tldC5jbG9zZSgpOwogICAgfQogIH0KCiAgdm9pZCBzZXQgX293bmVyKG93bmVyKSB7CiAgICBfc29ja2V0Lm93bmVyID0gb3duZXI7CiAgfQp9CgpAcGF0Y2gKY2xhc3MgU2VydmVyU29ja2V0IHsKICBAcGF0Y2gKICBzdGF0aWMgRnV0dXJlPFNlcnZlclNvY2tldD4gYmluZChhZGRyZXNzLCBpbnQgcG9ydCwKICAgICAge2ludCBiYWNrbG9nOiAwLCBib29sIHY2T25seTogZmFsc2UsIGJvb2wgc2hhcmVkOiBmYWxzZX0pIHsKICAgIHJldHVybiBfU2VydmVyU29ja2V0LmJpbmQoYWRkcmVzcywgcG9ydCwgYmFja2xvZywgdjZPbmx5LCBzaGFyZWQpOwogIH0KfQoKY2xhc3MgX1NlcnZlclNvY2tldCBleHRlbmRzIFN0cmVhbTxTb2NrZXQ+IGltcGxlbWVudHMgU2VydmVyU29ja2V0IHsKICBmaW5hbCBfc29ja2V0OwoKICBzdGF0aWMgRnV0dXJlPF9TZXJ2ZXJTb2NrZXQ+IGJpbmQoCiAgICAgIGFkZHJlc3MsIGludCBwb3J0LCBpbnQgYmFja2xvZywgYm9vbCB2Nk9ubHksIGJvb2wgc2hhcmVkKSB7CiAgICByZXR1cm4gX1Jhd1NlcnZlclNvY2tldC5iaW5kKGFkZHJlc3MsIHBvcnQsIGJhY2tsb2csIHY2T25seSwgc2hhcmVkKQogICAgICAgIC50aGVuKChzb2NrZXQpID0+IG5ldyBfU2VydmVyU29ja2V0KHNvY2tldCkpOwogIH0KCiAgX1NlcnZlclNvY2tldCh0aGlzLl9zb2NrZXQpOwoKICBTdHJlYW1TdWJzY3JpcHRpb248U29ja2V0PiBsaXN0ZW4odm9pZCBvbkRhdGEoU29ja2V0IGV2ZW50KSwKICAgICAge0Z1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcn0pIHsKICAgIHJldHVybiBfc29ja2V0Lm1hcDxTb2NrZXQ+KChyYXdTb2NrZXQpID0+IG5ldyBfU29ja2V0KHJhd1NvY2tldCkpLmxpc3RlbigKICAgICAgICBvbkRhdGEsCiAgICAgICAgb25FcnJvcjogb25FcnJvciwKICAgICAgICBvbkRvbmU6IG9uRG9uZSwKICAgICAgICBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKTsKICB9CgogIGludCBnZXQgcG9ydCA9PiBfc29ja2V0LnBvcnQ7CgogIEludGVybmV0QWRkcmVzcyBnZXQgYWRkcmVzcyA9PiBfc29ja2V0LmFkZHJlc3M7CgogIEZ1dHVyZTxTZXJ2ZXJTb2NrZXQ+IGNsb3NlKCkgPT4KICAgICAgX3NvY2tldC5jbG9zZSgpLnRoZW48U2VydmVyU29ja2V0PigoXykgPT4gdGhpcyk7CgogIHZvaWQgc2V0IF9vd25lcihvd25lcikgewogICAgX3NvY2tldC5fb3duZXIgPSBvd25lcjsKICB9Cn0KCkBwYXRjaApjbGFzcyBTb2NrZXQgewogIEBwYXRjaAogIHN0YXRpYyBGdXR1cmU8U29ja2V0PiBfY29ubmVjdChob3N0LCBpbnQgcG9ydCwKICAgICAge3NvdXJjZUFkZHJlc3MsIER1cmF0aW9uIHRpbWVvdXR9KSB7CiAgICByZXR1cm4gUmF3U29ja2V0LmNvbm5lY3QoaG9zdCwgcG9ydCwKICAgICAgICAgICAgc291cmNlQWRkcmVzczogc291cmNlQWRkcmVzcywgdGltZW91dDogdGltZW91dCkKICAgICAgICAudGhlbigoc29ja2V0KSA9PiBuZXcgX1NvY2tldChzb2NrZXQpKTsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBGdXR1cmU8Q29ubmVjdGlvblRhc2s8U29ja2V0Pj4gX3N0YXJ0Q29ubmVjdChob3N0LCBpbnQgcG9ydCwKICAgICAge3NvdXJjZUFkZHJlc3N9KSB7CiAgICByZXR1cm4gUmF3U29ja2V0LnN0YXJ0Q29ubmVjdChob3N0LCBwb3J0LCBzb3VyY2VBZGRyZXNzOiBzb3VyY2VBZGRyZXNzKQogICAgICAgIC50aGVuKChyYXdUYXNrKSB7CiAgICAgIEZ1dHVyZTxTb2NrZXQ+IHNvY2tldCA9CiAgICAgICAgICByYXdUYXNrLnNvY2tldC50aGVuKChyYXdTb2NrZXQpID0+IG5ldyBfU29ja2V0KHJhd1NvY2tldCkpOwogICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25UYXNrPFNvY2tldD4uXygKICAgICAgICAgIHNvY2tldDogc29ja2V0LCBvbkNhbmNlbDogcmF3VGFzay5fb25DYW5jZWwpOwogICAgfSk7CiAgfQp9CgpjbGFzcyBfU29ja2V0U3RyZWFtQ29uc3VtZXIgZXh0ZW5kcyBTdHJlYW1Db25zdW1lcjxMaXN0PGludD4+IHsKICBTdHJlYW1TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uOwogIGZpbmFsIF9Tb2NrZXQgc29ja2V0OwogIGludCBvZmZzZXQ7CiAgTGlzdDxpbnQ+IGJ1ZmZlcjsKICBib29sIHBhdXNlZCA9IGZhbHNlOwogIENvbXBsZXRlciBzdHJlYW1Db21wbGV0ZXI7CgogIF9Tb2NrZXRTdHJlYW1Db25zdW1lcih0aGlzLnNvY2tldCk7CgogIEZ1dHVyZTxTb2NrZXQ+IGFkZFN0cmVhbShTdHJlYW08TGlzdDxpbnQ+PiBzdHJlYW0pIHsKICAgIHNvY2tldC5fZW5zdXJlUmF3U29ja2V0U3Vic2NyaXB0aW9uKCk7CiAgICBzdHJlYW1Db21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPFNvY2tldD4oKTsKICAgIGlmIChzb2NrZXQuX3JhdyAhPSBudWxsKSB7CiAgICAgIHN1YnNjcmlwdGlvbiA9IHN0cmVhbS5saXN0ZW4oKGRhdGEpIHsKICAgICAgICBhc3NlcnQoIXBhdXNlZCk7CiAgICAgICAgYXNzZXJ0KGJ1ZmZlciA9PSBudWxsKTsKICAgICAgICBidWZmZXIgPSBkYXRhOwogICAgICAgIG9mZnNldCA9IDA7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHdyaXRlKCk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgc29ja2V0LmRlc3Ryb3koKTsKICAgICAgICAgIHN0b3AoKTsKICAgICAgICAgIGRvbmUoZSk7CiAgICAgICAgfQogICAgICB9LCBvbkVycm9yOiAoZXJyb3IsIFtzdGFja1RyYWNlXSkgewogICAgICAgIHNvY2tldC5kZXN0cm95KCk7CiAgICAgICAgZG9uZShlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgIH0sIG9uRG9uZTogKCkgewogICAgICAgIGRvbmUoKTsKICAgICAgfSwgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICB9CiAgICByZXR1cm4gc3RyZWFtQ29tcGxldGVyLmZ1dHVyZTsKICB9CgogIEZ1dHVyZTxTb2NrZXQ+IGNsb3NlKCkgewogICAgc29ja2V0Ll9jb25zdW1lckRvbmUoKTsKICAgIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKHNvY2tldCk7CiAgfQoKICB2b2lkIHdyaXRlKCkgewogICAgaWYgKHN1YnNjcmlwdGlvbiA9PSBudWxsKSByZXR1cm47CiAgICBhc3NlcnQoYnVmZmVyICE9IG51bGwpOwogICAgLy8gV3JpdGUgYXMgbXVjaCBhcyBwb3NzaWJsZS4KICAgIG9mZnNldCArPSBzb2NrZXQuX3dyaXRlKGJ1ZmZlciwgb2Zmc2V0LCBidWZmZXIubGVuZ3RoIC0gb2Zmc2V0KTsKICAgIGlmIChvZmZzZXQgPCBidWZmZXIubGVuZ3RoKSB7CiAgICAgIGlmICghcGF1c2VkKSB7CiAgICAgICAgcGF1c2VkID0gdHJ1ZTsKICAgICAgICBzdWJzY3JpcHRpb24ucGF1c2UoKTsKICAgICAgfQogICAgICBzb2NrZXQuX2VuYWJsZVdyaXRlRXZlbnQoKTsKICAgIH0gZWxzZSB7CiAgICAgIGJ1ZmZlciA9IG51bGw7CiAgICAgIGlmIChwYXVzZWQpIHsKICAgICAgICBwYXVzZWQgPSBmYWxzZTsKICAgICAgICBzdWJzY3JpcHRpb24ucmVzdW1lKCk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgZG9uZShbZXJyb3IsIHN0YWNrVHJhY2VdKSB7CiAgICBpZiAoc3RyZWFtQ29tcGxldGVyICE9IG51bGwpIHsKICAgICAgaWYgKGVycm9yICE9IG51bGwpIHsKICAgICAgICBzdHJlYW1Db21wbGV0ZXIuY29tcGxldGVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFtQ29tcGxldGVyLmNvbXBsZXRlKHNvY2tldCk7CiAgICAgIH0KICAgICAgc3RyZWFtQ29tcGxldGVyID0gbnVsbDsKICAgIH0KICB9CgogIHZvaWQgc3RvcCgpIHsKICAgIGlmIChzdWJzY3JpcHRpb24gPT0gbnVsbCkgcmV0dXJuOwogICAgc3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogICAgc3Vic2NyaXB0aW9uID0gbnVsbDsKICAgIHBhdXNlZCA9IGZhbHNlOwogICAgc29ja2V0Ll9kaXNhYmxlV3JpdGVFdmVudCgpOwogIH0KfQoKY2xhc3MgX1NvY2tldCBleHRlbmRzIFN0cmVhbTxMaXN0PGludD4+IGltcGxlbWVudHMgU29ja2V0IHsKICBSYXdTb2NrZXQgX3JhdzsgLy8gU2V0IHRvIG51bGwgd2hlbiB0aGUgcmF3IHNvY2tldCBpcyBjbG9zZWQuCiAgYm9vbCBfY2xvc2VkID0gZmFsc2U7IC8vIFNldCB0byB0cnVlIHdoZW4gdGhlIHJhdyBzb2NrZXQgaXMgY2xvc2VkLgogIFN0cmVhbUNvbnRyb2xsZXI8TGlzdDxpbnQ+PiBfY29udHJvbGxlcjsKICBib29sIF9jb250cm9sbGVyQ2xvc2VkID0gZmFsc2U7CiAgX1NvY2tldFN0cmVhbUNvbnN1bWVyIF9jb25zdW1lcjsKICBJT1NpbmsgX3Npbms7CiAgdmFyIF9zdWJzY3JpcHRpb247CiAgdmFyIF9kZXRhY2hSZWFkeTsKCiAgX1NvY2tldCh0aGlzLl9yYXcpIHsKICAgIF9jb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8TGlzdDxpbnQ+PigKICAgICAgICBzeW5jOiB0cnVlLAogICAgICAgIG9uTGlzdGVuOiBfb25TdWJzY3JpcHRpb25TdGF0ZUNoYW5nZSwKICAgICAgICBvbkNhbmNlbDogX29uU3Vic2NyaXB0aW9uU3RhdGVDaGFuZ2UsCiAgICAgICAgb25QYXVzZTogX29uUGF1c2VTdGF0ZUNoYW5nZSwKICAgICAgICBvblJlc3VtZTogX29uUGF1c2VTdGF0ZUNoYW5nZSk7CiAgICBfY29uc3VtZXIgPSBuZXcgX1NvY2tldFN0cmVhbUNvbnN1bWVyKHRoaXMpOwogICAgX3NpbmsgPSBuZXcgSU9TaW5rKF9jb25zdW1lcik7CgogICAgLy8gRGlzYWJsZSByZWFkIGV2ZW50cyB1bnRpbCB0aGVyZSBpcyBhIHN1YnNjcmlwdGlvbi4KICAgIF9yYXcucmVhZEV2ZW50c0VuYWJsZWQgPSBmYWxzZTsKCiAgICAvLyBEaXNhYmxlIHdyaXRlIGV2ZW50cyB1bnRpbCB0aGUgY29uc3VtZXIgbmVlZHMgaXQgZm9yIHBlbmRpbmcgd3JpdGVzLgogICAgX3Jhdy53cml0ZUV2ZW50c0VuYWJsZWQgPSBmYWxzZTsKICB9CgogIGZhY3RvcnkgX1NvY2tldC5fd3JpdGVQaXBlKCkgewogICAgcmV0dXJuIG5ldyBfU29ja2V0KG5ldyBfUmF3U29ja2V0Ll93cml0ZVBpcGUoKSk7CiAgfQoKICBmYWN0b3J5IF9Tb2NrZXQuX3JlYWRQaXBlKFtpbnQgZmRdKSB7CiAgICByZXR1cm4gbmV3IF9Tb2NrZXQobmV3IF9SYXdTb2NrZXQuX3JlYWRQaXBlKGZkKSk7CiAgfQoKICAvLyBOb3RlOiB0aGlzIGNvZGUgc2VlbXMgYSBiaXQgc3VzcGljaW91cyBiZWNhdXNlIF9yYXcgY2FuIGJlIF9SYXdTb2NrZXQgYW5kCiAgLy8gaXQgY2FuIGJlIF9SYXdTZWN1cmVTb2NrZXQgYmVjYXVzZSBfU2VjdXJlU29ja2V0IGV4dGVuZHMgX1NvY2tldAogIC8vIGFuZCB0aGVzZSB0d28gdHlwZXMgYXJlIGluY29tcGF0aWJsZSBiZWNhdXNlIF9SYXdTZWN1cmVTb2NrZXQuX3NvY2tldAogIC8vIGlzIFNvY2tldCBhbmQgbm90IF9OYXRpdmVTb2NrZXQuCiAgX05hdGl2ZVNvY2tldCBnZXQgX25hdGl2ZVNvY2tldCA9PiAoX3JhdyBhcyBfUmF3U29ja2V0KS5fc29ja2V0OwoKICBTdHJlYW1TdWJzY3JpcHRpb248TGlzdDxpbnQ+PiBsaXN0ZW4odm9pZCBvbkRhdGEoTGlzdDxpbnQ+IGV2ZW50KSwKICAgICAge0Z1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcn0pIHsKICAgIHJldHVybiBfY29udHJvbGxlci5zdHJlYW0ubGlzdGVuKG9uRGF0YSwKICAgICAgICBvbkVycm9yOiBvbkVycm9yLCBvbkRvbmU6IG9uRG9uZSwgY2FuY2VsT25FcnJvcjogY2FuY2VsT25FcnJvcik7CiAgfQoKICBFbmNvZGluZyBnZXQgZW5jb2RpbmcgPT4gX3NpbmsuZW5jb2Rpbmc7CgogIHZvaWQgc2V0IGVuY29kaW5nKEVuY29kaW5nIHZhbHVlKSB7CiAgICBfc2luay5lbmNvZGluZyA9IHZhbHVlOwogIH0KCiAgdm9pZCB3cml0ZShPYmplY3Qgb2JqKSA9PiBfc2luay53cml0ZShvYmopOwoKICB2b2lkIHdyaXRlbG4oW09iamVjdCBvYmogPSAiIl0pID0+IF9zaW5rLndyaXRlbG4ob2JqKTsKCiAgdm9pZCB3cml0ZUNoYXJDb2RlKGludCBjaGFyQ29kZSkgPT4gX3Npbmsud3JpdGVDaGFyQ29kZShjaGFyQ29kZSk7CgogIHZvaWQgd3JpdGVBbGwoSXRlcmFibGUgb2JqZWN0cywgW3NlcCA9ICIiXSkgPT4gX3Npbmsud3JpdGVBbGwob2JqZWN0cywgc2VwKTsKCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGJ5dGVzKSA9PiBfc2luay5hZGQoYnl0ZXMpOwoKICB2b2lkIGFkZEVycm9yKE9iamVjdCBlcnJvciwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3Qgc2VuZCBlcnJvcnMgb24gc29ja2V0cyIpOwogIH0KCiAgRnV0dXJlIGFkZFN0cmVhbShTdHJlYW08TGlzdDxpbnQ+PiBzdHJlYW0pIHsKICAgIHJldHVybiBfc2luay5hZGRTdHJlYW0oc3RyZWFtKTsKICB9CgogIEZ1dHVyZSBmbHVzaCgpID0+IF9zaW5rLmZsdXNoKCk7CgogIEZ1dHVyZSBjbG9zZSgpID0+IF9zaW5rLmNsb3NlKCk7CgogIEZ1dHVyZSBnZXQgZG9uZSA9PiBfc2luay5kb25lOwoKICB2b2lkIGRlc3Ryb3koKSB7CiAgICAvLyBEZXN0cm95IGNhbiBhbHdheXMgYmUgY2FsbGVkIHRvIGdldCByaWQgb2YgYSBzb2NrZXQuCiAgICBpZiAoX3JhdyA9PSBudWxsKSByZXR1cm47CiAgICBfY29uc3VtZXIuc3RvcCgpOwogICAgX2Nsb3NlUmF3U29ja2V0KCk7CiAgICBfY29udHJvbGxlckNsb3NlZCA9IHRydWU7CiAgICBfY29udHJvbGxlci5jbG9zZSgpOwogIH0KCiAgYm9vbCBzZXRPcHRpb24oU29ja2V0T3B0aW9uIG9wdGlvbiwgYm9vbCBlbmFibGVkKSB7CiAgICBpZiAoX3JhdyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gX3Jhdy5zZXRPcHRpb24ob3B0aW9uLCBlbmFibGVkKTsKICB9CgogIFVpbnQ4TGlzdCBnZXRSYXdPcHRpb24oUmF3U29ja2V0T3B0aW9uIG9wdGlvbikgewogICAgaWYgKF9yYXcgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gX3Jhdy5nZXRSYXdPcHRpb24ob3B0aW9uKTsKICB9CgogIHZvaWQgc2V0UmF3T3B0aW9uKFJhd1NvY2tldE9wdGlvbiBvcHRpb24pIHsKICAgIF9yYXc/LnNldFJhd09wdGlvbihvcHRpb24pOwogIH0KCiAgaW50IGdldCBwb3J0IHsKICAgIGlmIChfcmF3ID09IG51bGwpIHRocm93IGNvbnN0IFNvY2tldEV4Y2VwdGlvbi5jbG9zZWQoKTsKICAgIDsKICAgIHJldHVybiBfcmF3LnBvcnQ7CiAgfQoKICBJbnRlcm5ldEFkZHJlc3MgZ2V0IGFkZHJlc3MgewogICAgaWYgKF9yYXcgPT0gbnVsbCkgdGhyb3cgY29uc3QgU29ja2V0RXhjZXB0aW9uLmNsb3NlZCgpOwogICAgOwogICAgcmV0dXJuIF9yYXcuYWRkcmVzczsKICB9CgogIGludCBnZXQgcmVtb3RlUG9ydCB7CiAgICBpZiAoX3JhdyA9PSBudWxsKSB0aHJvdyBjb25zdCBTb2NrZXRFeGNlcHRpb24uY2xvc2VkKCk7CiAgICA7CiAgICByZXR1cm4gX3Jhdy5yZW1vdGVQb3J0OwogIH0KCiAgSW50ZXJuZXRBZGRyZXNzIGdldCByZW1vdGVBZGRyZXNzIHsKICAgIGlmIChfcmF3ID09IG51bGwpIHRocm93IGNvbnN0IFNvY2tldEV4Y2VwdGlvbi5jbG9zZWQoKTsKICAgIDsKICAgIHJldHVybiBfcmF3LnJlbW90ZUFkZHJlc3M7CiAgfQoKICBGdXR1cmUgX2RldGFjaFJhdygpIHsKICAgIF9kZXRhY2hSZWFkeSA9IG5ldyBDb21wbGV0ZXIoKTsKICAgIF9zaW5rLmNsb3NlKCk7CiAgICByZXR1cm4gX2RldGFjaFJlYWR5LmZ1dHVyZS50aGVuKChfKSB7CiAgICAgIGFzc2VydChfY29uc3VtZXIuYnVmZmVyID09IG51bGwpOwogICAgICB2YXIgcmF3ID0gX3JhdzsKICAgICAgX3JhdyA9IG51bGw7CiAgICAgIHJldHVybiBbcmF3LCBfc3Vic2NyaXB0aW9uXTsKICAgIH0pOwogIH0KCiAgLy8gRW5zdXJlIGEgc3Vic2NyaXB0aW9uIG9uIHRoZSByYXcgc29ja2V0LiBCb3RoIHRoZSBzdHJlYW0gYW5kIHRoZQogIC8vIGNvbnN1bWVyIG5lZWRzIGEgc3Vic2NyaXB0aW9uIGFzIHRoZXkgc2hhcmUgdGhlIGVycm9yIGFuZCBkb25lCiAgLy8gZXZlbnRzIGZyb20gdGhlIHJhdyBzb2NrZXQuCiAgdm9pZCBfZW5zdXJlUmF3U29ja2V0U3Vic2NyaXB0aW9uKCkgewogICAgaWYgKF9zdWJzY3JpcHRpb24gPT0gbnVsbCAmJiBfcmF3ICE9IG51bGwpIHsKICAgICAgX3N1YnNjcmlwdGlvbiA9IF9yYXcubGlzdGVuKF9vbkRhdGEsCiAgICAgICAgICBvbkVycm9yOiBfb25FcnJvciwgb25Eb25lOiBfb25Eb25lLCBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIH0KICB9CgogIF9jbG9zZVJhd1NvY2tldCgpIHsKICAgIHZhciB0bXAgPSBfcmF3OwogICAgX3JhdyA9IG51bGw7CiAgICBfY2xvc2VkID0gdHJ1ZTsKICAgIHRtcC5jbG9zZSgpOwogIH0KCiAgdm9pZCBfb25TdWJzY3JpcHRpb25TdGF0ZUNoYW5nZSgpIHsKICAgIGlmIChfY29udHJvbGxlci5oYXNMaXN0ZW5lcikgewogICAgICBfZW5zdXJlUmF3U29ja2V0U3Vic2NyaXB0aW9uKCk7CiAgICAgIC8vIEVuYWJsZSByZWFkIGV2ZW50cyBmb3IgcHJvdmlkaW5nIGRhdGEgdG8gc3Vic2NyaXB0aW9uLgogICAgICBpZiAoX3JhdyAhPSBudWxsKSB7CiAgICAgICAgX3Jhdy5yZWFkRXZlbnRzRW5hYmxlZCA9IHRydWU7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIF9jb250cm9sbGVyQ2xvc2VkID0gdHJ1ZTsKICAgICAgaWYgKF9yYXcgIT0gbnVsbCkgewogICAgICAgIF9yYXcuc2h1dGRvd24oU29ja2V0RGlyZWN0aW9uLnJlY2VpdmUpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIF9vblBhdXNlU3RhdGVDaGFuZ2UoKSB7CiAgICBpZiAoX3JhdyAhPSBudWxsKSB7CiAgICAgIF9yYXcucmVhZEV2ZW50c0VuYWJsZWQgPSAhX2NvbnRyb2xsZXIuaXNQYXVzZWQ7CiAgICB9CiAgfQoKICB2b2lkIF9vbkRhdGEoZXZlbnQpIHsKICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICAgY2FzZSBSYXdTb2NrZXRFdmVudC5yZWFkOgogICAgICAgIHZhciBidWZmZXIgPSBfcmF3LnJlYWQoKTsKICAgICAgICBpZiAoYnVmZmVyICE9IG51bGwpIF9jb250cm9sbGVyLmFkZChidWZmZXIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFJhd1NvY2tldEV2ZW50LndyaXRlOgogICAgICAgIF9jb25zdW1lci53cml0ZSgpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFJhd1NvY2tldEV2ZW50LnJlYWRDbG9zZWQ6CiAgICAgICAgX2NvbnRyb2xsZXJDbG9zZWQgPSB0cnVlOwogICAgICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICB2b2lkIF9vbkRvbmUoKSB7CiAgICBpZiAoIV9jb250cm9sbGVyQ2xvc2VkKSB7CiAgICAgIF9jb250cm9sbGVyQ2xvc2VkID0gdHJ1ZTsKICAgICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICAgIH0KICAgIF9jb25zdW1lci5kb25lKCk7CiAgfQoKICB2b2lkIF9vbkVycm9yKGVycm9yLCBzdGFja1RyYWNlKSB7CiAgICBpZiAoIV9jb250cm9sbGVyQ2xvc2VkKSB7CiAgICAgIF9jb250cm9sbGVyQ2xvc2VkID0gdHJ1ZTsKICAgICAgX2NvbnRyb2xsZXIuYWRkRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICBfY29udHJvbGxlci5jbG9zZSgpOwogICAgfQogICAgX2NvbnN1bWVyLmRvbmUoZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgaW50IF93cml0ZShMaXN0PGludD4gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgPT4KICAgICAgX3Jhdy53cml0ZShkYXRhLCBvZmZzZXQsIGxlbmd0aCk7CgogIHZvaWQgX2VuYWJsZVdyaXRlRXZlbnQoKSB7CiAgICBfcmF3LndyaXRlRXZlbnRzRW5hYmxlZCA9IHRydWU7CiAgfQoKICB2b2lkIF9kaXNhYmxlV3JpdGVFdmVudCgpIHsKICAgIGlmIChfcmF3ICE9IG51bGwpIHsKICAgICAgX3Jhdy53cml0ZUV2ZW50c0VuYWJsZWQgPSBmYWxzZTsKICAgIH0KICB9CgogIHZvaWQgX2NvbnN1bWVyRG9uZSgpIHsKICAgIGlmIChfZGV0YWNoUmVhZHkgIT0gbnVsbCkgewogICAgICBfZGV0YWNoUmVhZHkuY29tcGxldGUobnVsbCk7CiAgICB9IGVsc2UgewogICAgICBpZiAoX3JhdyAhPSBudWxsKSB7CiAgICAgICAgX3Jhdy5zaHV0ZG93bihTb2NrZXREaXJlY3Rpb24uc2VuZCk7CiAgICAgICAgX2Rpc2FibGVXcml0ZUV2ZW50KCk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgc2V0IF9vd25lcihvd25lcikgewogICAgLy8gTm90ZTogX3JhdyBjYW4gYmUgX1Jhd1NvY2tldCBhbmQgX1Jhd1NlY3VyZVNvY2tldCB3aGljaCBhcmUgdHdvCiAgICAvLyBpbmNvbXBhdGlibGUgdHlwZXMuCiAgICAoX3JhdyBhcyBkeW5hbWljKS5fb3duZXIgPSBvd25lcjsKICB9Cn0KCkBwYXRjaApjbGFzcyBSYXdEYXRhZ3JhbVNvY2tldCB7CiAgQHBhdGNoCiAgc3RhdGljIEZ1dHVyZTxSYXdEYXRhZ3JhbVNvY2tldD4gYmluZChob3N0LCBpbnQgcG9ydCwKICAgICAge2Jvb2wgcmV1c2VBZGRyZXNzOiB0cnVlLCBib29sIHJldXNlUG9ydDogZmFsc2UsIGludCB0dGw6IDF9KSB7CiAgICByZXR1cm4gX1Jhd0RhdGFncmFtU29ja2V0LmJpbmQoaG9zdCwgcG9ydCwgcmV1c2VBZGRyZXNzLCByZXVzZVBvcnQsIHR0bCk7CiAgfQp9CgpjbGFzcyBfUmF3RGF0YWdyYW1Tb2NrZXQgZXh0ZW5kcyBTdHJlYW08UmF3U29ja2V0RXZlbnQ+CiAgICBpbXBsZW1lbnRzIFJhd0RhdGFncmFtU29ja2V0IHsKICBfTmF0aXZlU29ja2V0IF9zb2NrZXQ7CiAgU3RyZWFtQ29udHJvbGxlcjxSYXdTb2NrZXRFdmVudD4gX2NvbnRyb2xsZXI7CiAgYm9vbCBfcmVhZEV2ZW50c0VuYWJsZWQgPSB0cnVlOwogIGJvb2wgX3dyaXRlRXZlbnRzRW5hYmxlZCA9IHRydWU7CgogIF9SYXdEYXRhZ3JhbVNvY2tldCh0aGlzLl9zb2NrZXQpIHsKICAgIHZhciB6b25lID0gWm9uZS5jdXJyZW50OwogICAgX2NvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxSYXdTb2NrZXRFdmVudD4oCiAgICAgICAgc3luYzogdHJ1ZSwKICAgICAgICBvbkxpc3RlbjogX29uU3Vic2NyaXB0aW9uU3RhdGVDaGFuZ2UsCiAgICAgICAgb25DYW5jZWw6IF9vblN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlLAogICAgICAgIG9uUGF1c2U6IF9vblBhdXNlU3RhdGVDaGFuZ2UsCiAgICAgICAgb25SZXN1bWU6IF9vblBhdXNlU3RhdGVDaGFuZ2UpOwogICAgX3NvY2tldC5zZXRIYW5kbGVycygKICAgICAgICByZWFkOiAoKSA9PiBfY29udHJvbGxlci5hZGQoUmF3U29ja2V0RXZlbnQucmVhZCksCiAgICAgICAgd3JpdGU6ICgpIHsKICAgICAgICAgIC8vIFRoZSB3cml0ZSBldmVudCBoYW5kbGVyIGlzIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQgYnkgdGhlCiAgICAgICAgICAvLyBldmVudCBoYW5kbGVyIHdoZW4gaXQgZmlyZXMuCiAgICAgICAgICB3cml0ZUV2ZW50c0VuYWJsZWQgPSBmYWxzZTsKICAgICAgICAgIF9jb250cm9sbGVyLmFkZChSYXdTb2NrZXRFdmVudC53cml0ZSk7CiAgICAgICAgfSwKICAgICAgICBjbG9zZWQ6ICgpID0+IF9jb250cm9sbGVyLmFkZChSYXdTb2NrZXRFdmVudC5yZWFkQ2xvc2VkKSwKICAgICAgICBkZXN0cm95ZWQ6ICgpIHsKICAgICAgICAgIF9jb250cm9sbGVyLmFkZChSYXdTb2NrZXRFdmVudC5jbG9zZWQpOwogICAgICAgICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICAgICAgICB9LAogICAgICAgIGVycm9yOiB6b25lLmJpbmRVbmFyeUNhbGxiYWNrR3VhcmRlZCgoZSkgewogICAgICAgICAgX2NvbnRyb2xsZXIuYWRkRXJyb3IoZSk7CiAgICAgICAgICBfc29ja2V0LmNsb3NlKCk7CiAgICAgICAgfSkpOwogIH0KCiAgc3RhdGljIEZ1dHVyZTxSYXdEYXRhZ3JhbVNvY2tldD4gYmluZCgKICAgICAgaG9zdCwgaW50IHBvcnQsIGJvb2wgcmV1c2VBZGRyZXNzLCBib29sIHJldXNlUG9ydCwgaW50IHR0bCkgewogICAgX3Rocm93T25CYWRQb3J0KHBvcnQpOwogICAgX3Rocm93T25CYWRUdGwodHRsKTsKICAgIHJldHVybiBfTmF0aXZlU29ja2V0LmJpbmREYXRhZ3JhbShob3N0LCBwb3J0LCByZXVzZUFkZHJlc3MsIHJldXNlUG9ydCwgdHRsKQogICAgICAgIC50aGVuKChzb2NrZXQpID0+IG5ldyBfUmF3RGF0YWdyYW1Tb2NrZXQoc29ja2V0KSk7CiAgfQoKICBTdHJlYW1TdWJzY3JpcHRpb248UmF3U29ja2V0RXZlbnQ+IGxpc3Rlbih2b2lkIG9uRGF0YShSYXdTb2NrZXRFdmVudCBldmVudCksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICByZXR1cm4gX2NvbnRyb2xsZXIuc3RyZWFtLmxpc3RlbihvbkRhdGEsCiAgICAgICAgb25FcnJvcjogb25FcnJvciwgb25Eb25lOiBvbkRvbmUsIGNhbmNlbE9uRXJyb3I6IGNhbmNlbE9uRXJyb3IpOwogIH0KCiAgRnV0dXJlIGNsb3NlKCkgPT4gX3NvY2tldC5jbG9zZSgpLnRoZW48UmF3RGF0YWdyYW1Tb2NrZXQ+KChfKSA9PiB0aGlzKTsKCiAgaW50IHNlbmQoTGlzdDxpbnQ+IGJ1ZmZlciwgSW50ZXJuZXRBZGRyZXNzIGFkZHJlc3MsIGludCBwb3J0KSA9PgogICAgICBfc29ja2V0LnNlbmQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoLCBhZGRyZXNzLCBwb3J0KTsKCiAgRGF0YWdyYW0gcmVjZWl2ZSgpIHsKICAgIHJldHVybiBfc29ja2V0LnJlY2VpdmUoKTsKICB9CgogIHZvaWQgam9pbk11bHRpY2FzdChJbnRlcm5ldEFkZHJlc3MgZ3JvdXAsIFtOZXR3b3JrSW50ZXJmYWNlIGludGVyZmFjZV0pIHsKICAgIF9zb2NrZXQuam9pbk11bHRpY2FzdChncm91cCwgaW50ZXJmYWNlKTsKICB9CgogIHZvaWQgbGVhdmVNdWx0aWNhc3QoSW50ZXJuZXRBZGRyZXNzIGdyb3VwLCBbTmV0d29ya0ludGVyZmFjZSBpbnRlcmZhY2VdKSB7CiAgICBfc29ja2V0LmxlYXZlTXVsdGljYXN0KGdyb3VwLCBpbnRlcmZhY2UpOwogIH0KCiAgYm9vbCBnZXQgcmVhZEV2ZW50c0VuYWJsZWQgPT4gX3JlYWRFdmVudHNFbmFibGVkOwogIHZvaWQgc2V0IHJlYWRFdmVudHNFbmFibGVkKGJvb2wgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSAhPSBfcmVhZEV2ZW50c0VuYWJsZWQpIHsKICAgICAgX3JlYWRFdmVudHNFbmFibGVkID0gdmFsdWU7CiAgICAgIGlmICghX2NvbnRyb2xsZXIuaXNQYXVzZWQpIF9yZXN1bWUoKTsKICAgIH0KICB9CgogIGJvb2wgZ2V0IHdyaXRlRXZlbnRzRW5hYmxlZCA9PiBfd3JpdGVFdmVudHNFbmFibGVkOwogIHZvaWQgc2V0IHdyaXRlRXZlbnRzRW5hYmxlZChib29sIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgIT0gX3dyaXRlRXZlbnRzRW5hYmxlZCkgewogICAgICBfd3JpdGVFdmVudHNFbmFibGVkID0gdmFsdWU7CiAgICAgIGlmICghX2NvbnRyb2xsZXIuaXNQYXVzZWQpIF9yZXN1bWUoKTsKICAgIH0KICB9CgogIGJvb2wgZ2V0IG11bHRpY2FzdExvb3BiYWNrID0+CiAgICAgIF9zb2NrZXQuZ2V0T3B0aW9uKFNvY2tldE9wdGlvbi5faXBNdWx0aWNhc3RMb29wKTsKICB2b2lkIHNldCBtdWx0aWNhc3RMb29wYmFjayhib29sIHZhbHVlKSA9PgogICAgICBfc29ja2V0LnNldE9wdGlvbihTb2NrZXRPcHRpb24uX2lwTXVsdGljYXN0TG9vcCwgdmFsdWUpOwoKICBpbnQgZ2V0IG11bHRpY2FzdEhvcHMgPT4gX3NvY2tldC5nZXRPcHRpb24oU29ja2V0T3B0aW9uLl9pcE11bHRpY2FzdEhvcHMpOwogIHZvaWQgc2V0IG11bHRpY2FzdEhvcHMoaW50IHZhbHVlKSA9PgogICAgICBfc29ja2V0LnNldE9wdGlvbihTb2NrZXRPcHRpb24uX2lwTXVsdGljYXN0SG9wcywgdmFsdWUpOwoKICBOZXR3b3JrSW50ZXJmYWNlIGdldCBtdWx0aWNhc3RJbnRlcmZhY2UgPT4gdGhyb3cgIk5vdCBpbXBsZW1lbnRlZCI7CiAgdm9pZCBzZXQgbXVsdGljYXN0SW50ZXJmYWNlKE5ldHdvcmtJbnRlcmZhY2UgdmFsdWUpID0+CiAgICAgIHRocm93ICJOb3QgaW1wbGVtZW50ZWQiOwoKICBib29sIGdldCBicm9hZGNhc3RFbmFibGVkID0+IF9zb2NrZXQuZ2V0T3B0aW9uKFNvY2tldE9wdGlvbi5faXBCcm9hZGNhc3QpOwogIHZvaWQgc2V0IGJyb2FkY2FzdEVuYWJsZWQoYm9vbCB2YWx1ZSkgPT4KICAgICAgX3NvY2tldC5zZXRPcHRpb24oU29ja2V0T3B0aW9uLl9pcEJyb2FkY2FzdCwgdmFsdWUpOwoKICBpbnQgZ2V0IHBvcnQgPT4gX3NvY2tldC5wb3J0OwoKICBJbnRlcm5ldEFkZHJlc3MgZ2V0IGFkZHJlc3MgPT4gX3NvY2tldC5hZGRyZXNzOwoKICBfcGF1c2UoKSB7CiAgICBfc29ja2V0LnNldExpc3RlbmluZyhyZWFkOiBmYWxzZSwgd3JpdGU6IGZhbHNlKTsKICB9CgogIHZvaWQgX3Jlc3VtZSgpIHsKICAgIF9zb2NrZXQuc2V0TGlzdGVuaW5nKHJlYWQ6IF9yZWFkRXZlbnRzRW5hYmxlZCwgd3JpdGU6IF93cml0ZUV2ZW50c0VuYWJsZWQpOwogIH0KCiAgdm9pZCBfb25QYXVzZVN0YXRlQ2hhbmdlKCkgewogICAgaWYgKF9jb250cm9sbGVyLmlzUGF1c2VkKSB7CiAgICAgIF9wYXVzZSgpOwogICAgfSBlbHNlIHsKICAg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bGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuaW87CgppbnQgX25leHRTZXJ2aWNlSWQgPSAxOwoKLy8gVE9ETyhham9obnNlbik6IFVzZSBvdGhlciB3YXkgb2YgZ2V0dGluZyBhIHVuaXF1ZSBpZC4KYWJzdHJhY3QgY2xhc3MgX1NlcnZpY2VPYmplY3QgewogIGludCBfX3NlcnZpY2VJZCA9IDA7CiAgaW50IGdldCBfc2VydmljZUlkIHsKICAgIGlmIChfX3NlcnZpY2VJZCA9PSAwKSBfX3NlcnZpY2VJZCA9IF9uZXh0U2VydmljZUlkKys7CiAgICByZXR1cm4gX19zZXJ2aWNlSWQ7CiAgfQoKICBNYXAgX3RvSlNPTihib29sIHJlZik7CgogIFN0cmluZyBnZXQgX3NlcnZpY2VQYXRoID0+ICIkX3NlcnZpY2VUeXBlUGF0aC8kX3NlcnZpY2VJZCI7CgogIFN0cmluZyBnZXQgX3NlcnZpY2VUeXBlUGF0aDsKCiAgU3RyaW5nIGdldCBfc2VydmljZVR5cGVOYW1lOwoKICBTdHJpbmcgX3NlcnZpY2VUeXBlKGJvb2wgcmVmKSB7CiAgICBpZiAocmVmKSByZXR1cm4gIkAkX3NlcnZpY2VUeXBlTmFtZSI7CiAgICByZXR1cm4gX3NlcnZpY2VUeXBlTmFtZTsKICB9Cn0KHwBOTjwBEQEYATkgFxc6GAQBGQE+AR8BHwEiKh0EAgEbZGFydDppby9zZXJ2aWNlX29iamVjdC5kYXJ0OG9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9iaW4vc2VjdXJlX3NvY2tldF9wYXRjaC5kYXJ0nacvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29tbW9uX3BhdGNoLmRhcnQiOwoKQHBhdGNoCmNsYXNzIFNlY3VyZVNvY2tldCB7CiAgQHBhdGNoCiAgZmFjdG9yeSBTZWN1cmVTb2NrZXQuXyhSYXdTZWN1cmVTb2NrZXQgcmF3U29ja2V0KSA9PgogICAgICBuZXcgX1NlY3VyZVNvY2tldChyYXdTb2NrZXQpOwp9CgpAcGF0Y2gKY2xhc3MgX1NlY3VyZUZpbHRlciB7CiAgQHBhdGNoCiAgZmFjdG9yeSBfU2VjdXJlRmlsdGVyKCkgPT4gbmV3IF9TZWN1cmVGaWx0ZXJJbXBsKCk7Cn0KCkBwYXRjaApAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIFg1MDlDZXJ0aWZpY2F0ZSB7CiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGZhY3RvcnkgWDUwOUNlcnRpZmljYXRlLl8oKSA9PiBuZXcgX1g1MDlDZXJ0aWZpY2F0ZUltcGwoKTsKfQoKY2xhc3MgX1NlY3VyZVNvY2tldCBleHRlbmRzIF9Tb2NrZXQgaW1wbGVtZW50cyBTZWN1cmVTb2NrZXQgewogIF9SYXdTZWN1cmVTb2NrZXQgZ2V0IF9yYXcgPT4gc3VwZXIuX3JhdyBhcyBfUmF3U2VjdXJlU29ja2V0OwoKICBfU2VjdXJlU29ja2V0KFJhd1NlY3VyZVNvY2tldCByYXcpIDogc3VwZXIocmF3KTsKCiAgdm9pZCByZW5lZ290aWF0ZSgKICAgICAge2Jvb2wgdXNlU2Vzc2lvbkNhY2hlOiB0cnVlLAogICAgICBib29sIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZTogZmFsc2UsCiAgICAgIGJvb2wgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlOiBmYWxzZX0pIHsKICAgIF9yYXcucmVuZWdvdGlhdGUoCiAgICAgICAgdXNlU2Vzc2lvbkNhY2hlOiB1c2VTZXNzaW9uQ2FjaGUsCiAgICAgICAgcmVxdWVzdENsaWVudENlcnRpZmljYXRlOiByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGUsCiAgICAgICAgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlOiByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGUpOwogIH0KCiAgWDUwOUNlcnRpZmljYXRlIGdldCBwZWVyQ2VydGlmaWNhdGUgewogICAgaWYgKF9yYXcgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigicGVlckNlcnRpZmljYXRlIGNhbGxlZCBvbiBkZXN0cm95ZWQgU2VjdXJlU29ja2V0Iik7CiAgICB9CiAgICByZXR1cm4gX3Jhdy5wZWVyQ2VydGlmaWNhdGU7CiAgfQoKICBTdHJpbmcgZ2V0IHNlbGVjdGVkUHJvdG9jb2wgewogICAgaWYgKF9yYXcgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigic2VsZWN0ZWRQcm90b2NvbCBjYWxsZWQgb24gZGVzdHJveWVkIFNlY3VyZVNvY2tldCIpOwogICAgfQogICAgcmV0dXJuIF9yYXcuc2VsZWN0ZWRQcm90b2NvbDsKICB9Cn0KCi8qKgogKiBfU2VjdXJlRmlsdGVySW1wbCB3cmFwcyBhIGZpbHRlciB0aGF0IGVuY3J5cHRzIGFuZCBkZWNyeXB0cyBkYXRhIHRyYXZlbGxpbmcKICogb3ZlciBhbiBlbmNyeXB0ZWQgc29ja2V0LiAgVGhlIGZpbHRlciBhbHNvIGhhbmRsZXMgdGhlIGhhbmRzaGFraW5nCiAqIGFuZCBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24uCiAqCiAqIFRoZSBmaWx0ZXIgZXhwb3NlcyBpdHMgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFzIERhcnQgb2JqZWN0cyB0aGF0CiAqIGFyZSBiYWNrZWQgYnkgYW4gZXh0ZXJuYWwgQyBhcnJheSBvZiBieXRlcywgc28gdGhhdCBib3RoIERhcnQgY29kZSBhbmQKICogbmF0aXZlIGNvZGUgY2FuIGFjY2VzcyB0aGUgc2FtZSBkYXRhLgogKi8KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfU2VjdXJlRmlsdGVySW1wbCBleHRlbmRzIE5hdGl2ZUZpZWxkV3JhcHBlckNsYXNzMQogICAgaW1wbGVtZW50cyBfU2VjdXJlRmlsdGVyIHsKICAvLyBQZXJmb3JtYW5jZSBpcyBpbXByb3ZlZCBpZiBhIGZ1bGwgYnVmZmVyIG9mIHBsYWludGV4dCBmaXRzCiAgLy8gaW4gdGhlIGVuY3J5cHRlZCBidWZmZXIsIHdoZW4gZW5jcnlwdGVkLgogIC8vIFNJWkUgYW5kIEVOQ1JZUFRFRF9TSVpFIGFyZSByZWZlcmVuY2VkIGZyb20gQysrLgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBzdGF0aWMgZmluYWwgaW50IFNJWkUgPSA4ICogMTAyNDsKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgc3RhdGljIGZpbmFsIGludCBFTkNSWVBURURfU0laRSA9IDEwICogMTAyNDsKCiAgX1NlY3VyZUZpbHRlckltcGwoKSB7CiAgICBidWZmZXJzID0gbmV3IExpc3Q8X0V4dGVybmFsQnVmZmVyPihfUmF3U2VjdXJlU29ja2V0LmJ1ZmZlckNvdW50KTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX1Jhd1NlY3VyZVNvY2tldC5idWZmZXJDb3VudDsgKytpKSB7CiAgICAgIGJ1ZmZlcnNbaV0gPSBuZXcgX0V4dGVybmFsQnVmZmVyKAogICAgICAgICAgX1Jhd1NlY3VyZVNvY2tldC5faXNCdWZmZXJFbmNyeXB0ZWQoaSkgPyBFTkNSWVBURURfU0laRSA6IFNJWkUpOwogICAgfQogIH0KCiAgdm9pZCBjb25uZWN0KAogICAgICBTdHJpbmcgaG9zdE5hbWUsCiAgICAgIFNlY3VyaXR5Q29udGV4dCBjb250ZXh0LAogICAgICBib29sIGlzX3NlcnZlciwKICAgICAgYm9vbCByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGUsCiAgICAgIGJvb2wgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlLAogICAgICBVaW50OExpc3QgcHJvdG9jb2xzKSBuYXRpdmUgIlNlY3VyZVNvY2tldF9Db25uZWN0IjsKCiAgdm9pZCBkZXN0cm95KCkgewogICAgYnVmZmVycyA9IG51bGw7CiAgICBfZGVzdHJveSgpOwogIH0KCiAgdm9pZCBfZGVzdHJveSgpIG5hdGl2ZSAiU2VjdXJlU29ja2V0X0Rlc3Ryb3kiOwoKICB2b2lkIGhhbmRzaGFrZSgpIG5hdGl2ZSAiU2VjdXJlU29ja2V0X0hhbmRzaGFrZSI7CgogIHZvaWQgcmVoYW5kc2hha2UoKSA9PiB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7CgogIGludCBwcm9jZXNzQnVmZmVyKGludCBidWZmZXJJbmRleCkgPT4gdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOwoKICBTdHJpbmcgc2VsZWN0ZWRQcm90b2NvbCgpIG5hdGl2ZSAiU2VjdXJlU29ja2V0X0dldFNlbGVjdGVkUHJvdG9jb2wiOwoKICB2b2lkIHJlbmVnb3RpYXRlKGJvb2wgdXNlU2Vzc2lvbkNhY2hlLCBib29sIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgYm9vbCByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGUpIG5hdGl2ZSAiU2VjdXJlU29ja2V0X1JlbmVnb3RpYXRlIjsKCiAgdm9pZCBpbml0KCkgbmF0aXZlICJTZWN1cmVTb2NrZXRfSW5pdCI7CgogIFg1MDlDZXJ0aWZpY2F0ZSBnZXQgcGVlckNlcnRpZmljYXRlIG5hdGl2ZSAiU2VjdXJlU29ja2V0X1BlZXJDZXJ0aWZpY2F0ZSI7CgogIHZvaWQgcmVnaXN0ZXJCYWRDZXJ0aWZpY2F0ZUNhbGxiYWNrKEZ1bmN0aW9uIGNhbGxiYWNrKQogICAgICBuYXRpdmUgIlNlY3VyZVNvY2tldF9SZWdpc3RlckJhZENlcnRpZmljYXRlQ2FsbGJhY2siOwoKICB2b2lkIHJlZ2lzdGVySGFuZHNoYWtlQ29tcGxldGVDYWxsYmFjayhGdW5jdGlvbiBoYW5kc2hha2VDb21wbGV0ZUhhbmRsZXIpCiAgICAgIG5hdGl2ZSAiU2VjdXJlU29ja2V0X1JlZ2lzdGVySGFuZHNoYWtlQ29tcGxldGVDYWxsYmFjayI7CgogIC8vIFRoaXMgaXMgYSBzZWN1cml0eSBpc3N1ZSwgYXMgaXQgZXhwb3NlcyBhIHJhdyBwb2ludGVyIHRvIERhcnQgY29kZS4KICBpbnQgX3BvaW50ZXIoKSBuYXRpdmUgIlNlY3VyZVNvY2tldF9GaWx0ZXJQb2ludGVyIjsKCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiZ2V0IikKICBMaXN0PF9FeHRlcm5hbEJ1ZmZlcj4gYnVmZmVyczsKfQoKQHBhdGNoCmNsYXNzIFNlY3VyaXR5Q29udGV4dCB7CiAgQHBhdGNoCiAgZmFjdG9yeSBTZWN1cml0eUNvbnRleHQoe2Jvb2wgd2l0aFRydXN0ZWRSb290czogZmFsc2V9KSB7CiAgICByZXR1cm4gbmV3IF9TZWN1cml0eUNvbnRleHQod2l0aFRydXN0ZWRSb290cyk7CiAgfQoKICBAcGF0Y2gKICBzdGF0aWMgU2VjdXJpdHlDb250ZXh0IGdldCBkZWZhdWx0Q29udGV4dCB7CiAgICByZXR1cm4gX1NlY3VyaXR5Q29udGV4dC5kZWZhdWx0Q29udGV4dDsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBib29sIGdldCBhbHBuU3VwcG9ydGVkID0+IHRydWU7Cn0KCmNsYXNzIF9TZWN1cml0eUNvbnRleHQgZXh0ZW5kcyBOYXRpdmVGaWVsZFdyYXBwZXJDbGFzczEKICAgIGltcGxlbWVudHMgU2VjdXJpdHlDb250ZXh0IHsKICBfU2VjdXJpdHlDb250ZXh0KGJvb2wgd2l0aFRydXN0ZWRSb290cykgewogICAgX2NyZWF0ZU5hdGl2ZUNvbnRleHQoKTsKICAgIGlmICh3aXRoVHJ1c3RlZFJvb3RzKSB7CiAgICAgIF90cnVzdEJ1aWx0aW5Sb290cygpOwogICAgfQogIH0KCiAgdm9pZCBfY3JlYXRlTmF0aXZlQ29udGV4dCgpIG5hdGl2ZSAiU2VjdXJpdHlDb250ZXh0X0FsbG9jYXRlIjsKCiAgc3RhdGljIGZpbmFsIFNlY3VyaXR5Q29udGV4dCBkZWZhdWx0Q29udGV4dCA9IG5ldyBfU2VjdXJpdHlDb250ZXh0KHRydWUpOwoKICB2b2lkIHVzZVByaXZhdGVLZXkoU3RyaW5nIGZpbGUsIHtTdHJpbmcgcGFzc3dvcmR9KSB7CiAgICBMaXN0PGludD4gYnl0ZXMgPSAobmV3IEZpbGUoZmlsZSkpLnJlYWRBc0J5dGVzU3luYygpOwogICAgdXNlUHJpdmF0ZUtleUJ5dGVzKGJ5dGVzLCBwYXNzd29yZDogcGFzc3dvcmQpOwogIH0KCiAgdm9pZCB1c2VQcml2YXRlS2V5Qnl0ZXMoTGlzdDxpbnQ+IGtleUJ5dGVzLCB7U3RyaW5nIHBhc3N3b3JkfSkKICAgICAgbmF0aXZlICJTZWN1cml0eUNvbnRleHRfVXNlUHJpdmF0ZUtleUJ5dGVzIjsKCiAgdm9pZCBzZXRUcnVzdGVkQ2VydGlmaWNhdGVzKFN0cmluZyBmaWxlLCB7U3RyaW5nIHBhc3N3b3JkfSkgewogICAgTGlzdDxpbnQ+IGJ5dGVzID0gKG5ldyBGaWxlKGZpbGUpKS5yZWFkQXNCeXRlc1N5bmMoKTsKICAgIHNldFRydXN0ZWRDZXJ0aWZpY2F0ZXNCeXRlcyhieXRlcywgcGFzc3dvcmQ6IHBhc3N3b3JkKTsKICB9CgogIHZvaWQgc2V0VHJ1c3RlZENlcnRpZmljYXRlc0J5dGVzKExpc3Q8aW50PiBjZXJ0Qnl0ZXMsIHtTdHJpbmcgcGFzc3dvcmR9KQogICAgICBuYXRpdmUgIlNlY3VyaXR5Q29udGV4dF9TZXRUcnVzdGVkQ2VydGlmaWNhdGVzQnl0ZXMiOwoKICB2b2lkIHVzZUNlcnRpZmljYXRlQ2hhaW4oU3RyaW5nIGZpbGUsIHtTdHJpbmcgcGFzc3dvcmR9KSB7CiAgICBMaXN0PGludD4gYnl0ZXMgPSAobmV3IEZpbGUoZmlsZSkpLnJlYWRBc0J5dGVzU3luYygpOwogICAgdXNlQ2VydGlmaWNhdGVDaGFpbkJ5dGVzKGJ5dGVzLCBwYXNzd29yZDogcGFzc3dvcmQpOwogIH0KCiAgdm9pZCB1c2VDZXJ0aWZpY2F0ZUNoYWluQnl0ZXMoTGlzdDxpbnQ+IGNoYWluQnl0ZXMsIHtTdHJpbmcgcGFzc3dvcmR9KQogICAgICBuYXRpdmUgIlNlY3VyaXR5Q29udGV4dF9Vc2VDZXJ0aWZpY2F0ZUNoYWluQnl0ZXMiOwoKICB2b2lkIHNldENsaWVudEF1dGhvcml0aWVzKFN0cmluZyBmaWxlLCB7U3RyaW5nIHBhc3N3b3JkfSkgewogICAgTGlzdDxpbnQ+IGJ5dGVzID0gKG5ldyBGaWxlKGZpbGUpKS5yZWFkQXNCeXRlc1N5bmMoKTsKICAgIHNldENsaWVudEF1dGhvcml0aWVzQnl0ZXMoYnl0ZXMsIHBhc3N3b3JkOiBwYXNzd29yZCk7CiAgfQoKICB2b2lkIHNldENsaWVudEF1dGhvcml0aWVzQnl0ZXMoTGlzdDxpbnQ+IGF1dGhDZXJ0Qnl0ZXMsIHtTdHJpbmcgcGFzc3dvcmR9KQogICAgICBuYXRpdmUgIlNlY3VyaXR5Q29udGV4dF9TZXRDbGllbnRBdXRob3JpdGllc0J5dGVzIjsKCiAgdm9pZCBzZXRBbHBuUHJvdG9jb2xzKExpc3Q8U3RyaW5nPiBwcm90b2NvbHMsIGJvb2wgaXNTZXJ2ZXIpIHsKICAgIFVpbnQ4TGlzdCBlbmNvZGVkUHJvdG9jb2xzID0KICAgICAgICBTZWN1cml0eUNvbnRleHQuX3Byb3RvY29sc1RvTGVuZ3RoRW5jb2RpbmcocHJvdG9jb2xzKTsKICAgIF9zZXRBbHBuUHJvdG9jb2xzKGVuY29kZWRQcm90b2NvbHMsIGlzU2VydmVyKTsKICB9CgogIHZvaWQgX3NldEFscG5Qcm90b2NvbHMoVWludDhMaXN0IHByb3RvY29scywgYm9vbCBpc1NlcnZlcikKICAgICAgbmF0aXZlICJTZWN1cml0eUNvbnRleHRfU2V0QWxwblByb3RvY29scyI7CiAgdm9pZCBfdHJ1c3RCdWlsdGluUm9vdHMoKSBuYXRpdmUgIlNlY3VyaXR5Q29udGV4dF9UcnVzdEJ1aWx0aW5Sb290cyI7Cn0KCi8qKgogKiBfWDUwOUNlcnRpZmljYXRlSW1wbCB3cmFwcyBhbiBYNTA5IGNlcnRpZmljYXRlIG9iamVjdCBoZWxkIGJ5IHRoZSBCb3JpbmdTU0wKICogbGlicmFyeS4gSXQgZXhwb3NlcyB0aGUgZmllbGRzIG9mIHRoZSBjZXJ0aWZpY2F0ZSBvYmplY3QuCiAqLwpjbGFzcyBfWDUwOUNlcnRpZmljYXRlSW1wbCBleHRlbmRzIE5hdGl2ZUZpZWxkV3JhcHBlckNsYXNzMQogICAgaW1wbGVtZW50cyBYNTA5Q2VydGlmaWNhdGUgewogIC8vIFRoZSBuYXRpdmUgZmllbGQgbXVzdCBiZSBzZXQgbWFudWFsbHkgb24gYSBuZXcgb2JqZWN0LCBpbiBuYXRpdmUgY29kZS4KICAvLyBUaGlzIGlzIGRvbmUgYnkgV3JhcHBlZFg1MDkgaW4gc2VjdXJlX3NvY2tldC5jYy4KICBfWDUwOUNlcnRpZmljYXRlSW1wbCgpOwoKICBVaW50OExpc3QgX2NhY2hlZERlcjsKICBVaW50OExpc3QgZ2V0IF9kZXIgbmF0aXZlICJYNTA5X0RlciI7CiAgVWludDhMaXN0IGdldCBkZXIgewogICAgaWYgKF9jYWNoZWREZXIgPT0gbnVsbCkgewogICAgICBfY2FjaGVkRGVyID0gX2RlcjsKICAgIH0KICAgIHJldHVybiBfY2FjaGVkRGVyOwogIH0KCiAgU3RyaW5nIF9jYWNoZWRQZW07CiAgU3RyaW5nIGdldCBfcGVtIG5hdGl2ZSAiWDUwOV9QZW0iOwogIFN0cmluZyBnZXQgcGVtIHsKICAgIGlmIChfY2FjaGVkUGVtID09IG51bGwpIHsKICAgICAgX2NhY2hlZFBlbSA9IF9wZW07CiAgICB9CiAgICByZXR1cm4gX2NhY2hlZFBlbTsKICB9CgogIFVpbnQ4TGlzdCBfY2FjaGVkU2hhMTsKICBVaW50OExpc3QgZ2V0IF9zaGExIG5hdGl2ZSAiWDUwOV9TaGExIjsKICBVaW50OExpc3QgZ2V0IHNoYTEgewogICAgaWYgKF9jYWNoZWRTaGExID09IG51bGwpIHsKICAgICAgX2NhY2hlZFNoYTEgPSBfc2hhMTsKICAgIH0KICAgIHJldHVybiBfY2FjaGVkU2hhMTsKICB9CgogIFN0cmluZyBnZXQgc3ViamVjdCBuYXRpdmUgIlg1MDlfU3ViamVjdCI7CiAgU3RyaW5nIGdldCBpc3N1ZXIgbmF0aXZlICJYNTA5X0lzc3VlciI7CiAgRGF0ZVRpbWUgZ2V0IHN0YXJ0VmFsaWRpdHkgewogICAgcmV0dXJuIG5ldyBEYXRlVGltZS5mcm9tTWlsbGlzZWNvbmRzU2luY2VFcG9jaChfc3RhcnRWYWxpZGl0eSgpLAogICAgICAgIGlzVXRjOiB0cnVlKTsKICB9CgogIERhdGVUaW1lIGdldCBlbmRWYWxpZGl0eSB7CiAgICByZXR1cm4gbmV3IERhdGVUaW1lLmZyb21NaWxsaXNlY29uZHNTaW5jZUVwb2NoKF9lbmRWYWxpZGl0eSgpLCBpc1V0YzogdHJ1ZSk7CiAgfQoKICBpbnQgX3N0YXJ0VmFsaWRpdHkoKSBuYXRpdmUgIlg1MDlfU3RhcnRWYWxpZGl0eSI7CiAgaW50IF9lbmRWYWxpZGl0eSgpIG5hdGl2ZSAiWDUwOV9FbmRWYWxpZGl0eSI7Cn0KgP0ATk48ASABBxUJNyQCAQcWCTYCAQcaGAkcPQIBPj8BMwEUIywvFio8PQQBKBhQBiEEASAYUQYiBAIBBE9GIQNISikEGjkfQC42HCQcLwEYRz0oSwYEARAXHxYlJToBExQQBAExATQBOAFIAUcBSEgBKgFNATk8AUw/AUk2ASMhAgEHGAk8MwQBCS4sBAEJKQIBOCEsHBwcBgQBQQFMATc6MwQBQTMBQDo8BAFLPAE9OjkEAUk5AT46OgQBTToBQSE/MwQBPTFIAgEETz0EPCFMNhoBGCgWHhkGFwQBFSUTHhkGFwQBGSoXHxsGGAQBLCofRRYEAR1RBAE0MAIBJmRhcnQ6aW8tcGF0Y2gvc2VjdXJlX3NvY2tldF9wYXRjaC5kYXJ0Nm9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9iaW4vc3luY19zb2NrZXRfcGF0Y2guZGFydKbNLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvbW1vbl9wYXRjaC5kYXJ0IjsKCkBwYXRjaApjbGFzcyBSYXdTeW5jaHJvbm91c1NvY2tldCB7CiAgQHBhdGNoCiAgc3RhdGljIFJhd1N5bmNocm9ub3VzU29ja2V0IGNvbm5lY3RTeW5jKGhvc3QsIGludCBwb3J0KSB7CiAgICByZXR1cm4gX1Jhd1N5bmNocm9ub3VzU29ja2V0LmNvbm5lY3RTeW5jKGhvc3QsIHBvcnQpOwogIH0KfQoKY2xhc3MgX1Jhd1N5bmNocm9ub3VzU29ja2V0IGltcGxlbWVudHMgUmF3U3luY2hyb25vdXNTb2NrZXQgewogIGZpbmFsIF9OYXRpdmVTeW5jaHJvbm91c1NvY2tldCBfc29ja2V0OwoKICBfUmF3U3luY2hyb25vdXNTb2NrZXQodGhpcy5fc29ja2V0KTsKCiAgc3RhdGljIFJhd1N5bmNocm9ub3VzU29ja2V0IGNvbm5lY3RTeW5jKGhvc3QsIGludCBwb3J0KSB7CiAgICBfdGhyb3dPbkJhZFBvcnQocG9ydCk7CiAgICByZXR1cm4gbmV3IF9SYXdTeW5jaHJvbm91c1NvY2tldCgKICAgICAgICBfTmF0aXZlU3luY2hyb25vdXNTb2NrZXQuY29ubmVjdFN5bmMoaG9zdCwgcG9ydCkpOwogIH0KCiAgSW50ZXJuZXRBZGRyZXNzIGdldCBhZGRyZXNzID0+IF9zb2NrZXQuYWRkcmVzczsKICBpbnQgZ2V0IHBvcnQgPT4gX3NvY2tldC5wb3J0OwogIEludGVybmV0QWRkcmVzcyBnZXQgcmVtb3RlQWRkcmVzcyA9PiBfc29ja2V0LnJlbW90ZUFkZHJlc3M7CiAgaW50IGdldCByZW1vdGVQb3J0ID0+IF9zb2NrZXQucmVtb3RlUG9ydDsKCiAgaW50IGF2YWlsYWJsZSgpID0+IF9zb2NrZXQuYXZhaWxhYmxlOwoKICB2b2lkIGNsb3NlU3luYygpID0+IF9zb2NrZXQuY2xvc2VTeW5jKCk7CgogIGludCByZWFkSW50b1N5bmMoTGlzdDxpbnQ+IGJ1ZmZlciwgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKSA9PgogICAgICBfc29ja2V0LnJlYWRJbnRvU3luYyhidWZmZXIsIHN0YXJ0LCBlbmQpOwoKICBMaXN0PGludD4gcmVhZFN5bmMoaW50IGJ5dGVzKSA9PiBfc29ja2V0LnJlYWRTeW5jKGJ5dGVzKTsKCiAgdm9pZCBzaHV0ZG93bihTb2NrZXREaXJlY3Rpb24gZGlyZWN0aW9uKSA9PiBfc29ja2V0LnNodXRkb3duKGRpcmVjdGlvbik7CgogIHZvaWQgd3JpdGVGcm9tU3luYyhMaXN0PGludD4gYnVmZmVyLCBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pID0+CiAgICAgIF9zb2NrZXQud3JpdGVGcm9tU3luYyhidWZmZXIsIHN0YXJ0LCBlbmQpOwp9CgovLyBUaGUgTmF0aXZlRmllbGRXcmFwcGVyQ2xhc3MxIGNhbiBub3QgYmUgdXNlZCB3aXRoIGEgbWl4aW4sIGR1ZSB0byBtaXNzaW5nCi8vIGltcGxpY2l0IGNvbnN0cnVjdG9yLgpjbGFzcyBfTmF0aXZlU3luY2hyb25vdXNTb2NrZXROYXRpdmVXcmFwcGVyIGV4dGVuZHMgTmF0aXZlRmllbGRXcmFwcGVyQ2xhc3MxIHt9CgovLyBUaGUgX05hdGl2ZVN5bmNocm9ub3VzU29ja2V0IGNsYXNzIGVuY2Fwc3VsYXRlcyBhIHN5bmNocm9ub3VzIE9TIHNvY2tldC4KY2xhc3MgX05hdGl2ZVN5bmNocm9ub3VzU29ja2V0IGV4dGVuZHMgX05hdGl2ZVN5bmNocm9ub3VzU29ja2V0TmF0aXZlV3JhcHBlciB7CiAgLy8gU29ja2V0IGNsb3NlIHN0YXRlLgogIGJvb2wgaXNDbG9zZWQgPSBmYWxzZTsKICBib29sIGlzQ2xvc2VkUmVhZCA9IGZhbHNlOwogIGJvb2wgaXNDbG9zZWRXcml0ZSA9IGZhbHNlOwoKICAvLyBIb2xkcyB0aGUgYWRkcmVzcyB1c2VkIHRvIGNvbm5lY3QgdGhlIHNvY2tldC4KICBJbnRlcm5ldEFkZHJlc3MgbG9jYWxBZGRyZXNzOwoKICAvLyBIb2xkcyB0aGUgcG9ydCBvZiB0aGUgc29ja2V0LCAwIGlmIG5vdCBrbm93bi4KICBpbnQgbG9jYWxQb3J0ID0gMDsKCiAgX1JlYWRXcml0ZVJlc291cmNlSW5mbyByZXNvdXJjZUluZm87CgogIHN0YXRpYyBfTmF0aXZlU3luY2hyb25vdXNTb2NrZXQgY29ubmVjdFN5bmMoaG9zdCwgaW50IHBvcnQpIHsKICAgIGlmIChob3N0ID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIlBhcmFtZXRlciBob3N0IGNhbm5vdCBiZSBudWxsIik7CiAgICB9CiAgICBMaXN0PF9JbnRlcm5ldEFkZHJlc3M+IGFkZHJlc3NlcyA9IG51bGw7CiAgICB2YXIgZXJyb3IgPSBudWxsOwogICAgaWYgKGhvc3QgaXMgX0ludGVybmV0QWRkcmVzcykgewogICAgICBhZGRyZXNzZXMgPSBbaG9zdF07CiAgICB9IGVsc2UgewogICAgICB0cnkgewogICAgICAgIGFkZHJlc3NlcyA9IGxvb2t1cChob3N0KTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGVycm9yID0gZTsKICAgICAgfQogICAgICBpZiAoZXJyb3IgIT0gbnVsbCB8fCBhZGRyZXNzZXMgPT0gbnVsbCB8fCBhZGRyZXNzZXMuaXNFbXB0eSkgewogICAgICAgIHRocm93IGNyZWF0ZUVycm9yKGVycm9yLCAiRmFpbGVkIGhvc3QgbG9va3VwOiAnJGhvc3QnIik7CiAgICAgIH0KICAgIH0KICAgIGFzc2VydChhZGRyZXNzZXMgaXMgTGlzdCk7CiAgICB2YXIgaXQgPSBhZGRyZXNzZXMuaXRlcmF0b3I7CiAgICBfTmF0aXZlU3luY2hyb25vdXNTb2NrZXQgY29ubmVjdE5leHQoKSB7CiAgICAgIGlmICghaXQubW92ZU5leHQoKSkgewogICAgICAgIC8vIENvdWxkIG5vdCBjb25uZWN0LiBUaHJvdyB0aGUgZmlyc3QgY29ubmVjdGlvbiBlcnJvciB3ZSBlbmNvdW50ZXJlZC4KICAgICAgICBhc3NlcnQoZXJyb3IgIT0gbnVsbCk7CiAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgIH0KICAgICAgdmFyIGFkZHJlc3MgPSBpdC5jdXJyZW50OwogICAgICB2YXIgc29ja2V0ID0gbmV3IF9OYXRpdmVTeW5jaHJvbm91c1NvY2tldCgpOwogICAgICBzb2NrZXQubG9jYWxBZGRyZXNzID0gYWRkcmVzczsKICAgICAgdmFyIHJlc3VsdCA9IHNvY2tldC5uYXRpdmVDcmVhdGVDb25uZWN0U3luYyhhZGRyZXNzLl9pbl9hZGRyLCBwb3J0KTsKICAgICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgICAgLy8gS2VlcCBmaXJzdCBlcnJvciwgaWYgcHJlc2VudC4KICAgICAgICBpZiAoZXJyb3IgPT0gbnVsbCkgewogICAgICAgICAgZXJyb3IgPSBjcmVhdGVFcnJvcihyZXN1bHQsICJDb25uZWN0aW9uIGZhaWxlZCIsIGFkZHJlc3MsIHBvcnQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29ubmVjdE5leHQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBRdWVyeSB0aGUgbG9jYWwgcG9ydCwgZm9yIGVycm9yIG1lc3NhZ2VzLgogICAgICAgIHRyeSB7CiAgICAgICAgICBzb2NrZXQucG9ydDsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBpZiAoZXJyb3IgPT0gbnVsbCkgewogICAgICAgICAgICBlcnJvciA9IGNyZWF0ZUVycm9yKGUsICJDb25uZWN0aW9uIGZhaWxlZCIsIGFkZHJlc3MsIHBvcnQpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGNvbm5lY3ROZXh0KCk7CiAgICAgICAgfQogICAgICAgIHNldHVwUmVzb3VyY2VJbmZvKHNvY2tldCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHNvY2tldDsKICAgIH0KCiAgICByZXR1cm4gY29ubmVjdE5leHQoKTsKICB9CgogIEludGVybmV0QWRkcmVzcyBnZXQgYWRkcmVzcyA9PiBsb2NhbEFkZHJlc3M7CiAgaW50IGdldCBhdmFpbGFibGUgPT4gbmF0aXZlQXZhaWxhYmxlKCk7CgogIGludCBnZXQgcG9ydCB7CiAgICBpZiAobG9jYWxQb3J0ICE9IDApIHsKICAgICAgcmV0dXJuIGxvY2FsUG9ydDsKICAgIH0KICAgIGlmIChpc0Nsb3NlZCkgewogICAgICB0aHJvdyBjb25zdCBTb2NrZXRFeGNlcHRpb24uY2xvc2VkKCk7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gbmF0aXZlR2V0UG9ydCgpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IHJlc3VsdDsKICAgIH0KICAgIHJldHVybiBsb2NhbFBvcnQgPSByZXN1bHQ7CiAgfQoKICBJbnRlcm5ldEFkZHJlc3MgZ2V0IHJlbW90ZUFkZHJlc3MgewogICAgaWYgKGlzQ2xvc2VkKSB7CiAgICAgIHRocm93IGNvbnN0IFNvY2tldEV4Y2VwdGlvbi5jbG9zZWQoKTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBuYXRpdmVHZXRSZW1vdGVQZWVyKCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgcmVzdWx0OwogICAgfQogICAgdmFyIGFkZHIgPSByZXN1bHRbMF07CiAgICByZXR1cm4gbmV3IF9JbnRlcm5ldEFkZHJlc3MoYWRkclsxXSwgbnVsbCwgYWRkclsyXSk7CiAgfQoKICBpbnQgZ2V0IHJlbW90ZVBvcnQgewogICAgaWYgKGlzQ2xvc2VkKSB7CiAgICAgIHRocm93IGNvbnN0IFNvY2tldEV4Y2VwdGlvbi5jbG9zZWQoKTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBuYXRpdmVHZXRSZW1vdGVQZWVyKCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgcmVzdWx0OwogICAgfQogICAgcmV0dXJuIHJlc3VsdFsxXTsKICB9CgogIHZvaWQgY2xvc2VTeW5jKCkgewogICAgaWYgKCFpc0Nsb3NlZCkgewogICAgICBuYXRpdmVDbG9zZVN5bmMoKTsKICAgICAgX1NvY2tldFJlc291cmNlSW5mby5Tb2NrZXRDbG9zZWQocmVzb3VyY2VJbmZvKTsKICAgICAgaXNDbG9zZWQgPSB0cnVlOwogICAgfQogIH0KCiAgLy8gQ3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBlcnJvci9leGNlcHRpb24gZnJvbSBkaWZmZXJlbnQgcmV0dXJuZWQKICAvLyBlcnJvciBvYmplY3RzLgogIHN0YXRpYyBjcmVhdGVFcnJvcihlcnJvciwgU3RyaW5nIG1lc3NhZ2UsCiAgICAgIFtJbnRlcm5ldEFkZHJlc3MgYWRkcmVzcywgaW50IHBvcnRdKSB7CiAgICBpZiAoZXJyb3IgaXMgT1NFcnJvcikgewogICAgICByZXR1cm4gbmV3IFNvY2tldEV4Y2VwdGlvbihtZXNzYWdlLAogICAgICAgICAgb3NFcnJvcjogZXJyb3IsIGFkZHJlc3M6IGFkZHJlc3MsIHBvcnQ6IHBvcnQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBTb2NrZXRFeGNlcHRpb24obWVzc2FnZSwgYWRkcmVzczogYWRkcmVzcywgcG9ydDogcG9ydCk7CiAgICB9CiAgfQoKICBzdGF0aWMgTGlzdDxfSW50ZXJuZXRBZGRyZXNzPiBsb29rdXAoU3RyaW5nIGhvc3QsCiAgICAgIHtJbnRlcm5ldEFkZHJlc3NUeXBlIHR5cGU6IEludGVybmV0QWRkcmVzc1R5cGUuQU5ZfSkgewogICAgdmFyIHJlc3BvbnNlID0gX25hdGl2ZUxvb2t1cFJlcXVlc3QoaG9zdCwgdHlwZS5fdmFsdWUpOwogICAgaWYgKHJlc3BvbnNlIGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgcmVzcG9uc2U7CiAgICB9CiAgICBMaXN0PF9JbnRlcm5ldEFkZHJlc3M+IGFkZHJlc3NlcyA9CiAgICAgICAgbmV3IExpc3Q8X0ludGVybmV0QWRkcmVzcz4ocmVzcG9uc2UubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzcG9uc2UubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIHJlc3VsdCA9IHJlc3BvbnNlW2ldOwogICAgICBhZGRyZXNzZXNbaV0gPSBuZXcgX0ludGVybmV0QWRkcmVzcyhyZXN1bHRbMV0sIGhvc3QsIHJlc3VsdFsyXSk7CiAgICB9CiAgICByZXR1cm4gYWRkcmVzc2VzOwogIH0KCiAgaW50IHJlYWRJbnRvU3luYyhMaXN0PGludD4gYnVmZmVyLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIF9jaGVja0F2YWlsYWJsZSgpOwogICAgaWYgKGlzQ2xvc2VkUmVhZCkgewogICAgICB0aHJvdyBuZXcgU29ja2V0RXhjZXB0aW9uKCJTb2NrZXQgaXMgY2xvc2VkIGZvciByZWFkaW5nIik7CiAgICB9CgogICAgaWYgKChidWZmZXIgaXMhIExpc3QpIHx8CiAgICAgICAgKChzdGFydCAhPSBudWxsKSAmJiAoc3RhcnQgaXMhIGludCkpIHx8CiAgICAgICAgKChlbmQgIT0gbnVsbCkgJiYgKGVuZCBpcyEgaW50KSkpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkludmFsaWQgYXJndW1lbnRzIHRvIHJlYWRJbnRvU3luYyIpOwogICAgfQogICAgaWYgKHN0YXJ0ID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoInN0YXJ0IGNhbm5vdCBiZSBudWxsIik7CiAgICB9CiAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBidWZmZXIubGVuZ3RoKTsKICAgIGlmIChlbmQgPT0gc3RhcnQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gbmF0aXZlUmVhZEludG8oYnVmZmVyLCBzdGFydCwgKGVuZCAtIHN0YXJ0KSk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IFNvY2tldEV4Y2VwdGlvbigicmVhZEludG9TeW5jIGZhaWxlZCIsIG9zRXJyb3I6IHJlc3VsdCk7CiAgICB9CiAgICByZXNvdXJjZUluZm8uYWRkUmVhZChyZXN1bHQpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIExpc3Q8aW50PiByZWFkU3luYyhpbnQgbGVuKSB7CiAgICBfY2hlY2tBdmFpbGFibGUoKTsKICAgIGlmIChpc0Nsb3NlZFJlYWQpIHsKICAgICAgdGhyb3cgbmV3IFNvY2tldEV4Y2VwdGlvbigiU29ja2V0IGlzIGNsb3NlZCBmb3IgcmVhZGluZyIpOwogICAgfQoKICAgIGlmICgobGVuICE9IG51bGwpICYmIChsZW4gPCAwKSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiSWxsZWdhbCBsZW5ndGggJGxlbiIpOwogICAgfQogICAgaWYgKGxlbiA9PSAwKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgdmFyIHJlc3VsdCA9IG5hdGl2ZVJlYWQobGVuKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyByZXN1bHQ7CiAgICB9CiAgICBhc3NlcnQocmVzb3VyY2VJbmZvICE9IG51bGwpOwogICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CiAgICAgIGlmIChyZXNvdXJjZUluZm8gIT0gbnVsbCkgewogICAgICAgIHJlc291cmNlSW5mby50b3RhbFJlYWQgKz0gcmVzdWx0Lmxlbmd0aDsKICAgICAgfQogICAgfQogICAgaWYgKHJlc291cmNlSW5mbyAhPSBudWxsKSB7CiAgICAgIHJlc291cmNlSW5mby5kaWRSZWFkKCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIHZvaWQgc2V0dXBSZXNvdXJjZUluZm8oX05hdGl2ZVN5bmNocm9ub3VzU29ja2V0IHNvY2tldCkgewogICAgc29ja2V0LnJlc291cmNlSW5mbyA9IG5ldyBfU29ja2V0UmVzb3VyY2VJbmZvKHNvY2tldCk7CiAgfQoKICB2b2lkIHNodXRkb3duKFNvY2tldERpcmVjdGlvbiBkaXJlY3Rpb24pIHsKICAgIGlmIChpc0Nsb3NlZCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBzd2l0Y2ggKGRpcmVjdGlvbikgewogICAgICBjYXNlIFNvY2tldERpcmVjdGlvbi5yZWNlaXZlOgogICAgICAgIHNodXRkb3duUmVhZCgpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFNvY2tldERpcmVjdGlvbi5zZW5kOgogICAgICAgIHNodXRkb3duV3JpdGUoKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTb2NrZXREaXJlY3Rpb24uYm90aDoKICAgICAgICBjbG9zZVN5bmMoKTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihkaXJlY3Rpb24pOwogICAgfQogIH0KCiAgdm9pZCBzaHV0ZG93blJlYWQoKSB7CiAgICBpZiAoaXNDbG9zZWQgfHwgaXNDbG9zZWRSZWFkKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChpc0Nsb3NlZFdyaXRlKSB7CiAgICAgIGNsb3NlU3luYygpOwogICAgfSBlbHNlIHsKICAgICAgbmF0aXZlU2h1dGRvd25SZWFkKCk7CiAgICB9CiAgICBpc0Nsb3NlZFJlYWQgPSB0cnVlOwogIH0KCiAgdm9pZCBzaHV0ZG93bldyaXRlKCkgewogICAgaWYgKGlzQ2xvc2VkIHx8IGlzQ2xvc2VkV3JpdGUpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGlzQ2xvc2VkUmVhZCkgewogICAgICBjbG9zZVN5bmMoKTsKICAgIH0gZWxzZSB7CiAgICAgIG5hdGl2ZVNodXRkb3duV3JpdGUoKTsKICAgIH0KICAgIGlzQ2xvc2VkV3JpdGUgPSB0cnVlOwogIH0KCiAgdm9pZCB3cml0ZUZyb21TeW5jKExpc3Q8aW50PiBidWZmZXIsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgX2NoZWNrQXZhaWxhYmxlKCk7CiAgICBpZiAoaXNDbG9zZWRXcml0ZSkgewogICAgICB0aHJvdyBuZXcgU29ja2V0RXhjZXB0aW9uKCJTb2NrZXQgaXMgY2xvc2VkIGZvciB3cml0aW5nIik7CiAgICB9CiAgICBpZiAoKGJ1ZmZlciBpcyEgTGlzdCkgfHwKICAgICAgICAoKHN0YXJ0ICE9IG51bGwpICYmIChzdGFydCBpcyEgaW50KSkgfHwKICAgICAgICAoKGVuZCAhPSBudWxsKSAmJiAoZW5kIGlzISBpbnQpKSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiSW52YWxpZCBhcmd1bWVudHMgdG8gd3JpdGVGcm9tU3luYyIpOwogICAgfQogICAgaWYgKHN0YXJ0ID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoInN0YXJ0IGNhbm5vdCBiZSBlcXVhbCB0byBudWxsIik7CiAgICB9CgogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgYnVmZmVyLmxlbmd0aCk7CiAgICBpZiAoZW5kID09IHN0YXJ0KSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBfQnVmZmVyQW5kU3RhcnQgYnVmZmVyQW5kU3RhcnQgPQogICAgICAgIF9lbnN1cmVGYXN0QW5kU2VyaWFsaXphYmxlQnl0ZURhdGEoYnVmZmVyLCBzdGFydCwgZW5kKTsKICAgIHZhciByZXN1bHQgPSBuYXRpdmVXcml0ZShidWZmZXJBbmRTdGFydC5idWZmZXIsIGJ1ZmZlckFuZFN0YXJ0LnN0YXJ0LAogICAgICAgIGVuZCAtIChzdGFydCAtIGJ1ZmZlckFuZFN0YXJ0LnN0YXJ0KSk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IFNvY2tldEV4Y2VwdGlvbigid3JpdGVGcm9tU3luYyBmYWlsZWQiLCBvc0Vycm9yOiByZXN1bHQpOwogICAgfQogICAgYXNzZXJ0KHJlc291cmNlSW5mbyAhPSBudWxsKTsKICAgIGlmIChyZXNvdXJjZUluZm8gIT0gbnVsbCkgewogICAgICByZXNvdXJjZUluZm8uYWRkV3JpdGUocmVzdWx0KTsKICAgIH0KICB9CgogIHZvaWQgX2NoZWNrQXZhaWxhYmxlKCkgewogICAgaWYgKGlzQ2xvc2VkKSB7CiAgICAgIHRocm93IGNvbnN0IFNvY2tldEV4Y2VwdGlvbi5jbG9zZWQoKTsKICAgIH0KICB9CgogIC8vIE5hdGl2ZSBtZXRob2QgZGVjbGFyYXRpb25zLgogIHN0YXRpYyBfbmF0aXZlTG9va3VwUmVxdWVzdChob3N0LCBpbnQgdHlwZSkKICAgICAgbmF0aXZlICJTeW5jaHJvbm91c1NvY2tldF9Mb29rdXBSZXF1ZXN0IjsKICBuYXRpdmVDcmVhdGVDb25uZWN0U3luYyhob3N0LCBpbnQgcG9ydCkKICAgICAgbmF0aXZlICJTeW5jaHJvbm91c1NvY2tldF9DcmVhdGVDb25uZWN0U3luYyI7CiAgbmF0aXZlQXZhaWxhYmxlKCkgbmF0aXZlICJTeW5jaHJvbm91c1NvY2tldF9BdmFpbGFibGUiOwogIG5hdGl2ZUNsb3NlU3luYygpIG5hdGl2ZSAiU3luY2hyb25vdXNTb2NrZXRfQ2xvc2VTeW5jIjsKICBpbnQgbmF0aXZlR2V0UG9ydCgpIG5hdGl2ZSAiU3luY2hyb25vdXNTb2NrZXRfR2V0UG9ydCI7CiAgTGlzdCBuYXRpdmVHZXRSZW1vdGVQZWVyKCkgbmF0aXZlICJTeW5jaHJvbm91c1NvY2tldF9HZXRSZW1vdGVQZWVyIjsKICBuYXRpdmVSZWFkKGludCBsZW4pIG5hdGl2ZSAiU3luY2hyb25vdXNTb2NrZXRfUmVhZCI7CiAgbmF0aXZlUmVhZEludG8oTGlzdDxpbnQ+IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGJ5dGVzKQogICAgICBuYXRpdmUgIlN5bmNocm9ub3VzU29ja2V0X1JlYWRMaXN0IjsKICBuYXRpdmVTaHV0ZG93blJlYWQoKSBuYXRpdmUgIlN5bmNocm9ub3VzU29ja2V0X1NodXRkb3duUmVhZCI7CiAgbmF0aXZlU2h1dGRvd25Xcml0ZSgpIG5hdGl2ZSAiU3luY2hyb25vdXNTb2NrZXRfU2h1dGRvd25Xcml0ZSI7CiAgbmF0aXZlV3JpdGUoTGlzdDxpbnQ+IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGJ5dGVzKQogICAgICBuYXRpdmUgIlN5bmNocm9ub3VzU29ja2V0X1dyaXRlTGlzdCI7Cn0KgV8ATk48ASABBx0JPDoEAgE+KgEnATwbJjsEATIgPiwBKAErAUIwATwBSwFEMQIBTRlQAUxPGRkdHgEzIAEzFQEnAUAYQAYtFiQaDQwiFBMIRUEIBh8hLRxPHxUIIDMlSx8pHUsKHg81DhcWH0gMIAojCBUGARoEAS8qAREaGAYULAYiHRQGHwQBJhQsBigdFAYaOQQBFxQsBigdFAYWBAEVFRk2FwYEAUQULC0cKjkNSQYEATQ9PB8WBic1MCBHBhYEATsXGEEGAR0wLEQGGTcGQRgQBj8dSQYiEwQBIBcYQQYBJjYGFBMGIh0UBiIaIjEIBiAeBhMEAUM7BAEtFA4GGSQYDyEZDyEVDw8sBgQBGCQOBhkTDRwGGQQBGSUOBhgTDR0GGgQBPRcZQQYdMCxFBhlABgFBGA4GASVASi8dSgYiICUGBAEbFCwGBAEhLjAqNDo6Okc3OitAQjcsAgEkZGFydDppby1wYXRjaC9zeW5jX3NvY2tldF9wYXRjaC5kYXJ0MW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9ieXRlc19idWlsZGVyLmRhcnSVai8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuaW87CgovKioKICogQnVpbGRzIGEgbGlzdCBvZiBieXRlcywgYWxsb3dpbmcgYnl0ZXMgYW5kIGxpc3RzIG9mIGJ5dGVzIHRvIGJlIGFkZGVkIGF0IHRoZQogKiBlbmQuCiAqCiAqIFVzZWQgdG8gZWZmaWNpZW50bHkgY29sbGVjdCBieXRlcyBhbmQgbGlzdHMgb2YgYnl0ZXMuCiAqLwphYnN0cmFjdCBjbGFzcyBCeXRlc0J1aWxkZXIgewogIC8qKgogICAqIENvbnN0cnVjdCBhIG5ldyBlbXB0eSBbQnl0ZXNCdWlsZGVyXS4KICAgKgogICAqIElmIFtjb3B5XSBpcyB0cnVlLCB0aGUgZGF0YSBpcyBhbHdheXMgY29waWVkIHdoZW4gYWRkZWQgdG8gdGhlIGxpc3QuIElmCiAgICogaXQgW2NvcHldIGlzIGZhbHNlLCB0aGUgZGF0YSBpcyBvbmx5IGNvcGllZCBpZiBuZWVkZWQuIFRoYXQgbWVhbnMgdGhhdCBpZgogICAqIHRoZSBsaXN0cyBhcmUgY2hhbmdlZCBhZnRlciBhZGRlZCB0byB0aGUgW0J5dGVzQnVpbGRlcl0sIGl0IG1heSBlZmZlY3QgdGhlCiAgICogb3V0cHV0LiBEZWZhdWx0IGlzIGB0cnVlYC4KICAgKi8KICBmYWN0b3J5IEJ5dGVzQnVpbGRlcih7Ym9vbCBjb3B5OiB0cnVlfSkgewogICAgaWYgKGNvcHkpIHsKICAgICAgcmV0dXJuIG5ldyBfQ29weWluZ0J5dGVzQnVpbGRlcigpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBfQnl0ZXNCdWlsZGVyKCk7CiAgICB9CiAgfQoKICAvKioKICAgKiBBcHBlbmRzIFtieXRlc10gdG8gdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGJ1aWxkZXIuCiAgICoKICAgKiBFYWNoIHZhbHVlIG9mIFtieXRlc10gd2lsbCBiZSBiaXQtcmVwcmVzZW50YXRpb24gdHJ1bmNhdGVkIHRvIHRoZSByYW5nZQogICAqIDAgLi4gMjU1LgogICAqLwogIHZvaWQgYWRkKExpc3Q8aW50PiBieXRlcyk7CgogIC8qKgogICAqIEFwcGVuZCBbYnl0ZV0gdG8gdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGJ1aWxkZXIuCiAgICoKICAgKiBUaGUgW2J5dGVdIHdpbGwgYmUgYml0LXJlcHJlc2VudGF0aW9uIHRydW5jYXRlZCB0byB0aGUgcmFuZ2UgMCAuLiAyNTUuCiAgICovCiAgdm9pZCBhZGRCeXRlKGludCBieXRlKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgYHRoaXNgIGFuZCBjbGVhcnMgYHRoaXNgLgogICAqCiAgICogVGhlIGxpc3QgcmV0dXJuZWQgaXMgYSB2aWV3IG9mIHRoZSBpbnRlcm5hbCBidWZmZXIsIGxpbWl0ZWQgdG8gdGhlCiAgICogW2xlbmd0aF0uCiAgICovCiAgTGlzdDxpbnQ+IHRha2VCeXRlcygpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgYnVpbGRlci4KICAgKgogICAqIExlYXZlcyB0aGUgY29udGVudHMgb2YgdGhlIGJ1aWxkZXIgaW50YWN0LgogICAqLwogIExpc3Q8aW50PiB0b0J5dGVzKCk7CgogIC8qKgogICAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1aWxkZXIuCiAgICovCiAgaW50IGdldCBsZW5ndGg7CgogIC8qKgogICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBidWZmZXIgaXMgZW1wdHkuCiAgICovCiAgYm9vbCBnZXQgaXNFbXB0eTsKCiAgLyoqCiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGJ1ZmZlciBpcyBub3QgZW1wdHkuCiAgICovCiAgYm9vbCBnZXQgaXNOb3RFbXB0eTsKCiAgLyoqCiAgICogQ2xlYXIgdGhlIGNvbnRlbnRzIG9mIHRoZSBidWlsZGVyLgogICAqLwogIHZvaWQgY2xlYXIoKTsKfQoKY2xhc3MgX0NvcHlpbmdCeXRlc0J1aWxkZXIgaW1wbGVtZW50cyBCeXRlc0J1aWxkZXIgewogIC8vIFN0YXJ0IHdpdGggMTAyNCBieXRlcy4KICBzdGF0aWMgY29uc3QgaW50IF9pbml0U2l6ZSA9IDEwMjQ7CgogIHN0YXRpYyBmaW5hbCBfZW1wdHlMaXN0ID0gbmV3IFVpbnQ4TGlzdCgwKTsKCiAgaW50IF9sZW5ndGggPSAwOwogIFVpbnQ4TGlzdCBfYnVmZmVyOwoKICBfQ29weWluZ0J5dGVzQnVpbGRlcihbaW50IGluaXRpYWxDYXBhY2l0eSA9IDBdKQogICAgICA6IF9idWZmZXIgPSAoaW5pdGlhbENhcGFjaXR5IDw9IDApCiAgICAgICAgICAgID8gX2VtcHR5TGlzdAogICAgICAgICAgICA6IG5ldyBVaW50OExpc3QoX3BvdzJyb3VuZHVwKGluaXRpYWxDYXBhY2l0eSkpOwoKICB2b2lkIGFkZChMaXN0PGludD4gYnl0ZXMpIHsKICAgIGludCBieXRlc0xlbmd0aCA9IGJ5dGVzLmxlbmd0aDsKICAgIGlmIChieXRlc0xlbmd0aCA9PSAwKSByZXR1cm47CiAgICBpbnQgcmVxdWlyZWQgPSBfbGVuZ3RoICsgYnl0ZXNMZW5ndGg7CiAgICBpZiAoX2J1ZmZlci5sZW5ndGggPCByZXF1aXJlZCkgewogICAgICBfZ3JvdyhyZXF1aXJlZCk7CiAgICB9CiAgICBhc3NlcnQoX2J1ZmZlci5sZW5ndGggPj0gcmVxdWlyZWQpOwogICAgaWYgKGJ5dGVzIGlzIFVpbnQ4TGlzdCkgewogICAgICBfYnVmZmVyLnNldFJhbmdlKF9sZW5ndGgsIHJlcXVpcmVkLCBieXRlcyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzTGVuZ3RoOyBpKyspIHsKICAgICAgICBfYnVmZmVyW19sZW5ndGggKyBpXSA9IGJ5dGVzW2ldOwogICAgICB9CiAgICB9CiAgICBfbGVuZ3RoID0gcmVxdWlyZWQ7CiAgfQoKICB2b2lkIGFkZEJ5dGUoaW50IGJ5dGUpIHsKICAgIGlmIChfYnVmZmVyLmxlbmd0aCA9PSBfbGVuZ3RoKSB7CiAgICAgIC8vIFRoZSBncm93IGFsZ29yaXRobSBhbHdheXMgYXQgbGVhc3QgZG91Ymxlcy4KICAgICAgLy8gSWYgd2UgYWRkZWQgb25lIHRvIF9sZW5ndGggaXQgd291bGQgcXVhZHJ1cGxlIHVubmVjZXNzYXJpbHkuCiAgICAgIF9ncm93KF9sZW5ndGgpOwogICAgfQogICAgYXNzZXJ0KF9idWZmZXIubGVuZ3RoID4gX2xlbmd0aCk7CiAgICBfYnVmZmVyW19sZW5ndGhdID0gYnl0ZTsKICAgIF9sZW5ndGgrKzsKICB9CgogIHZvaWQgX2dyb3coaW50IHJlcXVpcmVkKSB7CiAgICAvLyBXZSB3aWxsIGNyZWF0ZSBhIGxpc3QgaW4gdGhlIHJhbmdlIG9mIDItNCB0aW1lcyBsYXJnZXIgdGhhbgogICAgLy8gcmVxdWlyZWQuCiAgICBpbnQgbmV3U2l6ZSA9IHJlcXVpcmVkICogMjsKICAgIGlmIChuZXdTaXplIDwgX2luaXRTaXplKSB7CiAgICAgIG5ld1NpemUgPSBfaW5pdFNpemU7CiAgICB9IGVsc2UgewogICAgICBuZXdTaXplID0gX3BvdzJyb3VuZHVwKG5ld1NpemUpOwogICAgfQogICAgdmFyIG5ld0J1ZmZlciA9IG5ldyBVaW50OExpc3QobmV3U2l6ZSk7CiAgICBuZXdCdWZmZXIuc2V0UmFuZ2UoMCwgX2J1ZmZlci5sZW5ndGgsIF9idWZmZXIpOwogICAgX2J1ZmZlciA9IG5ld0J1ZmZlcjsKICB9CgogIExpc3Q8aW50PiB0YWtlQnl0ZXMoKSB7CiAgICBpZiAoX2xlbmd0aCA9PSAwKSByZXR1cm4gX2VtcHR5TGlzdDsKICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0LnZpZXcoX2J1ZmZlci5idWZmZXIsIDAsIF9sZW5ndGgpOwogICAgY2xlYXIoKTsKICAgIHJldHVybiBidWZmZXI7CiAgfQoKICBMaXN0PGludD4gdG9CeXRlcygpIHsKICAgIGlmIChfbGVuZ3RoID09IDApIHJldHVybiBfZW1wdHlMaXN0OwogICAgcmV0dXJuIG5ldyBVaW50OExpc3QuZnJvbUxpc3QoCiAgICAgICAgbmV3IFVpbnQ4TGlzdC52aWV3KF9idWZmZXIuYnVmZmVyLCAwLCBfbGVuZ3RoKSk7CiAgfQoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfbGVuZ3RoOwoKICBib29sIGdldCBpc0VtcHR5ID0+IF9sZW5ndGggPT0gMDsKCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBfbGVuZ3RoICE9IDA7CgogIHZvaWQgY2xlYXIoKSB7CiAgICBfbGVuZ3RoID0gMDsKICAgIF9idWZmZXIgPSBfZW1wdHlMaXN0OwogIH0KCiAgc3RhdGljIGludCBfcG93MnJvdW5kdXAoaW50IHgpIHsKICAgIGFzc2VydCh4ID4gMCk7CiAgICAtLXg7CiAgICB4IHw9IHggPj4gMTsKICAgIHggfD0geCA+PiAyOwogICAgeCB8PSB4ID4+IDQ7CiAgICB4IHw9IHggPj4gODsKICAgIHggfD0geCA+PiAxNjsKICAgIHJldHVybiB4ICsgMTsKICB9Cn0KCmNsYXNzIF9CeXRlc0J1aWxkZXIgaW1wbGVtZW50cyBCeXRlc0J1aWxkZXIgewogIGludCBfbGVuZ3RoID0gMDsKICBmaW5hbCBMaXN0PFVpbnQ4TGlzdD4gX2NodW5rcyA9IFtdOwoKICB2b2lkIGFkZChMaXN0PGludD4gYnl0ZXMpIHsKICAgIFVpbnQ4TGlzdCB0eXBlZEJ5dGVzOwogICAgaWYgKGJ5dGVzIGlzIFVpbnQ4TGlzdCkgewogICAgICB0eXBlZEJ5dGVzID0gYnl0ZXM7CiAgICB9IGVsc2UgewogICAgICB0eXBlZEJ5dGVzID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChieXRlcyk7CiAgICB9CiAgICBfY2h1bmtzLmFkZCh0eXBlZEJ5dGVzKTsKICAgIF9sZW5ndGggKz0gdHlwZWRCeXRlcy5sZW5ndGg7CiAgfQoKICB2b2lkIGFkZEJ5dGUoaW50IGJ5dGUpIHsKICAgIF9jaHVua3MuYWRkKG5ldyBVaW50OExpc3QoMSkuLlswXSA9IGJ5dGUpOwogICAgX2xlbmd0aCsrOwogIH0KCiAgTGlzdDxpbnQ+IHRha2VCeXRlcygpIHsKICAgIGlmIChfbGVuZ3RoID09IDApIHJldHVybiBfQ29weWluZ0J5dGVzQnVpbGRlci5fZW1wdHlMaXN0OwogICAgaWYgKF9jaHVua3MubGVuZ3RoID09IDEpIHsKICAgICAgdmFyIGJ1ZmZlciA9IF9jaHVua3NbMF07CiAgICAgIGNsZWFyKCk7CiAgICAgIHJldHVybiBidWZmZXI7CiAgICB9CiAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4TGlzdChfbGVuZ3RoKTsKICAgIGludCBvZmZzZXQgPSAwOwogICAgZm9yICh2YXIgY2h1bmsgaW4gX2NodW5rcykgewogICAgICBidWZmZXIuc2V0UmFuZ2Uob2Zmc2V0LCBvZmZzZXQgKyBjaHVuay5sZW5ndGgsIGNodW5rKTsKICAgICAgb2Zmc2V0ICs9IGNodW5rLmxlbmd0aDsKICAgIH0KICAgIGNsZWFyKCk7CiAgICByZXR1cm4gYnVmZmVyOwogIH0KCiAgTGlzdDxpbnQ+IHRvQnl0ZXMoKSB7CiAgICBpZiAoX2xlbmd0aCA9PSAwKSByZXR1cm4gX0NvcHlpbmdCeXRlc0J1aWxkZXIuX2VtcHR5TGlzdDsKICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KF9sZW5ndGgpOwogICAgaW50IG9mZnNldCA9IDA7CiAgICBmb3IgKHZhciBjaHVuayBpbiBfY2h1bmtzKSB7CiAgICAgIGJ1ZmZlci5zZXRSYW5nZShvZmZzZXQsIG9mZnNldCArIGNodW5rLmxlbmd0aCwgY2h1bmspOwogICAgICBvZmZzZXQgKz0gY2h1bmsubGVuZ3RoOwogICAgfQogICAgcmV0dXJuIGJ1ZmZlcjsKICB9CgogIGludCBnZXQgbGVuZ3RoID0+IF9sZW5ndGg7CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2xlbmd0aCA9PSAwOwoKICBib29sIGdldCBpc05vdEVtcHR5ID0+IF9sZW5ndGggIT0gMDsKCiAgdm9pZCBjbGVhcigpIHsKICAgIF9sZW5ndGggPSAwOwogICAgX2NodW5rcy5jbGVhcigpOwogIH0KfQqA6gBOTjwBEQEEUAgDOQQeBisFTU9QIAYsECkNIgYEAQY9BU0PBh0BBjsFTAYaAQY3BUgPBhkBBjwFMAYXAQYpBhIBBiwGFAEGMAYXAQYoBhACATUcJQEuARMVATIpGTwBHiQiKiUXBigeMg0uKQgGGAQBGyU1RhYGJh0PBAEdQxEgHxsNJwYsNBkEARopQQ0TBAEYKSM5BAEdASQBJwERERoEASMTCRERERESEgQCAS4TJgEeGh4aDTIGHSIEARsvDwQBGj4fHw8VBikUIT0eBg0TBAEYPikUIT0eBhMEAR0BJAEnARERFQQCARpkYXJ0OmlvL2J5dGVzX2J1aWxkZXIuZGFydCpvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vY29tbW9uLmRhcnSOyi8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuaW87CgovLyBDb25zdGFudHMgdXNlZCB3aGVuIHdvcmtpbmcgd2l0aCBuYXRpdmUgcG9ydHMuCi8vIFRoZXNlIG11c3QgbWF0Y2ggdGhlIGNvbnN0YW50cyBpbiBydW50aW1lL2Jpbi9kYXJ0dXRpbHMuaCBjbGFzcyBDT2JqZWN0Lgpjb25zdCBpbnQgX3N1Y2Nlc3NSZXNwb25zZSA9IDA7CmNvbnN0IGludCBfaWxsZWdhbEFyZ3VtZW50UmVzcG9uc2UgPSAxOwpjb25zdCBpbnQgX29zRXJyb3JSZXNwb25zZSA9IDI7CmNvbnN0IGludCBfZmlsZUNsb3NlZFJlc3BvbnNlID0gMzsKCmNvbnN0IGludCBfZXJyb3JSZXNwb25zZUVycm9yVHlwZSA9IDA7CmNvbnN0IGludCBfb3NFcnJvclJlc3BvbnNlRXJyb3JDb2RlID0gMTsKY29uc3QgaW50IF9vc0Vycm9yUmVzcG9uc2VNZXNzYWdlID0gMjsKCi8vIEZ1bmN0aW9ucyB1c2VkIHRvIHJlY2VpdmUgZXhjZXB0aW9ucyBmcm9tIG5hdGl2ZSBwb3J0cy4KYm9vbCBfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSA9PgogICAgcmVzcG9uc2UgaXMgTGlzdCAmJiByZXNwb25zZVswXSAhPSBfc3VjY2Vzc1Jlc3BvbnNlOwoKLyoqCiAqIFJldHVybnMgYW4gRXhjZXB0aW9uIG9yIGFuIEVycm9yCiAqLwpfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKHJlc3BvbnNlLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHBhdGgpIHsKICBhc3NlcnQoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpOwogIHN3aXRjaCAocmVzcG9uc2VbX2Vycm9yUmVzcG9uc2VFcnJvclR5cGVdKSB7CiAgICBjYXNlIF9pbGxlZ2FsQXJndW1lbnRSZXNwb25zZToKICAgICAgcmV0dXJuIG5ldyBBcmd1bWVudEVycm9yKCIkbWVzc2FnZTogJHBhdGgiKTsKICAgIGNhc2UgX29zRXJyb3JSZXNwb25zZToKICAgICAgdmFyIGVyciA9IG5ldyBPU0Vycm9yKHJlc3BvbnNlW19vc0Vycm9yUmVzcG9uc2VNZXNzYWdlXSwKICAgICAgICAgIHJlc3BvbnNlW19vc0Vycm9yUmVzcG9uc2VFcnJvckNvZGVdKTsKICAgICAgcmV0dXJuIG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKG1lc3NhZ2UsIHBhdGgsIGVycik7CiAgICBjYXNlIF9maWxlQ2xvc2VkUmVzcG9uc2U6CiAgICAgIHJldHVybiBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigiRmlsZSBjbG9zZWQiLCBwYXRoKTsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBuZXcgRXhjZXB0aW9uKCJVbmtub3duIGVycm9yIik7CiAgfQp9CgovKioKICogQmFzZSBjbGFzcyBmb3IgYWxsIElPIHJlbGF0ZWQgZXhjZXB0aW9ucy4KICovCmFic3RyYWN0IGNsYXNzIElPRXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uIHsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiSU9FeGNlcHRpb24iOwp9CgovKioKICAqIEFuIFtPU0Vycm9yXSBvYmplY3QgaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgYW4gZXJyb3IgZnJvbSB0aGUKICAqIG9wZXJhdGluZyBzeXN0ZW0uCiAgKi8KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBPU0Vycm9yIHsKICAvKiogQ29uc3RhbnQgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIE9TIGVycm9yIGNvZGUgaXMgYXZhaWxhYmxlLiAqLwogIHN0YXRpYyBjb25zdCBpbnQgbm9FcnJvckNvZGUgPSAtMTsKCiAgLy8vIEVycm9yIG1lc3NhZ2Ugc3VwcGxpZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uIFRoaXMgbWF5IGJlIGBudWxsYCBvcgogIC8vLyBlbXB0eSBpZiBubyBtZXNzYWdlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IuCiAgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CgogIC8vLyBFcnJvciBjb2RlIHN1cHBsaWVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtLgogIC8vLwogIC8vLyBXaWxsIGhhdmUgdGhlIHZhbHVlIFtPU0Vycm9yLm5vRXJyb3JDb2RlXSBpZiB0aGVyZSBpcyBubyBlcnJvciBjb2RlCiAgLy8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IuCiAgZmluYWwgaW50IGVycm9yQ29kZTsKCiAgLyoqIENyZWF0ZXMgYW4gT1NFcnJvciBvYmplY3QgZnJvbSBhIG1lc3NhZ2UgYW5kIGFuIGVycm9yQ29kZS4gKi8KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgY29uc3QgT1NFcnJvcihbdGhpcy5tZXNzYWdlID0gIiIsIHRoaXMuZXJyb3JDb2RlID0gbm9FcnJvckNvZGVdKTsKCiAgLyoqIENvbnZlcnRzIGFuIE9TRXJyb3Igb2JqZWN0IHRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uLiAqLwogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCJPUyBFcnJvciIpOwogICAgaWYgKG1lc3NhZ2UuaXNOb3RFbXB0eSkgewogICAgICBzYi4ud3JpdGUoIjogIikuLndyaXRlKG1lc3NhZ2UpOwogICAgICBpZiAoZXJyb3JDb2RlICE9IG5vRXJyb3JDb2RlKSB7CiAgICAgICAgc2IuLndyaXRlKCIsIGVycm5vID0gIikuLndyaXRlKGVycm9yQ29kZS50b1N0cmluZygpKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChlcnJvckNvZGUgIT0gbm9FcnJvckNvZGUpIHsKICAgICAgc2IuLndyaXRlKCI6IGVycm5vID0gIikuLndyaXRlKGVycm9yQ29kZS50b1N0cmluZygpKTsKICAgIH0KICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQoKLy8gT2JqZWN0IGZvciBob2xkaW5nIGEgYnVmZmVyIGFuZCBhbiBvZmZzZXQuCmNsYXNzIF9CdWZmZXJBbmRTdGFydCB7CiAgTGlzdDxpbnQ+IGJ1ZmZlcjsKICBpbnQgc3RhcnQ7CiAgX0J1ZmZlckFuZFN0YXJ0KHRoaXMuYnVmZmVyLCB0aGlzLnN0YXJ0KTsKfQoKLy8gRW5zdXJlIHRoYXQgdGhlIGlucHV0IExpc3QgY2FuIGJlIHNlcmlhbGl6ZWQgdGhyb3VnaCBhIG5hdGl2ZSBwb3J0LgovLyBPbmx5IEludDhMaXN0IGFuZCBVaW50OExpc3QgTGlzdHMgYXJlIHNlcmlhbGl6ZWQgZGlyZWN0bHkuCi8vIEFsbCBvdGhlciBsaXN0cyBhcmUgZmlyc3QgY29waWVkIGludG8gYSBVaW50OExpc3QuIFRoaXMgaGFzIHRoZSBhZGRlZAovLyBiZW5lZml0IHRoYXQgaXQgaXMgZmFzdGVyIHRvIGFjY2VzcyBmcm9tIHRoZSBDIGNvZGUgYXMgd2VsbC4KX0J1ZmZlckFuZFN0YXJ0IF9lbnN1cmVGYXN0QW5kU2VyaWFsaXphYmxlQnl0ZURhdGEoCiAgICBMaXN0PGludD4gYnVmZmVyLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICBpZiAoYnVmZmVyIGlzIFVpbnQ4TGlzdCB8fCBidWZmZXIgaXMgSW50OExpc3QpIHsKICAgIHJldHVybiBuZXcgX0J1ZmZlckFuZFN0YXJ0KGJ1ZmZlciwgc3RhcnQpOwogIH0KICBpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgdmFyIG5ld0J1ZmZlciA9IG5ldyBVaW50OExpc3QobGVuZ3RoKTsKICBpbnQgaiA9IHN0YXJ0OwogIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgIGludCB2YWx1ZSA9IGJ1ZmZlcltqXTsKICAgIGlmICh2YWx1ZSA9PSBudWxsKSB0aHJvdyBBcmd1bWVudEVycm9yKCJMaXN0IGVsZW1lbnQgaXMgbnVsbCBhdCBpbmRleCAkaiIpOwogICAgbmV3QnVmZmVyW2ldID0gdmFsdWU7CiAgICBqKys7CiAgfQogIHJldHVybiBuZXcgX0J1ZmZlckFuZFN0YXJ0KG5ld0J1ZmZlciwgMCk7Cn0KCmNsYXNzIF9JT0NyeXB0byB7CiAgZXh0ZXJuYWwgc3RhdGljIFVpbnQ4TGlzdCBnZXRSYW5kb21CeXRlcyhpbnQgY291bnQpOwp9CncATk48AREBMkwgKCAjAScpJwE7IzkBBCQEQCYvIzMbPzA6HjsNLQQCAQQtBDImAgEEQhYFGhBHJQFMOBgBMwZKIRcBRBxEAUAWKhoeJyY+CCs8BhoEAgEuGBQNLAIBRz5JQDQsMy8EHCkRJRtQGgkELAIBEjcCARNkYXJ0OmlvL2NvbW1vbi5kYXJ0MW9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9iaW4vY29tbW9uX3BhdGNoLmRhcnSHMC8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gTm90ZTogdGhlIFZNIGNvbmNhdGVuYXRlcyBhbGwgcGF0Y2ggZmlsZXMgaW50byBhIHNpbmdsZSBwYXRjaCBmaWxlLiBUaGlzCi8vLyBmaWxlIGlzIHRoZSBmaXJzdCBwYXRjaCBpbiAiZGFydDppbyIgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBpbXBvcnRzIHVzZWQgYnkKLy8vIHBhdGNoZXMgb2YgdGhhdCBsaWJyYXJ5LiBXZSBwbGFuIHRvIGNoYW5nZSB0aGlzIHdoZW4gd2UgaGF2ZSBhIHNoYXJlZCBmcm9udAovLy8gZW5kIGFuZCBzaW1wbHkgdXNlIHBhcnRzLgoKaW1wb3J0ICJkYXJ0Ol9pbnRlcm5hbCIgc2hvdyBWTUxpYnJhcnlIb29rcywgcGF0Y2g7CgppbXBvcnQgImRhcnQ6YXN5bmMiCiAgICBzaG93CiAgICAgICAgQ29tcGxldGVyLAogICAgICAgIEZ1dHVyZSwKICAgICAgICBTdHJlYW0sCiAgICAgICAgU3RyZWFtQ29uc3VtZXIsCiAgICAgICAgU3RyZWFtQ29udHJvbGxlciwKICAgICAgICBTdHJlYW1TdWJzY3JpcHRpb24sCiAgICAgICAgVGltZXIsCiAgICAgICAgWm9uZSwKICAgICAgICBzY2hlZHVsZU1pY3JvdGFzazsKCmltcG9ydCAiZGFydDpjb2xsZWN0aW9uIiBzaG93IEhhc2hNYXA7CgppbXBvcnQgImRhcnQ6Y29udmVydCIgc2hvdyBFbmNvZGluZywgdXRmODsKCmltcG9ydCAiZGFydDpkZXZlbG9wZXIiIHNob3cgcmVnaXN0ZXJFeHRlbnNpb247CgppbXBvcnQgImRhcnQ6aXNvbGF0ZSIgc2hvdyBSYXdSZWNlaXZlUG9ydCwgUmVjZWl2ZVBvcnQsIFNlbmRQb3J0OwoKaW1wb3J0ICJkYXJ0Om1hdGgiIHNob3cgbWluOwoKaW1wb3J0ICJkYXJ0Om5hdGl2ZXdyYXBwZXJzIiBzaG93IE5hdGl2ZUZpZWxkV3JhcHBlckNsYXNzMTsKCmltcG9ydCAiZGFydDp0eXBlZF9kYXRhIiBzaG93IFVpbnQ4TGlzdDsKCi8vLyBUaGVzZSBhcmUgdGhlIGFkZGl0aW9uYWwgcGFydHMgb2YgdGhpcyBwYXRjaCBsaWJyYXJ5OgovLyBwYXJ0ICJkaXJlY3RvcnlfcGF0Y2guZGFydCI7Ci8vIHBhcnQgImV2ZW50aGFuZGxlcl9wYXRjaC5kYXJ0IjsKLy8gcGFydCAiZmlsZV9wYXRjaC5kYXJ0IjsKLy8gcGFydCAiZmlsZV9zeXN0ZW1fZW50aXR5X3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJmaWx0ZXJfcGF0Y2guZGFydCI7Ci8vIHBhcnQgImlvX3NlcnZpY2VfcGF0Y2guZGFydCI7Ci8vIHBhcnQgInBsYXRmb3JtX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJwcm9jZXNzX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJzb2NrZXRfcGF0Y2guZGFydCI7Ci8vIHBhcnQgInN0ZGlvX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJzZWN1cmVfc29ja2V0X3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJzeW5jX3NvY2tldF9wYXRjaC5kYXJ0IjsKCkBwYXRjaApjbGFzcyBfSU9DcnlwdG8gewogIEBwYXRjaAogIHN0YXRpYyBVaW50OExpc3QgZ2V0UmFuZG9tQnl0ZXMoaW50IGNvdW50KSBuYXRpdmUgIkNyeXB0b19HZXRSYW5kb21CeXRlcyI7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQpfc2V0dXBIb29rcygpIHsKICBWTUxpYnJhcnlIb29rcy5ldmVudEhhbmRsZXJTZW5kRGF0YSA9IF9FdmVudEhhbmRsZXIuX3NlbmREYXRhOwogIFZNTGlicmFyeUhvb2tzLnRpbWVyTWlsbGlzZWNvbmRDbG9jayA9IF9FdmVudEhhbmRsZXIuX3RpbWVyTWlsbGlzZWNvbmRDbG9jazsKfQpAAE5OPAFNUFAeATQBFAkTEBAYGhwPDhsBJwErATABQgEdATwBKQE6ICMbKR0hHx4dHCQiAQcSCU0CASIQQU8CAR9kYXJ0OmlvLXBhdGNoL2NvbW1vbl9wYXRjaC5kYXJ0NG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9kYXRhX3RyYW5zZm9ybWVyLmRhcnTAAFWNLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCi8qKgogKiBFeHBvc2VzIFpMaWIgb3B0aW9ucyBmb3IgaW5wdXQgcGFyYW1ldGVycy4KICoKICogU2VlIGh0dHA6Ly93d3cuemxpYi5uZXQvbWFudWFsLmh0bWwgZm9yIG1vcmUgZG9jdW1lbnRhdGlvbi4KICovCmFic3RyYWN0IGNsYXNzIFpMaWJPcHRpb24gewogIC8vLyBNaW5pbWFsIHZhbHVlIGZvciBbWkxpYkNvZGVjLndpbmRvd0JpdHNdLCBbWkxpYkVuY29kZXIud2luZG93Qml0c10KICAvLy8gYW5kIFtaTGliRGVjb2Rlci53aW5kb3dCaXRzXS4KICBzdGF0aWMgY29uc3QgaW50IG1pbldpbmRvd0JpdHMgPSA4OwogIEBEZXByZWNhdGVkKCJVc2UgbWluV2luZG93Qml0cyBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE1JTl9XSU5ET1dfQklUUyA9IDg7CgogIC8vLyBNYXhpbWFsIHZhbHVlIGZvciBbWkxpYkNvZGVjLndpbmRvd0JpdHNdLCBbWkxpYkVuY29kZXIud2luZG93Qml0c10KICAvLy8gYW5kIFtaTGliRGVjb2Rlci53aW5kb3dCaXRzXS4KICBzdGF0aWMgY29uc3QgaW50IG1heFdpbmRvd0JpdHMgPSAxNTsKICBARGVwcmVjYXRlZCgiVXNlIG1heFdpbmRvd0JpdHMgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBNQVhfV0lORE9XX0JJVFMgPSAxNTsKCiAgLy8vIERlZmF1bHQgdmFsdWUgZm9yIFtaTGliQ29kZWMud2luZG93Qml0c10sIFtaTGliRW5jb2Rlci53aW5kb3dCaXRzXQogIC8vLyBhbmQgW1pMaWJEZWNvZGVyLndpbmRvd0JpdHNdLgogIHN0YXRpYyBjb25zdCBpbnQgZGVmYXVsdFdpbmRvd0JpdHMgPSAxNTsKICBARGVwcmVjYXRlZCgiVXNlIGRlZmF1bHRXaW5kb3dCaXRzIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9XSU5ET1dfQklUUyA9IDE1OwoKICAvLy8gTWluaW1hbCB2YWx1ZSBmb3IgW1pMaWJDb2RlYy5sZXZlbF0gYW5kIFtaTGliRW5jb2Rlci5sZXZlbF0uCiAgc3RhdGljIGNvbnN0IGludCBtaW5MZXZlbCA9IC0xOwogIEBEZXByZWNhdGVkKCJVc2UgbWluTGV2ZWwgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBNSU5fTEVWRUwgPSAtMTsKCiAgLy8vIE1heGltYWwgdmFsdWUgZm9yIFtaTGliQ29kZWMubGV2ZWxdIGFuZCBbWkxpYkVuY29kZXIubGV2ZWxdCiAgc3RhdGljIGNvbnN0IGludCBtYXhMZXZlbCA9IDk7CiAgQERlcHJlY2F0ZWQoIlVzZSBtYXhMZXZlbCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE1BWF9MRVZFTCA9IDk7CgogIC8vLyBEZWZhdWx0IHZhbHVlIGZvciBbWkxpYkNvZGVjLmxldmVsXSBhbmQgW1pMaWJFbmNvZGVyLmxldmVsXS4KICBzdGF0aWMgY29uc3QgaW50IGRlZmF1bHRMZXZlbCA9IDY7CiAgQERlcHJlY2F0ZWQoIlVzZSBkZWZhdWx0TGV2ZWwgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0xFVkVMID0gNjsKCiAgLy8vIE1pbmltYWwgdmFsdWUgZm9yIFtaTGliQ29kZWMubWVtTGV2ZWxdIGFuZCBbWkxpYkVuY29kZXIubWVtTGV2ZWxdLgogIHN0YXRpYyBjb25zdCBpbnQgbWluTWVtTGV2ZWwgPSAxOwogIEBEZXByZWNhdGVkKCJVc2UgbWluTWVtTGV2ZWwgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBNSU5fTUVNX0xFVkVMID0gMTsKCiAgLy8vIE1heGltYWwgdmFsdWUgZm9yIFtaTGliQ29kZWMubWVtTGV2ZWxdIGFuZCBbWkxpYkVuY29kZXIubWVtTGV2ZWxdLgogIHN0YXRpYyBjb25zdCBpbnQgbWF4TWVtTGV2ZWwgPSA5OwogIEBEZXByZWNhdGVkKCJVc2UgbWF4TWVtTGV2ZWwgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBNQVhfTUVNX0xFVkVMID0gOTsKCiAgLy8vIERlZmF1bHQgdmFsdWUgZm9yIFtaTGliQ29kZWMubWVtTGV2ZWxdIGFuZCBbWkxpYkVuY29kZXIubWVtTGV2ZWxdLgogIHN0YXRpYyBjb25zdCBpbnQgZGVmYXVsdE1lbUxldmVsID0gODsKICBARGVwcmVjYXRlZCgiVXNlIGRlZmF1bHRNZW1MZXZlbCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfTUVNX0xFVkVMID0gODsKCiAgLy8vIFJlY29tbWVuZGVkIHN0cmF0ZWd5IGZvciBkYXRhIHByb2R1Y2VkIGJ5IGEgZmlsdGVyIChvciBwcmVkaWN0b3IpCiAgc3RhdGljIGNvbnN0IGludCBzdHJhdGVneUZpbHRlcmVkID0gMTsKICBARGVwcmVjYXRlZCgiVXNlIHN0cmF0ZWd5RmlsdGVyZWQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBTVFJBVEVHWV9GSUxURVJFRCA9IDE7CgogIC8vLyBVc2UgdGhpcyBzdHJhdGVneSB0byBmb3JjZSBIdWZmbWFuIGVuY29kaW5nIG9ubHkgKG5vIHN0cmluZyBtYXRjaCkKICBzdGF0aWMgY29uc3QgaW50IHN0cmF0ZWd5SHVmZm1hbk9ubHkgPSAyOwogIEBEZXByZWNhdGVkKCJVc2Ugc3RyYXRlZ3lIdWZmbWFuT25seSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IFNUUkFURUdZX0hVRkZNQU5fT05MWSA9IDI7CgogIC8vLyBVc2UgdGhpcyBzdHJhdGVneSB0byBsaW1pdCBtYXRjaCBkaXN0YW5jZXMgdG8gb25lIChydW4tbGVuZ3RoIGVuY29kaW5nKQogIHN0YXRpYyBjb25zdCBpbnQgc3RyYXRlZ3lSbGUgPSAzOwogIEBEZXByZWNhdGVkKCJVc2Ugc3RyYXRlZ3lSbGUgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBTVFJBVEVHWV9STEUgPSAzOwoKICAvLy8gVGhpcyBzdHJhdGVneSBwcmV2ZW50cyB0aGUgdXNlIG9mIGR5bmFtaWMgSHVmZm1hbiBjb2RlcywgYWxsb3dpbmcgZm9yIGEKICAvLy8gc2ltcGxlciBkZWNvZGVyCiAgc3RhdGljIGNvbnN0IGludCBzdHJhdGVneUZpeGVkID0gNDsKICBARGVwcmVjYXRlZCgiVXNlIHN0cmF0ZWd5Rml4ZWQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBTVFJBVEVHWV9GSVhFRCA9IDQ7CgogIC8vLyBSZWNvbW1lbmRlZCBzdHJhdGVneSBmb3Igbm9ybWFsIGRhdGEKICBzdGF0aWMgY29uc3QgaW50IHN0cmF0ZWd5RGVmYXVsdCA9IDA7CiAgQERlcHJlY2F0ZWQoIlVzZSBzdHJhdGVneURlZmF1bHQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBTVFJBVEVHWV9ERUZBVUxUID0gMDsKfQoKLyoqCiAqIEFuIGluc3RhbmNlIG9mIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBbWkxpYkNvZGVjXS4KICovCmNvbnN0IFpMaWJDb2RlYyB6bGliID0gY29uc3QgWkxpYkNvZGVjLl9kZWZhdWx0KCk7CkBEZXByZWNhdGVkKCJVc2UgemxpYiBpbnN0ZWFkIikKY29uc3QgWkxpYkNvZGVjIFpMSUIgPSB6bGliOwoKLyoqCiAqIFRoZSBbWkxpYkNvZGVjXSBlbmNvZGVzIHJhdyBieXRlcyB0byBaTGliIGNvbXByZXNzZWQgYnl0ZXMgYW5kIGRlY29kZXMgWkxpYgogKiBjb21wcmVzc2VkIGJ5dGVzIHRvIHJhdyBieXRlcy4KICovCmNsYXNzIFpMaWJDb2RlYyBleHRlbmRzIENvZGVjPExpc3Q8aW50PiwgTGlzdDxpbnQ+PiB7CiAgLyoqCiAgICogV2hlbiB0cnVlLCBgR1ppcGAgZnJhbWVzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbXByZXNzZWQgZGF0YS4KICAgKi8KICBmaW5hbCBib29sIGd6aXA7CgogIC8qKgogICAqIFRoZSBjb21wcmVzc2lvbi1bbGV2ZWxdIGNhbiBiZSBzZXQgaW4gdGhlIHJhbmdlIG9mIGAtMS4uOWAsIHdpdGggYDZgIGJlaW5nCiAgICogdGhlIGRlZmF1bHQgY29tcHJlc3Npb24gbGV2ZWwuIExldmVscyBhYm92ZSBgNmAgd2lsbCBoYXZlIGhpZ2hlcgogICAqIGNvbXByZXNzaW9uIHJhdGVzIGF0IHRoZSBjb3N0IG9mIG1vcmUgQ1BVIGFuZCBtZW1vcnkgdXNhZ2UuIExldmVscyBiZWxvdwogICAqIGA2YCB3aWxsIHVzZSBsZXNzIENQVSBhbmQgbWVtb3J5IGF0IHRoZSBjb3N0IG9mIGxvd2VyIGNvbXByZXNzaW9uIHJhdGVzLgogICAqLwogIGZpbmFsIGludCBsZXZlbDsKCiAgLyoqCiAgICogU3BlY2lmaWVzIGhvdyBtdWNoIG1lbW9yeSBzaG91bGQgYmUgYWxsb2NhdGVkIGZvciB0aGUgaW50ZXJuYWwgY29tcHJlc3Npb24KICAgKiBzdGF0ZS4gYDFgIHVzZXMgbWluaW11bSBtZW1vcnkgYnV0IGlzIHNsb3cgYW5kIHJlZHVjZXMgY29tcHJlc3Npb24gcmF0aW87CiAgICogYDlgIHVzZXMgbWF4aW11bSBtZW1vcnkgZm9yIG9wdGltYWwgc3BlZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGA4YC4KICAgKgogICAqIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBkZWZsYXRlIGFyZSAoaW4gYnl0ZXMpOgogICAqCiAgICogICAgICgxIDw8ICh3aW5kb3dCaXRzICsgMikpICsgICgxIDw8IChtZW1MZXZlbCArIDkpKQogICAqIHRoYXQgaXM6IDEyOEsgZm9yIHdpbmRvd0JpdHMgPSAxNSArIDEyOEsgZm9yIG1lbUxldmVsID0gOCAoZGVmYXVsdCB2YWx1ZXMpCiAgICovCiAgZmluYWwgaW50IG1lbUxldmVsOwoKICAvKioKICAgKiBUdW5lcyB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtLiBVc2UgdGhlIHZhbHVlIHN0cmF0ZWd5RGVmYXVsdCBmb3Igbm9ybWFsCiAgICogZGF0YSwgc3RyYXRlZ3lGaWx0ZXJlZCBmb3IgZGF0YSBwcm9kdWNlZCBieSBhIGZpbHRlciAob3IgcHJlZGljdG9yKSwKICAgKiBzdHJhdGVneUh1ZmZtYW5Pbmx5IHRvIGZvcmNlIEh1ZmZtYW4gZW5jb2Rpbmcgb25seSAobm8gc3RyaW5nIG1hdGNoKSwgb3IKICAgKiBzdHJhdGVneVJsZSB0byBsaW1pdCBtYXRjaCBkaXN0YW5jZXMgdG8gb25lIChydW4tbGVuZ3RoIGVuY29kaW5nKS4KICAgKi8KICBmaW5hbCBpbnQgc3RyYXRlZ3k7CgogIC8qKgogICAqIEJhc2UgdHdvIGxvZ2FyaXRobSBvZiB0aGUgd2luZG93IHNpemUgKHRoZSBzaXplIG9mIHRoZSBoaXN0b3J5IGJ1ZmZlcikuIEl0CiAgICogc2hvdWxkIGJlIGluIHRoZSByYW5nZSA4Li4xNS4gTGFyZ2VyIHZhbHVlcyByZXN1bHQgaW4gYmV0dGVyIGNvbXByZXNzaW9uIGF0CiAgICogdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNQogICAqLwogIGZpbmFsIGludCB3aW5kb3dCaXRzOwoKICAvKioKICAgKiBXaGVuIHRydWUsIGRlZmxhdGUgZ2VuZXJhdGVzIHJhdyBkYXRhIHdpdGggbm8gemxpYiBoZWFkZXIgb3IgdHJhaWxlciwgYW5kCiAgICogd2lsbCBub3QgY29tcHV0ZSBhbiBhZGxlcjMyIGNoZWNrIHZhbHVlCiAgICovCiAgZmluYWwgYm9vbCByYXc7CgogIC8qKgogICAqIEluaXRpYWwgY29tcHJlc3Npb24gZGljdGlvbmFyeS4KICAgKgogICAqIEl0IHNob3VsZCBjb25zaXN0IG9mIHN0cmluZ3MgKGJ5dGUgc2VxdWVuY2VzKSB0aGF0IGFyZSBsaWtlbHkgdG8gYmUKICAgKiBlbmNvdW50ZXJlZCBsYXRlciBpbiB0aGUgZGF0YSB0byBiZSBjb21wcmVzc2VkLCB3aXRoIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQKICAgKiBzdHJpbmdzIHByZWZlcmFibHkgcHV0IHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgZGljdGlvbmFyeS4gVXNpbmcgYQogICAqIGRpY3Rpb25hcnkgaXMgbW9zdCB1c2VmdWwgd2hlbiB0aGUgZGF0YSB0byBiZSBjb21wcmVzc2VkIGlzIHNob3J0IGFuZCBjYW4KICAgKiBiZSBwcmVkaWN0ZWQgd2l0aCBnb29kIGFjY3VyYWN5OyB0aGUgZGF0YSBjYW4gdGhlbiBiZSBjb21wcmVzc2VkIGJldHRlcgogICAqIHRoYW4gd2l0aCB0aGUgZGVmYXVsdCBlbXB0eSBkaWN0aW9uYXJ5LgogICAqLwogIGZpbmFsIExpc3Q8aW50PiBkaWN0aW9uYXJ5OwoKICBaTGliQ29kZWMoCiAgICAgIHt0aGlzLmxldmVsOiBaTGliT3B0aW9uLmRlZmF1bHRMZXZlbCwKICAgICAgdGhpcy53aW5kb3dCaXRzOiBaTGliT3B0aW9uLmRlZmF1bHRXaW5kb3dCaXRzLAogICAgICB0aGlzLm1lbUxldmVsOiBaTGliT3B0aW9uLmRlZmF1bHRNZW1MZXZlbCwKICAgICAgdGhpcy5zdHJhdGVneTogWkxpYk9wdGlvbi5zdHJhdGVneURlZmF1bHQsCiAgICAgIHRoaXMuZGljdGlvbmFyeSwKICAgICAgdGhpcy5yYXc6IGZhbHNlLAogICAgICB0aGlzLmd6aXA6IGZhbHNlfSkgewogICAgX3ZhbGlkYXRlWkxpYmVMZXZlbChsZXZlbCk7CiAgICBfdmFsaWRhdGVaTGliTWVtTGV2ZWwobWVtTGV2ZWwpOwogICAgX3ZhbGlkYXRlWkxpYlN0cmF0ZWd5KHN0cmF0ZWd5KTsKICAgIF92YWxpZGF0ZVpMaWJXaW5kb3dCaXRzKHdpbmRvd0JpdHMpOwogIH0KCiAgY29uc3QgWkxpYkNvZGVjLl9kZWZhdWx0KCkKICAgICAgOiBsZXZlbCA9IFpMaWJPcHRpb24uZGVmYXVsdExldmVsLAogICAgICAgIHdpbmRvd0JpdHMgPSBaTGliT3B0aW9uLmRlZmF1bHRXaW5kb3dCaXRzLAogICAgICAgIG1lbUxldmVsID0gWkxpYk9wdGlvbi5kZWZhdWx0TWVtTGV2ZWwsCiAgICAgICAgc3RyYXRlZ3kgPSBaTGliT3B0aW9uLnN0cmF0ZWd5RGVmYXVsdCwKICAgICAgICByYXcgPSBmYWxzZSwKICAgICAgICBnemlwID0gZmFsc2UsCiAgICAgICAgZGljdGlvbmFyeSA9IG51bGw7CgogIC8qKgogICAqIEdldCBhIFtaTGliRW5jb2Rlcl0gZm9yIGVuY29kaW5nIHRvIGBaTGliYCBjb21wcmVzc2VkIGRhdGEuCiAgICovCiAgWkxpYkVuY29kZXIgZ2V0IGVuY29kZXIgPT4gbmV3IFpMaWJFbmNvZGVyKAogICAgICBnemlwOiBmYWxzZSwKICAgICAgbGV2ZWw6IGxldmVsLAogICAgICB3aW5kb3dCaXRzOiB3aW5kb3dCaXRzLAogICAgICBtZW1MZXZlbDogbWVtTGV2ZWwsCiAgICAgIHN0cmF0ZWd5OiBzdHJhdGVneSwKICAgICAgZGljdGlvbmFyeTogZGljdGlvbmFyeSwKICAgICAgcmF3OiByYXcpOwoKICAvKioKICAgKiBHZXQgYSBbWkxpYkRlY29kZXJdIGZvciBkZWNvZGluZyBgWkxpYmAgY29tcHJlc3NlZCBkYXRhLgogICAqLwogIFpMaWJEZWNvZGVyIGdldCBkZWNvZGVyID0+CiAgICAgIG5ldyBaTGliRGVjb2Rlcih3aW5kb3dCaXRzOiB3aW5kb3dCaXRzLCBkaWN0aW9uYXJ5OiBkaWN0aW9uYXJ5LCByYXc6IHJhdyk7Cn0KCi8qKgogKiBBbiBpbnN0YW5jZSBvZiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgW0daaXBDb2RlY10uCiAqLwpjb25zdCBHWmlwQ29kZWMgZ3ppcCA9IGNvbnN0IEdaaXBDb2RlYy5fZGVmYXVsdCgpOwpARGVwcmVjYXRlZCgiVXNlIGd6aXAgaW5zdGVhZCIpCmNvbnN0IEdaaXBDb2RlYyBHWklQID0gZ3ppcDsKCi8qKgogKiBUaGUgW0daaXBDb2RlY10gZW5jb2RlcyByYXcgYnl0ZXMgdG8gR1ppcCBjb21wcmVzc2VkIGJ5dGVzIGFuZCBkZWNvZGVzIEdaaXAKICogY29tcHJlc3NlZCBieXRlcyB0byByYXcgYnl0ZXMuCiAqCiAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gW1pMaWJDb2RlY10gYW5kIFtHWmlwQ29kZWNdIGlzIHRoYXQgdGhlIFtHWmlwQ29kZWNdCiAqIHdyYXBzIHRoZSBgWkxpYmAgY29tcHJlc3NlZCBieXRlcyBpbiBgR1ppcGAgZnJhbWVzLgogKi8KY2xhc3MgR1ppcENvZGVjIGV4dGVuZHMgQ29kZWM8TGlzdDxpbnQ+LCBMaXN0PGludD4+IHsKICAvKioKICAgKiBXaGVuIHRydWUsIGBHWmlwYCBmcmFtZXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgY29tcHJlc3NlZCBkYXRhLgogICAqLwogIGZpbmFsIGJvb2wgZ3ppcDsKCiAgLyoqCiAgICogVGhlIGNvbXByZXNzaW9uLVtsZXZlbF0gY2FuIGJlIHNldCBpbiB0aGUgcmFuZ2Ugb2YgYC0xLi45YCwgd2l0aCBgNmAgYmVpbmcKICAgKiB0aGUgZGVmYXVsdCBjb21wcmVzc2lvbiBsZXZlbC4gTGV2ZWxzIGFib3ZlIGA2YCB3aWxsIGhhdmUgaGlnaGVyCiAgICogY29tcHJlc3Npb24gcmF0ZXMgYXQgdGhlIGNvc3Qgb2YgbW9yZSBDUFUgYW5kIG1lbW9yeSB1c2FnZS4gTGV2ZWxzIGJlbG93CiAgICogYDZgIHdpbGwgdXNlIGxlc3MgQ1BVIGFuZCBtZW1vcnkgYXQgdGhlIGNvc3Qgb2YgbG93ZXIgY29tcHJlc3Npb24gcmF0ZXMuCiAgICovCiAgZmluYWwgaW50IGxldmVsOwoKICAvKioKICAgKiBTcGVjaWZpZXMgaG93IG11Y2ggbWVtb3J5IHNob3VsZCBiZSBhbGxvY2F0ZWQgZm9yIHRoZSBpbnRlcm5hbCBjb21wcmVzc2lvbgogICAqIHN0YXRlLiBgMWAgdXNlcyBtaW5pbXVtIG1lbW9yeSBidXQgaXMgc2xvdyBhbmQgcmVkdWNlcyBjb21wcmVzc2lvbiByYXRpbzsKICAgKiBgOWAgdXNlcyBtYXhpbXVtIG1lbW9yeSBmb3Igb3B0aW1hbCBzcGVlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYDhgLgogICAqCiAgICogVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGRlZmxhdGUgYXJlIChpbiBieXRlcyk6CiAgICoKICAgKiAgICAgKDEgPDwgKHdpbmRvd0JpdHMgKyAyKSkgKyAgKDEgPDwgKG1lbUxldmVsICsgOSkpCiAgICogdGhhdCBpczogMTI4SyBmb3Igd2luZG93Qml0cyA9IDE1ICsgMTI4SyBmb3IgbWVtTGV2ZWwgPSA4IChkZWZhdWx0IHZhbHVlcykKICAgKi8KICBmaW5hbCBpbnQgbWVtTGV2ZWw7CgogIC8qKgogICAqIFR1bmVzIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0uIFVzZSB0aGUgdmFsdWUKICAgKiBbWkxpYk9wdGlvbi5zdHJhdGVneURlZmF1bHRdIGZvciBub3JtYWwgZGF0YSwKICAgKiBbWkxpYk9wdGlvbi5zdHJhdGVneUZpbHRlcmVkXSBmb3IgZGF0YSBwcm9kdWNlZCBieSBhIGZpbHRlcgogICAqIChvciBwcmVkaWN0b3IpLCBbWkxpYk9wdGlvbi5zdHJhdGVneUh1ZmZtYW5Pbmx5XSB0byBmb3JjZSBIdWZmbWFuCiAgICogZW5jb2Rpbmcgb25seSAobm8gc3RyaW5nIG1hdGNoKSwgb3IgW1pMaWJPcHRpb24uc3RyYXRlZ3lSbGVdIHRvIGxpbWl0CiAgICogbWF0Y2ggZGlzdGFuY2VzIHRvIG9uZSAocnVuLWxlbmd0aCBlbmNvZGluZykuCiAgICovCiAgZmluYWwgaW50IHN0cmF0ZWd5OwoKICAvKioKICAgKiBCYXNlIHR3byBsb2dhcml0aG0gb2YgdGhlIHdpbmRvdyBzaXplICh0aGUgc2l6ZSBvZiB0aGUgaGlzdG9yeSBidWZmZXIpLiBJdAogICAqIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgYDguLjE1YC4gTGFyZ2VyIHZhbHVlcyByZXN1bHQgaW4gYmV0dGVyIGNvbXByZXNzaW9uCiAgICogYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgMTVgCiAgICovCiAgZmluYWwgaW50IHdpbmRvd0JpdHM7CgogIC8qKgogICAqIEluaXRpYWwgY29tcHJlc3Npb24gZGljdGlvbmFyeS4KICAgKgogICAqIEl0IHNob3VsZCBjb25zaXN0IG9mIHN0cmluZ3MgKGJ5dGUgc2VxdWVuY2VzKSB0aGF0IGFyZSBsaWtlbHkgdG8gYmUKICAgKiBlbmNvdW50ZXJlZCBsYXRlciBpbiB0aGUgZGF0YSB0byBiZSBjb21wcmVzc2VkLCB3aXRoIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQKICAgKiBzdHJpbmdzIHByZWZlcmFibHkgcHV0IHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgZGljdGlvbmFyeS4gVXNpbmcgYQogICAqIGRpY3Rpb25hcnkgaXMgbW9zdCB1c2VmdWwgd2hlbiB0aGUgZGF0YSB0byBiZSBjb21wcmVzc2VkIGlzIHNob3J0IGFuZCBjYW4KICAgKiBiZSBwcmVkaWN0ZWQgd2l0aCBnb29kIGFjY3VyYWN5OyB0aGUgZGF0YSBjYW4gdGhlbiBiZSBjb21wcmVzc2VkIGJldHRlcgogICAqIHRoYW4gd2l0aCB0aGUgZGVmYXVsdCBlbXB0eSBkaWN0aW9uYXJ5LgogICAqLwogIGZpbmFsIExpc3Q8aW50PiBkaWN0aW9uYXJ5OwoKICAvKioKICAgKiBXaGVuIHRydWUsIGRlZmxhdGUgZ2VuZXJhdGVzIHJhdyBkYXRhIHdpdGggbm8gemxpYiBoZWFkZXIgb3IgdHJhaWxlciwgYW5kCiAgICogd2lsbCBub3QgY29tcHV0ZSBhbiBhZGxlcjMyIGNoZWNrIHZhbHVlCiAgICovCiAgZmluYWwgYm9vbCByYXc7CgogIEdaaXBDb2RlYygKICAgICAge3RoaXMubGV2ZWw6IFpMaWJPcHRpb24uZGVmYXVsdExldmVsLAogICAgICB0aGlzLndpbmRvd0JpdHM6IFpMaWJPcHRpb24uZGVmYXVsdFdpbmRvd0JpdHMsCiAgICAgIHRoaXMubWVtTGV2ZWw6IFpMaWJPcHRpb24uZGVmYXVsdE1lbUxldmVsLAogICAgICB0aGlzLnN0cmF0ZWd5OiBaTGliT3B0aW9uLnN0cmF0ZWd5RGVmYXVsdCwKICAgICAgdGhpcy5kaWN0aW9uYXJ5LAogICAgICB0aGlzLnJhdzogZmFsc2UsCiAgICAgIHRoaXMuZ3ppcDogdHJ1ZX0pIHsKICAgIF92YWxpZGF0ZVpMaWJlTGV2ZWwobGV2ZWwpOwogICAgX3ZhbGlkYXRlWkxpYk1lbUxldmVsKG1lbUxldmVsKTsKICAgIF92YWxpZGF0ZVpMaWJTdHJhdGVneShzdHJhdGVneSk7CiAgICBfdmFsaWRhdGVaTGliV2luZG93Qml0cyh3aW5kb3dCaXRzKTsKICB9CgogIGNvbnN0IEdaaXBDb2RlYy5fZGVmYXVsdCgpCiAgICAgIDogbGV2ZWwgPSBaTGliT3B0aW9uLmRlZmF1bHRMZXZlbCwKICAgICAgICB3aW5kb3dCaXRzID0gWkxpYk9wdGlvbi5kZWZhdWx0V2luZG93Qml0cywKICAgICAgICBtZW1MZXZlbCA9IFpMaWJPcHRpb24uZGVmYXVsdE1lbUxldmVsLAogICAgICAgIHN0cmF0ZWd5ID0gWkxpYk9wdGlvbi5zdHJhdGVneURlZmF1bHQsCiAgICAgICAgcmF3ID0gZmFsc2UsCiAgICAgICAgZ3ppcCA9IHRydWUsCiAgICAgICAgZGljdGlvbmFyeSA9IG51bGw7CgogIC8qKgogICAqIEdldCBhIFtaTGliRW5jb2Rlcl0gZm9yIGVuY29kaW5nIHRvIGBHWmlwYCBjb21wcmVzc2VkIGRhdGEuCiAgICovCiAgWkxpYkVuY29kZXIgZ2V0IGVuY29kZXIgPT4gbmV3IFpMaWJFbmNvZGVyKAogICAgICBnemlwOiB0cnVlLAogICAgICBsZXZlbDogbGV2ZWwsCiAgICAgIHdpbmRvd0JpdHM6IHdpbmRvd0JpdHMsCiAgICAgIG1lbUxldmVsOiBtZW1MZXZlbCwKICAgICAgc3RyYXRlZ3k6IHN0cmF0ZWd5LAogICAgICBkaWN0aW9uYXJ5OiBkaWN0aW9uYXJ5LAogICAgICByYXc6IHJhdyk7CgogIC8qKgogICAqIEdldCBhIFtaTGliRGVjb2Rlcl0gZm9yIGRlY29kaW5nIGBHWmlwYCBjb21wcmVzc2VkIGRhdGEuCiAgICovCiAgWkxpYkRlY29kZXIgZ2V0IGRlY29kZXIgPT4KICAgICAgbmV3IFpMaWJEZWNvZGVyKHdpbmRvd0JpdHM6IHdpbmRvd0JpdHMsIGRpY3Rpb25hcnk6IGRpY3Rpb25hcnksIHJhdzogcmF3KTsKfQoKLyoqCiAqIFRoZSBbWkxpYkVuY29kZXJdIGVuY29kZXIgaXMgdXNlZCBieSBbWkxpYkNvZGVjXSBhbmQgW0daaXBDb2RlY10gdG8gY29tcHJlc3MKICogZGF0YS4KICovCmNsYXNzIFpMaWJFbmNvZGVyIGV4dGVuZHMgQ29udmVydGVyPExpc3Q8aW50PiwgTGlzdDxpbnQ+PiB7CiAgLyoqCiAgICogV2hlbiB0cnVlLCBgR1ppcGAgZnJhbWVzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbXByZXNzZWQgZGF0YS4KICAgKi8KICBmaW5hbCBib29sIGd6aXA7CgogIC8qKgogICAqIFRoZSBjb21wcmVzc2lvbi1bbGV2ZWxdIGNhbiBiZSBzZXQgaW4gdGhlIHJhbmdlIG9mIGAtMS4uOWAsIHdpdGggYDZgIGJlaW5nCiAgICogdGhlIGRlZmF1bHQgY29tcHJlc3Npb24gbGV2ZWwuIExldmVscyBhYm92ZSBgNmAgd2lsbCBoYXZlIGhpZ2hlcgogICAqIGNvbXByZXNzaW9uIHJhdGVzIGF0IHRoZSBjb3N0IG9mIG1vcmUgQ1BVIGFuZCBtZW1vcnkgdXNhZ2UuIExldmVscyBiZWxvdwogICAqIGA2YCB3aWxsIHVzZSBsZXNzIENQVSBhbmQgbWVtb3J5IGF0IHRoZSBjb3N0IG9mIGxvd2VyIGNvbXByZXNzaW9uIHJhdGVzLgogICAqLwogIGZpbmFsIGludCBsZXZlbDsKCiAgLyoqCiAgICogU3BlY2lmaWVzIGhvdyBtdWNoIG1lbW9yeSBzaG91bGQgYmUgYWxsb2NhdGVkIGZvciB0aGUgaW50ZXJuYWwgY29tcHJlc3Npb24KICAgKiBzdGF0ZS4gYDFgIHVzZXMgbWluaW11bSBtZW1vcnkgYnV0IGlzIHNsb3cgYW5kIHJlZHVjZXMgY29tcHJlc3Npb24gcmF0aW87CiAgICogYDlgIHVzZXMgbWF4aW11bSBtZW1vcnkgZm9yIG9wdGltYWwgc3BlZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGA4YC4KICAgKgogICAqIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBkZWZsYXRlIGFyZSAoaW4gYnl0ZXMpOgogICAqCiAgICogICAgICgxIDw8ICh3aW5kb3dCaXRzICsgMikpICsgICgxIDw8IChtZW1MZXZlbCArIDkpKQogICAqIHRoYXQgaXM6IDEyOEsgZm9yIHdpbmRvd0JpdHMgPSAxNSArIDEyOEsgZm9yIG1lbUxldmVsID0gOCAoZGVmYXVsdCB2YWx1ZXMpCiAgICovCiAgZmluYWwgaW50IG1lbUxldmVsOwoKICAvKioKICAgKiBUdW5lcyB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtLiBVc2UgdGhlIHZhbHVlCiAgICogW1pMaWJPcHRpb24uc3RyYXRlZ3lEZWZhdWx0XSBmb3Igbm9ybWFsIGRhdGEsCiAgICogW1pMaWJPcHRpb24uc3RyYXRlZ3lGaWx0ZXJlZF0gZm9yIGRhdGEgcHJvZHVjZWQgYnkgYSBmaWx0ZXIKICAgKiAob3IgcHJlZGljdG9yKSwgW1pMaWJPcHRpb24uc3RyYXRlZ3lIdWZmbWFuT25seV0gdG8gZm9yY2UgSHVmZm1hbgogICAqIGVuY29kaW5nIG9ubHkgKG5vIHN0cmluZyBtYXRjaCksIG9yIFtaTGliT3B0aW9uLnN0cmF0ZWd5UmxlXSB0byBsaW1pdAogICAqIG1hdGNoIGRpc3RhbmNlcyB0byBvbmUgKHJ1bi1sZW5ndGggZW5jb2RpbmcpLgogICAqLwogIGZpbmFsIGludCBzdHJhdGVneTsKCiAgLyoqCiAgICogQmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSB3aW5kb3cgc2l6ZSAodGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgYnVmZmVyKS4gSXQKICAgKiBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIGA4Li4xNWAuIExhcmdlciB2YWx1ZXMgcmVzdWx0IGluIGJldHRlciBjb21wcmVzc2lvbgogICAqIGF0IHRoZSBleHBlbnNlIG9mIG1lbW9yeSB1c2FnZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYDE1YAogICAqLwogIGZpbmFsIGludCB3aW5kb3dCaXRzOwoKICAvKioKICAgKiBJbml0aWFsIGNvbXByZXNzaW9uIGRpY3Rpb25hcnkuCiAgICoKICAgKiBJdCBzaG91bGQgY29uc2lzdCBvZiBzdHJpbmdzIChieXRlIHNlcXVlbmNlcykgdGhhdCBhcmUgbGlrZWx5IHRvIGJlCiAgICogZW5jb3VudGVyZWQgbGF0ZXIgaW4gdGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCwgd2l0aCB0aGUgbW9zdCBjb21tb25seSB1c2VkCiAgICogc3RyaW5ncyBwcmVmZXJhYmx5IHB1dCB0b3dhcmRzIHRoZSBlbmQgb2YgdGhlIGRpY3Rpb25hcnkuIFVzaW5nIGEKICAgKiBkaWN0aW9uYXJ5IGlzIG1vc3QgdXNlZnVsIHdoZW4gdGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCBpcyBzaG9ydCBhbmQgY2FuCiAgICogYmUgcHJlZGljdGVkIHdpdGggZ29vZCBhY2N1cmFjeTsgdGhlIGRhdGEgY2FuIHRoZW4gYmUgY29tcHJlc3NlZCBiZXR0ZXIKICAgKiB0aGFuIHdpdGggdGhlIGRlZmF1bHQgZW1wdHkgZGljdGlvbmFyeS4KICAgKi8KICBmaW5hbCBMaXN0PGludD4gZGljdGlvbmFyeTsKCiAgLyoqCiAgICogV2hlbiB0cnVlLCBkZWZsYXRlIGdlbmVyYXRlcyByYXcgZGF0YSB3aXRoIG5vIHpsaWIgaGVhZGVyIG9yIHRyYWlsZXIsIGFuZAogICAqIHdpbGwgbm90IGNvbXB1dGUgYW4gYWRsZXIzMiBjaGVjayB2YWx1ZQogICAqLwogIGZpbmFsIGJvb2wgcmF3OwoKICBaTGliRW5jb2RlcigKICAgICAge3RoaXMuZ3ppcDogZmFsc2UsCiAgICAgIHRoaXMubGV2ZWw6IFpMaWJPcHRpb24uZGVmYXVsdExldmVsLAogICAgICB0aGlzLndpbmRvd0JpdHM6IFpMaWJPcHRpb24uZGVmYXVsdFdpbmRvd0JpdHMsCiAgICAgIHRoaXMubWVtTGV2ZWw6IFpMaWJPcHRpb24uZGVmYXVsdE1lbUxldmVsLAogICAgICB0aGlzLnN0cmF0ZWd5OiBaTGliT3B0aW9uLnN0cmF0ZWd5RGVmYXVsdCwKICAgICAgdGhpcy5kaWN0aW9uYXJ5LAogICAgICB0aGlzLnJhdzogZmFsc2V9KSB7CiAgICBfdmFsaWRhdGVaTGliZUxldmVsKGxldmVsKTsKICAgIF92YWxpZGF0ZVpMaWJNZW1MZXZlbChtZW1MZXZlbCk7CiAgICBfdmFsaWRhdGVaTGliU3RyYXRlZ3koc3RyYXRlZ3kpOwogICAgX3ZhbGlkYXRlWkxpYldpbmRvd0JpdHMod2luZG93Qml0cyk7CiAgfQoKICAvKioKICAgKiBDb252ZXJ0IGEgbGlzdCBvZiBieXRlcyB1c2luZyB0aGUgb3B0aW9ucyBnaXZlbiB0byB0aGUgWkxpYkVuY29kZXIKICAgKiBjb25zdHJ1Y3Rvci4KICAgKi8KICBMaXN0PGludD4gY29udmVydChMaXN0PGludD4gYnl0ZXMpIHsKICAgIF9CdWZmZXJTaW5rIHNpbmsgPSBuZXcgX0J1ZmZlclNpbmsoKTsKICAgIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oc2luaykKICAgICAgLi5hZGQoYnl0ZXMpCiAgICAgIC4uY2xvc2UoKTsKICAgIHJldHVybiBzaW5rLmJ1aWxkZXIudGFrZUJ5dGVzKCk7CiAgfQoKICAvKioKICAgKiBTdGFydCBhIGNodW5rZWQgY29udmVyc2lvbiB1c2luZyB0aGUgb3B0aW9ucyBnaXZlbiB0byB0aGUgW1pMaWJFbmNvZGVyXQogICAqIGNvbnN0cnVjdG9yLiBXaGlsZSBpdCBhY2NlcHRzIGFueSBbU2lua10gdGFraW5nIFtMaXN0PGludD5dJ3MsCiAgICogdGhlIG9wdGltYWwgc2luayB0byBiZSBwYXNzZWQgYXMgW3NpbmtdIGlzIGEgW0J5dGVDb252ZXJzaW9uU2lua10uCiAgICovCiAgQnl0ZUNvbnZlcnNpb25TaW5rIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxMaXN0PGludD4+IHNpbmspIHsKICAgIGlmIChzaW5rIGlzISBCeXRlQ29udmVyc2lvblNpbmspIHsKICAgICAgc2luayA9IG5ldyBCeXRlQ29udmVyc2lvblNpbmsuZnJvbShzaW5rKTsKICAgIH0KICAgIHJldHVybiBuZXcgX1pMaWJFbmNvZGVyU2luaygKICAgICAgICBzaW5rLCBnemlwLCBsZXZlbCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5LCBkaWN0aW9uYXJ5LCByYXcpOwogIH0KfQoKLyoqCiAqIFRoZSBbWkxpYkRlY29kZXJdIGlzIHVzZWQgYnkgW1pMaWJDb2RlY10gYW5kIFtHWmlwQ29kZWNdIHRvIGRlY29tcHJlc3MgZGF0YS4KICovCmNsYXNzIFpMaWJEZWNvZGVyIGV4dGVuZHMgQ29udmVydGVyPExpc3Q8aW50PiwgTGlzdDxpbnQ+PiB7CiAgLyoqCiAgICogQmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSB3aW5kb3cgc2l6ZSAodGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgYnVmZmVyKS4gSXQKICAgKiBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIGA4Li4xNWAuIExhcmdlciB2YWx1ZXMgcmVzdWx0IGluIGJldHRlciBjb21wcmVzc2lvbgogICAqIGF0IHRoZSBleHBlbnNlIG9mIG1lbW9yeSB1c2FnZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYDE1YC4KICAgKi8KICBmaW5hbCBpbnQgd2luZG93Qml0czsKCiAgLyoqCiAgICogSW5pdGlhbCBjb21wcmVzc2lvbiBkaWN0aW9uYXJ5LgogICAqCiAgICogSXQgc2hvdWxkIGNvbnNpc3Qgb2Ygc3RyaW5ncyAoYnl0ZSBzZXF1ZW5jZXMpIHRoYXQgYXJlIGxpa2VseSB0byBiZQogICAqIGVuY291bnRlcmVkIGxhdGVyIGluIHRoZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQsIHdpdGggdGhlIG1vc3QgY29tbW9ubHkgdXNlZAogICAqIHN0cmluZ3MgcHJlZmVyYWJseSBwdXQgdG93YXJkcyB0aGUgZW5kIG9mIHRoZSBkaWN0aW9uYXJ5LiBVc2luZyBhCiAgICogZGljdGlvbmFyeSBpcyBtb3N0IHVzZWZ1bCB3aGVuIHRoZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQgaXMgc2hvcnQgYW5kIGNhbgogICAqIGJlIHByZWRpY3RlZCB3aXRoIGdvb2QgYWNjdXJhY3k7IHRoZSBkYXRhIGNhbiB0aGVuIGJlIGNvbXByZXNzZWQgYmV0dGVyCiAgICogdGhhbiB3aXRoIHRoZSBkZWZhdWx0IGVtcHR5IGRpY3Rpb25hcnkuCiAgICovCiAgZmluYWwgTGlzdDxpbnQ+IGRpY3Rpb25hcnk7CgogIC8qKgogICAqIFdoZW4gdHJ1ZSwgZGVmbGF0ZSBnZW5lcmF0ZXMgcmF3IGRhdGEgd2l0aCBubyB6bGliIGhlYWRlciBvciB0cmFpbGVyLCBhbmQKICAgKiB3aWxsIG5vdCBjb21wdXRlIGFuIGFkbGVyMzIgY2hlY2sgdmFsdWUKICAgKi8KICBmaW5hbCBib29sIHJhdzsKCiAgWkxpYkRlY29kZXIoCiAgICAgIHt0aGlzLndpbmRvd0JpdHM6IFpMaWJPcHRpb24uZGVmYXVsdFdpbmRvd0JpdHMsCiAgICAgIHRoaXMuZGljdGlvbmFyeSwKICAgICAgdGhpcy5yYXc6IGZhbHNlfSkgewogICAgX3ZhbGlkYXRlWkxpYldpbmRvd0JpdHMod2luZG93Qml0cyk7CiAgfQoKICAvKioKICAgKiBDb252ZXJ0IGEgbGlzdCBvZiBieXRlcyB1c2luZyB0aGUgb3B0aW9ucyBnaXZlbiB0byB0aGUgW1pMaWJEZWNvZGVyXQogICAqIGNvbnN0cnVjdG9yLgogICAqLwogIExpc3Q8aW50PiBjb252ZXJ0KExpc3Q8aW50PiBieXRlcykgewogICAgX0J1ZmZlclNpbmsgc2luayA9IG5ldyBfQnVmZmVyU2luaygpOwogICAgc3RhcnRDaHVua2VkQ29udmVyc2lvbihzaW5rKQogICAgICAuLmFkZChieXRlcykKICAgICAgLi5jbG9zZSgpOwogICAgcmV0dXJuIHNpbmsuYnVpbGRlci50YWtlQnl0ZXMoKTsKICB9CgogIC8qKgogICAqIFN0YXJ0IGEgY2h1bmtlZCBjb252ZXJzaW9uLiBXaGlsZSBpdCBhY2NlcHRzIGFueSBbU2lua10KICAgKiB0YWtpbmcgW0xpc3Q8aW50Pl0ncywgdGhlIG9wdGltYWwgc2luayB0byBiZSBwYXNzZWQgYXMgW3NpbmtdIGlzIGEKICAgKiBbQnl0ZUNvbnZlcnNpb25TaW5rXS4KICAgKi8KICBCeXRlQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPExpc3Q8aW50Pj4gc2luaykgewogICAgaWYgKHNpbmsgaXMhIEJ5dGVDb252ZXJzaW9uU2luaykgewogICAgICBzaW5rID0gbmV3IEJ5dGVDb252ZXJzaW9uU2luay5mcm9tKHNpbmspOwogICAgfQogICAgcmV0dXJuIG5ldyBfWkxpYkRlY29kZXJTaW5rKHNpbmssIHdpbmRvd0JpdHMsIGRpY3Rpb25hcnksIHJhdyk7CiAgfQp9CgovKioKICogVGhlIFtSYXdaTGliRmlsdGVyXSBjbGFzcyBwcm92aWRlcyBhIGxvdy1sZXZlbCBpbnRlcmZhY2UgdG8gemxpYi4KICovCmFic3RyYWN0IGNsYXNzIFJhd1pMaWJGaWx0ZXIgewogIC8qKgogICAqIFJldHVybnMgYSBhIFtSYXdaTGliRmlsdGVyXSB3aG9zZSBbcHJvY2Vzc10gYW5kIFtwcm9jZXNzZWRdIG1ldGhvZHMKICAgKiBjb21wcmVzcyBkYXRhLgogICAqLwogIGZhY3RvcnkgUmF3WkxpYkZpbHRlci5kZWZsYXRlRmlsdGVyKHsKICAgIGJvb2wgZ3ppcDogZmFsc2UsCiAgICBpbnQgbGV2ZWw6IFpMaWJPcHRpb24uZGVmYXVsdExldmVsLAogICAgaW50IHdpbmRvd0JpdHM6IFpMaWJPcHRpb24uZGVmYXVsdFdpbmRvd0JpdHMsCiAgICBpbnQgbWVtTGV2ZWw6IFpMaWJPcHRpb24uZGVmYXVsdE1lbUxldmVsLAogICAgaW50IHN0cmF0ZWd5OiBaTGliT3B0aW9uLnN0cmF0ZWd5RGVmYXVsdCwKICAgIExpc3Q8aW50PiBkaWN0aW9uYXJ5LAogICAgYm9vbCByYXc6IGZhbHNlLAogIH0pIHsKICAgIHJldHVybiBfbWFrZVpMaWJEZWZsYXRlRmlsdGVyKAogICAgICAgIGd6aXAsIGxldmVsLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3ksIGRpY3Rpb25hcnksIHJhdyk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIGEgYSBbUmF3WkxpYkZpbHRlcl0gd2hvc2UgW3Byb2Nlc3NdIGFuZCBbcHJvY2Vzc2VkXSBtZXRob2RzCiAgICogZGVjb21wcmVzcyBkYXRhLgogICAqLwogIGZhY3RvcnkgUmF3WkxpYkZpbHRlci5pbmZsYXRlRmlsdGVyKHsKICAgIGludCB3aW5kb3dCaXRzOiBaTGliT3B0aW9uLmRlZmF1bHRXaW5kb3dCaXRzLAogICAgTGlzdDxpbnQ+IGRpY3Rpb25hcnksCiAgICBib29sIHJhdzogZmFsc2UsCiAgfSkgewogICAgcmV0dXJuIF9tYWtlWkxpYkluZmxhdGVGaWx0ZXIod2luZG93Qml0cywgZGljdGlvbmFyeSwgcmF3KTsKICB9CgogIC8qKgogICAqIENhbGwgdG8gcHJvY2VzcyBhIGNodW5rIG9mIGRhdGEuIEEgY2FsbCB0byBbcHJvY2Vzc10gc2hvdWxkIG9ubHkgYmUgbWFkZQogICAqIHdoZW4gW3Byb2Nlc3NlZF0gcmV0dXJucyBbOm51bGw6XS4KICAgKi8KICB2b2lkIHByb2Nlc3MoTGlzdDxpbnQ+IGRhdGEsIGludCBzdGFydCwgaW50IGVuZCk7CgogIC8qKgogICAqIEdldCBhIGNodW5rIG9mIHByb2Nlc3NlZCBkYXRhLiBXaGVuIHRoZXJlIGFyZSBubyBtb3JlIGRhdGEgYXZhaWxhYmxlLAogICAqIFtwcm9jZXNzZWRdIHdpbGwgcmV0dXJuIFs6bnVsbDpdLiBTZXQgW2ZsdXNoXSB0byBbOmZhbHNlOl0gZm9yIG5vbi1maW5hbAogICAqIGNhbGxzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2Ugb2Ygc29tZSBmaWx0ZXJzLgogICAqCiAgICogVGhlIGxhc3QgY2FsbCB0byBbcHJvY2Vzc2VkXSBzaG91bGQgaGF2ZSBbZW5kXSBzZXQgdG8gWzp0cnVlOl0uIFRoaXMgd2lsbAogICAqIG1ha2Ugc3VyZSBhbiAnZW5kJyBwYWNrZXQgaXMgd3JpdHRlbiBvbiB0aGUgc3RyZWFtLgogICAqLwogIExpc3Q8aW50PiBwcm9jZXNzZWQoe2Jvb2wgZmx1c2g6IHRydWUsIGJvb2wgZW5kOiBmYWxzZX0pOwoKICBleHRlcm5hbCBzdGF0aWMgUmF3WkxpYkZpbHRlciBfbWFrZVpMaWJEZWZsYXRlRmlsdGVyKAogICAgICBib29sIGd6aXAsCiAgICAgIGludCBsZXZlbCwKICAgICAgaW50IHdpbmRvd0JpdHMsCiAgICAgIGludCBtZW1MZXZlbCwKICAgICAgaW50IHN0cmF0ZWd5LAogICAgICBMaXN0PGludD4gZGljdGlvbmFyeSwKICAgICAgYm9vbCByYXcpOwoKICBleHRlcm5hbCBzdGF0aWMgUmF3WkxpYkZpbHRlciBfbWFrZVpMaWJJbmZsYXRlRmlsdGVyKAogICAgICBpbnQgd2luZG93Qml0cywgTGlzdDxpbnQ+IGRpY3Rpb25hcnksIGJvb2wgcmF3KTsKfQoKY2xhc3MgX0J1ZmZlclNpbmsgZXh0ZW5kcyBCeXRlQ29udmVyc2lvblNpbmsgewogIGZpbmFsIEJ5dGVzQnVpbGRlciBidWlsZGVyID0gbmV3IEJ5dGVzQnVpbGRlcihjb3B5OiBmYWxzZSk7CgogIHZvaWQgYWRkKExpc3Q8aW50PiBjaHVuaykgewogICAgYnVpbGRlci5hZGQoY2h1bmspOwogIH0KCiAgdm9pZCBhZGRTbGljZShMaXN0PGludD4gY2h1bmssIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIGlmIChjaHVuayBpcyBVaW50OExpc3QpIHsKICAgICAgVWludDhMaXN0IGxpc3QgPSBjaHVuazsKICAgICAgYnVpbGRlci5hZGQobmV3IFVpbnQ4TGlzdC52aWV3KGxpc3QuYnVmZmVyLCBzdGFydCwgZW5kIC0gc3RhcnQpKTsKICAgIH0gZWxzZSB7CiAgICAgIGJ1aWxkZXIuYWRkKGNodW5rLnN1Ymxpc3Qoc3RhcnQsIGVuZCkpOwogICAgfQogIH0KCiAgdm9pZCBjbG9zZSgpIHt9Cn0KCmNsYXNzIF9aTGliRW5jb2RlclNpbmsgZXh0ZW5kcyBfRmlsdGVyU2luayB7CiAgX1pMaWJFbmNvZGVyU2luaygKICAgICAgQnl0ZUNvbnZlcnNpb25TaW5rIHNpbmssCiAgICAgIGJvb2wgZ3ppcCwKICAgICAgaW50IGxldmVsLAogICAgICBpbnQgd2luZG93Qml0cywKICAgICAgaW50IG1lbUxldmVsLAogICAgICBpbnQgc3RyYXRlZ3ksCiAgICAgIExpc3Q8aW50PiBkaWN0aW9uYXJ5LAogICAgICBib29sIHJhdykKICAgICAgOiBzdXBlcigKICAgICAgICAgICAgc2luaywKICAgICAgICAgICAgUmF3WkxpYkZpbHRlci5fbWFrZVpMaWJEZWZsYXRlRmlsdGVyKAogICAgICAgICAgICAgICAgZ3ppcCwgbGV2ZWwsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSwgZGljdGlvbmFyeSwgcmF3KSk7Cn0KCmNsYXNzIF9aTGliRGVjb2RlclNpbmsgZXh0ZW5kcyBfRmlsdGVyU2luayB7CiAgX1pMaWJEZWNvZGVyU2luaygKICAgICAgQnl0ZUNvbnZlcnNpb25TaW5rIHNpbmssIGludCB3aW5kb3dCaXRzLCBMaXN0PGludD4gZGljdGlvbmFyeSwgYm9vbCByYXcpCiAgICAgIDogc3VwZXIoc2luaywKICAgICAgICAgICAgUmF3WkxpYkZpbHRlci5fbWFrZVpMaWJJbmZsYXRlRmlsdGVyKHdpbmRvd0JpdHMsIGRpY3Rpb25hcnksIHJhdykpOwp9CgpjbGFzcyBfRmlsdGVyU2luayBleHRlbmRzIEJ5dGVDb252ZXJzaW9uU2luayB7CiAgZmluYWwgUmF3WkxpYkZpbHRlciBfZmlsdGVyOwogIGZpbmFsIEJ5dGVDb252ZXJzaW9uU2luayBfc2luazsKICBib29sIF9jbG9zZWQgPSBmYWxzZTsKICBib29sIF9lbXB0eSA9IHRydWU7CgogIF9GaWx0ZXJTaW5rKHRoaXMuX3NpbmssIHRoaXMuX2ZpbHRlcik7CgogIHZvaWQgYWRkKExpc3Q8aW50PiBkYXRhKSB7CiAgICBhZGRTbGljZShkYXRhLCAwLCBkYXRhLmxlbmd0aCwgZmFsc2UpOwogIH0KCiAgdm9pZCBhZGRTbGljZShMaXN0PGludD4gZGF0YSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGlzTGFzdCkgewogICAgaWYgKF9jbG9zZWQpIHJldHVybjsKICAgIGlmIChlbmQgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgiZW5kIik7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBkYXRhLmxlbmd0aCk7CiAgICB0cnkgewogICAgICBfZW1wdHkgPSBmYWxzZTsKICAgICAgX0J1ZmZlckFuZFN0YXJ0IGJ1ZmZlckFuZFN0YXJ0ID0KICAgICAgICAgIF9lbnN1cmVGYXN0QW5kU2VyaWFsaXphYmxlQnl0ZURhdGEoZGF0YSwgc3RhcnQsIGVuZCk7CiAgICAgIF9maWx0ZXIucHJvY2VzcyhidWZmZXJBbmRTdGFydC5idWZmZXIsIGJ1ZmZlckFuZFN0YXJ0LnN0YXJ0LAogICAgICAgICAgZW5kIC0gKHN0YXJ0IC0gYnVmZmVyQW5kU3RhcnQuc3RhcnQpKTsKICAgICAgTGlzdDxpbnQ+IG91dDsKICAgICAgd2hpbGUgKChvdXQgPSBfZmlsdGVyLnByb2Nlc3NlZChmbHVzaDogZmFsc2UpKSAhPSBudWxsKSB7CiAgICAgICAgX3NpbmsuYWRkKG91dCk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgX2Nsb3NlZCA9IHRydWU7CiAgICAgIHJldGhyb3c7CiAgICB9CgogICAgaWYgKGlzTGFzdCkgY2xvc2UoKTsKICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBpZiAoX2Nsb3NlZCkgcmV0dXJuOwogICAgLy8gQmUgc3VyZSB0byBzZW5kIHByb2Nlc3MgYW4gZW1wdHkgY2h1bmsgb2YgZGF0YS4gV2l0aG91dCB0aGlzLCB0aGUgZW1wdHkKICAgIC8vIG1lc3NhZ2Ugd291bGQgbm90IGhhdmUgYSBHWmlwIGZyYW1lIChpZiBjb21wcmVzc2VkIHdpdGggR1ppcCkuCiAgICBpZiAoX2VtcHR5KSBfZmlsdGVyLnByb2Nlc3MoY29uc3QgW10sIDAsIDApOwogICAgdHJ5IHsKICAgICAgTGlzdDxpbnQ+IG91dDsKICAgICAgd2hpbGUgKChvdXQgPSBfZmlsdGVyLnByb2Nlc3NlZChlbmQ6IHRydWUpKSAhPSBudWxsKSB7CiAgICAgICAgX3NpbmsuYWRkKG91dCk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgLy8gVE9ETyhrZXZtb28pOiBub3Qgc3VyZSB3aHkgdGhpcyBpc24ndCBhIHRyeS9maW5hbGx5CiAgICAgIF9jbG9zZWQgPSB0cnVlOwogICAgICB0aHJvdyBlOwogICAgfQogICAgX2Nsb3NlZCA9IHRydWU7CiAgICBfc2luay5jbG9zZSgpOwogIH0KfQoKdm9pZCBfdmFsaWRhdGVaTGliV2luZG93Qml0cyhpbnQgd2luZG93Qml0cykgewogIGlmIChaTGliT3B0aW9uLm1pbldpbmRvd0JpdHMgPiB3aW5kb3dCaXRzIHx8CiAgICAgIFpMaWJPcHRpb24ubWF4V2luZG93Qml0cyA8IHdpbmRvd0JpdHMpIHsKICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKAogICAgICAgIHdpbmRvd0JpdHMsIFpMaWJPcHRpb24ubWluV2luZG93Qml0cywgWkxpYk9wdGlvbi5tYXhXaW5kb3dCaXRzKTsKICB9Cn0KCnZvaWQgX3ZhbGlkYXRlWkxpYmVMZXZlbChpbnQgbGV2ZWwpIHsKICBpZiAoWkxpYk9wdGlvbi5taW5MZXZlbCA+IGxldmVsIHx8IFpMaWJPcHRpb24ubWF4TGV2ZWwgPCBsZXZlbCkgewogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UobGV2ZWwsIFpMaWJPcHRpb24ubWluTGV2ZWwsIFpMaWJPcHRpb24ubWF4TGV2ZWwpOwogIH0KfQoKdm9pZCBfdmFsaWRhdGVaTGliTWVtTGV2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c2luZyB0aGUgZ2V0dGVyIFtwYXJlbnRdLAogKiBhIHByb3BlcnR5IGluaGVyaXRlZCBmcm9tIFtGaWxlU3lzdGVtRW50aXR5XS4KICoKICogSW4gYWRkaXRpb24gdG8gYmVpbmcgdXNlZCBhcyBhbiBpbnN0YW5jZSB0byBhY2Nlc3MgdGhlIGZpbGUgc3lzdGVtLAogKiBEaXJlY3RvcnkgaGFzIGEgbnVtYmVyIG9mIHN0YXRpYyBwcm9wZXJ0aWVzLCBzdWNoIGFzIFtzeXN0ZW1UZW1wXSwKICogd2hpY2ggZ2V0cyB0aGUgc3lzdGVtJ3MgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgYW5kIHRoZSBnZXR0ZXIgYW5kIHNldHRlcgogKiBbY3VycmVudF0sIHdoaWNoIHlvdSBjYW4gdXNlIHRvIGFjY2VzcyBvciBjaGFuZ2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgogKgogKiBDcmVhdGUgYSBuZXcgRGlyZWN0b3J5IG9iamVjdCB3aXRoIGEgcGF0aG5hbWUgdG8gYWNjZXNzIHRoZSBzcGVjaWZpZWQKICogZGlyZWN0b3J5IG9uIHRoZSBmaWxlIHN5c3RlbSBmcm9tIHlvdXIgcHJvZ3JhbS4KICoKICogICAgIHZhciBteURpciA9IG5ldyBEaXJlY3RvcnkoJ215RGlyJyk7CiAqCiAqIE1vc3QgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIG9jY3VyIGluIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgcGFpcnMsCiAqIGZvciBleGFtcGxlLCBbY3JlYXRlXSBhbmQgW2NyZWF0ZVN5bmNdLgogKiBVbmxlc3MgeW91IGhhdmUgYSBzcGVjaWZpYyByZWFzb24gZm9yIHVzaW5nIHRoZSBzeW5jaHJvbm91cyB2ZXJzaW9uCiAqIG9mIGEgbWV0aG9kLCBwcmVmZXIgdGhlIGFzeW5jaHJvbm91cyB2ZXJzaW9uIHRvIGF2b2lkIGJsb2NraW5nIHlvdXIgcHJvZ3JhbS4KICoKICogIyMgQ3JlYXRlIGEgZGlyZWN0b3J5CiAqCiAqIFRoZSBmb2xsb3dpbmcgY29kZSBzYW1wbGUgY3JlYXRlcyBhIGRpcmVjdG9yeSB1c2luZyB0aGUgW2NyZWF0ZV0gbWV0aG9kLgogKiBCeSBzZXR0aW5nIHRoZSBgcmVjdXJzaXZlYCBwYXJhbWV0ZXIgdG8gdHJ1ZSwgeW91IGNhbiBjcmVhdGUgdGhlCiAqIG5hbWVkIGRpcmVjdG9yeSBhbmQgYWxsIGl0cyBuZWNlc3NhcnkgcGFyZW50IGRpcmVjdG9yaWVzLAogKiBpZiB0aGV5IGRvIG5vdCBhbHJlYWR5IGV4aXN0LgogKgogKiAgICAgaW1wb3J0ICdkYXJ0OmlvJzsKICoKICogICAgIHZvaWQgbWFpbigpIHsKICogICAgICAgLy8gQ3JlYXRlcyBkaXIvIGFuZCBkaXIvc3ViZGlyLy4KICogICAgICAgbmV3IERpcmVjdG9yeSgnZGlyL3N1YmRpcicpLmNyZWF0ZShyZWN1cnNpdmU6IHRydWUpCiAqICAgICAgICAgLy8gVGhlIGNyZWF0ZWQgZGlyZWN0b3J5IGlzIHJldHVybmVkIGFzIGEgRnV0dXJlLgogKiAgICAgICAgIC50aGVuKChEaXJlY3RvcnkgZGlyZWN0b3J5KSB7CiAqICAgICAgICAgICBwcmludChkaXJlY3RvcnkucGF0aCk7CiAqICAgICAgIH0pOwogKiAgICAgfQogKgogKiAjIyBMaXN0IGEgZGlyZWN0b3J5CiAqCiAqIFVzZSB0aGUgW2xpc3RdIG9yIFtsaXN0U3luY10gbWV0aG9kcyB0byBnZXQgdGhlIGZpbGVzIGFuZCBkaXJlY3RvcmllcwogKiBjb250YWluZWQgYnkgYSBkaXJlY3RvcnkuCiAqIFNldCBgcmVjdXJzaXZlYCB0byB0cnVlIHRvIHJlY3Vyc2l2ZWx5IGxpc3QgYWxsIHN1YmRpcmVjdG9yaWVzLgogKiBTZXQgYGZvbGxvd0xpbmtzYCB0byB0cnVlIHRvIGZvbGxvdyBzeW1ib2xpYyBsaW5rcy4KICogVGhlIGxpc3QgbWV0aG9kIHJldHVybnMgYSBbU3RyZWFtXSB0aGF0IHByb3ZpZGVzIEZpbGVTeXN0ZW1FbnRpdHkKICogb2JqZWN0cy4gVXNlIHRoZSBsaXN0ZW4gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvY2VzcyBlYWNoIG9iamVjdAogKiBhcyBpdCBiZWNvbWUgYXZhaWxhYmxlLgogKgogKiAgICAgaW1wb3J0ICdkYXJ0OmlvJzsKICoKICogICAgIHZvaWQgbWFpbigpIHsKICogICAgICAgLy8gR2V0IHRoZSBzeXN0ZW0gdGVtcCBkaXJlY3RvcnkuCiAqICAgICAgIHZhciBzeXN0ZW1UZW1wRGlyID0gRGlyZWN0b3J5LnN5c3RlbVRlbXA7CiAqCiAqICAgICAgIC8vIExpc3QgZGlyZWN0b3J5IGNvbnRlbnRzLCByZWN1cnNpbmcgaW50byBzdWItZGlyZWN0b3JpZXMsCiAqICAgICAgIC8vIGJ1dCBub3QgZm9sbG93aW5nIHN5bWJvbGljIGxpbmtzLgogKiAgICAgICBzeXN0ZW1UZW1wRGlyLmxpc3QocmVjdXJzaXZlOiB0cnVlLCBmb2xsb3dMaW5rczogZmFsc2UpCiAqICAgICAgICAgLmxpc3RlbigoRmlsZVN5c3RlbUVudGl0eSBlbnRpdHkpIHsKICogICAgICAgICAgIHByaW50KGVudGl0eS5wYXRoKTsKICogICAgICAgICB9KTsKICogICAgIH0KICoKICogIyMgVGhlIHVzZSBvZiBGdXR1cmVzCiAqCiAqIEkvTyBvcGVyYXRpb25zIGNhbiBibG9jayBhIHByb2dyYW0gZm9yIHNvbWUgcGVyaW9kIG9mIHRpbWUgd2hpbGUgaXQgd2FpdHMgZm9yCiAqIHRoZSBvcGVyYXRpb24gdG8gY29tcGxldGUuIFRvIGF2b2lkIHRoaXMsIGFsbAogKiBtZXRob2RzIGludm9sdmluZyBJL08gaGF2ZSBhbiBhc3luY2hyb25vdXMgdmFyaWFudCB3aGljaCByZXR1cm5zIGEgW0Z1dHVyZV0uCiAqIFRoaXMgZnV0dXJlIGNvbXBsZXRlcyB3aGVuIHRoZSBJL08gb3BlcmF0aW9uIGZpbmlzaGVzLiBXaGlsZSB0aGUgSS9PCiAqIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcywgdGhlIERhcnQgcHJvZ3JhbSBpcyBub3QgYmxvY2tlZCwKICogYW5kIGNhbiBwZXJmb3JtIG90aGVyIG9wZXJhdGlvbnMuCiAqCiAqIEZvciBleGFtcGxlLAogKiB0aGUgW2V4aXN0c10gbWV0aG9kLCB3aGljaCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRpcmVjdG9yeSBleGlzdHMsCiAqIHJldHVybnMgYSBib29sZWFuIHZhbHVlIHVzaW5nIGEgRnV0dXJlLgogKiBVc2UgYHRoZW5gIHRvIHJlZ2lzdGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24sIHdoaWNoIGlzIGNhbGxlZCB3aGVuCiAqIHRoZSB2YWx1ZSBpcyByZWFkeS4KICoKICogICAgIGltcG9ydCAnZGFydDppbyc7CiAqCiAqICAgICBtYWluKCkgewogKiAgICAgICBmaW5hbCBteURpciA9IG5ldyBEaXJlY3RvcnkoJ2RpcicpOwogKiAgICAgICBteURpci5leGlzdHMoKS50aGVuKChpc1RoZXJlKSB7CiAqICAgICAgICAgaXNUaGVyZSA/IHByaW50KCdleGlzdHMnKSA6IHByaW50KCdub24tZXhpc3RlbnQnKTsKICogICAgICAgfSk7CiAqICAgICB9CiAqCiAqCiAqIEluIGFkZGl0aW9uIHRvIGV4aXN0cywgdGhlIFtzdGF0XSwgW3JlbmFtZV0sIGFuZAogKiBvdGhlciBtZXRob2RzLCByZXR1cm4gRnV0dXJlcy4KICoKICogIyMgT3RoZXIgcmVzb3VyY2VzCiAqCiAqICogW0RhcnQgYnkgRXhhbXBsZV0oaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL2RhcnQtYnktZXhhbXBsZS8jZmlsZXMtZGlyZWN0b3JpZXMtYW5kLXN5bWxpbmtzKQogKiAgIHByb3ZpZGVzIGFkZGl0aW9uYWwgdGFzay1vcmllbnRlZCBjb2RlIHNhbXBsZXMgdGhhdCBzaG93IGhvdyB0byB1c2UKICogICB2YXJpb3VzIEFQSSBmcm9tIHRoZSBEaXJlY3RvcnkgY2xhc3MgYW5kIHRoZSByZWxhdGVkIFtGaWxlXSBjbGFzcy4KICoKICogKiBbSS9PIGZvciBDb21tYW5kLUxpbmUKICogICBBcHBzXShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy9kYXJ0LXVwLWFuZC1ydW5uaW5nL2NoMDMuaHRtbCNkYXJ0aW8tLS1pby1mb3ItY29tbWFuZC1saW5lLWFwcHMpCiAqICAgYSBzZWN0aW9uIGZyb20gX0EgVG91ciBvZiB0aGUgRGFydCBMaWJyYXJpZXNfIGNvdmVycyBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuCiAqCiAqICogW1dyaXRlIENvbW1hbmQtTGluZSBBcHBzXShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy90dXRvcmlhbHMvY21kbGluZS8pLAogKiAgIGEgdHV0b3JpYWwgYWJvdXQgd3JpdGluZyBjb21tYW5kLWxpbmUgYXBwcywgaW5jbHVkZXMgaW5mb3JtYXRpb24gYWJvdXQKICogICBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuCiAqLwpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmFic3RyYWN0IGNsYXNzIERpcmVjdG9yeSBpbXBsZW1lbnRzIEZpbGVTeXN0ZW1FbnRpdHkgewogIC8qKgogICAqIEdldHMgdGhlIHBhdGggb2YgdGhpcyBkaXJlY3RvcnkuCiAgICovCiAgU3RyaW5nIGdldCBwYXRoOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0RpcmVjdG9yeV0gb2JqZWN0LgogICAqCiAgICogSWYgW3BhdGhdIGlzIGEgcmVsYXRpdmUgcGF0aCwgaXQgd2lsbCBiZSBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUKICAgKiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IChzZWUgW0RpcmVjdG9yeS5jdXJyZW50XSksIHdoZW4gdXNlZC4KICAgKgogICAqIElmIFtwYXRoXSBpcyBhbiBhYnNvbHV0ZSBwYXRoLCBpdCB3aWxsIGJlIGltbXVuZSB0byBjaGFuZ2VzIHRvIHRoZQogICAqIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCiAgICovCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGZhY3RvcnkgRGlyZWN0b3J5KFN0cmluZyBwYXRoKSB7CiAgICBmaW5hbCBJT092ZXJyaWRlcyBvdmVycmlkZXMgPSBJT092ZXJyaWRlcy5jdXJyZW50OwogICAgaWYgKG92ZXJyaWRlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBuZXcgX0RpcmVjdG9yeShwYXRoKTsKICAgIH0KICAgIHJldHVybiBvdmVycmlkZXMuY3JlYXRlRGlyZWN0b3J5KHBhdGgpOwogIH0KCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGZhY3RvcnkgRGlyZWN0b3J5LmZyb21SYXdQYXRoKFVpbnQ4TGlzdCBwYXRoKSB7CiAgICAvLyBUT0RPKGJrb255aSk6IEhhbmRsZSBvdmVycmlkZXMuCiAgICByZXR1cm4gbmV3IF9EaXJlY3RvcnkuZnJvbVJhd1BhdGgocGF0aCk7CiAgfQoKICAvKioKICAgKiBDcmVhdGUgYSBEaXJlY3Rvcnkgb2JqZWN0IGZyb20gYSBVUkkuCiAgICoKICAgKiBJZiBbdXJpXSBjYW5ub3QgcmVmZXJlbmNlIGEgZGlyZWN0b3J5IHRoaXMgdGhyb3dzIFtVbnN1cHBvcnRlZEVycm9yXS4KICAgKi8KICBmYWN0b3J5IERpcmVjdG9yeS5mcm9tVXJpKFVyaSB1cmkpID0+IG5ldyBEaXJlY3RvcnkodXJpLnRvRmlsZVBhdGgoKSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBkaXJlY3Rvcnkgb2JqZWN0IHBvaW50aW5nIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcKICAgKiBkaXJlY3RvcnkuCiAgICovCiAgc3RhdGljIERpcmVjdG9yeSBnZXQgY3VycmVudCB7CiAgICBmaW5hbCBJT092ZXJyaWRlcyBvdmVycmlkZXMgPSBJT092ZXJyaWRlcy5jdXJyZW50OwogICAgaWYgKG92ZXJyaWRlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfRGlyZWN0b3J5LmN1cnJlbnQ7CiAgICB9CiAgICByZXR1cm4gb3ZlcnJpZGVzLmdldEN1cnJlbnREaXJlY3RvcnkoKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBbVXJpXSByZXByZXNlbnRpbmcgdGhlIGRpcmVjdG9yeSdzIGxvY2F0aW9uLgogICAqCiAgICogVGhlIHJldHVybmVkIFVSSSdzIHNjaGVtZSBpcyBhbHdheXMgImZpbGUiIGlmIHRoZSBlbnRpdHkncyBbcGF0aF0gaXMKICAgKiBhYnNvbHV0ZSwgb3RoZXJ3aXNlIHRoZSBzY2hlbWUgd2lsbCBiZSBlbXB0eS4KICAgKiBUaGUgcmV0dXJuZWQgVVJJJ3MgcGF0aCBhbHdheXMgZW5kcyBpbiBhIHNsYXNoICgnLycpLgogICAqLwogIFVyaSBnZXQgdXJpOwoKICAvKioKICAgKiBTZXRzIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IG9mIHRoZSBEYXJ0IHByb2Nlc3MgaW5jbHVkaW5nCiAgICogYWxsIHJ1bm5pbmcgaXNvbGF0ZXMuIFRoZSBuZXcgdmFsdWUgc2V0IGNhbiBiZSBlaXRoZXIgYSBbRGlyZWN0b3J5XQogICAqIG9yIGEgW1N0cmluZ10uCiAgICoKICAgKiBUaGUgbmV3IHZhbHVlIGlzIHBhc3NlZCB0byB0aGUgT1MncyBzeXN0ZW0gY2FsbCB1bmNoYW5nZWQsIHNvIGEKICAgKiByZWxhdGl2ZSBwYXRoIHBhc3NlZCBhcyB0aGUgbmV3IHdvcmtpbmcgZGlyZWN0b3J5IHdpbGwgYmUKICAgKiByZXNvbHZlZCBieSB0aGUgT1MuCiAgICoKICAgKiBOb3RlIHRoYXQgc2V0dGluZyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpcyBhIHN5bmNocm9ub3VzCiAgICogb3BlcmF0aW9uIGFuZCB0aGF0IGl0IGNoYW5nZXMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mICphbGwqCiAgICogaXNvbGF0ZXMuCiAgICoKICAgKiBVc2UgdGhpcyB3aXRoIGNhcmUgLSBlc3BlY2lhbGx5IHdoZW4gd29ya2luZyB3aXRoIGFzeW5jaHJvbm91cwogICAqIG9wZXJhdGlvbnMgYW5kIG11bHRpcGxlIGlzb2xhdGVzLiBDaGFuZ2luZyB0aGUgd29ya2luZyBkaXJlY3RvcnksCiAgICogd2hpbGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgYXJlIHBlbmRpbmcgb3Igd2hlbiBvdGhlciBpc29sYXRlcwogICAqIGFyZSB3b3JraW5nIHdpdGggdGhlIGZpbGUgc3lzdGVtLCBjYW4gbGVhZCB0byB1bmV4cGVjdGVkIHJlc3VsdHMuCiAgICovCiAgc3RhdGljIHZvaWQgc2V0IGN1cnJlbnQocGF0aCkgewogICAgZmluYWwgSU9PdmVycmlkZXMgb3ZlcnJpZGVzID0gSU9PdmVycmlkZXMuY3VycmVudDsKICAgIGlmIChvdmVycmlkZXMgPT0gbnVsbCkgewogICAgICBfRGlyZWN0b3J5LmN1cnJlbnQgPSBwYXRoOwogICAgICByZXR1cm47CiAgICB9CiAgICBvdmVycmlkZXMuc2V0Q3VycmVudERpcmVjdG9yeShwYXRoKTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgdGhlIGRpcmVjdG9yeSB3aXRoIHRoaXMgbmFtZS4KICAgKgogICAqIElmIFtyZWN1cnNpdmVdIGlzIGZhbHNlLCBvbmx5IHRoZSBsYXN0IGRpcmVjdG9yeSBpbiB0aGUgcGF0aCBpcwogICAqIGNyZWF0ZWQuIElmIFtyZWN1cnNpdmVdIGlzIHRydWUsIGFsbCBub24tZXhpc3RpbmcgcGF0aCBjb21wb25lbnRzCiAgICogYXJlIGNyZWF0ZWQuIElmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMgbm90aGluZyBpcyBkb25lLgogICAqCiAgICogUmV0dXJucyBhIFs6RnV0dXJlPERpcmVjdG9yeT46XSB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoaXMKICAgKiBkaXJlY3Rvcnkgb25jZSBpdCBoYXMgYmVlbiBjcmVhdGVkLiBJZiB0aGUgZGlyZWN0b3J5IGNhbm5vdCBiZQogICAqIGNyZWF0ZWQgdGhlIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCBhbiBleGNlcHRpb24uCiAgICovCiAgRnV0dXJlPERpcmVjdG9yeT4gY3JlYXRlKHtib29sIHJlY3Vyc2l2ZTogZmFsc2V9KTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSBjcmVhdGVzIHRoZSBkaXJlY3Rvcnkgd2l0aCB0aGlzIG5hbWUuCiAgICoKICAgKiBJZiBbcmVjdXJzaXZlXSBpcyBmYWxzZSwgb25seSB0aGUgbGFzdCBkaXJlY3RvcnkgaW4gdGhlIHBhdGggaXMKICAgKiBjcmVhdGVkLiBJZiBbcmVjdXJzaXZlXSBpcyB0cnVlLCBhbGwgbm9uLWV4aXN0aW5nIHBhdGggY29tcG9uZW50cwogICAqIGFyZSBjcmVhdGVkLiBJZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzIG5vdGhpbmcgaXMgZG9uZS4KICAgKgogICAqIElmIHRoZSBkaXJlY3RvcnkgY2Fubm90IGJlIGNyZWF0ZWQgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KICAgKi8KICB2b2lkIGNyZWF0ZVN5bmMoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pOwoKICAvKioKICAgKiBHZXRzIHRoZSBzeXN0ZW0gdGVtcCBkaXJlY3RvcnkuCiAgICoKICAgKiBHZXRzIHRoZSBkaXJlY3RvcnkgcHJvdmlkZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0gZm9yIGNyZWF0aW5nCiAgICogdGVtcG9yYXJ5IGZpbGVzIGFuZCBkaXJlY3RvcmllcyBpbi4KICAgKiBUaGUgbG9jYXRpb24gb2YgdGhlIHN5c3RlbSB0ZW1wIGRpcmVjdG9yeSBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQsCiAgICogYW5kIG1heSBiZSBzZXQgYnkgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuCiAgICovCiAgc3RhdGljIERpcmVjdG9yeSBnZXQgc3lzdGVtVGVtcCB7CiAgICBmaW5hbCBJT092ZXJyaWRlcyBvdmVycmlkZXMgPSBJT092ZXJyaWRlcy5jdXJyZW50OwogICAgaWYgKG92ZXJyaWRlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfRGlyZWN0b3J5LnN5c3RlbVRlbXA7CiAgICB9CiAgICByZXR1cm4gb3ZlcnJpZGVzLmdldFN5c3RlbVRlbXBEaXJlY3RvcnkoKTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluIHRoaXMgZGlyZWN0b3J5LiBBZGRpdGlvbmFsIHJhbmRvbQogICAqIGNoYXJhY3RlcnMgYXJlIGFwcGVuZGVkIHRvIFtwcmVmaXhdIHRvIHByb2R1Y2UgYSB1bmlxdWUgZGlyZWN0b3J5CiAgICogbmFtZS4gSWYgW3ByZWZpeF0gaXMgbWlzc2luZyBvciBudWxsLCB0aGUgZW1wdHkgc3RyaW5nIGlzIHVzZWQKICAgKiBmb3IgW3ByZWZpeF0uCiAgICoKICAgKiBSZXR1cm5zIGEgWzpGdXR1cmU8RGlyZWN0b3J5PjpdIHRoYXQgY29tcGxldGVzIHdpdGggdGhlIG5ld2x5CiAgICogY3JlYXRlZCB0ZW1wb3JhcnkgZGlyZWN0b3J5LgogICAqLwogIEZ1dHVyZTxEaXJlY3Rvcnk+IGNyZWF0ZVRlbXAoW1N0cmluZyBwcmVmaXhdKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSBjcmVhdGVzIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiB0aGlzIGRpcmVjdG9yeS4KICAgKiBBZGRpdGlvbmFsIHJhbmRvbSBjaGFyYWN0ZXJzIGFyZSBhcHBlbmRlZCB0byBbcHJlZml4XSB0byBwcm9kdWNlCiAgICogYSB1bmlxdWUgZGlyZWN0b3J5IG5hbWUuIElmIFtwcmVmaXhdIGlzIG1pc3Npbmcgb3IgbnVsbCwgdGhlIGVtcHR5CiAgICogc3RyaW5nIGlzIHVzZWQgZm9yIFtwcmVmaXhdLgogICAqCiAgICogUmV0dXJucyB0aGUgbmV3bHkgY3JlYXRlZCB0ZW1wb3JhcnkgZGlyZWN0b3J5LgogICAqLwogIERpcmVjdG9yeSBjcmVhdGVUZW1wU3luYyhbU3RyaW5nIHByZWZpeF0pOwoKICBGdXR1cmU8U3RyaW5nPiByZXNvbHZlU3ltYm9saWNMaW5rcygpOwoKICBTdHJpbmcgcmVzb2x2ZVN5bWJvbGljTGlua3NTeW5jKCk7CgogIC8qKgogICAqIFJlbmFtZXMgdGhpcyBkaXJlY3RvcnkuIFJldHVybnMgYSBbOkZ1dHVyZTxEaXJlY3Rvcnk+Ol0gdGhhdCBjb21wbGV0ZXMKICAgKiB3aXRoIGEgW0RpcmVjdG9yeV0gaW5zdGFuY2UgZm9yIHRoZSByZW5hbWVkIGRpcmVjdG9yeS4KICAgKgogICAqIElmIG5ld1BhdGggaWRlbnRpZmllcyBhbiBleGlzdGluZyBkaXJlY3RvcnksIHRoYXQgZGlyZWN0b3J5IGlzCiAgICogcmVwbGFjZWQuIElmIG5ld1BhdGggaWRlbnRpZmllcyBhbiBleGlzdGluZyBmaWxlLCB0aGUgb3BlcmF0aW9uCiAgICogZmFpbHMgYW5kIHRoZSBmdXR1cmUgY29tcGxldGVzIHdpdGggYW4gZXhjZXB0aW9uLgogICAqLwogIEZ1dHVyZTxEaXJlY3Rvcnk+IHJlbmFtZShTdHJpbmcgbmV3UGF0aCk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgcmVuYW1lcyB0aGlzIGRpcmVjdG9yeS4gUmV0dXJucyBhIFtEaXJlY3RvcnldCiAgICogaW5zdGFuY2UgZm9yIHRoZSByZW5hbWVkIGRpcmVjdG9yeS4KICAgKgogICAqIElmIG5ld1BhdGggaWRlbnRpZmllcyBhbiBleGlzdGluZyBkaXJlY3RvcnksIHRoYXQgZGlyZWN0b3J5IGlzCiAgICogcmVwbGFjZWQuIElmIG5ld1BhdGggaWRlbnRpZmllcyBhbiBleGlzdGluZyBmaWxlIHRoZSBvcGVyYXRpb24KICAgKiBmYWlscyBhbmQgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KICAgKi8KICBEaXJlY3RvcnkgcmVuYW1lU3luYyhTdHJpbmcgbmV3UGF0aCk7CgogIC8qKgogICAqIFJldHVybnMgYSBbRGlyZWN0b3J5XSBpbnN0YW5jZSB3aG9zZSBwYXRoIGlzIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIFt0aGlzXS4KICAgKgogICAqIFRoZSBhYnNvbHV0ZSBwYXRoIGlzIGNvbXB1dGVkIGJ5IHByZWZpeGluZwogICAqIGEgcmVsYXRpdmUgcGF0aCB3aXRoIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgcmV0dXJuaW5nCiAgICogYW4gYWJzb2x1dGUgcGF0aCB1bmNoYW5nZWQuCiAgICovCiAgRGlyZWN0b3J5IGdldCBhYnNvbHV0ZTsKCiAgLyoqCiAgICogTGlzdHMgdGhlIHN1Yi1kaXJlY3RvcmllcyBhbmQgZmlsZXMgb2YgdGhpcyBbRGlyZWN0b3J5XS4KICAgKiBPcHRpb25hbGx5IHJlY3Vyc2VzIGludG8gc3ViLWRpcmVjdG9yaWVzLgogICAqCiAgICogSWYgW2ZvbGxvd0xpbmtzXSBpcyBmYWxzZSwgdGhlbiBhbnkgc3ltYm9saWMgbGlua3MgZm91bmQKICAgKiBhcmUgcmVwb3J0ZWQgYXMgW0xpbmtdIG9iamVjdHMsIHJhdGhlciB0aGFuIGFzIGRpcmVjdG9yaWVzIG9yIGZpbGVzLAogICAqIGFuZCBhcmUgbm90IHJlY3Vyc2VkIGludG8uCiAgICoKICAgKiBJZiBbZm9sbG93TGlua3NdIGlzIHRydWUsIHRoZW4gd29ya2luZyBsaW5rcyBhcmUgcmVwb3J0ZWQgYXMKICAgKiBkaXJlY3RvcmllcyBvciBmaWxlcywgZGVwZW5kaW5nIG9uCiAgICogdGhlaXIgdHlwZSwgYW5kIGxpbmtzIHRvIGRpcmVjdG9yaWVzIGFyZSByZWN1cnNlZCBpbnRvLgogICAqIEJyb2tlbiBsaW5rcyBhcmUgcmVwb3J0ZWQgYXMgW0xpbmtdIG9iamVjdHMuCiAgICogSWYgYSBzeW1ib2xpYyBsaW5rIG1ha2VzIGEgbG9vcCBpbiB0aGUgZmlsZSBzeXN0ZW0sIHRoZW4gYSByZWN1cnNpdmUKICAgKiBsaXN0aW5nIHdpbGwgbm90IGZvbGxvdyBhIGxpbmsgdHdpY2UgaW4gdGhlCiAgICogc2FtZSByZWN1cnNpdmUgZGVzY2VudCwgYnV0IHdpbGwgcmVwb3J0IGl0IGFzIGEgW0xpbmtdCiAgICogdGhlIHNlY29uZCB0aW1lIGl0IGlzIHNlZW4uCiAgICoKICAgKiBUaGUgcmVzdWx0IGlzIGEgc3RyZWFtIG9mIFtGaWxlU3lzdGVtRW50aXR5XSBvYmplY3RzCiAgICogZm9yIHRoZSBkaXJlY3RvcmllcywgZmlsZXMsIGFuZCBsaW5rcy4KICAgKi8KICBTdHJlYW08RmlsZVN5c3RlbUVudGl0eT4gbGlzdCgKICAgICAge2Jvb2wgcmVjdXJzaXZlOiBmYWxzZSwgYm9vbCBmb2xsb3dMaW5rczogdHJ1ZX0pOwoKICAvKioKICAgKiBMaXN0cyB0aGUgc3ViLWRpcmVjdG9yaWVzIGFuZCBmaWxlcyBvZiB0aGlzIFtEaXJlY3RvcnldLgogICAqIE9wdGlvbmFsbHkgcmVjdXJzZXMgaW50byBzdWItZGlyZWN0b3JpZXMuCiAgICoKICAgKiBJZiBbZm9sbG93TGlua3NdIGlzIGZhbHNlLCB0aGVuIGFueSBzeW1ib2xpYyBsaW5rcyBmb3VuZAogICAqIGFyZSByZXBvcnRlZCBhcyBbTGlua10gb2JqZWN0cywgcmF0aGVyIHRoYW4gYXMgZGlyZWN0b3JpZXMgb3IgZmlsZXMsCiAgICogYW5kIGFyZSBub3QgcmVjdXJzZWQgaW50by4KICAgKgogICAqIElmIFtmb2xsb3dMaW5rc10gaXMgdHJ1ZSwgdGhlbiB3b3JraW5nIGxpbmtzIGFyZSByZXBvcnRlZCBhcwogICAqIGRpcmVjdG9yaWVzIG9yIGZpbGVzLCBkZXBlbmRpbmcgb24KICAgKiB0aGVpciB0eXBlLCBhbmQgbGlua3MgdG8gZGlyZWN0b3JpZXMgYXJlIHJlY3Vyc2VkIGludG8uCiAgICogQnJva2VuIGxpbmtzIGFyZSByZXBvcnRlZCBhcyBbTGlua10gb2JqZWN0cy4KICAgKiBJZiBhIGxpbmsgbWFrZXMgYSBsb29wIGluIHRoZSBmaWxlIHN5c3RlbSwgdGhlbiBhIHJlY3Vyc2l2ZQogICAqIGxpc3Rpbmcgd2lsbCBub3QgZm9sbG93IGEgbGluayB0d2ljZSBpbiB0aGUKICAgKiBzYW1lIHJlY3Vyc2l2ZSBkZXNjZW50LCBidXQgd2lsbCByZXBvcnQgaXQgYXMgYSBbTGlua10KICAgKiB0aGUgc2Vjb25kIHRpbWUgaXQgaXMgc2Vlbi4KICAgKgogICAqIFJldHVybnMgYSBbTGlzdF0gY29udGFpbmluZyBbRmlsZVN5c3RlbUVudGl0eV0gb2JqZWN0cyBmb3IgdGhlCiAgICogZGlyZWN0b3JpZXMsIGZpbGVzLCBhbmQgbGlua3MuCiAgICovCiAgTGlzdDxGaWxlU3lzdGVtRW50aXR5PiBsaXN0U3luYygKICAgICAge2Jvb2wgcmVjdXJzaXZlOiBmYWxzZSwgYm9vbCBmb2xsb3dMaW5rczogdHJ1ZX0pOwoKICAvKioKICAgKiBSZXR1cm5zIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nIGZvciB0aGlzIERpcmVjdG9yeSBpbnN0YW5jZS4KICAgKi8KICBTdHJpbmcgdG9TdHJpbmcoKTsKfQqBWgBOTjwBEQEEQANOSj8xA0dGSksDSTMDKwNLK0dQAxkDTEQ9IQMZAxUqPT0pJA0JAxcDSR1DN0VEGwMZAxUrMwNFLkEvIQ8JAxkDUTFQSD4lAxBHK0QXAxkDEC0pPg0JAwM0IgMWA2FJSAMbalEDUkwcBBo3BiYGEwEGIwVKRQVIIAYcIzcdIwYsBAEcMictBAEGKwVLBkkBBkAQBiE3HSEGLAQBBjwFSjM7Bg8BBkZJFAVFPxkFRkIPBURHRkcGIjcdIQ4GKQQBBisFRUdDBT5ENQY1AQY5BUVHQwVABiwBBiUFRilGMAYkNx0kBi8EAQZIR0QTBUMiBjEBBkRGSCIFNAYtASkBJQEGTDwFREU3BiwBBkEpBUREJwYoAQZPBTBHIQYaAQY+LwU+SiAFQig9MkoxPCEFOiwGITgBBj4vBT5KIAVCKD0yQTE8IQVEJAYjOAEGQgYVAgEWZGFydDppby9kaXJlY3RvcnkuZGFydDJvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vZGlyZWN0b3J5X2ltcGwuZGFydLaaLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCmNsYXNzIF9EaXJlY3RvcnkgZXh0ZW5kcyBGaWxlU3lzdGVtRW50aXR5IGltcGxlbWVudHMgRGlyZWN0b3J5IHsKICBTdHJpbmcgX3BhdGg7CiAgVWludDhMaXN0IF9yYXdQYXRoOwoKICBfRGlyZWN0b3J5KFN0cmluZyBwYXRoKSB7CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChwYXRoLCAncGF0aCcpOwogICAgX3BhdGggPSBwYXRoOwogICAgX3Jhd1BhdGggPSBGaWxlU3lzdGVtRW50aXR5Ll90b1V0ZjhBcnJheShfcGF0aCk7CiAgfQoKICBfRGlyZWN0b3J5LmZyb21SYXdQYXRoKFVpbnQ4TGlzdCByYXdQYXRoKSB7CiAgICBpZiAocmF3UGF0aCA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdyYXdQYXRoIGNhbm5vdCBiZSBudWxsJyk7CiAgICB9CiAgICBfcmF3UGF0aCA9IEZpbGVTeXN0ZW1FbnRpdHkuX3RvTnVsbFRlcm1pbmF0ZWRVdGY4QXJyYXkocmF3UGF0aCk7CiAgICBfcGF0aCA9IEZpbGVTeXN0ZW1FbnRpdHkuX3RvU3RyaW5nRnJvbVV0ZjhBcnJheShyYXdQYXRoKTsKICB9CgogIFN0cmluZyBnZXQgcGF0aCA9PiBfcGF0aDsKCiAgZXh0ZXJuYWwgc3RhdGljIF9jdXJyZW50KF9OYW1lc3BhY2UgbmFtZXNwYWNlKTsKICBleHRlcm5hbCBzdGF0aWMgX3NldEN1cnJlbnQoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoKTsKICBleHRlcm5hbCBzdGF0aWMgX2NyZWF0ZVRlbXAoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoKTsKICBleHRlcm5hbCBzdGF0aWMgU3RyaW5nIF9zeXN0ZW1UZW1wKF9OYW1lc3BhY2UgbmFtZXNwYWNlKTsKICBleHRlcm5hbCBzdGF0aWMgX2V4aXN0cyhfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpOwogIGV4dGVybmFsIHN0YXRpYyBfY3JlYXRlKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCk7CiAgZXh0ZXJuYWwgc3RhdGljIF9kZWxldGVOYXRpdmUoCiAgICAgIF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCwgYm9vbCByZWN1cnNpdmUpOwogIGV4dGVybmFsIHN0YXRpYyBfcmVuYW1lKAogICAgICBfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgsIFN0cmluZyBuZXdQYXRoKTsKICBleHRlcm5hbCBzdGF0aWMgdm9pZCBfZmlsbFdpdGhEaXJlY3RvcnlMaXN0aW5nKAogICAgICBfTmFtZXNwYWNlIG5hbWVzcGFjZSwKICAgICAgTGlzdDxGaWxlU3lzdGVtRW50aXR5PiBsaXN0LAogICAgICBVaW50OExpc3QgcmF3UGF0aCwKICAgICAgYm9vbCByZWN1cnNpdmUsCiAgICAgIGJvb2wgZm9sbG93TGlua3MpOwoKICBzdGF0aWMgRGlyZWN0b3J5IGdldCBjdXJyZW50IHsKICAgIHZhciByZXN1bHQgPSBfY3VycmVudChfTmFtZXNwYWNlLl9uYW1lc3BhY2UpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKAogICAgICAgICAgIkdldHRpbmcgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBmYWlsZWQiLCAiIiwgcmVzdWx0KTsKICAgIH0KICAgIHJldHVybiBuZXcgX0RpcmVjdG9yeShyZXN1bHQpOwogIH0KCiAgc3RhdGljIHZvaWQgc2V0IGN1cnJlbnQocGF0aCkgewogICAgVWludDhMaXN0IF9yYXdQYXRoOwogICAgaWYgKHBhdGggaXMgX0RpcmVjdG9yeSkgewogICAgICAvLyBGb3Igb3VyIGludGVybmFsIERpcmVjdG9yeSBpbXBsZW1lbnRhdGlvbiwgZ28gYWhlYWQgYW5kIHVzZSB0aGUgcmF3CiAgICAgIC8vIHBhdGguCiAgICAgIF9yYXdQYXRoID0gcGF0aC5fcmF3UGF0aDsKICAgIH0gZWxzZSBpZiAocGF0aCBpcyBEaXJlY3RvcnkpIHsKICAgICAgLy8gRklYTUUoYmtvbnlpKTogcGFja2FnZTpmaWxlIHBhc3NlcyBpbiBpbnN0YW5jZXMgb2YgY2xhc3NlcyB3aGljaCBkbwogICAgICAvLyBub3QgaGF2ZSBfcGF0aCBkZWZpbmVkLCBzbyB3ZSB3aWxsIGZhbGxiYWNrIHRvIHVzaW5nIHRoZSBleGlzdGluZwogICAgICAvLyBwYXRoIFN0cmluZyBmb3Igbm93LgogICAgICBfcmF3UGF0aCA9IEZpbGVTeXN0ZW1FbnRpdHkuX3RvVXRmOEFycmF5KHBhdGgucGF0aCk7CiAgICB9IGVsc2UgaWYgKHBhdGggaXMgU3RyaW5nKSB7CiAgICAgIF9yYXdQYXRoID0gRmlsZVN5c3RlbUVudGl0eS5fdG9VdGY4QXJyYXkocGF0aCk7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignJHtFcnJvci5zYWZlVG9TdHJpbmcocGF0aCl9IGlzIG5vdCBhIFN0cmluZyBvcicKICAgICAgICAgICcgRGlyZWN0b3J5Jyk7CiAgICB9CiAgICBpZiAoIV9FbWJlZGRlckNvbmZpZy5fbWF5Q2hkaXIpIHsKICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAiVGhpcyBlbWJlZGRlciBkaXNhbGxvd3Mgc2V0dGluZyBEaXJlY3RvcnkuY3VycmVudCIpOwogICAgfQogICAgdmFyIHJlc3VsdCA9IF9zZXRDdXJyZW50KF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgpOwogICAgaWYgKHJlc3VsdCBpcyBBcmd1bWVudEVycm9yKSB0aHJvdyByZXN1bHQ7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oCiAgICAgICAgICAiU2V0dGluZyBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZhaWxlZCIsIHBhdGgsIHJlc3VsdCk7CiAgICB9CiAgfQoKICBVcmkgZ2V0IHVyaSB7CiAgICByZXR1cm4gbmV3IFVyaS5kaXJlY3RvcnkocGF0aCk7CiAgfQoKICBGdXR1cmU8Ym9vbD4gZXhpc3RzKCkgewogICAgcmV0dXJuIF9GaWxlLl9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoCiAgICAgICAgX0lPU2VydmljZS5kaXJlY3RvcnlFeGlzdHMsIFtudWxsLCBfcmF3UGF0aF0pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25PckVycm9yRnJvbVJlc3BvbnNlKHJlc3BvbnNlLCAiRXhpc3RzIGZhaWxlZCIpOwogICAgICB9CiAgICAgIHJldHVybiByZXNwb25zZSA9PSAxOwogICAgfSk7CiAgfQoKICBib29sIGV4aXN0c1N5bmMoKSB7CiAgICB2YXIgcmVzdWx0ID0gX2V4aXN0cyhfTmFtZXNwYWNlLl9uYW1lc3BhY2UsIF9yYXdQYXRoKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigiRXhpc3RzIGZhaWxlZCIsIHBhdGgsIHJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gKHJlc3VsdCA9PSAxKTsKICB9CgogIERpcmVjdG9yeSBnZXQgYWJzb2x1dGUgPT4gbmV3IERpcmVjdG9yeShfYWJzb2x1dGVQYXRoKTsKCiAgRnV0dXJlPERpcmVjdG9yeT4gY3JlYXRlKHtib29sIHJlY3Vyc2l2ZTogZmFsc2V9KSB7CiAgICBpZiAocmVjdXJzaXZlKSB7CiAgICAgIHJldHVybiBleGlzdHMoKS50aGVuKChleGlzdHMpIHsKICAgICAgICBpZiAoZXhpc3RzKSByZXR1cm4gdGhpczsKICAgICAgICBpZiAocGF0aCAhPSBwYXJlbnQucGF0aCkgewogICAgICAgICAgcmV0dXJuIHBhcmVudC5jcmVhdGUocmVjdXJzaXZlOiB0cnVlKS50aGVuKChfKSB7CiAgICAgICAgICAgIHJldHVybiBjcmVhdGUoKTsKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gY3JlYXRlKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfRmlsZS5fZGlzcGF0Y2hXaXRoTmFtZXNwYWNlKAogICAgICAgICAgX0lPU2VydmljZS5kaXJlY3RvcnlDcmVhdGUsIFtudWxsLCBfcmF3UGF0aF0pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgICB0aHJvdyBfZXhjZXB0aW9uT3JFcnJvckZyb21SZXNwb25zZShyZXNwb25zZSwgIkNyZWF0aW9uIGZhaWxlZCIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSk7CiAgICB9CiAgfQoKICB2b2lkIGNyZWF0ZVN5bmMoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pIHsKICAgIGlmIChyZWN1cnNpdmUpIHsKICAgICAgaWYgKGV4aXN0c1N5bmMoKSkgcmV0dXJuOwogICAgICBpZiAocGF0aCAhPSBwYXJlbnQucGF0aCkgewogICAgICAgIHBhcmVudC5jcmVhdGVTeW5jKHJlY3Vyc2l2ZTogdHJ1ZSk7CiAgICAgIH0KICAgIH0KICAgIHZhciByZXN1bHQgPSBfY3JlYXRlKF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJDcmVhdGlvbiBmYWlsZWQiLCBwYXRoLCByZXN1bHQpOwogICAgfQogIH0KCiAgc3RhdGljIERpcmVjdG9yeSBnZXQgc3lzdGVtVGVtcCA9PgogICAgICBuZXcgRGlyZWN0b3J5KF9zeXN0ZW1UZW1wKF9OYW1lc3BhY2UuX25hbWVzcGFjZSkpOwoKICBGdXR1cmU8RGlyZWN0b3J5PiBjcmVhdGVUZW1wKFtTdHJpbmcgcHJlZml4XSkgewogICAgcHJlZml4ID8/PSAnJzsKICAgIGlmIChwYXRoID09ICcnKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJEaXJlY3RvcnkuY3JlYXRlVGVtcCBjYWxsZWQgd2l0aCBhbiBlbXB0eSBwYXRoLiAiCiAgICAgICAgICAiVG8gdXNlIHRoZSBzeXN0ZW0gdGVtcCBkaXJlY3RvcnksIHVzZSBEaXJlY3Rvcnkuc3lzdGVtVGVtcCIpOwogICAgfQogICAgU3RyaW5nIGZ1bGxQcmVmaXg7CiAgICAvLyBGSVhNRShia29ueWkpOiBoZXJlIHdlJ3JlIHVzaW5nIGBwYXRoYCBkaXJlY3RseSwgd2hpY2ggbWlnaHQgY2F1c2UKICAgIC8vIGlzc3VlcyBpZiBpdCBpcyBub3QgVVRGLTggZW5jb2RlZC4KICAgIGlmIChwYXRoLmVuZHNXaXRoKCcvJykgfHwgKFBsYXRmb3JtLmlzV2luZG93cyAmJiBwYXRoLmVuZHNXaXRoKCdcXCcpKSkgewogICAgICBmdWxsUHJlZml4ID0gIiRwYXRoJHByZWZpeCI7CiAgICB9IGVsc2UgewogICAgICBmdWxsUHJlZml4ID0gIiRwYXRoJHtQbGF0Zm9ybS5wYXRoU2VwYXJhdG9yfSRwcmVmaXgiOwogICAgfQogICAgcmV0dXJuIF9GaWxlLl9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoX0lPU2VydmljZS5kaXJlY3RvcnlDcmVhdGVUZW1wLAogICAgICAgIFtudWxsLCBGaWxlU3lzdGVtRW50aXR5Ll90b1V0ZjhBcnJheShmdWxsUHJlZml4KV0pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25PckVycm9yRnJvbVJlc3BvbnNlKAogICAgICAgICAgICByZXNwb25zZSwgIkNyZWF0aW9uIG9mIHRlbXBvcmFyeSBkaXJlY3RvcnkgZmFpbGVkIik7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBEaXJlY3RvcnkocmVzcG9uc2UpOwogICAgfSk7CiAgfQoKICBEaXJlY3RvcnkgY3JlYXRlVGVtcFN5bmMoW1N0cmluZyBwcmVmaXhdKSB7CiAgICBwcmVmaXggPz89ICcnOwogICAgaWYgKHBhdGggPT0gJycpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkRpcmVjdG9yeS5jcmVhdGVUZW1wIGNhbGxlZCB3aXRoIGFuIGVtcHR5IHBhdGguICIKICAgICAgICAgICJUbyB1c2UgdGhlIHN5c3RlbSB0ZW1wIGRpcmVjdG9yeSwgdXNlIERpcmVjdG9yeS5zeXN0ZW1UZW1wIik7CiAgICB9CiAgICBTdHJpbmcgZnVsbFByZWZpeDsKICAgIC8vIEZJWE1FKGJrb255aSk6IGhlcmUgd2UncmUgdXNpbmcgYHBhdGhgIGRpcmVjdGx5LCB3aGljaCBtaWdodCBjYXVzZQogICAgLy8gaXNzdWVzIGlmIGl0IGlzIG5vdCBVVEYtOCBlbmNvZGVkLgogICAgaWYgKHBhdGguZW5kc1dpdGgoJy8nKSB8fCAoUGxhdGZvcm0uaXNXaW5kb3dzICYmIHBhdGguZW5kc1dpdGgoJ1xcJykpKSB7CiAgICAgIGZ1bGxQcmVmaXggPSAiJHBhdGgkcHJlZml4IjsKICAgIH0gZWxzZSB7CiAgICAgIGZ1bGxQcmVmaXggPSAiJHBhdGgke1BsYXRmb3JtLnBhdGhTZXBhcmF0b3J9JHByZWZpeCI7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gX2NyZWF0ZVRlbXAoCiAgICAgICAgX05hbWVzcGFjZS5fbmFtZXNwYWNlLCBGaWxlU3lzdGVtRW50aXR5Ll90b1V0ZjhBcnJheShmdWxsUHJlZml4KSk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oCiAgICAgICAgICAiQ3JlYXRpb24gb2YgdGVtcG9yYXJ5IGRpcmVjdG9yeSBmYWlsZWQiLCBmdWxsUHJlZml4LCByZXN1bHQpOwogICAgfQogICAgcmV0dXJuIG5ldyBEaXJlY3RvcnkocmVzdWx0KTsKICB9CgogIEZ1dHVyZTxEaXJlY3Rvcnk+IF9kZWxldGUoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pIHsKICAgIHJldHVybiBfRmlsZS5fZGlzcGF0Y2hXaXRoTmFtZXNwYWNlKAogICAgICAgICAgICBfSU9TZXJ2aWNlLmRpcmVjdG9yeURlbGV0ZSwgW251bGwsIF9yYXdQYXRoLCByZWN1cnNpdmVdKQogICAgICAgIC50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uT3JFcnJvckZyb21SZXNwb25zZShyZXNwb25zZSwgIkRlbGV0aW9uIGZhaWxlZCIpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CiAgfQoKICB2b2lkIF9kZWxldGVTeW5jKHtib29sIHJlY3Vyc2l2ZTogZmFsc2V9KSB7CiAgICB2YXIgcmVzdWx0ID0gX2RlbGV0ZU5hdGl2ZShfTmFtZXNwYWNlLl9uYW1lc3BhY2UsIF9yYXdQYXRoLCByZWN1cnNpdmUpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJEZWxldGlvbiBmYWlsZWQiLCBwYXRoLCByZXN1bHQpOwogICAgfQogIH0KCiAgRnV0dXJlPERpcmVjdG9yeT4gcmVuYW1lKFN0cmluZyBuZXdQYXRoKSB7CiAgICByZXR1cm4gX0ZpbGUuX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZSgKICAgICAgICBfSU9TZXJ2aWNlLmRpcmVjdG9yeVJlbmFtZSwgW251bGwsIF9yYXdQYXRoLCBuZXdQYXRoXSkudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbk9yRXJyb3JGcm9tUmVzcG9uc2UocmVzcG9uc2UsICJSZW5hbWUgZmFpbGVkIik7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBEaXJlY3RvcnkobmV3UGF0aCk7CiAgICB9KTsKICB9CgogIERpcmVjdG9yeSByZW5hbWVTeW5jKFN0cmluZyBuZXdQYXRoKSB7CiAgICBpZiAobmV3UGF0aCBpcyEgU3RyaW5nKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCk7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gX3JlbmFtZShfTmFtZXNwYWNlLl9uYW1lc3BhY2UsIF9yYXdQYXRoLCBuZXdQYXRoKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigiUmVuYW1lIGZhaWxlZCIsIHBhdGgsIHJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gbmV3IERpcmVjdG9yeShuZXdQYXRoKTsKICB9CgogIFN0cmVhbTxGaWxlU3lzdGVtRW50aXR5PiBsaXN0KAogICAgICB7Ym9vbCByZWN1cnNpdmU6IGZhbHNlLCBib29sIGZvbGxvd0xpbmtzOiB0cnVlfSkgewogICAgcmV0dXJuIG5ldyBfQXN5bmNEaXJlY3RvcnlMaXN0ZXIoCiAgICAgICAgICAgIC8vIEZJWE1FKGJrb255aSk6IGhlcmUgd2UncmUgdXNpbmcgYHBhdGhgIGRpcmVjdGx5LCB3aGljaCBtaWdodCBjYXVzZSBpc3N1ZXMKICAgICAgICAgICAgLy8gaWYgaXQgaXMgbm90IFVURi04IGVuY29kZWQuCiAgICAgICAgICAgIEZpbGVTeXN0ZW1FbnRpdHkuX3RvVXRmOEFycmF5KAogICAgICAgICAgICAgICAgRmlsZVN5c3RlbUVudGl0eS5fZW5zdXJlVHJhaWxpbmdQYXRoU2VwYXJhdG9ycyhwYXRoKSksCiAgICAgICAgICAgIHJlY3Vyc2l2ZSwKICAgICAgICAgICAgZm9sbG93TGlua3MpCiAgICAgICAgLnN0cmVhbTsKICB9CgogIExpc3Q8RmlsZVN5c3RlbUVudGl0eT4gbGlzdFN5bmMoCiAgICAgIHtib29sIHJlY3Vyc2l2ZTogZmFsc2UsIGJvb2wgZm9sbG93TGlua3M6IHRydWV9KSB7CiAgICBpZiAocmVjdXJzaXZlIGlzISBib29sIHx8IGZvbGxvd0xpbmtzIGlzISBib29sKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCk7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gPEZpbGVTeXN0ZW1FbnRpdHk+W107CiAgICBfZmlsbFdpdGhEaXJlY3RvcnlMaXN0aW5nKAogICAgICAgIF9OYW1lc3BhY2UuX25hbWVzcGFjZSwKICAgICAgICByZXN1bHQsCiAgICAgICAgLy8gRklYTUUoYmtvbnlpKTogaGVyZSB3ZSdyZSB1c2luZyBgcGF0aGAgZGlyZWN0bHksIHdoaWNoIG1pZ2h0IGNhdXNlIGlzc3VlcwogICAgICAgIC8vIGlmIGl0IGlzIG5vdCBVVEYtOCBlbmNvZGVkLgogICAgICAgIEZpbGVTeXN0ZW1FbnRpdHkuX3RvVXRmOEFycmF5KAogICAgICAgICAgICBGaWxlU3lzdGVtRW50aXR5Ll9lbnN1cmVUcmFpbGluZ1BhdGhTZXBhcmF0b3JzKHBhdGgpKSwKICAgICAgICByZWN1cnNpdmUsCiAgICAgICAgZm9sbG93TGlua3MpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJEaXJlY3Rvcnk6ICckcGF0aCciOwoKICBib29sIF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpID0+CiAgICAgIHJlc3BvbnNlIGlzIExpc3QgJiYgcmVzcG9uc2VbMF0gIT0gX3N1Y2Nlc3NSZXNwb25zZTsKCiAgX2V4Y2VwdGlvbk9yRXJyb3JGcm9tUmVzcG9uc2UocmVzcG9uc2UsIFN0cmluZyBtZXNzYWdlKSB7CiAgICBhc3NlcnQoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpOwogICAgc3dpdGNoIChyZXNwb25zZVtfZXJyb3JSZXNwb25zZUVycm9yVHlwZV0pIHsKICAgICAgY2FzZSBfaWxsZWdhbEFyZ3VtZW50UmVzcG9uc2U6CiAgICAgICAgcmV0dXJuIG5ldyBBcmd1bWVudEVycm9yKCk7CiAgICAgIGNhc2UgX29zRXJyb3JSZXNwb25zZToKICAgICAgICB2YXIgZXJyID0gbmV3IE9TRXJyb3IocmVzcG9uc2VbX29zRXJyb3JSZXNwb25zZU1lc3NhZ2VdLAogICAgICAgICAgICByZXNwb25zZVtfb3NFcnJvclJlc3BvbnNlRXJyb3JDb2RlXSk7CiAgICAgICAgcmV0dXJuIG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKG1lc3NhZ2UsIHBhdGgsIGVycik7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIG5ldyBFeGNlcHRpb24oIlVua25vd24gZXJyb3IiKTsKICAgIH0KICB9Cn0KCmFic3RyYWN0IGNsYXNzIF9Bc3luY0RpcmVjdG9yeUxpc3Rlck9wcyB7CiAgZXh0ZXJuYWwgZmFjdG9yeSBfQXN5bmNEaXJlY3RvcnlMaXN0ZXJPcHMoaW50IHBvaW50ZXIpOwoKICBpbnQgZ2V0UG9pbnRlcigpOwp9CgpjbGFzcyBfQXN5bmNEaXJlY3RvcnlMaXN0ZXIgewogIHN0YXRpYyBjb25zdCBpbnQgbGlzdEZpbGUgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgbGlzdERpcmVjdG9yeSA9IDE7CiAgc3RhdGljIGNvbnN0IGludCBsaXN0TGluayA9IDI7CiAgc3RhdGljIGNvbnN0IGludCBsaXN0RXJyb3IgPSAzOwogIHN0YXRpYyBjb25zdCBpbnQgbGlzdERvbmUgPSA0OwoKICBzdGF0aWMgY29uc3QgaW50IHJlc3BvbnNlVHlwZSA9IDA7CiAgc3RhdGljIGNvbnN0IGludCByZXNwb25zZVBhdGggPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgcmVzcG9uc2VDb21wbGV0ZSA9IDE7CiAgc3RhdGljIGNvbnN0IGludCByZXNwb25zZUVycm9yID0gMjsKCiAgZmluYWwgVWludDhMaXN0IHJhd1BhdGg7CiAgZmluYWwgYm9vbCByZWN1cnNpdmU7CiAgZmluYWwgYm9vbCBmb2xsb3dMaW5rczsKCiAgU3RyZWFtQ29udHJvbGxlcjxGaWxlU3lzdGVtRW50aXR5PiBjb250cm9sbGVyOwogIGJvb2wgY2FuY2VsZWQgPSBmYWxzZTsKICBib29sIG5leHRSdW5uaW5nID0gZmFsc2U7CiAgYm9vbCBjbG9zZWQgPSBmYWxzZTsKICBfQXN5bmNEaXJlY3RvcnlMaXN0ZXJPcHMgX29wczsKICBDb21wbGV0ZXIgY2xvc2VDb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyKCk7CgogIF9Bc3luY0RpcmVjdG9yeUxpc3Rlcih0aGlzLnJhd1BhdGgsIHRoaXMucmVjdXJzaXZlLCB0aGlzLmZvbGxvd0xpbmtzKSB7CiAgICBjb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8RmlsZVN5c3RlbUVudGl0eT4oCiAgICAgICAgb25MaXN0ZW46IG9uTGlzdGVuLCBvblJlc3VtZTogb25SZXN1bWUsIG9uQ2FuY2VsOiBvbkNhbmNlbCwgc3luYzogdHJ1ZSk7CiAgfQoKICAvLyBXQVJOSU5HOgogIC8vIENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIGluY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnQgb24gdGhlIG5hdGl2ZQogIC8vIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIGFzeW5jIGRpcmVjdG9yeSBsaXN0ZXIgb3BlcmF0aW9ucy4gSXQgc2hvdWxkCiAgLy8gb25seSBiZSBjYWxsZWQgdG8gcGFzcyB0aGUgcG9pbnRlciB0byB0aGUgSU8gU2VydmljZSwgd2hpY2ggd2lsbCBkZWNyZW1lbnQKICAvLyB0aGUgcmVmZXJlbmNlIGNvdW50IHdoZW4gaXQgaXMgZmluaXNoZWQgd2l0aCBpdC4KICBpbnQgX3BvaW50ZXIoKSB7CiAgICByZXR1cm4gKF9vcHMgPT0gbnVsbCkgPyBudWxsIDogX29wcy5nZXRQb2ludGVyKCk7CiAgfQoKICBTdHJlYW08RmlsZVN5c3RlbUVudGl0eT4gZ2V0IHN0cmVhbSA9PiBjb250cm9sbGVyLnN0cmVhbTsKCiAgdm9pZCBvbkxpc3RlbigpIHsKICAgIF9GaWxlLl9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoX0lPU2VydmljZS5kaXJlY3RvcnlMaXN0U3RhcnQsCiAgICAgICAgW251bGwsIHJhd1BhdGgsIHJlY3Vyc2l2ZSwgZm9sbG93TGlua3NdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAocmVzcG9uc2UgaXMgaW50KSB7CiAgICAgICAgX29wcyA9IG5ldyBfQXN5bmNEaXJlY3RvcnlMaXN0ZXJPcHMocmVzcG9uc2UpOwogICAgICAgIG5leHQoKTsKICAgICAgfSBlbHNlIGlmIChyZXNwb25zZSBpcyBFcnJvcikgewogICAgICAgIGNvbnRyb2xsZXIuYWRkRXJyb3IocmVzcG9uc2UsIHJlc3BvbnNlLnN0YWNrVHJhY2UpOwogICAgICAgIGNsb3NlKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZXJyb3IocmVzcG9uc2UpOwogICAgICAgIGNsb3NlKCk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgdm9pZCBvblJlc3VtZSgpIHsKICAgIGlmICghbmV4dFJ1bm5pbmcpIHsKICAgICAgbmV4dCgpOwogICAgfQogIH0KCiAgRnV0dXJlIG9uQ2FuY2VsKCkgewogICAgY2FuY2VsZWQgPSB0cnVlOwogICAgLy8gSWYgd2UgYXJlIGFjdGl2ZSwgYnV0IG5vdCByZXF1ZXN0aW5nLCBjbG9zZS4KICAgIGlmICghbmV4dFJ1bm5pbmcpIHsKICAgICAgY2xvc2UoKTsKICAgIH0KCiAgICByZXR1cm4gY2xvc2VDb21wbGV0ZXIuZnV0dXJlOwogIH0KCiAgdm9pZCBuZXh0KCkgewogICAgaWYgKGNhbmNlbGVkKSB7CiAgICAgIGNsb3NlKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChjb250cm9sbGVyLmlzUGF1c2VkIHx8IG5leHRSdW5uaW5nKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBwb2ludGVyID0gX3BvaW50ZXIoKTsKICAgIGlmIChwb2ludGVyID09IG51bGwpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgbmV4dFJ1bm5pbmcgPSB0cnVlOwogICAgX0lPU2VydmljZS5fZGlzcGF0Y2goX0lPU2VydmljZS5kaXJlY3RvcnlMaXN0TmV4dCwgW3BvaW50ZXJdKQogICAgICAgIC50aGVuKChyZXN1bHQpIHsKICAgICAgbmV4dFJ1bm5pbmcgPSBmYWxzZTsKICAgICAgaWYgKHJlc3VsdCBpcyBMaXN0KSB7CiAgICAgICAgbmV4dCgpOwogICAgICAgIGFzc2VydChyZXN1bHQubGVuZ3RoICUgMiA9PSAwKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgYXNzZXJ0KGkgJSAyID09IDApOwogICAgICAgICAgc3dpdGNoIChyZXN1bHRbaSsrXSkgewogICAgICAgICAgICBjYXNlIGxpc3RGaWxlOgogICAgICAgICAgICAgIGNvbnRyb2xsZXIuYWRkKG5ldyBGaWxlLmZyb21SYXdQYXRoKHJlc3VsdFtpXSkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIGxpc3REaXJlY3Rvcnk6CiAgICAgICAgICAgICAgY29udHJvbGxlci5hZGQobmV3IERpcmVjdG9yeS5mcm9tUmF3UGF0aChyZXN1bHRbaV0pKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBsaXN0TGluazoKICAgICAgICAgICAgICBjb250cm9sbGVyLmFkZChuZXcgTGluay5mcm9tUmF3UGF0aChyZXN1bHRbaV0pKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBsaXN0RXJyb3I6CiAgICAgICAgICAgICAgZXJyb3IocmVzdWx0W2ldKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBsaXN0RG9uZToKICAgICAgICAgICAgICBjYW5jZWxlZCA9IHRydWU7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjb250cm9sbGVyLmFkZEVycm9yKG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciIpKTsKICAgICAgfQogICAgfSk7CiAgfQoKICB2b2lkIF9jbGVhbnVwKCkgewogICAgY29udHJvbGxlci5jbG9zZSgpOwogICAgY2xvc2VDb21wbGV0ZXIuY29tcGxldGUoKTsKICAgIF9vcHMgPSBudWxsOwogIH0KCiAgdm9pZCBjbG9zZSgpIHsKICAgIGlmIChjbG9zZWQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKG5leHRSdW5uaW5nKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNsb3NlZCA9IHRydWU7CgogICAgdmFyIHBvaW50ZXIgPSBfcG9pbnRlcigpOwogICAgaWYgKHBvaW50ZXIgPT0gbnVsbCkgewogICAgICBfY2xlYW51cCgpOwogICAgfSBlbHNlIHsKICAgICAgX0lPU2VydmljZS5fZGlzcGF0Y2goX0lPU2VydmljZS5kaXJlY3RvcnlMaXN0U3RvcCwgW3BvaW50ZXJdKQogICAgICAgICAgLndoZW5Db21wbGV0ZShfY2xlYW51cCk7CiAgICB9CiAgfQoKICB2b2lkIGVycm9yKG1lc3NhZ2UpIHsKICAgIHZhciBlcnJvclR5cGUgPSBtZXNzYWdlW3Jlc3BvbnNlRXJyb3JdW19lcnJvclJlc3BvbnNlRXJyb3JUeXBlXTsKICAgIGlmIChlcnJvclR5cGUgPT0gX2lsbGVnYWxBcmd1bWVudFJlc3BvbnNlKSB7CiAgICAgIGNvbnRyb2xsZXIuYWRkRXJyb3IobmV3IEFyZ3VtZW50RXJyb3IoKSk7CiAgICB9IGVsc2UgaWYgKGVycm9yVHlwZSA9PSBfb3NFcnJvclJlc3BvbnNlKSB7CiAgICAgIHZhciByZXNwb25zZUVycm9ySW5mbyA9IG1lc3NhZ2VbcmVzcG9uc2VFcnJvcl07CiAgICAgIHZhciBlcnIgPSBuZXcgT1NFcnJvcihyZXNwb25zZUVycm9ySW5mb1tfb3NFcnJvclJlc3BvbnNlTWVzc2FnZV0sCiAgICAgICAgICByZXNwb25zZUVycm9ySW5mb1tfb3NFcnJvclJlc3BvbnNlRXJyb3JDb2RlXSk7CiAgICAgIHZhciBlcnJvclBhdGggPSBtZXNzYWdlW3Jlc3BvbnNlUGF0aF07CiAgICAgIGlmIChlcnJvclBhdGggPT0gbnVsbCkgewogICAgICAgIGVycm9yUGF0aCA9IHV0ZjguZGVjb2RlKHJhd1BhdGgsIGFsbG93TWFsZm9ybWVkOiB0cnVlKTsKICAgICAgfSBlbHNlIGlmIChlcnJvclBhdGggaXMgVWludDhMaXN0KSB7CiAgICAgICAgZXJyb3JQYXRoID0gdXRmOC5kZWNvZGUobWVzc2FnZVtyZXNwb25zZVBhdGhdLCBhbGxvd01hbGZvcm1lZDogdHJ1ZSk7CiAgICAgIH0KICAgICAgY29udHJvbGxlci5hZGRFcnJvcigKICAgICAgICAgIG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJEaXJlY3RvcnkgbGlzdGluZyBmYWlsZWQiLCBlcnJvclBhdGgsIGVycikpOwogICAgfSBlbHNlIHsKICAgICAgY29udHJvbGxlci5hZGRFcnJvcihuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IiKSk7CiAgICB9CiAgfQp9CoHBAE5OPAERAUEQFgEcLhI1BAEuGzkGRT4EARwBMkhIPEREIUAbQDIcIxkWGQEhMh0lQwYjBAEiGB5NDyAkTUseOyE2DU8ZBiYiQAY/Lx0lRQYEARAkBAEaKUgoSAgcCAQBFjsdRAYaBAE6ATYVJiEjOx0OERsKCg0rSipMChUKBgQBLRUgISwIBjsdRgYEASU5ATITFlFJBhdKKk0jDTwGSE0oLUEIJggEAS4TFlFJBhdKKk0jDTwGHksdJUkGIgQBNylFGyhKCBMIBAEuTB1GBgQBLSlRKEgIJQgEASkeIQZEHUQGIwQBITkmWSsrRxcZEQQBIzk2IQYnHx8QVScnQxMWEwQBLQElOwE8KDElJB1BMjwPLwYEAgEqOgEUAgEeISYhIiEBJSUpJgEbGBoBMRkcFyEuAUo5UQQBDktNUDYTNgQBPAEUQEMdNxAmPBEPGREICAQBFBgOBgQBFhU0GA8GASIEARAUDw4GLg4GHhsOBhhCGRscECgyHiEbPxUgRBUbPxUcIBUbHxYMCg9ICAgEARQYHxEEARESDgYXDgYTAR4bEg1EIwYEARhFMTAwNkg5LR9AK04IG1ANRgYEAgEbZGFydDppby9kaXJlY3RvcnlfaW1wbC5kYXJ0M29yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9lbWJlZGRlcl9jb25maWcuZGFydIUoLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCi8vLyBFbWJlZGRlci1zcGVjaWZpYywgZmluZS1ncmFpbmVkIGRhcnQ6aW8gY29uZmlndXJhdGlvbi4KLy8vCi8vLyBUaGlzIGNsYXNzIGNvbnRhaW5zIHBlci1Jc29sYXRlIGZsYWdzIHRoYXQgYW4gZW1iZWRkZXIgY2FuIHNldCB0byBwdXQKLy8vIGZpbmUtZ3JhaW5lZCBsaW1pdGF0aW9ucyBvbiB3aGF0IHByb2Nlc3MtdmlzaWJsZSBvcGVyYXRpb25zIElzb2xhdGVzIGFyZQovLy8gcGVybWl0dGVkIHRvIHVzZSAoZS5nLiBleGl0KCkpLiBCeSBkZWZhdWx0LCB0aGUgd2hvbGUgZGFydDppbyBBUEkgaXMKLy8vIGVuYWJsZWQuIFdoZW4gYSBkaXNhbGxvd2VkIG9wZXJhdGlvbiBpcyBhdHRlbXB0ZWQsIGFuIGBVbnN1cHBvcnRlZEVycm9yYCBpcwovLy8gdGhyb3duLgpAcHJhZ21hKCd2bTplbnRyeS1wb2ludCcpCmFic3RyYWN0IGNsYXNzIF9FbWJlZGRlckNvbmZpZyB7CiAgLy8vIFRoZSBJc29sYXRlIG1heSBzZXQgRGlyZWN0b3J5LmN1cnJlbnQuCiAgc3RhdGljIGJvb2wgX21heUNoZGlyID0gdHJ1ZTsKCiAgLy8vIFRoZSBJc29sYXRlIG1heSBjYWxsIGV4aXQoKS4KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgc3RhdGljIGJvb2wgX21heUV4aXQgPSB0cnVlOwoKICAvLyBUaGUgSXNvbGF0ZSBtYXkgc2V0IFN0ZGluLmVjaG9Nb2RlLgogIEBwcmFnbWEoJ3ZtOmVudHJ5LXBvaW50JykKICBzdGF0aWMgYm9vbCBfbWF5U2V0RWNob01vZGUgPSB0cnVlOwoKICAvLyBUaGUgSXNvbGF0ZSBtYXkgc2V0IFN0ZGluLmxpbmVNb2RlLgogIEBwcmFnbWEoJ3ZtOmVudHJ5LXBvaW50JykKICBzdGF0aWMgYm9vbCBfbWF5U2V0TGluZU1vZGUgPSB0cnVlOwoKICAvLy8gVGhlIElzb2xhdGUgbWF5IGNhbGwgc2xlZXAoKS4KICBAcHJhZ21hKCd2bTplbnRyeS1wb2ludCcpCiAgc3RhdGljIGJvb2wgX21heVNsZWVwID0gdHJ1ZTsKCiAgLy8gVE9ETyh6cmEpOiBDb25zaWRlciBhZGRpbmc6CiAgLy8gLSBhbiBvcHRpb24gdG8gZGlzYWxsb3cgbW9kaWZ5aW5nIFNlY3VyaXR5Q29udGV4dC5kZWZhdWx0Q29udGV4dAogIC8vIC0gYW4gb3B0aW9uIHRvIGRpc2FsbG93IGNsb3Npbmcgc3Rkb3V0IGFuZCBzdGRlcnIuCn0KKABOTjwBEQE7BEpNSVAMGiEtIAEjHB8BKRwmASkcJgEkHCABIUY4AgEcZGFydDppby9lbWJlZGRlcl9jb25maWcuZGFydDBvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vZXZlbnRoYW5kbGVyLmRhcnSBUS8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuaW87CgpjbGFzcyBfRXZlbnRIYW5kbGVyIHsKICBleHRlcm5hbCBzdGF0aWMgdm9pZCBfc2VuZERhdGEoT2JqZWN0IHNlbmRlciwgU2VuZFBvcnQgc2VuZFBvcnQsIGludCBkYXRhKTsKfQoLAE5OPAERARZOAgEZZGFydDppby9ldmVudGhhbmRsZXIuZGFydDdvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvYmluL2V2ZW50aGFuZGxlcl9wYXRjaC5kYXJ0geYvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29tbW9uX3BhdGNoLmRhcnQiOwoKQHBhdGNoCmNsYXNzIF9FdmVudEhhbmRsZXIgewogIEBwYXRjaAogIHN0YXRpYyB2b2lkIF9zZW5kRGF0YShPYmplY3Qgc2VuZGVyLCBTZW5kUG9ydCBzZW5kUG9ydCwgaW50IGRhdGEpCiAgICAgIG5hdGl2ZSAiRXZlbnRIYW5kbGVyX1NlbmREYXRhIjsKCiAgc3RhdGljIGludCBfdGltZXJNaWxsaXNlY29uZENsb2NrKCkKICAgICAgbmF0aXZlICJFdmVudEhhbmRsZXJfVGltZXJNaWxsaXNlY29uZENsb2NrIjsKfQoRAE5OPAEgAQcWCUQmASYzAgElZGFydDppby1wYXRjaC9ldmVudGhhbmRsZXJfcGF0Y2guZGFydChvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vZmlsZS5kYXJ0wACFAS8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuaW87CgovKioKICogVGhlIG1vZGVzIGluIHdoaWNoIGEgRmlsZSBjYW4gYmUgb3BlbmVkLgogKi8KY2xhc3MgRmlsZU1vZGUgewogIC8vLyBUaGUgbW9kZSBmb3Igb3BlbmluZyBhIGZpbGUgb25seSBmb3IgcmVhZGluZy4KICBzdGF0aWMgY29uc3QgcmVhZCA9IGNvbnN0IEZpbGVNb2RlLl9pbnRlcm5hbCgwKTsKICBARGVwcmVjYXRlZCgiVXNlIHJlYWQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFJFQUQgPSByZWFkOwoKICAvLy8gTW9kZSBmb3Igb3BlbmluZyBhIGZpbGUgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIFRoZSBmaWxlIGlzCiAgLy8vIG92ZXJ3cml0dGVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLiBUaGUgZmlsZSBpcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90CiAgLy8vIGFscmVhZHkgZXhpc3QuCiAgc3RhdGljIGNvbnN0IHdyaXRlID0gY29uc3QgRmlsZU1vZGUuX2ludGVybmFsKDEpOwogIEBEZXByZWNhdGVkKCJVc2Ugd3JpdGUgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFdSSVRFID0gd3JpdGU7CgogIC8vLyBNb2RlIGZvciBvcGVuaW5nIGEgZmlsZSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyB0byB0aGUKICAvLy8gZW5kIG9mIGl0LiBUaGUgZmlsZSBpcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCiAgc3RhdGljIGNvbnN0IGFwcGVuZCA9IGNvbnN0IEZpbGVNb2RlLl9pbnRlcm5hbCgyKTsKICBARGVwcmVjYXRlZCgiVXNlIGFwcGVuZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgQVBQRU5EID0gYXBwZW5kOwoKICAvLy8gTW9kZSBmb3Igb3BlbmluZyBhIGZpbGUgZm9yIHdyaXRpbmcgKm9ubHkqLiBUaGUgZmlsZSBpcwogIC8vLyBvdmVyd3JpdHRlbiBpZiBpdCBhbHJlYWR5IGV4aXN0cy4gVGhlIGZpbGUgaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdAogIC8vLyBhbHJlYWR5IGV4aXN0LgogIHN0YXRpYyBjb25zdCB3cml0ZU9ubHkgPSBjb25zdCBGaWxlTW9kZS5faW50ZXJuYWwoMyk7CiAgQERlcHJlY2F0ZWQoIlVzZSB3cml0ZU9ubHkgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFdSSVRFX09OTFkgPSB3cml0ZU9ubHk7CgogIC8vLyBNb2RlIGZvciBvcGVuaW5nIGEgZmlsZSBmb3Igd3JpdGluZyAqb25seSogdG8gdGhlCiAgLy8vIGVuZCBvZiBpdC4gVGhlIGZpbGUgaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgogIHN0YXRpYyBjb25zdCB3cml0ZU9ubHlBcHBlbmQgPSBjb25zdCBGaWxlTW9kZS5faW50ZXJuYWwoNCk7CiAgQERlcHJlY2F0ZWQoIlVzZSB3cml0ZU9ubHlBcHBlbmQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFdSSVRFX09OTFlfQVBQRU5EID0gd3JpdGVPbmx5QXBwZW5kOwoKICBmaW5hbCBpbnQgX21vZGU7CgogIGNvbnN0IEZpbGVNb2RlLl9pbnRlcm5hbCh0aGlzLl9tb2RlKTsKfQoKLy8vIFRoZSBtb2RlIGZvciBvcGVuaW5nIGEgZmlsZSBvbmx5IGZvciByZWFkaW5nLgpARGVwcmVjYXRlZCgiVXNlIEZpbGVNb2RlLnJlYWQgaW5zdGVhZCIpCmNvbnN0IFJFQUQgPSBGaWxlTW9kZS5yZWFkOwoKLy8vIFRoZSBtb2RlIGZvciBvcGVuaW5nIGEgZmlsZSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4gVGhlIGZpbGUgaXMKLy8vIG92ZXJ3cml0dGVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLiBUaGUgZmlsZSBpcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90Ci8vLyBhbHJlYWR5IGV4aXN0LgpARGVwcmVjYXRlZCgiVXNlIEZpbGVNb2RlLndyaXRlIGluc3RlYWQiKQpjb25zdCBXUklURSA9IEZpbGVNb2RlLndyaXRlOwoKLy8vIFRoZSBtb2RlIGZvciBvcGVuaW5nIGEgZmlsZSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyB0byB0aGUKLy8vIGVuZCBvZiBpdC4gVGhlIGZpbGUgaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgpARGVwcmVjYXRlZCgiVXNlIEZpbGVNb2RlLmFwcGVuZCBpbnN0ZWFkIikKY29uc3QgQVBQRU5EID0gRmlsZU1vZGUuYXBwZW5kOwoKLy8vIE1vZGUgZm9yIG9wZW5pbmcgYSBmaWxlIGZvciB3cml0aW5nICpvbmx5Ki4gVGhlIGZpbGUgaXMKLy8vIG92ZXJ3cml0dGVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLiBUaGUgZmlsZSBpcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90Ci8vLyBhbHJlYWR5IGV4aXN0LgpARGVwcmVjYXRlZCgiVXNlIEZpbGVNb2RlLndyaXRlT25seSBpbnN0ZWFkIikKY29uc3QgV1JJVEVfT05MWSA9IEZpbGVNb2RlLndyaXRlT25seTsKCi8vLyBNb2RlIGZvciBvcGVuaW5nIGEgZmlsZSBmb3Igd3JpdGluZyAqb25seSogdG8gdGhlCi8vLyBlbmQgb2YgaXQuIFRoZSBmaWxlIGlzIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KQERlcHJlY2F0ZWQoIlVzZSBGaWxlTW9kZS53cml0ZU9ubHlBcHBlbmQgaW5zdGVhZCIpCmNvbnN0IFdSSVRFX09OTFlfQVBQRU5EID0gRmlsZU1vZGUud3JpdGVPbmx5QXBwZW5kOwoKLy8vIFR5cGUgb2YgbG9jayB3aGVuIHJlcXVlc3RpbmcgYSBsb2NrIG9uIGEgZmlsZS4KY2xhc3MgRmlsZUxvY2sgewogIC8vLyBTaGFyZWQgZmlsZSBsb2NrLgogIHN0YXRpYyBjb25zdCBzaGFyZWQgPSBjb25zdCBGaWxlTG9jay5faW50ZXJuYWwoMSk7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaGFyZWQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFNIQVJFRCA9IHNoYXJlZDsKCiAgLy8vIEV4Y2x1c2l2ZSBmaWxlIGxvY2suCiAgc3RhdGljIGNvbnN0IGV4Y2x1c2l2ZSA9IGNvbnN0IEZpbGVMb2NrLl9pbnRlcm5hbCgyKTsKICBARGVwcmVjYXRlZCgiVXNlIGV4Y2x1c2l2ZSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgRVhDTFVTSVZFID0gZXhjbHVzaXZlOwoKICAvLy8gQmxvY2tpbmcgc2hhcmVkIGZpbGUgbG9jay4KICBzdGF0aWMgY29uc3QgYmxvY2tpbmdTaGFyZWQgPSBjb25zdCBGaWxlTG9jay5faW50ZXJuYWwoMyk7CiAgQERlcHJlY2F0ZWQoIlVzZSBibG9ja2luZ1NoYXJlZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgQkxPQ0tJTkdfU0hBUkVEID0gYmxvY2tpbmdTaGFyZWQ7CgogIC8vLyBCbG9ja2luZyBleGNsdXNpdmUgZmlsZSBsb2NrLgogIHN0YXRpYyBjb25zdCBibG9ja2luZ0V4Y2x1c2l2ZSA9IGNvbnN0IEZpbGVMb2NrLl9pbnRlcm5hbCg0KTsKICBARGVwcmVjYXRlZCgiVXNlIGJsb2NraW5nRXhjbHVzaXZlIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBCTE9DS0lOR19FWENMVVNJVkUgPSBibG9ja2luZ0V4Y2x1c2l2ZTsKCiAgZmluYWwgaW50IF90eXBlOwoKICBjb25zdCBGaWxlTG9jay5faW50ZXJuYWwodGhpcy5fdHlwZSk7Cn0KCi8qKgogKiBBIHJlZmVyZW5jZSB0byBhIGZpbGUgb24gdGhlIGZpbGUgc3lzdGVtLgogKgogKiBBIEZpbGUgaW5zdGFuY2UgaXMgYW4gb2JqZWN0IHRoYXQgaG9sZHMgYSBbcGF0aF0gb24gd2hpY2ggb3BlcmF0aW9ucyBjYW4KICogYmUgcGVyZm9ybWVkLgogKiBZb3UgY2FuIGdldCB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgZmlsZSB1c2luZyB0aGUgZ2V0dGVyIFtwYXJlbnRdLAogKiBhIHByb3BlcnR5IGluaGVyaXRlZCBmcm9tIFtGaWxlU3lzdGVtRW50aXR5XS4KICoKICogQ3JlYXRlIGEgbmV3IEZpbGUgb2JqZWN0IHdpdGggYSBwYXRobmFtZSB0byBhY2Nlc3MgdGhlIHNwZWNpZmllZCBmaWxlIG9uIHRoZQogKiBmaWxlIHN5c3RlbSBmcm9tIHlvdXIgcHJvZ3JhbS4KICoKICogICAgIHZhciBteUZpbGUgPSBuZXcgRmlsZSgnZmlsZS50eHQnKTsKICoKICogVGhlIEZpbGUgY2xhc3MgY29udGFpbnMgbWV0aG9kcyBmb3IgbWFuaXB1bGF0aW5nIGZpbGVzIGFuZCB0aGVpciBjb250ZW50cy4KICogVXNpbmcgbWV0aG9kcyBpbiB0aGlzIGNsYXNzLCB5b3UgY2FuIG9wZW4gYW5kIGNsb3NlIGZpbGVzLCByZWFkIHRvIGFuZCB3cml0ZQogKiBmcm9tIHRoZW0sIGNyZWF0ZSBhbmQgZGVsZXRlIHRoZW0sIGFuZCBjaGVjayBmb3IgdGhlaXIgZXhpc3RlbmNlLgogKgogKiBXaGVuIHJlYWRpbmcgb3Igd3JpdGluZyBhIGZpbGUsIHlvdSBjYW4gdXNlIHN0cmVhbXMgKHdpdGggW29wZW5SZWFkXSksCiAqIHJhbmRvbSBhY2Nlc3Mgb3BlcmF0aW9ucyAod2l0aCBbb3Blbl0pLAogKiBvciBjb252ZW5pZW5jZSBtZXRob2RzIHN1Y2ggYXMgW3JlYWRBc1N0cmluZ10sCiAqCiAqIE1vc3QgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIG9jY3VyIGluIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgcGFpcnMsCiAqIGZvciBleGFtcGxlLCBbcmVhZEFzU3RyaW5nXSBhbmQgW3JlYWRBc1N0cmluZ1N5bmNdLgogKiBVbmxlc3MgeW91IGhhdmUgYSBzcGVjaWZpYyByZWFzb24gZm9yIHVzaW5nIHRoZSBzeW5jaHJvbm91cyB2ZXJzaW9uCiAqIG9mIGEgbWV0aG9kLCBwcmVmZXIgdGhlIGFzeW5jaHJvbm91cyB2ZXJzaW9uIHRvIGF2b2lkIGJsb2NraW5nIHlvdXIgcHJvZ3JhbS4KICoKICogIyMgSWYgcGF0aCBpcyBhIGxpbmsKICoKICogSWYgW3BhdGhdIGlzIGEgc3ltYm9saWMgbGluaywgcmF0aGVyIHRoYW4gYSBmaWxlLAogKiB0aGVuIHRoZSBtZXRob2RzIG9mIEZpbGUgb3BlcmF0ZSBvbiB0aGUgdWx0aW1hdGUgdGFyZ2V0IG9mIHRoZQogKiBsaW5rLCBleGNlcHQgZm9yIFtkZWxldGVdIGFuZCBbZGVsZXRlU3luY10sIHdoaWNoIG9wZXJhdGUgb24KICogdGhlIGxpbmsuCiAqCiAqICMjIFJlYWQgZnJvbSBhIGZpbGUKICoKICogVGhlIGZvbGxvd2luZyBjb2RlIHNhbXBsZSByZWFkcyB0aGUgZW50aXJlIGNvbnRlbnRzIGZyb20gYSBmaWxlIGFzIGEgc3RyaW5nCiAqIHVzaW5nIHRoZSBhc3luY2hyb25vdXMgW3JlYWRBc1N0cmluZ10gbWV0aG9kOgogKgogKiAgICAgaW1wb3J0ICdkYXJ0OmFzeW5jJzsKICogICAgIGltcG9ydCAnZGFydDppbyc7CiAqCiAqICAgICB2b2lkIG1haW4oKSB7CiAqICAgICAgIG5ldyBGaWxlKCdmaWxlLnR4dCcpLnJlYWRBc1N0cmluZygpLnRoZW4oKFN0cmluZyBjb250ZW50cykgewogKiAgICAgICAgIHByaW50KGNvbnRlbnRzKTsKICogICAgICAgfSk7CiAqICAgICB9CiAqCiAqIEEgbW9yZSBmbGV4aWJsZSBhbmQgdXNlZnVsIHdheSB0byByZWFkIGEgZmlsZSBpcyB3aXRoIGEgW1N0cmVhbV0uCiAqIE9wZW4gdGhlIGZpbGUgd2l0aCBbb3BlblJlYWRdLCB3aGljaCByZXR1cm5zIGEgc3RyZWFtIHRoYXQKICogcHJvdmlkZXMgdGhlIGRhdGEgaW4gdGhlIGZpbGUgYXMgY2h1bmtzIG9mIGJ5dGVzLgogKiBMaXN0ZW4gdG8gdGhlIHN0cmVhbSBmb3IgZGF0YSBhbmQgcHJvY2VzcyBhcyBuZWVkZWQuCiAqIFlvdSBjYW4gdXNlIHZhcmlvdXMgdHJhbnNmb3JtZXJzIGluIHN1Y2Nlc3Npb24gdG8gbWFuaXB1bGF0ZSB0aGUKICogZGF0YSBpbnRvIHRoZSByZXF1aXJlZCBmb3JtYXQgb3IgdG8gcHJlcGFyZSBpdCBmb3Igb3V0cHV0LgogKgogKiBZb3UgbWlnaHQgd2FudCB0byB1c2UgYSBzdHJlYW0gdG8gcmVhZCBsYXJnZSBmaWxlcywKICogdG8gbWFuaXB1bGF0ZSB0aGUgZGF0YSB3aXRoIHRyYW5zZm9ybWVycywKICogb3IgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBhbm90aGVyIEFQSSwgc3VjaCBhcyBbV2ViU29ja2V0XXMuCiAqCiAqICAgICBpbXBvcnQgJ2RhcnQ6aW8nOwogKiAgICAgaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwogKiAgICAgaW1wb3J0ICdkYXJ0OmFzeW5jJzsKICoKICogICAgIG1haW4oKSB7CiAqICAgICAgIGZpbmFsIGZpbGUgPSBuZXcgRmlsZSgnZmlsZS50eHQnKTsKICogICAgICAgU3RyZWFtPExpc3Q8aW50Pj4gaW5wdXRTdHJlYW0gPSBmaWxlLm9wZW5SZWFkKCk7CiAqCiAqICAgICAgIGlucHV0U3RyZWFtCiAqICAgICAgICAgLnRyYW5zZm9ybSh1dGY4LmRlY29kZXIpICAgICAgIC8vIERlY29kZSBieXRlcyB0byBVVEYtOC4KICogICAgICAgICAudHJhbnNmb3JtKG5ldyBMaW5lU3BsaXR0ZXIoKSkgLy8gQ29udmVydCBzdHJlYW0gdG8gaW5kaXZpZHVhbCBsaW5lcy4KICogICAgICAgICAubGlzdGVuKChTdHJpbmcgbGluZSkgeyAgICAgICAgLy8gUHJvY2VzcyByZXN1bHRzLgogKiAgICAgICAgICAgICBwcmludCgnJGxpbmU6ICR7bGluZS5sZW5ndGh9IGJ5dGVzJyk7CiAqICAgICAgICAgICB9LAogKiAgICAgICAgICAgb25Eb25lOiAoKSB7IHByaW50KCdGaWxlIGlzIG5vdyBjbG9zZWQuJyk7IH0sCiAqICAgICAgICAgICBvbkVycm9yOiAoZSkgeyBwcmludChlLnRvU3RyaW5nKCkpOyB9KTsKICogICAgIH0KICoKICogIyMgV3JpdGUgdG8gYSBmaWxlCiAqCiAqIFRvIHdyaXRlIGEgc3RyaW5nIHRvIGEgZmlsZSwgdXNlIHRoZSBbd3JpdGVBc1N0cmluZ10gbWV0aG9kOgogKgogKiAgICAgaW1wb3J0ICdkYXJ0OmlvJzsKICoKICogICAgIHZvaWQgbWFpbigpIHsKICogICAgICAgZmluYWwgZmlsZW5hbWUgPSAnZmlsZS50eHQnOwogKiAgICAgICBuZXcgRmlsZShmaWxlbmFtZSkud3JpdGVBc1N0cmluZygnc29tZSBjb250ZW50JykKICogICAgICAgICAudGhlbigoRmlsZSBmaWxlKSB7CiAqICAgICAgICAgICAvLyBEbyBzb21ldGhpbmcgd2l0aCB0aGUgZmlsZS4KICogICAgICAgICB9KTsKICogICAgIH0KICoKICogWW91IGNhbiBhbHNvIHdyaXRlIHRvIGEgZmlsZSB1c2luZyBhIFtTdHJlYW1dLiBPcGVuIHRoZSBmaWxlIHdpdGgKICogW29wZW5Xcml0ZV0sIHdoaWNoIHJldHVybnMgYW4gW0lPU2lua10gdG8gd2hpY2ggeW91IGNhbiB3cml0ZSBkYXRhLgogKiBCZSBzdXJlIHRvIGNsb3NlIHRoZSBzaW5rIHdpdGggdGhlIFtJT1NpbmsuY2xvc2VdIG1ldGhvZC4KICoKICogICAgIGltcG9ydCAnZGFydDppbyc7CiAqCiAqICAgICB2b2lkIG1haW4oKSB7CiAqICAgICAgIHZhciBmaWxlID0gbmV3IEZpbGUoJ2ZpbGUudHh0Jyk7CiAqICAgICAgIHZhciBzaW5rID0gZmlsZS5vcGVuV3JpdGUoKTsKICogICAgICAgc2luay53cml0ZSgnRklMRSBBQ0NFU1NFRCAke25ldyBEYXRlVGltZS5ub3coKX1cbicpOwogKgogKiAgICAgICAvLyBDbG9zZSB0aGUgSU9TaW5rIHRvIGZyZWUgc3lzdGVtIHJlc291cmNlcy4KICogICAgICAgc2luay5jbG9zZSgpOwogKiAgICAgfQogKgogKiAjIyBUaGUgdXNlIG9mIEZ1dHVyZXMKICoKICogVG8gYXZvaWQgdW5pbnRlbnRpb25hbCBibG9ja2luZyBvZiB0aGUgcHJvZ3JhbSwKICogc2V2ZXJhbCBtZXRob2RzIHVzZSBhIFtGdXR1cmVdIHRvIHJldHVybiBhIHZhbHVlLiBGb3IgZXhhbXBsZSwKICogdGhlIFtsZW5ndGhdIG1ldGhvZCwgd2hpY2ggZ2V0cyB0aGUgbGVuZ3RoIG9mIGEgZmlsZSwgcmV0dXJucyBhIEZ1dHVyZS4KICogVXNlIGB0aGVuYCB0byByZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uLCB3aGljaCBpcyBjYWxsZWQgd2hlbgogKiB0aGUgdmFsdWUgaXMgcmVhZHkuCiAqCiAqICAgICBpbXBvcnQgJ2RhcnQ6aW8nOwogKgogKiAgICAgbWFpbigpIHsKICogICAgICAgZmluYWwgZmlsZSA9IG5ldyBGaWxlKCdmaWxlLnR4dCcpOwogKgogKiAgICAgICBmaWxlLmxlbmd0aCgpLnRoZW4oKGxlbikgewogKiAgICAgICAgIHByaW50KGxlbik7CiAqICAgICAgIH0pOwogKiAgICAgfQogKgogKiBJbiBhZGRpdGlvbiB0byBsZW5ndGgsIHRoZSBbZXhpc3RzXSwgW2xhc3RNb2RpZmllZF0sIFtzdGF0XSwgYW5kCiAqIG90aGVyIG1ldGhvZHMsIHJldHVybiBGdXR1cmVzLgogKgogKiAjIyBPdGhlciByZXNvdXJjZXMKICoKICogKiBbRGFydCBieSBFeGFtcGxlXShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZGFydC1ieS1leGFtcGxlLyNmaWxlcy1kaXJlY3Rvcmllcy1hbmQtc3ltbGlua3MpCiAqICAgcHJvdmlkZXMgYWRkaXRpb25hbCB0YXNrLW9yaWVudGVkIGNvZGUgc2FtcGxlcyB0aGF0IHNob3cgaG93IHRvIHVzZQogKiAgIHZhcmlvdXMgQVBJIGZyb20gdGhlIERpcmVjdG9yeSBjbGFzcyBhbmQgdGhlIHJlbGF0ZWQgW0ZpbGVdIGNsYXNzLgogKgogKiAqIFtJL08gZm9yIENvbW1hbmQtTGluZQogKiAgIEFwcHNdKGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy9kb2NzL2RhcnQtdXAtYW5kLXJ1bm5pbmcvY2gwMy5odG1sI2RhcnRpby0tLWlvLWZvci1jb21tYW5kLWxpbmUtYXBwcykKICogICBhIHNlY3Rpb24gZnJvbSBfQSBUb3VyIG9mIHRoZSBEYXJ0IExpYnJhcmllc18gY292ZXJzIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KICoKICogKiBbV3JpdGUgQ29tbWFuZC1MaW5lIEFwcHNdKGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy9kb2NzL3R1dG9yaWFscy9jbWRsaW5lLyksCiAqICAgYSB0dXRvcmlhbCBhYm91dCB3cml0aW5nIGNvbW1hbmQtbGluZSBhcHBzLCBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dAogKiAgIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KICovCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKYWJzdHJhY3QgY2xhc3MgRmlsZSBpbXBsZW1lbnRzIEZpbGVTeXN0ZW1FbnRpdHkgewogIC8qKgogICAqIENyZWF0ZXMgYSBbRmlsZV0gb2JqZWN0LgogICAqCiAgICogSWYgW3BhdGhdIGlzIGEgcmVsYXRpdmUgcGF0aCwgaXQgd2lsbCBiZSBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUKICAgKiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IChzZWUgW0RpcmVjdG9yeS5jdXJyZW50XSksIHdoZW4gdXNlZC4KICAgKgogICAqIElmIFtwYXRoXSBpcyBhbiBhYnNvbHV0ZSBwYXRoLCBpdCB3aWxsIGJlIGltbXVuZSB0byBjaGFuZ2VzIHRvIHRoZQogICAqIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCiAgICovCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGZhY3RvcnkgRmlsZShTdHJpbmcgcGF0aCkgewogICAgZmluYWwgSU9PdmVycmlkZXMgb3ZlcnJpZGVzID0gSU9PdmVycmlkZXMuY3VycmVudDsKICAgIGlmIChvdmVycmlkZXMgPT0gbnVsbCkgewogICAgICByZXR1cm4gbmV3IF9GaWxlKHBhdGgpOwogICAgfQogICAgcmV0dXJuIG92ZXJyaWRlcy5jcmVhdGVGaWxlKHBhdGgpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlIGEgRmlsZSBvYmplY3QgZnJvbSBhIFVSSS4KICAgKgogICAqIElmIFt1cmldIGNhbm5vdCByZWZlcmVuY2UgYSBmaWxlIHRoaXMgdGhyb3dzIFtVbnN1cHBvcnRlZEVycm9yXS4KICAgKi8KICBmYWN0b3J5IEZpbGUuZnJvbVVyaShVcmkgdXJpKSA9PiBuZXcgRmlsZSh1cmkudG9GaWxlUGF0aCgpKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIEZpbGUgb2JqZWN0IGZyb20gYSByYXcgcGF0aCwgdGhhdCBpcywgYSBzZXF1ZW5jZSBvZiBieXRlcwogICAqIGFzIHJlcHJlc2VudGVkIGJ5IHRoZSBPUy4KICAgKi8KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgZmFjdG9yeSBGaWxlLmZyb21SYXdQYXRoKFVpbnQ4TGlzdCByYXdQYXRoKSB7CiAgICAvLyBUT0RPKGJrb255aSk6IEhhbmRsZSBvdmVycmlkZXMuCiAgICByZXR1cm4gbmV3IF9GaWxlLmZyb21SYXdQYXRoKHJhd1BhdGgpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlIHRoZSBmaWxlLiBSZXR1cm5zIGEgYEZ1dHVyZTxGaWxlPmAgdGhhdCBjb21wbGV0ZXMgd2l0aAogICAqIHRoZSBmaWxlIHdoZW4gaXQgaGFzIGJlZW4gY3JlYXRlZC4KICAgKgogICAqIElmIFtyZWN1cnNpdmVdIGlzIGZhbHNlLCB0aGUgZGVmYXVsdCwgdGhlIGZpbGUgaXMgY3JlYXRlZCBvbmx5IGlmCiAgICogYWxsIGRpcmVjdG9yaWVzIGluIHRoZSBwYXRoIGV4aXN0LiBJZiBbcmVjdXJzaXZlXSBpcyB0cnVlLCBhbGwKICAgKiBub24tZXhpc3RpbmcgcGF0aCBjb21wb25lbnRzIGFyZSBjcmVhdGVkLgogICAqCiAgICogRXhpc3RpbmcgZmlsZXMgYXJlIGxlZnQgdW50b3VjaGVkIGJ5IFtjcmVhdGVdLiBDYWxsaW5nIFtjcmVhdGVdIG9uIGFuCiAgICogZXhpc3RpbmcgZmlsZSBtaWdodCBmYWlsIGlmIHRoZXJlIGFyZSByZXN0cmljdGl2ZSBwZXJtaXNzaW9ucyBvbgogICAqIHRoZSBmaWxlLgogICAqCiAgICogQ29tcGxldGVzIHRoZSBmdXR1cmUgd2l0aCBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogICAqLwogIEZ1dHVyZTxGaWxlPiBjcmVhdGUoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IGNyZWF0ZSB0aGUgZmlsZS4gRXhpc3RpbmcgZmlsZXMgYXJlIGxlZnQgdW50b3VjaGVkCiAgICogYnkgW2NyZWF0ZVN5bmNdLiBDYWxsaW5nIFtjcmVhdGVTeW5jXSBvbiBhbiBleGlzdGluZyBmaWxlIG1pZ2h0IGZhaWwKICAgKiBpZiB0aGVyZSBhcmUgcmVzdHJpY3RpdmUgcGVybWlzc2lvbnMgb24gdGhlIGZpbGUuCiAgICoKICAgKiBJZiBbcmVjdXJzaXZlXSBpcyBmYWxzZSwgdGhlIGRlZmF1bHQsIHRoZSBmaWxlIGlzIGNyZWF0ZWQKICAgKiBvbmx5IGlmIGFsbCBkaXJlY3RvcmllcyBpbiB0aGUgcGF0aCBleGlzdC4KICAgKiBJZiBbcmVjdXJzaXZlXSBpcyB0cnVlLCBhbGwgbm9uLWV4aXN0aW5nIHBhdGggY29tcG9uZW50cyBhcmUgY3JlYXRlZC4KICAgKgogICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogICAqLwogIHZvaWQgY3JlYXRlU3luYyh7Ym9vbCByZWN1cnNpdmU6IGZhbHNlfSk7CgogIC8qKgogICAqIFJlbmFtZXMgdGhpcyBmaWxlLiBSZXR1cm5zIGEgYEZ1dHVyZTxGaWxlPmAgdGhhdCBjb21wbGV0ZXMKICAgKiB3aXRoIGEgW0ZpbGVdIGluc3RhbmNlIGZvciB0aGUgcmVuYW1lZCBmaWxlLgogICAqCiAgICogSWYgW25ld1BhdGhdIGlkZW50aWZpZXMgYW4gZXhpc3RpbmcgZmlsZSwgdGhhdCBmaWxlIGlzCiAgICogcmVwbGFjZWQuIElmIFtuZXdQYXRoXSBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIGRpcmVjdG9yeSwgdGhlCiAgICogb3BlcmF0aW9uIGZhaWxzIGFuZCB0aGUgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIGFuIGV4Y2VwdGlvbi4KICAgKi8KICBGdXR1cmU8RmlsZT4gcmVuYW1lKFN0cmluZyBuZXdQYXRoKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSByZW5hbWVzIHRoaXMgZmlsZS4gUmV0dXJucyBhIFtGaWxlXQogICAqIGluc3RhbmNlIGZvciB0aGUgcmVuYW1lZCBmaWxlLgogICAqCiAgICogSWYgW25ld1BhdGhdIGlkZW50aWZpZXMgYW4gZXhpc3RpbmcgZmlsZSwgdGhhdCBmaWxlIGlzCiAgICogcmVwbGFjZWQuIElmIFtuZXdQYXRoXSBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIGRpcmVjdG9yeSB0aGUKICAgKiBvcGVyYXRpb24gZmFpbHMgYW5kIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICovCiAgRmlsZSByZW5hbWVTeW5jKFN0cmluZyBuZXdQYXRoKTsKCiAgLyoqCiAgICogQ29weSB0aGlzIGZpbGUuIFJldHVybnMgYSBgRnV0dXJlPEZpbGU+YCB0aGF0IGNvbXBsZXRlcwogICAqIHdpdGggYSBbRmlsZV0gaW5zdGFuY2UgZm9yIHRoZSBjb3BpZWQgZmlsZS4KICAgKgogICAqIElmIFtuZXdQYXRoXSBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIGZpbGUsIHRoYXQgZmlsZSBpcwogICAqIHJlcGxhY2VkLiBJZiBbbmV3UGF0aF0gaWRlbnRpZmllcyBhbiBleGlzdGluZyBkaXJlY3RvcnksIHRoZQogICAqIG9wZXJhdGlvbiBmYWlscyBhbmQgdGhlIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCBhbiBleGNlcHRpb24uCiAgICovCiAgRnV0dXJlPEZpbGU+IGNvcHkoU3RyaW5nIG5ld1BhdGgpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IGNvcHkgdGhpcyBmaWxlLiBSZXR1cm5zIGEgW0ZpbGVdCiAgICogaW5zdGFuY2UgZm9yIHRoZSBjb3BpZWQgZmlsZS4KICAgKgogICAqIElmIFtuZXdQYXRoXSBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIGZpbGUsIHRoYXQgZmlsZSBpcwogICAqIHJlcGxhY2VkLiBJZiBbbmV3UGF0aF0gaWRlbnRpZmllcyBhbiBleGlzdGluZyBkaXJlY3RvcnkgdGhlCiAgICogb3BlcmF0aW9uIGZhaWxzIGFuZCBhbiBleGNlcHRpb24gaXMgdGhyb3duLgogICAqLwogIEZpbGUgY29weVN5bmMoU3RyaW5nIG5ld1BhdGgpOwoKICAvKioKICAgKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgZmlsZS4gUmV0dXJucyBhIGBGdXR1cmU8aW50PmAgdGhhdAogICAqIGNvbXBsZXRlcyB3aXRoIHRoZSBsZW5ndGggaW4gYnl0ZXMuCiAgICovCiAgRnV0dXJlPGludD4gbGVuZ3RoKCk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgZ2V0IHRoZSBsZW5ndGggb2YgdGhlIGZpbGUuCiAgICoKICAgKiBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIG9wZXJhdGlvbiBmYWlscy4KICAgKi8KICBpbnQgbGVuZ3RoU3luYygpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgW0ZpbGVdIGluc3RhbmNlIHdob3NlIHBhdGggaXMgdGhlIGFic29sdXRlIHBhdGggdG8gW3RoaXNdLgogICAqCiAgICogVGhlIGFic29sdXRlIHBhdGggaXMgY29tcHV0ZWQgYnkgcHJlZml4aW5nCiAgICogYSByZWxhdGl2ZSBwYXRoIHdpdGggdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCByZXR1cm5pbmcKICAgKiBhbiBhYnNvbHV0ZSBwYXRoIHVuY2hhbmdlZC4KICAgKi8KICBGaWxlIGdldCBhYnNvbHV0ZTsKCi8qKgogKiBHZXQgdGhlIGxhc3QtYWNjZXNzZWQgdGltZSBvZiB0aGUgZmlsZS4KICoKICogUmV0dXJucyBhIGBGdXR1cmU8RGF0ZVRpbWU+YCB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlCiAqIGZpbGUgd2FzIGxhc3QgYWNjZXNzZWQsIGlmIHRoZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuCiAqCiAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogKi8KICBGdXR1cmU8RGF0ZVRpbWU+IGxhc3RBY2Nlc3NlZCgpOwoKLyoqCiAqIEdldCB0aGUgbGFzdC1hY2Nlc3NlZCB0aW1lIG9mIHRoZSBmaWxlLgogKgogKiBSZXR1cm5zIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIGZpbGUgd2FzIGxhc3QgYWNjZXNzZWQsCiAqIGlmIHRoZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuIEJsb2NrcyB1bnRpbCB0aGUgaW5mb3JtYXRpb24gY2FuIGJlIHJldHVybmVkCiAqIG9yIGl0IGlzIGRldGVybWluZWQgdGhhdCB0aGUgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZS4KICoKICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAqLwogIERhdGVUaW1lIGxhc3RBY2Nlc3NlZFN5bmMoKTsKCiAgLyoqCiAgICogTW9kaWZpZXMgdGhlIHRpbWUgdGhlIGZpbGUgd2FzIGxhc3QgYWNjZXNzZWQuCiAgICoKICAgKiBSZXR1cm5zIGEgW0Z1dHVyZV0gdGhhdCBjb21wbGV0ZXMgb25jZSB0aGUgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuCiAgICoKICAgKiBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIHRpbWUgY2Fubm90IGJlIHNldC4KICAgKi8KICBGdXR1cmUgc2V0TGFzdEFjY2Vzc2VkKERhdGVUaW1lIHRpbWUpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IG1vZGlmaWVzIHRoZSB0aW1lIHRoZSBmaWxlIHdhcyBsYXN0IGFjY2Vzc2VkLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSB0aW1lIGNhbm5vdCBiZSBzZXQuCiAgICovCiAgdm9pZCBzZXRMYXN0QWNjZXNzZWRTeW5jKERhdGVUaW1lIHRpbWUpOwoKLyoqCiAqIEdldCB0aGUgbGFzdC1tb2RpZmllZCB0aW1lIG9mIHRoZSBmaWxlLgogKgogKiBSZXR1cm5zIGEgYEZ1dHVyZTxEYXRlVGltZT5gIHRoYXQgY29tcGxldGVzIHdpdGggdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUKICogZmlsZSB3YXMgbGFzdCBtb2RpZmllZCwgaWYgdGhlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4KICoKICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAqLwogIEZ1dHVyZTxEYXRlVGltZT4gbGFzdE1vZGlmaWVkKCk7CgovKioKICogR2V0IHRoZSBsYXN0LW1vZGlmaWVkIHRpbWUgb2YgdGhlIGZpbGUuCiAqCiAqIFJldHVybnMgdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgZmlsZSB3YXMgbGFzdCBtb2RpZmllZCwKICogaWYgdGhlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4gQmxvY2tzIHVudGlsIHRoZSBpbmZvcm1hdGlvbiBjYW4gYmUgcmV0dXJuZWQKICogb3IgaXQgaXMgZGV0ZXJtaW5lZCB0aGF0IHRoZSBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLgogKgogKiBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIG9wZXJhdGlvbiBmYWlscy4KICovCiAgRGF0ZVRpbWUgbGFzdE1vZGlmaWVkU3luYygpOwoKICAvKioKICAgKiBNb2RpZmllcyB0aGUgdGltZSB0aGUgZmlsZSB3YXMgbGFzdCBtb2RpZmllZC4KICAgKgogICAqIFJldHVybnMgYSBbRnV0dXJlXSB0aGF0IGNvbXBsZXRlcyBvbmNlIHRoZSBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4KICAgKgogICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgdGltZSBjYW5ub3QgYmUgc2V0LgogICAqLwogIEZ1dHVyZSBzZXRMYXN0TW9kaWZpZWQoRGF0ZVRpbWUgdGltZSk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgbW9kaWZpZXMgdGhlIHRpbWUgdGhlIGZpbGUgd2FzIGxhc3QgbW9kaWZpZWQuCiAgICoKICAgKiBJZiB0aGUgYXR0cmlidXRlcyBjYW5ub3QgYmUgc2V0LCB0aHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0uCiAgICovCiAgdm9pZCBzZXRMYXN0TW9kaWZpZWRTeW5jKERhdGVUaW1lIHRpbWUpOwoKICAvKioKICAgKiBPcGVuIHRoZSBmaWxlIGZvciByYW5kb20gYWNjZXNzIG9wZXJhdGlvbnMuIFJldHVybnMgYQogICAqIGBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT5gIHRoYXQgY29tcGxldGVzIHdpdGggdGhlIG9wZW5lZAogICAqIHJhbmRvbSBhY2Nlc3MgZmlsZS4gW1JhbmRvbUFjY2Vzc0ZpbGVdcyBtdXN0IGJlIGNsb3NlZCB1c2luZyB0aGUKICAgKiBbUmFuZG9tQWNjZXNzRmlsZS5jbG9zZV0gbWV0aG9kLgogICAqCiAgICogRmlsZXMgY2FuIGJlIG9wZW5lZCBpbiB0aHJlZSBtb2RlczoKICAgKgogICAqIFtGaWxlTW9kZS5yZWFkXTogb3BlbiB0aGUgZmlsZSBmb3IgcmVhZGluZy4KICAgKgogICAqIFtGaWxlTW9kZS53cml0ZV06IG9wZW4gdGhlIGZpbGUgZm9yIGJvdGggcmVhZGluZyBhbmQgd3JpdGluZyBhbmQKICAgKiB0cnVuY2F0ZSB0aGUgZmlsZSB0byBsZW5ndGggemVyby4gSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QgdGhlCiAgICogZmlsZSBpcyBjcmVhdGVkLgogICAqCiAgICogW0ZpbGVNb2RlLmFwcGVuZF06IHNhbWUgYXMgW0ZpbGVNb2RlLndyaXRlXSBleGNlcHQgdGhhdCB0aGUgZmlsZSBpcwogICAqIG5vdCB0cnVuY2F0ZWQuCiAgICovCiAgRnV0dXJlPFJhbmRvbUFjY2Vzc0ZpbGU+IG9wZW4oe0ZpbGVNb2RlIG1vZGU6IEZpbGVNb2RlLnJlYWR9KTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSBvcGVuIHRoZSBmaWxlIGZvciByYW5kb20gYWNjZXNzIG9wZXJhdGlvbnMuIFRoZQogICAqIHJlc3VsdCBpcyBhIFtSYW5kb21BY2Nlc3NGaWxlXSBvbiB3aGljaCByYW5kb20gYWNjZXNzIG9wZXJhdGlvbnMKICAgKiBjYW4gYmUgcGVyZm9ybWVkLiBPcGVuZWQgW1JhbmRvbUFjY2Vzc0ZpbGVdcyBtdXN0IGJlIGNsb3NlZCB1c2luZwogICAqIHRoZSBbUmFuZG9tQWNjZXNzRmlsZS5jbG9zZV0gbWV0aG9kLgogICAqCiAgICogU2VlIFtvcGVuXSBmb3IgaW5mb3JtYXRpb24gb24gdGhlIFttb2RlXSBhcmd1bWVudC4KICAgKgogICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogICAqLwogIFJhbmRvbUFjY2Vzc0ZpbGUgb3BlblN5bmMoe0ZpbGVNb2RlIG1vZGU6IEZpbGVNb2RlLnJlYWR9KTsKCiAgLyoqCiAgICogQ3JlYXRlIGEgbmV3IGluZGVwZW5kZW50IFtTdHJlYW1dIGZvciB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlLgogICAqCiAgICogSWYgW3N0YXJ0XSBpcyBwcmVzZW50LCB0aGUgZmlsZSB3aWxsIGJlIHJlYWQgZnJvbSBieXRlLW9mZnNldCBbc3RhcnRdLgogICAqIE90aGVyd2lzZSBmcm9tIHRoZSBiZWdpbm5pbmcgKGluZGV4IDApLgogICAqCiAgICogSWYgW2VuZF0gaXMgcHJlc2VudCwgb25seSB1cCB0byBieXRlLWluZGV4IFtlbmRdIHdpbGwgYmUgcmVhZC4gT3RoZXJ3aXNlLAogICAqIHVudGlsIGVuZCBvZiBmaWxlLgogICAqCiAgICogSW4gb3JkZXIgdG8gbWFrZSBzdXJlIHRoYXQgc3lzdGVtIHJlc291cmNlcyBhcmUgZnJlZWQsIHRoZSBzdHJlYW0KICAgKiBtdXN0IGJlIHJlYWQgdG8gY29tcGxldGlvbiBvciB0aGUgc3Vic2NyaXB0aW9uIG9uIHRoZSBzdHJlYW0gbXVzdAogICAqIGJlIGNhbmNlbGxlZC4KICAgKi8KICBTdHJlYW08TGlzdDxpbnQ+PiBvcGVuUmVhZChbaW50IHN0YXJ0LCBpbnQgZW5kXSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgaW5kZXBlbmRlbnQgW0lPU2lua10gZm9yIHRoZSBmaWxlLiBUaGUKICAgKiBbSU9TaW5rXSBtdXN0IGJlIGNsb3NlZCB3aGVuIG5vIGxvbmdlciB1c2VkLCB0byBmcmVlCiAgICogc3lzdGVtIHJlc291cmNlcy4KICAgKgogICAqIEFuIFtJT1NpbmtdIGZvciBhIGZpbGUgY2FuIGJlIG9wZW5lZCBpbiB0d28gbW9kZXM6CiAgICoKICAgKiAqIFtGaWxlTW9kZS53cml0ZV06IHRydW5jYXRlcyB0aGUgZmlsZSB0byBsZW5ndGggemVyby4KICAgKiAqIFtGaWxlTW9kZS5hcHBlbmRdOiBzZXRzIHRoZSBpbml0aWFsIHdyaXRlIHBvc2l0aW9uIHRvIHRoZSBlbmQKICAgKiAgIG9mIHRoZSBmaWxlLgogICAqCiAgICogIFdoZW4gd3JpdGluZyBzdHJpbmdzIHRocm91Z2ggdGhlIHJldHVybmVkIFtJT1NpbmtdIHRoZSBlbmNvZGluZwogICAqICBzcGVjaWZpZWQgdXNpbmcgW2VuY29kaW5nXSB3aWxsIGJlIHVzZWQuIFRoZSByZXR1cm5lZCBbSU9TaW5rXQogICAqICBoYXMgYW4gYGVuY29kaW5nYCBwcm9wZXJ0eSB3aGljaCBjYW4gYmUgY2hhbmdlZCBhZnRlciB0aGUKICAgKiAgW0lPU2lua10gaGFzIGJlZW4gY3JlYXRlZC4KICAgKi8KICBJT1Npbmsgb3BlbldyaXRlKHtGaWxlTW9kZSBtb2RlOiBGaWxlTW9kZS53cml0ZSwgRW5jb2RpbmcgZW5jb2Rpbmc6IHV0Zjh9KTsKCiAgLyoqCiAgICogUmVhZCB0aGUgZW50aXJlIGZpbGUgY29udGVudHMgYXMgYSBsaXN0IG9mIGJ5dGVzLiBSZXR1cm5zIGEKICAgKiBgRnV0dXJlPExpc3Q8aW50Pj5gIHRoYXQgY29tcGxldGVzIHdpdGggdGhlIGxpc3Qgb2YgYnl0ZXMgdGhhdAogICAqIGlzIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZS4KICAgKi8KICBGdXR1cmU8TGlzdDxpbnQ+PiByZWFkQXNCeXRlcygpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IHJlYWQgdGhlIGVudGlyZSBmaWxlIGNvbnRlbnRzIGFzIGEgbGlzdCBvZiBieXRlcy4KICAgKgogICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogICAqLwogIExpc3Q8aW50PiByZWFkQXNCeXRlc1N5bmMoKTsKCiAgLyoqCiAgICogUmVhZCB0aGUgZW50aXJlIGZpbGUgY29udGVudHMgYXMgYSBzdHJpbmcgdXNpbmcgdGhlIGdpdmVuCiAgICogW0VuY29kaW5nXS4KICAgKgogICAqIFJldHVybnMgYSBgRnV0dXJlPFN0cmluZz5gIHRoYXQgY29tcGxldGVzIHdpdGggdGhlIHN0cmluZyBvbmNlCiAgICogdGhlIGZpbGUgY29udGVudHMgaGFzIGJlZW4gcmVhZC4KICAgKi8KICBGdXR1cmU8U3RyaW5nPiByZWFkQXNTdHJpbmcoe0VuY29kaW5nIGVuY29kaW5nOiB1dGY4fSk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgcmVhZCB0aGUgZW50aXJlIGZpbGUgY29udGVudHMgYXMgYSBzdHJpbmcgdXNpbmcgdGhlCiAgICogZ2l2ZW4gW0VuY29kaW5nXS4KICAgKgogICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogICAqLwogIFN0cmluZyByZWFkQXNTdHJpbmdTeW5jKHtFbmNvZGluZyBlbmNvZGluZzogdXRmOH0pOwoKICAvKioKICAgKiBSZWFkIHRoZSBlbnRpcmUgZmlsZSBjb250ZW50cyBhcyBsaW5lcyBvZiB0ZXh0IHVzaW5nIHRoZSBnaXZlbgogICAqIFtFbmNvZGluZ10uCiAgICoKICAgKiBSZXR1cm5zIGEgYEZ1dHVyZTxMaXN0PFN0cmluZz4+YCB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoZSBsaW5lcwogICAqIG9uY2UgdGhlIGZpbGUgY29udGVudHMgaGFzIGJlZW4gcmVhZC4KICAgKi8KICBGdXR1cmU8TGlzdDxTdHJpbmc+PiByZWFkQXNMaW5lcyh7RW5jb2RpbmcgZW5jb2Rpbmc6IHV0Zjh9KTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSByZWFkIHRoZSBlbnRpcmUgZmlsZSBjb250ZW50cyBhcyBsaW5lcyBvZiB0ZXh0CiAgICogdXNpbmcgdGhlIGdpdmVuIFtFbmNvZGluZ10uCiAgICoKICAgKiBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIG9wZXJhdGlvbiBmYWlscy4KICAgKi8KICBMaXN0PFN0cmluZz4gcmVhZEFzTGluZXNTeW5jKHtFbmNvZGluZyBlbmNvZGluZzogdXRmOH0pOwoKICAvKioKICAgKiBXcml0ZSBhIGxpc3Qgb2YgYnl0ZXMgdG8gYSBmaWxlLgogICAqCiAgICogT3BlbnMgdGhlIGZpbGUsIHdyaXRlcyB0aGUgbGlzdCBvZiBieXRlcyB0byBpdCwgYW5kIGNsb3NlcyB0aGUgZmlsZS4KICAgKiBSZXR1cm5zIGEgYEZ1dHVyZTxGaWxlPmAgdGhhdCBjb21wbGV0ZXMgd2l0aCB0aGlzIFtGaWxlXSBvYmplY3Qgb25jZQogICAqIHRoZSBlbnRpcmUgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuCiAgICoKICAgKiBCeSBkZWZhdWx0IFt3cml0ZUFzQnl0ZXNdIGNyZWF0ZXMgdGhlIGZpbGUgZm9yIHdyaXRpbmcgYW5kIHRydW5jYXRlcyB0aGUKICAgKiBmaWxlIGlmIGl0IGFscmVhZHkgZXhpc3RzLiBJbiBvcmRlciB0byBhcHBlbmQgdGhlIGJ5dGVzIHRvIGFuIGV4aXN0aW5nCiAgICogZmlsZSwgcGFzcyBbRmlsZU1vZGUuYXBwZW5kXSBhcyB0aGUgb3B0aW9uYWwgbW9kZSBwYXJhbWV0ZXIuCiAgICoKICAgKiBJZiB0aGUgYXJndW1lbnQgW2ZsdXNoXSBpcyBzZXQgdG8gYHRydWVgLCB0aGUgZGF0YSB3cml0dGVuIHdpbGwgYmUKICAgKiBmbHVzaGVkIHRvIHRoZSBmaWxlIHN5c3RlbSBiZWZvcmUgdGhlIHJldHVybmVkIGZ1dHVyZSBjb21wbGV0ZXMuCiAgICovCiAgRnV0dXJlPEZpbGU+IHdyaXRlQXNCeXRlcyhMaXN0PGludD4gYnl0ZXMsCiAgICAgIHtGaWxlTW9kZSBtb2RlOiBGaWxlTW9kZS53cml0ZSwgYm9vbCBmbHVzaDogZmFsc2V9KTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSB3cml0ZSBhIGxpc3Qgb2YgYnl0ZXMgdG8gYSBmaWxlLgogICAqCiAgICogT3BlbnMgdGhlIGZpbGUsIHdyaXRlcyB0aGUgbGlzdCBvZiBieXRlcyB0byBpdCBhbmQgY2xvc2VzIHRoZSBmaWxlLgogICAqCiAgICogQnkgZGVmYXVsdCBbd3JpdGVBc0J5dGVzU3luY10gY3JlYXRlcyB0aGUgZmlsZSBmb3Igd3JpdGluZyBhbmQgdHJ1bmNhdGVzCiAgICogdGhlIGZpbGUgaWYgaXQgYWxyZWFkeSBleGlzdHMuIEluIG9yZGVyIHRvIGFwcGVuZCB0aGUgYnl0ZXMgdG8gYW4gZXhpc3RpbmcKICAgKiBmaWxlLCBwYXNzIFtGaWxlTW9kZS5hcHBlbmRdIGFzIHRoZSBvcHRpb25hbCBtb2RlIHBhcmFtZXRlci4KICAgKgogICAqIElmIHRoZSBbZmx1c2hdIGFyZ3VtZW50IGlzIHNldCB0byBgdHJ1ZWAgZGF0YSB3cml0dGVuIHdpbGwgYmUKICAgKiBmbHVzaGVkIHRvIHRoZSBmaWxlIHN5c3RlbSBiZWZvcmUgcmV0dXJuaW5nLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgdm9pZCB3cml0ZUFzQnl0ZXNTeW5jKExpc3Q8aW50PiBieXRlcywKICAgICAge0ZpbGVNb2RlIG1vZGU6IEZpbGVNb2RlLndyaXRlLCBib29sIGZsdXNoOiBmYWxzZX0pOwoKICAvKioKICAgKiBXcml0ZSBhIHN0cmluZyB0byBhIGZpbGUuCiAgICoKICAgKiBPcGVucyB0aGUgZmlsZSwgd3JpdGVzIHRoZSBzdHJpbmcgaW4gdGhlIGdpdmVuIGVuY29kaW5nLCBhbmQgY2xvc2VzIHRoZQogICAqIGZpbGUuIFJldHVybnMgYSBgRnV0dXJlPEZpbGU+YCB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoaXMgW0ZpbGVdIG9iamVjdAogICAqIG9uY2UgdGhlIGVudGlyZSBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4KICAgKgogICAqIEJ5IGRlZmF1bHQgW3dyaXRlQXNTdHJpbmddIGNyZWF0ZXMgdGhlIGZpbGUgZm9yIHdyaXRpbmcgYW5kIHRydW5jYXRlcyB0aGUKICAgKiBmaWxlIGlmIGl0IGFscmVhZHkgZXhpc3RzLiBJbiBvcmRlciB0byBhcHBlbmQgdGhlIGJ5dGVzIHRvIGFuIGV4aXN0aW5nCiAgICogZmlsZSwgcGFzcyBbRmlsZU1vZGUuYXBwZW5kXSBhcyB0aGUgb3B0aW9uYWwgbW9kZSBwYXJhbWV0ZXIuCiAgICoKICAgKiBJZiB0aGUgYXJndW1lbnQgW2ZsdXNoXSBpcyBzZXQgdG8gYHRydWVgLCB0aGUgZGF0YSB3cml0dGVuIHdpbGwgYmUKICAgKiBmbHVzaGVkIHRvIHRoZSBmaWxlIHN5c3RlbSBiZWZvcmUgdGhlIHJldHVybmVkIGZ1dHVyZSBjb21wbGV0ZXMuCiAgICoKICAgKi8KICBGdXR1cmU8RmlsZT4gd3JpdGVBc1N0cmluZyhTdHJpbmcgY29udGVudHMsCiAgICAgIHtGaWxlTW9kZSBtb2RlOiBGaWxlTW9kZS53cml0ZSwKICAgICAgRW5jb2RpbmcgZW5jb2Rpbmc6IHV0ZjgsCiAgICAgIGJvb2wgZmx1c2g6IGZhbHNlfSk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgd3JpdGUgYSBzdHJpbmcgdG8gYSBmaWxlLgogICAqCiAgICogT3BlbnMgdGhlIGZpbGUsIHdyaXRlcyB0aGUgc3RyaW5nIGluIHRoZSBnaXZlbiBlbmNvZGluZywgYW5kIGNsb3NlcyB0aGUKICAgKiBmaWxlLgogICAqCiAgICogQnkgZGVmYXVsdCBbd3JpdGVBc1N0cmluZ1N5bmNdIGNyZWF0ZXMgdGhlIGZpbGUgZm9yIHdyaXRpbmcgYW5kCiAgICogdHJ1bmNhdGVzIHRoZSBmaWxlIGlmIGl0IGFscmVhZHkgZXhpc3RzLiBJbiBvcmRlciB0byBhcHBlbmQgdGhlIGJ5dGVzCiAgICogdG8gYW4gZXhpc3RpbmcgZmlsZSwgcGFzcyBbRmlsZU1vZGUuYXBwZW5kXSBhcyB0aGUgb3B0aW9uYWwgbW9kZQogICAqIHBhcmFtZXRlci4KICAgKgogICAqIElmIHRoZSBbZmx1c2hdIGFyZ3VtZW50IGlzIHNldCB0byBgdHJ1ZWAgZGF0YSB3cml0dGVuIHdpbGwgYmUKICAgKiBmbHVzaGVkIHRvIHRoZSBmaWxlIHN5c3RlbSBiZWZvcmUgcmV0dXJuaW5nLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgdm9pZCB3cml0ZUFzU3RyaW5nU3luYyhTdHJpbmcgY29udGVudHMsCiAgICAgIHtGaWxlTW9kZSBtb2RlOiBGaWxlTW9kZS53cml0ZSwKICAgICAgRW5jb2RpbmcgZW5jb2Rpbmc6IHV0ZjgsCiAgICAgIGJvb2wgZmx1c2g6IGZhbHNlfSk7CgogIC8qKgogICAqIEdldCB0aGUgcGF0aCBvZiB0aGUgZmlsZS4KICAgKi8KICBTdHJpbmcgZ2V0IHBhdGg7Cn0KCi8qKgogKiBgUmFuZG9tQWNjZXNzRmlsZWAgcHJvdmlkZXMgcmFuZG9tIGFjY2VzcyB0byB0aGUgZGF0YSBpbiBhCiAqIGZpbGUuCiAqCiAqIGBSYW5kb21BY2Nlc3NGaWxlYCBvYmplY3RzIGFyZSBvYnRhaW5lZCBieSBjYWxsaW5nIHRoZQogKiBgb3BlbmAgbWV0aG9kIG9uIGEgW0ZpbGVdIG9iamVjdC4KICoKICogQSBgUmFuZG9tQWNjZXNzRmlsZWAgaGF2ZSBib3RoIGFzeW5jaHJvbm91cyBhbmQgc3luY2hyb25vdXMKICogbWV0aG9kcy4gVGhlIGFzeW5jaHJvbm91cyBtZXRob2RzIGFsbCByZXR1cm4gYSBgRnV0dXJlYAogKiB3aGVyZWFzIHRoZSBzeW5jaHJvbm91cyBtZXRob2RzIHdpbGwgcmV0dXJuIHRoZSByZXN1bHQgZGlyZWN0bHksCiAqIGFuZCBibG9jayB0aGUgY3VycmVudCBpc29sYXRlIHVudGlsIHRoZSByZXN1bHQgaXMgcmVhZHkuCiAqCiAqIEF0IG1vc3Qgb25lIGFzeW5jaHJvbm91cyBtZXRob2QgY2FuIGJlIHBlbmRpbmcgb24gYSBnaXZlbiBgUmFuZG9tQWNjZXNzRmlsZWAKICogaW5zdGFuY2UgYXQgdGhlIHRpbWUuIElmIGFuIGFzeW5jaHJvbm91cyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gb25lIGlzCiAqIGFscmVhZHkgaW4gcHJvZ3Jlc3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaXMgdGhyb3duLgogKgogKiBJZiBhbiBhc3luY2hyb25vdXMgbWV0aG9kIGlzIHBlbmRpbmcgaXQgaXMgYWxzbyBub3QgcG9zc2libGUgdG8gY2FsbCBhbnkKICogc3luY2hyb25vdXMgbWV0aG9kcy4gVGhpcyB3aWxsIGFsc28gdGhyb3cgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0uCiAqLwphYnN0cmFjdCBjbGFzcyBSYW5kb21BY2Nlc3NGaWxlIHsKICAvKioKICAgKiBDbG9zZXMgdGhlIGZpbGUuIFJldHVybnMgYSBgRnV0dXJlYCB0aGF0CiAgICogY29tcGxldGVzIHdoZW4gaXQgaGFzIGJlZW4gY2xvc2VkLgogICAqLwogIEZ1dHVyZTx2b2lkPiBjbG9zZSgpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IGNsb3NlcyB0aGUgZmlsZS4KICAgKgogICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogICAqLwogIHZvaWQgY2xvc2VTeW5jKCk7CgogIC8qKgogICAqIFJlYWRzIGEgYnl0ZSBmcm9tIHRoZSBmaWxlLiBSZXR1cm5zIGEgYEZ1dHVyZTxpbnQ+YCB0aGF0CiAgICogY29tcGxldGVzIHdpdGggdGhlIGJ5dGUsIG9yIHdpdGggLTEgaWYgZW5kLW9mLWZpbGUgaGFzIGJlZW4gcmVhY2hlZC4KICAgKi8KICBGdXR1cmU8aW50PiByZWFkQnl0ZSgpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IHJlYWRzIGEgc2luZ2xlIGJ5dGUgZnJvbSB0aGUgZmlsZS4gSWYgZW5kLW9mLWZpbGUKICAgKiBoYXMgYmVlbiByZWFjaGVkIC0xIGlzIHJldHVybmVkLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgaW50IHJlYWRCeXRlU3luYygpOwoKICAvKioKICAgKiBSZWFkcyBbYnl0ZXNdIGJ5dGVzIGZyb20gYSBmaWxlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYSBsaXN0IG9mIGJ5dGVzLgogICAqLwogIEZ1dHVyZTxMaXN0PGludD4+IHJlYWQoaW50IGJ5dGVzKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSByZWFkcyBhIG1heGltdW0gb2YgW2J5dGVzXSBieXRlcyBmcm9tIGEgZmlsZSBhbmQKICAgKiByZXR1cm5zIHRoZSByZXN1bHQgaW4gYSBsaXN0IG9mIGJ5dGVzLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgTGlzdDxpbnQ+IHJlYWRTeW5jKGludCBieXRlcyk7CgogIC8qKgogICAqIFJlYWRzIGludG8gYW4gZXhpc3RpbmcgW0xpc3Q8aW50Pl0gZnJvbSB0aGUgZmlsZS4gSWYgW3N0YXJ0XSBpcyBwcmVzZW50LAogICAqIHRoZSBieXRlcyB3aWxsIGJlIGZpbGxlZCBpbnRvIFtidWZmZXJdIGZyb20gYXQgaW5kZXggW3N0YXJ0XSwgb3RoZXJ3aXNlCiAgICogaW5kZXggMC4gSWYgW2VuZF0gaXMgcHJlc2VudCwgdGhlIFtlbmRdIC0gW3N0YXJ0XSBieXRlcyB3aWxsIGJlIHJlYWQgaW50bwogICAqIFtidWZmZXJdLCBvdGhlcndpc2UgdXAgdG8gW2J1ZmZlci5sZW5ndGhdLiBJZiBbZW5kXSA9PSBbc3RhcnRdIG5vdGhpbmcKICAgKiBoYXBwZW5zLgogICAqCiAgICogUmV0dXJucyBhIGBGdXR1cmU8aW50PmAgdGhhdCBjb21wbGV0ZXMgd2l0aCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuCiAgICovCiAgRnV0dXJlPGludD4gcmVhZEludG8oTGlzdDxpbnQ+IGJ1ZmZlciwgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSByZWFkcyBpbnRvIGFuIGV4aXN0aW5nIFtMaXN0PGludD5dIGZyb20gdGhlIGZpbGUuIElmIFtzdGFydF0KICAgKiBpcyBwcmVzZW50LCB0aGUgYnl0ZXMgd2lsbCBiZSBmaWxsZWQgaW50byBbYnVmZmVyXSBmcm9tIGF0IGluZGV4IFtzdGFydF0sCiAgICogb3RoZXJ3aXNlIGluZGV4IDAuICBJZiBbZW5kXSBpcyBwcmVzZW50LCB0aGUgW2VuZF0gLSBbc3RhcnRdIGJ5dGVzIHdpbGwgYmUKICAgKiByZWFkIGludG8gW2J1ZmZlcl0sIG90aGVyd2lzZSB1cCB0byBbYnVmZmVyLmxlbmd0aF0uIElmIFtlbmRdID09IFtzdGFydF0KICAgKiBub3RoaW5nIGhhcHBlbnMuCiAgICoKICAgKiBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIG9wZXJhdGlvbiBmYWlscy4KICAgKi8KICBpbnQgcmVhZEludG9TeW5jKExpc3Q8aW50PiBidWZmZXIsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSk7CgogIC8qKgogICAqIFdyaXRlcyBhIHNpbmdsZSBieXRlIHRvIHRoZSBmaWxlLiBSZXR1cm5zIGEKICAgKiBgRnV0dXJlPFJhbmRvbUFjY2Vzc0ZpbGU+YCB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoaXMKICAgKiBSYW5kb21BY2Nlc3NGaWxlIHdoZW4gdGhlIHdyaXRlIGNvbXBsZXRlcy4KICAgKi8KICBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT4gd3JpdGVCeXRlKGludCB2YWx1ZSk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgd3JpdGVzIGEgc2luZ2xlIGJ5dGUgdG8gdGhlIGZpbGUuIFJldHVybnMgdGhlCiAgICogbnVtYmVyIG9mIGJ5dGVzIHN1Y2Nlc3NmdWxseSB3cml0dGVuLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgaW50IHdyaXRlQnl0ZVN5bmMoaW50IHZhbHVlKTsKCiAgLyoqCiAgICogV3JpdGVzIGZyb20gYSBbTGlzdDxpbnQ+XSB0byB0aGUgZmlsZS4gSXQgd2lsbCByZWFkIHRoZSBidWZmZXIgZnJvbSBpbmRleAogICAqIFtzdGFydF0gdG8gaW5kZXggW2VuZF0uIElmIFtzdGFydF0gaXMgb21pdHRlZCwgaXQnbGwgc3RhcnQgZnJvbSBpbmRleCAwLgogICAqIElmIFtlbmRdIGlzIG9taXR0ZWQsIGl0IHdpbGwgd3JpdGUgdG8gZW5kIG9mIFtidWZmZXJdLgogICAqCiAgICogUmV0dXJucyBhIGBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT5gIHRoYXQgY29tcGxldGVzIHdpdGggdGhpcwogICAqIFtSYW5kb21BY2Nlc3NGaWxlXSB3aGVuIHRoZSB3cml0ZSBjb21wbGV0ZXMuCiAgICovCiAgRnV0dXJlPFJhbmRvbUFjY2Vzc0ZpbGU+IHdyaXRlRnJvbShMaXN0PGludD4gYnVmZmVyLAogICAgICBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IHdyaXRlcyBmcm9tIGEgW0xpc3Q8aW50Pl0gdG8gdGhlIGZpbGUuIEl0IHdpbGwgcmVhZCB0aGUKICAgKiBidWZmZXIgZnJvbSBpbmRleCBbc3RhcnRdIHRvIGluZGV4IFtlbmRdLiBJZiBbc3RhcnRdIGlzIG9taXR0ZWQsIGl0J2xsCiAgICogc3RhcnQgZnJvbSBpbmRleCAwLiBJZiBbZW5kXSBpcyBvbWl0dGVkLCBpdCB3aWxsIHdyaXRlIHRvIHRoZSBlbmQgb2YKICAgKiBbYnVmZmVyXS4KICAgKgogICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogICAqLwogIHZvaWQgd3JpdGVGcm9tU3luYyhMaXN0PGludD4gYnVmZmVyLCBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pOwoKICAvKioKICAgKiBXcml0ZXMgYSBzdHJpbmcgdG8gdGhlIGZpbGUgdXNpbmcgdGhlIGdpdmVuIFtFbmNvZGluZ10uIFJldHVybnMgYQogICAqIGBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT5gIHRoYXQgY29tcGxldGVzIHdpdGggdGhpcwogICAqIFJhbmRvbUFjY2Vzc0ZpbGUgd2hlbiB0aGUgd3JpdGUgY29tcGxldGVzLgogICAqLwogIEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPiB3cml0ZVN0cmluZyhTdHJpbmcgc3RyaW5nLAogICAgICB7RW5jb2RpbmcgZW5jb2Rpbmc6IHV0Zjh9KTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSB3cml0ZXMgYSBzaW5nbGUgc3RyaW5nIHRvIHRoZSBmaWxlIHVzaW5nIHRoZSBnaXZlbgogICAqIFtFbmNvZGluZ10uCiAgICoKICAgKiBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIG9wZXJhdGlvbiBmYWlscy4KICAgKi8KICB2b2lkIHdyaXRlU3RyaW5nU3luYyhTdHJpbmcgc3RyaW5nLCB7RW5jb2RpbmcgZW5jb2Rpbmc6IHV0Zjh9KTsKCiAgLyoqCiAgICogR2V0cyB0aGUgY3VycmVudCBieXRlIHBvc2l0aW9uIGluIHRoZSBmaWxlLiBSZXR1cm5zIGEKICAgKiBgRnV0dXJlPGludD5gIHRoYXQgY29tcGxldGVzIHdpdGggdGhlIHBvc2l0aW9uLgogICAqLwogIEZ1dHVyZTxpbnQ+IHBvc2l0aW9uKCk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgZ2V0cyB0aGUgY3VycmVudCBieXRlIHBvc2l0aW9uIGluIHRoZSBmaWxlLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgaW50IHBvc2l0aW9uU3luYygpOwoKICAvKioKICAgKiBTZXRzIHRoZSBieXRlIHBvc2l0aW9uIGluIHRoZSBmaWxlLiBSZXR1cm5zIGEKICAgKiBgRnV0dXJlPFJhbmRvbUFjY2Vzc0ZpbGU+YCB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoaXMKICAgKiBSYW5kb21BY2Nlc3NGaWxlIHdoZW4gdGhlIHBvc2l0aW9uIGhhcyBiZWVuIHNldC4KICAgKi8KICBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT4gc2V0UG9zaXRpb24oaW50IHBvc2l0aW9uKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSBzZXRzIHRoZSBieXRlIHBvc2l0aW9uIGluIHRoZSBmaWxlLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgdm9pZCBzZXRQb3NpdGlvblN5bmMoaW50IHBvc2l0aW9uKTsKCiAgLyoqCiAgICogVHJ1bmNhdGVzIChvciBleHRlbmRzKSB0aGUgZmlsZSB0byBbbGVuZ3RoXSBieXRlcy4gUmV0dXJucyBhCiAgICogYEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPmAgdGhhdCBjb21wbGV0ZXMgd2l0aCB0aGlzCiAgICogUmFuZG9tQWNjZXNzRmlsZSB3aGVuIHRoZSB0cnVuY2F0aW9uIGhhcyBiZWVuIHBlcmZvcm1lZC4KICAgKi8KICBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT4gdHJ1bmNhdGUoaW50IGxlbmd0aCk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgdHJ1bmNhdGVzIChvciBleHRlbmRzKSB0aGUgZmlsZSB0byBbbGVuZ3RoXSBieXRlcy4KICAgKgogICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogICAqLwogIHZvaWQgdHJ1bmNhdGVTeW5jKGludCBsZW5ndGgpOwoKICAvKioKICAgKiBHZXRzIHRoZSBsZW5ndGggb2YgdGhlIGZpbGUuIFJldHVybnMgYSBgRnV0dXJlPGludD5gIHRoYXQKICAgKiBjb21wbGV0ZXMgd2l0aCB0aGUgbGVuZ3RoIGluIGJ5dGVzLgogICAqLwogIEZ1dHVyZTxpbnQ+IGxlbmd0aCgpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IGdldHMgdGhlIGxlbmd0aCBvZiB0aGUgZmlsZS4KICAgKgogICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogICAqLwogIGludCBsZW5ndGhTeW5jKCk7CgogIC8qKgogICAqIEZsdXNoZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIHRvIGRpc2suIFJldHVybnMgYQogICAqIGBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT5gIHRoYXQgY29tcGxldGVzIHdpdGggdGhpcwogICAqIFJhbmRvbUFjY2Vzc0ZpbGUgd2hlbiB0aGUgZmx1c2ggb3BlcmF0aW9uIGNvbXBsZXRlcy4KICAgKi8KICBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT4gZmx1c2goKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSBmbHVzaGVzIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSB0byBkaXNrLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgdm9pZCBmbHVzaFN5bmMoKTsKCiAgLyoqCiAgICogTG9ja3MgdGhlIGZpbGUgb3IgcGFydCBvZiB0aGUgZmlsZS4KICAgKgogICAqIEJ5IGRlZmF1bHQgYW4gZXhjbHVzaXZlIGxvY2sgd2lsbCBiZSBvYnRhaW5lZCwgYnV0IHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4KICAgKiBieSB0aGUgW21vZGVdIGFyZ3VtZW50LgogICAqCiAgICogTG9ja3MgdGhlIGJ5dGUgcmFuZ2UgZnJvbSBbc3RhcnRdIHRvIFtlbmRdIG9mIHRoZSBmaWxlLCB3aXRoIHRoZQogICAqIGJ5dGUgYXQgcG9zaXRpb24gYGVuZGAgbm90IGluY2x1ZGVkLiBJZiBubyBhcmd1bWVudHMgYXJlCiAgICogc3BlY2lmaWVkLCB0aGUgZnVsbCBmaWxlIGlzIGxvY2tlZCwgSWYgb25seSBgc3RhcnRgIGlzIHNwZWNpZmllZAogICAqIHRoZSBmaWxlIGlzIGxvY2tlZCBmcm9tIGJ5dGUgcG9zaXRpb24gYHN0YXJ0YCB0byB0aGUgZW5kIG9mIHRoZQogICAqIGZpbGUsIG5vIG1hdHRlciBob3cgbGFyZ2UgaXQgZ3Jvd3MuIEl0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkgYW4KICAgKiBleHBsaWNpdCB2YWx1ZSBvZiBgZW5kYCB3aGljaCBpcyBwYXN0IHRoZSBjdXJyZW50IGxlbmd0aCBvZiB0aGUgZmlsZS4KICAgKgogICAqIFRvIG9idGFpbiBhbiBleGNsdXNpdmUgbG9jayBvbiBhIGZpbGUgaXQgbXVzdCBiZSBvcGVuZWQgZm9yIHdyaXRpbmcuCiAgICoKICAgKiBJZiBbbW9kZV0gaXMgW0ZpbGVMb2NrLmV4Y2x1c2l2ZV0gb3IgW0ZpbGVMb2NrLnNoYXJlZF0sIGFuIGVycm9yIGlzCiAgICogc2lnbmFsZWQgaWYgdGhlIGxvY2sgY2Fubm90IGJlIG9idGFpbmVkLiBJZiBbbW9kZV0gaXMKICAgKiBbRmlsZUxvY2suYmxvY2tpbmdFeGNsdXNpdmVdIG9yIFtGaWxlTG9jay5ibG9ja2luZ1NoYXJlZF0sIHRoZQogICAqIHJldHVybmVkIFtGdXR1cmVdIGlzIHJlc29sdmVkIG9ubHkgd2hlbiB0aGUgbG9jayBoYXMgYmVlbiBvYnRhaW5lZC4KICAgKgogICAqICpOT1RFKiBmaWxlIGxvY2tpbmcgZG9lcyBoYXZlIHNsaWdodCBkaWZmZXJlbmNlcyBpbiBiZWhhdmlvciBhY3Jvc3MKICAgKiBwbGF0Zm9ybXM6CiAgICoKICAgKiBPbiBMaW51eCBhbmQgT1MgWCB0aGlzIHVzZXMgYWR2aXNvcnkgbG9ja3MsIHdoaWNoIGhhdmUgdGhlCiAgICogc3VycHJpc2luZyBzZW1hbnRpY3MgdGhhdCBhbGwgbG9ja3MgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZmlsZQogICAqIGFyZSByZW1vdmVkIHdoZW4gKmFueSogZmlsZSBkZXNjcmlwdG9yIGZvciB0aGF0IGZpbGUgaXMgY2xvc2VkIGJ5CiAgICogdGhlIHByb2Nlc3MuIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGFjdHVhbGx5IGxvY2sgdGhlIGZpbGUgZm9yCiAgICogYWNjZXNzLiBBbHNvIG5vdGUgdGhhdCBhZHZpc29yeSBsb2NrcyBhcmUgb24gYSBwcm9jZXNzCiAgICogbGV2ZWwuIFRoaXMgbWVhbnMgdGhhdCBzZXZlcmFsIGlzb2xhdGVzIGluIHRoZSBzYW1lIHByb2Nlc3MgY2FuCiAgICogb2J0YWluIGFuIGV4Y2x1c2l2ZSBsb2NrIG9uIHRoZSBzYW1lIGZpbGUuCiAgICoKICAgKiBPbiBXaW5kb3dzIHRoZSByZWdpb25zIHVzZWQgZm9yIGxvY2sgYW5kIHVubG9jayBuZWVkcyB0byBtYXRjaC4gSWYgdGhhdAogICAqIGlzIG5vdCB0aGUgY2FzZSB1bmxvY2tpbmcgd2lsbCByZXN1bHQgaW4gdGhlIE9TIGVycm9yICJUaGUgc2VnbWVudCBpcwogICAqIGFscmVhZHkgdW5sb2NrZWQiLgogICAqLwogIEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPiBsb2NrKAogICAgICBbRmlsZUxvY2sgbW9kZSA9IEZpbGVMb2NrLmV4Y2x1c2l2ZSwgaW50IHN0YXJ0ID0gMCwgaW50IGVuZCA9IC0xXSk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgbG9ja3MgdGhlIGZpbGUgb3IgcGFydCBvZiB0aGUgZmlsZS4KICAgKgogICAqIEJ5IGRlZmF1bHQgYW4gZXhjbHVzaXZlIGxvY2sgd2lsbCBiZSBvYnRhaW5lZCwgYnV0IHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4KICAgKiBieSB0aGUgW21vZGVdIGFyZ3VtZW50LgogICAqCiAgICogTG9ja3MgdGhlIGJ5dGUgcmFuZ2UgZnJvbSBbc3RhcnRdIHRvIFtlbmRdIG9mIHRoZSBmaWxlICx3aXRoIHRoZQogICAqIGJ5dGUgYXQgcG9zaXRpb24gYGVuZGAgbm90IGluY2x1ZGVkLiBJZiBubyBhcmd1bWVudHMgYXJlCiAgICogc3BlY2lmaWVkLCB0aGUgZnVsbCBmaWxlIGlzIGxvY2tlZCwgSWYgb25seSBgc3RhcnRgIGlzIHNwZWNpZmllZAogICAqIHRoZSBmaWxlIGlzIGxvY2tlZCBmcm9tIGJ5dGUgcG9zaXRpb24gYHN0YXJ0YCB0byB0aGUgZW5kIG9mIHRoZQogICAqIGZpbGUsIG5vIG1hdHRlciBob3cgbGFyZ2UgaXQgZ3Jvd3MuIEl0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkgYW4KICAgKiBleHBsaWNpdCB2YWx1ZSBvZiBgZW5kYCB3aGljaCBpcyBwYXN0IHRoZSBjdXJyZW50IGxlbmd0aCBvZiB0aGUgZmlsZS4KICAgKgogICAqIFRvIG9idGFpbiBhbiBleGNsdXNpdmUgbG9jayBvbiBhIGZpbGUgaXQgbXVzdCBiZSBvcGVuZWQgZm9yIHdyaXRpbmcuCiAgICoKICAgKiBJZiBbbW9kZV0gaXMgW0ZpbGVMb2NrLmV4Y2x1c2l2ZV0gb3IgW0ZpbGVMb2NrLnNoYXJlZF0sIGFuIGV4Y2VwdGlvbiBpcwogICAqIHRocm93biBpZiB0aGUgbG9jayBjYW5ub3QgYmUgb2J0YWluZWQuIElmIFttb2RlXSBpcwogICAqIFtGaWxlTG9jay5ibG9ja2luZ0V4Y2x1c2l2ZV0gb3IgW0ZpbGVMb2NrLmJsb2NraW5nU2hhcmVkXSwgdGhlCiAgICogY2FsbCByZXR1cm5zIG9ubHkgYWZ0ZXIgdGhlIGxvY2sgaGFzIGJlZW4gb2J0YWluZWQuCiAgICoKICAgKiAqTk9URSogZmlsZSBsb2NraW5nIGRvZXMgaGF2ZSBzbGlnaHQgZGlmZmVyZW5jZXMgaW4gYmVoYXZpb3IgYWNyb3NzCiAgICogcGxhdGZvcm1zOgogICAqCiAgICogT24gTGludXggYW5kIE9TIFggdGhpcyB1c2VzIGFkdmlzb3J5IGxvY2tzLCB3aGljaCBoYXZlIHRoZQogICAqIHN1cnByaXNpbmcgc2VtYW50aWNzIHRoYXQgYWxsIGxvY2tzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGZpbGUKICAgKiBhcmUgcmVtb3ZlZCB3aGVuICphbnkqIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhhdCBmaWxlIGlzIGNsb3NlZCBieQogICAqIHRoZSBwcm9jZXNzLiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBhY3R1YWxseSBsb2NrIHRoZSBmaWxlIGZvcgogICAqIGFjY2Vzcy4gQWxzbyBub3RlIHRoYXQgYWR2aXNvcnkgbG9ja3MgYXJlIG9uIGEgcHJvY2VzcwogICAqIGxldmVsLiBUaGlzIG1lYW5zIHRoYXQgc2V2ZXJhbCBpc29sYXRlcyBpbiB0aGUgc2FtZSBwcm9jZXNzIGNhbgogICAqIG9idGFpbiBhbiBleGNsdXNpdmUgbG9jayBvbiB0aGUgc2FtZSBmaWxlLgogICAqCiAgICogT24gV2luZG93cyB0aGUgcmVnaW9ucyB1c2VkIGZvciBsb2NrIGFuZCB1bmxvY2sgbmVlZHMgdG8gbWF0Y2guIElmIHRoYXQKICAgKiBpcyBub3QgdGhlIGNhc2UgdW5sb2NraW5nIHdpbGwgcmVzdWx0IGluIHRoZSBPUyBlcnJvciAiVGhlIHNlZ21lbnQgaXMKICAgKiBhbHJlYWR5IHVubG9ja2VkIi4KICAgKgogICAqLwogIHZvaWQgbG9ja1N5bmMoCiAgICAgIFtGaWxlTG9jayBtb2RlID0gRmlsZUxvY2suZXhjbHVzaXZlLCBpbnQgc3RhcnQgPSAwLCBpbnQgZW5kID0gLTFdKTsKCiAgLyoqCiAgICogVW5sb2NrcyB0aGUgZmlsZSBvciBwYXJ0IG9mIHRoZSBmaWxlLgogICAqCiAgICogVW5sb2NrcyB0aGUgYnl0ZSByYW5nZSBmcm9tIFtzdGFydF0gdG8gW2VuZF0gb2YgdGhlIGZpbGUsIHdpdGgKICAgKiB0aGUgYnl0ZSBhdCBwb3NpdGlvbiBgZW5kYCBub3QgaW5jbHVkZWQuIElmIG5vIGFyZ3VtZW50cyBhcmUKICAgKiBzcGVjaWZpZWQsIHRoZSBmdWxsIGZpbGUgaXMgdW5sb2NrZWQsIElmIG9ubHkgYHN0YXJ0YCBpcwogICAqIHNwZWNpZmllZCB0aGUgZmlsZSBpcyB1bmxvY2tlZCBmcm9tIGJ5dGUgcG9zaXRpb24gYHN0YXJ0YCB0byB0aGUKICAgKiBlbmQgb2YgdGhlIGZpbGUuCiAgICoKICAgKiAqTk9URSogZmlsZSBsb2NraW5nIGRvZXMgaGF2ZSBzbGlnaHQgZGlmZmVyZW5jZXMgaW4gYmVoYXZpb3IgYWNyb3NzCiAgICogcGxhdGZvcm1zOgogICAqCiAgICogU2VlIFtsb2NrXSBmb3IgbW9yZSBkZXRhaWxzLgogICAqLwogIEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPiB1bmxvY2soW2ludCBzdGFydCA9IDAsIGludCBlbmQgPSAtMV0pOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IHVubG9ja3MgdGhlIGZpbGUgb3IgcGFydCBvZiB0aGUgZmlsZS4KICAgKgogICAqIFVubG9ja3MgdGhlIGJ5dGUgcmFuZ2UgZnJvbSBbc3RhcnRdIHRvIFtlbmRdIG9mIHRoZSBmaWxlLCB3aXRoCiAgICogdGhlIGJ5dGUgYXQgcG9zaXRpb24gYGVuZGAgbm90IGluY2x1ZGVkLiBJZiBubyBhcmd1bWVudHMgYXJlCiAgICogc3BlY2lmaWVkLCB0aGUgZnVsbCBmaWxlIGlzIHVubG9ja2VkLCBJZiBvbmx5IGBzdGFydGAgaXMKICAgKiBzcGVjaWZpZWQgdGhlIGZpbGUgaXMgdW5sb2NrZWQgZnJvbSBieXRlIHBvc2l0aW9uIGBzdGFydGAgdG8gdGhlCiAgICogZW5kIG9mIHRoZSBmaWxlLgogICAqCiAgICogKk5PVEUqIGZpbGUgbG9ja2luZyBkb2VzIGhhdmUgc2xpZ2h0IGRpZmZlcmVuY2VzIGluIGJlaGF2aW9yIGFjcm9zcwogICAqIHBsYXRmb3JtczoKICAgKgogICAqIFNlZSBbbG9ja1N5bmNdIGZvciBtb3JlIGRldGFpbHMuCiAgICovCiAgdm9pZCB1bmxvY2tTeW5jKFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kID0gLTFdKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBmb3IgdGhpcyBSYW5kb21BY2Nlc3NGaWxlIGluc3RhbmNlLgogICAqLwogIFN0cmluZyB0b1N0cmluZygpOwoKICAvKioKICAgKiBHZXRzIHRoZSBwYXRoIG9mIHRoZSBmaWxlIHVuZGVybHlpbmcgdGhpcyBSYW5kb21BY2Nlc3NGaWxlLgogICAqLwogIFN0cmluZyBnZXQgcGF0aDsKfQoKLyoqCiAqIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBhIGZpbGUgb3BlcmF0aW9uIGZhaWxzLgogKi8KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBGaWxlU3lzdGVtRXhjZXB0aW9uIGltcGxlbWVudHMgSU9FeGNlcHRpb24gewogIC8qKgogICAqIE1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgZXJyb3IuIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBhbnkgZGV0YWlsZWQKICAgKiBpbmZvcm1hdGlvbiBmb3JtIHRoZSB1bmRlcmx5aW5nIE9TIGVycm9yLiBDaGVjayBbb3NFcnJvcl0gZm9yCiAgICogdGhhdCBpbmZvcm1hdGlvbi4KICAgKi8KICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKCiAgLyoqCiAgICogVGhlIGZpbGUgc3lzdGVtIHBhdGggb24gd2hpY2ggdGhlIGVycm9yIG9jY3VycmVkLiBDYW4gYmUgYG51bGxgCiAgICogaWYgdGhlIGV4Y2VwdGlvbiBkb2VzIG5vdCByZWxhdGUgZGlyZWN0bHkgdG8gYSBmaWxlIHN5c3RlbSBwYXRoLgogICAqLwogIGZpbmFsIFN0cmluZyBwYXRoOwoKICAvKioKICAgKiBUaGUgdW5kZXJseWluZyBPUyBlcnJvci4gQ2FuIGJlIGBudWxsYCBpZiB0aGUgZXhjZXB0aW9uIGlzIG5vdAogICAqIHJhaXNlZCBkdWUgdG8gYW4gT1MgZXJyb3IuCiAgICovCiAgZmluYWwgT1NFcnJvciBvc0Vycm9yOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24gd2l0aCBhbiBvcHRpb25hbCBlcnJvciBtZXNzYWdlCiAgICogW21lc3NhZ2VdLCBvcHRpb25hbCBmaWxlIHN5c3RlbSBwYXRoIFtwYXRoXSBhbmQgb3B0aW9uYWwgT1MgZXJyb3IKICAgKiBbb3NFcnJvcl0uCiAgICovCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGNvbnN0IEZpbGVTeXN0ZW1FeGNlcHRpb24oW3RoaXMubWVzc2FnZSA9ICIiLCB0aGlzLnBhdGggPSAiIiwgdGhpcy5vc0Vycm9yXSk7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCJGaWxlU3lzdGVtRXhjZXB0aW9uIik7CiAgICBpZiAobWVzc2FnZS5pc05vdEVtcHR5KSB7CiAgICAgIHNiLndyaXRlKCI6ICRtZXNzYWdlIik7CiAgICAgIGlmIChwYXRoICE9IG51bGwpIHsKICAgICAgICBzYi53cml0ZSgiLCBwYXRoID0gJyRwYXRoJyIpOwogICAgICB9CiAgICAgIGlmIChvc0Vycm9yICE9IG51bGwpIHsKICAgICAgICBzYi53cml0ZSgiICgkb3NFcnJvcikiKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChvc0Vycm9yICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoIjogJG9zRXJyb3IiKTsKICAgICAgaWYgKHBhdGggIT0g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ZUNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXIoKTsKCiAgLy8gSGFzIHRoZSBzdHJlYW0gYmVlbiBwYXVzZWQgb3IgdW5zdWJzY3JpYmVkPwogIGJvb2wgX3Vuc3Vic2NyaWJlZCA9IGZhbHNlOwoKICAvLyBJcyB0aGVyZSBhIHJlYWQgY3VycmVudGx5IGluIHByb2dyZXNzPwogIGJvb2wgX3JlYWRJblByb2dyZXNzID0gdHJ1ZTsKICBib29sIF9jbG9zZWQgPSBmYWxzZTsKCiAgYm9vbCBfYXRFbmQgPSBmYWxzZTsKCiAgX0ZpbGVTdHJlYW0odGhpcy5fcGF0aCwgdGhpcy5fcG9zaXRpb24sIHRoaXMuX2VuZCkgewogICAgX3Bvc2l0aW9uID8/PSAwOwogIH0KCiAgX0ZpbGVTdHJlYW0uZm9yU3RkaW4oKSA6IF9wb3NpdGlvbiA9IDA7CgogIFN0cmVhbVN1YnNjcmlwdGlvbjxMaXN0PGludD4+IGxpc3Rlbih2b2lkIG9uRGF0YShMaXN0PGludD4gZXZlbnQpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSkgewogICAgX3NldHVwQ29udHJvbGxlcigpOwogICAgcmV0dXJuIF9jb250cm9sbGVyLnN0cmVhbS5saXN0ZW4ob25EYXRhLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsIG9uRG9uZTogb25Eb25lLCBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKTsKICB9CgogIHZvaWQgX3NldHVwQ29udHJvbGxlcigpIHsKICAgIF9jb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8TGlzdDxpbnQ+PigKICAgICAgICBzeW5jOiB0cnVlLAogICAgICAgIG9uTGlzdGVuOiBfc3RhcnQsCiAgICAgICAgb25SZXN1bWU6IF9yZWFkQmxvY2ssCiAgICAgICAgb25DYW5jZWw6ICgpIHsKICAgICAgICAgIF91bnN1YnNjcmliZWQgPSB0cnVlOwogICAgICAgICAgcmV0dXJuIF9jbG9zZUZpbGUoKTsKICAgICAgICB9KTsKICB9CgogIEZ1dHVyZSBfY2xvc2VGaWxlKCkgewogICAgaWYgKF9yZWFkSW5Qcm9ncmVzcyB8fCBfY2xvc2VkKSB7CiAgICAgIHJldHVybiBfY2xvc2VDb21wbGV0ZXIuZnV0dXJlOwogICAgfQogICAgX2Nsb3NlZCA9IHRydWU7CgogICAgdm9pZCBkb25lKCkgewogICAgICBfY2xvc2VDb21wbGV0ZXIuY29tcGxldGUoKTsKICAgICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICAgIH0KCiAgICBfb3BlbmVkRmlsZS5jbG9zZSgpLmNhdGNoRXJyb3IoX2NvbnRyb2xsZXIuYWRkRXJyb3IpLndoZW5Db21wbGV0ZShkb25lKTsKICAgIHJldHVybiBfY2xvc2VDb21wbGV0ZXIuZnV0dXJlOwogIH0KCiAgdm9pZCBfcmVhZEJsb2NrKCkgewogICAgLy8gRG9uJ3Qgc3RhcnQgYSBuZXcgcmVhZCBpZiBvbmUgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcy4KICAgIGlmIChfcmVhZEluUHJvZ3Jlc3MpIHJldHVybjsKICAgIGlmIChfYXRFbmQpIHsKICAgICAgX2Nsb3NlRmlsZSgpOwogICAgICByZXR1cm47CiAgICB9CiAgICBfcmVhZEluUHJvZ3Jlc3MgPSB0cnVlOwogICAgaW50IHJlYWRCeXRlcyA9IF9ibG9ja1NpemU7CiAgICBpZiAoX2VuZCAhPSBudWxsKSB7CiAgICAgIHJlYWRCeXRlcyA9IG1pbihyZWFkQnl0ZXMsIF9lbmQgLSBfcG9zaXRpb24pOwogICAgICBpZiAocmVhZEJ5dGVzIDwgMCkgewogICAgICAgIF9yZWFkSW5Qcm9ncmVzcyA9IGZhbHNlOwogICAgICAgIGlmICghX3Vuc3Vic2NyaWJlZCkgewogICAgICAgICAgX2NvbnRyb2xsZXIuYWRkRXJyb3IobmV3IFJhbmdlRXJyb3IoIkJhZCBlbmQgcG9zaXRpb246ICRfZW5kIikpOwogICAgICAgICAgX2Nsb3NlRmlsZSgpOwogICAgICAgICAgX3Vuc3Vic2NyaWJlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgX29wZW5lZEZpbGUucmVhZChyZWFkQnl0ZXMpLnRoZW4oKGJsb2NrKSB7CiAgICAgIF9yZWFkSW5Qcm9ncmVzcyA9IGZhbHNlOwogICAgICBpZiAoX3Vuc3Vic2NyaWJlZCkgewogICAgICAgIF9jbG9zZUZpbGUoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgX3Bvc2l0aW9uICs9IGJsb2NrLmxlbmd0aDsKICAgICAgaWYgKGJsb2NrLmxlbmd0aCA8IHJlYWRCeXRlcyB8fCAoX2VuZCAhPSBudWxsICYmIF9wb3NpdGlvbiA9PSBfZW5kKSkgewogICAgICAgIF9hdEVuZCA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKCFfYXRFbmQgJiYgIV9jb250cm9sbGVyLmlzUGF1c2VkKSB7CiAgICAgICAgX3JlYWRCbG9jaygpOwogICAgICB9CiAgICAgIF9jb250cm9sbGVyLmFkZChibG9jayk7CiAgICAgIGlmIChfYXRFbmQpIHsKICAgICAgICBfY2xvc2VGaWxlKCk7CiAgICAgIH0KICAgIH0pLmNhdGNoRXJyb3IoKGUsIHMpIHsKICAgICAgaWYgKCFfdW5zdWJzY3JpYmVkKSB7CiAgICAgICAgX2NvbnRyb2xsZXIuYWRkRXJyb3IoZSwgcyk7CiAgICAgICAgX2Nsb3NlRmlsZSgpOwogICAgICAgIF91bnN1YnNjcmliZWQgPSB0cnVlOwogICAgICB9CiAgICB9KTsKICB9CgogIHZvaWQgX3N0YXJ0KCkgewogICAgaWYgKF9wb3NpdGlvbiA8IDApIHsKICAgICAgX2NvbnRyb2xsZXIuYWRkRXJyb3IobmV3IFJhbmdlRXJyb3IoIkJhZCBzdGFydCBwb3NpdGlvbjogJF9wb3NpdGlvbiIpKTsKICAgICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICAgICAgX2Nsb3NlQ29tcGxldGVyLmNvbXBsZXRlKCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2b2lkIG9uUmVhZHkoUmFuZG9tQWNjZXNzRmlsZSBmaWxlKSB7CiAgICAgIF9vcGVuZWRGaWxlID0gZmlsZTsKICAgICAgX3JlYWRJblByb2dyZXNzID0gZmFsc2U7CiAgICAgIF9yZWFkQmxvY2soKTsKICAgIH0KCiAgICB2b2lkIG9uT3BlbkZpbGUoUmFuZG9tQWNjZXNzRmlsZSBmaWxlKSB7CiAgICAgIGlmIChfcG9zaXRpb24gPiAwKSB7CiAgICAgICAgZmlsZS5zZXRQb3NpdGlvbihfcG9zaXRpb24pLnRoZW4ob25SZWFkeSwgb25FcnJvcjogKGUsIHMpIHsKICAgICAgICAgIF9jb250cm9sbGVyLmFkZEVycm9yKGUsIHMpOwogICAgICAgICAgX3JlYWRJblByb2dyZXNzID0gZmFsc2U7CiAgICAgICAgICBfY2xvc2VGaWxlKCk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb25SZWFkeShmaWxlKTsKICAgICAgfQogICAgfQoKICAgIHZvaWQgb3BlbkZhaWxlZChlcnJvciwgc3RhY2tUcmFjZSkgewogICAgICBfY29udHJvbGxlci5hZGRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgICAgIF9jbG9zZUNvbXBsZXRlci5jb21wbGV0ZSgpOwogICAgfQoKICAgIGlmIChfcGF0aCAhPSBudWxsKSB7CiAgICAgIG5ldyBGaWxlKF9wYXRoKQogICAgICAgICAgLm9wZW4obW9kZTogRmlsZU1vZGUucmVhZCkKICAgICAgICAgIC50aGVuKG9uT3BlbkZpbGUsIG9uRXJyb3I6IG9wZW5GYWlsZWQpOwogICAgfSBlbHNlIHsKICAgICAgdHJ5IHsKICAgICAgICBvbk9wZW5GaWxlKF9GaWxlLl9vcGVuU3RkaW9TeW5jKDApKTsKICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgIG9wZW5GYWlsZWQoZSwgcyk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmNsYXNzIF9GaWxlU3RyZWFtQ29uc3VtZXIgZXh0ZW5kcyBTdHJlYW1Db25zdW1lcjxMaXN0PGludD4+IHsKICBGaWxlIF9maWxlOwogIEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPiBfb3BlbkZ1dHVyZTsKCiAgX0ZpbGVTdHJlYW1Db25zdW1lcih0aGlzLl9maWxlLCBGaWxlTW9kZSBtb2RlKSB7CiAgICBfb3BlbkZ1dHVyZSA9IF9maWxlLm9wZW4obW9kZTogbW9kZSk7CiAgfQoKICBfRmlsZVN0cmVhbUNvbnN1bWVyLmZyb21TdGRpbyhpbnQgZmQpIHsKICAgIF9vcGVuRnV0dXJlID0gbmV3IEZ1dHVyZS52YWx1ZShfRmlsZS5fb3BlblN0ZGlvU3luYyhmZCkpOwogIH0KCiAgRnV0dXJlPEZpbGU+IGFkZFN0cmVhbShTdHJlYW08TGlzdDxpbnQ+PiBzdHJlYW0pIHsKICAgIENvbXBsZXRlcjxGaWxlPiBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPEZpbGU+LnN5bmMoKTsKICAgIF9vcGVuRnV0dXJlLnRoZW4oKG9wZW5lZEZpbGUpIHsKICAgICAgdmFyIF9zdWJzY3JpcHRpb247CiAgICAgIHZvaWQgZXJyb3IoZSwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pIHsKICAgICAgICBfc3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogICAgICAgIG9wZW5lZEZpbGUuY2xvc2UoKTsKICAgICAgICBjb21wbGV0ZXIuY29tcGxldGVFcnJvcihlLCBzdGFja1RyYWNlKTsKICAgICAgfQoKICAgICAgX3N1YnNjcmlwdGlvbiA9IHN0cmVhbS5saXN0ZW4oKGQpIHsKICAgICAgICBfc3Vic2NyaXB0aW9uLnBhdXNlKCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIG9wZW5lZEZpbGUKICAgICAgICAgICAgICAud3JpdGVGcm9tKGQsIDAsIGQubGVuZ3RoKQogICAgICAgICAgICAgIC50aGVuKChfKSA9PiBfc3Vic2NyaXB0aW9uLnJlc3VtZSgpLCBvbkVycm9yOiBlcnJvcik7CiAgICAgICAgfSBjYXRjaCAoZSwgc3RhY2tUcmFjZSkgewogICAgICAgICAgZXJyb3IoZSwgc3RhY2tUcmFjZSk7CiAgICAgICAgfQogICAgICB9LCBvbkRvbmU6ICgpIHsKICAgICAgICBjb21wbGV0ZXIuY29tcGxldGUoX2ZpbGUpOwogICAgICB9LCBvbkVycm9yOiBlcnJvciwgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICB9KS5jYXRjaEVycm9yKGNvbXBsZXRlci5jb21wbGV0ZUVycm9yKTsKICAgIHJldHVybiBjb21wbGV0ZXIuZnV0dXJlOwogIH0KCiAgRnV0dXJlPEZpbGU+IGNsb3NlKCkgPT4KICAgICAgX29wZW5GdXR1cmUudGhlbigob3BlbmVkRmlsZSkgPT4gb3BlbmVkRmlsZS5jbG9zZSgpKS50aGVuKChfKSA9PiBfZmlsZSk7Cn0KCi8vIENsYXNzIGZvciBlbmNhcHN1bGF0aW5nIHRoZSBuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgZmlsZXMuCmNsYXNzIF9GaWxlIGV4dGVuZHMgRmlsZVN5c3RlbUVudGl0eSBpbXBsZW1lbnRzIEZpbGUgewogIFN0cmluZyBfcGF0aDsKICBVaW50OExpc3QgX3Jhd1BhdGg7CgogIF9GaWxlKFN0cmluZyBwYXRoKSB7CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChwYXRoLCAncGF0aCcpOwogICAgX3BhdGggPSBwYXRoOwogICAgX3Jhd1BhdGggPSBGaWxlU3lzdGVtRW50aXR5Ll90b1V0ZjhBcnJheShwYXRoKTsKICB9CgogIF9GaWxlLmZyb21SYXdQYXRoKFVpbnQ4TGlzdCByYXdQYXRoKSB7CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChyYXdQYXRoLCAncmF3UGF0aCcpOwogICAgX3Jhd1BhdGggPSBGaWxlU3lzdGVtRW50aXR5Ll90b051bGxUZXJtaW5hdGVkVXRmOEFycmF5KHJhd1BhdGgpOwogICAgX3BhdGggPSBGaWxlU3lzdGVtRW50aXR5Ll90b1N0cmluZ0Zyb21VdGY4QXJyYXkocmF3UGF0aCk7CiAgfQoKICBTdHJpbmcgZ2V0IHBhdGggPT4gX3BhdGg7CgogIC8vIFdBUk5JTkc6CiAgLy8gQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgaW5jcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiB0aGUgbmF0aXZlCiAgLy8gbmFtZXNwYWNlIG9iamVjdC4gSXQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHRvIHBhc3MgdGhlIHBvaW50ZXIgdG8gdGhlCiAgLy8gSU9TZXJ2aWNlLCB3aGljaCB3aWxsIGRlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IHdoZW4gaXQgaXMgZmluaXNoZWQKICAvLyB3aXRoIGl0LgogIHN0YXRpYyBpbnQgX25hbWVzcGFjZVBvaW50ZXIoKSA9PiBfTmFtZXNwYWNlLl9uYW1lc3BhY2VQb2ludGVyOwoKICBzdGF0aWMgRnV0dXJlIF9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoaW50IHJlcXVlc3QsIExpc3QgZGF0YSkgewogICAgZGF0YVswXSA9IF9uYW1lc3BhY2VQb2ludGVyKCk7CiAgICByZXR1cm4gX0lPU2VydmljZS5fZGlzcGF0Y2gocmVxdWVzdCwgZGF0YSk7CiAgfQoKICBGdXR1cmU8Ym9vbD4gZXhpc3RzKCkgewogICAgcmV0dXJuIF9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoX0lPU2VydmljZS5maWxlRXhpc3RzLCBbbnVsbCwgX3Jhd1BhdGhdKQogICAgICAgIC50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKHJlc3BvbnNlLCAiQ2Fubm90IGNoZWNrIGV4aXN0ZW5jZSIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiByZXNwb25zZTsKICAgIH0pOwogIH0KCiAgZXh0ZXJuYWwgc3RhdGljIF9leGlzdHMoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoKTsKCiAgYm9vbCBleGlzdHNTeW5jKCkgewogICAgdmFyIHJlc3VsdCA9IF9leGlzdHMoX05hbWVzcGFjZS5fbmFtZXNwYWNlLCBfcmF3UGF0aCk7CiAgICB0aHJvd0lmRXJyb3IocmVzdWx0LCAiQ2Fubm90IGNoZWNrIGV4aXN0ZW5jZSBvZiBmaWxlIiwgcGF0aCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgRmlsZSBnZXQgYWJzb2x1dGUgPT4gbmV3IEZpbGUoX2Fic29sdXRlUGF0aCk7CgogIEZ1dHVyZTxGaWxlPiBjcmVhdGUoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pIHsKICAgIHZhciByZXN1bHQgPQogICAgICAgIHJlY3Vyc2l2ZSA/IHBhcmVudC5jcmVhdGUocmVjdXJzaXZlOiB0cnVlKSA6IG5ldyBGdXR1cmUudmFsdWUobnVsbCk7CiAgICByZXR1cm4gcmVzdWx0CiAgICAgICAgLnRoZW4oKF8pID0+CiAgICAgICAgICAgIF9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoX0lPU2VydmljZS5maWxlQ3JlYXRlLCBbbnVsbCwgX3Jhd1BhdGhdKSkKICAgICAgICAudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbkZyb21SZXNwb25zZShyZXNwb25zZSwgIkNhbm5vdCBjcmVhdGUgZmlsZSIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CiAgfQoKICBleHRlcm5hbCBzdGF0aWMgX2NyZWF0ZShfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpOwoKICBleHRlcm5hbCBzdGF0aWMgX2NyZWF0ZUxpbmsoCiAgICAgIF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCwgU3RyaW5nIHRhcmdldCk7CgogIGV4dGVybmFsIHN0YXRpYyBfbGlua1RhcmdldChfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpOwoKICB2b2lkIGNyZWF0ZVN5bmMoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pIHsKICAgIGlmIChyZWN1cnNpdmUpIHsKICAgICAgcGFyZW50LmNyZWF0ZVN5bmMocmVjdXJzaXZlOiB0cnVlKTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBfY3JlYXRlKF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgpOwogICAgdGhyb3dJZkVycm9yKHJlc3VsdCwgIkNhbm5vdCBjcmVhdGUgZmlsZSIsIHBhdGgpOwogIH0KCiAgRnV0dXJlPEZpbGU+IF9kZWxldGUoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pIHsKICAgIGlmIChyZWN1cnNpdmUpIHsKICAgICAgcmV0dXJuIG5ldyBEaXJlY3RvcnkocGF0aCkuZGVsZXRlKHJlY3Vyc2l2ZTogdHJ1ZSkudGhlbigoXykgPT4gdGhpcyk7CiAgICB9CiAgICByZXR1cm4gX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZShfSU9TZXJ2aWNlLmZpbGVEZWxldGUsIFtudWxsLCBfcmF3UGF0aF0pCiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsICJDYW5ub3QgZGVsZXRlIGZpbGUiLCBwYXRoKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0pOwogIH0KCiAgZXh0ZXJuYWwgc3RhdGljIF9kZWxldGVOYXRpdmUoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoKTsKCiAgZXh0ZXJuYWwgc3RhdGljIF9kZWxldGVMaW5rTmF0aXZlKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCk7CgogIHZvaWQgX2RlbGV0ZVN5bmMoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pIHsKICAgIGlmIChyZWN1cnNpdmUpIHsKICAgICAgcmV0dXJuIG5ldyBEaXJlY3RvcnkuZnJvbVJhd1BhdGgoX3Jhd1BhdGgpLmRlbGV0ZVN5bmMocmVjdXJzaXZlOiB0cnVlKTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBfZGVsZXRlTmF0aXZlKF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgpOwogICAgdGhyb3dJZkVycm9yKHJlc3VsdCwgIkNhbm5vdCBkZWxldGUgZmlsZSIsIHBhdGgpOwogIH0KCiAgRnV0dXJlPEZpbGU+IHJlbmFtZShTdHJpbmcgbmV3UGF0aCkgewogICAgcmV0dXJuIF9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoCiAgICAgICAgX0lPU2VydmljZS5maWxlUmVuYW1lLCBbbnVsbCwgX3Jhd1BhdGgsIG5ld1BhdGhdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKAogICAgICAgICAgICByZXNwb25zZSwgIkNhbm5vdCByZW5hbWUgZmlsZSB0byAnJG5ld1BhdGgnIiwgcGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBGaWxlKG5ld1BhdGgpOwogICAgfSk7CiAgfQoKICBleHRlcm5hbCBzdGF0aWMgX3JlbmFtZSgKICAgICAgX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCBvbGRQYXRoLCBTdHJpbmcgbmV3UGF0aCk7CgogIGV4dGVybmFsIHN0YXRpYyBfcmVuYW1lTGluaygKICAgICAgX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCBvbGRQYXRoLCBTdHJpbmcgbmV3UGF0aCk7CgogIEZpbGUgcmVuYW1lU3luYyhTdHJpbmcgbmV3UGF0aCkgewogICAgdmFyIHJlc3VsdCA9IF9yZW5hbWUoX05hbWVzcGFjZS5fbmFtZXNwYWNlLCBfcmF3UGF0aCwgbmV3UGF0aCk7CiAgICB0aHJvd0lmRXJyb3IocmVzdWx0LCAiQ2Fubm90IHJlbmFtZSBmaWxlIHRvICckbmV3UGF0aCciLCBwYXRoKTsKICAgIHJldHVybiBuZXcgRmlsZShuZXdQYXRoKTsKICB9CgogIEZ1dHVyZTxGaWxlPiBjb3B5KFN0cmluZyBuZXdQYXRoKSB7CiAgICByZXR1cm4gX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZSgKICAgICAgICBfSU9TZXJ2aWNlLmZpbGVDb3B5LCBbbnVsbCwgX3Jhd1BhdGgsIG5ld1BhdGhdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKAogICAgICAgICAgICByZXNwb25zZSwgIkNhbm5vdCBjb3B5IGZpbGUgdG8gJyRuZXdQYXRoJyIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgRmlsZShuZXdQYXRoKTsKICAgIH0pOwogIH0KCiAgZXh0ZXJuYWwgc3RhdGljIF9jb3B5KAogICAgICBfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IG9sZFBhdGgsIFN0cmluZyBuZXdQYXRoKTsKCiAgRmlsZSBjb3B5U3luYyhTdHJpbmcgbmV3UGF0aCkgewogICAgdmFyIHJlc3VsdCA9IF9jb3B5KF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgsIG5ld1BhdGgpOwogICAgdGhyb3dJZkVycm9yKHJlc3VsdCwgIkNhbm5vdCBjb3B5IGZpbGUgdG8gJyRuZXdQYXRoJyIsIHBhdGgpOwogICAgcmV0dXJuIG5ldyBGaWxlKG5ld1BhdGgpOwogIH0KCiAgRnV0dXJlPFJhbmRvbUFjY2Vzc0ZpbGU+IG9wZW4oe0ZpbGVNb2RlIG1vZGU6IEZpbGVNb2RlLnJlYWR9KSB7CiAgICBpZiAobW9kZSAhPSBGaWxlTW9kZS5yZWFkICYmCiAgICAgICAgbW9kZSAhPSBGaWxlTW9kZS53cml0ZSAmJgogICAgICAgIG1vZGUgIT0gRmlsZU1vZGUuYXBwZW5kICYmCiAgICAgICAgbW9kZSAhPSBGaWxlTW9kZS53cml0ZU9ubHkgJiYKICAgICAgICBtb2RlICE9IEZpbGVNb2RlLndyaXRlT25seUFwcGVuZCkgewogICAgICByZXR1cm4gbmV3IEZ1dHVyZS5lcnJvcigKICAgICAgICAgIG5ldyBBcmd1bWVudEVycm9yKCdJbnZhbGlkIGZpbGUgbW9kZSBmb3IgdGhpcyBvcGVyYXRpb24nKSk7CiAgICB9CiAgICByZXR1cm4gX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZSgKICAgICAgICBfSU9TZXJ2aWNlLmZpbGVPcGVuLCBbbnVsbCwgX3Jhd1BhdGgsIG1vZGUuX21vZGVdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKHJlc3BvbnNlLCAiQ2Fubm90IG9wZW4gZmlsZSIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgX1JhbmRvbUFjY2Vzc0ZpbGUocmVzcG9uc2UsIHBhdGgpOwogICAgfSk7CiAgfQoKICBGdXR1cmU8aW50PiBsZW5ndGgoKSB7CiAgICByZXR1cm4gX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZSgKICAgICAgICBfSU9TZXJ2aWNlLmZpbGVMZW5ndGhGcm9tUGF0aCwgW251bGwsIF9yYXdQYXRoXSkudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbkZyb21SZXNwb25zZSgKICAgICAgICAgICAgcmVzcG9uc2UsICJDYW5ub3QgcmV0cmlldmUgbGVuZ3RoIG9mIGZpbGUiLCBwYXRoKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICB9KTsKICB9CgogIGV4dGVybmFsIHN0YXRpYyBfbGVuZ3RoRnJvbVBhdGgoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoKTsKCiAgaW50IGxlbmd0aFN5bmMoKSB7CiAgICB2YXIgcmVzdWx0ID0gX2xlbmd0aEZyb21QYXRoKF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgpOwogICAgdGhyb3dJZkVycm9yKHJlc3VsdCwgIkNhbm5vdCByZXRyaWV2ZSBsZW5ndGggb2YgZmlsZSIsIHBhdGgpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEZ1dHVyZTxEYXRlVGltZT4gbGFzdEFjY2Vzc2VkKCkgewogICAgcmV0dXJuIF9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoX0lPU2VydmljZS5maWxlTGFzdEFjY2Vzc2VkLCBbbnVsbCwgX3Jhd1BhdGhdKQogICAgICAgIC50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKAogICAgICAgICAgICByZXNwb25zZSwgIkNhbm5vdCByZXRyaWV2ZSBhY2Nlc3MgdGltZSIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUuZnJvbU1pbGxpc2Vjb25kc1NpbmNlRXBvY2gocmVzcG9uc2UpOwogICAgfSk7CiAgfQoKICBleHRlcm5hbCBzdGF0aWMgX2xhc3RBY2Nlc3NlZChfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpOwoKICBEYXRlVGltZSBsYXN0QWNjZXNzZWRTeW5jKCkgewogICAgdmFyIG1zID0gX2xhc3RBY2Nlc3NlZChfTmFtZXNwYWNlLl9uYW1lc3BhY2UsIF9yYXdQYXRoKTsKICAgIHRocm93SWZFcnJvcihtcywgIkNhbm5vdCByZXRyaWV2ZSBhY2Nlc3MgdGltZSIsIHBhdGgpOwogICAgcmV0dXJuIG5ldyBEYXRlVGltZS5mcm9tTWlsbGlzZWNvbmRzU2luY2VFcG9jaChtcyk7CiAgfQoKICBGdXR1cmUgc2V0TGFzdEFjY2Vzc2VkKERhdGVUaW1lIHRpbWUpIHsKICAgIGludCBtaWxsaXMgPSB0aW1lLm1pbGxpc2Vjb25kc1NpbmNlRXBvY2g7CiAgICByZXR1cm4gX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZSgKICAgICAgICAgICAgX0lPU2VydmljZS5maWxlU2V0TGFzdEFjY2Vzc2VkLCBbbnVsbCwgX3Jhd1BhdGgsIG1pbGxpc10pCiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsICJDYW5ub3Qgc2V0IGFjY2VzcyB0aW1lIiwgcGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9KTsKICB9CgogIGV4dGVybmFsIHN0YXRpYyBfc2V0TGFzdEFjY2Vzc2VkKAogICAgICBfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgsIGludCBtaWxsaXMpOwoKICB2b2lkIHNldExhc3RBY2Nlc3NlZFN5bmMoRGF0ZVRpbWUgdGltZSkgewogICAgaW50IG1pbGxpcyA9IHRpbWUubWlsbGlzZWNvbmRzU2luY2VFcG9jaDsKICAgIHZhciByZXN1bHQgPSBfc2V0TGFzdEFjY2Vzc2VkKF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgsIG1pbGxpcyk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oCiAgICAgICAgICAiRmFpbGVkIHRvIHNldCBmaWxlIGFjY2VzcyB0aW1lIiwgcGF0aCwgcmVzdWx0KTsKICAgIH0KICB9CgogIEZ1dHVyZTxEYXRlVGltZT4gbGFzdE1vZGlmaWVkKCkgewogICAgcmV0dXJuIF9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoX0lPU2VydmljZS5maWxlTGFzdE1vZGlmaWVkLCBbbnVsbCwgX3Jhd1BhdGhdKQogICAgICAgIC50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKAogICAgICAgICAgICByZXNwb25zZSwgIkNhbm5vdCByZXRyaWV2ZSBtb2RpZmljYXRpb24gdGltZSIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUuZnJvbU1pbGxpc2Vjb25kc1NpbmNlRXBvY2gocmVzcG9uc2UpOwogICAgfSk7CiAgfQoKICBleHRlcm5hbCBzdGF0aWMgX2xhc3RNb2RpZmllZChfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpOwoKICBEYXRlVGltZSBsYXN0TW9kaWZpZWRTeW5jKCkgewogICAgdmFyIG1zID0gX2xhc3RNb2RpZmllZChfTmFtZXNwYWNlLl9uYW1lc3BhY2UsIF9yYXdQYXRoKTsKICAgIHRocm93SWZFcnJvcihtcywgIkNhbm5vdCByZXRyaWV2ZSBtb2RpZmljYXRpb24gdGltZSIsIHBhdGgpOwogICAgcmV0dXJuIG5ldyBEYXRlVGltZS5mcm9tTWlsbGlzZWNvbmRzU2luY2VFcG9jaChtcyk7CiAgfQoKICBGdXR1cmUgc2V0TGFzdE1vZGlmaWVkKERhdGVUaW1lIHRpbWUpIHsKICAgIGludCBtaWxsaXMgPSB0aW1lLm1pbGxpc2Vjb25kc1NpbmNlRXBvY2g7CiAgICByZXR1cm4gX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZSgKICAgICAgICAgICAgX0lPU2VydmljZS5maWxlU2V0TGFzdE1vZGlmaWVkLCBbbnVsbCwgX3Jhd1BhdGgsIG1pbGxpc10pCiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UoCiAgICAgICAgICAgIHJlc3BvbnNlLCAiQ2Fubm90IHNldCBtb2RpZmljYXRpb24gdGltZSIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfSk7CiAgfQoKICBleHRlcm5hbCBzdGF0aWMgX3NldExhc3RNb2RpZmllZCgKICAgICAgX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoLCBpbnQgbWlsbGlzKTsKCiAgdm9pZCBzZXRMYXN0TW9kaWZpZWRTeW5jKERhdGVUaW1lIHRpbWUpIHsKICAgIGludCBtaWxsaXMgPSB0aW1lLm1pbGxpc2Vjb25kc1NpbmNlRXBvY2g7CiAgICB2YXIgcmVzdWx0ID0gX3NldExhc3RNb2RpZmllZChfTmFtZXNwYWNlLl9uYW1lc3BhY2UsIF9yYXdQYXRoLCBtaWxsaXMpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKAogICAgICAgICAgIkZhaWxlZCB0byBzZXQgZmlsZSBtb2RpZmljYXRpb24gdGltZSIsIHBhdGgsIHJlc3VsdCk7CiAgICB9CiAgfQoKICBleHRlcm5hbCBzdGF0aWMgX29wZW4oX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoLCBpbnQgbW9kZSk7CgogIFJhbmRvbUFjY2Vzc0ZpbGUgb3BlblN5bmMoe0ZpbGVNb2RlIG1vZGU6IEZpbGVNb2RlLnJlYWR9KSB7CiAgICBpZiAobW9kZSAhPSBGaWxlTW9kZS5yZWFkICYmCiAgICAgICAgbW9kZSAhPSBGaWxlTW9kZS53cml0ZSAmJgogICAgICAgIG1vZGUgIT0gRmlsZU1vZGUuYXBwZW5kICYmCiAgICAgICAgbW9kZSAhPSBGaWxlTW9kZS53cml0ZU9ubHkgJiYKICAgICAgICBtb2RlICE9IEZpbGVNb2RlLndyaXRlT25seUFwcGVuZCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignSW52YWxpZCBmaWxlIG1vZGUgZm9yIHRoaXMgb3BlcmF0aW9uJyk7CiAgICB9CiAgICB2YXIgaWQgPSBfb3BlbihfTmFtZXNwYWNlLl9uYW1lc3BhY2UsIF9yYXdQYXRoLCBtb2RlLl9tb2RlKTsKICAgIHRocm93SWZFcnJvcihpZCwgIkNhbm5vdCBvcGVuIGZpbGUiLCBwYXRoKTsKICAgIHJldHVybiBuZXcgX1JhbmRvbUFjY2Vzc0ZpbGUoaWQsIF9wYXRoKTsKICB9CgogIGV4dGVybmFsIHN0YXRpYyBpbnQgX29wZW5TdGRpbyhpbnQgZmQpOwoKICBzdGF0aWMgUmFuZG9tQWNjZXNzRmlsZSBfb3BlblN0ZGlvU3luYyhpbnQgZmQpIHsKICAgIHZhciBpZCA9IF9vcGVuU3RkaW8oZmQpOwogICAgaWYgKGlkID09IDApIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oIkNhbm5vdCBvcGVuIHN0ZGlvIGZpbGUgZm9yOiAkZmQiKTsKICAgIH0KICAgIHJldHVybiBuZXcgX1JhbmRvbUFjY2Vzc0ZpbGUoaWQsICIiKTsKICB9CgogIFN0cmVhbTxMaXN0PGludD4+IG9wZW5SZWFkKFtpbnQgc3RhcnQsIGludCBlbmRdKSB7CiAgICByZXR1cm4gbmV3IF9GaWxlU3RyZWFtKHBhdGgsIHN0YXJ0LCBlbmQpOwogIH0KCiAgSU9TaW5rIG9wZW5Xcml0ZSh7RmlsZU1vZGUgbW9kZTogRmlsZU1vZGUud3JpdGUsIEVuY29kaW5nIGVuY29kaW5nOiB1dGY4fSkgewogICAgaWYgKG1vZGUgIT0gRmlsZU1vZGUud3JpdGUgJiYKICAgICAgICBtb2RlICE9IEZpbGVNb2RlLmFwcGVuZCAmJgogICAgICAgIG1vZGUgIT0gRmlsZU1vZGUud3JpdGVPbmx5ICYmCiAgICAgICAgbW9kZSAhPSBGaWxlTW9kZS53cml0ZU9ubHlBcHBlbmQpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgZmlsZSBtb2RlIGZvciB0aGlzIG9wZXJhdGlvbicpOwogICAgfQogICAgdmFyIGNvbnN1bWVyID0gbmV3IF9GaWxlU3RyZWFtQ29uc3VtZXIodGhpcywgbW9kZSk7CiAgICByZXR1cm4gbmV3IElPU2luayhjb25zdW1lciwgZW5jb2Rpbmc6IGVuY29kaW5nKTsKICB9CgogIEZ1dHVyZTxMaXN0PGludD4+IHJlYWRBc0J5dGVzKCkgewogICAgRnV0dXJlPExpc3Q8aW50Pj4gcmVhZERhdGFDaHVua2VkKFJhbmRvbUFjY2Vzc0ZpbGUgZmlsZSkgewogICAgICB2YXIgYnVpbGRlciA9IG5ldyBCeXRlc0J1aWxkZXIoY29weTogZmFsc2UpOwogICAgICB2YXIgY29tcGxldGVyID0gbmV3IENvbXBsZXRlcjxMaXN0PGludD4+KCk7CiAgICAgIHZvaWQgcmVhZCgpIHsKICAgICAgICBmaWxlLnJlYWQoX2Jsb2NrU2l6ZSkudGhlbigoZGF0YSkgewogICAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMCkgewogICAgICAgICAgICBidWlsZGVyLmFkZChkYXRhKTsKICAgICAgICAgICAgcmVhZCgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29tcGxldGVyLmNvbXBsZXRlKGJ1aWxkZXIudGFrZUJ5dGVzKCkpOwogICAgICAgICAgfQogICAgICAgIH0sIG9uRXJyb3I6IGNvbXBsZXRlci5jb21wbGV0ZUVycm9yKTsKICAgICAgfQoKICAgICAgcmVhZCgpOwogICAgICByZXR1cm4gY29tcGxldGVyLmZ1dHVyZTsKICAgIH0KCiAgICByZXR1cm4gb3BlbigpLnRoZW4oKGZpbGUpIHsKICAgICAgcmV0dXJuIGZpbGUubGVuZ3RoKCkudGhlbigobGVuZ3RoKSB7CiAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAvLyBNYXkgYmUgY2hhcmFjdGVyIGRldmljZSwgdHJ5IHRvIHJlYWQgaXQgaW4gY2h1bmtzLgogICAgICAgICAgcmV0dXJuIHJlYWREYXRhQ2h1bmtlZChmaWxlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZpbGUucmVhZChsZW5ndGgpOwogICAgICB9KS53aGVuQ29tcGxldGUoZmlsZS5jbG9zZSk7CiAgICB9KTsKICB9CgogIExpc3Q8aW50PiByZWFkQXNCeXRlc1N5bmMoKSB7CiAgICB2YXIgb3BlbmVkID0gb3BlblN5bmMoKTsKICAgIHRyeSB7CiAgICAgIExpc3Q8aW50PiBkYXRhOwogICAgICB2YXIgbGVuZ3RoID0gb3BlbmVkLmxlbmd0aFN5bmMoKTsKICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CiAgICAgICAgLy8gTWF5IGJlIGNoYXJhY3RlciBkZXZpY2UsIHRyeSB0byByZWFkIGl0IGluIGNodW5rcy4KICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBCeXRlc0J1aWxkZXIoY29weTogZmFsc2UpOwogICAgICAgIGRvIHsKICAgICAgICAgIGRhdGEgPSBvcGVuZWQucmVhZFN5bmMoX2Jsb2NrU2l6ZSk7CiAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiAwKSBidWlsZGVyLmFkZChkYXRhKTsKICAgICAgICB9IHdoaWxlIChkYXRhLmxlbmd0aCA+IDApOwogICAgICAgIGRhdGEgPSBidWlsZGVyLnRha2VCeXRlcygpOwogICAgICB9IGVsc2UgewogICAgICAgIGRhdGEgPSBvcGVuZWQucmVhZFN5bmMobGVuZ3RoKTsKICAgICAgfQogICAgICByZXR1cm4gZGF0YTsKICAgIH0gZmluYWxseSB7CiAgICAgIG9wZW5lZC5jbG9zZVN5bmMoKTsKICAgIH0KICB9CgogIFN0cmluZyBfdHJ5RGVjb2RlKExpc3Q8aW50PiBieXRlcywgRW5jb2RpbmcgZW5jb2RpbmcpIHsKICAgIHRyeSB7CiAgICAgIHJldHVybiBlbmNvZGluZy5kZWNvZGUoYnl0ZXMpOwogICAgfSBjYXRjaCAoXykgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigKICAgICAgICAgICJGYWlsZWQgdG8gZGVjb2RlIGRhdGEgdXNpbmcgZW5jb2RpbmcgJyR7ZW5jb2RpbmcubmFtZX0nIiwgcGF0aCk7CiAgICB9CiAgfQoKICBGdXR1cmU8U3RyaW5nPiByZWFkQXNTdHJpbmcoe0VuY29kaW5nIGVuY29kaW5nOiB1dGY4fSkgewogICAgLy8gVE9ETyhkYXJ0OmlvKTogSWYgdGhlIGNoYW5nZSBpbiBhc3luYyBzZW1hbnRpY3MgdG8gcnVuIHN5bmNocm9ub3VzbHkKICAgIC8vIHVudGlsIGF3YWl0IGxhbmRzLCB0aGlzIGlzIGFzIGVmZmljaWVudCBhcwogICAgLy8gcmV0dXJuIF90cnlEZWNvZGUoYXdhaXQgcmVhZEFzQnl0ZXMoKSwgZW5jb2RpbmcpOwogICAgdmFyIHN0YWNrID0gU3RhY2tUcmFjZS5jdXJyZW50OwogICAgcmV0dXJuIHJlYWRBc0J5dGVzKCkudGhlbigoYnl0ZXMpIHsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gX3RyeURlY29kZShieXRlcywgZW5jb2RpbmcpOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcmV0dXJuIG5ldyBGdXR1cmUuZXJyb3IoZSwgc3RhY2spOwogICAgICB9CiAgICB9KTsKICB9CgogIFN0cmluZyByZWFkQXNTdHJpbmdTeW5jKHtFbmNvZGluZyBlbmNvZGluZzogdXRmOH0pID0+CiAgICAgIF90cnlEZWNvZGUocmVhZEFzQnl0ZXNTeW5jKCksIGVuY29kaW5nKTsKCiAgRnV0dXJlPExpc3Q8U3RyaW5nPj4gcmVhZEFzTGluZXMoe0VuY29kaW5nIGVuY29kaW5nOiB1dGY4fSkgPT4KICAgICAgcmVhZEFzU3RyaW5nKGVuY29kaW5nOiBlbmNvZGluZykudGhlbihjb25zdCBMaW5lU3BsaXR0ZXIoKS5jb252ZXJ0KTsKCiAgTGlzdDxTdHJpbmc+IHJlYWRBc0xpbmVzU3luYyh7RW5jb2RpbmcgZW5jb2Rpbmc6IHV0Zjh9KSA9PgogICAgICBjb25zdCBMaW5lU3BsaXR0ZXIoKS5jb252ZXJ0KHJlYWRBc1N0cmluZ1N5bmMoZW5jb2Rpbmc6IGVuY29kaW5nKSk7CgogIEZ1dHVyZTxGaWxlPiB3cml0ZUFzQnl0ZXMoTGlzdDxpbnQ+IGJ5dGVzLAogICAgICB7RmlsZU1vZGUgbW9kZTogRmlsZU1vZGUud3JpdGUsIGJvb2wgZmx1c2g6IGZhbHNlfSkgewogICAgcmV0dXJuIG9wZW4obW9kZTogbW9kZSkudGhlbigoZmlsZSkgewogICAgICByZXR1cm4gZmlsZS53cml0ZUZyb20oYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCkudGhlbjxGaWxlPigoXykgewogICAgICAgIGlmIChmbHVzaCkgcmV0dXJuIGZpbGUuZmx1c2goKS50aGVuKChfKSA9PiB0aGlzKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSkud2hlbkNvbXBsZXRlKGZpbGUuY2xvc2UpOwogICAgfSk7CiAgfQoKICB2b2lkIHdyaXRlQXNCeXRlc1N5bmMoTGlzdDxpbnQ+IGJ5dGVzLAogICAgICB7RmlsZU1vZGUgbW9kZTogRmlsZU1vZGUud3JpdGUsIGJvb2wgZmx1c2g6IGZhbHNlfSkgewogICAgUmFuZG9tQWNjZXNzRmlsZSBvcGVuZWQgPSBvcGVuU3luYyhtb2RlOiBtb2RlKTsKICAgIHRyeSB7CiAgICAgIG9wZW5lZC53cml0ZUZyb21TeW5jKGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOwogICAgICBpZiAoZmx1c2gpIG9wZW5lZC5mbHVzaFN5bmMoKTsKICAgIH0gZmluYWxseSB7CiAgICAgIG9wZW5lZC5jbG9zZVN5bmMoKTsKICAgIH0KICB9CgogIEZ1dHVyZTxGaWxlPiB3cml0ZUFzU3RyaW5nKFN0cmluZyBjb250ZW50cywKICAgICAge0ZpbGVNb2RlIG1vZGU6IEZpbGVNb2RlLndyaXRlLAogICAgICBFbmNvZGluZyBlbmNvZGluZzogdXRmOCwKICAgICAgYm9vbCBmbHVzaDogZmFsc2V9KSB7CiAgICB0cnkgewogICAgICByZXR1cm4gd3JpdGVBc0J5dGVzKGVuY29kaW5nLmVuY29kZShjb250ZW50cyksIG1vZGU6IG1vZGUsIGZsdXNoOiBmbHVzaCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBuZXcgRnV0dXJlLmVycm9yKGUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZUFzU3RyaW5nU3luYyhTdHJpbmcgY29udGVudHMsCiAgICAgIHtGaWxlTW9kZSBtb2RlOiBGaWxlTW9kZS53cml0ZSwKICAgICAgRW5jb2RpbmcgZW5jb2Rpbmc6IHV0ZjgsCiAgICAgIGJvb2wgZmx1c2g6IGZhbHNlfSkgewogICAgd3JpdGVBc0J5dGVzU3luYyhlbmNvZGluZy5lbmNvZGUoY29udGVudHMpLCBtb2RlOiBtb2RlLCBmbHVzaDogZmx1c2gpOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIkZpbGU6ICckcGF0aCciOwoKICBzdGF0aWMgdGhyb3dJZkVycm9yKE9iamVjdCByZXN1bHQsIFN0cmluZyBtc2csIFN0cmluZyBwYXRoKSB7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24obXNnLCBwYXRoLCByZXN1bHQpOwogICAgfQogIH0KfQoKYWJzdHJhY3QgY2xhc3MgX1JhbmRvbUFjY2Vzc0ZpbGVPcHMgewogIGV4dGVybmFsIGZhY3RvcnkgX1JhbmRvbUFjY2Vzc0ZpbGVPcHMoaW50IHBvaW50ZXIpOwoKICBpbnQgZ2V0UG9pbnRlcigpOwogIGludCBjbG9zZSgpOwogIHJlYWRCeXRlKCk7CiAgcmVhZChpbnQgYnl0ZXMpOwogIHJlYWRJbnRvKExpc3Q8aW50PiBidWZmZXIsIGludCBzdGFydCwgaW50IGVuZCk7CiAgd3JpdGVCeXRlKGludCB2YWx1ZSk7CiAgd3JpdGVGcm9tKExpc3Q8aW50PiBidWZmZXIsIGludCBzdGFydCwgaW50IGVuZCk7CiAgcG9zaXRpb24oKTsKICBzZXRQb3NpdGlvbihpbnQgcG9zaXRpb24pOwogIHRydW5jYXRlKGludCBsZW5ndGgpOwogIGxlbmd0aCgpOwogIGZsdXNoKCk7CiAgbG9jayhpbnQgbG9jaywgaW50IHN0YXJ0LCBpbnQgZW5kKTsKfQoKY2xhc3MgX1JhbmRvbUFjY2Vzc0ZpbGUgaW1wbGVtZW50cyBSYW5kb21BY2Nlc3NGaWxlIHsKICBzdGF0aWMgYm9vbCBfY29ubmVjdGVkUmVzb3VyY2VIYW5kbGVyID0gZmFsc2U7CgogIGZpbmFsIFN0cmluZyBwYXRoOwoKICBib29sIF9hc3luY0Rpc3BhdGNoZWQgPSBmYWxzZTsKICBTZW5kUG9ydCBfZmlsZVNlcnZpY2U7CgogIF9GaWxlUmVzb3VyY2VJbmZvIF9yZXNvdXJjZUluZm87CiAgX1JhbmRvbUFjY2Vzc0ZpbGVPcHMgX29wczsKCiAgX1JhbmRvbUFjY2Vzc0ZpbGUoaW50IHBvaW50ZXIsIHRoaXMucGF0aCkgewogICAgX29wcyA9IG5ldyBfUmFuZG9tQWNjZXNzRmlsZU9wcyhwb2ludGVyKTsKICAgIF9yZXNvdXJjZUluZm8gPSBuZXcgX0ZpbGVSZXNvdXJjZUluZm8odGhpcyk7CiAgICBfbWF5YmVDb25uZWN0SGFuZGxlcigpOwogIH0KCiAgdm9pZCBfbWF5YmVQZXJmb3JtQ2xlYW51cCgpIHsKICAgIGlmIChjbG9zZWQpIHsKICAgICAgX0ZpbGVSZXNvdXJjZUluZm8uRmlsZUNsb3NlZChfcmVzb3VyY2VJbmZvKTsKICAgIH0KICB9CgogIF9tYXliZUNvbm5lY3RIYW5kbGVyKCkgewogICAgaWYgKCFfY29ubmVjdGVkUmVzb3VyY2VIYW5kbGVyKSB7CiAgICAgIC8vIFRPRE8ocmljb3cpOiBXZSBwcm9iYWJseSBuZWVkIHRvIHNldCB0aGVzZSBpbiBzb21lIGluaXRpYWxpemF0aW9uIGNvZGUuCiAgICAgIC8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlc2UgYXJlIGFsd2F5cyBhdmFpbGFibGUgZnJvbSB0aGUKICAgICAgLy8gb2JzZXJ2YXRvcnkgZXZlbiBpZiBubyBmaWxlcyAob3Igc29ja2V0cyBmb3IgdGhlIHNvY2tldCBvbmVzKSBhcmUKICAgICAgLy8gb3Blbi4KICAgICAgcmVnaXN0ZXJFeHRlbnNpb24oCiAgICAgICAgICAnZXh0LmRhcnQuaW8uZ2V0T3BlbkZpbGVzJywgX0ZpbGVSZXNvdXJjZUluZm8uZ2V0T3BlbkZpbGVzKTsKICAgICAgcmVnaXN0ZXJFeHRlbnNpb24oCiAgICAgICAgICAnZXh0LmRhcnQuaW8uZ2V0RmlsZUJ5SUQnLCBfRmlsZVJlc291cmNlSW5mby5nZXRGaWxlSW5mb01hcEJ5SUQpOwogICAgICBfY29ubmVjdGVkUmVzb3VyY2VIYW5kbGVyID0gdHJ1ZTsKICAgIH0KICB9CgogIEZ1dHVyZTx2b2lkPiBjbG9zZSgpIHsKICAgIHJldHVybiBfZGlzcGF0Y2goX0lPU2VydmljZS5maWxlQ2xvc2UsIFtudWxsXSwgbWFya0Nsb3NlZDogdHJ1ZSkKICAgICAgICAudGhlbigocmVzdWx0KSB7CiAgICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKICAgICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigiQ2Fubm90IGNsb3NlIGZpbGUiLCBwYXRoKTsKICAgICAgfQogICAgICBjbG9zZWQgPSBjbG9zZWQgfHwgKHJlc3VsdCA9PSAwKTsKICAgICAgX21heWJlUGVyZm9ybUNsZWFudXAoKTsKICAgIH0pOwogIH0KCiAgdm9pZCBjbG9zZVN5bmMoKSB7CiAgICBfY2hlY2tBdmFpbGFibGUoKTsKICAgIHZhciBpZCA9IF9vcHMuY2xvc2UoKTsKICAgIGlmIChpZCA9PSAtMSkgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigiQ2Fubm90IGNsb3NlIGZpbGUiLCBwYXRoKTsKICAgIH0KICAgIGNsb3NlZCA9IGNsb3NlZCB8fCAoaWQgPT0gMCk7CiAgICBfbWF5YmVQZXJmb3JtQ2xlYW51cCgpOwogIH0KCiAgRnV0dXJlPGludD4gcmVhZEJ5dGUoKSB7CiAgICByZXR1cm4gX2Rpc3BhdGNoKF9JT1NlcnZpY2UuZmlsZVJlYWRCeXRlLCBbbnVsbF0pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsICJyZWFkQnl0ZSBmYWlsZWQiLCBwYXRoKTsKICAgICAgfQogICAgICBfcmVzb3VyY2VJbmZvLmFkZFJlYWQoMSk7CiAgICAgIHJldHVybiByZXNwb25zZTsKICAgIH0pOwogIH0KCiAgaW50IHJlYWRCeXRlU3luYygpIHsKICAgIF9jaGVja0F2YWlsYWJsZSgpOwogICAgdmFyIHJlc3VsdCA9IF9vcHMucmVhZEJ5dGUoKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigicmVhZEJ5dGUgZmFpbGVkIiwgcGF0aCwgcmVzdWx0KTsKICAgIH0KICAgIF9yZXNvdXJjZUluZm8uYWRkUmVhZCgxKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBGdXR1cmU8TGlzdDxpbnQ+PiByZWFkKGludCBieXRlcykgewogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoYnl0ZXMsICdieXRlcycpOwogICAgcmV0dXJuIF9kaXNwYXRjaChfSU9TZXJ2aWNlLmZpbGVSZWFkLCBbbnVsbCwgYnl0ZXNdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKHJlc3BvbnNlLCAicmVhZCBmYWlsZWQiLCBwYXRoKTsKICAgICAgfQogICAgICBfcmVzb3VyY2VJbmZvLmFkZFJlYWQocmVzcG9uc2VbMV0ubGVuZ3RoKTsKICAgICAgTGlzdDxpbnQ+IHJlc3VsdCA9IHJlc3BvbnNlWzFdOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfSk7CiAgfQoKICBMaXN0PGludD4gcmVhZFN5bmMoaW50IGJ5dGVzKSB7CiAgICBfY2hlY2tBdmFpbGFibGUoKTsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKGJ5dGVzLCAnYnl0ZXMnKTsKICAgIHZhciByZXN1bHQgPSBfb3BzLnJlYWQoYnl0ZXMpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJyZWFkU3luYyBmYWlsZWQiLCBwYXRoLCByZXN1bHQpOwogICAgfQogICAgX3Jlc291cmNlSW5mby5hZGRSZWFkKHJlc3VsdC5sZW5ndGgpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEZ1dHVyZTxpbnQ+IHJlYWRJbnRvKExpc3Q8aW50PiBidWZmZXIsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogICAgaWYgKChidWZmZXIgaXMhIExpc3QpIHx8CiAgICAgICAgKChzdGFydCAhPSBudWxsKSAmJiAoc3RhcnQgaXMhIGludCkpIHx8CiAgICAgICAgKChlbmQgIT0gbnVsbCkgJiYgKGVuZCBpcyEgaW50KSkpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoKTsKICAgIH0KICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIGJ1ZmZlci5sZW5ndGgpOwogICAgaWYgKGVuZCA9PSBzdGFydCkgewogICAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZSgwKTsKICAgIH0KICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIHJldHVybiBfZGlzcGF0Y2goX0lPU2VydmljZS5maWxlUmVhZEludG8sIFtudWxsLCBsZW5ndGhdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKHJlc3BvbnNlLCAicmVhZEludG8gZmFpbGVkIiwgcGF0aCk7CiAgICAgIH0KICAgICAgaW50IHJlYWQgPSByZXNwb25zZVsxXTsKICAgICAgTGlzdDxpbnQ+IGRhdGEgPSByZXNwb25zZVsyXTsKICAgICAgYnVmZmVyLnNldFJhbmdlKHN0YXJ0LCBzdGFydCArIHJlYWQsIGRhdGEpOwogICAgICBfcmVzb3VyY2VJbmZvLmFkZFJlYWQocmVhZCk7CiAgICAgIHJldHVybiByZWFkOwogICAgfSk7CiAgfQoKICBpbnQgcmVhZEludG9TeW5jKExpc3Q8aW50PiBidWZmZXIsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogICAgX2NoZWNrQXZhaWxhYmxlKCk7CiAgICBpZiAoKGJ1ZmZlciBpcyEgTGlzdCkgfHwKICAgICAgICAoKHN0YXJ0ICE9IG51bGwpICYmIChzdGFydCBpcyEgaW50KSkgfHwKICAgICAgICAoKGVuZCAhPSBudWxsKSAmJiAoZW5kIGlzISBpbnQpKSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigpOwogICAgfQogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgYnVmZmVyLmxlbmd0aCk7CiAgICBpZiAoZW5kID09IHN0YXJ0KSB7CiAgICAgIHJldHVybiAwOwogICAgfQogICAgdmFyIHJlc3VsdCA9IF9vcHMucmVhZEludG8oYnVmZmVyLCBzdGFydCwgZW5kKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigicmVhZEludG8gZmFpbGVkIiwgcGF0aCwgcmVzdWx0KTsKICAgIH0KICAgIF9yZXNvdXJjZUluZm8uYWRkUmVhZChyZXN1bHQpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPiB3cml0ZUJ5dGUoaW50IHZhbHVlKSB7CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbCh2YWx1ZSwgJ3ZhbHVlJyk7CiAgICByZXR1cm4gX2Rpc3BhdGNoKF9JT1NlcnZpY2UuZmlsZVdyaXRlQnl0ZSwgW251bGwsIHZhbHVlXSkudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbkZyb21SZXNwb25zZShyZXNwb25zZSwgIndyaXRlQnl0ZSBmYWlsZWQiLCBwYXRoKTsKICAgICAgfQogICAgICBfcmVzb3VyY2VJbmZvLmFkZFdyaXRlKDEpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0pOwogIH0KCiAgaW50IHdyaXRlQnl0ZVN5bmMoaW50IHZhbHVlKSB7CiAgICBfY2hlY2tBdmFpbGFibGUoKTsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKHZhbHVlLCAndmFsdWUnKTsKICAgIHZhciByZXN1bHQgPSBfb3BzLndyaXRlQnl0ZSh2YWx1ZSk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oIndyaXRlQnl0ZSBmYWlsZWQiLCBwYXRoLCByZXN1bHQpOwogICAgfQogICAgX3Jlc291cmNlSW5mby5hZGRXcml0ZSgxKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT4gd3JpdGVGcm9tKExpc3Q8aW50PiBidWZmZXIsCiAgICAgIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogICAgaWYgKChidWZmZXIgaXMhIExpc3QpIHx8CiAgICAgICAgKChzdGFydCAhPSBudWxsKSAmJiAoc3RhcnQgaXMhIGludCkpIHx8CiAgICAgICAgKChlbmQgIT0gbnVsbCkgJiYgKGVuZCBpcyEgaW50KSkpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkludmFsaWQgYXJndW1lbnRzIHRvIHdyaXRlRnJvbSIpOwogICAgfQogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgYnVmZmVyLmxlbmd0aCk7CiAgICBpZiAoZW5kID09IHN0YXJ0KSB7CiAgICAgIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKHRoaXMpOwogICAgfQogICAgX0J1ZmZlckFuZFN0YXJ0IHJlc3VsdDsKICAgIHRyeSB7CiAgICAgIHJlc3VsdCA9IF9lbnN1cmVGYXN0QW5kU2VyaWFsaXphYmxlQnl0ZURhdGEoYnVmZmVyLCBzdGFydCwgZW5kKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcmV0dXJuIG5ldyBGdXR1cmUuZXJyb3IoZSk7CiAgICB9CgogICAgTGlzdCByZXF1ZXN0ID0gbmV3IExpc3QoNCk7CiAgICByZXF1ZXN0WzBdID0gbnVsbDsKICAgIHJlcXVlc3RbMV0gPSByZXN1bHQuYnVmZmVyOwogICAgcmVxdWVzdFsyXSA9IHJlc3VsdC5zdGFydDsKICAgIHJlcXVlc3RbM10gPSBlbmQgLSAoc3RhcnQgLSByZXN1bHQuc3RhcnQpOwogICAgcmV0dXJuIF9kaXNwYXRjaChfSU9TZXJ2aWNlLmZpbGVXcml0ZUZyb20sIHJlcXVlc3QpLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsICJ3cml0ZUZyb20gZmFpbGVkIiwgcGF0aCk7CiAgICAgIH0KICAgICAgX3Jlc291cmNlSW5mby5hZGRXcml0ZShlbmQgLSAoc3RhcnQgLSByZXN1bHQuc3RhcnQpKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KTsKICB9CgogIHZvaWQgd3JpdGVGcm9tU3luYyhMaXN0PGludD4gYnVmZmVyLCBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pIHsKICAgIF9jaGVja0F2YWlsYWJsZSgpOwogICAgaWYgKChidWZmZXIgaXMhIExpc3QpIHx8CiAgICAgICAgKChzdGFydCAhPSBudWxsKSAmJiAoc3RhcnQgaXMhIGludCkpIHx8CiAgICAgICAgKChlbmQgIT0gbnVsbCkgJiYgKGVuZCBpcyEgaW50KSkpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkludmFsaWQgYXJndW1lbnRzIHRvIHdyaXRlRnJvbVN5bmMiKTsKICAgIH0KICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIGJ1ZmZlci5sZW5ndGgpOwogICAgaWYgKGVuZCA9PSBzdGFydCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBfQnVmZmVyQW5kU3RhcnQgYnVmZmVyQW5kU3RhcnQgPQogICAgICAgIF9lbnN1cmVGYXN0QW5kU2VyaWFsaXphYmxlQnl0ZURhdGEoYnVmZmVyLCBzdGFydCwgZW5kKTsKICAgIHZhciByZXN1bHQgPSBfb3BzLndyaXRlRnJvbShidWZmZXJBbmRTdGFydC5idWZmZXIsIGJ1ZmZlckFuZFN0YXJ0LnN0YXJ0LAogICAgICAgIGVuZCAtIChzdGFydCAtIGJ1ZmZlckFuZFN0YXJ0LnN0YXJ0KSk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oIndyaXRlRnJvbSBmYWlsZWQiLCBwYXRoLCByZXN1bHQpOwogICAgfQogICAgX3Jlc291cmNlSW5mby5hZGRXcml0ZShlbmQgLSAoc3RhcnQgLSBidWZmZXJBbmRTdGFydC5zdGFydCkpOwogIH0KCiAgRnV0dXJlPFJhbmRvbUFjY2Vzc0ZpbGU+IHdyaXRlU3RyaW5nKFN0cmluZyBzdHJpbmcsCiAgICAgIHtFbmNvZGluZyBlbmNvZGluZzogdXRmOH0pIHsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKGVuY29kaW5nLCAnZW5jb2RpbmcnKTsKICAgIHZhciBkYXRhID0gZW5jb2RpbmcuZW5jb2RlKHN0cmluZyk7CiAgICByZXR1cm4gd3JpdGVGcm9tKGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKICB9CgogIHZvaWQgd3JpdGVTdHJpbmdTeW5jKFN0cmluZyBzdHJpbmcsIHtFbmNvZGluZyBlbmNvZGluZzogdXRmOH0pIHsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKGVuY29kaW5nLCAnZW5jb2RpbmcnKTsKICAgIHZhciBkYXRhID0gZW5jb2RpbmcuZW5jb2RlKHN0cmluZyk7CiAgICB3cml0ZUZyb21TeW5jKGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKICB9CgogIEZ1dHVyZTxpbnQ+IHBvc2l0aW9uKCkgewogICAgcmV0dXJuIF9kaXNwYXRjaChfSU9TZXJ2aWNlLmZpbGVQb3NpdGlvbiwgW251bGxdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKHJlc3BvbnNlLCAicG9zaXRpb24gZmFpbGVkIiwgcGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3BvbnNlOwogICAgfSk7CiAgfQoKICBpbnQgcG9zaXRpb25TeW5jKCkgewogICAgX2NoZWNrQXZhaWxhYmxlKCk7CiAgICB2YXIgcmVzdWx0ID0gX29wcy5wb3NpdGlvbigpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJwb3NpdGlvbiBmYWlsZWQiLCBwYXRoLCByZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPiBzZXRQb3NpdGlvbihpbnQgcG9zaXRpb24pIHsKICAgIHJldHVybiBfZGlzcGF0Y2goX0lPU2VydmljZS5maWxlU2V0UG9zaXRpb24sIFtudWxsLCBwb3NpdGlvbl0pCiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsICJzZXRQb3NpdGlvbiBmYWlsZWQiLCBwYXRoKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0pOwogIH0KCiAgdm9pZCBzZXRQb3NpdGlvblN5bmMoaW50IHBvc2l0aW9uKSB7CiAgICBfY2hlY2tBdmFpbGFibGUoKTsKICAgIHZhciByZXN1bHQgPSBfb3BzLnNldFBvc2l0aW9uKHBvc2l0aW9uKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigic2V0UG9zaXRpb24gZmFpbGVkIiwgcGF0aCwgcmVzdWx0KTsKICAgIH0KICB9CgogIEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPiB0cnVuY2F0ZShpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gX2Rpc3BhdGNoKF9JT1NlcnZpY2UuZmlsZVRydW5jYXRlLCBbbnVsbCwgbGVuZ3RoXSkudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbkZyb21SZXNwb25zZShyZXNwb25zZSwgInRydW5jYXRlIGZhaWxlZCIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CiAgfQoKICB2b2lkIHRydW5jYXRlU3luYyhpbnQgbGVuZ3RoKSB7CiAgICBfY2hlY2tBdmFpbGFibGUoKTsKICAgIHZhciByZXN1bHQgPSBfb3BzLnRydW5jYXRlKGxlbmd0aCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oInRydW5jYXRlIGZhaWxlZCIsIHBhdGgsIHJlc3VsdCk7CiAgICB9CiAgfQoKICBGdXR1cmU8aW50PiBsZW5ndGgoKSB7CiAgICByZXR1cm4gX2Rpc3BhdGNoKF9JT1NlcnZpY2UuZmlsZUxlbmd0aCwgW251bGxdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKHJlc3BvbnNlLCAibGVuZ3RoIGZhaWxlZCIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiByZXNwb25zZTsKICAgIH0pOwogIH0KCiAgaW50IGxlbmd0aFN5bmMoKSB7CiAgICBfY2hlY2tBdmFpbGFibGUoKTsKICAgIHZhciByZXN1bHQgPSBfb3BzLmxlbmd0aCgpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJsZW5ndGggZmFpbGVkIiwgcGF0aCwgcmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT4gZmx1c2goKSB7CiAgICByZXR1cm4gX2Rpc3BhdGNoKF9JT1NlcnZpY2UuZmlsZUZsdXNoLCBbbnVsbF0pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsICJmbHVzaCBmYWlsZWQiLCBwYXRoKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0pOwogIH0KCiAgdm9pZCBmbHVzaFN5bmMoKSB7CiAgICBfY2hlY2tBdmFpbGFibGUoKTsKICAgIHZhciByZXN1bHQgPSBfb3BzLmZsdXNoKCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oImZsdXNoIGZhaWxlZCIsIHBhdGgsIHJlc3VsdCk7CiAgICB9CiAgfQoKICBzdGF0aWMgY29uc3QgaW50IGxvY2tVbmxvY2sgPSAwOwogIC8vIHN0YXRpYyBjb25zdCBpbnQgbG9ja1NoYXJlZCA9IDE7CiAgLy8gc3RhdGljIGNvbnN0IGludCBsb2NrRXhjbHVzaXZlID0gMjsKICAvLyBzdGF0aWMgY29uc3QgaW50IGxvY2tCbG9ja2luZ1NoYXJlZCA9IDM7CiAgLy8gc3RhdGljIGNvbnN0IGludCBsb2NrQmxvY2tpbmdFeGNsdXNpdmUgPSA0OwoKICBpbnQgX2ZpbGVMb2NrVmFsdWUoRmlsZUxvY2sgZmwpID0+IGZsLl90eXBlOwoKICBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT4gbG9jaygKICAgICAgW0ZpbGVMb2NrIG1vZGUgPSBGaWxlTG9jay5leGNsdXNpdmUsIGludCBzdGFydCA9IDAsIGludCBlbmQgPSAtMV0pIHsKICAgIGlmICgobW9kZSBpcyEgRmlsZUxvY2spIHx8IChzdGFydCBpcyEgaW50KSB8fCAoZW5kIGlzISBpbnQpKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCk7CiAgICB9CiAgICBpZiAoKHN0YXJ0IDwgMCkgfHwgKGVuZCA8IC0xKSB8fCAoKGVuZCAhPSAtMSkgJiYgKHN0YXJ0ID49IGVuZCkpKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCk7CiAgICB9CiAgICBpbnQgbG9jayA9IF9maWxlTG9ja1ZhbHVlKG1vZGUpOwogICAgcmV0dXJuIF9kaXNwYXRjaChfSU9TZXJ2aWNlLmZpbGVMb2NrLCBbbnVsbCwgbG9jaywgc3RhcnQsIGVuZF0pCiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsICdsb2NrIGZhaWxlZCcsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CiAgfQoKICBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT4gdW5sb2NrKFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kID0gLTFdKSB7CiAgICBpZiAoKHN0YXJ0IGlzISBpbnQpIHx8IChlbmQgaXMhIGludCkpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoKTsKICAgIH0KICAgIGlmIChzdGFydCA9PSBlbmQpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoKTsKICAgIH0KICAgIHJldHVybiBfZGlzcGF0Y2goX0lPU2VydmljZS5maWxlTG9jaywgW251bGwsIGxvY2tVbmxvY2ssIHN0YXJ0LCBlbmRdKQogICAgICAgIC50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKHJlc3BvbnNlLCAndW5sb2NrIGZhaWxlZCcsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CiAgfQoKICB2b2lkIGxvY2tTeW5jKAogICAgICBbRmlsZUxvY2sgbW9kZSA9IEZpbGVMb2NrLmV4Y2x1c2l2ZSwgaW50IHN0YXJ0ID0gMCwgaW50IGVuZCA9IC0xXSkgewogICAgX2NoZWNrQXZhaWxhYmxlKCk7CiAgICBpZiAoKG1vZGUgaXMhIEZpbGVMb2NrKSB8fCAoc3RhcnQgaXMhIGludCkgfHwgKGVuZCBpcyEgaW50KSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigpOwogICAgfQogICAgaWYgKChzdGFydCA8IDApIHx8IChlbmQgPCAtMSkgfHwgKChlbmQgIT0gLTEpICYmIChzdGFydCA+PSBlbmQpKSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigpOwogICAgfQogICAgaW50IGxvY2sgPSBfZmlsZUxvY2tWYWx1ZShtb2RlKTsKICAgIHZhciByZXN1bHQgPSBfb3BzLmxvY2sobG9jaywgc3RhcnQsIGVuZCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oJ2xvY2sgZmFpbGVkJywgcGF0aCwgcmVzdWx0KTsKICAgIH0KICB9CgogIHZvaWQgdW5sb2NrU3luYyhbaW50IHN0YXJ0ID0gMCwgaW50IGVuZCA9IC0xXSkgewogICAgX2NoZWNrQXZhaWxhYmxlKCk7CiAgICBpZiAoKHN0YXJ0IGlzISBpbnQpIHx8IChlbmQgaXMhIGludCkpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoKTsKICAgIH0KICAgIGlmIChzdGFydCA9PSBlbmQpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoKTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBfb3BzLmxvY2sobG9ja1VubG9jaywgc3RhcnQsIGVuZCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oJ3VubG9jayBmYWlsZWQnLCBwYXRoLCByZXN1bHQpOwogICAgfQogIH0KCiAgYm9vbCBjbG9zZWQgPSBmYWxzZTsKCiAgLy8gV0FSTklORzoKICAvLyBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBpbmNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIHRoZSBuYXRpdmUKICAvLyBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBmaWxlIG9wZXJhdGlvbnMuIEl0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCB0bwogIC8vIHBhc3MgdGhlIHBvaW50ZXIgdG8gdGhlIElPIFNlcnZpY2UsIHdoaWNoIHdpbGwgZGVjcmVtZW50IHRoZSByZWZlcmVuY2UKICAvLyBjb3VudCB3aGVuIGl0IGlzIGZpbmlzaGVkIHdpdGggaXQuCiAgaW50IF9wb2ludGVyKCkgPT4gX29wcy5nZXRQb2ludGVyKCk7CgogIEZ1dHVyZSBfZGlzcGF0Y2goaW50IHJlcXVlc3QsIExpc3QgZGF0YSwge2Jvb2wgbWFya0Nsb3NlZDogZmFsc2V9KSB7CiAgICBpZiAoY2xvc2VkKSB7CiAgICAgIHJldHVybiBuZXcgRnV0dXJlLmVycm9yKG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJGaWxlIGNsb3NlZCIsIHBhdGgpKTsKICAg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O0MGFlAYFQYdGkEgCAQBGxwlPAYSOgYEAgEWZGFydDppby9maWxlX2ltcGwuZGFydDZvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vZmlsZV9zeXN0ZW1fZW50aXR5LmRhcnTAAInqLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCi8qKgogKiBUaGUgdHlwZSBvZiBhbiBlbnRpdHkgb24gdGhlIGZpbGUgc3lzdGVtLCBzdWNoIGFzIGEgZmlsZSwgZGlyZWN0b3J5LCBvciBsaW5rLgogKgogKiBUaGVzZSBjb25zdGFudHMgYXJlIHVzZWQgYnkgdGhlIFtGaWxlU3lzdGVtRW50aXR5XSBjbGFzcwogKiB0byBpbmRpY2F0ZSB0aGUgb2JqZWN0J3MgdHlwZS4KICoKICovCgpjbGFzcyBGaWxlU3lzdGVtRW50aXR5VHlwZSB7CiAgc3RhdGljIGNvbnN0IGZpbGUgPSBjb25zdCBGaWxlU3lzdGVtRW50aXR5VHlwZS5faW50ZXJuYWwoMCk7CiAgQERlcHJlY2F0ZWQoIlVzZSBmaWxlIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBGSUxFID0gZmlsZTsKCiAgc3RhdGljIGNvbnN0IGRpcmVjdG9yeSA9IGNvbnN0IEZpbGVTeXN0ZW1FbnRpdHlUeXBlLl9pbnRlcm5hbCgxKTsKICBARGVwcmVjYXRlZCgiVXNlIGRpcmVjdG9yeSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgRElSRUNUT1JZID0gZGlyZWN0b3J5OwoKICBzdGF0aWMgY29uc3QgbGluayA9IGNvbnN0IEZpbGVTeXN0ZW1FbnRpdHlUeXBlLl9pbnRlcm5hbCgyKTsKICBARGVwcmVjYXRlZCgiVXNlIGxpbmsgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IExJTksgPSBsaW5rOwoKICBzdGF0aWMgY29uc3Qgbm90Rm91bmQgPSBjb25zdCBGaWxlU3lzdGVtRW50aXR5VHlwZS5faW50ZXJuYWwoMyk7CiAgQERlcHJlY2F0ZWQoIlVzZSBub3RGb3VuZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgTk9UX0ZPVU5EID0gbm90Rm91bmQ7CgogIHN0YXRpYyBjb25zdCBfdHlwZUxpc3QgPSBjb25zdCBbCiAgICBGaWxlU3lzdGVtRW50aXR5VHlwZS5maWxlLAogICAgRmlsZVN5c3RlbUVudGl0eVR5cGUuZGlyZWN0b3J5LAogICAgRmlsZVN5c3RlbUVudGl0eVR5cGUubGluaywKICAgIEZpbGVTeXN0ZW1FbnRpdHlUeXBlLm5vdEZvdW5kLAogIF07CiAgZmluYWwgaW50IF90eXBlOwoKICBjb25zdCBGaWxlU3lzdGVtRW50aXR5VHlwZS5faW50ZXJuYWwodGhpcy5fdHlwZSk7CgogIHN0YXRpYyBGaWxlU3lzdGVtRW50aXR5VHlwZSBfbG9va3VwKGludCB0eXBlKSA9PiBfdHlwZUxpc3RbdHlwZV07CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gY29uc3QgWydmaWxlJywgJ2RpcmVjdG9yeScsICdsaW5rJywgJ25vdEZvdW5kJ11bX3R5cGVdOwp9CgovKioKICogQSBGaWxlU3RhdCBvYmplY3QgcmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFBPU0lYIHN0YXQoKSBmdW5jdGlvbgogKiBvbiBhIGZpbGUgc3lzdGVtIG9iamVjdC4gIEl0IGlzIGFuIGltbXV0YWJsZSBvYmplY3QsIHJlcHJlc2VudGluZyB0aGUKICogc25hcHNob3R0ZWQgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBzdGF0KCkgY2FsbC4KICovCmNsYXNzIEZpbGVTdGF0IHsKICAvLyBUaGVzZSBtdXN0IGFncmVlIHdpdGggZW51bSBGaWxlU3RhdCBpbiBmaWxlLmguCiAgc3RhdGljIGNvbnN0IF90eXBlID0gMDsKICBzdGF0aWMgY29uc3QgX2NoYW5nZWRUaW1lID0gMTsKICBzdGF0aWMgY29uc3QgX21vZGlmaWVkVGltZSA9IDI7CiAgc3RhdGljIGNvbnN0IF9hY2Nlc3NlZFRpbWUgPSAzOwogIHN0YXRpYyBjb25zdCBfbW9kZSA9IDQ7CiAgc3RhdGljIGNvbnN0IF9zaXplID0gNTsKCiAgc3RhdGljIGNvbnN0IF9ub3RGb3VuZCA9IGNvbnN0IEZpbGVTdGF0Ll9pbnRlcm5hbE5vdEZvdW5kKCk7CgogIC8qKgogICAqIFRoZSB0aW1lIG9mIHRoZSBsYXN0IGNoYW5nZSB0byB0aGUgZGF0YSBvciBtZXRhZGF0YSBvZiB0aGUgZmlsZSBzeXN0ZW0KICAgKiBvYmplY3QuCiAgICoKICAgKiBPbiBXaW5kb3dzIHBsYXRmb3JtcywgdGhpcyBpcyBpbnN0ZWFkIHRoZSBmaWxlIGNyZWF0aW9uIHRpbWUuCiAgICovCiAgZmluYWwgRGF0ZVRpbWUgY2hhbmdlZDsKCiAgLyoqCiAgICogVGhlIHRpbWUgb2YgdGhlIGxhc3QgY2hhbmdlIHRvIHRoZSBkYXRhIG9mIHRoZSBmaWxlIHN5c3RlbSBvYmplY3QuCiAgICovCiAgZmluYWwgRGF0ZVRpbWUgbW9kaWZpZWQ7CgogIC8qKgogICAqIFRoZSB0aW1lIG9mIHRoZSBsYXN0IGFjY2VzcyB0byB0aGUgZGF0YSBvZiB0aGUgZmlsZSBzeXN0ZW0gb2JqZWN0LgogICAqCiAgICogT24gV2luZG93cyBwbGF0Zm9ybXMsIHRoaXMgbWF5IGhhdmUgMSBkYXkgZ3JhbnVsYXJpdHksIGFuZCBiZQogICAqIG91dCBvZiBkYXRlIGJ5IGFuIGhvdXIuCiAgICovCiAgZmluYWwgRGF0ZVRpbWUgYWNjZXNzZWQ7CgogIC8qKgogICAqIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QgKGZpbGUsIGRpcmVjdG9yeSwgb3IgbGluaykuCiAgICoKICAgKiBJZiB0aGUgY2FsbCB0byBzdGF0KCkgZmFpbHMsIHRoZSB0eXBlIG9mIHRoZSByZXR1cm5lZCBvYmplY3QgaXMgbm90Rm91bmQuCiAgICovCiAgZmluYWwgRmlsZVN5c3RlbUVudGl0eVR5cGUgdHlwZTsKCiAgLyoqCiAgICogVGhlIG1vZGUgb2YgdGhlIGZpbGUgc3lzdGVtIG9iamVjdC4KICAgKgogICAqIFBlcm1pc3Npb25zIGFyZSBlbmNvZGVkIGluIHRoZSBsb3dlciAxNiBiaXRzIG9mIHRoaXMgbnVtYmVyLCBhbmQgY2FuIGJlCiAgICogZGVjb2RlZCB1c2luZyB0aGUgW21vZGVTdHJpbmddIGdldHRlci4KICAgKi8KICBmaW5hbCBpbnQgbW9kZTsKCiAgLyoqCiAgICogVGhlIHNpemUgb2YgdGhlIGZpbGUgc3lzdGVtIG9iamVjdC4KICAgKi8KICBmaW5hbCBpbnQgc2l6ZTsKCiAgRmlsZVN0YXQuX2ludGVybmFsKHRoaXMuY2hhbmdlZCwgdGhpcy5tb2RpZmllZCwgdGhpcy5hY2Nlc3NlZCwgdGhpcy50eXBlLAogICAgICB0aGlzLm1vZGUsIHRoaXMuc2l6ZSk7CgogIGNvbnN0IEZpbGVTdGF0Ll9pbnRlcm5hbE5vdEZvdW5kKCkKICAgICAgOiBjaGFuZ2VkID0gbnVsbCwKICAgICAgICBtb2RpZmllZCA9IG51bGwsCiAgICAgICAgYWNjZXNzZWQgPSBudWxsLAogICAgICAgIHR5cGUgPSBGaWxlU3lzdGVtRW50aXR5VHlwZS5ub3RGb3VuZCwKICAgICAgICBtb2RlID0gMCwKICAgICAgICBzaXplID0gLTE7CgogIGV4dGVybmFsIHN0YXRpYyBfc3RhdFN5bmMoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFN0cmluZyBwYXRoKTsKCiAgLyoqCiAgICogQ2FsbHMgdGhlIG9wZXJhdGluZyBzeXN0ZW0ncyBzdGF0KCkgZnVuY3Rpb24gb24gW3BhdGhdLgogICAqCiAgICogUmV0dXJucyBhIFtGaWxlU3RhdF0gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRhdGEgcmV0dXJuZWQgYnkgc3RhdCgpLgogICAqIElmIHRoZSBjYWxsIGZhaWxzLCByZXR1cm5zIGEgW0ZpbGVTdGF0XSBvYmplY3Qgd2l0aCAudHlwZSBzZXQgdG8KICAgKiBGaWxlU3lzdGVtRW50aXR5VHlwZS5ub3RGb3VuZCBhbmQgdGhlIG90aGVyIGZpZWxkcyBpbnZhbGlkLgogICAqLwogIHN0YXRpYyBGaWxlU3RhdCBzdGF0U3luYyhTdHJpbmcgcGF0aCkgewogICAgZmluYWwgSU9PdmVycmlkZXMgb3ZlcnJpZGVzID0gSU9PdmVycmlkZXMuY3VycmVudDsKICAgIGlmIChvdmVycmlkZXMgPT0gbnVsbCkgewogICAgICByZXR1cm4gX3N0YXRTeW5jSW50ZXJuYWwocGF0aCk7CiAgICB9CiAgICByZXR1cm4gb3ZlcnJpZGVzLnN0YXRTeW5jKHBhdGgpOwogIH0KCiAgc3RhdGljIEZpbGVTdGF0IF9zdGF0U3luY0ludGVybmFsKFN0cmluZyBwYXRoKSB7CiAgICAvLyBUcmFpbGluZyBwYXRoIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy4KICAgIGlmIChQbGF0Zm9ybS5pc1dpbmRvd3MpIHsKICAgICAgcGF0aCA9IEZpbGVTeXN0ZW1FbnRpdHkuX3RyaW1UcmFpbGluZ1BhdGhTZXBhcmF0b3JzKHBhdGgpOwogICAgfQogICAgdmFyIGRhdGEgPSBfc3RhdFN5bmMoX05hbWVzcGFjZS5fbmFtZXNwYWNlLCBwYXRoKTsKICAgIGlmIChkYXRhIGlzIE9TRXJyb3IpIHJldHVybiBGaWxlU3RhdC5fbm90Rm91bmQ7CiAgICByZXR1cm4gbmV3IEZpbGVTdGF0Ll9pbnRlcm5hbCgKICAgICAgICBuZXcgRGF0ZVRpbWUuZnJvbU1pbGxpc2Vjb25kc1NpbmNlRXBvY2goZGF0YVtfY2hhbmdlZFRpbWVdKSwKICAgICAgICBuZXcgRGF0ZVRpbWUuZnJvbU1pbGxpc2Vjb25kc1NpbmNlRXBvY2goZGF0YVtfbW9kaWZpZWRUaW1lXSksCiAgICAgICAgbmV3IERhdGVUaW1lLmZyb21NaWxsaXNlY29uZHNTaW5jZUVwb2NoKGRhdGFbX2FjY2Vzc2VkVGltZV0pLAogICAgICAgIEZpbGVTeXN0ZW1FbnRpdHlUeXBlLl9sb29rdXAoZGF0YVtfdHlwZV0pLAogICAgICAgIGRhdGFbX21vZGVdLAogICAgICAgIGRhdGFbX3NpemVdKTsKICB9CgogIC8qKgogICAqIEFzeW5jaHJvbm91c2x5IGNhbGxzIHRoZSBvcGVyYXRpbmcgc3lzdGVtJ3Mgc3RhdCgpIGZ1bmN0aW9uIG9uIFtwYXRoXS4KICAgKgogICAqIFJldHVybnMgYSBGdXR1cmUgd2hpY2ggY29tcGxldGVzIHdpdGggYSBbRmlsZVN0YXRdIG9iamVjdCBjb250YWluaW5nCiAgICogdGhlIGRhdGEgcmV0dXJuZWQgYnkgc3RhdCgpLiBJZiB0aGUgY2FsbCBmYWlscywgY29tcGxldGVzIHRoZSBmdXR1cmUgd2l0aCBhCiAgICogW0ZpbGVTdGF0XSBvYmplY3Qgd2l0aCBgLnR5cGVgIHNldCB0byBGaWxlU3lzdGVtRW50aXR5VHlwZS5ub3RGb3VuZCBhbmQKICAgKiB0aGUgb3RoZXIgZmllbGRzIGludmFsaWQuCiAgICovCiAgc3RhdGljIEZ1dHVyZTxGaWxlU3RhdD4gc3RhdChTdHJpbmcgcGF0aCkgewogICAgZmluYWwgSU9PdmVycmlkZXMgb3ZlcnJpZGVzID0gSU9PdmVycmlkZXMuY3VycmVudDsKICAgIGlmIChvdmVycmlkZXMgPT0gbnVsbCkgewogICAgICByZXR1cm4gX3N0YXQocGF0aCk7CiAgICB9CiAgICByZXR1cm4gb3ZlcnJpZGVzLnN0YXQocGF0aCk7CiAgfQoKICBzdGF0aWMgRnV0dXJlPEZpbGVTdGF0PiBfc3RhdChTdHJpbmcgcGF0aCkgewogICAgLy8gVHJhaWxpbmcgcGF0aCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MuCiAgICBpZiAoUGxhdGZvcm0uaXNXaW5kb3dzKSB7CiAgICAgIHBhdGggPSBGaWxlU3lzdGVtRW50aXR5Ll90cmltVHJhaWxpbmdQYXRoU2VwYXJhdG9ycyhwYXRoKTsKICAgIH0KICAgIHJldHVybiBfRmlsZS5fZGlzcGF0Y2hXaXRoTmFtZXNwYWNlKF9JT1NlcnZpY2UuZmlsZVN0YXQsIFtudWxsLCBwYXRoXSkKICAgICAgICAudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgcmV0dXJuIEZpbGVTdGF0Ll9ub3RGb3VuZDsKICAgICAgfQogICAgICAvLyBVbndyYXAgdGhlIHJlYWwgbGlzdCBmcm9tIHRoZSAiSSdtIG5vdCBhbiBlcnJvciIgd3JhcHBlci4KICAgICAgTGlzdCBkYXRhID0gcmVzcG9uc2VbMV07CiAgICAgIHJldHVybiBuZXcgRmlsZVN0YXQuX2ludGVybmFsKAogICAgICAgICAgbmV3IERhdGVUaW1lLmZyb21NaWxsaXNlY29uZHNTaW5jZUVwb2NoKGRhdGFbX2NoYW5nZWRUaW1lXSksCiAgICAgICAgICBuZXcgRGF0ZVRpbWUuZnJvbU1pbGxpc2Vjb25kc1NpbmNlRXBvY2goZGF0YVtfbW9kaWZpZWRUaW1lXSksCiAgICAgICAgICBuZXcgRGF0ZVRpbWUuZnJvbU1pbGxpc2Vjb25kc1NpbmNlRXBvY2goZGF0YVtfYWNjZXNzZWRUaW1lXSksCiAgICAgICAgICBGaWxlU3lzdGVtRW50aXR5VHlwZS5fbG9va3VwKGRhdGFbX3R5cGVdKSwKICAgICAgICAgIGRhdGFbX21vZGVdLAogICAgICAgICAgZGF0YVtfc2l6ZV0pOwogICAgfSk7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiIiIKRmlsZVN0YXQ6IHR5cGUgJHR5cGUKICAgICAgICAgIGNoYW5nZWQgJGNoYW5nZWQKICAgICAgICAgIG1vZGlmaWVkICRtb2RpZmllZAogICAgICAgICAgYWNjZXNzZWQgJGFjY2Vzc2VkCiAgICAgICAgICBtb2RlICR7bW9kZVN0cmluZygpfQogICAgICAgICAgc2l6ZSAkc2l6ZSIiIjsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbW9kZSB2YWx1ZSBhcyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZy4KICAgKgogICAqIFRoZSBzdHJpbmcgaXMgaW4gdGhlIGZvcm1hdCAicnd4cnd4cnd4IiwgcmVmbGVjdGluZyB0aGUgdXNlciwgZ3JvdXAsIGFuZAogICAqIHdvcmxkIHBlcm1pc3Npb25zIHRvIHJlYWQsIHdyaXRlLCBhbmQgZXhlY3V0ZSB0aGUgZmlsZSBzeXN0ZW0gb2JqZWN0LCB3aXRoCiAgICogIi0iIHJlcGxhY2luZyB0aGUgbGV0dGVyIGZvciBtaXNzaW5nIHBlcm1pc3Npb25zLiAgRXh0cmEgcGVybWlzc2lvbiBiaXRzCiAgICogbWF5IGJlIHJlcHJlc2VudGVkIGJ5IHByZXBlbmRpbmcgIihzdWlkKSIsICIoZ3VpZCkiLCBhbmQvb3IgIihzdGlja3kpIiB0bwogICAqIHRoZSBtb2RlIHN0cmluZy4KICAgKi8KICBTdHJpbmcgbW9kZVN0cmluZygpIHsKICAgIHZhciBwZXJtaXNzaW9ucyA9IG1vZGUgJiAweEZGRjsKICAgIHZhciBjb2RlcyA9IGNvbnN0IFsnLS0tJywgJy0teCcsICctdy0nLCAnLXd4JywgJ3ItLScsICdyLXgnLCAncnctJywgJ3J3eCddOwogICAgdmFyIHJlc3VsdCA9IFtdOwogICAgaWYgKChwZXJtaXNzaW9ucyAmIDB4ODAwKSAhPSAwKSByZXN1bHQuYWRkKCIoc3VpZCkgIik7CiAgICBpZiAoKHBlcm1pc3Npb25zICYgMHg0MDApICE9IDApIHJlc3VsdC5hZGQoIihndWlkKSAiKTsKICAgIGlmICgocGVybWlzc2lvbnMgJiAweDIwMCkgIT0gMCkgcmVzdWx0LmFkZCgiKHN0aWNreSkgIik7CiAgICByZXN1bHQKICAgICAgLi5hZGQoY29kZXNbKHBlcm1pc3Npb25zID4+IDYpICYgMHg3XSkKICAgICAgLi5hZGQoY29kZXNbKHBlcm1pc3Npb25zID4+IDMpICYgMHg3XSkKICAgICAgLi5hZGQoY29kZXNbcGVybWlzc2lvbnMgJiAweDddKTsKICAgIHJldHVybiByZXN1bHQuam9pbigpOwogIH0KfQoKLyoqCiAqIFRoZSBjb21tb24gc3VwZXIgY2xhc3MgZm9yIFtGaWxlXSwgW0RpcmVjdG9yeV0sIGFuZCBbTGlua10gb2JqZWN0cy4KICoKICogW0ZpbGVTeXN0ZW1FbnRpdHldIG9iamVjdHMgYXJlIHJldHVybmVkIGZyb20gZGlyZWN0b3J5IGxpc3RpbmcKICogb3BlcmF0aW9ucy4gVG8gZGV0ZXJtaW5lIGlmIGEgRmlsZVN5c3RlbUVudGl0eSBpcyBhIFtGaWxlXSwgYQogKiBbRGlyZWN0b3J5XSwgb3IgYSBbTGlua10gcGVyZm9ybSBhIHR5cGUgY2hlY2s6CiAqCiAqICAgICBpZiAoZW50aXR5IGlzIEZpbGUpIChlbnRpdHkgYXMgRmlsZSkucmVhZEFzU3RyaW5nU3luYygpOwogKgogKiBZb3UgY2FuIGFsc28gdXNlIHRoZSBbdHlwZV0gb3IgW3R5cGVTeW5jXSBtZXRob2RzIHRvIGRldGVybWluZQogKiB0aGUgdHlwZSBvZiBhIGZpbGUgc3lzdGVtIG9iamVjdC4KICoKICogTW9zdCBtZXRob2RzIGluIHRoaXMgY2xhc3Mgb2NjdXIgaW4gc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyBwYWlycywKICogZm9yIGV4YW1wbGUsIFtleGlzdHNdIGFuZCBbZXhpc3RzU3luY10uCiAqIFVubGVzcyB5b3UgaGF2ZSBhIHNwZWNpZmljIHJlYXNvbiBmb3IgdXNpbmcgdGhlIHN5bmNocm9ub3VzIHZlcnNpb24KICogb2YgYSBtZXRob2QsIHByZWZlciB0aGUgYXN5bmNocm9ub3VzIHZlcnNpb24gdG8gYXZvaWQgYmxvY2tpbmcgeW91ciBwcm9ncmFtLgogKgogKiBIZXJlJ3MgdGhlIGV4aXN0cyBtZXRob2QgaW4gYWN0aW9uOgogKgogKiAgICAgZW50aXR5LmV4aXN0cygpLnRoZW4oKGlzVGhlcmUpIHsKICogICAgICAgaXNUaGVyZSA/IHByaW50KCdleGlzdHMnKSA6IHByaW50KCdub24tZXhpc3RlbnQnKTsKICogICAgIH0pOwogKgogKgogKiAjIyBPdGhlciByZXNvdXJjZXMKICoKICogKiBbRGFydCBieQogKiAgIEV4YW1wbGVdKGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy9kYXJ0LWJ5LWV4YW1wbGUvI2ZpbGVzLWRpcmVjdG9yaWVzLWFuZC1zeW1saW5rcykKICogICBwcm92aWRlcyBhZGRpdGlvbmFsIHRhc2stb3JpZW50ZWQgY29kZSBzYW1wbGVzIHRoYXQgc2hvdyBob3cgdG8gdXNlIHZhcmlvdXMKICogICBBUEkgZnJvbSB0aGUgW0RpcmVjdG9yeV0gY2xhc3MgYW5kIHRoZSBbRmlsZV0gY2xhc3MsIGJvdGggc3ViY2xhc3NlcyBvZgogKiAgIEZpbGVTeXN0ZW1FbnRpdHkuCiAqCiAqICogW0kvTyBmb3IgQ29tbWFuZC1MaW5lCiAqICAgQXBwc10oaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL2RvY3MvZGFydC11cC1hbmQtcnVubmluZy9jaDAzLmh0bWwjZGFydGlvLS0taW8tZm9yLWNvbW1hbmQtbGluZS1hcHBzKSwKICogICBhIHNlY3Rpb24gZnJvbSBfQSBUb3VyIG9mIHRoZSBEYXJ0IExpYnJhcmllc18gY292ZXJzIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KICoKICogKiBbV3JpdGUgQ29tbWFuZC1MaW5lIEFwcHNdKGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy9kb2NzL3R1dG9yaWFscy9jbWRsaW5lLyksCiAqICAgYSB0dXRvcmlhbCBhYm91dCB3cml0aW5nIGNvbW1hbmQtbGluZSBhcHBzLCBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dAogKiAgIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KICovCmFic3RyYWN0IGNsYXNzIEZpbGVTeXN0ZW1FbnRpdHkgewogIFN0cmluZyBfcGF0aDsKICBVaW50OExpc3QgX3Jhd1BhdGg7CgogIFN0cmluZyBnZXQgcGF0aDsKCiAgLyoqCiAgICogUmV0dXJucyBhIFtVcmldIHJlcHJlc2VudGluZyB0aGUgZmlsZSBzeXN0ZW0gZW50aXR5J3MgbG9jYXRpb24uCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgVVJJJ3Mgc2NoZW1lIGlzIGFsd2F5cyAiZmlsZSIgaWYgdGhlIGVudGl0eSdzIFtwYXRoXSBpcwogICAqIGFic29sdXRlLCBvdGhlcndpc2UgdGhlIHNjaGVtZSB3aWxsIGJlIGVtcHR5LgogICAqLwogIFVyaSBnZXQgdXJpID0+IG5ldyBVcmkuZmlsZShwYXRoKTsKCiAgLyoqCiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGZpbGUgc3lzdGVtIGVudGl0eSB3aXRoIHRoaXMgcGF0aCBleGlzdHMuIFJldHVybnMKICAgKiBhIFs6RnV0dXJlPGJvb2w+Ol0gdGhhdCBjb21wbGV0ZXMgd2l0aCB0aGUgcmVzdWx0LgogICAqCiAgICogU2luY2UgRmlsZVN5c3RlbUVudGl0eSBpcyBhYnN0cmFjdCwgZXZlcnkgRmlsZVN5c3RlbUVudGl0eSBvYmplY3QKICAgKiBpcyBhY3R1YWxseSBhbiBpbnN0YW5jZSBvZiBvbmUgb2YgdGhlIHN1YmNsYXNzZXMgW0ZpbGVdLAogICAqIFtEaXJlY3RvcnldLCBhbmQgW0xpbmtdLiAgQ2FsbGluZyBbZXhpc3RzXSBvbiBhbiBpbnN0YW5jZSBvZiBvbmUKICAgKiBvZiB0aGVzZSBzdWJjbGFzc2VzIGNoZWNrcyB3aGV0aGVyIHRoZSBvYmplY3QgZXhpc3RzIGluIHRoZSBmaWxlCiAgICogc3lzdGVtIG9iamVjdCBleGlzdHMgYW5kIGlzIG9mIHRoZSBjb3JyZWN0IHR5cGUgKGZpbGUsIGRpcmVjdG9yeSwKICAgKiBvciBsaW5rKS4gIFRvIGNoZWNrIHdoZXRoZXIgYSBwYXRoIHBvaW50cyB0byBhbiBvYmplY3Qgb24gdGhlCiAgICogZmlsZSBzeXN0ZW0sIHJlZ2FyZGxlc3Mgb2YgdGhlIG9iamVjdCdzIHR5cGUsIHVzZSB0aGUgW3R5cGVdCiAgICogc3RhdGljIG1ldGhvZC4KICAgKgogICAqLwogIEZ1dHVyZTxib29sPiBleGlzdHMoKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSBjaGVja3Mgd2hldGhlciB0aGUgZmlsZSBzeXN0ZW0gZW50aXR5IHdpdGggdGhpcyBwYXRoCiAgICogZXhpc3RzLgogICAqCiAgICogU2luY2UgRmlsZVN5c3RlbUVudGl0eSBpcyBhYnN0cmFjdCwgZXZlcnkgRmlsZVN5c3RlbUVudGl0eSBvYmplY3QKICAgKiBpcyBhY3R1YWxseSBhbiBpbnN0YW5jZSBvZiBvbmUgb2YgdGhlIHN1YmNsYXNzZXMgW0ZpbGVdLAogICAqIFtEaXJlY3RvcnldLCBhbmQgW0xpbmtdLiAgQ2FsbGluZyBbZXhpc3RzU3luY10gb24gYW4gaW5zdGFuY2Ugb2YKICAgKiBvbmUgb2YgdGhlc2Ugc3ViY2xhc3NlcyBjaGVja3Mgd2hldGhlciB0aGUgb2JqZWN0IGV4aXN0cyBpbiB0aGUKICAgKiBmaWxlIHN5c3RlbSBvYmplY3QgZXhpc3RzIGFuZCBpcyBvZiB0aGUgY29ycmVjdCB0eXBlIChmaWxlLAogICAqIGRpcmVjdG9yeSwgb3IgbGluaykuICBUbyBjaGVjayB3aGV0aGVyIGEgcGF0aCBwb2ludHMgdG8gYW4gb2JqZWN0CiAgICogb24gdGhlIGZpbGUgc3lzdGVtLCByZWdhcmRsZXNzIG9mIHRoZSBvYmplY3QncyB0eXBlLCB1c2UgdGhlCiAgICogW3R5cGVTeW5jXSBzdGF0aWMgbWV0aG9kLgogICAqLwogIGJvb2wgZXhpc3RzU3luYygpOwoKICAvKioKICAgKiBSZW5hbWVzIHRoaXMgZmlsZSBzeXN0ZW0gZW50aXR5LgogICAqCiAgICogUmV0dXJucyBhIGBGdXR1cmU8RmlsZVN5c3RlbUVudGl0eT5gIHRoYXQgY29tcGxldGVzIHdpdGggYQogICAqIFtGaWxlU3lzdGVtRW50aXR5XSBpbnN0YW5jZSBmb3IgdGhlIHJlbmFtZWQgZmlsZSBzeXN0ZW0gZW50aXR5LgogICAqCiAgICogSWYgW25ld1BhdGhdIGlkZW50aWZpZXMgYW4gZXhpc3RpbmcgZW50aXR5IG9mIHRoZSBzYW1lIHR5cGUsIHRoYXQgZW50aXR5CiAgICogaXMgcmVwbGFjZWQuIElmIFtuZXdQYXRoXSBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIGVudGl0eSBvZiBhIGRpZmZlcmVudAogICAqIHR5cGUsIHRoZSBvcGVyYXRpb24gZmFpbHMgYW5kIHRoZSBmdXR1cmUgY29tcGxldGVzIHdpdGggYW4gZXhjZXB0aW9uLgogICAqLwogIEZ1dHVyZTxGaWxlU3lzdGVtRW50aXR5PiByZW5hbWUoU3RyaW5nIG5ld1BhdGgpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IHJlbmFtZXMgdGhpcyBmaWxlIHN5c3RlbSBlbnRpdHkuCiAgICoKICAgKiBSZXR1cm5zIGEgW0ZpbGVTeXN0ZW1FbnRpdHldIGluc3RhbmNlIGZvciB0aGUgcmVuYW1lZCBlbnRpdHkuCiAgICoKICAgKiBJZiBbbmV3UGF0aF0gaWRlbnRpZmllcyBhbiBleGlzdGluZyBlbnRpdHkgb2YgdGhlIHNhbWUgdHlwZSwgdGhhdCBlbnRpdHkKICAgKiBpcyByZXBsYWNlZC4gSWYgW25ld1BhdGhdIGlkZW50aWZpZXMgYW4gZXhpc3RpbmcgZW50aXR5IG9mIGEgZGlmZmVyZW50CiAgICogdHlwZSwgdGhlIG9wZXJhdGlvbiBmYWlscyBhbmQgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KICAgKi8KICBGaWxlU3lzdGVtRW50aXR5IHJlbmFtZVN5bmMoU3RyaW5nIG5ld1BhdGgpOwoKICAvKioKICAgKiBSZXNvbHZlcyB0aGUgcGF0aCBvZiBhIGZpbGUgc3lzdGVtIG9iamVjdCByZWxhdGl2ZSB0byB0aGUKICAgKiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgogICAqCiAgICogUmVzb2x2ZXMgYWxsIHN5bWJvbGljIGxpbmtzIG9uIHRoZSBwYXRoIGFuZCByZXNvbHZlcyBhbGwgYC4uYCBhbmQgYC5gIHBhdGgKICAgKiBzZWdtZW50cy4KICAgKgogICAqIFtyZXNvbHZlU3ltYm9saWNMaW5rc10gdXNlcyB0aGUgb3BlcmF0aW5nIHN5c3RlbSdzIG5hdGl2ZQogICAqIGZpbGUgc3lzdGVtIEFQSSB0byByZXNvbHZlIHRoZSBwYXRoLCB1c2luZyB0aGUgYHJlYWxwYXRoYCBmdW5jdGlvbgogICAqIG9uIGxpbnV4IGFuZCBPUyBYLCBhbmQgdGhlIGBHZXRGaW5hbFBhdGhOYW1lQnlIYW5kbGVgIGZ1bmN0aW9uIG9uCiAgICogV2luZG93cy4gSWYgdGhlIHBhdGggZG9lcyBub3QgcG9pbnQgdG8gYW4gZXhpc3RpbmcgZmlsZSBzeXN0ZW0gb2JqZWN0LAogICAqIGByZXNvbHZlU3ltYm9saWNMaW5rc2AgdGhyb3dzIGEgYEZpbGVTeXN0ZW1FeGNlcHRpb25gLgogICAqCiAgICogT24gV2luZG93cyB0aGUgYC4uYCBzZWdtZW50cyBhcmUgcmVzb2x2ZWQgX2JlZm9yZV8gcmVzb2x2aW5nIHRoZSBzeW1ib2xpYwogICAqIGxpbmssIGFuZCBvbiBvdGhlciBwbGF0Zm9ybXMgdGhlIHN5bWJvbGljIGxpbmtzIGFyZSBfcmVzb2x2ZWQgdG8gdGhlaXIKICAgKiB0YXJnZXRfIGJlZm9yZSBhcHBseWluZyBhIGAuLmAgdGhhdCBmb2xsb3dzLgogICAqCiAgICogVG8gZW5zdXJlIHRoZSBzYW1lIGJlaGF2aW9yIG9uIGFsbCBwbGF0Zm9ybXMgcmVzb2x2ZSBgLi5gIHNlZ21lbnRzIGJlZm9yZQogICAqIGNhbGxpbmcgYHJlc29sdmVTeW1ib2xpY0xpbmtzYC4gT25lIHdheSBvZiBkb2luZyB0aGlzIGlzIHdpdGggdGhlIGBVcmlgCiAgICogY2xhc3M6CiAgICoKICAgKiAgICAgdmFyIHBhdGggPSBVcmkucGFyc2UoJy4nKS5yZXNvbHZlVXJpKG5ldyBVcmkuZmlsZShpbnB1dCkpLnRvRmlsZVBhdGgoKTsKICAgKiAgICAgaWYgKHBhdGggPT0gJycpIHBhdGggPSAnLic7CiAgICogICAgIG5ldyBGaWxlKHBhdGgpLnJlc29sdmVTeW1ib2xpY0xpbmtzKCkudGhlbigocmVzb2x2ZWQpIHsKICAgKiAgICAgICBwcmludChyZXNvbHZlZCk7CiAgICogICAgIH0pOwogICAqCiAgICogc2luY2UgYFVyaS5yZXNvbHZlYCByZW1vdmVzIGAuLmAgc2VnbWVudHMuIFRoaXMgd2lsbCByZXN1bHQgaW4gdGhlIFdpbmRvd3MKICAgKiBiZWhhdmlvci4KICAgKi8KICBGdXR1cmU8U3RyaW5nPiByZXNvbHZlU3ltYm9saWNMaW5rcygpIHsKICAgIHJldHVybiBfRmlsZS5fZGlzcGF0Y2hXaXRoTmFtZXNwYWNlKAogICAgICAgIF9JT1NlcnZpY2UuZmlsZVJlc29sdmVTeW1ib2xpY0xpbmtzLCBbbnVsbCwgX3Jhd1BhdGhdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKAogICAgICAgICAgICByZXNwb25zZSwgIkNhbm5vdCByZXNvbHZlIHN5bWJvbGljIGxpbmtzIiwgcGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3BvbnNlOwogICAgfSk7CiAgfQoKICAvKioKICAgKiBSZXNvbHZlcyB0aGUgcGF0aCBvZiBhIGZpbGUgc3lzdGVtIG9iamVjdCByZWxhdGl2ZSB0byB0aGUKICAgKiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgogICAqCiAgICogUmVzb2x2ZXMgYWxsIHN5bWJvbGljIGxpbmtzIG9uIHRoZSBwYXRoIGFuZCByZXNvbHZlcyBhbGwgYC4uYCBhbmQgYC5gIHBhdGgKICAgKiBzZWdtZW50cy4KICAgKgogICAqIFtyZXNvbHZlU3ltYm9saWNMaW5rc1N5bmNdIHVzZXMgdGhlIG9wZXJhdGluZyBzeXN0ZW0ncyBuYXRpdmUKICAgKiBmaWxlIHN5c3RlbSBBUEkgdG8gcmVzb2x2ZSB0aGUgcGF0aCwgdXNpbmcgdGhlIGByZWFscGF0aGAgZnVuY3Rpb24KICAgKiBvbiBsaW51eCBhbmQgT1MgWCwgYW5kIHRoZSBgR2V0RmluYWxQYXRoTmFtZUJ5SGFuZGxlYCBmdW5jdGlvbiBvbgogICAqIFdpbmRvd3MuIElmIHRoZSBwYXRoIGRvZXMgbm90IHBvaW50IHRvIGFuIGV4aXN0aW5nIGZpbGUgc3lzdGVtIG9iamVjdCwKICAgKiBgcmVzb2x2ZVN5bWJvbGljTGlua3NTeW5jYCB0aHJvd3MgYSBgRmlsZVN5c3RlbUV4Y2VwdGlvbmAuCiAgICoKICAgKiBPbiBXaW5kb3dzIHRoZSBgLi5gIHNlZ21lbnRzIGFyZSByZXNvbHZlZCBfYmVmb3JlXyByZXNvbHZpbmcgdGhlIHN5bWJvbGljCiAgICogbGluaywgYW5kIG9uIG90aGVyIHBsYXRmb3JtcyB0aGUgc3ltYm9saWMgbGlua3MgYXJlIF9yZXNvbHZlZCB0byB0aGVpcgogICAqIHRhcmdldF8gYmVmb3JlIGFwcGx5aW5nIGEgYC4uYCB0aGF0IGZvbGxvd3MuCiAgICoKICAgKiBUbyBlbnN1cmUgdGhlIHNhbWUgYmVoYXZpb3Igb24gYWxsIHBsYXRmb3JtcyByZXNvbHZlIGAuLmAgc2VnbWVudHMgYmVmb3JlCiAgICogY2FsbGluZyBgcmVzb2x2ZVN5bWJvbGljTGlua3NTeW5jYC4gT25lIHdheSBvZiBkb2luZyB0aGlzIGlzIHdpdGggdGhlIGBVcmlgCiAgICogY2xhc3M6CiAgICoKICAgKiAgICAgdmFyIHBhdGggPSBVcmkucGFyc2UoJy4nKS5yZXNvbHZlVXJpKG5ldyBVcmkuZmlsZShpbnB1dCkpLnRvRmlsZVBhdGgoKTsKICAgKiAgICAgaWYgKHBhdGggPT0gJycpIHBhdGggPSAnLic7CiAgICogICAgIHZhciByZXNvbHZlZCA9IG5ldyBGaWxlKHBhdGgpLnJlc29sdmVTeW1ib2xpY0xpbmtzU3luYygpOwogICAqICAgICBwcmludChyZXNvbHZlZCk7CiAgICoKICAgKiBzaW5jZSBgVXJpLnJlc29sdmVgIHJlbW92ZXMgYC4uYCBzZWdtZW50cy4gVGhpcyB3aWxsIHJlc3VsdCBpbiB0aGUgV2luZG93cwogICAqIGJlaGF2aW9yLgogICAqLwogIFN0cmluZyByZXNvbHZlU3ltYm9saWNMaW5rc1N5bmMoKSB7CiAgICB2YXIgcmVzdWx0ID0gX3Jlc29sdmVTeW1ib2xpY0xpbmtzKF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgpOwogICAgX3Rocm93SWZFcnJvcihyZXN1bHQsICJDYW5ub3QgcmVzb2x2ZSBzeW1ib2xpYyBsaW5rcyIsIHBhdGgpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8qKgogICAqIENhbGxzIHRoZSBvcGVyYXRpbmcgc3lzdGVtJ3Mgc3RhdCgpIGZ1bmN0aW9uIG9uIHRoZSBbcGF0aF0gb2YgdGhpcwogICAqIFtGaWxlU3lzdGVtRW50aXR5XS4KICAgKgogICAqIElkZW50aWNhbCB0byBbOkZpbGVTdGF0LnN0YXQodGhpcy5wYXRoKTpdLgogICAqCiAgICogUmV0dXJucyBhIFs6RnV0dXJlPEZpbGVTdGF0PjpdIG9iamVjdCBjb250YWluaW5nIHRoZSBkYXRhIHJldHVybmVkIGJ5CiAgICogc3RhdCgpLgogICAqCiAgICogSWYgdGhlIGNhbGwgZmFpbHMsIGNvbXBsZXRlcyB0aGUgZnV0dXJlIHdpdGggYSBbRmlsZVN0YXRdIG9iamVjdAogICAqIHdpdGggLnR5cGUgc2V0IHRvCiAgICogRmlsZVN5c3RlbUVudGl0eVR5cGUubm90Rm91bmQgYW5kIHRoZSBvdGhlciBmaWVsZHMgaW52YWxpZC4KICAgKi8KICBGdXR1cmU8RmlsZVN0YXQ+IHN0YXQoKSA9PiBGaWxlU3RhdC5zdGF0KHBhdGgpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IGNhbGxzIHRoZSBvcGVyYXRpbmcgc3lzdGVtJ3Mgc3RhdCgpIGZ1bmN0aW9uIG9uIHRoZQogICAqIFtwYXRoXSBvZiB0aGlzIFtGaWxlU3lzdGVtRW50aXR5XS4KICAgKgogICAqIElkZW50aWNhbCB0byBbOkZpbGVTdGF0LnN0YXRTeW5jKHRoaXMucGF0aCk6XS4KICAgKgogICAqIFJldHVybnMgYSBbRmlsZVN0YXRdIG9iamVjdCBjb250YWluaW5nIHRoZSBkYXRhIHJldHVybmVkIGJ5IHN0YXQoKS4KICAgKgogICAqIElmIHRoZSBjYWxsIGZhaWxzLCByZXR1cm5zIGEgW0ZpbGVTdGF0XSBvYmplY3Qgd2l0aCAudHlwZSBzZXQgdG8KICAgKiBGaWxlU3lzdGVtRW50aXR5VHlwZS5ub3RGb3VuZCBhbmQgdGhlIG90aGVyIGZpZWxkcyBpbnZhbGlkLgogICAqLwogIEZpbGVTdGF0IHN0YXRTeW5jKCkgPT4gRmlsZVN0YXQuc3RhdFN5bmMocGF0aCk7CgogIC8qKgogICAqIERlbGV0ZXMgdGhpcyBbRmlsZVN5c3RlbUVudGl0eV0uCiAgICoKICAgKiBJZiB0aGUgW0ZpbGVTeXN0ZW1FbnRpdHldIGlzIGEgZGlyZWN0b3J5LCBhbmQgaWYgW3JlY3Vyc2l2ZV0gaXMgZmFsc2UsCiAgICogdGhlIGRpcmVjdG9yeSBtdXN0IGJlIGVtcHR5LiBPdGhlcndpc2UsIGlmIFtyZWN1cnNpdmVdIGlzIHRydWUsIHRoZQogICAqIGRpcmVjdG9yeSBhbmQgYWxsIHN1Yi1kaXJlY3RvcmllcyBhbmQgZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzIGFyZQogICAqIGRlbGV0ZWQuIExpbmtzIGFyZSBub3QgZm9sbG93ZWQgd2hlbiBkZWxldGluZyByZWN1cnNpdmVseS4gT25seSB0aGUgbGluawogICAqIGlzIGRlbGV0ZWQsIG5vdCBpdHMgdGFyZ2V0LgogICAqCiAgICogSWYgW3JlY3Vyc2l2ZV0gaXMgdHJ1ZSwgdGhlIFtGaWxlU3lzdGVtRW50aXR5XSBpcyBkZWxldGVkIGV2ZW4gaWYgdGhlIHR5cGUKICAgKiBvZiB0aGUgW0ZpbGVTeXN0ZW1FbnRpdHldIGRvZXNuJ3QgbWF0Y2ggdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgc3lzdGVtLgogICAqIFRoaXMgYmVoYXZpb3IgYWxsb3dzIFtkZWxldGVdIHRvIGJlIHVzZWQgdG8gdW5jb25kaXRpb25hbGx5IGRlbGV0ZSBhbnkgZmlsZQogICAqIHN5c3RlbSBvYmplY3QuCiAgICoKICAgKiBSZXR1cm5zIGEgWzpGdXR1cmU8RmlsZVN5c3RlbUVudGl0eT46XSB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoaXMKICAgKiBbRmlsZVN5c3RlbUVudGl0eV0gd2hlbiB0aGUgZGVsZXRpb24gaXMgZG9uZS4gSWYgdGhlIFtGaWxlU3lzdGVtRW50aXR5XQogICAqIGNhbm5vdCBiZSBkZWxldGVkLCB0aGUgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIGFuIGV4Y2VwdGlvbi4KICAgKi8KICBGdXR1cmU8RmlsZVN5c3RlbUVudGl0eT4gZGVsZXRlKHtib29sIHJlY3Vyc2l2ZTogZmFsc2V9KSA9PgogICAgICBfZGVsZXRlKHJlY3Vyc2l2ZTogcmVjdXJzaXZlKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSBkZWxldGVzIHRoaXMgW0ZpbGVTeXN0ZW1FbnRpdHldLgogICAqCiAgICogSWYgdGhlIFtGaWxlU3lzdGVtRW50aXR5XSBpcyBhIGRpcmVjdG9yeSwgYW5kIGlmIFtyZWN1cnNpdmVdIGlzIGZhbHNlLAogICAqIHRoZSBkaXJlY3RvcnkgbXVzdCBiZSBlbXB0eS4gT3RoZXJ3aXNlLCBpZiBbcmVjdXJzaXZlXSBpcyB0cnVlLCB0aGUKICAgKiBkaXJlY3RvcnkgYW5kIGFsbCBzdWItZGlyZWN0b3JpZXMgYW5kIGZpbGVzIGluIHRoZSBkaXJlY3RvcmllcyBhcmUKICAgKiBkZWxldGVkLiBMaW5rcyBhcmUgbm90IGZvbGxvd2VkIHdoZW4gZGVsZXRpbmcgcmVjdXJzaXZlbHkuIE9ubHkgdGhlIGxpbmsKICAgKiBpcyBkZWxldGVkLCBub3QgaXRzIHRhcmdldC4KICAgKgogICAqIElmIFtyZWN1cnNpdmVdIGlzIHRydWUsIHRoZSBbRmlsZVN5c3RlbUVudGl0eV0gaXMgZGVsZXRlZCBldmVuIGlmIHRoZSB0eXBlCiAgICogb2YgdGhlIFtGaWxlU3lzdGVtRW50aXR5XSBkb2Vzbid0IG1hdGNoIHRoZSBjb250ZW50IG9mIHRoZSBmaWxlIHN5c3RlbS4KICAgKiBUaGlzIGJlaGF2aW9yIGFsbG93cyBbZGVsZXRlU3luY10gdG8gYmUgdXNlZCB0byB1bmNvbmRpdGlvbmFsbHkgZGVsZXRlIGFueQogICAqIGZpbGUgc3lzdGVtIG9iamVjdC4KICAgKgogICAqIFRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIFtGaWxlU3lzdGVtRW50aXR5XSBjYW5ub3QgYmUgZGVsZXRlZC4KICAgKi8KICB2b2lkIGRlbGV0ZVN5bmMoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pID0+IF9kZWxldGVTeW5jKHJlY3Vyc2l2ZTogcmVjdXJzaXZlKTsKCiAgLyoqCiAgICogU3RhcnQgd2F0Y2hpbmcgdGhlIFtGaWxlU3lzdGVtRW50aXR5XSBmb3IgY2hhbmdlcy4KICAgKgogICAqIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIHBsYXRmb3JtLWRlcGVuZGVudCBldmVudC1iYXNlZCBBUElzIGZvciByZWNlaXZpbmcKICAgKiBmaWxlLXN5c3RlbSBub3RpZmljYXRpb25zLCB0aHVzIGJlaGF2aW9yIGRlcGVuZHMgb24gdGhlIHBsYXRmb3JtLgogICAqCiAgICogICAqIGBXaW5kb3dzYDogVXNlcyBgUmVhZERpcmVjdG9yeUNoYW5nZXNXYC4gVGhlIGltcGxlbWVudGF0aW9uIG9ubHkKICAgKiAgICAgc3VwcG9ydHMgd2F0Y2hpbmcgZGlyZWN0b3JpZXMuIFJlY3Vyc2l2ZSB3YXRjaGluZyBpcyBzdXBwb3J0ZWQuCiAgICogICAqIGBMaW51eGA6IFVzZXMgYGlub3RpZnlgLiBUaGUgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgd2F0Y2hpbmcgYm90aAogICAqICAgICBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuIFJlY3Vyc2l2ZSB3YXRjaGluZyBpcyBub3Qgc3VwcG9ydGVkLgogICAqICAgICBOb3RlOiBXaGVuIHdhdGNoaW5nIGZpbGVzIGRpcmVjdGx5LCBkZWxldGUgZXZlbnRzIG1pZ2h0IG5vdCBoYXBwZW4KICAgKiAgICAgYXMgZXhwZWN0ZWQuCiAgICogICAqIGBPUyBYYDogVXNlcyBgRlNFdmVudHNgLiBUaGUgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgd2F0Y2hpbmcgYm90aAogICAqICAgICBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuIFJlY3Vyc2l2ZSB3YXRjaGluZyBpcyBzdXBwb3J0ZWQuCiAgICoKICAgKiBUaGUgc3lzdGVtIHdpbGwgc3RhcnQgbGlzdGVuaW5nIGZvciBldmVudHMgb25jZSB0aGUgcmV0dXJuZWQgW1N0cmVhbV0gaXMKICAgKiBiZWluZyBsaXN0ZW5lZCB0bywgbm90IHdoZW4gdGhlIGNhbGwgdG8gW3dhdGNoXSBpcyBpc3N1ZWQuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYW4gZW5kbGVzcyBicm9hZGNhc3QgW1N0cmVhbV0sIHRoYXQgb25seSBzdG9wcyB3aGVuCiAgICogb25lIG9mIHRoZSBmb2xsb3dpbmcgaGFwcGVuczoKICAgKgogICAqICAgKiBUaGUgW1N0cmVhbV0gaXMgY2FuY2VsZWQsIGUuZy4gYnkgY2FsbGluZyBgY2FuY2VsYCBvbiB0aGUKICAgKiAgICAgIFtTdHJlYW1TdWJzY3JpcHRpb25dLgogICAqICAgKiBUaGUgW0ZpbGVTeXN0ZW1FbnRpdHldIGJlaW5nIHdhdGNoZXMsIGlzIGRlbGV0ZWQuCiAgICoKICAgKiBVc2UgYGV2ZW50c2AgdG8gc3BlY2lmeSB3aGF0IGV2ZW50cyB0byBsaXN0ZW4gZm9yLiBUaGUgY29uc3RhbnRzIGluCiAgICogW0ZpbGVTeXN0ZW1FdmVudF0gY2FuIGJlIG9yJ2VkIHRvZ2V0aGVyIHRvIG1peCBldmVudHMuIERlZmF1bHQgaXMKICAgKiBbRmlsZVN5c3RlbUV2ZW50LkFMTF0uCiAgICoKICAgKiBBIG1vdmUgZXZlbnQgbWF5IGJlIHJlcG9ydGVkIGFzIHNlcGVyYXRlIGRlbGV0ZSBhbmQgY3JlYXRlIGV2ZW50cy4KICAgKi8KICBTdHJlYW08RmlsZVN5c3RlbUV2ZW50PiB3YXRjaCgKICAgICAge2ludCBldmVudHM6IEZpbGVTeXN0ZW1FdmVudC5hbGwsIGJvb2wgcmVjdXJzaXZlOiBmYWxzZX0pIHsKICAgIC8vIEZJWE1FKGJrb255aSk6IGZpbmQgYSB3YXkgdG8gZG8gdGhpcyB1c2luZyB0aGUgcmF3IHBhdGguCiAgICBmaW5hbCBTdHJpbmcgdHJpbW1lZFBhdGggPSBfdHJpbVRyYWlsaW5nUGF0aFNlcGFyYXRvcnMocGF0aCk7CiAgICBmaW5hbCBJT092ZXJyaWRlcyBvdmVycmlkZXMgPSBJT092ZXJyaWRlcy5jdXJyZW50OwogICAgaWYgKG92ZXJyaWRlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfRmlsZVN5c3RlbVdhdGNoZXIuX3dhdGNoKHRyaW1tZWRQYXRoLCBldmVudHMsIHJlY3Vyc2l2ZSk7CiAgICB9CiAgICByZXR1cm4gb3ZlcnJpZGVzLmZzV2F0Y2godHJpbW1lZFBhdGgsIGV2ZW50cywgcmVjdXJzaXZlKTsKICB9CgogIEZ1dHVyZTxGaWxlU3lzdGVtRW50aXR5PiBfZGVsZXRlKHtib29sIHJlY3Vyc2l2ZTogZmFsc2V9KTsKICB2b2lkIF9kZWxldGVTeW5jKHtib29sIHJlY3Vyc2l2ZTogZmFsc2V9KTsKCiAgc3RhdGljIEZ1dHVyZTxib29sPiBfaWRlbnRpY2FsKFN0cmluZyBwYXRoMSwgU3RyaW5nIHBhdGgyKSB7CiAgICByZXR1cm4gX0ZpbGUuX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZSgKICAgICAgICBfSU9TZXJ2aWNlLmZpbGVJZGVudGljYWwsIFtudWxsLCBwYXRoMSwgcGF0aDJdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKHJlc3BvbnNlLAogICAgICAgICAgICAiRXJyb3IgaW4gRmlsZVN5c3RlbUVudGl0eS5pZGVudGljYWwoJHBhdGgxLCAkcGF0aDIpIiwgIiIpOwogICAgICB9CiAgICAgIHJldHVybiByZXNwb25zZTsKICAgIH0pOwogIH0KCiAgLyoqCiAgICogQ2hlY2tzIHdoZXRoZXIgdHdvIHBhdGhzIHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdCBpbiB0aGUKICAgKiBmaWxlIHN5c3RlbS4KICAgKgogICAqIFJldHVybnMgYSBbOkZ1dHVyZTxib29sPjpdIHRoYXQgY29tcGxldGVzIHdpdGggdGhlIHJlc3VsdC4KICAgKgogICAqIENvbXBhcmluZyBhIGxpbmsgdG8gaXRzIHRhcmdldCByZXR1cm5zIGZhbHNlLCBhcyBkb2VzIGNvbXBhcmluZyB0d28gbGlua3MKICAgKiB0aGF0IHBvaW50IHRvIHRoZSBzYW1lIHRhcmdldC4gIFRvIGNoZWNrIHRoZSB0YXJnZXQgb2YgYSBsaW5rLCB1c2UKICAgKiBMaW5rLnRhcmdldCBleHBsaWNpdGx5IHRvIGZldGNoIGl0LiAgRGlyZWN0b3J5IGxpbmtzIGFwcGVhcmluZwogICAqIGluc2lkZSBhIHBhdGggYXJlIGZvbGxvd2VkLCB0aG91Z2gsIHRvIGZpbmQgdGhlIGZpbGUgc3lzdGVtIG9iamVjdC4KICAgKgogICAqIENvbXBsZXRlcyB0aGUgcmV0dXJuZWQgRnV0dXJlIHdpdGggYW4gZXJyb3IgaWYgb25lIG9mIHRoZSBwYXRocyBwb2ludHMKICAgKiB0byBhbiBvYmplY3QgdGhhdCBkb2VzIG5vdCBleGlzdC4KICAgKi8KICBzdGF0aWMgRnV0dXJlPGJvb2w+IGlkZW50aWNhbChTdHJpbmcgcGF0aDEsIFN0cmluZyBwYXRoMikgewogICAgSU9PdmVycmlkZXMgb3ZlcnJpZGVzID0gSU9PdmVycmlkZXMuY3VycmVudDsKICAgIGlmIChvdmVycmlkZXMgPT0gbnVsbCkgewogICAgICByZXR1cm4gX2lkZW50aWNhbChwYXRoMSwgcGF0aDIpOwogICAgfQogICAgcmV0dXJuIG92ZXJyaWRlcy5mc2VJZGVudGljYWwocGF0aDEsIHBhdGgyKTsKICB9CgogIHN0YXRpYyBmaW5hbCBSZWdFeHAgX2Fic29sdXRlV2luZG93c1BhdGhQYXR0ZXJuID0KICAgICAgbmV3IFJlZ0V4cChyJ14oXFxcXHxbYS16QS1aXTpbL1xcXSknKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIFtib29sXSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBvYmplY3QncyBwYXRoIGlzIGFic29sdXRlLgogICAqCiAgICogT24gV2luZG93cywgYSBwYXRoIGlzIGFic29sdXRlIGlmIGl0IHN0YXJ0cyB3aXRoIFxcXFwgb3IgYSBkcml2ZSBsZXR0ZXIKICAgKiBiZXR3ZWVuIGEgYW5kIHogKHVwcGVyIG9yIGxvd2VyIGNhc2UpIGZvbGxvd2VkIGJ5IDpcXCBvciA6Ly4KICAgKiBPbiBub24tV2luZG93cywgYSBwYXRoIGlzIGFic29sdXRlIGlmIGl0IHN0YXJ0cyB3aXRoIC8uCiAgICovCiAgYm9vbCBnZXQgaXNBYnNvbHV0ZSB7CiAgICBpZiAoUGxhdGZvcm0uaXNXaW5kb3dzKSB7CiAgICAgIHJldHVybiBwYXRoLnN0YXJ0c1dpdGgoX2Fic29sdXRlV2luZG93c1BhdGhQYXR0ZXJuKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBwYXRoLnN0YXJ0c1dpdGgoJy8nKTsKICAgIH0KICB9CgogIC8qKgogICAqIFJldHVybnMgYSBbRmlsZVN5c3RlbUVudGl0eV0gd2hvc2UgcGF0aCBpcyB0aGUgYWJzb2x1dGUgcGF0aCB0byBbdGhpc10uCiAgICoKICAgKiBUaGUgdHlwZSBvZiB0aGUgcmV0dXJuZWQgaW5zdGFuY2UgaXMgdGhlIHR5cGUgb2YgW3RoaXNdLgogICAqCiAgICogVGhlIGFic29sdXRlIHBhdGggaXMgY29tcHV0ZWQgYnkgcHJlZml4aW5nCiAgICogYSByZWxhdGl2ZSBwYXRoIHdpdGggdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCByZXR1cm5pbmcKICAgKiBhbiBhYnNvbHV0ZSBwYXRoIHVuY2hhbmdlZC4KICAgKi8KICBGaWxlU3lzdGVtRW50aXR5IGdldCBhYnNvbHV0ZTsKCiAgU3RyaW5nIGdldCBfYWJzb2x1dGVQYXRoIHsKICAgIGlmIChpc0Fic29sdXRlKSByZXR1cm4gcGF0aDsKICAgIFN0cmluZyBjdXJyZW50ID0gRGlyZWN0b3J5LmN1cnJlbnQucGF0aDsKICAgIGlmIChjdXJyZW50LmVuZHNXaXRoKCcvJykgfHwKICAgICAgICAoUGxhdGZvcm0uaXNXaW5kb3dzICYmIGN1cnJlbnQuZW5kc1dpdGgoJ1xcJykpKSB7CiAgICAgIHJldHVybiAnJGN1cnJlbnQkcGF0aCc7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJyRjdXJyZW50JHtQbGF0Zm9ybS5wYXRoU2VwYXJhdG9yfSRwYXRoJzsKICAgIH0KICB9CgogIFVpbnQ4TGlzdCBnZXQgX3Jhd0Fic29sdXRlUGF0aCB7CiAgICBpZiAoaXNBYnNvbHV0ZSkgcmV0dXJuIF9yYXdQYXRoOwogICAgdmFyIGN1cnJlbnQgPSBEaXJlY3RvcnkuY3VycmVudC5fcmF3UGF0aC50b0xpc3QoKTsKICAgIGFzc2VydChjdXJyZW50Lmxhc3QgPT0gMCk7CiAgICBjdXJyZW50LnJlbW92ZUxhc3QoKTsgLy8gUmVtb3ZlIG51bGwgdGVybWluYXRvci4KICAgIGlmICgoY3VycmVudC5sYXN0ID09ICcvJy5jb2RlVW5pdEF0KDApKSB8fAogICAgICAgIChQbGF0Zm9ybS5pc1dpbmRvd3MgJiYgKGN1cnJlbnQubGFzdCA9PSAnXFwnLmNvZGVVbml0QXQoMCkpKSkgewogICAgICBjdXJyZW50LmFkZEFsbChfcmF3UGF0aCk7CiAgICAgIHJldHVybiBuZXcgVWludDhMaXN0LmZyb21MaXN0KGN1cnJlbnQpOwogICAgfSBlbHNlIHsKICAgICAgY3VycmVudC5hZGRBbGwodXRmOC5lbmNvZGUoUGxhdGZvcm0ucGF0aFNlcGFyYXRvcikpOwogICAgICBjdXJyZW50LmFkZEFsbChfcmF3UGF0aCk7CiAgICAgIHJldHVybiBuZXcgVWludDhMaXN0LmZyb21MaXN0KGN1cnJlbnQpOwogICAgfQogIH0KCiAgc3RhdGljIGJvb2wgX2lkZW50aWNhbFN5bmMoU3RyaW5nIHBhdGgxLCBTdHJpbmcgcGF0aDIpIHsKICAgIHZhciByZXN1bHQgPSBfaWRlbnRpY2FsTmF0aXZlKF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgcGF0aDEsIHBhdGgyKTsKICAgIF90aHJvd0lmRXJyb3IocmVzdWx0LCAnRXJyb3IgaW4gRmlsZVN5c3RlbUVudGl0eS5pZGVudGljYWxTeW5jJyk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLyoqCiAgICogU3luY2hyb25vdXNseSBjaGVja3Mgd2hldGhlciB0d28gcGF0aHMgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0IGluIHRoZQogICAqIGZpbGUgc3lzdGVtLgogICAqCiAgICogQ29tcGFyaW5nIGEgbGluayB0byBpdHMgdGFyZ2V0IHJldHVybnMgZmFsc2UsIGFzIGRvZXMgY29tcGFyaW5nIHR3byBsaW5rcwogICAqIHRoYXQgcG9pbnQgdG8gdGhlIHNhbWUgdGFyZ2V0LiAgVG8gY2hlY2sgdGhlIHRhcmdldCBvZiBhIGxpbmssIHVzZQogICAqIExpbmsudGFyZ2V0IGV4cGxpY2l0bHkgdG8gZmV0Y2ggaXQuICBEaXJlY3RvcnkgbGlua3MgYXBwZWFyaW5nCiAgICogaW5zaWRlIGEgcGF0aCBhcmUgZm9sbG93ZWQsIHRob3VnaCwgdG8gZmluZCB0aGUgZmlsZSBzeXN0ZW0gb2JqZWN0LgogICAqCiAgICogVGhyb3dzIGFuIGVycm9yIGlmIG9uZSBvZiB0aGUgcGF0aHMgcG9pbnRzIHRvIGFuIG9iamVjdCB0aGF0IGRvZXMgbm90CiAgICogZXhpc3QuCiAgICovCiAgc3RhdGljIGJvb2wgaWRlbnRpY2FsU3luYyhTdHJpbmcgcGF0aDEsIFN0cmluZyBwYXRoMikgewogICAgSU9PdmVycmlkZXMgb3ZlcnJpZGVzID0gSU9PdmVycmlkZXMuY3VycmVudDsKICAgIGlmIChvdmVycmlkZXMgPT0gbnVsbCkgewogICAgICByZXR1cm4gX2lkZW50aWNhbFN5bmMocGF0aDEsIHBhdGgyKTsKICAgIH0KICAgIHJldHVybiBvdmVycmlkZXMuZnNlSWRlbnRpY2FsU3luYyhwYXRoMSwgcGF0aDIpOwogIH0KCiAgLyoqCiAgICogVGVzdCBpZiBbd2F0Y2hdIGlzIHN1cHBvcnRlZCBvbiB0aGUgY3VycmVudCBzeXN0ZW0uCiAgICoKICAgKiBPUyBYIDEwLjYgYW5kIGJlbG93IGlzIG5vdCBzdXBwb3J0ZWQuCiAgICovCiAgc3RhdGljIGJvb2wgZ2V0IGlzV2F0Y2hTdXBwb3J0ZWQgewogICAgZmluYWwgSU9PdmVycmlkZXMgb3ZlcnJpZGVzID0gSU9PdmVycmlkZXMuY3VycmVudDsKICAgIGlmIChvdmVycmlkZXMgPT0gbnVsbCkgewogICAgICByZXR1cm4gX0ZpbGVTeXN0ZW1XYXRjaGVyLmlzU3VwcG9ydGVkOwogICAgfQogICAgcmV0dXJuIG92ZXJyaWRlcy5mc1dhdGNoSXNTdXBwb3J0ZWQoKTsKICB9CgogIC8vIFRoZSBuYXRpdmUgbWV0aG9kcyB3aGljaCBkZXRlcm1pbmUgdHlwZSBvZiB0aGUgRmlsZVN5c3RlbUVudGl0eSByZXF1aXJlCiAgLy8gdGhhdCB0aGUgYnVmZmVyIHByb3ZpZGVkIGlzIG51bGwgdGVybWluYXRlZC4KICBzdGF0aWMgVWludDhMaXN0IF90b1V0ZjhBcnJheShTdHJpbmcgcykgPT4KICAgICAgX3RvTnVsbFRlcm1pbmF0ZWRVdGY4QXJyYXkodXRmOC5lbmNvZGUocykpOwoKICBzdGF0aWMgVWludDhMaXN0IF90b051bGxUZXJtaW5hdGVkVXRmOEFycmF5KFVpbnQ4TGlzdCBsKSB7CiAgICBpZiAobCA9PSBudWxsKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKGwuaXNOb3RFbXB0eSAmJiBsLmxhc3QgIT0gMCkgewogICAgICBmaW5hbCB0bXAgPSBuZXcgVWludDhMaXN0KGwubGVuZ3RoICsgMSk7CiAgICAgIHRtcC5zZXRSYW5nZSgwLCBsLmxlbmd0aCwgbCk7CiAgICAgIHJldHVybiB0bXA7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbDsKICAgIH0KICB9CgogIHN0YXRpYyBTdHJpbmcgX3RvU3RyaW5nRnJvbVV0ZjhBcnJheShVaW50OExpc3QgbCkgewogICAgaWYgKGwgPT0gbnVsbCkgewogICAgICByZXR1cm4gJyc7CiAgICB9CiAgICBVaW50OExpc3Qgbm9uTnVsbFRlcm1pbmF0ZWQgPSBsOwogICAgaWYgKGwubGFzdCA9PSAwKSB7CiAgICAgIG5vbk51bGxUZXJtaW5hdGVkID0gbmV3IFVpbnQ4TGlzdC52aWV3KGwuYnVmZmVyLCAwLCBsLmxlbmd0aCAtIDEpOwogICAgfQogICAgcmV0dXJuIHV0ZjguZGVjb2RlKG5vbk51bGxUZXJtaW5hdGVkLCBhbGxvd01hbGZvcm1lZDogdHJ1ZSk7CiAgfQoKICAvKioKICAgKiBGaW5kcyB0aGUgdHlwZSBvZiBmaWxlIHN5c3RlbSBvYmplY3QgdGhhdCBhIHBhdGggcG9pbnRzIHRvLgogICAqCiAgICogUmV0dXJucyBhIFs6RnV0dXJlPEZpbGVTeXN0ZW1FbnRpdHlUeXBlPjpdIHRoYXQgY29tcGxldGVzIHdpdGggdGhlIHJlc3VsdC4KICAgKgogICAqIFtGaWxlU3lzdGVtRW50aXR5VHlwZV0gaGFzIHRoZSBjb25zdGFudCBpbnN0YW5jZXMgZmlsZSwgZGlyZWN0b3J5LAogICAqIGxpbmssIGFuZCBub3RGb3VuZC4gIFt0eXBlXSB3aWxsIHJldHVybiBsaW5rIG9ubHkgaWYgdGhlIG9wdGlvbmFsCiAgICogbmFtZWQgYXJndW1lbnQgW2ZvbGxvd0xpbmtzXSBpcyBmYWxzZSwgYW5kIFtwYXRoXSBwb2ludHMgdG8gYSBsaW5rLgogICAqIElmIHRoZSBwYXRoIGRvZXMgbm90IHBvaW50IHRvIGEgZmlsZSBzeXN0ZW0gb2JqZWN0LCBvciBhbnkgb3RoZXIgZXJyb3IKICAgKiBvY2N1cnMgaW4gbG9va2luZyB1cCB0aGUgcGF0aCwgbm90Rm91bmQgaXMgcmV0dXJuZWQuICBUaGUgb25seQogICAqIGVycm9yIG9yIGV4Y2VwdGlvbiB0aGF0IG1heSBiZSBwdXQgb24gdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBBcmd1bWVudEVycm9yLAogICAqIGNhdXNlZCBieSBwYXNzaW5nIHRoZSB3cm9uZyB0eXBlIG9mIGFyZ3VtZW50cyB0byB0aGUgZnVuY3Rpb24uCiAgICovCiAgc3RhdGljIEZ1dHVyZTxGaWxlU3lzdGVtRW50aXR5VHlwZT4gdHlwZShTdHJpbmcgcGF0aCwKICAgICAge2Jvb2wgZm9sbG93TGlua3M6IHRydWV9KSB7CiAgICByZXR1cm4gX2dldFR5cGUoX3RvVXRmOEFycmF5KHBhdGgpLCBmb2xsb3dMaW5rcyk7CiAgfQoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IGZpbmRzIHRoZSB0eXBlIG9mIGZpbGUgc3lzdGVtIG9iamVjdCB0aGF0IGEgcGF0aCBwb2ludHMgdG8uCiAgICoKICAgKiBSZXR1cm5zIGEgW0ZpbGVTeXN0ZW1FbnRpdHlUeXBlXS4KICAgKgogICAqIFtGaWxlU3lzdGVtRW50aXR5VHlwZV0gaGFzIHRoZSBjb25zdGFudCBpbnN0YW5jZXMgZmlsZSwgZGlyZWN0b3J5LAogICAqIGxpbmssIGFuZCBub3RGb3VuZC4gIFt0eXBlXSB3aWxsIHJldHVybiBsaW5rIG9ubHkgaWYgdGhlIG9wdGlvbmFsCiAgICogbmFtZWQgYXJndW1lbnQgW2ZvbGxvd0xpbmtzXSBpcyBmYWxzZSwgYW5kIFtwYXRoXSBwb2ludHMgdG8gYSBsaW5rLgogICAqIElmIHRoZSBwYXRoIGRvZXMgbm90IHBvaW50IHRvIGEgZmlsZSBzeXN0ZW0gb2JqZWN0LCBvciBhbnkgb3RoZXIgZXJyb3IKICAgKiBvY2N1cnMgaW4gbG9va2luZyB1cCB0aGUgcGF0aCwgbm90Rm91bmQgaXMgcmV0dXJuZWQuICBUaGUgb25seQogICAqIGVycm9yIG9yIGV4Y2VwdGlvbiB0aGF0IG1heSBiZSB0aHJvd24gaXMgQXJndW1lbnRFcnJvciwKICAgKiBjYXVzZWQgYnkgcGFzc2luZyB0aGUgd3JvbmcgdHlwZSBvZiBhcmd1bWVudHMgdG8gdGhlIGZ1bmN0aW9uLgogICAqLwogIHN0YXRpYyBGaWxlU3lzdGVtRW50aXR5VHlwZSB0eXBlU3luYyhTdHJpbmcgcGF0aCwge2Jvb2wgZm9sbG93TGlua3M6IHRydWV9KSB7CiAgICByZXR1cm4gX2dldFR5cGVTeW5jKF90b1V0ZjhBcnJheShwYXRoKSwgZm9sbG93TGlua3MpOwogIH0KCiAgLyoqCiAgICogQ2hlY2tzIGlmIHR5cGUocGF0aCwgZm9sbG93TGlua3M6IGZhbHNlKSByZXR1cm5zIEZpbGVTeXN0ZW1FbnRpdHlUeXBlLmxpbmsuCiAgICovCiAgc3RhdGljIEZ1dHVyZTxib29sPiBpc0xpbmsoU3RyaW5nIHBhdGgpID0+IF9pc0xpbmtSYXcoX3RvVXRmOEFycmF5KHBhdGgpKTsKCiAgc3RhdGljIEZ1dHVyZTxib29sPiBfaXNMaW5rUmF3KFVpbnQ4TGlzdCByYXdQYXRoKSA9PiBfZ2V0VHlwZShyYXdQYXRoLCBmYWxzZSkKICAgICAgLnRoZW4oKHR5cGUpID0+ICh0eXBlID09IEZpbGVTeXN0ZW1FbnRpdHlUeXBlLmxpbmspKTsKCiAgLyoqCiAgICogQ2hlY2tzIGlmIHR5cGUocGF0aCkgcmV0dXJucyBGaWxlU3lzdGVtRW50aXR5VHlwZS5maWxlLgogICAqLwogIHN0YXRpYyBGdXR1cmU8Ym9vbD4gaXNGaWxlKFN0cmluZyBwYXRoKSA9PiBfZ2V0VHlwZShfdG9VdGY4QXJyYXkocGF0aCksIHRydWUpCiAgICAgIC50aGVuKCh0eXBlKSA9PiAodHlwZSA9PSBGaWxlU3lzdGVtRW50aXR5VHlwZS5maWxlKSk7CgogIC8qKgogICAqIENoZWNrcyBpZiB0eXBlKHBhdGgpIHJldHVybnMgRmlsZVN5c3RlbUVudGl0eVR5cGUuZGlyZWN0b3J5LgogICAqLwogIHN0YXRpYyBGdXR1cmU8Ym9vbD4gaXNEaXJlY3RvcnkoU3RyaW5nIHBhdGgpID0+CiAgICAgIF9nZXRUeXBlKF90b1V0ZjhBcnJheShwYXRoKSwgdHJ1ZSkKICAgICAgICAgIC50aGVuKCh0eXBlKSA9PiAodHlwZSA9PSBGaWxlU3lzdGVtRW50aXR5VHlwZS5kaXJlY3RvcnkpKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSBjaGVja3MgaWYgdHlwZVN5bmMocGF0aCwgZm9sbG93TGlua3M6IGZhbHNlKSByZXR1cm5zCiAgICogRmlsZVN5c3RlbUVudGl0eVR5cGUubGluay4KICAgKi8KICBzdGF0aWMgYm9vbCBpc0xpbmtTeW5jKFN0cmluZyBwYXRoKSA9PiBfaXNMaW5rUmF3U3luYyhfdG9VdGY4QXJyYXkocGF0aCkpOwoKICBzdGF0aWMgYm9vbCBfaXNMaW5rUmF3U3luYyhyYXdQYXRoKSA9PgogICAgICAoX2dldFR5cGVTeW5jKHJhd1BhdGgsIGZhbHNlKSA9PSBGaWxlU3lzdGVtRW50aXR5VHlwZS5saW5rKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSBjaGVja3MgaWYgdHlwZVN5bmMocGF0aCkgcmV0dXJucwogICAqIEZpbGVTeXN0ZW1FbnRpdHlUeXBlLmZpbGUuCiAgICovCiAgc3RhdGljIGJvb2wgaXNGaWxlU3luYyhTdHJpbmcgcGF0aCkgPT4KICAgICAgKF9nZXRUeXBlU3luYyhfdG9VdGY4QXJyYXkocGF0aCksIHRydWUpID09IEZpbGVTeXN0ZW1FbnRpdHlUeXBlLmZpbGUpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IGNoZWNrcyBpZiB0eXBlU3luYyhwYXRoKSByZXR1cm5zCiAgICogRmlsZVN5c3RlbUVudGl0eVR5cGUuZGlyZWN0b3J5LgogICAqLwogIHN0YXRpYyBib29sIGlzRGlyZWN0b3J5U3luYyhTdHJpbmcgcGF0aCkgPT4KICAgICAgKF9nZXRUeXBlU3luYyhfdG9VdGY4QXJyYXkocGF0aCksIHRydWUpID09CiAgICAgICAgICBGaWxlU3lzdGVtRW50aXR5VHlwZS5kaXJlY3RvcnkpOwoKICBleHRlcm5hbCBzdGF0aWMgX2dldFR5cGVOYXRpdmUoCiAgICAgIF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCwgYm9vbCBmb2xsb3dMaW5rcyk7CiAgZXh0ZXJuYWwgc3RhdGljIF9pZGVudGljYWxOYXRpdmUoCiAgICAgIF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBTdHJpbmcgcGF0aDEsIFN0cmluZyBwYXRoMik7CiAgZXh0ZXJuYWwgc3RhdGljIF9yZXNvbHZlU3ltYm9saWNMaW5rcyhfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHBhdGgpOwoKICAvLyBGaW5kcyB0aGUgbmV4dC10by1sYXN0IGNvbXBvbmVudCB3aGVuIGRpdmlkaW5nIGF0IHBhdGggc2VwYXJhdG9ycy4KICBzdGF0aWMgZmluYWwgUmVnRXhwIF9wYXJlbnRSZWdFeHAgPSBQbGF0Zm9ybS5pc1dpbmRvd3MKICAgICAgPyBuZXcgUmVnRXhwKHInW14vXFxdWy9cXF0rW14vXFxdJykKICAgICAgOiBuZXcgUmVnRXhwKHInW14vXS8rW14vXScpOwoKICAvKioKICAgKiBSZW1vdmVzIHRoZSBmaW5hbCBwYXRoIGNvbXBvbmVudCBvZiBhIHBhdGgsIHVzaW5nIHRoZSBwbGF0Zm9ybSdzCiAgICogcGF0aCBzZXBhcmF0b3IgdG8gc3BsaXQgdGhlIHBhdGguCiAgICoKICAgKiBXaWxsIG5vdCByZW1vdmUgdGhlIHJvb3QgY29tcG9uZW50IG9mIGEgV2luZG93cyBwYXRoLCBsaWtlICJDOlxcIiBvcgogICAqICJcXFxcc2VydmVyX25hbWVcXCIuIElnbm9yZXMgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3JzLCBhbmQgbGVhdmVzIG5vCiAgICogdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3JzLgogICAqLwogIHN0YXRpYyBTdHJpbmcgcGFyZW50T2YoU3RyaW5nIHBhdGgpIHsKICAgIGludCByb290RW5kID0gLTE7CiAgICBpZiAoUGxhdGZvcm0uaXNXaW5kb3dzKSB7CiAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoX2Fic29sdXRlV2luZG93c1BhdGhQYXR0ZXJuKSkgewogICAgICAgIC8vIFJvb3QgZW5kcyBhdCBmaXJzdCAvIG9yIFwgYWZ0ZXIgdGhlIGZpcnN0IHR3byBjaGFyYWN0ZXJzLgogICAgICAgIHJvb3RFbmQgPSBwYXRoLmluZGV4T2YobmV3IFJlZ0V4cChyJ1svXFxdJyksIDIpOwogICAgICAgIGlmIChyb290RW5kID09IC0xKSByZXR1cm4gcGF0aDsKICAgICAgfSBlbHNlIGlmIChwYXRoLnN0YXJ0c1dpdGgoJ1xcJykgfHwgcGF0aC5zdGFydHNXaXRoKCcvJykpIHsKICAgICAgICByb290RW5kID0gMDsKICAgICAgfQogICAgfSBlbHNlIGlmIChwYXRoLnN0YXJ0c1dpdGgoJy8nKSkgewogICAgICByb290RW5kID0gMDsKICAgIH0KICAgIC8vIElnbm9yZSB0cmFpbGluZyBzbGFzaGVzLgogICAgLy8gQWxsIG5vbi10cml2aWFsIGNhc2VzIGhhdmUgc2VwYXJhdG9ycyBiZXR3ZWVuIHR3byBub24tc2VwYXJhdG9ycy4KICAgIGludCBwb3MgPSBwYXRoLmxhc3RJbmRleE9mKF9wYXJlbnRSZWdFeHApOwogICAgaWYgKHBvcyA+IHJvb3RFbmQpIHsKICAgICAgcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHBvcyArIDEpOwogICAgfSBlbHNlIGlmIChyb290RW5kID4gLTEpIHsKICAgICAgcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHJvb3RFbmQgKyAxKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAnLic7CiAgICB9CiAgfQoKICAvKioKICAgKiBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgW3RoaXNdLgogICAqLwogIERpcmVjdG9yeSBnZXQgcGFyZW50ID0+IG5ldyBEaXJlY3RvcnkocGFyZW50T2YocGF0aCkpOwoKICBzdGF0aWMgRmlsZVN5c3RlbUVudGl0eVR5cGUgX2dldFR5cGVTeW5jSGVscGVyKAogICAgICBVaW50OExpc3QgcmF3UGF0aCwgYm9vbCBmb2xsb3dMaW5rcykgewogICAgdmFyIHJlc3VsdCA9IF9nZXRUeXBlTmF0aXZlKF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgcmF3UGF0aCwgZm9sbG93TGlua3MpOwogICAgX3Rocm93SWZFcnJvcihyZXN1bHQsICdFcnJvciBnZXR0aW5nIHR5cGUgb2YgRmlsZVN5c3RlbUVudGl0eScpOwogICAgcmV0dXJuIEZpbGVTeXN0ZW1FbnRpdHlUeXBlLl9sb29rdXAocmVzdWx0KTsKICB9CgogIHN0YXRpYyBGaWxlU3lzdGVtRW50aXR5VHlwZSBfZ2V0VHlwZVN5bmMoCiAgICAgIFVpbnQ4TGlzdCByYXdQYXRoLCBib29sIGZvbGxvd0xpbmtzKSB7CiAgICBJT092ZXJyaWRlcyBvdmVycmlkZXMgPSBJT092ZXJyaWRlcy5jdXJyZW50OwogICAgaWYgKG92ZXJyaWRlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfZ2V0VHlwZVN5bmNIZWxwZXIocmF3UGF0aCwgZm9sbG93TGlua3MpOwogICAgfQogICAgcmV0dXJuIG92ZXJyaWRlcy5mc2VHZXRUeXBlU3luYygKICAgICAgICB1dGY4LmRlY29kZShyYXdQYXRoLCBhbGxvd01hbGZvcm1lZDogdHJ1ZSksIGZvbGxvd0xpbmtzKTsKICB9CgogIHN0YXRpYyBGdXR1cmU8RmlsZVN5c3RlbUVudGl0eVR5cGU+IF9nZXRUeXBlUmVxdWVzdCgKICAgICAgVWludDhMaXN0IHJhd1BhdGgsIGJvb2wgZm9sbG93TGlua3MpIHsKICAgIHJldHVybiBfRmlsZS5fZGlzcGF0Y2hXaXRoTmFtZXNwYWNlKAogICAgICAgIF9JT1NlcnZpY2UuZmlsZVR5cGUsIFtudWxsLCByYXdQYXRoLCBmb2xsb3dMaW5rc10pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsICJFcnJvciBnZXR0aW5nIHR5cGUiLAogICAgICAgICAgICB1dGY4LmRlY29kZShyYXdQYXRoLCBhbGxvd01hbGZvcm1lZDogdHJ1ZSkpOwogICAgICB9CiAgICAgIHJldHVybiBGaWxlU3lzdGVtRW50aXR5VHlwZS5fbG9va3VwKHJlc3BvbnNlKTsKICAgIH0pOwogIH0KCiAgc3RhdGljIEZ1dHVyZTxGaWxlU3lzdGVtRW50aXR5VHlwZT4gX2dldFR5cGUoCiAgICAgIFVpbnQ4TGlzdCByYXdQYXRoLCBib29sIGZvbGxvd0xpbmtzKSB7CiAgICBJT092ZXJyaWRlcyBvdmVycmlkZXMgPSBJT092ZXJyaWRlcy5jdXJyZW50OwogICAgaWYgKG92ZXJyaWRlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfZ2V0VHlwZVJlcXVlc3QocmF3UGF0aCwgZm9sbG93TGlua3MpOwogICAgfQogICAgcmV0dXJuIG92ZXJyaWRlcy5mc2VHZXRUeXBlKAogICAgICAgIHV0ZjguZGVjb2RlKHJhd1BhdGgsIGFsbG93TWFsZm9ybWVkOiB0cnVlKSwgZm9sbG93TGlua3MpOwogIH0KCiAgc3RhdGljIF90aHJvd0lmRXJyb3IoT2JqZWN0IHJlc3VsdCwgU3RyaW5nIG1zZywgW1N0cmluZyBwYXRoXSkgewogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKG1zZywgcGF0aCwgcmVzdWx0KTsKICAgIH0gZWxzZSBpZiAocmVzdWx0IGlzIEFyZ3VtZW50RXJyb3IpIHsKICAgICAgdGhyb3cgcmVzdWx0OwogICAgfQogIH0KCiAgLy8gVE9ETyhia29ueWkpOiBmaW5kIGEgd2F5IHRvIGRvIHRoaXMgd2l0aCByYXcgcGF0aHMuCiAgc3RhdGljIFN0cmluZyBfdHJpbVRyYWlsaW5nUGF0aFNlcGFyYXRvcnMoU3RyaW5nIHBhdGgpIHsKICAgIC8vIERvbid0IGhhbmRsZSBhcmd1bWVudCBlcnJvcnMgaGVyZS4KICAgIGlmIChwYXRoID09IG51bGwpIHJldHVybiBwYXRoOwogICAgaWYgKFBsYXRmb3JtLmlzV2luZG93cykgewogICAgICB3aGlsZSAocGF0aC5sZW5ndGggPiAxICYmCiAgICAgICAgICAocGF0aC5lbmRzV2l0aChQbGF0Zm9ybS5wYXRoU2VwYXJhdG9yKSB8fCBwYXRoLmVuZHNXaXRoKCcvJykpKSB7CiAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoIC0gMSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHdoaWxlIChwYXRoLmxlbmd0aCA+IDEgJiYgcGF0aC5lbmRzV2l0aChQbGF0Zm9ybS5wYXRoU2VwYXJhdG9yKSkgewogICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCAtIDEpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcGF0aDsKICB9CgogIC8vIFRPRE8oYmtvbnlpKTogZmluZCBhIHdheSB0byBkbyB0aGlzIHdpdGggcmF3IHBhdGhzLgogIHN0YXRpYyBTdHJpbmcgX2Vuc3VyZVRyYWlsaW5nUGF0aFNlcGFyYXRvcnMoU3RyaW5nIHBhdGgpIHsKICAgIC8vIERvbid0IGhhbmRsZSBhcmd1bWVudCBlcnJvcnMgaGVyZS4KICAgIGlmIChwYXRoID09IG51bGwpIHJldHVybiBwYXRoOwogICAgaWYgKHBhdGguaXNFbXB0eSkgcGF0aCA9ICcuJzsKICAgIGlmIChQbGF0Zm9ybS5pc1dpbmRvd3MpIHsKICAgICAgd2hpbGUgKCFwYXRoLmVuZHNXaXRoKFBsYXRmb3JtLnBhdGhTZXBhcmF0b3IpICYmICFwYXRoLmVuZHNXaXRoKCcvJykpIHsKICAgICAgICBwYXRoID0gIiRwYXRoJHtQbGF0Zm9ybS5wYXRoU2VwYXJhdG9yfSI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHdoaWxlICghcGF0aC5lbmRzV2l0aChQbGF0Zm9ybS5wYXRoU2VwYXJhdG9yKSkgewogICAgICAgIHBhdGggPSAiJHBhdGgke1BsYXRmb3JtLnBhdGhTZXBhcmF0b3J9IjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBhdGg7CiAgfQp9CgovKioKICogQmFzZSBldmVudCBjbGFzcyBlbWl0dGVkIGJ5IFtGaWxlU3lzdGVtRW50aXR5LndhdGNoXS4KICovCmNsYXNzIEZpbGVTeXN0ZW1FdmVudCB7CiAgLyoqCiAgICogQml0ZmllbGQgZm9yIFtGaWxlU3lzdGVtRW50aXR5LndhdGNoXSwgdG8gZW5hYmxlIFtGaWxlU3lzdGVtQ3JlYXRlRXZlbnRdcy4KICAgKi8KICBzdGF0aWMgY29uc3QgaW50IGNyZWF0ZSA9IDEgPDwgMDsKICBARGVwcmVjYXRlZCgiVXNlIGNyZWF0ZSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IENSRUFURSA9IDEgPDwgMDsKCiAgLyoqCiAgICogQml0ZmllbGQgZm9yIFtGaWxlU3lzdGVtRW50aXR5LndhdGNoXSwgdG8gZW5hYmxlIFtGaWxlU3lzdGVtTW9kaWZ5RXZlbnRdcy4KICAgKi8KICBzdGF0aWMgY29uc3QgaW50IG1vZGlmeSA9IDEgPDwgMTsKICBARGVwcmVjYXRlZCgiVXNlIG1vZGlmeSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE1PRElGWSA9IDEgPDwgMTsKCiAgLyoqCiAgICogQml0ZmllbGQgZm9yIFtGaWxlU3lzdGVtRW50aXR5LndhdGNoXSwgdG8gZW5hYmxlIFtGaWxlU3lzdGVtRGVsZXRlRXZlbnRdcy4KICAgKi8KICBzdGF0aWMgY29uc3QgaW50IGRlbGV0ZSA9IDEgPDwgMjsKICBARGVwcmVjYXRlZCgiVXNlIGRlbGV0ZSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IERFTEVURSA9IDEgPDwgMjsKCiAgLyoqCiAgICogQml0ZmllbGQgZm9yIFtGaWxlU3lzdGVtRW50aXR5LndhdGNoXSwgdG8gZW5hYmxlIFtGaWxlU3lzdGVtTW92ZUV2ZW50XXMuCiAgICovCiAgc3RhdGljIGNvbnN0IGludCBtb3ZlID0gMSA8PCAzOwogIEBEZXByZWNhdGVkKCJVc2UgbW92ZSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE1PVkUgPSAxIDw8IDM7CgogIC8qKgogICAqIEJpdGZpZWxkIGZvciBbRmlsZVN5c3RlbUVudGl0eS53YXRjaF0sIGZvciBlbmFibGluZyBhbGwgb2YgW2NyZWF0ZV0sCiAgICogW21vZGlmeV0sIFtkZWxldGVdIGFuZCBbbW92ZV0uCiAgICovCiAgc3RhdGljIGNvbnN0IGludCBhbGwgPSBjcmVhdGUgfCBtb2RpZnkgfCBkZWxldGUgfCBtb3ZlOwogIEBEZXByZWNhdGVkKCJVc2UgYWxsIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgQUxMID0gY3JlYXRlIHwgbW9kaWZ5IHwgZGVsZXRlIHwgbW92ZTsKCiAgc3RhdGljIGNvbnN0IGludCBfbW9kaWZ5QXR0cmlidXRlcyA9IDEgPDwgNDsKICBzdGF0aWMgY29uc3QgaW50IF9kZWxldGVTZWxmID0gMSA8PCA1OwogIHN0YXRpYyBjb25zdCBpbnQgX2lzRGlyID0gMSA8PCA2OwoKICAvKioKICAgKiBUaGUgdHlwZSBvZiBldmVudC4gU2VlIFtGaWxlU3lzdGVtRXZlbnRdIGZvciBhIGxpc3Qgb2YgZXZlbnRzLgogICAqLwogIGZpbmFsIGludCB0eXBlOwoKICAvKioKICAgKiBUaGUgcGF0aCB0aGF0IHRyaWdnZXJlZCB0aGUgZXZlbnQuCiAgICoKICAgKiBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIGFuZCB0aGUgRmlsZVN5c3RlbUVudGl0eSwgdGhlIHBhdGggbWF5IGJlCiAgICogcmVsYXRpdmUuCiAgICovCiAgZmluYWwgU3RyaW5nIHBhdGg7CgogIC8qKgogICAqIElzIGB0cnVlYCBpZiB0aGUgZXZlbnQgdGFyZ2V0IHdhcyBhIGRpcmVjdG9yeS4KICAgKgogICAqIE5vdGUgdGhhdCBpZiB0aGUgZmlsZSBoYXMgYmVlbiBkZWxldGVkIGJ5IHRoZSB0aW1lIHRoZSBldmVudCBoYXMgYXJyaXZlZCwKICAgKiB0aGlzIHdpbGwgYWx3YXlzIGJlIGBmYWxzZWAgb24gV2luZG93cy4gSW4gcGFydGljdWxhciwgaXQgd2lsbCBhbHdheXMgYmUKICAgKiBgZmFsc2VgIGZvciBgZGVsZXRlYCBldmVudHMuCiAgICovCiAgZmluYWwgYm9vbCBpc0RpcmVjdG9yeTsKCiAgRmlsZVN5c3RlbUV2ZW50Ll8odGhpcy50eXBlLCB0aGlzLnBhdGgsIHRoaXMuaXNEaXJlY3RvcnkpOwp9CgovKioKICogRmlsZSBzeXN0ZW0gZXZlbnQgZm9yIG5ld2x5IGNyZWF0ZWQgZmlsZSBzeXN0ZW0gb2JqZWN0cy4KICovCmNsYXNzIEZpbGVTeXN0ZW1DcmVhdGVFdmVudCBleHRlbmRzIEZpbGVTeXN0ZW1FdmVudCB7CiAgRmlsZVN5c3RlbUNyZWF0ZUV2ZW50Ll8ocGF0aCwgaXNEaXJlY3RvcnkpCiAgICAgIDogc3VwZXIuXyhGaWxlU3lzdGVtRXZlbnQuY3JlYXRlLCBwYXRoLCBpc0RpcmVjdG9yeSk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJGaWxlU3lzdGVtQ3JlYXRlRXZlbnQoJyRwYXRoJykiOwp9CgovKioKICogRmlsZSBzeXN0ZW0gZXZlbnQgZm9yIG1vZGlmaWNhdGlvbnMgb2YgZmlsZSBzeXN0ZW0gb2JqZWN0cy4KICovCmNsYXNzIEZpbGVTeXN0ZW1Nb2RpZnlFdmVudCBleHRlbmRzIEZpbGVTeXN0ZW1FdmVudCB7CiAgLyoqCiAgICogSWYgdGhlIGNvbnRlbnQgd2FzIGNoYW5nZWQgYW5kIG5vdCBvbmx5IHRoZSBhdHRyaWJ1dGVzLCBbY29udGVudENoYW5nZWRdCiAgICogaXMgYHRydWVgLgogICAqLwogIGZpbmFsIGJvb2wgY29udGVudENoYW5nZWQ7CgogIEZpbGVTeXN0ZW1Nb2RpZnlFdmVudC5fKHBhdGgsIGlzRGlyZWN0b3J5LCB0aGlzLmNvbnRlbnRDaGFuZ2VkKQogICAgICA6IHN1cGVyLl8oRmlsZVN5c3RlbUV2ZW50Lm1vZGlmeSwgcGF0aCwgaXNEaXJlY3RvcnkpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PgogICAgICAiRmlsZVN5c3RlbU1vZGlmeUV2ZW50KCckcGF0aCcsIGNvbnRlbnRDaGFuZ2VkPSRjb250ZW50Q2hhbmdlZCkiOwp9CgovKioKICogRmlsZSBzeXN0ZW0gZXZlbnQgZm9yIGRlbGV0aW9uIG9mIGZpbGUgc3lzdGVtIG9iamVjdHMuCiAqLwpjbGFzcyBGaWxlU3lzdGVtRGVsZXRlRXZlbnQgZXh0ZW5kcyBGaWxlU3lzdGVtRXZlbnQgewogIEZpbGVTeXN0ZW1EZWxldGVFdmVudC5fKHBhdGgsIGlzRGlyZWN0b3J5KQogICAgICA6IHN1cGVyLl8oRmlsZVN5c3RlbUV2ZW50LmRlbGV0ZSwgcGF0aCwgaXNEaXJlY3RvcnkpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiRmlsZVN5c3RlbURlbGV0ZUV2ZW50KCckcGF0aCcpIjsKfQoKLyoqCiAqIEZpbGUgc3lzdGVtIGV2ZW50IGZvciBtb3Zpbmcgb2YgZmlsZSBzeXN0ZW0gb2JqZWN0cy4KICovCmNsYXNzIEZpbGVTeXN0ZW1Nb3ZlRXZlbnQgZXh0ZW5kcyBGaWxlU3lzdGVtRXZlbnQgewogIC8qKgogICAqIElmIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGlzIGFibGUgdG8gaWRlbnRpZnkgdGhlIGRlc3RpbmF0aW9uIG9mCiAgICogdGhlIG1vdmVkIGZpbGUsIFtkZXN0aW5hdGlvbl0gd2lsbCBiZSBzZXQuIE90aGVyd2lzZSwgaXQgd2lsbCBiZSBgbnVsbGAuCiAgICovCiAgZmluYWwgU3RyaW5nIGRlc3RpbmF0aW9uOwoKICBGaWxlU3lzdGVtTW92ZUV2ZW50Ll8ocGF0aCwgaXNEaXJlY3RvcnksIHRoaXMuZGVzdGluYXRpb24pCiAgICAgIDogc3VwZXIuXyhGaWxlU3lzdGVtRXZlbnQubW92ZSwgcGF0aCwgaXNEaXJlY3RvcnkpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICB2YXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgYnVmZmVyLndyaXRlKCJGaWxlU3lz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RmlsZVN5c3RlbUVudGl0eSB7CiAgQHBhdGNoCiAgc3RhdGljIF9nZXRUeXBlTmF0aXZlKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCwKICAgICAgYm9vbCBmb2xsb3dMaW5rcykgbmF0aXZlICJGaWxlX0dldFR5cGUiOwogIEBwYXRjaAogIHN0YXRpYyBfaWRlbnRpY2FsTmF0aXZlKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBTdHJpbmcgcGF0aDEsIFN0cmluZyBwYXRoMikKICAgICAgbmF0aXZlICJGaWxlX0FyZUlkZW50aWNhbCI7CiAgQHBhdGNoCiAgc3RhdGljIF9yZXNvbHZlU3ltYm9saWNMaW5rcyhfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHBhdGgpCiAgICAgIG5hdGl2ZSAiRmlsZV9SZXNvbHZlU3ltYm9saWNMaW5rcyI7Cn0KGgBOTjwBIAEHEQlKAgEHGQlBLwlMIglFKgIBK2RhcnQ6aW8tcGF0Y2gvZmlsZV9zeXN0ZW1fZW50aXR5X3BhdGNoLmRhcnQ0b3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2lvL2lvX3Jlc291cmNlX2luZm8uZGFydKH+Ly8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCmFic3RyYWN0IGNsYXNzIF9JT1Jlc291cmNlSW5mbyB7CiAgZmluYWwgU3RyaW5nIHR5cGU7CiAgZmluYWwgaW50IGlkOwogIFN0cmluZyBnZXQgbmFtZTsKICBzdGF0aWMgaW50IF9jb3VudCA9IDA7CgogIHN0YXRpYyBmaW5hbCBTdG9wd2F0Y2ggX3N3ID0gbmV3IFN0b3B3YXRjaCgpLi5zdGFydCgpOwogIHN0YXRpYyBmaW5hbCBfc3RhcnRUaW1lID0gbmV3IERhdGVUaW1lLm5vdygpLm1pbGxpc2Vjb25kc1NpbmNlRXBvY2g7CgogIHN0YXRpYyBkb3VibGUgZ2V0IHRpbWVzdGFtcCA9PiBfc3RhcnRUaW1lICsgX3N3LmVsYXBzZWRNaWNyb3NlY29uZHMgLyAxMDAwOwoKICBfSU9SZXNvdXJjZUluZm8odGhpcy50eXBlKSA6IGlkID0gX0lPUmVzb3VyY2VJbmZvLmdldE5leHRJRCgpOwoKICAvLy8gR2V0IHRoZSBmdWxsIHNldCBvZiB2YWx1ZXMgZm9yIGEgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uIFRoaXMgaXMgbm9ybWFsbHkKICAvLy8gbG9va2VkIHVwIGJhc2VkIG9uIGFuIGlkIGZyb20gYSByZWZlcmVuY2VWYWx1ZU1hcC4KICBNYXA8U3RyaW5nLCBkeW5hbWljPiBnZXQgZnVsbFZhbHVlTWFwOwoKICAvLy8gVGhlIHJlZmVyZW5jZSBtYXAsIHVzZWQgdG8gcmV0dXJuIGEgbGlzdCBvZiB2YWx1ZXMsIGUuZy4sIGdldHRpbmcKICAvLy8gYWxsIG9wZW4gc29ja2V0cy4gVGhlIHN0cnVjdHVyZSBvZiB0aGlzIGlzIHNoYXJlZCBhbW9uZyBhbGwgc3ViY2xhc3Nlcy4KICBNYXA8U3RyaW5nLCBkeW5hbWljPiBnZXQgcmVmZXJlbmNlVmFsdWVNYXAgPT4gewogICAgICAgIC8vIFRoZSB0eXBlIGZvciBhIHJlZmVyZW5jZSBvYmplY3QgaXMgcHJlZml4ZWQgd2l0aCBAIGluIG9ic2VydmF0b3J5LgogICAgICAgICd0eXBlJzogJ0AkdHlwZScsCiAgICAgICAgJ2lkJzogaWQsCiAgICAgICAgJ25hbWUnOiBuYW1lLAogICAgICB9OwoKICBzdGF0aWMgaW50IGdldE5leHRJRCgpID0+IF9jb3VudCsrOwp9CgphYnN0cmFjdCBjbGFzcyBfUmVhZFdyaXRlUmVzb3VyY2VJbmZvIGV4dGVuZHMgX0lPUmVzb3VyY2VJbmZvIHsKICBpbnQgdG90YWxSZWFkOwogIGludCB0b3RhbFdyaXR0ZW47CiAgaW50IHJlYWRDb3VudDsKICBpbnQgd3JpdGVDb3VudDsKICBkb3VibGUgbGFzdFJlYWQ7CiAgZG91YmxlIGxhc3RXcml0ZTsKCiAgLy8gTm90IGFsbCBjYWxsIHNpdGVzIHVzZSB0aGlzLiBJbiBzb21lIGNhc2VzLCBlLmcuLCBhIHNvY2tldCwgYSByZWFkIGRvZXMKICAvLyBub3QgYWx3YXlzIG1lYW4gdGhhdCB3ZSBhY3R1YWxseSByZWFkIHNvbWUgYnl0ZXMgKHdlIG1heSBkbyBhIHJlYWQgdG8gc2VlCiAgLy8gaWYgdGhlcmUgYXJlIHNvbWUgYnl0ZXMgYXZhaWxhYmxlKS4KICB2b2lkIGFkZFJlYWQoaW50IGJ5dGVzKSB7CiAgICB0b3RhbFJlYWQgKz0gYnl0ZXM7CiAgICByZWFkQ291bnQrKzsKICAgIGxhc3RSZWFkID0gX0lPUmVzb3VyY2VJbmZvLnRpbWVzdGFtcDsKICB9CgogIC8vIEluIGNhc2VzIHdoZXJlIHdlIHJlYWQgYnV0IGRpZCBub3QgbmVjZXNzYXJpbHkgZ2V0IGFueSBieXRlcywgdXNlIHRoaXMgdG8KICAvLyB1cGRhdGUgdGhlIHJlYWRDb3VudCBhbmQgdGltZXN0YW1wLiBNYW51YWxseSB1cGRhdGUgdG90YWxSZWFkIGlmIGFueSBieXRlcwogIC8vIHdoZXJlIGFjdHVhbGx5IHJlYWQuCiAgdm9pZCBkaWRSZWFkKCkgewogICAgYWRkUmVhZCgwKTsKICB9CgogIHZvaWQgYWRkV3JpdGUoaW50IGJ5dGVzKSB7CiAgICB0b3RhbFdyaXR0ZW4gKz0gYnl0ZXM7CiAgICB3cml0ZUNvdW50Kys7CiAgICBsYXN0V3JpdGUgPSBfSU9SZXNvdXJjZUluZm8udGltZXN0YW1wOwogIH0KCiAgX1JlYWRXcml0ZVJlc291cmNlSW5mbyhTdHJpbmcgdHlwZSkKICAgICAgOiB0b3RhbFJlYWQgPSAwLAogICAgICAgIHRvdGFsV3JpdHRlbiA9IDAsCiAgICAgICAgcmVhZENvdW50ID0gMCwKICAgICAgICB3cml0ZUNvdW50ID0gMCwKICAgICAgICBsYXN0UmVhZCA9IDAuMCwKICAgICAgICBsYXN0V3JpdGUgPSAwLjAsCiAgICAgICAgc3VwZXIodHlwZSk7CgogIE1hcDxTdHJpbmcsIGR5bmFtaWM+IGdldCBmdWxsVmFsdWVNYXAgPT4gewogICAgICAgICd0eXBlJzogdHlwZSwKICAgICAgICAnaWQnOiBpZCwKICAgICAgICAnbmFtZSc6IG5hbWUsCiAgICAgICAgJ3RvdGFsUmVhZCc6IHRvdGFsUmVhZCwKICAgICAgICAndG90YWxXcml0dGVuJzogdG90YWxXcml0dGVuLAogICAgICAgICdyZWFkQ291bnQnOiByZWFkQ291bnQsCiAgICAgICAgJ3dyaXRlQ291bnQnOiB3cml0ZUNvdW50LAogICAgICAgICdsYXN0UmVhZCc6IGxhc3RSZWFkLAogICAgICAgICdsYXN0V3JpdGUnOiBsYXN0V3JpdGUKICAgICAgfTsKfQoKY2xhc3MgX0ZpbGVSZXNvdXJjZUluZm8gZXh0ZW5kcyBfUmVhZFdyaXRlUmVzb3VyY2VJbmZvIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIF90eXBlID0gJ19maWxlJzsKCiAgZmluYWwgZmlsZTsKCiAgc3RhdGljIE1hcDxpbnQsIF9GaWxlUmVzb3VyY2VJbmZvPiBvcGVuRmlsZXMgPQogICAgICBuZXcgTWFwPGludCwgX0ZpbGVSZXNvdXJjZUluZm8+KCk7CgogIF9GaWxlUmVzb3VyY2VJbmZvKHRoaXMuZmlsZSkgOiBzdXBlcihfdHlwZSkgewogICAgRmlsZU9wZW5lZCh0aGlzKTsKICB9CgogIHN0YXRpYyBGaWxlT3BlbmVkKF9GaWxlUmVzb3VyY2VJbmZvIGluZm8pIHsKICAgIGFzc2VydCghb3BlbkZpbGVzLmNvbnRhaW5zS2V5KGluZm8uaWQpKTsKICAgIG9wZW5GaWxlc1tpbmZvLmlkXSA9IGluZm87CiAgfQoKICBzdGF0aWMgRmlsZUNsb3NlZChfRmlsZVJlc291cmNlSW5mbyBpbmZvKSB7CiAgICBhc3NlcnQob3BlbkZpbGVzLmNvbnRhaW5zS2V5KGluZm8uaWQpKTsKICAgIG9wZW5GaWxlcy5yZW1vdmUoaW5mby5pZCk7CiAgfQoKICBzdGF0aWMgSXRlcmFibGU8TWFwPFN0cmluZywgZHluYW1pYz4+IGdldE9wZW5GaWxlc0xpc3QoKSB7CiAgICByZXR1cm4gbmV3IExpc3QuZnJvbShvcGVuRmlsZXMudmFsdWVzLm1hcCgoZSkgPT4gZS5yZWZlcmVuY2VWYWx1ZU1hcCkpOwogIH0KCiAgc3RhdGljIEZ1dHVyZTxTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2U+IGdldE9wZW5GaWxlcyhmdW5jdGlvbiwgcGFyYW1zKSB7CiAgICBhc3NlcnQoZnVuY3Rpb24gPT0gJ2V4dC5kYXJ0LmlvLmdldE9wZW5GaWxlcycpOwogICAgdmFyIGRhdGEgPSB7J3R5cGUnOiAnX29wZW5maWxlcycsICdkYXRhJzogZ2V0T3BlbkZpbGVzTGlzdCgpfTsKICAgIHZhciBqc29uVmFsdWUgPSBqc29uLmVuY29kZShkYXRhKTsKICAgIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKG5ldyBTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2UucmVzdWx0KGpzb25WYWx1ZSkpOwogIH0KCiAgTWFwPFN0cmluZywgZHluYW1pYz4gZ2V0RmlsZUluZm9NYXAoKSB7CiAgICByZXR1cm4gZnVsbFZhbHVlTWFwOwogIH0KCiAgc3RhdGljIEZ1dHVyZTxTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2U+IGdldEZpbGVJbmZvTWFwQnlJRChmdW5jdGlvbiwgcGFyYW1zKSB7CiAgICBhc3NlcnQocGFyYW1zLmNvbnRhaW5zS2V5KCdpZCcpKTsKICAgIHZhciBpZCA9IGludC5wYXJzZShwYXJhbXNbJ2lkJ10pOwogICAgdmFyIHJlc3VsdCA9CiAgICAgICAgb3BlbkZpbGVzLmNvbnRhaW5zS2V5KGlkKSA/IG9wZW5GaWxlc1tpZF0uZ2V0RmlsZUluZm9NYXAoKSA6IHt9OwogICAgdmFyIGpzb25WYWx1ZSA9IGpzb24uZW5jb2RlKHJlc3VsdCk7CiAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZShuZXcgU2VydmljZUV4dGVuc2lvblJlc3BvbnNlLnJlc3VsdChqc29uVmFsdWUpKTsKICB9CgogIFN0cmluZyBnZXQgbmFtZSB7CiAgICByZXR1cm4gJyR7ZmlsZS5wYXRofSc7CiAgfQp9CgpjbGFzcyBfUHJvY2Vzc1Jlc291cmNlSW5mbyBleHRlbmRzIF9JT1Jlc291cmNlSW5mbyB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBfdHlwZSA9ICdfcHJvY2Vzcyc7CiAgZmluYWwgcHJvY2VzczsKICBmaW5hbCBkb3VibGUgc3RhcnRlZEF0OwoKICBzdGF0aWMgTWFwPGludCwgX1Byb2Nlc3NSZXNvdXJjZUluZm8+IHN0YXJ0ZWRQcm9jZXNzZXMgPQogICAgICBuZXcgTWFwPGludCwgX1Byb2Nlc3NSZXNvdXJjZUluZm8+KCk7CgogIF9Qcm9jZXNzUmVzb3VyY2VJbmZvKHRoaXMucHJvY2VzcykKICAgICAgOiBzdGFydGVkQXQgPSBfSU9SZXNvdXJjZUluZm8udGltZXN0YW1wLAogICAgICAgIHN1cGVyKF90eXBlKSB7CiAgICBQcm9jZXNzU3RhcnRlZCh0aGlzKTsKICB9CgogIFN0cmluZyBnZXQgbmFtZSA9PiBwcm9jZXNzLl9wYXRoOwoKICB2b2lkIHN0b3BwZWQoKSB7CiAgICBQcm9jZXNzU3RvcHBlZCh0aGlzKTsKICB9CgogIE1hcDxTdHJpbmcsIGR5bmFtaWM+IGdldCBmdWxsVmFsdWVNYXAgPT4gewogICAgICAgICd0eXBlJzogdHlwZSwKICAgICAgICAnaWQnOiBpZCwKICAgICAgICAnbmFtZSc6IG5hbWUsCiAgICAgICAgJ3BpZCc6IHByb2Nlc3MucGlkLAogICAgICAgICdzdGFydGVkQXQnOiBzdGFydGVkQXQsCiAgICAgICAgJ2FyZ3VtZW50cyc6IHByb2Nlc3MuX2FyZ3VtZW50cywKICAgICAgICAnd29ya2luZ0RpcmVjdG9yeSc6CiAgICAgICAgICAgIHByb2Nlc3MuX3dvcmtpbmdEaXJlY3RvcnkgPT0gbnVsbCA/ICcuJyA6IHByb2Nlc3MuX3dvcmtpbmdEaXJlY3RvcnksCiAgICAgIH07CgogIHN0YXRpYyBQcm9jZXNzU3RhcnRlZChfUHJvY2Vzc1Jlc291cmNlSW5mbyBpbmZvKSB7CiAgICBhc3NlcnQoIXN0YXJ0ZWRQcm9jZXNzZXMuY29udGFpbnNLZXkoaW5mby5pZCkpOwogICAgc3RhcnRlZFByb2Nlc3Nlc1tpbmZvLmlkXSA9IGluZm87CiAgfQoKICBzdGF0aWMgUHJvY2Vzc1N0b3BwZWQoX1Byb2Nlc3NSZXNvdXJjZUluZm8gaW5mbykgewogICAgYXNzZXJ0KHN0YXJ0ZWRQcm9jZXNzZXMuY29udGFpbnNLZXkoaW5mby5pZCkpOwogICAgc3RhcnRlZFByb2Nlc3Nlcy5yZW1vdmUoaW5mby5pZCk7CiAgfQoKICBzdGF0aWMgSXRlcmFibGU8TWFwPFN0cmluZywgZHluYW1pYz4+IGdldFN0YXJ0ZWRQcm9jZXNzZXNMaXN0KCkgPT4KICAgICAgbmV3IExpc3QuZnJvbShzdGFydGVkUHJvY2Vzc2VzLnZhbHVlcy5tYXAoKGUpID0+IGUucmVmZXJlbmNlVmFsdWVNYXApKTsKCiAgc3RhdGljIEZ1dHVyZTxTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2U+IGdldFN0YXJ0ZWRQcm9jZXNzZXMoCiAgICAgIFN0cmluZyBmdW5jdGlvbiwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMpIHsKICAgIGFzc2VydChmdW5jdGlvbiA9PSAnZXh0LmRhcnQuaW8uZ2V0UHJvY2Vzc2VzJyk7CiAgICB2YXIgZGF0YSA9IHsndHlwZSc6ICdfc3RhcnRlZHByb2Nlc3NlcycsICdkYXRhJzogZ2V0U3RhcnRlZFByb2Nlc3Nlc0xpc3QoKX07CiAgICB2YXIganNvblZhbHVlID0ganNvbi5lbmNvZGUoZGF0YSk7CiAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZShuZXcgU2VydmljZUV4dGVuc2lvblJlc3BvbnNlLnJlc3VsdChqc29uVmFsdWUpKTsKICB9CgogIHN0YXRpYyBGdXR1cmU8U2VydmljZUV4dGVuc2lvblJlc3BvbnNlPiBnZXRQcm9jZXNzSW5mb01hcEJ5SWQoCiAgICAgIFN0cmluZyBmdW5jdGlvbiwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMpIHsKICAgIHZhciBpZCA9IGludC5wYXJzZShwYXJhbXNbJ2lkJ10pOwogICAgdmFyIHJlc3VsdCA9IHN0YXJ0ZWRQcm9jZXNzZXMuY29udGFpbnNLZXkoaWQpCiAgICAgICAgPyBzdGFydGVkUHJvY2Vzc2VzW2lkXS5mdWxsVmFsdWVNYXAKICAgICAgICA6IHt9OwogICAgdmFyIGpzb25WYWx1ZSA9IGpzb24uZW5jb2RlKHJlc3VsdCk7CiAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZShuZXcgU2VydmljZUV4dGVuc2lvblJlc3BvbnNlLnJlc3VsdChqc29uVmFsdWUpKTsKICB9Cn0KCmNsYXNzIF9Tb2NrZXRSZXNvdXJjZUluZm8gZXh0ZW5kcyBfUmVhZFdyaXRlUmVzb3VyY2VJbmZvIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIF90Y3BTdHJpbmcgPSAnVENQJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIF91ZHBTdHJpbmcgPSAnVURQJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIF90eXBlID0gJ19zb2NrZXQnOwoKICBmaW5hbCAvKl9OYXRpdmVTb2NrZXR8Ki8gc29ja2V0OwoKICBzdGF0aWMgTWFwPGludCwgX1NvY2tldFJlc291cmNlSW5mbz4gb3BlblNvY2tldHMgPQogICAgICBuZXcgTWFwPGludCwgX1NvY2tldFJlc291cmNlSW5mbz4oKTsKCiAgX1NvY2tldFJlc291cmNlSW5mbyh0aGlzLnNvY2tldCkgOiBzdXBlcihfdHlwZSkgewogICAgU29ja2V0T3BlbmVkKHRoaXMpOwogIH0KCiAgU3RyaW5nIGdldCBuYW1lIHsKICAgIGlmIChzb2NrZXQuaXNMaXN0ZW5pbmcpIHsKICAgICAgcmV0dXJuICdsaXN0ZW5pbmc6JHtzb2NrZXQuYWRkcmVzcy5ob3N0fToke3NvY2tldC5wb3J0fSc7CiAgICB9CiAgICB2YXIgcmVtb3RlID0gJyc7CiAgICB0cnkgewogICAgICB2YXIgcmVtb3RlSG9zdCA9IHNvY2tldC5yZW1vdGVBZGRyZXNzLmhvc3Q7CiAgICAgIHZhciByZW1vdGVQb3J0ID0gc29ja2V0LnJlbW90ZVBvcnQ7CiAgICAgIHJlbW90ZSA9ICcgLT4gJHJlbW90ZUhvc3Q6JHJlbW90ZVBvcnQnOwogICAgfSBjYXRjaCAoZSkge30gLy8gaWdub3JlZCBpZiB3ZSBjYW4ndCBnZXQgdGhlIGluZm9ybWF0aW9uCiAgICByZXR1cm4gJyR7c29ja2V0LmFkZHJlc3MuaG9zdH06JHtzb2NrZXQucG9ydH0kcmVtb3RlJzsKICB9CgogIHN0YXRpYyBJdGVyYWJsZTxNYXA8U3RyaW5nLCBkeW5hbWljPj4gZ2V0T3BlblNvY2tldHNMaXN0KCkgewogICAgcmV0dXJuIG5ldyBMaXN0LmZyb20ob3BlblNvY2tldHMudmFsdWVzLm1hcCgoZSkgPT4gZS5yZWZlcmVuY2VWYWx1ZU1hcCkpOwogIH0KCiAgTWFwPFN0cmluZywgZHluYW1pYz4gZ2V0U29ja2V0SW5mb01hcCgpIHsKICAgIHZhciByZXN1bHQgPSBmdWxsVmFsdWVNYXA7CiAgICByZXN1bHRbJ3NvY2tldFR5cGUnXSA9IHNvY2tldC5pc1RjcCA/IF90Y3BTdHJpbmcgOiBfdWRwU3RyaW5nOwogICAgcmVzdWx0WydsaXN0ZW5pbmcnXSA9IHNvY2tldC5pc0xpc3RlbmluZzsKICAgIHJlc3VsdFsnaG9zdCddID0gc29ja2V0LmFkZHJlc3MuaG9zdDsKICAgIHJlc3VsdFsncG9ydCddID0gc29ja2V0LnBvcnQ7CiAgICBpZiAoIXNvY2tldC5pc0xpc3RlbmluZykgewogICAgICB0cnkgewogICAgICAgIHJlc3VsdFsncmVtb3RlSG9zdCddID0gc29ja2V0LnJlbW90ZUFkZHJlc3MuaG9zdDsKICAgICAgICByZXN1bHRbJ3JlbW90ZVBvcnQnXSA9IHNvY2tldC5yZW1vdGVQb3J0OwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgLy8gVURQLgogICAgICAgIHJlc3VsdFsncmVtb3RlUG9ydCddID0gJ05BJzsKICAgICAgICByZXN1bHRbJ3JlbW90ZUhvc3QnXSA9ICdOQSc7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdFsncmVtb3RlUG9ydCddID0gJ05BJzsKICAgICAgcmVzdWx0WydyZW1vdGVIb3N0J10gPSAnTkEnOwogICAgfQogICAgcmVzdWx0WydhZGRyZXNzVHlwZSddID0gc29ja2V0LmFkZHJlc3MudHlwZS5uYW1lOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBGdXR1cmU8U2VydmljZUV4dGVuc2lvblJlc3BvbnNlPiBnZXRTb2NrZXRJbmZvTWFwQnlJRCgKICAgICAgU3RyaW5nIGZ1bmN0aW9uLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcykgewogICAgYXNzZXJ0KHBhcmFtcy5jb250YWluc0tleSgnaWQnKSk7CiAgICB2YXIgaWQgPSBpbnQucGFyc2UocGFyYW1zWydpZCddKTsKICAgIHZhciByZXN1bHQgPQogICAgICAgIG9wZW5Tb2NrZXRzLmNvbnRhaW5zS2V5KGlkKSA/IG9wZW5Tb2NrZXRzW2lkXS5nZXRTb2NrZXRJbmZvTWFwKCkgOiB7fTsKICAgIHZhciBqc29uVmFsdWUgPSBqc29uLmVuY29kZShyZXN1bHQpOwogICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUobmV3IFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZS5yZXN1bHQoanNvblZhbHVlKSk7CiAgfQoKICBzdGF0aWMgRnV0dXJlPFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZT4gZ2V0T3BlblNvY2tldHMoZnVuY3Rpb24sIHBhcmFtcykgewogICAgYXNzZXJ0KGZ1bmN0aW9uID09ICdleHQuZGFydC5pby5nZXRPcGVuU29ja2V0cycpOwogICAgdmFyIGRhdGEgPSB7J3R5cGUnOiAnX29wZW5zb2NrZXRzJywgJ2RhdGEnOiBnZXRPcGVuU29ja2V0c0xpc3QoKX07CiAgICB2YXIganNvblZhbHVlID0ganNvbi5lbmNvZGUoZGF0YSk7CiAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZShuZXcgU2VydmljZUV4dGVuc2lvblJlc3BvbnNlLnJlc3VsdChqc29uVmFsdWUpKTsKICB9CgogIHN0YXRpYyBTb2NrZXRPcGVuZWQoX1NvY2tldFJlc291cmNlSW5mbyBpbmZvKSB7CiAgICBhc3NlcnQoIW9wZW5Tb2NrZXRzLmNvbnRhaW5zS2V5KGluZm8uaWQpKTsKICAgIG9wZW5Tb2NrZXRzW2luZm8uaWRdID0gaW5mbzsKICB9CgogIHN0YXRpYyBTb2NrZXRDbG9zZWQoX1NvY2tldFJlc291cmNlSW5mbyBpbmZvKSB7CiAgICBhc3NlcnQob3BlblNvY2tldHMuY29udGFpbnNLZXkoaW5mby5pZCkpOwogICAgb3BlblNvY2tldHMucmVtb3ZlKGluZm8uaWQpOwogIH0KfQqBHABOTjwBEQEhFRATGQE5RwFOAUEBUTkpAUhOMk4aEhYJASYCAUARFBESExQBTU8pHBgRKgQBT1AaExAEAR0bEisEASYXGhcYGBkVAS0WEhYgJiAiHh8JAgE5JwEOATEpATAWBAEuLR8EAS4sHwQBPUwEAUs0QydNBAEqGQQBUSYmEUkpTQQBFBsEAgE1KhEaATssASUvFxoEASQBExoEAS0WEhYcICkcUQkBNTQmBAE1MyYEAUVOAT81NFEnTQQBQTUmMiwOKU0EAgE7KiopASMBNSsBNBgEARQeQAYVCjIqLj47BAE/TgQBLB9DLioiHww6MhQQJSUIDSMjBjYTBAFANSYmEU8pTQQBTTZHJ00EATIvIQQBMi4hBAIBHWRhcnQ6aW8vaW9fcmVzb3VyY2VfaW5mby5kYXJ0K29yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9pb19zaW5rLmRhcnSkXy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuaW87CgovKioKICogQSBjb21iaW5lZCBieXRlIGFuZCB0ZXh0IG91dHB1dC4KICoKICogQW4gW0lPU2lua10gY29tYmluZXMgYSBbU3RyZWFtU2lua10gb2YgYnl0ZXMgd2l0aCBhIFtTdHJpbmdTaW5rXSwKICogYW5kIGFsbG93cyBlYXN5IG91dHB1dCBvZiBib3RoIGJ5dGVzIGFuZCB0ZXh0LgogKgogKiBXcml0aW5nIHRleHQgKFt3cml0ZV0pIGFuZCBhZGRpbmcgYnl0ZXMgKFthZGRdKSBtYXkgYmUgaW50ZXJsZWF2ZWQgZnJlZWx5LgogKgogKiBXaGlsZSBhIHN0cmVhbSBpcyBiZWluZyBhZGRlZCB1c2luZyBbYWRkU3RyZWFtXSwgYW55IGZ1cnRoZXIgYXR0ZW1wdHMKICogdG8gYWRkIG9yIHdyaXRlIHRvIHRoZSBbSU9TaW5rXSB3aWxsIGZhaWwgdW50aWwgdGhlIFthZGRTdHJlYW1dIGNvbXBsZXRlcy4KICoKICogSXQgaXMgYW4gZXJyb3IgdG8gYWRkIGRhdGEgdG8gdGhlIFtJT1NpbmtdIGFmdGVyIHRoZSBzaW5rIGlzIGNsb3NlZC4KICovCmFic3RyYWN0IGNsYXNzIElPU2luayBpbXBsZW1lbnRzIFN0cmVhbVNpbms8TGlzdDxpbnQ+PiwgU3RyaW5nU2luayB7CiAgLyoqCiAgICogQ3JlYXRlIGFuIFtJT1NpbmtdIHRoYXQgb3V0cHV0cyB0byBhIFt0YXJnZXRdIFtTdHJlYW1Db25zdW1lcl0gb2YgYnl0ZXMuCiAgICoKICAgKiBUZXh0IHdyaXR0ZW4gdG8gW1N0cmVhbVNpbmtdIG1ldGhvZHMgaXMgZW5jb2RlZCB0byBieXRlcyB1c2luZyBbZW5jb2RpbmddCiAgICogYmVmb3JlIGJlaW5nIG91dHB1dCBvbiBbdGFyZ2V0XS4KICAgKi8KICBmYWN0b3J5IElPU2luayhTdHJlYW1Db25zdW1lcjxMaXN0PGludD4+IHRhcmdldCwge0VuY29kaW5nIGVuY29kaW5nOiB1dGY4fSkgPT4KICAgICAgbmV3IF9JT1NpbmtJbXBsKHRhcmdldCwgZW5jb2RpbmcpOwoKICAvKioKICAgKiBUaGUgW0VuY29kaW5nXSB1c2VkIHdoZW4gd3JpdGluZyBzdHJpbmdzLiBEZXBlbmRpbmcgb24gdGhlCiAgICogdW5kZXJseWluZyBjb25zdW1lciB0aGlzIHByb3BlcnR5IG1pZ2h0IGJlIG11dGFibGUuCiAgICovCiAgRW5jb2RpbmcgZW5jb2Rpbmc7CgogIC8qKgogICAqIEFkZHMgYnl0ZSBbZGF0YV0gdG8gdGhlIHRhcmdldCBjb25zdW1lciwgaWdub3JpbmcgW2VuY29kaW5nXS4KICAgKgogICAqIFRoZSBbZW5jb2RpbmddIGRvZXMgbm90IGFwcGx5IHRvIHRoaXMgbWV0aG9kLCBhbmQgdGhlIGBkYXRhYCBsaXN0IGlzIHBhc3NlZAogICAqIGRpcmVjdGx5IHRvIHRoZSB0YXJnZXQgY29uc3VtZXIgYXMgYSBzdHJlYW0gZXZlbnQuCiAgICoKICAgKiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCB3aGVuIGEgc3RyZWFtIGlzIGN1cnJlbnRseSBiZWluZyBhZGRlZAogICAqIHVzaW5nIFthZGRTdHJlYW1dLgogICAqCiAgICogVGhpcyBvcGVyYXRpb24gaXMgbm9uLWJsb2NraW5nLiBTZWUgW2ZsdXNoXSBvciBbZG9uZV0gZm9yIGhvdyB0byBnZXQgYW55CiAgICogZXJyb3JzIGdlbmVyYXRlZCBieSB0aGlzIGNhbGwuCiAgICoKICAgKiBUaGUgZGF0YSBsaXN0IHNob3VsZCBub3QgYmUgbW9kaWZpZWQgYWZ0ZXIgaXQgaGFzIGJlZW4gcGFzc2VkIHRvIGBhZGRgLgogICAqLwogIHZvaWQgYWRkKExpc3Q8aW50PiBkYXRhKTsKCiAgLyoqCiAgICogQ29udmVydHMgW29ial0gdG8gYSBTdHJpbmcgYnkgaW52b2tpbmcgW09iamVjdC50b1N0cmluZ10gYW5kCiAgICogW2FkZF1zIHRoZSBlbmNvZGluZyBvZiB0aGUgcmVzdWx0IHRvIHRoZSB0YXJnZXQgY29uc3VtZXIuCiAgICoKICAgKiBUaGlzIG9wZXJhdGlvbiBpcyBub24tYmxvY2tpbmcuIFNlZSBbZmx1c2hdIG9yIFtkb25lXSBmb3IgaG93IHRvIGdldCBhbnkKICAgKiBlcnJvcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgY2FsbC4KICAgKi8KICB2b2lkIHdyaXRlKE9iamVjdCBvYmopOwoKICAvKioKICAgKiBJdGVyYXRlcyBvdmVyIHRoZSBnaXZlbiBbb2JqZWN0c10gYW5kIFt3cml0ZV1zIHRoZW0gaW4gc2VxdWVuY2UuCiAgICoKICAgKiBJZiBbc2VwYXJhdG9yXSBpcyBwcm92aWRlZCwgYSBgd3JpdGVgIHdpdGggdGhlIGBzZXBhcmF0b3JgIGlzIHBlcmZvcm1lZAogICAqIGJldHdlZW4gYW55IHR3byBlbGVtZW50cyBvZiBvYmplY3RzYC4KICAgKgogICAqIFRoaXMgb3BlcmF0aW9uIGlzIG5vbi1ibG9ja2luZy4gU2VlIFtmbHVzaF0gb3IgW2RvbmVdIGZvciBob3cgdG8gZ2V0IGFueQogICAqIGVycm9ycyBnZW5lcmF0ZWQgYnkgdGhpcyBjYWxsLgogICAqLwogIHZvaWQgd3JpdGVBbGwoSXRlcmFibGUgb2JqZWN0cywgW1N0cmluZyBzZXBhcmF0b3IgPSAiIl0pOwoKICAvKioKICAgKiBDb252ZXJ0cyBbb2JqXSB0byBhIFN0cmluZyBieSBpbnZva2luZyBbT2JqZWN0LnRvU3RyaW5nXSBhbmQKICAgKiB3cml0ZXMgdGhlIHJlc3VsdCB0byBgdGhpc2AsIGZvbGxvd2VkIGJ5IGEgbmV3bGluZS4KICAgKgogICAqIFRoaXMgb3BlcmF0aW9uIGlzIG5vbi1ibG9ja2luZy4gU2VlIFtmbHVzaF0gb3IgW2RvbmVdIGZvciBob3cgdG8gZ2V0IGFueQogICAqIGVycm9ycyBnZW5lcmF0ZWQgYnkgdGhpcyBjYWxsLgogICAqLwogIHZvaWQgd3JpdGVsbihbT2JqZWN0IG9iaiA9ICIiXSk7CgogIC8qKgogICAqIFdyaXRlcyB0aGUgY2hhcmFjdGVyIG9mIFtjaGFyQ29kZV0uCiAgICoKICAgKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGB3cml0ZShuZXcgU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSkpYC4KICAgKgogICAqIFRoaXMgb3BlcmF0aW9uIGlzIG5vbi1ibG9ja2luZy4gU2VlIFtmbHVzaF0gb3IgW2RvbmVdIGZvciBob3cgdG8gZ2V0IGFueQogICAqIGVycm9ycyBnZW5lcmF0ZWQgYnkgdGhpcyBjYWxsLgogICAqLwogIHZvaWQgd3JpdGVDaGFyQ29kZShpbnQgY2hhckNvZGUpOwoKICAvKioKICAgKiBQYXNzZXMgdGhlIGVycm9yIHRvIHRoZSB0YXJnZXQgY29uc3VtZXIgYXMgYW4gZXJyb3IgZXZlbnQuCiAgICoKICAgKiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCB3aGVuIGEgc3RyZWFtIGlzIGN1cnJlbnRseSBiZWluZyBhZGRlZAogICAqIHVzaW5nIFthZGRTdHJlYW1dLgogICAqCiAgICogVGhpcyBvcGVyYXRpb24gaXMgbm9uLWJsb2NraW5nLiBTZWUgW2ZsdXNoXSBvciBbZG9uZV0gZm9yIGhvdyB0byBnZXQgYW55CiAgICogZXJyb3JzIGdlbmVyYXRlZCBieSB0aGlzIGNhbGwuCiAgICovCiAgdm9pZCBhZGRFcnJvcihlcnJvciwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pOwoKICAvKioKICAgKiBBZGRzIGFsbCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gW3N0cmVhbV0gdG8gYHRoaXNgLgogICAqCiAgICogUmV0dXJucyBhIFtGdXR1cmVdIHRoYXQgY29tcGxldGVzIHdoZW4KICAgKiBhbGwgZWxlbWVudHMgb2YgdGhlIGdpdmVuIFtzdHJlYW1dIGFyZSBhZGRlZCB0byBgdGhpc2AuCiAgICoKICAgKiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCB3aGVuIGEgc3RyZWFtIGlzIGN1cnJlbnRseSBiZWluZyBhZGRlZAogICAqIHVzaW5nIHRoaXMgZnVuY3Rpb24uCiAgICovCiAgRnV0dXJlIGFkZFN0cmVhbShTdHJlYW08TGlzdDxpbnQ+PiBzdHJlYW0pOwoKICAvKioKICAgKiBSZXR1cm5zIGEgW0Z1dHVyZV0gdGhhdCBjb21wbGV0ZXMgb25jZSBhbGwgYnVmZmVyZWQgZGF0YSBpcyBhY2NlcHRlZCBieSB0aGUKICAgKiB1bmRlcmx5aW5nIFtTdHJlYW1Db25zdW1lcl0uCiAgICoKICAgKiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBjYWxsZWQgd2hpbGUgYW4gW2FkZFN0cmVhbV0gaXMgaW5jb21wbGV0ZS4KICAgKgogICAqIE5PVEU6IFRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBkYXRhIGJlaW5nIGZsdXNoZWQgYnkgdGhlCiAgICogb3BlcmF0aW5nIHN5c3RlbS4KICAgKi8KICBGdXR1cmUgZmx1c2goKTsKCiAgLyoqCiAgICogQ2xvc2UgdGhlIHRhcmdldCBjb25zdW1lci4KICAgKgogICAqIE5PVEU6IFdyaXRlcyB0byB0aGUgW0lPU2lua10gbWF5IGJlIGJ1ZmZlcmVkLCBhbmQgbWF5IG5vdCBiZSBmbHVzaGVkIGJ5CiAgICogYSBjYWxsIHRvIGBjbG9zZSgpYC4gVG8gZmx1c2ggYWxsIGJ1ZmZlcmVkIHdyaXRlcywgY2FsbCBgZmx1c2goKWAgYmVmb3JlCiAgICogY2FsbGluZyBgY2xvc2UoKWAuCiAgICovCiAgRnV0dXJlIGNsb3NlKCk7CgogIC8qKgogICAqIEdldCBhIGZ1dHVyZSB0aGF0IHdpbGwgY29tcGxldGUgd2hlbiB0aGUgY29uc3VtZXIgY2xvc2VzLCBvciB3aGVuIGFuCiAgICogZXJyb3Igb2NjdXJzLiBUaGlzIGZ1dHVyZSBpcyBpZGVudGljYWwgdG8gdGhlIGZ1dHVyZSByZXR1cm5lZCBieQogICAqIFtjbG9zZV0uCiAgICovCiAgRnV0dXJlIGdldCBkb25lOwp9CgpjbGFzcyBfU3RyZWFtU2lua0ltcGw8VD4gaW1wbGVtZW50cyBTdHJlYW1TaW5rPFQ+IHsKICBmaW5hbCBTdHJlYW1Db25zdW1lcjxUPiBfdGFyZ2V0OwogIGZpbmFsIENvbXBsZXRlciBfZG9uZUNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXIoKTsKICBTdHJlYW1Db250cm9sbGVyPFQ+IF9jb250cm9sbGVySW5zdGFuY2U7CiAgQ29tcGxldGVyIF9jb250cm9sbGVyQ29tcGxldGVyOwogIGJvb2wgX2lzQ2xvc2VkID0gZmFsc2U7CiAgYm9vbCBfaXNCb3VuZCA9IGZhbHNlOwogIGJvb2wgX2hhc0Vycm9yID0gZmFsc2U7CgogIF9TdHJlYW1TaW5rSW1wbCh0aGlzLl90YXJnZXQpOwoKICB2b2lkIGFkZChUIGRhdGEpIHsKICAgIGlmIChfaXNDbG9zZWQpIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcigiU3RyZWFtU2luayBpcyBjbG9zZWQiKTsKICAgIH0KICAgIF9jb250cm9sbGVyLmFkZChkYXRhKTsKICB9CgogIHZvaWQgYWRkRXJyb3IoZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICBpZiAoX2lzQ2xvc2VkKSB7CiAgICAgIHRocm93IFN0YXRlRXJyb3IoIlN0cmVhbVNpbmsgaXMgY2xvc2VkIik7CiAgICB9CiAgICBfY29udHJvbGxlci5hZGRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQoKICBGdXR1cmUgYWRkU3RyZWFtKFN0cmVhbTxUPiBzdHJlYW0pIHsKICAgIGlmIChfaXNCb3VuZCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiU3RyZWFtU2luayBpcyBhbHJlYWR5IGJvdW5kIHRvIGEgc3RyZWFtIik7CiAgICB9CiAgICBpZiAoX2hhc0Vycm9yKSByZXR1cm4gZG9uZTsKCiAgICBfaXNCb3VuZCA9IHRydWU7CiAgICB2YXIgZnV0dXJlID0gX2NvbnRyb2xsZXJDb21wbGV0ZXIgPT0gbnVsbAogICAgICAgID8gX3RhcmdldC5hZGRTdHJlYW0oc3RyZWFtKQogICAgICAgIDogX2NvbnRyb2xsZXJDb21wbGV0ZXIuZnV0dXJlLnRoZW4oKF8pID0+IF90YXJnZXQuYWRkU3RyZWFtKHN0cmVhbSkpOwogICAgX2NvbnRyb2xsZXJJbnN0YW5jZT8uY2xvc2UoKTsKCiAgICAvLyBXYWl0IGZvciBhbnkgcGVuZGluZyBldmVudHMgaW4gW19jb250cm9sbGVyXSB0byBiZSBkaXNwYXRjaGVkIGJlZm9yZQogICAgLy8gYWRkaW5nIFtzdHJlYW1dLgogICAgcmV0dXJuIGZ1dHVyZS53aGVuQ29tcGxldGUoKCkgewogICAgICBfaXNCb3VuZCA9IGZhbHNlOwogICAgfSk7CiAgfQoKICBGdXR1cmUgZmx1c2goKSB7CiAgICBpZiAoX2lzQm91bmQpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIlN0cmVhbVNpbmsgaXMgYm91bmQgdG8gYSBzdHJlYW0iKTsKICAgIH0KICAgIGlmIChfY29udHJvbGxlckluc3RhbmNlID09IG51bGwpIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKHRoaXMpOwogICAgLy8gQWRkaW5nIGFuIGVtcHR5IHN0cmVhbS1jb250cm9sbGVyIHdpbGwgcmV0dXJuIGEgZnV0dXJlIHRoYXQgd2lsbCBjb21wbGV0ZQogICAgLy8gd2hlbiBhbGwgZGF0YSBpcyBkb25lLgogICAgX2lzQm91bmQgPSB0cnVlOwogICAgdmFyIGZ1dHVyZSA9IF9jb250cm9sbGVyQ29tcGxldGVyLmZ1dHVyZTsKICAgIF9jb250cm9sbGVySW5zdGFuY2UuY2xvc2UoKTsKICAgIHJldHVybiBmdXR1cmUud2hlbkNvbXBsZXRlKCgpIHsKICAgICAgX2lzQm91bmQgPSBmYWxzZTsKICAgIH0pOwogIH0KCiAgRnV0dXJlIGNsb3NlKCkgewogICAgaWYgKF9pc0JvdW5kKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJTdHJlYW1TaW5rIGlzIGJvdW5kIHRvIGEgc3RyZWFtIik7CiAgICB9CiAgICBpZiAoIV9pc0Nsb3NlZCkgewogICAgICBfaXNDbG9zZWQgPSB0cnVlOwogICAgICBpZiAoX2NvbnRyb2xsZXJJbnN0YW5jZSAhPSBudWxsKSB7CiAgICAgICAgX2NvbnRyb2xsZXJJbnN0YW5jZS5jbG9zZSgpOwogICAgICB9IGVsc2UgewogICAgICAgIF9jbG9zZVRhcmdldCgpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZG9uZTsKICB9CgogIHZvaWQgX2Nsb3NlVGFyZ2V0KCkgewogICAgX3RhcmdldC5jbG9zZSgpLnRoZW4oX2NvbXBsZXRlRG9uZVZhbHVlLCBvbkVycm9yOiBfY29tcGxldGVEb25lRXJyb3IpOwogIH0KCiAgRnV0dXJlIGdldCBkb25lID0+IF9kb25lQ29tcGxldGVyLmZ1dHVyZTsKCiAgdm9pZCBfY29tcGxldGVEb25lVmFsdWUodmFsdWUpIHsKICAgIGlmICghX2RvbmVDb21wbGV0ZXIuaXNDb21wbGV0ZWQpIHsKICAgICAgX2RvbmVDb21wbGV0ZXIuY29tcGxldGUodmFsdWUpOwogICAgfQogIH0KCiAgdm9pZCBfY29tcGxldGVEb25lRXJyb3IoZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgaWYgKCFfZG9uZUNvbXBsZXRlci5pc0NvbXBsZXRlZCkgewogICAgICBfaGFzRXJyb3IgPSB0cnVlOwogICAgICBfZG9uZUNvbXBsZXRlci5jb21wbGV0ZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgIH0KICB9CgogIFN0cmVhbUNvbnRyb2xsZXI8VD4gZ2V0IF9jb250cm9sbGVyIHsKICAgIGlmIChfaXNCb3VuZCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiU3RyZWFtU2luayBpcyBib3VuZCB0byBhIHN0cmVhbSIpOwogICAgfQogICAgaWYgKF9pc0Nsb3NlZCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiU3RyZWFtU2luayBpcyBjbG9zZWQiKTsKICAgIH0KICAgIGlmIChfY29udHJvbGxlckluc3RhbmNlID09IG51bGwpIHsKICAgICAgX2NvbnRyb2xsZXJJbnN0YW5jZSA9IG5ldyBTdHJlYW1Db250cm9sbGVyPFQ+KHN5bmM6IHRydWUpOwogICAgICBfY29udHJvbGxlckNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXIoKTsKICAgICAgX3RhcmdldC5hZGRTdHJlYW0oX2NvbnRyb2xsZXIuc3RyZWFtKS50aGVuKChfKSB7CiAgICAgICAgaWYgKF9pc0JvdW5kKSB7CiAgICAgICAgICAvLyBBIG5ldyBzdHJlYW0gdGFrZXMgb3ZlciAtIGZvcndhcmQgdmFsdWVzIHRvIHRoYXQgc3RyZWFtLgogICAgICAgICAgX2NvbnRyb2xsZXJDb21wbGV0ZXIuY29tcGxldGUodGhpcyk7CiAgICAgICAgICBfY29udHJvbGxlckNvbXBsZXRlciA9IG51bGw7CiAgICAgICAgICBfY29udHJvbGxlckluc3RhbmNlID0gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gTm8gbmV3IHN0cmVhbSwgLmNsb3NlIHdhcyBjYWxsZWQuIENsb3NlIF90YXJnZXQuCiAgICAgICAgICBfY2xvc2VUYXJnZXQoKTsKICAgICAgICB9CiAgICAgIH0sIG9uRXJyb3I6IChlcnJvciwgc3RhY2tUcmFjZSkgewogICAgICAgIGlmIChfaXNCb3VuZCkgewogICAgICAgICAgLy8gQSBuZXcgc3RyZWFtIHRha2VzIG92ZXIgLSBmb3J3YXJkIGVycm9ycyB0byB0aGF0IHN0cmVhbS4KICAgICAgICAgIF9jb250cm9sbGVyQ29tcGxldGVyLmNvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICAgICAgX2NvbnRyb2xsZXJDb21wbGV0ZXIgPSBudWxsOwogICAgICAgICAgX2NvbnRyb2xsZXJJbnN0YW5jZSA9IG51bGw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIE5vIG5ldyBzdHJlYW0uIE5vIG5lZWQgdG8gY2xvc2UgdGFyZ2V0LCBhcyBpdCBoYXMgYWxyZWFkeQogICAgICAgICAgLy8gZmFpbGVkLgogICAgICAgICAgX2NvbXBsZXRlRG9uZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIF9jb250cm9sbGVySW5zdGFuY2U7CiAgfQp9CgpjbGFzcyBfSU9TaW5rSW1wbCBleHRlbmRzIF9TdHJlYW1TaW5rSW1wbDxMaXN0PGludD4+IGltcGxlbWVudHMgSU9TaW5rIHsKICBFbmNvZGluZyBfZW5jb2Rpbmc7CiAgYm9vbCBfZW5jb2RpbmdNdXRhYmxlID0gdHJ1ZTsKCiAgX0lPU2lua0ltcGwoU3RyZWFtQ29uc3VtZXI8TGlzdDxpbnQ+PiB0YXJnZXQsIHRoaXMuX2VuY29kaW5nKSA6IHN1cGVyKHRhcmdldCk7CgogIEVuY29kaW5nIGdldCBlbmNvZGluZyA9PiBfZW5jb2Rpbmc7CgogIHZvaWQgc2V0IGVuY29kaW5nKEVuY29kaW5nIHZhbHVlKSB7CiAgICBpZiAoIV9lbmNvZGluZ011dGFibGUpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIklPU2luayBlbmNvZGluZyBpcyBub3QgbXV0YWJsZSIpOwogICAgfQogICAgX2VuY29kaW5nID0gdmFsdWU7CiAgfQoKICB2b2lkIHdyaXRlKE9iamVjdCBvYmopIHsKICAgIFN0cmluZyBzdHJpbmcgPSAnJG9iaic7CiAgICBpZiAoc3RyaW5nLmlzRW1wdHkpIHJldHVybjsKICAgIGFkZChfZW5jb2RpbmcuZW5jb2RlKHN0cmluZykpOwogIH0KCiAgdm9pZCB3cml0ZUFsbChJdGVyYWJsZSBvYmplY3RzLCBbU3RyaW5nIHNlcGFyYXRvciA9ICIiXSkgewogICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBvYmplY3RzLml0ZXJhdG9yOwogICAgaWYgKCFpdGVyYXRvci5tb3ZlTmV4dCgpKSByZXR1cm47CiAgICBpZiAoc2VwYXJhdG9yLmlzRW1wdHkpIHsKICAgICAgZG8gewogICAgICAgIHdyaXRlKGl0ZXJhdG9yLmN1cnJlbnQpOwogICAgICB9IHdoaWxlIChpdGVyYXRvci5tb3ZlTmV4dCgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlKGl0ZXJhdG9yLmN1cnJlbnQpOwogICAgICB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICAgIHdyaXRlKHNlcGFyYXRvcik7CiAgICAgICAgd3JpdGUoaXRlcmF0b3IuY3VycmVudCk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgd3JpdGVsbihbT2JqZWN0IG9iamVjdCA9ICIiXSkgewogICAgd3JpdGUob2JqZWN0KTsKICAgIHdyaXRlKCJcbiIpOwogIH0KCiAgdm9pZCB3cml0ZUNoYXJDb2RlKGludCBjaGFyQ29kZSkgewogICAgd3JpdGUobmV3IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpKTsKICB9Cn0KgT4ATk48AREBBCQDRTIDTgNJTgNIBEUGTgVPJgZRKQEGQDkGFQEGQwVROAVNGAVOJAVNBhwBBkI/BU4kBhoBBkYFTSsFTiQGPAEGQjkFTiQGIwEGKQVOBU4kBiQBBkAFTRgFTiQGMQEGOAUsPQVNGgYuAQZRIgVIBU0XBhIBBiAFTU4YBhIBBkpGDgYTAgE0IzQrIhoZGgEhARUVMAYbBAEyFTAGLQQBJxRHBiABFS4kTiIBTBgkGAgEARMUPwZEUR4VLiEkGAgEARMUPwYWGCklDxgIBhEEARhLBAEsASMnJgYEATonGDcGBAEoFD8GFTQGJ0EuNxhGLycmET4aCigYRkEnJhFHFTEKCgYgBAIBSRYgAVEBJgEmHT4GFwQBGxwgIwQBPSomHQshJQ0fJBohCAYEAScTEQQBJS4EAgEUZGFydDppby9pb19zaW5rLmRhcnQub3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2lvL2lvX3NlcnZpY2UuZGFydIgnLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCmNsYXNzIF9JT1NlcnZpY2UgewogIC8vIFRoaXMgbGlzdCBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBsaXN0IGluIHJ1bnRpbWUvYmluL2lvX3NlcnZpY2UuaAogIHN0YXRpYyBjb25zdCBpbnQgZmlsZUV4aXN0cyA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlQ3JlYXRlID0gMTsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVEZWxldGUgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZVJlbmFtZSA9IDM7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlQ29weSA9IDQ7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlT3BlbiA9IDU7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlUmVzb2x2ZVN5bWJvbGljTGlua3MgPSA2OwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZUNsb3NlID0gNzsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVQb3NpdGlvbiA9IDg7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlU2V0UG9zaXRpb24gPSA5OwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZVRydW5jYXRlID0gMTA7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlTGVuZ3RoID0gMTE7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlTGVuZ3RoRnJvbVBhdGggPSAxMjsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVMYXN0QWNjZXNzZWQgPSAxMzsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVTZXRMYXN0QWNjZXNzZWQgPSAxNDsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVMYXN0TW9kaWZpZWQgPSAxNTsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVTZXRMYXN0TW9kaWZpZWQgPSAxNjsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVGbHVzaCA9IDE3OwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZVJlYWRCeXRlID0gMTg7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlV3JpdGVCeXRlID0gMTk7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlUmVhZCA9IDIwOwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZVJlYWRJbnRvID0gMjE7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlV3JpdGVGcm9tID0gMjI7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlQ3JlYXRlTGluayA9IDIzOwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZURlbGV0ZUxpbmsgPSAyNDsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVSZW5hbWVMaW5rID0gMjU7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlTGlua1RhcmdldCA9IDI2OwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZVR5cGUgPSAyNzsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVJZGVudGljYWwgPSAyODsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVTdGF0ID0gMjk7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlTG9jayA9IDMwOwogIHN0YXRpYyBjb25zdCBpbnQgc29ja2V0TG9va3VwID0gMzE7CiAgc3RhdGljIGNvbnN0IGludCBzb2NrZXRMaXN0SW50ZXJmYWNlcyA9IDMyOwogIHN0YXRpYyBjb25zdCBpbnQgc29ja2V0UmV2ZXJzZUxvb2t1cCA9IDMzOwogIHN0YXRpYyBjb25zdCBpbnQgZGlyZWN0b3J5Q3JlYXRlID0gMzQ7CiAgc3RhdGljIGNvbnN0IGludCBkaXJlY3RvcnlEZWxldGUgPSAzNTsKICBzdGF0aWMgY29uc3QgaW50IGRpcmVjdG9yeUV4aXN0cyA9IDM2OwogIHN0YXRpYyBjb25zdCBpbnQgZGlyZWN0b3J5Q3JlYXRlVGVtcCA9IDM3OwogIHN0YXRpYyBjb25zdCBpbnQgZGlyZWN0b3J5TGlzdFN0YXJ0ID0gMzg7CiAgc3RhdGljIGNvbnN0IGludCBkaXJlY3RvcnlMaXN0TmV4dCA9IDM5OwogIHN0YXRpYyBjb25zdCBpbnQgZGlyZWN0b3J5TGlzdFN0b3AgPSA0MDsKICBzdGF0aWMgY29uc3QgaW50IGRpcmVjdG9yeVJlbmFtZSA9IDQxOwogIHN0YXRpYyBjb25zdCBpbnQgc3NsUHJvY2Vzc0ZpbHRlciA9IDQyOwoKICBleHRlcm5hbCBzdGF0aWMgRnV0dXJlIF9kaXNwYXRjaChpbnQgcmVxdWVzdCwgTGlzdCBkYXRhKTsKfQo4AE5OPAERARNOIyMjIyEhMSIlKCYkLCotKi0jJiciJicoKCgoIiciIiYuLSkpKS0sKyspKgE8AgEXZGFydDppby9pb19zZXJ2aWNlLmRhcnQob3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2lvL2xpbmsuZGFydKgjLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCi8qKgogKiBbTGlua10gb2JqZWN0cyBhcmUgcmVmZXJlbmNlcyB0byBmaWxlc3lzdGVtIGxpbmtzLgogKgogKi8KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQphYnN0cmFjdCBjbGFzcyBMaW5rIGltcGxlbWVudHMgRmlsZVN5c3RlbUVudGl0eSB7CiAgLyoqCiAgICogQ3JlYXRlcyBhIExpbmsgb2JqZWN0LgogICAqLwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBmYWN0b3J5IExpbmsoU3RyaW5nIHBhdGgpIHsKICAgIGZpbmFsIElPT3ZlcnJpZGVzIG92ZXJyaWRlcyA9IElPT3ZlcnJpZGVzLmN1cnJlbnQ7CiAgICBpZiAob3ZlcnJpZGVzID09IG51bGwpIHsKICAgICAgcmV0dXJuIG5ldyBfTGluayhwYXRoKTsKICAgIH0KICAgIHJldHVybiBvdmVycmlkZXMuY3JlYXRlTGluayhwYXRoKTsKICB9CgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBmYWN0b3J5IExpbmsuZnJvbVJhd1BhdGgoVWludDhMaXN0IHJhd1BhdGgpIHsKICAgIC8vIFRPRE8oYmtvbnlpKTogaGFuZGxlIG92ZXJyaWRlcwogICAgcmV0dXJuIG5ldyBfTGluay5mcm9tUmF3UGF0aChyYXdQYXRoKTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBbTGlua10gb2JqZWN0LgogICAqCiAgICogSWYgW3BhdGhdIGlzIGEgcmVsYXRpdmUgcGF0aCwgaXQgd2lsbCBiZSBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUKICAgKiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IChzZWUgW0RpcmVjdG9yeS5jdXJyZW50XSksIHdoZW4gdXNlZC4KICAgKgogICAqIElmIFtwYXRoXSBpcyBhbiBhYnNvbHV0ZSBwYXRoLCBpdCB3aWxsIGJlIGltbXVuZSB0byBjaGFuZ2VzIHRvIHRoZQogICAqIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCiAgICovCiAgZmFjdG9yeSBMaW5rLmZyb21VcmkoVXJpIHVyaSkgPT4gbmV3IExpbmsodXJpLnRvRmlsZVBhdGgoKSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBzeW1ib2xpYyBsaW5rLiBSZXR1cm5zIGEgWzpGdXR1cmU8TGluaz46XSB0aGF0IGNvbXBsZXRlcyB3aXRoCiAgICogdGhlIGxpbmsgd2hlbiBpdCBoYXMgYmVlbiBjcmVhdGVkLiBJZiB0aGUgbGluayBleGlzdHMsCiAgICogdGhlIGZ1dHVyZSB3aWxsIGNvbXBsZXRlIHdpdGggYW4gZXJyb3IuCiAgICoKICAgKiBJZiBbcmVjdXJzaXZlXSBpcyBmYWxzZSwgdGhlIGRlZmF1bHQsIHRoZSBsaW5rIGlzIGNyZWF0ZWQKICAgKiBvbmx5IGlmIGFsbCBkaXJlY3RvcmllcyBpbiBpdHMgcGF0aCBleGlzdC4KICAgKiBJZiBbcmVjdXJzaXZlXSBpcyB0cnVlLCBhbGwgbm9uLWV4aXN0aW5nIHBhdGgKICAgKiBjb21wb25lbnRzIGFyZSBjcmVhdGVkLiBUaGUgZGlyZWN0b3JpZXMgaW4gdGhlIHBhdGggb2YgW3RhcmdldF0gYXJlCiAgICogbm90IGFmZmVjdGVkLCB1bmxlc3MgdGhleSBhcmUgYWxzbyBpbiBbcGF0aF0uCiAgICoKICAgKiBPbiB0aGUgV2luZG93cyBwbGF0Zm9ybSwgdGhpcyBjYWxsIHdpbGwgY3JlYXRlIGEgdHJ1ZSBzeW1ib2xpYyBsaW5rCiAgICogaW5zdGVhZCBvZiBhIEp1bmN0aW9uLiBJbiBvcmRlciB0byBjcmVhdGUgYSBzeW1ib2xpYyBsaW5rIG9uIFdpbmRvd3MsIERhcnQKICAgKiBtdXN0IGJlIHJ1biBpbiBBZG1pbmlzdHJhdG9yIG1vZGUgb3IgdGhlIHN5c3RlbSBtdXN0IGhhdmUgRGV2ZWxvcGVyIE1vZGUKICAgKiBlbmFibGVkLCBvdGhlcndpc2UgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gd2lsbCBiZSByYWlzZWQgd2l0aCAKICAgKiBgRVJST1JfUFJJVklMRUdFX05PVF9IRUxEYCBzZXQgYXMgdGhlIGVycm5vIHdoZW4gdGhpcyBjYWxsIGlzIG1hZGUuCiAgICoKICAgKiBPbiBvdGhlciBwbGF0Zm9ybXMsIHRoZSBwb3NpeCBzeW1saW5rKCkgY2FsbCBpcyB1c2VkIHRvIG1ha2UgYSBzeW1ib2xpYwogICAqIGxpbmsgY29udGFpbmluZyB0aGUgc3RyaW5nIFt0YXJnZXRdLiAgSWYgW3RhcmdldF0gaXMgYSByZWxhdGl2ZSBwYXRoLAogICAqIGl0IHdpbGwgYmUgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBsaW5rLgogICAqLwogIEZ1dHVyZTxMaW5rPiBjcmVhdGUoU3RyaW5nIHRhcmdldCwge2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IGNyZWF0ZSB0aGUgbGluay4gQ2FsbGluZyBbY3JlYXRlU3luY10gb24gYW4gZXhpc3RpbmcgbGluawogICAqIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLgogICAqCiAgICogSWYgW3JlY3Vyc2l2ZV0gaXMgZmFsc2UsIHRoZSBkZWZhdWx0LCB0aGUgbGluayBpcyBjcmVhdGVkIG9ubHkgaWYgYWxsCiAgICogZGlyZWN0b3JpZXMgaW4gaXRzIHBhdGggZXhpc3QuIElmIFtyZWN1cnNpdmVdIGlzIHRydWUsIGFsbAogICAqIG5vbi1leGlzdGluZyBwYXRoIGNvbXBvbmVudHMgYXJlIGNyZWF0ZWQuIFRoZSBkaXJlY3RvcmllcyBpbgogICAqIHRoZSBwYXRoIG9mIFt0YXJnZXRdIGFyZSBub3QgYWZmZWN0ZWQsIHVubGVzcyB0aGV5IGFyZSBhbHNvIGluIFtwYXRoXS4KICAgKgogICAqIE9uIHRoZSBXaW5kb3dzIHBsYXRmb3JtLCB0aGlzIGNhbGwgd2lsbCBjcmVhdGUgYSB0cnVlIHN5bWJvbGljIGxpbmsKICAgKiBpbnN0ZWFkIG9mIGEgSnVuY3Rpb24uIEluIG9yZGVyIHRvIGNyZWF0ZSBhIHN5bWJvbGljIGxpbmsgb24gV2luZG93cywgRGFydAogICAqIG11c3QgYmUgcnVuIGluIEFkbWluaXN0cmF0b3IgbW9kZSBvciB0aGUgc3lzdGVtIG11c3QgaGF2ZSBEZXZlbG9wZXIgTW9kZQogICAqIGVuYWJsZWQsIG90aGVyd2lzZSBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSB3aWxsIGJlIHJhaXNlZCB3aXRoIAogICAqIGBFUlJPUl9QUklWSUxFR0VfTk9UX0hFTERgIHNldCBhcyB0aGUgZXJybm8gd2hlbiB0aGlzIGNhbGwgaXMgbWFkZS4KICAgKgogICAqIE9uIG90aGVyIHBsYXRmb3JtcywgdGhlIHBvc2l4IHN5bWxpbmsoKSBjYWxsIGlzIHVzZWQgdG8gbWFrZSBhIHN5bWJvbGljCiAgICogbGluayBjb250YWluaW5nIHRoZSBzdHJpbmcgW3RhcmdldF0uICBJZiBbdGFyZ2V0XSBpcyBhIHJlbGF0aXZlIHBhdGgsCiAgICogaXQgd2lsbCBiZSBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGxpbmsuCiAgICovCiAgdm9pZCBjcmVhdGVTeW5jKFN0cmluZyB0YXJnZXQsIHtib29sIHJlY3Vyc2l2ZTogZmFsc2V9KTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSB1cGRhdGVzIHRoZSBsaW5rLiBDYWxsaW5nIFt1cGRhdGVTeW5jXSBvbiBhIG5vbi1leGlzdGluZyBsaW5rCiAgICogd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uCiAgICovCiAgdm9pZCB1cGRhdGVTeW5jKFN0cmluZyB0YXJnZXQpOwoKICAvKioKICAgKiBVcGRhdGVzIHRoZSBsaW5rLiBSZXR1cm5zIGEgWzpGdXR1cmU8TGluaz46XSB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoZQogICAqIGxpbmsgd2hlbiBpdCBoYXMgYmVlbiB1cGRhdGVkLiAgQ2FsbGluZyBbdXBkYXRlXSBvbiBhIG5vbi1leGlzdGluZyBsaW5rCiAgICogd2lsbCBjb21wbGV0ZSBpdHMgcmV0dXJuZWQgZnV0dXJlIHdpdGggYW4gZXhjZXB0aW9uLgogICAqLwogIEZ1dHVyZTxMaW5rPiB1cGRhdGUoU3RyaW5nIHRhcmdldCk7CgogIEZ1dHVyZTxTdHJpbmc+IHJlc29sdmVTeW1ib2xpY0xpbmtzKCk7CgogIFN0cmluZyByZXNvbHZlU3ltYm9saWNMaW5rc1N5bmMoKTsKCiAgLyoqCiAgICogUmVuYW1lcyB0aGlzIGxpbmsuIFJldHVybnMgYSBgRnV0dXJlPExpbms+YCB0aGF0IGNvbXBsZXRlcwogICAqIHdpdGggYSBbTGlua10gaW5zdGFuY2UgZm9yIHRoZSByZW5hbWVkIGxpbmsuCiAgICoKICAgKiBJZiBbbmV3UGF0aF0gaWRlbnRpZmllcyBhbiBleGlzdGluZyBsaW5rLCB0aGF0IGxpbmsgaXMKICAgKiByZXBsYWNlZC4gSWYgW25ld1BhdGhdIGlkZW50aWZpZXMgYW4gZXhpc3RpbmcgZmlsZSBvciBkaXJlY3RvcnksCiAgICogdGhlIG9wZXJhdGlvbiBmYWlscyBhbmQgdGhlIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCBhbiBleGNlcHRpb24uCiAgICovCiAgRnV0dXJlPExpbms+IHJlbmFtZShTdHJpbmcgbmV3UGF0aCk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgcmVuYW1lcyB0aGlzIGxpbmsuIFJldHVybnMgYSBbTGlua10KICAgKiBpbnN0YW5jZSBmb3IgdGhlIHJlbmFtZWQgbGluay4KICAgKgogICAqIElmIFtuZXdQYXRoXSBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIGxpbmssIHRoYXQgbGluayBpcwogICAqIHJlcGxhY2VkLiBJZiBbbmV3UGF0aF0gaWRlbnRpZmllcyBhbiBleGlzdGluZyBmaWxlIG9yIGRpcmVjdG9yeQogICAqIHRoZSBvcGVyYXRpb24gZmFpbHMgYW5kIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICovCiAgTGluayByZW5hbWVTeW5jKFN0cmluZyBuZXdQYXRoKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIFtMaW5rXSBpbnN0YW5jZSB3aG9zZSBwYXRoIGlzIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIFt0aGlzXS4KICAgKgogICAqIFRoZSBhYnNvbHV0ZSBwYXRoIGlzIGNvbXB1dGVkIGJ5IHByZWZpeGluZwogICAqIGEgcmVsYXRpdmUgcGF0aCB3aXRoIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgcmV0dXJuaW5nCiAgICogYW4gYWJzb2x1dGUgcGF0aCB1bmNoYW5nZWQuCiAgICovCiAgTGluayBnZXQgYWJzb2x1dGU7CgogIC8qKgogICAqIEdldHMgdGhlIHRhcmdldCBvZiB0aGUgbGluay4gUmV0dXJucyBhIGZ1dHVyZSB0aGF0IGNvbXBsZXRlcyB3aXRoCiAgICogdGhlIHBhdGggdG8gdGhlIHRhcmdldC4KICAgKgogICAqIElmIHRoZSByZXR1cm5lZCB0YXJnZXQgaXMgYSByZWxhdGl2ZSBwYXRoLCBpdCBpcyByZWxhdGl2ZSB0byB0aGUKICAgKiBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgbGluay4KICAgKgogICAqIElmIHRoZSBsaW5rIGRvZXMgbm90IGV4aXN0LCBvciBpcyBub3QgYSBsaW5rLCB0aGUgZnV0dXJlIGNvbXBsZXRlcyB3aXRoCiAgICogYSBGaWxlU3lzdGVtRXhjZXB0aW9uLgogICAqLwogIEZ1dHVyZTxTdHJpbmc+IHRhcmdldCgpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IGdldHMgdGhlIHRhcmdldCBvZiB0aGUgbGluay4gUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgdGFyZ2V0LgogICAqCiAgICogSWYgdGhlIHJldHVybmVkIHRhcmdldCBpcyBhIHJlbGF0aXZlIHBhdGgsIGl0IGlzIHJlbGF0aXZlIHRvIHRoZQogICAqIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBsaW5rLgogICAqCiAgICogSWYgdGhlIGxpbmsgZG9lcyBub3QgZXhpc3QsIG9yIGlzIG5vdCBhIGxpbmssIHRocm93cyBhIEZpbGVTeXN0ZW1FeGNlcHRpb24uCiAgICovCiAgU3RyaW5nIHRhcmdldFN5bmMoKTsKfQoKY2xhc3MgX0xpbmsgZXh0ZW5kcyBGaWxlU3lzdGVtRW50aXR5IGltcGxlbWVudHMgTGluayB7CiAgU3RyaW5nIF9wYXRoOwogIFVpbnQ4TGlzdCBfcmF3UGF0aDsKCiAgX0xpbmsoU3RyaW5nIHBhdGgpIHsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKHBhdGgsICdwYXRoJyk7CiAgICBfcGF0aCA9IHBhdGg7CiAgICBfcmF3UGF0aCA9IEZpbGVTeXN0ZW1FbnRpdHkuX3RvVXRmOEFycmF5KHBhdGgpOwogIH0KCiAgX0xpbmsuZnJvbVJhd1BhdGgoVWludDhMaXN0IHJhd1BhdGgpIHsKICAgIF9yYXdQYXRoID0gRmlsZVN5c3RlbUVudGl0eS5fdG9OdWxsVGVybWluYXRlZFV0ZjhBcnJheShyYXdQYXRoKTsKICAgIF9wYXRoID0gRmlsZVN5c3RlbUVudGl0eS5fdG9TdHJpbmdGcm9tVXRmOEFycmF5KHJhd1BhdGgpOwogIH0KCiAgU3RyaW5nIGdldCBwYXRoID0+IF9wYXRoOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiTGluazogJyRwYXRoJyI7CgogIEZ1dHVyZTxib29sPiBleGlzdHMoKSA9PiBGaWxlU3lzdGVtRW50aXR5Ll9pc0xpbmtSYXcoX3Jhd1BhdGgpOwoKICBib29sIGV4aXN0c1N5bmMoKSA9PiBGaWxlU3lzdGVtRW50aXR5Ll9pc0xpbmtSYXdTeW5jKF9yYXdQYXRoKTsKCiAgTGluayBnZXQgYWJzb2x1dGUgPT4gbmV3IExpbmsuZnJvbVJhd1BhdGgoX3Jhd0Fic29sdXRlUGF0aCk7CgogIEZ1dHVyZTxMaW5rPiBjcmVhdGUoU3RyaW5nIHRhcmdldCwge2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pIHsKICAgIHZhciByZXN1bHQgPQogICAgICAgIHJlY3Vyc2l2ZSA/IHBhcmVudC5jcmVhdGUocmVjdXJzaXZlOiB0cnVlKSA6IG5ldyBGdXR1cmUudmFsdWUobnVsbCk7CiAgICByZXR1cm4gcmVzdWx0CiAgICAgICAgLnRoZW4oKF8pID0+IF9GaWxlLl9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoCiAgICAgICAgICAgIF9JT1NlcnZpY2UuZmlsZUNyZWF0ZUxpbmssIFtudWxsLCBfcmF3UGF0aCwgdGFyZ2V0XSkpCiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UoCiAgICAgICAgICAgIHJlc3BvbnNlLCAiQ2Fubm90IGNyZWF0ZSBsaW5rIHRvIHRhcmdldCAnJHRhcmdldCciLCBwYXRoKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0pOwogIH0KCiAgdm9pZCBjcmVhdGVTeW5jKFN0cmluZyB0YXJnZXQsIHtib29sIHJlY3Vyc2l2ZTogZmFsc2V9KSB7CiAgICBpZiAocmVjdXJzaXZlKSB7CiAgICAgIHBhcmVudC5jcmVhdGVTeW5jKHJlY3Vyc2l2ZTogdHJ1ZSk7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gX0ZpbGUuX2NyZWF0ZUxpbmsoX05hbWVzcGFjZS5fbmFtZXNwYWNlLCBfcmF3UGF0aCwgdGFyZ2V0KTsKICAgIHRocm93SWZFcnJvcihyZXN1bHQsICJDYW5ub3QgY3JlYXRlIGxpbmsiLCBwYXRoKTsKICB9CgogIHZvaWQgdXBkYXRlU3luYyhTdHJpbmcgdGFyZ2V0KSB7CiAgICAvLyBUT0RPKDEyNDE0KTogUmVwbGFjZSB3aXRoIGF0b21pYyB1cGRhdGUsIHdoZXJlIHN1cHBvcnRlZCBieSBwbGF0Zm9ybS4KICAgIC8vIEF0b21pY2FsbHkgY2hhbmdpbmcgYSBsaW5rIGNhbiBiZSBkb25lIGJ5IGNyZWF0aW5nIHRoZSBuZXcgbGluaywgd2l0aAogICAgLy8gYSBkaWZmZXJlbnQgbmFtZSwgYW5kIHVzaW5nIHRoZSByZW5hbWUoKSBwb3NpeCBjYWxsIHRvIG1vdmUgaXQgdG8KICAgIC8vIHRoZSBvbGQgbmFtZSBhdG9taWNhbGx5LgogICAgZGVsZXRlU3luYygpOwogICAgY3JlYXRlU3luYyh0YXJnZXQpOwogIH0KCiAgRnV0dXJlPExpbms+IHVwZGF0ZShTdHJpbmcgdGFyZ2V0KSB7CiAgICAvLyBUT0RPKDEyNDE0KTogUmVwbGFjZSB3aXRoIGF0b21pYyB1cGRhdGUsIHdoZXJlIHN1cHBvcnRlZCBieSBwbGF0Zm9ybS4KICAgIC8vIEF0b21pY2FsbHkgY2hhbmdpbmcgYSBsaW5rIGNhbiBiZSBkb25lIGJ5IGNyZWF0aW5nIHRoZSBuZXcgbGluaywgd2l0aAogICAgLy8gYSBkaWZmZXJlbnQgbmFtZSwgYW5kIHVzaW5nIHRoZSByZW5hbWUoKSBwb3NpeCBjYWxsIHRvIG1vdmUgaXQgdG8KICAgIC8vIHRoZSBvbGQgbmFtZSBhdG9taWNhbGx5LgogICAgcmV0dXJuIGRlbGV0ZSgpLnRoZW48TGluaz4oKF8pID0+IGNyZWF0ZSh0YXJnZXQpKTsKICB9CgogIEZ1dHVyZTxMaW5rPiBfZGVsZXRlKHtib29sIHJlY3Vyc2l2ZTogZmFsc2V9KSB7CiAgICBpZiAocmVjdXJzaXZlKSB7CiAgICAgIHJldHVybiBuZXcgRGlyZWN0b3J5LmZyb21SYXdQYXRoKF9yYXdQYXRoKQogICAgICAgICAgLmRlbGV0ZShyZWN1cnNpdmU6IHRydWUpCiAgICAgICAgICAudGhlbigoXykgPT4gdGhpcyk7CiAgICB9CiAgICByZXR1cm4gX0ZpbGUuX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZSgKICAgICAgICBfSU9TZXJ2aWNlLmZpbGVEZWxldGVMaW5rLCBbbnVsbCwgX3Jhd1BhdGhdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKHJlc3BvbnNlLCAiQ2Fubm90IGRlbGV0ZSBsaW5rIiwgcGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KTsKICB9CgogIHZvaWQgX2RlbGV0ZVN5bmMoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pIHsKICAgIGlmIChyZWN1cnNpdmUpIHsKICAgICAgcmV0dXJuIG5ldyBEaXJlY3RvcnkuZnJvbVJhd1BhdGgoX3Jhd1BhdGgpLmRlbGV0ZVN5bmMocmVjdXJzaXZlOiB0cnVlKTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBfRmlsZS5fZGVsZXRlTGlua05hdGl2ZShfTmFtZXNwYWNlLl9uYW1lc3BhY2UsIF9yYXdQYXRoKTsKICAgIHRocm93SWZFcnJvcihyZXN1bHQsICJDYW5ub3QgZGVsZXRlIGxpbmsiLCBwYXRoKTsKICB9CgogIEZ1dHVyZTxMaW5rPiByZW5hbWUoU3RyaW5nIG5ld1BhdGgpIHsKICAgIHJldHVybiBfRmlsZS5fZGlzcGF0Y2hXaXRoTmFtZXNwYWNlKAogICAgICAgIF9JT1NlcnZpY2UuZmlsZVJlbmFtZUxpbmssIFtudWxsLCBfcmF3UGF0aCwgbmV3UGF0aF0pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UoCiAgICAgICAgICAgIHJlc3BvbnNlLCAiQ2Fubm90IHJlbmFtZSBsaW5rIHRvICckbmV3UGF0aCciLCBwYXRoKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IExpbmsobmV3UGF0aCk7CiAgICB9KTsKICB9CgogIExpbmsgcmVuYW1lU3luYyhTdHJpbmcgbmV3UGF0aCkgewogICAgdmFyIHJlc3VsdCA9IF9GaWxlLl9yZW5hbWVMaW5rKF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgsIG5ld1BhdGgpOwogICAgdGhyb3dJZkVycm9yKHJlc3VsdCwgIkNhbm5vdCByZW5hbWUgbGluayAnJHBhdGgnIHRvICckbmV3UGF0aCciKTsKICAgIHJldHVybiBuZXcgTGluayhuZXdQYXRoKTsKICB9CgogIEZ1dHVyZTxTdHJpbmc+IHRhcmdldCgpIHsKICAgIHJldHVybiBfRmlsZS5fZGlzcGF0Y2hXaXRoTmFtZXNwYWNlKAogICAgICAgIF9JT1NlcnZpY2UuZmlsZUxpbmtUYXJnZXQsIFtudWxsLCBfcmF3UGF0aF0pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UoCiAgICAgICAgICAgIHJlc3BvbnNlLCAiQ2Fubm90IGdldCB0YXJnZXQgb2YgbGluayIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiByZXNwb25zZTsKICAgIH0pOwogIH0KCiAgU3RyaW5nIHRhcmdldFN5bmMoKSB7CiAgICB2YXIgcmVzdWx0ID0gX0ZpbGUuX2xpbmtUYXJnZXQoX05hbWVzcGFjZS5fbmFtZXNwYWNlLCBfcmF3UGF0aCk7CiAgICB0aHJvd0lmRXJyb3IocmVzdWx0LCAiQ2Fubm90IHJlYWQgbGluayIsIHBhdGgpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyB0aHJvd0lmRXJyb3IoT2JqZWN0IHJlc3VsdCwgU3RyaW5nIG1zZywgW1N0cmluZyBwYXRoID0gIiJdKSB7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24obXNnLCBwYXRoLCByZXN1bHQpOwogICAgfQogIH0KCiAgYm9vbCBfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSB7CiAgICByZXR1cm4gcmVzcG9uc2UgaXMgTGlzdCAmJiByZXNwb25zZVswXSAhPSBfc3VjY2Vzc1Jlc3BvbnNlOwogIH0KCiAgX2V4Y2VwdGlvbkZyb21SZXNwb25zZShyZXNwb25zZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBwYXRoKSB7CiAgICBhc3NlcnQoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpOwogICAgc3dpdGNoIChyZXNwb25zZVtfZXJyb3JSZXNwb25zZUVycm9yVHlwZV0pIHsKICAgICAgY2FzZSBfaWxsZWdhbEFyZ3VtZW50UmVzcG9uc2U6CiAgICAgICAgcmV0dXJuIG5ldyBBcmd1bWVudEVycm9yKCk7CiAgICAgIGNhc2UgX29zRXJyb3JSZXNwb25zZToKICAgICAgICB2YXIgZXJyID0gbmV3IE9TRXJyb3IocmVzcG9uc2VbX29zRXJyb3JSZXNwb25zZU1lc3NhZ2VdLAogICAgICAgICAgICByZXNwb25zZVtfb3NFcnJvclJlc3BvbnNlRXJyb3JDb2RlXSk7CiAgICAgICAgcmV0dXJuIG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKG1lc3NhZ2UsIHBhdGgsIGVycik7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIG5ldyBFeGNlcHRpb24oIlVua25vd24gZXJyb3IiKTsKICAgIH0KICB9Cn0KgS4ATk48AREBBDYDBBoyBhwGHB43HR4GJwQBHDAmKwQBBh4FSkUFSCAGPwEGTTwtBT8wM0kzBUlQTkVJBU1LSwY/AQZNHgVLQEJMBUlQTkVJBU1LSwY7AQZRHgYiAQZKTToGJgEpASUBBkAyBTxGRQYnAQY3JAU8RTUGIwEGSgUwRyEGFQEGRx0FRiQFTRwGGwEGUAVGJAVRBhcCATcQFgEXLhI0BAEpRT4EARwBKAFCAUIBPwFAEU0SM0IbKCZHCBMIBAE8FSoGTTYEASNNTUkgEhgEASdNTUkgNwQBMhUxIx4GKUcoTAgTCAQBLhVOBks2BAEoKVAoJkEIIAgEASRORh4EARwpRygmOggXCAQBGEU0EwQBRx04BgQBJEAEAUIoMSUkHUEyPA8vBgQCARFkYXJ0OmlvL2xpbmsuZGFydDJvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vbmFtZXNwYWNlX2ltcGwuZGFydIR+Ly8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCi8vIEVhY2ggSXNvbGF0ZSBtYXkgcnVuIGluIGEgZGlmZmVyZW50ICJuYW1lc3BhY2UiLCB3aGljaCBwcm92aWRlcyB0aGUgc2NvcGUgaW4KLy8gd2hpY2ggZmlsZSBwYXRocyBhcmUgcmVzb2x2ZWQuCmFic3RyYWN0IGNsYXNzIF9OYW1lc3BhY2UgewogIC8vIFRoaXMgZ2V0dGVyIGRvZXMgbm90IGluY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnQgb24gdGhlIHVuZGVybHlpbmcgbmF0aXZlCiAgLy8gb2JqZWN0LiBJdCBjYW5ub3QgYmUgcGFzc2VkIGluIGEgZGlzcGF0Y2ggbWVzc2FnZSB0byB0aGUgSU9TZXJ2aWNlIHRocmVhZC4KICBleHRlcm5hbCBzdGF0aWMgX05hbWVzcGFjZSBnZXQgX25hbWVzcGFjZTsKCiAgLy8gVGhpcyBnZXR0ZXIgZG9lcyBpbmNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIHRoZSB1bmRlcmx5aW5nIG5hdGl2ZQogIC8vIG9iamVjdC4gSXQgbXVzdCBiZSBwYXNzZWQgaW4gYSBkaXNwYXRjaCBtZXNzYWdlIHRvIHRoZSBJT1NlcnZpY2UgdGhyZWFkLgogIGV4dGVybmFsIHN0YXRpYyBpbnQgZ2V0IF9uYW1lc3BhY2VQb2ludGVyOwoKICAvLyBUaGlzIHNldHMgdXAgdGhlIElzb2xhdGUncyBuYW1lc3BhY2UuIEl0IHNob3VsZCBiZSBzZXQgdXAgYnkgdGhlIGVtYmVkZGVyLgogIC8vIElmIGl0IGlzIG5vdCBzZXQgdXAgYnkgdGhlIGVtYmVkZGVyLCByZWxhdGl2ZSBwYXRocyB3aWxsIGJlIHJlc29sdmVkCiAgLy8gcmVsYXRpdmUgdG8gdGhlIHByb2Nlc3MncyBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBhYnNvbHV0ZSBwYXRocyB3aWxsCiAgLy8gYmUgbGVmdCByZWxhdGl2ZSB0byB0aGUgZmlsZSBzeXN0ZW0gcm9vdC4KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgZXh0ZXJuYWwgc3RhdGljIHZvaWQgX3NldHVwTmFtZXNwYWNlKHZhciBuYW1lc3BhY2UpOwp9ChoATk48AREBUCIcUFAtAUxOLQFQSlEvHDcCARtkYXJ0OmlvL25hbWVzcGFjZV9pbXBsLmRhcnQtb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2lvL292ZXJyaWRlcy5kYXJ0uqUvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmlvOwoKZmluYWwgX2lvT3ZlcnJpZGVzVG9rZW4gPSBuZXcgT2JqZWN0KCk7Cgpjb25zdCBfYXN5bmNSdW5ab25lZCA9IHJ1blpvbmVkOwoKLy8vIFRoaXMgY2xhc3MgZmFjaWxpdGF0ZXMgb3ZlcnJpZGluZyB2YXJpb3VzIEFQSXMgb2YgZGFydDppbyB3aXRoIG1vY2sKLy8vIGltcGxlbWVudGF0aW9ucy4KLy8vCi8vLyBUaGlzIGFic3RyYWN0IGJhc2UgY2xhc3Mgc2hvdWxkIGJlIGV4dGVuZGVkIHdpdGggb3ZlcnJpZGVzIGZvciB0aGUKLy8vIG9wZXJhdGlvbnMgbmVlZGVkIHRvIGNvbnN0cnVjdCBtb2Nrcy4gVGhlIGltcGxlbWVudGF0aW9ucyBpbiB0aGlzIGJhc2UgY2xhc3MKLy8vIGRlZmF1bHQgdG8gdGhlIGFjdHVhbCBkYXJ0OmlvIGltcGxlbWVudGF0aW9uLiBGb3IgZXhhbXBsZToKLy8vCi8vLyBgYGAKLy8vIGNsYXNzIE15RGlyZWN0b3J5IGltcGxlbWVudHMgRGlyZWN0b3J5IHsKLy8vICAgLi4uCi8vLyAgIC8vIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBEaXJlY3RvcnkgaW50ZXJmYWNlCi8vLyAgIC4uLgovLy8gfQovLy8KLy8vIG1haW4oKSB7Ci8vLyAgIElPT3ZlcnJpZGVzLnJ1blpvbmVkKCgpIHsKLy8vICAgICAuLi4KLy8vICAgICAvLyBPcGVyYXRpb25zIHdpbGwgdXNlIE15RGlyZWN0b3J5IGluc3RlYWQgb2YgZGFydDppbydzIERpcmVjdG9yeQovLy8gICAgIC8vIGltcGxlbWVudGF0aW9uIHdoZW5ldmVyIERpcmVjdG9yeSBpcyB1c2VkLgovLy8gICAgIC4uLgovLy8gICB9LCBjcmVhdGVEaXJlY3Rvcnk6IChTdHJpbmcgcGF0aCkgPT4gbmV3IE15RGlyZWN0b3J5KHBhdGgpKTsKLy8vIH0KLy8vIGBgYAphYnN0cmFjdCBjbGFzcyBJT092ZXJyaWRlcyB7CiAgc3RhdGljIElPT3ZlcnJpZGVzIF9nbG9iYWw7CgogIHN0YXRpYyBJT092ZXJyaWRlcyBnZXQgY3VycmVudCB7CiAgICByZXR1cm4gWm9uZS5jdXJyZW50W19pb092ZXJyaWRlc1Rva2VuXSA/PyBfZ2xvYmFsOwogIH0KCiAgLy8vIFRoZSBbSU9PdmVycmlkZXNdIHRvIHVzZSBpbiB0aGUgcm9vdCBbWm9uZV0uCiAgLy8vCiAgLy8vIFRoZXNlIGFyZSB0aGUgW0lPT3ZlcnJpZGVzXSB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgcm9vdCBab25lLCBhbmQgaW4KICAvLy8gWm9uZSdzIHRoYXQgZG8gbm90IHNldCBbSU9PdmVycmlkZXNdIGFuZCB3aG9zZSBhbmNlc3RvcnMgdXAgdG8gdGhlIHJvb3QKICAvLy8gWm9uZSBkbyBub3Qgc2V0IFtJT092ZXJyaWRlc10uCiAgc3RhdGljIHNldCBnbG9iYWwoSU9PdmVycmlkZXMgb3ZlcnJpZGVzKSB7CiAgICBfZ2xvYmFsID0gb3ZlcnJpZGVzOwogIH0KCiAgLy8vIFJ1bnMgW2JvZHldIGluIGEgZnJlc2ggW1pvbmVdIHVzaW5nIHRoZSBwcm92aWRlZCBvdmVycmlkZXMuCiAgLy8vCiAgLy8vIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvbiB0aGUgY29ycmVzcG9uZGluZyBtZXRob2RzIG9mIElPT3ZlcnJpZGVzIGZvcgogIC8vLyBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHRoZSBvcHRpb25hbCBhcmd1bWVudHMgZG8uCiAgc3RhdGljIFIgcnVuWm9uZWQ8Uj4oUiBib2R5KCksCiAgICAgIHsKICAgICAgLy8gRGlyZWN0b3J5CiAgICAgIERpcmVjdG9yeSBGdW5jdGlvbihTdHJpbmcpIGNyZWF0ZURpcmVjdG9yeSwKICAgICAgRGlyZWN0b3J5IEZ1bmN0aW9uKCkgZ2V0Q3VycmVudERpcmVjdG9yeSwKICAgICAgdm9pZCBGdW5jdGlvbihTdHJpbmcpIHNldEN1cnJlbnREaXJlY3RvcnksCiAgICAgIERpcmVjdG9yeSBGdW5jdGlvbigpIGdldFN5c3RlbVRlbXBEaXJlY3RvcnksCgogICAgICAvLyBGaWxlCiAgICAgIEZpbGUgRnVuY3Rpb24oU3RyaW5nKSBjcmVhdGVGaWxlLAoKICAgICAgLy8gRmlsZVN0YXQKICAgICAgRnV0dXJlPEZpbGVTdGF0PiBGdW5jdGlvbihTdHJpbmcpIHN0YXQsCiAgICAgIEZpbGVTdGF0IEZ1bmN0aW9uKFN0cmluZykgc3RhdFN5bmMsCgogICAgICAvLyBGaWxlU3lzdGVtRW50aXR5CiAgICAgIEZ1dHVyZTxib29sPiBGdW5jdGlvbihTdHJpbmcsIFN0cmluZykgZnNlSWRlbnRpY2FsLAogICAgICBib29sIEZ1bmN0aW9uKFN0cmluZywgU3RyaW5nKSBmc2VJZGVudGljYWxTeW5jLAogICAgICBGdXR1cmU8RmlsZVN5c3RlbUVudGl0eVR5cGU+IEZ1bmN0aW9uKFN0cmluZywgYm9vbCkgZnNlR2V0VHlwZSwKICAgICAgRmlsZVN5c3RlbUVudGl0eVR5cGUgRnVuY3Rpb24oU3RyaW5nLCBib29sKSBmc2VHZXRUeXBlU3luYywKCiAgICAgIC8vIF9GaWxlU3lzdGVtV2F0Y2hlcgogICAgICBTdHJlYW08RmlsZVN5c3RlbUV2ZW50PiBGdW5jdGlvbihTdHJpbmcsIGludCwgYm9vbCkgZnNXYXRjaCwKICAgICAgYm9vbCBGdW5jdGlvbigpIGZzV2F0Y2hJc1N1cHBvcnRlZCwKCiAgICAgIC8vIExpbmsKICAgICAgTGluayBGdW5jdGlvbihTdHJpbmcpIGNyZWF0ZUxpbmssCgogICAgICAvLyBTb2NrZXQKICAgICAgRnV0dXJlPFNvY2tldD4gRnVuY3Rpb24oZHluYW1pYywgaW50LAogICAgICAgICAgICAgIHtkeW5hbWljIHNvdXJjZUFkZHJlc3MsIER1cmF0aW9uIHRpbWVvdXR9KQogICAgICAgICAgc29ja2V0Q29ubmVjdCwKICAgICAgRnV0dXJlPENvbm5lY3Rpb25UYXNrPFNvY2tldD4+IEZ1bmN0aW9uKGR5bmFtaWMsIGludCwKICAgICAgICAgICAgICB7ZHluYW1pYyBzb3VyY2VBZGRyZXNzfSkKICAgICAgICAgIHNvY2tldFN0YXJ0Q29ubmVjdCwKCiAgICAgIC8vIE9wdGlvbmFsIFpvbmUgcGFyYW1ldGVycwogICAgICBab25lU3BlY2lmaWNhdGlvbiB6b25lU3BlY2lmaWNhdGlvbiwKICAgICAgRnVuY3Rpb24gb25FcnJvcn0pIHsKICAgIElPT3ZlcnJpZGVzIG92ZXJyaWRlcyA9IG5ldyBfSU9PdmVycmlkZXNTY29wZSgKICAgICAgLy8gRGlyZWN0b3J5CiAgICAgIGNyZWF0ZURpcmVjdG9yeSwKICAgICAgZ2V0Q3VycmVudERpcmVjdG9yeSwKICAgICAgc2V0Q3VycmVudERpcmVjdG9yeSwKICAgICAgZ2V0U3lzdGVtVGVtcERpcmVjdG9yeSwKCiAgICAgIC8vIEZpbGUKICAgICAgY3JlYXRlRmlsZSwKCiAgICAgIC8vIEZpbGVTdGF0CiAgICAgIHN0YXQsCiAgICAgIHN0YXRTeW5jLAoKICAgICAgLy8gRmlsZVN5c3RlbUVudGl0eQogICAgICBmc2VJZGVudGljYWwsCiAgICAgIGZzZUlkZW50aWNhbFN5bmMsCiAgICAgIGZzZUdldFR5cGUsCiAgICAgIGZzZUdldFR5cGVTeW5jLAoKICAgICAgLy8gX0ZpbGVTeXN0ZW1XYXRjaGVyCiAgICAgIGZzV2F0Y2gsCiAgICAgIGZzV2F0Y2hJc1N1cHBvcnRlZCwKCiAgICAgIC8vIExpbmsKICAgICAgY3JlYXRlTGluaywKCiAgICAgIC8vIFNvY2tldAogICAgICBzb2NrZXRDb25uZWN0LAogICAgICBzb2NrZXRTdGFydENvbm5lY3QsCiAgICApOwogICAgcmV0dXJuIF9hc3luY1J1blpvbmVkPFI+KGJvZHksCiAgICAgICAgem9uZVZhbHVlczoge19pb092ZXJyaWRlc1Rva2VuOiBvdmVycmlkZXN9LAogICAgICAgIHpvbmVTcGVjaWZpY2F0aW9uOiB6b25lU3BlY2lmaWNhdGlvbiwKICAgICAgICBvbkVycm9yOiBvbkVycm9yKTsKICB9CgogIC8vLyBSdW5zIFtib2R5XSBpbiBhIGZyZXNoIFtab25lXSB1c2luZyB0aGUgb3ZlcnJpZGVzIGZvdW5kIGluIFtvdmVycmlkZXNdLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgW292ZXJyaWRlc10gc2hvdWxkIGJlIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBleHRlbmRzCiAgLy8vIFtJT092ZXJyaWRlc10uCiAgc3RhdGljIFIgcnVuV2l0aElPT3ZlcnJpZGVzPFI+KFIgYm9keSgpLCBJT092ZXJyaWRlcyBvdmVycmlkZXMsCiAgICAgIHtab25lU3BlY2lmaWNhdGlvbiB6b25lU3BlY2lmaWNhdGlvbiwgRnVuY3Rpb24gb25FcnJvcn0pIHsKICAgIHJldHVybiBfYXN5bmNSdW5ab25lZDxSPihib2R5LAogICAgICAgIHpvbmVWYWx1ZXM6IHtfaW9PdmVycmlkZXNUb2tlbjogb3ZlcnJpZGVzfSwKICAgICAgICB6b25lU3BlY2lmaWNhdGlvbjogem9uZVNwZWNpZmljYXRpb24sCiAgICAgICAgb25FcnJvcjogb25FcnJvcik7CiAgfQoKICAvLyBEaXJlY3RvcnkKCiAgLy8vIENyZWF0ZXMgYSBuZXcgW0RpcmVjdG9yeV0gb2JqZWN0IGZvciB0aGUgZ2l2ZW4gW3BhdGhdLgogIC8vLwogIC8vLyBXaGVuIHRoaXMgb3ZlcnJpZGUgaXMgaW5zdGFsbGVkLCB0aGlzIGZ1bmN0aW9uIG92ZXJyaWRlcyB0aGUgYmVoYXZpb3Igb2YKICAvLy8gYG5ldyBEaXJlY3RvcnkoKWAgYW5kIGBuZXcgRGlyZWN0b3J5LmZyb21VcmkoKWAuCiAgRGlyZWN0b3J5IGNyZWF0ZURpcmVjdG9yeShTdHJpbmcgcGF0aCkgPT4gbmV3IF9EaXJlY3RvcnkocGF0aCk7CgogIC8vLyBSZXR1cm5zIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgogIC8vLwogIC8vLyBXaGVuIHRoaXMgb3ZlcnJpZGUgaXMgaW5zdGFsbGVkLCB0aGlzIGZ1bmN0aW9uIG92ZXJyaWRlcyB0aGUgYmVoYXZpb3Igb2YKICAvLy8gdGhlIHN0YXRpYyBnZXR0ZXIgYERpcmVjdG9yeS5jdXJyZW50YAogIERpcmVjdG9yeSBnZXRDdXJyZW50RGlyZWN0b3J5KCkgPT4gX0RpcmVjdG9yeS5jdXJyZW50OwoKICAvLy8gU2V0cyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSB0byBiZSBbcGF0aF0uCiAgLy8vCiAgLy8vIFdoZW4gdGhpcyBvdmVycmlkZSBpcyBpbnN0YWxsZWQsIHRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBiZWhhdmlvciBvZgogIC8vLyB0aGUgc2V0dGVyIGBEaXJlY3RvcnkuY3VycmVudGAuCiAgdm9pZCBzZXRDdXJyZW50RGlyZWN0b3J5KFN0cmluZyBwYXRoKSB7CiAgICBfRGlyZWN0b3J5LmN1cnJlbnQgPSBwYXRoOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHN5c3RlbSB0ZW1wb3JhcnkgZGlyZWN0b3J5LgogIC8vLwogIC8vLyBXaGVuIHRoaXMgb3ZlcnJpZGUgaXMgaW5zdGFsbGVkLCB0aGlzIGZ1bmN0aW9uIG92ZXJyaWRlcyB0aGUgYmVoYXZpb3Igb2YKICAvLy8gYERpcmVjdG9yeS5zeXN0ZW1UZW1wYC4KICBEaXJlY3RvcnkgZ2V0U3lzdGVtVGVtcERpcmVjdG9yeSgpID0+IF9EaXJlY3Rvcnkuc3lzdGVtVGVtcDsKCiAgLy8gRmlsZQoKICAvLy8gQ3JlYXRlcyBhIG5ldyBbRmlsZV0gb2JqZWN0IGZvciB0aGUgZ2l2ZW4gW3BhdGhdLgogIC8vLwogIC8vLyBXaGVuIHRoaXMgb3ZlcnJpZGUgaXMgaW5zdGFsbGVkLCB0aGlzIGZ1bmN0aW9uIG92ZXJyaWRlcyB0aGUgYmVoYXZpb3Igb2YKICAvLy8gYG5ldyBGaWxlKClgIGFuZCBgbmV3IEZpbGUuZnJvbVVyaSgpYC4KICBGaWxlIGNyZWF0ZUZpbGUoU3RyaW5nIHBhdGgpID0+IG5ldyBfRmlsZShwYXRoKTsKCiAgLy8gRmlsZVN0YXQKCiAgLy8vIEFzeW5jaHJvbm91c2x5IHJldHVybnMgW0ZpbGVTdGF0XSBpbmZvcm1hdGlvbiBmb3IgW3BhdGhdLgogIC8vLwogIC8vLyBXaGVuIHRoaXMgb3ZlcnJpZGUgaXMgaW5zdGFsbGVkLCB0aGlzIGZ1bmN0aW9uIG92ZXJyaWRlcyB0aGUgYmVoYXZpb3Igb2YKICAvLy8gYEZpbGVTdGF0LnN0YXQoKWAuCiAgRnV0dXJlPEZpbGVTdGF0PiBzdGF0KFN0cmluZyBwYXRoKSB7CiAgICByZXR1cm4gRmlsZVN0YXQuX3N0YXQocGF0aCk7CiAgfQoKICAvLy8gUmV0dXJucyBbRmlsZVN0YXRdIGluZm9ybWF0aW9uIGZvciBbcGF0aF0uCiAgLy8vCiAgLy8vIFdoZW4gdGhpcyBvdmVycmlkZSBpcyBpbnN0YWxsZWQsIHRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBiZWhhdmlvciBvZgogIC8vLyBgRmlsZVN0YXQuc3RhdFN5bmMoKWAuCiAgRmlsZVN0YXQgc3RhdFN5bmMoU3RyaW5nIHBhdGgpIHsKICAgIHJldHVybiBGaWxlU3RhdC5fc3RhdFN5bmNJbnRlcm5hbChwYXRoKTsKICB9CgogIC8vIEZpbGVTeXN0ZW1FbnRpdHkKCiAgLy8vIEFzeW5jaHJvbm91c2x5IHJldHVybnMgYHRydWVgIGlmIFtwYXRoMV0gYW5kIFtwYXRoMl0gYXJlIHBhdGhzIHRvIHRoZQogIC8vLyBzYW1lIGZpbGUgc3lzdGVtIG9iamVjdC4KICAvLy8KICAvLy8gV2hlbiB0aGlzIG92ZXJyaWRlIGlzIGluc3RhbGxlZCwgdGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgdGhlIGJlaGF2aW9yIG9mCiAgLy8vIGBGaWxlU3lzdGVtRW50aXR5LmlkZW50aWNhbGAuCiAgRnV0dXJlPGJvb2w+IGZzZUlkZW50aWNhbChTdHJpbmcgcGF0aDEsIFN0cmluZyBwYXRoMikgewogICAgcmV0dXJuIEZpbGVTeXN0ZW1FbnRpdHkuX2lkZW50aWNhbChwYXRoMSwgcGF0aDIpOwogIH0KCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtwYXRoMV0gYW5kIFtwYXRoMl0gYXJlIHBhdGhzIHRvIHRoZQogIC8vLyBzYW1lIGZpbGUgc3lzdGVtIG9iamVjdC4KICAvLy8KICAvLy8gV2hlbiB0aGlzIG92ZXJyaWRlIGlzIGluc3RhbGxlZCwgdGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgdGhlIGJlaGF2aW9yIG9mCiAgLy8vIGBGaWxlU3lzdGVtRW50aXR5LmlkZW50aWNhbFN5bmNgLgogIGJvb2wgZnNlSWRlbnRpY2FsU3luYyhTdHJpbmcgcGF0aDEsIFN0cmluZyBwYXRoMikgewogICAgcmV0dXJuIEZpbGVTeXN0ZW1FbnRpdHkuX2lkZW50aWNhbFN5bmMocGF0aDEsIHBhdGgyKTsKICB9CgogIC8vLyBBc3luY2hyb25vdXNseSByZXR1cm5zIHRoZSBbRmlsZVN5c3RlbUVudGl0eVR5cGVdIGZvciBbcGF0aF0uCiAgLy8vCiAgLy8vIFdoZW4gdGhpcyBvdmVycmlkZSBpcyBpbnN0YWxsZWQsIHRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBiZWhhdmlvciBvZgogIC8vLyBgRmlsZVN5c3RlbUVudGl0eS50eXBlYC4KICBGdXR1cmU8RmlsZVN5c3RlbUVudGl0eVR5cGU+IGZzZUdldFR5cGUoU3RyaW5nIHBhdGgsIGJvb2wgZm9sbG93TGlua3MpIHsKICAgIHJldHVybiBGaWxlU3lzdGVtRW50aXR5Ll9nZXRUeXBlUmVxdWVzdCh1dGY4LmVuY29kZShwYXRoKSwgZm9sbG93TGlua3MpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIFtGaWxlU3lzdGVtRW50aXR5VHlwZV0gZm9yIFtwYXRoXS4KICAvLy8KICAvLy8gV2hlbiB0aGlzIG92ZXJyaWRlIGlzIGluc3RhbGxlZCwgdGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgdGhlIGJlaGF2aW9yIG9mCiAgLy8vIGBGaWxlU3lzdGVtRW50aXR5LnR5cGVTeW5jYC4KICBGaWxlU3lzdGVtRW50aXR5VHlwZSBmc2VHZXRUeXBlU3luYyhTdHJpbmcgcGF0aCwgYm9vbCBmb2xsb3dMaW5rcykgewogICAgcmV0dXJuIEZpbGVTeXN0ZW1FbnRpdHkuX2dldFR5cGVTeW5jSGVscGVyKHV0ZjguZW5jb2RlKHBhdGgpLCBmb2xsb3dMaW5rcyk7CiAgfQoKICAvLyBfRmlsZVN5c3RlbVdhdGNoZXIKCiAgLy8vIFJldHVybnMgYSBbU3RyZWFtXSBvZiBbRmlsZVN5c3RlbUV2ZW50XXMuCiAgLy8vCiAgLy8vIFdoZW4gdGhpcyBvdmVycmlkZSBpcyBpbnN0YWxsZWQsIHRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBiZWhhdmlvciBvZgogIC8vLyBgRmlsZVN5c3RlbUVudGl0eS53YXRjaCgpYC4KICBTdHJlYW08RmlsZVN5c3RlbUV2ZW50PiBmc1dhdGNoKFN0cmluZyBwYXRoLCBpbnQgZXZlbnRzLCBib29sIHJlY3Vyc2l2ZSkgewogICAgcmV0dXJuIF9GaWxlU3lzdGVtV2F0Y2hlci5fd2F0Y2gocGF0aCwgZXZlbnRzLCByZWN1cnNpdmUpOwogIH0KCiAgLy8vIFJldHVybnMgYHRydWVgIHdoZW4gW0ZpbGVTeXN0ZW1FbnRpdHkud2F0Y2hdIGlzIHN1cHBvcnRlZC4KICAvLy8KICAvLy8gV2hlbiB0aGlzIG92ZXJyaWRlIGlzIGluc3RhbGxlZCwgdGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgdGhlIGJlaGF2aW9yIG9mCiAgLy8vIGBGaWxlU3lzdGVtRW50aXR5LmlzV2F0Y2hTdXBwb3J0ZWRgLgogIGJvb2wgZnNXYXRjaElzU3VwcG9ydGVkKCkgPT4gX0ZpbGVTeXN0ZW1XYXRjaGVyLmlzU3VwcG9ydGVkOwoKICAvLyBMaW5rCgogIC8vLyBSZXR1cm5zIGEgbmV3IFtMaW5rXSBvYmplY3QgZm9yIHRoZSBnaXZlbiBbcGF0aF0uCiAgLy8vCiAgLy8vIFdoZW4gdGhpcyBvdmVycmlkZSBpcyBpbnN0YWxsZWQsIHRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBiZWhhdmlvciBvZgogIC8vLyBgbmV3IExpbmsoKWAgYW5kIGBuZXcgTGluay5mcm9tVXJpKClgLgogIExpbmsgY3JlYXRlTGluayhTdHJpbmcgcGF0aCkgPT4gbmV3IF9MaW5rKHBhdGgpOwoKICAvLyBTb2NrZXQKCiAgLy8vIEFzeW5jaHJvbm91c2x5IHJldHVybnMgYSBbU29ja2V0XSBjb25uZWN0ZWQgdG8gdGhlIGdpdmVuIGhvc3QgYW5kIHBvcnQuCiAgLy8vCiAgLy8vIFdoZW4gdGhpcyBvdmVycmlkZSBpcyBpbnN0YWxsZWQsIHRoaXMgZnVuY3Rpb25zIG92ZXJyaWRlcyB0aGUgYmVoYXZpb3Igb2YKICAvLy8gYFNvY2tldC5jb25uZWN0KC4uLilgLgogIEZ1dHVyZTxTb2NrZXQ+IHNvY2tldENvbm5lY3QoaG9zdCwgaW50IHBvcnQsCiAgICAgIHtzb3VyY2VBZGRyZXNzLCBEdXJhdGlvbiB0aW1lb3V0fSkgewogICAgcmV0dXJuIFNvY2tldC5fY29ubmVjdChob3N0LCBwb3J0LAogICAgICAgIHNvdXJjZUFkZHJlc3M6IHNvdXJjZUFkZHJlc3MsIHRpbWVvdXQ6IHRpbWVvdXQpOwogIH0KCiAgLy8vIEFzeW5jaHJvbm91c2x5IHJldHVybnMgYSBbQ29ubmVjdGlvblRhc2tdIHRoYXQgY29ubmVjdHMgdG8gdGhlIGdpdmVuIGhvc3QKICAvLy8gYW5kIHBvcnQgd2hlbiBzdWNjZXNzZnVsLgogIC8vLwogIC8vLyBXaGVuIHRoaXMgb3ZlcnJpZGUgaXMgaW5zdGFsbGVkLCB0aGlzIGZ1bmN0aW9ucyBvdmVycmlkZXMgdGhlIGJlaGF2aW9yIG9mCiAgLy8vIGBTb2NrZXQuc3RhcnRDb25uZWN0KC4uLilgLgogIEZ1dHVyZTxDb25uZWN0aW9uVGFzazxTb2NrZXQ+PiBzb2NrZXRTdGFydENvbm5lY3QoaG9zdCwgaW50IHBvcnQsCiAgICAgIHtzb3VyY2VBZGRyZXNzfSkgewogICAgcmV0dXJuIFNvY2tldC5fc3RhcnRDb25uZWN0KGhvc3QsIHBvcnQsIHNvdXJjZUFkZHJlc3M6IHNvdXJjZUFkZHJlc3MpOwogIH0KfQoKY2xhc3MgX0lPT3ZlcnJpZGVzU2NvcGUgZXh0ZW5kcyBJT092ZXJyaWRlcyB7CiAgZmluYWwgSU9PdmVycmlkZXMgX3ByZXZpb3VzID0gSU9PdmVycmlkZXMuY3VycmVudDsKCiAgLy8gRGlyZWN0b3J5CiAgRGlyZWN0b3J5IEZ1bmN0aW9uKFN0cmluZykgX2NyZWF0ZURpcmVjdG9yeTsKICBEaXJlY3RvcnkgRnVuY3Rpb24oKSBfZ2V0Q3VycmVudERpcmVjdG9yeTsKICB2b2lkIEZ1bmN0aW9uKFN0cmluZykgX3NldEN1cnJlbnREaXJlY3Rvcnk7CiAgRGlyZWN0b3J5IEZ1bmN0aW9uKCkgX2dldFN5c3RlbVRlbXBEaXJlY3Rvcnk7CgogIC8vIEZpbGUKICBGaWxlIEZ1bmN0aW9uKFN0cmluZykgX2NyZWF0ZUZpbGU7CgogIC8vIEZpbGVTdGF0CiAgRnV0dXJlPEZpbGVTdGF0PiBGdW5jdGlvbihTdHJpbmcpIF9zdGF0OwogIEZpbGVTdGF0IEZ1bmN0aW9uKFN0cmluZykgX3N0YXRTeW5jOwoKICAvLyBGaWxlU3lzdGVtRW50aXR5CiAgRnV0dXJlPGJvb2w+IEZ1bmN0aW9uKFN0cmluZywgU3RyaW5nKSBfZnNlSWRlbnRpY2FsOwogIGJvb2wgRnVuY3Rpb24oU3RyaW5nLCBTdHJpbmcpIF9mc2VJZGVudGljYWxTeW5jOwogIEZ1dHVyZTxGaWxlU3lzdGVtRW50aXR5VHlwZT4gRnVuY3Rpb24oU3RyaW5nLCBib29sKSBfZnNlR2V0VHlwZTsKICBGaWxlU3lzdGVtRW50aXR5VHlwZSBGdW5jdGlvbihTdHJpbmcsIGJvb2wpIF9mc2VHZXRUeXBlU3luYzsKCiAgLy8gX0ZpbGVTeXN0ZW1XYXRjaGVyCiAgU3RyZWFtPEZpbGVTeXN0ZW1FdmVudD4gRnVuY3Rpb24oU3RyaW5nLCBpbnQsIGJvb2wpIF9mc1dhdGNoOwogIGJvb2wgRnVuY3Rpb24oKSBfZnNXYXRjaElzU3VwcG9ydGVkOwoKICAvLyBMaW5rCiAgTGluayBGdW5jdGlvbihTdHJpbmcpIF9jcmVhdGVMaW5rOwoKICAvLyBTb2NrZXQKICBGdXR1cmU8U29ja2V0PiBGdW5jdGlvbihkeW5hbWljLCBpbnQsCiAgICAgIHtkeW5hbWljIHNvdXJjZUFkZHJlc3MsIER1cmF0aW9uIHRpbWVvdXR9KSBfc29ja2V0Q29ubmVjdDsKICBGdXR1cmU8Q29ubmVjdGlvblRhc2s8U29ja2V0Pj4gRnVuY3Rpb24oZHluYW1pYywgaW50LCB7ZHluYW1pYyBzb3VyY2VBZGRyZXNzfSkKICAgICAgX3NvY2tldFN0YXJ0Q29ubmVjdDsKCiAgX0lPT3ZlcnJpZGVzU2NvcGUoCiAgICAvLyBEaXJlY3RvcnkKICAgIHRoaXMuX2NyZWF0ZURpcmVjdG9yeSwKICAgIHRoaXMuX2dldEN1cnJlbnREaXJlY3RvcnksCiAgICB0aGlzLl9zZXRDdXJyZW50RGlyZWN0b3J5LAogICAgdGhpcy5fZ2V0U3lzdGVtVGVtcERpcmVjdG9yeSwKCiAgICAvLyBGaWxlCiAgICB0aGlzLl9jcmVhdGVGaWxlLAoKICAgIC8vIEZpbGVTdGF0CiAgICB0aGlzLl9zdGF0LAogICAgdGhpcy5fc3RhdFN5bmMsCgogICAgLy8gRmlsZVN5c3RlbUVudGl0eQogICAgdGhpcy5fZnNlSWRlbnRpY2FsLAogICAgdGhpcy5fZnNlSWRlbnRpY2FsU3luYywKICAgIHRoaXMuX2ZzZUdldFR5cGUsCiAgICB0aGlzLl9mc2VHZXRUeXBlU3luYywKCiAgICAvLyBfRmlsZVN5c3RlbVdhdGNoZXIKICAgIHRoaXMuX2ZzV2F0Y2gsCiAgICB0aGlzLl9mc1dhdGNoSXNTdXBwb3J0ZWQsCgogICAgLy8gTGluawogICAgdGhpcy5fY3JlYXRlTGluaywKCiAgICAvLyBTb2NrZXQKICAgIHRoaXMuX3NvY2tldENvbm5lY3QsCiAgICB0aGlzLl9zb2NrZXRTdGFydENvbm5lY3QsCiAgKTsKCiAgLy8gRGlyZWN0b3J5CiAgQG92ZXJyaWRlCiAgRGlyZWN0b3J5IGNyZWF0ZURpcmVjdG9yeShTdHJpbmcgcGF0aCkgewogICAgaWYgKF9jcmVhdGVEaXJlY3RvcnkgIT0gbnVsbCkgcmV0dXJuIF9jcmVhdGVEaXJlY3RvcnkocGF0aCk7CiAgICBpZiAoX3ByZXZpb3VzICE9IG51bGwpIHJldHVybiBfcHJldmlvdXMuY3JlYXRlRGlyZWN0b3J5KHBhdGgpOwogICAgcmV0dXJuIHN1cGVyLmNyZWF0ZURpcmVjdG9yeShwYXRoKTsKICB9CgogIEBvdmVycmlkZQogIERpcmVjdG9yeSBnZXRDdXJyZW50RGlyZWN0b3J5KCkgewogICAgaWYgKF9nZXRDdXJyZW50RGlyZWN0b3J5ICE9IG51bGwpIHJldHVybiBfZ2V0Q3VycmVudERpcmVjdG9yeSgpOwogICAgaWYgKF9wcmV2aW91cyAhPSBudWxsKSByZXR1cm4gX3ByZXZpb3VzLmdldEN1cnJlbnREaXJlY3RvcnkoKTsKICAgIHJldHVybiBzdXBlci5nZXRDdXJyZW50RGlyZWN0b3J5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHNldEN1cnJlbnREaXJlY3RvcnkoU3RyaW5nIHBhdGgpIHsKICAgIGlmIChfc2V0Q3VycmVudERpcmVjdG9yeSAhPSBudWxsKQogICAgICBfc2V0Q3VycmVudERpcmVjdG9yeShwYXRoKTsKICAgIGVsc2UgaWYgKF9wcmV2aW91cyAhPSBudWxsKQogICAgICBfcHJldmlvdXMuc2V0Q3VycmVudERpcmVjdG9yeShwYXRoKTsKICAgIGVsc2UKICAgICAgc3VwZXIuc2V0Q3VycmVudERpcmVjdG9yeShwYXRoKTsKICB9CgogIEBvdmVycmlkZQogIERpcmVjdG9yeSBnZXRTeXN0ZW1UZW1wRGlyZWN0b3J5KCkgewogICAgaWYgKF9nZXRTeXN0ZW1UZW1wRGlyZWN0b3J5ICE9IG51bGwpIHJldHVybiBfZ2V0U3lzdGVtVGVtcERpcmVjdG9yeSgpOwogICAgaWYgKF9wcmV2aW91cyAhPSBudWxsKSByZXR1cm4gX3ByZXZpb3VzLmdldFN5c3RlbVRlbXBEaXJlY3RvcnkoKTsKICAgIHJldHVybiBzdXBlci5nZXRTeXN0ZW1UZW1wRGlyZWN0b3J5KCk7CiAgfQoKICAvLyBGaWxlCiAgQG92ZXJyaWRlCiAgRmlsZSBjcmVhdGVGaWxlKFN0cmluZyBwYXRoKSB7CiAgICBpZiAoX2NyZWF0ZUZpbGUgIT0gbnVsbCkgcmV0dXJuIF9jcmVhdGVGaWxlKHBhdGgpOwogICAgaWYgKF9wcmV2aW91cyAhPSBudWxsKSByZXR1cm4gX3ByZXZpb3VzLmNyZWF0ZUZpbGUocGF0aCk7CiAgICByZXR1cm4gc3VwZXIuY3JlYXRlRmlsZShwYXRoKTsKICB9CgogIC8vIEZpbGVTdGF0CiAgQG92ZXJyaWRlCiAgRnV0dXJlPEZpbGVTdGF0PiBzdGF0KFN0cmluZyBwYXRoKSB7CiAgICBpZiAoX3N0YXQgIT0gbnVsbCkgcmV0dXJuIF9zdGF0KHBhdGgpOwogICAgaWYgKF9wcmV2aW91cyAhPSBudWxsKSByZXR1cm4gX3ByZXZpb3VzLnN0YXQocGF0aCk7CiAgICByZXR1cm4gc3VwZXIuc3RhdChwYXRoKTsKICB9CgogIEBvdmVycmlkZQogIEZpbGVTdGF0IHN0YXRTeW5jKFN0cmluZyBwYXRoKSB7CiAgICBpZiAoX3N0YXQgIT0gbnVsbCkgcmV0dXJuIF9zdGF0U3luYyhwYXRoKTsKICAgIGlmIChfcHJldmlvdXMgIT0gbnVsbCkgcmV0dXJuIF9wcmV2aW91cy5zdGF0U3luYyhwYXRoKTsKICAgIHJldHVybiBzdXBlci5zdGF0U3luYyhwYXRoKTsKICB9CgogIC8vIEZpbGVTeXN0ZW1FbnRpdHkKICBAb3ZlcnJpZGUKICBGdXR1cmU8Ym9vbD4gZnNlSWRlbnRpY2FsKFN0cmluZyBwYXRoMSwgU3RyaW5nIHBhdGgyKSB7CiAgICBpZiAoX2ZzZUlkZW50aWNhbCAhPSBudWxsKSByZXR1cm4gX2ZzZUlkZW50aWNhbChwYXRoMSwgcGF0aDIpOwogICAgaWYgKF9wcmV2aW91cyAhPSBudWxsKSByZXR1cm4gX3ByZXZpb3VzLmZzZUlkZW50aWNhbChwYXRoMSwgcGF0aDIpOwogICAgcmV0dXJuIHN1cGVyLmZzZUlkZW50aWNhbChwYXRoMSwgcGF0aDIpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBmc2VJZGVudGljYWxTeW5jKFN0cmluZyBwYXRoMSwgU3RyaW5nIHBhdGgyKSB7CiAgICBpZiAoX2ZzZUlkZW50aWNhbFN5bmMgIT0gbnVsbCkgcmV0dXJuIF9mc2VJZGVudGljYWxTeW5jKHBhdGgxLCBwYXRoMik7CiAgICBpZiAoX3ByZXZpb3VzICE9IG51bGwpIHJldHVybiBfcHJldmlvdXMuZnNlSWRlbnRpY2FsU3luYyhwYXRoMSwgcGF0aDIpOwogICAgcmV0dXJuIHN1cGVyLmZzZUlkZW50aWNhbFN5bmMocGF0aDEsIHBhdGgyKTsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxGaWxlU3lzdGVtRW50aXR5VHlwZT4gZnNlR2V0VHlwZShTdHJpbmcgcGF0aCwgYm9vbCBmb2xsb3dMaW5rcykgewogICAgaWYgKF9mc2VHZXRUeXBlICE9IG51bGwpIHJldHVybiBfZnNlR2V0VHlwZShwYXRoLCBmb2xsb3dMaW5rcyk7CiAgICBpZiAoX3ByZXZpb3VzICE9IG51bGwpIHJldHVybiBfcHJldmlvdXMuZnNlR2V0VHlwZShwYXRoLCBmb2xsb3dMaW5rcyk7CiAgICByZXR1cm4gc3VwZXIuZnNlR2V0VHlwZShwYXRoLCBmb2xsb3dMaW5rcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBGaWxlU3lzdGVtRW50aXR5VHlwZSBmc2VHZXRUeXBlU3luYyhTdHJpbmcgcGF0aCwgYm9vbCBmb2xsb3dMaW5rcykgewogICAgaWYgKF9mc2VHZXRUeXBlU3luYyAhPSBudWxsKSByZXR1cm4gX2ZzZUdldFR5cGVTeW5jKHBhdGgsIGZvbGxvd0xpbmtzKTsKICAgIGlmIChfcHJldmlvdXMgIT0gbnVsbCkgcmV0dXJuIF9wcmV2aW91cy5mc2VHZXRUeXBlU3luYyhwYXRoLCBmb2xsb3dMaW5rcyk7CiAgICByZXR1cm4gc3VwZXIuZnNlR2V0VHlwZVN5bmMocGF0aCwgZm9sbG93TGlua3MpOwogIH0KCiAgLy8gX0ZpbGVTeXN0ZW1XYXRjaGVyCiAgQG92ZXJyaWRlCiAgU3RyZWFtPEZpbGVTeXN0ZW1FdmVudD4gZnNXYXRjaChTdHJpbmcgcGF0aCwgaW50IGV2ZW50cywgYm9vbCByZWN1cnNpdmUpIHsKICAgIGlmIChfZnNXYXRjaCAhPSBudWxsKSByZXR1cm4gX2ZzV2F0Y2gocGF0aCwgZXZlbnRzLCByZWN1cnNpdmUpOwogICAgaWYgKF9wcmV2aW91cyAhPSBudWxsKSByZXR1cm4gX3ByZXZpb3VzLmZzV2F0Y2gocGF0aCwgZXZlbnRzLCByZWN1cnNpdmUpOwogICAgcmV0dXJuIHN1cGVyLmZzV2F0Y2gocGF0aCwgZXZlbnRzLCByZWN1cnNpdmUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBmc1dhdGNoSXNTdXBwb3J0ZWQoKSB7CiAgICBpZiAoX2ZzV2F0Y2hJc1N1cHBvcnRlZCAhPSBudWxsKSByZXR1cm4gX2ZzV2F0Y2hJc1N1cHBvcnRlZCgpOwogICAgaWYgKF9wcmV2aW91cyAhPSBudWxsKSByZXR1cm4gX3ByZXZpb3VzLmZzV2F0Y2hJc1N1cHBvcnRlZCgpOwogICAgcmV0dXJuIHN1cGVyLmZzV2F0Y2hJc1N1cHBvcnRlZCgpOwogIH0KCiAgLy8gTGluawogIEBvdmVycmlkZQogIExpbmsgY3JlYXRlTGluayhTdHJpbmcgcGF0aCkgewogICAgaWYgKF9jcmVhdGVMaW5rICE9IG51bGwpIHJldHVybiBfY3JlYXRlTGluayhwYXRoKTsKICAgIGlmIChfcHJldmlvdXMgIT0gbnVsbCkgcmV0dXJuIF9wcmV2aW91cy5jcmVhdGVMaW5rKHBhdGgpOwogICAgcmV0dXJuIHN1cGVyLmNyZWF0ZUxpbmsocGF0aCk7CiAgfQoKICAvLyBTb2NrZXQKICBAb3ZlcnJpZGUKICBGdXR1cmU8U29ja2V0PiBzb2NrZXRDb25uZWN0KGhvc3QsIGludCBwb3J0LAogICAgICB7c291cmNlQWRkcmVzcywgRHVyYXRpb24gdGltZW91dH0pIHsKICAgIGlmIChfc29ja2V0Q29ubmVjdCAhPSBudWxsKSB7CiAgICAgIHJldHVybiBfc29ja2V0Q29ubmVjdChob3N0LCBwb3J0LAogICAgICAgICAgc291cmNlQWRkcmVzczogc291cmNlQWRkcmVzcywgdGltZW91dDogdGltZW91dCk7CiAgICB9CiAgICBpZiAoX3ByZXZpb3VzICE9IG51bGwpIHsKICAgICAgcmV0dXJuIF9wcmV2aW91cy5zb2NrZXRDb25uZWN0KGhvc3QsIHBvcnQsCiAgICAgICAgICBzb3VyY2VBZGRyZXNzOiBzb3VyY2VBZGRyZXNzLCB0aW1lb3V0OiB0aW1lb3V0KTsKICAgIH0KICAgIHJldHVybiBzdXBlci5zb2NrZXRDb25uZWN0KGhvc3QsIHBvcnQsCiAgICAgICAgc291cmNlQWRkcmVzczogc291cmNlQWRkcmVzcywgdGltZW91dDogdGltZW91dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBGdXR1cmU8Q29ubmVjdGlvblRhc2s8U29ja2V0Pj4gc29ja2V0U3RhcnRDb25uZWN0KGhvc3QsIGludCBwb3J0LAogICAgICB7c291cmNlQWRkcmVzc30pIHsKICAgIGlmIChfc29ja2V0U3RhcnRDb25uZWN0ICE9IG51bGwpIHsKICAgICAgcmV0dXJuIF9zb2NrZXRTdGFydENvbm5lY3QoaG9zdCwgcG9ydCwgc291cmNlQWRkcmVzczogc291cmNlQWRkcmVzcyk7CiAgICB9CiAgICBpZiAoX3ByZXZpb3VzICE9IG51bGwpIHsKICAgICAgcmV0dXJuIF9wcmV2aW91cy5zb2NrZXRTdGFydENvbm5lY3QoaG9zdCwgcG9ydCwKICAgICAgICAgIHNvdXJjZUFkZHJlc3M6IHNvdXJjZUFkZHJlc3MpOwogICAgfQogICAgcmV0dXJuIHN1cGVyLnNvY2tldFN0YXJ0Q29ubmVjdChob3N0LCBwb3J0LCBzb3VyY2VBZGRyZXNzOiBzb3VyY2VBZGRyZXNzKTsKICB9Cn0KgeMATk48AREBKAEhAUgVBEdRPwQILQo2CgYEDSAMSjYMQwYIHR4BIzcEATMGTU4lLRkEAUIGTDghCBMyMDEzAQ4oARIuKgEaOjZGQgEcQyoBDigBECw5GTwnHgEiKxszExcbGx4BDhIBEgwQARoUGBIWARwPGgEOEgEQFRoHIzQuGwQBTgZKFUJBIzQuGwQBDwE9Bk83QgEtBk8sOQE3Bk8mKh8EAS4GTx4/AQoBOAZPLTMBDgFABk8ZJyEEATEGTx0jLQQBFgFMHwZPJDo2BAE9HwZPKDY6BAFEBk8fS00EATUGTyNHUAQBGAEwBk8iTT8EAUEGTys/AQoBOAZPLTMBDAFOBlAdLysnOQQBUCAGUCJEGUsEAgEuNQEPLy0uMAEKJQEOKycBFjczQz8BGEAnAQolAQwoQVEbARURGx8fIgEMFgEQEBQBGBgcFhoBGhMeAQwWAQ4ZHgUBDwwrQUMoBAEMJEVDKAQBDComIiArCScEAQwnS0YrBAEKDCE3PiMEAQ4MJys4HQQBDCMvPCEEARYMOkNILQQBDDZLTDEEAQxLREswBAEMR0xPNAQBGAxNRE4zBAEMHkNCJwQBCgwhNz4jBAEMDC8rIig7Bh0xOwYrOQQBDEQZJ0wGHTYpBk8EAgEWZGFydDppby9vdmVycmlkZXMuZGFydCxvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vcGxhdGZvcm0uZGFydJ3sLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCi8qKgogKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZW52aXJvbm1lbnQgaW4gd2hpY2ggdGhlIGN1cnJlbnQgcHJvZ3JhbSBpcyBydW5uaW5nLgogKgogKiBQbGF0Zm9ybSBwcm92aWRlcyBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBvcGVyYXRpbmcgc3lzdGVtLAogKiB0aGUgaG9zdG5hbWUgb2YgdGhlIGNvbXB1dGVyLCB0aGUgdmFsdWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzLAogKiB0aGUgcGF0aCB0byB0aGUgcnVubmluZyBwcm9ncmFtLAogKiBhbmQgc28gb24uCiAqCiAqICMjIEdldCB0aGUgVVJJIHRvIHRoZSBjdXJyZW50IERhcnQgc2NyaXB0CiAqCiAqIFVzZSB0aGUgW3NjcmlwdF0gZ2V0dGVyIHRvIGdldCB0aGUgVVJJIHRvIHRoZSBjdXJyZW50bHkgcnVubmluZwogKiBEYXJ0IHNjcmlwdC4KICoKICogICAgIGltcG9ydCAnZGFydDppbycgc2hvdyBQbGF0Zm9ybTsKICoKICogICAgIHZvaWQgbWFpbigpIHsKICogICAgICAgLy8gR2V0IHRoZSBVUkkgb2YgdGhlIHNjcmlwdCBiZWluZyBydW4uCiAqICAgICAgIHZhciB1cmkgPSBQbGF0Zm9ybS5zY3JpcHQ7CiAqICAgICAgIC8vIENvbnZlcnQgdGhlIFVSSSB0byBhIHBhdGguCiAqICAgICAgIHZhciBwYXRoID0gdXJpLnRvRmlsZVBhdGgoKTsKICogICAgIH0KICoKICogIyMgR2V0IHRoZSB2YWx1ZSBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZQogKgogKiBUaGUgW2Vudmlyb25tZW50XSBnZXR0ZXIgcmV0dXJucyBhIHRoZSBuYW1lcyBhbmQgdmFsdWVzIG9mIGVudmlyb25tZW50CiAqIHZhcmlhYmxlcyBpbiBhIFtNYXBdIHRoYXQgY29udGFpbnMga2V5LXZhbHVlIHBhaXJzIG9mIHN0cmluZ3MuIFRoZSBNYXAgaXMKICogdW5tb2RpZmlhYmxlLiBUaGlzIHNhbXBsZSBzaG93cyBob3cgdG8gZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgYFBBVEhgCiAqIGVudmlyb25tZW50IHZhcmlhYmxlLgogKgogKiAgICAgaW1wb3J0ICdkYXJ0OmlvJyBzaG93IFBsYXRmb3JtOwogKgogKiAgICAgdm9pZCBtYWluKCkgewogKiAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudlZhcnMgPSBQbGF0Zm9ybS5lbnZpcm9ubWVudDsKICogICAgICAgcHJpbnQoZW52VmFyc1snUEFUSCddKTsKICogICAgIH0KICoKICogIyMgRGV0ZXJtaW5lIHRoZSBPUwogKgogKiBZb3UgY2FuIGdldCB0aGUgbmFtZSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBhcyBhIHN0cmluZyB3aXRoIHRoZQogKiBbb3BlcmF0aW5nU3lzdGVtXSBnZXR0ZXIuIFlvdSBjYW4gYWxzbyB1c2Ugb25lIG9mIHRoZSBzdGF0aWMgYm9vbGVhbgogKiBnZXR0ZXJzOiBbaXNNYWNPU10sIFtpc0xpbnV4XSwgYW5kIFtpc1dpbmRvd3NdLgogKgogKiAgICAgaW1wb3J0ICdkYXJ0OmlvJyBzaG93IFBsYXRmb3JtLCBzdGRvdXQ7CiAqCiAqICAgICB2b2lkIG1haW4oKSB7CiAqICAgICAgIC8vIEdldCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBhcyBhIHN0cmluZy4KICogICAgICAgU3RyaW5nIG9zID0gUGxhdGZvcm0ub3BlcmF0aW5nU3lzdGVtOwogKiAgICAgICAvLyBPciwgdXNlIGEgcHJlZGljYXRlIGdldHRlci4KICogICAgICAgaWYgKFBsYXRmb3JtLmlzTWFjT1MpIHsKICogICAgICAgICBwcmludCgnaXMgYSBNYWMnKTsKICogICAgICAgfSBlbHNlIHsKICogICAgICAgICBwcmludCgnaXMgbm90IGEgTWFjJyk7CiAqICAgICAgIH0KICogICAgIH0KICoKICogIyMgT3RoZXIgcmVzb3VyY2VzCiAqCiAqIFtEYXJ0IGJ5IEV4YW1wbGVdKGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy9kYXJ0LWJ5LWV4YW1wbGUvI2RhcnQtaW8tYW5kLWNvbW1hbmQtbGluZS1hcHBzKQogKiBwcm92aWRlcyBhZGRpdGlvbmFsIHRhc2stb3JpZW50ZWQgY29kZSBzYW1wbGVzIHRoYXQgc2hvdyBob3cgdG8gdXNlCiAqIHZhcmlvdXMgQVBJIGZyb20gdGhlIFtkYXJ0OmlvXSBsaWJyYXJ5LgogKi8KY2xhc3MgUGxhdGZvcm0gewogIHN0YXRpYyBmaW5hbCBfbnVtYmVyT2ZQcm9jZXNzb3JzID0gX1BsYXRmb3JtLm51bWJlck9mUHJvY2Vzc29yczsKICBzdGF0aWMgZmluYWwgX3BhdGhTZXBhcmF0b3IgPSBfUGxhdGZvcm0ucGF0aFNlcGFyYXRvcjsKICBzdGF0aWMgZmluYWwgX29wZXJhdGluZ1N5c3RlbSA9IF9QbGF0Zm9ybS5vcGVyYXRpbmdTeXN0ZW07CiAgc3RhdGljIGZpbmFsIF9vcGVyYXRpbmdTeXN0ZW1WZXJzaW9uID0gX1BsYXRmb3JtLm9wZXJhdGluZ1N5c3RlbVZlcnNpb247CiAgc3RhdGljIGZpbmFsIF9sb2NhbEhvc3RuYW1lID0gX1BsYXRmb3JtLmxvY2FsSG9zdG5hbWU7CiAgc3RhdGljIGZpbmFsIF92ZXJzaW9uID0gX1BsYXRmb3JtLnZlcnNpb247CgogIC8qKgogICAqIFRoZSBudW1iZXIgb2YgaW5kaXZpZHVhbCBleGVjdXRpb24gdW5pdHMgb2YgdGhlIG1hY2hpbmUuCiAgICovCiAgc3RhdGljIGludCBnZXQgbnVtYmVyT2ZQcm9jZXNzb3JzID0+IF9udW1iZXJPZlByb2Nlc3NvcnM7CgogIC8qKgogICAqIFRoZSBwYXRoIHNlcGFyYXRvciB1c2VkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIHRvIHNlcGFyYXRlCiAgICogY29tcG9uZW50cyBpbiBmaWxlIHBhdGhzLgogICAqLwogIHN0YXRpYyBTdHJpbmcgZ2V0IHBhdGhTZXBhcmF0b3IgPT4gX3BhdGhTZXBhcmF0b3I7CgogIC8qKgogICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBsb2NhbGUuCiAgICovCiAgc3RhdGljIFN0cmluZyBnZXQgbG9jYWxlTmFtZSA9PiBfUGxhdGZvcm0ubG9jYWxlTmFtZSgpOwoKICAvKioKICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb3IgcGxhdGZvcm0uCiAgICovCiAgc3RhdGljIFN0cmluZyBnZXQgb3BlcmF0aW5nU3lzdGVtID0+IF9vcGVyYXRpbmdTeXN0ZW07CgogIC8qKgogICAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvciBwbGF0Zm9ybS4KICAgKi8KICBzdGF0aWMgU3RyaW5nIGdldCBvcGVyYXRpbmdTeXN0ZW1WZXJzaW9uID0+IF9vcGVyYXRpbmdTeXN0ZW1WZXJzaW9uOwoKICAvKioKICAgKiBUaGUgbG9jYWwgaG9zdG5hbWUgZm9yIHRoZSBzeXN0ZW0uCiAgICovCiAgc3RhdGljIFN0cmluZyBnZXQgbG9jYWxIb3N0bmFtZSA9PiBfbG9jYWxIb3N0bmFtZTsKCiAgLyoqCiAgICogV2hldGhlciB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpcyBhIHZlcnNpb24gb2YKICAgKiBbTGludXhdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpbnV4KS4KICAgKgogICAqIFRoaXMgdmFsdWUgaXMgYGZhbHNlYCBpZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpcyBhIHNwZWNpYWxpemVkCiAgICogdmVyc2lvbiBvZiBMaW51eCB0aGF0IGlkZW50aWZpZXMgaXRzZWxmIGJ5IGEgZGlmZmVyZW50IG5hbWUsCiAgICogZm9yIGV4YW1wbGUgQW5kcm9pZCAoc2VlIFtpc0FuZHJvaWRdKS4KICAgKi8KICBzdGF0aWMgZmluYWwgYm9vbCBpc0xpbnV4ID0gKF9vcGVyYXRpbmdTeXN0ZW0gPT0gImxpbnV4Iik7CgogIC8qKgogICAqIFdoZXRoZXIgdGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMgYSB2ZXJzaW9uIG9mCiAgICogW21hY09TXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NYWNPUykuCiAgICovCiAgc3RhdGljIGZpbmFsIGJvb2wgaXNNYWNPUyA9IChfb3BlcmF0aW5nU3lzdGVtID09ICJtYWNvcyIpOwoKICAvKioKICAgKiBXaGV0aGVyIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGlzIGEgdmVyc2lvbiBvZgogICAqIFtNaWNyb3NvZnQgV2luZG93c10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTWljcm9zb2Z0X1dpbmRvd3MpLgogICAqLwogIHN0YXRpYyBmaW5hbCBib29sIGlzV2luZG93cyA9IChfb3BlcmF0aW5nU3lzdGVtID09ICJ3aW5kb3dzIik7CgogIC8qKgogICAqIFdoZXRoZXIgdGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMgYSB2ZXJzaW9uIG9mCiAgICogW0FuZHJvaWRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FuZHJvaWRfJTI4b3BlcmF0aW5nX3N5c3RlbSUyOSkuCiAgICovCiAgc3RhdGljIGZpbmFsIGJvb2wgaXNBbmRyb2lkID0gKF9vcGVyYXRpbmdTeXN0ZW0gPT0gImFuZHJvaWQiKTsKCiAgLyoqCiAgICogV2hldGhlciB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpcyBhIHZlcnNpb24gb2YKICAgKiBbaU9TXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JT1MpLgogICAqLwogIHN0YXRpYyBmaW5hbCBib29sIGlzSU9TID0gKF9vcGVyYXRpbmdTeXN0ZW0gPT0gImlvcyIpOwoKICAvKioKICAgKiBXaGV0aGVyIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGlzIGEgdmVyc2lvbiBvZgogICAqIFtGdWNoc2lhXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Hb29nbGVfRnVjaHNpYSkuCiAgICovCiAgc3RhdGljIGZpbmFsIGJvb2wgaXNGdWNoc2lhID0gKF9vcGVyYXRpbmdTeXN0ZW0gPT0gImZ1Y2hzaWEiKTsKCiAgLyoqCiAgICogVGhlIGVudmlyb25tZW50IGZvciB0aGlzIHByb2Nlc3MgYXMgYSBtYXAgZnJvbSBzdHJpbmcga2V5IHRvIHN0cmluZyB2YWx1ZS4KICAgKgogICAqIFRoZSBtYXAgaXMgdW5tb2RpZmlhYmxlLAogICAqIGFuZCBpdHMgY29udGVudCBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbiBpdHMgZmlyc3QgdXNlLgogICAqCiAgICogRW52aXJvbm1lbnQgdmFyaWFibGVzIG9uIFdpbmRvd3MgYXJlIGNhc2UtaW5zZW5zaXRpdmUsCiAgICogc28gb24gV2luZG93cyB0aGUgbWFwIGlzIGNhc2UtaW5zZW5zaXRpdmUgYW5kIHdpbGwgY29udmVydAogICAqIGFsbCBrZXlzIHRvIHVwcGVyIGNhc2UuCiAgICogT24gb3RoZXIgcGxhdGZvcm1zLCBrZXlzIGNhbiBiZSBkaXN0aW5ndWlzaGVkIGJ5IGNhc2UuCiAgICovCiAgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0IGVudmlyb25tZW50ID0+IF9QbGF0Zm9ybS5lbnZpcm9ubWVudDsKCiAgLyoqCiAgICogVGhlIHBhdGggb2YgdGhlIGV4ZWN1dGFibGUgdXNlZCB0byBydW4gdGhlIHNjcmlwdCBpbiB0aGlzIGlzb2xhdGUuCiAgICoKICAgKiBUaGUgbGl0ZXJhbCBwYXRoIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHNjcmlwdC4KICAgKiBUaGlzIHBhdGggbWlnaHQgYmUgcmVsYXRpdmUgb3IganVzdCBiZSBhIG5hbWUgZnJvbSB3aGljaCB0aGUgZXhlY3V0YWJsZQogICAqIHdhcyBmb3VuZCBieSBzZWFyY2hpbmcgdGhlIHN5c3RlbSBwYXRoLgogICAqCiAgICogVXNlIFtyZXNvbHZlZEV4ZWN1dGFibGVdIHRvIGdldCBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBleGVjdXRhYmxlLgogICAqLwogIHN0YXRpYyBTdHJpbmcgZ2V0IGV4ZWN1dGFibGUgPT4gX1BsYXRmb3JtLmV4ZWN1dGFibGU7CgogIC8qKgogICAqIFRoZSBwYXRoIG9mIHRoZSBleGVjdXRhYmxlIHVzZWQgdG8gcnVuIHRoZSBzY3JpcHQgaW4gdGhpcwogICAqIGlzb2xhdGUgYWZ0ZXIgaXQgaGFzIGJlZW4gcmVzb2x2ZWQgYnkgdGhlIE9TLgogICAqCiAgICogVGhpcyBpcyB0aGUgYWJzb2x1dGUgcGF0aCwgd2l0aCBhbGwgc3ltbGlua3MgcmVzb2x2ZWQsIHRvIHRoZQogICAqIGV4ZWN1dGFibGUgdXNlZCB0byBydW4gdGhlIHNjcmlwdC4KICAgKi8KICBzdGF0aWMgU3RyaW5nIGdldCByZXNvbHZlZEV4ZWN1dGFibGUgPT4gX1BsYXRmb3JtLnJlc29sdmVkRXhlY3V0YWJsZTsKCiAgLyoqCiAgICogVGhlIGFic29sdXRlIFVSSSBvZiB0aGUgc2NyaXB0IGJlaW5nIHJ1biBpbiB0aGlzIGlzb2xhdGUuCiAgICoKICAgKiBJZiB0aGUgc2NyaXB0IGFyZ3VtZW50IG9uIHRoZSBjb21tYW5kIGxpbmUgaXMgcmVsYXRpdmUsCiAgICogaXQgaXMgcmVzb2x2ZWQgdG8gYW4gYWJzb2x1dGUgVVJJIGJlZm9yZSBmZXRjaGluZyB0aGUgc2NyaXB0LCBhbmQKICAgKiB0aGF0IGFic29sdXRlIFVSSSBpcyByZXR1cm5lZC4KICAgKgogICAqIFVSSSByZXNvbHV0aW9uIG9ubHkgZG9lcyBzdHJpbmcgbWFuaXB1bGF0aW9uIG9uIHRoZSBzY3JpcHQgcGF0aCwgYW5kIHRoaXMKICAgKiBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIGZpbGUgc3lzdGVtJ3MgcGF0aCByZXNvbHV0aW9uIGJlaGF2aW9yLiBGb3IKICAgKiBleGFtcGxlLCBhIHN5bWJvbGljIGxpbmsgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgJy4uJyB3aWxsIG5vdCBiZQogICAqIGxvb2tlZCB1cC4KICAgKgogICAqIElmIHRoZSBleGVjdXRhYmxlIGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgW3NjcmlwdF0sCiAgICogdGhlIFVSSSBpcyBlbXB0eS4KICAgKi8KICBzdGF0aWMgVXJpIGdldCBzY3JpcHQgPT4gX1BsYXRmb3JtLnNjcmlwdDsKCiAgLyoqCiAgICogVGhlIGZsYWdzIHBhc3NlZCB0byB0aGUgZXhlY3V0YWJsZSB1c2VkIHRvIHJ1biB0aGUgc2NyaXB0IGluIHRoaXMgaXNvbGF0ZS4KICAgKgogICAqIFRoZXNlIGFyZSB0aGUgY29tbWFuZC1saW5lIGZsYWdzIHRvIHRoZSBleGVjdXRhYmxlIHRoYXQgcHJlY2VkZXMKICAgKiB0aGUgc2NyaXB0IG5hbWUuCiAgICogUHJvdmlkZXMgYSBuZXcgbGlzdCBldmVyeSB0aW1lIHRoZSB2YWx1ZSBpcyByZWFkLgogICAqLwogIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0IGV4ZWN1dGFibGVBcmd1bWVudHMgPT4gX1BsYXRmb3JtLmV4ZWN1dGFibGVBcmd1bWVudHM7CgogIC8qKgogICAqIFRoaXMgcmV0dXJucyBgbnVsbGAsIGFzIGBwYWNrYWdlcy9gIGRpcmVjdG9yaWVzIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkLgogICAqCiAgICovCiAgQERlcHJlY2F0ZWQoJ3BhY2thZ2VzLyBkaXJlY3RvcnkgcmVzb2x1dGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIERhcnQgMicpCiAgc3RhdGljIFN0cmluZyBnZXQgcGFja2FnZVJvb3QgPT4gbnVsbDsgLy8gVE9ETyhtZmFpcmh1cnN0KTogcmVtb3ZlIHRoaXMKCiAgLyoqCiAgICogVGhlIGAtLXBhY2thZ2VzYCBmbGFnIHBhc3NlZCB0byB0aGUgZXhlY3V0YWJsZSB1c2VkIHRvIHJ1biB0aGUgc2NyaXB0CiAgICogaW4gdGhpcyBpc29sYXRlLgogICAqCiAgICogSWYgcHJlc2VudCwgaXQgc3BlY2lmaWVzIGEgZmlsZSBkZXNjcmliaW5nIGhvdyBEYXJ0IHBhY2thZ2VzIGFyZSBsb29rZWQgdXAuCiAgICoKICAgKiBJcyBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gYC0tcGFja2FnZXNgIGZsYWcuCiAgICovCiAgc3RhdGljIFN0cmluZyBnZXQgcGFja2FnZUNvbmZpZyA9PiBfUGxhdGZvcm0ucGFja2FnZUNvbmZpZzsKCiAgLyoqCiAgICogVGhlIHZlcnNpb24gb2YgdGhlIGN1cnJlbnQgRGFydCBydW50aW1lLgogICAqCiAgICogVGhlIHZhbHVlIGlzIGEgW3NlbWFudGljIHZlcnNpb25pbmddKGh0dHA6Ly9zZW12ZXIub3JnKQogICAqIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIGN1cnJlbnQgRGFydCBydW50aW1lLAogICAqIHBvc3NpYmx5IGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2UgYW5kIG90aGVyIHZlcnNpb24gYW5kCiAgICogYnVpbGQgZGV0YWlscy4KICAgKi8KICBzdGF0aWMgU3RyaW5nIGdldCB2ZXJzaW9uID0+IF92ZXJzaW9uOwp9CoDqAE5OPAERAQROAz9FJA4DLQNDEAMnAxUxJCcmCQMvA0pNRhkDJwMVPSEJAxcDRUgzAy8DFTIvKCEeEiILCQMWA15HKwQRQzk9SzktAQY+BjwBBkEfBjUBBikGOgEGPQY5AQZMBkcBBigGNQEGMjMFREIsBj0BBjIzBj0BBjJLBkEBBjJOBkEBBjIvBjkBBjI+BkEBBlAFHk4FPEAdPAZHAQZIBTNNLQVJBjgBBj8zBUMoBkgBBj8FPUckBU9LRxAFPhcGLQEGUAVGFjcGUAEGTgUGS0oBBksWBVEFMQY+AQYuBT1COxQGKQIBFWRhcnQ6aW8vcGxhdGZvcm0uZGFydDFvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vcGxhdGZvcm1faW1wbC5kYXJ0lo0vLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmlvOwoKY2xhc3MgX1BsYXRmb3JtIHsKICBleHRlcm5hbCBzdGF0aWMgaW50IF9udW1iZXJPZlByb2Nlc3NvcnMoKTsKICBleHRlcm5hbCBzdGF0aWMgU3RyaW5nIF9wYXRoU2VwYXJhdG9yKCk7CiAgZXh0ZXJuYWwgc3RhdGljIFN0cmluZyBfb3BlcmF0aW5nU3lzdGVtKCk7CiAgZXh0ZXJuYWwgc3RhdGljIF9vcGVyYXRpbmdTeXN0ZW1WZXJzaW9uKCk7CiAgZXh0ZXJuYWwgc3RhdGljIF9sb2NhbEhvc3RuYW1lKCk7CiAgZXh0ZXJuYWwgc3RhdGljIF9leGVjdXRhYmxlKCk7CiAgZXh0ZXJuYWwgc3RhdGljIF9yZXNvbHZlZEV4ZWN1dGFibGUoKTsKCiAgLyoqCiAgICogUmV0cmlldmUgdGhlIGVudHJpZXMgb2YgdGhlIHByb2Nlc3MgZW52aXJvbm1lbnQuCiAgICoKICAgKiBUaGUgcmVzdWx0IGlzIGFuIFtJdGVyYWJsZV0gb2Ygc3RyaW5ncywgd2hlcmUgZWFjaCBzdHJpbmcgcmVwcmVzZW50cwogICAqIGFuIGVudmlyb25tZW50IGVudHJ5LgogICAqCiAgICogRW52aXJvbm1lbnQgZW50cmllcyBzaG91bGQgYmUgc3RyaW5ncyBjb250YWluaW5nCiAgICogYSBub24tZW1wdHkgbmFtZSBhbmQgYSB2YWx1ZSBzZXBhcmF0ZWQgYnkgYSAnPScgY2hhcmFjdGVyLgogICAqIFRoZSBuYW1lIGRvZXMgbm90IGNvbnRhaW4gYSAnPScgY2hhcmFjdGVyLAogICAqIHNvIHRoZSBuYW1lIGlzIGV2ZXJ5dGhpbmcgdXAgdG8gdGhlIGZpcnN0ICc9JyBjaGFyYWN0ZXIuCiAgICogVmFsdWVzIGFyZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCAnPScgY2hhcmFjdGVyLgogICAqIEEgdmFsdWUgbWF5IGNvbnRhaW4gZnVydGhlciAnPScgY2hhcmFjdGVycywgYW5kIGl0IG1heSBiZSBlbXB0eS4KICAgKgogICAqIFJldHVybnMgYW4gW09TRXJyb3JdIGlmIHJldHJpZXZpbmcgdGhlIGVudmlyb25tZW50IGZhaWxzLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBfZW52aXJvbm1lbnQoKTsKICBleHRlcm5hbCBzdGF0aWMgTGlzdDxTdHJpbmc+IF9leGVjdXRhYmxlQXJndW1lbnRzKCk7CiAgZXh0ZXJuYWwgc3RhdGljIFN0cmluZyBfcGFja2FnZVJvb3QoKTsgLy8gVE9ETyhtZmFpcmh1cnN0KTogcmVtb3ZlIHRoaXMKICBleHRlcm5hbCBzdGF0aWMgU3RyaW5nIF9wYWNrYWdlQ29uZmlnKCk7CiAgZXh0ZXJuYWwgc3RhdGljIFN0cmluZyBfdmVyc2lvbigpOwogIGV4dGVybmFsIHN0YXRpYyBTdHJpbmcgX2xvY2FsZU5hbWUoKTsKICBleHRlcm5hbCBzdGF0aWMgVXJpIF9zY3JpcHQoKTsKCiAgc3RhdGljIFN0cmluZyBleGVjdXRhYmxlID0gX2V4ZWN1dGFibGUoKTsKICBzdGF0aWMgU3RyaW5nIHJlc29sdmVkRXhlY3V0YWJsZSA9IF9yZXNvbHZlZEV4ZWN1dGFibGUoKTsKICBzdGF0aWMgU3RyaW5nIHBhY2thZ2VSb290OyAvLyBUT0RPKG1mYWlyaHVyc3QpOiByZW1vdmUgdGhpcwogIHN0YXRpYyBTdHJpbmcgcGFja2FnZUNvbmZpZyA9IF9wYWNrYWdlQ29uZmlnKCk7CgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBzdGF0aWMgU3RyaW5nIEZ1bmN0aW9uKCkgX2xvY2FsZUNsb3N1cmU7CiAgc3RhdGljIFN0cmluZyBsb2NhbGVOYW1lKCkgewogICAgZmluYWwgcmVzdWx0ID0gKF9sb2NhbGVDbG9zdXJlID09IG51bGwpID8gX2xvY2FsZU5hbWUoKSA6IF9sb2NhbGVDbG9zdXJlKCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgcmVzdWx0OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIENhY2hlIHRoZSBPUyBlbnZpcm9ubWVudC4gVGhpcyBjYW4gYmUgYW4gT1NFcnJvciBpbnN0YW5jZSBpZgogIC8vIHJldHJpZXZpbmcgdGhlIGVudmlyb25tZW50IGZhaWxlZC4KICBzdGF0aWMgdmFyIC8qT1NFcnJvcnxNYXA8U3RyaW5nLFN0cmluZz4qLyBfZW52aXJvbm1lbnRDYWNoZTsKCiAgc3RhdGljIGludCBnZXQgbnVtYmVyT2ZQcm9jZXNzb3JzID0+IF9udW1iZXJPZlByb2Nlc3NvcnMoKTsKICBzdGF0aWMgU3RyaW5nIGdldCBwYXRoU2VwYXJhdG9yID0+IF9wYXRoU2VwYXJhdG9yKCk7CiAgc3RhdGljIFN0cmluZyBnZXQgb3BlcmF0aW5nU3lzdGVtID0+IF9vcGVyYXRpbmdTeXN0ZW0oKTsKICBzdGF0aWMgVXJpIGdldCBzY3JpcHQgPT4gX3NjcmlwdCgpOwoKICBzdGF0aWMgU3RyaW5nIF9jYWNoZWRPU1ZlcnNpb247CiAgc3RhdGljIFN0cmluZyBnZXQgb3BlcmF0aW5nU3lzdGVtVmVyc2lvbiB7CiAgICBpZiAoX2NhY2hlZE9TVmVyc2lvbiA9PSBudWxsKSB7CiAgICAgIHZhciByZXN1bHQgPSBfb3BlcmF0aW5nU3lzdGVtVmVyc2lvbigpOwogICAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgICB0aHJvdyByZXN1bHQ7CiAgICAgIH0KICAgICAgX2NhY2hlZE9TVmVyc2lvbiA9IHJlc3VsdDsKICAgIH0KICAgIHJldHVybiBfY2FjaGVkT1NWZXJzaW9uOwogIH0KCiAgc3RhdGljIFN0cmluZyBnZXQgbG9jYWxIb3N0bmFtZSB7CiAgICB2YXIgcmVzdWx0ID0gX2xvY2FsSG9zdG5hbWUoKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyByZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXQgZXhlY3V0YWJsZUFyZ3VtZW50cyA9PiBfZXhlY3V0YWJsZUFyZ3VtZW50cygpOwoKICBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXQgZW52aXJvbm1lbnQgewogICAgaWYgKF9lbnZpcm9ubWVudENhY2hlID09IG51bGwpIHsKICAgICAgdmFyIGVudiA9IF9lbnZpcm9ubWVudCgpOwogICAgICBpZiAoZW52IGlzISBPU0Vycm9yKSB7CiAgICAgICAgdmFyIGlzV2luZG93cyA9IG9wZXJhdGluZ1N5c3RlbSA9PSAnd2luZG93cyc7CiAgICAgICAgdmFyIHJlc3VsdCA9IGlzV2luZG93cwogICAgICAgICAgICA/IG5ldyBfQ2FzZUluc2Vuc2l0aXZlU3RyaW5nTWFwPFN0cmluZz4oKQogICAgICAgICAgICA6IG5ldyBNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CiAgICAgICAgZm9yICh2YXIgc3RyIGluIGVudikgewogICAgICAgICAgaWYgKHN0ciA9PSBudWxsKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgLy8gVGhlIFN0cmluZ3MgcmV0dXJuZWQgYnkgW19lbnZpcm9ubWVudCgpXSBhcmUgZXhwZWN0ZWQgdG8gYmUKICAgICAgICAgIC8vIHZhbGlkIGVudmlyb25tZW50IGVudHJpZXMsIGJ1dCBleGNlcHRpb25zIGhhdmUgYmVlbiBzZWVuCiAgICAgICAgICAvLyAoZS5nLiwgYW4gZW50cnkgb2YganVzdCAnPScgaGFzIGJlZW4gc2VlbiBvbiBPUy9YKS4KICAgICAgICAgIC8vIEludmFsaWQgZW50cmllcyAobGluZXMgd2l0aG91dCBhICc9JyBvciB3aXRoIGFuIGVtcHR5IG5hbWUpCiAgICAgICAgICAvLyBhcmUgZGlzY2FyZGVkLgogICAgICAgICAgdmFyIGVxdWFsc0luZGV4ID0gc3RyLmluZGV4T2YoJz0nKTsKICAgICAgICAgIGlmIChlcXVhbHNJbmRleCA+IDApIHsKICAgICAgICAgICAgcmVzdWx0W3N0ci5zdWJzdHJpbmcoMCwgZXF1YWxzSW5kZXgpXSA9CiAgICAgICAgICAgICAgICBzdHIuc3Vic3RyaW5nKGVxdWFsc0luZGV4ICsgMSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9lbnZpcm9ubWVudENhY2hlID0gbmV3IFVubW9kaWZpYWJsZU1hcFZpZXc8U3RyaW5nLCBTdHJpbmc+KHJlc3VsdCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2Vudmlyb25tZW50Q2FjaGUgPSBlbnY7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoX2Vudmlyb25tZW50Q2FjaGUgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBfZW52aXJvbm1lbnRDYWNoZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfZW52aXJvbm1lbnRDYWNoZTsKICAgIH0KICB9CgogIHN0YXRpYyBTdHJpbmcgZ2V0IHZlcnNpb24gPT4gX3ZlcnNpb24oKTsKfQoKLy8gRW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIG9uIFdpbmRvd3MuIEluIG9yZGVyCi8vIHRvIHJlZmxlY3QgdGhhdCB3ZSB1c2UgYSBjYXNlLWluc2Vuc2l0aXZlIHN0cmluZyBtYXAgb24gV2luZG93cy4KY2xhc3MgX0Nhc2VJbnNlbnNpdGl2ZVN0cmluZ01hcDxWPiBleHRlbmRzIE1hcEJhc2U8U3RyaW5nLCBWPiB7CiAgZmluYWwgTWFwPFN0cmluZywgVj4gX21hcCA9IG5ldyBNYXA8U3RyaW5nLCBWPigpOwoKICBib29sIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpID0+CiAgICAgIGtleSBpcyBTdHJpbmcgJiYgX21hcC5jb250YWluc0tleShrZXkudG9VcHBlckNhc2UoKSk7CiAgYm9vbCBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgPT4gX21hcC5jb250YWluc1ZhbHVlKHZhbHVlKTsKICBWIG9wZXJhdG9yIFtdKE9iamVjdCBrZXkpID0+IGtleSBpcyBTdHJpbmcgPyBfbWFwW2tleS50b1VwcGVyQ2FzZSgpXSA6IG51bGw7CiAgdm9pZCBvcGVyYXRvciBbXT0oU3RyaW5nIGtleSwgViB2YWx1ZSkgewogICAgX21hcFtrZXkudG9VcHBlckNhc2UoKV0gPSB2YWx1ZTsKICB9CgogIFYgcHV0SWZBYnNlbnQoU3RyaW5nIGtleSwgViBpZkFic2VudCgpKSB7CiAgICByZXR1cm4gX21hcC5wdXRJZkFic2VudChrZXkudG9VcHBlckNhc2UoKSwgaWZBYnNlbnQpOwogIH0KCiAgdm9pZCBhZGRBbGwoTWFwPFN0cmluZywgVj4gb3RoZXIpIHsKICAgIG90aGVyLmZvckVhY2goKGtleSwgdmFsdWUpID0+IHRoaXNba2V5LnRvVXBwZXJDYXNlKCldID0gdmFsdWUpOwogIH0KCiAgViByZW1vdmUoT2JqZWN0IGtleSkgPT4ga2V5IGlzIFN0cmluZyA/IF9tYXAucmVtb3ZlKGtleS50b1VwcGVyQ2FzZSgpKSA6IG51bGw7CgogIHZvaWQgY2xlYXIoKSB7CiAgICBfbWFwLmNsZWFyKCk7CiAgfQoKICB2b2lkIGZvckVhY2godm9pZCBmKFN0cmluZyBrZXksIFYgdmFsdWUpKSB7CiAgICBfbWFwLmZvckVhY2goZik7CiAgfQoKICBJdGVyYWJsZTxTdHJpbmc+IGdldCBrZXlzID0+IF9tYXAua2V5czsKICBJdGVyYWJsZTxWPiBnZXQgdmFsdWVzID0+IF9tYXAudmFsdWVzOwogIGludCBnZXQgbGVuZ3RoID0+IF9tYXAubGVuZ3RoOwogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX21hcC5pc0VtcHR5OwogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gX21hcC5pc05vdEVtcHR5OwoKICBJdGVyYWJsZTxNYXBFbnRyeTxTdHJpbmcsIFY+PiBnZXQgZW50cmllcyA9PiBfbWFwLmVudHJpZXM7CgogIE1hcDxLMiwgVjI+IG1hcDxLMiwgVjI+KE1hcEVudHJ5PEsyLCBWMj4gdHJhbnNmb3JtKFN0cmluZyBrZXksIFYgdmFsdWUpKSA9PgogICAgICBfbWFwLm1hcCh0cmFuc2Zvcm0pOwoKICBWIHVwZGF0ZShTdHJpbmcga2V5LCBWIHVwZGF0ZShWIHZhbHVlKSwge1YgaWZBYnNlbnQoKX0pID0+CiAgICAgIF9tYXAudXBkYXRlKGtleS50b1VwcGVyQ2FzZSgpLCB1cGRhdGUsIGlmQWJzZW50OiBpZkFic2VudCk7CgogIHZvaWQgdXBkYXRlQWxsKFYgdXBkYXRlKFN0cmluZyBrZXksIFYgdmFsdWUpKSB7CiAgICBfbWFwLnVwZGF0ZUFsbCh1cGRhdGUpOwogIH0KCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoU3RyaW5nIGtleSwgViB2YWx1ZSkpIHsKICAgIF9tYXAucmVtb3ZlV2hlcmUodGVzdCk7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBfbWFwLnRvU3RyaW5nKCk7Cn0KgLQATk48AREBEi0rLS0kISkBBjYFShsFNkAwPjpGBT8GIjdKKyUoIQEsPD4yARwrH1AdFAYTBAFCKD8BPjc7JgEiLSQuHxYIIQYdBAEkIx0UBhMEAUkBLyUgHTYfNikfHRYMSUZBSRwuITQwDApNDyEIBgEoHw0gBgQBKwIBQ0RANAEiPEFPKyUEASw6BAEmRAQBUQEREgQBLhUEASopISQqAT0BThsBPUIBMhwEATUcBAEoAgEaZGFydDppby9wbGF0Zm9ybV9pbXBsLmRhcnQzb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2Jpbi9wbGF0Zm9ybV9wYXRjaC5kYXJ0h3cvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29tbW9uX3BhdGNoLmRhcnQiOwoKQHBhdGNoCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX1BsYXRmb3JtIHsKICBAcGF0Y2gKICBzdGF0aWMgaW50IF9udW1iZXJPZlByb2Nlc3NvcnMoKSBuYXRpdmUgIlBsYXRmb3JtX051bWJlck9mUHJvY2Vzc29ycyI7CiAgQHBhdGNoCiAgc3RhdGljIFN0cmluZyBfcGF0aFNlcGFyYXRvcigpIG5hdGl2ZSAiUGxhdGZvcm1fUGF0aFNlcGFyYXRvciI7CiAgQHBhdGNoCiAgc3RhdGljIFN0cmluZyBfb3BlcmF0aW5nU3lzdGVtKCkgbmF0aXZlICJQbGF0Zm9ybV9PcGVyYXRpbmdTeXN0ZW0iOwogIEBwYXRjaAogIHN0YXRpYyBfb3BlcmF0aW5nU3lzdGVtVmVyc2lvbigpIG5hdGl2ZSAiUGxhdGZvcm1fT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiI7CiAgQHBhdGNoCiAgc3RhdGljIF9sb2NhbEhvc3RuYW1lKCkgbmF0aXZlICJQbGF0Zm9ybV9Mb2NhbEhvc3RuYW1lIjsKICBAcGF0Y2gKICBzdGF0aWMgX2V4ZWN1dGFibGUoKSBuYXRpdmUgIlBsYXRmb3JtX0V4ZWN1dGFibGVOYW1lIjsKICBAcGF0Y2gKICBzdGF0aWMgX3Jlc29sdmVkRXhlY3V0YWJsZSgpIG5hdGl2ZSAiUGxhdGZvcm1fUmVzb2x2ZWRFeGVjdXRhYmxlTmFtZSI7CiAgQHBhdGNoCiAgc3RhdGljIF9lbnZpcm9ubWVudCgpIG5hdGl2ZSAiUGxhdGZvcm1fRW52aXJvbm1lbnQiOwogIEBwYXRjaAogIHN0YXRpYyBMaXN0PFN0cmluZz4gX2V4ZWN1dGFibGVBcmd1bWVudHMoKQogICAgICBuYXRpdmUgIlBsYXRmb3JtX0V4ZWN1dGFibGVBcmd1bWVudHMiOwogIEBwYXRjaAogIHN0YXRpYyBTdHJpbmcgX3ZlcnNpb24oKSBuYXRpdmUgIlBsYXRmb3JtX0dldFZlcnNpb24iOwoKICBAcGF0Y2gKICBzdGF0aWMgU3RyaW5nIF9sb2NhbGVOYW1lKCkgbmF0aXZlICJQbGF0Zm9ybV9Mb2NhbGVOYW1lIjsKCiAgQHBhdGNoCiAgc3RhdGljIFN0cmluZyBfcGFja2FnZVJvb3QoKSA9PiBWTUxpYnJhcnlIb29rcy5wYWNrYWdlUm9vdFN0cmluZzsKICBAcGF0Y2gKICBzdGF0aWMgU3RyaW5nIF9wYWNrYWdlQ29uZmlnKCkgPT4gVk1MaWJyYXJ5SG9va3MucGFja2FnZUNvbmZpZ1N0cmluZzsKCiAgQHBhdGNoCiAgc3RhdGljIFVyaSBfc2NyaXB0KCkgPT4gVk1MaWJyYXJ5SG9va3MucGxhdGZvcm1TY3JpcHQ7CgogIC8vIFRoaXMgc2NyaXB0IHNpbmdsZXRvbiBpcyB3cml0dGVuIHRvIGJ5IHRoZSBlbWJlZGRlciBpZiBhcHBsaWNhYmxlLgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBzdGF0aWMgdm9pZCBzZXQgX25hdGl2ZVNjcmlwdChTdHJpbmcgcGF0aCkgewogICAgVk1MaWJyYXJ5SG9va3MucGxhdGZvcm1TY3JpcHQgPSAoKCkgewogICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCdodHRwOicpIHx8CiAgICAgICAgICBwYXRoLnN0YXJ0c1dpdGgoJ2h0dHBzOicpIHx8CiAgICAgICAgICBwYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2U6JykgfHwKICAgICAgICAgIHBhdGguc3RhcnRzV2l0aCgnZGFydDonKSB8fAogICAgICAgICAgcGF0aC5zdGFydHNXaXRoKCdkYXRhOicpIHx8CiAgICAgICAgICBwYXRoLnN0YXJ0c1dpdGgoJ2ZpbGU6JykpIHsKICAgICAgICByZXR1cm4gVXJpLnBhcnNlKHBhdGgpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBVcmkuYmFzZS5yZXNvbHZlVXJpKG5ldyBVcmkuZmlsZShwYXRoKSk7CiAgICAgIH0KICAgIH0pOwogIH0KfQo9AE5OPAEgAQcaEglJCUIJRglNCTsJOQlJCTcJLS0JOQEJPAEJRAlIAQk5AUgcLyomJykmJiYgDzgICAQCASFkYXJ0OmlvLXBhdGNoL3BsYXRmb3JtX3BhdGNoLmRhcnQrb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2lvL3Byb2Nlc3MuZGFydMAAZ+0vLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmlvOwoKLy8gVE9ETyhhZ2VyKTogVGhlIG9ubHkgcmVhc29uIGZvciB0aGlzIGNsYXNzIGlzIHRoYXQgd2UKLy8gY2Fubm90IHBhdGNoIGEgdG9wLWxldmVsIGF0IHRoaXMgcG9pbnQuCmNsYXNzIF9Qcm9jZXNzVXRpbHMgewogIGV4dGVybmFsIHN0YXRpYyB2b2lkIF9leGl0KGludCBzdGF0dXMpOwogIGV4dGVybmFsIHN0YXRpYyB2b2lkIF9zZXRFeGl0Q29kZShpbnQgc3RhdHVzKTsKICBleHRlcm5hbCBzdGF0aWMgaW50IF9nZXRFeGl0Q29kZSgpOwogIGV4dGVybmFsIHN0YXRpYyB2b2lkIF9zbGVlcChpbnQgbWlsbGlzKTsKICBleHRlcm5hbCBzdGF0aWMgaW50IF9waWQoUHJvY2VzcyBwcm9jZXNzKTsKICBleHRlcm5hbCBzdGF0aWMgU3RyZWFtPFByb2Nlc3NTaWduYWw+IF93YXRjaFNpZ25hbChQcm9jZXNzU2lnbmFsIHNpZ25hbCk7Cn0KCi8qKgogKiBFeGl0IHRoZSBEYXJ0IFZNIHByb2Nlc3MgaW1tZWRpYXRlbHkgd2l0aCB0aGUgZ2l2ZW4gZXhpdCBjb2RlLgogKgogKiBUaGlzIGRvZXMgbm90IHdhaXQgZm9yIGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyB0byB0ZXJtaW5hdGUuIFVzaW5nCiAqIFtleGl0XSBpcyB0aGVyZWZvcmUgdmVyeSBsaWtlbHkgdG8gbG9zZSBkYXRhLgogKgogKiBXaGlsZSBkZWJ1Z2dpbmcsIHRoZSBWTSB3aWxsIG5vdCByZXNwZWN0IHRoZSBgLS1wYXVzZS1pc29sYXRlcy1vbi1leGl0YAogKiBmbGFnIGlmIFtleGl0XSBpcyBjYWxsZWQgYXMgaW52b2tpbmcgdGhpcyBtZXRob2QgY2F1c2VzIHRoZSBEYXJ0IFZNCiAqIHByb2Nlc3MgdG8gc2h1dGRvd24gaW1tZWRpYXRlbHkuIFRvIHByb3Blcmx5IGJyZWFrIG9uIGV4aXQsIGNvbnNpZGVyCiAqIGNhbGxpbmcgW2RlYnVnZ2VyXSBmcm9tIGBkYXJ0OmRldmVsb3BlcmAgb3IgW0lzb2xhdGUucGF1c2VdIGZyb20KICogYGRhcnQ6aXNvbGF0ZWAgb24gW0lzb2xhdGUuY3VycmVudF0gdG8gcGF1c2UgdGhlIGlzb2xhdGUgYmVmb3JlCiAqIGludm9raW5nIFtleGl0XS4KICoKICogVGhlIGhhbmRsaW5nIG9mIGV4aXQgY29kZXMgaXMgcGxhdGZvcm0gc3BlY2lmaWMuCiAqCiAqIE9uIExpbnV4IGFuZCBPUyBYIGFuIGV4aXQgY29kZSBmb3Igbm9ybWFsIHRlcm1pbmF0aW9uIHdpbGwgYWx3YXlzCiAqIGJlIGluIHRoZSByYW5nZSBbMC4uMjU1XS4gSWYgYW4gZXhpdCBjb2RlIG91dHNpZGUgdGhpcyByYW5nZSBpcwogKiBzZXQgdGhlIGFjdHVhbCBleGl0IGNvZGUgd2lsbCBiZSB0aGUgbG93ZXIgOCBiaXRzIG1hc2tlZCBvZmYgYW5kCiAqIHRyZWF0ZWQgYXMgYW4gdW5zaWduZWQgdmFsdWUuIEUuZy4gdXNpbmcgYW4gZXhpdCBjb2RlIG9mIC0xIHdpbGwKICogcmVzdWx0IGluIGFuIGFjdHVhbCBleGl0IGNvZGUgb2YgMjU1IGJlaW5nIHJlcG9ydGVkLgogKgogKiBPbiBXaW5kb3dzIHRoZSBleGl0IGNvZGUgY2FuIGJlIHNldCB0byBhbnkgMzItYml0IHZhbHVlLiBIb3dldmVyCiAqIHNvbWUgb2YgdGhlc2UgdmFsdWVzIGFyZSByZXNlcnZlZCBmb3IgcmVwb3J0aW5nIHN5c3RlbSBlcnJvcnMgbGlrZQogKiBjcmFzaGVzLgogKgogKiBCZXNpZGVzIHRoaXMgdGhlIERhcnQgZXhlY3V0YWJsZSBpdHNlbGYgdXNlcyBhbiBleGl0IGNvZGUgb2YgYDI1NGAKICogZm9yIHJlcG9ydGluZyBjb21waWxlIHRpbWUgZXJyb3JzIGFuZCBhbiBleGl0IGNvZGUgb2YgYDI1NWAgZm9yCiAqIHJlcG9ydGluZyBydW50aW1lIGVycm9yICh1bmhhbmRsZWQgZXhjZXB0aW9uKS4KICoKICogRHVlIHRvIHRoZXNlIGZhY3RzIGl0IGlzIHJlY29tbWVuZGVkIHRvIG9ubHkgdXNlIGV4aXQgY29kZXMgaW4gdGhlCiAqIHJhbmdlIFswLi4xMjddIGZvciBjb21tdW5pY2F0aW5nIHRoZSByZXN1bHQgb2YgcnVubmluZyBhIERhcnQKICogcHJvZ3JhbSB0byB0aGUgc3Vycm91bmRpbmcgZW52aXJvbm1lbnQuIFRoaXMgd2lsbCBhdm9pZCBhbnkKICogY3Jvc3MtcGxhdGZvcm0gaXNzdWVzLgogKi8Kdm9pZCBleGl0KGludCBjb2RlKSB7CiAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoY29kZSwgImNvZGUiKTsKICBpZiAoIV9FbWJlZGRlckNvbmZpZy5fbWF5RXhpdCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIlRoaXMgZW1iZWRkZXIgZGlzYWxsb3dzIGNhbGxpbmcgZGFydDppbydzIGV4aXQoKSIpOwogIH0KICBfUHJvY2Vzc1V0aWxzLl9leGl0KGNvZGUpOwp9CgovKioKICogU2V0IHRoZSBnbG9iYWwgZXhpdCBjb2RlIGZvciB0aGUgRGFydCBWTS4KICoKICogVGhlIGV4aXQgY29kZSBpcyBnbG9iYWwgZm9yIHRoZSBEYXJ0IFZNIGFuZCB0aGUgbGFzdCBhc3NpZ25tZW50IHRvCiAqIGV4aXRDb2RlIGZyb20gYW55IGlzb2xhdGUgZGV0ZXJtaW5lcyB0aGUgZXhpdCBjb2RlIG9mIHRoZSBEYXJ0IFZNCiAqIG9uIG5vcm1hbCB0ZXJtaW5hdGlvbi4KICoKICogRGVmYXVsdCB2YWx1ZSBpcyBgMGAuCiAqCiAqIFNlZSBbZXhpdF0gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGNob3NlIGEgdmFsdWUgZm9yIHRoZQogKiBleGl0IGNvZGUuCiAqLwp2b2lkIHNldCBleGl0Q29kZShpbnQgY29kZSkgewogIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKGNvZGUsICJjb2RlIik7CiAgX1Byb2Nlc3NVdGlscy5fc2V0RXhpdENvZGUoY29kZSk7Cn0KCi8qKgogKiBHZXQgdGhlIGdsb2JhbCBleGl0IGNvZGUgZm9yIHRoZSBEYXJ0IFZNLgogKgogKiBUaGUgZXhpdCBjb2RlIGlzIGdsb2JhbCBmb3IgdGhlIERhcnQgVk0gYW5kIHRoZSBsYXN0IGFzc2lnbm1lbnQgdG8KICogZXhpdENvZGUgZnJvbSBhbnkgaXNvbGF0ZSBkZXRlcm1pbmVzIHRoZSBleGl0IGNvZGUgb2YgdGhlIERhcnQgVk0KICogb24gbm9ybWFsIHRlcm1pbmF0aW9uLgogKgogKiBTZWUgW2V4aXRdIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjaG9zZSBhIHZhbHVlIGZvciB0aGUKICogZXhpdCBjb2RlLgogKi8KaW50IGdldCBleGl0Q29kZSA9PiBfUHJvY2Vzc1V0aWxzLl9nZXRFeGl0Q29kZSgpOwoKLyoqCiAqIFNsZWVwIGZvciB0aGUgZHVyYXRpb24gc3BlY2lmaWVkIGluIFtkdXJhdGlvbl0uCiAqCiAqIFVzZSB0aGlzIHdpdGggY2FyZSwgYXMgbm8gYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgY2FuIGJlIHByb2Nlc3NlZAogKiBpbiBhIGlzb2xhdGUgd2hpbGUgaXQgaXMgYmxvY2tlZCBpbiBhIFtzbGVlcF0gY2FsbC4KICovCnZvaWQgc2xlZXAoRHVyYXRpb24gZHVyYXRpb24pIHsKICBpbnQgbWlsbGlzZWNvbmRzID0gZHVyYXRpb24uaW5NaWxsaXNlY29uZHM7CiAgaWYgKG1pbGxpc2Vjb25kcyA8IDApIHsKICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJzbGVlcDogZHVyYXRpb24gY2Fubm90IGJlIG5lZ2F0aXZlIik7CiAgfQogIGlmICghX0VtYmVkZGVyQ29uZmlnLl9tYXlTbGVlcCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIlRoaXMgZW1iZWRkZXIgZGlzYWxsb3dzIGNhbGxpbmcgZGFydDppbydzIHNsZWVwKCkiKTsKICB9CiAgX1Byb2Nlc3NVdGlscy5fc2xlZXAobWlsbGlzZWNvbmRzKTsKfQoKLyoqCiAqIFJldHVybnMgdGhlIFBJRCBvZiB0aGUgY3VycmVudCBwcm9jZXNzLgogKi8KaW50IGdldCBwaWQgPT4gX1Byb2Nlc3NVdGlscy5fcGlkKG51bGwpOwoKLyoqCiAqIFtQcm9jZXNzSW5mb10gcHJvdmlkZXMgbWV0aG9kcyBmb3IgcmV0cmlldmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKICogY3VycmVudCBwcm9jZXNzLgogKi8KY2xhc3MgUHJvY2Vzc0luZm8gewogIC8qKgogICAqIFRoZSBjdXJyZW50IHJlc2lkZW50IHNldCBzaXplIG9mIG1lbW9yeSBmb3IgdGhlIHByb2Nlc3MuCiAgICoKICAgKiBOb3RlIHRoYXQgdGhlIG1lYW5pbmcgb2YgdGhpcyBmaWVsZCBpcyBwbGF0Zm9ybSBkZXBlbmRlbnQuIEZvciBleGFtcGxlLAogICAqIHNvbWUgbWVtb3J5IGFjY291bnRlZCBmb3IgaGVyZSBtYXkgYmUgc2hhcmVkIHdpdGggb3RoZXIgcHJvY2Vzc2VzLCBvciBpZgogICAqIHRoZSBzYW1lIHBhZ2UgaXMgbWFwcGVkIGludG8gYSBwcm9jZXNzJ3MgYWRkcmVzcyBzcGFjZSwgaXQgbWF5IGJlIGNvdW50ZWQKICAgKiB0d2ljZS4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgaW50IGdldCBjdXJyZW50UnNzOwoKICAvKioKICAgKiBUaGUgaGlnaC13YXRlcm1hcmsgaW4gYnl0ZXMgZm9yIHRoZSByZXNpZGVudCBzZXQgc2l6ZSBvZiBtZW1vcnkgZm9yIHRoZQogICAqIHByb2Nlc3MuCiAgICoKICAgKiBOb3RlIHRoYXQgdGhlIG1lYW5pbmcgb2YgdGhpcyBmaWVsZCBpcyBwbGF0Zm9ybSBkZXBlbmRlbnQuIEZvciBleGFtcGxlLAogICAqIHNvbWUgbWVtb3J5IGFjY291bnRlZCBmb3IgaGVyZSBtYXkgYmUgc2hhcmVkIHdpdGggb3RoZXIgcHJvY2Vzc2VzLCBvciBpZgogICAqIHRoZSBzYW1lIHBhZ2UgaXMgbWFwcGVkIGludG8gYSBwcm9jZXNzJ3MgYWRkcmVzcyBzcGFjZSwgaXQgbWF5IGJlIGNvdW50ZWQKICAgKiB0d2ljZS4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgaW50IGdldCBtYXhSc3M7Cn0KCi8qKgogKiBNb2RlcyBmb3IgcnVubmluZyBhIG5ldyBwcm9jZXNzLgogKi8KY2xhc3MgUHJvY2Vzc1N0YXJ0TW9kZSB7CiAgLy8vIE5vcm1hbCBjaGlsZCBwcm9jZXNzLgogIHN0YXRpYyBjb25zdCBub3JtYWwgPSBjb25zdCBQcm9jZXNzU3RhcnRNb2RlLl9pbnRlcm5hbCgwKTsKICBARGVwcmVjYXRlZCgiVXNlIG5vcm1hbCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgTk9STUFMID0gbm9ybWFsOwoKICAvLy8gU3RkaW8gaGFuZGxlcyBhcmUgaW5oZXJpdGVkIGJ5IHRoZSBjaGlsZCBwcm9jZXNzLgogIHN0YXRpYyBjb25zdCBpbmhlcml0U3RkaW8gPSBjb25zdCBQcm9jZXNzU3RhcnRNb2RlLl9pbnRlcm5hbCgxKTsKICBARGVwcmVjYXRlZCgiVXNlIGluaGVyaXRTdGRpbyBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgSU5IRVJJVF9TVERJTyA9IGluaGVyaXRTdGRpbzsKCiAgLy8vIERldGFjaGVkIGNoaWxkIHByb2Nlc3Mgd2l0aCBubyBvcGVuIGNvbW11bmljYXRpb24gY2hhbm5lbC4KICBzdGF0aWMgY29uc3QgZGV0YWNoZWQgPSBjb25zdCBQcm9jZXNzU3RhcnRNb2RlLl9pbnRlcm5hbCgyKTsKICBARGVwcmVjYXRlZCgiVXNlIGRldGFjaGVkIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBERVRBQ0hFRCA9IGRldGFjaGVkOwoKICAvLy8gRGV0YWNoZWQgY2hpbGQgcHJvY2VzcyB3aXRoIHN0ZGluLCBzdGRvdXQgYW5kIHN0ZGVyciBzdGlsbCBvcGVuCiAgLy8vIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGNoaWxkLgogIHN0YXRpYyBjb25zdCBkZXRhY2hlZFdpdGhTdGRpbyA9IGNvbnN0IFByb2Nlc3NTdGFydE1vZGUuX2ludGVybmFsKDMpOwogIEBEZXByZWNhdGVkKCJVc2UgZGV0YWNoZWRXaXRoU3RkaW8gaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IERFVEFDSEVEX1dJVEhfU1RESU8gPSBkZXRhY2hlZFdpdGhTdGRpbzsKCiAgc3RhdGljIExpc3Q8UHJvY2Vzc1N0YXJ0TW9kZT4gZ2V0IHZhbHVlcyA9PiBjb25zdCA8UHJvY2Vzc1N0YXJ0TW9kZT5bCiAgICAgICAgbm9ybWFsLAogICAgICAgIGluaGVyaXRTdGRpbywKICAgICAgICBkZXRhY2hlZCwKICAgICAgICBkZXRhY2hlZFdpdGhTdGRpbwogICAgICBdOwogIFN0cmluZyB0b1N0cmluZygpID0+CiAgICAgIGNvbnN0IFsibm9ybWFsIiwgImluaGVyaXRTdGRpbyIsICJkZXRhY2hlZCIsICJkZXRhY2hlZFdpdGhTdGRpbyJdW19tb2RlXTsKCiAgZmluYWwgaW50IF9tb2RlOwogIGNvbnN0IFByb2Nlc3NTdGFydE1vZGUuX2ludGVybmFsKHRoaXMuX21vZGUpOwp9CgovKioKICogVGhlIG1lYW5zIHRvIGV4ZWN1dGUgYSBwcm9ncmFtLgogKgogKiBVc2UgdGhlIHN0YXRpYyBbc3RhcnRdIGFuZCBbcnVuXSBtZXRob2RzIHRvIHN0YXJ0IGEgbmV3IHByb2Nlc3MuCiAqIFRoZSBydW4gbWV0aG9kIGV4ZWN1dGVzIHRoZSBwcm9jZXNzIG5vbi1pbnRlcmFjdGl2ZWx5IHRvIGNvbXBsZXRpb24uCiAqIEluIGNvbnRyYXN0LCB0aGUgc3RhcnQgbWV0aG9kIGFsbG93cyB5b3VyIGNvZGUgdG8gaW50ZXJhY3Qgd2l0aCB0aGUKICogcnVubmluZyBwcm9jZXNzLgogKgogKiAjIyBTdGFydCBhIHByb2Nlc3Mgd2l0aCB0aGUgcnVuIG1ldGhvZAogKgogKiBUaGUgZm9sbG93aW5nIGNvZGUgc2FtcGxlIHVzZXMgdGhlIHJ1biBtZXRob2QgdG8gY3JlYXRlIGEgcHJvY2VzcwogKiB0aGF0IHJ1bnMgdGhlIFVOSVggY29tbWFuZCBgbHNgLCB3aGljaCBsaXN0cyB0aGUgY29udGVudHMgb2YgYSBkaXJlY3RvcnkuCiAqIFRoZSBydW4gbWV0aG9kIGNvbXBsZXRlcyB3aXRoIGEgW1Byb2Nlc3NSZXN1bHRdIG9iamVjdCB3aGVuIHRoZSBwcm9jZXNzCiAqIHRlcm1pbmF0ZXMuIFRoaXMgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBvdXRwdXQgYW5kIGV4aXQgY29kZSBmcm9tIHRoZQogKiBwcm9jZXNzLiBUaGUgcnVuIG1ldGhvZCBkb2VzIG5vdCByZXR1cm4gYSBQcm9jZXNzIG9iamVjdDsgdGhpcyBwcmV2ZW50cyB5b3VyCiAqIGNvZGUgZnJvbSBpbnRlcmFjdGluZyB3aXRoIHRoZSBydW5uaW5nIHByb2Nlc3MuCiAqCiAqICAgICBpbXBvcnQgJ2RhcnQ6aW8nOwogKgogKiAgICAgbWFpbigpIHsKICogICAgICAgLy8gTGlzdCBhbGwgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGluIFVOSVgtbGlrZSBzeXN0ZW1zLgogKiAgICAgICBQcm9jZXNzLnJ1bignbHMnLCBbJy1sJ10pLnRoZW4oKFByb2Nlc3NSZXN1bHQgcmVzdWx0cykgewogKiAgICAgICAgIHByaW50KHJlc3VsdHMuc3Rkb3V0KTsKICogICAgICAgfSk7CiAqICAgICB9CiAqCiAqICMjIFN0YXJ0IGEgcHJvY2VzcyB3aXRoIHRoZSBzdGFydCBtZXRob2QKICoKICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHVzZXMgc3RhcnQgdG8gY3JlYXRlIHRoZSBwcm9jZXNzLgogKiBUaGUgc3RhcnQgbWV0aG9kIHJldHVybnMgYSBbRnV0dXJlXSBmb3IgYSBQcm9jZXNzIG9iamVjdC4KICogV2hlbiB0aGUgZnV0dXJlIGNvbXBsZXRlcyB0aGUgcHJvY2VzcyBpcyBzdGFydGVkIGFuZAogKiB5b3VyIGNvZGUgY2FuIGludGVyYWN0IHdpdGggdGhlCiAqIFByb2Nlc3M6IHdyaXRpbmcgdG8gc3RkaW4sIGxpc3RlbmluZyB0byBzdGRvdXQsIGFuZCBzbyBvbi4KICoKICogVGhlIGZvbGxvd2luZyBzYW1wbGUgc3RhcnRzIHRoZSBVTklYIGBjYXRgIHV0aWxpdHksIHdoaWNoIHdoZW4gZ2l2ZW4gbm8KICogY29tbWFuZC1saW5lIGFyZ3VtZW50cywgZWNob3MgaXRzIGlucHV0LgogKiBUaGUgcHJvZ3JhbSB3cml0ZXMgdG8gdGhlIHByb2Nlc3MncyBzdGFuZGFyZCBpbnB1dCBzdHJlYW0KICogYW5kIHByaW50cyBkYXRhIGZyb20gaXRzIHN0YW5kYXJkIG91dHB1dCBzdHJlYW0uCiAqCiAqICAgICBpbXBvcnQgJ2RhcnQ6aW8nOwogKiAgICAgaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwogKgogKiAgICAgbWFpbigpIHsKICogICAgICAgUHJvY2Vzcy5zdGFydCgnY2F0JywgW10pLnRoZW4oKFByb2Nlc3MgcHJvY2VzcykgewogKiAgICAgICAgIHByb2Nlc3Muc3Rkb3V0CiAqICAgICAgICAgICAgIC50cmFuc2Zvcm0odXRmOC5kZWNvZGVyKQogKiAgICAgICAgICAgICAubGlzdGVuKChkYXRhKSB7IHByaW50KGRhdGEpOyB9KTsKICogICAgICAgICBwcm9jZXNzLnN0ZGluLndyaXRlbG4oJ0hlbGxvLCB3b3JsZCEnKTsKICogICAgICAgICBwcm9jZXNzLnN0ZGluLndyaXRlbG4oJ0hlbGxvLCBnYWxheHkhJyk7CiAqICAgICAgICAgcHJvY2Vzcy5zdGRpbi53cml0ZWxuKCdIZWxsbywgdW5pdmVyc2UhJyk7CiAqICAgICAgIH0pOwogKiAgICAgfQogKgogKiAjIyBTdGFuZGFyZCBJL08gc3RyZWFtcwogKgogKiBBcyBzZWVuIGluIHRoZSBwcmV2aW91cyBjb2RlIHNhbXBsZSwgeW91IGNhbiBpbnRlcmFjdCB3aXRoIHRoZSBQcm9jZXNzJ3MKICogc3RhbmRhcmQgb3V0cHV0IHN0cmVhbSB0aHJvdWdoIHRoZSBnZXR0ZXIgW3N0ZG91dF0sCiAqIGFuZCB5b3UgY2FuIGludGVyYWN0IHdpdGggdGhlIFByb2Nlc3MncyBzdGFuZGFyZCBpbnB1dCBzdHJlYW0gdGhyb3VnaAogKiB0aGUgZ2V0dGVyIFtzdGRpbl0uCiAqIEluIGFkZGl0aW9uLCBQcm9jZXNzIHByb3ZpZGVzIGEgZ2V0dGVyIFtzdGRlcnJdIGZvciB1c2luZyB0aGUgUHJvY2VzcydzCiAqIHN0YW5kYXJkIGVycm9yIHN0cmVhbS4KICoKICogQSBQcm9jZXNzJ3Mgc3RyZWFtcyBhcmUgZGlzdGluY3QgZnJvbSB0aGUgdG9wLWxldmVsIHN0cmVhbXMKICogZm9yIHRoZSBjdXJyZW50IHByb2dyYW0uCiAqCiAqICMjIEV4aXQgY29kZXMKICoKICogQ2FsbCB0aGUgW2V4aXRDb2RlXSBtZXRob2QgdG8gZ2V0IHRoZSBleGl0IGNvZGUgb2YgdGhlIHByb2Nlc3MuCiAqIFRoZSBleGl0IGNvZGUgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHByb2dyYW0gdGVybWluYXRlZCBzdWNjZXNzZnVsbHkKICogKHVzdWFsbHkgaW5kaWNhdGVkIHdpdGggYW4gZXhpdCBjb2RlIG9mIDApIG9yIHdpdGggYW4gZXJyb3IuCiAqCiAqIElmIHRoZSBzdGFydCBtZXRob2QgaXMgdXNlZCwgdGhlIGV4aXRDb2RlIGlzIGF2YWlsYWJsZSB0aHJvdWdoIGEgZnV0dXJlCiAqIG9uIHRoZSBQcm9jZXNzIG9iamVjdCAoYXMgc2hvd24gaW4gdGhlIGV4YW1wbGUgYmVsb3cpLgogKiBJZiB0aGUgcnVuIG1ldGhvZCBpcyB1c2VkLCB0aGUgZXhpdENvZGUgaXMgYXZhaWxhYmxlCiAqIHRocm91Z2ggYSBnZXR0ZXIgb24gdGhlIFByb2Nlc3NSZXN1bHQgaW5zdGFuY2UuCiAqCiAqICAgICBpbXBvcnQgJ2RhcnQ6aW8nOwogKgogKiAgICAgbWFpbigpIHsKICogICAgICAgUHJvY2Vzcy5zdGFydCgnbHMnLCBbJy1sJ10pLnRoZW4oKHByb2Nlc3MpIHsKICogICAgICAgICAvLyBHZXQgdGhlIGV4aXQgY29kZSBmcm9tIHRoZSBuZXcgcHJvY2Vzcy4KICogICAgICAgICBwcm9jZXNzLmV4aXRDb2RlLnRoZW4oKGV4aXRDb2RlKSB7CiAqICAgICAgICAgICBwcmludCgnZXhpdCBjb2RlOiAkZXhpdENvZGUnKTsKICogICAgICAgICB9KTsKICogICAgICAgfSk7CiAqICAgICB9CiAqCiAqICMjIE90aGVyIHJlc291cmNlcwogKgogKiBbRGFydCBieSBFeGFtcGxlXShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZGFydC1ieS1leGFtcGxlLyNkYXJ0LWlvLWFuZC1jb21tYW5kLWxpbmUtYXBwcykKICogcHJvdmlkZXMgYWRkaXRpb25hbCB0YXNrLW9yaWVudGVkIGNvZGUgc2FtcGxlcyB0aGF0IHNob3cgaG93IHRvIHVzZQogKiB2YXJpb3VzIEFQSSBmcm9tIHRoZSBbZGFydDppb10gbGlicmFyeS4KICovCmFic3RyYWN0IGNsYXNzIFByb2Nlc3MgewogIC8qKgogICAqIFJldHVybnMgYSBbOkZ1dHVyZTpdIHdoaWNoIGNvbXBsZXRlcyB3aXRoIHRoZSBleGl0IGNvZGUgb2YgdGhlIHByb2Nlc3MKICAgKiB3aGVuIHRoZSBwcm9jZXNzIGNvbXBsZXRlcy4KICAgKgogICAqIFRoZSBoYW5kbGluZyBvZiBleGl0IGNvZGVzIGlzIHBsYXRmb3JtIHNwZWNpZmljLgogICAqCiAgICogT24gTGludXggYW5kIE9TIFggYSBub3JtYWwgZXhpdCBjb2RlIHdpbGwgYmUgYSBwb3NpdGl2ZSB2YWx1ZSBpbgogICAqIHRoZSByYW5nZSBbMC4uMjU1XS4gSWYgdGhlIHByb2Nlc3Mgd2FzIHRlcm1pbmF0ZWQgZHVlIHRvIGEgc2lnbmFsCiAgICogdGhlIGV4aXQgY29kZSB3aWxsIGJlIGEgbmVnYXRpdmUgdmFsdWUgaW4gdGhlIHJhbmdlIFstMjU1Li4tMV0sCiAgICogd2hlcmUgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBleGl0IGNvZGUgaXMgdGhlIHNpZ25hbAogICAqIG51bWJlci4gRm9yIGV4YW1wbGUsIGlmIGEgcHJvY2VzcyBjcmFzaGVzIGR1ZSB0byBhIHNlZ21lbnRhdGlvbgogICAqIHZpb2xhdGlvbiB0aGUgZXhpdCBjb2RlIHdpbGwgYmUgLTExLCBhcyB0aGUgc2lnbmFsIFNJR1NFR1YgaGFzIHRoZQogICAqIG51bWJlciAxMS4KICAgKgogICAqIE9uIFdpbmRvd3MgYSBwcm9jZXNzIGNhbiByZXBvcnQgYW55IDMyLWJpdCB2YWx1ZSBhcyBhbiBleGl0CiAgICogY29kZS4gV2hlbiByZXR1cm5pbmcgdGhlIGV4aXQgY29kZSB0aGlzIGV4aXQgY29kZSBpcyB0dXJuZWQgaW50bwogICAqIGEgc2lnbmVkIHZhbHVlLiBTb21lIHNwZWNpYWwgdmFsdWVzIGFyZSB1c2VkIHRvIHJlcG9ydAogICAqIHRlcm1pbmF0aW9uIGR1ZSB0byBzb21lIHN5c3RlbSBldmVudC4gRS5nLiBpZiBhIHByb2Nlc3MgY3Jhc2hlcwogICAqIGR1ZSB0byBhbiBhY2Nlc3MgdmlvbGF0aW9uIHRoZSAzMi1iaXQgZXhpdCBjb2RlIGlzIGAweGMwMDAwMDA1YCwKICAgKiB3aGljaCB3aWxsIGJlIHJldHVybmVkIGFzIHRoZSBuZWdhdGl2ZSBudW1iZXIgYC0xMDczNzQxODE5YC4gVG8KICAgKiBnZXQgdGhlIG9yaWdpbmFsIDMyLWJpdCB2YWx1ZSB1c2UgYCgweDEwMDAwMDAwMCArIGV4aXRDb2RlKSAmCiAgICogMHhmZmZmZmZmZmAuCiAgICoKICAgKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBbc3Rkb3V0XSBhbmQgW3N0ZGVycl0gaGF2ZSBmaW5pc2hlZCByZXBvcnRpbmcKICAgKiB0aGUgYnVmZmVyZWQgb3V0cHV0IG9mIHRoZSBwcm9jZXNzIHdoZW4gdGhlIHJldHVybmVkIGZ1dHVyZSBjb21wbGV0ZXMuCiAgICogVG8gYmUgc3VyZSB0aGF0IGFsbCBvdXRwdXQgaXMgY2FwdHVyZWQsCiAgICogd2FpdCBmb3IgdGhlIGRvbmUgZXZlbnQgb24gdGhlIHN0cmVhbXMuCiAgICovCiAgRnV0dXJlPGludD4gZ2V0IGV4aXRDb2RlOwoKICAvKioKICAgKiBTdGFydHMgYSBwcm9jZXNzIHJ1bm5pbmcgdGhlIFtleGVjdXRhYmxlXSB3aXRoIHRoZSBzcGVjaWZpZWQKICAgKiBbYXJndW1lbnRzXS4gUmV0dXJucyBhIFs6RnV0dXJlPFByb2Nlc3M+Ol0gdGhhdCBjb21wbGV0ZXMgd2l0aCBhCiAgICogUHJvY2VzcyBpbnN0YW5jZSB3aGVuIHRoZSBwcm9jZXNzIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseQogICAqIHN0YXJ0ZWQuIFRoYXQgW1Byb2Nlc3NdIG9iamVjdCBjYW4gYmUgdXNlZCB0byBpbnRlcmFjdCB3aXRoIHRoZQogICAqIHByb2Nlc3MuIElmIHRoZSBwcm9jZXNzIGNhbm5vdCBiZSBzdGFydGVkIHRoZSByZXR1cm5lZCBbRnV0dXJlXQogICAqIGNvbXBsZXRlcyB3aXRoIGFuIGV4Y2VwdGlvbi4KICAgKgogICAqIFVzZSBbd29ya2luZ0RpcmVjdG9yeV0gdG8gc2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIHByb2Nlc3MuIE5vdGUKICAgKiB0aGF0IHRoZSBjaGFuZ2Ugb2YgZGlyZWN0b3J5IG9jY3VycyBiZWZvcmUgZXhlY3V0aW5nIHRoZSBwcm9jZXNzIG9uIHNvbWUKICAgKiBwbGF0Zm9ybXMsIHdoaWNoIG1heSBoYXZlIGltcGFjdCB3aGVuIHVzaW5nIHJlbGF0aXZlIHBhdGhzIGZvciB0aGUKICAgKiBleGVjdXRhYmxlIGFuZCB0aGUgYXJndW1lbnRzLgogICAqCiAgICogVXNlIFtlbnZpcm9ubWVudF0gdG8gc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHRoZSBwcm9jZXNzLiBJZiBub3QKICAgKiBzZXQgdGhlIGVudmlyb25tZW50IG9mIHRoZSBwYXJlbnQgcHJvY2VzcyBpcyBpbmhlcml0ZWQuIEN1cnJlbnRseSwgb25seQogICAqIFVTLUFTQ0lJIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc3VwcG9ydGVkIGFuZCBlcnJvcnMgYXJlIGxpa2VseSB0byBvY2N1cgogICAqIGlmIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHdpdGggY29kZS1wb2ludHMgb3V0c2lkZSB0aGUgVVMtQVNDSUkgcmFuZ2UgaXMKICAgKiBwYXNzZWQgaW4uCiAgICoKICAgKiBJZiBbaW5jbHVkZVBhcmVudEVudmlyb25tZW50XSBpcyBgdHJ1ZWAsIHRoZSBwcm9jZXNzJ3MgZW52aXJvbm1lbnQgd2lsbAogICAqIGluY2x1ZGUgdGhlIHBhcmVudCBwcm9jZXNzJ3MgZW52aXJvbm1lbnQsIHdpdGggW2Vudmlyb25tZW50XSB0YWtpbmcKICAgKiBwcmVjZWRlbmNlLiBEZWZhdWx0IGlzIGB0cnVlYC4KICAgKgogICAqIElmIFtydW5JblNoZWxsXSBpcyBgdHJ1ZWAsIHRoZSBwcm9jZXNzIHdpbGwgYmUgc3Bhd25lZCB0aHJvdWdoIGEgc3lzdGVtCiAgICogc2hlbGwuIE9uIExpbnV4IGFuZCBPUyBYLCBbOi9iaW4vc2g6XSBpcyB1c2VkLCB3aGlsZQogICAqIFs6JVdJTkRJUiVcc3lzdGVtMzJcY21kLmV4ZTpdIGlzIHVzZWQgb24gV2luZG93cy4KICAgKgogICAqIFVzZXJzIG11c3QgcmVhZCBhbGwgZGF0YSBjb21pbmcgb24gdGhlIFtzdGRvdXRdIGFuZCBbc3RkZXJyXQogICAqIHN0cmVhbXMgb2YgcHJvY2Vzc2VzIHN0YXJ0ZWQgd2l0aCBbOlByb2Nlc3Muc3RhcnQ6XS4gSWYgdGhlIHVzZXIKICAgKiBkb2VzIG5vdCByZWFkIGFsbCBkYXRhIG9uIHRoZSBzdHJlYW1zIHRoZSB1bmRlcmx5aW5nIHN5c3RlbQogICAqIHJlc291cmNlcyB3aWxsIG5vdCBiZSByZWxlYXNlZCBzaW5jZSB0aGVyZSBpcyBzdGlsbCBwZW5kaW5nIGRhdGEuCiAgICoKICAgKiBUaGUgZm9sbG93aW5nIGNvZGUgdXNlcyBgUHJvY2Vzcy5zdGFydGAgdG8gZ3JlcCBmb3IgYG1haW5gIGluIHRoZQogICAqIGZpbGUgYHRlc3QuZGFydGAgb24gTGludXguCiAgICoKICAgKiAgICAgUHJvY2Vzcy5zdGFydCgnZ3JlcCcsIFsnLWknLCAnbWFpbicsICd0ZXN0LmRhcnQnXSkudGhlbigocHJvY2VzcykgewogICAqICAgICAgIHN0ZG91dC5hZGRTdHJlYW0ocHJvY2Vzcy5zdGRvdXQpOwogICAqICAgICAgIHN0ZGVyci5hZGRTdHJlYW0ocHJvY2Vzcy5zdGRlcnIpOwogICAqICAgICB9KTsKICAgKgogICAqIElmIFttb2RlXSBpcyBbUHJvY2Vzc1N0YXJ0TW9kZS5ub3JtYWxdICh0aGUgZGVmYXVsdCkgYSBjaGlsZAogICAqIHByb2Nlc3Mgd2lsbCBiZSBzdGFydGVkIHdpdGggYHN0ZGluYCwgYHN0ZG91dGAgYW5kIGBzdGRlcnJgCiAgICogY29ubmVjdGVkLgogICAqCiAgICogSWYgYG1vZGVgIGlzIFtQcm9jZXNzU3RhcnRNb2RlLmRldGFjaGVkXSBhIGRldGFjaGVkIHByb2Nlc3Mgd2lsbAogICAqIGJlIGNyZWF0ZWQuIEEgZGV0YWNoZWQgcHJvY2VzcyBoYXMgbm8gY29ubmVjdGlvbiB0byBpdHMgcGFyZW50LAogICAqIGFuZCBjYW4ga2VlcCBydW5uaW5nIG9uIGl0cyBvd24gd2hlbiB0aGUgcGFyZW50IGRpZXMuIFRoZSBvbmx5CiAgICogaW5mb3JtYXRpb24gYXZhaWxhYmxlIGZyb20gYSBkZXRhY2hlZCBwcm9jZXNzIGlzIGl0cyBgcGlkYC4gVGhlcmUKICAgKiBpcyBubyBjb25uZWN0aW9uIHRvIGl0cyBgc3RkaW5gLCBgc3Rkb3V0YCBvciBgc3RkZXJyYCwgbm9yIHdpbGwKICAgKiB0aGUgcHJvY2VzcycgZXhpdCBjb2RlIGJlY29tZSBhdmFpbGFibGUgd2hlbiBpdCB0ZXJtaW5hdGVzLgogICAqCiAgICogSWYgYG1vZGVgIGlzIFtQcm9jZXNzU3RhcnRNb2RlLmRldGFjaGVkV2l0aFN0ZGlvXSBhIGRldGFjaGVkCiAgICogcHJvY2VzcyB3aWxsIGJlIGNyZWF0ZWQgd2hlcmUgdGhlIGBzdGRpbmAsIGBzdGRvdXRgIGFuZCBgc3RkZXJyYAogICAqIGFyZSBjb25uZWN0ZWQuIFRoZSBjcmVhdG9yIGNhbiBjb21tdW5pY2F0ZSB3aXRoIHRoZSBjaGlsZCB0aHJvdWdoCiAgICogdGhlc2UuIFRoZSBkZXRhY2hlZCBwcm9jZXNzIHdpbGwga2VlcCBydW5uaW5nIGV2ZW4gaWYgdGhlc2UKICAgKiBjb21tdW5pY2F0aW9uIGNoYW5uZWxzIGFyZSBjbG9zZWQuIFRoZSBwcm9jZXNzJyBleGl0IGNvZGUgd2lsbAogICAqIG5vdCBiZWNvbWUgYXZhaWxhYmxlIHdoZW4gaXQgdGVybWluYXRlZC4KICAgKgogICAqIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBgbW9kZWAgaXMgYFByb2Nlc3NTdGFydE1vZGUubm9ybWFsYC4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgRnV0dXJlPFByb2Nlc3M+IHN0YXJ0KAogICAgICBTdHJpbmcgZXhlY3V0YWJsZSwgTGlzdDxTdHJpbmc+IGFyZ3VtZW50cywKICAgICAge1N0cmluZyB3b3JraW5nRGlyZWN0b3J5LAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50LAogICAgICBib29sIGluY2x1ZGVQYXJlbnRFbnZpcm9ubWVudDogdHJ1ZSwKICAgICAgYm9vbCBydW5JblNoZWxsOiBmYWxzZSwKICAgICAgUHJvY2Vzc1N0YXJ0TW9kZSBtb2RlOiBQcm9jZXNzU3RhcnRNb2RlLm5vcm1hbH0pOwoKICAvKioKICAgKiBTdGFydHMgYSBwcm9jZXNzIGFuZCBydW5zIGl0IG5vbi1pbnRlcmFjdGl2ZWx5IHRvIGNvbXBsZXRpb24uIFRoZQogICAqIHByb2Nlc3MgcnVuIGlzIFtleGVjdXRhYmxlXSB3aXRoIHRoZSBzcGVjaWZpZWQgW2FyZ3VtZW50c10uCiAgICoKICAgKiBVc2UgW3dvcmtpbmdEaXJlY3RvcnldIHRvIHNldCB0aGUgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBwcm9jZXNzLiBOb3RlCiAgICogdGhhdCB0aGUgY2hhbmdlIG9mIGRpcmVjdG9yeSBvY2N1cnMgYmVmb3JlIGV4ZWN1dGluZyB0aGUgcHJvY2VzcyBvbiBzb21lCiAgICogcGxhdGZvcm1zLCB3aGljaCBtYXkgaGF2ZSBpbXBhY3Qgd2hlbiB1c2luZyByZWxhdGl2ZSBwYXRocyBmb3IgdGhlCiAgICogZXhlY3V0YWJsZSBhbmQgdGhlIGFyZ3VtZW50cy4KICAgKgogICAqIFVzZSBbZW52aXJvbm1lbnRdIHRvIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0aGUgcHJvY2Vzcy4gSWYgbm90CiAgICogc2V0IHRoZSBlbnZpcm9ubWVudCBvZiB0aGUgcGFyZW50IHByb2Nlc3MgaXMgaW5oZXJpdGVkLiBDdXJyZW50bHksIG9ubHkKICAgKiBVUy1BU0NJSSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHN1cHBvcnRlZCBhbmQgZXJyb3JzIGFyZSBsaWtlbHkgdG8gb2NjdXIKICAgKiBpZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRoIGNvZGUtcG9pbnRzIG91dHNpZGUgdGhlIFVTLUFTQ0lJIHJhbmdlIGlzCiAgICogcGFzc2VkIGluLgogICAqCiAgICogSWYgW2luY2x1ZGVQYXJlbnRFbnZpcm9ubWVudF0gaXMgYHRydWVgLCB0aGUgcHJvY2VzcydzIGVudmlyb25tZW50IHdpbGwKICAgKiBpbmNsdWRlIHRoZSBwYXJlbnQgcHJvY2VzcydzIGVudmlyb25tZW50LCB3aXRoIFtlbnZpcm9ubWVudF0gdGFraW5nCiAgICogcHJlY2VkZW5jZS4gRGVmYXVsdCBpcyBgdHJ1ZWAuCiAgICoKICAgKiBJZiBbcnVuSW5TaGVsbF0gaXMgdHJ1ZSwgdGhlIHByb2Nlc3Mgd2lsbCBiZSBzcGF3bmVkIHRocm91Z2ggYSBzeXN0ZW0KICAgKiBzaGVsbC4gT24gTGludXggYW5kIE9TIFgsIGAvYmluL3NoYCBpcyB1c2VkLCB3aGlsZQogICAqIGAlV0lORElSJVxzeXN0ZW0zMlxjbWQuZXhlYCBpcyB1c2VkIG9uIFdpbmRvd3MuCiAgICoKICAgKiBUaGUgZW5jb2RpbmcgdXNlZCBmb3IgZGVjb2RpbmcgYHN0ZG91dGAgYW5kIGBzdGRlcnJgIGludG8gdGV4dCBpcwogICAqIGNvbnRyb2xsZWQgdGhyb3VnaCBbc3Rkb3V0RW5jb2RpbmddIGFuZCBbc3RkZXJyRW5jb2RpbmddLiBUaGUKICAgKiBkZWZhdWx0IGVuY29kaW5nIGlzIFtzeXN0ZW1FbmNvZGluZ10uIElmIGBudWxsYCBpcyB1c2VkIG5vCiAgICogZGVjb2Rpbmcgd2lsbCBoYXBwZW4gYW5kIHRoZSBbUHJvY2Vzc1Jlc3VsdF0gd2lsbCBob2xkIGJpbmFyeQogICAqIGRhdGEuCiAgICoKICAgKiBSZXR1cm5zIGEgYEZ1dHVyZTxQcm9jZXNzUmVzdWx0PmAgdGhhdCBjb21wbGV0ZXMgd2l0aCB0aGUKICAgKiByZXN1bHQgb2YgcnVubmluZyB0aGUgcHJvY2VzcywgaS5lLiwgZXhpdCBjb2RlLCBzdGFuZGFyZCBvdXQgYW5kCiAgICogc3RhbmRhcmQgaW4uCiAgICoKICAgKiBUaGUgZm9sbG93aW5nIGNvZGUgdXNlcyBgUHJvY2Vzcy5ydW5gIHRvIGdyZXAgZm9yIGBtYWluYCBpbiB0aGUKICAgKiBmaWxlIGB0ZXN0LmRhcnRgIG9uIExpbnV4LgogICAqCiAgICogICAgIFByb2Nlc3MucnVuKCdncmVwJywgWyctaScsICdtYWluJywgJ3Rlc3QuZGFydCddKS50aGVuKChyZXN1bHQpIHsKICAgKiAgICAgICBzdGRvdXQud3JpdGUocmVzdWx0LnN0ZG91dCk7CiAgICogICAgICAgc3RkZXJyLndyaXRlKHJlc3VsdC5zdGRlcnIpOwogICAqICAgICB9KTsKICAgKi8KICBleHRlcm5hbCBzdGF0aWMgRnV0dXJlPFByb2Nlc3NSZXN1bHQ+IHJ1bigKICAgICAgU3RyaW5nIGV4ZWN1dGFibGUsIExpc3Q8U3RyaW5nPiBhcmd1bWVudHMsCiAgICAgIHtTdHJpbmcgd29ya2luZ0RpcmVjdG9yeSwKICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudCwKICAgICAgYm9vbCBpbmNsdWRlUGFyZW50RW52aXJvbm1lbnQ6IHRydWUsCiAgICAgIGJvb2wgcnVuSW5TaGVsbDogZmFsc2UsCiAgICAgIEVuY29kaW5nIHN0ZG91dEVuY29kaW5nOiBzeXN0ZW1FbmNvZGluZywKICAgICAgRW5jb2Rpbmcgc3RkZXJyRW5jb2Rpbmc6IHN5c3RlbUVuY29kaW5nfSk7CgogIC8qKgogICAqIFN0YXJ0cyBhIHByb2Nlc3MgYW5kIHJ1bnMgaXQgdG8gY29tcGxldGlvbi4gVGhpcyBpcyBhIHN5bmNocm9ub3VzCiAgICogY2FsbCBhbmQgd2lsbCBibG9jayB1bnRpbCB0aGUgY2hpbGQgcHJvY2VzcyB0ZXJtaW5hdGVzLgogICAqCiAgICogVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yIGBQcm9jZXNzLnJ1bmAuCiAgICoKICAgKiBSZXR1cm5zIGEgYFByb2Nlc3NSZXN1bHRgIHdpdGggdGhlIHJlc3VsdCBvZiBydW5uaW5nIHRoZSBwcm9jZXNzLAogICAqIGkuZS4sIGV4aXQgY29kZSwgc3RhbmRhcmQgb3V0IGFuZCBzdGFuZGFyZCBpbi4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgUHJvY2Vzc1Jlc3VsdCBydW5TeW5jKAogICAgICBTdHJpbmcgZXhlY3V0YWJsZSwgTGlzdDxTdHJpbmc+IGFyZ3VtZW50cywKICAgICAge1N0cmluZyB3b3JraW5nRGlyZWN0b3J5LAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50LAogICAgICBib29sIGluY2x1ZGVQYXJlbnRFbnZpcm9ubWVudDogdHJ1ZSwKICAgICAgYm9vbCBydW5JblNoZWxsOiBmYWxzZSwKICAgICAgRW5jb2Rpbmcgc3Rkb3V0RW5jb2Rpbmc6IHN5c3RlbUVuY29kaW5nLAogICAgICBFbmNvZGluZyBzdGRlcnJFbmNvZGluZzogc3lzdGVtRW5jb2Rpbmd9KTsKCiAgLyoqCiAgICogS2lsbHMgdGhlIHByb2Nlc3Mgd2l0aCBpZCBbcGlkXS4KICAgKgogICAqIFdoZXJlIHBvc3NpYmxlLCBzZW5kcyB0aGUgW3NpZ25hbF0gdG8gdGhlIHByb2Nlc3Mgd2l0aCBpZAogICAqIGBwaWRgLiBUaGlzIGluY2x1ZGVzIExpbnV4IGFuZCBPUyBYLiBUaGUgZGVmYXVsdCBzaWduYWwgaXMKICAgKiBbUHJvY2Vzc1NpZ25hbC5zaWd0ZXJtXSB3aGljaCB3aWxsIG5vcm1hbGx5IHRlcm1pbmF0ZSB0aGUKICAgKiBwcm9jZXNzLgogICAqCiAgICogT24gcGxhdGZvcm1zIHdpdGhvdXQgc2lnbmFsIHN1cHBvcnQsIGluY2x1ZGluZyBXaW5kb3dzLCB0aGUgY2FsbAogICAqIGp1c3QgdGVybWluYXRlcyB0aGUgcHJvY2VzcyB3aXRoIGlkIGBwaWRgIGluIGEgcGxhdGZvcm0gc3BlY2lmaWMKICAgKiB3YXksIGFuZCB0aGUgYHNpZ25hbGAgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCiAgICoKICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgc2lnbmFsIGlzIHN1Y2Nlc3NmdWxseSBkZWxpdmVyZWQgdG8gdGhlCiAgICogcHJvY2Vzcy4gT3RoZXJ3aXNlIHRoZSBzaWduYWwgY291bGQgbm90IGJlIHNlbnQsIHVzdWFsbHkgbWVhbmluZwogICAqIHRoYXQgdGhlIHByb2Nlc3MgaXMgYWxyZWFkeSBkZWFkLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBib29sIGtpbGxQaWQoaW50IHBpZCwKICAgICAgW1Byb2Nlc3NTaWduYWwgc2lnbmFsID0gUHJvY2Vzc1NpZ25hbC5zaWd0ZXJtXSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHN0YW5kYXJkIG91dHB1dCBzdHJlYW0gb2YgdGhlIHByb2Nlc3MgYXMgYSBbOlN0cmVhbTpdLgogICAqLwogIFN0cmVhbTxMaXN0PGludD4+IGdldCBzdGRvdXQ7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHN0YW5kYXJkIGVycm9yIHN0cmVhbSBvZiB0aGUgcHJvY2VzcyBhcyBhIFs6U3RyZWFtOl0uCiAgICovCiAgU3RyZWFtPExpc3Q8aW50Pj4gZ2V0IHN0ZGVycjsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgc3RhbmRhcmQgaW5wdXQgc3RyZWFtIG9mIHRoZSBwcm9jZXNzIGFzIGFuIFtJT1NpbmtdLgogICAqLwogIElPU2luayBnZXQgc3RkaW47CgogIC8qKgogICAqIFJldHVybnMgdGhlIHByb2Nlc3MgaWQgb2YgdGhlIHByb2Nlc3MuCiAgICovCiAgaW50IGdldCBwaWQ7CgogIC8qKgogICAqIEtpbGxzIHRoZSBwcm9jZXNzLgogICAqCiAgICogV2hlcmUgcG9zc2libGUsIHNlbmRzIHRoZSBbc2lnbmFsXSB0byB0aGUgcHJvY2Vzcy4gVGhpcyBpbmNsdWRlcwogICAqIExpbnV4IGFuZCBPUyBYLiBUaGUgZGVmYXVsdCBzaWduYWwgaXMgW1Byb2Nlc3NTaWduYWwuc2lndGVybV0KICAgKiB3aGljaCB3aWxsIG5vcm1hbGx5IHRlcm1pbmF0ZSB0aGUgcHJvY2Vzcy4KICAgKgogICAqIE9uIHBsYXRmb3JtcyB3aXRob3V0IHNpZ25hbCBzdXBwb3J0LCBpbmNsdWRpbmcgV2luZG93cywgdGhlIGNhbGwKICAgKiBqdXN0IHRlcm1pbmF0ZXMgdGhlIHByb2Nlc3MgaW4gYSBwbGF0Zm9ybSBzcGVjaWZpYyB3YXksIGFuZCB0aGUKICAgKiBgc2lnbmFsYCBwYXJhbWV0ZXIgaXMgaWdub3JlZC4KICAgKgogICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzaWduYWwgaXMgc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZCB0byB0aGUKICAgKiBwcm9jZXNzLiBPdGhlcndpc2UgdGhlIHNpZ25hbCBjb3VsZCBub3QgYmUgc2VudCwgdXN1YWxseSBtZWFuaW5nCiAgICogdGhhdCB0aGUgcHJvY2VzcyBpcyBhbHJlYWR5IGRlYWQuCiAgICovCiAgYm9vbCBraWxsKFtQcm9jZXNzU2lnbmFsIHNpZ25hbCA9IFByb2Nlc3NTaWduYWwuc2lndGVybV0pOwp9CgovKioKICogW1Byb2Nlc3NSZXN1bHRdIHJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBydW5uaW5nIGEgbm9uLWludGVyYWN0aXZlCiAqIHByb2Nlc3Mgc3RhcnRlZCB3aXRoIFtQcm9jZXNzLnJ1bl0gb3IgW1Byb2Nlc3MucnVuU3luY10uCiAqLwpjbGFzcyBQcm9jZXNzUmVzdWx0IHsKICAvKioKICAgKiBFeGl0IGNvZGUgZm9yIHRoZSBwcm9jZXNzLgogICAqCiAgICogU2VlIFtQcm9jZXNzLmV4aXRDb2RlXSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBpbiB0aGUgZXhpdCBjb2RlCiAgICogdmFsdWUuCiAgICovCiAgZmluYWwgaW50IGV4aXRDb2RlOwoKICAvKioKICAgKiBTdGFuZGFyZCBvdXRwdXQgZnJvbSB0aGUgcHJvY2Vzcy4gVGhlIHZhbHVlIHVzZWQgZm9yIHRoZQogICAqIGBzdGRvdXRFbmNvZGluZ2AgYXJndW1lbnQgdG8gYFByb2Nlc3MucnVuYCBkZXRlcm1pbmVzIHRoZSB0eXBlLiBJZgogICAqIGBudWxsYCB3YXMgdXNlZCB0aGlzIHZhbHVlIGlzIG9mIHR5cGUgYExpc3Q8aW50PmAgb3RoZXJ3aXNlIGl0IGlzCiAgICogb2YgdHlwZSBgU3RyaW5nYC4KICAgKi8KICBmaW5hbCBzdGRvdXQ7CgogIC8qKgogICAqIFN0YW5kYXJkIGVycm9yIGZyb20gdGhlIHByb2Nlc3MuIFRoZSB2YWx1ZSB1c2VkIGZvciB0aGUKICAgKiBgc3RkZXJyRW5jb2RpbmdgIGFyZ3VtZW50IHRvIGBQcm9jZXNzLnJ1bmAgZGV0ZXJtaW5lcyB0aGUgdHlwZS4gSWYKICAgKiBgbnVsbGAgd2FzIHVzZWQgdGhpcyB2YWx1ZSBpcyBvZiB0eXBlIGBMaXN0PGludD5gCiAgICogb3RoZXJ3aXNlIGl0IGlzIG9mIHR5cGUgYFN0cmluZ2AuCiAgICovCiAgZmluYWwgc3RkZXJyOwoKICAvKioKICAgKiBQcm9jZXNzIGlkIG9mIHRoZSBwcm9jZXNzLgogICAqLwogIGZpbmFsIGludCBwaWQ7CgogIFByb2Nlc3NSZXN1bHQodGhpcy5waWQsIHRoaXMuZXhpdENvZGUsIHRoaXMuc3Rkb3V0LCB0aGlzLnN0ZGVycik7Cn0KCi8qKgogKiBPbiBQb3NpeCBzeXN0ZW1zLCBbUHJvY2Vzc1NpZ25hbF0gaXMgdXNlZCB0byBzZW5kIGEgc3BlY2lmaWMgc2lnbmFsCiAqIHRvIGEgY2hpbGQgcHJvY2Vzcywgc2VlIFs6UHJvY2Vzcy5raWxsOl0uCiAqCiAqIFNvbWUgW1Byb2Nlc3NTaWduYWxdcyBjYW4gYWxzbyBiZSB3YXRjaGVkLCBhcyBhIHdheSB0byBpbnRlcmNlcHQgdGhlIGRlZmF1bHQKICogc2lnbmFsIGhhbmRsZXIgYW5kIGltcGxlbWVudCBhbm90aGVyLiBTZWUgW1Byb2Nlc3NTaWduYWwud2F0Y2hdIGZvciBtb3JlCiAqIGluZm9ybWF0aW9uLgogKi8KY2xhc3MgUHJvY2Vzc1NpZ25hbCB7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lnaHVwID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDEsICJTSUdIVVAiKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWdpbnQgPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oMiwgIlNJR0lOVCIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ3F1aXQgPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oMywgIlNJR1FVSVQiKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWdpbGwgPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oNCwgIlNJR0lMTCIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ3RyYXAgPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oNSwgIlNJR1RSQVAiKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWdhYnJ0ID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDYsICJTSUdBQlJUIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lnYnVzID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDcsICJTSUdCVVMiKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWdmcGUgPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oOCwgIlNJR0ZQRSIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ2tpbGwgPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oOSwgIlNJR0tJTEwiKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWd1c3IxID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDEwLCAiU0lHVVNSMSIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ3NlZ3YgPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oMTEsICJTSUdTRUdWIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lndXNyMiA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXygxMiwgIlNJR1VTUjIiKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWdwaXBlID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDEzLCAiU0lHUElQRSIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ2Fscm0gPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oMTQsICJTSUdBTFJNIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lndGVybSA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXygxNSwgIlNJR1RFUk0iKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWdjaGxkID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDE3LCAiU0lHQ0hMRCIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ2NvbnQgPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oMTgsICJTSUdDT05UIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lnc3RvcCA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXygxOSwgIlNJR1NUT1AiKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWd0c3RwID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDIwLCAiU0lHVFNUUCIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ3R0aW4gPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oMjEsICJTSUdUVElOIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lndHRvdSA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXygyMiwgIlNJR1RUT1UiKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWd1cmcgPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oMjMsICJTSUdVUkciKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWd4Y3B1ID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDI0LCAiU0lHWENQVSIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ3hmc3ogPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oMjUsICJTSUdYRlNaIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lndnRhbHJtID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDI2LCAiU0lHVlRBTFJNIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lncHJvZiA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXygyNywgIlNJR1BST0YiKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWd3aW5jaCA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXygyOCwgIlNJR1dJTkNIIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lncG9sbCA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXygyOSwgIlNJR1BPTEwiKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWdzeXMgPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oMzEsICJTSUdTWVMiKTsKCiAgQERlcHJlY2F0ZWQoIlVzZSBzaWdodXAgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHSFVQID0gc2lnaHVwOwogIEBEZXByZWNhdGVkKCJVc2Ugc2lnaW50IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR0lOVCA9IHNpZ2ludDsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ3F1aXQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHUVVJVCA9IHNpZ3F1aXQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWdpbGwgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHSUxMID0gc2lnaWxsOwogIEBEZXByZWNhdGVkKCJVc2Ugc2lndHJhcCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdUUkFQID0gc2lndHJhcDsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ2FicnQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHQUJSVCA9IHNpZ2FicnQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWdidXMgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHQlVTID0gc2lnYnVzOwogIEBEZXByZWNhdGVkKCJVc2Ugc2lnZnBlIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR0ZQRSA9IHNpZ2ZwZTsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ2tpbGwgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHS0lMTCA9IHNpZ2tpbGw7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWd1c3IxIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR1VTUjEgPSBzaWd1c3IxOwogIEBEZXByZWNhdGVkKCJVc2Ugc2lnc2VndiBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdTRUdWID0gc2lnc2VndjsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ3VzcjIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHVVNSMiA9IHNpZ3VzcjI7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWdwaXBlIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR1BJUEUgPSBzaWdwaXBlOwogIEBEZXByZWNhdGVkKCJVc2Ugc2lnYWxybSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdBTFJNID0gc2lnYWxybTsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ3Rlcm0gaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHVEVSTSA9IHNpZ3Rlcm07CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWdjaGxkIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR0NITEQgPSBzaWdjaGxkOwogIEBEZXByZWNhdGVkKCJVc2Ugc2lnY29udCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdDT05UID0gc2lnY29udDsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ3N0b3AgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHU1RPUCA9IHNpZ3N0b3A7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWd0c3RwIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR1RTVFAgPSBzaWd0c3RwOwogIEBEZXByZWNhdGVkKCJVc2Ugc2lndHRpbiBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdUVElOID0gc2lndHRpbjsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ3R0b3UgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHVFRPVSA9IHNpZ3R0b3U7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWd1cmcgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHVVJHID0gc2lndXJnOwogIEBEZXByZWNhdGVkKCJVc2Ugc2lneGNwdSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdYQ1BVID0gc2lneGNwdTsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ3hmc3ogaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHWEZTWiA9IHNpZ3hmc3o7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWd2dGFscm0gaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHVlRBTFJNID0gc2lndnRhbHJtOwogIEBEZXByZWNhdGVkKCJVc2Ugc2lncHJvZiBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdQUk9GID0gc2lncHJvZjsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ3dpbmNoIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR1dJTkNIID0gc2lnd2luY2g7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWdwb2xsIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR1BPTEwgPSBzaWdwb2xsOwogIEBEZXByZWNhdGVkKCJVc2Ugc2lnc3lzIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR1NZUyA9IHNpZ3N5czsKCiAgZmluYWwgaW50IF9zaWduYWxOdW1iZXI7CiAgZmluYWwgU3RyaW5nIF9uYW1lOwoKICBjb25zdCBQcm9jZXNzU2lnbmFsLl8odGhpcy5fc2lnbmFsTnVtYmVyLCB0aGlzLl9uYW1lKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gX25hbWU7CgogIC8qKgogICAqIFdhdGNoIGZvciBwcm9jZXNzIHNpZ25hbHMuCiAgICoKICAgKiBUaGUgZm9sbG93aW5nIFtQcm9jZXNzU2lnbmFsXXMgY2FuIGJlIGxpc3RlbmVkIHRvOgogICAqCiAgICogICAqIFtQcm9jZXNzU2lnbmFsLnNpZ2h1cF0uCiAgICogICAqIFtQcm9jZXNzU2lnbmFsLnNpZ2ludF0uIFNpZ25hbCBzZW50IGJ5IGUuZy4gQ1RSTC1DLgogICAqICAgKiBbUHJvY2Vzc1NpZ25hbC5zaWd0ZXJtXS4gTm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzLgogICAqICAgKiBbUHJvY2Vzc1NpZ25hbC5zaWd1c3IxXS4gTm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzLgogICAqICAgKiBbUHJvY2Vzc1NpZ25hbC5zaWd1c3IyXS4gTm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzLgogICAqICAgKiBbUHJvY2Vzc1NpZ25hbC5zaWd3aW5jaF0uIE5vdCBhdmFpbGFibGUgb24gV2luZG93cy4KICAgKgogICAqIE90aGVyIHNpZ25hbHMgYXJlIGRpc2FsbG93ZWQsIGFzIHRoZXkgbWF5IGJlIHVzZWQgYnkgdGhlIFZNLgogICAqCiAgICogQSBzaWduYWwgY2FuIGJlIHdhdGNoZWQgbXVsdGlwbGUgdGltZXMsIGZyb20gbXVsdGlwbGUgaXNvbGF0ZXMsIHdoZXJlIGFsbAogICAqIGNhbGxiYWNrcyBhcmUgaW52b2tlZCB3aGVuIHNpZ25hbGVkLCBpbiBubyBzcGVjaWZpYyBvcmRlci4KICAgKi8KICBTdHJlYW08UHJvY2Vzc1NpZ25hbD4gd2F0Y2goKSA9PiBfUHJvY2Vzc1V0aWxzLl93YXRjaFNpZ25hbCh0aGlzKTsKfQoKY2xhc3MgU2lnbmFsRXhjZXB0aW9uIGltcGxlbWVudHMgSU9FeGNlcHRpb24gewogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwogIGZpbmFsIG9zRXJyb3I7CgogIGNvbnN0IFNpZ25hbEV4Y2VwdGlvbih0aGlzLm1lc3NhZ2UsIFt0aGlzLm9zRXJyb3JdKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgdmFyIG1zZyA9ICIiOwogICAgaWYgKG9zRXJyb3IgIT0gbnVsbCkgewogICAgICBtc2cgPSAiLCBvc0Vycm9yOiAkb3NFcnJvciI7CiAgICB9CiAgICByZXR1cm4gIlNpZ25hbEV4Y2VwdGlvbjogJG1lc3NhZ2UkbXNnIjsKICB9Cn0KCmNsYXNzIFByb2Nlc3NFeGNlcHRpb24gaW1wbGVtZW50cyBJT0V4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IGEgc3RyZWFtIG9mIGhpZ2gtbGV2ZWwKICogW1NvY2tldF1zLgogKgogKiBTZWUgW1NlY3VyZVNvY2tldF0gZm9yIG1vcmUgaW5mby4KICovCmNsYXNzIFNlY3VyZVNlcnZlclNvY2tldCBleHRlbmRzIFN0cmVhbTxTZWN1cmVTb2NrZXQ+IHsKICBmaW5hbCBSYXdTZWN1cmVTZXJ2ZXJTb2NrZXQgX3NvY2tldDsKCiAgU2VjdXJlU2VydmVyU29ja2V0Ll8odGhpcy5fc29ja2V0KTsKCiAgLyoqCiAgICogUmV0dXJucyBhIGZ1dHVyZSBmb3IgYSBbU2VjdXJlU2VydmVyU29ja2V0XS4gV2hlbiB0aGUgZnV0dXJlCiAgICogY29tcGxldGVzIHRoZSBzZXJ2ZXIgc29ja2V0IGlzIGJvdW5kIHRvIHRoZSBnaXZlbiBbYWRkcmVzc10gYW5kCiAgICogW3BvcnRdIGFuZCBoYXMgc3RhcnRlZCBsaXN0ZW5pbmcgb24gaXQuCiAgICoKICAgKiBUaGUgW2FkZHJlc3NdIGNhbiBlaXRoZXIgYmUgYSBbU3RyaW5nXSBvciBhbgogICAqIFtJbnRlcm5ldEFkZHJlc3NdLiBJZiBbYWRkcmVzc10gaXMgYSBbU3RyaW5nXSwgW2JpbmRdIHdpbGwKICAgKiBwZXJmb3JtIGEgW0ludGVybmV0QWRkcmVzcy5sb29rdXBdIGFuZCB1c2UgdGhlIGZpcnN0IHZhbHVlIGluIHRoZQogICAqIGxpc3QuIFRvIGxpc3RlbiBvbiB0aGUgbG9vcGJhY2sgYWRhcHRlciwgd2hpY2ggd2lsbCBhbGxvdyBvbmx5CiAgICogaW5jb21pbmcgY29ubmVjdGlvbnMgZnJvbSB0aGUgbG9jYWwgaG9zdCwgdXNlIHRoZSB2YWx1ZQogICAqIFtJbnRlcm5ldEFkZHJlc3MubG9vcGJhY2tJUHY0XSBvcgogICAqIFtJbnRlcm5ldEFkZHJlc3MubG9vcGJhY2tJUHY2XS4gVG8gYWxsb3cgZm9yIGluY29taW5nCiAgICogY29ubmVjdGlvbiBmcm9tIHRoZSBuZXR3b3JrIHVzZSBlaXRoZXIgb25lIG9mIHRoZSB2YWx1ZXMKICAgKiBbSW50ZXJuZXRBZGRyZXNzLmFueUlQdjRdIG9yIFtJbnRlcm5ldEFkZHJlc3MuYW55SVB2Nl0gdG8KICAgKiBiaW5kIHRvIGFsbCBpbnRlcmZhY2VzIG9yIHRoZSBJUCBhZGRyZXNzIG9mIGEgc3BlY2lmaWMgaW50ZXJmYWNlLgogICAqCiAgICogSWYgW3BvcnRdIGhhcyB0aGUgdmFsdWUgWzowOl0gYW4gZXBoZW1lcmFsIHBvcnQgd2lsbCBiZSBjaG9zZW4gYnkKICAgKiB0aGUgc3lzdGVtLiBUaGUgYWN0dWFsIHBvcnQgdXNlZCBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIHRoZQogICAqIFtwb3J0XSBnZXR0ZXIuCiAgICoKICAgKiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgW2JhY2tsb2ddIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxpc3RlbgogICAqIGJhY2tsb2cgZm9yIHRoZSB1bmRlcmx5aW5nIE9TIGxpc3RlbiBzZXR1cC4gSWYgW2JhY2tsb2ddIGhhcyB0aGUKICAgKiB2YWx1ZSBvZiBbOjA6XSAodGhlIGRlZmF1bHQpIGEgcmVhc29uYWJsZSB2YWx1ZSB3aWxsIGJlIGNob3NlbiBieQogICAqIHRoZSBzeXN0ZW0uCiAgICoKICAgKiBJbmNvbWluZyBjbGllbnQgY29ubmVjdGlvbnMgYXJlIHByb21vdGVkIHRvIHNlY3VyZSBjb25uZWN0aW9ucywgdXNpbmcKICAgKiB0aGUgc2VydmVyIGNlcnRpZmljYXRlIGFuZCBrZXkgc2V0IGluIFtjb250ZXh0XS4KICAgKgogICAqIFthZGRyZXNzXSBtdXN0IGJlIGdpdmVuIGFzIGEgbnVtZXJpYyBhZGRyZXNzLCBub3QgYSBob3N0IG5hbWUuCiAgICoKICAgKiBUbyByZXF1ZXN0IG9yIHJlcXVpcmUgdGhhdCBjbGllbnRzIGF1dGhlbnRpY2F0ZSBieSBwcm92aWRpbmcgYW4gU1NMIChUTFMpCiAgICogY2xpZW50IGNlcnRpZmljYXRlLCBzZXQgdGhlIG9wdGlvbmFsIHBhcmFtZXRlciBbcmVxdWVzdENsaWVudENlcnRpZmljYXRlXQogICAqIG9yIFtyZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGVdIHRvIHRydWUuICBSZXF1aXJpbmcgYSBjZXJ0aWZpY2F0ZSBpbXBsaWVzCiAgICogcmVxdWVzdGluZyBhIGNlcnRpZmljYXRlLCBzbyBzZXR0aW5nIGJvdGggaXMgcmVkdW5kYW50LgogICAqIFRvIGNoZWNrIHdoZXRoZXIgYSBjbGllbnQgY2VydGlmaWNhdGUgd2FzIHJlY2VpdmVkLCBjaGVjawogICAqIFNlY3VyZVNvY2tldC5wZWVyQ2VydGlmaWNhdGUgYWZ0ZXIgY29ubmVjdGluZy4gIElmIG5vIGNlcnRpZmljYXRlCiAgICogd2FzIHJlY2VpdmVkLCB0aGUgcmVzdWx0IHdpbGwgYmUgbnVsbC4KICAgKgogICAqIFtzdXBwb3J0ZWRQcm90b2NvbHNdIGlzIGFuIG9wdGlvbmFsIGxpc3Qgb2YgcHJvdG9jb2xzIChpbiBkZWNyZWFzaW5nCiAgICogb3JkZXIgb2YgcHJlZmVyZW5jZSkgdG8gdXNlIGR1cmluZyB0aGUgQUxQTiBwcm90b2NvbCBuZWdvZ2lhdGlvbiB3aXRoCiAgICogY2xpZW50cy4gIEV4YW1wbGUgdmFsdWVzIGFyZSAiaHR0cC8xLjEiIG9yICJoMiIuICBUaGUgc2VsZWN0ZWQgcHJvdG9jb2wKICAgKiBjYW4gYmUgb2J0YWluZWQgdmlhIFtTZWN1cmVTb2NrZXQuc2VsZWN0ZWRQcm90b2NvbF0uCiAgICoKICAgKiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgW3NoYXJlZF0gc3BlY2lmaWVzIHdoZXRoZXIgYWRkaXRpb25hbAogICAqIFNlY3VyZVNlcnZlclNvY2tldCBvYmplY3RzIGNhbiBiaW5kIHRvIHRoZSBzYW1lIGNvbWJpbmF0aW9uIG9mIGBhZGRyZXNzYCwKICAgKiBgcG9ydGAgYW5kIGB2Nk9ubHlgLiAgSWYgYHNoYXJlZGAgaXMgYHRydWVgIGFuZCBtb3JlIGBTZWN1cmVTZXJ2ZXJTb2NrZXRgcwogICAqIGZyb20gdGhpcyBpc29sYXRlIG9yIG90aGVyIGlzb2xhdGVzIGFyZSBib3VuZCB0byB0aGUgcG9ydCwgdGhlbiB0aGUKICAgKiBpbmNvbWluZyBjb25uZWN0aW9ucyB3aWxsIGJlIGRpc3RyaWJ1dGVkIGFtb25nIGFsbCB0aGUgYm91bmQKICAgKiBgU2VjdXJlU2VydmVyU29ja2V0YHMuIENvbm5lY3Rpb25zIGNhbiBiZSBkaXN0cmlidXRlZCBvdmVyIG11bHRpcGxlCiAgICogaXNvbGF0ZXMgdGhpcyB3YXkuCiAgICovCiAgc3RhdGljIEZ1dHVyZTxTZWN1cmVTZXJ2ZXJTb2NrZXQ+IGJpbmQoCiAgICAgIGFkZHJlc3MsIGludCBwb3J0LCBTZWN1cml0eUNvbnRleHQgY29udGV4dCwKICAgICAge2ludCBiYWNrbG9nOiAwLAogICAgICBib29sIHY2T25seTogZmFsc2UsCiAgICAgIGJvb2wgcmVxdWVzdENsaWVudENlcnRpZmljYXRlOiBmYWxzZSwKICAgICAgYm9vbCByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGU6IGZhbHNlLAogICAgICBMaXN0PFN0cmluZz4gc3VwcG9ydGVkUHJvdG9jb2xzLAogICAgICBib29sIHNoYXJlZDogZmFsc2V9KSB7CiAgICByZXR1cm4gUmF3U2VjdXJlU2VydmVyU29ja2V0CiAgICAgICAgLmJpbmQoYWRkcmVzcywgcG9ydCwgY29udGV4dCwKICAgICAgICAgICAgYmFja2xvZzogYmFja2xvZywKICAgICAgICAgICAgdjZPbmx5OiB2Nk9ubHksCiAgICAgICAgICAgIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZTogcmVxdWVzdENsaWVudENlcnRpZmljYXRlLAogICAgICAgICAgICByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGU6IHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgc3VwcG9ydGVkUHJvdG9jb2xzOiBzdXBwb3J0ZWRQcm90b2NvbHMsCiAgICAgICAgICAgIHNoYXJlZDogc2hhcmVkKQogICAgICAgIC50aGVuKChzZXJ2ZXJTb2NrZXQpID0+IG5ldyBTZWN1cmVTZXJ2ZXJTb2NrZXQuXyhzZXJ2ZXJTb2NrZXQpKTsKICB9CgogIFN0cmVhbVN1YnNjcmlwdGlvbjxTZWN1cmVTb2NrZXQ+IGxpc3Rlbih2b2lkIG9uRGF0YShTZWN1cmVTb2NrZXQgc29ja2V0KSwKICAgICAge0Z1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcn0pIHsKICAgIHJldHVybiBfc29ja2V0Lm1hcCgocmF3U29ja2V0KSA9PiBuZXcgU2VjdXJlU29ja2V0Ll8ocmF3U29ja2V0KSkubGlzdGVuKAogICAgICAgIG9uRGF0YSwKICAgICAgICBvbkVycm9yOiBvbkVycm9yLAogICAgICAgIG9uRG9uZTogb25Eb25lLAogICAgICAgIGNhbmNlbE9uRXJyb3I6IGNhbmNlbE9uRXJyb3IpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcG9ydCB1c2VkIGJ5IHRoaXMgc29ja2V0LgogICAqLwogIGludCBnZXQgcG9ydCA9PiBfc29ja2V0LnBvcnQ7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGFkZHJlc3MgdXNlZCBieSB0aGlzIHNvY2tldC4KICAgKi8KICBJbnRlcm5ldEFkZHJlc3MgZ2V0IGFkZHJlc3MgPT4gX3NvY2tldC5hZGRyZXNzOwoKICAvKioKICAgKiBDbG9zZXMgdGhlIHNvY2tldC4gVGhlIHJldHVybmVkIGZ1dHVyZSBjb21wbGV0ZXMgd2hlbiB0aGUgc29ja2V0CiAgICogaXMgZnVsbHkgY2xvc2VkIGFuZCBpcyBubyBsb25nZXIgYm91bmQuCiAgICovCiAgRnV0dXJlPFNlY3VyZVNlcnZlclNvY2tldD4gY2xvc2UoKSA9PiBfc29ja2V0LmNsb3NlKCkudGhlbigoXykgPT4gdGhpcyk7CgogIHZvaWQgc2V0IF9vd25lcihvd25lcikgewogICAgX3NvY2tldC5fb3duZXIgPSBvd25lcjsKICB9Cn0KCi8qKgogKiBUaGUgUmF3U2VjdXJlU2VydmVyU29ja2V0IGlzIGEgc2VydmVyIHNvY2tldCwgcHJvdmlkaW5nIGEgc3RyZWFtIG9mIGxvdy1sZXZlbAogKiBbUmF3U2VjdXJlU29ja2V0XXMuCiAqCiAqIFNlZSBbUmF3U2VjdXJlU29ja2V0XSBmb3IgbW9yZSBpbmZvLgogKi8KY2xhc3MgUmF3U2VjdXJlU2VydmVyU29ja2V0IGV4dGVuZHMgU3RyZWFtPFJhd1NlY3VyZVNvY2tldD4gewogIGZpbmFsIFJhd1NlcnZlclNvY2tldCBfc29ja2V0OwogIFN0cmVhbUNvbnRyb2xsZXI8UmF3U2VjdXJlU29ja2V0PiBfY29udHJvbGxlcjsKICBTdHJlYW1TdWJzY3JpcHRpb248UmF3U29ja2V0PiBfc3Vic2NyaXB0aW9uOwogIGZpbmFsIFNlY3VyaXR5Q29udGV4dCBfY29udGV4dDsKICBmaW5hbCBib29sIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZTsKICBmaW5hbCBib29sIHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZTsKICBmaW5hbCBMaXN0PFN0cmluZz4gc3VwcG9ydGVkUHJvdG9jb2xzOwogIGJvb2wgX2Nsb3NlZCA9IGZhbHNlOwoKICBSYXdTZWN1cmVTZXJ2ZXJTb2NrZXQuXygKICAgICAgdGhpcy5fc29ja2V0LAogICAgICB0aGlzLl9jb250ZXh0LAogICAgICB0aGlzLnJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgdGhpcy5yZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGUsCiAgICAgIHRoaXMuc3VwcG9ydGVkUHJvdG9jb2xzKSB7CiAgICBfY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyPFJhd1NlY3VyZVNvY2tldD4oCiAgICAgICAgc3luYzogdHJ1ZSwKICAgICAgICBvbkxpc3RlbjogX29uU3Vic2NyaXB0aW9uU3RhdGVDaGFuZ2UsCiAgICAgICAgb25QYXVzZTogX29uUGF1c2VTdGF0ZUNoYW5nZSwKICAgICAgICBvblJlc3VtZTogX29uUGF1c2VTdGF0ZUNoYW5nZSwKICAgICAgICBvbkNhbmNlbDogX29uU3Vic2NyaXB0aW9uU3RhdGVDaGFuZ2UpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhIGZ1dHVyZSBmb3IgYSBbUmF3U2VjdXJlU2VydmVyU29ja2V0XS4gV2hlbiB0aGUgZnV0dXJlCiAgICogY29tcGxldGVzIHRoZSBzZXJ2ZXIgc29ja2V0IGlzIGJvdW5kIHRvIHRoZSBnaXZlbiBbYWRkcmVzc10gYW5kCiAgICogW3BvcnRdIGFuZCBoYXMgc3RhcnRlZCBsaXN0ZW5pbmcgb24gaXQuCiAgICoKICAgKiBUaGUgW2FkZHJlc3NdIGNhbiBlaXRoZXIgYmUgYSBbU3RyaW5nXSBvciBhbgogICAqIFtJbnRlcm5ldEFkZHJlc3NdLiBJZiBbYWRkcmVzc10gaXMgYSBbU3RyaW5nXSwgW2JpbmRdIHdpbGwKICAgKiBwZXJmb3JtIGEgW0ludGVybmV0QWRkcmVzcy5sb29rdXBdIGFuZCB1c2UgdGhlIGZpcnN0IHZhbHVlIGluIHRoZQogICAqIGxpc3QuIFRvIGxpc3RlbiBvbiB0aGUgbG9vcGJhY2sgYWRhcHRlciwgd2hpY2ggd2lsbCBhbGxvdyBvbmx5CiAgICogaW5jb21pbmcgY29ubmVjdGlvbnMgZnJvbSB0aGUgbG9jYWwgaG9zdCwgdXNlIHRoZSB2YWx1ZQogICAqIFtJbnRlcm5ldEFkZHJlc3MubG9vcGJhY2tJUHY0XSBvcgogICAqIFtJbnRlcm5ldEFkZHJlc3MubG9vcGJhY2tJUHY2XS4gVG8gYWxsb3cgZm9yIGluY29taW5nCiAgICogY29ubmVjdGlvbiBmcm9tIHRoZSBuZXR3b3JrIHVzZSBlaXRoZXIgb25lIG9mIHRoZSB2YWx1ZXMKICAgKiBbSW50ZXJuZXRBZGRyZXNzLmFueUlQdjRdIG9yIFtJbnRlcm5ldEFkZHJlc3MuYW55SVB2Nl0gdG8KICAgKiBiaW5kIHRvIGFsbCBpbnRlcmZhY2VzIG9yIHRoZSBJUCBhZGRyZXNzIG9mIGEgc3BlY2lmaWMgaW50ZXJmYWNlLgogICAqCiAgICogSWYgW3BvcnRdIGhhcyB0aGUgdmFsdWUgWzowOl0gYW4gZXBoZW1lcmFsIHBvcnQgd2lsbCBiZSBjaG9zZW4gYnkKICAgKiB0aGUgc3lzdGVtLiBUaGUgYWN0dWFsIHBvcnQgdXNlZCBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIHRoZQogICAqIFtwb3J0XSBnZXR0ZXIuCiAgICoKICAgKiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgW2JhY2tsb2ddIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxpc3RlbgogICAqIGJhY2tsb2cgZm9yIHRoZSB1bmRlcmx5aW5nIE9TIGxpc3RlbiBzZXR1cC4gSWYgW2JhY2tsb2ddIGhhcyB0aGUKICAgKiB2YWx1ZSBvZiBbOjA6XSAodGhlIGRlZmF1bHQpIGEgcmVhc29uYWJsZSB2YWx1ZSB3aWxsIGJlIGNob3NlbiBieQogICAqIHRoZSBzeXN0ZW0uCiAgICoKICAgKiBJbmNvbWluZyBjbGllbnQgY29ubmVjdGlvbnMgYXJlIHByb21vdGVkIHRvIHNlY3VyZSBjb25uZWN0aW9ucywKICAgKiB1c2luZyB0aGUgc2VydmVyIGNlcnRpZmljYXRlIGFuZCBrZXkgc2V0IGluIFtjb250ZXh0XS4KICAgKgogICAqIFthZGRyZXNzXSBtdXN0IGJlIGdpdmVuIGFzIGEgbnVtZXJpYyBhZGRyZXNzLCBub3QgYSBob3N0IG5hbWUuCiAgICoKICAgKiBUbyByZXF1ZXN0IG9yIHJlcXVpcmUgdGhhdCBjbGllbnRzIGF1dGhlbnRpY2F0ZSBieSBwcm92aWRpbmcgYW4gU1NMIChUTFMpCiAgICogY2xpZW50IGNlcnRpZmljYXRlLCBzZXQgdGhlIG9wdGlvbmFsIHBhcmFtZXRlcnMgcmVxdWVzdENsaWVudENlcnRpZmljYXRlIG9yCiAgICogcmVxdWlyZUNsaWVudENlcnRpZmljYXRlIHRvIHRydWUuICBSZXF1aXJlIGltcGxpZXMgcmVxdWVzdCwgc28gb25lIGRvZXNuJ3QKICAgKiBuZWVkIHRvIHNwZWNpZnkgYm90aC4gIFRvIGNoZWNrIHdoZXRoZXIgYSBjbGllbnQgY2VydGlmaWNhdGUgd2FzIHJlY2VpdmVkLAogICAqIGNoZWNrIFNlY3VyZVNvY2tldC5wZWVyQ2VydGlmaWNhdGUgYWZ0ZXIgY29ubmVjdGluZy4gIElmIG5vIGNlcnRpZmljYXRlCiAgICogd2FzIHJlY2VpdmVkLCB0aGUgcmVzdWx0IHdpbGwgYmUgbnVsbC4KICAgKgogICAqIFtzdXBwb3J0ZWRQcm90b2NvbHNdIGlzIGFuIG9wdGlvbmFsIGxpc3Qgb2YgcHJvdG9jb2xzIChpbiBkZWNyZWFzaW5nCiAgICogb3JkZXIgb2YgcHJlZmVyZW5jZSkgdG8gdXNlIGR1cmluZyB0aGUgQUxQTiBwcm90b2NvbCBuZWdvdGlhdGlvbiB3aXRoCiAgICogY2xpZW50cy4gIEV4YW1wbGUgdmFsdWVzIGFyZSAiaHR0cC8xLjEiIG9yICJoMiIuICBUaGUgc2VsZWN0ZWQgcHJvdG9jb2wKICAgKiBjYW4gYmUgb2J0YWluZWQgdmlhIFtSYXdTZWN1cmVTb2NrZXQuc2VsZWN0ZWRQcm90b2NvbF0uCiAgICoKICAgKiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgW3NoYXJlZF0gc3BlY2lmaWVzIHdoZXRoZXIgYWRkaXRpb25hbAogICAqIFJhd1NlY3VyZVNlcnZlclNvY2tldCBvYmplY3RzIGNhbiBiaW5kIHRvIHRoZSBzYW1lIGNvbWJpbmF0aW9uIG9mCiAgICogYGFkZHJlc3NgLCBgcG9ydGAgYW5kIGB2Nk9ubHlgLiAgSWYgYHNoYXJlZGAgaXMgYHRydWVgIGFuZCBtb3JlCiAgICogYFJhd1NlY3VyZVNlcnZlclNvY2tldGBzIGZyb20gdGhpcyBpc29sYXRlIG9yIG90aGVyIGlzb2xhdGVzIGFyZSBib3VuZCB0bwogICAqIHRoZSBwb3J0LCB0aGVuIHRoZSBpbmNvbWluZyBjb25uZWN0aW9ucyB3aWxsIGJlIGRpc3RyaWJ1dGVkIGFtb25nIGFsbCB0aGUKICAgKiBib3VuZCBgUmF3U2VjdXJlU2VydmVyU29ja2V0YHMuIENvbm5lY3Rpb25zIGNhbiBiZSBkaXN0cmlidXRlZCBvdmVyCiAgICogbXVsdGlwbGUgaXNvbGF0ZXMgdGhpcyB3YXkuCiAgICovCiAgc3RhdGljIEZ1dHVyZTxSYXdTZWN1cmVTZXJ2ZXJTb2NrZXQ+IGJpbmQoCiAgICAgIGFkZHJlc3MsIGludCBwb3J0LCBTZWN1cml0eUNvbnRleHQgY29udGV4dCwKICAgICAge2ludCBiYWNrbG9nOiAwLAogICAgICBib29sIHY2T25seTogZmFsc2UsCiAgICAgIGJvb2wgcmVxdWVzdENsaWVudENlcnRpZmljYXRlOiBmYWxzZSwKICAgICAgYm9vbCByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGU6IGZhbHNlLAogICAgICBMaXN0PFN0cmluZz4gc3VwcG9ydGVkUHJvdG9jb2xzLAogICAgICBib29sIHNoYXJlZDogZmFsc2V9KSB7CiAgICByZXR1cm4gUmF3U2VydmVyU29ja2V0CiAgICAgICAgLmJpbmQoYWRkcmVzcywgcG9ydCwgYmFja2xvZzogYmFja2xvZywgdjZPbmx5OiB2Nk9ubHksIHNoYXJlZDogc2hhcmVkKQogICAgICAgIC50aGVuKChzZXJ2ZXJTb2NrZXQpID0+IG5ldyBSYXdTZWN1cmVTZXJ2ZXJTb2NrZXQuXygKICAgICAgICAgICAgc2VydmVyU29ja2V0LAogICAgICAgICAgICBjb250ZXh0LAogICAgICAgICAgICByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGUsCiAgICAgICAgICAgIHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgc3VwcG9ydGVkUHJvdG9jb2xzKSk7CiAgfQoKICBTdHJlYW1TdWJzY3JpcHRpb248UmF3U2VjdXJlU29ja2V0PiBsaXN0ZW4odm9pZCBvbkRhdGEoUmF3U2VjdXJlU29ja2V0IHMpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSkgewogICAgcmV0dXJuIF9jb250cm9sbGVyLnN0cmVhbS5saXN0ZW4ob25EYXRhLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsIG9uRG9uZTogb25Eb25lLCBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIHBvcnQgdXNlZCBieSB0aGlzIHNvY2tldC4KICAgKi8KICBpbnQgZ2V0IHBvcnQgPT4gX3NvY2tldC5wb3J0OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBhZGRyZXNzIHVzZWQgYnkgdGhpcyBzb2NrZXQuCiAgICovCiAgSW50ZXJuZXRBZGRyZXNzIGdldCBhZGRyZXNzID0+IF9zb2NrZXQuYWRkcmVzczsKCiAgLyoqCiAgICogQ2xvc2VzIHRoZSBzb2NrZXQuIFRoZSByZXR1cm5lZCBmdXR1cmUgY29tcGxldGVzIHdoZW4gdGhlIHNvY2tldAogICAqIGlzIGZ1bGx5IGNsb3NlZCBhbmQgaXMgbm8gbG9uZ2VyIGJvdW5kLgogICAqLwogIEZ1dHVyZTxSYXdTZWN1cmVTZXJ2ZXJTb2NrZXQ+IGNsb3NlKCkgewogICAgX2Nsb3NlZCA9IHRydWU7CiAgICByZXR1cm4gX3NvY2tldC5jbG9zZSgpLnRoZW4oKF8pID0+IHRoaXMpOwogIH0KCiAgdm9pZCBfb25EYXRhKFJhd1NvY2tldCBjb25uZWN0aW9uKSB7CiAgICB2YXIgcmVtb3RlUG9ydDsKICAgIHRyeSB7CiAgICAgIHJlbW90ZVBvcnQgPSBjb25uZWN0aW9uLnJlbW90ZVBvcnQ7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIC8vIElmIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBjbG9zZWQsIHJlbW90ZVBvcnQgdGhyb3dzIGFuIGV4Y2VwdGlvbi4KICAgICAgLy8gRG8gbm90aGluZyAtIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgogICAgICByZXR1cm47CiAgICB9CiAgICBfUmF3U2VjdXJlU29ja2V0CiAgICAgICAgLmNvbm5lY3QoY29ubmVjdGlvbi5hZGRyZXNzLCByZW1vdGVQb3J0LAogICAgICAgICAgICBjb250ZXh0OiBfY29udGV4dCwKICAgICAgICAgICAgaXNfc2VydmVyOiB0cnVlLAogICAgICAgICAgICBzb2NrZXQ6IGNvbm5lY3Rpb24sCiAgICAgICAgICAgIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZTogcmVxdWVzdENsaWVudENlcnRpZmljYXRlLAogICAgICAgICAgICByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGU6IHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgc3VwcG9ydGVkUHJvdG9jb2xzOiBzdXBwb3J0ZWRQcm90b2NvbHMpCiAgICAgICAgLnRoZW4oKFJhd1NlY3VyZVNvY2tldCBzZWN1cmVDb25uZWN0aW9uKSB7CiAgICAgIGlmIChfY2xvc2VkKSB7CiAgICAgICAgc2VjdXJlQ29ubmVjdGlvbi5jbG9zZSgpOwogICAgICB9IGVsc2UgewogICAgICAgIF9jb250cm9sbGVyLmFkZChzZWN1cmVDb25uZWN0aW9uKTsKICAgICAgfQogICAgfSkuY2F0Y2hFcnJvcigoZSwgcykgewogICAgICBpZiAoIV9jbG9zZWQpIHsKICAgICAgICBfY29udHJvbGxlci5hZGRFcnJvcihlLCBzKTsKICAgICAgfQogICAgfSk7CiAgfQoKICB2b2lkIF9vblBhdXNlU3RhdGVDaGFuZ2UoKSB7CiAgICBpZiAoX2NvbnRyb2xsZXIuaXNQYXVzZWQpIHsKICAgICAgX3N1YnNjcmlwdGlvbi5wYXVzZSgpOwogICAgfSBlbHNlIHsKICAgICAgX3N1YnNjcmlwdGlvbi5yZXN1bWUoKTsKICAgIH0KICB9CgogIHZvaWQgX29uU3Vic2NyaXB0aW9uU3RhdGVDaGFuZ2UoKSB7CiAgICBpZiAoX2NvbnRyb2xsZXIuaGFzTGlzdGVuZXIpIHsKICAgICAgX3N1YnNjcmlwdGlvbiA9IF9zb2NrZXQubGlzdGVuKF9vbkRhdGEsCiAgICAgICAgICBvbkVycm9yOiBfY29udHJvbGxlci5hZGRFcnJvciwgb25Eb25lOiBfY29udHJvbGxlci5jbG9zZSk7CiAgICB9IGVsc2UgewogICAgICBjbG9zZSgpOwogICAgfQogIH0KCiAgdm9pZCBzZXQgX293bmVyKG93bmVyKSB7CiAgICAoX3NvY2tldCBhcyBkeW5hbWljKS5fb3duZXIgPSBvd25lcjsKICB9Cn0KgSUATk48AREBBFEOAyUEOCcBJgEGQkUtBTJAR0Q9Jzs+P0cFR0EUBUdGRxEFSzYFRAVPT009P0csBUpLTToFQU9QSUJJGAYqMhcaLCwnHSEmHhxAQDQcSQQBTD9NEBoYJwQBBisGIAEGLgYyAQZGLQZLARscBAIBBFEXAygEPiExLyInJykYARsUFSUlITkULiYnLwQBBkVFLQUyQEdEPSc7Pj9HBUdBFAVHRkcRBUU8BUQFT1FQUE0sBUpLTT0FQUdFT09JIQYtMhcaLCwnHRtPPRoVJiYiBAFNPy1JBAEGKwYgAQYuBjIBBkYtBioULgQBJxQKKhJKLA4GFTEfHSBAQDQzFSIPKwgbFiQICAQBHyAdDR4GBAEmIy5FDQ8GBAEbKQQCASFkYXJ0OmlvL3NlY3VyZV9zZXJ2ZXJfc29ja2V0LmRhcnQxb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2lvL3NlY3VyZV9zb2NrZXQuZGFydMAArDcvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmlvOwoKLyoqCiAqIEEgaGlnaC1sZXZlbCBjbGFzcyBmb3IgY29tbXVuaWNhdGluZyBzZWN1cmVseSBvdmVyIGEgVENQIHNvY2tldCwgdXNpbmcKICogVExTIGFuZCBTU0wuIFRoZSBbU2VjdXJlU29ja2V0XSBleHBvc2VzIGJvdGggYSBbU3RyZWFtXSBhbmQgYW4KICogW0lPU2lua10gaW50ZXJmYWNlLCBtYWtpbmcgaXQgaWRlYWwgZm9yIHVzaW5nIHRvZ2V0aGVyIHdpdGgKICogb3RoZXIgW1N0cmVhbV1zLgogKi8KYWJzdHJhY3QgY2xhc3MgU2VjdXJlU29ja2V0IGltcGxlbWVudHMgU29ja2V0IHsKICBleHRlcm5hbCBmYWN0b3J5IFNlY3VyZVNvY2tldC5fKFJhd1NlY3VyZVNvY2tldCByYXdTb2NrZXQpOwoKICAvKioKICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHNlY3VyZSBjbGllbnQgc29ja2V0IGFuZCBjb25uZWN0cyBpdCB0byB0aGUgZ2l2ZW4KICAgKiBbaG9zdF0gb24gcG9ydCBbcG9ydF0uIFRoZSByZXR1cm5lZCBGdXR1cmUgd2lsbCBjb21wbGV0ZSB3aXRoIGEKICAgKiBbU2VjdXJlU29ja2V0XSB0aGF0IGlzIGNvbm5lY3RlZCBhbmQgcmVhZHkgZm9yIHN1YnNjcmlwdGlvbi4KICAgKgogICAqIFRoZSBjZXJ0aWZpY2F0ZSBwcm92aWRlZCBieSB0aGUgc2VydmVyIGlzIGNoZWNrZWQKICAgKiB1c2luZyB0aGUgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgc2V0IGluIHRoZSBTZWN1cml0eUNvbnRleHQgb2JqZWN0LgogICAqIFRoZSBkZWZhdWx0IFNlY3VyaXR5Q29udGV4dCBvYmplY3QgY29udGFpbnMgYSBidWlsdC1pbiBzZXQgb2YgdHJ1c3RlZAogICAqIHJvb3QgY2VydGlmaWNhdGVzIGZvciB3ZWxsLWtub3duIGNlcnRpZmljYXRlIGF1dGhvcml0aWVzLgogICAqCiAgICogW29uQmFkQ2VydGlmaWNhdGVdIGlzIGFuIG9wdGlvbmFsIGhhbmRsZXIgZm9yIHVudmVyaWZpYWJsZSBjZXJ0aWZpY2F0ZXMuCiAgICogVGhlIGhhbmRsZXIgcmVjZWl2ZXMgdGhlIFtYNTA5Q2VydGlmaWNhdGVdLCBhbmQgY2FuIGluc3BlY3QgaXQgYW5kCiAgICogZGVjaWRlIChvciBsZXQgdGhlIHVzZXIgZGVjaWRlKSB3aGV0aGVyIHRvIGFjY2VwdAogICAqIHRoZSBjb25uZWN0aW9uIG9yIG5vdC4gIFRoZSBoYW5kbGVyIHNob3VsZCByZXR1cm4gdHJ1ZQogICAqIHRvIGNvbnRpbnVlIHRoZSBbU2VjdXJlU29ja2V0XSBjb25uZWN0aW9uLgogICAqCiAgICogW3N1cHBvcnRlZFByb3RvY29sc10gaXMgYW4gb3B0aW9uYWwgbGlzdCBvZiBwcm90b2NvbHMgKGluIGRlY3JlYXNpbmcKICAgKiBvcmRlciBvZiBwcmVmZXJlbmNlKSB0byB1c2UgZHVyaW5nIHRoZSBBTFBOIHByb3RvY29sIG5lZ290aWF0aW9uIHdpdGggdGhlCiAgICogc2VydmVyLiAgRXhhbXBsZSB2YWx1ZXMgYXJlICJodHRwLzEuMSIgb3IgImgyIi4gIFRoZSBzZWxlY3RlZCBwcm90b2NvbAogICAqIGNhbiBiZSBvYnRhaW5lZCB2aWEgW1NlY3VyZVNvY2tldC5zZWxlY3RlZFByb3RvY29sXS4KICAgKgogICAqIFRoZSBhcmd1bWVudCBbdGltZW91dF0gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFsbG93ZWQgdGltZSB0byB3YWl0CiAgICogZm9yIGEgY29ubmVjdGlvbiB0byBiZSBlc3RhYmxpc2hlZC4gSWYgW3RpbWVvdXRdIGlzIGxvbmdlciB0aGFuIHRoZSBzeXN0ZW0KICAgKiBsZXZlbCB0aW1lb3V0IGR1cmF0aW9uLCBhIHRpbWVvdXQgbWF5IG9jY3VyIHNvb25lciB0aGFuIHNwZWNpZmllZCBpbgogICAqIFt0aW1lb3V0XS4gT24gdGltZW91dCwgYSBbU29ja2V0RXhjZXB0aW9uXSBpcyB0aHJvd24gYW5kIGFsbCBvbmdvaW5nCiAgICogY29ubmVjdGlvbiBhdHRlbXB0cyB0byBbaG9zdF0gYXJlIGNhbmNlbGxlZC4KCiAgICovCiAgc3RhdGljIEZ1dHVyZTxTZWN1cmVTb2NrZXQ+IGNvbm5lY3QoaG9zdCwgaW50IHBvcnQsCiAgICAgIHtTZWN1cml0eUNvbnRleHQgY29udGV4dCwKICAgICAgYm9vbCBvbkJhZENlcnRpZmljYXRlKFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSksCiAgICAgIExpc3Q8U3RyaW5nPiBzdXBwb3J0ZWRQcm90b2NvbHMsCiAgICAgIER1cmF0aW9uIHRpbWVvdXR9KSB7CiAgICByZXR1cm4gUmF3U2VjdXJlU29ja2V0LmNvbm5lY3QoaG9zdCwgcG9ydCwKICAgICAgICAgICAgY29udGV4dDogY29udGV4dCwKICAgICAgICAgICAgb25CYWRDZXJ0aWZpY2F0ZTogb25CYWRDZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgc3VwcG9ydGVkUHJvdG9jb2xzOiBzdXBwb3J0ZWRQcm90b2NvbHMsCiAgICAgICAgICAgIHRpbWVvdXQ6IHRpbWVvdXQpCiAgICAgICAgLnRoZW4oKHJhd1NvY2tldCkgPT4gbmV3IFNlY3VyZVNvY2tldC5fKHJhd1NvY2tldCkpOwogIH0KCiAgLy8vIExpa2UgW2Nvbm5lY3RdLCBidXQgcmV0dXJucyBhIFtGdXR1cmVdIHRoYXQgY29tcGxldGVzIHdpdGggYQogIC8vLyBbQ29ubmVjdGlvblRhc2tdIHRoYXQgY2FuIGJlIGNhbmNlbGxlZCBpZiB0aGUgW1NlY3VyZVNvY2tldF0gaXMgbm8KICAvLy8gbG9uZ2VyIG5lZWRlZC4KICBzdGF0aWMgRnV0dXJlPENvbm5lY3Rpb25UYXNrPFNlY3VyZVNvY2tldD4+IHN0YXJ0Q29ubmVjdChob3N0LCBpbnQgcG9ydCwKICAgICAge1NlY3VyaXR5Q29udGV4dCBjb250ZXh0LAogICAgICBib29sIG9uQmFkQ2VydGlmaWNhdGUoWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlKSwKICAgICAgTGlzdDxTdHJpbmc+IHN1cHBvcnRlZFByb3RvY29sc30pIHsKICAgIHJldHVybiBSYXdTZWN1cmVTb2NrZXQuc3RhcnRDb25uZWN0KGhvc3QsIHBvcnQsCiAgICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHQsCiAgICAgICAgICAgIG9uQmFkQ2VydGlmaWNhdGU6IG9uQmFkQ2VydGlmaWNhdGUsCiAgICAgICAgICAgIHN1cHBvcnRlZFByb3RvY29sczogc3VwcG9ydGVkUHJvdG9jb2xzKQogICAgICAgIC50aGVuKChyYXdTdGF0ZSkgewogICAgICBGdXR1cmU8U2VjdXJlU29ja2V0PiBzb2NrZXQgPQogICAgICAgICAgcmF3U3RhdGUuc29ja2V0LnRoZW4oKHJhd1NvY2tldCkgPT4gbmV3IFNlY3VyZVNvY2tldC5fKHJhd1NvY2tldCkpOwogICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25UYXNrPFNlY3VyZVNvY2tldD4uXygKICAgICAgICAgIHNvY2tldDogc29ja2V0LCBvbkNhbmNlbDogcmF3U3RhdGUuX29uQ2FuY2VsKTsKICAgIH0pOwogIH0KCiAgLyoqCiAgICogVGFrZXMgYW4gYWxyZWFkeSBjb25uZWN0ZWQgW3NvY2tldF0gYW5kIHN0YXJ0cyBjbGllbnQgc2lkZSBUTFMKICAgKiBoYW5kc2hha2UgdG8gbWFrZSB0aGUgY29tbXVuaWNhdGlvbiBzZWN1cmUuIFdoZW4gdGhlIHJldHVybmVkCiAgICogZnV0dXJlIGNvbXBsZXRlcyB0aGUgW1NlY3VyZVNvY2tldF0gaGFzIGNvbXBsZXRlZCB0aGUgVExTCiAgICogaGFuZHNoYWtlLiBVc2luZyB0aGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHRoYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUKICAgKiBjb25uZWN0aW9uIGlzIHByZXBhcmVkIGZvciBUTFMgaGFuZHNoYWtlLgogICAqCiAgICogSWYgdGhlIFtzb2NrZXRdIGFscmVhZHkgaGFzIGEgc3Vic2NyaXB0aW9uLCB0aGlzIHN1YnNjcmlwdGlvbgogICAqIHdpbGwgbm8gbG9uZ2VyIHJlY2VpdmUgYW5kIGV2ZW50cy4gSW4gbW9zdCBjYXNlcyBjYWxsaW5nCiAgICogYHBhdXNlYCBvbiB0aGlzIHN1YnNjcmlwdGlvbiBiZWZvcmUgc3RhcnRpbmcgVExTIGhhbmRzaGFrZSBpcwogICAqIHRoZSByaWdodCB0aGluZyB0byBkby4KICAgKgogICAqIFRoZSBnaXZlbiBbc29ja2V0XSBpcyBjbG9zZWQgYW5kIG1heSBub3QgYmUgdXNlZCBhbnltb3JlLgogICAqCiAgICogSWYgdGhlIFtob3N0XSBhcmd1bWVudCBpcyBwYXNzZWQgaXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBob3N0IG5hbWUKICAgKiBmb3IgdGhlIFRMUyBoYW5kc2hha2UuIElmIFtob3N0XSBpcyBub3QgcGFzc2VkIHRoZSBob3N0IG5hbWUgZnJvbQogICAqIHRoZSBbc29ja2V0XSB3aWxsIGJlIHVzZWQuIFRoZSBbaG9zdF0gY2FuIGJlIGVpdGhlciBhIFtTdHJpbmddIG9yCiAgICogYW4gW0ludGVybmV0QWRkcmVzc10uCiAgICoKICAgKiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBfbm90XyBjYXVzZSBhIEROUyBob3N0IGxvb2t1cC4gSWYgdGhlCiAgICogW2hvc3RdIHBhc3NlZCBpcyBhIFtTdHJpbmddIHRoZSBbSW50ZXJuZXRBZGRyZXNzXSBmb3IgdGhlCiAgICogcmVzdWx0aW5nIFtTZWN1cmVTb2NrZXRdIHdpbGwgaGF2ZSB0aGUgcGFzc2VkIGluIFtob3N0XSBhcyBpdHMKICAgKiBob3N0IHZhbHVlIGFuZCB0aGUgaW50ZXJuZXQgYWRkcmVzcyBvZiB0aGUgYWxyZWFkeSBjb25uZWN0ZWQKICAgKiBzb2NrZXQgYXMgaXRzIGFkZHJlc3MgdmFsdWUuCiAgICoKICAgKiBTZWUgW2Nvbm5lY3RdIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBhcmd1bWVudHMuCiAgICoKICAgKi8KICBzdGF0aWMgRnV0dXJlPFNlY3VyZVNvY2tldD4gc2VjdXJlKFNvY2tldCBzb2NrZXQsCiAgICAgIHtob3N0LAogICAgICBTZWN1cml0eUNvbnRleHQgY29udGV4dCwKICAgICAgYm9vbCBvbkJhZENlcnRpZmljYXRlKFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSl9KSB7CiAgICByZXR1cm4gKChzb2NrZXQgYXMgZHluYW1pYyAvKl9Tb2NrZXQqLykuX2RldGFjaFJhdygpIGFzIEZ1dHVyZSkKICAgICAgICAudGhlbjxSYXdTZWN1cmVTb2NrZXQ+KChkZXRhY2hlZFJhdykgewogICAgICByZXR1cm4gUmF3U2VjdXJlU29ja2V0LnNlY3VyZShkZXRhY2hlZFJhd1swXSBhcyBSYXdTb2NrZXQsCiAgICAgICAgICBzdWJzY3JpcHRpb246IGRldGFjaGVkUmF3WzFdIGFzIFN0cmVhbVN1YnNjcmlwdGlvbjxSYXdTb2NrZXRFdmVudD4sCiAgICAgICAgICBob3N0OiBob3N0LAogICAgICAgICAgY29udGV4dDogY29udGV4dCwKICAgICAgICAgIG9uQmFkQ2VydGlmaWNhdGU6IG9uQmFkQ2VydGlmaWNhdGUpOwogICAgfSkudGhlbjxTZWN1cmVTb2NrZXQ+KChyYXcpID0+IG5ldyBTZWN1cmVTb2NrZXQuXyhyYXcpKTsKICB9CgogIC8qKgogICAqIFRha2VzIGFuIGFscmVhZHkgY29ubmVjdGVkIFtzb2NrZXRdIGFuZCBzdGFydHMgc2VydmVyIHNpZGUgVExTCiAgICogaGFuZHNoYWtlIHRvIG1ha2UgdGhlIGNvbW11bmljYXRpb24gc2VjdXJlLiBXaGVuIHRoZSByZXR1cm5lZAogICAqIGZ1dHVyZSBjb21wbGV0ZXMgdGhlIFtTZWN1cmVTb2NrZXRdIGhhcyBjb21wbGV0ZWQgdGhlIFRMUwogICAqIGhhbmRzaGFrZS4gVXNpbmcgdGhpcyBmdW5jdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBvdGhlciBlbmQgb2YgdGhlCiAgICogY29ubmVjdGlvbiBpcyBnb2luZyB0byBzdGFydCB0aGUgVExTIGhhbmRzaGFrZS4KICAgKgogICAqIElmIHRoZSBbc29ja2V0XSBhbHJlYWR5IGhhcyBhIHN1YnNjcmlwdGlvbiwgdGhpcyBzdWJzY3JpcHRpb24KICAgKiB3aWxsIG5vIGxvbmdlciByZWNlaXZlIGFuZCBldmVudHMuIEluIG1vc3QgY2FzZXMgY2FsbGluZwogICAqIFs6cGF1c2U6XSBvbiB0aGlzIHN1YnNjcmlwdGlvbiBiZWZvcmUgc3RhcnRpbmcgVExTIGhhbmRzaGFrZSBpcwogICAqIHRoZSByaWdodCB0aGluZyB0byBkby4KICAgKgogICAqIElmIHNvbWUgb2YgdGhlIGRhdGEgb2YgdGhlIFRMUyBoYW5kc2hha2UgaGFzIGFscmVhZHkgYmVlbiByZWFkCiAgICogZnJvbSB0aGUgc29ja2V0IHRoaXMgZGF0YSBjYW4gYmUgcGFzc2VkIGluIHRoZSBbYnVmZmVyZWREYXRhXQogICAqIHBhcmFtZXRlci4gVGhpcyBkYXRhIHdpbGwgYmUgcHJvY2Vzc2VkIGJlZm9yZSBhbnkgb3RoZXIgZGF0YQogICAqIGF2YWlsYWJsZSBvbiB0aGUgc29ja2V0LgogICAqCiAgICogU2VlIFtTZWN1cmVTZXJ2ZXJTb2NrZXQuYmluZF0gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlCiAgICogYXJndW1lbnRzLgogICAqCiAgICovCiAgc3RhdGljIEZ1dHVyZTxTZWN1cmVTb2NrZXQ+IHNlY3VyZVNlcnZlcigKICAgICAgU29ja2V0IHNvY2tldCwgU2VjdXJpdHlDb250ZXh0IGNvbnRleHQsCiAgICAgIHtMaXN0PGludD4gYnVmZmVyZWREYXRhLAogICAgICBib29sIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZTogZmFsc2UsCiAgICAgIGJvb2wgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlOiBmYWxzZSwKICAgICAgTGlzdDxTdHJpbmc+IHN1cHBvcnRlZFByb3RvY29sc30pIHsKICAgIHJldHVybiAoKHNvY2tldCBhcyBkeW5hbWljIC8qX1NvY2tldCovKS5fZGV0YWNoUmF3KCkgYXMgRnV0dXJlKQogICAgICAgIC50aGVuPFJhd1NlY3VyZVNvY2tldD4oKGRldGFjaGVkUmF3KSB7CiAgICAgIHJldHVybiBSYXdTZWN1cmVTb2NrZXQuc2VjdXJlU2VydmVyKGRldGFjaGVkUmF3WzBdIGFzIFJhd1NvY2tldCwgY29udGV4dCwKICAgICAgICAgIHN1YnNjcmlwdGlvbjogZGV0YWNoZWRSYXdbMV0gYXMgU3RyZWFtU3Vic2NyaXB0aW9uPFJhd1NvY2tldEV2ZW50PiwKICAgICAgICAgIGJ1ZmZlcmVkRGF0YTogYnVmZmVyZWREYXRhLAogICAgICAgICAgcmVxdWVzdENsaWVudENlcnRpZmljYXRlOiByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGUsCiAgICAgICAgICByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGU6IHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgICAgIHN1cHBvcnRlZFByb3RvY29sczogc3VwcG9ydGVkUHJvdG9jb2xzKTsKICAgIH0pLnRoZW48U2VjdXJlU29ja2V0PigocmF3KSA9PiBuZXcgU2VjdXJlU29ja2V0Ll8ocmF3KSk7CiAgfQoKICAvKioKICAgKiBHZXQgdGhlIHBlZXIgY2VydGlmaWNhdGUgZm9yIGEgY29ubmVjdGVkIFNlY3VyZVNvY2tldC4gIElmIHRoaXMKICAgKiBTZWN1cmVTb2NrZXQgaXMgdGhlIHNlcnZlciBlbmQgb2YgYSBzZWN1cmUgc29ja2V0IGNvbm5lY3Rpb24sCiAgICogW3BlZXJDZXJ0aWZpY2F0ZV0gd2lsbCByZXR1cm4gdGhlIGNsaWVudCBjZXJ0aWZpY2F0ZSwgb3IgbnVsbCwgaWYgbm8KICAgKiBjbGllbnQgY2VydGlmaWNhdGUgd2FzIHJlY2VpdmVkLiAgSWYgaXQgaXMgdGhlIGNsaWVudCBlbmQsCiAgICogW3BlZXJDZXJ0aWZpY2F0ZV0gd2lsbCByZXR1cm4gdGhlIHNlcnZlcidzIGNlcnRpZmljYXRlLgogICAqLwogIFg1MDlDZXJ0aWZpY2F0ZSBnZXQgcGVlckNlcnRpZmljYXRlOwoKICAvKioKICAgKiBUaGUgcHJvdG9jb2wgd2hpY2ggd2FzIHNlbGVjdGVkIGR1cmluZyBBTFBOIHByb3RvY29sIG5lZ290aWF0aW9uLgogICAqCiAgICogUmV0dXJucyBudWxsIGlmIG9uZSBvZiB0aGUgcGVlcnMgZG9lcyBub3QgaGF2ZSBzdXBwb3J0IGZvciBBTFBOLCBkaWQgbm90CiAgICogc3BlY2lmeSBhIGxpc3Qgb2Ygc3VwcG9ydGVkIEFMUE4gcHJvdG9jb2xzIG9yIHRoZXJlIHdhcyBubyBjb21tb24KICAgKiBwcm90b2NvbCBiZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyLgogICAqLwogIFN0cmluZyBnZXQgc2VsZWN0ZWRQcm90b2NvbDsKCiAgLyoqCiAgICogUmVuZWdvdGlhdGUgYW4gZXhpc3Rpbmcgc2VjdXJlIGNvbm5lY3Rpb24sIHJlbmV3aW5nIHRoZSBzZXNzaW9uIGtleXMKICAgKiBhbmQgcG9zc2libHkgY2hhbmdpbmcgdGhlIGNvbm5lY3Rpb24gcHJvcGVydGllcy4KICAgKgogICAqIFRoaXMgcmVwZWF0cyB0aGUgU1NMIG9yIFRMUyBoYW5kc2hha2UsIHdpdGggb3B0aW9ucyB0aGF0IGFsbG93IGNsZWFyaW5nCiAgICogdGhlIHNlc3Npb24gY2FjaGUgYW5kIHJlcXVlc3RpbmcgYSBjbGllbnQgY2VydGlmaWNhdGUuCiAgICovCiAgdm9pZCByZW5lZ290aWF0ZSgKICAgICAge2Jvb2wgdXNlU2Vzc2lvbkNhY2hlOiB0cnVlLAogICAgICBib29sIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZTogZmFsc2UsCiAgICAgIGJvb2wgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlOiBmYWxzZX0pOwp9CgovKioKICogUmF3U2VjdXJlU29ja2V0IHByb3ZpZGVzIGEgc2VjdXJlIChTU0wgb3IgVExTKSBuZXR3b3JrIGNvbm5lY3Rpb24uCiAqIENsaWVudCBjb25uZWN0aW9ucyB0byBhIHNlcnZlciBhcmUgcHJvdmlkZWQgYnkgY2FsbGluZwogKiBSYXdTZWN1cmVTb2NrZXQuY29ubmVjdC4gIEEgc2VjdXJlIHNlcnZlciwgY3JlYXRlZCB3aXRoCiAqIFtSYXdTZWN1cmVTZXJ2ZXJTb2NrZXRdLCBhbHNvIHJldHVybnMgUmF3U2VjdXJlU29ja2V0IG9iamVjdHMgcmVwcmVzZW50aW5nCiAqIHRoZSBzZXJ2ZXIgZW5kIG9mIGEgc2VjdXJlIGNvbm5lY3Rpb24uCiAqIFRoZSBjZXJ0aWZpY2F0ZSBwcm92aWRlZCBieSB0aGUgc2VydmVyIGlzIGNoZWNrZWQKICogdXNpbmcgdGhlIHRydXN0ZWQgY2VydGlmaWNhdGVzIHNldCBpbiB0aGUgU2VjdXJpdHlDb250ZXh0IG9iamVjdC4KICogVGhlIGRlZmF1bHQgW1NlY3VyaXR5Q29udGV4dF0gb2JqZWN0IGNvbnRhaW5zIGEgYnVpbHQtaW4gc2V0IG9mIHRydXN0ZWQKICogcm9vdCBjZXJ0aWZpY2F0ZXMgZm9yIHdlbGwta25vd24gY2VydGlmaWNhdGUgYXV0aG9yaXRpZXMuCiAqLwphYnN0cmFjdCBjbGFzcyBSYXdTZWN1cmVTb2NrZXQgaW1wbGVtZW50cyBSYXdTb2NrZXQgewogIC8qKgogICAqIENvbnN0cnVjdHMgYSBuZXcgc2VjdXJlIGNsaWVudCBzb2NrZXQgYW5kIGNvbm5lY3QgaXQgdG8gdGhlIGdpdmVuCiAgICogaG9zdCBvbiB0aGUgZ2l2ZW4gcG9ydC4gVGhlIHJldHVybmVkIFtGdXR1cmVdIGlzIGNvbXBsZXRlZCB3aXRoIHRoZQogICAqIFJhd1NlY3VyZVNvY2tldCB3aGVuIGl0IGlzIGNvbm5lY3RlZCBhbmQgcmVhZHkgZm9yIHN1YnNjcmlwdGlvbi4KICAgKgogICAqIFRoZSBjZXJ0aWZpY2F0ZSBwcm92aWRlZCBieSB0aGUgc2VydmVyIGlzIGNoZWNrZWQgdXNpbmcgdGhlIHRydXN0ZWQKICAgKiBjZXJ0aWZpY2F0ZXMgc2V0IGluIHRoZSBTZWN1cml0eUNvbnRleHQgb2JqZWN0IElmIGEgY2VydGlmaWNhdGUgYW5kIGtleSBhcmUKICAgKiBzZXQgb24gdGhlIGNsaWVudCwgdXNpbmcgW1NlY3VyaXR5Q29udGV4dC51c2VDZXJ0aWZpY2F0ZUNoYWluXSBhbmQKICAgKiBbU2VjdXJpdHlDb250ZXh0LnVzZVByaXZhdGVLZXldLCBhbmQgdGhlIHNlcnZlciBhc2tzIGZvciBhIGNsaWVudAogICAqIGNlcnRpZmljYXRlLCB0aGVuIHRoYXQgY2xpZW50IGNlcnRpZmljYXRlIGlzIHNlbnQgdG8gdGhlIHNlcnZlci4KICAgKgogICAqIFtvbkJhZENlcnRpZmljYXRlXSBpcyBhbiBvcHRpb25hbCBoYW5kbGVyIGZvciB1bnZlcmlmaWFibGUgY2VydGlmaWNhdGVzLgogICAqIFRoZSBoYW5kbGVyIHJlY2VpdmVzIHRoZSBbWDUwOUNlcnRpZmljYXRlXSwgYW5kIGNhbiBpbnNwZWN0IGl0IGFuZAogICAqIGRlY2lkZSAob3IgbGV0IHRoZSB1c2VyIGRlY2lkZSkgd2hldGhlciB0byBhY2NlcHQKICAgKiB0aGUgY29ubmVjdGlvbiBvciBub3QuICBUaGUgaGFuZGxlciBzaG91bGQgcmV0dXJuIHRydWUKICAgKiB0byBjb250aW51ZSB0aGUgW1Jhd1NlY3VyZVNvY2tldF0gY29ubmVjdGlvbi4KICAgKgogICAqIFtzdXBwb3J0ZWRQcm90b2NvbHNdIGlzIGFuIG9wdGlvbmFsIGxpc3Qgb2YgcHJvdG9jb2xzIChpbiBkZWNyZWFzaW5nCiAgICogb3JkZXIgb2YgcHJlZmVyZW5jZSkgdG8gdXNlIGR1cmluZyB0aGUgQUxQTiBwcm90b2NvbCBuZWdvdGlhdGlvbiB3aXRoIHRoZQogICAqIHNlcnZlci4gIEV4YW1wbGUgdmFsdWVzIGFyZSAiaHR0cC8xLjEiIG9yICJoMiIuICBUaGUgc2VsZWN0ZWQgcHJvdG9jb2wKICAgKiBjYW4gYmUgb2J0YWluZWQgdmlhIFtSYXdTZWN1cmVTb2NrZXQuc2VsZWN0ZWRQcm90b2NvbF0uCiAgICovCiAgc3RhdGljIEZ1dHVyZTxSYXdTZWN1cmVTb2NrZXQ+IGNvbm5lY3QoaG9zdCwgaW50IHBvcnQsCiAgICAgIHtTZWN1cml0eUNvbnRleHQgY29udGV4dCwKICAgICAgYm9vbCBvbkJhZENlcnRpZmljYXRlKFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSksCiAgICAgIExpc3Q8U3RyaW5nPiBzdXBwb3J0ZWRQcm90b2NvbHMsCiAgICAgIER1cmF0aW9uIHRpbWVvdXR9KSB7CiAgICBfUmF3U2VjdXJlU29ja2V0Ll92ZXJpZnlGaWVsZHMoCiAgICAgICAgaG9zdCwgcG9ydCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgb25CYWRDZXJ0aWZpY2F0ZSk7CiAgICByZXR1cm4gUmF3U29ja2V0LmNvbm5lY3QoaG9zdCwgcG9ydCwgdGltZW91dDogdGltZW91dCkudGhlbigoc29ja2V0KSB7CiAgICAgIHJldHVybiBzZWN1cmUoc29ja2V0LAogICAgICAgICAgY29udGV4dDogY29udGV4dCwKICAgICAgICAgIG9uQmFkQ2VydGlmaWNhdGU6IG9uQmFkQ2VydGlmaWNhdGUsCiAgICAgICAgICBzdXBwb3J0ZWRQcm90b2NvbHM6IHN1cHBvcnRlZFByb3RvY29scyk7CiAgICB9KTsKICB9CgogIC8vLyBMaWtlIFtjb25uZWN0XSwgYnV0IHJldHVybnMgYSBbRnV0dXJlXSB0aGF0IGNvbXBsZXRlcyB3aXRoIGEKICAvLy8gW0Nvbm5lY3Rpb25UYXNrXSB0aGF0IGNhbiBiZSBjYW5jZWxsZWQgaWYgdGhlIFtSYXdTZWN1cmVTb2NrZXRdIGlzIG5vCiAgLy8vIGxvbmdlciBuZWVkZWQuCiAgc3RhdGljIEZ1dHVyZTxDb25uZWN0aW9uVGFzazxSYXdTZWN1cmVTb2NrZXQ+PiBzdGFydENvbm5lY3QoaG9zdCwgaW50IHBvcnQsCiAgICAgIHtTZWN1cml0eUNvbnRleHQgY29udGV4dCwKICAgICAgYm9vbCBvbkJhZENlcnRpZmljYXRlKFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSksCiAgICAgIExpc3Q8U3RyaW5nPiBzdXBwb3J0ZWRQcm90b2NvbHN9KSB7CiAgICByZXR1cm4gUmF3U29ja2V0LnN0YXJ0Q29ubmVjdChob3N0LCBwb3J0KQogICAgICAgIC50aGVuKChDb25uZWN0aW9uVGFzazxSYXdTb2NrZXQ+IHJhd1N0YXRlKSB7CiAgICAgIEZ1dHVyZTxSYXdTZWN1cmVTb2NrZXQ+IHNvY2tldCA9IHJhd1N0YXRlLnNvY2tldC50aGVuKChyYXdTb2NrZXQpIHsKICAgICAgICByZXR1cm4gc2VjdXJlKHJhd1NvY2tldCwKICAgICAgICAgICAgY29udGV4dDogY29udGV4dCwKICAgICAgICAgICAgb25CYWRDZXJ0aWZpY2F0ZTogb25CYWRDZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgc3VwcG9ydGVkUHJvdG9jb2xzOiBzdXBwb3J0ZWRQcm90b2NvbHMpOwogICAgICB9KTsKICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uVGFzazxSYXdTZWN1cmVTb2NrZXQ+Ll8oCiAgICAgICAgICBzb2NrZXQ6IHNvY2tldCwgb25DYW5jZWw6IHJhd1N0YXRlLl9vbkNhbmNlbCk7CiAgICB9KTsKICB9CgogIC8qKgogICAqIFRha2VzIGFuIGFscmVhZHkgY29ubmVjdGVkIFtzb2NrZXRdIGFuZCBzdGFydHMgY2xpZW50IHNpZGUgVExTCiAgICogaGFuZHNoYWtlIHRvIG1ha2UgdGhlIGNvbW11bmljYXRpb24gc2VjdXJlLiBXaGVuIHRoZSByZXR1cm5lZAogICAqIGZ1dHVyZSBjb21wbGV0ZXMgdGhlIFtSYXdTZWN1cmVTb2NrZXRdIGhhcyBjb21wbGV0ZWQgdGhlIFRMUwogICAqIGhhbmRzaGFrZS4gVXNpbmcgdGhpcyBmdW5jdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBvdGhlciBlbmQgb2YgdGhlCiAgICogY29ubmVjdGlvbiBpcyBwcmVwYXJlZCBmb3IgVExTIGhhbmRzaGFrZS4KICAgKgogICAqIElmIHRoZSBbc29ja2V0XSBhbHJlYWR5IGhhcyBhIHN1YnNjcmlwdGlvbiwgcGFzcyB0aGUgZXhpc3RpbmcKICAgKiBzdWJzY3JpcHRpb24gaW4gdGhlIFtzdWJzY3JpcHRpb25dIHBhcmFtZXRlci4gVGhlIFtzZWN1cmVdCiAgICogb3BlcmF0aW9uIHdpbGwgdGFrZSBvdmVyIHRoZSBzdWJzY3JpcHRpb24gYnkgcmVwbGFjaW5nIHRoZQogICAqIGhhbmRsZXJzIHdpdGggaXQgb3duIHNlY3VyZSBwcm9jZXNzaW5nLiBUaGUgY2FsbGVyIG11c3Qgbm90IHRvdWNoCiAgICogdGhpcyBzdWJzY3JpcHRpb24gYW55bW9yZS4gUGFzc2luZyBhIHBhdXNlZCBzdWJzY3JpcHRpb24gaXMgYW4KICAgKiBlcnJvci4KICAgKgogICAqIElmIHRoZSBbaG9zdF0gYXJndW1lbnQgaXMgcGFzc2VkIGl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgaG9zdCBuYW1lCiAgICogZm9yIHRoZSBUTFMgaGFuZHNoYWtlLiBJZiBbaG9zdF0gaXMgbm90IHBhc3NlZCB0aGUgaG9zdCBuYW1lIGZyb20KICAgKiB0aGUgW3NvY2tldF0gd2lsbCBiZSB1c2VkLiBUaGUgW2hvc3RdIGNhbiBiZSBlaXRoZXIgYSBbU3RyaW5nXSBvcgogICAqIGFuIFtJbnRlcm5ldEFkZHJlc3NdLgogICAqCiAgICogQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgX25vdF8gY2F1c2UgYSBETlMgaG9zdCBsb29rdXAuIElmIHRoZQogICAqIFtob3N0XSBwYXNzZWQgaXMgYSBbU3RyaW5nXSB0aGUgW0ludGVybmV0QWRkcmVzc10gZm9yIHRoZQogICAqIHJlc3VsdGluZyBbU2VjdXJlU29ja2V0XSB3aWxsIGhhdmUgdGhpcyBwYXNzZWQgaW4gW2hvc3RdIGFzIGl0cwogICAqIGhvc3QgdmFsdWUgYW5kIHRoZSBpbnRlcm5ldCBhZGRyZXNzIG9mIHRoZSBhbHJlYWR5IGNvbm5lY3RlZAogICAqIHNvY2tldCBhcyBpdHMgYWRkcmVzcyB2YWx1ZS4KICAgKgogICAqIFNlZSBbY29ubmVjdF0gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGFyZ3VtZW50cy4KICAgKgogICAqLwogIHN0YXRpYyBGdXR1cmU8UmF3U2VjdXJlU29ja2V0PiBzZWN1cmUoUmF3U29ja2V0IHNvY2tldCwKICAgICAge1N0cmVhbVN1YnNjcmlwdGlvbjxSYXdTb2NrZXRFdmVudD4gc3Vic2NyaXB0aW9uLAogICAgICBob3N0LAogICAgICBTZWN1cml0eUNvbnRleHQgY29udGV4dCwKICAgICAgYm9vbCBvbkJhZENlcnRpZmljYXRlKFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSksCiAgICAgIExpc3Q8U3RyaW5nPiBzdXBwb3J0ZWRQcm90b2NvbHN9KSB7CiAgICBzb2NrZXQucmVhZEV2ZW50c0VuYWJsZWQgPSBmYWxzZTsKICAgIHNvY2tldC53cml0ZUV2ZW50c0VuYWJsZWQgPSBmYWxzZTsKICAgIHJldHVybiBfUmF3U2VjdXJlU29ja2V0LmNvbm5lY3QoCiAgICAgICAgaG9zdCAhPSBudWxsID8gaG9zdCA6IHNvY2tldC5hZGRyZXNzLmhvc3QsIHNvY2tldC5wb3J0LAogICAgICAgIGlzX3NlcnZlcjogZmFsc2UsCiAgICAgICAgc29ja2V0OiBzb2NrZXQsCiAgICAgICAgc3Vic2NyaXB0aW9uOiBzdWJzY3JpcHRpb24sCiAgICAgICAgY29udGV4dDogY29udGV4dCwKICAgICAgICBvbkJhZENlcnRpZmljYXRlOiBvbkJhZENlcnRpZmljYXRlLAogICAgICAgIHN1cHBvcnRlZFByb3RvY29sczogc3VwcG9ydGVkUHJvdG9jb2xzKTsKICB9CgogIC8qKgogICAqIFRha2VzIGFuIGFscmVhZHkgY29ubmVjdGVkIFtzb2NrZXRdIGFuZCBzdGFydHMgc2VydmVyIHNpZGUgVExTCiAgICogaGFuZHNoYWtlIHRvIG1ha2UgdGhlIGNvbW11bmljYXRpb24gc2VjdXJlLiBXaGVuIHRoZSByZXR1cm5lZAogICAqIGZ1dHVyZSBjb21wbGV0ZXMgdGhlIFtSYXdTZWN1cmVTb2NrZXRdIGhhcyBjb21wbGV0ZWQgdGhlIFRMUwogICAqIGhhbmRzaGFrZS4gVXNpbmcgdGhpcyBmdW5jdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBvdGhlciBlbmQgb2YgdGhlCiAgICogY29ubmVjdGlvbiBpcyBnb2luZyB0byBzdGFydCB0aGUgVExTIGhhbmRzaGFrZS4KICAgKgogICAqIElmIHRoZSBbc29ja2V0XSBhbHJlYWR5IGhhcyBhIHN1YnNjcmlwdGlvbiwgcGFzcyB0aGUgZXhpc3RpbmcKICAgKiBzdWJzY3JpcHRpb24gaW4gdGhlIFtzdWJzY3JpcHRpb25dIHBhcmFtZXRlci4gVGhlIFtzZWN1cmVTZXJ2ZXJdCiAgICogb3BlcmF0aW9uIHdpbGwgdGFrZSBvdmVyIHRoZSBzdWJzY3JpcHRpb24gYnkgcmVwbGFjaW5nIHRoZQogICAqIGhhbmRsZXJzIHdpdGggaXQgb3duIHNlY3VyZSBwcm9jZXNzaW5nLiBUaGUgY2FsbGVyIG11c3Qgbm90IHRvdWNoCiAgICogdGhpcyBzdWJzY3JpcHRpb24gYW55bW9yZS4gUGFzc2luZyBhIHBhdXNlZCBzdWJzY3JpcHRpb24gaXMgYW4KICAgKiBlcnJvci4KICAgKgogICAqIElmIHNvbWUgb2YgdGhlIGRhdGEgb2YgdGhlIFRMUyBoYW5kc2hha2UgaGFzIGFscmVhZHkgYmVlbiByZWFkCiAgICogZnJvbSB0aGUgc29ja2V0IHRoaXMgZGF0YSBjYW4gYmUgcGFzc2VkIGluIHRoZSBbYnVmZmVyZWREYXRhXQogICAqIHBhcmFtZXRlci4gVGhpcyBkYXRhIHdpbGwgYmUgcHJvY2Vzc2VkIGJlZm9yZSBhbnkgb3RoZXIgZGF0YQogICAqIGF2YWlsYWJsZSBvbiB0aGUgc29ja2V0LgogICAqCiAgICogU2VlIFtSYXdTZWN1cmVTZXJ2ZXJTb2NrZXQuYmluZF0gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlCiAgICogYXJndW1lbnRzLgogICAqCiAgICovCiAgc3RhdGljIEZ1dHVyZTxSYXdTZWN1cmVTb2NrZXQ+IHNlY3VyZVNlcnZlcigKICAgICAgUmF3U29ja2V0IHNvY2tldCwgU2VjdXJpdHlDb250ZXh0IGNvbnRleHQsCiAgICAgIHtTdHJlYW1TdWJzY3JpcHRpb248UmF3U29ja2V0RXZlbnQ+IHN1YnNjcmlwdGlvbiwKICAgICAgTGlzdDxpbnQ+IGJ1ZmZlcmVkRGF0YSwKICAgICAgYm9vbCByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGU6IGZhbHNlLAogICAgICBib29sIHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZTogZmFsc2UsCiAgICAgIExpc3Q8U3RyaW5nPiBzdXBwb3J0ZWRQcm90b2NvbHN9KSB7CiAgICBzb2NrZXQucmVhZEV2ZW50c0VuYWJsZWQgPSBmYWxzZTsKICAgIHNvY2tldC53cml0ZUV2ZW50c0VuYWJsZWQgPSBmYWxzZTsKICAgIHJldHVybiBfUmF3U2VjdXJlU29ja2V0LmNvbm5lY3Qoc29ja2V0LmFkZHJlc3MsIHNvY2tldC5yZW1vdGVQb3J0LAogICAgICAgIGNvbnRleHQ6IGNvbnRleHQsCiAgICAgICAgaXNfc2VydmVyOiB0cnVlLAogICAgICAgIHNvY2tldDogc29ja2V0LAogICAgICAgIHN1YnNjcmlwdGlvbjogc3Vic2NyaXB0aW9uLAogICAgICAgIGJ1ZmZlcmVkRGF0YTogYnVmZmVyZWREYXRhLAogICAgICAgIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZTogcmVxdWVzdENsaWVudENlcnRpZmljYXRlLAogICAgICAgIHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZTogcmVxdWlyZUNsaWVudENlcnRpZmljYXRlLAogICAgICAgIHN1cHBvcnRlZFByb3RvY29sczogc3VwcG9ydGVkUHJvdG9jb2xzKTsKICB9CgogIC8qKgogICAqIFJlbmVnb3RpYXRlIGFuIGV4aXN0aW5nIHNlY3VyZSBjb25uZWN0aW9uLCByZW5ld2luZyB0aGUgc2Vzc2lvbiBrZXlzCiAgICogYW5kIHBvc3NpYmx5IGNoYW5naW5nIHRoZSBjb25uZWN0aW9uIHByb3BlcnRpZXMuCiAgICoKICAgKiBUaGlzIHJlcGVhdHMgdGhlIFNTTCBvciBUTFMgaGFuZHNoYWtlLCB3aXRoIG9wdGlvbnMgdGhhdCBhbGxvdyBjbGVhcmluZwogICAqIHRoZSBzZXNzaW9uIGNhY2hlIGFuZCByZXF1ZXN0aW5nIGEgY2xpZW50IGNlcnRpZmljYXRlLgogICAqLwogIHZvaWQgcmVuZWdvdGlhdGUoCiAgICAgIHtib29sIHVzZVNlc3Npb25DYWNoZTogdHJ1ZSwKICAgICAgYm9vbCByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGU6IGZhbHNlLAogICAgICBib29sIHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZTogZmFsc2V9KTsKCiAgLyoqCiAgICogR2V0IHRoZSBwZWVyIGNlcnRpZmljYXRlIGZvciBhIGNvbm5lY3RlZCBSYXdTZWN1cmVTb2NrZXQuICBJZiB0aGlzCiAgICogUmF3U2VjdXJlU29ja2V0IGlzIHRoZSBzZXJ2ZXIgZW5kIG9mIGEgc2VjdXJlIHNvY2tldCBjb25uZWN0aW9uLAogICAqIFtwZWVyQ2VydGlmaWNhdGVdIHdpbGwgcmV0dXJuIHRoZSBjbGllbnQgY2VydGlmaWNhdGUsIG9yIG51bGwsIGlmIG5vCiAgICogY2xpZW50IGNlcnRpZmljYXRlIHdhcyByZWNlaXZlZC4gIElmIGl0IGlzIHRoZSBjbGllbnQgZW5kLAogICAqIFtwZWVyQ2VydGlmaWNhdGVdIHdpbGwgcmV0dXJuIHRoZSBzZXJ2ZXIncyBjZXJ0aWZpY2F0ZS4KICAgKi8KICBYNTA5Q2VydGlmaWNhdGUgZ2V0IHBlZXJDZXJ0aWZpY2F0ZTsKCiAgLyoqCiAgICogVGhlIHByb3RvY29sIHdoaWNoIHdhcyBzZWxlY3RlZCBkdXJpbmcgcHJvdG9jb2wgbmVnb3RpYXRpb24uCiAgICoKICAgKiBSZXR1cm5zIG51bGwgaWYgb25lIG9mIHRoZSBwZWVycyBkb2VzIG5vdCBoYXZlIHN1cHBvcnQgZm9yIEFMUE4sIGRpZCBub3QKICAgKiBzcGVjaWZ5IGEgbGlzdCBvZiBzdXBwb3J0ZWQgQUxQTiBwcm90b2NvbHMgb3IgdGhlcmUgd2FzIG5vIGNvbW1vbgogICAqIHByb3RvY29sIGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIuCiAgICovCiAgU3RyaW5nIGdldCBzZWxlY3RlZFByb3RvY29sOwp9CgovKioKICogWDUwOUNlcnRpZmljYXRlIHJlcHJlc2VudHMgYW4gU1NMIGNlcnRpZmljYXRlLCB3aXRoIGFjY2Vzc29ycyB0bwogKiBnZXQgdGhlIGZpZWxkcyBvZiB0aGUgY2VydGlmaWNhdGUuCiAqLwpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmFic3RyYWN0IGNsYXNzIFg1MDlDZXJ0aWZpY2F0ZSB7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGV4dGVybmFsIGZhY3RvcnkgWDUwOUNlcnRpZmljYXRlLl8oKTsKCiAgLy8vIFRoZSBERVIgZW5jb2RlZCBieXRlcyBvZiB0aGUgY2VydGlmaWNhdGUuCiAgVWludDhMaXN0IGdldCBkZXI7CgogIC8vLyBUaGUgUEVNIGVuY29kZWQgU3RyaW5nIG9mIHRoZSBjZXJ0aWZpY2F0ZS4KICBTdHJpbmcgZ2V0IHBlbTsKCiAgLy8vIFRoZSBTSEExIGhhc2ggb2YgdGhlIGNlcnRpZmljYXRlLgogIFVpbnQ4TGlzdCBnZXQgc2hhMTsKCiAgU3RyaW5nIGdldCBzdWJqZWN0OwogIFN0cmluZyBnZXQgaXNzdWVyOwogIERhdGVUaW1lIGdldCBzdGFydFZhbGlkaXR5OwogIERhdGVUaW1lIGdldCBlbmRWYWxpZGl0eTsKfQoKY2xhc3MgX0ZpbHRlclN0YXR1cyB7CiAgYm9vbCBwcm9ncmVzcyA9IGZhbHNlOyAvLyBUaGUgZmlsdGVyIHJlYWQgb3Igd3JvdGUgZGF0YSB0byB0aGUgYnVmZmVycy4KICBib29sIHJlYWRFbXB0eSA9IHRydWU7IC8vIFRoZSByZWFkIGJ1ZmZlcnMgYW5kIGRlY3J5cHRpb24gZmlsdGVyIGFyZSBlbXB0eS4KICBib29sIHdyaXRlRW1wdHkgPSB0cnVlOyAvLyBUaGUgd3JpdGUgYnVmZmVycyBhbmQgZW5jcnlwdGlvbiBmaWx0ZXIgYXJlIGVtcHR5LgogIC8vIFRoZXNlIGFyZSBzZXQgaWYgYSBidWZmZXIgY2hhbmdlcyBzdGF0ZSBmcm9tIGVtcHR5IG9yIGZ1bGwuCiAgYm9vbCByZWFkUGxhaW50ZXh0Tm9Mb25nZXJFbXB0eSA9IGZhbHNlOwogIGJvb2wgd3JpdGVQbGFpbnRleHROb0xvbmdlckZ1bGwgPSBmYWxzZTsKICBib29sIHJlYWRFbmNyeXB0ZWROb0xvbmdlckZ1bGwgPSBmYWxzZTsKICBib29sIHdyaXRlRW5jcnlwdGVkTm9Mb25nZXJFbXB0eSA9IGZhbHNlOwoKICBfRmlsdGVyU3RhdHVzKCk7Cn0KCmNsYXNzIF9SYXdTZWN1cmVTb2NrZXQgZXh0ZW5kcyBTdHJlYW08UmF3U29ja2V0RXZlbnQ+CiAgICBpbXBsZW1lbnRzIFJhd1NlY3VyZVNvY2tldCB7CiAgLy8gU3RhdHVzIHN0YXRlcwogIHN0YXRpYyBjb25zdCBpbnQgaGFuZHNoYWtlU3RhdHVzID0gMjAxOwogIHN0YXRpYyBjb25zdCBpbnQgY29ubmVjdGVkU3RhdHVzID0gMjAyOwogIHN0YXRpYyBjb25zdCBpbnQgY2xvc2VkU3RhdHVzID0gMjAzOwoKICAvLyBCdWZmZXIgaWRlbnRpZmllcnMuCiAgLy8gVGhlc2UgbXVzdCBhZ3JlZSB3aXRoIHRob3NlIGluIHRoZSBuYXRpdmUgQysrIGltcGxlbWVudGF0aW9uLgogIHN0YXRpYyBjb25zdCBpbnQgcmVhZFBsYWludGV4dElkID0gMDsKICBzdGF0aWMgY29uc3QgaW50IHdyaXRlUGxhaW50ZXh0SWQgPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgcmVhZEVuY3J5cHRlZElkID0gMjsKICBzdGF0aWMgY29uc3QgaW50IHdyaXRlRW5jcnlwdGVkSWQgPSAzOwogIHN0YXRpYyBjb25zdCBpbnQgYnVmZmVyQ291bnQgPSA0OwoKICAvLyBJcyBhIGJ1ZmZlciBpZGVudGlmaWVyIGZvciBhbiBlbmNyeXB0ZWQgYnVmZmVyPwogIHN0YXRpYyBib29sIF9pc0J1ZmZlckVuY3J5cHRlZChpbnQgaWRlbnRpZmllcikgPT4KICAgICAgaWRlbnRpZmllciA+PSByZWFkRW5jcnlwdGVkSWQ7CgogIFJhd1NvY2tldCBfc29ja2V0OwogIGZpbmFsIENvbXBsZXRlcjxfUmF3U2VjdXJlU29ja2V0PiBfaGFuZHNoYWtlQ29tcGxldGUgPQogICAgICBuZXcgQ29tcGxldGVyPF9SYXdTZWN1cmVTb2NrZXQ+KCk7CiAgU3RyZWFtQ29udHJvbGxlcjxSYXdTb2NrZXRFdmVudD4gX2NvbnRyb2xsZXI7CiAgU3RyZWFtPFJhd1NvY2tldEV2ZW50PiBfc3RyZWFtOwogIFN0cmVhbVN1YnNjcmlwdGlvbjxSYXdTb2NrZXRFdmVudD4gX3NvY2tldFN1YnNjcmlwdGlvbjsKICBMaXN0PGludD4gX2J1ZmZlcmVkRGF0YTsKICBpbnQgX2J1ZmZlcmVkRGF0YUluZGV4ID0gMDsKICBmaW5hbCBJbnRlcm5ldEFkZHJlc3MgYWRkcmVzczsKICBmaW5hbCBib29sIGlzX3NlcnZlcjsKICBTZWN1cml0eUNvbnRleHQgY29udGV4dDsKICBmaW5hbCBib29sIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZTsKICBmaW5hbCBib29sIHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZTsKICBmaW5hbCBGdW5jdGlvbiBvbkJhZENlcnRpZmljYXRlOwoKICB2YXIgX3N0YXR1cyA9IGhhbmRzaGFrZVN0YXR1czsKICBib29sIF93cml0ZUV2ZW50c0VuYWJsZWQgPSB0cnVlOwogIGJvb2wgX3JlYWRFdmVudHNFbmFibGVkID0gdHJ1ZTsKICBpbnQgX3BhdXNlQ291bnQgPSAwOwogIGJvb2wgX3BlbmRpbmdSZWFkRXZlbnQgPSBmYWxzZTsKICBib29sIF9zb2NrZXRDbG9zZWRSZWFkID0gZmFsc2U7IC8vIFRoZSBuZXR3b3JrIHNvY2tldCBpcyBjbG9zZWQgZm9yIHJlYWRpbmcuCiAgYm9vbCBfc29ja2V0Q2xvc2VkV3JpdGUgPSBmYWxzZTsgLy8gVGhlIG5ldHdvcmsgc29ja2V0IGlzIGNsb3NlZCBmb3Igd3JpdGluZy4KICBib29sIF9jbG9zZWRSZWFkID0gZmFsc2U7IC8vIFRoZSBzZWN1cmUgc29ja2V0IGhhcyBmaXJlZCBhbiBvbkNsb3NlZCBldmVudC4KICBib29sIF9jbG9zZWRXcml0ZSA9IGZhbHNlOyAvLyBUaGUgc2VjdXJlIHNvY2tldCBoYXMgYmVlbiBjbG9zZWQgZm9yIHdyaXRpbmcuCiAgLy8gVGhlIG5ldHdvcmsgc29ja2V0IGlzIGdvbmUuCiAgQ29tcGxldGVyPFJhd1NlY3VyZVNvY2tldD4gX2Nsb3NlQ29tcGxldGVyID0gbmV3IENvbXBsZXRlcjxSYXdTZWN1cmVTb2NrZXQ+KCk7CiAgX0ZpbHRlclN0YXR1cyBfZmlsdGVyU3RhdHVzID0gbmV3IF9GaWx0ZXJTdGF0dXMoKTsKICBib29sIF9jb25uZWN0UGVuZGluZyA9IHRydWU7CiAgYm9vbCBfZmlsdGVyUGVuZGluZyA9IGZhbHNlOwogIGJvb2wgX2ZpbHRlckFjdGl2ZSA9IGZhbHNlOwoKICBfU2VjdXJlRmlsdGVyIF9zZWN1cmVGaWx0ZXIgPSBuZXcgX1NlY3VyZUZpbHRlcigpOwogIFN0cmluZyBfc2VsZWN0ZWRQcm90b2NvbDsKCiAgc3RhdGljIEZ1dHVyZTxfUmF3U2VjdXJlU29ja2V0PiBjb25uZWN0KAogICAgICBkeW5hbWljIC8qU3RyaW5nfEludGVybmV0QWRkcmVzcyovIGhvc3QsIGludCByZXF1ZXN0ZWRQb3J0LAogICAgICB7Ym9vbCBpc19zZXJ2ZXIsCiAgICAgIFNlY3VyaXR5Q29udGV4dCBjb250ZXh0LAogICAgICBSYXdTb2NrZXQgc29ja2V0LAogICAgICBTdHJlYW1TdWJzY3JpcHRpb248UmF3U29ja2V0RXZlbnQ+IHN1YnNjcmlwdGlvbiwKICAgICAgTGlzdDxpbnQ+IGJ1ZmZlcmVkRGF0YSwKICAgICAgYm9vbCByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGU6IGZhbHNlLAogICAgICBib29sIHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZTogZmFsc2UsCiAgICAgIGJvb2wgb25CYWRDZXJ0aWZpY2F0ZShYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUpLAogICAgICBMaXN0PFN0cmluZz4gc3VwcG9ydGVkUHJvdG9jb2xzfSkgewogICAgX3ZlcmlmeUZpZWxkcyhob3N0LCByZXF1ZXN0ZWRQb3J0LCBpc19zZXJ2ZXIsIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgICByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGUsIG9uQmFkQ2VydGlmaWNhdGUpOwogICAgaWYgKGhvc3QgaXMgSW50ZXJuZXRBZGRyZXNzKSBob3N0ID0gaG9zdC5ob3N0OwogICAgSW50ZXJuZXRBZGRyZXNzIGFkZHJlc3MgPSBzb2NrZXQuYWRkcmVzczsKICAgIGlmIChob3N0ICE9IG51bGwpIHsKICAgICAgYWRkcmVzcyA9IEludGVybmV0QWRkcmVzcy5fY2xvbmVXaXRoTmV3SG9zdChhZGRyZXNzLCBob3N0KTsKICAgIH0KICAgIHJldHVybiBuZXcgX1Jhd1NlY3VyZVNvY2tldCgKICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgcmVxdWVzdGVkUG9ydCwKICAgICAgICAgICAgaXNfc2VydmVyLAogICAgICAgICAgICBjb250ZXh0LAogICAgICAgICAgICBzb2NrZXQsCiAgICAgICAgICAgIHN1YnNjcmlwdGlvbiwKICAgICAgICAgICAgYnVmZmVyZWREYXRhLAogICAgICAgICAgICByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGUsCiAgICAgICAgICAgIHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgb25CYWRDZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgc3VwcG9ydGVkUHJvdG9jb2xzKQogICAgICAgIC5faGFuZHNoYWtlQ29tcGxldGUKICAgICAgICAuZnV0dXJlOwogIH0KCiAgX1Jhd1NlY3VyZVNvY2tldCgKICAgICAgdGhpcy5hZGRyZXNzLAogICAgICBpbnQgcmVxdWVzdGVkUG9ydCwKICAgICAgdGhpcy5pc19zZXJ2ZXIsCiAgICAgIHRoaXMuY29udGV4dCwKICAgICAgdGhpcy5fc29ja2V0LAogICAgICB0aGlzLl9zb2NrZXRTdWJzY3JpcHRpb24sCiAgICAgIHRoaXMuX2J1ZmZlcmVkRGF0YSwKICAgICAgdGhpcy5yZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGUsCiAgICAgIHRoaXMucmVxdWlyZUNsaWVudENlcnRpZmljYXRlLAogICAgICB0aGlzLm9uQmFkQ2VydGlmaWNhdGUsCiAgICAgIExpc3Q8U3RyaW5nPiBzdXBwb3J0ZWRQcm90b2NvbHMpIHsKICAgIGNvbnRleHQgPz89IFNlY3VyaXR5Q29udGV4dC5kZWZhdWx0Q29udGV4dDsKICAgIF9jb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8UmF3U29ja2V0RXZlbnQ+KAogICAgICAgIHN5bmM6IHRydWUsCiAgICAgICAgb25MaXN0ZW46IF9vblN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlLAogICAgICAgIG9uUGF1c2U6IF9vblBhdXNlU3RhdGVDaGFuZ2UsCiAgICAgICAgb25SZXN1bWU6IF9vblBhdXNlU3RhdGVDaGFuZ2UsCiAgICAgICAgb25DYW5jZWw6IF9vblN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlKTsKICAgIF9zdHJlYW0gPSBfY29udHJvbGxlci5zdHJlYW07CiAgICAvLyBUaHJvdyBhbiBBcmd1bWVudEVycm9yIGlmIGFueSBmaWVsZCBpcyBpbnZhbGlkLiAgQWZ0ZXIgdGhpcywgYWxsCiAgICAvLyBlcnJvcnMgd2lsbCBiZSByZXBvcnRlZCB0aHJvdWdoIHRoZSBmdXR1cmUgb3IgdGhlIHN0cmVhbS4KICAgIF9zZWN1cmVGaWx0ZXIuaW5pdCgpOwogICAgX3NlY3VyZUZpbHRlcgogICAgICAgIC5yZWdpc3RlckhhbmRzaGFrZUNvbXBsZXRlQ2FsbGJhY2soX3NlY3VyZUhhbmRzaGFrZUNvbXBsZXRlSGFuZGxlcik7CiAgICBpZiAob25CYWRDZXJ0aWZpY2F0ZSAhPSBudWxsKSB7CiAgICAgIF9zZWN1cmVGaWx0ZXIucmVnaXN0ZXJCYWRDZXJ0aWZpY2F0ZUNhbGxiYWNrKF9vbkJhZENlcnRpZmljYXRlV3JhcHBlcik7CiAgICB9CiAgICBfc29ja2V0LnJlYWRFdmVudHNFbmFibGVkID0gdHJ1ZTsKICAgIF9zb2NrZXQud3JpdGVFdmVudHNFbmFibGVkID0gZmFsc2U7CiAgICBpZiAoX3NvY2tldFN1YnNjcmlwdGlvbiA9PSBudWxsKSB7CiAgICAgIC8vIElmIGEgY3VycmVudCBzdWJzY3JpcHRpb24gaXMgcHJvdmlkZWQgdXNlIHRoaXMgb3RoZXJ3aXNlCiAgICAgIC8vIGNyZWF0ZSBhIG5ldyBvbmUuCiAgICAgIF9zb2NrZXRTdWJzY3JpcHRpb24gPSBfc29ja2V0Lmxpc3RlbihfZXZlbnREaXNwYXRjaGVyLAogICAgICAgICAgb25FcnJvcjogX3JlcG9ydEVycm9yLCBvbkRvbmU6IF9kb25lSGFuZGxlcik7CiAgICB9IGVsc2UgewogICAgICBpZiAoX3NvY2tldFN1YnNjcmlwdGlvbi5pc1BhdXNlZCkgewogICAgICAgIF9zb2NrZXQuY2xvc2UoKTsKICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiU3Vic2NyaXB0aW9uIHBhc3NlZCB0byBUTFMgdXBncmFkZSBpcyBwYXVzZWQiKTsKICAgICAgfQogICAgICAvLyBJZiB3ZSBhcmUgdXBncmFkaW5nIGEgc29ja2V0IHRoYXQgaXMgYWxyZWFkeSBjbG9zZWQgZm9yIHJlYWQsCiAgICAgIC8vIHJlcG9ydCBhbiBlcnJvciBhcyBpZiB3ZSByZWNlaXZlZCByZWFkQ2xvc2VkIGR1cmluZyB0aGUgaGFuZHNoYWtlLgogICAgICBkeW5hbWljIHMgPSBfc29ja2V0OyAvLyBDYXN0IHRvIGR5bmFtaWMgdG8gYXZvaWQgd2FybmluZy4KICAgICAgaWYgKHMuX3NvY2tldC5jbG9zZWRSZWFkRXZlbnRTZW50KSB7CiAgICAgICAgX2V2ZW50RGlzcGF0Y2hlcihSYXdTb2NrZXRFdmVudC5yZWFkQ2xvc2VkKTsKICAgICAgfQogICAgICBfc29ja2V0U3Vic2NyaXB0aW9uCiAgICAgICAgLi5vbkRhdGEoX2V2ZW50RGlzcGF0Y2hlcikKICAgICAgICAuLm9uRXJyb3IoX3JlcG9ydEVycm9yKQogICAgICAgIC4ub25Eb25lKF9kb25lSGFuZGxlcik7CiAgICB9CiAgICB0cnkgewogICAgICB2YXIgZW5jb2RlZFByb3RvY29scyA9CiAgICAgICAgICBTZWN1cml0eUNvbnRleHQuX3Byb3RvY29sc1RvTGVuZ3RoRW5jb2Rpbmcoc3VwcG9ydGVkUHJvdG9jb2xzKTsKICAgICAgX3NlY3VyZUZpbHRlci5jb25uZWN0KAogICAgICAgICAgYWRkcmVzcy5ob3N0LAogICAgICAgICAgY29udGV4dCwKICAgICAgICAgIGlzX3NlcnZlciwKICAgICAgICAgIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSB8fCByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGUsCiAgICAgICAgICByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGUsCiAgICAgICAgICBlbmNvZGVkUHJvdG9jb2xzKTsKICAgICAgX3NlY3VyZUhhbmRzaGFrZSgpOwogICAgfSBjYXRjaCAoZSwgcykgewogICAgICBfcmVwb3J0RXJyb3IoZSwgcyk7CiAgICB9CiAgfQoKICBTdHJlYW1TdWJzY3JpcHRpb248UmF3U29ja2V0RXZlbnQ+IGxpc3Rlbih2b2lkIG9uRGF0YShSYXdTb2NrZXRFdmVudCBkYXRhKSwKICAgICAge0Z1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcn0pIHsKICAgIF9zZW5kV3JpdGVFdmVudCgpOwogICAgcmV0dXJuIF9zdHJlYW0ubGlzdGVuKG9uRGF0YSwKICAgICAgICBvbkVycm9yOiBvbkVycm9yLCBvbkRvbmU6IG9uRG9uZSwgY2FuY2VsT25FcnJvcjogY2FuY2VsT25FcnJvcik7CiAgfQoKICBzdGF0aWMgdm9pZCBfdmVyaWZ5RmllbGRzKAogICAgICBob3N0LAogICAgICBpbnQgcmVxdWVzdGVkUG9ydCwKICAgICAgYm9vbCBpc19zZXJ2ZXIsCiAgICAgIGJvb2wgcmVxdWVzdENsaWVudENlcnRpZmljYXRlLAogICAgICBib29sIHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgRnVuY3Rpb24gb25CYWRDZXJ0aWZpY2F0ZSkgewogICAgaWYgKGhvc3QgaXMhIFN0cmluZyAmJiBob3N0IGlzISBJbnRlcm5ldEFkZHJlc3MpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoImhvc3QgaXMgbm90IGEgU3RyaW5nIG9yIGFuIEludGVybmV0QWRkcmVzcyIpOwogICAgfQogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwocmVxdWVzdGVkUG9ydCwgInJlcXVlc3RlZFBvcnQiKTsKICAgIGlmIChyZXF1ZXN0ZWRQb3J0IDwgMCB8fCByZXF1ZXN0ZWRQb3J0ID4gNjU1MzUpIHsKICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcigicmVxdWVzdGVkUG9ydCBpcyBub3QgaW4gdGhlIHJhbmdlIDAuLjY1NTM1Iik7CiAgICB9CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbCgKICAgICAgICByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGUsICJyZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGUiKTsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKAogICAgICAgIHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZSwgInJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZSIpOwogIH0KCiAgaW50IGdldCBwb3J0ID0+IF9zb2NrZXQucG9ydDsKCiAgSW50ZXJuZXRBZGRyZXNzIGdldCByZW1vdGVBZGRyZXNzID0+IF9zb2NrZXQucmVtb3RlQWRkcmVzczsKCiAgaW50IGdldCByZW1vdGVQb3J0ID0+IF9zb2NrZXQucmVtb3RlUG9ydDsKCiAgdm9pZCBzZXQgX293bmVyKG93bmVyKSB7CiAgICAoX3NvY2tldCBhcyBkeW5hbWljKS5fb3duZXIgPSBvd25lcjsKICB9CgogIGludCBhdmFpbGFibGUoKSB7CiAgICByZXR1cm4gX3N0YXR1cyAhPSBjb25uZWN0ZWRTdGF0dXMKICAgICAgICA/IDAKICAgICAgICA6IF9zZWN1cmVGaWx0ZXIuYnVmZmVyc1tyZWFkUGxhaW50ZXh0SWRdLmxlbmd0aDsKICB9CgogIEZ1dHVyZTxSYXdTZWN1cmVTb2NrZXQ+IGNsb3NlKCkgewogICAgc2h1dGRvd24oU29ja2V0RGlyZWN0aW9uLmJvdGgpOwogICAgcmV0dXJuIF9jbG9zZUNvbXBsZXRlci5mdXR1cmU7CiAgfQoKICB2b2lkIF9jb21wbGV0ZUNsb3NlQ29tcGxldGVyKFtSYXdTb2NrZXQgZHVtbXldKSB7CiAgICBpZiAoIV9jbG9zZUNvbXBsZXRlci5pc0NvbXBsZXRlZCkgX2Nsb3NlQ29tcGxldGVyLmNvbXBsZXRlKHRoaXMpOwogIH0KCiAgdm9pZCBfY2xvc2UoKSB7CiAgICBfY2xvc2VkV3JpdGUgPSB0cnVlOwogICAgX2Nsb3NlZFJlYWQgPSB0cnVlOwogICAgaWYgKF9zb2NrZXQgIT0gbnVsbCkgewogICAgICBfc29ja2V0LmNsb3NlKCkudGhlbihfY29tcGxldGVDbG9zZUNvbXBsZXRlcik7CiAgICB9IGVsc2UgewogICAgICBfY29tcGxldGVDbG9zZUNvbXBsZXRlcigpOwogICAgfQogICAgX3NvY2tldENsb3NlZFdyaXRlID0gdHJ1ZTsKICAgIF9zb2NrZXRDbG9zZWRSZWFkID0gdHJ1ZTsKICAgIGlmICghX2ZpbHRlckFjdGl2ZSAmJiBfc2VjdXJlRmlsdGVyICE9IG51bGwpIHsKICAgICAgX3NlY3VyZUZpbHRlci5kZXN0cm95KCk7CiAgICAgIF9zZWN1cmVGaWx0ZXIgPSBudWxsOwogICAgfQogICAgaWYgKF9zb2NrZXRTdWJzY3JpcHRpb24gIT0gbnVsbCkgewogICAgICBfc29ja2V0U3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogICAgfQogICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICAgIF9zdGF0dXMgPSBjbG9zZWRTdGF0dXM7CiAgfQoKICB2b2lkIHNodXRkb3duKFNvY2tldERpcmVjdGlvbiBkaXJlY3Rpb24pIHsKICAgIGlmIChkaXJlY3Rpb24gPT0gU29ja2V0RGlyZWN0aW9uLnNlbmQgfHwKICAgICAgICBkaXJlY3Rpb24gPT0gU29ja2V0RGlyZWN0aW9uLmJvdGgpIHsKICAgICAgX2Nsb3NlZFdyaXRlID0gdHJ1ZTsKICAgICAgaWYgKF9maWx0ZXJTdGF0dXMud3JpdGVFbXB0eSkgewogICAgICAgIF9zb2NrZXQuc2h1dGRvd24oU29ja2V0RGlyZWN0aW9uLnNlbmQpOwogICAgICAgIF9zb2NrZXRDbG9zZWRXcml0ZSA9IHRydWU7CiAgICAgICAgaWYgKF9jbG9zZWRSZWFkKSB7CiAgICAgICAgICBfY2xvc2UoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChkaXJlY3Rpb24gPT0gU29ja2V0RGlyZWN0aW9uLnJlY2VpdmUgfHwKICAgICAgICBkaXJlY3Rpb24gPT0gU29ja2V0RGlyZWN0aW9uLmJvdGgpIHsKICAgICAgX2Nsb3NlZFJlYWQgPSB0cnVlOwogICAgICBfc29ja2V0Q2xvc2VkUmVhZCA9IHRydWU7CiAgICAgIF9zb2NrZXQuc2h1dGRvd24oU29ja2V0RGlyZWN0aW9uLnJlY2VpdmUpOwogICAgICBpZiAoX3NvY2tldENsb3NlZFdyaXRlKSB7CiAgICAgICAgX2Nsb3NlKCk7CiAgICAgIH0KICAgIH0KICB9CgogIGJvb2wgZ2V0IHdyaXRlRXZlbnRzRW5hYmxlZCA9PiBfd3JpdGVFdmVudHNFbmFibGVkOwoKICB2b2lkIHNldCB3cml0ZUV2ZW50c0VuYWJsZWQoYm9vbCB2YWx1ZSkgewogICAgX3dyaXRlRXZlbnRzRW5hYmxlZCA9IHZhbHVlOwogICAgaWYgKHZhbHVlKSB7CiAgICAgIFRpbWVyLnJ1bigoKSA9PiBfc2VuZFdyaXRlRXZlbnQoKSk7CiAgICB9CiAgfQoKICBib29sIGdldCByZWFkRXZlbnRzRW5hYmxlZCA9PiBfcmVhZEV2ZW50c0VuYWJsZWQ7CgogIHZvaWQgc2V0IHJlYWRFdmVudHNFbmFibGVkKGJvb2wgdmFsdWUpIHsKICAgIF9yZWFkRXZlbnRzRW5hYmxlZCA9IHZhbHVlOwogICAgX3NjaGVkdWxlUmVhZEV2ZW50KCk7CiAgfQoKICBMaXN0PGludD4gcmVhZChbaW50IGxlbmd0aF0pIHsKICAgIGlmIChsZW5ndGggIT0gbnVsbCAmJiAobGVuZ3RoIGlzISBpbnQgfHwgbGVuZ3RoIDwgMCkpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAiSW52YWxpZCBsZW5ndGggcGFyYW1ldGVyIGluIFNlY3VyZVNvY2tldC5yZWFkIChsZW5ndGg6ICRsZW5ndGgpIik7CiAgICB9CiAgICBpZiAoX2Nsb3NlZFJlYWQpIHsKICAgICAgdGhyb3cgbmV3IFNvY2tldEV4Y2VwdGlvbigiUmVhZGluZyBmcm9tIGEgY2xvc2VkIHNvY2tldCIpOwogICAgfQogICAgaWYgKF9zdGF0dXMgIT0gY29ubmVjdGVkU3RhdHVzKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgdmFyIHJlc3VsdCA9IF9zZWN1cmVGaWx0ZXIuYnVmZmVyc1tyZWFkUGxhaW50ZXh0SWRdLnJlYWQobGVuZ3RoKTsKICAgIF9zY2hlZHVsZUZpbHRlcigpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIFdyaXRlIHRoZSBkYXRhIHRvIHRoZSBzb2NrZXQsIGFuZCBzY2hlZHVsZSB0aGUgZmlsdGVyIHRvIGVuY3J5cHQgaXQuCiAgaW50IHdyaXRlKExpc3Q8aW50PiBkYXRhLCBbaW50IG9mZnNldCwgaW50IGJ5dGVzXSkgewogICAgaWYgKGJ5dGVzICE9IG51bGwgJiYgKGJ5dGVzIGlzISBpbnQgfHwgYnl0ZXMgPCAwKSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigKICAgICAgICAgICJJbnZhbGlkIGJ5dGVzIHBhcmFtZXRlciBpbiBTZWN1cmVTb2NrZXQucmVhZCAoYnl0ZXM6ICRieXRlcykiKTsKICAgIH0KICAgIGlmIChvZmZzZXQgIT0gbnVsbCAmJiAob2Zmc2V0IGlzISBpbnQgfHwgb2Zmc2V0IDwgMCkpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAiSW52YWxpZCBvZmZzZXQgcGFyYW1ldGVyIGluIFNlY3VyZVNvY2tldC5yZWFkIChvZmZzZXQ6ICRvZmZzZXQpIik7CiAgICB9CiAgICBpZiAoX2Nsb3NlZFdyaXRlKSB7CiAgICAgIF9jb250cm9sbGVyLmFkZEVycm9yKG5ldyBTb2NrZXRFeGNlcHRpb24oIldyaXRpbmcgdG8gYSBjbG9zZWQgc29ja2V0IikpOwogICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmIChfc3RhdHVzICE9IGNvbm5lY3RlZFN0YXR1cykgcmV0dXJuIDA7CiAgICBvZmZzZXQgPz89IDA7CiAgICBieXRlcyA/Pz0gZGF0YS5sZW5ndGggLSBvZmZzZXQ7CgogICAgaW50IHdyaXR0ZW4gPQogICAgICAgIF9zZWN1cmVGaWx0ZXIuYnVmZmVyc1t3cml0ZVBsYWludGV4dElkXS53cml0ZShkYXRhLCBvZmZzZXQsIGJ5dGVzKTsKICAgIGlmICh3cml0dGVuID4gMCkgewogICAgICBfZmlsdGVyU3RhdHVzLndyaXRlRW1wdHkgPSBmYWxzZTsKICAgIH0KICAgIF9zY2hlZHVsZUZpbHRlcigpOwogICAgcmV0dXJuIHdyaXR0ZW47CiAgfQoKICBYNTA5Q2VydGlmaWNhdGUgZ2V0IHBlZXJDZXJ0aWZpY2F0ZSA9PiBfc2VjdXJlRmlsdGVyLnBlZXJDZXJ0aWZpY2F0ZTsKCiAgU3RyaW5nIGdldCBzZWxlY3RlZFByb3RvY29sID0+IF9zZWxlY3RlZFByb3RvY29sOwoKICBib29sIF9vbkJhZENlcnRpZmljYXRlV3JhcHBlcihYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUpIHsKICAgIGlmIChvbkJhZENlcnRpZmljYXRlID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIHZhciByZXN1bHQgPSBvbkJhZENlcnRpZmljYXRlKGNlcnRpZmljYXRlKTsKICAgIGlmIChyZXN1bHQgaXMgYm9vbCkgcmV0dXJuIHJlc3VsdDsKICAgIHRocm93IG5ldyBIYW5kc2hha2VFeGNlcHRpb24oCiAgICAgICAgIm9uQmFkQ2VydGlmaWNhdGUgY2FsbGJhY2sgcmV0dXJuZWQgbm9uLWJvb2xlYW4gJHJlc3VsdCIpOwogIH0KCiAgYm9vbCBzZXRPcHRpb24oU29ja2V0T3B0aW9uIG9wdGlvbiwgYm9vbCBlbmFibGVkKSB7CiAgICBpZiAoX3NvY2tldCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gX3NvY2tldC5zZXRPcHRpb24ob3B0aW9uLCBlbmFibGVkKTsKICB9CgogIFVpbnQ4TGlzdCBnZXRSYXdPcHRpb24oUmF3U29ja2V0T3B0aW9uIG9wdGlvbikgewogICAgcmV0dXJuIF9zb2NrZXQ/LmdldFJhd09wdGlvbihvcHRpb24pOwogIH0KCiAgdm9pZCBzZXRSYXdPcHRpb24oUmF3U29ja2V0T3B0aW9uIG9wdGlvbikgewogICAgX3NvY2tldD8uc2V0UmF3T3B0aW9uKG9wdGlvbik7CiAgfQoKICB2b2lkIF9ldmVudERpc3BhdGNoZXIoUmF3U29ja2V0RXZlbnQgZXZlbnQpIHsKICAgIHRyeSB7CiAgICAgIGlmIChldmVudCA9PSBSYXdTb2NrZXRFdmVudC5yZWFkKSB7CiAgICAgICAgX3JlYWRIYW5kbGVyKCk7CiAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gUmF3U29ja2V0RXZlbnQud3JpdGUpIHsKICAgICAgICBfd3JpdGVIYW5kbGVyKCk7CiAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gUmF3U29ja2V0RXZlbnQucmVhZENsb3NlZCkgewogICAgICAgIF9jbG9zZUhhbmRsZXIoKTsKICAgICAgfQogICAgfSBjYXRjaCAoZSwgc3RhY2tUcmFjZSkgewogICAgICBfcmVwb3J0RXJyb3IoZSwgc3RhY2tUcmFjZSk7CiAgICB9CiAgfQoKICB2b2lkIF9yZWFkSGFuZGxlcigpIHsKICAgIF9yZWFkU29ja2V0KCk7CiAgICBfc2NoZWR1bGVGaWx0ZXIoKTsKICB9CgogIHZvaWQgX3dyaXRlSGFuZGxlcigpIHsKICAgIF93cml0ZVNvY2tldCgpOwogICAgX3NjaGVkdWxlRmlsdGVyKCk7CiAgfQoKICB2b2lkIF9kb25lSGFuZGxlcigpIHsKICAgIGlmIChfZmlsdGVyU3RhdHVzLnJlYWRFbXB0eSkgewogICAgICBfY2xvc2UoKTsKICAgIH0KICB9CgogIHZvaWQgX3JlcG9ydEVycm9yKGUsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICBpZiAoX3N0YXR1cyA9PSBjbG9zZWRTdGF0dXMpIHsKICAgICAgcmV0dXJuOwogICAgfSBlbHNlIGlmIChfY29ubmVjdFBlbmRpbmcpIHsKICAgICAgLy8gX2Nvbm5lY3RQZW5kaW5nIGlzIHRydWUgdW50aWwgdGhlIGhhbmRzaGFrZSBoYXMgY29tcGxldGVkLCBhbmQgdGhlCiAgICAgIC8vIF9oYW5kc2hha2VDb21wbGV0ZSBmdXR1cmUgcmV0dXJuZWQgZnJvbSBTZWN1cmVTb2NrZXQuY29ubmVjdCBoYXMKICAgICAgLy8gY29tcGxldGVkLiAgQmVmb3JlIHRoaXMgcG9pbnQsIHdlIG11c3QgY29tcGxldGUgaXQgd2l0aCBhbiBlcnJvci4KICAgICAgX2hhbmRzaGFrZUNvbXBsZXRlLmNvbXBsZXRlRXJyb3IoZSwgc3RhY2tUcmFjZSk7CiAgICB9IGVsc2UgewogICAgICBfY29udHJvbGxlci5hZGRFcnJvcihlLCBzdGFja1RyYWNlKTsKICAgIH0KICAgIF9jbG9zZSgpOwogIH0KCiAgdm9pZCBfY2xvc2VIYW5kbGVyKCkgewogICAgaWYgKF9zdGF0dXMgPT0gY29ubmVjdGVkU3RhdHVzKSB7CiAgICAgIGlmIChfY2xvc2VkUmVhZCkgcmV0dXJuOwogICAgICBfc29ja2V0Q2xvc2VkUmVhZCA9IHRydWU7CiAgICAgIGlmIChfZmlsdGVyU3RhdHVzLnJlYWRFbXB0eSkgewogICAgICAgIF9jbG9zZWRSZWFkID0gdHJ1ZTsKICAgICAgICBfY29udHJvbGxlci5hZGQoUmF3U29ja2V0RXZlbnQucmVhZENsb3NlZCk7CiAgICAgICAgaWYgKF9zb2NrZXRDbG9zZWRXcml0ZSkgewogICAgICAgICAgX2Nsb3NlKCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIF9zY2hlZHVsZUZpbHRlcigpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKF9zdGF0dXMgPT0gaGFuZHNoYWtlU3RhdHVzKSB7CiAgICAgIF9zb2NrZXRDbG9zZWRSZWFkID0gdHJ1ZTsKICAgICAgaWYgKF9maWx0ZXJTdGF0dXMucmVhZEVtcHR5KSB7CiAgICAgICAgX3JlcG9ydEVycm9yKAogICAgICAgICAgICBuZXcgSGFuZHNoYWtlRXhjZXB0aW9uKCdDb25uZWN0aW9uIHRlcm1pbmF0ZWQgZHVyaW5nIGhhbmRzaGFrZScpLAogICAgICAgICAgICBudWxsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfc2VjdXJlSGFuZHNoYWtlKCk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgX3NlY3VyZUhhbmRzaGFrZSgpIHsKICAgIHRyeSB7CiAgICAgIF9zZWN1cmVGaWx0ZXIuaGFuZHNoYWtlKCk7CiAgICAgIF9maWx0ZXJTdGF0dXMud3JpdGVFbXB0eSA9IGZhbHNlOwogICAgICBfcmVhZFNvY2tldCgpOwogICAgICBfd3JpdGVTb2NrZXQoKTsKICAgICAgX3NjaGVkdWxlRmlsdGVyKCk7CiAgICB9IGNhdGNoIChlLCBzdGFja1RyYWNlKSB7CiAgICAgIF9yZXBvcnRFcnJvcihlLCBzdGFja1RyYWNlKTsKICAgIH0KICB9CgogIHZvaWQgcmVuZWdvdGlhdGUoCiAgICAgIHtib29sIHVzZVNlc3Npb25DYWNoZTogdHJ1ZSwKICAgICAgYm9vbCByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGU6IGZhbHNlLAogICAgICBib29sIHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZTogZmFsc2V9KSB7CiAgICBpZiAoX3N0YXR1cyAhPSBjb25uZWN0ZWRTdGF0dXMpIHsKICAgICAgdGhyb3cgbmV3IEhhbmRzaGFrZUV4Y2VwdGlvbigKICAgICAgICAgICJDYWxsZWQgcmVuZWdvdGlhdGUgb24gYSBub24tY29ubmVjdGVkIHNvY2tldCIpOwogICAgfQogICAgX3NlY3VyZUZpbHRlci5yZW5lZ290aWF0ZSgKICAgICAgICB1c2VTZXNzaW9uQ2FjaGUsIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSwgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlKTsKICAgIF9zdGF0dXMgPSBoYW5kc2hha2VTdGF0dXM7CiAgICBfZmlsdGVyU3RhdHVzLndyaXRlRW1wdHkgPSBmYWxzZTsKICAgIF9zY2hlZHVsZUZpbHRlcigpOwogIH0KCiAgdm9pZCBfc2VjdXJlSGFuZHNoYWtlQ29tcGxldGVIYW5kbGVyKCkgewogICAgX3N0YXR1cyA9IGNvbm5lY3RlZFN0YXR1czsKICAgIGlmIChfY29ubmVjdFBlbmRpbmcpIHsKICAgICAgX2Nvbm5lY3RQZW5kaW5nID0gZmFsc2U7CiAgICAgIHRyeSB7CiAgICAgICAgX3NlbGVjdGVkUHJvdG9jb2wgPSBfc2VjdXJlRmlsdGVyLnNlbGVjdGVkUHJvdG9jb2woKTsKICAgICAgICAvLyBXZSBkb24ndCB3YW50IHVzZXIgY29kZSB0byBydW4gc3luY2hyb25vdXNseSBpbiB0aGlzIGNhbGxiYWNrLgogICAgICAgIFRpbWVyLnJ1bigoKSA9PiBfaGFuZHNoYWtlQ29tcGxldGUuY29tcGxldGUodGhpcykpOwogICAgICB9IGNhdGNoIChlcnJvciwgc3RhY2spIHsKICAgICAgICBfaGFuZHNoYWtlQ29tcGxldGUuY29tcGxldGVFcnJvcihlcnJvciwgc3RhY2spOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIF9vblBhdXNlU3RhdGVDaGFuZ2UoKSB7CiAgICBpZiAoX2NvbnRyb2xsZXIuaXNQYXVzZWQpIHsKICAgICAgX3BhdXNlQ291bnQrKzsKICAgIH0gZWxzZSB7CiAgICAgIF9wYXVzZUNvdW50LS07CiAgICAgIGlmIChfcGF1c2VDb3VudCA9PSAwKSB7CiAgICAgICAgX3NjaGVkdWxlUmVhZEV2ZW50KCk7CiAgICAgICAgX3NlbmRXcml0ZUV2ZW50KCk7IC8vIENhbiBzZW5kIGV2ZW50IHN5bmNocm9ub3VzbHkuCiAgICAgIH0KICAgIH0KCiAgICBpZiAoIV9zb2NrZXRDbG9zZWRSZWFkIHx8ICFfc29ja2V0Q2xvc2VkV3JpdGUpIHsKICAgICAgaWYgKF9jb250cm9sbGVyLmlzUGF1c2VkKSB7CiAgICAgICAgX3NvY2tldFN1YnNjcmlwdGlvbi5wYXVzZSgpOwogICAgICB9IGVsc2UgewogICAgICAgIF9zb2NrZXRTdWJzY3JpcHRpb24ucmVzdW1lKCk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgX29uU3Vic2NyaXB0aW9uU3RhdGVDaGFuZ2UoKSB7CiAgICBpZiAoX2NvbnRyb2xsZXIuaGFzTGlzdGVuZXIpIHsKICAgICAgLy8gVE9ETyhham9obnNlbik6IERvIHNvbWV0aGluZyBoZXJlPwogICAgfQogIH0KCiAgdm9pZCBfc2NoZWR1bGVGaWx0ZXIoKSB7CiAgICBfZmlsdGVyUGVuZGluZyA9IHRydWU7CiAgICBfdHJ5RmlsdGVyKCk7CiAgfQoKICB2b2lkIF90cnlGaWx0ZXIoKSB7CiAgICBpZiAoX3N0YXR1cyA9PSBjbG9zZWRTdGF0dXMpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKF9maWx0ZXJQZW5kaW5nICYmICFfZmlsdGVyQWN0aXZlKSB7CiAgICAgIF9maWx0ZXJBY3RpdmUgPSB0cnVlOwogICAgICBfZmlsdGVyUGVuZGluZyA9IGZhbHNlOwogICAgICBfcHVzaEFsbEZpbHRlclN0YWdlcygpLnRoZW4oKHN0YXR1cykgewogICAgICAgIF9maWx0ZXJTdGF0dXMgPSBzdGF0dXM7CiAgICAgICAgX2ZpbHRlckFjdGl2ZSA9IGZhbHNlOwogICAgICAgIGlmIChfc3RhdHVzID09IGNsb3NlZFN0YXR1cykgewogICAgICAgICAgX3NlY3VyZUZpbHRlci5kZXN0cm95KCk7CiAgICAgICAgICBfc2VjdXJlRmlsdGVyID0gbnVsbDsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgX3NvY2tldC5yZWFkRXZlbnRzRW5hYmxlZCA9IHRydWU7CiAgICAgICAgaWYgKF9maWx0ZXJTdGF0dXMud3JpdGVFbXB0eSAmJiBfY2xvc2VkV3JpdGUgJiYgIV9zb2NrZXRDbG9zZWRXcml0ZSkgewogICAgICAgICAgLy8gQ2hlY2tzIGZvciBhbmQgaGFuZGxlcyBhbGwgY2FzZXMgb2YgcGFydGlhbGx5IGNsb3NlZCBzb2NrZXRzLgogICAgICAgICAgc2h1dGRvd24oU29ja2V0RGlyZWN0aW9uLnNlbmQpOwogICAgICAgICAgaWYgKF9zdGF0dXMgPT0gY2xvc2VkU3RhdHVzKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKF9maWx0ZXJTdGF0dXMucmVhZEVtcHR5ICYmIF9zb2NrZXRDbG9zZWRSZWFkICYmICFfY2xvc2VkUmVhZCkgewogICAgICAgICAgaWYgKF9zdGF0dXMgPT0gaGFuZHNoYWtlU3RhdHVzKSB7CiAgICAgICAgICAgIF9zZWN1cmVGaWx0ZXIuaGFuZHNoYWtlKCk7CiAgICAgICAgICAgIGlmIChfc3RhdHVzID09IGhhbmRzaGFrZVN0YXR1cykgewogICAgICAgICAgICAgIHRocm93IG5ldyBIYW5kc2hha2VFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICdDb25uZWN0aW9uIHRlcm1pbmF0ZWQgZHVyaW5nIGhhbmRzaGFrZScpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBfY2xvc2VIYW5kbGVyKCk7CiAgICAgICAgfQogICAgICAgIGlmIChfc3RhdHVzID09IGNsb3NlZFN0YXR1cykgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoX2ZpbHRlclN0YXR1cy5wcm9ncmVzcykgewogICAgICAgICAgX2ZpbHRlclBlbmRpbmcgPSB0cnVlOwogICAgICAgICAgaWYgKF9maWx0ZXJTdGF0dXMud3JpdGVFbmNyeXB0ZWROb0xvbmdlckVtcHR5KSB7CiAgICAgICAgICAgIF93cml0ZVNvY2tldCgpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKF9maWx0ZXJTdGF0dXMud3JpdGVQbGFpbnRleHROb0xvbmdlckZ1bGwpIHsKICAgICAgICAgICAgX3NlbmRXcml0ZUV2ZW50KCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoX2ZpbHRlclN0YXR1cy5yZWFkRW5jcnlwdGVkTm9Mb25nZXJGdWxsKSB7CiAgICAgICAgICAgIF9yZWFkU29ja2V0KCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoX2ZpbHRlclN0YXR1cy5yZWFkUGxhaW50ZXh0Tm9Mb25nZXJFbXB0eSkgewogICAgICAgICAgICBfc2NoZWR1bGVSZWFkRXZlbnQoKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChfc3RhdHVzID09IGhhbmRzaGFrZVN0YXR1cykgewogICAgICAgICAgICBfc2VjdXJlSGFuZHNoYWtlKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF90cnlGaWx0ZXIoKTsKICAgICAgfSkuY2F0Y2hFcnJvcihfcmVwb3J0RXJyb3IpOwogICAgfQogIH0KCiAgTGlzdDxpbnQ+IF9yZWFkU29ja2V0T3JCdWZmZXJlZERhdGEoaW50IGJ5dGVzKSB7CiAgICBpZiAoX2J1ZmZlcmVkRGF0YSAhPSBudWxsKSB7CiAgICAgIGlmIChieXRlcyA+IF9idWZmZXJlZERhdGEubGVuZ3RoIC0gX2J1ZmZlcmVkRGF0YUluZGV4KSB7CiAgICAgICAgYnl0ZXMgPSBfYnVmZmVyZWREYXRhLmxlbmd0aCAtIF9idWZmZXJlZERhdGFJbmRleDsKICAgICAgfQogICAgICB2YXIgcmVzdWx0ID0KICAgICAgICAgIF9idWZmZXJlZERhdGEuc3VibGlzdChfYnVmZmVyZWREYXRhSW5kZXgsIF9idWZmZXJlZERhdGFJbmRleCArIGJ5dGVzKTsKICAgICAgX2J1ZmZlcmVkRGF0YUluZGV4ICs9IGJ5dGVzOwogICAgICBpZiAoX2J1ZmZlcmVkRGF0YS5sZW5ndGggPT0gX2J1ZmZlcmVkRGF0YUluZGV4KSB7CiAgICAgICAgX2J1ZmZlcmVkRGF0YSA9IG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0gZWxzZSBpZiAoIV9zb2NrZXRDbG9zZWRSZWFkKSB7CiAgICAgIHJldHVybiBfc29ja2V0LnJlYWQoYnl0ZXMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICB2b2lkIF9yZWFkU29ja2V0KCkgewogICAgaWYgKF9zdGF0dXMgPT0gY2xvc2VkU3RhdHVzKSByZXR1cm47CiAgICB2YXIgYnVmZmVyID0gX3NlY3VyZUZpbHRlci5idWZmZXJzW3JlYWRFbmNyeXB0ZWRJZF07CiAgICBpZiAoYnVmZmVyLndyaXRlRnJvbVNvdXJjZShfcmVhZFNvY2tldE9yQnVmZmVyZWREYXRhKSA+IDApIHsKICAgICAgX2ZpbHRlclN0YXR1cy5yZWFkRW1wdHkgPSBmYWxzZTsKICAgIH0gZWxzZSB7CiAgICAgIF9zb2NrZXQucmVhZEV2ZW50c0VuYWJsZWQgPSBmYWxzZTsKICAgIH0KICB9CgogIHZvaWQgX3dyaXRlU29ja2V0KCkgewogICAgaWYgKF9zb2NrZXRDbG9zZWRXcml0ZSkgcmV0dXJuOwogICAgdmFyIGJ1ZmZlciA9IF9zZWN1cmVGaWx0ZXIuYnVmZmVyc1t3cml0ZUVuY3J5cHRlZElkXTsKICAgIGlmIChidWZmZXIucmVhZFRvU29ja2V0KF9zb2NrZXQpKSB7CiAgICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBibG9ja2VkCiAgICAgIF9zb2NrZXQud3JpdGVFdmVudHNFbmFibGVkID0gdHJ1ZTsKICAgIH0KICB9CgogIC8vIElmIGEgcmVhZCBldmVudCBzaG91bGQgYmUgc2VudCwgYWRkIGl0IHRvIHRoZSBjb250cm9sbGVyLgogIF9zY2hlZHVsZVJlYWRFdmVudCgpIHsKICAgIGlmICghX3BlbmRpbmdSZWFkRXZlbnQgJiYKICAgICAgICBfcmVhZEV2ZW50c0VuYWJsZWQgJiYKICAgICAgICBfcGF1c2VDb3VudCA9PSAwICYmCiAgICAgICAgX3NlY3VyZUZpbHRlciAhPSBudWxsICYmCiAgICAgICAgIV9zZWN1cmVGaWx0ZXIuYnVmZmVyc1tyZWFkUGxhaW50ZXh0SWRdLmlzRW1wdHkpIHsKICAgICAgX3BlbmRpbmdSZWFkRXZlbnQgPSB0cnVlOwogICAgICBUaW1lci5ydW4oX3NlbmRSZWFkRXZlbnQpOwogICAgfQogIH0KCiAgX3NlbmRSZWFkRXZlbnQoKSB7CiAgICBfcGVuZGluZ1JlYWRFdmVudCA9IGZhbHNlOwogICAgaWYgKF9zdGF0dXMgIT0gY2xvc2VkU3RhdHVzICYmCiAgICAgICAgX3JlYWRFdmVudHNFbmFibGVkICYmCiAgICAgICAgX3BhdXNlQ291bnQgPT0gMCAmJgogICAgICAgIF9zZWN1cmVGaWx0ZXIgIT0gbnVsbCAmJgogICAgICAgICFfc2VjdXJlRmlsdGVyLmJ1ZmZlcnNbcmVhZFBsYWludGV4dElkXS5pc0VtcHR5KSB7CiAgICAgIF9jb250cm9sbGVyLmFkZChSYXdTb2NrZXRFdmVudC5yZWFkKTsKICAgICAgX3NjaGVkdWxlUmVhZEV2ZW50KCk7CiAgICB9CiAgfQoKICAvLyBJZiBhIHdyaXRlIGV2ZW50IHNob3VsZCBiZSBzZW50LCBhZGQgaXQgdG8gdGhlIGNvbnRyb2xsZXIuCiAgX3NlbmRXcml0ZUV2ZW50KCkgewogICAgaWYgKCFfY2xvc2VkV3JpdGUgJiYKICAgICAgICBfd3JpdGVFdmVudHNFbmFibGVkICYmCiAgICAgICAgX3BhdXNlQ291bnQgPT0gMCAmJgogICAgICAgIF9zZWN1cmVGaWx0ZXIgIT0gbnVsbCAmJgogICAgICAgIF9zZWN1cmVGaWx0ZXIuYnVmZmVyc1t3cml0ZVBsYWludGV4dElkXS5mcmVlID4gMCkgewogICAgICBfd3JpdGVFdmVudHNFbmFibGVkID0gZmFsc2U7CiAgICAgIF9jb250cm9sbGVyLmFkZChSYXdTb2NrZXRFdmVudC53cml0ZSk7CiAgICB9CiAgfQoKICBGdXR1cmU8X0ZpbHRlclN0YXR1cz4gX3B1c2hBbGxGaWx0ZXJTdGFnZXMoKSB7CiAgICBib29sIHdhc0luSGFuZHNoYWtlID0gX3N0YXR1cyAhPSBjb25uZWN0ZWRTdGF0dXM7CiAgICBMaXN0IGFyZ3MgPSBuZXcgTGlzdCgyICsgYnVmZmVyQ291bnQgKiAyKTsKICAgIGFyZ3NbMF0gPSBfc2VjdXJlRmlsdGVyLl9wb2ludGVyKCk7CiAgICBhcmdzWzFdID0gd2FzSW5IYW5kc2hha2U7CiAgICB2YXIgYnVmcyA9IF9zZWN1cmVGaWx0ZXIuYnVmZmVyczsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmZmVyQ291bnQ7ICsraSkgewogICAgICBhcmdzWzIgKiBpICsgMl0gPSBidWZzW2ldLnN0YXJ0OwogICAgICBhcmdzWzIgKiBpICsgM10gPSBidWZzW2ldLmVuZDsKICAgIH0KCiAgICByZXR1cm4gX0lPU2VydmljZS5fZGlzcGF0Y2goX0lPU2VydmljZS5zc2xQcm9jZXNzRmlsdGVyLCBhcmdzKQogICAgICAgIC50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAocmVzcG9uc2UubGVuZ3RoID09IDIpIHsKICAgICAgICBpZiAod2FzSW5IYW5kc2hha2UpIHsKICAgICAgICAgIC8vIElmIHdlJ3JlIGluIGhhbmRzaGFrZSwgdGhyb3cgYSBoYW5kc2hha2UgZXJyb3IuCiAgICAgICAgICBfcmVwb3J0RXJyb3IoCiAgICAgICAgICAgICAgbmV3IEhhbmRzaGFrZUV4Y2VwdGlvbignJHtyZXNwb25zZVsxXX0gZXJyb3IgJHtyZXNwb25zZVswXX0nKSwKICAgICAgICAgICAgICBudWxsKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gSWYgd2UncmUgY29ubmVjdGVkLCB0aHJvdyBhIFRMUyBlcnJvci4KICAgICAgICAgIF9yZXBvcnRFcnJvcigKICAgICAgICAgICAgICBuZXcgVGxzRXhjZXB0aW9uKCcke3Jlc3BvbnNlWzFdfSBlcnJvciAke3Jlc3BvbnNlWzBdfScpLCBudWxsKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaW50IHN0YXJ0KGludCBpbmRleCkgPT4gcmVzcG9uc2VbMiAqIGluZGV4XTsKICAgICAgaW50IGVuZChpbnQgaW5kZXgpID0+IHJlc3BvbnNlWzIgKiBpbmRleCArIDFdOwoKICAgICAgX0ZpbHRlclN0YXR1cyBzdGF0dXMgPSBuZXcgX0ZpbHRlclN0YXR1cygpOwogICAgICAvLyBDb21wdXRlIHdyaXRlRW1wdHkgYXMgIndyaXRlIHBsYWludGV4dCBidWZmZXIgYW5kIHdyaXRlIGVuY3J5cHRlZAogICAgICAvLyBidWZmZXIgd2VyZSBlbXB0eSB3aGVuIHdlIHN0YXJ0ZWQgYW5kIGFyZSBlbXB0eSBub3ciLgogICAgICBzdGF0dXMud3JpdGVFbXB0eSA9IGJ1ZnNbd3JpdGVQbGFpbnRleHRJZF0uaXNFbXB0eSAmJgogICAgICAgICAgc3RhcnQod3JpdGVFbmNyeXB0ZWRJZCkgPT0gZW5kKHdyaXRlRW5jcnlwdGVkSWQpOwogICAgICAvLyBJZiB3ZSB3ZXJlIGluIGhhbmRzaGFrZSB3aGVuIHRoaXMgc3RhcnRlZCwgX3dyaXRlRW1wdHkgbWF5IGJlIGZhbHNlCiAgICAgIC8vIGJlY2F1c2UgdGhlIGhhbmRzaGFrZSB3cm90ZSBkYXRhIGFmdGVyIHdlIGNoZWNrZWQuCiAgICAgIGlmICh3YXNJbkhhbmRzaGFrZSkgc3RhdHVzLndyaXRlRW1wdHkgPSBmYWxzZTsKCiAgICAgIC8vIENvbXB1dGUgcmVhZEVtcHR5IGFzICJib3RoIHJlYWQgYnVmZmVycyB3ZXJlIGVtcHR5IHdoZW4gd2Ugc3RhcnRlZAogICAgICAvLyBhbmQgYXJlIGVtcHR5IG5vdyIuCiAgICAgIHN0YXR1cy5yZWFkRW1wdHkgPSBidWZzW3JlYWRFbmNyeXB0ZWRJZF0uaXNFbXB0eSAmJgogICAgICAgICAgc3RhcnQocmVhZFBsYWludGV4dElkKSA9PSBlbmQocmVhZFBsYWludGV4dElkKTsKCiAgICAgIF9FeHRlcm5hbEJ1ZmZlciBidWZmZXIgPSBidWZzW3dyaXRlUGxhaW50ZXh0SWRdOwogICAgICBpbnQgbmV3X3N0YXJ0ID0gc3RhcnQod3JpdGVQbGFpbnRleHRJZCk7CiAgICAgIGlmIChuZXdfc3RhcnQgIT0gYnVmZmVyLnN0YXJ0KSB7CiAgICAgICAgc3RhdHVzLnByb2dyZXNzID0gdHJ1ZTsKICAgICAgICBpZiAoYnVmZmVyLmZyZWUgPT0gMCkgewogICAgICAgICAgc3RhdHVzLndyaXRlUGxhaW50ZXh0Tm9Mb25nZXJGdWxsID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgYnVmZmVyLnN0YXJ0ID0gbmV3X3N0YXJ0OwogICAgICB9CiAgICAgIGJ1ZmZlciA9IGJ1ZnNbcmVhZEVuY3J5cHRlZElkXTsKICAgICAgbmV3X3N0YXJ0ID0gc3RhcnQocmVhZEVuY3J5cHRlZElkKTsKICAgICAgaWYgKG5ld19zdGFydCAhPSBidWZmZXIuc3RhcnQpIHsKICAgICAgICBzdGF0dXMucHJvZ3Jlc3MgPSB0cnVlOwogICAgICAgIGlmIChidWZmZXIuZnJlZSA9PSAwKSB7CiAgICAgICAgICBzdGF0dXMucmVhZEVuY3J5cHRlZE5vTG9uZ2VyRnVsbCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGJ1ZmZlci5zdGFydCA9IG5ld19zdGFydDsKICAgICAgfQogICAgICBidWZmZXIgPSBidWZzW3dyaXRlRW5jcnlwdGVkSWRdOwogICAgICBpbnQgbmV3X2VuZCA9IGVuZCh3cml0ZUVuY3J5cHRlZElkKTsKICAgICAgaWYgKG5ld19lbmQgIT0gYnVmZmVyLmVuZCkgewogICAgICAgIHN0YXR1cy5wcm9ncmVzcyA9IHRydWU7CiAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPT0gMCkgewogICAgICAgICAgc3RhdHVzLndyaXRlRW5jcnlwdGVkTm9Mb25nZXJFbXB0eSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGJ1ZmZlci5lbmQgPSBuZXdfZW5kOwogICAgICB9CiAgICAgIGJ1ZmZlciA9IGJ1ZnNbcmVhZFBsYWludGV4dElkXTsKICAgICAgbmV3X2VuZCA9IGVuZChyZWFkUGxhaW50ZXh0SWQpOwogICAgICBpZiAobmV3X2VuZCAhPSBidWZmZXIuZW5kKSB7CiAgICAgICAgc3RhdHVzLnByb2dyZXNzID0gdHJ1ZTsKICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICBzdGF0dXMucmVhZFBsYWludGV4dE5vTG9uZ2VyRW1wdHkgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBidWZmZXIuZW5kID0gbmV3X2VuZDsKICAgICAgfQogICAgICByZXR1cm4gc3RhdHVzOwogICAgfSk7CiAgfQp9CgovKioKICogQSBjaXJjdWxhciBidWZmZXIgYmFja2VkIGJ5IGFuIGV4dGVybmFsIGJ5dGUgYXJyYXkuICBBY2Nlc3NlZCBmcm9tCiAqIGJvdGggQysrIGFuZCBEYXJ0IGNvZGUgaW4gYW4gdW5zeW5jaHJvbml6ZWQgd2F5LCB3aXRoIG9uZSByZWFkaW5nCiAqIGFuZCBvbmUgd3JpdGluZy4gIEFsbCB1cGRhdGVzIHRvIHN0YXJ0IGFuZCBlbmQgYXJlIGRvbmUgYnkgRGFydCBjb2RlLgogKi8KY2xhc3MgX0V4dGVybmFsQnVmZmVyIHsKICAvLyBUaGlzIHdpbGwgYmUgYW4gRXh0ZXJuYWxCeXRlQXJyYXksIGJhY2tlZCBieSBDIGFsbG9jYXRlZCBkYXRhLgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgInNldCIpCiAgTGlzdDxpbnQ+IGRhdGE7CgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBpbnQgc3RhcnQ7CgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBpbnQgZW5kOwoKICBmaW5hbCBzaXplOwoKICBfRXh0ZXJuYWxCdWZmZXIodGhpcy5zaXplKSB7CiAgICBzdGFydCA9IGVuZCA9IHNpemUgfi8gMjsKICB9CgogIHZvaWQgYWR2YW5jZVN0YXJ0KGludCBieXRlcykgewogICAgYXNzZXJ0KHN0YXJ0ID4gZW5kIHx8IHN0YXJ0ICsgYnl0ZXMgPD0gZW5kKTsKICAgIHN0YXJ0ICs9IGJ5dGVzOwogICAgaWYgKHN0YXJ0ID49IHNpemUpIHsKICAgICAgc3RhcnQgLT0gc2l6ZTsKICAgICAgYXNzZXJ0KHN0YXJ0IDw9IGVuZCk7CiAgICAgIGFzc2VydChzdGFydCA8IHNpemUpOwogICAgfQogIH0KCiAgdm9pZCBhZHZhbmNlRW5kKGludCBieXRlcykgewogICAgYXNzZXJ0KHN0YXJ0IDw9IGVuZCB8fCBzdGFydCA+IGVuZCArIGJ5dGVzKTsKICAgIGVuZCArPSBieXRlczsKICAgIGlmIChlbmQgPj0gc2l6ZSkgewogICAgICBlbmQgLT0gc2l6ZTsKICAgICAgYXNzZXJ0KGVuZCA8IHN0YXJ0KTsKICAgICAgYXNzZXJ0KGVuZCA8IHNpemUpOwogICAgfQogIH0KCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBlbmQgPT0gc3RhcnQ7CgogIGludCBnZXQgbGVuZ3RoID0+IHN0YXJ0ID4gZW5kID8gc2l6ZSArIGVuZCAtIHN0YXJ0IDogZW5kIC0gc3RhcnQ7CgogIGludCBnZXQgbGluZWFyTGVuZ3RoID0+IHN0YXJ0ID4gZW5kID8gc2l6ZSAtIHN0YXJ0IDogZW5kIC0gc3RhcnQ7CgogIGludCBnZXQgZnJlZSA9PiBzdGFydCA+IGVuZCA/IHN0YXJ0IC0gZW5kIC0gMSA6IHNpemUgKyBzdGFydCAtIGVuZCAtIDE7CgogIGludCBnZXQgbGluZWFyRnJlZSB7CiAgICBpZiAoc3RhcnQgPiBlbmQpIHJldHVybiBzdGFydCAtIGVuZCAtIDE7CiAgICBpZiAoc3RhcnQgPT0gMCkgcmV0dXJuIHNpemUgLSBlbmQgLSAxOwogICAgcmV0dXJuIHNpemUgLSBlbmQ7CiAgfQoKICBMaXN0PGludD4gcmVhZChpbnQgYnl0ZXMpIHsKICAgIGlmIChieXRlcyA9PSBudWxsKSB7CiAgICAgIGJ5dGVzID0gbGVuZ3RoOwogICAgfSBlbHNlIHsKICAgICAgYnl0ZXMgPSBtaW4oYnl0ZXMsIGxlbmd0aCk7CiAgICB9CiAgICBpZiAoYnl0ZXMgPT0gMCkgcmV0dXJuIG51bGw7CiAgICBMaXN0PGludD4gcmVzdWx0ID0gbmV3IFVpbnQ4TGlzdChieXRlcyk7CiAgICBpbnQgYnl0ZXNSZWFkID0gMDsKICAgIC8vIExvb3Agb3ZlciB6ZXJvLCBvbmUsIG9yIHR3byBsaW5lYXIgZGF0YSByYW5nZXMuCiAgICB3aGlsZSAoYnl0ZXNSZWFkIDwgYnl0ZXMpIHsKICAgICAgaW50IHRvUmVhZCA9IG1pbihieXRlcyAtIGJ5dGVzUmVhZCwgbGluZWFyTGVuZ3RoKTsKICAgICAgcmVzdWx0LnNldFJhbmdlKGJ5dGVzUmVhZCwgYnl0ZXNSZWFkICsgdG9SZWFkLCBkYXRhLCBzdGFydCk7CiAgICAgIGFkdmFuY2VTdGFydCh0b1JlYWQpOwogICAgICBieXRlc1JlYWQgKz0gdG9SZWFkOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGludCB3cml0ZShMaXN0PGludD4gaW5wdXREYXRhLCBpbnQgb2Zmc2V0LCBpbnQgYnl0ZXMpIHsKICAgIGlmIChieXRlcyA+IGZyZWUpIHsKICAgICAgYnl0ZXMgPSBmcmVlOwogICAgfQogICAgaW50IHdyaXR0ZW4gPSAwOwogICAgaW50IHRvV3JpdGUgPSBtaW4oYnl0ZXMsIGxpbmVhckZyZWUpOwogICAgLy8gTG9vcCBvdmVyIHplcm8sIG9uZSwgb3IgdHdvIGxpbmVhciBkYXRhIHJhbmdlcy4KICAgIHdoaWxlICh0b1dyaXRlID4gMCkgewogICAgICBkYXRhLnNldFJhbmdlKGVuZCwgZW5kICsgdG9Xcml0ZSwgaW5wdXREYXRhLCBvZmZzZXQpOwogICAgICBhZHZhbmNlRW5kKHRvV3JpdGUpOwogICAgICBvZmZzZXQgKz0gdG9Xcml0ZTsKICAgICAgd3JpdHRlbiArPSB0b1dyaXRlOwogICAgICB0b1dyaXRlID0gbWluKGJ5dGVzIC0gd3JpdHRlbiwgbGluZWFyRnJlZSk7CiAgICB9CiAgICByZXR1cm4gd3JpdHRlbjsKICB9CgogIGludCB3cml0ZUZyb21Tb3VyY2UoTGlzdDxpbnQ+IGdldERhdGEoaW50IHJlcXVlc3RlZCkpIHsKICAgIGludCB3cml0dGVuID0gMDsKICAgIGludCB0b1dyaXRlID0gbGluZWFyRnJlZTsKICAgIC8vIExvb3Agb3ZlciB6ZXJvLCBvbmUsIG9yIHR3byBsaW5lYXIgZGF0YSByYW5nZXMuCiAgICB3aGlsZSAodG9Xcml0ZSA+IDApIHsKICAgICAgLy8gU291cmNlIHJldHVybnMgYXQgbW9zdCB0b1dyaXRlIGJ5dGVzLCBhbmQgaXQgcmV0dXJucyBudWxsIHdoZW4gZW1wdHkuCiAgICAgIHZhciBpbnB1dERhdGEgPSBnZXREYXRhKHRvV3JpdGUpOwogICAgICBpZiAoaW5wdXREYXRhID09IG51bGwgfHwgaW5wdXREYXRhLmxlbmd0aCA9PSAwKSBicmVhazsKICAgICAgdmFyIGxlbiA9IGlucHV0RGF0YS5sZW5ndGg7CiAgICAgIGRhdGEuc2V0UmFuZ2UoZW5kLCBlbmQgKyBsZW4sIGlucHV0RGF0YSk7CiAgICAgIGFkdmFuY2VFbmQobGVuKTsKICAgICAgd3JpdHRlbiArPSBsZW47CiAgICAgIHRvV3JpdGUgPSBsaW5lYXJGcmVlOwogICAgfQogICAgcmV0dXJuIHdyaXR0ZW47CiAgfQoKICBib29sIHJlYWRUb1NvY2tldChSYXdTb2NrZXQgc29ja2V0KSB7CiAgICAvLyBMb29wIG92ZXIgemVybywgb25lLCBvciB0d28gbGluZWFyIGRhdGEgcmFuZ2VzLgogICAgd2hpbGUgKHRydWUpIHsKICAgICAgdmFyIHRvV3JpdGUgPSBsaW5lYXJMZW5ndGg7CiAgICAgIGlmICh0b1dyaXRlID09IDApIHJldHVybiBmYWxzZTsKICAgICAgaW50IGJ5dGVzID0gc29ja2V0LndyaXRlKGRhdGEsIHN0YXJ0LCB0b1dyaXRlKTsKICAgICAgYWR2YW5jZVN0YXJ0KGJ5dGVzKTsKICAgICAgaWYgKGJ5dGVzIDwgdG9Xcml0ZSkgewogICAgICAgIC8vIFRoZSBzb2NrZXQgaGFzIGJsb2NrZWQgd2hpbGUgd2UgaGF2ZSBkYXRhIHRvIHdyaXRlLgogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBfU2VjdXJlRmlsdGVyIHsKICBleHRlcm5hbCBmYWN0b3J5IF9TZWN1cmVGaWx0ZXIoKTsKCiAgdm9pZCBjb25uZWN0KAogICAgICBTdHJpbmcgaG9zdE5hbWUsCiAgICAgIFNlY3VyaXR5Q29udGV4dCBjb250ZXh0LAogICAgICBib29sIGlzX3NlcnZlciwKICAgICAgYm9vbCByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGUsCiAgICAgIGJvb2wgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlLAogICAgICBVaW50OExpc3QgcHJvdG9jb2xzKTsKICB2b2lkIGRlc3Ryb3koKTsKICB2b2lkIGhhbmRzaGFrZSgpOwogIFN0cmluZyBzZWxlY3RlZFByb3RvY29sKCk7CiAgdm9pZCByZWhhbmRzaGFrZSgpOwogIHZvaWQgcmVuZWdvdGlhdGUoYm9vbCB1c2VTZXNzaW9uQ2FjaGUsIGJvb2wgcmVxdWVzdENsaWVudENlcnRpZmljYXRlLAogICAgICBib29sIHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZSk7CiAgdm9pZCBpbml0KCk7CiAgWDUwOUNlcnRpZmljYXRlIGdldCBwZWVyQ2VydGlmaWNhdGU7CiAgaW50IHByb2Nlc3NCdWZmZXIoaW50IGJ1ZmZlckluZGV4KTsKICB2b2lkIHJlZ2lzdGVyQmFkQ2VydGlmaWNhdGVDYWxsYmFjayhGdW5jdGlvbiBjYWxsYmFjayk7CiAgdm9pZCByZWdpc3RlckhhbmRzaGFrZUNvbXBsZXRlQ2FsbGJhY2soRnVuY3Rpb24gaGFuZHNoYWtlQ29tcGxldGVIYW5kbGVyKTsKCiAgLy8gVGhpcyBjYWxsIG1heSBjYXVzZSBhIHJlZmVyZW5jZSBjb3VudGVkIHBvaW50ZXIgaW4gdGhlIG5hdGl2ZQogIC8vIGltcGxlbWVudGF0aW9uIHRvIGJlIHJldGFpbmVkLiBJdCBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgcmVzdWx0aW5nCiAgLy8gdmFsdWUgaXMgcGFzc2VkIHRvIHRoZSBJTyBzZXJ2aWNlIHRocm91Z2ggYSBjYWxsIHRvIGRpc3BhdGNoKCkuCiAgaW50IF9wb2ludGVyKCk7CgogIExpc3Q8X0V4dGVybmFsQnVmZmVyPiBnZXQgYnVmZmVyczsKfQoKLyoqIEEgc2VjdXJlIG5ldHdvcmtpbmcgZXhjZXB0aW9uIGNhdXNlZCBieSBhIGZhaWx1cmUgaW4gdGhlCiAqICBUTFMvU1NMIHByb3RvY29sLgogKi8KY2xhc3MgVGxzRXhjZXB0aW9uIGltcGxlbWVudHMgSU9FeGNlcHRpb24gewogIGZpbmFsIFN0cmluZyB0eXBlOwogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwogIGZpbmFsIE9TRXJyb3Igb3NFcnJvcjsKCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGNvbnN0IFRsc0V4Y2VwdGlvbihbU3RyaW5nIG1lc3NhZ2UgPSAiIiwgT1NFcnJvciBvc0Vycm9yXSkKICAgICAgOiB0aGlzLl8oIlRsc0V4Y2VwdGlvbiIsIG1lc3NhZ2UsIG9zRXJyb3IpOwoKICBjb25zdCBUbHNFeGNlcHRpb24uXyh0aGlzLnR5cGUsIHRoaXMubWVzc2FnZSwgdGhpcy5vc0Vycm9yKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUodHlwZSk7CiAgICBpZiAobWVzc2FnZS5pc05vdEVtcHR5KSB7CiAgICAgIHNiLndyaXRlKCI6ICRtZXNzYWdlIik7CiAgICAgIGlmIChvc0Vycm9yICE9IG51bGwpIHsKICAgICAgICBzYi53cml0ZSgiICgkb3NFcnJvcikiKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChvc0Vycm9yICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoIjogJG9zRXJyb3IiKTsKICAgIH0KICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQoKLyoqCiAqIEFuIGV4Y2VwdGlvbiB0aGF0IGhhcHBlbnMgaW4gdGhlIGhhbmRzaGFrZSBwaGFzZSBvZiBlc3RhYmxpc2hpbmcKICogYSBzZWN1cmUgbmV0d29yayBjb25uZWN0aW9uLgogKi8KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBIYW5kc2hha2VFeGNlcHRpb24gZXh0ZW5kcyBUbHNFeGNlcHRpb24gewogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBjb25zdCBIYW5kc2hha2VFeGNlcHRpb24oW1N0cmluZyBtZXNzYWdlID0gIiIsIE9TRXJyb3Igb3NFcnJvcl0pCiAgICAgIDogc3VwZXIuXygiSGFuZHNoYWtlRXhjZXB0aW9uIiwgbWVzc2FnZSwgb3NFcnJvcik7Cn0KCi8qKgogKiBBbiBleGNlcHRpb24gdGhhdCBoYXBwZW5zIGluIHRoZSBoYW5kc2hha2UgcGhhc2Ugb2YgZXN0YWJsaXNoaW5nCiAqIGEgc2VjdXJlIG5ldHdvcmsgY29ubmVjdGlvbiwgd2hlbiBsb29raW5nIHVwIG9yIHZlcmlmeWluZyBhCiAqIGNlcnRpZmljYXRlLgogKi8KY2xhc3MgQ2VydGlmaWNhdGVFeGNlcHRpb24gZXh0ZW5kcyBUbHNFeGNlcHRp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ZSBvYmplY3QgY29udGFpbmluZyB0aGUgY2VydGlmaWNhdGVzIHRvIHRydXN0IHdoZW4gbWFraW5nCiAqIGEgc2VjdXJlIGNsaWVudCBjb25uZWN0aW9uLCBhbmQgdGhlIGNlcnRpZmljYXRlIGNoYWluIGFuZAogKiBwcml2YXRlIGtleSB0byBzZXJ2ZSBmcm9tIGEgc2VjdXJlIHNlcnZlci4KICoKICogVGhlIFtTZWN1cmVTb2NrZXRdICBhbmQgW1NlY3VyZVNlcnZlclNvY2tldF0gY2xhc3NlcyB0YWtlIGEgU2VjdXJpdHlDb250ZXh0CiAqIGFzIGFuIGFyZ3VtZW50IHRvIHRoZWlyIGNvbm5lY3QgYW5kIGJpbmQgbWV0aG9kcy4KICoKICogQ2VydGlmaWNhdGVzIGFuZCBrZXlzIGNhbiBiZSBhZGRlZCB0byBhIFNlY3VyaXR5Q29udGV4dCBmcm9tIGVpdGhlciBQRU0KICogb3IgUEtDUzEyIGNvbnRhaW5lcnMuCiAqCiAqIGlPUyBub3RlOiBTb21lIG1ldGhvZHMgdG8gYWRkLCByZW1vdmUsIGFuZCBpbnNwZWN0IGNlcnRpZmljYXRlcyBhcmUgbm90IHlldAogKiBpbXBsZW1lbnRlZC4gSG93ZXZlciwgdGhlIHBsYXRmb3JtJ3MgYnVpbHQtaW4gdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgY2FuCiAqIGJlIHVzZWQsIGJ5IHdheSBvZiBbU2VjdXJpdHlDb250ZXh0LmRlZmF1bHRDb250ZXh0XS4KICovCmFic3RyYWN0IGNsYXNzIFNlY3VyaXR5Q29udGV4dCB7CiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBbU2VjdXJpdHlDb250ZXh0XS4KICAgKgogICAqIEJ5IGRlZmF1bHQsIHRoZSBjcmVhdGVkIFtTZWN1cml0eUNvbnRleHRdIGNvbnRhaW5zIG5vIGtleXMgb3IgY2VydGlmaWNhdGVzLgogICAqIFRoZXNlIGNhbiBiZSBhZGRlZCBieSBjYWxsaW5nIHRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MuCiAgICoKICAgKiBJZiBgd2l0aFRydXN0ZWRSb290c2AgaXMgcGFzc2VkIGFzIGB0cnVlYCwgdGhlIFtTZWN1cml0eUNvbnRleHRdIHdpbGwgYmUKICAgKiBzZWVkZWQgYnkgdGhlIHRydXN0ZWQgcm9vdCBjZXJ0aWZpY2F0ZXMgcHJvdmlkZWQgYXMgZXhwbGFpbmVkIGJlbG93LiBUbwogICAqIG9idGFpbiBhIFtTZWN1cml0eUNvbnRleHRdIGNvbnRhaW5pbmcgdHJ1c3RlZCByb290IGNlcnRpZmljYXRlcywKICAgKiBbU2VjdXJpdHlDb250ZXh0LmRlZmF1bHRDb250ZXh0XSBpcyB1c3VhbGx5IHN1ZmZpY2llbnQsIGFuZCBzaG91bGQKICAgKiBiZSB1c2VkIGluc3RlYWQuIEhvd2V2ZXIsIGlmIHRoZSBbU2VjdXJpdHlDb250ZXh0XSBjb250YWluaW5nIHRoZSB0cnVzdGVkCiAgICogcm9vdCBjZXJ0aWZpY2F0ZXMgbXVzdCBiZSBtb2RpZmllZCBwZXItY29ubmVjdGlvbiwgdGhlbiBgd2l0aFRydXN0ZWRSb290c2AKICAgKiBzaG91bGQgYmUgdXNlZC4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IFNlY3VyaXR5Q29udGV4dCh7Ym9vbCB3aXRoVHJ1c3RlZFJvb3RzOiBmYWxzZX0pOwoKICAvKioKICAgKiBTZWN1cmUgbmV0d29ya2luZyBjbGFzc2VzIHdpdGggYW4gb3B0aW9uYWwgYGNvbnRleHRgIHBhcmFtZXRlcgogICAqIHVzZSB0aGUgW2RlZmF1bHRDb250ZXh0XSBvYmplY3QgaWYgdGhlIHBhcmFtZXRlciBpcyBvbWl0dGVkLgogICAqIFRoaXMgb2JqZWN0IGNhbiBhbHNvIGJlIGFjY2Vzc2VkLCBhbmQgbW9kaWZpZWQsIGRpcmVjdGx5LgogICAqIEVhY2ggaXNvbGF0ZSBoYXMgYSBkaWZmZXJlbnQgW2RlZmF1bHRDb250ZXh0XSBvYmplY3QuCiAgICogVGhlIFtkZWZhdWx0Q29udGV4dF0gb2JqZWN0IHVzZXMgYSBsaXN0IG9mIHdlbGwta25vd24gdHJ1c3RlZAogICAqIGNlcnRpZmljYXRlIGF1dGhvcml0aWVzIGFzIGl0cyB0cnVzdGVkIHJvb3RzLiBPbiBMaW51eCBhbmQgV2luZG93cywgdGhpcwogICAqIGxpc3QgaXMgdGFrZW4gZnJvbSBNb3ppbGxhLCB3aG8gbWFpbnRhaW5zIGl0IGFzIHBhcnQgb2YgRmlyZWZveC4gT24sCiAgICogTWFjT1MsIGlPUywgYW5kIEFuZHJvaWQsIHRoaXMgbGlzdCBjb21lcyBmcm9tIHRoZSB0cnVzdGVkIGNlcnRpZmljYXRlcwogICAqIHN0b3JlcyBidWlsdCBpbiB0byB0aGUgcGxhdGZvcm1zLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBTZWN1cml0eUNvbnRleHQgZ2V0IGRlZmF1bHRDb250ZXh0OwoKICAvKioKICAgKiBTZXRzIHRoZSBwcml2YXRlIGtleSBmb3IgYSBzZXJ2ZXIgY2VydGlmaWNhdGUgb3IgY2xpZW50IGNlcnRpZmljYXRlLgogICAqCiAgICogQSBzZWN1cmUgY29ubmVjdGlvbiB1c2luZyB0aGlzIFNlY3VyaXR5Q29udGV4dCB3aWxsIHVzZSB0aGlzIGtleSB3aXRoCiAgICogdGhlIHNlcnZlciBvciBjbGllbnQgY2VydGlmaWNhdGUgdG8gc2lnbiBhbmQgZGVjcnlwdCBtZXNzYWdlcy4KICAgKiBbZmlsZV0gaXMgdGhlIHBhdGggdG8gYSBQRU0gb3IgUEtDUzEyIGZpbGUgY29udGFpbmluZyBhbiBlbmNyeXB0ZWQKICAgKiBwcml2YXRlIGtleSwgZW5jcnlwdGVkIHdpdGggW3Bhc3N3b3JkXS4gQXNzdW1pbmcgaXQgaXMgd2VsbC1mb3JtYXR0ZWQsIGFsbAogICAqIG90aGVyIGNvbnRlbnRzIG9mIFtmaWxlXSBhcmUgaWdub3JlZC4gQW4gdW5lbmNyeXB0ZWQgZmlsZSBjYW4gYmUgdXNlZCwKICAgKiBidXQgdGhpcyBpcyBub3QgdXN1YWwuCiAgICoKICAgKiBOQjogVGhpcyBmdW5jdGlvbiBjYWxscyBbRmlsZS5yZWFkQXNCeXRlc1N5bmNdLCBhbmQgd2lsbCBibG9jayBvbiBmaWxlIElPLgogICAqIFByZWZlciB1c2luZyBbdXNlUHJpdmF0ZUtleUJ5dGVzXS4KICAgKgogICAqIGlPUyBub3RlOiBPbmx5IFBLQ1MxMiBkYXRhIGlzIHN1cHBvcnRlZC4gSXQgc2hvdWxkIGNvbnRhaW4gYm90aCB0aGUgcHJpdmF0ZQogICAqIGtleSBhbmQgdGhlIGNlcnRpZmljYXRlIGNoYWluLiBPbiBpT1Mgb25lIGNhbGwgdG8gW3VzZVByaXZhdGVLZXldIHdpdGggdGhpcwogICAqIGRhdGEgaXMgdXNlZCBpbnN0ZWFkIG9mIHR3byBjYWxscyB0byBbdXNlQ2VydGlmaWNhdGVDaGFpbl0gYW5kCiAgICogW3VzZVByaXZhdGVLZXldLgogICAqLwogIHZvaWQgdXNlUHJpdmF0ZUtleShTdHJpbmcgZmlsZSwge1N0cmluZyBwYXNzd29yZH0pOwoKICAvKioKICAgKiBTZXRzIHRoZSBwcml2YXRlIGtleSBmb3IgYSBzZXJ2ZXIgY2VydGlmaWNhdGUgb3IgY2xpZW50IGNlcnRpZmljYXRlLgogICAqCiAgICogTGlrZSBbdXNlUHJpdmF0ZUtleV0sIGJ1dCB0YWtlcyB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgYXMgYSBsaXN0CiAgICogb2YgYnl0ZXMuCiAgICovCiAgdm9pZCB1c2VQcml2YXRlS2V5Qnl0ZXMoTGlzdDxpbnQ+IGtleUJ5dGVzLCB7U3RyaW5nIHBhc3N3b3JkfSk7CgogIC8qKgogICAqIFNldHMgdGhlIHNldCBvZiB0cnVzdGVkIFg1MDkgY2VydGlmaWNhdGVzIHVzZWQgYnkgW1NlY3VyZVNvY2tldF0KICAgKiBjbGllbnQgY29ubmVjdGlvbnMsIHdoZW4gY29ubmVjdGluZyB0byBhIHNlY3VyZSBzZXJ2ZXIuCiAgICoKICAgKiBbZmlsZV0gaXMgdGhlIHBhdGggdG8gYSBQRU0gb3IgUEtDUzEyIGZpbGUgY29udGFpbmluZyBYNTA5IGNlcnRpZmljYXRlcywKICAgKiB1c3VhbGx5IHJvb3QgY2VydGlmaWNhdGVzIGZyb20gY2VydGlmaWNhdGUgYXV0aG9yaXRpZXMuIEZvciBQS0NTMTIgZmlsZXMsCiAgICogW3Bhc3N3b3JkXSBpcyB0aGUgcGFzc3dvcmQgZm9yIHRoZSBmaWxlLiBGb3IgUEVNIGZpbGVzLCBbcGFzc3dvcmRdIGlzCiAgICogaWdub3JlZC4gQXNzdW1pbmcgaXQgaXMgd2VsbC1mb3JtYXR0ZWQsIGFsbCBvdGhlciBjb250ZW50cyBvZiBbZmlsZV0gYXJlCiAgICogaWdub3JlZC4KICAgKgogICAqIE5COiBUaGlzIGZ1bmN0aW9uIGNhbGxzIFtGaWxlLnJlYWRBc0J5dGVzU3luY10sIGFuZCB3aWxsIGJsb2NrIG9uIGZpbGUgSU8uCiAgICogUHJlZmVyIHVzaW5nIFtzZXRUcnVzdGVkQ2VydGlmaWNhdGVzQnl0ZXNdLgogICAqCiAgICogaU9TIG5vdGU6IE9uIGlPUywgdGhpcyBjYWxsIHRha2VzIG9ubHkgdGhlIGJ5dGVzIGZvciBhIHNpbmdsZSBERVIKICAgKiBlbmNvZGVkIFg1MDkgY2VydGlmaWNhdGUuIEl0IG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgdG8gYWRkCiAgICogbXVsdGlwbGUgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgdG8gdGhlIGNvbnRleHQuIEEgREVSIGVuY29kZWQgY2VydGlmaWNhdGUKICAgKiBjYW4gYmUgb2J0YWluZWQgZnJvbSBhIFBFTSBlbmNvZGVkIGNlcnRpZmljYXRlIGJ5IHVzaW5nIHRoZSBvcGVuc3NsIHRvb2w6CiAgICoKICAgKiAgICQgb3BlbnNzbCB4NTA5IC1vdXRmb3JtIGRlciAtaW4gY2VydC5wZW0gLW91dCBjZXJ0LmRlcgogICAqLwogIHZvaWQgc2V0VHJ1c3RlZENlcnRpZmljYXRlcyhTdHJpbmcgZmlsZSwge1N0cmluZyBwYXNzd29yZH0pOwoKICAvKioKICAgKiBTZXRzIHRoZSBzZXQgb2YgdHJ1c3RlZCBYNTA5IGNlcnRpZmljYXRlcyB1c2VkIGJ5IFtTZWN1cmVTb2NrZXRdCiAgICogY2xpZW50IGNvbm5lY3Rpb25zLCB3aGVuIGNvbm5lY3RpbmcgdG8gYSBzZWN1cmUgc2VydmVyLgogICAqCiAgICogTGlrZSBbc2V0VHJ1c3RlZENlcnRpZmljYXRlc10gYnV0IHRha2VzIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZS4KICAgKi8KICB2b2lkIHNldFRydXN0ZWRDZXJ0aWZpY2F0ZXNCeXRlcyhMaXN0PGludD4gY2VydEJ5dGVzLCB7U3RyaW5nIHBhc3N3b3JkfSk7CgogIC8qKgogICAqIFNldHMgdGhlIGNoYWluIG9mIFg1MDkgY2VydGlmaWNhdGVzIHNlcnZlZCBieSBbU2VjdXJlU2VydmVyU29ja2V0XQogICAqIHdoZW4gbWFraW5nIHNlY3VyZSBjb25uZWN0aW9ucywgaW5jbHVkaW5nIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUuCiAgICoKICAgKiBbZmlsZV0gaXMgYSBQRU0gb3IgUEtDUzEyIGZpbGUgY29udGFpbmluZyBYNTA5IGNlcnRpZmljYXRlcywgc3RhcnRpbmcgd2l0aAogICAqIHRoZSByb290IGF1dGhvcml0eSBhbmQgaW50ZXJtZWRpYXRlIGF1dGhvcml0aWVzIGZvcm1pbmcgdGhlIHNpZ25lZAogICAqIGNoYWluIHRvIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUsIGFuZCBlbmRpbmcgd2l0aCB0aGUgc2VydmVyIGNlcnRpZmljYXRlLgogICAqIFRoZSBwcml2YXRlIGtleSBmb3IgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBpcyBzZXQgYnkgW3VzZVByaXZhdGVLZXldLiBGb3IKICAgKiBQS0NTMTIgZmlsZXMsIFtwYXNzd29yZF0gaXMgdGhlIHBhc3N3b3JkIGZvciB0aGUgZmlsZS4gRm9yIFBFTSBmaWxlcywKICAgKiBbcGFzc3dvcmRdIGlzIGlnbm9yZWQuIEFzc3VtaW5nIGl0IGlzIHdlbGwtZm9ybWF0dGVkLCBhbGwKICAgKiBvdGhlciBjb250ZW50cyBvZiBbZmlsZV0gYXJlIGlnbm9yZWQuCiAgICoKICAgKiBOQjogVGhpcyBmdW5jdGlvbiBjYWxscyBbRmlsZS5yZWFkQXNCeXRlc1N5bmNdLCBhbmQgd2lsbCBibG9jayBvbiBmaWxlIElPLgogICAqIFByZWZlciB1c2luZyBbdXNlQ2VydGlmaWNhdGVDaGFpbkJ5dGVzXS4KICAgKgogICAqIGlPUyBub3RlOiBBcyBub3RlZCBhYm92ZSwgW3VzZVByaXZhdGVLZXldIGRvZXMgdGhlIGpvYiBvZiBib3RoCiAgICogdGhhdCBjYWxsIGFuZCB0aGlzIG9uZS4gT24gaU9TLCB0aGlzIGNhbGwgaXMgYSBuby1vcC4KICAgKi8KICB2b2lkIHVzZUNlcnRpZmljYXRlQ2hhaW4oU3RyaW5nIGZpbGUsIHtTdHJpbmcgcGFzc3dvcmR9KTsKCiAgLyoqCiAgICogU2V0cyB0aGUgY2hhaW4gb2YgWDUwOSBjZXJ0aWZpY2F0ZXMgc2VydmVkIGJ5IFtTZWN1cmVTZXJ2ZXJTb2NrZXRdCiAgICogd2hlbiBtYWtpbmcgc2VjdXJlIGNvbm5lY3Rpb25zLCBpbmNsdWRpbmcgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZS4KICAgKgogICAqIExpa2UgW3VzZUNlcnRpZmljYXRlQ2hhaW5dIGJ1dCB0YWtlcyB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUuCiAgICovCiAgdm9pZCB1c2VDZXJ0aWZpY2F0ZUNoYWluQnl0ZXMoTGlzdDxpbnQ+IGNoYWluQnl0ZXMsIHtTdHJpbmcgcGFzc3dvcmR9KTsKCiAgLyoqCiAgICogU2V0cyB0aGUgbGlzdCBvZiBhdXRob3JpdHkgbmFtZXMgdGhhdCBhIFtTZWN1cmVTZXJ2ZXJTb2NrZXRdIHdpbGwgYWR2ZXJ0aXNlCiAgICogYXMgYWNjZXB0ZWQgd2hlbiByZXF1ZXN0aW5nIGEgY2xpZW50IGNlcnRpZmljYXRlIGZyb20gYSBjb25uZWN0aW5nCiAgICogY2xpZW50LgogICAqCiAgICogW2ZpbGVdIGlzIGEgUEVNIG9yIFBLQ1MxMiBmaWxlIGNvbnRhaW5pbmcgdGhlIGFjY2VwdGVkIHNpZ25pbmcKICAgKiBhdXRob3JpdHkgY2VydGlmaWNhdGVzIC0gdGhlIGF1dGhvcml0eSBuYW1lcyBhcmUgZXh0cmFjdGVkIGZyb20gdGhlCiAgICogY2VydGlmaWNhdGVzLiBGb3IgUEtDUzEyIGZpbGVzLCBbcGFzc3dvcmRdIGlzIHRoZSBwYXNzd29yZCBmb3IgdGhlIGZpbGUuCiAgICogRm9yIFBFTSBmaWxlcywgW3Bhc3N3b3JkXSBpcyBpZ25vcmVkLiBBc3N1bWluZyBpdCBpcyB3ZWxsLWZvcm1hdHRlZCwgYWxsCiAgICogb3RoZXIgY29udGVudHMgb2YgW2ZpbGVdIGFyZSBpZ25vcmVkLgogICAqCiAgICogTkI6IFRoaXMgZnVuY3Rpb24gY2FsbHMgW0ZpbGUucmVhZEFzQnl0ZXNTeW5jXSwgYW5kIHdpbGwgYmxvY2sgb24gZmlsZSBJTy4KICAgKiBQcmVmZXIgdXNpbmcgW3NldENsaWVudEF1dGhvcml0aWVzQnl0ZXNdLgogICAqCiAgICogaU9TIG5vdGU6IFRoaXMgY2FsbCBpcyBub3Qgc3VwcG9ydGVkLgogICAqLwogIHZvaWQgc2V0Q2xpZW50QXV0aG9yaXRpZXMoU3RyaW5nIGZpbGUsIHtTdHJpbmcgcGFzc3dvcmR9KTsKCiAgLyoqCiAgICogU2V0cyB0aGUgbGlzdCBvZiBhdXRob3JpdHkgbmFtZXMgdGhhdCBhIFtTZWN1cmVTZXJ2ZXJTb2NrZXRdIHdpbGwgYWR2ZXJ0aXNlCiAgICogYXMgYWNjZXB0ZWQsIHdoZW4gcmVxdWVzdGluZyBhIGNsaWVudCBjZXJ0aWZpY2F0ZSBmcm9tIGEgY29ubmVjdGluZwogICAqIGNsaWVudC4KICAgKgogICAqIExpa2UgW3NldENsaWVudEF1dGhvcml0aWVzXSBidXQgdGFrZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlLgogICAqLwogIHZvaWQgc2V0Q2xpZW50QXV0aG9yaXRpZXNCeXRlcyhMaXN0PGludD4gYXV0aENlcnRCeXRlcywge1N0cmluZyBwYXNzd29yZH0pOwoKICAvKioKICAgKiBXaGV0aGVyIHRoZSBwbGF0Zm9ybSBzdXBwb3J0cyBBTFBOLiBUaGlzIGFsd2F5cyByZXR1cm5zIHRydWUgYW5kIHdpbGwgYmUKICAgKiByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCiAgICovCiAgQGRlcHJlY2F0ZWQKICBleHRlcm5hbCBzdGF0aWMgYm9vbCBnZXQgYWxwblN1cHBvcnRlZDsKCiAgLyoqCiAgICogU2V0cyB0aGUgbGlzdCBvZiBhcHBsaWNhdGlvbi1sZXZlbCBwcm90b2NvbHMgc3VwcG9ydGVkIGJ5IGEgY2xpZW50CiAgICogY29ubmVjdGlvbiBvciBzZXJ2ZXIgY29ubmVjdGlvbi4gVGhlIEFMUE4gKGFwcGxpY2F0aW9uIGxldmVsIHByb3RvY29sCiAgICogbmVnb3RpYXRpb24pIGV4dGVuc2lvbiB0byBUTFMgYWxsb3dzIGEgY2xpZW50IHRvIHNlbmQgYSBsaXN0IG9mCiAgICogcHJvdG9jb2xzIGluIHRoZSBUTFMgY2xpZW50IGhlbGxvIG1lc3NhZ2UsIGFuZCB0aGUgc2VydmVyIHRvIHBpY2sKICAgKiBvbmUgYW5kIHNlbmQgdGhlIHNlbGVjdGVkIG9uZSBiYWNrIGluIGl0cyBzZXJ2ZXIgaGVsbG8gbWVzc2FnZS4KICAgKgogICAqIFNlcGFyYXRlIGxpc3RzIG9mIHByb3RvY29scyBjYW4gYmUgc2VudCBmb3IgY2xpZW50IGNvbm5lY3Rpb25zIGFuZAogICAqIGZvciBzZXJ2ZXIgY29ubmVjdGlvbnMsIHVzaW5nIHRoZSBzYW1lIFNlY3VyaXR5Q29udGV4dC4gIFRoZSBbaXNTZXJ2ZXJdCiAgICogYm9vbGVhbiBhcmd1bWVudCBzcGVjaWZpZXMgd2hldGhlciB0byBzZXQgdGhlIGxpc3QgZm9yIHNlcnZlciBjb25uZWN0aW9ucwogICAqIG9yIGNsaWVudCBjb25uZWN0aW9ucy4KICAgKi8KICB2b2lkIHNldEFscG5Qcm90b2NvbHMoTGlzdDxTdHJpbmc+IHByb3RvY29scywgYm9vbCBpc1NlcnZlcik7CgogIC8vLyBFbmNvZGVzIGEgc2V0IG9mIHN1cHBvcnRlZCBwcm90b2NvbHMgZm9yIEFMUE4vTlBOIHVzYWdlLgogIC8vLwogIC8vLyBUaGUgYHByb3RvY29sc2AgbGlzdCBpcyBleHBlY3RlZCB0byBjb250YWluIHByb3RvY29scyBpbiBkZXNjZW5kaW5nIG9yZGVyCiAgLy8vIG9mIHByZWZlcmVuY2UuCiAgLy8vCiAgLy8vIFNlZSBSRkMgNzMwMSAoaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzczMDEpIGZvciB0aGUgZW5jb2Rpbmcgb2YKICAvLy8gYExpc3Q8U3RyaW5nPiBwcm90b2NvbHNgOgogIC8vLyAgICAgb3BhcXVlIFByb3RvY29sTmFtZTwxLi4yXjgtMT47CiAgLy8vCiAgLy8vICAgICBzdHJ1Y3QgewogIC8vLyAgICAgICAgIFByb3RvY29sTmFtZSBwcm90b2NvbF9uYW1lX2xpc3Q8Mi4uMl4xNi0xPgogIC8vLyAgICAgfSBQcm90b2NvbE5hbWVMaXN0OwogIC8vLwogIC8vLyBUaGUgZW5jb2Rpbmcgb2YgdGhlIG9wYXF1ZSBgUHJvdG9jb2xOYW1lPGxvd2VyLi51cHBlcj5gIHZlY3RvciBpcwogIC8vLyBkZXNjcmliZWQgaW4gUkZDIDIyNDY6IDQuMyBWZWN0b3JzLgogIC8vLwogIC8vLyBOb3RlOiBFdmVuIHRob3VnaCB0aGlzIGVuY29kaW5nIHNjaGVtZSB3b3VsZCBhbGxvdyBhIHRvdGFsCiAgLy8vIGBQcm90b2NvbE5hbWVMaXN0YCBsZW5ndGggb2YgNjU1MzUsIHRoaXMgbGltaXQgY2Fubm90IGJlIHJlYWNoZWQuIFRlc3RpbmcKICAvLy8gc2hvd2VkIHRoYXQgbW9yZSB0aGFuIH4gMl4xNCAgYnl0ZXMgd2lsbCBmYWlsIHRvIG5lZ290aWF0ZSBhIHByb3RvY29sLgogIC8vLyBXZSB3aWxsIGJlIGNvbnNlcnZhdGl2ZSBhbmQgc3VwcG9ydCBvbmx5IG1lc3NhZ2VzIHVwIHRvICgxPDwxMyktMSBieXRlcy4KICBzdGF0aWMgVWludDhMaXN0IF9wcm90b2NvbHNUb0xlbmd0aEVuY29kaW5nKExpc3Q8U3RyaW5nPiBwcm90b2NvbHMpIHsKICAgIGlmIChwcm90b2NvbHMgPT0gbnVsbCB8fCBwcm90b2NvbHMubGVuZ3RoID09IDApIHsKICAgICAgcmV0dXJuIG5ldyBVaW50OExpc3QoMCk7CiAgICB9CiAgICBpbnQgcHJvdG9jb2xzTGVuZ3RoID0gcHJvdG9jb2xzLmxlbmd0aDsKCiAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBieXRlcyB3ZSB3aWxsIG5lZWQgaWYgaXQgaXMgQVNDSUkuCiAgICBpbnQgZXhwZWN0ZWRMZW5ndGggPSBwcm90b2NvbHNMZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvY29sc0xlbmd0aDsgaSsrKSB7CiAgICAgIGludCBsZW5ndGggPSBwcm90b2NvbHNbaV0ubGVuZ3RoOwogICAgICBpZiAobGVuZ3RoID4gMCAmJiBsZW5ndGggPD0gMjU1KSB7CiAgICAgICAgZXhwZWN0ZWRMZW5ndGggKz0gbGVuZ3RoOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKAogICAgICAgICAgICAnTGVuZ3RoIG9mIHByb3RvY29sIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAyNTUgKHdhczogJGxlbmd0aCkuJyk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoZXhwZWN0ZWRMZW5ndGggPj0gKDEgPDwgMTMpKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKAogICAgICAgICAgJ1RoZSBtYXhpbXVtIG1lc3NhZ2UgbGVuZ3RoIHN1cHBvcnRlZCBpcyAyXjEzLTEuJyk7CiAgICB9CgogICAgLy8gVHJ5IGVuY29kaW5nIHRoZSBgTGlzdDxTdHJpbmc+IHByb3RvY29sc2AgYXJyYXkgdXNpbmcgZmFzdCBBU0NJSSBwYXRoLgogICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4TGlzdChleHBlY3RlZExlbmd0aCk7CiAgICBpbnQgYnl0ZXNPZmZzZXQgPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90b2NvbHNMZW5ndGg7IGkrKykgewogICAgICBTdHJpbmcgcHJvdG8gPSBwcm90b2NvbHNbaV07CgogICAgICAvLyBBZGQgbGVuZ3RoIGJ5dGUuCiAgICAgIGJ5dGVzW2J5dGVzT2Zmc2V0KytdID0gcHJvdG8ubGVuZ3RoOwogICAgICBpbnQgYml0cyA9IDA7CgogICAgICAvLyBBZGQgcHJvdG9jb2wgYnl0ZXMuCiAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcHJvdG8ubGVuZ3RoOyBqKyspIHsKICAgICAgICB2YXIgY2hhciA9IHByb3RvLmNvZGVVbml0QXQoaik7CiAgICAgICAgYml0cyB8PSBjaGFyOwogICAgICAgIGJ5dGVzW2J5dGVzT2Zmc2V0KytdID0gY2hhciAmIDB4ZmY7CiAgICAgIH0KCiAgICAgIC8vIEdvIHNsb3cgY2FzZSBpZiB3ZSBoYXZlIGVuY291bnRlcmVkIGFueXRoaW5nIG5vbi1hc2NpaS4KICAgICAgaWYgKGJpdHMgPiAweDdmKSB7CiAgICAgICAgcmV0dXJuIF9wcm90b2NvbHNUb0xlbmd0aEVuY29kaW5nTm9uQXNjaWlCYWlsb3V0KHByb3RvY29scyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBieXRlczsKICB9CgogIHN0YXRpYyBVaW50OExpc3QgX3Byb3RvY29sc1RvTGVuZ3RoRW5jb2RpbmdOb25Bc2NpaUJhaWxvdXQoCiAgICAgIExpc3Q8U3RyaW5nPiBwcm90b2NvbHMpIHsKICAgIHZvaWQgYWRkUHJvdG9jb2woTGlzdDxpbnQ+IG91dEJ5dGVzLCBTdHJpbmcgcHJvdG9jb2wpIHsKICAgICAgdmFyIHByb3RvY29sQnl0ZXMgPSB1dGY4LmVuY29kZShwcm90b2NvbCk7CiAgICAgIHZhciBsZW4gPSBwcm90b2NvbEJ5dGVzLmxlbmd0aDsKCiAgICAgIGlmIChsZW4gPiAyNTUpIHsKICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigKICAgICAgICAgICAgJ0xlbmd0aCBvZiBwcm90b2NvbCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMjU1ICh3YXM6ICRsZW4pJyk7CiAgICAgIH0KICAgICAgLy8gQWRkIGxlbmd0aCBieXRlLgogICAgICBvdXRCeXRlcy5hZGQobGVuKTsKCiAgICAgIC8vIEFkZCBwcm90b2NvbCBieXRlcy4KICAgICAgb3V0Qnl0ZXMuYWRkQWxsKHByb3RvY29sQnl0ZXMpOwogICAgfQoKICAgIExpc3Q8aW50PiBieXRlcyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm90b2NvbHMubGVuZ3RoOyBpKyspIHsKICAgICAgYWRkUHJvdG9jb2woYnl0ZXMsIHByb3RvY29sc1tpXSk7CiAgICB9CgogICAgaWYgKGJ5dGVzLmxlbmd0aCA+PSAoMSA8PCAxMykpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAnVGhlIG1heGltdW0gbWVzc2FnZSBsZW5ndGggc3VwcG9ydGVkIGlzIDJeMTMtMS4nKTsKICAgIH0KCiAgICByZXR1cm4gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChieXRlcyk7CiAgfQp9CoEdAE5OPAERAQQ/PS4DTzUDSxkDT0o4BCEGJgVRPgVOTUZIT1AVBkQBBkRCPztDTkpMJwY2AQZKBUtESFBMHAVQKAVRUUQWBjYBBkoFSA8GQgEGRj0FTk9LTg4FUDEFR0ZNTwU+Bj8BBkY9BUcGTAEGSEcFUEhOT0s/KwVQLgVEOwY8AQZIRwVEBkoBBlFIDQVESU5OKwVQLwUrBj0BBlFJDQVFBk4BBk4iBg4qAQZIS0VHRQVITU8cBkABPwZQFQZNICkGEzkeBkgqBkFQTU9INh8GLAFCKjAoKSIPIU0IBgEnHz4GAU4vGTAjARorFAEdLygWLAgBQRlFCAYSBAE+IDwxJgEXIUkIGhkBHSYGARoxKAYBJR8+BgEqBAIBHWRhcnQ6aW8vc2VjdXJpdHlfY29udGV4dC5kYXJ0Km9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9zb2NrZXQuZGFydMAAf5QvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmlvOwoKLyoqCiAqIFtJbnRlcm5ldEFkZHJlc3NUeXBlXSBpcyB0aGUgdHlwZSBhbiBbSW50ZXJuZXRBZGRyZXNzXS4gQ3VycmVudGx5LAogKiBJUCB2ZXJzaW9uIDQgKElQdjQpIGFuZCBJUCB2ZXJzaW9uIDYgKElQdjYpIGFyZSBzdXBwb3J0ZWQuCiAqLwpjbGFzcyBJbnRlcm5ldEFkZHJlc3NUeXBlIHsKICBzdGF0aWMgY29uc3QgSW50ZXJuZXRBZGRyZXNzVHlwZSBJUHY0ID0gY29uc3QgSW50ZXJuZXRBZGRyZXNzVHlwZS5fKDApOwogIHN0YXRpYyBjb25zdCBJbnRlcm5ldEFkZHJlc3NUeXBlIElQdjYgPSBjb25zdCBJbnRlcm5ldEFkZHJlc3NUeXBlLl8oMSk7CiAgc3RhdGljIGNvbnN0IEludGVybmV0QWRkcmVzc1R5cGUgYW55ID0gY29uc3QgSW50ZXJuZXRBZGRyZXNzVHlwZS5fKC0xKTsKCiAgQERlcHJlY2F0ZWQoIlVzZSBJUHY0IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBJbnRlcm5ldEFkZHJlc3NUeXBlIElQX1Y0ID0gSVB2NDsKICBARGVwcmVjYXRlZCgiVXNlIElQdjYgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IEludGVybmV0QWRkcmVzc1R5cGUgSVBfVjYgPSBJUHY2OwogIEBEZXByZWNhdGVkKCJVc2UgYW55IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBJbnRlcm5ldEFkZHJlc3NUeXBlIEFOWSA9IGFueTsKCiAgZmluYWwgaW50IF92YWx1ZTsKCiAgY29uc3QgSW50ZXJuZXRBZGRyZXNzVHlwZS5fKHRoaXMuX3ZhbHVlKTsKCiAgZmFjdG9yeSBJbnRlcm5ldEFkZHJlc3NUeXBlLl9mcm9tKGludCB2YWx1ZSkgewogICAgaWYgKHZhbHVlID09IDApIHJldHVybiBJUHY0OwogICAgaWYgKHZhbHVlID09IDEpIHJldHVybiBJUHY2OwogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkludmFsaWQgdHlwZTogJHZhbHVlIik7CiAgfQoKICAvKioKICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHR5cGUsIGUuZy4gIklQdjQiIG9yICJJUHY2Ii4KICAgKi8KICBTdHJpbmcgZ2V0IG5hbWUgewogICAgc3dpdGNoIChfdmFsdWUpIHsKICAgICAgY2FzZSAtMToKICAgICAgICByZXR1cm4gIkFOWSI7CiAgICAgIGNhc2UgMDoKICAgICAgICByZXR1cm4gIklQdjQiOwogICAgICBjYXNlIDE6CiAgICAgICAgcmV0dXJuICJJUHY2IjsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiSW52YWxpZCBJbnRlcm5ldEFkZHJlc3MiKTsKICAgIH0KICB9CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJJbnRlcm5ldEFkZHJlc3NUeXBlOiAkbmFtZSI7Cn0KCi8qKgogKiBBbiBpbnRlcm5ldCBhZGRyZXNzLgogKgogKiBUaGlzIG9iamVjdCBob2xkcyBhbiBpbnRlcm5ldCBhZGRyZXNzLiBJZiB0aGlzIGludGVybmV0IGFkZHJlc3MKICogaXMgdGhlIHJlc3VsdCBvZiBhIEROUyBsb29rdXAsIHRoZSBhZGRyZXNzIGFsc28gaG9sZHMgdGhlIGhvc3RuYW1lCiAqIHVzZWQgdG8gbWFrZSB0aGUgbG9va3VwLgogKiBBbiBJbnRlcm5ldCBhZGRyZXNzIGNvbWJpbmVkIHdpdGggYSBwb3J0IG51bWJlciByZXByZXNlbnRzIGFuCiAqIGVuZHBvaW50IHRvIHdoaWNoIGEgc29ja2V0IGNhbiBjb25uZWN0IG9yIGEgbGlzdGVuaW5nIHNvY2tldCBjYW4KICogYmluZC4KICovCmFic3RyYWN0IGNsYXNzIEludGVybmV0QWRkcmVzcyB7CiAgLyoqCiAgICogSVAgdmVyc2lvbiA0IGxvb3BiYWNrIGFkZHJlc3MuIFVzZSB0aGlzIGFkZHJlc3Mgd2hlbiBsaXN0ZW5pbmcgb24KICAgKiBvciBjb25uZWN0aW5nIHRvIHRoZSBsb29wYmFjayBhZGFwdGVyIHVzaW5nIElQIHZlcnNpb24gNCAoSVB2NCkuCiAgICovCiAgc3RhdGljIEludGVybmV0QWRkcmVzcyBnZXQgbG9vcGJhY2tJUHY0ID0+IExPT1BCQUNLX0lQX1Y0OwogIEBEZXByZWNhdGVkKCJVc2UgbG9vcGJhY2tJUHY0IGluc3RlYWQiKQogIGV4dGVybmFsIHN0YXRpYyBJbnRlcm5ldEFkZHJlc3MgZ2V0IExPT1BCQUNLX0lQX1Y0OwoKICAvKioKICAgKiBJUCB2ZXJzaW9uIDYgbG9vcGJhY2sgYWRkcmVzcy4gVXNlIHRoaXMgYWRkcmVzcyB3aGVuIGxpc3RlbmluZyBvbgogICAqIG9yIGNvbm5lY3RpbmcgdG8gdGhlIGxvb3BiYWNrIGFkYXB0ZXIgdXNpbmcgSVAgdmVyc2lvbiA2IChJUHY2KS4KICAgKi8KICBzdGF0aWMgSW50ZXJuZXRBZGRyZXNzIGdldCBsb29wYmFja0lQdjYgPT4gTE9PUEJBQ0tfSVBfVjY7CiAgQERlcHJlY2F0ZWQoIlVzZSBsb29wYmFja0lQdjYgaW5zdGVhZCIpCiAgZXh0ZXJuYWwgc3RhdGljIEludGVybmV0QWRkcmVzcyBnZXQgTE9PUEJBQ0tfSVBfVjY7CgogIC8qKgogICAqIElQIHZlcnNpb24gNCBhbnkgYWRkcmVzcy4gVXNlIHRoaXMgYWRkcmVzcyB3aGVuIGxpc3RlbmluZyBvbgogICAqIGFsbCBhZGFwdGVycyBJUCBhZGRyZXNzZXMgdXNpbmcgSVAgdmVyc2lvbiA0IChJUHY0KS4KICAgKi8KICBzdGF0aWMgSW50ZXJuZXRBZGRyZXNzIGdldCBhbnlJUHY0ID0+IEFOWV9JUF9WNDsKICBARGVwcmVjYXRlZCgiVXNlIGFueUlQdjQgaW5zdGVhZCIpCiAgZXh0ZXJuYWwgc3RhdGljIEludGVybmV0QWRkcmVzcyBnZXQgQU5ZX0lQX1Y0OwoKICAvKioKICAgKiBJUCB2ZXJzaW9uIDYgYW55IGFkZHJlc3MuIFVzZSB0aGlzIGFkZHJlc3Mgd2hlbiBsaXN0ZW5pbmcgb24KICAgKiBhbGwgYWRhcHRlcnMgSVAgYWRkcmVzc2VzIHVzaW5nIElQIHZlcnNpb24gNiAoSVB2NikuCiAgICovCiAgc3RhdGljIEludGVybmV0QWRkcmVzcyBnZXQgYW55SVB2NiA9PiBBTllfSVBfVjY7CiAgQERlcHJlY2F0ZWQoIlVzZSBhbnlJUHY2IGluc3RlYWQiKQogIGV4dGVybmFsIHN0YXRpYyBJbnRlcm5ldEFkZHJlc3MgZ2V0IEFOWV9JUF9WNjsKCiAgLyoqCiAgICogVGhlIFt0eXBlXSBvZiB0aGUgW0ludGVybmV0QWRkcmVzc10gc3BlY2lmaWVkIHdoYXQgSVAgcHJvdG9jb2wuCiAgICovCiAgSW50ZXJuZXRBZGRyZXNzVHlwZSBnZXQgdHlwZTsKCiAgLyoqCiAgICogVGhlIG51bWVyaWMgYWRkcmVzcyBvZiB0aGUgaG9zdC4gRm9yIElQdjQgYWRkcmVzc2VzIHRoaXMgaXMgdXNpbmcKICAgKiB0aGUgZG90dGVkLWRlY2ltYWwgbm90YXRpb24uIEZvciBJUHY2IGl0IGlzIHVzaW5nIHRoZQogICAqIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uLgogICAqLwogIFN0cmluZyBnZXQgYWRkcmVzczsKCiAgLyoqCiAgICogVGhlIGhvc3QgdXNlZCB0byBsb29rdXAgdGhlIGFkZHJlc3MuIElmIHRoZXJlIGlzIG5vIGhvc3QKICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGFkZHJlc3MgdGhpcyByZXR1cm5zIHRoZSBudW1lcmljIGFkZHJlc3MuCiAgICovCiAgU3RyaW5nIGdldCBob3N0OwoKICAvKioKICAgKiBHZXQgdGhlIHJhdyBhZGRyZXNzIG9mIHRoaXMgW0ludGVybmV0QWRkcmVzc10uIFRoZSByZXN1bHQgaXMgZWl0aGVyIGEKICAgKiA0IG9yIDE2IGJ5dGUgbG9uZyBsaXN0LiBUaGUgcmV0dXJuZWQgbGlzdCBpcyBhIGNvcHksIG1ha2luZyBpdCBwb3NzaWJsZQogICAqIHRvIGNoYW5nZSB0aGUgbGlzdCB3aXRob3V0IG1vZGlmeWluZyB0aGUgW0ludGVybmV0QWRkcmVzc10uCiAgICovCiAgTGlzdDxpbnQ+IGdldCByYXdBZGRyZXNzOwoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFtJbnRlcm5ldEFkZHJlc3NdIGlzIGEgbG9vcGJhY2sgYWRkcmVzcy4KICAgKi8KICBib29sIGdldCBpc0xvb3BiYWNrOwoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFtJbnRlcm5ldEFkZHJlc3NdcyBzY29wZSBpcyBhIGxpbmstbG9jYWwuCiAgICovCiAgYm9vbCBnZXQgaXNMaW5rTG9jYWw7CgogIC8qKgogICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgW0ludGVybmV0QWRkcmVzc11zIHNjb3BlIGlzIG11bHRpY2FzdC4KICAgKi8KICBib29sIGdldCBpc011bHRpY2FzdDsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBbSW50ZXJuZXRBZGRyZXNzXSBmcm9tIGEgbnVtZXJpYyBhZGRyZXNzLgogICAqCiAgICogSWYgdGhlIGFkZHJlc3MgaW4gW2FkZHJlc3NdIGlzIG5vdCBhIG51bWVyaWMgSVB2NAogICAqIChkb3R0ZWQtZGVjaW1hbCBub3RhdGlvbikgb3IgSVB2NiAoaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24pLgogICAqIGFkZHJlc3MgW0FyZ3VtZW50RXJyb3JdIGlzIHRocm93bi4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IEludGVybmV0QWRkcmVzcyhTdHJpbmcgYWRkcmVzcyk7CgogIC8qKgogICAqIFBlcmZvcm0gYSByZXZlcnNlIGRucyBsb29rdXAgb24gdGhlIFthZGRyZXNzXSwgY3JlYXRpbmcgYSBuZXcKICAgKiBbSW50ZXJuZXRBZGRyZXNzXSB3aGVyZSB0aGUgaG9zdCBmaWVsZCBzZXQgdG8gdGhlIHJlc3VsdC4KICAgKi8KICBGdXR1cmU8SW50ZXJuZXRBZGRyZXNzPiByZXZlcnNlKCk7CgogIC8qKgogICAqIExvb2t1cCBhIGhvc3QsIHJldHVybmluZyBhIEZ1dHVyZSBvZiBhIGxpc3Qgb2YKICAgKiBbSW50ZXJuZXRBZGRyZXNzXXMuIElmIFt0eXBlXSBpcyBbSW50ZXJuZXRBZGRyZXNzVHlwZS5BTlldLCBpdAogICAqIHdpbGwgbG9va3VwIGJvdGggSVAgdmVyc2lvbiA0IChJUHY0KSBhbmQgSVAgdmVyc2lvbiA2IChJUHY2KQogICAqIGFkZHJlc3Nlcy4gSWYgW3R5cGVdIGlzIGVpdGhlciBbSW50ZXJuZXRBZGRyZXNzVHlwZS5JUHY0XSBvcgogICAqIFtJbnRlcm5ldEFkZHJlc3NUeXBlLklQdjZdIGl0IHdpbGwgb25seSBsb29rdXAgYWRkcmVzc2VzIG9mIHRoZQogICAqIHNwZWNpZmllZCB0eXBlLiBUaGUgb3JkZXIgb2YgdGhlIGxpc3QgY2FuLCBhbmQgbW9zdCBsaWtlbHkgd2lsbCwKICAgKiBjaGFuZ2Ugb3ZlciB0aW1lLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBGdXR1cmU8TGlzdDxJbnRlcm5ldEFkZHJlc3M+PiBsb29rdXAoU3RyaW5nIGhvc3QsCiAgICAgIHtJbnRlcm5ldEFkZHJlc3NUeXBlIHR5cGU6IEludGVybmV0QWRkcmVzc1R5cGUuYW55fSk7CgogIC8qKgogICAqIENsb25lcyB0aGUgZ2l2ZW4gW2FkZHJlc3NdIHdpdGggdGhlIG5ldyBbaG9zdF0uCiAgICoKICAgKiBUaGUgW2FkZHJlc3NdIG11c3QgYmUgYW4gW0ludGVybmV0QWRkcmVzc10gdGhhdCB3YXMgY3JlYXRlZCB3aXRoIG9uZQogICAqIG9mIHRoZSBzdGF0aWMgbWV0aG9kcyBvZiB0aGlzIGNsYXNzLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBJbnRlcm5ldEFkZHJlc3MgX2Nsb25lV2l0aE5ld0hvc3QoCiAgICAgIEludGVybmV0QWRkcmVzcyBhZGRyZXNzLCBTdHJpbmcgaG9zdCk7Cn0KCi8qKgogKiBBIFtOZXR3b3JrSW50ZXJmYWNlXSByZXByZXNlbnRzIGFuIGFjdGl2ZSBuZXR3b3JrIGludGVyZmFjZSBvbiB0aGUgY3VycmVudAogKiBzeXN0ZW0uIEl0IGNvbnRhaW5zIGEgbGlzdCBvZiBbSW50ZXJuZXRBZGRyZXNzXWVzIHRoYXQgYXJlIGJvdW5kIHRvIHRoZQogKiBpbnRlcmZhY2UuCiAqLwphYnN0cmFjdCBjbGFzcyBOZXR3b3JrSW50ZXJmYWNlIHsKICAvKioKICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIFtOZXR3b3JrSW50ZXJmYWNlXS4KICAgKi8KICBTdHJpbmcgZ2V0IG5hbWU7CgogIC8qKgogICAqIEdldCB0aGUgaW5kZXggb2YgdGhlIFtOZXR3b3JrSW50ZXJmYWNlXS4KICAgKi8KICBpbnQgZ2V0IGluZGV4OwoKICAvKioKICAgKiBHZXQgYSBsaXN0IG9mIFtJbnRlcm5ldEFkZHJlc3NdZXMgY3VycmVudGx5IGJvdW5kIHRvIHRoaXMKICAgKiBbTmV0d29ya0ludGVyZmFjZV0uCiAgICovCiAgTGlzdDxJbnRlcm5ldEFkZHJlc3M+IGdldCBhZGRyZXNzZXM7CgogIC8qKgogICAqIFdoZXRoZXIgW2xpc3RdIGlzIHN1cHBvcnRlZC4KICAgKgogICAqIFtsaXN0XSBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWQgb24gQW5kcm9pZC4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgYm9vbCBnZXQgbGlzdFN1cHBvcnRlZDsKCiAgLyoqCiAgICogUXVlcnkgdGhlIHN5c3RlbSBmb3IgW05ldHdvcmtJbnRlcmZhY2Vdcy4KICAgKgogICAqIElmIFtpbmNsdWRlTG9vcGJhY2tdIGlzIGB0cnVlYCwgdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBpbmNsdWRlIHRoZQogICAqIGxvb3BiYWNrIGRldmljZS4gRGVmYXVsdCBpcyBgZmFsc2VgLgogICAqCiAgICogSWYgW2luY2x1ZGVMaW5rTG9jYWxdIGlzIGB0cnVlYCwgdGhlIGxpc3Qgb2YgYWRkcmVzc2VzIG9mIHRoZSByZXR1cm5lZAogICAqIFtOZXR3b3JrSW50ZXJmYWNlXXMsIG1heSBpbmNsdWRlIGxpbmsgbG9jYWwgYWRkcmVzc2VzLiBEZWZhdWx0IGlzIGBmYWxzZWAuCiAgICoKICAgKiBJZiBbdHlwZV0gaXMgZWl0aGVyIFtJbnRlcm5ldEFkZHJlc3NUeXBlLklQdjRdIG9yCiAgICogW0ludGVybmV0QWRkcmVzc1R5cGUuSVB2Nl0gaXQgd2lsbCBvbmx5IGxvb2t1cCBhZGRyZXNzZXMgb2YgdGhlCiAgICogc3BlY2lmaWVkIHR5cGUuIERlZmF1bHQgaXMgW0ludGVybmV0QWRkcmVzc1R5cGUuYW55XS4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgRnV0dXJlPExpc3Q8TmV0d29ya0ludGVyZmFjZT4+IGxpc3QoCiAgICAgIHtib29sIGluY2x1ZGVMb29wYmFjazogZmFsc2UsCiAgICAgIGJvb2wgaW5jbHVkZUxpbmtMb2NhbDogZmFsc2UsCiAgICAgIEludGVybmV0QWRkcmVzc1R5cGUgdHlwZTogSW50ZXJuZXRBZGRyZXNzVHlwZS5hbnl9KTsKfQoKLyoqCiAqIEEgW1Jhd1NlcnZlclNvY2tldF0gcmVwcmVzZW50cyBhIGxpc3RlbmluZyBzb2NrZXQsIGFuZCBwcm92aWRlcyBhCiAqIHN0cmVhbSBvZiBsb3ctbGV2ZWwgW1Jhd1NvY2tldF0gb2JqZWN0cywgb25lIGZvciBlYWNoIGNvbm5lY3Rpb24KICogbWFkZSB0byB0aGUgbGlzdGVuaW5nIHNvY2tldC4KICoKICogU2VlIFtSYXdTb2NrZXRdIGZvciBtb3JlIGluZm8uCiAqLwphYnN0cmFjdCBjbGFzcyBSYXdTZXJ2ZXJTb2NrZXQgaW1wbGVtZW50cyBTdHJlYW08UmF3U29ja2V0PiB7CiAgLyoqCiAgICogUmV0dXJucyBhIGZ1dHVyZSBmb3IgYSBbOlJhd1NlcnZlclNvY2tldDpdLiBXaGVuIHRoZSBmdXR1cmUKICAgKiBjb21wbGV0ZXMgdGhlIHNlcnZlciBzb2NrZXQgaXMgYm91bmQgdG8gdGhlIGdpdmVuIFthZGRyZXNzXSBhbmQKICAgKiBbcG9ydF0gYW5kIGhhcyBzdGFydGVkIGxpc3RlbmluZyBvbiBpdC4KICAgKgogICAqIFRoZSBbYWRkcmVzc10gY2FuIGVpdGhlciBiZSBhIFtTdHJpbmddIG9yIGFuCiAgICogW0ludGVybmV0QWRkcmVzc10uIElmIFthZGRyZXNzXSBpcyBhIFtTdHJpbmddLCBbYmluZF0gd2lsbAogICAqIHBlcmZvcm0gYSBbSW50ZXJuZXRBZGRyZXNzLmxvb2t1cF0gYW5kIHVzZSB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlCiAgICogbGlzdC4gVG8gbGlzdGVuIG9uIHRoZSBsb29wYmFjayBhZGFwdGVyLCB3aGljaCB3aWxsIGFsbG93IG9ubHkKICAgKiBpbmNvbWluZyBjb25uZWN0aW9ucyBmcm9tIHRoZSBsb2NhbCBob3N0LCB1c2UgdGhlIHZhbHVlCiAgICogW0ludGVybmV0QWRkcmVzcy5sb29wYmFja0lQdjRdIG9yCiAgICogW0ludGVybmV0QWRkcmVzcy5sb29wYmFja0lQdjZdLiBUbyBhbGxvdyBmb3IgaW5jb21pbmcKICAgKiBjb25uZWN0aW9uIGZyb20gdGhlIG5ldHdvcmsgdXNlIGVpdGhlciBvbmUgb2YgdGhlIHZhbHVlcwogICAqIFtJbnRlcm5ldEFkZHJlc3MuYW55SVB2NF0gb3IgW0ludGVybmV0QWRkcmVzcy5hbnlJUHY2XSB0bwogICAqIGJpbmQgdG8gYWxsIGludGVyZmFjZXMgb3IgdGhlIElQIGFkZHJlc3Mgb2YgYSBzcGVjaWZpYyBpbnRlcmZhY2UuCiAgICoKICAgKiBJZiBhbiBJUCB2ZXJzaW9uIDYgKElQdjYpIGFkZHJlc3MgaXMgdXNlZCwgYm90aCBJUCB2ZXJzaW9uIDYKICAgKiAoSVB2NikgYW5kIHZlcnNpb24gNCAoSVB2NCkgY29ubmVjdGlvbnMgd2lsbCBiZSBhY2NlcHRlZC4gVG8KICAgKiByZXN0cmljdCB0aGlzIHRvIHZlcnNpb24gNiAoSVB2Nikgb25seSwgdXNlIFt2Nk9ubHldIHRvIHNldAogICAqIHZlcnNpb24gNiBvbmx5LgogICAqCiAgICogSWYgW3BvcnRdIGhhcyB0aGUgdmFsdWUgWzowOl0gYW4gZXBoZW1lcmFsIHBvcnQgd2lsbAogICAqIGJlIGNob3NlbiBieSB0aGUgc3lzdGVtLiBUaGUgYWN0dWFsIHBvcnQgdXNlZCBjYW4gYmUgcmV0cmlldmVkCiAgICogdXNpbmcgdGhlIFs6cG9ydDpdIGdldHRlci4KICAgKgogICAqIFRoZSBvcHRpb25hbCBhcmd1bWVudCBbYmFja2xvZ10gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbGlzdGVuCiAgICogYmFja2xvZyBmb3IgdGhlIHVuZGVybHlpbmcgT1MgbGlzdGVuIHNldHVwLiBJZiBbYmFja2xvZ10gaGFzIHRoZQogICAqIHZhbHVlIG9mIFs6MDpdICh0aGUgZGVmYXVsdCkgYSByZWFzb25hYmxlIHZhbHVlIHdpbGwgYmUgY2hvc2VuIGJ5CiAgICogdGhlIHN5c3RlbS4KICAgKgogICAqIFRoZSBvcHRpb25hbCBhcmd1bWVudCBbc2hhcmVkXSBzcGVjaWZpZXMgd2hldGhlciBhZGRpdGlvbmFsIFJhd1NlcnZlclNvY2tldAogICAqIG9iamVjdHMgY2FuIGJpbmQgdG8gdGhlIHNhbWUgY29tYmluYXRpb24gb2YgYGFkZHJlc3NgLCBgcG9ydGAgYW5kIGB2Nk9ubHlgLgogICAqIElmIGBzaGFyZWRgIGlzIGB0cnVlYCBhbmQgbW9yZSBgUmF3U2VydmVyU29ja2V0YHMgZnJvbSB0aGlzIGlzb2xhdGUgb3IKICAgKiBvdGhlciBpc29sYXRlcyBhcmUgYm91bmQgdG8gdGhlIHBvcnQsIHRoZW4gdGhlIGluY29taW5nIGNvbm5lY3Rpb25zIHdpbGwgYmUKICAgKiBkaXN0cmlidXRlZCBhbW9uZyBhbGwgdGhlIGJvdW5kIGBSYXdTZXJ2ZXJTb2NrZXRgcy4gQ29ubmVjdGlvbnMgY2FuIGJlCiAgICogZGlzdHJpYnV0ZWQgb3ZlciBtdWx0aXBsZSBpc29sYXRlcyB0aGlzIHdheS4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgRnV0dXJlPFJhd1NlcnZlclNvY2tldD4gYmluZChhZGRyZXNzLCBpbnQgcG9ydCwKICAgICAge2ludCBiYWNrbG9nOiAwLCBib29sIHY2T25seTogZmFsc2UsIGJvb2wgc2hhcmVkOiBmYWxzZX0pOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBwb3J0IHVzZWQgYnkgdGhpcyBzb2NrZXQuCiAgICovCiAgaW50IGdldCBwb3J0OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBhZGRyZXNzIHVzZWQgYnkgdGhpcyBzb2NrZXQuCiAgICovCiAgSW50ZXJuZXRBZGRyZXNzIGdldCBhZGRyZXNzOwoKICAvKioKICAgKiBDbG9zZXMgdGhlIHNvY2tldC4gVGhlIHJldHVybmVkIGZ1dHVyZSBjb21wbGV0ZXMgd2hlbiB0aGUgc29ja2V0CiAgICogaXMgZnVsbHkgY2xvc2VkIGFuZCBpcyBubyBsb25nZXIgYm91bmQuCiAgICovCiAgRnV0dXJlPFJhd1NlcnZlclNvY2tldD4gY2xvc2UoKTsKfQoKLyoqCiAqIEEgW1NlcnZlclNvY2tldF0gcmVwcmVzZW50cyBhIGxpc3RlbmluZyBzb2NrZXQsIGFuZCBwcm92aWRlcyBhCiAqIHN0cmVhbSBvZiBbU29ja2V0XSBvYmplY3RzLCBvbmUgZm9yIGVhY2ggY29ubmVjdGlvbiBtYWRlIHRvIHRoZQogKiBsaXN0ZW5pbmcgc29ja2V0LgogKgogKiBTZWUgW1NvY2tldF0gZm9yIG1vcmUgaW5mby4KICovCmFic3RyYWN0IGNsYXNzIFNlcnZlclNvY2tldCBpbXBsZW1lbnRzIFN0cmVhbTxTb2NrZXQ+IHsKICAvKioKICAgKiBSZXR1cm5zIGEgZnV0dXJlIGZvciBhIFs6U2VydmVyU29ja2V0Ol0uIFdoZW4gdGhlIGZ1dHVyZQogICAqIGNvbXBsZXRlcyB0aGUgc2VydmVyIHNvY2tldCBpcyBib3VuZCB0byB0aGUgZ2l2ZW4gW2FkZHJlc3NdIGFuZAogICAqIFtwb3J0XSBhbmQgaGFzIHN0YXJ0ZWQgbGlzdGVuaW5nIG9uIGl0LgogICAqCiAgICogVGhlIFthZGRyZXNzXSBjYW4gZWl0aGVyIGJlIGEgW1N0cmluZ10gb3IgYW4KICAgKiBbSW50ZXJuZXRBZGRyZXNzXS4gSWYgW2FkZHJlc3NdIGlzIGEgW1N0cmluZ10sIFtiaW5kXSB3aWxsCiAgICogcGVyZm9ybSBhIFtJbnRlcm5ldEFkZHJlc3MubG9va3VwXSBhbmQgdXNlIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUKICAgKiBsaXN0LiBUbyBsaXN0ZW4gb24gdGhlIGxvb3BiYWNrIGFkYXB0ZXIsIHdoaWNoIHdpbGwgYWxsb3cgb25seQogICAqIGluY29taW5nIGNvbm5lY3Rpb25zIGZyb20gdGhlIGxvY2FsIGhvc3QsIHVzZSB0aGUgdmFsdWUKICAgKiBbSW50ZXJuZXRBZGRyZXNzLmxvb3BiYWNrSVB2NF0gb3IKICAgKiBbSW50ZXJuZXRBZGRyZXNzLmxvb3BiYWNrSVB2Nl0uIFRvIGFsbG93IGZvciBpbmNvbWluZwogICAqIGNvbm5lY3Rpb24gZnJvbSB0aGUgbmV0d29yayB1c2UgZWl0aGVyIG9uZSBvZiB0aGUgdmFsdWVzCiAgICogW0ludGVybmV0QWRkcmVzcy5hbnlJUHY0XSBvciBbSW50ZXJuZXRBZGRyZXNzLmFueUlQdjZdIHRvCiAgICogYmluZCB0byBhbGwgaW50ZXJmYWNlcyBvciB0aGUgSVAgYWRkcmVzcyBvZiBhIHNwZWNpZmljIGludGVyZmFjZS4KICAgKgogICAqIElmIGFuIElQIHZlcnNpb24gNiAoSVB2NikgYWRkcmVzcyBpcyB1c2VkLCBib3RoIElQIHZlcnNpb24gNgogICAqIChJUHY2KSBhbmQgdmVyc2lvbiA0IChJUHY0KSBjb25uZWN0aW9ucyB3aWxsIGJlIGFjY2VwdGVkLiBUbwogICAqIHJlc3RyaWN0IHRoaXMgdG8gdmVyc2lvbiA2IChJUHY2KSBvbmx5LCB1c2UgW3Y2T25seV0gdG8gc2V0CiAgICogdmVyc2lvbiA2IG9ubHkuCiAgICoKICAgKiBJZiBbcG9ydF0gaGFzIHRoZSB2YWx1ZSBbOjA6XSBhbiBlcGhlbWVyYWwgcG9ydCB3aWxsIGJlIGNob3NlbiBieQogICAqIHRoZSBzeXN0ZW0uIFRoZSBhY3R1YWwgcG9ydCB1c2VkIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgdGhlCiAgICogW3BvcnRdIGdldHRlci4KICAgKgogICAqIFRoZSBvcHRpb25hbCBhcmd1bWVudCBbYmFja2xvZ10gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbGlzdGVuCiAgICogYmFja2xvZyBmb3IgdGhlIHVuZGVybHlpbmcgT1MgbGlzdGVuIHNldHVwLiBJZiBbYmFja2xvZ10gaGFzIHRoZQogICAqIHZhbHVlIG9mIFs6MDpdICh0aGUgZGVmYXVsdCkgYSByZWFzb25hYmxlIHZhbHVlIHdpbGwgYmUgY2hvc2VuIGJ5CiAgICogdGhlIHN5c3RlbS4KICAgKgogICAqIFRoZSBvcHRpb25hbCBhcmd1bWVudCBbc2hhcmVkXSBzcGVjaWZpZXMgd2hldGhlciBhZGRpdGlvbmFsIFNlcnZlclNvY2tldAogICAqIG9iamVjdHMgY2FuIGJpbmQgdG8gdGhlIHNhbWUgY29tYmluYXRpb24gb2YgYGFkZHJlc3NgLCBgcG9ydGAgYW5kIGB2Nk9ubHlgLgogICAqIElmIGBzaGFyZWRgIGlzIGB0cnVlYCBhbmQgbW9yZSBgU2VydmVyU29ja2V0YHMgZnJvbSB0aGlzIGlzb2xhdGUgb3Igb3RoZXIKICAgKiBpc29sYXRlcyBhcmUgYm91bmQgdG8gdGhlIHBvcnQsIHRoZW4gdGhlIGluY29taW5nIGNvbm5lY3Rpb25zIHdpbGwgYmUKICAgKiBkaXN0cmlidXRlZCBhbW9uZyBhbGwgdGhlIGJvdW5kIGBTZXJ2ZXJTb2NrZXRgcy4gQ29ubmVjdGlvbnMgY2FuIGJlCiAgICogZGlzdHJpYnV0ZWQgb3ZlciBtdWx0aXBsZSBpc29sYXRlcyB0aGlzIHdheS4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgRnV0dXJlPFNlcnZlclNvY2tldD4gYmluZChhZGRyZXNzLCBpbnQgcG9ydCwKICAgICAge2ludCBiYWNrbG9nOiAwLCBib29sIHY2T25seTogZmFsc2UsIGJvb2wgc2hhcmVkOiBmYWxzZX0pOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBwb3J0IHVzZWQgYnkgdGhpcyBzb2NrZXQuCiAgICovCiAgaW50IGdldCBwb3J0OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBhZGRyZXNzIHVzZWQgYnkgdGhpcyBzb2NrZXQuCiAgICovCiAgSW50ZXJuZXRBZGRyZXNzIGdldCBhZGRyZXNzOwoKICAvKioKICAgKiBDbG9zZXMgdGhlIHNvY2tldC4gVGhlIHJldHVybmVkIGZ1dHVyZSBjb21wbGV0ZXMgd2hlbiB0aGUgc29ja2V0CiAgICogaXMgZnVsbHkgY2xvc2VkIGFuZCBpcyBubyBsb25nZXIgYm91bmQuCiAgICovCiAgRnV0dXJlPFNlcnZlclNvY2tldD4gY2xvc2UoKTsKfQoKLyoqCiAqIFRoZSBbU29ja2V0RGlyZWN0aW9uXSBpcyB1c2VkIGFzIGEgcGFyYW1ldGVyIHRvIFtTb2NrZXQuY2xvc2VdIGFuZAogKiBbUmF3U29ja2V0LmNsb3NlXSB0byBjbG9zZSBhIHNvY2tldCBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdGlvbihzKS4KICovCmNsYXNzIFNvY2tldERpcmVjdGlvbiB7CiAgc3RhdGljIGNvbnN0IFNvY2tldERpcmVjdGlvbiByZWNlaXZlID0gY29uc3QgU29ja2V0RGlyZWN0aW9uLl8oMCk7CiAgc3RhdGljIGNvbnN0IFNvY2tldERpcmVjdGlvbiBzZW5kID0gY29uc3QgU29ja2V0RGlyZWN0aW9uLl8oMSk7CiAgc3RhdGljIGNvbnN0IFNvY2tldERpcmVjdGlvbiBib3RoID0gY29uc3QgU29ja2V0RGlyZWN0aW9uLl8oMik7CgogIEBEZXByZWNhdGVkKCJVc2UgcmVjZWl2ZSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgU29ja2V0RGlyZWN0aW9uIFJFQ0VJVkUgPSByZWNlaXZlOwogIEBEZXByZWNhdGVkKCJVc2Ugc2VuZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgU29ja2V0RGlyZWN0aW9uIFNFTkQgPSBzZW5kOwogIEBEZXByZWNhdGVkKCJVc2UgYm90aCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgU29ja2V0RGlyZWN0aW9uIEJPVEggPSBib3RoOwoKICBmaW5hbCBfdmFsdWU7CgogIGNvbnN0IFNvY2tldERpcmVjdGlvbi5fKHRoaXMuX3ZhbHVlKTsKfQoKLyoqCiAqIFRoZSBbU29ja2V0T3B0aW9uXSBpcyB1c2VkIGFzIGEgcGFyYW1ldGVyIHRvIFtTb2NrZXQuc2V0T3B0aW9uXSBhbmQKICogW1Jhd1NvY2tldC5zZXRPcHRpb25dIHRvIHNldCBjdXN0b21pemUgdGhlIGJlaGF2aW91ciBvZiB0aGUgdW5kZXJseWluZwogKiBzb2NrZXQuCiAqLwpjbGFzcyBTb2NrZXRPcHRpb24gewogIC8qKgogICAqIEVuYWJsZSBvciBkaXNhYmxlIG5vLWRlbGF5IG9uIHRoZSBzb2NrZXQuIElmIHRjcE5vRGVsYXkgaXMgZW5hYmxlZCwgdGhlCiAgICogc29ja2V0IHdpbGwgbm90IGJ1ZmZlciBkYXRhIGludGVybmFsbHksIGJ1dCBpbnN0ZWFkIHdyaXRlIGVhY2ggZGF0YSBjaHVuawogICAqIGFzIGFuIGluZGl2aWR1YWwgVENQIHBhY2tldC4KICAgKgogICAqIHRjcE5vRGVsYXkgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KICAgKi8KICBzdGF0aWMgY29uc3QgU29ja2V0T3B0aW9uIHRjcE5vRGVsYXkgPSBjb25zdCBTb2NrZXRPcHRpb24uXygwKTsKICBARGVwcmVjYXRlZCgiVXNlIHRjcE5vRGVsYXkgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFNvY2tldE9wdGlvbiBUQ1BfTk9ERUxBWSA9IHRjcE5vRGVsYXk7CgogIHN0YXRpYyBjb25zdCBTb2NrZXRPcHRpb24gX2lwTXVsdGljYXN0TG9vcCA9IGNvbnN0IFNvY2tldE9wdGlvbi5fKDEpOwogIHN0YXRpYyBjb25zdCBTb2NrZXRPcHRpb24gX2lwTXVsdGljYXN0SG9wcyA9IGNvbnN0IFNvY2tldE9wdGlvbi5fKDIpOwogIHN0YXRpYyBjb25zdCBTb2NrZXRPcHRpb24gX2lwTXVsdGljYXN0SWYgPSBjb25zdCBTb2NrZXRPcHRpb24uXygzKTsKICBzdGF0aWMgY29uc3QgU29ja2V0T3B0aW9uIF9pcEJyb2FkY2FzdCA9IGNvbnN0IFNvY2tldE9wdGlvbi5fKDQpOwoKICBmaW5hbCBfdmFsdWU7CgogIGNvbnN0IFNvY2tldE9wdGlvbi5fKHRoaXMuX3ZhbHVlKTsKfQoKLy8gTXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCBlbnVtIGluIHNvY2tldC5jYwplbnVtIF9SYXdTb2NrZXRPcHRpb25zIHsKICBTT0xfU09DS0VULCAvLyAwCiAgSVBQUk9UT19JUCwgLy8gMQogIElQX01VTFRJQ0FTVF9JRiwgLy8gMgogIElQUFJPVE9fSVBWNiwgLy8gMwogIElQVjZfTVVMVElDQVNUX0lGLCAvLyA0CiAgSVBQUk9UT19UQ1AsIC8vIDUKICBJUFBST1RPX1VEUCwgLy8gNgp9CgovLy8gVGhlIFtSYXdTb2NrZXRPcHRpb25dIGlzIHVzZWQgYXMgYSBwYXJhbWV0ZXIgdG8gW1NvY2tldC5zZXRSYXdPcHRpb25dIGFuZAovLy8gW1Jhd1NvY2tldC5zZXRSYXdPcHRpb25dIHRvIHNldCBjdXN0b21pemUgdGhlIGJlaGF2aW91ciBvZiB0aGUgdW5kZXJseWluZwovLy8gc29ja2V0LgovLy8KLy8vIEl0IGFsbG93cyBmb3IgZmluZSBncmFpbmVkIGNvbnRyb2wgb2YgdGhlIHNvY2tldCBvcHRpb25zLCBhbmQgaXRzIHZhbHVlcyB3aWxsCi8vLyBiZSBwYXNzZWQgdG8gdGhlIHVuZGVybHlpbmcgcGxhdGZvcm0ncyBpbXBsZW1lbnRhdGlvbiBvZiBzZXRzb2Nrb3B0IGFuZAovLy8gZ2V0c29ja29wdC4KY2xhc3MgUmF3U29ja2V0T3B0aW9uIHsKICAvLy8gQ3JlYXRlcyBhIFJhd1NvY2tldE9wdGlvbiBmb3IgZ2V0UmF3T3B0aW9uIGFuZFNldFJhd09wdGlvbi4KICAvLy8KICAvLy8gQWxsIGFyZ3VtZW50cyBhcmUgcmVxdWlyZWQgYW5kIG11c3Qgbm90IGJlIG51bGwuCiAgLy8vCiAgLy8vIFRoZSBsZXZlbCBhbmQgb3B0aW9uIGFyZ3VtZW50cyBjb3JyZXNwb25kIHRvIGxldmVsIGFuZCBvcHRuYW1lIGFyZ3VtZW50cwogIC8vLyBvbiB0aGUgZ2V0L3NldHNvY2tvcHQgbmF0aXZlIGNhbGxzLgogIC8vLwogIC8vLyBUaGUgdmFsdWUgYXJndW1lbnQgYW5kIGl0cyBsZW5ndGggY29ycmVzcG9uZCB0byB0aGUgb3B0dmFsIGFuZCBsZW5ndGgKICAvLy8gYXJndW1lbnRzIG9uIHRoZSBuYXRpdmUgY2FsbC4KICAvLy8KICAvLy8gRm9yIGEgW2dldFJhd09wdGlvbl0gY2FsbCwgdGhlIHZhbHVlIHBhcmFtZXRlciB3aWxsIGJlIHVwZGF0ZWQgYWZ0ZXIgYQogIC8vLyBzdWNjZXNzZnVsIGNhbGwgKGFsdGhvdWdoIGl0cyBsZW5ndGggd2lsbCBub3QgYmUgY2hhbmdlZCkuCiAgLy8vCiAgLy8vIEZvciBhIFtzZXRSYXdPcHRpb25dIGNhbGwsIHRoZSB2YWx1ZSBwYXJhbWV0ZXIgd2lsbCBiZSB1c2VkIHNldCB0aGUKICAvLy8gb3B0aW9uLgogIGNvbnN0IFJhd1NvY2tldE9wdGlvbih0aGlzLmxldmVsLCB0aGlzLm9wdGlvbiwgdGhpcy52YWx1ZSk7CgogIC8vLyBDb252ZW5pZW5jZSBjb25zdHJ1Y3RvciBmb3IgY3JlYXRpbmcgYW4gaW50IGJhc2VkIFJhd1NvY2tldE9wdGlvbi4KICBmYWN0b3J5IFJhd1NvY2tldE9wdGlvbi5mcm9tSW50KGludCBsZXZlbCwgaW50IG9wdGlvbiwgaW50IHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT0gbnVsbCkgewogICAgICB2YWx1ZSA9IDA7CiAgICB9CiAgICBmaW5hbCBVaW50OExpc3QgbGlzdCA9IFVpbnQ4TGlzdCg0KTsKICAgIGZpbmFsIGJ1ZmZlciA9IEJ5dGVEYXRhLnZpZXcobGlzdC5idWZmZXIpOwogICAgYnVmZmVyLnNldEludDMyKDAsIHZhbHVlKTsKICAgIHJldHVybiBSYXdTb2NrZXRPcHRpb24obGV2ZWwsIG9wdGlvbiwgbGlzdCk7CiAgfQoKICAvLy8gQ29udmVuaWVuY2UgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIGEgYm9vbCBiYXNlZCBSYXdTb2NrZXRPcHRpb24uCiAgZmFjdG9yeSBSYXdTb2NrZXRPcHRpb24uZnJvbUJvb2woaW50IGxldmVsLCBpbnQgb3B0aW9uLCBib29sIHZhbHVlKSA9PgogICAgICBSYXdTb2NrZXRPcHRpb24uZnJvbUludChsZXZlbCwgb3B0aW9uLCB2YWx1ZSA9PSB0cnVlID8gMSA6IDApOwoKICAvLy8gVGhlIGxldmVsIGZvciB0aGUgb3B0aW9uIHRvIHNldCBvciBnZXQuCiAgLy8vCiAgLy8vIFNlZSBhbHNvOgogIC8vLyAgICogW1Jhd1NvY2tldE9wdGlvbi5sZXZlbFNvY2tldF0KICAvLy8gICAqIFtSYXdTb2NrZXRPcHRpb24ubGV2ZWxJUHY0XQogIC8vLyAgICogW1Jhd1NvY2tldE9wdGlvbi5sZXZlbElQdjZdCiAgLy8vICAgKiBbUmF3U29ja2V0T3B0aW9uLmxldmVsVGNwXQogIC8vLyAgICogW1Jhd1NvY2tldE9wdGlvbi5sZXZlbFVkcF0KICBmaW5hbCBpbnQgbGV2ZWw7CgogIC8vLyBUaGUgb3B0aW9uIHRvIHNldCBvciBnZXQuCiAgZmluYWwgaW50IG9wdGlvbjsKCiAgLy8vIFRoZSByYXcgZGF0YSB0byBzZXQsIG9yIHRoZSBhcnJheSB0byB3cml0ZSB0aGUgY3VycmVudCBvcHRpb24gdmFsdWUgaW50by4KICAvLy8KICAvLy8gVGhpcyBsaXN0IG11c3QgYmUgdGhlIGNvcnJlY3QgbGVuZ3RoIGZvciB0aGUgZXhwZWN0ZWQgb3B0aW9uLiBGb3IgbW9zdAogIC8vLyBvcHRpb25zIHRoYXQgdGFrZSBpbnQgb3IgYm9vbCB2YWx1ZXMsIHRoZSBsZW5ndGggc2hvdWxkIGJlIDQuIEZvciBvcHRpb25zCiAgLy8vIHRoYXQgZXhwZWN0IGEgc3RydWN0IChzdWNoIGFzIGFuIGluX2FkZHJfdCksIHRoZSBsZW5ndGggc2hvdWxkIGJlIHRoZQogIC8vLyBjb3JyZWN0IGxlbmd0aCBmb3IgdGhhdCBzdHJ1Y3QuCiAgZmluYWwgVWludDhMaXN0IHZhbHVlOwoKICAvLy8gU29ja2V0IGxldmVsIG9wdGlvbiBmb3IgU09MX1NPQ0tFVC4KICBzdGF0aWMgaW50IGdldCBsZXZlbFNvY2tldCA9PgogICAgICBfZ2V0T3B0aW9uVmFsdWUoX1Jhd1NvY2tldE9wdGlvbnMuU09MX1NPQ0tFVC5pbmRleCk7CgogIC8vLyBTb2NrZXQgbGV2ZWwgb3B0aW9uIGZvciBJUFBST1RPX0lQLgogIHN0YXRpYyBpbnQgZ2V0IGxldmVsSVB2NCA9PgogICAgICBfZ2V0T3B0aW9uVmFsdWUoX1Jhd1NvY2tldE9wdGlvbnMuSVBQUk9UT19JUC5pbmRleCk7CgogIC8vLyBTb2NrZXQgb3B0aW9uIGZvciBJUF9NVUxUSUNBU1RfSUYuCiAgc3RhdGljIGludCBnZXQgSVB2NE11bHRpY2FzdEludGVyZmFjZSA9PgogICAgICBfZ2V0T3B0aW9uVmFsdWUoX1Jhd1NvY2tldE9wdGlvbnMuSVBfTVVMVElDQVNUX0lGLmluZGV4KTsKCiAgLy8vIFNvY2tldCBsZXZlbCBvcHRpb24gZm9yIElQUFJPVE9fSVBWNi4KICBzdGF0aWMgaW50IGdldCBsZXZlbElQdjYgPT4KICAgICAgX2dldE9wdGlvblZhbHVlKF9SYXdTb2NrZXRPcHRpb25zLklQUFJPVE9fSVBWNi5pbmRleCk7CgogIC8vLyBTb2NrZXQgb3B0aW9uIGZvciBJUFY2X01VTFRJQ0FTVF9JRi4KICBzdGF0aWMgaW50IGdldCBJUHY2TXVsdGljYXN0SW50ZXJmYWNlID0+CiAgICAgIF9nZXRPcHRpb25WYWx1ZShfUmF3U29ja2V0T3B0aW9ucy5JUFY2X01VTFRJQ0FTVF9JRi5pbmRleCk7CgogIC8vLyBTb2NrZXQgbGV2ZWwgb3B0aW9uIGZvciBJUFBST1RPX1RDUC4KICBzdGF0aWMgaW50IGdldCBsZXZlbFRjcCA9PgogICAgICBfZ2V0T3B0aW9uVmFsdWUoX1Jhd1NvY2tldE9wdGlvbnMuSVBQUk9UT19UQ1AuaW5kZXgpOwoKICAvLy8gU29ja2V0IGxldmVsIG9wdGlvbiBmb3IgSVBQUk9UT19VRFAuCiAgc3RhdGljIGludCBnZXQgbGV2ZWxVZHAgPT4KICAgICAgX2dldE9wdGlvblZhbHVlKF9SYXdTb2NrZXRPcHRpb25zLklQUFJPVE9fVURQLmluZGV4KTsKCiAgZXh0ZXJuYWwgc3RhdGljIGludCBfZ2V0T3B0aW9uVmFsdWUoaW50IGtleSk7Cn0KCi8qKgogKiBFdmVudHMgZm9yIHRoZSBbUmF3U29ja2V0XS4KICovCmNsYXNzIFJhd1NvY2tldEV2ZW50IHsKICBzdGF0aWMgY29uc3QgUmF3U29ja2V0RXZlbnQgcmVhZCA9IGNvbnN0IFJhd1NvY2tldEV2ZW50Ll8oMCk7CiAgc3RhdGljIGNvbnN0IFJhd1NvY2tldEV2ZW50IHdyaXRlID0gY29uc3QgUmF3U29ja2V0RXZlbnQuXygxKTsKICBzdGF0aWMgY29uc3QgUmF3U29ja2V0RXZlbnQgcmVhZENsb3NlZCA9IGNvbnN0IFJhd1NvY2tldEV2ZW50Ll8oMik7CiAgc3RhdGljIGNvbnN0IFJhd1NvY2tldEV2ZW50IGNsb3NlZCA9IGNvbnN0IFJhd1NvY2tldEV2ZW50Ll8oMyk7CgogIEBEZXByZWNhdGVkKCJVc2UgcmVhZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUmF3U29ja2V0RXZlbnQgUkVBRCA9IHJlYWQ7CiAgQERlcHJlY2F0ZWQoIlVzZSB3cml0ZSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUmF3U29ja2V0RXZlbnQgV1JJVEUgPSB3cml0ZTsKICBARGVwcmVjYXRlZCgiVXNlIHJlYWRDbG9zZWQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFJhd1NvY2tldEV2ZW50IFJFQURfQ0xPU0VEID0gcmVhZENsb3NlZDsKICBARGVwcmVjYXRlZCgiVXNlIGNsb3NlZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUmF3U29ja2V0RXZlbnQgQ0xPU0VEID0gY2xvc2VkOwoKICBmaW5hbCBpbnQgX3ZhbHVlOwoKICBjb25zdCBSYXdTb2NrZXRFdmVudC5fKHRoaXMuX3ZhbHVlKTsKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gY29uc3QgWwogICAgICAnUmF3U29ja2V0RXZlbnQucmVhZCcsCiAgICAgICdSYXdTb2NrZXRFdmVudC53cml0ZScsCiAgICAgICdSYXdTb2NrZXRFdmVudC5yZWFkQ2xvc2VkJywKICAgICAgJ1Jhd1NvY2tldEV2ZW50LmNsb3NlZCcKICAgIF1bX3ZhbHVlXTsKICB9Cn0KCi8vLyBSZXR1cm5lZCBieSB0aGUgYHN0YXJ0Q29ubmVjdGAgbWV0aG9kcyBvbiBjbGllbnQtc2lkZSBzb2NrZXQgdHlwZXMgYFNgLAovLy8gYENvbm5lY3Rpb25UYXNrPFM+YCBhbGxvd3MgY2FuY2VsbGluZyBhbiBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gYSBob3N0LgpjbGFzcyBDb25uZWN0aW9uVGFzazxTPiB7CiAgLy8vIEEgYEZ1dHVyZWAgdGhhdCBjb21wbGV0ZXMgd2l0aCB2YWx1ZSB0aGF0IGBTLmNvbm5lY3QoKWAgd291bGQgcmV0dXJuCiAgLy8vIHVubGVzcyBbY2FuY2VsXSBpcyBjYWxsZWQgb24gdGhpcyBbQ29ubmVjdGlvblRhc2tdLgogIC8vLwogIC8vLyBJZiBbY2FuY2VsXSBpcyBjYWxsZWQsIHRoZSBgRnV0dXJlYCBjb21wbGV0ZXMgd2l0aCBhIFtTb2NrZXRFeGNlcHRpb25dCiAgLy8vIGVycm9yIHdob3NlIG1lc3NhZ2UgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbm5lY3Rpb24gYXR0ZW1wdCB3YXMgY2FuY2VsbGVkLgogIGZpbmFsIEZ1dHVyZTxTPiBzb2NrZXQ7CiAgZmluYWwgdm9pZCBGdW5jdGlvbigpIF9vbkNhbmNlbDsKCiAgQ29ubmVjdGlvblRhc2suXyh7RnV0dXJlPFM+IHNvY2tldCwgdm9pZCBGdW5jdGlvbigpIG9uQ2FuY2VsfSkKICAgICAgOiBhc3NlcnQoc29ja2V0ICE9IG51bGwpLAogICAgICAgIGFzc2VydChvbkNhbmNlbCAhPSBudWxsKSwKICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldCwKICAgICAgICB0aGlzLl9vbkNhbmNlbCA9IG9uQ2FuY2VsOwoKICAvLy8gQ2FuY2VscyB0aGUgY29ubmVjdGlvbiBhdHRlbXB0LgogIC8vLwogIC8vLyBUaGlzIGFsc28gY2F1c2VzIHRoZSBbc29ja2V0XSBgRnV0dXJlYCB0byBjb21wbGV0ZSB3aXRoIGEKICAvLy8gW1NvY2tldEV4Y2VwdGlvbl0gZXJyb3IuCiAgdm9pZCBjYW5jZWwoKSB7CiAgICBfb25DYW5jZWwoKTsKICB9Cn0KCi8qKgogKiBUaGUgW1Jhd1NvY2tldF0gaXMgYSBsb3ctbGV2ZWwgaW50ZXJmYWNlIHRvIGEgc29ja2V0LCBleHBvc2luZyB0aGUgcmF3CiAqIGV2ZW50cyBzaWduYWxlZCBieSB0aGUgc3lzdGVtLiBJdCdzIGEgW1N0cmVhbV0gb2YgW1Jhd1NvY2tldEV2ZW50XXMuCiAqLwphYnN0cmFjdCBjbGFzcyBSYXdTb2NrZXQgaW1wbGVtZW50cyBTdHJlYW08UmF3U29ja2V0RXZlbnQ+IHsKICAvKioKICAgKiBTZXQgb3IgZ2V0LCBpZiB0aGUgW1Jhd1NvY2tldF0gc2hvdWxkIGxpc3RlbiBmb3IgW1Jhd1NvY2tldEV2ZW50LnJlYWRdCiAgICogZXZlbnRzLiBEZWZhdWx0IGlzIFs6dHJ1ZTpdLgogICAqLwogIGJvb2wgcmVhZEV2ZW50c0VuYWJsZWQ7CgogIC8qKgogICAqIFNldCBvciBnZXQsIGlmIHRoZSBbUmF3U29ja2V0XSBzaG91bGQgbGlzdGVuIGZvciBbUmF3U29ja2V0RXZlbnQud3JpdGVdCiAgICogZXZlbnRzLiBEZWZhdWx0IGlzIFs6dHJ1ZTpdLgogICAqIFRoaXMgaXMgYSBvbmUtc2hvdCBsaXN0ZW5lciwgYW5kIHdyaXRlRXZlbnRzRW5hYmxlZCBtdXN0IGJlIHNldAogICAqIHRvIHRydWUgYWdhaW4gdG8gcmVjZWl2ZSBhbm90aGVyIHdyaXRlIGV2ZW50LgogICAqLwogIGJvb2wgd3JpdGVFdmVudHNFbmFibGVkOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IHNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBob3N0IGFuZCBwb3J0IGFuZCByZXR1cm5zIGEgW0Z1dHVyZV0KICAgKiB0aGF0IHdpbGwgY29tcGxldGUgd2l0aCBlaXRoZXIgYSBbUmF3U29ja2V0XSBvbmNlIGNvbm5lY3RlZCBvciBhbiBlcnJvcgogICAqIGlmIHRoZSBob3N0LWxvb2t1cCBvciBjb25uZWN0aW9uIGZhaWxlZC4KICAgKgogICAqIFtob3N0XSBjYW4gZWl0aGVyIGJlIGEgW1N0cmluZ10gb3IgYW4gW0ludGVybmV0QWRkcmVzc10uIElmIFtob3N0XSBpcyBhCiAgICogW1N0cmluZ10sIFtjb25uZWN0XSB3aWxsIHBlcmZvcm0gYSBbSW50ZXJuZXRBZGRyZXNzLmxvb2t1cF0gYW5kIHRyeQogICAqIGFsbCByZXR1cm5lZCBbSW50ZXJuZXRBZGRyZXNzXWVzLCB1bnRpbCBjb25uZWN0ZWQuIFVubGVzcyBhCiAgICogY29ubmVjdGlvbiB3YXMgZXN0YWJsaXNoZWQsIHRoZSBlcnJvciBmcm9tIHRoZSBmaXJzdCBmYWlsaW5nIGNvbm5lY3Rpb24gaXMKICAgKiByZXR1cm5lZC4KICAgKgogICAqIFRoZSBhcmd1bWVudCBbc291cmNlQWRkcmVzc10gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYWwKICAgKiBhZGRyZXNzIHRvIGJpbmQgd2hlbiBtYWtpbmcgdGhlIGNvbm5lY3Rpb24uIGBzb3VyY2VBZGRyZXNzYCBjYW4gZWl0aGVyCiAgICogYmUgYSBgU3RyaW5nYCBvciBhbiBgSW50ZXJuZXRBZGRyZXNzYC4gSWYgYSBgU3RyaW5nYCBpcyBwYXNzZWQgaXQgbXVzdAogICAqIGhvbGQgYSBudW1lcmljIElQIGFkZHJlc3MuCiAgICoKICAgKiBUaGUgYXJndW1lbnQgW3RpbWVvdXRdIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbWF4aW11bSBhbGxvd2VkIHRpbWUgdG8gd2FpdAogICAqIGZvciBhIGNvbm5lY3Rpb24gdG8gYmUgZXN0YWJsaXNoZWQuIElmIFt0aW1lb3V0XSBpcyBsb25nZXIgdGhhbiB0aGUgc3lzdGVtCiAgICogbGV2ZWwgdGltZW91dCBkdXJhdGlvbiwgYSB0aW1lb3V0IG1heSBvY2N1ciBzb29uZXIgdGhhbiBzcGVjaWZpZWQgaW4KICAgKiBbdGltZW91dF0uIE9uIHRpbWVvdXQsIGEgW1NvY2tldEV4Y2VwdGlvbl0gaXMgdGhyb3duIGFuZCBhbGwgb25nb2luZwogICAqIGNvbm5lY3Rpb24gYXR0ZW1wdHMgdG8gW2hvc3RdIGFyZSBjYW5jZWxsZWQuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIEZ1dHVyZTxSYXdTb2NrZXQ+IGNvbm5lY3QoaG9zdCwgaW50IHBvcnQsCiAgICAgIHtzb3VyY2VBZGRyZXNzLCBEdXJhdGlvbiB0aW1lb3V0fSk7CgogIC8vLyBMaWtlIFtjb25uZWN0XSwgYnV0IHJldHVybnMgYSBbRnV0dXJlXSB0aGF0IGNvbXBsZXRlcyB3aXRoIGEKICAvLy8gW0Nvbm5lY3Rpb25UYXNrXSB0aGF0IGNhbiBiZSBjYW5jZWxsZWQgaWYgdGhlIFtSYXdTb2NrZXRdIGlzIG5vCiAgLy8vIGxvbmdlciBuZWVkZWQuCiAgZXh0ZXJuYWwgc3RhdGljIEZ1dHVyZTxDb25uZWN0aW9uVGFzazxSYXdTb2NrZXQ+PiBzdGFydENvbm5lY3QoaG9zdCwgaW50IHBvcnQsCiAgICAgIHtzb3VyY2VBZGRyZXNzfSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIG51bWJlciBvZiByZWNlaXZlZCBhbmQgbm9uLXJlYWQgYnl0ZXMgaW4gdGhlIHNvY2tldCB0aGF0CiAgICogY2FuIGJlIHJlYWQuCiAgICovCiAgaW50IGF2YWlsYWJsZSgpOwoKICAvKioKICAgKiBSZWFkIHVwIHRvIFtsZW5dIGJ5dGVzIGZyb20gdGhlIHNvY2tldC4gVGhpcyBmdW5jdGlvbiBpcwogICAqIG5vbi1ibG9ja2luZyBhbmQgd2lsbCBvbmx5IHJldHVybiBkYXRhIGlmIGRhdGEgaXMgYXZhaWxhYmxlLiBUaGUKICAgKiBudW1iZXIgb2YgYnl0ZXMgcmVhZCBjYW4gYmUgbGVzcyB0aGVuIFtsZW5dIGlmIGZld2VyIGJ5dGVzIGFyZQogICAqIGF2YWlsYWJsZSBmb3IgaW1tZWRpYXRlIHJlYWRpbmcuIElmIG5vIGRhdGEgaXMgYXZhaWxhYmxlIFs6bnVsbDpdCiAgICogaXMgcmV0dXJuZWQuCiAgICovCiAgTGlzdDxpbnQ+IHJlYWQoW2ludCBsZW5dKTsKCiAgLyoqCiAgICogV3JpdGVzIHVwIHRvIFtjb3VudF0gYnl0ZXMgb2YgdGhlIGJ1ZmZlciBmcm9tIFtvZmZzZXRdIGJ1ZmZlciBvZmZzZXQgdG8KICAgKiB0aGUgc29ja2V0LiBUaGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWxseSB3cml0dGVuIGJ5dGVzIGlzIHJldHVybmVkLiBUaGlzCiAgICogZnVuY3Rpb24gaXMgbm9uLWJsb2NraW5nIGFuZCB3aWxsIG9ubHkgd3JpdGUgZGF0YSBpZiBidWZmZXIgc3BhY2UgaXMKICAgKiBhdmFpbGFibGUgaW4gdGhlIHNvY2tldC4KICAgKgogICAqIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBbb2Zmc2V0XSBpcyAwLCBhbmQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIFtjb3VudF0gaXMKICAgKiBbOmJ1ZmZlci5sZW5ndGggLSBvZmZzZXQ6XS4KICAgKi8KICBpbnQgd3JpdGUoTGlzdDxpbnQ+IGJ1ZmZlciwgW2ludCBvZmZzZXQsIGludCBjb3VudF0pOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBwb3J0IHVzZWQgYnkgdGhpcyBzb2NrZXQuCiAgICovCiAgaW50IGdldCBwb3J0OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSByZW1vdGUgcG9ydCBjb25uZWN0ZWQgdG8gYnkgdGhpcyBzb2NrZXQuCiAgICovCiAgaW50IGdldCByZW1vdGVQb3J0OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBbSW50ZXJuZXRBZGRyZXNzXSB1c2VkIHRvIGNvbm5lY3QgdGhpcyBzb2NrZXQuCiAgICovCiAgSW50ZXJuZXRBZGRyZXNzIGdldCBhZGRyZXNzOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSByZW1vdGUgW0ludGVybmV0QWRkcmVzc10gY29ubmVjdGVkIHRvIGJ5IHRoaXMgc29ja2V0LgogICAqLwogIEludGVybmV0QWRkcmVzcyBnZXQgcmVtb3RlQWRkcmVzczsKCiAgLyoqCiAgICogQ2xvc2VzIHRoZSBzb2NrZXQuIFJldHVybnMgYSBGdXR1cmUgdGhhdCBjb21wbGV0ZXMgd2l0aCBbdGhpc10gd2hlbiB0aGUKICAgKiB1bmRlcmx5aW5nIGNvbm5lY3Rpb24gaXMgY29tcGxldGVseSBkZXN0cm95ZWQuCiAgICoKICAgKiBDYWxsaW5nIFtjbG9zZV0gd2lsbCBuZXZlciB0aHJvdyBhbiBleGNlcHRpb24KICAgKiBhbmQgY2FsbGluZyBpdCBzZXZlcmFsIHRpbWVzIGlzIHN1cHBvcnRlZC4gQ2FsbGluZyBbY2xvc2VdIGNhbiByZXN1bHQgaW4KICAgKiBhIFtSYXdTb2NrZXRFdmVudC5yZWFkQ2xvc2VkXSBldmVudC4KICAgKi8KICBGdXR1cmU8UmF3U29ja2V0PiBjbG9zZSgpOwoKICAvKioKICAgKiBTaHV0ZG93biB0aGUgc29ja2V0IGluIHRoZSBbZGlyZWN0aW9uXS4gQ2FsbGluZyBbc2h1dGRvd25dIHdpbGwgbmV2ZXIKICAgKiB0aHJvdyBhbiBleGNlcHRpb24gYW5kIGNhbGxpbmcgaXQgc2V2ZXJhbCB0aW1lcyBpcyBzdXBwb3J0ZWQuIENhbGxpbmcKICAgKiBzaHV0ZG93biB3aXRoIGVpdGhlciBbU29ja2V0RGlyZWN0aW9uLmJvdGhdIG9yIFtTb2NrZXREaXJlY3Rpb24ucmVjZWl2ZV0KICAgKiBjYW4gcmVzdWx0IGluIGEgW1Jhd1NvY2tldEV2ZW50LnJlYWRDbG9zZWRdIGV2ZW50LgogICAqLwogIHZvaWQgc2h1dGRvd24oU29ja2V0RGlyZWN0aW9uIGRpcmVjdGlvbik7CgogIC8qKgogICAqIFVzZSBbc2V0T3B0aW9uXSB0byBjdXN0b21pemUgdGhlIFtSYXdTb2NrZXRdLiBTZWUgW1NvY2tldE9wdGlvbl0gZm9yCiAgICogYXZhaWxhYmxlIG9wdGlvbnMuCiAgICoKICAgKiBSZXR1cm5zIFs6dHJ1ZTpdIGlmIHRoZSBvcHRpb24gd2FzIHNldCBzdWNjZXNzZnVsbHksIGZhbHNlIG90aGVyd2lzZS4KICAgKi8KICBib29sIHNldE9wdGlvbihTb2NrZXRPcHRpb24gb3B0aW9uLCBib29sIGVuYWJsZWQpOwoKICAvKioKICAgKiBVc2UgW2dldFJhd09wdGlvbl0gdG8gZ2V0IGxvdyBsZXZlbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgW1Jhd1NvY2tldF0uIFNlZQogICAqIFtSYXdTb2NrZXRPcHRpb25dIGZvciBhdmFpbGFibGUgb3B0aW9ucy4KICAgKgogICAqIFJldHVybnMgdGhlIFtSYXdTb2NrZXRPcHRpb24udmFsdWVdIG9uIHN1Y2Nlc3MuCiAgICoKICAgKiBUaHJvd3MgYW4gW09TRXJyb3JdIG9uIGZhaWx1cmUuCiAgICovCiAgVWludDhMaXN0IGdldFJhd09wdGlvbihSYXdTb2NrZXRPcHRpb24gb3B0aW9uKTsKCiAgLyoqCiAgICogVXNlIFtzZXRSYXdPcHRpb25dIHRvIGN1c3RvbWl6ZSB0aGUgW1Jhd1NvY2tldF0uIFNlZSBbUmF3U29ja2V0T3B0aW9uXSBmb3IKICAgKiBhdmFpbGFibGUgb3B0aW9ucy4KICAgKgogICAqIFRocm93cyBhbiBbT1NFcnJvcl0gb24gZmFpbHVyZS4KICAgKi8KICB2b2lkIHNldFJhd09wdGlvbihSYXdTb2NrZXRPcHRpb24gb3B0aW9uKTsKfQoKLyoqCiAqIEEgaGlnaC1sZXZlbCBjbGFzcyBmb3IgY29tbXVuaWNhdGluZyBvdmVyIGEgVENQIHNvY2tldC4KICoKICogVGhlIFtTb2NrZXRdIGV4cG9zZXMgYm90aCBhIFtTdHJlYW1dIGFuZCBhIFtJT1NpbmtdIGludGVyZmFjZSwgbWFraW5nIGl0CiAqIGlkZWFsIGZvciB1c2luZyB0b2dldGhlciB3aXRoIG90aGVyIFtTdHJlYW1dcy4KICovCmFic3RyYWN0IGNsYXNzIFNvY2tldCBpbXBsZW1lbnRzIFN0cmVhbTxMaXN0PGludD4+LCBJT1NpbmsgewogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgc29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIGhvc3QgYW5kIHBvcnQgYW5kIHJldHVybnMgYSBbRnV0dXJlXQogICAqIHRoYXQgd2lsbCBjb21wbGV0ZSB3aXRoIGVpdGhlciBhIFtTb2NrZXRdIG9uY2UgY29ubmVjdGVkIG9yIGFuIGVycm9yCiAgICogaWYgdGhlIGhvc3QtbG9va3VwIG9yIGNvbm5lY3Rpb24gZmFpbGVkLgogICAqCiAgICogW2hvc3RdIGNhbiBlaXRoZXIgYmUgYSBbU3RyaW5nXSBvciBhbiBbSW50ZXJuZXRBZGRyZXNzXS4gSWYgW2hvc3RdIGlzIGEKICAgKiBbU3RyaW5nXSwgW2Nvbm5lY3RdIHdpbGwgcGVyZm9ybSBhIFtJbnRlcm5ldEFkZHJlc3MubG9va3VwXSBhbmQgdHJ5CiAgICogYWxsIHJldHVybmVkIFtJbnRlcm5ldEFkZHJlc3NdZXMsIHVudGlsIGNvbm5lY3RlZC4gVW5sZXNzIGEKICAgKiBjb25uZWN0aW9uIHdhcyBlc3RhYmxpc2hlZCwgdGhlIGVycm9yIGZyb20gdGhlIGZpcnN0IGZhaWxpbmcgY29ubmVjdGlvbiBpcwogICAqIHJldHVybmVkLgogICAqCiAgICogVGhlIGFyZ3VtZW50IFtzb3VyY2VBZGRyZXNzXSBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhbAogICAqIGFkZHJlc3MgdG8gYmluZCB3aGVuIG1ha2luZyB0aGUgY29ubmVjdGlvbi4gYHNvdXJjZUFkZHJlc3NgIGNhbiBlaXRoZXIKICAgKiBiZSBhIGBTdHJpbmdgIG9yIGFuIGBJbnRlcm5ldEFkZHJlc3NgLiBJZiBhIGBTdHJpbmdgIGlzIHBhc3NlZCBpdCBtdXN0CiAgICogaG9sZCBhIG51bWVyaWMgSVAgYWRkcmVzcy4KICAgKgogICAqIFRoZSBhcmd1bWVudCBbdGltZW91dF0gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFsbG93ZWQgdGltZSB0byB3YWl0CiAgICogZm9yIGEgY29ubmVjdGlvbiB0byBiZSBlc3RhYmxpc2hlZC4gSWYgW3RpbWVvdXRdIGlzIGxvbmdlciB0aGFuIHRoZSBzeXN0ZW0KICAgKiBsZXZlbCB0aW1lb3V0IGR1cmF0aW9uLCBhIHRpbWVvdXQgbWF5IG9jY3VyIHNvb25lciB0aGFuIHNwZWNpZmllZCBpbgogICAqIFt0aW1lb3V0XS4gT24gdGltZW91dCwgYSBbU29ja2V0RXhjZXB0aW9uXSBpcyB0aHJvd24gYW5kIGFsbCBvbmdvaW5nCiAgICogY29ubmVjdGlvbiBhdHRlbXB0cyB0byBbaG9zdF0gYXJlIGNhbmNlbGxlZC4KICAgKi8KICBzdGF0aWMgRnV0dXJlPFNvY2tldD4gY29ubmVjdChob3N0LCBpbnQgcG9ydCwKICAgICAge3NvdXJjZUFkZHJlc3MsIER1cmF0aW9uIHRpbWVvdXR9KSB7CiAgICBmaW5hbCBJT092ZXJyaWRlcyBvdmVycmlkZXMgPSBJT092ZXJyaWRlcy5jdXJyZW50OwogICAgaWYgKG92ZXJyaWRlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBTb2NrZXQuX2Nvbm5lY3QoaG9zdCwgcG9ydCwKICAgICAgICAgIHNvdXJjZUFkZHJlc3M6IHNvdXJjZUFkZHJlc3MsIHRpbWVvdXQ6IHRpbWVvdXQpOwogICAgfQogICAgcmV0dXJuIG92ZXJyaWRlcy5zb2NrZXRDb25uZWN0KGhvc3QsIHBvcnQsCiAgICAgICAgc291cmNlQWRkcmVzczogc291cmNlQWRkcmVzcywgdGltZW91dDogdGltZW91dCk7CiAgfQoKICAvLy8gTGlrZSBbY29ubmVjdF0sIGJ1dCByZXR1cm5zIGEgW0Z1dHVyZV0gdGhhdCBjb21wbGV0ZXMgd2l0aCBhCiAgLy8vIFtDb25uZWN0aW9uVGFza10gdGhhdCBjYW4gYmUgY2FuY2VsbGVkIGlmIHRoZSBbU29ja2V0XSBpcyBubwogIC8vLyBsb25nZXIgbmVlZGVkLgogIHN0YXRpYyBGdXR1cmU8Q29ubmVjdGlvblRhc2s8U29ja2V0Pj4gc3RhcnRDb25uZWN0KGhvc3QsIGludCBwb3J0LAogICAgICB7c291cmNlQWRkcmVzc30pIHsKICAgIGZpbmFsIElPT3ZlcnJpZGVzIG92ZXJyaWRlcyA9IElPT3ZlcnJpZGVzLmN1cnJlbnQ7CiAgICBpZiAob3ZlcnJpZGVzID09IG51bGwpIHsKICAgICAgcmV0dXJuIFNvY2tldC5fc3RhcnRDb25uZWN0KGhvc3QsIHBvcnQsIHNvdXJjZUFkZHJlc3M6IHNvdXJjZUFkZHJlc3MpOwogICAgfQogICAgcmV0dXJuIG92ZXJyaWRlcy5zb2NrZXRTdGFydENvbm5lY3QoaG9zdCwgcG9ydCwKICAgICAgICBzb3VyY2VBZGRyZXNzOiBzb3VyY2VBZGRyZXNzKTsKICB9CgogIGV4dGVybmFsIHN0YXRpYyBGdXR1cmU8U29ja2V0PiBfY29ubmVjdChob3N0LCBpbnQgcG9ydCwKICAgICAge3NvdXJjZUFkZHJlc3MsIER1cmF0aW9uIHRpbWVvdXR9KTsKCiAgZXh0ZXJuYWwgc3RhdGljIEZ1dHVyZTxDb25uZWN0aW9uVGFzazxTb2NrZXQ+PiBfc3RhcnRDb25uZWN0KGhvc3QsIGludCBwb3J0LAogICAgICB7c291cmNlQWRkcmVzc30pOwoKICAvKioKICAgKiBEZXN0cm95IHRoZSBzb2NrZXQgaW4gYm90aCBkaXJlY3Rpb25zLiBDYWxsaW5nIFtkZXN0cm95XSB3aWxsIG1ha2UgdGhlCiAgICogc2VuZCBhIGNsb3NlIGV2ZW50IG9uIHRoZSBzdHJlYW0gYW5kIHdpbGwgbm8gbG9uZ2VyIHJlYWN0IG9uIGRhdGEgYmVpbmcKICAgKiBwaXBlZCB0byBpdC4KICAgKgogICAqIENhbGwgW2Nsb3NlXShpbmhlcml0ZWQgZnJvbSBbSU9TaW5rXSkgdG8gb25seSBjbG9zZSB0aGUgW1NvY2tldF0KICAgKiBmb3Igc2VuZGluZyBkYXRhLgogICAqLwogIHZvaWQgZGVzdHJveSgpOwoKICAvKioKICAgKiBVc2UgW3NldE9wdGlvbl0gdG8gY3VzdG9taXplIHRoZSBbUmF3U29ja2V0XS4gU2VlIFtTb2NrZXRPcHRpb25dIGZvcgogICAqIGF2YWlsYWJsZSBvcHRpb25zLgogICAqCiAgICogUmV0dXJucyBbOnRydWU6XSBpZiB0aGUgb3B0aW9uIHdhcyBzZXQgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBvdGhlcndpc2UuCiAgICovCiAgYm9vbCBzZXRPcHRpb24oU29ja2V0T3B0aW9uIG9wdGlvbiwgYm9vbCBlbmFibGVkKTsKCiAgLyoqCiAgICogVXNlIFtnZXRSYXdPcHRpb25dIHRvIGdldCBsb3cgbGV2ZWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFtSYXdTb2NrZXRdLiBTZWUKICAgKiBbUmF3U29ja2V0T3B0aW9uXSBmb3IgYXZhaWxhYmxlIG9wdGlvbnMuCiAgICoKICAgKiBSZXR1cm5zIHRoZSBbUmF3U29ja2V0T3B0aW9uLnZhbHVlXSBvbiBzdWNjZXNzLgogICAqCiAgICogVGhyb3dzIGFuIFtPU0Vycm9yXSBvbiBmYWlsdXJlLgogICAqLwogIFVpbnQ4TGlzdCBnZXRSYXdPcHRpb24oUmF3U29ja2V0T3B0aW9uIG9wdGlvbik7CgogIC8qKgogICAqIFVzZSBbc2V0UmF3T3B0aW9uXSB0byBjdXN0b21pemUgdGhlIFtSYXdTb2NrZXRdLiBTZWUgW1Jhd1NvY2tldE9wdGlvbl0gZm9yCiAgICogYXZhaWxhYmxlIG9wdGlvbnMuCiAgICoKICAgKiBUaHJvd3MgYW4gW09TRXJyb3JdIG9uIGZhaWx1cmUuCiAgICovCiAgdm9pZCBzZXRSYXdPcHRpb24oUmF3U29ja2V0T3B0aW9uIG9wdGlvbik7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHBvcnQgdXNlZCBieSB0aGlzIHNvY2tldC4KICAgKi8KICBpbnQgZ2V0IHBvcnQ7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHJlbW90ZSBwb3J0IGNvbm5lY3RlZCB0byBieSB0aGlzIHNvY2tldC4KICAgKi8KICBpbnQgZ2V0IHJlbW90ZVBvcnQ7CgogIC8qKgogICAqIFJldHVybnMgdGhlIFtJbnRlcm5ldEFkZHJlc3NdIHVzZWQgdG8gY29ubmVjdCB0aGlzIHNvY2tldC4KICAgKi8KICBJbnRlcm5ldEFkZHJlc3MgZ2V0IGFkZHJlc3M7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHJlbW90ZSBbSW50ZXJuZXRBZGRyZXNzXSBjb25uZWN0ZWQgdG8gYnkgdGhpcyBzb2NrZXQuCiAgICovCiAgSW50ZXJuZXRBZGRyZXNzIGdldCByZW1vdGVBZGRyZXNzOwoKICBGdXR1cmUgY2xvc2UoKTsKCiAgRnV0dXJlIGdldCBkb25lOwp9CgovKioKICogRGF0YWdyYW0gcGFja2FnZS4gRGF0YSBzZW5kIHRvIGFuZCByZWNlaXZlZCBmcm9tIGRhdGFncmFtIHNvY2tldHMKICogY29udGFpbnMgdGhlIGludGVybmV0IGFkZHJlc3MgYW5kIHBvcnQgb2YgdGhlIGRlc3RpbmF0aW9uIG9yIHNvdXJjZQogKiB0b2dldGVyIHdpdGggdGhlIGRhdGEuCiAqLwpjbGFzcyBEYXRhZ3JhbSB7CiAgTGlzdDxpbnQ+IGRhdGE7CiAgSW50ZXJuZXRBZGRyZXNzIGFkZHJlc3M7CiAgaW50IHBvcnQ7CgogIERhdGFncmFtKHRoaXMuZGF0YSwgdGhpcy5hZGRyZXNzLCB0aGlzLnBvcnQpOwp9CgovKioKICogVGhlIFtSYXdEYXRhZ3JhbVNvY2tldF0gaXMgYSBsb3ctbGV2ZWwgaW50ZXJmYWNlIHRvIGFuIFVEUCBzb2NrZXQsCiAqIGV4cG9zaW5nIHRoZSByYXcgZXZlbnRzIHNpZ25hbGVkIGJ5IHRoZSBzeXN0ZW0uIEl0J3MgYSBbU3RyZWFtXSBvZgogKiBbUmF3U29ja2V0RXZlbnRdcy4KICoKICogTm90ZSB0aGF0IHRoZSBldmVudCBbUmF3U29ja2V0RXZlbnQucmVhZENsb3NlZF0gd2lsbCBuZXZlciBiZQogKiByZWNlaXZlZCBhcyBhbiBVRFAgc29ja2V0IGNhbm5vdCBiZSBjbG9zZWQgYnkgYSByZW1vdGUgcGVlci4KICovCmFic3RyYWN0IGNsYXNzIFJhd0RhdGFncmFtU29ja2V0IGV4dGVuZHMgU3RyZWFtPFJhd1NvY2tldEV2ZW50PiB7CiAgLyoqCiAgICogU2V0IG9yIGdldCwgaWYgdGhlIFtSYXdEYXRhZ3JhbVNvY2tldF0gc2hvdWxkIGxpc3RlbiBmb3IKICAgKiBbUmF3U29ja2V0RXZlbnQucmVhZF0gZXZlbnRzLiBEZWZhdWx0IGlzIFs6dHJ1ZTpdLgogICAqLwogIGJvb2wgcmVhZEV2ZW50c0VuYWJsZWQ7CgogIC8qKgogICAqIFNldCBvciBnZXQsIGlmIHRoZSBbUmF3RGF0YWdyYW1Tb2NrZXRdIHNob3VsZCBsaXN0ZW4gZm9yCiAgICogW1Jhd1NvY2tldEV2ZW50LndyaXRlXSBldmVudHMuIERlZmF1bHQgaXMgWzp0cnVlOl0uICBUaGlzIGlzIGEKICAgKiBvbmUtc2hvdCBsaXN0ZW5lciwgYW5kIHdyaXRlRXZlbnRzRW5hYmxlZCBtdXN0IGJlIHNldCB0byB0cnVlCiAgICogYWdhaW4gdG8gcmVjZWl2ZSBhbm90aGVyIHdyaXRlIGV2ZW50LgogICAqLwogIGJvb2wgd3JpdGVFdmVudHNFbmFibGVkOwoKICAvKioKICAgKiBTZXQgb3IgZ2V0LCB3aGV0aGVyIG11bHRpY2FzdCB0cmFmZmljIGlzIGxvb3BlZCBiYWNrIHRvIHRoZSBob3N0LgogICAqCiAgICogQnkgZGVmYXVsdCBtdWx0aWNhc3QgbG9vcGJhY2sgaXMgZW5hYmxlZC4KICAgKi8KICBib29sIG11bHRpY2FzdExvb3BiYWNrOwoKICAvKioKICAgKiBTZXQgb3IgZ2V0LCB0aGUgbWF4aW11bSBuZXR3b3JrIGhvcHMgZm9yIG11bHRpY2FzdCBwYWNrYWdlcwogICAqIG9yaWdpbmF0aW5nIGZyb20gdGhpcyBzb2NrZXQuCiAgICoKICAgKiBGb3IgSVB2NCB0aGlzIGlzIHJlZmVycmVkIHRvIGFzIFRUTCAodGltZSB0byBsaXZlKS4KICAgKgogICAqIEJ5IGRlZmF1bHQgdGhpcyB2YWx1ZSBpcyAxIGNhdXNpbmcgbXVsdGljYXN0IHRyYWZmaWMgdG8gc3RheSBvbgogICAqIHRoZSBsb2NhbCBuZXR3b3JrLgogICAqLwogIGludCBtdWx0aWNhc3RIb3BzOwoKICAvKioKICAgKiBTZXQgb3IgZ2V0LCB0aGUgbmV0d29yayBpbnRlcmZhY2UgdXNlZCBmb3Igb3V0Z29pbmcgbXVsdGljYXN0IHBhY2thZ2VzLgogICAqCiAgICogQSB2YWx1ZSBvZiBgbnVsbGBpbmRpY2F0ZSB0aGF0IHRoZSBzeXN0ZW0gY2hvb3NlcyB0aGUgbmV0d29yawogICAqIGludGVyZmFjZSB0byB1c2UuCiAgICoKICAgKiBCeSBkZWZhdWx0IHRoaXMgdmFsdWUgaXMgYG51bGxgCiAgICovCiAgQERlcHJlY2F0ZWQoIlRoaXMgcHJvcGVydHkgaXMgbm90IGltcGxlbWVudGVkLiBVc2UgZ2V0UmF3T3B0aW9uIGFuZCAiCiAgICAgICJzZXRSYXdPcHRpb24gaW5zdGVhZC4iKQogIE5ldHdvcmtJbnRlcmZhY2UgbXVsdGljYXN0SW50ZXJmYWNlOwoKICAvKioKICAgKiBTZXQgb3IgZ2V0LCB3aGV0aGVyIElQdjQgYnJvYWRjYXN0IGlzIGVuYWJsZWQuCiAgICoKICAgKiBJUHY0IGJyb2FkY2FzdCBuZWVkcyB0byBiZSBlbmFibGVkIGJ5IHRoZSBzZW5kZXIgZm9yIHNlbmRpbmcgSVB2NAogICAqIGJyb2FkY2FzdCBwYWNrYWdlcy4gQnkgZGVmYXVsdCBJUHY0IGJyb2FkY2FzdCBpcyBkaXNhYmxlZC4KICAgKgogICAqIEZvciBJUHY2IHRoZXJlIGlzIG5vIGdlbmVyYWwgYnJvYWRjYXN0IG1lY2hhbmlzbS4gVXNlIG11bHRpY2FzdAogICAqIGluc3RlYWQuCiAgICovCiAgYm9vbCBicm9hZGNhc3RFbmFibGVkOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IHJhdyBkYXRhZ3JhbSBzb2NrZXQgYmluZGluZyBpdCB0byBhbiBhZGRyZXNzIGFuZAogICAqIHBvcnQuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIEZ1dHVyZTxSYXdEYXRhZ3JhbVNvY2tldD4gYmluZChob3N0LCBpbnQgcG9ydCwKICAgICAge2Jvb2wgcmV1c2VBZGRyZXNzOiB0cnVlLCBib29sIHJldXNlUG9ydDogZmFsc2UsIGludCB0dGw6IDF9KTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcG9ydCB1c2VkIGJ5IHRoaXMgc29ja2V0LgogICAqLwogIGludCBnZXQgcG9ydDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgYWRkcmVzcyB1c2VkIGJ5IHRoaXMgc29ja2V0LgogICAqLwogIEludGVybmV0QWRkcmVzcyBnZXQgYWRkcmVzczsKCiAgLyoqCiAgICogQ2xvc2UgdGhlIGRhdGFncmFtIHNvY2tldC4KICAgKi8KICB2b2lkIGNsb3NlKCk7CgogIC8qKgogICAqIFNlbmQgYSBkYXRhZ3JhbS4KICAgKgogICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLiBUaGlzIHdpbGwgYWx3YXlzIGJlIGVpdGhlcgogICAqIHRoZSBzaXplIG9mIFtidWZmZXJdIG9yIGAwYC4KICAgKi8KICBpbnQgc2VuZChMaXN0PGludD4gYnVmZmVyLCBJbnRlcm5ldEFkZHJlc3MgYWRkcmVzcywgaW50IHBvcnQpOwoKICAvKioKICAgKiBSZWNlaXZlIGEgZGF0YWdyYW0uIElmIHRoZXJlIGFyZSBubyBkYXRhZ3JhbXMgYXZhaWxhYmxlIGBudWxsYCBpcwogICAqIHJldHVybmVkLgogICAqCiAgICogVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBkYXRhZ3JhbSB0aGF0IGNhbiBiZSByZWNlaXZlZCBpcyA2NTUwMyBieXRlcy4KICAgKi8KICBEYXRhZ3JhbSByZWNlaXZlKCk7CgogIC8qKgogICAqIEpvaW4gYSBtdWx0aWNhc3QgZ3JvdXAuCiAgICoKICAgKiBJZiBhbiBlcnJvciBvY2N1ciB3aGVuIHRyeWluZyB0byBqb2luIHRoZSBtdWx0aWNhc3QgZ3JvdXAgYW4KICAgKiBleGNlcHRpb24gaXMgdGhyb3duLgogICAqLwogIHZvaWQgam9pbk11bHRpY2FzdChJbnRlcm5ldEFkZHJlc3MgZ3JvdXAsIFtOZXR3b3JrSW50ZXJmYWNlIGludGVyZmFjZV0pOwoKICAvKioKICAgKiBMZWF2ZSBhIG11bHRpY2FzdCBncm91cC4KICAgKgogICAqIElmIGFuIGVycm9yIG9jY3VyIHdoZW4gdHJ5aW5nIHRvIGpvaW4gdGhlIG11bHRpY2FzZSBncm91cCBhbgogICAqIGV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICovCiAgdm9pZCBsZWF2ZU11bHRpY2FzdChJbnRlcm5ldEFkZHJlc3MgZ3JvdXAsIFtOZXR3b3JrSW50ZXJmYWNlIGludGVyZmFjZV0pOwoKICAvKioKICAgKiBVc2UgW2dldFJhd09wdGlvbl0gdG8gZ2V0IGxvdyBsZXZlbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgW1Jhd1NvY2tldF0uIFNlZQogICAqIFtSYXdTb2NrZXRPcHRpb25dIGZvciBhdmFpbGFibGUgb3B0aW9ucy4KICAgKgogICAqIFJldHVybnMgW1Jhd1NvY2tldE9wdGlvbi52YWx1ZV0gb24gc3VjY2Vzcy4KICAgKgogICAqIFRocm93cyBhbiBbT1NFcnJvcl0gb24gZmFpbHVyZS4KICAgKi8KICBVaW50OExpc3QgZ2V0UmF3T3B0aW9uKFJhd1NvY2tldE9wdGlvbiBvcHRpb24pOwoKICAvKioKICAgKiBVc2UgW3NldFJhd09wdGlvbl0gdG8gY3VzdG9taXplIHRoZSBbUmF3U29ja2V0XS4gU2VlIFtSYXdTb2NrZXRPcHRpb25dIGZvcgogICAqIGF2YWlsYWJsZSBvcHRpb25zLgogICAqCiAgICogVGhyb3dzIGFuIFtPU0Vycm9yXSBvbiBmYWlsdXJlLgogICAqLwogIHZvaWQgc2V0UmF3T3B0aW9uKFJhd1NvY2tldE9wdGlvbiBvcHRpb24pOwp9CgpjbGFzcyBTb2NrZXRFeGNlcHRpb24gaW1wbGVtZW50cyBJT0V4Y2VwdGlvbiB7CiAgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CiAgZmluYWwgT1NFcnJvciBvc0Vycm9yOwogIGZpbmFsIEludGVybmV0QWRkcmVzcyBhZGRyZXNzOwogIGZpbmFsIGludCBwb3J0OwoKICBjb25zdCBTb2NrZXRFeGNlcHRpb24odGhpcy5tZXNzYWdlLCB7dGhpcy5vc0Vycm9yLCB0aGlzLmFkZHJlc3MsIHRoaXMucG9ydH0pOwogIGNvbnN0IFNvY2tldEV4Y2VwdGlvbi5jbG9zZWQoKQogICAgICA6IG1lc3NhZ2UgPSAnU29ja2V0IGhhcyBiZWVuIGNsb3NlZCcsCiAgICAgICAgb3NFcnJvciA9IG51bGwsCiAgICAgICAgYWRkcmVzcyA9IG51bGwsCiAgICAgICAgcG9ydCA9IG51bGw7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCJTb2NrZXRFeGNlcHRpb24iKTsKICAgIGlmIChtZXNzYWdlLmlzTm90RW1wdHkpIHsKICAgICAgc2Iud3JpdGUoIjogJG1lc3NhZ2UiKTsKICAgICAgaWYgKG9zRXJyb3IgIT0gbnVsbCkgewogICAgICAgIHNiLndyaXRlKCIgKCRvc0Vycm9yKSIpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKG9zRXJyb3IgIT0gbnVsbCkgewogICAgICBzYi53cml0ZSgiOiAkb3NFcnJvciIpOwogICAgfQogICAgaWYgKGFkZHJlc3MgIT0gbnVsbCkgewogICAgICBzYi53cml0ZSgiLCBhZGRyZXNzID0gJHthZGRyZXNzLmhvc3R9Iik7CiAgICB9CiAgICBpZiAocG9ydCAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCIsIHBvcnQgPSAkcG9ydCIpOwogICAgfQogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CoPrAE5OPAERAQRGPgQcSkpKASIxIjEhLgEUASwBMSEhNQQBBjYGFBYPFg4XDhcPPAYEATUCAQQYA0NGHEFECQQhBkdGBj0qNgEGR0YGPSo2AQZCOgYzJTEBBkI6BjMlMQEGRQYgAQZHOyEGFgEGPkMGEwEGS01BBhwBBkIGFwEGQwYYAQZABhgBBj0FN0UoBjQBBkM/BiUBBjREQkJFRhcGRDwBBjUFSioGNS0CAQROSw4EIgYtBhMBBi4GEQEGPxkGJwEGIgUxBioBBi8FSCoFTFAFN0U7BjckJDsCAQRFRCEDIgQ+BkFFLQUyQEdEPSc7Pj9HBUJCQRUFOkQgBUdGRxEFUVFMUUwyBkJBAQYrBhABBi4GHwEGRi0GIwIBBEJDFQMfBDgGPkUtBTJAR0Q9Jzs+P0cFQkJBFQVHQRQFR0ZHEQVOUU9LSTIGP0EBBisGEAEGLgYfAQZGLQYgAgEERkYEGEVCQgElMiIsIiwBEAEoAgEER0oLBBUGTU8iBSgGQig2AUhIRkQBEAElAgEvGRMTGBUaFBQCAU5ODARSTBAYQgY3Bk8qBkwkBk1BBkoOPgFJRhkRBikvHzEEAUlJRQEuBhAoJiYlJRMBIBQBUAZNUEwmGQEqIDsBKh47ASkrQAEsHj0BKytCASsdPAErHTwBMAIBBB8EF0BBRkIBIisjLSg4JC8BFAEnFhMdHiMeDwQCAUxLGks6Bk1PGiMBQSAiHiMBJgZAHxIRBAIBBEpIBD0GTCIGGgEGTSJFMwYbAQZRTS4FTUlBUA8FQ0xMIAVQUEpKMgY8KgFDRhVRGAEGShIGEwEGPkZERxIGHQEGTUxKHgVPIQY4AQYrBhABBjoGFgEGQAYfAQZHBiUBBk00BTNOKgYdAQZLS044BiwBBkoYBUsGNQEGUC4FNQUlBjIBBlAYBSUGLQIBBDsDTDIEPQZRSi4FTUlBUA8FQ0xMIAVQUEpKMgYwKzcdKTsGLzkEAUNDFUUZNx1NBjQnBAE6KgFPGAEGTE0SBUYXBhIBBkoYBUsGNQEGUC4FNQUlBjIBBlAYBSUGLQEGKwYQAQY6BhYBBkAGHwEGRwYlARIBEwIBBEVHGgQREhsMATACAQRGRhYDQUAEQgY+OAYaAQY+REMrBhsBBkcFLwYaAQZBIwU5BUUYBhUBBk0FQxcFJQZIHycBBjQFR0AFRQ4GGQEGRAsGQUUBBisGEAEGLgYfAQYgBhABBhYFRSIGQQEGRw8FTQYWAQYdBUIaBksBBh4FQhoGTAEGUC4FMQUlBjIBBlAYBSUGLQIBLxgZIRIBUCEsGBgVARYqIR4eHSEIIh4GGy8GGCIGGgQCARNkYXJ0OmlvL3NvY2tldC5kYXJ0KW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9zdGRpby5kYXJ0uD4vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmlvOwoKY29uc3QgaW50IF9zdGRpb0hhbmRsZVR5cGVUZXJtaW5hbCA9IDA7CmNvbnN0IGludCBfc3RkaW9IYW5kbGVUeXBlUGlwZSA9IDE7CmNvbnN0IGludCBfc3RkaW9IYW5kbGVUeXBlRmlsZSA9IDI7CmNvbnN0IGludCBfc3RkaW9IYW5kbGVUeXBlU29ja2V0ID0gMzsKY29uc3QgaW50IF9zdGRpb0hhbmRsZVR5cGVPdGhlciA9IDQ7CgpjbGFzcyBfU3RkU3RyZWFtIGV4dGVuZHMgU3RyZWFtPExpc3Q8aW50Pj4gewogIGZpbmFsIFN0cmVhbTxMaXN0PGludD4+IF9zdHJlYW07CgogIF9TdGRTdHJlYW0odGhpcy5fc3RyZWFtKTsKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPExpc3Q8aW50Pj4gbGlzdGVuKHZvaWQgb25EYXRhKExpc3Q8aW50PiBldmVudCksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICByZXR1cm4gX3N0cmVhbS5saXN0ZW4ob25EYXRhLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsIG9uRG9uZTogb25Eb25lLCBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKTsKICB9Cn0KCi8qKgogKiBbU3RkaW5dIGFsbG93cyBib3RoIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgcmVhZHMgZnJvbSB0aGUgc3RhbmRhcmQKICogaW5wdXQgc3RyZWFtLgogKgogKiBNaXhpbmcgc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyByZWFkcyBpcyB1bmRlZmluZWQuCiAqLwpjbGFzcyBTdGRpbiBleHRlbmRzIF9TdGRTdHJlYW0gaW1wbGVtZW50cyBTdHJlYW08TGlzdDxpbnQ+PiB7CiAgaW50IF9mZDsKCiAgU3RkaW4uXyhTdHJlYW08TGlzdDxpbnQ+PiBzdHJlYW0sIHRoaXMuX2ZkKSA6IHN1cGVyKHN0cmVhbSk7CgogIC8qKgogICAqIFJlYWQgYSBsaW5lIGZyb20gc3RkaW4uCiAgICoKICAgKiBCbG9ja3MgdW50aWwgYSBmdWxsIGxpbmUgaXMgYXZhaWxhYmxlLgogICAqCiAgICogTGluZXMgbXkgYmUgdGVybWluYXRlZCBieSBlaXRoZXIgYDxDUj48TEY+YCBvciBgPExGPmAuIE9uIFdpbmRvd3MgaW4gY2FzZXMKICAgKiB3aGVyZSB0aGUgW3N0ZGlvVHlwZV0gb2Ygc3RkaW4gaXMgW1N0ZGlvVHlwZS50ZXJtaW1hbF0gdGhlIHRlcm1pbmF0b3IgbWF5CiAgICogYWxzbyBiZSBhIHNpbmdsZSBgPENSPmAuCiAgICoKICAgKiBJbnB1dCBieXRlcyBhcmUgY29udmVydGVkIHRvIGEgc3RyaW5nIGJ5IFtlbmNvZGluZ10uCiAgICogSWYgW2VuY29kaW5nXSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBbc3lzdGVtRW5jb2RpbmddLgogICAqCiAgICogSWYgW3JldGFpbk5ld2xpbmVzXSBpcyBgZmFsc2VgLCB0aGUgcmV0dXJuZWQgU3RyaW5nIHdpbGwgbm90IGluY2x1ZGUgdGhlCiAgICogZmluYWwgbGluZSB0ZXJtaW5hdG9yLiBJZiBgdHJ1ZWAsIHRoZSByZXR1cm5lZCBTdHJpbmcgd2lsbCBpbmNsdWRlIHRoZSBsaW5lCiAgICogdGVybWluYXRvci4gRGVmYXVsdCBpcyBgZmFsc2VgLgogICAqCiAgICogSWYgZW5kLW9mLWZpbGUgaXMgcmVhY2hlZCBhZnRlciBhbnkgYnl0ZXMgaGF2ZSBiZWVuIHJlYWQgZnJvbSBzdGRpbiwKICAgKiB0aGF0IGRhdGEgaXMgcmV0dXJuZWQgd2l0aG91dCBhIGxpbmUgdGVybWluYXRvci4KICAgKiBSZXR1cm5zIGBudWxsYCBpZiBubyBieXRlcyBwcmVjZWRlZCB0aGUgZW5kIG9mIGlucHV0LgogICAqLwogIFN0cmluZyByZWFkTGluZVN5bmMoCiAgICAgIHtFbmNvZGluZyBlbmNvZGluZzogc3lzdGVtRW5jb2RpbmcsIGJvb2wgcmV0YWluTmV3bGluZXM6IGZhbHNlfSkgewogICAgY29uc3QgQ1IgPSAxMzsKICAgIGNvbnN0IExGID0gMTA7CiAgICBmaW5hbCBMaXN0PGludD4gbGluZSA9IDxpbnQ+W107CiAgICAvLyBPbiBXaW5kb3dzLCBpZiBsaW5lTW9kZSBpcyBkaXNhYmxlZCwgb25seSBDUiBpcyByZWNlaXZlZC4KICAgIGJvb2wgY3JJc05ld2xpbmUgPSBQbGF0Zm9ybS5pc1dpbmRvd3MgJiYKICAgICAgICAoc3RkaW9UeXBlKHN0ZGluKSA9PSBTdGRpb1R5cGUudGVybWluYWwpICYmCiAgICAgICAgIWxpbmVNb2RlOwogICAgaWYgKHJldGFpbk5ld2xpbmVzKSB7CiAgICAgIGludCBieXRlOwogICAgICBkbyB7CiAgICAgICAgYnl0ZSA9IHJlYWRCeXRlU3luYygpOwogICAgICAgIGlmIChieXRlIDwgMCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGxpbmUuYWRkKGJ5dGUpOwogICAgICB9IHdoaWxlIChieXRlICE9IExGICYmICEoYnl0ZSA9PSBDUiAmJiBjcklzTmV3bGluZSkpOwogICAgICBpZiAobGluZS5pc0VtcHR5KSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY3JJc05ld2xpbmUpIHsKICAgICAgLy8gQ1IgYW5kIExGIGFyZSBib3RoIGxpbmUgdGVybWluYXRvcnMsIG5laXRoZXIgaXMgcmV0YWluZWQuCiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgaW50IGJ5dGUgPSByZWFkQnl0ZVN5bmMoKTsKICAgICAgICBpZiAoYnl0ZSA8IDApIHsKICAgICAgICAgIGlmIChsaW5lLmlzRW1wdHkpIHJldHVybiBudWxsOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChieXRlID09IExGIHx8IGJ5dGUgPT0gQ1IpIGJyZWFrOwogICAgICAgIGxpbmUuYWRkKGJ5dGUpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBDYXNlIGhhdmluZyB0byBoYW5kbGUgQ1IgTEYgYXMgYSBzaW5nbGUgdW5yZXRhaW5lZCBsaW5lIHRlcm1pbmF0b3IuCiAgICAgIG91dGVyOgogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIGludCBieXRlID0gcmVhZEJ5dGVTeW5jKCk7CiAgICAgICAgaWYgKGJ5dGUgPT0gTEYpIGJyZWFrOwogICAgICAgIGlmIChieXRlID09IENSKSB7CiAgICAgICAgICBkbyB7CiAgICAgICAgICAgIGJ5dGUgPSByZWFkQnl0ZVN5bmMoKTsKICAgICAgICAgICAgaWYgKGJ5dGUgPT0gTEYpIGJyZWFrIG91dGVyOwoKICAgICAgICAgICAgbGluZS5hZGQoQ1IpOwogICAgICAgICAgfSB3aGlsZSAoYnl0ZSA9PSBDUik7CiAgICAgICAgICAvLyBGYWxsIHRocm91Z2ggYW5kIGhhbmRsZSBub24tQ1IgY2hhcmFjdGVyLgogICAgICAgIH0KICAgICAgICBpZiAoYnl0ZSA8IDApIHsKICAgICAgICAgIGlmIChsaW5lLmlzRW1wdHkpIHJldHVybiBudWxsOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGxpbmUuYWRkKGJ5dGUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZW5jb2RpbmcuZGVjb2RlKGxpbmUpOwogIH0KCiAgLyoqCiAgICogQ2hlY2sgaWYgZWNobyBtb2RlIGlzIGVuYWJsZWQgb24gW3N0ZGluXS4KICAgKi8KICBleHRlcm5hbCBib29sIGdldCBlY2hvTW9kZTsKCiAgLyoqCiAgICogRW5hYmxlIG9yIGRpc2FibGUgZWNobyBtb2RlIG9uIFtzdGRpbl0uCiAgICoKICAgKiBJZiBkaXNhYmxlZCwgaW5wdXQgZnJvbSB0byBjb25zb2xlIHdpbGwgbm90IGJlIGVjaG9lZC4KICAgKgogICAqIERlZmF1bHQgZGVwZW5kcyBvbiB0aGUgcGFyZW50IHByb2Nlc3MsIGJ1dCB1c3VhbGx5IGVuYWJsZWQuCiAgICoKICAgKiBPbiBXaW5kb3dzIHRoaXMgbW9kZSBjYW4gb25seSBiZSBlbmFibGVkIGlmIFtsaW5lTW9kZV0gaXMgZW5hYmxlZCBhcyB3ZWxsLgogICAqLwogIGV4dGVybmFsIHZvaWQgc2V0IGVjaG9Nb2RlKGJvb2wgZW5hYmxlZCk7CgogIC8qKgogICAqIENoZWNrIGlmIGxpbmUgbW9kZSBpcyBlbmFibGVkIG9uIFtzdGRpbl0uCiAgICovCiAgZXh0ZXJuYWwgYm9vbCBnZXQgbGluZU1vZGU7CgogIC8qKgogICAqIEVuYWJsZSBvciBkaXNhYmxlIGxpbmUgbW9kZSBvbiBbc3RkaW5dLgogICAqCiAgICogSWYgZW5hYmxlZCwgY2hhcmFjdGVycyBhcmUgZGVsYXllZCB1bnRpbCBhIG5ldy1saW5lIGNoYXJhY3RlciBpcyBlbnRlcmVkLgogICAqIElmIGRpc2FibGVkLCBjaGFyYWN0ZXJzIHdpbGwgYmUgYXZhaWxhYmxlIGFzIHR5cGVkLgogICAqCiAgICogRGVmYXVsdCBkZXBlbmRzIG9uIHRoZSBwYXJlbnQgcHJvY2VzcywgYnV0IHVzdWFsbHkgZW5hYmxlZC4KICAgKgogICAqIE9uIFdpbmRvd3MgdGhpcyBtb2RlIGNhbiBvbmx5IGJlIGRpc2FibGVkIGlmIFtlY2hvTW9kZV0gaXMgZGlzYWJsZWQgYXMgd2VsbC4KICAgKi8KICBleHRlcm5hbCB2b2lkIHNldCBsaW5lTW9kZShib29sIGVuYWJsZWQpOwoKICAvKioKICAgICogV2hldGhlciBjb25uZWN0ZWQgdG8gYSB0ZXJtaW5hbCB0aGF0IHN1cHBvcnRzIEFOU0kgZXNjYXBlIHNlcXVlbmNlcy4KICAgICoKICAgICogTm90IGFsbCB0ZXJtaW5hbHMgYXJlIHJlY29nbml6ZWQsIGFuZCBub3QgYWxsIHJlY29nbml6ZWQgdGVybWluYWxzIGNhbgogICAgKiByZXBvcnQgd2hldGhlciB0aGV5IHN1cHBvcnQgQU5TSSBlc2NhcGUgc2VxdWVuY2VzLCBzbyB0aGlzIHZhbHVlIGlzIGEKICAgICogYmVzdC1lZmZvcnQgYXR0ZW1wdCBhdCBkZXRlY3RpbmcgdGhlIHN1cHBvcnQuCiAgICAqCiAgICAqIFRoZSBhY3R1YWwgZXNjYXBlIHNlcXVlbmNlIHN1cHBvcnQgbWF5IGRpZmZlciBiZXR3ZWVuIHRlcm1pbmFscywKICAgICogd2l0aCBzb21lIHRlcm1pbmFscyBzdXBwb3J0aW5nIG1vcmUgZXNjYXBlIHNlcXVlbmNlcyB0aGFuIG90aGVycywKICAgICogYW5kIHNvbWUgdGVybWluYWxzIGV2ZW4gZGlmZmVyaW5nIGluIGJlaGF2aW9yIGZvciB0aGUgc2FtZSBlc2NhcGUKICAgICogc2VxdWVuY2UuCiAgICAqCiAgICAqIFRoZSBBTlNJIGNvbG9yIHNlbGVjdGlvbiBpcyBnZW5lcmFsbHkgc3VwcG9ydGVkLgogICAgKgogICAgKiBDdXJyZW50bHksIGEgYFRFUk1gIGVudmlyb25tZW50IHZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIHN0cmluZyBgeHRlcm1gCiAgICAqIHdpbGwgYmUgdGFrZW4gYXMgZXZpZGVuY2UgdGhhdCBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIHN1cHBvcnRlZC4KICAgICogT24gV2luZG93cywgb25seSB2ZXJzaW9ucyBvZiBXaW5kb3dzIDEwIGFmdGVyIHYuMTUxMQogICAgKiAoIlRIMiIsIE9TIGJ1aWxkIDEwNTg2KSB3aWxsIGJlIGRldGVjdGVkIGFzIHN1cHBvcnRpbmcgdGhlIG91dHB1dCBvZgogICAgKiBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMsIGFuZCBvbmx5IHZlcnNpb25zIGFmdGVyIHYuMTYwNyAoIkFubml2ZXJzYXJ5CiAgICAqIFVwZGF0ZSIsIE9TIGJ1aWxkIDE0MzkzKSB3aWxsIGJlIGRldGVjdGVkIGFzIHN1cHBvcnRpbmcgdGhlIGlucHV0IG9mCiAgICAqIEFOU0kgZXNjYXBlIHNlcXVlbmNlcy4KICAgICovCiAgZXh0ZXJuYWwgYm9vbCBnZXQgc3VwcG9ydHNBbnNpRXNjYXBlczsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSByZWFkIGEgYnl0ZSBmcm9tIHN0ZGluLiBUaGlzIGNhbGwgd2lsbCBibG9jayB1bnRpbCBhIGJ5dGUgaXMKICAgKiBhdmFpbGFibGUuCiAgICoKICAgKiBJZiBhdCBlbmQgb2YgZmlsZSwgLTEgaXMgcmV0dXJuZWQuCiAgICovCiAgZXh0ZXJuYWwgaW50IHJlYWRCeXRlU3luYygpOwoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYSB0ZXJtaW5hbCBhdHRhY2hlZCB0byBzdGRpbi4KICAgKi8KICBib29sIGdldCBoYXNUZXJtaW5hbCB7CiAgICB0cnkgewogICAgICByZXR1cm4gc3RkaW9UeXBlKHRoaXMpID09IFN0ZGlvVHlwZS50ZXJtaW5hbDsKICAgIH0gb24gRmlsZVN5c3RlbUV4Y2VwdGlvbiBjYXRjaCAoXykgewogICAgICAvLyBJZiBzdGRpb1R5cGUgdGhyb3dzIGEgRmlsZVN5c3RlbUV4Y2VwdGlvbiwgdGhlbiBpdCBpcyBub3QgaG9va2VkIHVwIHRvCiAgICAgIC8vIGEgdGVybWluYWwsIHByb2JhYmx5IGJlY2F1c2UgaXQgaXMgY2xvc2VkLCBidXQgbGV0IG90aGVyIGV4Y2VwdGlvbgogICAgICAvLyB0eXBlcyBidWJibGUgdXAuCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9Cn0KCi8qKgogKiBbU3Rkb3V0XSByZXByZXNlbnRzIHRoZSBbSU9TaW5rXSBmb3IgZWl0aGVyIGBzdGRvdXRgIG9yIGBzdGRlcnJgLgogKgogKiBJdCBwcm92aWRlcyBhICpibG9ja2luZyogYElPU2lua2AsIHNvIHVzaW5nIHRoaXMgdG8gd3JpdGUgd2lsbCBibG9jayB1bnRpbAogKiB0aGUgb3V0cHV0IGlzIHdyaXR0ZW4uCiAqCiAqIEluIHNvbWUgc2l0dWF0aW9ucyB0aGlzIGJsb2NraW5nIGJlaGF2aW9yIGlzIHVuZGVzaXJhYmxlIGFzIGl0IGRvZXMgbm90CiAqIHByb3ZpZGUgdGhlIHNhbWUgbm9uLWJsb2NraW5nIGJlaGF2aW9yIGFzIGRhcnQ6aW8gaW4gZ2VuZXJhbCBleHBvc2VzLgogKiBVc2UgdGhlIHByb3BlcnR5IFtub25CbG9ja2luZ10gdG8gZ2V0IGFuIGBJT1NpbmtgIHdoaWNoIGhhcyB0aGUgbm9uLWJsb2NraW5nCiAqIGJlaGF2aW9yLgogKgogKiBUaGlzIGNsYXNzIGNhbiBhbHNvIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBgc3Rkb3V0YCBvciBgc3RkZXJyYCBpcwogKiBjb25uZWN0ZWQgdG8gYSB0ZXJtaW5hbCBhbmQgcXVlcnkgc29tZSB0ZXJtaW5hbCBwcm9wZXJ0aWVzLgogKgogKiBUaGUgW2FkZEVycm9yXSBBUEkgaXMgaW5oZXJpdGVkIGZyb20gIFtTdHJlYW1TaW5rXSBhbmQgY2FsbGluZyBpdCB3aWxsIHJlc3VsdAogKiBpbiBhbiB1bmhhbmRsZWQgYXN5bmNocm9ub3VzIGVycm9yIHVubGVzcyB0aGVyZSBpcyBhbiBlcnJvciBoYW5kbGVyIG9uCiAqIFtkb25lXS4KICovCmNsYXNzIFN0ZG91dCBleHRlbmRzIF9TdGRTaW5rIGltcGxlbWVudHMgSU9TaW5rIHsKICBmaW5hbCBpbnQgX2ZkOwogIElPU2luayBfbm9uQmxvY2tpbmc7CgogIFN0ZG91dC5fKElPU2luayBzaW5rLCB0aGlzLl9mZCkgOiBzdXBlcihzaW5rKTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGEgdGVybWluYWwgYXR0YWNoZWQgdG8gc3Rkb3V0LgogICAqLwogIGJvb2wgZ2V0IGhhc1Rlcm1pbmFsID0+IF9oYXNUZXJtaW5hbChfZmQpOwoKICAvKioKICAgKiBHZXQgdGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIHRoZSB0ZXJtaW5hbC4KICAgKgogICAqIElmIG5vIHRlcm1pbmFsIGlzIGF0dGFjaGVkIHRvIHN0ZG91dCwgYSBbU3Rkb3V0RXhjZXB0aW9uXSBpcyB0aHJvd24uIFNlZQogICAqIFtoYXNUZXJtaW5hbF0gZm9yIG1vcmUgaW5mby4KICAgKi8KICBpbnQgZ2V0IHRlcm1pbmFsQ29sdW1ucyA9PiBfdGVybWluYWxDb2x1bW5zKF9mZCk7CgogIC8qKgogICAqIEdldCB0aGUgbnVtYmVyIG9mIGxpbmVzIG9mIHRoZSB0ZXJtaW5hbC4KICAgKgogICAqIElmIG5vIHRlcm1pbmFsIGlzIGF0dGFjaGVkIHRvIHN0ZG91dCwgYSBbU3Rkb3V0RXhjZXB0aW9uXSBpcyB0aHJvd24uIFNlZQogICAqIFtoYXNUZXJtaW5hbF0gZm9yIG1vcmUgaW5mby4KICAgKi8KICBpbnQgZ2V0IHRlcm1pbmFsTGluZXMgPT4gX3Rlcm1pbmFsTGluZXMoX2ZkKTsKCiAgLyoqCiAgICAqIFdoZXRoZXIgY29ubmVjdGVkIHRvIGEgdGVybWluYWwgdGhhdCBzdXBwb3J0cyBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMuCiAgICAqCiAgICAqIE5vdCBhbGwgdGVybWluYWxzIGFyZSByZWNvZ25pemVkLCBhbmQgbm90IGFsbCByZWNvZ25pemVkIHRlcm1pbmFscyBjYW4KICAgICogcmVwb3J0IHdoZXRoZXIgdGhleSBzdXBwb3J0IEFOU0kgZXNjYXBlIHNlcXVlbmNlcywgc28gdGhpcyB2YWx1ZSBpcyBhCiAgICAqIGJlc3QtZWZmb3J0IGF0dGVtcHQgYXQgZGV0ZWN0aW5nIHRoZSBzdXBwb3J0LgogICAgKgogICAgKiBUaGUgYWN0dWFsIGVzY2FwZSBzZXF1ZW5jZSBzdXBwb3J0IG1heSBkaWZmZXIgYmV0d2VlbiB0ZXJtaW5hbHMsCiAgICAqIHdpdGggc29tZSB0ZXJtaW5hbHMgc3VwcG9ydGluZyBtb3JlIGVzY2FwZSBzZXF1ZW5jZXMgdGhhbiBvdGhlcnMsCiAgICAqIGFuZCBzb21lIHRlcm1pbmFscyBldmVuIGRpZmZlcmluZyBpbiBiZWhhdmlvciBmb3IgdGhlIHNhbWUgZXNjYXBlCiAgICAqIHNlcXVlbmNlLgogICAgKgogICAgKiBUaGUgQU5TSSBjb2xvciBzZWxlY3Rpb24gaXMgZ2VuZXJhbGx5IHN1cHBvcnRlZC4KICAgICoKICAgICogQ3VycmVudGx5LCBhIGBURVJNYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjb250YWluaW5nIHRoZSBzdHJpbmcgYHh0ZXJtYAogICAgKiB3aWxsIGJlIHRha2VuIGFzIGV2aWRlbmNlIHRoYXQgQU5TSSBlc2NhcGUgc2VxdWVuY2VzIGFyZSBzdXBwb3J0ZWQuCiAgICAqIE9uIFdpbmRvd3MsIG9ubHkgdmVyc2lvbnMgb2YgV2luZG93cyAxMCBhZnRlciB2LjE1MTEKICAgICogKCJUSDIiLCBPUyBidWlsZCAxMDU4Nikgd2lsbCBiZSBkZXRlY3RlZCBhcyBzdXBwb3J0aW5nIHRoZSBvdXRwdXQgb2YKICAgICogQU5TSSBlc2NhcGUgc2VxdWVuY2VzLCBhbmQgb25seSB2ZXJzaW9ucyBhZnRlciB2LjE2MDcgKCJBbm5pdmVyc2FyeQogICAgKiBVcGRhdGUiLCBPUyBidWlsZCAxNDM5Mykgd2lsbCBiZSBkZXRlY3RlZCBhcyBzdXBwb3J0aW5nIHRoZSBpbnB1dCBvZgogICAgKiBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMuCiAgICAqLwogIGJvb2wgZ2V0IHN1cHBvcnRzQW5zaUVzY2FwZXMgPT4gX3N1cHBvcnRzQW5zaUVzY2FwZXMoX2ZkKTsKCiAgZXh0ZXJuYWwgYm9vbCBfaGFzVGVybWluYWwoaW50IGZkKTsKICBleHRlcm5hbCBpbnQgX3Rlcm1pbmFsQ29sdW1ucyhpbnQgZmQpOwogIGV4dGVybmFsIGludCBfdGVybWluYWxMaW5lcyhpbnQgZmQpOwogIGV4dGVybmFsIHN0YXRpYyBib29sIF9zdXBwb3J0c0Fuc2lFc2NhcGVzKGludCBmZCk7CgogIC8qKgogICAqIEdldCBhIG5vbi1ibG9ja2luZyBgSU9TaW5rYC4KICAgKi8KICBJT1NpbmsgZ2V0IG5vbkJsb2NraW5nIHsKICAgIF9ub25CbG9ja2luZyA/Pz0gbmV3IElPU2luayhuZXcgX0ZpbGVTdHJlYW1Db25zdW1lci5mcm9tU3RkaW8oX2ZkKSk7CiAgICByZXR1cm4gX25vbkJsb2NraW5nOwogIH0KfQoKY2xhc3MgU3Rkb3V0RXhjZXB0aW9uIGltcGxlbWVudHMgSU9FeGNlcHRpb24gewogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwogIGZpbmFsIE9TRXJyb3Igb3NFcnJvcjsKCiAgY29uc3QgU3Rkb3V0RXhjZXB0aW9uKHRoaXMubWVzc2FnZSwgW3RoaXMub3NFcnJvcl0pOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gIlN0ZG91dEV4Y2VwdGlvbjogJG1lc3NhZ2Uke29zRXJyb3IgPT0gbnVsbCA/ICIiIDogIiwgJG9zRXJyb3IifSI7CiAgfQp9CgpjbGFzcyBTdGRpbkV4Y2VwdGlvbiBpbXBsZW1lbnRzIElPRXhjZXB0aW9uIHsKICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKICBmaW5hbCBPU0Vycm9yIG9zRXJyb3I7CgogIGNvbnN0IFN0ZGluRXhjZXB0aW9uKHRoaXMubWVzc2FnZSwgW3RoaXMub3NFcnJvcl0pOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gIlN0ZGluRXhjZXB0aW9uOiAkbWVzc2FnZSR7b3NFcnJvciA9PSBudWxsID8gIiIgOiAiLCAkb3NFcnJvciJ9IjsKICB9Cn0KCmNsYXNzIF9TdGRDb25zdW1lciBpbXBsZW1lbnRzIFN0cmVhbUNvbnN1bWVyPExpc3Q8aW50Pj4gewogIGZpbmFsIF9maWxlOwoKICBfU3RkQ29uc3VtZXIoaW50IGZkKSA6IF9maWxlID0gX0ZpbGUuX29wZW5TdGRpb1N5bmMoZmQpOwoKICBGdXR1cmUgYWRkU3RyZWFtKFN0cmVhbTxMaXN0PGludD4+IHN0cmVhbSkgewogICAgdmFyIGNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXIoKTsKICAgIHZhciBzdWI7CiAgICBzdWIgPSBzdHJlYW0ubGlzdGVuKChkYXRhKSB7CiAgICAgIHRyeSB7CiAgICAgICAgX2ZpbGUud3JpdGVGcm9tU3luYyhkYXRhKTsKICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgIHN1Yi5jYW5jZWwoKTsKICAgICAgICBjb21wbGV0ZXIuY29tcGxldGVFcnJvcihlLCBzKTsKICAgICAgfQogICAgfSwKICAgICAgICBvbkVycm9yOiBjb21wbGV0ZXIuY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6IGNvbXBsZXRlci5jb21wbGV0ZSwKICAgICAgICBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIHJldHVybiBjb21wbGV0ZXIuZnV0dXJlOwogIH0KCiAgRnV0dXJlIGNsb3NlKCkgewogICAgX2ZpbGUuY2xvc2VTeW5jKCk7CiAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZSgpOwogIH0KfQoKY2xhc3MgX1N0ZFNpbmsgaW1wbGVtZW50cyBJT1NpbmsgewogIGZpbmFsIElPU2luayBfc2luazsKCiAgX1N0ZFNpbmsodGhpcy5fc2luayk7CgogIEVuY29kaW5nIGdldCBlbmNvZGluZyA9PiBfc2luay5lbmNvZGluZzsKICB2b2lkIHNldCBlbmNvZGluZyhFbmNvZGluZyBlbmNvZGluZykgewogICAgX3NpbmsuZW5jb2RpbmcgPSBlbmNvZGluZzsKICB9CgogIHZvaWQgd3JpdGUob2JqZWN0KSB7CiAgICBfc2luay53cml0ZShvYmplY3QpOwogIH0KCiAgdm9pZCB3cml0ZWxuKFtvYmplY3QgPSAiIl0pIHsKICAgIF9zaW5rLndyaXRlbG4ob2JqZWN0KTsKICB9CgogIHZvaWQgd3JpdGVBbGwob2JqZWN0cywgW3NlcCA9ICIiXSkgewogICAgX3Npbmsud3JpdGVBbGwob2JqZWN0cywgc2VwKTsKICB9CgogIHZvaWQgYWRkKExpc3Q8aW50PiBkYXRhKSB7CiAgICBfc2luay5hZGQoZGF0YSk7CiAgfQoKICB2b2lkIGFkZEVycm9yKGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSkgewogICAgX3NpbmsuYWRkRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgdm9pZCB3cml0ZUNoYXJDb2RlKGludCBjaGFyQ29kZSkgewogICAgX3Npbmsud3JpdGVDaGFyQ29kZShjaGFyQ29kZSk7CiAgfQoKICBGdXR1cmUgYWRkU3RyZWFtKFN0cmVhbTxMaXN0PGludD4+IHN0cmVhbSkgPT4gX3NpbmsuYWRkU3RyZWFtKHN0cmVhbSk7CiAgRnV0dXJlIGZsdXNoKCkgPT4gX3NpbmsuZmx1c2goKTsKICBGdXR1cmUgY2xvc2UoKSA9PiBfc2luay5jbG9zZSgpOwogIEZ1dHVyZSBnZXQgZG9uZSA9PiBfc2luay5kb25lOwp9CgovLy8gVGhlIHR5cGUgb2Ygb2JqZWN0IGEgc3RhbmRhcmQgSU8gc3RyZWFtIGlzIGF0dGFjaGVkIHRvLgpjbGFzcyBTdGRpb1R5cGUgewogIHN0YXRpYyBjb25zdCBTdGRpb1R5cGUgdGVybWluYWwgPSBjb25zdCBTdGRpb1R5cGUuXygidGVybWluYWwiKTsKICBzdGF0aWMgY29uc3QgU3RkaW9UeXBlIHBpcGUgPSBjb25zdCBTdGRpb1R5cGUuXygicGlwZSIpOwogIHN0YXRpYyBjb25zdCBTdGRpb1R5cGUgZmlsZSA9IGNvbnN0IFN0ZGlvVHlwZS5fKCJmaWxlIik7CiAgc3RhdGljIGNvbnN0IFN0ZGlvVHlwZSBvdGhlciA9IGNvbnN0IFN0ZGlvVHlwZS5fKCJvdGhlciIpOwoKICBARGVwcmVjYXRlZCgiVXNlIHRlcm1pbmFsIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBTdGRpb1R5cGUgVEVSTUlOQUwgPSB0ZXJtaW5hbDsKICBARGVwcmVjYXRlZCgiVXNlIHBpcGUgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFN0ZGlvVHlwZSBQSVBFID0gcGlwZTsKICBARGVwcmVjYXRlZCgiVXNlIGZpbGUgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFN0ZGlvVHlwZSBGSUxFID0gZmlsZTsKICBARGVwcmVjYXRlZCgiVXNlIG90aGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBTdGRpb1R5cGUgT1RIRVIgPSBvdGhlcjsKCiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgY29uc3QgU3RkaW9UeXBlLl8odGhpcy5uYW1lKTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiU3RkaW9UeXBlOiAkbmFtZSI7Cn0KClN0ZGluIF9zdGRpbjsKU3Rkb3V0IF9zdGRvdXQ7ClN0ZG91dCBfc3RkZXJyOwoKLy8gVGhlc2UgbWF5IGJlIHNldCB0byBkaWZmZXJlbnQgdmFsdWVzIGJ5IHRoZSBlbWJlZGRlciBieSBjYWxsaW5nCi8vIF9zZXRTdGRpb0ZEcyB3aGVuIGluaXRpYWxpemluZyBkYXJ0OmlvLgppbnQgX3N0ZGluRkQgPSAwOwppbnQgX3N0ZG91dEZEID0gMTsKaW50IF9zdGRlcnJGRCA9IDI7CgpAcHJhZ21hKCd2bTplbnRyeS1wb2ludCcsICdjYWxsJykKdm9pZCBfc2V0U3RkaW9GRHMoaW50IHN0ZGluLCBpbnQgc3Rkb3V0LCBpbnQgc3RkZXJyKSB7CiAgX3N0ZGluRkQgPSBzdGRpbjsKICBfc3Rkb3V0RkQgPSBzdGRvdXQ7CiAgX3N0ZGVyckZEID0gc3RkZXJyOwp9CgovLy8gVGhlIHN0YW5kYXJkIGlucHV0IHN0cmVhbSBvZiBkYXRhIHJlYWQgYnkgdGhpcyBwcm9ncmFtLgpTdGRpbiBnZXQgc3RkaW4gewogIF9zdGRpbiA/Pz0gX1N0ZElPVXRpbHMuX2dldFN0ZGlvSW5wdXRTdHJlYW0oX3N0ZGluRkQpOwogIHJldHVybiBfc3RkaW47Cn0KCi8vLyBUaGUgc3RhbmRhcmQgb3V0cHV0IHN0cmVhbSBvZiBkYXRhIHdyaXR0ZW4gYnkgdGhpcyBwcm9ncmFtLgovLy8KLy8vIFRoZSBgYWRkRXJyb3JgIEFQSSBpcyBpbmhlcml0ZWQgZnJvbSAgYFN0cmVhbVNpbmtgIGFuZCBjYWxsaW5nIGl0IHdpbGwKLy8vIHJlc3VsdCBpbiBhbiB1bmhhbmRsZWQgYXN5bmNocm9ub3VzIGVycm9yIHVubGVzcyB0aGVyZSBpcyBhbiBlcnJvciBoYW5kbGVyCi8vLyBvbiBgZG9uZWAuClN0ZG91dCBnZXQgc3Rkb3V0IHsKICBfc3Rkb3V0ID8/PSBfU3RkSU9VdGlscy5fZ2V0U3RkaW9PdXRwdXRTdHJlYW0oX3N0ZG91dEZEKTsKICByZXR1cm4gX3N0ZG91dDsKfQoKLy8vIFRoZSBzdGFuZGFyZCBvdXRwdXQgc3RyZWFtIG9mIGVycm9ycyB3cml0dGVuIGJ5IHRoaXMgcHJvZ3JhbS4KLy8vCi8vLyBUaGUgYGFkZEVycm9yYCBBUEkgaXMgaW5oZXJpdGVkIGZyb20gIGBTdHJlYW1TaW5rYCBhbmQgY2FsbGluZyBpdCB3aWxsCi8vLyByZXN1bHQgaW4gYW4gdW5oYW5kbGVkIGFzeW5jaHJvbm91cyBlcnJvciB1bmxlc3MgdGhlcmUgaXMgYW4gZXJyb3IgaGFuZGxlcgovLy8gb24gYGRvbmVgLgpTdGRvdXQgZ2V0IHN0ZGVyciB7CiAgX3N0ZGVyciA/Pz0gX1N0ZElPVXRpbHMuX2dldFN0ZGlvT3V0cHV0U3RyZWFtKF9zdGRlcnJGRCk7CiAgcmV0dXJuIF9zdGRlcnI7Cn0KCi8vLyBGb3IgYSBzdHJlYW0sIHJldHVybnMgd2hldGhlciBpdCBpcyBhdHRhY2hlZCB0byBhIGZpbGUsIHBpcGUsIHRlcm1pbmFsLCBvcgovLy8gc29tZXRoaW5nIGVsc2UuClN0ZGlvVHlwZSBzdGRpb1R5cGUob2JqZWN0KSB7CiAgaWYgKG9iamVjdCBpcyBfU3RkU3RyZWFtKSB7CiAgICBvYmplY3QgPSBvYmplY3QuX3N0cmVhbTsKICB9IGVsc2UgaWYgKG9iamVjdCA9PSBzdGRvdXQgfHwgb2JqZWN0ID09IHN0ZGVycikgewogICAgaW50IHN0ZGlvZmQgPSBvYmplY3QgPT0gc3Rkb3V0ID8gX3N0ZG91dEZEIDogX3N0ZGVyckZEOwogICAgc3dpdGNoIChfU3RkSU9VdGlscy5fZ2V0U3RkaW9IYW5kbGVUeXBlKHN0ZGlvZmQpKSB7CiAgICAgIGNhc2UgX3N0ZGlvSGFuZGxlVHlwZVRlcm1pbmFsOgogICAgICAgIHJldHVybiBTdGRpb1R5cGUudGVybWluYWw7CiAgICAgIGNhc2UgX3N0ZGlvSGFuZGxlVHlwZVBpcGU6CiAgICAgICAgcmV0dXJuIFN0ZGlvVHlwZS5waXBlOwogICAgICBjYXNlIF9zdGRpb0hhbmRsZVR5cGVGaWxlOgogICAgICAgIHJldHVybiBTdGRpb1R5cGUuZmlsZTsKICAgIH0KICB9CiAgaWYgKG9iamVjdCBpcyBfRmlsZVN0cmVhbSkgewogICAgcmV0dXJuIFN0ZGlvVHlwZS5maWxlOwogIH0KICBpZiAob2JqZWN0IGlzIFNvY2tldCkgewogICAgaW50IHNvY2tldFR5cGUgPSBfU3RkSU9VdGlscy5fc29ja2V0VHlwZShvYmplY3QpOwogICAgaWYgKHNvY2tldFR5cGUgPT0gbnVsbCkgcmV0dXJuIFN0ZGlvVHlwZS5vdGhlcjsKICAgIHN3aXRjaCAoc29ja2V0VHlwZSkgewogICAgICBjYXNlIF9zdGRpb0hhbmRsZVR5cGVUZXJtaW5hbDoKICAgICAgICByZXR1cm4gU3RkaW9UeXBlLnRlcm1pbmFsOwogICAgICBjYXNlIF9zdGRpb0hhbmRsZVR5cGVQaXBlOgogICAgICAgIHJldHVybiBTdGRpb1R5cGUucGlwZTsKICAgICAgY2FzZSBfc3RkaW9IYW5kbGVUeXBlRmlsZToKICAgICAgICByZXR1cm4gU3RkaW9UeXBlLmZpbGU7CiAgICB9CiAgfQogIGlmIChvYmplY3QgaXMgX0lPU2lua0ltcGwpIHsKICAgIHRyeSB7CiAgICAgIGlmIChvYmplY3QuX3RhcmdldCBpcyBfRmlsZVN0cmVhbUNvbnN1bWVyKSB7CiAgICAgICAgcmV0dXJuIFN0ZGlvVHlwZS5maWxlOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIC8vIE9ubHkgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCwgX3Npbmsgbm90IGF2YWlsYWJsZS4KICAgIH0KICB9CiAgcmV0dXJuIFN0ZGlvVHlwZS5vdGhlcjsKfQoKY2xhc3MgX1N0ZElPVXRpbHMgewogIGV4dGVybmFsIHN0YXRpYyBfZ2V0U3RkaW9PdXRwdXRTdHJlYW0oaW50IGZkKTsKICBleHRlcm5hbCBzdGF0aWMgU3RkaW4gX2dldFN0ZGlvSW5wdXRTdHJlYW0oaW50IGZkKTsKCiAgLy8vIFJldHVybnMgdGhlIHNvY2tldCB0eXBlIG9yIGBudWxsYCBpZiBbc29ja2V0XSBpcyBub3QgYSBidWlsdGluIHNvY2tldC4KICBleHRlcm5hbCBzdGF0aWMgaW50IF9zb2NrZXRUeXBlKFNvY2tldCBzb2NrZXQpOwogIGV4dGVybmFsIHN0YXRpYyBfZ2V0U3RkaW9IYW5kbGVUeXBlKGludCBmZCk7Cn0KgeIATk48AREBKCQkJiUBLSMBHAFFPyJJBAIBBEwRAzsEPgsBPwEGHQUsBVBPHgU6QAVOUSUFSjY7BhdJExMkQS00ExoQCx8YEQoYPBoVCB5DFSMYKREKLRgIDU0NFSMfGg8jKQEaIDcKGCkRChgIBiIEAQYvBh4BBi0FPAVBBVAGLAEGLwYeAQYtBU85BUEFUgYsAQZLBk1MNAZHSEgQBjcGTUo7S0pLHQcpAQZQEAUoBh8BBjwGGQo0KVBMGhQGBAIBBEUDThoDS0lQDQNIPwNRSgsEMhEXATEBBj0GLQEGMAVOIgY0AQYuBU4iBjABBksGTUw0BkdISBAGNwZNSjtLSksdBz0BJiknNQEGIgYbSRkEAgEvGBkBNwEWTgQCAS4YGQE2ARZNBAIBOg8BOwEvJQ0hDCMXFicIByokHh0EARMXHwQCASMWARgBKykfBAEXGQQBIBsEASciBAEdFQQBMicEASUjBAFJIyMhAgE8EkM7Oz0BJi4iJiImIygBFSArAgEOEBABQysSExMBIjcUFhYCATwSORECAUAES08PFDwSAgFCBEtPDxQ8EgIBTxQeHh01PDglIyEfIR8GBB8bBBo2NBolIyEfIR8GBB8KMx8IEj4GBBoCARQxNgFNMi8CARJkYXJ0OmlvL3N0ZGlvLmRhcnQwb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2Jpbi9zdGRpb19wYXRjaC5kYXJ0keMvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29tbW9uX3BhdGNoLmRhcnQiOwoKQHBhdGNoCmNsYXNzIF9TdGRJT1V0aWxzIHsKICBAcGF0Y2gKICBzdGF0aWMgU3RkaW4gX2dldFN0ZGlvSW5wdXRTdHJlYW0oaW50IGZkKSB7CiAgICBzd2l0Y2ggKF9nZXRTdGRpb0hhbmRsZVR5cGUoZmQpKSB7CiAgICAgIGNhc2UgX3N0ZGlvSGFuZGxlVHlwZVRlcm1pbmFsOgogICAgICBjYXNlIF9zdGRpb0hhbmRsZVR5cGVQaXBlOgogICAgICBjYXNlIF9zdGRpb0hhbmRsZVR5cGVTb2NrZXQ6CiAgICAgICAgcmV0dXJuIG5ldyBTdGRpbi5fKG5ldyBfU29ja2V0Ll9yZWFkUGlwZShmZCksIGZkKTsKICAgICAgY2FzZSBfc3RkaW9IYW5kbGVUeXBlRmlsZToKICAgICAgICByZXR1cm4gbmV3IFN0ZGluLl8obmV3IF9GaWxlU3RyZWFtLmZvclN0ZGluKCksIGZkKTsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigKICAgICAgICAgICAgIkNvdWxkbid0IGRldGVybWluZSBmaWxlIHR5cGUgb2Ygc3RkaW4gKGZkICRmZCkiKTsKICAgIH0KICB9CgogIEBwYXRjaAogIHN0YXRpYyBfZ2V0U3RkaW9PdXRwdXRTdHJlYW0oaW50IGZkKSB7CiAgICBzd2l0Y2ggKF9nZXRTdGRpb0hhbmRsZVR5cGUoZmQpKSB7CiAgICAgIGNhc2UgX3N0ZGlvSGFuZGxlVHlwZVRlcm1pbmFsOgogICAgICBjYXNlIF9zdGRpb0hhbmRsZVR5cGVQaXBlOgogICAgICBjYXNlIF9zdGRpb0hhbmRsZVR5cGVTb2NrZXQ6CiAgICAgIGNhc2UgX3N0ZGlvSGFuZGxlVHlwZUZpbGU6CiAgICAgICAgcmV0dXJuIG5ldyBTdGRvdXQuXyhuZXcgSU9TaW5rKG5ldyBfU3RkQ29uc3VtZXIoZmQpKSwgZmQpOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKAogICAgICAgICAgICAiQ291bGRuJ3QgZGV0ZXJtaW5lIGZpbGUgdHlwZSBvZiBzdGRpbyBoYW5kbGUgKGZkICRmZCkiKTsKICAgIH0KICB9CgogIEBwYXRjaAogIHN0YXRpYyBpbnQgX3NvY2tldFR5cGUoU29ja2V0IHNvY2tldCkgewogICAgaWYgKHNvY2tldCBpcyBfU29ja2V0KSByZXR1cm4gX25hdGl2ZVNvY2tldFR5cGUoc29ja2V0Ll9uYXRpdmVTb2NrZXQpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBzdGF0aWMgaW50IF9uYXRpdmVTb2NrZXRUeXBlKF9OYXRpdmVTb2NrZXQgbmF0aXZlU29ja2V0KSB7CiAgICB2YXIgcmVzdWx0ID0gX2dldFNvY2tldFR5cGUobmF0aXZlU29ja2V0KTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigiRXJyb3IgcmV0cmlldmluZyBzb2NrZXQgdHlwZSIsICIiLCByZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBfZ2V0U3RkaW9IYW5kbGVUeXBlKGludCBmZCkgbmF0aXZlICJGaWxlX0dldFN0ZGlvSGFuZGxlVHlwZSI7Cn0KCkBwYXRjaApjbGFzcyBTdGRpbiB7CiAgQHBhdGNoCiAgaW50IHJlYWRCeXRlU3luYygpIHsKICAgIHZhciByZXN1bHQgPSBfcmVhZEJ5dGUoX2ZkKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgU3RkaW5FeGNlcHRpb24oIkVycm9yIHJlYWRpbmcgYnl0ZSBmcm9tIHN0ZGluIiwgcmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAcGF0Y2gKICBib29sIGdldCBlY2hvTW9kZSB7CiAgICB2YXIgcmVzdWx0ID0gX2VjaG9Nb2RlKF9mZCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IFN0ZGluRXhjZXB0aW9uKCJFcnJvciBnZXR0aW5nIHRlcm1pbmFsIGVjaG8gbW9kZSIsIHJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQHBhdGNoCiAgdm9pZCBzZXQgZWNob01vZGUoYm9vbCBlbmFibGVkKSB7CiAgICBpZiAoIV9FbWJlZGRlckNvbmZpZy5fbWF5U2V0RWNob01vZGUpIHsKICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAiVGhpcyBlbWJlZGRlciBkaXNhbGxvd3Mgc2V0dGluZyBTdGRpbi5lY2hvTW9kZSIpOwogICAgfQogICAgdmFyIHJlc3VsdCA9IF9zZXRFY2hvTW9kZShfZmQsIGVuYWJsZWQpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBTdGRpbkV4Y2VwdGlvbigiRXJyb3Igc2V0dGluZyB0ZXJtaW5hbCBlY2hvIG1vZGUiLCByZXN1bHQpOwogICAgfQogIH0KCiAgQHBhdGNoCiAgYm9vbCBnZXQgbGluZU1vZGUgewogICAgdmFyIHJlc3VsdCA9IF9saW5lTW9kZShfZmQpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBTdGRpbkV4Y2VwdGlvbigiRXJyb3IgZ2V0dGluZyB0ZXJtaW5hbCBsaW5lIG1vZGUiLCByZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBwYXRjaAogIHZvaWQgc2V0IGxpbmVNb2RlKGJvb2wgZW5hYmxlZCkgewogICAgaWYgKCFfRW1iZWRkZXJDb25maWcuX21heVNldExpbmVNb2RlKSB7CiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICAgIlRoaXMgZW1iZWRkZXIgZGlzYWxsb3dzIHNldHRpbmcgU3RkaW4ubGluZU1vZGUiKTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBfc2V0TGluZU1vZGUoX2ZkLCBlbmFibGVkKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgU3RkaW5FeGNlcHRpb24oIkVycm9yIHNldHRpbmcgdGVybWluYWwgbGluZSBtb2RlIiwgcmVzdWx0KTsKICAgIH0KICB9CgogIEBwYXRjaAogIGJvb2wgZ2V0IHN1cHBvcnRzQW5zaUVzY2FwZXMgewogICAgdmFyIHJlc3VsdCA9IF9zdXBwb3J0c0Fuc2lFc2NhcGVzKF9mZCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IFN0ZGluRXhjZXB0aW9uKCJFcnJvciBkZXRlcm1pbmluZyBBTlNJIHN1cHBvcnQiLCByZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBfZWNob01vZGUoaW50IGZkKSBuYXRpdmUgIlN0ZGluX0dldEVjaG9Nb2RlIjsKICBzdGF0aWMgX3NldEVjaG9Nb2RlKGludCBmZCwgYm9vbCBlbmFibGVkKSBuYXRpdmUgIlN0ZGluX1NldEVjaG9Nb2RlIjsKICBzdGF0aWMgX2xpbmVNb2RlKGludCBmZCkgbmF0aXZlICJTdGRpbl9HZXRMaW5lTW9kZSI7CiAgc3RhdGljIF9zZXRMaW5lTW9kZShpbnQgZmQsIGJvb2wgZW5hYmxlZCkgbmF0aXZlICJTdGRpbl9TZXRMaW5lTW9kZSI7CiAgc3RhdGljIF9yZWFkQnl0ZShpbnQgZmQpIG5hdGl2ZSAiU3RkaW5fUmVhZEJ5dGUiOwogIHN0YXRpYyBfc3VwcG9ydHNBbnNpRXNjYXBlcyhpbnQgZmQpIG5hdGl2ZSAiU3RkaW5fQW5zaVN1cHBvcnRlZCI7Cn0KCkBwYXRjaApjbGFzcyBTdGRvdXQgewogIEBwYXRjaAogIGJvb2wgX2hhc1Rlcm1pbmFsKGludCBmZCkgewogICAgdHJ5IHsKICAgICAgX3Rlcm1pbmFsU2l6ZShmZCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBjYXRjaCAoXykgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICBAcGF0Y2gKICBpbnQgX3Rlcm1pbmFsQ29sdW1ucyhpbnQgZmQpID0+IF90ZXJtaW5hbFNpemUoZmQpWzBdOwogIEBwYXRjaAogIGludCBfdGVybWluYWxMaW5lcyhpbnQgZmQpID0+IF90ZXJtaW5hbFNpemUoZmQpWzFdOwoKICBzdGF0aWMgTGlzdCBfdGVybWluYWxTaXplKGludCBmZCkgewogICAgdmFyIHNpemUgPSBfZ2V0VGVybWluYWxTaXplKGZkKTsKICAgIGlmIChzaXplIGlzISBMaXN0KSB7CiAgICAgIHRocm93IG5ldyBTdGRvdXRFeGNlcHRpb24oIkNvdWxkIG5vdCBnZXQgdGVybWluYWwgc2l6ZSIsIHNpemUpOwogICAgfQogICAgcmV0dXJuIHNpemU7CiAgfQoKICBzdGF0aWMgX2dldFRlcm1pbmFsU2l6ZShpbnQgZmQpIG5hdGl2ZSAiU3Rkb3V0X0dldFRlcm1pbmFsU2l6ZSI7CgogIEBwYXRjaAogIHN0YXRpYyBib29sIF9zdXBwb3J0c0Fuc2lFc2NhcGVzKGludCBmZCkgewogICAgdmFyIHJlc3VsdCA9IF9nZXRBbnNpU3VwcG9ydGVkKGZkKTsKICAgIGlmIChyZXN1bHQgaXMhIGJvb2wpIHsKICAgICAgdGhyb3cgbmV3IFN0ZG91dEV4Y2VwdGlvbigiRXJyb3IgZGV0ZXJtaW5pbmcgQU5TSSBzdXBwb3J0IiwgcmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMgX2dldEFuc2lTdXBwb3J0ZWQoaW50IGZkKSBuYXRpdmUgIlN0ZG91dF9BbnNpU3VwcG9ydGVkIjsKfQoKX2dldFN0ZGlvSGFuZGxlKF9OYXRpdmVTb2NrZXQgc29ja2V0LCBpbnQgbnVtKSBuYXRpdmUgIlNvY2tldF9HZXRTdGRpb0hhbmRsZSI7Cl9nZXRTb2NrZXRUeXBlKF9OYXRpdmVTb2NrZXQgbmF0aXZlU29ja2V0KSBuYXRpdmUgIlNvY2tldF9HZXRUeXBlIjsKgKgATk48ASABBxQJLiclISM7ITwPJz8GBAEJKSclISMhQw8nRgYEAQkqSxEEAT0vHVEGEwQBCUcCAQcOCRchHUkGEwQBCRYhHUwGEwQBCSQsIj0GLR1MBgQBCRYhHUwGEwQBCSQsIj0GLR1MBgQBCSEsHUoGEwQBN0g3SDREAgEHDwkeChkTEhQGBAEJOAk2ASYlGUYGEQQBQwEJLSgbSwYTBAFCAgFPRAEeZGFydDppby1wYXRjaC9zdGRpb19wYXRjaC5kYXJ0Nm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9zdHJpbmdfdHJhbnNmb3JtZXIuZGFydI3aLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCi8vLyBUaGUgY3VycmVudCBzeXN0ZW0gZW5jb2RpbmcuCi8vLwovLy8gVGhpcyBpcyB1c2VkIGZvciBjb252ZXJ0aW5nIGZyb20gYnl0ZXMgdG8gYW5kIGZyb20gU3RyaW5ncyB3aGVuCi8vLyBjb21tdW5pY2F0aW5nIG9uIHN0ZGluLCBzdGRvdXQgYW5kIHN0ZGVyci4KLy8vCi8vLyBPbiBXaW5kb3dzIHRoaXMgd2lsbCB1c2UgdGhlIGN1cnJlbnRseSBhY3RpdmUgY29kZSBwYWdlIGZvciB0aGUgY29udmVyc2lvbi4KLy8vIE9uIGFsbCBvdGhlciBzeXN0ZW1zIGl0IHdpbGwgYWx3YXlzIHVzZSBVVEYtOC4KY29uc3QgU3lzdGVtRW5jb2Rpbmcgc3lzdGVtRW5jb2RpbmcgPSBjb25zdCBTeXN0ZW1FbmNvZGluZygpOwpARGVwcmVjYXRlZCgiVXNlIHN5c3RlbUVuY29kaW5nIGluc3RlYWQiKQpjb25zdCBTeXN0ZW1FbmNvZGluZyBTWVNURU1fRU5DT0RJTkcgPSBjb25zdCBTeXN0ZW1FbmNvZGluZygpOwoKLy8vIFRoZSBzeXN0ZW0gZW5jb2RpbmcgaXMgdGhlIGN1cnJlbnQgY29kZSBwYWdlIG9uIFdpbmRvd3MgYW5kIFVURi04IG9uIExpbnV4Ci8vLyBhbmQgTWFjLgpjbGFzcyBTeXN0ZW1FbmNvZGluZyBleHRlbmRzIEVuY29kaW5nIHsKICAvLy8gQ3JlYXRlcyBhIGNvbnN0IFN5c3RlbUVuY29kaW5nLgogIC8vLwogIC8vLyBVc2VycyBzaG91bGQgdXNlIHRoZSB0b3AtbGV2ZWwgY29uc3RhbnQsIFtzeXN0ZW1FbmNvZGluZ10uCiAgY29uc3QgU3lzdGVtRW5jb2RpbmcoKTsKCiAgU3RyaW5nIGdldCBuYW1lID0+ICdzeXN0ZW0nOwoKICBMaXN0PGludD4gZW5jb2RlKFN0cmluZyBpbnB1dCkgPT4gZW5jb2Rlci5jb252ZXJ0KGlucHV0KTsKICBTdHJpbmcgZGVjb2RlKExpc3Q8aW50PiBlbmNvZGVkKSA9PiBkZWNvZGVyLmNvbnZlcnQoZW5jb2RlZCk7CgogIENvbnZlcnRlcjxTdHJpbmcsIExpc3Q8aW50Pj4gZ2V0IGVuY29kZXIgewogICAgaWYgKFBsYXRmb3JtLm9wZXJhdGluZ1N5c3RlbSA9PSAid2luZG93cyIpIHsKICAgICAgcmV0dXJuIGNvbnN0IF9XaW5kb3dzQ29kZVBhZ2VFbmNvZGVyKCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gY29uc3QgVXRmOEVuY29kZXIoKTsKICAgIH0KICB9CgogIENvbnZlcnRlcjxMaXN0PGludD4sIFN0cmluZz4gZ2V0IGRlY29kZXIgewogICAgaWYgKFBsYXRmb3JtLm9wZXJhdGluZ1N5c3RlbSA9PSAid2luZG93cyIpIHsKICAgICAgcmV0dXJuIGNvbnN0IF9XaW5kb3dzQ29kZVBhZ2VEZWNvZGVyKCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gY29uc3QgVXRmOERlY29kZXIoKTsKICAgIH0KICB9Cn0KCmNsYXNzIF9XaW5kb3dzQ29kZVBhZ2VFbmNvZGVyIGV4dGVuZHMgQ29udmVydGVyPFN0cmluZywgTGlzdDxpbnQ+PiB7CiAgY29uc3QgX1dpbmRvd3NDb2RlUGFnZUVuY29kZXIoKTsKCiAgTGlzdDxpbnQ+IGNvbnZlcnQoU3RyaW5nIGlucHV0KSB7CiAgICBMaXN0PGludD4gZW5jb2RlZCA9IF9lbmNvZGVTdHJpbmcoaW5wdXQpOwogICAgaWYgKGVuY29kZWQgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKCJJbnZhbGlkIGNoYXJhY3RlciBmb3IgZW5jb2RpbmciKTsKICAgIH0KICAgIHJldHVybiBlbmNvZGVkOwogIH0KCiAgLyoqCiAgICogU3RhcnRzIGEgY2h1bmtlZCBjb252ZXJzaW9uLgogICAqLwogIFN0cmluZ0NvbnZlcnNpb25TaW5rIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxMaXN0PGludD4+IHNpbmspIHsKICAgIHJldHVybiBuZXcgX1dpbmRvd3NDb2RlUGFnZUVuY29kZXJTaW5rKHNpbmspOwogIH0KCiAgZXh0ZXJuYWwgc3RhdGljIExpc3Q8aW50PiBfZW5jb2RlU3RyaW5nKFN0cmluZyBzdHJpbmcpOwp9CgpjbGFzcyBfV2luZG93c0NvZGVQYWdlRW5jb2RlclNpbmsgZXh0ZW5kcyBTdHJpbmdDb252ZXJzaW9uU2lua0Jhc2UgewogIC8vIFRPRE8oZmxvaXRzY2gpOiBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGNvbnZlcnNpb25zIHdoZW4gdGhlIGlucHV0IGlzCiAgLy8gbm90IGEgU3RyaW5nLgoKICBmaW5hbCBTaW5rPExpc3Q8aW50Pj4gX3Npbms7CgogIF9XaW5kb3dzQ29kZVBhZ2VFbmNvZGVyU2luayh0aGlzLl9zaW5rKTsKCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQoKICB2b2lkIGFkZChTdHJpbmcgc3RyaW5nKSB7CiAgICBMaXN0PGludD4gZW5jb2RlZCA9IF9XaW5kb3dzQ29kZVBhZ2VFbmNvZGVyLl9lbmNvZGVTdHJpbmcoc3RyaW5nKTsKICAgIGlmIChlbmNvZGVkID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCBjaGFyYWN0ZXIgZm9yIGVuY29kaW5nIik7CiAgICB9CiAgICBfc2luay5hZGQoZW5jb2RlZCk7CiAgfQoKICB2b2lkIGFkZFNsaWNlKFN0cmluZyBzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIGlmIChzdGFydCAhPSAwIHx8IGVuZCAhPSBzb3VyY2UubGVuZ3RoKSB7CiAgICAgIHNvdXJjZSA9IHNvdXJjZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7CiAgICB9CiAgICBhZGQoc291cmNlKTsKICAgIGlmIChpc0xhc3QpIGNsb3NlKCk7CiAgfQp9CgpjbGFzcyBfV2luZG93c0NvZGVQYWdlRGVjb2RlciBleHRlbmRzIENvbnZlcnRlcjxMaXN0PGludD4sIFN0cmluZz4gewogIGNvbnN0IF9XaW5kb3dzQ29kZVBhZ2VEZWNvZGVyKCk7CgogIFN0cmluZyBjb252ZXJ0KExpc3Q8aW50PiBpbnB1dCkgewogICAgcmV0dXJuIF9kZWNvZGVCeXRlcyhpbnB1dCk7CiAgfQoKICAvKioKICAgKiBTdGFydHMgYSBjaHVua2VkIGNvbnZlcnNpb24uCiAgICovCiAgQnl0ZUNvbnZlcnNpb25TaW5rIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxTdHJpbmc+IHNpbmspIHsKICAgIHJldHVybiBuZXcgX1dpbmRvd3NDb2RlUGFnZURlY29kZXJTaW5rKHNpbmspOwogIH0KCiAgZXh0ZXJuYWwgc3RhdGljIFN0cmluZyBfZGVjb2RlQnl0ZXMoTGlzdDxpbnQ+IGJ5dGVzKTsKfQoKY2xhc3MgX1dpbmRvd3NDb2RlUGFnZURlY29kZXJTaW5rIGV4dGVuZHMgQnl0ZUNvbnZlcnNpb25TaW5rQmFzZSB7CiAgLy8gVE9ETyhmbG9pdHNjaCk6IHByb3ZpZGUgbW9yZSBlZmZpY2llbnQgY29udmVyc2lvbnMgd2hlbiB0aGUgaW5wdXQgaXMKICAvLyBhIHNsaWNlLgoKICBmaW5hbCBTaW5rPFN0cmluZz4gX3Npbms7CgogIF9XaW5kb3dzQ29kZVBhZ2VEZWNvZGVyU2luayh0aGlzLl9zaW5rKTsKCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQoKICB2b2lkIGFkZChMaXN0PGludD4gYnl0ZXMpIHsKICAgIF9zaW5rLmFkZChfV2luZG93c0NvZGVQYWdlRGVjb2Rlci5fZGVjb2RlQnl0ZXMoYnl0ZXMpKTsKICB9Cn0KgIQATk48AREBIQRELwRQMz4qPwFPDSgmBkEaAR8BPEABLTEuDSIGBAEtMS4NIgYEAgFFIwEkLhtDBhQEAQYiBkYyBAE6AgFFShMBHwErARETBAEcRxtDBhgEAUIuLQYRGQQCAUUjASQgBAEGIgZBMgQBOAIBQ0oOARwBKwEREwQBHjwEAgEfZGFydDppby9zdHJpbmdfdHJhbnNmb3JtZXIuZGFydC9vcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vc3luY19zb2NrZXQuZGFydI/SLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCi8qKgogKiBBIGxvdy1sZXZlbCBjbGFzcyBmb3IgY29tbXVuaWNhdGluZyBzeW5jaHJvbm91c2x5IG92ZXIgYSBUQ1Agc29ja2V0LgogKgogKiBXYXJuaW5nOiBbUmF3U3luY2hyb25vdXNTb2NrZXRdIHNob3VsZCBwcm9iYWJseSBvbmx5IGJlIHVzZWQgdG8gY29ubmVjdCB0bwogKiAnbG9jYWxob3N0Jy4gVGhlIG9wZXJhdGlvbnMgYmVsb3cgd2lsbCBibG9jayB0aGUgY2FsbGluZyB0aHJlYWQgdG8gd2FpdCBmb3IKICogYSByZXNwb25zZSBmcm9tIHRoZSBuZXR3b3JrLiBUaGUgdGhyZWFkIGNhbiBwcm9jZXNzIG5vIG90aGVyIGV2ZW50cyB3aGlsZQogKiB3YWl0aW5nIGZvciB0aGVzZSBvcGVyYXRpb25zIHRvIGNvbXBsZXRlLiBbUmF3U3luY2hyb25vdXNTb2NrZXRdIGlzIG5vdAogKiBzdWl0YWJsZSBmb3IgYXBwbGljYXRpb25zIHRoYXQgcmVxdWlyZSBoaWdoIHBlcmZvcm1hbmNlIG9yIGFzeW5jaHJvbm91cyBJL08KICogc3VjaCBhcyBhIHNlcnZlci4gSW5zdGVhZCBzdWNoIGFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIHRoZSBub24tYmxvY2tpbmcKICogc29ja2V0cyBhbmQgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgaW4gdGhlIFNvY2tldCBvciBSYXdTb2NrZXQgY2xhc3Nlcy4KICovCmFic3RyYWN0IGNsYXNzIFJhd1N5bmNocm9ub3VzU29ja2V0IHsKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IHNvY2tldCBjb25uZWN0aW9uIGFuZCByZXR1cm5zIGEgW1Jhd1N5bmNocm9ub3VzU29ja2V0XS4KICAgKgogICAqIFtob3N0XSBjYW4gZWl0aGVyIGJlIGEgW1N0cmluZ10gb3IgYW4gW0ludGVybmV0QWRkcmVzc10uIElmIFtob3N0XSBpcyBhCiAgICogW1N0cmluZ10sIFtjb25uZWN0U3luY10gd2lsbCBwZXJmb3JtIGEgW0ludGVybmV0QWRkcmVzcy5sb29rdXBdIGFuZCB0cnkKICAgKiBhbGwgcmV0dXJuZWQgW0ludGVybmV0QWRkcmVzc11lcywgdW50aWwgY29ubmVjdGVkLiBVbmxlc3MgYQogICAqIGNvbm5lY3Rpb24gd2FzIGVzdGFibGlzaGVkLCB0aGUgZXJyb3IgZnJvbSB0aGUgZmlyc3QgZmFpbGluZyBjb25uZWN0aW9uIGlzCiAgICogcmV0dXJuZWQuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIFJhd1N5bmNocm9ub3VzU29ja2V0IGNvbm5lY3RTeW5jKGhvc3QsIGludCBwb3J0KTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIGFuZCB1bnJlYWQgYnl0ZXMgaW4gdGhlIHNvY2tldCB0aGF0IGNhbiBiZQogICAqIHJlYWQuCiAgICovCiAgaW50IGF2YWlsYWJsZSgpOwoKICAvKioKICAgKiBDbG9zZXMgdGhlIFtSYXdTeW5jaHJvbm91c1NvY2tldF0uCiAgICoKICAgKiBPbmNlIFtjbG9zZVN5bmNdIGhhcyBiZWVuIGNhbGxlZCwgYXR0ZW1wdGluZyB0byBjYWxsIFtyZWFkU3luY10sCiAgICogW3JlYWRJbnRvU3luY10sIFt3cml0ZUZyb21TeW5jXSwgW3JlbW90ZUFkZHJlc3NdLCBhbmQgW3JlbW90ZVBvcnRdIHdpbGwKICAgKiBjYXVzZSBhIFtTb2NrZXRFeGNlcHRpb25dIHRvIGJlIHRocm93bi4KICAgKi8KICB2b2lkIGNsb3NlU3luYygpOwoKICAvKioKICAgKiBSZWFkcyBpbnRvIGFuIGV4aXN0aW5nIFtMaXN0PGludD5dIGZyb20gdGhlIHNvY2tldCBpbnRvIHRoZSByYW5nZToKICAgKiBbW3N0YXJ0XSxbZW5kXSkuCiAgICoKICAgKiBSZWFkcyBpbnRvIGFuIGV4aXN0aW5nIFtMaXN0PGludD5dIGZyb20gdGhlIHNvY2tldC4gSWYgW3N0YXJ0XSBpcyBwcmVzZW50LAogICAqIHRoZSBieXRlcyB3aWxsIGJlIGZpbGxlZCBpbnRvIFtidWZmZXJdIGZyb20gaW5kZXggW3N0YXJ0XSwgb3RoZXJ3aXNlIGluZGV4CiAgICogMC4gSWYgW2VuZF0gaXMgcHJlc2VudCwgW2VuZF0gLSBbc3RhcnRdIGJ5dGVzIHdpbGwgYmUgcmVhZCBpbnRvIFtidWZmZXJdLAogICAqIG90aGVyd2lzZSB1cCB0byBbYnVmZmVyLmxlbmd0aF0uIElmIFtlbmRdID09IFtzdGFydF0sIG5vIGJ5dGVzIGFyZSByZWFkLgogICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLgogICAqLwogIGludCByZWFkSW50b1N5bmMoTGlzdDxpbnQ+IGJ1ZmZlciwgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKTsKCiAgLyoqCiAgICogUmVhZHMgdXAgdG8gW2J5dGVzXSBieXRlcyBmcm9tIHRoZSBzb2NrZXQuCiAgICoKICAgKiBCbG9ja3MgYW5kIHdhaXRzIGZvciBhIHJlc3BvbnNlIG9mIHVwIHRvIGEgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcwogICAqIHNlbnQgYnkgdGhlIHNvY2tldC4gW2J5dGVzXSBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvCiAgICogYmUgcmVhZC4gUmV0dXJucyB0aGUgbGlzdCBvZiBieXRlcyByZWFkLCB3aGljaCBjb3VsZCBiZSBsZXNzIHRoYW4gdGhlCiAgICogdmFsdWUgc3BlY2lmaWVkIGJ5IFtieXRlc10uCiAgICovCiAgTGlzdDxpbnQ+IHJlYWRTeW5jKGludCBieXRlcyk7CgogIC8qKgogICAqIFNodXRkb3duIGEgc29ja2V0IGluIHRoZSBwcm92aWRlZCBkaXJlY3Rpb24uCiAgICoKICAgKiBDYWxsaW5nIHNodXRkb3duIHdpbGwgbmV2ZXIgdGhyb3cgYW4gZXhjZXB0aW9uIGFuZCBjYWxsaW5nIGl0IHNldmVyYWwgdGltZXMKICAgKiBpcyBzdXBwb3J0ZWQuIElmIGJvdGggW1NvY2tldERpcmVjdGlvbi5SRUNFSVZFXSBhbmQgW1NvY2tldERpcmVjdGlvbi5TRU5EXQogICAqIGRpcmVjdGlvbnMgYXJlIGNsb3NlZCwgdGhlIHNvY2tldCBpcyBjbG9zZWQgY29tcGxldGVseSwgdGhlIHNhbWUgYXMgaWYKICAgKiBbY2xvc2VTeW5jXSBoYXMgYmVlbiBjYWxsZWQuCiAgICovCiAgdm9pZCBzaHV0ZG93bihTb2NrZXREaXJlY3Rpb24gZGlyZWN0aW9uKTsKCiAgLyoqCiAgICogV3JpdGVzIGRhdGEgZnJvbSBhIHNwZWNpZmllZCByYW5nZSBpbiBhIFtMaXN0PGludD5dIHRvIHRoZSBzb2NrZXQuCiAgICoKICAgKiBXcml0ZXMgaW50byB0aGUgc29ja2V0IGZyb20gYSBbTGlzdDxpbnQ+XS4gSWYgW3N0YXJ0XSBpcyBwcmVzZW50LCB0aGUgYnl0ZXMKICAgKiB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIHNvY2tldCBzdGFydGluZyBmcm9tIGluZGV4IFtzdGFydF0uIElmIFtzdGFydF0gaXMKICAgKiBub3QgcHJlc2VudCwgdGhlIGJ5dGVzIHdpbGwgYmUgd3JpdHRlbiBzdGFydGluZyBmcm9tIGluZGV4IDAuIElmIFtlbmRdIGlzCiAgICogcHJlc2VudCwgdGhlIFtlbmRdIC0gW3N0YXJ0XSBieXRlcyB3aWxsIGJlIHdyaXR0ZW4gaW50byB0aGUgc29ja2V0IHN0YXJ0aW5nCiAgICogYXQgaW5kZXggW3N0YXJ0XS4gSWYgW2VuZF0gaXMgbm90IHByb3ZpZGVkLCBbYnVmZmVyLmxlbmd0aF0gZWxlbWVudHMgd2lsbAogICAqIGJlIHdyaXR0ZW4gdG8gdGhlIHNvY2tldCBzdGFydGluZyBmcm9tIGluZGV4IFtzdGFydF0uIElmIFtlbmRdID09IFtzdGFydF0sCiAgICogbm90aGluZyBoYXBwZW5zLgogICAqLwogIHZvaWQgd3JpdGVGcm9tU3luYyhMaXN0PGludD4gYnVmZmVyLCBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pOwoKICAvKioKICAgKiBUaGUgcG9ydCB1c2VkIGJ5IHRoaXMgc29ja2V0LgogICAqLwogIGludCBnZXQgcG9ydDsKCiAgLyoqCiAgICogVGhlIHJlbW90ZSBwb3J0IGNvbm5lY3RlZCB0byBieSB0aGlzIHNvY2tldC4KICAgKi8KICBpbnQgZ2V0IHJlbW90ZVBvcnQ7CgogIC8qKgogICAqIFRoZSBbSW50ZXJuZXRBZGRyZXNzXSB1c2VkIHRvIGNvbm5lY3QgdGhpcyBzb2NrZXQuCiAgICovCiAgSW50ZXJuZXRBZGRyZXNzIGdldCBhZGRyZXNzOwoKICAvKioKICAgKiBUaGUgcmVtb3RlIFtJbnRlcm5ldEFkZHJlc3NdIGNvbm5lY3RlZCB0byBieSB0aGlzIHNvY2tldC4KICAgKi8KICBJbnRlcm5ldEFkZHJlc3MgZ2V0IHJlbW90ZUFkZHJlc3M7Cn0KbwBOTjwBEQEESANOT01LT0tLBCYGSwVNTUFQDwZEAQZPCwYTAQYoBUZNLQYUAQZIFgVQUE9OJwZAAQYwBUpKSyEGIQEGMgVRUEwiBiwBBkgFUU5PUU9QFgZCAQYjBhABBjIGFgEGOAYfAQY/BiUCARhkYXJ0OmlvL3N5bmNfc29ja2V0LmRhcnQob3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NsaS9jbGkuZGFydIE/Ly8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyB7QGNhdGVnb3J5IFZNfQpsaWJyYXJ5IGRhcnQuY2xpOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0Om1hdGgnOwoKcGFydCAnd2FpdF9mb3IuZGFydCc7Cg0ATk48ARMSARUUARYBCGRhcnQ6Y2xpLW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jbGkvd2FpdF9mb3IuZGFydJhdLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jbGk7CgovKioKICogU3luY2hyb25vdXNseSBibG9ja3MgdGhlIGNhbGxpbmcgaXNvbGF0ZSB0byB3YWl0IGZvciBhc3luY2hyb25vdXMgZXZlbnRzIHRvCiAqIGNvbXBsZXRlLgogKgogKiBJZiB0aGUgW3RpbWVvdXRdIHBhcmFtZXRlciBpcyBzdXBwbGllZCwgW3dhaXRGb3JFdmVudF0gd2lsbCByZXR1cm4gYWZ0ZXIKICogdGhlIHNwZWNpZmllZCB0aW1lb3V0IGV2ZW4gaWYgbm8gZXZlbnRzIGhhdmUgb2NjdXJyZWQuCiAqCiAqIFRoaXMgY2FsbCBkb2VzIHRoZSBmb2xsb3dpbmc6CiAqIC0gc3VzcGVuZHMgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIHN0YWNrLAogKiAtIHJ1bnMgdGhlIG1pY3JvdGFzayBxdWV1ZSB1bnRpbCBpdCBpcyBlbXB0eSwKICogLSB3YWl0cyB1bnRpbCB0aGUgbWVzc2FnZSBxdWV1ZSBpcyBub3QgZW1wdHksCiAqIC0gaGFuZGxlcyBtZXNzYWdlcyBvbiB0aGUgbWVzc2FnZSBxdWV1ZSwgcGx1cyB0aGVpciBhc3NvY2lhdGVkIG1pY3JvdGFza3MsCiAqICAgdW50aWwgdGhlIG1lc3NhZ2UgcXVldWUgaXMgZW1wdHksCiAqIC0gcmVzdW1lcyB0aGUgb3JpZ2luYWwgc3RhY2suCiAqCiAqIFRoaXMgZnVuY3Rpb24gYnJlYWtzIHRoZSB1c3VhbCBwcm9taXNlIG9mZmVyZWQgYnkgRGFydCBzZW1hbnRpY3MgdGhhdAogKiBtZXNzYWdlIGhhbmRsZXJzIGFuZCBtaWNyb3Rhc2tzIHJ1biB0byBjb21wbGV0aW9uIGJlZm9yZSB0aGUgbmV4dCBtZXNzYWdlCiAqIGhhbmRsZXIgb3IgbWljcm90YXNrIGJlZ2lucyB0byBydW4uIE9mIHBhcnRpY3VsYXIgbm90ZSBpcyB0aGF0IHVzZSBvZiB0aGlzCiAqIGZ1bmN0aW9uIGluIGEgZmluYWxseSBibG9jayB3aWxsIGFsbG93IG1pY3JvdGFza3MgYW5kIG1lc3NhZ2UgaGFuZGxlcnMgdG8KICogcnVuIGJlZm9yZSBhbGwgZmluYWxseSBibG9ja3MgZm9yIGFuIGV4Y2VwdGlvbiBoYXZlIGNvbXBsZXRlZCwgcG9zc2libHkKICogYnJlYWtpbmcgaW52YXJpYW50cyBpbiB5b3VyIHByb2dyYW0uCiAqCiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBzeW5jaHJvbm91c2x5IHRocm93IHRoZSBmaXJzdCB1bmhhbmRsZWQgZXhjZXB0aW9uIGl0CiAqIGVuY291bnRlcnMgaW4gcnVubmluZyB0aGUgbWljcm90YXNrcyBhbmQgbWVzc2FnZSBoYW5kbGVycyBhcyB0aG91Z2ggdGhlCiAqIHRocm93aW5nIG1pY3JvdGFzayBvciBtZXNzYWdlIGhhbmRsZXIgd2FzIHRoZSBvbmx5IERhcnQgaW52b2NhdGlvbiBvbiB0aGUKICogc3RhY2suIFRoYXQgaXMsIHVuaGFuZGxlZCBleGNlcHRpb25zIGluIGEgbWljcm90YXNrIG9yIG1lc3NhZ2UgaGFuZGxlciB3aWxsCiAqIHNraXAgb3ZlciBzdGFja3Mgc3VzcGVuZGVkIGluIGEgY2FsbCB0byBbd2FpdEZvckV2ZW50XS4KICoKICogQ2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBtYXkgYmUgbmVzdGVkLiBFYXJsaWVyIGludm9jYXRpb25zIHdpbGwgbm90CiAqIGJlIGFibGUgdG8gY29tcGxldGUgdW50aWwgc3Vic2VxdWVudCBvbmVzIGRvLiBNZXNzYWdlcyB0aGF0IGFycml2ZSBhZnRlcgogKiBhIHN1YnNlcXVlbnQgaW52b2NhdGlvbiBhcmUgImNvbnN1bWVkIiBieSB0aGF0IGludm9jYXRpb24sIGFuZCBkbyBub3QKICogdW5ibG9jayBhbiBlYXJsaWVyIGludm9jYXRpb24uIFBsZWFzZSBiZSBhd2FyZSB0aGF0IG5lc3RpbmcgY2FsbHMgdG8KICogW3dhaXRGb3JFdmVudF0gY2FuIGxlYWQgdG8gZGVhZGxvY2sgd2hlbiBzdWJzZXF1ZW50IGNhbGxzIGJsb2NrIHRvIHdhaXQgZm9yCiAqIGEgY29uZGl0aW9uIHRoYXQgaXMgb25seSBzYXRpc2ZpZWQgYWZ0ZXIgYW4gZWFybGllciBjYWxsIHJldHVybnMuCiAqCiAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBjYWxsIGlzIG9ubHkgYXZhaWxhYmxlIGluIHRoZSBzdGFuZGFsb25lIGNvbW1hbmQtbGluZQogKiBEYXJ0IFZNLiBGdXJ0aGVyLCBiZWNhdXNlIGl0IHN1c3BlbmRzIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBzdGFjayB1bnRpbCB0aGUKICogbWVzc2FnZSBxdWV1ZSBpcyBlbXB0eSwgZXZlbiB3aGVuIHJ1bm5pbmcgaW4gdGhlIHN0YW5kYWxvbmUgY29tbWFuZC1saW5lIFZNCiAqIHRoZXJlIGV4aXN0cyBhIHJpc2sgdGhhdCB0aGUgY3VycmVudCBleGVjdXRpb24gc3RhY2sgd2lsbCBiZSBzdGFydmVkLgogKi8KZXh0ZXJuYWwgdm9pZCBfd2FpdEZvckV2ZW50KGludCB0aW1lb3V0TWlsbGlzKTsKCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKdm9pZCBGdW5jdGlvbihpbnQpIF9nZXRXYWl0Rm9yRXZlbnQoKSA9PiBfd2FpdEZvckV2ZW50OwoKLy8gVGhpcyBzaG91bGQgYmUgc2V0IGZyb20gQysrIGNvZGUgYnkgdGhlIGVtYmVkZGVyIHRvIHdpcmUgdXAgd2FpdEZvcigpIHRvIHRoZQovLyBuYXRpdmUgaW1wbGVtZW50YXRpb24uIEluIHRoZSBzdGFuZGFsb25lIFZNIHRoaXMgaXMgc2V0IHRvIF93YWl0Rm9yRXZlbnQoKQovLyBhYm92ZS4gSWYgaXQgaXMgbnVsbCwgY2FsbGluZyB3YWl0Rm9yKCkgd2lsbCB0aHJvdyBhbiBVbnN1cHBvcnRlZEVycm9yLgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCnZvaWQgRnVuY3Rpb24oaW50KSBfd2FpdEZvckV2ZW50Q2xvc3VyZTsKCmNsYXNzIF9XYWl0Rm9yVXRpbHMgewogIHN0YXRpYyB2b2lkIHdhaXRGb3JFdmVudCh7RHVyYXRpb24gdGltZW91dH0pIHsKICAgIGlmIChfd2FpdEZvckV2ZW50Q2xvc3VyZSA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJ3YWl0Rm9yIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbWJlZGRlciIpOwogICAgfQogICAgX3dhaXRGb3JFdmVudENsb3N1cmUodGltZW91dCA9PSBudWxsID8gMCA6IG1heCgxLCB0aW1lb3V0LmluTWlsbGlzZWNvbmRzKSk7CiAgfQp9CgovKioKICogU3VzcGVuZHMgdGhlIHN0YWNrLCBydW5zIG1pY3JvdGFza3MsIGFuZCBoYW5kbGVzIGluY29taW5nIGV2ZW50cyB1bnRpbAogKiBbZnV0dXJlXSBjb21wbGV0ZXMuCiAqCiAqIFdBUk5JTkc6IEVYUEVSSU1FTlRBTC4gVVNFIEFUIFlPVVIgT1dOIFJJU0suCiAqCiAqIFRoaXMgY2FsbCBkb2VzIHRoZSBmb2xsb3dpbmc6CiAqIC0gV2hpbGUgW2Z1dHVyZV0gaXMgbm90IGNvbXBsZXRlZDoKICogICAtIHN1c3BlbmRzIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBzdGFjaywKICogICAtIHJ1bnMgdGhlIG1pY3JvdGFzayBxdWV1ZSB1bnRpbCBpdCBpcyBlbXB0eSwKICogICAtIHdhaXRzIHVudGlsIHRoZSBtZXNzYWdlIHF1ZXVlIGlzIG5vdCBlbXB0eSwKICogICAtIGhhbmRsZXMgbWVzc2FnZXMgb24gdGhlIG1lc3NhZ2UgcXVldWUsIHBsdXMgdGhlaXIgYXNzb2NpYXRlZCBtaWNyb3Rhc2tzLAogKiAgICAgdW50aWwgdGhlIG1lc3NhZ2UgcXVldWUgaXMgZW1wdHksCiAqICAgLSByZXN1bWVzIHRoZSBvcmlnaW5hbCBzdGFjay4KICoKICogVGhpcyBmdW5jdGlvbiBicmVha3MgdGhlIHVzdWFsIHByb21pc2Ugb2ZmZXJlZCBieSBEYXJ0IHNlbWFudGljcyB0aGF0CiAqIG1lc3NhZ2UgaGFuZGxlcnMgYW5kIG1pY3JvdGFza3MgcnVuIHRvIGNvbXBsZXRpb24gYmVmb3JlIHRoZSBuZXh0IG1lc3NhZ2UKICogaGFuZGxlciBvciBtaWNyb3Rhc2sgYmVnaW5zIHRvIHJ1bi4gT2YgcGFydGljdWxhciBub3RlIGlzIHRoYXQgdXNlIG9mIHRoaXMKICogZnVuY3Rpb24gaW4gYSBmaW5hbGx5IGJsb2NrIHdpbGwgYWxsb3cgbWljcm90YXNrcyBhbmQgbWVzc2FnZSBoYW5kbGVycyB0bwogKiBydW4gYmVmb3JlIGFsbCBmaW5hbGx5IGJsb2NrcyBmb3IgYW4gZXhjZXB0aW9uIGhhdmUgY29tcGxldGVkLCBwb3NzaWJseQogKiBicmVha2luZyBpbnZhcmlhbnRzIGluIHlvdXIgcHJvZ3JhbS4KICoKICogVXNlIG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBsYXN0IHJlc29ydCB3aGVuIGl0IGlzIG5vdAogKiBwb3NzaWJsZSB0byBjb252ZXJ0IGEgRGFydCBwcm9ncmFtIGVudGlyZWx5IHRvIGFuIGFzeW5jaHJvbm91cyBzdHlsZSB1c2luZwogKiBgYXN5bmNgIGFuZCBgYXdhaXRgLgogKgogKiBJZiB0aGUgW0Z1dHVyZV0gY29tcGxldGVzIG5vcm1hbGx5LCBpdHMgcmVzdWx0IGlzIHJldHVybmVkLiBJZiB0aGUgW0Z1dHVyZV0KICogY29tcGxldGVzIHdpdGggYW4gZXJyb3IsIHRoZSBlcnJvciBhbmQgc3RhY2sgdHJhY2UgYXJlIHdyYXBwZWQgaW4gYW4KICogW0FzeW5jRXJyb3JdIGFuZCB0aHJvd24uIElmIGEgbWljcm90YXNrIG9yIG1lc3NhZ2UgaGFuZGxlciBydW4gZHVyaW5nIHRoaXMKICogY2FsbCByZXN1bHRzIGluIGFuIHVuaGFuZGxlZCBleGNlcHRpb24sIHRoYXQgZXhjZXB0aW9uIHdpbGwgYmUgcHJvcGFnYXRlZAogKiBhcyB0aG91Z2ggdGhlIG1pY3JvdGFzayBvciBtZXNzYWdlIGhhbmRsZXIgd2FzIHRoZSBvbmx5IERhcnQgaW52b2NhdGlvbiBvbgogKiB0aGUgc3RhY2suIFRoYXQgaXMsIHVuaGFuZGxlZCBleGNlcHRpb25zIGluIGEgbWljcm90YXNrIG9yIG1lc3NhZ2UgaGFuZGxlcgogKiB3aWxsIHNraXAgb3ZlciBzdGFja3Mgc3VzcGVuZGVkIGluIGEgY2FsbCB0byBbd2FpdEZvcl0uCiAqCiAqIElmIHRoZSBvcHRpb25hbCBgdGltZW91dGAgcGFyYW1ldGVyIGlzIHBhc3NlZCwgW3dhaXRGb3JdIHRocm93cyBhCiAqIFtUaW1lb3V0RXhjZXB0aW9uXSBpZiB0aGUgW0Z1dHVyZV0gaXMgbm90IGNvbXBsZXRlZCB3aXRoaW4gdGhlIHNwZWNpZmllZAogKiBwZXJpb2QuCiAqCiAqIENhbGxzIHRvIFt3YWl0Rm9yXSBtYXkgYmUgbmVzdGVkLiBFYXJsaWVyIGludm9jYXRpb25zIHdpbGwgbm90IGNvbXBsZXRlCiAqIHVudGlsIHN1YnNlcXVlbnQgb25lcyBkbywgYnV0IHRoZSBjb21wbGV0aW9uIG9mIGEgc3Vic2VxdWVudCBpbnZvY2F0aW9uIHdpbGwKICogY2F1c2UgdGhlIHByZXZpb3VzIGludm9jYXRpb24gdG8gd2FrZSB1cCBhbmQgY2hlY2sgaXRzIFtGdXR1cmVdIGZvcgogKiBjb21wbGV0aW9uLgogKgogKiBQbGVhc2UgYmUgYXdhcmUgdGhhdCBuZXN0aW5nIGNhbGxzIHRvIFt3YWl0Rm9yXSBjYW4gbGVhZCB0byBkZWFkbG9jayBpZgogKiBzdWJzZXF1ZW50IGNhbGxzIGJsb2NrIHdhaXRpbmcgZm9yIGEgY29uZGl0aW9uIHRoYXQgaXMgb25seSBzYXRpc2ZpZWQgd2hlbgogKiBhbiBlYXJsaWVyIGNhbGwgcmV0dXJucy4KICovClQgd2FpdEZvcjxUPihGdXR1cmU8VD4gZnV0dXJlLCB7RHVyYXRpb24gdGltZW91dH0pIHsKICBUIHJlc3VsdDsKICBib29sIGZ1dHVyZUNvbXBsZXRlZCA9IGZhbHNlOwogIE9iamVjdCBlcnJvcjsKICBTdGFja1RyYWNlIHN0YWNrdHJhY2U7CiAgZnV0dXJlLnRoZW4oKHIpIHsKICAgIGZ1dHVyZUNvbXBsZXRlZCA9IHRydWU7CiAgICByZXN1bHQgPSByOwogIH0sIG9uRXJyb3I6IChlLCBzdCkgewogICAgZXJyb3IgPSBlOwogICAgc3RhY2t0cmFjZSA9IHN0OwogIH0pOwoKICBTdG9wd2F0Y2ggczsKICBpZiAodGltZW91dCAhPSBudWxsKSB7CiAgICBzID0gbmV3IFN0b3B3YXRjaCgpLi5zdGFydCgpOwogIH0KICBUaW1lci5ydW4oKCkge30pOyAvLyBFbnVzcmUgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG1lc3NhZ2UuCiAgd2hpbGUgKCFmdXR1cmVDb21wbGV0ZWQgJiYgKGVycm9yID09IG51bGwpKSB7CiAgICBEdXJhdGlvbiByZW1haW5pbmc7CiAgICBpZiAodGltZW91dCAhPSBudWxsKSB7CiAgICAgIGlmIChzLmVsYXBzZWQgPj0gdGltZW91dCkgewogICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXhjZXB0aW9uKCJ3YWl0Rm9yKCkgdGltZWQgb3V0IiwgdGltZW91dCk7CiAgICAgIH0KICAgICAgcmVtYWluaW5nID0gdGltZW91dCAtIHMuZWxhcHNlZDsKICAgIH0KICAgIF9XYWl0Rm9yVXRpbHMud2FpdEZvckV2ZW50KHRpbWVvdXQ6IHJlbWFpbmluZyk7CiAgfQogIGlmICh0aW1lb3V0ICE9IG51bGwpIHsKICAgIHMuc3RvcCgpOwogIH0KICBUaW1lci5ydW4oKCkge30pOyAvLyBFbnN1cmUgdGhhdCBwcmV2aW91cyBjYWxscyB0byB3YWl0Rm9yIGFyZSB3b2tlbiB1cC4KCiAgaWYgKGVycm9yICE9IG51bGwpIHsKICAgIHRocm93IG5ldyBBc3luY0Vycm9yKGVycm9yLCBzdGFja3RyYWNlKTsKICB9CgogIHJldHVybiByZXN1bHQ7Cn0KgJoATk48ARIBBE8NA0w6AyErMTFOJyEDSU1OTUsoA0tLTU87A0ZMSUhPRQNPT09JBDABGjgBUE5LGikBFjEoTwZQBAIBBEoXAzADISYtMzNQKSMDSU1OTUsoA0pOGANPSE5NTk47A0VMCwNLUEcPA0tOHAQ1DCAQGRQcEBgPFQYBDxkiBD0wGBsiRAgnBjQEGQ4ESwEXLQQBEQIBFmRhcnQ6Y2xpL3dhaXRfZm9yLmRhcnQub3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2Jpbi9jbGlfcGF0Y2guZGFydIFGLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAiZGFydDpfaW50ZXJuYWwiIHNob3cgcGF0Y2g7CgpAcGF0Y2gKdm9pZCBfd2FpdEZvckV2ZW50KGludCB0aW1lb3V0TWlsbGlzKSBuYXRpdmUgIkNMSV9XYWl0Rm9yRXZlbnQiOwoKAE5OPAEkAQdBAR1kYXJ0OmNsaS1wYXRjaC9jbGlfcGF0Y2guZGFydCpvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS9jb3JlLmRhcnSZ7S8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovKioKICoKICogQnVpbHQtaW4gdHlwZXMsIGNvbGxlY3Rpb25zLAogKiBhbmQgb3RoZXIgY29yZSBmdW5jdGlvbmFsaXR5IGZvciBldmVyeSBEYXJ0IHByb2dyYW0uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBhdXRvbWF0aWNhbGx5IGltcG9ydGVkLgogKgogKiBTb21lIGNsYXNzZXMgaW4gdGhpcyBsaWJyYXJ5LAogKiBzdWNoIGFzIFtTdHJpbmddIGFuZCBbbnVtXSwKICogc3VwcG9ydCBEYXJ0J3MgYnVpbHQtaW4gZGF0YSB0eXBlcy4KICogT3RoZXIgY2xhc3Nlcywgc3VjaCBhcyBbTGlzdF0gYW5kIFtNYXBdLCBwcm92aWRlIGRhdGEgc3RydWN0dXJlcwogKiBmb3IgbWFuYWdpbmcgY29sbGVjdGlvbnMgb2Ygb2JqZWN0cy4KICogQW5kIHN0aWxsIG90aGVyIGNsYXNzZXMgcmVwcmVzZW50IGNvbW1vbmx5IHVzZWQgdHlwZXMgb2YgZGF0YQogKiBzdWNoIGFzIFVSSXMsIGRhdGVzIGFuZCB0aW1lcywgYW5kIGVycm9ycy4KICoKICogIyMgTnVtYmVycyBhbmQgYm9vbGVhbnMKICoKICogW2ludF0gYW5kIFtkb3VibGVdIHByb3ZpZGUgc3VwcG9ydCBmb3IgRGFydCdzIGJ1aWx0LWluIG51bWVyaWNhbCBkYXRhIHR5cGVzOgogKiBpbnRlZ2VycyBhbmQgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXJzLCByZXNwZWN0aXZlbHkuCiAqIEFuIG9iamVjdCBvZiB0eXBlIFtib29sXSBpcyBlaXRoZXIgdHJ1ZSBvciBmYWxzZS4KICogVmFyaWFibGVzIG9mIHRoZXNlIHR5cGVzIGNhbiBiZSBjb25zdHJ1Y3RlZCBmcm9tIGxpdGVyYWxzOgogKgogKiAgICAgaW50IG1lYW5pbmdPZkxpZmUgPSA0MjsKICogICAgIGRvdWJsZSB2YWx1ZU9mUGkgID0gMy4xNDE1OTI7CiAqICAgICBib29sIHZpc2libGUgICAgICA9IHRydWU7CiAqCiAqICMjIFN0cmluZ3MgYW5kIHJlZ3VsYXIgZXhwcmVzc2lvbnMKICoKICogQSBbU3RyaW5nXSBpcyBpbW11dGFibGUgYW5kIHJlcHJlc2VudHMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzLgogKgogKiAgICAgU3RyaW5nIHNoYWtlc3BlYXJlUXVvdGUgPSAiQWxsIHRoZSB3b3JsZCdzIGEgc3RhZ2UsIC4uLiI7CiAqCiAqIFtTdHJpbmdCdWZmZXJdIHByb3ZpZGVzIGEgd2F5IHRvIGNvbnN0cnVjdCBzdHJpbmdzIGVmZmljaWVudGx5LgogKgogKiAgICAgU3RyaW5nQnVmZmVyIG1vcmVTaGFrZXNwZWFyZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICogICAgIG1vcmVTaGFrZXNwZWFyZS53cml0ZSgnQW5kIGFsbCB0aGUgbWVuIGFuZCB3b21lbiAnKTsKICogICAgIG1vcmVTaGFrZXNwZWFyZS53cml0ZSgnbWVyZWx5IHBsYXllcnM7IC4uLicpOwogKgogKiBUaGUgU3RyaW5nIGFuZCBTdHJpbmdCdWZmZXIgY2xhc3NlcyBpbXBsZW1lbnQgc3RyaW5nIGNvbmNhdGVuYXRpb24sCiAqIGludGVycG9sYXRpb24sIGFuZCBvdGhlciBzdHJpbmcgbWFuaXB1bGF0aW9uIGZlYXR1cmVzLgogKgogKiAgICAgU3RyaW5nIHBoaWxvc29waHkgPSAnTGl2ZSBvbiAnOwogKiAgICAgU3RyaW5nIGdldCBwYWxpbmRyb21lID0+IHBoaWxvc29waHkgKyBwaGlsb3NvcGh5LnNwbGl0KCcnKS5yZXZlcnNlZC5qb2luKCk7CiAqCiAqIFtSZWdFeHBdIGltcGxlbWVudHMgRGFydCByZWd1bGFyIGV4cHJlc3Npb25zLAogKiB3aGljaCBwcm92aWRlIGEgZ3JhbW1hciBmb3IgbWF0Y2hpbmcgcGF0dGVybnMgd2l0aGluIHRleHQuCiAqIEZvciBleGFtcGxlLCBoZXJlJ3MgYSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXRjaGVzCiAqIGEgc3RyaW5nIG9mIG9uZSBvciBtb3JlIGRpZ2l0czoKICoKICogICAgIHZhciBudW1iZXJzID0gbmV3IFJlZ0V4cChyJ1xkKycpOwogKgogKiBEYXJ0IHJlZ3VsYXIgZXhwcmVzc2lvbnMgaGF2ZSB0aGUgc2FtZSBzeW50YXggYW5kIHNlbWFudGljcyBhcwogKiBKYXZhU2NyaXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnMuIFNlZQogKiA8aHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtMTUuMTA+CiAqIGZvciB0aGUgc3BlY2lmaWNhdGlvbiBvZiBKYXZhU2NyaXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnMuCiAqCiAqICMjIENvbGxlY3Rpb25zCiAqCiAqIFRoZSBkYXJ0OmNvcmUgbGlicmFyeSBwcm92aWRlcyBiYXNpYyBjb2xsZWN0aW9ucywKICogc3VjaCBhcyBbTGlzdF0sIFtNYXBdLCBhbmQgW1NldF0uCiAqCiAqIEEgTGlzdCBpcyBhbiBvcmRlcmVkIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cywgd2l0aCBhIGxlbmd0aC4KICogTGlzdHMgYXJlIHNvbWV0aW1lcyBjYWxsZWQgYXJyYXlzLgogKiBVc2UgYSBMaXN0IHdoZW4geW91IG5lZWQgdG8gYWNjZXNzIG9iamVjdHMgYnkgaW5kZXguCiAqCiAqICAgICBMaXN0IHN1cGVyaGVyb2VzID0gWyAnQmF0bWFuJywgJ1N1cGVybWFuJywgJ0hhcnJ5IFBvdHRlcicgXTsKICoKICogQSBTZXQgaXMgYW4gdW5vcmRlcmVkIGNvbGxlY3Rpb24gb2YgdW5pcXVlIG9iamVjdHMuCiAqIFlvdSBjYW5ub3QgZ2V0IGFuIGl0ZW0gYnkgaW5kZXggKHBvc2l0aW9uKS4KICogQWRkaW5nIGEgZHVwbGljYXRlIGl0ZW0gaGFzIG5vIGVmZmVjdC4KICoKICogICAgIFNldCB2aWxsYWlucyA9IG5ldyBTZXQoKTsKICogICAgIHZpbGxhaW5zLmFkZCgnSm9rZXInKTsKICogICAgIHZpbGxhaW5zLmFkZEFsbCggWydMZXggTHV0aGVyJywgJ1ZvbGRlbW9ydCddICk7CiAqCiAqIEEgTWFwIGlzIGFuIHVub3JkZXJlZCBjb2xsZWN0aW9uIG9mIGtleS12YWx1ZSBwYWlycy4KICogTWFwcyBhcmUgc29tZXRpbWVzIGNhbGxlZCBhc3NvY2lhdGl2ZSBhcnJheXMgYmVjYXVzZQogKiBtYXBzIGFzc29jaWF0ZSBhIGtleSB0byBzb21lIHZhbHVlIGZvciBlYXN5IHJldHJpZXZhbC4KICogS2V5cyBhcmUgdW5pcXVlLgogKiBVc2UgYSBNYXAgd2hlbiB5b3UgbmVlZCB0byBhY2Nlc3Mgb2JqZWN0cwogKiBieSBhIHVuaXF1ZSBpZGVudGlmaWVyLgogKgogKiAgICAgTWFwIHNpZGVraWNrcyA9IHsgJ0JhdG1hbic6ICdSb2JpbicsCiAqICAgICAgICAgICAgICAgICAgICAgICAnU3VwZXJtYW4nOiAnTG9pcyBMYW5lJywKICogICAgICAgICAgICAgICAgICAgICAgICdIYXJyeSBQb3R0ZXInOiAnUm9uIGFuZCBIZXJtaW9uZScgfTsKICoKICogSW4gYWRkaXRpb24gdG8gdGhlc2UgY2xhc3NlcywKICogZGFydDpjb3JlIGNvbnRhaW5zIFtJdGVyYWJsZV0sCiAqIGFuIGludGVyZmFjZSB0aGF0IGRlZmluZXMgZnVuY3Rpb25hbGl0eQogKiBjb21tb24gaW4gY29sbGVjdGlvbnMgb2Ygb2JqZWN0cy4KICogRXhhbXBsZXMgaW5jbHVkZSB0aGUgYWJpbGl0eQogKiB0byBydW4gYSBmdW5jdGlvbiBvbiBlYWNoIGVsZW1lbnQgaW4gdGhlIGNvbGxlY3Rpb24sCiAqIHRvIGFwcGx5IGEgdGVzdCB0byBlYWNoIGVsZW1lbnQsCiAqIHRvIHJldHJpZXZlIGFuIG9iamVjdCwgYW5kIHRvIGRldGVybWluZSBsZW5ndGguCiAqCiAqIEl0ZXJhYmxlIGlzIGltcGxlbWVudGVkIGJ5IExpc3QgYW5kIFNldCwKICogYW5kIHVzZWQgYnkgTWFwIGZvciBpdHMga2V5cyBhbmQgdmFsdWVzLgogKgogKiBGb3Igb3RoZXIga2luZHMgb2YgY29sbGVjdGlvbnMsIGNoZWNrIG91dCB0aGUKICogYGRhcnQ6Y29sbGVjdGlvbmAgbGlicmFyeS4KICoKICogIyMgRGF0ZSBhbmQgdGltZQogKgogKiBVc2UgW0RhdGVUaW1lXSB0byByZXByZXNlbnQgYSBwb2ludCBpbiB0aW1lCiAqIGFuZCBbRHVyYXRpb25dIHRvIHJlcHJlc2VudCBhIHNwYW4gb2YgdGltZS4KICoKICogWW91IGNhbiBjcmVhdGUgRGF0ZVRpbWUgb2JqZWN0cyB3aXRoIGNvbnN0cnVjdG9ycwogKiBvciBieSBwYXJzaW5nIGEgY29ycmVjdGx5IGZvcm1hdHRlZCBzdHJpbmcuCiAqCiAqICAgICBEYXRlVGltZSBub3cgPSBuZXcgRGF0ZVRpbWUubm93KCk7CiAqICAgICBEYXRlVGltZSBiZXJsaW5XYWxsRmVsbCA9IG5ldyBEYXRlVGltZSgxOTg5LCAxMSwgOSk7CiAqICAgICBEYXRlVGltZSBtb29uTGFuZGluZyA9IERhdGVUaW1lLnBhcnNlKCIxOTY5LTA3LTIwIik7CiAqCiAqIENyZWF0ZSBhIER1cmF0aW9uIG9iamVjdCBzcGVjaWZ5aW5nIHRoZSBpbmRpdmlkdWFsIHRpbWUgdW5pdHMuCiAqCiAqICAgICBEdXJhdGlvbiB0aW1lUmVtYWluaW5nID0gbmV3IER1cmF0aW9uKGhvdXJzOjU2LCBtaW51dGVzOjE0KTsKICoKICogSW4gYWRkaXRpb24gdG8gRGF0ZVRpbWUgYW5kIER1cmF0aW9uLAogKiBkYXJ0OmNvcmUgY29udGFpbnMgdGhlIFtTdG9wd2F0Y2hdIGNsYXNzIGZvciBtZWFzdXJpbmcgZWxhcHNlZCB0aW1lLgogKgogKiAjIyBVcmkKICoKICogQSBbVXJpXSBvYmplY3QgcmVwcmVzZW50cyBhIHVuaWZvcm0gcmVzb3VyY2UgaWRlbnRpZmllciwKICogd2hpY2ggaWRlbnRpZmllcyBhIHJlc291cmNlIG9uIHRoZSB3ZWIuCiAqCiAqICAgICBVcmkgZGFydGxhbmcgPSBVcmkucGFyc2UoJ2h0dHA6Ly9kYXJ0bGFuZy5vcmcvJyk7CiAqCiAqICMjIEVycm9ycwogKgogKiBUaGUgW0Vycm9yXSBjbGFzcyByZXByZXNlbnRzIHRoZSBvY2N1cnJlbmNlIG9mIGFuIGVycm9yCiAqIGR1cmluZyBydW50aW1lLgogKiBTdWJjbGFzc2VzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IHNwZWNpZmljIGtpbmRzIG9mIGVycm9ycy4KICoKICogIyMgT3RoZXIgZG9jdW1lbnRhdGlvbgogKgogKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gdXNlIHRoZSBidWlsdC1pbiB0eXBlcywgcmVmZXIgdG8gW0J1aWx0LWluCiAqIFR5cGVzXShodHRwOi8vd3d3LmRhcnRsYW5nLm9yZy9kb2NzL2RhcnQtdXAtYW5kLXJ1bm5pbmcvY29udGVudHMvY2gwMi5odG1sI2J1aWx0LWluLXR5cGVzKQogKiBpbiBDaGFwdGVyIDIgb2YKICogW0RhcnQ6IFVwIGFuZCBSdW5uaW5nXShodHRwOi8vd3d3LmRhcnRsYW5nLm9yZy9kb2NzL2RhcnQtdXAtYW5kLXJ1bm5pbmcvKS4KICoKICogQWxzbywgc2VlIFtkYXJ0OmNvcmUgLSBOdW1iZXJzLCBDb2xsZWN0aW9ucywgU3RyaW5ncywgYW5kCiAqIE1vcmVdKGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy9kb2NzL2RhcnQtdXAtYW5kLXJ1bm5pbmcvY2gwMy5odG1sI2RhcnRjb3JlLS0tbnVtYmVycy1jb2xsZWN0aW9ucy1zdHJpbmdzLWFuZC1tb3JlKQogKiBmb3IgbW9yZSBjb3ZlcmFnZSBvZiBjbGFzc2VzIGluIHRoaXMgcGFja2FnZS4KICoKICogVGhlCiAqIFtEYXJ0IExhbmd1YWdlIFNwZWNpZmljYXRpb25dKGh0dHA6Ly93d3cuZGFydGxhbmcub3JnL2RvY3Mvc3BlYy8pCiAqIHByb3ZpZGVzIHRlY2huaWNhbCBkZXRhaWxzLgogKgogKiB7QGNhdGVnb3J5IENvcmV9CiAqLwpsaWJyYXJ5IGRhcnQuY29yZTsKCmltcG9ydCAiZGFydDpjb2xsZWN0aW9uIjsKaW1wb3J0ICJkYXJ0Ol9pbnRlcm5hbCIgaGlkZSBTeW1ib2wsIExpbmtlZExpc3QsIExpbmtlZExpc3RFbnRyeTsKaW1wb3J0ICJkYXJ0Ol9pbnRlcm5hbCIgYXMgaW50ZXJuYWwgc2hvdyBTeW1ib2w7CmltcG9ydCAiZGFydDpjb252ZXJ0IgogICAgc2hvdwogICAgICAgIGFzY2lpLAogICAgICAgIGJhc2U2NCwKICAgICAgICBCYXNlNjRDb2RlYywKICAgICAgICBFbmNvZGluZywKICAgICAgICBsYXRpbjEsCiAgICAgICAgU3RyaW5nQ29udmVyc2lvblNpbmssCiAgICAgICAgdXRmODsKaW1wb3J0ICJkYXJ0Om1hdGgiIHNob3cgUmFuZG9tOyAvLyBVc2VkIGJ5IExpc3Quc2h1ZmZsZS4KaW1wb3J0ICJkYXJ0OnR5cGVkX2RhdGEiIHNob3cgVWludDhMaXN0LCBVaW50MTZMaXN0LCBFbmRpYW47CgpAU2luY2UoIjIuMSIpCmV4cG9ydCAiZGFydDphc3luYyIgc2hvdyBGdXR1cmUsIFN0cmVhbTsKCnBhcnQgImFubm90YXRpb25zLmRhcnQiOwpwYXJ0ICJiaWdpbnQuZGFydCI7CnBhcnQgImJvb2wuZGFydCI7CnBhcnQgImNvbXBhcmFibGUuZGFydCI7CnBhcnQgImRhdGVfdGltZS5kYXJ0IjsKcGFydCAiZG91YmxlLmRhcnQiOwpwYXJ0ICJkdXJhdGlvbi5kYXJ0IjsKcGFydCAiZXJyb3JzLmRhcnQiOwpwYXJ0ICJleGNlcHRpb25zLmRhcnQiOwpwYXJ0ICJleHBhbmRvLmRhcnQiOwpwYXJ0ICJmdW5jdGlvbi5kYXJ0IjsKcGFydCAiaWRlbnRpY2FsLmRhcnQiOwpwYXJ0ICJpbnQuZGFydCI7CnBhcnQgImludm9jYXRpb24uZGFydCI7CnBhcnQgIml0ZXJhYmxlLmRhcnQiOwpwYXJ0ICJpdGVyYXRvci5kYXJ0IjsKcGFydCAibGlzdC5kYXJ0IjsKcGFydCAibWFwLmRhcnQiOwpwYXJ0ICJudWxsLmRhcnQiOwpwYXJ0ICJudW0uZGFydCI7CnBhcnQgIm9iamVjdC5kYXJ0IjsKcGFydCAicGF0dGVybi5kYXJ0IjsKcGFydCAicHJpbnQuZGFydCI7CnBhcnQgInJlZ2V4cC5kYXJ0IjsKcGFydCAic2V0LmRhcnQiOwpwYXJ0ICJzaW5rLmRhcnQiOwpwYXJ0ICJzdGFja3RyYWNlLmRhcnQiOwpwYXJ0ICJzdG9wd2F0Y2guZGFydCI7CnBhcnQgInN0cmluZy5kYXJ0IjsKcGFydCAic3RyaW5nX2J1ZmZlci5kYXJ0IjsKcGFydCAic3RyaW5nX3NpbmsuZGFydCI7CnBhcnQgInN5bWJvbC5kYXJ0IjsKcGFydCAidHlwZS5kYXJ0IjsKcGFydCAidXJpLmRhcnQiOwqA0gBOTjwBBAMgOAMrAyEfJ0QoQS4DGwNQRzU+Ax8lIQMmA0QDQQNDAzo8NQNHOgMnUwMxPjkjAykDQic7PAMSAzUlAz4mOANEAzcvKgMhHjcDODg6FC0bAywyPwMhIislIDgkMwMsLAMxHgMUAy8vAzUvAyo8PANCA0QDKUgDCgM8KwM5Aw0DOxNAAxoDUF4TTgM9djEDB0UfAxQEEwEaQjEWCQ8QFRIQHg45PQEOKQEZFBIYFxQWFBgVFhcRGBYWEhESERQVExQREhgXFBsZFBIRAQlkYXJ0OmNvcmUwb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvY29tcGFyYWJsZS5kYXJ0jlUvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogVGhlIHNpZ25hdHVyZSBvZiBhIGdlbmVyaWMgY29tcGFyaXNvbiBmdW5jdGlvbi4KICoKICogQSBjb21wYXJpc29uIGZ1bmN0aW9uIHJlcHJlc2VudHMgYW4gb3JkZXJpbmcgb24gYSB0eXBlIG9mIG9iamVjdHMuCiAqIEEgdG90YWwgb3JkZXJpbmcgb24gYSB0eXBlIG1lYW5zIHRoYXQgZm9yIHR3byB2YWx1ZXMsIGVpdGhlciB0aGV5CiAqIGFyZSBlcXVhbCBvciBvbmUgaXMgZ3JlYXRlciB0aGFuIHRoZSBvdGhlciAoYW5kIHRoZSBsYXR0ZXIgbXVzdCB0aGVuIGJlCiAqIHNtYWxsZXIgdGhhbiB0aGUgZm9ybWVyKS4KICoKICogQSBbQ29tcGFyYXRvcl0gZnVuY3Rpb24gcmVwcmVzZW50cyBzdWNoIGEgdG90YWwgb3JkZXJpbmcgYnkgcmV0dXJuaW5nCiAqCiAqICogYSBuZWdhdGl2ZSBpbnRlZ2VyIGlmIFthXSBpcyBzbWFsbGVyIHRoYW4gW2JdLAogKiAqIHplcm8gaWYgW2FdIGlzIGVxdWFsIHRvIFtiXSwgYW5kCiAqICogYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIFthXSBpcyBncmVhdGVyIHRoYW4gW2JdLgogKi8KdHlwZWRlZiBDb21wYXJhdG9yPFQ+ID0gaW50IEZ1bmN0aW9uKFQgYSwgVCBiKTsKCi8qKgogKiBJbnRlcmZhY2UgdXNlZCBieSB0eXBlcyB0aGF0IGhhdmUgYW4gaW50cmluc2ljIG9yZGVyaW5nLgogKgogKiBUaGUgW2NvbXBhcmVUb10gb3BlcmF0aW9uIGRlZmluZXMgYSB0b3RhbCBvcmRlcmluZyBvZiBvYmplY3RzLAogKiB3aGljaCBjYW4gYmUgdXNlZCBmb3Igb3JkZXJpbmcgYW5kIHNvcnRpbmcuCiAqCiAqIFRoZSBbQ29tcGFyYWJsZV0gaW50ZXJmYWNlIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgbmF0dXJhbCBvcmRlcmluZyBvZiBhIHR5cGUuCiAqIElmIGEgdHlwZSBjYW4gYmUgb3JkZXJlZCBpbiBtb3JlIHRoYW4gb25lIHdheSwKICogYW5kIG5vbmUgb2YgdGhlbSBpcyB0aGUgb2J2aW91cyBuYXR1cmFsIG9yZGVyaW5nLAogKiB0aGVuIGl0IG1pZ2h0IGJlIGJldHRlciBub3QgdG8gdXNlIHRoZSBbQ29tcGFyYWJsZV0gaW50ZXJmYWNlLAogKiBhbmQgdG8gcHJvdmlkZSBzZXBhcmF0ZSBbQ29tcGFyYXRvcl1zIGluc3RlYWQuCiAqCiAqIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIG9yZGVyIG9mIGEgW0NvbXBhcmFibGVdIGFncmVlcwogKiB3aXRoIGl0cyBvcGVyYXRvciBbb3BlcmF0b3IgPT1dIGVxdWFsaXR5IChgYS5jb21wYXJlVG8oYikgPT0gMGAgaWZmIGBhID09IGJgKSwKICogYnV0IHRoaXMgaXMgbm90IGEgcmVxdWlyZW1lbnQuCiAqIEZvciBleGFtcGxlLCBbZG91YmxlXSBhbmQgW0RhdGVUaW1lXSBoYXZlIGBjb21wYXJlVG9gIG1ldGhvZHMKICogdGhhdCBkbyBub3QgYWdyZWUgd2l0aCBvcGVyYXRvciBbb3BlcmF0b3IgPT1dLgogKiBGb3IgZG91YmxlcyB0aGUgW2NvbXBhcmVUb10gbWV0aG9kIGlzIG1vcmUgcHJlY2lzZSB0aGFuIHRoZSBlcXVhbGl0eSwKICogYW5kIGZvciBbRGF0ZVRpbWVdIGl0IGlzIGxlc3MgcHJlY2lzZS4KICoKICogRXhhbXBsZXM6CiAqCiAqICAgICAgKDAuMCkuY29tcGFyZVRvKC0wLjApOyAgLy8gPT4gMQogKiAgICAgIDAuMCA9PSAtMC4wOyAgICAgICAgICAgIC8vID0+IHRydWUKICogICAgICB2YXIgZHQgPSBuZXcgRGF0ZVRpbWUubm93KCk7CiAqICAgICAgdmFyIGR0MiA9IGR0LnRvVXRjKCk7CiAqICAgICAgZHQgPT0gZHQyOyAgICAgICAgICAgICAgLy8gPT4gZmFsc2UKICogICAgICBkdC5jb21wYXJlVG8oZHQyKTsgICAgICAvLyA9PiAwCiAqCiAqIFRoZSBbQ29tcGFyYWJsZV0gaW50ZXJmYWNlIGRvZXMgbm90IGltcGx5IHRoZSBleGlzdGVuY2UKICogb2YgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzIGA8YCwgYDw9YCwgYD5gIGFuZCBgPj1gLgogKiBUaGVzZSBzaG91bGQgb25seSBiZSBkZWZpbmVkCiAqIGlmIHRoZSBvcmRlcmluZyBpcyBhIGxlc3MtdGhhbi9ncmVhdGVyLXRoYW4gb3JkZXJpbmcsCiAqIHRoYXQgaXMsIGFuIG9yZGVyaW5nIHdoZXJlIHlvdSB3b3VsZCBuYXR1cmFsbHkKICogdXNlIHRoZSB3b3JkcyAibGVzcyB0aGFuIiBhYm91dCB0aGUgb3JkZXIgb2YgdHdvIGVsZW1lbnRzLgogKgogKiBJZiB0aGUgZXF1YWxpdHkgb3BlcmF0b3IgYW5kIFtjb21wYXJlVG9dIGRpc2FncmVlLAogKiB0aGUgY29tcGFyaXNvbiBvcGVyYXRvcnMgc2hvdWxkIGZvbGxvdyB0aGUgZXF1YWxpdHkgb3BlcmF0b3IsCiAqIGFuZCB3aWxsIGxpa2VseSBhbHNvIGRpc2FncmVlIHdpdGggW2NvbXBhcmVUb10uCiAqIE90aGVyd2lzZSB0aGV5IHNob3VsZCBtYXRjaCB0aGUgW2NvbXBhcmVUb10gbWV0aG9kLAogKiBzbyB0aGF0IGBhIDwgYmAgaWZmIGBhLmNvbXBhcmVUbyhiKSA8IDBgLgogKgogKiBUaGUgW2RvdWJsZV0gY2xhc3MgZGVmaW5lcyBjb21wYXJpc29uIG9wZXJhdG9ycwogKiB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGggZXF1YWxpdHkuCiAqIFRoZSBvcGVyYXRvcnMgZGlmZmVyIGZyb20gYGRvdWJsZS5jb21wYXJlVG9gIG9uIC0wLjAgYW5kIE5hTi4KICoKICogVGhlIFtEYXRlVGltZV0gY2xhc3MgaGFzIG5vIGNvbXBhcmlzb24gb3BlcmF0b3JzLCBpbnN0ZWFkIGl0IGhhcyB0aGUgbW9yZQogKiBwcmVjaXNlbHkgbmFtZWQgW0RhdGVUaW1lLmlzQmVmb3JlXSBhbmQgW0RhdGVUaW1lLmlzQWZ0ZXJdLgogKi8KYWJzdHJhY3QgY2xhc3MgQ29tcGFyYWJsZTxUPiB7CiAgLyoqCiAgICogQ29tcGFyZXMgdGhpcyBvYmplY3QgdG8gYW5vdGhlciBbQ29tcGFyYWJsZV0KICAgKgogICAqIFJldHVybnMgYSB2YWx1ZSBsaWtlIGEgW0NvbXBhcmF0b3JdIHdoZW4gY29tcGFyaW5nIGB0aGlzYCB0byBbb3RoZXJdLgogICAqIFRoYXQgaXMsIGl0IHJldHVybnMgYSBuZWdhdGl2ZSBpbnRlZ2VyIGlmIGB0aGlzYCBpcyBvcmRlcmVkIGJlZm9yZSBbb3RoZXJdLAogICAqIGEgcG9zaXRpdmUgaW50ZWdlciBpZiBgdGhpc2AgaXMgb3JkZXJlZCBhZnRlciBbb3RoZXJdLAogICAqIGFuZCB6ZXJvIGlmIGB0aGlzYCBhbmQgW290aGVyXSBhcmUgb3JkZXJlZCB0b2dldGhlci4KICAgKgogICAqIFRoZSBbb3RoZXJdIGFyZ3VtZW50IG11c3QgYmUgYSB2YWx1ZSB0aGF0IGlzIGNvbXBhcmFibGUgdG8gdGhpcyBvYmplY3QuCiAgICovCiAgaW50IGNvbXBhcmVUbyhUIG90aGVyKTsKCiAgLyoqCiAgICogQSBbQ29tcGFyYXRvcl0gdGhhdCBjb21wYXJlcyBvbmUgY29tcGFyYWJsZSB0byBhbm90aGVyLgogICAqCiAgICogSXQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIGBhLmNvbXBhcmVUbyhiKWAuCiAgICoKICAgKiBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCBjb21wYXJhdG9yCiAgICogZm9yIG9yZGVyaW5nIGNvbGxlY3Rpb25zLCBmb3IgZXhhbXBsZSBpbiB0aGUgW0xpc3RdIHNvcnQgZnVuY3Rpb24uCiAgICovCiAgc3RhdGljIGludCBjb21wYXJlKENvbXBhcmFibGUgYSwgQ29tcGFyYWJsZSBiKSA9PiBhLmNvbXBhcmVUbyhiKTsKfQpgAE5OPAETAQQzA0ZFSx0DSQM0JjQEMAEEPANCLwNRMjVCMgM9UiJBMkkqAw0DKCslHiwoAzs4IDkyPgM2QTM3LQMzJkEDTT8EHwYyBUtRPDoFTQYaAQY9BTAFPUgGRAIBGWRhcnQ6Y29yZS9jb21wYXJhYmxlLmRhcnQub3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvaXRlcmFibGUuZGFydMAAYswvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogQSBjb2xsZWN0aW9uIG9mIHZhbHVlcywgb3IgImVsZW1lbnRzIiwgdGhhdCBjYW4gYmUgYWNjZXNzZWQgc2VxdWVudGlhbGx5LgogKgogKiBUaGUgZWxlbWVudHMgb2YgdGhlIGl0ZXJhYmxlIGFyZSBhY2Nlc3NlZCBieSBnZXR0aW5nIGFuIFtJdGVyYXRvcl0KICogdXNpbmcgdGhlIFtpdGVyYXRvcl0gZ2V0dGVyLCBhbmQgdXNpbmcgaXQgdG8gc3RlcCB0aHJvdWdoIHRoZSB2YWx1ZXMuCiAqIFN0ZXBwaW5nIHdpdGggdGhlIGl0ZXJhdG9yIGlzIGRvbmUgYnkgY2FsbGluZyBbSXRlcmF0b3IubW92ZU5leHRdLAogKiBhbmQgaWYgdGhlIGNhbGwgcmV0dXJucyBgdHJ1ZWAsCiAqIHRoZSBpdGVyYXRvciBoYXMgbm93IG1vdmVkIHRvIHRoZSBuZXh0IGVsZW1lbnQsCiAqIHdoaWNoIGlzIHRoZW4gYXZhaWxhYmxlIGFzIFtJdGVyYXRvci5jdXJyZW50XS4KICogSWYgdGhlIGNhbGwgcmV0dXJucyBgZmFsc2VgLCB0aGVyZSBhcmUgbm8gbW9yZSBlbGVtZW50cywKICogYW5kIGBpdGVyYXRvci5jdXJyZW50YCByZXR1cm5zIGBudWxsYC4KICoKICogWW91IGNhbiBjcmVhdGUgbW9yZSB0aGFuIG9uZSBpdGVyYXRvciBmcm9tIHRoZSBzYW1lIGBJdGVyYWJsZWAuCiAqIEVhY2ggdGltZSBgaXRlcmF0b3JgIGlzIHJlYWQsIGl0IHJldHVybnMgYSBuZXcgaXRlcmF0b3IsCiAqIGFuZCBkaWZmZXJlbnQgaXRlcmF0b3JzIGNhbiBiZSBzdGVwcGVkIHRocm91Z2ggaW5kZXBlbmRlbnRseSwKICogZWFjaCBnaXZpbmcgYWNjZXNzIHRvIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhlIGl0ZXJhYmxlLgogKiBUaGUgaXRlcmF0b3JzIG9mIHRoZSBzYW1lIGl0ZXJhYmxlICpzaG91bGQqIHByb3ZpZGUgdGhlIHNhbWUgdmFsdWVzCiAqIGluIHRoZSBzYW1lIG9yZGVyICh1bmxlc3MgdGhlIHVuZGVybHlpbmcgY29sbGVjdGlvbiBpcyBtb2RpZmllZCBiZXR3ZWVuCiAqIHRoZSBpdGVyYXRpb25zLCB3aGljaCBzb21lIGNvbGxlY3Rpb25zIGFsbG93KS4KICoKICogWW91IGNhbiBhbHNvIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMgb2YgYW4gYEl0ZXJhYmxlYAogKiB1c2luZyB0aGUgZm9yLWluIGxvb3AgY29uc3RydWN0LCB3aGljaCB1c2VzIHRoZSBgaXRlcmF0b3JgIGdldHRlciBiZWhpbmQgdGhlCiAqIHNjZW5lcy4KICogRm9yIGV4YW1wbGUsIHlvdSBjYW4gaXRlcmF0ZSBvdmVyIGFsbCBvZiB0aGUga2V5cyBvZiBhIFtNYXBdLAogKiBiZWNhdXNlIGBNYXBgIGtleXMgYXJlIGl0ZXJhYmxlLgogKgogKiAgICAgTWFwIGtpZHNCb29rcyA9IHsnTWF0aWxkYSc6ICdSb2FsZCBEYWhsJywKICogICAgICAgICAgICAgICAgICAgICAgJ0dyZWVuIEVnZ3MgYW5kIEhhbSc6ICdEciBTZXVzcycsCiAqICAgICAgICAgICAgICAgICAgICAgICdXaGVyZSB0aGUgV2lsZCBUaGluZ3MgQXJlJzogJ01hdXJpY2UgU2VuZGFrJ307CiAqICAgICBmb3IgKHZhciBib29rIGluIGtpZHNCb29rcy5rZXlzKSB7CiAqICAgICAgIHByaW50KCckYm9vayB3YXMgd3JpdHRlbiBieSAke2tpZHNCb29rc1tib29rXX0nKTsKICogICAgIH0KICoKICogVGhlIFtMaXN0XSBhbmQgW1NldF0gY2xhc3NlcyBhcmUgYm90aCBgSXRlcmFibGVgLAogKiBhcyBhcmUgbW9zdCBjbGFzc2VzIGluIHRoZSBgZGFydDpjb2xsZWN0aW9uYCBsaWJyYXJ5LgogKgogKiBTb21lIFtJdGVyYWJsZV0gY29sbGVjdGlvbnMgY2FuIGJlIG1vZGlmaWVkLgogKiBBZGRpbmcgYW4gZWxlbWVudCB0byBhIGBMaXN0YCBvciBgU2V0YCB3aWxsIGNoYW5nZSB3aGljaCBlbGVtZW50cyBpdAogKiBjb250YWlucywgYW5kIGFkZGluZyBhIG5ldyBrZXkgdG8gYSBgTWFwYCBjaGFuZ2VzIHRoZSBlbGVtZW50cyBvZiBbTWFwLmtleXNdLgogKiBJdGVyYXRvcnMgY3JlYXRlZCBhZnRlciB0aGUgY2hhbmdlIHdpbGwgcHJvdmlkZSB0aGUgbmV3IGVsZW1lbnRzLCBhbmQgbWF5CiAqIG9yIG1heSBub3QgcHJlc2VydmUgdGhlIG9yZGVyIG9mIGV4aXN0aW5nIGVsZW1lbnRzCiAqIChmb3IgZXhhbXBsZSwgYSBbSGFzaFNldF0gbWF5IGNvbXBsZXRlbHkgY2hhbmdlIGl0cyBvcmRlciB3aGVuIGEgc2luZ2xlCiAqIGVsZW1lbnQgaXMgYWRkZWQpLgogKgogKiBDaGFuZ2luZyBhIGNvbGxlY3Rpb24gKndoaWxlKiBpdCBpcyBiZWluZyBpdGVyYXRlZAogKiBpcyBnZW5lcmFsbHkgKm5vdCogYWxsb3dlZC4KICogRG9pbmcgc28gd2lsbCBicmVhayB0aGUgaXRlcmF0aW9uLCB3aGljaCBpcyB0eXBpY2FsbHkgc2lnbmFsbGVkCiAqIGJ5IHRocm93aW5nIGEgW0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcl0KICogdGhlIG5leHQgdGltZSBbSXRlcmF0b3IubW92ZU5leHRdIGlzIGNhbGxlZC4KICogVGhlIGN1cnJlbnQgdmFsdWUgb2YgW0l0ZXJhdG9yLmN1cnJlbnRdIGdldHRlcgogKiBzaG91bGQgbm90IGJlIGFmZmVjdGVkIGJ5IHRoZSBjaGFuZ2UgaW4gdGhlIGNvbGxlY3Rpb24sCiAqIHRoZSBgY3VycmVudGAgdmFsdWUgd2FzIHNldCBieSB0aGUgcHJldmlvdXMgY2FsbCB0byBbSXRlcmF0b3IubW92ZU5leHRdLgogKgogKiBTb21lIGl0ZXJhYmxlcyBjb21wdXRlIHRoZWlyIGVsZW1lbnRzIGR5bmFtaWNhbGx5IGV2ZXJ5IHRpbWUgdGhleSBhcmUKICogaXRlcmF0ZWQsIGxpa2UgdGhlIG9uZSByZXR1cm5lZCBieSBbSXRlcmFibGUuZ2VuZXJhdGVdIG9yIHRoZSBpdGVyYWJsZQogKiByZXR1cm5lZCBieSBhIGBzeW5jKmAgZ2VuZXJhdG9yIGZ1bmN0aW9uLiBJZiB0aGUgY29tcHV0YXRpb24gZG9lc24ndCBkZXBlbmQKICogb24gb3RoZXIgb2JqZWN0cyB0aGF0IG1heSBjaGFuZ2UsIHRoZW4gdGhlIGdlbmVyYXRlZCBzZXF1ZW5jZSBzaG91bGQgYmUKICogdGhlIHNhbWUgb25lIGV2ZXJ5IHRpbWUgaXQncyBpdGVyYXRlZC4KICoKICogVGhlIG1lbWJlcnMgb2YgYEl0ZXJhYmxlYCwgb3RoZXIgdGhhbiBgaXRlcmF0b3JgIGl0c2VsZiwKICogd29yayBieSBsb29raW5nIGF0IHRoZSBlbGVtZW50cyBvZiB0aGUgaXRlcmFibGUuCiAqIFRoaXMgY2FuIGJlIGltcGxlbWVudGVkIGJ5IHJ1bm5pbmcgdGhyb3VnaCB0aGUgW2l0ZXJhdG9yXSwgYnV0IHNvbWUgY2xhc3NlcwogKiBtYXkgaGF2ZSBtb3JlIGVmZmljaWVudCB3YXlzIG9mIGZpbmRpbmcgdGhlIHJlc3VsdAogKiAobGlrZSBbbGFzdF0gb3IgW2xlbmd0aF0gb24gYSBbTGlzdF0sIG9yIFtjb250YWluc10gb24gYSBbU2V0XSkuCiAqCiAqIFRoZSBtZXRob2RzIHRoYXQgcmV0dXJuIGFub3RoZXIgYEl0ZXJhYmxlYCAobGlrZSBbbWFwXSBhbmQgW3doZXJlXSkKICogYXJlIGFsbCAqbGF6eSogLSB0aGV5IHdpbGwgaXRlcmF0ZSB0aGUgb3JpZ2luYWwgKGFzIG5lY2Vzc2FyeSkKICogZXZlcnkgdGltZSB0aGUgcmV0dXJuZWQgaXRlcmFibGUgaXMgaXRlcmF0ZWQsIGFuZCBub3QgYmVmb3JlLgogKgogKiBTaW5jZSBhbiBpdGVyYWJsZSBtYXkgYmUgaXRlcmF0ZWQgbW9yZSB0aGFuIG9uY2UsIGl0J3Mgbm90IHJlY29tbWVuZGVkIHRvCiAqIGhhdmUgZGV0ZWN0YWJsZSBzaWRlLWVmZmVjdHMgaW4gdGhlIGl0ZXJhdG9yLgogKiBGb3IgbWV0aG9kcyBsaWtlIFttYXBdIGFuZCBbd2hlcmVdLCB0aGUgcmV0dXJuZWQgaXRlcmFibGUgd2lsbCBleGVjdXRlIHRoZQogKiBhcmd1bWVudCBmdW5jdGlvbiBvbiBldmVyeSBpdGVyYXRpb24sIHNvIHRob3NlIGZ1bmN0aW9ucyBzaG91bGQgYWxzbyBub3QKICogaGF2ZSBzaWRlIGVmZmVjdHMuCiAqLwphYnN0cmFjdCBjbGFzcyBJdGVyYWJsZTxFPiB7CiAgLy8gVE9ETyhscm4pOiBXaGVuIHdlIGFsbG93IGZvcndhcmRpbmcgY29uc3QgY29uc3RydWN0b3JzIHRocm91Z2gKICAvLyBtaXhpbiBhcHBsaWNhdGlvbnMsIG1ha2UgdGhpcyBjbGFzcyBpbXBsZW1lbnQgW0l0ZXJhYmxlTWl4aW5dLgogIGNvbnN0IEl0ZXJhYmxlKCk7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gYEl0ZXJhYmxlYCB3aGljaCBnZW5lcmF0ZXMgaXRzIGVsZW1lbnRzIGR5bmFtaWNhbGx5LgogICAqCiAgICogVGhlIGdlbmVyYXRlZCBpdGVyYWJsZSBoYXMgW2NvdW50XSBlbGVtZW50cywKICAgKiBhbmQgdGhlIGVsZW1lbnQgYXQgaW5kZXggYG5gIGlzIGNvbXB1dGVkIGJ5IGNhbGxpbmcgYGdlbmVyYXRvcihuKWAuCiAgICogVmFsdWVzIGFyZSBub3QgY2FjaGVkLCBzbyBlYWNoIGl0ZXJhdGlvbiBjb21wdXRlcyB0aGUgdmFsdWVzIGFnYWluLgogICAqCiAgICogSWYgW2dlbmVyYXRvcl0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYW4gaWRlbnRpdHkgZnVuY3Rpb24KICAgKiBvbiBpbnRlZ2VycyBgKGludCB4KSA9PiB4YCwgc28gaXQgbWF5IG9ubHkgYmUgb21pdHRlZCBpZiB0aGUgdHlwZQogICAqIHBhcmFtZXRlciBhbGxvd3MgaW50ZWdlciB2YWx1ZXMuIFRoYXQgaXMsIGlmIFtFXSBpcyBhIHN1cGVyLXR5cGUKICAgKiBvZiBbaW50XS4KICAgKgogICAqIEFzIGFuIGBJdGVyYWJsZWAsIGBuZXcgSXRlcmFibGUuZ2VuZXJhdGUobiwgZ2VuZXJhdG9yKSlgIGlzIGVxdWl2YWxlbnQgdG8KICAgKiBgY29uc3QgWzAsIC4uLiwgbiAtIDFdLm1hcChnZW5lcmF0b3IpYC4KICAgKi8KICBmYWN0b3J5IEl0ZXJhYmxlLmdlbmVyYXRlKGludCBjb3VudCwgW0UgZ2VuZXJhdG9yKGludCBpbmRleCldKSB7CiAgICBpZiAoY291bnQgPD0gMCkgcmV0dXJuIEVtcHR5SXRlcmFibGU8RT4oKTsKICAgIHJldHVybiBfR2VuZXJhdG9ySXRlcmFibGU8RT4oY291bnQsIGdlbmVyYXRvcik7CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGFuIGVtcHR5IGl0ZXJhYmxlLgogICAqCiAgICogVGhlIGVtcHR5IGl0ZXJhYmxlIGhhcyBubyBlbGVtZW50cywgYW5kIGl0ZXJhdGluZyBpdCBhbHdheXMgc3RvcHMKICAgKiBpbW1lZGlhdGVseS4KICAgKi8KICBjb25zdCBmYWN0b3J5IEl0ZXJhYmxlLmVtcHR5KCkgPSBFbXB0eUl0ZXJhYmxlPEU+OwoKICAvKioKICAgKiBBZGFwdHMgW3NvdXJjZV0gdG8gYmUgYW4gYEl0ZXJhYmxlPFQ+YC4KICAgKgogICAqIEFueSB0aW1lIHRoZSBpdGVyYWJsZSB3b3VsZCBwcm9kdWNlIGFuIGVsZW1lbnQgdGhhdCBpcyBub3QgYSBbVF0sCiAgICogdGhlIGVsZW1lbnQgYWNjZXNzIHdpbGwgdGhyb3cuIElmIGFsbCBlbGVtZW50cyBvZiBbc291cmNlXSBhcmUgYWN0dWFsbHkKICAgKiBpbnN0YW5jZXMgb2YgW1RdLCBvciBpZiBvbmx5IGVsZW1lbnRzIHRoYXQgYXJlIGFjdHVhbGx5IGluc3RhbmNlcyBvZiBbVF0KICAgKiBhcmUgYWNjZXNzZWQsIHRoZW4gdGhlIHJlc3VsdGluZyBpdGVyYWJsZSBjYW4gYmUgdXNlZCBhcyBhbiBgSXRlcmFibGU8VD5gLgogICAqLwogIHN0YXRpYyBJdGVyYWJsZTxUPiBjYXN0RnJvbTxTLCBUPihJdGVyYWJsZTxTPiBzb3VyY2UpID0+CiAgICAgIENhc3RJdGVyYWJsZTxTLCBUPihzb3VyY2UpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IGBJdGVyYXRvcmAgdGhhdCBhbGxvd3MgaXRlcmF0aW5nIHRoZSBlbGVtZW50cyBvZiB0aGlzCiAgICogYEl0ZXJhYmxlYC4KICAgKgogICAqIEl0ZXJhYmxlIGNsYXNzZXMgbWF5IHNwZWNpZnkgdGhlIGl0ZXJhdGlvbiBvcmRlciBvZiB0aGVpciBlbGVtZW50cwogICAqIChmb3IgZXhhbXBsZSBbTGlzdF0gYWx3YXlzIGl0ZXJhdGUgaW4gaW5kZXggb3JkZXIpLAogICAqIG9yIHRoZXkgbWF5IGxlYXZlIGl0IHVuc3BlY2lmaWVkIChmb3IgZXhhbXBsZSBhIGhhc2gtYmFzZWQgW1NldF0KICAgKiBtYXkgaXRlcmF0ZSBpbiBhbnkgb3JkZXIpLgogICAqCiAgICogRWFjaCB0aW1lIGBpdGVyYXRvcmAgaXMgcmVhZCwgaXQgcmV0dXJucyBhIG5ldyBpdGVyYXRvciwKICAgKiB3aGljaCBjYW4gYmUgdXNlZCB0byBpdGVyYXRlIHRocm91Z2ggYWxsIHRoZSBlbGVtZW50cyBhZ2Fpbi4KICAgKiBUaGUgaXRlcmF0b3JzIG9mIHRoZSBzYW1lIGl0ZXJhYmxlIGNhbiBiZSBzdGVwcGVkIHRocm91Z2ggaW5kZXBlbmRlbnRseSwKICAgKiBidXQgc2hvdWxkIHJldHVybiB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBvcmRlciwKICAgKiBhcyBsb25nIGFzIHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24gaXNuJ3QgY2hhbmdlZC4KICAgKgogICAqIE1vZGlmeWluZyB0aGUgY29sbGVjdGlvbiBtYXkgY2F1c2UgbmV3IGl0ZXJhdG9ycyB0byBwcm9kdWNlCiAgICogZGlmZmVyZW50IGVsZW1lbnRzLCBhbmQgbWF5IGNoYW5nZSB0aGUgb3JkZXIgb2YgZXhpc3RpbmcgZWxlbWVudHMuCiAgICogQSBbTGlzdF0gc3BlY2lmaWVzIGl0cyBpdGVyYXRpb24gb3JkZXIgcHJlY2lzZWx5LAogICAqIHNvIG1vZGlmeWluZyB0aGUgbGlzdCBjaGFuZ2VzIHRoZSBpdGVyYXRpb24gb3JkZXIgcHJlZGljdGFibHkuCiAgICogQSBoYXNoLWJhc2VkIFtTZXRdIG1heSBjaGFuZ2UgaXRzIGl0ZXJhdGlvbiBvcmRlciBjb21wbGV0ZWx5CiAgICogd2hlbiBhZGRpbmcgYSBuZXcgZWxlbWVudCB0byB0aGUgc2V0LgogICAqCiAgICogTW9kaWZ5aW5nIHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24gYWZ0ZXIgY3JlYXRpbmcgdGhlIG5ldyBpdGVyYXRvcgogICAqIG1heSBjYXVzZSBhbiBlcnJvciB0aGUgbmV4dCB0aW1lIFtJdGVyYXRvci5tb3ZlTmV4dF0gaXMgY2FsbGVkCiAgICogb24gdGhhdCBpdGVyYXRvci4KICAgKiBBbnkgKm1vZGlmaWFibGUqIGl0ZXJhYmxlIGNsYXNzIHNob3VsZCBzcGVjaWZ5IHdoaWNoIG9wZXJhdGlvbnMgd2lsbAogICAqIGJyZWFrIGl0ZXJhdGlvbi4KICAgKi8KICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3I7CgogIC8qKgogICAqIFByb3ZpZGVzIGEgdmlldyBvZiB0aGlzIGl0ZXJhYmxlIGFzIGFuIGl0ZXJhYmxlIG9mIFtSXSBpbnN0YW5jZXMuCiAgICoKICAgKiBJZiB0aGlzIGl0ZXJhYmxlIG9ubHkgY29udGFpbnMgaW5zdGFuY2VzIG9mIFtSXSwgYWxsIG9wZXJhdGlvbnMKICAgKiB3aWxsIHdvcmsgY29ycmVjdGx5LiBJZiBhbnkgb3BlcmF0aW9uIHRyaWVzIHRvIGFjY2VzcyBhbiBlbGVtZW50CiAgICogdGhhdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgW1JdLCB0aGUgYWNjZXNzIHdpbGwgdGhyb3cgaW5zdGVhZC4KICAgKgogICAqIFdoZW4gdGhlIHJldHVybmVkIGl0ZXJhYmxlIGNyZWF0ZXMgYSBuZXcgb2JqZWN0IHRoYXQgZGVwZW5kcyBvbgogICAqIHRoZSB0eXBlIFtSXSwgZS5nLiwgZnJvbSBbdG9MaXN0XSwgaXQgd2lsbCBoYXZlIGV4YWN0bHkgdGhlIHR5cGUgW1JdLgogICAqLwogIEl0ZXJhYmxlPFI+IGNhc3Q8Uj4oKSA9PiBJdGVyYWJsZS5jYXN0RnJvbTxFLCBSPih0aGlzKTsKICAvKioKICAgKiBSZXR1cm5zIHRoZSBsYXp5IGNvbmNhdGVudGF0aW9uIG9mIHRoaXMgaXRlcmFibGUgYW5kIFtvdGhlcl0uCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgaXRlcmFibGUgd2lsbCBwcm92aWRlIHRoZSBzYW1lIGVsZW1lbnRzIGFzIHRoaXMgaXRlcmFibGUsCiAgICogYW5kLCBhZnRlciB0aGF0LCB0aGUgZWxlbWVudHMgb2YgW290aGVyXSwgaW4gdGhlIHNhbWUgb3JkZXIgYXMgaW4gdGhlCiAgICogb3JpZ2luYWwgaXRlcmFibGVzLgogICAqLwogIEl0ZXJhYmxlPEU+IGZvbGxvd2VkQnkoSXRlcmFibGU8RT4gb3RoZXIpIHsKICAgIGlmICh0aGlzIGlzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+KSB7CiAgICAgIHJldHVybiBGb2xsb3dlZEJ5SXRlcmFibGU8RT4uZmlyc3RFZmZpY2llbnQodGhpcywgb3RoZXIpOwogICAgfQogICAgcmV0dXJuIEZvbGxvd2VkQnlJdGVyYWJsZTxFPih0aGlzLCBvdGhlcik7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IGxhenkgW0l0ZXJhYmxlXSB3aXRoIGVsZW1lbnRzIHRoYXQgYXJlIGNyZWF0ZWQgYnkKICAgKiBjYWxsaW5nIGBmYCBvbiBlYWNoIGVsZW1lbnQgb2YgdGhpcyBgSXRlcmFibGVgIGluIGl0ZXJhdGlvbiBvcmRlci4KICAgKgogICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSB2aWV3IG9mIHRoZSBtYXBwZWQgZWxlbWVudHMuIEFzIGxvbmcgYXMgdGhlCiAgICogcmV0dXJuZWQgW0l0ZXJhYmxlXSBpcyBub3QgaXRlcmF0ZWQgb3ZlciwgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIFtmXSB3aWxsCiAgICogbm90IGJlIGludm9rZWQuIFRoZSB0cmFuc2Zvcm1lZCBlbGVtZW50cyB3aWxsIG5vdCBiZSBjYWNoZWQuIEl0ZXJhdGluZwogICAqIG11bHRpcGxlIHRpbWVzIG92ZXIgdGhlIHJldHVybmVkIFtJdGVyYWJsZV0gd2lsbCBpbnZva2UgdGhlIHN1cHBsaWVkCiAgICogZnVuY3Rpb24gW2ZdIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lIGVsZW1lbnQuCiAgICoKICAgKiBNZXRob2RzIG9uIHRoZSByZXR1cm5lZCBpdGVyYWJsZSBhcmUgYWxsb3dlZCB0byBvbWl0IGNhbGxpbmcgYGZgCiAgICogb24gYW55IGVsZW1lbnQgd2hlcmUgdGhlIHJlc3VsdCBpc24ndCBuZWVkZWQuCiAgICogRm9yIGV4YW1wbGUsIFtlbGVtZW50QXRdIG1heSBjYWxsIGBmYCBvbmx5IG9uY2UuCiAgICovCiAgSXRlcmFibGU8VD4gbWFwPFQ+KFQgZihFIGUpKSA9PiBNYXBwZWRJdGVyYWJsZTxFLCBUPih0aGlzLCBmKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBsYXp5IFtJdGVyYWJsZV0gd2l0aCBhbGwgZWxlbWVudHMgdGhhdCBzYXRpc2Z5IHRoZQogICAqIHByZWRpY2F0ZSBbdGVzdF0uCiAgICoKICAgKiBUaGUgbWF0Y2hpbmcgZWxlbWVudHMgaGF2ZSB0aGUgc2FtZSBvcmRlciBpbiB0aGUgcmV0dXJuZWQgaXRlcmFibGUKICAgKiBhcyB0aGV5IGhhdmUgaW4gW2l0ZXJhdG9yXS4KICAgKgogICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSB2aWV3IG9mIHRoZSBtYXBwZWQgZWxlbWVudHMuCiAgICogQXMgbG9uZyBhcyB0aGUgcmV0dXJuZWQgW0l0ZXJhYmxlXSBpcyBub3QgaXRlcmF0ZWQgb3ZlciwKICAgKiB0aGUgc3VwcGxpZWQgZnVuY3Rpb24gW3Rlc3RdIHdpbGwgbm90IGJlIGludm9rZWQuCiAgICogSXRlcmF0aW5nIHdpbGwgbm90IGNhY2hlIHJlc3VsdHMsIGFuZCB0aHVzIGl0ZXJhdGluZyBtdWx0aXBsZSB0aW1lcyBvdmVyCiAgICogdGhlIHJldHVybmVkIFtJdGVyYWJsZV0gbWF5IGludm9rZSB0aGUgc3VwcGxpZWQKICAgKiBmdW5jdGlvbiBbdGVzdF0gbXVsdGlwbGUgdGltZXMgb24gdGhlIHNhbWUgZWxlbWVudC4KICAgKi8KICBJdGVyYWJsZTxFPiB3aGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gV2hlcmVJdGVyYWJsZTxFPih0aGlzLCB0ZXN0KTsKCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBsYXp5IFtJdGVyYWJsZV0gd2l0aCBhbGwgZWxlbWVudHMgdGhhdCBoYXZlIHR5cGUgW1RdLgogICAqCiAgICogVGhlIG1hdGNoaW5nIGVsZW1lbnRzIGhhdmUgdGhlIHNhbWUgb3JkZXIgaW4gdGhlIHJldHVybmVkIGl0ZXJhYmxlCiAgICogYXMgdGhleSBoYXZlIGluIFtpdGVyYXRvcl0uCiAgICoKICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgdmlldyBvZiB0aGUgbWFwcGVkIGVsZW1lbnRzLgogICAqIEl0ZXJhdGluZyB3aWxsIG5vdCBjYWNoZSByZXN1bHRzLCBhbmQgdGh1cyBpdGVyYXRpbmcgbXVsdGlwbGUgdGltZXMgb3ZlcgogICAqIHRoZSByZXR1cm5lZCBbSXRlcmFibGVdIG1heSB5aWVsZCBkaWZmZXJlbnQgcmVzdWx0cywKICAgKiBpZiB0aGUgdW5kZXJseWluZyBlbGVtZW50cyBjaGFuZ2UgYmV0d2VlbiBpdGVyYXRpb25zLgogICAqLwogIEl0ZXJhYmxlPFQ+IHdoZXJlVHlwZTxUPigpID0+IFdoZXJlVHlwZUl0ZXJhYmxlPFQ+KHRoaXMpOwoKICAvKioKICAgKiBFeHBhbmRzIGVhY2ggZWxlbWVudCBvZiB0aGlzIFtJdGVyYWJsZV0gaW50byB6ZXJvIG9yIG1vcmUgZWxlbWVudHMuCiAgICoKICAgKiBUaGUgcmVzdWx0aW5nIEl0ZXJhYmxlIHJ1bnMgdGhyb3VnaCB0aGUgZWxlbWVudHMgcmV0dXJuZWQKICAgKiBieSBbZl0gZm9yIGVhY2ggZWxlbWVudCBvZiB0aGlzLCBpbiBpdGVyYXRpb24gb3JkZXIuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgW0l0ZXJhYmxlXSBpcyBsYXp5LCBhbmQgY2FsbHMgW2ZdIGZvciBlYWNoIGVsZW1lbnQKICAgKiBvZiB0aGlzIGV2ZXJ5IHRpbWUgaXQncyBpdGVyYXRlZC4KICAgKgogICAqIEV4YW1wbGU6CiAgICoKICAgKiAgICAgdmFyIHBhaXJzID0gW1sxLCAyXSwgWzMsIDRdXTsKICAgKiAgICAgdmFyIGZsYXR0ZW5lZCA9IHBhaXJzLmV4cGFuZCgocGFpcikgPT4gcGFpcikudG9MaXN0KCk7CiAgICogICAgIHByaW50KGZsYXR0ZW5lZCk7IC8vID0+IFsxLCAyLCAzLCA0XTsKICAgKgogICAqICAgICB2YXIgaW5wdXQgPSBbMSwgMiwgM107CiAgICogICAgIHZhciBkdXBsaWNhdGVkID0gaW5wdXQuZXhwYW5kKChpKSA9PiBbaSwgaV0pLnRvTGlzdCgpOwogICAqICAgICBwcmludChkdXBsaWNhdGVkKTsgLy8gPT4gWzEsIDEsIDIsIDIsIDMsIDNdCiAgICoKICAgKi8KICBJdGVyYWJsZTxUPiBleHBhbmQ8VD4oSXRlcmFibGU8VD4gZihFIGVsZW1lbnQpKSA9PgogICAgICBFeHBhbmRJdGVyYWJsZTxFLCBUPih0aGlzLCBmKTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIGNvbnRhaW5zIGFuIGVsZW1lbnQgZXF1YWwgdG8gW2VsZW1lbnRdLgogICAqCiAgICogVGhpcyBvcGVyYXRpb24gd2lsbCBjaGVjayBlYWNoIGVsZW1lbnQgaW4gb3JkZXIgZm9yIGJlaW5nIGVxdWFsIHRvCiAgICogW2VsZW1lbnRdLCB1bmxlc3MgaXQgaGFzIGEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGZpbmQgYW4gZWxlbWVudAogICAqIGVxdWFsIHRvIFtlbGVtZW50XS4KICAgKgogICAqIFRoZSBlcXVhbGl0eSB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIFtlbGVtZW50XSBpcyBlcXVhbCB0byBhbiBlbGVtZW50IG9mCiAgICogdGhlIGl0ZXJhYmxlIGRlZmF1bHRzIHRvIHRoZSBbT2JqZWN0Lj09XSBvZiB0aGUgZWxlbWVudC4KICAgKgogICAqIFNvbWUgdHlwZXMgb2YgaXRlcmFibGUgbWF5IGhhdmUgYSBkaWZmZXJlbnQgZXF1YWxpdHkgdXNlZCBmb3IgaXRzIGVsZW1lbnRzLgogICAqIEZvciBleGFtcGxlLCBhIFtTZXRdIG1heSBoYXZlIGEgY3VzdG9tIGVxdWFsaXR5CiAgICogKHNlZSBbU2V0LmlkZW50aXR5XSkgdGhhdCBpdHMgYGNvbnRhaW5zYCB1c2VzLgogICAqIExpa2V3aXNlIHRoZSBgSXRlcmFibGVgIHJldHVybmVkIGJ5IGEgW01hcC5rZXlzXSBjYWxsCiAgICogc2hvdWxkIHVzZSB0aGUgc2FtZSBlcXVhbGl0eSB0aGF0IHRoZSBgTWFwYCB1c2VzIGZvciBrZXlzLgogICAqLwogIGJvb2wgY29udGFpbnMoT2JqZWN0IGVsZW1lbnQpIHsKICAgIGZvciAoRSBlIGluIHRoaXMpIHsKICAgICAgaWYgKGUgPT0gZWxlbWVudCkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvKioKICAgKiBBcHBsaWVzIHRoZSBmdW5jdGlvbiBbZl0gdG8gZWFjaCBlbGVtZW50IG9mIHRoaXMgY29sbGVjdGlvbiBpbiBpdGVyYXRpb24KICAgKiBvcmRlci4KICAgKi8KICB2b2lkIGZvckVhY2godm9pZCBmKEUgZWxlbWVudCkpIHsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIGYoZWxlbWVudCk7CiAgfQoKICAvKioKICAgKiBSZWR1Y2VzIGEgY29sbGVjdGlvbiB0byBhIHNpbmdsZSB2YWx1ZSBieSBpdGVyYXRpdmVseSBjb21iaW5pbmcgZWxlbWVudHMKICAgKiBvZiB0aGUgY29sbGVjdGlvbiB1c2luZyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uCiAgICoKICAgKiBUaGUgaXRlcmFibGUgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBlbGVtZW50LgogICAqIElmIGl0IGhhcyBvbmx5IG9uZSBlbGVtZW50LCB0aGF0IGVsZW1lbnQgaXMgcmV0dXJuZWQuCiAgICoKICAgKiBPdGhlcndpc2UgdGhpcyBtZXRob2Qgc3RhcnRzIHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgZnJvbSB0aGUgaXRlcmF0b3IsCiAgICogYW5kIHRoZW4gY29tYmluZXMgaXQgd2l0aCB0aGUgcmVtYWluaW5nIGVsZW1lbnRzIGluIGl0ZXJhdGlvbiBvcmRlciwKICAgKiBhcyBpZiBieToKICAgKgogICAqICAgICBFIHZhbHVlID0gaXRlcmFibGUuZmlyc3Q7CiAgICogICAgIGl0ZXJhYmxlLnNraXAoMSkuZm9yRWFjaCgoZWxlbWVudCkgewogICAqICAgICAgIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgZWxlbWVudCk7CiAgICogICAgIH0pOwogICAqICAgICByZXR1cm4gdmFsdWU7CiAgICoKICAgKiBFeGFtcGxlIG9mIGNhbGN1bGF0aW5nIHRoZSBzdW0gb2YgYW4gaXRlcmFibGU6CiAgICoKICAgKiAgICAgaXRlcmFibGUucmVkdWNlKCh2YWx1ZSwgZWxlbWVudCkgPT4gdmFsdWUgKyBlbGVtZW50KTsKICAgKgogICAqLwogIEUgcmVkdWNlKEUgY29tYmluZShFIHZhbHVlLCBFIGVsZW1lbnQpKSB7CiAgICBJdGVyYXRvcjxFPiBpdGVyYXRvciA9IHRoaXMuaXRlcmF0b3I7CiAgICBpZiAoIWl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB9CiAgICBFIHZhbHVlID0gaXRlcmF0b3IuY3VycmVudDsKICAgIHdoaWxlIChpdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgaXRlcmF0b3IuY3VycmVudCk7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICAvKioKICAgKiBSZWR1Y2VzIGEgY29sbGVjdGlvbiB0byBhIHNpbmdsZSB2YWx1ZSBieSBpdGVyYXRpdmVseSBjb21iaW5pbmcgZWFjaAogICAqIGVsZW1lbnQgb2YgdGhlIGNvbGxlY3Rpb24gd2l0aCBhbiBleGlzdGluZyB2YWx1ZQogICAqCiAgICogVXNlcyBbaW5pdGlhbFZhbHVlXSBhcyB0aGUgaW5pdGlhbCB2YWx1ZSwKICAgKiB0aGVuIGl0ZXJhdGVzIHRocm91Z2ggdGhlIGVsZW1lbnRzIGFuZCB1cGRhdGVzIHRoZSB2YWx1ZSB3aXRoCiAgICogZWFjaCBlbGVtZW50IHVzaW5nIHRoZSBbY29tYmluZV0gZnVuY3Rpb24sIGFzIGlmIGJ5OgogICAqCiAgICogICAgIHZhciB2YWx1ZSA9IGluaXRpYWxWYWx1ZTsKICAgKiAgICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAqICAgICAgIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgZWxlbWVudCk7CiAgICogICAgIH0KICAgKiAgICAgcmV0dXJuIHZhbHVlOwogICAqCiAgICogRXhhbXBsZSBvZiBjYWxjdWxhdGluZyB0aGUgc3VtIG9mIGFuIGl0ZXJhYmxlOgogICAqCiAgICogICAgIGl0ZXJhYmxlLmZvbGQoMCwgKHByZXYsIGVsZW1lbnQpID0+IHByZXYgKyBlbGVtZW50KTsKICAgKgogICAqLwogIFQgZm9sZDxUPihUIGluaXRpYWxWYWx1ZSwgVCBjb21iaW5lKFQgcHJldmlvdXNWYWx1ZSwgRSBlbGVtZW50KSkgewogICAgdmFyIHZhbHVlID0gaW5pdGlhbFZhbHVlOwogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgdmFsdWUgPSBjb21iaW5lKHZhbHVlLCBlbGVtZW50KTsKICAgIHJldHVybiB2YWx1ZTsKICB9CgogIC8qKgogICAqIENoZWNrcyB3aGV0aGVyIGV2ZXJ5IGVsZW1lbnQgb2YgdGhpcyBpdGVyYWJsZSBzYXRpc2ZpZXMgW3Rlc3RdLgogICAqCiAgICogQ2hlY2tzIGV2ZXJ5IGVsZW1lbnQgaW4gaXRlcmF0aW9uIG9yZGVyLCBhbmQgcmV0dXJucyBgZmFsc2VgIGlmCiAgICogYW55IG9mIHRoZW0gbWFrZSBbdGVzdF0gcmV0dXJuIGBmYWxzZWAsIG90aGVyd2lzZSByZXR1cm5zIGB0cnVlYC4KICAgKi8KICBib29sIGV2ZXJ5KGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICghdGVzdChlbGVtZW50KSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvKioKICAgKiBDb252ZXJ0cyBlYWNoIGVsZW1lbnQgdG8gYSBbU3RyaW5nXSBhbmQgY29uY2F0ZW5hdGVzIHRoZSBzdHJpbmdzLgogICAqCiAgICogSXRlcmF0ZXMgdGhyb3VnaCBlbGVtZW50cyBvZiB0aGlzIGl0ZXJhYmxlLAogICAqIGNvbnZlcnRzIGVhY2ggb25lIHRvIGEgW1N0cmluZ10gYnkgY2FsbGluZyBbT2JqZWN0LnRvU3RyaW5nXSwKICAgKiBhbmQgdGhlbiBjb25jYXRlbmF0ZXMgdGhlIHN0cmluZ3MsIHdpdGggdGhlCiAgICogW3NlcGFyYXRvcl0gc3RyaW5nIGludGVybGVhdmVkIGJldHdlZW4gdGhlIGVsZW1lbnRzLgogICAqLwogIFN0cmluZyBqb2luKFtTdHJpbmcgc2VwYXJhdG9yID0gIiJdKSB7CiAgICBJdGVyYXRvcjxFPiBpdGVyYXRvciA9IHRoaXMuaXRlcmF0b3I7CiAgICBpZiAoIWl0ZXJhdG9yLm1vdmVOZXh0KCkpIHJldHVybiAiIjsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBTdHJpbmdCdWZmZXIoKTsKICAgIGlmIChzZXBhcmF0b3IgPT0gbnVsbCB8fCBzZXBhcmF0b3IgPT0gIiIpIHsKICAgICAgZG8gewogICAgICAgIGJ1ZmZlci53cml0ZSgiJHtpdGVyYXRvci5jdXJyZW50fSIpOwogICAgICB9IHdoaWxlIChpdGVyYXRvci5tb3ZlTmV4dCgpKTsKICAgIH0gZWxzZSB7CiAgICAgIGJ1ZmZlci53cml0ZSgiJHtpdGVyYXRvci5jdXJyZW50fSIpOwogICAgICB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICAgIGJ1ZmZlci53cml0ZShzZXBhcmF0b3IpOwogICAgICAgIGJ1ZmZlci53cml0ZSgiJHtpdGVyYXRvci5jdXJyZW50fSIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgfQoKICAvKioKICAgKiBDaGVja3Mgd2hldGhlciBhbnkgZWxlbWVudCBvZiB0aGlzIGl0ZXJhYmxlIHNhdGlzZmllcyBbdGVzdF0uCiAgICoKICAgKiBDaGVja3MgZXZlcnkgZWxlbWVudCBpbiBpdGVyYXRpb24gb3JkZXIsIGFuZCByZXR1cm5zIGB0cnVlYCBpZgogICAqIGFueSBvZiB0aGVtIG1ha2UgW3Rlc3RdIHJldHVybiBgdHJ1ZWAsIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgogICAqLwogIGJvb2wgYW55KGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBbTGlzdF0gY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhpcyBbSXRlcmFibGVdLgogICAqCiAgICogVGhlIGVsZW1lbnRzIGFyZSBpbiBpdGVyYXRpb24gb3JkZXIuCiAgICogVGhlIGxpc3QgaXMgZml4ZWQtbGVuZ3RoIGlmIFtncm93YWJsZV0gaXMgZmFsc2UuCiAgICovCiAgTGlzdDxFPiB0b0xpc3Qoe2Jvb2wgZ3Jvd2FibGUgPSB0cnVlfSkgewogICAgcmV0dXJuIExpc3Q8RT4uZnJvbSh0aGlzLCBncm93YWJsZTogZ3Jvd2FibGUpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtTZXRdIGNvbnRhaW5pbmcgdGhlIHNhbWUgZWxlbWVudHMgYXMgdGhpcyBpdGVyYWJsZS4KICAgKgogICAqIFRoZSBzZXQgbWF5IGNvbnRhaW4gZmV3ZXIgZWxlbWVudHMgdGhhbiB0aGUgaXRlcmFibGUsCiAgICogaWYgdGhlIGl0ZXJhYmxlIGNvbnRhaW5zIGFuIGVsZW1lbnQgbW9yZSB0aGFuIG9uY2UsCiAgICogb3IgaXQgY29udGFpbnMgb25lIG9yIG1vcmUgZWxlbWVudHMgdGhhdCBhcmUgZXF1YWwuCiAgICogVGhlIG9yZGVyIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgc2V0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHRoZSBzYW1lCiAgICogYXMgZm9yIHRoZSBpdGVyYWJsZS4KICAgKi8KICBTZXQ8RT4gdG9TZXQoKSA9PiBTZXQ8RT4uZnJvbSh0aGlzKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIFt0aGlzXS4KICAgKgogICAqIENvdW50aW5nIGFsbCBlbGVtZW50cyBtYXkgaW52b2x2ZSBpdGVyYXRpbmcgdGhyb3VnaCBhbGwgZWxlbWVudHMgYW5kIGNhbgogICAqIHRoZXJlZm9yZSBiZSBzbG93LgogICAqIFNvbWUgaXRlcmFibGVzIGhhdmUgYSBtb3JlIGVmZmljaWVudCB3YXkgdG8gZmluZCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzLgogICAqLwogIGludCBnZXQgbGVuZ3RoIHsKICAgIGFzc2VydCh0aGlzIGlzISBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZSk7CiAgICBpbnQgY291bnQgPSAwOwogICAgSXRlcmF0b3IgaXQgPSBpdGVyYXRvcjsKICAgIHdoaWxlIChpdC5tb3ZlTmV4dCgpKSB7CiAgICAgIGNvdW50Kys7CiAgICB9CiAgICByZXR1cm4gY291bnQ7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGVyZSBhcmUgbm8gZWxlbWVudHMgaW4gdGhpcyBjb2xsZWN0aW9uLgogICAqCiAgICogTWF5IGJlIGNvbXB1dGVkIGJ5IGNoZWNraW5nIGlmIGBpdGVyYXRvci5tb3ZlTmV4dCgpYCByZXR1cm5zIGBmYWxzZWAuCiAgICovCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiAhaXRlcmF0b3IubW92ZU5leHQoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBlbGVtZW50IGluIHRoaXMgY29sbGVjdGlvbi4KICAgKgogICAqIE1heSBiZSBjb21wdXRlZCBieSBjaGVja2luZyBpZiBgaXRlcmF0b3IubW92ZU5leHQoKWAgcmV0dXJucyBgdHJ1ZWAuCiAgICovCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiAhaXNFbXB0eTsKCiAgLyoqCiAgICogUmV0dXJucyBhIGxhenkgaXRlcmFibGUgb2YgdGhlIFtjb3VudF0gZmlyc3QgZWxlbWVudHMgb2YgdGhpcyBpdGVyYWJsZS4KICAgKgogICAqIFRoZSByZXR1cm5lZCBgSXRlcmFibGVgIG1heSBjb250YWluIGZld2VyIHRoYW4gYGNvdW50YCBlbGVtZW50cywgaWYgYHRoaXNgCiAgICogY29udGFpbnMgZmV3ZXIgdGhhbiBgY291bnRgIGVsZW1lbnRzLgogICAqCiAgICogVGhlIGVsZW1lbnRzIGNhbiBiZSBjb21wdXRlZCBieSBzdGVwcGluZyB0aHJvdWdoIFtpdGVyYXRvcl0gdW50aWwgW2NvdW50XQogICAqIGVsZW1lbnRzIGhhdmUgYmVlbiBzZWVuLgogICAqCiAgICogVGhlIGBjb3VudGAgbXVzdCBub3QgYmUgbmVnYXRpdmUuCiAgICovCiAgSXRlcmFibGU8RT4gdGFrZShpbnQgY291bnQpIHsKICAgIHJldHVybiBUYWtlSXRlcmFibGU8RT4odGhpcywgY291bnQpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhIGxhenkgaXRlcmFibGUgb2YgdGhlIGxlYWRpbmcgZWxlbWVudHMgc2F0aXNmeWluZyBbdGVzdF0uCiAgICoKICAgKiBUaGUgZmlsdGVyaW5nIGhhcHBlbnMgbGF6aWx5LiBFdmVyeSBuZXcgaXRlcmF0b3Igb2YgdGhlIHJldHVybmVkCiAgICogaXRlcmFibGUgc3RhcnRzIGl0ZXJhdGluZyBvdmVyIHRoZSBlbGVtZW50cyBvZiBgdGhpc2AuCiAgICoKICAgKiBUaGUgZWxlbWVudHMgY2FuIGJlIGNvbXB1dGVkIGJ5IHN0ZXBwaW5nIHRocm91Z2ggW2l0ZXJhdG9yXSB1bnRpbCBhbgogICAqIGVsZW1lbnQgaXMgZm91bmQgd2hlcmUgYHRlc3QoZWxlbWVudClgIGlzIGZhbHNlLiBBdCB0aGF0IHBvaW50LAogICAqIHRoZSByZXR1cm5lZCBpdGVyYWJsZSBzdG9wcyAoaXRzIGBtb3ZlTmV4dCgpYCByZXR1cm5zIGZhbHNlKS4KICAgKi8KICBJdGVyYWJsZTxFPiB0YWtlV2hpbGUoYm9vbCB0ZXN0KEUgdmFsdWUpKSB7CiAgICByZXR1cm4gVGFrZVdoaWxlSXRlcmFibGU8RT4odGhpcywgdGVzdCk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIGFuIFtJdGVyYWJsZV0gdGhhdCBwcm92aWRlcyBhbGwgYnV0IHRoZSBmaXJzdCBbY291bnRdIGVsZW1lbnRzLgogICAqCiAgICogV2hlbiB0aGUgcmV0dXJuZWQgaXRlcmFibGUgaXMgaXRlcmF0ZWQsIGl0IHN0YXJ0cyBpdGVyYXRpbmcgb3ZlciBgdGhpc2AsCiAgICogZmlyc3Qgc2tpcHBpbmcgcGFzdCB0aGUgaW5pdGlhbCBbY291bnRdIGVsZW1lbnRzLgogICAqIElmIGB0aGlzYCBoYXMgZmV3ZXIgdGhhbiBgY291bnRgIGVsZW1lbnRzLCB0aGVuIHRoZSByZXN1bHRpbmcgSXRlcmFibGUgaXMKICAgKiBlbXB0eS4KICAgKiBBZnRlciB0aGF0LCB0aGUgcmVtYWluaW5nIGVsZW1lbnRzIGFyZSBpdGVyYXRlZCBpbiB0aGUgc2FtZSBvcmRlciBhcwogICAqIGluIHRoaXMgaXRlcmFibGUuCiAgICoKICAgKiBTb21lIGl0ZXJhYmxlcyBtYXkgYmUgYWJsZSB0byBmaW5kIGxhdGVyIGVsZW1lbnRzIHdpdGhvdXQgZmlyc3QgaXRlcmF0aW5nCiAgICogdGhyb3VnaCBlYXJsaWVyIGVsZW1lbnRzLCBmb3IgZXhhbXBsZSB3aGVuIGl0ZXJhdGluZyBhIFtMaXN0XS4KICAgKiBTdWNoIGl0ZXJhYmxlcyBhcmUgYWxsb3dlZCB0byBpZ25vcmUgdGhlIGluaXRpYWwgc2tpcHBlZCBlbGVtZW50cy4KICAgKgogICAqIFRoZSBbY291bnRdIG11c3Qgbm90IGJlIG5lZ2F0aXZlLgogICAqLwogIEl0ZXJhYmxlPEU+IHNraXAoaW50IGNvdW50KSB7CiAgICByZXR1cm4gU2tpcEl0ZXJhYmxlPEU+KHRoaXMsIGNvdW50KTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYW4gYEl0ZXJhYmxlYCB0aGF0IHNraXBzIGxlYWRpbmcgZWxlbWVudHMgd2hpbGUgW3Rlc3RdIGlzIHNhdGlzZmllZC4KICAgKgogICAqIFRoZSBmaWx0ZXJpbmcgaGFwcGVucyBsYXppbHkuIEV2ZXJ5IG5ldyBbSXRlcmF0b3JdIG9mIHRoZSByZXR1cm5lZAogICAqIGl0ZXJhYmxlIGl0ZXJhdGVzIG92ZXIgYWxsIGVsZW1lbnRzIG9mIGB0aGlzYC4KICAgKgogICAqIFRoZSByZXR1cm5lZCBpdGVyYWJsZSBwcm92aWRlcyBlbGVtZW50cyBieSBpdGVyYXRpbmcgdGhpcyBpdGVyYWJsZSwKICAgKiBidXQgc2tpcHBpbmcgb3ZlciBhbGwgaW5pdGlhbCBlbGVtZW50cyB3aGVyZSBgdGVzdChlbGVtZW50KWAgcmV0dXJucwogICAqIHRydWUuIElmIGFsbCBlbGVtZW50cyBzYXRpc2Z5IGB0ZXN0YCB0aGUgcmVzdWx0aW5nIGl0ZXJhYmxlIGlzIGVtcHR5LAogICAqIG90aGVyd2lzZSBpdCBpdGVyYXRlcyB0aGUgcmVtYWluaW5nIGVsZW1lbnRzIGluIHRoZWlyIG9yaWdpbmFsIG9yZGVyLAogICAqIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgZm9yIHdoaWNoIGB0ZXN0KGVsZW1lbnQpYCByZXR1cm5zIGBmYWxzZWAuCiAgICovCiAgSXRlcmFibGU8RT4gc2tpcFdoaWxlKGJvb2wgdGVzdChFIHZhbHVlKSkgewogICAgcmV0dXJuIFNraXBXaGlsZUl0ZXJhYmxlPEU+KHRoaXMsIHRlc3QpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudC4KICAgKgogICAqIFRocm93cyBhIFtTdGF0ZUVycm9yXSBpZiBgdGhpc2AgaXMgZW1wdHkuCiAgICogT3RoZXJ3aXNlIHJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdGlvbiBvcmRlciwKICAgKiBlcXVpdmFsZW50IHRvIGB0aGlzLmVsZW1lbnRBdCgwKWAuCiAgICovCiAgRSBnZXQgZmlyc3QgewogICAgSXRlcmF0b3I8RT4gaXQgPSBpdGVyYXRvcjsKICAgIGlmICghaXQubW92ZU5leHQoKSkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIH0KICAgIHJldHVybiBpdC5jdXJyZW50OwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50LgogICAqCiAgICogVGhyb3dzIGEgW1N0YXRlRXJyb3JdIGlmIGB0aGlzYCBpcyBlbXB0eS4KICAgKiBPdGhlcndpc2UgbWF5IGl0ZXJhdGUgdGhyb3VnaCB0aGUgZWxlbWVudHMgYW5kIHJldHVybnMgdGhlIGxhc3Qgb25lCiAgICogc2Vlbi4KICAgKiBTb21lIGl0ZXJhYmxlcyBtYXkgaGF2ZSBtb3JlIGVmZmljaWVudCB3YXlzIHRvIGZpbmQgdGhlIGxhc3QgZWxlbWVudAogICAqIChmb3IgZXhhbXBsZSBhIGxpc3QgY2FuIGRpcmVjdGx5IGFjY2VzcyB0aGUgbGFzdCBlbGVtZW50LAogICAqIHdpdGhvdXQgaXRlcmF0aW5nIHRocm91Z2ggdGhlIHByZXZpb3VzIG9uZXMpLgogICAqLwogIEUgZ2V0IGxhc3QgewogICAgSXRlcmF0b3I8RT4gaXQgPSBpdGVyYXRvcjsKICAgIGlmICghaXQubW92ZU5leHQoKSkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIH0KICAgIEUgcmVzdWx0OwogICAgZG8gewogICAgICByZXN1bHQgPSBpdC5jdXJyZW50OwogICAgfSB3aGlsZSAoaXQubW92ZU5leHQoKSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLyoqCiAgICogQ2hlY2tzIHRoYXQgdGhpcyBpdGVyYWJsZSBoYXMgb25seSBvbmUgZWxlbWVudCwgYW5kIHJldHVybnMgdGhhdCBlbGVtZW50LgogICAqCiAgICogVGhyb3dzIGEgW1N0YXRlRXJyb3JdIGlmIGB0aGlzYCBpcyBlbXB0eSBvciBoYXMgbW9yZSB0aGFuIG9uZSBlbGVtZW50LgogICAqLwogIEUgZ2V0IHNpbmdsZSB7CiAgICBJdGVyYXRvcjxFPiBpdCA9IGl0ZXJhdG9yOwogICAgaWYgKCFpdC5tb3ZlTmV4dCgpKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIEUgcmVzdWx0ID0gaXQuY3VycmVudDsKICAgIGlmIChpdC5tb3ZlTmV4dCgpKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IHNhdGlzZmllcyB0aGUgZ2l2ZW4gcHJlZGljYXRlIFt0ZXN0XS4KICAgKgogICAqIEl0ZXJhdGVzIHRocm91Z2ggZWxlbWVudHMgYW5kIHJldHVybnMgdGhlIGZpcnN0IHRvIHNhdGlzZnkgW3Rlc3RdLgogICAqCiAgICogSWYgbm8gZWxlbWVudCBzYXRpc2ZpZXMgW3Rlc3RdLCB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBbb3JFbHNlXQogICAqIGZ1bmN0aW9uIGlzIHJldHVybmVkLgogICAqIElmIFtvckVsc2VdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHRocm93aW5nIGEgW1N0YXRlRXJyb3JdLgogICAqLwogIEUgZmlyc3RXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwge0Ugb3JFbHNlKCl9KSB7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSByZXR1cm4gZWxlbWVudDsKICAgIH0KICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgdGhhdCBzYXRpc2ZpZXMgdGhlIGdpdmVuIHByZWRpY2F0ZSBbdGVzdF0uCiAgICoKICAgKiBBbiBpdGVyYWJsZSB0aGF0IGNhbiBhY2Nlc3MgaXRzIGVsZW1lbnRzIGRpcmVjdGx5IG1heSBjaGVjayBpdHMKICAgKiBlbGVtZW50cyBpbiBhbnkgb3JkZXIgKGZvciBleGFtcGxlIGEgbGlzdCBzdGFydHMgYnkgY2hlY2tpbmcgdGhlCiAgICogbGFzdCBlbGVtZW50IGFuZCB0aGVuIG1vdmVzIHRvd2FyZHMgdGhlIHN0YXJ0IG9mIHRoZSBsaXN0KS4KICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpdGVyYXRlcyBlbGVtZW50cyBpbiBpdGVyYXRpb24gb3JkZXIsCiAgICogY2hlY2tzIGB0ZXN0KGVsZW1lbnQpYCBmb3IgZWFjaCwKICAgKiBhbmQgZmluYWxseSByZXR1cm5zIHRoYXQgbGFzdCBvbmUgdGhhdCBtYXRjaGVkLgogICAqCiAgICogSWYgbm8gZWxlbWVudCBzYXRpc2ZpZXMgW3Rlc3RdLCB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBbb3JFbHNlXQogICAqIGZ1bmN0aW9uIGlzIHJldHVybmVkLgogICAqIElmIFtvckVsc2VdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHRocm93aW5nIGEgW1N0YXRlRXJyb3JdLgogICAqLwogIEUgbGFzdFdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCB7RSBvckVsc2UoKX0pIHsKICAgIEUgcmVzdWx0OwogICAgYm9vbCBmb3VuZE1hdGNoaW5nID0gZmFsc2U7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSB7CiAgICAgICAgcmVzdWx0ID0gZWxlbWVudDsKICAgICAgICBmb3VuZE1hdGNoaW5nID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgaWYgKGZvdW5kTWF0Y2hpbmcpIHJldHVybiByZXN1bHQ7CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgc2luZ2xlIGVsZW1lbnQgdGhhdCBzYXRpc2ZpZXMgW3Rlc3RdLgogICAqCiAgICogQ2hlY2tzIGVsZW1lbnRzIHRvIHNlZSBpZiBgdGVzdChlbGVtZW50KWAgcmV0dXJucyB0cnVlLgogICAqIElmIGV4YWN0bHkgb25lIGVsZW1lbnQgc2F0aXNmaWVzIFt0ZXN0XSwgdGhhdCBlbGVtZW50IGlzIHJldHVybmVkLgogICAqIElmIG1vcmUgdGhhbiBvbmUgbWF0Y2hpbmcgZWxlbWVudCBpcyBmb3VuZCwgdGhyb3dzIFtTdGF0ZUVycm9yXS4KICAgKiBJZiBubyBtYXRjaGluZyBlbGVtZW50IGlzIGZvdW5kLCByZXR1cm5zIHRoZSByZXN1bHQgb2YgW29yRWxzZV0uCiAgICogSWYgW29yRWxzZV0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gdGhyb3dpbmcgYSBbU3RhdGVFcnJvcl0uCiAgICovCiAgRSBzaW5nbGVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwge0Ugb3JFbHNlKCl9KSB7CiAgICBFIHJlc3VsdDsKICAgIGJvb2wgZm91bmRNYXRjaGluZyA9IGZhbHNlOwogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAodGVzdChlbGVtZW50KSkgewogICAgICAgIGlmIChmb3VuZE1hdGNoaW5nKSB7CiAgICAgICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IGVsZW1lbnQ7CiAgICAgICAgZm91bmRNYXRjaGluZyA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIGlmIChmb3VuZE1hdGNoaW5nKSByZXR1cm4gcmVzdWx0OwogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIFtpbmRleF10aCBlbGVtZW50LgogICAqCiAgICogVGhlIFtpbmRleF0gbXVzdCBiZSBub24tbmVnYXRpdmUgYW5kIGxlc3MgdGhhbiBbbGVuZ3RoXS4KICAgKiBJbmRleCB6ZXJvIHJlcHJlc2VudHMgdGhlIGZpcnN0IGVsZW1lbnQgKHNvIGBpdGVyYWJsZS5lbGVtZW50QXQoMClgIGlzCiAgICogZXF1aXZhbGVudCB0byBgaXRlcmFibGUuZmlyc3RgKS4KICAgKgogICAqIE1heSBpdGVyYXRlIHRocm91Z2ggdGhlIGVsZW1lbnRzIGluIGl0ZXJhdGlvbiBvcmRlciwgaWdub3JpbmcgdGhlCiAgICogZmlyc3QgW2luZGV4XSBlbGVtZW50cyBhbmQgdGhlbiByZXR1cm5pbmcgdGhlIG5leHQuCiAgICogU29tZSBpdGVyYWJsZXMgbWF5IGhhdmUgbW9yZSBhIGVmZmljaWVudCB3YXkgdG8gZmluZCB0aGUgZWxlbWVudC4KICAgKi8KICBFIGVsZW1lbnRBdChpbnQgaW5kZXgpIHsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKGluZGV4LCAiaW5kZXgiKTsKICAgIFJhbmdlRXJyb3IuY2hlY2tOb3ROZWdhdGl2ZShpbmRleCwgImluZGV4Iik7CiAgICBpbnQgZWxlbWVudEluZGV4ID0gMDsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHsKICAgICAgaWYgKGluZGV4ID09IGVsZW1lbnRJbmRleCkgcmV0dXJuIGVsZW1lbnQ7CiAgICAgIGVsZW1lbnRJbmRleCsrOwogICAgfQogICAgdGhyb3cgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4IiwgbnVsbCwgZWxlbWVudEluZGV4KTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgKHNvbWUgb2YpIHRoZSBlbGVtZW50cyBvZiBgdGhpc2AuCiAgICoKICAgKiBFbGVtZW50cyBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlaXIgb3duIGB0b1N0cmluZ2AgcmVzdWx0cy4KICAgKgogICAqIFRoZSBkZWZhdWx0IHJlcHJlc2VudGF0aW9uIGFsd2F5cyBjb250YWlucyB0aGUgZmlyc3QgdGhyZWUgZWxlbWVudHMuCiAgICogSWYgdGhlcmUgYXJlIGxlc3MgdGhhbiBhIGh1bmRyZWQgZWxlbWVudHMgaW4gdGhlIGl0ZXJhYmxlLCBpdCBhbHNvCiAgICogY29udGFpbnMgdGhlIGxhc3QgdHdvIGVsZW1lbnRzLgogICAqCiAgICogSWYgdGhlIHJlc3VsdGluZyBzdHJpbmcgaXNuJ3QgYWJvdmUgODAgY2hhcmFjdGVycywgbW9yZSBlbGVtZW50cyBhcmUKICAgKiBpbmNsdWRlZCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaXRlcmFibGUuCiAgICoKICAgKiBUaGUgY29udmVyc2lvbiBtYXkgb21pdCBjYWxsaW5nIGB0b1N0cmluZ2Agb24gc29tZSBlbGVtZW50cyBpZiB0aGV5CiAgICogYXJlIGtub3duIHRvIG5vdCBvY2N1ciBpbiB0aGUgb3V0cHV0LCBhbmQgaXQgbWF5IHN0b3AgaXRlcmF0aW5nIGFmdGVyCiAgICogYSBodW5kcmVkIGVsZW1lbnRzLgogICAqLwogIFN0cmluZyB0b1N0cmluZygpID0+IEl0ZXJhYmxlQmFzZS5pdGVyYWJsZVRvU2hvcnRTdHJpbmcodGhpcywgJygnLCAnKScpOwp9Cgp0eXBlZGVmIF9HZW5lcmF0b3I8RT4gPSBFIEZ1bmN0aW9uKGludCBpbmRleCk7CgpjbGFzcyBfR2VuZXJhdG9ySXRlcmFibGU8RT4gZXh0ZW5kcyBMaXN0SXRlcmFibGU8RT4gewogIC8vLyBUaGUgbGVuZ3RoIG9mIHRoZSBnZW5lcmF0ZWQgaXRlcmFibGUuCiAgZmluYWwgaW50IGxlbmd0aDsKCiAgLy8vIFRoZSBmdW5jdGlvbiBtYXBwaW5nIGluZGljZXMgdG8gdmFsdWVzLgogIGZpbmFsIF9HZW5lcmF0b3I8RT4gX2dlbmVyYXRvcjsKCiAgLy8vIENyZWF0ZXMgdGhlIGdlbmVyYXRlZCBpdGVyYWJsZS4KICAvLy8KICAvLy8gSWYgW2dlbmVyYXRvcl0gaXMgYG51bGxgLCBpdCBpcyBjaGVja2VkIHRoYXQgYGludGAgaXMgYXNzaWduYWJsZSB0byBbRV0uCiAgX0dlbmVyYXRvckl0ZXJhYmxlKHRoaXMubGVuZ3RoLCBFIGdlbmVyYXRvcihpbnQgaW5kZXgpKQogICAgICA6IC8vIFRoZSBgYXNgIGJlbG93IGlzIHVzZWQgYXMgY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgYGludGAgaXMgYXNzaWduYWJsZQogICAgICAgIC8vIHRvIFtFXS4KICAgICAgICBfZ2VuZXJhdG9yID0gKGdlbmVyYXRvciAhPSBudWxsKSA/IGdlbmVyYXRvciA6IF9pZCBhcyBfR2VuZXJhdG9yPEU+OwoKICBFIGVsZW1lbnRBdChpbnQgaW5kZXgpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZEluZGV4KGluZGV4LCB0aGlzKTsKICAgIHJldHVybiBfZ2VuZXJhdG9yKGluZGV4KTsKICB9CgogIC8vLyBIZWxwZXIgZnVuY3Rpb24gdXNlZCBhcyBkZWZhdWx0IF9nZW5lcmF0b3IgZnVuY3Rpb24uCiAgc3RhdGljIGludCBfaWQoaW50IG4pID0+IG47Cn0KCi8qKgogKiBBbiBJdGVyYXRvciB0aGF0IGFsbG93cyBtb3ZpbmcgYmFja3dhcmRzIGFzIHdlbGwgYXMgZm9yd2FyZHMuCiAqLwphYnN0cmFjdCBjbGFzcyBCaWRpcmVjdGlvbmFsSXRlcmF0b3I8RT4gaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7CiAgLyoqCiAgICogTW92ZSBiYWNrIHRvIHRoZSBwcmV2aW91cyBlbGVtZW50LgogICAqCiAgICogUmV0dXJucyB0cnVlIGFuZCB1cGRhdGVzIFtjdXJyZW50XSBpZiBzdWNjZXNzZnVsLiBSZXR1cm5zIGZhbHNlCiAgICogYW5kIHNldHMgW2N1cnJlbnRdIHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgZWxlbWVudC4KICAgKi8KICBib29sIG1vdmVQcmV2aW91cygpOwp9CoLFAE5OPAETAQRNA0ZJRiMzMjwqA0M8QTtHSzIDO1ALQSQDMTpIKjsJAzU5AzBIUU02SxYDNh9DLzAyO0wDSUpPSyoDPDRPNkQDR0JBA00xTkwWBB1ERBQBBkUFMklJBURHRg8FTy0GQy80BAEGIAVHEgY1AQYtBUdNTlAGOyIBBkkRBUg5RiAFPkJOPDkFQUg3REIrBUlEF0oWBhwBBkcFRUZEBUVLBjoGQwVMSxkGLi5ABi8EAQZFSAVHTkxKNgVGMzYGQQEGRhcFSCEFOD43TjU5BksBBkkFSCEFOE46OwY8AQZJBT86BUUnBQ4FJ0AvBSBANQUGNSUBBkwFSEYZBVA+BVE1NDtABiIYJQYSBAEGTgwGJCgEAQZONAUyOwVMSg8FIy4sDRcFNAU/BQYsKiAuBiAiMAYSBAEGSjYFL0M6BSMjLAsXBTQFPgUGRR49EgQBBkUFRUcGJR4oBhEEAQZHBTFDMToGKSopKjALLSUNKyQhLQgGHgQBBkMFREUGIx4mBhIEAQZCBSo2BiszBAEGRAU7OTlLGgYnAQYvBU4YTgYTLhMcHA8GEgQBBkEFSwYsAQZHBUoGIwEGTQVQKwVPHgUnBiApBAEGSAVGPAVKRUMGLi0EAQZNBU43TwxKFwVPREgFJwYgKQQBBlIFSDQFSUpLS1AGLi0EAQYgBS9BKAYQHxouBhcEAQYfBS9JC0o/MwYPHxouBg4JGx0TBAEGTwVMBhEfQBs9EwQBBkoFSAVJG0UGNR4pBiksBAEGSQVFRkFGJjUFSRtFBjQOIB4bGh4IBiYpLAQBBjcFPUhGRkUGNg4gHhsdMAoaHggGJiksBAEGJAU+TCYFRzlHBhswMRoeMRYGRgQBBkoFPwVKSCUFSi4FSUsZBksCAS8BNiwUAS4iASYGTzpRE00BGy0eBAE7HgIBBEEEQQYoBUVBBhcCARdkYXJ0OmNvcmUvaXRlcmFibGUuZGFydC9vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2NvcmVfcGF0Y2guZGFydJM6Ly8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBOb3RlOiB0aGUgVk0gY29uY2F0ZW5hdGVzIGFsbCBwYXRjaCBmaWxlcyBpbnRvIGEgc2luZ2xlIHBhdGNoIGZpbGUuIFRoaXMKLy8vIGZpbGUgaXMgdGhlIGZpcnN0IHBhdGNoIGluICJkYXJ0OmNvcmUiIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgaW1wb3J0cwovLy8gdXNlZCBieSBwYXRjaGVzIG9mIHRoYXQgbGlicmFyeS4gV2UgcGxhbiB0byBjaGFuZ2UgdGhpcyB3aGVuIHdlIGhhdmUgYQovLy8gc2hhcmVkIGZyb250IGVuZCBhbmQgc2ltcGx5IHVzZSBwYXJ0cy4KCmltcG9ydCAiZGFydDpfaW50ZXJuYWwiIGFzIGludGVybmFsIHNob3cgU3ltYm9sOwoKaW1wb3J0ICJkYXJ0Ol9pbnRlcm5hbCIKICAgIHNob3cKICAgICAgICBDbGFzc0lELAogICAgICAgIENvZGVVbml0cywKICAgICAgICBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZSwKICAgICAgICBGaXhlZExlbmd0aExpc3RCYXNlLAogICAgICAgIEl0ZXJhYmxlRWxlbWVudEVycm9yLAogICAgICAgIExpc3RJdGVyYXRvciwKICAgICAgICBMaXN0cywKICAgICAgICBQT1dFUlNfT0ZfVEVOLAogICAgICAgIFN1Ykxpc3RJdGVyYWJsZSwKICAgICAgICBVbm1vZGlmaWFibGVMaXN0QmFzZSwKICAgICAgICBpczY0Qml0LAogICAgICAgIG1ha2VGaXhlZExpc3RVbm1vZGlmaWFibGUsCiAgICAgICAgbWFrZUxpc3RGaXhlZExlbmd0aCwKICAgICAgICBwYXRjaCwKICAgICAgICB1bnNhZmVDYXN0OwoKaW1wb3J0ICJkYXJ0OmFzeW5jIiBzaG93IENvbXBsZXRlciwgRnV0dXJlLCBUaW1lcjsKCmltcG9ydCAiZGFydDpjb2xsZWN0aW9uIgogICAgc2hvdwogICAgICAgIEhhc2hNYXAsCiAgICAgICAgSXRlcmFibGVCYXNlLAogICAgICAgIExpbmtlZEhhc2hNYXAsCiAgICAgICAgTGlua2VkTGlzdCwKICAgICAgICBMaW5rZWRMaXN0RW50cnksCiAgICAgICAgTGlzdEJhc2UsCiAgICAgICAgTWFwQmFzZSwKICAgICAgICBNYXBzLAogICAgICAgIFVubW9kaWZpYWJsZU1hcEJhc2UsCiAgICAgICAgVW5tb2RpZmlhYmxlTWFwVmlldzsKCmltcG9ydCAiZGFydDpjb252ZXJ0IiBzaG93IGFzY2lpLCBFbmNvZGluZywganNvbiwgbGF0aW4xLCB1dGY4OwoKaW1wb3J0ICJkYXJ0Omlzb2xhdGUiIHNob3cgSXNvbGF0ZTsKCmltcG9ydCAiZGFydDptYXRoIiBzaG93IFJhbmRvbTsKCmltcG9ydCAiZGFydDp0eXBlZF9kYXRhIgogICAgc2hvdyBFbmRpYW4sIFVpbnQ4TGlzdCwgSW50NjRMaXN0LCBVaW50MTZMaXN0LCBVaW50MzJMaXN0OwoKLy8vIFRoZXNlIGFyZSB0aGUgYWRkaXRpb25hbCBwYXJ0cyBvZiB0aGlzIHBhdGNoIGxpYnJhcnk6Ci8vIHBhcnQgImFycmF5LmRhcnQiOwovLyBwYXJ0ICJhcnJheV9wYXRjaC5kYXJ0IjsKLy8gcGFydCAiYmlnaW50X3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJib29sX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJkYXRlX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJkb3VibGUuZGFydCI7Ci8vIHBhcnQgImRvdWJsZV9wYXRjaC5kYXJ0IjsKLy8gcGFydCAiZXJyb3JzX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJleHBhbmRvX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJmdW5jdGlvbi5kYXJ0IjsKLy8gcGFydCAiZnVuY3Rpb25fcGF0Y2guZGFydCI7Ci8vIHBhcnQgImdyb3dhYmxlX2FycmF5LmRhcnQiOwovLyBwYXJ0ICJpZGVudGljYWxfcGF0Y2guZGFydCI7Ci8vIHBhcnQgImltbXV0YWJsZV9tYXAuZGFydCI7Ci8vIHBhcnQgImludGVnZXJzLmRhcnQiOwovLyBwYXJ0ICJpbnRlZ2Vyc19wYXRjaC5kYXJ0IjsKLy8gcGFydCAiaW52b2NhdGlvbl9taXJyb3JfcGF0Y2guZGFydCI7Ci8vIHBhcnQgImxpYl9wcmVmaXguZGFydCI7Ci8vIHBhcnQgIm1hcF9wYXRjaC5kYXJ0IjsKLy8gcGFydCAibnVsbF9wYXRjaC5kYXJ0IjsKLy8gcGFydCAib2JqZWN0X3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJyZWdleHBfcGF0Y2guZGFydCI7Ci8vIHBhcnQgInN0YWNrdHJhY2UuZGFydCI7Ci8vIHBhcnQgInN0b3B3YXRjaF9wYXRjaC5kYXJ0IjsKLy8gcGFydCAic3RyaW5nX2J1ZmZlcl9wYXRjaC5kYXJ0IjsKLy8gcGFydCAic3RyaW5nX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJ0eXBlX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJ1cmlfcGF0Y2guZGFydCI7Ci8vIHBhcnQgIndlYWtfcHJvcGVydHkuZGFydCI7CgpAcGF0Y2gKY2xhc3MgbnVtIHsKICBudW0gX2FkZEZyb21JbnRlZ2VyKGludCBvdGhlcik7CiAgbnVtIF9zdWJGcm9tSW50ZWdlcihpbnQgb3RoZXIpOwogIG51bSBfbXVsRnJvbUludGVnZXIoaW50IG90aGVyKTsKICBpbnQgX3RydW5jRGl2RnJvbUludGVnZXIoaW50IG90aGVyKTsKICBudW0gX21vZHVsb0Zyb21JbnRlZ2VyKGludCBvdGhlcik7CiAgbnVtIF9yZW1haW5kZXJGcm9tSW50ZWdlcihpbnQgb3RoZXIpOwogIGJvb2wgX2dyZWF0ZXJUaGFuRnJvbUludGVnZXIoaW50IG90aGVyKTsKICBib29sIF9lcXVhbFRvSW50ZWdlcihpbnQgb3RoZXIpOwp9CgovLyBUaGUgbWVtYmVycyBvZiB0aGlzIGNsYXNzIGFyZSBjbG9uZWQgYW5kIGFkZGVkIHRvIGVhY2ggY2xhc3MgdGhhdAovLyByZXByZXNlbnRzIGFuIGVudW0gdHlwZS4KY2xhc3MgX0VudW1IZWxwZXIgewogIFN0cmluZyBfbmFtZTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBfbmFtZTsKICBpbnQgZ2V0IGhhc2hDb2RlID0+IF9uYW1lLmhhc2hDb2RlOwp9CgovLyBfU3luY0l0ZXJhYmxlIGFuZCBfc3luY0l0ZXJhdG9yIGFyZSB1c2VkIGJ5IHRoZSBjb21waWxlciB0bwovLyBpbXBsZW1lbnQgc3luYyogZ2VuZXJhdG9yIGZ1bmN0aW9ucy4gQSBzeW5jKiBnZW5lcmF0b3IgYWxsb2NhdGVzCi8vIGFuZCByZXR1cm5zIGEgbmV3IF9TeW5jSXRlcmFibGUgb2JqZWN0LgoKdHlwZWRlZiBib29sIF9TeW5jR2VuZXJhdG9yQ2FsbGJhY2s8VD4oX1N5bmNJdGVyYXRvcjxUPiBpdGVyYXRvcik7CgpjbGFzcyBfU3luY0l0ZXJhYmxlPFQ+IGV4dGVuZHMgSXRlcmFibGVCYXNlPFQ+IHsKICAvLyBfbW92ZU5leHRGbiBpcyB0aGUgY2xvc3VyaXplZCBib2R5IG9mIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24uCiAgZmluYWwgX1N5bmNHZW5lcmF0b3JDYWxsYmFjazxUPiBfbW92ZU5leHRGbjsKCiAgY29uc3QgX1N5bmNJdGVyYWJsZSh0aGlzLl9tb3ZlTmV4dEZuKTsKCiAgSXRlcmF0b3I8VD4gZ2V0IGl0ZXJhdG9yIHsKICAgIC8vIE5vdGU6IF9DbG9zdXJlLl9jbG9uZSByZXR1cm5zIF9DbG9zdXJlIHdoaWNoIGlzIG5vdCByZWxhdGVkIHRvCiAgICAvLyBfU3luY0dlbmVyYXRvckNhbGxiYWNrLCB3aGljaCBtZWFucyB3ZSBuZWVkIGV4cGxpY2l0IGNhc3QuCiAgICByZXR1cm4gbmV3IF9TeW5jSXRlcmF0b3I8VD4odW5zYWZlQ2FzdDxfU3luY0dlbmVyYXRvckNhbGxiYWNrPFQ+PigKICAgICAgICB1bnNhZmVDYXN0PF9DbG9zdXJlPihfbW92ZU5leHRGbikuX2Nsb25lKCkpKTsKICB9Cn0KCmNsYXNzIF9TeW5jSXRlcmF0b3I8VD4gaW1wbGVtZW50cyBJdGVyYXRvcjxUPiB7CiAgX1N5bmNHZW5lcmF0b3JDYWxsYmFjazxUPiBfbW92ZU5leHRGbjsKICBJdGVyYXRvcjxUPiBfeWllbGRFYWNoSXRlcmF0b3I7CgogIC8vIFRoZXNlIHR3byBmaWVsZHMgYXJlIHNldCBieSBnZW5lcmF0ZWQgY29kZSBmb3IgdGhlIHlpZWxkIGFuZCB5aWVsZCoKICAvLyBzdGF0ZW1lbnQuCiAgVCBfY3VycmVudDsKICBJdGVyYWJsZTxUPiBfeWllbGRFYWNoSXRlcmFibGU7CgogIFQgZ2V0IGN1cnJlbnQgPT4KICAgICAgX3lpZWxkRWFjaEl0ZXJhdG9yICE9IG51bGwgPyBfeWllbGRFYWNoSXRlcmF0b3IuY3VycmVudCA6IF9jdXJyZW50OwoKICBfU3luY0l0ZXJhdG9yKHRoaXMuX21vdmVOZXh0Rm4pOwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKF9tb3ZlTmV4dEZuID09IG51bGwpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaWYgKF95aWVsZEVhY2hJdGVyYXRvciAhPSBudWxsKSB7CiAgICAgICAgaWYgKF95aWVsZEVhY2hJdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgX3lpZWxkRWFjaEl0ZXJhdG9yID0gbnVsbDsKICAgICAgfQogICAgICAvLyBfbW92ZU5leHRGbigpIHdpbGwgdXBkYXRlIHRoZSB2YWx1ZXMgb2YgX3lpZWxkRWFjaEl0ZXJhYmxlCiAgICAgIC8vICBhbmQgX2N1cnJlbnQuCiAgICAgIGlmICghX21vdmVOZXh0Rm4odGhpcykpIHsKICAgICAgICBfbW92ZU5leHRGbiA9IG51bGw7CiAgICAgICAgX2N1cnJlbnQgPSBudWxsOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAoX3lpZWxkRWFjaEl0ZXJhYmxlICE9IG51bGwpIHsKICAgICAgICAvLyBTcGVjIG1hbmRhdGVzOiBpdCBpcyBhIGR5bmFtaWMgZXJyb3IgaWYgdGhlIGNsYXNzIG9mIFt0aGUgb2JqZWN0CiAgICAgICAgLy8gcmV0dXJuZWQgYnkgeWllbGQqXSBkb2VzIG5vdCBpbXBsZW1lbnQgSXRlcmFibGUuCiAgICAgICAgX3lpZWxkRWFjaEl0ZXJhdG9yID0gX3lpZWxkRWFjaEl0ZXJhYmxlLml0ZXJhdG9yOwogICAgICAgIF95aWVsZEVhY2hJdGVyYWJsZSA9IG51bGw7CiAgICAgICAgX2N1cnJlbnQgPSBudWxsOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KfQoKQHBhdGNoCmNsYXNzIFN0YWNrVHJhY2UgewogIEBwYXRjaAogIHN0YXRpYyBTdGFja1RyYWNlIGdldCBjdXJyZW50IG5hdGl2ZSAiU3RhY2tUcmFjZV9jdXJyZW50IjsKfQqAsABOTjwBTUpLKwExARgJERMhHR4WDxcZHhEjHQ8UATMBGQkRFhcUGRIRDh0dAUABJAEgARk/AToWHB0bGxcdHR4ZHx8gHhkfKBsaGx0dGyAkHRsaHgEHDCIiIiclKCsjAgFFHBQQHiYCAT9EKwFDATFDLwEpAR1GQkc2BAIBMCkiAUkQDiIBE0oBIwEUHxQGEygtFwojCEQYIBwZFggoTDw6IxkSCBMGBAIBBxMJPQIBH2RhcnQ6Y29yZS1wYXRjaC9jb3JlX3BhdGNoLmRhcnQqb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi9hcnJheS5kYXJ0nA0vLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0xpc3Q8RT4gZXh0ZW5kcyBGaXhlZExlbmd0aExpc3RCYXNlPEU+IHsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9MaXN0KQogIGZhY3RvcnkgX0xpc3QobGVuZ3RoKSBuYXRpdmUgIkxpc3RfYWxsb2NhdGUiOwoKICBFIG9wZXJhdG9yIFtdKGludCBpbmRleCkgbmF0aXZlICJMaXN0X2dldEluZGV4ZWQiOwoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIEUgdmFsdWUpIHsKICAgIF9zZXRJbmRleGVkKGluZGV4LCB2YWx1ZSk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkKGludCBpbmRleCwgRSB2YWx1ZSkgbmF0aXZlICJMaXN0X3NldEluZGV4ZWQiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IGdldCBsZW5ndGggbmF0aXZlICJMaXN0X2dldExlbmd0aCI7CgogIExpc3QgX3NsaWNlKGludCBzdGFydCwgaW50IGNvdW50LCBib29sIG5lZWRzVHlwZUFyZ3VtZW50KSB7CiAgICBpZiAoY291bnQgPD0gNjQpIHsKICAgICAgZmluYWwgcmVzdWx0ID0gbmVlZHNUeXBlQXJndW1lbnQgPyBuZXcgX0xpc3Q8RT4oY291bnQpIDogbmV3IF9MaXN0KGNvdW50KTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKICAgICAgICByZXN1bHRbaV0gPSB0aGlzW3N0YXJ0ICsgaV07CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfc2xpY2VJbnRlcm5hbChzdGFydCwgY291bnQsIG5lZWRzVHlwZUFyZ3VtZW50KTsKICAgIH0KICB9CgogIExpc3QgX3NsaWNlSW50ZXJuYWwoaW50IHN0YXJ0LCBpbnQgY291bnQsIGJvb2wgbmVlZHNUeXBlQXJndW1lbnQpCiAgICAgIG5hdGl2ZSAiTGlzdF9zbGljZSI7CgogIC8vIExpc3QgaW50ZXJmYWNlLgogIHZvaWQgc2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZTxFPiBpdGVyYWJsZSwgW2ludCBza2lwQ291bnQgPSAwXSkgewogICAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+IHRoaXMubGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKHN0YXJ0LCAwLCB0aGlzLmxlbmd0aCk7CiAgICB9CiAgICBpZiAoZW5kIDwgc3RhcnQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoZW5kLCBzdGFydCwgdGhpcy5sZW5ndGgpOwogICAgfQogICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm47CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIGl0ZXJhYmxlKSkgewogICAgICBMaXN0cy5jb3B5KHRoaXMsIHNraXBDb3VudCwgdGhpcywgc3RhcnQsIGxlbmd0aCk7CiAgICB9IGVsc2UgaWYgKENsYXNzSUQuZ2V0SUQoaXRlcmFibGUpID09IENsYXNzSUQuY2lkQXJyYXkpIHsKICAgICAgZmluYWwgX0xpc3Q8RT4gaXRlcmFibGVBc0xpc3QgPSBpdGVyYWJsZTsKICAgICAgTGlzdHMuY29weShpdGVyYWJsZUFzTGlzdCwgc2tpcENvdW50LCB0aGlzLCBzdGFydCwgbGVuZ3RoKTsKICAgIH0gZWxzZSBpZiAoaXRlcmFibGUgaXMgTGlzdDxFPikgewogICAgICBMaXN0cy5jb3B5KGl0ZXJhYmxlLCBza2lwQ291bnQsIHRoaXMsIHN0YXJ0LCBsZW5ndGgpOwogICAgfSBlbHNlIHsKICAgICAgSXRlcmF0b3IgaXQgPSBpdGVyYWJsZS5pdGVyYXRvcjsKICAgICAgd2hpbGUgKHNraXBDb3VudCA+IDApIHsKICAgICAgICBpZiAoIWl0Lm1vdmVOZXh0KCkpIHJldHVybjsKICAgICAgICBza2lwQ291bnQtLTsKICAgICAgfQogICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICAgIGlmICghaXQubW92ZU5leHQoKSkgcmV0dXJuOwogICAgICAgIHRoaXNbaV0gPSBpdC5jdXJyZW50OwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHNldEFsbChpbnQgaW5kZXgsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gdGhpcy5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoaW5kZXgsIDAsIHRoaXMubGVuZ3RoLCAiaW5kZXgiKTsKICAgIH0KICAgIExpc3Q8RT4gaXRlcmFibGVBc0xpc3Q7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIGl0ZXJhYmxlKSkgewogICAgICBpdGVyYWJsZUFzTGlzdCA9IHRoaXM7CiAgICB9IGVsc2UgaWYgKENsYXNzSUQuZ2V0SUQoaXRlcmFibGUpID09IENsYXNzSUQuY2lkQXJyYXkpIHsKICAgICAgaXRlcmFibGVBc0xpc3QgPSBpdGVyYWJsZTsKICAgIH0gZWxzZSBpZiAoaXRlcmFibGUgaXMgTGlzdDxFPikgewogICAgICBpdGVyYWJsZUFzTGlzdCA9IGl0ZXJhYmxlOwogICAgfSBlbHNlIHsKICAgICAgZm9yICh2YXIgdmFsdWUgaW4gaXRlcmFibGUpIHsKICAgICAgICB0aGlzW2luZGV4KytdID0gdmFsdWU7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgaW50IGxlbmd0aCA9IGl0ZXJhYmxlQXNMaXN0Lmxlbmd0aDsKICAgIGlmIChpbmRleCArIGxlbmd0aCA+IHRoaXMubGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGluZGV4ICsgbGVuZ3RoLCAwLCB0aGlzLmxlbmd0aCk7CiAgICB9CiAgICBMaXN0cy5jb3B5KGl0ZXJhYmxlQXNMaXN0LCAwLCB0aGlzLCBpbmRleCwgbGVuZ3RoKTsKICB9CgogIExpc3Q8RT4gc3VibGlzdChpbnQgc3RhcnQsIFtpbnQgZW5kXSkgewogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gPEU+W107CiAgICB2YXIgcmVzdWx0ID0gbmV3IF9Hcm93YWJsZUxpc3Q8RT4ud2l0aERhdGEoX3NsaWNlKHN0YXJ0LCBsZW5ndGgsIGZhbHNlKSk7CiAgICByZXN1bHQuX3NldExlbmd0aChsZW5ndGgpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIEl0ZXJhYmxlIGludGVyZmFjZS4KCiAgdm9pZCBmb3JFYWNoKGYoRSBlbGVtZW50KSkgewogICAgZmluYWwgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGYodGhpc1tpXSk7CiAgICB9CiAgfQoKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3IgewogICAgcmV0dXJuIG5ldyBfRml4ZWRTaXplQXJyYXlJdGVyYXRvcjxFPih0aGlzKTsKICB9CgogIEUgZ2V0IGZpcnN0IHsKICAgIGlmIChsZW5ndGggPiAwKSByZXR1cm4gdGhpc1swXTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRSBnZXQgbGFzdCB7CiAgICBpZiAobGVuZ3RoID4gMCkgcmV0dXJuIHRoaXNbbGVuZ3RoIC0gMV07CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEUgZ2V0IHNpbmdsZSB7CiAgICBpZiAobGVuZ3RoID09IDEpIHJldHVybiB0aGlzWzBdOwogICAgaWYgKGxlbmd0aCA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLnRvb01hbnkoKTsKICB9CgogIExpc3Q8RT4gdG9MaXN0KHtib29sIGdyb3dhYmxlOiB0cnVlfSkgewogICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgaWYgKGxlbmd0aCA+IDApIHsKICAgICAgdmFyIHJlc3VsdCA9IF9zbGljZSgwLCBsZW5ndGgsICFncm93YWJsZSk7CiAgICAgIGlmIChncm93YWJsZSkgewogICAgICAgIHJlc3VsdCA9IG5ldyBfR3Jvd2FibGVMaXN0PEU+LndpdGhEYXRhKHJlc3VsdCkuLl9zZXRMZW5ndGgobGVuZ3RoKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgLy8gX0dyb3dhYmxlTGlzdC53aXRoRGF0YSBtdXN0IG5vdCBiZSBjYWxsZWQgd2l0aCBlbXB0eSBsaXN0LgogICAgcmV0dXJuIGdyb3dhYmxlID8gPEU+W10gOiBuZXcgTGlzdDxFPigwKTsKICB9Cn0KCi8vIFRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgY2xhc3MgYXMgX0xpc3QsIGJ1dCBpdCBkb2VzIG5vdAovLyBwZXJtaXQgYW55IG1vZGlmaWNhdGlvbiBvZiBhcnJheSBlbGVtZW50cyBmcm9tIERhcnQgY29kZS4gV2UgdXNlCi8vIHRoaXMgY2xhc3MgZm9yIGFycmF5cyBjb25zdHJ1Y3RlZCBmcm9tIERhcnQgYXJyYXkgbGl0ZXJhbHMuCi8vIFRPRE8oaGF1c25lcik6IFdlIHNob3VsZCBjb25zaWRlciB0aGUgdHJhZGUtb2ZmcyBiZXR3ZWVuIHR3bwovLyBjbGFzc2VzIChhbmQgaW5saW5lIGNhY2hlIG1pc3NlcykgdmVyc3VzIGEgZmllbGQgaW4gdGhlIG5hdGl2ZQovLyBpbXBsZW1lbnRhdGlvbiAoY2hlY2tzIHdoZW4gbW9kaWZ5aW5nKS4gV2Ugc2hvdWxkIGtlZXAgd2F0Y2hpbmcKLy8gdGhlIGlubGluZSBjYWNoZSBtaXNzZXMuCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0ltbXV0YWJsZUxpc3Q8RT4gZXh0ZW5kcyBVbm1vZGlmaWFibGVMaXN0QmFzZTxFPiB7CiAgZmFjdG9yeSBfSW1tdXRhYmxlTGlzdC5fdW5pbnN0YW50aWFibGUoKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiSW1tdXRhYmxlQXJyYXkgY2FuIG9ubHkgYmUgYWxsb2NhdGVkIGJ5IHRoZSBWTSIpOwogIH0KCiAgZmFjdG9yeSBfSW1tdXRhYmxlTGlzdC5fZnJvbShMaXN0IGZyb20sIGludCBvZmZzZXQsIGludCBsZW5ndGgpCiAgICAgIG5hdGl2ZSAiSW1tdXRhYmxlTGlzdF9mcm9tIjsKCiAgRSBvcGVyYXRvciBbXShpbnQgaW5kZXgpIG5hdGl2ZSAiTGlzdF9nZXRJbmRleGVkIjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBnZXQgbGVuZ3RoIG5hdGl2ZSAiTGlzdF9nZXRMZW5ndGgiOwoKICBMaXN0PEU+IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIDxFPltdOwogICAgTGlzdCBsaXN0ID0gbmV3IF9MaXN0KGxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGxpc3RbaV0gPSB0aGlzW3N0YXJ0ICsgaV07CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gbmV3IF9Hcm93YWJsZUxpc3Q8RT4ud2l0aERhdGEobGlzdCk7CiAgICByZXN1bHQuX3NldExlbmd0aChsZW5ndGgpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIENvbGxlY3Rpb24gaW50ZXJmYWNlLgoKICB2b2lkIGZvckVhY2goZihFIGVsZW1lbnQpKSB7CiAgICBmaW5hbCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgZih0aGlzW2ldKTsKICAgIH0KICB9CgogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciB7CiAgICByZXR1cm4gbmV3IF9GaXhlZFNpemVBcnJheUl0ZXJhdG9yPEU+KHRoaXMpOwogIH0KCiAgRSBnZXQgZmlyc3QgewogICAgaWYgKGxlbmd0aCA+IDApIHJldHVybiB0aGlzWzBdOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBFIGdldCBsYXN0IHsKICAgIGlmIChsZW5ndGggPiAwKSByZXR1cm4gdGhpc1tsZW5ndGggLSAxXTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRSBnZXQgc2luZ2xlIHsKICAgIGlmIChsZW5ndGggPT0gMSkgcmV0dXJuIHRoaXNbMF07CiAgICBpZiAobGVuZ3RoID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogIH0KCiAgTGlzdDxFPiB0b0xpc3Qoe2Jvb2wgZ3Jvd2FibGU6IHRydWV9KSB7CiAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBpZiAobGVuZ3RoID4gMCkgewogICAgICBMaXN0IGxpc3QgPSBncm93YWJsZSA/IG5ldyBfTGlzdChsZW5ndGgpIDogbmV3IF9MaXN0PEU+KGxlbmd0aCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICBsaXN0W2ldID0gdGhpc1tpXTsKICAgICAgfQogICAgICBpZiAoIWdyb3dhYmxlKSByZXR1cm4gbGlzdDsKICAgICAgdmFyIHJlc3VsdCA9IG5ldyBfR3Jvd2FibGVMaXN0PEU+LndpdGhEYXRhKGxpc3QpOwogICAgICByZXN1bHQuX3NldExlbmd0aChsZW5ndGgpOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIGdyb3dhYmxlID8gPEU+W10gOiBuZXcgX0xpc3Q8RT4oMCk7CiAgfQp9CgovLyBJdGVyYXRvciBmb3IgYXJyYXlzIHdpdGggZml4ZWQgc2l6ZS4KY2xhc3MgX0ZpeGVkU2l6ZUFycmF5SXRlcmF0b3I8RT4gaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7CiAgZmluYWwgTGlzdDxFPiBfYXJyYXk7CiAgZmluYWwgaW50IF9sZW5ndGg7IC8vIENhY2hlIGFycmF5IGxlbmd0aCBmb3IgZmFzdGVyIGFjY2Vzcy4KICBpbnQgX2luZGV4OwogIEUgX2N1cnJlbnQ7CgogIF9GaXhlZFNpemVBcnJheUl0ZXJhdG9yKExpc3Q8RT4gYXJyYXkpCiAgICAgIDogX2FycmF5ID0gYXJyYXksCiAgICAgICAgX2xlbmd0aCA9IGFycmF5Lmxlbmd0aCwKICAgICAgICBfaW5kZXggPSAwIHsKICAgIGFzc2VydChhcnJheSBpcyBfTGlzdDxFPiB8fCBhcnJheSBpcyBfSW1tdXRhYmxlTGlzdDxFPik7CiAgfQoKICBFIGdldCBjdXJyZW50ID0+IF9jdXJyZW50OwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKF9pbmRleCA+PSBfbGVuZ3RoKSB7CiAgICAgIF9jdXJyZW50ID0gbnVsbDsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgX2N1cnJlbnQgPSBfYXJyYXlbX2luZGV4XTsKICAgIF9pbmRleCsrOwogICAgcmV0dXJuIHRydWU7CiAgfQp9CoD7AE5OPAEeARowKTABNQEqHwQBQQE0KgE+F1EwJQgVDT4GBAFEGwEVUSw5Biw7Bh4dJTg+MEImPA0nHiQVCCokHggGBAExLEIGHCUdPiEmIQ0kHwgOBigoQgY4BAEqPx4jTh8TBAEZAR8gJxIGBAEdMQQBECQsBAEPLSwEARElPSoEASoeFjEWTAgVBkIuBAIBQEQ/QEJDHBo6LSA7BAFCIwE1ATQqASo/HiMjJyEGNh8TBAEbAR8gJxIGBAEdMQQBECQsBAEPLSwEARElPSoEASoeFkcpGwgiOCEVBi8EAgEoOhg+Dg4BKRggFT0EAR0BFB0XFAYfDhEEAgEaZGFydDpjb3JlLXBhdGNoL2FycmF5LmRhcnQxb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi9iaWdpbnRfcGF0Y2guZGFydMABfNQvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiBkYXJ0LmNvcmU7CgovLyBDb3B5cmlnaHQgMjAwOSBUaGUgR28gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUKLy8gbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLyoKICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDUgIFRvbSBXdQogKiBDb3B5cmlnaHQgKGMpIDIwMTIgQWRhbSBTaW5nZXIgKGFkYW1Ac29sdnIuaW8pCiAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwogKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogKgogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQogKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCiAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkKICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogKgogKiBJTiBOTyBFVkVOVCBTSEFMTCBUT00gV1UgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwKICogSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELCBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSCiAqIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YKICogVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBBUklTSU5HIE9VVAogKiBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKgogKiBJbiBhZGRpdGlvbiwgdGhlIGZvbGxvd2luZyBjb25kaXRpb24gYXBwbGllczoKICoKICogQWxsIHJlZGlzdHJpYnV0aW9ucyBtdXN0IHJldGFpbiBhbiBpbnRhY3QgY29weSBvZiB0aGlzIGNvcHlyaWdodCBub3RpY2UKICogYW5kIGRpc2NsYWltZXIuCiAqLwoKQHBhdGNoCmNsYXNzIEJpZ0ludCBpbXBsZW1lbnRzIENvbXBhcmFibGU8QmlnSW50PiB7CiAgQHBhdGNoCiAgc3RhdGljIEJpZ0ludCBnZXQgemVybyA9PiBfQmlnSW50SW1wbC56ZXJvOwogIEBwYXRjaAogIHN0YXRpYyBCaWdJbnQgZ2V0IG9uZSA9PiBfQmlnSW50SW1wbC5vbmU7CiAgQHBhdGNoCiAgc3RhdGljIEJpZ0ludCBnZXQgdHdvID0+IF9CaWdJbnRJbXBsLnR3bzsKCiAgQHBhdGNoCiAgc3RhdGljIEJpZ0ludCBwYXJzZShTdHJpbmcgc291cmNlLCB7aW50IHJhZGl4fSkgPT4KICAgICAgX0JpZ0ludEltcGwucGFyc2Uoc291cmNlLCByYWRpeDogcmFkaXgpOwoKICBAcGF0Y2gKICBzdGF0aWMgQmlnSW50IHRyeVBhcnNlKFN0cmluZyBzb3VyY2UsIHtpbnQgcmFkaXh9KSA9PgogICAgICBfQmlnSW50SW1wbC5fdHJ5UGFyc2Uoc291cmNlLCByYWRpeDogcmFkaXgpOwoKICBAcGF0Y2gKICBmYWN0b3J5IEJpZ0ludC5mcm9tKG51bSB2YWx1ZSkgPT4gbmV3IF9CaWdJbnRJbXBsLmZyb20odmFsdWUpOwp9CgppbnQgX21heChpbnQgYSwgaW50IGIpID0+IGEgPiBiID8gYSA6IGI7CmludCBfbWluKGludCBhLCBpbnQgYikgPT4gYSA8IGIgPyBhIDogYjsKCi8vLyBBbGxvY2F0ZSBhIG5ldyBkaWdpdHMgbGlzdCBvZiBldmVuIGxlbmd0aC4KVWludDMyTGlzdCBfbmV3RGlnaXRzKGludCBsZW5ndGgpID0+IG5ldyBVaW50MzJMaXN0KGxlbmd0aCArIChsZW5ndGggJiAxKSk7CgovKioKICogQW4gaW1wbGVtZW50YXRpb24gZm9yIHRoZSBhcmJpdHJhcmlseSBsYXJnZSBpbnRlZ2VyLgogKgogKiBUaGUgaW50ZWdlciBudW1iZXIgaXMgcmVwcmVzZW50ZWQgYnkgYSBzaWduLCBhbiBhcnJheSBvZiAzMi1iaXQgdW5zaWduZWQKICogaW50ZWdlcnMgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQsIGFuZCBhIG51bWJlciBvZiB1c2VkIGRpZ2l0cyBpbiB0aGF0IGFycmF5LgogKi8KY2xhc3MgX0JpZ0ludEltcGwgaW1wbGVtZW50cyBCaWdJbnQgewogIC8vIEJpdHMgcGVyIGRpZ2l0LgogIHN0YXRpYyBjb25zdCBpbnQgX2RpZ2l0Qml0cyA9IDMyOwogIHN0YXRpYyBjb25zdCBpbnQgX2RpZ2l0QmFzZSA9IDEgPDwgX2RpZ2l0Qml0czsKICBzdGF0aWMgY29uc3QgaW50IF9kaWdpdE1hc2sgPSAoMSA8PCBfZGlnaXRCaXRzKSAtIDE7CgogIC8vIEJpdHMgcGVyIGhhbGYgZGlnaXQuCiAgc3RhdGljIGNvbnN0IGludCBfaGFsZkRpZ2l0Qml0cyA9IF9kaWdpdEJpdHMgPj4gMTsKICBzdGF0aWMgY29uc3QgaW50IF9oYWxmRGlnaXRNYXNrID0gKDEgPDwgX2hhbGZEaWdpdEJpdHMpIC0gMTsKCiAgc3RhdGljIGZpbmFsIF9CaWdJbnRJbXBsIHplcm8gPSBuZXcgX0JpZ0ludEltcGwuX2Zyb21JbnQoMCk7CiAgc3RhdGljIGZpbmFsIF9CaWdJbnRJbXBsIG9uZSA9IG5ldyBfQmlnSW50SW1wbC5fZnJvbUludCgxKTsKICBzdGF0aWMgZmluYWwgX0JpZ0ludEltcGwgdHdvID0gbmV3IF9CaWdJbnRJbXBsLl9mcm9tSW50KDIpOwoKICBzdGF0aWMgZmluYWwgX0JpZ0ludEltcGwgX21pbnVzT25lID0gLW9uZTsKICBzdGF0aWMgZmluYWwgX0JpZ0ludEltcGwgX29uZURpZ2l0TWFzayA9IG5ldyBfQmlnSW50SW1wbC5fZnJvbUludChfZGlnaXRNYXNrKTsKICBzdGF0aWMgZmluYWwgX0JpZ0ludEltcGwgX3R3b0RpZ2l0TWFzayA9IChvbmUgPDwgKDIgKiBfZGlnaXRCaXRzKSkgLSBvbmU7CiAgc3RhdGljIGZpbmFsIF9CaWdJbnRJbXBsIF9vbmVCaWxsaW9uID0gbmV3IF9CaWdJbnRJbXBsLl9mcm9tSW50KDEwMDAwMDAwMDApOwogIHN0YXRpYyBjb25zdCBpbnQgX21pbkludCA9IC0weDgwMDAwMDAwMDAwMDAwMDA7CiAgc3RhdGljIGNvbnN0IGludCBfbWF4SW50ID0gMHg3ZmZmZmZmZmZmZmZmZmZmOwoKICAvLyBSZXN1bHQgY2FjaGUgZm9yIGxhc3QgX2RpdlJlbSBjYWxsLgogIC8vIFJlc3VsdCBjYWNoZSBmb3IgbGFzdCBfZGl2UmVtIGNhbGwuCiAgc3RhdGljIFVpbnQzMkxpc3QgX2xhc3REaXZpZGVuZERpZ2l0czsKICBzdGF0aWMgaW50IF9sYXN0RGl2aWRlbmRVc2VkOwogIHN0YXRpYyBVaW50MzJMaXN0IF9sYXN0RGl2aXNvckRpZ2l0czsKICBzdGF0aWMgaW50IF9sYXN0RGl2aXNvclVzZWQ7CiAgc3RhdGljIFVpbnQzMkxpc3QgX2xhc3RRdW9SZW1EaWdpdHM7CiAgc3RhdGljIGludCBfbGFzdFF1b1JlbVVzZWQ7CiAgc3RhdGljIGludCBfbGFzdFJlbVVzZWQ7CiAgc3RhdGljIGludCBfbGFzdFJlbV9uc2g7CgogIC8vLyBXaGV0aGVyIHRoaXMgYmlnaW50IGlzIG5lZ2F0aXZlLgogIGZpbmFsIGJvb2wgX2lzTmVnYXRpdmU7CgogIC8vLyBUaGUgdW5zaWduZWQgZGlnaXRzIG9mIHRoaXMgYmlnaW50LgogIC8vLwogIC8vLyBUaGUgbGVhc3Qgc2lnbmlmaWNhbnQgZGlnaXQgaXMgaW4gc2xvdCAwLgogIC8vLyBUaGUgbGlzdCBtYXkgaGF2ZSBtb3JlIGRpZ2l0cyB0aGFuIG5lZWRlZC4gVGhhdCBpcywgYF9kaWdpdHMubGVuZ3RoYCBtYXkKICAvLy8gYmUgc3RyaWN0bHkgZ3JlYXRlciB0aGFuIGBfdXNlZGAuCiAgLy8vIEFsc28sIGBfZGlnaXRzLmxlbmd0aGAgbXVzdCBhbHdheXMgYmUgZXZlbiwgYmVjYXVzZSBpbnRyaW5zaWNzIG9uIDY0LWJpdAogIC8vLyBwbGF0Zm9ybXMgbWF5IHByb2Nlc3MgYSBkaWdpdCBwYWlyIGFzIGEgNjQtYml0IHZhbHVlLgogIGZpbmFsIFVpbnQzMkxpc3QgX2RpZ2l0czsKCiAgLy8vIFRoZSBudW1iZXIgb2YgdXNlZCBlbnRyaWVzIGluIFtfZGlnaXRzXS4KICAvLy8KICAvLy8gVG8gYXZvaWQgcmVhbGxvY2F0aW5nIFtVaW50MzJMaXN0XXMsIGxpc3RzIHRoYXQgYXJlIHRvbyBiaWcgYXJlIG5vdAogIC8vLyByZXBsYWNlZCwgYnV0IGBfdXNlZGAgcmVmbGVjdHMgdGhlIHNtYWxsZXIgbnVtYmVyIG9mIGRpZ2l0cyBhY3R1YWxseSB1c2VkLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgZnVuY3Rpb25zIHNob3J0ZW5pbmcgYW4gZXhpc3RpbmcgbGlzdCBvZiBkaWdpdHMgdG8gYSBzbWFsbGVyCiAgLy8vIGBfdXNlZGAgbnVtYmVyIG9mIGRpZ2l0cyBtdXN0IGVuc3VyZSB0aGF0IHRoZSBoaWdoZXJtb3N0IHBhaXIgb2YgZGlnaXRzCiAgLy8vIGlzIGNvcnJlY3Qgd2hlbiByZWFkIGFzIGEgNjQtYml0IHZhbHVlIGJ5IGludHJpbnNpY3MuIFRoZXJlZm9yZSwgaWYgdGhlCiAgLy8vIHNtYWxsZXIgJ191c2VkJyBudW1iZXIgaXMgb2RkLCB0aGUgaGlnaCBkaWdpdCBvZiB0aGF0IHBhaXIgbXVzdCBiZQogIC8vLyBleHBsaWNpdGx5IGNsZWFyZWQsIGkuZS4gX2RpZ2l0c1tfdXNlZF0gPSAwLCB3aGljaCBjYW5ub3QgcmVzdWx0IGluIGFuCiAgLy8vIG91dCBvZiBib3VuZHMgYWNjZXNzLCBzaW5jZSB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGlzIGd1YXJhbnRlZWQgdG8gYmUKICAvLy8gZXZlbi4KICBmaW5hbCBpbnQgX3VzZWQ7CgogIC8qKgogICAqIFBhcnNlcyBbc291cmNlXSBhcyBhLCBwb3NzaWJseSBzaWduZWQsIGludGVnZXIgbGl0ZXJhbCBhbmQgcmV0dXJucyBpdHMKICAgKiB2YWx1ZS4KICAgKgogICAqIFRoZSBbc291cmNlXSBtdXN0IGJlIGEgbm9uLWVtcHR5IHNlcXVlbmNlIG9mIGJhc2UtW3JhZGl4XSBkaWdpdHMsCiAgICogb3B0aW9uYWxseSBwcmVmaXhlZCB3aXRoIGEgbWludXMgb3IgcGx1cyBzaWduICgnLScgb3IgJysnKS4KICAgKgogICAqIFRoZSBbcmFkaXhdIG11c3QgYmUgaW4gdGhlIHJhbmdlIDIuLjM2LiBUaGUgZGlnaXRzIHVzZWQgYXJlCiAgICogZmlyc3QgdGhlIGRlY2ltYWwgZGlnaXRzIDAuLjksIGFuZCB0aGVuIHRoZSBsZXR0ZXJzICdhJy4uJ3onIHdpdGgKICAgKiB2YWx1ZXMgMTAgdGhyb3VnaCAzNS4gQWxzbyBhY2NlcHRzIHVwcGVyLWNhc2UgbGV0dGVycyB3aXRoIHRoZSBzYW1lCiAgICogdmFsdWVzIGFzIHRoZSBsb3dlci1jYXNlIG9uZXMuCiAgICoKICAgKiBJZiBubyBbcmFkaXhdIGlzIGdpdmVuIHRoZW4gaXQgZGVmYXVsdHMgdG8gMTAuIEluIHRoaXMgY2FzZSwgdGhlIFtzb3VyY2VdCiAgICogZGlnaXRzIG1heSBhbHNvIHN0YXJ0IHdpdGggYDB4YCwgaW4gd2hpY2ggY2FzZSB0aGUgbnVtYmVyIGlzIGludGVycHJldGVkCiAgICogYXMgYSBoZXhhZGVjaW1hbCBsaXRlcmFsLCB3aGljaCBlZmZlY3RpdmVseSBtZWFucyB0aGF0IHRoZSBgMHhgIGlzIGlnbm9yZWQKICAgKiBhbmQgdGhlIHJhZGl4IGlzIGluc3RlYWQgc2V0IHRvIDE2LgogICAqCiAgICogRm9yIGFueSBpbnQgYG5gIGFuZCByYWRpeCBgcmAsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdAogICAqIGBuID09IGludC5wYXJzZShuLnRvUmFkaXhTdHJpbmcociksIHJhZGl4OiByKWAuCiAgICoKICAgKiBUaHJvd3MgYSBbRm9ybWF0RXhjZXB0aW9uXSBpZiB0aGUgW3NvdXJjZV0gaXMgbm90IGEgdmFsaWQgaW50ZWdlciBsaXRlcmFsLAogICAqIG9wdGlvbmFsbHkgcHJlZml4ZWQgYnkgYSBzaWduLgogICAqLwogIHN0YXRpYyBfQmlnSW50SW1wbCBwYXJzZShTdHJpbmcgc291cmNlLCB7aW50IHJhZGl4fSkgewogICAgdmFyIHJlc3VsdCA9IF90cnlQYXJzZShzb3VyY2UsIHJhZGl4OiByYWRpeCk7CiAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiQ291bGQgbm90IHBhcnNlIEJpZ0ludCIsIHNvdXJjZSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIFBhcnNlcyBhIGRlY2ltYWwgYmlnaW50IGxpdGVyYWwuCiAgLy8vCiAgLy8vIFRoZSBbc291cmNlXSBtdXN0IG5vdCBjb250YWluIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZS4KICBzdGF0aWMgX0JpZ0ludEltcGwgX3BhcnNlRGVjaW1hbChTdHJpbmcgc291cmNlLCBib29sIGlzTmVnYXRpdmUpIHsKICAgIGNvbnN0IF8wID0gNDg7CgogICAgaW50IHBhcnQgPSAwOwogICAgX0JpZ0ludEltcGwgcmVzdWx0ID0gemVybzsKICAgIC8vIFJlYWQgaW4gdGhlIHNvdXJjZSA5IGRpZ2l0cyBhdCBhIHRpbWUuCiAgICAvLyBUaGUgZmlyc3QgcGFydCBtYXkgaGF2ZSBhIGZldyBsZWFkaW5nIHZpcnR1YWwgJzAncyB0byBtYWtlIHRoZSByZW1haW5pbmcKICAgIC8vIHBhcnRzIGFsbCBoYXZlIGV4YWN0bHkgOSBkaWdpdHMuCiAgICBpbnQgZGlnaXRJblBhcnRDb3VudCA9IDkgLSBzb3VyY2UubGVuZ3RoLnJlbWFpbmRlcig5KTsKICAgIGlmIChkaWdpdEluUGFydENvdW50ID09IDkpIGRpZ2l0SW5QYXJ0Q291bnQgPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHsKICAgICAgcGFydCA9IHBhcnQgKiAxMCArIHNvdXJjZS5jb2RlVW5pdEF0KGkpIC0gXzA7CiAgICAgIGlmICgrK2RpZ2l0SW5QYXJ0Q291bnQgPT0gOSkgewogICAgICAgIHJlc3VsdCA9IHJlc3VsdCAqIF9vbmVCaWxsaW9uICsgbmV3IF9CaWdJbnRJbXBsLl9mcm9tSW50KHBhcnQpOwogICAgICAgIHBhcnQgPSAwOwogICAgICAgIGRpZ2l0SW5QYXJ0Q291bnQgPSAwOwogICAgICB9CiAgICB9CiAgICBpZiAoaXNOZWdhdGl2ZSkgcmV0dXJuIC1yZXN1bHQ7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgZ2l2ZW4gc291cmNlIGRpZ2l0LgogIC8vLwogIC8vLyBTb3VyY2UgZGlnaXRzIGJldHdlZW4gIjAiIGFuZCAiOSIgKGluY2x1c2l2ZSkgcmV0dXJuIHRoZWlyIGRlY2ltYWwgdmFsdWUuCiAgLy8vCiAgLy8vIFNvdXJjZSBkaWdpdHMgYmV0d2VlbiAiYSIgYW5kICJ6Iiwgb3IgIkEiIGFuZCAiWiIgKGluY2x1c2l2ZSkgcmV0dXJuCiAgLy8vIDEwICsgdGhlaXIgcG9zaXRpb24gaW4gdGhlIEFTQ0lJIGFscGhhYmV0LgogIC8vLwogIC8vLyBUaGUgaW5jb21pbmcgW2NvZGVVbml0XSBtdXN0IGJlIGFuIEFTQ0lJIGNvZGUtdW5pdC4KICBzdGF0aWMgaW50IF9jb2RlVW5pdFRvUmFkaXhWYWx1ZShpbnQgY29kZVVuaXQpIHsKICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2hhcmFjdGVycyBtdXN0IGJlIEFTQ0lJIGFzIG90aGVyd2lzZSB0aGUKICAgIC8vIHJlZ2V4cCB3b3VsZG4ndCBoYXZlIG1hdGNoZWQuIExvd2VyY2FzaW5nIGJ5IGRvaW5nIGB8IDB4MjBgIGlzIHRodXMKICAgIC8vIGd1YXJhbnRlZWQgdG8gYmUgYSBzYWZlIG9wZXJhdGlvbiwgc2luY2UgaXQgcHJlc2VydmVzIGRpZ2l0cwogICAgLy8gYW5kIGxvd2VyLWNhc2VzIEFTQ0lJIGxldHRlcnMuCiAgICBjb25zdCBpbnQgXzAgPSA0ODsKICAgIGNvbnN0IGludCBfOSA9IDU3OwogICAgY29uc3QgaW50IF9hID0gOTc7CiAgICBpZiAoXzAgPD0gY29kZVVuaXQgJiYgY29kZVVuaXQgPD0gXzkpIHJldHVybiBjb2RlVW5pdCAtIF8wOwogICAgY29kZVVuaXQgfD0gMHgyMDsKICAgIHZhciByZXN1bHQgPSBjb2RlVW5pdCAtIF9hICsgMTA7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIFBhcnNlcyB0aGUgZ2l2ZW4gW3NvdXJjZV0gc3RyaW5nLCBzdGFydGluZyBhdCBbc3RhcnRQb3NdLCBhcyBhIGhleAogIC8vLyBsaXRlcmFsLgogIC8vLwogIC8vLyBJZiBbaXNOZWdhdGl2ZV0gaXMgdHJ1ZSwgbmVnYXRlcyB0aGUgcmVzdWx0IGJlZm9yZSByZXR1cm5pbmcgaXQuCiAgLy8vCiAgLy8vIFRoZSBbc291cmNlXSAoc3Vic3RyaW5nKSBtdXN0IGJlIGEgdmFsaWQgaGV4IGxpdGVyYWwuCiAgc3RhdGljIF9CaWdJbnRJbXBsIF9wYXJzZUhleChTdHJpbmcgc291cmNlLCBpbnQgc3RhcnRQb3MsIGJvb2wgaXNOZWdhdGl2ZSkgewogICAgaW50IGhleENoYXJzUGVyRGlnaXQgPSBfZGlnaXRCaXRzIH4vIDQ7CiAgICBpbnQgc291cmNlTGVuZ3RoID0gc291cmNlLmxlbmd0aCAtIHN0YXJ0UG9zOwogICAgaW50IHVzZWQgPSAoc291cmNlTGVuZ3RoICsgaGV4Q2hhcnNQZXJEaWdpdCAtIDEpIH4vIGhleENoYXJzUGVyRGlnaXQ7CiAgICB2YXIgZGlnaXRzID0gX25ld0RpZ2l0cyh1c2VkKTsKCiAgICBpbnQgbGFzdERpZ2l0TGVuZ3RoID0gc291cmNlTGVuZ3RoIC0gKHVzZWQgLSAxKSAqIGhleENoYXJzUGVyRGlnaXQ7CiAgICBpbnQgZGlnaXRJbmRleCA9IHVzZWQgLSAxOwogICAgaW50IGkgPSBzdGFydFBvczsKICAgIGludCBkaWdpdCA9IDA7CiAgICBmb3IgKGludCBqID0gMDsgaiA8IGxhc3REaWdpdExlbmd0aDsgaisrKSB7CiAgICAgIHZhciB2YWx1ZSA9IF9jb2RlVW5pdFRvUmFkaXhWYWx1ZShzb3VyY2UuY29kZVVuaXRBdChpKyspKTsKICAgICAgaWYgKHZhbHVlID49IDE2KSByZXR1cm4gbnVsbDsKICAgICAgZGlnaXQgPSBkaWdpdCAqIDE2ICsgdmFsdWU7CiAgICB9CiAgICBkaWdpdHNbZGlnaXRJbmRleC0tXSA9IGRpZ2l0OwoKICAgIHdoaWxlIChpIDwgc291cmNlLmxlbmd0aCkgewogICAgICBkaWdpdCA9IDA7CiAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaGV4Q2hhcnNQZXJEaWdpdDsgaisrKSB7CiAgICAgICAgdmFyIHZhbHVlID0gX2NvZGVVbml0VG9SYWRpeFZhbHVlKHNvdXJjZS5jb2RlVW5pdEF0KGkrKykpOwogICAgICAgIGlmICh2YWx1ZSA+PSAxNikgcmV0dXJuIG51bGw7CiAgICAgICAgZGlnaXQgPSBkaWdpdCAqIDE2ICsgdmFsdWU7CiAgICAgIH0KICAgICAgZGlnaXRzW2RpZ2l0SW5kZXgtLV0gPSBkaWdpdDsKICAgIH0KICAgIGlmICh1c2VkID09IDEgJiYgZGlnaXRzWzBdID09IDApIHJldHVybiB6ZXJvOwogICAgcmV0dXJuIG5ldyBfQmlnSW50SW1wbC5fKGlzTmVnYXRpdmUsIHVzZWQsIGRpZ2l0cyk7CiAgfQoKICAvLy8gUGFyc2VzIHRoZSBnaXZlbiBbc291cmNlXSBhcyBhIFtyYWRpeF0gbGl0ZXJhbC4KICAvLy8KICAvLy8gVGhlIFtzb3VyY2VdIHdpbGwgYmUgY2hlY2tlZCBmb3IgaW52YWxpZCBjaGFyYWN0ZXJzLiBJZiBpdCBpcyBpbnZhbGlkLAogIC8vLyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYG51bGxgLgogIHN0YXRpYyBfQmlnSW50SW1wbCBfcGFyc2VSYWRpeChTdHJpbmcgc291cmNlLCBpbnQgcmFkaXgsIGJvb2wgaXNOZWdhdGl2ZSkgewogICAgdmFyIHJlc3VsdCA9IHplcm87CiAgICB2YXIgYmFzZSA9IG5ldyBfQmlnSW50SW1wbC5fZnJvbUludChyYWRpeCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykgewogICAgICB2YXIgdmFsdWUgPSBfY29kZVVuaXRUb1JhZGl4VmFsdWUoc291cmNlLmNvZGVVbml0QXQoaSkpOwogICAgICBpZiAodmFsdWUgPj0gcmFkaXgpIHJldHVybiBudWxsOwogICAgICByZXN1bHQgPSByZXN1bHQgKiBiYXNlICsgbmV3IF9CaWdJbnRJbXBsLl9mcm9tSW50KHZhbHVlKTsKICAgIH0KICAgIGlmIChpc05lZ2F0aXZlKSByZXR1cm4gLXJlc3VsdDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gVHJpZXMgdG8gcGFyc2UgdGhlIGdpdmVuIFtzb3VyY2VdIGFzIGEgW3JhZGl4XSBsaXRlcmFsLgogIC8vLwogIC8vLyBSZXR1cm5zIHRoZSBwYXJzZWQgYmlnIGludGVnZXIsIG9yIGBudWxsYCBpZiBpdCBmYWlsZWQuCiAgLy8vCiAgLy8vIElmIHRoZSBbcmFkaXhdIGlzIGBudWxsYCBhY2NlcHRzIGRlY2ltYWwgbGl0ZXJhbHMgb3IgYDB4YCBoZXggbGl0ZXJhbHMuCiAgc3RhdGljIF9CaWdJbnRJbXBsIF90cnlQYXJzZShTdHJpbmcgc291cmNlLCB7aW50IHJhZGl4fSkgewogICAgaWYgKHNvdXJjZSA9PSAiIikgcmV0dXJuIG51bGw7CgogICAgdmFyIHJlID0gbmV3IFJlZ0V4cChyJ15ccyooWystXT8pKCgweFthLWYwLTldKyl8KFxkKyl8KFthLXowLTldKykpXHMqJCcsCiAgICAgICAgY2FzZVNlbnNpdGl2ZTogZmFsc2UpOwogICAgdmFyIG1hdGNoID0gcmUuZmlyc3RNYXRjaChzb3VyY2UpOwogICAgaW50IHNpZ25JbmRleCA9IDE7CiAgICBpbnQgaGV4SW5kZXggPSAzOwogICAgaW50IGRlY2ltYWxJbmRleCA9IDQ7CiAgICBpbnQgbm9uRGVjaW1hbEhleEluZGV4ID0gNTsKICAgIGlmIChtYXRjaCA9PSBudWxsKSByZXR1cm4gbnVsbDsKCiAgICBib29sIGlzTmVnYXRpdmUgPSBtYXRjaFtzaWduSW5kZXhdID09ICItIjsKCiAgICBTdHJpbmcgZGVjaW1hbE1hdGNoID0gbWF0Y2hbZGVjaW1hbEluZGV4XTsKICAgIFN0cmluZyBoZXhNYXRjaCA9IG1hdGNoW2hleEluZGV4XTsKICAgIFN0cmluZyBub25EZWNpbWFsTWF0Y2ggPSBtYXRjaFtub25EZWNpbWFsSGV4SW5kZXhdOwoKICAgIGlmIChyYWRpeCA9PSBudWxsKSB7CiAgICAgIGlmIChkZWNpbWFsTWF0Y2ggIT0gbnVsbCkgewogICAgICAgIC8vIENhbm5vdCBmYWlsIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHRoZSBkaWdpdHMgYXJlIGFsbCBkZWNpbWFsLgogICAgICAgIHJldHVybiBfcGFyc2VEZWNpbWFsKGRlY2ltYWxNYXRjaCwgaXNOZWdhdGl2ZSk7CiAgICAgIH0KICAgICAgaWYgKGhleE1hdGNoICE9IG51bGwpIHsKICAgICAgICAvLyBDYW5ub3QgZmFpbCBiZWNhdXNlIHdlIGtub3cgdGhhdCB0aGUgZGlnaXRzIGFyZSBhbGwgaGV4LgogICAgICAgIHJldHVybiBfcGFyc2VIZXgoaGV4TWF0Y2gsIDIsIGlzTmVnYXRpdmUpOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGlmIChyYWRpeCBpcyEgaW50KSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKHJhZGl4LCAncmFkaXgnLCAnaXMgbm90IGFuIGludGVnZXInKTsKICAgIH0KICAgIGlmIChyYWRpeCA8IDIgfHwgcmFkaXggPiAzNikgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShyYWRpeCwgMiwgMzYsICdyYWRpeCcpOwogICAgfQogICAgaWYgKHJhZGl4ID09IDEwICYmIGRlY2ltYWxNYXRjaCAhPSBudWxsKSB7CiAgICAgIHJldHVybiBfcGFyc2VEZWNpbWFsKGRlY2ltYWxNYXRjaCwgaXNOZWdhdGl2ZSk7CiAgICB9CiAgICBpZiAocmFkaXggPT0gMTYgJiYgKGRlY2ltYWxNYXRjaCAhPSBudWxsIHx8IG5vbkRlY2ltYWxNYXRjaCAhPSBudWxsKSkgewogICAgICByZXR1cm4gX3BhcnNlSGV4KGRlY2ltYWxNYXRjaCA/PyBub25EZWNpbWFsTWF0Y2gsIDAsIGlzTmVnYXRpdmUpOwogICAgfQoKICAgIHJldHVybiBfcGFyc2VSYWRpeCgKICAgICAgICBkZWNpbWFsTWF0Y2ggPz8gbm9uRGVjaW1hbE1hdGNoID8/IGhleE1hdGNoLCByYWRpeCwgaXNOZWdhdGl2ZSk7CiAgfQoKICAvLy8gRmluZHMgdGhlIGFtb3VudCBzaWduaWZpY2FudCBkaWdpdHMgaW4gdGhlIHByb3ZpZGVkIFtkaWdpdHNdIGFycmF5LgogIHN0YXRpYyBpbnQgX25vcm1hbGl6ZShpbnQgdXNlZCwgVWludDMyTGlzdCBkaWdpdHMpIHsKICAgIHdoaWxlICh1c2VkID4gMCAmJiBkaWdpdHNbdXNlZCAtIDFdID09IDApIHVzZWQtLTsKICAgIHJldHVybiB1c2VkOwogIH0KCiAgLy8vIEZhY3RvcnkgcmV0dXJuaW5nIGFuIGluc3RhbmNlIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIGZpZWxkIHZhbHVlcy4KICAvLy8gSWYgdGhlIFtkaWdpdHNdIGFycmF5IGNvbnRhaW5zIGxlYWRpbmcgMHMsIHRoZSBbdXNlZF0gdmFsdWUgaXMgYWRqdXN0ZWQKICAvLy8gYWNjb3JkaW5nbHkuIFRoZSBbZGlnaXRzXSBhcnJheSBpcyBub3QgbW9kaWZpZWQuCiAgX0JpZ0ludEltcGwuXyhib29sIGlzTmVnYXRpdmUsIGludCB1c2VkLCBVaW50MzJMaXN0IGRpZ2l0cykKICAgICAgOiB0aGlzLl9ub3JtYWxpemVkKGlzTmVnYXRpdmUsIF9ub3JtYWxpemUodXNlZCwgZGlnaXRzKSwgZGlnaXRzKTsKCiAgX0JpZ0ludEltcGwuX25vcm1hbGl6ZWQoYm9vbCBpc05lZ2F0aXZlLCB0aGlzLl91c2VkLCB0aGlzLl9kaWdpdHMpCiAgICAgIDogX2lzTmVnYXRpdmUgPSBfdXNlZCA9PSAwID8gZmFsc2UgOiBpc05lZ2F0aXZlIHsKICAgIGFzc2VydChfZGlnaXRzLmxlbmd0aC5pc0V2ZW4pOwogICAgYXNzZXJ0KF91c2VkLmlzRXZlbiB8fCBfZGlnaXRzW191c2VkXSA9PSAwKTsgLy8gTGVhZGluZyB6ZXJvIGZvciA2NC1iaXQuCiAgfQoKICAvLy8gV2hldGhlciB0aGlzIGJpZyBpbnRlZ2VyIGlzIHplcm8uCiAgYm9vbCBnZXQgX2lzWmVybyA9PiBfdXNlZCA9PSAwOwoKICAvLy8gQWxsb2NhdGVzIGFuIGFycmF5IG9mIHRoZSBnaXZlbiBbbGVuZ3RoXSBhbmQgY29waWVzIHRoZSBbZGlnaXRzXSBpbiB0aGUKICAvLy8gcmFuZ2UgW2Zyb21dIHRvIFt0by0xXSwgc3RhcnRpbmcgYXQgaW5kZXggMCwgZm9sbG93ZWQgYnkgbGVhZGluZyB6ZXJvCiAgLy8vIGRpZ2l0cy4KICBzdGF0aWMgVWludDMyTGlzdCBfY2xvbmVEaWdpdHMoCiAgICAgIFVpbnQzMkxpc3QgZGlnaXRzLCBpbnQgZnJvbSwgaW50IHRvLCBpbnQgbGVuZ3RoKSB7CiAgICB2YXIgcmVzdWx0RGlnaXRzID0gX25ld0RpZ2l0cyhsZW5ndGgpOwogICAgdmFyIG4gPSB0byAtIGZyb207CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICByZXN1bHREaWdpdHNbaV0gPSBkaWdpdHNbZnJvbSArIGldOwogICAgfQogICAgcmV0dXJuIHJlc3VsdERpZ2l0czsKICB9CgogIC8vLyBBbGxvY2F0ZXMgYSBiaWcgaW50ZWdlciBmcm9tIHRoZSBwcm92aWRlZCBbdmFsdWVdIG51bWJlci4KICBmYWN0b3J5IF9CaWdJbnRJbXBsLmZyb20obnVtIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT0gMCkgcmV0dXJuIHplcm87CiAgICBpZiAodmFsdWUgPT0gMSkgcmV0dXJuIG9uZTsKICAgIGlmICh2YWx1ZSA9PSAyKSByZXR1cm4gdHdvOwoKICAgIGlmICh2YWx1ZS5hYnMoKSA8IDB4MTAwMDAwMDAwKQogICAgICByZXR1cm4gbmV3IF9CaWdJbnRJbXBsLl9mcm9tSW50KHZhbHVlLnRvSW50KCkpOwogICAgaWYgKHZhbHVlIGlzIGRvdWJsZSkgcmV0dXJuIG5ldyBfQmlnSW50SW1wbC5fZnJvbURvdWJsZSh2YWx1ZSk7CiAgICByZXR1cm4gbmV3IF9CaWdJbnRJbXBsLl9mcm9tSW50KHZhbHVlKTsKICB9CgogIGZhY3RvcnkgX0JpZ0ludEltcGwuX2Zyb21JbnQoaW50IHZhbHVlKSB7CiAgICBib29sIGlzTmVnYXRpdmUgPSB2YWx1ZSA8IDA7CiAgICBhc3NlcnQoX2RpZ2l0Qml0cyA9PSAzMik7CiAgICB2YXIgZGlnaXRzID0gX25ld0RpZ2l0cygyKTsKICAgIGlmIChpc05lZ2F0aXZlKSB7CiAgICAgIC8vIEhhbmRsZSB0aGUgbWluIDY0LWJpdCB2YWx1ZSBkaWZmZXJlbnRseSwgc2luY2UgaXRzIG5lZ2F0aW9uIGlzIG5vdAogICAgICAvLyBwb3NpdGl2ZS4KICAgICAgaWYgKHZhbHVlID09IF9taW5JbnQpIHsKICAgICAgICBkaWdpdHNbMV0gPSAweDgwMDAwMDAwOwogICAgICAgIHJldHVybiBuZXcgX0JpZ0ludEltcGwuXyh0cnVlLCAyLCBkaWdpdHMpOwogICAgICB9CiAgICAgIHZhbHVlID0gLXZhbHVlOwogICAgfQogICAgaWYgKHZhbHVlIDwgX2RpZ2l0QmFzZSkgewogICAgICBkaWdpdHNbMF0gPSB2YWx1ZTsKICAgICAgcmV0dXJuIG5ldyBfQmlnSW50SW1wbC5fKGlzTmVnYXRpdmUsIDEsIGRpZ2l0cyk7CiAgICB9CiAgICBkaWdpdHNbMF0gPSB2YWx1ZSAmIF9kaWdpdE1hc2s7CiAgICBkaWdpdHNbMV0gPSB2YWx1ZSA+PiBfZGlnaXRCaXRzOwogICAgcmV0dXJuIG5ldyBfQmlnSW50SW1wbC5fKGlzTmVnYXRpdmUsIDIsIGRpZ2l0cyk7CiAgfQoKICAvLy8gQW4gOC1ieXRlIFVpbnQ4TGlzdCB3ZSBjYW4gcmV1c2UgZm9yIFtfZnJvbURvdWJsZV0gdG8gYXZvaWQgZ2VuZXJhdGluZwogIC8vLyBnYXJiYWdlLgogIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgX2JpdHNGb3JGcm9tRG91YmxlID0gbmV3IFVpbnQ4TGlzdCg4KTsKCiAgZmFjdG9yeSBfQmlnSW50SW1wbC5fZnJvbURvdWJsZShkb3VibGUgdmFsdWUpIHsKICAgIGNvbnN0IGludCBleHBvbmVudEJpYXMgPSAxMDc1OwoKICAgIGlmICh2YWx1ZS5pc05hTiB8fCB2YWx1ZS5pc0luZmluaXRlKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJWYWx1ZSBtdXN0IGJlIGZpbml0ZTogJHZhbHVlIik7CiAgICB9CiAgICBib29sIGlzTmVnYXRpdmUgPSB2YWx1ZSA8IDA7CiAgICBpZiAoaXNOZWdhdGl2ZSkgdmFsdWUgPSAtdmFsdWU7CgogICAgdmFsdWUgPSB2YWx1ZS5mbG9vclRvRG91YmxlKCk7CiAgICBpZiAodmFsdWUgPT0gMCkgcmV0dXJuIHplcm87CgogICAgdmFyIGJpdHMgPSBfYml0c0ZvckZyb21Eb3VibGU7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgewogICAgICBiaXRzW2ldID0gMDsKICAgIH0KICAgIGJpdHMuYnVmZmVyLmFzQnl0ZURhdGEoKS5zZXRGbG9hdDY0KDAsIHZhbHVlLCBFbmRpYW4ubGl0dGxlKTsKICAgIC8vIFRoZSBleHBvbmVudCBpcyBpbiBiaXRzIDUzLi42My4KICAgIHZhciBiaWFzZWRFeHBvbmVudCA9IChiaXRzWzddIDw8IDQpICsgKGJpdHNbNl0gPj4gNCk7CiAgICB2YXIgZXhwb25lbnQgPSBiaWFzZWRFeHBvbmVudCAtIGV4cG9uZW50QmlhczsKCiAgICBhc3NlcnQoX2RpZ2l0Qml0cyA9PSAzMik7CiAgICAvLyBUaGUgc2lnbmlmaWNhbnQgYml0cyBhcmUgaW4gMCAuLiA1Mi4KICAgIHZhciB1bnNoaWZ0ZWREaWdpdHMgPSBfbmV3RGlnaXRzKDIpOwogICAgdW5zaGlmdGVkRGlnaXRzWzBdID0KICAgICAgICAoYml0c1szXSA8PCAyNCkgKyAoYml0c1syXSA8PCAxNikgKyAoYml0c1sxXSA8PCA4KSArIGJpdHNbMF07CiAgICAvLyBEb24ndCBmb3JnZXQgdG8gYWRkIHRoZSBoaWRkZW4gYml0LgogICAgdW5zaGlmdGVkRGlnaXRzWzFdID0KICAgICAgICAoKDB4MTAgfCAoYml0c1s2XSAmIDB4RikpIDw8IDE2KSArIChiaXRzWzVdIDw8IDgpICsgYml0c1s0XTsKCiAgICB2YXIgdW5zaGlmdGVkQmlnID0gbmV3IF9CaWdJbnRJbXBsLl9ub3JtYWxpemVkKGZhbHNlLCAyLCB1bnNoaWZ0ZWREaWdpdHMpOwogICAgX0JpZ0ludEltcGwgYWJzUmVzdWx0ID0gdW5zaGlmdGVkQmlnOwogICAgaWYgKGV4cG9uZW50IDwgMCkgewogICAgICBhYnNSZXN1bHQgPSB1bnNoaWZ0ZWRCaWcgPj4gLWV4cG9uZW50OwogICAgfSBlbHNlIGlmIChleHBvbmVudCA+IDApIHsKICAgICAgYWJzUmVzdWx0ID0gdW5zaGlmdGVkQmlnIDw8IGV4cG9uZW50OwogICAgfQogICAgaWYgKGlzTmVnYXRpdmUpIHJldHVybiAtYWJzUmVzdWx0OwogICAgcmV0dXJuIGFic1Jlc3VsdDsKICB9CgogIC8qKgogICAqIFJldHVybiB0aGUgbmVnYXRpdmUgdmFsdWUgb2YgdGhpcyBpbnRlZ2VyLgogICAqCiAgICogVGhlIHJlc3VsdCBvZiBuZWdhdGluZyBhbiBpbnRlZ2VyIGFsd2F5cyBoYXMgdGhlIG9wcG9zaXRlIHNpZ24sIGV4Y2VwdAogICAqIGZvciB6ZXJvLCB3aGljaCBpcyBpdHMgb3duIG5lZ2F0aW9uLgogICAqLwogIF9CaWdJbnRJbXBsIG9wZXJhdG9yIC0oKSB7CiAgICBpZiAoX3VzZWQgPT0gMCkgcmV0dXJuIHRoaXM7CiAgICByZXR1cm4gbmV3IF9CaWdJbnRJbXBsLl8oIV9pc05lZ2F0aXZlLCBfdXNlZCwgX2RpZ2l0cyk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGlzIGludGVnZXIuCiAgICoKICAgKiBGb3IgYW55IGludGVnZXIgYHhgLCB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lIGFzIGB4IDwgMCA/IC14IDogeGAuCiAgICovCiAgX0JpZ0ludEltcGwgYWJzKCkgPT4gX2lzTmVnYXRpdmUgPyAtdGhpcyA6IHRoaXM7CgogIC8vLyBSZXR1cm5zIHRoaXMgPDwgbipfZGlnaXRCaXRzLgogIF9CaWdJbnRJbXBsIF9kbFNoaWZ0KGludCBuKSB7CiAgICBmaW5hbCB1c2VkID0gX3VzZWQ7CiAgICBpZiAodXNlZCA9PSAwKSB7CiAgICAgIHJldHVybiB6ZXJvOwogICAgfQogICAgZmluYWwgcmVzdWx0VXNlZCA9IHVzZWQgKyBuOwogICAgZmluYWwgZGlnaXRzID0gX2RpZ2l0czsKICAgIGZpbmFsIHJlc3VsdERpZ2l0cyA9IF9uZXdEaWdpdHMocmVzdWx0VXNlZCk7CiAgICBmb3IgKGludCBpID0gdXNlZCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIHJlc3VsdERpZ2l0c1tpICsgbl0gPSBkaWdpdHNbaV07CiAgICB9CiAgICByZXR1cm4gbmV3IF9CaWdJbnRJbXBsLl8oX2lzTmVnYXRpdmUsIHJlc3VsdFVzZWQsIHJlc3VsdERpZ2l0cyk7CiAgfQoKICAvLy8gU2FtZSBhcyBbX2RsU2hpZnRdIGJ1dCB3b3JrcyBvbiB0aGUgZGVjb21wb3NlZCBiaWcgaW50ZWdlcnMuCiAgLy8vCiAgLy8vIFJldHVybnMgYHJlc3VsdFVzZWRgLgogIC8vLwogIC8vLyBgcmVzdWx0RGlnaXRzWzAuLnJlc3VsdFVzZWQtMV0gPSB4RGlnaXRzWzAuLnhVc2VkLTFdIDw8IG4qX2RpZ2l0Qml0c2AuCiAgc3RhdGljIGludCBfZGxTaGlmdERpZ2l0cygKICAgICAgVWludDMyTGlzdCB4RGlnaXRzLCBpbnQgeFVzZWQsIGludCBuLCBVaW50MzJMaXN0IHJlc3VsdERpZ2l0cykgewogICAgaWYgKHhVc2VkID09IDApIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAobiA9PSAwICYmIGlkZW50aWNhbChyZXN1bHREaWdpdHMsIHhEaWdpdHMpKSB7CiAgICAgIHJldHVybiB4VXNlZDsKICAgIH0KICAgIGZpbmFsIHJlc3VsdFVzZWQgPSB4VXNlZCArIG47CiAgICBhc3NlcnQocmVzdWx0RGlnaXRzLmxlbmd0aCA+PSByZXN1bHRVc2VkICsgKHJlc3VsdFVzZWQgJiAxKSk7CiAgICBmb3IgKGludCBpID0geFVzZWQgLSAxOyBpID49IDA7IGktLSkgewogICAgICByZXN1bHREaWdpdHNbaSArIG5dID0geERpZ2l0c1tpXTsKICAgIH0KICAgIGZvciAoaW50IGkgPSBuIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgcmVzdWx0RGlnaXRzW2ldID0gMDsKICAgIH0KICAgIGlmIChyZXN1bHRVc2VkLmlzT2RkKSB7CiAgICAgIHJlc3VsdERpZ2l0c1tyZXN1bHRVc2VkXSA9IDA7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0VXNlZDsKICB9CgogIC8vLyBSZXR1cm5zIGB0aGlzID4+IG4qX2RpZ2l0Qml0c2AuCiAgX0JpZ0ludEltcGwgX2RyU2hpZnQoaW50IG4pIHsKICAgIGZpbmFsIHVzZWQgPSBfdXNlZDsKICAgIGlmICh1c2VkID09IDApIHsKICAgICAgcmV0dXJuIHplcm87CiAgICB9CiAgICBmaW5hbCByZXN1bHRVc2VkID0gdXNlZCAtIG47CiAgICBpZiAocmVzdWx0VXNlZCA8PSAwKSB7CiAgICAgIHJldHVybiBfaXNOZWdhdGl2ZSA/IF9taW51c09uZSA6IHplcm87CiAgICB9CiAgICBmaW5hbCBkaWdpdHMgPSBfZGlnaXRzOwogICAgZmluYWwgcmVzdWx0RGlnaXRzID0gX25ld0RpZ2l0cyhyZXN1bHRVc2VkKTsKICAgIGZvciAodmFyIGkgPSBuOyBpIDwgdXNlZDsgaSsrKSB7CiAgICAgIHJlc3VsdERpZ2l0c1tpIC0gbl0gPSBkaWdpdHNbaV07CiAgICB9CiAgICBmaW5hbCByZXN1bHQgPSBuZXcgX0JpZ0ludEltcGwuXyhfaXNOZWdhdGl2ZSwgcmVzdWx0VXNlZCwgcmVzdWx0RGlnaXRzKTsKICAgIGlmIChfaXNOZWdhdGl2ZSkgewogICAgICAvLyBSb3VuZCBkb3duIGlmIGFueSBiaXQgd2FzIHNoaWZ0ZWQgb3V0LgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIGlmIChkaWdpdHNbaV0gIT0gMCkgewogICAgICAgICAgcmV0dXJuIHJlc3VsdCAtIG9uZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gU2FtZSBhcyBbX2RyU2hpZnRdIGJ1dCB3b3JrcyBvbiB0aGUgZGVjb21wb3NlZCBiaWcgaW50ZWdlcnMuCiAgLy8vCiAgLy8vIFJldHVybnMgYHJlc3VsdFVzZWRgLgogIC8vLwogIC8vLyBgcmVzdWx0RGlnaXRzWzAuLnJlc3VsdFVzZWQtMV0gPSB4RGlnaXRzWzAuLnhVc2VkLTFdID4+IG4qX2RpZ2l0Qml0c2AuCiAgc3RhdGljIGludCBfZHJTaGlmdERpZ2l0cygKICAgICAgVWludDMyTGlzdCB4RGlnaXRzLCBpbnQgeFVzZWQsIGludCBuLCBVaW50MzJMaXN0IHJlc3VsdERpZ2l0cykgewogICAgZmluYWwgcmVzdWx0VXNlZCA9IHhVc2VkIC0gbjsKICAgIGlmIChyZXN1bHRVc2VkIDw9IDApIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBhc3NlcnQocmVzdWx0RGlnaXRzLmxlbmd0aCA+PSByZXN1bHRVc2VkICsgKHJlc3VsdFVzZWQgJiAxKSk7CiAgICBmb3IgKHZhciBpID0gbjsgaSA8IHhVc2VkOyBpKyspIHsKICAgICAgcmVzdWx0RGlnaXRzW2kgLSBuXSA9IHhEaWdpdHNbaV07CiAgICB9CiAgICBpZiAocmVzdWx0VXNlZC5pc09kZCkgewogICAgICByZXN1bHREaWdpdHNbcmVzdWx0VXNlZF0gPSAwOwogICAgfQogICAgcmV0dXJuIHJlc3VsdFVzZWQ7CiAgfQoKICAvLy8gU2hpZnRzIHRoZSBkaWdpdHMgb2YgW3hEaWdpdHNdIGludG8gdGhlIHJpZ2h0IHBsYWNlIGluIFtyZXN1bHREaWdpdHNdLgogIC8vLwogIC8vLyBgcmVzdWx0RGlnaXRzW2RzLi54VXNlZCtkc10gPSB4RGlnaXRzWzAuLnhVc2VkLTFdIDw8IChuICUgX2RpZ2l0Qml0cylgCiAgLy8vICAgd2hlcmUgYGRzID0gbiB+LyBfZGlnaXRCaXRzYAogIC8vLwogIC8vLyBEb2VzICpub3QqIGNsZWFyIGRpZ2l0cyBiZWxvdyBkcy4KICAvLy8KICAvLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50cmluc2lmaWVkLgogIHN0YXRpYyB2b2lkIF9sc2goCiAgICAgIFVpbnQzMkxpc3QgeERpZ2l0cywgaW50IHhVc2VkLCBpbnQgbiwgVWludDMyTGlzdCByZXN1bHREaWdpdHMpIHsKICAgIGFzc2VydCh4VXNlZCA+IDApOwogICAgZmluYWwgZGlnaXRTaGlmdCA9IG4gfi8gX2RpZ2l0Qml0czsKICAgIGZpbmFsIGJpdFNoaWZ0ID0gbiAlIF9kaWdpdEJpdHM7CiAgICBmaW5hbCBjYXJyeUJpdFNoaWZ0ID0gX2RpZ2l0Qml0cyAtIGJpdFNoaWZ0OwogICAgZmluYWwgYml0TWFzayA9ICgxIDw8IGNhcnJ5Qml0U2hpZnQpIC0gMTsKICAgIHZhciBjYXJyeSA9IDA7CiAgICBmb3IgKGludCBpID0geFVzZWQgLSAxOyBpID49IDA7IGktLSkgewogICAgICBmaW5hbCBkaWdpdCA9IHhEaWdpdHNbaV07CiAgICAgIHJlc3VsdERpZ2l0c1tpICsgZGlnaXRTaGlmdCArIDFdID0gKGRpZ2l0ID4+IGNhcnJ5Qml0U2hpZnQpIHwgY2Fycnk7CiAgICAgIGNhcnJ5ID0gKGRpZ2l0ICYgYml0TWFzaykgPDwgYml0U2hpZnQ7CiAgICB9CiAgICByZXN1bHREaWdpdHNbZGlnaXRTaGlmdF0gPSBjYXJyeTsKICB9CgogIC8qKgogICAqIFNoaWZ0IHRoZSBiaXRzIG9mIHRoaXMgaW50ZWdlciB0byB0aGUgbGVmdCBieSBbc2hpZnRBbW91bnRdLgogICAqCiAgICogU2hpZnRpbmcgdG8gdGhlIGxlZnQgbWFrZXMgdGhlIG51bWJlciBsYXJnZXIsIGVmZmVjdGl2ZWx5IG11bHRpcGx5aW5nCiAgICogdGhlIG51bWJlciBieSBgcG93KDIsIHNoaWZ0SW5kZXgpYC4KICAgKgogICAqIFRoZXJlIGlzIG5vIGxpbWl0IG9uIHRoZSBzaXplIG9mIHRoZSByZXN1bHQuIEl0IG1heSBiZSByZWxldmFudCB0bwogICAqIGxpbWl0IGludGVybWVkaWF0ZSB2YWx1ZXMgYnkgdXNpbmcgdGhlICJhbmQiIG9wZXJhdG9yIHdpdGggYSBzdWl0YWJsZQogICAqIG1hc2suCiAgICoKICAgKiBJdCBpcyBhbiBlcnJvciBpZiBbc2hpZnRBbW91bnRdIGlzIG5lZ2F0aXZlLgogICAqLwogIF9CaWdJbnRJbXBsIG9wZXJhdG9yIDw8KGludCBzaGlmdEFtb3VudCkgewogICAgaWYgKHNoaWZ0QW1vdW50IDwgMCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigic2hpZnQtYW1vdW50IG11c3QgYmUgcG9zaXRpdmUgJHNoaWZ0QW1vdW50Iik7CiAgICB9CiAgICBpZiAoX2lzWmVybykgcmV0dXJuIHRoaXM7CiAgICBmaW5hbCBkaWdpdFNoaWZ0ID0gc2hpZnRBbW91bnQgfi8gX2RpZ2l0Qml0czsKICAgIGZpbmFsIGJpdFNoaWZ0ID0gc2hpZnRBbW91bnQgJSBfZGlnaXRCaXRzOwogICAgaWYgKGJpdFNoaWZ0ID09IDApIHsKICAgICAgcmV0dXJuIF9kbFNoaWZ0KGRpZ2l0U2hpZnQpOwogICAgfQogICAgLy8gTmVlZCBvbmUgZXh0cmEgZGlnaXQgdG8gaG9sZCBiaXRzIHNoaWZ0ZWQgYnkgYml0U2hpZnQuCiAgICB2YXIgcmVzdWx0VXNlZCA9IF91c2VkICsgZGlnaXRTaGlmdCArIDE7CiAgICAvLyBUaGUgNjQtYml0IGludHJpbnNpYyByZXF1aXJlcyBvbmUgZXh0cmEgcGFpciB0byB3b3JrIHdpdGguCiAgICB2YXIgcmVzdWx0RGlnaXRzID0gX25ld0RpZ2l0cyhyZXN1bHRVc2VkICsgMSk7CiAgICBfbHNoKF9kaWdpdHMsIF91c2VkLCBzaGlmdEFtb3VudCwgcmVzdWx0RGlnaXRzKTsKICAgIHJldHVybiBuZXcgX0JpZ0ludEltcGwuXyhfaXNOZWdhdGl2ZSwgcmVzdWx0VXNlZCwgcmVzdWx0RGlnaXRzKTsKICB9CgogIC8vLyByZXN1bHREaWdpdHNbMC4ucmVzdWx0VXNlZC0xXSA9IHhEaWdpdHNbMC4ueFVzZWQtMV0gPDwgbi4KICAvLy8gUmV0dXJucyByZXN1bHRVc2VkLgogIHN0YXRpYyBpbnQgX2xTaGlmdERpZ2l0cygKICAgICAgVWludDMyTGlzdCB4RGlnaXRzLCBpbnQgeFVzZWQsIGludCBuLCBVaW50MzJMaXN0IHJlc3VsdERpZ2l0cykgewogICAgZmluYWwgZGlnaXRzU2hpZnQgPSBuIH4vIF9kaWdpdEJpdHM7CiAgICBmaW5hbCBiaXRTaGlmdCA9IG4gJSBfZGlnaXRCaXRzOwogICAgaWYgKGJpdFNoaWZ0ID09IDApIHsKICAgICAgcmV0dXJuIF9kbFNoaWZ0RGlnaXRzKHhEaWdpdHMsIHhVc2VkLCBkaWdpdHNTaGlmdCwgcmVzdWx0RGlnaXRzKTsKICAgIH0KICAgIC8vIE5lZWQgb25lIGV4dHJhIGRpZ2l0IHRvIGhvbGQgYml0cyBzaGlmdGVkIGJ5IGJpdFNoaWZ0LgogICAgdmFyIHJlc3VsdFVzZWQgPSB4VXNlZCArIGRpZ2l0c1NoaWZ0ICsgMTsKICAgIC8vIFRoZSA2NC1iaXQgaW50cmluc2ljIHJlcXVpcmVzIG9uZSBleHRyYSBwYWlyIHRvIHdvcmsgd2l0aC4KICAgIGFzc2VydChyZXN1bHREaWdpdHMubGVuZ3RoID49IHJlc3VsdFVzZWQgKyAyIC0gKHJlc3VsdFVzZWQgJiAxKSk7CiAgICBfbHNoKHhEaWdpdHMsIHhVc2VkLCBuLCByZXN1bHREaWdpdHMpOwogICAgdmFyIGkgPSBkaWdpdHNTaGlmdDsKICAgIHdoaWxlICgtLWkgPj0gMCkgewogICAgICByZXN1bHREaWdpdHNbaV0gPSAwOwogICAgfQogICAgaWYgKHJlc3VsdERpZ2l0c1tyZXN1bHRVc2VkIC0gMV0gPT0gMCkgewogICAgICByZXN1bHRVc2VkLS07IC8vIENsYW1wIHJlc3VsdC4KICAgIH0gZWxzZSBpZiAocmVzdWx0VXNlZC5pc09kZCkgewogICAgICByZXN1bHREaWdpdHNbcmVzdWx0VXNlZF0gPSAwOwogICAgfQogICAgcmV0dXJuIHJlc3VsdFVzZWQ7CiAgfQoKICAvLy8gcmVzdWx0RGlnaXRzWzAuLnJlc3VsdFVzZWQtMV0gPSB4RGlnaXRzWzAuLnhVc2VkLTFdID4+IG4uCiAgLy8vCiAgLy8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludHJpbnNpZmllZC4KICBzdGF0aWMgdm9pZCBfcnNoKAogICAgICBVaW50MzJMaXN0IHhEaWdpdHMsIGludCB4VXNlZCwgaW50IG4sIFVpbnQzMkxpc3QgcmVzdWx0RGlnaXRzKSB7CiAgICBhc3NlcnQoeFVzZWQgPiAwKTsKICAgIGZpbmFsIGRpZ2l0c1NoaWZ0ID0gbiB+LyBfZGlnaXRCaXRzOwogICAgZmluYWwgYml0U2hpZnQgPSBuICUgX2RpZ2l0Qml0czsKICAgIGZpbmFsIGNhcnJ5Qml0U2hpZnQgPSBfZGlnaXRCaXRzIC0gYml0U2hpZnQ7CiAgICBmaW5hbCBiaXRNYXNrID0gKDEgPDwgYml0U2hpZnQpIC0gMTsKICAgIHZhciBjYXJyeSA9IHhEaWdpdHNbZGlnaXRzU2hpZnRdID4+IGJpdFNoaWZ0OwogICAgZmluYWwgbGFzdCA9IHhVc2VkIC0gZGlnaXRzU2hpZnQgLSAxOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXN0OyBpKyspIHsKICAgICAgZmluYWwgZGlnaXQgPSB4RGlnaXRzW2kgKyBkaWdpdHNTaGlmdCArIDFdOwogICAgICByZXN1bHREaWdpdHNbaV0gPSAoKGRpZ2l0ICYgYml0TWFzaykgPDwgY2FycnlCaXRTaGlmdCkgfCBjYXJyeTsKICAgICAgY2FycnkgPSBkaWdpdCA+PiBiaXRTaGlmdDsKICAgIH0KICAgIHJlc3VsdERpZ2l0c1tsYXN0XSA9IGNhcnJ5OwogIH0KCiAgLyoqCiAgICogU2hpZnQgdGhlIGJpdHMgb2YgdGhpcyBpbnRlZ2VyIHRvIHRoZSByaWdodCBieSBbc2hpZnRBbW91bnRdLgogICAqCiAgICogU2hpZnRpbmcgdG8gdGhlIHJpZ2h0IG1ha2VzIHRoZSBudW1iZXIgc21hbGxlciBhbmQgZHJvcHMgdGhlIGxlYXN0CiAgICogc2lnbmlmaWNhbnQgYml0cywgZWZmZWN0aXZlbHkgZG9pbmcgYW4gaW50ZWdlciBkaXZpc2lvbiBieQogICAqYHBvdygyLCBzaGlmdEluZGV4KWAuCiAgICoKICAgKiBJdCBpcyBhbiBlcnJvciBpZiBbc2hpZnRBbW91bnRdIGlzIG5lZ2F0aXZlLgogICAqLwogIF9CaWdJbnRJbXBsIG9wZXJhdG9yID4+KGludCBzaGlmdEFtb3VudCkgewogICAgaWYgKHNoaWZ0QW1vdW50IDwgMCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigic2hpZnQtYW1vdW50IG11c3QgYmUgcG9zaXRpdmUgJHNoaWZ0QW1vdW50Iik7CiAgICB9CiAgICBpZiAoX2lzWmVybykgcmV0dXJuIHRoaXM7CiAgICBmaW5hbCBkaWdpdFNoaWZ0ID0gc2hpZnRBbW91bnQgfi8gX2RpZ2l0Qml0czsKICAgIGZpbmFsIGJpdFNoaWZ0ID0gc2hpZnRBbW91bnQgJSBfZGlnaXRCaXRzOwogICAgaWYgKGJpdFNoaWZ0ID09IDApIHsKICAgICAgcmV0dXJuIF9kclNoaWZ0KGRpZ2l0U2hpZnQpOwogICAgfQogICAgZmluYWwgdXNlZCA9IF91c2VkOwogICAgZmluYWwgcmVzdWx0VXNlZCA9IHVzZWQgLSBkaWdpdFNoaWZ0OwogICAgaWYgKHJlc3VsdFVzZWQgPD0gMCkgewogICAgICByZXR1cm4gX2lzTmVnYXRpdmUgPyBfbWludXNPbmUgOiB6ZXJvOwogICAgfQogICAgZmluYWwgZGlnaXRzID0gX2RpZ2l0czsKICAgIGZpbmFsIHJlc3VsdERpZ2l0cyA9IF9uZXdEaWdpdHMocmVzdWx0VXNlZCk7CiAgICBfcnNoKGRpZ2l0cywgdXNlZCwgc2hpZnRBbW91bnQsIHJlc3VsdERpZ2l0cyk7CiAgICBmaW5hbCByZXN1bHQgPSBuZXcgX0JpZ0ludEltcGwuXyhfaXNOZWdhdGl2ZSwgcmVzdWx0VXNlZCwgcmVzdWx0RGlnaXRzKTsKICAgIGlmIChfaXNOZWdhdGl2ZSkgewogICAgICAvLyBSb3VuZCBkb3duIGlmIGFueSBiaXQgd2FzIHNoaWZ0ZWQgb3V0LgogICAgICBpZiAoKGRpZ2l0c1tkaWdpdFNoaWZ0XSAmICgoMSA8PCBiaXRTaGlmdCkgLSAxKSkgIT0gMCkgewogICAgICAgIHJldHVybiByZXN1bHQgLSBvbmU7CiAgICAgIH0KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaWdpdFNoaWZ0OyBpKyspIHsKICAgICAgICBpZiAoZGlnaXRzW2ldICE9IDApIHsKICAgICAgICAgIHJldHVybiByZXN1bHQgLSBvbmU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIHJlc3VsdERpZ2l0c1swLi5yZXN1bHRVc2VkLTFdID0geERpZ2l0c1swLi54VXNlZC0xXSA+PiBuLgogIC8vLyBSZXR1cm5zIHJlc3VsdFVzZWQuCiAgc3RhdGljIGludCBfclNoaWZ0RGlnaXRzKAogICAgICBVaW50MzJMaXN0IHhEaWdpdHMsIGludCB4VXNlZCwgaW50IG4sIFVpbnQzMkxpc3QgcmVzdWx0RGlnaXRzKSB7CiAgICBmaW5hbCBkaWdpdFNoaWZ0ID0gbiB+LyBfZGlnaXRCaXRzOwogICAgZmluYWwgYml0U2hpZnQgPSBuICUgX2RpZ2l0Qml0czsKICAgIGlmIChiaXRTaGlmdCA9PSAwKSB7CiAgICAgIHJldHVybiBfZHJTaGlmdERpZ2l0cyh4RGlnaXRzLCB4VXNlZCwgZGlnaXRTaGlmdCwgcmVzdWx0RGlnaXRzKTsKICAgIH0KICAgIHZhciByZXN1bHRVc2VkID0geFVzZWQgLSBkaWdpdFNoaWZ0OwogICAgaWYgKHJlc3VsdFVzZWQgPD0gMCkgewogICAgICByZXR1cm4gMDsKICAgIH0KICAgIGFzc2VydChyZXN1bHREaWdpdHMubGVuZ3RoID49IHJlc3VsdFVzZWQgKyAocmVzdWx0VXNlZCAmIDEpKTsKICAgIF9yc2goeERpZ2l0cywgeFVzZWQsIG4sIHJlc3VsdERpZ2l0cyk7CiAgICBpZiAocmVzdWx0RGlnaXRzW3Jlc3VsdFVzZWQgLSAxXSA9PSAwKSB7CiAgICAgIHJlc3VsdFVzZWQtLTsgLy8gQ2xhbXAgcmVzdWx0LgogICAgfSBlbHNlIGlmIChyZXN1bHRVc2VkLmlzT2RkKSB7CiAgICAgIHJlc3VsdERpZ2l0c1tyZXN1bHRVc2VkXSA9IDA7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0VXNlZDsKICB9CgogIC8vLyBDb21wYXJlcyB0aGlzIHRvIFtvdGhlcl0gdGFraW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBib3RoIG9wZXJhbmRzLgogIC8vLwogIC8vLyBSZXR1cm5zIDAgaWYgYWJzKHRoaXMpID09IGFicyhvdGhlcik7IGEgcG9zaXRpdmUgbnVtYmVyIGlmCiAgLy8vIGFicyh0aGlzKSA+IGFicyhvdGhlcik7IGFuZCBhIG5lZ2F0aXZlIG51bWJlciBpZiBhYnModGhpcykgPCBhYnMob3RoZXIpLgogIGludCBfYWJzQ29tcGFyZShCaWdJbnQgYmlnSW50KSB7CiAgICBfQmlnSW50SW1wbCBvdGhlciA9IGJpZ0ludDsKICAgIHJldHVybiBfY29tcGFyZURpZ2l0cyhfZGlnaXRzLCBfdXNlZCwgb3RoZXIuX2RpZ2l0cywgb3RoZXIuX3VzZWQpOwogIH0KCiAgLyoqCiAgICogQ29tcGFyZXMgdGhpcyB0byBgb3RoZXJgLgogICAqCiAgICogUmV0dXJucyBhIG5lZ2F0aXZlIG51bWJlciBpZiBgdGhpc2AgaXMgbGVzcyB0aGFuIGBvdGhlcmAsIHplcm8gaWYgdGhleSBhcmUKICAgKiBlcXVhbCwgYW5kIGEgcG9zaXRpdmUgbnVtYmVyIGlmIGB0aGlzYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYC4KICAgKi8KICBpbnQgY29tcGFyZVRvKEJpZ0ludCBiaWdJbnQpIHsKICAgIF9CaWdJbnRJbXBsIG90aGVyID0gYmlnSW50OwogICAgaWYgKF9pc05lZ2F0aXZlID09IG90aGVyLl9pc05lZ2F0aXZlKSB7CiAgICAgIHZhciByZXN1bHQgPSBfYWJzQ29tcGFyZShvdGhlcik7CiAgICAgIC8vIFVzZSAwIC0gcmVzdWx0IHRvIGF2b2lkIG5lZ2F0aXZlIHplcm8gaW4gSmF2YVNjcmlwdC4KICAgICAgcmV0dXJuIF9pc05lZ2F0aXZlID8gMCAtIHJlc3VsdCA6IHJlc3VsdDsKICAgIH0KICAgIHJldHVybiBfaXNOZWdhdGl2ZSA/IC0xIDogMTsKICB9CgogIC8vLyBDb21wYXJlcyBgZGlnaXRzWzAuLnVzZWQtMV1gIHdpdGggYG90aGVyRGlnaXRzWzAuLm90aGVyVXNlZC0xXWAuCiAgLy8vCiAgLy8vIFJldHVybnMgMCBpZiBlcXVhbDsgYSBwb3NpdGl2ZSBudW1iZXIgaWYgbGFyZ2VyOwogIC8vLyBhbmQgYSBuZWdhdGl2ZSBudW1iZXIgaWYgc21hbGxlci4KICBzdGF0aWMgaW50IF9jb21wYXJlRGlnaXRzKAogICAgICBVaW50MzJMaXN0IGRpZ2l0cywgaW50IHVzZWQsIFVpbnQzMkxpc3Qgb3RoZXJEaWdpdHMsIGludCBvdGhlclVzZWQpIHsKICAgIHZhciByZXN1bHQgPSB1c2VkIC0gb3RoZXJVc2VkOwogICAgaWYgKHJlc3VsdCA9PSAwKSB7CiAgICAgIGZvciAoaW50IGkgPSB1c2VkIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICByZXN1bHQgPSBkaWdpdHNbaV0gLSBvdGhlckRpZ2l0c1tpXTsKICAgICAgICBpZiAocmVzdWx0ICE9IDApIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gcmVzdWx0RGlnaXRzWzAuLnVzZWRdID0gZGlnaXRzWzAuLnVzZWQtMV0gKyBvdGhlckRpZ2l0c1swLi5vdGhlclVzZWQtMV0uCiAgLy8vIHVzZWQgPj0gb3RoZXJVc2VkID4gMC4KICAvLy8KICAvLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50cmluc2lmaWVkLgogIHN0YXRpYyB2b2lkIF9hYnNBZGQoVWludDMyTGlzdCBkaWdpdHMsIGludCB1c2VkLCBVaW50MzJMaXN0IG90aGVyRGlnaXRzLAogICAgICBpbnQgb3RoZXJVc2VkLCBVaW50MzJMaXN0IHJlc3VsdERpZ2l0cykgewogICAgYXNzZXJ0KHVzZWQgPj0gb3RoZXJVc2VkICYmIG90aGVyVXNlZCA+IDApOwogICAgdmFyIGNhcnJ5ID0gMDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3RoZXJVc2VkOyBpKyspIHsKICAgICAgY2FycnkgKz0gZGlnaXRzW2ldICsgb3RoZXJEaWdpdHNbaV07CiAgICAgIHJlc3VsdERpZ2l0c1tpXSA9IGNhcnJ5ICYgX2RpZ2l0TWFzazsKICAgICAgY2FycnkgPj49IF9kaWdpdEJpdHM7CiAgICB9CiAgICBmb3IgKHZhciBpID0gb3RoZXJVc2VkOyBpIDwgdXNlZDsgaSsrKSB7CiAgICAgIGNhcnJ5ICs9IGRpZ2l0c1tpXTsKICAgICAgcmVzdWx0RGlnaXRzW2ldID0gY2FycnkgJiBfZGlnaXRNYXNrOwogICAgICBjYXJyeSA+Pj0gX2RpZ2l0Qml0czsKICAgIH0KICAgIHJlc3VsdERpZ2l0c1t1c2VkXSA9IGNhcnJ5OwogIH0KCiAgLy8vIHJlc3VsdERpZ2l0c1swLi51c2VkLTFdID0gZGlnaXRzWzAuLnVzZWQtMV0gLSBvdGhlckRpZ2l0c1swLi5vdGhlclVzZWQtMV0uCiAgLy8vIHVzZWQgPj0gb3RoZXJVc2VkID4gMC4KICAvLy8KICAvLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50cmluc2lmaWVkLgogIHN0YXRpYyB2b2lkIF9hYnNTdWIoVWludDMyTGlzdCBkaWdpdHMsIGludCB1c2VkLCBVaW50MzJMaXN0IG90aGVyRGlnaXRzLAogICAgICBpbnQgb3RoZXJVc2VkLCBVaW50MzJMaXN0IHJlc3VsdERpZ2l0cykgewogICAgYXNzZXJ0KHVzZWQgPj0gb3RoZXJVc2VkICYmIG90aGVyVXNlZCA+IDApOwogICAgdmFyIGNhcnJ5ID0gMDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3RoZXJVc2VkOyBpKyspIHsKICAgICAgY2FycnkgKz0gZGlnaXRzW2ldIC0gb3RoZXJEaWdpdHNbaV07CiAgICAgIHJlc3VsdERpZ2l0c1tpXSA9IGNhcnJ5ICYgX2RpZ2l0TWFzazsKICAgICAgY2FycnkgPj49IF9kaWdpdEJpdHM7CiAgICB9CiAgICBmb3IgKHZhciBpID0gb3RoZXJVc2VkOyBpIDwgdXNlZDsgaSsrKSB7CiAgICAgIGNhcnJ5ICs9IGRpZ2l0c1tpXTsKICAgICAgcmVzdWx0RGlnaXRzW2ldID0gY2FycnkgJiBfZGlnaXRNYXNrOwogICAgICBjYXJyeSA+Pj0gX2RpZ2l0Qml0czsKICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIGBhYnModGhpcykgKyBhYnMob3RoZXIpYCB3aXRoIHNpZ24gc2V0IGFjY29yZGluZyB0byBbaXNOZWdhdGl2ZV0uCiAgX0JpZ0ludEltcGwgX2Fic0FkZFNldFNpZ24oX0JpZ0ludEltcGwgb3RoZXIsIGJvb2wgaXNOZWdhdGl2ZSkgewogICAgdmFyIHVzZWQgPSBfdXNlZDsKICAgIHZhciBvdGhlclVzZWQgPSBvdGhlci5fdXNlZDsKICAgIGlmICh1c2VkIDwgb3RoZXJVc2VkKSB7CiAgICAgIHJldHVybiBvdGhlci5fYWJzQWRkU2V0U2lnbih0aGlzLCBpc05lZ2F0aXZlKTsKICAgIH0KICAgIGlmICh1c2VkID09IDApIHsKICAgICAgYXNzZXJ0KCFpc05lZ2F0aXZlKTsKICAgICAgcmV0dXJuIHplcm87CiAgICB9CiAgICBpZiAob3RoZXJVc2VkID09IDApIHsKICAgICAgcmV0dXJuIF9pc05lZ2F0aXZlID09IGlzTmVnYXRpdmUgPyB0aGlzIDogLXRoaXM7CiAgICB9CiAgICB2YXIgcmVzdWx0VXNlZCA9IHVzZWQgKyAxOwogICAgdmFyIHJlc3VsdERpZ2l0cyA9IF9uZXdEaWdpdHMocmVzdWx0VXNlZCk7CiAgICBfYWJzQWRkKF9kaWdpdHMsIHVzZWQsIG90aGVyLl9kaWdpdHMsIG90aGVyVXNlZCwgcmVzdWx0RGlnaXRzKTsKICAgIHJldHVybiBuZXcgX0JpZ0ludEltcGwuXyhpc05lZ2F0aXZlLCByZXN1bHRVc2VkLCByZXN1bHREaWdpdHMpOwogIH0KCiAgLy8vIFJldHVybnMgYGFicyh0aGlzKSAtIGFicyhvdGhlcilgIHdpdGggc2lnbiBzZXQgYWNjb3JkaW5nIHRvIFtpc05lZ2F0aXZlXS4KICAvLy8KICAvLy8gUmVxdWlyZW1lbnQ6IGBhYnModGhpcykgPj0gYWJzKG90aGVyKWAuCiAgX0JpZ0ludEltcGwgX2Fic1N1YlNldFNpZ24oX0JpZ0ludEltcGwgb3RoZXIsIGJvb2wgaXNOZWdhdGl2ZSkgewogICAgYXNzZXJ0KF9hYnNDb21wYXJlKG90aGVyKSA+PSAwKTsKICAgIHZhciB1c2VkID0gX3VzZWQ7CiAgICBpZiAodXNlZCA9PSAwKSB7CiAgICAgIGFzc2VydCghaXNOZWdhdGl2ZSk7CiAgICAgIHJldHVybiB6ZXJvOwogICAgfQogICAgdmFyIG90aGVyVXNlZCA9IG90aGVyLl91c2VkOwogICAgaWYgKG90aGVyVXNlZCA9PSAwKSB7CiAgICAgIHJldHVybiBfaXNOZWdhdGl2ZSA9PSBpc05lZ2F0aXZlID8gdGhpcyA6IC10aGlzOwogICAgfQogICAgdmFyIHJlc3VsdERpZ2l0cyA9IF9uZXdEaWdpdHModXNlZCk7CiAgICBfYWJzU3ViKF9kaWdpdHMsIHVzZWQsIG90aGVyLl9kaWdpdHMsIG90aGVyVXNlZCwgcmVzdWx0RGlnaXRzKTsKICAgIHJldHVybiBuZXcgX0JpZ0ludEltcGwuXyhpc05lZ2F0aXZlLCB1c2VkLCByZXN1bHREaWdpdHMpOwogIH0KCiAgLy8vIFJldHVybnMgYGFicyh0aGlzKSAmIGFicyhvdGhlcilgIHdpdGggc2lnbiBzZXQgYWNjb3JkaW5nIHRvIFtpc05lZ2F0aXZlXS4KICBfQmlnSW50SW1wbCBfYWJzQW5kU2V0U2lnbihfQmlnSW50SW1wbCBvdGhlciwgYm9vbCBpc05lZ2F0aXZlKSB7CiAgICB2YXIgcmVzdWx0VXNlZCA9IF9taW4oX3VzZWQsIG90aGVyLl91c2VkKTsKICAgIHZhciBkaWdpdHMgPSBfZGlnaXRzOwogICAgdmFyIG90aGVyRGlnaXRzID0gb3RoZXIuX2RpZ2l0czsKICAgIHZhciByZXN1bHREaWdpdHMgPSBfbmV3RGlnaXRzKHJlc3VsdFVzZWQpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHRVc2VkOyBpKyspIHsKICAgICAgcmVzdWx0RGlnaXRzW2ldID0gZGlnaXRzW2ldICYgb3RoZXJEaWdpdHNbaV07CiAgICB9CiAgICByZXR1cm4gbmV3IF9CaWdJbnRJbXBsLl8oaXNOZWdhdGl2ZSwgcmVzdWx0VXNlZCwgcmVzdWx0RGlnaXRzKTsKICB9CgogIC8vLyBSZXR1cm5zIGBhYnModGhpcykgJn4gYWJzKG90aGVyKWAgd2l0aCBzaWduIHNldCBhY2NvcmRpbmcgdG8gW2lzTmVnYXRpdmVdLgogIF9CaWdJbnRJbXBsIF9hYnNBbmROb3RTZXRTaWduKF9CaWdJbnRJbXBsIG90aGVyLCBib29sIGlzTmVnYXRpdmUpIHsKICAgIHZhciByZXN1bHRVc2VkID0gX3VzZWQ7CiAgICB2YXIgZGlnaXRzID0gX2RpZ2l0czsKICAgIHZhciBvdGhlckRpZ2l0cyA9IG90aGVyLl9kaWdpdHM7CiAgICB2YXIgcmVzdWx0RGlnaXRzID0gX25ld0RpZ2l0cyhyZXN1bHRVc2VkKTsKICAgIHZhciBtID0gX21pbihyZXN1bHRVc2VkLCBvdGhlci5fdXNlZCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG07IGkrKykgewogICAgICByZXN1bHREaWdpdHNbaV0gPSBkaWdpdHNbaV0gJiB+b3RoZXJEaWdpdHNbaV07CiAgICB9CiAgICBmb3IgKHZhciBpID0gbTsgaSA8IHJlc3VsdFVzZWQ7IGkrKykgewogICAgICByZXN1bHREaWdpdHNbaV0gPSBkaWdpdHNbaV07CiAgICB9CiAgICByZXR1cm4gbmV3IF9CaWdJbnRJbXBsLl8oaXNOZWdhdGl2ZSwgcmVzdWx0VXNlZCwgcmVzdWx0RGlnaXRzKTsKICB9CgogIC8vLyBSZXR1cm5zIGBhYnModGhpcykgfCBhYnMob3RoZXIpYCB3aXRoIHNpZ24gc2V0IGFjY29yZGluZyB0byBbaXNOZWdhdGl2ZV0uCiAgX0JpZ0ludEltcGwgX2Fic09yU2V0U2lnbihfQmlnSW50SW1wbCBvdGhlciwgYm9vbCBpc05lZ2F0aXZlKSB7CiAgICB2YXIgdXNlZCA9IF91c2VkOwogICAgdmFyIG90aGVyVXNlZCA9IG90aGVyLl91c2VkOwogICAgdmFyIHJlc3VsdFVzZWQgPSBfbWF4KHVzZWQsIG90aGVyVXNlZCk7CiAgICB2YXIgZGlnaXRzID0gX2RpZ2l0czsKICAgIHZhciBvdGhlckRpZ2l0cyA9IG90aGVyLl9kaWdpdHM7CiAgICB2YXIgcmVzdWx0RGlnaXRzID0gX25ld0RpZ2l0cyhyZXN1bHRVc2VkKTsKICAgIHZhciBsLCBtOwogICAgaWYgKHVzZWQgPCBvdGhlclVzZWQpIHsKICAgICAgbCA9IG90aGVyOwogICAgICBtID0gdXNlZDsKICAgIH0gZWxzZSB7CiAgICAgIGwgPSB0aGlzOwogICAgICBtID0gb3RoZXJVc2VkOwogICAgfQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtOyBpKyspIHsKICAgICAgcmVzdWx0RGlnaXRzW2ldID0gZGlnaXRzW2ldIHwgb3RoZXJEaWdpdHNbaV07CiAgICB9CiAgICB2YXIgbERpZ2l0cyA9IGwuX2RpZ2l0czsKICAgIGZvciAodmFyIGkgPSBtOyBpIDwgcmVzdWx0VXNlZDsgaSsrKSB7CiAgICAgIHJlc3VsdERpZ2l0c1tpXSA9IGxEaWdpdHNbaV07CiAgICB9CiAgICByZXR1cm4gbmV3IF9CaWdJbnRJbXBsLl8oaXNOZWdhdGl2ZSwgcmVzdWx0VXNlZCwgcmVzdWx0RGlnaXRzKTsKICB9CgogIC8vLyBSZXR1cm5zIGBhYnModGhpcykgXiBhYnMob3RoZXIpYCB3aXRoIHNpZ24gc2V0IGFjY29yZGluZyB0byBbaXNOZWdhdGl2ZV0uCiAgX0JpZ0ludEltcGwgX2Fic1hvclNldFNpZ24oX0JpZ0ludEltcGwgb3RoZXIsIGJvb2wgaXNOZWdhdGl2ZSkgewogICAgdmFyIHVzZWQgPSBfdXNlZDsKICAgIHZhciBvdGhlclVzZWQgPSBvdGhlci5fdXNlZDsKICAgIHZhciByZXN1bHRVc2VkID0gX21heCh1c2VkLCBvdGhlclVzZWQpOwogICAgdmFyIGRpZ2l0cyA9IF9kaWdpdHM7CiAgICB2YXIgb3RoZXJEaWdpdHMgPSBvdGhlci5fZGlnaXRzOwogICAgdmFyIHJlc3VsdERpZ2l0cyA9IF9uZXdEaWdpdHMocmVzdWx0VXNlZCk7CiAgICB2YXIgbCwgbTsKICAgIGlmICh1c2VkIDwgb3RoZXJVc2VkKSB7CiAgICAgIGwgPSBvdGhlcjsKICAgICAgbSA9IHVzZWQ7CiAgICB9IGVsc2UgewogICAgICBsID0gdGhpczsKICAgICAgbSA9IG90aGVyVXNlZDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbTsgaSsrKSB7CiAgICAgIHJlc3VsdERpZ2l0c1tpXSA9IGRpZ2l0c1tpXSBeIG90aGVyRGlnaXRzW2ldOwogICAgfQogICAgdmFyIGxEaWdpdHMgPSBsLl9kaWdpdHM7CiAgICBmb3IgKHZhciBpID0gbTsgaSA8IHJlc3VsdFVzZWQ7IGkrKykgewogICAgICByZXN1bHREaWdpdHNbaV0gPSBsRGlnaXRzW2ldOwogICAgfQogICAgcmV0dXJuIG5ldyBfQmlnSW50SW1wbC5fKGlzTmVnYXRpdmUsIHJlc3VsdFVzZWQsIHJlc3VsdERpZ2l0cyk7CiAgfQoKICAvKioKICAgKiBCaXQtd2lzZSBhbmQgb3BlcmF0b3IuCiAgICoKICAgKiBUcmVhdGluZyBib3RoIGB0aGlzYCBhbmQgW290aGVyXSBhcyBzdWZmaWNpZW50bHkgbGFyZ2UgdHdvJ3MgY29tcG9uZW50CiAgICogaW50ZWdlcnMsIHRoZSByZXN1bHQgaXMgYSBudW1iZXIgd2l0aCBvbmx5IHRoZSBiaXRzIHNldCB0aGF0IGFyZSBzZXQgaW4KICAgKiBib3RoIGB0aGlzYCBhbmQgW290aGVyXQogICAqCiAgICogT2YgYm90aCBvcGVyYW5kcyBhcmUgbmVnYXRpdmUsIHRoZSByZXN1bHQgaXMgbmVnYXRpdmUsIG90aGVyd2lzZQogICAqIHRoZSByZXN1bHQgaXMgbm9uLW5lZ2F0aXZlLgogICAqLwogIF9CaWdJbnRJbXBsIG9wZXJhdG9yICYoQmlnSW50IGJpZ0ludCkgewogICAgX0JpZ0ludEltcGwgb3RoZXIgPSBiaWdJbnQ7CiAgICBpZiAoX2lzWmVybyB8fCBvdGhlci5faXNaZXJvKSByZXR1cm4gemVybzsKICAgIGlmIChfaXNOZWdhdGl2ZSA9PSBvdGhlci5faXNOZWdhdGl2ZSkgewogICAgICBpZiAoX2lzTmVnYXRpdmUpIHsKICAgICAgICAvLyAoLXRoaXMpICYgKC1vdGhlcikgPT0gfih0aGlzLTEpICYgfihvdGhlci0xKQogICAgICAgIC8vICAgICAgICAgICAgICAgICAgICA9PSB+KCh0aGlzLTEpIHwgKG90aGVyLTEpKQogICAgICAgIC8vICAgICAgICAgICAgICAgICAgICA9PSAtKCgodGhpcy0xKSB8IChvdGhlci0xKSkgKyAxKQogICAgICAgIF9CaWdJbnRJbXBsIHRoaXMxID0gX2Fic1N1YlNldFNpZ24ob25lLCB0cnVlKTsKICAgICAgICBfQmlnSW50SW1wbCBvdGhlcjEgPSBvdGhlci5fYWJzU3ViU2V0U2lnbihvbmUsIHRydWUpOwogICAgICAgIC8vIFJlc3VsdCBjYW5ub3QgYmUgemVybyBpZiB0aGlzIGFuZCBvdGhlciBhcmUgbmVnYXRpdmUuCiAgICAgICAgcmV0dXJuIHRoaXMxLl9hYnNPclNldFNpZ24ob3RoZXIxLCB0cnVlKS5fYWJzQWRkU2V0U2lnbihvbmUsIHRydWUpOwogICAgICB9CiAgICAgIHJldHVybiBfYWJzQW5kU2V0U2lnbihvdGhlciwgZmFsc2UpOwogICAgfQogICAgLy8gX2lzTmVnYXRpdmUgIT0gb3RoZXIuX2lzTmVnYXRpdmUKICAgIHZhciBwLCBuOwogICAgaWYgKF9pc05lZ2F0aXZlKSB7CiAgICAgIHAgPSBvdGhlcjsKICAgICAgbiA9IHRoaXM7CiAgICB9IGVsc2UgewogICAgICAvLyAmIGlzIHN5bW1ldHJpYy4KICAgICAgcCA9IHRoaXM7CiAgICAgIG4gPSBvdGhlcjsKICAgIH0KICAgIC8vIHAgJiAoLW4pID09IHAgJiB+KG4tMSkgPT0gcCAmfiAobi0xKQogICAgdmFyIG4xID0gbi5fYWJzU3ViU2V0U2lnbihvbmUsIGZhbHNlKTsKICAgIHJldHVybiBwLl9hYnNBbmROb3RTZXRTaWduKG4xLCBmYWxzZSk7CiAgfQoKICAvKioKICAgKiBCaXQtd2lzZSBvciBvcGVyYXRvci4KICAgKgogICAqIFRyZWF0aW5nIGJvdGggYHRoaXNgIGFuZCBbb3RoZXJdIGFzIHN1ZmZpY2llbnRseSBsYXJnZSB0d28ncyBjb21wb25lbnQKICAgKiBpbnRlZ2VycywgdGhlIHJlc3VsdCBpcyBhIG51bWJlciB3aXRoIHRoZSBiaXRzIHNldCB0aGF0IGFyZSBzZXQgaW4gZWl0aGVyCiAgICogb2YgYHRoaXNgIGFuZCBbb3RoZXJdCiAgICoKICAgKiBJZiBib3RoIG9wZXJhbmRzIGFyZSBub24tbmVnYXRpdmUsIHRoZSByZXN1bHQgaXMgbm9uLW5lZ2F0aXZlLAogICAqIG90aGVyd2lzZSB0aGUgcmVzdWx0IHVzIG5lZ2F0aXZlLgogICAqLwogIF9CaWdJbnRJbXBsIG9wZXJhdG9yIHwoQmlnSW50IGJpZ0ludCkgewogICAgX0JpZ0ludEltcGwgb3RoZXIgPSBiaWdJbnQ7CiAgICBpZiAoX2lzWmVybykgcmV0dXJuIG90aGVyOwogICAgaWYgKG90aGVyLl9pc1plcm8pIHJldHVybiB0aGlzOwogICAgaWYgKF9pc05lZ2F0aXZlID09IG90aGVyLl9pc05lZ2F0aXZlKSB7CiAgICAgIGlmIChfaXNOZWdhdGl2ZSkgewogICAgICAgIC8vICgtdGhpcykgfCAoLW90aGVyKSA9PSB+KHRoaXMtMSkgfCB+KG90aGVyLTEpCiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgID09IH4oKHRoaXMtMSkgJiAob3RoZXItMSkpCiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgID09IC0oKCh0aGlzLTEpICYgKG90aGVyLTEpKSArIDEpCiAgICAgICAgdmFyIHRoaXMxID0gX2Fic1N1YlNldFNpZ24ob25lLCB0cnVlKTsKICAgICAgICB2YXIgb3RoZXIxID0gb3RoZXIuX2Fic1N1YlNldFNpZ24ob25lLCB0cnVlKTsKICAgICAgICAvLyBSZXN1bHQgY2Fubm90IGJlIHplcm8gaWYgdGhpcyBhbmQgYSBhcmUgbmVnYXRpdmUuCiAgICAgICAgcmV0dXJuIHRoaXMxLl9hYnNBbmRTZXRTaWduKG90aGVyMSwgdHJ1ZSkuX2Fic0FkZFNldFNpZ24ob25lLCB0cnVlKTsKICAgICAgfQogICAgICByZXR1cm4gX2Fic09yU2V0U2lnbihvdGhlciwgZmFsc2UpOwogICAgfQogICAgLy8gX25lZyAhPSBhLl9uZWcKICAgIHZhciBwLCBuOwogICAgaWYgKF9pc05lZ2F0aXZlKSB7CiAgICAgIHAgPSBvdGhlcjsKICAgICAgbiA9IHRoaXM7CiAgICB9IGVsc2UgewogICAgICAvLyB8IGlzIHN5bW1ldHJpYy4KICAgICAgcCA9IHRoaXM7CiAgICAgIG4gPSBvdGhlcjsKICAgIH0KICAgIC8vIHAgfCAoLW4pID09IHAgfCB+KG4tMSkgPT0gfigobi0xKSAmfiBwKSA9PSAtKH4oKG4tMSkgJn4gcCkgKyAxKQogICAgdmFyIG4xID0gbi5fYWJzU3ViU2V0U2lnbihvbmUsIHRydWUpOwogICAgLy8gUmVzdWx0IGNhbm5vdCBiZSB6ZXJvIGlmIG9ubHkgb25lIG9mIHRoaXMgb3IgYSBpcyBuZWdhdGl2ZS4KICAgIHJldHVybiBuMS5fYWJzQW5kTm90U2V0U2lnbihwLCB0cnVlKS5fYWJzQWRkU2V0U2lnbihvbmUsIHRydWUpOwogIH0KCiAgLyoqCiAgICogQml0LXdpc2UgZXhjbHVzaXZlLW9yIG9wZXJhdG9yLgogICAqCiAgICogVHJlYXRpbmcgYm90aCBgdGhpc2AgYW5kIFtvdGhlcl0gYXMgc3VmZmljaWVudGx5IGxhcmdlIHR3bydzIGNvbXBvbmVudAogICAqIGludGVnZXJzLCB0aGUgcmVzdWx0IGlzIGEgbnVtYmVyIHdpdGggdGhlIGJpdHMgc2V0IHRoYXQgYXJlIHNldCBpbiBvbmUsCiAgICogYnV0IG5vdCBib3RoLCBvZiBgdGhpc2AgYW5kIFtvdGhlcl0KICAgKgogICAqIElmIHRoZSBvcGVyYW5kcyBoYXZlIHRoZSBzYW1lIHNpZ24sIHRoZSByZXN1bHQgaXMgbm9uLW5lZ2F0aXZlLAogICAqIG90aGVyd2lzZSB0aGUgcmVzdWx0IGlzIG5lZ2F0aXZlLgogICAqLwogIF9CaWdJbnRJbXBsIG9wZXJhdG9yIF4oQmlnSW50IGJpZ0ludCkgewogICAgX0JpZ0ludEltcGwgb3RoZXIgPSBiaWdJbnQ7CiAgICBpZiAoX2lzWmVybykgcmV0dXJuIG90aGVyOwogICAgaWYgKG90aGVyLl9pc1plcm8pIHJldHVybiB0aGlzOwogICAgaWYgKF9pc05lZ2F0aXZlID09IG90aGVyLl9pc05lZ2F0aXZlKSB7CiAgICAgIGlmIChfaXNOZWdhdGl2ZSkgewogICAgICAgIC8vICgtdGhpcykgXiAoLW90aGVyKSA9PSB+KHRoaXMtMSkgXiB+KG90aGVyLTEpID09ICh0aGlzLTEpIF4gKG90aGVyLTEpCiAgICAgICAgdmFyIHRoaXMxID0gX2Fic1N1YlNldFNpZ24ob25lLCB0cnVlKTsKICAgICAgICB2YXIgb3RoZXIxID0gb3RoZXIuX2Fic1N1YlNldFNpZ24ob25lLCB0cnVlKTsKICAgICAgICByZXR1cm4gdGhpczEuX2Fic1hvclNldFNpZ24ob3RoZXIxLCBmYWxzZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIF9hYnNYb3JTZXRTaWduKG90aGVyLCBmYWxzZSk7CiAgICB9CiAgICAvLyBfaXNOZWdhdGl2ZSAhPSBhLl9pc05lZ2F0aXZlCiAgICB2YXIgcCwgbjsKICAgIGlmIChfaXNOZWdhdGl2ZSkgewogICAgICBwID0gb3RoZXI7CiAgICAgIG4gPSB0aGlzOwogICAgfSBlbHNlIHsKICAgICAgLy8gXiBpcyBzeW1tZXRyaWMuCiAgICAgIHAgPSB0aGlzOwogICAgICBuID0gb3RoZXI7CiAgICB9CiAgICAvLyBwIF4gKC1uKSA9PSBwIF4gfihuLTEpID09IH4ocCBeIChuLTEpKSA9PSAtKChwIF4gKG4tMSkpICsgMSkKICAgIHZhciBuMSA9IG4uX2Fic1N1YlNldFNpZ24ob25lLCB0cnVlKTsKICAgIC8vIFJlc3VsdCBjYW5ub3QgYmUgemVybyBpZiBvbmx5IG9uZSBvZiB0aGlzIG9yIGEgaXMgbmVnYXRpdmUuCiAgICByZXR1cm4gcC5fYWJzWG9yU2V0U2lnbihuMSwgdHJ1ZSkuX2Fic0FkZFNldFNpZ24ob25lLCB0cnVlKTsKICB9CgogIC8qKgogICAqIFRoZSBiaXQtd2lzZSBuZWdhdGUgb3BlcmF0b3IuCiAgICoKICAgKiBUcmVhdGluZyBgdGhpc2AgYXMgYSBzdWZmaWNpZW50bHkgbGFyZ2UgdHdvJ3MgY29tcG9uZW50IGludGVnZXIsCiAgICogdGhlIHJlc3VsdCBpcyBhIG51bWJlciB3aXRoIHRoZSBvcHBvc2l0ZSBiaXRzIHNldC4KICAgKgogICAqIFRoaXMgbWFwcyBhbnkgaW50ZWdlciBgeGAgdG8gYC14IC0gMWAuCiAgICovCiAgX0JpZ0ludEltcGwgb3BlcmF0b3IgfigpIHsKICAgIGlmIChfaXNaZXJvKSByZXR1cm4gX21pbnVzT25lOwogICAgaWYgKF9pc05lZ2F0aXZlKSB7CiAgICAgIC8vIH4oLXRoaXMpID09IH4ofih0aGlzLTEpKSA9PSB0aGlzLTEKICAgICAgcmV0dXJuIF9hYnNTdWJTZXRTaWduKG9uZSwgZmFsc2UpOwogICAgfQogICAgLy8gfnRoaXMgPT0gLXRoaXMtMSA9PSAtKHRoaXMrMSkKICAgIC8vIFJlc3VsdCBjYW5ub3QgYmUgemVybyBpZiB0aGlzIGlzIHBvc2l0aXZlLgogICAgcmV0dXJuIF9hYnNBZGRTZXRTaWduKG9uZSwgdHJ1ZSk7CiAgfQoKICAvLy8gQWRkaXRpb24gb3BlcmF0b3IuCiAgX0JpZ0ludEltcGwgb3BlcmF0b3IgKyhCaWdJbnQgYmlnSW50KSB7CiAgICBfQmlnSW50SW1wbCBvdGhlciA9IGJpZ0ludDsKICAgIGlmIChfaXNaZXJvKSByZXR1cm4gb3RoZXI7CiAgICBpZiAob3RoZXIuX2lzWmVybykgcmV0dXJuIHRoaXM7CiAgICB2YXIgaXNOZWdhdGl2ZSA9IF9pc05lZ2F0aXZlOwogICAgaWYgKGlzTmVnYXRpdmUgPT0gb3RoZXIuX2lzTmVnYXRpdmUpIHsKICAgICAgLy8gdGhpcyArIG90aGVyID09IHRoaXMgKyBvdGhlcgogICAgICAvLyAoLXRoaXMpICsgKC1vdGhlcikgPT0gLSh0aGlzICsgb3RoZXIpCiAgICAgIHJldHVybiBfYWJzQWRkU2V0U2lnbihvdGhlciwgaXNOZWdhdGl2ZSk7CiAgICB9CiAgICAvLyB0aGlzICsgKC1vdGhlcikgPT0gdGhpcyAtIG90aGVyID09IC0odGhpcyAtIG90aGVyKQogICAgLy8gKC10aGlzKSArIG90aGVyID09IG90aGVyIC0gdGhpcyA9PSAtKHRoaXMgLSBvdGhlcikKICAgIGlmIChfYWJzQ29tcGFyZShvdGhlcikgPj0gMCkgewogICAgICByZXR1cm4gX2Fic1N1YlNldFNpZ24ob3RoZXIsIGlzTmVnYXRpdmUpOwogICAgfQogICAgcmV0dXJuIG90aGVyLl9hYnNTdWJTZXRTaWduKHRoaXMsICFpc05lZ2F0aXZlKTsKICB9CgogIC8vLyBTdWJ0cmFjdGlvbiBvcGVyYXRvci4KICBfQmlnSW50SW1wbCBvcGVyYXRvciAtKEJpZ0ludCBiaWdJbnQpIHsKICAgIF9CaWdJbnRJbXBsIG90aGVyID0gYmlnSW50OwogICAgaWYgKF9pc1plcm8pIHJldHVybiAtb3RoZXI7CiAgICBpZiAob3RoZXIuX2lzWmVybykgcmV0dXJuIHRoaXM7CiAgICB2YXIgaXNOZWdhdGl2ZSA9IF9pc05lZ2F0aXZlOwogICAgaWYgKGlzTmVnYXRpdmUgIT0gb3RoZXIuX2lzTmVnYXRpdmUpIHsKICAgICAgLy8gdGhpcyAtICgtb3RoZXIpID09IHRoaXMgKyBvdGhlcgogICAgICAvLyAoLXRoaXMpIC0gb3RoZXIgPT0gLSh0aGlzICsgb3RoZXIpCiAgICAgIHJldHVybiBfYWJzQWRkU2V0U2lnbihvdGhlciwgaXNOZWdhdGl2ZSk7CiAgICB9CiAgICAvLyB0aGlzIC0gb3RoZXIgPT0gdGhpcyAtIGEgPT0gLSh0aGlzIC0gb3RoZXIpCiAgICAvLyAoLXRoaXMpIC0gKC1vdGhlcikgPT0gb3RoZXIgLSB0aGlzID09IC0odGhpcyAtIG90aGVyKQogICAgaWYgKF9hYnNDb21wYXJlKG90aGVyKSA+PSAwKSB7CiAgICAgIHJldHVybiBfYWJzU3ViU2V0U2lnbihvdGhlciwgaXNOZWdhdGl2ZSk7CiAgICB9CiAgICByZXR1cm4gb3RoZXIuX2Fic1N1YlNldFNpZ24odGhpcywgIWlzTmVnYXRpdmUpOwogIH0KCiAgLy8vIE11bHRpcGxpZXMgYHhEaWdpdHNbeEluZGV4XWAgd2l0aCBgbXVsdGlwbGljYW5kRGlnaXRzYCBhbmQgYWRkcyB0aGUgcmVzdWx0CiAgLy8vIHRvIGBhY2N1bXVsYXRvckRpZ2l0c2AuCiAgLy8vCiAgLy8vIFRoZSBgbXVsdGlwbGljYW5kRGlnaXRzYCBpbiB0aGUgcmFuZ2UgYGlgIHRvIGBpYCtgbmAtMSBhcmUgdGhlCiAgLy8vIG11bHRpcGxpY2FuZCBkaWdpdHMuCiAgLy8vCiAgLy8vIFRoZSBgYWNjdW11bGF0b3JEaWdpdHNgIGluIHRoZSByYW5nZSBgamAgdG8gYGpgK2BuYC0xIGFyZSB0aGUgYWNjdW11bGF0b3IKICAvLy8gZGlnaXRzLgogIC8vLwogIC8vLyBDb25jcmV0ZWx5OgogIC8vLyBgYWNjdW11bGF0b3JEaWdpdHNbai4uaituXSArPSB4RGlnaXRzW3hJbmRleF0gKiBtX2RpZ2l0c1tpLi5pK24tMV1gLgogIC8vLyBSZXR1cm5zIDEuCiAgLy8vCiAgLy8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludHJpbnNpZmllZC4gSW50cmluc2ljcyBvbiA2NC1iaXQgcGxhdGZvcm1zCiAgLy8vIHByb2Nlc3MgZGlnaXQgcGFpcnMgYXQgZXZlbiBpbmRpY2VzIGFuZCByZXR1cm5zIDIuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIHN0YXRpYyBpbnQgX211bEFkZCgKICAgICAgVWludDMyTGlzdCB4RGlnaXRzLAogICAgICBpbnQgeEluZGV4LAogICAgICBVaW50MzJMaXN0IG11bHRpcGxpY2FuZERpZ2l0cywKICAgICAgaW50IGksCiAgICAgIFVpbnQzMkxpc3QgYWNjdW11bGF0b3JEaWdpdHMsCiAgICAgIGludCBqLAogICAgICBpbnQgbikgewogICAgaW50IHggPSB4RGlnaXRzW3hJbmRleF07CiAgICBpZiAoeCA9PSAwKSB7CiAgICAgIC8vIE5vLW9wIGlmIHggaXMgMC4KICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBpbnQgY2FycnkgPSAwOwogICAgaW50IHhsID0geCAmIF9oYWxmRGlnaXRNYXNrOwogICAgaW50IHhoID0geCA+PiBfaGFsZkRpZ2l0Qml0czsKICAgIHdoaWxlICgtLW4gPj0gMCkgewogICAgICBpbnQgbWwgPSBtdWx0aXBsaWNhbmREaWdpdHNbaV0gJiBfaGFsZkRpZ2l0TWFzazsKICAgICAgaW50IG1oID0gbXVsdGlwbGljYW5kRGlnaXRzW2krK10gPj4gX2hhbGZEaWdpdEJpdHM7CiAgICAgIGludCBwaCA9IHhoICogbWwgKyBtaCAqIHhsOwogICAgICBpbnQgcGwgPSB4bCAqIG1sICsKICAgICAgICAgICgocGggJiBfaGFsZkRpZ2l0TWFzaykgPDwgX2hhbGZEaWdpdEJpdHMpICsKICAgICAgICAgIGFjY3VtdWxhdG9yRGlnaXRzW2pdICsKICAgICAgICAgIGNhcnJ5OwogICAgICBjYXJyeSA9IChwbCA+PiBfZGlnaXRCaXRzKSArIChwaCA+PiBfaGFsZkRpZ2l0Qml0cykgKyB4aCAqIG1oOwogICAgICBhY2N1bXVsYXRvckRpZ2l0c1tqKytdID0gcGwgJiBfZGlnaXRNYXNrOwogICAgfQogICAgd2hpbGUgKGNhcnJ5ICE9IDApIHsKICAgICAgaW50IGwgPSBhY2N1bXVsYXRvckRpZ2l0c1tqXSArIGNhcnJ5OwogICAgICBjYXJyeSA9IGwgPj4gX2RpZ2l0Qml0czsKICAgICAgYWNjdW11bGF0b3JEaWdpdHNbaisrXSA9IGwgJiBfZGlnaXRNYXNrOwogICAgfQogICAgcmV0dXJuIDE7CiAgfQoKICAvLy8gTXVsdGlwbGllcyBgeERpZ2l0c1tpXWAgd2l0aCBgeERpZ2l0c2AgYW5kIGFkZHMgdGhlIHJlc3VsdCB0bwogIC8vLyBgYWNjdW11bGF0b3JEaWdpdHNgLgogIC8vLwogIC8vLyBUaGUgYHhEaWdpdHNgIGluIHRoZSByYW5nZSBgaWAgdG8gYHVzZWRgLTEgYXJlIHRoZSBtdWx0aXBsaWNhbmQgZGlnaXRzLgogIC8vLwogIC8vLyBUaGUgYGFjY3VtdWxhdG9yRGlnaXRzYCBpbiB0aGUgcmFuZ2UgMipgaWAgdG8gYGlgK2B1c2VkYC0xIGFyZSB0aGUKICAvLy8gYWNjdW11bGF0b3IgZGlnaXRzLgogIC8vLwogIC8vLyBDb25jcmV0ZWx5OgogIC8vLyBgYWNjdW11bGF0b3JEaWdpdHNbMippLi5pK3VzZWQtMV0gKz0geERpZ2l0c1tpXSp4RGlnaXRzW2ldICsKICAvLy8gMip4RGlnaXRzW2ldKnhEaWdpdHNbaSsxLi51c2VkLTFdYC4KICAvLy8gUmV0dXJucyAxLgogIC8vLwogIC8vLyBOb3RlOiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRyaW5zaWZpZWQuIEludHJpbnNpY3Mgb24gNjQtYml0IHBsYXRmb3JtcwogIC8vLyBwcm9jZXNzIGRpZ2l0IHBhaXJzIGF0IGV2ZW4gaW5kaWNlcyBhbmQgcmV0dXJucyAyLgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBzdGF0aWMgaW50IF9zcXJBZGQoCiAgICAgIFVpbnQzMkxpc3QgeERpZ2l0cywgaW50IGksIFVpbnQzMkxpc3QgYWNjdWx1bWF0b3JEaWdpdHMsIGludCB1c2VkKSB7CiAgICBpbnQgeCA9IHhEaWdpdHNbaV07CiAgICBpZiAoeCA9PSAwKSByZXR1cm4gMTsKICAgIGludCBqID0gMiAqIGk7CiAgICBpbnQgY2FycnkgPSAwOwogICAgaW50IHhsID0geCAmIF9oYWxmRGlnaXRNYXNrOwogICAgaW50IHhoID0geCA+PiBfaGFsZkRpZ2l0Qml0czsKICAgIGludCBwaCA9IDIgKiB4aCAqIHhsOwogICAgaW50IHBsID0geGwgKiB4bCArCiAgICAgICAgKChwaCAmIF9oYWxmRGlnaXRNYXNrKSA8PCBfaGFsZkRpZ2l0Qml0cykgKwogICAgICAgIGFjY3VsdW1hdG9yRGlnaXRzW2pdOwogICAgY2FycnkgPSAocGwgPj4gX2RpZ2l0Qml0cykgKyAocGggPj4gX2hhbGZEaWdpdEJpdHMpICsgeGggKiB4aDsKICAgIGFjY3VsdW1hdG9yRGlnaXRzW2pdID0gcGwgJiBfZGlnaXRNYXNrOwogICAgeCA8PD0gMTsKICAgIHhsID0geCAmIF9oYWxmRGlnaXRNYXNrOwogICAgeGggPSB4ID4+IF9oYWxmRGlnaXRCaXRzOwogICAgaW50IG4gPSB1c2VkIC0gaSAtIDE7CiAgICBpbnQgayA9IGkgKyAxOwogICAgaisrOwogICAgd2hpbGUgKC0tbiA+PSAwKSB7CiAgICAgIGludCBsID0geERpZ2l0c1trXSAmIF9oYWxmRGlnaXRNYXNrOwogICAgICBpbnQgaCA9IHhEaWdpdHNbaysrXSA+PiBfaGFsZkRpZ2l0Qml0czsKICAgICAgaW50IHBoID0geGggKiBsICsgaCAqIHhsOwogICAgICBpbnQgcGwgPSB4bCAqIGwgKwogICAgICAgICAgKChwaCAmIF9oYWxmRGlnaXRNYXNrKSA8PCBfaGFsZkRpZ2l0Qml0cykgKwogICAgICAgICAgYWNjdWx1bWF0b3JEaWdpdHNbal0gKwogICAgICAgICAgY2Fycnk7CiAgICAgIGNhcnJ5ID0gKHBsID4+IF9kaWdpdEJpdHMpICsgKHBoID4+IF9oYWxmRGlnaXRCaXRzKSArIHhoICogaDsKICAgICAgYWNjdWx1bWF0b3JEaWdpdHNbaisrXSA9IHBsICYgX2RpZ2l0TWFzazsKICAgIH0KICAgIGNhcnJ5ICs9IGFjY3VsdW1hdG9yRGlnaXRzW2kgKyB1c2VkXTsKICAgIGlmIChjYXJyeSA+PSBfZGlnaXRCYXNlKSB7CiAgICAgIGFjY3VsdW1hdG9yRGlnaXRzW2kgKyB1c2VkXSA9IGNhcnJ5IC0gX2RpZ2l0QmFzZTsKICAgICAgYWNjdWx1bWF0b3JEaWdpdHNbaSArIHVzZWQgKyAxXSA9IDE7CiAgICB9IGVsc2UgewogICAgICBhY2N1bHVtYXRvckRpZ2l0c1tpICsgdXNlZF0gPSBjYXJyeTsKICAgIH0KICAgIHJldHVybiAxOwogIH0KCiAgLy8vIE11bHRpcGxpY2F0aW9uIG9wZXJhdG9yLgogIF9CaWdJbnRJbXBsIG9wZXJhdG9yICooQmlnSW50IGJpZ0ludCkgewogICAgX0JpZ0ludEltcGwgb3RoZXIgPSBiaWdJbnQ7CiAgICB2YXIgdXNlZCA9IF91c2VkOwogICAgdmFyIG90aGVyVXNlZCA9IG90aGVyLl91c2VkOwogICAgaWYgKHVzZWQgPT0gMCB8fCBvdGhlclVzZWQgPT0gMCkgewogICAgICByZXR1cm4gemVybzsKICAgIH0KICAgIHZhciByZXN1bHRVc2VkID0gdXNlZCArIG90aGVyVXNlZDsKICAgIHZhciBkaWdpdHMgPSBfZGlnaXRzOwogICAgdmFyIG90aGVyRGlnaXRzID0gb3RoZXIuX2RpZ2l0czsKICAgIHZhciByZXN1bHREaWdpdHMgPSBfbmV3RGlnaXRzKHJlc3VsdFVzZWQpOwogICAgdmFyIGkgPSAwOwogICAgd2hpbGUgKGkgPCBvdGhlclVzZWQpIHsKICAgICAgaSArPSBfbXVsQWRkKG90aGVyRGlnaXRzLCBpLCBkaWdpdHMsIDAsIHJlc3VsdERpZ2l0cywgaSwgdXNlZCk7CiAgICB9CiAgICByZXR1cm4gbmV3IF9CaWdJbnRJbXBsLl8oCiAgICAgICAgX2lzTmVnYXRpdmUgIT0gb3RoZXIuX2lzTmVnYXRpdmUsIHJlc3VsdFVzZWQsIHJlc3VsdERpZ2l0cyk7CiAgfQoKICAvLyByZXN1bHREaWdpdHNbMC4ucmVzdWx0VXNlZC0xXSA9CiAgLy8gICAgIHhEaWdpdHNbMC4ueFVzZWQtMV0qb3RoZXJEaWdpdHNbMC4ub3RoZXJVc2VkLTFdLgogIC8vIFJldHVybnMgcmVzdWx0VXNlZCA9IHhVc2VkICsgb3RoZXJVc2VkLgogIHN0YXRpYyBpbnQgX211bERpZ2l0cyhVaW50MzJMaXN0IHhEaWdpdHMsIGludCB4VXNlZCwgVWludDMyTGlzdCBvdGhlckRpZ2l0cywKICAgICAgaW50IG90aGVyVXNlZCwgVWludDMyTGlzdCByZXN1bHREaWdpdHMpIHsKICAgIHZhciByZXN1bHRVc2VkID0geFVzZWQgKyBvdGhlclVzZWQ7CiAgICB2YXIgaSA9IHJlc3VsdFVzZWQgKyAocmVzdWx0VXNlZCAmIDEpOwogICAgYXNzZXJ0KHJlc3VsdERpZ2l0cy5sZW5ndGggPj0gaSk7CiAgICB3aGlsZSAoLS1pID49IDApIHsKICAgICAgcmVzdWx0RGlnaXRzW2ldID0gMDsKICAgIH0KICAgIGkgPSAwOwogICAgd2hpbGUgKGkgPCBvdGhlclVzZWQpIHsKICAgICAgaSArPSBfbXVsQWRkKG90aGVyRGlnaXRzLCBpLCB4RGlnaXRzLCAwLCByZXN1bHREaWdpdHMsIGksIHhVc2VkKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRVc2VkOwogIH0KCiAgLy8gcmVzdWx0RGlnaXRzWzAuLnJlc3VsdFVzZWQtMV0gPSB4RGlnaXRzWzAuLnhVc2VkLTFdXjIuCiAgLy8gUmV0dXJucyByZXN1bHRVc2VkID0gMip4VXNlZC4KICBzdGF0aWMgaW50IF9zcXJEaWdpdHMoCiAgICAgIFVpbnQzMkxpc3QgeERpZ2l0cywgaW50IHhVc2VkLCBVaW50MzJMaXN0IHJlc3VsdERpZ2l0cykgewogICAgdmFyIHJlc3VsdFVzZWQgPSAyICogeFVzZWQ7CiAgICBhc3NlcnQocmVzdWx0RGlnaXRzLmxlbmd0aCA+PSByZXN1bHRVc2VkKTsKICAgIC8vIFNpbmNlIHJlc3VsdFVzZWQgaXMgZXZlbiwgbm8gbmVlZCBmb3IgYSBsZWFkaW5nIHplcm8gZm9yCiAgICAvLyA2NC1iaXQgcHJvY2Vzc2luZy4KICAgIHZhciBpID0gcmVzdWx0VXNlZDsKICAgIHdoaWxlICgtLWkgPj0gMCkgewogICAgICByZXN1bHREaWdpdHNbaV0gPSAwOwogICAgfQogICAgaSA9IDA7CiAgICB3aGlsZSAoaSA8IHhVc2VkIC0gMSkgewogICAgICBpICs9IF9zcXJBZGQoeERpZ2l0cywgaSwgcmVzdWx0RGlnaXRzLCB4VXNlZCk7CiAgICB9CiAgICAvLyBUaGUgbGFzdCBzdGVwIGlzIGFscmVhZHkgZG9uZSBpZiBkaWdpdCBwYWlycyB3ZXJlIHByb2Nlc3NlZCBhYm92ZS4KICAgIGlmIChpIDwgeFVzZWQpIHsKICAgICAgX211bEFkZCh4RGlnaXRzLCBpLCB4RGlnaXRzLCBpLCByZXN1bHREaWdpdHMsIDIgKiBpLCAxKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRVc2VkOwogIH0KCiAgLy8gSW5kaWNlcyBvZiB0aGUgYXJndW1lbnRzIG9mIF9lc3RpbWF0ZVF1b3RpZW50RGlnaXQuCiAgLy8gRm9yIDY0LWJpdCBwcm9jZXNzaW5nIGJ5IGludHJpbnNpY3Mgb24gNjQtYml0IHBsYXRmb3JtcywgdGhlIHRvcCBkaWdpdCBwYWlyCiAgLy8gb2YgdGhlIGRpdmlzb3IgaXMgcHJvdmlkZWQgaW4gdGhlIGFyZ3MgYXJyYXksIGFuZCBhIDY0LWJpdCBlc3RpbWF0ZWQKICAvLyBxdW90aWVudCBpcyByZXR1cm5lZC4gSG93ZXZlciwgb24gMzItYml0IHBsYXRmb3JtcywgdGhlIGxvdyAzMi1iaXQgZGlnaXQgaXMKICAvLyBpZ25vcmVkIGFuZCBvbmx5IG9uZSAzMi1iaXQgZGlnaXQgaXMgcmV0dXJuZWQgYXMgdGhlIGVzdGltYXRlZCBxdW90aWVudC4KICBzdGF0aWMgY29uc3QgaW50IF9kaXZpc29yTG93VG9wRGlnaXQgPSAwOyAvLyBMb3cgZGlnaXQgb2YgdG9wIHBhaXIgb2YgZGl2aXNvci4KICBzdGF0aWMgY29uc3QgaW50IF9kaXZpc29yVG9wRGlnaXQgPSAxOyAvLyBUb3AgZGlnaXQgb2YgZGl2aXNvci4KICBzdGF0aWMgY29uc3QgaW50IF9xdW90aWVudERpZ2l0ID0gMjsgLy8gRXN0aW1hdGVkIHF1b3RpZW50LgogIHN0YXRpYyBjb25zdCBpbnQgX3F1b3RpZW50SGlnaERpZ2l0ID0gMzsgLy8gSGlnaCBkaWdpdCBvZiBlc3RpbWF0ZWQgcXVvdGllbnQuCgogIC8vLyBFc3RpbWF0ZSBgYXJnc1tfcXVvdGllbnREaWdpdF0gPSBkaWdpdHNbaS0xLi5pXSB+LyBhcmdzW19kaXZpc29yVG9wRGlnaXRdYAogIC8vLyBSZXR1cm5zIDEuCiAgLy8vCiAgLy8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludHJpbnNpZmllZC4gSW50cmluc2ljcyBvbiA2NC1iaXQgcGxhdGZvcm1zCiAgLy8vIHByb2Nlc3MgYSBkaWdpdCBwYWlyIChpIGFsd2F5cyBvZGQpOgogIC8vLyBFc3RpbWF0ZSBgYXJnc1tfcXVvdGllbnREaWdpdC4uX3F1b3RpZW50SGlnaERpZ2l0XSA9IGRpZ2l0c1tpLTMuLmldIH4vCiAgLy8vIGFyZ3NbX2Rpdmlzb3JMb3dUb3BEaWdpdC4uX2Rpdmlzb3JUb3BEaWdpdF1gLgogIC8vLyBSZXR1cm5zIDIuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIHN0YXRpYyBpbnQgX2VzdGltYXRlUXVvdGllbnREaWdpdChVaW50MzJMaXN0IGFyZ3MsIFVpbnQzMkxpc3QgZGlnaXRzLCBpbnQgaSkgewogICAgLy8gVmVyaWZ5IHRoYXQgZGlnaXQgcGFpcnMgYXJlIGFjY2Vzc2libGUgZm9yIDY0LWJpdCBwcm9jZXNzaW5nLgogICAgYXNzZXJ0KGRpZ2l0cy5sZW5ndGggPj0gNCk7CiAgICBpZiAoZGlnaXRzW2ldID09IGFyZ3NbX2Rpdmlzb3JUb3BEaWdpdF0pIHsKICAgICAgYXJnc1tfcXVvdGllbnREaWdpdF0gPSBfZGlnaXRNYXNrOwogICAgfSBlbHNlIHsKICAgICAgLy8gQ2hvcCBvZmYgb25lIGJpdCwgc2luY2UgYSBNaW50IGNhbm5vdCBob2xkIDIgZGlnaXRzLgogICAgICB2YXIgcXVvdGllbnREaWdpdCA9CiAgICAgICAgICAoKGRpZ2l0c1tpXSA8PCAoX2RpZ2l0Qml0cyAtIDEpKSB8IChkaWdpdHNbaSAtIDFdID4+IDEpKSB+LwogICAgICAgICAgICAgIChhcmdzW19kaXZpc29yVG9wRGlnaXRdID4+IDEpOwogICAgICBpZiAocXVvdGllbnREaWdpdCA+IF9kaWdpdE1hc2spIHsKICAgICAgICBhcmdzW19xdW90aWVudERpZ2l0XSA9IF9kaWdpdE1hc2s7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXJnc1tfcXVvdGllbnREaWdpdF0gPSBxdW90aWVudERpZ2l0OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKICB9CgogIC8vLyBSZXR1cm5zIGB0cnVuYyh0aGlzIC8gb3RoZXIpYCwgd2l0aCBgb3RoZXIgIT0gMGAuCiAgX0JpZ0ludEltcGwgX2RpdihCaWdJbnQgYmlnSW50KSB7CiAgICBfQmlnSW50SW1wbCBvdGhlciA9IGJpZ0ludDsKICAgIGFzc2VydChvdGhlci5fdXNlZCA+IDApOwogICAgaWYgKF91c2VkIDwgb3RoZXIuX3VzZWQpIHsKICAgICAgcmV0dXJuIHplcm87CiAgICB9CiAgICBfZGl2UmVtKG90aGVyKTsKICAgIC8vIFJldHVybiBxdW90aWVudCwgaS5lLgogICAgLy8gX2xhc3RRdW9SZW1fZGlnaXRzW19sYXN0UmVtX3VzZWQuLl9sYXN0UXVvUmVtX3VzZWQtMV0gd2l0aCBwcm9wZXIgc2lnbi4KICAgIHZhciBsYXN0UXVvX3VzZWQgPSBfbGFzdFF1b1JlbVVzZWQgLSBfbGFzdFJlbVVzZWQ7CiAgICB2YXIgcXVvX2RpZ2l0cyA9IF9jbG9uZURpZ2l0cygKICAgICAgICBfbGFzdFF1b1JlbURpZ2l0cywgX2xhc3RSZW1Vc2VkLCBfbGFzdFF1b1JlbVVzZWQsIGxhc3RRdW9fdXNlZCk7CiAgICB2YXIgcXVvID0gbmV3IF9CaWdJbnRJbXBsLl8oZmFsc2UsIGxhc3RRdW9fdXNlZCwgcXVvX2RpZ2l0cyk7CiAgICBpZiAoKF9pc05lZ2F0aXZlICE9IG90aGVyLl9pc05lZ2F0aXZlKSAmJiAocXVvLl91c2VkID4gMCkpIHsKICAgICAgcXVvID0gLXF1bzsKICAgIH0KICAgIHJldHVybiBxdW87CiAgfQoKICAvLy8gUmV0dXJucyBgdGhpcyAtIG90aGVyICogdHJ1bmModGhpcyAvIG90aGVyKWAsIHdpdGggYG90aGVyICE9IDBgLgogIF9CaWdJbnRJbXBsIF9yZW0oQmlnSW50IGJpZ0ludCkgewogICAgX0JpZ0ludEltcGwgb3RoZXIgPSBiaWdJbnQ7CiAgICBhc3NlcnQob3RoZXIuX3VzZWQgPiAwKTsKICAgIGlmIChfdXNlZCA8IG90aGVyLl91c2VkKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgX2RpdlJlbShvdGhlcik7CiAgICAvLyBSZXR1cm4gcmVtYWluZGVyLCBpLmUuCiAgICAvLyBkZW5vcm1hbGl6ZWQgX2xhc3RRdW9SZW1fZGlnaXRzWzAuLl9sYXN0UmVtX3VzZWQtMV0gd2l0aCBwcm9wZXIgc2lnbi4KICAgIHZhciByZW1EaWdpdHMgPQogICAgICAgIF9jbG9uZURpZ2l0cyhfbGFzdFF1b1JlbURpZ2l0cywgMCwgX2xhc3RSZW1Vc2VkLCBfbGFzdFJlbVVzZWQpOwogICAgdmFyIHJlbSA9IG5ldyBfQmlnSW50SW1wbC5fKGZhbHNlLCBfbGFzdFJlbVVzZWQsIHJlbURpZ2l0cyk7CiAgICBpZiAoX2xhc3RSZW1fbnNoID4gMCkgewogICAgICByZW0gPSByZW0gPj4gX2xhc3RSZW1fbnNoOyAvLyBEZW5vcm1hbGl6ZSByZW1haW5kZXIuCiAgICB9CiAgICBpZiAoX2lzTmVnYXRpdmUgJiYgKHJlbS5fdXNlZCA+IDApKSB7CiAgICAgIHJlbSA9IC1yZW07CiAgICB9CiAgICByZXR1cm4gcmVtOwogIH0KCiAgLy8vIENvbXB1dGVzIHRoaXMgfi8gb3RoZXIgYW5kIHRoaXMucmVtYWluZGVyKG90aGVyKS4KICAvLy8KICAvLy8gU3RvcmVzIHRoZSByZXN1bHQgaW4gW19sYXN0UXVvUmVtRGlnaXRzXSwgW19sYXN0UXVvUmVtVXNlZF0gYW5kCiAgLy8vIFtfbGFzdFJlbVVzZWRdLiBUaGUgW19sYXN0UXVvUmVtRGlnaXRzXSBjb250YWlucyB0aGUgZGlnaXRzIG9mICpib3RoKiwgdGhlCiAgLy8vIHF1b3RpZW50IGFuZCB0aGUgcmVtYWluZGVyLgogIC8vLwogIC8vLyBDYWNoZXMgdGhlIGlucHV0IHRvIGF2b2lkIGRvaW5nIHRoZSB3b3JrIGFnYWluIHdoZW4gdXNlcnMgd3JpdGUKICAvLy8gYGEgfi8gYmAgZm9sbG93ZWQgYnkgYSBgYSAlIGJgLgogIHZvaWQgX2RpdlJlbShfQmlnSW50SW1wbCBvdGhlcikgewogICAgLy8gQ2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkLgogICAgaWYgKCh0aGlzLl91c2VkID09IF9sYXN0RGl2aWRlbmRVc2VkKSAmJgogICAgICAgIChvdGhlci5fdXNlZCA9PSBfbGFzdERpdmlzb3JVc2VkKSAmJgogICAgICAgIGlkZW50aWNhbCh0aGlzLl9kaWdpdHMsIF9sYXN0RGl2aWRlbmREaWdpdHMpICYmCiAgICAgICAgaWRlbnRpY2FsKG90aGVyLl9kaWdpdHMsIF9sYXN0RGl2aXNvckRpZ2l0cykpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgYXNzZXJ0KF91c2VkID49IG90aGVyLl91c2VkKTsKCiAgICB2YXIgbnNoID0gX2RpZ2l0Qml0cyAtIG90aGVyLl9kaWdpdHNbb3RoZXIuX3VzZWQgLSAxXS5iaXRMZW5ndGg7CiAgICAvLyBGb3IgNjQtYml0IHByb2Nlc3NpbmcsIG1ha2Ugc3VyZSBvdGhlciBoYXMgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzLgogICAgaWYgKG90aGVyLl91c2VkLmlzT2RkKSB7CiAgICAgIG5zaCArPSBfZGlnaXRCaXRzOwogICAgfQogICAgLy8gQ29uY2F0ZW5hdGVkIHBvc2l0aXZlIHF1b3RpZW50IGFuZCBub3JtYWxpemVkIHBvc2l0aXZlIHJlbWFpbmRlci4KICAgIC8vIFRoZSByZXN1bHREaWdpdHMgY2FuIGhhdmUgYXQgbW9zdCBvbmUgbW9yZSBkaWdpdCB0aGFuIHRoZSBkaXZpZGVuZC4KICAgIFVpbnQzMkxpc3QgcmVzdWx0RGlnaXRzOwogICAgaW50IHJlc3VsdFVzZWQ7CiAgICAvLyBOb3JtYWxpemVkIHBvc2l0aXZlIGRpdmlzb3IgKHJlZmVycmVkIHRvIGFzICd5JykuCiAgICAvLyBUaGUgbm9ybWFsaXplZCBkaXZpc29yIGhhcyB0aGUgbW9zdC1zaWduaWZpY2FudCBiaXQgb2YgaXRzIG1vc3QKICAgIC8vIHNpZ25pZmljYW50IGRpZ2l0IHNldC4KICAgIC8vIFRoaXMgbWFrZXMgZXN0aW1hdGluZyB0aGUgcXVvdGllbnQgZWFzaWVyLgogICAgVWludDMyTGlzdCB5RGlnaXRzOwogICAgaW50IHlVc2VkOwogICAgaWYgKG5zaCA+IDApIHsKICAgICAgLy8gRXh0cmEgZGlnaXRzIGZvciBub3JtYWxpemF0aW9uLCBhbHNvIHVzZWQgZm9yIHBvc3NpYmxlIF9tdWxBZGQgY2FycnkuCiAgICAgIHZhciBudW1FeHRyYURpZ2l0cyA9IChuc2ggKyBfZGlnaXRCaXRzIC0gMSkgfi8gX2RpZ2l0Qml0cyArIDE7CiAgICAgIHlEaWdpdHMgPSBfbmV3RGlnaXRzKG90aGVyLl91c2VkICsgbnVtRXh0cmFEaWdpdHMpOwogICAgICB5VXNlZCA9IF9sU2hpZnREaWdpdHMob3RoZXIuX2RpZ2l0cywgb3RoZXIuX3VzZWQsIG5zaCwgeURpZ2l0cyk7CiAgICAgIHJlc3VsdERpZ2l0cyA9IF9uZXdEaWdpdHMoX3VzZWQgKyBudW1FeHRyYURpZ2l0cyk7CiAgICAgIHJlc3VsdFVzZWQgPSBfbFNoaWZ0RGlnaXRzKF9kaWdpdHMsIF91c2VkLCBuc2gsIHJlc3VsdERpZ2l0cyk7CiAgICB9IGVsc2UgewogICAgICB5RGlnaXRzID0gb3RoZXIuX2RpZ2l0czsKICAgICAgeVVzZWQgPSBvdGhlci5fdXNlZDsKICAgICAgLy8gRXh0cmEgZGlnaXQgdG8gaG9sZCBwb3NzaWJsZSBfbXVsQWRkIGNhcnJ5LgogICAgICByZXN1bHREaWdpdHMgPSBfY2xvbmVEaWdpdHMoX2RpZ2l0cywgMCwgX3VzZWQsIF91c2VkICsgMSk7CiAgICAgIHJlc3VsdFVzZWQgPSBfdXNlZDsKICAgIH0KICAgIFVpbnQzMkxpc3QgYXJncyA9IF9uZXdEaWdpdHMoNCk7CiAgICBhcmdzW19kaXZpc29yTG93VG9wRGlnaXRdID0geURpZ2l0c1t5VXNlZCAtIDJdOwogICAgYXJnc1tfZGl2aXNvclRvcERpZ2l0XSA9IHlEaWdpdHNbeVVzZWQgLSAxXTsKICAgIC8vIEZvciA2NC1iaXQgcHJvY2Vzc2luZywgbWFrZSBzdXJlIHlVc2VkLCBpLCBhbmQgaiBhcmUgZXZlbi4KICAgIGFzc2VydCh5VXNlZC5pc0V2ZW4pOwogICAgdmFyIGkgPSByZXN1bHRVc2VkICsgKHJlc3VsdFVzZWQgJiAxKTsKICAgIHZhciBqID0gaSAtIHlVc2VkOwogICAgLy8gdG1wRGlnaXRzIGlzIGEgdGVtcG9yYXJ5IGFycmF5IG9mIGkgKGV2ZW4gcmVzdWx0VXNlZCkgZGlnaXRzLgogICAgdmFyIHRtcERpZ2l0cyA9IF9uZXdEaWdpdHMoaSk7CiAgICB2YXIgdG1wVXNlZCA9IF9kbFNoaWZ0RGlnaXRzKHlEaWdpdHMsIHlVc2VkLCBqLCB0bXBEaWdpdHMpOwogICAgLy8gRXhwbGljaXQgZmlyc3QgZGl2aXNpb24gc3RlcCBpbiBjYXNlIG5vcm1hbGl6ZWQgZGl2aWRlbmQgaXMgbGFyZ2VyIG9yCiAgICAvLyBlcXVhbCB0byBzaGlmdGVkIG5vcm1hbGl6ZWQgZGl2aXNvci4KICAgIGlmIChfY29tcGFyZURpZ2l0cyhyZXN1bHREaWdpdHMsIHJlc3VsdFVzZWQsIHRtcERpZ2l0cywgdG1wVXNlZCkgPj0gMCkgewogICAgICBhc3NlcnQoaSA9PSByZXN1bHRVc2VkKTsKICAgICAgcmVzdWx0RGlnaXRzW3Jlc3VsdFVzZWQrK10gPSAxOyAvLyBRdW90aWVudCA9IDEuCiAgICAgIC8vIFN1YnRyYWN0IGRpdmlzb3IgZnJvbSByZW1haW5kZXIuCiAgICAgIF9hYnNTdWIocmVzdWx0RGlnaXRzLCByZXN1bHRVc2VkLCB0bXBEaWdpdHMsIHRtcFVzZWQsIHJlc3VsdERpZ2l0cyk7CiAgICB9IGVsc2UgewogICAgICAvLyBBY2NvdW50IGZvciBwb3NzaWJsZSBjYXJyeSBpbiBfbXVsQWRkIHN0ZXAuCiAgICAgIHJlc3VsdERpZ2l0c1tyZXN1bHRVc2VkKytdID0gMDsKICAgIH0KICAgIGlmIChyZXN1bHRVc2VkLmlzT2RkKSB7CiAgICAgIHJlc3VsdERpZ2l0c1tyZXN1bHRVc2VkXSA9IDA7IC8vIExlYWRpbmcgemVybyBmb3IgNjQtYml0IHByb2Nlc3NpbmcuCiAgICB9CiAgICAvLyBOZWdhdGUgeSBzbyB3ZSBjYW4gbGF0ZXIgdXNlIF9tdWxBZGQgaW5zdGVhZCBvZiBub24tZXhpc3RlbnQgX211bFN1Yi4KICAgIHZhciBueURpZ2l0cyA9IF9uZXdEaWdpdHMoeVVzZWQgKyAyKTsKICAgIG55RGlnaXRzW3lVc2VkXSA9IDE7CiAgICBfYWJzU3ViKG55RGlnaXRzLCB5VXNlZCArIDEsIHlEaWdpdHMsIHlVc2VkLCBueURpZ2l0cyk7CiAgICAvLyBueURpZ2l0cyBpcyByZWFkLW9ubHkgYW5kIGhhcyB5VXNlZCBkaWdpdHMgKHBvc3NpYmx5IGluY2x1ZGluZyBzZXZlcmFsCiAgICAvLyBsZWFkaW5nIHplcm9zKSBwbHVzIGEgbGVhZGluZyB6ZXJvIGZvciA2NC1iaXQgcHJvY2Vzc2luZy4KICAgIC8vIHJlc3VsdERpZ2l0cyBpcyBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLgogICAgLy8gcmVzdWx0RGlnaXRzWzAuLnlVc2VkLTFdIGlzIHRoZSBjdXJyZW50IHJlbWFpbmRlci4KICAgIC8vIHJlc3VsdERpZ2l0c1t5VXNlZC4ucmVzdWx0VXNlZC0xXSBpcyB0aGUgY3VycmVudCBxdW90aWVudC4KICAgIC0taTsKICAgIHdoaWxlIChqID4gMCkgewogICAgICB2YXIgZDAgPSBfZXN0aW1hdGVRdW90aWVudERpZ2l0KGFyZ3MsIHJlc3VsdERpZ2l0cywgaSk7CiAgICAgIGogLT0gZDA7CiAgICAgIHZhciBkMSA9CiAgICAgICAgICBfbXVsQWRkKGFyZ3MsIF9xdW90aWVudERpZ2l0LCBueURpZ2l0cywgMCwgcmVzdWx0RGlnaXRzLCBqLCB5VXNlZCk7CiAgICAgIC8vIF9lc3RpbWF0ZVF1b3RpZW50RGlnaXQgYW5kIF9tdWxBZGQgbXVzdCBhZ3JlZSBvbiB0aGUgbnVtYmVyIG9mIGRpZ2l0cwogICAgICAvLyB0byBwcm9jZXNzLgogICAgICBhc3NlcnQoZDAgPT0gZDEpOwogICAgICBpZiAoZDAgPT0gMSkgewogICAgICAgIGlmIChyZXN1bHREaWdpdHNbaV0gPCBhcmdzW19xdW90aWVudERpZ2l0XSkgewogICAgICAgICAgLy8gUmV1c2luZyB0aGUgYWxyZWFkeSBleGlzdGluZyB0bXBEaWdpdHMgYXJyYXkuCiAgICAgICAgICB2YXIgdG1wVXNlZCA9IF9kbFNoaWZ0RGlnaXRzKG55RGlnaXRzLCB5VXNlZCwgaiwgdG1wRGlnaXRzKTsKICAgICAgICAgIF9hYnNTdWIocmVzdWx0RGlnaXRzLCByZXN1bHRVc2VkLCB0bXBEaWdpdHMsIHRtcFVzZWQsIHJlc3VsdERpZ2l0cyk7CiAgICAgICAgICB3aGlsZSAocmVzdWx0RGlnaXRzW2ldIDwgLS1hcmdzW19xdW90aWVudERpZ2l0XSkgewogICAgICAgICAgICBfYWJzU3ViKHJlc3VsdERpZ2l0cywgcmVzdWx0VXNlZCwgdG1wRGlnaXRzLCB0bXBVc2VkLCByZXN1bHREaWdpdHMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQoZDAgPT0gMik7CiAgICAgICAgYXNzZXJ0KHJlc3VsdERpZ2l0c1tpXSA8PSBhcmdzW19xdW90aWVudEhpZ2hEaWdpdF0pOwogICAgICAgIGlmIChyZXN1bHREaWdpdHNbaV0gPCBhcmdzW19xdW90aWVudEhpZ2hEaWdpdF0gfHwKICAgICAgICAgICAgcmVzdWx0RGlnaXRzW2kgLSAxXSA8IGFyZ3NbX3F1b3RpZW50RGlnaXRdKSB7CiAgICAgICAgICAvLyBSZXVzaW5nIHRoZSBhbHJlYWR5IGV4aXN0aW5nIHRtcERpZ2l0cyBhcnJheS4KICAgICAgICAgIHZhciB0bXBVc2VkID0gX2RsU2hpZnREaWdpdHMobnlEaWdpdHMsIHlVc2VkLCBqLCB0bXBEaWdpdHMpOwogICAgICAgICAgX2Fic1N1YihyZXN1bHREaWdpdHMsIHJlc3VsdFVzZWQsIHRtcERpZ2l0cywgdG1wVXNlZCwgcmVzdWx0RGlnaXRzKTsKICAgICAgICAgIGlmIChhcmdzW19xdW90aWVudERpZ2l0XSA9PSAwKSB7CiAgICAgICAgICAgIC0tYXJnc1tfcXVvdGllbnRIaWdoRGlnaXRdOwogICAgICAgICAgfQogICAgICAgICAgLS1hcmdzW19xdW90aWVudERpZ2l0XTsKICAgICAgICAgIGFzc2VydChyZXN1bHREaWdpdHNbaV0gPD0gYXJnc1tfcXVvdGllbnRIaWdoRGlnaXRdKTsKICAgICAgICAgIHdoaWxlIChyZXN1bHREaWdpdHNbaV0gPCBhcmdzW19xdW90aWVudEhpZ2hEaWdpdF0gfHwKICAgICAgICAgICAgICByZXN1bHREaWdpdHNbaSAtIDFdIDwgYXJnc1tfcXVvdGllbnREaWdpdF0pIHsKICAgICAgICAgICAgX2Fic1N1YihyZXN1bHREaWdpdHMsIHJlc3VsdFVzZWQsIHRtcERpZ2l0cywgdG1wVXNlZCwgcmVzdWx0RGlnaXRzKTsKICAgICAgICAgICAgaWYgKGFyZ3NbX3F1b3RpZW50RGlnaXRdID09IDApIHsKICAgICAgICAgICAgICAtLWFyZ3NbX3F1b3RpZW50SGlnaERpZ2l0XTsKICAgICAgICAgICAgfQogICAgICAgICAgICAtLWFyZ3NbX3F1b3RpZW50RGlnaXRdOwogICAgICAgICAgICBhc3NlcnQocmVzdWx0RGlnaXRzW2ldIDw9IGFyZ3NbX3F1b3RpZW50SGlnaERpZ2l0XSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGkgLT0gZDA7CiAgICB9CiAgICAvLyBDYWNoZSByZXN1bHQuCiAgICBfbGFzdERpdmlkZW5kRGlnaXRzID0gX2RpZ2l0czsKICAgIF9sYXN0RGl2aWRlbmRVc2VkID0gX3VzZWQ7CiAgICBfbGFzdERpdmlzb3JEaWdpdHMgPSBvdGhlci5fZGlnaXRzOwogICAgX2xhc3REaXZpc29yVXNlZCA9IG90aGVyLl91c2VkOwogICAgX2xhc3RRdW9SZW1EaWdpdHMgPSByZXN1bHREaWdpdHM7CiAgICBfbGFzdFF1b1JlbVVzZWQgPSByZXN1bHRVc2VkOwogICAgX2xhc3RSZW1Vc2VkID0geVVzZWQ7CiAgICBfbGFzdFJlbV9uc2ggPSBuc2g7CiAgfQoKICAvLyBDdXN0b21pemVkIHZlcnNpb24gb2YgX3JlbSgpIG1pbmltaXppbmcgYWxsb2NhdGlvbnMgZm9yIHVzZSBpbiByZWR1Y3Rpb24uCiAgLy8gSW5wdXQ6CiAgLy8gICB4RGlnaXRzWzAuLnhVc2VkLTFdOiBwb3NpdGl2ZSBkaXZpZGVuZC4KICAvLyAgIHlEaWdpdHNbMC4ueVVzZWQtMV06IG5vcm1hbGl6ZWQgcG9zaXRpdmUgZGl2aXNvci4KICAvLyAgIG55RGlnaXRzWzAuLnlVc2VkLTFdOiBuZWdhdGVkIHlEaWdpdHMuCiAgLy8gICBuc2g6IG5vcm1hbGl6YXRpb24gc2hpZnQgYW1vdW50LgogIC8vICAgYXJnczogdG9wIHkgZGlnaXQocykgYW5kIHBsYWNlIGhvbGRlciBmb3IgZXN0aW1hdGVkIHF1b3RpZW50IGRpZ2l0KHMpLgogIC8vICAgdG1wRGlnaXRzOiB0ZW1wIGFycmF5IG9mIDIqeVVzZWQgZGlnaXRzLgogIC8vICAgcmVzdWx0RGlnaXRzOiByZXN1bHQgZGlnaXRzIGFycmF5IGxhcmdlIGVub3VnaCB0byB0ZW1wb3JhcmlseSBob2xkCiAgLy8gICAgICAgICAgICAgICAgIGNvbmNhdGVuYXRlZCBxdW90aWVudCBhbmQgbm9ybWFsaXplZCByZW1haW5kZXIuCiAgLy8gT3V0cHV0OgogIC8vICAgcmVzdWx0RGlnaXRzWzAuLnJlc3VsdFVzZWQtMV06IHBvc2l0aXZlIHJlbWFpbmRlci4KICAvLyBSZXR1cm5zIHJlc3VsdFVzZWQuCiAgc3RhdGljIGludCBfcmVtRGlnaXRzKAogICAgICBVaW50MzJMaXN0IHhEaWdpdHMsCiAgICAgIGludCB4VXNlZCwKICAgICAgVWludDMyTGlzdCB5RGlnaXRzLAogICAgICBpbnQgeVVzZWQsCiAgICAgIFVpbnQzMkxpc3QgbnlEaWdpdHMsCiAgICAgIGludCBuc2gsCiAgICAgIFVpbnQzMkxpc3QgYXJncywKICAgICAgVWludDMyTGlzdCB0bXBEaWdpdHMsCiAgICAgIFVpbnQzMkxpc3QgcmVzdWx0RGlnaXRzKSB7CiAgICAvLyBJbml0aWFsaXplIHJlc3VsdERpZ2l0cyB0byBub3JtYWxpemVkIHBvc2l0aXZlIGRpdmlkZW5kLgogICAgdmFyIHJlc3VsdFVzZWQgPSBfbFNoaWZ0RGlnaXRzKHhEaWdpdHMsIHhVc2VkLCBuc2gsIHJlc3VsdERpZ2l0cyk7CiAgICAvLyBGb3IgNjQtYml0IHByb2Nlc3NpbmcsIG1ha2Ugc3VyZSB5VXNlZCwgaSwgYW5kIGogYXJlIGV2ZW4uCiAgICBhc3NlcnQoeVVzZWQuaXNFdmVuKTsKICAgIHZhciBpID0gcmVzdWx0VXNlZCArIChyZXN1bHRVc2VkICYgMSk7CiAgICB2YXIgaiA9IGkgLSB5VXNlZDsKICAgIHZhciB0bXBVc2VkID0gX2RsU2hpZnREaWdpdHMoeURpZ2l0cywgeVVzZWQsIGosIHRtcERpZ2l0cyk7CiAgICAvLyBFeHBsaWNpdCBmaXJzdCBkaXZpc2lvbiBzdGVwIGluIGNhc2Ugbm9ybWFsaXplZCBkaXZpZGVuZCBpcyBsYXJnZXIgb3IKICAgIC8vIGVxdWFsIHRvIHNoaWZ0ZWQgbm9ybWFsaXplZCBkaXZpc29yLgogICAgaWYgKF9jb21wYXJlRGlnaXRzKHJlc3VsdERpZ2l0cywgcmVzdWx0VXNlZCwgdG1wRGlnaXRzLCB0bXBVc2VkKSA+PSAwKSB7CiAgICAgIGFzc2VydChpID09IHJlc3VsdFVzZWQpOwogICAgICByZXN1bHREaWdpdHNbcmVzdWx0VXNlZCsrXSA9IDE7IC8vIFF1b3RpZW50ID0gMS4KICAgICAgLy8gU3VidHJhY3QgZGl2aXNvciBmcm9tIHJlbWFpbmRlci4KICAgICAgX2Fic1N1YihyZXN1bHREaWdpdHMsIHJlc3VsdFVzZWQsIHRtcERpZ2l0cywgdG1wVXNlZCwgcmVzdWx0RGlnaXRzKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIEFjY291bnQgZm9yIHBvc3NpYmxlIGNhcnJ5IGluIF9tdWxBZGQgc3RlcC4KICAgICAgcmVzdWx0RGlnaXRzW3Jlc3VsdFVzZWQrK10gPSAwOwogICAgfQogICAgaWYgKHJlc3VsdFVzZWQuaXNPZGQpIHsKICAgICAgcmVzdWx0RGlnaXRzW3Jlc3VsdFVzZWRdID0gMDsgLy8gTGVhZGluZyB6ZXJvIGZvciA2NC1iaXQgcHJvY2Vzc2luZy4KICAgIH0KICAgIC8vIE5lZ2F0ZWQgeURpZ2l0cyBwYXNzZWQgaW4gbnlEaWdpdHMgYWxsb3cgdGhlIHVzZSBvZiBfbXVsQWRkIGluc3RlYWQgb2YKICAgIC8vIHVuaW1wbGVtZW50ZWQgX211bFN1Yi4KICAgIC8vIG55RGlnaXRzIGlzIHJlYWQtb25seSBhbmQgaGFzIHlVc2VkIGRpZ2l0cyAocG9zc2libHkgaW5jbHVkaW5nIHNldmVyYWwKICAgIC8vIGxlYWRpbmcgemVyb3MpIHBsdXMgYSBsZWFkaW5nIHplcm8gZm9yIDY0LWJpdCBwcm9jZXNzaW5nLgogICAgLy8gcmVzdWx0RGlnaXRzIGlzIG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uCiAgICAvLyByZXN1bHREaWdpdHNbMC4ueVVzZWQtMV0gaXMgdGhlIGN1cnJlbnQgcmVtYWluZGVyLgogICAgLy8gcmVzdWx0RGlnaXRzW3lVc2VkLi5yZXN1bHRVc2VkLTFdIGlzIHRoZSBjdXJyZW50IHF1b3RpZW50LgogICAgLS1pOwogICAgd2hpbGUgKGogPiAwKSB7CiAgICAgIHZhciBkMCA9IF9lc3RpbWF0ZVF1b3RpZW50RGlnaXQoYXJncywgcmVzdWx0RGlnaXRzLCBpKTsKICAgICAgaiAtPSBkMDsKICAgICAgdmFyIGQxID0KICAgICAgICAgIF9tdWxBZGQoYXJncywgX3F1b3RpZW50RGlnaXQsIG55RGlnaXRzLCAwLCByZXN1bHREaWdpdHMsIGosIHlVc2VkKTsKICAgICAgLy8gX2VzdGltYXRlUXVvdGllbnREaWdpdCBhbmQgX211bEFkZCBtdXN0IGFncmVlIG9uIHRoZSBudW1iZXIgb2YgZGlnaXRzCiAgICAgIC8vIHRvIHByb2Nlc3MuCiAgICAgIGFzc2VydChkMCA9PSBkMSk7CiAgICAgIGlmIChkMCA9PSAxKSB7CiAgICAgICAgaWYgKHJlc3VsdERpZ2l0c1tpXSA8IGFyZ3NbX3F1b3RpZW50RGlnaXRdKSB7CiAgICAgICAgICB2YXIgdG1wVXNlZCA9IF9kbFNoaWZ0RGlnaXRzKG55RGlnaXRzLCB5VXNlZCwgaiwgdG1wRGlnaXRzKTsKICAgICAgICAgIF9hYnNTdWIocmVzdWx0RGlnaXRzLCByZXN1bHRVc2VkLCB0bXBEaWdpdHMsIHRtcFVzZWQsIHJlc3VsdERpZ2l0cyk7CiAgICAgICAgICB3aGlsZSAocmVzdWx0RGlnaXRzW2ldIDwgLS1hcmdzW19xdW90aWVudERpZ2l0XSkgewogICAgICAgICAgICBfYWJzU3ViKHJlc3VsdERpZ2l0cywgcmVzdWx0VXNlZCwgdG1wRGlnaXRzLCB0bXBVc2VkLCByZXN1bHREaWdpdHMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQoZDAgPT0gMik7CiAgICAgICAgYXNzZXJ0KHJlc3VsdERpZ2l0c1tpXSA8PSBhcmdzW19xdW90aWVudEhpZ2hEaWdpdF0pOwogICAgICAgIGlmICgocmVzdWx0RGlnaXRzW2ldIDwgYXJnc1tfcXVvdGllbnRIaWdoRGlnaXRdKSB8fAogICAgICAgICAgICAocmVzdWx0RGlnaXRzW2kgLSAxXSA8IGFyZ3NbX3F1b3RpZW50RGlnaXRdKSkgewogICAgICAgICAgdmFyIHRtcFVzZWQgPSBfZGxTaGlmdERpZ2l0cyhueURpZ2l0cywgeVVzZWQsIGosIHRtcERpZ2l0cyk7CiAgICAgICAgICBfYWJzU3ViKHJlc3VsdERpZ2l0cywgcmVzdWx0VXNlZCwgdG1wRGlnaXRzLCB0bXBVc2VkLCByZXN1bHREaWdpdHMpOwogICAgICAgICAgaWYgKGFyZ3NbX3F1b3RpZW50RGlnaXRdID09IDApIHsKICAgICAgICAgICAgLS1hcmdzW19xdW90aWVudEhpZ2hEaWdpdF07CiAgICAgICAgICB9CiAgICAgICAgICAtLWFyZ3NbX3F1b3RpZW50RGlnaXRdOwogICAgICAgICAgYXNzZXJ0KHJlc3VsdERpZ2l0c1tpXSA8PSBhcmdzW19xdW90aWVudEhpZ2hEaWdpdF0pOwogICAgICAgICAgd2hpbGUgKChyZXN1bHREaWdpdHNbaV0gPCBhcmdzW19xdW90aWVudEhpZ2hEaWdpdF0pIHx8CiAgICAgICAgICAgICAgKHJlc3VsdERpZ2l0c1tpIC0gMV0gPCBhcmdzW19xdW90aWVudERpZ2l0XSkpIHsKICAgICAgICAgICAgX2Fic1N1YihyZXN1bHREaWdpdHMsIHJlc3VsdFVzZWQsIHRtcERpZ2l0cywgdG1wVXNlZCwgcmVzdWx0RGlnaXRzKTsKICAgICAgICAgICAgaWYgKGFyZ3NbX3F1b3RpZW50RGlnaXRdID09IDApIHsKICAgICAgICAgICAgICAtLWFyZ3NbX3F1b3RpZW50SGlnaERpZ2l0XTsKICAgICAgICAgICAgfQogICAgICAgICAgICAtLWFyZ3NbX3F1b3RpZW50RGlnaXRdOwogICAgICAgICAgICBhc3NlcnQocmVzdWx0RGlnaXRzW2ldIDw9IGFyZ3NbX3F1b3RpZW50SGlnaERpZ2l0XSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGkgLT0gZDA7CiAgICB9CiAgICAvLyBSZXR1cm4gcmVtYWluZGVyLCBpLmUuIGRlbm9ybWFsaXplZCByZXN1bHREaWdpdHNbMC4ueVVzZWQtMV0uCiAgICByZXN1bHRVc2VkID0geVVzZWQ7CiAgICBpZiAobnNoID4gMCkgewogICAgICAvLyBEZW5vcm1hbGl6ZSByZW1haW5kZXIuCiAgICAgIHJlc3VsdFVzZWQgPSBfclNoaWZ0RGlnaXRzKHJlc3VsdERpZ2l0cywgcmVzdWx0VXNlZCwgbnNoLCByZXN1bHREaWdpdHMpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdFVzZWQ7CiAgfQoKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIC8vIFRoaXMgaXMgdGhlIFtKZW5raW5zIGhhc2ggZnVuY3Rpb25dWzFdIGJ1dCB1c2luZyBtYXNraW5nIHRvIGtlZXAKICAgIC8vIHZhbHVlcyBpbiBTTUkgcmFuZ2UuCiAgICAvLwogICAgLy8gWzFdOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0plbmtpbnNfaGFzaF9mdW5jdGlvbgoKICAgIGludCBjb21iaW5lKGludCBoYXNoLCBpbnQgdmFsdWUpIHsKICAgICAgaGFzaCA9IDB4MWZmZmZmZmYgJiAoaGFzaCArIHZhbHVlKTsKICAgICAgaGFzaCA9IDB4MWZmZmZmZmYgJiAoaGFzaCArICgoMHgwMDA3ZmZmZiAmIGhhc2gpIDw8IDEwKSk7CiAgICAgIHJldHVybiBoYXNoIF4gKGhhc2ggPj4gNik7CiAgICB9CgogICAgaW50IGZpbmlzaChpbnQgaGFzaCkgewogICAgICBoYXNoID0gMHgxZmZmZmZmZiAmIChoYXNoICsgKCgweDAzZmZmZmZmICYgaGFzaCkgPDwgMykpOwogICAgICBoYXNoID0gaGFzaCBeIChoYXNoID4+IDExKTsKICAgICAgcmV0dXJuIDB4MWZmZmZmZmYgJiAoaGFzaCArICgoMHgwMDAwM2ZmZiAmIGhhc2gpIDw8IDE1KSk7CiAgICB9CgogICAgaWYgKF9pc1plcm8pIHJldHVybiA2NzA3OyAvLyBKdXN0IGEgcmFuZG9tIG51bWJlci4KICAgIHZhciBoYXNoID0gX2lzTmVnYXRpdmUgPyA4MzU4NSA6IDQyOTY4OTsgLy8gQWxzbyByYW5kb20uCiAgICBmb3IgKGludCBpID0gMDsgaSA8IF91c2VkOyBpKyspIHsKICAgICAgaGFzaCA9IGNvbWJpbmUoaGFzaCwgX2RpZ2l0c1tpXSk7CiAgICB9CiAgICByZXR1cm4gZmluaXNoKGhhc2gpOwogIH0KCiAgLyoqCiAgICogVGVzdCB3aGV0aGVyIHRoaXMgdmFsdWUgaXMgbnVtZXJpY2FsbHkgZXF1YWwgdG8gYG90aGVyYC4KICAgKgogICAqIElmIFtvdGhlcl0gaXMgYSBbX0JpZ0ludEltcGxdIHJldHVybnMgd2hldGhlciB0aGUgdHdvIG9wZXJhbmRzIGhhdmUgdGhlCiAgICogc2FtZSB2YWx1ZS4KICAgKgogICAqIFJldHVybnMgZmFsc2UgaWYgYG90aGVyYCBpcyBub3QgYSBbX0JpZ0ludEltcGxdLgogICAqLwogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSA9PgogICAgICBvdGhlciBpcyBfQmlnSW50SW1wbCAmJiBjb21wYXJlVG8ob3RoZXIpID09IDA7CgogIC8qKgogICAqIFJldHVybnMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgdG8gc3RvcmUgdGhpcyBiaWcgaW50ZWdlci4KICAgKgogICAqIFRoZSBudW1iZXIgb2YgYml0cyBleGNsdWRlcyB0aGUgc2lnbiBiaXQsIHdoaWNoIGdpdmVzIHRoZSBuYXR1cmFsIGxlbmd0aAogICAqIGZvciBub24tbmVnYXRpdmUgKHVuc2lnbmVkKSB2YWx1ZXMuICBOZWdhdGl2ZSB2YWx1ZXMgYXJlIGNvbXBsZW1lbnRlZCB0bwogICAqIHJldHVybiB0aGUgYml0IHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBiaXQgdGhhdCBkaWZmZXJzIGZyb20gdGhlIHNpZ24gYml0LgogICAqCiAgICogVG8gZmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIHN0b3JlIHRoZSB2YWx1ZSBhcyBhIHNpZ25lZCB2YWx1ZSwKICAgKiBhZGQgb25lLCBpLmUuIHVzZSBgeC5iaXRMZW5ndGggKyAxYC4KICAgKgogICAqIGBgYAogICAqIHguYml0TGVuZ3RoID09ICgteC0xKS5iaXRMZW5ndGgKICAgKgogICAqIG5ldyBCaWdJbnQuZnJvbSgzKS5iaXRMZW5ndGggPT0gMjsgICAvLyAwMDAwMDAxMQogICAqIG5ldyBCaWdJbnQuZnJvbSgyKS5iaXRMZW5ndGggPT0gMjsgICAvLyAwMDAwMDAxMAogICAqIG5ldyBCaWdJbnQuZnJvbSgxKS5iaXRMZW5ndGggPT0gMTsgICAvLyAwMDAwMDAwMQogICAqIG5ldyBCaWdJbnQuZnJvbSgwKS5iaXRMZW5ndGggPT0gMDsgICAvLyAwMDAwMDAwMAogICAqIG5ldyBCaWdJbnQuZnJvbSgtMSkuYml0TGVuZ3RoID09IDA7ICAvLyAxMTExMTExMQogICAqIG5ldyBCaWdJbnQuZnJvbSgtMikuYml0TGVuZ3RoID09IDE7ICAvLyAxMTExMTExMAogICAqIG5ldyBCaWdJbnQuZnJvbSgtMykuYml0TGVuZ3RoID09IDI7ICAvLyAxMTExMTEwMQogICAqIG5ldyBCaWdJbnQuZnJvbSgtNCkuYml0TGVuZ3RoID09IDI7ICAvLyAxMTExMTEwMAogICAqIGBgYAogICAqLwogIGludCBnZXQgYml0TGVuZ3RoIHsKICAgIGlmIChfdXNlZCA9PSAwKSByZXR1cm4gMDsKICAgIGlmIChfaXNOZWdhdGl2ZSkgcmV0dXJuICh+dGhpcykuYml0TGVuZ3RoOwogICAgcmV0dXJuIF9kaWdpdEJpdHMgKiAoX3VzZWQgLSAxKSArIF9kaWdpdHNbX3VzZWQgLSAxXS5iaXRMZW5ndGg7CiAgfQoKICAvKioKICAgKiBUcnVuY2F0aW5nIGRpdmlzaW9uIG9wZXJhdG9yLgogICAqCiAgICogUGVyZm9ybXMgYSB0cnVuY2F0aW5nIGludGVnZXIgZGl2aXNpb24sIHdoZXJlIHRoZSByZW1haW5kZXIgaXMgZGlzY2FyZGVkLgogICAqCiAgICogVGhlIHJlbWFpbmRlciBjYW4gYmUgY29tcHV0ZWQgdXNpbmcgdGhlIFtyZW1haW5kZXJdIG1ldGhvZC4KICAgKgogICAqIEV4YW1wbGVzOgogICAqIGBgYAogICAqIHZhciBzZXZlbiA9IG5ldyBCaWdJbnQuZnJvbSg3KTsKICAgKiB2YXIgdGhyZWUgPSBuZXcgQmlnSW50LmZyb20oMyk7CiAgICogc2V2ZW4gfi8gdGhyZWU7ICAgIC8vID0+IDIKICAgKiAoLXNldmVuKSB+LyB0aHJlZTsgLy8gPT4gLTIKICAgKiBzZXZlbiB+LyAtdGhyZWU7ICAgLy8gPT4gLTIKICAgKiBzZXZlbi5yZW1haW5kZXIodGhyZWUpOyAgICAvLyA9PiAxCiAgICogKC1zZXZlbikucmVtYWluZGVyKHRocmVlKTsgLy8gPT4gLTEKICAgKiBzZXZlbi5yZW1haW5kZXIoLXRocmVlKTsgICAvLyA9PiAxCiAgICogYGBgCiAgICovCiAgX0JpZ0ludEltcGwgb3BlcmF0b3Igfi8oQmlnSW50IGJpZ0ludCkgewogICAgX0JpZ0ludEltcGwgb3RoZXIgPSBiaWdJbnQ7CiAgICBpZiAob3RoZXIuX3VzZWQgPT0gMCkgewogICAgICB0aHJvdyBjb25zdCBJbnRlZ2VyRGl2aXNpb25CeVplcm9FeGNlcHRpb24oKTsKICAgIH0KICAgIHJldHVybiBfZGl2KG90aGVyKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIHJlbWFpbmRlciBvZiB0aGUgdHJ1bmNhdGluZyBkaXZpc2lvbiBvZiBgdGhpc2AgYnkgW290aGVyXS4KICAgKgogICAqIFRoZSByZXN1bHQgYHJgIG9mIHRoaXMgb3BlcmF0aW9uIHNhdGlzZmllczoKICAgKiBgdGhpcyA9PSAodGhpcyB+LyBvdGhlcikgKiBvdGhlciArIHJgLgogICAqIEFzIGEgY29uc2VxdWVuY2UgdGhlIHJlbWFpbmRlciBgcmAgaGFzIHRoZSBzYW1lIHNpZ24gYXMgdGhlIGRpdmlkZXIgYHRoaXNgLgogICAqLwogIF9CaWdJbnRJbXBsIHJlbWFpbmRlcihCaWdJbnQgYmlnSW50KSB7CiAgICBfQmlnSW50SW1wbCBvdGhlciA9IGJpZ0ludDsKICAgIGlmIChvdGhlci5fdXNlZCA9PSAwKSB7CiAgICAgIHRocm93IGNvbnN0IEludGVnZXJEaXZpc2lvbkJ5WmVyb0V4Y2VwdGlvbigpOwogICAgfQogICAgcmV0dXJuIF9yZW0ob3RoZXIpOwogIH0KCiAgLy8vIERpdmlzaW9uIG9wZXJhdG9yLgogIGRvdWJsZSBvcGVyYXRvciAvKEJpZ0ludCBvdGhlcikgPT4gdGhpcy50b0RvdWJsZSgpIC8gb3RoZXIudG9Eb3VibGUoKTsKCiAgLyoqIFJlbGF0aW9uYWwgbGVzcyB0aGFuIG9wZXJhdG9yLiAqLwogIGJvb2wgb3BlcmF0b3IgPChCaWdJbnQgb3RoZXIpID0+IGNvbXBhcmVUbyhvdGhlcikgPCAwOwoKICAvKiogUmVsYXRpb25hbCBsZXNzIHRoYW4gb3IgZXF1YWwgb3BlcmF0b3IuICovCiAgYm9vbCBvcGVyYXRvciA8PShCaWdJbnQgb3RoZXIpID0+IGNvbXBhcmVUbyhvdGhlcikgPD0gMDsKCiAgLyoqIFJlbGF0aW9uYWwgZ3JlYXRlciB0aGFuIG9wZXJhdG9yLiAqLwogIGJvb2wgb3BlcmF0b3IgPihCaWdJbnQgb3RoZXIpID0+IGNvbXBhcmVUbyhvdGhlcikgPiAwOwoKICAvKiogUmVsYXRpb25hbCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgb3BlcmF0b3IuICovCiAgYm9vbCBvcGVyYXRvciA+PShCaWdJbnQgb3RoZXIpID0+IGNvbXBhcmVUbyhvdGhlcikgPj0gMDsKCiAgLyoqCiAgICogRXVjbGlkZWFuIG1vZHVsbyBvcGVyYXRvci4KICAgKgogICAqIFJldHVybnMgdGhlIHJlbWFpbmRlciBvZiB0aGUgRXVjbGlkZWFuIGRpdmlzaW9uLiBUaGUgRXVjbGlkZWFuIGRpdmlzaW9uIG9mCiAgICogdHdvIGludGVnZXJzIGBhYCBhbmQgYGJgIHlpZWxkcyB0d28gaW50ZWdlcnMgYHFgIGFuZCBgcmAgc3VjaCB0aGF0CiAgICogYGEgPT0gYiAqIHEgKyByYCBhbmQgYDAgPD0gciA8IGIuYWJzKClgLgogICAqCiAgICogVGhlIHNpZ24gb2YgdGhlIHJldHVybmVkIHZhbHVlIGByYCBpcyBhbHdheXMgcG9zaXRpdmUuCiAgICoKICAgKiBTZWUgW3JlbWFpbmRlcl0gZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHRydW5jYXRpbmcgZGl2aXNpb24uCiAgICovCiAgX0JpZ0ludEltcGwgb3BlcmF0b3IgJShCaWdJbnQgYmlnSW50KSB7CiAgICBfQmlnSW50SW1wbCBvdGhlciA9IGJpZ0ludDsKICAgIGlmIChvdGhlci5fdXNlZCA9PSAwKSB7CiAgICAgIHRocm93IGNvbnN0IEludGVnZXJEaXZpc2lvbkJ5WmVyb0V4Y2VwdGlvbigpOwogICAgfQogICAgdmFyIHJlc3VsdCA9IF9yZW0ob3RoZXIpOwogICAgaWYgKHJlc3VsdC5faXNOZWdhdGl2ZSkgewogICAgICBpZiAob3RoZXIuX2lzTmVnYXRpdmUpIHsKICAgICAgICByZXN1bHQgPSByZXN1bHQgLSBvdGhlcjsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBvdGhlcjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIHNpZ24gb2YgdGhpcyBiaWcgaW50ZWdlci4KICAgKgogICAqIFJldHVybnMgMCBmb3IgemVybywgLTEgZm9yIHZhbHVlcyBsZXNzIHRoYW4gemVybyBhbmQKICAgKiArMSBmb3IgdmFsdWVzIGdyZWF0ZXIgdGhhbiB6ZXJvLgogICAqLwogIGludCBnZXQgc2lnbiB7CiAgICBpZiAoX3VzZWQgPT0gMCkgcmV0dXJuIDA7CiAgICByZXR1cm4gX2lzTmVnYXRpdmUgPyAtMSA6IDE7CiAgfQoKICAvLy8gV2hldGhlciB0aGlzIGJpZyBpbnRlZ2VyIGlzIGV2ZW4uCiAgYm9vbCBnZXQgaXNFdmVuID0+IF91c2VkID09IDAgfHwgKF9kaWdpdHNbMF0gJiAxKSA9PSAwOwoKICAvLy8gV2hldGhlciB0aGlzIGJpZyBpbnRlZ2VyIGlzIG9kZC4KICBib29sIGdldCBpc09kZCA9PiAhaXNFdmVuOwoKICAvLy8gV2hldGhlciB0aGlzIG51bWJlciBpcyBuZWdhdGl2ZS4KICBib29sIGdldCBpc05lZ2F0aXZlID0+IF9pc05lZ2F0aXZlOwoKICBfQmlnSW50SW1wbCBwb3coaW50IGV4cG9uZW50KSB7CiAgICBpZiAoZXhwb25lbnQgPCAwKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJFeHBvbmVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZTogJGV4cG9uZW50Iik7CiAgICB9CiAgICBpZiAoZXhwb25lbnQgPT0gMCkgcmV0dXJuIG9uZTsKCiAgICAvLyBFeHBvbmVudGlhdGlvbiBieSBzcXVhcmluZy4KICAgIHZhciByZXN1bHQgPSBvbmU7CiAgICB2YXIgYmFzZSA9IHRoaXM7CiAgICB3aGlsZSAoZXhwb25lbnQgIT0gMCkgewogICAgICBpZiAoKGV4cG9uZW50ICYgMSkgPT0gMSkgewogICAgICAgIHJlc3VsdCAqPSBiYXNlOwogICAgICB9CiAgICAgIGV4cG9uZW50ID4+PSAxOwogICAgICAvLyBTa2lwIHVubmVjZXNzYXJ5IG9wZXJhdGlvbi4KICAgICAgaWYgKGV4cG9uZW50ICE9IDApIHsKICAgICAgICBiYXNlICo9IGJhc2U7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoaXMgaW50ZWdlciB0byB0aGUgcG93ZXIgb2YgW2V4cG9uZW50XSBtb2R1bG8gW21vZHVsdXNdLgogICAqCiAgICogVGhlIFtleHBvbmVudF0gbXVzdCBiZSBub24tbmVnYXRpdmUgYW5kIFttb2R1bHVzXSBtdXN0IGJlCiAgICogcG9zaXRpdmUuCiAgICovCiAgX0JpZ0ludEltcGwgbW9kUG93KEJpZ0ludCBiaWdFeHBvbmVudCwgQmlnSW50IGJpZ01vZHVsdXMpIHsKICAgIF9CaWdJbnRJbXBsIGV4cG9uZW50ID0gYmlnRXhwb25lbnQ7CiAgICBfQmlnSW50SW1wbCBtb2R1bHVzID0gYmlnTW9kdWx1czsKICAgIGlmIChleHBvbmVudC5faXNOZWdhdGl2ZSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiZXhwb25lbnQgbXVzdCBiZSBwb3NpdGl2ZTogJGV4cG9uZW50Iik7CiAgICB9CiAgICBpZiAobW9kdWx1cyA8PSB6ZXJvKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJtb2R1bHVzIG11c3QgYmUgc3RyaWN0bHkgcG9zaXRpdmU6ICRtb2R1bHVzIik7CiAgICB9CiAgICBpZiAoZXhwb25lbnQuX2lzWmVybykgcmV0dXJuIG9uZTsKCiAgICBmaW5hbCBleHBvbmVudEJpdGxlbiA9IGV4cG9uZW50LmJpdExlbmd0aDsKICAgIGlmIChleHBvbmVudEJpdGxlbiA8PSAwKSByZXR1cm4gb25lOwogICAgZmluYWwgYm9vbCBjYW5ub3RVc2VNb250Z29tZXJ5ID0gbW9kdWx1cy5pc0V2ZW4gfHwgYWJzKCkgPj0gbW9kdWx1czsKICAgIGlmIChjYW5ub3RVc2VNb250Z29tZXJ5IHx8IGV4cG9uZW50Qml0bGVuIDwgNjQpIHsKICAgICAgX0JpZ0ludFJlZHVjdGlvbiB6ID0gKGNhbm5vdFVzZU1vbnRnb21lcnkgfHwgZXhwb25lbnRCaXRsZW4gPCA4KQogICAgICAgICAgPyBuZXcgX0JpZ0ludENsYXNzaWNSZWR1Y3Rpb24obW9kdWx1cykKICAgICAgICAgIDogbmV3IF9CaWdJbnRNb250Z29tZXJ5UmVkdWN0aW9uKG1vZHVsdXMpOwogICAgICB2YXIgcmVzdWx0RGlnaXRzID0gX25ld0RpZ2l0cygyICogei5fbm9ybU1vZHVsdXNVc2VkICsgMik7CiAgICAgIHZhciByZXN1bHQyRGlnaXRzID0gX25ld0RpZ2l0cygyICogei5fbm9ybU1vZHVsdXNVc2VkICsgMik7CiAgICAgIHZhciBnRGlnaXRzID0gX25ld0RpZ2l0cyh6Ll9ub3JtTW9kdWx1c1VzZWQpOwogICAgICB2YXIgZ1VzZWQgPSB6Ll9jb252ZXJ0KHRoaXMsIGdEaWdpdHMpOwogICAgICAvLyBJbml0aWFsaXplIHJlc3VsdCB3aXRoIGcuCiAgICAgIC8vIENvcHkgbGVhZGluZyB6ZXJvIGlmIGFueS4KICAgICAgZm9yIChpbnQgaiA9IGdVc2VkICsgKGdVc2VkICYgMSkgLSAxOyBqID49IDA7IGotLSkgewogICAgICAgIHJlc3VsdERpZ2l0c1tqXSA9IGdEaWdpdHNbal07CiAgICAgIH0KICAgICAgdmFyIHJlc3VsdFVzZWQgPSBnVXNlZDsKICAgICAgdmFyIHJlc3VsdDJVc2VkOwogICAgICBmb3IgKGludCBpID0gZXhwb25lbnRCaXRsZW4gLSAyOyBpID49IDA7IGktLSkgewogICAgICAgIHJlc3VsdDJVc2VkID0gei5fc3FyKHJlc3VsdERpZ2l0cywgcmVzdWx0VXNlZCwgcmVzdWx0MkRpZ2l0cyk7CiAgICAgICAgaWYgKGV4cG9uZW50Ll9kaWdpdHNbaSB+LyBfZGlnaXRCaXRzXSAmICgxIDw8IChpICUgX2RpZ2l0Qml0cykpICE9IDApIHsKICAgICAgICAgIHJlc3VsdFVzZWQgPQogICAgICAgICAgICAgIHouX211bChyZXN1bHQyRGlnaXRzLCByZXN1bHQyVXNlZCwgZ0RpZ2l0cywgZ1VzZWQsIHJlc3VsdERpZ2l0cyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFN3YXAgcmVzdWx0IGFuZCByZXN1bHQyLgogICAgICAgICAgdmFyIHRtcERpZ2l0cyA9IHJlc3VsdERpZ2l0czsKICAgICAgICAgIHZhciB0bXBVc2VkID0gcmVzdWx0VXNlZDsKICAgICAgICAgIHJlc3VsdERpZ2l0cyA9IHJlc3VsdDJEaWdpdHM7CiAgICAgICAgICByZXN1bHRVc2VkID0gcmVzdWx0MlVzZWQ7CiAgICAgICAgICByZXN1bHQyRGlnaXRzID0gdG1wRGlnaXRzOwogICAgICAgICAgcmVzdWx0MlVzZWQgPSB0bXBVc2VkOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gei5fcmV2ZXJ0KHJlc3VsdERpZ2l0cywgcmVzdWx0VXNlZCk7CiAgICB9CiAgICB2YXIgazsKICAgIGlmIChleHBvbmVudEJpdGxlbiA8IDE4KQogICAgICBrID0gMTsKICAgIGVsc2UgaWYgKGV4cG9uZW50Qml0bGVuIDwgNDgpCiAgICAgIGsgPSAzOwogICAgZWxzZSBpZiAoZXhwb25lbnRCaXRsZW4gPCAxNDQpCiAgICAgIGsgPSA0OwogICAgZWxzZSBpZiAoZXhwb25lbnRCaXRsZW4gPCA3NjgpCiAgICAgIGsgPSA1OwogICAgZWxzZQogICAgICBrID0gNjsKICAgIF9CaWdJbnRSZWR1Y3Rpb24geiA9IG5ldyBfQmlnSW50TW9udGdvbWVyeVJlZHVjdGlvbihtb2R1bHVzKTsKICAgIHZhciBuID0gMzsKICAgIGZpbmFsIGsxID0gayAtIDE7CiAgICBmaW5hbCBrbSA9ICgxIDw8IGspIC0gMTsKICAgIExpc3QgZ0RpZ2l0cyA9IG5ldyBMaXN0KGttICsgMSk7CiAgICBMaXN0IGdVc2VkID0gbmV3IExpc3Qoa20gKyAxKTsKICAgIGdEaWdpdHNbMV0gPSBfbmV3RGlnaXRzKHouX25vcm1Nb2R1bHVzVXNlZCk7CiAgICBnVXNlZFsxXSA9IHouX2NvbnZlcnQodGhpcywgZ0RpZ2l0c1sxXSk7CiAgICBpZiAoayA+IDEpIHsKICAgICAgdmFyIGcyRGlnaXRzID0gX25ld0RpZ2l0cygyICogei5fbm9ybU1vZHVsdXNVc2VkICsgMik7CiAgICAgIHZhciBnMlVzZWQgPSB6Ll9zcXIoZ0RpZ2l0c1sxXSwgZ1VzZWRbMV0sIGcyRGlnaXRzKTsKICAgICAgd2hpbGUgKG4gPD0ga20pIHsKICAgICAgICBnRGlnaXRzW25dID0gX25ld0RpZ2l0cygyICogei5fbm9ybU1vZHVsdXNVc2VkICsgMik7CiAgICAgICAgZ1VzZWRbbl0gPQogICAgICAgICAgICB6Ll9tdWwoZzJEaWdpdHMsIGcyVXNlZCwgZ0RpZ2l0c1tuIC0gMl0sIGdVc2VkW24gLSAyXSwgZ0RpZ2l0c1tuXSk7CiAgICAgICAgbiArPSAyOwogICAgICB9CiAgICB9CiAgICB2YXIgdzsKICAgIHZhciBpc09uZSA9IHRydWU7CiAgICB2YXIgcmVzdWx0RGlnaXRzID0gb25lLl9kaWdpdHM7CiAgICB2YXIgcmVzdWx0VXNlZCA9IG9uZS5fdXNlZDsKICAgIHZhciByZXN1bHQyRGlnaXRzID0gX25ld0RpZ2l0cygyICogei5fbm9ybU1vZHVsdXNVc2VkICsgMik7CiAgICB2YXIgcmVzdWx0MlVzZWQ7CiAgICB2YXIgZXhwb25lbnREaWdpdHMgPSBleHBvbmVudC5fZGlnaXRzOwogICAgdmFyIGogPSBleHBvbmVudC5fdXNlZCAtIDE7CiAgICB2YXIgaSA9IGV4cG9uZW50RGlnaXRzW2pdLmJpdExlbmd0aCAtIDE7CiAgICB3aGlsZSAoaiA+PSAwKSB7CiAgICAgIGlmIChpID49IGsxKSB7CiAgICAgICAgdyA9IChleHBvbmVudERpZ2l0c1tqXSA+PiAoaSAtIGsxKSkgJiBrbTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3ID0gKGV4cG9uZW50RGlnaXRzW2pdICYgKCgxIDw8IChpICsgMSkpIC0gMSkpIDw8IChrMSAtIGkpOwogICAgICAgIGlmIChqID4gMCkgewogICAgICAgICAgdyB8PSBleHBvbmVudERpZ2l0c1tqIC0gMV0gPj4gKF9kaWdpdEJpdHMgKyBpIC0gazEpOwogICAgICAgIH0KICAgICAgfQogICAgICBuID0gazsKICAgICAgd2hpbGUgKCh3ICYgMSkgPT0gMCkgewogICAgICAgIHcgPj49IDE7CiAgICAgICAgLS1uOwogICAgICB9CiAgICAgIGlmICgoaSAtPSBuKSA8IDApIHsKICAgICAgICBpICs9IF9kaWdpdEJpdHM7CiAgICAgICAgLS1qOwogICAgICB9CiAgICAgIGlmIChpc09uZSkgewogICAgICAgIC8vIHIgPT0gMSwgZG9uJ3QgYm90aGVyIHNxdWFyaW5nIG9yIG11bHRpcGx5aW5nIGl0LgogICAgICAgIHJlc3VsdERpZ2l0cyA9IF9uZXdEaWdpdHMoMiAqIHouX25vcm1Nb2R1bHVzVXNlZCArIDIpOwogICAgICAgIHJlc3VsdFVzZWQgPSBnVXNlZFt3XTsKICAgICAgICB2YXIgZ3dEaWdpdHMgPSBnRGlnaXRzW3ddOwogICAgICAgIHZhciByaSA9IHJlc3VsdFVzZWQgKyAocmVzdWx0VXNlZCAmIDEpOyAvLyBDb3B5IGxlYWRpbmcgemVybyBpZiBhbnkuCiAgICAgICAgd2hpbGUgKC0tcmkgPj0gMCkgewogICAgICAgICAgcmVzdWx0RGlnaXRzW3JpXSA9IGd3RGlnaXRzW3JpXTsKICAgICAgICB9CiAgICAgICAgaXNPbmUgPSBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3aGlsZSAobiA+IDEpIHsKICAgICAgICAgIHJlc3VsdDJVc2VkID0gei5fc3FyKHJlc3VsdERpZ2l0cywgcmVzdWx0VXNlZCwgcmVzdWx0MkRpZ2l0cyk7CiAgICAgICAgICByZXN1bHRVc2VkID0gei5fc3FyKHJlc3VsdDJEaWdpdHMsIHJlc3VsdDJVc2VkLCByZXN1bHREaWdpdHMpOwogICAgICAgICAgbiAtPSAyOwogICAgICAgIH0KICAgICAgICBpZiAobiA+IDApIHsKICAgICAgICAgIHJlc3VsdDJVc2VkID0gei5fc3FyKHJlc3VsdERpZ2l0cywgcmVzdWx0VXNlZCwgcmVzdWx0MkRpZ2l0cyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBzd2FwRGlnaXRzID0gcmVzdWx0RGlnaXRzOwogICAgICAgICAgdmFyIHN3YXBVc2VkID0gcmVzdWx0VXNlZDsKICAgICAgICAgIHJlc3VsdERpZ2l0cyA9IHJlc3VsdDJEaWdpdHM7CiAgICAgICAgICByZXN1bHRVc2VkID0gcmVzdWx0MlVzZWQ7CiAgICAgICAgICByZXN1bHQyRGlnaXRzID0gc3dhcERpZ2l0czsKICAgICAgICAgIHJlc3VsdDJVc2VkID0gc3dhcFVzZWQ7CiAgICAgICAgfQogICAgICAgIHJlc3VsdFVzZWQgPSB6Ll9tdWwoCiAgICAgICAgICAgIHJlc3VsdDJEaWdpdHMsIHJlc3VsdDJVc2VkLCBnRGlnaXRzW3ddLCBnVXNlZFt3XSwgcmVzdWx0RGlnaXRzKTsKICAgICAgfQogICAgICB3aGlsZSAoaiA+PSAwICYmIChleHBvbmVudERpZ2l0c1tqXSAmICgxIDw8IGkpKSA9PSAwKSB7CiAgICAgICAgcmVzdWx0MlVzZWQgPSB6Ll9zcXIocmVzdWx0RGlnaXRzLCByZXN1bHRVc2VkLCByZXN1bHQyRGlnaXRzKTsKICAgICAgICB2YXIgc3dhcERpZ2l0cyA9IHJlc3VsdERpZ2l0czsKICAgICAgICB2YXIgc3dhcFVzZWQgPSByZXN1bHRVc2VkOwogICAgICAgIHJlc3VsdERpZ2l0cyA9IHJlc3VsdDJEaWdpdHM7CiAgICAgICAgcmVzdWx0VXNlZCA9IHJlc3VsdDJVc2VkOwogICAgICAgIHJlc3VsdDJEaWdpdHMgPSBzd2FwRGlnaXRzOwogICAgICAgIHJlc3VsdDJVc2VkID0gc3dhcFVzZWQ7CiAgICAgICAgaWYgKC0taSA8IDApIHsKICAgICAgICAgIGkgPSBfZGlnaXRCaXRzIC0gMTsKICAgICAgICAgIC0tajsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGFzc2VydCghaXNPbmUpOwogICAgcmV0dXJuIHouX3JldmVydChyZXN1bHREaWdpdHMsIHJlc3VsdFVzZWQpOwogIH0KCiAgLy8gSWYgaW52IGlzIGZhbHNlLCByZXR1cm5zIGdjZCh4LCB5KS4KICAvLyBJZiBpbnYgaXMgdHJ1ZSBhbmQgZ2NkKHgsIHkpID0gMSwgcmV0dXJucyBkLCBzbyB0aGF0IGMqeCArIGQqeSA9IDEuCiAgLy8gSWYgaW52IGlzIHRydWUgYW5kIGdjZCh4LCB5KSAhPSAxLCB0aHJvd3MgRXhjZXB0aW9uKCJOb3QgY29wcmltZSIpLgogIHN0YXRpYyBfQmlnSW50SW1wbCBfYmluYXJ5R2NkKF9CaWdJbnRJbXBsIHgsIF9CaWdJbnRJbXBsIHksIGJvb2wgaW52KSB7CiAgICB2YXIgeERpZ2l0cyA9IHguX2RpZ2l0czsKICAgIHZhciB5RGlnaXRzID0geS5fZGlnaXRzOwogICAgdmFyIHhVc2VkID0geC5fdXNlZDsKICAgIHZhciB5VXNlZCA9IHkuX3VzZWQ7CiAgICB2YXIgbWF4VXNlZCA9IF9tYXgoeFVzZWQsIHlVc2VkKTsKICAgIGZpbmFsIG1heExlbiA9IG1heFVzZWQgKyAobWF4VXNlZCAmIDEpOwogICAgeERpZ2l0cyA9IF9jbG9uZURpZ2l0cyh4RGlnaXRzLCAwLCB4VXNlZCwgbWF4TGVuKTsKICAgIHlEaWdpdHMgPSBfY2xvbmVEaWdpdHMoeURpZ2l0cywgMCwgeVVzZWQsIG1heExlbik7CiAgICBpbnQgc2hpZnRBbW91bnQgPSAwOwogICAgaWYgKGludikgewogICAgICBpZiAoKHlVc2VkID09IDEpICYmICh5RGlnaXRzWzBdID09IDEpKSByZXR1cm4gb25lOwogICAgICBpZiAoKHlVc2VkID09IDApIHx8ICh5RGlnaXRzWzBdLmlzRXZlbiAmJiB4RGlnaXRzWzBdLmlzRXZlbikpIHsKICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJOb3QgY29wcmltZSIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAoeC5faXNaZXJvKSB7CiAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUoMCwgInRoaXMiLCAibXVzdCBub3QgYmUgemVybyIpOwogICAgICB9CiAgICAgIGlmICh5Ll9pc1plcm8pIHsKICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZSgwLCAib3RoZXIiLCAibXVzdCBub3QgYmUgemVybyIpOwogICAgICB9CiAgICAgIGlmICgoKHhVc2VkID09IDEpICYmICh4RGlnaXRzWzBdID09IDEpKSB8fAogICAgICAgICAgKCh5VXNlZCA9PSAxKSAmJiAoeURpZ2l0c1swXSA9PSAxKSkpIHJldHVybiBvbmU7CiAgICAgIHdoaWxlICgoKHhEaWdpdHNbMF0gJiAxKSA9PSAwKSAmJiAoKHlEaWdpdHNbMF0gJiAxKSA9PSAwKSkgewogICAgICAgIF9yc2goeERpZ2l0cywgeFVzZWQsIDEsIHhEaWdpdHMpOwogICAgICAgIF9yc2goeURpZ2l0cywgeVVzZWQsIDEsIHlEaWdpdHMpOwogICAgICAgIHNoaWZ0QW1vdW50Kys7CiAgICAgIH0KICAgICAgaWYgKHNoaWZ0QW1vdW50ID49IF9kaWdpdEJpdHMpIHsKICAgICAgICB2YXIgZGlnaXRTaGlmdEFtb3VudCA9IHNoaWZ0QW1vdW50IH4vIF9kaWdpdEJpdHM7CiAgICAgICAgeFVzZWQgLT0gZGlnaXRTaGlmdEFtb3VudDsKICAgICAgICB5VXNlZCAtPSBkaWdpdFNoaWZ0QW1vdW50OwogICAgICAgIG1heFVzZWQgLT0gZGlnaXRTaGlmdEFtb3VudDsKICAgICAgfQogICAgICBpZiAoKHlEaWdpdHNbMF0gJiAxKSA9PSAxKSB7CiAgICAgICAgLy8gU3dhcCB4IGFuZCB5LgogICAgICAgIHZhciB0bXBEaWdpdHMgPSB4RGlnaXRzOwogICAgICAgIHZhciB0bXBVc2VkID0geFVzZWQ7CiAgICAgICAgeERpZ2l0cyA9IHlEaWdpdHM7CiAgICAgICAgeFVzZWQgPSB5VXNlZDsKICAgICAgICB5RGlnaXRzID0gdG1wRGlnaXRzOwogICAgICAgIHlVc2VkID0gdG1wVXNlZDsKICAgICAgfQogICAgfQogICAgdmFyIHVEaWdpdHMgPSBfY2xvbmVEaWdpdHMoeERpZ2l0cywgMCwgeFVzZWQsIG1heExlbik7CiAgICB2YXIgdkRpZ2l0cyA9IF9jbG9uZURpZ2l0cyh5RGlnaXRzLCAwLCB5VXNlZCwgbWF4TGVuICsgMik7IC8vICsyIGZvciBsc2guCiAgICBmaW5hbCBib29sIGFjID0gKHhEaWdpdHNbMF0gJiAxKSA9PSAwOwoKICAgIC8vIFZhcmlhYmxlcyBhLCBiLCBjLCBhbmQgZCByZXF1aXJlIG9uZSBtb3JlIGRpZ2l0LgogICAgZmluYWwgYWJjZFVzZWQgPSBtYXhVc2VkICsgMTsKICAgIGZpbmFsIGFiY2RMZW4gPSBhYmNkVXNlZCArIChhYmNkVXNlZCAmIDEpICsgMjsgLy8gKzIgdG8gc2F0aXNmeSBfYWJzQWRkLgogICAgdmFyIGFEaWdpdHMsIGJEaWdpdHMsIGNEaWdpdHMsIGREaWdpdHM7CiAgICBib29sIGFJc05lZ2F0aXZlLCBiSXNOZWdhdGl2ZSwgY0lzTmVnYXRpdmUsIGRJc05lZ2F0aXZlOwogICAgaWYgKGFjKSB7CiAgICAgIGFEaWdpdHMgPSBfbmV3RGlnaXRzKGFiY2RMZW4pOwogICAgICBhSXNOZWdhdGl2ZSA9IGZhbHNlOwogICAgICBhRGlnaXRzWzBdID0gMTsKICAgICAgY0RpZ2l0cyA9IF9uZXdEaWdpdHMoYWJjZExlbik7CiAgICAgIGNJc05lZ2F0aXZlID0gZmFsc2U7CiAgICB9CiAgICBiRGlnaXRzID0gX25ld0RpZ2l0cyhhYmNkTGVuKTsKICAgIGJJc05lZ2F0aXZlID0gZmFsc2U7CiAgICBkRGlnaXRzID0gX25ld0RpZ2l0cyhhYmNkTGVuKTsKICAgIGRJc05lZ2F0aXZlID0gZmFsc2U7CiAgICBkRGlnaXRzWzBdID0gMTsKCiAgICB3aGlsZSAodHJ1ZSkgewogICAgICB3aGlsZSAoKHVEaWdpdHNbMF0gJiAxKSA9PSAwKSB7CiAgICAgICAgX3JzaCh1RGlnaXRzLCBtYXhVc2VkLCAxLCB1RGlnaXRzKTsKICAgICAgICBpZiAoYWMpIHsKICAgICAgICAgIGlmICgoKGFEaWdpdHNbMF0gJiAxKSA9PSAxKSB8fCAoKGJEaWdpdHNbMF0gJiAxKSA9PSAxKSkgewogICAgICAgICAgICBpZiAoYUlzTmVnYXRpdmUpIHsKICAgICAgICAgICAgICBpZiAoKGFEaWdpdHNbbWF4VXNlZF0gIT0gMCkgfHwKICAgICAgICAgICAgICAgICAgKF9jb21wYXJlRGlnaXRzKGFEaWdpdHMsIG1heFVzZWQsIHlEaWdpdHMsIG1heFVzZWQpKSA+IDApIHsKICAgICAgICAgICAgICAgIF9hYnNTdWIoYURpZ2l0cywgYWJjZFVzZWQsIHlEaWdpdHMsIG1heFVzZWQsIGFEaWdpdHMpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBfYWJzU3ViKHlEaWdpdHMsIG1heFVzZWQsIGFEaWdpdHMsIG1heFVzZWQsIGFEaWdpdHMpOwogICAgICAgICAgICAgICAgYUlzTmVnYXRpdmUgPSBmYWxzZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgX2Fic0FkZChhRGlnaXRzLCBhYmNkVXNlZCwgeURpZ2l0cywgbWF4VXNlZCwgYURpZ2l0cyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJJc05lZ2F0aXZlKSB7CiAgICAgICAgICAgICAgX2Fic0FkZChiRGlnaXRzLCBhYmNkVXNlZCwgeERpZ2l0cywgbWF4VXNlZCwgYkRpZ2l0cyk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGJEaWdpdHNbbWF4VXNlZF0gIT0gMCkgfHwKICAgICAgICAgICAgICAgIChfY29tcGFyZURpZ2l0cyhiRGlnaXRzLCBtYXhVc2VkLCB4RGlnaXRzLCBtYXhVc2VkKSA+IDApKSB7CiAgICAgICAgICAgICAgX2Fic1N1YihiRGlnaXRzLCBhYmNkVXNlZCwgeERpZ2l0cywgbWF4VXNlZCwgYkRpZ2l0cyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgX2Fic1N1Yih4RGlnaXRzLCBtYXhVc2VkLCBiRGlnaXRzLCBtYXhVc2VkLCBiRGlnaXRzKTsKICAgICAgICAgICAgICBiSXNOZWdhdGl2ZSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIF9yc2goYURpZ2l0cywgYWJjZFVzZWQsIDEsIGFEaWdpdHMpOwogICAgICAgIH0gZWxzZSBpZiAoKGJEaWdpdHNbMF0gJiAxKSA9PSAxKSB7CiAgICAgICAgICBpZiAoYklzTmVnYXRpdmUpIHsKICAgICAgICAgICAgX2Fic0FkZChiRGlnaXRzLCBhYmNkVXNlZCwgeERpZ2l0cywgbWF4VXNlZCwgYkRpZ2l0cyk7CiAgICAgICAgICB9IGVsc2UgaWYgKChiRGlnaXRzW21heFVzZWRdICE9IDApIHx8CiAgICAgICAgICAgICAgKF9jb21wYXJlRGlnaXRzKGJEaWdpdHMsIG1heFVzZWQsIHhEaWdpdHMsIG1heFVzZWQpID4gMCkpIHsKICAgICAgICAgICAgX2Fic1N1YihiRGlnaXRzLCBhYmNkVXNlZCwgeERpZ2l0cywgbWF4VXNlZCwgYkRpZ2l0cyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfYWJzU3ViKHhEaWdpdHMsIG1heFVzZWQsIGJEaWdpdHMsIG1heFVzZWQsIGJEaWdpdHMpOwogICAgICAgICAgICBiSXNOZWdhdGl2ZSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9yc2goYkRpZ2l0cywgYWJjZFVzZWQsIDEsIGJEaWdpdHMpOwogICAgICB9CiAgICAgIHdoaWxlICgodkRpZ2l0c1swXSAmIDEpID09IDApIHsKICAgICAgICBfcnNoKHZEaWdpdHMsIG1heFVzZWQsIDEsIHZEaWdpdHMpOwogICAgICAgIGlmIChhYykgewogICAgICAgICAgaWYgKCgoY0RpZ2l0c1swXSAmIDEpID09IDEpIHx8ICgoZERpZ2l0c1swXSAmIDEpID09IDEpKSB7CiAgICAgICAgICAgIGlmIChjSXNOZWdhdGl2ZSkgewogICAgICAgICAgICAgIGlmICgoY0RpZ2l0c1ttYXhVc2VkXSAhPSAwKSB8fAogICAgICAgICAgICAgICAgICAoX2NvbXBhcmVEaWdpdHMoY0RpZ2l0cywgbWF4VXNlZCwgeURpZ2l0cywgbWF4VXNlZCkgPiAwKSkgewogICAgICAgICAgICAgICAgX2Fic1N1YihjRGlnaXRzLCBhYmNkVXNlZCwgeURpZ2l0cywgbWF4VXNlZCwgY0RpZ2l0cyk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIF9hYnNTdWIoeURpZ2l0cywgbWF4VXNlZCwgY0RpZ2l0cywgbWF4VXNlZCwgY0RpZ2l0cyk7CiAgICAgICAgICAgICAgICBjSXNOZWdhdGl2ZSA9IGZhbHNlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBfYWJzQWRkKGNEaWdpdHMsIGFiY2RVc2VkLCB5RGlnaXRzLCBtYXhVc2VkLCBjRGlnaXRzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZElzTmVnYXRpdmUpIHsKICAgICAgICAgICAgICBfYWJzQWRkKGREaWdpdHMsIGFiY2RVc2VkLCB4RGlnaXRzLCBtYXhVc2VkLCBkRGlnaXRzKTsKICAgICAgICAgICAgfSBlbHNlIGlmICgoZERpZ2l0c1ttYXhVc2VkXSAhPSAwKSB8fAogICAgICAgICAgICAgICAgKF9jb21wYXJlRGlnaXRzKGREaWdpdHMsIG1heFVzZWQsIHhEaWdpdHMsIG1heFVzZWQpID4gMCkpIHsKICAgICAgICAgICAgICBfYWJzU3ViKGREaWdpdHMsIGFiY2RVc2VkLCB4RGlnaXRzLCBtYXhVc2VkLCBkRGlnaXRzKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBfYWJzU3ViKHhEaWdpdHMsIG1heFVzZWQsIGREaWdpdHMsIG1heFVzZWQsIGREaWdpdHMpOwogICAgICAgICAgICAgIGRJc05lZ2F0aXZlID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgX3JzaChjRGlnaXRzLCBhYmNkVXNlZCwgMSwgY0RpZ2l0cyk7CiAgICAgICAgfSBlbHNlIGlmICgoZERpZ2l0c1swXSAmIDEpID09IDEpIHsKICAgICAgICAgIGlmIChkSXNOZWdhdGl2ZSkgewogICAgICAgICAgICBfYWJzQWRkKGREaWdpdHMsIGFiY2RVc2VkLCB4RGlnaXRzLCBtYXhVc2VkLCBkRGlnaXRzKTsKICAgICAgICAgIH0gZWxzZSBpZiAoKGREaWdpdHNbbWF4VXNlZF0gIT0gMCkgfHwKICAgICAgICAgICAgICAoX2NvbXBhcmVEaWdpdHMoZERpZ2l0cywgbWF4VXNlZCwgeERpZ2l0cywgbWF4VXNlZCkgPiAwKSkgewogICAgICAgICAgICBfYWJzU3ViKGREaWdpdHMsIGFiY2RVc2VkLCB4RGlnaXRzLCBtYXhVc2VkLCBkRGlnaXRzKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9hYnNTdWIoeERpZ2l0cywgbWF4VXNlZCwgZERpZ2l0cywgbWF4VXNlZCwgZERpZ2l0cyk7CiAgICAgICAgICAgIGRJc05lZ2F0aXZlID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgX3JzaChkRGlnaXRzLCBhYmNkVXNlZCwgMSwgZERpZ2l0cyk7CiAgICAgIH0KICAgICAgaWYgKF9jb21wYXJlRGlnaXRzKHVEaWdpdHMsIG1heFVzZWQsIHZEaWdpdHMsIG1heFVzZWQpID49IDApIHsKICAgICAgICBfYWJzU3ViKHVEaWdpdHMsIG1heFVzZWQsIHZEaWdpdHMsIG1heFVzZWQsIHVEaWdpdHMpOwogICAgICAgIGlmIChhYykgewogICAgICAgICAgaWYgKGFJc05lZ2F0aXZlID09IGNJc05lZ2F0aXZlKSB7CiAgICAgICAgICAgIHZhciBhX2NtcF9jID0gX2NvbXBhcmVEaWdpdHMoYURpZ2l0cywgYWJjZFVzZWQsIGNEaWdpdHMsIGFiY2RVc2VkKTsKICAgICAgICAgICAgaWYgKGFfY21wX2MgPiAwKSB7CiAgICAgICAgICAgICAgX2Fic1N1YihhRGlnaXRzLCBhYmNkVXNlZCwgY0RpZ2l0cywgYWJjZFVzZWQsIGFEaWdpdHMpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIF9hYnNTdWIoY0RpZ2l0cywgYWJjZFVzZWQsIGFEaWdpdHMsIGFiY2RVc2VkLCBhRGlnaXRzKTsKICAgICAgICAgICAgICBhSXNOZWdhdGl2ZSA9ICFhSXNOZWdhdGl2ZSAmJiAoYV9jbXBfYyAhPSAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX2Fic0FkZChhRGlnaXRzLCBhYmNkVXNlZCwgY0RpZ2l0cywgYWJjZFVzZWQsIGFEaWdpdHMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoYklzTmVnYXRpdmUgPT0gZElzTmVnYXRpdmUpIHsKICAgICAgICAgIHZhciBiX2NtcF9kID0gX2NvbXBhcmVEaWdpdHMoYkRpZ2l0cywgYWJjZFVzZWQsIGREaWdpdHMsIGFiY2RVc2VkKTsKICAgICAgICAgIGlmIChiX2NtcF9kID4gMCkgewogICAgICAgICAgICBfYWJzU3ViKGJEaWdpdHMsIGFiY2RVc2VkLCBkRGlnaXRzLCBhYmNkVXNlZCwgYkRpZ2l0cyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfYWJzU3ViKGREaWdpdHMsIGFiY2RVc2VkLCBiRGlnaXRzLCBhYmNkVXNlZCwgYkRpZ2l0cyk7CiAgICAgICAgICAgIGJJc05lZ2F0aXZlID0gIWJJc05lZ2F0aXZlICYmIChiX2NtcF9kICE9IDApOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBfYWJzQWRkKGJEaWdpdHMsIGFiY2RVc2VkLCBkRGlnaXRzLCBhYmNkVXNlZCwgYkRpZ2l0cyk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIF9hYnNTdWIodkRpZ2l0cywgbWF4VXNlZCwgdURpZ2l0cywgbWF4VXNlZCwgdkRpZ2l0cyk7CiAgICAgICAgaWYgKGFjKSB7CiAgICAgICAgICBpZiAoY0lzTmVnYXRpdmUgPT0gYUlzTmVnYXRpdmUpIHsKICAgICAgICAgICAgdmFyIGNfY21wX2EgPSBfY29tcGFyZURpZ2l0cyhjRGlnaXRzLCBhYmNkVXNlZCwgYURpZ2l0cywgYWJjZFVzZWQpOwogICAgICAgICAgICBpZiAoY19jbXBfYSA+IDApIHsKICAgICAgICAgICAgICBfYWJzU3ViKGNEaWdpdHMsIGFiY2RVc2VkLCBhRGlnaXRzLCBhYmNkVXNlZCwgY0RpZ2l0cyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgX2Fic1N1YihhRGlnaXRzLCBhYmNkVXNlZCwgY0RpZ2l0cywgYWJjZFVzZWQsIGNEaWdpdHMpOwogICAgICAgICAgICAgIGNJc05lZ2F0aXZlID0gIWNJc05lZ2F0aXZlICYmIChjX2NtcF9hICE9IDApOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfYWJzQWRkKGNEaWdpdHMsIGFiY2RVc2VkLCBhRGlnaXRzLCBhYmNkVXNlZCwgY0RpZ2l0cyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkSXNOZWdhdGl2ZSA9PSBiSXNOZWdhdGl2ZSkgewogICAgICAgICAgdmFyIGRfY21wX2IgPSBfY29tcGFyZURpZ2l0cyhkRGlnaXRzLCBhYmNkVXNlZCwgYkRpZ2l0cywgYWJjZFVzZWQpOwogICAgICAgICAgaWYgKGRfY21wX2IgPiAwKSB7CiAgICAgICAgICAgIF9hYnNTdWIoZERpZ2l0cywgYWJjZFVzZWQsIGJEaWdpdHMsIGFiY2RVc2VkLCBkRGlnaXRzKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9hYnNTdWIoYkRpZ2l0cywgYWJjZFVzZWQsIGREaWdpdHMsIGFiY2RVc2VkLCBkRGlnaXRzKTsKICAgICAgICAgICAgZElzTmVnYXRpdmUgPSAhZElzTmVnYXRpdmUgJiYgKGRfY21wX2IgIT0gMCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIF9hYnNBZGQoZERpZ2l0cywgYWJjZFVzZWQsIGJEaWdpdHMsIGFiY2RVc2VkLCBkRGlnaXRzKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gRXhpdCBsb29wIGlmIHUgPT0gMC4KICAgICAgdmFyIGkgPSBtYXhVc2VkOwogICAgICB3aGlsZSAoKGkgPiAwKSAmJiAodURpZ2l0c1tpIC0gMV0gPT0gMCkpIC0taTsKICAgICAgaWYgKGkgPT0gMCkgYnJlYWs7CiAgICB9CiAgICBpZiAoIWludikgewogICAgICBpZiAoc2hpZnRBbW91bnQgPiAwKSB7CiAgICAgICAgbWF4VXNlZCA9IF9sU2hpZnREaWdpdHModkRpZ2l0cywgbWF4VXNlZCwgc2hpZnRBbW91bnQsIHZEaWdpdHMpOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgX0JpZ0ludEltcGwuXyhmYWxzZSwgbWF4VXNlZCwgdkRpZ2l0cyk7CiAgICB9CiAgICAvLyBObyBpbnZlcnNlIGlmIHYgIT0gMS4KICAgIHZhciBpID0gbWF4VXNlZCAtIDE7CiAgICB3aGlsZSAoKGkgPiAwKSAmJiAodkRpZ2l0c1tpXSA9PSAwKSkgLS1pOwogICAgaWYgKChpICE9IDApIHx8ICh2RGlnaXRzWzBdICE9IDEpKSB7CiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk5vdCBjb3ByaW1lIik7CiAgICB9CgogICAgaWYgKGRJc05lZ2F0aXZlKSB7CiAgICAgIGlmICgoZERpZ2l0c1ttYXhVc2VkXSAhPSAwKSB8fAogICAgICAgICAgKF9jb21wYXJlRGlnaXRzKGREaWdpdHMsIG1heFVzZWQsIHhEaWdpdHMsIG1heFVzZWQpID4gMCkpIHsKICAgICAgICBfYWJzU3ViKGREaWdpdHMsIGFiY2RVc2VkLCB4RGlnaXRzLCBtYXhVc2VkLCBkRGlnaXRzKTsKICAgICAgICBpZiAoKGREaWdpdHNbbWF4VXNlZF0gIT0gMCkgfHwKICAgICAgICAgICAgKF9jb21wYXJlRGlnaXRzKGREaWdpdHMsIG1heFVzZWQsIHhEaWdpdHMsIG1heFVzZWQpID4gMCkpIHsKICAgICAgICAgIF9hYnNTdWIoZERpZ2l0cywgYWJjZFVzZWQsIHhEaWdpdHMsIG1heFVzZWQsIGREaWdpdHMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBfYWJzU3ViKHhEaWdpdHMsIG1heFVzZWQsIGREaWdpdHMsIG1heFVzZWQsIGREaWdpdHMpOwogICAgICAgICAgZElzTmVnYXRpdmUgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2Fic1N1Yih4RGlnaXRzLCBtYXhVc2VkLCBkRGlnaXRzLCBtYXhVc2VkLCBkRGlnaXRzKTsKICAgICAgICBkSXNOZWdhdGl2ZSA9IGZhbHNlOwogICAgICB9CiAgICB9IGVsc2UgaWYgKChkRGlnaXRzW21heFVzZWRdICE9IDApIHx8CiAgICAgICAgKF9jb21wYXJlRGlnaXRzKGREaWdpdHMsIG1heFVzZWQsIHhEaWdpdHMsIG1heFVzZWQpID4gMCkpIHsKICAgICAgX2Fic1N1YihkRGlnaXRzLCBhYmNkVXNlZCwgeERpZ2l0cywgbWF4VXNlZCwgZERpZ2l0cyk7CiAgICAgIGlmICgoZERpZ2l0c1ttYXhVc2VkXSAhPSAwKSB8fAogICAgICAgICAgKF9jb21wYXJlRGlnaXRzKGREaWdpdHMsIG1heFVzZWQsIHhEaWdpdHMsIG1heFVzZWQpID4gMCkpIHsKICAgICAgICBfYWJzU3ViKGREaWdpdHMsIGFiY2RVc2VkLCB4RGlnaXRzLCBtYXhVc2VkLCBkRGlnaXRzKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBfQmlnSW50SW1wbC5fKGZhbHNlLCBtYXhVc2VkLCBkRGlnaXRzKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIG1vZHVsYXIgbXVsdGlwbGljYXRpdmUgaW52ZXJzZSBvZiB0aGlzIGJpZyBpbnRlZ2VyCiAgICogbW9kdWxvIFttb2R1bHVzXS4KICAgKgogICAqIFRoZSBbbW9kdWx1c10gbXVzdCBiZSBwb3NpdGl2ZS4KICAgKgogICAqIEl0IGlzIGFuIGVycm9yIGlmIG5vIG1vZHVsYXIgaW52ZXJzZSBleGlzdHMuCiAgICovCiAgLy8gUmV0dXJucyAxL3RoaXMgJSBtb2R1bHVzLCB3aXRoIG1vZHVsdXMgPiAwLgogIF9CaWdJbnRJbXBsIG1vZEludmVyc2UoQmlnSW50IGJpZ0ludCkgewogICAgX0JpZ0ludEltcGwgbW9kdWx1cyA9IGJpZ0ludDsKICAgIGlmIChtb2R1bHVzIDw9IHplcm8pIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIk1vZHVsdXMgbXVzdCBiZSBzdHJpY3RseSBwb3NpdGl2ZTogJG1vZHVsdXMiKTsKICAgIH0KICAgIGlmIChtb2R1bHVzID09IG9uZSkgcmV0dXJuIHplcm87CiAgICB2YXIgdG1wID0gdGhpczsKICAgIGlmICh0bXAuX2lzTmVnYXRpdmUgfHwgKHRtcC5fYWJzQ29tcGFyZShtb2R1bHVzKSA+PSAwKSkgewogICAgICB0bXAgJT0gbW9kdWx1czsKICAgIH0KICAgIHJldHVybiBfYmluYXJ5R2NkKG1vZHVsdXMsIHRtcCwgdHJ1ZSk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBncmVhdGVzdCBjb21tb24gZGl2aXNvciBvZiB0aGlzIGJpZyBpbnRlZ2VyIGFuZCBbb3RoZXJdLgogICAqCiAgICogSWYgZWl0aGVyIG51bWJlciBpcyBub24temVybywgdGhlIHJlc3VsdCBpcyB0aGUgbnVtZXJpY2FsbHkgZ3JlYXRlc3QKICAgKiBpbnRlZ2VyIGRpdmlkaW5nIGJvdGggYHRoaXNgIGFuZCBgb3RoZXJgLgogICAqCiAgICogVGhlIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIGlzIGluZGVwZW5kZW50IG9mIHRoZSBvcmRlciwKICAgKiBzbyBgeC5nY2QoeSlgIGlzICBhbHdheXMgdGhlIHNhbWUgYXMgYHkuZ2NkKHgpYC4KICAgKgogICAqIEZvciBhbnkgaW50ZWdlciBgeGAsIGB4LmdjZCh4KWAgaXMgYHguYWJzKClgLgogICAqCiAgICogSWYgYm90aCBgdGhpc2AgYW5kIGBvdGhlcmAgaXMgemVybywgdGhlIHJlc3VsdCBpcyBhbHNvIHplcm8uCiAgICovCiAgX0JpZ0ludEltcGwgZ2NkKEJpZ0ludCBiaWdJbnQpIHsKICAgIF9CaWdJbnRJbXBsIG90aGVyID0gYmlnSW50OwogICAgaWYgKF9pc1plcm8pIHJldHVybiBvdGhlci5hYnMoKTsKICAgIGlmIChvdGhlci5faXNaZXJvKSByZXR1cm4gdGhpcy5hYnMoKTsKICAgIHJldHVybiBfYmluYXJ5R2NkKHRoaXMsIG90aGVyLCBmYWxzZSk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBsZWFzdCBzaWduaWZpY2FudCBbd2lkdGhdIGJpdHMgb2YgdGhpcyBiaWcgaW50ZWdlciBhcyBhCiAgICogbm9uLW5lZ2F0aXZlIG51bWJlciAoaS5lLiB1bnNpZ25lZCByZXByZXNlbnRhdGlvbikuICBUaGUgcmV0dXJuZWQgdmFsdWUgaGFzCiAgICogemVyb3MgaW4gYWxsIGJpdCBwb3NpdGlvbnMgaGlnaGVyIHRoYW4gW3dpZHRoXS4KICAgKgogICAqIGBgYAogICAqIG5ldyBCaWdJbnQuZnJvbSgtMSkudG9VbnNpZ25lZCg1KSA9PSAzMSAgIC8vIDExMTExMTExICAtPiAgMDAwMTExMTEKICAgKiBgYGAKICAgKgogICAqIFRoaXMgb3BlcmF0aW9uIGNhbiBiZSB1c2VkIHRvIHNpbXVsYXRlIGFyaXRobWV0aWMgZnJvbSBsb3cgbGV2ZWwgbGFuZ3VhZ2VzLgogICAqIEZvciBleGFtcGxlLCB0byBpbmNyZW1lbnQgYW4gOCBiaXQgcXVhbnRpdHk6CiAgICoKICAgKiBgYGAKICAgKiBxID0gKHEgKyAxKS50b1Vuc2lnbmVkKDgpOwogICAqIGBgYAogICAqCiAgICogYHFgIHdpbGwgY291bnQgZnJvbSBgMGAgdXAgdG8gYDI1NWAgYW5kIHRoZW4gd3JhcCBhcm91bmQgdG8gYDBgLgogICAqCiAgICogSWYgdGhlIGlucHV0IGZpdHMgaW4gW3dpZHRoXSBiaXRzIHdpdGhvdXQgdHJ1bmNhdGlvbiwgdGhlIHJlc3VsdCBpcyB0aGUKICAgKiBzYW1lIGFzIHRoZSBpbnB1dC4gIFRoZSBtaW5pbXVtIHdpZHRoIG5lZWRlZCB0byBhdm9pZCB0cnVuY2F0aW9uIG9mIGB4YCBpcwogICAqIGdpdmVuIGJ5IGB4LmJpdExlbmd0aGAsIGkuZS4KICAgKgogICAqIGBgYAogICAqIHggPT0geC50b1Vuc2lnbmVkKHguYml0TGVuZ3RoKTsKICAgKiBgYGAKICAgKi8KICBfQmlnSW50SW1wbCB0b1Vuc2lnbmVkKGludCB3aWR0aCkgewogICAgcmV0dXJuIHRoaXMgJiAoKG9uZSA8PCB3aWR0aCkgLSBvbmUpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgW3dpZHRoXSBiaXRzIG9mIHRoaXMgaW50ZWdlciwgZXh0ZW5kaW5nIHRoZQogICAqIGhpZ2hlc3QgcmV0YWluZWQgYml0IHRvIHRoZSBzaWduLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyB0cnVuY2F0aW5nIHRoZSB2YWx1ZQogICAqIHRvIGZpdCBpbiBbd2lkdGhdIGJpdHMgdXNpbmcgYW4gc2lnbmVkIDItcyBjb21wbGVtZW50IHJlcHJlc2VudGF0aW9uLiAgVGhlCiAgICogcmV0dXJuZWQgdmFsdWUgaGFzIHRoZSBzYW1lIGJpdCB2YWx1ZSBpbiBhbGwgcG9zaXRpb25zIGhpZ2hlciB0aGFuIFt3aWR0aF0uCiAgICoKICAgKiBgYGAKICAgKiB2YXIgYmlnMTUgPSBuZXcgQmlnSW50LmZyb20oMTUpOwogICAqIHZhciBiaWcxNiA9IG5ldyBCaWdJbnQuZnJvbSgxNik7CiAgICogdmFyIGJpZzIzOSA9IG5ldyBCaWdJbnQuZnJvbSgyMzkpOwogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWLS1zaWduIGJpdC1WCiAgICogYmlnMTYudG9TaWduZWQoNSkgPT0gLWJpZzE2ICAgLy8gIDAwMDEwMDAwIC0+IDExMTEwMDAwCiAgICogYmlnMjM5LnRvU2lnbmVkKDUpID09IGJpZzE1ICAgLy8gIDExMTAxMTExIC0+IDAwMDAxMTExCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gICAgICAgICAgIF4KICAgKiBgYGAKICAgKgogICAqIFRoaXMgb3BlcmF0aW9uIGNhbiBiZSB1c2VkIHRvIHNpbXVsYXRlIGFyaXRobWV0aWMgZnJvbSBsb3cgbGV2ZWwgbGFuZ3VhZ2VzLgogICAqIEZvciBleGFtcGxlLCB0byBpbmNyZW1lbnQgYW4gOCBiaXQgc2lnbmVkIHF1YW50aXR5OgogICAqCiAgICogYGBgCiAgICogcSA9IChxICsgMSkudG9TaWduZWQoOCk7CiAgICogYGBgCiAgICoKICAgKiBgcWAgd2lsbCBjb3VudCBmcm9tIGAwYCB1cCB0byBgMTI3YCwgd3JhcCB0byBgLTEyOGAgYW5kIGNvdW50IGJhY2sgdXAgdG8KICAgKiBgMTI3YC4KICAgKgogICAqIElmIHRoZSBpbnB1dCB2YWx1ZSBmaXRzIGluIFt3aWR0aF0gYml0cyB3aXRob3V0IHRydW5jYXRpb24sIHRoZSByZXN1bHQgaXMKICAgKiB0aGUgc2FtZSBhcyB0aGUgaW5wdXQuICBUaGUgbWluaW11bSB3aWR0aCBuZWVkZWQgdG8gYXZvaWQgdHJ1bmNhdGlvbiBvZiBgeGAKICAgKiBpcyBgeC5iaXRMZW5ndGggKyAxYCwgaS5lLgogICAqCiAgICogYGBgCiAgICogeCA9PSB4LnRvU2lnbmVkKHguYml0TGVuZ3RoICsgMSk7CiAgICogYGBgCiAgICovCiAgX0JpZ0ludEltcGwgdG9TaWduZWQoaW50IHdpZHRoKSB7CiAgICAvLyBUaGUgdmFsdWUgb2YgYmluYXJ5IG51bWJlciB3ZWlnaHRzIGVhY2ggYml0IGJ5IGEgcG93ZXIgb2YgdHdvLiAgVGhlCiAgICAvLyB0d29zLWNvbXBsZW1lbnQgdmFsdWUgd2VpZ2h0cyB0aGUgc2lnbiBiaXQgbmVnYXRpdmVseS4gIFdlIGNvbXB1dGUgdGhlCiAgICAvLyB2YWx1ZSBvZiB0aGUgbmVnYXRpdmUgd2VpZ2h0aW5nIGJ5IGlzb2xhdGluZyB0aGUgc2lnbiBiaXQgd2l0aCB0aGUKICAgIC8vIGNvcnJlY3QgcG93ZXIgb2YgdHdvIHdlaWdodGluZyBhbmQgc3VidHJhY3RpbmcgaXQgZnJvbSB0aGUgdmFsdWUgb2YgdGhlCiAgICAvLyBsb3dlciBiaXRzLgogICAgdmFyIHNpZ25NYXNrID0gb25lIDw8ICh3aWR0aCAtIDEpOwogICAgcmV0dXJuICh0aGlzICYgKHNpZ25NYXNrIC0gb25lKSkgLSAodGhpcyAmIHNpZ25NYXNrKTsKICB9CgogIGJvb2wgZ2V0IGlzVmFsaWRJbnQgewogICAgYXNzZXJ0KF9kaWdpdEJpdHMgPT0gMzIpOwogICAgcmV0dXJuIF91c2VkIDwgMiB8fAogICAgICAgIChfdXNlZCA9PSAyICYmCiAgICAgICAgICAgIChfZGlnaXRzWzFdIDwgMHg4MDAwMDAwMCB8fAogICAgICAgICAgICAgICAgKF9pc05lZ2F0aXZlICYmIF9kaWdpdHNbMV0gPT0gMHg4MDAwMDAwMCAmJiBfZGlnaXRzWzBdID09IDApKSk7CiAgfQoKICBpbnQgdG9JbnQoKSB7CiAgICBhc3NlcnQoX2RpZ2l0Qml0cyA9PSAzMik7CiAgICBpZiAoX3VzZWQgPT0gMCkgcmV0dXJuIDA7CiAgICBpZiAoX3VzZWQgPT0gMSkgcmV0dXJuIF9pc05lZ2F0aXZlID8gLV9kaWdpdHNbMF0gOiBfZGlnaXRzWzBdOwogICAgaWYgKF91c2VkID09IDIgJiYgX2RpZ2l0c1sxXSA8IDB4ODAwMDAwMDApIHsKICAgICAgdmFyIHJlc3VsdCA9IChfZGlnaXRzWzFdIDw8IF9kaWdpdEJpdHMpIHwgX2RpZ2l0c1swXTsKICAgICAgcmV0dXJuIF9pc05lZ2F0aXZlID8gLXJlc3VsdCA6IHJlc3VsdDsKICAgIH0KICAgIHJldHVybiBfaXNOZWdhdGl2ZSA/IF9taW5JbnQgOiBfbWF4SW50OwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGlzIFtfQmlnSW50SW1wbF0gYXMgYSBbZG91YmxlXS4KICAgKgogICAqIElmIHRoZSBudW1iZXIgaXMgbm90IHJlcHJlc2VudGFibGUgYXMgYSBbZG91YmxlXSwgYW4KICAgKiBhcHByb3hpbWF0aW9uIGlzIHJldHVybmVkLiBGb3IgbnVtZXJpY2FsbHkgbGFyZ2UgaW50ZWdlcnMsIHRoZQogICAqIGFwcHJveGltYXRpb24gbWF5IGJlIGluZmluaXRlLgogICAqLwogIGRvdWJsZSB0b0RvdWJsZSgpIHsKICAgIGNvbnN0IGludCBleHBvbmVudEJpYXMgPSAxMDc1OwogICAgLy8gVGhlcmUgYXJlIDExIGJpdHMgZm9yIHRoZSBleHBvbmVudC4KICAgIC8vIDIwNDcgKGFsbCBiaXRzIHNldCB0byAxKSBpcyByZXNlcnZlZCBmb3IgaW5maW5pdHkgYW5kIE5hTi4KICAgIC8vIFdoZW4gc3RvcmluZyB0aGUgZXhwb25lbnQgaW4gdGhlIDExIGJpdHMsIGl0IGlzIGJpYXNlZCBieSBleHBvbmVudEJpYXMKICAgIC8vIHRvIHN1cHBvcnQgbmVnYXRpdmUgZXhwb25lbnRzLgogICAgY29uc3QgaW50IG1heERvdWJsZUV4cG9uZW50ID0gMjA0NiAtIGV4cG9uZW50QmlhczsKICAgIGlmIChfaXNaZXJvKSByZXR1cm4gMC4wOwoKICAgIC8vIFdlIGZpbGwgdGhlIDUzIGJpdHMgbGl0dGxlLWVuZGlhbi4KICAgIHZhciByZXN1bHRCaXRzID0gbmV3IFVpbnQ4TGlzdCg4KTsKCiAgICB2YXIgbGVuZ3RoID0gX2RpZ2l0Qml0cyAqIChfdXNlZCAtIDEpICsgX2RpZ2l0c1tfdXNlZCAtIDFdLmJpdExlbmd0aDsKICAgIGlmIChsZW5ndGggPiBtYXhEb3VibGVFeHBvbmVudCArIDUzKSB7CiAgICAgIHJldHVybiBfaXNOZWdhdGl2ZSA/IGRvdWJsZS5uZWdhdGl2ZUluZmluaXR5IDogZG91YmxlLmluZmluaXR5OwogICAgfQoKICAgIC8vIFRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBpcyBmb3IgdGhlIHNpZ24uCiAgICBpZiAoX2lzTmVnYXRpdmUpIHJlc3VsdEJpdHNbN10gPSAweDgwOwoKICAgIC8vIFdyaXRlIHRoZSBleHBvbmVudCBpbnRvIGJpdHMgMS4uMTI6CiAgICB2YXIgYmlhc2VkRXhwb25lbnQgPSBsZW5ndGggLSA1MyArIGV4cG9uZW50QmlhczsKICAgIHJlc3VsdEJpdHNbNl0gPSAoYmlhc2VkRXhwb25lbnQgJiAweEYpIDw8IDQ7CiAgICByZXN1bHRCaXRzWzddIHw9IGJpYXNlZEV4cG9uZW50ID4+IDQ7CgogICAgaW50IGNhY2hlZEJpdHMgPSAwOwogICAgaW50IGNhY2hlZEJpdHNMZW5ndGggPSAwOwogICAgaW50IGRpZ2l0SW5kZXggPSBfdXNlZCAtIDE7CiAgICBpbnQgcmVhZEJpdHMoaW50IG4pIHsKICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgaGF2ZSBlbm91Z2ggYml0cyBpbiBbY2FjaGVkQml0c10uCiAgICAgIHdoaWxlIChjYWNoZWRCaXRzTGVuZ3RoIDwgbikgewogICAgICAgIGludCBuZXh0RGlnaXQ7CiAgICAgICAgaW50IG5leHREaWdpdExlbmd0aCA9IF9kaWdpdEJpdHM7IC8vIE1heSBnZXQgdXBkYXRlZC4KICAgICAgICBpZiAoZGlnaXRJbmRleCA8IDApIHsKICAgICAgICAgIG5leHREaWdpdCA9IDA7CiAgICAgICAgICBkaWdpdEluZGV4LS07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5leHREaWdpdCA9IF9kaWdpdHNbZGlnaXRJbmRleF07CiAgICAgICAgICBpZiAoZGlnaXRJbmRleCA9PSBfdXNlZCAtIDEpIG5leHREaWdpdExlbmd0aCA9IG5leHREaWdpdC5iaXRMZW5ndGg7CiAgICAgICAgICBkaWdpdEluZGV4LS07CiAgICAgICAgfQogICAgICAgIGNhY2hlZEJpdHMgPSAoY2FjaGVkQml0cyA8PCBuZXh0RGlnaXRMZW5ndGgpICsgbmV4dERpZ2l0OwogICAgICAgIGNhY2hlZEJpdHNMZW5ndGggKz0gbmV4dERpZ2l0TGVuZ3RoOwogICAgICB9CiAgICAgIC8vIFJlYWQgdGhlIHRvcCBbbl0gYml0cy4KICAgICAgdmFyIHJlc3VsdCA9IGNhY2hlZEJpdHMgPj4gKGNhY2hlZEJpdHNMZW5ndGggLSBuKTsKICAgICAgLy8gUmVtb3ZlIHRoZSBiaXRzIGZyb20gdGhlIGNhY2hlLgogICAgICBjYWNoZWRCaXRzIC09IHJlc3VsdCA8PCAoY2FjaGVkQml0c0xlbmd0aCAtIG4pOwogICAgICBjYWNoZWRCaXRzTGVuZ3RoIC09IG47CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgLy8gVGhlIGZpcnN0IGxlYWRpbmcgMSBiaXQgaXMgaW1wbGljaXQgaW4gdGhlIGRvdWJsZS1yZXByZXNlbnRhdGlvbiBhbmQgY2FuCiAgICAvLyBiZSBkaXNjYXJkZWQuCiAgICB2YXIgbGVhZGluZ0JpdHMgPSByZWFkQml0cyg1KSAmIDB4RjsKICAgIHJlc3VsdEJpdHNbNl0gfD0gbGVhZGluZ0JpdHM7CgogICAgZm9yIChpbnQgaSA9IDU7IGkgPj0gMDsgaS0tKSB7CiAgICAgIC8vIEdldCB0aGUgcmVtYWluaW5nIDQ4IGJpdHMuCiAgICAgIHJlc3VsdEJpdHNbaV0gPSByZWFkQml0cyg4KTsKICAgIH0KCiAgICB2b2lkIHJvdW5kVXAoKSB7CiAgICAgIC8vIFNpbXBseSBjb25zaXN0cyBvZiBhZGRpbmcgMSB0byB0aGUgd2hvbGUgNjQgYml0ICJudW1iZXIiLgogICAgICAvLyBJdCB3aWxsIHVwZGF0ZSB0aGUgZXhwb25lbnQsIGlmIG5lY2Vzc2FyeS4KICAgICAgLy8gSXQgbWlnaHQgZXZlbiByb3VuZCB1cCB0byBpbmZpbml0eSAod2hpY2ggaXMgd2hhdCB3ZSB3YW50KS4KICAgICAgdmFyIGNhcnJ5ID0gMTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgICBpZiAoY2FycnkgPT0gMCkgYnJlYWs7CiAgICAgICAgdmFyIHN1bSA9IHJlc3VsdEJpdHNbaV0gKyBjYXJyeTsKICAgICAgICByZXN1bHRCaXRzW2ldID0gc3VtICYgMHhGRjsKICAgICAgICBjYXJyeSA9IHN1bSA+PiA4OwogICAgICB9CiAgICB9CgogICAgaWYgKHJlYWRCaXRzKDEpID09IDEpIHsKICAgICAgaWYgKHJlc3VsdEJpdHNbMF0uaXNPZGQpIHsKICAgICAgICAvLyBSb3VuZHMgdG8gZXZlbiBhbGwgdGhlIHRpbWUuCiAgICAgICAgcm91bmRVcCgpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFJvdW5kIHVwLCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgb3RoZXIgZGlnaXQgdGhhdCBpcyBub3QgMC4KICAgICAgICBpZiAoY2FjaGVkQml0cyAhPSAwKSB7CiAgICAgICAgICAvLyBUaGVyZSBpcyBhbHJlYWR5IG9uZSBpbiB0aGUgY2FjaGVkQml0cy4KICAgICAgICAgIHJvdW5kVXAoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZm9yIChpbnQgaSA9IGRpZ2l0SW5kZXg7IGRpZ2l0SW5kZXggPj0gMDsgaS0tKSB7CiAgICAgICAgICAgIGlmIChfZGlnaXRzW2ldICE9IDApIHsKICAgICAgICAgICAgICByb3VuZFVwKCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHRCaXRzLmJ1ZmZlci5hc0J5dGVEYXRhKCkuZ2V0RmxvYXQ2NCgwLCBFbmRpYW4ubGl0dGxlKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBTdHJpbmctcmVwcmVzZW50YXRpb24gb2YgdGhpcyBpbnRlZ2VyLgogICAqCiAgICogVGhlIHJldHVybmVkIHN0cmluZyBpcyBwYXJzYWJsZSBieSBbcGFyc2VdLgogICAqIEZvciBhbnkgYF9CaWdJbnRJbXBsYCBgaWAsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdAogICAqIGBpID09IF9CaWdJbnRJbXBsLnBhcnNlKGkudG9TdHJpbmcoKSlgLgogICAqLwogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIGlmIChfdXNlZCA9PSAwKSByZXR1cm4gIjAiOwogICAgaWYgKF91c2VkID09IDEpIHsKICAgICAgaWYgKF9pc05lZ2F0aXZlKSByZXR1cm4gKC1fZGlnaXRzWzBdKS50b1N0cmluZygpOwogICAgICByZXR1cm4gX2RpZ2l0c1swXS50b1N0cmluZygpOwogICAgfQoKICAgIC8vIEdlbmVyYXRlIGluIGNodW5rcyBvZiA5IGRpZ2l0cy4KICAgIC8vIFRoZSBjaHVua3MgYXJlIGluIHJldmVyc2VkIG9yZGVyLgogICAgdmFyIGRlY2ltYWxEaWdpdENodW5rcyA9IDxTdHJpbmc+W107CiAgICB2YXIgcmVzdCA9IGlzTmVnYXRpdmUgPyAtdGhpcyA6IHRoaXM7CiAgICB3aGlsZSAocmVzdC5fdXNlZCA+IDEpIHsKICAgICAgdmFyIGRpZ2l0czkgPSByZXN0LnJlbWFpbmRlcihfb25lQmlsbGlvbikudG9TdHJpbmcoKTsKICAgICAgZGVjaW1hbERpZ2l0Q2h1bmtzLmFkZChkaWdpdHM5KTsKICAgICAgdmFyIHplcm9zID0gOSAtIGRpZ2l0czkubGVuZ3RoOwogICAgICBpZiAoemVyb3MgPT0gOCkgewogICAgICAgIGRlY2ltYWxEaWdpdENodW5rcy5hZGQoIjAwMDAwMDAwIik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHplcm9zID49IDQpIHsKICAgICAgICAgIHplcm9zIC09IDQ7CiAgICAgICAgICBkZWNpbWFsRGlnaXRDaHVua3MuYWRkKCIwMDAwIik7CiAgICAgICAgfQogICAgICAgIGlmICh6ZXJvcyA+PSAyKSB7CiAgICAgICAgICB6ZXJvcyAtPSAyOwogICAgICAgICAgZGVjaW1hbERpZ2l0Q2h1bmtzLmFkZCgiMDAiKTsKICAgICAgICB9CiAgICAgICAgaWYgKHplcm9zID49IDEpIHsKICAgICAgICAgIGRlY2ltYWxEaWdpdENodW5rcy5hZGQoIjAiKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmVzdCA9IHJlc3Qgfi8gX29uZUJpbGxpb247CiAgICB9CiAgICBkZWNpbWFsRGlnaXRDaHVua3MuYWRkKHJlc3QuX2RpZ2l0c1swXS50b1N0cmluZygpKTsKICAgIGlmIChfaXNOZWdhdGl2ZSkgZGVjaW1hbERpZ2l0Q2h1bmtzLmFkZCgiLSIpOwogICAgcmV0dXJuIGRlY2ltYWxEaWdpdENodW5rcy5yZXZlcnNlZC5qb2luKCk7CiAgfQoKICBpbnQgX3RvUmFkaXhDb2RlVW5pdChpbnQgZGlnaXQpIHsKICAgIGNvbnN0IGludCBfMCA9IDQ4OwogICAgY29uc3QgaW50IF9hID0gOTc7CiAgICBpZiAoZGlnaXQgPCAxMCkgcmV0dXJuIF8wICsgZGlnaXQ7CiAgICByZXR1cm4gX2EgKyBkaWdpdCAtIDEwOwogIH0KCiAgLyoqCiAgICogQ29udmVydHMgW3RoaXNdIHRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGluIHRoZSBnaXZlbiBbcmFkaXhdLgogICAqCiAgICogSW4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiwgbG93ZXItY2FzZSBsZXR0ZXJzIGFyZSB1c2VkIGZvciBkaWdpdHMgYWJvdmUKICAgKiAnOScsIHdpdGggJ2EnIGJlaW5nIDEwIGFuICd6JyBiZWluZyAzNS4KICAgKgogICAqIFRoZSBbcmFkaXhdIGFyZ3VtZW50IG11c3QgYmUgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2UgMiB0byAzNi4KICAgKi8KICBTdHJpbmcgdG9SYWRpeFN0cmluZyhpbnQgcmFkaXgpIHsKICAgIGlmIChyYWRpeCA+IDM2KSB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShyYWRpeCwgMiwgMzYpOwoKICAgIGlmIChfdXNlZCA9PSAwKSByZXR1cm4gIjAiOwoKICAgIGlmIChfdXNlZCA9PSAxKSB7CiAgICAgIHZhciBkaWdpdFN0cmluZyA9IF9kaWdpdHNbMF0udG9SYWRpeFN0cmluZyhyYWRpeCk7CiAgICAgIGlmIChfaXNOZWdhdGl2ZSkgcmV0dXJuICItIiArIGRpZ2l0U3RyaW5nOwogICAgICByZXR1cm4gZGlnaXRTdHJpbmc7CiAgICB9CgogICAgaWYgKHJhZGl4ID09IDE2KSByZXR1cm4gX3RvSGV4U3RyaW5nKCk7CgogICAgdmFyIGJhc2UgPSBuZXcgX0JpZ0ludEltcGwuX2Zyb21JbnQocmFkaXgpOwogICAgdmFyIHJldmVyc2VkRGlnaXRDb2RlVW5pdHMgPSA8aW50PltdOwogICAgdmFyIHJlc3QgPSB0aGlzLmFicygpOwogICAgd2hpbGUgKCFyZXN0Ll9pc1plcm8pIHsKICAgICAgdmFyIGRpZ2l0ID0gcmVzdC5yZW1haW5kZXIoYmFzZSkudG9JbnQoKTsKICAgICAgcmVzdCA9IHJlc3Qgfi8gYmFzZTsKICAgICAgcmV2ZXJzZWREaWdpdENvZGVVbml0cy5hZGQoX3RvUmFkaXhDb2RlVW5pdChkaWdpdCkpOwogICAgfQogICAgdmFyIGRpZ2l0U3RyaW5nID0gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKHJldmVyc2VkRGlnaXRDb2RlVW5pdHMucmV2ZXJzZWQpOwogICAgaWYgKF9pc05lZ2F0aXZlKSByZXR1cm4gIi0iICsgZGlnaXRTdHJpbmc7CiAgICByZXR1cm4gZGlnaXRTdHJpbmc7CiAgfQoKICBTdHJpbmcgX3RvSGV4U3RyaW5nKCkgewogICAgdmFyIGNoYXJzID0gPGludD5bXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3VzZWQgLSAxOyBpKyspIHsKICAgICAgaW50IGNodW5rID0gX2RpZ2l0c1tpXTsKICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAoX2RpZ2l0Qml0cyB+LyA0KTsgaisrKSB7CiAgICAgICAgY2hhcnMuYWRkKF90b1JhZGl4Q29kZVVuaXQoY2h1bmsgJiAweEYpKTsKICAgICAgICBjaHVuayA+Pj0gNDsKICAgICAgfQogICAgfQogICAgdmFyIG1zYkNodW5rID0gX2RpZ2l0c1tfdXNlZCAtIDFdOwogICAgd2hpbGUgKG1zYkNodW5rICE9IDApIHsKICAgICAgY2hhcnMuYWRkKF90b1JhZGl4Q29kZVVuaXQobXNiQ2h1bmsgJiAweEYpKTsKICAgICAgbXNiQ2h1bmsgPj49IDQ7CiAgICB9CiAgICBpZiAoX2lzTmVnYXRpdmUpIHsKICAgICAgY29uc3QgX2Rhc2ggPSA0NTsKICAgICAgY2hhcnMuYWRkKF9kYXNoKTsKICAgIH0KICAgIHJldHVybiBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoY2hhcnMucmV2ZXJzZWQpOwogIH0KfQoKLy8gSW50ZXJmYWNlIGZvciBtb2R1bGFyIHJlZHVjdGlvbi4KYWJzdHJhY3QgY2xhc3MgX0JpZ0ludFJlZHVjdGlvbiB7CiAgaW50IGdldCBfbm9ybU1vZHVsdXNVc2VkOwogIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGRpZ2l0cyB1c2VkIGJ5IHJlc3VsdERpZ2l0cy4KICBpbnQgX2NvbnZlcnQoX0JpZ0ludEltcGwgeCwgVWludDMyTGlzdCByZXN1bHREaWdpdHMpOwogIGludCBfbXVsKFVpbnQzMkxpc3QgeERpZ2l0cywgaW50IHhVc2VkLCBVaW50MzJMaXN0IHlEaWdpdHMsIGludCB5VXNlZCwKICAgICAgVWludDMyTGlzdCByZXN1bHREaWdpdHMpOwogIGludCBfc3FyKFVpbnQzMkxpc3QgeERpZ2l0cywgaW50IHhVc2VkLCBVaW50MzJMaXN0IHJlc3VsdERpZ2l0cyk7CgogIC8vIFJldHVybiB4IHJldmVydGVkIHRvIF9CaWdJbnRJbXBsLgogIF9CaWdJbnRJbXBsIF9yZXZlcnQoVWludDMyTGlzdCB4RGlnaXRzLCBpbnQgeFVzZWQpOwp9CgovLyBNb250Z29tZXJ5IHJlZHVjdGlvbiBvbiBfQmlnSW50SW1wbC4KY2xhc3MgX0JpZ0ludE1vbnRnb21lcnlSZWR1Y3Rpb24gaW1wbGVtZW50cyBfQmlnSW50UmVkdWN0aW9uIHsKICBmaW5hbCBfQmlnSW50SW1wbCBfbW9kdWx1czsKICBpbnQgX25vcm1Nb2R1bHVzVXNlZDsgLy8gRXZlbiBpZiBwcm9jZXNzaW5nIDY0LWJpdCAoZGlnaXQgcGFpcnMpLgogIFVpbnQzMkxpc3QgX21vZHVsdXNEaWdpdHM7CiAgVWludDMyTGlzdCBfYXJnczsKICBpbnQgX2RpZ2l0c1BlclN0ZXA7IC8vIE51bWJlciBvZiBkaWdpdHMgcHJvY2Vzc2VkIGluIG9uZSBzdGVwLiAxIG9yIDIuCiAgc3RhdGljIGNvbnN0IGludCBfeERpZ2l0ID0gMDsgLy8gSW5kZXggb2YgZGlnaXQgb2YgeC4KICBzdGF0aWMgY29uc3QgaW50IF94SGlnaERpZ2l0ID0gMTsgLy8gSW5kZXggb2YgaGlnaCBkaWdpdCBvZiB4ICg2NC1iaXQgb25seSkuCiAgc3RhdGljIGNvbnN0IGludCBfcmhvRGlnaXQgPSAyOyAvLyBJbmRleCBvZiBkaWdpdCBvZiByaG8uCiAgc3RhdGljIGNvbnN0IGludCBfcmhvSGlnaERpZ2l0ID0gMzsgLy8gSW5kZXggb2YgaGlnaCBkaWdpdCBvZiByaG8gKDY0LWJpdCkuCiAgc3RhdGljIGNvbnN0IGludCBfbXVEaWdpdCA9IDQ7IC8vIEluZGV4IG9mIG11LgogIHN0YXRpYyBjb25zdCBpbnQgX211SGlnaERpZ2l0ID0gNTsgLy8gSW5kZXggb2YgaGlnaCAzMi1iaXRzIG9mIG11ICg2NC1iaXQpLgoKICBfQmlnSW50TW9udGdvbWVyeVJlZHVjdGlvbih0aGlzLl9tb2R1bHVzKSB7CiAgICBfbW9kdWx1c0RpZ2l0cyA9IF9tb2R1bHVzLl9kaWdpdHM7CiAgICBfYXJncyA9IF9uZXdEaWdpdHMoNik7CiAgICAvLyBEZXRlcm1pbmUgaWYgd2UgY2FuIHByb2Nlc3MgZGlnaXQgcGFpcnMgYnkgY2FsbGluZyBhbiBpbnRyaW5zaWMuCiAgICBfZGlnaXRzUGVyU3RlcCA9IF9tdWxNb2QoX2FyZ3MsIF9hcmdzLCAwKTsKICAgIF9hcmdzW194RGlnaXRdID0gX21vZHVsdXNEaWdpdHNbMF07CiAgICBpZiAoX2RpZ2l0c1BlclN0ZXAgPT0gMSkgewogICAgICBfbm9ybU1vZHVsdXNVc2VkID0gX21vZHVsdXMuX3VzZWQ7CiAgICAgIF9pbnZEaWdpdChfYXJncyk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoX2RpZ2l0c1BlclN0ZXAgPT0gMik7CiAgICAgIF9ub3JtTW9kdWx1c1VzZWQgPSBfbW9kdWx1cy5fdXNlZCArIChfbW9kdWx1cy5fdXNlZCAmIDEpOwogICAgICBfYXJnc1tfeEhpZ2hEaWdpdF0gPSBfbW9kdWx1c0RpZ2l0c1sxXTsKICAgICAgX2ludkRpZ2l0UGFpcihfYXJncyk7CiAgICB9CiAgfQoKICAvLyBDYWxjdWxhdGVzIC0xL3ggJSBfZGlnaXRCYXNlLCB4IGlzIDMyLWJpdCBkaWdpdC4KICAvLyAgICAgICAgIHh5ID09IDEgKG1vZCBtKQogIC8vICAgICAgICAgeHkgPSAgMStrbQogIC8vICAgeHkoMi14eSkgPSAoMStrbSkoMS1rbSkKICAvLyB4KHkoMi14eSkpID0gMS1rXjIgbV4yCiAgLy8geCh5KDIteHkpKSA9PSAxIChtb2QgbV4yKQogIC8vIGlmIHkgaXMgMS94IG1vZCBtLCB0aGVuIHkoMi14eSkgaXMgMS94IG1vZCBtXjIKICAvLyBTaG91bGQgcmVkdWNlIHggYW5kIHkoMi14eSkgYnkgbV4yIGF0IGVhY2ggc3RlcCB0byBrZWVwIHNpemUgYm91bmRlZC4KICAvLwogIC8vIE9wZXJhdGlvbjoKICAvLyAgIGFyZ3NbX3Job0RpZ2l0XSA9IDEvYXJnc1tfeERpZ2l0XSBtb2QgX2RpZ2l0QmFzZS4KICBzdGF0aWMgdm9pZCBfaW52RGlnaXQoVWludDMyTGlzdCBhcmdzKSB7CiAgICB2YXIgeCA9IGFyZ3NbX3hEaWdpdF07CiAgICB2YXIgeSA9IHggJiAzOyAvLyB5ID09IDEveCBtb2QgMl4yCiAgICB5ID0gKHkgKiAoMiAtICh4ICYgMHhmKSAqIHkpKSAmIDB4ZjsgLy8geSA9PSAxL3ggbW9kIDJeNAogICAgeSA9ICh5ICogKDIgLSAoeCAmIDB4ZmYpICogeSkpICYgMHhmZjsgLy8geSA9PSAxL3ggbW9kIDJeOAogICAgeSA9ICh5ICogKDIgLSAoKCh4ICYgMHhmZmZmKSAqIHkpICYgMHhmZmZmKSkpICYgMHhmZmZmOyAvLyB5ID09IDEveCBtb2QgMl4xNgogICAgeSA9ICh5ICogKDIgLSB4ICogeSAlIF9CaWdJbnRJbXBsLl9kaWdpdEJhc2UpKSAlIF9CaWdJbnRJbXBsLl9kaWdpdEJhc2U7CiAgICAvLyB5ID09IDEveCBtb2QgX2RpZ2l0QmFzZQogICAgeSA9IC15OyAvLyBXZSByZWFsbHkgd2FudCB0aGUgbmVnYXRpdmUgaW52ZXJzZS4KICAgIGFyZ3NbX3Job0RpZ2l0XSA9IHkgJiBfQmlnSW50SW1wbC5fZGlnaXRNYXNrOwogICAgYXNzZXJ0KCgoeCAqIHkpICYgX0JpZ0ludEltcGwuX2RpZ2l0TWFzaykgPT0gX0JpZ0ludEltcGwuX2RpZ2l0TWFzayk7CiAgfQoKICAvLyBDYWxjdWxhdGVzIC0xL3ggJSBfZGlnaXRCYXNlXjIsIHggaXMgYSBwYWlyIG9mIDMyLWJpdCBkaWdpdHMuCiAgLy8gT3BlcmF0aW9uOgogIC8vICAgYXJnc1tfcmhvRGlnaXQuLl9yaG9IaWdoRGlnaXRdID0KICAvLyAgICAgMS9hcmdzW194RGlnaXQuLl94SGlnaERpZ2l0XSBtb2QgX2RpZ2l0QmFzZV4yLgogIHN0YXRpYyB2b2lkIF9pbnZEaWdpdFBhaXIoVWludDMyTGlzdCBhcmdzKSB7CiAgICB2YXIgeGwgPSBhcmdzW194RGlnaXRdOyAvLyBMb3dlciAzMi1iaXQgZGlnaXQgb2YgeC4KICAgIHZhciB5ID0geGwgJiAzOyAvLyB5ID09IDEveCBtb2QgMl4yCiAgICB5ID0gKHkgKiAoMiAtICh4bCAmIDB4ZikgKiB5KSkgJiAweGY7IC8vIHkgPT0gMS94IG1vZCAyXjQKICAgIHkgPSAoeSAqICgyIC0gKHhsICYgMHhmZikgKiB5KSkgJiAweGZmOyAvLyB5ID09IDEveCBtb2QgMl44CiAgICB5ID0gKHkgKiAoMiAtICgoKHhsICYgMHhmZmZmKSAqIHkpICYgMHhmZmZmKSkpICYgMHhmZmZmOwogICAgLy8geSA9PSAxL3ggbW9kIDJeMTYKICAgIHkgPSAoeSAqICgyIC0gKCh4bCAqIHkpICYgMHhmZmZmZmZmZikpKSAmIDB4ZmZmZmZmZmY7IC8vIHkgPT0gMS94IG1vZCAyXjMyCiAgICB2YXIgeCA9IChhcmdzW194SGlnaERpZ2l0XSA8PCBfQmlnSW50SW1wbC5fZGlnaXRCaXRzKSB8IHhsOwogICAgeSAqPSAyIC0geCAqIHk7IC8vIE1hc2tpbmcgd2l0aCAyXjY0LTEgaXMgaW1wbGllZCBieSA2NC1iaXQgYXJpdGhtZXRpYy4KICAgIC8vIHkgPT0gMS94IG1vZCBfZGlnaXRCYXNlXjIKICAgIHkgPSAteTsgLy8gV2UgcmVhbGx5IHdhbnQgdGhlIG5lZ2F0aXZlIGludmVyc2UuCiAgICBhcmdzW19yaG9EaWdpdF0gPSB5ICYgX0JpZ0ludEltcGwuX2RpZ2l0TWFzazsKICAgIGFyZ3NbX3Job0hpZ2hEaWdpdF0gPQogICAgICAgICh5ID4+IF9CaWdJbnRJbXBsLl9kaWdpdEJpdHMpICYgX0JpZ0ludEltcGwuX2RpZ2l0TWFzazsKICAgIGFzc2VydCh4ICogeSA9PSAtMSk7CiAgfQoKICAvLyBPcGVyYXRpb246CiAgLy8gICBhcmdzW19tdURpZ2l0XSA9IGFyZ3NbX3Job0RpZ2l0XSpkaWdpdHNbaV0gbW9kIF9kaWdpdEJhc2UuCiAgLy8gICBSZXR1cm5zIDEuCiAgLy8gTm90ZTogSW50cmluc2ljcyBvbiA2NC1iaXQgcGxhdGZvcm1zIHByb2Nlc3MgZGlnaXQgcGFpcnMgYXQgZXZlbiBpbmRpY2VzOgogIC8vICAgYXJnc1tfbXVEaWdpdC4uX211SGlnaERpZ2l0XSA9CiAgLy8gICAgIGFyZ3NbX3Job0RpZ2l0Li5fcmhvSGlnaERpZ2l0XSAqIGRpZ2l0c1tpLi5pKzFdIG1vZCBfZGlnaXRCYXNlXjIuCiAgLy8gICBSZXR1cm5zIDIuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIHN0YXRpYyBpbnQgX211bE1vZChVaW50MzJMaXN0IGFyZ3MsIFVpbnQzMkxpc3QgZGlnaXRzLCBpbnQgaSkgewogICAgdmFyIHJob2wgPSBhcmdzW19yaG9EaWdpdF0gJiBfQmlnSW50SW1wbC5faGFsZkRpZ2l0TWFzazsKICAgIHZhciByaG9oID0gYXJnc1tfcmhvRGlnaXRdID4+IF9CaWdJbnRJbXBsLl9oYWxmRGlnaXRCaXRzOwogICAgdmFyIGRoID0gZGlnaXRzW2ldID4+IF9CaWdJbnRJbXBsLl9oYWxmRGlnaXRCaXRzOwogICAgdmFyIGRsID0gZGlnaXRzW2ldICYgX0JpZ0ludEltcGwuX2hhbGZEaWdpdE1hc2s7CiAgICBhcmdzW19tdURpZ2l0XSA9IChkbCAqIHJob2wgKwogICAgICAgICAgICAoKChkbCAqIHJob2ggKyBkaCAqIHJob2wpICYgX0JpZ0ludEltcGwuX2hhbGZEaWdpdE1hc2spIDw8CiAgICAgICAgICAgICAgICBfQmlnSW50SW1wbC5faGFsZkRpZ2l0Qml0cykpICYKICAgICAgICBfQmlnSW50SW1wbC5fZGlnaXRNYXNrOwogICAgcmV0dXJuIDE7CiAgfQoKICAvLyByZXN1bHQgPSB4KlIgbW9kIF9tb2R1bHVzLgogIC8vIFJldHVybnMgcmVzdWx0VXNlZC4KICBpbnQgX2NvbnZlcnQoX0JpZ0ludEltcGwgeCwgVWludDMyTGlzdCByZXN1bHREaWdpdHMpIHsKICAgIC8vIE1vbnRnb21lcnkgcmVkdWN0aW9uIG9ubHkgd29ya3MgaWYgYWJzKHgpIDwgX21vZHVsdXMuCiAgICBhc3NlcnQoeC5hYnMoKSA8IF9tb2R1bHVzKTsKICAgIGFzc2VydChfZGlnaXRzUGVyU3RlcCA9PSAxIHx8IF9ub3JtTW9kdWx1c1VzZWQuaXNFdmVuKTsKICAgIHZhciByZXN1bHQgPSB4LmFicygpLl9kbFNoaWZ0KF9ub3JtTW9kdWx1c1VzZWQpLl9yZW0oX21vZHVsdXMpOwogICAgaWYgKHguX2lzTmVnYXRpdmUgJiYgIXJlc3VsdC5faXNOZWdhdGl2ZSAmJiByZXN1bHQuX3VzZWQgPiAwKSB7CiAgICAgIHJlc3VsdCA9IF9tb2R1bHVzIC0gcmVzdWx0OwogICAgfQogICAgdmFyIHVzZWQgPSByZXN1bHQuX3VzZWQ7CiAgICB2YXIgZGlnaXRzID0gcmVzdWx0Ll9kaWdpdHM7CiAgICB2YXIgaSA9IHVzZWQgKyAodXNlZCAmIDEpOwogICAgd2hpbGUgKC0taSA+PSAwKSB7CiAgICAgIHJlc3VsdERpZ2l0c1tpXSA9IGRpZ2l0c1tpXTsKICAgIH0KICAgIHJldHVybiB1c2VkOwogIH0KCiAgX0JpZ0ludEltcGwgX3JldmVydChVaW50MzJMaXN0IHhEaWdpdHMsIGludCB4VXNlZCkgewogICAgLy8gUmVzZXJ2ZSBlbm91Z2ggZGlnaXRzIGZvciBtb2R1bHVzIHNxdWFyaW5nIGFuZCBhY2N1bXVsYXRvciBjYXJyeS4KICAgIHZhciByZXN1bHREaWdpdHMgPSBfbmV3RGlnaXRzKDIgKiBfbm9ybU1vZHVsdXNVc2VkICsgMik7CiAgICB2YXIgaSA9IHhVc2VkICsgKHhVc2VkICYgMSk7CiAgICB3aGlsZSAoLS1pID49IDApIHsKICAgICAgcmVzdWx0RGlnaXRzW2ldID0geERpZ2l0c1tpXTsKICAgIH0KICAgIHZhciByZXN1bHRVc2VkID0gX3JlZHVjZShyZXN1bHREaWdpdHMsIHhVc2VkKTsKICAgIHJldHVybiBuZXcgX0JpZ0ludEltcGwuXyhmYWxzZSwgcmVzdWx0VXNlZCwgcmVzdWx0RGlnaXRzKTsKICB9CgogIC8vIHggPSB4L1IgbW9kIF9tb2R1bHVzLgogIC8vIFJldHVybnMgeFVzZWQuCiAgaW50IF9yZWR1Y2UoVWludDMyTGlzdCB4RGlnaXRzLCBpbnQgeFVzZWQpIHsKICAgIHdoaWxlICh4VXNlZCA8IDIgKiBfbm9ybU1vZHVsdXNVc2VkICsgMikgewogICAgICAvLyBQYWQgeCBzbyBfbXVsQWRkIGhhcyBlbm91Z2ggcm9vbSBsYXRlciBmb3IgYSBwb3NzaWJsZSBjYXJyeS4KICAgICAgeERpZ2l0c1t4VXNlZCsrXSA9IDA7CiAgICB9CiAgICB2YXIgaSA9IDA7CiAgICB3aGlsZSAoaSA8IF9ub3JtTW9kdWx1c1VzZWQpIHsKICAgICAgdmFyIGQgPSBfbXVsTW9kKF9hcmdzLCB4RGlnaXRzLCBpKTsKICAgICAgYXNzZXJ0KGQgPT0gX2RpZ2l0c1BlclN0ZXApOwogICAgICBkID0gX0JpZ0ludEltcGwuX211bEFkZCgKICAgICAgICAgIF9hcmdzLCBfbXVEaWdpdCwgX21vZHVsdXNEaWdpdHMsIDAsIHhEaWdpdHMsIGksIF9ub3JtTW9kdWx1c1VzZWQpOwogICAgICBhc3NlcnQoZCA9PSBfZGlnaXRzUGVyU3RlcCk7CiAgICAgIGkgKz0gZDsKICAgIH0KICAgIC8vIENsYW1wIHguCiAgICB3aGlsZSAoeFVzZWQgPiAwICYmIHhEaWdpdHNbeFVzZWQgLSAxXSA9PSAwKSB7CiAgICAgIC0teFVzZWQ7CiAgICB9CiAgICB4VXNlZCA9IF9CaWdJbnRJbXBsLl9kclNoaWZ0RGlnaXRzKHhEaWdpdHMsIHhVc2VkLCBpLCB4RGlnaXRzKTsKICAgIGlmIChfQmlnSW50SW1wbC5fY29tcGFyZURpZ2l0cygKICAgICAgICAgICAgeERpZ2l0cywgeFVzZWQsIF9tb2R1bHVzRGlnaXRzLCBfbm9ybU1vZHVsdXNVc2VkKSA+PQogICAgICAgIDApIHsKICAgICAgX0JpZ0ludEltcGwuX2Fic1N1YigKICAgICAgICAgIHhEaWdpdHMsIHhVc2VkLCBfbW9kdWx1c0RpZ2l0cywgX25vcm1Nb2R1bHVzVXNlZCwgeERpZ2l0cyk7CiAgICB9CiAgICAvLyBDbGFtcCB4LgogICAgd2hpbGUgKHhVc2VkID4gMCAmJiB4RGlnaXRzW3hVc2VkIC0gMV0gPT0gMCkgewogICAgICAtLXhVc2VkOwogICAgfQogICAgcmV0dXJuIHhVc2VkOwogIH0KCiAgaW50IF9zcXIoVWludDMyTGlzdCB4RGlnaXRzLCBpbnQgeFVzZWQsIFVpbnQzMkxpc3QgcmVzdWx0RGlnaXRzKSB7CiAgICB2YXIgcmVzdWx0VXNlZCA9IF9CaWdJbnRJbXBsLl9zcXJEaWdpdHMoeERpZ2l0cywgeFVzZWQsIHJlc3VsdERpZ2l0cyk7CiAgICByZXR1cm4gX3JlZHVjZShyZXN1bHREaWdpdHMsIHJlc3VsdFVzZWQpOwogIH0KCiAgaW50IF9tdWwoVWludDMyTGlzdCB4RGlnaXRzLCBpbnQgeFVzZWQsIFVpbnQzMkxpc3QgeURpZ2l0cywgaW50IHlVc2VkLAogICAgICBVaW50MzJMaXN0IHJlc3VsdERpZ2l0cykgewogICAgdmFyIHJlc3VsdFVzZWQgPQogICAgICAgIF9CaWdJbnRJbXBsLl9tdWxEaWdpdHMoeERpZ2l0cywgeFVzZWQsIHlEaWdpdHMsIHlVc2VkLCByZXN1bHREaWdpdHMpOwogICAgcmV0dXJuIF9yZWR1Y2UocmVzdWx0RGlnaXRzLCByZXN1bHRVc2VkKTsKICB9Cn0KCi8vIE1vZHVsYXIgcmVkdWN0aW9uIHVzaW5nICJjbGFzc2ljIiBhbGdvcml0aG0uCmNsYXNzIF9CaWdJbnRDbGFzc2ljUmVkdWN0aW9uIGltcGxlbWVudHMgX0JpZ0ludFJlZHVjdGlvbiB7CiAgZmluYWwgX0JpZ0ludEltcGwgX21vZHVsdXM7IC8vIE1vZHVsdXMuCiAgaW50IF9ub3JtTW9kdWx1c1VzZWQ7CiAgX0JpZ0ludEltcGwgX25vcm1Nb2R1bHVzOyAvLyBOb3JtYWxpemVkIF9tb2R1bHVzLgogIFVpbnQzMkxpc3QgX25vcm1Nb2R1bHVzRGlnaXRzOwogIFVpbnQzMkxpc3QgX25lZ05vcm1Nb2R1bHVzRGlnaXRzOyAvLyBOZWdhdGVkIF9ub3JtTW9kdWx1cyBkaWdpdHMuCiAgaW50IF9tb2R1bHVzTnNoOyAvLyBOb3JtYWxpemF0aW9uIHNoaWZ0IGFtb3VudC4KICBVaW50MzJMaXN0IF9hcmdzOyAvLyBUb3AgX25vcm1Nb2R1bHVzIGRpZ2l0KHMpIGFuZCBwbGFjZSBob2xkZXIgZm9yIGVzdGltYXRlZAogIC8vIHF1b3RpZW50IGRpZ2l0KHMpLgogIFVpbnQzMkxpc3QgX3RtcERpZ2l0czsgLy8gVGVtcG9yYXJ5IGRpZ2l0cyB1c2VkIGR1cmluZyByZWR1Y3Rpb24uCgogIF9CaWdJbnRDbGFzc2ljUmVkdWN0aW9uKHRoaXMuX21vZHVsdXMpIHsKICAgIC8vIFByZXByb2Nlc3MgYXJndW1lbnRzIHRvIF9yZW1EaWdpdHMuCiAgICB2YXIgbnNoID0KICAgICAgICBfQmlnSW50SW1wbC5fZGlnaXRCaXRzIC0gX21vZHVsdXMuX2RpZ2l0c1tfbW9kdWx1cy5fdXNlZCAtIDFdLmJpdExlbmd0aDsKICAgIC8vIEZvciA2NC1iaXQgcHJvY2Vzc2luZywgbWFrZSBzdXJlIF9uZWdOb3JtTW9kdWx1c0RpZ2l0cyBoYXMgYW4gZXZlbiBudW1iZXIKICAgIC8vIG9mIGRpZ2l0cy4KICAgIGlmIChfbW9kdWx1cy5fdXNlZC5pc09kZCkgewogICAgICBuc2ggKz0gX0JpZ0ludEltcGwuX2RpZ2l0Qml0czsKICAgIH0KICAgIF9tb2R1bHVzTnNoID0gbnNoOwogICAgX25vcm1Nb2R1bHVzID0gX21vZHVsdXMgPDwgbnNoOwogICAgX25vcm1Nb2R1bHVzVXNlZCA9IF9ub3JtTW9kdWx1cy5fdXNlZDsKICAgIF9ub3JtTW9kdWx1c0RpZ2l0cyA9IF9ub3JtTW9kdWx1cy5fZGlnaXRzOwogICAgYXNzZXJ0KF9ub3JtTW9kdWx1c1VzZWQuaXNFdmVuKTsKICAgIF9hcmdzID0gX25ld0RpZ2l0cyg0KTsKICAgIF9hcmdzW19CaWdJbnRJbXBsLl9kaXZpc29yTG93VG9wRGlnaXRdID0KICAgICAgICBfbm9ybU1vZHVsdXNEaWdpdHNbX25vcm1Nb2R1bHVzVXNlZCAtIDJdOwogICAgX2FyZ3NbX0JpZ0ludEltcGwuX2Rpdmlzb3JUb3BEaWdpdF0gPQogICAgICAgIF9ub3JtTW9kdWx1c0RpZ2l0c1tfbm9ybU1vZHVsdXNVc2VkIC0gMV07CiAgICAvLyBOZWdhdGUgX25vcm1Nb2R1bHVzIHNvIHdlIGNhbiB1c2UgX211bEFkZCBpbnN0ZWFkIG9mCiAgICAvLyB1bmltcGxlbWVudGVkICBfbXVsU3ViLgogICAgdmFyIG5lZ05vcm1Nb2R1bHVzID0KICAgICAgICBfQmlnSW50SW1wbC5vbmUuX2RsU2hpZnQoX25vcm1Nb2R1bHVzVXNlZCkgLSBfbm9ybU1vZHVsdXM7CiAgICBpZiAobmVnTm9ybU1vZHVsdXMuX3VzZWQgPCBfbm9ybU1vZHVsdXNVc2VkKSB7CiAgICAgIF9uZWdOb3JtTW9kdWx1c0RpZ2l0cyA9IF9CaWdJbnRJbXBsLl9jbG9uZURpZ2l0cygKICAgICAgICAgIG5lZ05vcm1Nb2R1bHVzLl9kaWdpdHMsIDAsIF9ub3JtTW9kdWx1c1VzZWQsIF9ub3JtTW9kdWx1c1VzZWQpOwogICAgfSBlbHNlIHsKICAgICAgX25lZ05vcm1Nb2R1bHVzRGlnaXRzID0gbmVnTm9ybU1vZHVsdXMuX2RpZ2l0czsKICAgIH0KICAgIC8vIF9uZWdOb3JtTW9kdWx1c0RpZ2l0cyBpcyByZWFkLW9ubHkgYW5kIGhhcyBfbm9ybU1vZHVsdXNVc2VkIGRpZ2l0cyAocG9zc2libHkKICAgIC8vIGluY2x1ZGluZyBzZXZlcmFsIGxlYWRpbmcgemVyb3MpIHBsdXMgYSBsZWFkaW5nIHplcm8gZm9yIDY0LWJpdAogICAgLy8gcHJvY2Vzc2luZy4KICAgIF90bXBEaWdpdHMgPSBfbmV3RGlnaXRzKDIgKiBfbm9ybU1vZHVsdXNVc2VkKTsKICB9CgogIGludCBfY29udmVydChfQmlnSW50SW1wbCB4LCBVaW50MzJMaXN0IHJlc3VsdERpZ2l0cykgewogICAgdmFyIGRpZ2l0czsKICAgIHZhciB1c2VkOwogICAgaWYgKHguX2lzTmVnYXRpdmUgfHwgeC5fYWJzQ29tcGFyZShfbW9kdWx1cykgPj0gMCkgewogICAgICB2YXIgcmVtYWluZGVyID0geC5fcmVtKF9tb2R1bHVzKTsKICAgICAgaWYgKHguX2lzTmVnYXRpdmUgJiYgcmVtYWluZGVyLl91c2VkID4gMCkgewogICAgICAgIGFzc2VydChyZW1haW5kZXIuX2lzTmVnYXRpdmUpOwogICAgICAgIHJlbWFpbmRlciArPSBfbW9kdWx1czsKICAgICAgfQogICAgICBhc3NlcnQoIXJlbWFpbmRlci5faXNOZWdhdGl2ZSk7CiAgICAgIHVzZWQgPSByZW1haW5kZXIuX3VzZWQ7CiAgICAgIGRpZ2l0cyA9IHJlbWFpbmRlci5fZGlnaXRzOwogICAgfSBlbHNlIHsKICAgICAgdXNlZCA9IHguX3VzZWQ7CiAgICAgIGRpZ2l0cyA9IHguX2RpZ2l0czsKICAgIH0KICAgIHZhciBpID0gdXNlZCArICh1c2VkICYgMSk7IC8vIENvcHkgbGVhZGluZyB6ZXJvIGlmIGFueS4KICAgIHdoaWxlICgtLWkgPj0gMCkgewogICAgICByZXN1bHREaWdpdHNbaV0gPSBkaWdpdHNbaV07CiAgICB9CiAgICByZXR1cm4gdXNlZDsKICB9CgogIF9CaWdJbnRJbXBsIF9yZXZlcnQoVWludDMyTGlzdCB4RGlnaXRzLCBpbnQgeFVzZWQpIHsKICAgIHJldHVybiBuZXcgX0JpZ0ludEltcGwuXyhmYWxzZSwgeFVzZWQsIHhEaWdpdHMpOwogIH0KCiAgaW50IF9yZWR1Y2UoVWludDMyTGlzdCB4RGlnaXRzLCBpbnQgeFVzZWQpIHsKICAgIGlmICh4VXNlZCA8IF9tb2R1bHVzLl91c2VkKSB7CiAgICAgIHJldHVybiB4VXNlZDsKICAgIH0KICAgIC8vIFRoZSBmdW5jdGlvbiBfQmlnSW50SW1wbC5fcmVtRGlnaXRzKC4uLikgaXMgb3B0aW1pemVkIGZvciByZWR1Y3Rpb24gYW5kCiAgICAvLyBlcXVpdmFsZW50IHRvIGNhbGxpbmcKICAgIC8vICdjb252ZXJ0KHJldmVydCh4RGlnaXRzLCB4VXNlZCkuX3JlbShfbm9ybU1vZHVsdXMpLCB4RGlnaXRzKTsnCiAgICByZXR1cm4gX0JpZ0ludEltcGwuX3JlbURpZ2l0cygKICAgICAgICB4RGlnaXRzLAogICAgICAgIHhVc2VkLAogICAgICAgIF9ub3JtTW9kdWx1c0RpZ2l0cywKICAgICAgICBfbm9ybU1vZHVsdXNVc2VkLAogICAgICAgIF9uZWdOb3JtTW9kdWx1c0RpZ2l0cywKICAgICAgICBfbW9kdWx1c05zaCwKICAgICAgICBfYXJncywKICAgICAgICBfdG1wRGlnaXRzLAogICAgICAgIHhEaWdpdHMpOwogIH0KCiAgaW50IF9zcXIoVWludDMyTGlzdCB4RGlnaXRzLCBpbnQgeFVzZWQsIFVpbnQzMkxpc3QgcmVzdWx0RGlnaXRzKSB7CiAgICB2YXIgcmVzdWx0VXNlZCA9IF9CaWdJbnRJbXBsLl9zcXJEaWdpdHMoeERpZ2l0cywgeFVzZWQsIHJlc3VsdERp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bGVfZG91YmxlRnJvbUludGVnZXIiOwoKICBpbnQgZ2V0IGhhc2hDb2RlIG5hdGl2ZSAiRG91YmxlX2hhc2hDb2RlIjsKICBpbnQgZ2V0IF9pZGVudGl0eUhhc2hDb2RlIG5hdGl2ZSAiRG91YmxlX2hhc2hDb2RlIjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRG91YmxlKQogIGRvdWJsZSBvcGVyYXRvciArKG51bSBvdGhlcikgewogICAgcmV0dXJuIF9hZGQob3RoZXIudG9Eb3VibGUoKSk7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9Eb3VibGUpCiAgZG91YmxlIF9hZGQoZG91YmxlIG90aGVyKSBuYXRpdmUgIkRvdWJsZV9hZGQiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9Eb3VibGUpCiAgZG91YmxlIG9wZXJhdG9yIC0obnVtIG90aGVyKSB7CiAgICByZXR1cm4gX3N1YihvdGhlci50b0RvdWJsZSgpKTsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0RvdWJsZSkKICBkb3VibGUgX3N1Yihkb3VibGUgb3RoZXIpIG5hdGl2ZSAiRG91YmxlX3N1YiI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0RvdWJsZSkKICBkb3VibGUgb3BlcmF0b3IgKihudW0gb3RoZXIpIHsKICAgIHJldHVybiBfbXVsKG90aGVyLnRvRG91YmxlKCkpOwogIH0KCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRG91YmxlKQogIGRvdWJsZSBfbXVsKGRvdWJsZSBvdGhlcikgbmF0aXZlICJEb3VibGVfbXVsIjsKCiAgaW50IG9wZXJhdG9yIH4vKG51bSBvdGhlcikgewogICAgcmV0dXJuIF90cnVuY19kaXYob3RoZXIudG9Eb3VibGUoKSk7CiAgfQoKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIGludCBfdHJ1bmNfZGl2KGRvdWJsZSBvdGhlcikgbmF0aXZlICJEb3VibGVfdHJ1bmNfZGl2IjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRG91YmxlKQogIGRvdWJsZSBvcGVyYXRvciAvKG51bSBvdGhlcikgewogICAgcmV0dXJuIF9kaXYob3RoZXIudG9Eb3VibGUoKSk7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9Eb3VibGUpCiAgZG91YmxlIF9kaXYoZG91YmxlIG90aGVyKSBuYXRpdmUgIkRvdWJsZV9kaXYiOwoKICBkb3VibGUgb3BlcmF0b3IgJShudW0gb3RoZXIpIHsKICAgIHJldHVybiBfbW9kdWxvKG90aGVyLnRvRG91YmxlKCkpOwogIH0KCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRG91YmxlKQogIGRvdWJsZSBfbW9kdWxvKGRvdWJsZSBvdGhlcikgbmF0aXZlICJEb3VibGVfbW9kdWxvIjsKCiAgZG91YmxlIHJlbWFpbmRlcihudW0gb3RoZXIpIHsKICAgIHJldHVybiBfcmVtYWluZGVyKG90aGVyLnRvRG91YmxlKCkpOwogIH0KCiAgZG91YmxlIF9yZW1haW5kZXIoZG91YmxlIG90aGVyKSBuYXRpdmUgIkRvdWJsZV9yZW1haW5kZXIiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9Eb3VibGUpCiAgZG91YmxlIG9wZXJhdG9yIC0oKSBuYXRpdmUgIkRvdWJsZV9mbGlwU2lnbkJpdCI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgcmV0dXJuIChvdGhlciBpcyBudW0pICYmIF9lcXVhbChvdGhlci50b0RvdWJsZSgpKTsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKICBib29sIF9lcXVhbChkb3VibGUgb3RoZXIpIG5hdGl2ZSAiRG91YmxlX2VxdWFsIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBfZXF1YWxUb0ludGVnZXIoaW50IG90aGVyKSBuYXRpdmUgIkRvdWJsZV9lcXVhbFRvSW50ZWdlciI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKICBib29sIG9wZXJhdG9yIDwobnVtIG90aGVyKSB7CiAgICByZXR1cm4gb3RoZXIgPiB0aGlzOwogIH0KCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgb3BlcmF0b3IgPihudW0gb3RoZXIpIHsKICAgIHJldHVybiBfZ3JlYXRlclRoYW4ob3RoZXIudG9Eb3VibGUoKSk7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBfZ3JlYXRlclRoYW4oZG91YmxlIG90aGVyKSBuYXRpdmUgIkRvdWJsZV9ncmVhdGVyVGhhbiI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKICBib29sIG9wZXJhdG9yID49KG51bSBvdGhlcikgewogICAgcmV0dXJuICh0aGlzID09IG90aGVyKSB8fCAodGhpcyA+IG90aGVyKTsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKICBib29sIG9wZXJhdG9yIDw9KG51bSBvdGhlcikgewogICAgcmV0dXJuICh0aGlzID09IG90aGVyKSB8fCAodGhpcyA8IG90aGVyKTsKICB9CgogIGRvdWJsZSBfYWRkRnJvbUludGVnZXIoaW50IG90aGVyKSB7CiAgICByZXR1cm4gbmV3IF9Eb3VibGUuZnJvbUludGVnZXIob3RoZXIpLl9hZGQodGhpcyk7CiAgfQoKICBkb3VibGUgX3N1YkZyb21JbnRlZ2VyKGludCBvdGhlcikgewogICAgcmV0dXJuIG5ldyBfRG91YmxlLmZyb21JbnRlZ2VyKG90aGVyKS5fc3ViKHRoaXMpOwogIH0KCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19Eb3VibGUiKQogIGRvdWJsZSBfbXVsRnJvbUludGVnZXIoaW50IG90aGVyKSB7CiAgICByZXR1cm4gbmV3IF9Eb3VibGUuZnJvbUludGVnZXIob3RoZXIpLl9tdWwodGhpcyk7CiAgfQoKICBpbnQgX3RydW5jRGl2RnJvbUludGVnZXIoaW50IG90aGVyKSB7CiAgICByZXR1cm4gbmV3IF9Eb3VibGUuZnJvbUludGVnZXIob3RoZXIpLl90cnVuY19kaXYodGhpcyk7CiAgfQoKICBkb3VibGUgX21vZHVsb0Zyb21JbnRlZ2VyKGludCBvdGhlcikgewogICAgcmV0dXJuIG5ldyBfRG91YmxlLmZyb21JbnRlZ2VyKG90aGVyKS5fbW9kdWxvKHRoaXMpOwogIH0KCiAgZG91YmxlIF9yZW1haW5kZXJGcm9tSW50ZWdlcihpbnQgb3RoZXIpIHsKICAgIHJldHVybiBuZXcgX0RvdWJsZS5mcm9tSW50ZWdlcihvdGhlcikuX3JlbWFpbmRlcih0aGlzKTsKICB9CgogIGJvb2wgX2dyZWF0ZXJUaGFuRnJvbUludGVnZXIoaW50IG90aGVyKQogICAgICBuYXRpdmUgIkRvdWJsZV9ncmVhdGVyVGhhbkZyb21JbnRlZ2VyIjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgZ2V0IGlzTmVnYXRpdmUgbmF0aXZlICJEb3VibGVfZ2V0SXNOZWdhdGl2ZSI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgZ2V0IGlzSW5maW5pdGUgbmF0aXZlICJEb3VibGVfZ2V0SXNJbmZpbml0ZSI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgZ2V0IGlzTmFOIG5hdGl2ZSAiRG91YmxlX2dldElzTmFOIjsKICBib29sIGdldCBpc0Zpbml0ZSA9PiAhaXNJbmZpbml0ZSAmJiAhaXNOYU47IC8vIENhbiBiZSBvcHRpbWl6ZWQuCgogIGRvdWJsZSBhYnMoKSB7CiAgICAvLyBIYW5kbGUgbmVnYXRpdmUgMC4wLgogICAgaWYgKHRoaXMgPT0gMC4wKSByZXR1cm4gMC4wOwogICAgcmV0dXJuIHRoaXMgPCAwLjAgPyAtdGhpcyA6IHRoaXM7CiAgfQoKICBkb3VibGUgZ2V0IHNpZ24gewogICAgaWYgKHRoaXMgPiAwLjApIHJldHVybiAxLjA7CiAgICBpZiAodGhpcyA8IDAuMCkgcmV0dXJuIC0xLjA7CiAgICByZXR1cm4gdGhpczsgLy8gKy8tMC4wIG9yIE5hTi4KICB9CgogIGludCByb3VuZCgpID0+IHJvdW5kVG9Eb3VibGUoKS50b0ludCgpOwogIGludCBmbG9vcigpID0+IGZsb29yVG9Eb3VibGUoKS50b0ludCgpOwogIGludCBjZWlsKCkgPT4gY2VpbFRvRG91YmxlKCkudG9JbnQoKTsKICBpbnQgdHJ1bmNhdGUoKSA9PiB0cnVuY2F0ZVRvRG91YmxlKCkudG9JbnQoKTsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRG91YmxlKQogIGRvdWJsZSByb3VuZFRvRG91YmxlKCkgbmF0aXZlICJEb3VibGVfcm91bmQiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0RvdWJsZSkKICBkb3VibGUgZmxvb3JUb0RvdWJsZSgpIG5hdGl2ZSAiRG91YmxlX2Zsb29yIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9Eb3VibGUpCiAgZG91YmxlIGNlaWxUb0RvdWJsZSgpIG5hdGl2ZSAiRG91YmxlX2NlaWwiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0RvdWJsZSkKICBkb3VibGUgdHJ1bmNhdGVUb0RvdWJsZSgpIG5hdGl2ZSAiRG91YmxlX3RydW5jYXRlIjsKCiAgbnVtIGNsYW1wKG51bSBsb3dlckxpbWl0LCBudW0gdXBwZXJMaW1pdCkgewogICAgaWYgKGxvd2VyTGltaXQgaXMhIG51bSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZShsb3dlckxpbWl0LCAibG93ZXJMaW1pdCIsICJub3QgYSBudW1iZXIiKTsKICAgIH0KICAgIGlmICh1cHBlckxpbWl0IGlzISBudW0pIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUodXBwZXJMaW1pdCwgInVwcGVyTGltaXQiLCAibm90IGEgbnVtYmVyIik7CiAgICB9CgogICAgaWYgKGxvd2VyTGltaXQuY29tcGFyZVRvKHVwcGVyTGltaXQpID4gMCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihsb3dlckxpbWl0KTsKICAgIH0KICAgIGlmIChsb3dlckxpbWl0LmlzTmFOKSByZXR1cm4gbG93ZXJMaW1pdDsKICAgIGlmICh0aGlzLmNvbXBhcmVUbyhsb3dlckxpbWl0KSA8IDApIHJldHVybiBsb3dlckxpbWl0OwogICAgaWYgKHRoaXMuY29tcGFyZVRvKHVwcGVyTGltaXQpID4gMCkgcmV0dXJuIHVwcGVyTGltaXQ7CiAgICByZXR1cm4gdGhpczsKICB9CgogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgaW50IHRvSW50KCkgbmF0aXZlICJEb3VibGVfdG9JbnQiOwoKICBkb3VibGUgdG9Eb3VibGUoKSB7CiAgICByZXR1cm4gdGhpczsKICB9CgogIHN0YXRpYyBjb25zdCBpbnQgQ0FDSEVfU0laRV9MT0cyID0gMzsKICBzdGF0aWMgY29uc3QgaW50IENBQ0hFX0xFTkdUSCA9IDEgPDwgKENBQ0hFX1NJWkVfTE9HMiArIDEpOwogIHN0YXRpYyBjb25zdCBpbnQgQ0FDSEVfTUFTSyA9IENBQ0hFX0xFTkdUSCAtIDE7CiAgLy8gRWFjaCBrZXkgKGRvdWJsZSkgZm9sbG93ZWQgYnkgaXRzIHRvU3RyaW5nIHJlc3VsdC4KICBzdGF0aWMgZmluYWwgTGlzdCBfY2FjaGUgPSBuZXcgTGlzdChDQUNIRV9MRU5HVEgpOwogIHN0YXRpYyBpbnQgX2NhY2hlRXZpY3RJbmRleCA9IDA7CgogIFN0cmluZyBfdG9TdHJpbmcoKSBuYXRpdmUgIkRvdWJsZV90b1N0cmluZyI7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIC8vIFRPRE8oa29kYSk6IENvbnNpZGVyIHN0YXJ0aW5nIGF0IG1vc3QgcmVjZW50bHkgaW5zZXJ0ZWQuCiAgICBmb3IgKGludCBpID0gMDsgaSA8IENBQ0hFX0xFTkdUSDsgaSArPSAyKSB7CiAgICAgIC8vIE5lZWQgJ2lkZW50aWNhbCcgdG8gaGFuZGxlIG5lZ2F0aXZlIHplcm8sIGV0Yy4KICAgICAgaWYgKGlkZW50aWNhbChfY2FjaGVbaV0sIHRoaXMpKSB7CiAgICAgICAgcmV0dXJuIF9jYWNoZVtpICsgMV07CiAgICAgIH0KICAgIH0KICAgIC8vIFRPRE8oa29kYSk6IENvbnNpZGVyIG9wdGltaXppbmcgYWxsIHNtYWxsIGludGVncmFsIHZhbHVlcy4KICAgIGlmIChpZGVudGljYWwoMC4wLCB0aGlzKSkgewogICAgICByZXR1cm4gIjAuMCI7CiAgICB9CiAgICBTdHJpbmcgcmVzdWx0ID0gX3RvU3RyaW5nKCk7CiAgICAvLyBSZXBsYWNlIHRoZSBsZWFzdCByZWNlbnRseSBpbnNlcnRlZCBlbnRyeS4KICAgIF9jYWNoZVtfY2FjaGVFdmljdEluZGV4XSA9IHRoaXM7CiAgICBfY2FjaGVbX2NhY2hlRXZpY3RJbmRleCArIDFdID0gcmVzdWx0OwogICAgX2NhY2hlRXZpY3RJbmRleCA9IChfY2FjaGVFdmljdEluZGV4ICsgMikgJiBDQUNIRV9NQVNLOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIFN0cmluZyB0b1N0cmluZ0FzRml4ZWQoaW50IGZyYWN0aW9uRGlnaXRzKSB7CiAgICAvLyBTZWUgRUNNQVNjcmlwdC0yNjIsIDE1LjcuNC41IGZvciBkZXRhaWxzLgoKICAgIGlmIChmcmFjdGlvbkRpZ2l0cyBpcyEgaW50KSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKAogICAgICAgICAgZnJhY3Rpb25EaWdpdHMsICJmcmFjdGlvbkRpZ2l0cyIsICJub3QgYW4gaW50ZWdlciIpOwogICAgfQogICAgLy8gU3RlcCAyLgogICAgaWYgKGZyYWN0aW9uRGlnaXRzIDwgMCB8fCBmcmFjdGlvbkRpZ2l0cyA+IDIwKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGZyYWN0aW9uRGlnaXRzLCAwLCAyMCwgImZyYWN0aW9uRGlnaXRzIik7CiAgICB9CgogICAgLy8gU3RlcCAzLgogICAgZG91YmxlIHggPSB0aGlzOwoKICAgIC8vIFN0ZXAgNC4KICAgIGlmIChpc05hTikgcmV0dXJuICJOYU4iOwoKICAgIC8vIFN0ZXAgNSBhbmQgNiBza2lwcGVkLiBXaWxsIGJlIGRlYWx0IHdpdGggYnkgbmF0aXZlIGZ1bmN0aW9uLgoKICAgIC8vIFN0ZXAgNy4KICAgIGlmICh4ID49IDFlMjEgfHwgeCA8PSAtMWUyMSkgewogICAgICByZXR1cm4geC50b1N0cmluZygpOwogICAgfQoKICAgIHJldHVybiBfdG9TdHJpbmdBc0ZpeGVkKGZyYWN0aW9uRGlnaXRzKTsKICB9CgogIFN0cmluZyBfdG9TdHJpbmdBc0ZpeGVkKGludCBmcmFjdGlvbkRpZ2l0cykgbmF0aXZlICJEb3VibGVfdG9TdHJpbmdBc0ZpeGVkIjsKCiAgU3RyaW5nIHRvU3RyaW5nQXNFeHBvbmVudGlhbChbaW50IGZyYWN0aW9uRGlnaXRzXSkgewogICAgLy8gU2VlIEVDTUFTY3JpcHQtMjYyLCAxNS43LjQuNiBmb3IgZGV0YWlscy4KCiAgICAvLyBUaGUgRWNtYVNjcmlwdCBzcGVjaWZpY2F0aW9uIGNoZWNrcyBmb3IgTmFOIGFuZCBJbmZpbml0eSBiZWZvcmUgbG9va2luZwogICAgLy8gYXQgdGhlIGZyYWN0aW9uRGlnaXRzLiBJbiBEYXJ0IHdlIGFyZSBjb25zaXN0ZW50IHdpdGggdG9TdHJpbmdBc0ZpeGVkIGFuZAogICAgLy8gbG9vayBhdCB0aGUgZnJhY3Rpb25EaWdpdHMgZmlyc3QuCgogICAgLy8gU3RlcCA3LgogICAgaWYgKGZyYWN0aW9uRGlnaXRzICE9IG51bGwpIHsKICAgICAgaWYgKGZyYWN0aW9uRGlnaXRzIGlzISBpbnQpIHsKICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZSgKICAgICAgICAgICAgZnJhY3Rpb25EaWdpdHMsICJmcmFjdGlvbkRpZ2l0cyIsICJub3QgYW4gaW50ZWdlciIpOwogICAgICB9CiAgICAgIGlmIChmcmFjdGlvbkRpZ2l0cyA8IDAgfHwgZnJhY3Rpb25EaWdpdHMgPiAyMCkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGZyYWN0aW9uRGlnaXRzLCAwLCAyMCwgImZyYWN0aW9uRGlnaXRzIik7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoaXNOYU4pIHJldHVybiAiTmFOIjsKICAgIGlmICh0aGlzID09IGRvdWJsZS5pbmZpbml0eSkgcmV0dXJuICJJbmZpbml0eSI7CiAgICBpZiAodGhpcyA9PSAtZG91YmxlLmluZmluaXR5KSByZXR1cm4gIi1JbmZpbml0eSI7CgogICAgLy8gVGhlIGRhcnQgZnVuY3Rpb24gcHJpbnRzIHRoZSBzaG9ydGVzdCByZXByZXNlbnRhdGlvbiB3aGVuIGZyYWN0aW9uRGlnaXRzCiAgICAvLyBlcXVhbHMgbnVsbC4gVGhlIG5hdGl2ZSBmdW5jdGlvbiB3YW50cyAtMSBpbnN0ZWFkLgogICAgZnJhY3Rpb25EaWdpdHMgPSAoZnJhY3Rpb25EaWdpdHMgPT0gbnVsbCkgPyAtMSA6IGZyYWN0aW9uRGlnaXRzOwoKICAgIHJldHVybiBfdG9TdHJpbmdBc0V4cG9uZW50aWFsKGZyYWN0aW9uRGlnaXRzKTsKICB9CgogIFN0cmluZyBfdG9TdHJpbmdBc0V4cG9uZW50aWFsKGludCBmcmFjdGlvbkRpZ2l0cykKICAgICAgbmF0aXZlICJEb3VibGVfdG9TdHJpbmdBc0V4cG9uZW50aWFsIjsKCiAgU3RyaW5nIHRvU3RyaW5nQXNQcmVjaXNpb24oaW50IHByZWNpc2lvbikgewogICAgLy8gU2VlIEVDTUFTY3JpcHQtMjYyLCAxNS43LjQuNyBmb3IgZGV0YWlscy4KCiAgICAvLyBUaGUgRWNtYVNjcmlwdCBzcGVjaWZpY2F0aW9uIGNoZWNrcyBmb3IgTmFOIGFuZCBJbmZpbml0eSBiZWZvcmUgbG9va2luZwogICAgLy8gYXQgdGhlIGZyYWN0aW9uRGlnaXRzLiBJbiBEYXJ0IHdlIGFyZSBjb25zaXN0ZW50IHdpdGggdG9TdHJpbmdBc0ZpeGVkIGFuZAogICAgLy8gbG9vayBhdCB0aGUgZnJhY3Rpb25EaWdpdHMgZmlyc3QuCgogICAgaWYgKHByZWNpc2lvbiBpcyEgaW50KSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKHByZWNpc2lvbiwgInByZWNpc2lvbiIsICJub3QgYW4gaW50ZWdlciIpOwogICAgfQogICAgLy8gU3RlcCA4LgogICAgaWYgKHByZWNpc2lvbiA8IDEgfHwgcHJlY2lzaW9uID4gMjEpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UocHJlY2lzaW9uLCAxLCAyMSwgInByZWNpc2lvbiIpOwogICAgfQoKICAgIGlmIChpc05hTikgcmV0dXJuICJOYU4iOwogICAgaWYgKHRoaXMgPT0gZG91YmxlLmluZmluaXR5KSByZXR1cm4gIkluZmluaXR5IjsKICAgIGlmICh0aGlzID09IC1kb3VibGUuaW5maW5pdHkpIHJldHVybiAiLUluZmluaXR5IjsKCiAgICByZXR1cm4gX3RvU3RyaW5nQXNQcmVjaXNpb24ocHJlY2lzaW9uKTsKICB9CgogIFN0cmluZyBfdG9TdHJpbmdBc1ByZWNpc2lvbihpbnQgZnJhY3Rpb25EaWdpdHMpCiAgICAgIG5hdGl2ZSAiRG91YmxlX3RvU3RyaW5nQXNQcmVjaXNpb24iOwoKICAvLyBPcmRlciBpczogTmFOID4gSW5maW5pdHkgPiAuLi4gPiAwLjAgPiAtMC4wID4gLi4uID4gLUluZmluaXR5LgogIGludCBjb21wYXJlVG8obnVtIG90aGVyKSB7CiAgICBjb25zdCBpbnQgRVFVQUwgPSAwLCBMRVNTID0gLTEsIEdSRUFURVIgPSAxOwogICAgaWYgKHRoaXMgPCBvdGhlcikgewogICAgICByZXR1cm4gTEVTUzsKICAgIH0gZWxzZSBpZiAodGhpcyA+IG90aGVyKSB7CiAgICAgIHJldHVybiBHUkVBVEVSOwogICAgfSBlbHNlIGlmICh0aGlzID09IG90aGVyKSB7CiAgICAgIGlmICh0aGlzID09IDAuMCkgewogICAgICAgIGJvb2wgdGhpc0lzTmVnYXRpdmUgPSBpc05lZ2F0aXZlOwogICAgICAgIGJvb2wgb3RoZXJJc05lZ2F0aXZlID0gb3RoZXIuaXNOZWdhdGl2ZTsKICAgICAgICBpZiAodGhpc0lzTmVnYXRpdmUgPT0gb3RoZXJJc05lZ2F0aXZlKSB7CiAgICAgICAgICByZXR1cm4gRVFVQUw7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzSXNOZWdhdGl2ZSA/IExFU1MgOiBHUkVBVEVSOwogICAgICB9IGVsc2UgaWYgKG90aGVyIGlzIGludCkgewogICAgICAgIC8vIENvbXBhcmUgYXMgaW50ZWdlcnMgYXMgaXQgaXMgbW9yZSBwcmVjaXNlIGlmIHRoZSBpbnRlZ2VyIHZhbHVlIGlzCiAgICAgICAgLy8gb3V0c2lkZSBvZiBNSU5fRVhBQ1RfSU5UX1RPX0RPVUJMRS4uTUFYX0VYQUNUX0lOVF9UT19ET1VCTEUgcmFuZ2UuCiAgICAgICAgY29uc3QgaW50IE1BWF9FWEFDVF9JTlRfVE9fRE9VQkxFID0gOTAwNzE5OTI1NDc0MDk5MjsgLy8gMl41My4KICAgICAgICBjb25zdCBpbnQgTUlOX0VYQUNUX0lOVF9UT19ET1VCTEUgPSAtTUFYX0VYQUNUX0lOVF9UT19ET1VCTEU7CiAgICAgICAgaWYgKChNSU5fRVhBQ1RfSU5UX1RPX0RPVUJMRSA8PSBvdGhlcikgJiYKICAgICAgICAgICAgKG90aGVyIDw9IE1BWF9FWEFDVF9JTlRfVE9fRE9VQkxFKSkgewogICAgICAgICAgcmV0dXJuIEVRVUFMOwogICAgICAgIH0KICAgICAgICBjb25zdCBib29sIGxpbWl0SW50c1RvNjRCaXRzID0gKCgxIDw8IDY0KSA9PSAwKTsKICAgICAgICBpZiAobGltaXRJbnRzVG82NEJpdHMpIHsKICAgICAgICAgIC8vIFdpdGggaW50ZWdlcnMgbGltaXRlZCB0byA2NCBiaXRzLCBkb3VibGUudG9JbnQoKSBjbGFtcHMKICAgICAgICAgIC8vIGRvdWJsZSB2YWx1ZSB0byBmaXQgaW50byB0aGUgTUlOX0lOVDY0Li5NQVhfSU5UNjQgcmFuZ2UuCiAgICAgICAgICAvLyBNQVhfSU5UNjQgaXMgbm90IHByZWNpc2VseSByZXByZXNlbnRhYmxlIGFzIGRvdWJsZSwgc28KICAgICAgICAgIC8vIGludGVnZXJzIG5lYXIgTUFYX0lOVDY0IGNvbXBhcmUgYXMgZXF1YWwgdG8gKE1BWF9JTlQ2NCArIDEpIHdoZW4KICAgICAgICAgIC8vIHJlcHJlc2VudGVkIGFzIGRvdWJsZXMuCiAgICAgICAgICAvLyBUaGVyZSBpcyBubyBzaW1pbGFyIHByb2JsZW0gd2l0aCBNSU5fSU5UNjQgYXMgaXQgaXMgcHJlY2lzZWx5CiAgICAgICAgICAvLyByZXByZXNlbnRhYmxlIGFzIGRvdWJsZS4KICAgICAgICAgIGNvbnN0IGRvdWJsZSBtYXhJbnQ2NFBsdXMxQXNEb3VibGUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA4LjA7CiAgICAgICAgICBpZiAodGhpcyA+PSBtYXhJbnQ2NFBsdXMxQXNEb3VibGUpIHsKICAgICAgICAgICAgcmV0dXJuIEdSRUFURVI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0b0ludCgpLmNvbXBhcmVUbyhvdGhlcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIEVRVUFMOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzTmFOKSB7CiAgICAgIHJldHVybiBvdGhlci5pc05hTiA/IEVRVUFMIDogR1JFQVRFUjsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE90aGVyIGlzIE5hTi4KICAgICAgcmV0dXJuIExFU1M7CiAgICB9CiAgfQp9CoFkAE5OPAEeARoiK0wBLTYBKyEjBAErMQErISMEASsxASshIwQBKzEBHykEASk6ASshIwQBKzEBISYEASs3ASApBAE9ASszASgjNwQBKDMoQgEoHxkEASgfKwQBKD8BKCAuBAEoIC4EASY2BAEmNgQBNyY2BAEoPAQBKTkEASw8BAEqLgEoNSg1KCtDAREcISYEARQgISMEASoqKDABKzArMCsuKzYBLh5PBh5PBgEwKwYtOzsRBAEpJQEWEQQBKD4yODUjAS8BFkAwOCgeCAZCIBQGITIlKzwTBAEvMQEiJT8GDzVLBgEPFQEPHQFEAQ8jGwYBLQQBTwE3MQFPUSkBDyIkJ0EIN00IBgEdNDYBUDpFATMEATQtAS4xAU9RKQEdTwYPK0EGAR00NgEsBAEyKwFEHTEYEx8WIBkqMTEYCjAhTU5HRjIyGAo5IUVGRE4lSyZGLxwMCikPFggYLA0XEwYEAgEbZGFydDpjb3JlLXBhdGNoL2RvdWJsZS5kYXJ0LW9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvZnVuY3Rpb24uZGFydIcgLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvcmVfcGF0Y2guZGFydCI7CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9DbG9zdXJlIGltcGxlbWVudHMgRnVuY3Rpb24gewogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSBuYXRpdmUgIkNsb3N1cmVfZXF1YWxzIjsKCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICBfaGFzaCA/Pz0gX2NvbXB1dGVIYXNoKCk7CiAgICByZXR1cm4gX2hhc2g7CiAgfQoKICBfQ2xvc3VyZSBnZXQgY2FsbCA9PiB0aGlzOwoKICBfQ2xvc3VyZSBfY2xvbmUoKSBuYXRpdmUgIkNsb3N1cmVfY2xvbmUiOwoKICBpbnQgX2NvbXB1dGVIYXNoKCkgbmF0aXZlICJDbG9zdXJlX2NvbXB1dGVIYXNoIjsKCiAgLy8gTm8gaW5zdGFuY2UgZmllbGRzIHNob3VsZCBiZSBkZWNsYXJlZCBiZWZvcmUgdGhlIGZvbGxvd2luZyBmaWVsZHMgd2hvc2UKICAvLyBvZmZzZXRzIG11c3QgYmUgaWRlbnRpY2FsIGluIERhcnQgYW5kIEMrKy4KCiAgLy8gVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIGRlY2xhcmVkIGJvdGggaW4gcmF3X29iamVjdC5oIChmb3IgZGlyZWN0IGFjY2VzcwogIC8vIGZyb20gQysrIGNvZGUpIGFuZCBhbHNvIGhlcmUgc28gdGhhdCB0aGUgb2Zmc2V0LXRvLWZpZWxkIG1hcCB1c2VkIGJ5CiAgLy8gZGVmZXJyZWQgb2JqZWN0cyBpcyBwcm9wZXJseSBpbml0aWFsaXplZC4KICAvLyBDYXV0aW9uOiBUaGVzZSBmaWVsZHMgYXJlIG5vdCBEYXJ0IGluc3RhbmNlcywgYnV0IFZNIG9iamVjdHMuIFRoZWlyIERhcnQKICAvLyBuYW1lcyBkbyBub3QgbmVlZCB0byBtYXRjaCB0aGUgQysrIG5hbWVzLCBidXQgdGhleSBtdXN0IGJlIHByaXZhdGUuCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIHZhciBfaW5zdGFudGlhdG9yX3R5cGVfYXJndW1lbnRzOwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICB2YXIgX2Z1bmN0aW9uX3R5cGVfYXJndW1lbnRzOwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICB2YXIgX2RlbGF5ZWRfdHlwZV9hcmd1bWVudHM7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIHZhciBfZnVuY3Rpb247CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIHZhciBfY29udGV4dDsKCiAgLy8gTm90ZTogX0Nsb3N1cmUgb2JqZWN0cyBhcmUgY3JlYXRlZCBieSBWTSAibWFnaWNhbGx5Iiwgd2l0aG91dCBpbnZva2luZwogIC8vIGNvbnN0cnVjdG9yLiBTbywgX0Nsb3N1cmUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBuZXZlciBjb21waWxlZCBhbmQKICAvLyBkZXRlY3Rpb24gb2YgZGVmYXVsdC1pbml0aWFsaXplZCBmaWVsZHMgaXMgbm90IHBlcmZvcm1lZC4KICAvLyBBcyBhIGNvbnNlcXVlbmNlLCBWTSBpbmNvcnJlY3RseSBhc3N1bWVzIHRoYXQgX2hhc2ggZmllbGQgaXMgbm90CiAgLy8gbnVsbGFibGUgYW5kIG1heSBpbmNvcnJlY3RseSByZW1vdmUgJ2lmIChfaGFzaCA9PSBudWxsKScgaW4gZ2V0Omhhc2hDb2RlLgogIC8vIFRoaXMgaW5pdGlhbGl6ZXIgbWFrZXMgX2hhc2ggZmllbGQgbnVsbGFibGUgZXZlbiB3aXRob3V0IGNvbnN0cnVjdG9yCiAgLy8gY29tcGlsYXRpb24uCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIHZhciBfaGFzaCA9IG51bGw7Cn0KNABOTjwBHgEaJToBFR4SBAEdASwBMwFNMAFPSi9OSRwkHCAcHxwRHBABTEk/Rk9KEhwUAgEdZGFydDpjb3JlLXBhdGNoL2Z1bmN0aW9uLmRhcnQzb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi9ncm93YWJsZV9hcnJheS5kYXJ0rRIvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0dyb3dhYmxlTGlzdDxUPiBleHRlbmRzIExpc3RCYXNlPFQ+IHsKICB2b2lkIGluc2VydChpbnQgaW5kZXgsIFQgZWxlbWVudCkgewogICAgaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+IGxlbmd0aCkpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoaW5kZXgsIDAsIGxlbmd0aCk7CiAgICB9CiAgICBpZiAoaW5kZXggPT0gdGhpcy5sZW5ndGgpIHsKICAgICAgYWRkKGVsZW1lbnQpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgb2xkTGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICAvLyBXZSBhcmUgbW9kaWZ5aW5nIHRoZSBsZW5ndGgganVzdCBiZWxvdyB0aGUgaXMtY2hlY2suIFdpdGhvdXQgdGhlIGNoZWNrCiAgICAvLyBBcnJheS5jb3B5IGNvdWxkIHRocm93IGFuIGV4Y2VwdGlvbiwgbGVhdmluZyB0aGUgbGlzdCBpbiBhIGJhZCBzdGF0ZQogICAgLy8gKHdpdGggYSBsZW5ndGggdGhhdCBoYXMgYmVlbiBpbmNyZWFzZWQsIGJ1dCB3aXRob3V0IGEgbmV3IGVsZW1lbnQpLgogICAgaWYgKGluZGV4IGlzISBpbnQpIHRocm93IG5ldyBBcmd1bWVudEVycm9yKGluZGV4KTsKICAgIHRoaXMubGVuZ3RoKys7CiAgICBMaXN0cy5jb3B5KHRoaXMsIGluZGV4LCB0aGlzLCBpbmRleCArIDEsIG9sZExlbmd0aCAtIGluZGV4KTsKICAgIHRoaXNbaW5kZXhdID0gZWxlbWVudDsKICB9CgogIFQgcmVtb3ZlQXQoaW50IGluZGV4KSB7CiAgICB2YXIgcmVzdWx0ID0gdGhpc1tpbmRleF07CiAgICBpbnQgbmV3TGVuZ3RoID0gdGhpcy5sZW5ndGggLSAxOwogICAgaWYgKGluZGV4IDwgbmV3TGVuZ3RoKSB7CiAgICAgIExpc3RzLmNvcHkodGhpcywgaW5kZXggKyAxLCB0aGlzLCBpbmRleCwgbmV3TGVuZ3RoIC0gaW5kZXgpOwogICAgfQogICAgdGhpcy5sZW5ndGggPSBuZXdMZW5ndGg7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgYm9vbCByZW1vdmUoT2JqZWN0IGVsZW1lbnQpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykgewogICAgICBpZiAodGhpc1tpXSA9PSBlbGVtZW50KSB7CiAgICAgICAgcmVtb3ZlQXQoaSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIHZvaWQgaW5zZXJ0QWxsKGludCBpbmRleCwgSXRlcmFibGU8VD4gaXRlcmFibGUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoaW5kZXgsIDAsIGxlbmd0aCk7CiAgICB9CiAgICAvLyBUT0RPKGZsb2l0c2NoKTogd2UgY2FuIHByb2JhYmx5IGRldGVjdCBtb3JlIGNhc2VzLgogICAgaWYgKGl0ZXJhYmxlIGlzISBMaXN0ICYmIGl0ZXJhYmxlIGlzISBTZXQgJiYgaXRlcmFibGUgaXMhIFN1Ykxpc3RJdGVyYWJsZSkgewogICAgICBpdGVyYWJsZSA9IGl0ZXJhYmxlLnRvTGlzdCgpOwogICAgfQogICAgaW50IGluc2VydGlvbkxlbmd0aCA9IGl0ZXJhYmxlLmxlbmd0aDsKICAgIC8vIFRoZXJlIG1pZ2h0IGJlIGVycm9ycyBhZnRlciB0aGUgbGVuZ3RoIGNoYW5nZSwgaW4gd2hpY2ggY2FzZSB0aGUgbGlzdAogICAgLy8gd2lsbCBlbmQgdXAgYmVpbmcgbW9kaWZpZWQgYnV0IHRoZSBvcGVyYXRpb24gbm90IGNvbXBsZXRlLiBVbmxlc3Mgd2UKICAgIC8vIGFsd2F5cyBnbyB0aHJvdWdoIGEgInRvTGlzdCIgd2UgY2FuJ3QgcmVhbGx5IGF2b2lkIHRoYXQuCiAgICB0aGlzLmxlbmd0aCArPSBpbnNlcnRpb25MZW5ndGg7CiAgICBzZXRSYW5nZShpbmRleCArIGluc2VydGlvbkxlbmd0aCwgdGhpcy5sZW5ndGgsIHRoaXMsIGluZGV4KTsKICAgIHNldEFsbChpbmRleCwgaXRlcmFibGUpOwogIH0KCiAgdm9pZCBzZXRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxUPiBpdGVyYWJsZSkgewogICAgaWYgKGl0ZXJhYmxlIGlzIExpc3QpIHsKICAgICAgc2V0UmFuZ2UoaW5kZXgsIGluZGV4ICsgaXRlcmFibGUubGVuZ3RoLCBpdGVyYWJsZSk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKFQgZWxlbWVudCBpbiBpdGVyYWJsZSkgewogICAgICAgIHRoaXNbaW5kZXgrK10gPSBlbGVtZW50OwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHJlbW92ZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgTGlzdHMuY29weSh0aGlzLCBlbmQsIHRoaXMsIHN0YXJ0LCB0aGlzLmxlbmd0aCAtIGVuZCk7CiAgICB0aGlzLmxlbmd0aCA9IHRoaXMubGVuZ3RoIC0gKGVuZCAtIHN0YXJ0KTsKICB9CgogIExpc3Q8VD4gc3VibGlzdChpbnQgc3RhcnQsIFtpbnQgZW5kXSkgewogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gPFQ+W107CiAgICBMaXN0IGxpc3QgPSBuZXcgX0xpc3QobGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgbGlzdFtpXSA9IHRoaXNbc3RhcnQgKyBpXTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBuZXcgX0dyb3dhYmxlTGlzdDxUPi53aXRoRGF0YShsaXN0KTsKICAgIHJlc3VsdC5fc2V0TGVuZ3RoKGxlbmd0aCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgZmFjdG9yeSBfR3Jvd2FibGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHZhciBkYXRhID0gX2FsbG9jYXRlRGF0YShsZW5ndGgpOwogICAgdmFyIHJlc3VsdCA9IG5ldyBfR3Jvd2FibGVMaXN0PFQ+LndpdGhEYXRhKGRhdGEpOwogICAgaWYgKGxlbmd0aCA+IDApIHsKICAgICAgcmVzdWx0Ll9zZXRMZW5ndGgobGVuZ3RoKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBmYWN0b3J5IF9Hcm93YWJsZUxpc3Qud2l0aENhcGFjaXR5KGludCBjYXBhY2l0eSkgewogICAgdmFyIGRhdGEgPSBfYWxsb2NhdGVEYXRhKGNhcGFjaXR5KTsKICAgIHJldHVybiBuZXcgX0dyb3dhYmxlTGlzdDxUPi53aXRoRGF0YShkYXRhKTsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0dyb3dhYmxlTGlzdCkKICBmYWN0b3J5IF9Hcm93YWJsZUxpc3Qud2l0aERhdGEoX0xpc3QgZGF0YSkgbmF0aXZlICJHcm93YWJsZUxpc3RfYWxsb2NhdGUiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IGdldCBfY2FwYWNpdHkgbmF0aXZlICJHcm93YWJsZUxpc3RfZ2V0Q2FwYWNpdHkiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IGdldCBsZW5ndGggbmF0aXZlICJHcm93YWJsZUxpc3RfZ2V0TGVuZ3RoIjsKCiAgdm9pZCBzZXQgbGVuZ3RoKGludCBuZXdfbGVuZ3RoKSB7CiAgICBpbnQgb2xkX2NhcGFjaXR5ID0gX2NhcGFjaXR5OwogICAgaW50IG5ld19jYXBhY2l0eSA9IG5ld19sZW5ndGg7CiAgICBpZiAobmV3X2NhcGFjaXR5ID4gb2xkX2NhcGFjaXR5KSB7CiAgICAgIF9ncm93KG5ld19jYXBhY2l0eSk7CiAgICAgIF9zZXRMZW5ndGgobmV3X2xlbmd0aCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIFdlIGFyZSBzaHJpbmtpbmcuIFBpY2sgdGhlIG1ldGhvZCB3aGljaCBoYXMgZmV3ZXIgd3JpdGVzLgogICAgLy8gSW4gdGhlIHNocmluay10by1maXQgcGF0aCwgd2Ugd3JpdGUgfG5ld19jYXBhY2l0eSArIG5ld19sZW5ndGh8IHdvcmRzCiAgICAvLyAobnVsbCBpbml0ICsgY29weSkuCiAgICAvLyBJbiB0aGUgbm9uLXNocmluay10by1maXQgcGF0aCwgd2Ugd3JpdGUgfGxlbmd0aCAtIG5ld19sZW5ndGh8IHdvcmRzCiAgICAvLyAobnVsbCBvdmVyd3JpdGUpLgogICAgZmluYWwgYm9vbCBzaG91bGRTaHJpbmtUb0ZpdCA9CiAgICAgICAgKG5ld19jYXBhY2l0eSArIG5ld19sZW5ndGgpIDwgKGxlbmd0aCAtIG5ld19sZW5ndGgpOwogICAgaWYgKHNob3VsZFNocmlua1RvRml0KSB7CiAgICAgIF9zaHJpbmsobmV3X2NhcGFjaXR5LCBuZXdfbGVuZ3RoKTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoaW50IGkgPSBuZXdfbGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICB0aGlzW2ldID0gbnVsbDsKICAgICAgfQogICAgfQogICAgX3NldExlbmd0aChuZXdfbGVuZ3RoKTsKICB9CgogIHZvaWQgX3NldExlbmd0aChpbnQgbmV3X2xlbmd0aCkgbmF0aXZlICJHcm93YWJsZUxpc3Rfc2V0TGVuZ3RoIjsKCiAgdm9pZCBfc2V0RGF0YShfTGlzdCBhcnJheSkgbmF0aXZlICJHcm93YWJsZUxpc3Rfc2V0RGF0YSI7CgogIFQgb3BlcmF0b3IgW10oaW50IGluZGV4KSBuYXRpdmUgIkdyb3dhYmxlTGlzdF9nZXRJbmRleGVkIjsKCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBUIHZhbHVlKSB7CiAgICBfc2V0SW5kZXhlZChpbmRleCwgdmFsdWUpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZChpbnQgaW5kZXgsIFQgdmFsdWUpIG5hdGl2ZSAiR3Jvd2FibGVMaXN0X3NldEluZGV4ZWQiOwoKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICB2b2lkIGFkZChUIHZhbHVlKSB7CiAgICB2YXIgbGVuID0gbGVuZ3RoOwogICAgaWYgKGxlbiA9PSBfY2FwYWNpdHkpIHsKICAgICAgX2dyb3coX25leHRDYXBhY2l0eShsZW4pKTsKICAgIH0KICAgIF9zZXRMZW5ndGgobGVuICsgMSk7CiAgICB0aGlzW2xlbl0gPSB2YWx1ZTsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPFQ+IGl0ZXJhYmxlKSB7CiAgICB2YXIgbGVuID0gbGVuZ3RoOwogICAgZmluYWwgY2lkID0gQ2xhc3NJRC5nZXRJRChpdGVyYWJsZSk7CiAgICBmaW5hbCBpc1ZNTGlzdCA9IChjaWQgPT0gQ2xhc3NJRC5jaWRBcnJheSkgfHwKICAgICAgICAoY2lkID09IENsYXNzSUQuY2lkR3Jvd2FibGVPYmplY3RBcnJheSkgfHwKICAgICAgICAoY2lkID09IENsYXNzSUQuY2lkSW1tdXRhYmxlQXJyYXkpOwogICAgaWYgKGlzVk1MaXN0IHx8IChpdGVyYWJsZSBpcyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZSkpIHsKICAgICAgdmFyIGNhcCA9IF9jYXBhY2l0eTsKICAgICAgLy8gUHJlZ3JvdyBpZiB3ZSBrbm93IGl0ZXJhYmxlLmxlbmd0aC4KICAgICAgdmFyIGl0ZXJMZW4gPSBpdGVyYWJsZS5sZW5ndGg7CiAgICAgIHZhciBuZXdMZW4gPSBsZW4gKyBpdGVyTGVuOwogICAgICBpZiAobmV3TGVuID4gY2FwKSB7CiAgICAgICAgZG8gewogICAgICAgICAgY2FwID0gX25leHRDYXBhY2l0eShjYXApOwogICAgICAgIH0gd2hpbGUgKG5ld0xlbiA+IGNhcCk7CiAgICAgICAgX2dyb3coY2FwKTsKICAgICAgfQogICAgICBpZiAoaXNWTUxpc3QpIHsKICAgICAgICBpZiAoaWRlbnRpY2FsKGl0ZXJhYmxlLCB0aGlzKSkgewogICAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fc2V0TGVuZ3RoKG5ld0xlbik7CiAgICAgICAgZmluYWwgTGlzdEJhc2U8VD4gaXRlcmFibGVBc0xpc3QgPSBpdGVyYWJsZTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJMZW47IGkrKykgewogICAgICAgICAgdGhpc1tsZW4rK10gPSBpdGVyYWJsZUFzTGlzdFtpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICBJdGVyYXRvciBpdCA9IGl0ZXJhYmxlLml0ZXJhdG9yOwogICAgaWYgKCFpdC5tb3ZlTmV4dCgpKSByZXR1cm47CiAgICBkbyB7CiAgICAgIHdoaWxlIChsZW4gPCBfY2FwYWNpdHkpIHsKICAgICAgICBpbnQgbmV3TGVuID0gbGVuICsgMTsKICAgICAgICB0aGlzLl9zZXRMZW5ndGgobmV3TGVuKTsKICAgICAgICB0aGlzW2xlbl0gPSBpdC5jdXJyZW50OwogICAgICAgIGlmICghaXQubW92ZU5leHQoKSkgcmV0dXJuOwogICAgICAgIGlmICh0aGlzLmxlbmd0aCAhPSBuZXdMZW4pIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgICAgbGVuID0gbmV3TGVuOwogICAgICB9CiAgICAgIF9ncm93KF9uZXh0Q2FwYWNpdHkoX2NhcGFjaXR5KSk7CiAgICB9IHdoaWxlICh0cnVlKTsKICB9CgogIFQgcmVtb3ZlTGFzdCgpIHsKICAgIHZhciBsZW4gPSBsZW5ndGggLSAxOwogICAgdmFyIGVsZW0gPSB0aGlzW2xlbl07CiAgICB0aGlzLmxlbmd0aCA9IGxlbjsKICAgIHJldHVybiBlbGVtOwogIH0KCiAgVCBnZXQgZmlyc3QgewogICAgaWYgKGxlbmd0aCA+IDApIHJldHVybiB0aGlzWzBdOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBUIGdldCBsYXN0IHsKICAgIGlmIChsZW5ndGggPiAwKSByZXR1cm4gdGhpc1tsZW5ndGggLSAxXTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgVCBnZXQgc2luZ2xlIHsKICAgIGlmIChsZW5ndGggPT0gMSkgcmV0dXJuIHRoaXNbMF07CiAgICBpZiAobGVuZ3RoID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogIH0KCiAgLy8gU2hhcmVkIGFycmF5IHVzZWQgYXMgYmFja2luZyBmb3IgbmV3IGVtcHR5IGdyb3dhYmxlIGFycmF5cy4KICBzdGF0aWMgZmluYWwgX0xpc3QgX2VtcHR5TGlzdCA9IG5ldyBfTGlzdCgwKTsKCiAgc3RhdGljIF9MaXN0IF9hbGxvY2F0ZURhdGEoaW50IGNhcGFjaXR5KSB7CiAgICBpZiAoY2FwYWNpdHkgPT0gMCkgewogICAgICAvLyBVc2Ugc2hhcmVkIGVtcHR5IGxpc3QgYXMgYmFja2luZy4KICAgICAgcmV0dXJuIF9lbXB0eUxpc3Q7CiAgICB9CiAgICAvLyBSb3VuZCB1cCBzaXplIHRvIHRoZSBuZXh0IG9kZCBudW1iZXIsIHNpbmNlIHRoaXMgaXMgZnJlZQogICAgLy8gYmVjYXVzZSBvZiBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIG9mIHRoZSBHQy4KICAgIHJldHVybiBuZXcgX0xpc3QoY2FwYWNpdHkgfCAxKTsKICB9CgogIC8vIEdyb3cgZnJvbSAwIHRvIDMsIGFuZCB0aGVuIGRvdWJsZSArIDEuCiAgaW50IF9uZXh0Q2FwYWNpdHkoaW50IG9sZF9jYXBhY2l0eSkgPT4gKG9sZF9jYXBhY2l0eSAqIDIpIHwgMzsKCiAgdm9pZCBfZ3JvdyhpbnQgbmV3X2NhcGFjaXR5KSB7CiAgICB2YXIgbmV3RGF0YSA9IF9hbGxvY2F0ZURhdGEobmV3X2NhcGFjaXR5KTsKICAgIC8vIFRoaXMgaXMgYSB3b3JrLWFyb3VuZCBmb3IgZGFydGJ1Zy5jb20vMzAwOTA6IGFycmF5LWJvdW5kLWNoZWNrCiAgICAvLyBnZW5lcmFsaXphdGlvbiBjYXVzZXMgZXhjZXNzaXZlIGRlb3B0aW1pemF0aW9ucyBiZWNhdXNlIGl0CiAgICAvLyBob2lzdHMgQ2hlY2tBcnJheUJvdW5kKGksIC4uLikgb3V0IG9mIHRoZSBsb29wIGJlbG93IGFuZCB0dXJucyBpdAogICAgLy8gaW50byBDaGVja0FycmF5Qm91bmQobGVuZ3RoIC0gMSwgLi4uKS4gV2hpY2ggZGVvcHRpbWl6ZXMKICAgIC8vIGlmIGxlbmd0aCA9PSAwLiBIb3dldmVyIHRoZSBsb29wIGl0c2VsZiBkb2VzIG5vdCBleGVjdXRlCiAgICAvLyBpZiBsZW5ndGggPT0gMC4KICAgIGlmIChsZW5ndGggPiAwKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICBuZXdEYXRhW2ldID0gdGhpc1tpXTsKICAgICAgfQogICAgfQogICAgX3NldERhdGEobmV3RGF0YSk7CiAgfQoKICB2b2lkIF9zaHJpbmsoaW50IG5ld19jYXBhY2l0eSwgaW50IG5ld19sZW5ndGgpIHsKICAgIHZhciBuZXdEYXRhID0gX2FsbG9jYXRlRGF0YShuZXdfY2FwYWNpdHkpOwogICAgLy8gVGhpcyBpcyBhIHdvcmstYXJvdW5kIGZvciBkYXJ0YnVnLmNvbS8zMDA5MC4gU2VlIHRoZSBjb21tZW50IGluIF9ncm93LgogICAgaWYgKG5ld19sZW5ndGggPiAwKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmV3X2xlbmd0aDsgaSsrKSB7CiAgICAgICAgbmV3RGF0YVtpXSA9IHRoaXNbaV07CiAgICAgIH0KICAgIH0KICAgIF9zZXREYXRhKG5ld0RhdGEpOwogIH0KCiAgLy8gSXRlcmFibGUgaW50ZXJmYWNlLgoKICB2b2lkIGZvckVhY2goZihUIGVsZW1lbnQpKSB7CiAgICBpbnQgaW5pdGlhbExlbmd0aCA9IGxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgZih0aGlzW2ldKTsKICAgICAgaWYgKGxlbmd0aCAhPSBpbml0aWFsTGVuZ3RoKSB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgfQogIH0KCiAgU3RyaW5nIGpvaW4oW1N0cmluZyBzZXBhcmF0b3IgPSAiIl0pIHsKICAgIGZpbmFsIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuICIiOwogICAgaWYgKGxlbmd0aCA9PSAxKSByZXR1cm4gIiR7dGhpc1swXX0iOwogICAgaWYgKHNlcGFyYXRvci5pc05vdEVtcHR5KSByZXR1cm4gX2pvaW5XaXRoU2VwYXJhdG9yKHNlcGFyYXRvcik7CiAgICB2YXIgaSA9IDA7CiAgICB2YXIgY29kZVVuaXRDb3VudCA9IDA7CiAgICB3aGlsZSAoaSA8IGxlbmd0aCkgewogICAgICBmaW5hbCBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgLy8gV2hpbGUgbGlzdCBjb250YWlucyBvbmUtYnl0ZSBzdHJpbmdzLgogICAgICBpZiAoZWxlbWVudCBpcyBfT25lQnl0ZVN0cmluZykgewogICAgICAgIGNvZGVVbml0Q291bnQgKz0gZWxlbWVudC5sZW5ndGg7CiAgICAgICAgaSsrOwogICAgICAgIC8vIExvb3AgYmFjayB3aGlsZSBzdHJpbmdzIGFyZSBvbmUtYnl0ZSBzdHJpbmdzLgogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIC8vIE90aGVyd2lzZSwgbmV2ZXIgbG9vcCBiYWNrIHRvIHRoZSBvdXRlciBsb29wLCBhbmQKICAgICAgLy8gaGFuZGxlIHRoZSByZW1haW5pbmcgc3RyaW5ncyBiZWxvdy4KCiAgICAgIC8vIExvb3Agd2hpbGUgZWxlbWVudHMgYXJlIHN0cmluZ3MsCiAgICAgIGZpbmFsIGludCBmaXJzdE5vbk9uZUJ5dGVTdHJpbmdMaW1pdCA9IGk7CiAgICAgIHZhciBuZXh0RWxlbWVudCA9IGVsZW1lbnQ7CiAgICAgIHdoaWxlIChuZXh0RWxlbWVudCBpcyBTdHJpbmcpIHsKICAgICAgICBpKys7CiAgICAgICAgaWYgKGkgPT0gbGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gX1N0cmluZ0Jhc2UuX2NvbmNhdFJhbmdlTmF0aXZlKHRoaXMsIDAsIGxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIG5leHRFbGVtZW50ID0gdGhpc1tpXTsKICAgICAgfQoKICAgICAgLy8gTm90IGFsbCBlbGVtZW50cyBhcmUgc3RyaW5ncywgc28gYWxsb2NhdGUgYSBuZXcgYmFja2luZyBhcnJheS4KICAgICAgZmluYWwgbGlzdCA9IG5ldyBfTGlzdChsZW5ndGgpOwogICAgICBmb3IgKGludCBjb3B5SW5kZXggPSAwOyBjb3B5SW5kZXggPCBpOyBjb3B5SW5kZXgrKykgewogICAgICAgIGxpc3RbY29weUluZGV4XSA9IHRoaXNbY29weUluZGV4XTsKICAgICAgfQogICAgICAvLyBJcyBub24temVybyBpZiBsaXN0IGNvbnRhaW5zIGEgbm9uLW9uZWJ5dGUgc3RyaW5nLgogICAgICB2YXIgb25lYnl0ZUNhbmFyeSA9IGkgLSBmaXJzdE5vbk9uZUJ5dGVTdHJpbmdMaW1pdDsKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBmaW5hbCBTdHJpbmcgZWxlbWVudFN0cmluZyA9ICIkbmV4dEVsZW1lbnQiOwogICAgICAgIG9uZWJ5dGVDYW5hcnkgfD0KICAgICAgICAgICAgKENsYXNzSUQuZ2V0SUQoZWxlbWVudFN0cmluZykgXiBDbGFzc0lELmNpZE9uZUJ5dGVTdHJpbmcpOwogICAgICAgIGxpc3RbaV0gPSBlbGVtZW50U3RyaW5nOwogICAgICAgIGNvZGVVbml0Q291bnQgKz0gZWxlbWVudFN0cmluZy5sZW5ndGg7CiAgICAgICAgaSsrOwogICAgICAgIGlmIChpID09IGxlbmd0aCkgYnJlYWs7CiAgICAgICAgbmV4dEVsZW1lbnQgPSB0aGlzW2ldOwogICAgICB9CiAgICAgIGlmIChvbmVieXRlQ2FuYXJ5ID09IDApIHsKICAgICAgICAvLyBBbGwgZWxlbWVudHMgcmV0dXJuZWQgYSBvbmUtYnl0ZSBzdHJpbmcgZnJvbSB0b1N0cmluZy4KICAgICAgICByZXR1cm4gX09uZUJ5dGVTdHJpbmcuX2NvbmNhdEFsbChsaXN0LCBjb2RlVW5pdENvdW50KTsKICAgICAgfQogICAgICByZXR1cm4gX1N0cmluZ0Jhc2UuX2NvbmNhdFJhbmdlTmF0aXZlKGxpc3QsIDAsIGxlbmd0aCk7CiAgICB9CiAgICAvLyBBbGwgZWxlbWVudHMgd2VyZSBvbmUtYnl0ZSBzdHJpbmdzLgogICAgcmV0dXJuIF9PbmVCeXRlU3RyaW5nLl9jb25jYXRBbGwodGhpcywgY29kZVVuaXRDb3VudCk7CiAgfQoKICBTdHJpbmcgX2pvaW5XaXRoU2VwYXJhdG9yKFN0cmluZyBzZXBhcmF0b3IpIHsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBidWZmZXIud3JpdGUodGhpc1swXSk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHsKICAgICAgYnVmZmVyLndyaXRlKHNlcGFyYXRvcik7CiAgICAgIGJ1ZmZlci53cml0ZSh0aGlzW2ldKTsKICAgIH0KICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9CgogIFQgZWxlbWVudEF0KGludCBpbmRleCkgewogICAgcmV0dXJuIHRoaXNbaW5kZXhdOwogIH0KCiAgYm9vbCBnZXQgaXNFbXB0eSB7CiAgICByZXR1cm4gdGhpcy5sZW5ndGggPT0gMDsKICB9CgogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gIWlzRW1wdHk7CgogIHZvaWQgY2xlYXIoKSB7CiAgICB0aGlzLmxlbmd0aCA9IDA7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBMaXN0QmFzZS5saXN0VG9TdHJpbmcodGhpcyk7CgogIEl0ZXJhdG9yPFQ+IGdldCBpdGVyYXRvciB7CiAgICByZXR1cm4gbmV3IExpc3RJdGVyYXRvcjxUPih0aGlzKTsKICB9CgogIExpc3Q8VD4gdG9MaXN0KHtib29sIGdyb3dhYmxlOiB0cnVlfSkgewogICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgaWYgKGxlbmd0aCA+IDApIHsKICAgICAgTGlzdCBsaXN0ID0gZ3Jvd2FibGUgPyBuZXcgX0xpc3QobGVuZ3RoKSA6IG5ldyBfTGlzdDxUPihsZW5ndGgpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGlzdFtpXSA9IHRoaXNbaV07CiAgICAgIH0KICAgICAgaWYgKCFncm93YWJsZSkgcmV0dXJuIGxpc3Q7CiAgICAgIHZhciByZXN1bHQgPSBuZXcgX0dyb3dhYmxlTGlzdDxUPi53aXRoRGF0YShsaXN0KTsKICAgICAgcmVzdWx0Ll9zZXRMZW5ndGgobGVuZ3RoKTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIHJldHVybiBncm93YWJsZSA/IDxUPltdIDogbmV3IExpc3Q8VD4oMCk7CiAgfQoKICBTZXQ8VD4gdG9TZXQoKSB7CiAgICByZXR1cm4gbmV3IFNldDxUPi5mcm9tKHRoaXMpOwogIH0KfQqBhgBOTjwBHgEaLSYrNAYgFA4GIU5MSzcTQRsEARoeJR1DBh0TBAEgLCAVFQgGEgQBNCc0BjpRJAYrTUxAJEEdBAExHDoNJCEIBgQBKTk7LwQBKj8eIyMnIQY2HxMEASYmNhYhBhMEATUoMAQBMU0BNDcBNDIBJCIjJxseDgZBTRtLGSM9HSkNMhgIBhwEAUMBPAE9ASofBAFJASQWFhwhBhkXBAEmFikyMyw9Gy0lIhoNJCAUCBYpNwohNSwrChAIBiUgCSAeISAkUBYIJxQEARMaGhcRBAEQJCwEAQ8tLAQBESU9KgQBQTABLRkrGQZANCQEASxBASEvRkJJQEAXFikeCAYXBAEzL04aLR4IBhcEARkBHyAnElAGBAEpJCAqRA8bGR8vJykNORIIOy0BKjAhJg0bQgofCAFIJjwrCDw6FTUZRyEvDSAfCCBCPwg+Bis7BAEwLhssHx0GHgQBGxgEARUdBAEjAREVBAE0AR0mBAEqHhZHKRsIIjghFQYuBAETIgQCASNkYXJ0OmNvcmUtcGF0Y2gvZ3Jvd2FibGVfYXJyYXkuZGFydDJvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2ltbXV0YWJsZV9tYXAuZGFydJWdLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvcmVfcGF0Y2guZGFydCI7CgovLy8gSW1tdXRhYmxlIG1hcCBjbGFzcyBmb3IgY29tcGlsZXIgZ2VuZXJhdGVkIG1hcCBsaXRlcmFscy4KLy8gVE9ETyhscm4pOiBFeHRlbmQgTWFwQmFzZSB3aXRoIFVubW9kaWZpYWJsZU1hcE1peGluIHdoZW4gbWl4aW5zCi8vIHN1cHBvcnQgZm9yd2FyZGluZyBjb25zdCBjb25zdHJ1Y3RvcnMuCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0ltbXV0YWJsZU1hcDxLLCBWPiBpbXBsZW1lbnRzIE1hcDxLLCBWPiB7CiAgZmluYWwgX0ltbXV0YWJsZUxpc3QgX2t2UGFpcnM7CgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBjb25zdCBfSW1tdXRhYmxlTWFwLl9jcmVhdGUoX0ltbXV0YWJsZUxpc3Qga2V5VmFsdWVQYWlycykKICAgICAgOiBfa3ZQYWlycyA9IGtleVZhbHVlUGFpcnM7CgogIE1hcDxLMiwgVjI+IGNhc3Q8SzIsIFYyPigpID0+IE1hcC5jYXN0RnJvbTxLLCBWLCBLMiwgVjI+KHRoaXMpOwogIFYgb3BlcmF0b3IgW10oT2JqZWN0IGtleSkgewogICAgLy8gVG8gcHJlc2VydmUgdGhlIGtleS12YWx1ZSBvcmRlciBvZiB0aGUgbWFwIGxpdGVyYWwsIHRoZSBrZXlzIGFyZQogICAgLy8gbm90IHNvcnRlZC4gTmVlZCB0byBkbyBsaW5lYXIgc2VhcmNoIG9yIGltcGxlbWVudCBhbiBhZGRpdGlvbmFsCiAgICAvLyBsb29rdXAgdGFibGUuCiAgICBmb3IgKGludCBpID0gMDsgaSA8IF9rdlBhaXJzLmxlbmd0aCAtIDE7IGkgKz0gMikgewogICAgICBpZiAoa2V5ID09IF9rdlBhaXJzW2ldKSB7CiAgICAgICAgcmV0dXJuIF9rdlBhaXJzW2kgKyAxXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBib29sIGdldCBpc0VtcHR5IHsKICAgIHJldHVybiBfa3ZQYWlycy5sZW5ndGggPT0gMDsKICB9CgogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gIWlzRW1wdHk7CgogIGludCBnZXQgbGVuZ3RoIHsKICAgIHJldHVybiBfa3ZQYWlycy5sZW5ndGggfi8gMjsKICB9CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoSyBrZXksIFYgdmFsdWUpKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IF9rdlBhaXJzLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgIGYoX2t2UGFpcnNbaV0sIF9rdlBhaXJzW2kgKyAxXSk7CiAgICB9CiAgfQoKICBJdGVyYWJsZTxLPiBnZXQga2V5cyB7CiAgICByZXR1cm4gbmV3IF9JbW11dGFibGVNYXBLZXlJdGVyYWJsZTxLPih0aGlzKTsKICB9CgogIEl0ZXJhYmxlPFY+IGdldCB2YWx1ZXMgewogICAgcmV0dXJuIG5ldyBfSW1tdXRhYmxlTWFwVmFsdWVJdGVyYWJsZTxWPih0aGlzKTsKICB9CgogIGJvb2wgY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfa3ZQYWlycy5sZW5ndGg7IGkgKz0gMikgewogICAgICBpZiAoa2V5ID09IF9rdlBhaXJzW2ldKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGJvb2wgY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgX2t2UGFpcnMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgaWYgKHZhbHVlID09IF9rdlBhaXJzW2ldKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KEsga2V5LCBWIHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHNldCB2YWx1ZSBpbiB1bm1vZGlmaWFibGUgTWFwIik7CiAgfQoKICB2b2lkIGFkZEFsbChNYXA8SywgVj4gb3RoZXIpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3Qgc2V0IHZhbHVlIGluIHVubW9kaWZpYWJsZSBNYXAiKTsKICB9CgogIFYgcHV0SWZBYnNlbnQoSyBrZXksIFYgaWZBYnNlbnQoKSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBzZXQgdmFsdWUgaW4gdW5tb2RpZmlhYmxlIE1hcCIpOwogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgY2xlYXIgdW5tb2RpZmlhYmxlIE1hcCIpOwogIH0KCiAgViByZW1vdmUoT2JqZWN0IGtleSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSB1bm1vZGlmaWFibGUgTWFwIik7CiAgfQoKICBJdGVyYWJsZTxNYXBFbnRyeTxLLCBWPj4gZ2V0IGVudHJpZXMgPT4KICAgICAgbmV3IF9JbW11dGFibGVNYXBFbnRyeUl0ZXJhYmxlPEssIFY+KHRoaXMpOwoKICBNYXA8SzIsIFYyPiBtYXA8SzIsIFYyPihNYXBFbnRyeTxLMiwgVjI+IGYoSyBrZXksIFYgdmFsdWUpKSB7CiAgICB2YXIgcmVzdWx0ID0gPEsyLCBWMj57fTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2t2UGFpcnMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgdmFyIGVudHJ5ID0gZihfa3ZQYWlyc1tpXSwgX2t2UGFpcnNbaSArIDFdKTsKICAgICAgcmVzdWx0W2VudHJ5LmtleV0gPSBlbnRyeS52YWx1ZTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIGFkZEVudHJpZXMoSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IG5ld0VudHJpZXMpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBNYXAiKTsKICB9CgogIFYgdXBkYXRlKEsga2V5LCBWIHVwZGF0ZShWIHZhbHVlKSwge1YgaWZBYnNlbnQoKX0pIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBNYXAiKTsKICB9CgogIHZvaWQgdXBkYXRlQWxsKFYgdXBkYXRlKEsga2V5LCBWIHZhbHVlKSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIE1hcCIpOwogIH0KCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHByZWRpY2F0ZShLIGtleSwgViB2YWx1ZSkpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBNYXAiKTsKICB9CgogIFN0cmluZyB0b1N0cmluZygpID0+IE1hcEJhc2UubWFwVG9TdHJpbmcodGhpcyk7Cn0KCmNsYXNzIF9JbW11dGFibGVNYXBLZXlJdGVyYWJsZTxFPiBleHRlbmRzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+IHsKICBmaW5hbCBfSW1tdXRhYmxlTWFwIF9tYXA7CiAgX0ltbXV0YWJsZU1hcEtleUl0ZXJhYmxlKHRoaXMuX21hcCk7CgogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciB7CiAgICByZXR1cm4gbmV3IF9JbW11dGFibGVNYXBLZXlJdGVyYXRvcjxFPihfbWFwKTsKICB9CgogIGludCBnZXQgbGVuZ3RoID0+IF9tYXAubGVuZ3RoOwp9CgpjbGFzcyBfSW1tdXRhYmxlTWFwVmFsdWVJdGVyYWJsZTxFPiBleHRlbmRzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+IHsKICBmaW5hbCBfSW1tdXRhYmxlTWFwIF9tYXA7CiAgX0ltbXV0YWJsZU1hcFZhbHVlSXRlcmFibGUodGhpcy5fbWFwKTsKCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yIHsKICAgIHJldHVybiBuZXcgX0ltbXV0YWJsZU1hcFZhbHVlSXRlcmF0b3I8RT4oX21hcCk7CiAgfQoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfbWFwLmxlbmd0aDsKfQoKY2xhc3MgX0ltbXV0YWJsZU1hcEVudHJ5SXRlcmFibGU8SywgVj4KICAgIGV4dGVuZHMgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IHsKICBmaW5hbCBfSW1tdXRhYmxlTWFwIF9tYXA7CiAgX0ltbXV0YWJsZU1hcEVudHJ5SXRlcmFibGUodGhpcy5fbWFwKTsKCiAgSXRlcmF0b3I8TWFwRW50cnk8SywgVj4+IGdldCBpdGVyYXRvciB7CiAgICByZXR1cm4gbmV3IF9JbW11dGFibGVNYXBFbnRyeUl0ZXJhdG9yPEssIFY+KF9tYXApOwogIH0KCiAgaW50IGdldCBsZW5ndGggPT4gX21hcC5sZW5ndGg7Cn0KCmNsYXNzIF9JbW11dGFibGVNYXBLZXlJdGVyYXRvcjxFPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKICBfSW1tdXRhYmxlTWFwIF9tYXA7CiAgaW50IF9uZXh0SW5kZXggPSAwOwogIEUgX2N1cnJlbnQ7CgogIF9JbW11dGFibGVNYXBLZXlJdGVyYXRvcih0aGlzLl9tYXApOwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaW50IG5ld0luZGV4ID0gX25leHRJbmRleDsKICAgIGlmIChuZXdJbmRleCA8IF9tYXAubGVuZ3RoKSB7CiAgICAgIF9uZXh0SW5kZXggPSBuZXdJbmRleCArIDE7CiAgICAgIF9jdXJyZW50ID0gX21hcC5fa3ZQYWlyc1tuZXdJbmRleCAqIDJdOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9jdXJyZW50ID0gbnVsbDsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEUgZ2V0IGN1cnJlbnQgPT4gX2N1cnJlbnQ7Cn0KCmNsYXNzIF9JbW11dGFibGVNYXBWYWx1ZUl0ZXJhdG9yPEU+IGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewogIF9JbW11dGFibGVNYXAgX21hcDsKICBpbnQgX25leHRJbmRleCA9IDA7CiAgRSBfY3VycmVudDsKCiAgX0ltbXV0YWJsZU1hcFZhbHVlSXRlcmF0b3IodGhpcy5fbWFwKTsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGludCBuZXdJbmRleCA9IF9uZXh0SW5kZXg7CiAgICBpZiAobmV3SW5kZXggPCBfbWFwLmxlbmd0aCkgewogICAgICBfbmV4dEluZGV4ID0gbmV3SW5kZXggKyAxOwogICAgICBfY3VycmVudCA9IF9tYXAuX2t2UGFpcnNbbmV3SW5kZXggKiAyICsgMV07CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgX2N1cnJlbnQgPSBudWxsOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgRSBnZXQgY3VycmVudCA9PiBfY3VycmVudDsKfQoKY2xhc3MgX0ltbXV0YWJsZU1hcEVudHJ5SXRlcmF0b3I8SywgVj4gaW1wbGVtZW50cyBJdGVyYXRvcjxNYXBFbnRyeTxLLCBWPj4gewogIF9JbW11dGFibGVNYXAgX21hcDsKICBpbnQgX25leHRJbmRleCA9IDA7CiAgTWFwRW50cnk8SywgVj4gX2N1cnJlbnQ7CgogIF9JbW11dGFibGVNYXBFbnRyeUl0ZXJhdG9yKHRoaXMuX21hcCk7CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBpbnQgbmV3SW5kZXggPSBfbmV4dEluZGV4OwogICAgaWYgKG5ld0luZGV4IDwgX21hcC5sZW5ndGgpIHsKICAgICAgX25leHRJbmRleCA9IG5ld0luZGV4ICsgMTsKICAgICAgX2N1cnJlbnQgPSBuZXcgTWFwRW50cnk8SywgVj4oCiAgICAgICAgICBfbWFwLl9rdlBhaXJzW25ld0luZGV4ICogMl0sIF9tYXAuX2t2UGFpcnNbbmV3SW5kZXggKiAyICsgMV0pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9jdXJyZW50ID0gbnVsbDsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIE1hcEVudHJ5PEssIFY+IGdldCBjdXJyZW50ID0+IF9jdXJyZW50Owp9CoDeAE5OPAEeAT1DKhoxIQEcPCIBQh5IRxU3ICAIBhEEARUhBAEjARMhBAEpMycGBAEZMgQBGzQEASEzIBUIBhIEASUzIhUIBhIEASZIBAEhSAQBJ0gEARFBBAEZRwQBKjIBQB0zMycGEwQBOUUEATdFBAEtRQQBNUUEATICAUccJwEdMgQBIQIBSRwpAR00BAEhAgEnNhwpASo3BAEhAgE7FhYOAScBFB8iIS4TBhUSBAEdAgE9FhYOASkBFB8iITITBhUSBAEdAgFNFhYbASkBFB8iISVJEwYVEgQBKgIBImRhcnQ6Y29yZS1wYXRjaC9pbW11dGFibGVfbWFwLmRhcnQtb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi9pbnRlZ2Vycy5kYXJ0wABYOy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb3JlX3BhdGNoLmRhcnQiOwoKYWJzdHJhY3QgY2xhc3MgX0ludGVnZXJJbXBsZW1lbnRhdGlvbiBpbXBsZW1lbnRzIGludCB7CiAgQHByYWdtYSgidm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBlIikKICBudW0gb3BlcmF0b3IgKyhudW0gb3RoZXIpID0+IG90aGVyLl9hZGRGcm9tSW50ZWdlcih0aGlzKTsKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIG51bSBvcGVyYXRvciAtKG51bSBvdGhlcikgPT4gb3RoZXIuX3N1YkZyb21JbnRlZ2VyKHRoaXMpOwogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgbnVtIG9wZXJhdG9yICoobnVtIG90aGVyKSA9PiBvdGhlci5fbXVsRnJvbUludGVnZXIodGhpcyk7CgogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgaW50IG9wZXJhdG9yIH4vKG51bSBvdGhlcikgewogICAgaWYgKChvdGhlciBpcyBpbnQpICYmIChvdGhlciA9PSAwKSkgewogICAgICB0aHJvdyBjb25zdCBJbnRlZ2VyRGl2aXNpb25CeVplcm9FeGNlcHRpb24oKTsKICAgIH0KICAgIHJldHVybiBvdGhlci5fdHJ1bmNEaXZGcm9tSW50ZWdlcih0aGlzKTsKICB9CgogIGRvdWJsZSBvcGVyYXRvciAvKG51bSBvdGhlcikgewogICAgcmV0dXJuIHRoaXMudG9Eb3VibGUoKSAvIG90aGVyLnRvRG91YmxlKCk7CiAgfQoKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIG51bSBvcGVyYXRvciAlKG51bSBvdGhlcikgewogICAgaWYgKChvdGhlciBpcyBpbnQpICYmIChvdGhlciA9PSAwKSkgewogICAgICB0aHJvdyBjb25zdCBJbnRlZ2VyRGl2aXNpb25CeVplcm9FeGNlcHRpb24oKTsKICAgIH0KICAgIHJldHVybiBvdGhlci5fbW9kdWxvRnJvbUludGVnZXIodGhpcyk7CiAgfQoKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIGludCBvcGVyYXRvciAtKCkgewogICAgcmV0dXJuIDAgLSB0aGlzOwogIH0KCiAgQHByYWdtYSgidm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBlIikKICBpbnQgb3BlcmF0b3IgJihpbnQgb3RoZXIpID0+IG90aGVyLl9iaXRBbmRGcm9tSW50ZWdlcih0aGlzKTsKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIGludCBvcGVyYXRvciB8KGludCBvdGhlcikgPT4gb3RoZXIuX2JpdE9yRnJvbUludGVnZXIodGhpcyk7CiAgQHByYWdtYSgidm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBlIikKICBpbnQgb3BlcmF0b3IgXihpbnQgb3RoZXIpID0+IG90aGVyLl9iaXRYb3JGcm9tSW50ZWdlcih0aGlzKTsKCiAgbnVtIHJlbWFpbmRlcihudW0gb3RoZXIpIHsKICAgIHJldHVybiBvdGhlci5fcmVtYWluZGVyRnJvbUludGVnZXIodGhpcyk7CiAgfQoKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIGludCBfYml0QW5kRnJvbVNtaShfU21pIG90aGVyKSBuYXRpdmUgIkludGVnZXJfYml0QW5kRnJvbUludGVnZXIiOwogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgaW50IF9iaXRBbmRGcm9tSW50ZWdlcihpbnQgb3RoZXIpIG5hdGl2ZSAiSW50ZWdlcl9iaXRBbmRGcm9tSW50ZWdlciI7CiAgQHByYWdtYSgidm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBlIikKICBpbnQgX2JpdE9yRnJvbUludGVnZXIoaW50IG90aGVyKSBuYXRpdmUgIkludGVnZXJfYml0T3JGcm9tSW50ZWdlciI7CiAgQHByYWdtYSgidm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBlIikKICBpbnQgX2JpdFhvckZyb21JbnRlZ2VyKGludCBvdGhlcikgbmF0aXZlICJJbnRlZ2VyX2JpdFhvckZyb21JbnRlZ2VyIjsKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIGludCBfc2hyRnJvbUludGVnZXIoaW50IG90aGVyKSBuYXRpdmUgIkludGVnZXJfc2hyRnJvbUludGVnZXIiOwogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgaW50IF9zaGxGcm9tSW50ZWdlcihpbnQgb3RoZXIpIG5hdGl2ZSAiSW50ZWdlcl9zaGxGcm9tSW50ZWdlciI7CiAgQHByYWdtYSgidm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBlIikKICBpbnQgX2FkZEZyb21JbnRlZ2VyKGludCBvdGhlcikgbmF0aXZlICJJbnRlZ2VyX2FkZEZyb21JbnRlZ2VyIjsKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIGludCBfc3ViRnJvbUludGVnZXIoaW50IG90aGVyKSBuYXRpdmUgIkludGVnZXJfc3ViRnJvbUludGVnZXIiOwogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgaW50IF9tdWxGcm9tSW50ZWdlcihpbnQgb3RoZXIpIG5hdGl2ZSAiSW50ZWdlcl9tdWxGcm9tSW50ZWdlciI7CiAgQHByYWdtYSgidm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBlIikKICBpbnQgX3RydW5jRGl2RnJvbUludGVnZXIoaW50IG90aGVyKSBuYXRpdmUgIkludGVnZXJfdHJ1bmNEaXZGcm9tSW50ZWdlciI7CiAgQHByYWdtYSgidm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBlIikKICBpbnQgX21vZHVsb0Zyb21JbnRlZ2VyKGludCBvdGhlcikgbmF0aXZlICJJbnRlZ2VyX21vZHVsb0Zyb21JbnRlZ2VyIjsKICBpbnQgX3JlbWFpbmRlckZyb21JbnRlZ2VyKGludCBvdGhlcikgewogICAgcmV0dXJuIG90aGVyIC0gKG90aGVyIH4vIHRoaXMpICogdGhpczsKICB9CgogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgaW50IG9wZXJhdG9yID4+KGludCBvdGhlcikgPT4gb3RoZXIuX3NockZyb21JbnRlZ2VyKHRoaXMpOwogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgaW50IG9wZXJhdG9yIDw8KGludCBvdGhlcikgPT4gb3RoZXIuX3NobEZyb21JbnRlZ2VyKHRoaXMpOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBvcGVyYXRvciA8KG51bSBvdGhlcikgewogICAgcmV0dXJuIG90aGVyID4gdGhpczsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKICBib29sIG9wZXJhdG9yID4obnVtIG90aGVyKSB7CiAgICByZXR1cm4gb3RoZXIuX2dyZWF0ZXJUaGFuRnJvbUludGVnZXIodGhpcyk7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBvcGVyYXRvciA+PShudW0gb3RoZXIpIHsKICAgIHJldHVybiAodGhpcyA9PSBvdGhlcikgfHwgKHRoaXMgPiBvdGhlcik7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBvcGVyYXRvciA8PShudW0gb3RoZXIpIHsKICAgIHJldHVybiAodGhpcyA9PSBvdGhlcikgfHwgKHRoaXMgPCBvdGhlcik7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBfZ3JlYXRlclRoYW5Gcm9tSW50ZWdlcihpbnQgb3RoZXIpCiAgICAgIG5hdGl2ZSAiSW50ZWdlcl9ncmVhdGVyVGhhbkZyb21JbnRlZ2VyIjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMgbnVtKSB7CiAgICAgIHJldHVybiBvdGhlci5fZXF1YWxUb0ludGVnZXIodGhpcyk7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBfZXF1YWxUb0ludGVnZXIoaW50IG90aGVyKSBuYXRpdmUgIkludGVnZXJfZXF1YWxUb0ludGVnZXIiOwogIGludCBhYnMoKSB7CiAgICByZXR1cm4gdGhpcyA8IDAgPyAtdGhpcyA6IHRoaXM7CiAgfQoKICBpbnQgZ2V0IHNpZ24gewogICAgcmV0dXJuICh0aGlzID4gMCkgPyAxIDogKHRoaXMgPCAwKSA/IC0xIDogMDsKICB9CgogIGJvb2wgZ2V0IGlzRXZlbiA9PiAoKHRoaXMgJiAxKSA9PSAwKTsKICBib29sIGdldCBpc09kZCA9PiAhaXNFdmVuOwogIGJvb2wgZ2V0IGlzTmFOID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzTmVnYXRpdmUgPT4gdGhpcyA8IDA7CiAgYm9vbCBnZXQgaXNJbmZpbml0ZSA9PiBmYWxzZTsKICBib29sIGdldCBpc0Zpbml0ZSA9PiB0cnVlOwoKICBpbnQgdG9VbnNpZ25lZChpbnQgd2lkdGgpIHsKICAgIHJldHVybiB0aGlzICYgKCgxIDw8IHdpZHRoKSAtIDEpOwogIH0KCiAgaW50IHRvU2lnbmVkKGludCB3aWR0aCkgewogICAgLy8gVGhlIHZhbHVlIG9mIGJpbmFyeSBudW1iZXIgd2VpZ2h0cyBlYWNoIGJpdCBieSBhIHBvd2VyIG9mIHR3by4gIFRoZQogICAgLy8gdHdvcy1jb21wbGVtZW50IHZhbHVlIHdlaWdodHMgdGhlIHNpZ24gYml0IG5lZ2F0aXZlbHkuICBXZSBjb21wdXRlIHRoZQogICAgLy8gdmFsdWUgb2YgdGhlIG5lZ2F0aXZlIHdlaWdodGluZyBieSBpc29sYXRpbmcgdGhlIHNpZ24gYml0IHdpdGggdGhlCiAgICAvLyBjb3JyZWN0IHBvd2VyIG9mIHR3byB3ZWlnaHRpbmcgYW5kIHN1YnRyYWN0aW5nIGl0IGZyb20gdGhlIHZhbHVlIG9mIHRoZQogICAgLy8gbG93ZXIgYml0cy4KICAgIGludCBzaWduTWFzayA9IDEgPDwgKHdpZHRoIC0gMSk7CiAgICByZXR1cm4gKHRoaXMgJiAoc2lnbk1hc2sgLSAxKSkgLSAodGhpcyAmIHNpZ25NYXNrKTsKICB9CgogIGludCBjb21wYXJlVG8obnVtIG90aGVyKSB7CiAgICBjb25zdCBpbnQgRVFVQUwgPSAwLCBMRVNTID0gLTEsIEdSRUFURVIgPSAxOwogICAgaWYgKG90aGVyIGlzIGRvdWJsZSkgewogICAgICBjb25zdCBpbnQgTUFYX0VYQUNUX0lOVF9UT19ET1VCTEUgPSA5MDA3MTk5MjU0NzQwOTkyOyAvLyAyXjUzLgogICAgICBjb25zdCBpbnQgTUlOX0VYQUNUX0lOVF9UT19ET1VCTEUgPSAtTUFYX0VYQUNUX0lOVF9UT19ET1VCTEU7CiAgICAgIGNvbnN0IGJvb2wgbGltaXRJbnRzVG82NEJpdHMgPSAoKDEgPDwgNjQpID09IDApOwogICAgICBpZiAobGltaXRJbnRzVG82NEJpdHMpIHsKICAgICAgICAvLyBXaXRoIGludGVnZXJzIGxpbWl0ZWQgdG8gNjQgYml0cywgZG91YmxlLnRvSW50KCkgY2xhbXBzCiAgICAgICAgLy8gZG91YmxlIHZhbHVlIHRvIGZpdCBpbnRvIHRoZSBNSU5fSU5UNjQuLk1BWF9JTlQ2NCByYW5nZS4KICAgICAgICAvLyBDaGVjayBpZiB0aGUgZG91YmxlIHZhbHVlIGlzIG91dHNpZGUgb2YgdGhpcyByYW5nZS4KICAgICAgICAvLyBUaGlzIGNoZWNrIGhhbmRsZXMgKy8taW5maW5pdHkgYXMgd2VsbC4KICAgICAgICBjb25zdCBkb3VibGUgbWluSW50NjRBc0RvdWJsZSA9IC05MjIzMzcyMDM2ODU0Nzc1ODA4LjA7CiAgICAgICAgLy8gTUFYX0lOVDY0IGlzIG5vdCBwcmVjaXNlbHkgcmVwcmVzZW50YWJsZSBpbiBkb3VibGVzLCBzbwogICAgICAgIC8vIGNoZWNrIGFnYWluc3QgKE1BWF9JTlQ2NCArIDEpLgogICAgICAgIGNvbnN0IGRvdWJsZSBtYXhJbnQ2NFBsdXMxQXNEb3VibGUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA4LjA7CiAgICAgICAgaWYgKG90aGVyIDwgbWluSW50NjRBc0RvdWJsZSkgewogICAgICAgICAgcmV0dXJuIEdSRUFURVI7CiAgICAgICAgfSBlbHNlIGlmIChvdGhlciA+PSBtYXhJbnQ2NFBsdXMxQXNEb3VibGUpIHsKICAgICAgICAgIHJldHVybiBMRVNTOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAob3RoZXIuaXNJbmZpbml0ZSkgewogICAgICAgICAgcmV0dXJuIG90aGVyLmlzTmVnYXRpdmUgPyBHUkVBVEVSIDogTEVTUzsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKG90aGVyLmlzTmFOKSB7CiAgICAgICAgcmV0dXJuIExFU1M7CiAgICAgIH0KICAgICAgaWYgKE1JTl9FWEFDVF9JTlRfVE9fRE9VQkxFIDw9IHRoaXMgJiYgdGhpcyA8PSBNQVhfRVhBQ1RfSU5UX1RPX0RPVUJMRSkgewogICAgICAgIC8vIExldCB0aGUgZG91YmxlIGltcGxlbWVudGF0aW9uIGRlYWwgd2l0aCAtMC4wLgogICAgICAgIHJldHVybiAtKG90aGVyLmNvbXBhcmVUbyh0aGlzLnRvRG91YmxlKCkpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBJZiBhYnMob3RoZXIpID4gTUFYX0VYQUNUX0lOVF9UT19ET1VCTEUsIHRoZW4gb3RoZXIgaGFzIGFuIGludGVnZXIKICAgICAgICAvLyB2YWx1ZSAobm8gYml0cyBiZWxvdyB0aGUgZGVjaW1hbCBwb2ludCkuCiAgICAgICAgb3RoZXIgPSBvdGhlci50b0ludCgpOwogICAgICB9CiAgICB9CiAgICBpZiAodGhpcyA8IG90aGVyKSB7CiAgICAgIHJldHVybiBMRVNTOwogICAgfSBlbHNlIGlmICh0aGlzID4gb3RoZXIpIHsKICAgICAgcmV0dXJuIEdSRUFURVI7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gRVFVQUw7CiAgICB9CiAgfQoKICBpbnQgcm91bmQoKSB7CiAgICByZXR1cm4gdGhpczsKICB9CgogIGludCBmbG9vcigpIHsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgaW50IGNlaWwoKSB7CiAgICByZXR1cm4gdGhpczsKICB9CgogIGludCB0cnVuY2F0ZSgpIHsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgZG91YmxlIHJvdW5kVG9Eb3VibGUoKSB7CiAgICByZXR1cm4gdGhpcy50b0RvdWJsZSgpOwogIH0KCiAgZG91YmxlIGZsb29yVG9Eb3VibGUoKSB7CiAgICByZXR1cm4gdGhpcy50b0RvdWJsZSgpOwogIH0KCiAgZG91YmxlIGNlaWxUb0RvdWJsZSgpIHsKICAgIHJldHVybiB0aGlzLnRvRG91YmxlKCk7CiAgfQoKICBkb3VibGUgdHJ1bmNhdGVUb0RvdWJsZSgpIHsKICAgIHJldHVybiB0aGlzLnRvRG91YmxlKCk7CiAgfQoKICBudW0gY2xhbXAobnVtIGxvd2VyTGltaXQsIG51bSB1cHBlckxpbWl0KSB7CiAgICBpZiAobG93ZXJMaW1pdCBpcyEgbnVtKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKGxvd2VyTGltaXQsICJsb3dlckxpbWl0IiwgIm5vdCBhIG51bWJlciIpOwogICAgfQogICAgaWYgKHVwcGVyTGltaXQgaXMhIG51bSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZSh1cHBlckxpbWl0LCAidXBwZXJMaW1pdCIsICJub3QgYSBudW1iZXIiKTsKICAgIH0KCiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGludGVnZXJzLgogICAgaWYgKGxvd2VyTGltaXQgaXMgaW50ICYmIHVwcGVyTGltaXQgaXMgaW50ICYmIGxvd2VyTGltaXQgPD0gdXBwZXJMaW1pdCkgewogICAgICBpZiAodGhpcyA8IGxvd2VyTGltaXQpIHJldHVybiBsb3dlckxpbWl0OwogICAgICBpZiAodGhpcyA+IHVwcGVyTGltaXQpIHJldHVybiB1cHBlckxpbWl0OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIC8vIEdlbmVyaWMgY2FzZSBpbnZvbHZpbmcgZG91YmxlcywgYW5kIGludmFsaWQgaW50ZWdlciByYW5nZXMuCiAgICBpZiAobG93ZXJMaW1pdC5jb21wYXJlVG8odXBwZXJMaW1pdCkgPiAwKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKGxvd2VyTGltaXQpOwogICAgfQogICAgaWYgKGxvd2VyTGltaXQuaXNOYU4pIHJldHVybiBsb3dlckxpbWl0OwogICAgLy8gTm90ZSB0aGF0IHdlIGRvbid0IG5lZWQgdG8gY2FyZSBmb3IgLTAuMCBmb3IgdGhlIGxvd2VyIGxpbWl0LgogICAgaWYgKHRoaXMgPCBsb3dlckxpbWl0KSByZXR1cm4gbG93ZXJMaW1pdDsKICAgIGlmICh0aGlzLmNvbXBhcmVUbyh1cHBlckxpbWl0KSA+IDApIHJldHVybiB1cHBlckxpbWl0OwogICAgcmV0dXJuIHRoaXM7CiAgfQoKICBpbnQgdG9JbnQoKSB7CiAgICByZXR1cm4gdGhpczsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0RvdWJsZSkKICBkb3VibGUgdG9Eb3VibGUoKSB7CiAgICByZXR1cm4gbmV3IF9Eb3VibGUuZnJvbUludGVnZXIodGhpcyk7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmdBc0ZpeGVkKGludCBmcmFjdGlvbkRpZ2l0cykgewogICAgcmV0dXJuIHRoaXMudG9Eb3VibGUoKS50b1N0cmluZ0FzRml4ZWQoZnJhY3Rpb25EaWdpdHMpOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nQXNFeHBvbmVudGlhbChbaW50IGZyYWN0aW9uRGlnaXRzXSkgewogICAgcmV0dXJuIHRoaXMudG9Eb3VibGUoKS50b1N0cmluZ0FzRXhwb25lbnRpYWwoZnJhY3Rpb25EaWdpdHMpOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nQXNQcmVjaXNpb24oaW50IHByZWNpc2lvbikgewogICAgcmV0dXJuIHRoaXMudG9Eb3VibGUoKS50b1N0cmluZ0FzUHJlY2lzaW9uKHByZWNpc2lvbik7CiAgfQoKICBzdGF0aWMgY29uc3QgX2RpZ2l0cyA9ICIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOwoKICBTdHJpbmcgdG9SYWRpeFN0cmluZyhpbnQgcmFkaXgpIHsKICAgIGlmIChyYWRpeCA8IDIgfHwgMzYgPCByYWRpeCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShyYWRpeCwgMiwgMzYsICJyYWRpeCIpOwogICAgfQogICAgaWYgKHJhZGl4ICYgKHJhZGl4IC0gMSkgPT0gMCkgewogICAgICByZXR1cm4gX3RvUG93MlN0cmluZyhyYWRpeCk7CiAgICB9CiAgICBpZiAocmFkaXggPT0gMTApIHJldHVybiB0aGlzLnRvU3RyaW5nKCk7CiAgICBmaW5hbCBib29sIGlzTmVnYXRpdmUgPSB0aGlzIDwgMDsKICAgIGludCB2YWx1ZSA9IGlzTmVnYXRpdmUgPyAtdGhpcyA6IHRoaXM7CiAgICBpZiAodmFsdWUgPCAwKSB7CiAgICAgIC8vIFdpdGggaW50ZWdlcnMgbGltaXRlZCB0byA2NCBiaXRzLCB0aGUgdmFsdWUKICAgICAgLy8gTUlOX0lOVDY0ID0gLTB4ODAwMDAwMDAwMDAwMDAwMCBvdmVyZmxvd3MgYXQgbmVnYXRpb246CiAgICAgIC8vIC1NSU5fSU5UNjQgPT0gTUlOX0lOVDY0LCBzbyBpdCByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nLgogICAgICByZXR1cm4gX21pbkludDY0VG9SYWRpeFN0cmluZyhyYWRpeCk7CiAgICB9CiAgICBMaXN0IHRlbXAgPSBuZXcgTGlzdCgpOwogICAgZG8gewogICAgICBpbnQgZGlnaXQgPSB2YWx1ZSAlIHJhZGl4OwogICAgICB2YWx1ZSB+Lz0gcmFkaXg7CiAgICAgIHRlbXAuYWRkKF9kaWdpdHMuY29kZVVuaXRBdChkaWdpdCkpOwogICAgfSB3aGlsZSAodmFsdWUgPiAwKTsKICAgIGlmIChpc05lZ2F0aXZlKSB0ZW1wLmFkZCgweDJkKTsgLy8gJy0nLgoKICAgIF9PbmVCeXRlU3RyaW5nIHN0cmluZyA9IF9PbmVCeXRlU3RyaW5nLl9hbGxvY2F0ZSh0ZW1wLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMCwgaiA9IHRlbXAubGVuZ3RoOyBqID4gMDsgaSsrKSB7CiAgICAgIHN0cmluZy5fc2V0QXQoaSwgdGVtcFstLWpdKTsKICAgIH0KICAgIHJldHVybiBzdHJpbmc7CiAgfQoKICBTdHJpbmcgX3RvUG93MlN0cmluZyhpbnQgcmFkaXgpIHsKICAgIGludCB2YWx1ZSA9IHRoaXM7CiAgICBpZiAodmFsdWUgPT0gMCkgcmV0dXJuICIwIjsKICAgIGFzc2VydChyYWRpeCAmIChyYWRpeCAtIDEpID09IDApOwogICAgdmFyIG5lZ2F0aXZlID0gdmFsdWUgPCAwOwogICAgdmFyIGJpdHNQZXJEaWdpdCA9IHJhZGl4LmJpdExlbmd0aCAtIDE7CiAgICB2YXIgbGVuZ3RoID0gMDsKICAgIGlmIChuZWdhdGl2ZSkgewogICAgICB2YWx1ZSA9IC12YWx1ZTsKICAgICAgbGVuZ3RoID0gMTsKICAgICAgaWYgKHZhbHVlIDwgMCkgewogICAgICAgIC8vIFdpdGggaW50ZWdlcnMgbGltaXRlZCB0byA2NCBiaXRzLCB0aGUgdmFsdWUKICAgICAgICAvLyBNSU5fSU5UNjQgPSAtMHg4MDAwMDAwMDAwMDAwMDAwIG92ZXJmbG93cyBhdCBuZWdhdGlvbjoKICAgICAgICAvLyAtTUlOX0lOVDY0ID09IE1JTl9JTlQ2NCwgc28gaXQgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZy4KICAgICAgICByZXR1cm4gX21pbkludDY0VG9SYWRpeFN0cmluZyhyYWRpeCk7CiAgICAgIH0KICAgIH0KICAgIC8vIEludGVnZXIgZGl2aXNpb24sIHJvdW5kaW5nIHVwLCB0byBmaW5kIG51bWJlciBvZiBfZGlnaXRzLgogICAgbGVuZ3RoICs9ICh2YWx1ZS5iaXRMZW5ndGggKyBiaXRzUGVyRGlnaXQgLSAxKSB+LyBiaXRzUGVyRGlnaXQ7CiAgICBfT25lQnl0ZVN0cmluZyBzdHJpbmcgPSBfT25lQnl0ZVN0cmluZy5fYWxsb2NhdGUobGVuZ3RoKTsKICAgIHN0cmluZy5fc2V0QXQoMCwgMHgyZCk7IC8vICctJy4gSXMgb3ZlcndyaXR0ZW4gaWYgbm90IG5lZ2F0aXZlLgogICAgdmFyIG1hc2sgPSByYWRpeCAtIDE7CiAgICBkbyB7CiAgICAgIHN0cmluZy5fc2V0QXQoLS1sZW5ndGgsIF9kaWdpdHMuY29kZVVuaXRBdCh2YWx1ZSAmIG1hc2spKTsKICAgICAgdmFsdWUgPj49IGJpdHNQZXJEaWdpdDsKICAgIH0gd2hpbGUgKHZhbHVlID4gMCk7CiAgICByZXR1cm4gc3RyaW5nOwogIH0KCiAgLy8vIENvbnZlcnRzIG5lZ2F0aXZlIHZhbHVlIHRvIHJhZGl4IHN0cmluZy4KICAvLy8gVGhpcyBtZXRob2QgaXMgb25seSB1c2VkIHRvIGhhbmRsZSBjb3JuZXIgY2FzZSBvZgogIC8vLyBNSU5fSU5UNjQgPSAtMHg4MDAwMDAwMDAwMDAwMDAwLgogIFN0cmluZyBfbWluSW50NjRUb1JhZGl4U3RyaW5nKGludCByYWRpeCkgewogICAgTGlzdCB0ZW1wID0gbmV3IExpc3QoKTsKICAgIGludCB2YWx1ZSA9IHRoaXM7CiAgICBhc3NlcnQodmFsdWUgPCAwKTsKICAgIGRvIHsKICAgICAgaW50IGRpZ2l0ID0gLXZhbHVlLnJlbWFpbmRlcihyYWRpeCk7CiAgICAgIHZhbHVlIH4vPSByYWRpeDsKICAgICAgdGVtcC5hZGQoX2RpZ2l0cy5jb2RlVW5pdEF0KGRpZ2l0KSk7CiAgICB9IHdoaWxlICh2YWx1ZSAhPSAwKTsKICAgIHRlbXAuYWRkKDB4MmQpOyAvLyAnLScuCgogICAgX09uZUJ5dGVTdHJpbmcgc3RyaW5nID0gX09uZUJ5dGVTdHJpbmcuX2FsbG9jYXRlKHRlbXAubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwLCBqID0gdGVtcC5sZW5ndGg7IGogPiAwOyBpKyspIHsKICAgICAgc3RyaW5nLl9zZXRBdChpLCB0ZW1wWy0tal0pOwogICAgfQogICAgcmV0dXJuIHN0cmluZzsKICB9CgogIC8vIFJldHVybnMgcG93KHRoaXMsIGUpICUgbS4KICBpbnQgbW9kUG93KGludCBlLCBpbnQgbSkgewogICAgaWYgKGUgaXMhIGludCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZShlLCAiZXhwb25lbnQiLCAibm90IGFuIGludGVnZXIiKTsKICAgIH0KICAgIGlmIChtIGlzISBpbnQpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUobSwgIm1vZHVsdXMiLCAibm90IGFuIGludGVnZXIiKTsKICAgIH0KICAgIGlmIChlIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoZSwgMCwgbnVsbCwgImV4cG9uZW50Iik7CiAgICBpZiAobSA8PSAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShtLCAxLCBudWxsLCAibW9kdWx1cyIpOwogICAgaWYgKGUgPT0gMCkgcmV0dXJuIDE7CiAgICBpbnQgYiA9IHRoaXM7CiAgICBpZiAoYiA8IDAgfHwgYiA+IG0pIHsKICAgICAgYiAlPSBtOwogICAgfQogICAgaW50IHIgPSAxOwogICAgd2hpbGUgKGUgPiAwKSB7CiAgICAgIGlmIChlLmlzT2RkKSB7CiAgICAgICAgciA9IChyICogYikgJSBtOwogICAgICB9CiAgICAgIGUgPj49IDE7CiAgICAgIGIgPSAoYiAqIGIpICUgbTsKICAgIH0KICAgIHJldHVybiByOwogIH0KCiAgLy8gSWYgaW52IGlzIGZhbHNlLCByZXR1cm5zIGdjZCh4LCB5KS4KICAvLyBJZiBpbnYgaXMgdHJ1ZSBhbmQgZ2NkKHgsIHkpID0gMSwgcmV0dXJucyBkLCBzbyB0aGF0IGMqeCArIGQqeSA9IDEuCiAgLy8gSWYgaW52IGlzIHRydWUgYW5kIGdjZCh4LCB5KSAhPSAxLCB0aHJvd3MgRXhjZXB0aW9uKCJOb3QgY29wcmltZSIpLgogIHN0YXRpYyBpbnQgX2JpbmFyeUdjZChpbnQgeCwgaW50IHksIGJvb2wgaW52KSB7CiAgICBpbnQgcyA9IDA7CiAgICBpZiAoIWludikgewogICAgICB3aGlsZSAoeC5pc0V2ZW4gJiYgeS5pc0V2ZW4pIHsKICAgICAgICB4ID4+PSAxOwogICAgICAgIHkgPj49IDE7CiAgICAgICAgcysrOwogICAgICB9CiAgICAgIGlmICh5LmlzT2RkKSB7CiAgICAgICAgdmFyIHQgPSB4OwogICAgICAgIHggPSB5OwogICAgICAgIHkgPSB0OwogICAgICB9CiAgICB9CiAgICBmaW5hbCBib29sIGFjID0geC5pc0V2ZW47CiAgICBpbnQgdSA9IHg7CiAgICBpbnQgdiA9IHk7CiAgICBpbnQgYSA9IDEsIGIgPSAwLCBjID0gMCwgZCA9IDE7CiAgICBkbyB7CiAgICAgIHdoaWxlICh1LmlzRXZlbikgewogICAgICAgIHUgPj49IDE7CiAgICAgICAgaWYgKGFjKSB7CiAgICAgICAgICBpZiAoIWEuaXNFdmVuIHx8ICFiLmlzRXZlbikgewogICAgICAgICAgICBhICs9IHk7CiAgICAgICAgICAgIGIgLT0geDsKICAgICAgICAgIH0KICAgICAgICAgIGEgPj49IDE7CiAgICAgICAgfSBlbHNlIGlmICghYi5pc0V2ZW4pIHsKICAgICAgICAgIGIgLT0geDsKICAgICAgICB9CiAgICAgICAgYiA+Pj0gMTsKICAgICAgfQogICAgICB3aGlsZSAodi5pc0V2ZW4pIHsKICAgICAgICB2ID4+PSAxOwogICAgICAgIGlmIChhYykgewogICAgICAgICAgaWYgKCFjLmlzRXZlbiB8fCAhZC5pc0V2ZW4pIHsKICAgICAgICAgICAgYyArPSB5OwogICAgICAgICAgICBkIC09IHg7CiAgICAgICAgICB9CiAgICAgICAgICBjID4+PSAxOwogICAgICAgIH0gZWxzZSBpZiAoIWQuaXNFdmVuKSB7CiAgICAgICAgICBkIC09IHg7CiAgICAgICAgfQogICAgICAgIGQgPj49IDE7CiAgICAgIH0KICAgICAgaWYgKHUgPj0gdikgewogICAgICAgIHUgLT0gdjsKICAgICAgICBpZiAoYWMpIGEgLT0gYzsKICAgICAgICBiIC09IGQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdiAtPSB1OwogICAgICAgIGlmIChhYykgYyAtPSBhOwogICAgICAgIGQgLT0gYjsKICAgICAgfQogICAgfSB3aGlsZSAodSAhPSAwKTsKICAgIGlmICghaW52KSByZXR1cm4gdiA8PCBzOwogICAgaWYgKHYgIT0gMSkgewogICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJOb3QgY29wcmltZSIpOwogICAgfQogICAgaWYgKGQgPCAwKSB7CiAgICAgIGQgKz0geDsKICAgICAgaWYgKGQgPCAwKSBkICs9IHg7CiAgICB9IGVsc2UgaWYgKGQgPiB4KSB7CiAgICAgIGQgLT0geDsKICAgICAgaWYgKGQgPiB4KSBkIC09IHg7CiAgICB9CiAgICByZXR1cm4gZDsKICB9CgogIC8vIFJldHVybnMgMS90aGlzICUgbSwgd2l0aCBtID4gMC4KICBpbnQgbW9kSW52ZXJzZShpbnQgbSkgewogICAgaWYgKG0gaXMhIGludCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZShtLCAibW9kdWx1cyIsICJub3QgYW4gaW50ZWdlciIpOwogICAgfQogICAgaWYgKG0gPD0gMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UobSwgMSwgbnVsbCwgIm1vZHVsdXMiKTsKICAgIGlmIChtID09IDEpIHJldHVybiAwOwogICAgaW50IHQgPSB0aGlzOwogICAgaWYgKCh0IDwgMCkgfHwgKHQgPj0gbSkpIHQgJT0gbTsKICAgIGlmICh0ID09IDEpIHJldHVybiAxOwogICAgaWYgKCh0ID09IDApIHx8ICh0LmlzRXZlbiAmJiBtLmlzRXZlbikpIHsKICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm90IGNvcHJpbWUiKTsKICAgIH0KICAgIHJldHVybiBfYmluYXJ5R2NkKG0sIHQsIHRydWUpOwogIH0KCiAgLy8gUmV0dXJucyBnY2Qgb2YgYWJzKHRoaXMpIGFuZCBhYnMob3RoZXIpLgogIGludCBnY2QoaW50IG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMhIGludCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZShvdGhlciwgIm90aGVyIiwgIm5vdCBhbiBpbnRlZ2VyIik7CiAgICB9CiAgICBpbnQgeCA9IHRoaXMuYWJzKCk7CiAgICBpbnQgeSA9IG90aGVyLmFicygpOwogICAgaWYgKHggPT0gMCkgcmV0dXJuIHk7CiAgICBpZiAoeSA9PSAwKSByZXR1cm4geDsKICAgIGlmICgoeCA9PSAxKSB8fCAoeSA9PSAxKSkgcmV0dXJuIDE7CiAgICByZXR1cm4gX2JpbmFyeUdjZCh4LCB5LCBmYWxzZSk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9TbWkgZXh0ZW5kcyBfSW50ZWdlckltcGxlbWVudGF0aW9uIHsKICBmYWN0b3J5IF9TbWkuX3VuaW5zdGFudGlhYmxlKCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIl9TbWkgY2FuIG9ubHkgYmUgYWxsb2NhdGVkIGJ5IHRoZSBWTSIpOwogIH0KICBpbnQgZ2V0IGhhc2hDb2RlID0+IHRoaXM7CiAgaW50IGdldCBfaWRlbnRpdHlIYXNoQ29kZSA9PiB0aGlzOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgb3BlcmF0b3IgfigpIG5hdGl2ZSAiU21pX2JpdE5lZ2F0ZSI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBnZXQgYml0TGVuZ3RoIG5hdGl2ZSAiU21pX2JpdExlbmd0aCI7CgogIGludCBvcGVyYXRvciAmKGludCBvdGhlcikgPT4gb3RoZXIuX2JpdEFuZEZyb21TbWkodGhpcyk7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgX2JpdEFuZEZyb21TbWkoX1NtaSBvdGhlcikgbmF0aXZlICJTbWlfYml0QW5kRnJvbVNtaSI7CgogIC8qKgogICAqIFRoZSBkaWdpdHMgb2YgJzAwJywgJzAxJywgLi4uICc5OScgYXMgYSBzaW5nbGUgYXJyYXkuCiAgICoKICAgKiBHZXQgdGhlIGRpZ2l0cyBvZiBgbmAsIHdpdGggYDAgPD0gbiA8IDEwMGAsIGFzCiAgICogYF9kaWdpdFRhYmxlW24gKiAyXWAgYW5kIGBfZGlnaXRUYWJsZVtuICogMiArIDFdYC4KICAgKi8KICBzdGF0aWMgY29uc3QgX2RpZ2l0VGFibGUgPSBjb25zdCBbCiAgICAweDMwLCAweDMwLCAweDMwLCAweDMxLCAweDMwLCAweDMyLCAweDMwLCAweDMzLCAvLwogICAgMHgzMCwgMHgzNCwgMHgzMCwgMHgzNSwgMHgzMCwgMHgzNiwgMHgzMCwgMHgzNywgLy8KICAgIDB4MzAsIDB4MzgsIDB4MzAsIDB4MzksIDB4MzEsIDB4MzAsIDB4MzEsIDB4MzEsIC8vCiAgICAweDMxLCAweDMyLCAweDMxLCAweDMzLCAweDMxLCAweDM0LCAweDMxLCAweDM1LCAvLwogICAgMHgzMSwgMHgzNiwgMHgzMSwgMHgzNywgMHgzMSwgMHgzOCwgMHgzMSwgMHgzOSwgLy8KICAgIDB4MzIsIDB4MzAsIDB4MzIsIDB4MzEsIDB4MzIsIDB4MzIsIDB4MzIsIDB4MzMsIC8vCiAgICAweDMyLCAweDM0LCAweDMyLCAweDM1LCAweDMyLCAweDM2LCAweDMyLCAweDM3LCAvLwogICAgMHgzMiwgMHgzOCwgMHgzMiwgMHgzOSwgMHgzMywgMHgzMCwgMHgzMywgMHgzMSwgLy8KICAgIDB4MzMsIDB4MzIsIDB4MzMsIDB4MzMsIDB4MzMsIDB4MzQsIDB4MzMsIDB4MzUsIC8vCiAgICAweDMzLCAweDM2LCAweDMzLCAweDM3LCAweDMzLCAweDM4LCAweDMzLCAweDM5LCAvLwogICAgMHgzNCwgMHgzMCwgMHgzNCwgMHgzMSwgMHgzNCwgMHgzMiwgMHgzNCwgMHgzMywgLy8KICAgIDB4MzQsIDB4MzQsIDB4MzQsIDB4MzUsIDB4MzQsIDB4MzYsIDB4MzQsIDB4MzcsIC8vCiAgICAweDM0LCAweDM4LCAweDM0LCAweDM5LCAweDM1LCAweDMwLCAweDM1LCAweDMxLCAvLwogICAgMHgzNSwgMHgzMiwgMHgzNSwgMHgzMywgMHgzNSwgMHgzNCwgMHgzNSwgMHgzNSwgLy8KICAgIDB4MzUsIDB4MzYsIDB4MzUsIDB4MzcsIDB4MzUsIDB4MzgsIDB4MzUsIDB4MzksIC8vCiAgICAweDM2LCAweDMwLCAweDM2LCAweDMxLCAweDM2LCAweDMyLCAweDM2LCAweDMzLCAvLwogICAgMHgzNiwgMHgzNCwgMHgzNiwgMHgzNSwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNywgLy8KICAgIDB4MzYsIDB4MzgsIDB4MzYsIDB4MzksIDB4MzcsIDB4MzAsIDB4MzcsIDB4MzEsIC8vCiAgICAweDM3LCAweDMyLCAweDM3LCAweDMzLCAweDM3LCAweDM0LCAweDM3LCAweDM1LCAvLwogICAgMHgzNywgMHgzNiwgMHgzNywgMHgzNywgMHgzNywgMHgzOCwgMHgzNywgMHgzOSwgLy8KICAgIDB4MzgsIDB4MzAsIDB4MzgsIDB4MzEsIDB4MzgsIDB4MzIsIDB4MzgsIDB4MzMsIC8vCiAgICAweDM4LCAweDM0LCAweDM4LCAweDM1LCAweDM4LCAweDM2LCAweDM4LCAweDM3LCAvLwogICAgMHgzOCwgMHgzOCwgMHgzOCwgMHgzOSwgMHgzOSwgMHgzMCwgMHgzOSwgMHgzMSwgLy8KICAgIDB4MzksIDB4MzIsIDB4MzksIDB4MzMsIDB4MzksIDB4MzQsIDB4MzksIDB4MzUsIC8vCiAgICAweDM5LCAweDM2LCAweDM5LCAweDM3LCAweDM5LCAweDM4LCAweDM5LCAweDM5LCAvLwogIF07CgogIC8qKgogICAqIFJlc3VsdCBvZiBpbnQudG9TdHJpbmcgZm9yIC05OSwgLTk4LCAuLi4sIDk4LCA5OS4KICAgKi8KICBzdGF0aWMgY29uc3QgX3NtYWxsTG9va3VwVGFibGUgPSBjb25zdCBbCiAgICAiLTk5IiwgIi05OCIsICItOTciLCAiLTk2IiwgIi05NSIsICItOTQiLCAiLTkzIiwgIi05MiIsICItOTEiLCAiLTkwIiwgLy8KICAgICItODkiLCAiLTg4IiwgIi04NyIsICItODYiLCAiLTg1IiwgIi04NCIsICItODMiLCAiLTgyIiwgIi04MSIsICItODAiLCAvLwogICAgIi03OSIsICItNzgiLCAiLTc3IiwgIi03NiIsICItNzUiLCAiLTc0IiwgIi03MyIsICItNzIiLCAiLTcxIiwgIi03MCIsIC8vCiAgICAiLTY5IiwgIi02OCIsICItNjciLCAiLTY2IiwgIi02NSIsICItNjQiLCAiLTYzIiwgIi02MiIsICItNjEiLCAiLTYwIiwgLy8KICAgICItNTkiLCAiLTU4IiwgIi01NyIsICItNTYiLCAiLTU1IiwgIi01NCIsICItNTMiLCAiLTUyIiwgIi01MSIsICItNTAiLCAvLwogICAgIi00OSIsICItNDgiLCAiLTQ3IiwgIi00NiIsICItNDUiLCAiLTQ0IiwgIi00MyIsICItNDIiLCAiLTQxIiwgIi00MCIsIC8vCiAgICAiLTM5IiwgIi0zOCIsICItMzciLCAiLTM2IiwgIi0zNSIsICItMzQiLCAiLTMzIiwgIi0zMiIsICItMzEiLCAiLTMwIiwgLy8KICAgICItMjkiLCAiLTI4IiwgIi0yNyIsICItMjYiLCAiLTI1IiwgIi0yNCIsICItMjMiLCAiLTIyIiwgIi0yMSIsICItMjAiLCAvLwogICAgIi0xOSIsICItMTgiLCAiLTE3IiwgIi0xNiIsICItMTUiLCAiLTE0IiwgIi0xMyIsICItMTIiLCAiLTExIiwgIi0xMCIsIC8vCiAgICAiLTkiLCAiLTgiLCAiLTciLCAiLTYiLCAiLTUiLCAiLTQiLCAiLTMiLCAiLTIiLCAiLTEiLCAiMCIsIC8vCiAgICAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiwgIjkiLCAiMTAiLCAvLwogICAgIjExIiwgIjEyIiwgIjEzIiwgIjE0IiwgIjE1IiwgIjE2IiwgIjE3IiwgIjE4IiwgIjE5IiwgIjIwIiwgLy8KICAgICIyMSIsICIyMiIsICIyMyIsICIyNCIsICIyNSIsICIyNiIsICIyNyIsICIyOCIsICIyOSIsICIzMCIsIC8vCiAgICAiMzEiLCAiMzIiLCAiMzMiLCAiMzQiLCAiMzUiLCAiMzYiLCAiMzciLCAiMzgiLCAiMzkiLCAiNDAiLCAvLwogICAgIjQxIiwgIjQyIiwgIjQzIiwgIjQ0IiwgIjQ1IiwgIjQ2IiwgIjQ3IiwgIjQ4IiwgIjQ5IiwgIjUwIiwgLy8KICAgICI1MSIsICI1MiIsICI1MyIsICI1NCIsICI1NSIsICI1NiIsICI1NyIsICI1OCIsICI1OSIsICI2MCIsIC8vCiAgICAiNjEiLCAiNjIiLCAiNjMiLCAiNjQiLCAiNjUiLCAiNjYiLCAiNjciLCAiNjgiLCAiNjkiLCAiNzAiLCAvLwogICAgIjcxIiwgIjcyIiwgIjczIiwgIjc0IiwgIjc1IiwgIjc2IiwgIjc3IiwgIjc4IiwgIjc5IiwgIjgwIiwgLy8KICAgICI4MSIsICI4MiIsICI4MyIsICI4NCIsICI4NSIsICI4NiIsICI4NyIsICI4OCIsICI4OSIsICI5MCIsIC8vCiAgICAiOTEiLCAiOTIiLCAiOTMiLCAiOTQiLCAiOTUiLCAiOTYiLCAiOTciLCAiOTgiLCAiOTkiIC8vCiAgXTsKCiAgLy8gUG93ZXJzIG9mIDEwIGFib3ZlIDEwMDAwMDAgYXJlIGluZGlzdGluZ3Vpc2hhYmxlIGJ5IGV5ZS4KICBzdGF0aWMgY29uc3QgaW50IF9QT1dfMTBfNyA9IDEwMDAwMDAwOwogIHN0YXRpYyBjb25zdCBpbnQgX1BPV18xMF84ID0gMTAwMDAwMDAwOwogIHN0YXRpYyBjb25zdCBpbnQgX1BPV18xMF85ID0gMTAwMDAwMDAwMDsKCiAgLy8gRmluZCB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIGluIGEgcG9zaXRpdmUgc21pLgogIC8vIE5ldmVyIGNhbGxlZCB3aXRoIG51bWJlcnMgPCAxMDAuIFRoZXNlIGFyZSBoYW5kbGVkIGJlZm9yZSBjYWxsaW5nLgogIHN0YXRpYyBpbnQgX3Bvc2l0aXZlQmFzZTEwTGVuZ3RoKHZhciBzbWkpIHsKICAgIC8vIEEgcG9zaXRpdmUgc21pIGhhcyBsZW5ndGggPD0gMTkgaWYgNjMtYml0LCAgPD0xMCBpZiAzMS1iaXQuCiAgICAvLyBBdm9pZCBjb21wYXJpbmcgYSAzMS1iaXQgc21pIHRvIGEgbm9uLXNtaS4KICAgIGlmIChzbWkgPCAxMDAwKSByZXR1cm4gMzsKICAgIGlmIChzbWkgPCAxMDAwMCkgcmV0dXJuIDQ7CiAgICBpZiAoc21pIDwgX1BPV18xMF83KSB7CiAgICAgIGlmIChzbWkgPCAxMDAwMDApIHJldHVybiA1OwogICAgICBpZiAoc21pIDwgMTAwMDAwMCkgcmV0dXJuIDY7CiAgICAgIHJldHVybiA3OwogICAgfQogICAgaWYgKHNtaSA8IF9QT1dfMTBfOCkgcmV0dXJuIDg7CiAgICBpZiAoc21pIDwgX1BPV18xMF85KSByZXR1cm4gOTsKICAgIHNtaSA9IHNtaSB+LyBfUE9XXzEwXzk7CiAgICAvLyBIYW5kbGUgbnVtYmVycyA8IDEwMCBiZWZvcmUgY2FsbGluZyByZWN1cnNpdmVseS4KICAgIGlmIChzbWkgPCAxMCkgcmV0dXJuIDEwOwogICAgaWYgKHNtaSA8IDEwMCkgcmV0dXJuIDExOwogICAgcmV0dXJuIDkgKyBfcG9zaXRpdmVCYXNlMTBMZW5ndGgoc21pKTsKICB9CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIGlmICh0aGlzIDwgMTAwICYmIHRoaXMgPiAtMTAwKSByZXR1cm4gX3NtYWxsTG9va3VwVGFibGVbdGhpcyArIDk5XTsKICAgIGlmICh0aGlzIDwgMCkgcmV0dXJuIF9uZWdhdGl2ZVRvU3RyaW5nKHRoaXMpOwogICAgLy8gSW5zcGlyZWQgYnkgQW5kcmVpIEFsZXhhbmRyZXNjdTogIlRocmVlIE9wdGltaXphdGlvbiBUaXBzIGZvciBDKysiCiAgICAvLyBBdm9pZCBleHBlbnNpdmUgcmVtYWluZGVyIG9wZXJhdGlvbiBieSBkb2luZyBpdCBvbiBtb3JlIHRoYW4KICAgIC8vIG9uZSBkaWdpdCBhdCBhIHRpbWUuCiAgICBjb25zdCBpbnQgRElHSVRfWkVSTyA9IDB4MzA7CiAgICBpbnQgbGVuZ3RoID0gX3Bvc2l0aXZlQmFzZTEwTGVuZ3RoKHRoaXMpOwogICAgX09uZUJ5dGVTdHJpbmcgcmVzdWx0ID0gX09uZUJ5dGVTdHJpbmcuX2FsbG9jYXRlKGxlbmd0aCk7CiAgICBpbnQgaW5kZXggPSBsZW5ndGggLSAxOwogICAgdmFyIHNtaSA9IHRoaXM7CiAgICBkbyB7CiAgICAgIC8vIFR3byBkaWdpdHMgYXQgYSB0aW1lLgogICAgICB2YXIgdHdvRGlnaXRzID0gc21pLnJlbWFpbmRlcigxMDApOwogICAgICBzbWkgPSBzbWkgfi8gMTAwOwogICAgICBpbnQgZGlnaXRJbmRleCA9IHR3b0RpZ2l0cyAqIDI7CiAgICAgIHJlc3VsdC5fc2V0QXQoaW5kZXgsIF9kaWdpdFRhYmxlW2RpZ2l0SW5kZXggKyAxXSk7CiAgICAgIHJlc3VsdC5fc2V0QXQoaW5kZXggLSAxLCBfZGlnaXRUYWJsZVtkaWdpdEluZGV4XSk7CiAgICAgIGluZGV4IC09IDI7CiAgICB9IHdoaWxlIChzbWkgPj0gMTAwKTsKICAgIGlmIChzbWkgPCAxMCkgewogICAgICAvLyBDaGFyYWN0ZXIgY29kZSBmb3IgJzAnLgogICAgICByZXN1bHQuX3NldEF0KGluZGV4LCBESUdJVF9aRVJPICsgc21pKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE5vIHJlbWFpbmRlciBmb3IgdGhpcyBjYXNlLgogICAgICBpbnQgZGlnaXRJbmRleCA9IHNtaSAqIDI7CiAgICAgIHJlc3VsdC5fc2V0QXQoaW5kZXgsIF9kaWdpdFRhYmxlW2RpZ2l0SW5kZXggKyAxXSk7CiAgICAgIHJlc3VsdC5fc2V0QXQoaW5kZXggLSAxLCBfZGlnaXRUYWJsZVtkaWdpdEluZGV4XSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8gRmluZCB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIGluIGEgbmVnYXRpdmUgc21pLgogIC8vIE5ldmVyIGNhbGxlZCB3aXRoIG51bWJlcnMgPiAtMTAwLiBUaGVzZSBhcmUgaGFuZGxlZCBiZWZvcmUgY2FsbGluZy4KICBzdGF0aWMgaW50IF9uZWdhdGl2ZUJhc2UxMExlbmd0aCh2YXIgbmVnU21pKSB7CiAgICAvLyBBIG5lZ2F0aXZlIHNtaSBoYXMgbGVuZ3RoIDw9IDE5IGlmIDYzLWJpdCwgPD0xMCBpZiAzMS1iaXQuCiAgICAvLyBBdm9pZCBjb21wYXJpbmcgYSAzMS1iaXQgc21pIHRvIGEgbm9uLXNtaS4KICAgIGlmIChuZWdTbWkgPiAtMTAwMCkgcmV0dXJuIDM7CiAgICBpZiAobmVnU21pID4gLTEwMDAwKSByZXR1cm4gNDsKICAgIGlmIChuZWdTbWkgPiAtX1BPV18xMF83KSB7CiAgICAgIGlmIChuZWdTbWkgPiAtMTAwMDAwKSByZXR1cm4gNTsKICAgICAgaWYgKG5lZ1NtaSA+IC0xMDAwMDAwKSByZXR1cm4gNjsKICAgICAgcmV0dXJuIDc7CiAgICB9CiAgICBpZiAobmVnU21pID4gLV9QT1dfMTBfOCkgcmV0dXJuIDg7CiAgICBpZiAobmVnU21pID4gLV9QT1dfMTBfOSkgcmV0dXJuIDk7CiAgICBuZWdTbWkgPSBuZWdTbWkgfi8gX1BPV18xMF85OwogICAgLy8gSGFuZGxlIG51bWJlcnMgPiAtMTAwIGJlZm9yZSBjYWxsaW5nIHJlY3Vyc2l2ZWx5LgogICAgaWYgKG5lZ1NtaSA+IC0xMCkgcmV0dXJuIDEwOwogICAgaWYgKG5lZ1NtaSA+IC0xMDApIHJldHVybiAxMTsKICAgIHJldHVybiA5ICsgX25lZ2F0aXZlQmFzZTEwTGVuZ3RoKG5lZ1NtaSk7CiAgfQoKICAvLyBDb252ZXJ0IGEgbmVnYXRpdmUgc21pIHRvIGEgc3RyaW5nLgogIC8vIERvZXNuJ3QgbmVnYXRlIHRoZSBzbWkgdG8gYXZvaWQgbmVnYXRpbmcgdGhlIG1vc3QgbmVnYXRpdmUgc21pLCB3aGljaAogIC8vIHdvdWxkIGJlY29tZSBhIG5vbi1zbWkuCiAgc3RhdGljIFN0cmluZyBfbmVnYXRpdmVUb1N0cmluZyhpbnQgbmVnU21pKSB7CiAgICAvLyBDaGFyYWN0ZXIgY29kZSBmb3IgJy0nCiAgICBjb25zdCBpbnQgTUlOVVNfU0lHTiA9IDB4MmQ7CiAgICAvLyBDaGFyYWN0ZXIgY29kZSBmb3IgJzAnLgogICAgY29uc3QgaW50IERJR0lUX1pFUk8gPSAweDMwOwogICAgaWYgKG5lZ1NtaSA+IC0xMCkgewogICAgICByZXR1cm4gX09uZUJ5dGVTdHJpbmcuX2FsbG9jYXRlKDIpCiAgICAgICAgLi5fc2V0QXQoMCwgTUlOVVNfU0lHTikKICAgICAgICAuLl9zZXRBdCgxLCBESUdJVF9aRVJPIC0gbmVnU21pKTsKICAgIH0KICAgIGlmIChuZWdTbWkgPiAtMTAwKSB7CiAgICAgIGludCBkaWdpdEluZGV4ID0gMiAqIC1uZWdTbWk7CiAgICAgIHJldHVybiBfT25lQnl0ZVN0cmluZy5fYWxsb2NhdGUoMykKICAgICAgICAuLl9zZXRBdCgwLCBNSU5VU19TSUdOKQogICAgICAgIC4uX3NldEF0KDEsIF9kaWdpdFRhYmxlW2RpZ2l0SW5kZXhdKQogICAgICAgIC4uX3NldEF0KDIsIF9kaWdpdFRhYmxlW2RpZ2l0SW5kZXggKyAxXSk7CiAgICB9CiAgICAvLyBOdW1iZXIgb2YgZGlnaXRzLCBub3QgaW5jbHVkaW5nIG1pbnVzLgogICAgaW50IGRpZ2l0Q291bnQgPSBfbmVnYXRpdmVCYXNlMTBMZW5ndGgobmVnU21pKTsKICAgIF9PbmVCeXRlU3RyaW5nIHJlc3VsdCA9IF9PbmVCeXRlU3RyaW5nLl9hbGxvY2F0ZShkaWdpdENvdW50ICsgMSk7CiAgICByZXN1bHQuX3NldEF0KDAsIE1JTlVTX1NJR04pOyAvLyAnLScuCiAgICBpbnQgaW5kZXggPSBkaWdpdENvdW50OwogICAgZG8gewogICAgICB2YXIgdHdvRGlnaXRzID0gbmVnU21pLnJlbWFpbmRlcigxMDApOwogICAgICBuZWdTbWkgPSBuZWdTbWkgfi8gMTAwOwogICAgICBpbnQgZGlnaXRJbmRleCA9IC10d29EaWdpdHMgKiAyOwogICAgICByZXN1bHQuX3NldEF0KGluZGV4LCBfZGlnaXRUYWJsZVtkaWdpdEluZGV4ICsgMV0pOwogICAgICByZXN1bHQuX3NldEF0KGluZGV4IC0gMSwgX2RpZ2l0VGFibGVbZGlnaXRJbmRleF0pOwogICAgICBpbmRleCAtPSAyOwogICAgfSB3aGlsZSAobmVnU21pIDw9IC0xMDApOwogICAgaWYgKG5lZ1NtaSA+IC0xMCkgewogICAgICByZXN1bHQuX3NldEF0KGluZGV4LCBESUdJVF9aRVJPIC0gbmVnU21pKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE5vIHJlbWFpbmRlciBuZWNlc3NhcnkgZm9yIHRoaXMgY2FzZS4KICAgICAgaW50IGRpZ2l0SW5kZXggPSAtbmVnU21pICogMjsKICAgICAgcmVzdWx0Ll9zZXRBdChpbmRleCwgX2RpZ2l0VGFibGVbZGlnaXRJbmRleCArIDFdKTsKICAgICAgcmVzdWx0Ll9zZXRBdChpbmRleCAtIDEsIF9kaWdpdFRhYmxlW2RpZ2l0SW5kZXhdKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CgovLyBSZXByZXNlbnRzIGludGVnZXJzIHRoYXQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGJ5IFNtaSBidXQgZml0IGludG8gNjRiaXRzLgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9NaW50IGV4dGVuZHMgX0ludGVnZXJJbXBsZW1lbnRhdGlvbiB7CiAgZmFjdG9yeSBfTWludC5fdW5pbnN0YW50aWFibGUoKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiX01pbnQgY2FuIG9ubHkgYmUgYWxsb2NhdGVkIGJ5IHRoZSBWTSIpOwogIH0KICBpbnQgZ2V0IGhhc2hDb2RlID0+IHRoaXM7CiAgaW50IGdldCBfaWRlbnRpdHlIYXNoQ29kZSA9PiB0aGlzOwogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgaW50IG9wZXJhdG9yIH4oKSBuYXRpdmUgIk1pbnRfYml0TmVnYXRlIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IGdldCBiaXRMZW5ndGggbmF0aXZlICJNaW50X2JpdExlbmd0aCI7CgogIGludCBfYml0QW5kRnJvbVNtaShfU21pIG90aGVyKSA9PiBfYml0QW5kRnJvbUludGVnZXIob3RoZXIpOwp9CoK5AE5OPAEeATcpPCk8KTwBKR8qNAYtBAEhLwQBKR4qNAYrBAEpFRUEASk/KT4pPwEdLgQBKUUpSClGKUgpQilCKUIpQilCKUwpSCkrBAEpPSk9ASgfGQQBKB8wBAEoIC4EASggLgQBKCovASgjGCoGEgQBKEMOJAQBETEEASgdGyMgHQEeJgQBHEtOSk8TJTgEAR0xG0VENx9DRD8zQEMqRCgaNRcKDyA0CggZFQhQOTQPTjQfCAYYEx8WDRQGBAEQEQQBEBEEAQ8RBAETEQQBGxwEARscBAEaHAQBHhwEAS4eTwYeTwYBIk4wMBMGQzArBi1FLjsRBAEQEQQBKxYqBAEvPAQBN0IEAS47BAFBASQjOQYkIwYtJisVNUBDLAYcCSEXKxksAUMzIwYTBAEkFiAmHiwUFBYSFzdCRS4IBkFEPkQaCUEeGRMEAS84Jy0cFhcJKxcrGhwBQzMjBhMEAR8dFUYGFUUGQ0MaEhoOBg8UFRkIDxcGDgQBKUlJMg8QJRERDQgVEw8PCAYeDw8kCRkREigUFAwTIBIKEQgZERIoFBQMEyASChEIFBAYEA8QGBAIFh0SKgYRDhkYDhkGDgQBJRoVRQZDGhIlGi4qBiMEAS4XGUcGGBkaGigkBAIBGiwjSAQcJTQrNCwBOwE0PQEGOwU0OAYlNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NwUBBjcGK01NTU1NTU1NTUI6Q0NDQ0NDQ0M8BQE+KSorATpILkMyHh8bIiMQBiMjHDgdHisEARZIMkpEHCEuPhwUCR8qGCY5ORIaFCEuDSUgOTkGEwQBOkkxQjIiIx8mJxAGJyciOSEiLgQBKUsdMB4hHyEYKSAqBhkkKSAtMgYuNEYqHAktHic5ORIeGDENLyQ5OQYTBAIBThotJEkEHCUpLDQtAT8CAR1kYXJ0OmNvcmUtcGF0Y2gvaW50ZWdlcnMuZGFydDxvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2ludm9jYXRpb25fbWlycm9yX3BhdGNoLmRhcnScdS8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb3JlX3BhdGNoLmRhcnQiOwoKLy8gTk9URTogV2hlbiBtYWtpbmcgY2hhbmdlcyB0byB0aGlzIGNsYXNzLCBwbGVhc2UgYWxzbyB1cGRhdGUKLy8gYFZtVGFyZ2V0Lmluc3RhbnRpYXRlSW52b2NhdGlvbmAgYW5kIGBWbVRhcmdldC5faW52b2NhdGlvblR5cGVgIGluCi8vIGBwa2cva2VybmVsL2xpYi90YXJnZXQvdm0uZGFydGAuCmNsYXNzIF9JbnZvY2F0aW9uTWlycm9yIGltcGxlbWVudHMgSW52b2NhdGlvbiB7CiAgLy8gQ29uc3RhbnRzIGRlc2NyaWJpbmcgdGhlIGludm9jYXRpb24ga2luZC4KICAvLyBfRklFTEQgY2Fubm90IGJlIGdlbmVyYXRlZCBieSByZWd1bGFyIGludm9jYXRpb24gbWlycm9ycy4KICBzdGF0aWMgY29uc3QgaW50IF9NRVRIT0QgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgX0dFVFRFUiA9IDE7CiAgc3RhdGljIGNvbnN0IGludCBfU0VUVEVSID0gMjsKICBzdGF0aWMgY29uc3QgaW50IF9GSUVMRCA9IDM7CiAgc3RhdGljIGNvbnN0IGludCBfTE9DQUxfVkFSID0gNDsKICBzdGF0aWMgY29uc3QgaW50IF9LSU5EX1NISUZUID0gMDsKICBzdGF0aWMgY29uc3QgaW50IF9LSU5EX0JJVFMgPSAzOwogIHN0YXRpYyBjb25zdCBpbnQgX0tJTkRfTUFTSyA9ICgxIDw8IF9LSU5EX0JJVFMpIC0gMTsKCiAgLy8gVGhlc2UgdmFsdWVzLCBleGNlcHQgX0RZTkFNSUMgYW5kIF9TVVBFUiwgYXJlIG9ubHkgdXNlZCB3aGVuIHRocm93aW5nCiAgLy8gTm9TdWNoTWV0aG9kRXJyb3IgZm9yIGNvbXBpbGUtdGltZSByZXNvbHV0aW9uIGZhaWx1cmVzLgogIHN0YXRpYyBjb25zdCBpbnQgX0RZTkFNSUMgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgX1NVUEVSID0gMTsKICBzdGF0aWMgY29uc3QgaW50IF9TVEFUSUMgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgX0NPTlNUUlVDVE9SID0gMzsKICBzdGF0aWMgY29uc3QgaW50IF9UT1BfTEVWRUwgPSA0OwogIHN0YXRpYyBjb25zdCBpbnQgX0xFVkVMX1NISUZUID0gX0tJTkRfQklUUzsKICBzdGF0aWMgY29uc3QgaW50IF9MRVZFTF9CSVRTID0gMzsKICBzdGF0aWMgY29uc3QgaW50IF9MRVZFTF9NQVNLID0gKDEgPDwgX0xFVkVMX0JJVFMpIC0gMTsKCiAgLy8gQXJndW1lbnRzRGVzY3JpcHRvciBsYXlvdXQuIEtlZXAgaW4gc3luYyB3aXRoIGVudW0gaW4gZGFydF9lbnRyeS5oLgogIHN0YXRpYyBjb25zdCBpbnQgX1RZUEVfQVJHU19MRU4gPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgX0NPVU5UID0gMTsKICBzdGF0aWMgY29uc3QgaW50IF9QT1NJVElPTkFMX0NPVU5UID0gMjsKICBzdGF0aWMgY29uc3QgaW50IF9GSVJTVF9OQU1FRF9FTlRSWSA9IDM7CgogIC8vIEludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnZvY2F0aW9uIG1pcnJvci4KICBTdHJpbmcgX2Z1bmN0aW9uTmFtZTsKICBMaXN0IF9hcmd1bWVudHNEZXNjcmlwdG9yOwogIExpc3QgX2FyZ3VtZW50czsKICBib29sIF9pc1N1cGVySW52b2NhdGlvbjsKICBpbnQgX2RlbGF5ZWRUeXBlQXJndW1lbnRzTGVuOwoKICAvLyBFeHRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW52b2NhdGlvbiBtaXJyb3I7IHBvcHVsYXRlZCBvbiBkZW1hbmQuCiAgU3ltYm9sIF9tZW1iZXJOYW1lOwogIGludCBfdHlwZTsKICBMaXN0PFR5cGU+IF90eXBlQXJndW1lbnRzOwogIExpc3QgX3Bvc2l0aW9uYWxBcmd1bWVudHM7CiAgTWFwPFN5bWJvbCwgZHluYW1pYz4gX25hbWVkQXJndW1lbnRzOwoKICBfSW52b2NhdGlvbk1pcnJvci5fd2l0aFR5cGUodGhpcy5fbWVtYmVyTmFtZSwgdGhpcy5fdHlwZSwgdGhpcy5fdHlwZUFyZ3VtZW50cywKICAgICAgdGhpcy5fcG9zaXRpb25hbEFyZ3VtZW50cywgdGhpcy5fbmFtZWRBcmd1bWVudHMpIHsKICAgIF90eXBlQXJndW1lbnRzID8/PSBjb25zdCA8VHlwZT5bXTsKICAgIF9wb3NpdGlvbmFsQXJndW1lbnRzID8/PSBjb25zdCBbXTsKICAgIF9uYW1lZEFyZ3VtZW50cyA/Pz0gY29uc3Qge307CiAgfQoKICB2b2lkIF9zZXRNZW1iZXJOYW1lQW5kVHlwZSgpIHsKICAgIF90eXBlID8/PSAwOwogICAgaWYgKF9mdW5jdGlvbk5hbWUuc3RhcnRzV2l0aCgiZ2V0OiIpKSB7CiAgICAgIF90eXBlIHw9IF9HRVRURVI7CiAgICAgIF9tZW1iZXJOYW1lID0gbmV3IGludGVybmFsLlN5bWJvbC51bnZhbGlkYXRlZChfZnVuY3Rpb25OYW1lLnN1YnN0cmluZyg0KSk7CiAgICB9IGVsc2UgaWYgKF9mdW5jdGlvbk5hbWUuc3RhcnRzV2l0aCgic2V0OiIpKSB7CiAgICAgIF90eXBlIHw9IF9TRVRURVI7CiAgICAgIF9tZW1iZXJOYW1lID0KICAgICAgICAgIG5ldyBpbnRlcm5hbC5TeW1ib2wudW52YWxpZGF0ZWQoX2Z1bmN0aW9uTmFtZS5zdWJzdHJpbmcoNCkgKyAiPSIpOwogICAgfSBlbHNlIHsKICAgICAgX3R5cGUgfD0KICAgICAgICAgIF9pc1N1cGVySW52b2NhdGlvbiA/IChfU1VQRVIgPDwgX0xFVkVMX1NISUZUKSB8IF9NRVRIT0QgOiBfTUVUSE9EOwogICAgICBfbWVtYmVyTmFtZSA9IG5ldyBpbnRlcm5hbC5TeW1ib2wudW52YWxpZGF0ZWQoX2Z1bmN0aW9uTmFtZSk7CiAgICB9CiAgfQoKICBTeW1ib2wgZ2V0IG1lbWJlck5hbWUgewogICAgaWYgKF9tZW1iZXJOYW1lID09IG51bGwpIHsKICAgICAgX3NldE1lbWJlck5hbWVBbmRUeXBlKCk7CiAgICB9CiAgICByZXR1cm4gX21lbWJlck5hbWU7CiAgfQoKICBpbnQgZ2V0IF90eXBlQXJnc0xlbiB7CiAgICBpbnQgdHlwZUFyZ3NMZW4gPSBfYXJndW1lbnRzRGVzY3JpcHRvcltfVFlQRV9BUkdTX0xFTl07CiAgICByZXR1cm4gdHlwZUFyZ3NMZW4gPT0gMCA/IF9kZWxheWVkVHlwZUFyZ3VtZW50c0xlbiA6IHR5cGVBcmdzTGVuOwogIH0KCiAgTGlzdDxUeXBlPiBnZXQgdHlwZUFyZ3VtZW50cyB7CiAgICBpZiAoX3R5cGVBcmd1bWVudHMgPT0gbnVsbCkgewogICAgICBpZiAoX3R5cGVBcmdzTGVuID09IDApIHsKICAgICAgICByZXR1cm4gX3R5cGVBcmd1bWVudHMgPSBjb25zdCA8VHlwZT5bXTsKICAgICAgfQogICAgICAvLyBBIFR5cGVBcmd1bWVudHMgb2JqZWN0IGRvZXMgbm90IGhhdmUgYSBjb3JyZXNwb25kaW5nIERhcnQgY2xhc3MgYW5kCiAgICAgIC8vIGNhbm5vdCBiZSBhY2Nlc3NlZCBhcyBhbiBhcnJheSBpbiBEYXJ0LiBUaGVyZWZvcmUsIHdlIG5lZWQgYSBuYXRpdmUKICAgICAgLy8gY2FsbCB0byB1bnBhY2sgdGhlIGluZGl2aWR1YWwgdHlwZXMgaW50byBhIGxpc3QuCiAgICAgIF90eXBlQXJndW1lbnRzID0gX3VucGFja1R5cGVBcmd1bWVudHMoX2FyZ3VtZW50c1swXSwgX3R5cGVBcmdzTGVuKTsKICAgIH0KICAgIHJldHVybiBfdHlwZUFyZ3VtZW50czsKICB9CgogIC8vIFVucGFjayB0aGUgZ2l2ZW4gVHlwZUFyZ3VtZW50cyBvYmplY3QgaW50byBhIG5ldyBsaXN0IG9mIGluZGl2aWR1YWwgdHlwZXMuCiAgc3RhdGljIExpc3Q8VHlwZT4gX3VucGFja1R5cGVBcmd1bWVudHModHlwZUFyZ3VtZW50cywgaW50IG51bVR5cGVBcmd1bWVudHMpCiAgICAgIG5hdGl2ZSAiSW52b2NhdGlvbk1pcnJvcl91bnBhY2tUeXBlQXJndW1lbnRzIjsKCiAgTGlzdCBnZXQgcG9zaXRpb25hbEFyZ3VtZW50cyB7CiAgICBpZiAoX3Bvc2l0aW9uYWxBcmd1bWVudHMgPT0gbnVsbCkgewogICAgICAvLyBUaGUgYXJndW1lbnQgZGVzY3JpcHRvciBjb3VudHMgdGhlIHJlY2VpdmVyLCBidXQgbm90IHRoZSB0eXBlIGFyZ3VtZW50cwogICAgICAvLyBhcyBwb3NpdGlvbmFsIGFyZ3VtZW50cy4KICAgICAgaW50IG51bVBvc2l0aW9uYWxBcmd1bWVudHMgPSBfYXJndW1lbnRzRGVzY3JpcHRvcltfUE9TSVRJT05BTF9DT1VOVF0gLSAxOwogICAgICBpZiAobnVtUG9zaXRpb25hbEFyZ3VtZW50cyA9PSAwKSB7CiAgICAgICAgcmV0dXJuIF9wb3NpdGlvbmFsQXJndW1lbnRzID0gY29uc3QgW107CiAgICAgIH0KICAgICAgLy8gRXhjbHVkZSByZWNlaXZlciBhbmQgdHlwZSBhcmdzIGluIHRoZSByZXR1cm5lZCBsaXN0LgogICAgICBpbnQgcmVjZWl2ZXJJbmRleCA9IF90eXBlQXJnc0xlbiA+IDAgPyAxIDogMDsKICAgICAgX3Bvc2l0aW9uYWxBcmd1bWVudHMgPSBuZXcgX0ltbXV0YWJsZUxpc3QuX2Zyb20oCiAgICAgICAgICBfYXJndW1lbnRzLCByZWNlaXZlckluZGV4ICsgMSwgbnVtUG9zaXRpb25hbEFyZ3VtZW50cyk7CiAgICB9CiAgICByZXR1cm4gX3Bvc2l0aW9uYWxBcmd1bWVudHM7CiAgfQoKICBNYXA8U3ltYm9sLCBkeW5hbWljPiBnZXQgbmFtZWRBcmd1bWVudHMgewogICAgaWYgKF9uYW1lZEFyZ3VtZW50cyA9PSBudWxsKSB7CiAgICAgIGludCBudW1Bcmd1bWVudHMgPSBfYXJndW1lbnRzRGVzY3JpcHRvcltfQ09VTlRdIC0gMTsgLy8gRXhjbHVkZSByZWNlaXZlci4KICAgICAgaW50IG51bVBvc2l0aW9uYWxBcmd1bWVudHMgPSBfYXJndW1lbnRzRGVzY3JpcHRvcltfUE9TSVRJT05BTF9DT1VOVF0gLSAxOwogICAgICBpbnQgbnVtTmFtZWRBcmd1bWVudHMgPSBudW1Bcmd1bWVudHMgLSBudW1Qb3NpdGlvbmFsQXJndW1lbnRzOwogICAgICBpZiAobnVtTmFtZWRBcmd1bWVudHMgPT0gMCkgewogICAgICAgIHJldHVybiBfbmFtZWRBcmd1bWVudHMgPSBjb25zdCB7fTsKICAgICAgfQogICAgICBpbnQgcmVjZWl2ZXJJbmRleCA9IF90eXBlQXJnc0xlbiA+IDAgPyAxIDogMDsKICAgICAgX25hbWVkQXJndW1lbnRzID0gbmV3IE1hcDxTeW1ib2wsIGR5bmFtaWM+KCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtTmFtZWRBcmd1bWVudHM7IGkrKykgewogICAgICAgIGludCBuYW1lZEVudHJ5SW5kZXggPSBfRklSU1RfTkFNRURfRU5UUlkgKyAyICogaTsKICAgICAgICBTdHJpbmcgYXJnX25hbWUgPSBfYXJndW1lbnRzRGVzY3JpcHRvcltuYW1lZEVudHJ5SW5kZXhdOwogICAgICAgIHZhciBhcmdfdmFsdWUgPSBfYXJndW1lbnRzWwogICAgICAgICAgICByZWNlaXZlckluZGV4ICsgX2FyZ3VtZW50c0Rlc2NyaXB0b3JbbmFtZWRFbnRyeUluZGV4ICsgMV1dOwogICAgICAgIF9uYW1lZEFyZ3VtZW50c1tuZXcgaW50ZXJuYWwuU3ltYm9sLnVudmFsaWRhdGVkKGFyZ19uYW1lKV0gPSBhcmdfdmFsdWU7CiAgICAgIH0KICAgICAgX25hbWVkQXJndW1lbnRzID0gbmV3IE1hcC51bm1vZGlmaWFibGUoX25hbWVkQXJndW1lbnRzKTsKICAgIH0KICAgIHJldHVybiBfbmFtZWRBcmd1bWVudHM7CiAgfQoKICBib29sIGdldCBpc01ldGhvZCB7CiAgICBpZiAoX3R5cGUgPT0gbnVsbCkgewogICAgICBfc2V0TWVtYmVyTmFtZUFuZFR5cGUoKTsKICAgIH0KICAgIHJldHVybiAoX3R5cGUgJiBfS0lORF9NQVNLKSA9PSBfTUVUSE9EOwogIH0KCiAgYm9vbCBnZXQgaXNBY2Nlc3NvciB7CiAgICBpZiAoX3R5cGUgPT0gbnVsbCkgewogICAgICBfc2V0TWVtYmVyTmFtZUFuZFR5cGUoKTsKICAgIH0KICAgIHJldHVybiAoX3R5cGUgJiBfS0lORF9NQVNLKSAhPSBfTUVUSE9EOwogIH0KCiAgYm9vbCBnZXQgaXNHZXR0ZXIgewogICAgaWYgKF90eXBlID09IG51bGwpIHsKICAgICAgX3NldE1lbWJlck5hbWVBbmRUeXBlKCk7CiAgICB9CiAgICByZXR1cm4gKF90eXBlICYgX0tJTkRfTUFTSykgPT0gX0dFVFRFUjsKICB9CgogIGJvb2wgZ2V0IGlzU2V0dGVyIHsKICAgIGlmIChfdHlwZSA9PSBudWxsKSB7CiAgICAgIF9zZXRNZW1iZXJOYW1lQW5kVHlwZSgpOwogICAgfQogICAgcmV0dXJuIChfdHlwZSAmIF9LSU5EX01BU0spID09IF9TRVRURVI7CiAgfQoKICBfSW52b2NhdGlvbk1pcnJvcih0aGlzLl9mdW5jdGlvbk5hbWUsIHRoaXMuX2FyZ3VtZW50c0Rlc2NyaXB0b3IsCiAgICAgIHRoaXMuX2FyZ3VtZW50cywgdGhpcy5faXNTdXBlckludm9jYXRpb24sIHRoaXMuX3R5cGUsCiAgICAgIFt0aGlzLl9kZWxheWVkVHlwZUFyZ3VtZW50c0xlbiA9IDBdKTsKCiAgX0ludm9jYXRpb25NaXJyb3IuX3dpdGhvdXRUeXBlKHRoaXMuX2Z1bmN0aW9uTmFtZSwgdGhpcy5fdHlwZUFyZ3VtZW50cywKICAgICAgdGhpcy5fcG9zaXRpb25hbEFyZ3VtZW50cywgdGhpcy5fbmFtZWRBcmd1bWVudHMsIHRoaXMuX2lzU3VwZXJJbnZvY2F0aW9uLAogICAgICBbdGhpcy5fZGVsYXllZFR5cGVBcmd1bWVudHNMZW4gPSAwXSk7CgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQogIHN0YXRpYyBfYWxsb2NhdGVJbnZvY2F0aW9uTWlycm9yKFN0cmluZyBmdW5jdGlvbk5hbWUsCiAgICAgIExpc3QgYXJndW1lbnRzRGVzY3JpcHRvciwgTGlzdCBhcmd1bWVudHMsIGJvb2wgaXNTdXBlckludm9jYXRpb24sCiAgICAgIFtpbnQgdHlwZSA9IG51bGxdKSB7CiAgICByZXR1cm4gbmV3IF9JbnZvY2F0aW9uTWlycm9yKAogICAgICAgIGZ1bmN0aW9uTmFtZSwgYXJndW1lbnRzRGVzY3JpcHRvciwgYXJndW1lbnRzLCBpc1N1cGVySW52b2NhdGlvbiwgdHlwZSk7CiAgfQoKICAvLyBUaGlzIGZhY3RvcnkgaXMgdXNlZCB3aGVuIGNyZWF0aW5nIGFuIGBJbnZvY2F0aW9uYCBmb3IgYSBjbG9zdXJlIGNhbGwgd2hpY2gKICAvLyBtYXkgaGF2ZSBkZWxheWVkIHR5cGUgYXJndW1lbnRzLiBJbiB0aGF0IGNhc2UsIHRoZSBhcmd1bWVudHMgZGVzY3JpcHRvciB3aWxsCiAgLy8gaW5kaWNhdGUgMCB0eXBlIGFyZ3VtZW50cywgYnV0IHRoZSBhY3R1YWwgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzIGFyZQogIC8vIHBhc3NlZCBpbiBgZGVsYXllZFR5cGVBcmd1bWVudHNMZW5gLiBJZiBhbnkgdHlwZSBhcmd1bWVudHMgYXJlIGF2YWlsYWJsZSwKICAvLyB0aGUgdHlwZSBhcmd1bWVudHMgdmVjdG9yIHdpbGwgYmUgdGhlIGZpcnN0IGVudHJ5IGluIGBhcmd1bWVudHNgLgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQogIHN0YXRpYyBfYWxsb2NhdGVJbnZvY2F0aW9uTWlycm9yRm9yQ2xvc3VyZSgKICAgICAgU3RyaW5nIGZ1bmN0aW9uTmFtZSwKICAgICAgTGlzdCBhcmd1bWVudHNEZXNjcmlwdG9yLAogICAgICBMaXN0IGFyZ3VtZW50cywKICAgICAgaW50IHR5cGUsCiAgICAgIGludCBkZWxheWVkVHlwZUFyZ3VtZW50c0xlbikgewogICAgcmV0dXJuIG5ldyBfSW52b2NhdGlvbk1pcnJvcihmdW5jdGlvbk5hbWUsIGFyZ3VtZW50c0Rlc2NyaXB0b3IsIGFyZ3VtZW50cywKICAgICAgICBmYWxzZSwgdHlwZSwgZGVsYXllZFR5cGVBcmd1bWVudHNMZW4pOwogIH0KfQqAzABOTjwBHgE/RiQwLz8gICAfIyQjNwFLPSEfICUjLiQ5AUknHyorATcYHRMbIAFMFg0dHSgBUTknJyIEASERLBhRMxgUTQ0PTUQGBAEaHx8GGAQBGTxGBAEhIh8wCE1NOkoGGwQBUE41ASEoUSJQKTAIPjQ3QgYhBAEsI1BQRSQrCDQ0NDpBJEhQCD8GHAQBFhkfBiwEARgZHwYsBAEWGR8GLAQBFhkfBiwEAUM8LAFKUCwBJDhIGyJQBAFRUkxPRyQuGyAWECVPLwQCASxkYXJ0OmNvcmUtcGF0Y2gvaW52b2NhdGlvbl9taXJyb3JfcGF0Y2guZGFydC9vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2xpYl9wcmVmaXguZGFydIvTLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvcmVfcGF0Y2guZGFydCI7CgovLyBUaGlzIHR5cGUgY29ycmVzcG9uZHMgdG8gdGhlIFZNLWludGVybmFsIGNsYXNzIExpYnJhcnlQcmVmaXguCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0xpYnJhcnlQcmVmaXggewogIGJvb2wgX2xvYWQoKSBuYXRpdmUgIkxpYnJhcnlQcmVmaXhfbG9hZCI7CiAgT2JqZWN0IF9sb2FkRXJyb3IoKSBuYXRpdmUgIkxpYnJhcnlQcmVmaXhfbG9hZEVycm9yIjsKICBib29sIGlzTG9hZGVkKCkgbmF0aXZlICJMaWJyYXJ5UHJlZml4X2lzTG9hZGVkIjsKICBib29sIF9pbnZhbGlkYXRlRGVwZW5kZW50Q29kZSgpCiAgICAgIG5hdGl2ZSAiTGlicmFyeVByZWZpeF9pbnZhbGlkYXRlRGVwZW5kZW50Q29kZSI7CgogIGxvYWRMaWJyYXJ5KCkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfb3V0c3RhbmRpbmdMb2FkUmVxdWVzdHMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKF9vdXRzdGFuZGluZ0xvYWRSZXF1ZXN0c1tpXVswXSA9PSB0aGlzKSB7CiAgICAgICAgcmV0dXJuIF9vdXRzdGFuZGluZ0xvYWRSZXF1ZXN0c1tpXVsxXS5mdXR1cmU7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgY29tcGxldGVyID0gbmV3IENvbXBsZXRlcjxib29sPigpOwogICAgdmFyIHBhaXIgPSBuZXcgTGlzdCgpOwogICAgcGFpci5hZGQodGhpcyk7CiAgICBwYWlyLmFkZChjb21wbGV0ZXIpOwogICAgX291dHN0YW5kaW5nTG9hZFJlcXVlc3RzLmFkZChwYWlyKTsKICAgIFRpbWVyLnJ1bigoKSB7CiAgICAgIHZhciBoYXNDb21wbGV0ZWQgPSB0aGlzLl9sb2FkKCk7CiAgICAgIC8vIExvYWRpbmcgY2FuIGNvbXBsZXRlIGltbWVkaWF0ZWx5LCBmb3IgZXhhbXBsZSB3aGVuIHRoZSBzYW1lCiAgICAgIC8vIGxpYnJhcnkgaGFzIGJlZW4gbG9hZGVkIGVhZ2VybHkgb3IgdGhyb3VnaCBhbm90aGVyIGRlZmVycmVkCiAgICAgIC8vIHByZWZpeC4gSWYgdGhhdCBpcyB0aGUgY2FzZSwgd2UgbXVzdCBpbnZhbGlkYXRlIHRoZSBkZXBlbmRlbnQKICAgICAgLy8gY29kZSBhbmQgY29tcGxldGUgdGhlIGZ1dHVyZSBub3cgc2luY2UgdGhlcmUgd2lsbCBiZSBubyBjYWxsYmFjawogICAgICAvLyBmcm9tIHRoZSBWTS4KICAgICAgaWYgKGhhc0NvbXBsZXRlZCAmJiAhY29tcGxldGVyLmlzQ29tcGxldGVkKSB7CiAgICAgICAgX2ludmFsaWRhdGVEZXBlbmRlbnRDb2RlKCk7CiAgICAgICAgY29tcGxldGVyLmNvbXBsZXRlKHRydWUpOwogICAgICAgIF9vdXRzdGFuZGluZ0xvYWRSZXF1ZXN0cy5yZW1vdmUocGFpcik7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIGNvbXBsZXRlci5mdXR1cmU7CiAgfQp9CgovLyBBIGxpc3Qgb2YgdHdvIGVsZW1lbnQgbGlzdHMuIFRoZSBmaXJzdCBlbGVtZW50IGlzIHRoZSBfTGlicmFyeVByZWZpeC4gVGhlCi8vIHNlY29uZCBlbGVtZW50IGlzIHRoZSBDb21wbGV0ZXIgZm9yIHRoZSBsb2FkIHJlcXVlc3QuCnZhciBfb3V0c3RhbmRpbmdMb2FkUmVxdWVzdHMgPSBuZXcgTGlzdDxMaXN0PigpOwoKLy8gQ2FsbGVkIGZyb20gdGhlIFZNIHdoZW4gYW4gb3V0c3RhbmRpbmcgbG9hZCByZXF1ZXN0IGhhcyBmaW5pc2hlZC4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCl9jb21wbGV0ZURlZmVycmVkTG9hZHMoKSB7CiAgLy8gRGV0ZXJtaW5lIHdoaWNoIG91dHN0YW5kaW5nIGxvYWQgcmVxdWVzdHMgaGF2ZSBjb21wbGV0ZWQgYW5kIGNvbXBsZXRlCiAgLy8gdGhlaXIgY29tcGxldGVyICh3aXRoIGFuIGVycm9yIG9yIHRydWUpLiBGb3Igb3V0c3RhbmRpbmcgbG9hZCByZXF1ZXN0cwogIC8vIHdoaWNoIGhhdmUgbm90IGNvbXBsZXRlZCwgcmVtZW1iZXIgdGhlbSBmb3IgbmV4dCB0aW1lIGluCiAgLy8gc3RpbGxPdXRzdGFuZGluZ0xvYWRSZXF1ZXN0cy4KICB2YXIgc3RpbGxPdXRzdGFuZGluZ0xvYWRSZXF1ZXN0cyA9IG5ldyBMaXN0PExpc3Q+KCk7CgogIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBvdXRzdGFuZGluZ1JlcXVlc3RzIGJlY2F1c2UgdGhlIGNhbGwgdG8gX2xvYWQgYmVsb3cKICAvLyBtYXkgcmVjdXJzaXZlbHkgdHJpZ2dlciBhbm90aGVyIGNhbGwgdG8gfF9jb21wbGV0ZURlZmVycmVkTG9hZHN8LCB3aGljaAogIC8vIGNhbiBjYXVzZSB8X291dHN0YW5kaW5nTG9hZFJlcXVlc3RzfCB0byBiZSBtb2RpZmllZC4KICB2YXIgb3V0c3RhbmRpbmdSZXF1ZXN0cyA9IF9vdXRzdGFuZGluZ0xvYWRSZXF1ZXN0cy50b0xpc3QoKTsKICBmb3IgKGludCBpID0gMDsgaSA8IG91dHN0YW5kaW5nUmVxdWVzdHMubGVuZ3RoOyBpKyspIHsKICAgIHZhciBwcmVmaXggPSBvdXRzdGFuZGluZ1JlcXVlc3RzW2ldWzBdOwogICAgdmFyIGNvbXBsZXRlciA9IG91dHN0YW5kaW5nUmVxdWVzdHNbaV1bMV07CiAgICB2YXIgZXJyb3IgPSBwcmVmaXguX2xvYWRFcnJvcigpOwogICAgaWYgKGNvbXBsZXRlci5pc0NvbXBsZXRlZCkgewogICAgICAvLyBBbHJlYWR5IGNvbXBsZXRlZC4gU2tpcC4KICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAoZXJyb3IgIT0gbnVsbCkgewogICAgICBjb21wbGV0ZXIuY29tcGxldGVFcnJvcihlcnJvcik7CiAgICB9IGVsc2UgaWYgKHByZWZpeC5fbG9hZCgpKSB7CiAgICAgIHByZWZpeC5faW52YWxpZGF0ZURlcGVuZGVudENvZGUoKTsKICAgICAgY29tcGxldGVyLmNvbXBsZXRlKHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgc3RpbGxPdXRzdGFuZGluZ0xvYWRSZXF1ZXN0cy5hZGQob3V0c3RhbmRpbmdSZXF1ZXN0c1tpXSk7CiAgICB9CiAgfQogIF9vdXRzdGFuZGluZ0xvYWRSZXF1ZXN0cyA9IHN0aWxsT3V0c3RhbmRpbmdMb2FkUmVxdWVzdHM7Cn0KUgBOTjwBHgFBGhcsODMiNgESQDQ2CAYBKxsUGSgTJ0VFR0oWNCQiLwgIHQQCAU05MQFFIhtLTD4jNwFMTTo/OSwvJSEiEAYZJiEpIA1ABgQ7AgEfZGFydDpjb3JlLXBhdGNoL2xpYl9wcmVmaXguZGFydDFvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL3JlZ2V4cF9wYXRjaC5kYXJ0sLovLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCkBwYXRjaApjbGFzcyBSZWdFeHAgewogIEBwYXRjaAogIGZhY3RvcnkgUmVnRXhwKFN0cmluZyBzb3VyY2UsCiAgICAgIHtib29sIG11bHRpTGluZTogZmFsc2UsIGJvb2wgY2FzZVNlbnNpdGl2ZTogdHJ1ZX0pIHsKICAgIF9SZWdFeHBIYXNoS2V5IGtleSA9IG5ldyBfUmVnRXhwSGFzaEtleShzb3VyY2UsIG11bHRpTGluZSwgY2FzZVNlbnNpdGl2ZSk7CiAgICBfUmVnRXhwSGFzaFZhbHVlIHZhbHVlID0gX2NhY2hlW2tleV07CgogICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgaWYgKF9jYWNoZS5sZW5ndGggPiBfTUFYX0NBQ0hFX1NJWkUpIHsKICAgICAgICBfUmVnRXhwSGFzaEtleSBsYXN0S2V5ID0gX3JlY2VudGx5VXNlZC5sYXN0OwogICAgICAgIF9yZWNlbnRseVVzZWQucmVtb3ZlKGxhc3RLZXkpOwogICAgICAgIF9jYWNoZS5yZW1vdmUobGFzdEtleSk7CiAgICAgIH0KCiAgICAgIHZhbHVlID0gbmV3IF9SZWdFeHBIYXNoVmFsdWUoCiAgICAgICAgICBuZXcgX1JlZ0V4cChzb3VyY2UsCiAgICAgICAgICAgICAgbXVsdGlMaW5lOiBtdWx0aUxpbmUsIGNhc2VTZW5zaXRpdmU6IGNhc2VTZW5zaXRpdmUpLAogICAgICAgICAga2V5KTsKICAgICAgX2NhY2hlW2tleV0gPSB2YWx1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHZhbHVlLmtleS51bmxpbmsoKTsKICAgIH0KCiAgICBhc3NlcnQodmFsdWUgIT0gbnVsbCk7CgogICAgX3JlY2VudGx5VXNlZC5hZGRGaXJzdCh2YWx1ZS5rZXkpOwogICAgYXNzZXJ0KF9yZWNlbnRseVVzZWQubGVuZ3RoID09IF9jYWNoZS5sZW5ndGgpOwoKICAgIC8vIFRPRE8oemVybnkpOiBXZSBtaWdodCBub3Qgd2FudCB0byBjYW5vbmljYWxpemUgcmVnZXhwIG9iamVjdHMuCiAgICByZXR1cm4gdmFsdWUucmVnZXhwOwogIH0KCiAgLyoqCiAgICogRmluZHMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBSZWdFeHAtc2lnbmlmaWNhbnQgY2hhciBpbiBbdGV4dF0uCiAgICoKICAgKiBTdGFydHMgbG9va2luZyBmcm9tIFtzdGFydF0uIFJldHVybnMgYHRleHQubGVuZ3RoYCBpZiBubyBjaGFyYWN0ZXIKICAgKiBpcyBmb3VuZCB0aGF0IGhhcyBzcGVjaWFsIG1lYW5pbmcgaW4gUmVnRXhwIHN5bnRheC4KICAgKi8KICBzdGF0aWMgaW50IF9maW5kRXNjYXBlQ2hhcihTdHJpbmcgdGV4dCwgaW50IHN0YXJ0KSB7CiAgICAvLyBUYWJsZSB3aGVyZSBlYWNoIGNoYXJhY3RlciBpbiB0aGUgcmFuZ2UgVSswMDAwIHRvIFUrMDA3ZiBpcyByZXByZXNlbnRlZAogICAgLy8gYnkgd2hldGhlciBpdCBuZWVkcyB0byBiZSBlc2NhcGVkIGluIGEgcmVnZXhwLgogICAgLy8gVGhlIFx4MDAgY2hhcmFjdGVycyBtZWFucyBlc2NhY3BlZCwgYW5kIFx4MDEgbWVhbnMgbm9uLWVzY2FwZWQuCiAgICBjb25zdCBlc2NhcGVzID0KICAgICAgICAiXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMSIKICAgICAgICAiXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMSIKICAgICAgICAvLyAgICAgICAgICAgICAgICAgJCAgICAgICAgICAgICAgICggICApICAgKiAgICsgICAgICAgICAgIC4KICAgICAgICAiXHgwMVx4MDFceDAxXHgwMVx4MDBceDAxXHgwMVx4MDFceDAwXHgwMFx4MDBceDAwXHgwMVx4MDFceDAwXHgwMSIKICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/CiAgICAgICAgIlx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDAiCiAgICAgICAgIlx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDEiCiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbICAgXCAgIF0gICBeCiAgICAgICAgIlx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMFx4MDBceDAwXHgwMFx4MDEiCiAgICAgICAgIlx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDEiCiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgfCAgIH0KICAgICAgICAiXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAwXHgwMFx4MDBceDAxXHgwMSI7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgIGludCBjaGFyID0gdGV4dC5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoY2hhciA8PSAweDdmICYmIGVzY2FwZXMuY29kZVVuaXRBdChjaGFyKSA9PSAwKSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiB0ZXh0Lmxlbmd0aDsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyB0ZXh0KSB7CiAgICBpbnQgZXNjYXBlQ2hhckluZGV4ID0gX2ZpbmRFc2NhcGVDaGFyKHRleHQsIDApOwogICAgLy8gSWYgdGhlIHRleHQgY29udGFpbnMgbm8gY2hhcmFjdGVycyBuZWVkaW5nIGVzY2FwZSwgcmV0dXJuIGl0IGRpcmVjdGx5LgogICAgaWYgKGVzY2FwZUNoYXJJbmRleCA9PSB0ZXh0Lmxlbmd0aCkgcmV0dXJuIHRleHQ7CgogICAgdmFyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGludCBwcmV2aW91c1NsaWNlRW5kSW5kZXggPSAwOwogICAgZG8gewogICAgICAvLyBDb3B5IGNoYXJhY3RlcnMgZnJvbSBwcmV2aW91cyBlc2NhcGUgdG8gY3VycmVudCBlc2NhcGUgaW50byByZXN1bHQuCiAgICAgIC8vIFRoaXMgaW5jbHVkZXMgdGhlIHByZXZpb3VzbHkgZXNjYXBlZCBjaGFyYWN0ZXIuCiAgICAgIGJ1ZmZlci53cml0ZSh0ZXh0LnN1YnN0cmluZyhwcmV2aW91c1NsaWNlRW5kSW5kZXgsIGVzY2FwZUNoYXJJbmRleCkpOwogICAgICAvLyBQcmVwYXJlIHRoZSBjdXJyZW50IGNoYXJhY3RlciB0byBiZSBlc2NhcGVkIGJ5IHByZWZpeGluZyBpdCB3aXRoIGEgJ1wnLgogICAgICBidWZmZXIud3JpdGUociJcIik7CiAgICAgIHByZXZpb3VzU2xpY2VFbmRJbmRleCA9IGVzY2FwZUNoYXJJbmRleDsKICAgICAgZXNjYXBlQ2hhckluZGV4ID0gX2ZpbmRFc2NhcGVDaGFyKHRleHQsIGVzY2FwZUNoYXJJbmRleCArIDEpOwogICAgfSB3aGlsZSAoZXNjYXBlQ2hhckluZGV4IDwgdGV4dC5sZW5ndGgpOwogICAgLy8gQ29weSB0YWlsIG9mIHN0cmluZyBpbnRvIHJlc3VsdC4KICAgIGJ1ZmZlci53cml0ZSh0ZXh0LnN1YnN0cmluZyhwcmV2aW91c1NsaWNlRW5kSW5kZXgsIGVzY2FwZUNoYXJJbmRleCkpOwogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgLy8gUmVndWxhciBleHByZXNzaW9uIG9iamVjdHMgYXJlIHN0b3JlZCBpbiBhIGNhY2hlIG9mIHVwIHRvIF9NQVhfQ0FDSEVfU0laRQogIC8vIGVsZW1lbnRzIHVzaW5nIGFuIExSVSBldmljdGlvbiBzdHJhdGVneS4KICAvLyBUT0RPKHplcm55KTogRG8gbm90IGltcG9zZSBhIGZpeGVkIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgY2FjaGVkIG9iamVjdHMuCiAgLy8gT3RoZXIgcG9zc2liaWxpdGllcyBjb3VsZCBiZSBsaW1pdGluZyBieSB0aGUgc2l6ZSBvZiB0aGUgcmVnZXhwIG9iamVjdHMsCiAgLy8gb3IgaW1wb3NpbmcgYSBsb3dlciB0aW1lIGJvdW5kIGZvciB0aGUgbW9zdCByZWNlbnQgdXNlIHVuZGVyIHdoaWNoIGEgcmVnZXhwCiAgLy8gbWF5IG5vdCBiZSByZW1vdmVkIGZyb20gdGhlIGNhY2hlLgogIC8vIFRPRE8oemVybnkpOiBVc2Ugc2VsZi1zaXppbmcgY2FjaGUgc2ltaWxhciB0byBfQWNjZXNzb3JDYWNoZSBpbgogIC8vIG1pcnJvcnNfaW1wbC5kYXJ0LgogIHN0YXRpYyBjb25zdCBpbnQgX01BWF9DQUNIRV9TSVpFID0gMjU2OwogIHN0YXRpYyBmaW5hbCBNYXA8X1JlZ0V4cEhhc2hLZXksIF9SZWdFeHBIYXNoVmFsdWU+IF9jYWNoZSA9CiAgICAgIG5ldyBIYXNoTWFwPF9SZWdFeHBIYXNoS2V5LCBfUmVnRXhwSGFzaFZhbHVlPigpOwogIHN0YXRpYyBmaW5hbCBMaW5rZWRMaXN0PF9SZWdFeHBIYXNoS2V5PiBfcmVjZW50bHlVc2VkID0KICAgICAgbmV3IExpbmtlZExpc3Q8X1JlZ0V4cEhhc2hLZXk+KCk7CgogIGludCBnZXQgX2dyb3VwQ291bnQ7CiAgSXRlcmFibGU8U3RyaW5nPiBnZXQgX2dyb3VwTmFtZXM7CiAgaW50IF9ncm91cE5hbWVJbmRleChTdHJpbmcgbmFtZSk7Cn0KCi8vIFJlcHJlc2VudHMgYm90aCBhIGtleSBpbiB0aGUgcmVndWxhciBleHByZXNzaW9uIGNhY2hlIGFzIHdlbGwgYXMgaXRzCi8vIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlIExSVSBsaXN0LgpjbGFzcyBfUmVnRXhwSGFzaEtleSBleHRlbmRzIExpbmtlZExpc3RFbnRyeTxfUmVnRXhwSGFzaEtleT4gewogIGZpbmFsIFN0cmluZyBwYXR0ZXJuOwogIGZpbmFsIGJvb2wgbXVsdGlMaW5lOwogIGZpbmFsIGJvb2wgY2FzZVNlbnNpdGl2ZTsKCiAgX1JlZ0V4cEhhc2hLZXkodGhpcy5wYXR0ZXJuLCB0aGlzLm11bHRpTGluZSwgdGhpcy5jYXNlU2Vuc2l0aXZlKTsKCiAgaW50IGdldCBoYXNoQ29kZSA9PiBwYXR0ZXJuLmhhc2hDb2RlOwogIGJvb2wgb3BlcmF0b3IgPT0odGhhdCkgewogICAgcmV0dXJuICh0aGF0IGlzIF9SZWdFeHBIYXNoS2V5KSAmJgogICAgICAgICh0aGlzLnBhdHRlcm4gPT0gdGhhdC5wYXR0ZXJuKSAmJgogICAgICAgICh0aGlzLm11bHRpTGluZSA9PSB0aGF0Lm11bHRpTGluZSkgJiYKICAgICAgICAodGhpcy5jYXNlU2Vuc2l0aXZlID09IHRoYXQuY2FzZVNlbnNpdGl2ZSk7CiAgfQp9CgovLyBSZXByZXNlbnRzIGEgdmFsdWUgaW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBjYWNoZS4gQ29udGFpbnMgYSBwb2ludGVyCi8vIGJhY2sgdG8gdGhlIGtleSBpbiBvcmRlciB0byBhY2Nlc3MgdGhlIGNvcnJlc3BvbmRpbmcgTFJVIGVudHJ5LgpjbGFzcyBfUmVnRXhwSGFzaFZhbHVlIHsKICBmaW5hbCBfUmVnRXhwIHJlZ2V4cDsKICBmaW5hbCBfUmVnRXhwSGFzaEtleSBrZXk7CgogIF9SZWdFeHBIYXNoVmFsdWUodGhpcy5yZWdleHAsIHRoaXMua2V5KTsKfQoKY2xhc3MgX1JlZ0V4cE1hdGNoIGltcGxlbWVudHMgUmVnRXhwTWF0Y2ggewogIF9SZWdFeHBNYXRjaCh0aGlzLl9yZWdleHAsIHRoaXMuaW5wdXQsIHRoaXMuX21hdGNoKTsKCiAgaW50IGdldCBzdGFydCA9PiBfc3RhcnQoMCk7CiAgaW50IGdldCBlbmQgPT4gX2VuZCgwKTsKCiAgaW50IF9zdGFydChpbnQgZ3JvdXBJZHgpIHsKICAgIHJldHVybiBfbWF0Y2hbKGdyb3VwSWR4ICogX01BVENIX1BBSVIpXTsKICB9CgogIGludCBfZW5kKGludCBncm91cElkeCkgewogICAgcmV0dXJuIF9tYXRjaFsoZ3JvdXBJZHggKiBfTUFUQ0hfUEFJUikgKyAxXTsKICB9CgogIFN0cmluZyBncm91cChpbnQgZ3JvdXBJZHgpIHsKICAgIGlmIChncm91cElkeCA8IDAgfHwgZ3JvdXBJZHggPiBfcmVnZXhwLl9ncm91cENvdW50KSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnZhbHVlKGdyb3VwSWR4KTsKICAgIH0KICAgIGludCBzdGFydEluZGV4ID0gX3N0YXJ0KGdyb3VwSWR4KTsKICAgIGludCBlbmRJbmRleCA9IF9lbmQoZ3JvdXBJZHgpOwogICAgaWYgKHN0YXJ0SW5kZXggPT0gLTEpIHsKICAgICAgYXNzZXJ0KGVuZEluZGV4ID09IC0xKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gaW5wdXQuX3N1YnN0cmluZ1VuY2hlY2tlZChzdGFydEluZGV4LCBlbmRJbmRleCk7CiAgfQoKICBTdHJpbmcgb3BlcmF0b3IgW10oaW50IGdyb3VwSWR4KSB7CiAgICByZXR1cm4gdGhpcy5ncm91cChncm91cElkeCk7CiAgfQoKICBMaXN0PFN0cmluZz4gZ3JvdXBzKExpc3Q8aW50PiBncm91cHNTcGVjKSB7CiAgICB2YXIgZ3JvdXBzTGlzdCA9IG5ldyBMaXN0PFN0cmluZz4oZ3JvdXBzU3BlYy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cHNTcGVjLmxlbmd0aDsgaSsrKSB7CiAgICAgIGdyb3Vwc0xpc3RbaV0gPSBncm91cChncm91cHNTcGVjW2ldKTsKICAgIH0KICAgIHJldHVybiBncm91cHNMaXN0OwogIH0KCiAgaW50IGdldCBncm91cENvdW50ID0+IF9yZWdleHAuX2dyb3VwQ291bnQ7CgogIFBhdHRlcm4gZ2V0IHBhdHRlcm4gPT4gX3JlZ2V4cDsKCiAgU3RyaW5nIG5hbWVkR3JvdXAoU3RyaW5nIG5hbWUpIHsKICAgIHZhciBpZHggPSBfcmVnZXhwLl9ncm91cE5hbWVJbmRleChuYW1lKTsKICAgIGlmIChpZHggPCAwKSB7CiAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoIk5vdCBhIGNhcHR1cmUgZ3JvdXAgbmFtZTogJHtuYW1lfSIpOwogICAgfQogICAgcmV0dXJuIGdyb3VwKGlkeCk7CiAgfQoKICBJdGVyYWJsZTxTdHJpbmc+IGdldCBncm91cE5hbWVzIHsKICAgIHJldHVybiBfcmVnZXhwLl9ncm91cE5hbWVzOwogIH0KCiAgZmluYWwgUmVnRXhwIF9yZWdleHA7CiAgZmluYWwgU3RyaW5nIGlucHV0OwogIGZpbmFsIExpc3Q8aW50PiBfbWF0Y2g7CiAgc3RhdGljIGNvbnN0IGludCBfTUFUQ0hfUEFJUiA9IDI7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX1JlZ0V4cCBpbXBsZW1lbnRzIFJlZ0V4cCB7CiAgZmFjdG9yeSBfUmVnRXhwKFN0cmluZyBwYXR0ZXJuLAogICAgICB7Ym9vbCBtdWx0aUxpbmU6IGZhbHNlLAogICAgICBib29sIGNhc2VTZW5zaXRpdmU6IHRydWV9KSBuYXRpdmUgIlJlZ0V4cF9mYWN0b3J5IjsKCiAgTWF0Y2ggZmlyc3RNYXRjaChTdHJpbmcgc3RyKSB7CiAgICBpZiAoc3RyIGlzISBTdHJpbmcpIHRocm93IG5ldyBBcmd1bWVudEVycm9yKHN0cik7CiAgICBMaXN0IG1hdGNoID0gX0V4ZWN1dGVNYXRjaChzdHIsIDApOwogICAgaWYgKG1hdGNoID09IG51bGwpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gbmV3IF9SZWdFeHBNYXRjaCh0aGlzLCBzdHIsIG1hdGNoKTsKICB9CgogIEl0ZXJhYmxlPE1hdGNoPiBhbGxNYXRjaGVzKFN0cmluZyBzdHJpbmcsIFtpbnQgc3RhcnQgPSAwXSkgewogICAgaWYgKHN0cmluZyBpcyEgU3RyaW5nKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihzdHJpbmcpOwogICAgaWYgKHN0YXJ0IGlzISBpbnQpIHRocm93IG5ldyBBcmd1bWVudEVycm9yKHN0YXJ0KTsKICAgIGlmICgwID4gc3RhcnQgfHwgc3RhcnQgPiBzdHJpbmcubGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKHN0YXJ0LCAwLCBzdHJpbmcubGVuZ3RoKTsKICAgIH0KICAgIHJldHVybiBuZXcgX0FsbE1hdGNoZXNJdGVyYWJsZSh0aGlzLCBzdHJpbmcsIHN0YXJ0KTsKICB9CgogIE1hdGNoIG1hdGNoQXNQcmVmaXgoU3RyaW5nIHN0cmluZywgW2ludCBzdGFydCA9IDBdKSB7CiAgICBpZiAoc3RyaW5nIGlzISBTdHJpbmcpIHRocm93IG5ldyBBcmd1bWVudEVycm9yKHN0cmluZyk7CiAgICBpZiAoc3RhcnQgaXMhIGludCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Ioc3RhcnQpOwogICAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+IHN0cmluZy5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2Uoc3RhcnQsIDAsIHN0cmluZy5sZW5ndGgpOwogICAgfQogICAgTGlzdDxpbnQ+IGxpc3QgPSBfRXhlY3V0ZU1hdGNoU3RpY2t5KHN0cmluZywgc3RhcnQpOwogICAgaWYgKGxpc3QgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gbmV3IF9SZWdFeHBNYXRjaCh0aGlzLCBzdHJpbmcsIGxpc3QpOwogIH0KCiAgYm9vbCBoYXNNYXRjaChTdHJpbmcgc3RyKSB7CiAgICBpZiAoc3RyIGlzISBTdHJpbmcpIHRocm93IG5ldyBBcmd1bWVudEVycm9yKHN0cik7CiAgICBMaXN0IG1hdGNoID0gX0V4ZWN1dGVNYXRjaChzdHIsIDApOwogICAgcmV0dXJuIChtYXRjaCA9PSBudWxsKSA/IGZhbHNlIDogdHJ1ZTsKICB9CgogIFN0cmluZyBzdHJpbmdNYXRjaChTdHJpbmcgc3RyKSB7CiAgICBpZiAoc3RyIGlzISBTdHJpbmcpIHRocm93IG5ldyBBcmd1bWVudEVycm9yKHN0cik7CiAgICBMaXN0IG1hdGNoID0gX0V4ZWN1dGVNYXRjaChzdHIsIDApOwogICAgaWYgKG1hdGNoID09IG51bGwpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gc3RyLl9zdWJzdHJpbmdVbmNoZWNrZWQobWF0Y2hbMF0sIG1hdGNoWzFdKTsKICB9CgogIFN0cmluZyBnZXQgcGF0dGVybiBuYXRpdmUgIlJlZ0V4cF9nZXRQYXR0ZXJuIjsKCiAgYm9vbCBnZXQgaXNNdWx0aUxpbmUgbmF0aXZlICJSZWdFeHBfZ2V0SXNNdWx0aUxpbmUiOwoKICBib29sIGdldCBpc0Nhc2VTZW5zaXRpdmUgbmF0aXZlICJSZWdFeHBfZ2V0SXNDYXNlU2Vuc2l0aXZlIjsKCiAgaW50IGdldCBfZ3JvdXBDb3VudCBuYXRpdmUgIlJlZ0V4cF9nZXRHcm91cENvdW50IjsKCiAgLy8gUmV0dXJucyBhIExpc3QgW1N0cmluZywgaW50LCBTdHJpbmcsIGludCwgLi4uXSB3aGVyZSBlYWNoCiAgLy8gU3RyaW5nIGlzIHRoZSBuYW1lIG9mIGEgY2FwdHVyZSBncm91cCBhbmQgdGhlIGZvbGxvd2luZwogIC8vIGludCBpcyB0aGF0IGNhcHR1cmUgZ3JvdXAncyBpbmRleC4KICBMaXN0IGdldCBfZ3JvdXBOYW1lTGlzdCBuYXRpdmUgIlJlZ0V4cF9nZXRHcm91cE5hbWVNYXAiOwoKICBJdGVyYWJsZTxTdHJpbmc+IGdldCBfZ3JvdXBOYW1lcyBzeW5jKiB7CiAgICBmaW5hbCBuYW1lTGlzdCA9IF9ncm91cE5hbWVMaXN0OwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lTGlzdC5sZW5ndGg7IGkgKz0gMikgewogICAgICB5aWVsZCBuYW1lTGlzdFtpXSBhcyBTdHJpbmc7CiAgICB9CiAgfQoKICBpbnQgX2dyb3VwTmFtZUluZGV4KFN0cmluZyBuYW1lKSB7CiAgICB2YXIgbmFtZUxpc3QgPSBfZ3JvdXBOYW1lTGlzdDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZUxpc3QubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgaWYgKG5hbWUgPT0gbmFtZUxpc3RbaV0pIHsKICAgICAgICByZXR1cm4gbmFtZUxpc3RbaSArIDFdOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICAvLyBCeXRlIG1hcCBvZiBvbmUgYnl0ZSBjaGFyYWN0ZXJzIHdpdGggYSAweGZmIGlmIHRoZSBjaGFyYWN0ZXIgaXMgYSB3b3JkCiAgLy8gY2hhcmFjdGVyIChkaWdpdCwgbGV0dGVyIG9yIHVuZGVyc2NvcmUpIGFuZCAweDAwIG90aGVyd2lzZS4KICAvLyBVc2VkIGJ5IGdlbmVyYXRlZCBSZWdFeHAgY29kZS4KICBzdGF0aWMgY29uc3QgTGlzdDxpbnQ+IF93b3JkQ2hhcmFjdGVyTWFwID0gY29uc3QgPGludD5bCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoKICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgLy8gJzAnIC0gJzcnCiAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvLyAnOCcgLSAnOScKCiAgICAweDAwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAvLyAnQScgLSAnRycKICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIC8vICdIJyAtICdPJwogICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgLy8gJ1AnIC0gJ1cnCiAgICAweGZmLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAvLyAnWCcgLSAnWicsICdfJwoKICAgIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIC8vICdhJyAtICdnJwogICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgLy8gJ2gnIC0gJ28nCiAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAvLyAncCcgLSAndycKICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8vICd4JyAtICd6JwogICAgLy8gTGF0aW4tMSByYW5nZQogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoKICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICBdOwoKICBMaXN0IF9FeGVjdXRlTWF0Y2goU3RyaW5nIHN0ciwgaW50IHN0YXJ0X2luZGV4KSBuYXRpdmUgIlJlZ0V4cF9FeGVjdXRlTWF0Y2giOwoKICBMaXN0IF9FeGVjdXRlTWF0Y2hTdGlja3koU3RyaW5nIHN0ciwgaW50IHN0YXJ0X2luZGV4KQogICAgICBuYXRpdmUgIlJlZ0V4cF9FeGVjdXRlTWF0Y2hTdGlja3kiOwp9CgpjbGFzcyBfQWxsTWF0Y2hlc0l0ZXJhYmxlIGV4dGVuZHMgSXRlcmFibGVCYXNlPE1hdGNoPiB7CiAgZmluYWwgX1JlZ0V4cCBfcmU7CiAgZmluYWwgU3RyaW5nIF9zdHI7CiAgZmluYWwgaW50IF9zdGFydDsKCiAgX0FsbE1hdGNoZXNJdGVyYWJsZSh0aGlzLl9yZSwgdGhpcy5fc3RyLCB0aGlzLl9zdGFydCk7CgogIEl0ZXJhdG9yPE1hdGNoPiBnZXQgaXRlcmF0b3IgPT4gbmV3IF9BbGxNYXRjaGVzSXRlcmF0b3IoX3JlLCBfc3RyLCBfc3RhcnQpOwp9CgpjbGFzcyBfQWxsTWF0Y2hlc0l0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8TWF0Y2g+IHsKICBmaW5hbCBTdHJpbmcgX3N0cjsKICBpbnQgX25leHRJbmRleDsKICBfUmVnRXhwIF9yZTsKICBNYXRjaCBfY3VycmVudDsKCiAgX0FsbE1hdGNoZXNJdGVyYXRvcih0aGlzLl9yZSwgdGhpcy5fc3RyLCB0aGlzLl9uZXh0SW5kZXgpOwoKICBNYXRjaCBnZXQgY3VycmVudCA9PiBfY3VycmVudDsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmIChfcmUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyAvLyBDbGVhcmVkIGFmdGVyIGEgZmFpbGVkIG1hdGNoLgogICAgaWYgKF9uZXh0SW5kZXggPD0gX3N0ci5sZW5ndGgpIHsKICAgICAgdmFyIG1hdGNoID0gX3JlLl9FeGVjdXRlTWF0Y2goX3N0ciwgX25leHRJbmRleCk7CiAgICAgIGlmIChtYXRjaCAhPSBudWxsKSB7CiAgICAgICAgX2N1cnJlbnQgPSBuZXcgX1JlZ0V4cE1hdGNoKF9yZSwgX3N0ciwgbWF0Y2gpOwogICAgICAgIF9uZXh0SW5kZXggPSBfY3VycmVudC5lbmQ7CiAgICAgICAgaWYgKF9uZXh0SW5kZXggPT0gX2N1cnJlbnQuc3RhcnQpIHsKICAgICAgICAgIC8vIFplcm8td2lkdGggbWF0Y2guIEFkdmFuY2UgYnkgb25lIG1vcmUuCiAgICAgICAgICBfbmV4dEluZGV4Kys7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICBfY3VycmVudCA9IG51bGw7CiAgICBfcmUgPSBudWxsOwogICAgcmV0dXJuIGZhbHNlOwogIH0KfQqBcgBOTjwBHgEHDwkgO08qARktNScgCAEkHkMQGw0aBgEbASczAUYZBAEGRQVIOQY3TzZHFEtLRUtJS0tFS0tBTDAlQwYYBAEJJjRONQElIwlNOUxRGi9ELShKHgQBTy5PTlEoRRgqPjc6KAEXJCQCAUgoPxgYHAFEASgbJyouNAQCAUpDGRgcASsCASw3AR4aAR0tBAEbMQQBHzosBicjHB4TBjwEASUhBAEuOjIsBhcEAS0BIgEjLRNABhcEASQgBAEYFhokAgEaIiIeOgEhNigZEwYvBAE/PDcuOwY5BAE4PDcuOwY5IzEEAR42KCsEASM2KBkTBjgEATEBNwE/ATUBPz0oOwErJTMjBgQBJSMzISAIBg8EAUxBJDo0NDQ0ATQ0QUEBQUFBRgFBQUFBFTQ0NDQBNDQ0NAE0NDQ0ATQ0NDQFAVABOCoCATgVFRQBOQFOAgE3FRIPEgE9ASEBFEQlNxs3Iyw0GAoVCAYVEBIEAgEhZGFydDpjb3JlLXBhdGNoL3JlZ2V4cF9wYXRjaC5kYXJ0L29yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvc3RhY2t0cmFjZS5kYXJ0gZgvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCi8vLyBWTSBpbnRlcm5hbCBTdGFja1RyYWNlIGltcGxlbWVudGF0aW9uLgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9TdGFja1RyYWNlIGltcGxlbWVudHMgU3RhY2tUcmFjZSB7CiAgLy8gdG9TdHJpbmcoKSBpcyBvdmVycmlkZGVuIG9uIHRoZSBDKysgc2lkZS4KfQoNAE5OPAEeASsaKi8CAR9kYXJ0OmNvcmUtcGF0Y2gvc3RhY2t0cmFjZS5kYXJ0MW9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvc3RyaW5nX3BhdGNoLmRhcnTAALbiLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvcmVfcGF0Y2guZGFydCI7Cgpjb25zdCBpbnQgX21heEFzY2lpID0gMHg3ZjsKY29uc3QgaW50IF9tYXhMYXRpbjEgPSAweGZmOwpjb25zdCBpbnQgX21heFV0ZjE2ID0gMHhmZmZmOwpjb25zdCBpbnQgX21heFVuaWNvZGUgPSAweDEwZmZmZjsKCkBwYXRjaApjbGFzcyBTdHJpbmcgewogIEBwYXRjaAogIGZhY3RvcnkgU3RyaW5nLmZyb21DaGFyQ29kZXMoSXRlcmFibGU8aW50PiBjaGFyQ29kZXMsCiAgICAgIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogICAgaWYgKGNoYXJDb2RlcyBpcyEgSXRlcmFibGUpCiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKGNoYXJDb2RlcywgImNoYXJDb2RlcyIpOwogICAgaWYgKHN0YXJ0IGlzISBpbnQpIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKHN0YXJ0LCAic3RhcnQiKTsKICAgIGlmIChlbmQgIT0gbnVsbCAmJiBlbmQgaXMhIGludCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUoZW5kLCAiZW5kIik7CiAgICByZXR1cm4gX1N0cmluZ0Jhc2UuY3JlYXRlRnJvbUNoYXJDb2RlcyhjaGFyQ29kZXMsIHN0YXJ0LCBlbmQsIG51bGwpOwogIH0KCiAgQHBhdGNoCiAgZmFjdG9yeSBTdHJpbmcuZnJvbUNoYXJDb2RlKGludCBjaGFyQ29kZSkgewogICAgaWYgKGNoYXJDb2RlID49IDApIHsKICAgICAgaWYgKGNoYXJDb2RlIDw9IDB4ZmYpIHsKICAgICAgICByZXR1cm4gX09uZUJ5dGVTdHJpbmcuX2FsbG9jYXRlKDEpLi5fc2V0QXQoMCwgY2hhckNvZGUpOwogICAgICB9CiAgICAgIGlmIChjaGFyQ29kZSA8PSAweGZmZmYpIHsKICAgICAgICByZXR1cm4gX1N0cmluZ0Jhc2UuX2NyZWF0ZUZyb21Db2RlUG9pbnRzKAogICAgICAgICAgICBuZXcgX0xpc3QoMSkuLlswXSA9IGNoYXJDb2RlLCAwLCAxKTsKICAgICAgfQogICAgICBpZiAoY2hhckNvZGUgPD0gMHgxMGZmZmYpIHsKICAgICAgICB2YXIgbG93ID0gMHhEQzAwIHwgKGNoYXJDb2RlICYgMHgzZmYpOwogICAgICAgIGludCBiaXRzID0gY2hhckNvZGUgLSAweDEwMDAwOwogICAgICAgIHZhciBoaWdoID0gMHhEODAwIHwgKGJpdHMgPj4gMTApOwogICAgICAgIHJldHVybiBfU3RyaW5nQmFzZS5fY3JlYXRlRnJvbUNvZGVQb2ludHMoCiAgICAgICAgICAgIG5ldyBfTGlzdCgyKQogICAgICAgICAgICAgIC4uWzBdID0gaGlnaAogICAgICAgICAgICAgIC4uWzFdID0gbG93LAogICAgICAgICAgICAwLAogICAgICAgICAgICAyKTsKICAgICAgfQogICAgfQogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoY2hhckNvZGUsIDAsIDB4MTBmZmZmKTsKICB9CgogIEBwYXRjaAogIGNvbnN0IGZhY3RvcnkgU3RyaW5nLmZyb21FbnZpcm9ubWVudChTdHJpbmcgbmFtZSwge1N0cmluZyBkZWZhdWx0VmFsdWV9KQogICAgICBuYXRpdmUgIlN0cmluZ19mcm9tRW52aXJvbm1lbnQiOwoKICBib29sIGdldCBfaXNPbmVCeXRlOwogIFN0cmluZyBfc3Vic3RyaW5nVW5jaGVja2VkKGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpOwp9CgovKioKICogW19TdHJpbmdCYXNlXSBjb250YWlucyBjb21tb24gbWV0aG9kcyB1c2VkIGJ5IGNvbmNyZXRlIFN0cmluZwogKiBpbXBsZW1lbnRhdGlvbnMsIGUuZy4sIF9PbmVCeXRlU3RyaW5nLgogKi8KYWJzdHJhY3QgY2xhc3MgX1N0cmluZ0Jhc2UgaW1wbGVtZW50cyBTdHJpbmcgewogIGJvb2wgX2lzV2hpdGVzcGFjZShpbnQgY29kZVVuaXQpOwoKICAvLyBDb25zdGFudHMgdXNlZCBieSByZXBsYWNlQWxsIGVuY29kaW5nIG9mIHN0cmluZyBzbGljZXMgYmV0d2VlbiBtYXRjaGVzLgogIC8vIEEgc3RyaW5nIHNsaWNlIChzdGFydCtsZW5ndGgpIGlzIGVuY29kZWQgaW4gYSBzaW5nbGUgU21pIHRvIHNhdmUgbWVtb3J5CiAgLy8gb3ZlcmhlYWQgaW4gdGhlIGNvbW1vbiBjYXNlLgogIC8vIFdlIHVzZSBmZXdlciBiaXRzIGZvciBsZW5ndGggKDExIGJpdHMpIHRoYW4gZm9yIHRoZSBzdGFydCBpbmRleCAoMTkrIGJpdHMpLgogIC8vIEZvciBsb25nIHN0cmluZ3MsIGl0J3MgcG9zc2libGUgdG8gaGF2ZSBtYW55IGxhcmdlIGluZGljZXMsCiAgLy8gYnV0IGl0J3MgdW5saWtlbHkgdG8gaGF2ZSBtYW55IGxvbmcgbGVuZ3RocyBzaW5jZSBzbGljZXMgZG9uJ3Qgb3ZlcmxhcC4KICAvLyBJZiB0aGVyZSBhcmUgZmV3IG1hdGNoZXMgaW4gYSBsb25nIHN0cmluZywgdGhlbiB0aGVyZSBhcmUgZmV3IGxvbmcgc2xpY2VzLAogIC8vIGFuZCBpZiB0aGVyZSBhcmUgbWFueSBtYXRjaGVzLCB0aGVyZSdsbCBsaWtlbHkgYmUgbWFueSBzaG9ydCBzbGljZXMuCiAgLy8KICAvLyBFbmNvZGluZyBpczogMCgoc3RhcnQgPDwgX2xlbmd0aEJpdHMpIHwgbGVuZ3RoKQoKICAvLyBOdW1iZXIgb2YgYml0cyB1c2VkIGJ5IGxlbmd0aC4KICAvLyBUaGlzIGlzIHRoZSBzaGlmdCB1c2VkIHRvIGVuY29kZSBhbmQgZGVjb2RlIHRoZSBzdGFydCBpbmRleC4KICBzdGF0aWMgY29uc3QgaW50IF9sZW5ndGhCaXRzID0gMTE7CiAgLy8gVGhlIG1heGltYWwgYWxsb3dlZCBsZW5ndGggdmFsdWUgaW4gYW4gZW5jb2RlZCBzbGljZS4KICBzdGF0aWMgY29uc3QgaW50IF9tYXhMZW5ndGhWYWx1ZSA9ICgxIDw8IF9sZW5ndGhCaXRzKSAtIDE7CiAgLy8gTWFzayBvZiBsZW5ndGggaW4gZW5jb2RlZCBzbWkgdmFsdWUuCiAgc3RhdGljIGNvbnN0IGludCBfbGVuZ3RoTWFzayA9IF9tYXhMZW5ndGhWYWx1ZTsKICBzdGF0aWMgY29uc3QgaW50IF9zdGFydEJpdHMgPSBfbWF4VW5zaWduZWRTbWlCaXRzIC0gX2xlbmd0aEJpdHM7CiAgLy8gTWF4aW1hbCBhbGxvd2VkIHN0YXJ0IGluZGV4IHZhbHVlIGluIGFuIGVuY29kZWQgc2xpY2UuCiAgc3RhdGljIGNvbnN0IGludCBfbWF4U3RhcnRWYWx1ZSA9ICgxIDw8IF9zdGFydEJpdHMpIC0gMTsKICAvLyBXZSBwaWNrIDMwIGFzIGEgc2FmZSBsb3dlciBib3VuZCBvbiBhdmFpbGFibGUgYml0cyBpbiBhIG5lZ2F0aXZlIHNtaS4KICAvLyBUT0RPKGxybik6IENvbnNpZGVyIGFsbG93aW5nIG1vcmUgYml0cyBmb3Igc3RhcnQgb24gNjQtYml0IHN5c3RlbXMuCiAgc3RhdGljIGNvbnN0IGludCBfbWF4VW5zaWduZWRTbWlCaXRzID0gMzA7CgogIC8vIEZvciBsb25nZXIgc3RyaW5ncywgY2FsbGluZyBpbnRvIEMrKyB0byBjcmVhdGUgdGhlIHJlc3VsdCBvZiBhCiAgLy8gW3JlcGxhY2VBbGxdIGlzIGZhc3RlciB0aGFuIFtfam9pblJlcGxhY2VBbGxPbmVCeXRlUmVzdWx0XS4KICAvLyBUT0RPKGxybik6IFNlZSBpZiB0aGlzIGxpbWl0IGNhbiBiZSB0d2Vha2VkLgogIHN0YXRpYyBjb25zdCBpbnQgX21heEpvaW5SZXBsYWNlT25lQnl0ZVN0cmluZ0xlbmd0aCA9IDUwMDsKCiAgZmFjdG9yeSBfU3RyaW5nQmFzZS5fdW5pbnN0YW50aWFibGUoKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiX1N0cmluZ0Jhc2UgY2FuJ3QgYmUgaW5zdGFuaWF0ZWQiKTsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgZ2V0IGhhc2hDb2RlIG5hdGl2ZSAiU3RyaW5nX2dldEhhc2hDb2RlIjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBnZXQgX2lkZW50aXR5SGFzaENvZGUgbmF0aXZlICJTdHJpbmdfZ2V0SGFzaENvZGUiOwoKICBib29sIGdldCBfaXNPbmVCeXRlIHsKICAgIC8vIEFsdGVybmF0aXZlbHkgcmV0dXJuIGZhbHNlIGFuZCBvdmVycmlkZSBpdCBvbiBvbmUtYnl0ZSBzdHJpbmcgY2xhc3Nlcy4KICAgIGludCBpZCA9IENsYXNzSUQuZ2V0SUQodGhpcyk7CiAgICByZXR1cm4gaWQgPT0gQ2xhc3NJRC5jaWRPbmVCeXRlU3RyaW5nIHx8CiAgICAgICAgaWQgPT0gQ2xhc3NJRC5jaWRFeHRlcm5hbE9uZUJ5dGVTdHJpbmc7CiAgfQoKICAvKioKICAgKiBDcmVhdGUgdGhlIG1vc3QgZWZmaWNpZW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBmb3Igc3BlY2lmaWVkCiAgICogW2NoYXJDb2Rlc10uCiAgICoKICAgKiBPbmx5IHVzZXMgdGhlIGNoYXJhY3RlciBjb2RlcyBiZXR3ZWVuIGluZGV4IFtzdGFydF0gYW5kIGluZGV4IFtlbmRdIG9mCiAgICogYGNoYXJDb2Rlc2AuIFRoZXkgbXVzdCBzYXRpc2Z5IGAwIDw9IHN0YXJ0IDw9IGVuZCA8PSBjaGFyQ29kZXMubGVuZ3RoYC4KICAgKgogICAqIFRoZSBbbGltaXRdIGlzIGFuIHVwcGVyIGxpbWl0IG9uIHRoZSBjaGFyYWN0ZXIgY29kZXMgaW4gdGhlIGl0ZXJhYmxlLgogICAqIEl0J3MgYG51bGxgIGlmIHVua25vd24uCiAgICovCiAgc3RhdGljIFN0cmluZyBjcmVhdGVGcm9tQ2hhckNvZGVzKAogICAgICBJdGVyYWJsZTxpbnQ+IGNoYXJDb2RlcywgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgbGltaXQpIHsKICAgIGlmIChzdGFydCA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJzdGFydCIpOwogICAgaWYgKGNoYXJDb2RlcyA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihjaGFyQ29kZXMpOwogICAgLy8gVE9ETyhzcmRqYW4pOiBBbHNvIHNraXAgY29weWluZyBvZiB3aWRlIHR5cGVkIGFycmF5cy4KICAgIGZpbmFsIGNjaWQgPSBDbGFzc0lELmdldElEKGNoYXJDb2Rlcyk7CiAgICBpZiAoKGNjaWQgIT0gQ2xhc3NJRC5jaWRBcnJheSkgJiYKICAgICAgICAoY2NpZCAhPSBDbGFzc0lELmNpZEdyb3dhYmxlT2JqZWN0QXJyYXkpICYmCiAgICAgICAgKGNjaWQgIT0gQ2xhc3NJRC5jaWRJbW11dGFibGVBcnJheSkpIHsKICAgICAgaWYgKGNoYXJDb2RlcyBpcyBVaW50OExpc3QpIHsKICAgICAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBjaGFyQ29kZXMubGVuZ3RoKTsKICAgICAgICByZXR1cm4gX2NyZWF0ZU9uZUJ5dGVTdHJpbmcoY2hhckNvZGVzLCBzdGFydCwgZW5kIC0gc3RhcnQpOwogICAgICB9IGVsc2UgaWYgKGNoYXJDb2RlcyBpcyEgVWludDE2TGlzdCkgewogICAgICAgIHJldHVybiBfY3JlYXRlU3RyaW5nRnJvbUl0ZXJhYmxlKGNoYXJDb2Rlcywgc3RhcnQsIGVuZCk7CiAgICAgIH0KICAgIH0KICAgIGludCBjb2RlQ291bnQgPSBjaGFyQ29kZXMubGVuZ3RoOwogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgY29kZUNvdW50KTsKICAgIGZpbmFsIGxlbiA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKGxlbiA9PSAwKSByZXR1cm4gIiI7CiAgICBsaW1pdCA/Pz0gX3NjYW5Db2RlVW5pdHMoY2hhckNvZGVzLCBzdGFydCwgZW5kKTsKICAgIGlmIChsaW1pdCA8IDApIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoY2hhckNvZGVzKTsKICAgIH0KICAgIGlmIChsaW1pdCA8PSBfbWF4TGF0aW4xKSB7CiAgICAgIHJldHVybiBfY3JlYXRlT25lQnl0ZVN0cmluZyhjaGFyQ29kZXMsIHN0YXJ0LCBsZW4pOwogICAgfQogICAgaWYgKGxpbWl0IDw9IF9tYXhVdGYxNikgewogICAgICByZXR1cm4gX1R3b0J5dGVTdHJpbmcuX2FsbG9jYXRlRnJvbVR3b0J5dGVMaXN0KGNoYXJDb2Rlcywgc3RhcnQsIGVuZCk7CiAgICB9CiAgICAvLyBUT0RPKGxybik6IENvbnNpZGVyIHBhc3NpbmcgbGltaXQgdG8gX2NyZWF0ZUZyb21Db2RlUG9pbnRzLCBiZWNhdXNlCiAgICAvLyB0aGUgZnVuY3Rpb24gaXMgY3VycmVudGx5IGZ1bGx5IGdlbmVyaWMgYW5kIGRvZXNuJ3Qga25vdyB0aGF0IGl0cwogICAgLy8gY2hhckNvZGVzIGFyZSBub3QgYWxsIExhdGluLTEgb3IgVXRmLTE2LgogICAgcmV0dXJuIF9jcmVhdGVGcm9tQ29kZVBvaW50cyhjaGFyQ29kZXMsIHN0YXJ0LCBlbmQpOwogIH0KCiAgc3RhdGljIGludCBfc2NhbkNvZGVVbml0cyhMaXN0PGludD4gY2hhckNvZGVzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIGludCBiaXRzID0gMDsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIGludCBjb2RlID0gY2hhckNvZGVzW2ldOwogICAgICBpZiAoY29kZSBpcyEgX1NtaSkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoY2hhckNvZGVzKTsKICAgICAgYml0cyB8PSBjb2RlOwogICAgfQogICAgcmV0dXJuIGJpdHM7CiAgfQoKICBzdGF0aWMgU3RyaW5nIF9jcmVhdGVTdHJpbmdGcm9tSXRlcmFibGUoCiAgICAgIEl0ZXJhYmxlPGludD4gY2hhckNvZGVzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIC8vIFRyZWF0IGNoYXJDb2RlcyBhcyBJdGVyYWJsZS4KICAgIGlmIChjaGFyQ29kZXMgaXMgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGUpIHsKICAgICAgaW50IGxlbmd0aCA9IGNoYXJDb2Rlcy5sZW5ndGg7CiAgICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIGxlbmd0aCk7CiAgICAgIGZpbmFsIGNoYXJDb2RlTGlzdCA9CiAgICAgICAgICBuZXcgTGlzdDxpbnQ+LmZyb20oY2hhckNvZGVzLnRha2UoZW5kKS5za2lwKHN0YXJ0KSwgZ3Jvd2FibGU6IGZhbHNlKTsKICAgICAgcmV0dXJuIGNyZWF0ZUZyb21DaGFyQ29kZXMoY2hhckNvZGVMaXN0LCAwLCBjaGFyQ29kZUxpc3QubGVuZ3RoLCBudWxsKTsKICAgIH0KICAgIC8vIERvbid0IGtub3cgbGVuZ3RoIG9mIGl0ZXJhYmxlLCBzbyBpdGVyYXRlIGFuZCBzZWUgaWYgYWxsIHRoZSB2YWx1ZXMKICAgIC8vIGFyZSB0aGVyZS4KICAgIGlmIChzdGFydCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKHN0YXJ0LCAwLCBjaGFyQ29kZXMubGVuZ3RoKTsKICAgIHZhciBpdCA9IGNoYXJDb2Rlcy5pdGVyYXRvcjsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhcnQ7IGkrKykgewogICAgICBpZiAoIWl0Lm1vdmVOZXh0KCkpIHsKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShzdGFydCwgMCwgaSk7CiAgICAgIH0KICAgIH0KICAgIExpc3Q8aW50PiBjaGFyQ29kZUxpc3Q7CiAgICBpbnQgYml0cyA9IDA7IC8vIEJpdHdpc2Utb3Igb2YgYWxsIGNoYXIgY29kZXMgaW4gbGlzdC4KICAgIGlmIChlbmQgPT0gbnVsbCkgewogICAgICB2YXIgbGlzdCA9IDxpbnQ+W107CiAgICAgIHdoaWxlIChpdC5tb3ZlTmV4dCgpKSB7CiAgICAgICAgaW50IGNvZGUgPSBpdC5jdXJyZW50OwogICAgICAgIGJpdHMgfD0gY29kZTsKICAgICAgICBsaXN0LmFkZChjb2RlKTsKICAgICAgfQogICAgICBjaGFyQ29kZUxpc3QgPSBtYWtlTGlzdEZpeGVkTGVuZ3RoPGludD4obGlzdCk7CiAgICB9IGVsc2UgewogICAgICBpZiAoZW5kIDwgc3RhcnQpIHsKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShlbmQsIHN0YXJ0LCBjaGFyQ29kZXMubGVuZ3RoKTsKICAgICAgfQogICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CiAgICAgIGNoYXJDb2RlTGlzdCA9IG5ldyBMaXN0PGludD4obGVuKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgIGlmICghaXQubW92ZU5leHQoKSkgewogICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoZW5kLCBzdGFydCwgc3RhcnQgKyBpKTsKICAgICAgICB9CiAgICAgICAgaW50IGNvZGUgPSBpdC5jdXJyZW50OwogICAgICAgIGJpdHMgfD0gY29kZTsKICAgICAgICBjaGFyQ29kZUxpc3RbaV0gPSBjb2RlOwogICAgICB9CiAgICB9CiAgICBpbnQgbGVuZ3RoID0gY2hhckNvZGVMaXN0Lmxlbmd0aDsKICAgIGlmIChiaXRzIDwgMCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihjaGFyQ29kZXMpOwogICAgfQogICAgYm9vbCBpc09uZUJ5dGVTdHJpbmcgPSAoYml0cyA8PSBfbWF4TGF0aW4xKTsKICAgIGlmIChpc09uZUJ5dGVTdHJpbmcpIHsKICAgICAgcmV0dXJuIF9jcmVhdGVPbmVCeXRlU3RyaW5nKGNoYXJDb2RlTGlzdCwgMCwgbGVuZ3RoKTsKICAgIH0KICAgIHJldHVybiBjcmVhdGVGcm9tQ2hhckNvZGVzKGNoYXJDb2RlTGlzdCwgMCwgbGVuZ3RoLCBiaXRzKTsKICB9CgogIHN0YXRpYyBTdHJpbmcgX2NyZWF0ZU9uZUJ5dGVTdHJpbmcoTGlzdDxpbnQ+IGNoYXJDb2RlcywgaW50IHN0YXJ0LCBpbnQgbGVuKSB7CiAgICAvLyBJdCdzIGFsd2F5cyBmYXN0ZXIgdG8gZG8gdGhpcyBpbiBEYXJ0IHRoYW4gdG8gY2FsbCBpbnRvIHRoZSBydW50aW1lLgogICAgdmFyIHMgPSBfT25lQnl0ZVN0cmluZy5fYWxsb2NhdGUobGVuKTsKCiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIF9VaW50OEFycmF5Vmlldy4KICAgIGlmIChjaGFyQ29kZXMgaXMgVWludDhMaXN0KSB7CiAgICAgIGlmIChzdGFydCA+PSAwICYmIGxlbiA+PSAwKSB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgcy5fc2V0QXQoaSwgY2hhckNvZGVzW3N0YXJ0ICsgaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gczsKICAgICAgfQogICAgfQoKICAgIC8vIEZhbGwgdGhyb3VnaCB0byBub3JtYWwgY2FzZS4KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgcy5fc2V0QXQoaSwgY2hhckNvZGVzW3N0YXJ0ICsgaV0pOwogICAgfQogICAgcmV0dXJuIHM7CiAgfQoKICBzdGF0aWMgU3RyaW5nIF9jcmVhdGVGcm9tQ29kZVBvaW50cyhMaXN0PGludD4gY29kZVBvaW50cywgaW50IHN0YXJ0LCBpbnQgZW5kKQogICAgICBuYXRpdmUgIlN0cmluZ0Jhc2VfY3JlYXRlRnJvbUNvZGVQb2ludHMiOwoKICBTdHJpbmcgb3BlcmF0b3IgW10oaW50IGluZGV4KSBuYXRpdmUgIlN0cmluZ19jaGFyQXQiOwoKICBpbnQgY29kZVVuaXRBdChpbnQgaW5kZXgpOyAvLyBJbXBsZW1lbnRlZCBpbiB0aGUgc3ViY2xhc3Nlcy4KCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBnZXQgbGVuZ3RoIG5hdGl2ZSAiU3RyaW5nX2dldExlbmd0aCI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKICBib29sIGdldCBpc0VtcHR5IHsKICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PSAwOwogIH0KCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiAhaXNFbXB0eTsKCiAgU3RyaW5nIG9wZXJhdG9yICsoU3RyaW5nIG90aGVyKSBuYXRpdmUgIlN0cmluZ19jb25jYXQiOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gdGhpczsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAob3RoZXIgaXMgU3RyaW5nICYmIHRoaXMubGVuZ3RoID09IG90aGVyLmxlbmd0aCkgewogICAgICBmaW5hbCBsZW4gPSB0aGlzLmxlbmd0aDsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgIGlmICh0aGlzLmNvZGVVbml0QXQoaSkgIT0gb3RoZXIuY29kZVVuaXRBdChpKSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGludCBjb21wYXJlVG8oU3RyaW5nIG90aGVyKSB7CiAgICBpbnQgdGhpc0xlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgaW50IG90aGVyTGVuZ3RoID0gb3RoZXIubGVuZ3RoOwogICAgaW50IGxlbiA9ICh0aGlzTGVuZ3RoIDwgb3RoZXJMZW5ndGgpID8gdGhpc0xlbmd0aCA6IG90aGVyTGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBpbnQgdGhpc0NvZGVVbml0ID0gdGhpcy5jb2RlVW5pdEF0KGkpOwogICAgICBpbnQgb3RoZXJDb2RlVW5pdCA9IG90aGVyLmNvZGVVbml0QXQoaSk7CiAgICAgIGlmICh0aGlzQ29kZVVuaXQgPCBvdGhlckNvZGVVbml0KSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9CiAgICAgIGlmICh0aGlzQ29kZVVuaXQgPiBvdGhlckNvZGVVbml0KSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0KICAgIH0KICAgIGlmICh0aGlzTGVuZ3RoIDwgb3RoZXJMZW5ndGgpIHJldHVybiAtMTsKICAgIGlmICh0aGlzTGVuZ3RoID4gb3RoZXJMZW5ndGgpIHJldHVybiAxOwogICAgcmV0dXJuIDA7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBfc3Vic3RyaW5nTWF0Y2hlcyhpbnQgc3RhcnQsIFN0cmluZyBvdGhlcikgewogICAgaWYgKG90aGVyLmlzRW1wdHkpIHJldHVybiB0cnVlOwogICAgZmluYWwgbGVuID0gb3RoZXIubGVuZ3RoOwogICAgaWYgKChzdGFydCA8IDApIHx8IChzdGFydCArIGxlbiA+IHRoaXMubGVuZ3RoKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGlmICh0aGlzLmNvZGVVbml0QXQoaSArIHN0YXJ0KSAhPSBvdGhlci5jb2RlVW5pdEF0KGkpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGJvb2wgZW5kc1dpdGgoU3RyaW5nIG90aGVyKSB7CiAgICByZXR1cm4gX3N1YnN0cmluZ01hdGNoZXModGhpcy5sZW5ndGggLSBvdGhlci5sZW5ndGgsIG90aGVyKTsKICB9CgogIGJvb2wgc3RhcnRzV2l0aChQYXR0ZXJuIHBhdHRlcm4sIFtpbnQgaW5kZXggPSAwXSkgewogICAgaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+IHRoaXMubGVuZ3RoKSkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShpbmRleCwgMCwgdGhpcy5sZW5ndGgpOwogICAgfQogICAgaWYgKHBhdHRlcm4gaXMgU3RyaW5nKSB7CiAgICAgIHJldHVybiBfc3Vic3RyaW5nTWF0Y2hlcyhpbmRleCwgcGF0dGVybik7CiAgICB9CiAgICByZXR1cm4gcGF0dGVybi5tYXRjaEFzUHJlZml4KHRoaXMsIGluZGV4KSAhPSBudWxsOwogIH0KCiAgaW50IGluZGV4T2YoUGF0dGVybiBwYXR0ZXJuLCBbaW50IHN0YXJ0ID0gMF0pIHsKICAgIGlmICgoc3RhcnQgPCAwKSB8fCAoc3RhcnQgPiB0aGlzLmxlbmd0aCkpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2Uoc3RhcnQsIDAsIHRoaXMubGVuZ3RoLCAic3RhcnQiKTsKICAgIH0KICAgIGlmIChwYXR0ZXJuIGlzIFN0cmluZykgewogICAgICBTdHJpbmcgb3RoZXIgPSBwYXR0ZXJuOwogICAgICBpbnQgbWF4SW5kZXggPSB0aGlzLmxlbmd0aCAtIG90aGVyLmxlbmd0aDsKICAgICAgLy8gVE9ETzogVXNlIGFuIGVmZmljaWVudCBzdHJpbmcgc2VhcmNoIChlLmcuIEJNSCkuCiAgICAgIGZvciAoaW50IGluZGV4ID0gc3RhcnQ7IGluZGV4IDw9IG1heEluZGV4OyBpbmRleCsrKSB7CiAgICAgICAgaWYgKF9zdWJzdHJpbmdNYXRjaGVzKGluZGV4LCBvdGhlcikpIHsKICAgICAgICAgIHJldHVybiBpbmRleDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IHRoaXMubGVuZ3RoOyBpKyspIHsKICAgICAgLy8gVE9ETygxMTI3Nik7IFRoaXMgaGFzIHF1YWRyYXRpYyBiZWhhdmlvciBiZWNhdXNlIG1hdGNoQXNQcmVmaXggdHJpZXMKICAgICAgLy8gdG8gZmluZCBhIGxhdGVyIG1hdGNoIHRvby4gT3B0aW1pemUgbWF0Y2hBc1ByZWZpeCB0byBhdm9pZCB0aGlzLgogICAgICBpZiAocGF0dGVybi5tYXRjaEFzUHJlZml4KHRoaXMsIGkpICE9IG51bGwpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgaW50IGxhc3RJbmRleE9mKFBhdHRlcm4gcGF0dGVybiwgW2ludCBzdGFydCA9IG51bGxdKSB7CiAgICBpZiAoc3RhcnQgPT0gbnVsbCkgewogICAgICBzdGFydCA9IHRoaXMubGVuZ3RoOwogICAgfSBlbHNlIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPiB0aGlzLmxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShzdGFydCwgMCwgdGhpcy5sZW5ndGgpOwogICAgfQogICAgaWYgKHBhdHRlcm4gaXMgU3RyaW5nKSB7CiAgICAgIFN0cmluZyBvdGhlciA9IHBhdHRlcm47CiAgICAgIGludCBtYXhJbmRleCA9IHRoaXMubGVuZ3RoIC0gb3RoZXIubGVuZ3RoOwogICAgICBpZiAobWF4SW5kZXggPCBzdGFydCkgc3RhcnQgPSBtYXhJbmRleDsKICAgICAgZm9yIChpbnQgaW5kZXggPSBzdGFydDsgaW5kZXggPj0gMDsgaW5kZXgtLSkgewogICAgICAgIGlmIChfc3Vic3RyaW5nTWF0Y2hlcyhpbmRleCwgb3RoZXIpKSB7CiAgICAgICAgICByZXR1cm4gaW5kZXg7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA+PSAwOyBpLS0pIHsKICAgICAgLy8gVE9ETygxMTI3Nik7IFRoaXMgaGFzIHF1YWRyYXRpYyBiZWhhdmlvciBiZWNhdXNlIG1hdGNoQXNQcmVmaXggdHJpZXMKICAgICAgLy8gdG8gZmluZCBhIGxhdGVyIG1hdGNoIHRvby4gT3B0aW1pemUgbWF0Y2hBc1ByZWZpeCB0byBhdm9pZCB0aGlzLgogICAgICBpZiAocGF0dGVybi5tYXRjaEFzUHJlZml4KHRoaXMsIGkpICE9IG51bGwpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgU3RyaW5nIHN1YnN0cmluZyhpbnQgc3RhcnRJbmRleCwgW2ludCBlbmRJbmRleF0pIHsKICAgIGVuZEluZGV4ID8/PSB0aGlzLmxlbmd0aDsKCiAgICBpZiAoKHN0YXJ0SW5kZXggPCAwKSB8fCAoc3RhcnRJbmRleCA+IHRoaXMubGVuZ3RoKSkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci52YWx1ZShzdGFydEluZGV4KTsKICAgIH0KICAgIGlmICgoZW5kSW5kZXggPCAwKSB8fCAoZW5kSW5kZXggPiB0aGlzLmxlbmd0aCkpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IudmFsdWUoZW5kSW5kZXgpOwogICAgfQogICAgaWYgKHN0YXJ0SW5kZXggPiBlbmRJbmRleCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci52YWx1ZShzdGFydEluZGV4KTsKICAgIH0KICAgIHJldHVybiBfc3Vic3RyaW5nVW5jaGVja2VkKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTsKICB9CgogIFN0cmluZyBfc3Vic3RyaW5nVW5jaGVja2VkKGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpIHsKICAgIGFzc2VydChlbmRJbmRleCAhPSBudWxsKTsKICAgIGFzc2VydCgoc3RhcnRJbmRleCA+PSAwKSAmJiAoc3RhcnRJbmRleCA8PSB0aGlzLmxlbmd0aCkpOwogICAgYXNzZXJ0KChlbmRJbmRleCA+PSAwKSAmJiAoZW5kSW5kZXggPD0gdGhpcy5sZW5ndGgpKTsKICAgIGFzc2VydChzdGFydEluZGV4IDw9IGVuZEluZGV4KTsKCiAgICBpZiAoc3RhcnRJbmRleCA9PSBlbmRJbmRleCkgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBpZiAoKHN0YXJ0SW5kZXggPT0gMCkgJiYgKGVuZEluZGV4ID09IHRoaXMubGVuZ3RoKSkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGlmICgoc3RhcnRJbmRleCArIDEpID09IGVuZEluZGV4KSB7CiAgICAgIHJldHVybiB0aGlzW3N0YXJ0SW5kZXhdOwogICAgfQogICAgcmV0dXJuIF9zdWJzdHJpbmdVbmNoZWNrZWROYXRpdmUoc3RhcnRJbmRleCwgZW5kSW5kZXgpOwogIH0KCiAgU3RyaW5nIF9zdWJzdHJpbmdVbmNoZWNrZWROYXRpdmUoaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkKICAgICAgbmF0aXZlICJTdHJpbmdCYXNlX3N1YnN0cmluZ1VuY2hlY2tlZCI7CgogIC8vIENoZWNrcyBmb3Igb25lLWJ5dGUgd2hpdGVzcGFjZXMgb25seS4KICBzdGF0aWMgYm9vbCBfaXNPbmVCeXRlV2hpdGVzcGFjZShpbnQgY29kZVVuaXQpIHsKICAgIGlmIChjb2RlVW5pdCA8PSAzMikgewogICAgICByZXR1cm4gKChjb2RlVW5pdCA9PSAzMikgfHwgLy8gU3BhY2UuCiAgICAgICAgICAoKGNvZGVVbml0IDw9IDEzKSAmJiAoY29kZVVuaXQgPj0gOSkpKTsgLy8gQ1IsIExGLCBUQUIsIGV0Yy4KICAgIH0KICAgIHJldHVybiAoY29kZVVuaXQgPT0gMHg4NSkgfHwgKGNvZGVVbml0ID09IDB4QTApOyAvLyBORUwsIE5CU1AuCiAgfQoKICAvLyBDaGFyYWN0ZXJzIHdpdGggV2hpdGVzcGFjZSBwcm9wZXJ0eSAoVW5pY29kZSA2LjMpLgogIC8vIDAwMDkuLjAwMEQgICAgOyBXaGl0ZV9TcGFjZSAjIENjICAgICAgIDxjb250cm9sLTAwMDk+Li48Y29udHJvbC0wMDBEPgogIC8vIDAwMjAgICAgICAgICAgOyBXaGl0ZV9TcGFjZSAjIFpzICAgICAgIFNQQUNFCiAgLy8gMDA4NSAgICAgICAgICA7IFdoaXRlX1NwYWNlICMgQ2MgICAgICAgPGNvbnRyb2wtMDA4NT4KICAvLyAwMEEwICAgICAgICAgIDsgV2hpdGVfU3BhY2UgIyBacyAgICAgICBOTy1CUkVBSyBTUEFDRQogIC8vIDE2ODAgICAgICAgICAgOyBXaGl0ZV9TcGFjZSAjIFpzICAgICAgIE9HSEFNIFNQQUNFIE1BUksKICAvLyAyMDAwLi4yMDBBICAgIDsgV2hpdGVfU3BhY2UgIyBacyAgICAgICBFTiBRVUFELi5IQUlSIFNQQUNFCiAgLy8gMjAyOCAgICAgICAgICA7IFdoaXRlX1NwYWNlICMgWmwgICAgICAgTElORSBTRVBBUkFUT1IKICAvLyAyMDI5ICAgICAgICAgIDsgV2hpdGVfU3BhY2UgIyBacCAgICAgICBQQVJBR1JBUEggU0VQQVJBVE9SCiAgLy8gMjAyRiAgICAgICAgICA7IFdoaXRlX1NwYWNlICMgWnMgICAgICAgTkFSUk9XIE5PLUJSRUFLIFNQQUNFCiAgLy8gMjA1RiAgICAgICAgICA7IFdoaXRlX1NwYWNlICMgWnMgICAgICAgTUVESVVNIE1BVEhFTUFUSUNBTCBTUEFDRQogIC8vIDMwMDAgICAgICAgICAgOyBXaGl0ZV9TcGFjZSAjIFpzICAgICAgIElERU9HUkFQSElDIFNQQUNFCiAgLy8KICAvLyBCT006IDB4RkVGRgogIHN0YXRpYyBib29sIF9pc1R3b0J5dGVXaGl0ZXNwYWNlKGludCBjb2RlVW5pdCkgewogICAgaWYgKGNvZGVVbml0IDw9IDMyKSB7CiAgICAgIHJldHVybiAoY29kZVVuaXQgPT0gMzIpIHx8ICgoY29kZVVuaXQgPD0gMTMpICYmIChjb2RlVW5pdCA+PSA5KSk7CiAgICB9CiAgICBpZiAoY29kZVVuaXQgPCAweDg1KSByZXR1cm4gZmFsc2U7CiAgICBpZiAoKGNvZGVVbml0ID09IDB4ODUpIHx8IChjb2RlVW5pdCA9PSAweEEwKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gKGNvZGVVbml0IDw9IDB4MjAwQSkKICAgICAgICA/ICgoY29kZVVuaXQgPT0gMHgxNjgwKSB8fCAoMHgyMDAwIDw9IGNvZGVVbml0KSkKICAgICAgICA6ICgoY29kZVVuaXQgPT0gMHgyMDI4KSB8fAogICAgICAgICAgICAoY29kZVVuaXQgPT0gMHgyMDI5KSB8fAogICAgICAgICAgICAoY29kZVVuaXQgPT0gMHgyMDJGKSB8fAogICAgICAgICAgICAoY29kZVVuaXQgPT0gMHgyMDVGKSB8fAogICAgICAgICAgICAoY29kZVVuaXQgPT0gMHgzMDAwKSB8fAogICAgICAgICAgICAoY29kZVVuaXQgPT0gMHhGRUZGKSk7CiAgfQoKICBpbnQgX2ZpcnN0Tm9uV2hpdGVzcGFjZSgpIHsKICAgIGZpbmFsIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgaW50IGZpcnN0ID0gMDsKICAgIGZvciAoOyBmaXJzdCA8IGxlbjsgZmlyc3QrKykgewogICAgICBpZiAoIV9pc1doaXRlc3BhY2UodGhpcy5jb2RlVW5pdEF0KGZpcnN0KSkpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZpcnN0OwogIH0KCiAgaW50IF9sYXN0Tm9uV2hpdGVzcGFjZSgpIHsKICAgIGludCBsYXN0ID0gdGhpcy5sZW5ndGggLSAxOwogICAgZm9yICg7IGxhc3QgPj0gMDsgbGFzdC0tKSB7CiAgICAgIGlmICghX2lzV2hpdGVzcGFjZSh0aGlzLmNvZGVVbml0QXQobGFzdCkpKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBsYXN0OwogIH0KCiAgU3RyaW5nIHRyaW0oKSB7CiAgICBmaW5hbCBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGludCBmaXJzdCA9IF9maXJzdE5vbldoaXRlc3BhY2UoKTsKICAgIGlmIChsZW4gPT0gZmlyc3QpIHsKICAgICAgLy8gU3RyaW5nIGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZXMuCiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGludCBsYXN0ID0gX2xhc3ROb25XaGl0ZXNwYWNlKCkgKyAxOwogICAgaWYgKChmaXJzdCA9PSAwKSAmJiAobGFzdCA9PSBsZW4pKSB7CiAgICAgIC8vIFJldHVybnMgdGhpcyBzdHJpbmcgc2luY2UgaXQgZG9lcyBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nCiAgICAgIC8vIHdoaXRlc3BhY2VzLgogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHJldHVybiBfc3Vic3RyaW5nVW5jaGVja2VkKGZpcnN0LCBsYXN0KTsKICB9CgogIFN0cmluZyB0cmltTGVmdCgpIHsKICAgIGZpbmFsIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgaW50IGZpcnN0ID0gMDsKICAgIGZvciAoOyBmaXJzdCA8IGxlbjsgZmlyc3QrKykgewogICAgICBpZiAoIV9pc1doaXRlc3BhY2UodGhpcy5jb2RlVW5pdEF0KGZpcnN0KSkpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKGxlbiA9PSBmaXJzdCkgewogICAgICAvLyBTdHJpbmcgY29udGFpbnMgb25seSB3aGl0ZXNwYWNlcy4KICAgICAgcmV0dXJuICIiOwogICAgfQogICAgaWYgKGZpcnN0ID09IDApIHsKICAgICAgLy8gUmV0dXJucyB0aGlzIHN0cmluZyBzaW5jZSBpdCBkb2VzIG5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcKICAgICAgLy8gd2hpdGVzcGFjZXMuCiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgcmV0dXJuIF9zdWJzdHJpbmdVbmNoZWNrZWQoZmlyc3QsIGxlbik7CiAgfQoKICBTdHJpbmcgdHJpbVJpZ2h0KCkgewogICAgZmluYWwgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBpbnQgbGFzdCA9IGxlbiAtIDE7CiAgICBmb3IgKDsgbGFzdCA+PSAwOyBsYXN0LS0pIHsKICAgICAgaWYgKCFfaXNXaGl0ZXNwYWNlKHRoaXMuY29kZVVuaXRBdChsYXN0KSkpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKGxhc3QgPT0gLTEpIHsKICAgICAgLy8gU3RyaW5nIGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZXMuCiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGlmIChsYXN0ID09IChsZW4gLSAxKSkgewogICAgICAvLyBSZXR1cm5zIHRoaXMgc3RyaW5nIHNpbmNlIGl0IGRvZXMgbm90IGhhdmUgdHJhaWxpbmcgd2hpdGVzcGFjZXMuCiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgcmV0dXJuIF9zdWJzdHJpbmdVbmNoZWNrZWQoMCwgbGFzdCArIDEpOwogIH0KCiAgU3RyaW5nIG9wZXJhdG9yICooaW50IHRpbWVzKSB7CiAgICBpZiAodGltZXMgPD0gMCkgcmV0dXJuICIiOwogICAgaWYgKHRpbWVzID09IDEpIHJldHVybiB0aGlzOwogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIodGhpcyk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8IHRpbWVzOyBpKyspIHsKICAgICAgYnVmZmVyLndyaXRlKHRoaXMpOwogICAgfQogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgU3RyaW5nIHBhZExlZnQoaW50IHdpZHRoLCBbU3RyaW5nIHBhZGRpbmcgPSAnICddKSB7CiAgICBpbnQgZGVsdGEgPSB3aWR0aCAtIHRoaXMubGVuZ3RoOwogICAgaWYgKGRlbHRhIDw9IDApIHJldHVybiB0aGlzOwogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGE7IGkrKykgewogICAgICBidWZmZXIud3JpdGUocGFkZGluZyk7CiAgICB9CiAgICBidWZmZXIud3JpdGUodGhpcyk7CiAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgfQoKICBTdHJpbmcgcGFkUmlnaHQoaW50IHdpZHRoLCBbU3RyaW5nIHBhZGRpbmcgPSAnICddKSB7CiAgICBpbnQgZGVsdGEgPSB3aWR0aCAtIHRoaXMubGVuZ3RoOwogICAgaWYgKGRlbHRhIDw9IDApIHJldHVybiB0aGlzOwogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIodGhpcyk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhOyBpKyspIHsKICAgICAgYnVmZmVyLndyaXRlKHBhZGRpbmcpOwogICAgfQogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgYm9vbCBjb250YWlucyhQYXR0ZXJuIHBhdHRlcm4sIFtpbnQgc3RhcnRJbmRleCA9IDBdKSB7CiAgICBpZiAocGF0dGVybiBpcyBTdHJpbmcpIHsKICAgICAgaWYgKHN0YXJ0SW5kZXggPCAwIHx8IHN0YXJ0SW5kZXggPiB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKHN0YXJ0SW5kZXgsIDAsIHRoaXMubGVuZ3RoKTsKICAgICAgfQogICAgICByZXR1cm4gaW5kZXhPZihwYXR0ZXJuLCBzdGFydEluZGV4KSA+PSAwOwogICAgfQogICAgcmV0dXJuIHBhdHRlcm4uYWxsTWF0Y2hlcyh0aGlzLnN1YnN0cmluZyhzdGFydEluZGV4KSkuaXNOb3RFbXB0eTsKICB9CgogIFN0cmluZyByZXBsYWNlRmlyc3QoUGF0dGVybiBwYXR0ZXJuLCBTdHJpbmcgcmVwbGFjZW1lbnQsCiAgICAgIFtpbnQgc3RhcnRJbmRleCA9IDBdKSB7CiAgICBpZiAocGF0dGVybiBpcyEgUGF0dGVybikgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiJHtwYXR0ZXJufSBpcyBub3QgYSBQYXR0ZXJuIik7CiAgICB9CiAgICBpZiAocmVwbGFjZW1lbnQgaXMhIFN0cmluZykgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiJHtyZXBsYWNlbWVudH0gaXMgbm90IGEgU3RyaW5nIik7CiAgICB9CiAgICBpZiAoc3RhcnRJbmRleCBpcyEgaW50KSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCIke3N0YXJ0SW5kZXh9IGlzIG5vdCBhbiBpbnQiKTsKICAgIH0KICAgIFJhbmdlRXJyb3IuY2hlY2tWYWx1ZUluSW50ZXJ2YWwoc3RhcnRJbmRleCwgMCwgdGhpcy5sZW5ndGgsICJzdGFydEluZGV4Iik7CiAgICBJdGVyYXRvciBpdGVyYXRvciA9IHN0YXJ0SW5kZXggPT0gMAogICAgICAgID8gcGF0dGVybi5hbGxNYXRjaGVzKHRoaXMpLml0ZXJhdG9yCiAgICAgICAgOiBwYXR0ZXJuLmFsbE1hdGNoZXModGhpcywgc3RhcnRJbmRleCkuaXRlcmF0b3I7CiAgICBpZiAoIWl0ZXJhdG9yLm1vdmVOZXh0KCkpIHJldHVybiB0aGlzOwogICAgTWF0Y2ggbWF0Y2ggPSBpdGVyYXRvci5jdXJyZW50OwogICAgcmV0dXJuIHJlcGxhY2VSYW5nZShtYXRjaC5zdGFydCwgbWF0Y2guZW5kLCByZXBsYWNlbWVudCk7CiAgfQoKICBTdHJpbmcgcmVwbGFjZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgU3RyaW5nIHJlcGxhY2VtZW50KSB7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBsZW5ndGgpOwogICAgYm9vbCByZXBsYWNlbWVudElzT25lQnl0ZSA9IHJlcGxhY2VtZW50Ll9pc09uZUJ5dGU7CiAgICBpZiAoc3RhcnQgPT0gMCAmJiBlbmQgPT0gbGVuZ3RoKSByZXR1cm4gcmVwbGFjZW1lbnQ7CiAgICBpbnQgcmVwbGFjZW1lbnRMZW5ndGggPSByZXBsYWNlbWVudC5sZW5ndGg7CiAgICBpbnQgdG90YWxMZW5ndGggPSBzdGFydCArIChsZW5ndGggLSBlbmQpICsgcmVwbGFjZW1lbnRMZW5ndGg7CiAgICBpZiAocmVwbGFjZW1lbnRJc09uZUJ5dGUgJiYgdGhpcy5faXNPbmVCeXRlKSB7CiAgICAgIHZhciByZXN1bHQgPSBfT25lQnl0ZVN0cmluZy5fYWxsb2NhdGUodG90YWxMZW5ndGgpOwogICAgICBpbnQgaW5kZXggPSAwOwogICAgICBpbmRleCA9IHJlc3VsdC5fc2V0UmFuZ2UoaW5kZXgsIHRoaXMsIDAsIHN0YXJ0KTsKICAgICAgaW5kZXggPSByZXN1bHQuX3NldFJhbmdlKHN0YXJ0LCByZXBsYWNlbWVudCwgMCwgcmVwbGFjZW1lbnRMZW5ndGgpOwogICAgICByZXN1bHQuX3NldFJhbmdlKGluZGV4LCB0aGlzLCBlbmQsIGxlbmd0aCk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBMaXN0IHNsaWNlcyA9IFtdOwogICAgX2FkZFJlcGxhY2VTbGljZShzbGljZXMsIDAsIHN0YXJ0KTsKICAgIGlmIChyZXBsYWNlbWVudC5sZW5ndGggPiAwKSBzbGljZXMuYWRkKHJlcGxhY2VtZW50KTsKICAgIF9hZGRSZXBsYWNlU2xpY2Uoc2xpY2VzLCBlbmQsIGxlbmd0aCk7CiAgICByZXR1cm4gX2pvaW5SZXBsYWNlQWxsUmVzdWx0KAogICAgICAgIHRoaXMsIHNsaWNlcywgdG90YWxMZW5ndGgsIHJlcGxhY2VtZW50SXNPbmVCeXRlKTsKICB9CgogIHN0YXRpYyBpbnQgX2FkZFJlcGxhY2VTbGljZShMaXN0IG1hdGNoZXMsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKGxlbmd0aCA+IDApIHsKICAgICAgaWYgKGxlbmd0aCA8PSBfbWF4TGVuZ3RoVmFsdWUgJiYgc3RhcnQgPD0gX21heFN0YXJ0VmFsdWUpIHsKICAgICAgICBtYXRjaGVzLmFkZCgtKChzdGFydCA8PCBfbGVuZ3RoQml0cykgfCBsZW5ndGgpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBtYXRjaGVzLmFkZChzdGFydCk7CiAgICAgICAgbWF0Y2hlcy5hZGQoZW5kKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGxlbmd0aDsKICB9CgogIFN0cmluZyByZXBsYWNlQWxsKFBhdHRlcm4gcGF0dGVybiwgU3RyaW5nIHJlcGxhY2VtZW50KSB7CiAgICBpZiAocGF0dGVybiA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJwYXR0ZXJuIik7CiAgICBpZiAocmVwbGFjZW1lbnQgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgicmVwbGFjZW1lbnQiKTsKCiAgICBpbnQgc3RhcnRJbmRleCA9IDA7CiAgICAvLyBTdHJpbmcgZnJhZ21lbnRzIHRoYXQgcmVwbGFjZSB0aGUgdGhlIHByZWZpeCBbdGhpc10gdXAgdG8gW3N0YXJ0SW5kZXhdLgogICAgTGlzdCBtYXRjaGVzID0gW107CiAgICBpbnQgbGVuZ3RoID0gMDsgLy8gTGVuZ3RoIG9mIGFsbCBmcmFnbWVudHMuCiAgICBpbnQgcmVwbGFjZW1lbnRMZW5ndGggPSByZXBsYWNlbWVudC5sZW5ndGg7CgogICAgaWYgKHJlcGxhY2VtZW50TGVuZ3RoID09IDApIHsKICAgICAgZm9yIChNYXRjaCBtYXRjaCBpbiBwYXR0ZXJuLmFsbE1hdGNoZXModGhpcykpIHsKICAgICAgICBsZW5ndGggKz0gX2FkZFJlcGxhY2VTbGljZShtYXRjaGVzLCBzdGFydEluZGV4LCBtYXRjaC5zdGFydCk7CiAgICAgICAgc3RhcnRJbmRleCA9IG1hdGNoLmVuZDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZm9yIChNYXRjaCBtYXRjaCBpbiBwYXR0ZXJuLmFsbE1hdGNoZXModGhpcykpIHsKICAgICAgICBsZW5ndGggKz0gX2FkZFJlcGxhY2VTbGljZShtYXRjaGVzLCBzdGFydEluZGV4LCBtYXRjaC5zdGFydCk7CiAgICAgICAgbWF0Y2hlcy5hZGQocmVwbGFjZW1lbnQpOwogICAgICAgIGxlbmd0aCArPSByZXBsYWNlbWVudExlbmd0aDsKICAgICAgICBzdGFydEluZGV4ID0gbWF0Y2guZW5kOwogICAgICB9CiAgICB9CiAgICAvLyBObyBtYXRjaCwgb3IgYSB6ZXJvLWxlbmd0aCBtYXRjaCBhdCBzdGFydCB3aXRoIHplcm8tbGVuZ3RoIHJlcGxhY2VtZW50LgogICAgaWYgKHN0YXJ0SW5kZXggPT0gMCAmJiBsZW5ndGggPT0gMCkgcmV0dXJuIHRoaXM7CiAgICBsZW5ndGggKz0gX2FkZFJlcGxhY2VTbGljZShtYXRjaGVzLCBzdGFydEluZGV4LCB0aGlzLmxlbmd0aCk7CiAgICBib29sIHJlcGxhY2VtZW50SXNPbmVCeXRlID0gcmVwbGFjZW1lbnQuX2lzT25lQnl0ZTsKICAgIGlmIChyZXBsYWNlbWVudElzT25lQnl0ZSAmJgogICAgICAgIGxlbmd0aCA8IF9tYXhKb2luUmVwbGFjZU9uZUJ5dGVTdHJpbmdMZW5ndGggJiYKICAgICAgICB0aGlzLl9pc09uZUJ5dGUpIHsKICAgICAgLy8gVE9ETyhscm4pOiBJcyB0aGVyZSBhIGN1dC1vZmYgcG9pbnQsIG9yIGlzIHJ1bnRpbWUgYWx3YXlzIGZhc3Rlcj8KICAgICAgcmV0dXJuIF9qb2luUmVwbGFjZUFsbE9uZUJ5dGVSZXN1bHQodGhpcywgbWF0Y2hlcywgbGVuZ3RoKTsKICAgIH0KICAgIHJldHVybiBfam9pblJlcGxhY2VBbGxSZXN1bHQodGhpcywgbWF0Y2hlcywgbGVuZ3RoLCByZXBsYWNlbWVudElzT25lQnl0ZSk7CiAgfQoKICAvKioKICAgKiBBcyBbX2pvaW5SZXBsYWNlQWxsUmVzdWx0XSwgYnV0IGtub3dpbmcgdGhhdCB0aGUgcmVzdWx0CiAgICogaXMgYWx3YXlzIGEgW19PbmVCeXRlU3RyaW5nXS4KICAgKi8KICBzdGF0aWMgU3RyaW5nIF9qb2luUmVwbGFjZUFsbE9uZUJ5dGVSZXN1bHQoCiAgICAgIFN0cmluZyBiYXNlLCBMaXN0IG1hdGNoZXMsIGludCBsZW5ndGgpIHsKICAgIF9PbmVCeXRlU3RyaW5nIHJlc3VsdCA9IF9PbmVCeXRlU3RyaW5nLl9hbGxvY2F0ZShsZW5ndGgpOwogICAgaW50IHdyaXRlSW5kZXggPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXRjaGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBlbnRyeSA9IG1hdGNoZXNbaV07CiAgICAgIGlmIChlbnRyeSBpcyBfU21pKSB7CiAgICAgICAgaW50IHNsaWNlU3RhcnQgPSBlbnRyeTsKICAgICAgICBpbnQgc2xpY2VFbmQ7CiAgICAgICAgaWYgKHNsaWNlU3RhcnQgPCAwKSB7CiAgICAgICAgICBpbnQgYml0cyA9IC1zbGljZVN0YXJ0OwogICAgICAgICAgaW50IHNsaWNlTGVuZ3RoID0gYml0cyAmIF9sZW5ndGhNYXNrOwogICAgICAgICAgc2xpY2VTdGFydCA9IGJpdHMgPj4gX2xlbmd0aEJpdHM7CiAgICAgICAgICBzbGljZUVuZCA9IHNsaWNlU3RhcnQgKyBzbGljZUxlbmd0aDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaSsrOwogICAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgd2l0aCB2YWxpZCBtYXRjaGVzIGxpc3RzLgogICAgICAgICAgLy8gSWYgdGhlIGxpc3QgaXMgc2hvcnQsIG9yIHNsaWNlRW5kIGlzIG5vdCBhbiBpbnRlZ2VyLCBvbmUgb2YKICAgICAgICAgIC8vIHRoZSBuZXh0IGZldyBsaW5lcyB3aWxsIHRocm93IGFueXdheS4KICAgICAgICAgIGFzc2VydChpIDwgbWF0Y2hlcy5sZW5ndGgpOwogICAgICAgICAgc2xpY2VFbmQgPSBtYXRjaGVzW2ldOwogICAgICAgIH0KICAgICAgICBmb3IgKGludCBqID0gc2xpY2VTdGFydDsgaiA8IHNsaWNlRW5kOyBqKyspIHsKICAgICAgICAgIHJlc3VsdC5fc2V0QXQod3JpdGVJbmRleCsrLCBiYXNlLmNvZGVVbml0QXQoaikpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBSZXBsYWNlbWVudCBpcyBhIG9uZS1ieXRlIHN0cmluZy4KICAgICAgICBTdHJpbmcgcmVwbGFjZW1lbnQgPSBlbnRyeTsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHJlcGxhY2VtZW50Lmxlbmd0aDsgaisrKSB7CiAgICAgICAgICByZXN1bHQuX3NldEF0KHdyaXRlSW5kZXgrKywgcmVwbGFjZW1lbnQuY29kZVVuaXRBdChqKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBhc3NlcnQod3JpdGVJbmRleCA9PSBsZW5ndGgpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8qKgogICAqIENvbWJpbmUgdGhlIHJlc3VsdHMgb2YgYSBbcmVwbGFjZUFsbF0gbWF0Y2ggaW50byBhIG5ldyBzdHJpbmcuCiAgICoKICAgKiBUaGUgW21hdGNoZXNdIGxpc3RzIGNvbnRhaW5zIFNtaSBpbmRleCBwYWlycyByZXByZXNlbnRpbmcgc2xpY2VzIG9mCiAgICogW2Jhc2VdIGFuZCBbU3RyaW5nXXMgdG8gYmUgcHV0IGluIGJldHdlZW4gdGhlIHNsaWNlcy4KICAgKgogICAqIFRoZSB0b3RhbCBbbGVuZ3RoXSBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZyBpcyBrbm93biwgYXMgaXMKICAgKiB3aGV0aGVyIHRoZSByZXBsYWNlbWVudCBzdHJpbmdzIGFyZSBvbmUtYnl0ZSBzdHJpbmdzLgogICAqIElmIHRoZXkgYXJlLCB0aGVuIHdlIGhhdmUgdG8gY2hlY2sgdGhlIGJhc2Ugc3RyaW5nIHNsaWNlcyB0byBrbm93CiAgICogd2hldGhlciB0aGUgcmVzdWx0IG11c3QgYmUgYSBvbmUtYnl0ZSBzdHJpbmcuCiAgICovCiAgc3RhdGljIFN0cmluZwogICAgICBfam9pblJlcGxhY2VBbGxSZXN1bHQoU3RyaW5nIGJhc2UsIExpc3QgbWF0Y2hlcywgaW50IGxlbmd0aCwKICAgICAgICAgIGJvb2wgcmVwbGFjZW1lbnRTdHJpbmdzQXJlT25lQnl0ZSkKICAgICAgbmF0aXZlICJTdHJpbmdCYXNlX2pvaW5SZXBsYWNlQWxsUmVzdWx0IjsKCiAgU3RyaW5nIHJlcGxhY2VBbGxNYXBwZWQoUGF0dGVybiBwYXR0ZXJuLCBTdHJpbmcgcmVwbGFjZShNYXRjaCBtYXRjaCkpIHsKICAgIGlmIChwYXR0ZXJuID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoInBhdHRlcm4iKTsKICAgIGlmIChyZXBsYWNlID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoInJlcGxhY2UiKTsKICAgIExpc3QgbWF0Y2hlcyA9IFtdOwogICAgaW50IGxlbmd0aCA9IDA7CiAgICBpbnQgc3RhcnRJbmRleCA9IDA7CiAgICBib29sIHJlcGxhY2VtZW50U3RyaW5nc0FyZU9uZUJ5dGUgPSB0cnVlOwogICAgZm9yIChNYXRjaCBtYXRjaCBpbiBwYXR0ZXJuLmFsbE1hdGNoZXModGhpcykpIHsKICAgICAgbGVuZ3RoICs9IF9hZGRSZXBsYWNlU2xpY2UobWF0Y2hlcywgc3RhcnRJbmRleCwgbWF0Y2guc3RhcnQpOwogICAgICB2YXIgcmVwbGFjZW1lbnQgPSAiJHtyZXBsYWNlKG1hdGNoKX0iOwogICAgICBtYXRjaGVzLmFkZChyZXBsYWNlbWVudCk7CiAgICAgIGxlbmd0aCArPSByZXBsYWNlbWVudC5sZW5ndGg7CiAgICAgIHJlcGxhY2VtZW50U3RyaW5nc0FyZU9uZUJ5dGUgPQogICAgICAgICAgcmVwbGFjZW1lbnRTdHJpbmdzQXJlT25lQnl0ZSAmJiByZXBsYWNlbWVudC5faXNPbmVCeXRlOwogICAgICBzdGFydEluZGV4ID0gbWF0Y2guZW5kOwogICAgfQogICAgaWYgKG1hdGNoZXMuaXNFbXB0eSkgcmV0dXJuIHRoaXM7CiAgICBsZW5ndGggKz0gX2FkZFJlcGxhY2VTbGljZShtYXRjaGVzLCBzdGFydEluZGV4LCB0aGlzLmxlbmd0aCk7CiAgICBpZiAocmVwbGFjZW1lbnRTdHJpbmdzQXJlT25lQnl0ZSAmJgogICAgICAgIGxlbmd0aCA8IF9tYXhKb2luUmVwbGFjZU9uZUJ5dGVTdHJpbmdMZW5ndGggJiYKICAgICAgICB0aGlzLl9pc09uZUJ5dGUpIHsKICAgICAgcmV0dXJuIF9qb2luUmVwbGFjZUFsbE9uZUJ5dGVSZXN1bHQodGhpcywgbWF0Y2hlcywgbGVuZ3RoKTsKICAgIH0KICAgIHJldHVybiBfam9pblJlcGxhY2VBbGxSZXN1bHQoCiAgICAgICAgdGhpcywgbWF0Y2hlcywgbGVuZ3RoLCByZXBsYWNlbWVudFN0cmluZ3NBcmVPbmVCeXRlKTsKICB9CgogIFN0cmluZyByZXBsYWNlRmlyc3RNYXBwZWQoUGF0dGVybiBwYXR0ZXJuLCBTdHJpbmcgcmVwbGFjZShNYXRjaCBtYXRjaCksCiAgICAgIFtpbnQgc3RhcnRJbmRleCA9IDBdKSB7CiAgICBpZiAocGF0dGVybiA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJwYXR0ZXJuIik7CiAgICBpZiAocmVwbGFjZSA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJyZXBsYWNlIik7CiAgICBpZiAoc3RhcnRJbmRleCA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJzdGFydEluZGV4Iik7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsdWVJbkludGVydmFsKHN0YXJ0SW5kZXgsIDAsIHRoaXMubGVuZ3RoLCAic3RhcnRJbmRleCIpOwoKICAgIHZhciBtYXRjaGVzID0gcGF0dGVybi5hbGxNYXRjaGVzKHRoaXMsIHN0YXJ0SW5kZXgpLml0ZXJhdG9yOwogICAgaWYgKCFtYXRjaGVzLm1vdmVOZXh0KCkpIHJldHVybiB0aGlzOwogICAgdmFyIG1hdGNoID0gbWF0Y2hlcy5jdXJyZW50OwogICAgdmFyIHJlcGxhY2VtZW50ID0gIiR7cmVwbGFjZShtYXRjaCl9IjsKICAgIHJldHVybiByZXBsYWNlUmFuZ2UobWF0Y2guc3RhcnQsIG1hdGNoLmVuZCwgcmVwbGFjZW1lbnQpOwogIH0KCiAgc3RhdGljIFN0cmluZyBfbWF0Y2hTdHJpbmcoTWF0Y2ggbWF0Y2gpID0+IG1hdGNoWzBdOwogIHN0YXRpYyBTdHJpbmcgX3N0cmluZ0lkZW50aXR5KFN0cmluZyBzdHJpbmcpID0+IHN0cmluZzsKCiAgU3RyaW5nIF9zcGxpdE1hcEpvaW5FbXB0eVN0cmluZygKICAgICAgU3RyaW5nIG9uTWF0Y2goTWF0Y2ggbWF0Y2gpLCBTdHJpbmcgb25Ob25NYXRjaChTdHJpbmcgbm9uTWF0Y2gpKSB7CiAgICAvLyBQYXR0ZXJuIGlzIHRoZSBlbXB0eSBzdHJpbmcuCiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgaW50IGkgPSAwOwogICAgYnVmZmVyLndyaXRlKG9uTm9uTWF0Y2goIiIpKTsKICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7CiAgICAgIGJ1ZmZlci53cml0ZShvbk1hdGNoKG5ldyBfU3RyaW5nTWF0Y2goaSwgdGhpcywgIiIpKSk7CiAgICAgIC8vIFNwZWNpYWwgY2FzZSB0byBhdm9pZCBzcGxpdHRpbmcgYSBzdXJyb2dhdGUgcGFpci4KICAgICAgaW50IGNvZGUgPSB0aGlzLmNvZGVVbml0QXQoaSk7CiAgICAgIGlmICgoY29kZSAmIH4weDNGRikgPT0gMHhEODAwICYmIGxlbmd0aCA+IGkgKyAxKSB7CiAgICAgICAgLy8gTGVhZGluZyBzdXJyb2dhdGU7CiAgICAgICAgY29kZSA9IHRoaXMuY29kZVVuaXRBdChpICsgMSk7CiAgICAgICAgaWYgKChjb2RlICYgfjB4M0ZGKSA9PSAweERDMDApIHsKICAgICAgICAgIC8vIE1hdGNoaW5nIHRyYWlsaW5nIHN1cnJvZ2F0ZS4KICAgICAgICAgIGJ1ZmZlci53cml0ZShvbk5vbk1hdGNoKHRoaXMuc3Vic3RyaW5nKGksIGkgKyAyKSkpOwogICAgICAgICAgaSArPSAyOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGJ1ZmZlci53cml0ZShvbk5vbk1hdGNoKHRoaXNbaV0pKTsKICAgICAgaSsrOwogICAgfQogICAgYnVmZmVyLndyaXRlKG9uTWF0Y2gobmV3IF9TdHJpbmdNYXRjaChpLCB0aGlzLCAiIikpKTsKICAgIGJ1ZmZlci53cml0ZShvbk5vbk1hdGNoKCIiKSk7CiAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgfQoKICBTdHJpbmcgc3BsaXRNYXBKb2luKFBhdHRlcm4gcGF0dGVybiwKICAgICAge1N0cmluZyBvbk1hdGNoKE1hdGNoIG1hdGNoKSwgU3RyaW5nIG9uTm9uTWF0Y2goU3RyaW5nIG5vbk1hdGNoKX0pIHsKICAgIGlmIChwYXR0ZXJuIGlzISBQYXR0ZXJuKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCIke3BhdHRlcm59IGlzIG5vdCBhIFBhdHRlcm4iKTsKICAgIH0KICAgIG9uTWF0Y2ggPz89IF9tYXRjaFN0cmluZzsKICAgIG9uTm9uTWF0Y2ggPz89IF9zdHJpbmdJZGVudGl0eTsKICAgIGlmIChwYXR0ZXJuIGlzIFN0cmluZykgewogICAgICBTdHJpbmcgc3RyaW5nUGF0dGVybiA9IHBhdHRlcm47CiAgICAgIGlmIChzdHJpbmdQYXR0ZXJuLmlzRW1wdHkpIHsKICAgICAgICByZXR1cm4gX3NwbGl0TWFwSm9pbkVtcHR5U3RyaW5nKG9uTWF0Y2gsIG9uTm9uTWF0Y2gpOwogICAgICB9CiAgICB9CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgaW50IHN0YXJ0SW5kZXggPSAwOwogICAgZm9yIChNYXRjaCBtYXRjaCBpbiBwYXR0ZXJuLmFsbE1hdGNoZXModGhpcykpIHsKICAgICAgYnVmZmVyLndyaXRlKG9uTm9uTWF0Y2godGhpcy5zdWJzdHJpbmcoc3RhcnRJbmRleCwgbWF0Y2guc3RhcnQpKSk7CiAgICAgIGJ1ZmZlci53cml0ZShvbk1hdGNoKG1hdGNoKS50b1N0cmluZygpKTsKICAgICAgc3RhcnRJbmRleCA9IG1hdGNoLmVuZDsKICAgIH0KICAgIGJ1ZmZlci53cml0ZShvbk5vbk1hdGNoKHRoaXMuc3Vic3RyaW5nKHN0YXJ0SW5kZXgpKSk7CiAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgfQoKICAvLyBDb252ZXJ0IHNpbmdsZSBvYmplY3QgdG8gc3RyaW5nLgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQogIHN0YXRpYyBTdHJpbmcgX2ludGVycG9sYXRlU2luZ2xlKE9iamVjdCBvKSB7CiAgICBpZiAobyBpcyBTdHJpbmcpIHJldHVybiBvOwogICAgZmluYWwgcyA9IG8udG9TdHJpbmcoKTsKICAgIGlmIChzIGlzISBTdHJpbmcpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iocyk7CiAgICB9CiAgICByZXR1cm4gczsKICB9CgogIC8qKgogICAqIENvbnZlcnQgYWxsIG9iamVjdHMgaW4gW3ZhbHVlc10gdG8gc3RyaW5ncyBhbmQgY29uY2F0IHRoZW0KICAgKiBpbnRvIGEgcmVzdWx0IHN0cmluZy4KICAgKiBNb2RpZmllcyB0aGUgaW5wdXQgbGlzdCBpZiBpdCBjb250YWlucyBub24tYFN0cmluZ2AgdmFsdWVzLgogICAqLwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQogIHN0YXRpYyBTdHJpbmcgX2ludGVycG9sYXRlKGZpbmFsIExpc3QgdmFsdWVzKSB7CiAgICBmaW5hbCBudW1WYWx1ZXMgPSB2YWx1ZXMubGVuZ3RoOwogICAgaW50IHRvdGFsTGVuZ3RoID0gMDsKICAgIGludCBpID0gMDsKICAgIHdoaWxlIChpIDwgbnVtVmFsdWVzKSB7CiAgICAgIGZpbmFsIGUgPSB2YWx1ZXNbaV07CiAgICAgIGZpbmFsIHMgPSBlLnRvU3RyaW5nKCk7CiAgICAgIHZhbHVlc1tpXSA9IHM7CiAgICAgIGlmIChDbGFzc0lELmdldElEKHMpID09IENsYXNzSUQuY2lkT25lQnl0ZVN0cmluZykgewogICAgICAgIHRvdGFsTGVuZ3RoICs9IHMubGVuZ3RoOwogICAgICAgIGkrKzsKICAgICAgfSBlbHNlIGlmIChzIGlzISBTdHJpbmcpIHsKICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBIYW5kbGUgcmVtYWluaW5nIGVsZW1lbnRzIHdpdGhvdXQgY2hlY2tpbmcgZm9yIG9uZS1ieXRlLW5lc3MuCiAgICAgICAgd2hpbGUgKCsraSA8IG51bVZhbHVlcykgewogICAgICAgICAgZmluYWwgZSA9IHZhbHVlc1tpXTsKICAgICAgICAgIGZpbmFsIHMgPSBlLnRvU3RyaW5nKCk7CiAgICAgICAgICB2YWx1ZXNbaV0gPSBzOwogICAgICAgICAgaWYgKHMgaXMhIFN0cmluZykgewogICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9jb25jYXRSYW5nZU5hdGl2ZSh2YWx1ZXMsIDAsIG51bVZhbHVlcyk7CiAgICAgIH0KICAgIH0KICAgIC8vIEFsbCBzdHJpbmdzIHdlcmUgb25lLWJ5dGUgc3RyaW5ncy4KICAgIHJldHVybiBfT25lQnl0ZVN0cmluZy5fY29uY2F0QWxsKHZhbHVlcywgdG90YWxMZW5ndGgpOwogIH0KCiAgSXRlcmFibGU8TWF0Y2g+IGFsbE1hdGNoZXMoU3RyaW5nIHN0cmluZywgW2ludCBzdGFydCA9IDBdKSB7CiAgICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID4gc3RyaW5nLmxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShzdGFydCwgMCwgc3RyaW5nLmxlbmd0aCwgInN0YXJ0Iik7CiAgICB9CiAgICByZXR1cm4gbmV3IF9TdHJpbmdBbGxNYXRjaGVzSXRlcmFibGUoc3RyaW5nLCB0aGlzLCBzdGFydCk7CiAgfQoKICBNYXRjaCBtYXRjaEFzUHJlZml4KFN0cmluZyBzdHJpbmcsIFtpbnQgc3RhcnQgPSAwXSkgewogICAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+IHN0cmluZy5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2Uoc3RhcnQsIDAsIHN0cmluZy5sZW5ndGgpOwogICAgfQogICAgaWYgKHN0YXJ0ICsgdGhpcy5sZW5ndGggPiBzdHJpbmcubGVuZ3RoKSByZXR1cm4gbnVsbDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoc3RyaW5nLmNvZGVVbml0QXQoc3RhcnQgKyBpKSAhPSB0aGlzLmNvZGVVbml0QXQoaSkpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBfU3RyaW5nTWF0Y2goc3RhcnQsIHN0cmluZywgdGhpcyk7CiAgfQoKICBMaXN0PFN0cmluZz4gc3BsaXQoUGF0dGVybiBwYXR0ZXJuKSB7CiAgICBpZiAoKHBhdHRlcm4gaXMgU3RyaW5nKSAmJiBwYXR0ZXJuLmlzRW1wdHkpIHsKICAgICAgTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBMaXN0PFN0cmluZz4odGhpcy5sZW5ndGgpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHsKICAgICAgICByZXN1bHRbaV0gPSB0aGlzW2ldOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBJdGVyYXRvciBpdGVyYXRvciA9IHBhdHRlcm4uYWxsTWF0Y2hlcyh0aGlzKS5pdGVyYXRvcjsKICAgIGlmIChsZW5ndGggPT0gMCAmJiBpdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgIC8vIEEgbWF0Y2hlZCBlbXB0eSBzdHJpbmcgaW5wdXQgcmV0dXJucyB0aGUgZW1wdHkgbGlzdC4KICAgICAgcmV0dXJuIDxTdHJpbmc+W107CiAgICB9CiAgICBMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IExpc3Q8U3RyaW5nPigpOwogICAgaW50IHN0YXJ0SW5kZXggPSAwOwogICAgaW50IHByZXZpb3VzSW5kZXggPSAwOwogICAgLy8gJ3BhdHRlcm4nIG1heSBub3QgYmUgaW1wbGVtZW50ZWQgY29ycmVjdGx5IGFuZCB0aGVyZWZvcmUgd2UgY2Fubm90CiAgICAvLyBjYWxsIF9zdWJzdHJpbmdVbmhjaGVja2VkIHVubGVzcyBpdCBpcyBhIHRydXN0d29ydGh5IHR5cGUgKGUuZy4gU3RyaW5nKS4KICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmIChzdGFydEluZGV4ID09IGxlbmd0aCB8fCAhaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICAgIHJlc3VsdC5hZGQodGhpcy5zdWJzdHJpbmcocHJldmlvdXNJbmRleCwgbGVuZ3RoKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgTWF0Y2ggbWF0Y2ggPSBpdGVyYXRvci5jdXJyZW50OwogICAgICBpZiAobWF0Y2guc3RhcnQgPT0gbGVuZ3RoKSB7CiAgICAgICAgcmVzdWx0LmFkZCh0aGlzLnN1YnN0cmluZyhwcmV2aW91c0luZGV4LCBsZW5ndGgpKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpbnQgZW5kSW5kZXggPSBtYXRjaC5lbmQ7CiAgICAgIGlmIChzdGFydEluZGV4ID09IGVuZEluZGV4ICYmIGVuZEluZGV4ID09IHByZXZpb3VzSW5kZXgpIHsKICAgICAgICArK3N0YXJ0SW5kZXg7IC8vIGVtcHR5IG1hdGNoLCBhZHZhbmNlIGFuZCByZXN0YXJ0CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgcmVzdWx0LmFkZCh0aGlzLnN1YnN0cmluZyhwcmV2aW91c0luZGV4LCBtYXRjaC5zdGFydCkpOwogICAgICBzdGFydEluZGV4ID0gcHJldmlvdXNJbmRleCA9IGVuZEluZGV4OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIExpc3Q8aW50PiBnZXQgY29kZVVuaXRzID0+IG5ldyBDb2RlVW5pdHModGhpcyk7CgogIFJ1bmVzIGdldCBydW5lcyA9PiBuZXcgUnVuZXModGhpcyk7CgogIFN0cmluZyB0b1VwcGVyQ2FzZSgpIG5hdGl2ZSAiU3RyaW5nX3RvVXBwZXJDYXNlIjsKCiAgU3RyaW5nIHRvTG93ZXJDYXNlKCkgbmF0aXZlICJTdHJpbmdfdG9Mb3dlckNhc2UiOwoKICAvLyBDb25jYXRlbmF0ZSBbJ3N0YXJ0JywgJ2VuZCdbIGVsZW1lbnRzIG9mICdzdHJpbmdzJy4KICBzdGF0aWMgU3RyaW5nIF9jb25jYXRSYW5nZShMaXN0PFN0cmluZz4gc3RyaW5ncywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBpZiAoKGVuZCAtIHN0YXJ0KSA9PSAxKSB7CiAgICAgIHJldHVybiBzdHJpbmdzW3N0YXJ0XTsKICAgIH0KICAgIHJldHVybiBfY29uY2F0UmFuZ2VOYXRpdmUoc3RyaW5ncywgc3RhcnQsIGVuZCk7CiAgfQoKICAvLyBDYWxsIHRoaXMgbWV0aG9kIGlmIGFsbCBlbGVtZW50cyBvZiBbc3RyaW5nc10gYXJlIGtub3duIHRvIGJlIHN0cmluZ3MKICAvLyBidXQgbm90IGFsbCBhcmUga25vd24gdG8gYmUgT25lQnl0ZVN0cmluZyhzKS4KICBzdGF0aWMgU3RyaW5nIF9jb25jYXRSYW5nZU5hdGl2ZShMaXN0IHN0cmluZ3MsIGludCBzdGFydCwgaW50IGVuZCkKICAgICAgbmF0aXZlICJTdHJpbmdfY29uY2F0UmFuZ2UiOwp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9PbmVCeXRlU3RyaW5nIGV4dGVuZHMgX1N0cmluZ0Jhc2UgewogIGZhY3RvcnkgX09uZUJ5dGVTdHJpbmcuX3VuaW5zdGFudGlhYmxlKCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIl9PbmVCeXRlU3RyaW5nIGNhbiBvbmx5IGJlIGFsbG9jYXRlZCBieSB0aGUgVk0iKTsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgZ2V0IGhhc2hDb2RlIG5hdGl2ZSAiU3RyaW5nX2dldEhhc2hDb2RlIjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBjb2RlVW5pdEF0KGludCBpbmRleCkgbmF0aXZlICJTdHJpbmdfY29kZVVuaXRBdCI7CgogIGJvb2wgX2lzV2hpdGVzcGFjZShpbnQgY29kZVVuaXQpIHsKICAgIHJldHVybiBfU3RyaW5nQmFzZS5faXNPbmVCeXRlV2hpdGVzcGFjZShjb2RlVW5pdCk7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpIHsKICAgIHJldHVybiBzdXBlciA9PSBvdGhlcjsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX09uZUJ5dGVTdHJpbmcpCiAgU3RyaW5nIF9zdWJzdHJpbmdVbmNoZWNrZWROYXRpdmUoaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkKICAgICAgbmF0aXZlICJPbmVCeXRlU3RyaW5nX3N1YnN0cmluZ1VuY2hlY2tlZCI7CgogIExpc3Q8U3RyaW5nPiBfc3BsaXRXaXRoQ2hhckNvZGUoaW50IGNoYXJDb2RlKQogICAgICBuYXRpdmUgIk9uZUJ5dGVTdHJpbmdfc3BsaXRXaXRoQ2hhckNvZGUiOwoKICBMaXN0PFN0cmluZz4gc3BsaXQoUGF0dGVybiBwYXR0ZXJuKSB7CiAgICAvLyBUT0RPKHZlZ29yb3YpIGludmVzdGlnYXRlIGlmIHRoaXMgY2FuIGJlIHJld3JpdHRlbiBhcyBgaXMgX09uZUJ5dGVTdHJpbmdgCiAgICAvLyBjaGVjayB3aXRob3V0IHBlcmZvcm1hbmNlIHBlbmFsdHkuIEZyb250LWVuZCB3b3VsZCB0aGVuIHByb21vdGUKICAgIC8vIHBhdHRlcm4gdmFyaWFibGUgdG8gX09uZUJ5dGVTdHJpbmcuCiAgICBpZiAoQ2xhc3NJRC5nZXRJRChwYXR0ZXJuKSA9PSBDbGFzc0lELmNpZE9uZUJ5dGVTdHJpbmcpIHsKICAgICAgZmluYWwgU3RyaW5nIHBhdHRlcm5Bc1N0cmluZyA9IHBhdHRlcm47CiAgICAgIGlmIChwYXR0ZXJuQXNTdHJpbmcubGVuZ3RoID09IDEpIHsKICAgICAgICByZXR1cm4gX3NwbGl0V2l0aENoYXJDb2RlKHBhdHRlcm5Bc1N0cmluZy5jb2RlVW5pdEF0KDApKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN1cGVyLnNwbGl0KHBhdHRlcm4pOwogIH0KCiAgLy8gQWxsIGVsZW1lbnQgb2YgJ3N0cmluZ3MnIG11c3QgYmUgT25lQnl0ZVN0cmluZ3MuCiAgc3RhdGljIF9jb25jYXRBbGwoTGlzdCBzdHJpbmdzLCBpbnQgdG90YWxMZW5ndGgpIHsKICAgIGlmICh0b3RhbExlbmd0aCA+IDEyOCkgewogICAgICAvLyBOYXRpdmUgaXMgcXVpY2tlci4KICAgICAgcmV0dXJuIF9TdHJpbmdCYXNlLl9jb25jYXRSYW5nZU5hdGl2ZShzdHJpbmdzLCAwLCBzdHJpbmdzLmxlbmd0aCk7CiAgICB9CiAgICBmaW5hbCByZXMgPSBfT25lQnl0ZVN0cmluZy5fYWxsb2NhdGUodG90YWxMZW5ndGgpOwogICAgZmluYWwgc3RyaW5nc0xlbmd0aCA9IHN0cmluZ3MubGVuZ3RoOwogICAgaW50IHJJeCA9IDA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ3NMZW5ndGg7IGkrKykgewogICAgICBmaW5hbCBfT25lQnl0ZVN0cmluZyBlID0gc3RyaW5nc1tpXTsKICAgICAgZmluYWwgZUxlbmd0aCA9IGUubGVuZ3RoOwogICAgICBmb3IgKGludCBzID0gMDsgcyA8IGVMZW5ndGg7IHMrKykgewogICAgICAgIHJlcy5fc2V0QXQockl4KyssIGUuY29kZVVuaXRBdChzKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXM7CiAgfQoKICBpbnQgaW5kZXhPZihQYXR0ZXJuIHBhdHRlcm4sIFtpbnQgc3RhcnQgPSAwXSkgewogICAgLy8gU3BlY2lhbGl6ZSBmb3Igc2luZ2xlIGNoYXJhY3RlciBwYXR0ZXJuLgogICAgZmluYWwgcENpZCA9IENsYXNzSUQuZ2V0SUQocGF0dGVybik7CiAgICBpZiAoKHBDaWQgPT0gQ2xhc3NJRC5jaWRPbmVCeXRlU3RyaW5nKSB8fAogICAgICAgIChwQ2lkID09IENsYXNzSUQuY2lkVHdvQnl0ZVN0cmluZykgfHwKICAgICAgICAocENpZCA9PSBDbGFzc0lELmNpZEV4dGVybmFsT25lQnl0ZVN0cmluZykpIHsKICAgICAgZmluYWwgU3RyaW5nIHBhdHRlcm5Bc1N0cmluZyA9IHBhdHRlcm47CiAgICAgIGZpbmFsIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgICBpZiAoKHBhdHRlcm5Bc1N0cmluZy5sZW5ndGggPT0gMSkgJiYgKHN0YXJ0ID49IDApICYmIChzdGFydCA8IGxlbikpIHsKICAgICAgICBmaW5hbCBwYXR0ZXJuQ3UwID0gcGF0dGVybkFzU3RyaW5nLmNvZGVVbml0QXQoMCk7CiAgICAgICAgaWYgKHBhdHRlcm5DdTAgPiAweEZGKSB7CiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICBpZiAodGhpcy5jb2RlVW5pdEF0KGkpID09IHBhdHRlcm5DdTApIHsKICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN1cGVyLmluZGV4T2YocGF0dGVybiwgc3RhcnQpOwogIH0KCiAgYm9vbCBjb250YWlucyhQYXR0ZXJuIHBhdHRlcm4sIFtpbnQgc3RhcnQgPSAwXSkgewogICAgZmluYWwgcENpZCA9IENsYXNzSUQuZ2V0SUQocGF0dGVybik7CiAgICBpZiAoKHBDaWQgPT0gQ2xhc3NJRC5jaWRPbmVCeXRlU3RyaW5nKSB8fAogICAgICAgIChwQ2lkID09IENsYXNzSUQuY2lkVHdvQnl0ZVN0cmluZykgfHwKICAgICAgICAocENpZCA9PSBDbGFzc0lELmNpZEV4dGVybmFsT25lQnl0ZVN0cmluZykpIHsKICAgICAgZmluYWwgU3RyaW5nIHBhdHRlcm5Bc1N0cmluZyA9IHBhdHRlcm47CiAgICAgIGZpbmFsIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgICBpZiAoKHBhdHRlcm5Bc1N0cmluZy5sZW5ndGggPT0gMSkgJiYgKHN0YXJ0ID49IDApICYmIChzdGFydCA8IGxlbikpIHsKICAgICAgICBmaW5hbCBwYXR0ZXJuQ3UwID0gcGF0dGVybkFzU3RyaW5nLmNvZGVVbml0QXQoMCk7CiAgICAgICAgaWYgKHBhdHRlcm5DdTAgPiAweEZGKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICBpZiAodGhpcy5jb2RlVW5pdEF0KGkpID09IHBhdHRlcm5DdTApIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN1cGVyLmNvbnRhaW5zKHBhdHRlcm4sIHN0YXJ0KTsKICB9CgogIFN0cmluZyBvcGVyYXRvciAqKGludCB0aW1lcykgewogICAgaWYgKHRpbWVzIDw9IDApIHJldHVybiAiIjsKICAgIGlmICh0aW1lcyA9PSAxKSByZXR1cm4gdGhpczsKICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGlmICh0aGlzLmlzRW1wdHkpIHJldHVybiB0aGlzOyAvLyBEb24ndCBjbG9uZSBlbXB0eSBzdHJpbmcuCiAgICBfT25lQnl0ZVN0cmluZyByZXN1bHQgPSBfT25lQnl0ZVN0cmluZy5fYWxsb2NhdGUobGVuZ3RoICogdGltZXMpOwogICAgaW50IGluZGV4ID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGltZXM7IGkrKykgewogICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7CiAgICAgICAgcmVzdWx0Ll9zZXRBdChpbmRleCsrLCB0aGlzLmNvZGVVbml0QXQoaikpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgU3RyaW5nIHBhZExlZnQoaW50IHdpZHRoLCBbU3RyaW5nIHBhZGRpbmcgPSAnICddKSB7CiAgICBpbnQgcGFkQ2lkID0gQ2xhc3NJRC5nZXRJRChwYWRkaW5nKTsKICAgIGlmICgocGFkQ2lkICE9IENsYXNzSUQuY2lkT25lQnl0ZVN0cmluZykgJiYKICAgICAgICAocGFkQ2lkICE9IENsYXNzSUQuY2lkRXh0ZXJuYWxPbmVCeXRlU3RyaW5nKSkgewogICAgICByZXR1cm4gc3VwZXIucGFkTGVmdCh3aWR0aCwgcGFkZGluZyk7CiAgICB9CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBpbnQgZGVsdGEgPSB3aWR0aCAtIGxlbmd0aDsKICAgIGlmIChkZWx0YSA8PSAwKSByZXR1cm4gdGhpczsKICAgIGludCBwYWRMZW5ndGggPSBwYWRkaW5nLmxlbmd0aDsKICAgIGludCByZXN1bHRMZW5ndGggPSBwYWRMZW5ndGggKiBkZWx0YSArIGxlbmd0aDsKICAgIF9PbmVCeXRlU3RyaW5nIHJlc3VsdCA9IF9PbmVCeXRlU3RyaW5nLl9hbGxvY2F0ZShyZXN1bHRMZW5ndGgpOwogICAgaW50IGluZGV4ID0gMDsKICAgIGlmIChwYWRMZW5ndGggPT0gMSkgewogICAgICBpbnQgcGFkQ2hhciA9IHBhZGRpbmcuY29kZVVuaXRBdCgwKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YTsgaSsrKSB7CiAgICAgICAgcmVzdWx0Ll9zZXRBdChpbmRleCsrLCBwYWRDaGFyKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YTsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYWRMZW5ndGg7IGorKykgewogICAgICAgICAgcmVzdWx0Ll9zZXRBdChpbmRleCsrLCBwYWRkaW5nLmNvZGVVbml0QXQoaikpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICByZXN1bHQuX3NldEF0KGluZGV4KyssIHRoaXMuY29kZVVuaXRBdChpKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgU3RyaW5nIHBhZFJpZ2h0KGludCB3aWR0aCwgW1N0cmluZyBwYWRkaW5nID0gJyAnXSkgewogICAgaW50IHBhZENpZCA9IENsYXNzSUQuZ2V0SUQocGFkZGluZyk7CiAgICBpZiAoKHBhZENpZCAhPSBDbGFzc0lELmNpZE9uZUJ5dGVTdHJpbmcpICYmCiAgICAgICAgKHBhZENpZCAhPSBDbGFzc0lELmNpZEV4dGVybmFsT25lQnl0ZVN0cmluZykpIHsKICAgICAgcmV0dXJuIHN1cGVyLnBhZFJpZ2h0KHdpZHRoLCBwYWRkaW5nKTsKICAgIH0KICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGludCBkZWx0YSA9IHdpZHRoIC0gbGVuZ3RoOwogICAgaWYgKGRlbHRhIDw9IDApIHJldHVybiB0aGlzOwogICAgaW50IHBhZExlbmd0aCA9IHBhZGRpbmcubGVuZ3RoOwogICAgaW50IHJlc3VsdExlbmd0aCA9IGxlbmd0aCArIHBhZExlbmd0aCAqIGRlbHRhOwogICAgX09uZUJ5dGVTdHJpbmcgcmVzdWx0ID0gX09uZUJ5dGVTdHJpbmcuX2FsbG9jYXRlKHJlc3VsdExlbmd0aCk7CiAgICBpbnQgaW5kZXggPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICByZXN1bHQuX3NldEF0KGluZGV4KyssIHRoaXMuY29kZVVuaXRBdChpKSk7CiAgICB9CiAgICBpZiAocGFkTGVuZ3RoID09IDEpIHsKICAgICAgaW50IHBhZENoYXIgPSBwYWRkaW5nLmNvZGVVbml0QXQoMCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGE7IGkrKykgewogICAgICAgIHJlc3VsdC5fc2V0QXQoaW5kZXgrKywgcGFkQ2hhcik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGE7IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGFkTGVuZ3RoOyBqKyspIHsKICAgICAgICAgIHJlc3VsdC5fc2V0QXQoaW5kZXgrKywgcGFkZGluZy5jb2RlVW5pdEF0KGopKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLyBMb3dlci1jYXNlIGNvbnZlcnNpb24gdGFibGUgZm9yIExhdGluLTEgYXMgc3RyaW5nLgogIC8vIFVwcGVyLWNhc2UgcmFuZ2VzOiAweDQxLTB4NWEgKCdBJyAtICdaJyksIDB4YzAtMHhkNiwgMHhkOC0weGRlLgogIC8vIENvbnZlcnNpb24gdG8gbG93ZXIgY2FzZSBwZXJmb3JtZWQgYnkgYWRkaW5nIDB4MjAuCiAgc3RhdGljIGNvbnN0IF9MQ19UQUJMRSA9CiAgICAgICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgogICAgICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTdceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIKICAgICAgIlx4MjBceDIxXHgyMlx4MjNceDI0XHgyNVx4MjZceDI3XHgyOFx4MjlceDJhXHgyYlx4MmNceDJkXHgyZVx4MmYiCiAgICAgICJceDMwXHgzMVx4MzJceDMzXHgzNFx4MzVceDM2XHgzN1x4MzhceDM5XHgzYVx4M2JceDNjXHgzZFx4M2VceDNmIgogICAgICAiXHg0MFx4NjFceDYyXHg2M1x4NjRceDY1XHg2Nlx4NjdceDY4XHg2OVx4NmFceDZiXHg2Y1x4NmRceDZlXHg2ZiIKICAgICAgIlx4NzBceDcxXHg3Mlx4NzNceDc0XHg3NVx4NzZceDc3XHg3OFx4NzlceDdhXHg1Ylx4NWNceDVkXHg1ZVx4NWYiCiAgICAgICJceDYwXHg2MVx4NjJceDYzXHg2NFx4NjVceDY2XHg2N1x4NjhceDY5XHg2YVx4NmJceDZjXHg2ZFx4NmVceDZmIgogICAgICAiXHg3MFx4NzFceDcyXHg3M1x4NzRceDc1XHg3Nlx4NzdceDc4XHg3OVx4N2FceDdiXHg3Y1x4N2RceDdlXHg3ZiIKICAgICAgIlx4ODBceDgxXHg4Mlx4ODNceDg0XHg4NVx4ODZceDg3XHg4OFx4ODlceDhhXHg4Ylx4OGNceDhkXHg4ZVx4OGYiCiAgICAgICJceDkwXHg5MVx4OTJceDkzXHg5NFx4OTVceDk2XHg5N1x4OThceDk5XHg5YVx4OWJceDljXHg5ZFx4OWVceDlmIgogICAgICAiXHhhMFx4YTFceGEyXHhhM1x4YTRceGE1XHhhNlx4YTdceGE4XHhhOVx4YWFceGFiXHhhY1x4YWRceGFlXHhhZiIKICAgICAgIlx4YjBceGIxXHhiMlx4YjNceGI0XHhiNVx4YjZceGI3XHhiOFx4YjlceGJhXHhiYlx4YmNceGJkXHhiZVx4YmYiCiAgICAgICJceGUwXHhlMVx4ZTJceGUzXHhlNFx4ZTVceGU2XHhlN1x4ZThceGU5XHhlYVx4ZWJceGVjXHhlZFx4ZWVceGVmIgogICAgICAiXHhmMFx4ZjFceGYyXHhmM1x4ZjRceGY1XHhmNlx4ZDdceGY4XHhmOVx4ZmFceGZiXHhmY1x4ZmRceGZlXHhkZiIKICAgICAgIlx4ZTBceGUxXHhlMlx4ZTNceGU0XHhlNVx4ZTZceGU3XHhlOFx4ZTlceGVhXHhlYlx4ZWNceGVkXHhlZVx4ZWYiCiAgICAgICJceGYwXHhmMVx4ZjJceGYzXHhmNFx4ZjVceGY2XHhmN1x4ZjhceGY5XHhmYVx4ZmJceGZjXHhmZFx4ZmVceGZmIjsKCiAgLy8gVXBwZXItY2FzZSBjb252ZXJzaW9uIHRhYmxlIGZvciBMYXRpbi0xIGFzIHN0cmluZy4KICAvLyBMb3dlci1jYXNlIHJhbmdlczogMHg2MS0weDdhICgnYScgLSAneicpLCAweGUwLTB4ZmYuCiAgLy8gVGhlIGNoYXJhY3RlcnMgMHhiNSAowrUpIGFuZCAweGZmICjDvykgaGF2ZSB1cHBlciBjYXNlIHZhcmlhbnRzCiAgLy8gdGhhdCBhcmUgbm90IExhdGluLTEuIFRoZXNlIGFyZSBib3RoIG1hcmtlZCBhcyAweDAwIGluIHRoZSB0YWJsZS4KICAvLyBUaGUgR2VybWFuICJzaGFycCBzIiBceGRmICjDnykgc2hvdWxkIGJlIGNvbnZlcnRlZCBpbnRvIHR3byBjaGFyYWN0ZXJzIChTUyksCiAgLy8gYW5kIGlzIGFsc28gbWFya2VkIHdpdGggMHgwMC4KICAvLyBDb252ZXJzaW9uIHRvIGxvd2VyIGNhc2UgcGVyZm9ybWVkIGJ5IHN1YnRyYWN0aW5nIDB4MjAuCiAgc3RhdGljIGNvbnN0IF9VQ19UQUJMRSA9CiAgICAgICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgogICAgICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTdceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIKICAgICAgIlx4MjBceDIxXHgyMlx4MjNceDI0XHgyNVx4MjZceDI3XHgyOFx4MjlceDJhXHgyYlx4MmNceDJkXHgyZVx4MmYiCiAgICAgICJceDMwXHgzMVx4MzJceDMzXHgzNFx4MzVceDM2XHgzN1x4MzhceDM5XHgzYVx4M2JceDNjXHgzZFx4M2VceDNmIgogICAgICAiXHg0MFx4NDFceDQyXHg0M1x4NDRceDQ1XHg0Nlx4NDdceDQ4XHg0OVx4NGFceDRiXHg0Y1x4NGRceDRlXHg0ZiIKICAgICAgIlx4NTBceDUxXHg1Mlx4NTNceDU0XHg1NVx4NTZceDU3XHg1OFx4NTlceDVhXHg1Ylx4NWNceDVkXHg1ZVx4NWYiCiAgICAgICJceDYwXHg0MVx4NDJceDQzXHg0NFx4NDVceDQ2XHg0N1x4NDhceDQ5XHg0YVx4NGJceDRjXHg0ZFx4NGVceDRmIgogICAgICAiXHg1MFx4NTFceDUyXHg1M1x4NTRceDU1XHg1Nlx4NTdceDU4XHg1OVx4NWFceDdiXHg3Y1x4N2RceDdlXHg3ZiIKICAgICAgIlx4ODBceDgxXHg4Mlx4ODNceDg0XHg4NVx4ODZceDg3XHg4OFx4ODlceDhhXHg4Ylx4OGNceDhkXHg4ZVx4OGYiCiAgICAgICJceDkwXHg5MVx4OTJceDkzXHg5NFx4OTVceDk2XHg5N1x4OThceDk5XHg5YVx4OWJceDljXHg5ZFx4OWVceDlmIgogICAgICAiXHhhMFx4YTFceGEyXHhhM1x4YTRceGE1XHhhNlx4YTdceGE4XHhhOVx4YWFceGFiXHhhY1x4YWRceGFlXHhhZiIKICAgICAgIlx4YjBceGIxXHhiMlx4YjNceGI0XHgwMFx4YjZceGI3XHhiOFx4YjlceGJhXHhiYlx4YmNceGJkXHhiZVx4YmYiCiAgICAgICJceGMwXHhjMVx4YzJceGMzXHhjNFx4YzVceGM2XHhjN1x4YzhceGM5XHhjYVx4Y2JceGNjXHhjZFx4Y2VceGNmIgogICAgICAiXHhkMFx4ZDFceGQyXHhkM1x4ZDRceGQ1XHhkNlx4ZDdceGQ4XHhkOVx4ZGFceGRiXHhkY1x4ZGRceGRlXHgwMCIKICAgICAgIlx4YzBceGMxXHhjMlx4YzNceGM0XHhjNVx4YzZceGM3XHhjOFx4YzlceGNhXHhjYlx4Y2NceGNkXHhjZVx4Y2YiCiAgICAgICJceGQwXHhkMVx4ZDJceGQzXHhkNFx4ZDVceGQ2XHhmN1x4ZDhceGQ5XHhkYVx4ZGJceGRjXHhkZFx4ZGVceDAwIjsKCiAgU3RyaW5nIHRvTG93ZXJDYXNlKCkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGZpbmFsIGMgPSB0aGlzLmNvZGVVbml0QXQoaSk7CiAgICAgIGlmIChjID09IF9MQ19UQUJMRS5jb2RlVW5pdEF0KGMpKSBjb250aW51ZTsKICAgICAgLy8gVXBwZXItY2FzZSBjaGFyYWN0ZXIgZm91bmQuCiAgICAgIGZpbmFsIHJlc3VsdCA9IF9hbGxvY2F0ZSh0aGlzLmxlbmd0aCk7CiAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSB7CiAgICAgICAgcmVzdWx0Ll9zZXRBdChqLCB0aGlzLmNvZGVVbml0QXQoaikpOwogICAgICB9CiAgICAgIGZvciAoaW50IGogPSBpOyBqIDwgdGhpcy5sZW5ndGg7IGorKykgewogICAgICAgIHJlc3VsdC5fc2V0QXQoaiwgX0xDX1RBQkxFLmNvZGVVbml0QXQodGhpcy5jb2RlVW5pdEF0KGopKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KCiAgU3RyaW5nIHRvVXBwZXJDYXNlKCkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGZpbmFsIGMgPSB0aGlzLmNvZGVVbml0QXQoaSk7CiAgICAgIC8vIENvbnRpbnVlIGxvb3AgaWYgY2hhcmFjdGVyIGlzIHVuY2hhbmdlZCBieSB1cHBlci1jYXNlIGNvbnZlcnNpb24uCiAgICAgIGlmIChjID09IF9VQ19UQUJMRS5jb2RlVW5pdEF0KGMpKSBjb250aW51ZTsKCiAgICAgIC8vIENoZWNrIHJlc3Qgb2Ygc3RyaW5nIGZvciBjaGFyYWN0ZXJzIHRoYXQgZG8gbm90IGNvbnZlcnQgdG8KICAgICAgLy8gc2luZ2xlLWNoYXJhY3RlcnMgaW4gdGhlIExhdGluLTEgcmFuZ2UuCiAgICAgIGZvciAoaW50IGogPSBpOyBqIDwgdGhpcy5sZW5ndGg7IGorKykgewogICAgICAgIGZpbmFsIGMgPSB0aGlzLmNvZGVVbml0QXQoaik7CiAgICAgICAgaWYgKChfVUNfVEFCTEUuY29kZVVuaXRBdChjKSA9PSAweDAwKSAmJiAoYyAhPSAweDAwKSkgewogICAgICAgICAgLy8gV2UgdXNlIHRoZSAweDAwIHZhbHVlIGZvciBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gdGhlIG51bGwgY2hhcmFjdGVyLAogICAgICAgICAgLy8gdGhhdCBkb24ndCBjb252ZXJ0IHRvIGEgc2luZ2xlIExhdGluLTEgY2hhcmFjdGVyIHdoZW4gdXBwZXItY2FzZWQuCiAgICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIGNhbGwgdGhlIGdlbmVyaWMgc3VwZXItY2xhc3MgbWV0aG9kLgogICAgICAgICAgcmV0dXJuIHN1cGVyLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIFNvbWUgbG93ZXItY2FzZSBjaGFyYWN0ZXJzIGZvdW5kLCBidXQgYWxsIHVwcGVyLWNhc2UgdG8gc2luZ2xlIExhdGluLTEKICAgICAgLy8gY2hhcmFjdGVycy4KICAgICAgZmluYWwgcmVzdWx0ID0gX2FsbG9jYXRlKHRoaXMubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKICAgICAgICByZXN1bHQuX3NldEF0KGosIHRoaXMuY29kZVVuaXRBdChqKSk7CiAgICAgIH0KICAgICAgZm9yIChpbnQgaiA9IGk7IGogPCB0aGlzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgcmVzdWx0Ll9zZXRBdChqLCBfVUNfVEFCTEUuY29kZVVuaXRBdCh0aGlzLmNvZGVVbml0QXQoaikpKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQoKICAvLyBBbGxvY2F0ZXMgYSBzdHJpbmcgb2YgZ2l2ZW4gbGVuZ3RoLCBleHBlY3RpbmcgaXRzIGNvbnRlbnQgdG8gYmUKICAvLyBzZXQgdXNpbmcgX3NldEF0LgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX09uZUJ5dGVTdHJpbmcpCiAgc3RhdGljIF9PbmVCeXRlU3RyaW5nIF9hbGxvY2F0ZShpbnQgbGVuZ3RoKSBuYXRpdmUgIk9uZUJ5dGVTdHJpbmdfYWxsb2NhdGUiOwoKICBzdGF0aWMgX09uZUJ5dGVTdHJpbmcgX2FsbG9jYXRlRnJvbU9uZUJ5dGVMaXN0KExpc3Q8aW50PiBsaXN0LCBpbnQgc3RhcnQsCiAgICAgIGludCBlbmQpIG5hdGl2ZSAiT25lQnl0ZVN0cmluZ19hbGxvY2F0ZUZyb21PbmVCeXRlTGlzdCI7CgogIC8vIFRoaXMgaXMgaW50ZXJuYWwgaGVscGVyIG1ldGhvZC4gQ29kZSBwb2ludCB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQKICAvLyBMYXRpbjEgdmFsdWUgKDAuLjB4RkYpLCBpbmRleCBtdXN0IGJlIHZhbGlkLgogIHZvaWQgX3NldEF0KGludCBpbmRleCwgaW50IGNvZGVQb2ludCkgbmF0aXZlICJPbmVCeXRlU3RyaW5nX3NldEF0IjsKCiAgLy8gU2hvdWxkIGJlIG9wdGltaXphYmxlIHRvIGEgbWVtb3J5IG1vdmUuCiAgLy8gQWNjZXB0cyBib3RoIF9PbmVCeXRlU3RyaW5nIGFuZCBfRXh0ZXJuYWxPbmVCeXRlU3RyaW5nIGFzIGFyZ3VtZW50LgogIC8vIFJldHVybnMgaW5kZXggYWZ0ZXIgbGFzdCBjaGFyYWN0ZXIgd3JpdHRlbi4KICBpbnQgX3NldFJhbmdlKGludCBpbmRleCwgU3RyaW5nIG9uZUJ5dGVTdHJpbmcsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgYXNzZXJ0KG9uZUJ5dGVTdHJpbmcuX2lzT25lQnl0ZSk7CiAgICBhc3NlcnQoMCA8PSBzdGFydCk7CiAgICBhc3NlcnQoc3RhcnQgPD0gZW5kKTsKICAgIGFzc2VydChlbmQgPD0gb25lQnl0ZVN0cmluZy5sZW5ndGgpOwogICAgYXNzZXJ0KDAgPD0gaW5kZXgpOwogICAgYXNzZXJ0KGluZGV4ICsgKGVuZCAtIHN0YXJ0KSA8PSBsZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgX3NldEF0KGluZGV4LCBvbmVCeXRlU3RyaW5nLmNvZGVVbml0QXQoaSkpOwogICAgICBpbmRleCArPSAxOwogICAgfQogICAgcmV0dXJuIGluZGV4OwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfVHdvQnl0ZVN0cmluZyBleHRlbmRzIF9TdHJpbmdCYXNlIHsKICBmYWN0b3J5IF9Ud29CeXRlU3RyaW5nLl91bmluc3RhbnRpYWJsZSgpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJfVHdvQnl0ZVN0cmluZyBjYW4gb25seSBiZSBhbGxvY2F0ZWQgYnkgdGhlIFZNIik7CiAgfQoKICBzdGF0aWMgU3RyaW5nIF9hbGxvY2F0ZUZyb21Ud29CeXRlTGlzdChMaXN0PGludD4gbGlzdCwgaW50IHN0YXJ0LCBpbnQgZW5kKQogICAgICBuYXRpdmUgIlR3b0J5dGVTdHJpbmdfYWxsb2NhdGVGcm9tVHdvQnl0ZUxpc3QiOwoKICBib29sIF9pc1doaXRlc3BhY2UoaW50IGNvZGVVbml0KSB7CiAgICByZXR1cm4gX1N0cmluZ0Jhc2UuX2lzVHdvQnl0ZVdoaXRlc3BhY2UoY29kZVVuaXQpOwogIH0KCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBjb2RlVW5pdEF0KGludCBpbmRleCkgbmF0aXZlICJTdHJpbmdfY29kZVVuaXRBdCI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgcmV0dXJuIHN1cGVyID09IG90aGVyOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfRXh0ZXJuYWxPbmVCeXRlU3RyaW5nIGV4dGVuZHMgX1N0cmluZ0Jhc2UgewogIGZhY3RvcnkgX0V4dGVybmFsT25lQnl0ZVN0cmluZy5fdW5pbnN0YW50aWFibGUoKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiX0V4dGVybmFsT25lQnl0ZVN0cmluZyBjYW4gb25seSBiZSBhbGxvY2F0ZWQgYnkgdGhlIFZNIik7CiAgfQoKICBib29sIF9pc1doaXRlc3BhY2UoaW50IGNvZGVVbml0KSB7CiAgICByZXR1cm4gX1N0cmluZ0Jhc2UuX2lzT25lQnl0ZVdoaXRlc3BhY2UoY29kZVVuaXQpOwogIH0KCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBjb2RlVW5pdEF0KGludCBpbmRleCkgbmF0aXZlICJTdHJpbmdfY29kZVVuaXRBdCI7CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSB7CiAgICByZXR1cm4gc3VwZXIgPT0gb3RoZXI7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9FeHRlcm5hbFR3b0J5dGVTdHJpbmcgZXh0ZW5kcyBfU3RyaW5nQmFzZSB7CiAgZmFjdG9yeSBfRXh0ZXJuYWxUd29CeXRlU3RyaW5nLl91bmluc3RhbnRpYWJsZSgpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJfRXh0ZXJuYWxUd29CeXRlU3RyaW5nIGNhbiBvbmx5IGJlIGFsbG9jYXRlZCBieSB0aGUgVk0iKTsKICB9CgogIGJvb2wgX2lzV2hpdGVzcGFjZShpbnQgY29kZVVuaXQpIHsKICAgIHJldHVybiBfU3RyaW5nQmFzZS5faXNUd29CeXRlV2hpdGVzcGFjZShjb2RlVW5pdCk7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IGNvZGVVbml0QXQoaW50IGluZGV4KSBuYXRpdmUgIlN0cmluZ19jb2RlVW5pdEF0IjsKCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpIHsKICAgIHJldHVybiBzdXBlciA9PSBvdGhlcjsKICB9Cn0KCmNsYXNzIF9TdHJpbmdNYXRjaCBpbXBsZW1lbnRzIE1hdGNoIHsKICBjb25zdCBfU3RyaW5nTWF0Y2godGhpcy5zdGFydCwgdGhpcy5pbnB1dCwgdGhpcy5wYXR0ZXJuKTsKCiAgaW50IGdldCBlbmQgPT4gc3RhcnQgKyBwYXR0ZXJuLmxlbmd0aDsKICBTdHJpbmcgb3BlcmF0b3IgW10oaW50IGcpID0+IGdyb3VwKGcpOwogIGludCBnZXQgZ3JvdXBDb3VudCA9PiAwOwoKICBTdHJpbmcgZ3JvdXAoaW50IGdyb3VwKSB7CiAgICBpZiAoZ3JvdXAgIT0gMCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci52YWx1ZShncm91cCk7CiAgICB9CiAgICByZXR1cm4gcGF0dGVybjsKICB9CgogIExpc3Q8U3RyaW5nPiBncm91cHMoTGlzdDxpbnQ+IGdyb3VwcykgewogICAgTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBMaXN0PFN0cmluZz4oKTsKICAgIGZvciAoaW50IGcgaW4gZ3JvdXBzKSB7CiAgICAgIHJlc3VsdC5hZGQoZ3JvdXAoZykpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGZpbmFsIGludCBzdGFydDsKICBmaW5hbCBTdHJpbmcgaW5wdXQ7CiAgZmluYWwgU3RyaW5nIHBhdHRlcm47Cn0KCmNsYXNzIF9TdHJpbmdBbGxNYXRjaGVzSXRlcmFibGUgZXh0ZW5kcyBJdGVyYWJsZTxNYXRjaD4gewogIGZpbmFsIFN0cmluZyBfaW5wdXQ7CiAgZmluYWwgU3RyaW5nIF9wYXR0ZXJuOwogIGZpbmFsIGludCBfaW5kZXg7CgogIF9TdHJpbmdBbGxNYXRjaGVzSXRlcmFibGUodGhpcy5faW5wdXQsIHRoaXMuX3BhdHRlcm4sIHRoaXMuX2luZGV4KTsKCiAgSXRlcmF0b3I8TWF0Y2g+IGdldCBpdGVyYXRvciA9PgogICAgICBuZXcgX1N0cmluZ0FsbE1hdGNoZXNJdGVyYXRvcihfaW5wdXQsIF9wYXR0ZXJuLCBfaW5kZXgpOwoKICBNYXRjaCBnZXQgZmlyc3QgewogICAgaW50IGluZGV4ID0gX2lucHV0LmluZGV4T2YoX3BhdHRlcm4sIF9pbmRleCk7CiAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICByZXR1cm4gbmV3IF9TdHJpbmdNYXRjaChpbmRleCwgX2lucHV0LCBfcGF0dGVybik7CiAgICB9CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9Cn0KCmNsYXNzIF9TdHJpbmdBbGxNYXRjaGVzSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxNYXRjaD4gewogIGZpbmFsIFN0cmluZyBfaW5wdXQ7CiAgZmluYWwgU3RyaW5nIF9wYXR0ZXJuOwogIGludCBfaW5kZXg7CiAgTWF0Y2ggX2N1cnJlbnQ7CgogIF9TdHJpbmdBbGxNYXRjaGVzSXRlcmF0b3IodGhpcy5faW5wdXQsIHRoaXMuX3BhdHRlcm4sIHRoaXMuX2luZGV4KTsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmIChfaW5kZXggKyBfcGF0dGVybi5sZW5ndGggPiBfaW5wdXQubGVuZ3RoKSB7CiAgICAgIF9jdXJyZW50ID0gbnVsbDsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgdmFyIGluZGV4ID0gX2lucHV0LmluZGV4T2YoX3BhdHRlcm4sIF9pbmRleCk7CiAgICBpZiAoaW5kZXggPCAwKSB7CiAgICAgIF9pbmRleCA9IF9pbnB1dC5sZW5ndGggKyAxOwogICAgICBfY3VycmVudCA9IG51bGw7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGludCBlbmQgPSBpbmRleCArIF9wYXR0ZXJuLmxlbmd0aDsKICAgIF9jdXJyZW50ID0gbmV3IF9TdHJpbmdNYXRj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IGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCi8vIFRoZXNlIERhcnQgY2xhc3NlcyBjb3JyZXNwb25kIHRvIHRoZSBWTSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLgoKLy8gRXF1aXZhbGVudCBvZiBSYXdBYnN0cmFjdFR5cGUuCmFic3RyYWN0IGNsYXNzIF9BYnN0cmFjdFR5cGUgaW1wbGVtZW50cyBUeXBlIHsKICBTdHJpbmcgdG9TdHJpbmcoKSBuYXRpdmUgIkFic3RyYWN0VHlwZV90b1N0cmluZyI7Cn0KCi8vIEVxdWl2YWxlbnQgb2YgUmF3VHlwZS4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfVHlwZSBleHRlbmRzIF9BYnN0cmFjdFR5cGUgewogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgZ2V0IGhhc2hDb2RlIG5hdGl2ZSAiVHlwZV9nZXRIYXNoQ29kZSI7Cn0KCi8vIEVxdWl2YWxlbnQgb2YgUmF3VHlwZVJlZi4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfVHlwZVJlZiBleHRlbmRzIF9BYnN0cmFjdFR5cGUge30KCi8vIEVxdWl2YWxlbnQgb2YgUmF3VHlwZVBhcmFtZXRlci4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfVHlwZVBhcmFtZXRlciBleHRlbmRzIF9BYnN0cmFjdFR5cGUge30KHQBOTjwBHgFMASIvNAIBGhokNC4CAR0aKAEjGi4BH2RhcnQ6Y29yZS1wYXRjaC90eXBlX3BhdGNoLmRhcnQyb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi93ZWFrX3Byb3BlcnR5LmRhcnSCkC8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb3JlX3BhdGNoLmRhcnQiOwoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfV2Vha1Byb3BlcnR5IHsKICBmYWN0b3J5IF9XZWFrUHJvcGVydHkoa2V5LCB2YWx1ZSkgPT4gX25ldyhrZXksIHZhbHVlKTsKCiAgZ2V0IGtleSA9PiBfZ2V0S2V5KCk7CiAgZ2V0IHZhbHVlID0+IF9nZXRWYWx1ZSgpOwogIHNldCB2YWx1ZSh2YWx1ZSkgPT4gX3NldFZhbHVlKHZhbHVlKTsKCiAgc3RhdGljIF9XZWFrUHJvcGVydHkgX25ldyhrZXksIHZhbHVlKSBuYXRpdmUgIldlYWtQcm9wZXJ0eV9uZXciOwoKICBfZ2V0S2V5KCkgbmF0aXZlICJXZWFrUHJvcGVydHlfZ2V0S2V5IjsKICBfZ2V0VmFsdWUoKSBuYXRpdmUgIldlYWtQcm9wZXJ0eV9nZXRWYWx1ZSI7CiAgX3NldFZhbHVlKHZhbHVlKSBuYXRpdmUgIldlYWtQcm9wZXJ0eV9zZXRWYWx1ZSI7Cn0KFgBOTjwBHgEaFjkBGBwoAUMBKi4zAgEiZGFydDpjb3JlLXBhdGNoL3dlYWtfcHJvcGVydHkuZGFydDFvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS9hbm5vdGF0aW9ucy5kYXJ0o3MvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogVGhlIGFubm90YXRpb24gYEBEZXByZWNhdGVkKCdtaWdyYXRpb24nKWAgbWFya3MgYSBmZWF0dXJlIGFzIGRlcHJlY2F0ZWQuCiAqCiAqIFRoZSBhbm5vdGF0aW9uIFtkZXByZWNhdGVkXSBpcyBhIHNob3J0aGFuZCBmb3IgZGVwcmVjYXRpbmcgdW50aWwKICogYW4gdW5zcGVjaWZpZWQgIm5leHQgcmVsZWFzZSIgd2l0aG91dCBtaWdyYXRpb24gaW5zdHJ1Y3Rpb25zLgogKgogKiBUaGUgaW50ZW50IG9mIHRoZSBgQERlcHJlY2F0ZWRgIGFubm90YXRpb24gaXMgdG8gaW5mb3JtIHVzZXJzIG9mIGEgZmVhdHVyZQogKiB0aGF0IHRoZXkgc2hvdWxkIGNoYW5nZSB0aGVpciBjb2RlLCBldmVuIGlmIGl0IGlzIGN1cnJlbnRseSBzdGlsbCB3b3JraW5nCiAqIGNvcnJlY3RseS4KICoKICogQSBkZXByZWNhdGVkIGZlYXR1cmUgaXMgc2NoZWR1bGVkIHRvIGJlIHJlbW92ZWQgYXQgYSBsYXRlciB0aW1lLCBwb3NzaWJseQogKiBzcGVjaWZpZWQgaW4gW21lc3NhZ2VdLiBBIGRlcHJlY2F0ZWQgZmVhdHVyZSBzaG91bGQgbm90IGJlIHVzZWQsIGNvZGUgdXNpbmcKICogaXQgd2lsbCBicmVhayBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuIElmIGV4aXN0aW5nIGNvZGUgaXMgdXNpbmcgdGhlCiAqIGZlYXR1cmUgaXQgc2hvdWxkIGJlIHJld3JpdHRlbiB0byBub3QgdXNlIHRoZSBkZXByZWNhdGVkIGZlYXR1cmUuCiAqCiAqIEEgZGVwcmVjYXRlZCBmZWF0dXJlIHNob3VsZCBkb2N1bWVudCBob3cgdGhlIHNhbWUgZWZmZWN0IGNhbiBiZSBhY2hpZXZlZCBpbgogKiBbbWVzc2FnZV0sIHNvIHRoZSBwcm9ncmFtbWVyIGtub3dzIGhvdyB0byByZXdyaXRlIHRoZSBjb2RlLgogKgogKiBUaGUgYEBEZXByZWNhdGVkYCBhbm5vdGF0aW9uIGFwcGxpZXMgdG8gbGlicmFyaWVzLCB0b3AtbGV2ZWwgZGVjbGFyYXRpb25zCiAqICh2YXJpYWJsZXMsIGdldHRlcnMsIHNldHRlcnMsIGZ1bmN0aW9ucywgY2xhc3NlcyBhbmQgdHlwZWRlZnMpLAogKiBjbGFzcy1sZXZlbCBkZWNsYXJhdGlvbnMgKHZhcmlhYmxlcywgZ2V0dGVycywgc2V0dGVycywgbWV0aG9kcywgb3BlcmF0b3JzIG9yCiAqIGNvbnN0cnVjdG9ycywgd2hldGhlciBzdGF0aWMgb3Igbm90KSwgbmFtZWQgb3B0aW9uYWwgYXJndW1lbnRzIGFuZAogKiB0cmFpbGluZyBvcHRpb25hbCBwb3NpdGlvbmFsIHBhcmFtZXRlcnMuCiAqCiAqIERlcHJlY2F0aW9uIGlzIHRyYW5zaXRpdmU6CiAqCiAqICAtIElmIGEgbGlicmFyeSBpcyBkZXByZWNhdGVkLCBzbyBpcyBldmVyeSBtZW1iZXIgb2YgaXQuCiAqICAtIElmIGEgY2xhc3MgaXMgZGVwcmVjYXRlZCwgc28gaXMgZXZlcnkgbWVtYmVyIG9mIGl0LgogKiAgLSBJZiBhIHZhcmlhYmxlIGlzIGRlcHJlY2F0ZWQsIHNvIGFyZSBpdHMgaW1wbGljaXQgZ2V0dGVyIGFuZCBzZXR0ZXIuCiAqCiAqCiAqIEEgdG9vbCB0aGF0IHByb2Nlc3NlcyBEYXJ0IHNvdXJjZSBjb2RlIG1heSByZXBvcnQgd2hlbjoKICoKICogLSB0aGUgY29kZSBpbXBvcnRzIGEgZGVwcmVjYXRlZCBsaWJyYXJ5LgogKiAtIHRoZSBjb2RlIGV4cG9ydHMgYSBkZXByZWNhdGVkIGxpYnJhcnksIG9yIGFueSBkZXByZWNhdGVkIG1lbWJlciBvZgogKiAgwqBhIG5vbi1kZXByZWNhdGVkIGxpYnJhcnkuCiAqIC0gdGhlIGNvZGUgcmVmZXJzIHN0YXRpY2FsbHkgdG8gYSBkZXByZWNhdGVkIGRlY2xhcmF0aW9uLgogKiAtIHRoZSBjb2RlIGR5bmFtaWNhbGx5IHVzZXMgYSBtZW1iZXIgb2YgYW4gb2JqZWN0IHdpdGggYSBzdGF0aWNhbGx5IGtub3duCiAqICAgdHlwZSwgd2hlcmUgdGhlIG1lbWJlciBpcyBkZXByZWNhdGVkIG9uIHRoZSBzdGF0aWMgdHlwZSBvZiB0aGUgb2JqZWN0LgogKiAtIHRoZSBjb2RlIGR5bmFtaWNhbGx5IGNhbGxzIGEgbWV0aG9kIHdpdGggYW4gYXJndW1lbnQgd2hlcmUgdGhlCiAqICAgY29ycmVzcG9uZGluZyBvcHRpb25hbCBwYXJhbWV0ZXIgaXMgZGVwcmVjYXRlZCBvbiB0aGUgb2JqZWN0J3Mgc3RhdGljIHR5cGUuCiAqCiAqCiAqIElmIHRoZSBkZXByZWNhdGVkIHVzZSBpcyBpbnNpZGUgYSBsaWJyYXJ5LCBjbGFzcyBvciBtZXRob2Qgd2hpY2ggaXMgaXRzZWxmCiAqIGRlcHJlY2F0ZWQsIHRoZSB0b29sIHNob3VsZCBub3QgYm90aGVyIHRoZSB1c2VyIGFib3V0IGl0LgogKiBBIGRlcHJlY2F0ZWQgZmVhdHVyZSBpcyBleHBlY3RlZCB0byB1c2Ugb3RoZXIgZGVwcmVjYXRlZCBmZWF0dXJlcy4KICovCmNsYXNzIERlcHJlY2F0ZWQgewogIC8qKgogICAqIE1lc3NhZ2UgcHJvdmlkZWQgdG8gdGhlIHVzZXIgd2hlbiB0aGV5IHVzZSB0aGUgZGVwcmVjYXRlZCBmZWF0dXJlLgogICAqCiAgICogVGhlIG1lc3NhZ2Ugc2hvdWxkIGV4cGxhaW4gaG93IHRvIG1pZ3JhdGUgYXdheSBmcm9tIHRoZSBmZWF0dXJlIGlmIGFuCiAgICogYWx0ZXJuYXRpdmUgaXMgYXZhaWxhYmxlLCBhbmQgd2hlbiB0aGUgZGVwcmVjYXRlZCBmZWF0dXJlIGlzIGV4cGVjdGVkIHRvIGJlCiAgICogcmVtb3ZlZC4KICAgKi8KICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKCiAgLyoqCiAgICogQ3JlYXRlIGEgZGVwcmVjYXRpb24gYW5ub3RhdGlvbiB3aGljaCBzcGVjaWZpZXMgdGhlIG1pZ3JhdGlvbiBwYXRoIGFuZAogICAqIGV4cGlyYXRpb24gb2YgdGhlIGFubm90YXRlZCBmZWF0dXJlLgogICAqCiAgICogVGhlIFttZXNzYWdlXSBhcmd1bWVudCBzaG91bGQgYmUgcmVhZGFibGUgYnkgcHJvZ3JhbW1lcnMsIGFuZCBzaG91bGQgc3RhdGUKICAgKiBhbiBhbHRlcm5hdGl2ZSBmZWF0dXJlIChpZiBhdmFpbGFibGUpIGFzIHdlbGwgYXMgd2hlbiBhbiBhbm5vdGF0ZWQgZmVhdHVyZQogICAqIGlzIGV4cGVjdGVkIHRvIGJlIHJlbW92ZWQuCiAgICovCiAgY29uc3QgRGVwcmVjYXRlZCh0aGlzLm1lc3NhZ2UpOwoKICBARGVwcmVjYXRlZCgnVXNlIGBtZXNzYWdlYCBpbnN0ZWFkLiBXaWxsIGJlIHJlbW92ZWQgaW4gRGFydCAzLjAuMCcpCiAgU3RyaW5nIGdldCBleHBpcmVzID0+IG1lc3NhZ2U7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJEZXByZWNhdGVkIGZlYXR1cmU6ICRtZXNzYWdlIjsKfQoKLyoqCiAqIE1hcmtzIGEgZmVhdHVyZSBhcyBbRGVwcmVjYXRlZF0gdW50aWwgdGhlIG5leHQgcmVsZWFzZS4KICovCmNvbnN0IERlcHJlY2F0ZWQgZGVwcmVjYXRlZCA9IERlcHJlY2F0ZWQoIm5leHQgcmVsZWFzZSIpOwoKY2xhc3MgX092ZXJyaWRlIHsKICBjb25zdCBfT3ZlcnJpZGUoKTsKfQoKLyoqCiAqIFRoZSBhbm5vdGF0aW9uIGBAb3ZlcnJpZGVgIG1hcmtzIGFuIGluc3RhbmNlIG1lbWJlciBhcyBvdmVycmlkaW5nIGEKICogc3VwZXJjbGFzcyBtZW1iZXIgd2l0aCB0aGUgc2FtZSBuYW1lLgogKgogKiBUaGUgYW5ub3RhdGlvbiBhcHBsaWVzIHRvIGluc3RhbmNlIG1ldGhvZHMsIGdldHRlcnMgYW5kIHNldHRlcnMsIGFuZCB0bwogKiBpbnN0YW5jZSBmaWVsZHMsIHdoZXJlIGl0IG1lYW5zIHRoYXQgdGhlIGltcGxpY2l0IGdldHRlciBhbmQgc2V0dGVyIG9mIHRoZQogKiBmaWVsZCBpcyBtYXJrZWQgYXMgb3ZlcnJpZGluZywgYnV0IHRoZSBmaWVsZCBpdHNlbGYgaXMgbm90LgogKgogKiBUaGUgaW50ZW50IG9mIHRoZSBgQG92ZXJyaWRlYCBub3RhdGlvbiBpcyB0byBjYXRjaCBzaXR1YXRpb25zIHdoZXJlIGEKICogc3VwZXJjbGFzcyByZW5hbWVzIGEgbWVtYmVyLCBhbmQgYW4gaW5kZXBlbmRlbnQgc3ViY2xhc3Mgd2hpY2ggdXNlZCB0bwogKiBvdmVycmlkZSB0aGUgbWVtYmVyLCBjb3VsZCBzaWxlbnRseSBjb250aW51ZSB3b3JraW5nIHVzaW5nIHRoZQogKiBzdXBlcmNsYXNzIGltcGxlbWVudGF0aW9uLgogKgogKiBUaGUgZWRpdG9yLCBvciBhIHNpbWlsYXIgdG9vbCBhaW1lZCBhdCB0aGUgcHJvZ3JhbW1lciwgbWF5IHJlcG9ydCBpZiBubwogKiBkZWNsYXJhdGlvbiBvZiBhbiBhbm5vdGF0ZWQgbWVtYmVyIGlzIGluaGVyaXRlZCBieSB0aGUgY2xhc3MgZnJvbSBlaXRoZXIgYQogKiBzdXBlcmNsYXNzIG9yIGFuIGludGVyZmFjZS4KICoKICogVXNlIHRoZSBgQG92ZXJyaWRlYCBhbm5vdGF0aW9uIGp1ZGljaW91c2x5IGFuZCBvbmx5IGZvciBtZXRob2RzIHdoZXJlCiAqIHRoZSBzdXBlcmNsYXNzIGlzIG5vdCB1bmRlciB0aGUgcHJvZ3JhbW1lcidzIGNvbnRyb2wsIHRoZSBzdXBlcmNsYXNzIGlzIGluIGEKICogZGlmZmVyZW50IGxpYnJhcnkgb3IgcGFja2FnZSwgYW5kIGl0IGlzIG5vdCBjb25zaWRlcmVkIHN0YWJsZS4KICogSW4gYW55IGNhc2UsIHRoZSB1c2Ugb2YgYEBvdmVycmlkZWAgaXMgb3B0aW9uYWwuCiAqCiAqIEZvciBleGFtcGxlLCB0aGUgYW5ub3RhdGlvbiBpcyBpbnRlbnRpb25hbGx5IG5vdCB1c2VkIGluIHRoZSBEYXJ0IHBsYXRmb3JtCiAqIGxpYnJhcmllcywgc2luY2UgdGhleSBvbmx5IGRlcGVuZCBvbiB0aGVtc2VsdmVzLgogKi8KY29uc3QgT2JqZWN0IG92ZXJyaWRlID0gX092ZXJyaWRlKCk7CgovKioKICogQW4gYW5ub3RhdGlvbiBjbGFzcyB0aGF0IHdhcyB1c2VkIGR1cmluZyBkZXZlbG9wbWVudCBvZiBEYXJ0IDIuCiAqCiAqIFNob3VsZCBub3QgYmUgdXNlZCBhbnkgbW9yZS4KICovCkBkZXByZWNhdGVkCmNsYXNzIFByb3Zpc2lvbmFsIHsKICBTdHJpbmcgZ2V0IG1lc3NhZ2UgPT4gbnVsbDsKICBjb25zdCBQcm92aXNpb25hbCh7U3RyaW5nIG1lc3NhZ2V9KTsKfQoKLyoqCiAqIEFuIGFubm90YXRpb24gdGhhdCB3YXMgdXNlZCBkdXJpbmcgZGV2ZWxvcG1lbnQgb2YgRGFydCAyLgogKgogKiBTaG91bGQgbm90IGJlIHVzZWQgYW55IG1vcmUuCiAqLwpAZGVwcmVjYXRlZApjb25zdCBOdWxsIHByb3Zpc2lvbmFsID0gbnVsbDsKCmNsYXNzIF9Qcm94eSB7CiAgY29uc3QgX1Byb3h5KCk7Cn0KCi8qKgogKiBUaGlzIGFubm90YXRpb24gaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIERhcnQgMi4KICoKICogRGFydCAyIGhhcyBhIG1vcmUgcmVzdHJpY3RpdmUgdHlwZSBzeXN0ZW0gdGhhbiBEYXJ0IDEsIGFuZCBpdCByZXF1aXJlcwogKiBtZXRob2QgYWNjZXNzIHRvIGJlIGVpdGhlciB0aHJvdWdoIGEga25vd24gaW50ZXJmYWNlIG9yIGJ5IHVzaW5nCiAqIGR5bmFtaWMgaW52b2NhdGlvbnMuIFRoZSBvcmlnaW5hbCBpbnRlbnQgb2YgYEBwcm94eWAgKHRvIGltcGxlbWVudCBhIGNsYXNzCiAqIHRoYXQgaXNuJ3Qga25vd24gc3RhdGljYWxseSwgYXMgZG9jdW1lbnRlZCBhdCB0aGUgZW5kIG9mIHRoaXMgdGV4dCksCiAqIGlzIG5vdCBzdXBwb3J0ZWQgYnkgRGFydCAyLgogKiBUbyBjb250aW51ZSB0byBwZXJmb3JtIGR5bmFtaWMgaW52b2NhdGlvbnMgb24gYW4gb2JqZWN0LAogKiBpdCBzaG91bGQgYmUgYWNjZXNzZWQgdGhyb3VnaCBhIHJlZmVyZW5jZSBvZiB0eXBlIGBkeW5hbWljYC4KICoKICogVGhlIGFubm90YXRpb24gYEBwcm94eWAgbWFya3MgYSBjbGFzcyBhcyBpbXBsZW1lbnRpbmcgbWVtYmVycyBkeW5hbWljYWxseQogKiB0aHJvdWdoIGBub1N1Y2hNZXRob2RgLgogKgogKiBUaGUgYW5ub3RhdGlvbiBhcHBsaWVzIHRvIGFueSBjbGFzcy4gSXQgaXMgaW5oZXJpdGVkIGJ5IHN1YmNsYXNzZXMgZnJvbSBib3RoCiAqIHN1cGVyY2xhc3MgYW5kIGludGVyZmFjZXMuCiAqCiAqIElmIGEgY2xhc3MgaXMgYW5ub3RhdGVkIHdpdGggYEBwcm94eWAsIG9yIGl0IGltcGxlbWVudHMgYW55IGNsYXNzIHRoYXQgaXMKICogYW5ub3RhdGVkLCB0aGVuIGFsbCBtZW1iZXIgYWNjZXNzZXMgYXJlIGFsbG93ZWQgb24gYW4gb2JqZWN0IG9mIHRoYXQgdHlwZS4KICogQXMgc3VjaCwgaXQgaXMgbm90IGEgc3RhdGljIHR5cGUgd2FybmluZyB0byBhY2Nlc3MgYW55IG1lbWJlciBvZiB0aGUgb2JqZWN0CiAqIHdoaWNoIGlzIG5vdCBpbXBsZW1lbnRlZCBieSB0aGUgY2xhc3MsIG9yIHRvIGNhbGwgYSBtZXRob2Qgd2l0aCBhIGRpZmZlcmVudAogKiBudW1iZXIgb2YgcGFyYW1ldGVycyB0aGFuIGl0IGlzIGRlY2xhcmVkIHdpdGguCiAqCiAqIFRoZSBhbm5vdGF0aW9uIGRvZXMgbm90IGNoYW5nZSB3aGljaCBjbGFzc2VzIHRoZSBhbm5vdGF0ZWQgY2xhc3MgaW1wbGVtZW50cywKICogYW5kIGRvZXMgbm90IHByZXZlbnQgc3RhdGljIHdhcm5pbmdzIGZvciBhc3NpZ25pbmcgYW4gb2JqZWN0IHRvIGEgdmFyaWFibGUKICogd2l0aCBhIHN0YXRpYyB0eXBlIG5vdCBpbXBsZW1lbnRlZCBieSB0aGUgb2JqZWN0LgogKgogKiBUaGUgc3VwcHJlc3Npb24gb2Ygd2FybmluZ3Mgb25seSBhZmZlY3Qgc3RhdGljIHR5cGUgd2FybmluZ3MgYWJvdXQKICogbWVtYmVyIGFjY2Vzcy4KICogVGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGUgb2JqZWN0IGlzIHVuYWZmZWN0ZWQuCiAqIEl0IGlzIG5vdCBjb25zaWRlcmVkIHRvIGltcGxlbWVudCBhbnkgc3BlY2lhbCBpbnRlcmZhY2VzLAogKiBzbyBhc3NpZ25pbmcgaXQgdG8gYSB0eXBlZCB2YXJpYWJsZSBtYXkgZmFpbCBpbiBjaGVja2VkIG1vZGUsCiAqIGFuZCB0ZXN0aW5nIGl0IHdpdGggdGhlIGBpc2Agb3BlcmF0b3IKICogd2lsbCBvbmx5IHJldHVybiB0cnVlIGZvciB0eXBlcyBpdCBhY3R1YWxseSBpbXBsZW1lbnRzIG9yIGV4dGVuZHMuCiAqIEFjY2Vzc2luZyBhIG1lbWJlciB3aGljaCBpc24ndCBpbXBsZW1lbnRlZCBieSB0aGUgY2xhc3MKICogd2lsbCBjYXVzZSB0aGUgYG5vU3VjaE1ldGhvZGAgbWV0aG9kIHRvIGJlIGNhbGxlZCBub3JtYWxseSwKICogdGhlIGBAcHJveHlgIGFubm90YXRpb24gbWVyZWx5IHN0YXRlcyB0aGUgaW50ZW50IHRvIGhhbmRsZSAoc29tZSBvZikgdGhvc2UKICogYG5vU3VjaE1ldGhvZGAgY2FsbHMgZ3JhY2VmdWxseS4KICoKICogQSBjbGFzcyB0aGF0IG1hcmtlZCBhcyBgQHByb3h5YCBzaG91bGQgb3ZlcnJpZGUgdGhlIGBub1N1Y2hNZXRob2RgCiAqIGRlY2xhcmVkIG9uIFtPYmplY3RdLgogKgogKiBUaGUgaW50ZW50IG9mIHRoZSBgQHByb3h5YCBub3RhdGlvbiBpcyB0byBjcmVhdGUgb2JqZWN0cyB0aGF0IGltcGxlbWVudCBhCiAqIHR5cGUgKG9yIG11bHRpcGxlIHR5cGVzKSB0aGF0IGFyZSBub3Qga25vd24gYXQgY29tcGlsZSB0aW1lLiBJZiB0aGUgdHlwZXMKICogYXJlIGtub3duIGF0IGNvbXBpbGUgdGltZSwgYSBjbGFzcyBjYW4gYmUgd3JpdHRlbiB0aGF0IGltcGxlbWVudHMgdGhlc2UKICogdHlwZXMuCiAqLwpAZGVwcmVjYXRlZApjb25zdCBPYmplY3QgcHJveHkgPSBfUHJveHkoKTsKCi8qKgogKiBBIGhpbnQgdG8gdG9vbHMuCiAqCiAqIFRvb2xzIHRoYXQgd29yayB3aXRoIERhcnQgcHJvZ3JhbXMgbWF5IGFjY2VwdCBoaW50cyB0byBndWlkZSB0aGVpciBiZWhhdmlvcgogKiBhcyBgcHJhZ21hYCBhbm5vdGF0aW9ucyBvbiBkZWNsYXJhdGlvbnMuCiAqIEVhY2ggdG9vbCBkZWNpZGVzIHdoaWNoIGhpbnRzIGl0IGFjY2VwdHMsIHdoYXQgdGhleSBtZWFuLCBhbmQgd2hldGhlciBhbmQKICogaG93IHRoZXkgYXBwbHkgdG8gc3ViLXBhcnRzIG9mIHRoZSBhbm5vdGF0ZWQgZW50aXR5LgogKgogKiBUb29scyB0aGF0IHJlY29nbml6ZSBwcmFnbWEgaGludHMgc2hvdWxkIHBpY2sgYSBwcmFnbWEgcHJlZml4IHRvIGlkZW50aWZ5CiAqIHRoZSB0b29sLiBUaGV5IHNob3VsZCByZWNvZ25pemUgYW55IGhpbnQgd2l0aCBhIFtuYW1lXSBzdGFydGluZyB3aXRoIHRoZWlyCiAqIHByZWZpeCBmb2xsb3dlZCBieSBgOmAgYXMgaWYgaXQgd2FzIGludGVuZGVkIGZvciB0aGF0IHRvb2wuIEEgaGludCB3aXRoIGEKICogcHJlZml4IGZvciBhbm90aGVyIHRvb2wgc2hvdWxkIGJlIGlnbm9yZWQgKHVubGVzcyBjb21wYXRpYmlsaXR5IHdpdGggdGhhdAogKiBvdGhlciB0b29sIGlzIGEgZ29hbCkuCiAqCiAqIEEgdG9vbCBtYXkgcmVjb2duaXplIHVucHJlZml4ZWQgbmFtZXMgYXMgd2VsbCwgaWYgdGhleSB3b3VsZCByZWNvZ25pemUgdGhhdAogKiBuYW1lIHdpdGggdGhlaXIgb3duIHByZWZpeCBpbiBmcm9udC4KICoKICogSWYgdGhlIGhpbnQgY2FuIGJlIHBhcmFtZXRlcml6ZWQsIGFuIGV4dHJhIFtvcHRpb25zXSBvYmplY3QgY2FuIGJlIGFkZGVkIGFzIHdlbGwuCiAqCiAqIEZvciBleGFtcGxlOgogKgogKiBgYGBkYXJ0CiAqIEBwcmFnbWEoJ1Rvb2w6cHJhZ21hLW5hbWUnLCBbcGFyYW0xLCBwYXJhbTIsIC4uLl0pCiAqIGNsYXNzIEZvbyB7IH0KICoKICogQHByYWdtYSgnT3RoZXJUb29sOm90aGVyLXByYWdtYScpCiAqIHZvaWQgZm9vKCkgeyB9CiAqIGBgYAogKgogKiBIZXJlIGNsYXNzIEZvbyBpcyBhbm5vdGF0ZWQgd2l0aCBhIFRvb2wgc3BlY2lmaWMgcHJhZ21hICdwcmFnbWEtbmFtZScgYW5kCiAqIGZ1bmN0aW9uIGZvbyBpcyBhbm5vdGF0ZWQgd2l0aCBhIHByYWdtYSAnb3RoZXItcHJhZ21hJyBzcGVjaWZpYyB0byBPdGhlclRvb2wuCiAqCiAqLwpAcHJhZ21hKCd2bTplbnRyeS1wb2ludCcpCmNsYXNzIHByYWdtYSB7CiAgLyoqCiAgICogVGhlIG5hbWUgb2YgdGhlIGhpbnQuCiAgICoKICAgKiBBIHN0cmluZyB0aGF0IGlzIHJlY29nbml6ZWQgYnkgb25lIG9yIG1vcmUgdG9vbHMsIG9yIHN1Y2ggYSBzdHJpbmcgcHJlZml4ZWQKICAgKiBieSBhIHRvb2wgaWRlbnRpZmllciBhbmQgYSBjb2xvbiwgd2hpY2ggaXMgb25seSByZWNvZ25pemVkIGJ5IHRoYXQKICAgKiBwYXJ0aWN1bGFyIHRvb2wuCiAgICovCiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIC8qKiBPcHRpb25hbCBleHRyYSBkYXRhIHBhcmFtZXRlcml6aW5nIHRoZSBoaW50LiAqLwogIGZpbmFsIE9iamVjdCBvcHRpb25zOwoKICAvKiogQ3JlYXRlcyBhIGhpbnQgbmFtZWQgW25hbWVdIHdpdGggb3B0aW9uYWwgW29wdGlvbnNdLiAqLwogIGNvbnN0IGZhY3RvcnkgcHJhZ21hKFN0cmluZyBuYW1lLCBbT2JqZWN0IG9wdGlvbnNdKSA9IHByYWdtYS5fOwoKICBjb25zdCBwcmFnbWEuXyh0aGlzLm5hbWUsIFt0aGlzLm9wdGlvbnNdKTsKfQqA8gBOTjwBEwEETANEQQNOTQ4DTU9MRQNPPwNNQ1BGLAMeAzw6SgMDOwMsSB89TUxEUQMDTj1GBBMGSAVLUQ4GGAEGTCoFUFAgBiIBRiEBNwIBBDsEOgESFQIBBEcpA0tOPwNJSkIeA0tOHwNJUEI0A040BCUBBEMDIAQMFB4nAgEEPQMgBAwfAQ8SAgEEQANKRE5IHzxAA00bA1AeA01OT08yA1BONQNGEjE9QSlGOz9OJANGGQNNTUsKBAwfAQQUA08sTTgDTU5NTRoDTygDVQMQAws2EQMlEgcDTVEDBBoPBhsFUUgWBhUBNhgBPkIBLQIBGmRhcnQ6Y29yZS9hbm5vdGF0aW9ucy5kYXJ0LG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL2JpZ2ludC5kYXJ0sZQvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogQW4gYXJiaXRyYXJpbHkgbGFyZ2UgaW50ZWdlci4KICovCmFic3RyYWN0IGNsYXNzIEJpZ0ludCBpbXBsZW1lbnRzIENvbXBhcmFibGU8QmlnSW50PiB7CiAgZXh0ZXJuYWwgc3RhdGljIEJpZ0ludCBnZXQgemVybzsKICBleHRlcm5hbCBzdGF0aWMgQmlnSW50IGdldCBvbmU7CiAgZXh0ZXJuYWwgc3RhdGljIEJpZ0ludCBnZXQgdHdvOwoKICAvKioKICAgKiBQYXJzZXMgW3NvdXJjZV0gYXMgYSwgcG9zc2libHkgc2lnbmVkLCBpbnRlZ2VyIGxpdGVyYWwgYW5kIHJldHVybnMgaXRzCiAgICogdmFsdWUuCiAgICoKICAgKiBUaGUgW3NvdXJjZV0gbXVzdCBiZSBhIG5vbi1lbXB0eSBzZXF1ZW5jZSBvZiBiYXNlLVtyYWRpeF0gZGlnaXRzLAogICAqIG9wdGlvbmFsbHkgcHJlZml4ZWQgd2l0aCBhIG1pbnVzIG9yIHBsdXMgc2lnbiAoJy0nIG9yICcrJykuCiAgICoKICAgKiBUaGUgW3JhZGl4XSBtdXN0IGJlIGluIHRoZSByYW5nZSAyLi4zNi4gVGhlIGRpZ2l0cyB1c2VkIGFyZQogICAqIGZpcnN0IHRoZSBkZWNpbWFsIGRpZ2l0cyAwLi45LCBhbmQgdGhlbiB0aGUgbGV0dGVycyAnYScuLid6JyB3aXRoCiAgICogdmFsdWVzIDEwIHRocm91Z2ggMzUuIEFsc28gYWNjZXB0cyB1cHBlci1jYXNlIGxldHRlcnMgd2l0aCB0aGUgc2FtZQogICAqIHZhbHVlcyBhcyB0aGUgbG93ZXItY2FzZSBvbmVzLgogICAqCiAgICogSWYgbm8gW3JhZGl4XSBpcyBnaXZlbiB0aGVuIGl0IGRlZmF1bHRzIHRvIDEwLiBJbiB0aGlzIGNhc2UsIHRoZSBbc291cmNlXQogICAqIGRpZ2l0cyBtYXkgYWxzbyBzdGFydCB3aXRoIGAweGAsIGluIHdoaWNoIGNhc2UgdGhlIG51bWJlciBpcyBpbnRlcnByZXRlZAogICAqIGFzIGEgaGV4YWRlY2ltYWwgbGl0ZXJhbCwgd2hpY2ggZWZmZWN0aXZlbHkgbWVhbnMgdGhhdCB0aGUgYDB4YCBpcyBpZ25vcmVkCiAgICogYW5kIHRoZSByYWRpeCBpcyBpbnN0ZWFkIHNldCB0byAxNi4KICAgKgogICAqIEZvciBhbnkgaW50IGBuYCBhbmQgcmFkaXggYHJgLCBpdCBpcyBndWFyYW50ZWVkIHRoYXQKICAgKiBgbiA9PSBpbnQucGFyc2Uobi50b1JhZGl4U3RyaW5nKHIpLCByYWRpeDogcilgLgogICAqCiAgICogVGhyb3dzIGEgW0Zvcm1hdEV4Y2VwdGlvbl0gaWYgdGhlIFtzb3VyY2VdIGlzIG5vdCBhIHZhbGlkIGludGVnZXIgbGl0ZXJhbCwKICAgKiBvcHRpb25hbGx5IHByZWZpeGVkIGJ5IGEgc2lnbi4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgQmlnSW50IHBhcnNlKFN0cmluZyBzb3VyY2UsIHtpbnQgcmFkaXh9KTsKCiAgLyoqCiAgICogUGFyc2VzIFtzb3VyY2VdIGFzIGEsIHBvc3NpYmx5IHNpZ25lZCwgaW50ZWdlciBsaXRlcmFsIGFuZCByZXR1cm5zIGl0cwogICAqIHZhbHVlLgogICAqCiAgICogQXMgW3BhcnNlXSBleGNlcHQgdGhhdCB0aGlzIG1ldGhvZCByZXR1cm5zIGBudWxsYCBpZiB0aGUgaW5wdXQgaXMgbm90CiAgICogdmFsaWQKICAgKi8KICBleHRlcm5hbCBzdGF0aWMgQmlnSW50IHRyeVBhcnNlKFN0cmluZyBzb3VyY2UsIHtpbnQgcmFkaXh9KTsKCiAgLy8vIEFsbG9jYXRlcyBhIGJpZyBpbnRlZ2VyIGZyb20gdGhlIHByb3ZpZGVkIFt2YWx1ZV0gbnVtYmVyLgogIGV4dGVybmFsIGZhY3RvcnkgQmlnSW50LmZyb20obnVtIHZhbHVlKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhpcyBpbnRlZ2VyLgogICAqCiAgICogRm9yIGFueSBpbnRlZ2VyIGB4YCwgdGhlIHJlc3VsdCBpcyB0aGUgc2FtZSBhcyBgeCA8IDAgPyAteCA6IHhgLgogICAqLwogIEJpZ0ludCBhYnMoKTsKCiAgLyoqCiAgICogUmV0dXJuIHRoZSBuZWdhdGl2ZSB2YWx1ZSBvZiB0aGlzIGludGVnZXIuCiAgICoKICAgKiBUaGUgcmVzdWx0IG9mIG5lZ2F0aW5nIGFuIGludGVnZXIgYWx3YXlzIGhhcyB0aGUgb3Bwb3NpdGUgc2lnbiwgZXhjZXB0CiAgICogZm9yIHplcm8sIHdoaWNoIGlzIGl0cyBvd24gbmVnYXRpb24uCiAgICovCiAgQmlnSW50IG9wZXJhdG9yIC0oKTsKCiAgLy8vIEFkZGl0aW9uIG9wZXJhdG9yLgogIEJpZ0ludCBvcGVyYXRvciArKEJpZ0ludCBvdGhlcik7CgogIC8vLyBTdWJ0cmFjdGlvbiBvcGVyYXRvci4KICBCaWdJbnQgb3BlcmF0b3IgLShCaWdJbnQgb3RoZXIpOwoKICAvLy8gTXVsdGlwbGljYXRpb24gb3BlcmF0b3IuCiAgQmlnSW50IG9wZXJhdG9yICooQmlnSW50IG90aGVyKTsKCiAgLy8vIERpdmlzaW9uIG9wZXJhdG9yLgogIGRvdWJsZSBvcGVyYXRvciAvKEJpZ0ludCBvdGhlcik7CgogIC8qKgogICAqIFRydW5jYXRpbmcgZGl2aXNpb24gb3BlcmF0b3IuCiAgICoKICAgKiBQZXJmb3JtcyBhIHRydW5jYXRpbmcgaW50ZWdlciBkaXZpc2lvbiwgd2hlcmUgdGhlIHJlbWFpbmRlciBpcyBkaXNjYXJkZWQuCiAgICoKICAgKiBUaGUgcmVtYWluZGVyIGNhbiBiZSBjb21wdXRlZCB1c2luZyB0aGUgW3JlbWFpbmRlcl0gbWV0aG9kLgogICAqCiAgICogRXhhbXBsZXM6CiAgICogYGBgCiAgICogdmFyIHNldmVuID0gbmV3IEJpZ0ludC5mcm9tKDcpOwogICAqIHZhciB0aHJlZSA9IG5ldyBCaWdJbnQuZnJvbSgzKTsKICAgKiBzZXZlbiB+LyB0aHJlZTsgICAgLy8gPT4gMgogICAqICgtc2V2ZW4pIH4vIHRocmVlOyAvLyA9PiAtMgogICAqIHNldmVuIH4vIC10aHJlZTsgICAvLyA9PiAtMgogICAqIHNldmVuLnJlbWFpbmRlcih0aHJlZSk7ICAgIC8vID0+IDEKICAgKiAoLXNldmVuKS5yZW1haW5kZXIodGhyZWUpOyAvLyA9PiAtMQogICAqIHNldmVuLnJlbWFpbmRlcigtdGhyZWUpOyAgIC8vID0+IDEKICAgKiBgYGAKICAgKi8KICBCaWdJbnQgb3BlcmF0b3Igfi8oQmlnSW50IG90aGVyKTsKCiAgLyoqCiAgICogRXVjbGlkZWFuIG1vZHVsbyBvcGVyYXRvci4KICAgKgogICAqIFJldHVybnMgdGhlIHJlbWFpbmRlciBvZiB0aGUgRXVjbGlkZWFuIGRpdmlzaW9uLiBUaGUgRXVjbGlkZWFuIGRpdmlzaW9uIG9mCiAgICogdHdvIGludGVnZXJzIGBhYCBhbmQgYGJgIHlpZWxkcyB0d28gaW50ZWdlcnMgYHFgIGFuZCBgcmAgc3VjaCB0aGF0CiAgICogYGEgPT0gYiAqIHEgKyByYCBhbmQgYDAgPD0gciA8IGIuYWJzKClgLgogICAqCiAgICogVGhlIHNpZ24gb2YgdGhlIHJldHVybmVkIHZhbHVlIGByYCBpcyBhbHdheXMgcG9zaXRpdmUuCiAgICoKICAgKiBTZWUgW3JlbWFpbmRlcl0gZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHRydW5jYXRpbmcgZGl2aXNpb24uCiAgICovCiAgQmlnSW50IG9wZXJhdG9yICUoQmlnSW50IG90aGVyKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIHRoZSB0cnVuY2F0aW5nIGRpdmlzaW9uIG9mIGB0aGlzYCBieSBbb3RoZXJdLgogICAqCiAgICogVGhlIHJlc3VsdCBgcmAgb2YgdGhpcyBvcGVyYXRpb24gc2F0aXNmaWVzOgogICAqIGB0aGlzID09ICh0aGlzIH4vIG90aGVyKSAqIG90aGVyICsgcmAuCiAgICogQXMgYSBjb25zZXF1ZW5jZSB0aGUgcmVtYWluZGVyIGByYCBoYXMgdGhlIHNhbWUgc2lnbiBhcyB0aGUgZGl2aWRlciBgdGhpc2AuCiAgICovCiAgQmlnSW50IHJlbWFpbmRlcihCaWdJbnQgb3RoZXIpOwoKICAvKioKICAgKiBTaGlmdCB0aGUgYml0cyBvZiB0aGlzIGludGVnZXIgdG8gdGhlIGxlZnQgYnkgW3NoaWZ0QW1vdW50XS4KICAgKgogICAqIFNoaWZ0aW5nIHRvIHRoZSBsZWZ0IG1ha2VzIHRoZSBudW1iZXIgbGFyZ2VyLCBlZmZlY3RpdmVseSBtdWx0aXBseWluZwogICAqIHRoZSBudW1iZXIgYnkgYHBvdygyLCBzaGlmdEluZGV4KWAuCiAgICoKICAgKiBUaGVyZSBpcyBubyBsaW1pdCBvbiB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0LiBJdCBtYXkgYmUgcmVsZXZhbnQgdG8KICAgKiBsaW1pdCBpbnRlcm1lZGlhdGUgdmFsdWVzIGJ5IHVzaW5nIHRoZSAiYW5kIiBvcGVyYXRvciB3aXRoIGEgc3VpdGFibGUKICAgKiBtYXNrLgogICAqCiAgICogSXQgaXMgYW4gZXJyb3IgaWYgW3NoaWZ0QW1vdW50XSBpcyBuZWdhdGl2ZS4KICAgKi8KICBCaWdJbnQgb3BlcmF0b3IgPDwoaW50IHNoaWZ0QW1vdW50KTsKCiAgLyoqCiAgICogU2hpZnQgdGhlIGJpdHMgb2YgdGhpcyBpbnRlZ2VyIHRvIHRoZSByaWdodCBieSBbc2hpZnRBbW91bnRdLgogICAqCiAgICogU2hpZnRpbmcgdG8gdGhlIHJpZ2h0IG1ha2VzIHRoZSBudW1iZXIgc21hbGxlciBhbmQgZHJvcHMgdGhlIGxlYXN0CiAgICogc2lnbmlmaWNhbnQgYml0cywgZWZmZWN0aXZlbHkgZG9pbmcgYW4gaW50ZWdlciBkaXZpc2lvbiBieQogICAqYHBvdygyLCBzaGlmdEluZGV4KWAuCiAgICoKICAgKiBJdCBpcyBhbiBlcnJvciBpZiBbc2hpZnRBbW91bnRdIGlzIG5lZ2F0aXZlLgogICAqLwogIEJpZ0ludCBvcGVyYXRvciA+PihpbnQgc2hpZnRBbW91bnQpOwoKICAvKioKICAgKiBCaXQtd2lzZSBhbmQgb3BlcmF0b3IuCiAgICoKICAgKiBUcmVhdGluZyBib3RoIGB0aGlzYCBhbmQgW290aGVyXSBhcyBzdWZmaWNpZW50bHkgbGFyZ2UgdHdvJ3MgY29tcG9uZW50CiAgICogaW50ZWdlcnMsIHRoZSByZXN1bHQgaXMgYSBudW1iZXIgd2l0aCBvbmx5IHRoZSBiaXRzIHNldCB0aGF0IGFyZSBzZXQgaW4KICAgKiBib3RoIGB0aGlzYCBhbmQgW290aGVyXQogICAqCiAgICogT2YgYm90aCBvcGVyYW5kcyBhcmUgbmVnYXRpdmUsIHRoZSByZXN1bHQgaXMgbmVnYXRpdmUsIG90aGVyd2lzZQogICAqIHRoZSByZXN1bHQgaXMgbm9uLW5lZ2F0aXZlLgogICAqLwogIEJpZ0ludCBvcGVyYXRvciAmKEJpZ0ludCBvdGhlcik7CgogIC8qKgogICAqIEJpdC13aXNlIG9yIG9wZXJhdG9yLgogICAqCiAgICogVHJlYXRpbmcgYm90aCBgdGhpc2AgYW5kIFtvdGhlcl0gYXMgc3VmZmljaWVudGx5IGxhcmdlIHR3bydzIGNvbXBvbmVudAogICAqIGludGVnZXJzLCB0aGUgcmVzdWx0IGlzIGEgbnVtYmVyIHdpdGggdGhlIGJpdHMgc2V0IHRoYXQgYXJlIHNldCBpbiBlaXRoZXIKICAgKiBvZiBgdGhpc2AgYW5kIFtvdGhlcl0KICAgKgogICAqIElmIGJvdGggb3BlcmFuZHMgYXJlIG5vbi1uZWdhdGl2ZSwgdGhlIHJlc3VsdCBpcyBub24tbmVnYXRpdmUsCiAgICogb3RoZXJ3aXNlIHRoZSByZXN1bHQgdXMgbmVnYXRpdmUuCiAgICovCiAgQmlnSW50IG9wZXJhdG9yIHwoQmlnSW50IG90aGVyKTsKCiAgLyoqCiAgICogQml0LXdpc2UgZXhjbHVzaXZlLW9yIG9wZXJhdG9yLgogICAqCiAgICogVHJlYXRpbmcgYm90aCBgdGhpc2AgYW5kIFtvdGhlcl0gYXMgc3VmZmljaWVudGx5IGxhcmdlIHR3bydzIGNvbXBvbmVudAogICAqIGludGVnZXJzLCB0aGUgcmVzdWx0IGlzIGEgbnVtYmVyIHdpdGggdGhlIGJpdHMgc2V0IHRoYXQgYXJlIHNldCBpbiBvbmUsCiAgICogYnV0IG5vdCBib3RoLCBvZiBgdGhpc2AgYW5kIFtvdGhlcl0KICAgKgogICAqIElmIHRoZSBvcGVyYW5kcyBoYXZlIHRoZSBzYW1lIHNpZ24sIHRoZSByZXN1bHQgaXMgbm9uLW5lZ2F0aXZlLAogICAqIG90aGVyd2lzZSB0aGUgcmVzdWx0IGlzIG5lZ2F0aXZlLgogICAqLwogIEJpZ0ludCBvcGVyYXRvciBeKEJpZ0ludCBvdGhlcik7CgogIC8qKgogICAqIFRoZSBiaXQtd2lzZSBuZWdhdGUgb3BlcmF0b3IuCiAgICoKICAgKiBUcmVhdGluZyBgdGhpc2AgYXMgYSBzdWZmaWNpZW50bHkgbGFyZ2UgdHdvJ3MgY29tcG9uZW50IGludGVnZXIsCiAgICogdGhlIHJlc3VsdCBpcyBhIG51bWJlciB3aXRoIHRoZSBvcHBvc2l0ZSBiaXRzIHNldC4KICAgKgogICAqIFRoaXMgbWFwcyBhbnkgaW50ZWdlciBgeGAgdG8gYC14IC0gMWAuCiAgICovCiAgQmlnSW50IG9wZXJhdG9yIH4oKTsKCiAgLyoqIFJlbGF0aW9uYWwgbGVzcyB0aGFuIG9wZXJhdG9yLiAqLwogIGJvb2wgb3BlcmF0b3IgPChCaWdJbnQgb3RoZXIpOwoKICAvKiogUmVsYXRpb25hbCBsZXNzIHRoYW4gb3IgZXF1YWwgb3BlcmF0b3IuICovCiAgYm9vbCBvcGVyYXRvciA8PShCaWdJbnQgb3RoZXIpOwoKICAvKiogUmVsYXRpb25hbCBncmVhdGVyIHRoYW4gb3BlcmF0b3IuICovCiAgYm9vbCBvcGVyYXRvciA+KEJpZ0ludCBvdGhlcik7CgogIC8qKiBSZWxhdGlvbmFsIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCBvcGVyYXRvci4gKi8KICBib29sIG9wZXJhdG9yID49KEJpZ0ludCBvdGhlcik7CgogIC8qKgogICAqIENvbXBhcmVzIHRoaXMgdG8gYG90aGVyYC4KICAgKgogICAqIFJldHVybnMgYSBuZWdhdGl2ZSBudW1iZXIgaWYgYHRoaXNgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLCB6ZXJvIGlmIHRoZXkgYXJlCiAgICogZXF1YWwsIGFuZCBhIHBvc2l0aXZlIG51bWJlciBpZiBgdGhpc2AgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAuCiAgICovCiAgaW50IGNvbXBhcmVUbyhCaWdJbnQgb3RoZXIpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG51bWJlciBvZiBiaXRzIHJlcXVpcmVkIHRvIHN0b3JlIHRoaXMgYmlnIGludGVnZXIuCiAgICoKICAgKiBUaGUgbnVtYmVyIG9mIGJpdHMgZXhjbHVkZXMgdGhlIHNpZ24gYml0LCB3aGljaCBnaXZlcyB0aGUgbmF0dXJhbCBsZW5ndGgKICAgKiBmb3Igbm9uLW5lZ2F0aXZlICh1bnNpZ25lZCkgdmFsdWVzLiAgTmVnYXRpdmUgdmFsdWVzIGFyZSBjb21wbGVtZW50ZWQgdG8KICAgKiByZXR1cm4gdGhlIGJpdCBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYml0IHRoYXQgZGlmZmVycyBmcm9tIHRoZSBzaWduIGJpdC4KICAgKgogICAqIFRvIGZpbmQgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byBzdG9yZSB0aGUgdmFsdWUgYXMgYSBzaWduZWQgdmFsdWUsCiAgICogYWRkIG9uZSwgaS5lLiB1c2UgYHguYml0TGVuZ3RoICsgMWAuCiAgICoKICAgKiBgYGAKICAgKiB4LmJpdExlbmd0aCA9PSAoLXgtMSkuYml0TGVuZ3RoCiAgICoKICAgKiBuZXcgQmlnSW50LmZyb20oMykuYml0TGVuZ3RoID09IDI7ICAgLy8gMDAwMDAwMTEKICAgKiBuZXcgQmlnSW50LmZyb20oMikuYml0TGVuZ3RoID09IDI7ICAgLy8gMDAwMDAwMTAKICAgKiBuZXcgQmlnSW50LmZyb20oMSkuYml0TGVuZ3RoID09IDE7ICAgLy8gMDAwMDAwMDEKICAgKiBuZXcgQmlnSW50LmZyb20oMCkuYml0TGVuZ3RoID09IDA7ICAgLy8gMDAwMDAwMDAKICAgKiBuZXcgQmlnSW50LmZyb20oLTEpLmJpdExlbmd0aCA9PSAwOyAgLy8gMTExMTExMTEKICAgKiBuZXcgQmlnSW50LmZyb20oLTIpLmJpdExlbmd0aCA9PSAxOyAgLy8gMTExMTExMTAKICAgKiBuZXcgQmlnSW50LmZyb20oLTMpLmJpdExlbmd0aCA9PSAyOyAgLy8gMTExMTExMDEKICAgKiBuZXcgQmlnSW50LmZyb20oLTQpLmJpdExlbmd0aCA9PSAyOyAgLy8gMTExMTExMDAKICAgKiBgYGAKICAgKi8KICBpbnQgZ2V0IGJpdExlbmd0aDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgc2lnbiBvZiB0aGlzIGJpZyBpbnRlZ2VyLgogICAqCiAgICogUmV0dXJucyAwIGZvciB6ZXJvLCAtMSBmb3IgdmFsdWVzIGxlc3MgdGhhbiB6ZXJvIGFuZAogICAqICsxIGZvciB2YWx1ZXMgZ3JlYXRlciB0aGFuIHplcm8uCiAgICovCiAgaW50IGdldCBzaWduOwoKICAvLy8gV2hldGhlciB0aGlzIGJpZyBpbnRlZ2VyIGlzIGV2ZW4uCiAgYm9vbCBnZXQgaXNFdmVuOwoKICAvLy8gV2hldGhlciB0aGlzIGJpZyBpbnRlZ2VyIGlzIG9kZC4KICBib29sIGdldCBpc09kZDsKCiAgLy8vIFdoZXRoZXIgdGhpcyBudW1iZXIgaXMgbmVnYXRpdmUuCiAgYm9vbCBnZXQgaXNOZWdhdGl2ZTsKCiAgLyoqCiAgICogUmV0dXJucyBgdGhpc2AgdG8gdGhlIHBvd2VyIG9mIFtleHBvbmVudF0uCiAgICoKICAgKiBSZXR1cm5zIFtvbmVdIGlmIHRoZSBbZXhwb25lbnRdIGVxdWFscyAwLgogICAqCiAgICogVGhlIFtleHBvbmVudF0gbXVzdCBvdGhlcndpc2UgYmUgcG9zaXRpdmUuCiAgICoKICAgKiBUaGUgcmVzdWx0IGlzIGFsd2F5cyBlcXVhbCB0byB0aGUgbWF0aGVtYXRpY2FsIHJlc3VsdCBvZiB0aGlzIHRvIHRoZSBwb3dlcgogICAqIFtleHBvbmVudF0sIG9ubHkgbGltaXRlZCBieSB0aGUgYXZhaWxhYmxlIG1lbW9yeS4KICAgKi8KICBCaWdJbnQgcG93KGludCBleHBvbmVudCk7CgogIC8qKgogICAqIFJldHVybnMgdGhpcyBpbnRlZ2VyIHRvIHRoZSBwb3dlciBvZiBbZXhwb25lbnRdIG1vZHVsbyBbbW9kdWx1c10uCiAgICoKICAgKiBUaGUgW2V4cG9uZW50XSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgW21vZHVsdXNdIG11c3QgYmUKICAgKiBwb3NpdGl2ZS4KICAgKi8KICBCaWdJbnQgbW9kUG93KEJpZ0ludCBleHBvbmVudCwgQmlnSW50IG1vZHVsdXMpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBtb2R1bGFyIG11bHRpcGxpY2F0aXZlIGludmVyc2Ugb2YgdGhpcyBiaWcgaW50ZWdlcgogICAqIG1vZHVsbyBbbW9kdWx1c10uCiAgICoKICAgKiBUaGUgW21vZHVsdXNdIG11c3QgYmUgcG9zaXRpdmUuCiAgICoKICAgKiBJdCBpcyBhbiBlcnJvciBpZiBubyBtb2R1bGFyIGludmVyc2UgZXhpc3RzLgogICAqLwogIC8vIFJldHVybnMgMS90aGlzICUgbW9kdWx1cywgd2l0aCBtb2R1bHVzID4gMC4KICBCaWdJbnQgbW9kSW52ZXJzZShCaWdJbnQgbW9kdWx1cyk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIG9mIHRoaXMgYmlnIGludGVnZXIgYW5kIFtvdGhlcl0uCiAgICoKICAgKiBJZiBlaXRoZXIgbnVtYmVyIGlzIG5vbi16ZXJvLCB0aGUgcmVzdWx0IGlzIHRoZSBudW1lcmljYWxseSBncmVhdGVzdAogICAqIGludGVnZXIgZGl2aWRpbmcgYm90aCBgdGhpc2AgYW5kIGBvdGhlcmAuCiAgICoKICAgKiBUaGUgZ3JlYXRlc3QgY29tbW9uIGRpdmlzb3IgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIG9yZGVyLAogICAqIHNvIGB4LmdjZCh5KWAgaXMgIGFsd2F5cyB0aGUgc2FtZSBhcyBgeS5nY2QoeClgLgogICAqCiAgICogRm9yIGFueSBpbnRlZ2VyIGB4YCwgYHguZ2NkKHgpYCBpcyBgeC5hYnMoKWAuCiAgICoKICAgKiBJZiBib3RoIGB0aGlzYCBhbmQgYG90aGVyYCBpcyB6ZXJvLCB0aGUgcmVzdWx0IGlzIGFsc28gemVyby4KICAgKi8KICBCaWdJbnQgZ2NkKEJpZ0ludCBvdGhlcik7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGxlYXN0IHNpZ25pZmljYW50IFt3aWR0aF0gYml0cyBvZiB0aGlzIGJpZyBpbnRlZ2VyIGFzIGEKICAgKiBub24tbmVnYXRpdmUgbnVtYmVyIChpLmUuIHVuc2lnbmVkIHJlcHJlc2VudGF0aW9uKS4gIFRoZSByZXR1cm5lZCB2YWx1ZSBoYXMKICAgKiB6ZXJvcyBpbiBhbGwgYml0IHBvc2l0aW9ucyBoaWdoZXIgdGhhbiBbd2lkdGhdLgogICAqCiAgICogYGBgCiAgICogbmV3IEJpZ0ludC5mcm9tKC0xKS50b1Vuc2lnbmVkKDUpID09IDMxICAgLy8gMTExMTExMTEgIC0+ICAwMDAxMTExMQogICAqIGBgYAogICAqCiAgICogVGhpcyBvcGVyYXRpb24gY2FuIGJlIHVzZWQgdG8gc2ltdWxhdGUgYXJpdGhtZXRpYyBmcm9tIGxvdyBsZXZlbCBsYW5ndWFnZXMuCiAgICogRm9yIGV4YW1wbGUsIHRvIGluY3JlbWVudCBhbiA4IGJpdCBxdWFudGl0eToKICAgKgogICAqIGBgYAogICAqIHEgPSAocSArIDEpLnRvVW5zaWduZWQoOCk7CiAgICogYGBgCiAgICoKICAgKiBgcWAgd2lsbCBjb3VudCBmcm9tIGAwYCB1cCB0byBgMjU1YCBhbmQgdGhlbiB3cmFwIGFyb3VuZCB0byBgMGAuCiAgICoKICAgKiBJZiB0aGUgaW5wdXQgZml0cyBpbiBbd2lkdGhdIGJpdHMgd2l0aG91dCB0cnVuY2F0aW9uLCB0aGUgcmVzdWx0IGlzIHRoZQogICAqIHNhbWUgYXMgdGhlIGlucHV0LiAgVGhlIG1pbmltdW0gd2lkdGggbmVlZGVkIHRvIGF2b2lkIHRydW5jYXRpb24gb2YgYHhgIGlzCiAgICogZ2l2ZW4gYnkgYHguYml0TGVuZ3RoYCwgaS5lLgogICAqCiAgICogYGBgCiAgICogeCA9PSB4LnRvVW5zaWduZWQoeC5iaXRMZW5ndGgpOwogICAqIGBgYAogICAqLwogIEJpZ0ludCB0b1Vuc2lnbmVkKGludCB3aWR0aCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGxlYXN0IHNpZ25pZmljYW50IFt3aWR0aF0gYml0cyBvZiB0aGlzIGludGVnZXIsIGV4dGVuZGluZyB0aGUKICAgKiBoaWdoZXN0IHJldGFpbmVkIGJpdCB0byB0aGUgc2lnbi4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdHJ1bmNhdGluZyB0aGUgdmFsdWUKICAgKiB0byBmaXQgaW4gW3dpZHRoXSBiaXRzIHVzaW5nIGFuIHNpZ25lZCAyLXMgY29tcGxlbWVudCByZXByZXNlbnRhdGlvbi4gIFRoZQogICAqIHJldHVybmVkIHZhbHVlIGhhcyB0aGUgc2FtZSBiaXQgdmFsdWUgaW4gYWxsIHBvc2l0aW9ucyBoaWdoZXIgdGhhbiBbd2lkdGhdLgogICAqCiAgICogYGBgCiAgICogdmFyIGJpZzE1ID0gbmV3IEJpZ0ludC5mcm9tKDE1KTsKICAgKiB2YXIgYmlnMTYgPSBuZXcgQmlnSW50LmZyb20oMTYpOwogICAqIHZhciBiaWcyMzkgPSBuZXcgQmlnSW50LmZyb20oMjM5KTsKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVi0tc2lnbiBiaXQtVgogICAqIGJpZzE2LnRvU2lnbmVkKDUpID09IC1iaWcxNiAgIC8vICAwMDAxMDAwMCAtPiAxMTExMDAwMAogICAqIGJpZzIzOS50b1NpZ25lZCg1KSA9PSBiaWcxNSAgIC8vICAxMTEwMTExMSAtPiAwMDAwMTExMQogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICAgICAgICAgICBeCiAgICogYGBgCiAgICoKICAgKiBUaGlzIG9wZXJhdGlvbiBjYW4gYmUgdXNlZCB0byBzaW11bGF0ZSBhcml0aG1ldGljIGZyb20gbG93IGxldmVsIGxhbmd1YWdlcy4KICAgKiBGb3IgZXhhbXBsZSwgdG8gaW5jcmVtZW50IGFuIDggYml0IHNpZ25lZCBxdWFudGl0eToKICAgKgogICAqIGBgYAogICAqIHEgPSAocSArIDEpLnRvU2lnbmVkKDgpOwogICAqIGBgYAogICAqCiAgICogYHFgIHdpbGwgY291bnQgZnJvbSBgMGAgdXAgdG8gYDEyN2AsIHdyYXAgdG8gYC0xMjhgIGFuZCBjb3VudCBiYWNrIHVwIHRvCiAgICogYDEyN2AuCiAgICoKICAgKiBJZiB0aGUgaW5wdXQgdmFsdWUgZml0cyBpbiBbd2lkdGhdIGJpdHMgd2l0aG91dCB0cnVuY2F0aW9uLCB0aGUgcmVzdWx0IGlzCiAgICogdGhlIHNhbWUgYXMgdGhlIGlucHV0LiAgVGhlIG1pbmltdW0gd2lkdGggbmVlZGVkIHRvIGF2b2lkIHRydW5jYXRpb24gb2YgYHhgCiAgICogaXMgYHguYml0TGVuZ3RoICsgMWAsIGkuZS4KICAgKgogICAqIGBgYAogICAqIHggPT0geC50b1NpZ25lZCh4LmJpdExlbmd0aCArIDEpOwogICAqIGBgYAogICAqLwogIEJpZ0ludCB0b1NpZ25lZChpbnQgd2lkdGgpOwoKICAvKioKICAgKiBXaGV0aGVyIHRoaXMgYmlnIGludGVnZXIgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGFuIGBpbnRgIHdpdGhvdXQgbG9zaW5nCiAgICogcHJlY2lzaW9uLgogICAqCiAgICogV2FybmluZzogdGhpcyBmdW5jdGlvbiBtYXkgZ2l2ZSBhIGRpZmZlcmVudCByZXN1bHQgb24KICAgKiBkYXJ0MmpzLCBkZXYgY29tcGlsZXIsIGFuZCB0aGUgVk0sIGR1ZSB0byB0aGUgZGlmZmVyZW5jZXMgaW4KICAgKiBpbnRlZ2VyIHByZWNpc2lvbi4KICAgKi8KICBib29sIGdldCBpc1ZhbGlkSW50OwoKICAvKioKICAgKiBSZXR1cm5zIHRoaXMgW0JpZ0ludF0gYXMgYW4gW2ludF0uCiAgICoKICAgKiBJZiB0aGUgbnVtYmVyIGRvZXMgbm90IGZpdCwgY2xhbXBzIHRvIHRoZSBtYXggKG9yIG1pbikKICAgKiBpbnRlZ2VyLgogICAqCiAgICogV2FybmluZzogdGhlIGNsYW1waW5nIGJlaGF2ZXMgZGlmZmVyZW50bHkgb24gZGFydDJqcywgZGV2CiAgICogY29tcGlsZXIsIGFuZCB0aGUgVk0sIGR1ZSB0byB0aGUgZGlmZmVyZW5jZXMgaW4gaW50ZWdlcgogICAqIHByZWNpc2lvbi4KICAgKi8KICBpbnQgdG9JbnQoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGlzIFtCaWdJbnRdIGFzIGEgW2RvdWJsZV0uCiAgICoKICAgKiBJZiB0aGUgbnVtYmVyIGlzIG5vdCByZXByZXNlbnRhYmxlIGFzIGEgW2RvdWJsZV0sIGFuCiAgICogYXBwcm94aW1hdGlvbiBpcyByZXR1cm5lZC4gRm9yIG51bWVyaWNhbGx5IGxhcmdlIGludGVnZXJzLCB0aGUKICAgKiBhcHByb3hpbWF0aW9uIG1heSBiZSBpbmZpbml0ZS4KICAgKi8KICBkb3VibGUgdG9Eb3VibGUoKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIFN0cmluZy1yZXByZXNlbnRhdGlvbiBvZiB0aGlzIGludGVnZXIuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIHBhcnNhYmxlIGJ5IFtwYXJzZV0uCiAgICogRm9yIGFueSBgQmlnSW50YCBgaWAsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdAogICAqIGBpID09IEJpZ0ludC5wYXJzZShpLnRvU3RyaW5nKCkpYC4KICAgKi8KICBTdHJpbmcgdG9TdHJpbmcoKTsKCiAgLyoqCiAgICogQ29udmVydHMgW3RoaXNdIHRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGluIHRoZSBnaXZlbiBbcmFkaXhdLgogICAqCiAgICogSW4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiwgbG93ZXItY2FzZSBsZXR0ZXJzIGFyZSB1c2VkIGZvciBkaWdpdHMgYWJvdmUKICAgKiAnOScsIHdpdGggJ2EnIGJlaW5nIDEwIGFuICd6JyBiZWluZyAzNS4KICAgKgogICAqIFRoZSBbcmFkaXhdIGFyZ3VtZW50IG11c3QgYmUgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2UgMiB0byAzNi4KICAgKi8KICBTdHJpbmcgdG9SYWRpeFN0cmluZyhpbnQgcmFkaXgpOwp9CoGgAE5OPAETAQQhBDYjIiIBBkwMBUdBBUFHSSQFT05QKQU6NQVQJAY8AQZMDAVLCwY/AUArAQYxBUYGEAEGMAVMKgYXARkjARwjAR8jARkjAQYjBU8FQQUPCSUlICEhKCkoCQYkAQYgBVBILgU8BUMGIwEGTAUxLFEGIgEGQgVLKQVISwsFMgYnAQZDBUhAGgUyBicBBhwFTE0dBUYhBiMBBhsFTE8bBUQnBiMBBiUFTE0pBUUnBiMBBiMFRjgFLAYXASghATEiASshATQiAQYfBVBFBh8BBkwFTk5OBU0qBQklBTY2NjY2NjY2CQYVAQYrBTomBhABKBMBJxIBJxcBBjAFLwUwBVA3BhwBBkcFPw8GMgEGRBcFJQUyBjElAQZKBUovBT42BTMFQgYcAQZJUTUFCUkJBVEyBQkgCQVGBU1QIgUJJQkGIAEGT1FQUQUJJiYoODw8OAkFUTkFCR4JBU4MBU9RIAUJJwkGHgEGTBAFO0IYBhcBBigFPA4FPz0QBg8BBioFOkQkBhUBBjYFMTEoBhUBBkYFUC0FQwYjAgEVZGFydDpjb3JlL2JpZ2ludC5kYXJ0Km9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL2Jvb2wuZGFydIq9Ly8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLyoqCiAqIFRoZSByZXNlcnZlZCB3b3JkcyBgdHJ1ZWAgYW5kIGBmYWxzZWAgZGVub3RlIG9iamVjdHMgdGhhdCBhcmUgdGhlIG9ubHkgdHdvCiAqIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLgogKgogKiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBmb3IgYSBjbGFzcyB0byBhdHRlbXB0IHRvIGV4dGVuZCBvciBpbXBsZW1lbnQKICogYm9vbC4KICovCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgYm9vbCB7CiAgLyoqCiAgICogUmV0dXJucyB0aGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgZGVjbGFyYXRpb24gW25hbWVdLgogICAqCiAgICogVGhlIGJvb2xlYW4gdmFsdWUgb2YgdGhlIGRlY2xhcmF0aW9uIGlzIGB0cnVlYCBpZiB0aGUgZGVjbGFyZWQgdmFsdWUgaXMKICAgKiB0aGUgc3RyaW5nIGAidHJ1ZSJgLCBhbmQgYGZhbHNlYCBpZiB0aGUgdmFsdWUgaXMgYCJmYWxzZSJgLgogICAqCiAgICogSW4gYWxsIG90aGVyIGNhc2VzLCBpbmNsdWRpbmcgd2hlbiB0aGVyZSBpcyBubyBkZWNsYXJhdGlvbiBmb3IgYG5hbWVgLAogICAqIHRoZSByZXN1bHQgaXMgdGhlIFtkZWZhdWx0VmFsdWVdLgogICAqCiAgICogVGhlIHJlc3VsdCBpcyB0aGUgc2FtZSBhcyB3b3VsZCBiZSByZXR1cm5lZCBieToKICAgKiBgYGBkYXJ0CiAgICogKGNvbnN0IFN0cmluZy5mcm9tRW52aXJvbm1lbnQobmFtZSkgPT0gInRydWUiKQogICAqICAgICA/IHRydWUKICAgKiAgICAgOiAoY29uc3QgU3RyaW5nLmZyb21FbnZpcm9ubWVudChuYW1lKSA9PSAiZmFsc2UiKQogICAqICAgICAgICAgPyBmYWxzZQogICAqICAgICAgICAgOiBkZWZhdWx0VmFsdWUKICAgKiBgYGAKICAgKiBFeGFtcGxlOgogICAqIGBgYGRhcnQKICAgKiBjb25zdCBsb2dnaW5nRmxhZyA9IGNvbnN0IGJvb2wuZnJvbUVudmlyb25tZW50KCJsb2dnaW5nIik7CiAgICogYGBgCiAgICogSWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IHRydXRoLXN0cmluZyB0aGFuIGAidHJ1ZSJgLCB5b3UgY2FuIHVzZSB0aGUKICAgKiBbU3RyaW5nLmZyb21FbnZpcm9ubWVudF0gY29uc3RydWN0b3IgZGlyZWN0bHk6CiAgICogYGBgZGFydAogICAqIGNvbnN0IGlzTG9nZ2luZ09uID0gKGNvbnN0IFN0cmluZy5mcm9tRW52aXJvbm1lbnQoImxvZ2dpbmciKSA9PSAib24iKTsKICAgKiBgYGAKICAgKi8KICAvLyBUaGUgLmZyb21FbnZpcm9ubWVudCgpIGNvbnN0cnVjdG9ycyBhcmUgc3BlY2lhbCBpbiB0aGF0IHdlIGRvIG5vdCB3YW50CiAgLy8gdXNlcnMgdG8gY2FsbCB0aGVtIHVzaW5nICJuZXciLiBXZSBwcm9oaWJpdCB0aGF0IGJ5IGdpdmluZyB0aGVtIGJvZGllcwogIC8vIHRoYXQgdGhyb3csIGV2ZW4gdGhvdWdoIGNvbnN0IGNvbnN0cnVjdG9ycyBhcmUgbm90IGFsbG93ZWQgdG8gaGF2ZSBib2RpZXMuCiAgLy8gRGlzYWJsZSB0aG9zZSBzdGF0aWMgZXJyb3JzLgogIC8vaWdub3JlOiBjb25zdF9jb25zdHJ1Y3Rvcl93aXRoX2JvZHkKICAvL2lnbm9yZTogY29uc3RfZmFjdG9yeQogIGV4dGVybmFsIGNvbnN0IGZhY3RvcnkgYm9vbC5mcm9tRW52aXJvbm1lbnQoU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIGRlZmF1bHRWYWx1ZSA9IGZhbHNlfSk7CgogIGV4dGVybmFsIGludCBnZXQgaGFzaENvZGU7CgogIC8vLyBUaGUgbG9naWNhbCBjb25qdW5jdGlvbiAoImFuZCIpIG9mIHRoaXMgYW5kIFtvdGhlcl0uCiAgLy8vCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIGJvdGggdGhpcyBhbmQgW290aGVyXSBhcmUgYHRydWVgLCBhbmQgYGZhbHNlYCBvdGhlcndpc2UuCiAgLy9UT0RPKGxybik6IFJlbW92ZSAiYXMgYm9vbCIgaW4gRGFydCAyLgogIEBTaW5jZSgiMi4xIikKICBib29sIG9wZXJhdG9yICYoYm9vbCBvdGhlcikgPT4gKG90aGVyIGFzIGJvb2wpICYmIHRoaXM7CgogIC8vLyBUaGUgbG9naWNhbCBkaXNqdW5jdGlvbiAoImluY2x1c2l2ZSBvciIpIG9mIHRoaXMgYW5kIFtvdGhlcl0uCiAgLy8vCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIGVpdGhlciB0aGlzIG9yIFtvdGhlcl0gaXMgYHRydWVgLCBhbmQgYGZhbHNlYCBvdGhlcndpc2UuCiAgQFNpbmNlKCIyLjEiKQogIGJvb2wgb3BlcmF0b3IgfChib29sIG90aGVyKSA9PiAob3RoZXIgYXMgYm9vbCkgfHwgdGhpczsKCiAgLy8vIFRoZSBsb2dpY2FsIGV4Y2x1c2l2ZSBkaXNqdW5jdGlvbiAoImV4Y2x1c2l2ZSBvciIpIG9mIHRoaXMgYW5kIFtvdGhlcl0uCiAgLy8vCiAgLy8vIFJldHVybnMgd2hldGhlciB0aGlzIGFuZCBbb3RoZXJdIGFyZSBuZWl0aGVyIGJvdGggYHRydWVgIG5vciBib3RoIGBmYWxzZWAuCiAgQFNpbmNlKCIyLjEiKQogIGJvb2wgb3BlcmF0b3IgXihib29sIG90aGVyKSA9PiAhKG90aGVyIGFzIGJvb2wpID09IHRoaXM7CgogIC8qKgogICAqIFJldHVybnMgZWl0aGVyIGAidHJ1ZSJgIGZvciBgdHJ1ZWAgYW5kIGAiZmFsc2UiYCBmb3IgYGZhbHNlYC4KICAgKi8KICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gdGhpcyA/ICJ0cnVlIiA6ICJmYWxzZSI7CiAgfQp9ClEATk48ARMBBE4cA0wJBBoNBkYFTUEFTCcFNQ00EDsVHAkODUAJUDQNTAkGTExQIigaOyQBHQE7BlErEDoBRAZREDoBTgZREDsBBkMGFiQEAgETZGFydDpjb3JlL2Jvb2wuZGFydC9vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2Jvb2xfcGF0Y2guZGFydIIMLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvcmVfcGF0Y2guZGFydCI7CgpAcGF0Y2gKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBib29sIHsKICBAcGF0Y2gKICBjb25zdCBmYWN0b3J5IGJvb2wuZnJvbUVudmlyb25tZW50KFN0cmluZyBuYW1lLCB7Ym9vbCBkZWZhdWx0VmFsdWU6IGZhbHNlfSkKICAgICAgbmF0aXZlICJCb29sX2Zyb21FbnZpcm9ubWVudCI7CgogIEBwYXRjaAogIGludCBnZXQgaGFzaENvZGUgPT4gdGhpcyA/IDEyMzEgOiAxMjM3OwoKICBpbnQgZ2V0IF9pZGVudGl0eUhhc2hDb2RlID0+IHRoaXMgPyAxMjMxIDogMTIzNzsKfQoUAE5OPAEeAQcaDQlOJQEJKgEzAgEfZGFydDpjb3JlLXBhdGNoL2Jvb2xfcGF0Y2guZGFydC9vcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS9kYXRlX3RpbWUuZGFydMAAa/AvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogQW4gaW5zdGFudCBpbiB0aW1lLCBzdWNoIGFzIEp1bHkgMjAsIDE5NjksIDg6MThwbSBHTVQuCiAqCiAqIERhdGVUaW1lcyBjYW4gcmVwcmVzZW50IHRpbWUgdmFsdWVzIHRoYXQgYXJlIGF0IGEgZGlzdGFuY2Ugb2YgYXQgbW9zdAogKiAxMDAsMDAwLDAwMCBkYXlzIGZyb20gZXBvY2ggKDE5NzAtMDEtMDEgVVRDKTogLTI3MTgyMS0wNC0yMCB0byAyNzU3NjAtMDktMTMuCiAqCiAqIENyZWF0ZSBhIERhdGVUaW1lIG9iamVjdCBieSB1c2luZyBvbmUgb2YgdGhlIGNvbnN0cnVjdG9ycwogKiBvciBieSBwYXJzaW5nIGEgY29ycmVjdGx5IGZvcm1hdHRlZCBzdHJpbmcsCiAqIHdoaWNoIGNvbXBsaWVzIHdpdGggYSBzdWJzZXQgb2YgSVNPIDg2MDEuCiAqIE5vdGUgdGhhdCBob3VycyBhcmUgc3BlY2lmaWVkIGJldHdlZW4gMCBhbmQgMjMsCiAqIGFzIGluIGEgMjQtaG91ciBjbG9jay4KICogRm9yIGV4YW1wbGU6CiAqCiAqIGBgYAogKiB2YXIgbm93ID0gbmV3IERhdGVUaW1lLm5vdygpOwogKiB2YXIgYmVybGluV2FsbEZlbGwgPSBuZXcgRGF0ZVRpbWUudXRjKDE5ODksIDExLCA5KTsKICogdmFyIG1vb25MYW5kaW5nID0gRGF0ZVRpbWUucGFyc2UoIjE5NjktMDctMjAgMjA6MTg6MDRaIik7ICAvLyA4OjE4cG0KICogYGBgCiAqCiAqIEEgRGF0ZVRpbWUgb2JqZWN0IGlzIGFuY2hvcmVkIGVpdGhlciBpbiB0aGUgVVRDIHRpbWUgem9uZQogKiBvciBpbiB0aGUgbG9jYWwgdGltZSB6b25lIG9mIHRoZSBjdXJyZW50IGNvbXB1dGVyCiAqIHdoZW4gdGhlIG9iamVjdCBpcyBjcmVhdGVkLgogKgogKiBPbmNlIGNyZWF0ZWQsIG5laXRoZXIgdGhlIHZhbHVlIG5vciB0aGUgdGltZSB6b25lCiAqIG9mIGEgRGF0ZVRpbWUgb2JqZWN0IG1heSBiZSBjaGFuZ2VkLgogKgogKiBZb3UgY2FuIHVzZSBwcm9wZXJ0aWVzIHRvIGdldAogKiB0aGUgaW5kaXZpZHVhbCB1bml0cyBvZiBhIERhdGVUaW1lIG9iamVjdC4KICoKICogYGBgCiAqIGFzc2VydChiZXJsaW5XYWxsRmVsbC5tb250aCA9PSAxMSk7CiAqIGFzc2VydChtb29uTGFuZGluZy5ob3VyID09IDIwKTsKICogYGBgCiAqCiAqIEZvciBjb252ZW5pZW5jZSBhbmQgcmVhZGFiaWxpdHksCiAqIHRoZSBEYXRlVGltZSBjbGFzcyBwcm92aWRlcyBhIGNvbnN0YW50IGZvciBlYWNoIGRheSBhbmQgbW9udGgKICogbmFtZSAtIGZvciBleGFtcGxlLCBbYXVndXN0XSBhbmQgW2ZyaWRheV0uCiAqIFlvdSBjYW4gdXNlIHRoZXNlIGNvbnN0YW50cyB0byBpbXByb3ZlIGNvZGUgcmVhZGFiaWxpdHk6CiAqCiAqIGBgYAogKiB2YXIgYmVybGluV2FsbEZlbGwgPSBuZXcgRGF0ZVRpbWUudXRjKDE5ODksIERhdGVUaW1lLm5vdmVtYmVyLCA5KTsKICogYXNzZXJ0KGJlcmxpbldhbGxGZWxsLndlZWtkYXkgPT0gRGF0ZVRpbWUudGh1cnNkYXkpOwogKiBgYGAKICoKICogRGF5IGFuZCBtb250aCB2YWx1ZXMgYmVnaW4gYXQgMSwgYW5kIHRoZSB3ZWVrIHN0YXJ0cyBvbiBNb25kYXkuCiAqIFRoYXQgaXMsIHRoZSBjb25zdGFudHMgW2phbnVhcnldIGFuZCBbbW9uZGF5XSBhcmUgYm90aCAxLgogKgogKiAjIyBXb3JraW5nIHdpdGggVVRDIGFuZCBsb2NhbCB0aW1lCiAqCiAqIEEgRGF0ZVRpbWUgb2JqZWN0IGlzIGluIHRoZSBsb2NhbCB0aW1lIHpvbmUKICogdW5sZXNzIGV4cGxpY2l0bHkgY3JlYXRlZCBpbiB0aGUgVVRDIHRpbWUgem9uZS4KICoKICogYGBgCiAqIHZhciBkRGF5ID0gbmV3IERhdGVUaW1lLnV0YygxOTQ0LCA2LCA2KTsKICogYGBgCiAqCiAqIFVzZSBbaXNVdGNdIHRvIGRldGVybWluZSB3aGV0aGVyIGEgRGF0ZVRpbWUgb2JqZWN0IGlzIGJhc2VkIGluIFVUQy4KICogVXNlIHRoZSBtZXRob2RzIFt0b0xvY2FsXSBhbmQgW3RvVXRjXQogKiB0byBnZXQgdGhlIGVxdWl2YWxlbnQgZGF0ZS90aW1lIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgb3RoZXIgdGltZSB6b25lLgogKiBVc2UgW3RpbWVab25lTmFtZV0gdG8gZ2V0IGFuIGFiYnJldmlhdGVkIG5hbWUgb2YgdGhlIHRpbWUgem9uZQogKiBmb3IgdGhlIERhdGVUaW1lIG9iamVjdC4KICogVG8gZmluZCB0aGUgZGlmZmVyZW5jZQogKiBiZXR3ZWVuIFVUQyBhbmQgdGhlIHRpbWUgem9uZSBvZiBhIERhdGVUaW1lIG9iamVjdAogKiBjYWxsIFt0aW1lWm9uZU9mZnNldF0uCiAqCiAqICMjIENvbXBhcmluZyBEYXRlVGltZSBvYmplY3RzCiAqCiAqIFRoZSBEYXRlVGltZSBjbGFzcyBjb250YWlucyBzZXZlcmFsIGhhbmR5IG1ldGhvZHMsCiAqIHN1Y2ggYXMgW2lzQWZ0ZXJdLCBbaXNCZWZvcmVdLCBhbmQgW2lzQXRTYW1lTW9tZW50QXNdLAogKiBmb3IgY29tcGFyaW5nIERhdGVUaW1lIG9iamVjdHMuCiAqCiAqIGBgYAogKiBhc3NlcnQoYmVybGluV2FsbEZlbGwuaXNBZnRlcihtb29uTGFuZGluZykgPT0gdHJ1ZSk7CiAqIGFzc2VydChiZXJsaW5XYWxsRmVsbC5pc0JlZm9yZShtb29uTGFuZGluZykgPT0gZmFsc2UpOwogKiBgYGAKICoKICogIyMgVXNpbmcgRGF0ZVRpbWUgd2l0aCBEdXJhdGlvbgogKgogKiBVc2UgdGhlIFthZGRdIGFuZCBbc3VidHJhY3RdIG1ldGhvZHMgd2l0aCBhIFtEdXJhdGlvbl0gb2JqZWN0CiAqIHRvIGNyZWF0ZSBhIG5ldyBEYXRlVGltZSBvYmplY3QgYmFzZWQgb24gYW5vdGhlci4KICogRm9yIGV4YW1wbGUsIHRvIGZpbmQgdGhlIGRhdGUgdGhhdCBpcyBzaXh0eSBkYXlzICgyNCAqIDYwIGhvdXJzKSBhZnRlciB0b2RheSwKICogd3JpdGU6CiAqCiAqIGBgYAogKiB2YXIgbm93ID0gbmV3IERhdGVUaW1lLm5vdygpOwogKiB2YXIgc2l4dHlEYXlzRnJvbU5vdyA9IG5vdy5hZGQobmV3IER1cmF0aW9uKGRheXM6IDYwKSk7CiAqIGBgYAogKgogKiBUbyBmaW5kIG91dCBob3cgbXVjaCB0aW1lIGlzIGJldHdlZW4gdHdvIERhdGVUaW1lIG9iamVjdHMgdXNlCiAqIFtkaWZmZXJlbmNlXSwgd2hpY2ggcmV0dXJucyBhIFtEdXJhdGlvbl0gb2JqZWN0OgogKgogKiBgYGAKICogdmFyIGRpZmZlcmVuY2UgPSBiZXJsaW5XYWxsRmVsbC5kaWZmZXJlbmNlKG1vb25MYW5kaW5nKTsKICogYXNzZXJ0KGRpZmZlcmVuY2UuaW5EYXlzID09IDc0MTYpOwogKiBgYGAKICoKICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZGF0ZXMgaW4gZGlmZmVyZW50IHRpbWUgem9uZXMKICogaXMganVzdCB0aGUgbnVtYmVyIG9mIG5hbm9zZWNvbmRzIGJldHdlZW4gdGhlIHR3byBwb2ludHMgaW4gdGltZS4KICogSXQgZG9lc24ndCB0YWtlIGNhbGVuZGFyIGRheXMgaW50byBhY2NvdW50LgogKiBUaGF0IG1lYW5zIHRoYXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gbWlkbmlnaHRzIGluIGxvY2FsIHRpbWUgbWF5IGJlCiAqIGxlc3MgdGhhbiAyNCBob3VycyB0aW1lcyB0aGUgbnVtYmVyIG9mIGRheXMgYmV0d2VlbiB0aGVtLAogKiBpZiB0aGVyZSBpcyBhIGRheWxpZ2h0IHNhdmluZyBjaGFuZ2UgaW4gYmV0d2Vlbi4KICogSWYgdGhlIGRpZmZlcmVuY2UgYWJvdmUgaXMgY2FsY3VsYXRlZCB1c2luZyBBdXN0cmFsaWFuIGxvY2FsIHRpbWUsIHRoZQogKiBkaWZmZXJlbmNlIGlzIDc0MTUgZGF5cyBhbmQgMjMgaG91cnMsIHdoaWNoIGlzIG9ubHkgNzQxNSB3aG9sZSBkYXlzIGFzCiAqIHJlcG9ydGVkIGJ5IGBpbkRheXNgLgogKgogKiAjIyBPdGhlciByZXNvdXJjZXMKICoKICogU2VlIFtEdXJhdGlvbl0gdG8gcmVwcmVzZW50IGEgc3BhbiBvZiB0aW1lLgogKiBTZWUgW1N0b3B3YXRjaF0gdG8gbWVhc3VyZSB0aW1lc3BhbnMuCiAqCiAqIFRoZSBEYXRlVGltZSBjbGFzcyBkb2VzIG5vdCBwcm92aWRlIGludGVybmF0aW9uYWxpemF0aW9uLgogKiBUbyBpbnRlcm5hdGlvbmFsaXplIHlvdXIgY29kZSwgdXNlCiAqIHRoZSBbaW50bF0oaHR0cHM6Ly9wdWIuZGFydGxhbmcub3JnL3BhY2thZ2VzL2ludGwpIHBhY2thZ2UuCiAqCiAqLwpjbGFzcyBEYXRlVGltZSBpbXBsZW1lbnRzIENvbXBhcmFibGU8RGF0ZVRpbWU+IHsKICAvLyBXZWVrZGF5IGNvbnN0YW50cyB0aGF0IGFyZSByZXR1cm5lZCBieSBbd2Vla2RheV0gbWV0aG9kOgogIHN0YXRpYyBjb25zdCBpbnQgbW9uZGF5ID0gMTsKICBzdGF0aWMgY29uc3QgaW50IHR1ZXNkYXkgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgd2VkbmVzZGF5ID0gMzsKICBzdGF0aWMgY29uc3QgaW50IHRodXJzZGF5ID0gNDsKICBzdGF0aWMgY29uc3QgaW50IGZyaWRheSA9IDU7CiAgc3RhdGljIGNvbnN0IGludCBzYXR1cmRheSA9IDY7CiAgc3RhdGljIGNvbnN0IGludCBzdW5kYXkgPSA3OwogIHN0YXRpYyBjb25zdCBpbnQgZGF5c1BlcldlZWsgPSA3OwoKICAvLyBNb250aCBjb25zdGFudHMgdGhhdCBhcmUgcmV0dXJuZWQgYnkgdGhlIFttb250aF0gZ2V0dGVyLgogIHN0YXRpYyBjb25zdCBpbnQgamFudWFyeSA9IDE7CiAgc3RhdGljIGNvbnN0IGludCBmZWJydWFyeSA9IDI7CiAgc3RhdGljIGNvbnN0IGludCBtYXJjaCA9IDM7CiAgc3RhdGljIGNvbnN0IGludCBhcHJpbCA9IDQ7CiAgc3RhdGljIGNvbnN0IGludCBtYXkgPSA1OwogIHN0YXRpYyBjb25zdCBpbnQganVuZSA9IDY7CiAgc3RhdGljIGNvbnN0IGludCBqdWx5ID0gNzsKICBzdGF0aWMgY29uc3QgaW50IGF1Z3VzdCA9IDg7CiAgc3RhdGljIGNvbnN0IGludCBzZXB0ZW1iZXIgPSA5OwogIHN0YXRpYyBjb25zdCBpbnQgb2N0b2JlciA9IDEwOwogIHN0YXRpYyBjb25zdCBpbnQgbm92ZW1iZXIgPSAxMTsKICBzdGF0aWMgY29uc3QgaW50IGRlY2VtYmVyID0gMTI7CiAgc3RhdGljIGNvbnN0IGludCBtb250aHNQZXJZZWFyID0gMTI7CgogIC8qKgogICAqIFRoZSB2YWx1ZSBvZiB0aGlzIERhdGVUaW1lLgogICAqCiAgICogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWVsZCBpcyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuIE9uIEphdmFTY3JpcHQgaXQgaXMKICAgKiBlcXVhbCB0byBbbWlsbGlzZWNvbmRzU2luY2VFcG9jaF0uIE9uIHRoZSBWTSBpdCBpcyBlcXVhbCB0bwogICAqIFttaWNyb3NlY29uZHNTaW5jZUVwb2NoXS4KICAgKi8KICBmaW5hbCBpbnQgX3ZhbHVlOwoKICAvKioKICAgKiBUcnVlIGlmIHRoaXMgW0RhdGVUaW1lXSBpcyBzZXQgdG8gVVRDIHRpbWUuCiAgICoKICAgKiBgYGAKICAgKiB2YXIgZERheSA9IG5ldyBEYXRlVGltZS51dGMoMTk0NCwgNiwgNik7CiAgICogYXNzZXJ0KGREYXkuaXNVdGMpOwogICAqIGBgYAogICAqCiAgICovCiAgZmluYWwgYm9vbCBpc1V0YzsKCiAgLyoqCiAgICogQ29uc3RydWN0cyBhIFtEYXRlVGltZV0gaW5zdGFuY2Ugc3BlY2lmaWVkIGluIHRoZSBsb2NhbCB0aW1lIHpvbmUuCiAgICoKICAgKiBGb3IgZXhhbXBsZSwKICAgKiB0byBjcmVhdGUgYSBuZXcgRGF0ZVRpbWUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgN3RoIG9mIFNlcHRlbWJlciAyMDE3LAogICAqIDU6MzBwbQogICAqCiAgICogYGBgCiAgICogdmFyIGRlbnRpc3RBcHBvaW50bWVudCA9IG5ldyBEYXRlVGltZSgyMDE3LCA5LCA3LCAxNywgMzApOwogICAqIGBgYAogICAqLwogIERhdGVUaW1lKGludCB5ZWFyLAogICAgICBbaW50IG1vbnRoID0gMSwKICAgICAgaW50IGRheSA9IDEsCiAgICAgIGludCBob3VyID0gMCwKICAgICAgaW50IG1pbnV0ZSA9IDAsCiAgICAgIGludCBzZWNvbmQgPSAwLAogICAgICBpbnQgbWlsbGlzZWNvbmQgPSAwLAogICAgICBpbnQgbWljcm9zZWNvbmQgPSAwXSkKICAgICAgOiB0aGlzLl9pbnRlcm5hbCh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQsCiAgICAgICAgICAgIG1pY3Jvc2Vjb25kLCBmYWxzZSk7CgogIC8qKgogICAqIENvbnN0cnVjdHMgYSBbRGF0ZVRpbWVdIGluc3RhbmNlIHNwZWNpZmllZCBpbiB0aGUgVVRDIHRpbWUgem9uZS4KICAgKgogICAqIGBgYAogICAqIHZhciBtb29uTGFuZGluZyA9IG5ldyBEYXRlVGltZS51dGMoMTk2OSwgNywgMjAsIDIwLCAxOCwgMDQpOwogICAqIGBgYAogICAqCiAgICogV2hlbiBkZWFsaW5nIHdpdGggZGF0ZXMgb3IgaGlzdG9yaWMgZXZlbnRzIHByZWZlciB0byB1c2UgVVRDIERhdGVUaW1lcywKICAgKiBzaW5jZSB0aGV5IGFyZSB1bmFmZmVjdGVkIGJ5IGRheWxpZ2h0LXNhdmluZyBjaGFuZ2VzIGFuZCBhcmUgdW5hZmZlY3RlZAogICAqIGJ5IHRoZSBsb2NhbCB0aW1lem9uZS4KICAgKi8KICBEYXRlVGltZS51dGMoaW50IHllYXIsCiAgICAgIFtpbnQgbW9udGggPSAxLAogICAgICBpbnQgZGF5ID0gMSwKICAgICAgaW50IGhvdXIgPSAwLAogICAgICBpbnQgbWludXRlID0gMCwKICAgICAgaW50IHNlY29uZCA9IDAsCiAgICAgIGludCBtaWxsaXNlY29uZCA9IDAsCiAgICAgIGludCBtaWNyb3NlY29uZCA9IDBdKQogICAgICA6IHRoaXMuX2ludGVybmFsKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCwKICAgICAgICAgICAgbWljcm9zZWNvbmQsIHRydWUpOwoKICAvKioKICAgKiBDb25zdHJ1Y3RzIGEgW0RhdGVUaW1lXSBpbnN0YW5jZSB3aXRoIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBpbiB0aGUKICAgKiBsb2NhbCB0aW1lIHpvbmUuCiAgICoKICAgKiBgYGAKICAgKiB2YXIgdGhpc0luc3RhbnQgPSBuZXcgRGF0ZVRpbWUubm93KCk7CiAgICogYGBgCiAgICovCiAgRGF0ZVRpbWUubm93KCkgOiB0aGlzLl9ub3coKTsKCiAgLyoqCiAgICogQ29uc3RydWN0cyBhIG5ldyBbRGF0ZVRpbWVdIGluc3RhbmNlIGJhc2VkIG9uIFtmb3JtYXR0ZWRTdHJpbmddLgogICAqCiAgICogVGhlIFtmb3JtYXR0ZWRTdHJpbmddIG11c3Qgbm90IGJlIGBudWxsYC4KICAgKiBUaHJvd3MgYSBbRm9ybWF0RXhjZXB0aW9uXSBpZiB0aGUgaW5wdXQgc3RyaW5nIGNhbm5vdCBiZSBwYXJzZWQuCiAgICoKICAgKiBUaGUgZnVuY3Rpb24gcGFyc2VzIGEgc3Vic2V0IG9mIElTTyA4NjAxCiAgICogd2hpY2ggaW5jbHVkZXMgdGhlIHN1YnNldCBhY2NlcHRlZCBieSBSRkMgMzMzOS4KICAgKgogICAqIFRoZSBhY2NlcHRlZCBpbnB1dHMgYXJlIGN1cnJlbnRseToKICAgKgogICAqICogQSBkYXRlOiBBIHNpZ25lZCBmb3VyLXRvLXNpeCBkaWdpdCB5ZWFyLCB0d28gZGlnaXQgbW9udGggYW5kCiAgICogICB0d28gZGlnaXQgZGF5LCBvcHRpb25hbGx5IHNlcGFyYXRlZCBieSBgLWAgY2hhcmFjdGVycy4KICAgKiAgIEV4YW1wbGVzOiAiMTk3MDAxMDEiLCAiLTAwMDQtMTItMjQiLCAiODEwMzAtMDQtMDEiLgogICAqICogQW4gb3B0aW9uYWwgdGltZSBwYXJ0LCBzZXBhcmF0ZWQgZnJvbSB0aGUgZGF0ZSBieSBlaXRoZXIgYFRgIG9yIGEgc3BhY2UuCiAgICogICBUaGUgdGltZSBwYXJ0IGlzIGEgdHdvIGRpZ2l0IGhvdXIsCiAgICogICB0aGVuIG9wdGlvbmFsbHkgYSB0d28gZGlnaXQgbWludXRlcyB2YWx1ZSwKICAgKiAgIHRoZW4gb3B0aW9uYWxseSBhIHR3byBkaWdpdCBzZWNvbmRzIHZhbHVlLCBhbmQKICAgKiAgIHRoZW4gb3B0aW9uYWxseSBhICcuJyBvciAnLCcgZm9sbG93ZWQgYnkgYSBvbmUtdG8tc2l4IGRpZ2l0IHNlY29uZCBmcmFjdGlvbi4KICAgKiAgIFRoZSBtaW51dGVzIGFuZCBzZWNvbmRzIG1heSBiZSBzZXBhcmF0ZWQgZnJvbSB0aGUgcHJldmlvdXMgcGFydHMgYnkgYQogICAqICAgJzonLgogICAqICAgRXhhbXBsZXM6ICIxMiIsICIxMjozMDoyNC4xMjQiLCAiMTI6MzA6MjQsMTI0IiwgIjEyMzAxMC41MCIuCiAgICogKiBBbiBvcHRpb25hbCB0aW1lLXpvbmUgb2Zmc2V0IHBhcnQsCiAgICogICBwb3NzaWJseSBzZXBhcmF0ZWQgZnJvbSB0aGUgcHJldmlvdXMgYnkgYSBzcGFjZS4KICAgKiAgIFRoZSB0aW1lIHpvbmUgaXMgZWl0aGVyICd6JyBvciAnWicsIG9yIGl0IGlzIGEgc2lnbmVkIHR3byBkaWdpdCBob3VyCiAgICogICBwYXJ0IGFuZCBhbiBvcHRpb25hbCB0d28gZGlnaXQgbWludXRlIHBhcnQuIFRoZSBzaWduIG11c3QgYmUgZWl0aGVyCiAgICogICAiKyIgb3IgIi0iLCBhbmQgY2FuIG5vdCBiZSBvbWl0dGVkLgogICAqICAgVGhlIG1pbnV0ZXMgbWF5IGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBob3VycyBieSBhICc6Jy4KICAgKiAgIEV4YW1wbGVzOiAiWiIsICItMTAiLCAiMDE6MzAiLCAiMTEzMCIuCiAgICoKICAgKiBUaGlzIGluY2x1ZGVzIHRoZSBvdXRwdXQgb2YgYm90aCBbdG9TdHJpbmddIGFuZCBbdG9Jc284NjAxU3RyaW5nXSwgd2hpY2gKICAgKiB3aWxsIGJlIHBhcnNlZCBiYWNrIGludG8gYSBgRGF0ZVRpbWVgIG9iamVjdCB3aXRoIHRoZSBzYW1lIHRpbWUgYXMgdGhlCiAgICogb3JpZ2luYWwuCiAgICoKICAgKiBUaGUgcmVzdWx0IGlzIGFsd2F5cyBpbiBlaXRoZXIgbG9jYWwgdGltZSBvciBVVEMuCiAgICogSWYgYSB0aW1lIHpvbmUgb2Zmc2V0IG90aGVyIHRoYW4gVVRDIGlzIHNwZWNpZmllZCwKICAgKiB0aGUgdGltZSBpcyBjb252ZXJ0ZWQgdG8gdGhlIGVxdWl2YWxlbnQgVVRDIHRpbWUuCiAgICoKICAgKiBFeGFtcGxlcyBvZiBhY2NlcHRlZCBzdHJpbmdzOgogICAqCiAgICogKiBgIjIwMTItMDItMjcgMTM6Mjc6MDAiYAogICAqICogYCIyMDEyLTAyLTI3IDEzOjI3OjAwLjEyMzQ1NnoiYAogICAqICogYCIyMDEyLTAyLTI3IDEzOjI3OjAwLDEyMzQ1NnoiYAogICAqICogYCIyMDEyMDIyNyAxMzoyNzowMCJgCiAgICogKiBgIjIwMTIwMjI3VDEzMjcwMCJgCiAgICogKiBgIjIwMTIwMjI3ImAKICAgKiAqIGAiKzIwMTIwMjI3ImAKICAgKiAqIGAiMjAxMi0wMi0yN1QxNFoiYAogICAqICogYCIyMDEyLTAyLTI3VDE0KzAwOjAwImAKICAgKiAqIGAiLTEyMzQ1MDEwMSAwMDowMDowMCBaImA6IGluIHRoZSB5ZWFyIC0xMjM0NS4KICAgKiAqIGAiMjAwMi0wMi0yN1QxNDowMDowMC0wNTAwImA6IFNhbWUgYXMgYCIyMDAyLTAyLTI3VDE5OjAwOjAwWiJgCiAgICovCiAgLy8gVE9ETyhscm4pOiByZXN0cmljdCBpbmNvcnJlY3QgdmFsdWVzIGxpa2UgIDIwMDMtMDItMjlUNTA6NzA6ODAuCiAgLy8gT3Igbm90LCB0aGF0IG1heSBiZSBhIGJyZWFraW5nIGNoYW5nZS4KICBzdGF0aWMgRGF0ZVRpbWUgcGFyc2UoU3RyaW5nIGZvcm1hdHRlZFN0cmluZykgewogICAgdmFyIHJlID0gX3BhcnNlRm9ybWF0OwogICAgTWF0Y2ggbWF0Y2ggPSByZS5maXJzdE1hdGNoKGZvcm1hdHRlZFN0cmluZyk7CiAgICBpZiAobWF0Y2ggIT0gbnVsbCkgewogICAgICBpbnQgcGFyc2VJbnRPclplcm8oU3RyaW5nIG1hdGNoZWQpIHsKICAgICAgICBpZiAobWF0Y2hlZCA9PSBudWxsKSByZXR1cm4gMDsKICAgICAgICByZXR1cm4gaW50LnBhcnNlKG1hdGNoZWQpOwogICAgICB9CgogICAgICAvLyBQYXJzZXMgZnJhY3Rpb25hbCBzZWNvbmQgZGlnaXRzIG9mICcuKFxkezEsNn0pJyBpbnRvIHRoZSBjb21iaW5lZAogICAgICAvLyBtaWNyb3NlY29uZHMuCiAgICAgIGludCBwYXJzZU1pbGxpQW5kTWljcm9zZWNvbmRzKFN0cmluZyBtYXRjaGVkKSB7CiAgICAgICAgaWYgKG1hdGNoZWQgPT0gbnVsbCkgcmV0dXJuIDA7CiAgICAgICAgaW50IGxlbmd0aCA9IG1hdGNoZWQubGVuZ3RoOwogICAgICAgIGFzc2VydChsZW5ndGggPj0gMSk7CiAgICAgICAgYXNzZXJ0KGxlbmd0aCA8PSA2KTsKCiAgICAgICAgaW50IHJlc3VsdCA9IDA7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKICAgICAgICAgIHJlc3VsdCAqPSAxMDsKICAgICAgICAgIGlmIChpIDwgbWF0Y2hlZC5sZW5ndGgpIHsKICAgICAgICAgICAgcmVzdWx0ICs9IG1hdGNoZWQuY29kZVVuaXRBdChpKSBeIDB4MzA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KCiAgICAgIGludCB5ZWFycyA9IGludC5wYXJzZShtYXRjaFsxXSk7CiAgICAgIGludCBtb250aCA9IGludC5wYXJzZShtYXRjaFsyXSk7CiAgICAgIGludCBkYXkgPSBpbnQucGFyc2UobWF0Y2hbM10pOwogICAgICBpbnQgaG91ciA9IHBhcnNlSW50T3JaZXJvKG1hdGNoWzRdKTsKICAgICAgaW50IG1pbnV0ZSA9IHBhcnNlSW50T3JaZXJvKG1hdGNoWzVdKTsKICAgICAgaW50IHNlY29uZCA9IHBhcnNlSW50T3JaZXJvKG1hdGNoWzZdKTsKICAgICAgYm9vbCBhZGRPbmVNaWxsaXNlY29uZCA9IGZhbHNlOwogICAgICBpbnQgbWlsbGlBbmRNaWNyb3NlY29uZHMgPSBwYXJzZU1pbGxpQW5kTWljcm9zZWNvbmRzKG1hdGNoWzddKTsKICAgICAgaW50IG1pbGxpc2Vjb25kID0KICAgICAgICAgIG1pbGxpQW5kTWljcm9zZWNvbmRzIH4vIER1cmF0aW9uLm1pY3Jvc2Vjb25kc1Blck1pbGxpc2Vjb25kOwogICAgICBpbnQgbWljcm9zZWNvbmQgPQogICAgICAgICAgbWlsbGlBbmRNaWNyb3NlY29uZHMucmVtYWluZGVyKER1cmF0aW9uLm1pY3Jvc2Vjb25kc1Blck1pbGxpc2Vjb25kKTsKICAgICAgYm9vbCBpc1V0YyA9IGZhbHNlOwogICAgICBpZiAobWF0Y2hbOF0gIT0gbnVsbCkgewogICAgICAgIC8vIHRpbWV6b25lIHBhcnQKICAgICAgICBpc1V0YyA9IHRydWU7CiAgICAgICAgaWYgKG1hdGNoWzldICE9IG51bGwpIHsKICAgICAgICAgIC8vIHRpbWV6b25lIG90aGVyIHRoYW4gJ1onIGFuZCAneicuCiAgICAgICAgICBpbnQgc2lnbiA9IChtYXRjaFs5XSA9PSAnLScpID8gLTEgOiAxOwogICAgICAgICAgaW50IGhvdXJEaWZmZXJlbmNlID0gaW50LnBhcnNlKG1hdGNoWzEwXSk7CiAgICAgICAgICBpbnQgbWludXRlRGlmZmVyZW5jZSA9IHBhcnNlSW50T3JaZXJvKG1hdGNoWzExXSk7CiAgICAgICAgICBtaW51dGVEaWZmZXJlbmNlICs9IDYwICogaG91ckRpZmZlcmVuY2U7CiAgICAgICAgICBtaW51dGUgLT0gc2lnbiAqIG1pbnV0ZURpZmZlcmVuY2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIGludCB2YWx1ZSA9IF9icm9rZW5Eb3duRGF0ZVRvVmFsdWUoeWVhcnMsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwKICAgICAgICAgIHNlY29uZCwgbWlsbGlzZWNvbmQsIG1pY3Jvc2Vjb25kLCBpc1V0Yyk7CiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKCJUaW1lIG91dCBvZiByYW5nZSIsIGZvcm1hdHRlZFN0cmluZyk7CiAgICAgIH0KICAgICAgcmV0dXJuIERhdGVUaW1lLl93aXRoVmFsdWUodmFsdWUsIGlzVXRjOiBpc1V0Yyk7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgZGF0ZSBmb3JtYXQiLCBmb3JtYXR0ZWRTdHJpbmcpOwogICAgfQogIH0KCiAgLyoqCiAgICogQ29uc3RydWN0cyBhIG5ldyBbRGF0ZVRpbWVdIGluc3RhbmNlIGJhc2VkIG9uIFtmb3JtYXR0ZWRTdHJpbmddLgogICAqCiAgICogV29ya3MgbGlrZSBbcGFyc2VdIGV4Y2VwdCB0aGF0IHRoaXMgZnVuY3Rpb24gcmV0dXJucyBgbnVsbGAKICAgKiB3aGVyZSBbcGFyc2VdIHdvdWxkIHRocm93IGEgW0Zvcm1hdEV4Y2VwdGlvbl0uCiAgICovCiAgc3RhdGljIERhdGVUaW1lIHRyeVBhcnNlKFN0cmluZyBmb3JtYXR0ZWRTdHJpbmcpIHsKICAgIC8vIFRPRE86IE9wdGltaXplIHRvIGF2b2lkIHRocm93aW5nLgogICAgdHJ5IHsKICAgICAgcmV0dXJuIHBhcnNlKGZvcm1hdHRlZFN0cmluZyk7CiAgICB9IG9uIEZvcm1hdEV4Y2VwdGlvbiB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgc3RhdGljIGNvbnN0IGludCBfbWF4TWlsbGlzZWNvbmRzU2luY2VFcG9jaCA9IDg2NDAwMDAwMDAwMDAwMDA7CgogIC8qKgogICAqIENvbnN0cnVjdHMgYSBuZXcgW0RhdGVUaW1lXSBpbnN0YW5jZQogICAqIHdpdGggdGhlIGdpdmVuIFttaWxsaXNlY29uZHNTaW5jZUVwb2NoXS4KICAgKgogICAqIElmIFtpc1V0Y10gaXMgZmFsc2UgdGhlbiB0aGUgZGF0ZSBpcyBpbiB0aGUgbG9jYWwgdGltZSB6b25lLgogICAqCiAgICogVGhlIGNvbnN0cnVjdGVkIFtEYXRlVGltZV0gcmVwcmVzZW50cwogICAqIDE5NzAtMDEtMDFUMDA6MDA6MDBaICsgW21pbGxpc2Vjb25kc1NpbmNlRXBvY2hdIG1zIGluIHRoZSBnaXZlbgogICAqIHRpbWUgem9uZSAobG9jYWwgb3IgVVRDKS4KICAgKi8KICBleHRlcm5hbCBEYXRlVGltZS5mcm9tTWlsbGlzZWNvbmRzU2luY2VFcG9jaChpbnQgbWlsbGlzZWNvbmRzU2luY2VFcG9jaCwKICAgICAge2Jvb2wgaXNVdGMgPSBmYWxzZX0pOwoKICAvKioKICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFtEYXRlVGltZV0gaW5zdGFuY2UKICAgKiB3aXRoIHRoZSBnaXZlbiBbbWljcm9zZWNvbmRzU2luY2VFcG9jaF0uCiAgICoKICAgKiBJZiBbaXNVdGNdIGlzIGZhbHNlIHRoZW4gdGhlIGRhdGUgaXMgaW4gdGhlIGxvY2FsIHRpbWUgem9uZS4KICAgKgogICAqIFRoZSBjb25zdHJ1Y3RlZCBbRGF0ZVRpbWVdIHJlcHJlc2VudHMKICAgKiAxOTcwLTAxLTAxVDAwOjAwOjAwWiArIFttaWNyb3NlY29uZHNTaW5jZUVwb2NoXSB1cyBpbiB0aGUgZ2l2ZW4KICAgKiB0aW1lIHpvbmUgKGxvY2FsIG9yIFVUQykuCiAgICovCiAgZXh0ZXJuYWwgRGF0ZVRpbWUuZnJvbU1pY3Jvc2Vjb25kc1NpbmNlRXBvY2goaW50IG1pY3Jvc2Vjb25kc1NpbmNlRXBvY2gsCiAgICAgIHtib29sIGlzVXRjID0gZmFsc2V9KTsKCiAgLyoqCiAgICogQ29uc3RydWN0cyBhIG5ldyBbRGF0ZVRpbWVdIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIHZhbHVlLgogICAqCiAgICogSWYgW2lzVXRjXSBpcyBmYWxzZSB0aGVuIHRoZSBkYXRlIGlzIGluIHRoZSBsb2NhbCB0aW1lIHpvbmUuCiAgICovCiAgRGF0ZVRpbWUuX3dpdGhWYWx1ZSh0aGlzLl92YWx1ZSwge3RoaXMuaXNVdGN9KSB7CiAgICBpZiAobWlsbGlzZWNvbmRzU2luY2VFcG9jaC5hYnMoKSA+IF9tYXhNaWxsaXNlY29uZHNTaW5jZUVwb2NoIHx8CiAgICAgICAgKG1pbGxpc2Vjb25kc1NpbmNlRXBvY2guYWJzKCkgPT0gX21heE1pbGxpc2Vjb25kc1NpbmNlRXBvY2ggJiYKICAgICAgICAgICAgbWljcm9zZWNvbmQgIT0gMCkpIHsKICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcigKICAgICAgICAgICJEYXRlVGltZSBpcyBvdXRzaWRlIHZhbGlkIHJhbmdlOiAkbWlsbGlzZWNvbmRzU2luY2VFcG9jaCIpOwogICAgfQogICAgaWYgKGlzVXRjID09IG51bGwpIHsKICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcigiJ2lzVXRjJyBmbGFnIG1heSBub3QgYmUgJ251bGwnIik7CiAgICB9CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgW290aGVyXSBpcyBhIFtEYXRlVGltZV0gYXQgdGhlIHNhbWUgbW9tZW50IGFuZCBpbiB0aGUKICAgKiBzYW1lIHRpbWUgem9uZSAoVVRDIG9yIGxvY2FsKS4KICAgKgogICAqIGBgYAogICAqIHZhciBkRGF5VXRjID0gbmV3IERhdGVUaW1lLnV0YygxOTQ0LCA2LCA2KTsKICAgKiB2YXIgZERheUxvY2FsID0gZERheVV0Yy50b0xvY2FsKCk7CiAgICoKICAgKiAvLyBUaGVzZSB0d28gZGF0ZXMgYXJlIGF0IHRoZSBzYW1lIG1vbWVudCwgYnV0IGFyZSBpbiBkaWZmZXJlbnQgem9uZXMuCiAgICogYXNzZXJ0KGREYXlVdGMgIT0gZERheUxvY2FsKTsKICAgKiBgYGAKICAgKgogICAqIFNlZSBbaXNBdFNhbWVNb21lbnRBc10gZm9yIGEgY29tcGFyaXNvbiB0aGF0IGNvbXBhcmVzIG1vbWVudHMgaW4gdGltZQogICAqIGluZGVwZW5kZW50bHkgb2YgdGhlaXIgem9uZXMuCiAgICovCiAgZXh0ZXJuYWwgYm9vbCBvcGVyYXRvciA9PShkeW5hbWljIG90aGVyKTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIFt0aGlzXSBvY2N1cnMgYmVmb3JlIFtvdGhlcl0uCiAgICoKICAgKiBUaGUgY29tcGFyaXNvbiBpcyBpbmRlcGVuZGVudAogICAqIG9mIHdoZXRoZXIgdGhlIHRpbWUgaXMgaW4gVVRDIG9yIGluIHRoZSBsb2NhbCB0aW1lIHpvbmUuCiAgICoKICAgKiBgYGAKICAgKiB2YXIgbm93ID0gbmV3IERhdGVUaW1lLm5vdygpOwogICAqIHZhciBlYXJsaWVyID0gbm93LnN1YnRyYWN0KGNvbnN0IER1cmF0aW9uKHNlY29uZHM6IDUpKTsKICAgKiBhc3NlcnQoZWFybGllci5pc0JlZm9yZShub3cpKTsKICAgKiBhc3NlcnQoIW5vdy5pc0JlZm9yZShub3cpKTsKICAgKgogICAqIC8vIFRoaXMgcmVsYXRpb24gc3RheXMgdGhlIHNhbWUsIGV2ZW4gd2hlbiBjaGFuZ2luZyB0aW1lem9uZXMuCiAgICogYXNzZXJ0KGVhcmxpZXIuaXNCZWZvcmUobm93LnRvVXRjKCkpKTsKICAgKiBhc3NlcnQoZWFybGllci50b1V0YygpLmlzQmVmb3JlKG5vdykpOwogICAqCiAgICogYXNzZXJ0KCFub3cudG9VdGMoKS5pc0JlZm9yZShub3cpKTsKICAgKiBhc3NlcnQoIW5vdy5pc0JlZm9yZShub3cudG9VdGMoKSkpOwogICAqIGBgYAogICAqLwogIGV4dGVybmFsIGJvb2wgaXNCZWZvcmUoRGF0ZVRpbWUgb3RoZXIpOwoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgW3RoaXNdIG9jY3VycyBhZnRlciBbb3RoZXJdLgogICAqCiAgICogVGhlIGNvbXBhcmlzb24gaXMgaW5kZXBlbmRlbnQKICAgKiBvZiB3aGV0aGVyIHRoZSB0aW1lIGlzIGluIFVUQyBvciBpbiB0aGUgbG9jYWwgdGltZSB6b25lLgogICAqCiAgICogYGBgCiAgICogdmFyIG5vdyA9IG5ldyBEYXRlVGltZS5ub3coKTsKICAgKiB2YXIgbGF0ZXIgPSBub3cuYWRkKGNvbnN0IER1cmF0aW9uKHNlY29uZHM6IDUpKTsKICAgKiBhc3NlcnQobGF0ZXIuaXNBZnRlcihub3cpKTsKICAgKiBhc3NlcnQoIW5vdy5pc0JlZm9yZShub3cpKTsKICAgKgogICAqIC8vIFRoaXMgcmVsYXRpb24gc3RheXMgdGhlIHNhbWUsIGV2ZW4gd2hlbiBjaGFuZ2luZyB0aW1lem9uZXMuCiAgICogYXNzZXJ0KGxhdGVyLmlzQWZ0ZXIobm93LnRvVXRjKCkpKTsKICAgKiBhc3NlcnQobGF0ZXIudG9VdGMoKS5pc0FmdGVyKG5vdykpOwogICAqCiAgICogYXNzZXJ0KCFub3cudG9VdGMoKS5pc0JlZm9yZShub3cpKTsKICAgKiBhc3NlcnQoIW5vdy5pc0JlZm9yZShub3cudG9VdGMoKSkpOwogICAqIGBgYAogICAqLwogIGV4dGVybmFsIGJvb2wgaXNBZnRlcihEYXRlVGltZSBvdGhlcik7CgogIC8qKgogICAqIFJldHVybnMgdHJ1ZSBpZiBbdGhpc10gb2NjdXJzIGF0IHRoZSBzYW1lIG1vbWVudCBhcyBbb3RoZXJdLgogICAqCiAgICogVGhlIGNvbXBhcmlzb24gaXMgaW5kZXBlbmRlbnQgb2Ygd2hldGhlciB0aGUgdGltZSBpcyBpbiBVVEMgb3IgaW4gdGhlIGxvY2FsCiAgICogdGltZSB6b25lLgogICAqCiAgICogYGBgCiAgICogdmFyIG5vdyA9IG5ldyBEYXRlVGltZS5ub3coKTsKICAgKiB2YXIgbGF0ZXIgPSBub3cuYWRkKGNvbnN0IER1cmF0aW9uKHNlY29uZHM6IDUpKTsKICAgKiBhc3NlcnQoIWxhdGVyLmlzQXRTYW1lTW9tZW50QXMobm93KSk7CiAgICogYXNzZXJ0KG5vdy5pc0F0U2FtZU1vbWVudEFzKG5vdykpOwogICAqCiAgICogLy8gVGhpcyByZWxhdGlvbiBzdGF5cyB0aGUgc2FtZSwgZXZlbiB3aGVuIGNoYW5naW5nIHRpbWV6b25lcy4KICAgKiBhc3NlcnQoIWxhdGVyLmlzQXRTYW1lTW9tZW50QXMobm93LnRvVXRjKCkpKTsKICAgKiBhc3NlcnQoIWxhdGVyLnRvVXRjKCkuaXNBdFNhbWVNb21lbnRBcyhub3cpKTsKICAgKgogICAqIGFzc2VydChub3cudG9VdGMoKS5pc0F0U2FtZU1vbWVudEFzKG5vdykpOwogICAqIGFzc2VydChub3cuaXNBdFNhbWVNb21lbnRBcyhub3cudG9VdGMoKSkpOwogICAqIGBgYAogICAqLwogIGV4dGVybmFsIGJvb2wgaXNBdFNhbWVNb21lbnRBcyhEYXRlVGltZSBvdGhlcik7CgogIC8qKgogICAqIENvbXBhcmVzIHRoaXMgRGF0ZVRpbWUgb2JqZWN0IHRvIFtvdGhlcl0sCiAgICogcmV0dXJuaW5nIHplcm8gaWYgdGhlIHZhbHVlcyBhcmUgZXF1YWwuCiAgICoKICAgKiBSZXR1cm5zIGEgbmVnYXRpdmUgdmFsdWUgaWYgdGhpcyBEYXRlVGltZSBbaXNCZWZvcmVdIFtvdGhlcl0uIEl0IHJldHVybnMgMAogICAqIGlmIGl0IFtpc0F0U2FtZU1vbWVudEFzXSBbb3RoZXJdLCBhbmQgcmV0dXJucyBhIHBvc2l0aXZlIHZhbHVlIG90aGVyd2lzZQogICAqICh3aGVuIHRoaXMgW2lzQWZ0ZXJdIFtvdGhlcl0pLgogICAqLwogIGV4dGVybmFsIGludCBjb21wYXJlVG8oRGF0ZVRpbWUgb3RoZXIpOwoKICBpbnQgZ2V0IGhhc2hDb2RlID0+IChfdmFsdWUgXiAoX3ZhbHVlID4+IDMwKSkgJiAweDNGRkZGRkZGOwoKICAvKioKICAgKiBSZXR1cm5zIHRoaXMgRGF0ZVRpbWUgdmFsdWUgaW4gdGhlIGxvY2FsIHRpbWUgem9uZS4KICAgKgogICAqIFJldHVybnMgW3RoaXNdIGlmIGl0IGlzIGFscmVhZHkgaW4gdGhlIGxvY2FsIHRpbWUgem9uZS4KICAgKiBPdGhlcndpc2UgdGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0bzoKICAgKgogICAqIGBgYAogICAqIG5ldyBEYXRlVGltZS5mcm9tTWljcm9zZWNvbmRzU2luY2VFcG9jaChtaWNyb3NlY29uZHNTaW5jZUVwb2NoLAogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1V0YzogZmFsc2UpCiAgICogYGBgCiAgICovCiAgRGF0ZVRpbWUgdG9Mb2NhbCgpIHsKICAgIGlmIChpc1V0YykgewogICAgICByZXR1cm4gRGF0ZVRpbWUuX3dpdGhWYWx1ZShfdmFsdWUsIGlzVXRjOiBmYWxzZSk7CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhpcyBEYXRlVGltZSB2YWx1ZSBpbiB0aGUgVVRDIHRpbWUgem9uZS4KICAgKgogICAqIFJldHVybnMgW3RoaXNdIGlmIGl0IGlzIGFscmVhZHkgaW4gVVRDLgogICAqIE90aGVyd2lzZSB0aGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvOgogICAqCiAgICogYGBgCiAgICogbmV3IERhdGVUaW1lLmZyb21NaWNyb3NlY29uZHNTaW5jZUVwb2NoKG1pY3Jvc2Vjb25kc1NpbmNlRXBvY2gsCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVXRjOiB0cnVlKQogICAqIGBgYAogICAqLwogIERhdGVUaW1lIHRvVXRjKCkgewogICAgaWYgKGlzVXRjKSByZXR1cm4gdGhpczsKICAgIHJldHVybiBEYXRlVGltZS5fd2l0aFZhbHVlKF92YWx1ZSwgaXNVdGM6IHRydWUpOwogIH0KCiAgc3RhdGljIFN0cmluZyBfZm91ckRpZ2l0cyhpbnQgbikgewogICAgaW50IGFic04gPSBuLmFicygpOwogICAgU3RyaW5nIHNpZ24gPSBuIDwgMCA/ICItIiA6ICIiOwogICAgaWYgKGFic04gPj0gMTAwMCkgcmV0dXJuICIkbiI7CiAgICBpZiAoYWJzTiA+PSAxMDApIHJldHVybiAiJHtzaWdufTAkYWJzTiI7CiAgICBpZiAoYWJzTiA+PSAxMCkgcmV0dXJuICIke3NpZ259MDAkYWJzTiI7CiAgICByZXR1cm4gIiR7c2lnbn0wMDAkYWJzTiI7CiAgfQoKICBzdGF0aWMgU3RyaW5nIF9zaXhEaWdpdHMoaW50IG4pIHsKICAgIGFzc2VydChuIDwgLTk5OTkgfHwgbiA+IDk5OTkpOwogICAgaW50IGFic04gPSBuLmFicygpOwogICAgU3RyaW5nIHNpZ24gPSBuIDwgMCA/ICItIiA6ICIrIjsKICAgIGlmIChhYnNOID49IDEwMDAwMCkgcmV0dXJuICIkc2lnbiRhYnNOIjsKICAgIHJldHVybiAiJHtzaWdufTAkYWJzTiI7CiAgfQoKICBzdGF0aWMgU3RyaW5nIF90aHJlZURpZ2l0cyhpbnQgbikgewogICAgaWYgKG4gPj0gMTAwKSByZXR1cm4gIiR7bn0iOwogICAgaWYgKG4gPj0gMTApIHJldHVybiAiMCR7bn0iOwogICAgcmV0dXJuICIwMCR7bn0iOwogIH0KCiAgc3RhdGljIFN0cmluZyBfdHdvRGlnaXRzKGludCBuKSB7CiAgICBpZiAobiA+PSAxMCkgcmV0dXJuICIke259IjsKICAgIHJldHVybiAiMCR7bn0iOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBmb3IgdGhpcyBpbnN0YW5jZS4KICAgKgogICAqIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgY29uc3RydWN0ZWQgZm9yIHRoZSB0aW1lIHpvbmUgb2YgdGhpcyBpbnN0YW5jZS4KICAgKiBUaGUgYHRvU3RyaW5nKClgIG1ldGhvZCBwcm92aWRlcyBhIHNpbXBseSBmb3JtYXR0ZWQgc3RyaW5nLgogICAqIEl0IGRvZXMgbm90IHN1cHBvcnQgaW50ZXJuYXRpb25hbGl6ZWQgc3RyaW5ncy4KICAgKiBVc2UgdGhlIFtpbnRsXShodHRwczovL3B1Yi5kYXJ0bGFuZy5vcmcvcGFja2FnZXMvaW50bCkgcGFja2FnZQogICAqIGF0IHRoZSBwdWIgc2hhcmVkIHBhY2thZ2VzIHJlcG8uCiAgICoKICAgKiBUaGUgcmVzdWx0aW5nIHN0cmluZyBjYW4gYmUgcGFyc2VkIGJhY2sgdXNpbmcgW3BhcnNlXS4KICAgKi8KICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmcgeSA9IF9mb3VyRGlnaXRzKHllYXIpOwogICAgU3RyaW5nIG0gPSBfdHdvRGlnaXRzKG1vbnRoKTsKICAgIFN0cmluZyBkID0gX3R3b0RpZ2l0cyhkYXkpOwogICAgU3RyaW5nIGggPSBfdHdvRGlnaXRzKGhvdXIpOwogICAgU3RyaW5nIG1pbiA9IF90d29EaWdpdHMobWludXRlKTsKICAgIFN0cmluZyBzZWMgPSBfdHdvRGlnaXRzKHNlY29uZCk7CiAgICBTdHJpbmcgbXMgPSBfdGhyZWVEaWdpdHMobWlsbGlzZWNvbmQpOwogICAgU3RyaW5nIHVzID0gbWljcm9zZWNvbmQgPT0gMCA/ICIiIDogX3RocmVlRGlnaXRzKG1pY3Jvc2Vjb25kKTsKICAgIGlmIChpc1V0YykgewogICAgICByZXR1cm4gIiR5LSRtLSRkICRoOiRtaW46JHNlYy4kbXMke3VzfVoiOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICIkeS0kbS0kZCAkaDokbWluOiRzZWMuJG1zJHVzIjsKICAgIH0KICB9CgogIC8qKgogICAqIFJldHVybnMgYW4gSVNPLTg2MDEgZnVsbC1wcmVjaXNpb24gZXh0ZW5kZWQgZm9ybWF0IHJlcHJlc2VudGF0aW9uLgogICAqCiAgICogVGhlIGZvcm1hdCBpcyBgeXl5eS1NTS1kZFRISDptbTpzcy5tbW11dXVaYCBmb3IgVVRDIHRpbWUsIGFuZAogICAqIGB5eXl5LU1NLWRkVEhIOm1tOnNzLm1tbXV1dWAgKG5vIHRyYWlsaW5nICJaIikgZm9yIGxvY2FsL25vbi1VVEMgdGltZSwKICAgKiB3aGVyZToKICAgKgogICAqICogYHl5eXlgIGlzIGEsIHBvc3NpYmx5IG5lZ2F0aXZlLCBmb3VyIGRpZ2l0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB5ZWFyLAogICAqICAgaWYgdGhlIHllYXIgaXMgaW4gdGhlIHJhbmdlIC05OTk5IHRvIDk5OTksCiAgICogICBvdGhlcndpc2UgaXQgaXMgYSBzaWduZWQgc2l4IGRpZ2l0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB5ZWFyLgogICAqICogYE1NYCBpcyB0aGUgbW9udGggaW4gdGhlIHJhbmdlIDAxIHRvIDEyLAogICAqICogYGRkYCBpcyB0aGUgZGF5IG9mIHRoZSBtb250aCBpbiB0aGUgcmFuZ2UgMDEgdG8gMzEsCiAgICogKiBgSEhgIGFyZSBob3VycyBpbiB0aGUgcmFuZ2UgMDAgdG8gMjMsCiAgICogKiBgbW1gIGFyZSBtaW51dGVzIGluIHRoZSByYW5nZSAwMCB0byA1OSwKICAgKiAqIGBzc2AgYXJlIHNlY29uZHMgaW4gdGhlIHJhbmdlIDAwIHRvIDU5IChubyBsZWFwIHNlY29uZHMpLAogICAqICogYG1tbWAgYXJlIG1pbGxpc2Vjb25kcyBpbiB0aGUgcmFuZ2UgMDAwIHRvIDk5OSwgYW5kCiAgICogKiBgdXV1YCBhcmUgbWljcm9zZWNvbmRzIGluIHRoZSByYW5nZSAwMDEgdG8gOTk5LiBJZiBbbWljcm9zZWNvbmRdIGVxdWFscwogICAqICAgMCwgdGhlbiB0aGlzIHBhcnQgaXMgb21pdHRlZC4KICAgKgogICAqIFRoZSByZXN1bHRpbmcgc3RyaW5nIGNhbiBiZSBwYXJzZWQgYmFjayB1c2luZyBbcGFyc2VdLgogICAqLwogIFN0cmluZyB0b0lzbzg2MDFTdHJpbmcoKSB7CiAgICBTdHJpbmcgeSA9CiAgICAgICAgKHllYXIgPj0gLTk5OTkgJiYgeWVhciA8PSA5OTk5KSA/IF9mb3VyRGlnaXRzKHllYXIpIDogX3NpeERpZ2l0cyh5ZWFyKTsKICAgIFN0cmluZyBtID0gX3R3b0RpZ2l0cyhtb250aCk7CiAgICBTdHJpbmcgZCA9IF90d29EaWdpdHMoZGF5KTsKICAgIFN0cmluZyBoID0gX3R3b0RpZ2l0cyhob3VyKTsKICAgIFN0cmluZyBtaW4gPSBfdHdvRGlnaXRzKG1pbnV0ZSk7CiAgICBTdHJpbmcgc2VjID0gX3R3b0RpZ2l0cyhzZWNvbmQpOwogICAgU3RyaW5nIG1zID0gX3RocmVlRGlnaXRzKG1pbGxpc2Vjb25kKTsKICAgIFN0cmluZyB1cyA9IG1pY3Jvc2Vjb25kID09IDAgPyAiIiA6IF90aHJlZURpZ2l0cyhtaWNyb3NlY29uZCk7CiAgICBpZiAoaXNVdGMpIHsKICAgICAgcmV0dXJuICIkeS0kbS0ke2R9VCRoOiRtaW46JHNlYy4kbXMke3VzfVoiOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICIkeS0kbS0ke2R9VCRoOiRtaW46JHNlYy4kbXMkdXMiOwogICAgfQogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBbRGF0ZVRpbWVdIGluc3RhbmNlIHdpdGggW2R1cmF0aW9uXSBhZGRlZCB0byBbdGhpc10uCiAgICoKICAgKiBgYGAKICAgKiB2YXIgdG9kYXkgPSBuZXcgRGF0ZVRpbWUubm93KCk7CiAgICogdmFyIGZpZnR5RGF5c0Zyb21Ob3cgPSB0b2RheS5hZGQobmV3IER1cmF0aW9uKGRheXM6IDUwKSk7CiAgICogYGBgCiAgICoKICAgKiBOb3RpY2UgdGhhdCB0aGUgZHVyYXRpb24gYmVpbmcgYWRkZWQgaXMgYWN0dWFsbHkgNTAgKiAyNCAqIDYwICogNjAKICAgKiBzZWNvbmRzLiBJZiB0aGUgcmVzdWx0aW5nIGBEYXRlVGltZWAgaGFzIGEgZGlmZmVyZW50IGRheWxpZ2h0IHNhdmluZyBvZmZzZXQKICAgKiB0aGFuIGB0aGlzYCwgdGhlbiB0aGUgcmVzdWx0IHdvbid0IGhhdmUgdGhlIHNhbWUgdGltZS1vZi1kYXkgYXMgYHRoaXNgLCBhbmQKICAgKiBtYXkgbm90IGV2ZW4gaGl0IHRoZSBjYWxlbmRhciBkYXRlIDUwIGRheXMgbGF0ZXIuCiAgICoKICAgKiBCZSBjYXJlZnVsIHdoZW4gd29ya2luZyB3aXRoIGRhdGVzIGluIGxvY2FsIHRpbWUuCiAgICovCiAgZXh0ZXJuYWwgRGF0ZVRpbWUgYWRkKER1cmF0aW9uIGR1cmF0aW9uKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBbRGF0ZVRpbWVdIGluc3RhbmNlIHdpdGggW2R1cmF0aW9uXSBzdWJ0cmFjdGVkIGZyb20gW3RoaXNdLgogICAqCiAgICogYGBgCiAgICogRGF0ZVRpbWUgdG9kYXkgPSBuZXcgRGF0ZVRpbWUubm93KCk7CiAgICogRGF0ZVRpbWUgZmlmdHlEYXlzQWdvID0gdG9kYXkuc3VidHJhY3QobmV3IER1cmF0aW9uKGRheXM6IDUwKSk7CiAgICogYGBgCiAgICoKICAgKiBOb3RpY2UgdGhhdCB0aGUgZHVyYXRpb24gYmVpbmcgc3VidHJhY3RlZCBpcyBhY3R1YWxseSA1MCAqIDI0ICogNjAgKiA2MAogICAqIHNlY29uZHMuIElmIHRoZSByZXN1bHRpbmcgYERhdGVUaW1lYCBoYXMgYSBkaWZmZXJlbnQgZGF5bGlnaHQgc2F2aW5nIG9mZnNldAogICAqIHRoYW4gYHRoaXNgLCB0aGVuIHRoZSByZXN1bHQgd29uJ3QgaGF2ZSB0aGUgc2FtZSB0aW1lLW9mLWRheSBhcyBgdGhpc2AsIGFuZAogICAqIG1heSBub3QgZXZlbiBoaXQgdGhlIGNhbGVuZGFyIGRhdGUgNTAgZGF5cyBlYXJsaWVyLgogICAqCiAgICogQmUgY2FyZWZ1bCB3aGVuIHdvcmtpbmcgd2l0aCBkYXRlcyBpbiBsb2NhbCB0aW1lLgogICAqLwogIGV4dGVybmFsIERhdGVUaW1lIHN1YnRyYWN0KER1cmF0aW9uIGR1cmF0aW9uKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIFtEdXJhdGlvbl0gd2l0aCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFt0aGlzXSBhbmQgW290aGVyXS4KICAgKgogICAqIGBgYAogICAqIHZhciBiZXJsaW5XYWxsRmVsbCA9IG5ldyBEYXRlVGltZS51dGMoMTk4OSwgRGF0ZVRpbWUubm92ZW1iZXIsIDkpOwogICAqIHZhciBkRGF5ID0gbmV3IERhdGVUaW1lLnV0YygxOTQ0LCBEYXRlVGltZS5qdW5lLCA2KTsKICAgKgogICAqIER1cmF0aW9uIGRpZmZlcmVuY2UgPSBiZXJsaW5XYWxsRmVsbC5kaWZmZXJlbmNlKGREYXkpOwogICAqIGFzc2VydChkaWZmZXJlbmNlLmluRGF5cyA9PSAxNjU5Mik7CiAgICogYGBgCiAgICoKICAgKiBUaGUgZGlmZmVyZW5jZSBpcyBtZWFzdXJlZCBpbiBzZWNvbmRzIGFuZCBmcmFjdGlvbnMgb2Ygc2Vjb25kcy4KICAgKiBUaGUgZGlmZmVyZW5jZSBhYm92ZSBjb3VudHMgdGhlIG51bWJlciBvZiBmcmFjdGlvbmFsIHNlY29uZHMgYmV0d2VlbgogICAqIG1pZG5pZ2h0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhvc2UgZGF0ZXMuCiAgICogSWYgdGhlIGRhdGVzIGFib3ZlIGhhZCBiZWVuIGluIGxvY2FsIHRpbWUsIG5vdCBVVEMsIHRoZW4gdGhlIGRpZmZlcmVuY2UKICAgKiBiZXR3ZWVuIHR3byBtaWRuaWdodHMgbWF5IG5vdCBiZSBhIG11bHRpcGxlIG9mIDI0IGhvdXJzIGR1ZSB0byBkYXlsaWdodAogICAqIHNhdmluZyBkaWZmZXJlbmNlcy4KICAgKgogICAqIEZvciBleGFtcGxlLCBpbiBBdXN0cmFsaWEsIHNpbWlsYXIgY29kZSB1c2luZyBsb2NhbCB0aW1lIGluc3RlYWQgb2YgVVRDOgogICAqCiAgICogYGBgCiAgICogdmFyIGJlcmxpbldhbGxGZWxsID0gbmV3IERhdGVUaW1lKDE5ODksIERhdGVUaW1lLm5vdmVtYmVyLCA5KTsKICAgKiB2YXIgZERheSA9IG5ldyBEYXRlVGltZSgxOTQ0LCBEYXRlVGltZS5qdW5lLCA2KTsKICAgKiBEdXJhdGlvbiBkaWZmZXJlbmNlID0gYmVybGluV2FsbEZlbGwuZGlmZmVyZW5jZShkRGF5KTsKICAgKiBhc3NlcnQoZGlmZmVyZW5jZS5pbkRheXMgPT0gMTY1OTIpOwogICAqIGBgYAogICAqIHdpbGwgZmFpbCBiZWNhdXNlIHRoZSBkaWZmZXJlbmNlIGlzIGFjdHVhbGx5IDE2NTkxIGRheXMgYW5kIDIzIGhvdXJzLCBhbmQKICAgKiBbRHVyYXRpb24uaW5EYXlzXSBvbmx5IHJldHVybnMgdGhlIG51bWJlciBvZiB3aG9sZSBkYXlzLgogICAqLwogIGV4dGVybmFsIER1cmF0aW9uIGRpZmZlcmVuY2UoRGF0ZVRpbWUgb3RoZXIpOwoKICBleHRlcm5hbCBEYXRlVGltZS5faW50ZXJuYWwoaW50IHllYXIsIGludCBtb250aCwgaW50IGRheSwgaW50IGhvdXIsCiAgICAgIGludCBtaW51dGUsIGludCBzZWNvbmQsIGludCBtaWxsaXNlY29uZCwgaW50IG1pY3Jvc2Vjb25kLCBib29sIGlzVXRjKTsKCiAgZXh0ZXJuYWwgRGF0ZVRpbWUuX25vdygpOwoKICAvLy8gUmV0dXJucyB0aGUgdGltZSBhcyB2YWx1ZSAobWlsbGlzZWNvbmQgb3IgbWljcm9zZWNvbmQgc2luY2UgZXBvY2gpLCBvcgogIC8vLyBudWxsIGlmIHRoZSB2YWx1ZXMgYXJlIG91dCBvZiByYW5nZS4KICBleHRlcm5hbCBzdGF0aWMgaW50IF9icm9rZW5Eb3duRGF0ZVRvVmFsdWUoCiAgICAgIGludCB5ZWFyLAogICAgICBpbnQgbW9udGgsCiAgICAgIGludCBkYXksCiAgICAgIGludCBob3VyLAogICAgICBpbnQgbWludXRlLAogICAgICBpbnQgc2Vjb25kLAogICAgICBpbnQgbWlsbGlzZWNvbmQsCiAgICAgIGludCBtaWNyb3NlY29uZCwKICAgICAgYm9vbCBpc1V0Yyk7CgogIC8qKgogICAqIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlCiAgICogdGhlICJVbml4IGVwb2NoIiAxOTcwLTAxLTAxVDAwOjAwOjAwWiAoVVRDKS4KICAgKgogICAqIFRoaXMgdmFsdWUgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIHRpbWUgem9uZS4KICAgKgogICAqIFRoaXMgdmFsdWUgaXMgYXQgbW9zdAogICAqIDgsNjQwLDAwMCwwMDAsMDAwLDAwMG1zICgxMDAsMDAwLDAwMCBkYXlzKSBmcm9tIHRoZSBVbml4IGVwb2NoLgogICAqIEluIG90aGVyIHdvcmRzOiBgbWlsbGlzZWNvbmRzU2luY2VFcG9jaC5hYnMoKSA8PSA4NjQwMDAwMDAwMDAwMDAwYC4KICAgKi8KICBleHRlcm5hbCBpbnQgZ2V0IG1pbGxpc2Vjb25kc1NpbmNlRXBvY2g7CgogIC8qKgogICAqIFRoZSBudW1iZXIgb2YgbWljcm9zZWNvbmRzIHNpbmNlCiAgICogdGhlICJVbml4IGVwb2NoIiAxOTcwLTAxLTAxVDAwOjAwOjAwWiAoVVRDKS4KICAgKgogICAqIFRoaXMgdmFsdWUgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIHRpbWUgem9uZS4KICAgKgogICAqIFRoaXMgdmFsdWUgaXMgYXQgbW9zdAogICAqIDgsNjQwLDAwMCwwMDAsMDAwLDAwMCwwMDB1cyAoMTAwLDAwMCwwMDAgZGF5cykgZnJvbSB0aGUgVW5peCBlcG9jaC4KICAgKiBJbiBvdGhlciB3b3JkczogYG1pY3Jvc2Vjb25kc1NpbmNlRXBvY2guYWJzKCkgPD0gODY0MDAwMDAwMDAwMDAwMDAwMGAuCiAgICoKICAgKiBOb3RlIHRoYXQgdGhpcyB2YWx1ZSBkb2VzIG5vdCBmaXQgaW50byA1MyBiaXRzICh0aGUgc2l6ZSBvZiBhIElFRUUgZG91YmxlKS4KICAgKiBBIEphdmFTY3JpcHQgbnVtYmVyIGlzIG5vdCBhYmxlIHRvIGhvbGQgdGhpcyB2YWx1ZS4KICAgKi8KICBleHRlcm5hbCBpbnQgZ2V0IG1pY3Jvc2Vjb25kc1NpbmNlRXBvY2g7CgogIC8qKgogICAqIFRoZSB0aW1lIHpvbmUgbmFtZS4KICAgKgogICAqIFRoaXMgdmFsdWUgaXMgcHJvdmlkZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0gYW5kIG1heSBiZSBhbgogICAqIGFiYnJldmlhdGlvbiBvciBhIGZ1bGwgbmFtZS4KICAgKgogICAqIEluIHRoZSBicm93c2VyIG9yIG9uIFVuaXgtbGlrZSBzeXN0ZW1zIGNvbW1vbmx5IHJldHVybnMgYWJicmV2aWF0aW9ucywKICAgKiBzdWNoIGFzICJDRVQiIG9yICJDRVNUIi4gT24gV2luZG93cyByZXR1cm5zIHRoZSBmdWxsIG5hbWUsIGZvciBleGFtcGxlCiAgICogIlBhY2lmaWMgU3RhbmRhcmQgVGltZSIuCiAgICovCiAgZXh0ZXJuYWwgU3RyaW5nIGdldCB0aW1lWm9uZU5hbWU7CgogIC8qKgogICAqIFRoZSB0aW1lIHpvbmUgb2Zmc2V0LCB3aGljaAogICAqIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gbG9jYWwgdGltZSBhbmQgVVRDLgogICAqCiAgICogVGhlIG9mZnNldCBpcyBwb3NpdGl2ZSBmb3IgdGltZSB6b25lcyBlYXN0IG9mIFVUQy4KICAgKgogICAqIE5vdGUsIHRoYXQgSmF2YVNjcmlwdCwgUHl0aG9uIGFuZCBDIHJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFVUQyBhbmQKICAgKiBsb2NhbCB0aW1lLiBKYXZhLCBDIyBhbmQgUnVieSByZXR1cm4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBsb2NhbCB0aW1lIGFuZAogICAqIFVUQy4KICAgKi8KICBleHRlcm5hbCBEdXJhdGlvbiBnZXQgdGltZVpvbmVPZmZzZXQ7CgogIC8qKgogICAqIFRoZSB5ZWFyLgogICAqCiAgICogYGBgCiAgICogdmFyIG1vb25MYW5kaW5nID0gRGF0ZVRpbWUucGFyc2UoIjE5NjktMDctMjAgMjA6MTg6MDRaIik7CiAgICogYXNzZXJ0KG1vb25MYW5kaW5nLnllYXIgPT0gMTk2OSk7CiAgICogYGBgCiAgICovCiAgZXh0ZXJuYWwgaW50IGdldCB5ZWFyOwoKICAvKioKICAgKiBUaGUgbW9udGggWzEuLjEyXS4KICAgKgogICAqIGBgYAogICAqIHZhciBtb29uTGFuZGluZyA9IERhdGVUaW1lLnBhcnNlKCIxOTY5LTA3LTIwIDIwOjE4OjA0WiIpOwogICAqIGFzc2VydChtb29uTGFuZGluZy5tb250aCA9PSA3KTsKICAgKiBhc3NlcnQobW9vbkxhbmRpbmcubW9udGggPT0gRGF0ZVRpbWUuanVseSk7CiAgICogYGBgCiAgICovCiAgZXh0ZXJuYWwgaW50IGdldCBtb250aDsKCiAgLyoqCiAgICogVGhlIGRheSBvZiB0aGUgbW9udGggWzEuLjMxXS4KICAgKgogICAqIGBgYAogICAqIHZhciBtb29uTGFuZGluZyA9IERhdGVUaW1lLnBhcnNlKCIxOTY5LTA3LTIwIDIwOjE4OjA0WiIpOwogICAqIGFzc2VydChtb29uTGFuZGluZy5kYXkgPT0gMjApOwogICAqIGBgYAogICAqLwogIGV4dGVybmFsIGludCBnZXQgZGF5OwoKICAvKioKICAgKiBUaGUgaG91ciBvZiB0aGUgZGF5LCBleHByZXNzZWQgYXMgaW4gYSAyNC1ob3VyIGNsb2NrIFswLi4yM10uCiAgICoKICAgKiBgYGAKICAgKiB2YXIgbW9vbkxhbmRpbmcgPSBEYXRlVGltZS5wYXJzZSgiMTk2OS0wNy0yMCAyMDoxODowNFoiKTsKICAgKiBhc3NlcnQobW9vbkxhbmRpbmcuaG91ciA9PSAyMCk7CiAgICogYGBgCiAgICovCiAgZXh0ZXJuYWwgaW50IGdldCBob3VyOwoKICAvKioKICAgKiBUaGUgbWludXRlIFswLi4uNTldLgogICAqCiAgICogYGBgCiAgICogdmFyIG1vb25MYW5kaW5nID0gRGF0ZVRpbWUucGFyc2UoIjE5NjktMDctMjAgMjA6MTg6MDRaIik7CiAgICogYXNzZXJ0KG1vb25MYW5kaW5nLm1pbnV0ZSA9PSAxOCk7CiAgICogYGBgCiAgICovCiAgZXh0ZXJuYWwgaW50IGdldCBtaW51dGU7CgogIC8qKgogICAqIFRoZSBzZWNvbmQgWzAuLi41OV0uCiAgICoKICAgKiBgYGAKICAgKiB2YXIgbW9vbkxhbmRpbmcgPSBEYXRlVGltZS5wYXJzZSgiMTk2OS0wNy0yMCAyMDoxODowNFoiKTsKICAgKiBhc3NlcnQobW9vbkxhbmRpbmcuc2Vjb25kID09IDQpOwogICAqIGBgYAogICAqLwogIGV4dGVybmFsIGludCBnZXQgc2Vjb25kOwoKICAvKioKICAgKiBUaGUgbWlsbGlzZWNvbmQgWzAuLi45OTldLgogICAqCiAgICogYGBgCiAgICogdmFyIG1vb25MYW5kaW5nID0gRGF0ZVRpbWUucGFyc2UoIjE5NjktMDctMjAgMjA6MTg6MDRaIik7CiAgICogYXNzZXJ0KG1vb25MYW5kaW5nLm1pbGxpc2Vjb25kID09IDApOwogICAqIGBgYAogICAqLwogIGV4dGVybmFsIGludCBnZXQgbWlsbGlzZWNvbmQ7CgogIC8qKgogICAqIFRoZSBtaWNyb3NlY29uZCBbMC4uLjk5OV0uCiAgICoKICAgKiBgYGAKICAgKiB2YXIgbW9vbkxhbmRpbmcgPSBEYXRlVGltZS5wYXJzZSgiMTk2OS0wNy0yMCAyMDoxODowNFoiKTsKICAgKiBhc3NlcnQobW9vbkxhbmRpbmcubWljcm9zZWNvbmQgPT0gMCk7CiAgICogYGBgCiAgICovCiAgZXh0ZXJuYWwgaW50IGdldCBtaWNyb3NlY29uZDsKCiAgLyoqCiAgICogVGhlIGRheSBvZiB0aGUgd2VlayBbbW9uZGF5XS4uW3N1bmRheV0uCiAgICoKICAgKiBJbiBhY2NvcmRhbmNlIHdpdGggSVNPIDg2MDEKICAgKiBhIHdlZWsgc3RhcnRzIHdpdGggTW9uZGF5LCB3aGljaCBoYXMgdGhlIHZhbHVlIDEuCiAgICoKICAgKiBgYGAKICAgKiB2YXIgbW9vbkxhbmRpbmcgPSBEYXRlVGltZS5wYXJzZSgiMTk2OS0wNy0yMCAyMDoxODowNFoiKTsKICAgKiBhc3NlcnQobW9vbkxhbmRpbmcud2Vla2RheSA9PSA3KTsKICAgKiBhc3NlcnQobW9vbkxhbmRpbmcud2Vla2RheSA9PSBEYXRlVGltZS5zdW5kYXkpOwogICAqIGBgYAogICAqLwogIGV4dGVybmFsIGludCBnZXQgd2Vla2RheTsKCiAgLyoKICAgKiBkYXRlIDo6PSB5ZWFyZGF0ZSB0aW1lX29wdCB0aW1lem9uZV9vcHQKICAgKiB5ZWFyZGF0ZSA6Oj0geWVhciBjb2xvbl9vcHQgbW9udGggY29sb25fb3B0IGRheQogICAqIHllYXIgOjo9IHNpZ25fb3B0IGRpZ2l0ezQsNn0KICAgKiBjb2xvbl9vcHQgOjogPGVtcHR5PiB8ICc6JwogICAqIHNpZ24gOjo9ICcrJyB8ICctJwogICAqIHNpZ25fb3B0IDo6PSAgPGVtcHR5PiB8IHNpZ24KICAgKiBtb250aCA6Oj0gZGlnaXR7Mn0KICAgKiBkYXkgOjo9IGRpZ2l0ezJ9CiAgICogdGltZV9vcHQgOjo9IDxlbXB0eT4gfCAoJyAnIHwgJ1QnKSBob3VyIG1pbnV0ZXNfb3B0CiAgICogbWludXRlc19vcHQgOjo9IDxlbXB0eT4gfCBjb2xvbl9vcHQgZGlnaXR7Mn0gc2Vjb25kc19vcHQKICAgKiBzZWNvbmRzX29wdCA6Oj0gPGVtcHR5PiB8IGNvbG9uX29wdCBkaWdpdHsyfSBtaWxsaXNfb3B0CiAgICogbWljcm9zX29wdCA6Oj0gPGVtcHR5PiB8ICgnLicgfCAnLCcpIGRpZ2l0ezEsNn0KICAgKiB0aW1lem9uZV9vcHQgOjo9IDxl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Y3JvcygpIG5hdGl2ZSAiRGF0ZVRpbWVfY3VycmVudFRpbWVNaWNyb3MiOwoKICBzdGF0aWMgU3RyaW5nIF90aW1lWm9uZU5hbWVGb3JDbGFtcGVkU2Vjb25kcyhpbnQgc2Vjb25kc1NpbmNlRXBvY2gpCiAgICAgIG5hdGl2ZSAiRGF0ZVRpbWVfdGltZVpvbmVOYW1lIjsKCiAgc3RhdGljIGludCBfdGltZVpvbmVPZmZzZXRJblNlY29uZHNGb3JDbGFtcGVkU2Vjb25kcyhpbnQgc2Vjb25kc1NpbmNlRXBvY2gpCiAgICAgIG5hdGl2ZSAiRGF0ZVRpbWVfdGltZVpvbmVPZmZzZXRJblNlY29uZHMiOwoKICBzdGF0aWMgaW50IF9sb2NhbFRpbWVab25lQWRqdXN0bWVudEluU2Vjb25kcygpCiAgICAgIG5hdGl2ZSAiRGF0ZVRpbWVfbG9jYWxUaW1lWm9uZUFkanVzdG1lbnRJblNlY29uZHMiOwoKICBzdGF0aWMgY29uc3QgX01JQ1JPU0VDT05EX0lOREVYID0gMDsKICBzdGF0aWMgY29uc3QgX01JTExJU0VDT05EX0lOREVYID0gMTsKICBzdGF0aWMgY29uc3QgX1NFQ09ORF9JTkRFWCA9IDI7CiAgc3RhdGljIGNvbnN0IF9NSU5VVEVfSU5ERVggPSAzOwogIHN0YXRpYyBjb25zdCBfSE9VUl9JTkRFWCA9IDQ7CiAgc3RhdGljIGNvbnN0IF9EQVlfSU5ERVggPSA1OwogIHN0YXRpYyBjb25zdCBfV0VFS0RBWV9JTkRFWCA9IDY7CiAgc3RhdGljIGNvbnN0IF9NT05USF9JTkRFWCA9IDc7CiAgc3RhdGljIGNvbnN0IF9ZRUFSX0lOREVYID0gODsKCiAgTGlzdCBfX3BhcnRzOwoKICBAcGF0Y2gKICBEYXRlVGltZS5mcm9tTWlsbGlzZWNvbmRzU2luY2VFcG9jaChpbnQgbWlsbGlzZWNvbmRzU2luY2VFcG9jaCwKICAgICAge2Jvb2wgaXNVdGM6IGZhbHNlfSkKICAgICAgOiB0aGlzLl93aXRoVmFsdWUoCiAgICAgICAgICAgIG1pbGxpc2Vjb25kc1NpbmNlRXBvY2ggKiBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJNaWxsaXNlY29uZCwKICAgICAgICAgICAgaXNVdGM6IGlzVXRjKTsKCiAgQHBhdGNoCiAgRGF0ZVRpbWUuZnJvbU1pY3Jvc2Vjb25kc1NpbmNlRXBvY2goaW50IG1pY3Jvc2Vjb25kc1NpbmNlRXBvY2gsCiAgICAgIHtib29sIGlzVXRjOiBmYWxzZX0pCiAgICAgIDogdGhpcy5fd2l0aFZhbHVlKG1pY3Jvc2Vjb25kc1NpbmNlRXBvY2gsIGlzVXRjOiBpc1V0Yyk7CgogIEBwYXRjaAogIERhdGVUaW1lLl9pbnRlcm5hbChpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5LCBpbnQgaG91ciwgaW50IG1pbnV0ZSwKICAgICAgaW50IHNlY29uZCwgaW50IG1pbGxpc2Vjb25kLCBpbnQgbWljcm9zZWNvbmQsIGJvb2wgaXNVdGMpCiAgICAgIDogdGhpcy5pc1V0YyA9IGlzVXRjLAogICAgICAgIHRoaXMuX3ZhbHVlID0gX2Jyb2tlbkRvd25EYXRlVG9WYWx1ZSh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsCiAgICAgICAgICAgIHNlY29uZCwgbWlsbGlzZWNvbmQsIG1pY3Jvc2Vjb25kLCBpc1V0YykgewogICAgaWYgKF92YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigpOwogICAgaWYgKGlzVXRjID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCk7CiAgfQoKICBAcGF0Y2gKICBEYXRlVGltZS5fbm93KCkKICAgICAgOiBpc1V0YyA9IGZhbHNlLAogICAgICAgIF92YWx1ZSA9IF9nZXRDdXJyZW50TWljcm9zKCk7CgogIEBwYXRjaAogIFN0cmluZyBnZXQgdGltZVpvbmVOYW1lIHsKICAgIGlmIChpc1V0YykgcmV0dXJuICJVVEMiOwogICAgcmV0dXJuIF90aW1lWm9uZU5hbWUobWljcm9zZWNvbmRzU2luY2VFcG9jaCk7CiAgfQoKICBAcGF0Y2gKICBEdXJhdGlvbiBnZXQgdGltZVpvbmVPZmZzZXQgewogICAgaWYgKGlzVXRjKSByZXR1cm4gbmV3IER1cmF0aW9uKCk7CiAgICBpbnQgb2Zmc2V0SW5TZWNvbmRzID0gX3RpbWVab25lT2Zmc2V0SW5TZWNvbmRzKG1pY3Jvc2Vjb25kc1NpbmNlRXBvY2gpOwogICAgcmV0dXJuIG5ldyBEdXJhdGlvbihzZWNvbmRzOiBvZmZzZXRJblNlY29uZHMpOwogIH0KCiAgQHBhdGNoCiAgYm9vbCBvcGVyYXRvciA9PShkeW5hbWljIG90aGVyKSA9PgogICAgICBvdGhlciBpcyBEYXRlVGltZSAmJgogICAgICBfdmFsdWUgPT0gb3RoZXIubWljcm9zZWNvbmRzU2luY2VFcG9jaCAmJgogICAgICBpc1V0YyA9PSBvdGhlci5pc1V0YzsKCiAgQHBhdGNoCiAgYm9vbCBpc0JlZm9yZShEYXRlVGltZSBvdGhlcikgPT4gX3ZhbHVlIDwgb3RoZXIubWljcm9zZWNvbmRzU2luY2VFcG9jaDsKCiAgQHBhdGNoCiAgYm9vbCBpc0FmdGVyKERhdGVUaW1lIG90aGVyKSA9PiBfdmFsdWUgPiBvdGhlci5taWNyb3NlY29uZHNTaW5jZUVwb2NoOwoKICBAcGF0Y2gKICBib29sIGlzQXRTYW1lTW9tZW50QXMoRGF0ZVRpbWUgb3RoZXIpID0+CiAgICAgIF92YWx1ZSA9PSBvdGhlci5taWNyb3NlY29uZHNTaW5jZUVwb2NoOwoKICBAcGF0Y2gKICBpbnQgY29tcGFyZVRvKERhdGVUaW1lIG90aGVyKSA9PgogICAgICBfdmFsdWUuY29tcGFyZVRvKG90aGVyLm1pY3Jvc2Vjb25kc1NpbmNlRXBvY2gpOwoKICAvKiogVGhlIGZpcnN0IGxpc3QgY29udGFpbnMgdGhlIGRheXMgdW50aWwgZWFjaCBtb250aCBpbiBub24tbGVhcCB5ZWFycy4gVGhlCiAgICAqIHNlY29uZCBsaXN0IGNvbnRhaW5zIHRoZSBkYXlzIGluIGxlYXAgeWVhcnMuICovCiAgc3RhdGljIGNvbnN0IExpc3Q8TGlzdDxpbnQ+PiBfREFZU19VTlRJTF9NT05USCA9IGNvbnN0IFsKICAgIGNvbnN0IFswLCAzMSwgNTksIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNF0sCiAgICBjb25zdCBbMCwgMzEsIDYwLCA5MSwgMTIxLCAxNTIsIDE4MiwgMjEzLCAyNDQsIDI3NCwgMzA1LCAzMzVdCiAgXTsKCiAgc3RhdGljIExpc3QgX2NvbXB1dGVVcHBlclBhcnQoaW50IGxvY2FsTWljcm9zKSB7CiAgICBjb25zdCBpbnQgREFZU19JTl80X1lFQVJTID0gNCAqIDM2NSArIDE7CiAgICBjb25zdCBpbnQgREFZU19JTl8xMDBfWUVBUlMgPSAyNSAqIERBWVNfSU5fNF9ZRUFSUyAtIDE7CiAgICBjb25zdCBpbnQgREFZU19JTl80MDBfWUVBUlMgPSA0ICogREFZU19JTl8xMDBfWUVBUlMgKyAxOwogICAgY29uc3QgaW50IERBWVNfMTk3MF9UT18yMDAwID0gMzAgKiAzNjUgKyA3OwogICAgY29uc3QgaW50IERBWVNfT0ZGU0VUID0KICAgICAgICAxMDAwICogREFZU19JTl80MDBfWUVBUlMgKyA1ICogREFZU19JTl80MDBfWUVBUlMgLSBEQVlTXzE5NzBfVE9fMjAwMDsKICAgIGNvbnN0IGludCBZRUFSU19PRkZTRVQgPSA0MDAwMDA7CgogICAgaW50IHJlc3VsdFllYXIgPSAwOwogICAgaW50IHJlc3VsdE1vbnRoID0gMDsKICAgIGludCByZXN1bHREYXkgPSAwOwoKICAgIC8vIEFsd2F5cyByb3VuZCBkb3duLgogICAgZmluYWwgaW50IGRheXNTaW5jZTE5NzAgPQogICAgICAgIF9mbG9vcmVkRGl2aXNpb24obG9jYWxNaWNyb3MsIER1cmF0aW9uLm1pY3Jvc2Vjb25kc1BlckRheSk7CiAgICBpbnQgZGF5cyA9IGRheXNTaW5jZTE5NzA7CiAgICBkYXlzICs9IERBWVNfT0ZGU0VUOwogICAgcmVzdWx0WWVhciA9IDQwMCAqIChkYXlzIH4vIERBWVNfSU5fNDAwX1lFQVJTKSAtIFlFQVJTX09GRlNFVDsKICAgIGRheXMgPSBkYXlzLnJlbWFpbmRlcihEQVlTX0lOXzQwMF9ZRUFSUyk7CiAgICBkYXlzLS07CiAgICBpbnQgeWQxID0gZGF5cyB+LyBEQVlTX0lOXzEwMF9ZRUFSUzsKICAgIGRheXMgPSBkYXlzLnJlbWFpbmRlcihEQVlTX0lOXzEwMF9ZRUFSUyk7CiAgICByZXN1bHRZZWFyICs9IDEwMCAqIHlkMTsKICAgIGRheXMrKzsKICAgIGludCB5ZDIgPSBkYXlzIH4vIERBWVNfSU5fNF9ZRUFSUzsKICAgIGRheXMgPSBkYXlzLnJlbWFpbmRlcihEQVlTX0lOXzRfWUVBUlMpOwogICAgcmVzdWx0WWVhciArPSA0ICogeWQyOwogICAgZGF5cy0tOwogICAgaW50IHlkMyA9IGRheXMgfi8gMzY1OwogICAgZGF5cyA9IGRheXMucmVtYWluZGVyKDM2NSk7CiAgICByZXN1bHRZZWFyICs9IHlkMzsKCiAgICBib29sIGlzTGVhcCA9ICh5ZDEgPT0gMCB8fCB5ZDIgIT0gMCkgJiYgeWQzID09IDA7CiAgICBpZiAoaXNMZWFwKSBkYXlzKys7CgogICAgTGlzdDxpbnQ+IGRheXNVbnRpbE1vbnRoID0gX0RBWVNfVU5USUxfTU9OVEhbaXNMZWFwID8gMSA6IDBdOwogICAgZm9yIChyZXN1bHRNb250aCA9IDEyOwogICAgICAgIGRheXNVbnRpbE1vbnRoW3Jlc3VsdE1vbnRoIC0gMV0gPiBkYXlzOwogICAgICAgIHJlc3VsdE1vbnRoLS0pIHsKICAgICAgLy8gRG8gbm90aGluZy4KICAgIH0KICAgIHJlc3VsdERheSA9IGRheXMgLSBkYXlzVW50aWxNb250aFtyZXN1bHRNb250aCAtIDFdICsgMTsKCiAgICBpbnQgcmVzdWx0TWljcm9zZWNvbmQgPSBsb2NhbE1pY3JvcyAlIER1cmF0aW9uLm1pY3Jvc2Vjb25kc1Blck1pbGxpc2Vjb25kOwogICAgaW50IHJlc3VsdE1pbGxpc2Vjb25kID0KICAgICAgICBfZmxvb3JlZERpdmlzaW9uKGxvY2FsTWljcm9zLCBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJNaWxsaXNlY29uZCkgJQogICAgICAgICAgICBEdXJhdGlvbi5taWxsaXNlY29uZHNQZXJTZWNvbmQ7CiAgICBpbnQgcmVzdWx0U2Vjb25kID0KICAgICAgICBfZmxvb3JlZERpdmlzaW9uKGxvY2FsTWljcm9zLCBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJTZWNvbmQpICUKICAgICAgICAgICAgRHVyYXRpb24uc2Vjb25kc1Blck1pbnV0ZTsKCiAgICBpbnQgcmVzdWx0TWludXRlID0KICAgICAgICBfZmxvb3JlZERpdmlzaW9uKGxvY2FsTWljcm9zLCBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJNaW51dGUpOwogICAgcmVzdWx0TWludXRlICU9IER1cmF0aW9uLm1pbnV0ZXNQZXJIb3VyOwoKICAgIGludCByZXN1bHRIb3VyID0KICAgICAgICBfZmxvb3JlZERpdmlzaW9uKGxvY2FsTWljcm9zLCBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJIb3VyKTsKICAgIHJlc3VsdEhvdXIgJT0gRHVyYXRpb24uaG91cnNQZXJEYXk7CgogICAgLy8gSW4gYWNjb3JkYW5jZSB3aXRoIElTTyA4NjAxIGEgd2VlawogICAgLy8gc3RhcnRzIHdpdGggTW9uZGF5LiBNb25kYXkgaGFzIHRoZSB2YWx1ZSAxIHVwIHRvIFN1bmRheSB3aXRoIDcuCiAgICAvLyAxOTcwLTEtMSB3YXMgYSBUaHVyc2RheS4KICAgIGludCByZXN1bHRXZWVrZGF5ID0gKChkYXlzU2luY2UxOTcwICsgRGF0ZVRpbWUudGh1cnNkYXkgLSBEYXRlVGltZS5tb25kYXkpICUKICAgICAgICAgICAgRGF0ZVRpbWUuZGF5c1BlcldlZWspICsKICAgICAgICBEYXRlVGltZS5tb25kYXk7CgogICAgTGlzdCBsaXN0ID0gbmV3IExpc3QoX1lFQVJfSU5ERVggKyAxKTsKICAgIGxpc3RbX01JQ1JPU0VDT05EX0lOREVYXSA9IHJlc3VsdE1pY3Jvc2Vjb25kOwogICAgbGlzdFtfTUlMTElTRUNPTkRfSU5ERVhdID0gcmVzdWx0TWlsbGlzZWNvbmQ7CiAgICBsaXN0W19TRUNPTkRfSU5ERVhdID0gcmVzdWx0U2Vjb25kOwogICAgbGlzdFtfTUlOVVRFX0lOREVYXSA9IHJlc3VsdE1pbnV0ZTsKICAgIGxpc3RbX0hPVVJfSU5ERVhdID0gcmVzdWx0SG91cjsKICAgIGxpc3RbX0RBWV9JTkRFWF0gPSByZXN1bHREYXk7CiAgICBsaXN0W19XRUVLREFZX0lOREVYXSA9IHJlc3VsdFdlZWtkYXk7CiAgICBsaXN0W19NT05USF9JTkRFWF0gPSByZXN1bHRNb250aDsKICAgIGxpc3RbX1lFQVJfSU5ERVhdID0gcmVzdWx0WWVhcjsKICAgIHJldHVybiBsaXN0OwogIH0KCiAgZ2V0IF9wYXJ0cyB7CiAgICBfX3BhcnRzID8/PSBfY29tcHV0ZVVwcGVyUGFydChfbG9jYWxEYXRlSW5VdGNNaWNyb3MpOwogICAgcmV0dXJuIF9fcGFydHM7CiAgfQoKICBAcGF0Y2gKICBEYXRlVGltZSBhZGQoRHVyYXRpb24gZHVyYXRpb24pIHsKICAgIHJldHVybiBuZXcgRGF0ZVRpbWUuX3dpdGhWYWx1ZShfdmFsdWUgKyBkdXJhdGlvbi5pbk1pY3Jvc2Vjb25kcywKICAgICAgICBpc1V0YzogaXNVdGMpOwogIH0KCiAgQHBhdGNoCiAgRGF0ZVRpbWUgc3VidHJhY3QoRHVyYXRpb24gZHVyYXRpb24pIHsKICAgIHJldHVybiBuZXcgRGF0ZVRpbWUuX3dpdGhWYWx1ZShfdmFsdWUgLSBkdXJhdGlvbi5pbk1pY3Jvc2Vjb25kcywKICAgICAgICBpc1V0YzogaXNVdGMpOwogIH0KCiAgQHBhdGNoCiAgRHVyYXRpb24gZGlmZmVyZW5jZShEYXRlVGltZSBvdGhlcikgewogICAgcmV0dXJuIG5ldyBEdXJhdGlvbihtaWNyb3NlY29uZHM6IF92YWx1ZSAtIG90aGVyLl92YWx1ZSk7CiAgfQoKICBAcGF0Y2gKICBpbnQgZ2V0IG1pbGxpc2Vjb25kc1NpbmNlRXBvY2ggPT4KICAgICAgX3ZhbHVlIH4vIER1cmF0aW9uLm1pY3Jvc2Vjb25kc1Blck1pbGxpc2Vjb25kOwoKICBAcGF0Y2gKICBpbnQgZ2V0IG1pY3Jvc2Vjb25kc1NpbmNlRXBvY2ggPT4gX3ZhbHVlOwoKICBAcGF0Y2gKICBpbnQgZ2V0IG1pY3Jvc2Vjb25kID0+IF9wYXJ0c1tfTUlDUk9TRUNPTkRfSU5ERVhdOwoKICBAcGF0Y2gKICBpbnQgZ2V0IG1pbGxpc2Vjb25kID0+IF9wYXJ0c1tfTUlMTElTRUNPTkRfSU5ERVhdOwoKICBAcGF0Y2gKICBpbnQgZ2V0IHNlY29uZCA9PiBfcGFydHNbX1NFQ09ORF9JTkRFWF07CgogIEBwYXRjaAogIGludCBnZXQgbWludXRlID0+IF9wYXJ0c1tfTUlOVVRFX0lOREVYXTsKCiAgQHBhdGNoCiAgaW50IGdldCBob3VyID0+IF9wYXJ0c1tfSE9VUl9JTkRFWF07CgogIEBwYXRjaAogIGludCBnZXQgZGF5ID0+IF9wYXJ0c1tfREFZX0lOREVYXTsKCiAgQHBhdGNoCiAgaW50IGdldCB3ZWVrZGF5ID0+IF9wYXJ0c1tfV0VFS0RBWV9JTkRFWF07CgogIEBwYXRjaAogIGludCBnZXQgbW9udGggPT4gX3BhcnRzW19NT05USF9JTkRFWF07CgogIEBwYXRjaAogIGludCBnZXQgeWVhciA9PiBfcGFydHNbX1lFQVJfSU5ERVhdOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBhbW91bnQgb2YgbWljcm9zZWNvbmRzIGluIFVUQyB0aGF0IHJlcHJlc2VudCB0aGUgc2FtZSB2YWx1ZXMKICAgKiBhcyBbdGhpc10uCiAgICoKICAgKiBTYXkgYHRgIGlzIHRoZSByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbiwgdGhlbgogICAqICogYHRoaXMueWVhciA9PSBuZXcgRGF0ZVRpbWUuZnJvbU1pY3Jvc2Vjb25kc1NpbmNlRXBvY2godCwgdHJ1ZSkueWVhcmAsCiAgICogKiBgdGhpcy5tb250aCA9PSBuZXcgRGF0ZVRpbWUuZnJvbU1pY3Jvc2Vjb25kc1NpbmNlRXBvY2godCwgdHJ1ZSkubW9udGhgLAogICAqICogYHRoaXMuZGF5ID09IG5ldyBEYXRlVGltZS5mcm9tTWljcm9zZWNvbmRzU2luY2VFcG9jaCh0LCB0cnVlKS5kYXlgLAogICAqICogYHRoaXMuaG91ciA9PSBuZXcgRGF0ZVRpbWUuZnJvbU1pY3Jvc2Vjb25kc1NpbmNlRXBvY2godCwgdHJ1ZSkuaG91cmAsCiAgICogKiAuLi4KICAgKgogICAqIERheWxpZ2h0IHNhdmluZ3MgaXMgY29tcHV0ZWQgYXMgaWYgdGhlIGRhdGUgd2FzIGNvbXB1dGVkIGluIFsxOTcwLi4yMDM3XS4KICAgKiBJZiBbdGhpc10gbGllcyBvdXRzaWRlIHRoaXMgcmFuZ2UgdGhlbiBpdCBpcyBhIHllYXIgd2l0aCBzaW1pbGFyCiAgICogcHJvcGVydGllcyAobGVhcCB5ZWFyLCB3ZWVrZGF5cykgaXMgdXNlZCBpbnN0ZWFkLgogICAqLwogIGludCBnZXQgX2xvY2FsRGF0ZUluVXRjTWljcm9zIHsKICAgIGludCBtaWNyb3MgPSBfdmFsdWU7CiAgICBpZiAoaXNVdGMpIHJldHVybiBtaWNyb3M7CiAgICBpbnQgb2Zmc2V0ID0KICAgICAgICBfdGltZVpvbmVPZmZzZXRJblNlY29uZHMobWljcm9zKSAqIER1cmF0aW9uLm1pY3Jvc2Vjb25kc1BlclNlY29uZDsKICAgIHJldHVybiBtaWNyb3MgKyBvZmZzZXQ7CiAgfQoKICBzdGF0aWMgaW50IF9mbG9vcmVkRGl2aXNpb24oaW50IGEsIGludCBiKSB7CiAgICByZXR1cm4gKGEgLSAoYSA8IDAgPyBiIC0gMSA6IDApKSB+LyBiOwogIH0KCiAgLy8gUmV0dXJucyB0aGUgZGF5cyBzaW5jZSAxOTcwIGZvciB0aGUgc3RhcnQgb2YgdGhlIGdpdmVuIFt5ZWFyXS4KICAvLyBbeWVhcl0gbWF5IGJlIGJlZm9yZSBlcG9jaC4KICBzdGF0aWMgaW50IF9kYXlGcm9tWWVhcihpbnQgeWVhcikgewogICAgcmV0dXJuIDM2NSAqICh5ZWFyIC0gMTk3MCkgKwogICAgICAgIF9mbG9vcmVkRGl2aXNpb24oeWVhciAtIDE5NjksIDQpIC0KICAgICAgICBfZmxvb3JlZERpdmlzaW9uKHllYXIgLSAxOTAxLCAxMDApICsKICAgICAgICBfZmxvb3JlZERpdmlzaW9uKHllYXIgLSAxNjAxLCA0MDApOwogIH0KCiAgc3RhdGljIGJvb2wgX2lzTGVhcFllYXIoeSkgewogICAgLy8gKHkgJSAxNiA9PSAwKSBtYXRjaGVzIG11bHRpcGxlcyBvZiA0MDAsIGFuZCBpcyBmYXN0ZXIgdGhhbiAlIDQwMC4KICAgIHJldHVybiAoeSAlIDQgPT0gMCkgJiYgKCh5ICUgMTYgPT0gMCkgfHwgKHkgJSAxMDAgIT0gMCkpOwogIH0KCiAgLy8vIENvbnZlcnRzIHRoZSBnaXZlbiBicm9rZW4gZG93biBkYXRlIHRvIG1pY3Jvc2Vjb25kcy4KICBAcGF0Y2gKICBzdGF0aWMgaW50IF9icm9rZW5Eb3duRGF0ZVRvVmFsdWUoaW50IHllYXIsIGludCBtb250aCwgaW50IGRheSwgaW50IGhvdXIsCiAgICAgIGludCBtaW51dGUsIGludCBzZWNvbmQsIGludCBtaWxsaXNlY29uZCwgaW50IG1pY3Jvc2Vjb25kLCBib29sIGlzVXRjKSB7CiAgICAvLyBTaW1wbGlmeSBjYWxjdWxhdGlvbnMgYnkgd29ya2luZyB3aXRoIHplcm8tYmFzZWQgbW9udGguCiAgICAtLW1vbnRoOwogICAgLy8gRGVhbCB3aXRoIHVuZGVyIGFuZCBvdmVyZmxvdy4KICAgIGlmIChtb250aCA+PSAxMikgewogICAgICB5ZWFyICs9IG1vbnRoIH4vIDEyOwogICAgICBtb250aCA9IG1vbnRoICUgMTI7CiAgICB9IGVsc2UgaWYgKG1vbnRoIDwgMCkgewogICAgICBpbnQgcmVhbE1vbnRoID0gbW9udGggJSAxMjsKICAgICAgeWVhciArPSAobW9udGggLSByZWFsTW9udGgpIH4vIDEyOwogICAgICBtb250aCA9IHJlYWxNb250aDsKICAgIH0KCiAgICAvLyBGaXJzdCBjb21wdXRlIHRoZSBzZWNvbmRzIGluIFVUQywgaW5kZXBlbmRlbnQgb2YgdGhlIFtpc1V0Y10gZmxhZy4gSWYKICAgIC8vIG5lY2Vzc2FyeSB3ZSB3aWxsIGFkZCB0aGUgdGltZS16b25lIG9mZnNldCBsYXRlciBvbi4KICAgIGludCBkYXlzID0gZGF5IC0gMTsKICAgIGRheXMgKz0gX0RBWVNfVU5USUxfTU9OVEhbX2lzTGVhcFllYXIoeWVhcikgPyAxIDogMF1bbW9udGhdOwogICAgZGF5cyArPSBfZGF5RnJvbVllYXIoeWVhcik7CiAgICBpbnQgbWljcm9zZWNvbmRzU2luY2VFcG9jaCA9IGRheXMgKiBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJEYXkgKwogICAgICAgIGhvdXIgKiBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJIb3VyICsKICAgICAgICBtaW51dGUgKiBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJNaW51dGUgKwogICAgICAgIHNlY29uZCAqIER1cmF0aW9uLm1pY3Jvc2Vjb25kc1BlclNlY29uZCArCiAgICAgICAgbWlsbGlzZWNvbmQgKiBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJNaWxsaXNlY29uZCArCiAgICAgICAgbWljcm9zZWNvbmQ7CgogICAgLy8gU2luY2UgW190aW1lWm9uZU9mZnNldEluU2Vjb25kc10gd2lsbCBjcmFzaCBpZiB0aGUgaW5wdXQgaXMgZmFyIG91dCBvZgogICAgLy8gdGhlIHZhbGlkIHJhbmdlIHdlIGRvIGEgcHJlbGltaW5hcnkgdGVzdCB0aGF0IHdlZWRzIG91dCB2YWx1ZXMgdGhhdCBjYW4KICAgIC8vIG5vdCBiZWNvbWUgdmFsaWQgZXZlbiB3aXRoIHRpbWV6b25lIGFkanVzdG1lbnRzLgogICAgLy8gVGhlIHRpbWV6b25lIGFkanVzdG1lbnQgaXMgYWx3YXlzIGxlc3MgdGhhbiBhIGRheSwgc28gYWRkaW5nIGEgc2VjdXJpdHkKICAgIC8vIG1hcmdpbiBvZiBvbmUgZGF5IHNob3VsZCBiZSBlbm91Z2guCiAgICBpZiAobWljcm9zZWNvbmRzU2luY2VFcG9jaC5hYnMoKSA+CiAgICAgICAgX21heE1pbGxpc2Vjb25kc1NpbmNlRXBvY2ggKiAxMDAwICsgRHVyYXRpb24ubWljcm9zZWNvbmRzUGVyRGF5KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGlmICghaXNVdGMpIHsKICAgICAgLy8gTm90ZSB0aGF0IHdlIGNhbid0IGxpdGVyYWxseSBmb2xsb3cgdGhlIEVDTUFTY3JpcHQgc3BlYyAod2hpY2ggdGhpcwogICAgICAvLyBjb2RlIGlzIGJhc2VkIG9uKSwgYmVjYXVzZSBpdCBsZWFkcyB0byBpbmNvcnJlY3QgY29tcHV0YXRpb25zIGF0CiAgICAgIC8vIHRoZSBEU1QgdHJhbnNpdGlvbiBwb2ludHMuCiAgICAgIC8vCiAgICAgIC8vIFNlZSBWOCdzIGNvbW1lbnQgaGVyZToKICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Y4L3Y4L2Jsb2IvMDg5ZGQ3ZDI0NDdkNmVhZjU3YzhiYTZkOGYzNzk1N2YzYTI2OTc3Ny9zcmMvZGF0ZS5oI0wxMTgKCiAgICAgIC8vIFdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBsb2NhbCB0aW1lem9uZSBhZGp1c3RtZW50IGJlZm9yZSBhc2tpbmcgZm9yIHRoZQogICAgICAvLyBjb3JyZWN0IHpvbmUgb2Zmc2V0LgogICAgICBpbnQgYWRqdXN0bWVudCA9CiAgICAgICAgICBfbG9jYWxUaW1lWm9uZUFkanVzdG1lbnRJblNlY29uZHMoKSAqIER1cmF0aW9uLm1pY3Jvc2Vjb25kc1BlclNlY29uZDsKICAgICAgLy8gVGhlIGFkanVzdG1lbnQgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIGFjdHVhbCBkYXRlIGFuZCBvZiB0aGUgZGF5bGlnaHQKICAgICAgLy8gc2F2aW5nIHRpbWUuIEl0IGlzIHBvc2l0aXZlIGVhc3Qgb2YgdGhlIFByaW1lIE1lcmlkaWFuIGFuZCBuZWdhdGl2ZQogICAgICAvLyB3ZXN0IG9mIGl0LCBlLmcuIC0yODgwMCBzZWMgZm9yIEFtZXJpY2EvTG9zX0FuZ2VsZXMgdGltZXpvbmUuCgogICAgICAvLyBXZSByZW1vdmUgb25lIGhvdXIgdG8gZW5zdXJlIHRoYXQgd2UgaGF2ZSB0aGUgY29ycmVjdCBvZmZzZXQgYXQKICAgICAgLy8gRFNUIHRyYW5zaXRpb25pbmcgcG9pbnRzLiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHNvbHV0aW9uIGFuZCBvbmx5CiAgICAgIC8vIGNvcnJlY3QgaW4gdGltZXpvbmVzIHRoYXQgc2hpZnQgZm9yIGV4YWN0bHkgb25lIGhvdXIuCiAgICAgIGFkanVzdG1lbnQgKz0gRHVyYXRpb24ubWljcm9zZWNvbmRzUGVySG91cjsKICAgICAgaW50IHpvbmVPZmZzZXQgPQogICAgICAgICAgX3RpbWVab25lT2Zmc2V0SW5TZWNvbmRzKG1pY3Jvc2Vjb25kc1NpbmNlRXBvY2ggLSBhZGp1c3RtZW50KTsKCiAgICAgIC8vIFRoZSB6b25lT2Zmc2V0IGRlcGVuZHMgb24gdGhlIGFjdHVhbCBkYXRlIGFuZCByZWZsZWN0cyBhbnkgZGF5bGlnaHQKICAgICAgLy8gc2F2aW5nIHRpbWUgYW5kL29yIGhpc3RvcmljYWwgZGV2aWF0aW9uIHJlbGF0aXZlIHRvIFVUQyB0aW1lLgogICAgICAvLyBJdCBpcyBwb3NpdGl2ZSBlYXN0IG9mIHRoZSBQcmltZSBNZXJpZGlhbiBhbmQgbmVnYXRpdmUgd2VzdCBvZiBpdCwKICAgICAgLy8gZS5nLiAtMjUyMDAgc2VjIGZvciBBbWVyaWNhL0xvc19BbmdlbGVzIHRpbWV6b25lIGR1cmluZyBEU1QuCiAgICAgIG1pY3Jvc2Vjb25kc1NpbmNlRXBvY2ggLT0gem9uZU9mZnNldCAqIER1cmF0aW9uLm1pY3Jvc2Vjb25kc1BlclNlY29uZDsKICAgICAgLy8gVGhlIHJlc3VsdGluZyBtaWNyb3NlY29uZHNTaW5jZUVwb2NoIHZhbHVlIGlzIHRoZXJlZm9yZSB0aGUgY2FsY3VsYXRlZAogICAgICAvLyBVVEMgdmFsdWUgZGVjcmVhc2VkIGJ5IGEgKHBvc2l0aXZlIGlmIGVhc3Qgb2YgR01UKSB0aW1lem9uZSBhZGp1c3RtZW50CiAgICAgIC8vIGFuZCBkZWNyZWFzZWQgYnkgdHlwaWNhbGx5IG9uZSBob3VyIGlmIERTVCBpcyBpbiBlZmZlY3QuCiAgICB9CiAgICBpZiAobWljcm9zZWNvbmRzU2luY2VFcG9jaC5hYnMoKSA+CiAgICAgICAgX21heE1pbGxpc2Vjb25kc1NpbmNlRXBvY2ggKiBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJNaWxsaXNlY29uZCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBtaWNyb3NlY29uZHNTaW5jZUVwb2NoOwogIH0KCiAgc3RhdGljIGludCBfd2Vla0RheSh5KSB7CiAgICAvLyAxLzEvMTk3MCB3YXMgYSBUaHVyc2RheS4KICAgIHJldHVybiAoX2RheUZyb21ZZWFyKHkpICsgNCkgJSA3OwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhIHllYXIgaW4gdGhlIHJhbmdlIDIwMDgtMjAzNSBtYXRjaGluZwogICAqICogbGVhcCB5ZWFyLCBhbmQKICAgKiAqIHdlZWsgZGF5IG9mIGZpcnN0IGRheS4KICAgKgogICAqIExlYXAgc2Vjb25kcyBhcmUgaWdub3JlZC4KICAgKiBBZGFwdGVkIGZyb20gVjgncyBkYXRlIGltcGxlbWVudGF0aW9uLiBTZWUgRUNNQSAyNjIgLSAxNS45LjEuOS4KICAgKi8KICBzdGF0aWMgaW50IF9lcXVpdmFsZW50WWVhcihpbnQgeWVhcikgewogICAgLy8gUmV0dXJucyB5ZWFyIHkgc28gdGhhdCBfd2Vla0RheSh5KSA9PSBfd2Vla0RheSh5ZWFyKS4KICAgIC8vIF93ZWVrRGF5IHJldHVybnMgdGhlIHdlZWsgZGF5IChpbiByYW5nZSAwIC0gNikuCiAgICAvLyAxLzEvMTk1NiB3YXMgYSBTdW5kYXkgKGkuZS4gd2Vla2RheSAwKS4gMTk1NiB3YXMgYSBsZWFwLXllYXIuCiAgICAvLyAxLzEvMTk2NyB3YXMgYSBTdW5kYXkgKGkuZS4gd2Vla2RheSAwKS4KICAgIC8vIFdpdGhvdXQgbGVhcCB5ZWFycyBhIHN1YnNlcXVlbnQgeWVhciBoYXMgYSB3ZWVrIGRheSArIDEgKGZvciBleGFtcGxlCiAgICAvLyAxLzEvMTk2OCB3YXMgYSBNb25kYXkpLiBXaXRoIGxlYXAteWVhcnMgaXQganVtcHMgb3ZlciBvbmUgd2VlayBkYXkKICAgIC8vIChlLmcuIDEvMS8xOTU3IHdhcyBhIFR1ZXNkYXkpLgogICAgLy8gQWZ0ZXIgMTIgeWVhcnMgdGhlIHdlZWtkYXlzIGhhdmUgYWR2YW5jZWQgYnkgMTIgZGF5cyArIDMgbGVhcCBkYXlzID0KICAgIC8vIDE1IGRheXMuIDE1ICUgNyA9IDEuIFNvIGFmdGVyIDEyIHllYXJzIHRoZSB3ZWVrIGRheSBoYXMgYWx3YXlzCiAgICAvLyAobm93IGluZGVwZW5kZW50bHkgb2YgbGVhcC15ZWFycykgYWR2YW5jZWQgYnkgb25lLgogICAgLy8gd2Vla0RheSAqIDEyIGdpdmVzIHRodXMgYSB5ZWFyIHN0YXJ0aW5nIHdpdGggdGhlIHdhbnRlZCB3ZWVrRGF5LgogICAgaW50IHJlY2VudFllYXIgPSAoX2lzTGVhcFllYXIoeWVhcikgPyAxOTU2IDogMTk2NykgKyAoX3dlZWtEYXkoeWVhcikgKiAxMik7CiAgICAvLyBDbG9zZSB0byB0aGUgeWVhciAyMDA4IHRoZSBjYWxlbmRhciBjeWNsZXMgZXZlcnkgNCAqIDcgeWVhcnMgKDQgZm9yIHRoZQogICAgLy8gbGVhcCB5ZWFycywgNyBmb3IgdGhlIHdlZWtkYXlzKS4KICAgIC8vIEZpbmQgdGhlIHllYXIgaW4gdGhlIHJhbmdlIDIwMDguLjIwMzcgdGhhdCBpcyBlcXVpdmFsZW50IG1vZCAyOC4KICAgIHJldHVybiAyMDA4ICsgKHJlY2VudFllYXIgLSAyMDA4KSAlIDI4OwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgVVRDIHllYXIgZm9yIHRoZSBjb3JyZXNwb25kaW5nIFtzZWNvbmRzU2luY2VFcG9jaF0uCiAgICogSXQgaXMgcmVsYXRpdmVseSBmYXN0IGZvciB2YWx1ZXMgaW4gdGhlIHJhbmdlIDAgdG8geWVhciAyMDk4LgogICAqCiAgICogQ29kZSBpcyBhZGFwdGVkIGZyb20gVjguCiAgICovCiAgc3RhdGljIGludCBfeWVhcnNGcm9tU2Vjb25kc1NpbmNlRXBvY2goaW50IHNlY29uZHNTaW5jZUVwb2NoKSB7CiAgICBjb25zdCBpbnQgREFZU19JTl80X1lFQVJTID0gNCAqIDM2NSArIDE7CiAgICBjb25zdCBpbnQgREFZU19JTl8xMDBfWUVBUlMgPSAyNSAqIERBWVNfSU5fNF9ZRUFSUyAtIDE7CiAgICBjb25zdCBpbnQgREFZU19ZRUFSXzIwOTggPSBEQVlTX0lOXzEwMF9ZRUFSUyArIDYgKiBEQVlTX0lOXzRfWUVBUlM7CgogICAgaW50IGRheXMgPSBzZWNvbmRzU2luY2VFcG9jaCB+LyBEdXJhdGlvbi5zZWNvbmRzUGVyRGF5OwogICAgaWYgKGRheXMgPiAwICYmIGRheXMgPCBEQVlTX1lFQVJfMjA5OCkgewogICAgICAvLyBBY2NvcmRpbmcgdG8gVjggdGhpcyBmYXN0IGNhc2Ugd29ya3MgZm9yIGRhdGVzIGZyb20gMTk3MCB0byAyMDk5LgogICAgICByZXR1cm4gMTk3MCArICg0ICogZGF5cyArIDIpIH4vIERBWVNfSU5fNF9ZRUFSUzsKICAgIH0KICAgIGludCBtaWNyb3MgPSBzZWNvbmRzU2luY2VFcG9jaCAqIER1cmF0aW9uLm1pY3Jvc2Vjb25kc1BlclNlY29uZDsKICAgIHJldHVybiBfY29tcHV0ZVVwcGVyUGFydChtaWNyb3MpW19ZRUFSX0lOREVYXTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBkYXRlIGluIHNlY29uZHMgdGhhdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBnaXZlbgogICAqIGRhdGUgaW4gbWljcm9zZWNvbmRzIFttaWNyb3NlY29uZHNTaW5jZUVwb2NoXS4gQW4gZXF1aXZhbGVudAogICAqIGRhdGUgaGFzIHRoZSBzYW1lIGZpZWxkcyAoYG1vbnRoYCwgYGRheWAsIGV0Yy4pIGFzIHRoZSBnaXZlbgogICAqIGRhdGUsIGJ1dCB0aGUgYHllYXJgIGlzIGluIHRoZSByYW5nZSBbMTkwMS4uMjAzOF0uCiAgICoKICAgKiAqIFRoZSB0aW1lIHNpbmNlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHllYXIgaXMgdGhlIHNhbWUuCiAgICogKiBJZiB0aGUgZ2l2ZW4gZGF0ZSBpcyBpbiBhIGxlYXAgeWVhciB0aGVuIHRoZSByZXR1cm5lZAogICAqICAgc2Vjb25kcyBhcmUgaW4gYSBsZWFwIHllYXIsIHRvby4KICAgKiAqIFRoZSB3ZWVrIGRheSBvZiBnaXZlbiBkYXRlIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgZm9yIHRoZQogICAqICAgcmV0dXJuZWQgZGF0ZS4KICAgKi8KICBzdGF0aWMgaW50IF9lcXVpdmFsZW50U2Vjb25kcyhpbnQgbWljcm9zZWNvbmRzU2luY2VFcG9jaCkgewogICAgY29uc3QgaW50IENVVF9PRkZfU0VDT05EUyA9IDB4N0ZGRkZGRkY7CgogICAgaW50IHNlY29uZHNTaW5jZUVwb2NoID0gX2Zsb29yZWREaXZpc2lvbigKICAgICAgICBtaWNyb3NlY29uZHNTaW5jZUVwb2NoLCBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJTZWNvbmQpOwoKICAgIGlmIChzZWNvbmRzU2luY2VFcG9jaC5hYnMoKSA+IENVVF9PRkZfU0VDT05EUykgewogICAgICBpbnQgeWVhciA9IF95ZWFyc0Zyb21TZWNvbmRzU2luY2VFcG9jaChzZWNvbmRzU2luY2VFcG9jaCk7CiAgICAgIGludCBkYXlzID0gX2RheUZyb21ZZWFyKHllYXIpOwogICAgICBpbnQgZXF1aXZhbGVudFllYXIgPSBfZXF1aXZhbGVudFllYXIoeWVhcik7CiAgICAgIGludCBlcXVpdmFsZW50RGF5cyA9IF9kYXlGcm9tWWVhcihlcXVpdmFsZW50WWVhcik7CiAgICAgIGludCBkaWZmRGF5cyA9IGVxdWl2YWxlbnREYXlzIC0gZGF5czsKICAgICAgc2Vjb25kc1NpbmNlRXBvY2ggKz0gZGlmZkRheXMgKiBEdXJhdGlvbi5zZWNvbmRzUGVyRGF5OwogICAgfQogICAgcmV0dXJuIHNlY29uZHNTaW5jZUVwb2NoOwogIH0KCiAgc3RhdGljIGludCBfdGltZVpvbmVPZmZzZXRJblNlY29uZHMoaW50IG1pY3Jvc2Vjb25kc1NpbmNlRXBvY2gpIHsKICAgIGludCBlcXVpdmFsZW50U2Vjb25kcyA9IF9lcXVpdmFsZW50U2Vjb25kcyhtaWNyb3NlY29uZHNTaW5jZUVwb2NoKTsKICAgIHJldHVybiBfdGltZVpvbmVPZmZzZXRJblNlY29uZHNGb3JDbGFtcGVkU2Vjb25kcyhlcXVpdmFsZW50U2Vjb25kcyk7CiAgfQoKICBzdGF0aWMgU3RyaW5nIF90aW1lWm9uZU5hbWUoaW50IG1pY3Jvc2Vjb25kc1NpbmNlRXBvY2gpIHsKICAgIGludCBlcXVpdmFsZW50U2Vjb25kcyA9IF9lcXVpdmFsZW50U2Vjb25kcyhtaWNyb3NlY29uZHNTaW5jZUVwb2NoKTsKICAgIHJldHVybiBfdGltZVpvbmVOYW1lRm9yQ2xhbXBlZFNlY29uZHMoZXF1aXZhbGVudFNlY29uZHMpOwogIH0KfQqBwABOTjwBHgEiBxEORUYBRiYBTjEBMToBJyciIiAfIyEgARABCUIbGUobAQlCGz8BCUlAHE03MzIEAQkSFyYBCRwdMgQBCSAmTDMEAQklGzAcAQlKAQlJAQkrLgEJIzYBTzY7Q0IFATMtPD0wHE4lARgZFwEaHkQeGUMuDCkuHQwnLBsMGyAXATYYAUIbMBkVBjwBTxxNLBdIJwEXRy0BFUUoASpHIFEkGQErMjIoKCQiKiYkEQQBDzoUBAEJJEUXBAEJKUUXBAEJKD4EAQkkNQEJLAEJNQEJNQEJKwEJKwEJJwEJJQEJLQEJKQEJJwEGThAFMk1PS00LBU9GNwYiGR4RSxwEAS4rBAFEISYhKy0sBAEfST4EATsJTE4/DSUXGxocIikZBgFNPBhBIEYuMjI8FQFOTzhPKydLEwYBEk1KJAkgYAFPHhdQTk1HAUlJPzIXSQFNR0xGTVBQQgYnTBMGIwQBGyAmBAEGNBYeBR9FBik9N0UvTEomTEY6SFBPKEgsBAEGRUMFHgZCLTxIATwtSzcGRTMEAQY/QkI4BT09KEEWBj4sAS5BATVBJTI5LD4GHgQBREhJBAE8SD4EAgEfZGFydDpjb3JlLXBhdGNoL2RhdGVfcGF0Y2guZGFydCxvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS9kb3VibGUuZGFydJwRLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLy8gVE9ETzogQ29udmVydCB0aGlzIGFic3RyYWN0IGNsYXNzIGludG8gYSBjb25jcmV0ZSBjbGFzcyBkb3VibGUKLy8gdGhhdCB1c2VzIHRoZSBwYXRjaCBjbGFzcyBmdW5jdGlvbmFsaXR5IHRvIGFjY291bnQgZm9yIHRoZQovLyBkaWZmZXJlbnQgcGxhdGZvcm0gaW1wbGVtZW50YXRpb25zLgoKLyoqCiAqIEEgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXIuCiAqCiAqIFJlcHJlc2VudGF0aW9uIG9mIERhcnQgZG91YmxlcyBjb250YWluaW5nIGRvdWJsZSBzcGVjaWZpYyBjb25zdGFudHMKICogYW5kIG9wZXJhdGlvbnMgYW5kIHNwZWNpYWxpemF0aW9ucyBvZiBvcGVyYXRpb25zIGluaGVyaXRlZCBmcm9tCiAqIFtudW1dLiBEYXJ0IGRvdWJsZXMgYXJlIDY0LWJpdCBmbG9hdGluZy1wb2ludCBudW1iZXJzIGFzIHNwZWNpZmllZCBpbiB0aGUKICogSUVFRSA3NTQgc3RhbmRhcmQuCiAqCiAqIFRoZSBbZG91YmxlXSB0eXBlIGlzIGNvbnRhZ2lvdXMuIE9wZXJhdGlvbnMgb24gW2RvdWJsZV1zIHJldHVybgogKiBbZG91YmxlXSByZXN1bHRzLgogKgogKiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBmb3IgYSBjbGFzcyB0byBhdHRlbXB0IHRvIGV4dGVuZCBvciBpbXBsZW1lbnQKICogZG91YmxlLgogKi8KYWJzdHJhY3QgY2xhc3MgZG91YmxlIGV4dGVuZHMgbnVtIHsKICBzdGF0aWMgY29uc3QgZG91YmxlIG5hbiA9IDAuMCAvIDAuMDsKICBzdGF0aWMgY29uc3QgZG91YmxlIGluZmluaXR5ID0gMS4wIC8gMC4wOwogIHN0YXRpYyBjb25zdCBkb3VibGUgbmVnYXRpdmVJbmZpbml0eSA9IC1pbmZpbml0eTsKICBzdGF0aWMgY29uc3QgZG91YmxlIG1pblBvc2l0aXZlID0gNWUtMzI0OwogIHN0YXRpYyBjb25zdCBkb3VibGUgbWF4RmluaXRlID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDg7CgogIGRvdWJsZSByZW1haW5kZXIobnVtIG90aGVyKTsKCiAgLyoqIEFkZGl0aW9uIG9wZXJhdG9yLiAqLwogIGRvdWJsZSBvcGVyYXRvciArKG51bSBvdGhlcik7CgogIC8qKiBTdWJ0cmFjdGlvbiBvcGVyYXRvci4gKi8KICBkb3VibGUgb3BlcmF0b3IgLShudW0gb3RoZXIpOwoKICAvKiogTXVsdGlwbGljYXRpb24gb3BlcmF0b3IuICovCiAgZG91YmxlIG9wZXJhdG9yICoobnVtIG90aGVyKTsKCiAgZG91YmxlIG9wZXJhdG9yICUobnVtIG90aGVyKTsKCiAgLyoqIERpdmlzaW9uIG9wZXJhdG9yLiAqLwogIGRvdWJsZSBvcGVyYXRvciAvKG51bSBvdGhlcik7CgogIC8qKgogICAqIFRydW5jYXRpbmcgZGl2aXNpb24gb3BlcmF0b3IuCiAgICoKICAgKiBUaGUgcmVzdWx0IG9mIHRoZSB0cnVuY2F0aW5nIGRpdmlzaW9uIGBhIH4vIGJgIGlzIGVxdWl2YWxlbnQgdG8KICAgKiBgKGEgLyBiKS50cnVuY2F0ZSgpYC4KICAgKi8KICBpbnQgb3BlcmF0b3Igfi8obnVtIG90aGVyKTsKCiAgLyoqIE5lZ2F0ZSBvcGVyYXRvci4gKi8KICBkb3VibGUgb3BlcmF0b3IgLSgpOwoKICAvKiogUmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhpcyBbZG91YmxlXS4gKi8KICBkb3VibGUgYWJzKCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHNpZ24gb2YgdGhlIGRvdWJsZSdzIG51bWVyaWNhbCB2YWx1ZS4KICAgKgogICAqIFJldHVybnMgLTEuMCBpZiB0aGUgdmFsdWUgaXMgbGVzcyB0aGFuIHplcm8sCiAgICogKzEuMCBpZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHplcm8sCiAgICogYW5kIHRoZSB2YWx1ZSBpdHNlbGYgaWYgaXQgaXMgLTAuMCwgMC4wIG9yIE5hTi4KICAgKi8KICBkb3VibGUgZ2V0IHNpZ247CgogIC8qKgogICAqIFJldHVybnMgdGhlIGludGVnZXIgY2xvc2VzdCB0byBgdGhpc2AuCiAgICoKICAgKiBSb3VuZHMgYXdheSBmcm9tIHplcm8gd2hlbiB0aGVyZSBpcyBubyBjbG9zZXN0IGludGVnZXI6CiAgICogIGAoMy41KS5yb3VuZCgpID09IDRgIGFuZCBgKC0zLjUpLnJvdW5kKCkgPT0gLTRgLgogICAqCiAgICogSWYgYHRoaXNgIGlzIG5vdCBmaW5pdGUgKGBOYU5gIG9yIGluZmluaXR5KSwgdGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXS4KICAgKi8KICBpbnQgcm91bmQoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZ3JlYXRlc3QgaW50ZWdlciBubyBncmVhdGVyIHRoYW4gYHRoaXNgLgogICAqCiAgICogSWYgYHRoaXNgIGlzIG5vdCBmaW5pdGUgKGBOYU5gIG9yIGluZmluaXR5KSwgdGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXS4KICAgKi8KICBpbnQgZmxvb3IoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGVhc3QgaW50ZWdlciBubyBzbWFsbGVyIHRoYW4gYHRoaXNgLgogICAqCiAgICogSWYgYHRoaXNgIGlzIG5vdCBmaW5pdGUgKGBOYU5gIG9yIGluZmluaXR5KSwgdGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXS4KICAgKi8KICBpbnQgY2VpbCgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIG9idGFpbmVkIGJ5IGRpc2NhcmRpbmcgYW55IGZyYWN0aW9uYWwKICAgKiBkaWdpdHMgZnJvbSBgdGhpc2AuCiAgICoKICAgKiBJZiBgdGhpc2AgaXMgbm90IGZpbml0ZSAoYE5hTmAgb3IgaW5maW5pdHkpLCB0aHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdLgogICAqLwogIGludCB0cnVuY2F0ZSgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIGRvdWJsZSB2YWx1ZSBjbG9zZXN0IHRvIGB0aGlzYC4KICAgKgogICAqIFJvdW5kcyBhd2F5IGZyb20gemVybyB3aGVuIHRoZXJlIGlzIG5vIGNsb3Nlc3QgaW50ZWdlcjoKICAgKiAgYCgzLjUpLnJvdW5kVG9Eb3VibGUoKSA9PSA0YCBhbmQgYCgtMy41KS5yb3VuZFRvRG91YmxlKCkgPT0gLTRgLgogICAqCiAgICogSWYgdGhpcyBpcyBhbHJlYWR5IGFuIGludGVnZXIgdmFsdWVkIGRvdWJsZSwgaW5jbHVkaW5nIGAtMC4wYCwgb3IgaXQgaXMgbm90CiAgICogYSBmaW5pdGUgdmFsdWUsIHRoZSB2YWx1ZSBpcyByZXR1cm5lZCB1bm1vZGlmaWVkLgogICAqCiAgICogRm9yIHRoZSBwdXJwb3NlIG9mIHJvdW5kaW5nLCBgLTAuMGAgaXMgY29uc2lkZXJlZCB0byBiZSBiZWxvdyBgMC4wYCwKICAgKiBhbmQgYC0wLjBgIGlzIHRoZXJlZm9yZSBjb25zaWRlcmVkIGNsb3NlciB0byBuZWdhdGl2ZSBudW1iZXJzIHRoYW4gYDAuMGAuCiAgICogVGhpcyBtZWFucyB0aGF0IGZvciBhIHZhbHVlLCBgZGAgaW4gdGhlIHJhbmdlIGAtMC41IDwgZCA8IDAuMGAsCiAgICogdGhlIHJlc3VsdCBpcyBgLTAuMGAuCiAgICovCiAgZG91YmxlIHJvdW5kVG9Eb3VibGUoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZ3JlYXRlc3QgaW50ZWdlciBkb3VibGUgdmFsdWUgbm8gZ3JlYXRlciB0aGFuIGB0aGlzYC4KICAgKgogICAqIElmIHRoaXMgaXMgYWxyZWFkeSBhbiBpbnRlZ2VyIHZhbHVlZCBkb3VibGUsIGluY2x1ZGluZyBgLTAuMGAsIG9yIGl0IGlzIG5vdAogICAqIGEgZmluaXRlIHZhbHVlLCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQgdW5tb2RpZmllZC4KICAgKgogICAqIEZvciB0aGUgcHVycG9zZSBvZiByb3VuZGluZywgYC0wLjBgIGlzIGNvbnNpZGVyZWQgdG8gYmUgYmVsb3cgYDAuMGAuCiAgICogQSBudW1iZXIgYGRgIGluIHRoZSByYW5nZSBgMC4wIDwgZCA8IDEuMGAgd2lsbCByZXR1cm4gYDAuMGAuCiAgICovCiAgZG91YmxlIGZsb29yVG9Eb3VibGUoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGVhc3QgaW50ZWdlciBkb3VibGUgdmFsdWUgbm8gc21hbGxlciB0aGFuIGB0aGlzYC4KICAgKgogICAqIElmIHRoaXMgaXMgYWxyZWFkeSBhbiBpbnRlZ2VyIHZhbHVlZCBkb3VibGUsIGluY2x1ZGluZyBgLTAuMGAsIG9yIGl0IGlzIG5vdAogICAqIGEgZmluaXRlIHZhbHVlLCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQgdW5tb2RpZmllZC4KICAgKgogICAqIEZvciB0aGUgcHVycG9zZSBvZiByb3VuZGluZywgYC0wLjBgIGlzIGNvbnNpZGVyZWQgdG8gYmUgYmVsb3cgYDAuMGAuCiAgICogQSBudW1iZXIgYGRgIGluIHRoZSByYW5nZSBgLTEuMCA8IGQgPCAwLjBgIHdpbGwgcmV0dXJuIGAtMC4wYC4KICAgKi8KICBkb3VibGUgY2VpbFRvRG91YmxlKCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGludGVnZXIgZG91YmxlIHZhbHVlIG9idGFpbmVkIGJ5IGRpc2NhcmRpbmcgYW55IGZyYWN0aW9uYWwKICAgKiBkaWdpdHMgZnJvbSBgdGhpc2AuCiAgICoKICAgKiBJZiB0aGlzIGlzIGFscmVhZHkgYW4gaW50ZWdlciB2YWx1ZWQgZG91YmxlLCBpbmNsdWRpbmcgYC0wLjBgLCBvciBpdCBpcyBub3QKICAgKiBhIGZpbml0ZSB2YWx1ZSwgdGhlIHZhbHVlIGlzIHJldHVybmVkIHVubW9kaWZpZWQuCiAgICoKICAgKiBGb3IgdGhlIHB1cnBvc2Ugb2Ygcm91bmRpbmcsIGAtMC4wYCBpcyBjb25zaWRlcmVkIHRvIGJlIGJlbG93IGAwLjBgLgogICAqIEEgbnVtYmVyIGBkYCBpbiB0aGUgcmFuZ2UgYC0xLjAgPCBkIDwgMC4wYCB3aWxsIHJldHVybiBgLTAuMGAsIGFuZAogICAqIGluIHRoZSByYW5nZSBgMC4wIDwgZCA8IDEuMGAgaXQgd2lsbCByZXR1cm4gMC4wLgogICAqLwogIGRvdWJsZSB0cnVuY2F0ZVRvRG91YmxlKCk7CgogIC8qKgogICAqIFByb3ZpZGUgYSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFtkb3VibGVdIHZhbHVlLgogICAqCiAgICogVGhlIHJlcHJlc2VudGF0aW9uIGlzIGEgbnVtYmVyIGxpdGVyYWwgc3VjaCB0aGF0IHRoZSBjbG9zZXN0IGRvdWJsZSB2YWx1ZQogICAqIHRvIHRoZSByZXByZXNlbnRhdGlvbidzIG1hdGhlbWF0aWNhbCB2YWx1ZSBpcyB0aGlzIFtkb3VibGVdLgogICAqCiAgICogUmV0dXJucyAiTmFOIiBmb3IgdGhlIE5vdC1hLU51bWJlciB2YWx1ZS4KICAgKiBSZXR1cm5zICJJbmZpbml0eSIgYW5kICItSW5maW5pdHkiIGZvciBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgSW5maW5pdHkuCiAgICogUmV0dXJucyAiLTAuMCIgZm9yIG5lZ2F0aXZlIHplcm8uCiAgICoKICAgKiBGb3IgYWxsIGRvdWJsZXMsIGBkYCwgY29udmVydGluZyB0byBhIHN0cmluZyBhbmQgcGFyc2luZyB0aGUgc3RyaW5nIGJhY2sKICAgKiBnaXZlcyB0aGUgc2FtZSB2YWx1ZSBhZ2FpbjogYGQgPT0gZG91YmxlLnBhcnNlKGQudG9TdHJpbmcoKSlgIChleGNlcHQgd2hlbgogICAqIGBkYCBpcyBOYU4pLgogICAqLwogIFN0cmluZyB0b1N0cmluZygpOwoKICAvKioKICAgKiBQYXJzZSBbc291cmNlXSBhcyBhbiBkb3VibGUgbGl0ZXJhbCBhbmQgcmV0dXJuIGl0cyB2YWx1ZS4KICAgKgogICAqIEFjY2VwdHMgYW4gb3B0aW9uYWwgc2lnbiAoYCtgIG9yIGAtYCkgZm9sbG93ZWQgYnkgZWl0aGVyIHRoZSBjaGFyYWN0ZXJzCiAgICogIkluZmluaXR5IiwgdGhlIGNoYXJhY3RlcnMgIk5hTiIgb3IgYSBmbG9hdGluZy1wb2ludCByZXByZXNlbnRhdGlvbi4KICAgKiBBIGZsb2F0aW5nLXBvaW50IHJlcHJlc2VudGF0aW9uIGlzIGNvbXBvc2VkIG9mIGEgbWFudGlzc2EgYW5kIGFuIG9wdGlvbmFsCiAgICogZXhwb25lbnQgcGFydC4gVGhlIG1hbnRpc3NhIGlzIGVpdGhlciBhIGRlY2ltYWwgcG9pbnQgKGAuYCkgZm9sbG93ZWQgYnkgYQogICAqIHNlcXVlbmNlIG9mIChkZWNpbWFsKSBkaWdpdHMsIG9yIGEgc2VxdWVuY2Ugb2YgZGlnaXRzCiAgICogb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIGRlY2ltYWwgcG9pbnQgYW5kIG9wdGlvbmFsbHkgbW9yZSBkaWdpdHMuIFRoZQogICAqIChvcHRpb25hbCkgZXhwb25lbnQgcGFydCBjb25zaXN0cyBvZiB0aGUgY2hhcmFjdGVyICJlIiBvciAiRSIsIGFuIG9wdGlvbmFsCiAgICogc2lnbiwgYW5kIG9uZSBvciBtb3JlIGRpZ2l0cy4KICAgKiBUaGUgW3NvdXJjZV0gbXVzdCBub3QgYmUgYG51bGxgLgogICAqCiAgICogTGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyBpZ25vcmVkLgogICAqCiAgICogSWYgdGhlIFtzb3VyY2VdIHN0cmluZyBpcyBub3QgYSB2YWxpZCBkb3VibGUgbGl0ZXJhbCwgdGhlIFtvbkVycm9yXQogICAqIGlzIGNhbGxlZCB3aXRoIHRoZSBbc291cmNlXSBhcyBhcmd1bWVudCwgYW5kIGl0cyByZXR1cm4gdmFsdWUgaXMKICAgKiB1c2VkIGluc3RlYWQuIElmIG5vIGBvbkVycm9yYCBpcyBwcm92aWRlZCwgYSBbRm9ybWF0RXhjZXB0aW9uXQogICAqIGlzIHRocm93biBpbnN0ZWFkLgogICAqCiAgICogVGhlIFtvbkVycm9yXSBmdW5jdGlvbiBpcyBvbmx5IGludm9rZWQgaWYgW3NvdXJjZV0gaXMgYSBbU3RyaW5nXSB3aXRoIGFuCiAgICogaW52YWxpZCBmb3JtYXQuIEl0IGlzIG5vdCBpbnZva2VkIGlmIFtzb3VyY2VdIGlzIGBudWxsYC4KICAgKgogICAqIEV4YW1wbGVzIG9mIGFjY2VwdGVkIHN0cmluZ3M6CiAgICoKICAgKiAgICAgIjMuMTQiCiAgICogICAgICIgIDMuMTQgXHhBMCIKICAgKiAgICAgIjAuIgogICAqICAgICAiLjAiCiAgICogICAgICItMS5lMyIKICAgKiAgICAgIjEyMzRFKzciCiAgICogICAgICIrLjEyZS05IgogICAqICAgICAiLU5hTiIKICAgKgogICAqIFRoZSBbb25FcnJvcl0gcGFyYW1ldGVyIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZC4KICAgKiBJbnN0ZWFkIG9mIGBkb3VibGUucGFyc2Uoc3RyaW5nLCAoc3RyaW5nKSB7IC4uLiB9KWAsCiAgICogeW91IHNob3VsZCB1c2UgYGRvdWJsZS50cnlQYXJzZShzdHJpbmcpID8/ICguLi4pYC4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgZG91YmxlIHBhcnNlKFN0cmluZyBzb3VyY2UsCiAgICAgIFtAZGVwcmVjYXRlZCBkb3VibGUgb25FcnJvcihTdHJpbmcgc291cmNlKV0pOwoKICAvKioKICAgKiBQYXJzZSBbc291cmNlXSBhcyBhbiBkb3VibGUgbGl0ZXJhbCBhbmQgcmV0dXJuIGl0cyB2YWx1ZS4KICAgKgogICAqIExpa2UgW3BhcnNlXSBleGNlcHQgdGhhdCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYG51bGxgIGZvciBpbnZhbGlkIGlucHV0cwogICAqIGluc3RlYWQgb2YgdGhyb3dpbmcsIGFuZCB0aGUgW3NvdXJjZV0gbXVzdCBzdGlsbCBub3QgYmUgYG51bGxgLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBkb3VibGUgdHJ5UGFyc2UoU3RyaW5nIHNvdXJjZSk7Cn0KgNwATk48ARMBQj4nAQQtA0dDTRYDQxUDTAsEJCcsNCw7AR8BHCABHyABIiABIAEcIAEGIwVFGwYeARoXATYQAQY3BTItNQYTAQYsBT03BVAGDwEGOgVQBg8BBjcFUAYOAQY/GQVQBhIBBjkFPUcFUTcFSk9FGwYaAQZHBVE3BUpCBhoBBkQFUTcFSkQGGQEGTBkFUTcFSkg2Bh0BBjYFT0IFL0wnBU5QEgYVAQY/BU1KT087TFAjJgUxBUlGRBgFTj4FIwUQFw4OERMTEAVAOjgGLjQBBj8FTkUGMgIBFWRhcnQ6Y29yZS9kb3VibGUuZGFydDFvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2RvdWJsZV9wYXRjaC5kYXJ0jq0vLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCi8vIFZNIGltcGxlbWVudGF0aW9uIG9mIGRvdWJsZS4KCkBwYXRjaApjbGFzcyBkb3VibGUgewogIHN0YXRpYyBkb3VibGUgX25hdGl2ZVBhcnNlKFN0cmluZyBzdHIsIGludCBzdGFydCwgaW50IGVuZCkKICAgICAgbmF0aXZlICJEb3VibGVfcGFyc2UiOwoKICBzdGF0aWMgZG91YmxlIF90cnlQYXJzZURvdWJsZSh2YXIgc3RyLCB2YXIgc3RhcnQsIHZhciBlbmQpIHsKICAgIGFzc2VydChzdGFydCA8IGVuZCk7CiAgICBjb25zdCBpbnQgX0RPVCA9IDB4MmU7IC8vICcuJwogICAgY29uc3QgaW50IF9aRVJPID0gMHgzMDsgLy8gJzAnCiAgICBjb25zdCBpbnQgX01JTlVTID0gMHgyZDsgLy8gJy0nCiAgICBjb25zdCBpbnQgX04gPSAweDRlOyAvLyAnTicKICAgIGNvbnN0IGludCBfYSA9IDB4NjE7IC8vICdhJwogICAgY29uc3QgaW50IF9JID0gMHg0OTsgLy8gJ0knCiAgICBjb25zdCBpbnQgX2UgPSAweDY1OyAvLyAnZScKICAgIGludCBleHBvbmVudCA9IDA7CiAgICAvLyBTZXQgdG8gbm9uLXplcm8gaWYgYSBkaWdpdCBpcyBzZWVuLiBBdm9pZHMgYWNjZXB0aW5nICIuIi4KICAgIGJvb2wgZGlnaXRzU2VlbiA9IGZhbHNlOwogICAgLy8gQWRkZWQgdG8gZXhwb25lbnQgZm9yIGVhY2ggZGlnaXQuIFNldCB0byAtMSB3aGVuIHNlZWluZyAnLicuCiAgICBpbnQgZXhwb25lbnREZWx0YSA9IDA7CiAgICBkb3VibGUgZG91YmxlVmFsdWUgPSAwLjA7CiAgICBkb3VibGUgc2lnbiA9IDEuMDsKICAgIGludCBmaXJzdENoYXIgPSBzdHIuY29kZVVuaXRBdChzdGFydCk7CiAgICBpZiAoZmlyc3RDaGFyID09IF9NSU5VUykgewogICAgICBzaWduID0gLTEuMDsKICAgICAgc3RhcnQrKzsKICAgICAgaWYgKHN0YXJ0ID09IGVuZCkgcmV0dXJuIG51bGw7CiAgICAgIGZpcnN0Q2hhciA9IHN0ci5jb2RlVW5pdEF0KHN0YXJ0KTsKICAgIH0KICAgIGlmIChmaXJzdENoYXIgPT0gX0kpIHsKICAgICAgaWYgKGVuZCA9PSBzdGFydCArIDggJiYgc3RyLnN0YXJ0c1dpdGgoIm5maW5pdHkiLCBzdGFydCArIDEpKSB7CiAgICAgICAgcmV0dXJuIHNpZ24gKiBkb3VibGUuaW5maW5pdHk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoZmlyc3RDaGFyID09IF9OKSB7CiAgICAgIGlmIChlbmQgPT0gc3RhcnQgKyAzICYmCiAgICAgICAgICBzdHIuY29kZVVuaXRBdChzdGFydCArIDEpID09IF9hICYmCiAgICAgICAgICBzdHIuY29kZVVuaXRBdChzdGFydCArIDIpID09IF9OKSB7CiAgICAgICAgcmV0dXJuIGRvdWJsZS5uYW47CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgaW50IGZpcnN0RGlnaXQgPSBmaXJzdENoYXIgXiBfWkVSTzsKICAgIGlmIChmaXJzdERpZ2l0IDw9IDkpIHsKICAgICAgc3RhcnQrKzsKICAgICAgZG91YmxlVmFsdWUgPSBmaXJzdERpZ2l0LnRvRG91YmxlKCk7CiAgICAgIGRpZ2l0c1NlZW4gPSB0cnVlOwogICAgfQogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgaW50IGMgPSBzdHIuY29kZVVuaXRBdChpKTsKICAgICAgaW50IGRpZ2l0ID0gYyBeIF9aRVJPOyAvLyAnMCctJzknIGNoYXJhY3RlcnMgYXJlIG5vdyAwLTkgaW50ZWdlcnMuCiAgICAgIGlmIChkaWdpdCA8PSA5KSB7CiAgICAgICAgZG91YmxlVmFsdWUgPSAxMC4wICogZG91YmxlVmFsdWUgKyBkaWdpdDsKICAgICAgICAvLyBEb3VibGVzIGF0IG9yIGFib3ZlIHRoaXMgdmFsdWUgKDIqKjUzKSBtaWdodCBoYXZlIGxvc3QgcHJlY2lzc2lvbi4KICAgICAgICBjb25zdCBkb3VibGUgTUFYX0VYQUNUX0RPVUJMRSA9IDkwMDcxOTkyNTQ3NDA5OTIuMDsKICAgICAgICBpZiAoZG91YmxlVmFsdWUgPj0gTUFYX0VYQUNUX0RPVUJMRSkgcmV0dXJuIG51bGw7CiAgICAgICAgZXhwb25lbnQgKz0gZXhwb25lbnREZWx0YTsKICAgICAgICBkaWdpdHNTZWVuID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChjID09IF9ET1QgJiYgZXhwb25lbnREZWx0YSA9PSAwKSB7CiAgICAgICAgZXhwb25lbnREZWx0YSA9IC0xOwogICAgICB9IGVsc2UgaWYgKChjIHwgMHgyMCkgPT0gX2UpIHsKICAgICAgICBpKys7CiAgICAgICAgaWYgKGkgPT0gZW5kKSByZXR1cm4gbnVsbDsKICAgICAgICAvLyBpbnQuX3RyeVBhcnNlU21pIHRyZWF0cyBpdHMgZW5kIGFyZ3VtZW50IGFzIGluY2x1c2l2ZS4KICAgICAgICBpbnQgZXhwUGFydCA9IGludC5fdHJ5UGFyc2VTbWkoc3RyLCBpLCBlbmQgLSAxKTsKICAgICAgICBpZiAoZXhwUGFydCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgICBleHBvbmVudCArPSBleHBQYXJ0OwogICAgICAgIGJyZWFrOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICBpZiAoIWRpZ2l0c1NlZW4pIHJldHVybiBudWxsOyAvLyBObyBkaWdpdHMuCiAgICBpZiAoZXhwb25lbnQgPT0gMCkgcmV0dXJuIHNpZ24gKiBkb3VibGVWYWx1ZTsKICAgIGNvbnN0IFAxMCA9IFBPV0VSU19PRl9URU47IC8vIEZyb20gc2hhcmVkIGxpYnJhcnkKICAgIGlmIChleHBvbmVudCA8IDApIHsKICAgICAgaW50IG5lZ0V4cG9uZW50ID0gLWV4cG9uZW50OwogICAgICBpZiAobmVnRXhwb25lbnQgPj0gUDEwLmxlbmd0aCkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiBzaWduICogKGRvdWJsZVZhbHVlIC8gUDEwW25lZ0V4cG9uZW50XSk7CiAgICB9CiAgICBpZiAoZXhwb25lbnQgPj0gUDEwLmxlbmd0aCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gc2lnbiAqIChkb3VibGVWYWx1ZSAqIFAxMFtleHBvbmVudF0pOwogIH0KCiAgc3RhdGljIGRvdWJsZSBfcGFyc2UodmFyIHN0cikgewogICAgaW50IGxlbiA9IHN0ci5sZW5ndGg7CiAgICBpbnQgc3RhcnQgPSBzdHIuX2ZpcnN0Tm9uV2hpdGVzcGFjZSgpOwogICAgaWYgKHN0YXJ0ID09IGxlbikgcmV0dXJuIG51bGw7IC8vIEFsbCB3aGl0ZXNwYWNlLgogICAgaW50IGVuZCA9IHN0ci5fbGFzdE5vbldoaXRlc3BhY2UoKSArIDE7CiAgICBhc3NlcnQoc3RhcnQgPCBlbmQpOwogICAgdmFyIHJlc3VsdCA9IF90cnlQYXJzZURvdWJsZShzdHIsIHN0YXJ0LCBlbmQpOwogICAgaWYgKHJlc3VsdCAhPSBudWxsKSByZXR1cm4gcmVzdWx0OwogICAgcmV0dXJuIF9uYXRpdmVQYXJzZShzdHIsIHN0YXJ0LCBlbmQpOwogIH0KCiAgQHBhdGNoCiAgc3RhdGljIGRvdWJsZSBwYXJzZShTdHJpbmcgc291cmNlLAogICAgICBbQGRlcHJlY2F0ZWQgZG91YmxlIG9uRXJyb3IoU3RyaW5nIHNvdXJjZSldKSB7CiAgICB2YXIgcmVzdWx0ID0gX3BhcnNlKHNvdXJjZSk7CiAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKICAgICAgaWYgKG9uRXJyb3IgPT0gbnVsbCkgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCBkb3VibGUiLCBzb3VyY2UpOwogICAgICByZXR1cm4gb25FcnJvcihzb3VyY2UpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBkb3VibGUgdHJ5UGFyc2UoU3RyaW5nIHNvdXJjZSkgPT4gX3BhcnNlKHNvdXJjZSk7Cn0KeABOTjwBHgEgAQcPPR0BPxkiIyQgICAgFkEdRBseFysfEw8lKQYbRicIEwYbHi0tGwgTBgEoGw8rGQYoIUkYMk48OiMbNBwlDSNCOSodDw8VCAYwMjYYIzI2Bi0xBAEiGis2LBkzJyoEAQklNSEaUB4GEwQBCTsCASFkYXJ0OmNvcmUtcGF0Y2gvZG91YmxlX3BhdGNoLmRhcnQub3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvZHVyYXRpb24uZGFydKagLy8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLyoqCiAqIEEgc3BhbiBvZiB0aW1lLCBzdWNoIGFzIDI3IGRheXMsIDQgaG91cnMsIDEyIG1pbnV0ZXMsIGFuZCAzIHNlY29uZHMuCiAqCiAqIEEgYER1cmF0aW9uYCByZXByZXNlbnRzIGEgZGlmZmVyZW5jZSBmcm9tIG9uZSBwb2ludCBpbiB0aW1lIHRvIGFub3RoZXIuIFRoZQogKiBkdXJhdGlvbiBtYXkgYmUgIm5lZ2F0aXZlIiBpZiB0aGUgZGlmZmVyZW5jZSBpcyBmcm9tIGEgbGF0ZXIgdGltZSB0byBhbgogKiBlYXJsaWVyLgogKgogKiBEdXJhdGlvbnMgYXJlIGNvbnRleHQgaW5kZXBlbmRlbnQuIEZvciBleGFtcGxlLCBhIGR1cmF0aW9uIG9mIDIgZGF5cyBpcwogKiBhbHdheXMgNDggaG91cnMsIGV2ZW4gd2hlbiBpdCBpcyBhZGRlZCB0byBhIGBEYXRlVGltZWAganVzdCB3aGVuIHRoZQogKiB0aW1lIHpvbmUgaXMgYWJvdXQgdG8gZG8gYSBkYXlsaWdodC1zYXZpbmdzIHN3aXRjaC4gKFNlZSBbRGF0ZVRpbWUuYWRkXSkuCiAqCiAqIERlc3BpdGUgdGhlIHNhbWUgbmFtZSwgYSBgRHVyYXRpb25gIG9iamVjdCBkb2VzIG5vdCBpbXBsZW1lbnQgIkR1cmF0aW9ucyIKICogYXMgc3BlY2lmaWVkIGJ5IElTTyA4NjAxLiBJbiBwYXJ0aWN1bGFyLCBhIGR1cmF0aW9uIG9iamVjdCBkb2VzIG5vdCBrZWVwCiAqIHRyYWNrIG9mIHRoZSBpbmRpdmlkdWFsbHkgcHJvdmlkZWQgbWVtYmVycyAoc3VjaCBhcyAiZGF5cyIgb3IgImhvdXJzIiksIGJ1dAogKiBvbmx5IHVzZXMgdGhlc2UgYXJndW1lbnRzIHRvIGNvbXB1dGUgdGhlIGxlbmd0aCBvZiB0aGUgY29ycmVzcG9uZGluZyB0aW1lCiAqIGludGVydmFsLgogKgogKiBUbyBjcmVhdGUgYSBuZXcgRHVyYXRpb24gb2JqZWN0LCB1c2UgdGhpcyBjbGFzcydzIHNpbmdsZSBjb25zdHJ1Y3RvcgogKiBnaXZpbmcgdGhlIGFwcHJvcHJpYXRlIGFyZ3VtZW50czoKICogYGBgZGFydAogKiBEdXJhdGlvbiBmYXN0ZXN0TWFyYXRob24gPSBuZXcgRHVyYXRpb24oaG91cnM6MiwgbWludXRlczozLCBzZWNvbmRzOjIpOwogKiBgYGAKICogVGhlIFtEdXJhdGlvbl0gaXMgdGhlIHN1bSBvZiBhbGwgaW5kaXZpZHVhbCBwYXJ0cy4KICogVGhpcyBtZWFucyB0aGF0IGluZGl2aWR1YWwgcGFydHMgY2FuIGJlIGxhcmdlciB0aGFuIHRoZSBuZXh0LWJpZ2dlciB1bml0LgogKiBGb3IgZXhhbXBsZSwgW2luTWludXRlc10gY2FuIGJlIGdyZWF0ZXIgdGhhbiA1OS4KICogYGBgZGFydAogKiBhc3NlcnQoZmFzdGVzdE1hcmF0aG9uLmluTWludXRlcyA9PSAxMjMpOwogKiBgYGAKICogQWxsIGluZGl2aWR1YWwgcGFydHMgYXJlIGFsbG93ZWQgdG8gYmUgbmVnYXRpdmUuCiAqCiAqIFVzZSBvbmUgb2YgdGhlIHByb3BlcnRpZXMsIHN1Y2ggYXMgW2luRGF5c10sCiAqIHRvIHJldHJpZXZlIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBEdXJhdGlvbiBpbiB0aGUgc3BlY2lmaWVkIHRpbWUgdW5pdC4KICogTm90ZSB0aGF0IHRoZSByZXR1cm5lZCB2YWx1ZSBpcyByb3VuZGVkIGRvd24uCiAqIEZvciBleGFtcGxlLAogKiBgYGBkYXJ0CiAqIER1cmF0aW9uIGFMb25nV2Vla2VuZCA9IG5ldyBEdXJhdGlvbihob3Vyczo4OCk7CiAqIGFzc2VydChhTG9uZ1dlZWtlbmQuaW5EYXlzID09IDMpOwogKiBgYGAKICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIGNvbGxlY3Rpb24gb2YgYXJpdGhtZXRpYwogKiBhbmQgY29tcGFyaXNvbiBvcGVyYXRvcnMsCiAqIHBsdXMgYSBzZXQgb2YgY29uc3RhbnRzIHVzZWZ1bCBmb3IgY29udmVydGluZyB0aW1lIHVuaXRzLgogKgogKiBTZWUgW0RhdGVUaW1lXSB0byByZXByZXNlbnQgYSBwb2ludCBpbiB0aW1lLgogKiBTZWUgW1N0b3B3YXRjaF0gdG8gbWVhc3VyZSB0aW1lLXNwYW5zLgogKi8KY2xhc3MgRHVyYXRpb24gaW1wbGVtZW50cyBDb21wYXJhYmxlPER1cmF0aW9uPiB7CiAgc3RhdGljIGNvbnN0IGludCBtaWNyb3NlY29uZHNQZXJNaWxsaXNlY29uZCA9IDEwMDA7CiAgc3RhdGljIGNvbnN0IGludCBtaWxsaXNlY29uZHNQZXJTZWNvbmQgPSAxMDAwOwogIHN0YXRpYyBjb25zdCBpbnQgc2Vjb25kc1Blck1pbnV0ZSA9IDYwOwogIHN0YXRpYyBjb25zdCBpbnQgbWludXRlc1BlckhvdXIgPSA2MDsKICBzdGF0aWMgY29uc3QgaW50IGhvdXJzUGVyRGF5ID0gMjQ7CgogIHN0YXRpYyBjb25zdCBpbnQgbWljcm9zZWNvbmRzUGVyU2Vjb25kID0KICAgICAgbWljcm9zZWNvbmRzUGVyTWlsbGlzZWNvbmQgKiBtaWxsaXNlY29uZHNQZXJTZWNvbmQ7CiAgc3RhdGljIGNvbnN0IGludCBtaWNyb3NlY29uZHNQZXJNaW51dGUgPQogICAgICBtaWNyb3NlY29uZHNQZXJTZWNvbmQgKiBzZWNvbmRzUGVyTWludXRlOwogIHN0YXRpYyBjb25zdCBpbnQgbWljcm9zZWNvbmRzUGVySG91ciA9IG1pY3Jvc2Vjb25kc1Blck1pbnV0ZSAqIG1pbnV0ZXNQZXJIb3VyOwogIHN0YXRpYyBjb25zdCBpbnQgbWljcm9zZWNvbmRzUGVyRGF5ID0gbWljcm9zZWNvbmRzUGVySG91ciAqIGhvdXJzUGVyRGF5OwoKICBzdGF0aWMgY29uc3QgaW50IG1pbGxpc2Vjb25kc1Blck1pbnV0ZSA9CiAgICAgIG1pbGxpc2Vjb25kc1BlclNlY29uZCAqIHNlY29uZHNQZXJNaW51dGU7CiAgc3RhdGljIGNvbnN0IGludCBtaWxsaXNlY29uZHNQZXJIb3VyID0gbWlsbGlzZWNvbmRzUGVyTWludXRlICogbWludXRlc1BlckhvdXI7CiAgc3RhdGljIGNvbnN0IGludCBtaWxsaXNlY29uZHNQZXJEYXkgPSBtaWxsaXNlY29uZHNQZXJIb3VyICogaG91cnNQZXJEYXk7CgogIHN0YXRpYyBjb25zdCBpbnQgc2Vjb25kc1BlckhvdXIgPSBzZWNvbmRzUGVyTWludXRlICogbWludXRlc1BlckhvdXI7CiAgc3RhdGljIGNvbnN0IGludCBzZWNvbmRzUGVyRGF5ID0gc2Vjb25kc1BlckhvdXIgKiBob3Vyc1BlckRheTsKCiAgc3RhdGljIGNvbnN0IGludCBtaW51dGVzUGVyRGF5ID0gbWludXRlc1BlckhvdXIgKiBob3Vyc1BlckRheTsKCiAgc3RhdGljIGNvbnN0IER1cmF0aW9uIHplcm8gPSBEdXJhdGlvbihzZWNvbmRzOiAwKTsKCiAgLyoKICAgKiBUaGUgdmFsdWUgb2YgdGhpcyBEdXJhdGlvbiBvYmplY3QgaW4gbWljcm9zZWNvbmRzLgogICAqLwogIGZpbmFsIGludCBfZHVyYXRpb247CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgRHVyYXRpb24gb2JqZWN0IHdob3NlIHZhbHVlCiAgICogaXMgdGhlIHN1bSBvZiBhbGwgaW5kaXZpZHVhbCBwYXJ0cy4KICAgKgogICAqIEluZGl2aWR1YWwgcGFydHMgY2FuIGJlIGxhcmdlciB0aGFuIHRoZSBuZXh0LWJpZ2dlciB1bml0LgogICAqIEZvciBleGFtcGxlLCBbaG91cnNdIGNhbiBiZSBncmVhdGVyIHRoYW4gMjMuCiAgICoKICAgKiBBbGwgaW5kaXZpZHVhbCBwYXJ0cyBhcmUgYWxsb3dlZCB0byBiZSBuZWdhdGl2ZS4KICAgKiBBbGwgYXJndW1lbnRzIGFyZSAwIGJ5IGRlZmF1bHQuCiAgICovCiAgY29uc3QgRHVyYXRpb24oCiAgICAgIHtpbnQgZGF5cyA9IDAsCiAgICAgIGludCBob3VycyA9IDAsCiAgICAgIGludCBtaW51dGVzID0gMCwKICAgICAgaW50IHNlY29uZHMgPSAwLAogICAgICBpbnQgbWlsbGlzZWNvbmRzID0gMCwKICAgICAgaW50IG1pY3Jvc2Vjb25kcyA9IDB9KQogICAgICA6IHRoaXMuX21pY3Jvc2Vjb25kcyhtaWNyb3NlY29uZHNQZXJEYXkgKiBkYXlzICsKICAgICAgICAgICAgbWljcm9zZWNvbmRzUGVySG91ciAqIGhvdXJzICsKICAgICAgICAgICAgbWljcm9zZWNvbmRzUGVyTWludXRlICogbWludXRlcyArCiAgICAgICAgICAgIG1pY3Jvc2Vjb25kc1BlclNlY29uZCAqIHNlY29uZHMgKwogICAgICAgICAgICBtaWNyb3NlY29uZHNQZXJNaWxsaXNlY29uZCAqIG1pbGxpc2Vjb25kcyArCiAgICAgICAgICAgIG1pY3Jvc2Vjb25kcyk7CgogIC8vIEZhc3QgcGF0aCBpbnRlcm5hbCBkaXJlY3QgY29uc3RydWN0b3IgdG8gYXZvaWRzIHRoZSBvcHRpb25hbCBhcmd1bWVudHMgYW5kCiAgLy8gW19taWNyb3NlY29uZHNdIHJlY29tcHV0YXRpb24uCiAgY29uc3QgRHVyYXRpb24uX21pY3Jvc2Vjb25kcyh0aGlzLl9kdXJhdGlvbik7CgogIC8qKgogICAqIEFkZHMgdGhpcyBEdXJhdGlvbiBhbmQgW290aGVyXSBhbmQKICAgKiByZXR1cm5zIHRoZSBzdW0gYXMgYSBuZXcgRHVyYXRpb24gb2JqZWN0LgogICAqLwogIER1cmF0aW9uIG9wZXJhdG9yICsoRHVyYXRpb24gb3RoZXIpIHsKICAgIHJldHVybiBEdXJhdGlvbi5fbWljcm9zZWNvbmRzKF9kdXJhdGlvbiArIG90aGVyLl9kdXJhdGlvbik7CiAgfQoKICAvKioKICAgKiBTdWJ0cmFjdHMgW290aGVyXSBmcm9tIHRoaXMgRHVyYXRpb24gYW5kCiAgICogcmV0dXJucyB0aGUgZGlmZmVyZW5jZSBhcyBhIG5ldyBEdXJhdGlvbiBvYmplY3QuCiAgICovCiAgRHVyYXRpb24gb3BlcmF0b3IgLShEdXJhdGlvbiBvdGhlcikgewogICAgcmV0dXJuIER1cmF0aW9uLl9taWNyb3NlY29uZHMoX2R1cmF0aW9uIC0gb3RoZXIuX2R1cmF0aW9uKTsKICB9CgogIC8qKgogICAqIE11bHRpcGxpZXMgdGhpcyBEdXJhdGlvbiBieSB0aGUgZ2l2ZW4gW2ZhY3Rvcl0gYW5kIHJldHVybnMgdGhlIHJlc3VsdAogICAqIGFzIGEgbmV3IER1cmF0aW9uIG9iamVjdC4KICAgKgogICAqIE5vdGUgdGhhdCB3aGVuIFtmYWN0b3JdIGlzIGEgZG91YmxlLCBhbmQgdGhlIGR1cmF0aW9uIGlzIGdyZWF0ZXIgdGhhbgogICAqIDUzIGJpdHMsIHByZWNpc2lvbiBpcyBsb3N0IGJlY2F1c2Ugb2YgZG91YmxlLXByZWNpc2lvbiBhcml0aG1ldGljLgogICAqLwogIER1cmF0aW9uIG9wZXJhdG9yICoobnVtIGZhY3RvcikgewogICAgcmV0dXJuIER1cmF0aW9uLl9taWNyb3NlY29uZHMoKF9kdXJhdGlvbiAqIGZhY3Rvcikucm91bmQoKSk7CiAgfQoKICAvKioKICAgKiBEaXZpZGVzIHRoaXMgRHVyYXRpb24gYnkgdGhlIGdpdmVuIFtxdW90aWVudF0gYW5kIHJldHVybnMgdGhlIHRydW5jYXRlZAogICAqIHJlc3VsdCBhcyBhIG5ldyBEdXJhdGlvbiBvYmplY3QuCiAgICoKICAgKiBUaHJvd3MgYW4gW0ludGVnZXJEaXZpc2lvbkJ5WmVyb0V4Y2VwdGlvbl0gaWYgW3F1b3RpZW50XSBpcyBgMGAuCiAgICovCiAgRHVyYXRpb24gb3BlcmF0b3Igfi8oaW50IHF1b3RpZW50KSB7CiAgICAvLyBCeSBkb2luZyB0aGUgY2hlY2sgaGVyZSBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gIn4vIiBiZWxvdyB3ZSBnZXQgdGhlCiAgICAvLyBleGNlcHRpb24gZXZlbiB3aXRoIGRhcnQyanMuCiAgICBpZiAocXVvdGllbnQgPT0gMCkgdGhyb3cgSW50ZWdlckRpdmlzaW9uQnlaZXJvRXhjZXB0aW9uKCk7CiAgICByZXR1cm4gRHVyYXRpb24uX21pY3Jvc2Vjb25kcyhfZHVyYXRpb24gfi8gcXVvdGllbnQpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlIG9mIHRoaXMgRHVyYXRpb24KICAgKiBpcyBsZXNzIHRoYW4gdGhlIHZhbHVlIG9mIFtvdGhlcl0uCiAgICovCiAgYm9vbCBvcGVyYXRvciA8KER1cmF0aW9uIG90aGVyKSA9PiB0aGlzLl9kdXJhdGlvbiA8IG90aGVyLl9kdXJhdGlvbjsKCiAgLyoqCiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlIG9mIHRoaXMgRHVyYXRpb24KICAgKiBpcyBncmVhdGVyIHRoYW4gdGhlIHZhbHVlIG9mIFtvdGhlcl0uCiAgICovCiAgYm9vbCBvcGVyYXRvciA+KER1cmF0aW9uIG90aGVyKSA9PiB0aGlzLl9kdXJhdGlvbiA+IG90aGVyLl9kdXJhdGlvbjsKCiAgLyoqCiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlIG9mIHRoaXMgRHVyYXRpb24KICAgKiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHZhbHVlIG9mIFtvdGhlcl0uCiAgICovCiAgYm9vbCBvcGVyYXRvciA8PShEdXJhdGlvbiBvdGhlcikgPT4gdGhpcy5fZHVyYXRpb24gPD0gb3RoZXIuX2R1cmF0aW9uOwoKICAvKioKICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWUgb2YgdGhpcyBEdXJhdGlvbgogICAqIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgdmFsdWUgb2YgW290aGVyXS4KICAgKi8KICBib29sIG9wZXJhdG9yID49KER1cmF0aW9uIG90aGVyKSA9PiB0aGlzLl9kdXJhdGlvbiA+PSBvdGhlci5fZHVyYXRpb247CgogIC8qKgogICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3aG9sZSBkYXlzIHNwYW5uZWQgYnkgdGhpcyBEdXJhdGlvbi4KICAgKi8KICBpbnQgZ2V0IGluRGF5cyA9PiBfZHVyYXRpb24gfi8gRHVyYXRpb24ubWljcm9zZWNvbmRzUGVyRGF5OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygd2hvbGUgaG91cnMgc3Bhbm5lZCBieSB0aGlzIER1cmF0aW9uLgogICAqCiAgICogVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZSBncmVhdGVyIHRoYW4gMjMuCiAgICovCiAgaW50IGdldCBpbkhvdXJzID0+IF9kdXJhdGlvbiB+LyBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJIb3VyOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygd2hvbGUgbWludXRlcyBzcGFubmVkIGJ5IHRoaXMgRHVyYXRpb24uCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlIGdyZWF0ZXIgdGhhbiA1OS4KICAgKi8KICBpbnQgZ2V0IGluTWludXRlcyA9PiBfZHVyYXRpb24gfi8gRHVyYXRpb24ubWljcm9zZWNvbmRzUGVyTWludXRlOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygd2hvbGUgc2Vjb25kcyBzcGFubmVkIGJ5IHRoaXMgRHVyYXRpb24uCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlIGdyZWF0ZXIgdGhhbiA1OS4KICAgKi8KICBpbnQgZ2V0IGluU2Vjb25kcyA9PiBfZHVyYXRpb24gfi8gRHVyYXRpb24ubWljcm9zZWNvbmRzUGVyU2Vjb25kOwoKICAvKioKICAgKiBSZXR1cm5zIG51bWJlciBvZiB3aG9sZSBtaWxsaXNlY29uZHMgc3Bhbm5lZCBieSB0aGlzIER1cmF0aW9uLgogICAqCiAgICogVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZSBncmVhdGVyIHRoYW4gOTk5LgogICAqLwogIGludCBnZXQgaW5NaWxsaXNlY29uZHMgPT4gX2R1cmF0aW9uIH4vIER1cmF0aW9uLm1pY3Jvc2Vjb25kc1Blck1pbGxpc2Vjb25kOwoKICAvKioKICAgKiBSZXR1cm5zIG51bWJlciBvZiB3aG9sZSBtaWNyb3NlY29uZHMgc3Bhbm5lZCBieSB0aGlzIER1cmF0aW9uLgogICAqLwogIGludCBnZXQgaW5NaWNyb3NlY29uZHMgPT4gX2R1cmF0aW9uOwoKICAvKioKICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIFtEdXJhdGlvbl0gaGFzIHRoZSBzYW1lIHZhbHVlIGFzIFtvdGhlcl0uCiAgICovCiAgYm9vbCBvcGVyYXRvciA9PShkeW5hbWljIG90aGVyKSA9PgogICAgICBvdGhlciBpcyBEdXJhdGlvbiAmJiBfZHVyYXRpb24gPT0gb3RoZXIuaW5NaWNyb3NlY29uZHM7CgogIGludCBnZXQgaGFzaENvZGUgPT4gX2R1cmF0aW9uLmhhc2hDb2RlOwoKICAvKioKICAgKiBDb21wYXJlcyB0aGlzIFtEdXJhdGlvbl0gdG8gW290aGVyXSwgcmV0dXJuaW5nIHplcm8gaWYgdGhlIHZhbHVlcyBhcmUgZXF1YWwuCiAgICoKICAgKiBSZXR1cm5zIGEgbmVnYXRpdmUgaW50ZWdlciBpZiB0aGlzIGBEdXJhdGlvbmAgaXMgc2hvcnRlciB0aGFuCiAgICogW290aGVyXSwgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIGl0IGlzIGxvbmdlci4KICAgKgogICAqIEEgbmVnYXRpdmUgYER1cmF0aW9uYCBpcyBhbHdheXMgY29uc2lkZXJlZCBzaG9ydGVyIHRoYW4gYSBwb3NpdGl2ZSBvbmUuCiAgICoKICAgKiBJdCBpcyBhbHdheXMgdGhlIGNhc2UgdGhhdCBgZHVyYXRpb24xLmNvbXBhcmVUbyhkdXJhdGlvbjIpIDwgMGAgaWZmCiAgICogYChzb21lRGF0ZSArIGR1cmF0aW9uMSkuY29tcGFyZVRvKHNvbWVEYXRlICsgZHVyYXRpb24yKSA8IDBgLgogICAqLwogIGludCBjb21wYXJlVG8oRHVyYXRpb24gb3RoZXIpID0+IF9kdXJhdGlvbi5jb21wYXJlVG8ob3RoZXIuX2R1cmF0aW9uKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGBEdXJhdGlvbmAuCiAgICoKICAgKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGFuZCBtaWNyb3NlY29uZHMsIGluIHRoZQogICAqIGZvbGxvd2luZyBmb3JtYXQ6IGBISDpNTTpTUy5tbW1tbW1gLiBGb3IgZXhhbXBsZSwKICAgKgogICAqICAgICB2YXIgZCA9IG5ldyBEdXJhdGlvbihkYXlzOjEsIGhvdXJzOjEsIG1pbnV0ZXM6MzMsIG1pY3Jvc2Vjb25kczogNTAwKTsKICAgKiAgICAgZC50b1N0cmluZygpOyAgLy8gIjI1OjMzOjAwLjAwMDUwMCIKICAgKi8KICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmcgc2l4RGlnaXRzKGludCBuKSB7CiAgICAgIGlmIChuID49IDEwMDAwMCkgcmV0dXJuICIkbiI7CiAgICAgIGlmIChuID49IDEwMDAwKSByZXR1cm4gIjAkbiI7CiAgICAgIGlmIChuID49IDEwMDApIHJldHVybiAiMDAkbiI7CiAgICAgIGlmIChuID49IDEwMCkgcmV0dXJuICIwMDAkbiI7CiAgICAgIGlmIChuID49IDEwKSByZXR1cm4gIjAwMDAkbiI7CiAgICAgIHJldHVybiAiMDAwMDAkbiI7CiAgICB9CgogICAgU3RyaW5nIHR3b0RpZ2l0cyhpbnQgbikgewogICAgICBpZiAobiA+PSAxMCkgcmV0dXJuICIkbiI7CiAgICAgIHJldHVybiAiMCRuIjsKICAgIH0KCiAgICBpZiAoaW5NaWNyb3NlY29uZHMgPCAwKSB7CiAgICAgIHJldHVybiAiLSR7LXRoaXN9IjsKICAgIH0KICAgIFN0cmluZyB0d29EaWdpdE1pbnV0ZXMgPSB0d29EaWdpdHMoaW5NaW51dGVzLnJlbWFpbmRlcihtaW51dGVzUGVySG91cikpOwogICAgU3RyaW5nIHR3b0RpZ2l0U2Vjb25kcyA9IHR3b0RpZ2l0cyhpblNlY29uZHMucmVtYWluZGVyKHNlY29uZHNQZXJNaW51dGUpKTsKICAgIFN0cmluZyBzaXhEaWdpdFVzID0KICAgICAgICBzaXhEaWdpdHMoaW5NaWNyb3NlY29uZHMucmVtYWluZGVyKG1pY3Jvc2Vjb25kc1BlclNlY29uZCkpOwogICAgcmV0dXJuICIkaW5Ib3VyczokdHdvRGlnaXRNaW51dGVzOiR0d29EaWdpdFNlY29uZHMuJHNpeERpZ2l0VXMiOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgYER1cmF0aW9uYCBpcyBuZWdhdGl2ZS4KICAgKgogICAqIEEgbmVnYXRpdmUgYER1cmF0aW9uYCByZXByZXNlbnRzIHRoZSBkaWZmZXJlbmNlIGZyb20gYSBsYXRlciB0aW1lIHRvIGFuCiAgICogZWFybGllciB0aW1lLgogICAqLwogIGJvb2wgZ2V0IGlzTmVnYXRpdmUgPT4gX2R1cmF0aW9uIDwgMDsKCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBgRHVyYXRpb25gIHJlcHJlc2VudGluZyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhpcwogICAqIGBEdXJhdGlvbmAuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgYER1cmF0aW9uYCBoYXMgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoaXMgb25lLCBidXQgaXMgYWx3YXlzCiAgICogcG9zaXRpdmUuCiAgICovCiAgRHVyYXRpb24gYWJzKCkgPT4gRHVyYXRpb24uX21pY3Jvc2Vjb25kcyhfZHVyYXRpb24uYWJzKCkpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IGBEdXJhdGlvbmAgcmVwcmVzZW50aW5nIHRoaXMgYER1cmF0aW9uYCBuZWdhdGVkLgogICAqCiAgICogVGhlIHJldHVybmVkIGBEdXJhdGlvbmAgaGFzIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGlzIG9uZSwgYnV0IHdpbGwgaGF2ZSB0aGUKICAgKiBvcHBvc2l0ZSBzaWduIG9mIHRoaXMgb25lLgogICAqLwogIC8vIFVzaW5nIHN1YnRyYWN0aW9uIGhlbHBzIGRhcnQyanMgYXZvaWQgbmVnYXRpdmUgemVyb3MuCiAgRHVyYXRpb24gb3BlcmF0b3IgLSgpID0+IER1cmF0aW9uLl9taWNyb3NlY29uZHMoMCAtIF9kdXJhdGlvbik7Cn0KgScATk48ARMBBEgDT0sMA0tITQNNTE9NDQNIJQtLBzZNNAstBzQDME0xEAszJQcyHT0DMCoEMTYxKiglASs6KzBRSwErMFFLAUdBAUEBNQEFOAYXAQYvKQU/MgU2JQYSFRUXFxwdNyouLjgbAVAkMAEGKC8GKEAEAQYuNgYoQAQBBksfBUtIBiRBBAEGTSYFRgYnSyQ/OgQBBjIoBkcBBjIrBkcBBjI0BkkBBjI3BkkBBkAGPgEGQQUwBkABBkMFMAZEAQZDBTAGRAEGRAUxBk4BBkQGJwEGRgYlPgEqAQZSBUM1BU0FSUMGSQEGOQVNNwVPLQYWHiQkJCQkGAYBHiAUBgEeGgZNTxhERQQBBjIFTRMGKAEGRhEFTA8GPQEGRAVQIAY7QgIBF2RhcnQ6Y29yZS9kdXJhdGlvbi5kYXJ0LG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL2Vycm9ycy5kYXJ0wABL/S8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCi8qKgogKiBFcnJvciBvYmplY3RzIHRocm93biBpbiB0aGUgY2FzZSBvZiBhIHByb2dyYW0gZmFpbHVyZS4KICoKICogQW4gYEVycm9yYCBvYmplY3QgcmVwcmVzZW50cyBhIHByb2dyYW0gZmFpbHVyZSB0aGF0IHRoZSBwcm9ncmFtbWVyCiAqIHNob3VsZCBoYXZlIGF2b2lkZWQuCiAqCiAqIEV4YW1wbGVzIGluY2x1ZGUgY2FsbGluZyBhIGZ1bmN0aW9uIHdpdGggaW52YWxpZCBhcmd1bWVudHMsCiAqIG9yIGV2ZW4gd2l0aCB0aGUgd3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cywKICogb3IgY2FsbGluZyBpdCBhdCBhIHRpbWUgd2hlbiBpdCBpcyBub3QgYWxsb3dlZC4KICoKICogVGhlc2UgYXJlIG5vdCBlcnJvcnMgdGhhdCBhIGNhbGxlciBzaG91bGQgZXhwZWN0IG9yIGNhdGNoIC0KICogaWYgdGhleSBvY2N1ciwgdGhlIHByb2dyYW0gaXMgZXJyb25lb3VzLAogKiBhbmQgdGVybWluYXRpbmcgdGhlIHByb2dyYW0gbWF5IGJlIHRoZSBzYWZlc3QgcmVzcG9uc2UuCiAqCiAqIFdoZW4gZGVjaWRpbmcgdGhhdCBhIGZ1bmN0aW9uIHRocm93cyBhbiBlcnJvciwKICogdGhlIGNvbmRpdGlvbnMgd2hlcmUgaXQgaGFwcGVucyBzaG91bGQgYmUgY2xlYXJseSBkZXNjcmliZWQsCiAqIGFuZCB0aGV5IHNob3VsZCBiZSBkZXRlY3RhYmxlIGFuZCBwcmVkaWN0YWJsZSwKICogc28gdGhlIHByb2dyYW1tZXIgdXNpbmcgdGhlIGZ1bmN0aW9uIGNhbiBhdm9pZCB0cmlnZ2VyaW5nIHRoZSBlcnJvci4KICoKICogU3VjaCBkZXNjcmlwdGlvbnMgb2Z0ZW4gdXNlcyB3b3JkcyBsaWtlCiAqICJtdXN0IiBvciAibXVzdCBub3QiIHRvIGRlc2NyaWJlIHRoZSBjb25kaXRpb24sCiAqIGFuZCBpZiB5b3Ugc2VlIHdvcmRzIGxpa2UgdGhhdCBpbiBhIGZ1bmN0aW9uJ3MgZG9jdW1lbnRhdGlvbiwKICogdGhlbiBub3Qgc2F0aXNmeWluZyB0aGUgcmVxdWlyZW1lbnQKICogaXMgdmVyeSBsaWtlbHkgdG8gY2F1c2UgYW4gZXJyb3IgdG8gYmUgdGhyb3duLgogKgogKiBFeGFtcGxlIChmcm9tIFtTdHJpbmcuY29udGFpbnNdKToKICoKICogICAgICAgIGBzdGFydEluZGV4YCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gYGxlbmd0aGAuCiAqCiAqIEluIHRoaXMgY2FzZSwgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgYHN0YXJ0SW5kZXhgIGlzIG5lZ2F0aXZlCiAqIG9yIHRvbyBsYXJnZS4KICoKICogSWYgdGhlIGNvbmRpdGlvbnMgYXJlIG5vdCBkZXRlY3RhYmxlIGJlZm9yZSBjYWxsaW5nIGEgZnVuY3Rpb24sCiAqIHRoZSBjYWxsZWQgZnVuY3Rpb24gc2hvdWxkIG5vdCB0aHJvdyBhbiBgRXJyb3JgLgogKiBJdCBtYXkgc3RpbGwgdGhyb3cgYSB2YWx1ZSwKICogYnV0IHRoZSBjYWxsZXIgd2lsbCBoYXZlIHRvIGNhdGNoIHRoZSB0aHJvd24gdmFsdWUsCiAqIGVmZmVjdGl2ZWx5IG1ha2luZyBpdCBhbiBhbHRlcm5hdGl2ZSByZXN1bHQgcmF0aGVyIHRoYW4gYW4gZXJyb3IuCiAqIFRoZSB0aHJvd24gb2JqZWN0IGNhbiBjaG9vc2UgdG8gaW1wbGVtZW50IFtFeGNlcHRpb25dCiAqIHRvIGRvY3VtZW50IHRoYXQgaXQgcmVwcmVzZW50cyBhbiBleGNlcHRpb25hbCwgYnV0IG5vdCBlcnJvbmVvdXMsIG9jY3VycmVuY2UsCiAqIGJ1dCBpdCBoYXMgbm8gb3RoZXIgZWZmZWN0IHRoYW4gZG9jdW1lbnRhdGlvbi4KICoKICogQWxsIG5vbi1gbnVsbGAgdmFsdWVzIGNhbiBiZSB0aHJvd24gaW4gRGFydC4KICogT2JqZWN0cyBleHRlbmRpbmcgYEVycm9yYCBhcmUgaGFuZGxlZCBzcGVjaWFsbHk6CiAqIFRoZSBmaXJzdCB0aW1lIHRoZXkgYXJlIHRocm93biwKICogdGhlIHN0YWNrIHRyYWNlIGF0IHRoZSB0aHJvdyBwb2ludCBpcyByZWNvcmRlZAogKiBhbmQgc3RvcmVkIGluIHRoZSBlcnJvciBvYmplY3QuCiAqIEl0IGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgdGhlIFtzdGFja1RyYWNlXSBnZXR0ZXIuCiAqIEFuIGVycm9yIG9iamVjdCB0aGF0IG1lcmVseSBpbXBsZW1lbnRzIGBFcnJvcmAsIGFuZCBkb2Vzbid0IGV4dGVuZCBpdCwKICogd2lsbCBub3Qgc3RvcmUgdGhlIHN0YWNrIHRyYWNlIGF1dG9tYXRpY2FsbHkuCiAqCiAqIEVycm9yIG9iamVjdHMgYXJlIGFsc28gdXNlZCBmb3Igc3lzdGVtIHdpZGUgZmFpbHVyZXMKICogbGlrZSBzdGFjayBvdmVyZmxvdyBvciBhbiBvdXQtb2YtbWVtb3J5IHNpdHVhdGlvbi4KICoKICogU2luY2UgZXJyb3JzIGFyZSBub3QgY3JlYXRlZCB0byBiZSBjYXVnaHQsCiAqIHRoZXJlIGlzIG5vIG5lZWQgZm9yIHN1YmNsYXNzZXMgdG8gZGlzdGluZ3Vpc2ggdGhlIGVycm9ycy4KICogSW5zdGVhZCBzdWJjbGFzc2VzIGhhdmUgYmVlbiBjcmVhdGVkIGluIG9yZGVyIHRvIG1ha2UgZ3JvdXBzCiAqIG9mIHJlbGF0ZWQgZXJyb3JzIGVhc3kgdG8gY3JlYXRlIHdpdGggY29uc2lzdGVudCBlcnJvciBtZXNzYWdlcy4KICogRm9yIGV4YW1wbGUsIHRoZSBbU3RyaW5nLmNvbnRhaW5zXSBtZXRob2Qgd2lsbCB1c2UgYSBbUmFuZ2VFcnJvcl0KICogaWYgaXRzIGBzdGFydEluZGV4YCBpc24ndCBpbiB0aGUgcmFuZ2UgYDAuLmxlbmd0aGAsCiAqIHdoaWNoIGlzIGVhc2lseSBjcmVhdGVkIGJ5IGBuZXcgUmFuZ2VFcnJvci5yYW5nZShzdGFydEluZGV4LCAwLCBsZW5ndGgpYC4KICovCmNsYXNzIEVycm9yIHsKICBFcnJvcigpOyAvLyBQcmV2ZW50IHVzZSBhcyBtaXhpbi4KCiAgLyoqCiAgICogU2FmZWx5IGNvbnZlcnQgYSB2YWx1ZSB0byBhIFtTdHJpbmddIGRlc2NyaXB0aW9uLgogICAqCiAgICogVGhlIGNvbnZlcnNpb24gaXMgZ3VhcmFudGVlZCB0byBub3QgdGhyb3csIHNvIGl0IHdvbid0IHVzZSB0aGUgb2JqZWN0J3MKICAgKiB0b1N0cmluZyBtZXRob2QuCiAgICovCiAgc3RhdGljIFN0cmluZyBzYWZlVG9TdHJpbmcoT2JqZWN0IG9iamVjdCkgewogICAgaWYgKG9iamVjdCBpcyBudW0gfHwgb2JqZWN0IGlzIGJvb2wgfHwgbnVsbCA9PSBvYmplY3QpIHsKICAgICAgcmV0dXJuIG9iamVjdC50b1N0cmluZygpOwogICAgfQogICAgaWYgKG9iamVjdCBpcyBTdHJpbmcpIHsKICAgICAgcmV0dXJuIF9zdHJpbmdUb1NhZmVTdHJpbmcob2JqZWN0KTsKICAgIH0KICAgIHJldHVybiBfb2JqZWN0VG9TdHJpbmcob2JqZWN0KTsKICB9CgogIC8qKiBDb252ZXJ0IHN0cmluZyB0byBhIHZhbGlkIHN0cmluZyBsaXRlcmFsIHdpdGggbm8gY29udHJvbCBjaGFyYWN0ZXJzLiAqLwogIGV4dGVybmFsIHN0YXRpYyBTdHJpbmcgX3N0cmluZ1RvU2FmZVN0cmluZyhTdHJpbmcgc3RyaW5nKTsKCiAgZXh0ZXJuYWwgc3RhdGljIFN0cmluZyBfb2JqZWN0VG9TdHJpbmcoT2JqZWN0IG9iamVjdCk7CgogIGV4dGVybmFsIFN0YWNrVHJhY2UgZ2V0IHN0YWNrVHJhY2U7Cn0KCi8qKgogKiBFcnJvciB0aHJvd24gYnkgdGhlIHJ1bnRpbWUgc3lzdGVtIHdoZW4gYW4gYXNzZXJ0IHN0YXRlbWVudCBmYWlscy4KICovCmNsYXNzIEFzc2VydGlvbkVycm9yIGV4dGVuZHMgRXJyb3IgewogIC8qKiBNZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGFzc2VydGlvbiBlcnJvci4gKi8KICBmaW5hbCBPYmplY3QgbWVzc2FnZTsKICBBc3NlcnRpb25FcnJvcihbdGhpcy5tZXNzYWdlXSk7CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIkFzc2VydGlvbiBmYWlsZWQiOwp9CgovKioKICogRXJyb3IgdGhyb3duIGJ5IHRoZSBydW50aW1lIHN5c3RlbSB3aGVuIGEgdHlwZSBhc3NlcnRpb24gZmFpbHMuCiAqLwpjbGFzcyBUeXBlRXJyb3IgZXh0ZW5kcyBBc3NlcnRpb25FcnJvciB7fQoKLyoqCiAqIEVycm9yIHRocm93biBieSB0aGUgcnVudGltZSBzeXN0ZW0gd2hlbiBhIGNhc3Qgb3BlcmF0aW9uIGZhaWxzLgogKi8KY2xhc3MgQ2FzdEVycm9yIGV4dGVuZHMgRXJyb3Ige30KCi8qKgogKiBFcnJvciB0aHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHRocm93IFs6bnVsbDpdLgogKi8KY2xhc3MgTnVsbFRocm93bkVycm9yIGV4dGVuZHMgRXJyb3IgewogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBOdWxsVGhyb3duRXJyb3IoKTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiVGhyb3cgb2YgbnVsbC4iOwp9CgovKioKICogRXJyb3IgdGhyb3duIHdoZW4gYSBmdW5jdGlvbiBpcyBwYXNzZWQgYW4gdW5hY2NlcHRhYmxlIGFyZ3VtZW50LgogKi8KY2xhc3MgQXJndW1lbnRFcnJvciBleHRlbmRzIEVycm9yIHsKICAvKiogV2hldGhlciB2YWx1ZSB3YXMgcHJvdmlkZWQuICovCiAgZmluYWwgYm9vbCBfaGFzVmFsdWU7CiAgLyoqIFRoZSBpbnZhbGlkIHZhbHVlLiAqLwogIGZpbmFsIGludmFsaWRWYWx1ZTsKICAvKiogTmFtZSBvZiB0aGUgaW52YWxpZCBhcmd1bWVudCwgaWYgYXZhaWxhYmxlLiAqLwogIGZpbmFsIFN0cmluZyBuYW1lOwogIC8qKiBNZXNzYWdlIGRlc2NyaWJpbmcgdGhlIHByb2JsZW0uICovCiAgZmluYWwgbWVzc2FnZTsKCiAgLyoqCiAgICogVGhlIFttZXNzYWdlXSBkZXNjcmliZXMgdGhlIGVycm9uZW91cyBhcmd1bWVudC4KICAgKgogICAqIEV4aXN0aW5nIGNvZGUgbWF5IGJlIHVzaW5nIGBtZXNzYWdlYCB0byBob2xkIHRoZSBpbnZhbGlkIHZhbHVlLgogICAqIElmIHRoZSBgbWVzc2FnZWAgaXMgbm90IGEgW1N0cmluZ10sIGl0IGlzIGFzc3VtZWQgdG8gYmUgYSB2YWx1ZSBpbnN0ZWFkCiAgICogb2YgYSBtZXNzYWdlLgogICAqLwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBBcmd1bWVudEVycm9yKFt0aGlzLm1lc3NhZ2VdKQogICAgICA6IGludmFsaWRWYWx1ZSA9IG51bGwsCiAgICAgICAgX2hhc1ZhbHVlID0gZmFsc2UsCiAgICAgICAgbmFtZSA9IG51bGw7CgogIC8qKgogICAqIENyZWF0ZXMgZXJyb3IgY29udGFpbmluZyB0aGUgaW52YWxpZCBbdmFsdWVdLgogICAqCiAgICogQSBtZXNzYWdlIGlzIGJ1aWx0IGJ5IHN1ZmZpeGluZyB0aGUgW21lc3NhZ2VdIGFyZ3VtZW50IHdpdGgKICAgKiB0aGUgW25hbWVdIGFyZ3VtZW50IChpZiBwcm92aWRlZCkgYW5kIHRoZSB2YWx1ZS4gRXhhbXBsZQogICAqCiAgICogICAgIkludmFsaWQgYXJndW1lbnQgKGZvbyk6IG51bGwiCiAgICoKICAgKiBUaGUgYG5hbWVgIHNob3VsZCBtYXRjaCB0aGUgYXJndW1lbnQgbmFtZSBvZiB0aGUgZnVuY3Rpb24sIGJ1dCBpZgogICAqIHRoZSBmdW5jdGlvbiBpcyBhIG1ldGhvZCBpbXBsZW1lbnRpbmcgYW4gaW50ZXJmYWNlLCBhbmQgaXRzIGFyZ3VtZW50CiAgICogbmFtZXMgZGlmZmVyIGZyb20gdGhlIGludGVyZmFjZSwgaXQgbWlnaHQgYmUgbW9yZSB1c2VmdWwgdG8gdXNlIHRoZQogICAqIGludGVyZmFjZSBtZXRob2QncyBhcmd1bWVudCBuYW1lIChvciBqdXN0IHJlbmFtZSBhcmd1bWVudHMgdG8gbWF0Y2gpLgogICAqLwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBBcmd1bWVudEVycm9yLnZhbHVlKHZhbHVlLCBbdGhpcy5uYW1lLCB0aGlzLm1lc3NhZ2VdKQogICAgICA6IGludmFsaWRWYWx1ZSA9IHZhbHVlLAogICAgICAgIF9oYXNWYWx1ZSA9IHRydWU7CgogIC8qKgogICAqIENyZWF0ZSBhbiBhcmd1bWVudCBlcnJvciBmb3IgYSBgbnVsbGAgYXJndW1lbnQgdGhhdCBtdXN0IG5vdCBiZSBgbnVsbGAuCiAgICovCiAgQXJndW1lbnRFcnJvci5ub3ROdWxsKFt0aGlzLm5hbWVdKQogICAgICA6IF9oYXNWYWx1ZSA9IGZhbHNlLAogICAgICAgIG1lc3NhZ2UgPSAiTXVzdCBub3QgYmUgbnVsbCIsCiAgICAgICAgaW52YWxpZFZhbHVlID0gbnVsbDsKCiAgLyoqCiAgICogVGhyb3dzIGlmIFthcmd1bWVudF0gaXMgYG51bGxgLgogICAqLwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgdm9pZCBjaGVja05vdE51bGwoT2JqZWN0IGFyZ3VtZW50LCBbU3RyaW5nIG5hbWVdKSB7CiAgICBpZiAoYXJndW1lbnQgPT0gbnVsbCkgdGhyb3cgQXJndW1lbnRFcnJvci5ub3ROdWxsKG5hbWUpOwogIH0KCiAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdG9TdHJpbmcgb3ZlcnJpZGRlbiBpbiBzdWJjbGFzc2VzLgogIFN0cmluZyBnZXQgX2Vycm9yTmFtZSA9PiAiSW52YWxpZCBhcmd1bWVudCR7IV9oYXNWYWx1ZSA/ICIocykiIDogIiJ9IjsKICBTdHJpbmcgZ2V0IF9lcnJvckV4cGxhbmF0aW9uID0+ICIiOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmcgbmFtZVN0cmluZyA9ICIiOwogICAgaWYgKG5hbWUgIT0gbnVsbCkgewogICAgICBuYW1lU3RyaW5nID0gIiAoJG5hbWUpIjsKICAgIH0KICAgIHZhciBtZXNzYWdlID0gKHRoaXMubWVzc2FnZSA9PSBudWxsKSA/ICIiIDogIjogJHt0aGlzLm1lc3NhZ2V9IjsKICAgIFN0cmluZyBwcmVmaXggPSAiJF9lcnJvck5hbWUkbmFtZVN0cmluZyRtZXNzYWdlIjsKICAgIGlmICghX2hhc1ZhbHVlKSByZXR1cm4gcHJlZml4OwogICAgLy8gSWYgd2Uga25vdyB0aGUgaW52YWxpZCB2YWx1ZSwgd2UgY2FuIHRyeSB0byBkZXNjcmliZSB0aGUgcHJvYmxlbS4KICAgIFN0cmluZyBleHBsYW5hdGlvbiA9IF9lcnJvckV4cGxhbmF0aW9uOwogICAgU3RyaW5nIGVycm9yVmFsdWUgPSBFcnJvci5zYWZlVG9TdHJpbmcoaW52YWxpZFZhbHVlKTsKICAgIHJldHVybiAiJHByZWZpeCRleHBsYW5hdGlvbjogJGVycm9yVmFsdWUiOwogIH0KfQoKLyoqCiAqIEVycm9yIHRocm93biBkdWUgdG8gYW4gaW5kZXggYmVpbmcgb3V0c2lkZSBhIHZhbGlkIHJhbmdlLgogKi8KY2xhc3MgUmFuZ2VFcnJvciBleHRlbmRzIEFyZ3VtZW50RXJyb3IgewogIC8qKiBUaGUgbWluaW11bSB2YWx1ZSB0aGF0IFt2YWx1ZV0gaXMgYWxsb3dlZCB0byBhc3N1bWUuICovCiAgZmluYWwgbnVtIHN0YXJ0OwogIC8qKiBUaGUgbWF4aW11bSB2YWx1ZSB0aGF0IFt2YWx1ZV0gaXMgYWxsb3dlZCB0byBhc3N1bWUuICovCiAgZmluYWwgbnVtIGVuZDsKCiAgLy8gVE9ETyhscm4pOiBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aXRoIHN0cmluZyB2YWx1ZXMuCiAgLy8gSXQgY3VycmVudGx5IGlzbid0IGluIGFsbCBjYXNlcy4KICAvKioKICAgKiBDcmVhdGUgYSBuZXcgW1JhbmdlRXJyb3JdIHdpdGggdGhlIGdpdmVuIFttZXNzYWdlXS4KICAgKi8KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgUmFuZ2VFcnJvcih2YXIgbWVzc2FnZSkKICAgICAgOiBzdGFydCA9IG51bGwsCiAgICAgICAgZW5kID0gbnVsbCwKICAgICAgICBzdXBlcihtZXNzYWdlKTsKCiAgLyoqCiAgICogQ3JlYXRlIGEgbmV3IFtSYW5nZUVycm9yXSB3aXRoIGEgbWVzc2FnZSBmb3IgdGhlIGdpdmVuIFt2YWx1ZV0uCiAgICoKICAgKiBBbiBvcHRpb25hbCBbbmFtZV0gY2FuIHNwZWNpZnkgdGhlIGFyZ3VtZW50IG5hbWUgdGhhdCBoYXMgdGhlCiAgICogaW52YWxpZCB2YWx1ZSwgYW5kIHRoZSBbbWVzc2FnZV0gY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGVycm9yCiAgICogZGVzY3JpcHRpb24uCiAgICovCiAgUmFuZ2VFcnJvci52YWx1ZShudW0gdmFsdWUsIFtTdHJpbmcgbmFtZSwgU3RyaW5nIG1lc3NhZ2VdKQogICAgICA6IHN0YXJ0ID0gbnVsbCwKICAgICAgICBlbmQgPSBudWxsLAogICAgICAgIHN1cGVyLnZhbHVlKAogICAgICAgICAgICB2YWx1ZSwgbmFtZSwgKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIlZhbHVlIG5vdCBpbiByYW5nZSIpOwoKICAvKioKICAgKiBDcmVhdGUgYSBuZXcgW1JhbmdlRXJyb3JdIGZvciBhIHZhbHVlIGJlaW5nIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlLgogICAqCiAgICogVGhlIGFsbG93ZWQgcmFuZ2UgaXMgZnJvbSBbbWluVmFsdWVdIHRvIFttYXhWYWx1ZV0sIGluY2x1c2l2ZS4KICAgKiBJZiBgbWluVmFsdWVgIG9yIGBtYXhWYWx1ZWAgYXJlIGBudWxsYCwgdGhlIHJhbmdlIGlzIGluZmluaXRlIGluCiAgICogdGhhdCBkaXJlY3Rpb24uCiAgICoKICAgKiBGb3IgYSByYW5nZSBmcm9tIDAgdG8gdGhlIGxlbmd0aCBvZiBzb21ldGhpbmcsIGVuZCBleGNsdXNpdmUsIHVzZQogICAqIFtSYW5nZUVycm9yLmluZGV4XS4KICAgKgogICAqIEFuIG9wdGlvbmFsIFtuYW1lXSBjYW4gc3BlY2lmeSB0aGUgYXJndW1lbnQgbmFtZSB0aGF0IGhhcyB0aGUKICAgKiBpbnZhbGlkIHZhbHVlLCBhbmQgdGhlIFttZXNzYWdlXSBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZXJyb3IKICAgKiBkZXNjcmlwdGlvbi4KICAgKi8KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgUmFuZ2VFcnJvci5yYW5nZShudW0gaW52YWxpZFZhbHVlLCBpbnQgbWluVmFsdWUsIGludCBtYXhWYWx1ZSwKICAgICAgW1N0cmluZyBuYW1lLCBTdHJpbmcgbWVzc2FnZV0pCiAgICAgIDogc3RhcnQgPSBtaW5WYWx1ZSwKICAgICAgICBlbmQgPSBtYXhWYWx1ZSwKICAgICAgICBzdXBlci52YWx1ZSgKICAgICAgICAgICAgaW52YWxpZFZhbHVlLCBuYW1lLCAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAiSW52YWxpZCB2YWx1ZSIpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IFtSYW5nZUVycm9yXSBzdGF0aW5nIHRoYXQgW2luZGV4XSBpcyBub3QgYSB2YWxpZCBpbmRleAogICAqIGludG8gW2luZGV4YWJsZV0uCiAgICoKICAgKiBBbiBvcHRpb25hbCBbbmFtZV0gY2FuIHNwZWNpZnkgdGhlIGFyZ3VtZW50IG5hbWUgdGhhdCBoYXMgdGhlCiAgICogaW52YWxpZCB2YWx1ZSwgYW5kIHRoZSBbbWVzc2FnZV0gY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGVycm9yCiAgICogZGVzY3JpcHRpb24uCiAgICoKICAgKiBUaGUgW2xlbmd0aF0gaXMgdGhlIGxlbmd0aCBvZiBbaW5kZXhhYmxlXSBhdCB0aGUgdGltZSBvZiB0aGUgZXJyb3IuCiAgICogSWYgYGxlbmd0aGAgaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYGluZGV4YWJsZS5sZW5ndGhgLgogICAqLwogIGZhY3RvcnkgUmFuZ2VFcnJvci5pbmRleChpbnQgaW5kZXgsIGR5bmFtaWMgaW5kZXhhYmxlLAogICAgICBbU3RyaW5nIG5hbWUsIFN0cmluZyBtZXNzYWdlLCBpbnQgbGVuZ3RoXSkgPSBJbmRleEVycm9yOwoKICAvKioKICAgKiBDaGVjayB0aGF0IGEgW3ZhbHVlXSBsaWVzIGluIGEgc3BlY2lmaWMgaW50ZXJ2YWwuCiAgICoKICAgKiBUaHJvd3MgaWYgW3ZhbHVlXSBpcyBub3QgaW4gdGhlIGludGVydmFsLgogICAqIFRoZSBpbnRlcnZhbCBpcyBmcm9tIFttaW5WYWx1ZV0gdG8gW21heFZhbHVlXSwgYm90aCBpbmNsdXNpdmUuCiAgICovCiAgc3RhdGljIHZvaWQgY2hlY2tWYWx1ZUluSW50ZXJ2YWwoaW50IHZhbHVlLCBpbnQgbWluVmFsdWUsIGludCBtYXhWYWx1ZSwKICAgICAgW1N0cmluZyBuYW1lLCBTdHJpbmcgbWVzc2FnZV0pIHsKICAgIGlmICh2YWx1ZSA8IG1pblZhbHVlIHx8IHZhbHVlID4gbWF4VmFsdWUpIHsKICAgICAgdGhyb3cgUmFuZ2VFcnJvci5yYW5nZSh2YWx1ZSwgbWluVmFsdWUsIG1heFZhbHVlLCBuYW1lLCBtZXNzYWdlKTsKICAgIH0KICB9CgogIC8qKgogICAqIENoZWNrIHRoYXQgYSB2YWx1ZSBpcyBhIHZhbGlkIGluZGV4IGludG8gYW4gaW5kZXhhYmxlIG9iamVjdC4KICAgKgogICAqIFRocm93cyBpZiBbaW5kZXhdIGlzIG5vdCBhIHZhbGlkIGluZGV4IGludG8gW2luZGV4YWJsZV0uCiAgICoKICAgKiBBbiBpbmRleGFibGUgb2JqZWN0IGlzIG9uZSB0aGF0IGhhcyBhIGBsZW5ndGhgIGFuZCBhIGFuZCBpbmRleC1vcGVyYXRvcgogICAqIGBbXWAgdGhhdCBhY2NlcHRzIGFuIGluZGV4IGlmIGAwIDw9IGluZGV4IDwgbGVuZ3RoYC4KICAgKgogICAqIElmIFtsZW5ndGhdIGlzIHByb3ZpZGVkLCBpdCBpcyB1c2VkIGFzIHRoZSBsZW5ndGggb2YgdGhlIGluZGV4YWJsZSBvYmplY3QsCiAgICogb3RoZXJ3aXNlIHRoZSBsZW5ndGggaXMgZm91bmQgYXMgYGluZGV4YWJsZS5sZW5ndGhgLgogICAqLwogIHN0YXRpYyB2b2lkIGNoZWNrVmFsaWRJbmRleChpbnQgaW5kZXgsIGR5bmFtaWMgaW5kZXhhYmxlLAogICAgICBbU3RyaW5nIG5hbWUsIGludCBsZW5ndGgsIFN0cmluZyBtZXNzYWdlXSkgewogICAgbGVuZ3RoID8/PSBpbmRleGFibGUubGVuZ3RoOwogICAgLy8gQ29tcGFyaW5nIHdpdGggYDBgIGFzIHJlY2VpdmVyIHByb2R1Y2VzIGJldHRlciBkYXJ0MmpzIHR5cGUgaW5mZXJlbmNlLgogICAgaWYgKDAgPiBpbmRleCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgbmFtZSA/Pz0gImluZGV4IjsKICAgICAgdGhyb3cgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgaW5kZXhhYmxlLCBuYW1lLCBtZXNzYWdlLCBsZW5ndGgpOwogICAgfQogIH0KCiAgLyoqCiAgICogQ2hlY2sgdGhhdCBhIHJhbmdlIHJlcHJlc2VudHMgYSBzbGljZSBvZiBhbiBpbmRleGFibGUgb2JqZWN0LgogICAqCiAgICogVGhyb3dzIGlmIHRoZSByYW5nZSBpcyBub3QgdmFsaWQgZm9yIGFuIGluZGV4YWJsZSBvYmplY3Qgd2l0aAogICAqIHRoZSBnaXZlbiBbbGVuZ3RoXS4KICAgKiBBIHJhbmdlIGlzIHZhbGlkIGZvciBhbiBpbmRleGFibGUgb2JqZWN0IHdpdGggYSBnaXZlbiBbbGVuZ3RoXQogICAqCiAgICogaWYgYDAgPD0gW3N0YXJ0XSA8PSBbZW5kXSA8PSBbbGVuZ3RoXWAuCiAgICogQW4gYGVuZGAgb2YgYG51bGxgIGlzIGNvbnNpZGVyZWQgZXF1aXZhbGVudCB0byBgbGVuZ3RoYC4KICAgKgogICAqIFRoZSBbc3RhcnROYW1lXSBhbmQgW2VuZE5hbWVdIGRlZmF1bHRzIHRvIGAic3RhcnQiYCBhbmQgYCJlbmQiYCwKICAgKiByZXNwZWN0aXZlbHkuCiAgICoKICAgKiBSZXR1cm5zIHRoZSBhY3R1YWwgYGVuZGAgdmFsdWUsIHdoaWNoIGlzIGBsZW5ndGhgIGlmIGBlbmRgIGlzIGBudWxsYCwKICAgKiBhbmQgYGVuZGAgb3RoZXJ3aXNlLgogICAqLwogIHN0YXRpYyBpbnQgY2hlY2tWYWxpZFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgaW50IGxlbmd0aCwKICAgICAgW1N0cmluZyBzdGFydE5hbWUsIFN0cmluZyBlbmROYW1lLCBTdHJpbmcgbWVzc2FnZV0pIHsKICAgIC8vIENvbXBhcmluZyB3aXRoIGAwYCBhcyByZWNlaXZlciBwcm9kdWNlcyBiZXR0ZXIgZGFydDJqcyB0eXBlIGluZmVyZW5jZS4KICAgIC8vIERpdHRvIGBzdGFydCA+IGVuZGAgYmVsb3cuCiAgICBpZiAoMCA+IHN0YXJ0IHx8IHN0YXJ0ID4gbGVuZ3RoKSB7CiAgICAgIHN0YXJ0TmFtZSA/Pz0gInN0YXJ0IjsKICAgICAgdGhyb3cgUmFuZ2VFcnJvci5yYW5nZShzdGFydCwgMCwgbGVuZ3RoLCBzdGFydE5hbWUsIG1lc3NhZ2UpOwogICAgfQogICAgaWYgKGVuZCAhPSBudWxsKSB7CiAgICAgIGlmIChzdGFydCA+IGVuZCB8fCBlbmQgPiBsZW5ndGgpIHsKICAgICAgICBlbmROYW1lID8/PSAiZW5kIjsKICAgICAgICB0aHJvdyBSYW5nZUVycm9yLnJhbmdlKGVuZCwgc3RhcnQsIGxlbmd0aCwgZW5kTmFtZSwgbWVzc2FnZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGVuZDsKICAgIH0KICAgIHJldHVybiBsZW5ndGg7CiAgfQoKICAvKioKICAgKiBDaGVjayB0aGF0IGFuIGludGVnZXIgdmFsdWUgaXNuJ3QgbmVnYXRpdmUuCiAgICoKICAgKiBUaHJvd3MgaWYgdGhlIHZhbHVlIGlzIG5lZ2F0aXZlLgogICAqLwogIHN0YXRpYyB2b2lkIGNoZWNrTm90TmVnYXRpdmUoaW50IHZhbHVlLCBbU3RyaW5nIG5hbWUsIFN0cmluZyBtZXNzYWdlXSkgewogICAgaWYgKHZhbHVlIDwgMCkgdGhyb3cgUmFuZ2VFcnJvci5yYW5nZSh2YWx1ZSwgMCwgbnVsbCwgbmFtZSwgbWVzc2FnZSk7CiAgfQoKICBTdHJpbmcgZ2V0IF9lcnJvck5hbWUgPT4gIlJhbmdlRXJyb3IiOwogIFN0cmluZyBnZXQgX2Vycm9yRXhwbGFuYXRpb24gewogICAgYXNzZXJ0KF9oYXNWYWx1ZSk7CiAgICBTdHJpbmcgZXhwbGFuYXRpb24gPSAiIjsKICAgIGlmIChzdGFydCA9PSBudWxsKSB7CiAgICAgIGlmIChlbmQgIT0gbnVsbCkgewogICAgICAgIGV4cGxhbmF0aW9uID0gIjogTm90IGxlc3MgdGhhbiBvciBlcXVhbCB0byAkZW5kIjsKICAgICAgfQogICAgICAvLyBJZiBib3RoIGFyZSBudWxsLCB3ZSBkb24ndCBhZGQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbGltaXRzLgogICAgfSBlbHNlIGlmIChlbmQgPT0gbnVsbCkgewogICAgICBleHBsYW5hdGlvbiA9ICI6IE5vdCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHN0YXJ0IjsKICAgIH0gZWxzZSBpZiAoZW5kID4gc3RhcnQpIHsKICAgICAgZXhwbGFuYXRpb24gPSAiOiBOb3QgaW4gcmFuZ2UgJHN0YXJ0Li4kZW5kLCBpbmNsdXNpdmUiOwogICAgfSBlbHNlIGlmIChlbmQgPCBzdGFydCkgewogICAgICBleHBsYW5hdGlvbiA9ICI6IFZhbGlkIHZhbHVlIHJhbmdlIGlzIGVtcHR5IjsKICAgIH0gZWxzZSB7CiAgICAgIC8vIGVuZCA9PSBzdGFydC4KICAgICAgZXhwbGFuYXRpb24gPSAiOiBPbmx5IHZhbGlkIHZhbHVlIGlzICRzdGFydCI7CiAgICB9CiAgICByZXR1cm4gZXhwbGFuYXRpb247CiAgfQp9CgovKioKICogQSBzcGVjaWFsaXplZCBbUmFuZ2VFcnJvcl0gdXNlZCB3aGVuIGFuIGluZGV4IGlzIG5vdCBpbiB0aGUgcmFuZ2UKICogYDAuLmluZGV4YWJsZS5sZW5ndGgtMWAuCiAqCiAqIEFsc28gY29udGFpbnMgdGhlIGluZGV4YWJsZSBvYmplY3QsIGl0cyBsZW5ndGggYXQgdGhlIHRpbWUgb2YgdGhlIGVycm9yLAogKiBhbmQgdGhlIGludmFsaWQgaW5kZXggaXRzZWxmLgogKi8KY2xhc3MgSW5kZXhFcnJvciBleHRlbmRzIEFyZ3VtZW50RXJyb3IgaW1wbGVtZW50cyBSYW5nZUVycm9yIHsKICAvKiogVGhlIGluZGV4YWJsZSBvYmplY3QgdGhhdCBbaW52YWxpZFZhbHVlXSB3YXMgbm90IGEgdmFsaWQgaW5kZXggaW50by4gKi8KICBmaW5hbCBpbmRleGFibGU7CiAgLyoqIFRoZSBsZW5ndGggb2YgW2luZGV4YWJsZV0gYXQgdGhlIHRpbWUgb2YgdGhlIGVycm9yLiAqLwogIGZpbmFsIGludCBsZW5ndGg7CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgW0luZGV4RXJyb3JdIHN0YXRpbmcgdGhhdCBbaW52YWxpZFZhbHVlXSBpcyBub3QgYSB2YWxpZCBpbmRleAogICAqIGludG8gW2luZGV4YWJsZV0uCiAgICoKICAgKiBUaGUgW2xlbmd0aF0gaXMgdGhlIGxlbmd0aCBvZiBbaW5kZXhhYmxlXSBhdCB0aGUgdGltZSBvZiB0aGUgZXJyb3IuCiAgICogSWYgYGxlbmd0aGAgaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYGluZGV4YWJsZS5sZW5ndGhgLgogICAqCiAgICogVGhlIG1lc3NhZ2UgaXMgdXNlZCBhcyBwYXJ0IG9mIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yLgogICAqLwogIEluZGV4RXJyb3IoaW50IGludmFsaWRWYWx1ZSwgZHluYW1pYyBpbmRleGFibGUsCiAgICAgIFtTdHJpbmcgbmFtZSwgU3RyaW5nIG1lc3NhZ2UsIGludCBsZW5ndGhdKQogICAgICA6IHRoaXMuaW5kZXhhYmxlID0gaW5kZXhhYmxlLAogICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoID8/IGluZGV4YWJsZS5sZW5ndGgsCiAgICAgICAgc3VwZXIudmFsdWUoaW52YWxpZFZhbHVlLCBuYW1lLAogICAgICAgICAgICAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAiSW5kZXggb3V0IG9mIHJhbmdlIik7CgogIC8vIEdldHRlcnMgaW5oZXJpdGVkIGZyb20gUmFuZ2VFcnJvci4KICBpbnQgZ2V0IHN0YXJ0ID0+IDA7CiAgaW50IGdldCBlbmQgPT4gbGVuZ3RoIC0gMTsKCiAgU3RyaW5nIGdldCBfZXJyb3JOYW1lID0+ICJSYW5nZUVycm9yIjsKICBTdHJpbmcgZ2V0IF9lcnJvckV4cGxhbmF0aW9uIHsKICAgIGFzc2VydChfaGFzVmFsdWUpOwogICAgaW50IGludmFsaWRWYWx1ZSA9IHRoaXMuaW52YWxpZFZhbHVlOwogICAgaWYgKGludmFsaWRWYWx1ZSA8IDApIHsKICAgICAgcmV0dXJuICI6IGluZGV4IG11c3Qgbm90IGJlIG5lZ2F0aXZlIjsKICAgIH0KICAgIGlmIChsZW5ndGggPT0gMCkgewogICAgICByZXR1cm4gIjogbm8gaW5kaWNlcyBhcmUgdmFsaWQiOwogICAgfQogICAgcmV0dXJuICI6IGluZGV4IHNob3VsZCBiZSBsZXNzIHRoYW4gJGxlbmd0aCI7CiAgfQp9CgovKioKICogRXJyb3IgdGhyb3duIHdoZW4gY29udHJvbCByZWFjaGVzIHRoZSBlbmQgb2YgYSBzd2l0Y2ggY2FzZS4KICoKICogVGhlIERhcnQgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyB0aGlzIGVycm9yIHRvIGJlIHRocm93biB3aGVuCiAqIGNvbnRyb2wgcmVhY2hlcyB0aGUgZW5kIG9mIGEgc3dpdGNoIGNhc2UgKGV4Y2VwdCB0aGUgbGFzdCBjYXNlCiAqIG9mIGEgc3dpdGNoKSB3aXRob3V0IG1lZXRpbmcgYSBicmVhayBvciBzaW1pbGFyIGVuZCBvZiB0aGUgY29udHJvbAogKiBmbG93LgogKi8KY2xhc3MgRmFsbFRocm91Z2hFcnJvciBleHRlbmRzIEVycm9yIHsKICBGYWxsVGhyb3VnaEVycm9yKCk7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGV4dGVybmFsIEZhbGxUaHJvdWdoRXJyb3IuX2NyZWF0ZShTdHJpbmcgdXJsLCBpbnQgbGluZSk7CgogIGV4dGVybmFsIFN0cmluZyB0b1N0cmluZygpOwp9CgovKioKICogRXJyb3IgdGhyb3duIHdoZW4gdHJ5aW5nIHRvIGluc3RhbnRpYXRlIGFuIGFic3RyYWN0IGNsYXNzLgogKi8KY2xhc3MgQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHsKICBmaW5hbCBTdHJpbmcgX2NsYXNzTmFtZTsKICBBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yKFN0cmluZyBjbGFzc05hbWUpIDogX2NsYXNzTmFtZSA9IGNsYXNzTmFtZTsKCiAgZXh0ZXJuYWwgU3RyaW5nIHRvU3RyaW5nKCk7Cn0KCi8qKgogKiBFcnJvciB0aHJvd24gYnkgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgWzpub1N1Y2hNZXRob2Q6XSBvbiBbT2JqZWN0XS4KICovCmNsYXNzIE5vU3VjaE1ldGhvZEVycm9yIGV4dGVuZHMgRXJyb3IgewogIC8qKgogICAqIENyZWF0ZSBhIFtOb1N1Y2hNZXRob2RFcnJvcl0gY29ycmVzcG9uZGluZyB0byBhIGZhaWxlZCBtZXRob2QgY2FsbC4KICAgKgogICAqIFRoZSBbcmVjZWl2ZXJdIGlzIHRoZSByZWNlaXZlciBvZiB0aGUgbWV0aG9kIGNhbGwuCiAgICogVGhhdCBpcywgdGhlIG9iamVjdCBvbiB3aGljaCB0aGUgbWV0aG9kIHdhcyBhdHRlbXB0ZWQgY2FsbGVkLgogICAqCiAgICogVGhlIFtpbnZvY2F0aW9uXSByZXByZXNlbnRzIHRoZSBtZXRob2QgY2FsbCB0aGF0IGZhaWxlZC4gSXQKICAgKiBzaG91bGQgbm90IGJlIGBudWxsYC4KICAgKi8KICBleHRlcm5hbCBOb1N1Y2hNZXRob2RFcnJvci53aXRoSW52b2NhdGlvbigKICAgICAgT2JqZWN0IHJlY2VpdmVyLCBJbnZvY2F0aW9uIGludm9jYXRpb24pOwoKICAvLyBEZXByZWNhdGVkIGNvbnN0cnVjdG9yIHRvIGJlIHJlbW92ZWQgYWZ0ZXIgZGFydDJqcyB1cGRhdGVzIHRvIHRoZSBhYm92ZS4KICAvKioKICAgKiBDcmVhdGUgYSBbTm9TdWNoTWV0aG9kRXJyb3JdIGNvcnJlc3BvbmRpbmcgdG8gYSBmYWlsZWQgbWV0aG9kIGNhbGwuCiAgICoKICAgKiBUaGUgW3JlY2VpdmVyXSBpcyB0aGUgcmVjZWl2ZXIgb2YgdGhlIG1ldGhvZCBjYWxsLgogICAqIFRoYXQgaXMsIHRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGhvZCB3YXMgYXR0ZW1wdGVkIGNhbGxlZC4KICAgKiBJZiB0aGUgcmVjZWl2ZXIgaXMgYG51bGxgLCBpdCBpcyBpbnRlcnByZXRlZCBhcyBhIGNhbGwgdG8gYSB0b3AtbGV2ZWwKICAgKiBmdW5jdGlvbiBvZiBhIGxpYnJhcnkuCiAgICoKICAgKiBUaGUgW21lbWJlck5hbWVdIGlzIGEgW1N5bWJvbF0gcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIHRoZSBjYWxsZWQgbWV0aG9kCiAgICogb3IgYWNjZXNzb3IuIEl0IHNob3VsZCBub3QgYmUgYG51bGxgLgogICAqCiAgICogVGhlIFtwb3NpdGlvbmFsQXJndW1lbnRzXSBpcyBhIGxpc3Qgb2YgdGhlIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRoYXQgdGhlCiAgICogbWV0aG9kIHdhcyBjYWxsZWQgd2l0aC4gSWYgYG51bGxgLCBpdCBpcyBjb25zaWRlcmVkIGVxdWl2YWxlbnQgdG8gdGhlCiAgICogZW1wdHkgbGlzdC4KICAgKgogICAqIFRoZSBbbmFtZWRBcmd1bWVudHNdIGlzIGEgbWFwIGZyb20gW1N5bWJvbF1zIHRvIHRoZSB2YWx1ZXMgb2YgbmFtZWQKICAgKiBhcmd1bWVudHMgdGhhdCB0aGUgbWV0aG9kIHdhcyBjYWxsZWQgd2l0aC4KICAgKgogICAqIFRoaXMgY29uc3RydWN0b3IgZG9lcyBub3QgaGFuZGxlIHR5cGUgYXJndW1lbnRzLgogICAqIFRvIGluY2x1ZGUgdHlwZSB2YXJpYWJsZXMsIGNyZWF0ZSBhbiBbSW52b2NhdGlvbl0gYW5kIHVzZQogICAqIFtOb1N1Y2hNZXRob2RFcnJvci53aXRoSW52b2NhdGlvbl0uCiAgICovCiAgQERlcHJlY2F0ZWQoIlVzZSBOb1N1Y2hNZXRob2Qud2l0aEludm9jYXRpb24gaW5zdGVhZCIpCiAgZXh0ZXJuYWwgTm9TdWNoTWV0aG9kRXJyb3IoT2JqZWN0IHJlY2VpdmVyLCBTeW1ib2wgbWVtYmVyTmFtZSwKICAgICAgTGlzdCBwb3NpdGlvbmFsQXJndW1lbnRzLCBNYXA8U3ltYm9sLCBkeW5hbWljPiBuYW1lZEFyZ3VtZW50cywKICAgICAgW0BkZXByZWNhdGVkIExpc3QgZXhpc3RpbmdBcmd1bWVudE5hbWVzXSk7CgogIGV4dGVybmFsIFN0cmluZyB0b1N0cmluZygpOwp9CgovKioKICogVGhlIG9wZXJhdGlvbiB3YXMgbm90IGFsbG93ZWQgYnkgdGhlIG9iamVjdC4KICoKICogVGhpcyBbRXJyb3JdIGlzIHRocm93biB3aGVuIGFuIGluc3RhbmNlIGNhbm5vdCBpbXBsZW1lbnQgb25lIG9mIHRoZSBtZXRob2RzCiAqIGluIGl0cyBzaWduYXR1cmUuCiAqLwpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIFVuc3VwcG9ydGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7CiAgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIFVuc3VwcG9ydGVkRXJyb3IodGhpcy5tZXNzYWdlKTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiAkbWVzc2FnZSI7Cn0KCi8qKgogKiBUaHJvd24gYnkgb3BlcmF0aW9ucyB0aGF0IGhhdmUgbm90IGJlZW4gaW1wbGVtZW50ZWQgeWV0LgogKgogKiBUaGlzIFtFcnJvcl0gaXMgdGhyb3duIGJ5IHVuZmluaXNoZWQgY29kZSB0aGF0IGhhc24ndCB5ZXQgaW1wbGVtZW50ZWQKICogYWxsIHRoZSBmZWF0dXJlcyBpdCBuZWVkcy4KICoKICogSWYgYSBjbGFzcyBpcyBub3QgaW50ZW5kaW5nIHRvIGltcGxlbWVudCB0aGUgZmVhdHVyZSwgaXQgc2hvdWxkIHRocm93CiAqIGFuIFtVbnN1cHBvcnRlZEVycm9yXSBpbnN0ZWFkLiBUaGlzIGVycm9yIGlzIG9ubHkgaW50ZW5kZWQgZm9yCiAqIHVzZSBkdXJpbmcgZGV2ZWxvcG1lbnQuCiAqLwpjbGFzcyBVbmltcGxlbWVudGVkRXJyb3IgZXh0ZW5kcyBFcnJvciBpbXBsZW1lbnRzIFVuc3VwcG9ydGVkRXJyb3IgewogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwogIFVuaW1wbGVtZW50ZWRFcnJvcihbdGhpcy5tZXNzYWdlXSk7CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gKHRoaXMubWVzc2FnZSAhPSBudWxsCiAgICAgID8gIlVuaW1wbGVtZW50ZWRFcnJvcjogJG1lc3NhZ2UiCiAgICAgIDogIlVuaW1wbGVtZW50ZWRFcnJvciIpOwp9CgovKioKICogVGhlIG9wZXJhdGlvbiB3YXMgbm90IGFsbG93ZWQgYnkgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG9iamVjdC4KICoKICogVGhpcyBpcyBhIGdlbmVyaWMgZXJyb3IgdXNlZCBmb3IgYSB2YXJpZXR5IG9mIGRpZmZlcmVudCBlcnJvbmVvdXMKICogYWN0aW9ucy4gVGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIGRlc2NyaXB0aXZlLgogKi8KY2xhc3MgU3RhdGVFcnJvciBleHRlbmRzIEVycm9yIHsKICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKICBTdGF0ZUVycm9yKHRoaXMubWVzc2FnZSk7CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIkJhZCBzdGF0ZTogJG1lc3NhZ2UiOwp9CgovKioKICogRXJyb3Igb2NjdXJyaW5nIHdoZW4gYSBjb2xsZWN0aW9uIGlzIG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uCiAqCiAqIFNvbWUgbW9kaWZpY2F0aW9ucyBtYXkgYmUgYWxsb3dlZCBmb3Igc29tZSBjb2xsZWN0aW9ucywgc28gZWFjaCBjb2xsZWN0aW9uCiAqIChbSXRlcmFibGVdIG9yIHNpbWlsYXIgY29sbGVjdGlvbiBvZiB2YWx1ZXMpIHNob3VsZCBkZWNsYXJlIHdoaWNoIG9wZXJhdGlvbnMKICogYXJlIGFsbG93ZWQgZHVyaW5nIGFuIGl0ZXJhdGlvbi4KICovCmNsYXNzIENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHsKICAvKiogVGhlIG9iamVjdCB0aGF0IHdhcyBtb2RpZmllZCBpbiBhbiBpbmNvbXBhdGlibGUgd2F5LiAqLwogIGZpbmFsIE9iamVjdCBtb2RpZmllZE9iamVjdDsKCiAgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKFt0aGlzLm1vZGlmaWVkT2JqZWN0XSk7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIGlmIChtb2RpZmllZE9iamVjdCA9PSBudWxsKSB7CiAgICAgIHJldHVybiAiQ29uY3VycmVudCBtb2RpZmljYXRpb24gZHVyaW5nIGl0ZXJhdGlvbi4iOwogICAgfQogICAgcmV0dXJuICJDb25jdXJyZW50IG1vZGlmaWNhdGlvbiBkdXJpbmcgaXRlcmF0aW9uOiAiCiAgICAgICAgIiR7RXJyb3Iuc2FmZVRvU3RyaW5nKG1vZGlmaWVkT2JqZWN0KX0uIjsKICB9Cn0KCmNsYXNzIE91dE9mTWVtb3J5RXJyb3IgaW1wbGVtZW50cyBFcnJvciB7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGNvbnN0IE91dE9mTWVtb3J5RXJyb3IoKTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiT3V0IG9mIE1lbW9yeSI7CgogIFN0YWNrVHJhY2UgZ2V0IHN0YWNrVHJhY2UgPT4gbnVsbDsKfQoKY2xhc3MgU3RhY2tPdmVyZmxvd0Vycm9yIGltcGxlbWVudHMgRXJyb3IgewogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBjb25zdCBTdGFja092ZXJmbG93RXJyb3IoKTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiU3RhY2sgT3ZlcmZsb3ciOwoKICBTdGFja1RyYWNlIGdldCBzdGFja1RyYWNlID0+IG51bGw7Cn0KCi8qKgogKiBFcnJvciB0aHJvd24gd2hlbiBhIGxhemlseSBpbml0aWFsaXplZCB2YXJpYWJsZSBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQuCiAqCiAqIEEgc3RhdGljL2xpYnJhcnkgdmFyaWFibGUgd2l0aCBhbiBpbml0aWFsaXplciBleHByZXNzaW9uIGlzIGluaXRpYWxpemVkCiAqIHRoZSBmaXJzdCB0aW1lIGl0IGlzIHJlYWQuIElmIGV2YWx1YXRpbmcgdGhlIGluaXRpYWxpemVyIGV4cHJlc3Npb24gY2F1c2VzCiAqIGFub3RoZXIgcmVhZCBvZiB0aGUgdmFyaWFibGUsIHRoaXMgZXJyb3IgaXMgdGhyb3duLgogKi8KY2xhc3MgQ3ljbGljSW5pdGlhbGl6YXRpb25FcnJvciBleHRlbmRzIEVycm9yIHsKICBmaW5hbCBTdHJpbmcgdmFyaWFibGVOYW1lOwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBDeWNsaWNJbml0aWFsaXphdGlvbkVycm9yKFt0aGlzLnZhcmlhYmxlTmFtZV0pOwogIFN0cmluZyB0b1N0cmluZygpID0+IHZhcmlhYmxlTmFtZSA9PSBudWxsCiAgICAgID8gIlJlYWRpbmcgc3RhdGljIHZhcmlhYmxlIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24iCiAgICAgIDogIlJlYWRpbmcgc3RhdGljIHZhcmlhYmxlICckdmFyaWFibGVOYW1lJyBkdXJpbmcgaXRzIGluaXRpYWxpemF0aW9uIjsKfQqCTgBOTjwBEwEEOgNGGAM/LzMDPyw7AzJAMkgDKzNBJzIDJQNGA0URA0M0HzdFOVEyAzA0IzIjNkoxAzg2Ay4+QERFN00EDiQBBjcFTRYGLj0gBhwqBiQEAU49ATkBJgIBBEYEJTEYIisCAQRDBCoBBEMEIQEEMwQmHBUpAgEERAQkJRgcFjUVKREBBjUFRU0TBhwgHRsVAQYzBUE+BScFR0pJSwYcOB4aAQZNBiUbJh0BBiUGED09BAE9SSYBFhwYHwZFNiNJLDovBAIBBD0EKT4TPhEBSyYGOQYcGhYUGAEGRQVDRRIGPRYUFU4BBkoFREYVBUcZBUNFEgYcQSUaGBVQAQZKFwVDRRIFSUAGOT8BBjcFL0QGSicwSAYEAQZDBT4FTToFUDoGPDMhTigYRwYEAQZDBUMZRAUtPgVGEwVLGgY9PE4iJx1EBhcpG0YIEgYTBAEGMQUmBktKBAEpIRcdGRk6CEUePR4+HjQNFzQGGAQCAQRFHANMIQQ/ThM9FAEGURcFSUAFTAYyMSQyKEEBKBYdASkhFyocLQYXJwYyBAIBBD8DQEJGCQQnFhw7AR4CAQQ+BDYbTgEeAgEETwQoBkkFOEMFQRsGLS8BTgZJBThDSxwFTysFTksRBUkwBTY/KQY5QUUxAR4CAQQwA08VBBonGBwiOgIBBDwDSR4DSUIbBEUYJi0nHwIBBEUDRS8EIRgcLgIBBEMDTlAkBDI+HwE2ARYiOgY4MgQCASocHCgBJQIBLBweKQElAgEESgNLTjcEMB0cMiw8TQIBFWRhcnQ6Y29yZS9lcnJvcnMuZGFydDBvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS9leGNlcHRpb25zLmRhcnSXji8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCi8vIEV4Y2VwdGlvbnMgYXJlIHRocm93biBlaXRoZXIgYnkgdGhlIFZNIG9yIGZyb20gRGFydCBjb2RlLgoKLyoqCiAqIEEgbWFya2VyIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBhbGwgY29yZSBsaWJyYXJ5IGV4Y2VwdGlvbnMuCiAqCiAqIEFuIFtFeGNlcHRpb25dIGlzIGludGVuZGVkIHRvIGNvbnZleSBpbmZvcm1hdGlvbiB0byB0aGUgdXNlciBhYm91dCBhIGZhaWx1cmUsCiAqIHNvIHRoYXQgdGhlIGVycm9yIGNhbiBiZSBhZGRyZXNzZWQgcHJvZ3JhbW1hdGljYWxseS4gSXQgaXMgaW50ZW5kZWQgdG8gYmUKICogY2F1Z2h0LCBhbmQgaXQgc2hvdWxkIGNvbnRhaW4gdXNlZnVsIGRhdGEgZmllbGRzLgogKgogKiBDcmVhdGluZyBpbnN0YW5jZXMgb2YgW0V4Y2VwdGlvbl0gZGlyZWN0bHkgd2l0aCBbOm5ldyBFeGNlcHRpb24oIm1lc3NhZ2UiKTpdCiAqIGlzIGRpc2NvdXJhZ2VkLCBhbmQgb25seSBpbmNsdWRlZCBhcyBhIHRlbXBvcmFyeSBtZWFzdXJlIGR1cmluZyBkZXZlbG9wbWVudCwKICogdW50aWwgdGhlIGFjdHVhbCBleGNlcHRpb25zIHVzZWQgYnkgYSBsaWJyYXJ5IGFyZSBkb25lLgogKi8KYWJzdHJhY3QgY2xhc3MgRXhjZXB0aW9uIHsKICBmYWN0b3J5IEV4Y2VwdGlvbihbdmFyIG1lc3NhZ2VdKSA9PiBfRXhjZXB0aW9uKG1lc3NhZ2UpOwp9CgovKiogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBbRXhjZXB0aW9uXSB3aGljaCBjYXJyaWVzIGEgbWVzc2FnZS4gKi8KY2xhc3MgX0V4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbiB7CiAgZmluYWwgbWVzc2FnZTsKCiAgX0V4Y2VwdGlvbihbdGhpcy5tZXNzYWdlXSk7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIGlmIChtZXNzYWdlID09IG51bGwpIHJldHVybiAiRXhjZXB0aW9uIjsKICAgIHJldHVybiAiRXhjZXB0aW9uOiAkbWVzc2FnZSI7CiAgfQp9CgovKioKICogRXhjZXB0aW9uIHRocm93biB3aGVuIGEgc3RyaW5nIG9yIHNvbWUgb3RoZXIgZGF0YSBkb2VzIG5vdCBoYXZlIGFuIGV4cGVjdGVkCiAqIGZvcm1hdCBhbmQgY2Fubm90IGJlIHBhcnNlZCBvciBwcm9jZXNzZWQuCiAqLwpjbGFzcyBGb3JtYXRFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb24gewogIC8qKgogICAqIEEgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBmb3JtYXQgZXJyb3IuCiAgICovCiAgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CgogIC8qKgogICAqIFRoZSBhY3R1YWwgc291cmNlIGlucHV0IHdoaWNoIGNhdXNlZCB0aGUgZXJyb3IuCiAgICoKICAgKiBUaGlzIGlzIHVzdWFsbHkgYSBbU3RyaW5nXSwgYnV0IGNhbiBiZSBvdGhlciB0eXBlcyB0b28uCiAgICogSWYgaXQgaXMgYSBzdHJpbmcsIHBhcnRzIG9mIGl0IG1heSBiZSBpbmNsdWRlZCBpbiB0aGUgW3RvU3RyaW5nXSBtZXNzYWdlLgogICAqCiAgICogVGhlIHNvdXJjZSBpcyBgbnVsbGAgaWYgb21pdHRlZCBvciB1bmtub3duLgogICAqLwogIGZpbmFsIHNvdXJjZTsKCiAgLyoqCiAgICogVGhlIG9mZnNldCBpbiBbc291cmNlXSB3aGVyZSB0aGUgZXJyb3Igd2FzIGRldGVjdGVkLgogICAqCiAgICogQSB6ZXJvLWJhc2VkIG9mZnNldCBpbnRvIHRoZSBzb3VyY2UgdGhhdCBtYXJrcyB0aGUgZm9ybWF0IGVycm9yIGNhdXNpbmcKICAgKiB0aGlzIGV4Y2VwdGlvbiB0byBiZSBjcmVhdGVkLiBJZiBgc291cmNlYCBpcyBhIHN0cmluZywgdGhpcyBzaG91bGQgYmUgYQogICAqIHN0cmluZyBpbmRleCBpbiB0aGUgcmFuZ2UgYDAgPD0gb2Zmc2V0IDw9IHNvdXJjZS5sZW5ndGhgLgogICAqCiAgICogSWYgaW5wdXQgaXMgYSBzdHJpbmcsIHRoZSBbdG9TdHJpbmddIG1ldGhvZCBtYXkgcmVwcmVzZW50IHRoaXMgb2Zmc2V0IGFzCiAgICogYSBsaW5lIGFuZCBjaGFyYWN0ZXIgcG9zaXRpb24uIFRoZSBvZmZzZXQgc2hvdWxkIGJlIGluc2lkZSB0aGUgc3RyaW5nLAogICAqIG9yIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KICAgKgogICAqIE1heSBiZSBvbWl0dGVkLiBJZiBwcmVzZW50LCBbc291cmNlXSBzaG91bGQgYWxzbyBiZSBwcmVzZW50IGlmIHBvc3NpYmxlLgogICAqLwogIGZpbmFsIGludCBvZmZzZXQ7CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgRm9ybWF0RXhjZXB0aW9uIHdpdGggYW4gb3B0aW9uYWwgZXJyb3IgW21lc3NhZ2VdLgogICAqCiAgICogT3B0aW9uYWxseSBhbHNvIHN1cHBseSB0aGUgYWN0dWFsIFtzb3VyY2VdIHdpdGggdGhlIGluY29ycmVjdCBmb3JtYXQsCiAgICogYW5kIHRoZSBbb2Zmc2V0XSBpbiB0aGUgZm9ybWF0IHdoZXJlIGEgcHJvYmxlbSB3YXMgZGV0ZWN0ZWQuCiAgICovCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGNvbnN0IEZvcm1hdEV4Y2VwdGlvbihbdGhpcy5tZXNzYWdlID0gIiIsIHRoaXMuc291cmNlLCB0aGlzLm9mZnNldF0pOwoKICAvKioKICAgKiBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdCBleGNlcHRpb24uCiAgICoKICAgKiBUaGUgZGVzY3JpcHRpb24gYWx3YXlzIGNvbnRhaW5zIHRoZSBbbWVzc2FnZV0uCiAgICoKICAgKiBJZiBbc291cmNlXSBpcyBwcmVzZW50IGFuZCBpcyBhIHN0cmluZywgdGhlIGRlc2NyaXB0aW9uIHdpbGwgY29udGFpbgogICAqIChhdCBsZWFzdCBhIHBhcnQgb2YpIHRoZSBzb3VyY2UuCiAgICogSWYgW29mZnNldF0gaXMgYWxzbyBwcm92aWRlZCwgdGhlIHBhcnQgb2YgdGhlIHNvdXJjZSBpbmNsdWRlZCB3aWxsCiAgICogY29udGFpbiB0aGF0IG9mZnNldCwgYW5kIHRoZSBvZmZzZXQgd2lsbCBiZSBtYXJrZWQuCiAgICoKICAgKiBJZiB0aGUgc291cmNlIGlzIGEgc3RyaW5nIGFuZCBpdCBjb250YWlucyBhIGxpbmUgYnJlYWsgYmVmb3JlIG9mZnNldCwKICAgKiBvbmx5IHRoZSBsaW5lIGNvbnRhaW5pbmcgb2Zmc2V0IHdpbGwgYmUgaW5jbHVkZWQsIGFuZCBpdHMgbGluZSBudW1iZXIKICAgKiB3aWxsIGFsc28gYmUgcGFydCBvZiB0aGUgZGVzY3JpcHRpb24uIExpbmUgYW5kIGNoYXJhY3RlciBvZmZzZXRzIGFyZQogICAqIDEtYmFzZWQuCiAgICovCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nIHJlcG9ydCA9ICJGb3JtYXRFeGNlcHRpb24iOwogICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiAiIiAhPSBtZXNzYWdlKSB7CiAgICAgIHJlcG9ydCA9ICIkcmVwb3J0OiAkbWVzc2FnZSI7CiAgICB9CiAgICBpbnQgb2Zmc2V0ID0gdGhpcy5vZmZzZXQ7CiAgICBPYmplY3Qgb2JqZWN0U291cmNlID0gdGhpcy5zb3VyY2U7CiAgICBpZiAob2JqZWN0U291cmNlIGlzIFN0cmluZykgewogICAgICBTdHJpbmcgc291cmNlID0gb2JqZWN0U291cmNlOwogICAgICBpZiAob2Zmc2V0ICE9IG51bGwgJiYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gc291cmNlLmxlbmd0aCkpIHsKICAgICAgICBvZmZzZXQgPSBudWxsOwogICAgICB9CiAgICAgIC8vIFNvdXJjZSBpcyBzdHJpbmcgYW5kIG9mZnNldCBpcyBudWxsIG9yIHZhbGlkLgogICAgICBpZiAob2Zmc2V0ID09IG51bGwpIHsKICAgICAgICBpZiAoc291cmNlLmxlbmd0aCA+IDc4KSB7CiAgICAgICAgICBzb3VyY2UgPSBzb3VyY2Uuc3Vic3RyaW5nKDAsIDc1KSArICIuLi4iOwogICAgICAgIH0KICAgICAgICByZXR1cm4gIiRyZXBvcnRcbiRzb3VyY2UiOwogICAgICB9CiAgICAgIGludCBsaW5lTnVtID0gMTsKICAgICAgaW50IGxpbmVTdGFydCA9IDA7CiAgICAgIGJvb2wgcHJldmlvdXNDaGFyV2FzQ1IgPSBmYWxzZTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvZmZzZXQ7IGkrKykgewogICAgICAgIGludCBjaGFyID0gc291cmNlLmNvZGVVbml0QXQoaSk7CiAgICAgICAgaWYgKGNoYXIgPT0gMHgwYSkgewogICAgICAgICAgaWYgKGxpbmVTdGFydCAhPSBpIHx8ICFwcmV2aW91c0NoYXJXYXNDUikgewogICAgICAgICAgICBsaW5lTnVtKys7CiAgICAgICAgICB9CiAgICAgICAgICBsaW5lU3RhcnQgPSBpICsgMTsKICAgICAgICAgIHByZXZpb3VzQ2hhcldhc0NSID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIGlmIChjaGFyID09IDB4MGQpIHsKICAgICAgICAgIGxpbmVOdW0rKzsKICAgICAgICAgIGxpbmVTdGFydCA9IGkgKyAxOwogICAgICAgICAgcHJldmlvdXNDaGFyV2FzQ1IgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobGluZU51bSA+IDEpIHsKICAgICAgICByZXBvcnQgKz0gIiAoYXQgbGluZSAkbGluZU51bSwgY2hhcmFjdGVyICR7b2Zmc2V0IC0gbGluZVN0YXJ0ICsgMX0pXG4iOwogICAgICB9IGVsc2UgewogICAgICAgIHJlcG9ydCArPSAiIChhdCBjaGFyYWN0ZXIgJHtvZmZzZXQgKyAxfSlcbiI7CiAgICAgIH0KICAgICAgaW50IGxpbmVFbmQgPSBzb3VyY2UubGVuZ3RoOwogICAgICBmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaW50IGNoYXIgPSBzb3VyY2UuY29kZVVuaXRBdChpKTsKICAgICAgICBpZiAoY2hhciA9PSAweDBhIHx8IGNoYXIgPT0gMHgwZCkgewogICAgICAgICAgbGluZUVuZCA9IGk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaW50IGxlbmd0aCA9IGxpbmVFbmQgLSBsaW5lU3RhcnQ7CiAgICAgIGludCBzdGFydCA9IGxpbmVTdGFydDsKICAgICAgaW50IGVuZCA9IGxpbmVFbmQ7CiAgICAgIFN0cmluZyBwcmVmaXggPSAiIjsKICAgICAgU3RyaW5nIHBvc3RmaXggPSAiIjsKICAgICAgaWYgKGxlbmd0aCA+IDc4KSB7CiAgICAgICAgLy8gQ2FuJ3Qgc2hvdyBlbnRpcmUgbGluZS4gVHJ5IHRvIGFuY2hvciBhdCB0aGUgbmVhcmVzdCBlbmQsIGlmCiAgICAgICAgLy8gb25lIGlzIHdpdGhpbiByZWFjaC4KICAgICAgICBpbnQgaW5kZXggPSBvZmZzZXQgLSBsaW5lU3RhcnQ7CiAgICAgICAgaWYgKGluZGV4IDwgNzUpIHsKICAgICAgICAgIGVuZCA9IHN0YXJ0ICsgNzU7CiAgICAgICAgICBwb3N0Zml4ID0gIi4uLiI7CiAgICAgICAgfSBlbHNlIGlmIChlbmQgLSBvZmZzZXQgPCA3NSkgewogICAgICAgICAgc3RhcnQgPSBlbmQgLSA3NTsKICAgICAgICAgIHByZWZpeCA9ICIuLi4iOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBOZWl0aGVyIGVuZCBpcyBuZWFyLCBqdXN0IHBpY2sgYW4gYXJlYSBhcm91bmQgdGhlIG9mZnNldC4KICAgICAgICAgIHN0YXJ0ID0gb2Zmc2V0IC0gMzY7CiAgICAgICAgICBlbmQgPSBvZmZzZXQgKyAzNjsKICAgICAgICAgIHByZWZpeCA9IHBvc3RmaXggPSAiLi4uIjsKICAgICAgICB9CiAgICAgIH0KICAgICAgU3RyaW5nIHNsaWNlID0gc291cmNlLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKICAgICAgaW50IG1hcmtPZmZzZXQgPSBvZmZzZXQgLSBzdGFydCArIHByZWZpeC5sZW5ndGg7CiAgICAgIHJldHVybiAiJHJlcG9ydCRwcmVmaXgkc2xpY2UkcG9zdGZpeFxuJHsiICIgKiBtYXJrT2Zmc2V0fV5cbiI7CiAgICB9IGVsc2UgewogICAgICAvLyBUaGUgc291cmNlIGlzIG5vdCBhIHN0cmluZy4KICAgICAgaWYgKG9mZnNldCAhPSBudWxsKSB7CiAgICAgICAgcmVwb3J0ICs9ICIgKGF0IG9mZnNldCAkb2Zmc2V0KSI7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlcG9ydDsKICAgIH0KICB9Cn0KCi8vIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBkb2luZyBpbnRlZ2VyIGRpdmlzaW9uIHdpdGggYSB6ZXJvIGRpdmlzb3IuCmNsYXNzIEludGVnZXJEaXZpc2lvbkJ5WmVyb0V4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbiB7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGNvbnN0IEludGVnZXJEaXZpc2lvbkJ5WmVyb0V4Y2VwdGlvbigpOwogIFN0cmluZyB0b1N0cmluZygpID0+ICJJbnRlZ2VyRGl2aXNpb25CeVplcm9FeGNlcHRpb24iOwp9CoC6AE5OPAETAT0BBEIDUU01A1BQOwQbOwIBRigRAR4BFi0iBAIBBE8tBC0GLAYYAQY1BT1PBTEGEAEGOgVNTT8FTkwiBU4GFAEGRQVLQgYcSAEGNAU0BUomSDkFS0tKDgYWJywkBh4nIiRGFwg3HCI0CiMIFxkmKSkcNhcMHSUjFR0kCggZUA81CCM1KSwXEQoIKB0ZGhsZSCAoGhwbKBwaEUcfHSQKCDM3RQ0lHCoIFQYEAgFFPBwqOQIBGWRhcnQ6Y29yZS9leGNlcHRpb25zLmRhcnQtb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvZXhwYW5kby5kYXJ0iIgvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogQW4gW0V4cGFuZG9dIGFsbG93cyBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gb2JqZWN0cy4KICoKICogRG9lcyBub3Qgd29yayBvbiBudW1iZXJzLCBzdHJpbmdzLCBib29sZWFucyBvciBudWxsLgogKgogKiBBbiBgRXhwYW5kb2AgZG9lcyBub3QgaG9sZCBvbiB0byB0aGUgYWRkZWQgcHJvcGVydHkgdmFsdWUgYWZ0ZXIgYW4gb2JqZWN0CiAqIGJlY29tZXMgaW5hY2Nlc3NpYmxlLgogKgogKiBTaW5jZSB5b3UgY2FuIGFsd2F5cyBjcmVhdGUgYSBuZXcgbnVtYmVyIHRoYXQgaXMgaWRlbnRpY2FsIHRvIGFuIGV4aXN0aW5nCiAqIG51bWJlciwgaXQgbWVhbnMgdGhhdCBhbiBleHBhbmRvIHByb3BlcnR5IG9uIGEgbnVtYmVyIGNvdWxkIG5ldmVyIGJlCiAqIHJlbGVhc2VkLiBUbyBhdm9pZCB0aGlzLCBleHBhbmRvIHByb3BlcnRpZXMgY2Fubm90IGJlIGFkZGVkIHRvIG51bWJlcnMuCiAqIFRoZSBzYW1lIGFyZ3VtZW50IGFwcGxpZXMgdG8gc3RyaW5ncywgYm9vbGVhbnMgYW5kIG51bGwsIHdoaWNoIGFsc28gaGF2ZQogKiBsaXRlcmFscyB0aGF0IGV2YWx1YXRlIHRvIGlkZW50aWNhbCB2YWx1ZXMgd2hlbiB0aGV5IG9jY3VyIG1vcmUgdGhhbiBvbmNlLgogKgogKiBUaGVyZSBpcyBubyByZXN0cmljdGlvbiBvbiBvdGhlciBjbGFzc2VzLCBldmVuIGZvciBjb21waWxlIHRpbWUgY29uc3RhbnQKICogb2JqZWN0cy4gQmUgY2FyZWZ1bCBpZiBhZGRpbmcgZXhwYW5kbyBwcm9wZXJ0aWVzIHRvIGNvbXBpbGUgdGltZSBjb25zdGFudHMsCiAqIHNpbmNlIHRoZXkgd2lsbCBzdGF5IGFsaXZlIGZvcmV2ZXIuCiAqLwpjbGFzcyBFeHBhbmRvPFQ+IHsKICAvKioKICAgKiBUaGUgbmFtZSBvZiB0aGUgdGhpcyBbRXhwYW5kb10gYXMgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4gSWYKICAgKiBubyBuYW1lIHdhcyBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLCB0aGUgbmFtZSBpcyBbOm51bGw6XS4KICAgKi8KICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBbRXhwYW5kb10uIFRoZSBvcHRpb25hbCBuYW1lIGlzIG9ubHkgdXNlZCBmb3IKICAgKiBkZWJ1Z2dpbmcgcHVycG9zZXMgYW5kIGNyZWF0aW5nIHR3byBkaWZmZXJlbnQgW0V4cGFuZG9dcyB3aXRoIHRoZQogICAqIHNhbWUgbmFtZSB5aWVsZHMgdHdvIFtFeHBhbmRvXXMgdGhhdCB3b3JrIG9uIGRpZmZlcmVudCBwcm9wZXJ0aWVzCiAgICogb2YgdGhlIG9iamVjdHMgdGhleSBhcmUgdXNlZCBvbi4KICAgKi8KICBleHRlcm5hbCBFeHBhbmRvKFtTdHJpbmcgbmFtZV0pOwoKICAvKioKICAgKiBFeHBhbmRvIHRvU3RyaW5nIG1ldGhvZCBvdmVycmlkZS4KICAgKi8KICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiRXhwYW5kbzokbmFtZSI7CgogIC8qKgogICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoaXMgW0V4cGFuZG9dJ3MgcHJvcGVydHkgb24gdGhlIGdpdmVuCiAgICogb2JqZWN0LiBJZiB0aGUgb2JqZWN0IGhhc24ndCBiZWVuIGV4cGFuZGVkLCB0aGUgbWV0aG9kIHJldHVybnMKICAgKiBbOm51bGw6XS4KICAgKgogICAqIFRoZSBvYmplY3QgbXVzdCBub3QgYmUgYSBudW1iZXIsIGEgc3RyaW5nLCBhIGJvb2xlYW4gb3IgbnVsbC4KICAgKi8KICBleHRlcm5hbCBUIG9wZXJhdG9yIFtdKE9iamVjdCBvYmplY3QpOwoKICAvKioKICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIFtFeHBhbmRvXSdzIHByb3BlcnR5IG9uIHRoZSBnaXZlbgogICAqIG9iamVjdC4gUHJvcGVydGllcyBjYW4gZWZmZWN0aXZlbHkgYmUgcmVtb3ZlZCBhZ2FpbiBieSBzZXR0aW5nCiAgICogdGhlaXIgdmFsdWUgdG8gbnVsbC4KICAgKgogICAqIFRoZSBvYmplY3QgbXVzdCBub3QgYmUgYSBudW1iZXIsIGEgc3RyaW5nLCBhIGJvb2xlYW4gb3IgbnVsbC4KICAgKi8KICBleHRlcm5hbCB2b2lkIG9wZXJhdG9yIFtdPShPYmplY3Qgb2JqZWN0LCBUIHZhbHVlKTsKfQpAAE5OPAETAQQ5AzgDTRkDTUhLTE4DTE8nBBMGRUIGFQEGQUdHJgYjAQYnBigBBj5EDwVDBikBBj5EGgVDBjYCARZkYXJ0OmNvcmUvZXhwYW5kby5kYXJ0Mm9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvZXhwYW5kb19wYXRjaC5kYXJ0j2YvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCkBwYXRjaApjbGFzcyBFeHBhbmRvPFQ+IHsKICBAcGF0Y2gKICBFeHBhbmRvKFtTdHJpbmcgbmFtZV0pCiAgICAgIDogbmFtZSA9IG5hbWUsCiAgICAgICAgX2RhdGEgPSBuZXcgTGlzdChfbWluU2l6ZSksCiAgICAgICAgX3VzZWQgPSAwOwoKICBzdGF0aWMgY29uc3QgX21pblNpemUgPSA4OwogIHN0YXRpYyBmaW5hbCBfZGVsZXRlZEVudHJ5ID0gbmV3IF9XZWFrUHJvcGVydHkobnVsbCwgbnVsbCk7CgogIEBwYXRjaAogIFQgb3BlcmF0b3IgW10oT2JqZWN0IG9iamVjdCkgewogICAgX2NoZWNrVHlwZShvYmplY3QpOwoKICAgIHZhciBtYXNrID0gX3NpemUgLSAxOwogICAgdmFyIGlkeCA9IG9iamVjdC5faWRlbnRpdHlIYXNoQ29kZSAmIG1hc2s7CiAgICB2YXIgd3AgPSBfZGF0YVtpZHhdOwoKICAgIHdoaWxlICh3cCAhPSBudWxsKSB7CiAgICAgIGlmIChpZGVudGljYWwod3Aua2V5LCBvYmplY3QpKSB7CiAgICAgICAgcmV0dXJuIHdwLnZhbHVlOwogICAgICB9IGVsc2UgaWYgKHdwLmtleSA9PSBudWxsKSB7CiAgICAgICAgLy8gVGhpcyBlbnRyeSBoYXMgYmVlbiBjbGVhcmVkIGJ5IHRoZSBHQy4KICAgICAgICBfZGF0YVtpZHhdID0gX2RlbGV0ZWRFbnRyeTsKICAgICAgfQogICAgICBpZHggPSAoaWR4ICsgMSkgJiBtYXNrOwogICAgICB3cCA9IF9kYXRhW2lkeF07CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAcGF0Y2gKICB2b2lkIG9wZXJhdG9yIFtdPShPYmplY3Qgb2JqZWN0LCBUIHZhbHVlKSB7CiAgICBfY2hlY2tUeXBlKG9iamVjdCk7CgogICAgdmFyIG1hc2sgPSBfc2l6ZSAtIDE7CiAgICB2YXIgaWR4ID0gb2JqZWN0Ll9pZGVudGl0eUhhc2hDb2RlICYgbWFzazsKICAgIHZhciBlbXB0eV9pZHggPSAtMTsKICAgIHZhciB3cCA9IF9kYXRhW2lkeF07CgogICAgd2hpbGUgKHdwICE9IG51bGwpIHsKICAgICAgaWYgKGlkZW50aWNhbCh3cC5rZXksIG9iamVjdCkpIHsKICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgLy8gVXBkYXRlIHRoZSBhc3NvY2lhdGVkIHZhbHVlLgogICAgICAgICAgd3AudmFsdWUgPSB2YWx1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gTWFyayB0aGUgZW50cnkgYXMgZGVsZXRlZC4KICAgICAgICAgIF9kYXRhW2lkeF0gPSBfZGVsZXRlZEVudHJ5OwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0gZWxzZSBpZiAoKGVtcHR5X2lkeCA8IDApICYmIGlkZW50aWNhbCh3cCwgX2RlbGV0ZWRFbnRyeSkpIHsKICAgICAgICBlbXB0eV9pZHggPSBpZHg7IC8vIEluc2VydCBhdCB0aGlzIGxvY2F0aW9uIGlmIG5vdCBmb3VuZC4KICAgICAgfSBlbHNlIGlmICh3cC5rZXkgPT0gbnVsbCkgewogICAgICAgIC8vIFRoaXMgZW50cnkgaGFzIGJlZW4gY2xlYXJlZCBieSB0aGUgR0MuCiAgICAgICAgX2RhdGFbaWR4XSA9IF9kZWxldGVkRW50cnk7CiAgICAgICAgaWYgKGVtcHR5X2lkeCA8IDApIHsKICAgICAgICAgIGVtcHR5X2lkeCA9IGlkeDsgLy8gSW5zZXJ0IGF0IHRoaXMgbG9jYXRpb24gaWYgbm90IGZvdW5kLgogICAgICAgIH0KICAgICAgfQogICAgICBpZHggPSAoaWR4ICsgMSkgJiBtYXNrOwogICAgICB3cCA9IF9kYXRhW2lkeF07CiAgICB9CgogICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgLy8gTm90IGVudGVyaW5nIGEgbnVsbCB2YWx1ZS4gV2UganVzdCBuZWVkZWQgdG8gbWFrZSBzdXJlIHRvIGNsZWFyIGFuCiAgICAgIC8vIGV4aXN0aW5nIHZhbHVlIGlmIGl0IGV4aXN0ZWQuCiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoZW1wdHlfaWR4ID49IDApIHsKICAgICAgLy8gV2Ugd2lsbCBiZSByZXVzaW5nIHRoZSBlbXB0eSBzbG90IGJlbG93LgogICAgICBfdXNlZC0tOwogICAgICBpZHggPSBlbXB0eV9pZHg7CiAgICB9CgogICAgaWYgKF91c2VkIDwgX2xpbWl0KSB7CiAgICAgIF9kYXRhW2lkeF0gPSBuZXcgX1dlYWtQcm9wZXJ0eShvYmplY3QsIHZhbHVlKTsKICAgICAgX3VzZWQrKzsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIEdyb3cvcmVhbGxvY2F0ZSBpZiB0b28gbWFueSBzbG90cyBoYXZlIGJlZW4gdXNlZC4KICAgIF9yZWhhc2goKTsKICAgIHRoaXNbb2JqZWN0XSA9IHZhbHVlOyAvLyBSZWN1cnNpdmVseSBhZGQgdGhlIHZhbHVlLgogIH0KCiAgX3JlaGFzaCgpIHsKICAgIC8vIERldGVybWluZSB0aGUgcG9wdWxhdGlvbiBjb3VudCBvZiB0aGUgbWFwIHRvIGFsbG9jYXRlIGFuIGFwcHJvcHJpYXRlbHkKICAgIC8vIHNpemVkIG1hcCBiZWxvdy4KICAgIHZhciBjb3VudCA9IDA7CiAgICB2YXIgb2xkX2RhdGEgPSBfZGF0YTsKICAgIHZhciBsZW4gPSBvbGRfZGF0YS5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIHZhciBlbnRyeSA9IG9sZF9kYXRhW2ldOwogICAgICBpZiAoKGVudHJ5ICE9IG51bGwpICYmIChlbnRyeS5rZXkgIT0gbnVsbCkpIHsKICAgICAgICAvLyBPbmx5IGNvdW50IG5vbi1jbGVhcmVkIGVudHJpZXMuCiAgICAgICAgY291bnQrKzsKICAgICAgfQogICAgfQoKICAgIHZhciBuZXdfc2l6ZSA9IF9zaXplOwogICAgaWYgKGNvdW50IDw9IChuZXdfc2l6ZSA+PiAyKSkgewogICAgICBuZXdfc2l6ZSA9IG5ld19zaXplID4+IDE7CiAgICB9IGVsc2UgaWYgKGNvdW50ID4gKG5ld19zaXplID4+IDEpKSB7CiAgICAgIG5ld19zaXplID0gbmV3X3NpemUgPDwgMTsKICAgIH0KICAgIG5ld19zaXplID0gKG5ld19zaXplIDwgX21pblNpemUpID8gX21pblNpemUgOiBuZXdfc2l6ZTsKCiAgICAvLyBSZXNldCB0aGUgbWFwcGluZ3MgdG8gZW1wdHkgc28gdGhhdCB3ZSBjYW4ganVzdCBhZGQgdGhlIGV4aXN0aW5nCiAgICAvLyB2YWxpZCBlbnRyaWVzLgogICAgX2RhdGEgPSBuZXcgTGlzdChuZXdfc2l6ZSk7CiAgICBfdXNlZCA9IDA7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvbGRfZGF0YS5sZW5ndGg7IGkrKykgewogICAgICB2YXIgZW50cnkgPSBvbGRfZGF0YVtpXTsKICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgZW50cnkua2V5IGlzIG5vdCBjbGVhcmVkIGJldHdlZW4gY2hlY2tpbmcgZm9yIGl0IGFuZAogICAgICAgIC8vIGluc2VydGluZyBpdCBpbnRvIHRoZSBuZXcgdGFibGUuCiAgICAgICAgdmFyIHZhbCA9IGVudHJ5LnZhbHVlOwogICAgICAgIHZhciBrZXkgPSBlbnRyeS5rZXk7CiAgICAgICAgaWYgKGtleSAhPSBudWxsKSB7CiAgICAgICAgICB0aGlzW2tleV0gPSB2YWw7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBzdGF0aWMgX2NoZWNrVHlwZShvYmplY3QpIHsKICAgIGlmICgob2JqZWN0ID09IG51bGwpIHx8CiAgICAgICAgKG9iamVjdCBpcyBib29sKSB8fAogICAgICAgIChvYmplY3QgaXMgbnVtKSB8fAogICAgICAgIChvYmplY3QgaXMgU3RyaW5nKSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZShvYmplY3QsCiAgICAgICAgICAiRXhwYW5kb3MgYXJlIG5vdCBhbGxvd2VkIG9uIHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zIG9yIG51bGwiKTsKICAgIH0KICB9CgogIGdldCBfc2l6ZSA9PiBfZGF0YS5sZW5ndGg7CiAgZ2V0IF9saW1pdCA9PiAoMyAqIChfc2l6ZSB+LyA0KSk7CgogIExpc3QgX2RhdGE7CiAgaW50IF91c2VkOyAvLyBOdW1iZXIgb2YgdXNlZCAoYWN0aXZlIGFuZCBkZWxldGVkKSBzbG90cy4KfQqAmQBOTjwBHgEHEwkZFSQTAR0+AQkhGAEaLxkBGScZIzIkCB4XBgERBAEJLhgBGi8YGQEZJx0qHBEoJgoQREIjMiQdRAoIHhcGARlMJw4GARoyDxcGARo1Dw4GATkPOAQBDk4YExofJB80KxEIBgEaJCAqIAY8AUgWIA8BMB8bUCwfHRsbCggGBAEeHBwbHixNBgQBHSQBDjsCASJkYXJ0OmNvcmUtcGF0Y2gvZXhwYW5kb19wYXRjaC5kYXJ0Lm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL2Z1bmN0aW9uLmRhcnSJoS8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCi8qKgogKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIGZ1bmN0aW9uIHR5cGVzLgogKgogKiBBIGZ1bmN0aW9uIHZhbHVlLCBvciBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHdpdGggYSAiY2FsbCIgbWV0aG9kLCBpcyBhCiAqIHN1YnR5cGUgb2YgYSBmdW5jdGlvbiB0eXBlLCBhbmQgYXMgc3VjaCwgYSBzdWJ0eXBlIG9mIFtGdW5jdGlvbl0uCiAqLwphYnN0cmFjdCBjbGFzcyBGdW5jdGlvbiB7CiAgLyoqCiAgICogRHluYW1pY2FsbHkgY2FsbCBbZnVuY3Rpb25dIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMuCiAgICoKICAgKiBBY3RzIHRoZSBzYW1lIGFzIGNhbGxpbmcgZnVuY3Rpb24gd2l0aCBwb3NpdGlvbmFsIGFyZ3VtZW50cwogICAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnRzIG9mIFtwb3NpdGlvbmFsQXJndW1lbnRzXSBhbmQKICAgKiBuYW1lZCBhcmd1bWVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgZWxlbWVudHMgb2YgW25hbWVkQXJndW1lbnRzXS4KICAgKgogICAqIFRoaXMgaW5jbHVkZXMgZ2l2aW5nIHRoZSBzYW1lIGVycm9ycyBpZiBbZnVuY3Rpb25dIGlzbid0IGNhbGxhYmxlIG9yCiAgICogaWYgaXQgZXhwZWN0cyBkaWZmZXJlbnQgcGFyYW1ldGVycy4KICAgKgogICAqIEV4YW1wbGU6CiAgICogYGBgCiAgICogRnVuY3Rpb24uYXBwbHkoZm9vLCBbMSwyLDNdLCB7I2Y6IDQsICNnOiA1fSk7CiAgICogYGBgCiAgICoKICAgKiBnaXZlcyBleGFjdGx5IHRoZSBzYW1lIHJlc3VsdCBhcwogICAqIGBgYAogICAqIGZvbygxLCAyLCAzLCBmOiA0LCBnOiA1KS4KICAgKiBgYGAKICAgKgogICAqIElmIFtwb3NpdGlvbmFsQXJndW1lbnRzXSBpcyBudWxsLCBpdCdzIGNvbnNpZGVyZWQgYW4gZW1wdHkgbGlzdC4KICAgKiBJZiBbbmFtZWRBcmd1bWVudHNdIGlzIG9taXR0ZWQgb3IgbnVsbCwgaXQgaXMgY29uc2lkZXJlZCBhbiBlbXB0eSBtYXAuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIGFwcGx5KEZ1bmN0aW9uIGZ1bmN0aW9uLCBMaXN0IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIFtNYXA8U3ltYm9sLCBkeW5hbWljPiBuYW1lZEFyZ3VtZW50c10pOwoKICAvKioKICAgKiBSZXR1cm5zIGEgaGFzaCBjb2RlIHZhbHVlIHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIGBvcGVyYXRvcj09YC4KICAgKi8KICBpbnQgZ2V0IGhhc2hDb2RlOwoKICAvKioKICAgKiBUZXN0IHdoZXRoZXIgYW5vdGhlciBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyBmdW5jdGlvbi4KICAgKgogICAqIFN5c3RlbS1jcmVhdGVkIGZ1bmN0aW9uIG9iamVjdHMgYXJlIG9ubHkgZXF1YWwgdG8gb3RoZXIgZnVuY3Rpb25zLgogICAqCiAgICogVHdvIGZ1bmN0aW9uIG9iamVjdHMgYXJlIGtub3duIHRvIHJlcHJlc2VudCB0aGUgc2FtZSBmdW5jdGlvbiBpZgogICAqCiAgICogLSBJdCBpcyB0aGUgc2FtZSBvYmplY3QuIFN0YXRpYyBhbmQgdG9wLWxldmVsIGZ1bmN0aW9ucyBhcmUgY29tcGlsZSB0aW1lCiAgICogICBjb25zdGFudHMgd2hlbiB1c2VkIGFzIHZhbHVlcywgc28gcmVmZXJyaW5nIHRvIHRoZSBzYW1lIGZ1bmN0aW9uIHR3aWNlCiAgICogICBhbHdheXMgZ2l2ZSB0aGUgc2FtZSBvYmplY3QsCiAgICogLSBvciBpZiB0aGV5IHJlZmVyIHRvIHRoZSBzYW1lIG1lbWJlciBtZXRob2QgZXh0cmFjdGVkIGZyb20gdGhlIHNhbWUgb2JqZWN0LgogICAqICAgRXh0cmFjdGluZyBhIG1lbWJlciBtZXRob2QgYXMgYSBmdW5jdGlvbiB2YWx1ZSB0d2ljZSBnaXZlcyBlcXVhbCwgYnV0CiAgICogICBub3QgbmVjZXNzYXJpbHkgaWRlbnRpY2FsLCBmdW5jdGlvbiB2YWx1ZXMuCiAgICoKICAgKiBGdW5jdGlvbiBleHByZXNzaW9ucyBuZXZlciBnaXZlIHJpc2UgdG8gZXF1YWwgZnVuY3Rpb24gb2JqZWN0cy4gRWFjaCB0aW1lCiAgICogYSBmdW5jdGlvbiBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCwgaXQgY3JlYXRlcyBhIG5ldyBjbG9zdXJlIHZhbHVlIHRoYXQKICAgKiBpcyBub3Qga25vd24gdG8gYmUgZXF1YWwgdG8gb3RoZXIgY2xvc3VyZXMgY3JlYXRlZCBieSB0aGUgc2FtZSBleHByZXNzaW9uLgogICAqCiAgICogQ2xhc3NlcyBpbXBsZW1lbnRpbmcgYEZ1bmN0aW9uYCBieSBoYXZpbmcgYSBgY2FsbGAgbWV0aG9kIHNob3VsZCBoYXZlIHRoZWlyCiAgICogb3duIGBvcGVyYXRvcj09YCBhbmQgYGhhc2hDb2RlYCBkZXBlbmRpbmcgb24gdGhlIG9iamVjdC4KICAgKi8KICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcik7Cn0KRQBOTjwBEwEEKgNKRQQaBj8FQUBIBUopBQ4JMwkFJgkfCQVGTAZFLgEGRQYUAQY8BUgFRgVOTiRSTTMFT01QBVE+BiICARdkYXJ0OmNvcmUvZnVuY3Rpb24uZGFydDNvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2Z1bmN0aW9uX3BhdGNoLmRhcnSFOS8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb3JlX3BhdGNoLmRhcnQiOwoKQHBhdGNoCmNsYXNzIEZ1bmN0aW9uIHsKICAvLyBUT0RPKHJlZ2lzKTogUGFzcyB0eXBlIGFyZ3VtZW50cyB0byBnZW5lcmljIGZ1bmN0aW9ucy4gV2FpdCBmb3IgQVBJIHNwZWMuCiAgc3RhdGljIF9hcHBseShMaXN0IGFyZ3VtZW50cywgTGlzdCBuYW1lcykgbmF0aXZlICJGdW5jdGlvbl9hcHBseSI7CgogIEBwYXRjaAogIHN0YXRpYyBhcHBseShGdW5jdGlvbiBmdW5jdGlvbiwgTGlzdCBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBbTWFwPFN5bWJvbCwgZHluYW1pYz4gbmFtZWRBcmd1bWVudHNdKSB7CiAgICBpbnQgbnVtUG9zaXRpb25hbEFyZ3VtZW50cyA9IDEgKyAvLyBGdW5jdGlvbiBpcyBmaXJzdCBpbXBsaWNpdCBhcmd1bWVudC4KICAgICAgICAocG9zaXRpb25hbEFyZ3VtZW50cyAhPSBudWxsID8gcG9zaXRpb25hbEFyZ3VtZW50cy5sZW5ndGggOiAwKTsKICAgIGludCBudW1OYW1lZEFyZ3VtZW50cyA9IG5hbWVkQXJndW1lbnRzICE9IG51bGwgPyBuYW1lZEFyZ3VtZW50cy5sZW5ndGggOiAwOwogICAgaW50IG51bUFyZ3VtZW50cyA9IG51bVBvc2l0aW9uYWxBcmd1bWVudHMgKyBudW1OYW1lZEFyZ3VtZW50czsKICAgIExpc3QgYXJndW1lbnRzID0gbmV3IExpc3QobnVtQXJndW1lbnRzKTsKICAgIGFyZ3VtZW50c1swXSA9IGZ1bmN0aW9uOwogICAgYXJndW1lbnRzLnNldFJhbmdlKDEsIG51bVBvc2l0aW9uYWxBcmd1bWVudHMsIHBvc2l0aW9uYWxBcmd1bWVudHMpOwogICAgTGlzdCBuYW1lcyA9IG5ldyBMaXN0KG51bU5hbWVkQXJndW1lbnRzKTsKICAgIGludCBhcmd1bWVudEluZGV4ID0gbnVtUG9zaXRpb25hbEFyZ3VtZW50czsKICAgIGludCBuYW1lSW5kZXggPSAwOwogICAgaWYgKG51bU5hbWVkQXJndW1lbnRzID4gMCkgewogICAgICBuYW1lZEFyZ3VtZW50cy5mb3JFYWNoKChuYW1lLCB2YWx1ZSkgewogICAgICAgIGFyZ3VtZW50c1thcmd1bWVudEluZGV4KytdID0gdmFsdWU7CiAgICAgICAgbmFtZXNbbmFtZUluZGV4KytdID0gaW50ZXJuYWwuU3ltYm9sLmdldE5hbWUobmFtZSk7CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIF9hcHBseShhcmd1bWVudHMsIG5hbWVzKTsKICB9Cn0KIwBOTjwBHgEHEU9FAQk8L01IUEMtHUguMBchLSw8CgYlBAIBI2RhcnQ6Y29yZS1wYXRjaC9mdW5jdGlvbl9wYXRjaC5kYXJ0KW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL2ludC5kYXJ0risvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogQW4gaW50ZWdlciBudW1iZXIuCiAqCiAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGBpbnRgIGlzIDY0LWJpdCB0d28ncyBjb21wbGVtZW50IGludGVnZXJzCiAqIHdpdGggb3BlcmF0aW9ucyB0aGF0IHdyYXAgdG8gdGhhdCByYW5nZSBvbiBvdmVyZmxvdy4KICoKICogKipOb3RlOioqIFdoZW4gY29tcGlsaW5nIHRvIEphdmFTY3JpcHQsIGludGVnZXJzIGFyZSByZXN0cmljdGVkIHRvIHZhbHVlcwogKiB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCBleGFjdGx5IGJ5IGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWVzLgogKiBUaGUgYXZhaWxhYmxlIGludGVnZXIgdmFsdWVzIGluY2x1ZGUgYWxsIGludGVnZXJzIGJldHdlZW4gLTJeNTMgYW5kIDJeNTMsCiAqIGFuZCBzb21lIGludGVnZXJzIHdpdGggbGFyZ2VyIG1hZ25pdHVkZS4gVGhhdCBpbmNsdWRlcyBzb21lIGludGVnZXJzIGxhcmdlcgogKiB0aGFuIDJeNjMuCiAqIFRoZSBiZWhhdmlvciBvZiB0aGUgb3BlcmF0b3JzIGFuZCBtZXRob2RzIGluIHRoZSBbaW50XQogKiBjbGFzcyB0aGVyZWZvcmUgc29tZXRpbWVzIGRpZmZlcnMgYmV0d2VlbiB0aGUgRGFydCBWTSBhbmQgRGFydCBjb2RlCiAqIGNvbXBpbGVkIHRvIEphdmFTY3JpcHQuIEZvciBleGFtcGxlLCB0aGUgYml0d2lzZSBvcGVyYXRvcnMgdHJ1bmNhdGUgdGhlaXIKICogb3BlcmFuZHMgdG8gMzItYml0IGludGVnZXJzIHdoZW4gY29tcGlsZWQgdG8gSmF2YVNjcmlwdC4KICoKICogQ2xhc3NlcyBjYW5ub3QgZXh0ZW5kLCBpbXBsZW1lbnQsIG9yIG1peCBpbiBgaW50YC4KICovCmFic3RyYWN0IGNsYXNzIGludCBleHRlbmRzIG51bSB7CiAgLyoqCiAgICogUmV0dXJucyB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgZGVjbGFyYXRpb24gW25hbWVdLgogICAqCiAgICogVGhlIHJlc3VsdCBpcyB0aGUgc2FtZSBhcyB3b3VsZCBiZSByZXR1cm5lZCBieToKICAgKiBgYGAKICAgKiBpbnQudHJ5UGFyc2UoY29uc3QgU3RyaW5nLmZyb21FbnZpcm9ubWVudChuYW1lLCBkZWZhdWx0VmFsdWU6ICIiKSkKICAgKiAgICAgPz8gZGVmYXVsdFZhbHVlCiAgICogYGBgCiAgICogRXhhbXBsZToKICAgKiBgYGAKICAgKiBjb25zdCBpbnQuZnJvbUVudmlyb25tZW50KCJkZWZhdWx0UG9ydCIsIGRlZmF1bHRWYWx1ZTogODApCiAgICogYGBgCiAgICovCiAgLy8gVGhlIC5mcm9tRW52aXJvbm1lbnQoKSBjb25zdHJ1Y3RvcnMgYXJlIHNwZWNpYWwgaW4gdGhhdCB3ZSBkbyBub3Qgd2FudAogIC8vIHVzZXJzIHRvIGNhbGwgdGhlbSB1c2luZyAibmV3Ii4gV2UgcHJvaGliaXQgdGhhdCBieSBnaXZpbmcgdGhlbSBib2RpZXMKICAvLyB0aGF0IHRocm93LCBldmVuIHRob3VnaCBjb25zdCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBhbGxvd2VkIHRvIGhhdmUgYm9kaWVzLgogIC8vIERpc2FibGUgdGhvc2Ugc3RhdGljIGVycm9ycy4KICAvL2lnbm9yZTogY29uc3RfY29uc3RydWN0b3Jfd2l0aF9ib2R5CiAgLy9pZ25vcmU6IGNvbnN0X2ZhY3RvcnkKICBleHRlcm5hbCBjb25zdCBmYWN0b3J5IGludC5mcm9tRW52aXJvbm1lbnQoU3RyaW5nIG5hbWUsIHtpbnQgZGVmYXVsdFZhbHVlfSk7CgogIC8qKgogICAqIEJpdC13aXNlIGFuZCBvcGVyYXRvci4KICAgKgogICAqIFRyZWF0aW5nIGJvdGggYHRoaXNgIGFuZCBbb3RoZXJdIGFzIHN1ZmZpY2llbnRseSBsYXJnZSB0d28ncyBjb21wb25lbnQKICAgKiBpbnRlZ2VycywgdGhlIHJlc3VsdCBpcyBhIG51bWJlciB3aXRoIG9ubHkgdGhlIGJpdHMgc2V0IHRoYXQgYXJlIHNldCBpbgogICAqIGJvdGggYHRoaXNgIGFuZCBbb3RoZXJdCiAgICoKICAgKiBPZiBib3RoIG9wZXJhbmRzIGFyZSBuZWdhdGl2ZSwgdGhlIHJlc3VsdCBpcyBuZWdhdGl2ZSwgb3RoZXJ3aXNlCiAgICogdGhlIHJlc3VsdCBpcyBub24tbmVnYXRpdmUuCiAgICovCiAgaW50IG9wZXJhdG9yICYoaW50IG90aGVyKTsKCiAgLyoqCiAgICogQml0LXdpc2Ugb3Igb3BlcmF0b3IuCiAgICoKICAgKiBUcmVhdGluZyBib3RoIGB0aGlzYCBhbmQgW290aGVyXSBhcyBzdWZmaWNpZW50bHkgbGFyZ2UgdHdvJ3MgY29tcG9uZW50CiAgICogaW50ZWdlcnMsIHRoZSByZXN1bHQgaXMgYSBudW1iZXIgd2l0aCB0aGUgYml0cyBzZXQgdGhhdCBhcmUgc2V0IGluIGVpdGhlcgogICAqIG9mIGB0aGlzYCBhbmQgW290aGVyXQogICAqCiAgICogSWYgYm90aCBvcGVyYW5kcyBhcmUgbm9uLW5lZ2F0aXZlLCB0aGUgcmVzdWx0IGlzIG5vbi1uZWdhdGl2ZSwKICAgKiBvdGhlcndpc2UgdGhlIHJlc3VsdCB1cyBuZWdhdGl2ZS4KICAgKi8KICBpbnQgb3BlcmF0b3IgfChpbnQgb3RoZXIpOwoKICAvKioKICAgKiBCaXQtd2lzZSBleGNsdXNpdmUtb3Igb3BlcmF0b3IuCiAgICoKICAgKiBUcmVhdGluZyBib3RoIGB0aGlzYCBhbmQgW290aGVyXSBhcyBzdWZmaWNpZW50bHkgbGFyZ2UgdHdvJ3MgY29tcG9uZW50CiAgICogaW50ZWdlcnMsIHRoZSByZXN1bHQgaXMgYSBudW1iZXIgd2l0aCB0aGUgYml0cyBzZXQgdGhhdCBhcmUgc2V0IGluIG9uZSwKICAgKiBidXQgbm90IGJvdGgsIG9mIGB0aGlzYCBhbmQgW290aGVyXQogICAqCiAgICogSWYgdGhlIG9wZXJhbmRzIGhhdmUgdGhlIHNhbWUgc2lnbiwgdGhlIHJlc3VsdCBpcyBub24tbmVnYXRpdmUsCiAgICogb3RoZXJ3aXNlIHRoZSByZXN1bHQgaXMgbmVnYXRpdmUuCiAgICovCiAgaW50IG9wZXJhdG9yIF4oaW50IG90aGVyKTsKCiAgLyoqCiAgICogVGhlIGJpdC13aXNlIG5lZ2F0ZSBvcGVyYXRvci4KICAgKgogICAqIFRyZWF0aW5nIGB0aGlzYCBhcyBhIHN1ZmZpY2llbnRseSBsYXJnZSB0d28ncyBjb21wb25lbnQgaW50ZWdlciwKICAgKiB0aGUgcmVzdWx0IGlzIGEgbnVtYmVyIHdpdGggdGhlIG9wcG9zaXRlIGJpdHMgc2V0LgogICAqCiAgICogVGhpcyBtYXBzIGFueSBpbnRlZ2VyIGB4YCB0byBgLXggLSAxYC4KICAgKi8KICBpbnQgb3BlcmF0b3IgfigpOwoKICAvKioKICAgKiBTaGlmdCB0aGUgYml0cyBvZiB0aGlzIGludGVnZXIgdG8gdGhlIGxlZnQgYnkgW3NoaWZ0QW1vdW50XS4KICAgKgogICAqIFNoaWZ0aW5nIHRvIHRoZSBsZWZ0IG1ha2VzIHRoZSBudW1iZXIgbGFyZ2VyLCBlZmZlY3RpdmVseSBtdWx0aXBseWluZwogICAqIHRoZSBudW1iZXIgYnkgYHBvdygyLCBzaGlmdEluZGV4KWAuCiAgICoKICAgKiBUaGVyZSBpcyBubyBsaW1pdCBvbiB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0LiBJdCBtYXkgYmUgcmVsZXZhbnQgdG8KICAgKiBsaW1pdCBpbnRlcm1lZGlhdGUgdmFsdWVzIGJ5IHVzaW5nIHRoZSAiYW5kIiBvcGVyYXRvciB3aXRoIGEgc3VpdGFibGUKICAgKiBtYXNrLgogICAqCiAgICogSXQgaXMgYW4gZXJyb3IgaWYgW3NoaWZ0QW1vdW50XSBpcyBuZWdhdGl2ZS4KICAgKi8KICBpbnQgb3BlcmF0b3IgPDwoaW50IHNoaWZ0QW1vdW50KTsKCiAgLyoqCiAgICogU2hpZnQgdGhlIGJpdHMgb2YgdGhpcyBpbnRlZ2VyIHRvIHRoZSByaWdodCBieSBbc2hpZnRBbW91bnRdLgogICAqCiAgICogU2hpZnRpbmcgdG8gdGhlIHJpZ2h0IG1ha2VzIHRoZSBudW1iZXIgc21hbGxlciBhbmQgZHJvcHMgdGhlIGxlYXN0CiAgICogc2lnbmlmaWNhbnQgYml0cywgZWZmZWN0aXZlbHkgZG9pbmcgYW4gaW50ZWdlciBkaXZpc2lvbiBieQogICAqYHBvdygyLCBzaGlmdEluZGV4KWAuCiAgICoKICAgKiBJdCBpcyBhbiBlcnJvciBpZiBbc2hpZnRBbW91bnRdIGlzIG5lZ2F0aXZlLgogICAqLwogIGludCBvcGVyYXRvciA+PihpbnQgc2hpZnRBbW91bnQpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoaXMgaW50ZWdlciB0byB0aGUgcG93ZXIgb2YgW2V4cG9uZW50XSBtb2R1bG8gW21vZHVsdXNdLgogICAqCiAgICogVGhlIFtleHBvbmVudF0gbXVzdCBiZSBub24tbmVnYXRpdmUgYW5kIFttb2R1bHVzXSBtdXN0IGJlCiAgICogcG9zaXRpdmUuCiAgICovCiAgaW50IG1vZFBvdyhpbnQgZXhwb25lbnQsIGludCBtb2R1bHVzKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbW9kdWxhciBtdWx0aXBsaWNhdGl2ZSBpbnZlcnNlIG9mIHRoaXMgaW50ZWdlcgogICAqIG1vZHVsbyBbbW9kdWx1c10uCiAgICoKICAgKiBUaGUgW21vZHVsdXNdIG11c3QgYmUgcG9zaXRpdmUuCiAgICoKICAgKiBJdCBpcyBhbiBlcnJvciBpZiBubyBtb2R1bGFyIGludmVyc2UgZXhpc3RzLgogICAqLwogIGludCBtb2RJbnZlcnNlKGludCBtb2R1bHVzKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZ3JlYXRlc3QgY29tbW9uIGRpdmlzb3Igb2YgdGhpcyBpbnRlZ2VyIGFuZCBbb3RoZXJdLgogICAqCiAgICogSWYgZWl0aGVyIG51bWJlciBpcyBub24temVybywgdGhlIHJlc3VsdCBpcyB0aGUgbnVtZXJpY2FsbHkgZ3JlYXRlc3QKICAgKiBpbnRlZ2VyIGRpdmlkaW5nIGJvdGggYHRoaXNgIGFuZCBgb3RoZXJgLgogICAqCiAgICogVGhlIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIGlzIGluZGVwZW5kZW50IG9mIHRoZSBvcmRlciwKICAgKiBzbyBgeC5nY2QoeSlgIGlzICBhbHdheXMgdGhlIHNhbWUgYXMgYHkuZ2NkKHgpYC4KICAgKgogICAqIEZvciBhbnkgaW50ZWdlciBgeGAsIGB4LmdjZCh4KWAgaXMgYHguYWJzKClgLgogICAqCiAgICogSWYgYm90aCBgdGhpc2AgYW5kIGBvdGhlcmAgaXMgemVybywgdGhlIHJlc3VsdCBpcyBhbHNvIHplcm8uCiAgICovCiAgaW50IGdjZChpbnQgb3RoZXIpOwoKICAvKiogUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoaXMgaW50ZWdlciBpcyBldmVuLiAqLwogIGJvb2wgZ2V0IGlzRXZlbjsKCiAgLyoqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIGludGVnZXIgaXMgb2RkLiAqLwogIGJvb2wgZ2V0IGlzT2RkOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG51bWJlciBvZiBiaXRzIHJlcXVpcmVkIHRvIHN0b3JlIHRoaXMgaW50ZWdlci4KICAgKgogICAqIFRoZSBudW1iZXIgb2YgYml0cyBleGNsdWRlcyB0aGUgc2lnbiBiaXQsIHdoaWNoIGdpdmVzIHRoZSBuYXR1cmFsIGxlbmd0aAogICAqIGZvciBub24tbmVnYXRpdmUgKHVuc2lnbmVkKSB2YWx1ZXMuICBOZWdhdGl2ZSB2YWx1ZXMgYXJlIGNvbXBsZW1lbnRlZCB0bwogICAqIHJldHVybiB0aGUgYml0IHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBiaXQgdGhhdCBkaWZmZXJzIGZyb20gdGhlIHNpZ24gYml0LgogICAqCiAgICogVG8gZmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIHN0b3JlIHRoZSB2YWx1ZSBhcyBhIHNpZ25lZCB2YWx1ZSwKICAgKiBhZGQgb25lLCBpLmUuIHVzZSBgeC5iaXRMZW5ndGggKyAxYC4KICAgKiBgYGAKICAgKiB4LmJpdExlbmd0aCA9PSAoLXgtMSkuYml0TGVuZ3RoCiAgICoKICAgKiAzLmJpdExlbmd0aCA9PSAyOyAgICAgLy8gMDAwMDAwMTEKICAgKiAyLmJpdExlbmd0aCA9PSAyOyAgICAgLy8gMDAwMDAwMTAKICAgKiAxLmJpdExlbmd0aCA9PSAxOyAgICAgLy8gMDAwMDAwMDEKICAgKiAwLmJpdExlbmd0aCA9PSAwOyAgICAgLy8gMDAwMDAwMDAKICAgKiAoLTEpLmJpdExlbmd0aCA9PSAwOyAgLy8gMTExMTExMTEKICAgKiAoLTIpLmJpdExlbmd0aCA9PSAxOyAgLy8gMTExMTExMTAKICAgKiAoLTMpLmJpdExlbmd0aCA9PSAyOyAgLy8gMTExMTExMDEKICAgKiAoLTQpLmJpdExlbmd0aCA9PSAyOyAgLy8gMTExMTExMDAKICAgKiBgYGAKICAgKi8KICBpbnQgZ2V0IGJpdExlbmd0aDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgW3dpZHRoXSBiaXRzIG9mIHRoaXMgaW50ZWdlciBhcyBhCiAgICogbm9uLW5lZ2F0aXZlIG51bWJlciAoaS5lLiB1bnNpZ25lZCByZXByZXNlbnRhdGlvbikuICBUaGUgcmV0dXJuZWQgdmFsdWUgaGFzCiAgICogemVyb3MgaW4gYWxsIGJpdCBwb3NpdGlvbnMgaGlnaGVyIHRoYW4gW3dpZHRoXS4KICAgKiBgYGAKICAgKiAoLTEpLnRvVW5zaWduZWQoNSkgPT0gMzEgICAvLyAxMTExMTExMSAgLT4gIDAwMDExMTExCiAgICogYGBgCiAgICogVGhpcyBvcGVyYXRpb24gY2FuIGJlIHVzZWQgdG8gc2ltdWxhdGUgYXJpdGhtZXRpYyBmcm9tIGxvdyBsZXZlbCBsYW5ndWFnZXMuCiAgICogRm9yIGV4YW1wbGUsIHRvIGluY3JlbWVudCBhbiA4IGJpdCBxdWFudGl0eToKICAgKiBgYGAKICAgKiBxID0gKHEgKyAxKS50b1Vuc2lnbmVkKDgpOwogICAqIGBgYAogICAqIGBxYCB3aWxsIGNvdW50IGZyb20gYDBgIHVwIHRvIGAyNTVgIGFuZCB0aGVuIHdyYXAgYXJvdW5kIHRvIGAwYC4KICAgKgogICAqIElmIHRoZSBpbnB1dCBmaXRzIGluIFt3aWR0aF0gYml0cyB3aXRob3V0IHRydW5jYXRpb24sIHRoZSByZXN1bHQgaXMgdGhlCiAgICogc2FtZSBhcyB0aGUgaW5wdXQuICBUaGUgbWluaW11bSB3aWR0aCBuZWVkZWQgdG8gYXZvaWQgdHJ1bmNhdGlvbiBvZiBgeGAgaXMKICAgKiBnaXZlbiBieSBgeC5iaXRMZW5ndGhgLCBpLmUuCiAgICogYGBgCiAgICogeCA9PSB4LnRvVW5zaWduZWQoeC5iaXRMZW5ndGgpOwogICAqIGBgYAogICAqLwogIGludCB0b1Vuc2lnbmVkKGludCB3aWR0aCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGxlYXN0IHNpZ25pZmljYW50IFt3aWR0aF0gYml0cyBvZiB0aGlzIGludGVnZXIsIGV4dGVuZGluZyB0aGUKICAgKiBoaWdoZXN0IHJldGFpbmVkIGJpdCB0byB0aGUgc2lnbi4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdHJ1bmNhdGluZyB0aGUgdmFsdWUKICAgKiB0byBmaXQgaW4gW3dpZHRoXSBiaXRzIHVzaW5nIGFuIHNpZ25lZCAyLXMgY29tcGxlbWVudCByZXByZXNlbnRhdGlvbi4gIFRoZQogICAqIHJldHVybmVkIHZhbHVlIGhhcyB0aGUgc2FtZSBiaXQgdmFsdWUgaW4gYWxsIHBvc2l0aW9ucyBoaWdoZXIgdGhhbiBbd2lkdGhdLgogICAqCiAgICogYGBgCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYtLXNpZ24gYml0LVYKICAgKiAxNi50b1NpZ25lZCg1KSA9PSAtMTYgICAvLyAgMDAwMTAwMDAgLT4gMTExMTAwMDAKICAgKiAyMzkudG9TaWduZWQoNSkgPT0gMTUgICAvLyAgMTExMDExMTEgLT4gMDAwMDExMTEKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgXgogICAqIGBgYAogICAqIFRoaXMgb3BlcmF0aW9uIGNhbiBiZSB1c2VkIHRvIHNpbXVsYXRlIGFyaXRobWV0aWMgZnJvbSBsb3cgbGV2ZWwgbGFuZ3VhZ2VzLgogICAqIEZvciBleGFtcGxlLCB0byBpbmNyZW1lbnQgYW4gOCBiaXQgc2lnbmVkIHF1YW50aXR5OgogICAqIGBgYAogICAqIHEgPSAocSArIDEpLnRvU2lnbmVkKDgpOwogICAqIGBgYAogICAqIGBxYCB3aWxsIGNvdW50IGZyb20gYDBgIHVwIHRvIGAxMjdgLCB3cmFwIHRvIGAtMTI4YCBhbmQgY291bnQgYmFjayB1cCB0bwogICAqIGAxMjdgLgogICAqCiAgICogSWYgdGhlIGlucHV0IHZhbHVlIGZpdHMgaW4gW3dpZHRoXSBiaXRzIHdpdGhvdXQgdHJ1bmNhdGlvbiwgdGhlIHJlc3VsdCBpcwogICAqIHRoZSBzYW1lIGFzIHRoZSBpbnB1dC4gIFRoZSBtaW5pbXVtIHdpZHRoIG5lZWRlZCB0byBhdm9pZCB0cnVuY2F0aW9uIG9mIGB4YAogICAqIGlzIGB4LmJpdExlbmd0aCArIDFgLCBpLmUuCiAgICogYGBgCiAgICogeCA9PSB4LnRvU2lnbmVkKHguYml0TGVuZ3RoICsgMSk7CiAgICogYGBgCiAgICovCiAgaW50IHRvU2lnbmVkKGludCB3aWR0aCk7CgogIC8qKgogICAqIFJldHVybiB0aGUgbmVnYXRpdmUgdmFsdWUgb2YgdGhpcyBpbnRlZ2VyLgogICAqCiAgICogVGhlIHJlc3VsdCBvZiBuZWdhdGluZyBhbiBpbnRlZ2VyIGFsd2F5cyBoYXMgdGhlIG9wcG9zaXRlIHNpZ24sIGV4Y2VwdAogICAqIGZvciB6ZXJvLCB3aGljaCBpcyBpdHMgb3duIG5lZ2F0aW9uLgogICAqLwogIGludCBvcGVyYXRvciAtKCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoaXMgaW50ZWdlci4KICAgKgogICAqIEZvciBhbnkgaW50ZWdlciBgeGAsIHRoZSByZXN1bHQgaXMgdGhlIHNhbWUgYXMgYHggPCAwID8gLXggOiB4YC4KICAgKi8KICBpbnQgYWJzKCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHNpZ24gb2YgdGhpcyBpbnRlZ2VyLgogICAqCiAgICogUmV0dXJucyAwIGZvciB6ZXJvLCAtMSBmb3IgdmFsdWVzIGxlc3MgdGhhbiB6ZXJvIGFuZAogICAqICsxIGZvciB2YWx1ZXMgZ3JlYXRlciB0aGFuIHplcm8uCiAgICovCiAgaW50IGdldCBzaWduOwoKICAvKiogUmV0dXJucyBgdGhpc2AuICovCiAgaW50IHJvdW5kKCk7CgogIC8qKiBSZXR1cm5zIGB0aGlzYC4gKi8KICBpbnQgZmxvb3IoKTsKCiAgLyoqIFJldHVybnMgYHRoaXNgLiAqLwogIGludCBjZWlsKCk7CgogIC8qKiBSZXR1cm5zIGB0aGlzYC4gKi8KICBpbnQgdHJ1bmNhdGUoKTsKCiAgLyoqIFJldHVybnMgYHRoaXMudG9Eb3VibGUoKWAuICovCiAgZG91YmxlIHJvdW5kVG9Eb3VibGUoKTsKCiAgLyoqIFJldHVybnMgYHRoaXMudG9Eb3VibGUoKWAuICovCiAgZG91YmxlIGZsb29yVG9Eb3VibGUoKTsKCiAgLyoqIFJldHVybnMgYHRoaXMudG9Eb3VibGUoKWAuICovCiAgZG91YmxlIGNlaWxUb0RvdWJsZSgpOwoKICAvKiogUmV0dXJucyBgdGhpcy50b0RvdWJsZSgpYC4gKi8KICBkb3VibGUgdHJ1bmNhdGVUb0RvdWJsZSgpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgaW50ZWdlci4KICAgKgogICAqIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgcGFyc2FibGUgYnkgW3BhcnNlXS4KICAgKiBGb3IgYW55IGBpbnRgIGBpYCwgaXQgaXMgZ3VhcmFudGVlZCB0aGF0CiAgICogYGkgPT0gaW50LnBhcnNlKGkudG9TdHJpbmcoKSlgLgogICAqLwogIFN0cmluZyB0b1N0cmluZygpOwoKICAvKioKICAgKiBDb252ZXJ0cyBbdGhpc10gdG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gaW4gdGhlIGdpdmVuIFtyYWRpeF0uCiAgICoKICAgKiBJbiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLCBsb3dlci1jYXNlIGxldHRlcnMgYXJlIHVzZWQgZm9yIGRpZ2l0cyBhYm92ZQogICAqICc5Jywgd2l0aCAnYScgYmVpbmcgMTAgYW4gJ3onIGJlaW5nIDM1LgogICAqCiAgICogVGhlIFtyYWRpeF0gYXJndW1lbnQgbXVzdCBiZSBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSAyIHRvIDM2LgogICAqLwogIFN0cmluZyB0b1JhZGl4U3RyaW5nKGludCByYWRpeCk7CgogIC8qKgogICAqIFBhcnNlIFtzb3VyY2VdIGFzIGEsIHBvc3NpYmx5IHNpZ25lZCwgaW50ZWdlciBsaXRlcmFsIGFuZCByZXR1cm4gaXRzIHZhbHVlLgogICAqCiAgICogVGhlIFtzb3VyY2VdIG11c3QgYmUgYSBub24tZW1wdHkgc2VxdWVuY2Ugb2YgYmFzZS1bcmFkaXhdIGRpZ2l0cywKICAgKiBvcHRpb25hbGx5IHByZWZpeGVkIHdpdGggYSBtaW51cyBvciBwbHVzIHNpZ24gKCctJyBvciAnKycpLgogICAqIEl0IG11c3Qgbm90IGJlIGBudWxsYC4KICAgKgogICAqIFRoZSBbcmFkaXhdIG11c3QgYmUgaW4gdGhlIHJhbmdlIDIuLjM2LiBUaGUgZGlnaXRzIHVzZWQgYXJlCiAgICogZmlyc3QgdGhlIGRlY2ltYWwgZGlnaXRzIDAuLjksIGFuZCB0aGVuIHRoZSBsZXR0ZXJzICdhJy4uJ3onIHdpdGgKICAgKiB2YWx1ZXMgMTAgdGhyb3VnaCAzNS4gQWxzbyBhY2NlcHRzIHVwcGVyLWNhc2UgbGV0dGVycyB3aXRoIHRoZSBzYW1lCiAgICogdmFsdWVzIGFzIHRoZSBsb3dlci1jYXNlIG9uZXMuCiAgICoKICAgKiBJZiBubyBbcmFkaXhdIGlzIGdpdmVuIHRoZW4gaXQgZGVmYXVsdHMgdG8gMTAuIEluIHRoaXMgY2FzZSwgdGhlIFtzb3VyY2VdCiAgICogZGlnaXRzIG1heSBhbHNvIHN0YXJ0IHdpdGggYDB4YCwgaW4gd2hpY2ggY2FzZSB0aGUgbnVtYmVyIGlzIGludGVycHJldGVkCiAgICogYXMgYSBoZXhhZGVjaW1hbCBpbnRlZ2VyIGxpdGVyYWwsCiAgICogV2hlbiBgaW50YCBpcyBpbXBsZW1lbnRlZCBieSA2NC1iaXQgc2lnbmVkIGludGVnZXJzLAogICAqIGhleGFkZWNpbWFsIGludGVnZXIgbGl0ZXJhbHMgbWF5IHJlcHJlc2VudCB2YWx1ZXMgbGFyZ2VyIHRoYW4KICAgKiAyPHN1cD42Mzwvc3VwPiwgaW4gd2hpY2ggY2FzZSB0aGUgdmFsdWUgaXMgcGFyc2VkIGFzIGlmIGl0IGlzIGFuCiAgICogKnVuc2lnbmVkKiBudW1iZXIsIGFuZCB0aGUgcmVzdWx0aW5nIHZhbHVlIGlzIHRoZSBjb3JyZXNwb25kaW5nCiAgICogc2lnbmVkIGludGVnZXIgdmFsdWUuCiAgICoKICAgKiBGb3IgYW55IGludCBgbmAgYW5kIHZhbGlkIHJhZGl4IGByYCwgaXQgaXMgZ3VhcmFudGVlZCB0aGF0CiAgICogYG4gPT0gaW50LnBhcnNlKG4udG9SYWRpeFN0cmluZyhyKSwgcmFkaXg6IHIpYC4KICAgKgogICAqIElmIHRoZSBbc291cmNlXSBzdHJpbmcgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGludGVnZXIgbGl0ZXJhbCwKICAgKiBvcHRpb25hbGx5IHByZWZpeGVkIGJ5IGEgc2lnbiwgYSBbRm9ybWF0RXhjZXB0aW9uXSBpcyB0aHJvd24KICAgKiAodW5sZXNzIHRoZSBkZXByZWNhdGVkIFtvbkVycm9yXSBwYXJhbWV0ZXIgaXMgdXNlZCwgc2VlIGJlbG93KS4KICAgKgogICAqIEluc3RlYWQgb2YgdGhyb3dpbmcgYW5kIGltbWVkaWF0ZWx5IGNhdGNoaW5nIHRoZSBbRm9ybWF0RXhjZXB0aW9uXSwKICAgKiBpbnN0ZWFkIHVzZSBbdHJ5UGFyc2VdIHRvIGhhbmRsZSBhIHBhcnNpbmcgZXJyb3IuCiAgICogRXhhbXBsZToKICAgKiBgYGBkYXJ0CiAgICogdmFyIHZhbHVlID0gaW50LnRyeVBhcnNlKHRleHQpOwogICAqIGlmICh2YWx1ZSA9PSBudWxsKSAuLi4gaGFuZGxlIHRoZSBwcm9ibGVtCiAgICogYGBgCiAgICoKICAgKiBUaGUgW29uRXJyb3JdIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQuCiAgICogSW5zdGVhZCBvZiBgaW50LnBhcnNlKHN0cmluZywgb25FcnJvcjogKHN0cmluZykgPT4gLi4uKWAsCiAgICogeW91IHNob3VsZCB1c2UgYGludC50cnlQYXJzZShzdHJpbmcpID8/ICguLi4pYC4KICAgKgogICAqIFdoZW4gdGhlIHNvdXJjZSBzdHJpbmcgaXMgbm90IHZhbGlkIGFuZCBbb25FcnJvcl0gaXMgcHJvdmlkZWQsCiAgICogd2hlbmV2ZXIgYSBbRm9ybWF0RXhjZXB0aW9uXSB3b3VsZCBiZSB0aHJvd24sCiAgICogW29uRXJyb3JdIGlzIGluc3RlYWQgY2FsbGVkIHdpdGggW3NvdXJjZV0gYXMgYXJndW1lbnQsCiAgICogYW5kIHRoZSByZXN1bHQgb2YgdGhhdCBjYWxsIGlzIHJldHVybmVkIGJ5IFtwYXJzZV0uCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIGludCBwYXJzZShTdHJpbmcgc291cmNlLAogICAgICB7aW50IHJhZGl4LCBAZGVwcmVjYXRlZCBpbnQgb25FcnJvcihTdHJpbmcgc291cmNlKX0pOwoKICAvKioKICAgKiBQYXJzZSBbc291cmNlXSBhcyBhLCBwb3NzaWJseSBzaWduZWQsIGludGVnZXIgbGl0ZXJhbCBhbmQgcmV0dXJuIGl0cyB2YWx1ZS4KICAgKgogICAqIExpa2UgW3BhcnNlXSBleGNlcHQgdGhhdCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYG51bGxgIHdoZXJlIGEKICAgKiBzaW1pbGFyIGNhbGwgdG8gW3BhcnNlXSB3b3VsZCB0aHJvdyBhIFtGb3JtYXRFeGNlcHRpb25dLAogICAqIGFuZCB0aGUgW3NvdXJjZV0gbXVzdCBzdGlsbCBub3QgYmUgYG51bGxgLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBpbnQgdHJ5UGFyc2UoU3RyaW5nIHNvdXJjZSwge2ludCByYWRpeH0pOwp9CoFlAE5OPAETAQQWA0s4A01OTU8OOkdNPAM2BCEGTAU1CUgZCQ4JQAkGTExQIigaTwEGHAVMTR0FRiEGHQEGGwVMTxsFRCcGHQEGJQVMTSkFRScGHQEGIwVGOAUsBhQBBkIFSykFSEsLBTIGJAEGQwVIQBoFMgYkAQZHBT8PBikBBkAXBSUFMgYfAQZGBUovBT42BTMFQgYWATsTAToSAQZIBU5OTgVNKgklBScnJycnJycnCQYVAQZFUTUJOglRMgkgCUYFTVAiCSUJBh0BBk9RUFEFCTI2NjIJUTkJHglODAVPUSAJJwkGGwEGMAVMKgYUAQYxBUYGDQEGJwU6JgYQARkPARkPARkOARkSASQaASQaASQZASQdAQY2BTEuJQYVAQZGBVAtBUMGIwEGUQVHQRwFQUdJJAVPTic6Q0ZFGwVANQVGQkUFSTcODSUvCQVAPzUFRDM8OQYrPAEGUQVDPjAGPAIBEmRhcnQ6Y29yZS9pbnQuZGFydDNvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2ludGVnZXJzX3BhdGNoLmRhcnSsIy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb3JlX3BhdGNoLmRhcnQiOwoKLy8vIFZNIGltcGxlbWVudGF0aW9uIG9mIGludC4KQHBhdGNoCmNsYXNzIGludCB7CiAgQHBhdGNoCiAgY29uc3QgZmFjdG9yeSBpbnQuZnJvbUVudmlyb25tZW50KFN0cmluZyBuYW1lLCB7aW50IGRlZmF1bHRWYWx1ZX0pCiAgICAgIG5hdGl2ZSAiSW50ZWdlcl9mcm9tRW52aXJvbm1lbnQiOwoKICBpbnQgX2JpdEFuZEZyb21TbWkoX1NtaSBvdGhlcik7CiAgaW50IF9iaXRBbmRGcm9tSW50ZWdlcihpbnQgb3RoZXIpOwogIGludCBfYml0T3JGcm9tSW50ZWdlcihpbnQgb3RoZXIpOwogIGludCBfYml0WG9yRnJvbUludGVnZXIoaW50IG90aGVyKTsKICBpbnQgX3NockZyb21JbnRlZ2VyKGludCBvdGhlcik7CiAgaW50IF9zaGxGcm9tSW50ZWdlcihpbnQgb3RoZXIpOwoKICBzdGF0aWMgaW50IF90cnlQYXJzZVNtaShTdHJpbmcgc3RyLCBpbnQgZmlyc3QsIGludCBsYXN0KSB7CiAgICBhc3NlcnQoZmlyc3QgPD0gbGFzdCk7CiAgICB2YXIgaXggPSBmaXJzdDsKICAgIHZhciBzaWduID0gMTsKICAgIHZhciBjID0gc3RyLmNvZGVVbml0QXQoaXgpOwogICAgLy8gQ2hlY2sgZm9yIGxlYWRpbmcgJysnIG9yICctJy4KICAgIGlmICgoYyA9PSAweDJiKSB8fCAoYyA9PSAweDJkKSkgewogICAgICBpeCsrOwogICAgICBzaWduID0gMHgyYyAtIGM7IC8vIC0xIGZvciAnLScsICsxIGZvciAnKycuCiAgICAgIGlmIChpeCA+IGxhc3QpIHsKICAgICAgICByZXR1cm4gbnVsbDsgLy8gRW1wdHkuCiAgICAgIH0KICAgIH0KICAgIHZhciBzbWlMaW1pdCA9IGlzNjRCaXQgPyAxOCA6IDk7CiAgICBpZiAoKGxhc3QgLSBpeCkgPj0gc21pTGltaXQpIHsKICAgICAgcmV0dXJuIG51bGw7IC8vIE1heSBub3QgZml0IGludG8gYSBTbWkuCiAgICB9CiAgICB2YXIgcmVzdWx0ID0gMDsKICAgIGZvciAoaW50IGkgPSBpeDsgaSA8PSBsYXN0OyBpKyspIHsKICAgICAgdmFyIGMgPSAweDMwIF4gc3RyLmNvZGVVbml0QXQoaSk7CiAgICAgIGlmICg5IDwgYykgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHJlc3VsdCA9IDEwICogcmVzdWx0ICsgYzsKICAgIH0KICAgIHJldHVybiBzaWduICogcmVzdWx0OwogIH0KCiAgQHBhdGNoCiAgc3RhdGljIGludCBwYXJzZShTdHJpbmcgc291cmNlLCB7aW50IHJhZGl4LCBpbnQgb25FcnJvcihTdHJpbmcgc291cmNlKX0pIHsKICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIlRoZSBzb3VyY2UgbXVzdCBub3QgYmUgbnVsbCIpOwogICAgaWYgKHNvdXJjZS5pc0VtcHR5KSB7CiAgICAgIHJldHVybiBfdGhyb3dGb3JtYXRFeGNlcHRpb24ob25FcnJvciwgc291cmNlLCAwLCByYWRpeCwgbnVsbCk7CiAgICB9CiAgICBpZiAocmFkaXggPT0gbnVsbCB8fCByYWRpeCA9PSAxMCkgewogICAgICAvLyBUcnkgcGFyc2luZyBpbW1lZGlhdGVseSwgd2l0aG91dCB0cmltbWluZyB3aGl0ZXNwYWNlLgogICAgICBpbnQgcmVzdWx0ID0gX3RyeVBhcnNlU21pKHNvdXJjZSwgMCwgc291cmNlLmxlbmd0aCAtIDEpOwogICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHJldHVybiByZXN1bHQ7CiAgICB9IGVsc2UgaWYgKHJhZGl4IDwgMiB8fCByYWRpeCA+IDM2KSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJSYWRpeCAkcmFkaXggbm90IGluIHJhbmdlIDIuLjM2Iik7CiAgICB9CiAgICAvLyBTcGxpdCBoZXJlIHNvIGltcHJvdmUgb2RkcyBvZiBwYXJzZSBiZWluZyBpbmxpbmVkIGFuZCB0aGUgY2hlY2tzIG9taXR0ZWQuCiAgICByZXR1cm4gX3BhcnNlKHNvdXJjZSwgcmFkaXgsIG9uRXJyb3IpOwogIH0KCiAgc3RhdGljIGludCBfcGFyc2UoX1N0cmluZ0Jhc2Ugc291cmNlLCBpbnQgcmFkaXgsIG9uRXJyb3IpIHsKICAgIGludCBlbmQgPSBzb3VyY2UuX2xhc3ROb25XaGl0ZXNwYWNlKCkgKyAxOwogICAgaWYgKGVuZCA9PSAwKSB7CiAgICAgIHJldHVybiBfdGhyb3dGb3JtYXRFeGNlcHRpb24ob25FcnJvciwgc291cmNlLCBzb3VyY2UubGVuZ3RoLCByYWRpeCwgbnVsbCk7CiAgICB9CiAgICBpbnQgc3RhcnQgPSBzb3VyY2UuX2ZpcnN0Tm9uV2hpdGVzcGFjZSgpOwoKICAgIGludCBmaXJzdCA9IHNvdXJjZS5jb2RlVW5pdEF0KHN0YXJ0KTsKICAgIGludCBzaWduID0gMTsKICAgIGlmIChmaXJzdCA9PSAweDJiIC8qICsgKi8gfHwgZmlyc3QgPT0gMHgyZCAvKiAtICovKSB7CiAgICAgIHNpZ24gPSAweDJjIC0gZmlyc3Q7IC8vIC0xIGlmICctJywgKzEgaWYgJysnLgogICAgICBzdGFydCsrOwogICAgICBpZiAoc3RhcnQgPT0gZW5kKSB7CiAgICAgICAgcmV0dXJuIF90aHJvd0Zvcm1hdEV4Y2VwdGlvbihvbkVycm9yLCBzb3VyY2UsIGVuZCwgcmFkaXgsIG51bGwpOwogICAgICB9CiAgICAgIGZpcnN0ID0gc291cmNlLmNvZGVVbml0QXQoc3RhcnQpOwogICAgfQogICAgaWYgKHJhZGl4ID09IG51bGwpIHsKICAgICAgLy8gY2hlY2sgZm9yIDB4IHByZWZpeC4KICAgICAgaW50IGluZGV4ID0gc3RhcnQ7CiAgICAgIGlmIChmaXJzdCA9PSAweDMwIC8qIDAgKi8pIHsKICAgICAgICBpbmRleCsrOwogICAgICAgIGlmIChpbmRleCA9PSBlbmQpIHJldHVybiAwOwogICAgICAgIGZpcnN0ID0gc291cmNlLmNvZGVVbml0QXQoaW5kZXgpOwogICAgICAgIGlmICgoZmlyc3QgfCAweDIwKSA9PSAweDc4IC8qIHggKi8pIHsKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICBpZiAoaW5kZXggPT0gZW5kKSB7CiAgICAgICAgICAgIHJldHVybiBfdGhyb3dGb3JtYXRFeGNlcHRpb24ob25FcnJvciwgc291cmNlLCBpbmRleCwgbnVsbCwgbnVsbCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gX3BhcnNlUmFkaXgoc291cmNlLCAxNiwgaW5kZXgsIGVuZCwgc2lnbiwgc2lnbiA+IDAsIG9uRXJyb3IpOwogICAgICAgIH0KICAgICAgfQogICAgICByYWRpeCA9IDEwOwogICAgfQogICAgcmV0dXJuIF9wYXJzZVJhZGl4KHNvdXJjZSwgcmFkaXgsIHN0YXJ0LCBlbmQsIHNpZ24sIGZhbHNlLCBvbkVycm9yKTsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBpbnQgdHJ5UGFyc2UoU3RyaW5nIHNvdXJjZSwge2ludCByYWRpeH0pIHsKICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIlRoZSBzb3VyY2UgbXVzdCBub3QgYmUgbnVsbCIpOwogICAgaWYgKHNvdXJjZS5pc0VtcHR5KSByZXR1cm4gbnVsbDsKICAgIGlmIChyYWRpeCA9PSBudWxsIHx8IHJhZGl4ID09IDEwKSB7CiAgICAgIC8vIFRyeSBwYXJzaW5nIGltbWVkaWF0ZWx5LCB3aXRob3V0IHRyaW1taW5nIHdoaXRlc3BhY2UuCiAgICAgIGludCByZXN1bHQgPSBfdHJ5UGFyc2VTbWkoc291cmNlLCAwLCBzb3VyY2UubGVuZ3RoIC0gMSk7CiAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgcmV0dXJuIHJlc3VsdDsKICAgIH0gZWxzZSBpZiAocmFkaXggPCAyIHx8IHJhZGl4ID4gMzYpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlJhZGl4ICRyYWRpeCBub3QgaW4gcmFuZ2UgMi4uMzYiKTsKICAgIH0KICAgIHRyeSB7CiAgICAgIHJldHVybiBfcGFyc2Uoc291cmNlLCByYWRpeCwgX2tOdWxsKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICBzdGF0aWMgTnVsbCBfa051bGwoXykgPT4gbnVsbDsKCiAgc3RhdGljIGludCBfdGhyb3dGb3JtYXRFeGNlcHRpb24ob25FcnJvciwgc291cmNlLCBpbmRleCwgcmFkaXgsIG1lc3NhZ2UpIHsKICAgIGlmIChvbkVycm9yICE9IG51bGwpIHJldHVybiBvbkVycm9yKHNvdXJjZSk7CiAgICBpZiAobWVzc2FnZSAhPSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24obWVzc2FnZSwgc291cmNlLCBpbmRleCk7CiAgICB9CiAgICBpZiAocmFkaXggPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKCJJbnZhbGlkIG51bWJlciIsIHNvdXJjZSwgaW5kZXgpOwogICAgfQogICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCByYWRpeC0kcmFkaXggbnVtYmVyIiwgc291cmNlLCBpbmRleCk7CiAgfQoKICBzdGF0aWMgaW50IF9wYXJzZVJhZGl4KFN0cmluZyBzb3VyY2UsIGludCByYWRpeCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgc2lnbiwKICAgICAgYm9vbCBhbGxvd1U2NCwgb25FcnJvcikgewogICAgaW50IHRhYmxlSW5kZXggPSAocmFkaXggLSAyKSAqIDQgKyAoaXM2NEJpdCA/IDIgOiAwKTsKICAgIGludCBibG9ja1NpemUgPSBfUEFSU0VfTElNSVRTW3RhYmxlSW5kZXhdOwogICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKGxlbmd0aCA8PSBibG9ja1NpemUpIHsKICAgICAgX1NtaSBzbWkgPSBfcGFyc2VCbG9jayhzb3VyY2UsIHJhZGl4LCBzdGFydCwgZW5kKTsKICAgICAgaWYgKHNtaSA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIF90aHJvd0Zvcm1hdEV4Y2VwdGlvbihvbkVycm9yLCBzb3VyY2UsIHN0YXJ0LCByYWRpeCwgbnVsbCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHNpZ24gKiBzbWk7CiAgICB9CgogICAgLy8gT2Z0ZW4gY2hlYXBlciB0aGFuOiBpbnQgc21hbGxCbG9ja1NpemUgPSBsZW5ndGggJSBibG9ja1NpemU7CiAgICAvLyBiZWNhdXNlIGRpZ2l0IGNvdW50IGdlbmVyYWxseSB0ZW5kcyB0b3dhcmRzIHNtYWxsZXIuIHJhdGhlcgogICAgLy8gdGhhbiBsYXJnZXIuCiAgICBpbnQgc21hbGxCbG9ja1NpemUgPSBsZW5ndGg7CiAgICB3aGlsZSAoc21hbGxCbG9ja1NpemUgPj0gYmxvY2tTaXplKSBzbWFsbEJsb2NrU2l6ZSAtPSBibG9ja1NpemU7CiAgICBpbnQgcmVzdWx0ID0gMDsKICAgIGlmIChzbWFsbEJsb2NrU2l6ZSA+IDApIHsKICAgICAgaW50IGJsb2NrRW5kID0gc3RhcnQgKyBzbWFsbEJsb2NrU2l6ZTsKICAgICAgX1NtaSBzbWkgPSBfcGFyc2VCbG9jayhzb3VyY2UsIHJhZGl4LCBzdGFydCwgYmxvY2tFbmQpOwogICAgICBpZiAoc21pID09IG51bGwpIHsKICAgICAgICByZXR1cm4gX3Rocm93Rm9ybWF0RXhjZXB0aW9uKG9uRXJyb3IsIHNvdXJjZSwgc3RhcnQsIHJhZGl4LCBudWxsKTsKICAgICAgfQogICAgICByZXN1bHQgPSBzaWduICogc21pOwogICAgICBzdGFydCA9IGJsb2NrRW5kOwogICAgfQogICAgaW50IG11bHRpcGxpZXIgPSBfUEFSU0VfTElNSVRTW3RhYmxlSW5kZXggKyAxXTsKICAgIGludCBwb3NpdGl2ZU92ZXJmbG93TGltaXQgPSAwOwogICAgaW50IG5lZ2F0aXZlT3ZlcmZsb3dMaW1pdCA9IDA7CiAgICB0YWJsZUluZGV4ID0gdGFibGVJbmRleCA8PCAxOyAvLyBwcmUtbXVsdGlwbHkgYnkgMiBmb3Igc2ltcGxlciBpbmRleGluZwogICAgcG9zaXRpdmVPdmVyZmxvd0xpbWl0ID0gX2ludDY0T3ZlcmZsb3dMaW1pdHNbdGFibGVJbmRleF07CiAgICBpZiAocG9zaXRpdmVPdmVyZmxvd0xpbWl0ID09IDApIHsKICAgICAgcG9zaXRpdmVPdmVyZmxvd0xpbWl0ID0gX2luaXRJbnQ2NE92ZXJmbG93TGltaXRzKHRhYmxlSW5kZXgsIG11bHRpcGxpZXIpOwogICAgfQogICAgbmVnYXRpdmVPdmVyZmxvd0xpbWl0ID0gX2ludDY0T3ZlcmZsb3dMaW1pdHNbdGFibGVJbmRleCArIDFdOwogICAgaW50IGJsb2NrRW5kID0gc3RhcnQgKyBibG9ja1NpemU7CiAgICBkbyB7CiAgICAgIF9TbWkgc21pID0gX3BhcnNlQmxvY2soc291cmNlLCByYWRpeCwgc3RhcnQsIGJsb2NrRW5kKTsKICAgICAgaWYgKHNtaSA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIF90aHJvd0Zvcm1hdEV4Y2VwdGlvbihvbkVycm9yLCBzb3VyY2UsIHN0YXJ0LCByYWRpeCwgbnVsbCk7CiAgICAgIH0KICAgICAgaWYgKHJlc3VsdCA+PSBwb3NpdGl2ZU92ZXJmbG93TGltaXQpIHsKICAgICAgICBpZiAoKHJlc3VsdCA+IHBvc2l0aXZlT3ZlcmZsb3dMaW1pdCkgfHwKICAgICAgICAgICAgKHNtaSA+IF9pbnQ2NE92ZXJmbG93TGltaXRzW3RhYmxlSW5kZXggKyAyXSkpIHsKICAgICAgICAgIC8vIEFsdGhvdWdoIHRoZSB1bnNpZ25lZCBvdmVyZmxvdyBsaW1pdHMgZG8gbm90IGRlcGVuZCBvbiB0aGUKICAgICAgICAgIC8vIHBsYXRmb3JtLCB0aGUgbXVsdGlwbGllciBhbmQgYmxvY2sgc2l6ZSwgd2hpY2ggYXJlIHVzZWQgdG8KICAgICAgICAgIC8vIGNvbXB1dGUgaXQsIGRvLgogICAgICAgICAgaW50IFggPSBpczY0Qml0ID8gMSA6IDA7CiAgICAgICAgICBpZiAoYWxsb3dVNjQgJiYKICAgICAgICAgICAgICAhKHJlc3VsdCA+PSBfaW50NjRVbnNpZ25lZE92ZXJmbG93TGltaXRzW1hdICYmCiAgICAgICAgICAgICAgICAgIChyZXN1bHQgPiBfaW50NjRVbnNpZ25lZE92ZXJmbG93TGltaXRzW1hdIHx8CiAgICAgICAgICAgICAgICAgICAgICBzbWkgPiBfaW50NjRVbnNpZ25lZFNtaU92ZXJmbG93TGltaXRzW1hdKSkgJiYKICAgICAgICAgICAgICBibG9ja0VuZCArIGJsb2NrU2l6ZSA+IGVuZCkgewogICAgICAgICAgICByZXR1cm4gKHJlc3VsdCAqIG11bHRpcGxpZXIpICsgc21pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIF90aHJvd0Zvcm1hdEV4Y2VwdGlvbihvbkVycm9yLCBzb3VyY2UsIG51bGwsIHJhZGl4LAogICAgICAgICAgICAgICJQb3NpdGl2ZSBpbnB1dCBleGNlZWRzIHRoZSBsaW1pdCBvZiBpbnRlZ2VyIik7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHJlc3VsdCA8PSBuZWdhdGl2ZU92ZXJmbG93TGltaXQpIHsKICAgICAgICBpZiAoKHJlc3VsdCA8IG5lZ2F0aXZlT3ZlcmZsb3dMaW1pdCkgfHwKICAgICAgICAgICAgKHNtaSA+IF9pbnQ2NE92ZXJmbG93TGltaXRzW3RhYmxlSW5kZXggKyAzXSkpIHsKICAgICAgICAgIHJldHVybiBfdGhyb3dGb3JtYXRFeGNlcHRpb24ob25FcnJvciwgc291cmNlLCBudWxsLCByYWRpeCwKICAgICAgICAgICAgICAiTmVnYXRpdmUgaW5wdXQgZXhjZWVkcyB0aGUgbGltaXQgb2YgaW50ZWdlciIpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXN1bHQgPSAocmVzdWx0ICogbXVsdGlwbGllcikgKyAoc2lnbiAqIHNtaSk7CiAgICAgIHN0YXJ0ID0gYmxvY2tFbmQ7CiAgICAgIGJsb2NrRW5kID0gc3RhcnQgKyBibG9ja1NpemU7CiAgICB9IHdoaWxlIChibG9ja0VuZCA8PSBlbmQpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIFBhcnNlIGJsb2NrIG9mIGRpZ2l0cyBpbnRvIGEgU21pLgogIHN0YXRpYyBfU21pIF9wYXJzZUJsb2NrKFN0cmluZyBzb3VyY2UsIGludCByYWRpeCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBfU21pIHJlc3VsdCA9IDA7CiAgICBpZiAocmFkaXggPD0gMTApIHsKICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgICBpbnQgZGlnaXQgPSBzb3VyY2UuY29kZVVuaXRBdChpKSBeIDB4MzA7CiAgICAgICAgaWYgKGRpZ2l0ID49IHJhZGl4KSByZXR1cm4gbnVsbDsKICAgICAgICByZXN1bHQgPSByYWRpeCAqIHJlc3VsdCArIGRpZ2l0OwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICAgIGludCBjaGFyID0gc291cmNlLmNvZGVVbml0QXQoaSk7CiAgICAgICAgaW50IGRpZ2l0ID0gY2hhciBeIDB4MzA7CiAgICAgICAgaWYgKGRpZ2l0ID4gOSkgewogICAgICAgICAgZGlnaXQgPSAoY2hhciB8IDB4MjApIC0gKDB4NjEgLSAxMCk7CiAgICAgICAgICBpZiAoZGlnaXQgPCAxMCB8fCBkaWdpdCA+PSByYWRpeCkgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IHJhZGl4ICogcmVzdWx0ICsgZGlnaXQ7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLyBGb3IgZWFjaCByYWRpeCwgMi0zNiwgaG93IG1hbnkgZGlnaXRzIGFyZSBndWFyYW50ZWVkIHRvIGZpdCBpbiBhIHNtaSwKICAvLyBhbmQgbWFnbml0dWRlIG9mIHN1Y2ggYSBibG9jayAocmFkaXggKiogZGlnaXQtY291bnQpLgogIC8vIDMyLWJpdCBsaW1pdC9tdWx0aXBsaWVyIGF0IChyYWRpeCAtIDIpKjQsIDY0LWJpdCBsaW1pdCBhdCAocmFkaXgtMikqNCsyCiAgc3RhdGljIGNvbnN0IF9QQVJTRV9MSU1JVFMgPSBjb25zdCBbCiAgICAzMCwgMTA3Mzc0MTgyNCwgNjIsIDQ2MTE2ODYwMTg0MjczODc5MDQsIC8vIHJhZGl4OiAyCiAgICAxOCwgMzg3NDIwNDg5LCAzOSwgNDA1MjU1NTE1MzAxODk3NjI2NywKICAgIDE1LCAxMDczNzQxODI0LCAzMCwgMTE1MjkyMTUwNDYwNjg0Njk3NiwKICAgIDEyLCAyNDQxNDA2MjUsIDI2LCAxNDkwMTE2MTE5Mzg0NzY1NjI1LCAvLyAgcmFkaXg6IDUKICAgIDExLCAzNjI3OTcwNTYsIDIzLCA3ODk3MzAyMjMwNTM2MDI4MTYsCiAgICAxMCwgMjgyNDc1MjQ5LCAyMiwgMzkwOTgyMTA0ODU4Mjk4ODA0OSwKICAgIDEwLCAxMDczNzQxODI0LCAyMCwgMTE1MjkyMTUwNDYwNjg0Njk3NiwKICAgIDksIDM4NzQyMDQ4OSwgMTksIDEzNTA4NTE3MTc2NzI5OTIwODksCiAgICA5LCAxMDAwMDAwMDAwLCAxOCwgMTAwMDAwMDAwMDAwMDAwMDAwMCwgLy8gIHJhZGl4OiAxMAogICAgOCwgMjE0MzU4ODgxLCAxNywgNTA1NDQ3MDI4NDk5MjkzNzcxLAogICAgOCwgNDI5OTgxNjk2LCAxNywgMjIxODYxMTEwNjc0MDQzNjk5MiwKICAgIDgsIDgxNTczMDcyMSwgMTYsIDY2NTQxNjYwOTE4MzE3OTg0MSwKICAgIDcsIDEwNTQxMzUwNCwgMTYsIDIxNzc5NTMzMzc4MDkzNzExMzYsCiAgICA3LCAxNzA4NTkzNzUsIDE1LCA0Mzc4OTM4OTAzODA4NTkzNzUsIC8vICAgIHJhZGl4OiAxNQogICAgNywgMjY4NDM1NDU2LCAxNSwgMTE1MjkyMTUwNDYwNjg0Njk3NiwKICAgIDcsIDQxMDMzODY3MywgMTUsIDI4NjI0MjMwNTE1MDk4MTU3OTMsCiAgICA3LCA2MTIyMjAwMzIsIDE0LCAzNzQ4MTMzNjc1ODIwODEwMjQsCiAgICA3LCA4OTM4NzE3MzksIDE0LCA3OTkwMDY2ODU3ODI4ODQxMjEsCiAgICA2LCA2NDAwMDAwMCwgMTQsIDE2Mzg0MDAwMDAwMDAwMDAwMDAsIC8vICAgIHJhZGl4OiAyMAogICAgNiwgODU3NjYxMjEsIDE0LCAzMjQzOTE5OTMyNTIxNTA4NjgxLAogICAgNiwgMTEzMzc5OTA0LCAxMywgMjgyODEwMDU3ODgzMDgyNzUyLAogICAgNiwgMTQ4MDM1ODg5LCAxMywgNTA0MDM2MzYxOTM2NDY3MzgzLAogICAgNiwgMTkxMTAyOTc2LCAxMywgODc2NDg4MzM4NDY1MzU3ODI0LAogICAgNiwgMjQ0MTQwNjI1LCAxMywgMTQ5MDExNjExOTM4NDc2NTYyNSwgLy8gICByYWRpeDogMjUKICAgIDYsIDMwODkxNTc3NiwgMTMsIDI0ODExNTI4NzMyMDM3MzY1NzYsCiAgICA2LCAzODc0MjA0ODksIDEzLCA0MDUyNTU1MTUzMDE4OTc2MjY3LAogICAgNiwgNDgxODkwMzA0LCAxMiwgMjMyMjE4MjY1MDg5MjEyNDE2LAogICAgNiwgNTk0ODIzMzIxLCAxMiwgMzUzODE0NzgzMjA1NDY5MDQxLAogICAgNiwgNzI5MDAwMDAwLCAxMiwgNTMxNDQxMDAwMDAwMDAwMDAwLCAvLyAgICByYWRpeDogMzAKICAgIDYsIDg4NzUwMzY4MSwgMTIsIDc4NzY2Mjc4Mzc4ODU0OTc2MSwKICAgIDYsIDEwNzM3NDE4MjQsIDEyLCAxMTUyOTIxNTA0NjA2ODQ2OTc2LAogICAgNSwgMzkxMzUzOTMsIDEyLCAxNjY3ODg5NTE0OTUyOTg0OTYxLAogICAgNSwgNDU0MzU0MjQsIDEyLCAyMzg2NDIwNjgzNjkzMTAxMDU2LAogICAgNSwgNTI1MjE4NzUsIDEyLCAzMzc5MjIwNTA4MDU2NjQwNjI1LCAvLyAgICByYWRpeDogMzUKICAgIDUsIDYwNDY2MTc2LCAxMSwgMTMxNjIxNzAzODQyMjY3MTM2LAogIF07CgogIHN0YXRpYyBjb25zdCBfbWF4SW50NjQgPSAweDdmZmZmZmZmZmZmZmZmZmY7CiAgc3RhdGljIGNvbnN0IF9taW5JbnQ2NCA9IC0weDgwMDAwMDAwMDAwMDAwMDA7CgogIHN0YXRpYyBjb25zdCBfaW50NjRVbnNpZ25lZE92ZXJmbG93TGltaXRzID0gY29uc3QgWzB4ZmZmZmZmZmZmLCAweGZdOwogIHN0YXRpYyBjb25zdCBfaW50NjRVbnNpZ25lZFNtaU92ZXJmbG93TGltaXRzID0gY29uc3QgWwogICAgMHhmZmZmZmZmLAogICAgMHhmZmZmZmZmZmZmZmZmZmYKICBdOwoKICAvLy8gQ2FsY3VsYXRpb24gb2YgdGhlIGV4cHJlc3Npb24KICAvLy8KICAvLy8gICByZXN1bHQgPSAocmVzdWx0ICogbXVsdGlwbGllcikgKyAoc2lnbiAqIHNtaSkKICAvLy8KICAvLy8gaW4gYF9wYXJzZVJhZGl4KClgIG1heSBvdmVyZmxvdyA2NC1iaXQgaW50ZWdlcnMuIEluIHN1Y2ggY2FzZSwKICAvLy8gYGludC5wYXJzZSgpYCBzaG91bGQgc3RvcCB3aXRoIGFuIGVycm9yLgogIC8vLwogIC8vLyBUaGlzIHRhYmxlIGlzIGxhemlseSBmaWxsZWQgd2l0aCBpbnQ2NCBvdmVyZmxvdyBsaW1pdHMgZm9yIHJlc3VsdCBhbmQgc21pLgogIC8vLyBGb3IgZWFjaCBtdWx0aXBsaWVyIGZyb20gYF9QQVJTRV9MSU1JVFNbdGFibGVJbmRleCArIDFdYCB0aGlzIHRhYmxlCiAgLy8vIGNvbnRhaW5zCiAgLy8vCiAgLy8vICogYFt0YWJsZUluZGV4KjJdYCA9IHBvc2l0aXZlIGxpbWl0IGZvciByZXN1bHQKICAvLy8gKiBgW3RhYmxlSW5kZXgqMiArIDFdYCA9IG5lZ2F0aXZlIGxpbWl0IGZvciByZXN1bHQKICAvLy8gKiBgW3RhYmxlSW5kZXgqMiArIDJdYCA9IGxpbWl0IGZvciBzbWkgaWYgcmVzdWx0IGlzIGV4YWN0bHkgYXQgcG9zaXRpdmUgbGltaXQKICAvLy8gKiBgW3RhYmxlSW5kZXgqMiArIDNdYCA9IGxpbWl0IGZvciBzbWkgaWYgcmVzdWx0IGlzIGV4YWN0bHkgYXQgbmVnYXRpdmUgbGltaXQKICBzdGF0aWMgZmluYWwgSW50NjRMaXN0IF9pbnQ2NE92ZXJmbG93TGltaXRzID0KICAgICAgbmV3IEludDY0TGlzdChfUEFSU0VfTElNSVRTLmxlbmd0aCAqIDIpOwoKICBzdGF0aWMgaW50IF9pbml0SW50NjRPdmVyZmxvd0xpbWl0cyhpbnQgdGFibGVJbmRleCwgaW50IG11bHRpcGxpZXIpIHsKICAgIF9pbnQ2NE92ZXJmbG93TGltaXRzW3RhYmxlSW5kZXhdID0gX21heEludDY0IH4vIG11bHRpcGxpZXI7CiAgICBfaW50NjRPdmVyZmxvd0xpbWl0c1t0YWJsZUluZGV4ICsgMV0gPSBfbWluSW50NjQgfi8gbXVsdGlwbGllcjsKICAgIF9pbnQ2NE92ZXJmbG93TGltaXRzW3RhYmxlSW5kZXggKyAyXSA9IF9tYXhJbnQ2NC5yZW1haW5kZXIobXVsdGlwbGllcik7CiAgICBfaW50NjRPdmVyZmxvd0xpbWl0c1t0YWJsZUluZGV4ICsgM10gPSAtKF9taW5JbnQ2NC5yZW1haW5kZXIobXVsdGlwbGllcikpOwogICAgcmV0dXJuIF9pbnQ2NE92ZXJmbG93TGltaXRzW3RhYmxlSW5kZXhdOwogIH0KfQqBNABOTjwBHgEeBwwJRSgBIiUkJSIiAT0bFBIgJSYMMhcfCAYlIy4GFCcoExUIIAYaBAEJTVAaRQYoPz8pKj8GUSsEAT4vFFEGLgEqEjo0DxpJCCgGGR4ZIxEkKi4THk4MTwoIEgZJBAEJNFAlKD8/KSo/BgosEhMGBAEhAU0xGzkGGUIGTQQBUSA6Lx4fORlLCBkGAURDFCFFFB4tPhlLCBsYBjQjI0w+JlAGQiYJPhlLCC0wPEhIHSMaPT9ELDAMRT4KNDA8RT4KCDUYJB8TBAEnShUXKjEpKQgNKikhGS85CikIBhMEAUs7TSc5LC05KywtKzoqKyorOisrKio6KioqKjorKyoqOiosKio6KQUBLzABSDkPFgUBJAY2BkUvBlFKDwY1OVRUMC8BSEBETE8tBAIBI2RhcnQ6Y29yZS1wYXRjaC9pbnRlZ2Vyc19wYXRjaC5kYXJ0MG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL2ludm9jYXRpb24uZGFydJUXLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLyoqCiAqIFJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnZvY2F0aW9uIG9mIGEgbWVtYmVyIG9uIGFuIG9iamVjdC4KICoKICogVGhpcyBpcyB0aGUgdHlwZSBvZiBvYmplY3RzIHBhc3NlZCB0byBbT2JqZWN0Lm5vU3VjaE1ldGhvZF0gd2hlbgogKiBhbiBvYmplY3QgZG9lc24ndCBzdXBwb3J0IHRoZSBtZW1iZXIgaW52b2NhdGlvbiB0aGF0IHdhcyBhdHRlbXB0ZWQKICogb24gaXQuCiAqLwphYnN0cmFjdCBjbGFzcyBJbnZvY2F0aW9uIHsKICBJbnZvY2F0aW9uKCk7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gaW52b2NhdGlvbiBjb3JyZXNwb25kaW5nIHRvIGEgbWV0aG9kIGludm9jYXRpb24uCiAgICoKICAgKiBUaGUgbWV0aG9kIGludm9jYXRpb24gaGFzIG5vIHR5cGUgYXJndW1lbnRzLgogICAqIElmIHRoZSBuYW1lZCBhcmd1bWVudHMgYXJlIG9taXR0ZWQsIHRoZXkgZGVmYXVsdCB0byBubyBuYW1lZCBhcmd1bWVudHMuCiAgICovCiAgZmFjdG9yeSBJbnZvY2F0aW9uLm1ldGhvZCgKICAgICAgICAgIFN5bWJvbCBtZW1iZXJOYW1lLCBJdGVyYWJsZTxPYmplY3Q+IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgICAgICBbTWFwPFN5bWJvbCwgT2JqZWN0PiBuYW1lZEFyZ3VtZW50c10pID0+CiAgICAgIF9JbnZvY2F0aW9uLm1ldGhvZChtZW1iZXJOYW1lLCBudWxsLCBwb3NpdGlvbmFsQXJndW1lbnRzLCBuYW1lZEFyZ3VtZW50cyk7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gaW52b2NhdGlvbiBjb3JyZXNwb25kaW5nIHRvIGEgZ2VuZXJpYyBtZXRob2QgaW52b2NhdGlvbi4KICAgKgogICAqIElmIFt0eXBlQXJndW1lbnRzXSBpcyBgbnVsbGAgb3IgZW1wdHksIHRoZSBjb25zdHJ1Y3RvciBpcyBlcXVpdmFsZW50IHRvCiAgICogY2FsbGluZyBbSW52b2NhdGlvbi5tZXRob2RdIHdpdGggdGhlIHJlbWFpbmluZyBhcmd1bWVudHMuCiAgICogQWxsIHRoZSBpbmRpdmlkdWFsIHR5cGUgYXJndW1lbnRzIG11c3QgYmUgbm9uLW51bGwuCiAgICoKICAgKiBJZiB0aGUgbmFtZWQgYXJndW1lbnRzIGFyZSBvbWl0dGVkLCB0aGV5IGRlZmF1bHQgdG8gbm8gbmFtZWQgYXJndW1lbnRzLgogICAqLwogIGZhY3RvcnkgSW52b2NhdGlvbi5nZW5lcmljTWV0aG9kKFN5bWJvbCBtZW1iZXJOYW1lLAogICAgICAgICAgSXRlcmFibGU8VHlwZT4gdHlwZUFyZ3VtZW50cywgSXRlcmFibGU8T2JqZWN0PiBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICAgICAgW01hcDxTeW1ib2wsIE9iamVjdD4gbmFtZWRBcmd1bWVudHNdKSA9PgogICAgICBfSW52b2NhdGlvbi5tZXRob2QoCiAgICAgICAgICBtZW1iZXJOYW1lLCB0eXBlQXJndW1lbnRzLCBwb3NpdGlvbmFsQXJndW1lbnRzLCBuYW1lZEFyZ3VtZW50cyk7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gaW52b2NhdGlvbiBjb3JyZXNwb25kaW5nIHRvIGEgZ2V0dGVyIGludm9jYXRpb24uCiAgICovCiAgZmFjdG9yeSBJbnZvY2F0aW9uLmdldHRlcihTeW1ib2wgbmFtZSkgPSBfSW52b2NhdGlvbi5nZXR0ZXI7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gaW52b2NhdGlvbiBjb3JyZXNwb25kaW5nIHRvIGEgc2V0dGVyIGludm9jYXRpb24uCiAgICoKICAgKiBUaGlzIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW55IFtTeW1ib2xdIGFzIFttZW1iZXJOYW1lXSwgYnV0IHJlbWVtYmVyIHRoYXQKICAgKiAqYWN0dWFsIHNldHRlciBuYW1lcyogZW5kIGluIGA9YCwgc28gdGhlIGludm9jYXRpb24gY29ycmVzcG9uZGluZwogICAqIHRvIGBvYmplY3QubWVtYmVyID0gdmFsdWVgIGlzCiAgICogYGBgZGFydAogICAqIEludm9jYXRpb24uc2V0dGVyKGNvbnN0IFN5bWJvbCgibWVtYmVyPSIpLCB2YWx1ZSkKICAgKiBgYGAKICAgKi8KICBmYWN0b3J5IEludm9jYXRpb24uc2V0dGVyKFN5bWJvbCBtZW1iZXJOYW1lLCBPYmplY3QgYXJndW1lbnQpID0KICAgICAgX0ludm9jYXRpb24uc2V0dGVyOwoKICAvKiogVGhlIG5hbWUgb2YgdGhlIGludm9rZWQgbWVtYmVyLiAqLwogIFN5bWJvbCBnZXQgbWVtYmVyTmFtZTsKCiAgLyoqCiAgICogQW4gdW5tb2RpZmlhYmxlIHZpZXcgb2YgdGhlIHR5cGUgYXJndW1lbnRzIG9mIHRoZSBjYWxsLgogICAqCiAgICogSWYgdGhlIG1lbWJlciBpcyBhIGdldHRlciwgc2V0dGVyIG9yIG9wZXJhdG9yLAogICAqIHRoZSB0eXBlIGFyZ3VtZW50IGxpc3QgaXMgYWx3YXlzIGVtcHR5LgogICAqLwogIExpc3Q8VHlwZT4gZ2V0IHR5cGVBcmd1bWVudHMgPT4gY29uc3QgPFR5cGU+W107CgogIC8qKgogICAqIEFuIHVubW9kaWZpYWJsZSB2aWV3IG9mIHRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBvZiB0aGUgY2FsbC4KICAgKgogICAqIElmIHRoZSBtZW1iZXIgaXMgYSBnZXR0ZXIsIHRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBsaXN0IGlzCiAgICogYWx3YXlzIGVtcHR5LgogICAqLwogIExpc3Q8ZHluYW1pYz4gZ2V0IHBvc2l0aW9uYWxBcmd1bWVudHM7CgogIC8qKgogICAqIEFuIHVubW9kaWZpYWJsZSB2aWV3IG9mIHRoZSBuYW1lZCBhcmd1bWVudHMgb2YgdGhlIGNhbGwuCiAgICoKICAgKiBJZiB0aGUgbWVtYmVyIGlzIGEgZ2V0dGVyLCBzZXR0ZXIgb3Igb3BlcmF0b3IsCiAgICogdGhlIG5hbWVkIGFyZ3VtZW50cyBtYXAgaXMgYWx3YXlzIGVtcHR5LgogICAqLwogIE1hcDxTeW1ib2wsIGR5bmFtaWM+IGdldCBuYW1lZEFyZ3VtZW50czsKCiAgLyoqIFdoZXRoZXIgdGhlIGludm9jYXRpb24gd2FzIGEgbWV0aG9kIGNhbGwuICovCiAgYm9vbCBnZXQgaXNNZXRob2Q7CgogIC8qKgogICAqIFdoZXRoZXIgdGhlIGludm9jYXRpb24gd2FzIGEgZ2V0dGVyIGNhbGwuCiAgICogSWYgc28sIGFsbCB0aHJlZSB0eXBlcyBvZiBhcmd1bWVudHMgbGlzdHMgYXJlIGVtcHR5LgogICAqLwogIGJvb2wgZ2V0IGlzR2V0dGVyOwoKICAvKioKICAgKiBXaGV0aGVyIHRoZSBpbnZvY2F0aW9uIHdhcyBhIHNldHRlciBjYWxsLgogICAqCiAgICogSWYgc28sIFtwb3NpdGlvbmFsQXJndW1lbnRzXSBoYXMgZXhhY3RseSBvbmUgcG9zaXRpb25hbAogICAqIGFyZ3VtZW50LCBbbmFtZWRBcmd1bWVudHNdIGlzIGVtcHR5LCBhbmQgdHlwZUFyZ3VtZW50cyBpcwogICAqIGVtcHR5LgogICAqLwogIGJvb2wgZ2V0IGlzU2V0dGVyOwoKICAvKiogV2hldGhlciB0aGUgaW52b2NhdGlvbiB3YXMgYSBnZXR0ZXIgb3IgYSBzZXR0ZXIgY2FsbC4gKi8KICBib29sIGdldCBpc0FjY2Vzc29yID0+IGlzR2V0dGVyIHx8IGlzU2V0dGVyOwp9CgovKiogSW1wbGVtZW50YXRpb24gb2YgW0ludm9jYXRpb25dIHVzZWQgYnkgaXRzIGZhY3RvcnkgY29uc3RydWN0b3JzLiAqLwpjbGFzcyBfSW52b2NhdGlvbiBpbXBsZW1lbnRzIEludm9jYXRpb24gewogIGZpbmFsIFN5bWJvbCBtZW1iZXJOYW1lOwogIGZpbmFsIExpc3Q8VHlwZT4gdHlwZUFyZ3VtZW50czsKICAvLyBQb3NpdGlvbmFsIGFyZ3VtZW50cyBpcyBgbnVsbGAgZm9yIGdldHRlcnMgb25seS4KICBmaW5hbCBMaXN0PE9iamVjdD4gX3Bvc2l0aW9uYWw7CiAgLy8gTmFtZWQgYXJndW1lbnRzIGlzIGBudWxsYCBmb3IgYWNjZXNzb3JzIG9ubHkuCiAgZmluYWwgTWFwPFN5bWJvbCwgT2JqZWN0PiBfbmFtZWQ7CgogIF9JbnZvY2F0aW9uLm1ldGhvZCh0aGlzLm1lbWJlck5hbWUsIEl0ZXJhYmxlPFR5cGU+IHR5cGVzLAogICAgICBJdGVyYWJsZTxPYmplY3Q+IHBvc2l0aW9uYWwsIE1hcDxTeW1ib2wsIE9iamVjdD4gbmFtZWQpCiAgICAgIDogdHlwZUFyZ3VtZW50cyA9IF9lbnN1cmVOb25OdWxsVHlwZXMoX21ha2VVbm1vZGlmaWFibGU8VHlwZT4odHlwZXMpKSwKICAgICAgICBfcG9zaXRpb25hbCA9IF9tYWtlVW5tb2RpZmlhYmxlPE9iamVjdD4ocG9zaXRpb25hbCkgPz8gY29uc3QgPE9iamVjdD5bXSwKICAgICAgICBfbmFtZWQgPSAobmFtZWQgPT0gbnVsbCB8fCBuYW1lZC5pc0VtcHR5KQogICAgICAgICAgICA/IGNvbnN0IDxTeW1ib2wsIE9iamVjdD57fQogICAgICAgICAgICA6IE1hcDxTeW1ib2wsIE9iamVjdD4udW5tb2RpZmlhYmxlKG5hbWVkKTsKCiAgX0ludm9jYXRpb24uZ2V0dGVyKHRoaXMubWVtYmVyTmFtZSkKICAgICAgOiB0eXBlQXJndW1lbnRzID0gY29uc3QgPFR5cGU+W10sCiAgICAgICAgX3Bvc2l0aW9uYWwgPSBudWxsLAogICAgICAgIF9uYW1lZCA9IG51bGw7CgogIF9JbnZvY2F0aW9uLnNldHRlcih0aGlzLm1lbWJlck5hbWUsIE9iamVjdCBhcmd1bWVudCkKICAgICAgOiB0eXBlQXJndW1lbnRzID0gY29uc3QgPFR5cGU+W10sCiAgICAgICAgX3Bvc2l0aW9uYWwgPSBMaXN0PE9iamVjdD4udW5tb2RpZmlhYmxlKFthcmd1bWVudF0pLAogICAgICAgIF9uYW1lZCA9IG51bGw7CgogIExpc3Q8ZHluYW1pYz4gZ2V0IHBvc2l0aW9uYWxBcmd1bWVudHMgPT4gX3Bvc2l0aW9uYWwgPz8gY29uc3QgPE9iamVjdD5bXTsKCiAgTWFwPFN5bWJvbCwgZHluYW1pYz4gZ2V0IG5hbWVkQXJndW1lbnRzID0+IF9uYW1lZCA/PyBjb25zdCA8U3ltYm9sLCBPYmplY3Q+e307CgogIGJvb2wgZ2V0IGlzTWV0aG9kID0+IF9uYW1lZCAhPSBudWxsOwogIGJvb2wgZ2V0IGlzR2V0dGVyID0+IF9wb3NpdGlvbmFsID09IG51bGw7CiAgYm9vbCBnZXQgaXNTZXR0ZXIgPT4gX3Bvc2l0aW9uYWwgIT0gbnVsbCAmJiBfbmFtZWQgPT0gbnVsbDsKICBib29sIGdldCBpc0FjY2Vzc29yID0+IF9uYW1lZCA9PSBudWxsOwoKICAvLy8gQ2hlY2tzIHRoYXQgdGhlIGVsZW1lbnRzIG9mIFt0eXBlc10gYXJlIG5vdCBudWxsLgogIHN0YXRpYyBMaXN0PFR5cGU+IF9lbnN1cmVOb25OdWxsVHlwZXMoTGlzdDxUeXBlPiB0eXBlcykgewogICAgaWYgKHR5cGVzID09IG51bGwpIHJldHVybiBjb25zdCA8VHlwZT5bXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKHR5cGVzW2ldID09IG51bGwpIHsKICAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yKAogICAgICAgICAgICAiVHlwZSBhcmd1bWVudHMgbXVzdCBiZSBub24tbnVsbCwgd2FzIG51bGwgYXQgaW5kZXggJGkuIik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0eXBlczsKICB9CgogIHN0YXRpYyBMaXN0PFQ+IF9tYWtlVW5tb2RpZmlhYmxlPFQ+KEl0ZXJhYmxlPFQ+IGVsZW1lbnRzKSB7CiAgICBpZiAoZWxlbWVudHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gTGlzdDxUPi51bm1vZGlmaWFibGUoZWxlbWVudHMpOwogIH0KfQqApABOTjwBEwEEPgNERgoEHBABBkEFMk0GHUMzUQEGSQVNPzkFTQY2TjMaSwEGQQY/AQZBBU5HIw03CQZCGgEpGQEGPQU0LQYyAQZDBUETBikBBj4FNC4GKwEzFQEGLzoGFQEGLwU9PwwGFQE/LwIBSCobIjYiMyQBPD5NUTInNwEmKBwXATcoPRcBTAFRAScsPikBODwuLR4dRwgGEgQBPicrBAIBGWRhcnQ6Y29yZS9pbnZvY2F0aW9uLmRhcnQub3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvaXRlcmF0b3IuZGFydIjTLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLyoqCiAqIEFuIGludGVyZmFjZSBmb3IgZ2V0dGluZyBpdGVtcywgb25lIGF0IGEgdGltZSwgZnJvbSBhbiBvYmplY3QuCiAqCiAqIFRoZSBmb3ItaW4gY29uc3RydWN0IHRyYW5zcGFyZW50bHkgdXNlcyBgSXRlcmF0b3JgIHRvIHRlc3QgZm9yIHRoZSBlbmQKICogb2YgdGhlIGl0ZXJhdGlvbiwgYW5kIHRvIGdldCBlYWNoIGl0ZW0gKG9yIF9lbGVtZW50XykuCiAqCiAqIElmIHRoZSBvYmplY3QgaXRlcmF0ZWQgb3ZlciBpcyBjaGFuZ2VkIGR1cmluZyB0aGUgaXRlcmF0aW9uLCB0aGUKICogYmVoYXZpb3IgaXMgdW5zcGVjaWZpZWQuCiAqCiAqIFRoZSBgSXRlcmF0b3JgIGlzIGluaXRpYWxseSBwb3NpdGlvbmVkIGJlZm9yZSB0aGUgZmlyc3QgZWxlbWVudC4KICogQmVmb3JlIGFjY2Vzc2luZyB0aGUgZmlyc3QgZWxlbWVudCB0aGUgaXRlcmF0b3IgbXVzdCB0aHVzIGJlIGFkdmFuY2VkIHVzaW5nCiAqIFttb3ZlTmV4dF0gdG8gcG9pbnQgdG8gdGhlIGZpcnN0IGVsZW1lbnQuCiAqIElmIG5vIGVsZW1lbnQgaXMgbGVmdCwgdGhlbiBbbW92ZU5leHRdIHJldHVybnMgZmFsc2UsIFtjdXJyZW50XQogKiByZXR1cm5zIGBudWxsYCwgYW5kIGFsbCBmdXJ0aGVyIGNhbGxzIHRvIFttb3ZlTmV4dF0gd2lsbCBhbHNvIHJldHVybiBmYWxzZS4KICoKICogQSB0eXBpY2FsIHVzYWdlIG9mIGFuIEl0ZXJhdG9yIGxvb2tzIGFzIGZvbGxvd3M6CiAqCiAqICAgICB2YXIgaXQgPSBvYmouaXRlcmF0b3I7CiAqICAgICB3aGlsZSAoaXQubW92ZU5leHQoKSkgewogKiAgICAgICB1c2UoaXQuY3VycmVudCk7CiAqICAgICB9CiAqCiAqICoqU2VlIGFsc286KioKICogW0l0ZXJhdGlvbl0oaHR0cDovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy9kYXJ0LXVwLWFuZC1ydW5uaW5nL2NvbnRlbnRzL2NoMDMuaHRtbCNpdGVyYXRpb24pCiAqIGluIHRoZSBbbGlicmFyeSB0b3VyXShodHRwOi8vd3d3LmRhcnRsYW5nLm9yZy9kb2NzL2RhcnQtdXAtYW5kLXJ1bm5pbmcvY29udGVudHMvY2gwMy5odG1sKQogKi8KYWJzdHJhY3QgY2xhc3MgSXRlcmF0b3I8RT4gewogIC8qKgogICAqIE1vdmVzIHRvIHRoZSBuZXh0IGVsZW1lbnQuCiAgICoKICAgKiBSZXR1cm5zIHRydWUgaWYgW2N1cnJlbnRdIGNvbnRhaW5zIHRoZSBuZXh0IGVsZW1lbnQuCiAgICogUmV0dXJucyBmYWxzZSBpZiBubyBlbGVtZW50cyBhcmUgbGVmdC4KICAgKgogICAqIEl0IGlzIHNhZmUgdG8gaW52b2tlIFttb3ZlTmV4dF0gZXZlbiB3aGVuIHRoZSBpdGVyYXRvciBpcyBhbHJlYWR5CiAgICogcG9zaXRpb25lZCBhZnRlciB0aGUgbGFzdCBlbGVtZW50LgogICAqIEluIHRoaXMgY2FzZSBbbW92ZU5leHRdIHJldHVybnMgZmFsc2UgYWdhaW4gYW5kIGhhcyBubyBlZmZlY3QuCiAgICoKICAgKiBBIGNhbGwgdG8gYG1vdmVOZXh0YCBtYXkgdGhyb3cgaWYgaXRlcmF0aW9uIGhhcyBiZWVuIGJyb2tlbiBieQogICAqIGNoYW5naW5nIHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24uCiAgICovCiAgYm9vbCBtb3ZlTmV4dCgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGVsZW1lbnQuCiAgICoKICAgKiBSZXR1cm5zIGBudWxsYCBpZiB0aGUgaXRlcmF0b3IgaGFzIG5vdCB5ZXQgYmVlbiBtb3ZlZCB0byB0aGUgZmlyc3QKICAgKiBlbGVtZW50LCBvciBpZiB0aGUgaXRlcmF0b3IgaGFzIGJlZW4gbW92ZWQgcGFzdCB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZQogICAqIFtJdGVyYWJsZV0uCiAgICoKICAgKiBUaGUgYGN1cnJlbnRgIGdldHRlciBzaG91bGQga2VlcCBpdHMgdmFsdWUgdW50aWwgdGhlIG5leHQgY2FsbCB0bwogICAqIFttb3ZlTmV4dF0sIGV2ZW4gaWYgYW4gdW5kZXJseWluZyBjb2xsZWN0aW9uIGNoYW5nZXMuCiAgICogQWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gYG1vdmVOZXh0YCwgdGhlIHVzZXIgZG9lc24ndCBuZWVkIHRvIGNhY2hlCiAgICogdGhlIGN1cnJlbnQgdmFsdWUsIGJ1dCBjYW4ga2VlcCByZWFkaW5nIGl0IGZyb20gdGhlIGl0ZXJhdG9yLgogICAqLwogIEUgZ2V0IGN1cnJlbnQ7Cn0KQABOTjwBEwEEQgNKOgNEHANETy1DTwM0Ax4fGgkDEV5eBB0GIAU6LAVHKEQFRCkGEwEGIgVITREFRztLQwYRAgEXZGFydDpjb3JlL2l0ZXJhdG9yLmRhcnQqb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvbGlzdC5kYXJ0wABf1y8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCi8qKgogKiBBbiBpbmRleGFibGUgY29sbGVjdGlvbiBvZiBvYmplY3RzIHdpdGggYSBsZW5ndGguCiAqCiAqIFN1YmNsYXNzZXMgb2YgdGhpcyBjbGFzcyBpbXBsZW1lbnQgZGlmZmVyZW50IGtpbmRzIG9mIGxpc3RzLgogKiBUaGUgbW9zdCBjb21tb24ga2luZHMgb2YgbGlzdHMgYXJlOgogKgogKiAqIEZpeGVkLWxlbmd0aCBsaXN0LgogKiAgIEFuIGVycm9yIG9jY3VycyB3aGVuIGF0dGVtcHRpbmcgdG8gdXNlIG9wZXJhdGlvbnMKICogICB0aGF0IGNhbiBjaGFuZ2UgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdC4KICoKICogKiBHcm93YWJsZSBsaXN0LiBGdWxsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBUEkgZGVmaW5lZCBpbiB0aGlzIGNsYXNzLgogKgogKiBUaGUgZGVmYXVsdCBncm93YWJsZSBsaXN0LCBhcyByZXR1cm5lZCBieSBgbmV3IExpc3QoKWAgb3IgYFtdYCwga2VlcHMKICogYW4gaW50ZXJuYWwgYnVmZmVyLCBhbmQgZ3Jvd3MgdGhhdCBidWZmZXIgd2hlbiBuZWNlc3NhcnkuIFRoaXMgZ3VhcmFudGVlcwogKiB0aGF0IGEgc2VxdWVuY2Ugb2YgW2FkZF0gb3BlcmF0aW9ucyB3aWxsIGVhY2ggZXhlY3V0ZSBpbiBhbW9ydGl6ZWQgY29uc3RhbnQKICogdGltZS4gU2V0dGluZyB0aGUgbGVuZ3RoIGRpcmVjdGx5IG1heSB0YWtlIHRpbWUgcHJvcG9ydGlvbmFsIHRvIHRoZSBuZXcKICogbGVuZ3RoLCBhbmQgbWF5IGNoYW5nZSB0aGUgaW50ZXJuYWwgY2FwYWNpdHkgc28gdGhhdCBhIGZvbGxvd2luZyBhZGQKICogb3BlcmF0aW9uIHdpbGwgbmVlZCB0byBpbW1lZGlhdGVseSBpbmNyZWFzZSB0aGUgYnVmZmVyIGNhcGFjaXR5LgogKiBPdGhlciBsaXN0IGltcGxlbWVudGF0aW9ucyBtYXkgaGF2ZSBkaWZmZXJlbnQgcGVyZm9ybWFuY2UgYmVoYXZpb3IuCiAqCiAqIFRoZSBmb2xsb3dpbmcgY29kZSBpbGx1c3RyYXRlcyB0aGF0IHNvbWUgTGlzdCBpbXBsZW1lbnRhdGlvbnMgc3VwcG9ydAogKiBvbmx5IGEgc3Vic2V0IG9mIHRoZSBBUEkuCiAqCiAqICAgICBMaXN0PGludD4gZml4ZWRMZW5ndGhMaXN0ID0gbmV3IExpc3QoNSk7CiAqICAgICBmaXhlZExlbmd0aExpc3QubGVuZ3RoID0gMDsgIC8vIEVycm9yCiAqICAgICBmaXhlZExlbmd0aExpc3QuYWRkKDQ5OSk7ICAgIC8vIEVycm9yCiAqICAgICBmaXhlZExlbmd0aExpc3RbMF0gPSA4NzsKICogICAgIExpc3Q8aW50PiBncm93YWJsZUxpc3QgPSBbMSwgMl07CiAqICAgICBncm93YWJsZUxpc3QubGVuZ3RoID0gMDsKICogICAgIGdyb3dhYmxlTGlzdC5hZGQoNDk5KTsKICogICAgIGdyb3dhYmxlTGlzdFswXSA9IDg3OwogKgogKiBMaXN0cyBhcmUgW0l0ZXJhYmxlXS4gSXRlcmF0aW9uIG9jY3VycyBvdmVyIHZhbHVlcyBpbiBpbmRleCBvcmRlci4gQ2hhbmdpbmcKICogdGhlIHZhbHVlcyBkb2VzIG5vdCBhZmZlY3QgaXRlcmF0aW9uLCBidXQgY2hhbmdpbmcgdGhlIHZhbGlkCiAqIGluZGljZXMmbWRhc2g7dGhhdCBpcywgY2hhbmdpbmcgdGhlIGxpc3QncyBsZW5ndGgmbWRhc2g7YmV0d2VlbiBpdGVyYXRpb24KICogc3RlcHMgY2F1c2VzIGEgW0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcl0uIFRoaXMgbWVhbnMgdGhhdCBvbmx5IGdyb3dhYmxlCiAqIGxpc3RzIGNhbiB0aHJvdyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IuIElmIHRoZSBsZW5ndGggY2hhbmdlcwogKiB0ZW1wb3JhcmlseSBhbmQgaXMgcmVzdG9yZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlIGl0ZXJhdGlvbiwgdGhlIGl0ZXJhdG9yCiAqIGRvZXMgbm90IGRldGVjdCBpdC4KICoKICogSXQgaXMgZ2VuZXJhbGx5IG5vdCBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgbGlzdCdzIGxlbmd0aCAoYWRkaW5nIG9yIHJlbW92aW5nCiAqIGVsZW1lbnRzKSB3aGlsZSBhbiBvcGVyYXRpb24gb24gdGhlIGxpc3QgaXMgYmVpbmcgcGVyZm9ybWVkLAogKiBmb3IgZXhhbXBsZSBkdXJpbmcgYSBjYWxsIHRvIFtmb3JFYWNoXSBvciBbc29ydF0uCiAqIENoYW5naW5nIHRoZSBsaXN0J3MgbGVuZ3RoIHdoaWxlIGl0IGlzIGJlaW5nIGl0ZXJhdGVkLCBlaXRoZXIgYnkgaXRlcmF0aW5nIGl0CiAqIGRpcmVjdGx5IG9yIHRocm91Z2ggaXRlcmF0aW5nIGFuIFtJdGVyYWJsZV0gdGhhdCBpcyBiYWNrZWQgYnkgdGhlIGxpc3QsIHdpbGwKICogYnJlYWsgdGhlIGl0ZXJhdGlvbi4KICovCmFic3RyYWN0IGNsYXNzIExpc3Q8RT4gaW1wbGVtZW50cyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxFPiB7CiAgLyoqCiAgICogQ3JlYXRlcyBhIGxpc3Qgb2YgdGhlIGdpdmVuIGxlbmd0aC4KICAgKgogICAqIFRoZSBjcmVhdGVkIGxpc3QgaXMgZml4ZWQtbGVuZ3RoIGlmIFtsZW5ndGhdIGlzIHByb3ZpZGVkLgogICAqCiAgICogICAgIExpc3QgZml4ZWRMZW5ndGhMaXN0ID0gbmV3IExpc3QoMyk7CiAgICogICAgIGZpeGVkTGVuZ3RoTGlzdC5sZW5ndGg7ICAgICAvLyAzCiAgICogICAgIGZpeGVkTGVuZ3RoTGlzdC5sZW5ndGggPSAxOyAvLyBFcnJvcgogICAqCiAgICogVGhlIGxpc3QgaGFzIGxlbmd0aCAwIGFuZCBpcyBncm93YWJsZSBpZiBbbGVuZ3RoXSBpcyBvbWl0dGVkLgogICAqCiAgICogICAgIExpc3QgZ3Jvd2FibGVMaXN0ID0gbmV3IExpc3QoKTsKICAgKiAgICAgZ3Jvd2FibGVMaXN0Lmxlbmd0aDsgLy8gMDsKICAgKiAgICAgZ3Jvd2FibGVMaXN0Lmxlbmd0aCA9IDM7CiAgICoKICAgKiBUbyBjcmVhdGUgYSBncm93YWJsZSBsaXN0IHdpdGggYSBnaXZlbiBsZW5ndGgsIGp1c3QgYXNzaWduIHRoZSBsZW5ndGgKICAgKiByaWdodCBhZnRlciBjcmVhdGlvbjoKICAgKgogICAqICAgICBMaXN0IGdyb3dhYmxlTGlzdCA9IG5ldyBMaXN0KCkuLmxlbmd0aCA9IDUwMDsKICAgKgogICAqIFRoZSBbbGVuZ3RoXSBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBvciBudWxsLCBpZiBpdCBpcyBwcm92aWRlZC4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IExpc3QoW2ludCBsZW5ndGhdKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIGxpc3Qgb2YgdGhlIGdpdmVuIGxlbmd0aCB3aXRoIFtmaWxsXSBhdCBlYWNoIHBvc2l0aW9uLgogICAqCiAgICogVGhlIFtsZW5ndGhdIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci4KICAgKgogICAqIEV4YW1wbGU6CiAgICogYGBgZGFydAogICAqIG5ldyBMaXN0PGludD4uZmlsbGVkKDMsIDAsIGdyb3dhYmxlOiB0cnVlKTsgLy8gWzAsIDAsIDBdCiAgICogYGBgCiAgICoKICAgKiBUaGUgY3JlYXRlZCBsaXN0IGlzIGZpeGVkLWxlbmd0aCBpZiBbZ3Jvd2FibGVdIGlzIGZhbHNlICh0aGUgZGVmYXVsdCkKICAgKiBhbmQgZ3Jvd2FibGUgaWYgW2dyb3dhYmxlXSBpcyB0cnVlLgogICAqIElmIHRoZSBsaXN0IGlzIGdyb3dhYmxlLCBjaGFuZ2luZyBpdHMgbGVuZ3RoIHdpbGwgbm90IGluaXRpYWxpemUgbmV3CiAgICogZW50cmllcyB3aXRoIFtmaWxsXS4KICAgKiBBZnRlciBiZWluZyBjcmVhdGVkIGFuZCBmaWxsZWQsIHRoZSBsaXN0IGlzIG5vIGRpZmZlcmVudCBmcm9tIGFueSBvdGhlcgogICAqIGdyb3dhYmxlIG9yIGZpeGVkLWxlbmd0aCBsaXN0IGNyZWF0ZWQgdXNpbmcgW0xpc3RdLgogICAqCiAgICogQWxsIGVsZW1lbnRzIG9mIHRoZSByZXR1cm5lZCBsaXN0IHNoYXJlIHRoZSBzYW1lIFtmaWxsXSB2YWx1ZS4KICAgKiBgYGAKICAgKiB2YXIgc2hhcmVkID0gbmV3IExpc3QuZmlsbGVkKDMsIFtdKTsKICAgKiBzaGFyZWRbMF0uYWRkKDQ5OSk7CiAgICogcHJpbnQoc2hhcmVkKTsgIC8vID0+IFtbNDk5XSwgWzQ5OV0sIFs0OTldXQogICAqIGBgYAogICAqCiAgICogWW91IGNhbiB1c2UgW0xpc3QuZ2VuZXJhdGVdIHRvIGNyZWF0ZSBhIGxpc3Qgd2l0aCBhIG5ldyBvYmplY3QgYXQKICAgKiBlYWNoIHBvc2l0aW9uLgogICAqIGBgYAogICAqIHZhciB1bmlxdWUgPSBuZXcgTGlzdC5nZW5lcmF0ZSgzLCAoXykgPT4gW10pOwogICAqIHVuaXF1ZVswXS5hZGQoNDk5KTsKICAgKiBwcmludCh1bmlxdWUpOyAvLyA9PiBbWzQ5OV0sIFtdLCBbXV0KICAgKiBgYGAKICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IExpc3QuZmlsbGVkKGludCBsZW5ndGgsIEUgZmlsbCwge2Jvb2wgZ3Jvd2FibGUgPSBmYWxzZX0pOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbGlzdCBjb250YWluaW5nIGFsbCBbZWxlbWVudHNdLgogICAqCiAgICogVGhlIFtJdGVyYXRvcl0gb2YgW2VsZW1lbnRzXSBwcm92aWRlcyB0aGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzLgogICAqCiAgICogQWxsIHRoZSBbZWxlbWVudHNdIHNob3VsZCBiZSBpbnN0YW5jZXMgb2YgW0VdLgogICAqIFRoZSBgZWxlbWVudHNgIGl0ZXJhYmxlIGl0c2VsZiBtYXkgaGF2ZSBhbnkgZWxlbWVudCB0eXBlLCBzbyB0aGlzCiAgICogY29uc3RydWN0b3IgY2FuIGJlIHVzZWQgdG8gZG93bi1jYXN0IGEgYExpc3RgLCBmb3IgZXhhbXBsZSBhczoKICAgKiBgYGBkYXJ0CiAgICogTGlzdDxTdXBlclR5cGU+IHN1cGVyTGlzdCA9IC4uLjsKICAgKiBMaXN0PFN1YlR5cGU+IHN1Ykxpc3QgPQogICAqICAgICBuZXcgTGlzdDxTdWJUeXBlPi5mcm9tKHN1cGVyTGlzdC53aGVyZVR5cGU8U3ViVHlwZT4oKSk7CiAgICogYGBgCiAgICoKICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBncm93YWJsZSBsaXN0IHdoZW4gW2dyb3dhYmxlXSBpcyB0cnVlOwogICAqIG90aGVyd2lzZSwgaXQgcmV0dXJucyBhIGZpeGVkLWxlbmd0aCBsaXN0LgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgTGlzdC5mcm9tKEl0ZXJhYmxlIGVsZW1lbnRzLCB7Ym9vbCBncm93YWJsZSA9IHRydWV9KTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIGxpc3QgZnJvbSBbZWxlbWVudHNdLgogICAqCiAgICogVGhlIFtJdGVyYXRvcl0gb2YgW2VsZW1lbnRzXSBwcm92aWRlcyB0aGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzLgogICAqCiAgICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgZ3Jvd2FibGUgbGlzdCB3aGVuIFtncm93YWJsZV0gaXMgdHJ1ZTsKICAgKiBvdGhlcndpc2UsIGl0IHJldHVybnMgYSBmaXhlZC1sZW5ndGggbGlzdC4KICAgKi8KICBmYWN0b3J5IExpc3Qub2YoSXRlcmFibGU8RT4gZWxlbWVudHMsIHtib29sIGdyb3dhYmxlID0gdHJ1ZX0pID0+CiAgICAgIExpc3Q8RT4uZnJvbShlbGVtZW50cywgZ3Jvd2FibGU6IGdyb3dhYmxlKTsKCiAgLyoqCiAgICogR2VuZXJhdGVzIGEgbGlzdCBvZiB2YWx1ZXMuCiAgICoKICAgKiBDcmVhdGVzIGEgbGlzdCB3aXRoIFtsZW5ndGhdIHBvc2l0aW9ucyBhbmQgZmlsbHMgaXQgd2l0aCB2YWx1ZXMgY3JlYXRlZCBieQogICAqIGNhbGxpbmcgW2dlbmVyYXRvcl0gZm9yIGVhY2ggaW5kZXggaW4gdGhlIHJhbmdlIGAwYCAuLiBgbGVuZ3RoIC0gMWAKICAgKiBpbiBpbmNyZWFzaW5nIG9yZGVyLgogICAqCiAgICogICAgIG5ldyBMaXN0PGludD4uZ2VuZXJhdGUoMywgKGludCBpbmRleCkgPT4gaW5kZXggKiBpbmRleCk7IC8vIFswLCAxLCA0XQogICAqCiAgICogVGhlIGNyZWF0ZWQgbGlzdCBpcyBmaXhlZC1sZW5ndGggdW5sZXNzIFtncm93YWJsZV0gaXMgdHJ1ZS4KICAgKi8KICBmYWN0b3J5IExpc3QuZ2VuZXJhdGUoaW50IGxlbmd0aCwgRSBnZW5lcmF0b3IoaW50IGluZGV4KSwKICAgICAge2Jvb2wgZ3Jvd2FibGUgPSB0cnVlfSkgewogICAgTGlzdDxFPiByZXN1bHQ7CiAgICBpZiAoZ3Jvd2FibGUpIHsKICAgICAgcmVzdWx0ID0gPEU+W10uLmxlbmd0aCA9IGxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IExpc3Q8RT4obGVuZ3RoKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0W2ldID0gZ2VuZXJhdG9yKGkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYW4gdW5tb2RpZmlhYmxlIGxpc3QgY29udGFpbmluZyBhbGwgW2VsZW1lbnRzXS4KICAgKgogICAqIFRoZSBbSXRlcmF0b3JdIG9mIFtlbGVtZW50c10gcHJvdmlkZXMgdGhlIG9yZGVyIG9mIHRoZSBlbGVtZW50cy4KICAgKgogICAqIEFuIHVubW9kaWZpYWJsZSBsaXN0IGNhbm5vdCBoYXZlIGl0cyBsZW5ndGggb3IgZWxlbWVudHMgY2hhbmdlZC4KICAgKiBJZiB0aGUgZWxlbWVudHMgYXJlIHRoZW1zZWx2ZXMgaW1tdXRhYmxlLCB0aGVuIHRoZSByZXN1bHRpbmcgbGlzdAogICAqIGlzIGFsc28gaW1tdXRhYmxlLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgTGlzdC51bm1vZGlmaWFibGUoSXRlcmFibGUgZWxlbWVudHMpOwoKICAvKioKICAgKiBBZGFwdHMgW3NvdXJjZV0gdG8gYmUgYSBgTGlzdDxUPmAuCiAgICoKICAgKiBBbnkgdGltZSB0aGUgbGlzdCB3b3VsZCBwcm9kdWNlIGFuIGVsZW1lbnQgdGhhdCBpcyBub3QgYSBbVF0sCiAgICogdGhlIGVsZW1lbnQgYWNjZXNzIHdpbGwgdGhyb3cuCiAgICoKICAgKiBBbnkgdGltZSBhIFtUXSB2YWx1ZSBpcyBhdHRlbXB0ZWQgc3RvcmVkIGludG8gdGhlIGFkYXB0ZWQgbGlzdCwKICAgKiB0aGUgc3RvcmUgd2lsbCB0aHJvdyB1bmxlc3MgdGhlIHZhbHVlIGlzIGFsc28gYW4gaW5zdGFuY2Ugb2YgW1NdLgogICAqCiAgICogSWYgYWxsIGFjY2Vzc2VkIGVsZW1lbnRzIG9mIFtzb3VyY2VdIGFyZSBhY3R1YWxseSBpbnN0YW5jZXMgb2YgW1RdLAogICAqIGFuZCBpZiBhbGwgZWxlbWVudHMgc3RvcmVkIGludG8gdGhlIHJldHVybmVkIGxpc3QgYXJlIGFjdHVhbGx5IGluc3RhbmNlCiAgICogb2YgW1NdLAogICAqIHRoZW4gdGhlIHJldHVybmVkIGxpc3QgY2FuIGJlIHVzZWQgYXMgYSBgTGlzdDxUPmAuCiAgICovCiAgc3RhdGljIExpc3Q8VD4gY2FzdEZyb208UywgVD4oTGlzdDxTPiBzb3VyY2UpID0+IENhc3RMaXN0PFMsIFQ+KHNvdXJjZSk7CgogIC8qKgogICAqIENvcHkgYSByYW5nZSBvZiBvbmUgbGlzdCBpbnRvIGFub3RoZXIgbGlzdC4KICAgKgogICAqIFRoaXMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IG1ldGhvZHMgbGlrZQogICAqIFtzZXRSYW5nZV0uCiAgICoKICAgKiBUaGUgcmFuZ2UgZnJvbSBbc3RhcnRdIHRvIFtlbmRdIG11c3QgYmUgYSB2YWxpZCByYW5nZSBvZiBbc291cmNlXSwKICAgKiBhbmQgdGhlcmUgbXVzdCBiZSByb29tIGZvciBgZW5kIC0gc3RhcnRgIGVsZW1lbnRzIGZyb20gcG9zaXRpb24gW2F0XS4KICAgKiBJZiBbc3RhcnRdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHplcm8uCiAgICogSWYgW2VuZF0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gW3NvdXJjZS5sZW5ndGhdLgogICAqCiAgICogSWYgW3NvdXJjZV0gYW5kIFt0YXJnZXRdIGlzIHRoZSBzYW1lIGxpc3QsIG92ZXJsYXBwaW5nIHNvdXJjZSBhbmQgdGFyZ2V0CiAgICogcmFuZ2VzIGFyZSByZXNwZWN0ZWQgc28gdGhhdCB0aGUgdGFyZ2V0IHJhbmdlIGVuZHMgdXAgY29udGFpbmluZyB0aGUKICAgKiBpbml0aWFsIGNvbnRlbnQgb2YgdGhlIHNvdXJjZSByYW5nZS4KICAgKiBPdGhlcndpc2UgdGhlIG9yZGVyIG9mIGVsZW1lbnQgY29weWluZyBpcyBub3QgZ3VhcmFudGVlZC4KICAgKi8KICBzdGF0aWMgdm9pZCBjb3B5UmFuZ2U8VD4oTGlzdDxUPiB0YXJnZXQsIGludCBhdCwgTGlzdDxUPiBzb3VyY2UsCiAgICAgIFtpbnQgc3RhcnQsIGludCBlbmRdKSB7CiAgICBzdGFydCA/Pz0gMDsKICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHNvdXJjZS5sZW5ndGgpOwogICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKHRhcmdldC5sZW5ndGggPCBhdCArIGxlbmd0aCkgewogICAgICB0aHJvdyBBcmd1bWVudEVycm9yLnZhbHVlKHRhcmdldCwgInRhcmdldCIsCiAgICAgICAgICAiTm90IGJpZyBlbm91Z2ggdG8gaG9sZCAkbGVuZ3RoIGVsZW1lbnRzIGF0IHBvc2l0aW9uICRhdCIpOwogICAgfQogICAgaWYgKCFpZGVudGljYWwoc291cmNlLCB0YXJnZXQpIHx8IHN0YXJ0ID49IGF0KSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICB0YXJnZXRbYXQgKyBpXSA9IHNvdXJjZVtzdGFydCArIGldOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCBpID0gbGVuZ3RoOyAtLWkgPj0gMDspIHsKICAgICAgICB0YXJnZXRbYXQgKyBpXSA9IHNvdXJjZVtzdGFydCArIGldOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBXcml0ZSB0aGUgZWxlbWVudHMgb2YgYW4gaXRlcmFibGUgaW50byBhIGxpc3QuCiAgICoKICAgKiBUaGlzIGlzIGEgdXRpbGl0eSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBtZXRob2RzIGxpa2UKICAgKiBbc2V0QWxsXS4KICAgKgogICAqIFRoZSBlbGVtZW50cyBvZiBbc291cmNlXSBhcmUgd3JpdHRlbiBpbnRvIFt0YXJnZXRdIGZyb20gcG9zaXRpb24gW2F0XS4KICAgKiBUaGUgW3NvdXJjZV0gbXVzdCBub3QgY29udGFpbiBtb3JlIGVsZW1lbnRzIGFmdGVyIHdyaXRpbmcgdGhlIGxhc3QKICAgKiBwb3NpdGlvbiBvZiBbdGFyZ2V0XS4KICAgKgogICAqIElmIHRoZSBzb3VyY2UgaXMgYSBsaXN0LCB0aGUgW2NvcHlSYW5nZV0gZnVuY3Rpb24gaXMgbGlrZWx5IHRvIGJlIG1vcmUKICAgKiBlZmZpY2llbnQuCiAgICovCiAgc3RhdGljIHZvaWQgd3JpdGVJdGVyYWJsZTxUPihMaXN0PFQ+IHRhcmdldCwgaW50IGF0LCBJdGVyYWJsZTxUPiBzb3VyY2UpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWx1ZUluSW50ZXJ2YWwoYXQsIDAsIHRhcmdldC5sZW5ndGgsICJhdCIpOwogICAgaW50IGluZGV4ID0gYXQ7CiAgICBpbnQgdGFyZ2V0TGVuZ3RoID0gdGFyZ2V0Lmxlbmd0aDsKICAgIGZvciAodmFyIGVsZW1lbnQgaW4gc291cmNlKSB7CiAgICAgIGlmIChpbmRleCA9PSB0YXJnZXRMZW5ndGgpIHsKICAgICAgICB0aHJvdyBJbmRleEVycm9yKHRhcmdldExlbmd0aCwgdGFyZ2V0KTsKICAgICAgfQogICAgICB0YXJnZXRbaW5kZXhdID0gZWxlbWVudDsKICAgICAgaW5kZXgrKzsKICAgIH0KICB9CgogIC8qKgogICAqIFJldHVybnMgYSB2aWV3IG9mIHRoaXMgbGlzdCBhcyBhIGxpc3Qgb2YgW1JdIGluc3RhbmNlcy4KICAgKgogICAqIElmIHRoaXMgbGlzdCBjb250YWlucyBvbmx5IGluc3RhbmNlcyBvZiBbUl0sIGFsbCByZWFkIG9wZXJhdGlvbnMKICAgKiB3aWxsIHdvcmsgY29ycmVjdGx5LiBJZiBhbnkgb3BlcmF0aW9uIHRyaWVzIHRvIGFjY2VzcyBhbiBlbGVtZW50CiAgICogdGhhdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgW1JdLCB0aGUgYWNjZXNzIHdpbGwgdGhyb3cgaW5zdGVhZC4KICAgKgogICAqIEVsZW1lbnRzIGFkZGVkIHRvIHRoZSBsaXN0IChlLmcuLCBieSB1c2luZyBbYWRkXSBvciBbYWRkQWxsXSkKICAgKiBtdXN0IGJlIGluc3RhbmNlIG9mIFtSXSB0byBiZSB2YWxpZCBhcmd1bWVudHMgdG8gdGhlIGFkZGluZyBmdW5jdGlvbiwKICAgKiBhbmQgdGhleSBtdXN0IGJlIGluc3RhbmNlcyBvZiBbRV0gYXMgd2VsbCB0byBiZSBhY2NlcHRlZCBieQogICAqIHRoaXMgbGlzdCBhcyB3ZWxsLgogICAqCiAgICogVHlwaWNhbGx5IGltcGxlbWVudGVkIGFzIGBMaXN0LmNhc3RGcm9tPEUsIFI+KHRoaXMpYC4KICAgKi8KICBMaXN0PFI+IGNhc3Q8Uj4oKTsKICAvKioKICAgKiBSZXR1cm5zIHRoZSBvYmplY3QgYXQgdGhlIGdpdmVuIFtpbmRleF0gaW4gdGhlIGxpc3QKICAgKiBvciB0aHJvd3MgYSBbUmFuZ2VFcnJvcl0gaWYgW2luZGV4XSBpcyBvdXQgb2YgYm91bmRzLgogICAqLwogIEUgb3BlcmF0b3IgW10oaW50IGluZGV4KTsKCiAgLyoqCiAgICogU2V0cyB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIFtpbmRleF0gaW4gdGhlIGxpc3QgdG8gW3ZhbHVlXQogICAqIG9yIHRocm93cyBhIFtSYW5nZUVycm9yXSBpZiBbaW5kZXhdIGlzIG91dCBvZiBib3VuZHMuCiAgICovCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBFIHZhbHVlKTsKCiAgLyoqCiAgICogVXBkYXRlcyB0aGUgZmlyc3QgcG9zaXRpb24gb2YgdGhlIGxpc3QgdG8gY29udGFpbiBbdmFsdWVdLgogICAqCiAgICogRXF1aXZhbGVudCB0byBgdGhlTGlzdFswXSA9IHZhbHVlO2AuCiAgICoKICAgKiBUaGUgbGlzdCBtdXN0IGJlIG5vbi1lbXB0eS4KICAgKi8KICB2b2lkIHNldCBmaXJzdChFIHZhbHVlKTsKCiAgLyoqCiAgICogVXBkYXRlcyB0aGUgbGFzdCBwb3NpdGlvbiBvZiB0aGUgbGlzdCB0byBjb250YWluIFt2YWx1ZV0uCiAgICoKICAgKiBFcXVpdmFsZW50IHRvIGB0aGVMaXN0W3RoZUxpc3QubGVuZ3RoIC0gMV0gPSB2YWx1ZTtgLgogICAqCiAgICogVGhlIGxpc3QgbXVzdCBiZSBub24tZW1wdHkuCiAgICovCiAgdm9pZCBzZXQgbGFzdChFIHZhbHVlKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhpcyBsaXN0LgogICAqCiAgICogVGhlIHZhbGlkIGluZGljZXMgZm9yIGEgbGlzdCBhcmUgYDBgIHRocm91Z2ggYGxlbmd0aCAtIDFgLgogICAqLwogIGludCBnZXQgbGVuZ3RoOwoKICAvKioKICAgKiBDaGFuZ2VzIHRoZSBsZW5ndGggb2YgdGhpcyBsaXN0LgogICAqCiAgICogSWYgW25ld0xlbmd0aF0gaXMgZ3JlYXRlciB0aGFuCiAgICogdGhlIGN1cnJlbnQgbGVuZ3RoLCBlbnRyaWVzIGFyZSBpbml0aWFsaXplZCB0byBbOm51bGw6XS4KICAgKgogICAqIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0gaWYgdGhlIGxpc3QgaXMgZml4ZWQtbGVuZ3RoLgogICAqLwogIHNldCBsZW5ndGgoaW50IG5ld0xlbmd0aCk7CgogIC8qKgogICAqIEFkZHMgW3ZhbHVlXSB0byB0aGUgZW5kIG9mIHRoaXMgbGlzdCwKICAgKiBleHRlbmRpbmcgdGhlIGxlbmd0aCBieSBvbmUuCiAgICoKICAgKiBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdIGlmIHRoZSBsaXN0IGlzIGZpeGVkLWxlbmd0aC4KICAgKi8KICB2b2lkIGFkZChFIHZhbHVlKTsKCiAgLyoqCiAgICogQXBwZW5kcyBhbGwgb2JqZWN0cyBvZiBbaXRlcmFibGVdIHRvIHRoZSBlbmQgb2YgdGhpcyBsaXN0LgogICAqCiAgICogRXh0ZW5kcyB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGJ5IHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBpbiBbaXRlcmFibGVdLgogICAqIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0gaWYgdGhpcyBsaXN0IGlzIGZpeGVkLWxlbmd0aC4KICAgKi8KICB2b2lkIGFkZEFsbChJdGVyYWJsZTxFPiBpdGVyYWJsZSk7CgogIC8qKgogICAqIFJldHVybnMgYW4gW0l0ZXJhYmxlXSBvZiB0aGUgb2JqZWN0cyBpbiB0aGlzIGxpc3QgaW4gcmV2ZXJzZSBvcmRlci4KICAgKi8KICBJdGVyYWJsZTxFPiBnZXQgcmV2ZXJzZWQ7CgogIC8qKgogICAqIFNvcnRzIHRoaXMgbGlzdCBhY2NvcmRpbmcgdG8gdGhlIG9yZGVyIHNwZWNpZmllZCBieSB0aGUgW2NvbXBhcmVdIGZ1bmN0aW9uLgogICAqCiAgICogVGhlIFtjb21wYXJlXSBmdW5jdGlvbiBtdXN0IGFjdCBhcyBhIFtDb21wYXJhdG9yXS4KICAgKgogICAqICAgICBMaXN0PFN0cmluZz4gbnVtYmVycyA9IFsndHdvJywgJ3RocmVlJywgJ2ZvdXInXTsKICAgKiAgICAgLy8gU29ydCBmcm9tIHNob3J0ZXN0IHRvIGxvbmdlc3QuCiAgICogICAgIG51bWJlcnMuc29ydCgoYSwgYikgPT4gYS5sZW5ndGguY29tcGFyZVRvKGIubGVuZ3RoKSk7CiAgICogICAgIHByaW50KG51bWJlcnMpOyAgLy8gW3R3bywgZm91ciwgdGhyZWVdCiAgICoKICAgKiBUaGUgZGVmYXVsdCBMaXN0IGltcGxlbWVudGF0aW9ucyB1c2UgW0NvbXBhcmFibGUuY29tcGFyZV0gaWYKICAgKiBbY29tcGFyZV0gaXMgb21pdHRlZC4KICAgKgogICAqICAgICBMaXN0PGludD4gbnVtcyA9IFsxMywgMiwgLTExXTsKICAgKiAgICAgbnVtcy5zb3J0KCk7CiAgICogICAgIHByaW50KG51bXMpOyAgLy8gWy0xMSwgMiwgMTNdCiAgICoKICAgKiBBIFtDb21wYXJhdG9yXSBtYXkgY29tcGFyZSBvYmplY3RzIGFzIGVxdWFsIChyZXR1cm4gemVybyksIGV2ZW4gaWYgdGhleQogICAqIGFyZSBkaXN0aW5jdCBvYmplY3RzLgogICAqIFRoZSBzb3J0IGZ1bmN0aW9uIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHN0YWJsZSwgc28gZGlzdGluY3Qgb2JqZWN0cwogICAqIHRoYXQgY29tcGFyZSBhcyBlcXVhbCBtYXkgb2NjdXIgaW4gYW55IG9yZGVyIGluIHRoZSByZXN1bHQ6CiAgICoKICAgKiAgICAgTGlzdDxTdHJpbmc+IG51bWJlcnMgPSBbJ29uZScsICd0d28nLCAndGhyZWUnLCAnZm91ciddOwogICAqICAgICBudW1iZXJzLnNvcnQoKGEsIGIpID0+IGEubGVuZ3RoLmNvbXBhcmVUbyhiLmxlbmd0aCkpOwogICAqICAgICBwcmludChudW1iZXJzKTsgIC8vIFtvbmUsIHR3bywgZm91ciwgdGhyZWVdIE9SIFt0d28sIG9uZSwgZm91ciwgdGhyZWVdCiAgICovCiAgdm9pZCBzb3J0KFtpbnQgY29tcGFyZShFIGEsIEUgYildKTsKCiAgLyoqCiAgICogU2h1ZmZsZXMgdGhlIGVsZW1lbnRzIG9mIHRoaXMgbGlzdCByYW5kb21seS4KICAgKi8KICB2b2lkIHNodWZmbGUoW1JhbmRvbSByYW5kb21dKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZmlyc3QgaW5kZXggb2YgW2VsZW1lbnRdIGluIHRoaXMgbGlzdC4KICAgKgogICAqIFNlYXJjaGVzIHRoZSBsaXN0IGZyb20gaW5kZXggW3N0YXJ0XSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgogICAqIFRoZSBmaXJzdCB0aW1lIGFuIG9iamVjdCBbOm86XSBpcyBlbmNvdW50ZXJlZCBzbyB0aGF0IFs6byA9PSBlbGVtZW50Ol0sCiAgICogdGhlIGluZGV4IG9mIFs6bzpdIGlzIHJldHVybmVkLgogICAqCiAgICogICAgIExpc3Q8U3RyaW5nPiBub3RlcyA9IFsnZG8nLCAncmUnLCAnbWknLCAncmUnXTsKICAgKiAgICAgbm90ZXMuaW5kZXhPZigncmUnKTsgICAgLy8gMQogICAqICAgICBub3Rlcy5pbmRleE9mKCdyZScsIDIpOyAvLyAzCiAgICoKICAgKiBSZXR1cm5zIC0xIGlmIFtlbGVtZW50XSBpcyBub3QgZm91bmQuCiAgICoKICAgKiAgICAgbm90ZXMuaW5kZXhPZignZmEnKTsgICAgLy8gLTEKICAgKi8KICBpbnQgaW5kZXhPZihFIGVsZW1lbnQsIFtpbnQgc3RhcnQgPSAwXSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGZpcnN0IGluZGV4IGluIHRoZSBsaXN0IHRoYXQgc2F0aXNmaWVzIHRoZSBwcm92aWRlZCBbdGVzdF0uCiAgICoKICAgKiBTZWFyY2hlcyB0aGUgbGlzdCBmcm9tIGluZGV4IFtzdGFydF0gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KICAgKiBUaGUgZmlyc3QgdGltZSBhbiBvYmplY3QgYG9gIGlzIGVuY291bnRlcmVkIHNvIHRoYXQgYHRlc3QobylgIGlzIHRydWUsCiAgICogdGhlIGluZGV4IG9mIGBvYCBpcyByZXR1cm5lZC4KICAgKgogICAqIGBgYAogICAqIExpc3Q8U3RyaW5nPiBub3RlcyA9IFsnZG8nLCAncmUnLCAnbWknLCAncmUnXTsKICAgKiBub3Rlcy5pbmRleFdoZXJlKChub3RlKSA9PiBub3RlLnN0YXJ0c1dpdGgoJ3InKSk7ICAgICAgIC8vIDEKICAgKiBub3Rlcy5pbmRleFdoZXJlKChub3RlKSA9PiBub3RlLnN0YXJ0c1dpdGgoJ3InKSwgMik7ICAgIC8vIDMKICAgKiBgYGAKICAgKgogICAqIFJldHVybnMgLTEgaWYgW2VsZW1lbnRdIGlzIG5vdCBmb3VuZC4KICAgKiBgYGAKICAgKiBub3Rlcy5pbmRleFdoZXJlKChub3RlKSA9PiBub3RlLnN0YXJ0c1dpdGgoJ2snKSk7ICAgIC8vIC0xCiAgICogYGBgCiAgICovCiAgaW50IGluZGV4V2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIFtpbnQgc3RhcnQgPSAwXSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGxhc3QgaW5kZXggaW4gdGhlIGxpc3QgdGhhdCBzYXRpc2ZpZXMgdGhlIHByb3ZpZGVkIFt0ZXN0XS4KICAgKgogICAqIFNlYXJjaGVzIHRoZSBsaXN0IGZyb20gaW5kZXggW3N0YXJ0XSB0byAwLgogICAqIFRoZSBmaXJzdCB0aW1lIGFuIG9iamVjdCBgb2AgaXMgZW5jb3VudGVyZWQgc28gdGhhdCBgdGVzdChvKWAgaXMgdHJ1ZSwKICAgKiB0aGUgaW5kZXggb2YgYG9gIGlzIHJldHVybmVkLgogICAqCiAgICogYGBgCiAgICogTGlzdDxTdHJpbmc+IG5vdGVzID0gWydkbycsICdyZScsICdtaScsICdyZSddOwogICAqIG5vdGVzLmxhc3RJbmRleFdoZXJlKChub3RlKSA9PiBub3RlLnN0YXJ0c1dpdGgoJ3InKSk7ICAgICAgIC8vIDMKICAgKiBub3Rlcy5sYXN0SW5kZXhXaGVyZSgobm90ZSkgPT4gbm90ZS5zdGFydHNXaXRoKCdyJyksIDIpOyAgICAvLyAxCiAgICogYGBgCiAgICoKICAgKiBSZXR1cm5zIC0xIGlmIFtlbGVtZW50XSBpcyBub3QgZm91bmQuCiAgICogYGBgCiAgICogbm90ZXMubGFzdEluZGV4V2hlcmUoKG5vdGUpID0+IG5vdGUuc3RhcnRzV2l0aCgnaycpKTsgICAgLy8gLTEKICAgKiBgYGAKICAgKi8KICBpbnQgbGFzdEluZGV4V2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIFtpbnQgc3RhcnRdKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGFzdCBpbmRleCBvZiBbZWxlbWVudF0gaW4gdGhpcyBsaXN0LgogICAqCiAgICogU2VhcmNoZXMgdGhlIGxpc3QgYmFja3dhcmRzIGZyb20gaW5kZXggW3N0YXJ0XSB0byAwLgogICAqCiAgICogVGhlIGZpcnN0IHRpbWUgYW4gb2JqZWN0IFs6bzpdIGlzIGVuY291bnRlcmVkIHNvIHRoYXQgWzpvID09IGVsZW1lbnQ6XSwKICAgKiB0aGUgaW5kZXggb2YgWzpvOl0gaXMgcmV0dXJuZWQuCiAgICoKICAgKiAgICAgTGlzdDxTdHJpbmc+IG5vdGVzID0gWydkbycsICdyZScsICdtaScsICdyZSddOwogICAqICAgICBub3Rlcy5sYXN0SW5kZXhPZigncmUnLCAyKTsgLy8gMQogICAqCiAgICogSWYgW3N0YXJ0XSBpcyBub3QgcHJvdmlkZWQsIHRoaXMgbWV0aG9kIHNlYXJjaGVzIGZyb20gdGhlIGVuZCBvZiB0aGUKICAgKiBsaXN0Li9SZXR1cm5zCiAgICoKICAgKiAgICAgbm90ZXMubGFzdEluZGV4T2YoJ3JlJyk7ICAvLyAzCiAgICoKICAgKiBSZXR1cm5zIC0xIGlmIFtlbGVtZW50XSBpcyBub3QgZm91bmQuCiAgICoKICAgKiAgICAgbm90ZXMubGFzdEluZGV4T2YoJ2ZhJyk7ICAvLyAtMQogICAqLwogIGludCBsYXN0SW5kZXhPZihFIGVsZW1lbnQsIFtpbnQgc3RhcnRdKTsKCiAgLyoqCiAgICogUmVtb3ZlcyBhbGwgb2JqZWN0cyBmcm9tIHRoaXMgbGlzdDsKICAgKiB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGJlY29tZXMgemVyby4KICAgKgogICAqIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0sIGFuZCByZXRhaW5zIGFsbCBvYmplY3RzLCBpZiB0aGlzCiAgICogaXMgYSBmaXhlZC1sZW5ndGggbGlzdC4KICAgKi8KICB2b2lkIGNsZWFyKCk7CgogIC8qKgogICAqIEluc2VydHMgdGhlIG9iamVjdCBhdCBwb3NpdGlvbiBbaW5kZXhdIGluIHRoaXMgbGlzdC4KICAgKgogICAqIFRoaXMgaW5jcmVhc2VzIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYnkgb25lIGFuZCBzaGlmdHMgYWxsIG9iamVjdHMKICAgKiBhdCBvciBhZnRlciB0aGUgaW5kZXggdG93YXJkcyB0aGUgZW5kIG9mIHRoZSBsaXN0LgogICAqCiAgICogQW4gZXJyb3Igb2NjdXJzIGlmIHRoZSBbaW5kZXhdIGlzIGxlc3MgdGhhbiAwIG9yIGdyZWF0ZXIgdGhhbiBsZW5ndGguCiAgICogQW4gW1Vuc3VwcG9ydGVkRXJyb3JdIG9jY3VycyBpZiB0aGUgbGlzdCBpcyBmaXhlZC1sZW5ndGguCiAgICovCiAgdm9pZCBpbnNlcnQoaW50IGluZGV4LCBFIGVsZW1lbnQpOwoKICAvKioKICAgKiBJbnNlcnRzIGFsbCBvYmplY3RzIG9mIFtpdGVyYWJsZV0gYXQgcG9zaXRpb24gW2luZGV4XSBpbiB0aGlzIGxpc3QuCiAgICoKICAgKiBUaGlzIGluY3JlYXNlcyB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGJ5IHRoZSBsZW5ndGggb2YgW2l0ZXJhYmxlXSBhbmQKICAgKiBzaGlmdHMgYWxsIGxhdGVyIG9iamVjdHMgdG93YXJkcyB0aGUgZW5kIG9mIHRoZSBsaXN0LgogICAqCiAgICogQW4gZXJyb3Igb2NjdXJzIGlmIHRoZSBbaW5kZXhdIGlzIGxlc3MgdGhhbiAwIG9yIGdyZWF0ZXIgdGhhbiBsZW5ndGguCiAgICogQW4gW1Vuc3VwcG9ydGVkRXJyb3JdIG9jY3VycyBpZiB0aGUgbGlzdCBpcyBmaXhlZC1sZW5ndGguCiAgICovCiAgdm9pZCBpbnNlcnRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxFPiBpdGVyYWJsZSk7CgogIC8qKgogICAqIE92ZXJ3cml0ZXMgb2JqZWN0cyBvZiBgdGhpc2Agd2l0aCB0aGUgb2JqZWN0cyBvZiBbaXRlcmFibGVdLCBzdGFydGluZwogICAqIGF0IHBvc2l0aW9uIFtpbmRleF0gaW4gdGhpcyBsaXN0LgogICAqCiAgICogICAgIExpc3Q8U3RyaW5nPiBsaXN0ID0gWydhJywgJ2InLCAnYyddOwogICAqICAgICBsaXN0LnNldEFsbCgxLCBbJ2JlZScsICdzZWEnXSk7CiAgICogICAgIGxpc3Quam9pbignLCAnKTsgLy8gJ2EsIGJlZSwgc2VhJwogICAqCiAgICogVGhpcyBvcGVyYXRpb24gZG9lcyBub3QgaW5jcmVhc2UgdGhlIGxlbmd0aCBvZiBgdGhpc2AuCiAgICoKICAgKiBUaGUgW2luZGV4XSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgbm8gZ3JlYXRlciB0aGFuIFtsZW5ndGhdLgogICAqCiAgICogVGhlIFtpdGVyYWJsZV0gbXVzdCBub3QgaGF2ZSBtb3JlIGVsZW1lbnRzIHRoYW4gd2hhdCBjYW4gZml0IGZyb20gW2luZGV4XQogICAqIHRvIFtsZW5ndGhdLgogICAqCiAgICogSWYgYGl0ZXJhYmxlYCBpcyBiYXNlZCBvbiB0aGlzIGxpc3QsIGl0cyB2YWx1ZXMgbWF5IGNoYW5nZSAvZHVyaW5nLyB0aGUKICAgKiBgc2V0QWxsYCBvcGVyYXRpb24uCiAgICovCiAgdm9pZCBzZXRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxFPiBpdGVyYWJsZSk7CgogIC8qKgogICAqIFJlbW92ZXMgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgW3ZhbHVlXSBmcm9tIHRoaXMgbGlzdC4KICAgKgogICAqIFJldHVybnMgdHJ1ZSBpZiBbdmFsdWVdIHdhcyBpbiB0aGUgbGlzdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAqCiAgICogICAgIExpc3Q8U3RyaW5nPiBwYXJ0cyA9IFsnaGVhZCcsICdzaG91bGRlcnMnLCAna25lZXMnLCAndG9lcyddOwogICAqICAgICBwYXJ0cy5yZW1vdmUoJ2hlYWQnKTsgLy8gdHJ1ZQogICAqICAgICBwYXJ0cy5qb2luKCcsICcpOyAgICAgLy8gJ3Nob3VsZGVycywga25lZXMsIHRvZXMnCiAgICoKICAgKiBUaGUgbWV0aG9kIGhhcyBubyBlZmZlY3QgaWYgW3ZhbHVlXSB3YXMgbm90IGluIHRoZSBsaXN0LgogICAqCiAgICogICAgIC8vIE5vdGU6ICdoZWFkJyBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQuCiAgICogICAgIHBhcnRzLnJlbW92ZSgnaGVhZCcpOyAvLyBmYWxzZQogICAqICAgICBwYXJ0cy5qb2luKCcsICcpOyAgICAgLy8gJ3Nob3VsZGVycywga25lZXMsIHRvZXMnCiAgICoKICAgKiBBbiBbVW5zdXBwb3J0ZWRFcnJvcl0gb2NjdXJzIGlmIHRoZSBsaXN0IGlzIGZpeGVkLWxlbmd0aC4KICAgKi8KICBib29sIHJlbW92ZShPYmplY3QgdmFsdWUpOwoKICAvKioKICAgKiBSZW1vdmVzIHRoZSBvYmplY3QgYXQgcG9zaXRpb24gW2luZGV4XSBmcm9tIHRoaXMgbGlzdC4KICAgKgogICAqIFRoaXMgbWV0aG9kIHJlZHVjZXMgdGhlIGxlbmd0aCBvZiBgdGhpc2AgYnkgb25lIGFuZCBtb3ZlcyBhbGwgbGF0ZXIgb2JqZWN0cwogICAqIGRvd24gYnkgb25lIHBvc2l0aW9uLgogICAqCiAgICogUmV0dXJucyB0aGUgcmVtb3ZlZCBvYmplY3QuCiAgICoKICAgKiBUaGUgW2luZGV4XSBtdXN0IGJlIGluIHRoZSByYW5nZSBgMCDiiaQgaW5kZXggPCBsZW5ndGhgLgogICAqCiAgICogVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXSBpZiB0aGlzIGlzIGEgZml4ZWQtbGVuZ3RoIGxpc3QuIEluIHRoYXQgY2FzZQogICAqIHRoZSBsaXN0IGlzIG5vdCBtb2RpZmllZC4KICAgKi8KICBFIHJlbW92ZUF0KGludCBpbmRleCk7CgogIC8qKgogICAqIFBvcHMgYW5kIHJldHVybnMgdGhlIGxhc3Qgb2JqZWN0IGluIHRoaXMgbGlzdC4KICAgKgogICAqIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0gaWYgdGhpcyBpcyBhIGZpeGVkLWxlbmd0aCBsaXN0LgogICAqLwogIEUgcmVtb3ZlTGFzdCgpOwoKICAvKioKICAgKiBSZW1vdmVzIGFsbCBvYmplY3RzIGZyb20gdGhpcyBsaXN0IHRoYXQgc2F0aXNmeSBbdGVzdF0uCiAgICoKICAgKiBBbiBvYmplY3QgWzpvOl0gc2F0aXNmaWVzIFt0ZXN0XSBpZiBbOnRlc3Qobyk6XSBpcyB0cnVlLgogICAqCiAgICogICAgIExpc3Q8U3RyaW5nPiBudW1iZXJzID0gWydvbmUnLCAndHdvJywgJ3RocmVlJywgJ2ZvdXInXTsKICAgKiAgICAgbnVtYmVycy5yZW1vdmVXaGVyZSgoaXRlbSkgPT4gaXRlbS5sZW5ndGggPT0gMyk7CiAgICogICAgIG51bWJlcnMuam9pbignLCAnKTsgLy8gJ3RocmVlLCBmb3VyJwogICAqCiAgICogVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXSBpZiB0aGlzIGlzIGEgZml4ZWQtbGVuZ3RoIGxpc3QuCiAgICovCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSk7CgogIC8qKgogICAqIFJlbW92ZXMgYWxsIG9iamVjdHMgZnJvbSB0aGlzIGxpc3QgdGhhdCBmYWlsIHRvIHNhdGlzZnkgW3Rlc3RdLgogICAqCiAgICogQW4gb2JqZWN0IFs6bzpdIHNhdGlzZmllcyBbdGVzdF0gaWYgWzp0ZXN0KG8pOl0gaXMgdHJ1ZS4KICAgKgogICAqICAgICBMaXN0PFN0cmluZz4gbnVtYmVycyA9IFsnb25lJywgJ3R3bycsICd0aHJlZScsICdmb3VyJ107CiAgICogICAgIG51bWJlcnMucmV0YWluV2hlcmUoKGl0ZW0pID0+IGl0ZW0ubGVuZ3RoID09IDMpOwogICAqICAgICBudW1iZXJzLmpvaW4oJywgJyk7IC8vICdvbmUsIHR3bycKICAgKgogICAqIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0gaWYgdGhpcyBpcyBhIGZpeGVkLWxlbmd0aCBsaXN0LgogICAqLwogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoaXMgbGlzdCBhbmQgW290aGVyXS4KICAgKgogICAqIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGlzIGxpc3QgZm9sbG93ZWQgYnkKICAgKiB0aGUgZWxlbWVudHMgb2YgW290aGVyXS4KICAgKgogICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJldHVybiBhIG5vcm1hbCBncm93YWJsZSBsaXN0LgogICAqIFNvbWUgbGlzdCB0eXBlcyBtYXkgY2hvb3NlIHRvIHJldHVybiBhIGxpc3Qgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGVtc2VsdmVzCiAgICogKHNlZSBbVWludDhMaXN0LitdKTsKICAgKi8KICBMaXN0PEU+IG9wZXJhdG9yICsoTGlzdDxFPiBvdGhlcik7CgogIC8qKgogICAqIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBlbGVtZW50cyBiZXR3ZWVuIFtzdGFydF0gYW5kIFtlbmRdLgogICAqCiAgICogVGhlIG5ldyBsaXN0IGlzIGEgYExpc3Q8RT5gIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoaXMgbGlzdCBhdAogICAqIHBvc2l0aW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gW3N0YXJ0XSBhbmQgbGVzcyB0aGFuIFtlbmRdIGluIHRoZSBzYW1lCiAgICogb3JkZXIgYXMgdGhleSBvY2N1ciBpbiB0aGlzIGxpc3QuCiAgICoKICAgKiBgYGBkYXJ0CiAgICogdmFyIGNvbG9ycyA9IFsicmVkIiwgImdyZWVuIiwgImJsdWUiLCAib3JhbmdlIiwgInBpbmsiXTsKICAgKiBwcmludChjb2xvcnMuc3VibGlzdCgxLCAzKSk7IC8vIFtncmVlbiwgYmx1ZV0KICAgKiBgYGAKICAgKgogICAqIElmIFtlbmRdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBbbGVuZ3RoXSBvZiB0aGlzIGxpc3QuCiAgICoKICAgKiBgYGBkYXJ0CiAgICogcHJpbnQoY29sb3JzLnN1Ymxpc3QoMSkpOyAvLyBbZ3JlZW4sIGJsdWUsIG9yYW5nZSwgcGlua10KICAgKiBgYGAKICAgKgogICAqIFRoZSBgc3RhcnRgIGFuZCBgZW5kYCBwb3NpdGlvbnMgbXVzdCBzYXRpc2Z5IHRoZSByZWxhdGlvbnMKICAgKiAwIOKJpCBgc3RhcnRgIOKJpCBgZW5kYCDiiaQgYHRoaXMubGVuZ3RoYAogICAqIElmIGBlbmRgIGlzIGVxdWFsIHRvIGBzdGFydGAsIHRoZW4gdGhlIHJldHVybmVkIGxpc3QgaXMgZW1wdHkuCiAgICovCiAgTGlzdDxFPiBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKTsKCiAgLyoqCiAgICogUmV0dXJucyBhbiBbSXRlcmFibGVdIHRoYXQgaXRlcmF0ZXMgb3ZlciB0aGUgb2JqZWN0cyBpbiB0aGUgcmFuZ2UKICAgKiBbc3RhcnRdIGluY2x1c2l2ZSB0byBbZW5kXSBleGNsdXNpdmUuCiAgICoKICAgKiBUaGUgcHJvdmlkZWQgcmFuZ2UsIGdpdmVuIGJ5IFtzdGFydF0gYW5kIFtlbmRdLCBtdXN0IGJlIHZhbGlkIGF0IHRoZSB0aW1lCiAgICogb2YgdGhlIGNhbGwuCiAgICoKICAgKiBBIHJhbmdlIGZyb20gW3N0YXJ0XSB0byBbZW5kXSBpcyB2YWxpZCBpZiBgMCA8PSBzdGFydCA8PSBlbmQgPD0gbGVuYCwgd2hlcmUKICAgKiBgbGVuYCBpcyB0aGlzIGxpc3QncyBgbGVuZ3RoYC4gVGhlIHJhbmdlIHN0YXJ0cyBhdCBgc3RhcnRgIGFuZCBoYXMgbGVuZ3RoCiAgICogYGVuZCAtIHN0YXJ0YC4gQW4gZW1wdHkgcmFuZ2UgKHdpdGggYGVuZCA9PSBzdGFydGApIGlzIHZhbGlkLgogICAqCiAgICogVGhlIHJldHVybmVkIFtJdGVyYWJsZV0gYmVoYXZlcyBsaWtlIGBza2lwKHN0YXJ0KS50YWtlKGVuZCAtIHN0YXJ0KWAuCiAgICogVGhhdCBpcywgaXQgZG9lcyAqbm90KiB0aHJvdyBpZiB0aGlzIGxpc3QgY2hhbmdlcyBzaXplLgogICAqCiAgICogICAgIExpc3Q8U3RyaW5nPiBjb2xvcnMgPSBbJ3JlZCcsICdncmVlbicsICdibHVlJywgJ29yYW5nZScsICdwaW5rJ107CiAgICogICAgIEl0ZXJhYmxlPFN0cmluZz4gcmFuZ2UgPSBjb2xvcnMuZ2V0UmFuZ2UoMSwgNCk7CiAgICogICAgIHJhbmdlLmpvaW4oJywgJyk7ICAvLyAnZ3JlZW4sIGJsdWUsIG9yYW5nZScKICAgKiAgICAgY29sb3JzLmxlbmd0aCA9IDM7CiAgICogICAgIHJhbmdlLmpvaW4oJywgJyk7ICAvLyAnZ3JlZW4sIGJsdWUnCiAgICovCiAgSXRlcmFibGU8RT4gZ2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKTsKCiAgLyoqCiAgICogQ29waWVzIHRoZSBvYmplY3RzIG9mIFtpdGVyYWJsZV0sIHNraXBwaW5nIFtza2lwQ291bnRdIG9iamVjdHMgZmlyc3QsCiAgICogaW50byB0aGUgcmFuZ2UgW3N0YXJ0XSwgaW5jbHVzaXZlLCB0byBbZW5kXSwgZXhjbHVzaXZlLCBvZiB0aGUgbGlzdC4KICAgKgogICAqICAgICBMaXN0PGludD4gbGlzdDEgPSBbMSwgMiwgMywgNF07CiAgICogICAgIExpc3Q8aW50PiBsaXN0MiA9IFs1LCA2LCA3LCA4LCA5XTsKICAgKiAgICAgLy8gQ29waWVzIHRoZSA0dGggYW5kIDV0aCBpdGVtcyBpbiBsaXN0MiBhcyB0aGUgMm5kIGFuZCAzcmQgaXRlbXMKICAgKiAgICAgLy8gb2YgbGlzdDEuCiAgICogICAgIGxpc3QxLnNldFJhbmdlKDEsIDMsIGxpc3QyLCAzKTsKICAgKiAgICAgbGlzdDEuam9pbignLCAnKTsgLy8gJzEsIDgsIDksIDQnCiAgICoKICAgKiBUaGUgcHJvdmlkZWQgcmFuZ2UsIGdpdmVuIGJ5IFtzdGFydF0gYW5kIFtlbmRdLCBtdXN0IGJlIHZhbGlkLgogICAqIEEgcmFuZ2UgZnJvbSBbc3RhcnRdIHRvIFtlbmRdIGlzIHZhbGlkIGlmIGAwIDw9IHN0YXJ0IDw9IGVuZCA8PSBsZW5gLCB3aGVyZQogICAqIGBsZW5gIGlzIHRoaXMgbGlzdCdzIGBsZW5ndGhgLiBUaGUgcmFuZ2Ugc3RhcnRzIGF0IGBzdGFydGAgYW5kIGhhcyBsZW5ndGgKICAgKiBgZW5kIC0gc3RhcnRgLiBBbiBlbXB0eSByYW5nZSAod2l0aCBgZW5kID09IHN0YXJ0YCkgaXMgdmFsaWQuCiAgICoKICAgKiBUaGUgW2l0ZXJhYmxlXSBtdXN0IGhhdmUgZW5vdWdoIG9iamVjdHMgdG8gZmlsbCB0aGUgcmFuZ2UgZnJvbSBgc3RhcnRgCiAgICogdG8gYGVuZGAgYWZ0ZXIgc2tpcHBpbmcgW3NraXBDb3VudF0gb2JqZWN0cy4KICAgKgogICAqIElmIGBpdGVyYWJsZWAgaXMgdGhpcyBsaXN0LCB0aGUgb3BlcmF0aW9uIGNvcGllcyB0aGUgZWxlbWVudHMKICAgKiBvcmlnaW5hbGx5IGluIHRoZSByYW5nZSBmcm9tIGBza2lwQ291bnRgIHRvIGBza2lwQ291bnQgKyAoZW5kIC0gc3RhcnQpYCB0bwogICAqIHRoZSByYW5nZSBgc3RhcnRgIHRvIGBlbmRgLCBldmVuIGlmIHRoZSB0d28gcmFuZ2VzIG92ZXJsYXAuCiAgICoKICAgKiBJZiBgaXRlcmFibGVgIGRlcGVuZHMgb24gdGhpcyBsaXN0IGluIHNvbWUgb3RoZXIgd2F5LCBubyBndWFyYW50ZWVzIGFyZQogICAqIG1hZGUuCiAgICovCiAgdm9pZCBzZXRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlLCBbaW50IHNraXBDb3VudCA9IDBdKTsKCiAgLyoqCiAgICogUmVtb3ZlcyB0aGUgb2JqZWN0cyBpbiB0aGUgcmFuZ2UgW3N0YXJ0XSBpbmNsdXNpdmUgdG8gW2VuZF0gZXhjbHVzaXZlLgogICAqCiAgICogVGhlIHByb3ZpZGVkIHJhbmdlLCBnaXZlbiBieSBbc3RhcnRdIGFuZCBbZW5kXSwgbXVzdCBiZSB2YWxpZC4KICAgKiBBIHJhbmdlIGZyb20gW3N0YXJ0XSB0byBbZW5kXSBpcyB2YWxpZCBpZiBgMCA8PSBzdGFydCA8PSBlbmQgPD0gbGVuYCwgd2hlcmUKICAgKiBgbGVuYCBpcyB0aGlzIGxpc3QncyBgbGVuZ3RoYC4gVGhlIHJhbmdlIHN0YXJ0cyBhdCBgc3RhcnRgIGFuZCBoYXMgbGVuZ3RoCiAgICogYGVuZCAtIHN0YXJ0YC4gQW4gZW1wdHkgcmFuZ2UgKHdpdGggYGVuZCA9PSBzdGFydGApIGlzIHZhbGlkLgogICAqCiAgICogVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXSBpZiB0aGlzIGlzIGEgZml4ZWQtbGVuZ3RoIGxpc3QuIEluIHRoYXQgY2FzZQogICAqIHRoZSBsaXN0IGlzIG5vdCBtb2RpZmllZC4KICAgKi8KICB2b2lkIHJlbW92ZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCk7CgogIC8qKgogICAqIFNldHMgdGhlIG9iamVjdHMgaW4gdGhlIHJhbmdlIFtzdGFydF0gaW5jbHVzaXZlIHRvIFtlbmRdIGV4Y2x1c2l2ZQogICAqIHRvIHRoZSBnaXZlbiBbZmlsbFZhbHVlXS4KICAgKgogICAqIFRoZSBwcm92aWRlZCByYW5nZSwgZ2l2ZW4gYnkgW3N0YXJ0XSBhbmQgW2VuZF0sIG11c3QgYmUgdmFsaWQuCiAgICogQSByYW5nZSBmcm9tIFtzdGFydF0gdG8gW2VuZF0gaXMgdmFsaWQgaWYgYDAgPD0gc3RhcnQgPD0gZW5kIDw9IGxlbmAsIHdoZXJlCiAgICogYGxlbmAgaXMgdGhpcyBsaXN0J3MgYGxlbmd0aGAuIFRoZSByYW5nZSBzdGFydHMgYXQgYHN0YXJ0YCBhbmQgaGFzIGxlbmd0aAogICAqIGBlbmQgLSBzdGFydGAuIEFuIGVtcHR5IHJhbmdlICh3aXRoIGBlbmQgPT0gc3RhcnRgKSBpcyB2YWxpZC4KICAgKi8KICB2b2lkIGZpbGxSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIFtFIGZpbGxWYWx1ZV0pOwoKICAvKioKICAgKiBSZW1vdmVzIHRoZSBvYmplY3RzIGluIHRoZSByYW5nZSBbc3RhcnRdIGluY2x1c2l2ZSB0byBbZW5kXSBleGNsdXNpdmUKICAgKiBhbmQgaW5zZXJ0cyB0aGUgY29udGVudHMgb2YgW3JlcGxhY2VtZW50XSBpbiBpdHMgcGxhY2UuCiAgICoKICAgKiAgICAgTGlzdDxpbnQ+IGxpc3QgPSBbMSwgMiwgMywgNCwgNV07CiAgICogICAgIGxpc3QucmVwbGFjZVJhbmdlKDEsIDQsIFs2LCA3XSk7CiAgICogICAgIGxpc3Quam9pbignLCAnKTsgLy8gJzEsIDYsIDcsIDUnCiAgICoKICAgKiBUaGUgcHJvdmlkZWQgcmFuZ2UsIGdpdmVuIGJ5IFtzdGFydF0gYW5kIFtlbmRdLCBtdXN0IGJlIHZhbGlkLgogICAqIEEgcmFuZ2UgZnJvbSBbc3RhcnRdIHRvIFtlbmRdIGlzIHZhbGlkIGlmIGAwIDw9IHN0YXJ0IDw9IGVuZCA8PSBsZW5gLCB3aGVyZQogICAqIGBsZW5gIGlzIHRoaXMgbGlzdCdzIGBsZW5ndGhgLiBUaGUgcmFuZ2Ugc3RhcnRzIGF0IGBzdGFydGAgYW5kIGhhcyBsZW5ndGgKICAgKiBgZW5kIC0gc3RhcnRgLiBBbiBlbXB0eSByYW5nZSAod2l0aCBgZW5kID09IHN0YXJ0YCkgaXMgdmFsaWQuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIG9uIGZpeGVkLWxlbmd0aCBs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IGZhY3RvcnkgTGlzdC5maWxsZWQoaW50IGxlbmd0aCwgRSBmaWxsLCB7Ym9vbCBncm93YWJsZTogZmFsc2V9KSB7CiAgICAvLyBBbGwgZXJyb3IgaGFuZGxpbmcgb24gdGhlIGxlbmd0aCBwYXJhbWV0ZXIgaXMgZG9uZSBhdCB0aGUgaW1wbGVtZW50YXRpb24KICAgIC8vIG9mIG5ldyBfTGlzdC4KICAgIHZhciByZXN1bHQgPSBncm93YWJsZSA/IG5ldyBfR3Jvd2FibGVMaXN0PEU+KGxlbmd0aCkgOiBuZXcgX0xpc3Q8RT4obGVuZ3RoKTsKICAgIGlmIChmaWxsICE9IG51bGwpIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgIHJlc3VsdFtpXSA9IGZpbGw7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAcGF0Y2gKICBmYWN0b3J5IExpc3QuZnJvbShJdGVyYWJsZSBlbGVtZW50cywge2Jvb2wgZ3Jvd2FibGU6IHRydWV9KSB7CiAgICBpZiAoZWxlbWVudHMgaXMgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGU8RT4pIHsKICAgICAgaW50IGxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDsKICAgICAgdmFyIGxpc3QgPSBncm93YWJsZSA/IG5ldyBfR3Jvd2FibGVMaXN0PEU+KGxlbmd0aCkgOiBuZXcgX0xpc3Q8RT4obGVuZ3RoKTsKICAgICAgaWYgKGxlbmd0aCA+IDApIHsKICAgICAgICAvLyBBdm9pZCBjcmVhdGluZyBpdGVyYXRvciB1bmxlc3MgbmVjZXNzYXJ5LgogICAgICAgIGludCBpID0gMDsKICAgICAgICBmb3IgKHZhciBlbGVtZW50IGluIGVsZW1lbnRzKSB7CiAgICAgICAgICBsaXN0W2krK10gPSBlbGVtZW50OwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbGlzdDsKICAgIH0KICAgIC8vIElmIGVsZW1lbnRzIGlzIGFuIEl0ZXJhYmxlPEU+LCB3ZSB3b24ndCBuZWVkIGEgdHlwZS10ZXN0IGZvciBlYWNoCiAgICAvLyBlbGVtZW50LiBJbiB0aGUgImNvbW1vbiBjYXNlIiB0aGF0IGVsZW1lbnRzIGlzIGFuIEl0ZXJhYmxlPEU+LCB0aGlzCiAgICAvLyByZXBsYWNlcyBhIHR5cGUtdGVzdCBvbiBldmVyeSBlbGVtZW50IHdpdGggYSBzaW5nbGUgdHlwZS10ZXN0IGJlZm9yZQogICAgLy8gc3RhcnRpbmcgdGhlIGxvb3AuCiAgICBpZiAoZWxlbWVudHMgaXMgSXRlcmFibGU8RT4pIHsKICAgICAgTGlzdDxFPiBsaXN0ID0gbmV3IF9Hcm93YWJsZUxpc3Q8RT4oMCk7CiAgICAgIGZvciAoRSBlIGluIGVsZW1lbnRzKSB7CiAgICAgICAgbGlzdC5hZGQoZSk7CiAgICAgIH0KICAgICAgaWYgKGdyb3dhYmxlKSByZXR1cm4gbGlzdDsKICAgICAgcmV0dXJuIG1ha2VMaXN0Rml4ZWRMZW5ndGgobGlzdCk7CiAgICB9IGVsc2UgewogICAgICBMaXN0PEU+IGxpc3QgPSBuZXcgX0dyb3dhYmxlTGlzdDxFPigwKTsKICAgICAgZm9yIChFIGUgaW4gZWxlbWVudHMpIHsKICAgICAgICBsaXN0LmFkZChlKTsKICAgICAgfQogICAgICBpZiAoZ3Jvd2FibGUpIHJldHVybiBsaXN0OwogICAgICByZXR1cm4gbWFrZUxpc3RGaXhlZExlbmd0aChsaXN0KTsKICAgIH0KICB9CgogIEBwYXRjaAogIGZhY3RvcnkgTGlzdC51bm1vZGlmaWFibGUoSXRlcmFibGUgZWxlbWVudHMpIHsKICAgIGZpbmFsIHJlc3VsdCA9IG5ldyBMaXN0PEU+LmZyb20oZWxlbWVudHMsIGdyb3dhYmxlOiBmYWxzZSk7CiAgICByZXR1cm4gbWFrZUZpeGVkTGlzdFVubW9kaWZpYWJsZShyZXN1bHQpOwogIH0KCiAgLy8gRmFjdG9yeSBjb25zdHJ1Y3RpbmcgYSBtdXRhYmxlIExpc3QgZnJvbSBhIHBhcnNlciBnZW5lcmF0ZWQgTGlzdCBsaXRlcmFsLgogIC8vIFtlbGVtZW50c10gY29udGFpbnMgZWxlbWVudHMgdGhhdCBhcmUgYWxyZWFkeSB0eXBlIGNoZWNrZWQuCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCiAgZmFjdG9yeSBMaXN0Ll9mcm9tTGl0ZXJhbChMaXN0IGVsZW1lbnRzKSB7CiAgICBpZiAoZWxlbWVudHMuaXNFbXB0eSkgewogICAgICByZXR1cm4gbmV3IF9Hcm93YWJsZUxpc3Q8RT4oMCk7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gbmV3IF9Hcm93YWJsZUxpc3Q8RT4ud2l0aERhdGEoZWxlbWVudHMpOwogICAgcmVzdWx0Ll9zZXRMZW5ndGgoZWxlbWVudHMubGVuZ3RoKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9Ck8ATk48AR4BBxAJMAEJRFAVURgpGggGEwQBCUAyJFEYNRMoHwoIEwZJS0waIy4eFQghKA0uHhUIISgGBAEJMUAuBAFPQSQtHCYGOigTBAIBIGRhcnQ6Y29yZS1wYXRjaC9hcnJheV9wYXRjaC5kYXJ0KW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL21hcC5kYXJ0tGcvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogQSBjb2xsZWN0aW9uIG9mIGtleS92YWx1ZSBwYWlycywgZnJvbSB3aGljaCB5b3UgcmV0cmlldmUgYSB2YWx1ZQogKiB1c2luZyBpdHMgYXNzb2NpYXRlZCBrZXkuCiAqCiAqIFRoZXJlIGlzIGEgZmluaXRlIG51bWJlciBvZiBrZXlzIGluIHRoZSBtYXAsCiAqIGFuZCBlYWNoIGtleSBoYXMgZXhhY3RseSBvbmUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGl0LgogKgogKiBNYXBzLCBhbmQgdGhlaXIga2V5cyBhbmQgdmFsdWVzLCBjYW4gYmUgaXRlcmF0ZWQuCiAqIFRoZSBvcmRlciBvZiBpdGVyYXRpb24gaXMgZGVmaW5lZCBieSB0aGUgaW5kaXZpZHVhbCB0eXBlIG9mIG1hcC4KICogRXhhbXBsZXM6CiAqCiAqICogVGhlIHBsYWluIFtIYXNoTWFwXSBpcyB1bm9yZGVyZWQgKG5vIG9yZGVyIGlzIGd1YXJhbnRlZWQpLAogKiAqIHRoZSBbTGlua2VkSGFzaE1hcF0gaXRlcmF0ZXMgaW4ga2V5IGluc2VydGlvbiBvcmRlciwKICogKiBhbmQgYSBzb3J0ZWQgbWFwIGxpa2UgW1NwbGF5VHJlZU1hcF0gaXRlcmF0ZXMgdGhlIGtleXMgaW4gc29ydGVkIG9yZGVyLgogKgogKiBJdCBpcyBnZW5lcmFsbHkgbm90IGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBtYXAgKGFkZCBvciByZW1vdmUga2V5cykgd2hpbGUKICogYW4gb3BlcmF0aW9uIGlzIGJlaW5nIHBlcmZvcm1lZCBvbiB0aGUgbWFwLCBmb3IgZXhhbXBsZSBpbiBmdW5jdGlvbnMgY2FsbGVkCiAqIGR1cmluZyBhIFtmb3JFYWNoXSBvciBbcHV0SWZBYnNlbnRdIGNhbGwuCiAqIE1vZGlmeWluZyB0aGUgbWFwIHdoaWxlIGl0ZXJhdGluZyB0aGUga2V5cyBvciB2YWx1ZXMKICogbWF5IGFsc28gYnJlYWsgdGhlIGl0ZXJhdGlvbi4KICoKICogSXQgaXMgZ2VuZXJhbGx5IG5vdCBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgZXF1YWxpdHkgb2Yga2V5cyAoYW5kIHRodXMgbm90CiAqIHRoZWlyIGhhc2hjb2RlKSB3aGlsZSB0aGV5IGFyZSBpbiB0aGUgbWFwLiBTb21lIHNwZWNpYWxpemVkIHN1YnR5cGVzIG1heSBiZQogKiBtb3JlIHBlcm1pc3NpdmUsIGluIHdoaWNoIGNhc2UgdGhleSBzaG91bGQgZG9jdW1lbnQgdGhpcyBiZWhhdmlvci4KICovCmFic3RyYWN0IGNsYXNzIE1hcDxLLCBWPiB7CiAgLyoqCiAgICogQ3JlYXRlcyBhIE1hcCBpbnN0YW5jZSB3aXRoIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLCBbTGlua2VkSGFzaE1hcF0uCiAgICoKICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIGVxdWl2YWxlbnQgdG8gdGhlIG5vbi1jb25zdCBtYXAgbGl0ZXJhbCBgPEssVj57fWAuCiAgICoKICAgKiBBIGBMaW5rZWRIYXNoTWFwYCByZXF1aXJlcyB0aGUga2V5cyB0byBpbXBsZW1lbnQgY29tcGF0aWJsZQogICAqIGBvcGVyYXRvcj09YCBhbmQgYGhhc2hDb2RlYCwgYW5kIGl0IGFsbG93cyBudWxsIGFzIGEga2V5LgogICAqIEl0IGl0ZXJhdGVzIGluIGtleSBpbnNlcnRpb24gb3JkZXIuCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBNYXAoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtMaW5rZWRIYXNoTWFwXSBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIGFsbCBrZXkvdmFsdWUgcGFpcnMgb2YKICAgKiBbb3RoZXJdLgogICAqCiAgICogVGhlIGtleXMgbXVzdCBhbGwgYmUgaW5zdGFuY2VzIG9mIFtLXSBhbmQgdGhlIHZhbHVlcyBvZiBbVl0uCiAgICogVGhlIFtvdGhlcl0gbWFwIGl0c2VsZiBjYW4gaGF2ZSBhbnkgdHlwZS4KICAgKgogICAqIEEgYExpbmtlZEhhc2hNYXBgIHJlcXVpcmVzIHRoZSBrZXlzIHRvIGltcGxlbWVudCBjb21wYXRpYmxlCiAgICogYG9wZXJhdG9yPT1gIGFuZCBgaGFzaENvZGVgLCBhbmQgaXQgYWxsb3dzIGBudWxsYCBhcyBhIGtleS4KICAgKiBJdCBpdGVyYXRlcyBpbiBrZXkgaW5zZXJ0aW9uIG9yZGVyLgogICAqLwogIGZhY3RvcnkgTWFwLmZyb20oTWFwIG90aGVyKSA9IExpbmtlZEhhc2hNYXA8SywgVj4uZnJvbTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtMaW5rZWRIYXNoTWFwXSB3aXRoIHRoZSBzYW1lIGtleXMgYW5kIHZhbHVlcyBhcyBbb3RoZXJdLgogICAqCiAgICogQSBgTGlua2VkSGFzaE1hcGAgcmVxdWlyZXMgdGhlIGtleXMgdG8gaW1wbGVtZW50IGNvbXBhdGlibGUKICAgKiBgb3BlcmF0b3I9PWAgYW5kIGBoYXNoQ29kZWAsIGFuZCBpdCBhbGxvd3MgYG51bGxgIGFzIGEga2V5LgogICAqIEl0IGl0ZXJhdGVzIGluIGtleSBpbnNlcnRpb24gb3JkZXIuCiAgICovCiAgZmFjdG9yeSBNYXAub2YoTWFwPEssIFY+IG90aGVyKSA9IExpbmtlZEhhc2hNYXA8SywgVj4ub2Y7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gdW5tb2RpZmlhYmxlIGhhc2ggYmFzZWQgbWFwIGNvbnRhaW5pbmcgdGhlIGVudHJpZXMgb2YgW290aGVyXS4KICAgKgogICAqIFRoZSBrZXlzIG11c3QgYWxsIGJlIGluc3RhbmNlcyBvZiBbS10gYW5kIHRoZSB2YWx1ZXMgb2YgW1ZdLgogICAqIFRoZSBbb3RoZXJdIG1hcCBpdHNlbGYgY2FuIGhhdmUgYW55IHR5cGUuCiAgICoKICAgKiBUaGUgbWFwIHJlcXVpcmVzIHRoZSBrZXlzIHRvIGltcGxlbWVudCBjb21wYXRpYmxlCiAgICogYG9wZXJhdG9yPT1gIGFuZCBgaGFzaENvZGVgLCBhbmQgaXQgYWxsb3dzIGBudWxsYCBhcyBhIGtleS4KICAgKiBUaGUgY3JlYXRlZCBtYXAgaXRlcmF0ZXMga2V5cyBpbiBhIGZpeGVkIG9yZGVyLAogICAqIHByZXNlcnZpbmcgdGhlIG9yZGVyIHByb3ZpZGVkIGJ5IFtvdGhlcl0uCiAgICoKICAgKiBUaGUgcmVzdWx0aW5nIG1hcCBiZWhhdmVzIGxpa2UgdGhlIHJlc3VsdCBvZiBbTWFwLmZyb21dLAogICAqIGV4Y2VwdCB0aGF0IHRoZSBtYXAgcmV0dXJuZWQgYnkgdGhpcyBjb25zdHJ1Y3RvciBpcyBub3QgbW9kaWZpYWJsZS4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IE1hcC51bm1vZGlmaWFibGUoTWFwIG90aGVyKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBpZGVudGl0eSBtYXAgd2l0aCB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiwgW0xpbmtlZEhhc2hNYXBdLgogICAqCiAgICogQW4gaWRlbnRpdHkgbWFwIHVzZXMgW2lkZW50aWNhbF0gZm9yIGVxdWFsaXR5IGFuZCBbaWRlbnRpdHlIYXNoQ29kZV0KICAgKiBmb3IgaGFzaCBjb2RlcyBvZiBrZXlzIGluc3RlYWQgb2YgdGhlIGludHJpbnNpYyBbT2JqZWN0Lm9wZXJhdG9yPT1dIGFuZAogICAqIFtPYmplY3QuaGFzaENvZGVdIG9mIHRoZSBrZXlzLgogICAqCiAgICogVGhlIHJldHVybmVkIG1hcCBhbGxvd3MgYG51bGxgIGFzIGEga2V5LgogICAqIEl0IGl0ZXJhdGVzIGluIGtleSBpbnNlcnRpb24gb3JkZXIuCiAgICovCiAgZmFjdG9yeSBNYXAuaWRlbnRpdHkoKSA9IExpbmtlZEhhc2hNYXA8SywgVj4uaWRlbnRpdHk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBNYXAgaW5zdGFuY2UgaW4gd2hpY2ggdGhlIGtleXMgYW5kIHZhbHVlcyBhcmUgY29tcHV0ZWQgZnJvbSB0aGUKICAgKiBbaXRlcmFibGVdLgogICAqCiAgICogVGhlIGNyZWF0ZWQgbWFwIGlzIGEgW0xpbmtlZEhhc2hNYXBdLgogICAqIEEgYExpbmtlZEhhc2hNYXBgIHJlcXVpcmVzIHRoZSBrZXlzIHRvIGltcGxlbWVudCBjb21wYXRpYmxlCiAgICogYG9wZXJhdG9yPT1gIGFuZCBgaGFzaENvZGVgLCBhbmQgaXQgYWxsb3dzIG51bGwgYXMgYSBrZXkuCiAgICogSXQgaXRlcmF0ZXMgaW4ga2V5IGluc2VydGlvbiBvcmRlci4KICAgKgogICAqIEZvciBlYWNoIGVsZW1lbnQgb2YgdGhlIFtpdGVyYWJsZV0gdGhpcyBjb25zdHJ1Y3RvciBjb21wdXRlcyBhIGtleS92YWx1ZQogICAqIHBhaXIsIGJ5IGFwcGx5aW5nIFtrZXldIGFuZCBbdmFsdWVdIHJlc3BlY3RpdmVseS4KICAgKgogICAqIFRoZSBleGFtcGxlIGJlbG93IGNyZWF0ZXMgYSBuZXcgTWFwIGZyb20gYSBMaXN0LiBUaGUga2V5cyBvZiBgbWFwYCBhcmUKICAgKiBgbGlzdGAgdmFsdWVzIGNvbnZlcnRlZCB0byBzdHJpbmdzLCBhbmQgdGhlIHZhbHVlcyBvZiB0aGUgYG1hcGAgYXJlIHRoZQogICAqIHNxdWFyZXMgb2YgdGhlIGBsaXN0YCB2YWx1ZXM6CiAgICoKICAgKiAgICAgTGlzdDxpbnQ+IGxpc3QgPSBbMSwgMiwgM107CiAgICogICAgIE1hcDxTdHJpbmcsIGludD4gbWFwID0gbmV3IE1hcC5mcm9tSXRlcmFibGUobGlzdCwKICAgKiAgICAgICAgIGtleTogKGl0ZW0pID0+IGl0ZW0udG9TdHJpbmcoKSwKICAgKiAgICAgICAgIHZhbHVlOiAoaXRlbSkgPT4gaXRlbSAqIGl0ZW0pOwogICAqCiAgICogICAgIG1hcFsnMSddICsgbWFwWycyJ107IC8vIDEgKyA0CiAgICogICAgIG1hcFsnMyddIC0gbWFwWycyJ107IC8vIDkgLSA0CiAgICoKICAgKiBJZiBubyB2YWx1ZXMgYXJlIHNwZWNpZmllZCBmb3IgW2tleV0gYW5kIFt2YWx1ZV0gdGhlIGRlZmF1bHQgaXMgdGhlCiAgICogaWRlbnRpdHkgZnVuY3Rpb24uCiAgICoKICAgKiBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHRoZSBrZXlzIGFuZCBjb3JyZXNwb25kaW5nIHZhbHVlcyBvZiBgbWFwYAogICAqIGFyZSBgbGlzdGAgdmFsdWVzOgogICAqCiAgICogICAgIG1hcCA9IG5ldyBNYXAuZnJvbUl0ZXJhYmxlKGxpc3QpOwogICAqICAgICBtYXBbMV0gKyBtYXBbMl07IC8vIDEgKyAyCiAgICogICAgIG1hcFszXSAtIG1hcFsyXTsgLy8gMyAtIDIKICAgKgogICAqIFRoZSBrZXlzIGNvbXB1dGVkIGJ5IHRoZSBzb3VyY2UgW2l0ZXJhYmxlXSBkbyBub3QgbmVlZCB0byBiZSB1bmlxdWUuIFRoZQogICAqIGxhc3Qgb2NjdXJyZW5jZSBvZiBhIGtleSB3aWxsIHNpbXBseSBvdmVyd3JpdGUgYW55IHByZXZpb3VzIHZhbHVlLgogICAqLwogIGZhY3RvcnkgTWFwLmZyb21JdGVyYWJsZShJdGVyYWJsZSBpdGVyYWJsZSwKICAgICAge0sga2V5KGVsZW1lbnQpLCBWIHZhbHVlKGVsZW1lbnQpfSkgPSBMaW5rZWRIYXNoTWFwPEssIFY+LmZyb21JdGVyYWJsZTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIE1hcCBpbnN0YW5jZSBhc3NvY2lhdGluZyB0aGUgZ2l2ZW4gW2tleXNdIHRvIFt2YWx1ZXNdLgogICAqCiAgICogVGhlIGNyZWF0ZWQgbWFwIGlzIGEgW0xpbmtlZEhhc2hNYXBdLgogICAqIEEgYExpbmtlZEhhc2hNYXBgIHJlcXVpcmVzIHRoZSBrZXlzIHRvIGltcGxlbWVudCBjb21wYXRpYmxlCiAgICogYG9wZXJhdG9yPT1gIGFuZCBgaGFzaENvZGVgLCBhbmQgaXQgYWxsb3dzIG51bGwgYXMgYSBrZXkuCiAgICogSXQgaXRlcmF0ZXMgaW4ga2V5IGluc2VydGlvbiBvcmRlci4KICAgKgogICAqIFRoaXMgY29uc3RydWN0b3IgaXRlcmF0ZXMgb3ZlciBba2V5c10gYW5kIFt2YWx1ZXNdIGFuZCBtYXBzIGVhY2ggZWxlbWVudCBvZgogICAqIFtrZXlzXSB0byB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIFt2YWx1ZXNdLgogICAqCiAgICogICAgIExpc3Q8U3RyaW5nPiBsZXR0ZXJzID0gWydiJywgJ2MnXTsKICAgKiAgICAgTGlzdDxTdHJpbmc+IHdvcmRzID0gWydiYWQnLCAnY2F0J107CiAgICogICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gbmV3IE1hcC5mcm9tSXRlcmFibGVzKGxldHRlcnMsIHdvcmRzKTsKICAgKiAgICAgbWFwWydiJ10gKyBtYXBbJ2MnXTsgIC8vIGJhZGNhdAogICAqCiAgICogSWYgW2tleXNdIGNvbnRhaW5zIHRoZSBzYW1lIG9iamVjdCBtdWx0aXBsZSB0aW1lcywgdGhlIGxhc3Qgb2NjdXJyZW5jZQogICAqIG92ZXJ3cml0ZXMgdGhlIHByZXZpb3VzIHZhbHVlLgogICAqCiAgICogVGhlIHR3byBbSXRlcmFibGVdcyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoLgogICAqLwogIGZhY3RvcnkgTWFwLmZyb21JdGVyYWJsZXMoSXRlcmFibGU8Sz4ga2V5cywgSXRlcmFibGU8Vj4gdmFsdWVzKSA9CiAgICAgIExpbmtlZEhhc2hNYXA8SywgVj4uZnJvbUl0ZXJhYmxlczsKCiAgLyoqCiAgICogQWRhcHRzIFtzb3VyY2VdIHRvIGJlIGEgYE1hcDxLMiwgVjI+YC4KICAgKgogICAqIEFueSB0aW1lIHRoZSBzZXQgd291bGQgcHJvZHVjZSBhIGtleSBvciB2YWx1ZSB0aGF0IGlzIG5vdCBhIFtLMl0gb3IgW1YyXSwKICAgKiB0aGUgYWNjZXNzIHdpbGwgdGhyb3cuCiAgICoKICAgKiBBbnkgdGltZSBbSzJdIGtleSBvciBbVjJdIHZhbHVlIGlzIGF0dGVtcHRlZCBhZGRlZCBpbnRvIHRoZSBhZGFwdGVkIG1hcCwKICAgKiB0aGUgc3RvcmUgd2lsbCB0aHJvdyB1bmxlc3MgdGhlIGtleSBpcyBhbHNvIGFuIGluc3RhbmNlIG9mIFtLXSBhbmQKICAgKiB0aGUgdmFsdWUgaXMgYWxzbyBhbiBpbnN0YW5jZSBvZiBbVl0uCiAgICoKICAgKiBJZiBhbGwgYWNjZXNzZWQgZW50cmllcyBvZiBbc291cmNlXSBhcmUgaGF2ZSBbSzJdIGtleXMgYW5kIFtWMl0gdmFsdWVzCiAgICogYW5kIGlmIGFsbCBlbnRyaWVzIGFkZGVkIHRvIHRoZSByZXR1cm5lZCBtYXAgaGF2ZSBbS10ga2V5cyBhbmQgW1ZdXSB2YWx1ZXMsCiAgICogdGhlbiB0aGUgcmV0dXJuZWQgbWFwIGNhbiBiZSB1c2VkIGFzIGEgYE1hcDxLMiwgVjI+YC4KICAgKi8KICBzdGF0aWMgTWFwPEsyLCBWMj4gY2FzdEZyb208SywgViwgSzIsIFYyPihNYXA8SywgVj4gc291cmNlKSA9PgogICAgICBDYXN0TWFwPEssIFYsIEsyLCBWMj4oc291cmNlKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBtYXAgYW5kIGFkZHMgYWxsIGVudHJpZXMuCiAgICoKICAgKiBSZXR1cm5zIGEgbmV3IGBNYXA8SywgVj5gIHdoZXJlIGFsbCBlbnRyaWVzIG9mIFtlbnRyaWVzXQogICAqIGhhdmUgYmVlbiBhZGRlZCBpbiBpdGVyYXRpb24gb3JkZXIuCiAgICoKICAgKiBJZiBtdWx0aXBsZSBbZW50cmllc10gaGF2ZSB0aGUgc2FtZSBrZXksCiAgICogbGF0ZXIgb2NjdXJyZW5jZXMgb3ZlcndyaXRlIHRoZSBlYXJsaWVyIG9uZXMuCiAgICovCiAgZmFjdG9yeSBNYXAuZnJvbUVudHJpZXMoSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IGVudHJpZXMpID0+CiAgICAgIDxLLCBWPnt9Li5hZGRFbnRyaWVzKGVudHJpZXMpOwoKICAvKioKICAgKiBQcm92aWRlcyBhIHZpZXcgb2YgdGhpcyBtYXAgYXMgaGF2aW5nIFtSS10ga2V5cyBhbmQgW1JWXSBpbnN0YW5jZXMsCiAgICogaWYgbmVjZXNzYXJ5LgogICAqCiAgICogSWYgdGhpcyBtYXAgaXMgYWxyZWFkeSBhIGBNYXA8UkssIFJWPmAsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KICAgKgogICAqIElmIHRoaXMgc2V0IGNvbnRhaW5zIG9ubHkga2V5cyBvZiB0eXBlIFtSS10gYW5kIHZhbHVlcyBvZiB0eXBlIFtSVl0sCiAgICogYWxsIHJlYWQgb3BlcmF0aW9ucyB3aWxsIHdvcmsgY29ycmVjdGx5LgogICAqIElmIGFueSBvcGVyYXRpb24gZXhwb3NlcyBhIG5vbi1bUktdIGtleSBvciBub24tW1JWXSB2YWx1ZSwKICAgKiB0aGUgb3BlcmF0aW9uIHdpbGwgdGhyb3cgaW5zdGVhZC4KICAgKgogICAqIEVudHJpZXMgYWRkZWQgdG8gdGhlIG1hcCBtdXN0IGJlIHZhbGlkIGZvciBib3RoIGEgYE1hcDxLLCBWPmAgYW5kIGEKICAgKiBgTWFwPFJLLCBSVj5gLgogICAqLwogIE1hcDxSSywgUlY+IGNhc3Q8UkssIFJWPigpOwogIC8qKgogICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1hcCBjb250YWlucyB0aGUgZ2l2ZW4gW3ZhbHVlXS4KICAgKgogICAqIFJldHVybnMgdHJ1ZSBpZiBhbnkgb2YgdGhlIHZhbHVlcyBpbiB0aGUgbWFwIGFyZSBlcXVhbCB0byBgdmFsdWVgCiAgICogYWNjb3JkaW5nIHRvIHRoZSBgPT1gIG9wZXJhdG9yLgogICAqLwogIGJvb2wgY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpOwoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBtYXAgY29udGFpbnMgdGhlIGdpdmVuIFtrZXldLgogICAqCiAgICogUmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGUga2V5cyBpbiB0aGUgbWFwIGFyZSBlcXVhbCB0byBga2V5YAogICAqIGFjY29yZGluZyB0byB0aGUgZXF1YWxpdHkgdXNlZCBieSB0aGUgbWFwLgogICAqLwogIGJvb2wgY29udGFpbnNLZXkoT2JqZWN0IGtleSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gW2tleV0gb3IgbnVsbCBpZiBba2V5XSBpcyBub3QgaW4gdGhlIG1hcC4KICAgKgogICAqIFNvbWUgbWFwcyBhbGxvdyBrZXlzIHRvIGhhdmUgYG51bGxgIGFzIGEgdmFsdWUuCiAgICogRm9yIHRob3NlIG1hcHMsIGEgbG9va3VwIHVzaW5nIHRoaXMgb3BlcmF0b3IgY2Fubm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gYQogICAqIGtleSBub3QgYmVpbmcgaW4gdGhlIG1hcCBhbmQgdGhlIGtleSBoYXZpbmcgYSBgbnVsbGAgdmFsdWUuCiAgICogTWV0aG9kcyBsaWtlIFtjb250YWluc0tleV0gb3IgW3B1dElmQWJzZW50XSBjYW4gYmUgdXNlZCBpZiB0aGUgZGlzdGluY3Rpb24KICAgKiBpcyBpbXBvcnRhbnQuCiAgICovCiAgViBvcGVyYXRvciBbXShPYmplY3Qga2V5KTsKCiAgLyoqCiAgICogQXNzb2NpYXRlcyB0aGUgW2tleV0gd2l0aCB0aGUgZ2l2ZW4gW3ZhbHVlXS4KICAgKgogICAqIElmIHRoZSBrZXkgd2FzIGFscmVhZHkgaW4gdGhlIG1hcCwgaXRzIGFzc29jaWF0ZWQgdmFsdWUgaXMgY2hhbmdlZC4KICAgKiBPdGhlcndpc2UgdGhlIGtleS92YWx1ZSBwYWlyIGlzIGFkZGVkIHRvIHRoZSBtYXAuCiAgICovCiAgdm9pZCBvcGVyYXRvciBbXT0oSyBrZXksIFYgdmFsdWUpOwoKICAvKioKICAgKiBUaGUgbWFwIGVudHJpZXMgb2YgW3RoaXNdLgogICAqLwogIEl0ZXJhYmxlPE1hcEVudHJ5PEssIFY+PiBnZXQgZW50cmllczsKCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBtYXAgd2hlcmUgYWxsIGVudHJpZXMgb2YgdGhpcyBtYXAgYXJlIHRyYW5zZm9ybWVkIGJ5CiAgICogdGhlIGdpdmVuIFtmXSBmdW5jdGlvbi4KICAgKi8KICBNYXA8SzIsIFYyPiBtYXA8SzIsIFYyPihNYXBFbnRyeTxLMiwgVjI+IGYoSyBrZXksIFYgdmFsdWUpKTsKCiAgLyoqCiAgICogQWRkcyBhbGwga2V5L3ZhbHVlIHBhaXJzIG9mIFtuZXdFbnRyaWVzXSB0byB0aGlzIG1hcC4KICAgKgogICAqIElmIGEga2V5IG9mIFtuZXdFbnRyaWVzXSBpcyBhbHJlYWR5IGluIHRoaXMgbWFwLAogICAqIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGlzIG92ZXJ3cml0dGVuLgogICAqCiAgICogVGhlIG9wZXJhdGlvbiBpcyBlcXVpdmFsZW50IHRvIGRvaW5nIGB0aGlzW2VudHJ5LmtleV0gPSBlbnRyeS52YWx1ZWAKICAgKiBmb3IgZWFjaCBbTWFwRW50cnldIG9mIHRoZSBpdGVyYWJsZS4KICAgKi8KICB2b2lkIGFkZEVudHJpZXMoSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IG5ld0VudHJpZXMpOwoKICAvKioKICAgKiBVcGRhdGVzIHRoZSB2YWx1ZSBmb3IgdGhlIHByb3ZpZGVkIFtrZXldLgogICAqCiAgICogUmV0dXJucyB0aGUgbmV3IHZhbHVlIG9mIHRoZSBrZXkuCiAgICoKICAgKiBJZiB0aGUga2V5IGlzIHByZXNlbnQsIGludm9rZXMgW3VwZGF0ZV0gd2l0aCB0aGUgY3VycmVudCB2YWx1ZSBhbmQgc3RvcmVzCiAgICogdGhlIG5ldyB2YWx1ZSBpbiB0aGUgbWFwLgogICAqCiAgICogSWYgdGhlIGtleSBpcyBub3QgcHJlc2VudCBhbmQgW2lmQWJzZW50XSBpcyBwcm92aWRlZCwgY2FsbHMgW2lmQWJzZW50XQogICAqIGFuZCBhZGRzIHRoZSBrZXkgd2l0aCB0aGUgcmV0dXJuZWQgdmFsdWUgdG8gdGhlIG1hcC4KICAgKgogICAqIEl0J3MgYW4gZXJyb3IgaWYgdGhlIGtleSBpcyBub3QgcHJlc2VudCBhbmQgW2lmQWJzZW50XSBpcyBub3QgcHJvdmlkZWQuCiAgICovCiAgViB1cGRhdGUoSyBrZXksIFYgdXBkYXRlKFYgdmFsdWUpLCB7ViBpZkFic2VudCgpfSk7CgogIC8qKgogICAqIFVwZGF0ZXMgYWxsIHZhbHVlcy4KICAgKgogICAqIEl0ZXJhdGVzIG92ZXIgYWxsIGVudHJpZXMgaW4gdGhlIG1hcCBhbmQgdXBkYXRlcyB0aGVtIHdpdGggdGhlIHJlc3VsdAogICAqIG9mIGludm9raW5nIFt1cGRhdGVdLgogICAqLwogIHZvaWQgdXBkYXRlQWxsKFYgdXBkYXRlKEsga2V5LCBWIHZhbHVlKSk7CgogIC8qKgogICAqIFJlbW92ZXMgYWxsIGVudHJpZXMgb2YgdGhpcyBtYXAgdGhhdCBzYXRpc2Z5IHRoZSBnaXZlbiBbcHJlZGljYXRlXS4KICAgKi8KICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgcHJlZGljYXRlKEsga2V5LCBWIHZhbHVlKSk7CgogIC8qKgogICAqIExvb2sgdXAgdGhlIHZhbHVlIG9mIFtrZXldLCBvciBhZGQgYSBuZXcgdmFsdWUgaWYgaXQgaXNuJ3QgdGhlcmUuCiAgICoKICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHRvIFtrZXldLCBpZiB0aGVyZSBpcyBvbmUuCiAgICogT3RoZXJ3aXNlIGNhbGxzIFtpZkFic2VudF0gdG8gZ2V0IGEgbmV3IHZhbHVlLCBhc3NvY2lhdGVzIFtrZXldIHRvCiAgICogdGhhdCB2YWx1ZSwgYW5kIHRoZW4gcmV0dXJucyB0aGUgbmV3IHZhbHVlLgogICAqCiAgICogICAgIE1hcDxTdHJpbmcsIGludD4gc2NvcmVzID0geydCb2InOiAzNn07CiAgICogICAgIGZvciAodmFyIGtleSBpbiBbJ0JvYicsICdSb2hhbicsICdTb3BoZW5hJ10pIHsKICAgKiAgICAgICBzY29yZXMucHV0SWZBYnNlbnQoa2V5LCAoKSA9PiBrZXkubGVuZ3RoKTsKICAgKiAgICAgfQogICAqICAgICBzY29yZXNbJ0JvYiddOyAgICAgIC8vIDM2CiAgICogICAgIHNjb3Jlc1snUm9oYW4nXTsgICAgLy8gIDUKICAgKiAgICAgc2NvcmVzWydTb3BoZW5hJ107ICAvLyAgNwogICAqCiAgICogQ2FsbGluZyBbaWZBYnNlbnRdIG11c3Qgbm90IGFkZCBvciByZW1vdmUga2V5cyBmcm9tIHRoZSBtYXAuCiAgICovCiAgViBwdXRJZkFic2VudChLIGtleSwgViBpZkFic2VudCgpKTsKCiAgLyoqCiAgICogQWRkcyBhbGwga2V5L3ZhbHVlIHBhaXJzIG9mIFtvdGhlcl0gdG8gdGhpcyBtYXAuCiAgICoKICAgKiBJZiBhIGtleSBvZiBbb3RoZXJdIGlzIGFscmVhZHkgaW4gdGhpcyBtYXAsIGl0cyB2YWx1ZSBpcyBvdmVyd3JpdHRlbi4KICAgKgogICAqIFRoZSBvcGVyYXRpb24gaXMgZXF1aXZhbGVudCB0byBkb2luZyBgdGhpc1trZXldID0gdmFsdWVgIGZvciBlYWNoIGtleQogICAqIGFuZCBhc3NvY2lhdGVkIHZhbHVlIGluIG90aGVyLiBJdCBpdGVyYXRlcyBvdmVyIFtvdGhlcl0sIHdoaWNoIG11c3QKICAgKiB0aGVyZWZvcmUgbm90IGNoYW5nZSBkdXJpbmcgdGhlIGl0ZXJhdGlvbi4KICAgKi8KICB2b2lkIGFkZEFsbChNYXA8SywgVj4gb3RoZXIpOwoKICAvKioKICAgKiBSZW1vdmVzIFtrZXldIGFuZCBpdHMgYXNzb2NpYXRlZCB2YWx1ZSwgaWYgcHJlc2VudCwgZnJvbSB0aGUgbWFwLgogICAqCiAgICogUmV0dXJucyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGBrZXlgIGJlZm9yZSBpdCB3YXMgcmVtb3ZlZC4KICAgKiBSZXR1cm5zIGBudWxsYCBpZiBga2V5YCB3YXMgbm90IGluIHRoZSBtYXAuCiAgICoKICAgKiBOb3RlIHRoYXQgdmFsdWVzIGNhbiBiZSBgbnVsbGAgYW5kIGEgcmV0dXJuZWQgYG51bGxgIHZhbHVlIGRvZXNuJ3QKICAgKiBhbHdheXMgbWVhbiB0aGF0IHRoZSBrZXkgd2FzIGFic2VudC4KICAgKi8KICBWIHJlbW92ZShPYmplY3Qga2V5KTsKCiAgLyoqCiAgICogUmVtb3ZlcyBhbGwgcGFpcnMgZnJvbSB0aGUgbWFwLgogICAqCiAgICogQWZ0ZXIgdGhpcywgdGhlIG1hcCBpcyBlbXB0eS4KICAgKi8KICB2b2lkIGNsZWFyKCk7CgogIC8qKgogICAqIEFwcGxpZXMgW2ZdIHRvIGVhY2gga2V5L3ZhbHVlIHBhaXIgb2YgdGhlIG1hcC4KICAgKgogICAqIENhbGxpbmcgYGZgIG11c3Qgbm90IGFkZCBvciByZW1vdmUga2V5cyBmcm9tIHRoZSBtYXAuCiAgICovCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihLIGtleSwgViB2YWx1ZSkpOwoKICAvKioKICAgKiBUaGUga2V5cyBvZiBbdGhpc10uCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgaXRlcmFibGUgaGFzIGVmZmljaWVudCBgbGVuZ3RoYCBhbmQgYGNvbnRhaW5zYCBvcGVyYXRpb25zLAogICAqIGJhc2VkIG9uIFtsZW5ndGhdIGFuZCBbY29udGFpbnNLZXldIG9mIHRoZSBtYXAuCiAgICoKICAgKiBUaGUgb3JkZXIgb2YgaXRlcmF0aW9uIGlzIGRlZmluZWQgYnkgdGhlIGluZGl2aWR1YWwgYE1hcGAgaW1wbGVtZW50YXRpb24sCiAgICogYnV0IG11c3QgYmUgY29uc2lzdGVudCBiZXR3ZWVuIGNoYW5nZXMgdG8gdGhlIG1hcC4KICAgKgogICAqIE1vZGlmeWluZyB0aGUgbWFwIHdoaWxlIGl0ZXJhdGluZyB0aGUga2V5cwogICAqIG1heSBicmVhayB0aGUgaXRlcmF0aW9uLgogICAqLwogIEl0ZXJhYmxlPEs+IGdldCBrZXlzOwoKICAvKioKICAgKiBUaGUgdmFsdWVzIG9mIFt0aGlzXS4KICAgKgogICAqIFRoZSB2YWx1ZXMgYXJlIGl0ZXJhdGVkIGluIHRoZSBvcmRlciBvZiB0aGVpciBjb3JyZXNwb25kaW5nIGtleXMuCiAgICogVGhpcyBtZWFucyB0aGF0IGl0ZXJhdGluZyBba2V5c10gYW5kIFt2YWx1ZXNdIGluIHBhcmFsbGVsIHdpbGwKICAgKiBwcm92aWRlIG1hdGNoaW5nIHBhaXJzIG9mIGtleXMgYW5kIHZhbHVlcy4KICAgKgogICAqIFRoZSByZXR1cm5lZCBpdGVyYWJsZSBoYXMgYW4gZWZmaWNpZW50IGBsZW5ndGhgIG1ldGhvZCBiYXNlZCBvbiB0aGUKICAgKiBbbGVuZ3RoXSBvZiB0aGUgbWFwLiBJdHMgW0l0ZXJhYmxlLmNvbnRhaW5zXSBtZXRob2QgaXMgYmFzZWQgb24KICAgKiBgPT1gIGNvbXBhcmlzb24uCiAgICoKICAgKiBNb2RpZnlpbmcgdGhlIG1hcCB3aGlsZSBpdGVyYXRpbmcgdGhlCiAgICogdmFsdWVzIG1heSBicmVhayB0aGUgaXRlcmF0aW9uLgogICAqLwogIEl0ZXJhYmxlPFY+IGdldCB2YWx1ZXM7CgogIC8qKgogICAqIFRoZSBudW1iZXIgb2Yga2V5L3ZhbHVlIHBhaXJzIGluIHRoZSBtYXAuCiAgICovCiAgaW50IGdldCBsZW5ndGg7CgogIC8qKgogICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBubyBrZXkvdmFsdWUgcGFpciBpbiB0aGUgbWFwLgogICAqLwogIGJvb2wgZ2V0IGlzRW1wdHk7CgogIC8qKgogICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUga2V5L3ZhbHVlIHBhaXIgaW4gdGhlIG1hcC4KICAgKi8KICBib29sIGdldCBpc05vdEVtcHR5Owp9CgovKioKICogQSBrZXkvdmFsdWUgcGFpciByZXByZXNlbnRpbmcgYW4gZW50cnkgaW4gYSBbTWFwXS4KICovCmNsYXNzIE1hcEVudHJ5PEssIFY+IHsKICAvKiogVGhlIGtleSBvZiB0aGUgZW50cnkuICovCiAgZmluYWwgSyBrZXk7CgogIC8qKiBUaGUgdmFsdWUgYXNzb2NpYXRlZCB0byBba2V5XSBpbiB0aGUgbWFwLiAqLwogIGZpbmFsIFYgdmFsdWU7CgogIC8qKiBDcmVhdGVzIGFuIGVudHJ5IHdpdGggW2tleV0gYW5kIFt2YWx1ZV0uICovCiAgY29uc3QgZmFjdG9yeSBNYXBFbnRyeShLIGtleSwgViB2YWx1ZSkgPSBNYXBFbnRyeTxLLCBWPi5fOwoKICBjb25zdCBNYXBFbnRyeS5fKHRoaXMua2V5LCB0aGlzLnZhbHVlKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIk1hcEVudHJ5KCRrZXk6ICR2YWx1ZSkiOwp9CoGWAE5OPAETAQREHQMwOgM1RA0DQDpNA0xPLTghA0xPRgQbBk4FTAVBPykGGgEGTQ4FQi8FQUEpBjoBBkkFQUEpBjwBBk8FQi8FN0E1LwU+SQYwAQZPBUpNJAUuKQY5AQZPEQUrQT8pBU43BUxNIwUlOy0sBScnBUkYBUoYBSsjIwVOSAYuTgEGRgUrQT8pBVE2BSwuSikFTCQFNAZEKQEGLAVPHAVOSCsFTFE7BkElAQYtBT4pBS4zBj8lAQZJEwVHBUouQCcFSRQGHgY6BUclBiQBBjgFQzAGIAEGTwU1T0FQEwYdAQYyBUk3BiUBBiAGKAEGSB0GPwEGOwU2LQVKKgY4AQYvBScFTx8FTDoFTQY2AQYZBUsbBiwBBkkGNAEGRwU9SDEFMDg2CyMjIwVCBiYBBjYFSwVLSTAGIAEGRwVEMQVIKgYYAQYlBSMGEAEGNAU7BigBBhkFTTUFTzgFMB4GGAEGGwVHRDAFSUUWBSslBhoBBi8GEgEGPAYUAQZGBhcCAQQ2BBcfDwEzEQEyPQEqATECARJkYXJ0OmNvcmUvbWFwLmRhcnQub3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi9tYXBfcGF0Y2guZGFydIPhLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvcmVfcGF0Y2guZGFydCI7CgpAcGF0Y2gKY2xhc3MgTWFwPEssIFY+IHsKICAvLyBGYWN0b3J5IGNvbnN0cnVjdGluZyBhIE1hcCBmcm9tIGEgcGFyc2VyIGdlbmVyYXRlZCBNYXAgbGl0ZXJhbC4KICAvLyBbZWxlbWVudHNdIGNvbnRhaW5zIG4ga2V5LXZhbHVlIHBhaXJzLgogIC8vIFRoZSBrZXlzIGFyZSBhdCBwb3NpdGlvbiAyKm4gYW5kIGFyZSBhbHJlYWR5IHR5cGUgY2hlY2tlZCBieSB0aGUgcGFyc2VyCiAgLy8gaW4gY2hlY2tlZCBtb2RlLgogIC8vIFRoZSB2YWx1ZXMgYXJlIGF0IHBvc2l0aW9uIDIqbisxIGFuZCBhcmUgbm90IHlldCB0eXBlIGNoZWNrZWQuCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCiAgZmFjdG9yeSBNYXAuX2Zyb21MaXRlcmFsKExpc3QgZWxlbWVudHMpIHsKICAgIHZhciBtYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxLLCBWPigpOwogICAgdmFyIGxlbiA9IGVsZW1lbnRzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuOyBpICs9IDIpIHsKICAgICAgbWFwW2VsZW1lbnRzW2kgLSAxXV0gPSBlbGVtZW50c1tpXTsKICAgIH0KICAgIHJldHVybiBtYXA7CiAgfQoKICBAcGF0Y2gKICBmYWN0b3J5IE1hcC51bm1vZGlmaWFibGUoTWFwIG90aGVyKSB7CiAgICByZXR1cm4gbmV3IFVubW9kaWZpYWJsZU1hcFZpZXc8SywgVj4obmV3IE1hcDxLLCBWPi5mcm9tKG90aGVyKSk7CiAgfQoKICBAcGF0Y2gKICBmYWN0b3J5IE1hcCgpID0+IG5ldyBMaW5rZWRIYXNoTWFwPEssIFY+KCk7Cn0KIQBOTjwBHgEHEkUsTRZEJCwpHycqBhAEAQkoRQQBCS4CAR5kYXJ0OmNvcmUtcGF0Y2gvbWFwX3BhdGNoLmRhcnQqb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvbnVsbC5kYXJ0gqAvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogVGhlIHJlc2VydmVkIHdvcmQgWzpudWxsOl0gZGVub3RlcyBhbiBvYmplY3QgdGhhdCBpcyB0aGUgc29sZSBpbnN0YW5jZSBvZiAKICogdGhpcyBjbGFzcy4KICogCiAqIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGZvciBhIGNsYXNzIHRvIGF0dGVtcHQgdG8gZXh0ZW5kIG9yIGltcGxlbWVudAogKiBOdWxsLgogKi8KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBOdWxsIHsKICBmYWN0b3J5IE51bGwuX3VuaW5zdGFudGlhYmxlKCkgewogICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcignY2xhc3MgTnVsbCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkJyk7CiAgfQoKICBleHRlcm5hbCBpbnQgZ2V0IGhhc2hDb2RlOwoKICAvKiogUmV0dXJucyB0aGUgc3RyaW5nIGAibnVsbCJgLiAqLwogIFN0cmluZyB0b1N0cmluZygpID0+ICJudWxsIjsKfQoaAE5OPAETAQRODwRMCQQaDSNBBAEdASYfAgETZGFydDpjb3JlL251bGwuZGFydC9vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL251bGxfcGF0Y2guZGFydIHOLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvcmVfcGF0Y2guZGFydCI7CgpAcGF0Y2gKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBOdWxsIHsKICBzdGF0aWMgY29uc3QgX0hBU0hfQ09ERSA9IDIwMTE7IC8vIFRoZSB5ZWFyIERhcnQgd2FzIGFubm91bmNlZCBhbmQgYSBwcmltZS4KCiAgQHBhdGNoCiAgaW50IGdldCBoYXNoQ29kZSA9PiBfSEFTSF9DT0RFOwoKICBpbnQgZ2V0IF9pZGVudGl0eUhhc2hDb2RlID0+IF9IQVNIX0NPREU7Cn0KEgBOTjwBHgEHGg1OAQkiASsCAR9kYXJ0OmNvcmUtcGF0Y2gvbnVsbF9wYXRjaC5kYXJ0KW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL251bS5kYXJ0wABE1i8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCi8qKgogKiBBbiBpbnRlZ2VyIG9yIGZsb2F0aW5nLXBvaW50IG51bWJlci4KICoKICogSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgZm9yIGFueSB0eXBlIG90aGVyIHRoYW4gW2ludF0gb3IgW2RvdWJsZV0KICogdG8gYXR0ZW1wdCB0byBleHRlbmQgb3IgaW1wbGVtZW50IG51bS4KICovCmFic3RyYWN0IGNsYXNzIG51bSBpbXBsZW1lbnRzIENvbXBhcmFibGU8bnVtPiB7CiAgLyoqCiAgICogVGVzdCB3aGV0aGVyIHRoaXMgdmFsdWUgaXMgbnVtZXJpY2FsbHkgZXF1YWwgdG8gYG90aGVyYC4KICAgKgogICAqIElmIGJvdGggb3BlcmFuZHMgYXJlIGRvdWJsZXMsIHRoZXkgYXJlIGVxdWFsIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZQogICAqIHJlcHJlc2VudGF0aW9uLCBleGNlcHQgdGhhdDoKICAgKgogICAqICAgKiB6ZXJvIGFuZCBtaW51cyB6ZXJvICgwLjAgYW5kIC0wLjApIGFyZSBjb25zaWRlcmVkIGVxdWFsLiBUaGV5CiAgICogICAgIGJvdGggaGF2ZSB0aGUgbnVtZXJpY2FsIHZhbHVlIHplcm8uCiAgICogICAqIE5hTiBpcyBub3QgZXF1YWwgdG8gYW55dGhpbmcsIGluY2x1ZGluZyBOYU4uIElmIGVpdGhlciBvcGVyYW5kIGlzCiAgICogICAgIE5hTiwgdGhlIHJlc3VsdCBpcyBhbHdheXMgZmFsc2UuCiAgICoKICAgKiBJZiBvbmUgb3BlcmFuZCBpcyBhIGRvdWJsZSBhbmQgdGhlIG90aGVyIGlzIGFuIGludCwgdGhleSBhcmUgZXF1YWwgaWYKICAgKiB0aGUgZG91YmxlIGhhcyBhbiBpbnRlZ2VyIHZhbHVlIChmaW5pdGUgd2l0aCBubyBmcmFjdGlvbmFsIHBhcnQpIGFuZAogICAqIGBpZGVudGljYWwoZG91YmxlVmFsdWUudG9JbnQoKSwgaW50VmFsdWUpYCBpcyB0cnVlLgogICAqCiAgICogSWYgYm90aCBvcGVyYW5kcyBhcmUgaW50ZWdlcnMsIHRoZXkgYXJlIGVxdWFsIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSB2YWx1ZS4KICAgKgogICAqIFJldHVybnMgZmFsc2UgaWYgYG90aGVyYCBpcyBub3QgYSBbbnVtXS4KICAgKgogICAqIE5vdGljZSB0aGF0IHRoZSBiZWhhdmlvciBmb3IgTmFOIGlzIG5vbi1yZWZsZXhpdmUuIFRoaXMgbWVhbnMgdGhhdAogICAqIGVxdWFsaXR5IG9mIGRvdWJsZSB2YWx1ZXMgaXMgbm90IGEgcHJvcGVyIGVxdWFsaXR5IHJlbGF0aW9uLCBhcyBpcwogICAqIG90aGVyd2lzZSByZXF1aXJlZCBvZiBgb3BlcmF0b3I9PWAuIFVzaW5nIE5hTiBpbiwgZS5nLiwgYSBbSGFzaFNldF0KICAgKiB3aWxsIGZhaWwgdG8gd29yay4gVGhlIGJlaGF2aW9yIGlzIHRoZSBzdGFuZGFyZCBJRUVFLTc1NCBlcXVhbGl0eSBvZgogICAqIGRvdWJsZXMuCiAgICoKICAgKiBJZiB5b3UgY2FuIGF2b2lkIE5hTiB2YWx1ZXMsIHRoZSByZW1haW5pbmcgZG91YmxlcyBkbyBoYXZlIGEgcHJvcGVyCiAgICogZXF1YWxpdHkgcmVsYXRpb24sIGFuZCBjYW4gYmUgdXNlZCBzYWZlbHkuCiAgICoKICAgKiBVc2UgW2NvbXBhcmVUb10gZm9yIGEgY29tcGFyaXNvbiB0aGF0IGRpc3Rpbmd1aXNoZXMgemVybyBhbmQgbWludXMgemVybywKICAgKiBhbmQgdGhhdCBjb25zaWRlcnMgTmFOIHZhbHVlcyBhcyBlcXVhbC4KICAgKi8KICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcik7CgogIC8qKgogICAqIFJldHVybnMgYSBoYXNoIGNvZGUgZm9yIGEgbnVtZXJpY2FsIHZhbHVlLgogICAqCiAgICogVGhlIGhhc2ggY29kZSBpcyBjb21wYXRpYmxlIHdpdGggZXF1YWxpdHkuIEl0IHJldHVybnMgdGhlIHNhbWUgdmFsdWUKICAgKiBmb3IgYW4gW2ludF0gYW5kIGEgW2RvdWJsZV0gd2l0aCB0aGUgc2FtZSBudW1lcmljYWwgdmFsdWUsIGFuZCB0aGVyZWZvcmUKICAgKiB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhlIGRvdWJsZXMgemVybyBhbmQgbWludXMgemVyby4KICAgKgogICAqIE5vIGd1YXJhbnRlZXMgYXJlIG1hZGUgYWJvdXQgdGhlIGhhc2ggY29kZSBvZiBOYU4gdmFsdWVzLgogICAqLwogIGludCBnZXQgaGFzaENvZGU7CgogIC8qKgogICAqIENvbXBhcmVzIHRoaXMgdG8gYG90aGVyYC4KICAgKgogICAqIFJldHVybnMgYSBuZWdhdGl2ZSBudW1iZXIgaWYgYHRoaXNgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLCB6ZXJvIGlmIHRoZXkgYXJlCiAgICogZXF1YWwsIGFuZCBhIHBvc2l0aXZlIG51bWJlciBpZiBgdGhpc2AgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAuCiAgICoKICAgKiBUaGUgb3JkZXJpbmcgcmVwcmVzZW50ZWQgYnkgdGhpcyBtZXRob2QgaXMgYSB0b3RhbCBvcmRlcmluZyBvZiBbbnVtXQogICAqIHZhbHVlcy4gQWxsIGRpc3RpbmN0IGRvdWJsZXMgYXJlIG5vbi1lcXVhbCwgYXMgYXJlIGFsbCBkaXN0aW5jdCBpbnRlZ2VycywKICAgKiBidXQgaW50ZWdlcnMgYXJlIGVxdWFsIHRvIGRvdWJsZXMgaWYgdGhleSBoYXZlIHRoZSBzYW1lIG51bWVyaWNhbAogICAqIHZhbHVlLgogICAqCiAgICogRm9yIGRvdWJsZXMsIHRoZSBgY29tcGFyZVRvYCBvcGVyYXRpb24gaXMgZGlmZmVyZW50IGZyb20gdGhlIHBhcnRpYWwKICAgKiBvcmRlcmluZyBnaXZlbiBieSBbb3BlcmF0b3I9PV0sIFtvcGVyYXRvcjxdIGFuZCBbb3BlcmF0b3I+XS4gRm9yIGV4YW1wbGUsCiAgICogSUVFRSBkb3VibGVzIGltcG9zZSB0aGF0IGAwLjAgPT0gLTAuMGAgYW5kIGFsbCBjb21wYXJpc29uIG9wZXJhdGlvbnMgb24KICAgKiBOYU4gcmV0dXJuIGZhbHNlLgogICAqCiAgICogVGhpcyBmdW5jdGlvbiBpbXBvc2VzIGEgY29tcGxldGUgb3JkZXJpbmcgZm9yIGRvdWJsZXMuIFdoZW4gdXNpbmcKICAgKiBgY29tcGFyZVRvYCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgaG9sZDoKICAgKgogICAqIC0gQWxsIE5hTiB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgZXF1YWwsIGFuZCBncmVhdGVyIHRoYW4gYW55IG51bWVyaWMgdmFsdWUuCiAgICogLSAtMC4wIGlzIGxlc3MgdGhhbiAwLjAgKGFuZCB0aGUgaW50ZWdlciAwKSwgYnV0IGdyZWF0ZXIgdGhhbiBhbnkgbm9uLXplcm8KICAgKiAgICBuZWdhdGl2ZSB2YWx1ZS4KICAgKiAtIE5lZ2F0aXZlIGluZmluaXR5IGlzIGxlc3MgdGhhbiBhbGwgb3RoZXIgdmFsdWVzIGFuZCBwb3NpdGl2ZSBpbmZpbml0eSBpcwogICAqICAgZ3JlYXRlciB0aGFuIGFsbCBub24tTmFOIHZhbHVlcy4KICAgKiAtIEFsbCBvdGhlciB2YWx1ZXMgYXJlIGNvbXBhcmVkIHVzaW5nIHRoZWlyIG51bWVyaWMgdmFsdWUuCiAgICoKICAgKiBFeGFtcGxlczoKICAgKiBgYGAKICAgKiBwcmludCgxLmNvbXBhcmVUbygyKSk7IC8vID0+IC0xCiAgICogcHJpbnQoMi5jb21wYXJlVG8oMSkpOyAvLyA9PiAxCiAgICogcHJpbnQoMS5jb21wYXJlVG8oMSkpOyAvLyA9PiAwCiAgICoKICAgKiAvLyBUaGUgZm9sbG93aW5nIGNvbXBhcmlzb25zIHlpZWxkIGRpZmZlcmVudCByZXN1bHRzIHRoYW4gdGhlCiAgICogLy8gY29ycmVzcG9uZGluZyBjb21wYXJpc29uIG9wZXJhdG9ycy4KICAgKiBwcmludCgoLTAuMCkuY29tcGFyZVRvKDAuMCkpOyAgLy8gPT4gLTEKICAgKiBwcmludChkb3VibGUubmFuLmNvbXBhcmVUbyhkb3VibGUubmFuKSk7ICAvLyA9PiAwCiAgICogcHJpbnQoZG91YmxlLmluZmluaXR5LmNvbXBhcmVUbyhkb3VibGUubmFuKSk7IC8vID0+IC0xCiAgICoKICAgKiAvLyAtMC4wLCBhbmQgTmFOIGNvbXBhcmlzb24gb3BlcmF0b3JzIGhhdmUgcnVsZXMgaW1wb3NlZCBieSB0aGUgSUVFRQogICAqIC8vIHN0YW5kYXJkLgogICAqIHByaW50KC0wLjAgPT0gMC4wKTsgLy8gPT4gdHJ1ZQogICAqIHByaW50KGRvdWJsZS5uYW4gPT0gZG91YmxlLm5hbik7ICAvLyA9PiBmYWxzZQogICAqIHByaW50KGRvdWJsZS5pbmZpbml0eSA8IGRvdWJsZS5uYW4pOyAgLy8gPT4gZmFsc2UKICAgKiBwcmludChkb3VibGUubmFuIDwgZG91YmxlLmluZmluaXR5KTsgIC8vID0+IGZhbHNlCiAgICogcHJpbnQoZG91YmxlLm5hbiA9PSBkb3VibGUuaW5maW5pdHkpOyAgLy8gPT4gZmFsc2UKICAgKiBgYGAKICAgKi8KICBpbnQgY29tcGFyZVRvKG51bSBvdGhlcik7CgogIC8qKiBBZGRpdGlvbiBvcGVyYXRvci4gKi8KICBudW0gb3BlcmF0b3IgKyhudW0gb3RoZXIpOwoKICAvKiogU3VidHJhY3Rpb24gb3BlcmF0b3IuICovCiAgbnVtIG9wZXJhdG9yIC0obnVtIG90aGVyKTsKCiAgLyoqIE11bHRpcGxpY2F0aW9uIG9wZXJhdG9yLiAqLwogIG51bSBvcGVyYXRvciAqKG51bSBvdGhlcik7CgogIC8qKgogICAqIEV1Y2xpZGVhbiBtb2R1bG8gb3BlcmF0b3IuCiAgICoKICAgKiBSZXR1cm5zIHRoZSByZW1haW5kZXIgb2YgdGhlIEV1Y2xpZGVhbiBkaXZpc2lvbi4gVGhlIEV1Y2xpZGVhbiBkaXZpc2lvbiBvZgogICAqIHR3byBpbnRlZ2VycyBgYWAgYW5kIGBiYCB5aWVsZHMgdHdvIGludGVnZXJzIGBxYCBhbmQgYHJgIHN1Y2ggdGhhdAogICAqIGBhID09IGIgKiBxICsgcmAgYW5kIGAwIDw9IHIgPCBiLmFicygpYC4KICAgKgogICAqIFRoZSBFdWNsaWRlYW4gZGl2aXNpb24gaXMgb25seSBkZWZpbmVkIGZvciBpbnRlZ2VycywgYnV0IGNhbiBiZSBlYXNpbHkKICAgKiBleHRlbmRlZCB0byB3b3JrIHdpdGggZG91Ymxlcy4gSW4gdGhhdCBjYXNlIGByYCBtYXkgaGF2ZSBhIG5vbi1pbnRlZ2VyCiAgICogdmFsdWUsIGJ1dCBpdCBzdGlsbCB2ZXJpZmllcyBgMCA8PSByIDwgfGJ8YC4KICAgKgogICAqIFRoZSBzaWduIG9mIHRoZSByZXR1cm5lZCB2YWx1ZSBgcmAgaXMgYWx3YXlzIHBvc2l0aXZlLgogICAqCiAgICogU2VlIFtyZW1haW5kZXJdIGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSB0cnVuY2F0aW5nIGRpdmlzaW9uLgogICAqLwogIG51bSBvcGVyYXRvciAlKG51bSBvdGhlcik7CgogIC8qKiBEaXZpc2lvbiBvcGVyYXRvci4gKi8KICBkb3VibGUgb3BlcmF0b3IgLyhudW0gb3RoZXIpOwoKICAvKioKICAgKiBUcnVuY2F0aW5nIGRpdmlzaW9uIG9wZXJhdG9yLgogICAqCiAgICogSWYgZWl0aGVyIG9wZXJhbmQgaXMgYSBbZG91YmxlXSB0aGVuIHRoZSByZXN1bHQgb2YgdGhlIHRydW5jYXRpbmcgZGl2aXNpb24KICAgKiBgYSB+LyBiYCBpcyBlcXVpdmFsZW50IHRvIGAoYSAvIGIpLnRydW5jYXRlKCkudG9JbnQoKWAuCiAgICoKICAgKiBJZiBib3RoIG9wZXJhbmRzIGFyZSBbaW50XXMgdGhlbiBgYSB+LyBiYCBwZXJmb3JtcyB0aGUgdHJ1bmNhdGluZwogICAqIGludGVnZXIgZGl2aXNpb24uCiAgICovCiAgaW50IG9wZXJhdG9yIH4vKG51bSBvdGhlcik7CgogIC8qKiBOZWdhdGUgb3BlcmF0b3IuICovCiAgbnVtIG9wZXJhdG9yIC0oKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIHRoZSB0cnVuY2F0aW5nIGRpdmlzaW9uIG9mIGB0aGlzYCBieSBbb3RoZXJdLgogICAqCiAgICogVGhlIHJlc3VsdCBgcmAgb2YgdGhpcyBvcGVyYXRpb24gc2F0aXNmaWVzOgogICAqIGB0aGlzID09ICh0aGlzIH4vIG90aGVyKSAqIG90aGVyICsgcmAuCiAgICogQXMgYSBjb25zZXF1ZW5jZSB0aGUgcmVtYWluZGVyIGByYCBoYXMgdGhlIHNhbWUgc2lnbiBhcyB0aGUgZGl2aWRlciBgdGhpc2AuCiAgICovCiAgbnVtIHJlbWFpbmRlcihudW0gb3RoZXIpOwoKICAvKiogUmVsYXRpb25hbCBsZXNzIHRoYW4gb3BlcmF0b3IuICovCiAgYm9vbCBvcGVyYXRvciA8KG51bSBvdGhlcik7CgogIC8qKiBSZWxhdGlvbmFsIGxlc3MgdGhhbiBvciBlcXVhbCBvcGVyYXRvci4gKi8KICBib29sIG9wZXJhdG9yIDw9KG51bSBvdGhlcik7CgogIC8qKiBSZWxhdGlvbmFsIGdyZWF0ZXIgdGhhbiBvcGVyYXRvci4gKi8KICBib29sIG9wZXJhdG9yID4obnVtIG90aGVyKTsKCiAgLyoqIFJlbGF0aW9uYWwgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIG9wZXJhdG9yLiAqLwogIGJvb2wgb3BlcmF0b3IgPj0obnVtIG90aGVyKTsKCiAgLyoqIFRydWUgaWYgdGhlIG51bWJlciBpcyB0aGUgZG91YmxlIE5vdC1hLU51bWJlciB2YWx1ZTsgb3RoZXJ3aXNlLCBmYWxzZS4gKi8KICBib29sIGdldCBpc05hTjsKCiAgLyoqCiAgICogVHJ1ZSBpZiB0aGUgbnVtYmVyIGlzIG5lZ2F0aXZlOyBvdGhlcndpc2UsIGZhbHNlLgogICAqCiAgICogTmVnYXRpdmUgbnVtYmVycyBhcmUgdGhvc2UgbGVzcyB0aGFuIHplcm8sIGFuZCB0aGUgZG91YmxlIGAtMC4wYC4KICAgKi8KICBib29sIGdldCBpc05lZ2F0aXZlOwoKICAvKioKICAgKiBUcnVlIGlmIHRoZSBudW1iZXIgaXMgcG9zaXRpdmUgaW5maW5pdHkgb3IgbmVnYXRpdmUgaW5maW5pdHk7IG90aGVyd2lzZSwKICAgKiBmYWxzZS4KICAgKi8KICBib29sIGdldCBpc0luZmluaXRlOwoKICAvKioKICAgKiBUcnVlIGlmIHRoZSBudW1iZXIgaXMgZmluaXRlOyBvdGhlcndpc2UsIGZhbHNlLgogICAqCiAgICogVGhlIG9ubHkgbm9uLWZpbml0ZSBudW1iZXJzIGFyZSBOYU4sIHBvc2l0aXZlIGluZmluaXR5LCBhbmQKICAgKiBuZWdhdGl2ZSBpbmZpbml0eS4KICAgKi8KICBib29sIGdldCBpc0Zpbml0ZTsKCiAgLyoqIFJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoaXMgW251bV0uICovCiAgbnVtIGFicygpOwoKICAvKioKICAgKiBSZXR1cm5zIG1pbnVzIG9uZSwgemVybyBvciBwbHVzIG9uZSBkZXBlbmRpbmcgb24gdGhlIHNpZ24gYW5kCiAgICogbnVtZXJpY2FsIHZhbHVlIG9mIHRoZSBudW1iZXIuCiAgICoKICAgKiBSZXR1cm5zIG1pbnVzIG9uZSBpZiB0aGUgbnVtYmVyIGlzIGxlc3MgdGhhbiB6ZXJvLAogICAqIHBsdXMgb25lIGlmIHRoZSBudW1iZXIgaXMgZ3JlYXRlciB0aGFuIHplcm8sCiAgICogYW5kIHplcm8gaWYgdGhlIG51bWJlciBpcyBlcXVhbCB0byB6ZXJvLgogICAqCiAgICogUmV0dXJucyBOYU4gaWYgdGhlIG51bWJlciBpcyB0aGUgZG91YmxlIE5hTiB2YWx1ZS4KICAgKgogICAqIFJldHVybnMgYSBudW1iZXIgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGlzIG51bWJlci4KICAgKiBGb3IgZG91YmxlcywgYC0wLjAuc2lnbiA9PSAtMC4wYC4KCiAgICogVGhlIHJlc3VsdCBzYXRpc2ZpZXM6CiAgICoKICAgKiAgICAgbiA9PSBuLnNpZ24gKiBuLmFicygpCiAgICoKICAgKiBmb3IgYWxsIG51bWJlcnMgYG5gIChleGNlcHQgTmFOLCBiZWNhdXNlIE5hTiBpc24ndCBgPT1gIHRvIGl0c2VsZikuCiAgICovCiAgbnVtIGdldCBzaWduOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIGNsb3Nlc3QgdG8gYHRoaXNgLgogICAqCiAgICogUm91bmRzIGF3YXkgZnJvbSB6ZXJvIHdoZW4gdGhlcmUgaXMgbm8gY2xvc2VzdCBpbnRlZ2VyOgogICAqICBgKDMuNSkucm91bmQoKSA9PSA0YCBhbmQgYCgtMy41KS5yb3VuZCgpID09IC00YC4KICAgKgogICAqIElmIGB0aGlzYCBpcyBub3QgZmluaXRlIChgTmFOYCBvciBpbmZpbml0eSksIHRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0uCiAgICovCiAgaW50IHJvdW5kKCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGdyZWF0ZXN0IGludGVnZXIgbm8gZ3JlYXRlciB0aGFuIGB0aGlzYC4KICAgKgogICAqIElmIGB0aGlzYCBpcyBub3QgZmluaXRlIChgTmFOYCBvciBpbmZpbml0eSksIHRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0uCiAgICovCiAgaW50IGZsb29yKCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGxlYXN0IGludGVnZXIgbm8gc21hbGxlciB0aGFuIGB0aGlzYC4KICAgKgogICAqIElmIGB0aGlzYCBpcyBub3QgZmluaXRlIChgTmFOYCBvciBpbmZpbml0eSksIHRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0uCiAgICovCiAgaW50IGNlaWwoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgaW50ZWdlciBvYnRhaW5lZCBieSBkaXNjYXJkaW5nIGFueSBmcmFjdGlvbmFsCiAgICogZGlnaXRzIGZyb20gYHRoaXNgLgogICAqCiAgICogSWYgYHRoaXNgIGlzIG5vdCBmaW5pdGUgKGBOYU5gIG9yIGluZmluaXR5KSwgdGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXS4KICAgKi8KICBpbnQgdHJ1bmNhdGUoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZG91YmxlIGludGVnZXIgdmFsdWUgY2xvc2VzdCB0byBgdGhpc2AuCiAgICoKICAgKiBSb3VuZHMgYXdheSBmcm9tIHplcm8gd2hlbiB0aGVyZSBpcyBubyBjbG9zZXN0IGludGVnZXI6CiAgICogIGAoMy41KS5yb3VuZFRvRG91YmxlKCkgPT0gNGAgYW5kIGAoLTMuNSkucm91bmRUb0RvdWJsZSgpID09IC00YC4KICAgKgogICAqIElmIHRoaXMgaXMgYWxyZWFkeSBhbiBpbnRlZ2VyIHZhbHVlZCBkb3VibGUsIGluY2x1ZGluZyBgLTAuMGAsIG9yIGl0IGlzIGEKICAgKiBub24tZmluaXRlIGRvdWJsZSB2YWx1ZSwgdGhlIHZhbHVlIGlzIHJldHVybmVkIHVubW9kaWZpZWQuCiAgICoKICAgKiBGb3IgdGhlIHB1cnBvc2Ugb2Ygcm91bmRpbmcsIGAtMC4wYCBpcyBjb25zaWRlcmVkIHRvIGJlIGJlbG93IGAwLjBgLAogICAqIGFuZCBgLTAuMGAgaXMgdGhlcmVmb3JlIGNvbnNpZGVyZWQgY2xvc2VyIHRvIG5lZ2F0aXZlIG51bWJlcnMgdGhhbiBgMC4wYC4KICAgKiBUaGlzIG1lYW5zIHRoYXQgZm9yIGEgdmFsdWUsIGBkYCBpbiB0aGUgcmFuZ2UgYC0wLjUgPCBkIDwgMC4wYCwKICAgKiB0aGUgcmVzdWx0IGlzIGAtMC4wYC4KICAgKgogICAqIFRoZSByZXN1bHQgaXMgYWx3YXlzIGEgZG91YmxlLgogICAqIElmIHRoaXMgaXMgYSBudW1lcmljYWxseSBsYXJnZSBpbnRlZ2VyLCB0aGUgcmVzdWx0IG1heSBiZSBhbiBpbmZpbml0ZQogICAqIGRvdWJsZS4KICAgKi8KICBkb3VibGUgcm91bmRUb0RvdWJsZSgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBncmVhdGVzdCBkb3VibGUgaW50ZWdlciB2YWx1ZSBubyBncmVhdGVyIHRoYW4gYHRoaXNgLgogICAqCiAgICogSWYgdGhpcyBpcyBhbHJlYWR5IGFuIGludGVnZXIgdmFsdWVkIGRvdWJsZSwgaW5jbHVkaW5nIGAtMC4wYCwgb3IgaXQgaXMgYQogICAqIG5vbi1maW5pdGUgZG91YmxlIHZhbHVlLCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQgdW5tb2RpZmllZC4KICAgKgogICAqIEZvciB0aGUgcHVycG9zZSBvZiByb3VuZGluZywgYC0wLjBgIGlzIGNvbnNpZGVyZWQgdG8gYmUgYmVsb3cgYDAuMGAuCiAgICogQSBudW1iZXIgYGRgIGluIHRoZSByYW5nZSBgMC4wIDwgZCA8IDEuMGAgd2lsbCByZXR1cm4gYDAuMGAuCiAgICoKICAgKiBUaGUgcmVzdWx0IGlzIGFsd2F5cyBhIGRvdWJsZS4KICAgKiBJZiB0aGlzIGlzIGEgbnVtZXJpY2FsbHkgbGFyZ2UgaW50ZWdlciwgdGhlIHJlc3VsdCBtYXkgYmUgYW4gaW5maW5pdGUKICAgKiBkb3VibGUuCiAgICovCiAgZG91YmxlIGZsb29yVG9Eb3VibGUoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGVhc3QgZG91YmxlIGludGVnZXIgdmFsdWUgbm8gc21hbGxlciB0aGFuIGB0aGlzYC4KICAgKgogICAqIElmIHRoaXMgaXMgYWxyZWFkeSBhbiBpbnRlZ2VyIHZhbHVlZCBkb3VibGUsIGluY2x1ZGluZyBgLTAuMGAsIG9yIGl0IGlzIGEKICAgKiBub24tZmluaXRlIGRvdWJsZSB2YWx1ZSwgdGhlIHZhbHVlIGlzIHJldHVybmVkIHVubW9kaWZpZWQuCiAgICoKICAgKiBGb3IgdGhlIHB1cnBvc2Ugb2Ygcm91bmRpbmcsIGAtMC4wYCBpcyBjb25zaWRlcmVkIHRvIGJlIGJlbG93IGAwLjBgLgogICAqIEEgbnVtYmVyIGBkYCBpbiB0aGUgcmFuZ2UgYC0xLjAgPCBkIDwgMC4wYCB3aWxsIHJldHVybiBgLTAuMGAuCiAgICoKICAgKiBUaGUgcmVzdWx0IGlzIGFsd2F5cyBhIGRvdWJsZS4KICAgKiBJZiB0aGlzIGlzIGEgbnVtZXJpY2FsbHkgbGFyZ2UgaW50ZWdlciwgdGhlIHJlc3VsdCBtYXkgYmUgYW4gaW5maW5pdGUKICAgKiBkb3VibGUuCiAgICovCiAgZG91YmxlIGNlaWxUb0RvdWJsZSgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBkb3VibGUgaW50ZWdlciB2YWx1ZSBvYnRhaW5lZCBieSBkaXNjYXJkaW5nIGFueSBmcmFjdGlvbmFsCiAgICogZGlnaXRzIGZyb20gdGhlIGRvdWJsZSB2YWx1ZSBvZiBgdGhpc2AuCiAgICoKICAgKiBJZiB0aGlzIGlzIGFscmVhZHkgYW4gaW50ZWdlciB2YWx1ZWQgZG91YmxlLCBpbmNsdWRpbmcgYC0wLjBgLCBvciBpdCBpcyBhCiAgICogbm9uLWZpbml0ZSBkb3VibGUgdmFsdWUsIHRoZSB2YWx1ZSBpcyByZXR1cm5lZCB1bm1vZGlmaWVkLgogICAqCiAgICogRm9yIHRoZSBwdXJwb3NlIG9mIHJvdW5kaW5nLCBgLTAuMGAgaXMgY29uc2lkZXJlZCB0byBiZSBiZWxvdyBgMC4wYC4KICAgKiBBIG51bWJlciBgZGAgaW4gdGhlIHJhbmdlIGAtMS4wIDwgZCA8IDAuMGAgd2lsbCByZXR1cm4gYC0wLjBgLCBhbmQKICAgKiBpbiB0aGUgcmFuZ2UgYDAuMCA8IGQgPCAxLjBgIGl0IHdpbGwgcmV0dXJuIDAuMC4KICAgKgogICAqIFRoZSByZXN1bHQgaXMgYWx3YXlzIGEgZG91YmxlLgogICAqIElmIHRoaXMgaXMgYSBudW1lcmljYWxseSBsYXJnZSBpbnRlZ2VyLCB0aGUgcmVzdWx0IG1heSBiZSBhbiBpbmZpbml0ZQogICAqIGRvdWJsZS4KICAgKi8KICBkb3VibGUgdHJ1bmNhdGVUb0RvdWJsZSgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoaXMgW251bV0gY2xhbXBlZCB0byBiZSBpbiB0aGUgcmFuZ2UgW2xvd2VyTGltaXRdLVt1cHBlckxpbWl0XS4KICAgKgogICAqIFRoZSBjb21wYXJpc29uIGlzIGRvbmUgdXNpbmcgW2NvbXBhcmVUb10gYW5kIHRoZXJlZm9yZSB0YWtlcyBgLTAuMGAgaW50bwogICAqIGFjY291bnQuIFRoaXMgYWxzbyBpbXBsaWVzIHRoYXQgW2RvdWJsZS5uYW5dIGlzIHRyZWF0ZWQgYXMgdGhlIG1heGltYWwKICAgKiBkb3VibGUgdmFsdWUuCiAgICoKICAgKiBUaGUgYXJndW1lbnRzIFtsb3dlckxpbWl0XSBhbmQgW3VwcGVyTGltaXRdIG11c3QgZm9ybSBhIHZhbGlkIHJhbmdlIHdoZXJlCiAgICogYGxvd2VyTGltaXQuY29tcGFyZVRvKHVwcGVyTGltaXQpIDw9IDBgLgogICAqLwogIG51bSBjbGFtcChudW0gbG93ZXJMaW1pdCwgbnVtIHVwcGVyTGltaXQpOwoKICAvKiogVHJ1bmNhdGVzIHRoaXMgW251bV0gdG8gYW4gaW50ZWdlciBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIGFuIFtpbnRdLiAqLwogIGludCB0b0ludCgpOwoKICAvKioKICAgKiBSZXR1cm4gdGhpcyBbbnVtXSBhcyBhIFtkb3VibGVdLgogICAqCiAgICogSWYgdGhlIG51bWJlciBpcyBub3QgcmVwcmVzZW50YWJsZSBhcyBhIFtkb3VibGVdLCBhbgogICAqIGFwcHJveGltYXRpb24gaXMgcmV0dXJuZWQuIEZvciBudW1lcmljYWxseSBsYXJnZSBpbnRlZ2VycywgdGhlCiAgICogYXBwcm94aW1hdGlvbiBtYXkgYmUgaW5maW5pdGUuCiAgICovCiAgZG91YmxlIHRvRG91YmxlKCk7CgogIC8qKgogICAqIFJldHVybnMgYSBkZWNpbWFsLXBvaW50IHN0cmluZy1yZXByZXNlbnRhdGlvbiBvZiBgdGhpc2AuCiAgICoKICAgKiBDb252ZXJ0cyBgdGhpc2AgdG8gYSBbZG91YmxlXSBiZWZvcmUgY29tcHV0aW5nIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCiAgICoKICAgKiBJZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgYHRoaXNgIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gYDEwXjIxYCB0aGVuIHRoaXMKICAgKiBtZXRob2RzIHJldHVybnMgYW4gZXhwb25lbnRpYWwgcmVwcmVzZW50YXRpb24gY29tcHV0ZWQgYnkKICAgKiBgdGhpcy50b1N0cmluZ0FzRXhwb25lbnRpYWwoKWAuIE90aGVyd2lzZSB0aGUgcmVzdWx0CiAgICogaXMgdGhlIGNsb3Nlc3Qgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHdpdGggZXhhY3RseSBbZnJhY3Rpb25EaWdpdHNdIGRpZ2l0cwogICAqIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LiBJZiBbZnJhY3Rpb25EaWdpdHNdIGVxdWFscyAwIHRoZW4gdGhlIGRlY2ltYWwKICAgKiBwb2ludCBpcyBvbWl0dGVkLgogICAqCiAgICogVGhlIHBhcmFtZXRlciBbZnJhY3Rpb25EaWdpdHNdIG11c3QgYmUgYW4gaW50ZWdlciBzYXRpc2Z5aW5nOgogICAqIGAwIDw9IGZyYWN0aW9uRGlnaXRzIDw9IDIwYC4KICAgKgogICAqIEV4YW1wbGVzOgogICAqCiAgICogICAgIDEudG9TdHJpbmdBc0ZpeGVkKDMpOyAgLy8gMS4wMDAKICAgKiAgICAgKDQzMjEuMTIzNDU2NzgpLnRvU3RyaW5nQXNGaXhlZCgzKTsgIC8vIDQzMjEuMTIzCiAgICogICAgICg0MzIxLjEyMzQ1Njc4KS50b1N0cmluZ0FzRml4ZWQoNSk7ICAvLyA0MzIxLjEyMzQ2CiAgICogICAgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMS50b1N0cmluZ0FzRml4ZWQoMyk7ICAvLyAxMjM0NTY3ODkwMTIzNDU2ODM5NjguMDAwCiAgICogICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAudG9TdHJpbmdBc0ZpeGVkKDMpOyAvLyAxZSsyMQogICAqICAgICA1LjI1LnRvU3RyaW5nQXNGaXhlZCgwKTsgLy8gNQogICAqLwogIFN0cmluZyB0b1N0cmluZ0FzRml4ZWQoaW50IGZyYWN0aW9uRGlnaXRzKTsKCiAgLyoqCiAgICogUmV0dXJucyBhbiBleHBvbmVudGlhbCBzdHJpbmctcmVwcmVzZW50YXRpb24gb2YgYHRoaXNgLgogICAqCiAgICogQ29udmVydHMgYHRoaXNgIHRvIGEgW2RvdWJsZV0gYmVmb3JlIGNvbXB1dGluZyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgogICAqCiAgICogSWYgW2ZyYWN0aW9uRGlnaXRzXSBpcyBnaXZlbiB0aGVuIGl0IG11c3QgYmUgYW4gaW50ZWdlciBzYXRpc2Z5aW5nOgogICAqIGAwIDw9IGZyYWN0aW9uRGlnaXRzIDw9IDIwYC4gSW4gdGhpcyBjYXNlIHRoZSBzdHJpbmcgY29udGFpbnMgZXhhY3RseQogICAqIFtmcmFjdGlvbkRpZ2l0c10gYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuIE90aGVyd2lzZSwgd2l0aG91dCB0aGUgcGFyYW1ldGVyLAogICAqIHRoZSByZXR1cm5lZCBzdHJpbmcgdXNlcyB0aGUgc2hvcnRlc3QgbnVtYmVyIG9mIGRpZ2l0cyB0aGF0IGFjY3VyYXRlbHkKICAgKiByZXByZXNlbnQgW3RoaXNdLgogICAqCiAgICogSWYgW2ZyYWN0aW9uRGlnaXRzXSBlcXVhbHMgMCB0aGVuIHRoZSBkZWNpbWFsIHBvaW50IGlzIG9taXR0ZWQuCiAgICogRXhhbXBsZXM6CiAgICoKICAgKiAgICAgMS50b1N0cmluZ0FzRXhwb25lbnRpYWwoKTsgICAgICAgLy8gMWUrMAogICAqICAgICAxLnRvU3RyaW5nQXNFeHBvbmVudGlhbCgzKTsgICAgICAvLyAxLjAwMGUrMAogICAqICAgICAxMjM0NTYudG9TdHJpbmdBc0V4cG9uZW50aWFsKCk7ICAvLyAxLjIzNDU2ZSs1CiAgICogICAgIDEyMzQ1Ni50b1N0cmluZ0FzRXhwb25lbnRpYWwoMyk7IC8vIDEuMjM1ZSs1CiAgICogICAgIDEyMy50b1N0cmluZ0FzRXhwb25lbnRpYWwoMCk7ICAgIC8vIDFlKzIKICAgKi8KICBTdHJpbmcgdG9TdHJpbmdBc0V4cG9uZW50aWFsKFtpbnQgZnJhY3Rpb25EaWdpdHNdKTsKCiAgLyoqCiAgICogQ29udmVydHMgYHRoaXNgIHRvIGEgZG91YmxlIGFuZCByZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHdpdGgKICAgKiBleGFjdGx5IFtwcmVjaXNpb25dIHNpZ25pZmljYW50IGRpZ2l0cy4KICAgKgogICAqIFRoZSBwYXJhbWV0ZXIgW3ByZWNpc2lvbl0gbXVzdCBiZSBhbiBpbnRlZ2VyIHNhdGlzZnlpbmc6CiAgICogYDEgPD0gcHJlY2lzaW9uIDw9IDIxYC4KICAgKgogICAqIEV4YW1wbGVzOgogICAqCiAgICogICAgIDEudG9TdHJpbmdBc1ByZWNpc2lvbigyKTsgICAgICAgLy8gMS4wCiAgICogICAgIDFlMTUudG9TdHJpbmdBc1ByZWNpc2lvbigzKTsgICAgLy8gMS4wMGUrMTUKICAgKiAgICAgMTIzNDU2Ny50b1N0cmluZ0FzUHJlY2lzaW9uKDMpOyAvLyAxLjIzZSs2CiAgICogICAgIDEyMzQ1NjcudG9TdHJpbmdBc1ByZWNpc2lvbig5KTsgLy8gMTIzNDU2Ny4wMAogICAqICAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MC50b1N0cmluZ0FzUHJlY2lzaW9uKDIwKTsgLy8gMTIzNDU2Nzg5MDEyMzQ1NjcxNjgKICAgKiAgICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAudG9TdHJpbmdBc1ByZWNpc2lvbigxNCk7IC8vIDEuMjM0NTY3ODkwMTIzNWUrMTkKICAgKiAgICAgMC4wMDAwMDAxMjM0NS50b1N0cmluZ0FzUHJlY2lzaW9uKDE1KTsgLy8gMS4yMzQ1MDAwMDAwMDAwMGUtNwogICAqICAgICAwLjAwMDAwMTIzNDUudG9TdHJpbmdBc1ByZWNpc2lvbigxNSk7ICAvLyAwLjAwMDAwMTIzNDUwMDAwMDAwMDAwCiAgICovCiAgU3RyaW5nIHRvU3RyaW5nQXNQcmVjaXNpb24oaW50IHByZWNpc2lvbik7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHNob3J0ZXN0IHN0cmluZyB0aGF0IGNvcnJlY3RseSByZXByZXNlbnQgdGhlIGlucHV0IG51bWJlci4KICAgKgogICAqIEFsbCBbZG91YmxlXXMgaW4gdGhlIHJhbmdlIGAxMF4tNmAgKGluY2x1c2l2ZSkgdG8gYDEwXjIxYCAoZXhjbHVzaXZlKQogICAqIGFyZSBjb252ZXJ0ZWQgdG8gdGhlaXIgZGVjaW1hbCByZXByZXNlbnRhdGlvbiB3aXRoIGF0IGxlYXN0IG9uZSBkaWdpdAogICAqIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LiBGb3IgYWxsIG90aGVyIGRvdWJsZXMsCiAgICogZXhjZXB0IGZvciBzcGVjaWFsIHZhbHVlcyBsaWtlIGBOYU5gIG9yIGBJbmZpbml0eWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYW4KICAgKiBleHBvbmVudGlhbCByZXByZXNlbnRhdGlvbiAoc2VlIFt0b1N0cmluZ0FzRXhwb25lbnRpYWxdKS4KICAgKgogICAqIFJldHVybnMgYCJOYU4iYCBmb3IgW2RvdWJsZS5uYW5dLCBgIkluZmluaXR5ImAgZm9yIFtkb3VibGUuaW5maW5pdHldLCBhbmQKICAgKiBgIi1JbmZpbml0eSJgIGZvciBbZG91YmxlLm5lZ2F0aXZlSW5maW5pdHldLgogICAqCiAgICogQW4gW2ludF0gaXMgY29udmVydGVkIHRvIGEgZGVjaW1hbCByZXByZXNlbnRhdGlvbiB3aXRoIG5vIGRlY2ltYWwgcG9pbnQuCiAgICoKICAgKiBFeGFtcGxlczoKICAgKgogICAqICAgICAoMC4wMDAwMDEpLnRvU3RyaW5nKCk7ICAvLyAiMC4wMDAwMDEiCiAgICogICAgICgwLjAwMDAwMDEpLnRvU3RyaW5nKCk7IC8vICIxZS03IgogICAqICAgICAoMTExMTExMTExMTExMTExMTExMTExLjApLnRvU3RyaW5nKCk7ICAvLyAiMTExMTExMTExMTExMTExMTEwMDAwLjAiCiAgICogICAgICgxMDAwMDAwMDAwMDAwMDAwMDAwMDAuMCkudG9TdHJpbmcoKTsgIC8vICIxMDAwMDAwMDAwMDAwMDAwMDAwMDAuMCIKICAgKiAgICAgKDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAuMCkudG9TdHJpbmcoKTsgLy8gIjFlKzIxIgogICAqICAgICAoMTExMTExMTExMTExMTExMTExMTExMS4wKS50b1N0cmluZygpOyAvLyAiMS4xMTExMTExMTExMTExMTExZSsyMSIKICAgKiAgICAgMS50b1N0cmluZygpOyAvLyAiMSIKICAgKiAgICAgMTExMTExMTExMTExMTExMTExMTExLnRvU3RyaW5nKCk7ICAvLyAiMTExMTExMTExMTExMTExMTEwMDAwIgogICAqICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAudG9TdHJpbmcoKTsgIC8vICIxMDAwMDAwMDAwMDAwMDAwMDAwMDAiCiAgICogICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAudG9TdHJpbmcoKTsgLy8gIjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAiCiAgICogICAgIDExMTExMTExMTExMTExMTExMTExMTEudG9TdHJpbmcoKTsgLy8gIjExMTExMTExMTExMTExMTExMTExMTEiCiAgICogICAgIDEuMjM0ZTUudG9TdHJpbmcoKTsgICAvLyAxMjM0MDAKICAgKiAgICAgMTIzNC41ZTYudG9TdHJpbmcoKTsgIC8vIDEyMzQ1MDAwMDAKICAgKiAgICAgMTIuMzQ1ZTY3LnRvU3RyaW5nKCk7IC8vIDEuMjM0NWUrNjgKICAgKgogICAqIE5vdGU6IHRoZSBjb252ZXJzaW9uIG1heSByb3VuZCB0aGUgb3V0cHV0IGlmIHRoZSByZXR1cm5lZCBzdHJpbmcKICAgKiBpcyBhY2N1cmF0ZSBlbm91Z2ggdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGlucHV0LW51bWJlci4KICAgKiBGb3IgZXhhbXBsZSB0aGUgbW9zdCBwcmVjaXNlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBbZG91YmxlXSBgOWU1OWAgZXF1YWxzCiAgICogYCI4OTk5OTk5OTk5OTk5OTk5MTg3NjcyMjk0NDk3MTc2MTk5NTM4MTAxMzEyNzM2NzQ2OTA2NTYyMDY4NDgiYCwgYnV0CiAgICogdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc2hvcnRlciAoYnV0IHN0aWxsIHVuaXF1ZWx5IGlkZW50aWZ5aW5nKSBgIjllNTkiYC4KICAgKgogICAqLwogIFN0cmluZyB0b1N0cmluZygpOwoKICAvKioKICAgKiBQYXJzZXMgYSBzdHJpbmcgY29udGFpbmluZyBhIG51bWJlciBsaXRlcmFsIGludG8gYSBudW1iZXIuCiAgICoKICAgKiBUaGUgbWV0aG9kIGZpcnN0IHRyaWVzIHRvIHJlYWQgdGhlIFtpbnB1dF0gYXMgaW50ZWdlciAoc2ltaWxhciB0bwogICAqIFtpbnQucGFyc2VdIHdpdGhvdXQgYSByYWRpeCkuCiAgICogSWYgdGhhdCBmYWlscywgaXQgdHJpZXMgdG8gcGFyc2UgdGhlIFtpbnB1dF0gYXMgYSBkb3VibGUgKHNpbWlsYXIgdG8KICAgKiBbZG91YmxlLnBhcnNlXSkuCiAgICogSWYgdGhhdCBmYWlscywgdG9vLCBpdCBpbnZva2VzIFtvbkVycm9yXSB3aXRoIFtpbnB1dF0sIGFuZCB0aGUgcmVzdWx0CiAgICogb2YgdGhhdCBpbnZvY2F0aW9uIGJlY29tZXMgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGBwYXJzZWAuCiAgICoKICAgKiBJZiBubyBbb25FcnJvcl0gaXMgc3VwcGxpZWQsIGl0IGRlZmF1bHRzIHRvIGEgZnVuY3Rpb24gdGhhdCB0aHJvd3MgYQogICAqIFtGb3JtYXRFeGNlcHRpb25dLgogICAqCiAgICogRm9yIGFueSBudW1iZXIgYG5gLCB0aGlzIGZ1bmN0aW9uIHNhdGlzZmllcwogICAqIGBpZGVudGljYWwobiwgbnVtLnBhcnNlKG4udG9TdHJpbmcoKSkpYCAoZXhjZXB0IHdoZW4gYG5gIGlzIGEgTmFOIGBkb3VibGVgCiAgICogd2l0aCBhIHBheWxvYWQpLgogICAqCiAgICogVGhlIFtvbkVycm9yXSBwYXJhbWV0ZXIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkLgogICAqIEluc3RlYWQgb2YgYG51bS5wYXJzZShzdHJpbmcsIChzdHJpbmcpIHsgLi4uIH0pYCwKICAgKiB5b3Ugc2hvdWxkIHVzZSBgbnVtLnRyeVBhcnNlKHN0cmluZykgPz8gKC4uLilgLgogICAqLwogIHN0YXRpYyBudW0gcGFyc2UoU3RyaW5nIGlucHV0LCBbQGRlcHJlY2F0ZWQgbnVtIG9uRXJyb3IoU3RyaW5nIGlucHV0KV0pIHsKICAgIG51bSByZXN1bHQgPSB0cnlQYXJzZShpbnB1dCk7CiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHJldHVybiByZXN1bHQ7CiAgICBpZiAob25FcnJvciA9PSBudWxsKSB0aHJvdyBGb3JtYXRFeGNlcHRpb24oaW5wdXQpOwogICAgcmV0dXJuIG9uRXJyb3IoaW5wdXQpOwogIH0KCiAgLyoqCiAgICogUGFyc2VzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBudW1iZXIgbGl0ZXJhbCBpbnRvIGEgbnVtYmVyLgogICAqCiAgICogTGlrZSBbcGFyc2VdIGV4Y2VwdCB0aGF0IHRoaXMgZnVuY3Rpb24gcmV0dXJucyBgbnVsbGAgZm9yIGludmFsaWQgaW5wdXRzCiAgICogaW5zdGVhZCBvZiB0aHJvd2luZy4KICAgKi8KICBzdGF0aWMgbnVtIHRyeVBhcnNlKFN0cmluZyBpbnB1dCkgewogICAgU3RyaW5nIHNvdXJjZSA9IGlucHV0LnRyaW0oKTsKICAgIC8vIFRPRE8obHJuKTogT3B0aW1pemUgdG8gZGV0ZWN0IGZvcm1hdCBhbmQgcmVzdWx0IHR5cGUgaW4gb25lIGNoZWNrLgogICAgcmV0dXJuIGludC50cnlQYXJzZShzb3VyY2UpID8/IGRvdWJsZS50cnlQYXJzZShzb3VyY2UpOwogIH0KCiAgLyoqIEhlbHBlciBmdW5jdGlvbnMgZm9yIFtwYXJzZV0uICovCiAgc3RhdGljIGludCBfcmV0dXJuSW50TnVsbChTdHJpbmcgXykgPT4gbnVsbDsKICBzdGF0aWMgZG91YmxlIF9yZXR1cm5Eb3VibGVOdWxsKFN0cmluZyBfKSA9PiBudWxsOwp9CoHvAE5OPAETAQQoA0gqBDAGPgVIIgVHLUsqBUtKOQVQBS4FSEhJSg4FSTAFTi0GIgEGMAVKTjkFPwYUAQYfBVBFBUpPRwwFSk9NFwVHMAVQUBhQKEAFDwklJCQFQywtNzwFShIkMzc3OAkGHAEcHQEfHQEiHQEGIAVQSC4FTEwyBTwFQwYdARwgAQYjBVA9BUcXBh4BGhQBBkwFMSxRBhwBKB4BMR8BKx4BNB8BUBIBBjcFRwYXAQZODAYXAQY1BUEYBhUBMw0BBkMkBTgyLgU4BTcnARsFHwVJBhABBiwFPTcFUAYPAQY6BVAGDwEGNwVQBg4BBj8ZBVAGEgEGOQU9RwVPQAVKT0UbBSRLDQYaAQZHBU9ABUpCBSRLDQYaAQZEBU9ABUpEBSRLDQYZAQZMLQVPQAVKSDYFJEsNBh0BBk4FTkwTBU8uBi0BUA8BBiYFOkQkBhUBBj4FTwVOPzpPTBcFQyIFDwUpOjxRPScGLgEGPQVPBUlLUUwXBUUPBTI2ODYyBjYBBkotBT4dBQ8FMDU0N09OR0oGLQEGTAVLSzVQPwVPMgVOBQ8FLytNTTtMHkdHSEgpLS0FRj9PS1AFBhUBBkAFRyNKFks/BUoYBTFQFgVANzUGTCInNxsEAQZABU4aBiYiSjwEAScvNQIBEmRhcnQ6Y29yZS9udW0uZGFydCxvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS9vYmplY3QuZGFydJB/Ly8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLyoqCiAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgRGFydCBvYmplY3RzLgogKgogKiBCZWNhdXNlIE9iamVjdCBpcyB0aGUgcm9vdCBvZiB0aGUgRGFydCBjbGFzcyBoaWVyYXJjaHksCiAqIGV2ZXJ5IG90aGVyIERhcnQgY2xhc3MgaXMgYSBzdWJjbGFzcyBvZiBPYmplY3QuCiAqCiAqIFdoZW4geW91IGRlZmluZSBhIGNsYXNzLCB5b3Ugc2hvdWxkIG92ZXJyaWRlIFt0b1N0cmluZ10KICogdG8gcmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcy4KICogWW91IG1pZ2h0IGFsc28gbmVlZCB0byBkZWZpbmUgW2hhc2hDb2RlXSBhbmQgW29wZXJhdG9yID09XSwgYXMgZGVzY3JpYmVkIGluIHRoZQogKiBbSW1wbGVtZW50aW5nIG1hcAogKiBrZXlzXShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy9kYXJ0LXVwLWFuZC1ydW5uaW5nL2NoMDMuaHRtbCNpbXBsZW1lbnRpbmctbWFwLWtleXMpCiAqIHNlY3Rpb24gb2YgdGhlIFtsaWJyYXJ5CiAqIHRvdXJdKGh0dHA6Ly93d3cuZGFydGxhbmcub3JnL2RvY3MvZGFydC11cC1hbmQtcnVubmluZy9jb250ZW50cy9jaDAzLmh0bWwpLgogKi8KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBPYmplY3QgewogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgW09iamVjdF0gaW5zdGFuY2UuCiAgICoKICAgKiBbT2JqZWN0XSBpbnN0YW5jZXMgaGF2ZSBubyBtZWFuaW5nZnVsIHN0YXRlLCBhbmQgYXJlIG9ubHkgdXNlZnVsCiAgICogdGhyb3VnaCB0aGVpciBpZGVudGl0eS4gQW4gW09iamVjdF0gaW5zdGFuY2UgaXMgZXF1YWwgdG8gaXRzZWxmCiAgICogb25seS4KICAgKi8KICBjb25zdCBPYmplY3QoKTsKCiAgLyoqCiAgICogVGhlIGVxdWFsaXR5IG9wZXJhdG9yLgogICAqCiAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGFsbCBbT2JqZWN0XXMgaXMgdG8gcmV0dXJuIHRydWUgaWYgYW5kCiAgICogb25seSBpZiBgdGhpc2AgYW5kIFtvdGhlcl0gYXJlIHRoZSBzYW1lIG9iamVjdC4KICAgKgogICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgZXF1YWxpdHkgcmVsYXRpb24gb24KICAgKiBhIGNsYXNzLiBUaGUgb3ZlcnJpZGluZyBtZXRob2QgbXVzdCBzdGlsbCBiZSBhbiBlcXVpdmFsZW5jZSByZWxhdGlvbi4KICAgKiBUaGF0IGlzLCBpdCBtdXN0IGJlOgogICAqCiAgICogICogVG90YWw6IEl0IG11c3QgcmV0dXJuIGEgYm9vbGVhbiBmb3IgYWxsIGFyZ3VtZW50cy4gSXQgc2hvdWxkIG5ldmVyIHRocm93CiAgICogICAgb3IgcmV0dXJuIGBudWxsYC4KICAgKgogICAqICAqIFJlZmxleGl2ZTogRm9yIGFsbCBvYmplY3RzIGBvYCwgYG8gPT0gb2AgbXVzdCBiZSB0cnVlLgogICAqCiAgICogICogU3ltbWV0cmljOiBGb3IgYWxsIG9iamVjdHMgYG8xYCBhbmQgYG8yYCwgYG8xID09IG8yYCBhbmQgYG8yID09IG8xYCBtdXN0CiAgICogICAgZWl0aGVyIGJvdGggYmUgdHJ1ZSwgb3IgYm90aCBiZSBmYWxzZS4KICAgKgogICAqICAqIFRyYW5zaXRpdmU6IEZvciBhbGwgb2JqZWN0cyBgbzFgLCBgbzJgLCBhbmQgYG8zYCwgaWYgYG8xID09IG8yYCBhbmQKICAgKiAgICBgbzIgPT0gbzNgIGFyZSB0cnVlLCB0aGVuIGBvMSA9PSBvM2AgbXVzdCBiZSB0cnVlLgogICAqCiAgICogVGhlIG1ldGhvZCBzaG91bGQgYWxzbyBiZSBjb25zaXN0ZW50IG92ZXIgdGltZSwKICAgKiBzbyB3aGV0aGVyIHR3byBvYmplY3RzIGFyZSBlcXVhbCBzaG91bGQgb25seSBjaGFuZ2UKICAgKiBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIG9iamVjdHMgd2FzIG1vZGlmaWVkLgogICAqCiAgICogSWYgYSBzdWJjbGFzcyBvdmVycmlkZXMgdGhlIGVxdWFsaXR5IG9wZXJhdG9yIGl0IHNob3VsZCBvdmVycmlkZQogICAqIHRoZSBbaGFzaENvZGVdIG1ldGhvZCBhcyB3ZWxsIHRvIG1haW50YWluIGNvbnNpc3RlbmN5LgogICAqLwogIGV4dGVybmFsIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpOwoKICAvKioKICAgKiBUaGUgaGFzaCBjb2RlIGZvciB0aGlzIG9iamVjdC4KICAgKgogICAqIEEgaGFzaCBjb2RlIGlzIGEgc2luZ2xlIGludGVnZXIgd2hpY2ggcmVwcmVzZW50cyB0aGUgc3RhdGUgb2YgdGhlIG9iamVjdAogICAqIHRoYXQgYWZmZWN0cyBbb3BlcmF0b3IgPT1dIGNvbXBhcmlzb25zLgogICAqCiAgICogQWxsIG9iamVjdHMgaGF2ZSBoYXNoIGNvZGVzLgogICAqIFRoZSBkZWZhdWx0IGhhc2ggY29kZSByZXByZXNlbnRzIG9ubHkgdGhlIGlkZW50aXR5IG9mIHRoZSBvYmplY3QsCiAgICogdGhlIHNhbWUgd2F5IGFzIHRoZSBkZWZhdWx0IFtvcGVyYXRvciA9PV0gaW1wbGVtZW50YXRpb24gb25seSBjb25zaWRlcnMgb2JqZWN0cwogICAqIGVxdWFsIGlmIHRoZXkgYXJlIGlkZW50aWNhbCAoc2VlIFtpZGVudGl0eUhhc2hDb2RlXSkuCiAgICoKICAgKiBJZiBbb3BlcmF0b3IgPT1dIGlzIG92ZXJyaWRkZW4gdG8gdXNlIHRoZSBvYmplY3Qgc3RhdGUgaW5zdGVhZCwKICAgKiB0aGUgaGFzaCBjb2RlIG11c3QgYWxzbyBiZSBjaGFuZ2VkIHRvIHJlcHJlc2VudCB0aGF0IHN0YXRlLgogICAqCiAgICogSGFzaCBjb2RlcyBtdXN0IGJlIHRoZSBzYW1lIGZvciBvYmplY3RzIHRoYXQgYXJlIGVxdWFsIHRvIGVhY2ggb3RoZXIKICAgKiBhY2NvcmRpbmcgdG8gW29wZXJhdG9yID09XS4KICAgKiBUaGUgaGFzaCBjb2RlIG9mIGFuIG9iamVjdCBzaG91bGQgb25seSBjaGFuZ2UgaWYgdGhlIG9iamVjdCBjaGFuZ2VzCiAgICogaW4gYSB3YXkgdGhhdCBhZmZlY3RzIGVxdWFsaXR5LgogICAqIFRoZXJlIGFyZSBubyBmdXJ0aGVyIHJlcXVpcmVtZW50cyBmb3IgdGhlIGhhc2ggY29kZXMuCiAgICogVGhleSBuZWVkIG5vdCBiZSBjb25zaXN0ZW50IGJldHdlZW4gZXhlY3V0aW9ucyBvZiB0aGUgc2FtZSBwcm9ncmFtCiAgICogYW5kIHRoZXJlIGFyZSBubyBkaXN0cmlidXRpb24gZ3VhcmFudGVlcy4KICAgKgogICAqIE9iamVjdHMgdGhhdCBhcmUgbm90IGVxdWFsIGFyZSBhbGxvd2VkIHRvIGhhdmUgdGhlIHNhbWUgaGFzaCBjb2RlLAogICAqIGl0IGlzIGV2ZW4gdGVjaG5pY2FsbHkgYWxsb3dlZCB0aGF0IGFsbCBpbnN0YW5jZXMgaGF2ZSB0aGUgc2FtZSBoYXNoIGNvZGUsCiAgICogYnV0IGlmIGNsYXNoZXMgaGFwcGVuIHRvbyBvZnRlbiwgaXQgbWF5IHJlZHVjZSB0aGUgZWZmaWNpZW5jeSBvZiBoYXNoLWJhc2VkCiAgICogZGF0YSBzdHJ1Y3R1cmVzIGxpa2UgW0hhc2hTZXRdIG9yIFtIYXNoTWFwXS4KICAgKgogICAqIElmIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIFtoYXNoQ29kZV0sIGl0IHNob3VsZCBvdmVycmlkZSB0aGUKICAgKiBbb3BlcmF0b3IgPT1dIG9wZXJhdG9yIGFzIHdlbGwgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kuCiAgICovCiAgZXh0ZXJuYWwgaW50IGdldCBoYXNoQ29kZTsKCiAgLyoqCiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KICAgKi8KICBleHRlcm5hbCBTdHJpbmcgdG9TdHJpbmcoKTsKCiAgLyoqCiAgICogSW52b2tlZCB3aGVuIGEgbm9uLWV4aXN0ZW50IG1ldGhvZCBvciBwcm9wZXJ0eSBpcyBhY2Nlc3NlZC4KICAgKgogICAqIENsYXNzZXMgY2FuIG92ZXJyaWRlIFtub1N1Y2hNZXRob2RdIHRvIHByb3ZpZGUgY3VzdG9tIGJlaGF2aW9yLgogICAqCiAgICogSWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgYmVjb21lcyB0aGUgcmVzdWx0IG9mIHRoZSBvcmlnaW5hbCBpbnZvY2F0aW9uLgogICAqCiAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gdGhyb3cgYSBbTm9TdWNoTWV0aG9kRXJyb3JdLgogICAqLwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBleHRlcm5hbCBkeW5hbWljIG5vU3VjaE1ldGhvZChJbnZvY2F0aW9uIGludm9jYXRpb24pOwoKICAvKioKICAgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBydW50aW1lIHR5cGUgb2YgdGhlIG9iamVjdC4KICAgKi8KICBleHRlcm5hbCBUeXBlIGdldCBydW50aW1lVHlwZTsKfQp1AE5OPAETAQQoAzszAzs8UxVcG08EGg8GJgVGRQsGEgEGHAVFNQVGSxoFURoFPwVRLwVMOwU1OTIFRjwGJAEGJAVOLQUiR1U7BUVBBUohSSU7SC8FSFBRMgVAPQYdAQY1Bh4BBkEFRQVPBT0GHDgBBjkGIQIBFWRhcnQ6Y29yZS9vYmplY3QuZGFydDFvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL29iamVjdF9wYXRjaC5kYXJ0ijgvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCkBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKaW50IF9nZXRIYXNoKG9iaikgbmF0aXZlICJPYmplY3RfZ2V0SGFzaCI7CnZvaWQgX3NldEhhc2gob2JqLCBoYXNoKSBuYXRpdmUgIk9iamVjdF9zZXRIYXNoIjsKCkBwYXRjaApAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIE9iamVjdCB7CiAgLy8gVGhlIFZNIGhhcyBpdHMgb3duIGltcGxlbWVudGF0aW9uIG9mIGVxdWFscy4KICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgbmF0aXZlICJPYmplY3RfZXF1YWxzIjsKCiAgLy8gSGVscGVycyB1c2VkIHRvIGltcGxlbWVudCBoYXNoQ29kZS4gSWYgYSBoYXNoQ29kZSBpcyB1c2VkLCB3ZSByZW1lbWJlciBpdAogIC8vIGluIGEgd2VhayB0YWJsZSBpbiB0aGUgVk0gKDMyIGJpdCkgb3IgaW4gdGhlIGhlYWRlciBvZiB0aGUgb2JqZWN0ICg2NAogIC8vIGJpdCkuIEEgbmV3IGhhc2hDb2RlIHZhbHVlIGlzIGNhbGN1bGF0ZWQgdXNpbmcgYSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KICBzdGF0aWMgZmluYWwgX2hhc2hDb2RlUm5kID0gbmV3IFJhbmRvbSgpOwoKICBzdGF0aWMgaW50IF9vYmplY3RIYXNoQ29kZShvYmopIHsKICAgIHZhciByZXN1bHQgPSBfZ2V0SGFzaChvYmopOwogICAgaWYgKHJlc3VsdCA9PSAwKSB7CiAgICAgIC8vIFdlIHdhbnQgdGhlIGhhc2ggdG8gYmUgYSBTbWkgdmFsdWUgZ3JlYXRlciB0aGFuIDAuCiAgICAgIHJlc3VsdCA9IF9oYXNoQ29kZVJuZC5uZXh0SW50KDB4NDAwMDAwMDApOwogICAgICBkbyB7CiAgICAgICAgcmVzdWx0ID0gX2hhc2hDb2RlUm5kLm5leHRJbnQoMHg0MDAwMDAwMCk7CiAgICAgIH0gd2hpbGUgKHJlc3VsdCA9PSAwKTsKICAgICAgX3NldEhhc2gob2JqLCByZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBwYXRjaAogIGludCBnZXQgaGFzaENvZGUgPT4gX29iamVjdEhhc2hDb2RlKHRoaXMpOwogIGludCBnZXQgX2lkZW50aXR5SGFzaENvZGUgPT4gX29iamVjdEhhc2hDb2RlKHRoaXMpOwoKICBAcGF0Y2gKICBTdHJpbmcgdG9TdHJpbmcoKSBuYXRpdmUgIk9iamVjdF90b1N0cmluZyI7CiAgLy8gQSBzdGF0aWNhbGx5IGRpc3BhdGNoZWQgdmVyc2lvbiBvZiBPYmplY3QudG9TdHJpbmcuCiAgc3RhdGljIFN0cmluZyBfdG9TdHJpbmcob2JqKSBuYXRpdmUgIk9iamVjdF90b1N0cmluZyI7CgogIEBwYXRjaAogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQogIGR5bmFtaWMgbm9TdWNoTWV0aG9kKEludm9jYXRpb24gaW52b2NhdGlvbikgewogICAgLy8gVE9ETyhyZWdpcyk6IFJlbW92ZSB0ZW1wIGNvbnN0cnVjdG9yIGlkZW50aWZpZXIgJ3dpdGhJbnZvY2F0aW9uJy4KICAgIHRocm93IG5ldyBOb1N1Y2hNZXRob2RFcnJvci53aXRoSW52b2NhdGlvbih0aGlzLCBpbnZvY2F0aW9uKTsKICB9CgogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfVHlwZSIpCiAgVHlwZSBnZXQgcnVudGltZVR5cGUgbmF0aXZlICJPYmplY3RfcnVudGltZVR5cGUiOwoKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgc3RhdGljIGJvb2wgX2hhdmVTYW1lUnVudGltZVR5cGUoYSwgYikgbmF0aXZlICJPYmplY3RfaGF2ZVNhbWVSdW50aW1lVHlwZSI7CgogIC8vIENhbGwgdGhpcyBmdW5jdGlvbiBpbnN0ZWFkIG9mIGlubGluaW5nIGluc3RhbmNlb2YsIHRodXMgY29sbGVjdGluZwogIC8vIHR5cGUgZmVlZGJhY2sgYW5kIHJlZHVjaW5nIGNvZGUgc2l6ZSBvZiB1bm9wdGltaXplZCBjb2RlLgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQogIGJvb2wgX2luc3RhbmNlT2YoaW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cywgZnVuY3Rpb25UeXBlQXJndW1lbnRzLCB0eXBlKQogICAgICBuYXRpdmUgIk9iamVjdF9pbnN0YW5jZU9mIjsKCiAgLy8gR3JvdXAgb2YgZnVuY3Rpb25zIGZvciBpbXBsZW1lbnRpbmcgZmFzdCBzaW1wbGUgaW5zdGFuY2Ugb2YuCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCiAgYm9vbCBfc2ltcGxlSW5zdGFuY2VPZih0eXBlKSBuYXRpdmUgIk9iamVjdF9zaW1wbGVJbnN0YW5jZU9mIjsKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICBib29sIF9zaW1wbGVJbnN0YW5jZU9mVHJ1ZSh0eXBlKSA9PiB0cnVlOwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQogIGJvb2wgX3NpbXBsZUluc3RhbmNlT2ZGYWxzZSh0eXBlKSA9PiBmYWxzZTsKfQpMAE5OPAEeATIrMgEHGg8yCSgyAU9LTywBJCAXPDELMx0dBhMEAQktNgEJLjk5AQkkMElCBAEJNTQBJChOAUg/JEsiAUIkQSQsJC4CASFkYXJ0OmNvcmUtcGF0Y2gvb2JqZWN0X3BhdGNoLmRhcnQtb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvcGF0dGVybi5kYXJ0j9AvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogQW4gaW50ZXJmYWNlIGZvciBiYXNpYyBzZWFyY2hlcyB3aXRoaW4gc3RyaW5ncy4KICovCmFic3RyYWN0IGNsYXNzIFBhdHRlcm4gewogIC8vIE5PVEU6IFdoZW4gdXNpbmcgInN0YXJ0IiBpbmRleCBmcm9tIHRoZSBsYW5ndWFnZSBsaWJyYXJ5LCBjYWxsCiAgLy8gd2l0aG91dCBhbiBhcmd1bWVudCBpZiBzdGFydCBpcyB6ZXJvLiBUaGlzIGFsbG93cyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQogIC8vIHdpdGggaW1wbGVtZW50YXRpb25zIG9mIHRoZSBvbGRlciBpbnRlcmZhY2UgdGhhdCBkaWRuJ3QgaGF2ZSB0aGUgc3RhcnQKICAvLyBpbmRleCBhcmd1bWVudC4KICAvKioKICAgKiBNYXRjaCB0aGlzIHBhdHRlcm4gYWdhaW5zdCB0aGUgc3RyaW5nIHJlcGVhdGVkbHkuCiAgICoKICAgKiBJZiBbc3RhcnRdIGlzIHByb3ZpZGVkLCBtYXRjaGluZyB3aWxsIHN0YXJ0IGF0IHRoYXQgaW5kZXguCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgaXRlcmFibGUgbGF6aWx5IGNvbXB1dGVzIGFsbCB0aGUgbm9uLW92ZXJsYXBwaW5nIG1hdGNoZXMKICAgKiBvZiB0aGUgcGF0dGVybiBvbiB0aGUgc3RyaW5nLCBvcmRlcmVkIGJ5IHN0YXJ0IGluZGV4LgogICAqIElmIGEgdXNlciBvbmx5IHJlcXVlc3RzIHRoZSBmaXJzdAogICAqIG1hdGNoLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgY29tcHV0ZSBhbGwgcG9zc2libGUgbWF0Y2hlcy4KICAgKgogICAqIFRoZSBtYXRjaGVzIGFyZSBmb3VuZCBieSByZXBlYXRlZGx5IGZpbmRpbmcgdGhlIGZpcnN0IG1hdGNoCiAgICogb2YgdGhlIHBhdHRlcm4gb24gdGhlIHN0cmluZywgc3RhcnRpbmcgZnJvbSB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cwogICAqIG1hdGNoLCBhbmQgaW5pdGlhbGx5IHN0YXJ0aW5nIGZyb20gaW5kZXggemVyby4KICAgKgogICAqIElmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGVtcHR5IHN0cmluZyBhdCBzb21lIHBvaW50LCB0aGUgbmV4dAogICAqIG1hdGNoIGlzIGZvdW5kIGJ5IHN0YXJ0aW5nIGF0IHRoZSBwcmV2aW91cyBtYXRjaCdzIGVuZCBwbHVzIG9uZS4KICAgKi8KICBJdGVyYWJsZTxNYXRjaD4gYWxsTWF0Y2hlcyhTdHJpbmcgc3RyaW5nLCBbaW50IHN0YXJ0ID0gMF0pOwoKICAvKioKICAgKiBNYXRjaCB0aGlzIHBhdHRlcm4gYWdhaW5zdCB0aGUgc3RhcnQgb2YgYHN0cmluZ2AuCiAgICoKICAgKiBJZiBbc3RhcnRdIGlzIHByb3ZpZGVkLCBpdCBtdXN0IGJlIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIGAwYCAuLgogICAqIGBzdHJpbmcubGVuZ3RoYC4gSW4gdGhhdCBjYXNlLCB0aGlzIHBhdHRlbiBpcyB0ZXN0ZWQgYWdhaW5zdCB0aGUKICAgKiBzdHJpbmcgYXQgdGhlIFtzdGFydF0gcG9zaXRpb24uIFRoYXQgaXMsIGEgW01hdGNoXSBpcyByZXR1cm5lZCBpZiB0aGUKICAgKiBwYXR0ZXJuIGNhbiBtYXRjaCBhIHBhcnQgb2YgdGhlIHN0cmluZyBzdGFydGluZyBmcm9tIHBvc2l0aW9uIFtzdGFydF0uCiAgICogUmV0dXJucyBgbnVsbGAgaWYgdGhlIHBhdHRlcm4gZG9lc24ndCBtYXRjaC4KICAgKi8KICBNYXRjaCBtYXRjaEFzUHJlZml4KFN0cmluZyBzdHJpbmcsIFtpbnQgc3RhcnQgPSAwXSk7Cn0KCi8qKgogKiBBIHJlc3VsdCBmcm9tIHNlYXJjaGluZyB3aXRoaW4gYSBzdHJpbmcuCiAqCiAqIEEgTWF0Y2ggb3IgYW4gW0l0ZXJhYmxlXSBvZiBNYXRjaCBvYmplY3RzIGlzIHJldHVybmVkIGZyb20gW1BhdHRlcm5dCiAqIG1hdGNoaW5nIG1ldGhvZHMuCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBmaW5kcyBhbGwgbWF0Y2hlcyBvZiBhIFtSZWdFeHBdIGluIGEgW1N0cmluZ10KICogYW5kIGl0ZXJhdGVzIHRocm91Z2ggdGhlIHJldHVybmVkIGl0ZXJhYmxlIG9mIE1hdGNoIG9iamVjdHMuCiAqCiAqICAgICBSZWdFeHAgZXhwID0gbmV3IFJlZ0V4cChyIihcdyspIik7CiAqICAgICBTdHJpbmcgc3RyID0gIlBhcnNlIG15IHN0cmluZyI7CiAqICAgICBJdGVyYWJsZTxNYXRjaD4gbWF0Y2hlcyA9IGV4cC5hbGxNYXRjaGVzKHN0cik7CiAqICAgICBmb3IgKE1hdGNoIG0gaW4gbWF0Y2hlcykgewogKiAgICAgICBTdHJpbmcgbWF0Y2ggPSBtLmdyb3VwKDApOwogKiAgICAgICBwcmludChtYXRjaCk7CiAqICAgICB9CiAqCiAqIFRoZSBvdXRwdXQgb2YgdGhlIGV4YW1wbGUgaXM6CiAqCiAqICAgICBQYXJzZQogKiAgICAgbXkKICogICAgIHN0cmluZwogKgogKiBTb21lIHBhdHRlcm5zLCByZWd1bGFyIGV4cHJlc3Npb25zIGluIHBhcnRpY3VsYXIsIG1heSByZWNvcmQgc3Vic3RyaW5ncwogKiB0aGF0IHdlcmUgcGFydCBvZiB0aGUgbWF0Y2hpbmcuIFRoZXNlIGFyZSBjYWxsZWQgX2dyb3Vwc18gaW4gdGhlIE1hdGNoCiAqIG9iamVjdC4gU29tZSBwYXR0ZXJucyBtYXkgbmV2ZXIgaGF2ZSBhbnkgZ3JvdXBzLCBhbmQgdGhlaXIgbWF0Y2hlcyBhbHdheXMKICogaGF2ZSB6ZXJvIFtncm91cENvdW50XS4KICovCmFic3RyYWN0IGNsYXNzIE1hdGNoIHsKICAvKioKICAgKiBSZXR1cm5zIHRoZSBpbmRleCBpbiB0aGUgc3RyaW5nIHdoZXJlIHRoZSBtYXRjaCBzdGFydHMuCiAgICovCiAgaW50IGdldCBzdGFydDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgaW5kZXggaW4gdGhlIHN0cmluZyBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlCiAgICogbWF0Y2guCiAgICovCiAgaW50IGdldCBlbmQ7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHN0cmluZyBtYXRjaGVkIGJ5IHRoZSBnaXZlbiBbZ3JvdXBdLgogICAqCiAgICogSWYgW2dyb3VwXSBpcyAwLCByZXR1cm5zIHRoZSBtYXRjaCBvZiB0aGUgcGF0dGVybi4KICAgKgogICAqIFRoZSByZXN1bHQgbWF5IGJlIGBudWxsYCBpZiB0aGUgcGF0dGVybiBkaWRuJ3QgYXNzaWduIGEgdmFsdWUgdG8gaXQKICAgKiBhcyBwYXJ0IG9mIHRoaXMgbWF0Y2guCiAgICovCiAgU3RyaW5nIGdyb3VwKGludCBncm91cCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHN0cmluZyBtYXRjaGVkIGJ5IHRoZSBnaXZlbiBbZ3JvdXBdLgogICAqCiAgICogSWYgW2dyb3VwXSBpcyAwLCByZXR1cm5zIHRoZSBtYXRjaCBvZiB0aGUgcGF0dGVybi4KICAgKgogICAqIFNob3J0IGFsaWFzIGZvciBbTWF0Y2guZ3JvdXBdLgogICAqLwogIFN0cmluZyBvcGVyYXRvciBbXShpbnQgZ3JvdXApOwoKICAvKioKICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgZ3JvdXBzIHdpdGggdGhlIGdpdmVuIGluZGljZXMuCiAgICoKICAgKiBUaGUgbGlzdCBjb250YWlucyB0aGUgc3RyaW5ncyByZXR1cm5lZCBieSBbZ3JvdXBdIGZvciBlYWNoIGluZGV4IGluCiAgICogW2dyb3VwSW5kaWNlc10uCiAgICovCiAgTGlzdDxTdHJpbmc+IGdyb3VwcyhMaXN0PGludD4gZ3JvdXBJbmRpY2VzKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNhcHR1cmVkIGdyb3VwcyBpbiB0aGUgbWF0Y2guCiAgICoKICAgKiBTb21lIHBhdHRlcm5zIG1heSBjYXB0dXJlIHBhcnRzIG9mIHRoZSBpbnB1dCB0aGF0IHdhcyB1c2VkIHRvCiAgICogY29tcHV0ZSB0aGUgZnVsbCBtYXRjaC4gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGNhcHR1cmVkIGdyb3VwcywKICAgKiB3aGljaCBpcyBhbHNvIHRoZSBtYXhpbWFsIGFsbG93ZWQgYXJndW1lbnQgdG8gdGhlIFtncm91cF0gbWV0aG9kLgogICAqLwogIGludCBnZXQgZ3JvdXBDb3VudDsKCiAgLyoqCiAgICogVGhlIHN0cmluZyBvbiB3aGljaCB0aGlzIG1hdGNoIHdhcyBjb21wdXRlZC4KICAgKi8KICBTdHJpbmcgZ2V0IGlucHV0OwoKICAvKioKICAgKiBUaGUgcGF0dGVybiB1c2VkIHRvIHNlYXJjaCBpbiBbaW5wdXRdLgogICAqLwogIFBhdHRlcm4gZ2V0IHBhdHRlcm47Cn0KgIUATk48ARMBBDMEGURPTBUGNwVABUs7J0MFQUk0BUVGBj4BBjcFR0ZLTDIGNwIBBCwDSBUDR0ADKic2IiQXCQMhAw0KDgNLSk0bBBcGPQYRAQZFDAYPAQY2BTgFSRwGGwEGNgU4BSQGIQEGOgVJFQYvAQY5BUNERwYWAQYyBhQBBiwGFwIBFmRhcnQ6Y29yZS9wYXR0ZXJuLmRhcnQsb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvcmVnZXhwLmRhcnSTRy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCi8qKgogKiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLgogKgogKiBSZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBbUGF0dGVybl1zLCBhbmQgY2FuIGFzIHN1Y2ggYmUgdXNlZCB0byBtYXRjaCBzdHJpbmdzCiAqIG9yIHBhcnRzIG9mIHN0cmluZ3MuCiAqCiAqIERhcnQgcmVndWxhciBleHByZXNzaW9ucyBoYXZlIHRoZSBzYW1lIHN5bnRheCBhbmQgc2VtYW50aWNzIGFzCiAqIEphdmFTY3JpcHQgcmVndWxhciBleHByZXNzaW9ucy4gU2VlCiAqIDxodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy0xNS4xMD4KICogZm9yIHRoZSBzcGVjaWZpY2F0aW9uIG9mIEphdmFTY3JpcHQgcmVndWxhciBleHByZXNzaW9ucy4KICoKICogW2ZpcnN0TWF0Y2hdIGlzIHRoZSBtYWluIGltcGxlbWVudGF0aW9uIG1ldGhvZCB0aGF0IGFwcGxpZXMgYSByZWd1bGFyCiAqIGV4cHJlc3Npb24gdG8gYSBzdHJpbmcgYW5kIHJldHVybnMgdGhlIGZpcnN0IFtNYXRjaF0uIEFsbAogKiBvdGhlciBtZXRob2RzIGluIFtSZWdFeHBdIGNhbiBidWlsZCBvbiBpdC4KICoKICogVXNlIFthbGxNYXRjaGVzXSB0byBsb29rIGZvciBhbGwgbWF0Y2hlcyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbgogKiBhIHN0cmluZy4KICoKICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGZpbmRzIGFsbCBtYXRjaGVzIG9mIGEgcmVndWxhciBleHByZXNzaW9uIGluCiAqIGEgc3RyaW5nLgogKiBgYGBkYXJ0CiAqIFJlZ0V4cCBleHAgPSBuZXcgUmVnRXhwKHIiKFx3KykiKTsKICogU3RyaW5nIHN0ciA9ICJQYXJzZSBteSBzdHJpbmciOwogKiBJdGVyYWJsZTxNYXRjaD4gbWF0Y2hlcyA9IGV4cC5hbGxNYXRjaGVzKHN0cik7CiAqIGBgYAogKgogKiBOb3RlIHRoZSB1c2Ugb2YgYSBfcmF3IHN0cmluZ18gKGEgc3RyaW5nIHByZWZpeGVkIHdpdGggYHJgKQogKiBpbiB0aGUgZXhhbXBsZSBhYm92ZS4gVXNlIGEgcmF3IHN0cmluZyB0byB0cmVhdCBlYWNoIGNoYXJhY3RlciBpbiBhIHN0cmluZwogKiBhcyBhIGxpdGVyYWwgY2hhcmFjdGVyLgogKi8KYWJzdHJhY3QgY2xhc3MgUmVnRXhwIGltcGxlbWVudHMgUGF0dGVybiB7CiAgLyoqCiAgICogQ29uc3RydWN0cyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KICAgKgogICAqIFRocm93cyBhIFtGb3JtYXRFeGNlcHRpb25dIGlmIFtzb3VyY2VdIGlzIG5vdCB2YWxpZCByZWd1bGFyCiAgICogZXhwcmVzc2lvbiBzeW50YXguCiAgICoKICAgKiBJZiBgbXVsdGlMaW5lYCBpcyBlbmFibGVkLCB0aGVuIGBeYCBhbmQgYCRgIHdpbGwgbWF0Y2ggdGhlIGJlZ2lubmluZyBhbmQKICAgKiBlbmQgb2YgYSBfbGluZV8sIGluIGFkZGl0aW9uIHRvIG1hdGNoaW5nIGJlZ2lubmluZyBhbmQgZW5kIG9mIGlucHV0LAogICAqIHJlc3BlY3RpdmVseS4KICAgKgogICAqIElmIGBjYXNlU2Vuc2l0aXZlYCBpcyBkaXNhYmxlZCwgdGhlbiBjYXNlIGlzIGlnbm9yZWQuCiAgICoKICAgKiBFeGFtcGxlOgogICAqCiAgICogYGBgZGFydAogICAqIHZhciB3b3JkUGF0dGVybiA9IFJlZ0V4cChyIihcdyspIik7CiAgICogdmFyIGJyYWNrZXRlZE51bWJlclZhbHVlID0gUmVnRXhwKCIka2V5OiBcXFtcXGQrXFxdIik7CiAgICogYGBgCiAgICoKICAgKiBOb3RpY2UgdGhlIHVzZSBvZiBhIF9yYXcgc3RyaW5nXyBpbiB0aGUgZmlyc3QgZXhhbXBsZSwgYW5kIGEgcmVndWxhcgogICAqIHN0cmluZyBpbiB0aGUgc2Vjb25kLiBCZWNhdXNlIG9mIHRoZSBtYW55IGNoYXJhY3RlciBjbGFzc2VzIHVzZWQgaW4KICAgKiByZWd1bGFyIGV4cHJlc3Npb25zLCBpdCBpcyBjb21tb24gdG8gdXNlIGEgcmF3IHN0cmluZyBoZXJlLCB1bmxlc3Mgc3RyaW5nCiAgICogaW50ZXJwb2xhdGlvbiBpcyByZXF1aXJlZC4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IFJlZ0V4cChTdHJpbmcgc291cmNlLAogICAgICB7Ym9vbCBtdWx0aUxpbmUgPSBmYWxzZSwgYm9vbCBjYXNlU2Vuc2l0aXZlID0gdHJ1ZX0pOwoKICAvKioKICAgKiBSZXR1cm5zIGEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyBbdGV4dF0uCiAgICoKICAgKiBJZiBbdGV4dF0gY29udGFpbnMgY2hhcmFjdGVycyB0aGF0IGFyZSBtZWFuaW5nZnVsIGluIHJlZ3VsYXIgZXhwcmVzc2lvbnMsCiAgICogdGhlIHJlc3VsdGluZyByZWd1bGFyIGV4cHJlc3Npb24gd2lsbCBtYXRjaCB0aG9zZSBjaGFyYWN0ZXJzIGxpdGVyYWxseS4KICAgKiBJZiBbdGV4dF0gY29udGFpbnMgbm8gY2hhcmFjdGVycyB0aGF0IGhhdmUgc3BlY2lhbCBtZWFuaW5nIGluIGEgcmVndWxhcgogICAqIGV4cHJlc3Npb24sIGl0IGlzIHJldHVybmVkIHVubW9kaWZpZWQuCiAgICoKICAgKiBUaGUgY2hhcmFjdGVycyB0aGF0IGhhdmUgc3BlY2lhbCBtZWFuaW5nIGluIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlOgogICAqIGAoYCwgYClgLCBgW2AsIGBdYCwgYHtgLCBgfWAsIGAqYCwgYCtgLCBgP2AsIGAuYCwgYF5gLCBgJGAsIGB8YCBhbmQgYFxgLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyB0ZXh0KTsKCiAgLyoqCiAgICogU2VhcmNoZXMgZm9yIHRoZSBmaXJzdCBtYXRjaCBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uCiAgICogaW4gdGhlIHN0cmluZyBbaW5wdXRdLiBSZXR1cm5zIGBudWxsYCBpZiB0aGVyZSBpcyBubyBtYXRjaC4KICAgKi8KICBNYXRjaCBmaXJzdE1hdGNoKFN0cmluZyBpbnB1dCk7CgogIC8qKgogICAqIFJldHVybnMgYW4gaXRlcmFibGUgb2YgdGhlIG1hdGNoZXMgb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBvbiBbaW5wdXRdLgogICAqCiAgICogSWYgW3N0YXJ0XSBpcyBwcm92aWRlZCwgb25seSBzdGFydCBsb29raW5nIGZvciBtYXRjaGVzIGF0IGBzdGFydGAuCiAgICovCiAgSXRlcmFibGU8TWF0Y2g+IGFsbE1hdGNoZXMoU3RyaW5nIGlucHV0LCBbaW50IHN0YXJ0ID0gMF0pOwoKICAvKioKICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBoYXMgYSBtYXRjaCBpbiB0aGUgc3RyaW5nIFtpbnB1dF0uCiAgICovCiAgYm9vbCBoYXNNYXRjaChTdHJpbmcgaW5wdXQpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBzdWJzdHJpbmcgbWF0Y2ggb2YgdGhpcyByZWd1bGFyIGV4cHJlc3Npb24gaW4gW2lucHV0XS4KICAgKi8KICBTdHJpbmcgc3RyaW5nTWF0Y2goU3RyaW5nIGlucHV0KTsKCiAgLyoqCiAgICogVGhlIHNvdXJjZSByZWd1bGFyIGV4cHJlc3Npb24gc3RyaW5nIHVzZWQgdG8gY3JlYXRlIHRoaXMgYFJlZ0V4cGAuCiAgICovCiAgU3RyaW5nIGdldCBwYXR0ZXJuOwoKICAvKioKICAgKiBXaGV0aGVyIHRoaXMgcmVndWxhciBleHByZXNzaW9uIG1hdGNoZXMgbXVsdGlwbGUgbGluZXMuCiAgICoKICAgKiBJZiB0aGUgcmVnZXhwIGRvZXMgbWF0Y2ggbXVsdGlwbGUgbGluZXMsIHRoZSAiXiIgYW5kICIkIiBjaGFyYWN0ZXJzCiAgICogbWF0Y2ggdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGxpbmVzLiBJZiBub3QsIHRoZSBjaGFyYWN0ZXIgbWF0Y2ggdGhlCiAgICogYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIGlucHV0LgogICAqLwogIGJvb2wgZ2V0IGlzTXVsdGlMaW5lOwoKICAvKioKICAgKiBXaGV0aGVyIHRoaXMgcmVndWxhciBleHByZXNzaW9uIGlzIGNhc2Ugc2Vuc2l0aXZlLgogICAqCiAgICogSWYgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBub3QgY2FzZSBzZW5zaXRpdmUsIGl0IHdpbGwgbWF0Y2ggYW4gaW5wdXQKICAgKiBsZXR0ZXIgd2l0aCBhIHBhdHRlcm4gbGV0dGVyIGV2ZW4gaWYgdGhlIHR3byBsZXR0ZXJzIGFyZSBkaWZmZXJlbnQgY2FzZQogICAqIHZlcnNpb25zIG9mIHRoZSBzYW1lIGxldHRlci4KICAgKi8KICBib29sIGdldCBpc0Nhc2VTZW5zaXRpdmU7Cn0KCi8qKgogKiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaC4KICoKICogUmVndWxhciBleHByZXNzaW9uIG1hdGNoZXMgYXJlIFtNYXRjaF1lcywgYnV0IGFsc28gaW5jbHVkZSB0aGUgYWJpbGl0eQogKiB0byByZXRyaWV2ZSB0aGUgbmFtZXMgZm9yIGFueSBuYW1lZCBjYXB0dXJlIGdyb3VwcyBhbmQgdG8gcmV0cmlldmUKICogbWF0Y2hlcyBmb3IgbmFtZWQgY2FwdHVyZSBncm91cHMgYnkgbmFtZSBpbnN0ZWFkIG9mIHRoZWlyIGluZGV4LgogKi8KYWJzdHJhY3QgY2xhc3MgUmVnRXhwTWF0Y2ggaW1wbGVtZW50cyBNYXRjaCB7CiAgLyoqCiAgICogVGhlIHN0cmluZyBtYXRjaGVkIGJ5IHRoZSBncm91cCBuYW1lZCBbbmFtZV0uCiAgICoKICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgbWF0Y2hlZCBieSB0aGUgY2FwdHVyZSBncm91cCBuYW1lZCBbbmFtZV0sIG9yCiAgICogYG51bGxgIGlmIG5vIHN0cmluZyB3YXMgbWF0Y2hlZCBieSB0aGF0IGNhcHR1cmUgZ3JvdXAgYXMgcGFydCBvZgogICAqIHRoaXMgbWF0Y2guCiAgICoKICAgKiBUaGUgW25hbWVdIG11c3QgYmUgdGhlIG5hbWUgb2YgYSBuYW1lZCBjYXB0dXJlIGdyb3VwIGluIHRoZSByZWd1bGFyCiAgICogZXhwcmVzc2lvbiBjcmVhdGluZyB0aGlzIG1hdGNoICh0aGF0IGlzLCB0aGUgbmFtZSBtdXN0IGJlIGluCiAgICogW2dyb3VwTmFtZXNdKS4KICAgKi8KICBTdHJpbmcgbmFtZWRHcm91cChTdHJpbmcgbmFtZSk7CgogIC8qKgogICAqIFRoZSBuYW1lcyBvZiB0aGUgY2FwdHVyZWQgZ3JvdXBzIGluIHRoZSBtYXRjaC4KICAgKi8KICBJdGVyYWJsZTxTdHJpbmc+IGdldCBncm91cE5hbWVzOwp9CoCYAE5OPAETAQQhA1AYA0InOzwDST0uA0cNA0YNCyYjMgcDP04bBCsGJgVBGAVOShMFOwUOBQ0pPAkFSklPIAYpPAEGNwVPTU0sBUpOBi4BBjxBBiIBBk4FSAY9AQZPBh8BBk4GJAEGSAYWAQY9BUlLJQYYAQY4BU1NIgYcAgEEHwNKRkQELgYzBUZGEQVJQhQGIgEGNAYjAgEVZGFydDpjb3JlL3JlZ2V4cC5kYXJ0KW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL3NldC5kYXJ0pTcvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogQSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgaW4gd2hpY2ggZWFjaCBvYmplY3QgY2FuIG9jY3VyIG9ubHkgb25jZS4KICoKICogVGhhdCBpcywgZm9yIGVhY2ggb2JqZWN0IG9mIHRoZSBlbGVtZW50IHR5cGUsIHRoZSBvYmplY3QgaXMgZWl0aGVyIGNvbnNpZGVyZWQKICogdG8gYmUgaW4gdGhlIHNldCwgb3IgdG8gX25vdF8gYmUgaW4gdGhlIHNldC4KICoKICogU2V0IGltcGxlbWVudGF0aW9ucyBtYXkgY29uc2lkZXIgc29tZSBlbGVtZW50cyBpbmRpc3Rpbmd1aXNoYWJsZS4gVGhlc2UKICogZWxlbWVudHMgYXJlIHRyZWF0ZWQgYXMgYmVpbmcgdGhlIHNhbWUgZm9yIGFueSBvcGVyYXRpb24gb24gdGhlIHNldC4KICoKICogVGhlIGRlZmF1bHQgW1NldF0gaW1wbGVtZW50YXRpb24sIFtMaW5rZWRIYXNoU2V0XSwgY29uc2lkZXJzIG9iamVjdHMKICogaW5kaXN0aW5ndWlzaGFibGUgaWYgdGhleSBhcmUgZXF1YWwgd2l0aCByZWdhcmQgdG8KICogb3BlcmF0b3IgW09iamVjdC49PV0uCiAqCiAqIEl0ZXJhdGluZyBvdmVyIGVsZW1lbnRzIG9mIGEgc2V0IG1heSBiZSBlaXRoZXIgdW5vcmRlcmVkCiAqIG9yIG9yZGVyZWQgaW4gc29tZSB3YXkuIEV4YW1wbGVzOgogKgogKiAqIEEgW0hhc2hTZXRdIGlzIHVub3JkZXJlZCwgd2hpY2ggbWVhbnMgdGhhdCBpdHMgaXRlcmF0aW9uIG9yZGVyIGlzCiAqICAgdW5zcGVjaWZpZWQsCiAqICogW0xpbmtlZEhhc2hTZXRdIGl0ZXJhdGVzIGluIHRoZSBpbnNlcnRpb24gb3JkZXIgb2YgaXRzIGVsZW1lbnRzLCBhbmQKICogKiBhIHNvcnRlZCBzZXQgbGlrZSBbU3BsYXlUcmVlU2V0XSBpdGVyYXRlcyB0aGUgZWxlbWVudHMgaW4gc29ydGVkIG9yZGVyLgogKgogKiBJdCBpcyBnZW5lcmFsbHkgbm90IGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBzZXQgKGFkZCBvciByZW1vdmUgZWxlbWVudHMpIHdoaWxlCiAqIGFuIG9wZXJhdGlvbiBvbiB0aGUgc2V0IGlzIGJlaW5nIHBlcmZvcm1lZCwgZm9yIGV4YW1wbGUgZHVyaW5nIGEgY2FsbCB0bwogKiBbZm9yRWFjaF0gb3IgW2NvbnRhaW5zQWxsXS4gTm9yIGlzIGl0IGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBzZXQgd2hpbGUKICogaXRlcmF0aW5nIGVpdGhlciB0aGUgc2V0IGl0c2VsZiBvciBhbnkgW0l0ZXJhYmxlXSB0aGF0IGlzIGJhY2tlZCBieSB0aGUgc2V0LAogKiBzdWNoIGFzIHRoZSBvbmVzIHJldHVybmVkIGJ5IG1ldGhvZHMgbGlrZSBbd2hlcmVdIGFuZCBbbWFwXS4KICoKICogSXQgaXMgZ2VuZXJhbGx5IG5vdCBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgZXF1YWxpdHkgb2YgZWxlbWVudHMgKGFuZCB0aHVzIG5vdAogKiB0aGVpciBoYXNoY29kZSkgd2hpbGUgdGhleSBhcmUgaW4gdGhlIHNldC4gU29tZSBzcGVjaWFsaXplZCBzdWJ0eXBlcyBtYXkgYmUKICogbW9yZSBwZXJtaXNzaXZlLCBpbiB3aGljaCBjYXNlIHRoZXkgc2hvdWxkIGRvY3VtZW50IHRoaXMgYmVoYXZpb3IuCiAqLwphYnN0cmFjdCBjbGFzcyBTZXQ8RT4gZXh0ZW5kcyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxFPiB7CiAgLyoqCiAgICogQ3JlYXRlcyBhbiBlbXB0eSBbU2V0XS4KICAgKgogICAqIFRoZSBjcmVhdGVkIFtTZXRdIGlzIGEgcGxhaW4gW0xpbmtlZEhhc2hTZXRdLgogICAqIEFzIHN1Y2gsIGl0IGNvbnNpZGVycyBlbGVtZW50cyB0aGF0IGFyZSBlcXVhbCAodXNpbmcgW29wZXJhdG9yID09XSkgdG8gYmUKICAgKiBpbmRpc3Rpbmd1aXNoYWJsZSwgYW5kIHJlcXVpcmVzIHRoZW0gdG8gaGF2ZSBhIGNvbXBhdGlibGUKICAgKiBbT2JqZWN0Lmhhc2hDb2RlXSBpbXBsZW1lbnRhdGlvbi4KICAgKgogICAqIFRoZSBzZXQgaXMgZXF1aXZhbGVudCB0byBvbmUgY3JlYXRlZCBieSBgbmV3IExpbmtlZEhhc2hTZXQ8RT4oKWAuCiAgICovCiAgZmFjdG9yeSBTZXQoKSA9IExpbmtlZEhhc2hTZXQ8RT47CgogIC8qKgogICAqIENyZWF0ZXMgYW4gZW1wdHkgaWRlbnRpdHkgW1NldF0uCiAgICoKICAgKiBUaGUgY3JlYXRlZCBbU2V0XSBpcyBhIFtMaW5rZWRIYXNoU2V0XSB0aGF0IHVzZXMgaWRlbnRpdHkgYXMgZXF1YWxpdHkKICAgKiByZWxhdGlvbi4KICAgKgogICAqIFRoZSBzZXQgaXMgZXF1aXZhbGVudCB0byBvbmUgY3JlYXRlZCBieSBgbmV3IExpbmtlZEhhc2hTZXQ8RT4uaWRlbnRpdHkoKWAuCiAgICovCiAgZmFjdG9yeSBTZXQuaWRlbnRpdHkoKSA9IExpbmtlZEhhc2hTZXQ8RT4uaWRlbnRpdHk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbU2V0XSB0aGF0IGNvbnRhaW5zIGFsbCBbZWxlbWVudHNdLgogICAqCiAgICogQWxsIHRoZSBbZWxlbWVudHNdIHNob3VsZCBiZSBpbnN0YW5jZXMgb2YgW0VdLgogICAqIFRoZSBgZWxlbWVudHNgIGl0ZXJhYmxlIGl0c2VsZiBjYW4gaGF2ZSBhbnkgdHlwZSwKICAgKiBzbyB0aGlzIGNvbnN0cnVjdG9yIGNhbiBiZSB1c2VkIHRvIGRvd24tY2FzdCBhIGBTZXRgLCBmb3IgZXhhbXBsZSBhczoKICAgKgogICAqICAgICBTZXQ8U3VwZXJUeXBlPiBzdXBlclNldCA9IC4uLjsKICAgKiAgICAgU2V0PFN1YlR5cGU+IHN1YlNldCA9CiAgICogICAgICAgICBuZXcgU2V0PFN1YlR5cGU+LmZyb20oc3VwZXJTZXQud2hlcmUoKGUpID0+IGUgaXMgU3ViVHlwZSkpOwogICAqCiAgICogVGhlIGNyZWF0ZWQgW1NldF0gaXMgYSBbTGlua2VkSGFzaFNldF0uIEFzIHN1Y2gsIGl0IGNvbnNpZGVycyBlbGVtZW50cyB0aGF0CiAgICogYXJlIGVxdWFsICh1c2luZyBbb3BlcmF0b3IgPT1dKSB0byBiZSBpbmRpc3Rpbmd1aXNoYWJsZSwgYW5kIHJlcXVpcmVzIHRoZW0gdG8KICAgKiBoYXZlIGEgY29tcGF0aWJsZSBbT2JqZWN0Lmhhc2hDb2RlXSBpbXBsZW1lbnRhdGlvbi4KICAgKgogICAqIFRoZSBzZXQgaXMgZXF1aXZhbGVudCB0byBvbmUgY3JlYXRlZCBieQogICAqIGBuZXcgTGlua2VkSGFzaFNldDxFPi5mcm9tKGVsZW1lbnRzKWAuCiAgICovCiAgZmFjdG9yeSBTZXQuZnJvbShJdGVyYWJsZSBlbGVtZW50cykgPSBMaW5rZWRIYXNoU2V0PEU+LmZyb207CgogIC8qKgogICAqIENyZWF0ZXMgYSBbU2V0XSBmcm9tIFtlbGVtZW50c10uCiAgICoKICAgKiBUaGUgY3JlYXRlZCBbU2V0XSBpcyBhIFtMaW5rZWRIYXNoU2V0XS4gQXMgc3VjaCwgaXQgY29uc2lkZXJzIGVsZW1lbnRzIHRoYXQKICAgKiBhcmUgZXF1YWwgKHVzaW5nIFtvcGVyYXRvciA9PV0pIHRvIGJlIGluZGlzdGluZ3Vpc2hhYmxlLCBhbmQgcmVxdWlyZXMgdGhlbSB0bwogICAqIGhhdmUgYSBjb21wYXRpYmxlIFtPYmplY3QuaGFzaENvZGVdIGltcGxlbWVudGF0aW9uLgogICAqCiAgICogVGhlIHNldCBpcyBlcXVpdmFsZW50IHRvIG9uZSBjcmVhdGVkIGJ5CiAgICogYG5ldyBMaW5rZWRIYXNoU2V0PEU+Lm9mKGVsZW1lbnRzKWAuCiAgICovCiAgZmFjdG9yeSBTZXQub2YoSXRlcmFibGU8RT4gZWxlbWVudHMpID0gTGlua2VkSGFzaFNldDxFPi5vZjsKCiAgLyoqCiAgICogQWRhcHRzIFtzb3VyY2VdIHRvIGJlIGEgYFNldDxUPmAuCiAgICoKICAgKiBJZiBbbmV3U2V0XSBpcyBwcm92aWRlZCwgaXQgaXMgdXNlZCB0byBjcmVhdGUgdGhlIG5ldyBzZXRzIHJldHVybmVkCiAgICogYnkgW3RvU2V0XSwgW3VuaW9uXSwgYW5kIGlzIGFsc28gdXNlZCBmb3IgW2ludGVyc2VjdGlvbl0gYW5kIFtkaWZmZXJlbmNlXS4KICAgKiBJZiBbbmV3U2V0XSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBjcmVhdGluZyBhIG5ldyBzZXQgdXNpbmcgdGhlCiAgICogZGVmYXVsdCBbU2V0XSBjb25zdHJ1Y3RvciwgYW5kIFtpbnRlcnNlY3Rpb25dIGFuZCBbZGlmZmVyZW5jZV0KICAgKiByZXR1cm5zIGFuIGFkYXB0ZWQgdmVyc2lvbiBvZiBjYWxsaW5nIHRoZSBzYW1lIG1ldGhvZCBvbiB0aGUgc291cmNlLgogICAqCiAgICogQW55IHRpbWUgdGhlIHNldCB3b3VsZCBwcm9kdWNlIGFuIGVsZW1lbnQgdGhhdCBpcyBub3QgYSBbVF0sCiAgICogdGhlIGVsZW1lbnQgYWNjZXNzIHdpbGwgdGhyb3cuCiAgICoKICAgKiBBbnkgdGltZSBhIFtUXSB2YWx1ZSBpcyBhdHRlbXB0ZWQgYWRkZWQgaW50byB0aGUgYWRhcHRlZCBzZXQsCiAgICogdGhlIHN0b3JlIHdpbGwgdGhyb3cgdW5sZXNzIHRoZSB2YWx1ZSBpcyBhbHNvIGFuIGluc3RhbmNlIG9mIFtTXS4KICAgKgogICAqIElmIGFsbCBhY2Nlc3NlZCBlbGVtZW50cyBvZiBbc291cmNlXSBhcmUgYWN0dWFsbHkgaW5zdGFuY2VzIG9mIFtUXSwKICAgKiBhbmQgaWYgYWxsIGVsZW1lbnRzIGFkZGVkIHRvIHRoZSByZXR1cm5lZCBzZXQgYXJlIGFjdHVhbGx5IGluc3RhbmNlCiAgICogb2YgW1NdLAogICAqIHRoZW4gdGhlIHJldHVybmVkIHNldCBjYW4gYmUgdXNlZCBhcyBhIGBTZXQ8VD5gLgogICAqLwogIHN0YXRpYyBTZXQ8VD4gY2FzdEZyb208UywgVD4oU2V0PFM+IHNvdXJjZSwge1NldDxSPiBGdW5jdGlvbjxSPigpIG5ld1NldH0pID0+CiAgICAgIENhc3RTZXQ8UywgVD4oc291cmNlLCBuZXdTZXQpOwoKICAvKioKICAgKiBQcm92aWRlcyBhIHZpZXcgb2YgdGhpcyBzZXQgYXMgYSBzZXQgb2YgW1JdIGluc3RhbmNlcy4KICAgKgogICAqIElmIHRoaXMgc2V0IGNvbnRhaW5zIG9ubHkgaW5zdGFuY2VzIG9mIFtSXSwgYWxsIHJlYWQgb3BlcmF0aW9ucwogICAqIHdpbGwgd29yayBjb3JyZWN0bHkuIElmIGFueSBvcGVyYXRpb24gdHJpZXMgdG8gYWNjZXNzIGFuIGVsZW1lbnQKICAgKiB0aGF0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBbUl0sIHRoZSBhY2Nlc3Mgd2lsbCB0aHJvdyBpbnN0ZWFkLgogICAqCiAgICogRWxlbWVudHMgYWRkZWQgdG8gdGhlIHNldCAoZS5nLiwgYnkgdXNpbmcgW2FkZF0gb3IgW2FkZEFsbF0pCiAgICogbXVzdCBiZSBpbnN0YW5jZSBvZiBbUl0gdG8gYmUgdmFsaWQgYXJndW1lbnRzIHRvIHRoZSBhZGRpbmcgZnVuY3Rpb24sCiAgICogYW5kIHRoZXkgbXVzdCBiZSBpbnN0YW5jZXMgb2YgW0VdIGFzIHdlbGwgdG8gYmUgYWNjZXB0ZWQgYnkKICAgKiB0aGlzIHNldCBhcyB3ZWxsLgogICAqLwogIFNldDxSPiBjYXN0PFI+KCk7CiAgLyoqCiAgICogUHJvdmlkZXMgYW4gaXRlcmF0b3IgdGhhdCBpdGVyYXRlcyBvdmVyIHRoZSBlbGVtZW50cyBvZiB0aGlzIHNldC4KICAgKgogICAqIFRoZSBvcmRlciBvZiBpdGVyYXRpb24gaXMgZGVmaW5lZCBieSB0aGUgaW5kaXZpZHVhbCBgU2V0YCBpbXBsZW1lbnRhdGlvbiwKICAgKiBidXQgbXVzdCBiZSBjb25zaXN0ZW50IGJldHdlZW4gY2hhbmdlcyB0byB0aGUgc2V0LgogICAqLwogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvcjsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIFt2YWx1ZV0gaXMgaW4gdGhlIHNldC4KICAgKi8KICBib29sIGNvbnRhaW5zKE9iamVjdCB2YWx1ZSk7CgogIC8qKgogICAqIEFkZHMgW3ZhbHVlXSB0byB0aGUgc2V0LgogICAqCiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgW3ZhbHVlXSAob3IgYW4gZXF1YWwgdmFsdWUpIHdhcyBub3QgeWV0IGluIHRoZSBzZXQuCiAgICogT3RoZXJ3aXNlIHJldHVybnMgYGZhbHNlYCBhbmQgdGhlIHNldCBpcyBub3QgY2hhbmdlZC4KICAgKgogICAqIEV4YW1wbGU6CiAgICoKICAgKiAgICAgdmFyIHNldCA9IG5ldyBTZXQoKTsKICAgKiAgICAgdmFyIHRpbWUxID0gbmV3IERhdGVUaW1lLmZyb21NaWxsaXNlY29uZHNTaW5jZUVwb2NoKDApOwogICAqICAgICB2YXIgdGltZTIgPSBuZXcgRGF0ZVRpbWUuZnJvbU1pbGxpc2Vjb25kc1NpbmNlRXBvY2goMCk7CiAgICogICAgIC8vIHRpbWUxIGFuZCB0aW1lMiBhcmUgZXF1YWwsIGJ1dCBub3QgaWRlbnRpY2FsLgogICAqICAgICBFeHBlY3QuaXNUcnVlKHRpbWUxID09IHRpbWUyKTsKICAgKiAgICAgRXhwZWN0LmlzRmFsc2UoaWRlbnRpY2FsKHRpbWUxLCB0aW1lMikpOwogICAqICAgICBzZXQuYWRkKHRpbWUxKTsgIC8vID0+IHRydWUuCiAgICogICAgIC8vIEEgdmFsdWUgZXF1YWwgdG8gdGltZTIgZXhpc3RzIGFscmVhZHkgaW4gdGhlIHNldCwgYW5kIHRoZSBjYWxsIHRvCiAgICogICAgIC8vIGFkZCBkb2Vzbid0IGNoYW5nZSB0aGUgc2V0LgogICAqICAgICBzZXQuYWRkKHRpbWUyKTsgIC8vID0+IGZhbHNlLgogICAqICAgICBFeHBlY3QuaXNUcnVlKHNldC5sZW5ndGggPT0gMSk7CiAgICogICAgIEV4cGVjdC5pc1RydWUoaWRlbnRpY2FsKHRpbWUxLCBzZXQuZmlyc3QpKTsKICAgKi8KICBib29sIGFkZChFIHZhbHVlKTsKCiAgLyoqCiAgICogQWRkcyBhbGwgW2VsZW1lbnRzXSB0byB0aGlzIFNldC4KICAgKgogICAqIEVxdWl2YWxlbnQgdG8gYWRkaW5nIGVhY2ggZWxlbWVudCBpbiBbZWxlbWVudHNdIHVzaW5nIFthZGRdLAogICAqIGJ1dCBzb21lIGNvbGxlY3Rpb25zIG1heSBiZSBhYmxlIHRvIG9wdGltaXplIGl0LgogICAqLwogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGVsZW1lbnRzKTsKCiAgLyoqCiAgICogUmVtb3ZlcyBbdmFsdWVdIGZyb20gdGhlIHNldC4gUmV0dXJucyB0cnVlIGlmIFt2YWx1ZV0gd2FzCiAgICogaW4gdGhlIHNldC4gUmV0dXJucyBmYWxzZSBvdGhlcndpc2UuIFRoZSBtZXRob2QgaGFzIG5vIGVmZmVjdAogICAqIGlmIFt2YWx1ZV0gdmFsdWUgd2FzIG5vdCBpbiB0aGUgc2V0LgogICAqLwogIGJvb2wgcmVtb3ZlKE9iamVjdCB2YWx1ZSk7CgogIC8qKgogICAqIElmIGFuIG9iamVjdCBlcXVhbCB0byBbb2JqZWN0XSBpcyBpbiB0aGUgc2V0LCByZXR1cm4gaXQuCiAgICoKICAgKiBDaGVja3Mgd2hldGhlciBbb2JqZWN0XSBpcyBpbiB0aGUgc2V0LCBsaWtlIFtjb250YWluc10sIGFuZCBpZiBzbywKICAgKiByZXR1cm5zIHRoZSBvYmplY3QgaW4gdGhlIHNldCwgb3RoZXJ3aXNlIHJldHVybnMgYG51bGxgLgogICAqCiAgICogSWYgdGhlIGVxdWFsaXR5IHJlbGF0aW9uIHVzZWQgYnkgdGhlIHNldCBpcyBub3QgaWRlbnRpdHksCiAgICogdGhlbiB0aGUgcmV0dXJuZWQgb2JqZWN0IG1heSBub3QgYmUgKmlkZW50aWNhbCogdG8gW29iamVjdF0uCiAgICogU29tZSBzZXQgaW1wbGVtZW50YXRpb25zIG1heSBub3QgYmUgYWJsZSB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCiAgICogSWYgdGhlIFtjb250YWluc10gbWV0aG9kIGlzIGNvbXB1dGVkLAogICAqIHJhdGhlciB0aGFuIGJlaW5nIGJhc2VkIG9uIGFuIGFjdHVhbCBvYmplY3QgaW5zdGFuY2UsCiAgICogdGhlbiB0aGVyZSBtYXkgbm90IGJlIGEgc3BlY2lmaWMgb2JqZWN0IGluc3RhbmNlIHJlcHJlc2VudGluZyB0aGUKICAgKiBzZXQgZWxlbWVudC4KICAgKi8KICBFIGxvb2t1cChPYmplY3Qgb2JqZWN0KTsKCiAgLyoqCiAgICogUmVtb3ZlcyBlYWNoIGVsZW1lbnQgb2YgW2VsZW1lbnRzXSBmcm9tIHRoaXMgc2V0LgogICAqLwogIHZvaWQgcmVtb3ZlQWxsKEl0ZXJhYmxlPE9iamVjdD4gZWxlbWVudHMpOwoKICAvKioKICAgKiBSZW1vdmVzIGFsbCBlbGVtZW50cyBvZiB0aGlzIHNldCB0aGF0IGFyZSBub3QgZWxlbWVudHMgaW4gW2VsZW1lbnRzXS4KICAgKgogICAqIENoZWNrcyBmb3IgZWFjaCBlbGVtZW50IG9mIFtlbGVtZW50c10gd2hldGhlciB0aGVyZSBpcyBhbiBlbGVtZW50IGluIHRoaXMKICAgKiBzZXQgdGhhdCBpcyBlcXVhbCB0byBpdCAoYWNjb3JkaW5nIHRvIGB0aGlzLmNvbnRhaW5zYCksIGFuZCBpZiBzbywgdGhlCiAgICogZXF1YWwgZWxlbWVudCBpbiB0aGlzIHNldCBpcyByZXRhaW5lZCwgYW5kIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBlcXVhbAogICAqIHRvIGFueSBlbGVtZW50IGluIGBlbGVtZW50c2AgYXJlIHJlbW92ZWQuCiAgICovCiAgdm9pZCByZXRhaW5BbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cyk7CgogIC8qKgogICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIG9mIHRoaXMgc2V0IHRoYXQgc2F0aXNmeSBbdGVzdF0uCiAgICovCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSk7CgogIC8qKgogICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIG9mIHRoaXMgc2V0IHRoYXQgZmFpbCB0byBzYXRpc2Z5IFt0ZXN0XS4KICAgKi8KICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKTsKCiAgLyoqCiAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgU2V0IGNvbnRhaW5zIGFsbCB0aGUgZWxlbWVudHMgb2YgW290aGVyXS4KICAgKi8KICBib29sIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPE9iamVjdD4gb3RoZXIpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IHNldCB3aGljaCBpcyB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gdGhpcyBzZXQgYW5kIFtvdGhlcl0uCiAgICoKICAgKiBUaGF0IGlzLCB0aGUgcmV0dXJuZWQgc2V0IGNvbnRhaW5zIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhpcyBbU2V0XSB0aGF0CiAgICogYXJlIGFsc28gZWxlbWVudHMgb2YgW290aGVyXSBhY2NvcmRpbmcgdG8gYG90aGVyLmNvbnRhaW5zYC4KICAgKi8KICBTZXQ8RT4gaW50ZXJzZWN0aW9uKFNldDxPYmplY3Q+IG90aGVyKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBzZXQgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBlbGVtZW50cyBvZiB0aGlzIHNldCBhbmQgW290aGVyXS4KICAgKgogICAqIFRoYXQgaXMsIHRoZSByZXR1cm5lZCBzZXQgY29udGFpbnMgYWxsIHRoZSBlbGVtZW50cyBvZiB0aGlz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IHRoaXMgbWV0aG9kLgogICAqCiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBtb3JlIHRoYW4gb25jZSBpcyBhbGxvd2VkLCBidXQgZG9lcyBub3RoaW5nLgogICAqLwogIHZvaWQgY2xvc2UoKTsKfQohAE5OPAETAQQjA0kpA0gEGQYeBTEGFAEGFgU8BUYGEAIBE2RhcnQ6Y29yZS9zaW5rLmRhcnQwb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvc3RhY2t0cmFjZS5kYXJ0h7ovLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogQW4gaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGFsbCBzdGFjayB0cmFjZSBvYmplY3RzLgogKgogKiBBIFtTdGFja1RyYWNlXSBpcyBpbnRlbmRlZCB0byBjb252ZXkgaW5mb3JtYXRpb24gdG8gdGhlIHVzZXIgYWJvdXQgdGhlIGNhbGwKICogc2VxdWVuY2UgdGhhdCB0cmlnZ2VyZWQgYW4gZXhjZXB0aW9uLgogKgogKiBUaGVzZSBvYmplY3RzIGFyZSBjcmVhdGVkIGJ5IHRoZSBydW50aW1lLCBpdCBpcyBub3QgcG9zc2libGUgdG8gY3JlYXRlCiAqIHRoZW0gcHJvZ3JhbW1hdGljYWxseS4KICovCmFic3RyYWN0IGNsYXNzIFN0YWNrVHJhY2UgewogIFN0YWNrVHJhY2UoKTsgLy8gSW4gY2FzZSBleGlzdGluZyBjbGFzc2VzIGV4dGVuZCBTdGFja1RyYWNlLgoKICAvKioKICAgKiBDcmVhdGUgYSBgU3RhY2tUcmFjZWAgb2JqZWN0IGZyb20gW3N0YWNrVHJhY2VTdHJpbmddLgogICAqCiAgICogVGhlIGNyZWF0ZWQgc3RhY2sgdHJhY2Ugd2lsbCBoYXZlIGEgYHRvU3RyaW5nYCBtZXRob2QgcmV0dXJuaW5nCiAgICogYHN0YWNrVHJhY2VTdHJpbmdgLgogICAqCiAgICogVGhlIGBzdGFja1RyYWNlU3RyaW5nYCBjYW4gYmUgYSBzdHJpbmcgcmV0dXJuZWQgYnkgc29tZSBvdGhlcgogICAqIHN0YWNrIHRyYWNlLCBvciBpdCBjYW4gYmUgYW55IHN0cmluZyBhdCBhbGwuCiAgICogSWYgdGhlIHN0cmluZyBkb2Vzbid0IGxvb2sgbGlrZSBhIHN0YWNrIHRyYWNlLCBjb2RlIHRoYXQgaW50ZXJwcmV0cwogICAqIHN0YWNrIHRyYWNlcyBpcyBsaWtlbHkgdG8gZmFpbCwgc28gZmFrZSBzdGFjayB0cmFjZXMgc2hvdWxkIGJlIHVzZWQKICAgKiB3aXRoIGNhcmUuCiAgICovCiAgZmFjdG9yeSBTdGFja1RyYWNlLmZyb21TdHJpbmcoU3RyaW5nIHN0YWNrVHJhY2VTdHJpbmcpID0gX1N0cmluZ1N0YWNrVHJhY2U7CgogIC8qKgogICAqIFJldHVybnMgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudCBzdGFjayB0cmFjZS4KICAgKgogICAqIFRoaXMgaXMgc2ltaWxhciB0byB3aGF0IGNhbiBiZSBhY2hpZXZlZCBieSBkb2luZzoKICAgKgogICAqICAgICB0cnkgeyB0aHJvdyAwOyB9IGNhdGNoIChfLCBzdGFjaykgeyByZXR1cm4gc3RhY2s7IH0KICAgKgogICAqIFRoZSBnZXR0ZXIgYWNoaWV2ZXMgdGhpcyB3aXRob3V0IHRocm93aW5nLCBleGNlcHQgb24gcGxhdGZvcm1zIHRoYXQKICAgKiBoYXZlIG5vIG90aGVyIHdheSB0byBnZXQgYSBzdGFjayB0cmFjZS4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgU3RhY2tUcmFjZSBnZXQgY3VycmVudDsKCiAgLyoqCiAgICogUmV0dXJucyBhIFtTdHJpbmddIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdGFjayB0cmFjZS4KICAgKgogICAqIFRoZSBzdHJpbmcgcmVwcmVzZW50cyB0aGUgZnVsbCBzdGFjayB0cmFjZSBzdGFydGluZyBmcm9tCiAgICogdGhlIHBvaW50IHdoZXJlIGEgdGhyb3cgb2NjdXJyZWQgdG8gdGhlIHRvcCBvZiB0aGUgY3VycmVudCBjYWxsIHNlcXVlbmNlLgogICAqCiAgICogVGhlIGV4YWN0IGZvcm1hdCBvZiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGlzIG5vdCBmaW5hbC4KICAgKi8KICBTdHJpbmcgdG9TdHJpbmcoKTsKfQoKY2xhc3MgX1N0cmluZ1N0YWNrVHJhY2UgaW1wbGVtZW50cyBTdGFja1RyYWNlIHsKICBmaW5hbCBTdHJpbmcgX3N0YWNrVHJhY2U7CiAgX1N0cmluZ1N0YWNrVHJhY2UodGhpcy5fc3RhY2tUcmFjZSk7CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gX3N0YWNrVHJhY2U7Cn0KPgBOTjwBEwEEOANPKQNKGgQcPwEGOwVFGQVDMklJEAZOAQY6BTcFPQVJLQYqAQY7BT5PBUEGFQIBMBwnJAIBGWRhcnQ6Y29yZS9zdGFja3RyYWNlLmRhcnQvb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvc3RvcHdhdGNoLmRhcnSMAi8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCi8qKgogKiBBIHNpbXBsZSBzdG9wd2F0Y2ggaW50ZXJmYWNlIHRvIG1lYXN1cmUgZWxhcHNlZCB0aW1lLgogKi8KY2xhc3MgU3RvcHdhdGNoIHsKICAvKioKICAgKiBDYWNoZWQgZnJlcXVlbmN5IG9mIHRoZSBzeXN0ZW0gaW4gSHogKHRpY2tzIHBlciBzZWNvbmQpLgogICAqCiAgICogTXVzdCBiZSBpbml0aWFsaXplZCBpbiBbX2luaXRUaWNrZXJdOwogICAqLwogIHN0YXRpYyBpbnQgX2ZyZXF1ZW5jeTsKCiAgLy8gVGhlIF9zdGFydCBhbmQgX3N0b3AgZmllbGRzIGNhcHR1cmUgdGhlIHRpbWUgd2hlbiBbc3RhcnRdIGFuZCBbc3RvcF0KICAvLyBhcmUgY2FsbGVkIHJlc3BlY3RpdmVseS4KICAvLyBJZiBfc3RvcCBpcyBudWxsLCB0aGUgc3RvcHdhdGNoIGlzIHJ1bm5pbmcuCiAgaW50IF9zdGFydCA9IDA7CiAgaW50IF9zdG9wID0gMDsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtTdG9wd2F0Y2hdIGluIHN0b3BwZWQgc3RhdGUgd2l0aCBhIHplcm8gZWxhcHNlZCBjb3VudC4KICAgKgogICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gc3RhcnQgYSBbU3RvcHdhdGNoXQogICAqIGltbWVkaWF0ZWx5IGFmdGVyIGFsbG9jYXRpb24uCiAgICogYGBgCiAgICogdmFyIHN0b3B3YXRjaCA9IG5ldyBTdG9wd2F0Y2goKS4uc3RhcnQoKTsKICAgKiBgYGAKICAgKi8KICBTdG9wd2F0Y2goKSB7CiAgICBpZiAoX2ZyZXF1ZW5jeSA9PSBudWxsKSBfaW5pdFRpY2tlcigpOwogIH0KCiAgLyoqCiAgICogRnJlcXVlbmN5IG9mIHRoZSBlbGFwc2VkIGNvdW50ZXIgaW4gSHouCiAgICovCiAgaW50IGdldCBmcmVxdWVuY3kgPT4gX2ZyZXF1ZW5jeTsKCiAgLyoqCiAgICogU3RhcnRzIHRoZSBbU3RvcHdhdGNoXS4KICAgKgogICAqIFRoZSBbZWxhcHNlZF0gY291bnQgaXMgaW5jcmVhc2luZyBtb25vdG9uaWNhbGx5LiBJZiB0aGUgW1N0b3B3YXRjaF0gaGFzCiAgICogYmVlbiBzdG9wcGVkLCB0aGVuIGNhbGxpbmcgc3RhcnQgYWdhaW4gcmVzdGFydHMgaXQgd2l0aG91dCByZXNldHRpbmcgdGhlCiAgICogW2VsYXBzZWRdIGNvdW50LgogICAqCiAgICogSWYgdGhlIFtTdG9wd2F0Y2hdIGlzIGN1cnJlbnRseSBydW5uaW5nLCB0aGVuIGNhbGxpbmcgc3RhcnQgZG9lcyBub3RoaW5nLgogICAqLwogIHZvaWQgc3RhcnQoKSB7CiAgICBpZiAoX3N0b3AgIT0gbnVsbCkgewogICAgICAvLyAoUmUpc3RhcnQgdGhpcyBzdG9wd2F0Y2guCiAgICAgIC8vIERvbid0IGNvdW50IHRoZSB0aW1lIHdoaWxlIHRoZSBzdG9wd2F0Y2ggaGFzIGJlZW4gc3RvcHBlZC4KICAgICAgX3N0YXJ0ICs9IF9ub3coKSAtIF9zdG9wOwogICAgICBfc3RvcCA9IG51bGw7CiAgICB9CiAgfQoKICAvKioKICAgKiBTdG9wcyB0aGUgW1N0b3B3YXRjaF0uCiAgICoKICAgKiBUaGUgW2VsYXBzZWRUaWNrc10gY291bnQgc3RvcHMgaW5jcmVhc2luZyBhZnRlciB0aGlzIGNhbGwuIElmIHRoZQogICAqIFtTdG9wd2F0Y2hdIGlzIGN1cnJlbnRseSBub3QgcnVubmluZywgdGhlbiBjYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyBubwogICAqIGVmZmVjdC4KICAgKi8KICB2b2lkIHN0b3AoKSB7CiAgICBfc3RvcCA/Pz0gX25vdygpOwogIH0KCiAgLyoqCiAgICogUmVzZXRzIHRoZSBbZWxhcHNlZF0gY291bnQgdG8gemVyby4KICAgKgogICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHN0b3Agb3Igc3RhcnQgdGhlIFtTdG9wd2F0Y2hdLgogICAqLwogIHZvaWQgcmVzZXQoKSB7CiAgICBfc3RhcnQgPSBfc3RvcCA/PyBfbm93KCk7CiAgfQoKICAvKioKICAgKiBUaGUgZWxhcHNlZCBudW1iZXIgb2YgY2xvY2sgdGlja3Mgc2luY2UgY2FsbGluZyBbc3RhcnRdIHdoaWxlIHRoZQogICAqIFtTdG9wd2F0Y2hdIGlzIHJ1bm5pbmcuCiAgICoKICAgKiBUaGlzIGlzIHRoZSBlbGFwc2VkIG51bWJlciBvZiBjbG9jayB0aWNrcyBiZXR3ZWVuIGNhbGxpbmcgW3N0YXJ0XSBhbmQKICAgKiBjYWxsaW5nIFtzdG9wXS4KICAgKgogICAqIElzIDAgaWYgdGhlIFtTdG9wd2F0Y2hdIGhhcyBuZXZlciBiZWVuIHN0YXJ0ZWQuCiAgICoKICAgKiBUaGUgZWxhcHNlZCBudW1iZXIgb2YgY2xvY2sgdGlja3MgaW5jcmVhc2VzIGJ5IFtmcmVxdWVuY3ldIGV2ZXJ5IHNlY29uZC4KICAgKi8KICBpbnQgZ2V0IGVsYXBzZWRUaWNrcyB7CiAgICByZXR1cm4gKF9zdG9wID8/IF9ub3coKSkgLSBfc3RhcnQ7CiAgfQoKICAvKioKICAgKiBUaGUgW2VsYXBzZWRUaWNrc10gY291bnRlciBjb252ZXJ0ZWQgdG8gYSBbRHVyYXRpb25dLgogICAqLwogIER1cmF0aW9uIGdldCBlbGFwc2VkIHsKICAgIHJldHVybiBEdXJhdGlvbihtaWNyb3NlY29uZHM6IGVsYXBzZWRNaWNyb3NlY29uZHMpOwogIH0KCiAgLyoqCiAgICogVGhlIFtlbGFwc2VkVGlja3NdIGNvdW50ZXIgY29udmVydGVkIHRvIG1pY3Jvc2Vjb25kcy4KICAgKi8KICBleHRlcm5hbCBpbnQgZ2V0IGVsYXBzZWRNaWNyb3NlY29uZHM7CgogIC8qKgogICAqIFRoZSBbZWxhcHNlZFRpY2tzXSBjb3VudGVyIGNvbnZlcnRlZCB0byBtaWxsaXNlY29uZHMuCiAgICovCiAgZXh0ZXJuYWwgaW50IGdldCBlbGFwc2VkTWlsbGlzZWNvbmRzOwoKICAvKioKICAgKiBXaGV0aGVyIHRoZSBbU3RvcHdhdGNoXSBpcyBjdXJyZW50bHkgcnVubmluZy4KICAgKi8KICBib29sIGdldCBpc1J1bm5pbmcgPT4gX3N0b3AgPT0gbnVsbDsKCiAgLyoqCiAgICogSW5pdGlhbGl6ZXMgdGhlIHRpbWUtbWVhc3VyaW5nIHN5c3RlbS4gKk11c3QqIGluaXRpYWxpemUgdGhlIFtfZnJlcXVlbmN5XQogICAqIHZhcmlhYmxlLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyB2b2lkIF9pbml0VGlja2VyKCk7CiAgZXh0ZXJuYWwgc3RhdGljIGludCBfbm93KCk7Cn0KfQBOTjwBEwEEOQQSBj4FKwYZAUoeMRIRAQZHBTwjCS8JBhArBAEGLQYjAQYdBU1OFgVPBhEZI0QgFAYEAQYcBUdLDQYQFgQBBikFOQYRHgQBBkcdBUsVBTUFTgYZJwQBBjsGGTgEAQY7BigBBjsGKAEGMwYnAQZPDwYmHgIBGGRhcnQ6Y29yZS9zdG9wd2F0Y2guZGFydDRvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL3N0b3B3YXRjaF9wYXRjaC5kYXJ0hyIvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCkBwYXRjaApjbGFzcyBTdG9wd2F0Y2ggewogIHN0YXRpYyBjb25zdCBfbWF4SW50ID0gMHg3RkZGRkZGRkZGRkZGRkZGOwoKICBAcGF0Y2gKICBzdGF0aWMgdm9pZCBfaW5pdFRpY2tlcigpIHsKICAgIGlmIChfZnJlcXVlbmN5ID09IG51bGwpIHsKICAgICAgX2ZyZXF1ZW5jeSA9IF9jb21wdXRlRnJlcXVlbmN5KCk7CiAgICB9CiAgfQoKICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IGNsb2NrIHRpY2suCiAgQHBhdGNoCiAgc3RhdGljIGludCBfbm93KCkgbmF0aXZlICJTdG9wd2F0Y2hfbm93IjsKCiAgLy8gUmV0dXJucyB0aGUgZnJlcXVlbmN5IG9mIGNsb2NrIHRpY2tzIGluIEh6LgogIHN0YXRpYyBpbnQgX2NvbXB1dGVGcmVxdWVuY3koKSBuYXRpdmUgIlN0b3B3YXRjaF9mcmVxdWVuY3kiOwoKICBAcGF0Y2gKICBpbnQgZ2V0IGVsYXBzZWRNaWNyb3NlY29uZHMgewogICAgaW50IHRpY2tzID0gZWxhcHNlZFRpY2tzOwogICAgLy8gU3BlY2lhbCBjYXNlIHRoZSBtb3JlIGxpa2VseSBmcmVxdWVuY2llcyB0byBhdm9pZCBkaXZpc2lvbiwKICAgIC8vIG9yIGRpdmlkZSBieSBhIGtub3duIHZhbHVlLgogICAgaWYgKF9mcmVxdWVuY3kgPT0gMTAwMDAwMDAwMCkgcmV0dXJuIHRpY2tzIH4vIDEwMDA7CiAgICBpZiAoX2ZyZXF1ZW5jeSA9PSAxMDAwMDAwKSByZXR1cm4gdGlja3M7CiAgICBpZiAoX2ZyZXF1ZW5jeSA9PSAxMDAwKSByZXR1cm4gdGlja3MgKiAxMDAwOwogICAgaWYgKHRpY2tzIDw9IChfbWF4SW50IH4vIDEwMDAwMDApKSB7CiAgICAgIHJldHVybiAodGlja3MgKiAxMDAwMDAwKSB+LyBfZnJlcXVlbmN5OwogICAgfQogICAgLy8gTXVsdGlwbGljYXRpb24gd291bGQgaGF2ZSBvdmVyZmxvd2VkLgogICAgaW50IHRpY2tzUGVyU2Vjb25kID0gdGlja3Mgfi8gX2ZyZXF1ZW5jeTsKICAgIGludCByZW1haW5pbmdUaWNrcyA9IHRpY2tzLnJlbWFpbmRlcihfZnJlcXVlbmN5KTsKICAgIHJldHVybiB0aWNrc1BlclNlY29uZCAqIDEwMDAwMDAgKyAocmVtYWluaW5nVGlja3MgKiAxMDAwMDAwKSB+LyBfZnJlcXVlbmN5OwogIH0KCiAgQHBhdGNoCiAgaW50IGdldCBlbGFwc2VkTWlsbGlzZWNvbmRzIHsKICAgIGludCB0aWNrcyA9IGVsYXBzZWRUaWNrczsKICAgIGlmIChfZnJlcXVlbmN5ID09IDEwMDAwMDAwMDApIHJldHVybiB0aWNrcyB+LyAxMDAwMDAwOwogICAgaWYgKF9mcmVxdWVuY3kgPT0gMTAwMDAwMCkgcmV0dXJuIHRpY2tzIH4vIDEwMDA7CiAgICBpZiAoX2ZyZXF1ZW5jeSA9PSAxMDAwKSByZXR1cm4gdGlja3M7CiAgICBpZiAodGlja3MgPD0gKF9tYXhJbnQgfi8gMTAwMCkpIHsKICAgICAgcmV0dXJuICh0aWNrcyAqIDEwMDApIH4vIF9mcmVxdWVuY3k7CiAgICB9CiAgICAvLyBNdWx0aXBsaWNhdGlvbiB3b3VsZCBoYXZlIG92ZXJmbG93ZWQuCiAgICBpbnQgdGlja3NQZXJTZWNvbmQgPSB0aWNrcyB+LyBfZnJlcXVlbmN5OwogICAgaW50IHJlbWFpbmluZ1RpY2tzID0gdGlja3MucmVtYWluZGVyKF9mcmVxdWVuY3kpOwogICAgcmV0dXJuIHRpY2tzUGVyU2Vjb25kICogMTAwMCArIChyZW1haW5pbmdUaWNrcyAqIDEwMDApIH4vIF9mcmVxdWVuY3k7CiAgfQp9CjoATk48AR4BBxItAQkeHigGBAElCSwBMT8BCSAeQyM4LTEpLgYtLjZQBAEJIB47NSomKwYtLjZKBAIBJGRhcnQ6Y29yZS1wYXRjaC9zdG9wd2F0Y2hfcGF0Y2guZGFydCxvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS9zdHJpbmcuZGFydMAAcfQvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogQSBzZXF1ZW5jZSBvZiBVVEYtMTYgY29kZSB1bml0cy4KICoKICogU3RyaW5ncyBhcmUgbWFpbmx5IHVzZWQgdG8gcmVwcmVzZW50IHRleHQuIEEgY2hhcmFjdGVyIG1heSBiZSByZXByZXNlbnRlZCBieQogKiBtdWx0aXBsZSBjb2RlIHBvaW50cywgZWFjaCBjb2RlIHBvaW50IGNvbnNpc3Rpbmcgb2Ygb25lIG9yIHR3byBjb2RlCiAqIHVuaXRzLiBGb3IgZXhhbXBsZSB0aGUgUGFwdWEgTmV3IEd1aW5lYSBmbGFnIGNoYXJhY3RlciByZXF1aXJlcyBmb3VyIGNvZGUKICogdW5pdHMgdG8gcmVwcmVzZW50IHR3byBjb2RlIHBvaW50cywgYnV0IHNob3VsZCBiZSB0cmVhdGVkIGxpa2UgYSBzaW5nbGUKICogY2hhcmFjdGVyOiAi8J+HtfCfh6wiLiBQbGF0Zm9ybXMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGUgZmxhZyBjaGFyYWN0ZXIgbWF5IHNob3cKICogdGhlIGxldHRlcnMgIlBHIiBpbnN0ZWFkLiBJZiB0aGUgY29kZSBwb2ludHMgYXJlIHN3YXBwZWQsIGl0IGluc3RlYWQgYmVjb21lcwogKiB0aGUgR3VhZGVsb3VwZSBmbGFnICLwn4es8J+HtSIgKCJHUCIpLgogKgogKiBBIHN0cmluZyBjYW4gYmUgZWl0aGVyIHNpbmdsZSBvciBtdWx0aWxpbmUuIFNpbmdsZSBsaW5lIHN0cmluZ3MgYXJlCiAqIHdyaXR0ZW4gdXNpbmcgbWF0Y2hpbmcgc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMsIGFuZCBtdWx0aWxpbmUgc3RyaW5ncyBhcmUKICogd3JpdHRlbiB1c2luZyB0cmlwbGUgcXVvdGVzLiBUaGUgZm9sbG93aW5nIGFyZSBhbGwgdmFsaWQgRGFydCBzdHJpbmdzOgogKgogKiAgICAgJ1NpbmdsZSBxdW90ZXMnOwogKiAgICAgIkRvdWJsZSBxdW90ZXMiOwogKiAgICAgJ0RvdWJsZSBxdW90ZXMgaW4gInNpbmdsZSIgcXVvdGVzJzsKICogICAgICJTaW5nbGUgcXVvdGVzIGluICdkb3VibGUnIHF1b3RlcyI7CiAqCiAqICAgICAnJydBCiAqICAgICBtdWx0aWxpbmUKICogICAgIHN0cmluZycnJzsKICoKICogICAgICIiIgogKiAgICAgQW5vdGhlcgogKiAgICAgbXVsdGlsaW5lCiAqICAgICBzdHJpbmciIiI7CiAqCiAqIFN0cmluZ3MgYXJlIGltbXV0YWJsZS4gQWx0aG91Z2ggeW91IGNhbm5vdCBjaGFuZ2UgYSBzdHJpbmcsIHlvdSBjYW4gcGVyZm9ybQogKiBhbiBvcGVyYXRpb24gb24gYSBzdHJpbmcgYW5kIGFzc2lnbiB0aGUgcmVzdWx0IHRvIGEgbmV3IHN0cmluZzoKICoKICogICAgIHZhciBzdHJpbmcgPSAnRGFydCBpcyBmdW4nOwogKiAgICAgdmFyIG5ld1N0cmluZyA9IHN0cmluZy5zdWJzdHJpbmcoMCwgNSk7CiAqCiAqIFlvdSBjYW4gdXNlIHRoZSBwbHVzIChgK2ApIG9wZXJhdG9yIHRvIGNvbmNhdGVuYXRlIHN0cmluZ3M6CiAqCiAqICAgICAnRGFydCAnICsgJ2lzICcgKyAnZnVuISc7IC8vICdEYXJ0IGlzIGZ1biEnCiAqCiAqIFlvdSBjYW4gYWxzbyB1c2UgYWRqYWNlbnQgc3RyaW5nIGxpdGVyYWxzIGZvciBjb25jYXRlbmF0aW9uOgogKgogKiAgICAgJ0RhcnQgJyAnaXMgJyAnZnVuISc7ICAgIC8vICdEYXJ0IGlzIGZ1biEnCiAqCiAqIFlvdSBjYW4gdXNlIGAke31gIHRvIGludGVycG9sYXRlIHRoZSB2YWx1ZSBvZiBEYXJ0IGV4cHJlc3Npb25zCiAqIHdpdGhpbiBzdHJpbmdzLiBUaGUgY3VybHkgYnJhY2VzIGNhbiBiZSBvbWl0dGVkIHdoZW4gZXZhbHVhdGluZyBpZGVudGlmaWVyczoKICoKICogICAgIHN0cmluZyA9ICdkYXJ0bGFuZyc7CiAqICAgICAnJHN0cmluZyBoYXMgJHtzdHJpbmcubGVuZ3RofSBsZXR0ZXJzJzsgLy8gJ2RhcnRsYW5nIGhhcyA4IGxldHRlcnMnCiAqCiAqIEEgc3RyaW5nIGlzIHJlcHJlc2VudGVkIGJ5IGEgc2VxdWVuY2Ugb2YgVW5pY29kZSBVVEYtMTYgY29kZSB1bml0cwogKiBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIFtjb2RlVW5pdEF0XSBvciB0aGUgW2NvZGVVbml0c10gbWVtYmVyczoKICoKICogICAgIHN0cmluZyA9ICdEYXJ0JzsKICogICAgIHN0cmluZy5jb2RlVW5pdEF0KDApOyAvLyA2OAogKiAgICAgc3RyaW5nLmNvZGVVbml0czsgICAgIC8vIFs2OCwgOTcsIDExNCwgMTE2XQogKgogKiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGNvZGUgdW5pdHMgaXMgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSBpbmRleAogKiBvcGVyYXRvcjoKICoKICogICAgIHN0cmluZ1swXTsgICAgICAgICAgICAvLyAnRCcKICoKICogVGhlIGNoYXJhY3RlcnMgb2YgYSBzdHJpbmcgYXJlIGVuY29kZWQgaW4gVVRGLTE2LiBEZWNvZGluZyBVVEYtMTYsIHdoaWNoCiAqIGNvbWJpbmVzIHN1cnJvZ2F0ZSBwYWlycywgeWllbGRzIFVuaWNvZGUgY29kZSBwb2ludHMuIEZvbGxvd2luZyBhIHNpbWlsYXIKICogdGVybWlub2xvZ3kgdG8gR28sIHdlIHVzZSB0aGUgbmFtZSAncnVuZScgZm9yIGFuIGludGVnZXIgcmVwcmVzZW50aW5nIGEKICogVW5pY29kZSBjb2RlIHBvaW50LiBVc2UgdGhlIFtydW5lc10gcHJvcGVydHkgdG8gZ2V0IHRoZSBydW5lcyBvZiBhIHN0cmluZzoKICoKICogICAgIHN0cmluZy5ydW5lcy50b0xpc3QoKTsgLy8gWzY4LCA5NywgMTE0LCAxMTZdCiAqCiAqIEZvciBhIGNoYXJhY3RlciBvdXRzaWRlIHRoZSBCYXNpYyBNdWx0aWxpbmd1YWwgUGxhbmUgKHBsYW5lIDApIHRoYXQgaXMKICogY29tcG9zZWQgb2YgYSBzdXJyb2dhdGUgcGFpciwgW3J1bmVzXSBjb21iaW5lcyB0aGUgcGFpciBhbmQgcmV0dXJucyBhCiAqIHNpbmdsZSBpbnRlZ2VyLiAgRm9yIGV4YW1wbGUsIHRoZSBVbmljb2RlIGNoYXJhY3RlciBmb3IgYQogKiBtdXNpY2FsIEctY2xlZiAoJ/CdhJ4nKSB3aXRoIHJ1bmUgdmFsdWUgMHgxRDExRSBjb25zaXN0cyBvZiBhIFVURi0xNiBzdXJyb2dhdGUKICogcGFpcjogYDB4RDgzNGAgYW5kIGAweEREMUVgLiBVc2luZyBbY29kZVVuaXRzXSByZXR1cm5zIHRoZSBzdXJyb2dhdGUgcGFpciwKICogYW5kIHVzaW5nIGBydW5lc2AgcmV0dXJucyB0aGVpciBjb21iaW5lZCB2YWx1ZToKICoKICogICAgIHZhciBjbGVmID0gJ1x1ezFEMTFFfSc7CiAqICAgICBjbGVmLmNvZGVVbml0czsgICAgICAgICAvLyBbMHhEODM0LCAweEREMUVdCiAqICAgICBjbGVmLnJ1bmVzLnRvTGlzdCgpOyAgICAvLyBbMHgxRDExRV0KICoKICogVGhlIFN0cmluZyBjbGFzcyBjYW4gbm90IGJlIGV4dGVuZGVkIG9yIGltcGxlbWVudGVkLiBBdHRlbXB0aW5nIHRvIGRvIHNvCiAqIHlpZWxkcyBhIGNvbXBpbGUtdGltZSBlcnJvci4KICoKICogIyMgT3RoZXIgcmVzb3VyY2VzCiAqCiAqIFNlZSBbU3RyaW5nQnVmZmVyXSB0byBlZmZpY2llbnRseSBidWlsZCBhIHN0cmluZyBpbmNyZW1lbnRhbGx5LiBTZWUKICogW1JlZ0V4cF0gdG8gd29yayB3aXRoIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCiAqCiAqIEFsc28gc2VlOgogKgogKiAqIFtEYXJ0IENvb2tib29rXShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy9jb29rYm9vay8jc3RyaW5ncykKICogICBmb3IgU3RyaW5nIGV4YW1wbGVzIGFuZCByZWNpcGVzLgogKiAqIFtEYXJ0IFVwIGFuZCBSdW5uaW5nXShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy9kYXJ0LXVwLWFuZC1ydW5uaW5nL2NoMDMuaHRtbCNzdHJpbmdzLWFuZC1yZWd1bGFyLWV4cHJlc3Npb25zKQogKi8KYWJzdHJhY3QgY2xhc3MgU3RyaW5nIGltcGxlbWVudHMgQ29tcGFyYWJsZTxTdHJpbmc+LCBQYXR0ZXJuIHsKICAvKioKICAgKiBBbGxvY2F0ZXMgYSBuZXcgU3RyaW5nIGZvciB0aGUgc3BlY2lmaWVkIFtjaGFyQ29kZXNdLgogICAqCiAgICogVGhlIFtjaGFyQ29kZXNdIGNhbiBiZSBVVEYtMTYgY29kZSB1bml0cyBvciBydW5lcy4gSWYgYSBjaGFyLWNvZGUgdmFsdWUgaXMKICAgKiAxNi1iaXQsIGl0IGlzIGNvcGllZCB2ZXJiYXRpbToKICAgKgogICAqICAgICBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoWzY4XSk7IC8vICdEJwogICAqCiAgICogSWYgYSBjaGFyLWNvZGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDE2LWJpdHMsIGl0IGlzIGRlY29tcG9zZWQgaW50byBhCiAgICogc3Vycm9nYXRlIHBhaXI6CiAgICoKICAgKiAgICAgdmFyIGNsZWYgPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoWzB4MUQxMUVdKTsKICAgKiAgICAgY2xlZi5jb2RlVW5pdEF0KDApOyAvLyAweEQ4MzQKICAgKiAgICAgY2xlZi5jb2RlVW5pdEF0KDEpOyAvLyAweEREMUUKICAgKgogICAqIElmIFtzdGFydF0gYW5kIFtlbmRdIGlzIHByb3ZpZGVkLCBvbmx5IHRoZSB2YWx1ZXMgb2YgW2NoYXJDb2Rlc10KICAgKiBhdCBwb3NpdGlvbnMgZnJvbSBgc3RhcnRgIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAsIGFyZSB1c2VkLgogICAqIFRoZSBgc3RhcnRgIGFuZCBgZW5kYCB2YWx1ZXMgbXVzdCBzYXRpc2Z5CiAgICogYDAgPD0gc3RhcnQgPD0gZW5kIDw9IGNoYXJDb2Rlcy5sZW5ndGhgLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgU3RyaW5nLmZyb21DaGFyQ29kZXMoSXRlcmFibGU8aW50PiBjaGFyQ29kZXMsCiAgICAgIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSk7CgogIC8qKgogICAqIEFsbG9jYXRlcyBhIG5ldyBTdHJpbmcgZm9yIHRoZSBzcGVjaWZpZWQgW2NoYXJDb2RlXS4KICAgKgogICAqIElmIHRoZSBbY2hhckNvZGVdIGNhbiBiZSByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBVVEYtMTYgY29kZSB1bml0LCB0aGUgbmV3CiAgICogc3RyaW5nIGNvbnRhaW5zIGEgc2luZ2xlIGNvZGUgdW5pdC4gT3RoZXJ3aXNlLCB0aGUgW2xlbmd0aF0gaXMgMiBhbmQKICAgKiB0aGUgY29kZSB1bml0cyBmb3JtIGEgc3Vycm9nYXRlIHBhaXIuIFNlZSBkb2N1bWVudGF0aW9uIGZvcgogICAqIFtmcm9tQ2hhckNvZGVzXS4KICAgKgogICAqIENyZWF0aW5nIGEgU3RyaW5nIHdpdGggaGFsZiBvZiBhIHN1cnJvZ2F0ZSBwYWlyIGlzIGFsbG93ZWQuCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBTdHJpbmcuZnJvbUNoYXJDb2RlKGludCBjaGFyQ29kZSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgZGVjbGFyYXRpb24gW25hbWVdLgogICAqCiAgICogRW52aXJvbm1lbnQgZGVjbGFyYXRpb25zIGFyZSBwcm92aWRlZCBieSB0aGUgc3Vycm91bmRpbmcgc3lzdGVtIGNvbXBpbGluZwogICAqIG9yIHJ1bm5pbmcgdGhlIERhcnQgcHJvZ3JhbS4gRGVjbGFyYXRpb25zIG1hcCBhIHN0cmluZyBrZXkgdG8gYSBzdHJpbmcKICAgKiB2YWx1ZS4KICAgKgogICAqIElmIFtuYW1lXSBpcyBub3QgZGVjbGFyZWQgaW4gdGhlIGVudmlyb25tZW50LCB0aGUgcmVzdWx0IGlzIGluc3RlYWQKICAgKiBbZGVmYXVsdFZhbHVlXS4KICAgKgogICAqIEV4YW1wbGUgb2YgZ2V0dGluZyBhIHZhbHVlOgogICAqCiAgICogICAgIGNvbnN0IFN0cmluZy5mcm9tRW52aXJvbm1lbnQoImRlZmF1bHRGbG9vIiwgZGVmYXVsdFZhbHVlOiAibm8gZmxvbyIpCiAgICoKICAgKiBFeGFtcGxlIG9mIGNoZWNraW5nIHdoZXRoZXIgYSBkZWNsYXJhdGlvbiBpcyB0aGVyZSBhdCBhbGw6CiAgICoKICAgKiAgICAgdmFyIGlzRGVjbGFyZWQgPSBjb25zdCBTdHJpbmcuZnJvbUVudmlyb25tZW50KCJtYXliZURlY2xhcmVkIikgIT0gbnVsbDsKICAgKi8KICAvLyBUaGUgLmZyb21FbnZpcm9ubWVudCgpIGNvbnN0cnVjdG9ycyBhcmUgc3BlY2lhbCBpbiB0aGF0IHdlIGRvIG5vdCB3YW50CiAgLy8gdXNlcnMgdG8gY2FsbCB0aGVtIHVzaW5nICJuZXciLiBXZSBwcm9oaWJpdCB0aGF0IGJ5IGdpdmluZyB0aGVtIGJvZGllcwogIC8vIHRoYXQgdGhyb3csIGV2ZW4gdGhvdWdoIGNvbnN0IGNvbnN0cnVjdG9ycyBhcmUgbm90IGFsbG93ZWQgdG8gaGF2ZSBib2RpZXMuCiAgLy8gRGlzYWJsZSB0aG9zZSBzdGF0aWMgZXJyb3JzLgogIC8vaWdub3JlOiBjb25zdF9jb25zdHJ1Y3Rvcl93aXRoX2JvZHkKICAvL2lnbm9yZTogY29uc3RfZmFjdG9yeQogIGV4dGVybmFsIGNvbnN0IGZhY3RvcnkgU3RyaW5nLmZyb21FbnZpcm9ubWVudChTdHJpbmcgbmFtZSwKICAgICAge1N0cmluZyBkZWZhdWx0VmFsdWV9KTsKCiAgLyoqCiAgICogR2V0cyB0aGUgY2hhcmFjdGVyIChhcyBhIHNpbmdsZS1jb2RlLXVuaXQgW1N0cmluZ10pIGF0IHRoZSBnaXZlbiBbaW5kZXhdLgogICAqCiAgICogVGhlIHJldHVybmVkIHN0cmluZyByZXByZXNlbnRzIGV4YWN0bHkgb25lIFVURi0xNiBjb2RlIHVuaXQsIHdoaWNoIG1heSBiZQogICAqIGhhbGYgb2YgYSBzdXJyb2dhdGUgcGFpci4gQSBzaW5nbGUgbWVtYmVyIG9mIGEgc3Vycm9nYXRlIHBhaXIgaXMgYW4KICAgKiBpbnZhbGlkIFVURi0xNiBzdHJpbmc6CiAgICoKICAgKiAgICAgdmFyIGNsZWYgPSAnXHV7MUQxMUV9JzsKICAgKiAgICAgLy8gVGhlc2UgcmVwcmVzZW50IGludmFsaWQgVVRGLTE2IHN0cmluZ3MuCiAgICogICAgIGNsZWZbMF0uY29kZVVuaXRzOyAgICAgIC8vIFsweEQ4MzRdCiAgICogICAgIGNsZWZbMV0uY29kZVVuaXRzOyAgICAgIC8vIFsweEREMUVdCiAgICoKICAgKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvCiAgICogYG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuY29kZVVuaXRBdChpbmRleCkpYC4KICAgKi8KICBTdHJpbmcgb3BlcmF0b3IgW10oaW50IGluZGV4KTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgMTYtYml0IFVURi0xNiBjb2RlIHVuaXQgYXQgdGhlIGdpdmVuIFtpbmRleF0uCiAgICovCiAgaW50IGNvZGVVbml0QXQoaW50IGluZGV4KTsKCiAgLyoqCiAgICogVGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLgogICAqCiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIFVURi0xNiBjb2RlIHVuaXRzIGluIHRoaXMgc3RyaW5nLiBUaGUgbnVtYmVyCiAgICogb2YgW3J1bmVzXSBtaWdodCBiZSBmZXdlciwgaWYgdGhlIHN0cmluZyBjb250YWlucyBjaGFyYWN0ZXJzIG91dHNpZGUKICAgKiB0aGUgQmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lIChwbGFuZSAwKToKICAgKgogICAqICAgICAnRGFydCcubGVuZ3RoOyAgICAgICAgICAvLyA0CiAgICogICAgICdEYXJ0Jy5ydW5lcy5sZW5ndGg7ICAgIC8vIDQKICAgKgogICAqICAgICB2YXIgY2xlZiA9ICdcdXsxRDExRX0nOwogICAqICAgICBjbGVmLmxlbmd0aDsgICAgICAgICAgICAvLyAyCiAgICogICAgIGNsZWYucnVuZXMubGVuZ3RoOyAgICAgIC8vIDEKICAgKi8KICBpbnQgZ2V0IGxlbmd0aDsKCiAgLyoqCiAgICogUmV0dXJucyBhIGhhc2ggY29kZSBkZXJpdmVkIGZyb20gdGhlIGNvZGUgdW5pdHMgb2YgdGhlIHN0cmluZy4KICAgKgogICAqIFRoaXMgaXMgY29tcGF0aWJsZSB3aXRoIFtvcGVyYXRvciA9PV0uIFN0cmluZ3Mgd2l0aCB0aGUgc2FtZSBzZXF1ZW5jZQogICAqIG9mIGNvZGUgdW5pdHMgaGF2ZSB0aGUgc2FtZSBoYXNoIGNvZGUuCiAgICovCiAgaW50IGdldCBoYXNoQ29kZTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIG90aGVyIGlzIGEgYFN0cmluZ2Agd2l0aCB0aGUgc2FtZSBzZXF1ZW5jZSBvZiBjb2RlIHVuaXRzLgogICAqCiAgICogVGhpcyBtZXRob2QgY29tcGFyZXMgZWFjaCBpbmRpdmlkdWFsIGNvZGUgdW5pdCBvZiB0aGUgc3RyaW5ncy4KICAgKiBJdCBkb2VzIG5vdCBjaGVjayBmb3IgVW5pY29kZSBlcXVpdmFsZW5jZS4KICAgKiBGb3IgZXhhbXBsZSwgYm90aCB0aGUgZm9sbG93aW5nIHN0cmluZ3MgcmVwcmVzZW50IHRoZSBzdHJpbmcgJ0Ftw6lsaWUnLAogICAqIGJ1dCBkdWUgdG8gdGhlaXIgZGlmZmVyZW50IGVuY29kaW5nLCBhcmUgbm90IGVxdWFsOgogICAqCiAgICogICAgICdBbVx4ZTlsaWUnID09ICdBbWVcdXszMDF9bGllJzsgLy8gZmFsc2UKICAgKgogICAqIFRoZSBmaXJzdCBzdHJpbmcgZW5jb2RlcyAnw6knIGFzIGEgc2luZ2xlIHVuaWNvZGUgY29kZSB1bml0IChhbHNvCiAgICogYSBzaW5nbGUgcnVuZSksIHdoZXJlYXMgdGhlIHNlY29uZCBzdHJpbmcgZW5jb2RlcyBpdCBhcyAnZScgd2l0aCB0aGUKICAgKiBjb21iaW5pbmcgYWNjZW50IGNoYXJhY3RlciAn4peMzIEnLgogICAqLwogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKTsKCiAgLyoqCiAgICogQ29tcGFyZXMgdGhpcyBzdHJpbmcgdG8gW290aGVyXS4KICAgKgogICAqIFJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZSBpZiBgdGhpc2AgaXMgb3JkZXJlZCBiZWZvcmUgYG90aGVyYCwKICAgKiBhIHBvc2l0aXZlIHZhbHVlIGlmIGB0aGlzYCBpcyBvcmRlcmVkIGFmdGVyIGBvdGhlcmAsCiAgICogb3IgemVybyBpZiBgdGhpc2AgYW5kIGBvdGhlcmAgYXJlIGVxdWl2YWxlbnQuCiAgICoKICAgKiBUaGUgb3JkZXJpbmcgaXMgdGhlIHNhbWUgYXMgdGhlIG9yZGVyaW5nIG9mIHRoZSBjb2RlIHBvaW50cyBhdCB0aGUgZmlyc3QKICAgKiBwb3NpdGlvbiB3aGVyZSB0aGUgdHdvIHN0cmluZ3MgZGlmZmVyLgogICAqIElmIG9uZSBzdHJpbmcgaXMgYSBwcmVmaXggb2YgdGhlIG90aGVyLAogICAqIHRoZW4gdGhlIHNob3J0ZXIgc3RyaW5nIGlzIG9yZGVyZWQgYmVmb3JlIHRoZSBsb25nZXIgc3RyaW5nLgogICAqIElmIHRoZSBzdHJpbmdzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBjb250ZW50LCB0aGV5IGFyZSBlcXVpdmFsZW50IHdpdGgKICAgKiByZWdhcmQgdG8gdGhlIG9yZGVyaW5nLgogICAqIE9yZGVyaW5nIGRvZXMgbm90IGNoZWNrIGZvciBVbmljb2RlIGVxdWl2YWxlbmNlLgogICAqIFRoZSBjb21wYXJpc29uIGlzIGNhc2Ugc2Vuc2l0aXZlLgogICAqLwogIGludCBjb21wYXJlVG8oU3RyaW5nIG90aGVyKTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc3RyaW5nIGVuZHMgd2l0aCBbb3RoZXJdLiBGb3IgZXhhbXBsZToKICAgKgogICAqICAgICAnRGFydCcuZW5kc1dpdGgoJ3QnKTsgLy8gdHJ1ZQogICAqLwogIGJvb2wgZW5kc1dpdGgoU3RyaW5nIG90aGVyKTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc3RyaW5nIHN0YXJ0cyB3aXRoIGEgbWF0Y2ggb2YgW3BhdHRlcm5dLgogICAqCiAgICogICAgIHZhciBzdHJpbmcgPSAnRGFydCc7CiAgICogICAgIHN0cmluZy5zdGFydHNXaXRoKCdEJyk7ICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlCiAgICogICAgIHN0cmluZy5zdGFydHNXaXRoKG5ldyBSZWdFeHAocidbQS1aXVthLXpdJykpOyAvLyB0cnVlCiAgICoKICAgKiBJZiBbaW5kZXhdIGlzIHByb3ZpZGVkLCB0aGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIHN1YnN0cmluZyBzdGFydGluZwogICAqIGF0IHRoYXQgaW5kZXggc3RhcnRzIHdpdGggYSBtYXRjaCBvZiBbcGF0dGVybl06CiAgICoKICAgKiAgICAgc3RyaW5nLnN0YXJ0c1dpdGgoJ2FydCcsIDEpOyAgICAgICAgICAgICAgICAgIC8vIHRydWUKICAgKiAgICAgc3RyaW5nLnN0YXJ0c1dpdGgobmV3IFJlZ0V4cChyJ1x3ezN9JykpOyAgICAgIC8vIHRydWUKICAgKgogICAqIFtpbmRleF0gbXVzdCBub3QgYmUgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIFtsZW5ndGhdLgogICAqCiAgICogQSBbUmVnRXhwXSBjb250YWluaW5nICdeJyBkb2VzIG5vdCBtYXRjaCBpZiB0aGUgW2luZGV4XSBpcyBncmVhdGVyIHRoYW4KICAgKiB6ZXJvLiBUaGUgcGF0dGVybiB3b3JrcyBvbiB0aGUgc3RyaW5nIGFzIGEgd2hvbGUsIGFuZCBkb2VzIG5vdCBleHRyYWN0CiAgICogYSBzdWJzdHJpbmcgc3RhcnRpbmcgYXQgW2luZGV4XSBmaXJzdDoKICAgKgogICAqICAgICBzdHJpbmcuc3RhcnRzV2l0aChuZXcgUmVnRXhwKHInXmFydCcpLCAxKTsgICAgLy8gZmFsc2UKICAgKiAgICAgc3RyaW5nLnN0YXJ0c1dpdGgobmV3IFJlZ0V4cChyJ2FydCcpLCAxKTsgICAgIC8vIHRydWUKICAgKi8KICBib29sIHN0YXJ0c1dpdGgoUGF0dGVybiBwYXR0ZXJuLCBbaW50IGluZGV4ID0gMF0pOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgbWF0Y2ggb2YgW3BhdHRlcm5dIGluIHRoaXMgc3RyaW5nLAogICAqIHN0YXJ0aW5nIGF0IFtzdGFydF0sIGluY2x1c2l2ZToKICAgKgogICAqICAgICB2YXIgc3RyaW5nID0gJ0RhcnRpc2Fucyc7CiAgICogICAgIHN0cmluZy5pbmRleE9mKCdhcnQnKTsgICAgICAgICAgICAgICAgICAgICAvLyAxCiAgICogICAgIHN0cmluZy5pbmRleE9mKG5ldyBSZWdFeHAocidbQS1aXVthLXpdJykpOyAvLyAwCiAgICoKICAgKiBSZXR1cm5zIC0xIGlmIG5vIG1hdGNoIGlzIGZvdW5kOgogICAqCiAgICogICAgIHN0cmluZy5pbmRleE9mKG5ldyBSZWdFeHAocidkYXJ0JykpOyAgICAgICAvLyAtMQogICAqCiAgICogW3N0YXJ0XSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgbm90IGdyZWF0ZXIgdGhhbiBbbGVuZ3RoXS4KICAgKi8KICBpbnQgaW5kZXhPZihQYXR0ZXJuIHBhdHRlcm4sIFtpbnQgc3RhcnRdKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGxhc3QgbWF0Y2ggW3BhdHRlcm5dIGluIHRoaXMgc3RyaW5nLCBzZWFyY2hpbmcKICAgKiBiYWNrd2FyZCBzdGFydGluZyBhdCBbc3RhcnRdLCBpbmNsdXNpdmU6CiAgICoKICAgKiAgICAgdmFyIHN0cmluZyA9ICdEYXJ0aXNhbnMnOwogICAqICAgICBzdHJpbmcubGFzdEluZGV4T2YoJ2EnKTsgICAgICAgICAgICAgICAgICAgIC8vIDYKICAgKiAgICAgc3RyaW5nLmxhc3RJbmRleE9mKG5ldyBSZWdFeHAocidhKHJ8biknKSk7ICAvLyA2CiAgICoKICAgKiBSZXR1cm5zIC0xIGlmIFtwYXR0ZXJuXSBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhpcyBzdHJpbmcuCiAgICoKICAgKiAgICAgc3RyaW5nLmxhc3RJbmRleE9mKG5ldyBSZWdFeHAocidEQVJUJykpOyAgICAvLyAtMQogICAqCiAgICogVGhlIFtzdGFydF0gbXVzdCBiZSBub24tbmVnYXRpdmUgYW5kIG5vdCBncmVhdGVyIHRoYW4gW2xlbmd0aF0uCiAgICovCiAgaW50IGxhc3RJbmRleE9mKFBhdHRlcm4gcGF0dGVybiwgW2ludCBzdGFydF0pOwoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzdHJpbmcgaXMgZW1wdHkuCiAgICovCiAgYm9vbCBnZXQgaXNFbXB0eTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc3RyaW5nIGlzIG5vdCBlbXB0eS4KICAgKi8KICBib29sIGdldCBpc05vdEVtcHR5OwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IHN0cmluZyBieSBjb25jYXRlbmF0aW5nIHRoaXMgc3RyaW5nIHdpdGggW290aGVyXS4KICAgKgogICAqICAgICAnZGFydCcgKyAnbGFuZyc7IC8vICdkYXJ0bGFuZycKICAgKi8KICBTdHJpbmcgb3BlcmF0b3IgKyhTdHJpbmcgb3RoZXIpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBzdWJzdHJpbmcgb2YgdGhpcyBzdHJpbmcgdGhhdCBleHRlbmRzIGZyb20gW3N0YXJ0SW5kZXhdLAogICAqIGluY2x1c2l2ZSwgdG8gW2VuZEluZGV4XSwgZXhjbHVzaXZlLgogICAqCiAgICogICAgIHZhciBzdHJpbmcgPSAnZGFydGxhbmcnOwogICAqICAgICBzdHJpbmcuc3Vic3RyaW5nKDEpOyAgICAvLyAnYXJ0bGFuZycKICAgKiAgICAgc3RyaW5nLnN1YnN0cmluZygxLCA0KTsgLy8gJ2FydCcKICAgKi8KICBTdHJpbmcgc3Vic3RyaW5nKGludCBzdGFydEluZGV4LCBbaW50IGVuZEluZGV4XSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHN0cmluZyB3aXRob3V0IGFueSBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLgogICAqCiAgICogSWYgdGhlIHN0cmluZyBjb250YWlucyBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGEgbmV3IHN0cmluZyB3aXRoIG5vCiAgICogbGVhZGluZyBhbmQgbm8gdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyByZXR1cm5lZDoKICAgKiBgYGBkYXJ0CiAgICogJ1x0RGFydCBpcyBmdW5cbicudHJpbSgpOyAvLyAnRGFydCBpcyBmdW4nCiAgICogYGBgCiAgICogT3RoZXJ3aXNlLCB0aGUgb3JpZ2luYWwgc3RyaW5nIGl0c2VsZiBpcyByZXR1cm5lZDoKICAgKiBgYGBkYXJ0CiAgICogdmFyIHN0cjEgPSAnRGFydCc7CiAgICogdmFyIHN0cjIgPSBzdHIxLnRyaW0oKTsKICAgKiBpZGVudGljYWwoc3RyMSwgc3RyMik7ICAgIC8vIHRydWUKICAgKiBgYGAKICAgKiBXaGl0ZXNwYWNlIGlzIGRlZmluZWQgYnkgdGhlIFVuaWNvZGUgV2hpdGVfU3BhY2UgcHJvcGVydHkgKGFzIGRlZmluZWQgaW4KICAgKiB2ZXJzaW9uIDYuMiBvciBsYXRlcikgYW5kIHRoZSBCT00gY2hhcmFjdGVyLCAweEZFRkYuCiAgICoKICAgKiBIZXJlIGlzIHRoZSBsaXN0IG9mIHRyaW1tZWQgY2hhcmFjdGVycyBhY2NvcmRpbmcgdG8gVW5pY29kZSB2ZXJzaW9uIDYuMzoKICAgKiBgYGAKICAgKiAgICAgMDAwOS4uMDAwRCAgICA7IFdoaXRlX1NwYWNlICMgQ2MgICA8Y29udHJvbC0wMDA5Pi4uPGNvbnRyb2wtMDAwRD4KICAgKiAgICAgMDAyMCAgICAgICAgICA7IFdoaXRlX1NwYWNlICMgWnMgICBTUEFDRQogICAqICAgICAwMDg1ICAgICAgICAgIDsgV2hpdGVfU3BhY2UgIyBDYyAgIDxjb250cm9sLTAwODU+CiAgICogICAgIDAwQTAgICAgICAgICAgOyBXaGl0ZV9TcGFjZSAjIFpzICAgTk8tQlJFQUsgU1BBQ0UKICAgKiAgICAgMTY4MCAgICAgICAgICA7IFdoaXRlX1NwYWNlICMgWnMgICBPR0hBTSBTUEFDRSBNQVJLCiAgICogICAgIDIwMDAuLjIwMEEgICAgOyBXaGl0ZV9TcGFjZSAjIFpzICAgRU4gUVVBRC4uSEFJUiBTUEFDRQogICAqICAgICAyMDI4ICAgICAgICAgIDsgV2hpdGVfU3BhY2UgIyBabCAgIExJTkUgU0VQQVJBVE9SCiAgICogICAgIDIwMjkgICAgICAgICAgOyBXaGl0ZV9TcGFjZSAjIFpwICAgUEFSQUdSQVBIIFNFUEFSQVRPUgogICAqICAgICAyMDJGICAgICAgICAgIDsgV2hpdGVfU3BhY2UgIyBacyAgIE5BUlJPVyBOTy1CUkVBSyBTUEFDRQogICAqICAgICAyMDVGICAgICAgICAgIDsgV2hpdGVfU3BhY2UgIyBacyAgIE1FRElVTSBNQVRIRU1BVElDQUwgU1BBQ0UKICAgKiAgICAgMzAwMCAgICAgICAgICA7IFdoaXRlX1NwYWNlICMgWnMgICBJREVPR1JBUEhJQyBTUEFDRQogICAqCiAgICogICAgIEZFRkYgICAgICAgICAgOyBCT00gICAgICAgICAgICAgICAgWkVSTyBXSURUSCBOT19CUkVBSyBTUEFDRQogICAqIGBgYAogICAqIFNvbWUgbGF0ZXIgdmVyc2lvbnMgb2YgVW5pY29kZSBkbyBub3QgaW5jbHVkZSBVKzAwODUgYXMgYSB3aGl0ZXNwYWNlCiAgICogY2hhcmFjdGVyLiBXaGV0aGVyIGl0IGlzIHRyaW1tZWQgZGVwZW5kcyBvbiB0aGUgVW5pY29kZSB2ZXJzaW9uCiAgICogdXNlZCBieSB0aGUgc3lzdGVtLgogICAqLwogIFN0cmluZyB0cmltKCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHN0cmluZyB3aXRob3V0IGFueSBsZWFkaW5nIHdoaXRlc3BhY2UuCiAgICoKICAgKiBBcyBbdHJpbV0sIGJ1dCBvbmx5IHJlbW92ZXMgbGVhZGluZyB3aGl0ZXNwYWNlLgogICAqLwogIFN0cmluZyB0cmltTGVmdCgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgd2l0aG91dCBhbnkgdHJhaWxpbmcgd2hpdGVzcGFjZS4KICAgKgogICAqIEFzIFt0cmltXSwgYnV0IG9ubHkgcmVtb3ZlcyB0cmFpbGluZyB3aGl0ZXNwYWNlLgogICAqLwogIFN0cmluZyB0cmltUmlnaHQoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBzdHJpbmcgYnkgY29uY2F0ZW5hdGluZyB0aGlzIHN0cmluZyB3aXRoIGl0c2VsZiBhIG51bWJlcgogICAqIG9mIHRpbWVzLgogICAqCiAgICogVGhlIHJlc3VsdCBvZiBgc3RyICogbmAgaXMgZXF1aXZhbGVudCB0bwogICAqIGBzdHIgKyBzdHIgKyAuLi5gKG4gdGltZXMpYC4uLiArIHN0cmAuCiAgICoKICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBpZiBbdGltZXNdIGlzIHplcm8gb3IgbmVnYXRpdmUuCiAgICovCiAgU3RyaW5nIG9wZXJhdG9yICooaW50IHRpbWVzKTsKCiAgLyoqCiAgICogUGFkcyB0aGlzIHN0cmluZyBvbiB0aGUgbGVmdCBpZiBpdCBpcyBzaG9ydGVyIHRoYW4gW3dpZHRoXS4KICAgKgogICAqIFJldHVybiBhIG5ldyBzdHJpbmcgdGhhdCBwcmVwZW5kcyBbcGFkZGluZ10gb250byB0aGlzIHN0cmluZwogICAqIG9uZSB0aW1lIGZvciBlYWNoIHBvc2l0aW9uIHRoZSBsZW5ndGggaXMgbGVzcyB0aGFuIFt3aWR0aF0uCiAgICoKICAgKiBJZiBbd2lkdGhdIGlzIGFscmVhZHkgc21hbGxlciB0aGFuIG9yIGVxdWFsIHRvIGB0aGlzLmxlbmd0aGAsCiAgICogbm8gcGFkZGluZyBpcyBhZGRlZC4gQSBuZWdhdGl2ZSBgd2lkdGhgIGlzIHRyZWF0ZWQgYXMgemVyby4KICAgKgogICAqIElmIFtwYWRkaW5nXSBoYXMgbGVuZ3RoIGRpZmZlcmVudCBmcm9tIDEsIHRoZSByZXN1bHQgd2lsbCBub3QKICAgKiBoYXZlIGxlbmd0aCBgd2lkdGhgLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIGNhc2VzIHdoZXJlIHRoZQogICAqIHBhZGRpbmcgaXMgYSBsb25nZXIgc3RyaW5nIHJlcHJlc2VudGluZyBhIHNpbmdsZSBjaGFyYWN0ZXIsIGxpa2UKICAgKiBgIiZuYnNwOyJgIG9yIGAiXHV7MTAwMDJ9YCIuCiAgICogSW4gdGhhdCBjYXNlLCB0aGUgdXNlciBzaG91bGQgbWFrZSBzdXJlIHRoYXQgYHRoaXMubGVuZ3RoYCBpcwogICAqIHRoZSBjb3JyZWN0IG1lYXN1cmUgb2YgdGhlIHN0cmluZ3MgbGVuZ3RoLgogICAqLwogIFN0cmluZyBwYWRMZWZ0KGludCB3aWR0aCwgW1N0cmluZyBwYWRkaW5nID0gJyAnXSk7CgogIC8qKgogICAqIFBhZHMgdGhpcyBzdHJpbmcgb24gdGhlIHJpZ2h0IGlmIGl0IGlzIHNob3J0ZXIgdGhhbiBbd2lkdGhdLgogICAqCiAgICogUmV0dXJuIGEgbmV3IHN0cmluZyB0aGF0IGFwcGVuZHMgW3BhZGRpbmddIGFmdGVyIHRoaXMgc3RyaW5nCiAgICogb25lIHRpbWUgZm9yIGVhY2ggcG9zaXRpb24gdGhlIGxlbmd0aCBpcyBsZXNzIHRoYW4gW3dpZHRoXS4KICAgKgogICAqIElmIFt3aWR0aF0gaXMgYWxyZWFkeSBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8gYHRoaXMubGVuZ3RoYCwKICAgKiBubyBwYWRkaW5nIGlzIGFkZGVkLiBBIG5lZ2F0aXZlIGB3aWR0aGAgaXMgdHJlYXRlZCBhcyB6ZXJvLgogICAqCiAgICogSWYgW3BhZGRpbmddIGhhcyBsZW5ndGggZGlmZmVyZW50IGZyb20gMSwgdGhlIHJlc3VsdCB3aWxsIG5vdAogICAqIGhhdmUgbGVuZ3RoIGB3aWR0aGAuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3IgY2FzZXMgd2hlcmUgdGhlCiAgICogcGFkZGluZyBpcyBhIGxvbmdlciBzdHJpbmcgcmVwcmVzZW50aW5nIGEgc2luZ2xlIGNoYXJhY3RlciwgbGlrZQogICAqIGAiJm5ic3A7ImAgb3IgYCJcdXsxMDAwMn1gIi4KICAgKiBJbiB0aGF0IGNhc2UsIHRoZSB1c2VyIHNob3VsZCBtYWtlIHN1cmUgdGhhdCBgdGhpcy5sZW5ndGhgIGlzCiAgICogdGhlIGNvcnJlY3QgbWVhc3VyZSBvZiB0aGUgc3RyaW5ncyBsZW5ndGguCiAgICovCiAgU3RyaW5nIHBhZFJpZ2h0KGludCB3aWR0aCwgW1N0cmluZyBwYWRkaW5nID0gJyAnXSk7CgogIC8qKgogICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHN0cmluZyBjb250YWlucyBhIG1hdGNoIG9mIFtvdGhlcl06CiAgICoKICAgKiAgICAgdmFyIHN0cmluZyA9ICdEYXJ0IHN0cmluZ3MnOwogICAqICAgICBzdHJpbmcuY29udGFpbnMoJ0QnKTsgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlCiAgICogICAgIHN0cmluZy5jb250YWlucyhuZXcgUmVnRXhwKHInW0EtWl0nKSk7ICAgIC8vIHRydWUKICAgKgogICAqIElmIFtzdGFydEluZGV4XSBpcyBwcm92aWRlZCwgdGhpcyBtZXRob2QgbWF0Y2hlcyBvbmx5IGF0IG9yIGFmdGVyIHRoYXQKICAgKiBpbmRleDoKICAgKgogICAqICAgICBzdHJpbmcuY29udGFpbnMoJ1gnLCAxKTsgICAgICAgICAgICAgICAgICAvLyBmYWxzZQogICAqICAgICBzdHJpbmcuY29udGFpbnMobmV3IFJlZ0V4cChyJ1tBLVpdJyksIDEpOyAvLyBmYWxzZQogICAqCiAgICogW3N0YXJ0SW5kZXhdIG11c3Qgbm90IGJlIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiBbbGVuZ3RoXS4KICAgKi8KICBib29sIGNvbnRhaW5zKFBhdHRlcm4gb3RoZXIsIFtpbnQgc3RhcnRJbmRleCA9IDBdKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBzdHJpbmcgaW4gd2hpY2ggdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgW2Zyb21dIGluIHRoaXMgc3RyaW5nCiAgICogaXMgcmVwbGFjZWQgd2l0aCBbdG9dLCBzdGFydGluZyBmcm9tIFtzdGFydEluZGV4XToKICAgKgogICAqICAgICAnMC4wMDAxJy5yZXBsYWNlRmlyc3QobmV3IFJlZ0V4cChyJzAnKSwgJycpOyAvLyAnLjAwMDEnCiAgICogICAgICcwLjAwMDEnLnJlcGxhY2VGaXJzdChuZXcgUmVnRXhwKHInMCcpLCAnNycsIDEpOyAvLyAnMC43MDAxJwogICAqLwogIFN0cmluZyByZXBsYWNlRmlyc3QoUGF0dGVybiBmcm9tLCBTdHJpbmcgdG8sIFtpbnQgc3RhcnRJbmRleCA9IDBdKTsKCiAgLyoqCiAgICogUmVwbGFjZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBbZnJvbV0gaW4gdGhpcyBzdHJpbmcuCiAgICoKICAgKiBSZXR1cm5zIGEgbmV3IHN0cmluZywgd2hpY2ggaXMgdGhpcyBzdHJpbmcKICAgKiBleGNlcHQgdGhhdCB0aGUgZmlyc3QgbWF0Y2ggb2YgW2Zyb21dLCBzdGFydGluZyBmcm9tIFtzdGFydEluZGV4XSwKICAgKiBpcyByZXBsYWNlZCBieSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgW3JlcGxhY2VdIHdpdGggdGhlIG1hdGNoIG9iamVjdC4KICAgKgogICAqIFRoZSBvcHRpb25hbCBbc3RhcnRJbmRleF0gaXMgYnkgZGVmYXVsdCBzZXQgdG8gMC4gSWYgcHJvdmlkZWQsIGl0IG11c3QgYmUKICAgKiBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSBgWzAgLi4gbGVuXWAsIHdoZXJlIGBsZW5gIGlzIHRoaXMgc3RyaW5nJ3MgbGVuZ3RoLgogICAqLwogIFN0cmluZyByZXBsYWNlRmlyc3RNYXBwZWQoUGF0dGVybiBmcm9tLCBTdHJpbmcgcmVwbGFjZShNYXRjaCBtYXRjaCksCiAgICAgIFtpbnQgc3RhcnRJbmRleCA9IDBdKTsKCiAgLyoqCiAgICogUmVwbGFjZXMgYWxsIHN1YnN0cmluZ3MgdGhhdCBtYXRjaCBbZnJvbV0gd2l0aCBbcmVwbGFjZV0uCiAgICoKICAgKiBSZXR1cm5zIGEgbmV3IHN0cmluZyBpbiB3aGljaCB0aGUgbm9uLW92ZXJsYXBwaW5nIHN1YnN0cmluZ3MgbWF0Y2hpbmcKICAgKiBbZnJvbV0gKHRoZSBvbmVzIGl0ZXJhdGVkIGJ5IGBmcm9tLmFsbE1hdGNoZXModGhpc1N0cmluZylgKSBhcmUgcmVwbGFjZWQKICAgKiBieSB0aGUgbGl0ZXJhbCBzdHJpbmcgW3JlcGxhY2VdLgogICAqCiAgICogICAgICdyZXN1bWUnLnJlcGxhY2VBbGwobmV3IFJlZ0V4cChyJ2UnKSwgJ8OpJyk7IC8vICdyw6lzdW3DqScKICAgKgogICAqIE5vdGljZSB0aGF0IHRoZSBbcmVwbGFjZV0gc3RyaW5nIGlzIG5vdCBpbnRlcnByZXRlZC4gSWYgdGhlIHJlcGxhY2VtZW50CiAgICogZGVwZW5kcyBvbiB0aGUgbWF0Y2ggKGZvciBleGFtcGxlIG9uIGEgW1JlZ0V4cF0ncyBjYXB0dXJlIGdyb3VwcyksIHVzZQogICAqIHRoZSBbcmVwbGFjZUFsbE1hcHBlZF0gbWV0aG9kIGluc3RlYWQuCiAgICovCiAgU3RyaW5nIHJlcGxhY2VBbGwoUGF0dGVybiBmcm9tLCBTdHJpbmcgcmVwbGFjZSk7CgogIC8qKgogICAqIFJlcGxhY2UgYWxsIHN1YnN0cmluZ3MgdGhhdCBtYXRjaCBbZnJvbV0gYnkgYSBzdHJpbmcgY29tcHV0ZWQgZnJvbSB0aGUKICAgKiBtYXRjaC4KICAgKgogICAqIFJldHVybnMgYSBuZXcgc3RyaW5nIGluIHdoaWNoIHRoZSBub24tb3ZlcmxhcHBpbmcgc3Vic3RyaW5ncyB0aGF0IG1hdGNoCiAgICogW2Zyb21dICh0aGUgb25lcyBpdGVyYXRlZCBieSBgZnJvbS5hbGxNYXRjaGVzKHRoaXNTdHJpbmcpYCkgYXJlIHJlcGxhY2VkCiAgICogYnkgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIFtyZXBsYWNlXSBvbiB0aGUgY29ycmVzcG9uZGluZyBbTWF0Y2hdIG9iamVjdC4KICAgKgogICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVwbGFjZSBtYXRjaGVzIHdpdGggbmV3IGNvbnRlbnQgdGhhdCBkZXBlbmRzIG9uIHRoZQogICAqIG1hdGNoLCB1bmxpa2UgW3JlcGxhY2VBbGxdIHdoZXJlIHRoZSByZXBsYWNlbWVudCBzdHJpbmcgaXMgYWx3YXlzIHRoZSBzYW1lLgogICAqCiAgICogVGhlIFtyZXBsYWNlXSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgW01hdGNoXSBnZW5lcmF0ZWQKICAgKiBieSB0aGUgcGF0dGVybiwgYW5kIGl0cyByZXN1bHQgaXMgdXNlZCBhcyByZXBsYWNlbWVudC4KICAgKgogICAqIFRoZSBmdW5jdGlvbiBkZWZpbmVkIGJlbG93IGNvbnZlcnRzIGVhY2ggd29yZCBpbiBhIHN0cmluZyB0byBzaW1wbGlmaWVkCiAgICogJ3BpZyBsYXRpbicgdXNpbmcgW3JlcGxhY2VBbGxNYXBwZWRdOgogICAqCiAgICogICAgIHBpZ0xhdGluKFN0cmluZyB3b3JkcykgPT4gd29yZHMucmVwbGFjZUFsbE1hcHBlZCgKICAgKiAgICAgICAgIG5ldyBSZWdFeHAocidcYihcdyo/KShbYWVpb3VdXHcqKScsIGNhc2VTZW5zaXRpdmU6IGZhbHNlKSwKICAgKiAgICAgICAgIChNYXRjaCBtKSA9PiAiJHttWzJdfSR7bVsxXX0ke21bMV0uaXNFbXB0eSA/ICd3YXknIDogJ2F5J30iKTsKICAgKgogICAqICAgICBwaWdMYXRpbignSSBoYXZlIGEgc2VjcmV0IG5vdyEnKTsgLy8gJ0l3YXkgYXZlaGF5IGF3YXkgZWNyZXRzYXkgb3duYXkhJwogICAqLwogIFN0cmluZyByZXBsYWNlQWxsTWFwcGVkKFBhdHRlcm4gZnJvbSwgU3RyaW5nIHJlcGxhY2UoTWF0Y2ggbWF0Y2gpKTsKCiAgLyoqCiAgICogUmVwbGFjZXMgdGhlIHN1YnN0cmluZyBmcm9tIFtzdGFydF0gdG8gW2VuZF0gd2l0aCBbcmVwbGFjZW1lbnRdLgogICAqCiAgICogUmV0dXJucyBhIG5ldyBzdHJpbmcgZXF1aXZhbGVudCB0bzoKICAgKgogICAqICAgICB0aGlzLnN1YnN0cmluZygwLCBzdGFydCkgKyByZXBsYWNlbWVudCArIHRoaXMuc3Vic3RyaW5nKGVuZCkKICAgKgogICAqIFRoZSBbc3RhcnRdIGFuZCBbZW5kXSBpbmRpY2VzIG11c3Qgc3BlY2lmeSBhIHZhbGlkIHJhbmdlIG9mIHRoaXMgc3RyaW5nLgogICAqIFRoYXQgaXMgYDAgPD0gc3RhcnQgPD0gZW5kIDw9IHRoaXMubGVuZ3RoYC4KICAgKiBJZiBbZW5kXSBpcyBgbnVsbGAsIGl0IGRlZmF1bHRzIHRvIFtsZW5ndGhdLgogICAqLwogIFN0cmluZyByZXBsYWNlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBTdHJpbmcgcmVwbGFjZW1lbnQpOwoKICAvKioKICAgKiBTcGxpdHMgdGhlIHN0cmluZyBhdCBtYXRjaGVzIG9mIFtwYXR0ZXJuXSBhbmQgcmV0dXJucyBhIGxpc3Qgb2Ygc3Vic3RyaW5ncy4KICAgKgogICAqIEZpbmRzIGFsbCB0aGUgbWF0Y2hlcyBvZiBgcGF0dGVybmAgaW4gdGhpcyBzdHJpbmcsCiAgICogYW5kIHJldHVybnMgdGhlIGxpc3Qgb2YgdGhlIHN1YnN0cmluZ3MgYmV0d2VlbiB0aGUgbWF0Y2hlcy4KICAgKgogICAqICAgICB2YXIgc3RyaW5nID0gIkhlbGxvIHdvcmxkISI7CiAgICogICAgIHN0cmluZy5zcGxpdCgiICIpOyAgICAgICAgICAgICAgICAgICAgICAvLyBbJ0hlbGxvJywgJ3dvcmxkISddOwogICAqCiAgICogRW1wdHkgbWF0Y2hlcyBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIHN0cmluZ3MgYXJlIGlnbm9yZWQsCiAgICogYW5kIHNvIGFyZSBlbXB0eSBtYXRjaGVzIHJpZ2h0IGFmdGVyIGFub3RoZXIgbWF0Y2guCiAgICoKICAgKiAgICAgdmFyIHN0cmluZyA9ICJhYmJhIjsKICAgKiAgICAgc3RyaW5nLnNwbGl0KG5ldyBSZWdFeHAociJiKiIpKTsgICAgICAgIC8vIFsnYScsICdhJ10KICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBbJycsICdhJywgJ2EnLCAnJ10KICAgKgogICAqIElmIHRoaXMgc3RyaW5nIGlzIGVtcHR5LCB0aGUgcmVzdWx0IGlzIGFuIGVtcHR5IGxpc3QgaWYgYHBhdHRlcm5gIG1hdGNoZXMKICAgKiB0aGUgZW1wdHkgc3RyaW5nLCBhbmQgaXQgaXMgYFsiIl1gIGlmIHRoZSBwYXR0ZXJuIGRvZXNuJ3QgbWF0Y2guCiAgICoKICAgKiAgICAgdmFyIHN0cmluZyA9ICcnOwogICAqICAgICBzdHJpbmcuc3BsaXQoJycpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gW10KICAgKiAgICAgc3RyaW5nLnNwbGl0KCJhIik7ICAgICAgICAgICAgICAgICAgICAgIC8vIFsnJ10KICAgKgogICAqIFNwbGl0dGluZyB3aXRoIGFuIGVtcHR5IHBhdHRlcm4gc3BsaXRzIHRoZSBzdHJpbmcgaW50byBzaW5nbGUtY29kZSB1bml0CiAgICogc3RyaW5ncy4KICAgKgogICAqICAgICB2YXIgc3RyaW5nID0gJ1B1Yic7CiAgICogICAgIHN0cmluZy5zcGxpdCgnJyk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBbJ1AnLCAndScsICdiJ10KICAgKgogICAqICAgICBzdHJpbmcuY29kZVVuaXRzLm1hcCgodW5pdCkgewogICAqICAgICAgIHJldHVybiBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZSh1bml0KTsKICAgKiAgICAgfSkudG9MaXN0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFsnUCcsICd1JywgJ2InXQogICAqCiAgICogU3BsaXR0aW5nIGhhcHBlbnMgYXQgVVRGLTE2IGNvZGUgdW5pdCBib3VuZGFyaWVzLAogICAqIGFuZCBub3QgYXQgcnVuZSBib3VuZGFyaWVzOgogICAqCiAgICogICAgIC8vIFN0cmluZyBtYWRlIHVwIG9mIHR3byBjb2RlIHVuaXRzLCBidXQgb25lIHJ1bmUuCiAgICogICAgIHN0cmluZyA9ICdcdXsxRDExRX0nOwogICAqICAgICBzdHJpbmcuc3BsaXQoJycpLmxlbmd0aDsgICAgICAgICAgICAgICAgIC8vIDIgc3Vycm9nYXRlIHZhbHVlcwogICAqCiAgICogVG8gZ2V0IGEgbGlzdCBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIGluZGl2aWR1YWwgcnVuZXMgb2YgYSBzdHJpbmcsCiAgICogeW91IHNob3VsZCBub3QgdXNlIHNwbGl0LiBZb3UgY2FuIGluc3RlYWQgbWFwIGVhY2ggcnVuZSB0byBhIHN0cmluZwogICAqIGFzIGZvbGxvd3M6CiAgICoKICAgKiAgICAgc3RyaW5nLnJ1bmVzLm1hcCgocnVuZSkgPT4gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGUocnVuZSkpLnRvTGlzdCgpOwogICAqLwogIExpc3Q8U3RyaW5nPiBzcGxpdChQYXR0ZXJuIHBhdHRlcm4pOwoKICAvKioKICAgKiBTcGxpdHMgdGhlIHN0cmluZywgY29udmVydHMgaXRzIHBhcnRzLCBhbmQgY29tYmluZXMgdGhlbSBpbnRvIGEgbmV3CiAgICogc3RyaW5nLgogICAqCiAgICogW3BhdHRlcm5dIGlzIHVzZWQgdG8gc3BsaXQgdGhlIHN0cmluZyBpbnRvIHBhcnRzIGFuZCBzZXBhcmF0aW5nIG1hdGNoZXMuCiAgICoKICAgKiBFYWNoIG1hdGNoIGlzIGNvbnZlcnRlZCB0byBhIHN0cmluZyBieSBjYWxsaW5nIFtvbk1hdGNoXS4gSWYgW29uTWF0Y2hdCiAgICogaXMgb21pdHRlZCwgdGhlIG1hdGNoZWQgc3RyaW5nIGlzIHVzZWQuCiAgICoKICAgKiBFYWNoIG5vbi1tYXRjaGVkIHBhcnQgaXMgY29udmVydGVkIGJ5IGEgY2FsbCB0byBbb25Ob25NYXRjaF0uIElmCiAgICogW29uTm9uTWF0Y2hdIGlzIG9taXR0ZWQsIHRoZSBub24tbWF0Y2hpbmcgcGFydCBpcyB1c2VkLgogICAqCiAgICogVGhlbiBhbGwgdGhlIGNvbnZlcnRlZCBwYXJ0cyBhcmUgY29tYmluZWQgaW50byB0aGUgcmVzdWx0aW5nIHN0cmluZy4KICAgKgogICAqICAgICAnRWF0cyBzaG9vdHMgbGVhdmVzJy5zcGxpdE1hcEpvaW4oKG5ldyBSZWdFeHAocidzaG9vdHMnKSksCiAgICogICAgICAgICBvbk1hdGNoOiAgICAobSkgPT4gJyR7bS5ncm91cCgwKX0nLAogICAqICAgICAgICAgb25Ob25NYXRjaDogKG4pID0+ICcqJyk7IC8vICpzaG9vdHMqCiAgICovCiAgU3RyaW5nIHNwbGl0TWFwSm9pbihQYXR0ZXJuIHBhdHRlcm4sCiAgICAgIHtTdHJpbmcgb25NYXRjaChNYXRjaCBtYXRjaCksIFN0cmluZyBvbk5vbk1hdGNoKFN0cmluZyBub25NYXRjaCl9KTsKCiAgLyoqCiAgICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgbGlzdCBvZiB0aGUgVVRGLTE2IGNvZGUgdW5pdHMgb2YgdGhpcyBzdHJpbmcuCiAgICovCiAgTGlzdDxpbnQ+IGdldCBjb2RlVW5pdHM7CgogIC8qKgogICAqIFJldHVybnMgYW4gW0l0ZXJhYmxlXSBvZiBVbmljb2RlIGNvZGUtcG9pbnRzIG9mIHRoaXMgc3RyaW5nLgogICAqCiAgICogSWYgdGhlIHN0cmluZyBjb250YWlucyBzdXJyb2dhdGUgcGFpcnMsIHRoZXkgYXJlIGNvbWJpbmVkIGFuZCByZXR1cm5lZAogICAqIGFzIG9uZSBpbnRlZ2VyIGJ5IHRoaXMgaXRlcmF0b3IuIFVubWF0Y2hlZCBzdXJyb2dhdGUgaGFsdmVzIGFyZSB0cmVhdGVkCiAgICogbGlrZSB2YWxpZCAxNi1iaXQgY29kZS11bml0cy4KICAgKi8KICBSdW5lcyBnZXQgcnVuZXM7CgogIC8qKgogICAqIENvbnZlcnRzIGFsbCBjaGFyYWN0ZXJzIGluIHRoaXMgc3RyaW5nIHRvIGxvd2VyIGNhc2UuCiAgICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IGluIGFsbCBsb3dlciBjYXNlLCB0aGlzIG1ldGhvZCByZXR1cm5zIFs6dGhpczpdLgogICAqCiAgICogICAgICdBTFBIQUJFVCcudG9Mb3dlckNhc2UoKTsgLy8gJ2FscGhhYmV0JwogICAqICAgICAnYWJjJy50b0xvd2VyQ2FzZSgpOyAgICAgIC8vICdhYmMnCiAgICoKICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGxhbmd1YWdlIGluZGVwZW5kZW50IFVuaWNvZGUgbWFwcGluZyBhbmQgdGh1cyBvbmx5CiAgICogd29ya3MgaW4gc29tZSBsYW5ndWFnZXMuCiAgICovCiAgLy8gVE9ETyhmbG9pdHNjaCk6IGRvY3VtZW50IGJldHRlci4gKFNlZSBFY21hU2NyaXB0IGZvciBkZXNjcmlwdGlvbikuCiAgU3RyaW5nIHRvTG93ZXJDYXNlKCk7CgogIC8qKgogICAqIENvbnZlcnRzIGFsbCBjaGFyYWN0ZXJzIGluIHRoaXMgc3RyaW5nIHRvIHVwcGVyIGNhc2UuCiAgICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IGluIGFsbCB1cHBlciBjYXNlLCB0aGlzIG1ldGhvZCByZXR1cm5zIFs6dGhpczpdLgogICAqCiAgICogICAgICdhbHBoYWJldCcudG9VcHBlckNhc2UoKTsgLy8gJ0FMUEhBQkVUJwogICAqICAgICAnQUJDJy50b1VwcGVyQ2FzZSgpOyAgICAgIC8vICdBQkMnCiAgICoKICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGxhbmd1YWdlIGluZGVwZW5kZW50IFVuaWNvZGUgbWFwcGluZyBhbmQgdGh1cyBvbmx5CiAgICogd29ya3MgaW4gc29tZSBsYW5ndWFnZXMuCiAgICovCiAgLy8gVE9ETyhmbG9pdHNjaCk6IGRvY3VtZW50IGJldHRlci4gKFNlZSBFY21hU2NyaXB0IGZvciBkZXNjcmlwdGlvbikuCiAgU3RyaW5nIHRvVXBwZXJDYXNlKCk7Cn0KCi8qKgogKiBUaGUgcnVuZXMgKGludGVnZXIgVW5pY29kZSBjb2RlIHBvaW50cykgb2YgYSBbU3RyaW5nXS4KICovCmNsYXNzIFJ1bmVzIGV4dGVuZHMgSXRlcmFibGU8aW50PiB7CiAgZmluYWwgU3RyaW5nIHN0cmluZzsKICBSdW5lcyh0aGlzLnN0cmluZyk7CgogIFJ1bmVJdGVyYXRvciBnZXQgaXRlcmF0b3IgPT4gUnVuZUl0ZXJhdG9yKHN0cmluZyk7CgogIGludCBnZXQgbGFzdCB7CiAgICBpZiAoc3RyaW5nLmxlbmd0aCA9PSAwKSB7CiAgICAgIHRocm93IFN0YXRlRXJyb3IoJ05vIGVsZW1lbnRzLicpOwogICAgfQogICAgaW50IGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7CiAgICBpbnQgY29kZSA9IHN0cmluZy5jb2RlVW5pdEF0KGxlbmd0aCAtIDEpOwogICAgaWYgKF9pc1RyYWlsU3Vycm9nYXRlKGNvZGUpICYmIHN0cmluZy5sZW5ndGggPiAxKSB7CiAgICAgIGludCBwcmV2aW91c0NvZGUgPSBzdHJpbmcuY29kZVVuaXRBdChsZW5ndGggLSAyKTsKICAgICAgaWYgKF9pc0xlYWRTdXJyb2dhdGUocHJldmlvdXNDb2RlKSkgewogICAgICAgIHJldHVybiBfY29tYmluZVN1cnJvZ2F0ZVBhaXIocHJldmlvdXNDb2RlLCBjb2RlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNvZGU7CiAgfQp9CgovLyBJcyB0aGVuIGNvZGUgKGEgMTYtYml0IHVuc2lnbmVkIGludGVnZXIpIGEgVVRGLTE2IGxlYWQgc3Vycm9nYXRlLgpib29sIF9pc0xlYWRTdXJyb2dhdGUoaW50IGNvZGUpID0+IChjb2RlICYgMHhGQzAwKSA9PSAweEQ4MDA7CgovLyBJcyB0aGVuIGNvZGUgKGEgMTYtYml0IHVuc2lnbmVkIGludGVnZXIpIGEgVVRGLTE2IHRyYWlsIHN1cnJvZ2F0ZS4KYm9vbCBfaXNUcmFpbFN1cnJvZ2F0ZShpbnQgY29kZSkgPT4gKGNvZGUgJiAweEZDMDApID09IDB4REMwMDsKCi8vIENvbWJpbmUgYSBsZWFkIGFuZCBhIHRyYWlsIHN1cnJvZ2F0ZSB2YWx1ZSBpbnRvIGEgc2luZ2xlIGNvZGUgcG9pbnQuCmludCBfY29tYmluZVN1cnJvZ2F0ZVBhaXIoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgcmV0dXJuIDB4MTAwMDAgKyAoKHN0YXJ0ICYgMHgzRkYpIDw8IDEwKSArIChlbmQgJiAweDNGRik7Cn0KCi8qKiBbSXRlcmF0b3JdIGZvciByZWFkaW5nIHJ1bmVzIChpbnRlZ2VyIFVuaWNvZGUgY29kZSBwb2ludHMpIG91dCBvZiBhIERhcnQKICAqIHN0cmluZy4KICAqLwpjbGFzcyBSdW5lSXRlcmF0b3IgaW1wbGVtZW50cyBCaWRpcmVjdGlvbmFsSXRlcmF0b3I8aW50PiB7CiAgLyoqIFN0cmluZyBiZWluZyBpdGVyYXRlZC4gKi8KICBmaW5hbCBTdHJpbmcgc3RyaW5nOwogIC8qKiBQb3NpdGlvbiBiZWZvcmUgdGhlIGN1cnJlbnQgY29kZSBwb2ludC4gKi8KICBpbnQgX3Bvc2l0aW9uOwogIC8qKiBQb3NpdGlvbiBhZnRlciB0aGUgY3VycmVudCBjb2RlIHBvaW50LiAqLwogIGludCBfbmV4dFBvc2l0aW9uOwogIC8qKgogICAqIEN1cnJlbnQgY29kZSBwb2ludC4KICAgKgogICAqIElmIHRoZSBpdGVyYXRvciBoYXMgaGl0IGVpdGhlciBlbmQsIHRoZSBbX2N1cnJlbnRDb2RlUG9pbnRdIGlzIG51bGwKICAgKiBhbmQgWzogX3Bvc2l0aW9uID09IF9uZXh0UG9zaXRpb24gOl0uCiAgICovCiAgaW50IF9jdXJyZW50Q29kZVBvaW50OwoKICAvKiogQ3JlYXRlIGFuIGl0ZXJhdG9yIHBvc2l0aW9uZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLiAqLwogIFJ1bmVJdGVyYXRvcihTdHJpbmcgc3RyaW5nKQogICAgICA6IHRoaXMuc3RyaW5nID0gc3RyaW5nLAogICAgICAgIF9wb3NpdGlvbiA9IDAsCiAgICAgICAgX25leHRQb3NpdGlvbiA9IDA7CgogIC8qKgogICAqIENyZWF0ZSBhbiBpdGVyYXRvciBwb3NpdGlvbmVkIGJlZm9yZSB0aGUgW2luZGV4XXRoIGNvZGUgdW5pdCBvZiB0aGUgc3RyaW5nLgogICAqCiAgICogV2hlbiBjcmVhdGVkLCB0aGVyZSBpcyBubyBbY3VycmVudF0gdmFsdWUuCiAgICogQSBbbW92ZU5leHRdIHdpbGwgdXNlIHRoZSBydW5lIHN0YXJ0aW5nIGF0IFtpbmRleF0gdGhlIGN1cnJlbnQgdmFsdWUsCiAgICogYW5kIGEgW21vdmVQcmV2aW91c10gd2lsbCB1c2UgdGhlIHJ1bmUgZW5kaW5nIGp1c3QgYmVmb3JlIFtpbmRleF0gYXMgdGhlCiAgICogdGhlIGN1cnJlbnQgdmFsdWUuCiAgICoKICAgKiBUaGUgW2luZGV4XSBwb3NpdGlvbiBtdXN0IG5vdCBiZSBpbiB0aGUgbWlkZGxlIG9mIGEgc3Vycm9nYXRlIHBhaXIuCiAgICovCiAgUnVuZUl0ZXJhdG9yLmF0KFN0cmluZyBzdHJpbmcsIGludCBpbmRleCkKICAgICAgOiBzdHJpbmcgPSBzdHJpbmcsCiAgICAgICAgX3Bvc2l0aW9uID0gaW5kZXgsCiAgICAgICAgX25leHRQb3NpdGlvbiA9IGluZGV4IHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWx1ZUluSW50ZXJ2YWwoaW5kZXgsIDAsIHN0cmluZy5sZW5ndGgpOwogICAgX2NoZWNrU3BsaXRTdXJyb2dhdGUoaW5kZXgpOwogIH0KCiAgLyoqIFRocm93IGFuIGVycm9yIGlmIHRoZSBpbmRleCBpcyBpbiB0aGUgbWlkZGxlIG9mIGEgc3Vycm9nYXRlIHBhaXIuICovCiAgdm9pZCBfY2hlY2tTcGxpdFN1cnJvZ2F0ZShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA+IDAgJiYKICAgICAgICBpbmRleCA8IHN0cmluZy5sZW5ndGggJiYKICAgICAgICBfaXNMZWFkU3Vycm9nYXRlKHN0cmluZy5jb2RlVW5pdEF0KGluZGV4IC0gMSkpICYmCiAgICAgICAgX2lzVHJhaWxTdXJyb2dhdGUoc3RyaW5nLmNvZGVVbml0QXQoaW5kZXgpKSkgewogICAgICB0aHJvdyBBcmd1bWVudEVycm9yKCdJbmRleCBpbnNpZGUgc3Vycm9nYXRlIHBhaXI6ICRpbmRleCcpOwogICAgfQogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgcnVuZSBpbiB0aGUgc3RyaW5nLgogICAqCiAgICogUmV0dXJucyBudWxsIGlmIHRoZSBbY3VycmVudF0gcnVuZSBpcyBudWxsLgogICAqLwogIGludCBnZXQgcmF3SW5kZXggPT4gKF9wb3NpdGlvbiAhPSBfbmV4dFBvc2l0aW9uKSA/IF9wb3NpdGlvbiA6IG51bGw7CgogIC8qKgogICAqIFJlc2V0cyB0aGUgaXRlcmF0b3IgdG8gdGhlIHJ1bmUgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBvZiB0aGUgc3RyaW5nLgogICAqCiAgICogU2V0dGluZyBhIG5lZ2F0aXZlIFtyYXdJbmRleF0sIG9yIG9uZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KICAgKiBbOnN0cmluZy5sZW5ndGg6XSwKICAgKiBpcyBhbiBlcnJvci4gU28gaXMgc2V0dGluZyBpdCBpbiB0aGUgbWlkZGxlIG9mIGEgc3Vycm9nYXRlIHBhaXIuCiAgICoKICAgKiBTZXR0aW5nIHRoZSBwb3NpdGlvbiB0byB0aGUgZW5kIG9mIHRoZW4gc3RyaW5nIHdpbGwgc2V0IFtjdXJyZW50XSB0byBudWxsLgogICAqLwogIHZvaWQgc2V0IHJhd0luZGV4KGludCByYXdJbmRleCkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkSW5kZXgocmF3SW5kZXgsIHN0cmluZywgInJhd0luZGV4Iik7CiAgICByZXNldChyYXdJbmRleCk7CiAgICBtb3ZlTmV4dCgpOwogIH0KCiAgLyoqCiAgICogUmVzZXRzIHRoZSBpdGVyYXRvciB0byB0aGUgZ2l2ZW4gaW5kZXggaW50byB0aGUgc3RyaW5nLgogICAqCiAgICogQWZ0ZXIgdGhpcyB0aGUgW2N1cnJlbnRdIHZhbHVlIGlzIHVuc2V0LgogICAqIFlvdSBtdXN0IGNhbGwgW21vdmVOZXh0XSBtYWtlIHRoZSBydW5lIGF0IHRoZSBwb3NpdGlvbiBjdXJyZW50LAogICAqIG9yIFttb3ZlUHJldmlvdXNdIGZvciB0aGUgbGFzdCBydW5lIGJlZm9yZSB0aGUgcG9zaXRpb24uCiAgICoKICAgKiBTZXR0aW5nIGEgbmVnYXRpdmUgW3Jhd0luZGV4XSwgb3Igb25lIGdyZWF0ZXIgdGhhbiBbOnN0cmluZy5sZW5ndGg6XSwKICAgKiBpcyBhbiBlcnJvci4gU28gaXMgc2V0dGluZyBpdCBpbiB0aGUgbWlkZGxlIG9mIGEgc3Vycm9nYXRlIHBhaXIuCiAgICovCiAgdm9pZCByZXNldChbaW50IHJhd0luZGV4ID0gMF0pIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWx1ZUluSW50ZXJ2YWwocmF3SW5kZXgsIDAsIHN0cmluZy5sZW5ndGgsICJyYXdJbmRleCIpOwogICAgX2NoZWNrU3BsaXRTdXJyb2dhdGUocmF3SW5kZXgpOwogICAgX3Bvc2l0aW9uID0gX25leHRQb3NpdGlvbiA9IHJhd0luZGV4OwogICAgX2N1cnJlbnRDb2RlUG9pbnQgPSBudWxsOwogIH0KCiAgLyoqIFRoZSBydW5lIChpbnRlZ2VyIFVuaWNvZGUgY29kZSBwb2ludCkgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4KICAgKiAgdGhlIHN0cmluZy4KICAgKi8KICBpbnQgZ2V0IGN1cnJlbnQgPT4gX2N1cnJlbnRDb2RlUG9pbnQ7CgogIC8qKgogICAqIFRoZSBudW1iZXIgb2YgY29kZSB1bml0cyBjb21wcmlzaW5nIHRoZSBjdXJyZW50IHJ1bmUuCiAgICoKICAgKiBSZXR1cm5zIHplcm8gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBydW5lIChbY3VycmVudF0gaXMgbnVsbCkuCiAgICovCiAgaW50IGdldCBjdXJyZW50U2l6ZSA9PiBfbmV4dFBvc2l0aW9uIC0gX3Bvc2l0aW9uOwoKICAvKioKICAgKiBBIHN0cmluZyBjb250YWluaW5nIHRoZSBjdXJyZW50IHJ1bmUuCiAgICoKICAgKiBGb3IgcnVuZXMgb3V0c2lkZSB0aGUgYmFzaWMgbXVsdGlsaW5ndWFsIHBsYW5lLCB0aGlzIHdpbGwgYmUKICAgKiBhIFN0cmluZyBvZiBsZW5ndGggMiwgY29udGFpbmluZyB0d28gY29kZSB1bml0cy4KICAgKgogICAqIFJldHVybnMgbnVsbCBpZiBbY3VycmVudF0gaXMgbnVsbC4KICAgKi8KICBTdHJpbmcgZ2V0IGN1cnJlbnRBc1N0cmluZyB7CiAgICBpZiAoX3Bvc2l0aW9uID09IF9uZXh0UG9zaXRpb24pIHJldHVybiBudWxsOwogICAgaWYgKF9wb3NpdGlvbiArIDEgPT0gX25leHRQb3NpdGlvbikgcmV0dXJuIHN0cmluZ1tfcG9zaXRpb25dOwogICAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoX3Bvc2l0aW9uLCBfbmV4dFBvc2l0aW9uKTsKICB9CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBfcG9zaXRpb24gPSBfbmV4dFBvc2l0aW9uOwogICAgaWYgKF9wb3NpdGlvbiA9PSBzdHJpbmcubGVuZ3RoKSB7CiAgICAgIF9jdXJyZW50Q29kZVBvaW50ID0gbnVsbDsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaW50IGNvZGVVbml0ID0gc3RyaW5nLmNvZGVVbml0QXQoX3Bvc2l0aW9uKTsKICAgIGludCBuZXh0UG9zaXRpb24gPSBfcG9zaXRpb24gKyAxOwogICAgaWYgKF9pc0xlYWRTdXJyb2dhdGUoY29kZVVuaXQpICYmIG5leHRQb3NpdGlvbiA8IHN0cmluZy5sZW5ndGgpIHsKICAgICAgaW50IG5leHRDb2RlVW5pdCA9IHN0cmluZy5jb2RlVW5pdEF0KG5leHRQb3NpdGlvbik7CiAgICAgIGlmIChfaXNUcmFpbFN1cnJvZ2F0ZShuZXh0Q29kZVVuaXQpKSB7CiAgICAgICAgX25leHRQb3NpdGlvbiA9IG5leHRQb3NpdGlvbiArIDE7CiAgICAgICAgX2N1cnJlbnRDb2RlUG9pbnQgPSBfY29tYmluZVN1cnJvZ2F0ZVBhaXIoY29kZVVuaXQsIG5leHRDb2RlVW5pdCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIF9uZXh0UG9zaXRpb24gPSBuZXh0UG9zaXRpb247CiAgICBfY3VycmVudENvZGVQb2ludCA9IGNvZGVVbml0OwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBib29sIG1vdmVQcmV2aW91cygpIHsKICAgIF9uZXh0UG9zaXRpb24gPSBfcG9zaXRpb247CiAgICBpZiAoX3Bvc2l0aW9uID09IDApIHsKICAgICAgX2N1cnJlbnRDb2RlUG9pbnQgPSBudWxsOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpbnQgcG9zaXRpb24gPSBfcG9zaXRpb24gLSAxOwogICAgaW50IGNvZGVVbml0ID0gc3RyaW5nLmNvZGVVbml0QXQocG9zaXRpb24pOwogICAgaWYgKF9pc1RyYWlsU3Vycm9nYXRlKGNvZGVVbml0KSAmJiBwb3NpdGlvbiA+IDApIHsKICAgICAgaW50IHByZXZDb2RlVW5pdCA9IHN0cmluZy5jb2RlVW5pdEF0KHBvc2l0aW9uIC0gMSk7CiAgICAgIGlmIChfaXNMZWFkU3Vycm9nYXRlKHByZXZDb2RlVW5pdCkpIHsKICAgICAgICBfcG9zaXRpb24gPSBwb3NpdGlvbiAtIDE7CiAgICAgICAgX2N1cnJlbnRDb2RlUG9pbnQgPSBfY29tYmluZVN1cnJvZ2F0ZVBhaXIocHJldkNvZGVVbml0LCBjb2RlVW5pdCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIF9wb3NpdGlvbiA9IHBvc2l0aW9uOwogICAgX2N1cnJlbnRDb2RlUG9pbnQgPSBjb2RlVW5pdDsKICAgIHJldHVybiB0cnVlOwogIH0KfQqDPwBOTjwBEwEEJANQR01LUFAmA0dNSgMYGCsrAwwREgMLDxESA09DAyMvAz8DMwNAAzIDQlADHEsDRkMDGCMzA0sNAyQDTE1LTgM0A0pJPVBOMwMfMywDTCADFgNHLgMNA0YmeAQ/BjsFUCQFMAVLFQU5JycFRkcvLgZBIQEGOgVQSkEWBUEGNgEGRQVPTAwFSRUFIQVOBUAFUQZMTFAiKBo9HgEGTwVPSRwFITQtLQUiOAYhAQY/Bh0BBh8FSEotBSYmBSEmJgYSAQZEBUssBhQBBk8FRDBMOQUyBUZKJgYiAQYmBUM6MwVOLC1CTB02JwYfAQZBBScGHwEGQwUePz8FSjUFPz8FPAVNTCwFQD8GNQEGSiUFIzk5BSYFOgVBBi0BBlAuBSM6OgVABTsFRQYxAQYrBhQBBi8GFwEGRQUoBiMBBkoqBSIuKgY0AQZFBVE1DTAJOA0YHScJTjoFTglLMjs7PUA7QEJGPgVGCUpFGQYRAQY4BTUGFQEGOQU2BhYBBkwPBS4sBT0GIAEGQQVCQQVDQQVDQUYiQzAGNQEGQgVCQQVDQQVDQUYiQzAGNgEGPgUmOzsFTAwFPDwFQQY2AQZROAVBRgZGAQY8BTBISwVPUAZHHQEGPwVLTiYFQQVNTCwGMwEGTAwFTU5NBU5RBUE8BU0rBTtISwVRBkYBBkYFKQVGBU4xMgY/AQZRBThBBSZJBUg5BR4/SwVPRgUaNzkFTQ4FHUQFJzFEBTchBTwfSAVLSREFTQYnAQZJDQVOBUwtBUY9BUoFRDEyBidKAQZLBhsBBkIFTE0jBhMBBjtPBTEsBU8eBkgYAQY7TwUxLAVPHgZIGAIBBDoEJBcWATUBER4oBiAuODgsOggGEQQCAUU+AUY/AUgwPAIBTQwFOyAXMREwFQYZBUkrBhkBRx4eFxsBBlEFMEtOGAVJBiwZGyA+IQQBSykVITo3QgYEAQZGBTEGRwEGSwVEGEYFUAYkPhUQBAEGPQUuRT4FS0YGI00kKh4EAVASBigBBjsFQwY0AQYrBUI2BSgGHzFCNwQBFB8mIBQGMSZGOi0qSxUIBiIiEQQBGB8aIBQGIjA3OiwiSxUIBhoiEQQCARVkYXJ0OmNvcmUvc3RyaW5nLmRhcnQzb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvc3RyaW5nX2J1ZmZlci5kYXJ0heovLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogQSBjbGFzcyBmb3IgY29uY2F0ZW5hdGluZyBzdHJpbmdzIGVmZmljaWVudGx5LgogKgogKiBBbGxvd3MgZm9yIHRoZSBpbmNyZW1lbnRhbCBidWlsZGluZyBvZiBhIHN0cmluZyB1c2luZyB3cml0ZSooKSBtZXRob2RzLgogKiBUaGUgc3RyaW5ncyBhcmUgY29uY2F0ZW5hdGVkIHRvIGEgc2luZ2xlIHN0cmluZyBvbmx5IHdoZW4gW3RvU3RyaW5nXSBpcwogKiBjYWxsZWQuCiAqLwpjbGFzcyBTdHJpbmdCdWZmZXIgaW1wbGVtZW50cyBTdHJpbmdTaW5rIHsKICAvKiogQ3JlYXRlcyB0aGUgc3RyaW5nIGJ1ZmZlciB3aXRoIGFuIGluaXRpYWwgY29udGVudC4gKi8KICBleHRlcm5hbCBTdHJpbmdCdWZmZXIoW09iamVjdCBjb250ZW50ID0gIiJdKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBjb250ZW50IHRoYXQgaGFzIGJlZW4gYWNjdW11bGF0ZWQgc28gZmFyLgogICAqIFRoaXMgaXMgYSBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KICAgKi8KICBleHRlcm5hbCBpbnQgZ2V0IGxlbmd0aDsKCiAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgYnVmZmVyIGlzIGVtcHR5LiBUaGlzIGlzIGEgY29uc3RhbnQtdGltZSBvcGVyYXRpb24uICovCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBsZW5ndGggPT0gMDsKCiAgLyoqCiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBidWZmZXIgaXMgbm90IGVtcHR5LiBUaGlzIGlzIGEgY29uc3RhbnQtdGltZQogICAqIG9wZXJhdGlvbi4KICAgKi8KICBib29sIGdldCBpc05vdEVtcHR5ID0+ICFpc0VtcHR5OwoKICAvLy8gQWRkcyB0aGUgY29udGVudHMgb2YgW29ial0sIGNvbnZlcnRlZCB0byBhIHN0cmluZywgdG8gdGhlIGJ1ZmZlci4KICBleHRlcm5hbCB2b2lkIHdyaXRlKE9iamVjdCBvYmopOwoKICAvLy8gQWRkcyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIFtjaGFyQ29kZV0gdG8gdGhlIGJ1ZmZlci4KICBleHRlcm5hbCB2b2lkIHdyaXRlQ2hhckNvZGUoaW50IGNoYXJDb2RlKTsKCiAgZXh0ZXJuYWwgdm9pZCB3cml0ZUFsbChJdGVyYWJsZSBvYmplY3RzLCBbU3RyaW5nIHNlcGFyYXRvciA9ICIiXSk7CgogIGV4dGVybmFsIHZvaWQgd3JpdGVsbihbT2JqZWN0IG9iaiA9ICIiXSk7CgogIC8qKgogICAqIENsZWFycyB0aGUgc3RyaW5nIGJ1ZmZlci4KICAgKi8KICBleHRlcm5hbCB2b2lkIGNsZWFyKCk7CgogIC8vLyBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiBidWZmZXIgYXMgYSBjb25jYXRlbmF0ZWQgc3RyaW5nLgogIGV4dGVybmFsIFN0cmluZyB0b1N0cmluZygpOwp9CjQATk48ARMBBDIDS0sLBCs8MAEGSSgGGwFRIwEGRhAGIwFIIwFCLQFFASwBBh8GGQE/HgIBHGRhcnQ6Y29yZS9zdHJpbmdfYnVmZmVyLmRhcnQ4b3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi9zdHJpbmdfYnVmZmVyX3BhdGNoLmRhcnSWWi8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb3JlX3BhdGNoLmRhcnQiOwoKQHBhdGNoCmNsYXNzIFN0cmluZ0J1ZmZlciB7CiAgc3RhdGljIGNvbnN0IGludCBfQlVGRkVSX1NJWkUgPSA2NDsKICBzdGF0aWMgY29uc3QgaW50IF9QQVJUU19UT19DT01QQUNUID0gMTI4OwogIHN0YXRpYyBjb25zdCBpbnQgX1BBUlRTX1RPX0NPTVBBQ1RfU0laRV9MSU1JVCA9IF9QQVJUU19UT19DT01QQUNUICogODsKCiAgLyoqCiAgICogV2hlbiBzdHJpbmdzIGFyZSB3cml0dGVuIHRvIHRoZSBzdHJpbmcgYnVmZmVyLCB3ZSBhZGQgdGhlbSB0byBhCiAgICogbGlzdCBvZiBzdHJpbmcgcGFydHMuCiAgICovCiAgTGlzdDxTdHJpbmc+IF9wYXJ0czsKCiAgLyoqCiAgICAqIFRvdGFsIG51bWJlciBvZiBjb2RlIHVuaXRzIGluIHRoZSBzdHJpbmcgcGFydHMuIERvZXMgbm90IGluY2x1ZGUKICAgICogdGhlIGNvZGUgdW5pdHMgYWRkZWQgdG8gdGhlIGJ1ZmZlci4KICAgICovCiAgaW50IF9wYXJ0c0NvZGVVbml0cyA9IDA7CgogIC8qKgogICAqIFRvIHByZXNlcnZlIG1lbW9yeSwgd2Ugc29tZXRpbWVzIGNvbXBhY3QgdGhlIHBhcnRzLiBUaGlzIGNvbWJpbmVzCiAgICogc2V2ZXJhbCBzbWFsbGVyIHBhcnRzIGludG8gYSBzaW5nbGUgbGFyZ2VyIHBhcnQgdG8gY3V0IGRvd24gb24gdGhlCiAgICogY29zdCB0aGF0IGNvbWVzIGZyb20gdGhlIHBlci1vYmplY3QgbWVtb3J5IG92ZXJoZWFkLiBXZSBrZWVwIHRyYWNrCiAgICogb2YgdGhlIGxhc3QgaW5kZXggd2hlcmUgd2UgZW5kZWQgb3VyIGNvbXBhY3Rpb24gYW5kIHRoZSBudW1iZXIgb2YKICAgKiBjb2RlIHVuaXRzIGFkZGVkIHNpbmNlIHRoZSBsYXN0IGNvbXBhY3Rpb24uCiAgICovCiAgaW50IF9wYXJ0c0NvbXBhY3Rpb25JbmRleCA9IDA7CiAgaW50IF9wYXJ0c0NvZGVVbml0c1NpbmNlQ29tcGFjdGlvbiA9IDA7CgogIC8qKgogICAqIFRoZSBidWZmZXIgaXMgdXNlZCB0byBidWlsZCB1cCBhIHN0cmluZyBmcm9tIGNvZGUgdW5pdHMuIEl0IGlzCiAgICogdXNlZCB3aGVuIHdyaXRpbmcgc2hvcnQgc3RyaW5ncyBvciBpbmRpdmlkdWFsIGNoYXIgY29kZXMgdG8gdGhlCiAgICogYnVmZmVyLiBUaGUgYnVmZmVyIGlzIGFsbG9jYXRlZCBvbiBkZW1hbmQuCiAgICovCiAgVWludDE2TGlzdCBfYnVmZmVyOwogIGludCBfYnVmZmVyUG9zaXRpb24gPSAwOwoKICAvKioKICAgKiBDb2xsZWN0cyB0aGUgYXBwcm94aW1hdGUgbWF4aW1hbCBtYWduaXR1ZGUgb2YgdGhlIGNvZGUgdW5pdHMgYWRkZWQKICAgKiB0byB0aGUgYnVmZmVyLgogICAqCiAgICogVGhlIHZhbHVlIG9mIGVhY2ggYWRkZWQgY29kZSB1bml0IGlzIG9yJ2VkIHdpdGggdGhpcyB2YXJpYWJsZSwgc28gdGhlCiAgICogbW9zdCBzaWduaWZpY2FudCBiaXQgc2V0IGluIGFueSBjb2RlIHVuaXQgaXMgYWxzbyBzZXQgaW4gdGhpcyB2YWx1ZS4KICAgKiBJZiBiZWxvdyAyNTYsIHRoZSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciBpcyBhIExhdGluLTEgc3RyaW5nLgogICAqLwogIGludCBfYnVmZmVyQ29kZVVuaXRNYWduaXR1ZGUgPSAwOwoKICAvLy8gQ3JlYXRlcyB0aGUgc3RyaW5nIGJ1ZmZlciB3aXRoIGFuIGluaXRpYWwgY29udGVudC4KICBAcGF0Y2gKICBTdHJpbmdCdWZmZXIoW09iamVjdCBjb250ZW50ID0gIiJdKSB7CiAgICB3cml0ZShjb250ZW50KTsKICB9CgogIEBwYXRjaAogIGludCBnZXQgbGVuZ3RoID0+IF9wYXJ0c0NvZGVVbml0cyArIF9idWZmZXJQb3NpdGlvbjsKCiAgQHBhdGNoCiAgdm9pZCB3cml0ZShPYmplY3Qgb2JqKSB7CiAgICBTdHJpbmcgc3RyID0gJyRvYmonOwogICAgaWYgKHN0ci5pc0VtcHR5KSByZXR1cm47CiAgICBfY29uc3VtZUJ1ZmZlcigpOwogICAgX2FkZFBhcnQoc3RyKTsKICB9CgogIEBwYXRjaAogIHZvaWQgd3JpdGVDaGFyQ29kZShpbnQgY2hhckNvZGUpIHsKICAgIGlmIChjaGFyQ29kZSA8PSAweEZGRkYpIHsKICAgICAgaWYgKGNoYXJDb2RlIDwgMCkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGNoYXJDb2RlLCAwLCAweDEwRkZGRik7CiAgICAgIH0KICAgICAgX2Vuc3VyZUNhcGFjaXR5KDEpOwogICAgICBfYnVmZmVyW19idWZmZXJQb3NpdGlvbisrXSA9IGNoYXJDb2RlOwogICAgICBfYnVmZmVyQ29kZVVuaXRNYWduaXR1ZGUgfD0gY2hhckNvZGU7CiAgICB9IGVsc2UgewogICAgICBpZiAoY2hhckNvZGUgPiAweDEwRkZGRikgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGNoYXJDb2RlLCAwLCAweDEwRkZGRik7CiAgICAgIH0KICAgICAgX2Vuc3VyZUNhcGFjaXR5KDIpOwogICAgICBpbnQgYml0cyA9IGNoYXJDb2RlIC0gMHgxMDAwMDsKICAgICAgX2J1ZmZlcltfYnVmZmVyUG9zaXRpb24rK10gPSAweEQ4MDAgfCAoYml0cyA+PiAxMCk7CiAgICAgIF9idWZmZXJbX2J1ZmZlclBvc2l0aW9uKytdID0gMHhEQzAwIHwgKGJpdHMgJiAweDNGRik7CiAgICAgIF9idWZmZXJDb2RlVW5pdE1hZ25pdHVkZSB8PSAweEZGRkY7CiAgICB9CiAgfQoKICBAcGF0Y2gKICB2b2lkIHdyaXRlQWxsKEl0ZXJhYmxlIG9iamVjdHMsIFtTdHJpbmcgc2VwYXJhdG9yID0gIiJdKSB7CiAgICBJdGVyYXRvciBpdGVyYXRvciA9IG9iamVjdHMuaXRlcmF0b3I7CiAgICBpZiAoIWl0ZXJhdG9yLm1vdmVOZXh0KCkpIHJldHVybjsKICAgIGlmIChzZXBhcmF0b3IuaXNFbXB0eSkgewogICAgICBkbyB7CiAgICAgICAgd3JpdGUoaXRlcmF0b3IuY3VycmVudCk7CiAgICAgIH0gd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGUoaXRlcmF0b3IuY3VycmVudCk7CiAgICAgIHdoaWxlIChpdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgICAgd3JpdGUoc2VwYXJhdG9yKTsKICAgICAgICB3cml0ZShpdGVyYXRvci5jdXJyZW50KTsKICAgICAgfQogICAgfQogIH0KCiAgQHBhdGNoCiAgdm9pZCB3cml0ZWxuKFtPYmplY3Qgb2JqID0gIiJdKSB7CiAgICB3cml0ZShvYmopOwogICAgd3JpdGUoIlxuIik7CiAgfQoKICAvKiogTWFrZXMgdGhlIGJ1ZmZlciBlbXB0eS4gKi8KICBAcGF0Y2gKICB2b2lkIGNsZWFyKCkgewogICAgX3BhcnRzID0gbnVsbDsKICAgIF9wYXJ0c0NvZGVVbml0cyA9IF9idWZmZXJQb3NpdGlvbiA9IF9idWZmZXJDb2RlVW5pdE1hZ25pdHVkZSA9IDA7CiAgfQoKICAvKiogUmV0dXJucyB0aGUgY29udGVudHMgb2YgYnVmZmVyIGFzIGEgc3RyaW5nLiAqLwogIEBwYXRjaAogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIF9jb25zdW1lQnVmZmVyKCk7CiAgICByZXR1cm4gKF9wYXJ0c0NvZGVVbml0cyA9PSAwKQogICAgICAgID8gIiIKICAgICAgICA6IF9TdHJpbmdCYXNlLl9jb25jYXRSYW5nZShfcGFydHMsIDAsIF9wYXJ0cy5sZW5ndGgpOwogIH0KCiAgLyoqIEVuc3VyZXMgdGhhdCB0aGUgYnVmZmVyIGhhcyBlbm91Z2ggY2FwYWNpdHkgdG8gYWRkIG4gY29kZSB1bml0cy4gKi8KICB2b2lkIF9lbnN1cmVDYXBhY2l0eShpbnQgbikgewogICAgaWYgKF9idWZmZXIgPT0gbnVsbCkgewogICAgICBfYnVmZmVyID0gbmV3IFVpbnQxNkxpc3QoX0JVRkZFUl9TSVpFKTsKICAgIH0gZWxzZSBpZiAoX2J1ZmZlclBvc2l0aW9uICsgbiA+IF9idWZmZXIubGVuZ3RoKSB7CiAgICAgIF9jb25zdW1lQnVmZmVyKCk7CiAgICB9CiAgfQoKICAvKioKICAgKiBDb25zdW1lcyB0aGUgY29udGVudCBvZiB0aGUgYnVmZmVyIGJ5IHR1cm5pbmcgaXQgaW50byBhIHN0cmluZwogICAqIGFuZCBhZGRpbmcgaXQgYXMgYSBwYXJ0LiBBZnRlciBjYWxsaW5nIHRoaXMgdGhlIGJ1ZmZlciBwb3NpdGlvbgogICAqIHdpbGwgYmUgcmVzZXQgdG8gemVyby4KICAgKi8KICB2b2lkIF9jb25zdW1lQnVmZmVyKCkgewogICAgaWYgKF9idWZmZXJQb3NpdGlvbiA9PSAwKSByZXR1cm47CiAgICBib29sIGlzTGF0aW4xID0gX2J1ZmZlckNvZGVVbml0TWFnbml0dWRlIDw9IDB4RkY7CiAgICBTdHJpbmcgc3RyID0gX2NyZWF0ZShfYnVmZmVyLCBfYnVmZmVyUG9zaXRpb24sIGlzTGF0aW4xKTsKICAgIF9idWZmZXJQb3NpdGlvbiA9IF9idWZmZXJDb2RlVW5pdE1hZ25pdHVkZSA9IDA7CiAgICBfYWRkUGFydChzdHIpOwogIH0KCiAgLyoqCiAgICogQWRkcyBhIG5ldyBwYXJ0IHRvIHRoaXMgc3RyaW5nIGJ1ZmZlciBhbmQga2VlcHMgdHJhY2sgb2YgaG93CiAgICogbWFueSBjb2RlIHVuaXRzIGFyZSBjb250YWluZWQgaW4gdGhlIHBhcnRzLgogICAqLwogIHZvaWQgX2FkZFBhcnQoU3RyaW5nIHN0cikgewogICAgaW50IGxlbmd0aCA9IHN0ci5sZW5ndGg7CiAgICBfcGFydHNDb2RlVW5pdHMgKz0gbGVuZ3RoOwogICAgX3BhcnRzQ29kZVVuaXRzU2luY2VDb21wYWN0aW9uICs9IGxlbmd0aDsKCiAgICBpZiAoX3BhcnRzID09IG51bGwpIHsKICAgICAgLy8gRW1waXJpY2FsbHkgdGhpcyBpcyBhIGdvb2QgY2FwYWNpdHkgdG8gbWluaW1pemUgdG90YWwgYnl0ZXMgYWxsb2NhdGVkLgogICAgICBfcGFydHMgPSBuZXcgX0dyb3dhYmxlTGlzdC53aXRoQ2FwYWNpdHkoMTApLi5hZGQoc3RyKTsKICAgIH0gZWxzZSB7CiAgICAgIF9wYXJ0cy5hZGQoc3RyKTsKICAgICAgaW50IHBhcnRzU2luY2VDb21wYWN0aW9uID0gX3BhcnRzLmxlbmd0aCAtIF9wYXJ0c0NvbXBhY3Rpb25JbmRleDsKICAgICAgaWYgKHBhcnRzU2luY2VDb21wYWN0aW9uID09IF9QQVJUU19UT19DT01QQUNUKSB7CiAgICAgICAgX2NvbXBhY3QoKTsKICAgICAgfQogICAgfQogIH0KCiAgLyoqCiAgICogQ29tcGFjdHMgdGhlIGxhc3QgTiBwYXJ0cyBpZiB0aGVpciBhdmVyYWdlIHNpemUgYWxsb3dzIHVzIHRvIHNhdmUgYQogICAqIGxvdCBvZiBtZW1vcnkgYnkgdHVybmluZyB0aGVtIGFsbCBpbnRvIGEgc2luZ2xlIHBhcnQuCiAgICovCiAgdm9pZCBfY29tcGFjdCgpIHsKICAgIGlmIChfcGFydHNDb2RlVW5pdHNTaW5jZUNvbXBhY3Rpb24gPCBfUEFSVFNfVE9fQ09NUEFDVF9TSVpFX0xJTUlUKSB7CiAgICAgIFN0cmluZyBjb21wYWN0ZWQgPSBfU3RyaW5nQmFzZS5fY29uY2F0UmFuZ2UoCiAgICAgICAgICBfcGFydHMsCiAgICAgICAgICBfcGFydHNDb21wYWN0aW9uSW5kZXgsIC8vIFN0YXJ0CiAgICAgICAgICBfcGFydHNDb21wYWN0aW9uSW5kZXggKyBfUEFSVFNfVE9fQ09NUEFDVCAvLyBFbmQKICAgICAgICAgICk7CiAgICAgIF9wYXJ0cy5sZW5ndGggPSBfcGFydHMubGVuZ3RoIC0gX1BBUlRTX1RPX0NPTVBBQ1Q7CiAgICAgIF9wYXJ0cy5hZGQoY29tcGFjdGVkKTsKICAgIH0KICAgIF9wYXJ0c0NvZGVVbml0c1NpbmNlQ29tcGFjdGlvbiA9IDA7CiAgICBfcGFydHNDb21wYWN0aW9uSW5kZXggPSBfcGFydHMubGVuZ3RoOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlIGEgW1N0cmluZ10gZnJvbSB0aGUgVUZULTE2IGNvZGUgdW5pdHMgaW4gYnVmZmVyLgogICAqLwogIHN0YXRpYyBTdHJpbmcgX2NyZWF0ZShVaW50MTZMaXN0IGJ1ZmZlciwgaW50IGxlbmd0aCwgYm9vbCBpc0xhdGluMSkKICAgICAgbmF0aXZlICJTdHJpbmdCdWZmZXJfY3JlYXRlU3RyaW5nRnJvbVVpbnQxNkFycmF5IjsKfQqAxgBOTjwBHgEHFSYsSQEGRRsGFwEGRyoHGwEGR0hIRzEGISoBBkRFMAYWGwEGSBQFS0pBBiQBOQkoFAQBCTcBCRsZHRYTBAEJJR4aOwgaLSwNITsIGiU6PCoGBAEJPSomHQshJQ0fJBohCAYEAQkkEBEEASEJERNGBAE1CRYWIg0+BAFKIBsuNxgGBAEGREUcBhomNj40EwQBBkIxBh4dHy4BGlA9DRdINxQIBgQBBkk7BhRJMxIqOw05HQYoKwQBBj0GRjkCAShkYXJ0OmNvcmUtcGF0Y2gvc3RyaW5nX2J1ZmZlcl9wYXRjaC5kYXJ0MW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL3N0cmluZ19zaW5rLmRhcnSDdy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCmFic3RyYWN0IGNsYXNzIFN0cmluZ1NpbmsgewogIC8qKgogICAqIENvbnZlcnRzIFtvYmpdIHRvIGEgU3RyaW5nIGJ5IGludm9raW5nIFtPYmplY3QudG9TdHJpbmddIGFuZCAKICAgKiBhZGRzIHRoZSByZXN1bHQgdG8gYHRoaXNgLgogICAqLwogIHZvaWQgd3JpdGUoT2JqZWN0IG9iaik7CgogIC8qKgogICAqIEl0ZXJhdGVzIG92ZXIgdGhlIGdpdmVuIFtvYmplY3RzXSBhbmQgW3dyaXRlXXMgdGhlbSBpbiBzZXF1ZW5jZS4KICAgKi8KICB2b2lkIHdyaXRlQWxsKEl0ZXJhYmxlIG9iamVjdHMsIFtTdHJpbmcgc2VwYXJhdG9yID0gIiJdKTsKCiAgLyoqCiAgICogQ29udmVydHMgW29ial0gdG8gYSBTdHJpbmcgYnkgaW52b2tpbmcgW09iamVjdC50b1N0cmluZ10gYW5kIAogICAqIGFkZHMgdGhlIHJlc3VsdCB0byBgdGhpc2AsIGZvbGxvd2VkIGJ5IGEgbmV3bGluZS4KICAgKi8KICB2b2lkIHdyaXRlbG4oW09iamVjdCBvYmogPSAiIl0pOwoKICAvKioKICAgKiBXcml0ZXMgdGhlIFtjaGFyQ29kZV0gdG8gYHRoaXNgLgogICAqCiAgICogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBgd3JpdGUobmV3IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpKWAuCiAgICovCiAgdm9pZCB3cml0ZUNoYXJDb2RlKGludCBjaGFyQ29kZSk7Cn0KIQBOTjwBEwEcBkMgBhoBBkYGPAEGQzcGIwEGJgVOBiQCARpkYXJ0OmNvcmUvc3RyaW5nX3NpbmsuZGFydCxvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS9zeW1ib2wuZGFydI5WLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLy8vIE9wYXF1ZSBuYW1lIHVzZWQgYnkgbWlycm9ycywgaW52b2NhdGlvbnMgYW5kIFtGdW5jdGlvbi5hcHBseV0uCmFic3RyYWN0IGNsYXNzIFN5bWJvbCB7CiAgLyoqIFRoZSBzeW1ib2wgY29ycmVzcG9uZGluZyB0byB0aGUgbmFtZSBvZiB0aGUgdW5hcnkgbWludXMgb3BlcmF0b3IuICovCiAgc3RhdGljIGNvbnN0IFN5bWJvbCB1bmFyeU1pbnVzID0gU3ltYm9sKCJ1bmFyeS0iKTsKCiAgLyoqCiAgICogVGhlIGVtcHR5IHN5bWJvbC4KICAgKgogICAqIFRoZSBlbXB0eSBzeW1ib2wgaXMgdGhlIG5hbWUgb2YgbGlicmFyaWVzIHdpdGggbm8gbGlicmFyeSBkZWNsYXJhdGlvbiwKICAgKiBhbmQgdGhlIGJhc2UtbmFtZSBvZiB0aGUgdW5uYW1lZCBjb25zdHJ1Y3Rvci4KICAgKi8KICBzdGF0aWMgY29uc3QgU3ltYm9sIGVtcHR5ID0gU3ltYm9sKCIiKTsKCiAgLyoqCiAgICogQ29uc3RydWN0cyBhIG5ldyBbU3ltYm9sXSByZXByZXNlbnRpbmcgdGhlIHByb3ZpZGVkIG5hbWUuCiAgICoKICAgKiBUaGUgbmFtZSBtdXN0IGJlIGEgdmFsaWQgcHVibGljIERhcnQgbWVtYmVyIG5hbWUsCiAgICogcHVibGljIGNvbnN0cnVjdG9yIG5hbWUsIG9yIGxpYnJhcnkgbmFtZSwgb3B0aW9uYWxseSBxdWFsaWZpZWQuCiAgICoKICAgKiBBIHF1YWxpZmllZCBuYW1lIGlzIGEgdmFsaWQgbmFtZSBwcmVjZWRlZCBieSBhIHB1YmxpYyBpZGVudGlmaWVyIG5hbWUKICAgKiBhbmQgYSAnYC5gJywgZS5nLiwgYGZvby5iYXIuYmF6PWAgaXMgYSBxdWFsaWZpZWQgdmVyc2lvbiBvZiBgYmF6PWAuCiAgICogVGhhdCBtZWFucyB0aGF0IHRoZSBjb250ZW50IG9mIHRoZSBbbmFtZV0gU3RyaW5nIG11c3QgYmUgZWl0aGVyCiAgICoKICAgKiAqIGEgdmFsaWQgcHVibGljIERhcnQgaWRlbnRpZmllcgogICAqICAgKHRoYXQgaXMsIGFuIGlkZW50aWZpZXIgbm90IHN0YXJ0aW5nIHdpdGggImBfYCIpLAogICAqICogc3VjaCBhbiBpZGVudGlmaWVyIGZvbGxvd2VkIGJ5ICI9IiAoYSBzZXR0ZXIgbmFtZSksCiAgICogKiB0aGUgbmFtZSBvZiBhIGRlY2xhcmFibGUgb3BlcmF0b3IKICAgKiAgIChvbmUgb2YgImArYCIsICJgLWAiLCAiYCpgIiwgImAvYCIsICJgJWAiLCAiYH4vYCIsICJgJmAiLCAiYHxgIiwKICAgKiAgICJgXmAiLCAiYH5gIiwgImA8PGAiLCAiYD4+YCIsICJgPGAiLCAiYDw9YCIsICJgPmAiLCAiYD49YCIsICJgPT1gIiwKICAgKiAgICJgW11gIiwgImBbXT1gIiwgb3IgImB1bmFyeS1gIiksCiAgICogKiBhbnkgb2YgdGhlIGFib3ZlIHByZWNlZGVkIGJ5IGFueSBudW1iZXIgb2YgcXVhbGlmaWVycywKICAgKiAgIHdoZXJlIGEgcXVhbGlmaWVyIGlzIGEgbm9uLXByaXZhdGUgaWRlbnRpZmllciBmb2xsb3dlZCBieSAnYC5gJywKICAgKiAqIG9yIHRoZSBlbXB0eSBzdHJpbmcgKHRoZSBkZWZhdWx0IG5hbWUgb2YgYSBsaWJyYXJ5IHdpdGggbm8gbGlicmFyeQogICAqICAgbmFtZSBkZWNsYXJhdGlvbikuCiAgICoKICAgKiBTeW1ib2wgaW5zdGFuY2VzIGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSBbbmFtZV0gYXJlIGVxdWFsLAogICAqIGJ1dCBub3QgbmVjZXNzYXJpbHkgaWRlbnRpY2FsLCBidXQgc3ltYm9scyBjcmVhdGVkIGFzIGNvbXBpbGUtdGltZQogICAqIGNvbnN0YW50cyBhcmUgY2Fub25pY2FsaXplZCwgYXMgYWxsIG90aGVyIGNvbnN0YW50IG9iamVjdCBjcmVhdGlvbnMuCiAgICoKICAgKiBgYGBkYXJ0CiAgICogYXNzZXJ0KG5ldyBTeW1ib2woImZvbyIpID09IG5ldyBTeW1ib2woImZvbyIpKTsKICAgKiBhc3NlcnQoaWRlbnRpY2FsKGNvbnN0IFN5bWJvbCgiZm9vIiksIGNvbnN0IFN5bWJvbCgiZm9vIikpKTsKICAgKiBgYGAKICAgKgogICAqIElmIFtuYW1lXSBpcyBhIHNpbmdsZSBpZGVudGlmaWVyIHRoYXQgZG9lcyBub3Qgc3RhcnQgd2l0aCBhbiB1bmRlcnNjb3JlLAogICAqIG9yIGl0IGlzIGEgcXVhbGlmaWVkIGlkZW50aWZpZXIsCiAgICogb3IgaXQgaXMgYW4gb3BlcmF0b3IgbmFtZSBkaWZmZXJlbnQgZnJvbSBgdW5hcnktYCwKICAgKiB0aGVuIHRoZSByZXN1bHQgb2YgYGNvbnN0IFN5bWJvbChuYW1lKWAgaXMgdGhlIHNhbWUgaW5zdGFuY2UgdGhhdAogICAqIHRoZSBzeW1ib2wgbGl0ZXJhbCBjcmVhdGVkIGJ5IHByZWZpeGluZyBgI2AgdG8gdGhlIGNvbnRlbnQgb2YgW25hbWVdCiAgICogd291bGQgZXZhbHVhdGUgdG8uCiAgICoKICAgKiBgYGBkYXJ0CiAgICogYXNzZXJ0KG5ldyBTeW1ib2woImZvbyIpID09ICNmb28pOwogICAqIGFzc2VydChuZXcgU3ltYm9sKCJbXT0iKSA9PSAjW109XSk7CiAgICogYXNzZXJ0KG5ldyBTeW1ib2woImZvby5iYXIiKSA9PSAjZm9vLmJhcik7CiAgICogYXNzZXJ0KGlkZW50aWNhbChjb25zdCBTeW1ib2woImZvbyIpLCAjZm9vKSk7CiAgICogYXNzZXJ0KGlkZW50aWNhbChjb25zdCBTeW1ib2woIltdPSIpLCAjW109XSkpOwogICAqIGFzc2VydChpZGVudGljYWwoY29uc3QgU3ltYm9sKCJmb28uYmFyIiksICNmb28uYmFyKSk7CiAgICogYGBgCiAgICoKICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNhbm5vdCBjcmVhdGUgYSBbU3ltYm9sXSBpbnN0YW5jZSB0aGF0IGlzIGVxdWFsIHRvCiAgICogYSBwcml2YXRlIHN5bWJvbCBsaXRlcmFsIGxpa2UgYCNfZm9vYC4KICAgKiBgYGBkYXJ0CiAgICogY29uc3QgU3ltYm9sKCJfZm9vIikgLy8gSW52YWxpZAogICAqIGBgYAogICAqCiAgICogVGhlIGNyZWF0ZWQgaW5zdGFuY2Ugb3ZlcnJpZGVzIFtPYmplY3QuPT1dLgogICAqCiAgICogVGhlIGZvbGxvd2luZyB0ZXh0IGlzIG5vbi1ub3JtYXRpdmU6CiAgICoKICAgKiBDcmVhdGluZyBub24tY29uc3QgU3ltYm9sIGluc3RhbmNlcyBtYXkgcmVzdWx0IGluIGxhcmdlciBvdXRwdXQuICBJZgogICAqIHBvc3NpYmxlLCB1c2UgYE1pcnJvcnNVc2VkYCBmcm9tICJkYXJ0Om1pcnJvcnMiIHRvIHNwZWNpZnkgd2hpY2ggbmFtZXMKICAgKiBtaWdodCBiZSBwYXNzZWQgdG8gdGhpcyBjb25zdHJ1Y3Rvci4KICAgKi8KICBjb25zdCBmYWN0b3J5IFN5bWJvbChTdHJpbmcgbmFtZSkgPSBpbnRlcm5hbC5TeW1ib2w7CgogIC8qKgogICAqIFJldHVybnMgYSBoYXNoIGNvZGUgY29tcGF0aWJsZSB3aXRoIFtvcGVyYXRvcj09XS4KICAgKgogICAqIEVxdWFsIHN5bWJvbHMgaGF2ZSB0aGUgc2FtZSBoYXNoIGNvZGUuCiAgICovCiAgaW50IGdldCBoYXNoQ29kZTsKCiAgLyoqCiAgICogU3ltYm9scyBhcmUgZXF1YWwgdG8gb3RoZXIgc3ltYm9scyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHNhbWUgbWVtYmVyIG5hbWUuCiAgICoKICAgKiBRdWFsaWZpZWQgbWVtYmVyIG5hbWVzLCBsaWtlIGAjZm9vLmJhcmAgYXJlIGVxdWFsIG9ubHkgaWYgdGhleSBoYXZlIHRoZQogICAqIHNhbWUgaWRlbnRpZmllcnMgYmVmb3JlIHRoZSBzYW1lIGZpbmFsIG1lbWJlciBuYW1lLgogICAqLwogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpOwp9CmMATk48ARMBQxhLNQEGFwVMMwYqAQY/BTdFBUtJRQUmOTspSEsoPkhKGgU+SEoFDTVCCQVOJjhHShgFDSgpMDM0OwkFSSwNJQkFMQUqBUpMKgY3AQY3BSwGFAEGUQVNOQYbAgEVZGFydDpjb3JlL3N5bWJvbC5kYXJ0Km9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL3R5cGUuZGFydIExLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLyoqCiAqIFJ1bnRpbWUgcmVwcmVzZW50YXRpb24gb2YgYSB0eXBlLgogKi8KYWJzdHJhY3QgY2xhc3MgVHlwZSB7fQoMAE5OPAETAQQlBBcBE2RhcnQ6Y29yZS90eXBlLmRhcnQpb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvdXJpLmRhcnTAAoC1Ly8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLy8gRnJlcXVlbnRseSB1c2VkIGNoYXJhY3RlciBjb2Rlcy4KY29uc3QgaW50IF9TUEFDRSA9IDB4MjA7CmNvbnN0IGludCBfUEVSQ0VOVCA9IDB4MjU7CmNvbnN0IGludCBfQU1QRVJTQU5EID0gMHgyNjsKY29uc3QgaW50IF9QTFVTID0gMHgyQjsKY29uc3QgaW50IF9ET1QgPSAweDJFOwpjb25zdCBpbnQgX1NMQVNIID0gMHgyRjsKY29uc3QgaW50IF9DT0xPTiA9IDB4M0E7CmNvbnN0IGludCBfRVFVQUxTID0gMHgzZDsKY29uc3QgaW50IF9VUFBFUl9DQVNFX0EgPSAweDQxOwpjb25zdCBpbnQgX1VQUEVSX0NBU0VfWiA9IDB4NUE7CmNvbnN0IGludCBfTEVGVF9CUkFDS0VUID0gMHg1QjsKY29uc3QgaW50IF9CQUNLU0xBU0ggPSAweDVDOwpjb25zdCBpbnQgX1JJR0hUX0JSQUNLRVQgPSAweDVEOwpjb25zdCBpbnQgX0xPV0VSX0NBU0VfQSA9IDB4NjE7CmNvbnN0IGludCBfTE9XRVJfQ0FTRV9GID0gMHg2NjsKY29uc3QgaW50IF9MT1dFUl9DQVNFX1ogPSAweDdBOwoKY29uc3QgU3RyaW5nIF9oZXhEaWdpdHMgPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CgovKioKICogQSBwYXJzZWQgVVJJLCBzdWNoIGFzIGEgVVJMLgogKgogKiAqKlNlZSBhbHNvOioqCiAqCiAqICogW1VSSXNdW3VyaXNdIGluIHRoZSBbbGlicmFyeSB0b3VyXVtsaWJ0b3VyXQogKiAqIFtSRkMtMzk4Nl0oaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NikKICoKICogW3VyaXNdOiBodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy9kYXJ0LXVwLWFuZC1ydW5uaW5nL2NoMDMuaHRtbCN1cmlzCiAqIFtsaWJ0b3VyXTogaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL2RvY3MvZGFydC11cC1hbmQtcnVubmluZy9jb250ZW50cy9jaDAzLmh0bWwKICovCmFic3RyYWN0IGNsYXNzIFVyaSB7CiAgLyoqCiAgICogUmV0dXJucyB0aGUgbmF0dXJhbCBiYXNlIFVSSSBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0uCiAgICoKICAgKiBXaGVuIHJ1bm5pbmcgaW4gYSBicm93c2VyIHRoaXMgaXMgdGhlIGN1cnJlbnQgVVJMIG9mIHRoZSBjdXJyZW50IHBhZ2UKICAgKiAoZnJvbSBgd2luZG93LmxvY2F0aW9uLmhyZWZgKS4KICAgKgogICAqIFdoZW4gbm90IHJ1bm5pbmcgaW4gYSBicm93c2VyIHRoaXMgaXMgdGhlIGZpbGUgVVJJIHJlZmVyZW5jaW5nCiAgICogdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIFVyaSBnZXQgYmFzZTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBVUkkgZnJvbSBpdHMgY29tcG9uZW50cy4KICAgKgogICAqIEVhY2ggY29tcG9uZW50IGlzIHNldCB0aHJvdWdoIGEgbmFtZWQgYXJndW1lbnQuIEFueSBudW1iZXIgb2YKICAgKiBjb21wb25lbnRzIGNhbiBiZSBwcm92aWRlZC4gVGhlIFtwYXRoXSBhbmQgW3F1ZXJ5XSBjb21wb25lbnRzIGNhbiBiZSBzZXQKICAgKiB1c2luZyBlaXRoZXIgb2YgdHdvIGRpZmZlcmVudCBuYW1lZCBhcmd1bWVudHMuCiAgICoKICAgKiBUaGUgc2NoZW1lIGNvbXBvbmVudCBpcyBzZXQgdGhyb3VnaCBbc2NoZW1lXS4gVGhlIHNjaGVtZSBpcwogICAqIG5vcm1hbGl6ZWQgdG8gYWxsIGxvd2VyY2FzZSBsZXR0ZXJzLiBJZiB0aGUgc2NoZW1lIGlzIG9taXR0ZWQgb3IgZW1wdHksCiAgICogdGhlIFVSSSB3aWxsIG5vdCBoYXZlIGEgc2NoZW1lIHBhcnQuCiAgICoKICAgKiBUaGUgdXNlciBpbmZvIHBhcnQgb2YgdGhlIGF1dGhvcml0eSBjb21wb25lbnQgaXMgc2V0IHRocm91Z2gKICAgKiBbdXNlckluZm9dLiBJdCBkZWZhdWx0cyB0byB0aGUgZW1wdHkgc3RyaW5nLCB3aGljaCB3aWxsIGJlIG9taXR0ZWQKICAgKiBmcm9tIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFVSSS4KICAgKgogICAqIFRoZSBob3N0IHBhcnQgb2YgdGhlIGF1dGhvcml0eSBjb21wb25lbnQgaXMgc2V0IHRocm91Z2gKICAgKiBbaG9zdF0uIFRoZSBob3N0IGNhbiBlaXRoZXIgYmUgYSBob3N0bmFtZSwgYW4gSVB2NCBhZGRyZXNzIG9yIGFuCiAgICogSVB2NiBhZGRyZXNzLCBjb250YWluZWQgaW4gJ1snIGFuZCAnXScuIElmIHRoZSBob3N0IGNvbnRhaW5zIGEKICAgKiAnOicgY2hhcmFjdGVyLCB0aGUgJ1snIGFuZCAnXScgYXJlIGFkZGVkIGlmIG5vdCBhbHJlYWR5IHByb3ZpZGVkLgogICAqIFRoZSBob3N0IGlzIG5vcm1hbGl6ZWQgdG8gYWxsIGxvd2VyY2FzZSBsZXR0ZXJzLgogICAqCiAgICogVGhlIHBvcnQgcGFydCBvZiB0aGUgYXV0aG9yaXR5IGNvbXBvbmVudCBpcyBzZXQgdGhyb3VnaAogICAqIFtwb3J0XS4KICAgKiBJZiBbcG9ydF0gaXMgb21pdHRlZCBvciBgbnVsbGAsIGl0IGltcGxpZXMgdGhlIGRlZmF1bHQgcG9ydCBmb3IKICAgKiB0aGUgVVJJJ3Mgc2NoZW1lLCBhbmQgaXMgZXF1aXZhbGVudCB0byBwYXNzaW5nIHRoYXQgcG9ydCBleHBsaWNpdGx5LgogICAqIFRoZSByZWNvZ25pemVkIHNjaGVtZXMsIGFuZCB0aGVpciBkZWZhdWx0IHBvcnRzLCBhcmUgImh0dHAiICg4MCkgYW5kCiAgICogImh0dHBzIiAoNDQzKS4gQWxsIG90aGVyIHNjaGVtZXMgYXJlIGNvbnNpZGVyZWQgYXMgaGF2aW5nIHplcm8gYXMgdGhlCiAgICogZGVmYXVsdCBwb3J0LgogICAqCiAgICogSWYgYW55IG9mIGB1c2VySW5mb2AsIGBob3N0YCBvciBgcG9ydGAgYXJlIHByb3ZpZGVkLAogICAqIHRoZSBVUkkgaGFzIGFuIGF1dGhvcml0eSBhY2NvcmRpbmcgdG8gW2hhc0F1dGhvcml0eV0uCiAgICoKICAgKiBUaGUgcGF0aCBjb21wb25lbnQgaXMgc2V0IHRocm91Z2ggZWl0aGVyIFtwYXRoXSBvcgogICAqIFtwYXRoU2VnbWVudHNdLgogICAqIFdoZW4gW3BhdGhdIGlzIHVzZWQsIGl0IHNob3VsZCBiZSBhIHZhbGlkIFVSSSBwYXRoLAogICAqIGJ1dCBpbnZhbGlkIGNoYXJhY3RlcnMsIGV4Y2VwdCB0aGUgZ2VuZXJhbCBkZWxpbWl0ZXJzICc6L0BbXT8jJywKICAgKiB3aWxsIGJlIGVzY2FwZWQgaWYgbmVjZXNzYXJ5LgogICAqIFdoZW4gW3BhdGhTZWdtZW50c10gaXMgdXNlZCwgZWFjaCBvZiB0aGUgcHJvdmlkZWQgc2VnbWVudHMKICAgKiBpcyBmaXJzdCBwZXJjZW50LWVuY29kZWQgYW5kIHRoZW4gam9pbmVkIHVzaW5nIHRoZSBmb3J3YXJkIHNsYXNoCiAgICogc2VwYXJhdG9yLgogICAqCiAgICogVGhlIHBlcmNlbnQtZW5jb2Rpbmcgb2YgdGhlIHBhdGggc2VnbWVudHMgZW5jb2RlcyBhbGwKICAgKiBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3IgdGhlIHVucmVzZXJ2ZWQgY2hhcmFjdGVycyBhbmQgdGhlIGZvbGxvd2luZwogICAqIGxpc3Qgb2YgY2hhcmFjdGVyczogYCEkJicoKSorLDs9OkBgLiBJZiB0aGUgb3RoZXIgY29tcG9uZW50cwogICAqIG5lY2Vzc2l0YXRlIGFuIGFic29sdXRlIHBhdGgsIGEgbGVhZGluZyBzbGFzaCBgL2AgaXMgcHJlcGVuZGVkIGlmCiAgICogbm90IGFscmVhZHkgdGhlcmUuCiAgICoKICAgKiBUaGUgcXVlcnkgY29tcG9uZW50IGlzIHNldCB0aHJvdWdoIGVpdGhlciBbcXVlcnldIG9yIFtxdWVyeVBhcmFtZXRlcnNdLgogICAqIFdoZW4gW3F1ZXJ5XSBpcyB1c2VkLCB0aGUgcHJvdmlkZWQgc3RyaW5nIHNob3VsZCBiZSBhIHZhbGlkIFVSSSBxdWVyeSwKICAgKiBidXQgaW52YWxpZCBjaGFyYWN0ZXJzLCBvdGhlciB0aGFuIGdlbmVyYWwgZGVsaW1pdGVycywKICAgKiB3aWxsIGJlIGVzY2FwZWQgaWYgbmVjZXNzYXJ5LgogICAqIFdoZW4gW3F1ZXJ5UGFyYW1ldGVyc10gaXMgdXNlZCB0aGUgcXVlcnkgaXMgYnVpbHQgZnJvbSB0aGUKICAgKiBwcm92aWRlZCBtYXAuIEVhY2gga2V5IGFuZCB2YWx1ZSBpbiB0aGUgbWFwIGlzIHBlcmNlbnQtZW5jb2RlZAogICAqIGFuZCBqb2luZWQgdXNpbmcgZXF1YWwgYW5kIGFtcGVyc2FuZCBjaGFyYWN0ZXJzLgogICAqIEEgdmFsdWUgaW4gdGhlIG1hcCBtdXN0IGJlIGVpdGhlciBhIHN0cmluZywgb3IgYW4gW0l0ZXJhYmxlXSBvZiBzdHJpbmdzLAogICAqIHdoZXJlIHRoZSBsYXR0ZXIgY29ycmVzcG9uZHMgdG8gbXVsdGlwbGUgdmFsdWVzIGZvciB0aGUgc2FtZSBrZXkuCiAgICoKICAgKiBUaGUgcGVyY2VudC1lbmNvZGluZyBvZiB0aGUga2V5cyBhbmQgdmFsdWVzIGVuY29kZXMgYWxsIGNoYXJhY3RlcnMKICAgKiBleGNlcHQgZm9yIHRoZSB1bnJlc2VydmVkIGNoYXJhY3RlcnMsIGFuZCByZXBsYWNlcyBzcGFjZXMgd2l0aCBgK2AuCiAgICogSWYgYHF1ZXJ5YCBpcyB0aGUgZW1wdHkgc3RyaW5nLCBpdCBpcyBlcXVpdmFsZW50IHRvIG9taXR0aW5nIGl0LgogICAqIFRvIGhhdmUgYW4gYWN0dWFsIGVtcHR5IHF1ZXJ5IHBhcnQsCiAgICogdXNlIGFuIGVtcHR5IG1hcCBmb3IgYHF1ZXJ5UGFyYW1ldGVyc2AuCiAgICoKICAgKiBJZiBib3RoIGBxdWVyeWAgYW5kIGBxdWVyeVBhcmFtZXRlcnNgIGFyZSBvbWl0dGVkIG9yIGBudWxsYCwKICAgKiB0aGUgVVJJIGhhcyBubyBxdWVyeSBwYXJ0LgogICAqCiAgICogVGhlIGZyYWdtZW50IGNvbXBvbmVudCBpcyBzZXQgdGhyb3VnaCBbZnJhZ21lbnRdLgogICAqIEl0IHNob3VsZCBiZSBhIHZhbGlkIFVSSSBmcmFnbWVudCwgYnV0IGludmFsaWQgY2hhcmFjdGVycyBvdGhlciB0aGFuCiAgICogZ2VuZXJhbCBkZWxpbWl0ZXJzLCBhcmUgZXNjYXBlZCBpZiBuZWNlc3NhcnkuCiAgICogSWYgYGZyYWdtZW50YCBpcyBvbWl0dGVkIG9yIGBudWxsYCwgdGhlIFVSSSBoYXMgbm8gZnJhZ21lbnQgcGFydC4KICAgKi8KICBmYWN0b3J5IFVyaSgKICAgICAge1N0cmluZyBzY2hlbWUsCiAgICAgIFN0cmluZyB1c2VySW5mbywKICAgICAgU3RyaW5nIGhvc3QsCiAgICAgIGludCBwb3J0LAogICAgICBTdHJpbmcgcGF0aCwKICAgICAgSXRlcmFibGU8U3RyaW5nPiBwYXRoU2VnbWVudHMsCiAgICAgIFN0cmluZyBxdWVyeSwKICAgICAgTWFwPFN0cmluZywgZHluYW1pYyAvKlN0cmluZ3xJdGVyYWJsZTxTdHJpbmc+Ki8gPiBxdWVyeVBhcmFtZXRlcnMsCiAgICAgIFN0cmluZyBmcmFnbWVudH0pID0gX1VyaTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBgaHR0cGAgVVJJIGZyb20gYXV0aG9yaXR5LCBwYXRoIGFuZCBxdWVyeS4KICAgKgogICAqIEV4YW1wbGVzOgogICAqCiAgICogYGBgCiAgICogLy8gaHR0cDovL2V4YW1wbGUub3JnL3BhdGg/cT1kYXJ0LgogICAqIG5ldyBVcmkuaHR0cCgiZXhhbXBsZS5vcmciLCAiL3BhdGgiLCB7ICJxIiA6ICJkYXJ0IiB9KTsKICAgKgogICAqIC8vIGh0dHA6Ly91c2VyOnBhc3NAbG9jYWxob3N0OjgwODAKICAgKiBuZXcgVXJpLmh0dHAoInVzZXI6cGFzc0Bsb2NhbGhvc3Q6ODA4MCIsICIiKTsKICAgKgogICAqIC8vIGh0dHA6Ly9leGFtcGxlLm9yZy9hJTIwYgogICAqIG5ldyBVcmkuaHR0cCgiZXhhbXBsZS5vcmciLCAiYSBiIik7CiAgICoKICAgKiAvLyBodHRwOi8vZXhhbXBsZS5vcmcvYSUyNTJGCiAgICogbmV3IFVyaS5odHRwKCJleGFtcGxlLm9yZyIsICIvYSUyRiIpOwogICAqIGBgYAogICAqCiAgICogVGhlIGBzY2hlbWVgIGlzIGFsd2F5cyBzZXQgdG8gYGh0dHBgLgogICAqCiAgICogVGhlIGB1c2VySW5mb2AsIGBob3N0YCBhbmQgYHBvcnRgIGNvbXBvbmVudHMgYXJlIHNldCBmcm9tIHRoZQogICAqIFthdXRob3JpdHldIGFyZ3VtZW50LiBJZiBgYXV0aG9yaXR5YCBpcyBgbnVsbGAgb3IgZW1wdHksCiAgICogdGhlIGNyZWF0ZWQgYFVyaWAgaGFzIG5vIGF1dGhvcml0eSwgYW5kIGlzbid0IGRpcmVjdGx5IHVzYWJsZQogICAqIGFzIGFuIEhUVFAgVVJMLCB3aGljaCBtdXN0IGhhdmUgYSBub24tZW1wdHkgaG9zdC4KICAgKgogICAqIFRoZSBgcGF0aGAgY29tcG9uZW50IGlzIHNldCBmcm9tIHRoZSBbdW5lbmNvZGVkUGF0aF0KICAgKiBhcmd1bWVudC4gVGhlIHBhdGggcGFzc2VkIG11c3Qgbm90IGJlIGVuY29kZWQgYXMgdGhpcyBjb25zdHJ1Y3RvcgogICAqIGVuY29kZXMgdGhlIHBhdGguCiAgICoKICAgKiBUaGUgYHF1ZXJ5YCBjb21wb25lbnQgaXMgc2V0IGZyb20gdGhlIG9wdGlvbmFsIFtxdWVyeVBhcmFtZXRlcnNdCiAgICogYXJndW1lbnQuCiAgICovCiAgZmFjdG9yeSBVcmkuaHR0cChTdHJpbmcgYXV0aG9yaXR5LCBTdHJpbmcgdW5lbmNvZGVkUGF0aCwKICAgICAgW01hcDxTdHJpbmcsIFN0cmluZz4gcXVlcnlQYXJhbWV0ZXJzXSkgPSBfVXJpLmh0dHA7CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgYGh0dHBzYCBVUkkgZnJvbSBhdXRob3JpdHksIHBhdGggYW5kIHF1ZXJ5LgogICAqCiAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB0aGUgc2FtZSBhcyBbVXJpLmh0dHBdIGV4Y2VwdCBmb3IgdGhlIHNjaGVtZQogICAqIHdoaWNoIGlzIHNldCB0byBgaHR0cHNgLgogICAqLwogIGZhY3RvcnkgVXJpLmh0dHBzKFN0cmluZyBhdXRob3JpdHksIFN0cmluZyB1bmVuY29kZWRQYXRoLAogICAgICBbTWFwPFN0cmluZywgU3RyaW5nPiBxdWVyeVBhcmFtZXRlcnNdKSA9IF9VcmkuaHR0cHM7CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgZmlsZSBVUkkgZnJvbSBhbiBhYnNvbHV0ZSBvciByZWxhdGl2ZSBmaWxlIHBhdGguCiAgICoKICAgKiBUaGUgZmlsZSBwYXRoIGlzIHBhc3NlZCBpbiBbcGF0aF0uCiAgICoKICAgKiBUaGlzIHBhdGggaXMgaW50ZXJwcmV0ZWQgdXNpbmcgZWl0aGVyIFdpbmRvd3Mgb3Igbm9uLVdpbmRvd3MKICAgKiBzZW1hbnRpY3MuCiAgICoKICAgKiBXaXRoIG5vbi1XaW5kb3dzIHNlbWFudGljcyB0aGUgc2xhc2ggKGAvYCkgaXMgdXNlZCB0byBzZXBhcmF0ZQogICAqIHBhdGggc2VnbWVudHMgaW4gdGhlIGlucHV0IFtwYXRoXS4KICAgKgogICAqIFdpdGggV2luZG93cyBzZW1hbnRpY3MsIGJhY2tzbGFzaCAoYFxgKSBhbmQgZm9yd2FyZC1zbGFzaCAoYC9gKQogICAqIGFyZSB1c2VkIHRvIHNlcGFyYXRlIHBhdGggc2VnbWVudHMgaW4gdGhlIGlucHV0IFtwYXRoXSwKICAgKiBleGNlcHQgaWYgdGhlIHBhdGggc3RhcnRzIHdpdGggYFxcP1xgIGluIHdoaWNoIGNhc2UKICAgKiBvbmx5IGJhY2tzbGFzaCAoYFxgKSBzZXBhcmF0ZXMgcGF0aCBzZWdtZW50cyBpbiBbcGF0aF0uCiAgICoKICAgKiBJZiB0aGUgcGF0aCBzdGFydHMgd2l0aCBhIHBhdGggc2VwYXJhdG9yLCBhbiBhYnNvbHV0ZSBVUkkgKHdpdGggdGhlCiAgICogYGZpbGVgIHNjaGVtZSBhbmQgYW4gZW1wdHkgYXV0aG9yaXR5KSBpcyBjcmVhdGVkLgogICAqIE90aGVyd2lzZSBhIHJlbGF0aXZlIFVSSSByZWZlcmVuY2Ugd2l0aCBubyBzY2hlbWUgb3IgYXV0aG9yaXR5IGlzIGNyZWF0ZWQuCiAgICogT25lIGV4Y2VwdGlvbiBmcm9tIHRoaXMgcnVsZSBpcyB0aGF0IHdoZW4gV2luZG93cyBzZW1hbnRpY3MgaXMgdXNlZAogICAqIGFuZCB0aGUgcGF0aCBzdGFydHMgd2l0aCBhIGRyaXZlIGxldHRlciBmb2xsb3dlZCBieSBhIGNvbG9uICgiOiIpIGFuZCBhCiAgICogcGF0aCBzZXBhcmF0b3IsIHRoZW4gYW4gYWJzb2x1dGUgVVJJIGlzIGNyZWF0ZWQuCiAgICoKICAgKiBUaGUgZGVmYXVsdCBmb3Igd2hldGhlciB0byB1c2UgV2luZG93cyBvciBub24tV2luZG93cyBzZW1hbnRpY3MKICAgKiBkZXRlcm1pbmVkIGZyb20gdGhlIHBsYXRmb3JtIERhcnQgaXMgcnVubmluZyBvbi4gV2hlbiBydW5uaW5nIGluCiAgICogdGhlIHN0YW5kYWxvbmUgVk0sIHRoaXMgaXMgZGV0ZWN0ZWQgYnkgdGhlIFZNIGJhc2VkIG9uIHRoZQogICAqIG9wZXJhdGluZyBzeXN0ZW0uIFdoZW4gcnVubmluZyBpbiBhIGJyb3dzZXIgbm9uLVdpbmRvd3Mgc2VtYW50aWNzCiAgICogaXMgYWx3YXlzIHVzZWQuCiAgICoKICAgKiBUbyBvdmVycmlkZSB0aGUgYXV0b21hdGljIGRldGVjdGlvbiBvZiB3aGljaCBzZW1hbnRpY3MgdG8gdXNlIHBhc3MKICAgKiBhIHZhbHVlIGZvciBbd2luZG93c10uIFBhc3NpbmcgYHRydWVgIHdpbGwgdXNlIFdpbmRvd3MKICAgKiBzZW1hbnRpY3MgYW5kIHBhc3NpbmcgYGZhbHNlYCB3aWxsIHVzZSBub24tV2luZG93cyBzZW1hbnRpY3MuCiAgICoKICAgKiBFeGFtcGxlcyB1c2luZyBub24tV2luZG93cyBzZW1hbnRpY3M6CiAgICoKICAgKiBgYGAKICAgKiAvLyB4eHgveXl5CiAgICogbmV3IFVyaS5maWxlKCJ4eHgveXl5Iiwgd2luZG93czogZmFsc2UpOwogICAqCiAgICogLy8geHh4L3l5eS8KICAgKiBuZXcgVXJpLmZpbGUoInh4eC95eXkvIiwgd2luZG93czogZmFsc2UpOwogICAqCiAgICogLy8gZmlsZTovLy94eHgveXl5CiAgICogbmV3IFVyaS5maWxlKCIveHh4L3l5eSIsIHdpbmRvd3M6IGZhbHNlKTsKICAgKgogICAqIC8vIGZpbGU6Ly8veHh4L3l5eS8KICAgKiBuZXcgVXJpLmZpbGUoIi94eHgveXl5LyIsIHdpbmRvd3M6IGZhbHNlKTsKICAgKgogICAqIC8vIEMlM0EKICAgKiBuZXcgVXJpLmZpbGUoIkM6Iiwgd2luZG93czogZmFsc2UpOwogICAqIGBgYAogICAqCiAgICogRXhhbXBsZXMgdXNpbmcgV2luZG93cyBzZW1hbnRpY3M6CiAgICoKICAgKiBgYGAKICAgKiAvLyB4eHgveXl5CiAgICogbmV3IFVyaS5maWxlKHIieHh4XHl5eSIsIHdpbmRvd3M6IHRydWUpOwogICAqCiAgICogLy8geHh4L3l5eS8KICAgKiBuZXcgVXJpLmZpbGUociJ4eHhceXl5XCIsIHdpbmRvd3M6IHRydWUpOwogICAqCiAgICogZmlsZTovLy94eHgveXl5CiAgICogbmV3IFVyaS5maWxlKHIiXHh4eFx5eXkiLCB3aW5kb3dzOiB0cnVlKTsKICAgKgogICAqIGZpbGU6Ly8veHh4L3l5eS8KICAgKiBuZXcgVXJpLmZpbGUociJceHh4XHl5eS8iLCB3aW5kb3dzOiB0cnVlKTsKICAgKgogICAqIC8vIGZpbGU6Ly8vQzoveHh4L3l5eQogICAqIG5ldyBVcmkuZmlsZShyIkM6XHh4eFx5eXkiLCB3aW5kb3dzOiB0cnVlKTsKICAgKgogICAqIC8vIFRoaXMgdGhyb3dzIGFuIGVycm9yLiBBIHBhdGggd2l0aCBhIGRyaXZlIGxldHRlciwgYnV0IG5vIGZvbGxvd2luZwogICAqIC8vIHBhdGgsIGlzIG5vdCBhbGxvd2VkLgogICAqIG5ldyBVcmkuZmlsZShyIkM6Iiwgd2luZG93czogdHJ1ZSk7CiAgICoKICAgKiAvLyBUaGlzIHRocm93cyBhbiBlcnJvci4gQSBwYXRoIHdpdGggYSBkcml2ZSBsZXR0ZXIgaXMgbm90IGFic29sdXRlLgogICAqIG5ldyBVcmkuZmlsZShyIkM6eHh4XHl5eSIsIHdpbmRvd3M6IHRydWUpOwogICAqCiAgICogLy8gZmlsZTovL3NlcnZlci9zaGFyZS9maWxlCiAgICogbmV3IFVyaS5maWxlKHIiXFxzZXJ2ZXJcc2hhcmVcZmlsZSIsIHdpbmRvd3M6IHRydWUpOwogICAqIGBgYAogICAqCiAgICogSWYgdGhlIHBhdGggcGFzc2VkIGlzIG5vdCBhIHZhbGlkIGZpbGUgcGF0aCwgYW4gZXJyb3IgaXMgdGhyb3duLgogICAqLwogIGZhY3RvcnkgVXJpLmZpbGUoU3RyaW5nIHBhdGgsIHtib29sIHdpbmRvd3N9KSA9IF9VcmkuZmlsZTsKCiAgLyoqCiAgICogTGlrZSBbVXJpLmZpbGVdIGV4Y2VwdCB0aGF0IGEgbm9uLWVtcHR5IFVSSSBwYXRoIGVuZHMgaW4gYSBzbGFzaC4KICAgKgogICAqIElmIFtwYXRoXSBpcyBub3QgZW1wdHksIGFuZCBpdCBkb2Vzbid0IGVuZCBpbiBhIGRpcmVjdG9yeSBzZXBhcmF0b3IsCiAgICogdGhlbiBhIHNsYXNoIGlzIGFkZGVkIHRvIHRoZSByZXR1cm5lZCBVUkkncyBwYXRoLgogICAqIEluIGFsbCBvdGhlciBjYXNlcywgdGhlIHJlc3VsdCBpcyB0aGUgc2FtZSBhcyByZXR1cm5lZCBieSBgVXJpLmZpbGVgLgogICAqLwogIGZhY3RvcnkgVXJpLmRpcmVjdG9yeShTdHJpbmcgcGF0aCwge2Jvb2wgd2luZG93c30pID0gX1VyaS5kaXJlY3Rvcnk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBgZGF0YTpgIFVSSSBjb250YWluaW5nIHRoZSBbY29udGVudF0gc3RyaW5nLgogICAqCiAgICogQ29udmVydHMgdGhlIGNvbnRlbnQgdG8gYSBieXRlcyB1c2luZyBbZW5jb2RpbmddIG9yIHRoZSBjaGFyc2V0IHNwZWNpZmllZAogICAqIGluIFtwYXJhbWV0ZXJzXSAoZGVmYXVsdGluZyB0byBVUy1BU0NJSSBpZiBub3Qgc3BlY2lmaWVkIG9yIHVucmVjb2duaXplZCksCiAgICogdGhlbiBlbmNvZGVzIHRoZSBieXRlcyBpbnRvIHRoZSByZXN1bHRpbmcgZGF0YSBVUkkuCiAgICoKICAgKiBEZWZhdWx0cyB0byBlbmNvZGluZyB1c2luZyBwZXJjZW50LWVuY29kaW5nIChhbnkgbm9uLUFTQ0lJIG9yIG5vbi1VUkktdmFsaWQKICAgKiBieXRlcyBpcyByZXBsYWNlZCBieSBhIHBlcmNlbnQgZW5jb2RpbmcpLiBJZiBbYmFzZTY0XSBpcyB0cnVlLCB0aGUgYnl0ZXMKICAgKiBhcmUgaW5zdGVhZCBlbmNvZGVkIHVzaW5nIFtiYXNlNjRdLgogICAqCiAgICogSWYgW2VuY29kaW5nXSBpcyBub3QgcHJvdmlkZWQgYW5kIFtwYXJhbWV0ZXJzXSBoYXMgYSBgY2hhcnNldGAgZW50cnksCiAgICogdGhhdCBuYW1lIGlzIGxvb2tlZCB1cCB1c2luZyBbRW5jb2RpbmcuZ2V0QnlOYW1lXSwKICAgKiBhbmQgaWYgdGhlIGxvb2t1cCByZXR1cm5zIGFuIGVuY29kaW5nLCB0aGF0IGVuY29kaW5nIGlzIHVzZWQgdG8gY29udmVydAogICAqIFtjb250ZW50XSB0byBieXRlcy4KICAgKiBJZiBwcm92aWRpbmcgYm90aCBhbiBbZW5jb2RpbmddIGFuZCBhIGNoYXJzZXQgaW4gW3BhcmFtZXRlcnNdLCB0aGV5IHNob3VsZAogICAqIGFncmVlLCBvdGhlcndpc2UgZGVjb2Rpbmcgd29uJ3QgYmUgYWJsZSB0byB1c2UgdGhlIGNoYXJzZXQgcGFyYW1ldGVyCiAgICogdG8gZGV0ZXJtaW5lIHRoZSBlbmNvZGluZy4KICAgKgogICAqIElmIFttaW1lVHlwZV0gYW5kL29yIFtwYXJhbWV0ZXJzXSBhcmUgc3VwcGxpZWQsIHRoZXkgYXJlIGFkZGVkIHRvIHRoZQogICAqIGNyZWF0ZWQgVVJJLiBJZiBhbnkgb2YgdGhlc2UgY29udGFpbiBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBhbGxvd2VkCiAgICogaW4gdGhlIGRhdGEgVVJJLCB0aGUgY2hhcmFjdGVyIGlzIHBlcmNlbnQtZXNjYXBlZC4gSWYgdGhlIGNoYXJhY3RlciBpcwogICAqIG5vbi1BU0NJSSwgaXQgaXMgZmlyc3QgVVRGLTggZW5jb2RlZCBhbmQgdGhlbiB0aGUgYnl0ZXMgYXJlIHBlcmNlbnQKICAgKiBlbmNvZGVkLiBBbiBvbWl0dGVkIFttaW1lVHlwZV0gaW4gYSBkYXRhIFVSSSBtZWFucyBgdGV4dC9wbGFpbmAsIGp1c3QKICAgKiBhcyBhbiBvbWl0dGVkIGBjaGFyc2V0YCBwYXJhbWV0ZXIgZGVmYXVsdHMgdG8gbWVhbmluZyBgVVMtQVNDSUlgLgogICAqCiAgICogVG8gcmVhZCB0aGUgY29udGVudCBiYWNrLCB1c2UgW1VyaURhdGEuY29udGVudEFzU3RyaW5nXS4KICAgKi8KICBmYWN0b3J5IFVyaS5kYXRhRnJvbVN0cmluZyhTdHJpbmcgY29udGVudCwKICAgICAge1N0cmluZyBtaW1lVHlwZSwKICAgICAgRW5jb2RpbmcgZW5jb2RpbmcsCiAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywKICAgICAgYm9vbCBiYXNlNjQgPSBmYWxzZX0pIHsKICAgIFVyaURhdGEgZGF0YSA9IFVyaURhdGEuZnJvbVN0cmluZyhjb250ZW50LAogICAgICAgIG1pbWVUeXBlOiBtaW1lVHlwZSwKICAgICAgICBlbmNvZGluZzogZW5jb2RpbmcsCiAgICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycywKICAgICAgICBiYXNlNjQ6IGJhc2U2NCk7CiAgICByZXR1cm4gZGF0YS51cmk7CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGEgYGRhdGE6YCBVUkkgY29udGFpbmluZyBhbiBlbmNvZGluZyBvZiBbYnl0ZXNdLgogICAqCiAgICogRGVmYXVsdHMgdG8gQmFzZTY0IGVuY29kaW5nIHRoZSBieXRlcywgYnV0IGlmIFtwZXJjZW50RW5jb2RlZF0KICAgKiBpcyBgdHJ1ZWAsIHRoZSBieXRlcyB3aWxsIGluc3RlYWQgYmUgcGVyY2VudCBlbmNvZGVkIChhbnkgbm9uLUFTQ0lJCiAgICogb3Igbm9uLXZhbGlkLUFTQ0lJLWNoYXJhY3RlciBieXRlIGlzIHJlcGxhY2VkIGJ5IGEgcGVyY2VudCBlbmNvZGluZykuCiAgICoKICAgKiBUbyByZWFkIHRoZSBieXRlcyBiYWNrLCB1c2UgW1VyaURhdGEuY29udGVudEFzQnl0ZXNdLgogICAqCiAgICogSXQgZGVmYXVsdHMgdG8gaGF2aW5nIHRoZSBtaW1lLXR5cGUgYGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbWAuCiAgICogVGhlIFttaW1lVHlwZV0gYW5kIFtwYXJhbWV0ZXJzXSBhcmUgYWRkZWQgdG8gdGhlIGNyZWF0ZWQgVVJJLgogICAqIElmIGFueSBvZiB0aGVzZSBjb250YWluIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IGFsbG93ZWQKICAgKiBpbiB0aGUgZGF0YSBVUkksIHRoZSBjaGFyYWN0ZXIgaXMgcGVyY2VudC1lc2NhcGVkLiBJZiB0aGUgY2hhcmFjdGVyIGlzCiAgICogbm9uLUFTQ0lJLCBpdCBpcyBmaXJzdCBVVEYtOCBlbmNvZGVkIGFuZCB0aGVuIHRoZSBieXRlcyBhcmUgcGVyY2VudAogICAqIGVuY29kZWQuCiAgICovCiAgZmFjdG9yeSBVcmkuZGF0YUZyb21CeXRlcyhMaXN0PGludD4gYnl0ZXMsCiAgICAgIHttaW1lVHlwZSA9ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMsCiAgICAgIHBlcmNlbnRFbmNvZGVkID0gZmFsc2V9KSB7CiAgICBVcmlEYXRhIGRhdGEgPSBVcmlEYXRhLmZyb21CeXRlcyhieXRlcywKICAgICAgICBtaW1lVHlwZTogbWltZVR5cGUsCiAgICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycywKICAgICAgICBwZXJjZW50RW5jb2RlZDogcGVyY2VudEVuY29kZWQpOwogICAgcmV0dXJuIGRhdGEudXJpOwogIH0KCiAgLyoqCiAgICogVGhlIHNjaGVtZSBjb21wb25lbnQgb2YgdGhlIFVSSS4KICAgKgogICAqIFJldHVybnMgdGhlIGVtcHR5IHN0cmluZyBpZiB0aGVyZSBpcyBubyBzY2hlbWUgY29tcG9uZW50LgogICAqCiAgICogQSBVUkkgc2NoZW1lIGlzIGNhc2UgaW5zZW5zaXRpdmUuCiAgICogVGhlIHJldHVybmVkIHNjaGVtZSBpcyBjYW5vbmljYWxpemVkIHRvIGxvd2VyY2FzZSBsZXR0ZXJzLgogICAqLwogIFN0cmluZyBnZXQgc2NoZW1lOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBhdXRob3JpdHkgY29tcG9uZW50LgogICAqCiAgICogVGhlIGF1dGhvcml0eSBpcyBmb3JtYXR0ZWQgZnJvbSB0aGUgW3VzZXJJbmZvXSwgW2hvc3RdIGFuZCBbcG9ydF0KICAgKiBwYXJ0cy4KICAgKgogICAqIFJldHVybnMgdGhlIGVtcHR5IHN0cmluZyBpZiB0aGVyZSBpcyBubyBhdXRob3JpdHkgY29tcG9uZW50LgogICAqLwogIFN0cmluZyBnZXQgYXV0aG9yaXR5OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSB1c2VyIGluZm8gcGFydCBvZiB0aGUgYXV0aG9yaXR5IGNvbXBvbmVudC4KICAgKgogICAqIFJldHVybnMgdGhlIGVtcHR5IHN0cmluZyBpZiB0aGVyZSBpcyBubyB1c2VyIGluZm8gaW4gdGhlCiAgICogYXV0aG9yaXR5IGNvbXBvbmVudC4KICAgKi8KICBTdHJpbmcgZ2V0IHVzZXJJbmZvOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBob3N0IHBhcnQgb2YgdGhlIGF1dGhvcml0eSBjb21wb25lbnQuCiAgICoKICAgKiBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgaXMgbm8gYXV0aG9yaXR5IGNvbXBvbmVudCBhbmQKICAgKiBoZW5jZSBubyBob3N0LgogICAqCiAgICogSWYgdGhlIGhvc3QgaXMgYW4gSVAgdmVyc2lvbiA2IGFkZHJlc3MsIHRoZSBzdXJyb3VuZGluZyBgW2AgYW5kIGBdYCBpcwogICAqIHJlbW92ZWQuCiAgICoKICAgKiBUaGUgaG9zdCBzdHJpbmcgaXMgY2FzZS1pbnNlbnNpdGl2ZS4KICAgKiBUaGUgcmV0dXJuZWQgaG9zdCBuYW1lIGlzIGNhbm9uaWNhbGl6ZWQgdG8gbG93ZXItY2FzZQogICAqIHdpdGggdXBwZXItY2FzZSBwZXJjZW50LWVzY2FwZXMuCiAgICovCiAgU3RyaW5nIGdldCBob3N0OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBwb3J0IHBhcnQgb2YgdGhlIGF1dGhvcml0eSBjb21wb25lbnQuCiAgICoKICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHBvcnQgaWYgdGhlcmUgaXMgbm8gcG9ydCBudW1iZXIgaW4gdGhlIGF1dGhvcml0eQogICAqIGNvbXBvbmVudC4gVGhhdCdzIDgwIGZvciBodHRwLCA0NDMgZm9yIGh0dHBzLCBhbmQgMCBmb3IgZXZlcnl0aGluZyBlbHNlLgogICAqLwogIGludCBnZXQgcG9ydDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcGF0aCBjb21wb25lbnQuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgcGF0aCBpcyBlbmNvZGVkLiBUbyBnZXQgZGlyZWN0IGFjY2VzcyB0byB0aGUgZGVjb2RlZAogICAqIHBhdGggdXNlIFtwYXRoU2VnbWVudHNdLgogICAqCiAgICogUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZXJlIGlzIG5vIHBhdGggY29tcG9uZW50LgogICAqLwogIFN0cmluZyBnZXQgcGF0aDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcXVlcnkgY29tcG9uZW50LiBUaGUgcmV0dXJuZWQgcXVlcnkgaXMgZW5jb2RlZC4gVG8gZ2V0CiAgICogZGlyZWN0IGFjY2VzcyB0byB0aGUgZGVjb2RlZCBxdWVyeSB1c2UgW3F1ZXJ5UGFyYW1ldGVyc10uCiAgICoKICAgKiBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgaXMgbm8gcXVlcnkgY29tcG9uZW50LgogICAqLwogIFN0cmluZyBnZXQgcXVlcnk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGZyYWdtZW50IGlkZW50aWZpZXIgY29tcG9uZW50LgogICAqCiAgICogUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZXJlIGlzIG5vIGZyYWdtZW50IGlkZW50aWZpZXIKICAgKiBjb21wb25lbnQuCiAgICovCiAgU3RyaW5nIGdldCBmcmFnbWVudDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgVVJJIHBhdGggc3BsaXQgaW50byBpdHMgc2VnbWVudHMuIEVhY2ggb2YgdGhlIHNlZ21lbnRzIGluIHRoZQogICAqIHJldHVybmVkIGxpc3QgaGF2ZSBiZWVuIGRlY29kZWQuIElmIHRoZSBwYXRoIGlzIGVtcHR5IHRoZSBlbXB0eSBsaXN0IHdpbGwKICAgKiBiZSByZXR1cm5lZC4gQSBsZWFkaW5nIHNsYXNoIGAvYCBkb2VzIG5vdCBhZmZlY3QgdGhlIHNlZ21lbnRzIHJldHVybmVkLgogICAqCiAgICogVGhlIHJldHVybmVkIGxpc3QgaXMgdW5tb2RpZmlhYmxlIGFuZCB3aWxsIHRocm93IFtVbnN1cHBvcnRlZEVycm9yXSBvbiBhbnkKICAgKiBjYWxscyB0aGF0IHdvdWxkIG11dGF0ZSBpdC4KICAgKi8KICBMaXN0PFN0cmluZz4gZ2V0IHBhdGhTZWdtZW50czsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgVVJJIHF1ZXJ5IHNwbGl0IGludG8gYSBtYXAgYWNjb3JkaW5nIHRvIHRoZSBydWxlcwogICAqIHNwZWNpZmllZCBmb3IgRk9STSBwb3N0IGluIHRoZSBbSFRNTCA0LjAxIHNwZWNpZmljYXRpb24gc2VjdGlvbgogICAqIDE3LjEzLjRdKGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvaW50ZXJhY3QvZm9ybXMuaHRtbCNoLTE3LjEzLjQgIkhUTUwgNC4wMSBzZWN0aW9uIDE3LjEzLjQiKS4KICAgKiBFYWNoIGtleSBhbmQgdmFsdWUgaW4gdGhlIHJldHVybmVkIG1hcCBoYXMgYmVlbiBkZWNvZGVkLgogICAqIElmIHRoZXJlIGlzIG5vIHF1ZXJ5IHRoZSBlbXB0eSBtYXAgaXMgcmV0dXJuZWQuCiAgICoKICAgKiBLZXlzIGluIHRoZSBxdWVyeSBzdHJpbmcgdGhhdCBoYXZlIG5vIHZhbHVlIGFyZSBtYXBwZWQgdG8gdGhlCiAgICogZW1wdHkgc3RyaW5nLgogICAqIElmIGEga2V5IG9jY3VycyBtb3JlIHRoYW4gb25jZSBpbiB0aGUgcXVlcnkgc3RyaW5nLCBpdCBpcyBtYXBwZWQgdG8KICAgKiBhbiBhcmJpdHJhcnkgY2hvaWNlIG9mIHBvc3NpYmxlIHZhbHVlLgogICAqIFRoZSBbcXVlcnlQYXJhbWV0ZXJzQWxsXSBnZXR0ZXIgY2FuIHByb3ZpZGUgYSBtYXAKICAgKiB0aGF0IG1hcHMga2V5cyB0byBhbGwgb2YgdGhlaXIgdmFsdWVzLgogICAqCiAgICogVGhlIHJldHVybmVkIG1hcCBpcyB1bm1vZGlmaWFibGUuCiAgICovCiAgTWFwPFN0cmluZywgU3RyaW5nPiBnZXQgcXVlcnlQYXJhbWV0ZXJzOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBVUkkgcXVlcnkgc3BsaXQgaW50byBhIG1hcCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzCiAgICogc3BlY2lmaWVkIGZvciBGT1JNIHBvc3QgaW4gdGhlIFtIVE1MIDQuMDEgc3BlY2lmaWNhdGlvbiBzZWN0aW9uCiAgICogMTcuMTMuNF0oaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9pbnRlcmFjdC9mb3Jtcy5odG1sI2gtMTcuMTMuNCAiSFRNTCA0LjAxIHNlY3Rpb24gMTcuMTMuNCIpLgogICAqIEVhY2gga2V5IGFuZCB2YWx1ZSBpbiB0aGUgcmV0dXJuZWQgbWFwIGhhcyBiZWVuIGRlY29kZWQuIElmIHRoZXJlIGlzIG5vCiAgICogcXVlcnkgdGhlIGVtcHR5IG1hcCBpcyByZXR1cm5lZC4KICAgKgogICAqIEtleXMgYXJlIG1hcHBlZCB0byBsaXN0cyBvZiB0aGVpciB2YWx1ZXMuIElmIGEga2V5IG9jY3VycyBvbmx5IG9uY2UsCiAgICogaXRzIHZhbHVlIGlzIGEgc2luZ2xldG9uIGxpc3QuIElmIGEga2V5IG9jY3VycyB3aXRoIG5vIHZhbHVlLCB0aGUKICAgKiBlbXB0eSBzdHJpbmcgaXMgdXNlZCBhcyB0aGUgdmFsdWUgZm9yIHRoYXQgb2NjdXJyZW5jZS4KICAgKgogICAqIFRoZSByZXR1cm5lZCBtYXAgYW5kIHRoZSBsaXN0cyBpdCBjb250YWlucyBhcmUgdW5tb2RpZmlhYmxlLgogICAqLwogIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZ2V0IHF1ZXJ5UGFyYW1ldGVyc0FsbDsKCiAgLyoqCiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBVUkkgaXMgYWJzb2x1dGUuCiAgICoKICAgKiBBIFVSSSBpcyBhbiBhYnNvbHV0ZSBVUkkgaW4gdGhlIHNlbnNlIG9mIFJGQyAzOTg2IGlmIGl0IGhhcyBhIHNjaGVtZQogICAqIGFuZCBubyBmcmFnbWVudC4KICAgKi8KICBib29sIGdldCBpc0Fic29sdXRlOwoKICAvKioKICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIFVSSSBoYXMgYSBbc2NoZW1lXSBjb21wb25lbnQuCiAgICovCiAgYm9vbCBnZXQgaGFzU2NoZW1lID0+IHNjaGVtZS5pc05vdEVtcHR5OwoKICAvKioKICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIFVSSSBoYXMgYW4gW2F1dGhvcml0eV0gY29tcG9uZW50LgogICAqLwogIGJvb2wgZ2V0IGhhc0F1dGhvcml0eTsKCiAgLyoqCiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBVUkkgaGFzIGFuIGV4cGxpY2l0IHBvcnQuCiAgICoKICAgKiBJZiB0aGUgcG9ydCBudW1iZXIgaXMgdGhlIGRlZmF1bHQgcG9ydCBudW1iZXIKICAgKiAoemVybyBmb3IgdW5yZWNvZ25pemVkIHNjaGVtZXMsIHdpdGggaHR0cCAoODApIGFuZCBodHRwcyAoNDQzKSBiZWluZwogICAqIHJlY29nbml6ZWQpLAogICAqIHRoZW4gdGhlIHBvcnQgaXMgbWFkZSBpbXBsaWNpdCBhbmQgb21pdHRlZCBmcm9tIHRoZSBVUkkuCiAgICovCiAgYm9vbCBnZXQgaGFzUG9ydDsKCiAgLyoqCiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBVUkkgaGFzIGEgcXVlcnkgcGFydC4KICAgKi8KICBib29sIGdldCBoYXNRdWVyeTsKCiAgLyoqCiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBVUkkgaGFzIGEgZnJhZ21lbnQgcGFydC4KICAgKi8KICBib29sIGdldCBoYXNGcmFnbWVudDsKCiAgLyoqCiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBVUkkgaGFzIGFuIGVtcHR5IHBhdGguCiAgICovCiAgYm9vbCBnZXQgaGFzRW1wdHlQYXRoOwoKICAvKioKICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIFVSSSBoYXMgYW4gYWJzb2x1dGUgcGF0aCAoc3RhcnRpbmcgd2l0aCAnLycpLgogICAqLwogIGJvb2wgZ2V0IGhhc0Fic29sdXRlUGF0aDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgb3JpZ2luIG9mIHRoZSBVUkkgaW4gdGhlIGZvcm0gc2NoZW1lOi8vaG9zdDpwb3J0IGZvciB0aGUKICAgKiBzY2hlbWVzIGh0dHAgYW5kIGh0dHBzLgogICAqCiAgICogSXQgaXMgYW4gZXJyb3IgaWYgdGhlIHNjaGVtZSBpcyBub3QgImh0dHAiIG9yICJodHRwcyIsIG9yIGlmIHRoZSBob3N0IG5hbWUKICAgKiBpcyBtaXNzaW5nIG9yIGVtcHR5LgogICAqCiAgICogU2VlOiBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1dELWh0bWw1LTIwMTEwNDA1L29yaWdpbi0wLmh0bWwjb3JpZ2luCiAgICovCiAgU3RyaW5nIGdldCBvcmlnaW47CgogIC8vLyBXaGV0aGVyIHRoZSBzY2hlbWUgb2YgdGhpcyBbVXJpXSBpcyBbc2NoZW1lXS4KICAvLy8KICAvLy8gVGhlIFtzY2hlbWVdIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgb25lIHJldHVybmVkIGJ5IFtVcmkuc2NoZW1lXSwKICAvLy8gYnV0IGRvZXNuJ3QgaGF2ZSB0byBiZSBjYXNlLW5vcm1hbGl6ZWQgdG8gbG93ZXItY2FzZSBjaGFyYWN0ZXJzLgogIC8vLwogIC8vLyBFeGFtcGxlOgogIC8vLyBgYGBkYXJ0CiAgLy8vIHZhciB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS8iKTsKICAvLy8gcHJpbnQodXJpLmlzU2NoZW1lKCJIVFRQIikpOyAgLy8gUHJpbnRzIHRydWUuCiAgLy8vIGBgYAogIC8vLwogIC8vLyBBIGBudWxsYCBvciBlbXB0eSBbc2NoZW1lXSBzdHJpbmcgbWF0Y2hlcyBhIFVSSSB3aXRoIG5vIHNjaGVtZQogIC8vLyAob25lIHdoZXJlIFtoYXNTY2hlbWVdIHJldHVybnMgZmFsc2UpLgogIGJvb2wgaXNTY2hlbWUoU3RyaW5nIHNjaGVtZSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGZpbGUgcGF0aCBmcm9tIGEgZmlsZSBVUkkuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgcGF0aCBoYXMgZWl0aGVyIFdpbmRvd3Mgb3Igbm9uLVdpbmRvd3MKICAgKiBzZW1hbnRpY3MuCiAgICoKICAgKiBGb3Igbm9uLVdpbmRvd3Mgc2VtYW50aWNzIHRoZSBzbGFzaCAoIi8iKSBpcyB1c2VkIHRvIHNlcGFyYXRlCiAgICogcGF0aCBzZWdtZW50cy4KICAgKgogICAqIEZvciBXaW5kb3dzIHNlbWFudGljcyB0aGUgYmFja3NsYXNoICgiXFwiKSBzZXBhcmF0b3IgaXMgdXNlZCB0bwogICAqIHNlcGFyYXRlIHBhdGggc2VnbWVudHMuCiAgICoKICAgKiBJZiB0aGUgVVJJIGlzIGFic29sdXRlIHRoZSBwYXRoIHN0YXJ0cyB3aXRoIGEgcGF0aCBzZXBhcmF0b3IKICAgKiB1bmxlc3MgV2luZG93cyBzZW1hbnRpY3MgaXMgdXNlZCBhbmQgdGhlIGZpcnN0IHBhdGggc2VnbWVudCBpcyBhCiAgICogZHJpdmUgbGV0dGVyLiBXaGVuIFdpbmRvd3Mgc2VtYW50aWNzIGlzIHVzZWQgYSBob3N0IGNvbXBvbmVudCBpbgogICAqIHRoZSB1cmkgaW4gaW50ZXJwcmV0ZWQgYXMgYSBmaWxlIHNlcnZlciBhbmQgYSBVTkMgcGF0aCBpcwogICAqIHJldHVybmVkLgogICAqCiAgICogVGhlIGRlZmF1bHQgZm9yIHdoZXRoZXIgdG8gdXNlIFdpbmRvd3Mgb3Igbm9uLVdpbmRvd3Mgc2VtYW50aWNzCiAgICogZGV0ZXJtaW5lZCBmcm9tIHRoZSBwbGF0Zm9ybSBEYXJ0IGlzIHJ1bm5pbmcgb24uIFdoZW4gcnVubmluZyBpbgogICAqIHRoZSBzdGFuZGFsb25lIFZNIHRoaXMgaXMgZGV0ZWN0ZWQgYnkgdGhlIFZNIGJhc2VkIG9uIHRoZQogICAqIG9wZXJhdGluZyBzeXN0ZW0uIFdoZW4gcnVubmluZyBpbiBhIGJyb3dzZXIgbm9uLVdpbmRvd3Mgc2VtYW50aWNzCiAgICogaXMgYWx3YXlzIHVzZWQuCiAgICoKICAgKiBUbyBvdmVycmlkZSB0aGUgYXV0b21hdGljIGRldGVjdGlvbiBvZiB3aGljaCBzZW1hbnRpY3MgdG8gdXNlIHBhc3MKICAgKiBhIHZhbHVlIGZvciBbd2luZG93c10uIFBhc3NpbmcgYHRydWVgIHdpbGwgdXNlIFdpbmRvd3MKICAgKiBzZW1hbnRpY3MgYW5kIHBhc3NpbmcgYGZhbHNlYCB3aWxsIHVzZSBub24tV2luZG93cyBzZW1hbnRpY3MuCiAgICoKICAgKiBJZiB0aGUgVVJJIGVuZHMgd2l0aCBhIHNsYXNoIChpLmUuIHRoZSBsYXN0IHBhdGggY29tcG9uZW50IGlzCiAgICogZW1wdHkpIHRoZSByZXR1cm5lZCBmaWxlIHBhdGggd2lsbCBhbHNvIGVuZCB3aXRoIGEgc2xhc2guCiAgICoKICAgKiBXaXRoIFdpbmRvd3Mgc2VtYW50aWNzIFVSSXMgc3RhcnRpbmcgd2l0aCBhIGRyaXZlIGxldHRlciBjYW5ub3QKICAgKiBiZSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkcml2ZSBvbiB0aGUgZGVzaWduYXRlZCBkcml2ZS4gVGhhdCBpcwogICAqIGZvciB0aGUgVVJJIGBmaWxlOi8vL2M6YWJjYCBjYWxsaW5nIGB0b0ZpbGVQYXRoYCB3aWxsIHRocm93IGFzIGEKICAgKiBwYXRoIHNlZ21lbnQgY2Fubm90IGNvbnRhaW4gY29sb24gb24gV2luZG93cy4KICAgKgogICAqIEV4YW1wbGVzIHVzaW5nIG5vbi1XaW5kb3dzIHNlbWFudGljcyAocmVzdWx0aW5nIG9mIGNhbGxpbmcKICAgKiB0b0ZpbGVQYXRoIGluIGNvbW1lbnQpOgogICAqCiAgICogICAgIFVyaS5wYXJzZSgieHh4L3l5eSIpOyAgLy8geHh4L3l5eQogICAqICAgICBVcmkucGFyc2UoInh4eC95eXkvIik7ICAvLyB4eHgveXl5LwogICAqICAgICBVcmkucGFyc2UoImZpbGU6Ly8veHh4L3l5eSIpOyAgLy8gL3h4eC95eXkKICAgKiAgICAgVXJpLnBhcnNlKCJmaWxlOi8vL3h4eC95eXkvIik7ICAvLyAveHh4L3l5eS8KICAgKiAgICAgVXJpLnBhcnNlKCJmaWxlOi8vL0M6Iik7ICAvLyAvQzoKICAgKiAgICAgVXJpLnBhcnNlKCJmaWxlOi8vL0M6YSIpOyAgLy8gL0M6YQogICAqCiAgICogRXhhbXBsZXMgdXNpbmcgV2luZG93cyBzZW1hbnRpY3MgKHJlc3VsdGluZyBVUkkgaW4gY29tbWVudCk6CiAgICoKICAgKiAgICAgVXJpLnBhcnNlKCJ4eHgveXl5Iik7ICAvLyB4eHhceXl5CiAgICogICAgIFVyaS5wYXJzZSgieHh4L3l5eS8iKTsgIC8vIHh4eFx5eXlcCiAgICogICAgIFVyaS5wYXJzZSgiZmlsZTovLy94eHgveXl5Iik7ICAvLyBceHh4XHl5eQogICAqICAgICBVcmkucGFyc2UoImZpbGU6Ly8veHh4L3l5eS8iKTsgIC8vIFx4eHhceXl5XAogICAqICAgICBVcmkucGFyc2UoImZpbGU6Ly8vQzoveHh4L3l5eSIpOyAgLy8gQzpceHh4XHl5eQogICAqICAgICBVcmkucGFyc2UoImZpbGU6Qzp4eHgveXl5Iik7ICAvLyBUaHJvd3MgYXMgYSBwYXRoIHNlZ21lbnQKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2Fubm90IGNvbnRhaW4gY29sb24gb24gV2luZG93cy4KICAgKiAgICAgVXJpLnBhcnNlKCJmaWxlOi8vc2VydmVyL3NoYXJlL2ZpbGUiKTsgIC8vIFxcc2VydmVyXHNoYXJlXGZpbGUKICAgKgogICAqIElmIHRoZSBVUkkgaXMgbm90IGEgZmlsZSBVUkkgY2FsbGluZyB0aGlzIHRocm93cwogICAqIFtVbnN1cHBvcnRlZEVycm9yXS4KICAgKgogICAqIElmIHRoZSBVUkkgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhIGZpbGUgcGF0aCBjYWxsaW5nIHRoaXMgdGhyb3dzCiAgICogW1Vuc3VwcG9ydGVkRXJyb3JdLgogICAqLwogIC8vIFRPRE8obHJuKTogRGVwcmVjYXRlIGFuZCBtb3ZlIGZ1bmN0aW9uYWxpdHkgdG8gRmlsZSBjbGFzcyBvciBzaW1pbGFyLgogIC8vIFRoZSBjb3JlIGxpYnJhcmllcyBzaG91bGQgbm90IHdvcnJ5IGFib3V0IHRoZSBwbGF0Zm9ybS4KICBTdHJpbmcgdG9GaWxlUGF0aCh7Ym9vbCB3aW5kb3dzfSk7CgogIC8qKgogICAqIEFjY2VzcyB0aGUgc3RydWN0dXJlIG9mIGEgYGRhdGE6YCBVUkkuCiAgICoKICAgKiBSZXR1cm5zIGEgW1VyaURhdGFdIG9iamVjdCBmb3IgYGRhdGE6YCBVUklzIGFuZCBgbnVsbGAgZm9yIGFsbCBvdGhlcgogICAqIFVSSXMuCiAgICogVGhlIFtVcmlEYXRhXSBvYmplY3QgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSBtZWRpYSB0eXBlIGFuZCBkYXRhCiAgICogb2YgYSBgZGF0YTpgIFVSSS4KICAgKi8KICBVcmlEYXRhIGdldCBkYXRhOwoKICAvLy8gUmV0dXJucyBhIGhhc2ggY29kZSBjb21wdXRlZCBhcyBgdG9TdHJpbmcoKS5oYXNoQ29kZWAuCiAgLy8vCiAgLy8vIFRoaXMgZ3VhcmFudGVlcyB0aGF0IFVSSXMgd2l0aCB0aGUgc2FtZSBub3JtYWxpemVkCiAgaW50IGdldCBoYXNoQ29kZTsKCiAgLy8vIEEgVVJJIGlzIGVxdWFsIHRvIGFub3RoZXIgVVJJIHdpdGggdGhlIHNhbWUgbm9ybWFsaXplZCByZXByZXNlbnRhdGlvbi4KICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcik7CgogIC8vLyBSZXR1cm5zIHRoZSBub3JtYWxpemVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgVVJJLgogIFN0cmluZyB0b1N0cmluZygpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IGBVcmlgIGJhc2VkIG9uIHRoaXMgb25lLCBidXQgd2l0aCBzb21lIHBhcnRzIHJlcGxhY2VkLgogICAqCiAgICogVGhpcyBtZXRob2QgdGFrZXMgdGhlIHNhbWUgcGFyYW1ldGVycyBhcyB0aGUgW25ldyBVcmldIGNvbnN0cnVjdG9yLAogICAqIGFuZCB0aGV5IGhhdmUgdGhlIHNhbWUgbWVhbmluZy4KICAgKgogICAqIEF0IG1vc3Qgb25lIG9mIFtwYXRoXSBhbmQgW3BhdGhTZWdtZW50c10gbXVzdCBiZSBwcm92aWRlZC4KICAgKiBMaWtld2lzZSwgYXQgbW9zdCBvbmUgb2YgW3F1ZXJ5XSBhbmQgW3F1ZXJ5UGFyYW1ldGVyc10gbXVzdCBiZSBwcm92aWRlZC4KICAgKgogICAqIEVhY2ggcGFydCB0aGF0IGlzIG5vdCBwcm92aWRlZCB3aWxsIGRlZmF1bHQgdG8gdGhlIGNvcnJlc3BvbmRpbmcKICAgKiB2YWx1ZSBmcm9tIHRoaXMgYFVyaWAgaW5zdGVhZC4KICAgKgogICAqIFRoaXMgbWV0aG9kIGlzIGRpZmZlcmVudCBmcm9tIFtVcmkucmVzb2x2ZV0gd2hpY2ggb3ZlcnJpZGVzIGluIGEKICAgKiBoaWVyYXJjaGljYWwgbWFubmVyLAogICAqIGFuZCBjYW4gaW5zdGVhZCByZXBsYWNlIGVhY2ggcGFydCBvZiBhIGBVcmlgIGluZGl2aWR1YWxseS4KICAgKgogICAqIEV4YW1wbGU6CiAgICoKICAgKiAgICAgVXJpIHVyaTEgPSBVcmkucGFyc2UoImE6Ly9iQGM6NC9kL2U/ZiNnIik7CiAgICogICAgIFVyaSB1cmkyID0gdXJpMS5yZXBsYWNlKHNjaGVtZTogIkEiLCBwYXRoOiAiRC9FL0UiLCBmcmFnbWVudDogIkciKTsKICAgKiAgICAgcHJpbnQodXJpMik7ICAvLyBwcmludHMgImE6Ly9iQGM6NC9EL0UvRT9mI0ciCiAgICoKICAgKiBUaGlzIG1ldGhvZCBhY3RzIHNpbWlsYXJseSB0byB1c2luZyB0aGUgYG5ldyBVcmlgIGNvbnN0cnVjdG9yIHdpdGgKICAgKiBzb21lIG9mIHRoZSBhcmd1bWVudHMgdGFrZW4gZnJvbSB0aGlzIGBVcmlgLiBFeGFtcGxlOgogICAqCiAgICogICAgIFVyaSB1cmkzID0gbmV3IFVyaSgKICAgKiAgICAgICAgIHNjaGVtZTogIkEiLAogICAqICAgICAgICAgdXNlckluZm86IHVyaTEudXNlckluZm8sCiAgICogICAgICAgICBob3N0OiB1cmkxLmhvc3QsCiAgICogICAgICAgICBwb3J0OiB1cmkxLnBvcnQsCiAgICogICAgICAgICBwYXRoOiAiRC9FL0UiLAogICAqICAgICAgICAgcXVlcnk6IHVyaTEucXVlcnksCiAgICogICAgICAgICBmcmFnbWVudDogIkciKTsKICAgKiAgICAgcHJpbnQodXJpMyk7ICAvLyBwcmludHMgImE6Ly9iQGM6NC9EL0UvRT9mI0ciCiAgICogICAgIHByaW50KHVyaTIgPT0gdXJpMyk7ICAvLyBwcmludHMgdHJ1ZS4KICAgKgogICAqIFVzaW5nIHRoaXMgbWV0aG9kIGNhbiBiZSBzZWVuIGFzIGEgc2hvcnRoYW5kIGZvciB0aGUgYFVyaWAgY29uc3RydWN0b3IKICAgKiBjYWxsIGFib3ZlLCBidXQgbWF5IGFsc28gYmUgc2xpZ2h0bHkgZmFzdGVyIGJlY2F1c2UgdGhlIHBhcnRzIHRha2VuCiAgICogZnJvbSB0aGlzIGBVcmlgIG5lZWQgbm90IGJlIGNoZWNrZWQgZm9yIHZhbGlkaXR5IGFnYWluLgogICAqLwogIFVyaSByZXBsYWNlKAogICAgICB7U3RyaW5nIHNjaGVtZSwKICAgICAgU3RyaW5nIHVzZXJJbmZvLAogICAgICBTdHJpbmcgaG9zdCwKICAgICAgaW50IHBvcnQsCiAgICAgIFN0cmluZyBwYXRoLAogICAgICBJdGVyYWJsZTxTdHJpbmc+IHBhdGhTZWdtZW50cywKICAgICAgU3RyaW5nIHF1ZXJ5LAogICAgICBNYXA8U3RyaW5nLCBkeW5hbWljIC8qU3RyaW5nfEl0ZXJhYmxlPFN0cmluZz4qLyA+IHF1ZXJ5UGFyYW1ldGVycywKICAgICAgU3RyaW5nIGZyYWdtZW50fSk7CgogIC8qKgogICAqIFJldHVybnMgYSBgVXJpYCB0aGF0IGRpZmZlcnMgZnJvbSB0aGlzIG9ubHkgaW4gbm90IGhhdmluZyBhIGZyYWdtZW50LgogICAqCiAgICogSWYgdGhpcyBgVXJpYCBkb2VzIG5vdCBoYXZlIGEgZnJhZ21lbnQsIGl0IGlzIGl0c2VsZiByZXR1cm5lZC4KICAgKi8KICBVcmkgcmVtb3ZlRnJhZ21lbnQoKTsKCiAgLyoqCiAgICogUmVzb2x2ZSBbcmVmZXJlbmNlXSBhcyBhbiBVUkkgcmVsYXRpdmUgdG8gYHRoaXNgLgogICAqCiAgICogRmlyc3QgdHVybiBbcmVmZXJlbmNlXSBpbnRvIGEgVVJJIHVzaW5nIFtVcmkucGFyc2VdLiBUaGVuIHJlc29sdmUgdGhlCiAgICogcmVzdWx0aW5nIFVSSSByZWxhdGl2ZSB0byBgdGhpc2AuCiAgICoKICAgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBVUkkuCiAgICoKICAgKiBTZWUgW3Jlc29sdmVVcmldIGZvciBkZXRhaWxzLgogICAqLwogIFVyaSByZXNvbHZlKFN0cmluZyByZWZlcmVuY2UpOwoKICAvKioKICAgKiBSZXNvbHZlIFtyZWZlcmVuY2VdIGFzIGFuIFVSSSByZWxhdGl2ZSB0byBgdGhpc2AuCiAgICoKICAgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBVUkkuCiAgICoKICAgKiBUaGUgYWxnb3JpdGhtICJUcmFuc2Zvcm0gUmVmZXJlbmNlIiBmb3IgcmVzb2x2aW5nIGEgcmVmZXJlbmNlIGlzIGRlc2NyaWJlZAogICAqIGluIFtSRkMtMzk4NiBTZWN0aW9uIDVdKGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi01ICJSRkMtMTEyMyIpLgogICAqCiAgICogVXBkYXRlZCB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGJhc2UgVVJJIGlzIGp1c3QgYSByZWxhdGl2ZSBwYXRoIC0KICAgKiB0aGF0IGlzOiB3aGVuIGl0IGhhcyBubyBzY2hlbWUgYW5kIG5vIGF1dGhvcml0eSBhbmQgdGhlIHBhdGggZG9lcyBub3Qgc3RhcnQKICAgKiB3aXRoIGEgc2xhc2guCiAgICogSW4gdGhhdCBjYXNlLCB0aGUgcGF0aHMgYXJlIGNvbWJpbmVkIHdpdGhvdXQgcmVtb3ZpbmcgbGVhZGluZyAiLi4iLCBhbmQKICAgKiBhbiBlbXB0eSBwYXRoIGlzIG5vdCBjb252ZXJ0ZWQgdG8gIi8iLgogICAqLwogIFVyaSByZXNvbHZlVXJpKFVyaSByZWZlcmVuY2UpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgVVJJIHdoZXJlIHRoZSBwYXRoIGhhcyBiZWVuIG5vcm1hbGl6ZWQuCiAgICoKICAgKiBBIG5vcm1hbGl6ZWQgcGF0aCBkb2VzIG5vdCBjb250YWluIGAuYCBzZWdtZW50cyBvciBub24tbGVhZGluZyBgLi5gCiAgICogc2VnbWVudHMuCiAgICogT25seSBhIHJlbGF0aXZlIHBhdGggd2l0aCBubyBzY2hlbWUgb3IgYXV0aG9yaXR5IG1heSBjb250YWluCiAgICogbGVhZGluZyBgLi5gIHNlZ21lbnRzLAogICAqIGEgcGF0aCB0aGF0IHN0YXJ0cyB3aXRoIGAvYCB3aWxsIGFsc28gZHJvcCBhbnkgbGVhZGluZyBgLi5gIHNlZ21lbnRzLgogICAqCiAgICogVGhpcyB1c2VzIHRoZSBzYW1lIG5vcm1hbGl6YXRpb24gc3RyYXRlZ3kgYXMgYG5ldyBVcmkoKS5yZXNvbHZlKHRoaXMpYC4KICAgKgogICAqIERvZXMgbm90IGNoYW5nZSBhbnkgcGFydCBvZiB0aGUgVVJJIGV4Y2VwdCB0aGUgcGF0aC4KICAgKgogICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGBVcmlgIGFsd2F5cyBub3JtYWxpemVzIHBhdGhzLCBzbyBjYWxsaW5nCiAgICogdGhpcyBmdW5jdGlvbiBoYXMgbm8gZWZmZWN0LgogICAqLwogIFVyaSBub3JtYWxpemVQYXRoKCk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgYFVyaWAgb2JqZWN0IGJ5IHBhcnNpbmcgYSBVUkkgc3RyaW5nLgogICAqCiAgICogSWYgW3N0YXJ0XSBhbmQgW2VuZF0gYXJlIHByb3ZpZGVkLCB0aGV5IG11c3Qgc3BlY2lmeSBhIHZhbGlkIHN1YnN0cmluZwogICAqIG9mIFt1cmldLCBhbmQgb25seSB0aGUgc3Vic3RyaW5nIGZyb20gYHN0YXJ0YCB0byBgZW5kYCBpcyBwYXJzZWQgYXMgYSBVUkkuCiAgICoKICAgKiBUaGUgW3VyaV0gbXVzdCBub3QgYmUgYG51bGxgLgogICAqIElmIHRoZSBbdXJpXSBzdHJpbmcgaXMgbm90IHZhbGlkIGFzIGEgVVJJIG9yIFVSSSByZWZlcmVuY2UsCiAgICogYSBbRm9ybWF0RXhjZXB0aW9uXSBpcyB0aHJvd24uCiAgICovCiAgc3RhdGljIFVyaSBwYXJzZShTdHJpbmcgdXJpLCBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pIHsKICAgIC8vIFRoaXMgcGFyc2luZyB3aWxsIG5vdCB2YWxpZGF0ZSBwZXJjZW50LWVuY29kaW5nLCBJUHY2LCBldGMuCiAgICAvLyBXaGVuIGRvbmUgc3BsaXR0aW5nIGludG8gcGFydHMsIGl0IHdpbGwgY2FsbCwgZS5nLiwgW19tYWtlRnJhZ21lbnRdCiAgICAvLyB0byBkbyB0aGUgZmluYWwgcGFyc2luZy4KICAgIC8vCiAgICAvLyBJbXBvcnRhbnQgcGFydHMgb2YgdGhlIFJGQyAzOTg2IHVzZWQgaGVyZToKICAgIC8vIFVSSSAgICAgICAgICAgPSBzY2hlbWUgIjoiIGhpZXItcGFydCBbICI/IiBxdWVyeSBdIFsgIiMiIGZyYWdtZW50IF0KICAgIC8vCiAgICAvLyBoaWVyLXBhcnQgICAgID0gIi8vIiBhdXRob3JpdHkgcGF0aC1hYmVtcHR5CiAgICAvLyAgICAgICAgICAgICAgIC8gcGF0aC1hYnNvbHV0ZQogICAgLy8gICAgICAgICAgICAgICAvIHBhdGgtcm9vdGxlc3MKICAgIC8vICAgICAgICAgICAgICAgLyBwYXRoLWVtcHR5CiAgICAvLwogICAgLy8gVVJJLXJlZmVyZW5jZSA9IFVSSSAvIHJlbGF0aXZlLXJlZgogICAgLy8KICAgIC8vIGFic29sdXRlLVVSSSAgPSBzY2hlbWUgIjoiIGhpZXItcGFydCBbICI/IiBxdWVyeSBdCiAgICAvLwogICAgLy8gcmVsYXRpdmUtcmVmICA9IHJlbGF0aXZlLXBhcnQgWyAiPyIgcXVlcnkgXSBbICIjIiBmcmFnbWVudCBdCiAgICAvLwogICAgLy8gcmVsYXRpdmUtcGFydCA9ICIvLyIgYXV0aG9yaXR5IHBhdGgtYWJlbXB0eQogICAgLy8gICAgICAgICAgICAgICAvIHBhdGgtYWJzb2x1dGUKICAgIC8vICAgICAgICAgICAgICAgLyBwYXRoLW5vc2NoZW1lCiAgICAvLyAgICAgICAgICAgICAgIC8gcGF0aC1lbXB0eQogICAgLy8KICAgIC8vIHNjaGVtZSAgICAgICAgPSBBTFBIQSAqKCBBTFBIQSAvIERJR0lUIC8gIisiIC8gIi0iIC8gIi4iICkKICAgIC8vCiAgICAvLyBhdXRob3JpdHkgICAgID0gWyB1c2VyaW5mbyAiQCIgXSBob3N0IFsgIjoiIHBvcnQgXQogICAgLy8gdXNlcmluZm8gICAgICA9ICooIHVucmVzZXJ2ZWQgLyBwY3QtZW5jb2RlZCAvIHN1Yi1kZWxpbXMgLyAiOiIgKQogICAgLy8gaG9zdCAgICAgICAgICA9IElQLWxpdGVyYWwgLyBJUHY0YWRkcmVzcyAvIHJlZy1uYW1lCiAgICAvLyBwb3J0ICAgICAgICAgID0gKkRJR0lUCiAgICAvLyByZWctbmFtZSAgICAgID0gKiggdW5yZXNlcnZlZCAvIHBjdC1lbmNvZGVkIC8gc3ViLWRlbGltcyApCiAgICAvLwogICAgLy8gcGF0aCAgICAgICAgICA9IHBhdGgtYWJlbXB0eSAgICA7IGJlZ2lucyB3aXRoICIvIiBvciBpcyBlbXB0eQogICAgLy8gICAgICAgICAgICAgICAvIHBhdGgtYWJzb2x1dGUgICA7IGJlZ2lucyB3aXRoICIvIiBidXQgbm90ICIvLyIKICAgIC8vICAgICAgICAgICAgICAgLyBwYXRoLW5vc2NoZW1lICAgOyBiZWdpbnMgd2l0aCBhIG5vbi1jb2xvbiBzZWdtZW50CiAgICAvLyAgICAgICAgICAgICAgIC8gcGF0aC1yb290bGVzcyAgIDsgYmVnaW5zIHdpdGggYSBzZWdtZW50CiAgICAvLyAgICAgICAgICAgICAgIC8gcGF0aC1lbXB0eSAgICAgIDsgemVybyBjaGFyYWN0ZXJzCiAgICAvLwogICAgLy8gcGF0aC1hYmVtcHR5ICA9ICooICIvIiBzZWdtZW50ICkKICAgIC8vIHBhdGgtYWJzb2x1dGUgPSAiLyIgWyBzZWdtZW50LW56ICooICIvIiBzZWdtZW50ICkgXQogICAgLy8gcGF0aC1ub3NjaGVtZSA9IHNlZ21lbnQtbnotbmMgKiggIi8iIHNlZ21lbnQgKQogICAgLy8gcGF0aC1yb290bGVzcyA9IHNlZ21lbnQtbnogKiggIi8iIHNlZ21lbnQgKQogICAgLy8gcGF0aC1lbXB0eSAgICA9IDA8cGNoYXI+CiAgICAvLwogICAgLy8gc2VnbWVudCAgICAgICA9ICpwY2hhcgogICAgLy8gc2VnbWVudC1ueiAgICA9IDEqcGNoYXIKICAgIC8vIHNlZ21lbnQtbnotbmMgPSAxKiggdW5yZXNlcnZlZCAvIHBjdC1lbmNvZGVkIC8gc3ViLWRlbGltcyAvICJAIiApCiAgICAvLyAgICAgICAgICAgICAgIDsgbm9uLXplcm8tbGVuZ3RoIHNlZ21lbnQgd2l0aG91dCBhbnkgY29sb24gIjoiCiAgICAvLwogICAgLy8gcGNoYXIgICAgICAgICA9IHVucmVzZXJ2ZWQgLyBwY3QtZW5jb2RlZCAvIHN1Yi1kZWxpbXMgLyAiOiIgLyAiQCIKICAgIC8vCiAgICAvLyBxdWVyeSAgICAgICAgID0gKiggcGNoYXIgLyAiLyIgLyAiPyIgKQogICAgLy8KICAgIC8vIGZyYWdtZW50ICAgICAgPSAqKCBwY2hhciAvICIvIiAvICI/IiApCiAgICBlbmQgPz89IHVyaS5sZW5ndGg7CgogICAgLy8gU3BlY2lhbCBjYXNlIGRhdGE6VVJJcy4gSWdub3JlIGNhc2Ugd2hlbiB0ZXN0aW5nLgogICAgaWYgKGVuZCA+PSBzdGFydCArIDUpIHsKICAgICAgaW50IGRhdGFEZWx0YSA9IF9zdGFydHNXaXRoRGF0YSh1cmksIHN0YXJ0KTsKICAgICAgaWYgKGRhdGFEZWx0YSA9PSAwKSB7CiAgICAgICAgLy8gVGhlIGNhc2UgaXMgcmlnaHQuCiAgICAgICAgaWYgKHN0YXJ0ID4gMCB8fCBlbmQgPCB1cmkubGVuZ3RoKSB1cmkgPSB1cmkuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwogICAgICAgIHJldHVybiBVcmlEYXRhLl9wYXJzZSh1cmksIDUsIG51bGwpLnVyaTsKICAgICAgfSBlbHNlIGlmIChkYXRhRGVsdGEgPT0gMHgyMCkgewogICAgICAgIHJldHVybiBVcmlEYXRhLl9wYXJzZSh1cmkuc3Vic3RyaW5nKHN0YXJ0ICsgNSwgZW5kKSwgMCwgbnVsbCkudXJpOwogICAgICB9CiAgICAgIC8vIE90aGVyd2lzZSB0aGUgVVJJIGRvZXNuJ3Qgc3RhcnQgd2l0aCAiZGF0YToiIG9yIGFueSBjYXNlIHZhcmlhbnQgb2YgaXQuCiAgICB9CgogICAgLy8gVGhlIGZvbGxvd2luZyBpbmRleC1ub3JtYWxpemF0aW9uIGJlbG9uZ3Mgd2l0aCB0aGUgc2Nhbm5pbmcsIGJ1dCBpcwogICAgLy8gZWFzaWVyIHRvIGRvIGhlcmUgYmVjYXVzZSB3ZSBhbHJlYWR5IGhhdmUgZXh0cmFjdGVkIHZhcmlhYmxlcyBmcm9tIHRoZQogICAgLy8gaW5kaWNlcyBsaXN0LgogICAgdmFyIGluZGljZXMgPSBMaXN0PGludD4oOCk7CgogICAgLy8gU2V0IGRlZmF1bHQgdmFsdWVzIGZvciBlYWNoIHBvc2l0aW9uLgogICAgLy8gVGhlIHZhbHVlIHdpbGwgZWl0aGVyIGJlIGNvcnJlY3QgaW4gc29tZSBjYXNlcyB3aGVyZSBpdCBpc24ndCBzZXQKICAgIC8vIGJ5IHRoZSBzY2FubmVyLCBvciBpdCBpcyBjbGVhcmx5IHJlY29nbml6YWJsZSBhcyBhbiB1bnNldCB2YWx1ZS4KICAgIGluZGljZXMKICAgICAgLi5bMF0gPSAwCiAgICAgIC4uW19zY2hlbWVFbmRJbmRleF0gPSBzdGFydCAtIDEKICAgICAgLi5bX2hvc3RTdGFydEluZGV4XSA9IHN0YXJ0IC0gMQogICAgICAuLltfbm90U2ltcGxlSW5kZXhdID0gc3RhcnQgLSAxCiAgICAgIC4uW19wb3J0U3RhcnRJbmRleF0gPSBzdGFydAogICAgICAuLltfcGF0aFN0YXJ0SW5kZXhdID0gc3RhcnQKICAgICAgLi5bX3F1ZXJ5U3RhcnRJbmRleF0gPSBlbmQKICAgICAgLi5bX2ZyYWdtZW50U3RhcnRJbmRleF0gPSBlbmQ7CiAgICB2YXIgc3RhdGUgPSBfc2Nhbih1cmksIHN0YXJ0LCBlbmQsIF91cmlTdGFydCwgaW5kaWNlcyk7CiAgICAvLyBTb21lIHN0YXRlcyB0aGF0IHNob3VsZCBiZSBub24tc2ltcGxlLCBidXQgdGhlIFVSSSBlbmRlZCBlYXJseS4KICAgIC8vIFBhdGhzIHRoYXQgZW5kIGF0IGEgIi4uIiBtdXN0IGJlIG5vcm1hbGl6ZWQgdG8gZW5kIGluICIuLi8iLgogICAgaWYgKHN0YXRlID49IF9ub25TaW1wbGVFbmRTdGF0ZXMpIHsKICAgICAgaW5kaWNlc1tfbm90U2ltcGxlSW5kZXhdID0gZW5kOwogICAgfQogICAgaW50IHNjaGVtZUVuZCA9IGluZGljZXNbX3NjaGVtZUVuZEluZGV4XTsKICAgIGlmIChzY2hlbWVFbmQgPj0gc3RhcnQpIHsKICAgICAgLy8gUmVzY2FuIHRoZSBzY2hlbWUgcGFydCBub3cgdGhhdCB3ZSBrbm93IGl0J3Mgbm90IGEgcGF0aC4KICAgICAgc3RhdGUgPSBfc2Nhbih1cmksIHN0YXJ0LCBzY2hlbWVFbmQsIF9zY2hlbWVTdGFydCwgaW5kaWNlcyk7CiAgICAgIGlmIChzdGF0ZSA9PSBfc2NoZW1lU3RhcnQpIHsKICAgICAgICAvLyBFbXB0eSBzY2hlbWUuCiAgICAgICAgaW5kaWNlc1tfbm90U2ltcGxlSW5kZXhdID0gc2NoZW1lRW5kOwogICAgICB9CiAgICB9CiAgICAvLyBUaGUgcmV0dXJuZWQgcG9zaXRpb25zIGFyZSBsaW1pdGVkIGJ5IHRoZSBzY2FubmVycyBhYmlsaXR5IHRvIHdyaXRlIG9ubHkKICAgIC8vIG9uZSBwb3NpdGlvbiBwZXIgY2hhcmFjdGVyLCBhbmQgb25seSB0aGUgY3VycmVudCBwb3NpdGlvbi4KICAgIC8vIFNjYW5uaW5nIGZyb20gbGVmdCB0byByaWdodCwgd2Ugb25seSBrbm93IHdoZXRoZXIgc29tZXRoaW5nIGlzIGEgc2NoZW1lCiAgICAvLyBvciBhIHBhdGggd2hlbiB3ZSBzZWUgYSBgOmAgb3IgYC9gLCBhbmQgbGlrZXdpc2Ugd2Ugb25seSBrbm93IGlmIHRoZSBmaXJzdAogICAgLy8gYC9gIGlzIHBhcnQgb2YgdGhlIHBhdGggb3IgaXMgbGVhZGluZyBhbiBhdXRob3JpdHkgY29tcG9uZW50IHdoZW4gd2Ugc2VlCiAgICAvLyB0aGUgbmV4dCBjaGFyYWN0ZXIuCgogICAgaW50IGhvc3RTdGFydCA9IGluZGljZXNbX2hvc3RTdGFydEluZGV4XSArIDE7CiAgICBpbnQgcG9ydFN0YXJ0ID0gaW5kaWNlc1tfcG9ydFN0YXJ0SW5kZXhdOwogICAgaW50IHBhdGhTdGFydCA9IGluZGljZXNbX3BhdGhTdGFydEluZGV4XTsKICAgIGludCBxdWVyeVN0YXJ0ID0gaW5kaWNlc1tfcXVlcnlTdGFydEluZGV4XTsKICAgIGludCBmcmFnbWVudFN0YXJ0ID0gaW5kaWNlc1tfZnJhZ21lbnRTdGFydEluZGV4XTsKCiAgICAvLyBXZSBtYXkgZGlzY292ZXIgc2NoZW1lIHdoaWxlIGhhbmRsaW5nIHNwZWNpYWwgY2FzZXMuCiAgICBTdHJpbmcgc2NoZW1lOwoKICAgIC8vIERlcml2ZSBzb21lIHBvc2l0aW9ucyB0aGF0IHdlcmVuJ3Qgc2V0IHRvIG5vcm1hbGl6ZSB0aGUgaW5kaWNlcy4KICAgIGlmIChmcmFnbWVudFN0YXJ0IDwgcXVlcnlTdGFydCkgcXVlcnlTdGFydCA9IGZyYWdtZW50U3RhcnQ7CiAgICAvLyBJZiBwYXRoU3RhcnQgaXNuJ3Qgc2V0IChpdCdzIGJlZm9yZSBzY2hlbWUgZW5kIG9yIGhvc3Qgc3RhcnQpLCB0aGVuCiAgICAvLyB0aGUgcGF0aCBpcyBlbXB0eSwgb3IgdGhlcmUgaXMgbm8gYXV0aG9yaXR5IHBhcnQgYW5kIHRoZSBwYXRoCiAgICAvLyBzdGFydHMgd2l0aCBhIG5vbi1zaW1wbGUgY2hhcmFjdGVyLgogICAgaWYgKHBhdGhTdGFydCA8IGhvc3RTdGFydCkgewogICAgICAvLyBUaGVyZSBpcyBhbiBhdXRob3JpdHksIGJ1dCBubyBwYXRoLiBUaGUgcGF0aCB3b3VsZCBzdGFydCB3aXRoIGAvYAogICAgICAvLyBpZiBpdCB3YXMgdGhlcmUuCiAgICAgIHBhdGhTdGFydCA9IHF1ZXJ5U3RhcnQ7CiAgICB9IGVsc2UgaWYgKHBhdGhTdGFydCA8PSBzY2hlbWVFbmQpIHsKICAgICAgLy8gVGhlcmUgaXMgYSBzY2hlbWUsIGJ1dCBubyBhdXRob3JpdHkuCiAgICAgIHBhdGhTdGFydCA9IHNjaGVtZUVuZCArIDE7CiAgICB9CiAgICAvLyBJZiB0aGVyZSBpcyBhbiBhdXRob3JpdHkgd2l0aCBubyBwb3J0LCBzZXQgdGhlIHBvcnQgcG9zaXRpb24KICAgIC8vIHRvIGJlIGF0IHRoZSBlbmQgb2YgdGhlIGF1dGhvcml0eSAoZXF1YWwgdG8gcGF0aFN0YXJ0KS4KICAgIC8vIFRoaXMgYWxzbyBoYW5kbGVzIGEgIjoiIGluIGEgdXNlci1pbmZvIGNvbXBvbmVudCBpbmNvcnJlY3RseSBzZXR0aW5nCiAgICAvLyB0aGUgcG9ydCBzdGFydCBwb3NpdGlvbi4KICAgIGlmIChwb3J0U3RhcnQgPCBob3N0U3RhcnQpIHBvcnRTdGFydCA9IHBhdGhTdGFydDsKCiAgICBhc3NlcnQoaG9zdFN0YXJ0ID09IHN0YXJ0IHx8IHNjaGVtZUVuZCA8PSBob3N0U3RhcnQpOwogICAgYXNzZXJ0KGhvc3RTdGFydCA8PSBwb3J0U3RhcnQpOwogICAgYXNzZXJ0KHNjaGVtZUVuZCA8PSBwYXRoU3RhcnQpOwogICAgYXNzZXJ0KHBvcnRTdGFydCA8PSBwYXRoU3RhcnQpOwogICAgYXNzZXJ0KHBhdGhTdGFydCA8PSBxdWVyeVN0YXJ0KTsKICAgIGFzc2VydChxdWVyeVN0YXJ0IDw9IGZyYWdtZW50U3RhcnQpOwoKICAgIGJvb2wgaXNTaW1wbGUgPSBpbmRpY2VzW19ub3RTaW1wbGVJbmRleF0gPCBzdGFydDsKCiAgICBpZiAoaXNTaW1wbGUpIHsKICAgICAgLy8gQ2hlY2svZG8gbm9ybWFsaXphdGlvbnMgdGhhdCB3ZXJlbid0IGRldGVjdGVkIGJ5IHRoZSBzY2FubmVyLgogICAgICAvLyBUaGlzIGluY2x1ZGVzIHJlbW92YWwgb2YgZW1wdHkgcG9ydCBvciB1c2VySW5mbywKICAgICAgLy8gb3Igc2NoZW1lIHNwZWNpZmljIHBvcnQgYW5kIHBhdGggbm9ybWFsaXphdGlvbnMuCiAgICAgIGlmIChob3N0U3RhcnQgPiBzY2hlbWVFbmQgKyAzKSB7CiAgICAgICAgLy8gQWx3YXlzIGJlIG5vbi1zaW1wbGUgaWYgVVJJIGNvbnRhaW5zIHVzZXItaW5mby4KICAgICAgICAvLyBUaGUgc2Nhbm5lciBkb2Vzbid0IHNldCB0aGUgbm90LXNpbXBsZSBwb3NpdGlvbiBpbiB0aGlzIGNhc2UgYmVjYXVzZQogICAgICAgIC8vIGl0J3Mgc2V0dGluZyB0aGUgaG9zdC1zdGFydCBwb3NpdGlvbiBpbnN0ZWFkLgogICAgICAgIGlzU2ltcGxlID0gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAocG9ydFN0YXJ0ID4gc3RhcnQgJiYgcG9ydFN0YXJ0ICsgMSA9PSBwYXRoU3RhcnQpIHsKICAgICAgICAvLyBJZiB0aGUgcG9ydCBpcyBlbXB0eSwgaXQgc2hvdWxkIGJlIG9taXR0ZWQuCiAgICAgICAgLy8gUGF0aG9sb2dpY2FsIGNhc2UsIGRvbid0IGJvdGhlciBjb3JyZWN0aW5nIGl0LgogICAgICAgIGlzU2ltcGxlID0gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAocXVlcnlTdGFydCA8IGVuZCAmJgogICAgICAgICAgICAgIChxdWVyeVN0YXJ0ID09IHBhdGhTdGFydCArIDIgJiYKICAgICAgICAgICAgICAgICAgdXJpLnN0YXJ0c1dpdGgoIi4uIiwgcGF0aFN0YXJ0KSkgfHwKICAgICAgICAgIChxdWVyeVN0YXJ0ID4gcGF0aFN0YXJ0ICsgMiAmJgogICAgICAgICAgICAgIHVyaS5zdGFydHNXaXRoKCIvLi4iLCBxdWVyeVN0YXJ0IC0gMykpKSB7CiAgICAgICAgLy8gVGhlIHBhdGggZW5kcyBpbiBhICIuLiIgc2VnbWVudC4gVGhpcyBzaG91bGQgYmUgbm9ybWFsaXplZCB0byAiLi4vIi4KICAgICAgICAvLyBXZSBkaWRuJ3QgZGV0ZWN0IHRoaXMgd2hpbGUgc2Nhbm5pbmcgYmVjYXVzZSBhIHF1ZXJ5IG9yIGZyYWdtZW50IHdhcwogICAgICAgIC8vIGRldGVjdGVkIGF0IHRoZSBzYW1lIHRpbWUgKHdoaWNoIGlzIHdoeSB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgdGhpcwogICAgICAgIC8vIGlmIHRoZXJlIGlzIHNvbWV0aGluZyBhZnRlciB0aGUgcGF0aCkuCiAgICAgICAgaXNTaW1wbGUgPSBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUaGVyZSBhcmUgYSBmZXcgc2NoZW1lLWJhc2VkIG5vcm1hbGl6YXRpb25zIHRoYXQKICAgICAgICAvLyB0aGUgc2Nhbm5lciBjb3VsZG4ndCBjaGVjay4KICAgICAgICAvLyBUaGF0IG1lYW5zIHRoYXQgdGhlIGlucHV0IGlzIHZlcnkgY2xvc2UgdG8gc2ltcGxlLCBzbyBqdXN0IGRvCiAgICAgICAgLy8gdGhlIG5vcm1hbGl6YXRpb25zLgogICAgICAgIGlmIChzY2hlbWVFbmQgPT0gc3RhcnQgKyA0KSB7CiAgICAgICAgICAvLyBEbyBzY2hlbWUgYmFzZWQgbm9ybWFsaXphdGlvbnMgZm9yIGZpbGUsIGh0dHAuCiAgICAgICAgICBpZiAodXJpLnN0YXJ0c1dpdGgoImZpbGUiLCBzdGFydCkpIHsKICAgICAgICAgICAgc2NoZW1lID0gImZpbGUiOwogICAgICAgICAgICBpZiAoaG9zdFN0YXJ0IDw9IHN0YXJ0KSB7CiAgICAgICAgICAgICAgLy8gRmlsZSBVUklzIHNob3VsZCBoYXZlIGFuIGF1dGhvcml0eS4KICAgICAgICAgICAgICAvLyBQYXRocyBhZnRlciBhbiBhdXRob3JpdHkgc2hvdWxkIGJlIGFic29sdXRlLgogICAgICAgICAgICAgIFN0cmluZyBzY2hlbWVBdXRoID0gImZpbGU6Ly8iOwogICAgICAgICAgICAgIGludCBkZWx0YSA9IDI7CiAgICAgICAgICAgICAgaWYgKCF1cmkuc3RhcnRzV2l0aCgiLyIsIHBhdGhTdGFydCkpIHsKICAgICAgICAgICAgICAgIHNjaGVtZUF1dGggPSAiZmlsZTovLy8iOwogICAgICAgICAgICAgICAgZGVsdGEgPSAzOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB1cmkgPSBzY2hlbWVBdXRoICsgdXJpLnN1YnN0cmluZyhwYXRoU3RhcnQsIGVuZCk7CiAgICAgICAgICAgICAgc2NoZW1lRW5kIC09IHN0YXJ0OwogICAgICAgICAgICAgIGhvc3RTdGFydCA9IDc7CiAgICAgICAgICAgICAgcG9ydFN0YXJ0ID0gNzsKICAgICAgICAgICAgICBwYXRoU3RhcnQgPSA3OwogICAgICAgICAgICAgIHF1ZXJ5U3RhcnQgKz0gZGVsdGEgLSBzdGFydDsKICAgICAgICAgICAgICBmcmFnbWVudFN0YXJ0ICs9IGRlbHRhIC0gc3RhcnQ7CiAgICAgICAgICAgICAgc3RhcnQgPSAwOwogICAgICAgICAgICAgIGVuZCA9IHVyaS5sZW5ndGg7CiAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aFN0YXJ0ID09IHF1ZXJ5U3RhcnQpIHsKICAgICAgICAgICAgICAvLyBVcmkgaGFzIGF1dGhvcml0eSBhbmQgZW1wdHkgcGF0aC4gQWRkICIvIiBhcyBwYXRoLgogICAgICAgICAgICAgIGlmIChzdGFydCA9PSAwICYmIGVuZCA9PSB1cmkubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICB1cmkgPSB1cmkucmVwbGFjZVJhbmdlKHBhdGhTdGFydCwgcXVlcnlTdGFydCwgIi8iKTsKICAgICAgICAgICAgICAgIHF1ZXJ5U3RhcnQgKz0gMTsKICAgICAgICAgICAgICAgIGZyYWdtZW50U3RhcnQgKz0gMTsKICAgICAgICAgICAgICAgIGVuZCArPSAxOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1cmkgPSAiJHt1cmkuc3Vic3RyaW5nKHN0YXJ0LCBwYXRoU3RhcnQpfS8iCiAgICAgICAgICAgICAgICAgICAgIiR7dXJpLnN1YnN0cmluZyhxdWVyeVN0YXJ0LCBlbmQpfSI7CiAgICAgICAgICAgICAgICBzY2hlbWVFbmQgLT0gc3RhcnQ7CiAgICAgICAgICAgICAgICBob3N0U3RhcnQgLT0gc3RhcnQ7CiAgICAgICAgICAgICAgICBwb3J0U3RhcnQgLT0gc3RhcnQ7CiAgICAgICAgICAgICAgICBwYXRoU3RhcnQgLT0gc3RhcnQ7CiAgICAgICAgICAgICAgICBxdWVyeVN0YXJ0ICs9IDEgLSBzdGFydDsKICAgICAgICAgICAgICAgIGZyYWdtZW50U3RhcnQgKz0gMSAtIHN0YXJ0OwogICAgICAgICAgICAgICAgc3RhcnQgPSAwOwogICAgICAgICAgICAgICAgZW5kID0gdXJpLmxlbmd0aDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAodXJpLnN0YXJ0c1dpdGgoImh0dHAiLCBzdGFydCkpIHsKICAgICAgICAgICAgc2NoZW1lID0gImh0dHAiOwogICAgICAgICAgICAvLyBIVFRQIFVSSXMgc2hvdWxkIG5vdCBoYXZlIGFuIGV4cGxpY2l0IHBvcnQgb2YgODAuCiAgICAgICAgICAgIGlmIChwb3J0U3RhcnQgPiBzdGFydCAmJgogICAgICAgICAgICAgICAgcG9ydFN0YXJ0ICsgMyA9PSBwYXRoU3RhcnQgJiYKICAgICAgICAgICAgICAgIHVyaS5zdGFydHNXaXRoKCI4MCIsIHBvcnRTdGFydCArIDEpKSB7CiAgICAgICAgICAgICAgaWYgKHN0YXJ0ID09IDAgJiYgZW5kID09IHVyaS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHVyaSA9IHVyaS5yZXBsYWNlUmFuZ2UocG9ydFN0YXJ0LCBwYXRoU3RhcnQsICIiKTsKICAgICAgICAgICAgICAgIHBhdGhTdGFydCAtPSAzOwogICAgICAgICAgICAgICAgcXVlcnlTdGFydCAtPSAzOwogICAgICAgICAgICAgICAgZnJhZ21lbnRTdGFydCAtPSAzOwogICAgICAgICAgICAgICAgZW5kIC09IDM7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVyaSA9IHVyaS5zdWJzdHJpbmcoc3RhcnQsIHBvcnRTdGFydCkgKwogICAgICAgICAgICAgICAgICAgIHVyaS5zdWJzdHJpbmcocGF0aFN0YXJ0LCBlbmQpOwogICAgICAgICAgICAgICAgc2NoZW1lRW5kIC09IHN0YXJ0OwogICAgICAgICAgICAgICAgaG9zdFN0YXJ0IC09IHN0YXJ0OwogICAgICAgICAgICAgICAgcG9ydFN0YXJ0IC09IHN0YXJ0OwogICAgICAgICAgICAgICAgcGF0aFN0YXJ0IC09IDMgKyBzdGFydDsKICAgICAgICAgICAgICAgIHF1ZXJ5U3RhcnQgLT0gMyArIHN0YXJ0OwogICAgICAgICAgICAgICAgZnJhZ21lbnRTdGFydCAtPSAzICsgc3RhcnQ7CiAgICAgICAgICAgICAgICBzdGFydCA9IDA7CiAgICAgICAgICAgICAgICBlbmQgPSB1cmkubGVuZ3RoOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc2NoZW1lRW5kID09IHN0YXJ0ICsgNSAmJiB1cmkuc3RhcnRzV2l0aCgiaHR0cHMiLCBzdGFydCkpIHsKICAgICAgICAgIHNjaGVtZSA9ICJodHRwcyI7CiAgICAgICAgICAvLyBIVFRQUyBVUklzIHNob3VsZCBub3QgaGF2ZSBhbiBleHBsaWNpdCBwb3J0IG9mIDQ0My4KICAgICAgICAgIGlmIChwb3J0U3RhcnQgPiBzdGFydCAmJgogICAgICAgICAgICAgIHBvcnRTdGFydCArIDQgPT0gcGF0aFN0YXJ0ICYmCiAgICAgICAgICAgICAgdXJpLnN0YXJ0c1dpdGgoIjQ0MyIsIHBvcnRTdGFydCArIDEpKSB7CiAgICAgICAgICAgIGlmIChzdGFydCA9PSAwICYmIGVuZCA9PSB1cmkubGVuZ3RoKSB7CiAgICAgICAgICAgICAgdXJpID0gdXJpLnJlcGxhY2VSYW5nZShwb3J0U3RhcnQsIHBhdGhTdGFydCwgIiIpOwogICAgICAgICAgICAgIHBhdGhTdGFydCAtPSA0OwogICAgICAgICAgICAgIHF1ZXJ5U3RhcnQgLT0gNDsKICAgICAgICAgICAgICBmcmFnbWVudFN0YXJ0IC09IDQ7CiAgICAgICAgICAgICAgZW5kIC09IDM7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdXJpID0gdXJpLnN1YnN0cmluZyhzdGFydCwgcG9ydFN0YXJ0KSArCiAgICAgICAgICAgICAgICAgIHVyaS5zdWJzdHJpbmcocGF0aFN0YXJ0LCBlbmQpOwogICAgICAgICAgICAgIHNjaGVtZUVuZCAtPSBzdGFydDsKICAgICAgICAgICAgICBob3N0U3RhcnQgLT0gc3RhcnQ7CiAgICAgICAgICAgICAgcG9ydFN0YXJ0IC09IHN0YXJ0OwogICAgICAgICAgICAgIHBhdGhTdGFydCAtPSA0ICsgc3RhcnQ7CiAgICAgICAgICAgICAgcXVlcnlTdGFydCAtPSA0ICsgc3RhcnQ7CiAgICAgICAgICAgICAgZnJhZ21lbnRTdGFydCAtPSA0ICsgc3RhcnQ7CiAgICAgICAgICAgICAgc3RhcnQgPSAwOwogICAgICAgICAgICAgIGVuZCA9IHVyaS5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAoaXNTaW1wbGUpIHsKICAgICAgaWYgKHN0YXJ0ID4gMCB8fCBlbmQgPCB1cmkubGVuZ3RoKSB7CiAgICAgICAgdXJpID0gdXJpLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKICAgICAgICBzY2hlbWVFbmQgLT0gc3RhcnQ7CiAgICAgICAgaG9zdFN0YXJ0IC09IHN0YXJ0OwogICAgICAgIHBvcnRTdGFydCAtPSBzdGFydDsKICAgICAgICBwYXRoU3RhcnQgLT0gc3RhcnQ7CiAgICAgICAgcXVlcnlTdGFydCAtPSBzdGFydDsKICAgICAgICBmcmFnbWVudFN0YXJ0IC09IHN0YXJ0OwogICAgICB9CiAgICAgIHJldHVybiBfU2ltcGxlVXJpKHVyaSwgc2NoZW1lRW5kLCBob3N0U3RhcnQsIHBvcnRTdGFydCwgcGF0aFN0YXJ0LAogICAgICAgICAgcXVlcnlTdGFydCwgZnJhZ21lbnRTdGFydCwgc2NoZW1lKTsKICAgIH0KCiAgICByZXR1cm4gX1VyaS5ub3RTaW1wbGUodXJpLCBzdGFydCwgZW5kLCBzY2hlbWVFbmQsIGhvc3RTdGFydCwgcG9ydFN0YXJ0LAogICAgICAgIHBhdGhTdGFydCwgcXVlcnlTdGFydCwgZnJhZ21lbnRTdGFydCwgc2NoZW1lKTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgYFVyaWAgb2JqZWN0IGJ5IHBhcnNpbmcgYSBVUkkgc3RyaW5nLgogICAqCiAgICogSWYgW3N0YXJ0XSBhbmQgW2VuZF0gYXJlIHByb3ZpZGVkLCB0aGV5IG11c3Qgc3BlY2lmeSBhIHZhbGlkIHN1YnN0cmluZwogICAqIG9mIFt1cmldLCBhbmQgb25seSB0aGUgc3Vic3RyaW5nIGZyb20gYHN0YXJ0YCB0byBgZW5kYCBpcyBwYXJzZWQgYXMgYSBVUkkuCiAgICogVGhlIFt1cmldIG11c3Qgbm90IGJlIGBudWxsYC4KICAgKgogICAqIFJldHVybnMgYG51bGxgIGlmIHRoZSBbdXJpXSBzdHJpbmcgaXMgbm90IHZhbGlkIGFzIGEgVVJJIG9yIFVSSSByZWZlcmVuY2UuCiAgICovCiAgc3RhdGljIFVyaSB0cnlQYXJzZShTdHJpbmcgdXJpLCBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pIHsKICAgIC8vIFRPRE86IE9wdGltaXplIHRvIGF2b2lkIHRocm93aW5nLWFuZC1yZWNhdGNoaW5nLgogICAgdHJ5IHsKICAgICAgcmV0dXJuIHBhcnNlKHVyaSwgc3RhcnQsIGVuZCk7CiAgICB9IG9uIEZvcm1hdEV4Y2VwdGlvbiB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgLyoqCiAgICogRW5jb2RlIHRoZSBzdHJpbmcgW2NvbXBvbmVudF0gdXNpbmcgcGVyY2VudC1lbmNvZGluZyB0byBtYWtlIGl0CiAgICogc2FmZSBmb3IgbGl0ZXJhbCB1c2UgYXMgYSBVUkkgY29tcG9uZW50LgogICAqCiAgICogQWxsIGNoYXJhY3RlcnMgZXhjZXB0IHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlIGxldHRlcnMsIGRpZ2l0cyBhbmQKICAgKiB0aGUgY2hhcmFjdGVycyBgLV8uIX4qJygpYCBhcmUgcGVyY2VudC1lbmNvZGVkLiBUaGlzIGlzIHRoZQogICAqIHNldCBvZiBjaGFyYWN0ZXJzIHNwZWNpZmllZCBpbiBSRkMgMjM5NiBhbmQgdGhlIHdoaWNoIGlzCiAgICogc3BlY2lmaWVkIGZvciB0aGUgZW5jb2RlVXJpQ29tcG9uZW50IGluIEVDTUEtMjYyIHZlcnNpb24gNS4xLgogICAqCiAgICogV2hlbiBtYW51YWxseSBlbmNvZGluZyBwYXRoIHNlZ21lbnRzIG9yIHF1ZXJ5IGNvbXBvbmVudHMgcmVtZW1iZXIKICAgKiB0byBlbmNvZGUgZWFjaCBwYXJ0IHNlcGFyYXRlbHkgYmVmb3JlIGJ1aWxkaW5nIHRoZSBwYXRoIG9yIHF1ZXJ5CiAgICogc3RyaW5nLgogICAqCiAgICogRm9yIGVuY29kaW5nIHRoZSBxdWVyeSBwYXJ0IGNvbnNpZGVyIHVzaW5nCiAgICogW2VuY29kZVF1ZXJ5Q29tcG9uZW50XS4KICAgKgogICAqIFRvIGF2b2lkIHRoZSBuZWVkIGZvciBleHBsaWNpdGx5IGVuY29kaW5nIHVzZSB0aGUgW3BhdGhTZWdtZW50c10KICAgKiBhbmQgW3F1ZXJ5UGFyYW1ldGVyc10gb3B0aW9uYWwgbmFtZWQgYXJndW1lbnRzIHdoZW4gY29uc3RydWN0aW5nCiAgICogYSBbVXJpXS4KICAgKi8KICBzdGF0aWMgU3RyaW5nIGVuY29kZUNvbXBvbmVudChTdHJpbmcgY29tcG9uZW50KSB7CiAgICByZXR1cm4gX1VyaS5fdXJpRW5jb2RlKF9VcmkuX3VucmVzZXJ2ZWQyMzk2VGFibGUsIGNvbXBvbmVudCwgdXRmOCwgZmFsc2UpOwogIH0KCiAgLyoqCiAgICogRW5jb2RlIHRoZSBzdHJpbmcgW2NvbXBvbmVudF0gYWNjb3JkaW5nIHRvIHRoZSBIVE1MIDQuMDEgcnVsZXMKICAgKiBmb3IgZW5jb2RpbmcgdGhlIHBvc3Rpbmcgb2YgYSBIVE1MIGZvcm0gYXMgYSBxdWVyeSBzdHJpbmcKICAgKiBjb21wb25lbnQuCiAgICoKICAgKiBFbmNvZGUgdGhlIHN0cmluZyBbY29tcG9uZW50XSBhY2NvcmRpbmcgdG8gdGhlIEhUTUwgNC4wMSBydWxlcwogICAqIGZvciBlbmNvZGluZyB0aGUgcG9zdGluZyBvZiBhIEhUTUwgZm9ybSBhcyBhIHF1ZXJ5IHN0cmluZwogICAqIGNvbXBvbmVudC4KCiAgICogVGhlIGNvbXBvbmVudCBpcyBmaXJzdCBlbmNvZGVkIHRvIGJ5dGVzIHVzaW5nIFtlbmNvZGluZ10uCiAgICogVGhlIGRlZmF1bHQgaXMgdG8gdXNlIFt1dGY4XSBlbmNvZGluZywgd2hpY2ggcHJlc2VydmVzIGFsbAogICAqIHRoZSBjaGFyYWN0ZXJzIHRoYXQgZG9uJ3QgbmVlZCBlbmNvZGluZy4KCiAgICogVGhlbiB0aGUgcmVzdWx0aW5nIGJ5dGVzIGFyZSAicGVyY2VudC1lbmNvZGVkIi4gVGhpcyB0cmFuc2Zvcm1zCiAgICogc3BhY2VzIChVKzAwMjApIHRvIGEgcGx1cyBzaWduICgnKycpIGFuZCBhbGwgYnl0ZXMgdGhhdCBhcmUgbm90CiAgICogdGhlIEFTQ0lJIGRlY2ltYWwgZGlnaXRzLCBsZXR0ZXJzIG9yIG9uZSBvZiAnLS5fficgYXJlIHdyaXR0ZW4gYXMKICAgKiBhIHBlcmNlbnQgc2lnbiAnJScgZm9sbG93ZWQgYnkgdGhlIHR3by1kaWdpdCBoZXhhZGVjaW1hbAogICAqIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBieXRlLgoKICAgKiBOb3RlIHRoYXQgdGhlIHNldCBvZiBjaGFyYWN0ZXJzIHdoaWNoIGFyZSBwZXJjZW50LWVuY29kZWQgaXMgYQogICAqIHN1cGVyc2V0IG9mIHdoYXQgSFRNTCA0LjAxIHJlcXVpcmVzLCBzaW5jZSBpdCByZWZlcnMgdG8gUkZDIDE3MzgKICAgKiBmb3IgcmVzZXJ2ZWQgY2hhcmFjdGVycy4KICAgKgogICAqIFdoZW4gbWFudWFsbHkgZW5jb2RpbmcgcXVlcnkgY29tcG9uZW50cyByZW1lbWJlciB0byBlbmNvZGUgZWFjaAogICAqIHBhcnQgc2VwYXJhdGVseSBiZWZvcmUgYnVpbGRpbmcgdGhlIHF1ZXJ5IHN0cmluZy4KICAgKgogICAqIFRvIGF2b2lkIHRoZSBuZWVkIGZvciBleHBsaWNpdGx5IGVuY29kaW5nIHRoZSBxdWVyeSB1c2UgdGhlCiAgICogW3F1ZXJ5UGFyYW1ldGVyc10gb3B0aW9uYWwgbmFtZWQgYXJndW1lbnRzIHdoZW4gY29uc3RydWN0aW5nIGEKICAgKiBbVXJpXS4KICAgKgogICAqIFNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNDAxL2ludGVyYWN0L2Zvcm1zLmh0bWwjaC0xNy4xMy40LjIgZm9yIG1vcmUKICAgKiBkZXRhaWxzLgogICAqLwogIHN0YXRpYyBTdHJpbmcgZW5jb2RlUXVlcnlDb21wb25lbnQoU3RyaW5nIGNvbXBvbmVudCwKICAgICAge0VuY29kaW5nIGVuY29kaW5nID0gdXRmOH0pIHsKICAgIHJldHVybiBfVXJpLl91cmlFbmNvZGUoX1VyaS5fdW5yZXNlcnZlZFRhYmxlLCBjb21wb25lbnQsIGVuY29kaW5nLCB0cnVlKTsKICB9CgogIC8qKgogICAqIERlY29kZXMgdGhlIHBlcmNlbnQtZW5jb2RpbmcgaW4gW2VuY29kZWRDb21wb25lbnRdLgogICAqCiAgICogTm90ZSB0aGF0IGRlY29kaW5nIGEgVVJJIGNvbXBvbmVudCBtaWdodCBjaGFuZ2UgaXRzIG1lYW5pbmcgYXMKICAgKiBzb21lIG9mIHRoZSBkZWNvZGVkIGNoYXJhY3RlcnMgY291bGQgYmUgY2hhcmFjdGVycyB3aXRoIGFyZQogICAqIGRlbGltaXRlcnMgZm9yIGEgZ2l2ZW4gVVJJIGNvbXBvbmVudCB0eXBlLiBBbHdheXMgc3BsaXQgYSBVUkkKICAgKiBjb21wb25lbnQgdXNpbmcgdGhlIGRlbGltaXRlcnMgZm9yIHRoZSBjb21wb25lbnQgYmVmb3JlIGRlY29kaW5nCiAgICogdGhlIGluZGl2aWR1YWwgcGFydHMuCiAgICoKICAgKiBGb3IgaGFuZGxpbmcgdGhlIFtwYXRoXSBhbmQgW3F1ZXJ5XSBjb21wb25lbnRzIGNvbnNpZGVyIHVzaW5nCiAgICogW3BhdGhTZWdtZW50c10gYW5kIFtxdWVyeVBhcmFtZXRlcnNdIHRvIGdldCB0aGUgc2VwYXJhdGVkIGFuZAogICAqIGRlY29kZWQgY29tcG9uZW50LgogICAqLwogIHN0YXRpYyBTdHJpbmcgZGVjb2RlQ29tcG9uZW50KFN0cmluZyBlbmNvZGVkQ29tcG9uZW50KSB7CiAgICByZXR1cm4gX1VyaS5fdXJpRGVjb2RlKAogICAgICAgIGVuY29kZWRDb21wb25lbnQsIDAsIGVuY29kZWRDb21wb25lbnQubGVuZ3RoLCB1dGY4LCBmYWxzZSk7CiAgfQoKICAvKioKICAgKiBEZWNvZGVzIHRoZSBwZXJjZW50LWVuY29kaW5nIGluIFtlbmNvZGVkQ29tcG9uZW50XSwgY29udmVydGluZwogICAqIHBsdXNlcyB0byBzcGFjZXMuCiAgICoKICAgKiBJdCB3aWxsIGNyZWF0ZSBhIGJ5dGUtbGlzdCBvZiB0aGUgZGVjb2RlZCBjaGFyYWN0ZXJzLCBhbmQgdGhlbiB1c2UKICAgKiBbZW5jb2RpbmddIHRvIGRlY29kZSB0aGUgYnl0ZS1saXN0IHRvIGEgU3RyaW5nLiBUaGUgZGVmYXVsdCBlbmNvZGluZyBpcwogICAqIFVURi04LgogICAqLwogIHN0YXRpYyBTdHJpbmcgZGVjb2RlUXVlcnlDb21wb25lbnQoU3RyaW5nIGVuY29kZWRDb21wb25lbnQsCiAgICAgIHtFbmNvZGluZyBlbmNvZGluZyA9IHV0Zjh9KSB7CiAgICByZXR1cm4gX1VyaS5fdXJpRGVjb2RlKAogICAgICAgIGVuY29kZWRDb21wb25lbnQsIDAsIGVuY29kZWRDb21wb25lbnQubGVuZ3RoLCBlbmNvZGluZywgdHJ1ZSk7CiAgfQoKICAvKioKICAgKiBFbmNvZGUgdGhlIHN0cmluZyBbdXJpXSB1c2luZyBwZXJjZW50LWVuY29kaW5nIHRvIG1ha2UgaXQKICAgKiBzYWZlIGZvciBsaXRlcmFsIHVzZSBhcyBhIGZ1bGwgVVJJLgogICAqCiAgICogQWxsIGNoYXJhY3RlcnMgZXhjZXB0IHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlIGxldHRlcnMsIGRpZ2l0cyBhbmQKICAgKiB0aGUgY2hhcmFjdGVycyBgISMkJicoKSorLC0uLzo7PT9AX35gIGFyZSBwZXJjZW50LWVuY29kZWQuIFRoaXMKICAgKiBpcyB0aGUgc2V0IG9mIGNoYXJhY3RlcnMgc3BlY2lmaWVkIGluIGluIEVDTUEtMjYyIHZlcnNpb24gNS4xIGZvcgogICAqIHRoZSBlbmNvZGVVUkkgZnVuY3Rpb24gLgogICAqLwogIHN0YXRpYyBTdHJpbmcgZW5jb2RlRnVsbChTdHJpbmcgdXJpKSB7CiAgICByZXR1cm4gX1VyaS5fdXJpRW5jb2RlKF9VcmkuX2VuY29kZUZ1bGxUYWJsZSwgdXJpLCB1dGY4LCBmYWxzZSk7CiAgfQoKICAvKioKICAgKiBEZWNvZGVzIHRoZSBwZXJjZW50LWVuY29kaW5nIGluIFt1cmldLgogICAqCiAgICogTm90ZSB0aGF0IGRlY29kaW5nIGEgZnVsbCBVUkkgbWlnaHQgY2hhbmdlIGl0cyBtZWFuaW5nIGFzIHNvbWUgb2YKICAgKiB0aGUgZGVjb2RlZCBjaGFyYWN0ZXJzIGNvdWxkIGJlIHJlc2VydmVkIGNoYXJhY3RlcnMuIEluIG1vc3QKICAgKiBjYXNlcyBhbiBlbmNvZGVkIFVSSSBzaG91bGQgYmUgcGFyc2VkIGludG8gY29tcG9uZW50cyB1c2luZwogICAqIFtVcmkucGFyc2VdIGJlZm9yZSBkZWNvZGluZyB0aGUgc2VwYXJhdGUgY29tcG9uZW50cy4KICAgKi8KICBzdGF0aWMgU3RyaW5nIGRlY29kZUZ1bGwoU3RyaW5nIHVyaSkgewogICAgcmV0dXJuIF9VcmkuX3VyaURlY29kZSh1cmksIDAsIHVyaS5sZW5ndGgsIHV0ZjgsIGZhbHNlKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIFtxdWVyeV0gc3BsaXQgaW50byBhIG1hcCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzCiAgICogc3BlY2lmaWVkIGZvciBGT1JNIHBvc3QgaW4gdGhlIFtIVE1MIDQuMDEgc3BlY2lmaWNhdGlvbiBzZWN0aW9uCiAgICogMTcuMTMuNF0oaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9pbnRlcmFjdC9mb3Jtcy5odG1sI2gtMTcuMTMuNCAiSFRNTCA0LjAxIHNlY3Rpb24gMTcuMTMuNCIpLgogICAqIEVhY2gga2V5IGFuZCB2YWx1ZSBpbiB0aGUgcmV0dXJuZWQgbWFwIGhhcyBiZWVuIGRlY29kZWQuIElmIHRoZSBbcXVlcnldCiAgICogaXMgdGhlIGVtcHR5IHN0cmluZyBhbiBlbXB0eSBtYXAgaXMgcmV0dXJuZWQuCiAgICoKICAgKiBLZXlzIGluIHRoZSBxdWVyeSBzdHJpbmcgdGhhdCBoYXZlIG5vIHZhbHVlIGFyZSBtYXBwZWQgdG8gdGhlCiAgICogZW1wdHkgc3RyaW5nLgogICAqCiAgICogRWFjaCBxdWVyeSBjb21wb25lbnQgd2lsbCBiZSBkZWNvZGVkIHVzaW5nIFtlbmNvZGluZ10uIFRoZSBkZWZhdWx0IGVuY29kaW5nCiAgICogaXMgVVRGLTguCiAgICovCiAgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gc3BsaXRRdWVyeVN0cmluZyhTdHJpbmcgcXVlcnksCiAgICAgIHtFbmNvZGluZyBlbmNvZGluZyA9IHV0Zjh9KSB7CiAgICByZXR1cm4gcXVlcnkuc3BsaXQoIiYiKS5mb2xkKHt9LCAobWFwLCBlbGVtZW50KSB7CiAgICAgIGludCBpbmRleCA9IGVsZW1lbnQuaW5kZXhPZigiPSIpOwogICAgICBpZiAoaW5kZXggPT0gLTEpIHsKICAgICAgICBpZiAoZWxlbWVudCAhPSAiIikgewogICAgICAgICAgbWFwW2RlY29kZVF1ZXJ5Q29tcG9uZW50KGVsZW1lbnQsIGVuY29kaW5nOiBlbmNvZGluZyldID0gIiI7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGluZGV4ICE9IDApIHsKICAgICAgICB2YXIga2V5ID0gZWxlbWVudC5zdWJzdHJpbmcoMCwgaW5kZXgpOwogICAgICAgIHZhciB2YWx1ZSA9IGVsZW1lbnQuc3Vic3RyaW5nKGluZGV4ICsgMSk7CiAgICAgICAgbWFwW2RlY29kZVF1ZXJ5Q29tcG9uZW50KGtleSwgZW5jb2Rpbmc6IGVuY29kaW5nKV0gPQogICAgICAgICAgICBkZWNvZGVRdWVyeUNvbXBvbmVudCh2YWx1ZSwgZW5jb2Rpbmc6IGVuY29kaW5nKTsKICAgICAgfQogICAgICByZXR1cm4gbWFwOwogICAgfSk7CiAgfQoKICAvKioKICAgKiBQYXJzZSB0aGUgW2hvc3RdIGFzIGFuIElQIHZlcnNpb24gNCAoSVB2NCkgYWRkcmVzcywgcmV0dXJuaW5nIHRoZSBhZGRyZXNzCiAgICogYXMgYSBsaXN0IG9mIDQgYnl0ZXMgaW4gbmV0d29yayBieXRlIG9yZGVyIChiaWcgZW5kaWFuKS4KICAgKgogICAqIFRocm93cyBhIFtGb3JtYXRFeGNlcHRpb25dIGlmIFtob3N0XSBpcyBub3QgYSB2YWxpZCBJUHY0IGFkZHJlc3MKICAgKiByZXByZXNlbnRhdGlvbi4KICAgKi8KICBzdGF0aWMgTGlzdDxpbnQ+IHBhcnNlSVB2NEFkZHJlc3MoU3RyaW5nIGhvc3QpID0+CiAgICAgIF9wYXJzZUlQdjRBZGRyZXNzKGhvc3QsIDAsIGhvc3QubGVuZ3RoKTsKCiAgLy8vIEltcGxlbWVudGF0aW9uIG9mIFtwYXJzZUlQdjRBZGRyZXNzXSB0aGF0IGNhbiB3b3JrIG9uIGEgc3Vic3RyaW5nLgogIHN0YXRpYyBMaXN0PGludD4gX3BhcnNlSVB2NEFkZHJlc3MoU3RyaW5nIGhvc3QsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgdm9pZCBlcnJvcihTdHJpbmcgbXNnLCBpbnQgcG9zaXRpb24pIHsKICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKCdJbGxlZ2FsIElQdjQgYWRkcmVzcywgJG1zZycsIGhvc3QsIHBvc2l0aW9uKTsKICAgIH0KCiAgICB2YXIgcmVzdWx0ID0gVWludDhMaXN0KDQpOwogICAgaW50IHBhcnRJbmRleCA9IDA7CiAgICBpbnQgcGFydFN0YXJ0ID0gc3RhcnQ7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICBpbnQgY2hhciA9IGhvc3QuY29kZVVuaXRBdChpKTsKICAgICAgaWYgKGNoYXIgIT0gX0RPVCkgewogICAgICAgIGlmIChjaGFyIF4gMHgzMCA+IDkpIHsKICAgICAgICAgIC8vIEZhaWwgb24gYSBub24tZGlnaXQgY2hhcmFjdGVyLgogICAgICAgICAgZXJyb3IoImludmFsaWQgY2hhcmFjdGVyIiwgaSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmIChwYXJ0SW5kZXggPT0gMykgewogICAgICAgICAgZXJyb3IoJ0lQdjQgYWRkcmVzcyBzaG91bGQgY29udGFpbiBleGFjdGx5IDQgcGFydHMnLCBpKTsKICAgICAgICB9CiAgICAgICAgaW50IHBhcnQgPSBpbnQucGFyc2UoaG9zdC5zdWJzdHJpbmcocGFydFN0YXJ0LCBpKSk7CiAgICAgICAgaWYgKHBhcnQgPiAyNTUpIHsKICAgICAgICAgIGVycm9yKCJlYWNoIHBhcnQgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMC4uMjU1IiwgcGFydFN0YXJ0KTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0W3BhcnRJbmRleCsrXSA9IHBhcnQ7CiAgICAgICAgcGFydFN0YXJ0ID0gaSArIDE7CiAgICAgIH0KICAgIH0KCiAgICBpZiAocGFydEluZGV4ICE9IDMpIHsKICAgICAgZXJyb3IoJ0lQdjQgYWRkcmVzcyBzaG91bGQgY29udGFpbiBleGFjdGx5IDQgcGFydHMnLCBlbmQpOwogICAgfQoKICAgIGludCBwYXJ0ID0gaW50LnBhcnNlKGhvc3Quc3Vic3RyaW5nKHBhcnRTdGFydCwgZW5kKSk7CiAgICBpZiAocGFydCA+IDI1NSkgewogICAgICBlcnJvcigiZWFjaCBwYXJ0IG11c3QgYmUgaW4gdGhlIHJhbmdlIDAuLjI1NSIsIHBhcnRTdGFydCk7CiAgICB9CiAgICByZXN1bHRbcGFydEluZGV4XSA9IHBhcnQ7CgogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8qKgogICAqIFBhcnNlIHRoZSBbaG9zdF0gYXMgYW4gSVAgdmVyc2lvbiA2IChJUHY2KSBhZGRyZXNzLCByZXR1cm5pbmcgdGhlIGFkZHJlc3MKICAgKiBhcyBhIGxpc3Qgb2YgMTYgYnl0ZXMgaW4gbmV0d29yayBieXRlIG9yZGVyIChiaWcgZW5kaWFuKS4KICAgKgogICAqIFRocm93cyBhIFtGb3JtYXRFeGNlcHRpb25dIGlmIFtob3N0XSBpcyBub3QgYSB2YWxpZCBJUHY2IGFkZHJlc3MKICAgKiByZXByZXNlbnRhdGlvbi4KICAgKgogICAqIEFjdHMgb24gdGhlIHN1YnN0cmluZyBmcm9tIFtzdGFydF0gdG8gW2VuZF0uIElmIFtlbmRdIGlzIG9taXR0ZWQsIGl0CiAgICogZGVmYXVsdHMgb3QgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgogICAqCiAgICogU29tZSBleGFtcGxlcyBvZiBJUHY2IGFkZHJlc3NlczoKICAgKiAgKiA6OjEKICAgKiAgKiBGRURDOkJBOTg6NzY1NDozMjEwOkZFREM6QkE5ODo3NjU0OjMyMTAKICAgKiAgKiAzZmZlOjJhMDA6MTAwOjcwMzE6OjEKICAgKiAgKiA6OkZGRkY6MTI5LjE0NC41Mi4zOAogICAqICAqIDIwMTA6ODM2Qjo0MTc5Ojo4MzZCOjQxNzkKICAgKi8KICBzdGF0aWMgTGlzdDxpbnQ+IHBhcnNlSVB2NkFkZHJlc3MoU3RyaW5nIGhvc3QsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogICAgZW5kID8/PSBob3N0Lmxlbmd0aDsKICAgIC8vIEFuIElQdjYgYWRkcmVzcyBjb25zaXN0cyBvZiBleGFjdGx5IDggcGFydHMgb2YgMS00IGhleCBkaWdpdHMsIHNlcGFyYXRlZAogICAgLy8gYnkgYDpgJ3MsIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOgogICAgLy8KICAgIC8vICAtIE9uZSAoYW5kIG9ubHkgb25lKSB3aWxkY2FyZCAoYDo6YCkgbWF5IGJlIHByZXNlbnQsIHJlcHJlc2VudGluZyBhIGZpbGwKICAgIC8vICAgIG9mIDAncy4gVGhlIElQdjYgYDo6YCBpcyB0aHVzIDE2IGJ5dGVzIG9mIGAwYC4KICAgIC8vICAtIFRoZSBsYXN0IHR3byBwYXJ0cyBtYXkgYmUgcmVwbGFjZWQgYnkgYW4gSVB2NCAiZG90dGVkLXF1YWQiIGFkZHJlc3MuCgogICAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciByZXBvcnRpbmcgYSBiYWRseSBmb3JtYXR0ZWQgSVB2NiBhZGRyZXNzLgogICAgdm9pZCBlcnJvcihTdHJpbmcgbXNnLCBbcG9zaXRpb25dKSB7CiAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbignSWxsZWdhbCBJUHY2IGFkZHJlc3MsICRtc2cnLCBob3N0LCBwb3NpdGlvbik7CiAgICB9CgogICAgLy8gUGFyc2UgYSBoZXggYmxvY2suCiAgICBpbnQgcGFyc2VIZXgoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICAgIGlmIChlbmQgLSBzdGFydCA+IDQpIHsKICAgICAgICBlcnJvcignYW4gSVB2NiBwYXJ0IGNhbiBvbmx5IGNvbnRhaW4gYSBtYXhpbXVtIG9mIDQgaGV4IGRpZ2l0cycsIHN0YXJ0KTsKICAgICAgfQogICAgICBpbnQgdmFsdWUgPSBpbnQucGFyc2UoaG9zdC5zdWJzdHJpbmcoc3RhcnQsIGVuZCksIHJhZGl4OiAxNik7CiAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiAweEZGRkYpIHsKICAgICAgICBlcnJvcignZWFjaCBwYXJ0IG11c3QgYmUgaW4gdGhlIHJhbmdlIG9mIGAweDAuLjB4RkZGRmAnLCBzdGFydCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQoKICAgIGlmIChob3N0Lmxlbmd0aCA8IDIpIGVycm9yKCdhZGRyZXNzIGlzIHRvbyBzaG9ydCcpOwogICAgTGlzdDxpbnQ+IHBhcnRzID0gW107CiAgICBib29sIHdpbGRjYXJkU2VlbiA9IGZhbHNlOwogICAgLy8gU2V0IGlmIHNlZWluZyBhICIuIiwgc3VnZ2VzdGluZyB0aGF0IHRoZXJlIGlzIGFuIElQdjQgYWRkcmVzcy4KICAgIGJvb2wgc2VlbkRvdCA9IGZhbHNlOwogICAgaW50IHBhcnRTdGFydCA9IHN0YXJ0OwogICAgLy8gUGFyc2UgYWxsIHBhcnRzLCBleGNlcHQgYSBwb3RlbnRpYWwgbGFzdCBvbmUuCiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICBpbnQgY2hhciA9IGhvc3QuY29kZVVuaXRBdChpKTsKICAgICAgaWYgKGNoYXIgPT0gX0NPTE9OKSB7CiAgICAgICAgaWYgKGkgPT0gc3RhcnQpIHsKICAgICAgICAgIC8vIElmIHdlIHNlZSBhIGA6YCBpbiB0aGUgYmVnaW5uaW5nLCBleHBlY3Qgd2lsZGNhcmQuCiAgICAgICAgICBpKys7CiAgICAgICAgICBpZiAoaG9zdC5jb2RlVW5pdEF0KGkpICE9IF9DT0xPTikgewogICAgICAgICAgICBlcnJvcignaW52YWxpZCBzdGFydCBjb2xvbi4nLCBpKTsKICAgICAgICAgIH0KICAgICAgICAgIHBhcnRTdGFydCA9IGk7CiAgICAgICAgfQogICAgICAgIGlmIChpID09IHBhcnRTdGFydCkgewogICAgICAgICAgLy8gV2lsZGNhcmQuIFdlIG9ubHkgYWxsb3cgb25lLgogICAgICAgICAgaWYgKHdpbGRjYXJkU2VlbikgewogICAgICAgICAgICBlcnJvcignb25seSBvbmUgd2lsZGNhcmQgYDo6YCBpcyBhbGxvd2VkJywgaSk7CiAgICAgICAgICB9CiAgICAgICAgICB3aWxkY2FyZFNlZW4gPSB0cnVlOwogICAgICAgICAgcGFydHMuYWRkKC0xKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gRm91bmQgYSBzaW5nbGUgY29sb24uIFBhcnNlIFtwYXJ0U3RhcnQuLmldIGFzIGEgaGV4IGVudHJ5LgogICAgICAgICAgcGFydHMuYWRkKHBhcnNlSGV4KHBhcnRTdGFydCwgaSkpOwogICAgICAgIH0KICAgICAgICBwYXJ0U3RhcnQgPSBpICsgMTsKICAgICAgfSBlbHNlIGlmIChjaGFyID09IF9ET1QpIHsKICAgICAgICBzZWVuRG90ID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgaWYgKHBhcnRzLmxlbmd0aCA9PSAwKSBlcnJvcigndG9vIGZldyBwYXJ0cycpOwogICAgYm9vbCBhdEVuZCA9IChwYXJ0U3RhcnQgPT0gZW5kKTsKICAgIGJvb2wgaXNMYXN0V2lsZGNhcmQgPSAocGFydHMubGFzdCA9PSAtMSk7CiAgICBpZiAoYXRFbmQgJiYgIWlzTGFzdFdpbGRjYXJkKSB7CiAgICAgIGVycm9yKCdleHBlY3RlZCBhIHBhcnQgYWZ0ZXIgbGFzdCBgOmAnLCBlbmQpOwogICAgfQogICAgaWYgKCFhdEVuZCkgewogICAgICBpZiAoIXNlZW5Eb3QpIHsKICAgICAgICBwYXJ0cy5hZGQocGFyc2VIZXgocGFydFN0YXJ0LCBlbmQpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBMaXN0PGludD4gbGFzdCA9IF9wYXJzZUlQdjRBZGRyZXNzKGhvc3QsIHBhcnRTdGFydCwgZW5kKTsKICAgICAgICBwYXJ0cy5hZGQobGFzdFswXSA8PCA4IHwgbGFzdFsxXSk7CiAgICAgICAgcGFydHMuYWRkKGxhc3RbMl0gPDwgOCB8IGxhc3RbM10pOwogICAgICB9CiAgICB9CiAgICBpZiAod2lsZGNhcmRTZWVuKSB7CiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiA3KSB7CiAgICAgICAgZXJyb3IoJ2FuIGFkZHJlc3Mgd2l0aCBhIHdpbGRjYXJkIG11c3QgaGF2ZSBsZXNzIHRoYW4gNyBwYXJ0cycpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHBhcnRzLmxlbmd0aCAhPSA4KSB7CiAgICAgIGVycm9yKCdhbiBhZGRyZXNzIHdpdGhvdXQgYSB3aWxkY2FyZCBtdXN0IGNvbnRhaW4gZXhhY3RseSA4IHBhcnRzJyk7CiAgICB9CiAgICBMaXN0PGludD4gYnl0ZXMgPSBVaW50OExpc3QoMTYpOwogICAgZm9yIChpbnQgaSA9IDAsIGluZGV4ID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGludCB2YWx1ZSA9IHBhcnRzW2ldOwogICAgICBpZiAodmFsdWUgPT0gLTEpIHsKICAgICAgICBpbnQgd2lsZENhcmRMZW5ndGggPSA5IC0gcGFydHMubGVuZ3RoOwogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgd2lsZENhcmRMZW5ndGg7IGorKykgewogICAgICAgICAgYnl0ZXNbaW5kZXhdID0gMDsKICAgICAgICAgIGJ5dGVzW2luZGV4ICsgMV0gPSAwOwogICAgICAgICAgaW5kZXggKz0gMjsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnl0ZXNbaW5kZXhdID0gdmFsdWUgPj4gODsKICAgICAgICBieXRlc1tpbmRleCArIDFdID0gdmFsdWUgJiAweGZmOwogICAgICAgIGluZGV4ICs9IDI7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBieXRlczsKICB9Cn0KCmNsYXNzIF9VcmkgaW1wbGVtZW50cyBVcmkgewogIC8vIFdlIHJlcHJlc2VudCB0aGUgbWlzc2luZyBzY2hlbWUgYXMgYW4gZW1wdHkgc3RyaW5nLgogIC8vIEEgdmFsaWQgc2NoZW1lIGNhbm5vdCBiZSBlbXB0eS4KICBmaW5hbCBTdHJpbmcgc2NoZW1lOwoKICAvKioKICAgKiBUaGUgdXNlci1pbmZvIHBhcnQgb2YgdGhlIGF1dGhvcml0eS4KICAgKgogICAqIERvZXMgbm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gYW4gZW1wdHkgdXNlci1pbmZvIGFuZCBhbiBhYnNlbnQgb25lLgogICAqIFRoZSB2YWx1ZSBpcyBhbHdheXMgbm9uLW51bGwuCiAgICogSXMgY29uc2lkZXJlZCBhYnNlbnQgaWYgW19ob3N0XSBpcyBgbnVsbGAuCiAgICovCiAgZmluYWwgU3RyaW5nIF91c2VySW5mbzsKCiAgLyoqCiAgICogVGhlIGhvc3QgbmFtZSBvZiB0aGUgVVJJLgogICAqCiAgICogU2V0IHRvIGBudWxsYCBpZiB0aGVyZSBpcyBubyBhdXRob3JpdHkgaW4gdGhlIFVSSS4KICAgKiBUaGUgaG9zdCBuYW1lIGlzIHRoZSBvbmx5IG1hbmRhdG9yeSBwYXJ0IG9mIGFuIGF1dGhvcml0eSwgc28gd2UgdXNlCiAgICogaXQgdG8gbWFyayB3aGV0aGVyIGFuIGF1dGhvcml0eSBwYXJ0IHdhcyBwcmVzZW50IG9yIG5vdC4KICAgKi8KICBmaW5hbCBTdHJpbmcgX2hvc3Q7CgogIC8qKgogICAqIFRoZSBwb3J0IG51bWJlciBwYXJ0IG9mIHRoZSBhdXRob3JpdHkuCiAgICoKICAgKiBUaGUgcG9ydC4gU2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gcG9ydC4gTm9ybWFsaXplZCB0byBudWxsIGlmCiAgICogdGhlIHBvcnQgaXMgdGhlIGRlZmF1bHQgcG9ydCBmb3IgdGhlIHNjaGVtZS4KICAgKi8KICBpbnQgX3BvcnQ7CgogIC8qKgogICAqIFRoZSBwYXRoIG9mIHRoZSBVUkkuCiAgICoKICAgKiBBbHdheXMgbm9uLW51bGwuCiAgICovCiAgZmluYWwgU3RyaW5nIHBhdGg7CgogIC8vIFRoZSBxdWVyeSBjb250ZW50LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIHF1ZXJ5LgogIGZpbmFsIFN0cmluZyBfcXVlcnk7CgogIC8vIFRoZSBmcmFnbWVudCBjb250ZW50LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIGZyYWdtZW50LgogIGZpbmFsIFN0cmluZyBfZnJhZ21lbnQ7CgogIC8qKgogICAqIENhY2hlIHRoZSBjb21wdXRlZCByZXR1cm4gdmFsdWUgb2YgW3BhdGhTZWdtZW50c10uCiAgICovCiAgTGlzdDxTdHJpbmc+IF9wYXRoU2VnbWVudHM7CgogIC8qKgogICAqIENhY2hlIG9mIHRoZSBmdWxsIG5vcm1hbGl6ZWQgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgVVJJLgogICAqLwogIFN0cmluZyBfdGV4dDsKCiAgLyoqCiAgICogQ2FjaGUgb2YgdGhlIGhhc2hDb2RlIG9mIFtfdGV4dF0uCiAgICoKICAgKiBJcyBudWxsIHVudGlsIGNvbXB1dGVkLgogICAqLwogIGludCBfaGFzaENvZGVDYWNoZTsKCiAgLyoqCiAgICogQ2FjaGUgdGhlIGNvbXB1dGVkIHJldHVybiB2YWx1ZSBvZiBbcXVlcnlQYXJhbWV0ZXJzXS4KICAgKi8KICBNYXA8U3RyaW5nLCBTdHJpbmc+IF9xdWVyeVBhcmFtZXRlcnM7CiAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBfcXVlcnlQYXJhbWV0ZXJMaXN0czsKCiAgLy8vIEludGVybmFsIG5vbi12ZXJpZnlpbmcgY29uc3RydWN0b3IuIE9ubHkgY2FsbCB3aXRoIHZhbGlkYXRlZCBhcmd1bWVudHMuCiAgLy8vCiAgLy8vIFRoZSBjb21wb25lbnRzIG11c3QgYmUgcHJvcGVybHkgbm9ybWFsaXplZC4KICAvLy8KICAvLy8gVXNlIGBudWxsYCBmb3IgW19ob3N0XSBpZiB0aGVyZSBpcyBubyBhdXRob3JpdHkuIEluIHRoYXQgY2FzZSwgYWx3YXlzCiAgLy8vIHBhc3MgYG51bGxgIGZvciBbX3BvcnRdIGFuZCBbX3VzZXJJbmZvXSBhcyB3ZWxsLgogIC8vLwogIC8vLyBVc2UgYG51bGxgIGZvciBbX3BvcnRdLCBbX3VzZXJJbmZvXSwgW19xdWVyeV0gYW5kIFtfZnJhZ21lbnRdIGlmIHRoZXJlIGlzCiAgLy8vIGNvbXBvbmVudCBvZiB0aGF0IHR5cGUuCiAgLy8vCiAgLy8vIFRoZSBbcGF0aF0gYW5kIFtzY2hlbWVdIGFyZSBuZXZlciBlbXB0eS4KICBfVXJpLl9pbnRlcm5hbCh0aGlzLnNjaGVtZSwgdGhpcy5fdXNlckluZm8sIHRoaXMuX2hvc3QsIHRoaXMuX3BvcnQsIHRoaXMucGF0aCwKICAgICAgdGhpcy5fcXVlcnksIHRoaXMuX2ZyYWdtZW50KTsKCiAgLy8vIENyZWF0ZSBhIFtfVXJpXSBmcm9tIHBhcnRzIG9mIFt1cmldLgogIC8vLwogIC8vLyBUaGUgcGFyYW1ldGVycyBzcGVjaWZ5IHRoZSBzdGFydC9lbmQgb2YgcGFydGljdWxhciBjb21wb25lbnRzIG9mIHRoZSBVUkkuCiAgLy8vIFRoZSBbc2NoZW1lXSBtYXkgY29udGFpbiBhIHN0cmluZyByZXByZXNlbnRpbmcgYSBub3JtYWxpemVkIHNjaGVtZQogIC8vLyBjb21wb25lbnQgaWYgb25lIGhhcyBhbHJlYWR5IGJlZW4gZGlzY292ZXJlZC4KICBmYWN0b3J5IF9Vcmkubm90U2ltcGxlKAogICAgICBTdHJpbmcgdXJpLAogICAgICBpbnQgc3RhcnQsCiAgICAgIGludCBlbmQsCiAgICAgIGludCBzY2hlbWVFbmQsCiAgICAgIGludCBob3N0U3RhcnQsCiAgICAgIGludCBwb3J0U3RhcnQsCiAgICAgIGludCBwYXRoU3RhcnQsCiAgICAgIGludCBxdWVyeVN0YXJ0LAogICAgICBpbnQgZnJhZ21lbnRTdGFydCwKICAgICAgU3RyaW5nIHNjaGVtZSkgewogICAgaWYgKHNjaGVtZSA9PSBudWxsKSB7CiAgICAgIHNjaGVtZSA9ICIiOwogICAgICBpZiAoc2NoZW1lRW5kID4gc3RhcnQpIHsKICAgICAgICBzY2hlbWUgPSBfbWFrZVNjaGVtZSh1cmksIHN0YXJ0LCBzY2hlbWVFbmQpOwogICAgICB9IGVsc2UgaWYgKHNjaGVtZUVuZCA9PSBzdGFydCkgewogICAgICAgIF9mYWlsKHVyaSwgc3RhcnQsICJJbnZhbGlkIGVtcHR5IHNjaGVtZSIpOwogICAgICB9CiAgICB9CiAgICBTdHJpbmcgdXNlckluZm8gPSAiIjsKICAgIFN0cmluZyBob3N0OwogICAgaW50IHBvcnQ7CiAgICBpZiAoaG9zdFN0YXJ0ID4gc3RhcnQpIHsKICAgICAgaW50IHVzZXJJbmZvU3RhcnQgPSBzY2hlbWVFbmQgKyAzOwogICAgICBpZiAodXNlckluZm9TdGFydCA8IGhvc3RTdGFydCkgewogICAgICAgIHVzZXJJbmZvID0gX21ha2VVc2VySW5mbyh1cmksIHVzZXJJbmZvU3RhcnQsIGhvc3RTdGFydCAtIDEpOwogICAgICB9CiAgICAgIGhvc3QgPSBfbWFrZUhvc3QodXJpLCBob3N0U3RhcnQsIHBvcnRTdGFydCwgZmFsc2UpOwogICAgICBpZiAocG9ydFN0YXJ0ICsgMSA8IHBhdGhTdGFydCkgewogICAgICAgIC8vIFNob3VsZCB0aHJvdyBiZWNhdXNlIGludmFsaWQuCiAgICAgICAgcG9ydCA9IGludC5wYXJzZSh1cmkuc3Vic3RyaW5nKHBvcnRTdGFydCArIDEsIHBhdGhTdGFydCksIG9uRXJyb3I6IChfKSB7CiAgICAgICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgcG9ydCIsIHVyaSwgcG9ydFN0YXJ0ICsgMSk7CiAgICAgICAgfSk7CiAgICAgICAgcG9ydCA9IF9tYWtlUG9ydChwb3J0LCBzY2hlbWUpOwogICAgICB9CiAgICB9CiAgICBTdHJpbmcgcGF0aCA9CiAgICAgICAgX21ha2VQYXRoKHVyaSwgcGF0aFN0YXJ0LCBxdWVyeVN0YXJ0LCBudWxsLCBzY2hlbWUsIGhvc3QgIT0gbnVsbCk7CiAgICBTdHJpbmcgcXVlcnk7CiAgICBpZiAocXVlcnlTdGFydCA8IGZyYWdtZW50U3RhcnQpIHsKICAgICAgcXVlcnkgPSBfbWFrZVF1ZXJ5KHVyaSwgcXVlcnlTdGFydCArIDEsIGZyYWdtZW50U3RhcnQsIG51bGwpOwogICAgfQogICAgU3RyaW5nIGZyYWdtZW50OwogICAgaWYgKGZyYWdtZW50U3RhcnQgPCBlbmQpIHsKICAgICAgZnJhZ21lbnQgPSBfbWFrZUZyYWdtZW50KHVyaSwgZnJhZ21lbnRTdGFydCArIDEsIGVuZCk7CiAgICB9CiAgICByZXR1cm4gX1VyaS5faW50ZXJuYWwoc2NoZW1lLCB1c2VySW5mbywgaG9zdCwgcG9ydCwgcGF0aCwgcXVlcnksIGZyYWdtZW50KTsKICB9CgogIC8vLyBJbXBsZW1lbnRhdGlvbiBvZiBbVXJpLlVyaV0uCiAgZmFjdG9yeSBfVXJpKAogICAgICB7U3RyaW5nIHNjaGVtZSwKICAgICAgU3RyaW5nIHVzZXJJbmZvLAogICAgICBTdHJpbmcgaG9zdCwKICAgICAgaW50IHBvcnQsCiAgICAgIFN0cmluZyBwYXRoLAogICAgICBJdGVyYWJsZTxTdHJpbmc+IHBhdGhTZWdtZW50cywKICAgICAgU3RyaW5nIHF1ZXJ5LAogICAgICBNYXA8U3RyaW5nLCBkeW5hbWljIC8qU3RyaW5nfEl0ZXJhYmxlPFN0cmluZz4qLyA+IHF1ZXJ5UGFyYW1ldGVycywKICAgICAgU3RyaW5nIGZyYWdtZW50fSkgewogICAgc2NoZW1lID0gX21ha2VTY2hlbWUoc2NoZW1lLCAwLCBfc3RyaW5nT3JOdWxsTGVuZ3RoKHNjaGVtZSkpOwogICAgdXNlckluZm8gPSBfbWFrZVVzZXJJbmZvKHVzZXJJbmZvLCAwLCBfc3RyaW5nT3JOdWxsTGVuZ3RoKHVzZXJJbmZvKSk7CiAgICBob3N0ID0gX21ha2VIb3N0KGhvc3QsIDAsIF9zdHJpbmdPck51bGxMZW5ndGgoaG9zdCksIGZhbHNlKTsKICAgIC8vIFNwZWNpYWwgY2FzZSB0aGlzIGNvbnN0cnVjdG9yIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAgIGlmIChxdWVyeSA9PSAiIikgcXVlcnkgPSBudWxsOwogICAgcXVlcnkgPSBfbWFrZVF1ZXJ5KHF1ZXJ5LCAwLCBfc3RyaW5nT3JOdWxsTGVuZ3RoKHF1ZXJ5KSwgcXVlcnlQYXJhbWV0ZXJzKTsKICAgIGZyYWdtZW50ID0gX21ha2VGcmFnbWVudChmcmFnbWVudCwgMCwgX3N0cmluZ09yTnVsbExlbmd0aChmcmFnbWVudCkpOwogICAgcG9ydCA9IF9tYWtlUG9ydChwb3J0LCBzY2hlbWUpOwogICAgYm9vbCBpc0ZpbGUgPSAoc2NoZW1lID09ICJmaWxlIik7CiAgICBpZiAoaG9zdCA9PSBudWxsICYmICh1c2VySW5mby5pc05vdEVtcHR5IHx8IHBvcnQgIT0gbnVsbCB8fCBpc0ZpbGUpKSB7CiAgICAgIGhvc3QgPSAiIjsKICAgIH0KICAgIGJvb2wgaGFzQXV0aG9yaXR5ID0gKGhvc3QgIT0gbnVsbCk7CiAgICBwYXRoID0gX21ha2VQYXRoKAogICAgICAgIHBhdGgsIDAsIF9zdHJpbmdPck51bGxMZW5ndGgocGF0aCksIHBhdGhTZWdtZW50cywgc2NoZW1lLCBoYXNBdXRob3JpdHkpOwogICAgaWYgKHNjaGVtZS5pc0VtcHR5ICYmIGhvc3QgPT0gbnVsbCAmJiAhcGF0aC5zdGFydHNXaXRoKCcvJykpIHsKICAgICAgYm9vbCBhbGxvd1NjaGVtZSA9IHNjaGVtZS5pc05vdEVtcHR5IHx8IGhvc3QgIT0gbnVsbDsKICAgICAgcGF0aCA9IF9ub3JtYWxpemVSZWxhdGl2ZVBhdGgocGF0aCwgYWxsb3dTY2hlbWUpOwogICAgfSBlbHNlIHsKICAgICAgcGF0aCA9IF9yZW1vdmVEb3RTZWdtZW50cyhwYXRoKTsKICAgIH0KICAgIGlmIChob3N0ID09IG51bGwgJiYgcGF0aC5zdGFydHNXaXRoKCIvLyIpKSB7CiAgICAgIGhvc3QgPSAiIjsKICAgIH0KICAgIHJldHVybiBfVXJpLl9pbnRlcm5hbChzY2hlbWUsIHVzZXJJbmZvLCBob3N0LCBwb3J0LCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQpOwogIH0KCiAgLy8vIEltcGxlbWVudGF0aW9uIG9mIFtVcmkuaHR0cF0uCiAgZmFjdG9yeSBfVXJpLmh0dHAoU3RyaW5nIGF1dGhvcml0eSwgU3RyaW5nIHVuZW5jb2RlZFBhdGgsCiAgICAgIFtNYXA8U3RyaW5nLCBTdHJpbmc+IHF1ZXJ5UGFyYW1ldGVyc10pIHsKICAgIHJldHVybiBfbWFrZUh0dHBVcmkoImh0dHAiLCBhdXRob3JpdHksIHVuZW5jb2RlZFBhdGgsIHF1ZXJ5UGFyYW1ldGVycyk7CiAgfQoKICAvLy8gSW1wbGVtZW50YXRpb24gb2YgW1VyaS5odHRwc10uCiAgZmFjdG9yeSBfVXJpLmh0dHBzKFN0cmluZyBhdXRob3JpdHksIFN0cmluZyB1bmVuY29kZWRQYXRoLAogICAgICBbTWFwPFN0cmluZywgU3RyaW5nPiBxdWVyeVBhcmFtZXRlcnNdKSB7CiAgICByZXR1cm4gX21ha2VIdHRwVXJpKCJodHRwcyIsIGF1dGhvcml0eSwgdW5lbmNvZGVkUGF0aCwgcXVlcnlQYXJhbWV0ZXJzKTsKICB9CgogIFN0cmluZyBnZXQgYXV0aG9yaXR5IHsKICAgIGlmICghaGFzQXV0aG9yaXR5KSByZXR1cm4gIiI7CiAgICB2YXIgc2IgPSBTdHJpbmdCdWZmZXIoKTsKICAgIF93cml0ZUF1dGhvcml0eShzYik7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIFN0cmluZyBnZXQgdXNlckluZm8gPT4gX3VzZXJJbmZvOwoKICBTdHJpbmcgZ2V0IGhvc3QgewogICAgaWYgKF9ob3N0ID09IG51bGwpIHJldHVybiAiIjsKICAgIGlmIChfaG9zdC5zdGFydHNXaXRoKCdbJykpIHsKICAgICAgcmV0dXJuIF9ob3N0LnN1YnN0cmluZygxLCBfaG9zdC5sZW5ndGggLSAxKTsKICAgIH0KICAgIHJldHVybiBfaG9zdDsKICB9CgogIGludCBnZXQgcG9ydCB7CiAgICBpZiAoX3BvcnQgPT0gbnVsbCkgcmV0dXJuIF9kZWZhdWx0UG9ydChzY2hlbWUpOwogICAgcmV0dXJuIF9wb3J0OwogIH0KCiAgLy8gVGhlIGRlZmF1bHQgcG9ydCBmb3IgdGhlIHNjaGVtZSBvZiB0aGlzIFVyaS4KICBzdGF0aWMgaW50IF9kZWZhdWx0UG9ydChTdHJpbmcgc2NoZW1lKSB7CiAgICBpZiAoc2NoZW1lID09ICJodHRwIikgcmV0dXJuIDgwOwogICAgaWYgKHNjaGVtZSA9PSAiaHR0cHMiKSByZXR1cm4gNDQzOwogICAgcmV0dXJuIDA7CiAgfQoKICBTdHJpbmcgZ2V0IHF1ZXJ5ID0+IF9xdWVyeSA/PyAiIjsKCiAgU3RyaW5nIGdldCBmcmFnbWVudCA9PiBfZnJhZ21lbnQgPz8gIiI7CgogIGJvb2wgaXNTY2hlbWUoU3RyaW5nIHNjaGVtZSkgewogICAgU3RyaW5nIHRoaXNTY2hlbWUgPSB0aGlzLnNjaGVtZTsKICAgIGlmIChzY2hlbWUgPT0gbnVsbCkgcmV0dXJuIHRoaXNTY2hlbWUuaXNFbXB0eTsKICAgIGlmIChzY2hlbWUubGVuZ3RoICE9IHRoaXNTY2hlbWUubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gX2NvbXBhcmVTY2hlbWUoc2NoZW1lLCB0aGlzU2NoZW1lKTsKICB9CgogIC8vLyBDb21wYXJlcyBzY2hlbWUgY2hhcmFjdGVycyBpbiBbc2NoZW1lXSBhbmQgYXQgdGhlIHN0YXJ0IG9mIFt1cmldLgogIC8vLwogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbc2NoZW1lXSByZXByZXNlbnRzIHRoZSBzYW1lIHNjaGVtZSBhcyB0aGUgc3RhcnQgb2YKICAvLy8gW3VyaV0uIFRoYXQgbWVhbnMgaGF2aW5nIHRoZSBzYW1lIGNoYXJhY3RlcnMsIGJ1dCBwb3NzaWJseSBkaWZmZXJlbnQgY2FzZQogIC8vLyBmb3IgbGV0dGVycy4KICAvLy8KICAvLy8gVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIHRoYXQgdGhlIGNoYXJhY3RlcnMgYXJlIHZhbGlkIFVSSSBzY2hlbWUKICAvLy8gY2hhcmFjdGVycy4gVGhlIFt1cmldIGlzIGFzc3VtZWQgdG8gYmUgdmFsaWQsIHNvIGlmIFtzY2hlbWVdIG1hdGNoZXMKICAvLy8gaXQsIGl0IGhhcyB0byBiZSB2YWxpZCB0b28uCiAgLy8vCiAgLy8vIFRoZSBsZW5ndGggc2hvdWxkIGJlIHRlc3RlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLAogIC8vLyBzbyB0aGUgc2NoZW1lIHBhcnQgb2YgW3VyaV0gaXMga25vd24gdG8gaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgW3NjaGVtZV0uCiAgc3RhdGljIGJvb2wgX2NvbXBhcmVTY2hlbWUoU3RyaW5nIHNjaGVtZSwgU3RyaW5nIHVyaSkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWUubGVuZ3RoOyBpKyspIHsKICAgICAgaW50IHNjaGVtZUNoYXIgPSBzY2hlbWUuY29kZVVuaXRBdChpKTsKICAgICAgaW50IHVyaUNoYXIgPSB1cmkuY29kZVVuaXRBdChpKTsKICAgICAgaW50IGRlbHRhID0gc2NoZW1lQ2hhciBeIHVyaUNoYXI7CiAgICAgIGlmIChkZWx0YSAhPSAwKSB7CiAgICAgICAgaWYgKGRlbHRhID09IDB4MjApIHsKICAgICAgICAgIC8vIE1pZ2h0IGJlIGEgY2FzZSBkaWZmZXJlbmNlLgogICAgICAgICAgaW50IGxvd2VyQ2hhciA9IHVyaUNoYXIgfCBkZWx0YTsKICAgICAgICAgIGlmICgweDYxIC8qYSovIDw9IGxvd2VyQ2hhciAmJiBsb3dlckNoYXIgPD0gMHg3YSAvKnoqLykgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8vIFJlcG9ydCBhIHBhcnNlIGZhaWx1cmUuCiAgc3RhdGljIHZvaWQgX2ZhaWwoU3RyaW5nIHVyaSwgaW50IGluZGV4LCBTdHJpbmcgbWVzc2FnZSkgewogICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKG1lc3NhZ2UsIHVyaSwgaW5kZXgpOwogIH0KCiAgc3RhdGljIFVyaSBfbWFrZUh0dHBVcmkoU3RyaW5nIHNjaGVtZSwgU3RyaW5nIGF1dGhvcml0eSwgU3RyaW5nIHVuZW5jb2RlZFBhdGgsCiAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcXVlcnlQYXJhbWV0ZXJzKSB7CiAgICB2YXIgdXNlckluZm8gPSAiIjsKICAgIFN0cmluZyBob3N0OwogICAgaW50IHBvcnQ7CgogICAgaWYgKGF1dGhvcml0eSAhPSBudWxsICYmIGF1dGhvcml0eS5pc05vdEVtcHR5KSB7CiAgICAgIHZhciBob3N0U3RhcnQgPSAwOwogICAgICAvLyBTcGxpdCBvZmYgdGhlIHVzZXIgaW5mby4KICAgICAgYm9vbCBoYXNVc2VySW5mbyA9IGZhbHNlOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF1dGhvcml0eS5sZW5ndGg7IGkrKykgewogICAgICAgIGNvbnN0IGludCBhdFNpZ24gPSAweDQwOwogICAgICAgIGlmIChhdXRob3JpdHkuY29kZVVuaXRBdChpKSA9PSBhdFNpZ24pIHsKICAgICAgICAgIGhhc1VzZXJJbmZvID0gdHJ1ZTsKICAgICAgICAgIHVzZXJJbmZvID0gYXV0aG9yaXR5LnN1YnN0cmluZygwLCBpKTsKICAgICAgICAgIGhvc3RTdGFydCA9IGkgKyAxOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciBob3N0RW5kID0gaG9zdFN0YXJ0OwogICAgICBpZiAoaG9zdFN0YXJ0IDwgYXV0aG9yaXR5Lmxlbmd0aCAmJgogICAgICAgICAgYXV0aG9yaXR5LmNvZGVVbml0QXQoaG9zdFN0YXJ0KSA9PSBfTEVGVF9CUkFDS0VUKSB7CiAgICAgICAgLy8gSVB2NiBob3N0LgogICAgICAgIGZvciAoOyBob3N0RW5kIDwgYXV0aG9yaXR5Lmxlbmd0aDsgaG9zdEVuZCsrKSB7CiAgICAgICAgICBpZiAoYXV0aG9yaXR5LmNvZGVVbml0QXQoaG9zdEVuZCkgPT0gX1JJR0hUX0JSQUNLRVQpIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoaG9zdEVuZCA9PSBhdXRob3JpdHkubGVuZ3RoKSB7CiAgICAgICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAgICAgIkludmFsaWQgSVB2NiBob3N0IGVudHJ5LiIsIGF1dGhvcml0eSwgaG9zdFN0YXJ0KTsKICAgICAgICB9CiAgICAgICAgVXJpLnBhcnNlSVB2NkFkZHJlc3MoYXV0aG9yaXR5LCBob3N0U3RhcnQgKyAxLCBob3N0RW5kKTsKICAgICAgICBob3N0RW5kKys7IC8vIFNraXAgdGhlIGNsb3NpbmcgYnJhY2tldC4KICAgICAgICBpZiAoaG9zdEVuZCAhPSBhdXRob3JpdHkubGVuZ3RoICYmCiAgICAgICAgICAgIGF1dGhvcml0eS5jb2RlVW5pdEF0KGhvc3RFbmQpICE9IF9DT0xPTikgewogICAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKCJJbnZhbGlkIGVuZCBvZiBhdXRob3JpdHkiLCBhdXRob3JpdHksIGhvc3RFbmQpOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBTcGxpdCBob3N0IGFuZCBwb3J0LgogICAgICBib29sIGhhc1BvcnQgPSBmYWxzZTsKICAgICAgZm9yICg7IGhvc3RFbmQgPCBhdXRob3JpdHkubGVuZ3RoOyBob3N0RW5kKyspIHsKICAgICAgICBpZiAoYXV0aG9yaXR5LmNvZGVVbml0QXQoaG9zdEVuZCkgPT0gX0NPTE9OKSB7CiAgICAgICAgICB2YXIgcG9ydFN0cmluZyA9IGF1dGhvcml0eS5zdWJzdHJpbmcoaG9zdEVuZCArIDEpOwogICAgICAgICAgLy8gV2UgYWxsb3cgdGhlIGVtcHR5IHBvcnQgLSBmYWxsaW5nIGJhY2sgdG8gaW5pdGlhbCB2YWx1ZS4KICAgICAgICAgIGlmIChwb3J0U3RyaW5nLmlzTm90RW1wdHkpIHBvcnQgPSBpbnQucGFyc2UocG9ydFN0cmluZyk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaG9zdCA9IGF1dGhvcml0eS5zdWJzdHJpbmcoaG9zdFN0YXJ0LCBob3N0RW5kKTsKICAgIH0KICAgIHJldHVybiBVcmkoCiAgICAgICAgc2NoZW1lOiBzY2hlbWUsCiAgICAgICAgdXNlckluZm86IHVzZXJJbmZvLAogICAgICAgIGhvc3Q6IGhvc3QsCiAgICAgICAgcG9ydDogcG9ydCwKICAgICAgICBwYXRoU2VnbWVudHM6IHVuZW5jb2RlZFBhdGguc3BsaXQoIi8iKSwKICAgICAgICBxdWVyeVBhcmFtZXRlcnM6IHF1ZXJ5UGFyYW1ldGVycyk7CiAgfQoKICAvLy8gSW1wbGVtZW50YXRpb24gb2YgW1VyaS5maWxlXS4KICBmYWN0b3J5IF9VcmkuZmlsZShTdHJpbmcgcGF0aCwge2Jvb2wgd2luZG93c30pIHsKICAgIHdpbmRvd3MgPSAod2luZG93cyA9PSBudWxsKSA/IF9VcmkuX2lzV2luZG93cyA6IHdpbmRvd3M7CiAgICByZXR1cm4gd2luZG93cwogICAgICAgID8gX21ha2VXaW5kb3dzRmlsZVVybChwYXRoLCBmYWxzZSkKICAgICAgICA6IF9tYWtlRmlsZVVyaShwYXRoLCBmYWxzZSk7CiAgfQoKICAvLy8gSW1wbGVtZW50YXRpb24gb2YgW1VyaS5kaXJlY3RvcnldLgogIGZhY3RvcnkgX1VyaS5kaXJlY3RvcnkoU3RyaW5nIHBhdGgsIHtib29sIHdpbmRvd3N9KSB7CiAgICB3aW5kb3dzID0gKHdpbmRvd3MgPT0gbnVsbCkgPyBfVXJpLl9pc1dpbmRvd3MgOiB3aW5kb3dzOwogICAgcmV0dXJuIHdpbmRvd3MgPyBfbWFrZVdpbmRvd3NGaWxlVXJsKHBhdGgsIHRydWUpIDogX21ha2VGaWxlVXJpKHBhdGgsIHRydWUpOwogIH0KCiAgLy8vIFVzZWQgaW50ZXJuYWxseSBpbiBwYXRoLXJlbGF0ZWQgY29uc3RydWN0b3JzLgogIGV4dGVybmFsIHN0YXRpYyBib29sIGdldCBfaXNXaW5kb3dzOwoKICBzdGF0aWMgX2NoZWNrTm9uV2luZG93c1BhdGhSZXNlcnZlZENoYXJhY3RlcnMoCiAgICAgIExpc3Q8U3RyaW5nPiBzZWdtZW50cywgYm9vbCBhcmd1bWVudEVycm9yKSB7CiAgICBzZWdtZW50cy5mb3JFYWNoKChzZWdtZW50KSB7CiAgICAgIGlmIChzZWdtZW50LmNvbnRhaW5zKCIvIikpIHsKICAgICAgICBpZiAoYXJndW1lbnRFcnJvcikgewogICAgICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcigiSWxsZWdhbCBwYXRoIGNoYXJhY3RlciAkc2VnbWVudCIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJJbGxlZ2FsIHBhdGggY2hhcmFjdGVyICRzZWdtZW50Iik7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9CgogIHN0YXRpYyBfY2hlY2tXaW5kb3dzUGF0aFJlc2VydmVkQ2hhcmFjdGVycygKICAgICAgTGlzdDxTdHJpbmc+IHNlZ21lbnRzLCBib29sIGFyZ3VtZW50RXJyb3IsCiAgICAgIFtpbnQgZmlyc3RTZWdtZW50ID0gMF0pIHsKICAgIGZvciAodmFyIHNlZ21lbnQgaW4gc2VnbWVudHMuc2tpcChmaXJzdFNlZ21lbnQpKSB7CiAgICAgIGlmIChzZWdtZW50LmNvbnRhaW5zKFJlZ0V4cChyJ1siKi86PD4/XFx8XScpKSkgewogICAgICAgIGlmIChhcmd1bWVudEVycm9yKSB7CiAgICAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yKCJJbGxlZ2FsIGNoYXJhY3RlciBpbiBwYXRoIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoIklsbGVnYWwgY2hhcmFjdGVyIGluIHBhdGg6ICRzZWdtZW50Iik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBzdGF0aWMgX2NoZWNrV2luZG93c0RyaXZlTGV0dGVyKGludCBjaGFyQ29kZSwgYm9vbCBhcmd1bWVudEVycm9yKSB7CiAgICBpZiAoKF9VUFBFUl9DQVNFX0EgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gX1VQUEVSX0NBU0VfWikgfHwKICAgICAgICAoX0xPV0VSX0NBU0VfQSA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBfTE9XRVJfQ0FTRV9aKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoYXJndW1lbnRFcnJvcikgewogICAgICB0aHJvdyBBcmd1bWVudEVycm9yKAogICAgICAgICAgIklsbGVnYWwgZHJpdmUgbGV0dGVyICIgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKSk7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICAgIklsbGVnYWwgZHJpdmUgbGV0dGVyICIgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKSk7CiAgICB9CiAgfQoKICBzdGF0aWMgX21ha2VGaWxlVXJpKFN0cmluZyBwYXRoLCBib29sIHNsYXNoVGVybWluYXRlZCkgewogICAgY29uc3QgU3RyaW5nIHNlcCA9ICIvIjsKICAgIHZhciBzZWdtZW50cyA9IHBhdGguc3BsaXQoc2VwKTsKICAgIGlmIChzbGFzaFRlcm1pbmF0ZWQgJiYgc2VnbWVudHMuaXNOb3RFbXB0eSAmJiBzZWdtZW50cy5sYXN0LmlzTm90RW1wdHkpIHsKICAgICAgc2VnbWVudHMuYWRkKCIiKTsgLy8gRXh0cmEgc2VwYXJhdG9yIGF0IGVuZC4KICAgIH0KICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoc2VwKSkgewogICAgICAvLyBBYnNvbHV0ZSBmaWxlOi8vIFVSSS4KICAgICAgcmV0dXJuIFVyaShzY2hlbWU6ICJmaWxlIiwgcGF0aFNlZ21lbnRzOiBzZWdtZW50cyk7CiAgICB9IGVsc2UgewogICAgICAvLyBSZWxhdGl2ZSBVUkkuCiAgICAgIHJldHVybiBVcmkocGF0aFNlZ21lbnRzOiBzZWdtZW50cyk7CiAgICB9CiAgfQoKICBzdGF0aWMgX21ha2VXaW5kb3dzRmlsZVVybChTdHJpbmcgcGF0aCwgYm9vbCBzbGFzaFRlcm1pbmF0ZWQpIHsKICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgociJcXD9cIikpIHsKICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChyIlVOQ1wiLCA0KSkgewogICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2VSYW5nZSgwLCA3LCByJ1wnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoNCk7CiAgICAgICAgaWYgKHBhdGgubGVuZ3RoIDwgMyB8fAogICAgICAgICAgICBwYXRoLmNvZGVVbml0QXQoMSkgIT0gX0NPTE9OIHx8CiAgICAgICAgICAgIHBhdGguY29kZVVuaXRBdCgyKSAhPSBfQkFDS1NMQVNIKSB7CiAgICAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yKAogICAgICAgICAgICAgIHIiV2luZG93cyBwYXRocyB3aXRoIFxcP1wgcHJlZml4IG11c3QgYmUgYWJzb2x1dGUiKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2VBbGwoIi8iLCByJ1wnKTsKICAgIH0KICAgIGNvbnN0IFN0cmluZyBzZXAgPSByJ1wnOwogICAgaWYgKHBhdGgubGVuZ3RoID4gMSAmJiBwYXRoLmNvZGVVbml0QXQoMSkgPT0gX0NPTE9OKSB7CiAgICAgIF9jaGVja1dpbmRvd3NEcml2ZUxldHRlcihwYXRoLmNvZGVVbml0QXQoMCksIHRydWUpOwogICAgICBpZiAocGF0aC5sZW5ndGggPT0gMiB8fCBwYXRoLmNvZGVVbml0QXQoMikgIT0gX0JBQ0tTTEFTSCkgewogICAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoIldpbmRvd3MgcGF0aHMgd2l0aCBkcml2ZSBsZXR0ZXIgbXVzdCBiZSBhYnNvbHV0ZSIpOwogICAgICB9CiAgICAgIC8vIEFic29sdXRlIGZpbGU6Ly9DOi8gVVJJLgogICAgICB2YXIgcGF0aFNlZ21lbnRzID0gcGF0aC5zcGxpdChzZXApOwogICAgICBpZiAoc2xhc2hUZXJtaW5hdGVkICYmIHBhdGhTZWdtZW50cy5sYXN0LmlzTm90RW1wdHkpIHsKICAgICAgICBwYXRoU2VnbWVudHMuYWRkKCIiKTsgLy8gRXh0cmEgc2VwYXJhdG9yIGF0IGVuZC4KICAgICAgfQogICAgICBfY2hlY2tXaW5kb3dzUGF0aFJlc2VydmVkQ2hhcmFjdGVycyhwYXRoU2VnbWVudHMsIHRydWUsIDEpOwogICAgICByZXR1cm4gVXJpKHNjaGVtZTogImZpbGUiLCBwYXRoU2VnbWVudHM6IHBhdGhTZWdtZW50cyk7CiAgICB9CgogICAgaWYgKHBhdGguc3RhcnRzV2l0aChzZXApKSB7CiAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoc2VwLCAxKSkgewogICAgICAgIC8vIEFic29sdXRlIGZpbGU6Ly8gVVJJIHdpdGggaG9zdC4KICAgICAgICBpbnQgcGF0aFN0YXJ0ID0gcGF0aC5pbmRleE9mKHInXCcsIDIpOwogICAgICAgIFN0cmluZyBob3N0UGFydCA9CiAgICAgICAgICAgIChwYXRoU3RhcnQgPCAwKSA/IHBhdGguc3Vic3RyaW5nKDIpIDogcGF0aC5zdWJzdHJpbmcoMiwgcGF0aFN0YXJ0KTsKICAgICAgICBTdHJpbmcgcGF0aFBhcnQgPSAocGF0aFN0YXJ0IDwgMCkgPyAiIiA6IHBhdGguc3Vic3RyaW5nKHBhdGhTdGFydCArIDEpOwogICAgICAgIHZhciBwYXRoU2VnbWVudHMgPSBwYXRoUGFydC5zcGxpdChzZXApOwogICAgICAgIF9jaGVja1dpbmRvd3NQYXRoUmVzZXJ2ZWRDaGFyYWN0ZXJzKHBhdGhTZWdtZW50cywgdHJ1ZSk7CiAgICAgICAgaWYgKHNsYXNoVGVybWluYXRlZCAmJiBwYXRoU2VnbWVudHMubGFzdC5pc05vdEVtcHR5KSB7CiAgICAgICAgICBwYXRoU2VnbWVudHMuYWRkKCIiKTsgLy8gRXh0cmEgc2VwYXJhdG9yIGF0IGVuZC4KICAgICAgICB9CiAgICAgICAgcmV0dXJuIFVyaShzY2hlbWU6ICJmaWxlIiwgaG9zdDogaG9zdFBhcnQsIHBhdGhTZWdtZW50czogcGF0aFNlZ21lbnRzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBBYnNvbHV0ZSBmaWxlOi8vIFVSSS4KICAgICAgICB2YXIgcGF0aFNlZ21lbnRzID0gcGF0aC5zcGxpdChzZXApOwogICAgICAgIGlmIChzbGFzaFRlcm1pbmF0ZWQgJiYgcGF0aFNlZ21lbnRzLmxhc3QuaXNOb3RFbXB0eSkgewogICAgICAgICAgcGF0aFNlZ21lbnRzLmFkZCgiIik7IC8vIEV4dHJhIHNlcGFyYXRvciBhdCBlbmQuCiAgICAgICAgfQogICAgICAgIF9jaGVja1dpbmRvd3NQYXRoUmVzZXJ2ZWRDaGFyYWN0ZXJzKHBhdGhTZWdtZW50cywgdHJ1ZSk7CiAgICAgICAgcmV0dXJuIFVyaShzY2hlbWU6ICJmaWxlIiwgcGF0aFNlZ21lbnRzOiBwYXRoU2VnbWVudHMpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBSZWxhdGl2ZSBVUkkuCiAgICAgIHZhciBwYXRoU2VnbWVudHMgPSBwYXRoLnNwbGl0KHNlcCk7CiAgICAgIF9jaGVja1dpbmRvd3NQYXRoUmVzZXJ2ZWRDaGFyYWN0ZXJzKHBhdGhTZWdtZW50cywgdHJ1ZSk7CiAgICAgIGlmIChzbGFzaFRlcm1pbmF0ZWQgJiYKICAgICAgICAgIHBhdGhTZWdtZW50cy5pc05vdEVtcHR5ICYmCiAgICAgICAgICBwYXRoU2VnbWVudHMubGFzdC5pc05vdEVtcHR5KSB7CiAgICAgICAgcGF0aFNlZ21lbnRzLmFkZCgiIik7IC8vIEV4dHJhIHNlcGFyYXRvciBhdCBlbmQuCiAgICAgIH0KICAgICAgcmV0dXJuIFVyaShwYXRoU2VnbWVudHM6IHBhdGhTZWdtZW50cyk7CiAgICB9CiAgfQoKICBVcmkgcmVwbGFjZSgKICAgICAge1N0cmluZyBzY2hlbWUsCiAgICAgIFN0cmluZyB1c2VySW5mbywKICAgICAgU3RyaW5nIGhvc3QsCiAgICAgIGludCBwb3J0LAogICAgICBTdHJpbmcgcGF0aCwKICAgICAgSXRlcmFibGU8U3RyaW5nPiBwYXRoU2VnbWVudHMsCiAgICAgIFN0cmluZyBxdWVyeSwKICAgICAgTWFwPFN0cmluZywgZHluYW1pYyAvKlN0cmluZ3xJdGVyYWJsZTxTdHJpbmc+Ki8gPiBxdWVyeVBhcmFtZXRlcnMsCiAgICAgIFN0cmluZyBmcmFnbWVudH0pIHsKICAgIC8vIFNldCB0byB0cnVlIGlmIHRoZSBzY2hlbWUgaGFzIChwb3RlbnRpYWxseSkgY2hhbmdlZC4KICAgIC8vIEluIHRoYXQgY2FzZSwgdGhlIGRlZmF1bHQgcG9ydCBtYXkgYWxzbyBoYXZlIGNoYW5nZWQgYW5kIHdlIG5lZWQKICAgIC8vIHRvIGNoZWNrIGV2ZW4gdGhlIGV4aXN0aW5nIHBvcnQuCiAgICBib29sIHNjaGVtZUNoYW5nZWQgPSBmYWxzZTsKICAgIGlmIChzY2hlbWUgIT0gbnVsbCkgewogICAgICBzY2hlbWUgPSBfbWFrZVNjaGVtZShzY2hlbWUsIDAsIHNjaGVtZS5sZW5ndGgpOwogICAgICBzY2hlbWVDaGFuZ2VkID0gKHNjaGVtZSAhPSB0aGlzLnNjaGVtZSk7CiAgICB9IGVsc2UgewogICAgICBzY2hlbWUgPSB0aGlzLnNjaGVtZTsKICAgIH0KICAgIGJvb2wgaXNGaWxlID0gKHNjaGVtZSA9PSAiZmlsZSIpOwogICAgaWYgKHVzZXJJbmZvICE9IG51bGwpIHsKICAgICAgdXNlckluZm8gPSBfbWFrZVVzZXJJbmZvKHVzZXJJbmZvLCAwLCB1c2VySW5mby5sZW5ndGgpOwogICAgfSBlbHNlIHsKICAgICAgdXNlckluZm8gPSB0aGlzLl91c2VySW5mbzsKICAgIH0KICAgIGlmIChwb3J0ICE9IG51bGwpIHsKICAgICAgcG9ydCA9IF9tYWtlUG9ydChwb3J0LCBzY2hlbWUpOwogICAgfSBlbHNlIHsKICAgICAgcG9ydCA9IHRoaXMuX3BvcnQ7CiAgICAgIGlmIChzY2hlbWVDaGFuZ2VkKSB7CiAgICAgICAgLy8gVGhlIGRlZmF1bHQgcG9ydCBtaWdodCBoYXZlIGNoYW5nZWQuCiAgICAgICAgcG9ydCA9IF9tYWtlUG9ydChwb3J0LCBzY2hlbWUpOwogICAgICB9CiAgICB9CiAgICBpZiAoaG9zdCAhPSBudWxsKSB7CiAgICAgIGhvc3QgPSBfbWFrZUhvc3QoaG9zdCwgMCwgaG9zdC5sZW5ndGgsIGZhbHNlKTsKICAgIH0gZWxzZSBpZiAodGhpcy5oYXNBdXRob3JpdHkpIHsKICAgICAgaG9zdCA9IHRoaXMuX2hvc3Q7CiAgICB9IGVsc2UgaWYgKHVzZXJJbmZvLmlzTm90RW1wdHkgfHwgcG9ydCAhPSBudWxsIHx8IGlzRmlsZSkgewogICAgICBob3N0ID0gIiI7CiAgICB9CgogICAgYm9vbCBoYXNBdXRob3JpdHkgPSBob3N0ICE9IG51bGw7CiAgICBpZiAocGF0aCAhPSBudWxsIHx8IHBhdGhTZWdtZW50cyAhPSBudWxsKSB7CiAgICAgIHBhdGggPSBfbWFrZVBhdGgocGF0aCwgMCwgX3N0cmluZ09yTnVsbExlbmd0aChwYXRoKSwgcGF0aFNlZ21lbnRzLCBzY2hlbWUsCiAgICAgICAgICBoYXNBdXRob3JpdHkpOwogICAgfSBlbHNlIHsKICAgICAgcGF0aCA9IHRoaXMucGF0aDsKICAgICAgaWYgKChpc0ZpbGUgfHwgKGhhc0F1dGhvcml0eSAmJiAhcGF0aC5pc0VtcHR5KSkgJiYKICAgICAgICAgICFwYXRoLnN0YXJ0c1dpdGgoJy8nKSkgewogICAgICAgIHBhdGggPSAiLyIgKyBwYXRoOwogICAgICB9CiAgICB9CgogICAgaWYgKHF1ZXJ5ICE9IG51bGwgfHwgcXVlcnlQYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgcXVlcnkgPSBfbWFrZVF1ZXJ5KHF1ZXJ5LCAwLCBfc3RyaW5nT3JOdWxsTGVuZ3RoKHF1ZXJ5KSwgcXVlcnlQYXJhbWV0ZXJzKTsKICAgIH0gZWxzZSB7CiAgICAgIHF1ZXJ5ID0gdGhpcy5fcXVlcnk7CiAgICB9CgogICAgaWYgKGZyYWdtZW50ICE9IG51bGwpIHsKICAgICAgZnJhZ21lbnQgPSBfbWFrZUZyYWdtZW50KGZyYWdtZW50LCAwLCBmcmFnbWVudC5sZW5ndGgpOwogICAgfSBlbHNlIHsKICAgICAgZnJhZ21lbnQgPSB0aGlzLl9mcmFnbWVudDsKICAgIH0KCiAgICByZXR1cm4gX1VyaS5faW50ZXJuYWwoc2NoZW1lLCB1c2VySW5mbywgaG9zdCwgcG9ydCwgcGF0aCwgcXVlcnksIGZyYWdtZW50KTsKICB9CgogIFVyaSByZW1vdmVGcmFnbWVudCgpIHsKICAgIGlmICghdGhpcy5oYXNGcmFnbWVudCkgcmV0dXJuIHRoaXM7CiAgICByZXR1cm4gX1VyaS5faW50ZXJuYWwoc2NoZW1lLCBfdXNlckluZm8sIF9ob3N0LCBfcG9ydCwgcGF0aCwgX3F1ZXJ5LCBudWxsKTsKICB9CgogIExpc3Q8U3RyaW5nPiBnZXQgcGF0aFNlZ21lbnRzIHsKICAgIHZhciByZXN1bHQgPSBfcGF0aFNlZ21lbnRzOwogICAgaWYgKHJlc3VsdCAhPSBudWxsKSByZXR1cm4gcmVzdWx0OwoKICAgIHZhciBwYXRoVG9TcGxpdCA9IHBhdGg7CiAgICBpZiAocGF0aFRvU3BsaXQuaXNOb3RFbXB0eSAmJiBwYXRoVG9TcGxpdC5jb2RlVW5pdEF0KDApID09IF9TTEFTSCkgewogICAgICBwYXRoVG9TcGxpdCA9IHBhdGhUb1NwbGl0LnN1YnN0cmluZygxKTsKICAgIH0KICAgIHJlc3VsdCA9IChwYXRoVG9TcGxpdCA9PSAiIikKICAgICAgICA/IGNvbnN0IDxTdHJpbmc+W10KICAgICAgICA6IExpc3Q8U3RyaW5nPi51bm1vZGlmaWFibGUoCiAgICAgICAgICAgIHBhdGhUb1NwbGl0LnNwbGl0KCIvIikubWFwKFVyaS5kZWNvZGVDb21wb25lbnQpKTsKICAgIF9wYXRoU2VnbWVudHMgPSByZXN1bHQ7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgTWFwPFN0cmluZywgU3RyaW5nPiBnZXQgcXVlcnlQYXJhbWV0ZXJzIHsKICAgIF9xdWVyeVBhcmFtZXRlcnMgPz89CiAgICAgICAgVW5tb2RpZmlhYmxlTWFwVmlldzxTdHJpbmcsIFN0cmluZz4oVXJpLnNwbGl0UXVlcnlTdHJpbmcocXVlcnkpKTsKICAgIHJldHVybiBfcXVlcnlQYXJhbWV0ZXJzOwogIH0KCiAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBnZXQgcXVlcnlQYXJhbWV0ZXJzQWxsIHsKICAgIGlmIChfcXVlcnlQYXJhbWV0ZXJMaXN0cyA9PSBudWxsKSB7CiAgICAgIE1hcCBxdWVyeVBhcmFtZXRlckxpc3RzID0gX3NwbGl0UXVlcnlTdHJpbmdBbGwocXVlcnkpOwogICAgICBmb3IgKHZhciBrZXkgaW4gcXVlcnlQYXJhbWV0ZXJMaXN0cy5rZXlzKSB7CiAgICAgICAgcXVlcnlQYXJhbWV0ZXJMaXN0c1trZXldID0KICAgICAgICAgICAgTGlzdDxTdHJpbmc+LnVubW9kaWZpYWJsZShxdWVyeVBhcmFtZXRlckxpc3RzW2tleV0pOwogICAgICB9CiAgICAgIF9xdWVyeVBhcmFtZXRlckxpc3RzID0KICAgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4udW5tb2RpZmlhYmxlKHF1ZXJ5UGFyYW1ldGVyTGlzdHMpOwogICAgfQogICAgcmV0dXJuIF9xdWVyeVBhcmFtZXRlckxpc3RzOwogIH0KCiAgVXJpIG5vcm1hbGl6ZVBhdGgoKSB7CiAgICBTdHJpbmcgcGF0aCA9IF9ub3JtYWxpemVQYXRoKHRoaXMucGF0aCwgc2NoZW1lLCBoYXNBdXRob3JpdHkpOwogICAgaWYgKGlkZW50aWNhbChwYXRoLCB0aGlzLnBhdGgpKSByZXR1cm4gdGhpczsKICAgIHJldHVybiB0aGlzLnJlcGxhY2UocGF0aDogcGF0aCk7CiAgfQoKICBzdGF0aWMgaW50IF9tYWtlUG9ydChpbnQgcG9ydCwgU3RyaW5nIHNjaGVtZSkgewogICAgLy8gUGVyZm9ybSBzY2hlbWUgc3BlY2lmaWMgbm9ybWFsaXphdGlvbi4KICAgIGlmIChwb3J0ICE9IG51bGwgJiYgcG9ydCA9PSBfZGVmYXVsdFBvcnQoc2NoZW1lKSkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gcG9ydDsKICB9CgogIC8qKgogICAqIENoZWNrIGFuZCBub3JtYWxpemUgYSBob3N0IG5hbWUuCiAgICoKICAgKiBJZiB0aGUgaG9zdCBuYW1lIHN0YXJ0cyBhbmQgZW5kcyB3aXRoICdbJyBhbmQgJ10nLCBpdCBpcyBjb25zaWRlcmVkIGFuCiAgICogSVB2NiBhZGRyZXNzLiBJZiBbc3RyaWN0SVB2Nl0gaXMgZmFsc2UsIHRoZSBhZGRyZXNzIGlzIGFsc28gY29uc2lkZXJlZAogICAqIGFuIElQdjYgYWRkcmVzcyBpZiBpdCBjb250YWlucyBhbnkgJzonIGNoYXJhY3Rlci4KICAgKgogICAqIElmIGl0IGlzIG5vdCBhbiBJUHY2IGFkZHJlc3MsIGl0IGlzIGNhc2UtIGFuZCBlc2NhcGUtbm9ybWFsaXplZC4KICAgKiBUaGlzIGVzY2FwZXMgYWxsIGNoYXJhY3RlcnMgbm90IHZhbGlkIGluIGEgcmVnLW5hbWUsCiAgICogYW5kIGNvbnZlcnRzIGFsbCBub24tZXNjYXBlIHVwcGVyLWNhc2UgbGV0dGVycyB0byBsb3dlci1jYXNlLgogICAqLwogIHN0YXRpYyBTdHJpbmcgX21ha2VIb3N0KFN0cmluZyBob3N0LCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgc3RyaWN0SVB2NikgewogICAgLy8gVE9ETyhscm4pOiBTaG91bGQgd2Ugbm9ybWFsaXplIElQdjYgYWRkcmVzc2VzIGFjY29yZGluZyB0byBSRkMgNTk1Mj8KICAgIGlmIChob3N0ID09IG51bGwpIHJldHVybiBudWxsOwogICAgaWYgKHN0YXJ0ID09IGVuZCkgcmV0dXJuICIiOwogICAgLy8gSG9zdCBpcyBhbiBJUHY2IGFkZHJlc3MgaWYgaXQgc3RhcnRzIHdpdGggJ1snIG9yIGNvbnRhaW5zIGEgY29sb24uCiAgICBpZiAoaG9zdC5jb2RlVW5pdEF0KHN0YXJ0KSA9PSBfTEVGVF9CUkFDS0VUKSB7CiAgICAgIGlmIChob3N0LmNvZGVVbml0QXQoZW5kIC0gMSkgIT0gX1JJR0hUX0JSQUNLRVQpIHsKICAgICAgICBfZmFpbChob3N0LCBzdGFydCwgJ01pc3NpbmcgZW5kIGBdYCB0byBtYXRjaCBgW2AgaW4gaG9zdCcpOwogICAgICB9CiAgICAgIFVyaS5wYXJzZUlQdjZBZGRyZXNzKGhvc3QsIHN0YXJ0ICsgMSwgZW5kIC0gMSk7CiAgICAgIC8vIFJGQyA1OTUyIHJlcXVpcmVzIGhleCBkaWdpdHMgdG8gYmUgbG93ZXIgY2FzZS4KICAgICAgcmV0dXJuIGhvc3Quc3Vic3RyaW5nKHN0YXJ0LCBlbmQpLnRvTG93ZXJDYXNlKCk7CiAgICB9CiAgICBpZiAoIXN0cmljdElQdjYpIHsKICAgICAgLy8gVE9ETyhscm4pOiBza2lwIGlmIHRvbyBzaG9ydCB0byBiZSBhIHZhbGlkIElQdjYgYWRkcmVzcz8KICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgICBpZiAoaG9zdC5jb2RlVW5pdEF0KGkpID09IF9DT0xPTikgewogICAgICAgICAgVXJpLnBhcnNlSVB2NkFkZHJlc3MoaG9zdCwgc3RhcnQsIGVuZCk7CiAgICAgICAgICByZXR1cm4gJ1skaG9zdF0nOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIF9ub3JtYWxpemVSZWdOYW1lKGhvc3QsIHN0YXJ0LCBlbmQpOwogIH0KCiAgc3RhdGljIGJvb2wgX2lzUmVnTmFtZUNoYXIoaW50IGNoYXIpIHsKICAgIHJldHVybiBjaGFyIDwgMTI3ICYmIChfcmVnTmFtZVRhYmxlW2NoYXIgPj4gNF0gJiAoMSA8PCAoY2hhciAmIDB4ZikpKSAhPSAwOwogIH0KCiAgLyoqCiAgICogVmFsaWRhdGVzIGFuZCBkb2VzIGNhc2UtIGFuZCBwZXJjZW50LWVuY29kaW5nIG5vcm1hbGl6YXRpb24uCiAgICoKICAgKiBUaGUgW2hvc3RdIG11c3QgYmUgYW4gUkZDMzk4NiAicmVnLW5hbWUiLiBJdCBpcyBjb252ZXJ0ZWQKICAgKiB0byBsb3dlciBjYXNlLCBhbmQgcGVyY2VudCBlc2NhcGVzIGFyZSBjb252ZXJ0ZWQgdG8gZWl0aGVyCiAgICogbG93ZXIgY2FzZSB1bnJlc2VydmVkIGNoYXJhY3RlcnMgb3IgdXBwZXIgY2FzZSBlc2NhcGVzLgogICAqLwogIHN0YXRpYyBTdHJpbmcgX25vcm1hbGl6ZVJlZ05hbWUoU3RyaW5nIGhvc3QsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlcjsKICAgIGludCBzZWN0aW9uU3RhcnQgPSBzdGFydDsKICAgIGludCBpbmRleCA9IHN0YXJ0OwogICAgLy8gV2hldGhlciBhbGwgY2hhcmFjdGVycyBiZXR3ZWVuIHNlY3Rpb25TdGFydCBhbmQgaW5kZXggYXJlIG5vcm1hbGl6ZWQsCiAgICBib29sIGlzTm9ybWFsaXplZCA9IHRydWU7CgogICAgd2hpbGUgKGluZGV4IDwgZW5kKSB7CiAgICAgIGludCBjaGFyID0gaG9zdC5jb2RlVW5pdEF0KGluZGV4KTsKICAgICAgaWYgKGNoYXIgPT0gX1BFUkNFTlQpIHsKICAgICAgICAvLyBUaGUgX3JlZ05hbWVUYWJsZSBjb250YWlucyAiJSIsIHNvIHdlIGNoZWNrIHRoYXQgZmlyc3QuCiAgICAgICAgU3RyaW5nIHJlcGxhY2VtZW50ID0gX25vcm1hbGl6ZUVzY2FwZShob3N0LCBpbmRleCwgdHJ1ZSk7CiAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09IG51bGwgJiYgaXNOb3JtYWxpemVkKSB7CiAgICAgICAgICBpbmRleCArPSAzOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGJ1ZmZlciA/Pz0gU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgU3RyaW5nIHNsaWNlID0gaG9zdC5zdWJzdHJpbmcoc2VjdGlvblN0YXJ0LCBpbmRleCk7CiAgICAgICAgaWYgKCFpc05vcm1hbGl6ZWQpIHNsaWNlID0gc2xpY2UudG9Mb3dlckNhc2UoKTsKICAgICAgICBidWZmZXIud3JpdGUoc2xpY2UpOwogICAgICAgIGludCBzb3VyY2VMZW5ndGggPSAzOwogICAgICAgIGlmIChyZXBsYWNlbWVudCA9PSBudWxsKSB7CiAgICAgICAgICByZXBsYWNlbWVudCA9IGhvc3Quc3Vic3RyaW5nKGluZGV4LCBpbmRleCArIDMpOwogICAgICAgIH0gZWxzZSBpZiAocmVwbGFjZW1lbnQgPT0gIiUiKSB7CiAgICAgICAgICByZXBsYWNlbWVudCA9ICIlMjUiOwogICAgICAgICAgc291cmNlTGVuZ3RoID0gMTsKICAgICAgICB9CiAgICAgICAgYnVmZmVyLndyaXRlKHJlcGxhY2VtZW50KTsKICAgICAgICBpbmRleCArPSBzb3VyY2VMZW5ndGg7CiAgICAgICAgc2VjdGlvblN0YXJ0ID0gaW5kZXg7CiAgICAgICAgaXNOb3JtYWxpemVkID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChfaXNSZWdOYW1lQ2hhcihjaGFyKSkgewogICAgICAgIGlmIChpc05vcm1hbGl6ZWQgJiYgX1VQUEVSX0NBU0VfQSA8PSBjaGFyICYmIF9VUFBFUl9DQVNFX1ogPj0gY2hhcikgewogICAgICAgICAgLy8gUHV0IGluaXRpYWwgc2xpY2UgaW4gYnVmZmVyIGFuZCBjb250aW51ZSBpbiBub24tbm9ybWFsaXplZCBtb2RlCiAgICAgICAgICBidWZmZXIgPz89IFN0cmluZ0J1ZmZlcigpOwogICAgICAgICAgaWYgKHNlY3Rpb25TdGFydCA8IGluZGV4KSB7CiAgICAgICAgICAgIGJ1ZmZlci53cml0ZShob3N0LnN1YnN0cmluZyhzZWN0aW9uU3RhcnQsIGluZGV4KSk7CiAgICAgICAgICAgIHNlY3Rpb25TdGFydCA9IGluZGV4OwogICAgICAgICAgfQogICAgICAgICAgaXNOb3JtYWxpemVkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGluZGV4Kys7CiAgICAgIH0gZWxzZSBpZiAoX2lzR2VuZXJhbERlbGltaXRlcihjaGFyKSkgewogICAgICAgIF9mYWlsKGhvc3QsIGluZGV4LCAiSW52YWxpZCBjaGFyYWN0ZXIiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbnQgc291cmNlTGVuZ3RoID0gMTsKICAgICAgICBpZiAoKGNoYXIgJiAweEZDMDApID09IDB4RDgwMCAmJiAoaW5kZXggKyAxKSA8IGVuZCkgewogICAgICAgICAgaW50IHRhaWwgPSBob3N0LmNvZGVVbml0QXQoaW5kZXggKyAxKTsKICAgICAgICAgIGlmICgodGFpbCAmIDB4RkMwMCkgPT0gMHhEQzAwKSB7CiAgICAgICAgICAgIGNoYXIgPSAweDEwMDAwIHwgKChjaGFyICYgMHgzZmYpIDw8IDEwKSB8ICh0YWlsICYgMHgzZmYpOwogICAgICAgICAgICBzb3VyY2VMZW5ndGggPSAyOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBidWZmZXIgPz89IFN0cmluZ0J1ZmZlcigpOwogICAgICAgIFN0cmluZyBzbGljZSA9IGhvc3Quc3Vic3RyaW5nKHNlY3Rpb25TdGFydCwgaW5kZXgpOwogICAgICAgIGlmICghaXNOb3JtYWxpemVkKSBzbGljZSA9IHNsaWNlLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgYnVmZmVyLndyaXRlKHNsaWNlKTsKICAgICAgICBidWZmZXIud3JpdGUoX2VzY2FwZUNoYXIoY2hhcikpOwogICAgICAgIGluZGV4ICs9IHNvdXJjZUxlbmd0aDsKICAgICAgICBzZWN0aW9uU3RhcnQgPSBpbmRleDsKICAgICAgfQogICAgfQogICAgaWYgKGJ1ZmZlciA9PSBudWxsKSByZXR1cm4gaG9zdC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7CiAgICBpZiAoc2VjdGlvblN0YXJ0IDwgZW5kKSB7CiAgICAgIFN0cmluZyBzbGljZSA9IGhvc3Quc3Vic3RyaW5nKHNlY3Rpb25TdGFydCwgZW5kKTsKICAgICAgaWYgKCFpc05vcm1hbGl6ZWQpIHNsaWNlID0gc2xpY2UudG9Mb3dlckNhc2UoKTsKICAgICAgYnVmZmVyLndyaXRlKHNsaWNlKTsKICAgIH0KICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9CgogIC8qKgogICAqIFZhbGlkYXRlcyBzY2hlbWUgY2hhcmFjdGVycyBhbmQgZG9lcyBjYXNlLW5vcm1hbGl6YXRpb24uCiAgICoKICAgKiBTY2hlbWVzIGFyZSBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4gVGhleSBjYW5ub3QgY29udGFpbiBlc2NhcGVzLgogICAqLwogIHN0YXRpYyBTdHJpbmcgX21ha2VTY2hlbWUoU3RyaW5nIHNjaGVtZSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBpZiAoc3RhcnQgPT0gZW5kKSByZXR1cm4gIiI7CiAgICBmaW5hbCBpbnQgZmlyc3RDb2RlVW5pdCA9IHNjaGVtZS5jb2RlVW5pdEF0KHN0YXJ0KTsKICAgIGlmICghX2lzQWxwaGFiZXRpY0NoYXJhY3RlcihmaXJzdENvZGVVbml0KSkgewogICAgICBfZmFpbChzY2hlbWUsIHN0YXJ0LCAiU2NoZW1lIG5vdCBzdGFydGluZyB3aXRoIGFscGhhYmV0aWMgY2hhcmFjdGVyIik7CiAgICB9CiAgICBib29sIGNvbnRhaW5zVXBwZXJDYXNlID0gZmFsc2U7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICBmaW5hbCBpbnQgY29kZVVuaXQgPSBzY2hlbWUuY29kZVVuaXRBdChpKTsKICAgICAgaWYgKCFfaXNTY2hlbWVDaGFyYWN0ZXIoY29kZVVuaXQpKSB7CiAgICAgICAgX2ZhaWwoc2NoZW1lLCBpLCAiSWxsZWdhbCBzY2hlbWUgY2hhcmFjdGVyIik7CiAgICAgIH0KICAgICAgaWYgKF9VUFBFUl9DQVNFX0EgPD0gY29kZVVuaXQgJiYgY29kZVVuaXQgPD0gX1VQUEVSX0NBU0VfWikgewogICAgICAgIGNvbnRhaW5zVXBwZXJDYXNlID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgc2NoZW1lID0gc2NoZW1lLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKICAgIGlmIChjb250YWluc1VwcGVyQ2FzZSkgc2NoZW1lID0gc2NoZW1lLnRvTG93ZXJDYXNlKCk7CiAgICByZXR1cm4gX2Nhbm9uaWNhbGl6ZVNjaGVtZShzY2hlbWUpOwogIH0KCiAgLy8gQ2Fub25pY2FsaXplIGEgZmV3IG9mdGVuLXVzZWQgc2NoZW1lIHN0cmluZ3MuCiAgLy8KICAvLyBUaGlzIGltcHJvdmVzIG1lbW9yeSB1c2FnZSBhbmQgbWFrZXMgY29tcGFyaXNvbiBmYXN0ZXIuCiAgc3RhdGljIFN0cmluZyBfY2Fub25pY2FsaXplU2NoZW1lKFN0cmluZyBzY2hlbWUpIHsKICAgIGlmIChzY2hlbWUgPT0gImh0dHAiKSByZXR1cm4gImh0dHAiOwogICAgaWYgKHNjaGVtZSA9PSAiZmlsZSIpIHJldHVybiAiZmlsZSI7CiAgICBpZiAoc2NoZW1lID09ICJodHRwcyIpIHJldHVybiAiaHR0cHMiOwogICAgaWYgKHNjaGVtZSA9PSAicGFja2FnZSIpIHJldHVybiAicGFja2FnZSI7CiAgICByZXR1cm4gc2NoZW1lOwogIH0KCiAgc3RhdGljIFN0cmluZyBfbWFrZVVzZXJJbmZvKFN0cmluZyB1c2VySW5mbywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBpZiAodXNlckluZm8gPT0gbnVsbCkgcmV0dXJuICIiOwogICAgcmV0dXJuIF9ub3JtYWxpemVPclN1YnN0cmluZyh1c2VySW5mbywgc3RhcnQsIGVuZCwgX3VzZXJpbmZvVGFibGUpOwogIH0KCiAgc3RhdGljIFN0cmluZyBfbWFrZVBhdGgoU3RyaW5nIHBhdGgsIGludCBzdGFydCwgaW50IGVuZCwKICAgICAgSXRlcmFibGU8U3RyaW5nPiBwYXRoU2VnbWVudHMsIFN0cmluZyBzY2hlbWUsIGJvb2wgaGFzQXV0aG9yaXR5KSB7CiAgICBib29sIGlzRmlsZSA9IChzY2hlbWUgPT0gImZpbGUiKTsKICAgIGJvb2wgZW5zdXJlTGVhZGluZ1NsYXNoID0gaXNGaWxlIHx8IGhhc0F1dGhvcml0eTsKICAgIGlmIChwYXRoID09IG51bGwgJiYgcGF0aFNlZ21lbnRzID09IG51bGwpIHJldHVybiBpc0ZpbGUgPyAiLyIgOiAiIjsKICAgIGlmIChwYXRoICE9IG51bGwgJiYgcGF0aFNlZ21lbnRzICE9IG51bGwpIHsKICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcignQm90aCBwYXRoIGFuZCBwYXRoU2VnbWVudHMgc3BlY2lmaWVkJyk7CiAgICB9CiAgICBTdHJpbmcgcmVzdWx0OwogICAgaWYgKHBhdGggIT0gbnVsbCkgewogICAgICByZXN1bHQgPSBfbm9ybWFsaXplT3JTdWJzdHJpbmcocGF0aCwgc3RhcnQsIGVuZCwgX3BhdGhDaGFyT3JTbGFzaFRhYmxlLAogICAgICAgICAgZXNjYXBlRGVsaW1pdGVyczogdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICByZXN1bHQgPSBwYXRoU2VnbWVudHMKICAgICAgICAgIC5tYXAoKHMpID0+IF91cmlFbmNvZGUoX3BhdGhDaGFyVGFibGUsIHMsIHV0ZjgsIGZhbHNlKSkKICAgICAgICAgIC5qb2luKCIvIik7CiAgICB9CiAgICBpZiAocmVzdWx0LmlzRW1wdHkpIHsKICAgICAgaWYgKGlzRmlsZSkgcmV0dXJuICIvIjsKICAgIH0gZWxzZSBpZiAoZW5zdXJlTGVhZGluZ1NsYXNoICYmICFyZXN1bHQuc3RhcnRzV2l0aCgnLycpKSB7CiAgICAgIHJlc3VsdCA9ICIvIiArIHJlc3VsdDsKICAgIH0KICAgIHJlc3VsdCA9IF9ub3JtYWxpemVQYXRoKHJlc3VsdCwgc2NoZW1lLCBoYXNBdXRob3JpdHkpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBQZXJmb3JtcyBwYXRoIG5vcm1hbGl6YXRpb24gKHJlbW92ZSBkb3Qgc2VnbWVudHMpIG9uIGEgcGF0aC4KICAvLy8KICAvLy8gSWYgdGhlIFVSSSBoYXMgbmVpdGhlciBzY2hlbWUgbm9yIGF1dGhvcml0eSwgaXQncyBjb25zaWRlcmVkIGEKICAvLy8gInB1cmUgcGF0aCIgYW5kIG5vcm1hbGl6YXRpb24gd29uJ3QgcmVtb3ZlIGxlYWRpbmcgIi4uIiBzZWdtZW50cy4KICAvLy8gT3RoZXJ3aXNlIGl0IGZvbGxvd3MgdGhlIFJGQyAzOTg2ICJyZW1vdmUgZG90IHNlZ21lbnRzIiBhbGdvcml0aG0uCiAgc3RhdGljIFN0cmluZyBfbm9ybWFsaXplUGF0aChTdHJpbmcgcGF0aCwgU3RyaW5nIHNjaGVtZSwgYm9vbCBoYXNBdXRob3JpdHkpIHsKICAgIGlmIChzY2hlbWUuaXNFbXB0eSAmJiAhaGFzQXV0aG9yaXR5ICYmICFwYXRoLnN0YXJ0c1dpdGgoJy8nKSkgewogICAgICByZXR1cm4gX25vcm1hbGl6ZVJlbGF0aXZlUGF0aChwYXRoLCBzY2hlbWUuaXNOb3RFbXB0eSB8fCBoYXNBdXRob3JpdHkpOwogICAgfQogICAgcmV0dXJuIF9yZW1vdmVEb3RTZWdtZW50cyhwYXRoKTsKICB9CgogIHN0YXRpYyBTdHJpbmcgX21ha2VRdWVyeShTdHJpbmcgcXVlcnksIGludCBzdGFydCwgaW50IGVuZCwKICAgICAgTWFwPFN0cmluZywgZHluYW1pYyAvKlN0cmluZ3xJdGVyYWJsZTxTdHJpbmc+Ki8gPiBxdWVyeVBhcmFtZXRlcnMpIHsKICAgIGlmIChxdWVyeSAhPSBudWxsKSB7CiAgICAgIGlmIChxdWVyeVBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoJ0JvdGggcXVlcnkgYW5kIHF1ZXJ5UGFyYW1ldGVycyBzcGVjaWZpZWQnKTsKICAgICAgfQogICAgICByZXR1cm4gX25vcm1hbGl6ZU9yU3Vic3RyaW5nKHF1ZXJ5LCBzdGFydCwgZW5kLCBfcXVlcnlDaGFyVGFibGUsCiAgICAgICAgICBlc2NhcGVEZWxpbWl0ZXJzOiB0cnVlKTsKICAgIH0KICAgIGlmIChxdWVyeVBhcmFtZXRlcnMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CgogICAgdmFyIHJlc3VsdCA9IFN0cmluZ0J1ZmZlcigpOwogICAgdmFyIHNlcGFyYXRvciA9ICIiOwoKICAgIHZvaWQgd3JpdGVQYXJhbWV0ZXIoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CiAgICAgIHJlc3VsdC53cml0ZShzZXBhcmF0b3IpOwogICAgICBzZXBhcmF0b3IgPSAiJiI7CiAgICAgIHJlc3VsdC53cml0ZShVcmkuZW5jb2RlUXVlcnlDb21wb25lbnQoa2V5KSk7CiAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmlzTm90RW1wdHkpIHsKICAgICAgICByZXN1bHQud3JpdGUoIj0iKTsKICAgICAgICByZXN1bHQud3JpdGUoVXJpLmVuY29kZVF1ZXJ5Q29tcG9uZW50KHZhbHVlKSk7CiAgICAgIH0KICAgIH0KCiAgICBxdWVyeVBhcmFtZXRlcnMuZm9yRWFjaCgoa2V5LCB2YWx1ZSkgewogICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSBpcyBTdHJpbmcpIHsKICAgICAgICB3cml0ZVBhcmFtZXRlcihrZXksIHZhbHVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBJdGVyYWJsZSB2YWx1ZXMgPSB2YWx1ZTsKICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSBpbiB2YWx1ZXMpIHsKICAgICAgICAgIHdyaXRlUGFyYW1ldGVyKGtleSwgdmFsdWUpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CiAgfQoKICBzdGF0aWMgU3RyaW5nIF9tYWtlRnJhZ21lbnQoU3RyaW5nIGZyYWdtZW50LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIGlmIChmcmFnbWVudCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBfbm9ybWFsaXplT3JTdWJzdHJpbmcoZnJhZ21lbnQsIHN0YXJ0LCBlbmQsIF9xdWVyeUNoYXJUYWJsZSwKICAgICAgICBlc2NhcGVEZWxpbWl0ZXJzOiB0cnVlKTsKICB9CgogIC8qKgogICAqIFBlcmZvcm1zIFJGQyAzOTg2IFBlcmNlbnQtRW5jb2RpbmcgTm9ybWFsaXphdGlvbi4KICAgKgogICAqIFJldHVybnMgYSByZXBsYWNlbWVudCBzdHJpbmcgdGhhdCBzaG91bGQgYmUgcmVwbGFjZSB0aGUgb3JpZ2luYWwgZXNjYXBlLgogICAqIFJldHVybnMgbnVsbCBpZiBubyByZXBsYWNlbWVudCBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgZXNjYXBlIGlzCiAgICogbm90IGZvciBhbiB1bnJlc2VydmVkIGNoYXJhY3RlciBhbmQgaXMgYWxyZWFkeSBub24tbG93ZXItY2FzZS4KICAgKgogICAqIFJldHVybnMgIiUiIGlmIHRoZSBlc2NhcGUgaXMgaW52YWxpZCAobm90IHR3byB2YWxpZCBoZXggZGlnaXRzIGZvbGxvd2luZwogICAqIHRoZSBwZXJjZW50IHNpZ24pLiBUaGUgY2FsbGluZyBjb2RlIHNob3VsZCByZXBsYWNlIHRoZSBwZXJjZW50CiAgICogc2lnbiB3aXRoICIlMjUiLCBidXQgbGVhdmUgdGhlIGZvbGxvd2luZyB0d28gY2hhcmFjdGVycyB1bm1vZGlmaWVkLgogICAqCiAgICogSWYgW2xvd2VyQ2FzZV0gaXMgdHJ1ZSwgYSBzaW5nbGUgY2hhcmFjdGVyIHJldHVybmVkIGlzIGFsd2F5cyBsb3dlciBjYXNlLAogICAqLwogIHN0YXRpYyBTdHJpbmcgX25vcm1hbGl6ZUVzY2FwZShTdHJpbmcgc291cmNlLCBpbnQgaW5kZXgsIGJvb2wgbG93ZXJDYXNlKSB7CiAgICBhc3NlcnQoc291cmNlLmNvZGVVbml0QXQoaW5kZXgpID09IF9QRVJDRU5UKTsKICAgIGlmIChpbmRleCArIDIgPj0gc291cmNlLmxlbmd0aCkgewogICAgICByZXR1cm4gIiUiOyAvLyBNYXJrcyB0aGUgZXNjYXBlIGFzIGludmFsaWQuCiAgICB9CiAgICBpbnQgZmlyc3REaWdpdCA9IHNvdXJjZS5jb2RlVW5pdEF0KGluZGV4ICsgMSk7CiAgICBpbnQgc2Vjb25kRGlnaXQgPSBzb3VyY2UuY29kZVVuaXRBdChpbmRleCArIDIpOwogICAgaW50IGZpcnN0RGlnaXRWYWx1ZSA9IGhleERpZ2l0VmFsdWUoZmlyc3REaWdpdCk7CiAgICBpbnQgc2Vjb25kRGlnaXRWYWx1ZSA9IGhleERpZ2l0VmFsdWUoc2Vjb25kRGlnaXQpOwogICAgaWYgKGZpcnN0RGlnaXRWYWx1ZSA8IDAgfHwgc2Vjb25kRGlnaXRWYWx1ZSA8IDApIHsKICAgICAgcmV0dXJuICIlIjsgLy8gTWFya3MgdGhlIGVzY2FwZSBhcyBpbnZhbGlkLgogICAgfQogICAgaW50IHZhbHVlID0gZmlyc3REaWdpdFZhbHVlICogMTYgKyBzZWNvbmREaWdpdFZhbHVlOwogICAgaWYgKF9pc1VucmVzZXJ2ZWRDaGFyKHZhbHVlKSkgewogICAgICBpZiAobG93ZXJDYXNlICYmIF9VUFBFUl9DQVNFX0EgPD0gdmFsdWUgJiYgX1VQUEVSX0NBU0VfWiA+PSB2YWx1ZSkgewogICAgICAgIHZhbHVlIHw9IDB4MjA7CiAgICAgIH0KICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodmFsdWUpOwogICAgfQogICAgaWYgKGZpcnN0RGlnaXQgPj0gX0xPV0VSX0NBU0VfQSB8fCBzZWNvbmREaWdpdCA+PSBfTE9XRVJfQ0FTRV9BKSB7CiAgICAgIC8vIEVpdGhlciBkaWdpdCBpcyBsb3dlciBjYXNlLgogICAgICByZXR1cm4gc291cmNlLnN1YnN0cmluZyhpbmRleCwgaW5kZXggKyAzKS50b1VwcGVyQ2FzZSgpOwogICAgfQogICAgLy8gRXNjYXBlIGlzIHJldGFpbmVkLCBhbmQgaXMgYWxyZWFkeSBub24tbG93ZXIgY2FzZSwgc28gcmV0dXJuIG51bGwgdG8KICAgIC8vIHJlcHJlc2VudCAibm8gcmVwbGFjZW1lbnQgbmVjZXNzYXJ5Ii4KICAgIHJldHVybiBudWxsOwogIH0KCiAgc3RhdGljIFN0cmluZyBfZXNjYXBlQ2hhcihpbnQgY2hhcikgewogICAgYXNzZXJ0KGNoYXIgPD0gMHgxMGZmZmYpOyAvLyBJdCdzIGEgdmFsaWQgdW5pY29kZSBjb2RlIHBvaW50LgogICAgTGlzdDxpbnQ+IGNvZGVVbml0czsKICAgIGlmIChjaGFyIDwgMHg4MCkgewogICAgICAvLyBBU0NJSSwgYSBzaW5nbGUgcGVyY2VudCBlbmNvZGVkIHNlcXVlbmNlLgogICAgICBjb2RlVW5pdHMgPSBMaXN0KDMpOwogICAgICBjb2RlVW5pdHNbMF0gPSBfUEVSQ0VOVDsKICAgICAgY29kZVVuaXRzWzFdID0gX2hleERpZ2l0cy5jb2RlVW5pdEF0KGNoYXIgPj4gNCk7CiAgICAgIGNvZGVVbml0c1syXSA9IF9oZXhEaWdpdHMuY29kZVVuaXRBdChjaGFyICYgMHhmKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIERvIFVURi04IGVuY29kaW5nIG9mIGNoYXJhY3RlciwgdGhlbiBwZXJjZW50IGVuY29kZSBieXRlcy4KICAgICAgaW50IGZsYWcgPSAweGMwOyAvLyBUaGUgaGlnaC1iaXQgbWFya2VycyBvbiB0aGUgZmlyc3QgYnl0ZSBvZiBVVEYtOC4KICAgICAgaW50IGVuY29kZWRCeXRlcyA9IDI7CiAgICAgIGlmIChjaGFyID4gMHg3ZmYpIHsKICAgICAgICBmbGFnID0gMHhlMDsKICAgICAgICBlbmNvZGVkQnl0ZXMgPSAzOwogICAgICAgIGlmIChjaGFyID4gMHhmZmZmKSB7CiAgICAgICAgICBlbmNvZGVkQnl0ZXMgPSA0OwogICAgICAgICAgZmxhZyA9IDB4ZjA7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvZGVVbml0cyA9IExpc3QoMyAqIGVuY29kZWRCeXRlcyk7CiAgICAgIGludCBpbmRleCA9IDA7CiAgICAgIHdoaWxlICgtLWVuY29kZWRCeXRlcyA+PSAwKSB7CiAgICAgICAgaW50IGJ5dGUgPSAoKGNoYXIgPj4gKDYgKiBlbmNvZGVkQnl0ZXMpKSAmIDB4M2YpIHwgZmxhZzsKICAgICAgICBjb2RlVW5pdHNbaW5kZXhdID0gX1BFUkNFTlQ7CiAgICAgICAgY29kZVVuaXRzW2luZGV4ICsgMV0gPSBfaGV4RGlnaXRzLmNvZGVVbml0QXQoYnl0ZSA+PiA0KTsKICAgICAgICBjb2RlVW5pdHNbaW5kZXggKyAyXSA9IF9oZXhEaWdpdHMuY29kZVVuaXRBdChieXRlICYgMHhmKTsKICAgICAgICBpbmRleCArPSAzOwogICAgICAgIGZsYWcgPSAweDgwOyAvLyBGb2xsb3dpbmcgYnl0ZXMgaGF2ZSBvbmx5IGhpZ2ggYml0IHNldC4KICAgICAgfQogICAgfQogICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGVzKGNvZGVVbml0cyk7CiAgfQoKICAvKioKICAgKiBOb3JtYWxpemVzIHVzaW5nIFtfbm9ybWFsaXplXSBvciByZXR1cm5zIHN1YnN0cmluZyBvZiBvcmlnaW5hbC4KICAgKgogICAqIElmIFtfbm9ybWFsaXplXSByZXR1cm5zIGBudWxsYCAob3JpZ2luYWwgY29udGVudCBpcyBhbHJlYWR5IG5vcm1hbGl6ZWQpLAogICAqIHRoaXMgbWV0aG9kcyByZXR1cm5zIHRoZSBzdWJzdHJpbmcgaWYgW2NvbXBvbmVudF0gZnJvbSBbc3RhcnRdIHRvIFtlbmRdLgogICAqLwogIHN0YXRpYyBTdHJpbmcgX25vcm1hbGl6ZU9yU3Vic3RyaW5nKAogICAgICBTdHJpbmcgY29tcG9uZW50LCBpbnQgc3RhcnQsIGludCBlbmQsIExpc3Q8aW50PiBjaGFyVGFibGUsCiAgICAgIHtib29sIGVzY2FwZURlbGltaXRlcnMgPSBmYWxzZX0pIHsKICAgIHJldHVybiBfbm9ybWFsaXplKGNvbXBvbmVudCwgc3RhcnQsIGVuZCwgY2hhclRhYmxlLAogICAgICAgICAgICBlc2NhcGVEZWxpbWl0ZXJzOiBlc2NhcGVEZWxpbWl0ZXJzKSA/PwogICAgICAgIGNvbXBvbmVudC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7CiAgfQoKICAvKioKICAgKiBSdW5zIHRocm91Z2ggY29tcG9uZW50IGNoZWNraW5nIHRoYXQgZWFjaCBjaGFyYWN0ZXIgaXMgdmFsaWQgYW5kCiAgICogbm9ybWFsaXplIHBlcmNlbnQgZXNjYXBlcy4KICAgKgogICAqIFVzZXMgW2NoYXJUYWJsZV0gdG8gY2hlY2sgaWYgYSBub24tYCVgIGNoYXJhY3RlciBpcyBhbGxvd2VkLgogICAqIEVhY2ggYCVgIGNoYXJhY3RlciBtdXN0IGJlIGZvbGxvd2VkIGJ5IHR3byBoZXggZGlnaXRzLgogICAqIElmIHRoZSBoZXgtZGlnaXRzIGFyZSBsb3dlciBjYXNlIGxldHRlcnMsIHRoZXkgYXJlIGNvbnZlcnRlZCB0bwogICAqIHVwcGVyIGNhc2UuCiAgICoKICAgKiBSZXR1cm5zIGBudWxsYCBpZiB0aGUgb3JpZ2luYWwgY29udGVudCB3YXMgYWxyZWFkeSBub3JtYWxpemVkLgogICAqLwogIHN0YXRpYyBTdHJpbmcgX25vcm1hbGl6ZSgKICAgICAgU3RyaW5nIGNvbXBvbmVudCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBMaXN0PGludD4gY2hhclRhYmxlLAogICAgICB7Ym9vbCBlc2NhcGVEZWxpbWl0ZXJzID0gZmFsc2V9KSB7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyOwogICAgaW50IHNlY3Rpb25TdGFydCA9IHN0YXJ0OwogICAgaW50IGluZGV4ID0gc3RhcnQ7CiAgICAvLyBMb29wIHdoaWxlIGNoYXJhY3RlcnMgYXJlIHZhbGlkIGFuZCBlc2NhcGVzIGNvcnJlY3QgYW5kIHVwcGVyLWNhc2UuCiAgICB3aGlsZSAoaW5kZXggPCBlbmQpIHsKICAgICAgaW50IGNoYXIgPSBjb21wb25lbnQuY29kZVVuaXRBdChpbmRleCk7CiAgICAgIGlmIChjaGFyIDwgMTI3ICYmIChjaGFyVGFibGVbY2hhciA+PiA0XSAmICgxIDw8IChjaGFyICYgMHgwZikpKSAhPSAwKSB7CiAgICAgICAgaW5kZXgrKzsKICAgICAgfSBlbHNlIHsKICAgICAgICBTdHJpbmcgcmVwbGFjZW1lbnQ7CiAgICAgICAgaW50IHNvdXJjZUxlbmd0aDsKICAgICAgICBpZiAoY2hhciA9PSBfUEVSQ0VOVCkgewogICAgICAgICAgcmVwbGFjZW1lbnQgPSBfbm9ybWFsaXplRXNjYXBlKGNvbXBvbmVudCwgaW5kZXgsIGZhbHNlKTsKICAgICAgICAgIC8vIFJldHVybnMgbnVsbCBpZiB3ZSBzaG91bGQga2VlcCB0aGUgZXhpc3RpbmcgZXNjYXBlLgogICAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09IG51bGwpIHsKICAgICAgICAgICAgaW5kZXggKz0gMzsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBSZXR1cm5zICIlIiBpZiB3ZSBzaG91bGQgZXNjYXBlIHRoZSBleGlzdGluZyBwZXJjZW50LgogICAgICAgICAgaWYgKCIlIiA9PSByZXBsYWNlbWVudCkgewogICAgICAgICAgICByZXBsYWNlbWVudCA9ICIlMjUiOwogICAgICAgICAgICBzb3VyY2VMZW5ndGggPSAxOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc291cmNlTGVuZ3RoID0gMzsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCFlc2NhcGVEZWxpbWl0ZXJzICYmIF9pc0dlbmVyYWxEZWxpbWl0ZXIoY2hhcikpIHsKICAgICAgICAgIF9mYWlsKGNvbXBvbmVudCwgaW5kZXgsICJJbnZhbGlkIGNoYXJhY3RlciIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzb3VyY2VMZW5ndGggPSAxOwogICAgICAgICAgaWYgKChjaGFyICYgMHhGQzAwKSA9PSAweEQ4MDApIHsKICAgICAgICAgICAgLy8gUG9zc2libGUgbGVhZCBzdXJyb2dhdGUuCiAgICAgICAgICAgIGlmIChpbmRleCArIDEgPCBlbmQpIHsKICAgICAgICAgICAgICBpbnQgdGFpbCA9IGNvbXBvbmVudC5jb2RlVW5pdEF0KGluZGV4ICsgMSk7CiAgICAgICAgICAgICAgaWYgKCh0YWlsICYgMHhGQzAwKSA9PSAweERDMDApIHsKICAgICAgICAgICAgICAgIC8vIFRhaWwgc3Vycm9nYXRlLgogICAgICAgICAgICAgICAgc291cmNlTGVuZ3RoID0gMjsKICAgICAgICAgICAgICAgIGNoYXIgPSAweDEwMDAwIHwgKChjaGFyICYgMHgzZmYpIDw8IDEwKSB8ICh0YWlsICYgMHgzZmYpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmVwbGFjZW1lbnQgPSBfZXNjYXBlQ2hhcihjaGFyKTsKICAgICAgICB9CiAgICAgICAgYnVmZmVyID8/PSBTdHJpbmdCdWZmZXIoKTsKICAgICAgICBidWZmZXIud3JpdGUoY29tcG9uZW50LnN1YnN0cmluZyhzZWN0aW9uU3RhcnQsIGluZGV4KSk7CiAgICAgICAgYnVmZmVyLndyaXRlKHJlcGxhY2VtZW50KTsKICAgICAgICBpbmRleCArPSBzb3VyY2VMZW5ndGg7CiAgICAgICAgc2VjdGlvblN0YXJ0ID0gaW5kZXg7CiAgICAgIH0KICAgIH0KICAgIGlmIChidWZmZXIgPT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChzZWN0aW9uU3RhcnQgPCBlbmQpIHsKICAgICAgYnVmZmVyLndyaXRlKGNvbXBvbmVudC5zdWJzdHJpbmcoc2VjdGlvblN0YXJ0LCBlbmQpKTsKICAgIH0KICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9CgogIHN0YXRpYyBib29sIF9pc1NjaGVtZUNoYXJhY3RlcihpbnQgY2gpIHsKICAgIHJldHVybiBjaCA8IDEyOCAmJiAoKF9zY2hlbWVUYWJsZVtjaCA+PiA0XSAmICgxIDw8IChjaCAmIDB4MGYpKSkgIT0gMCk7CiAgfQoKICBzdGF0aWMgYm9vbCBfaXNHZW5lcmFsRGVsaW1pdGVyKGludCBjaCkgewogICAgcmV0dXJuIGNoIDw9IF9SSUdIVF9CUkFDS0VUICYmCiAgICAgICAgKChfZ2VuRGVsaW1pdGVyc1RhYmxlW2NoID4+IDRdICYgKDEgPDwgKGNoICYgMHgwZikpKSAhPSAwKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgd2hldGhlciB0aGUgVVJJIGlzIGFic29sdXRlLgogICAqLwogIGJvb2wgZ2V0IGlzQWJzb2x1dGUgPT4gc2NoZW1lICE9ICIiICYmIGZyYWdtZW50ID09ICIiOwoKICBTdHJpbmcgX21lcmdlUGF0aHMoU3RyaW5nIGJhc2UsIFN0cmluZyByZWZlcmVuY2UpIHsKICAgIC8vIE9wdGltaXplIGZvciB0aGUgY2FzZTogYWJzb2x1dGUgYmFzZSwgcmVmZXJlbmNlIGJlZ2lubmluZyB3aXRoICIuLi8iLgogICAgaW50IGJhY2tDb3VudCA9IDA7CiAgICBpbnQgcmVmU3RhcnQgPSAwOwogICAgLy8gQ291bnQgbnVtYmVyIG9mICIuLi8iIGF0IGJlZ2lubmluZyBvZiByZWZlcmVuY2UuCiAgICB3aGlsZSAocmVmZXJlbmNlLnN0YXJ0c1dpdGgoIi4uLyIsIHJlZlN0YXJ0KSkgewogICAgICByZWZTdGFydCArPSAzOwogICAgICBiYWNrQ291bnQrKzsKICAgIH0KCiAgICAvLyBEcm9wIGxhc3Qgc2VnbWVudCAtIGV2ZXJ5dGhpbmcgYWZ0ZXIgbGFzdCAnLycgb2YgYmFzZS4KICAgIGludCBiYXNlRW5kID0gYmFzZS5sYXN0SW5kZXhPZignLycpOwogICAgLy8gRHJvcCBleHRyYSBzZWdtZW50cyBmb3IgZWFjaCBsZWFkaW5nICIuLi8iIG9mIHJlZmVyZW5jZS4KICAgIHdoaWxlIChiYXNlRW5kID4gMCAmJiBiYWNrQ291bnQgPiAwKSB7CiAgICAgIGludCBuZXdFbmQgPSBiYXNlLmxhc3RJbmRleE9mKCcvJywgYmFzZUVuZCAtIDEpOwogICAgICBpZiAobmV3RW5kIDwgMCkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGludCBkZWx0YSA9IGJhc2VFbmQgLSBuZXdFbmQ7CiAgICAgIC8vIElmIHdlIHNlZSBhICIuIiBvciAiLi4iIHNlZ21lbnQgaW4gYmFzZSwgc3RvcCBoZXJlIGFuZCBsZXQKICAgICAgLy8gX3JlbW92ZURvdFNlZ21lbnRzIGhhbmRsZSBpdC4KICAgICAgaWYgKChkZWx0YSA9PSAyIHx8IGRlbHRhID09IDMpICYmCiAgICAgICAgICBiYXNlLmNvZGVVbml0QXQobmV3RW5kICsgMSkgPT0gX0RPVCAmJgogICAgICAgICAgKGRlbHRhID09IDIgfHwgYmFzZS5jb2RlVW5pdEF0KG5ld0VuZCArIDIpID09IF9ET1QpKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgYmFzZUVuZCA9IG5ld0VuZDsKICAgICAgYmFja0NvdW50LS07CiAgICB9CiAgICByZXR1cm4gYmFzZS5yZXBsYWNlUmFuZ2UoCiAgICAgICAgYmFzZUVuZCArIDEsIG51bGwsIHJlZmVyZW5jZS5zdWJzdHJpbmcocmVmU3RhcnQgLSAzICogYmFja0NvdW50KSk7CiAgfQoKICAvLy8gTWFrZSBhIGd1ZXNzIGF0IHdoZXRoZXIgYSBwYXRoIGNvbnRhaW5zIGEgYC4uYCBvciBgLmAgc2VnbWVudC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIHByaW1pdGl2ZSB0ZXN0IHRoYXQgY2FuIGNhdXNlIGZhbHNlIHBvc2l0aXZlcy4KICAvLy8gSXQncyBvbmx5IHVzZWQgdG8gYXZvaWQgYSBtb3JlIGV4cGVuc2l2ZSBvcGVyYXRpb24gaW4gdGhlIGNhc2Ugd2hlcmUKICAvLy8gaXQncyBub3QgbmVjZXNzYXJ5LgogIHN0YXRpYyBib29sIF9tYXlDb250YWluRG90U2VnbWVudHMoU3RyaW5nIHBhdGgpIHsKICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoJy4nKSkgcmV0dXJuIHRydWU7CiAgICBpbnQgaW5kZXggPSBwYXRoLmluZGV4T2YoIi8uIik7CiAgICByZXR1cm4gaW5kZXggIT0gLTE7CiAgfQoKICAvLy8gUmVtb3ZlcyAnLicgYW5kICcuLicgc2VnbWVudHMgZnJvbSBhIHBhdGguCiAgLy8vCiAgLy8vIEZvbGxvd3MgdGhlIFJGQyAyOTg2ICJyZW1vdmUgZG90IHNlZ21lbnRzIiBhbGdvcml0aG0uCiAgLy8vIFRoaXMgYWxnb3JpdGhtIGlzIG9ubHkgdXNlZCBvbiBwYXRocyBvZiBVUklzIHdpdGggYSBzY2hlbWUsCiAgLy8vIGFuZCBpdCB0cmVhdHMgdGhlIHBhdGggYXMgaWYgaXQgaXMgYWJzb2x1dGUgKGxlYWRpbmcgJy4uJyBhcmUgcmVtb3ZlZCkuCiAgc3RhdGljIFN0cmluZyBfcmVtb3ZlRG90U2VnbWVudHMoU3RyaW5nIHBhdGgpIHsKICAgIGlmICghX21heUNvbnRhaW5Eb3RTZWdtZW50cyhwYXRoKSkgcmV0dXJuIHBhdGg7CiAgICBhc3NlcnQocGF0aC5pc05vdEVtcHR5KTsgLy8gQW4gZW1wdHkgcGF0aCB3b3VsZCBub3QgaGF2ZSBkb3Qgc2VnbWVudHMuCiAgICBMaXN0PFN0cmluZz4gb3V0cHV0ID0gW107CiAgICBib29sIGFwcGVuZFNsYXNoID0gZmFsc2U7CiAgICBmb3IgKFN0cmluZyBzZWdtZW50IGluIHBhdGguc3BsaXQoIi8iKSkgewogICAgICBhcHBlbmRTbGFzaCA9IGZhbHNlOwogICAgICBpZiAoc2VnbWVudCA9PSAiLi4iKSB7CiAgICAgICAgaWYgKG91dHB1dC5pc05vdEVtcHR5KSB7CiAgICAgICAgICBvdXRwdXQucmVtb3ZlTGFzdCgpOwogICAgICAgICAgaWYgKG91dHB1dC5pc0VtcHR5KSB7CiAgICAgICAgICAgIG91dHB1dC5hZGQoIiIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBhcHBlbmRTbGFzaCA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAoIi4iID09IHNlZ21lbnQpIHsKICAgICAgICBhcHBlbmRTbGFzaCA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3V0cHV0LmFkZChzZWdtZW50KTsKICAgICAgfQogICAgfQogICAgaWYgKGFwcGVuZFNsYXNoKSBvdXRwdXQuYWRkKCIiKTsKICAgIHJldHVybiBvdXRwdXQuam9pbigiLyIpOwogIH0KCiAgLy8vIFJlbW92ZXMgYWxsIGAuYCBzZWdtZW50cyBhbmQgYW55IG5vbi1sZWFkaW5nIGAuLmAgc2VnbWVudHMuCiAgLy8vCiAgLy8vIElmIHRoZSBwYXRoIHN0YXJ0cyB3aXRoIHNvbWV0aGluZyB0aGF0IGxvb2tzIGxpa2UgYSBzY2hlbWUsCiAgLy8vIGFuZCBbYWxsb3dTY2hlbWVdIGlzIGZhbHNlLCB0aGUgY29sb24gaXMgZXNjYXBlZC4KICAvLy8KICAvLy8gUmVtb3ZpbmcgdGhlICIuLiIgZnJvbSBhICJiYXIvZm9vLy4uIiBzZXF1ZW5jZSByZXN1bHRzIGluICJiYXIvIgogIC8vLyAodHJhaWxpbmcgIi8iKS4gSWYgdGhlIGVudGlyZSBwYXRoIGlzIHJlbW92ZWQgKGJlY2F1c2UgaXQgY29udGFpbnMgYXMKICAvLy8gbWFueSAiLi4iIHNlZ21lbnRzIGFzIHJlYWwgc2VnbWVudHMpLCB0aGUgcmVzdWx0IGlzICIuLyIuCiAgLy8vIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gYW4gZW1wdHkgc3RyaW5nLCB3aGljaCByZXByZXNlbnRzICJubyBwYXRoIiwKICAvLy8gd2hlbiB5b3UgcmVzb2x2ZSBpdCBhZ2FpbnN0IGEgYmFzZSBVUkkgd2l0aCBhIHBhdGggd2l0aCBhIG5vbi1lbXB0eQogIC8vLyBmaW5hbCBzZWdtZW50LgogIHN0YXRpYyBTdHJpbmcgX25vcm1hbGl6ZVJlbGF0aXZlUGF0aChTdHJpbmcgcGF0aCwgYm9vbCBhbGxvd1NjaGVtZSkgewogICAgYXNzZXJ0KCFwYXRoLnN0YXJ0c1dpdGgoJy8nKSk7IC8vIE9ubHkgZ2V0IGNhbGxlZCBmb3IgcmVsYXRpdmUgcGF0aHMuCiAgICBpZiAoIV9tYXlDb250YWluRG90U2VnbWVudHMocGF0aCkpIHsKICAgICAgaWYgKCFhbGxvd1NjaGVtZSkgcGF0aCA9IF9lc2NhcGVTY2hlbWUocGF0aCk7CiAgICAgIHJldHVybiBwYXRoOwogICAgfQogICAgYXNzZXJ0KHBhdGguaXNOb3RFbXB0eSk7IC8vIEFuIGVtcHR5IHBhdGggd291bGQgbm90IGhhdmUgZG90IHNlZ21lbnRzLgogICAgTGlzdDxTdHJpbmc+IG91dHB1dCA9IFtdOwogICAgYm9vbCBhcHBlbmRTbGFzaCA9IGZhbHNlOwogICAgZm9yIChTdHJpbmcgc2VnbWVudCBpbiBwYXRoLnNwbGl0KCIvIikpIHsKICAgICAgYXBwZW5kU2xhc2ggPSBmYWxzZTsKICAgICAgaWYgKCIuLiIgPT0gc2VnbWVudCkgewogICAgICAgIGlmICghb3V0cHV0LmlzRW1wdHkgJiYgb3V0cHV0Lmxhc3QgIT0gIi4uIikgewogICAgICAgICAgb3V0cHV0LnJlbW92ZUxhc3QoKTsKICAgICAgICAgIGFwcGVuZFNsYXNoID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgb3V0cHV0LmFkZCgiLi4iKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoIi4iID09IHNlZ21lbnQpIHsKICAgICAgICBhcHBlbmRTbGFzaCA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3V0cHV0LmFkZChzZWdtZW50KTsKICAgICAgfQogICAgfQogICAgaWYgKG91dHB1dC5pc0VtcHR5IHx8IChvdXRwdXQubGVuZ3RoID09IDEgJiYgb3V0cHV0WzBdLmlzRW1wdHkpKSB7CiAgICAgIHJldHVybiAiLi8iOwogICAgfQogICAgaWYgKGFwcGVuZFNsYXNoIHx8IG91dHB1dC5sYXN0ID09ICcuLicpIG91dHB1dC5hZGQoIiIpOwogICAgaWYgKCFhbGxvd1NjaGVtZSkgb3V0cHV0WzBdID0gX2VzY2FwZVNjaGVtZShvdXRwdXRbMF0pOwogICAgcmV0dXJuIG91dHB1dC5qb2luKCIvIik7CiAgfQoKICAvLy8gSWYgW3BhdGhdIHN0YXJ0cyB3aXRoIGEgdmFsaWQgc2NoZW1lLCBlc2NhcGUgdGhlIHBlcmNlbnQuCiAgc3RhdGljIFN0cmluZyBfZXNjYXBlU2NoZW1lKFN0cmluZyBwYXRoKSB7CiAgICBpZiAocGF0aC5sZW5ndGggPj0gMiAmJiBfaXNBbHBoYWJldGljQ2hhcmFjdGVyKHBhdGguY29kZVVuaXRBdCgwKSkpIHsKICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaW50IGNoYXIgPSBwYXRoLmNvZGVVbml0QXQoaSk7CiAgICAgICAgaWYgKGNoYXIgPT0gX0NPTE9OKSB7CiAgICAgICAgICByZXR1cm4gIiR7cGF0aC5zdWJzdHJpbmcoMCwgaSl9JTNBJHtwYXRoLnN1YnN0cmluZyhpICsgMSl9IjsKICAgICAgICB9CiAgICAgICAgaWYgKGNoYXIgPiAxMjcgfHwKICAgICAgICAgICAgKChfc2NoZW1lVGFibGVbY2hhciA+PiA0XSAmICgxIDw8IChjaGFyICYgMHgwZikpKSA9PSAwKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcGF0aDsKICB9CgogIFVyaSByZXNvbHZlKFN0cmluZyByZWZlcmVuY2UpIHsKICAgIHJldHVybiByZXNvbHZlVXJpKFVyaS5wYXJzZShyZWZlcmVuY2UpKTsKICB9CgogIFVyaSByZXNvbHZlVXJpKFVyaSByZWZlcmVuY2UpIHsKICAgIC8vIEZyb20gUkZDIDM5ODYuCiAgICBTdHJpbmcgdGFyZ2V0U2NoZW1lOwogICAgU3RyaW5nIHRhcmdldFVzZXJJbmZvID0gIiI7CiAgICBTdHJpbmcgdGFyZ2V0SG9zdDsKICAgIGludCB0YXJnZXRQb3J0OwogICAgU3RyaW5nIHRhcmdldFBhdGg7CiAgICBTdHJpbmcgdGFyZ2V0UXVlcnk7CiAgICBpZiAocmVmZXJlbmNlLnNjaGVtZS5pc05vdEVtcHR5KSB7CiAgICAgIHRhcmdldFNjaGVtZSA9IHJlZmVyZW5jZS5zY2hlbWU7CiAgICAgIGlmIChyZWZlcmVuY2UuaGFzQXV0aG9yaXR5KSB7CiAgICAgICAgdGFyZ2V0VXNlckluZm8gPSByZWZlcmVuY2UudXNlckluZm87CiAgICAgICAgdGFyZ2V0SG9zdCA9IHJlZmVyZW5jZS5ob3N0OwogICAgICAgIHRhcmdldFBvcnQgPSByZWZlcmVuY2UuaGFzUG9ydCA/IHJlZmVyZW5jZS5wb3J0IDogbnVsbDsKICAgICAgfQogICAgICB0YXJnZXRQYXRoID0gX3JlbW92ZURvdFNlZ21lbnRzKHJlZmVyZW5jZS5wYXRoKTsKICAgICAgaWYgKHJlZmVyZW5jZS5oYXNRdWVyeSkgewogICAgICAgIHRhcmdldFF1ZXJ5ID0gcmVmZXJlbmNlLnF1ZXJ5OwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0YXJnZXRTY2hlbWUgPSB0aGlzLnNjaGVtZTsKICAgICAgaWYgKHJlZmVyZW5jZS5oYXNBdXRob3JpdHkpIHsKICAgICAgICB0YXJnZXRVc2VySW5mbyA9IHJlZmVyZW5jZS51c2VySW5mbzsKICAgICAgICB0YXJnZXRIb3N0ID0gcmVmZXJlbmNlLmhvc3Q7CiAgICAgICAgdGFyZ2V0UG9ydCA9CiAgICAgICAgICAgIF9tYWtlUG9ydChyZWZlcmVuY2UuaGFzUG9ydCA/IHJlZmVyZW5jZS5wb3J0IDogbnVsbCwgdGFyZ2V0U2NoZW1lKTsKICAgICAgICB0YXJnZXRQYXRoID0gX3JlbW92ZURvdFNlZ21lbnRzKHJlZmVyZW5jZS5wYXRoKTsKICAgICAgICBpZiAocmVmZXJlbmNlLmhhc1F1ZXJ5KSB0YXJnZXRRdWVyeSA9IHJlZmVyZW5jZS5xdWVyeTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0YXJnZXRVc2VySW5mbyA9IHRoaXMuX3VzZXJJbmZvOwogICAgICAgIHRhcmdldEhvc3QgPSB0aGlzLl9ob3N0OwogICAgICAgIHRhcmdldFBvcnQgPSB0aGlzLl9wb3J0OwogICAgICAgIGlmIChyZWZlcmVuY2UucGF0aCA9PSAiIikgewogICAgICAgICAgdGFyZ2V0UGF0aCA9IHRoaXMucGF0aDsKICAgICAgICAgIGlmIChyZWZlcmVuY2UuaGFzUXVlcnkpIHsKICAgICAgICAgICAgdGFyZ2V0UXVlcnkgPSByZWZlcmVuY2UucXVlcnk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0YXJnZXRRdWVyeSA9IHRoaXMuX3F1ZXJ5OwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAocmVmZXJlbmNlLmhhc0Fic29sdXRlUGF0aCkgewogICAgICAgICAgICB0YXJnZXRQYXRoID0gX3JlbW92ZURvdFNlZ21lbnRzKHJlZmVyZW5jZS5wYXRoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIFJGQyAzOTg2IGJlaGF2aW9yIGZvciBtZXJnaW5nLgogICAgICAgICAgICBpZiAodGhpcy5oYXNFbXB0eVBhdGgpIHsKICAgICAgICAgICAgICBpZiAoIXRoaXMuaGFzQXV0aG9yaXR5KSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaGFzU2NoZW1lKSB7CiAgICAgICAgICAgICAgICAgIC8vIEtlZXAgdGhlIHBhdGggcmVsYXRpdmUgaWYgbm8gc2NoZW1lIG9yIGF1dGhvcml0eS4KICAgICAgICAgICAgICAgICAgdGFyZ2V0UGF0aCA9IHJlZmVyZW5jZS5wYXRoOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGxlYWRpbmcgZG90LXNlZ21lbnRzIGlmIHRoZSBwYXRoIGlzIHB1dAogICAgICAgICAgICAgICAgICAvLyBiZW5lYXRoIGEgc2NoZW1lLgogICAgICAgICAgICAgICAgICB0YXJnZXRQYXRoID0gX3JlbW92ZURvdFNlZ21lbnRzKHJlZmVyZW5jZS5wYXRoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gUkZDIGFsZ29yaXRobSBmb3IgYmFzZSB3aXRoIGF1dGhvcml0eSBhbmQgZW1wdHkgcGF0aC4KICAgICAgICAgICAgICAgIHRhcmdldFBhdGggPSBfcmVtb3ZlRG90U2VnbWVudHMoIi8iICsgcmVmZXJlbmNlLnBhdGgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2YXIgbWVyZ2VkUGF0aCA9IF9tZXJnZVBhdGhzKHRoaXMucGF0aCwgcmVmZXJlbmNlLnBhdGgpOwogICAgICAgICAgICAgIGlmICh0aGlzLmhhc1NjaGVtZSB8fCB0aGlzLmhhc0F1dGhvcml0eSB8fCB0aGlzLmhhc0Fic29sdXRlUGF0aCkgewogICAgICAgICAgICAgICAgdGFyZ2V0UGF0aCA9IF9yZW1vdmVEb3RTZWdtZW50cyhtZXJnZWRQYXRoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gTm9uLVJGQyAzOTg2IGJlaGF2aW9yLgogICAgICAgICAgICAgICAgLy8gSWYgYm90aCBiYXNlIGFuZCByZWZlcmVuY2UgYXJlIHJlbGF0aXZlIHBhdGhzLAogICAgICAgICAgICAgICAgLy8gYWxsb3cgdGhlIG1lcmdlZCBwYXRoIHRvIHN0YXJ0IHdpdGggIi4uIi4KICAgICAgICAgICAgICAgIC8vIFRoZSBSRkMgb25seSBzcGVjaWZpZXMgdGhlIGNhc2Ugd2hlcmUgdGhlIGJhc2UgaGFzIGEgc2NoZW1lLgogICAgICAgICAgICAgICAgdGFyZ2V0UGF0aCA9IF9ub3JtYWxpemVSZWxhdGl2ZVBhdGgoCiAgICAgICAgICAgICAgICAgICAgbWVyZ2VkUGF0aCwgdGhpcy5oYXNTY2hlbWUgfHwgdGhpcy5oYXNBdXRob3JpdHkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHJlZmVyZW5jZS5oYXNRdWVyeSkgdGFyZ2V0UXVlcnkgPSByZWZlcmVuY2UucXVlcnk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBTdHJpbmcgZnJhZ21lbnQgPSByZWZlcmVuY2UuaGFzRnJhZ21lbnQgPyByZWZlcmVuY2UuZnJhZ21lbnQgOiBudWxsOwogICAgcmV0dXJuIF9VcmkuX2ludGVybmFsKHRhcmdldFNjaGVtZSwgdGFyZ2V0VXNlckluZm8sIHRhcmdldEhvc3QsIHRhcmdldFBvcnQsCiAgICAgICAgdGFyZ2V0UGF0aCwgdGFyZ2V0UXVlcnksIGZyYWdtZW50KTsKICB9CgogIGJvb2wgZ2V0IGhhc1NjaGVtZSA9PiBzY2hlbWUuaXNOb3RFbXB0eTsKCiAgYm9vbCBnZXQgaGFzQXV0aG9yaXR5ID0+IF9ob3N0ICE9IG51bGw7CgogIGJvb2wgZ2V0IGhhc1BvcnQgPT4gX3BvcnQgIT0gbnVsbDsKCiAgYm9vbCBnZXQgaGFzUXVlcnkgPT4gX3F1ZXJ5ICE9IG51bGw7CgogIGJvb2wgZ2V0IGhhc0ZyYWdtZW50ID0+IF9mcmFnbWVudCAhPSBudWxsOwoKICBib29sIGdldCBoYXNFbXB0eVBhdGggPT4gcGF0aC5pc0VtcHR5OwoKICBib29sIGdldCBoYXNBYnNvbHV0ZVBhdGggPT4gcGF0aC5zdGFydHNXaXRoKCcvJyk7CgogIFN0cmluZyBnZXQgb3JpZ2luIHsKICAgIGlmIChzY2hlbWUgPT0gIiIpIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcigiQ2Fubm90IHVzZSBvcmlnaW4gd2l0aG91dCBhIHNjaGVtZTogJHRoaXMiKTsKICAgIH0KICAgIGlmIChzY2hlbWUgIT0gImh0dHAiICYmIHNjaGVtZSAhPSAiaHR0cHMiKSB7CiAgICAgIHRocm93IFN0YXRlRXJyb3IoCiAgICAgICAgICAiT3JpZ2luIGlzIG9ubHkgYXBwbGljYWJsZSBzY2hlbWVzIGh0dHAgYW5kIGh0dHBzOiAkdGhpcyIpOwogICAgfQogICAgaWYgKF9ob3N0ID09IG51bGwgfHwgX2hvc3QgPT0gIiIpIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcigKICAgICAgICAgICJBICRzY2hlbWU6IFVSSSBzaG91bGQgaGF2ZSBhIG5vbi1lbXB0eSBob3N0IG5hbWU6ICR0aGlzIik7CiAgICB9CiAgICBpZiAoX3BvcnQgPT0gbnVsbCkgcmV0dXJuICIkc2NoZW1lOi8vJF9ob3N0IjsKICAgIHJldHVybiAiJHNjaGVtZTovLyRfaG9zdDokX3BvcnQiOwogIH0KCiAgU3RyaW5nIHRvRmlsZVBhdGgoe2Jvb2wgd2luZG93c30pIHsKICAgIGlmIChzY2hlbWUgIT0gIiIgJiYgc2NoZW1lICE9ICJmaWxlIikgewogICAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgJHNjaGVtZSBVUkkiKTsKICAgIH0KICAgIGlmIChxdWVyeSAhPSAiIikgewogICAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICAgIkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20gYSBVUkkgd2l0aCBhIHF1ZXJ5IGNvbXBvbmVudCIpOwogICAgfQogICAgaWYgKGZyYWdtZW50ICE9ICIiKSB7CiAgICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGggZnJvbSBhIFVSSSB3aXRoIGEgZnJhZ21lbnQgY29tcG9uZW50Iik7CiAgICB9CiAgICB3aW5kb3dzID8/PSBfaXNXaW5kb3dzOwogICAgcmV0dXJuIHdpbmRvd3MgPyBfdG9XaW5kb3dzRmlsZVBhdGgodGhpcykgOiBfdG9GaWxlUGF0aCgpOwogIH0KCiAgU3RyaW5nIF90b0ZpbGVQYXRoKCkgewogICAgaWYgKGhhc0F1dGhvcml0eSAmJiBob3N0ICE9ICIiKSB7CiAgICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAiQ2Fubm90IGV4dHJhY3QgYSBub24tV2luZG93cyBmaWxlIHBhdGggZnJvbSBhIGZpbGUgVVJJICIKICAgICAgICAgICJ3aXRoIGFuIGF1dGhvcml0eSIpOwogICAgfQogICAgLy8gVXNlIHBhdGggc2VnbWVudHMgdG8gaGF2ZSBhbnkgZXNjYXBlcyB1bmVzY2FwZWQuCiAgICB2YXIgcGF0aFNlZ21lbnRzID0gdGhpcy5wYXRoU2VnbWVudHM7CiAgICBfY2hlY2tOb25XaW5kb3dzUGF0aFJlc2VydmVkQ2hhcmFjdGVycyhwYXRoU2VnbWVudHMsIGZhbHNlKTsKICAgIHZhciByZXN1bHQgPSBTdHJpbmdCdWZmZXIoKTsKICAgIGlmIChoYXNBYnNvbHV0ZVBhdGgpIHJlc3VsdC53cml0ZSgiLyIpOwogICAgcmVzdWx0LndyaXRlQWxsKHBhdGhTZWdtZW50cywgIi8iKTsKICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKICB9CgogIHN0YXRpYyBTdHJpbmcgX3RvV2luZG93c0ZpbGVQYXRoKFVyaSB1cmkpIHsKICAgIGJvb2wgaGFzRHJpdmVMZXR0ZXIgPSBmYWxzZTsKICAgIHZhciBzZWdtZW50cyA9IHVyaS5wYXRoU2VnbWVudHM7CiAgICBpZiAoc2VnbWVudHMubGVuZ3RoID4gMCAmJgogICAgICAgIHNlZ21lbnRzWzBdLmxlbmd0aCA9PSAyICYmCiAgICAgICAgc2VnbWVudHNbMF0uY29kZVVuaXRBdCgxKSA9PSBfQ09MT04pIHsKICAgICAgX2NoZWNrV2luZG93c0RyaXZlTGV0dGVyKHNlZ21lbnRzWzBdLmNvZGVVbml0QXQoMCksIGZhbHNlKTsKICAgICAgX2NoZWNrV2luZG93c1BhdGhSZXNlcnZlZENoYXJhY3RlcnMoc2VnbWVudHMsIGZhbHNlLCAxKTsKICAgICAgaGFzRHJpdmVMZXR0ZXIgPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgX2NoZWNrV2luZG93c1BhdGhSZXNlcnZlZENoYXJhY3RlcnMoc2VnbWVudHMsIGZhbHNlLCAwKTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBTdHJpbmdCdWZmZXIoKTsKICAgIGlmICh1cmkuaGFzQWJzb2x1dGVQYXRoICYmICFoYXNEcml2ZUxldHRlcikgcmVzdWx0LndyaXRlKHIiXCIpOwogICAgaWYgKHVyaS5oYXNBdXRob3JpdHkpIHsKICAgICAgdmFyIGhvc3QgPSB1cmkuaG9zdDsKICAgICAgaWYgKGhvc3QuaXNOb3RFbXB0eSkgewogICAgICAgIHJlc3VsdC53cml0ZShyIlwiKTsKICAgICAgICByZXN1bHQud3JpdGUoaG9zdCk7CiAgICAgICAgcmVzdWx0LndyaXRlKHIiXCIpOwogICAgICB9CiAgICB9CiAgICByZXN1bHQud3JpdGVBbGwoc2VnbWVudHMsIHIiXCIpOwogICAgaWYgKGhhc0RyaXZlTGV0dGVyICYmIHNlZ21lbnRzLmxlbmd0aCA9PSAxKSByZXN1bHQud3JpdGUociJcIik7CiAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CiAgfQoKICBib29sIGdldCBfaXNQYXRoQWJzb2x1dGUgewogICAgcmV0dXJuIHBhdGggIT0gbnVsbCAmJiBwYXRoLnN0YXJ0c1dpdGgoJy8nKTsKICB9CgogIHZvaWQgX3dyaXRlQXV0aG9yaXR5KFN0cmluZ1Npbmsgc3MpIHsKICAgIGlmIChfdXNlckluZm8uaXNOb3RFbXB0eSkgewogICAgICBzcy53cml0ZShfdXNlckluZm8pOwogICAgICBzcy53cml0ZSgiQCIpOwogICAgfQogICAgaWYgKF9ob3N0ICE9IG51bGwpIHNzLndyaXRlKF9ob3N0KTsKICAgIGlmIChfcG9ydCAhPSBudWxsKSB7CiAgICAgIHNzLndyaXRlKCI6Iik7CiAgICAgIHNzLndyaXRlKF9wb3J0KTsKICAgIH0KICB9CgogIC8qKgogICAqIEFjY2VzcyB0aGUgc3RydWN0dXJlIG9mIGEgYGRhdGE6YCBVUkkuCiAgICoKICAgKiBSZXR1cm5zIGEgW1VyaURhdGFdIG9iamVjdCBmb3IgYGRhdGE6YCBVUklzIGFuZCBgbnVsbGAgZm9yIGFsbCBvdGhlcgogICAqIFVSSXMuCiAgICogVGhlIFtVcmlEYXRhXSBvYmplY3QgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSBtZWRpYSB0eXBlIGFuZCBkYXRhCiAgICogb2YgYSBgZGF0YTpgIFVSSS4KICAgKi8KICBVcmlEYXRhIGdldCBkYXRhID0+IChzY2hlbWUgPT0gImRhdGEiKSA/IFVyaURhdGEuZnJvbVVyaSh0aGlzKSA6IG51bGw7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiBfdGV4dCA/Pz0gX2luaXRpYWxpemVUZXh0KCk7CiAgfQoKICBTdHJpbmcgX2luaXRpYWxpemVUZXh0KCkgewogICAgYXNzZXJ0KF90ZXh0ID09IG51bGwpOwogICAgU3RyaW5nQnVmZmVyIHNiID0gU3RyaW5nQnVmZmVyKCk7CiAgICBpZiAoc2NoZW1lLmlzTm90RW1wdHkpIHNiLi53cml0ZShzY2hlbWUpLi53cml0ZSgiOiIpOwogICAgaWYgKGhhc0F1dGhvcml0eSB8fCAoc2NoZW1lID09ICJmaWxlIikpIHsKICAgICAgLy8gRmlsZSBVUklTIGFsd2F5cyBoYXZlIHRoZSBhdXRob3JpdHksIGV2ZW4gaWYgaXQgaXMgZW1wdHkuCiAgICAgIC8vIFRoZSBlbXB0eSBVUkkgbWVhbnMgImxvY2FsaG9zdCIuCiAgICAgIHNiLndyaXRlKCIvLyIpOwogICAgICBfd3JpdGVBdXRob3JpdHkoc2IpOwogICAgfQogICAgc2Iud3JpdGUocGF0aCk7CiAgICBpZiAoX3F1ZXJ5ICE9IG51bGwpIHNiLi53cml0ZSgiPyIpLi53cml0ZShfcXVlcnkpOwogICAgaWYgKF9mcmFnbWVudCAhPSBudWxsKSBzYi4ud3JpdGUoIiMiKS4ud3JpdGUoX2ZyYWdtZW50KTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBvdGhlciBpcyBVcmkgJiYKICAgICAgICBzY2hlbWUgPT0gb3RoZXIuc2NoZW1lICYmCiAgICAgICAgaGFzQXV0aG9yaXR5ID09IG90aGVyLmhhc0F1dGhvcml0eSAmJgogICAgICAgIHVzZXJJbmZvID09IG90aGVyLnVzZXJJbmZvICYmCiAgICAgICAgaG9zdCA9PSBvdGhlci5ob3N0ICYmCiAgICAgICAgcG9ydCA9PSBvdGhlci5wb3J0ICYmCiAgICAgICAgcGF0aCA9PSBvdGhlci5wYXRoICYmCiAgICAgICAgaGFzUXVlcnkgPT0gb3RoZXIuaGFzUXVlcnkgJiYKICAgICAgICBxdWVyeSA9PSBvdGhlci5xdWVyeSAmJgogICAgICAgIGhhc0ZyYWdtZW50ID09IG90aGVyLmhhc0ZyYWdtZW50ICYmCiAgICAgICAgZnJhZ21lbnQgPT0gb3RoZXIuZnJhZ21lbnQ7CiAgfQoKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIHJldHVybiBfaGFzaENvZGVDYWNoZSA/Pz0gdG9TdHJpbmcoKS5oYXNoQ29kZTsKICB9CgogIHN0YXRpYyBMaXN0PFN0cmluZz4gX2NyZWF0ZUxpc3QoKSA9PiA8U3RyaW5nPltdOwoKICBzdGF0aWMgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBfc3BsaXRRdWVyeVN0cmluZ0FsbChTdHJpbmcgcXVlcnksCiAgICAgIHtFbmNvZGluZyBlbmNvZGluZyA9IHV0Zjh9KSB7CiAgICB2YXIgcmVzdWx0ID0gPFN0cmluZywgTGlzdDxTdHJpbmc+Pnt9OwogICAgaW50IGkgPSAwOwogICAgaW50IHN0YXJ0ID0gMDsKICAgIGludCBlcXVhbHNJbmRleCA9IC0xOwoKICAgIHZvaWQgcGFyc2VQYWlyKGludCBzdGFydCwgaW50IGVxdWFsc0luZGV4LCBpbnQgZW5kKSB7CiAgICAgIFN0cmluZyBrZXk7CiAgICAgIFN0cmluZyB2YWx1ZTsKICAgICAgaWYgKHN0YXJ0ID09IGVuZCkgcmV0dXJuOwogICAgICBpZiAoZXF1YWxzSW5kZXggPCAwKSB7CiAgICAgICAga2V5ID0gX3VyaURlY29kZShxdWVyeSwgc3RhcnQsIGVuZCwgZW5jb2RpbmcsIHRydWUpOwogICAgICAgIHZhbHVlID0gIiI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAga2V5ID0gX3VyaURlY29kZShxdWVyeSwgc3RhcnQsIGVxdWFsc0luZGV4LCBlbmNvZGluZywgdHJ1ZSk7CiAgICAgICAgdmFsdWUgPSBfdXJpRGVjb2RlKHF1ZXJ5LCBlcXVhbHNJbmRleCArIDEsIGVuZCwgZW5jb2RpbmcsIHRydWUpOwogICAgICB9CiAgICAgIHJlc3VsdC5wdXRJZkFic2VudChrZXksIF9jcmVhdGVMaXN0KS5hZGQodmFsdWUpOwogICAgfQoKICAgIHdoaWxlIChpIDwgcXVlcnkubGVuZ3RoKSB7CiAgICAgIGludCBjaGFyID0gcXVlcnkuY29kZVVuaXRBdChpKTsKICAgICAgaWYgKGNoYXIgPT0gX0VRVUFMUykgewogICAgICAgIGlmIChlcXVhbHNJbmRleCA8IDApIGVxdWFsc0luZGV4ID0gaTsKICAgICAgfSBlbHNlIGlmIChjaGFyID09IF9BTVBFUlNBTkQpIHsKICAgICAgICBwYXJzZVBhaXIoc3RhcnQsIGVxdWFsc0luZGV4LCBpKTsKICAgICAgICBzdGFydCA9IGkgKyAxOwogICAgICAgIGVxdWFsc0luZGV4ID0gLTE7CiAgICAgIH0KICAgICAgaSsrOwogICAgfQogICAgcGFyc2VQYWlyKHN0YXJ0LCBlcXVhbHNJbmRleCwgaSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgZXh0ZXJuYWwgc3RhdGljIFN0cmluZyBfdXJpRW5jb2RlKExpc3Q8aW50PiBjYW5vbmljYWxUYWJsZSwgU3RyaW5nIHRleHQsCiAgICAgIEVuY29kaW5nIGVuY29kaW5nLCBib29sIHNwYWNlVG9QbHVzKTsKCiAgLyoqCiAgICogQ29udmVydCBhIGJ5dGUgKDIgY2hhcmFjdGVyIGhleCBzZXF1ZW5jZSkgaW4gc3RyaW5nIFtzXSBzdGFydGluZwogICAqIGF0IHBvc2l0aW9uIFtwb3NdIHRvIGl0cyBvcmRpbmFsIHZhbHVlCiAgICovCiAgc3RhdGljIGludCBfaGV4Q2hhclBhaXJUb0J5dGUoU3RyaW5nIHMsIGludCBwb3MpIHsKICAgIGludCBieXRlID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAgIHZhciBjaGFyQ29kZSA9IHMuY29kZVVuaXRBdChwb3MgKyBpKTsKICAgICAgaWYgKDB4MzAgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gMHgzOSkgewogICAgICAgIGJ5dGUgPSBieXRlICogMTYgKyBjaGFyQ29kZSAtIDB4MzA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQ2hlY2sgcmFuZ2VzIEEtRiAoMHg0MS0weDQ2KSBhbmQgYS1mICgweDYxLTB4NjYpLgogICAgICAgIGNoYXJDb2RlIHw9IDB4MjA7CiAgICAgICAgaWYgKDB4NjEgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gMHg2NikgewogICAgICAgICAgYnl0ZSA9IGJ5dGUgKiAxNiArIGNoYXJDb2RlIC0gMHg1NzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcigiSW52YWxpZCBVUkwgZW5jb2RpbmciKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBieXRlOwogIH0KCiAgLyoqCiAgICogVXJpLWRlY29kZSBhIHBlcmNlbnQtZW5jb2RlZCBzdHJpbmcuCiAgICoKICAgKiBJdCB1bmVzY2FwZXMgdGhlIHN0cmluZyBbdGV4dF0gYW5kIHJldHVybnMgdGhlIHVuZXNjYXBlZCBzdHJpbmcuCiAgICoKICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIEphdmFTY3JpcHQtZnVuY3Rpb24gYGRlY29kZVVSSWAuCiAgICoKICAgKiBJZiBbcGx1c1RvU3BhY2VdIGlzIGB0cnVlYCwgcGx1cyBjaGFyYWN0ZXJzIHdpbGwgYmUgY29udmVydGVkIHRvIHNwYWNlcy4KICAgKgogICAqIFRoZSBkZWNvZGVyIHdpbGwgY3JlYXRlIGEgYnl0ZS1saXN0IG9mIHRoZSBwZXJjZW50LWVuY29kZWQgcGFydHMsIGFuZCB0aGVuCiAgICogZGVjb2RlIHRoZSBieXRlLWxpc3QgdXNpbmcgW2VuY29kaW5nXS4gVGhlIGRlZmF1bHQgZW5jb2RpbmdzIFVURi04LgogICAqLwogIHN0YXRpYyBTdHJpbmcgX3VyaURlY29kZSgKICAgICAgU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgRW5jb2RpbmcgZW5jb2RpbmcsIGJvb2wgcGx1c1RvU3BhY2UpIHsKICAgIGFzc2VydCgwIDw9IHN0YXJ0KTsKICAgIGFzc2VydChzdGFydCA8PSBlbmQpOwogICAgYXNzZXJ0KGVuZCA8PSB0ZXh0Lmxlbmd0aCk7CiAgICBhc3NlcnQoZW5jb2RpbmcgIT0gbnVsbCk7CiAgICAvLyBGaXJzdCBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGFueSBjaGFyYWN0ZXJzIHdoaWNoIG5lZWQgc3BlY2lhbCBoYW5kbGluZy4KICAgIGJvb2wgc2ltcGxlID0gdHJ1ZTsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIHZhciBjb2RlVW5pdCA9IHRleHQuY29kZVVuaXRBdChpKTsKICAgICAgaWYgKGNvZGVVbml0ID4gMTI3IHx8CiAgICAgICAgICBjb2RlVW5pdCA9PSBfUEVSQ0VOVCB8fAogICAgICAgICAgKHBsdXNUb1NwYWNlICYmIGNvZGVVbml0ID09IF9QTFVTKSkgewogICAgICAgIHNpbXBsZSA9IGZhbHNlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBMaXN0PGludD4gYnl0ZXM7CiAgICBpZiAoc2ltcGxlKSB7CiAgICAgIGlmICh1dGY4ID09IGVuY29kaW5nIHx8IGxhdGluMSA9PSBlbmNvZGluZyB8fCBhc2NpaSA9PSBlbmNvZGluZykgewogICAgICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZyhzdGFydCwgZW5kKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBieXRlcyA9IHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpLmNvZGVVbml0czsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYnl0ZXMgPSBMaXN0KCk7CiAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgICAgdmFyIGNvZGVVbml0ID0gdGV4dC5jb2RlVW5pdEF0KGkpOwogICAgICAgIGlmIChjb2RlVW5pdCA+IDEyNykgewogICAgICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcigiSWxsZWdhbCBwZXJjZW50IGVuY29kaW5nIGluIFVSSSIpOwogICAgICAgIH0KICAgICAgICBpZiAoY29kZVVuaXQgPT0gX1BFUkNFTlQpIHsKICAgICAgICAgIGlmIChpICsgMyA+IHRleHQubGVuZ3RoKSB7CiAgICAgICAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoJ1RydW5jYXRlZCBVUkknKTsKICAgICAgICAgIH0KICAgICAgICAgIGJ5dGVzLmFkZChfaGV4Q2hhclBhaXJUb0J5dGUodGV4dCwgaSArIDEpKTsKICAgICAgICAgIGkgKz0gMjsKICAgICAgICB9IGVsc2UgaWYgKHBsdXNUb1NwYWNlICYmIGNvZGVVbml0ID09IF9QTFVTKSB7CiAgICAgICAgICBieXRlcy5hZGQoX1NQQUNFKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYnl0ZXMuYWRkKGNvZGVVbml0KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBlbmNvZGluZy5kZWNvZGUoYnl0ZXMpOwogIH0KCiAgc3RhdGljIGJvb2wgX2lzQWxwaGFiZXRpY0NoYXJhY3RlcihpbnQgY29kZVVuaXQpIHsKICAgIHZhciBsb3dlckNhc2UgPSBjb2RlVW5pdCB8IDB4MjA7CiAgICByZXR1cm4gKF9MT1dFUl9DQVNFX0EgPD0gbG93ZXJDYXNlICYmIGxvd2VyQ2FzZSA8PSBfTE9XRVJfQ0FTRV9aKTsKICB9CgogIHN0YXRpYyBib29sIF9pc1VucmVzZXJ2ZWRDaGFyKGludCBjaGFyKSB7CiAgICByZXR1cm4gY2hhciA8IDEyNyAmJgogICAgICAgICgoX3VucmVzZXJ2ZWRUYWJsZVtjaGFyID4+IDRdICYgKDEgPDwgKGNoYXIgJiAweDBmKSkpICE9IDApOwogIH0KCiAgLy8gVGFibGVzIG9mIGNoYXItY29kZXMgb3JnYW5pemVkIGFzIGEgYml0IHZlY3RvciBvZiAxMjggYml0cyB3aGVyZQogIC8vIGVhY2ggYml0IGluZGljYXRlIHdoZXRoZXIgYSBjaGFyYWN0ZXIgY29kZSBvbiB0aGUgMC0xMjcgbmVlZHMgdG8KICAvLyBiZSBlc2NhcGVkIG9yIG5vdC4KCiAgLy8gVGhlIHVucmVzZXJ2ZWQgY2hhcmFjdGVycyBvZiBSRkMgMzk4Ni4KICBzdGF0aWMgY29uc3QgX3VucmVzZXJ2ZWRUYWJsZSA9IDxpbnQ+WwogICAgLy8gICAgICAgICAgICAgICAgICAgICBMU0IgICAgICAgICAgICBNU0IKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKICAgIDB4MDAwMCwgLy8gMHgwMCAtIDB4MGYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIDB4MDAwMCwgLy8gMHgxMCAtIDB4MWYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLgogICAgMHg2MDAwLCAvLyAweDIwIC0gMHgyZiAgMDAwMDAwMDAwMDAwMDExMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgMDEyMzQ1Njc4OQogICAgMHgwM2ZmLCAvLyAweDMwIC0gMHgzZiAgMTExMTExMTExMTAwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgIEFCQ0RFRkdISUpLTE1OTwogICAgMHhmZmZlLCAvLyAweDQwIC0gMHg0ZiAgMDExMTExMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgUFFSU1RVVldYWVogICAgXwogICAgMHg4N2ZmLCAvLyAweDUwIC0gMHg1ZiAgMTExMTExMTExMTEwMDAwMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgIGFiY2RlZmdoaWprbG1ubwogICAgMHhmZmZlLCAvLyAweDYwIC0gMHg2ZiAgMDExMTExMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgcHFyc3R1dnd4eXogICB+CiAgICAweDQ3ZmYsIC8vIDB4NzAgLSAweDdmICAxMTExMTExMTExMTAwMDEwCiAgXTsKCiAgLy8gVGhlIHVucmVzZXJ2ZWQgY2hhcmFjdGVycyBvZiBSRkMgMjM5Ni4KICBzdGF0aWMgY29uc3QgX3VucmVzZXJ2ZWQyMzk2VGFibGUgPSA8aW50PlsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgTFNCICAgICAgICAgICAgTVNCCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8CiAgICAweDAwMDAsIC8vIDB4MDAgLSAweDBmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAweDAwMDAsIC8vIDB4MTAgLSAweDFmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgISAgICAgJygpKiAgLS4KICAgIDB4Njc4MiwgLy8gMHgyMCAtIDB4MmYgIDAxMDAwMDAxMTExMDAxMTAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIDAxMjM0NTY3ODkKICAgIDB4MDNmZiwgLy8gMHgzMCAtIDB4M2YgIDExMTExMTExMTEwMDAwMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBBQkNERUZHSElKS0xNTk8KICAgIDB4ZmZmZSwgLy8gMHg0MCAtIDB4NGYgIDAxMTExMTExMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIFBRUlNUVVZXWFlaICAgIF8KICAgIDB4ODdmZiwgLy8gMHg1MCAtIDB4NWYgIDExMTExMTExMTExMDAwMDEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBhYmNkZWZnaGlqa2xtbm8KICAgIDB4ZmZmZSwgLy8gMHg2MCAtIDB4NmYgIDAxMTExMTExMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHBxcnN0dXZ3eHl6ICAgfgogICAgMHg0N2ZmLCAvLyAweDcwIC0gMHg3ZiAgMTExMTExMTExMTEwMDAxMAogIF07CgogIC8vIFRhYmxlIG9mIHJlc2VydmVkIGNoYXJhY3RlcnMgc3BlY2lmaWVkIGJ5IEVDTUFTY3JpcHQgNS4KICBzdGF0aWMgY29uc3QgX2VuY29kZUZ1bGxUYWJsZSA9IDxpbnQ+WwogICAgLy8gICAgICAgICAgICAgICAgICAgICBMU0IgICAgICAgICAgICBNU0IKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKICAgIDB4MDAwMCwgLy8gMHgwMCAtIDB4MGYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIDB4MDAwMCwgLy8gMHgxMCAtIDB4MWYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAhICMkICYnKCkqKywtLi8KICAgIDB4ZmZkYSwgLy8gMHgyMCAtIDB4MmYgIDAxMDExMDExMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIDAxMjM0NTY3ODk6OyA9ID8KICAgIDB4YWZmZiwgLy8gMHgzMCAtIDB4M2YgIDExMTExMTExMTExMTAxMDEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIEBBQkNERUZHSElKS0xNTk8KICAgIDB4ZmZmZiwgLy8gMHg0MCAtIDB4NGYgIDExMTExMTExMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIFBRUlNUVVZXWFlaICAgIF8KICAgIDB4ODdmZiwgLy8gMHg1MCAtIDB4NWYgIDExMTExMTExMTExMDAwMDEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBhYmNkZWZnaGlqa2xtbm8KICAgIDB4ZmZmZSwgLy8gMHg2MCAtIDB4NmYgIDAxMTExMTExMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHBxcnN0dXZ3eHl6ICAgfgogICAgMHg0N2ZmLCAvLyAweDcwIC0gMHg3ZiAgMTExMTExMTExMTEwMDAxMAogIF07CgogIC8vIENoYXJhY3RlcnMgYWxsb3dlZCBpbiB0aGUgc2NoZW1lLgogIHN0YXRpYyBjb25zdCBfc2NoZW1lVGFibGUgPSA8aW50PlsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgTFNCICAgICAgICAgICAgTVNCCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8CiAgICAweDAwMDAsIC8vIDB4MDAgLSAweDBmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAweDAwMDAsIC8vIDB4MTAgLSAweDFmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgLS4KICAgIDB4NjgwMCwgLy8gMHgyMCAtIDB4MmYgIDAwMDAwMDAwMDAwMTAxMTAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIDAxMjM0NTY3ODkKICAgIDB4MDNmZiwgLy8gMHgzMCAtIDB4M2YgIDExMTExMTExMTEwMDAwMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBBQkNERUZHSElKS0xNTk8KICAgIDB4ZmZmZSwgLy8gMHg0MCAtIDB4NGYgIDAxMTExMTExMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIFBRUlNUVVZXWFlaCiAgICAweDA3ZmYsIC8vIDB4NTAgLSAweDVmICAxMTExMTExMTExMTAwMDAxCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgYWJjZGVmZ2hpamtsbW5vCiAgICAweGZmZmUsIC8vIDB4NjAgLSAweDZmICAwMTExMTExMTExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBwcXJzdHV2d3h5egogICAgMHgwN2ZmLCAvLyAweDcwIC0gMHg3ZiAgMTExMTExMTExMTEwMDAxMAogIF07CgogIC8vIENoYXJhY3RlcnMgYWxsb3dlZCBpbiBzY2hlbWUgZXhjZXB0IGZvciB1cHBlciBjYXNlIGxldHRlcnMuCiAgc3RhdGljIGNvbnN0IF9zY2hlbWVMb3dlclRhYmxlID0gPGludD5bCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIExTQiAgICAgICAgICAgIE1TQgogICAgLy8gICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAogICAgMHgwMDAwLCAvLyAweDAwIC0gMHgwZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgMHgwMDAwLCAvLyAweDEwIC0gMHgxZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC0uCiAgICAweDY4MDAsIC8vIDB4MjAgLSAweDJmICAwMDAwMDAwMDAwMDEwMTEwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAwMTIzNDU2Nzg5CiAgICAweDAzZmYsIC8vIDB4MzAgLSAweDNmICAxMTExMTExMTExMDAwMDAwCiAgICAvLwogICAgMHgwMDAwLCAvLyAweDQwIC0gMHg0ZiAgMDExMTExMTExMTExMTExMQogICAgLy8KICAgIDB4MDAwMCwgLy8gMHg1MCAtIDB4NWYgIDExMTExMTExMTExMDAwMDEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBhYmNkZWZnaGlqa2xtbm8KICAgIDB4ZmZmZSwgLy8gMHg2MCAtIDB4NmYgIDAxMTExMTExMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHBxcnN0dXZ3eHl6CiAgICAweDA3ZmYsIC8vIDB4NzAgLSAweDdmICAxMTExMTExMTExMTAwMDEwCiAgXTsKCiAgLy8gU3ViIGRlbGltaXRlciBjaGFyYWN0ZXJzIGNvbWJpbmVkIHdpdGggdW5yZXNlcnZlZCBhcyBvZiAzOTg2LgogIC8vIHN1Yi1kZWxpbXMgID0gIiEiIC8gIiQiIC8gIiYiIC8gIiciIC8gIigiIC8gIikiCiAgLy8gICAgICAgICAvICIqIiAvICIrIiAvICIsIiAvICI7IiAvICI9IgogIC8vIFJGQyAzOTg2IHNlY3Rpb24gMi4zLgogIC8vIHVucmVzZXJ2ZWQgID0gQUxQSEEgLyBESUdJVCAvICItIiAvICIuIiAvICJfIiAvICJ+IgogIHN0YXRpYyBjb25zdCBfc3ViRGVsaW1pdGVyc1RhYmxlID0gPGludD5bCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIExTQiAgICAgICAgICAgIE1TQgogICAgLy8gICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAogICAgMHgwMDAwLCAvLyAweDAwIC0gMHgwZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgMHgwMDAwLCAvLyAweDEwIC0gMHgxZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICEgICQgJicoKSorLC0uCiAgICAweDdmZDIsIC8vIDB4MjAgLSAweDJmICAwMTAwMTAxMTExMTExMTEwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAwMTIzNDU2Nzg5IDsgPQogICAgMHgyYmZmLCAvLyAweDMwIC0gMHgzZiAgMTExMTExMTExMTAxMDEwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgIEFCQ0RFRkdISUpLTE1OTwogICAgMHhmZmZlLCAvLyAweDQwIC0gMHg0ZiAgMDExMTExMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgUFFSU1RVVldYWVogICAgXwogICAgMHg4N2ZmLCAvLyAweDUwIC0gMHg1ZiAgMTExMTExMTExMTEwMDAwMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgIGFiY2RlZmdoaWprbG1ubwogICAgMHhmZmZlLCAvLyAweDYwIC0gMHg2ZiAgMDExMTExMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgcHFyc3R1dnd4eXogICB+CiAgICAweDQ3ZmYsIC8vIDB4NzAgLSAweDdmICAxMTExMTExMTExMTAwMDEwCiAgXTsKCiAgLy8gR2VuZXJhbCBkZWxpbWl0ZXIgY2hhcmFjdGVycywgUkZDIDM5ODYgc2VjdGlvbiAyLjIuCiAgLy8gZ2VuLWRlbGltcyAgPSAiOiIgLyAiLyIgLyAiPyIgLyAiIyIgLyAiWyIgLyAiXSIgLyAiQCIKICAvLwogIHN0YXRpYyBjb25zdCBfZ2VuRGVsaW1pdGVyc1RhYmxlID0gPGludD5bCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIExTQiAgICAgICAgICAgIE1TQgogICAgLy8gICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAogICAgMHgwMDAwLCAvLyAweDAwIC0gMHgwZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgMHgwMDAwLCAvLyAweDEwIC0gMHgxZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgLwogICAgMHg4MDA4LCAvLyAweDIwIC0gMHgyZiAgMDAwMTAwMDAwMDAwMDAwMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgPwogICAgMHg4NDAwLCAvLyAweDMwIC0gMHgzZiAgMDAwMDAwMDAwMDEwMDAwMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgQAogICAgMHgwMDAxLCAvLyAweDQwIC0gMHg0ZiAgMTAwMDAwMDAwMDAwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIF0KICAgIDB4MjgwMCwgLy8gMHg1MCAtIDB4NWYgIDAwMDAwMDAwMDAwMTAxMDAKICAgIC8vCiAgICAweDAwMDAsIC8vIDB4NjAgLSAweDZmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLwogICAgMHgwMDAwLCAvLyAweDcwIC0gMHg3ZiAgMDAwMDAwMDAwMDAwMDAwMAogIF07CgogIC8vIENoYXJhY3RlcnMgYWxsb3dlZCBpbiB0aGUgdXNlcmluZm8gYXMgb2YgUkZDIDM5ODYuCiAgLy8gUkZDIDM5ODYgQXBwZW5kaXggQQogIC8vIHVzZXJpbmZvID0gKiggdW5yZXNlcnZlZCAvIHBjdC1lbmNvZGVkIC8gc3ViLWRlbGltcyAvICc6JykKICBzdGF0aWMgY29uc3QgX3VzZXJpbmZvVGFibGUgPSA8aW50PlsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgTFNCICAgICAgICAgICAgTVNCCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8CiAgICAweDAwMDAsIC8vIDB4MDAgLSAweDBmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAweDAwMDAsIC8vIDB4MTAgLSAweDFmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgISAgJCAmJygpKissLS4KICAgIDB4N2ZkMiwgLy8gMHgyMCAtIDB4MmYgIDAxMDAxMDExMTExMTExMTAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIDAxMjM0NTY3ODk6OyA9CiAgICAweDJmZmYsIC8vIDB4MzAgLSAweDNmICAxMTExMTExMTExMTEwMTAwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgQUJDREVGR0hJSktMTU5PCiAgICAweGZmZmUsIC8vIDB4NDAgLSAweDRmICAwMTExMTExMTExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBQUVJTVFVWV1hZWiAgICBfCiAgICAweDg3ZmYsIC8vIDB4NTAgLSAweDVmICAxMTExMTExMTExMTAwMDAxCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgYWJjZGVmZ2hpamtsbW5vCiAgICAweGZmZmUsIC8vIDB4NjAgLSAweDZmICAwMTExMTExMTExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBwcXJzdHV2d3h5eiAgIH4KICAgIDB4NDdmZiwgLy8gMHg3MCAtIDB4N2YgIDExMTExMTExMTExMDAwMTAKICBdOwoKICAvLyBDaGFyYWN0ZXJzIGFsbG93ZWQgaW4gdGhlIHJlZy1uYW1lIGFzIG9mIFJGQyAzOTg2LgogIC8vIFJGQyAzOTg2IEFwcGVuZGl4IEEKICAvLyByZWctbmFtZSA9ICooIHVucmVzZXJ2ZWQgLyBwY3QtZW5jb2RlZCAvIHN1Yi1kZWxpbXMgKQogIHN0YXRpYyBjb25zdCBfcmVnTmFtZVRhYmxlID0gPGludD5bCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIExTQiAgICAgICAgICAgIE1TQgogICAgLy8gICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAogICAgMHgwMDAwLCAvLyAweDAwIC0gMHgwZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgMHgwMDAwLCAvLyAweDEwIC0gMHgxZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICEgICQlJicoKSorLC0uCiAgICAweDdmZjIsIC8vIDB4MjAgLSAweDJmICAwMTAwMTExMTExMTExMTEwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAwMTIzNDU2Nzg5IDsgPQogICAgMHgyYmZmLCAvLyAweDMwIC0gMHgzZiAgMTExMTExMTExMTAxMDEwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgIEFCQ0RFRkdISUpLTE1OTwogICAgMHhmZmZlLCAvLyAweDQwIC0gMHg0ZiAgMDExMTExMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgUFFSU1RVVldYWVogICAgXwogICAgMHg4N2ZmLCAvLyAweDUwIC0gMHg1ZiAgMTExMTExMTExMTEwMDAwMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgIGFiY2RlZmdoaWprbG1ubwogICAgMHhmZmZlLCAvLyAweDYwIC0gMHg2ZiAgMDExMTExMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgcHFyc3R1dnd4eXogICB+CiAgICAweDQ3ZmYsIC8vIDB4NzAgLSAweDdmICAxMTExMTExMTExMTAwMDEwCiAgXTsKCiAgLy8gQ2hhcmFjdGVycyBhbGxvd2VkIGluIHRoZSBwYXRoIGFzIG9mIFJGQyAzOTg2LgogIC8vIFJGQyAzOTg2IHNlY3Rpb24gMy4zLgogIC8vIHBjaGFyID0gdW5yZXNlcnZlZCAvIHBjdC1lbmNvZGVkIC8gc3ViLWRlbGltcyAvICI6IiAvICJAIgogIHN0YXRpYyBjb25zdCBfcGF0aENoYXJUYWJsZSA9IDxpbnQ+WwogICAgLy8gICAgICAgICAgICAgICAgICAgICBMU0IgICAgICAgICAgICBNU0IKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKICAgIDB4MDAwMCwgLy8gMHgwMCAtIDB4MGYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIDB4MDAwMCwgLy8gMHgxMCAtIDB4MWYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAhICAkICYnKCkqKywtLgogICAgMHg3ZmQyLCAvLyAweDIwIC0gMHgyZiAgMDEwMDEwMTExMTExMTExMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgMDEyMzQ1Njc4OTo7ID0KICAgIDB4MmZmZiwgLy8gMHgzMCAtIDB4M2YgIDExMTExMTExMTExMTAxMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIEBBQkNERUZHSElKS0xNTk8KICAgIDB4ZmZmZiwgLy8gMHg0MCAtIDB4NGYgIDExMTExMTExMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIFBRUlNUVVZXWFlaICAgIF8KICAgIDB4ODdmZiwgLy8gMHg1MCAtIDB4NWYgIDExMTExMTExMTExMDAwMDEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBhYmNkZWZnaGlqa2xtbm8KICAgIDB4ZmZmZSwgLy8gMHg2MCAtIDB4NmYgIDAxMTExMTExMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHBxcnN0dXZ3eHl6ICAgfgogICAgMHg0N2ZmLCAvLyAweDcwIC0gMHg3ZiAgMTExMTExMTExMTEwMDAxMAogIF07CgogIC8vIENoYXJhY3RlcnMgYWxsb3dlZCBpbiB0aGUgcGF0aCBhcyBvZiBSRkMgMzk4Ni4KICAvLyBSRkMgMzk4NiBzZWN0aW9uIDMuMyAqYW5kKiBzbGFzaC4KICBzdGF0aWMgY29uc3QgX3BhdGhDaGFyT3JTbGFzaFRhYmxlID0gWwogICAgLy8gICAgICAgICAgICAgICAgICAgICBMU0IgICAgICAgICAgICBNU0IKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKICAgIDB4MDAwMCwgLy8gMHgwMCAtIDB4MGYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIDB4MDAwMCwgLy8gMHgxMCAtIDB4MWYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAhICAkICYnKCkqKywtLi8KICAgIDB4ZmZkMiwgLy8gMHgyMCAtIDB4MmYgIDAxMDAxMDExMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIDAxMjM0NTY3ODk6OyA9CiAgICAweDJmZmYsIC8vIDB4MzAgLSAweDNmICAxMTExMTExMTExMTEwMTAwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBAQUJDREVGR0hJSktMTU5PCiAgICAweGZmZmYsIC8vIDB4NDAgLSAweDRmICAxMTExMTExMTExMTExMTExCgogICAgLy8gICAgICAgICAgICAgICAgICAgICAgUFFSU1RVVldYWVogICAgXwogICAgMHg4N2ZmLCAvLyAweDUwIC0gMHg1ZiAgMTExMTExMTExMTEwMDAwMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgIGFiY2RlZmdoaWprbG1ubwogICAgMHhmZmZlLCAvLyAweDYwIC0gMHg2ZiAgMDExMTExMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgcHFyc3R1dnd4eXogICB+CiAgICAweDQ3ZmYsIC8vIDB4NzAgLSAweDdmICAxMTExMTExMTExMTAwMDEwCiAgXTsKCiAgLy8gQ2hhcmFjdGVycyBhbGxvd2VkIGluIHRoZSBxdWVyeSBhcyBvZiBSRkMgMzk4Ni4KICAvLyBSRkMgMzk4NiBzZWN0aW9uIDMuNC4KICAvLyBxdWVyeSA9ICooIHBjaGFyIC8gIi8iIC8gIj8iICkKICBzdGF0aWMgY29uc3QgX3F1ZXJ5Q2hhclRhYmxlID0gWwogICAgLy8gICAgICAgICAgICAgICAgICAgICBMU0IgICAgICAgICAgICBNU0IKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKICAgIDB4MDAwMCwgLy8gMHgwMCAtIDB4MGYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIDB4MDAwMCwgLy8gMHgxMCAtIDB4MWYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAhICAkICYnKCkqKywtLi8KICAgIDB4ZmZkMiwgLy8gMHgyMCAtIDB4MmYgIDAxMDAxMDExMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIDAxMjM0NTY3ODk6OyA9ID8KICAgIDB4YWZmZiwgLy8gMHgzMCAtIDB4M2YgIDExMTExMTExMTExMTAxMDEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIEBBQkNERUZHSElKS0xNTk8KICAgIDB4ZmZmZiwgLy8gMHg0MCAtIDB4NGYgIDExMTExMTExMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIFBRUlNUVVZXWFlaICAgIF8KICAgIDB4ODdmZiwgLy8gMHg1MCAtIDB4NWYgIDExMTExMTExMTExMDAwMDEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBhYmNkZWZnaGlqa2xtbm8KICAgIDB4ZmZmZSwgLy8gMHg2MCAtIDB4NmYgIDAxMTExMTExMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHBxcnN0dXZ3eHl6ICAgfgogICAgMHg0N2ZmLCAvLyAweDcwIC0gMHg3ZiAgMTExMTExMTExMTEwMDAxMAogIF07Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIERhdGEgVVJJCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovKioKICogQSB3YXkgdG8gYWNjZXNzIHRoZSBzdHJ1Y3R1cmUgb2YgYSBgZGF0YTpgIFVSSS4KICoKICogRGF0YSBVUklzIGFyZSBub24taGllcmFyY2hpY2FsIFVSSXMgdGhhdCBjYW4gY29udGFpbiBhbnkgYmluYXJ5IGRhdGEuCiAqIFRoZXkgYXJlIGRlZmluZWQgYnkgW1JGQyAyMzk3XShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjM5NykuCiAqCiAqIFRoaXMgY2xhc3MgYWxsb3dzIHBhcnNpbmcgdGhlIFVSSSB0ZXh0IGFuZCBleHRyYWN0aW5nIGluZGl2aWR1YWwgcGFydHMgb2YgdGhlCiAqIFVSSSwgYXMgd2VsbCBhcyBidWlsZGluZyB0aGUgVVJJIHRleHQgZnJvbSBzdHJ1Y3R1cmVkIHBhcnRzLgogKi8KY2xhc3MgVXJpRGF0YSB7CiAgc3RhdGljIGNvbnN0IGludCBfbm9TY2hlbWUgPSAtMTsKICAvKioKICAgKiBDb250YWlucyB0aGUgdGV4dCBjb250ZW50IG9mIGEgYGRhdGE6YCBVUkksIHdpdGggb3Igd2l0aG91dCBhCiAgICogbGVhZGluZyBgZGF0YTpgLgogICAqCiAgICogSWYgW19zZXBhcmF0b3JJbmRpY2VzXSBzdGFydHMgd2l0aCBgNGAgKHRoZSBpbmRleCBvZiB0aGUgYDpgKSwgdGhlbgogICAqIHRoZXJlIGlzIGEgbGVhZGluZyBgZGF0YTpgLCBvdGhlcndpc2UgW19zZXBhcmF0b3JJbmRpY2VzXSBzdGFydHMgd2l0aAogICAqIGAtMWAuCiAgICovCiAgZmluYWwgU3RyaW5nIF90ZXh0OwoKICAvKioKICAgKiBMaXN0IG9mIHRoZSBzZXBhcmF0b3JzICgnOycsICc9JyBhbmQgJywnKSBpbiB0aGUgdGV4dC4KICAgKgogICAqIFN0YXJ0cyB3aXRoIHRoZSBpbmRleCBvZiB0aGUgYDpgIGluIGBkYXRhOmAgb2YgdGhlIG1pbWVUeXBlLgogICAqIFRoYXQgaXMgYWx3YXlzIGVpdGhlciAtMSBvciA0LCBkZXBlbmRpbmcgb24gd2hldGhlciBgX3RleHRgIGluY2x1ZGVzIHRoZQogICAqIGBkYXRhOmAgc2NoZW1lIG9yIG5vdC4KICAgKgogICAqIFRoZSBmaXJzdCBzcGVwYXJhdG9yIGVuZHMgdGhlIG1pbWUgdHlwZS4gV2UgZG9uJ3QgYm90aGVyIHdpdGggZmluZGluZwogICAqIHRoZSAnLycgaW5zaWRlIHRoZSBtaW1lIHR5cGUuCiAgICoKICAgKiBFYWNoIHR3byBzZXBhcmF0b3JzIGFmdGVyIHRoYXQgbWFya3MgYSBwYXJhbWV0ZXIga2V5IGFuZCB2YWx1ZS4KICAgKgogICAqIElmIHRoZXJlIGlzIGEgc2luZ2xlIHNlcGFyYXRvciBsZWZ0LCBpdCBlbmRzIHRoZSAiYmFzZTY0IiBtYXJrZXIuCiAgICoKICAgKiBTbyB0aGUgZm9sbG93aW5nIHNlcGFyYXRvcnMgYXJlIGZvdW5kIGZvciBhIHRleHQ6CiAgICogYGBgCiAgICogZGF0YTp0ZXh0L3BsYWluO2Zvbz1iYXI7YmFzZTY0LEFSR0xFQkFSR0xFPQogICAqICAgICBeICAgICAgICAgIF4gICBeICAgXiAgICAgIF4KICAgKiBgYGAKICAgKi8KICBmaW5hbCBMaXN0PGludD4gX3NlcGFyYXRvckluZGljZXM7CgogIC8qKgogICAqIENhY2hlIG9mIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgW3VyaV0uCiAgICovCiAgVXJpIF91cmlDYWNoZTsKCiAgVXJpRGF0YS5fKHRoaXMuX3RleHQsIHRoaXMuX3NlcGFyYXRvckluZGljZXMsIHRoaXMuX3VyaUNhY2hlKTsKCiAgLy8gQXZvaWQgc2hhZG93aW5nIGJ5IGFyZ3VtZW50LgogIHN0YXRpYyBjb25zdCBCYXNlNjRDb2RlYyBfYmFzZTY0ID0gYmFzZTY0OwoKICAvKioKICAgKiBDcmVhdGVzIGEgYGRhdGE6YCBVUkkgY29udGFpbmluZyB0aGUgW2NvbnRlbnRdIHN0cmluZy4KICAgKgogICAqIEVxdWl2YWxlbnQgdG8gYG5ldyBVcmkuZGF0YUZyb21TdHJpbmcoLi4uKS5kYXRhYCwgYnV0IG1heQogICAqIGJlIG1vcmUgZWZmaWNpZW50IGlmIHRoZSBbdXJpXSBpdHNlbGYgaXNuJ3QgdXNlZC4KICAgKi8KICBmYWN0b3J5IFVyaURhdGEuZnJvbVN0cmluZyhTdHJpbmcgY29udGVudCwKICAgICAge1N0cmluZyBtaW1lVHlwZSwKICAgICAgRW5jb2RpbmcgZW5jb2RpbmcsCiAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywKICAgICAgYm9vbCBiYXNlNjQgPSBmYWxzZX0pIHsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBTdHJpbmdCdWZmZXIoKTsKICAgIExpc3Q8aW50PiBpbmRpY2VzID0gW19ub1NjaGVtZV07CiAgICBTdHJpbmcgY2hhcnNldE5hbWU7CiAgICBTdHJpbmcgZW5jb2RpbmdOYW1lOwogICAgaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCkgY2hhcnNldE5hbWUgPSBwYXJhbWV0ZXJzWyJjaGFyc2V0Il07CiAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgewogICAgICBpZiAoY2hhcnNldE5hbWUgIT0gbnVsbCkgewogICAgICAgIGVuY29kaW5nID0gRW5jb2RpbmcuZ2V0QnlOYW1lKGNoYXJzZXROYW1lKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChjaGFyc2V0TmFtZSA9PSBudWxsKSB7CiAgICAgIC8vIE5vbi1udWxsIG9ubHkgaWYgcGFyYW1ldGVycyBkb2VzIG5vdCBjb250YWluICJjaGFyc2V0Ii4KICAgICAgZW5jb2RpbmdOYW1lID0gZW5jb2RpbmcubmFtZTsKICAgIH0KICAgIGVuY29kaW5nID8/PSBhc2NpaTsKICAgIF93cml0ZVVyaShtaW1lVHlwZSwgZW5jb2RpbmdOYW1lLCBwYXJhbWV0ZXJzLCBidWZmZXIsIGluZGljZXMpOwogICAgaW5kaWNlcy5hZGQoYnVmZmVyLmxlbmd0aCk7CiAgICBpZiAoYmFzZTY0KSB7CiAgICAgIGJ1ZmZlci53cml0ZSgnO2Jhc2U2NCwnKTsKICAgICAgaW5kaWNlcy5hZGQoYnVmZmVyLmxlbmd0aCAtIDEpOwogICAgICBidWZmZXIud3JpdGUoZW5jb2RpbmcuZnVzZShfYmFzZTY0KS5lbmNvZGUoY29udGVudCkpOwogICAgfSBlbHNlIHsKICAgICAgYnVmZmVyLndyaXRlKCcsJyk7CiAgICAgIF91cmlFbmNvZGVCeXRlcyhfdXJpY1RhYmxlLCBlbmNvZGluZy5lbmNvZGUoY29udGVudCksIGJ1ZmZlcik7CiAgICB9CiAgICByZXR1cm4gVXJpRGF0YS5fKGJ1ZmZlci50b1N0cmluZygpLCBpbmRpY2VzLCBudWxsKTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBgZGF0YTpgIFVSSSBjb250YWluaW5nIGFuIGVuY29kaW5nIG9mIFtieXRlc10uCiAgICoKICAgKiBFcXVpdmFsZW50IHRvIGBuZXcgVXJpLmRhdGFGcm9tQnl0ZXMoLi4uKS5kYXRhYCwgYnV0IG1heQogICAqIGJlIG1vcmUgZWZmaWNpZW50IGlmIHRoZSBbdXJpXSBpdHNlbGYgaXNuJ3QgdXNlZC4KICAgKi8KICBmYWN0b3J5IFVyaURhdGEuZnJvbUJ5dGVzKExpc3Q8aW50PiBieXRlcywKICAgICAge21pbWVUeXBlID0gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsCiAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywKICAgICAgcGVyY2VudEVuY29kZWQgPSBmYWxzZX0pIHsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBTdHJpbmdCdWZmZXIoKTsKICAgIExpc3Q8aW50PiBpbmRpY2VzID0gW19ub1NjaGVtZV07CiAgICBfd3JpdGVVcmkobWltZVR5cGUsIG51bGwsIHBhcmFtZXRlcnMsIGJ1ZmZlciwgaW5kaWNlcyk7CiAgICBpbmRpY2VzLmFkZChidWZmZXIubGVuZ3RoKTsKICAgIGlmIChwZXJjZW50RW5jb2RlZCkgewogICAgICBidWZmZXIud3JpdGUoJywnKTsKICAgICAgX3VyaUVuY29kZUJ5dGVzKF91cmljVGFibGUsIGJ5dGVzLCBidWZmZXIpOwogICAgfSBlbHNlIHsKICAgICAgYnVmZmVyLndyaXRlKCc7YmFzZTY0LCcpOwogICAgICBpbmRpY2VzLmFkZChidWZmZXIubGVuZ3RoIC0gMSk7CiAgICAgIF9iYXNlNjQuZW5jb2RlcgogICAgICAgICAgLnN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU3RyaW5nQ29udmVyc2lvblNpbmsuZnJvbVN0cmluZ1NpbmsoYnVmZmVyKSkKICAgICAgICAgIC5hZGRTbGljZShieXRlcywgMCwgYnl0ZXMubGVuZ3RoLCB0cnVlKTsKICAgIH0KCiAgICByZXR1cm4gVXJpRGF0YS5fKGJ1ZmZlci50b1N0cmluZygpLCBpbmRpY2VzLCBudWxsKTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBgRGF0YVVyaWAgZnJvbSBhIFtVcmldIHdoaWNoIG11c3QgaGF2ZSBgZGF0YWAgYXMgW1VyaS5zY2hlbWVdLgogICAqCiAgICogVGhlIFt1cmldIG11c3QgaGF2ZSBzY2hlbWUgYGRhdGFgIGFuZCBubyBhdXRob3JpdHkgb3IgZnJhZ21lbnQsCiAgICogYW5kIHRoZSBwYXRoIChjb25jYXRlbmF0ZWQgd2l0aCB0aGUgcXVlcnksIGlmIHRoZXJlIGlzIG9uZSkgbXVzdCBiZSB2YWxpZAogICAqIGFzIGRhdGEgVVJJIGNvbnRlbnQgd2l0aCB0aGUgc2FtZSBydWxlcyBhcyBbcGFyc2VdLgogICAqLwogIGZhY3RvcnkgVXJpRGF0YS5mcm9tVXJpKFVyaSB1cmkpIHsKICAgIGlmICh1cmkuc2NoZW1lICE9ICJkYXRhIikgewogICAgICB0aHJvdyBBcmd1bWVudEVycm9yLnZhbHVlKHVyaSwgInVyaSIsICJTY2hlbWUgbXVzdCBiZSAnZGF0YSciKTsKICAgIH0KICAgIGlmICh1cmkuaGFzQXV0aG9yaXR5KSB7CiAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IudmFsdWUodXJpLCAidXJpIiwgIkRhdGEgdXJpIG11c3Qgbm90IGhhdmUgYXV0aG9yaXR5Iik7CiAgICB9CiAgICBpZiAodXJpLmhhc0ZyYWdtZW50KSB7CiAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IudmFsdWUoCiAgICAgICAgICB1cmksICJ1cmkiLCAiRGF0YSB1cmkgbXVzdCBub3QgaGF2ZSBhIGZyYWdtZW50IHBhcnQiKTsKICAgIH0KICAgIGlmICghdXJpLmhhc1F1ZXJ5KSB7CiAgICAgIHJldHVybiBfcGFyc2UodXJpLnBhdGgsIDAsIHVyaSk7CiAgICB9CiAgICAvLyBJbmNsdWRlcyBwYXRoIGFuZCBxdWVyeSAoYW5kIGxlYWRpbmcgImRhdGE6IikuCiAgICByZXR1cm4gX3BhcnNlKCIkdXJpIiwgNSwgdXJpKTsKICB9CgogIC8qKgogICAqIFdyaXRlcyB0aGUgaW5pdGlhbCBwYXJ0IG9mIGEgYGRhdGE6YCB1cmksIGZyb20gYWZ0ZXIgdGhlICJkYXRhOiIKICAgKiB1bnRpbCBqdXN0IGJlZm9yZSB0aGUgJywnIGJlZm9yZSB0aGUgZGF0YSwgb3IgYmVmb3JlIGEgYDtiYXNlNjQsYAogICAqIG1hcmtlci4KICAgKgogICAqIE9mIGFuIFtpbmRpY2VzXSBsaXN0IGlzIHBhc3NlZCwgc2VwYXJhdG9yIGluZGljZXMgYXJlIHN0b3JlZCBpbiB0aGF0CiAgICogbGlzdC4KICAgKi8KICBzdGF0aWMgdm9pZCBfd3JpdGVVcmkoU3RyaW5nIG1pbWVUeXBlLCBTdHJpbmcgY2hhcnNldE5hbWUsCiAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgTGlzdCBpbmRpY2VzKSB7CiAgICBpZiAobWltZVR5cGUgPT0gbnVsbCB8fCBtaW1lVHlwZSA9PSAidGV4dC9wbGFpbiIpIHsKICAgICAgbWltZVR5cGUgPSAiIjsKICAgIH0KICAgIGlmIChtaW1lVHlwZS5pc0VtcHR5IHx8IGlkZW50aWNhbChtaW1lVHlwZSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpKSB7CiAgICAgIGJ1ZmZlci53cml0ZShtaW1lVHlwZSk7IC8vIENvbW1vbiBjYXNlcyBuZWVkIG5vIGVzY2FwaW5nLgogICAgfSBlbHNlIHsKICAgICAgaW50IHNsYXNoSW5kZXggPSBfdmFsaWRhdGVNaW1lVHlwZShtaW1lVHlwZSk7CiAgICAgIGlmIChzbGFzaEluZGV4IDwgMCkgewogICAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IudmFsdWUobWltZVR5cGUsICJtaW1lVHlwZSIsICJJbnZhbGlkIE1JTUUgdHlwZSIpOwogICAgICB9CiAgICAgIGJ1ZmZlci53cml0ZShfVXJpLl91cmlFbmNvZGUoCiAgICAgICAgICBfdG9rZW5DaGFyVGFibGUsIG1pbWVUeXBlLnN1YnN0cmluZygwLCBzbGFzaEluZGV4KSwgdXRmOCwgZmFsc2UpKTsKICAgICAgYnVmZmVyLndyaXRlKCIvIik7CiAgICAgIGJ1ZmZlci53cml0ZShfVXJpLl91cmlFbmNvZGUoCiAgICAgICAgICBfdG9rZW5DaGFyVGFibGUsIG1pbWVUeXBlLnN1YnN0cmluZyhzbGFzaEluZGV4ICsgMSksIHV0ZjgsIGZhbHNlKSk7CiAgICB9CiAgICBpZiAoY2hhcnNldE5hbWUgIT0gbnVsbCkgewogICAgICBpZiAoaW5kaWNlcyAhPSBudWxsKSB7CiAgICAgICAgaW5kaWNlcy4uYWRkKGJ1ZmZlci5sZW5ndGgpLi5hZGQoYnVmZmVyLmxlbmd0aCArIDgpOwogICAgICB9CiAgICAgIGJ1ZmZlci53cml0ZSgiO2NoYXJzZXQ9Iik7CiAgICAgIGJ1ZmZlci53cml0ZShfVXJpLl91cmlFbmNvZGUoX3Rva2VuQ2hhclRhYmxlLCBjaGFyc2V0TmFtZSwgdXRmOCwgZmFsc2UpKTsKICAgIH0KICAgIHBhcmFtZXRlcnM/LmZvckVhY2goKGtleSwgdmFsdWUpIHsKICAgICAgaWYgKGtleS5pc0VtcHR5KSB7CiAgICAgICAgdGhyb3cgQXJndW1lbnRFcnJvci52YWx1ZSgiIiwgIlBhcmFtZXRlciBuYW1lcyBtdXN0IG5vdCBiZSBlbXB0eSIpOwogICAgICB9CiAgICAgIGlmICh2YWx1ZS5pc0VtcHR5KSB7CiAgICAgICAgdGhyb3cgQXJndW1lbnRFcnJvci52YWx1ZSgKICAgICAgICAgICAgIiIsICJQYXJhbWV0ZXIgdmFsdWVzIG11c3Qgbm90IGJlIGVtcHR5IiwgJ3BhcmFtZXRlcnNbIiRrZXkiXScpOwogICAgICB9CiAgICAgIGlmIChpbmRpY2VzICE9IG51bGwpIGluZGljZXMuYWRkKGJ1ZmZlci5sZW5ndGgpOwogICAgICBidWZmZXIud3JpdGUoJzsnKTsKICAgICAgLy8gRW5jb2RlIGFueSBub24tUkZDMjA0NS10b2tlbiBjaGFyYWN0ZXIgYW5kIGJvdGggJyUnIGFuZCAnIycuCiAgICAgIGJ1ZmZlci53cml0ZShfVXJpLl91cmlFbmNvZGUoX3Rva2VuQ2hhclRhYmxlLCBrZXksIHV0ZjgsIGZhbHNlKSk7CiAgICAgIGlmIChpbmRpY2VzICE9IG51bGwpIGluZGljZXMuYWRkKGJ1ZmZlci5sZW5ndGgpOwogICAgICBidWZmZXIud3JpdGUoJz0nKTsKICAgICAgYnVmZmVyLndyaXRlKF9VcmkuX3VyaUVuY29kZShfdG9rZW5DaGFyVGFibGUsIHZhbHVlLCB1dGY4LCBmYWxzZSkpOwogICAgfSk7CiAgfQoKICAvKioKICAgKiBDaGVja3MgbWltZVR5cGUgaXMgdmFsaWQtaXNoIChgdG9rZW4gJy8nIHRva2VuYCkuCiAgICoKICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgc2xhc2gsIG9yIC0xIGlmIHRoZSBtaW1lIHR5cGUgaXMgbm90CiAgICogY29uc2lkZXJlZCB2YWxpZC4KICAgKgogICAqIEN1cnJlbnRseSBvbmx5IGxvb2tzIGZvciBzbGFzaGVzLCBhbGwgb3RoZXIgY2hhcmFjdGVycyB3aWxsIGJlCiAgICogcGVyY2VudC1lbmNvZGVkIGFzIFVURi04IGlmIG5lY2Vzc2FyeS4KICAgKi8KICBzdGF0aWMgaW50IF92YWxpZGF0ZU1pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSkgewogICAgaW50IHNsYXNoSW5kZXggPSAtMTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWltZVR5cGUubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGNoYXIgPSBtaW1lVHlwZS5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoY2hhciAhPSBfU0xBU0gpIGNvbnRpbnVlOwogICAgICBpZiAoc2xhc2hJbmRleCA8IDApIHsKICAgICAgICBzbGFzaEluZGV4ID0gaTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICByZXR1cm4gc2xhc2hJbmRleDsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhIHN0cmluZyBhcyBhIGBkYXRhYCBVUkkuCiAgICoKICAgKiBUaGUgc3RyaW5nIG11c3QgaGF2ZSB0aGUgZm9ybWF0OgogICAqCiAgICogYGBgCiAgICogJ2RhdGE6JyAodHlwZSAnLycgc3VidHlwZSk/ICgnOycgYXR0cmlidXRlICc9JyB2YWx1ZSkqICgnO2Jhc2U2NCcpPyAnLCcgZGF0YQogICAqIGBgYGAKICAgKgogICAqIHdoZXJlIGB0eXBlYCwgYHN1YnR5cGVgLCBgYXR0cmlidXRlYCBhbmQgYHZhbHVlYCBhcmUgc3BlY2lmaWVkIGluIFJGQy0yMDQ1LAogICAqIGFuZCBgZGF0YWAgaXMgYSBzZXF1ZW5jZSBvZiBVUkktY2hhcmFjdGVycyAoUkZDLTIzOTYgYHVyaWNgKS4KICAgKgogICAqIFRoaXMgbWVhbnMgdGhhdCBhbGwgdGhlIGNoYXJhY3RlcnMgbXVzdCBiZSBBU0NJSSwgYnV0IHRoZSBVUkkgbWF5IGNvbnRhaW4KICAgKiBwZXJjZW50LWVzY2FwZXMgZm9yIG5vbi1BU0NJSSBieXRlIHZhbHVlcyB0aGF0IG5lZWQgYW4gaW50ZXJwcmV0YXRpb24KICAgKiB0byBiZSBjb252ZXJ0ZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3RyaW5nLgogICAqCiAgICogUGFyc2luZyBjaGVja3MgdGhhdCBCYXNlNjQgZW5jb2RlZCBkYXRhIGlzIHZhbGlkLCBhbmQgaXQgbm9ybWFsaXplcyBpdAogICAqIHRvIHVzZSB0aGUgZGVmYXVsdCBCYXNlNjQgYWxwaGFiZXQgYW5kIHRvIHVzZSBwYWRkaW5nLgogICAqIE5vbi1CYXNlNjQgZGF0YSBpcyBlc2NhcGVkIHVzaW5nIHBlcmNlbnQtZXNjYXBlcyBhcyBuZWNlc3NhcnkgdG8gbWFrZQogICAqIGl0IHZhbGlkLCBhbmQgZXhpc3RpbmcgZXNjYXBlcyBhcmUgY2FzZSBub3JtYWxpemVkLgogICAqCiAgICogQWNjZXNzaW5nIHRoZSBpbmRpdmlkdWFsIHBhcnRzIG1heSBmYWlsIGxhdGVyIGlmIHRoZXkgdHVybiBvdXQgdG8gaGF2ZQogICAqIGNvbnRlbnQgdGhhdCBjYW4ndCBiZSBkZWNvZGVkIHN1Y2Nlc3NmdWxseSBhcyBhIHN0cmluZywgZm9yIGV4YW1wbGUgaWYKICAgKiBleGlzdGluZyBwZXJjZW50IGVzY2FwZXMgcmVwcmVzZW50IGJ5dGVzIHRoYXQgY2Fubm90IGJlIGRlY29kZWQKICAgKiBieSB0aGUgY2hvc2VuIFtFbmNvZGluZ10gKHNlZSBbY29udGVudEFzU3RyaW5nXSkuCiAgICoKICAgKiBBIFtGb3JtYXRFeGNlcHRpb25dIGlzIHRocm93biBpZiBbdXJpXSBpcyBub3QgYSB2YWxpZCBkYXRhIFVSSS4KICAgKi8KICBzdGF0aWMgVXJpRGF0YSBwYXJzZShTdHJpbmcgdXJpKSB7CiAgICBpZiAodXJpLmxlbmd0aCA+PSA1KSB7CiAgICAgIGludCBkYXRhRGVsdGEgPSBfc3RhcnRzV2l0aERhdGEodXJpLCAwKTsKICAgICAgaWYgKGRhdGFEZWx0YSA9PSAwKSB7CiAgICAgICAgLy8gRXhhY3QgbWF0Y2ggb24gImRhdGE6Ii4KICAgICAgICByZXR1cm4gX3BhcnNlKHVyaSwgNSwgbnVsbCk7CiAgICAgIH0KICAgICAgaWYgKGRhdGFEZWx0YSA9PSAweDIwKSB7CiAgICAgICAgLy8gU3RhcnRzIHdpdGggYSBub24tbm9ybWFsaXplZCAiZGF0YSIgc2NoZW1lIGNvbnRhaW5pbmcgdXBwZXItY2FzZQogICAgICAgIC8vIGxldHRlcnMuIFBhcnNlIGFueXdheSwgYnV0IHRocm93IGF3YXkgdGhlIHNjaGVtZS4KICAgICAgICByZXR1cm4gX3BhcnNlKHVyaS5zdWJzdHJpbmcoNSksIDAsIG51bGwpOwogICAgICB9CiAgICB9CiAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkRvZXMgbm90IHN0YXJ0IHdpdGggJ2RhdGE6JyIsIHVyaSwgMCk7CiAgfQoKICAvKioKICAgKiBUaGUgW1VyaV0gdGhhdCB0aGlzIGBVcmlEYXRhYCBpcyBnaXZpbmcgYWNjZXNzIHRvLgogICAqCiAgICogUmV0dXJucyBhIGBVcmlgIHdpdGggc2NoZW1lIGBkYXRhYCBhbmQgdGhlIHJlbWFpbmRlciBvZiB0aGUgZGF0YSBVUkkKICAgKiBhcyBwYXRoLgogICAqLwogIFVyaSBnZXQgdXJpIHsKICAgIGlmIChfdXJpQ2FjaGUgIT0gbnVsbCkgcmV0dXJuIF91cmlDYWNoZTsKICAgIFN0cmluZyBwYXRoID0gX3RleHQ7CiAgICBTdHJpbmcgcXVlcnk7CiAgICBpbnQgY29sb25JbmRleCA9IF9zZXBhcmF0b3JJbmRpY2VzWzBdOwogICAgaW50IHF1ZXJ5SW5kZXggPSBfdGV4dC5pbmRleE9mKCc/JywgY29sb25JbmRleCArIDEpOwogICAgaW50IGVuZCA9IF90ZXh0Lmxlbmd0aDsKICAgIGlmIChxdWVyeUluZGV4ID49IDApIHsKICAgICAgcXVlcnkgPSBfVXJpLl9ub3JtYWxpemVPclN1YnN0cmluZygKICAgICAgICAgIF90ZXh0LCBxdWVyeUluZGV4ICsgMSwgZW5kLCBfVXJpLl9xdWVyeUNoYXJUYWJsZSk7CiAgICAgIGVuZCA9IHF1ZXJ5SW5kZXg7CiAgICB9CiAgICBwYXRoID0gX1VyaS5fbm9ybWFsaXplT3JTdWJzdHJpbmcoCiAgICAgICAgX3RleHQsIGNvbG9uSW5kZXggKyAxLCBlbmQsIF9VcmkuX3BhdGhDaGFyT3JTbGFzaFRhYmxlKTsKICAgIF91cmlDYWNoZSA9IF9EYXRhVXJpKHRoaXMsIHBhdGgsIHF1ZXJ5KTsKICAgIHJldHVybiBfdXJpQ2FjaGU7CiAgfQoKICAvKioKICAgKiBUaGUgTUlNRSB0eXBlIG9mIHRoZSBkYXRhIFVSSS4KICAgKgogICAqIEEgZGF0YSBVUkkgY29uc2lzdHMgb2YgYSAibWVkaWEgdHlwZSIgZm9sbG93ZWQgYnkgZGF0YS4KICAgKiBUaGUgbWVkaWEgdHlwZSBzdGFydHMgd2l0aCBhIE1JTUUgdHlwZSBhbmQgY2FuIGJlIGZvbGxvd2VkIGJ5CiAgICogZXh0cmEgcGFyYW1ldGVycy4KICAgKiBJZiB0aGUgTUlNRSB0eXBlIHJlcHJlc2VudGF0aW9uIGluIHRoZSBVUkkgdGV4dCBjb250YWlucyBVUkkgZXNjYXBlcywKICAgKiB0aGV5IGFyZSB1bmVzY2FwZWQgaW4gdGhlIHJldHVybmVkIHN0cmluZy4KICAgKiBJZiB0aGUgdmFsdWUgY29udGFpbiBub24tQVNDSUkgcGVyY2VudCBlc2NhcGVzLCB0aGV5IGFyZSBkZWNvZGVkIGFzIFVURi04LgogICAqCiAgICogRXhhbXBsZToKICAgKgogICAqICAgICBkYXRhOnRleHQvcGxhaW47Y2hhcnNldD11dGYtOCxIZWxsbyUyMFdvcmxkIQogICAqCiAgICogVGhpcyBkYXRhIFVSSSBoYXMgdGhlIG1lZGlhIHR5cGUgYHRleHQvcGxhaW47Y2hhcnNldD11dGYtOGAsIHdoaWNoIGlzIHRoZQogICAqIE1JTUUgdHlwZSBgdGV4dC9wbGFpbmAgd2l0aCB0aGUgcGFyYW1ldGVyIGBjaGFyc2V0YCB3aXRoIHZhbHVlIGB1dGYtOGAuCiAgICogU2VlIFtSRkMgMjA0NV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIwNDUpIGZvciBtb3JlIGRldGFpbC4KICAgKgogICAqIElmIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBkYXRhIFVSSSBpcyBlbXB0eSwgaXQgZGVmYXVsdHMgdG8gYHRleHQvcGxhaW5gLgogICAqLwogIFN0cmluZyBnZXQgbWltZVR5cGUgewogICAgaW50IHN0YXJ0ID0gX3NlcGFyYXRvckluZGljZXNbMF0gKyAxOwogICAgaW50IGVuZCA9IF9zZXBhcmF0b3JJbmRpY2VzWzFdOwogICAgaWYgKHN0YXJ0ID09IGVuZCkgcmV0dXJuICJ0ZXh0L3BsYWluIjsKICAgIHJldHVybiBfVXJpLl91cmlEZWNvZGUoX3RleHQsIHN0YXJ0LCBlbmQsIHV0ZjgsIGZhbHNlKTsKICB9CgogIC8qKgogICAqIFRoZSBjaGFyc2V0IHBhcmFtZXRlciBvZiB0aGUgbWVkaWEgdHlwZS4KICAgKgogICAqIElmIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBtZWRpYSB0eXBlIGNvbnRhaW5zIGEgYGNoYXJzZXRgIHBhcmFtZXRlcgogICAqIHRoZW4gdGhpcyByZXR1cm5zIGl0cyB2YWx1ZSwgb3RoZXJ3aXNlIGl0IHJldHVybnMgYFVTLUFTQ0lJYCwKICAgKiB3aGljaCBpcyB0aGUgZGVmYXVsdCBjaGFyc2V0IGZvciBkYXRhIFVSSXMuCiAgICogSWYgdGhlIHZhbHVlIGNvbnRhaW4gbm9uLUFTQ0lJIHBlcmNlbnQgZXNjYXBlcywgdGhleSBhcmUgZGVjb2RlZCBhcyBVVEYtOC4KICAgKgogICAqIElmIHRoZSBNSU1FIHR5cGUgcmVwcmVzZW50YXRpb24gaW4gdGhlIFVSSSB0ZXh0IGNvbnRhaW5zIFVSSSBlc2NhcGVzLAogICAqIHRoZXkgYXJlIHVuZXNjYXBlZCBpbiB0aGUgcmV0dXJuZWQgc3RyaW5nLgogICAqLwogIFN0cmluZyBnZXQgY2hhcnNldCB7CiAgICBpbnQgcGFyYW1ldGVyU3RhcnQgPSAxOwogICAgaW50IHBhcmFtZXRlckVuZCA9IF9zZXBhcmF0b3JJbmRpY2VzLmxlbmd0aCAtIDE7IC8vIFRoZSAnLCcgYmVmb3JlIGRhdGEuCiAgICBpZiAoaXNCYXNlNjQpIHsKICAgICAgLy8gVGhlcmUgaXMgYSAiO2Jhc2U2NCIgc2VwYXJhdG9yLCBzbyBzdWJ0cmFjdCBvbmUgZm9yIHRoYXQgYXMgd2VsbC4KICAgICAgcGFyYW1ldGVyRW5kIC09IDE7CiAgICB9CiAgICBmb3IgKGludCBpID0gcGFyYW1ldGVyU3RhcnQ7IGkgPCBwYXJhbWV0ZXJFbmQ7IGkgKz0gMikgewogICAgICB2YXIga2V5U3RhcnQgPSBfc2VwYXJhdG9ySW5kaWNlc1tpXSArIDE7CiAgICAgIHZhciBrZXlFbmQgPSBfc2VwYXJhdG9ySW5kaWNlc1tpICsgMV07CiAgICAgIGlmIChrZXlFbmQgPT0ga2V5U3RhcnQgKyA3ICYmIF90ZXh0LnN0YXJ0c1dpdGgoImNoYXJzZXQiLCBrZXlTdGFydCkpIHsKICAgICAgICByZXR1cm4gX1VyaS5fdXJpRGVjb2RlKAogICAgICAgICAgICBfdGV4dCwga2V5RW5kICsgMSwgX3NlcGFyYXRvckluZGljZXNbaSArIDJdLCB1dGY4LCBmYWxzZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAiVVMtQVNDSUkiOwogIH0KCiAgLyoqCiAgICogV2hldGhlciB0aGUgZGF0YSBpcyBCYXNlNjQgZW5jb2RlZCBvciBub3QuCiAgICovCiAgYm9vbCBnZXQgaXNCYXNlNjQgPT4gX3NlcGFyYXRvckluZGljZXMubGVuZ3RoLmlzT2RkOwoKICAvKioKICAgKiBUaGUgY29udGVudCBwYXJ0IG9mIHRoZSBkYXRhIFVSSSwgYXMgaXRzIGFjdHVhbCByZXByZXNlbnRhdGlvbi4KICAgKgogICAqIFRoaXMgc3RyaW5nIG1heSBjb250YWluIHBlcmNlbnQgZXNjYXBlcy4KICAgKi8KICBTdHJpbmcgZ2V0IGNvbnRlbnRUZXh0ID0+IF90ZXh0LnN1YnN0cmluZyhfc2VwYXJhdG9ySW5kaWNlcy5sYXN0ICsgMSk7CgogIC8qKgogICAqIFRoZSBjb250ZW50IHBhcnQgb2YgdGhlIGRhdGEgVVJJIGFzIGJ5dGVzLgogICAqCiAgICogSWYgdGhlIGRhdGEgaXMgQmFzZTY0IGVuY29kZWQsIGl0IHdpbGwgYmUgZGVjb2RlZCB0byBieXRlcy4KICAgKgogICAqIElmIHRoZSBkYXRhIGlzIG5vdCBCYXNlNjQgZW5jb2RlZCwgaXQgd2lsbCBiZSBkZWNvZGVkIGJ5IHVuZXNjYXBpbmcKICAgKiBwZXJjZW50LWVzY2FwZWQgY2hhcmFjdGVycyBhbmQgcmV0dXJuaW5nIGJ5dGUgdmFsdWVzIG9mIGVhY2ggdW5lc2NhcGVkCiAgICogY2hhcmFjdGVyLiBUaGUgYnl0ZXMgd2lsbCBub3QgYmUsIGUuZy4sIFVURi04IGRlY29kZWQuCiAgICovCiAgVWludDhMaXN0IGNvbnRlbnRBc0J5dGVzKCkgewogICAgU3RyaW5nIHRleHQgPSBfdGV4dDsKICAgIGludCBzdGFydCA9IF9zZXBhcmF0b3JJbmRpY2VzLmxhc3QgKyAxOwogICAgaWYgKGlzQmFzZTY0KSB7CiAgICAgIHJldHVybiBiYXNlNjQuZGVjb2Rlci5jb252ZXJ0KHRleHQsIHN0YXJ0KTsKICAgIH0KCiAgICAvLyBOb3QgYmFzZTY0LCBkbyBwZXJjZW50LWRlY29kaW5nIGFuZCByZXR1cm4gdGhlIHJlbWFpbmluZyBieXRlcy4KICAgIC8vIENvbXB1dGUgcmVzdWx0IHNpemUuCiAgICBjb25zdCBpbnQgcGVyY2VudCA9IDB4MjU7CiAgICBpbnQgbGVuZ3RoID0gdGV4dC5sZW5ndGggLSBzdGFydDsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGNvZGVVbml0ID0gdGV4dC5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoY29kZVVuaXQgPT0gcGVyY2VudCkgewogICAgICAgIGkgKz0gMjsKICAgICAgICBsZW5ndGggLT0gMjsKICAgICAgfQogICAgfQogICAgLy8gRmlsbCByZXN1bHQgYXJyYXkuCiAgICBVaW50OExpc3QgcmVzdWx0ID0gVWludDhMaXN0KGxlbmd0aCk7CiAgICBpZiAobGVuZ3RoID09IHRleHQubGVuZ3RoKSB7CiAgICAgIHJlc3VsdC5zZXRSYW5nZSgwLCBsZW5ndGgsIHRleHQuY29kZVVuaXRzLCBzdGFydCk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBpbnQgaW5kZXggPSAwOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgdGV4dC5sZW5ndGg7IGkrKykgewogICAgICB2YXIgY29kZVVuaXQgPSB0ZXh0LmNvZGVVbml0QXQoaSk7CiAgICAgIGlmIChjb2RlVW5pdCAhPSBwZXJjZW50KSB7CiAgICAgICAgcmVzdWx0W2luZGV4KytdID0gY29kZVVuaXQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGkgKyAyIDwgdGV4dC5sZW5ndGgpIHsKICAgICAgICAgIGludCBieXRlID0gcGFyc2VIZXhCeXRlKHRleHQsIGkgKyAxKTsKICAgICAgICAgIGlmIChieXRlID49IDApIHsKICAgICAgICAgICAgcmVzdWx0W2luZGV4KytdID0gYnl0ZTsKICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKCJJbnZhbGlkIHBlcmNlbnQgZXNjYXBlIiwgdGV4dCwgaSk7CiAgICAgIH0KICAgIH0KICAgIGFzc2VydChpbmRleCA9PSByZXN1bHQubGVuZ3RoKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNyZWF0ZWQgZnJvbSB0aGUgY29udGVudCBvZiB0aGUgZGF0YSBVUkkuCiAgICoKICAgKiBJZiB0aGUgY29udGVudCBpcyBCYXNlNjQgZW5jb2RlZCwgaXQgd2lsbCBiZSBkZWNvZGVkIHRvIGJ5dGVzIGFuZCB0aGVuCiAgICogZGVjb2RlZCB0byBhIHN0cmluZyB1c2luZyBbZW5jb2RpbmddLgogICAqIElmIGVuY29kaW5nIGlzIG9taXR0ZWQsIHRoZSB2YWx1ZSBvZiBhIGBjaGFyc2V0YCBwYXJhbWV0ZXIgaXMgdXNlZAogICAqIGlmIGl0IGlzIHJlY29nbml6ZWQgYnkgW0VuY29kaW5nLmdldEJ5TmFtZV0sIG90aGVyd2lzZSBpdCBkZWZhdWx0cyB0bwogICAqIHRoZSBbYXNjaWldIGVuY29kaW5nLCB3aGljaCBpcyB0aGUgZGVmYXVsdCBlbmNvZGluZyBmb3IgZGF0YSBVUklzCiAgICogdGhhdCBkbyBub3Qgc3BlY2lmeSBhbiBlbmNvZGluZy4KICAgKgogICAqIElmIHRoZSBjb250ZW50IGlzIG5vdCBCYXNlNjQgZW5jb2RlZCwgaXQgd2lsbCBmaXJzdCBoYXZlIHBlcmNlbnQtZXNjYXBlcwogICAqIGNvbnZlcnRlZCB0byBieXRlcyBhbmQgdGhlbiB0aGUgY2hhcmFjdGVyIGNvZGVzIGFuZCBieXRlIHZhbHVlcyBhcmUKICAgKiBkZWNvZGVkIHVzaW5nIFtlbmNvZGluZ10uCiAgICovCiAgU3RyaW5nIGNvbnRlbnRBc1N0cmluZyh7RW5jb2RpbmcgZW5jb2Rpbmd9KSB7CiAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgewogICAgICB2YXIgY2hhcnNldCA9IHRoaXMuY2hhcnNldDsgLy8gUmV0dXJucyAiVVMtQVNDSUkiIGlmIG5vdCBwcmVzZW50LgogICAgICBlbmNvZGluZyA9IEVuY29kaW5nLmdldEJ5TmFtZShjaGFyc2V0KTsKICAgICAgaWYgKGVuY29kaW5nID09IG51bGwpIHsKICAgICAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJVbmtub3duIGNoYXJzZXQ6ICRjaGFyc2V0Iik7CiAgICAgIH0KICAgIH0KICAgIFN0cmluZyB0ZXh0ID0gX3RleHQ7CiAgICBpbnQgc3RhcnQgPSBfc2VwYXJhdG9ySW5kaWNlcy5sYXN0ICsgMTsKICAgIGlmIChpc0Jhc2U2NCkgewogICAgICB2YXIgY29udmVydGVyID0gYmFzZTY0LmRlY29kZXIuZnVzZShlbmNvZGluZy5kZWNvZGVyKTsKICAgICAgcmV0dXJuIGNvbnZlcnRlci5jb252ZXJ0KHRleHQuc3Vic3RyaW5nKHN0YXJ0KSk7CiAgICB9CiAgICByZXR1cm4gX1VyaS5fdXJpRGVjb2RlKHRleHQsIHN0YXJ0LCB0ZXh0Lmxlbmd0aCwgZW5jb2RpbmcsIGZhbHNlKTsKICB9CgogIC8qKgogICAqIEEgbWFwIHJlcHJlc2VudGluZyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgbWVkaWEgdHlwZS4KICAgKgogICAqIEEgZGF0YSBVUkkgbWF5IGNvbnRhaW4gcGFyYW1ldGVycyBiZXR3ZWVuIHRoZSBNSU1FIHR5cGUgYW5kIHRoZQogICAqIGRhdGEuIFRoaXMgY29udmVydHMgdGhlc2UgcGFyYW1ldGVycyB0byBhIG1hcCBmcm9tIHBhcmFtZXRlciBuYW1lCiAgICogdG8gcGFyYW1ldGVyIHZhbHVlLgogICAqIFRoZSBtYXAgb25seSBjb250YWlucyBwYXJhbWV0ZXJzIHRoYXQgYWN0dWFsbHkgb2NjdXIgaW4gdGhlIFVSSS4KICAgKiBUaGUgYGNoYXJzZXRgIHBhcmFtZXRlciBoYXMgYSBkZWZhdWx0IHZhbHVlIGV2ZW4gaWYgaXQgZG9lc24ndCBvY2N1cgogICAqIGluIHRoZSBVUkksIHdoaWNoIGlzIHJlZmxlY3RlZCBieSB0aGUgW2NoYXJzZXRdIGdldHRlci4gVGhpcyBtZWFucyB0aGF0CiAgICogW2NoYXJzZXRdIG1heSByZXR1cm4gYSB2YWx1ZSBldmVuIGlmIGBwYXJhbWV0ZXJzWyJjaGFyc2V0Il1gIGlzIGBudWxsYC4KICAgKgogICAqIElmIHRoZSB2YWx1ZXMgY29udGFpbiBub24tQVNDSUkgdmFsdWVzIG9yIHBlcmNlbnQgZXNjYXBlcywKICAgKiB0aGV5IGFyZSBkZWNvZGVkIGFzIFVURi04LgogICAqLwogIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0IHBhcmFtZXRlcnMgewogICAgdmFyIHJlc3VsdCA9IDxTdHJpbmcsIFN0cmluZz57fTsKICAgIGZvciAoaW50IGkgPSAzOyBpIDwgX3NlcGFyYXRvckluZGljZXMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgdmFyIHN0YXJ0ID0gX3NlcGFyYXRvckluZGljZXNbaSAtIDJdICsgMTsKICAgICAgdmFyIGVxdWFscyA9IF9zZXBhcmF0b3JJbmRpY2VzW2kgLSAxXTsKICAgICAgdmFyIGVuZCA9IF9zZXBhcmF0b3JJbmRpY2VzW2ldOwogICAgICBTdHJpbmcga2V5ID0gX1VyaS5fdXJpRGVjb2RlKF90ZXh0LCBzdGFydCwgZXF1YWxzLCB1dGY4LCBmYWxzZSk7CiAgICAgIFN0cmluZyB2YWx1ZSA9IF9VcmkuX3VyaURlY29kZShfdGV4dCwgZXF1YWxzICsgMSwgZW5kLCB1dGY4LCBmYWxzZSk7CiAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIFVyaURhdGEgX3BhcnNlKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIFVyaSBzb3VyY2VVcmkpIHsKICAgIGFzc2VydChzdGFydCA9PSAwIHx8IHN0YXJ0ID09IDUpOwogICAgYXNzZXJ0KChzdGFydCA9PSA1KSA9PSB0ZXh0LnN0YXJ0c1dpdGgoImRhdGE6IikpOwoKICAgIC8vLyBDaGFyYWN0ZXIgY29kZXMuCiAgICBjb25zdCBpbnQgY29tbWEgPSAweDJjOwogICAgY29uc3QgaW50IHNsYXNoID0gMHgyZjsKICAgIGNvbnN0IGludCBzZW1pY29sb24gPSAweDNiOwogICAgY29uc3QgaW50IGVxdWFscyA9IDB4M2Q7CiAgICBMaXN0PGludD4gaW5kaWNlcyA9IFtzdGFydCAtIDFdOwogICAgaW50IHNsYXNoSW5kZXggPSAtMTsKICAgIHZhciBjaGFyOwogICAgaW50IGkgPSBzdGFydDsKICAgIGZvciAoOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykgewogICAgICBjaGFyID0gdGV4dC5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoY2hhciA9PSBjb21tYSB8fCBjaGFyID09IHNlbWljb2xvbikgYnJlYWs7CiAgICAgIGlmIChjaGFyID09IHNsYXNoKSB7CiAgICAgICAgaWYgKHNsYXNoSW5kZXggPCAwKSB7CiAgICAgICAgICBzbGFzaEluZGV4ID0gaTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgTUlNRSB0eXBlIiwgdGV4dCwgaSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChzbGFzaEluZGV4IDwgMCAmJiBpID4gc3RhcnQpIHsKICAgICAgLy8gQW4gZW1wdHkgTUlNRSB0eXBlIGlzIGFsbG93ZWQsIGJ1dCBpZiBub24tZW1wdHkgaXQgbXVzdCBjb250YWluCiAgICAgIC8vIGV4YWN0bHkgb25lIHNsYXNoLgogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgTUlNRSB0eXBlIiwgdGV4dCwgaSk7CiAgICB9CiAgICB3aGlsZSAoY2hhciAhPSBjb21tYSkgewogICAgICAvLyBQYXJzZSBwYXJhbWV0ZXJzIGFuZC9vciAiYmFzZTY0Ii4KICAgICAgaW5kaWNlcy5hZGQoaSk7CiAgICAgIGkrKzsKICAgICAgaW50IGVxdWFsc0luZGV4ID0gLTE7CiAgICAgIGZvciAoOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykgewogICAgICAgIGNoYXIgPSB0ZXh0LmNvZGVVbml0QXQoaSk7CiAgICAgICAgaWYgKGNoYXIgPT0gZXF1YWxzKSB7CiAgICAgICAgICBpZiAoZXF1YWxzSW5kZXggPCAwKSBlcXVhbHNJbmRleCA9IGk7CiAgICAgICAgfSBlbHNlIGlmIChjaGFyID09IHNlbWljb2xvbiB8fCBjaGFyID09IGNvbW1hKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGVxdWFsc0luZGV4ID49IDApIHsKICAgICAgICBpbmRpY2VzLmFkZChlcXVhbHNJbmRleCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gSGF2ZSB0byBiZSBmaW5hbCAiYmFzZTY0Ii4KICAgICAgICB2YXIgbGFzdFNlcGFyYXRvciA9IGluZGljZXMubGFzdDsKICAgICAgICBpZiAoY2hhciAhPSBjb21tYSB8fAogICAgICAgICAgICBpICE9IGxhc3RTZXBhcmF0b3IgKyA3IC8qICJiYXNlNjQsIi5sZW5ndGggKi8gfHwKICAgICAgICAgICAgIXRleHQuc3RhcnRzV2l0aCgiYmFzZTY0IiwgbGFzdFNlcGFyYXRvciArIDEpKSB7CiAgICAgICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkV4cGVjdGluZyAnPSciLCB0ZXh0LCBpKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGluZGljZXMuYWRkKGkpOwogICAgYm9vbCBpc0Jhc2U2NCA9IGluZGljZXMubGVuZ3RoLmlzT2RkOwogICAgaWYgKGlzQmFzZTY0KSB7CiAgICAgIHRleHQgPSBiYXNlNjQubm9ybWFsaXplKHRleHQsIGkgKyAxLCB0ZXh0Lmxlbmd0aCk7CiAgICB9IGVsc2UgewogICAgICAvLyBWYWxpZGF0ZSAiZGF0YSIgcGFydCwgbXVzdCBvbmx5IGNvbnRhaW4gUkZDIDIzOTYgJ3VyaWMnIGNoYXJhY3RlcnMKICAgICAgLy8gKHJlc2VydmVkLCB1bnJlc2VydmVkLCBvciBlc2NhcGUgc2VxdWVuY2VzKS4KICAgICAgLy8gTm9ybWFsaXplIHRvIHRoaXMgKHRocm93cyBvbiBhIGZyYWdtZW50IHNlcGFyYXRvcikuCiAgICAgIHZhciBkYXRhID0gX1VyaS5fbm9ybWFsaXplKHRleHQsIGkgKyAxLCB0ZXh0Lmxlbmd0aCwgX3VyaWNUYWJsZSwKICAgICAgICAgIGVzY2FwZURlbGltaXRlcnM6IHRydWUpOwogICAgICBpZiAoZGF0YSAhPSBudWxsKSB7CiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZVJhbmdlKGkgKyAxLCB0ZXh0Lmxlbmd0aCwgZGF0YSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBVcmlEYXRhLl8odGV4dCwgaW5kaWNlcywgc291cmNlVXJpKTsKICB9CgogIC8qKgogICAqIExpa2UgW1VyaS5fdXJpRW5jb2RlXSBidXQgdGFrZXMgdGhlIGlucHV0IGFzIGJ5dGVzLCBub3QgYSBzdHJpbmcuCiAgICoKICAgKiBFbmNvZGVzIGludG8gW2J1ZmZlcl0gaW5zdGVhZCBvZiBjcmVhdGluZyBpdHMgb3duIGJ1ZmZlci4KICAgKi8KICBzdGF0aWMgdm9pZCBfdXJpRW5jb2RlQnl0ZXMoCiAgICAgIExpc3Q8aW50PiBjYW5vbmljYWxUYWJsZSwgTGlzdDxpbnQ+IGJ5dGVzLCBTdHJpbmdTaW5rIGJ1ZmZlcikgewogICAgLy8gRW5jb2RlIHRoZSBzdHJpbmcgaW50byBieXRlcyB0aGVuIGdlbmVyYXRlIGFuIEFTQ0lJIG9ubHkgc3RyaW5nCiAgICAvLyBieSBwZXJjZW50IGVuY29kaW5nIHNlbGVjdGVkIGJ5dGVzLgogICAgaW50IGJ5dGVPciA9IDA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGludCBieXRlID0gYnl0ZXNbaV07CiAgICAgIGJ5dGVPciB8PSBieXRlOwogICAgICBpZiAoYnl0ZSA8IDEyOCAmJgogICAgICAgICAgKChjYW5vbmljYWxUYWJsZVtieXRlID4+IDRdICYgKDEgPDwgKGJ5dGUgJiAweDBmKSkpICE9IDApKSB7CiAgICAgICAgYnVmZmVyLndyaXRlQ2hhckNvZGUoYnl0ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnVmZmVyLndyaXRlQ2hhckNvZGUoX1BFUkNFTlQpOwogICAgICAgIGJ1ZmZlci53cml0ZUNoYXJDb2RlKF9oZXhEaWdpdHMuY29kZVVuaXRBdChieXRlID4+IDQpKTsKICAgICAgICBidWZmZXIud3JpdGVDaGFyQ29kZShfaGV4RGlnaXRzLmNvZGVVbml0QXQoYnl0ZSAmIDB4MGYpKTsKICAgICAgfQogICAgfQogICAgaWYgKChieXRlT3IgJiB+MHhGRikgIT0gMCkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGJ5dGUgPSBieXRlc1tpXTsKICAgICAgICBpZiAoYnl0ZSA8IDAgfHwgYnl0ZSA+IDI1NSkgewogICAgICAgICAgdGhyb3cgQXJndW1lbnRFcnJvci52YWx1ZShieXRlLCAibm9uLWJ5dGUgdmFsdWUiKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIFN0cmluZyB0b1N0cmluZygpID0+CiAgICAgIChfc2VwYXJhdG9ySW5kaWNlc1swXSA9PSBfbm9TY2hlbWUpID8gImRhdGE6JF90ZXh0IiA6IF90ZXh0OwoKICAvLyBUYWJsZSBvZiB0aGUgYHRva2VuYCBjaGFyYWN0ZXJzIG9mIFJGQyAyMDQ1IGluIGEgVVJJLgogIC8vCiAgLy8gQSB0b2tlbiBpcyBhbnkgVVMtQVNDSUkgY2hhcmFjdGVyIGV4Y2VwdCBTUEFDRSwgY29udHJvbCBjaGFyYWN0ZXJzIGFuZAogIC8vIGB0c3BlY2lhbGAgY2hhcmFjdGVycy4gVGhlIGB0c3BlY2lhbGAgY2F0ZWdvcnkgaXM6CiAgLy8gJygnLCAnKScsICc8JywgJz4nLCAnQCcsICcsJywgJzsnLCAnOicsICdcJywgJyInLCAnLycsICdbLCAnXScsICc/JywgJz0nLgogIC8vCiAgLy8gSW4gYSBkYXRhIFVSSSwgd2UgYWxzbyBuZWVkIHRvIGVzY2FwZSAnJScgYW5kICcjJyBjaGFyYWN0ZXJzLgogIHN0YXRpYyBjb25zdCBfdG9rZW5DaGFyVGFibGUgPSBbCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIExTQiAgICAgICAgICAgICBNU0IKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8CiAgICAweDAwMDAsIC8vIDB4MDAgLSAweDBmICAwMDAwMDAwMCAwMDAwMDAwMAogICAgMHgwMDAwLCAvLyAweDEwIC0gMHgxZiAgMDAwMDAwMDAgMDAwMDAwMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAhICAkICYnICAgKisgLS4KICAgIDB4NmNkMiwgLy8gMHgyMCAtIDB4MmYgIDAxMDAxMDExIDAwMTEwMTEwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAwMTIzNDU2NyA4OQogICAgMHgwM2ZmLCAvLyAweDMwIC0gMHgzZiAgMTExMTExMTEgMTEwMDAwMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBBQkNERUZHIEhJSktMTU5PCiAgICAweGZmZmUsIC8vIDB4NDAgLSAweDRmICAwMTExMTExMSAxMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgUFFSU1RVVlcgWFlaICAgXl8KICAgIDB4YzdmZiwgLy8gMHg1MCAtIDB4NWYgIDExMTExMTExIDExMTAwMDExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBgYWJjZGVmZyBoaWprbG1ubwogICAgMHhmZmZmLCAvLyAweDYwIC0gMHg2ZiAgMTExMTExMTEgMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHBxcnN0dXZ3IHh5ent8fX4KICAgIDB4N2ZmZiwgLy8gMHg3MCAtIDB4N2YgIDExMTExMTExIDExMTExMTEwCiAgXTsKCiAgLy8gQWxsIG5vbi1lc2NhcGUgUkZDLTIzOTYgdXJpYyBjaGFyYWN0ZXJzLgogIC8vCiAgLy8gIHVyaWMgICAgICAgID0gIHJlc2VydmVkIHwgdW5yZXNlcnZlZCB8IGVzY2FwZWQKICAvLyAgcmVzZXJ2ZWQgICAgPSAgIjsiIHwgIi8iIHwgIj8iIHwgIjoiIHwgIkAiIHwgIiYiIHwgIj0iIHwgIisiIHwgIiQiIHwgIiwiCiAgLy8gIHVucmVzZXJ2ZWQgID0gIGFscGhhbnVtIHwgbWFyawogIC8vICBtYXJrICAgICAgICA9ICAiLSIgfCAiXyIgfCAiLiIgfCAiISIgfCAifiIgfCAiKiIgfCAiJyIgfCAiKCIgfCAiKSIKICAvLwogIC8vIFRoaXMgaXMgdGhlIHNhbWUgY2hhcmFjdGVycyBhcyBpbiBhIFVSSSBxdWVyeSAod2hpY2ggaXMgVVJJIHBjaGFyIHBsdXMgJz8nKQogIHN0YXRpYyBjb25zdCBfdXJpY1RhYmxlID0gX1VyaS5fcXVlcnlDaGFyVGFibGU7CgogIC8vIENoYXJhY3RlcnMgYWxsb3dlZCBpbiBiYXNlLTY0IGVuY29kaW5nIChhbHBoYW51bWVyaWMsICcvJywgJysnIGFuZCAnPScpLgogIHN0YXRpYyBjb25zdCBfYmFzZTY0VGFibGUgPSBbCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIExTQiAgICAgICAgICAgICBNU0IKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8CiAgICAweDAwMDAsIC8vIDB4MDAgLSAweDBmICAwMDAwMDAwMCAwMDAwMDAwMAogICAgMHgwMDAwLCAvLyAweDEwIC0gMHgxZiAgMDAwMDAwMDAgMDAwMDAwMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgICAvCiAgICAweDg4MDAsIC8vIDB4MjAgLSAweDJmICAwMDAwMDAwMCAwMDAxMDAwMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgMDEyMzQ1NjcgODkKICAgIDB4MDNmZiwgLy8gMHgzMCAtIDB4M2YgIDExMTExMTExIDExMDAwMDAwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgQUJDREVGRyBISUpLTE1OTwogICAgMHhmZmZlLCAvLyAweDQwIC0gMHg0ZiAgMDExMTExMTEgMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIFBRUlNUVVZXIFhZWgogICAgMHgwN2ZmLCAvLyAweDUwIC0gMHg1ZiAgMTExMTExMTEgMTExMDAwMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBhYmNkZWZnIGhpamtsbW5vCiAgICAweGZmZmUsIC8vIDB4NjAgLSAweDZmICAwMTExMTExMSAxMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgcHFyc3R1dncgeHl6CiAgICAweDA3ZmYsIC8vIDB4NzAgLSAweDdmICAxMTExMTExMSAxMTEwMDAwMAogIF07Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIENvbnN0YW50cyB1c2VkIHRvIHJlYWQgdGhlIHNjYW5uZXIgcmVzdWx0LgovLyBUaGUgaW5kaWNlcyBwb2ludHMgaW50byB0aGUgdGFibGUgZmlsbGVkIGJ5IFtfc2Nhbl0gd2hpY2ggY29udGFpbnMKLy8gcmVjb2duaXplZCBwb3NpdGlvbnMgaW4gdGhlIHNjYW5uZWQgVVJJLgovLyBUaGUgYDBgIGluZGV4IGlzIG9ubHkgdXNlZCBpbnRlcm5hbGx5LgoKLy8vIEluZGV4IG9mIHRoZSBwb3NpdGlvbiBvZiB0aGF0IGA6YCBhZnRlciBhIHNjaGVtZS4KY29uc3QgaW50IF9zY2hlbWVFbmRJbmRleCA9IDE7CgovLy8gSW5kZXggb2YgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIganVzdCBiZWZvcmUgdGhlIGhvc3QgbmFtZS4KY29uc3QgaW50IF9ob3N0U3RhcnRJbmRleCA9IDI7CgovLy8gSW5kZXggb2YgdGhlIHBvc2l0aW9uIG9mIHRoZSBgOmAgYmVmb3JlIGEgcG9ydCB2YWx1ZS4KY29uc3QgaW50IF9wb3J0U3RhcnRJbmRleCA9IDM7CgovLy8gSW5kZXggb2YgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYSBwYXRoLgpjb25zdCBpbnQgX3BhdGhTdGFydEluZGV4ID0gNDsKCi8vLyBJbmRleCBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGA/YCBiZWZvcmUgYSBxdWVyeS4KY29uc3QgaW50IF9xdWVyeVN0YXJ0SW5kZXggPSA1OwoKLy8vIEluZGV4IG9mIHRoZSBwb3NpdGlvbiBvZiB0aGUgYCNgIGJlZm9yZSBhIGZyYWdtZW50Lgpjb25zdCBpbnQgX2ZyYWdtZW50U3RhcnRJbmRleCA9IDY7CgovLy8gSW5kZXggb2YgYSBwb3NpdGlvbiB3aGVyZSB0aGUgVVJJIHdhcyBkZXRlcm1pbmVkIHRvIGJlICJub24tc2ltcGxlIi4KY29uc3QgaW50IF9ub3RTaW1wbGVJbmRleCA9IDc7CgovLyBJbml0aWFsIHN0YXRlIGZvciBzY2FubmVyLgpjb25zdCBpbnQgX3VyaVN0YXJ0ID0gMDA7CgovLyBJZiBzY2FubmluZyBvZiBhIFVSSSB0ZXJtaW5hdGVzIGluIHRoaXMgc3RhdGUgb3IgYWJvdmUsCi8vIGNvbnNpZGVyIHRoZSBVUkkgbm9uLXNpbXBsZQpjb25zdCBpbnQgX25vblNpbXBsZUVuZFN0YXRlcyA9IDE0OwoKLy8gSW5pdGlhbCBzdGF0ZSBmb3Igc2NoZW1lIHZhbGlkYXRpb24uCmNvbnN0IGludCBfc2NoZW1lU3RhcnQgPSAyMDsKCi8vLyBUcmFuc2l0aW9uIHRhYmxlcyB1c2VkIHRvIHNjYW4gYSBVUkkgdG8gZGV0ZXJtaW5lIGl0cyBzdHJ1Y3R1cmUuCi8vLwovLy8gVGhlIHRhYmxlcyByZXByZXNlbnQgYSBzdGF0ZSBtYWNoaW5lIHdpdGggb3V0cHV0LgovLy8KLy8vIFRvIHNjYW4gdGhlIFVSSSwgc3RhcnQgaW4gdGhlIFtfdXJpU3RhcnRdIHN0YXRlLCB0aGVuIHJlYWQgZWFjaCBjaGFyYWN0ZXIKLy8vIG9mIHRoZSBVUkkgaW4gb3JkZXIsIGZyb20gc3RhcnQgdG8gZW5kLCBhbmQgZm9yIGVhY2ggY2hhcmFjdGVyIHBlcmZvcm0gYQovLy8gdHJhbnNpdGlvbiB0byBhIG5ldyBzdGF0ZSB3aGlsZSB3cml0aW5nIHRoZSBjdXJyZW50IHBvc2l0aW9uIGludG8gdGhlIG91dHB1dAovLy8gYnVmZmVyIGF0IGEgZGVzaWduYXRlZCBpbmRleC4KLy8vCi8vLyBFYWNoIHN0YXRlLCByZXByZXNlbnRlZCBieSBhbiBpbnRlZ2VyIHdoaWNoIGlzIGFuIGluZGV4IGludG8KLy8vIFtfc2Nhbm5lclRhYmxlc10sIGhhcyBhIHNldCBvZiB0cmFuc2l0aW9ucywgb25lIGZvciBlYWNoIGNoYXJhY3Rlci4KLy8vIFRoZSB0cmFuc2l0aW9ucyBhcmUgZW5jb2RlZCBhcyBhIDUtYml0IGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBuZXh0IHN0YXRlCi8vLyBhbmQgYSAzLWJpdCBpbmRleCBpbnRvIHRoZSBvdXRwdXQgdGFibGUuCi8vLwovLy8gRm9yIFVSSSBzY2FubmluZywgb25seSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBVKzAwMjAgdGhyb3VnaCBVKzAwN0UgYXJlCi8vLyBpbnRlcmVzdGluZywgYWxsIGNoYXJhY3RlcnMgb3V0c2lkZSB0aGF0IHJhbmdlIGFyZSB0cmVhdGVkIHRoZSBzYW1lLgovLy8gVGhlIHRhYmxlcyBvbmx5IGNvbnRhaW4gOTYgZW50cmllcywgcmVwcmVzZW50aW5nIHRoYXQgY2hhcmFjdGVycyBpbiB0aGUKLy8vIGludGVyZXN0aW5nIHJhbmdlLCBwbHVzIG9uZSBtb3JlIHRvIHJlcHJlc2VudCBhbGwgdmFsdWVzIG91dHNpZGUgdGhlIHJhbmdlLgovLy8gVGhlIGNoYXJhY3RlciBlbnRyaWVzIGFyZSBzdG9yZWQgaW4gb25lIGBVaW50OExpc3RgIHBlciBzdGF0ZSwgd2l0aCB0aGUKLy8vIHRyYW5zaXRpb24gZm9yIGEgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIGBjaGFyYWN0ZXIgXiAweDYwYCwKLy8vIHdoaWNoIG1hcHMgdGhlIHJhbmdlIFUrMDAyMCAuLiBVKzAwN0YgaW50byBwb3NpdGlvbnMgMCAuLiA5NS4KLy8vIEFsbCByZW1haW5pbmcgY2hhcmFjdGVycyBhcmUgbWFwcGVkIHRvIHBvc2l0aW9uIDMxIChgMHg3ZiBeIDB4NjBgKSB3aGljaAovLy8gcmVwcmVzZW50cyB0aGUgdHJhbnNpdGlvbiBmb3IgYWxsIHJlbWFpbmluZyBjaGFyYWN0ZXJzLgpmaW5hbCBMaXN0PFVpbnQ4TGlzdD4gX3NjYW5uZXJUYWJsZXMgPSBfY3JlYXRlVGFibGVzKCk7CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIENvZGUgdG8gY3JlYXRlIHRoZSBVUkkgc2Nhbm5lciB0YWJsZS4KCi8vLyBDcmVhdGVzIHRoZSB0YWJsZXMgZm9yIFtfc2Nhbm5lclRhYmxlc10gdXNlZCBieSBbVXJpLnBhcnNlXS4KLy8vCi8vLyBTZWUgW19zY2FubmVyVGFibGVzXSBmb3IgdGhlIGdlbmVyYXRlZCBmb3JtYXQuCi8vLwovLy8gVGhlIGNvbmNyZXRlIHRhYmxlcyBhcmUgY2hvc2VuIGFzIGEgdHJhZGUtb2ZmIGJldHdlZW4gdGhlIG51bWJlciBvZiBzdGF0ZXMKLy8vIG5lZWRlZCBhbmQgdGhlIHByZWNpc2lvbiBvZiB0aGUgcmVzdWx0LgovLy8gVGhpcyBhbGxvd3MgZGVmaW5pdGVseSByZWNvZ25pemluZyB0aGUgZ2VuZXJhbCBzdHJ1Y3R1cmUgb2YgdGhlIFVSSQovLy8gKHByZXNlbmNlIGFuZCBsb2NhdGlvbiBvZiBzY2hlbWUsIHVzZXItaW5mbywgaG9zdCwgcG9ydCwgcGF0aCwgcXVlcnkgYW5kCi8vLyBmcmFnbWVudCkgd2hpbGUgYXQgdGhlIHNhbWUgdGltZSBkZXRlY3RpbmcgdGhhdCBzb21lIGNvbXBvbmVudHMgYXJlIG5vdAovLy8gaW4gY2Fub25pY2FsIGZvcm0gKGFueXRoaW5nIGNvbnRhaW5pbmcgYSBgJWAsIGEgaG9zdC1uYW1lIGNvbnRhaW5pbmcgYQovLy8gY2FwaXRhbCBsZXR0ZXIpLiBTaW5jZSB0aGUgc2Nhbm5lciBkb2Vzbid0IGtub3cgd2hldGhlciBzb21ldGhpbmcgaXMgYQovLy8gc2NoZW1lIG9yIGEgcGF0aCB1bnRpbCBpdCBzZWVzIGA6YCwgb3IgdXNlci1pbmZvIG9yIGhvc3QgdW50aWwgaXQgc2VlcwovLy8gYSBgQGAsIGEgc2Vjb25kIHBhc3MgaXMgbmVlZGVkIHRvIHZhbGlkYXRlIHRoZSBzY2hlbWUgYW5kIGFueSB1c2VyLWluZm8KLy8vIGlzIGNvbnNpZGVyZWQgbm9uLWNhbm9uaWNhbCBieSBkZWZhdWx0LgovLy8KLy8vIFRoZSBzdGF0ZXMgKHN0YXJ0aW5nIGZyb20gW191cmlTdGFydF0pIHdyaXRlIHBvc2l0aW9ucyB3aGlsZSBzY2FubmluZwovLy8gYSBzdHJpbmcgZnJvbSBgc3RhcnRgIHRvIGBlbmRgIGFzIGZvbGxvd3M6Ci8vLwovLy8gLSBbX3NjaGVtZUVuZEluZGV4XTogU2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIGBzdGFydC0xYC4KLy8vICAgSWYgdGhlIFVSSSBoYXMgYSBzY2hlbWUsIGl0IGlzIHNldCB0byB0aGUgcG9zaXRpb24gb2YgdGhlIGA6YCBhZnRlcgovLy8gICB0aGUgc2NoZW1lLgovLy8gLSBbX2hvc3RTdGFydEluZGV4XTogU2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIGBzdGFydCAtIDFgLgovLy8gICBJZiB0aGUgVVJJIGhhcyBhbiBhdXRob3JpdHksIGl0IGlzIHNldCB0byB0aGUgY2hhcmFjdGVyIGJlZm9yZSB0aGUKLy8vICAgaG9zdCBuYW1lIC0gZWl0aGVyIHRoZSBzZWNvbmQgYC9gIGluIHRoZSBgLy9gIGxlYWRpbmcgdGhlIGF1dGhvcml0eSwKLy8vICAgb3IgdGhlIGBAYCBhZnRlciBhIHVzZXItaW5mby4gQ29tcGFyaW5nIHRoaXMgdmFsdWUgdG8gdGhlIHNjaGVtZSBlbmQKLy8vICAgcG9zaXRpb24gY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IHRoYXQgdGhlcmUgaXMgYSB1c2VyLWluZm8gY29tcG9uZW50LgovLy8gLSBbX3BvcnRTdGFydEluZGV4XTogU2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIGBzdGFydGAuCi8vLyAgIFNldCB0byB0aGUgcG9zaXRpb24gb2YgdGhlIGxhc3QgYDpgIGluIGFuIGF1dGhvcml0eSwgYW5kIHVuY2hhbmdlZAovLy8gICBpZiB0aGVyZSBpcyBubyBhdXRob3JpdHkgb3Igbm8gYDpgIGluIGFuIGF1dGhvcml0eS4KLy8vICAgSWYgdGhpcyBwb3NpdGlvbiBpcyBhZnRlciB0aGUgaG9zdCBzdGFydCwgdGhlcmUgaXMgYSBwb3J0LCBvdGhlcndpc2UgaXQKLy8vICAgaXMganVzdCBtYXJraW5nIGEgY29sb24gaW4gdGhlIHVzZXItaW5mbyBjb21wb25lbnQuCi8vLyAtIFtfcGF0aFN0YXJ0SW5kZXhdOiBTaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gYHN0YXJ0YC4KLy8vICAgSXMgc2V0IHRvIHRoZSBmaXJzdCBwYXRoIGNoYXJhY3RlciB1bmxlc3MgdGhlIHBhdGggaXMgZW1wdHkuCi8vLyAgIElmIHRoZSBwYXRoIGlzIGVtcHR5LCB0aGUgcG9zaXRpb24gaXMgZWl0aGVyIHVuY2hhbmdlZCAoYHN0YXJ0YCkgb3IKLy8vICAgdGhlIGZpcnN0IHNsYXNoIG9mIGFuIGF1dGhvcml0eS4gU28sIGlmIHRoZSBwYXRoIHN0YXJ0IGlzIGJlZm9yZSBhCi8vLyAgIGhvc3Qgc3RhcnQgb3Igc2NoZW1lIGVuZCwgdGhlIHBhdGggaXMgZW1wdHkuCi8vLyAtIFtfcXVlcnlTdGFydEluZGV4XTogU2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIGBlbmRgLgovLy8gICBUaGUgcG9zaXRpb24gb2YgdGhlIGA/YCBsZWFkaW5nIGEgcXVlcnkgaWYgdGhlIFVSSSBjb250YWlucyBhIHF1ZXJ5LgovLy8gLSBbX2ZyYWdtZW50U3RhcnRJbmRleF06IFNob3VsZCBiZSBpbml0aWFsaXplZCB0byBgZW5kYC4KLy8vICAgVGhlIHBvc2l0aW9uIG9mIHRoZSBgI2AgbGVhZGluZyBhIGZyYWdtZW50IGlmIHRoZSBVUkkgY29udGFpbnMgYSBmcmFnbWVudC4KLy8vIC0gW19ub3RTaW1wbGVJbmRleF06IFNob3VsZCBiZSBpbml0aWFsaXplZCB0byBgc3RhcnQgLSAxYC4KLy8vICAgU2V0IHRvIGFub3RoZXIgdmFsdWUgaWYgdGhlIFVSSSBpcyBjb25zaWRlcmVkICJub3Qgc2ltcGxlIi4KLy8vICAgVGhpcyBpcyBlbGFib3JhdGVkIGJlbG93LgovLy8KLy8vICMgU2ltcGxlIFVSSXMKLy8vIEEgVVJJIGlzIGNvbnNpZGVyZWQgInNpbXBsZSIgaWYgaXQgaXMgaW4gYSBub3JtYWxpemVkIGZvcm0gY29udGFpbmluZyBubwovLy8gZXNjYXBlcy4gVGhpcyBhbGxvd3MgdXMgdG8gc2tpcCBub3JtYWxpemF0aW9uIGFuZCBjaGVja2luZyB3aGV0aGVyIGVzY2FwZXMKLy8vIGFyZSB2YWxpZCwgYW5kIHRvIGV4dHJhY3QgY29tcG9uZW50cyB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IHVuZXNjYXBpbmcuCi8vLwovLy8gVGhlIHNjYW5uZXIgY29tcHV0ZXMgYSBjb25zZXJ2YXRpdmUgYXBwcm94aW1hdGlvbiBvZiBiZWluZyAic2ltcGxlIi4KLy8vIEl0IHJlamVjdHMgYW55IFVSSSB3aXRoIGFuIGVzY2FwZSwgd2l0aCBhIHVzZXItaW5mbyBjb21wb25lbnQgKG1haW5seQovLy8gYmVjYXVzZSB0aGV5IGFyZSByYXJlIGFuZCB3b3VsZCBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIHN0YXRlcyBpbiB0aGUKLy8vIHNjYW5uZXIgc2lnbmlmaWNhbnRseSksIHdpdGggYW4gSVBWNiBob3N0IG9yIHdpdGggYSBjYXBpdGFsIGxldHRlciBpbgovLy8gdGhlIHNjaGVtZSBvciBob3N0IG5hbWUgKHRoZSBzY2hlbWUgaXMgaGFuZGxlZCBpbiBhIHNlY29uZCBzY2FuIHVzaW5nCi8vLyBhIHNlcGFyYXRlIHR3by1zdGF0ZSB0YWJsZSkuCi8vLyBGdXJ0aGVyLCBwYXRocyBjb250YWluaW5nIGAuLmAgb3IgYC5gIHBhdGggc2VnbWVudHMgYXJlIGNvbnNpZGVyZWQKLy8vIG5vbi1zaW1wbGUgZXhjZXB0IGZvciBwdXJlIHJlbGF0aXZlIHBhdGhzIChubyBzY2hlbWUgb3IgYXV0aG9yaXR5KSBzdGFydGluZwovLy8gd2l0aCBhIHNlcXVlbmNlIG9mICIuLi8iIHNlZ21lbnRzLgovLy8KLy8vIFRoZSB0cmFuc2l0aW9uIHRhYmxlcyBjYW5ub3QgZGV0ZWN0IGEgdHJhaWxpbmcgIi4uIiBpbiB0aGUgcGF0aCwKLy8vIGZvbGxvd2VkIGJ5IGEgcXVlcnkgb3IgZnJhZ21lbnQsIGJlY2F1c2UgdGhlIHNlZ21lbnQgaXMgbm90IGtub3duIHRvIGJlCi8vLyBjb21wbGV0ZSB1bnRpbCB3ZSBhcmUgcGFzdCBpdCwgYW5kIHdlIHRoZW4gbmVlZCB0byBzdG9yZSB0aGUgcXVlcnkvZnJhZ21lbnQKLy8vIHN0YXJ0IGluc3RlYWQuIFRoaXMgY2FzdCBpcyBjaGVja2VkIG1hbnVhbGx5IHBvc3Qtc2Nhbm5pbmcgKHN1Y2ggYSBwYXRoCi8vLyBuZWVkcyB0byBiZSBub3JtYWxpemVkIHRvIGVuZCBpbiAiLi4vIiwgc28gdGhlIFVSSSBzaG91bGRuJ3QgYmUgY29uc2lkZXJlZAovLy8gc2ltcGxlKS4KTGlzdDxVaW50OExpc3Q+IF9jcmVhdGVUYWJsZXMoKSB7CiAgLy8gVE9ETyhscm4pOiBVc2UgYSBwcmVjb21wdXRlZCB0YWJsZS4KCiAgLy8gVG90YWwgbnVtYmVyIG9mIHN0YXRlcyBmb3IgdGhlIHNjYW5uZXIuCiAgY29uc3QgaW50IHN0YXRlQ291bnQgPSAyMjsKCiAgLy8gU3RhdGVzIHVzZWQgdG8gc2NhbiBhIFVSSSBmcm9tIHNjcmF0Y2guCiAgY29uc3QgaW50IHNjaGVtZU9yUGF0aCA9IDAxOwogIGNvbnN0IGludCBhdXRoT3JQYXRoID0gMDI7CiAgY29uc3QgaW50IGF1dGhPclBhdGhTbGFzaCA9IDAzOwogIGNvbnN0IGludCB1aW5mb09ySG9zdDAgPSAwNDsKICBjb25zdCBpbnQgdWluZm9Pckhvc3QgPSAwNTsKICBjb25zdCBpbnQgdWluZm9PclBvcnQwID0gMDY7CiAgY29uc3QgaW50IHVpbmZvT3JQb3J0ID0gMDc7CiAgY29uc3QgaW50IGlwdjZIb3N0ID0gMDg7CiAgY29uc3QgaW50IHJlbFBhdGhTZWcgPSAwOTsKICBjb25zdCBpbnQgcGF0aFNlZyA9IDEwOwogIGNvbnN0IGludCBwYXRoID0gMTE7CiAgY29uc3QgaW50IHF1ZXJ5ID0gMTI7CiAgY29uc3QgaW50IGZyYWdtZW50ID0gMTM7CiAgY29uc3QgaW50IHNjaGVtZU9yUGF0aERvdCA9IDE0OwogIGNvbnN0IGludCBzY2hlbWVPclBhdGhEb3QyID0gMTU7CiAgY29uc3QgaW50IHJlbFBhdGhTZWdEb3QgPSAxNjsKICBjb25zdCBpbnQgcmVsUGF0aFNlZ0RvdDIgPSAxNzsKICBjb25zdCBpbnQgcGF0aFNlZ0RvdCA9IDE4OwogIGNvbnN0IGludCBwYXRoU2VnRG90MiA9IDE5OwoKICAvLyBTdGF0ZXMgdXNlZCB0byB2YWxpZGF0ZSBhIHNjaGVtZSBhZnRlciBpdHMgZW5kIHBvc2l0aW9uIGhhcyBiZWVuIGZvdW5kLgogIGNvbnN0IGludCBzY2hlbWUwID0gX3NjaGVtZVN0YXJ0OwogIGNvbnN0IGludCBzY2hlbWUgPSAyMTsKCiAgLy8gQ29uc3RhbnRzIGVuY29kaW5nIHRoZSB3cml0ZS1pbmRleCBmb3IgdGhlIHN0YXRlIHRyYW5zaXRpb24gaW50byB0aGUgdG9wIDUKICAvLyBiaXRzIG9mIGEgYnl0ZS4KICBjb25zdCBpbnQgc2NoZW1lRW5kID0gX3NjaGVtZUVuZEluZGV4IDw8IDU7CiAgY29uc3QgaW50IGhvc3RTdGFydCA9IF9ob3N0U3RhcnRJbmRleCA8PCA1OwogIGNvbnN0IGludCBwb3J0U3RhcnQgPSBfcG9ydFN0YXJ0SW5kZXggPDwgNTsKICBjb25zdCBpbnQgcGF0aFN0YXJ0ID0gX3BhdGhTdGFydEluZGV4IDw8IDU7CiAgY29uc3QgaW50IHF1ZXJ5U3RhcnQgPSBfcXVlcnlTdGFydEluZGV4IDw8IDU7CiAgY29uc3QgaW50IGZyYWdtZW50U3RhcnQgPSBfZnJhZ21lbnRTdGFydEluZGV4IDw8IDU7CiAgY29uc3QgaW50IG5vdFNpbXBsZSA9IF9ub3RTaW1wbGVJbmRleCA8PCA1OwoKICAvLy8gVGhlIGB1bnJlc2VydmVkYCBjaGFyYWN0ZXJzIG9mIFJGQyAzOTg2LgogIGNvbnN0IHVucmVzZXJ2ZWQgPQogICAgICAiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXotLl9+IjsKCiAgLy8vIFRoZSBgc3ViLWRlbGltYCBjaGFyYWN0ZXJzIG9mIFJGQyAzOTg2LgogIGNvbnN0IHN1YkRlbGltcyA9IHIiISQmJygpKissOz0iOwogIC8vIFRoZSBgcGNoYXJgIGNoYXJhY3RlcnMgb2YgUkZDIDM5ODY6IGNoYXJhY3RlcnMgdGhhdCBtYXkgb2NjdXIgaW4gYSBwYXRoLAogIC8vIGV4Y2x1ZGluZyBlc2NhcGVzLgogIGNvbnN0IHBjaGFyID0gIiR1bnJlc2VydmVkJHN1YkRlbGltcyI7CgogIHZhciB0YWJsZXMgPSBMaXN0PFVpbnQ4TGlzdD4uZ2VuZXJhdGUoc3RhdGVDb3VudCwgKF8pID0+IFVpbnQ4TGlzdCg5NikpOwoKICAvLyBIZWxwZXIgZnVuY3Rpb24gd2hpY2ggaW5pdGlhbGl6ZSB0aGUgdGFibGUgZm9yIFtzdGF0ZV0gd2l0aCBhIGRlZmF1bHQKICAvLyB0cmFuc2l0aW9uIGFuZCByZXR1cm5zIHRoZSB0YWJsZS4KICBVaW50OExpc3QgYnVpbGQoc3RhdGUsIGRlZmF1bHRUcmFuc2l0aW9uKSA9PgogICAgICB0YWJsZXNbc3RhdGVdLi5maWxsUmFuZ2UoMCwgOTYsIGRlZmF1bHRUcmFuc2l0aW9uKTsKCiAgLy8gSGVscGVyIGZ1bmN0aW9uIHdoaWNoIHNldHMgdGhlIHRyYW5zaXRpb24gZm9yIGVhY2ggY2hhcmFjdGVyIGluIFtjaGFyc10KICAvLyB0byBbdHJhbnNpdGlvbl0gaW4gdGhlIFt0YXJnZXRdIHRhYmxlLgogIC8vIFRoZSBbY2hhcnNdIHN0cmluZyBtdXN0IGNvbnRhaW4gb25seSBjaGFyYWN0ZXJzIGluIHRoZSBVKzAwMjAgLi4gVSswMDdFCiAgLy8gcmFuZ2UuCiAgdm9pZCBzZXRDaGFycyhVaW50OExpc3QgdGFyZ2V0LCBTdHJpbmcgY2hhcnMsIGludCB0cmFuc2l0aW9uKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBjaGFyID0gY2hhcnMuY29kZVVuaXRBdChpKTsKICAgICAgdGFyZ2V0W2NoYXIgXiAweDYwXSA9IHRyYW5zaXRpb247CiAgICB9CiAgfQoKICAvLy8gSGVscGVyIGZ1bmN0aW9uIHdoaWNoIHNldHMgdGhlIHRyYW5zaXRpb24gZm9yIGFsbCBjaGFyYWN0ZXJzIGluIHRoZQogIC8vLyByYW5nZSBmcm9tIGByYW5nZVswXWAgdG8gYHJhbmdlWzFdYCB0byBbdHJhbnNpdGlvbl0gaW4gdGhlIFt0YXJnZXRdIHRhYmxlLgogIC8vLwogIC8vLyBUaGUgW3JhbmdlXSBtdXN0IGJlIGEgdHdvLWNoYXJhY3RlciBzdHJpbmcgd2hlcmUgYm90aCBjaGFyYWN0ZXJzIGFyZSBpbgogIC8vLyB0aGUgVSswMDIwIC4uIFUrMDA3RSByYW5nZSBhbmQgdGhlIGZvcm1lciBjaGFyYWN0ZXIgbXVzdCBoYXZlIGEgbG93ZXIKICAvLy8gY29kZSBwb2ludCB0aGFuIHRoZSBsYXR0ZXIuCiAgdm9pZCBzZXRSYW5nZShVaW50OExpc3QgdGFyZ2V0LCBTdHJpbmcgcmFuZ2UsIGludCB0cmFuc2l0aW9uKSB7CiAgICBmb3IgKGludCBpID0gcmFuZ2UuY29kZVVuaXRBdCgwKSwgbiA9IHJhbmdlLmNvZGVVbml0QXQoMSk7IGkgPD0gbjsgaSsrKSB7CiAgICAgIHRhcmdldFtpIF4gMHg2MF0gPSB0cmFuc2l0aW9uOwogICAgfQogIH0KCiAgLy8gQ3JlYXRlIHRoZSB0cmFuc2l0aW9ucyBmb3IgZWFjaCBzdGF0ZS4KICB2YXIgYjsKCiAgLy8gVmFsaWRhdGUgYXMgcGF0aCwgaWYgaXQgaXMgYSBzY2hlbWUsIHdlIGhhbmRsZSBpdCBsYXRlci4KICBiID0gYnVpbGQoX3VyaVN0YXJ0LCBzY2hlbWVPclBhdGggfCBub3RTaW1wbGUpOwogIHNldENoYXJzKGIsIHBjaGFyLCBzY2hlbWVPclBhdGgpOwogIHNldENoYXJzKGIsICIuIiwgc2NoZW1lT3JQYXRoRG90KTsKICBzZXRDaGFycyhiLCAiOiIsIGF1dGhPclBhdGggfCBzY2hlbWVFbmQpOyAvLyBIYW5kbGUgbGF0ZXIuCiAgc2V0Q2hhcnMoYiwgIi8iLCBhdXRoT3JQYXRoU2xhc2gpOwogIHNldENoYXJzKGIsICI/IiwgcXVlcnkgfCBxdWVyeVN0YXJ0KTsKICBzZXRDaGFycyhiLCAiIyIsIGZyYWdtZW50IHwgZnJhZ21lbnRTdGFydCk7CgogIGIgPSBidWlsZChzY2hlbWVPclBhdGhEb3QsIHNjaGVtZU9yUGF0aCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHNjaGVtZU9yUGF0aCk7CiAgc2V0Q2hhcnMoYiwgIi4iLCBzY2hlbWVPclBhdGhEb3QyKTsKICBzZXRDaGFycyhiLCAnOicsIGF1dGhPclBhdGggfCBzY2hlbWVFbmQpOwogIHNldENoYXJzKGIsICIvIiwgcGF0aFNlZyB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgIj8iLCBxdWVyeSB8IHF1ZXJ5U3RhcnQpOwogIHNldENoYXJzKGIsICIjIiwgZnJhZ21lbnQgfCBmcmFnbWVudFN0YXJ0KTsKCiAgYiA9IGJ1aWxkKHNjaGVtZU9yUGF0aERvdDIsIHNjaGVtZU9yUGF0aCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHNjaGVtZU9yUGF0aCk7CiAgc2V0Q2hhcnMoYiwgIiUiLCBzY2hlbWVPclBhdGggfCBub3RTaW1wbGUpOwogIHNldENoYXJzKGIsICc6JywgYXV0aE9yUGF0aCB8IHNjaGVtZUVuZCk7CiAgc2V0Q2hhcnMoYiwgIi8iLCByZWxQYXRoU2VnKTsKICBzZXRDaGFycyhiLCAiPyIsIHF1ZXJ5IHwgcXVlcnlTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIiMiLCBmcmFnbWVudCB8IGZyYWdtZW50U3RhcnQpOwoKICBiID0gYnVpbGQoc2NoZW1lT3JQYXRoLCBzY2hlbWVPclBhdGggfCBub3RTaW1wbGUpOwogIHNldENoYXJzKGIsIHBjaGFyLCBzY2hlbWVPclBhdGgpOwogIHNldENoYXJzKGIsICc6JywgYXV0aE9yUGF0aCB8IHNjaGVtZUVuZCk7CiAgc2V0Q2hhcnMoYiwgIi8iLCBwYXRoU2VnKTsKICBzZXRDaGFycyhiLCAiPyIsIHF1ZXJ5IHwgcXVlcnlTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIiMiLCBmcmFnbWVudCB8IGZyYWdtZW50U3RhcnQpOwoKICBiID0gYnVpbGQoYXV0aE9yUGF0aCwgcGF0aCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHBhdGggfCBwYXRoU3RhcnQpOwogIHNldENoYXJzKGIsICIvIiwgYXV0aE9yUGF0aFNsYXNoIHwgcGF0aFN0YXJ0KTsKICBzZXRDaGFycyhiLCAiLiIsIHBhdGhTZWdEb3QgfCBwYXRoU3RhcnQpOwogIHNldENoYXJzKGIsICI/IiwgcXVlcnkgfCBxdWVyeVN0YXJ0KTsKICBzZXRDaGFycyhiLCAiIyIsIGZyYWdtZW50IHwgZnJhZ21lbnRTdGFydCk7CgogIGIgPSBidWlsZChhdXRoT3JQYXRoU2xhc2gsIHBhdGggfCBub3RTaW1wbGUpOwogIHNldENoYXJzKGIsIHBjaGFyLCBwYXRoKTsKICBzZXRDaGFycyhiLCAiLyIsIHVpbmZvT3JIb3N0MCB8IGhvc3RTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIi4iLCBwYXRoU2VnRG90KTsKICBzZXRDaGFycyhiLCAiPyIsIHF1ZXJ5IHwgcXVlcnlTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIiMiLCBmcmFnbWVudCB8IGZyYWdtZW50U3RhcnQpOwoKICBiID0gYnVpbGQodWluZm9Pckhvc3QwLCB1aW5mb09ySG9zdCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHVpbmZvT3JIb3N0KTsKICBzZXRSYW5nZShiLCAiQVoiLCB1aW5mb09ySG9zdCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgIjoiLCB1aW5mb09yUG9ydDAgfCBwb3J0U3RhcnQpOwogIHNldENoYXJzKGIsICJAIiwgdWluZm9Pckhvc3QwIHwgaG9zdFN0YXJ0KTsKICBzZXRDaGFycyhiLCAiWyIsIGlwdjZIb3N0IHwgbm90U2ltcGxlKTsKICBzZXRDaGFycyhiLCAiLyIsIHBhdGhTZWcgfCBwYXRoU3RhcnQpOwogIHNldENoYXJzKGIsICI/IiwgcXVlcnkgfCBxdWVyeVN0YXJ0KTsKICBzZXRDaGFycyhiLCAiIyIsIGZyYWdtZW50IHwgZnJhZ21lbnRTdGFydCk7CgogIGIgPSBidWlsZCh1aW5mb09ySG9zdCwgdWluZm9Pckhvc3QgfCBub3RTaW1wbGUpOwogIHNldENoYXJzKGIsIHBjaGFyLCB1aW5mb09ySG9zdCk7CiAgc2V0UmFuZ2UoYiwgIkFaIiwgdWluZm9Pckhvc3QgfCBub3RTaW1wbGUpOwogIHNldENoYXJzKGIsICI6IiwgdWluZm9PclBvcnQwIHwgcG9ydFN0YXJ0KTsKICBzZXRDaGFycyhiLCAiQCIsIHVpbmZvT3JIb3N0MCB8IGhvc3RTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIi8iLCBwYXRoU2VnIHwgcGF0aFN0YXJ0KTsKICBzZXRDaGFycyhiLCAiPyIsIHF1ZXJ5IHwgcXVlcnlTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIiMiLCBmcmFnbWVudCB8IGZyYWdtZW50U3RhcnQpOwoKICBiID0gYnVpbGQodWluZm9PclBvcnQwLCB1aW5mb09yUG9ydCB8IG5vdFNpbXBsZSk7CiAgc2V0UmFuZ2UoYiwgIjE5IiwgdWluZm9PclBvcnQpOwogIHNldENoYXJzKGIsICJAIiwgdWluZm9Pckhvc3QwIHwgaG9zdFN0YXJ0KTsKICBzZXRDaGFycyhiLCAiLyIsIHBhdGhTZWcgfCBwYXRoU3RhcnQpOwogIHNldENoYXJzKGIsICI/IiwgcXVlcnkgfCBxdWVyeVN0YXJ0KTsKICBzZXRDaGFycyhiLCAiIyIsIGZyYWdtZW50IHwgZnJhZ21lbnRTdGFydCk7CgogIGIgPSBidWlsZCh1aW5mb09yUG9ydCwgdWluZm9PclBvcnQgfCBub3RTaW1wbGUpOwogIHNldFJhbmdlKGIsICIwOSIsIHVpbmZvT3JQb3J0KTsKICBzZXRDaGFycyhiLCAiQCIsIHVpbmZvT3JIb3N0MCB8IGhvc3RTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIi8iLCBwYXRoU2VnIHwgcGF0aFN0YXJ0KTsKICBzZXRDaGFycyhiLCAiPyIsIHF1ZXJ5IHwgcXVlcnlTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIiMiLCBmcmFnbWVudCB8IGZyYWdtZW50U3RhcnQpOwoKICBiID0gYnVpbGQoaXB2Nkhvc3QsIGlwdjZIb3N0KTsKICBzZXRDaGFycyhiLCAiXSIsIHVpbmZvT3JIb3N0KTsKCiAgYiA9IGJ1aWxkKHJlbFBhdGhTZWcsIHBhdGggfCBub3RTaW1wbGUpOwogIHNldENoYXJzKGIsIHBjaGFyLCBwYXRoKTsKICBzZXRDaGFycyhiLCAiLiIsIHJlbFBhdGhTZWdEb3QpOwogIHNldENoYXJzKGIsICIvIiwgcGF0aFNlZyB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgIj8iLCBxdWVyeSB8IHF1ZXJ5U3RhcnQpOwogIHNldENoYXJzKGIsICIjIiwgZnJhZ21lbnQgfCBmcmFnbWVudFN0YXJ0KTsKCiAgYiA9IGJ1aWxkKHJlbFBhdGhTZWdEb3QsIHBhdGggfCBub3RTaW1wbGUpOwogIHNldENoYXJzKGIsIHBjaGFyLCBwYXRoKTsKICBzZXRDaGFycyhiLCAiLiIsIHJlbFBhdGhTZWdEb3QyKTsKICBzZXRDaGFycyhiLCAiLyIsIHBhdGhTZWcgfCBub3RTaW1wbGUpOwogIHNldENoYXJzKGIsICI/IiwgcXVlcnkgfCBxdWVyeVN0YXJ0KTsKICBzZXRDaGFycyhiLCAiIyIsIGZyYWdtZW50IHwgZnJhZ21lbnRTdGFydCk7CgogIGIgPSBidWlsZChyZWxQYXRoU2VnRG90MiwgcGF0aCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHBhdGgpOwogIHNldENoYXJzKGIsICIvIiwgcmVsUGF0aFNlZyk7CiAgc2V0Q2hhcnMoYiwgIj8iLCBxdWVyeSB8IHF1ZXJ5U3RhcnQpOyAvLyBUaGlzIHNob3VsZCBiZSBub24tc2ltcGxlLgogIHNldENoYXJzKGIsICIjIiwgZnJhZ21lbnQgfCBmcmFnbWVudFN0YXJ0KTsgLy8gVGhpcyBzaG91bGQgYmUgbm9uLXNpbXBsZS4KCiAgYiA9IGJ1aWxkKHBhdGhTZWcsIHBhdGggfCBub3RTaW1wbGUpOwogIHNldENoYXJzKGIsIHBjaGFyLCBwYXRoKTsKICBzZXRDaGFycyhiLCAiLiIsIHBhdGhTZWdEb3QpOwogIHNldENoYXJzKGIsICIvIiwgcGF0aFNlZyB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgIj8iLCBxdWVyeSB8IHF1ZXJ5U3RhcnQpOwogIHNldENoYXJzKGIsICIjIiwgZnJhZ21lbnQgfCBmcmFnbWVudFN0YXJ0KTsKCiAgYiA9IGJ1aWxkKHBhdGhTZWdEb3QsIHBhdGggfCBub3RTaW1wbGUpOwogIHNldENoYXJzKGIsIHBjaGFyLCBwYXRoKTsKICBzZXRDaGFycyhiLCAiLiIsIHBhdGhTZWdEb3QyKTsKICBzZXRDaGFycyhiLCAiLyIsIHBhdGhTZWcgfCBub3RTaW1wbGUpOwogIHNldENoYXJzKGIsICI/IiwgcXVlcnkgfCBxdWVyeVN0YXJ0KTsKICBzZXRDaGFycyhiLCAiIyIsIGZyYWdtZW50IHwgZnJhZ21lbnRTdGFydCk7CgogIGIgPSBidWlsZChwYXRoU2VnRG90MiwgcGF0aCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHBhdGgpOwogIHNldENoYXJzKGIsICIvIiwgcGF0aFNlZyB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgIj8iLCBxdWVyeSB8IHF1ZXJ5U3RhcnQpOwogIHNldENoYXJzKGIsICIjIiwgZnJhZ21lbnQgfCBmcmFnbWVudFN0YXJ0KTsKCiAgYiA9IGJ1aWxkKHBhdGgsIHBhdGggfCBub3RTaW1wbGUpOwogIHNldENoYXJzKGIsIHBjaGFyLCBwYXRoKTsKICBzZXRDaGFycyhiLCAiLyIsIHBhdGhTZWcpOwogIHNldENoYXJzKGIsICI/IiwgcXVlcnkgfCBxdWVyeVN0YXJ0KTsKICBzZXRDaGFycyhiLCAiIyIsIGZyYWdtZW50IHwgZnJhZ21lbnRTdGFydCk7CgogIGIgPSBidWlsZChxdWVyeSwgcXVlcnkgfCBub3RTaW1wbGUpOwogIHNldENoYXJzKGIsIHBjaGFyLCBxdWVyeSk7CiAgc2V0Q2hhcnMoYiwgIj8iLCBxdWVyeSk7CiAgc2V0Q2hhcnMoYiwgIiMiLCBmcmFnbWVudCB8IGZyYWdtZW50U3RhcnQpOwoKICBiID0gYnVpbGQoZnJhZ21lbnQsIGZyYWdtZW50IHwgbm90U2ltcGxlKTsKICBzZXRDaGFycyhiLCBwY2hhciwgZnJhZ21lbnQpOwogIHNldENoYXJzKGIsICI/IiwgZnJhZ21lbnQpOwoKICAvLyBBIHNlcGFyYXRlIHR3by1zdGF0ZSB2YWxpZGF0b3IgZm9yIGxvd2VyLWNhc2Ugc2NoZW1lIG5hbWVzLgogIC8vIEFueSBub24tc2NoZW1lIGNoYXJhY3RlciBvciB1cHBlci1jYXNlIGxldHRlciBpcyBtYXJrZWQgYXMgbm9uLXNpbXBsZS4KICBiID0gYnVpbGQoc2NoZW1lMCwgc2NoZW1lIHwgbm90U2ltcGxlKTsKICBzZXRSYW5nZShiLCAiYXoiLCBzY2hlbWUpOwoKICBiID0gYnVpbGQoc2NoZW1lLCBzY2hlbWUgfCBub3RTaW1wbGUpOwogIHNldFJhbmdlKGIsICJheiIsIHNjaGVtZSk7CiAgc2V0UmFuZ2UoYiwgIjA5Iiwgc2NoZW1lKTsKICBzZXRDaGFycyhiLCAiKy0uIiwgc2NoZW1lKTsKCiAgcmV0dXJuIHRhYmxlczsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gQ29kZSB0aGF0IHVzZXMgdGhlIFVSSSBzY2FubmVyIHRhYmxlLgoKLy8vIFNjYW4gYSBzdHJpbmcgdXNpbmcgdGhlIFtfc2Nhbm5lclRhYmxlc10gc3RhdGUgbWFjaGluZS4KLy8vCi8vLyBTY2FucyBbdXJpXSBmcm9tIFtzdGFydF0gdG8gW2VuZF0sIHN0YXJ0aW5nIGluIHN0YXRlIFtzdGF0ZV0gYW5kCi8vLyB3cml0aW5nIG91dHB1dCBpbnRvIFtpbmRpY2VzXS4KLy8vCi8vLyBSZXR1cm5zIHRoZSBmaW5hbCBzdGF0ZS4KaW50IF9zY2FuKFN0cmluZyB1cmksIGludCBzdGFydCwgaW50IGVuZCwgaW50IHN0YXRlLCBMaXN0PGludD4gaW5kaWNlcykgewogIHZhciB0YWJsZXMgPSBfc2Nhbm5lclRhYmxlczsKICBhc3NlcnQoZW5kIDw9IHVyaS5sZW5ndGgpOwogIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICB2YXIgdGFibGUgPSB0YWJsZXNbc3RhdGVdOwogICAgLy8gWG9yIHdpdGggMHg2MCB0byBtb3ZlIHJhbmdlIDB4MjAtMHg3ZiBpbnRvIDB4MDAtMHg1ZgogICAgaW50IGNoYXIgPSB1cmkuY29kZVVuaXRBdChpKSBeIDB4NjA7CiAgICAvLyBVc2UgMHgxZiAobmVlIDB4N2YpIHRvIHJlcHJlc2VudCBhbGwgdW5oYW5kbGVkIGNoYXJhY3RlcnMuCiAgICBpZiAoY2hhciA+IDB4NWYpIGNoYXIgPSAweDFmOwogICAgaW50IHRyYW5zaXRpb24gPSB0YWJsZVtjaGFyXTsKICAgIHN0YXRlID0gdHJhbnNpdGlvbiAmIDB4MWY7CiAgICBpbmRpY2VzW3RyYW5zaXRpb24gPj4gNV0gPSBpOwogIH0KICByZXR1cm4gc3RhdGU7Cn0KCmNsYXNzIF9TaW1wbGVVcmkgaW1wbGVtZW50cyBVcmkgewogIGZpbmFsIFN0cmluZyBfdXJpOwogIGZpbmFsIGludCBfc2NoZW1lRW5kOwogIGZpbmFsIGludCBfaG9zdFN0YXJ0OwogIGZpbmFsIGludCBfcG9ydFN0YXJ0OwogIGZpbmFsIGludCBfcGF0aFN0YXJ0OwogIGZpbmFsIGludCBfcXVlcnlTdGFydDsKICBmaW5hbCBpbnQgX2ZyYWdtZW50U3RhcnQ7CgogIC8vLyBUaGUgc2NoZW1lIGlzIG9mdGVuIHVzZWQgdG8gZGlzdGluZ3Vpc2ggVVJJcy4KICAvLy8gVG8gbWFrZSBjb21wYXJpc29ucyBtb3JlIGVmZmljaWVudCwgd2UgY2FjaGUgdGhlIHZhbHVlLCBhbmQKICAvLy8gY2Fub25pY2FsaXplIGEgZmV3IGtub3duIHR5cGVzLgogIFN0cmluZyBfc2NoZW1lQ2FjaGU7CiAgaW50IF9oYXNoQ29kZUNhY2hlOwoKICBfU2ltcGxlVXJpKAogICAgICB0aGlzLl91cmksCiAgICAgIHRoaXMuX3NjaGVtZUVuZCwKICAgICAgdGhpcy5faG9zdFN0YXJ0LAogICAgICB0aGlzLl9wb3J0U3RhcnQsCiAgICAgIHRoaXMuX3BhdGhTdGFydCwKICAgICAgdGhpcy5fcXVlcnlTdGFydCwKICAgICAgdGhpcy5fZnJhZ21lbnRTdGFydCwKICAgICAgdGhpcy5fc2NoZW1lQ2FjaGUpOwoKICBib29sIGdldCBoYXNTY2hlbWUgPT4gX3NjaGVtZUVuZCA+IDA7CiAgYm9vbCBnZXQgaGFzQXV0aG9yaXR5ID0+IF9ob3N0U3RhcnQgPiAwOwogIGJvb2wgZ2V0IGhhc1VzZXJJbmZvID0+IF9ob3N0U3RhcnQgPiBfc2NoZW1lRW5kICsgNDsKICBib29sIGdldCBoYXNQb3J0ID0+IF9ob3N0U3RhcnQgPiAwICYmIF9wb3J0U3RhcnQgKyAxIDwgX3BhdGhTdGFydDsKICBib29sIGdldCBoYXNRdWVyeSA9PiBfcXVlcnlTdGFydCA8IF9mcmFnbWVudFN0YXJ0OwogIGJvb2wgZ2V0IGhhc0ZyYWdtZW50ID0+IF9mcmFnbWVudFN0YXJ0IDwgX3VyaS5sZW5ndGg7CgogIGJvb2wgZ2V0IF9pc0ZpbGUgPT4gX3NjaGVtZUVuZCA9PSA0ICYmIF91cmkuc3RhcnRzV2l0aCgiZmlsZSIpOwogIGJvb2wgZ2V0IF9pc0h0dHAgPT4gX3NjaGVtZUVuZCA9PSA0ICYmIF91cmkuc3RhcnRzV2l0aCgiaHR0cCIpOwogIGJvb2wgZ2V0IF9pc0h0dHBzID0+IF9zY2hlbWVFbmQgPT0gNSAmJiBfdXJpLnN0YXJ0c1dpdGgoImh0dHBzIik7CiAgYm9vbCBnZXQgX2lzUGFja2FnZSA9PiBfc2NoZW1lRW5kID09IDcgJiYgX3VyaS5zdGFydHNXaXRoKCJwYWNrYWdlIik7CgogIC8vLyBMaWtlIFtpc1NjaGVtZV0gYnV0IGV4cGVjdHMgYXJndW1lbnQgdG8gYmUgY2FzZSBub3JtYWxpemVkLgogIGJvb2wgX2lzU2NoZW1lKFN0cmluZyBzY2hlbWUpID0+CiAgICAgIF9zY2hlbWVFbmQgPT0gc2NoZW1lLmxlbmd0aCAmJiBfdXJpLnN0YXJ0c1dpdGgoc2NoZW1lKTsKCiAgYm9vbCBnZXQgaGFzQWJzb2x1dGVQYXRoID0+IF91cmkuc3RhcnRzV2l0aCgiLyIsIF9wYXRoU3RhcnQpOwogIGJvb2wgZ2V0IGhhc0VtcHR5UGF0aCA9PiBfcGF0aFN0YXJ0ID09IF9xdWVyeVN0YXJ0OwoKICBib29sIGdldCBpc0Fic29sdXRlID0+IGhhc1NjaGVtZSAmJiAhaGFzRnJhZ21lbnQ7CgogIGJvb2wgaXNTY2hlbWUoU3RyaW5nIHNjaGVtZSkgewogICAgaWYgKHNjaGVtZSA9PSBudWxsIHx8IHNjaGVtZS5pc0VtcHR5KSByZXR1cm4gX3NjaGVtZUVuZCA8IDA7CiAgICBpZiAoc2NoZW1lLmxlbmd0aCAhPSBfc2NoZW1lRW5kKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gX1VyaS5fY29tcGFyZVNjaGVtZShzY2hlbWUsIF91cmkpOwogIH0KCiAgU3RyaW5nIGdldCBzY2hlbWUgewogICAgaWYgKF9zY2hlbWVFbmQgPD0gMCkgcmV0dXJuICIiOwogICAgaWYgKF9zY2hlbWVDYWNoZSAhPSBudWxsKSByZXR1cm4gX3NjaGVtZUNhY2hlOwogICAgaWYgKF9pc0h0dHApIHsKICAgICAgX3NjaGVtZUNhY2hlID0gImh0dHAiOwogICAgfSBlbHNlIGlmIChfaXNIdHRwcykgewogICAgICBfc2NoZW1lQ2FjaGUgPSAiaHR0cHMiOwogICAgfSBlbHNlIGlmIChfaXNGaWxlKSB7CiAgICAgIF9zY2hlbWVDYWNoZSA9ICJmaWxlIjsKICAgIH0gZWxzZSBpZiAoX2lzUGFja2FnZSkgewogICAgICBfc2NoZW1lQ2FjaGUgPSAicGFja2FnZSI7CiAgICB9IGVsc2UgewogICAgICBfc2NoZW1lQ2FjaGUgPSBfdXJpLnN1YnN0cmluZygwLCBfc2NoZW1lRW5kKTsKICAgIH0KICAgIHJldHVybiBfc2NoZW1lQ2FjaGU7CiAgfQoKICBTdHJpbmcgZ2V0IGF1dGhvcml0eSA9PgogICAgICBfaG9zdFN0YXJ0ID4gMCA/IF91cmkuc3Vic3RyaW5nKF9zY2hlbWVFbmQgKyAzLCBfcGF0aFN0YXJ0KSA6ICIiOwogIFN0cmluZyBnZXQgdXNlckluZm8gPT4gKF9ob3N0U3RhcnQgPiBfc2NoZW1lRW5kICsgMykKICAgICAgPyBfdXJpLnN1YnN0cmluZyhfc2NoZW1lRW5kICsgMywgX2hvc3RTdGFydCAtIDEpCiAgICAgIDogIiI7CiAgU3RyaW5nIGdldCBob3N0ID0+CiAgICAgIF9ob3N0U3RhcnQgPiAwID8gX3VyaS5zdWJzdHJpbmcoX2hvc3RTdGFydCwgX3BvcnRTdGFydCkgOiAiIjsKICBpbnQgZ2V0IHBvcnQgewogICAgaWYgKGhhc1BvcnQpIHJldHVybiBpbnQucGFyc2UoX3VyaS5zdWJzdHJpbmcoX3BvcnRTdGFydCArIDEsIF9wYXRoU3RhcnQpKTsKICAgIGlmIChfaXNIdHRwKSByZXR1cm4gODA7CiAgICBpZiAoX2lzSHR0cHMpIHJldHVybiA0NDM7CiAgICByZXR1cm4gMDsKICB9CgogIFN0cmluZyBnZXQgcGF0aCA9PiBfdXJpLnN1YnN0cmluZyhfcGF0aFN0YXJ0LCBfcXVlcnlTdGFydCk7CiAgU3RyaW5nIGdldCBxdWVyeSA9PiAoX3F1ZXJ5U3RhcnQgPCBfZnJhZ21lbnRTdGFydCkKICAgICAgPyBfdXJpLnN1YnN0cmluZyhfcXVlcnlTdGFydCArIDEsIF9mcmFnbWVudFN0YXJ0KQogICAgICA6ICIiOwogIFN0cmluZyBnZXQgZnJhZ21lbnQgPT4KICAgICAgKF9mcmFnbWVudFN0YXJ0IDwgX3VyaS5sZW5ndGgpID8gX3VyaS5zdWJzdHJpbmcoX2ZyYWdtZW50U3RhcnQgKyAxKSA6ICIiOwoKICBTdHJpbmcgZ2V0IG9yaWdpbiB7CiAgICAvLyBDaGVjayBvcmlnaW5hbCBiZWhhdmlvciAtIFczQyBzcGVjIGlzIHdvbmt5IQogICAgYm9vbCBpc0h0dHAgPSBfaXNIdHRwOwogICAgaWYgKF9zY2hlbWVFbmQgPCAwKSB7CiAgICAgIHRocm93IFN0YXRlRXJyb3IoIkNhbm5vdCB1c2Ugb3JpZ2luIHdpdGhvdXQgYSBzY2hlbWU6ICR0aGlzIik7CiAgICB9CiAgICBpZiAoIWlzSHR0cCAmJiAhX2lzSHR0cHMpIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcigKICAgICAgICAgICJPcmlnaW4gaXMgb25seSBhcHBsaWNhYmxlIHRvIHNjaGVtZXMgaHR0cCBhbmQgaHR0cHM6ICR0aGlzIik7CiAgICB9CiAgICBpZiAoX2hvc3RTdGFydCA9PSBfcG9ydFN0YXJ0KSB7CiAgICAgIHRocm93IFN0YXRlRXJyb3IoCiAgICAgICAgICAiQSAkc2NoZW1lOiBVUkkgc2hvdWxkIGhhdmUgYSBub24tZW1wdHkgaG9zdCBuYW1lOiAkdGhpcyIpOwogICAgfQogICAgaWYgKF9ob3N0U3RhcnQgPT0gX3NjaGVtZUVuZCArIDMpIHsKICAgICAgcmV0dXJuIF91cmkuc3Vic3RyaW5nKDAsIF9wYXRoU3RhcnQpOwogICAgfQogICAgLy8gTmVlZCB0byBkcm9wIGFub24tZW1wdHkgdXNlckluZm8uCiAgICByZXR1cm4gX3VyaS5zdWJzdHJpbmcoMCwgX3NjaGVtZUVuZCArIDMpICsKICAgICAgICBfdXJpLnN1YnN0cmluZyhfaG9zdFN0YXJ0LCBfcGF0aFN0YXJ0KTsKICB9CgogIExpc3Q8U3RyaW5nPiBnZXQgcGF0aFNlZ21lbnRzIHsKICAgIGludCBzdGFydCA9IF9wYXRoU3RhcnQ7CiAgICBpbnQgZW5kID0gX3F1ZXJ5U3RhcnQ7CiAgICBpZiAoX3VyaS5zdGFydHNXaXRoKCIvIiwgc3RhcnQpKSBzdGFydCsrOwogICAgaWYgKHN0YXJ0ID09IGVuZCkgcmV0dXJuIGNvbnN0IDxTdHJpbmc+W107CiAgICBMaXN0PFN0cmluZz4gcGFydHMgPSBbXTsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIHZhciBjaGFyID0gX3VyaS5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoY2hhciA9PSBfU0xBU0gpIHsKICAgICAgICBwYXJ0cy5hZGQoX3VyaS5zdWJzdHJpbmcoc3RhcnQsIGkpKTsKICAgICAgICBzdGFydCA9IGkgKyAxOwogICAgICB9CiAgICB9CiAgICBwYXJ0cy5hZGQoX3VyaS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOwogICAgcmV0dXJuIExpc3Q8U3RyaW5nPi51bm1vZGlmaWFibGUocGFydHMpOwogIH0KCiAgTWFwPFN0cmluZywgU3RyaW5nPiBnZXQgcXVlcnlQYXJhbWV0ZXJzIHsKICAgIGlmICghaGFzUXVlcnkpIHJldHVybiBjb25zdCA8U3RyaW5nLCBTdHJpbmc+e307CiAgICByZXR1cm4gVW5tb2RpZmlhYmxlTWFwVmlldzxTdHJpbmcsIFN0cmluZz4oVXJpLnNwbGl0UXVlcnlTdHJpbmcocXVlcnkpKTsKICB9CgogIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZ2V0IHF1ZXJ5UGFyYW1ldGVyc0FsbCB7CiAgICBpZiAoIWhhc1F1ZXJ5KSByZXR1cm4gY29uc3QgPFN0cmluZywgTGlzdDxTdHJpbmc+Pnt9OwogICAgTWFwIHF1ZXJ5UGFyYW1ldGVyTGlzdHMgPSBfVXJpLl9zcGxpdFF1ZXJ5U3RyaW5nQWxsKHF1ZXJ5KTsKICAgIGZvciAodmFyIGtleSBpbiBxdWVyeVBhcmFtZXRlckxpc3RzLmtleXMpIHsKICAgICAgcXVlcnlQYXJhbWV0ZXJMaXN0c1trZXldID0KICAgICAgICAgIExpc3Q8U3RyaW5nPi51bm1vZGlmaWFibGUocXVlcnlQYXJhbWV0ZXJMaXN0c1trZXldKTsKICAgIH0KICAgIHJldHVybiBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+LnVubW9kaWZpYWJsZShxdWVyeVBhcmFtZXRlckxpc3RzKTsKICB9CgogIGJvb2wgX2lzUG9ydChTdHJpbmcgcG9ydCkgewogICAgaW50IHBvcnREaWdpdFN0YXJ0ID0gX3BvcnRTdGFydCArIDE7CiAgICByZXR1cm4gcG9ydERpZ2l0U3RhcnQgKyBwb3J0Lmxlbmd0aCA9PSBfcGF0aFN0YXJ0ICYmCiAgICAgICAgX3VyaS5zdGFydHNXaXRoKHBvcnQsIHBvcnREaWdpdFN0YXJ0KTsKICB9CgogIFVyaSBub3JtYWxpemVQYXRoKCkgPT4gdGhpczsKCiAgVXJpIHJlbW92ZUZyYWdtZW50KCkgewogICAgaWYgKCFoYXNGcmFnbWVudCkgcmV0dXJuIHRoaXM7CiAgICByZXR1cm4gX1NpbXBsZVVyaShfdXJpLnN1YnN0cmluZygwLCBfZnJhZ21lbnRTdGFydCksIF9zY2hlbWVFbmQsIF9ob3N0U3RhcnQsCiAgICAgICAgX3BvcnRTdGFydCwgX3BhdGhTdGFydCwgX3F1ZXJ5U3RhcnQsIF9mcmFnbWVudFN0YXJ0LCBfc2NoZW1lQ2FjaGUpOwogIH0KCiAgVXJpIHJlcGxhY2UoCiAgICAgIHtTdHJpbmcgc2NoZW1lLAogICAgICBTdHJpbmcgdXNlckluZm8sCiAgICAgIFN0cmluZyBob3N0LAogICAgICBpbnQgcG9ydCwKICAgICAgU3RyaW5nIHBhdGgsCiAgICAgIEl0ZXJhYmxlPFN0cmluZz4gcGF0aFNlZ21lbnRzLAogICAgICBTdHJpbmcgcXVlcnksCiAgICAgIE1hcDxTdHJpbmcsIGR5bmFtaWMgLypTdHJpbmd8SXRlcmFibGU8U3RyaW5nPiovID4gcXVlcnlQYXJhbWV0ZXJzLAogICAgICBTdHJpbmcgZnJhZ21lbnR9KSB7CiAgICBib29sIHNjaGVtZUNoYW5nZWQgPSBmYWxzZTsKICAgIGlmIChzY2hlbWUgIT0gbnVsbCkgewogICAgICBzY2hlbWUgPSBfVXJpLl9tYWtlU2NoZW1lKHNjaGVtZSwgMCwgc2NoZW1lLmxlbmd0aCk7CiAgICAgIHNjaGVtZUNoYW5nZWQgPSAhX2lzU2NoZW1lKHNjaGVtZSk7CiAgICB9IGVsc2UgewogICAgICBzY2hlbWUgPSB0aGlzLnNjaGVtZTsKICAgIH0KICAgIGJvb2wgaXNGaWxlID0gKHNjaGVtZSA9PSAiZmlsZSIpOwogICAgaWYgKHVzZXJJbmZvICE9IG51bGwpIHsKICAgICAgdXNlckluZm8gPSBfVXJpLl9tYWtlVXNlckluZm8odXNlckluZm8sIDAsIHVzZXJJbmZvLmxlbmd0aCk7CiAgICB9IGVsc2UgaWYgKF9ob3N0U3RhcnQgPiAwKSB7CiAgICAgIHVzZXJJbmZvID0gX3VyaS5zdWJzdHJpbmcoX3NjaGVtZUVuZCArIDMsIF9ob3N0U3RhcnQpOwogICAgfSBlbHNlIHsKICAgICAgdXNlckluZm8gPSAiIjsKICAgIH0KICAgIGlmIChwb3J0ICE9IG51bGwpIHsKICAgICAgcG9ydCA9IF9VcmkuX21ha2VQb3J0KHBvcnQsIHNjaGVtZSk7CiAgICB9IGVsc2UgewogICAgICBwb3J0ID0gdGhpcy5oYXNQb3J0ID8gdGhpcy5wb3J0IDogbnVsbDsKICAgICAgaWYgKHNjaGVtZUNoYW5nZWQpIHsKICAgICAgICAvLyBUaGUgZGVmYXVsdCBwb3J0IG1pZ2h0IGhhdmUgY2hhbmdlZC4KICAgICAgICBwb3J0ID0gX1VyaS5fbWFrZVBvcnQocG9ydCwgc2NoZW1lKTsKICAgICAgfQogICAgfQogICAgaWYgKGhvc3QgIT0gbnVsbCkgewogICAgICBob3N0ID0gX1VyaS5fbWFrZUhvc3QoaG9zdCwgMCwgaG9zdC5sZW5ndGgsIGZhbHNlKTsKICAgIH0gZWxzZSBpZiAoX2hvc3RTdGFydCA+IDApIHsKICAgICAgaG9zdCA9IF91cmkuc3Vic3RyaW5nKF9ob3N0U3RhcnQsIF9wb3J0U3RhcnQpOwogICAgfSBlbHNlIGlmICh1c2VySW5mby5pc05vdEVtcHR5IHx8IHBvcnQgIT0gbnVsbCB8fCBpc0ZpbGUpIHsKICAgICAgaG9zdCA9ICIiOwogICAgfQoKICAgIGJvb2wgaGFzQXV0aG9yaXR5ID0gaG9zdCAhPSBudWxsOwogICAgaWYgKHBhdGggIT0gbnVsbCB8fCBwYXRoU2VnbWVudHMgIT0gbnVsbCkgewogICAgICBwYXRoID0gX1VyaS5fbWFrZVBhdGgocGF0aCwgMCwgX3N0cmluZ09yTnVsbExlbmd0aChwYXRoKSwgcGF0aFNlZ21lbnRzLAogICAgICAgICAgc2NoZW1lLCBoYXNBdXRob3JpdHkpOwogICAgfSBlbHNlIHsKICAgICAgcGF0aCA9IF91cmkuc3Vic3RyaW5nKF9wYXRoU3RhcnQsIF9xdWVyeVN0YXJ0KTsKICAgICAgaWYgKChpc0ZpbGUgfHwgKGhhc0F1dGhvcml0eSAmJiAhcGF0aC5pc0VtcHR5KSkgJiYKICAgICAgICAgICFwYXRoLnN0YXJ0c1dpdGgoJy8nKSkgewogICAgICAgIHBhdGggPSAiLyIgKyBwYXRoOwogICAgICB9CiAgICB9CgogICAgaWYgKHF1ZXJ5ICE9IG51bGwgfHwgcXVlcnlQYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgcXVlcnkgPSBfVXJpLl9tYWtlUXVlcnkoCiAgICAgICAgICBxdWVyeSwgMCwgX3N0cmluZ09yTnVsbExlbmd0aChxdWVyeSksIHF1ZXJ5UGFyYW1ldGVycyk7CiAgICB9IGVsc2UgaWYgKF9xdWVyeVN0YXJ0IDwgX2ZyYWdtZW50U3RhcnQpIHsKICAgICAgcXVlcnkgPSBfdXJpLnN1YnN0cmluZyhfcXVlcnlTdGFydCArIDEsIF9mcmFnbWVudFN0YXJ0KTsKICAgIH0KCiAgICBpZiAoZnJhZ21lbnQgIT0gbnVsbCkgewogICAgICBmcmFnbWVudCA9IF9VcmkuX21ha2VGcmFnbWVudChmcmFnbWVudCwgMCwgZnJhZ21lbnQubGVuZ3RoKTsKICAgIH0gZWxzZSBpZiAoX2ZyYWdtZW50U3RhcnQgPCBfdXJpLmxlbmd0aCkgewogICAgICBmcmFnbWVudCA9IF91cmkuc3Vic3RyaW5nKF9mcmFnbWVudFN0YXJ0ICsgMSk7CiAgICB9CgogICAgcmV0dXJuIF9VcmkuX2ludGVybmFsKHNjaGVtZSwgdXNlckluZm8sIGhvc3QsIHBvcnQsIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCk7CiAgfQoKICBVcmkgcmVzb2x2ZShTdHJpbmcgcmVmZXJlbmNlKSB7CiAgICByZXR1cm4gcmVzb2x2ZVVyaShVcmkucGFyc2UocmVmZXJlbmNlKSk7CiAgfQoKICBVcmkgcmVzb2x2ZVVyaShVcmkgcmVmZXJlbmNlKSB7CiAgICBpZiAocmVmZXJlbmNlIGlzIF9TaW1wbGVVcmkpIHsKICAgICAgcmV0dXJuIF9zaW1wbGVNZXJnZSh0aGlzLCByZWZlcmVuY2UpOwogICAgfQogICAgcmV0dXJuIF90b05vblNpbXBsZSgpLnJlc29sdmVVcmkocmVmZXJlbmNlKTsKICB9CgogIC8vIE1lcmdlIHR3byBzaW1wbGUgVVJJcy4gVGhpcyBzaG91bGQgYWx3YXlzIHJlc3VsdCBpbiBhIHByZWZpeCBvZgogIC8vIG9uZSBjb25jYXRlbmF0ZWQgd2l0aCBhIHN1ZmZpeCBvZiB0aGUgb3RoZXIsIHBvc3NpYmx5IHdpdGggYSBgL2AgaW4KICAvLyB0aGUgbWlkZGxlIG9mIHR3byBtZXJnZWQgcGF0aHMsIHdoaWNoIGlzIGFnYWluIHNpbXBsZS4KICAvLyBJbiBhIGZldyBjYXNlcywgdGhlcmUgbWlnaHQgYmUgYSBuZWVkIGZvciBleHRyYSBub3JtYWxpemF0aW9uLCB3aGVuCiAgLy8gcmVzb2x2aW5nIG9uIHRvcCBvZiBhIGtub3duIHNjaGVtZS4KICBVcmkgX3NpbXBsZU1lcmdlKF9TaW1wbGVVcmkgYmFzZSwgX1NpbXBsZVVyaSByZWYpIHsKICAgIGlmIChyZWYuaGFzU2NoZW1lKSByZXR1cm4gcmVmOwogICAgaWYgKHJlZi5oYXNBdXRob3JpdHkpIHsKICAgICAgaWYgKCFiYXNlLmhhc1NjaGVtZSkgcmV0dXJuIHJlZjsKICAgICAgYm9vbCBpc1NpbXBsZSA9IHRydWU7CiAgICAgIGlmIChiYXNlLl9pc0ZpbGUpIHsKICAgICAgICBpc1NpbXBsZSA9ICFyZWYuaGFzRW1wdHlQYXRoOwogICAgICB9IGVsc2UgaWYgKGJhc2UuX2lzSHR0cCkgewogICAgICAgIGlzU2ltcGxlID0gIXJlZi5faXNQb3J0KCI4MCIpOwogICAgICB9IGVsc2UgaWYgKGJhc2UuX2lzSHR0cHMpIHsKICAgICAgICBpc1NpbXBsZSA9ICFyZWYuX2lzUG9ydCgiNDQzIik7CiAgICAgIH0KICAgICAgaWYgKGlzU2ltcGxlKSB7CiAgICAgICAgdmFyIGRlbHRhID0gYmFzZS5fc2NoZW1lRW5kICsgMTsKICAgICAgICB2YXIgbmV3VXJpID0gYmFzZS5fdXJpLnN1YnN0cmluZygwLCBiYXNlLl9zY2hlbWVFbmQgKyAxKSArCiAgICAgICAgICAgIHJlZi5fdXJpLnN1YnN0cmluZyhyZWYuX3NjaGVtZUVuZCArIDEpOwogICAgICAgIHJldHVybiBfU2ltcGxlVXJpKAogICAgICAgICAgICBuZXdVcmksCiAgICAgICAgICAgIGJhc2UuX3NjaGVtZUVuZCwKICAgICAgICAgICAgcmVmLl9ob3N0U3RhcnQgKyBkZWx0YSwKICAgICAgICAgICAgcmVmLl9wb3J0U3RhcnQgKyBkZWx0YSwKICAgICAgICAgICAgcmVmLl9wYXRoU3RhcnQgKyBkZWx0YSwKICAgICAgICAgICAgcmVmLl9xdWVyeVN0YXJ0ICsgZGVsdGEsCiAgICAgICAgICAgIHJlZi5fZnJhZ21lbnRTdGFydCArIGRlbHRhLAogICAgICAgICAgICBiYXNlLl9zY2hlbWVDYWNoZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVGhpcyB3aWxsIHJlcXVpcmUgbm9ybWFsaXphdGlvbiwgc28gdXNlIHRoZSBfVXJpIGltcGxlbWVudGF0aW9uLgogICAgICAgIHJldHVybiBfdG9Ob25TaW1wbGUoKS5yZXNvbHZlVXJpKHJlZik7CiAgICAgIH0KICAgIH0KICAgIGlmIChyZWYuaGFzRW1wdHlQYXRoKSB7CiAgICAgIGlmIChyZWYuaGFzUXVlcnkpIHsKICAgICAgICBpbnQgZGVsdGEgPSBiYXNlLl9xdWVyeVN0YXJ0IC0gcmVmLl9xdWVyeVN0YXJ0OwogICAgICAgIHZhciBuZXdVcmkgPSBiYXNlLl91cmkuc3Vic3RyaW5nKDAsIGJhc2UuX3F1ZXJ5U3RhcnQpICsKICAgICAgICAgICAgcmVmLl91cmkuc3Vic3RyaW5nKHJlZi5fcXVlcnlTdGFydCk7CiAgICAgICAgcmV0dXJuIF9TaW1wbGVVcmkoCiAgICAgICAgICAgIG5ld1VyaSwKICAgICAgICAgICAgYmFzZS5fc2NoZW1lRW5kLAogICAgICAgICAgICBiYXNlLl9ob3N0U3RhcnQsCiAgICAgICAgICAgIGJhc2UuX3BvcnRTdGFydCwKICAgICAgICAgICAgYmFzZS5fcGF0aFN0YXJ0LAogICAgICAgICAgICByZWYuX3F1ZXJ5U3RhcnQgKyBkZWx0YSwKICAgICAgICAgICAgcmVmLl9mcmFnbWVudFN0YXJ0ICsgZGVsdGEsCiAgICAgICAgICAgIGJhc2UuX3NjaGVtZUNhY2hlKTsKICAgICAgfQogICAgICBpZiAocmVmLmhhc0ZyYWdtZW50KSB7CiAgICAgICAgaW50IGRlbHRhID0gYmFzZS5fZnJhZ21lbnRTdGFydCAtIHJlZi5fZnJhZ21lbnRTdGFydDsKICAgICAgICB2YXIgbmV3VXJpID0gYmFzZS5fdXJpLnN1YnN0cmluZygwLCBiYXNlLl9mcmFnbWVudFN0YXJ0KSArCiAgICAgICAgICAgIHJlZi5fdXJpLnN1YnN0cmluZyhyZWYuX2ZyYWdtZW50U3RhcnQpOwogICAgICAgIHJldHVybiBfU2ltcGxlVXJpKAogICAgICAgICAgICBuZXdVcmksCiAgICAgICAgICAgIGJhc2UuX3NjaGVtZUVuZCwKICAgICAgICAgICAgYmFzZS5faG9zdFN0YXJ0LAogICAgICAgICAgICBiYXNlLl9wb3J0U3RhcnQsCiAgICAgICAgICAgIGJhc2UuX3BhdGhTdGFydCwKICAgICAgICAgICAgYmFzZS5fcXVlcnlTdGFydCwKICAgICAgICAgICAgcmVmLl9mcmFnbWVudFN0YXJ0ICsgZGVsdGEsCiAgICAgICAgICAgIGJhc2UuX3NjaGVtZUNhY2hlKTsKICAgICAgfQogICAgICByZXR1cm4gYmFzZS5yZW1vdmVGcmFnbWVudCgpOwogICAgfQogICAgaWYgKHJlZi5oYXNBYnNvbHV0ZVBhdGgpIHsKICAgICAgdmFyIGRlbHRhID0gYmFzZS5fcGF0aFN0YXJ0IC0gcmVmLl9wYXRoU3RhcnQ7CiAgICAgIHZhciBuZXdVcmkgPSBiYXNlLl91cmkuc3Vic3RyaW5nKDAsIGJhc2UuX3BhdGhTdGFydCkgKwogICAgICAgICAgcmVmLl91cmkuc3Vic3RyaW5nKHJlZi5fcGF0aFN0YXJ0KTsKICAgICAgcmV0dXJuIF9TaW1wbGVVcmkoCiAgICAgICAgICBuZXdVcmksCiAgICAgICAgICBiYXNlLl9zY2hlbWVFbmQsCiAgICAgICAgICBiYXNlLl9ob3N0U3RhcnQsCiAgICAgICAgICBiYXNlLl9wb3J0U3RhcnQsCiAgICAgICAgICBiYXNlLl9wYXRoU3RhcnQsCiAgICAgICAgICByZWYuX3F1ZXJ5U3RhcnQgKyBkZWx0YSwKICAgICAgICAgIHJlZi5fZnJhZ21lbnRTdGFydCArIGRlbHRhLAogICAgICAgICAgYmFzZS5fc2NoZW1lQ2FjaGUpOwogICAgfQogICAgaWYgKGJhc2UuaGFzRW1wdHlQYXRoICYmIGJhc2UuaGFzQXV0aG9yaXR5KSB7CiAgICAgIC8vIHJlZiBoYXMgcmVsYXRpdmUgbm9uLWVtcHR5IHBhdGguCiAgICAgIC8vIEFkZCBhICIvIiBpbiBmcm9udCwgdGhlbiBsZWFkaW5nICIvLi4vIiBzZWdtZW50cyBhcmUgZm9sZGVkIHRvICIvIi4KICAgICAgaW50IHJlZlN0YXJ0ID0gcmVmLl9wYXRoU3RhcnQ7CiAgICAgIHdoaWxlIChyZWYuX3VyaS5zdGFydHNXaXRoKCIuLi8iLCByZWZTdGFydCkpIHsKICAgICAgICByZWZTdGFydCArPSAzOwogICAgICB9CiAgICAgIHZhciBkZWx0YSA9IGJhc2UuX3BhdGhTdGFydCAtIHJlZlN0YXJ0ICsgMTsKICAgICAgdmFyIG5ld1VyaSA9ICIke2Jhc2UuX3VyaS5zdWJzdHJpbmcoMCwgYmFzZS5fcGF0aFN0YXJ0KX0vIgogICAgICAgICAgIiR7cmVmLl91cmkuc3Vic3RyaW5nKHJlZlN0YXJ0KX0iOwogICAgICByZXR1cm4gX1NpbXBsZVVyaSgKICAgICAgICAgIG5ld1VyaSwKICAgICAgICAgIGJhc2UuX3NjaGVtZUVuZCwKICAgICAgICAgIGJhc2UuX2hvc3RTdGFydCwKICAgICAgICAgIGJhc2UuX3BvcnRTdGFydCwKICAgICAgICAgIGJhc2UuX3BhdGhTdGFydCwKICAgICAgICAgIHJlZi5fcXVlcnlTdGFydCArIGRlbHRhLAogICAgICAgICAgcmVmLl9mcmFnbWVudFN0YXJ0ICsgZGVsdGEsCiAgICAgICAgICBiYXNlLl9zY2hlbWVDYWNoZSk7CiAgICB9CiAgICAvLyBNZXJnZSBwYXRocy4KCiAgICAvLyBUaGUgUkZDIDM5ODYgYWxnb3JpdGhtIG1lcmdlcyB0aGUgYmFzZSBwYXRoIHdpdGhvdXQgaXRzIGZpbmFsIHNlZ21lbnQKICAgIC8vIChhbnl0aGluZyBhZnRlciB0aGUgZmluYWwgIi8iLCBvciBldmVyeXRoaW5nIGlmIHRoZSBiYXNlIHBhdGggZG9lc24ndAogICAgLy8gY29udGFpbiBhbnkgIi8iKSwgYW5kIHRoZSByZWZlcmVuY2UgcGF0aC4KICAgIC8vIFRoZW4gaXQgcmVtb3ZlcyAiLiIgYW5kICIuLiIgc2VnbWVudHMgdXNpbmcgdGhlIHJlbW92ZS1kb3Qtc2VnbWVudAogICAgLy8gYWxnb3JpdGhtLgogICAgLy8gVGhpcyBjb2RlIGNvbWJpbmVzIHRoZSB0d28gc3RlcHMuIEl0IGlzIHNpbXBsaWZpZWQgYnkga25vd2luZyB0aGF0CiAgICAvLyB0aGUgYmFzZSBwYXRoIGNvbnRhaW5zIG5vICIuIiBvciAiLi4iIHNlZ21lbnRzLCBhbmQgdGhlIHJlZmVyZW5jZQogICAgLy8gcGF0aCBjYW4gb25seSBjb250YWluIGxlYWRpbmcgIi4uIiBzZWdtZW50cy4KCiAgICBTdHJpbmcgYmFzZVVyaSA9IGJhc2UuX3VyaTsKICAgIFN0cmluZyByZWZVcmkgPSByZWYuX3VyaTsKICAgIGludCBiYXNlU3RhcnQgPSBiYXNlLl9wYXRoU3RhcnQ7CiAgICBpbnQgYmFzZUVuZCA9IGJhc2UuX3F1ZXJ5U3RhcnQ7CiAgICB3aGlsZSAoYmFzZVVyaS5zdGFydHNXaXRoKCIuLi8iLCBiYXNlU3RhcnQpKSBiYXNlU3RhcnQgKz0gMzsKICAgIGludCByZWZTdGFydCA9IHJlZi5fcGF0aFN0YXJ0OwogICAgaW50IHJlZkVuZCA9IHJlZi5fcXVlcnlTdGFydDsKCiAgICAvLy8gQ291bnQgb2YgbGVhZGluZyAiLi4iIHNlZ21lbnRzIGluIHJlZmVyZW5jZSBwYXRoLgogICAgLy8vIFRoZSBjb3VudCBpcyBkZWNyZW1lbnRlZCB3aGVuIHRoZSBzZWdtZW50IGlzIG1hdGNoZWQgd2l0aCBhCiAgICAvLy8gc2VnbWVudCBvZiB0aGUgYmFzZSBwYXRoLCBhbmQgYm90aCBhcmUgdGhlbiBvbWl0dGVkIGZyb20gdGhlIHJlc3VsdC4KICAgIGludCBiYWNrQ291bnQgPSAwOwoKICAgIC8vLyBDb3VudCAiLi4vIiBzZWdtZW50cyBhbmQgYWR2YW5jZSBgcmVmU3RhcnRgIHRvIGFmdGVyIHRoZSBzZWdtZW50cy4KICAgIHdoaWxlIChyZWZTdGFydCArIDMgPD0gcmVmRW5kICYmIHJlZlVyaS5zdGFydHNXaXRoKCIuLi8iLCByZWZTdGFydCkpIHsKICAgICAgcmVmU3RhcnQgKz0gMzsKICAgICAgYmFja0NvdW50ICs9IDE7CiAgICB9CgogICAgLy8gRXh0cmEgc2xhc2ggaW5zZXJ0ZWQgYmV0d2VlbiBiYXNlIGFuZCByZWZlcmVuY2UgcGF0aCBwYXJ0cyBpZgogICAgLy8gdGhlIGJhc2UgcGF0aCBjb250YWlucyBhbnkgc2xhc2hlcywgb3IgZW1wdHkgc3RyaW5nIGlmIG5vbmUuCiAgICAvLyAoV2UgY291bGQgdXNlIGEgc2xhc2ggZnJvbSB0aGUgYmFzZSBwYXRoIGluIG1vc3QgY2FzZXMsIGJ1dCBub3QgaWYKICAgIC8vIHdlIHJlbW92ZSB0aGUgZW50aXJlIGJhc2UgcGF0aCkuCiAgICBTdHJpbmcgaW5zZXJ0ID0gIiI7CgogICAgLy8vIFJlbW92ZSBzZWdtZW50cyBmcm9tIHRoZSBiYXNlIHBhdGguCiAgICAvLy8gU3RhcnQgd2l0aCB0aGUgc2VnbWVudCB0cmFpbGluZyB0aGUgbGFzdCBzbGFzaCwKICAgIC8vLyB0aGVuIHJlbW92ZSBzZWdtZW50cyBmb3IgZWFjaCBsZWFkaW5nICIuLi8iIHNlZ21lbnQKICAgIC8vLyBmcm9tIHRoZSByZWZlcmVuY2UgcGF0aCwgb3IgYXMgbWFueSBvZiB0aGVtIGFzIGFyZSBhdmFpbGFibGUuCiAgICB3aGlsZSAoYmFzZUVuZCA+IGJhc2VTdGFydCkgewogICAgICBiYXNlRW5kLS07CiAgICAgIGludCBjaGFyID0gYmFzZVVyaS5jb2RlVW5pdEF0KGJhc2VFbmQpOwogICAgICBpZiAoY2hhciA9PSBfU0xBU0gpIHsKICAgICAgICBpbnNlcnQgPSAiLyI7CiAgICAgICAgaWYgKGJhY2tDb3VudCA9PSAwKSBicmVhazsKICAgICAgICBiYWNrQ291bnQtLTsKICAgICAgfQogICAgfQoKICAgIGlmIChiYXNlRW5kID09IGJhc2VTdGFydCAmJiAhYmFzZS5oYXNTY2hlbWUgJiYgIWJhc2UuaGFzQWJzb2x1dGVQYXRoKSB7CiAgICAgIC8vIElmIHRoZSBiYXNlIGlzICpqdXN0KiBhIHJlbGF0aXZlIHBhdGggKG5vIHNjaGVtZSBvciBhdXRob3JpdHkpLAogICAgICAvLyB0aGVuIG1lcmdpbmcgd2l0aCBhbm90aGVyIHJlbGF0aXZlIHBhdGggZG9lc24ndCBmb2xsb3cgdGhlCiAgICAgIC8vIFJGQy0zOTg2IGJlaGF2aW9yLgogICAgICAvLyBEb24ndCBuZWVkIHRvIGNoZWNrIGBiYXNlLmhhc0F1dGhvcml0eWAgc2luY2UgdGhlIGJhc2UgcGF0aCBpcwogICAgICAvLyBub24tZW1wdHkgLSBpZiB0aGVyZSBpcyBhbiBhdXRob3JpdHksIGEgbm9uLWVtcHR5IHBhdGggaXMgYWJzb2x1dGUuCgogICAgICAvLyBXZSByZWFjaGVkIHRoZSBzdGFydCBvZiB0aGUgYmFzZSBwYXRoLCBhbmQgd2FudCB0byBzdGF5IHJlbGF0aXZlLAogICAgICAvLyBzbyBkb24ndCBpbnNlcnQgYSBzbGFzaC4KICAgICAgaW5zZXJ0ID0gIiI7CiAgICAgIC8vIElmIHdlIHJlYWNoZWQgdGhlIHN0YXJ0IG9mIHRoZSBiYXNlIHBhdGggd2l0aCBtb3JlICIuLi8iIGxlZnQgb3ZlcgogICAgICAvLyBpbiB0aGUgcmVmZXJlbmNlIHBhdGgsIGluY2x1ZGUgdGhvc2Ugc2VnbWVudHMgaW4gdGhlIHJlc3VsdC4KICAgICAgcmVmU3RhcnQgLT0gYmFja0NvdW50ICogMzsKICAgIH0KCiAgICB2YXIgZGVsdGEgPSBiYXNlRW5kIC0gcmVmU3RhcnQgKyBpbnNlcnQubGVuZ3RoOwogICAgdmFyIG5ld1VyaSA9ICIke2Jhc2UuX3VyaS5zdWJzdHJpbmcoMCwgYmFzZUVuZCl9JGluc2VydCIKICAgICAgICAiJHtyZWYuX3VyaS5zdWJzdHJpbmcocmVmU3RhcnQpfSI7CgogICAgcmV0dXJuIF9TaW1wbGVVcmkoCiAgICAgICAgbmV3VXJpLAogICAgICAgIGJhc2UuX3NjaGVtZUVuZCwKICAgICAgICBiYXNlLl9ob3N0U3RhcnQsCiAgICAgICAgYmFzZS5fcG9ydFN0YXJ0LAogICAgICAgIGJhc2UuX3BhdGhTdGFydCwKICAgICAgICByZWYuX3F1ZXJ5U3RhcnQgKyBkZWx0YSwKICAgICAgICByZWYuX2ZyYWdtZW50U3RhcnQgKyBkZWx0YSwKICAgICAgICBiYXNlLl9zY2hlbWVDYWNoZSk7CiAgfQoKICBTdHJpbmcgdG9GaWxlUGF0aCh7Ym9vbCB3aW5kb3dzfSkgewogICAgaWYgKF9zY2hlbWVFbmQgPj0gMCAmJiAhX2lzRmlsZSkgewogICAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgJHNjaGVtZSBVUkkiKTsKICAgIH0KICAgIGlmIChfcXVlcnlTdGFydCA8IF91cmkubGVuZ3RoKSB7CiAgICAgIGlmIChfcXVlcnlTdGFydCA8IF9mcmFnbWVudFN0YXJ0KSB7CiAgICAgICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICAgIkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20gYSBVUkkgd2l0aCBhIHF1ZXJ5IGNvbXBvbmVudCIpOwogICAgICB9CiAgICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGggZnJvbSBhIFVSSSB3aXRoIGEgZnJhZ21lbnQgY29tcG9uZW50Iik7CiAgICB9CiAgICB3aW5kb3dzID8/PSBfVXJpLl9pc1dpbmRvd3M7CiAgICByZXR1cm4gd2luZG93cyA/IF9VcmkuX3RvV2luZG93c0ZpbGVQYXRoKHRoaXMpIDogX3RvRmlsZVBhdGgoKTsKICB9CgogIFN0cmluZyBfdG9GaWxlUGF0aCgpIHsKICAgIGlmIChfaG9zdFN0YXJ0IDwgX3BvcnRTdGFydCkgewogICAgICAvLyBIYXMgYXV0aG9yaXR5IGFuZCBub24tZW1wdHkgaG9zdC4KICAgICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICJDYW5ub3QgZXh0cmFjdCBhIG5vbi1XaW5kb3dzIGZpbGUgcGF0aCBmcm9tIGEgZmlsZSBVUkkgIgogICAgICAgICAgIndpdGggYW4gYXV0aG9yaXR5Iik7CiAgICB9CiAgICByZXR1cm4gdGhpcy5wYXRoOwogIH0KCiAgVXJpRGF0YSBnZXQgZGF0YSB7CiAgICBhc3NlcnQoc2NoZW1lICE9ICJkYXRhIik7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGludCBnZXQgaGFzaENvZGUgPT4gX2hhc2hDb2RlQ2FjaGUgPz89IF91cmkuaGFzaENvZGU7CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gb3RoZXIgaXMgVXJpICYmIF91cmkgPT0gb3RoZXIudG9TdHJpbmcoKTsKICB9CgogIFVyaSBfdG9Ob25TaW1wbGUoKSB7CiAgICByZXR1cm4gX1VyaS5faW50ZXJuYWwoCiAgICAgICAgdGhpcy5zY2hlbWUsCiAgICAgICAgdGhpcy51c2VySW5mbywKICAgICAgICB0aGlzLmhhc0F1dGhvcml0eSA/IHRoaXMuaG9zdCA6IG51bGwsCiAgICAgICAgdGhpcy5oYXNQb3J0ID8gdGhpcy5wb3J0IDogbnVsbCwKICAgICAgICB0aGlzLnBhdGgsCiAgICAgICAgdGhpcy5oYXNRdWVyeSA/IHRoaXMucXVlcnkgOiBudWxsLAogICAgICAgIHRoaXMuaGFzRnJhZ21lbnQgPyB0aGlzLmZyYWdtZW50IDogbnVsbCk7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBfdXJpOwp9CgovLy8gU3BlY2lhbCBbX1VyaV0gY3JlYXRlZCBmcm9tIGFuIGV4aXN0aW5nIFtVcmlEYXRhXS4KY2xhc3MgX0RhdGFVcmkgZXh0ZW5kcyBfVXJpIHsKICBmaW5hbCBVcmlEYXRhIF9kYXRhOwoKICBfRGF0YVVyaSh0aGlzLl9kYXRhLCBTdHJpbmcgcGF0aCwgU3RyaW5nIHF1ZXJ5KQogICAgICA6IHN1cGVyLl9pbnRlcm5hbCgiZGF0YSIsIG51bGwsIG51bGwsIG51bGwsIHBhdGgsIHF1ZXJ5LCBudWxsKTsKCiAgVXJpRGF0YSBnZXQgZGF0YSA9PiBfZGF0YTsKfQoKLy8vIENoZWNrcyB3aGV0aGVyIFt0ZXh0XSBzdGFydHMgd2l0aCAiZGF0YToiIGF0IHBvc2l0aW9uIFtzdGFydF0uCi8vLwovLy8gVGhlIHRleHQgbXVzdCBiZSBsb25nIGVub3VnaCB0byBhbGxvdyByZWFkaW5nIGZpdmUgY2hhcmFjdGVycwovLy8gZnJvbSB0aGUgW3N0YXJ0XSBwb3NpdGlvbi4KLy8vCi8vLyBSZXR1cm5zIGFuIGludGVnZXIgdmFsdWUgd2hpY2ggaXMgemVybyBpZiB0ZXh0IHN0YXJ0cyB3aXRoIGFsbC1sb3dlcmNhc2UKLy8vICJkYXRhOiIgYW5kIDB4MjAgaWYgdGhlIHRleHQgc3RhcnRzIHdpdGggImRhdGE6IiB0aGF0IGlzbid0IGFsbCBsb3dlci1jYXNlLgovLy8gQWxsIG90aGVyIHZhbHVlcyBtZWFucyB0aGUgdGV4dCBzdGFydHMgd2l0aCBzb21lIG90aGVyIGNoYXJhY3Rlci4KaW50IF9zdGFydHNXaXRoRGF0YShTdHJpbmcgdGV4dCwgaW50IHN0YXJ0KSB7CiAgLy8gTXVsdGlwbHkgYnkgMyB0byBhdm9pZCBhIG5vbi1jb2xvbiBjaGFyYWN0ZXIgbWFraW5nIGRlbHRhIGJlIDB4MjAuCiAgaW50IGRlbHRhID0gKHRleHQuY29kZVVuaXRBdChzdGFydCArIDQpIF4g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ewogIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCInVXJpLmJhc2UnIGlzIG5vdCBzdXBwb3J0ZWQiKTsKfQoKLy8gX3VyaUJhc2VDbG9zdXJlIGNhbiBiZSBvdmVyd3JpdHRlbiBieSB0aGUgZW1iZWRkZXIgdG8gc3VwcGx5IGEgZGlmZmVyZW50Ci8vIHZhbHVlIGZvciBVcmkuYmFzZS4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpfVXJpQmFzZUNsb3N1cmUgX3VyaUJhc2VDbG9zdXJlID0gX3Vuc3VwcG9ydGVkVXJpQmFzZTsKCkBwYXRjaApjbGFzcyBVcmkgewogIEBwYXRjaAogIHN0YXRpYyBVcmkgZ2V0IGJhc2UgPT4gX3VyaUJhc2VDbG9zdXJlKCk7Cn0KCi8vLyBWTSBpbXBsZW1lbnRhdGlvbiBvZiBVcmkuCkBwYXRjaApjbGFzcyBfVXJpIHsKICBzdGF0aWMgZmluYWwgYm9vbCBfaXNXaW5kb3dzQ2FjaGVkID0gX2lzV2luZG93c1BsYXRmb3JtOwoKICBzdGF0aWMgYm9vbCBnZXQgX2lzV2luZG93c1BsYXRmb3JtIG5hdGl2ZSAiVXJpX2lzV2luZG93c1BsYXRmb3JtIjsKCiAgQHBhdGNoCiAgc3RhdGljIGJvb2wgZ2V0IF9pc1dpbmRvd3MgPT4gX2lzV2luZG93c0NhY2hlZDsKCiAgQHBhdGNoCiAgc3RhdGljIFN0cmluZyBfdXJpRW5jb2RlKExpc3Q8aW50PiBjYW5vbmljYWxUYWJsZSwgU3RyaW5nIHRleHQsCiAgICAgIEVuY29kaW5nIGVuY29kaW5nLCBib29sIHNwYWNlVG9QbHVzKSB7CiAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGUgdGV4dCB3aWxsIGJlIGNoYW5nZWQgYnkgZW5jb2RpbmcuCiAgICBpbnQgaSA9IDA7CiAgICBpZiAoaWRlbnRpY2FsKGVuY29kaW5nLCB1dGY4KSB8fAogICAgICAgIGlkZW50aWNhbChlbmNvZGluZywgbGF0aW4xKSB8fAogICAgICAgIGlkZW50aWNhbChlbmNvZGluZywgYXNjaWkpKSB7CiAgICAgIC8vIEVuY29kaW5nIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgb3JpZ2luYWwgc3RyaW5nLgogICAgICAvLyBGaW5kIGZpcnN0IGNoYXJhY3RlciB0aGF0IG5lZWRzIGVuY29kaW5nLgogICAgICBmb3IgKDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgY2hhciA9IHRleHQuY29kZVVuaXRBdChpKTsKICAgICAgICBpZiAoY2hhciA+PSAxMjggfHwKICAgICAgICAgICAgY2Fub25pY2FsVGFibGVbY2hhciA+PiA0XSAmICgxIDw8IChjaGFyICYgMHgwZikpID09IDApIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGkgPT0gdGV4dC5sZW5ndGgpIHJldHVybiB0ZXh0OwoKICAgIC8vIEVuY29kZSB0aGUgc3RyaW5nIGludG8gYnl0ZXMgdGhlbiBnZW5lcmF0ZSBhbiBBU0NJSSBvbmx5IHN0cmluZwogICAgLy8gYnkgcGVyY2VudCBlbmNvZGluZyBzZWxlY3RlZCBieXRlcy4KICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykgewogICAgICByZXN1bHQud3JpdGVDaGFyQ29kZSh0ZXh0LmNvZGVVbml0QXQoaikpOwogICAgfQoKICAgIC8vIFRPRE8obHJuKTogSXMgdGhlcmUgYSB3YXkgdG8gb25seSBlbmNvZGUgZnJvbSBpbmRleCBpIGFuZCBmb3J3YXJkcy4KICAgIHZhciBieXRlcyA9IGVuY29kaW5nLmVuY29kZSh0ZXh0KTsKICAgIGZvciAoOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgaW50IGJ5dGUgPSBieXRlc1tpXTsKICAgICAgaWYgKGJ5dGUgPCAxMjggJiYKICAgICAgICAgICgoY2Fub25pY2FsVGFibGVbYnl0ZSA+PiA0XSAmICgxIDw8IChieXRlICYgMHgwZikpKSAhPSAwKSkgewogICAgICAgIHJlc3VsdC53cml0ZUNoYXJDb2RlKGJ5dGUpOwogICAgICB9IGVsc2UgaWYgKHNwYWNlVG9QbHVzICYmIGJ5dGUgPT0gX1NQQUNFKSB7CiAgICAgICAgcmVzdWx0LndyaXRlQ2hhckNvZGUoX1BMVVMpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IFN0cmluZyBoZXhEaWdpdHMgPSAnMDEyMzQ1Njc4OUFCQ0RFRic7CiAgICAgICAgcmVzdWx0CiAgICAgICAgICAuLndyaXRlQ2hhckNvZGUoX1BFUkNFTlQpCiAgICAgICAgICAuLndyaXRlQ2hhckNvZGUoaGV4RGlnaXRzLmNvZGVVbml0QXQoYnl0ZSA+PiA0KSkKICAgICAgICAgIC4ud3JpdGVDaGFyQ29kZShoZXhEaWdpdHMuY29kZVVuaXRBdChieXRlICYgMHgwZikpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CiAgfQp9ClIATk48AR4BHwEcPQIBTBcaNwEHDAksAgEeBw07AUUBCTIBCUItPA8lJyY6MyUnG0URCggGJwFHKy4iMAYBSyckGxhHJDIlDzUPJDs+CAYeBAIBHmRhcnQ6Y29yZS1wYXRjaC91cmlfcGF0Y2guZGFydDRvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2lkZW50aWNhbF9wYXRjaC5kYXJ0gdIvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCkBwYXRjaApAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCmJvb2wgaWRlbnRpY2FsKE9iamVjdCBhLCBPYmplY3QgYikgbmF0aXZlICJJZGVudGljYWxfY29tcGFyaXNvbiI7CgpAcGF0Y2gKQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCmludCBpZGVudGl0eUhhc2hDb2RlKE9iamVjdCBvYmplY3QpID0+IG9iamVjdC5faWRlbnRpdHlIYXNoQ29kZTsKDwBOTjwBHgEHJkIBByJBASRkYXJ0OmNvcmUtcGF0Y2gvaWRlbnRpY2FsX3BhdGNoLmRhcnQrb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvcHJpbnQuZGFydIHELy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLy8vIFByaW50cyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0IHRvIHRoZSBjb25zb2xlLgp2b2lkIHByaW50KE9iamVjdCBvYmplY3QpIHsKICBTdHJpbmcgbGluZSA9ICIkb2JqZWN0IjsKICBpZiAocHJpbnRUb1pvbmUgPT0gbnVsbCkgewogICAgcHJpbnRUb0NvbnNvbGUobGluZSk7CiAgfSBlbHNlIHsKICAgIHByaW50VG9ab25lKGxpbmUpOwogIH0KfQoRAE5OPAETAUEcGx0aCxcEAgEUZGFydDpjb3JlL3ByaW50LmRhcnQrb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL19odHRwL2h0dHAuZGFydMABFOwvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0Ll9odHRwOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nCiAgICBzaG93CiAgICAgICAgSGFzaE1hcCwKICAgICAgICBIYXNoU2V0LAogICAgICAgIFF1ZXVlLAogICAgICAgIExpc3RRdWV1ZSwKICAgICAgICBMaW5rZWRMaXN0LAogICAgICAgIExpbmtlZExpc3RFbnRyeSwKICAgICAgICBVbm1vZGlmaWFibGVNYXBWaWV3OwppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CmltcG9ydCAnZGFydDpkZXZlbG9wZXInIGhpZGUgbG9nOwppbXBvcnQgJ2RhcnQ6X2ludGVybmFsJyBzaG93IFNpbmNlLCBIdHRwU3RhdHVzOwppbXBvcnQgJ2RhcnQ6bWF0aCc7CmltcG9ydCAnZGFydDppbyc7CmltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKCnBhcnQgJ2NyeXB0by5kYXJ0JzsKcGFydCAnaHR0cF9kYXRlLmRhcnQnOwpwYXJ0ICdodHRwX2hlYWRlcnMuZGFydCc7CnBhcnQgJ2h0dHBfaW1wbC5kYXJ0JzsKcGFydCAnaHR0cF9wYXJzZXIuZGFydCc7CnBhcnQgJ2h0dHBfc2Vzc2lvbi5kYXJ0JzsKcGFydCAnb3ZlcnJpZGVzLmRhcnQnOwpwYXJ0ICd3ZWJzb2NrZXQuZGFydCc7CnBhcnQgJ3dlYnNvY2tldF9pbXBsLmRhcnQnOwoKLyoqCiAqIEEgc2VydmVyIHRoYXQgZGVsaXZlcnMgY29udGVudCwgc3VjaCBhcyB3ZWIgcGFnZXMsIHVzaW5nIHRoZSBIVFRQIHByb3RvY29sLgogKgogKiBUaGUgSHR0cFNlcnZlciBpcyBhIFtTdHJlYW1dIHRoYXQgcHJvdmlkZXMgW0h0dHBSZXF1ZXN0XSBvYmplY3RzLiBFYWNoCiAqIEh0dHBSZXF1ZXN0IGhhcyBhbiBhc3NvY2lhdGVkIFtIdHRwUmVzcG9uc2VdIG9iamVjdC4KICogVGhlIHNlcnZlciByZXNwb25kcyB0byBhIHJlcXVlc3QgYnkgd3JpdGluZyB0byB0aGF0IEh0dHBSZXNwb25zZSBvYmplY3QuCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gYmluZCBhbiBIdHRwU2VydmVyIHRvIGFuIElQdjYKICogW0ludGVybmV0QWRkcmVzc10gb24gcG9ydCA4MCAodGhlIHN0YW5kYXJkIHBvcnQgZm9yIEhUVFAgc2VydmVycykKICogYW5kIGhvdyB0byBsaXN0ZW4gZm9yIHJlcXVlc3RzLgogKiBQb3J0IDgwIGlzIHRoZSBkZWZhdWx0IEhUVFAgcG9ydC4gSG93ZXZlciwgb24gbW9zdCBzeXN0ZW1zIGFjY2Vzc2luZwogKiB0aGlzIHJlcXVpcmVzIHN1cGVyLXVzZXIgcHJpdmlsZWdlcy4gRm9yIGxvY2FsIHRlc3RpbmcgY29uc2lkZXIKICogdXNpbmcgYSBub24tcmVzZXJ2ZWQgcG9ydCAoMTAyNCBhbmQgYWJvdmUpLgogKgogKiAgICAgaW1wb3J0ICdkYXJ0OmlvJzsKICoKICogICAgIG1haW4oKSB7CiAqICAgICAgIEh0dHBTZXJ2ZXIKICogICAgICAgICAgIC5iaW5kKEludGVybmV0QWRkcmVzcy5hbnlJUHY2LCA4MCkKICogICAgICAgICAgIC50aGVuKChzZXJ2ZXIpIHsKICogICAgICAgICAgICAgc2VydmVyLmxpc3RlbigoSHR0cFJlcXVlc3QgcmVxdWVzdCkgewogKiAgICAgICAgICAgICAgIHJlcXVlc3QucmVzcG9uc2Uud3JpdGUoJ0hlbGxvLCB3b3JsZCEnKTsKICogICAgICAgICAgICAgICByZXF1ZXN0LnJlc3BvbnNlLmNsb3NlKCk7CiAqICAgICAgICAgICAgIH0pOwogKiAgICAgICAgICAgfSk7CiAqICAgICB9CiAqCiAqIEluY29tcGxldGUgcmVxdWVzdHMsIGluIHdoaWNoIGFsbCBvciBwYXJ0IG9mIHRoZSBoZWFkZXIgaXMgbWlzc2luZywgYXJlCiAqIGlnbm9yZWQsIGFuZCBubyBleGNlcHRpb25zIG9yIEh0dHBSZXF1ZXN0IG9iamVjdHMgYXJlIGdlbmVyYXRlZCBmb3IgdGhlbS4KICogTGlrZXdpc2UsIHdoZW4gd3JpdGluZyB0byBhbiBIdHRwUmVzcG9uc2UsIGFueSBbU29ja2V0XSBleGNlcHRpb25zIGFyZQogKiBpZ25vcmVkIGFuZCBhbnkgZnV0dXJlIHdyaXRlcyBhcmUgaWdub3JlZC4KICoKICogVGhlIEh0dHBSZXF1ZXN0IGV4cG9zZXMgdGhlIHJlcXVlc3QgaGVhZGVycyBhbmQgcHJvdmlkZXMgdGhlIHJlcXVlc3QgYm9keSwKICogaWYgaXQgZXhpc3RzLCBhcyBhIFN0cmVhbSBvZiBkYXRhLiBJZiB0aGUgYm9keSBpcyB1bnJlYWQsIGl0IGlzIGRyYWluZWQKICogd2hlbiB0aGUgc2VydmVyIHdyaXRlcyB0byB0aGUgSHR0cFJlc3BvbnNlIG9yIGNsb3NlcyBpdC4KICoKICogIyMgQmluZCB3aXRoIGEgc2VjdXJlIEhUVFBTIGNvbm5lY3Rpb24KICoKICogVXNlIFtiaW5kU2VjdXJlXSB0byBjcmVhdGUgYW4gSFRUUFMgc2VydmVyLgogKgogKiBUaGUgc2VydmVyIHByZXNlbnRzIGEgY2VydGlmaWNhdGUgdG8gdGhlIGNsaWVudC4gVGhlIGNlcnRpZmljYXRlCiAqIGNoYWluIGFuZCB0aGUgcHJpdmF0ZSBrZXkgYXJlIHNldCBpbiB0aGUgW1NlY3VyaXR5Q29udGV4dF0KICogb2JqZWN0IHRoYXQgaXMgcGFzc2VkIHRvIFtiaW5kU2VjdXJlXS4KICoKICogICAgIGltcG9ydCAnZGFydDppbyc7CiAqICAgICBpbXBvcnQgImRhcnQ6aXNvbGF0ZSI7CiAqCiAqICAgICBtYWluKCkgewogKiAgICAgICBTZWN1cml0eUNvbnRleHQgY29udGV4dCA9IG5ldyBTZWN1cml0eUNvbnRleHQoKTsKICogICAgICAgdmFyIGNoYWluID0KICogICAgICAgICAgIFBsYXRmb3JtLnNjcmlwdC5yZXNvbHZlKCdjZXJ0aWZpY2F0ZXMvc2VydmVyX2NoYWluLnBlbScpCiAqICAgICAgICAgICAudG9GaWxlUGF0aCgpOwogKiAgICAgICB2YXIga2V5ID0KICogICAgICAgICAgIFBsYXRmb3JtLnNjcmlwdC5yZXNvbHZlKCdjZXJ0aWZpY2F0ZXMvc2VydmVyX2tleS5wZW0nKQogKiAgICAgICAgICAgLnRvRmlsZVBhdGgoKTsKICogICAgICAgY29udGV4dC51c2VDZXJ0aWZpY2F0ZUNoYWluKGNoYWluKTsKICogICAgICAgY29udGV4dC51c2VQcml2YXRlS2V5KGtleSwgcGFzc3dvcmQ6ICdkYXJ0ZGFydCcpOwogKgogKiAgICAgICBIdHRwU2VydmVyCiAqICAgICAgICAgICAuYmluZFNlY3VyZShJbnRlcm5ldEFkZHJlc3MuYW55SVB2NiwKICogICAgICAgICAgICAgICAgICAgICAgIDQ0MywKICogICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQpCiAqICAgICAgICAgICAudGhlbigoc2VydmVyKSB7CiAqICAgICAgICAgICAgIHNlcnZlci5saXN0ZW4oKEh0dHBSZXF1ZXN0IHJlcXVlc3QpIHsKICogICAgICAgICAgICAgICByZXF1ZXN0LnJlc3BvbnNlLndyaXRlKCdIZWxsbywgd29ybGQhJyk7CiAqICAgICAgICAgICAgICAgcmVxdWVzdC5yZXNwb25zZS5jbG9zZSgpOwogKiAgICAgICAgICAgICB9KTsKICogICAgICAgICAgIH0pOwogKiAgICAgfQogKgogKiAgVGhlIGNlcnRpZmljYXRlcyBhbmQga2V5cyBhcmUgUEVNIGZpbGVzLCB3aGljaCBjYW4gYmUgY3JlYXRlZCBhbmQKICogIG1hbmFnZWQgd2l0aCB0aGUgdG9vbHMgaW4gT3BlblNTTC4KICoKICogIyMgQ29ubmVjdCB0byBhIHNlcnZlciBzb2NrZXQKICoKICogWW91IGNhbiB1c2UgdGhlIFtsaXN0ZW5Pbl0gY29uc3RydWN0b3IgdG8gYXR0YWNoIGFuIEhUVFAgc2VydmVyIHRvCiAqIGEgW1NlcnZlclNvY2tldF0uCiAqCiAqICAgICBpbXBvcnQgJ2RhcnQ6aW8nOwogKgogKiAgICAgbWFpbigpIHsKICogICAgICAgU2VydmVyU29ja2V0LmJpbmQoSW50ZXJuZXRBZGRyZXNzLmFueUlQdjYsIDgwKQogKiAgICAgICAgIC50aGVuKChzZXJ2ZXJTb2NrZXQpIHsKICogICAgICAgICAgIEh0dHBTZXJ2ZXIgaHR0cHNlcnZlciA9IG5ldyBIdHRwU2VydmVyLmxpc3Rlbk9uKHNlcnZlclNvY2tldCk7CiAqICAgICAgICAgICBzZXJ2ZXJTb2NrZXQubGlzdGVuKChTb2NrZXQgc29ja2V0KSB7CiAqICAgICAgICAgICAgIHNvY2tldC53cml0ZSgnSGVsbG8sIGNsaWVudC4nKTsKICogICAgICAgICAgIH0pOwogKiAgICAgICAgIH0pOwogKiAgICAgfQogKgogKiAjIyBPdGhlciByZXNvdXJjZXMKICoKICogKiBIdHRwU2VydmVyIGlzIGEgU3RyZWFtLiBSZWZlciB0byB0aGUgW1N0cmVhbV0gY2xhc3MgZm9yIGluZm9ybWF0aW9uCiAqIGFib3V0IHRoZSBzdHJlYW1pbmcgcXVhbGl0aWVzIG9mIGFuIEh0dHBTZXJ2ZXIuCiAqIFBhdXNpbmcgdGhlIHN1YnNjcmlwdGlvbiBvZiB0aGUgc3RyZWFtLCBwYXVzZXMgYXQgdGhlIE9TIGxldmVsLgogKgogKiAqIFRoZSBbc2hlbGZdKGh0dHBzOi8vcHViLmRhcnRsYW5nLm9yZy9wYWNrYWdlcy9zaGVsZikKICogcGFja2FnZSBvbiBwdWIuZGFydGxhbmcub3JnIGNvbnRhaW5zIGEgc2V0IG9mIGhpZ2gtbGV2ZWwgY2xhc3NlcyB0aGF0LAogKiB0b2dldGhlciB3aXRoIHRoaXMgY2xhc3MsIG1ha2VzIGl0IGVhc3kgdG8gcHJvdmlkZSBjb250ZW50IHRocm91Z2ggSFRUUAogKiBzZXJ2ZXJzLgogKi8KYWJzdHJhY3QgY2xhc3MgSHR0cFNlcnZlciBpbXBsZW1lbnRzIFN0cmVhbTxIdHRwUmVxdWVzdD4gewogIC8qKgogICAqIEdldHMgYW5kIHNldHMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGBTZXJ2ZXJgIGhlYWRlciBmb3IgYWxsIHJlc3BvbnNlcwogICAqIGdlbmVyYXRlZCBieSB0aGlzIFtIdHRwU2VydmVyXS4KICAgKgogICAqIElmIFtzZXJ2ZXJIZWFkZXJdIGlzIGBudWxsYCwgbm8gYFNlcnZlcmAgaGVhZGVyIHdpbGwgYmUgYWRkZWQgdG8gZWFjaAogICAqIHJlc3BvbnNlLgogICAqCiAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgYG51bGxgLgogICAqLwogIFN0cmluZyBzZXJ2ZXJIZWFkZXI7CgogIC8qKgogICAqIERlZmF1bHQgc2V0IG9mIGhlYWRlcnMgYWRkZWQgdG8gYWxsIHJlc3BvbnNlIG9iamVjdHMuCiAgICoKICAgKiBCeSBkZWZhdWx0IHRoZSBmb2xsb3dpbmcgaGVhZGVycyBhcmUgaW4gdGhpcyBzZXQ6CiAgICoKICAgKiAgICAgQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04CiAgICogICAgIFgtRnJhbWUtT3B0aW9uczogU0FNRU9SSUdJTgogICAqICAgICBYLUNvbnRlbnQtVHlwZS1PcHRpb25zOiBub3NuaWZmCiAgICogICAgIFgtWFNTLVByb3RlY3Rpb246IDE7IG1vZGU9YmxvY2sKICAgKgogICAqIElmIHRoZSBgU2VydmVyYCBoZWFkZXIgaXMgYWRkZWQgaGVyZSBhbmQgdGhlIGBzZXJ2ZXJIZWFkZXJgIGlzIHNldCBhcwogICAqIHdlbGwgdGhlbiB0aGUgdmFsdWUgb2YgYHNlcnZlckhlYWRlcmAgdGFrZXMgcHJlY2VkZW5jZS4KICAgKi8KICBIdHRwSGVhZGVycyBnZXQgZGVmYXVsdFJlc3BvbnNlSGVhZGVyczsKCiAgLyoqCiAgICogV2hldGhlciB0aGUgW0h0dHBTZXJ2ZXJdIHNob3VsZCBjb21wcmVzcyB0aGUgY29udGVudCwgaWYgcG9zc2libGUuCiAgICoKICAgKiBUaGUgY29udGVudCBjYW4gb25seSBiZSBjb21wcmVzc2VkIHdoZW4gdGhlIHJlc3BvbnNlIGlzIHVzaW5nCiAgICogY2h1bmtlZCBUcmFuc2Zlci1FbmNvZGluZyBhbmQgdGhlIGluY29taW5nIHJlcXVlc3QgaGFzIGBnemlwYAogICAqIGFzIGFuIGFjY2VwdGVkIGVuY29kaW5nIGluIHRoZSBBY2NlcHQtRW5jb2RpbmcgaGVhZGVyLgogICAqCiAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYCAoY29tcHJlc3Npb24gZGlzYWJsZWQpLgogICAqIFRvIGVuYWJsZSwgc2V0IGBhdXRvQ29tcHJlc3NgIHRvIGB0cnVlYC4KICAgKi8KICBib29sIGF1dG9Db21wcmVzczsKCiAgLyoqCiAgICogR2V0cyBvciBzZXRzIHRoZSB0aW1lb3V0IHVzZWQgZm9yIGlkbGUga2VlcC1hbGl2ZSBjb25uZWN0aW9ucy4gSWYgbm8KICAgKiBmdXJ0aGVyIHJlcXVlc3QgaXMgc2VlbiB3aXRoaW4gW2lkbGVUaW1lb3V0XSBhZnRlciB0aGUgcHJldmlvdXMgcmVxdWVzdCB3YXMKICAgKiBjb21wbGV0ZWQsIHRoZSBjb25uZWN0aW9uIGlzIGRyb3BwZWQuCiAgICoKICAgKiBEZWZhdWx0IGlzIDEyMCBzZWNvbmRzLgogICAqCiAgICogTm90ZSB0aGF0IGl0IG1heSB0YWtlIHVwIHRvIGAyICogaWRsZVRpbWVvdXRgIGJlZm9yZSBhIGlkbGUgY29ubmVjdGlvbiBpcwogICAqIGFib3J0ZWQuCiAgICoKICAgKiBUbyBkaXNhYmxlLCBzZXQgW2lkbGVUaW1lb3V0XSB0byBgbnVsbGAuCiAgICovCiAgRHVyYXRpb24gaWRsZVRpbWVvdXQ7CgogIC8qKgogICAqIFN0YXJ0cyBsaXN0ZW5pbmcgZm9yIEhUVFAgcmVxdWVzdHMgb24gdGhlIHNwZWNpZmllZCBbYWRkcmVzc10gYW5kCiAgICogW3BvcnRdLgogICAqCiAgICogVGhlIFthZGRyZXNzXSBjYW4gZWl0aGVyIGJlIGEgW1N0cmluZ10gb3IgYW4KICAgKiBbSW50ZXJuZXRBZGRyZXNzXS4gSWYgW2FkZHJlc3NdIGlzIGEgW1N0cmluZ10sIFtiaW5kXSB3aWxsCiAgICogcGVyZm9ybSBhIFtJbnRlcm5ldEFkZHJlc3MubG9va3VwXSBhbmQgdXNlIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUKICAgKiBsaXN0LiBUbyBsaXN0ZW4gb24gdGhlIGxvb3BiYWNrIGFkYXB0ZXIsIHdoaWNoIHdpbGwgYWxsb3cgb25seQogICAqIGluY29taW5nIGNvbm5lY3Rpb25zIGZyb20gdGhlIGxvY2FsIGhvc3QsIHVzZSB0aGUgdmFsdWUKICAgKiBbSW50ZXJuZXRBZGRyZXNzLmxvb3BiYWNrSVB2NF0gb3IKICAgKiBbSW50ZXJuZXRBZGRyZXNzLmxvb3BiYWNrSVB2Nl0uIFRvIGFsbG93IGZvciBpbmNvbWluZwogICAqIGNvbm5lY3Rpb24gZnJvbSB0aGUgbmV0d29yayB1c2UgZWl0aGVyIG9uZSBvZiB0aGUgdmFsdWVzCiAgICogW0ludGVybmV0QWRkcmVzcy5hbnlJUHY0XSBvciBbSW50ZXJuZXRBZGRyZXNzLmFueUlQdjZdIHRvCiAgICogYmluZCB0byBhbGwgaW50ZXJmYWNlcyBvciB0aGUgSVAgYWRkcmVzcyBvZiBhIHNwZWNpZmljIGludGVyZmFjZS4KICAgKgogICAqIElmIGFuIElQIHZlcnNpb24gNiAoSVB2NikgYWRkcmVzcyBpcyB1c2VkLCBib3RoIElQIHZlcnNpb24gNgogICAqIChJUHY2KSBhbmQgdmVyc2lvbiA0IChJUHY0KSBjb25uZWN0aW9ucyB3aWxsIGJlIGFjY2VwdGVkLiBUbwogICAqIHJlc3RyaWN0IHRoaXMgdG8gdmVyc2lvbiA2IChJUHY2KSBvbmx5LCB1c2UgW3Y2T25seV0gdG8gc2V0CiAgICogdmVyc2lvbiA2IG9ubHkuIEhvd2V2ZXIsIGlmIHRoZSBhZGRyZXNzIGlzCiAgICogW0ludGVybmV0QWRkcmVzcy5sb29wYmFja0lQdjZdLCBvbmx5IElQIHZlcnNpb24gNiAoSVB2NikgY29ubmVjdGlvbnMKICAgKiB3aWxsIGJlIGFjY2VwdGVkLgogICAqCiAgICogSWYgW3BvcnRdIGhhcyB0aGUgdmFsdWUgWzowOl0gYW4gZXBoZW1lcmFsIHBvcnQgd2lsbCBiZSBjaG9zZW4gYnkKICAgKiB0aGUgc3lzdGVtLiBUaGUgYWN0dWFsIHBvcnQgdXNlZCBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIHRoZQogICAqIFtwb3J0XSBnZXR0ZXIuCiAgICoKICAgKiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgW2JhY2tsb2ddIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxpc3RlbgogICAqIGJhY2tsb2cgZm9yIHRoZSB1bmRlcmx5aW5nIE9TIGxpc3RlbiBzZXR1cC4gSWYgW2JhY2tsb2ddIGhhcyB0aGUKICAgKiB2YWx1ZSBvZiBbOjA6XSAodGhlIGRlZmF1bHQpIGEgcmVhc29uYWJsZSB2YWx1ZSB3aWxsIGJlIGNob3NlbiBieQogICAqIHRoZSBzeXN0ZW0uCiAgICoKICAgKiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgW3NoYXJlZF0gc3BlY2lmaWVzIHdoZXRoZXIgYWRkaXRpb25hbCBIdHRwU2VydmVyCiAgICogb2JqZWN0cyBjYW4gYmluZCB0byB0aGUgc2FtZSBjb21iaW5hdGlvbiBvZiBgYWRkcmVzc2AsIGBwb3J0YCBhbmQgYHY2T25seWAuCiAgICogSWYgYHNoYXJlZGAgaXMgYHRydWVgIGFuZCBtb3JlIGBIdHRwU2VydmVyYHMgZnJvbSB0aGlzIGlzb2xhdGUgb3Igb3RoZXIKICAgKiBpc29sYXRlcyBhcmUgYm91bmQgdG8gdGhlIHBvcnQsIHRoZW4gdGhlIGluY29taW5nIGNvbm5lY3Rpb25zIHdpbGwgYmUKICAgKiBkaXN0cmlidXRlZCBhbW9uZyBhbGwgdGhlIGJvdW5kIGBIdHRwU2VydmVyYHMuIENvbm5lY3Rpb25zIGNhbiBiZQogICAqIGRpc3RyaWJ1dGVkIG92ZXIgbXVsdGlwbGUgaXNvbGF0ZXMgdGhpcyB3YXkuCiAgICovCiAgc3RhdGljIEZ1dHVyZTxIdHRwU2VydmVyPiBiaW5kKGFkZHJlc3MsIGludCBwb3J0LAogICAgICAgICAge2ludCBiYWNrbG9nOiAwLCBib29sIHY2T25seTogZmFsc2UsIGJvb2wgc2hhcmVkOiBmYWxzZX0pID0+CiAgICAgIF9IdHRwU2VydmVyLmJpbmQoYWRkcmVzcywgcG9ydCwgYmFja2xvZywgdjZPbmx5LCBzaGFyZWQpOwoKICAvKioKICAgKiBUaGUgW2FkZHJlc3NdIGNhbiBlaXRoZXIgYmUgYSBbU3RyaW5nXSBvciBhbgogICAqIFtJbnRlcm5ldEFkZHJlc3NdLiBJZiBbYWRkcmVzc10gaXMgYSBbU3RyaW5nXSwgW2JpbmRdIHdpbGwKICAgKiBwZXJmb3JtIGEgW0ludGVybmV0QWRkcmVzcy5sb29rdXBdIGFuZCB1c2UgdGhlIGZpcnN0IHZhbHVlIGluIHRoZQogICAqIGxpc3QuIFRvIGxpc3RlbiBvbiB0aGUgbG9vcGJhY2sgYWRhcHRlciwgd2hpY2ggd2lsbCBhbGxvdyBvbmx5CiAgICogaW5jb21pbmcgY29ubmVjdGlvbnMgZnJvbSB0aGUgbG9jYWwgaG9zdCwgdXNlIHRoZSB2YWx1ZQogICAqIFtJbnRlcm5ldEFkZHJlc3MubG9vcGJhY2tJUHY0XSBvcgogICAqIFtJbnRlcm5ldEFkZHJlc3MubG9vcGJhY2tJUHY2XS4gVG8gYWxsb3cgZm9yIGluY29taW5nCiAgICogY29ubmVjdGlvbiBmcm9tIHRoZSBuZXR3b3JrIHVzZSBlaXRoZXIgb25lIG9mIHRoZSB2YWx1ZXMKICAgKiBbSW50ZXJuZXRBZGRyZXNzLmFueUlQdjRdIG9yIFtJbnRlcm5ldEFkZHJlc3MuYW55SVB2Nl0gdG8KICAgKiBiaW5kIHRvIGFsbCBpbnRlcmZhY2VzIG9yIHRoZSBJUCBhZGRyZXNzIG9mIGEgc3BlY2lmaWMgaW50ZXJmYWNlLgogICAqCiAgICogSWYgYW4gSVAgdmVyc2lvbiA2IChJUHY2KSBhZGRyZXNzIGlzIHVzZWQsIGJvdGggSVAgdmVyc2lvbiA2CiAgICogKElQdjYpIGFuZCB2ZXJzaW9uIDQgKElQdjQpIGNvbm5lY3Rpb25zIHdpbGwgYmUgYWNjZXB0ZWQuIFRvCiAgICogcmVzdHJpY3QgdGhpcyB0byB2ZXJzaW9uIDYgKElQdjYpIG9ubHksIHVzZSBbdjZPbmx5XSB0byBzZXQKICAgKiB2ZXJzaW9uIDYgb25seS4KICAgKgogICAqIElmIFtwb3J0XSBoYXMgdGhlIHZhbHVlIFs6MDpdIGFuIGVwaGVtZXJhbCBwb3J0IHdpbGwgYmUgY2hvc2VuIGJ5CiAgICogdGhlIHN5c3RlbS4gVGhlIGFjdHVhbCBwb3J0IHVzZWQgY2FuIGJlIHJldHJpZXZlZCB1c2luZyB0aGUKICAgKiBbcG9ydF0gZ2V0dGVyLgogICAqCiAgICogVGhlIG9wdGlvbmFsIGFyZ3VtZW50IFtiYWNrbG9nXSBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsaXN0ZW4KICAgKiBiYWNrbG9nIGZvciB0aGUgdW5kZXJseWluZyBPUyBsaXN0ZW4gc2V0dXAuIElmIFtiYWNrbG9nXSBoYXMgdGhlCiAgICogdmFsdWUgb2YgWzowOl0gKHRoZSBkZWZhdWx0KSBhIHJlYXNvbmFibGUgdmFsdWUgd2lsbCBiZSBjaG9zZW4gYnkKICAgKiB0aGUgc3lzdGVtLgogICAqCiAgICogSWYgW3JlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZV0gaXMgdHJ1ZSwgdGhlIHNlcnZlciB3aWxsCiAgICogcmVxdWVzdCBjbGllbnRzIHRvIGF1dGhlbnRpY2F0ZSB3aXRoIGEgY2xpZW50IGNlcnRpZmljYXRlLgogICAqIFRoZSBzZXJ2ZXIgd2lsbCBhZHZlcnRpc2UgdGhlIG5hbWVzIG9mIHRydXN0ZWQgaXNzdWVycyBvZiBjbGllbnQKICAgKiBjZXJ0aWZpY2F0ZXMsIGdldHRpbmcgdGhlbSBmcm9tIGEgW1NlY3VyaXR5Q29udGV4dF0sIHdoZXJlIHRoZXkgaGF2ZSBiZWVuCiAgICogc2V0IHVzaW5nIFtTZWN1cml0eUNvbnRleHQuc2V0Q2xpZW50QXV0aG9yaXRpZXNdLgogICAqCiAgICogVGhlIG9wdGlvbmFsIGFyZ3VtZW50IFtzaGFyZWRdIHNwZWNpZmllcyB3aGV0aGVyIGFkZGl0aW9uYWwgSHR0cFNlcnZlcgogICAqIG9iamVjdHMgY2FuIGJpbmQgdG8gdGhlIHNhbWUgY29tYmluYXRpb24gb2YgYGFkZHJlc3NgLCBgcG9ydGAgYW5kIGB2Nk9ubHlgLgogICAqIElmIGBzaGFyZWRgIGlzIGB0cnVlYCBhbmQgbW9yZSBgSHR0cFNlcnZlcmBzIGZyb20gdGhpcyBpc29sYXRlIG9yIG90aGVyCiAgICogaXNvbGF0ZXMgYXJlIGJvdW5kIHRvIHRoZSBwb3J0LCB0aGVuIHRoZSBpbmNvbWluZyBjb25uZWN0aW9ucyB3aWxsIGJlCiAgICogZGlzdHJpYnV0ZWQgYW1vbmcgYWxsIHRoZSBib3VuZCBgSHR0cFNlcnZlcmBzLiBDb25uZWN0aW9ucyBjYW4gYmUKICAgKiBkaXN0cmlidXRlZCBvdmVyIG11bHRpcGxlIGlzb2xhdGVzIHRoaXMgd2F5LgogICAqLwoKICBzdGF0aWMgRnV0dXJlPEh0dHBTZXJ2ZXI+IGJpbmRTZWN1cmUoCiAgICAgICAgICBhZGRyZXNzLCBpbnQgcG9ydCwgU2VjdXJpdHlDb250ZXh0IGNvbnRleHQsCiAgICAgICAgICB7aW50IGJhY2tsb2c6IDAsCiAgICAgICAgICBib29sIHY2T25seTogZmFsc2UsCiAgICAgICAgICBib29sIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZTogZmFsc2UsCiAgICAgICAgICBib29sIHNoYXJlZDogZmFsc2V9KSA9PgogICAgICBfSHR0cFNlcnZlci5iaW5kU2VjdXJlKGFkZHJlc3MsIHBvcnQsIGNvbnRleHQsIGJhY2tsb2csIHY2T25seSwKICAgICAgICAgIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSwgc2hhcmVkKTsKCiAgLyoqCiAgICogQXR0YWNoZXMgdGhlIEhUVFAgc2VydmVyIHRvIGFuIGV4aXN0aW5nIFtTZXJ2ZXJTb2NrZXRdLiBXaGVuIHRoZQogICAqIFtIdHRwU2VydmVyXSBpcyBjbG9zZWQsIHRoZSBbSHR0cFNlcnZlcl0gd2lsbCBqdXN0IGRldGFjaCBpdHNlbGYsCiAgICogY2xvc2luZyBjdXJyZW50IGNvbm5lY3Rpb25zIGJ1dCBub3QgY2xvc2luZyBbc2VydmVyU29ja2V0XS4KICAgKi8KICBmYWN0b3J5IEh0dHBTZXJ2ZXIubGlzdGVuT24oU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCkgPT4KICAgICAgbmV3IF9IdHRwU2VydmVyLmxpc3Rlbk9uKHNlcnZlclNvY2tldCk7CgogIC8qKgogICAqIFBlcm1hbmVudGx5IHN0b3BzIHRoaXMgW0h0dHBTZXJ2ZXJdIGZyb20gbGlzdGVuaW5nIGZvciBuZXcKICAgKiBjb25uZWN0aW9ucy4gIFRoaXMgY2xvc2VzIHRoZSBbU3RyZWFtXSBvZiBbSHR0cFJlcXVlc3RdcyB3aXRoIGEKICAgKiBkb25lIGV2ZW50LiBUaGUgcmV0dXJuZWQgZnV0dXJlIGNvbXBsZXRlcyB3aGVuIHRoZSBzZXJ2ZXIgaXMKICAgKiBzdG9wcGVkLiBGb3IgYSBzZXJ2ZXIgc3RhcnRlZCB1c2luZyBbYmluZF0gb3IgW2JpbmRTZWN1cmVdIHRoaXMKICAgKiBtZWFucyB0aGF0IHRoZSBwb3J0IGxpc3RlbmVkIG9uIG5vIGxvbmdlciBpbiB1c2UuCiAgICoKICAgKiBJZiBbZm9yY2VdIGlzIGB0cnVlYCwgYWN0aXZlIGNvbm5lY3Rpb25zIHdpbGwgYmUgY2xvc2VkIGltbWVkaWF0ZWx5LgogICAqLwogIEZ1dHVyZSBjbG9zZSh7Ym9vbCBmb3JjZTogZmFsc2V9KTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcG9ydCB0aGF0IHRoZSBzZXJ2ZXIgaXMgbGlzdGVuaW5nIG9uLiBUaGlzIGNhbiBiZQogICAqIHVzZWQgdG8gZ2V0IHRoZSBhY3R1YWwgcG9ydCB1c2VkIHdoZW4gYSB2YWx1ZSBvZiAwIGZvciBbOnBvcnQ6XSBpcwogICAqIHNwZWNpZmllZCBpbiB0aGUgW2JpbmRdIG9yIFtiaW5kU2VjdXJlXSBjYWxsLgogICAqLwogIGludCBnZXQgcG9ydDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgYWRkcmVzcyB0aGF0IHRoZSBzZXJ2ZXIgaXMgbGlzdGVuaW5nIG9uLiBUaGlzIGNhbiBiZQogICAqIHVzZWQgdG8gZ2V0IHRoZSBhY3R1YWwgYWRkcmVzcyB1c2VkLCB3aGVuIHRoZSBhZGRyZXNzIGlzIGZldGNoZWQgYnkKICAgKiBhIGxvb2t1cCBmcm9tIGEgaG9zdG5hbWUuCiAgICovCiAgSW50ZXJuZXRBZGRyZXNzIGdldCBhZGRyZXNzOwoKICAvKioKICAgKiBTZXRzIHRoZSB0aW1lb3V0LCBpbiBzZWNvbmRzLCBmb3Igc2Vzc2lvbnMgb2YgdGhpcyBbSHR0cFNlcnZlcl0uCiAgICogVGhlIGRlZmF1bHQgdGltZW91dCBpcyAyMCBtaW51dGVzLgogICAqLwogIHNldCBzZXNzaW9uVGltZW91dChpbnQgdGltZW91dCk7CgogIC8qKgogICAqIFJldHVybnMgYW4gW0h0dHBDb25uZWN0aW9uc0luZm9dIG9iamVjdCBzdW1tYXJpemluZyB0aGUgbnVtYmVyIG9mCiAgICogY3VycmVudCBjb25uZWN0aW9ucyBoYW5kbGVkIGJ5IHRoZSBzZXJ2ZXIuCiAgICovCiAgSHR0cENvbm5lY3Rpb25zSW5mbyBjb25uZWN0aW9uc0luZm8oKTsKfQoKLyoqCiAqIFN1bW1hcnkgc3RhdGlzdGljcyBhYm91dCBhbiBbSHR0cFNlcnZlcl1zIGN1cnJlbnQgc29ja2V0IGNvbm5lY3Rpb25zLgogKi8KY2xhc3MgSHR0cENvbm5lY3Rpb25zSW5mbyB7CiAgLyoqCiAgICogVG90YWwgbnVtYmVyIG9mIHNvY2tldCBjb25uZWN0aW9ucy4KICAgKi8KICBpbnQgdG90YWwgPSAwOwoKICAvKioKICAgKiBOdW1iZXIgb2YgYWN0aXZlIGNvbm5lY3Rpb25zIHdoZXJlIGFjdHVhbCByZXF1ZXN0L3Jlc3BvbnNlCiAgICogcHJvY2Vzc2luZyBpcyBhY3RpdmUuCiAgICovCiAgaW50IGFjdGl2ZSA9IDA7CgogIC8qKgogICAqIE51bWJlciBvZiBpZGxlIGNvbm5lY3Rpb25zIGhlbGQgYnkgY2xpZW50cyBhcyBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zLgogICAqLwogIGludCBpZGxlID0gMDsKCiAgLyoqCiAgICogTnVtYmVyIG9mIGNvbm5lY3Rpb25zIHdoaWNoIGFyZSBwcmVwYXJpbmcgdG8gY2xvc2UuIE5vdGU6IFRoZXNlCiAgICogY29ubmVjdGlvbnMgYXJlIGFsc28gcGFydCBvZiB0aGUgWzphY3RpdmU6XSBjb3VudCBhcyB0aGV5IG1pZ2h0CiAgICogc3RpbGwgYmUgc2VuZGluZyBkYXRhIHRvIHRoZSBjbGllbnQgYmVmb3JlIGZpbmFsbHkgY2xvc2luZy4KICAgKi8KICBpbnQgY2xvc2luZyA9IDA7Cn0KCi8qKgogKiBIZWFkZXJzIGZvciBIVFRQIHJlcXVlc3RzIGFuZCByZXNwb25zZXMuCiAqCiAqIEluIHNvbWUgc2l0dWF0aW9ucywgaGVhZGVycyBhcmUgaW1tdXRhYmxlOgogKgogKiAqIEh0dHBSZXF1ZXN0IGFuZCBIdHRwQ2xpZW50UmVzcG9uc2UgYWx3YXlzIGhhdmUgaW1tdXRhYmxlIGhlYWRlcnMuCiAqCiAqICogSHR0cFJlc3BvbnNlIGFuZCBIdHRwQ2xpZW50UmVxdWVzdCBoYXZlIGltbXV0YWJsZSBoZWFkZXJzCiAqICAgZnJvbSB0aGUgbW9tZW50IHRoZSBib2R5IGlzIHdyaXR0ZW4gdG8uCiAqCiAqIEluIHRoZXNlIHNpdHVhdGlvbnMsIHRoZSBtdXRhdGluZyBtZXRob2RzIHRocm93IGV4Y2VwdGlvbnMuCiAqCiAqIEZvciBhbGwgb3BlcmF0aW9ucyBvbiBIVFRQIGhlYWRlcnMgdGhlIGhlYWRlciBuYW1lIGlzCiAqIGNhc2UtaW5zZW5zaXRpdmUuCiAqCiAqIFRvIHNldCB0aGUgdmFsdWUgb2YgYSBoZWFkZXIgdXNlIHRoZSBgc2V0KClgIG1ldGhvZDoKICoKICogICAgIHJlcXVlc3QuaGVhZGVycy5zZXQoSHR0cEhlYWRlcnMuY2FjaGVDb250cm9sSGVhZGVyLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAnbWF4LWFnZT0zNjAwLCBtdXN0LXJldmFsaWRhdGUnKTsKICoKICogVG8gcmV0cmlldmUgdGhlIHZhbHVlIG9mIGEgaGVhZGVyIHVzZSB0aGUgYHZhbHVlKClgIG1ldGhvZDoKICoKICogICAgIHByaW50KHJlcXVlc3QuaGVhZGVycy52YWx1ZShIdHRwSGVhZGVycy51c2VyQWdlbnRIZWFkZXIpKTsKICoKICogQW4gSHR0cEhlYWRlcnMgb2JqZWN0IGhvbGRzIGEgbGlzdCBvZiB2YWx1ZXMgZm9yIGVhY2ggbmFtZQogKiBhcyB0aGUgc3RhbmRhcmQgYWxsb3dzLiBJbiBtb3N0IGNhc2VzIGEgbmFtZSBob2xkcyBvbmx5IGEgc2luZ2xlIHZhbHVlLAogKiBUaGUgbW9zdCBjb21tb24gbW9kZSBvZiBvcGVyYXRpb24gaXMgdG8gdXNlIGBzZXQoKWAgZm9yIHNldHRpbmcgYSB2YWx1ZSwKICogYW5kIGB2YWx1ZSgpYCBmb3IgcmV0cmlldmluZyBhIHZhbHVlLgogKi8KYWJzdHJhY3QgY2xhc3MgSHR0cEhlYWRlcnMgewogIHN0YXRpYyBjb25zdCBhY2NlcHRIZWFkZXIgPSAiYWNjZXB0IjsKICBzdGF0aWMgY29uc3QgYWNjZXB0Q2hhcnNldEhlYWRlciA9ICJhY2NlcHQtY2hhcnNldCI7CiAgc3RhdGljIGNvbnN0IGFjY2VwdEVuY29kaW5nSGVhZGVyID0gImFjY2VwdC1lbmNvZGluZyI7CiAgc3RhdGljIGNvbnN0IGFjY2VwdExhbmd1YWdlSGVhZGVyID0gImFjY2VwdC1sYW5ndWFnZSI7CiAgc3RhdGljIGNvbnN0IGFjY2VwdFJhbmdlc0hlYWRlciA9ICJhY2NlcHQtcmFuZ2VzIjsKICBzdGF0aWMgY29uc3QgYWdlSGVhZGVyID0gImFnZSI7CiAgc3RhdGljIGNvbnN0IGFsbG93SGVhZGVyID0gImFsbG93IjsKICBzdGF0aWMgY29uc3QgYXV0aG9yaXphdGlvbkhlYWRlciA9ICJhdXRob3JpemF0aW9uIjsKICBzdGF0aWMgY29uc3QgY2FjaGVDb250cm9sSGVhZGVyID0gImNhY2hlLWNvbnRyb2wiOwogIHN0YXRpYyBjb25zdCBjb25uZWN0aW9uSGVhZGVyID0gImNvbm5lY3Rpb24iOwogIHN0YXRpYyBjb25zdCBjb250ZW50RW5jb2RpbmdIZWFkZXIgPSAiY29udGVudC1lbmNvZGluZyI7CiAgc3RhdGljIGNvbnN0IGNvbnRlbnRMYW5ndWFnZUhlYWRlciA9ICJjb250ZW50LWxhbmd1YWdlIjsKICBzdGF0aWMgY29uc3QgY29udGVudExlbmd0aEhlYWRlciA9ICJjb250ZW50LWxlbmd0aCI7CiAgc3RhdGljIGNvbnN0IGNvbnRlbnRMb2NhdGlvbkhlYWRlciA9ICJjb250ZW50LWxvY2F0aW9uIjsKICBzdGF0aWMgY29uc3QgY29udGVudE1ENUhlYWRlciA9ICJjb250ZW50LW1kNSI7CiAgc3RhdGljIGNvbnN0IGNvbnRlbnRSYW5nZUhlYWRlciA9ICJjb250ZW50LXJhbmdlIjsKICBzdGF0aWMgY29uc3QgY29udGVudFR5cGVIZWFkZXIgPSAiY29udGVudC10eXBlIjsKICBzdGF0aWMgY29uc3QgZGF0ZUhlYWRlciA9ICJkYXRlIjsKICBzdGF0aWMgY29uc3QgZXRhZ0hlYWRlciA9ICJldGFnIjsKICBzdGF0aWMgY29uc3QgZXhwZWN0SGVhZGVyID0gImV4cGVjdCI7CiAgc3RhdGljIGNvbnN0IGV4cGlyZXNIZWFkZXIgPSAiZXhwaXJlcyI7CiAgc3RhdGljIGNvbnN0IGZyb21IZWFkZXIgPSAiZnJvbSI7CiAgc3RhdGljIGNvbnN0IGhvc3RIZWFkZXIgPSAiaG9zdCI7CiAgc3RhdGljIGNvbnN0IGlmTWF0Y2hIZWFkZXIgPSAiaWYtbWF0Y2giOwogIHN0YXRpYyBjb25zdCBpZk1vZGlmaWVkU2luY2VIZWFkZXIgPSAiaWYtbW9kaWZpZWQtc2luY2UiOwogIHN0YXRpYyBjb25zdCBpZk5vbmVNYXRjaEhlYWRlciA9ICJpZi1ub25lLW1hdGNoIjsKICBzdGF0aWMgY29uc3QgaWZSYW5nZUhlYWRlciA9ICJpZi1yYW5nZSI7CiAgc3RhdGljIGNvbnN0IGlmVW5tb2RpZmllZFNpbmNlSGVhZGVyID0gImlmLXVubW9kaWZpZWQtc2luY2UiOwogIHN0YXRpYyBjb25zdCBsYXN0TW9kaWZpZWRIZWFkZXIgPSAibGFzdC1tb2RpZmllZCI7CiAgc3RhdGljIGNvbnN0IGxvY2F0aW9uSGVhZGVyID0gImxvY2F0aW9uIjsKICBzdGF0aWMgY29uc3QgbWF4Rm9yd2FyZHNIZWFkZXIgPSAibWF4LWZvcndhcmRzIjsKICBzdGF0aWMgY29uc3QgcHJhZ21hSGVhZGVyID0gInByYWdtYSI7CiAgc3RhdGljIGNvbnN0IHByb3h5QXV0aGVudGljYXRlSGVhZGVyID0gInByb3h5LWF1dGhlbnRpY2F0ZSI7CiAgc3RhdGljIGNvbnN0IHByb3h5QXV0aG9yaXphdGlvbkhlYWRlciA9ICJwcm94eS1hdXRob3JpemF0aW9uIjsKICBzdGF0aWMgY29uc3QgcmFuZ2VIZWFkZXIgPSAicmFuZ2UiOwogIHN0YXRpYyBjb25zdCByZWZlcmVySGVhZGVyID0gInJlZmVyZXIiOwogIHN0YXRpYyBjb25zdCByZXRyeUFmdGVySGVhZGVyID0gInJldHJ5LWFmdGVyIjsKICBzdGF0aWMgY29uc3Qgc2VydmVySGVhZGVyID0gInNlcnZlciI7CiAgc3RhdGljIGNvbnN0IHRlSGVhZGVyID0gInRlIjsKICBzdGF0aWMgY29uc3QgdHJhaWxlckhlYWRlciA9ICJ0cmFpbGVyIjsKICBzdGF0aWMgY29uc3QgdHJhbnNmZXJFbmNvZGluZ0hlYWRlciA9ICJ0cmFuc2Zlci1lbmNvZGluZyI7CiAgc3RhdGljIGNvbnN0IHVwZ3JhZGVIZWFkZXIgPSAidXBncmFkZSI7CiAgc3RhdGljIGNvbnN0IHVzZXJBZ2VudEhlYWRlciA9ICJ1c2VyLWFnZW50IjsKICBzdGF0aWMgY29uc3QgdmFyeUhlYWRlciA9ICJ2YXJ5IjsKICBzdGF0aWMgY29uc3QgdmlhSGVhZGVyID0gInZpYSI7CiAgc3RhdGljIGNvbnN0IHdhcm5pbmdIZWFkZXIgPSAid2FybmluZyI7CiAgc3RhdGljIGNvbnN0IHd3d0F1dGhlbnRpY2F0ZUhlYWRlciA9ICJ3d3ctYXV0aGVudGljYXRlIjsKCiAgQERlcHJlY2F0ZWQoIlVzZSBhY2NlcHRIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IEFDQ0VQVCA9IGFjY2VwdEhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGFjY2VwdENoYXJzZXRIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IEFDQ0VQVF9DSEFSU0VUID0gYWNjZXB0Q2hhcnNldEhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGFjY2VwdEVuY29kaW5nSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBBQ0NFUFRfRU5DT0RJTkcgPSBhY2NlcHRFbmNvZGluZ0hlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGFjY2VwdExhbmd1YWdlSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBBQ0NFUFRfTEFOR1VBR0UgPSBhY2NlcHRMYW5ndWFnZUhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGFjY2VwdFJhbmdlc0hlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgQUNDRVBUX1JBTkdFUyA9IGFjY2VwdFJhbmdlc0hlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGFnZUhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgQUdFID0gYWdlSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgYWxsb3dIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IEFMTE9XID0gYWxsb3dIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBhdXRob3JpemF0aW9uSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBBVVRIT1JJWkFUSU9OID0gYXV0aG9yaXphdGlvbkhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGNhY2hlQ29udHJvbEhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgQ0FDSEVfQ09OVFJPTCA9IGNhY2hlQ29udHJvbEhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGNvbm5lY3Rpb25IZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IENPTk5FQ1RJT04gPSBjb25uZWN0aW9uSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgY29udGVudEVuY29kaW5nSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBDT05URU5UX0VOQ09ESU5HID0gY29udGVudEVuY29kaW5nSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgY29udGVudExhbmd1YWdlSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBDT05URU5UX0xBTkdVQUdFID0gY29udGVudExhbmd1YWdlSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgY29udGVudExlbmd0aEhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgQ09OVEVOVF9MRU5HVEggPSBjb250ZW50TGVuZ3RoSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgY29udGVudExvY2F0aW9uSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBDT05URU5UX0xPQ0FUSU9OID0gY29udGVudExvY2F0aW9uSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgY29udGVudE1ENUhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgQ09OVEVOVF9NRDUgPSBjb250ZW50TUQ1SGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgY29udGVudFJhbmdlSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBDT05URU5UX1JBTkdFID0gY29udGVudFJhbmdlSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgY29udGVudFR5cGVIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IENPTlRFTlRfVFlQRSA9IGNvbnRlbnRUeXBlSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgZGF0ZUhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgREFURSA9IGRhdGVIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBldGFnSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBFVEFHID0gZXRhZ0hlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGV4cGVjdEhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgRVhQRUNUID0gZXhwZWN0SGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgZXhwaXJlc0hlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgRVhQSVJFUyA9IGV4cGlyZXNIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBmcm9tSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBGUk9NID0gZnJvbUhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGhvc3RIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IEhPU1QgPSBob3N0SGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgaWZNYXRjaEhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgSUZfTUFUQ0ggPSBpZk1hdGNoSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgaWZNb2RpZmllZFNpbmNlSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBJRl9NT0RJRklFRF9TSU5DRSA9IGlmTW9kaWZpZWRTaW5jZUhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGlmTm9uZU1hdGNoSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBJRl9OT05FX01BVENIID0gaWZOb25lTWF0Y2hIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBpZlJhbmdlSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBJRl9SQU5HRSA9IGlmUmFuZ2VIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBpZlVubW9kaWZpZWRTaW5jZUhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgSUZfVU5NT0RJRklFRF9TSU5DRSA9IGlmVW5tb2RpZmllZFNpbmNlSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgbGFzdE1vZGlmaWVkSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBMQVNUX01PRElGSUVEID0gbGFzdE1vZGlmaWVkSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgbG9jYXRpb25IZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IExPQ0FUSU9OID0gbG9jYXRpb25IZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBtYXhGb3J3YXJkc0hlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgTUFYX0ZPUldBUkRTID0gbWF4Rm9yd2FyZHNIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBwcmFnbWFIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFBSQUdNQSA9IHByYWdtYUhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIHByb3h5QXV0aGVudGljYXRlSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQUk9YWV9BVVRIRU5USUNBVEUgPSBwcm94eUF1dGhlbnRpY2F0ZUhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIHByb3h5QXV0aG9yaXphdGlvbkhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUFJPWFlfQVVUSE9SSVpBVElPTiA9IHByb3h5QXV0aG9yaXphdGlvbkhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIHJhbmdlSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBSQU5HRSA9IHJhbmdlSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgcmVmZXJlckhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUkVGRVJFUiA9IHJlZmVyZXJIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSByZXRyeUFmdGVySGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBSRVRSWV9BRlRFUiA9IHJldHJ5QWZ0ZXJIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBzZXJ2ZXJIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFNFUlZFUiA9IHNlcnZlckhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIHRlSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBURSA9IHRlSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgdHJhaWxlckhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgVFJBSUxFUiA9IHRyYWlsZXJIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSB0cmFuc2ZlckVuY29kaW5nSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBUUkFOU0ZFUl9FTkNPRElORyA9IHRyYW5zZmVyRW5jb2RpbmdIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSB1cGdyYWRlSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBVUEdSQURFID0gdXBncmFkZUhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIHVzZXJBZ2VudEhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgVVNFUl9BR0VOVCA9IHVzZXJBZ2VudEhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIHZhcnlIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFZBUlkgPSB2YXJ5SGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgdmlhSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBWSUEgPSB2aWFIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSB3YXJuaW5nSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBXQVJOSU5HID0gd2FybmluZ0hlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIHd3d0F1dGhlbnRpY2F0ZUhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgV1dXX0FVVEhFTlRJQ0FURSA9IHd3d0F1dGhlbnRpY2F0ZUhlYWRlcjsKCiAgLy8gQ29va2llIGhlYWRlcnMgZnJvbSBSRkMgNjI2NS4KICBzdGF0aWMgY29uc3QgY29va2llSGVhZGVyID0gImNvb2tpZSI7CiAgc3RhdGljIGNvbnN0IHNldENvb2tpZUhlYWRlciA9ICJzZXQtY29va2llIjsKCiAgQERlcHJlY2F0ZWQoIlVzZSBjb29raWVIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IENPT0tJRSA9IGNvb2tpZUhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIHNldENvb2tpZUhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgU0VUX0NPT0tJRSA9IHNldENvb2tpZUhlYWRlcjsKCiAgc3RhdGljIGNvbnN0IGdlbmVyYWxIZWFkZXJzID0gY29uc3QgWwogICAgY2FjaGVDb250cm9sSGVhZGVyLAogICAgY29ubmVjdGlvbkhlYWRlciwKICAgIGRhdGVIZWFkZXIsCiAgICBwcmFnbWFIZWFkZXIsCiAgICB0cmFpbGVySGVhZGVyLAogICAgdHJhbnNmZXJFbmNvZGluZ0hlYWRlciwKICAgIHVwZ3JhZGVIZWFkZXIsCiAgICB2aWFIZWFkZXIsCiAgICB3YXJuaW5nSGVhZGVyCiAgXTsKCiAgQERlcHJlY2F0ZWQoIlVzZSBnZW5lcmFsSGVhZGVycyBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgR0VORVJBTF9IRUFERVJTID0gZ2VuZXJhbEhlYWRlcnM7CgogIHN0YXRpYyBjb25zdCBlbnRpdHlIZWFkZXJzID0gY29uc3QgWwogICAgYWxsb3dIZWFkZXIsCiAgICBjb250ZW50RW5jb2RpbmdIZWFkZXIsCiAgICBjb250ZW50TGFuZ3VhZ2VIZWFkZXIsCiAgICBjb250ZW50TGVuZ3RoSGVhZGVyLAogICAgY29udGVudExvY2F0aW9uSGVhZGVyLAogICAgY29udGVudE1ENUhlYWRlciwKICAgIGNvbnRlbnRSYW5nZUhlYWRlciwKICAgIGNvbnRlbnRUeXBlSGVhZGVyLAogICAgZXhwaXJlc0hlYWRlciwKICAgIGxhc3RNb2RpZmllZEhlYWRlcgogIF07CgogIEBEZXByZWNhdGVkKCJVc2UgZW50aXR5SGVhZGVycyBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgRU5USVRZX0hFQURFUlMgPSBlbnRpdHlIZWFkZXJzOwoKICBzdGF0aWMgY29uc3QgcmVzcG9uc2VIZWFkZXJzID0gY29uc3QgWwogICAgYWNjZXB0UmFuZ2VzSGVhZGVyLAogICAgYWdlSGVhZGVyLAogICAgZXRhZ0hlYWRlciwKICAgIGxvY2F0aW9uSGVhZGVyLAogICAgcHJveHlBdXRoZW50aWNhdGVIZWFkZXIsCiAgICByZXRyeUFmdGVySGVhZGVyLAogICAgc2VydmVySGVhZGVyLAogICAgdmFyeUhlYWRlciwKICAgIHd3d0F1dGhlbnRpY2F0ZUhlYWRlcgogIF07CgogIEBEZXByZWNhdGVkKCJVc2UgcmVzcG9uc2VIZWFkZXJzIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBSRVNQT05TRV9IRUFERVJTID0gcmVzcG9uc2VIZWFkZXJzOwoKICBzdGF0aWMgY29uc3QgcmVxdWVzdEhlYWRlcnMgPSBjb25zdCBbCiAgICBhY2NlcHRIZWFkZXIsCiAgICBhY2NlcHRDaGFyc2V0SGVhZGVyLAogICAgYWNjZXB0RW5jb2RpbmdIZWFkZXIsCiAgICBhY2NlcHRMYW5ndWFnZUhlYWRlciwKICAgIGF1dGhvcml6YXRpb25IZWFkZXIsCiAgICBleHBlY3RIZWFkZXIsCiAgICBmcm9tSGVhZGVyLAogICAgaG9zdEhlYWRlciwKICAgIGlmTWF0Y2hIZWFkZXIsCiAgICBpZk1vZGlmaWVkU2luY2VIZWFkZXIsCiAgICBpZk5vbmVNYXRjaEhlYWRlciwKICAgIGlmUmFuZ2VIZWFkZXIsCiAgICBpZlVubW9kaWZpZWRTaW5jZUhlYWRlciwKICAgIG1heEZvcndhcmRzSGVhZGVyLAogICAgcHJveHlBdXRob3JpemF0aW9uSGVhZGVyLAogICAgcmFuZ2VIZWFkZXIsCiAgICByZWZlcmVySGVhZGVyLAogICAgdGVIZWFkZXIsCiAgICB1c2VyQWdlbnRIZWFkZXIKICBdOwoKICBARGVwcmVjYXRlZCgiVXNlIHJlcXVlc3RIZWFkZXJzIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBSRVFVRVNUX0hFQURFUlMgPSByZXF1ZXN0SGVhZGVyczsKCiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgZGF0ZS4gVGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgd2lsbAogICAqIHJlZmxlY3QgdGhlICdkYXRlJyBoZWFkZXIuCiAgICovCiAgRGF0ZVRpbWUgZGF0ZTsKCiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgZXhwaXJ5IGRhdGUuIFRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IHdpbGwKICAgKiByZWZsZWN0IHRoZSAnZXhwaXJlcycgaGVhZGVyLgogICAqLwogIERhdGVUaW1lIGV4cGlyZXM7CgogIC8qKgogICAqIEdldHMgYW5kIHNldHMgdGhlICJpZi1tb2RpZmllZC1zaW5jZSIgZGF0ZS4gVGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgd2lsbAogICAqIHJlZmxlY3QgdGhlICJpZi1tb2RpZmllZC1zaW5jZSIgaGVhZGVyLgogICAqLwogIERhdGVUaW1lIGlmTW9kaWZpZWRTaW5jZTsKCiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgaG9zdCBwYXJ0IG9mIHRoZSAnaG9zdCcgaGVhZGVyIGZvciB0aGUKICAgKiBjb25uZWN0aW9uLgogICAqLwogIFN0cmluZyBob3N0OwoKICAvKioKICAgKiBHZXRzIGFuZCBzZXRzIHRoZSBwb3J0IHBhcnQgb2YgdGhlICdob3N0JyBoZWFkZXIgZm9yIHRoZQogICAqIGNvbm5lY3Rpb24uCiAgICovCiAgaW50IHBvcnQ7CgogIC8qKgogICAqIEdldHMgYW5kIHNldHMgdGhlIGNvbnRlbnQgdHlwZS4gTm90ZSB0aGF0IHRoZSBjb250ZW50IHR5cGUgaW4gdGhlCiAgICogaGVhZGVyIHdpbGwgb25seSBiZSB1cGRhdGVkIGlmIHRoaXMgZmllbGQgaXMgc2V0CiAgICogZGlyZWN0bHkuIE11dGF0aW5nIHRoZSByZXR1cm5lZCBjdXJyZW50IHZhbHVlIHdpbGwgaGF2ZSBubwogICAqIGVmZmVjdC4KICAgKi8KICBDb250ZW50VHlwZSBjb250ZW50VHlwZTsKCiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgY29udGVudCBsZW5ndGggaGVhZGVyIHZhbHVlLgogICAqLwogIGludCBjb250ZW50TGVuZ3RoOwoKICAvKioKICAgKiBHZXRzIGFuZCBzZXRzIHRoZSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gaGVhZGVyIHZhbHVlLgogICAqLwogIGJvb2wgcGVyc2lzdGVudENvbm5lY3Rpb247CgogIC8qKgogICAqIEdldHMgYW5kIHNldHMgdGhlIGNodW5rZWQgdHJhbnNmZXIgZW5jb2RpbmcgaGVhZGVyIHZhbHVlLgogICAqLwogIGJvb2wgY2h1bmtlZFRyYW5zZmVyRW5jb2Rpbmc7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgdmFsdWVzIGZvciB0aGUgaGVhZGVyIG5hbWVkIFtuYW1lXS4gSWYgdGhlcmUKICAgKiBpcyBubyBoZWFkZXIgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZSwgWzpudWxsOl0gd2lsbCBiZSByZXR1cm5lZC4KICAgKi8KICBMaXN0PFN0cmluZz4gb3BlcmF0b3IgW10oU3RyaW5nIG5hbWUpOwoKICAvKioKICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHRoZSB2YWx1ZSBmb3IgYSBzaW5nbGUgdmFsdWVkIGhlYWRlci4gSWYKICAgKiB0aGVyZSBpcyBubyBoZWFkZXIgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZSwgWzpudWxsOl0gd2lsbCBiZQogICAqIHJldHVybmVkLiBJZiB0aGUgaGVhZGVyIGhhcyBtb3JlIHRoYW4gb25lIHZhbHVlIGFuIGV4Y2VwdGlvbiBpcwogICAqIHRocm93bi4KICAgKi8KICBTdHJpbmcgdmFsdWUoU3RyaW5nIG5hbWUpOwoKICAvKioKICAgKiBBZGRzIGEgaGVhZGVyIHZhbHVlLiBUaGUgaGVhZGVyIG5hbWVkIFtuYW1lXSB3aWxsIGhhdmUgdGhlIHZhbHVlCiAgICogW3ZhbHVlXSBhZGRlZCB0byBpdHMgbGlzdCBvZiB2YWx1ZXMuIFNvbWUgaGVhZGVycyBhcmUgc2luZ2xlCiAgICogdmFsdWVkLCBhbmQgZm9yIHRoZXNlIGFkZGluZyBhIHZhbHVlIHdpbGwgcmVwbGFjZSB0aGUgcHJldmlvdXMKICAgKiB2YWx1ZS4gSWYgdGhlIHZhbHVlIGlzIG9mIHR5cGUgRGF0ZVRpbWUgYSBIVFRQIGRhdGUgZm9ybWF0IHdpbGwgYmUKICAgKiBhcHBsaWVkLiBJZiB0aGUgdmFsdWUgaXMgYSBbOkxpc3Q6XSBlYWNoIGVsZW1lbnQgb2YgdGhlIGxpc3Qgd2lsbAogICAqIGJlIGFkZGVkIHNlcGFyYXRlbHkuIEZvciBhbGwgb3RoZXIgdHlwZXMgdGhlIGRlZmF1bHQgWzp0b1N0cmluZzpdCiAgICogbWV0aG9kIHdpbGwgYmUgdXNlZC4KICAgKi8KICB2b2lkIGFkZChTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKTsKCiAgLyoqCiAgICogU2V0cyBhIGhlYWRlci4gVGhlIGhlYWRlciBuYW1lZCBbbmFtZV0gd2lsbCBoYXZlIGFsbCBpdHMgdmFsdWVzCiAgICogY2xlYXJlZCBiZWZvcmUgdGhlIHZhbHVlIFt2YWx1ZV0gaXMgYWRkZWQgYXMgaXRzIHZhbHVlLgogICAqLwogIHZvaWQgc2V0KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpOwoKICAvKioKICAgKiBSZW1vdmVzIGEgc3BlY2lmaWMgdmFsdWUgZm9yIGEgaGVhZGVyIG5hbWUuIFNvbWUgaGVhZGVycyBoYXZlCiAgICogc3lzdGVtIHN1cHBsaWVkIHZhbHVlcyBhbmQgZm9yIHRoZXNlIHRoZSBzeXN0ZW0gc3VwcGxpZWQgdmFsdWVzCiAgICogd2lsbCBzdGlsbCBiZSBhZGRlZCB0byB0aGUgY29sbGVjdGlvbiBvZiB2YWx1ZXMgZm9yIHRoZSBoZWFkZXIuCiAgICovCiAgdm9pZCByZW1vdmUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSk7CgogIC8qKgogICAqIFJlbW92ZXMgYWxsIHZhbHVlcyBmb3IgdGhlIHNwZWNpZmllZCBoZWFkZXIgbmFtZS4gU29tZSBoZWFkZXJzCiAgICogaGF2ZSBzeXN0ZW0gc3VwcGxpZWQgdmFsdWVzIGFuZCBmb3IgdGhlc2UgdGhlIHN5c3RlbSBzdXBwbGllZAogICAqIHZhbHVlcyB3aWxsIHN0aWxsIGJlIGFkZGVkIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHZhbHVlcyBmb3IgdGhlCiAgICogaGVhZGVyLgogICAqLwogIHZvaWQgcmVtb3ZlQWxsKFN0cmluZyBuYW1lKTsKCiAgLyoqCiAgICogRW51bWVyYXRlcyB0aGUgaGVhZGVycywgYXBwbHlpbmcgdGhlIGZ1bmN0aW9uIFtmXSB0byBlYWNoCiAgICogaGVhZGVyLiBUaGUgaGVhZGVyIG5hbWUgcGFzc2VkIGluIFs6bmFtZTpdIHdpbGwgYmUgYWxsIGxvd2VyCiAgICogY2FzZS4KICAgKi8KICB2b2lkIGZvckVhY2godm9pZCBmKFN0cmluZyBuYW1lLCBMaXN0PFN0cmluZz4gdmFsdWVzKSk7CgogIC8qKgogICAqIERpc2FibGVzIGZvbGRpbmcgZm9yIHRoZSBoZWFkZXIgbmFtZWQgW25hbWVdIHdoZW4gc2VuZGluZyB0aGUgSFRUUAogICAqIGhlYWRlci4gQnkgZGVmYXVsdCwgbXVsdGlwbGUgaGVhZGVyIHZhbHVlcyBhcmUgZm9sZGVkIGludG8gYQogICAqIHNpbmdsZSBoZWFkZXIgbGluZSBieSBzZXBhcmF0aW5nIHRoZSB2YWx1ZXMgd2l0aCBjb21tYXMuIFRoZQogICAqICdzZXQtY29va2llJyBoZWFkZXIgaGFzIGZvbGRpbmcgZGlzYWJsZWQgYnkgZGVmYXVsdC4KICAgKi8KICB2b2lkIG5vRm9sZGluZyhTdHJpbmcgbmFtZSk7CgogIC8qKgogICAqIFJlbW92ZSBhbGwgaGVhZGVycy4gU29tZSBoZWFkZXJzIGhhdmUgc3lzdGVtIHN1cHBsaWVkIHZhbHVlcyBhbmQKICAgKiBmb3IgdGhlc2UgdGhlIHN5c3RlbSBzdXBwbGllZCB2YWx1ZXMgd2lsbCBzdGlsbCBiZSBhZGRlZCB0byB0aGUKICAgKiBjb2xsZWN0aW9uIG9mIHZhbHVlcyBmb3IgdGhlIGhlYWRlci4KICAgKi8KICB2b2lkIGNsZWFyKCk7Cn0KCi8qKgogKiBSZXByZXNlbnRhdGlvbiBvZiBhIGhlYWRlciB2YWx1ZSBpbiB0aGUgZm9ybToKICoKICogICBbOnZhbHVlOyBwYXJhbWV0ZXIxPXZhbHVlMTsgcGFyYW1ldGVyMj12YWx1ZTI6XQogKgogKiBbSGVhZGVyVmFsdWVdIGNhbiBiZSB1c2VkIHRvIGNvbnZlbmllbnRseSBidWlsZCBhbmQgcGFyc2UgaGVhZGVyCiAqIHZhbHVlcyBvbiB0aGlzIGZvcm0uCiAqCiAqIFRvIGJ1aWxkIGFuIFs6YWNjZXB0czpdIGhlYWRlciB3aXRoIHRoZSB2YWx1ZQogKgogKiAgICAgdGV4dC9wbGFpbjsgcT0wLjMsIHRleHQvaHRtbAogKgogKiB1c2UgY29kZSBsaWtlIHRoaXM6CiAqCiAqICAgICBIdHRwQ2xpZW50UmVxdWVzdCByZXF1ZXN0ID0gLi4uOwogKiAgICAgdmFyIHYgPSBuZXcgSGVhZGVyVmFsdWUoInRleHQvcGxhaW4iLCB7InEiOiAiMC4zIn0pOwogKiAgICAgcmVxdWVzdC5oZWFkZXJzLmFkZChIdHRwSGVhZGVycy5hY2NlcHRIZWFkZXIsIHYpOwogKiAgICAgcmVxdWVzdC5oZWFkZXJzLmFkZChIdHRwSGVhZGVycy5hY2NlcHRIZWFkZXIsICJ0ZXh0L2h0bWwiKTsKICoKICogVG8gcGFyc2UgdGhlIGhlYWRlciB2YWx1ZXMgdXNlIHRoZSBbOnBhcnNlOl0gc3RhdGljIG1ldGhvZC4KICoKICogICAgIEh0dHBSZXF1ZXN0IHJlcXVlc3QgPSAuLi47CiAqICAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gcmVxdWVzdC5oZWFkZXJzW0h0dHBIZWFkZXJzLmFjY2VwdEhlYWRlcl07CiAqICAgICB2YWx1ZXMuZm9yRWFjaCgodmFsdWUpIHsKICogICAgICAgSGVhZGVyVmFsdWUgdiA9IEhlYWRlclZhbHVlLnBhcnNlKHZhbHVlKTsKICogICAgICAgLy8gVXNlIHYudmFsdWUgYW5kIHYucGFyYW1ldGVycwogKiAgICAgfSk7CiAqCiAqIEFuIGluc3RhbmNlIG9mIFtIZWFkZXJWYWx1ZV0gaXMgaW1tdXRhYmxlLgogKi8KYWJzdHJhY3QgY2xhc3MgSGVhZGVyVmFsdWUgewogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgaGVhZGVyIHZhbHVlIG9iamVjdCBzZXR0aW5nIHRoZSB2YWx1ZSBhbmQgcGFyYW1ldGVycy4KICAgKi8KICBmYWN0b3J5IEhlYWRlclZhbHVlKFtTdHJpbmcgdmFsdWUgPSAiIiwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzXSkgewogICAgcmV0dXJuIG5ldyBfSGVhZGVyVmFsdWUodmFsdWUsIHBhcmFtZXRlcnMpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBoZWFkZXIgdmFsdWUgb2JqZWN0IGZyb20gcGFyc2luZyBhIGhlYWRlciB2YWx1ZQogICAqIHN0cmluZyB3aXRoIGJvdGggdmFsdWUgYW5kIG9wdGlvbmFsIHBhcmFtZXRlcnMuCiAgICovCiAgc3RhdGljIEhlYWRlclZhbHVlIHBhcnNlKFN0cmluZyB2YWx1ZSwKICAgICAge1N0cmluZyBwYXJhbWV0ZXJTZXBhcmF0b3I6ICI7IiwKICAgICAgU3RyaW5nIHZhbHVlU2VwYXJhdG9yOiBudWxsLAogICAgICBib29sIHByZXNlcnZlQmFja3NsYXNoOiBmYWxzZX0pIHsKICAgIHJldHVybiBfSGVhZGVyVmFsdWUucGFyc2UodmFsdWUsCiAgICAgICAgcGFyYW1ldGVyU2VwYXJhdG9yOiBwYXJhbWV0ZXJTZXBhcmF0b3IsCiAgICAgICAgdmFsdWVTZXBhcmF0b3I6IHZhbHVlU2VwYXJhdG9yLAogICAgICAgIHByZXNlcnZlQmFja3NsYXNoOiBwcmVzZXJ2ZUJhY2tzbGFzaCk7CiAgfQoKICAvKioKICAgKiBHZXRzIHRoZSBoZWFkZXIgdmFsdWUuCiAgICovCiAgU3RyaW5nIGdldCB2YWx1ZTsKCiAgLyoqCiAgICogR2V0cyB0aGUgbWFwIG9mIHBhcmFtZXRlcnMuCiAgICoKICAgKiBUaGlzIG1hcCBjYW5ub3QgYmUgbW9kaWZpZWQuIEludm9raW5nIGFueSBvcGVyYXRpb24gd2hpY2ggd291bGQKICAgKiBtb2RpZnkgdGhlIG1hcCB3aWxsIHRocm93IFtVbnN1cHBvcnRlZEVycm9yXS4KICAgKi8KICBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldCBwYXJhbWV0ZXJzOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGluIHRoZSBmb3JtOgogICAqCiAgICogICAgIHZhbHVlOyBwYXJhbWV0ZXIxPXZhbHVlMTsgcGFyYW1ldGVyMj12YWx1ZTIKICAgKi8KICBTdHJpbmcgdG9TdHJpbmcoKTsKfQoKYWJzdHJhY3QgY2xhc3MgSHR0cFNlc3Npb24gaW1wbGVtZW50cyBNYXAgewogIC8qKgogICAqIEdldHMgdGhlIGlkIGZvciB0aGUgY3VycmVudCBzZXNzaW9uLgogICAqLwogIFN0cmluZyBnZXQgaWQ7CgogIC8qKgogICAqIERlc3Ryb3lzIHRoZSBzZXNzaW9uLiBUaGlzIHdpbGwgdGVybWluYXRlIHRoZSBzZXNzaW9uIGFuZCBhbnkgZnVydGhlcgogICAqIGNvbm5lY3Rpb25zIHdpdGggdGhpcyBpZCB3aWxsIGJlIGdpdmVuIGEgbmV3IGlkIGFuZCBzZXNzaW9uLgogICAqLwogIHZvaWQgZGVzdHJveSgpOwoKICAvKioKICAgKiBTZXRzIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBzZXNzaW9uIGlzIHRpbWVkIG91dC4KICAgKi8KICB2b2lkIHNldCBvblRpbWVvdXQodm9pZCBjYWxsYmFjaygpKTsKCiAgLyoqCiAgICogSXMgdHJ1ZSBpZiB0aGUgc2Vzc2lvbiBoYXMgbm90IGJlZW4gc2VudCB0byB0aGUgY2xpZW50IHlldC4KICAgKi8KICBib29sIGdldCBpc05ldzsKfQoKLyoqCiAqIFJlcHJlc2VudGF0aW9uIG9mIGEgY29udGVudCB0eXBlLiBBbiBpbnN0YW5jZSBvZiBbQ29udGVudFR5cGVdIGlzCiAqIGltbXV0YWJsZS4KICovCmFic3RyYWN0IGNsYXNzIENvbnRlbnRUeXBlIGltcGxlbWVudHMgSGVhZGVyVmFsdWUgewogIC8qKgogICAqIENvbnRlbnQgdHlwZSBmb3IgcGxhaW4gdGV4dCB1c2luZyBVVEYtOCBlbmNvZGluZy4KICAgKgogICAqICAgICB0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04CiAgICovCiAgc3RhdGljIGZpbmFsIHRleHQgPSBuZXcgQ29udGVudFR5cGUoInRleHQiLCAicGxhaW4iLCBjaGFyc2V0OiAidXRmLTgiKTsKICBARGVwcmVjYXRlZCgiVXNlIHRleHQgaW5zdGVhZCIpCiAgc3RhdGljIGZpbmFsIFRFWFQgPSB0ZXh0OwoKICAvKioKICAgKiAgQ29udGVudCB0eXBlIGZvciBIVE1MIHVzaW5nIFVURi04IGVuY29kaW5nLgogICAqCiAgICogICAgIHRleHQvaHRtbDsgY2hhcnNldD11dGYtOAogICAqLwogIHN0YXRpYyBmaW5hbCBodG1sID0gbmV3IENvbnRlbnRUeXBlKCJ0ZXh0IiwgImh0bWwiLCBjaGFyc2V0OiAidXRmLTgiKTsKICBARGVwcmVjYXRlZCgiVXNlIGh0bWwgaW5zdGVhZCIpCiAgc3RhdGljIGZpbmFsIEhUTUwgPSBodG1sOwoKICAvKioKICAgKiAgQ29udGVudCB0eXBlIGZvciBKU09OIHVzaW5nIFVURi04IGVuY29kaW5nLgogICAqCiAgICogICAgIGFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgKICAgKi8KICBzdGF0aWMgZmluYWwganNvbiA9IG5ldyBDb250ZW50VHlwZSgiYXBwbGljYXRpb24iLCAianNvbiIsIGNoYXJzZXQ6ICJ1dGYtOCIpOwogIEBEZXByZWNhdGVkKCJVc2UganNvbiBpbnN0ZWFkIikKICBzdGF0aWMgZmluYWwgSlNPTiA9IGpzb247CgogIC8qKgogICAqICBDb250ZW50IHR5cGUgZm9yIGJpbmFyeSBkYXRhLgogICAqCiAgICogICAgIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQogICAqLwogIHN0YXRpYyBmaW5hbCBiaW5hcnkgPSBuZXcgQ29udGVudFR5cGUoImFwcGxpY2F0aW9uIiwgIm9jdGV0LXN0cmVhbSIpOwogIEBEZXByZWNhdGVkKCJVc2UgYmluYXJ5IGluc3RlYWQiKQogIHN0YXRpYyBmaW5hbCBCSU5BUlkgPSBiaW5hcnk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgY29udGVudCB0eXBlIG9iamVjdCBzZXR0aW5nIHRoZSBwcmltYXJ5IHR5cGUgYW5kCiAgICogc3ViIHR5cGUuIFRoZSBjaGFyc2V0IGFuZCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgY2FuIGFsc28gYmUgc2V0CiAgICogdXNpbmcgW2NoYXJzZXRdIGFuZCBbcGFyYW1ldGVyc10uIElmIGNoYXJzZXQgaXMgcGFzc2VkIGFuZAogICAqIFtwYXJhbWV0ZXJzXSBjb250YWlucyBjaGFyc2V0IGFzIHdlbGwgdGhlIHBhc3NlZCBbY2hhcnNldF0gd2lsbAogICAqIG92ZXJyaWRlIHRoZSB2YWx1ZSBpbiBwYXJhbWV0ZXJzLiBLZXlzIHBhc3NlZCBpbiBwYXJhbWV0ZXJzIHdpbGwgYmUKICAgKiBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4gVGhlIGBjaGFyc2V0YCBlbnRyeSwgd2hldGhlciBwYXNzZWQgYXMgYGNoYXJzZXRgCiAgICogb3IgaW4gYHBhcmFtZXRlcnNgLCB3aWxsIGhhdmUgaXRzIHZhbHVlIGNvbnZlcnRlZCB0byBsb3dlci1jYXNlLgogICAqLwogIGZhY3RvcnkgQ29udGVudFR5cGUoU3RyaW5nIHByaW1hcnlUeXBlLCBTdHJpbmcgc3ViVHlwZSwKICAgICAge1N0cmluZyBjaGFyc2V0LCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnN9KSB7CiAgICByZXR1cm4gbmV3IF9Db250ZW50VHlwZShwcmltYXJ5VHlwZSwgc3ViVHlwZSwgY2hhcnNldCwgcGFyYW1ldGVycyk7CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IGNvbnRlbnQgdHlwZSBvYmplY3QgZnJvbSBwYXJzaW5nIGEgQ29udGVudC1UeXBlCiAgICogaGVhZGVyIHZhbHVlLiBBcyBwcmltYXJ5IHR5cGUsIHN1YiB0eXBlIGFuZCBwYXJhbWV0ZXIgbmFtZXMgYW5kCiAgICogdmFsdWVzIGFyZSBub3QgY2FzZSBzZW5zaXRpdmUgYWxsIHRoZXNlIHZhbHVlcyB3aWxsIGJlIGNvbnZlcnRlZAogICAqIHRvIGxvd2VyIGNhc2UuIFBhcnNpbmcgdGhpcyBzdHJpbmcKICAgKgogICAqICAgICB0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgKICAgKgogICAqIHdpbGwgY3JlYXRlIGEgY29udGVudCB0eXBlIG9iamVjdCB3aXRoIHByaW1hcnkgdHlwZSBbOnRleHQ6XSwgc3ViCiAgICogdHlwZSBbOmh0bWw6XSBhbmQgcGFyYW1ldGVyIFs6Y2hhcnNldDpdIHdpdGggdmFsdWUgWzp1dGYtODpdLgogICAqLwogIHN0YXRpYyBDb250ZW50VHlwZSBwYXJzZShTdHJpbmcgdmFsdWUpIHsKICAgIHJldHVybiBfQ29udGVudFR5cGUucGFyc2UodmFsdWUpOwogIH0KCiAgLyoqCiAgICogR2V0cyB0aGUgbWltZS10eXBlLCB3aXRob3V0IGFueSBwYXJhbWV0ZXJzLgogICAqLwogIFN0cmluZyBnZXQgbWltZVR5cGU7CgogIC8qKgogICAqIEdldHMgdGhlIHByaW1hcnkgdHlwZS4KICAgKi8KICBTdHJpbmcgZ2V0IHByaW1hcnlUeXBlOwoKICAvKioKICAgKiBHZXRzIHRoZSBzdWIgdHlwZS4KICAgKi8KICBTdHJpbmcgZ2V0IHN1YlR5cGU7CgogIC8qKgogICAqIEdldHMgdGhlIGNoYXJhY3RlciBzZXQuCiAgICovCiAgU3RyaW5nIGdldCBjaGFyc2V0Owp9CgovKioKICogUmVwcmVzZW50YXRpb24gb2YgYSBjb29raWUuIEZvciBjb29raWVzIHJlY2VpdmVkIGJ5IHRoZSBzZXJ2ZXIgYXMKICogQ29va2llIGhlYWRlciB2YWx1ZXMgb25seSBbOm5hbWU6XSBhbmQgWzp2YWx1ZTpdIGZpZWxkcyB3aWxsIGJlCiAqIHNldC4gV2hlbiBidWlsZGluZyBhIGNvb2tpZSBmb3IgdGhlICdzZXQtY29va2llJyBoZWFkZXIgaW4gdGhlIHNlcnZlcgogKiBhbmQgd2hlbiByZWNlaXZpbmcgY29va2llcyBpbiB0aGUgY2xpZW50IGFzICdzZXQtY29va2llJyBoZWFkZXJzIGFsbAogKiBmaWVsZHMgY2FuIGJlIHVzZWQuCiAqLwphYnN0cmFjdCBjbGFzcyBDb29raWUgewogIC8qKgogICAqIEdldHMgYW5kIHNldHMgdGhlIG5hbWUuCiAgICovCiAgU3RyaW5nIG5hbWU7CgogIC8qKgogICAqIEdldHMgYW5kIHNldHMgdGhlIHZhbHVlLgogICAqLwogIFN0cmluZyB2YWx1ZTsKCiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgZXhwaXJ5IGRhdGUuCiAgICovCiAgRGF0ZVRpbWUgZXhwaXJlczsKCiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgbWF4IGFnZS4gQSB2YWx1ZSBvZiBbOjA6XSBtZWFucyBkZWxldGUgY29va2llCiAgICogbm93LgogICAqLwogIGludCBtYXhBZ2U7CgogIC8qKgogICAqIEdldHMgYW5kIHNldHMgdGhlIGRvbWFpbi4KICAgKi8KICBTdHJpbmcgZG9tYWluOwoKICAvKioKICAgKiBHZXRzIGFuZCBzZXRzIHRoZSBwYXRoLgogICAqLwogIFN0cmluZyBwYXRoOwoKICAvKioKICAgKiBHZXRzIGFuZCBzZXRzIHdoZXRoZXIgdGhpcyBjb29raWUgaXMgc2VjdXJlLgogICAqLwogIGJvb2wgc2VjdXJlOwoKICAvKioKICAgKiBHZXRzIGFuZCBzZXRzIHdoZXRoZXIgdGhpcyBjb29raWUgaXMgSFRUUCBvbmx5LgogICAqLwogIGJvb2wgaHR0cE9ubHk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgY29va2llIG9wdGlvbmFsbHkgc2V0dGluZyB0aGUgbmFtZSBhbmQgdmFsdWUuCiAgICoKICAgKiBCeSBkZWZhdWx0IHRoZSB2YWx1ZSBvZiBgaHR0cE9ubHlgIHdpbGwgYmUgc2V0IHRvIGB0cnVlYC4KICAgKi8KICBmYWN0b3J5IENvb2tpZShbU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZV0pID0+IG5ldyBfQ29va2llKG5hbWUsIHZhbHVlKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBjb29raWUgYnkgcGFyc2luZyBhIGhlYWRlciB2YWx1ZSBmcm9tIGEgJ3NldC1jb29raWUnCiAgICogaGVhZGVyLgogICAqLwogIGZhY3RvcnkgQ29va2llLmZyb21TZXRDb29raWVWYWx1ZShTdHJpbmcgdmFsdWUpIHsKICAgIHJldHVybiBuZXcgX0Nvb2tpZS5mcm9tU2V0Q29va2llVmFsdWUodmFsdWUpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZm9ybWF0dGVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29va2llLiBUaGUKICAgKiBzdHJpbmcgcmVwcmVzZW50YXRpb24gY2FuIGJlIHVzZWQgZm9yIGZvciBzZXR0aW5nIHRoZSBDb29raWUgb3IKICAgKiAnc2V0LWNvb2tpZScgaGVhZGVycwogICAqLwogIFN0cmluZyB0b1N0cmluZygpOwp9CgovKioKICogQSBzZXJ2ZXItc2lkZSBvYmplY3QKICogdGhhdCBjb250YWlucyB0aGUgY29udGVudCBvZiBhbmQgaW5mb3JtYXRpb24gYWJvdXQgYW4gSFRUUCByZXF1ZXN0LgogKgogKiBfX05vdGVfXzogQ2hlY2sgb3V0IHRoZQogKiBbaHR0cF9zZXJ2ZXJdKGh0dHBzOi8vcHViLmRhcnRsYW5nLm9yZy9wYWNrYWdlcy9odHRwX3NlcnZlcikKICogcGFja2FnZSwgd2hpY2ggbWFrZXMgd29ya2luZyB3aXRoIHRoZSBsb3ctbGV2ZWwKICogZGFydDppbyBIVFRQIHNlcnZlciBzdWJzeXN0ZW0gZWFzaWVyLgogKgogKiBgSHR0cFJlcXVlc3RgIG9iamVjdHMgYXJlIGdlbmVyYXRlZCBieSBhbiBbSHR0cFNlcnZlcl0sCiAqIHdoaWNoIGxpc3RlbnMgZm9yIEhUVFAgcmVxdWVzdHMgb24gYSBzcGVjaWZpYyBob3N0IGFuZCBwb3J0LgogKiBGb3IgZWFjaCByZXF1ZXN0IHJlY2VpdmVkLCB0aGUgSHR0cFNlcnZlciwgd2hpY2ggaXMgYSBbU3RyZWFtXSwKICogZ2VuZXJhdGVzIGFuIGBIdHRwUmVxdWVzdGAgb2JqZWN0IGFuZCBhZGRzIGl0IHRvIHRoZSBzdHJlYW0uCiAqCiAqIEFuIGBIdHRwUmVxdWVzdGAgb2JqZWN0IGRlbGl2ZXJzIHRoZSBib2R5IGNvbnRlbnQgb2YgdGhlIHJlcXVlc3QKICogYXMgYSBzdHJlYW0gb2YgYnl0ZSBsaXN0cy4KICogVGhlIG9iamVjdCBhbHNvIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXF1ZXN0LAogKiBzdWNoIGFzIHRoZSBtZXRob2QsIFVSSSwgYW5kIGhlYWRlcnMuCiAqCiAqIEluIHRoZSBmb2xsb3dpbmcgY29kZSwgYW4gSHR0cFNlcnZlciBsaXN0ZW5zCiAqIGZvciBIVFRQIHJlcXVlc3RzLiBXaGVuIHRoZSBzZXJ2ZXIgcmVjZWl2ZXMgYSByZXF1ZXN0LAogKiBpdCB1c2VzIHRoZSBIdHRwUmVxdWVzdCBvYmplY3QncyBgbWV0aG9kYCBwcm9wZXJ0eSB0byBkaXNwYXRjaCByZXF1ZXN0cy4KICoKICogICAgIGZpbmFsIEhPU1QgPSBJbnRlcm5ldEFkZHJlc3MubG9vcGJhY2tJUHY0OwogKiAgICAgZmluYWwgUE9SVCA9IDgwOwogKgogKiAgICAgSHR0cFNlcnZlci5iaW5kKEhPU1QsIFBPUlQpLnRoZW4oKF9zZXJ2ZXIpIHsKICogICAgICAgX3NlcnZlci5saXN0ZW4oKEh0dHBSZXF1ZXN0IHJlcXVlc3QpIHsKICogICAgICAgICBzd2l0Y2ggKHJlcXVlc3QubWV0aG9kKSB7CiAqICAgICAgICAgICBjYXNlICdHRVQnOgogKiAgICAgICAgICAgICBoYW5kbGVHZXRSZXF1ZXN0KHJlcXVlc3QpOwogKiAgICAgICAgICAgICBicmVhazsKICogICAgICAgICAgIGNhc2UgJ1BPU1QnOgogKiAgICAgICAgICAgICAuLi4KICogICAgICAgICB9CiAqICAgICAgIH0sCiAqICAgICAgIG9uRXJyb3I6IGhhbmRsZUVycm9yKTsgICAgLy8gbGlzdGVuKCkgZmFpbGVkLgogKiAgICAgfSkuY2F0Y2hFcnJvcihoYW5kbGVFcnJvcik7CiAqCiAqIEFuIEh0dHBSZXF1ZXN0IG9iamVjdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGFzc29jaWF0ZWQgW0h0dHBSZXNwb25zZV0KICogb2JqZWN0IHRocm91Z2ggdGhlIHJlc3BvbnNlIHByb3BlcnR5LgogKiBUaGUgc2VydmVyIHdyaXRlcyBpdHMgcmVzcG9uc2UgdG8gdGhlIGJvZHkgb2YgdGhlIEh0dHBSZXNwb25zZSBvYmplY3QuCiAqIEZvciBleGFtcGxlLCBoZXJlJ3MgYSBmdW5jdGlvbiB0aGF0IHJlc3BvbmRzIHRvIGEgcmVxdWVzdDoKICoKICogICAgIHZvaWQgaGFuZGxlR2V0UmVxdWVzdChIdHRwUmVxdWVzdCByZXEpIHsKICogICAgICAgSHR0cFJlc3BvbnNlIHJlcyA9IHJlcS5yZXNwb25zZTsKICogICAgICAgcmVzLndyaXRlKCdSZWNlaXZlZCByZXF1ZXN0ICR7cmVxLm1ldGhvZH06ICR7cmVxLnVyaS5wYXRofScpOwogKiAgICAgICByZXMuY2xvc2UoKTsKICogICAgIH0KICovCmFic3RyYWN0IGNsYXNzIEh0dHBSZXF1ZXN0IGltcGxlbWVudHMgU3RyZWFtPExpc3Q8aW50Pj4gewogIC8qKgogICAqIFRoZSBjb250ZW50IGxlbmd0aCBvZiB0aGUgcmVxdWVzdCBib2R5LgogICAqCiAgICogSWYgdGhlIHNpemUgb2YgdGhlIHJlcXVlc3QgYm9keSBpcyBub3Qga25vd24gaW4gYWR2YW5jZSwKICAgKiB0aGlzIHZhbHVlIGlzIC0xLgogICAqLwogIGludCBnZXQgY29udGVudExlbmd0aDsKCiAgLyoqCiAgICogVGhlIG1ldGhvZCwgc3VjaCBhcyAnR0VUJyBvciAnUE9TVCcsIGZvciB0aGUgcmVxdWVzdC4KICAgKi8KICBTdHJpbmcgZ2V0IG1ldGhvZDsKCiAgLyoqCiAgICogVGhlIFVSSSBmb3IgdGhlIHJlcXVlc3QuCiAgICoKICAgKiBUaGlzIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUKICAgKiBwYXRoIGFuZCBxdWVyeSBzdHJpbmcgZm9yIHRoZSByZXF1ZXN0LgogICAqLwogIFVyaSBnZXQgdXJpOwoKICAvKioKICAgKiBUaGUgcmVxdWVzdGVkIFVSSSBmb3IgdGhlIHJlcXVlc3QuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgVVJJIGlzIHJlY29uc3RydWN0ZWQgYnkgdXNpbmcgaHR0cC1oZWFkZXIgZmllbGRzLCB0byBhY2Nlc3MKICAgKiBvdGhlcndpc2UgbG9zdCBpbmZvcm1hdGlvbiwgZS5nLiBob3N0IGFuZCBzY2hlbWUuCiAgICoKICAgKiBUbyByZWNvbnN0cnVjdCB0aGUgc2NoZW1lLCBmaXJzdCAnWC1Gb3J3YXJkZWQtUHJvdG8nIGlzIGNoZWNrZWQsIGFuZCB0aGVuCiAgICogZmFsbGluZyBiYWNrIHRvIHNlcnZlciB0eXBlLgogICAqCiAgICogVG8gcmVjb25zdHJ1Y3QgdGhlIGhvc3QsIGZpcnN0ICdYLUZvcndhcmRlZC1Ib3N0JyBpcyBjaGVja2VkLCB0aGVuICdIb3N0JwogICAqIGFuZCBmaW5hbGx5IGNhbGxpbmcgYmFjayB0byBzZXJ2ZXIuCiAgICovCiAgVXJpIGdldCByZXF1ZXN0ZWRVcmk7CgogIC8qKgogICAqIFRoZSByZXF1ZXN0IGhlYWRlcnMuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgW0h0dHBIZWFkZXJzXSBhcmUgaW1tdXRhYmxlLgogICAqLwogIEh0dHBIZWFkZXJzIGdldCBoZWFkZXJzOwoKICAvKioKICAgKiBUaGUgY29va2llcyBpbiB0aGUgcmVxdWVzdCwgZnJvbSB0aGUgQ29va2llIGhlYWRlcnMuCiAgICovCiAgTGlzdDxDb29raWU+IGdldCBjb29raWVzOwoKICAvKioKICAgKiBUaGUgcGVyc2lzdGVudCBjb25uZWN0aW9uIHN0YXRlIHNpZ25hbGVkIGJ5IHRoZSBjbGllbnQuCiAgICovCiAgYm9vbCBnZXQgcGVyc2lzdGVudENvbm5lY3Rpb247CgogIC8qKgogICAqIFRoZSBjbGllbnQgY2VydGlmaWNhdGUgb2YgdGhlIGNsaWVudCBtYWtpbmcgdGhlIHJlcXVlc3QuCiAgICoKICAgKiBUaGlzIHZhbHVlIGlzIG51bGwgaWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGEgc2VjdXJlIFRMUyBvciBTU0wgY29ubmVjdGlvbiwKICAgKiBvciBpZiB0aGUgc2VydmVyIGRvZXMgbm90IHJlcXVlc3QgYSBjbGllbnQgY2VydGlmaWNhdGUsIG9yIGlmIHRoZSBjbGllbnQKICAgKiBkb2VzIG5vdCBwcm92aWRlIG9uZS4KICAgKi8KICBYNTA5Q2VydGlmaWNhdGUgZ2V0IGNlcnRpZmljYXRlOwoKICAvKioKICAgKiBUaGUgc2Vzc2lvbiBmb3IgdGhlIGdpdmVuIHJlcXVlc3QuCiAgICoKICAgKiBJZiB0aGUgc2Vzc2lvbiBpcwogICAqIGJlaW5nIGluaXRpYWxpemVkIGJ5IHRoaXMgY2FsbCwgWzppc05ldzpdIGlzIHRydWUgZm9yIHRoZSByZXR1cm5lZAogICAqIHNlc3Npb24uCiAgICogU2VlIFtIdHRwU2VydmVyLnNlc3Npb25UaW1lb3V0XSBvbiBob3cgdG8gY2hhbmdlIGRlZmF1bHQgdGltZW91dC4KICAgKi8KICBIdHRwU2Vzc2lvbiBnZXQgc2Vzc2lvbjsKCiAgLyoqCiAgICogVGhlIEhUVFAgcHJvdG9jb2wgdmVyc2lvbiB1c2VkIGluIHRoZSByZXF1ZXN0LAogICAqIGVpdGhlciAiMS4wIiBvciAiMS4xIi4KICAgKi8KICBTdHJpbmcgZ2V0IHByb3RvY29sVmVyc2lvbjsKCiAgLyoqCiAgICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGNsaWVudCBjb25uZWN0aW9uLgogICAqCiAgICogUmV0dXJucyBbOm51bGw6XSBpZiB0aGUgc29ja2V0IGlzIG5vdCBhdmFpbGFibGUuCiAgICovCiAgSHR0cENvbm5lY3Rpb25JbmZvIGdldCBjb25uZWN0aW9uSW5mbzsKCiAgLyoqCiAgICogVGhlIFtIdHRwUmVzcG9uc2VdIG9iamVjdCwgdXNlZCBmb3Igc2VuZGluZyBiYWNrIHRoZSByZXNwb25zZSB0byB0aGUKICAgKiBjbGllbnQuCiAgICoKICAgKiBJZiB0aGUgW2NvbnRlbnRMZW5ndGhdIG9mIHRoZSBib2R5IGlzbid0IDAsIGFuZCB0aGUgYm9keSBpc24ndCBiZWluZyByZWFkLAogICAqIGFueSB3cml0ZSBjYWxscyBvbiB0aGUgW0h0dHBSZXNwb25zZV0gYXV0b21hdGljYWxseSBkcmFpbiB0aGUgcmVxdWVzdAogICAqIGJvZHkuCiAgICovCiAgSHR0cFJlc3BvbnNlIGdldCByZXNwb25zZTsKfQoKLyoqCiAqIEFuIEhUVFAgcmVzcG9uc2UsIHdoaWNoIHJldHVybnMgdGhlIGhlYWRlcnMgYW5kIGRhdGEKICogZnJvbSB0aGUgc2VydmVyIHRvIHRoZSBjbGllbnQgaW4gcmVzcG9uc2UgdG8gYW4gSFRUUCByZXF1ZXN0LgogKgogKiBFdmVyeSBIdHRwUmVxdWVzdCBvYmplY3QgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBhc3NvY2lhdGVkIFtIdHRwUmVzcG9uc2VdCiAqIG9iamVjdCB0aHJvdWdoIHRoZSBgcmVzcG9uc2VgIHByb3BlcnR5LgogKiBUaGUgc2VydmVyIHNlbmRzIGl0cyByZXNwb25zZSB0byB0aGUgY2xpZW50IGJ5IHdyaXRpbmcgdG8gdGhlCiAqIEh0dHBSZXNwb25zZSBvYmplY3QuCiAqCiAqICMjIFdyaXRpbmcgdGhlIHJlc3BvbnNlCiAqCiAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBbSU9TaW5rXS4KICogQWZ0ZXIgdGhlIGhlYWRlciBoYXMgYmVlbiBzZXQgdXAsIHRoZSBtZXRob2RzCiAqIGZyb20gSU9TaW5rLCBzdWNoIGFzIGB3cml0ZWxuKClgLCBjYW4gYmUgdXNlZCB0byB3cml0ZQogKiB0aGUgYm9keSBvZiB0aGUgSFRUUCByZXNwb25zZS4KICogVXNlIHRoZSBgY2xvc2UoKWAgbWV0aG9kIHRvIGNsb3NlIHRoZSByZXNwb25zZSBhbmQgc2VuZCBpdCB0byB0aGUgY2xpZW50LgogKgogKiAgICAgc2VydmVyLmxpc3RlbigoSHR0cFJlcXVlc3QgcmVxdWVzdCkgewogKiAgICAgICByZXF1ZXN0LnJlc3BvbnNlLndyaXRlKCdIZWxsbywgd29ybGQhJyk7CiAqICAgICAgIHJlcXVlc3QucmVzcG9uc2UuY2xvc2UoKTsKICogICAgIH0pOwogKgogKiBXaGVuIG9uZSBvZiB0aGUgSU9TaW5rIG1ldGhvZHMgaXMgdXNlZCBmb3IgdGhlCiAqIGZpcnN0IHRpbWUsIHRoZSByZXF1ZXN0IGhlYWRlciBpcyBzZW50LiBDYWxsaW5nIGFueSBtZXRob2RzIHRoYXQKICogY2hhbmdlIHRoZSBoZWFkZXIgYWZ0ZXIgaXQgaXMgc2VudCB0aHJvd3MgYW4gZXhjZXB0aW9uLgogKgogKiAjIyBTZXR0aW5nIHRoZSBoZWFkZXJzCiAqCiAqIFRoZSBIdHRwUmVzcG9uc2Ugb2JqZWN0IGhhcyBhIG51bWJlciBvZiBwcm9wZXJ0aWVzIGZvciBzZXR0aW5nIHVwCiAqIHRoZSBIVFRQIGhlYWRlcnMgb2YgdGhlIHJlc3BvbnNlLgogKiBXaGVuIHdyaXRpbmcgc3RyaW5nIGRhdGEgdGhyb3VnaCB0aGUgSU9TaW5rLCB0aGUgZW5jb2RpbmcgdXNlZAogKiBpcyBkZXRlcm1pbmVkIGZyb20gdGhlICJjaGFyc2V0IiBwYXJhbWV0ZXIgb2YgdGhlCiAqICJDb250ZW50LVR5cGUiIGhlYWRlci4KICoKICogICAgIEh0dHBSZXNwb25zZSByZXNwb25zZSA9IC4uLgogKiAgICAgcmVzcG9uc2UuaGVhZGVycy5jb250ZW50VHlwZQogKiAgICAgICAgID0gbmV3IENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbiIsICJqc29uIiwgY2hhcnNldDogInV0Zi04Iik7CiAqICAgICByZXNwb25zZS53cml0ZSguLi4pOyAgLy8gU3RyaW5ncyB3cml0dGVuIHdpbGwgYmUgVVRGLTggZW5jb2RlZC4KICoKICogSWYgbm8gY2hhcnNldCBpcyBwcm92aWRlZCB0aGUgZGVmYXVsdCBvZiBJU08tODg1OS0xIChMYXRpbiAxKSB3aWxsCiAqIGJlIHVzZWQuCiAqCiAqICAgICBIdHRwUmVzcG9uc2UgcmVzcG9uc2UgPSAuLi4KICogICAgIHJlc3BvbnNlLmhlYWRlcnMuYWRkKEh0dHBIZWFkZXJzLmNvbnRlbnRUeXBlSGVhZGVyLCAidGV4dC9wbGFpbiIpOwogKiAgICAgcmVzcG9uc2Uud3JpdGUoLi4uKTsgIC8vIFN0cmluZ3Mgd3JpdHRlbiB3aWxsIGJlIElTTy04ODU5LTEgZW5jb2RlZC4KICoKICogQW4gZXhjZXB0aW9uIGlzIHRocm93biBpZiB5b3UgdXNlIHRoZSBgd3JpdGUoKWAgbWV0aG9kCiAqIHdoaWxlIGFuIHVuc3VwcG9ydGVkIGNvbnRlbnQtdHlwZSBpcyBzZXQuCiAqLwphYnN0cmFjdCBjbGFzcyBIdHRwUmVzcG9uc2UgaW1wbGVtZW50cyBJT1NpbmsgewogIC8vIFRPRE8oYWpvaG5zZW4pOiBBZGQgZG9jdW1lbnRhdGlvbiBvZiBob3cgdG8gcGlwZSBhIGZpbGUgdG8gdGhlIHJlc3BvbnNlLgogIC8qKgogICAqIEdldHMgYW5kIHNldHMgdGhlIGNvbnRlbnQgbGVuZ3RoIG9mIHRoZSByZXNwb25zZS4gSWYgdGhlIHNpemUgb2YKICAgKiB0aGUgcmVzcG9uc2UgaXMgbm90IGtub3duIGluIGFkdmFuY2Ugc2V0IHRoZSBjb250ZW50IGxlbmd0aCB0bwogICAqIC0xLCB3aGljaCBpcyBhbHNvIHRoZSBkZWZhdWx0IGlmIG5vdCBzZXQuCiAgICovCiAgaW50IGNvbnRlbnRMZW5ndGg7CgogIC8qKgogICAqIEdldHMgYW5kIHNldHMgdGhlIHN0YXR1cyBjb2RlLiBBbnkgaW50ZWdlciB2YWx1ZSBpcyBhY2NlcHRlZC4gRm9yCiAgICogdGhlIG9mZmljaWFsIEhUVFAgc3RhdHVzIGNvZGVzIHVzZSB0aGUgZmllbGRzIGZyb20KICAgKiBbSHR0cFN0YXR1c10uIElmIG5vIHN0YXR1cyBjb2RlIGlzIGV4cGxpY2l0bHkgc2V0IHRoZSBkZWZhdWx0CiAgICogdmFsdWUgW0h0dHBTdGF0dXMub2tdIGlzIHVzZWQuCiAgICoKICAgKiBUaGUgc3RhdHVzIGNvZGUgbXVzdCBiZSBzZXQgYmVmb3JlIHRoZSBib2R5IGlzIHdyaXR0ZW4KICAgKiB0by4gU2V0dGluZyB0aGUgc3RhdHVzIGNvZGUgYWZ0ZXIgd3JpdGluZyB0byB0aGUgcmVzcG9uc2UgYm9keSBvcgogICAqIGNsb3NpbmcgdGhlIHJlc3BvbnNlIHdpbGwgdGhyb3cgYSBgU3RhdGVFcnJvcmAuCiAgICovCiAgaW50IHN0YXR1c0NvZGU7CgogIC8qKgogICAqIEdldHMgYW5kIHNldHMgdGhlIHJlYXNvbiBwaHJhc2UuIElmIG5vIHJlYXNvbiBwaHJhc2UgaXMgZXhwbGljaXRseQogICAqIHNldCBhIGRlZmF1bHQgcmVhc29uIHBocmFzZSBpcyBwcm92aWRlZC4KICAgKgogICAqIFRoZSByZWFzb24gcGhyYXNlIG11c3QgYmUgc2V0IGJlZm9yZSB0aGUgYm9keSBpcyB3cml0dGVuCiAgICogdG8uIFNldHRpbmcgdGhlIHJlYXNvbiBwaHJhc2UgYWZ0ZXIgd3JpdGluZyB0byB0aGUgcmVzcG9uc2UgYm9keQogICAqIG9yIGNsb3NpbmcgdGhlIHJlc3BvbnNlIHdpbGwgdGhyb3cgYSBgU3RhdGVFcnJvcmAuCiAgICovCiAgU3RyaW5nIHJlYXNvblBocmFzZTsKCiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgcGVyc2lzdGVudCBjb25uZWN0aW9uIHN0YXRlLiBUaGUgaW5pdGlhbCB2YWx1ZQogICAqIG9mIHRoaXMgcHJvcGVydHkgaXMgdGhlIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBzdGF0ZSBmcm9tIHRoZQogICAqIHJlcXVlc3QuCiAgICovCiAgYm9vbCBwZXJzaXN0ZW50Q29ubmVjdGlvbjsKCiAgLyoqCiAgICogU2V0IGFuZCBnZXQgdGhlIFtkZWFkbGluZV0gZm9yIHRoZSByZXNwb25zZS4gVGhlIGRlYWRsaW5lIGlzIHRpbWVkIGZyb20gdGhlCiAgICogdGltZSBpdCdzIHNldC4gU2V0dGluZyBhIG5ldyBkZWFkbGluZSB3aWxsIG92ZXJyaWRlIGFueSBwcmV2aW91cyBkZWFkbGluZS4KICAgKiBXaGVuIGEgZGVhZGxpbmUgaXMgZXhjZWVkZWQsIHRoZSByZXNwb25zZSB3aWxsIGJlIGNsb3NlZCBhbmQgYW55IGZ1cnRoZXIKICAgKiBkYXRhIGlnbm9yZWQuCiAgICoKICAgKiBUbyBkaXNhYmxlIGEgZGVhZGxpbmUsIHNldCB0aGUgW2RlYWRsaW5lXSB0byBgbnVsbGAuCiAgICoKICAgKiBUaGUgW2RlYWRsaW5lXSBpcyBgbnVsbGAgYnkgZGVmYXVsdC4KICAgKi8KICBEdXJhdGlvbiBkZWFkbGluZTsKCiAgLyoqCiAgICogR2V0cyBvciBzZXRzIGlmIHRoZSBbSHR0cFJlc3BvbnNlXSBzaG91bGQgYnVmZmVyIG91dHB1dC4KICAgKgogICAqIERlZmF1bHQgdmFsdWUgaXMgYHRydWVgLgogICAqCiAgICogX19Ob3RlX186IERpc2FibGluZyBidWZmZXJpbmcgb2YgdGhlIG91dHB1dCBjYW4gcmVzdWx0IGluIHZlcnkgcG9vcgogICAqIHBlcmZvcm1hbmNlLCB3aGVuIHdyaXRpbmcgbWFueSBzbWFsbCBjaHVua3MuCiAgICovCiAgYm9vbCBidWZmZXJPdXRwdXQ7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHJlc3BvbnNlIGhlYWRlcnMuCiAgICoKICAgKiBUaGUgcmVzcG9uc2UgaGVhZGVycyBjYW4gYmUgbW9kaWZpZWQgdW50aWwgdGhlIHJlc3BvbnNlIGJvZHkgaXMKICAgKiB3cml0dGVuIHRvIG9yIGNsb3NlZC4gQWZ0ZXIgdGhhdCB0aGV5IGJlY29tZSBpbW11dGFibGUuCiAgICovCiAgSHR0cEhlYWRlcnMgZ2V0IGhlYWRlcnM7CgogIC8qKgogICAqIENvb2tpZXMgdG8gc2V0IGluIHRoZSBjbGllbnQgKGluIHRoZSAnc2V0LWNvb2tpZScgaGVhZGVyKS4KICAgKi8KICBMaXN0PENvb2tpZT4gZ2V0IGNvb2tpZXM7CgogIC8qKgogICAqIFJlc3BvbmQgd2l0aCBhIHJlZGlyZWN0IHRvIFtsb2NhdGlvbl0uCiAgICoKICAgKiBUaGUgVVJJIGluIFtsb2NhdGlvbl0gc2hvdWxkIGJlIGFic29sdXRlLCBidXQgdGhlcmUgYXJlIG5vIGNoZWNrcwogICAqIHRvIGVuZm9yY2UgdGhhdC4KICAgKgogICAqIEJ5IGRlZmF1bHQgdGhlIEhUVFAgc3RhdHVzIGNvZGUgYEh0dHBTdGF0dXMubW92ZWRUZW1wb3JhcmlseWAKICAgKiAoYDMwMmApIGlzIHVzZWQgZm9yIHRoZSByZWRpcmVjdCwgYnV0IGFuIGFsdGVybmF0aXZlIG9uZSBjYW4gYmUKICAgKiBzcGVjaWZpZWQgdXNpbmcgdGhlIFtzdGF0dXNdIGFyZ3VtZW50LgogICAqCiAgICogVGhpcyBtZXRob2Qgd2lsbCBhbHNvIGNhbGwgYGNsb3NlYCwgYW5kIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMKICAgKiB0aGUgZnV0dXJlIHJldHVybmVkIGJ5IGBjbG9zZWAuCiAgICovCiAgRnV0dXJlIHJlZGlyZWN0KFVyaSBsb2NhdGlvbiwge2ludCBzdGF0dXM6IEh0dHBTdGF0dXMubW92ZWRUZW1wb3JhcmlseX0pOwoKICAvKioKICAgKiBEZXRhY2hlcyB0aGUgdW5kZXJseWluZyBzb2NrZXQgZnJvbSB0aGUgSFRUUCBzZXJ2ZXIuIFdoZW4gdGhlCiAgICogc29ja2V0IGlzIGRldGFjaGVkIHRoZSBIVFRQIHNlcnZlciB3aWxsIG5vIGxvbmdlciBwZXJmb3JtIGFueQogICAqIG9wZXJhdGlvbnMgb24gaXQuCiAgICoKICAgKiBUaGlzIGlzIG5vcm1hbGx5IHVzZWQgd2hlbiBhIEhUVFAgdXBncmFkZSByZXF1ZXN0IGlzIHJlY2VpdmVkCiAgICogYW5kIHRoZSBjb21tdW5pY2F0aW9uIHNob3VsZCBjb250aW51ZSB3aXRoIGEgZGlmZmVyZW50IHByb3RvY29sLgogICAqCiAgICogSWYgW3dyaXRlSGVhZGVyc10gaXMgYHRydWVgLCB0aGUgc3RhdHVzIGxpbmUgYW5kIFtoZWFkZXJzXSB3aWxsIGJlIHdyaXR0ZW4KICAgKiB0byB0aGUgc29ja2V0IGJlZm9yZSBpdCdzIGRldGFjaGVkLiBJZiBgZmFsc2VgLCB0aGUgc29ja2V0IGlzIGRldGFjaGVkCiAgICogaW1tZWRpYXRlbHksIHdpdGhvdXQgYW55IGRhdGEgd3JpdHRlbiB0byB0aGUgc29ja2V0LiBEZWZhdWx0IGlzIGB0cnVlYC4KICAgKi8KICBGdXR1cmU8U29ja2V0PiBkZXRhY2hTb2NrZXQoe2Jvb2wgd3JpdGVIZWFkZXJzOiB0cnVlfSk7CgogIC8qKgogICAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNsaWVudCBjb25uZWN0aW9uLiBSZXR1cm5zIFs6bnVsbDpdIGlmIHRoZQogICAqIHNvY2tldCBpcyBub3QgYXZhaWxhYmxlLgogICAqLwogIEh0dHBDb25uZWN0aW9uSW5mbyBnZXQgY29ubmVjdGlvbkluZm87Cn0KCi8qKgogKiBBIGNsaWVudCB0aGF0IHJlY2VpdmVzIGNvbnRlbnQsIHN1Y2ggYXMgd2ViIHBhZ2VzLCBmcm9tCiAqIGEgc2VydmVyIHVzaW5nIHRoZSBIVFRQIHByb3RvY29sLgogKgogKiBIdHRwQ2xpZW50IGNvbnRhaW5zIGEgbnVtYmVyIG9mIG1ldGhvZHMgdG8gc2VuZCBhbiBbSHR0cENsaWVudFJlcXVlc3RdCiAqIHRvIGFuIEh0dHAgc2VydmVyIGFuZCByZWNlaXZlIGFuIFtIdHRwQ2xpZW50UmVzcG9uc2VdIGJhY2suCiAqIEZvciBleGFtcGxlLCB5b3UgY2FuIHVzZSB0aGUgW2dldF0sIFtnZXRVcmxdLCBbcG9zdF0sIGFuZCBbcG9zdFVybF0gbWV0aG9kcwogKiBmb3IgR0VUIGFuZCBQT1NUIHJlcXVlc3RzLCByZXNwZWN0aXZlbHkuCiAqCiAqICMjIE1ha2luZyBhIHNpbXBsZSBHRVQgcmVxdWVzdDogYW4gZXhhbXBsZQogKgogKiBBIGBnZXRVcmxgIHJlcXVlc3QgaXMgYSB0d28tc3RlcCBwcm9jZXNzLCB0cmlnZ2VyZWQgYnkgdHdvIFtGdXR1cmVdcy4KICogV2hlbiB0aGUgZmlyc3QgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIGEgW0h0dHBDbGllbnRSZXF1ZXN0XSwgdGhlIHVuZGVybHlpbmcKICogbmV0d29yayBjb25uZWN0aW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkLCBidXQgbm8gZGF0YSBoYXMgYmVlbiBzZW50LgogKiBJbiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoZSBmaXJzdCBmdXR1cmUsIHRoZSBIVFRQIGhlYWRlcnMgYW5kIGJvZHkKICogY2FuIGJlIHNldCBvbiB0aGUgcmVxdWVzdC4gRWl0aGVyIHRoZSBmaXJzdCB3cml0ZSB0byB0aGUgcmVxdWVzdCBvYmplY3QKICogb3IgYSBjYWxsIHRvIFtjbG9zZV0gc2VuZHMgdGhlIHJlcXVlc3QgdG8gdGhlIHNlcnZlci4KICoKICogV2hlbiB0aGUgSFRUUCByZXNwb25zZSBpcyByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIsCiAqIHRoZSBzZWNvbmQgZnV0dXJlLCB3aGljaCBpcyByZXR1cm5lZCBieSBjbG9zZSwKICogY29tcGxldGVzIHdpdGggYW4gW0h0dHBDbGllbnRSZXNwb25zZV0gb2JqZWN0LgogKiBUaGlzIG9iamVjdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGhlYWRlcnMgYW5kIGJvZHkgb2YgdGhlIHJlc3BvbnNlLgogKiBUaGUgYm9keSBpcyBhdmFpbGFibGUgYXMgYSBzdHJlYW0gaW1wbGVtZW50ZWQgYnkgSHR0cENsaWVudFJlc3BvbnNlLgogKiBJZiBhIGJvZHkgaXMgcHJlc2VudCwgaXQgbXVzdCBiZSByZWFkLiBPdGhlcndpc2UsIGl0IGxlYWRzIHRvIHJlc291cmNlCiAqIGxlYWtzLiBDb25zaWRlciB1c2luZyBbSHR0cENsaWVudFJlc3BvbnNlLmRyYWluXSBpZiB0aGUgYm9keSBpcyB1bnVzZWQuCiAqCiAqICAgICBIdHRwQ2xpZW50IGNsaWVudCA9IG5ldyBIdHRwQ2xpZW50KCk7CiAqICAgICBjbGllbnQuZ2V0VXJsKFVyaS5wYXJzZSgiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iKSkKICogICAgICAgICAudGhlbigoSHR0cENsaWVudFJlcXVlc3QgcmVxdWVzdCkgewogKiAgICAgICAgICAgLy8gT3B0aW9uYWxseSBzZXQgdXAgaGVhZGVycy4uLgogKiAgICAgICAgICAgLy8gT3B0aW9uYWxseSB3cml0ZSB0byB0aGUgcmVxdWVzdCBvYmplY3QuLi4KICogICAgICAgICAgIC8vIFRoZW4gY2FsbCBjbG9zZS4KICogICAgICAgICAgIC4uLgogKiAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QuY2xvc2UoKTsKICogICAgICAgICB9KQogKiAgICAgICAgIC50aGVuKChIdHRwQ2xpZW50UmVzcG9uc2UgcmVzcG9uc2UpIHsKICogICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIHJlc3BvbnNlLgogKiAgICAgICAgICAgLi4uCiAqICAgICAgICAgfSk7CiAqCiAqIFRoZSBmdXR1cmUgZm9yIFtIdHRwQ2xpZW50UmVxdWVzdF0gaXMgY3JlYXRlZCBieSBtZXRob2RzIHN1Y2ggYXMKICogW2dldFVybF0gYW5kIFtvcGVuXS4KICoKICogIyMgSFRUUFMgY29ubmVjdGlvbnMKICoKICogQW4gSHR0cENsaWVudCBjYW4gbWFrZSBIVFRQUyByZXF1ZXN0cywgY29ubmVjdGluZyB0byBhIHNlcnZlciB1c2luZwogKiB0aGUgVExTIChTU0wpIHNlY3VyZSBuZXR3b3JraW5nIHByb3RvY29sLiBDYWxsaW5nIFtnZXRVcmxdIHdpdGggYW4KICogaHR0cHM6IHNjaGVtZSB3aWxsIHdvcmsgYXV0b21hdGljYWxseSwgaWYgdGhlIHNlcnZlcidzIGNlcnRpZmljYXRlIGlzCiAqIHNpZ25lZCBieSBhIHJvb3QgQ0EgKGNlcnRpZmljYXRlIGF1dGhvcml0eSkgb24gdGhlIGRlZmF1bHQgbGlzdCBvZgogKiB3ZWxsLWtub3duIHRydXN0ZWQgQ0FzLCBjb21waWxlZCBieSBNb3ppbGxhLgogKgogKiBUbyBhZGQgYSBjdXN0b20gdHJ1c3RlZCBjZXJ0aWZpY2F0ZSBhdXRob3JpdHksIG9yIHRvIHNlbmQgYSBjbGllbnQKICogY2VydGlmaWNhdGUgdG8gc2VydmVycyB0aGF0IHJlcXVlc3Qgb25lLCBwYXNzIGEgW1NlY3VyaXR5Q29udGV4dF0gb2JqZWN0CiAqIGFzIHRoZSBvcHRpb25hbCBgY29udGV4dGAgYXJndW1lbnQgdG8gdGhlIGBIdHRwQ2xpZW50YCBjb25zdHJ1Y3Rvci4KICogVGhlIGRlc2lyZWQgc2VjdXJpdHkgb3B0aW9ucyBjYW4gYmUgc2V0IG9uIHRoZSBbU2VjdXJpdHlDb250ZXh0XSBvYmplY3QuCiAqCiAqICMjIEhlYWRlcnMKICoKICogQWxsIEh0dHBDbGllbnQgcmVxdWVzdHMgc2V0IHRoZSBmb2xsb3dpbmcgaGVhZGVyIGJ5IGRlZmF1bHQ6CiAqCiAqICAgICBBY2NlcHQtRW5jb2Rpbmc6IGd6aXAKICoKICogVGhpcyBhbGxvd3MgdGhlIEhUVFAgc2VydmVyIHRvIHVzZSBnemlwIGNvbXByZXNzaW9uIGZvciB0aGUgYm9keSBpZgogKiBwb3NzaWJsZS4gSWYgdGhpcyBiZWhhdmlvciBpcyBub3QgZGVzaXJlZCBzZXQgdGhlCiAqIGBBY2NlcHQtRW5jb2RpbmdgIGhlYWRlciB0byBzb21ldGhpbmcgZWxzZS4KICogVG8gdHVybiBvZmYgZ3ppcCBjb21wcmVzc2lvbiBvZiB0aGUgcmVzcG9uc2UsIGNsZWFyIHRoaXMgaGVhZGVyOgogKgogKiAgICAgIHJlcXVlc3QuaGVhZGVycy5yZW1vdmVBbGwoSHR0cEhlYWRlcnMuYWNjZXB0RW5jb2RpbmdIZWFkZXIpCiAqCiAqICMjIENsb3NpbmcgdGhlIEh0dHBDbGllbnQKICoKICogVGhlIEh0dHBDbGllbnQgc3VwcG9ydHMgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBhbmQgY2FjaGVzIG5ldHdvcmsKICogY29ubmVjdGlvbnMgdG8gcmV1c2UgdGhlbSBmb3IgbXVsdGlwbGUgcmVxdWVzdHMgd2hlbmV2ZXIKICogcG9zc2libGUuIFRoaXMgbWVhbnMgdGhhdCBuZXR3b3JrIGNvbm5lY3Rpb25zIGNhbiBiZSBrZXB0IG9wZW4gZm9yCiAqIHNvbWUgdGltZSBhZnRlciBhIHJlcXVlc3QgaGFzIGNvbXBsZXRlZC4gVXNlIEh0dHBDbGllbnQuY2xvc2UKICogdG8gZm9yY2UgdGhlIEh0dHBDbGllbnQgb2JqZWN0IHRvIHNodXQgZG93biBhbmQgdG8gY2xvc2UgdGhlIGlkbGUKICogbmV0d29yayBjb25uZWN0aW9ucy4KICoKICogIyMgVHVybmluZyBwcm94aWVzIG9uIGFuZCBvZmYKICoKICogQnkgZGVmYXVsdCB0aGUgSHR0cENsaWVudCB1c2VzIHRoZSBwcm94eSBjb25maWd1cmF0aW9uIGF2YWlsYWJsZQogKiBmcm9tIHRoZSBlbnZpcm9ubWVudCwgc2VlIFtmaW5kUHJveHlGcm9tRW52aXJvbm1lbnRdLiBUbyB0dXJuIG9mZgogKiB0aGUgdXNlIG9mIHByb3hpZXMgc2V0IHRoZSBbZmluZFByb3h5XSBwcm9wZXJ0eSB0bwogKiBbOm51bGw6XS4KICoKICogICAgIEh0dHBDbGllbnQgY2xpZW50ID0gbmV3IEh0dHBDbGllbnQoKTsKICogICAgIGNsaWVudC5maW5kUHJveHkgPSBudWxsOwogKi8KYWJzdHJhY3QgY2xhc3MgSHR0cENsaWVudCB7CiAgc3RhdGljIGNvbnN0IGludCBkZWZhdWx0SHR0cFBvcnQgPSA4MDsKICBARGVwcmVjYXRlZCgiVXNlIGRlZmF1bHRIdHRwUG9ydCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfSFRUUF9QT1JUID0gZGVmYXVsdEh0dHBQb3J0OwoKICBzdGF0aWMgY29uc3QgaW50IGRlZmF1bHRIdHRwc1BvcnQgPSA0NDM7CiAgQERlcHJlY2F0ZWQoIlVzZSBkZWZhdWx0SHR0cHNQb3J0IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9IVFRQU19QT1JUID0gZGVmYXVsdEh0dHBzUG9ydDsKCiAgLy8vIEdldHMgYW5kIHNldHMgdGhlIGlkbGUgdGltZW91dCBvZiBub24tYWN0aXZlIHBlcnNpc3RlbnQgKGtlZXAtYWxpdmUpCiAgLy8vIGNvbm5lY3Rpb25zLgogIC8vLwogIC8vLyBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBzZWNvbmRzLgogIER1cmF0aW9uIGlkbGVUaW1lb3V0OwoKICAvLy8gR2V0cyBhbmQgc2V0cyB0aGUgY29ubmVjdGlvbiB0aW1lb3V0LgogIC8vLwogIC8vLyBXaGVuIGNvbm5lY3RpbmcgdG8gYSBuZXcgaG9zdCBleGNlZWRzIHRoaXMgdGltZW91dCwgYSBbU29ja2V0RXhjZXB0aW9uXQogIC8vLyBpcyB0aHJvd24uIFRoZSB0aW1lb3V0IGFwcGxpZXMgb25seSB0byBjb25uZWN0aW9ucyBpbml0aWF0ZWQgYWZ0ZXIgdGhlCiAgLy8vIHRpbWVvdXQgaXMgc2V0LgogIC8vLwogIC8vLyBXaGVuIHRoaXMgaXMgYG51bGxgLCB0aGUgT1MgZGVmYXVsdCB0aW1lb3V0IGlzIHVzZWQuIFRoZSBkZWZhdWx0IGlzCiAgLy8vIGBudWxsYC4KICBEdXJhdGlvbiBjb25uZWN0aW9uVGltZW91dDsKCiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGl2ZSBjb25uZWN0aW9ucywgdG8gYSBzaW5nbGUgaG9zdC4KICAgKgogICAqIEluY3JlYXNpbmcgdGhpcyBudW1iZXIgbWF5IGxvd2VyIHBlcmZvcm1hbmNlIGFuZCB0YWtlIHVwIHVud2FudGVkCiAgICogc3lzdGVtIHJlc291cmNlcy4KICAgKgogICAqIFRvIGRpc2FibGUsIHNldCB0byBgbnVsbGAuCiAgICoKICAgKiBEZWZhdWx0IGlzIGBudWxsYC4KICAgKi8KICBpbnQgbWF4Q29ubmVjdGlvbnNQZXJIb3N0OwoKICAvKioKICAgKiBHZXRzIGFuZCBzZXRzIHdoZXRoZXIgdGhlIGJvZHkgb2YgYSByZXNwb25zZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKICAgKiB1bmNvbXByZXNzZWQuCiAgICoKICAgKiBUaGUgYm9keSBvZiBhbiBIVFRQIHJlc3BvbnNlIGNhbiBiZSBjb21wcmVzc2VkLiBJbiBtb3N0CiAgICogc2l0dWF0aW9ucyBwcm92aWRpbmcgdGhlIHVuLWNvbXByZXNzZWQgYm9keSBpcyBtb3N0CiAgICogY29udmVuaWVudC4gVGhlcmVmb3JlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHVuLWNvbXByZXNzIHRoZQogICAqIGJvZHkuIEhvd2V2ZXIgaW4gc29tZSBzaXR1YXRpb25zIChlLmcuIGltcGxlbWVudGluZyBhIHRyYW5zcGFyZW50CiAgICogcHJveHkpIGtlZXBpbmcgdGhlIHVuY29tcHJlc3NlZCBzdHJlYW0gaXMgcmVxdWlyZWQuCiAgICoKICAgKiBOT1RFOiBIZWFkZXJzIGluIHRoZSByZXNwb25zZSBhcmUgbmV2ZXIgbW9kaWZpZWQuIFRoaXMgbWVhbnMKICAgKiB0aGF0IHdoZW4gYXV0b21hdGljIHVuLWNvbXByZXNzaW9uIGlzIHR1cm5lZCBvbiB0aGUgdmFsdWUgb2YgdGhlCiAgICogaGVhZGVyIGBDb250ZW50LUxlbmd0aGAgd2lsbCByZWZsZWN0IHRoZSBsZW5ndGggb2YgdGhlIG9yaWdpbmFsCiAgICogY29tcHJlc3NlZCBib2R5LiBMaWtld2lzZSB0aGUgaGVhZGVyIGBDb250ZW50LUVuY29kaW5nYCB3aWxsIGFsc28KICAgKiBoYXZlIHRoZSBvcmlnaW5hbCB2YWx1ZSBpbmRpY2F0aW5nIGNvbXByZXNzaW9uLgogICAqCiAgICogTk9URTogQXV0b21hdGljIHVuLWNvbXByZXNzaW9uIGlzIG9ubHkgcGVyZm9ybWVkIGlmIHRoZQogICAqIGBDb250ZW50LUVuY29kaW5nYCBoZWFkZXIgdmFsdWUgaXMgYGd6aXBgLgogICAqCiAgICogVGhpcyB2YWx1ZSBhZmZlY3RzIGFsbCByZXNwb25zZXMgcHJvZHVjZWQgYnkgdGhpcyBjbGllbnQgYWZ0ZXIgdGhlCiAgICogdmFsdWUgaXMgY2hhbmdlZC4KICAgKgogICAqIFRvIGRpc2FibGUsIHNldCB0byBgZmFsc2VgLgogICAqCiAgICogRGVmYXVsdCBpcyBgdHJ1ZWAuCiAgICovCiAgYm9vbCBhdXRvVW5jb21wcmVzczsKCiAgLy8vIEdldHMgYW5kIHNldHMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGBVc2VyLUFnZW50YCBoZWFkZXIgZm9yIGFsbCByZXF1ZXN0cwogIC8vLyBnZW5lcmF0ZWQgYnkgdGhpcyBbSHR0cENsaWVudF0uCiAgLy8vCiAgLy8vIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBEYXJ0Lzx2ZXJzaW9uPiAoZGFydDppbylgLgogIC8vLwogIC8vLyBJZiB0aGUgdXNlckFnZW50IGlzIHNldCB0byBgbnVsbGAsIG5vIGRlZmF1bHQgYFVzZXItQWdlbnRgIGhlYWRlciB3aWxsIGJlCiAgLy8vIGFkZGVkIHRvIGVhY2ggcmVxdWVzdC4KICBTdHJpbmcgdXNlckFnZW50OwoKICBmYWN0b3J5IEh0dHBDbGllbnQoe1NlY3VyaXR5Q29udGV4dCBjb250ZXh0fSkgewogICAgSHR0cE92ZXJyaWRlcyBvdmVycmlkZXMgPSBIdHRwT3ZlcnJpZGVzLmN1cnJlbnQ7CiAgICBpZiAob3ZlcnJpZGVzID09IG51bGwpIHsKICAgICAgcmV0dXJuIG5ldyBfSHR0cENsaWVudChjb250ZXh0KTsKICAgIH0KICAgIHJldHVybiBvdmVycmlkZXMuY3JlYXRlSHR0cENsaWVudChjb250ZXh0KTsKICB9CgogIC8qKgogICAqIE9wZW5zIGEgSFRUUCBjb25uZWN0aW9uLgogICAqCiAgICogVGhlIEhUVFAgbWV0aG9kIHRvIHVzZSBpcyBzcGVjaWZpZWQgaW4gW21ldGhvZF0sIHRoZSBzZXJ2ZXIgaXMKICAgKiBzcGVjaWZpZWQgdXNpbmcgW2hvc3RdIGFuZCBbcG9ydF0sIGFuZCB0aGUgcGF0aCAoaW5jbHVkaW5nCiAgICogYSBwb3NzaWJsZSBxdWVyeSkgaXMgc3BlY2lmaWVkIHVzaW5nIFtwYXRoXS4KICAgKiBUaGUgcGF0aCBtYXkgYWxzbyBjb250YWluIGEgVVJJIGZyYWdtZW50LCB3aGljaCB3aWxsIGJlIGlnbm9yZWQuCiAgICoKICAgKiBUaGUgYEhvc3RgIGhlYWRlciBmb3IgdGhlIHJlcXVlc3Qgd2lsbCBiZSBzZXQgdG8gdGhlIHZhbHVlIFtob3N0XTpbcG9ydF0KICAgKiAoaWYgW2hvc3RdIGlzIGFuIElQIGFkZHJlc3MsIGl0IHdpbGwgc3RpbGwgYmUgdXNlZCBpbiB0aGUgYEhvc3RgIGhlYWRlcikuCiAgICogVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiB0aHJvdWdoIHRoZSBbSHR0cENsaWVudFJlcXVlc3RdIGludGVyZmFjZSBiZWZvcmUKICAgKiB0aGUgcmVxdWVzdCBpcyBzZW50LgogICAqCiAgICogRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gdGhlIHNlcXVlbmNlIG9mIGV2ZW50cyBkdXJpbmcgYW4KICAgKiBIVFRQIHRyYW5zYWN0aW9uLCBhbmQgdGhlIG9iamVjdHMgcmV0dXJuZWQgYnkgdGhlIGZ1dHVyZXMsIHNlZQogICAqIHRoZSBvdmVyYWxsIGRvY3VtZW50YXRpb24gZm9yIHRoZSBjbGFzcyBbSHR0cENsaWVudF0uCiAgICovCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBvcGVuKAogICAgICBTdHJpbmcgbWV0aG9kLCBTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyBwYXRoKTsKCiAgLyoqCiAgICogT3BlbnMgYSBIVFRQIGNvbm5lY3Rpb24uCiAgICoKICAgKiBUaGUgSFRUUCBtZXRob2QgaXMgc3BlY2lmaWVkIGluIFttZXRob2RdIGFuZCB0aGUgVVJMIHRvIHVzZSBpbgogICAqIFt1cmxdLgogICAqCiAgICogVGhlIGBIb3N0YCBoZWFkZXIgZm9yIHRoZSByZXF1ZXN0IHdpbGwgYmUgc2V0IHRvIHRoZSB2YWx1ZQogICAqIFtVcmkuaG9zdF06W1VyaS5wb3J0XSBmcm9tIFt1cmxdIChpZiBbdXJsLmhvc3RdIGlzIGFuIElQIGFkZHJlc3MsIGl0IHdpbGwKICAgKiBzdGlsbCBiZSB1c2VkIGluIHRoZSBgSG9zdGAgaGVhZGVyKS4gVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiB0aHJvdWdoIHRoZQogICAqIFtIdHRwQ2xpZW50UmVxdWVzdF0gaW50ZXJmYWNlIGJlZm9yZSB0aGUgcmVxdWVzdCBpcyBzZW50LgogICAqCiAgICogRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gdGhlIHNlcXVlbmNlIG9mIGV2ZW50cyBkdXJpbmcgYW4KICAgKiBIVFRQIHRyYW5zYWN0aW9uLCBhbmQgdGhlIG9iamVjdHMgcmV0dXJuZWQgYnkgdGhlIGZ1dHVyZXMsIHNlZQogICAqIHRoZSBvdmVyYWxsIGRvY3VtZW50YXRpb24gZm9yIHRoZSBjbGFzcyBbSHR0cENsaWVudF0uCiAgICovCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBvcGVuVXJsKFN0cmluZyBtZXRob2QsIFVyaSB1cmwpOwoKICAvKioKICAgKiBPcGVucyBhIEhUVFAgY29ubmVjdGlvbiB1c2luZyB0aGUgR0VUIG1ldGhvZC4KICAgKgogICAqIFRoZSBzZXJ2ZXIgaXMgc3BlY2lmaWVkIHVzaW5nIFtob3N0XSBhbmQgW3BvcnRdLCBhbmQgdGhlIHBhdGgKICAgKiAoaW5jbHVkaW5nIGEgcG9zc2libGUgcXVlcnkpIGlzIHNwZWNpZmllZCB1c2luZwogICAqIFtwYXRoXS4KICAgKgogICAqIFNlZSBbb3Blbl0gZm9yIGRldGFpbHMuCiAgICovCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBnZXQoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBTdHJpbmcgcGF0aCk7CgogIC8qKgogICAqIE9wZW5zIGEgSFRUUCBjb25uZWN0aW9uIHVzaW5nIHRoZSBHRVQgbWV0aG9kLgogICAqCiAgICogVGhlIFVSTCB0byB1c2UgaXMgc3BlY2lmaWVkIGluIFt1cmxdLgogICAqCiAgICogU2VlIFtvcGVuVXJsXSBmb3IgZGV0YWlscy4KICAgKi8KICBGdXR1cmU8SHR0cENsaWVudFJlcXVlc3Q+IGdldFVybChVcmkgdXJsKTsKCiAgLyoqCiAgICogT3BlbnMgYSBIVFRQIGNvbm5lY3Rpb24gdXNpbmcgdGhlIFBPU1QgbWV0aG9kLgogICAqCiAgICogVGhlIHNlcnZlciBpcyBzcGVjaWZpZWQgdXNpbmcgW2hvc3RdIGFuZCBbcG9ydF0sIGFuZCB0aGUgcGF0aAogICAqIChpbmNsdWRpbmcgYSBwb3NzaWJsZSBxdWVyeSkgaXMgc3BlY2lmaWVkIHVzaW5nCiAgICogW3BhdGhdLgogICAqCiAgICogU2VlIFtvcGVuXSBmb3IgZGV0YWlscy4KICAgKi8KICBGdXR1cmU8SHR0cENsaWVudFJlcXVlc3Q+IHBvc3QoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBTdHJpbmcgcGF0aCk7CgogIC8qKgogICAqIE9wZW5zIGEgSFRUUCBjb25uZWN0aW9uIHVzaW5nIHRoZSBQT1NUIG1ldGhvZC4KICAgKgogICAqIFRoZSBVUkwgdG8gdXNlIGlzIHNwZWNpZmllZCBpbiBbdXJsXS4KICAgKgogICAqIFNlZSBbb3BlblVybF0gZm9yIGRldGFpbHMuCiAgICovCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBwb3N0VXJsKFVyaSB1cmwpOwoKICAvKioKICAgKiBPcGVucyBhIEhUVFAgY29ubmVjdGlvbiB1c2luZyB0aGUgUFVUIG1ldGhvZC4KICAgKgogICAqIFRoZSBzZXJ2ZXIgaXMgc3BlY2lmaWVkIHVzaW5nIFtob3N0XSBhbmQgW3BvcnRdLCBhbmQgdGhlIHBhdGgKICAgKiAoaW5jbHVkaW5nIGEgcG9zc2libGUgcXVlcnkpIGlzIHNwZWNpZmllZCB1c2luZyBbcGF0aF0uCiAgICoKICAgKiBTZWUgW29wZW5dIGZvciBkZXRhaWxzLgogICAqLwogIEZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD4gcHV0KFN0cmluZyBob3N0LCBpbnQgcG9ydCwgU3RyaW5nIHBhdGgpOwoKICAvKioKICAgKiBPcGVucyBhIEhUVFAgY29ubmVjdGlvbiB1c2luZyB0aGUgUFVUIG1ldGhvZC4KICAgKgogICAqIFRoZSBVUkwgdG8gdXNlIGlzIHNwZWNpZmllZCBpbiBbdXJsXS4KICAgKgogICAqIFNlZSBbb3BlblVybF0gZm9yIGRldGFpbHMuCiAgICovCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBwdXRVcmwoVXJpIHVybCk7CgogIC8qKgogICAqIE9wZW5zIGEgSFRUUCBjb25uZWN0aW9uIHVzaW5nIHRoZSBERUxFVEUgbWV0aG9kLgogICAqCiAgICogVGhlIHNlcnZlciBpcyBzcGVjaWZpZWQgdXNpbmcgW2hvc3RdIGFuZCBbcG9ydF0sIGFuZCB0aGUgcGF0aAogICAqIChpbmNsdWRpbmcgYSBwb3NzaWJsZSBxdWVyeSkgaXMgc3BlY2lmaWVkIHVzaW5nIFtwYXRoXS4KICAgKgogICAqIFNlZSBbb3Blbl0gZm9yIGRldGFpbHMuCiAgICovCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBkZWxldGUoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBTdHJpbmcgcGF0aCk7CgogIC8qKgogICAqIE9wZW5zIGEgSFRUUCBjb25uZWN0aW9uIHVzaW5nIHRoZSBERUxFVEUgbWV0aG9kLgogICAqCiAgICogVGhlIFVSTCB0byB1c2UgaXMgc3BlY2lmaWVkIGluIFt1cmxdLgogICAqCiAgICogU2VlIFtvcGVuVXJsXSBmb3IgZGV0YWlscy4KICAgKi8KICBGdXR1cmU8SHR0cENsaWVudFJlcXVlc3Q+IGRlbGV0ZVVybChVcmkgdXJsKTsKCiAgLyoqCiAgICogT3BlbnMgYSBIVFRQIGNvbm5lY3Rpb24gdXNpbmcgdGhlIFBBVENIIG1ldGhvZC4KICAgKgogICAqIFRoZSBzZXJ2ZXIgaXMgc3BlY2lmaWVkIHVzaW5nIFtob3N0XSBhbmQgW3BvcnRdLCBhbmQgdGhlIHBhdGgKICAgKiAoaW5jbHVkaW5nIGEgcG9zc2libGUgcXVlcnkpIGlzIHNwZWNpZmllZCB1c2luZyBbcGF0aF0uCiAgICoKICAgKiBTZWUgW29wZW5dIGZvciBkZXRhaWxzLgogICAqLwogIEZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD4gcGF0Y2goU3RyaW5nIGhvc3QsIGludCBwb3J0LCBTdHJpbmcgcGF0aCk7CgogIC8qKgogICAqIE9wZW5zIGEgSFRUUCBjb25uZWN0aW9uIHVzaW5nIHRoZSBQQVRDSCBtZXRob2QuCiAgICoKICAgKiBUaGUgVVJMIHRvIHVzZSBpcyBzcGVjaWZpZWQgaW4gW3VybF0uCiAgICoKICAgKiBTZWUgW29wZW5VcmxdIGZvciBkZXRhaWxzLgogICAqLwogIEZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD4gcGF0Y2hVcmwoVXJpIHVybCk7CgogIC8qKgogICAqIE9wZW5zIGEgSFRUUCBjb25uZWN0aW9uIHVzaW5nIHRoZSBIRUFEIG1ldGhvZC4KICAgKgogICAqIFRoZSBzZXJ2ZXIgaXMgc3BlY2lmaWVkIHVzaW5nIFtob3N0XSBhbmQgW3BvcnRdLCBhbmQgdGhlIHBhdGgKICAgKiAoaW5jbHVkaW5nIGEgcG9zc2libGUgcXVlcnkpIGlzIHNwZWNpZmllZCB1c2luZyBbcGF0aF0uCiAgICoKICAgKiBTZWUgW29wZW5dIGZvciBkZXRhaWxzLgogICAqLwogIEZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD4gaGVhZChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyBwYXRoKTsKCiAgLyoqCiAgICogT3BlbnMgYSBIVFRQIGNvbm5lY3Rpb24gdXNpbmcgdGhlIEhFQUQgbWV0aG9kLgogICAqCiAgICogVGhlIFVSTCB0byB1c2UgaXMgc3BlY2lmaWVkIGluIFt1cmxdLgogICAqCiAgICogU2VlIFtvcGVuVXJsXSBmb3IgZGV0YWlscy4KICAgKi8KICBGdXR1cmU8SHR0cENsaWVudFJlcXVlc3Q+IGhlYWRVcmwoVXJpIHVybCk7CgogIC8qKgogICAqIFNldHMgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGEgc2l0ZSBpcyByZXF1ZXN0aW5nCiAgICogYXV0aGVudGljYXRpb24uIFRoZSBVUkwgcmVxdWVzdGVkIGFuZCB0aGUgc2VjdXJpdHkgcmVhbG0gZnJvbSB0aGUKICAgKiBzZXJ2ZXIgYXJlIHBhc3NlZCBpbiB0aGUgYXJndW1lbnRzIFt1cmxdIGFuZCBbcmVhbG1dLgogICAqCiAgICogVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBbRnV0dXJlXSB3aGljaCBzaG91bGQgY29tcGxldGUgd2hlbiB0aGUKICAgKiBhdXRoZW50aWNhdGlvbiBoYXMgYmVlbiByZXNvbHZlZC4gSWYgY3JlZGVudGlhbHMgY2Fubm90IGJlCiAgICogcHJvdmlkZWQgdGhlIFtGdXR1cmVdIHNob3VsZCBjb21wbGV0ZSB3aXRoIFs6ZmFsc2U6XS4gSWYKICAgKiBjcmVkZW50aWFscyBhcmUgYXZhaWxhYmxlIHRoZSBmdW5jdGlvbiBzaG91bGQgYWRkIHRoZXNlIHVzaW5nCiAgICogW2FkZENyZWRlbnRpYWxzXSBiZWZvcmUgY29tcGxldGluZyB0aGUgW0Z1dHVyZV0gd2l0aCB0aGUgdmFsdWUKICAgKiBbOnRydWU6XS4KICAgKgogICAqIElmIHRoZSBbRnV0dXJlXSBjb21wbGV0ZXMgd2l0aCBbOnRydWU6XSB0aGUgcmVxdWVzdCB3aWxsIGJlIHJldHJpZWQKICAgKiB1c2luZyB0aGUgdXBkYXRlZCBjcmVkZW50aWFscywgaG93ZXZlciwgdGhlIHJldHJpZWQgcmVxdWVzdCB3aWxsIG5vdAogICAqIGNhcnJ5IHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBheWxvYWQuIE90aGVyd2lzZSByZXNwb25zZSBwcm9jZXNzaW5nIHdpbGwKICAgKiBjb250aW51ZSBub3JtYWxseS4KICAgKgogICAqIElmIGl0IGlzIGtub3duIHRoYXQgdGhlIHJlbW90ZSBzZXJ2ZXIgcmVxdWlyZXMgYXV0aGVudGljYXRpb24gZm9yIGFsbAogICAqIHJlcXVlc3RzLCBpdCBpcyBhZHZpc2FibGUgdG8gdXNlIFthZGRDcmVkZW50aWFsc10gZGlyZWN0bHksIG9yIG1hbnVhbGx5CiAgICogc2V0IHRoZSBgJ2F1dGhvcml6YXRpb24nYCBoZWFkZXIgb24gdGhlIHJlcXVlc3QgdG8gYXZvaWQgdGhlIG92ZXJoZWFkCiAgICogb2YgYSBmYWlsZWQgcmVxdWVzdCwgb3IgaXNzdWVzIGR1ZSB0byBtaXNzaW5nIHJlcXVlc3QgcGF5bG9hZCBvbiByZXRyaWVkCiAgICogcmVxdWVzdC4KICAgKi8KICBzZXQgYXV0aGVudGljYXRlKEZ1dHVyZTxib29sPiBmKFVyaSB1cmwsIFN0cmluZyBzY2hlbWUsIFN0cmluZyByZWFsbSkpOwoKICAvKioKICAgKiBBZGQgY3JlZGVudGlhbHMgdG8gYmUgdXNlZCBmb3IgYXV0aG9yaXppbmcgSFRUUCByZXF1ZXN0cy4KICAgKi8KICB2b2lkIGFkZENyZWRlbnRpYWxzKFVyaSB1cmwsIFN0cmluZyByZWFsbSwgSHR0cENsaWVudENyZWRlbnRpYWxzIGNyZWRlbnRpYWxzKTsKCiAgLyoqCiAgICogU2V0cyB0aGUgZnVuY3Rpb24gdXNlZCB0byByZXNvbHZlIHRoZSBwcm94eSBzZXJ2ZXIgdG8gYmUgdXNlZCBmb3IKICAgKiBvcGVuaW5nIGEgSFRUUCBjb25uZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgW3VybF0uIElmIHRoaXMKICAgKiBmdW5jdGlvbiBpcyBub3Qgc2V0LCBkaXJlY3QgY29ubmVjdGlvbnMgd2lsbCBhbHdheXMgYmUgdXNlZC4KICAgKgogICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgW2ZdIG11c3QgYmUgaW4gdGhlIGZvcm1hdCB1c2VkIGJ5IGJyb3dzZXIKICAgKiBQQUMgKHByb3h5IGF1dG8tY29uZmlnKSBzY3JpcHRzLiBUaGF0IGlzIGVpdGhlcgogICAqCiAgICogICAgICJESVJFQ1QiCiAgICoKICAgKiBmb3IgdXNpbmcgYSBkaXJlY3QgY29ubmVjdGlvbiBvcgogICAqCiAgICogICAgICJQUk9YWSBob3N0OnBvcnQiCiAgICoKICAgKiBmb3IgdXNpbmcgdGhlIHByb3h5IHNlcnZlciBbOmhvc3Q6XSBvbiBwb3J0IFs6cG9ydDpdLgogICAqCiAgICogQSBjb25maWd1cmF0aW9uIGNhbiBjb250YWluIHNldmVyYWwgY29uZmlndXJhdGlvbiBlbGVtZW50cwogICAqIHNlcGFyYXRlZCBieSBzZW1pY29sb25zLCBlLmcuCiAgICoKICAgKiAgICAgIlBST1hZIGhvc3Q6cG9ydDsgUFJPWFkgaG9zdDI6cG9ydDI7IERJUkVDVCIKICAgKgogICAqIFRoZSBzdGF0aWMgZnVuY3Rpb24gW2ZpbmRQcm94eUZyb21FbnZpcm9ubWVudF0gb24gdGhpcyBjbGFzcyBjYW4KICAgKiBiZSB1c2VkIHRvIGltcGxlbWVudCBwcm94eSBzZXJ2ZXIgcmVzb2x2aW5nIGJhc2VkIG9uIGVudmlyb25tZW50CiAgICogdmFyaWFibGVzLgogICAqLwogIHNldCBmaW5kUHJveHkoU3RyaW5nIGYoVXJpIHVybCkpOwoKICAvKioKICAgKiBGdW5jdGlvbiBmb3IgcmVzb2x2aW5nIHRoZSBwcm94eSBzZXJ2ZXIgdG8gYmUgdXNlZCBmb3IgYSBIVFRQCiAgICogY29ubmVjdGlvbiBmcm9tIHRoZSBwcm94eSBjb25maWd1cmF0aW9uIHNwZWNpZmllZCB0aHJvdWdoCiAgICogZW52aXJvbm1lbnQgdmFyaWFibGVzLgogICAqCiAgICogVGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHRha2VuIGludG8gYWNjb3VudDoKICAgKgogICAqICAgICBodHRwX3Byb3h5CiAgICogICAgIGh0dHBzX3Byb3h5CiAgICogICAgIG5vX3Byb3h5CiAgICogICAgIEhUVFBfUFJPWFkKICAgKiAgICAgSFRUUFNfUFJPWFkKICAgKiAgICAgTk9fUFJPWFkKICAgKgogICAqIFs6aHR0cF9wcm94eTpdIGFuZCBbOkhUVFBfUFJPWFk6XSBzcGVjaWZ5IHRoZSBwcm94eSBzZXJ2ZXIgdG8gdXNlIGZvcgogICAqIGh0dHA6Ly8gdXJscy4gVXNlIHRoZSBmb3JtYXQgWzpob3N0bmFtZTpwb3J0Ol0uIElmIG5vIHBvcnQgaXMgdXNlZCBhCiAgICogZGVmYXVsdCBvZiAxMDgwIHdpbGwgYmUgdXNlZC4gSWYgYm90aCBhcmUgc2V0IHRoZSBsb3dlciBjYXNlIG9uZSB0YWtlcwogICAqIHByZWNlZGVuY2UuCiAgICoKICAgKiBbOmh0dHBzX3Byb3h5Ol0gYW5kIFs6SFRUUFNfUFJPWFk6XSBzcGVjaWZ5IHRoZSBwcm94eSBzZXJ2ZXIgdG8gdXNlIGZvcgogICAqIGh0dHBzOi8vIHVybHMuIFVzZSB0aGUgZm9ybWF0IFs6aG9zdG5hbWU6cG9ydDpdLiBJZiBubyBwb3J0IGlzIHVzZWQgYQogICAqIGRlZmF1bHQgb2YgMTA4MCB3aWxsIGJlIHVzZWQuIElmIGJvdGggYXJlIHNldCB0aGUgbG93ZXIgY2FzZSBvbmUgdGFrZXMKICAgKiBwcmVjZWRlbmNlLgogICAqCiAgICogWzpub19wcm94eTpdIGFuZCBbOk5PX1BST1hZOl0gc3BlY2lmeSBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mCiAgICogcG9zdGZpeGVzIG9mIGhvc3RuYW1lcyBmb3Igd2hpY2ggbm90IHRvIHVzZSB0aGUgcHJveHkKICAgKiBzZXJ2ZXIuIEUuZy4gdGhlIHZhbHVlICJsb2NhbGhvc3QsMTI3LjAuMC4xIiB3aWxsIG1ha2UgcmVxdWVzdHMKICAgKiB0byBib3RoICJsb2NhbGhvc3QiIGFuZCAiMTI3LjAuMC4xIiBub3QgdXNlIGEgcHJveHkuIElmIGJvdGggYXJlIHNldAogICAqIHRoZSBsb3dlciBjYXNlIG9uZSB0YWtlcyBwcmVjZWRlbmNlLgogICAqCiAgICogVG8gYWN0aXZhdGUgdGhpcyB3YXkgb2YgcmVzb2x2aW5nIHByb3hpZXMgYXNzaWduIHRoaXMgZnVuY3Rpb24gdG8KICAgKiB0aGUgW2ZpbmRQcm94eV0gcHJvcGVydHkgb24gdGhlIFtIdHRwQ2xpZW50XS4KICAgKgogICAqICAgICBIdHRwQ2xpZW50IGNsaWVudCA9IG5ldyBIdHRwQ2xpZW50KCk7CiAgICogICAgIGNsaWVudC5maW5kUHJveHkgPSBIdHRwQ2xpZW50LmZpbmRQcm94eUZyb21FbnZpcm9ubWVudDsKICAgKgogICAqIElmIHlvdSBkb24ndCB3YW50IHRvIHVzZSB0aGUgc3lzdGVtIGVudmlyb25tZW50IHlvdSBjYW4gdXNlIGEKICAgKiBkaWZmZXJlbnQgb25lIGJ5IHdyYXBwaW5nIHRoZSBmdW5jdGlvbi4KICAgKgogICAqICAgICBIdHRwQ2xpZW50IGNsaWVudCA9IG5ldyBIdHRwQ2xpZW50KCk7CiAgICogICAgIGNsaWVudC5maW5kUHJveHkgPSAodXJsKSB7CiAgICogICAgICAgcmV0dXJuIEh0dHBDbGllbnQuZmluZFByb3h5RnJvbUVudmlyb25tZW50KAogICAqICAgICAgICAgICB1cmwsIGVudmlyb25tZW50OiB7Imh0dHBfcHJveHkiOiAuLi4sICJub19wcm94eSI6IC4uLn0pOwogICAqICAgICB9CiAgICoKICAgKiBJZiBhIHByb3h5IHJlcXVpcmVzIGF1dGhlbnRpY2F0aW9uIGl0IGlzIHBvc3NpYmxlIHRvIGNvbmZpZ3VyZQogICAqIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgYXMgd2VsbC4gVXNlIHRoZSBmb3JtYXQKICAgKiBbOnVzZXJuYW1lOnBhc3N3b3JkQGhvc3RuYW1lOnBvcnQ6XSB0byBpbmNsdWRlIHRoZSB1c2VybmFtZSBhbmQKICAgKiBwYXNzd29yZC4gQWx0ZXJuYXRpdmVseSB0aGUgQVBJIFthZGRQcm94eUNyZWRlbnRpYWxzXSBjYW4gYmUgdXNlZAogICAqIHRvIHNldCBjcmVkZW50aWFscyBmb3IgcHJveGllcyB3aGljaCByZXF1aXJlIGF1dGhlbnRpY2F0aW9uLgogICAqLwogIHN0YXRpYyBTdHJpbmcgZmluZFByb3h5RnJvbUVudmlyb25tZW50KFVyaSB1cmwsCiAgICAgIHtNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50fSkgewogICAgSHR0cE92ZXJyaWRlcyBvdmVycmlkZXMgPSBIdHRwT3ZlcnJpZGVzLmN1cnJlbnQ7CiAgICBpZiAob3ZlcnJpZGVzID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9IdHRwQ2xpZW50Ll9maW5kUHJveHlGcm9tRW52aXJvbm1lbnQodXJsLCBlbnZpcm9ubWVudCk7CiAgICB9CiAgICByZXR1cm4gb3ZlcnJpZGVzLmZpbmRQcm94eUZyb21FbnZpcm9ubWVudCh1cmwsIGVudmlyb25tZW50KTsKICB9CgogIC8qKgogICAqIFNldHMgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGEgcHJveHkgaXMgcmVxdWVzdGluZwogICAqIGF1dGhlbnRpY2F0aW9uLiBJbmZvcm1hdGlvbiBvbiB0aGUgcHJveHkgaW4gdXNlIGFuZCB0aGUgc2VjdXJpdHkKICAgKiByZWFsbSBmb3IgdGhlIGF1dGhlbnRpY2F0aW9uIGFyZSBwYXNzZWQgaW4gdGhlIGFyZ3VtZW50cyBbaG9zdF0sCiAgICogW3BvcnRdIGFuZCBbcmVhbG1dLgogICAqCiAgICogVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBbRnV0dXJlXSB3aGljaCBzaG91bGQgY29tcGxldGUgd2hlbiB0aGUKICAgKiBhdXRoZW50aWNhdGlvbiBoYXMgYmVlbiByZXNvbHZlZC4gSWYgY3JlZGVudGlhbHMgY2Fubm90IGJlCiAgICogcHJvdmlkZWQgdGhlIFtGdXR1cmVdIHNob3VsZCBjb21wbGV0ZSB3aXRoIFs6ZmFsc2U6XS4gSWYKICAgKiBjcmVkZW50aWFscyBhcmUgYXZhaWxhYmxlIHRoZSBmdW5jdGlvbiBzaG91bGQgYWRkIHRoZXNlIHVzaW5nCiAgICogW2FkZFByb3h5Q3JlZGVudGlhbHNdIGJlZm9yZSBjb21wbGV0aW5nIHRoZSBbRnV0dXJlXSB3aXRoIHRoZSB2YWx1ZQogICAqIFs6dHJ1ZTpdLgogICAqCiAgICogSWYgdGhlIFtGdXR1cmVdIGNvbXBsZXRlcyB3aXRoIFs6dHJ1ZTpdIHRoZSByZXF1ZXN0IHdpbGwgYmUgcmV0cmllZAogICAqIHVzaW5nIHRoZSB1cGRhdGVkIGNyZWRlbnRpYWxzLiBPdGhlcndpc2UgcmVzcG9uc2UgcHJvY2Vzc2luZyB3aWxsCiAgICogY29udGludWUgbm9ybWFsbHkuCiAgICovCiAgc2V0IGF1dGhlbnRpY2F0ZVByb3h5KAogICAgICBGdXR1cmU8Ym9vbD4gZihTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyBzY2hlbWUsIFN0cmluZyByZWFsbSkpOwoKICAvKioKICAgKiBBZGQgY3JlZGVudGlhbHMgdG8gYmUgdXNlZCBmb3IgYXV0aG9yaXppbmcgSFRUUCBwcm94aWVzLgogICAqLwogIHZvaWQgYWRkUHJveHlDcmVkZW50aWFscygKICAgICAgU3RyaW5nIGhvc3QsIGludCBwb3J0LCBTdHJpbmcgcmVhbG0sIEh0dHBDbGllbnRDcmVkZW50aWFscyBjcmVkZW50aWFscyk7CgogIC8qKgogICAqIFNldHMgYSBjYWxsYmFjayB0aGF0IHdpbGwgZGVjaWRlIHdoZXRoZXIgdG8gYWNjZXB0IGEgc2VjdXJlIGNvbm5lY3Rpb24KICAgKiB3aXRoIGEgc2VydmVyIGNlcnRpZmljYXRlIHRoYXQgY2Fubm90IGJlIGF1dGhlbnRpY2F0ZWQgYnkgYW55IG9mIG91cgogICAqIHRydXN0ZWQgcm9vdCBjZXJ0aWZpY2F0ZXMuCiAgICoKICAgKiBXaGVuIGFuIHNlY3VyZSBIVFRQIHJlcXVlc3QgaWYgbWFkZSwgdXNpbmcgdGhpcyBIdHRwQ2xpZW50LCBhbmQgdGhlCiAgICogc2VydmVyIHJldHVybnMgYSBzZXJ2ZXIgY2VydGlmaWNhdGUgdGhhdCBjYW5ub3QgYmUgYXV0aGVudGljYXRlZCwgdGhlCiAgICogY2FsbGJhY2sgaXMgY2FsbGVkIGFzeW5jaHJvbm91c2x5IHdpdGggdGhlIFtYNTA5Q2VydGlmaWNhdGVdIG9iamVjdCBhbmQKICAgKiB0aGUgc2VydmVyJ3MgaG9zdG5hbWUgYW5kIHBvcnQuICBJZiB0aGUgdmFsdWUgb2YgW2JhZENlcnRpZmljYXRlQ2FsbGJhY2tdCiAgICogaXMgWzpudWxsOl0sIHRoZSBiYWQgY2VydGlmaWNhdGUgaXMgcmVqZWN0ZWQsIGFzIGlmIHRoZSBjYWxsYmFjawogICAqIHJldHVybmVkIFs6ZmFsc2U6XQogICAqCiAgICogSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgdHJ1ZSwgdGhlIHNlY3VyZSBjb25uZWN0aW9uIGlzIGFjY2VwdGVkIGFuZCB0aGUKICAgKiBbOkZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD46XSB0aGF0IHdhcyByZXR1cm5lZCBmcm9tIHRoZSBjYWxsIG1ha2luZyB0aGUKICAgKiByZXF1ZXN0IGNvbXBsZXRlcyB3aXRoIGEgdmFsaWQgSHR0cFJlcXVlc3Qgb2JqZWN0LiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucwogICAqIGZhbHNlLCB0aGUgWzpGdXR1cmU8SHR0cENsaWVudFJlcXVlc3Q+Ol0gY29tcGxldGVzIHdpdGggYW4gZXhjZXB0aW9uLgogICAqCiAgICogSWYgYSBiYWQgY2VydGlmaWNhdGUgaXMgcmVjZWl2ZWQgb24gYSBjb25uZWN0aW9uIGF0dGVtcHQsIHRoZSBsaWJyYXJ5IGNhbGxzCiAgICogdGhlIGZ1bmN0aW9uIHRoYXQgd2FzIHRoZSB2YWx1ZSBvZiBiYWRDZXJ0aWZpY2F0ZUNhbGxiYWNrIGF0IHRoZSB0aW1lCiAgICogdGhlIHJlcXVlc3QgaXMgbWFkZSwgZXZlbiBpZiB0aGUgdmFsdWUgb2YgYmFkQ2VydGlmaWNhdGVDYWxsYmFjawogICAqIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZW4uCiAgICovCiAgc2V0IGJhZENlcnRpZmljYXRlQ2FsbGJhY2soCiAgICAgIGJvb2wgY2FsbGJhY2soWDUwOUNlcnRpZmljYXRlIGNlcnQsIFN0cmluZyBob3N0LCBpbnQgcG9ydCkpOwoKICAvLy8gU2h1dHMgZG93biB0aGUgSFRUUCBjbGllbnQuCiAgLy8vCiAgLy8vIElmIFtmb3JjZV0gaXMgYGZhbHNlYCAodGhlIGRlZmF1bHQpIHRoZSBbSHR0cENsaWVudF0gd2lsbCBiZSBrZXB0IGFsaXZlCiAgLy8vIHVudGlsIGFsbCBhY3RpdmUgY29ubmVjdGlvbnMgYXJlIGRvbmUuIElmIFtmb3JjZV0gaXMgYHRydWVgIGFueSBhY3RpdmUKICAvLy8gY29ubmVjdGlvbnMgd2lsbCBiZSBjbG9zZWQgdG8gaW1tZWRpYXRlbHkgcmVsZWFzZSBhbGwgcmVzb3VyY2VzLiBUaGVzZQogIC8vLyBjbG9zZWQgY29ubmVjdGlvbnMgd2lsbCByZWNlaXZlIGFuIGVycm9yIGV2ZW50IHRvIGluZGljYXRlIHRoYXQgdGhlIGNsaWVudAogIC8vLyB3YXMgc2h1dCBkb3duLiBJbiBib3RoIGNhc2VzIHRyeWluZyB0byBlc3RhYmxpc2ggYSBuZXcgY29ubmVjdGlvbiBhZnRlcgogIC8vLyBjYWxsaW5nIFtjbG9zZV0gd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uCiAgdm9pZCBjbG9zZSh7Ym9vbCBmb3JjZTogZmFsc2V9KTsKfQoKLyoqCiAqIEhUVFAgcmVxdWVzdCBmb3IgYSBjbGllbnQgY29ubmVjdGlvbi4KICoKICogVG8gc2V0IHVwIGEgcmVxdWVzdCwgc2V0IHRoZSBoZWFkZXJzIHVzaW5nIHRoZSBoZWFkZXJzIHByb3BlcnR5CiAqIHByb3ZpZGVkIGluIHRoaXMgY2xhc3MgYW5kIHdyaXRlIHRoZSBkYXRhIHRvIHRoZSBib2R5IG9mIHRoZSByZXF1ZXN0LgogKiBIdHRwQ2xpZW50UmVxdWVzdCBpcyBhbiBbSU9TaW5rXS4gVXNlIHRoZSBtZXRob2RzIGZyb20gSU9TaW5rLAogKiBzdWNoIGFzIHdyaXRlQ2hhckNvZGUoKSwgdG8gd3JpdGUgdGhlIGJvZHkgb2YgdGhlIEhUVFAKICogcmVxdWVzdC4gV2hlbiBvbmUgb2YgdGhlIElPU2luayBtZXRob2RzIGlzIHVzZWQgZm9yIHRoZSBmaXJzdAogKiB0aW1lLCB0aGUgcmVxdWVzdCBoZWFkZXIgaXMgc2VudC4gQ2FsbGluZyBhbnkgbWV0aG9kcyB0aGF0CiAqIGNoYW5nZSB0aGUgaGVhZGVyIGFmdGVyIGl0IGlzIHNlbnQgdGhyb3dzIGFuIGV4Y2VwdGlvbi4KICoKICogV2hlbiB3cml0aW5nIHN0cmluZyBkYXRhIHRocm91Z2ggdGhlIFtJT1NpbmtdIHRoZQogKiBlbmNvZGluZyB1c2VkIGlzIGRldGVybWluZWQgZnJvbSB0aGUgImNoYXJzZXQiIHBhcmFtZXRlciBvZgogKiB0aGUgIkNvbnRlbnQtVHlwZSIgaGVhZGVyLgogKgogKiAgICAgSHR0cENsaWVudFJlcXVlc3QgcmVxdWVzdCA9IC4uLgogKiAgICAgcmVxdWVzdC5oZWFkZXJzLmNvbnRlbnRUeXBlCiAqICAgICAgICAgPSBuZXcgQ29udGVudFR5cGUoImFwcGxpY2F0aW9uIiwgImpzb24iLCBjaGFyc2V0OiAidXRmLTgiKTsKICogICAgIHJlcXVlc3Qud3JpdGUoLi4uKTsgIC8vIFN0cmluZ3Mgd3JpdHRlbiB3aWxsIGJlIFVURi04IGVuY29kZWQuCiAqCiAqIElmIG5vIGNoYXJzZXQgaXMgcHJvdmlkZWQgdGhlIGRlZmF1bHQgb2YgSVNPLTg4NTktMSAoTGF0aW4gMSkgaXMKICogYmUgdXNlZC4KICoKICogICAgIEh0dHBDbGllbnRSZXF1ZXN0IHJlcXVlc3QgPSAuLi4KICogICAgIHJlcXVlc3QuaGVhZGVycy5hZGQoSHR0cEhlYWRlcnMuY29udGVudFR5cGVIZWFkZXIsICJ0ZXh0L3BsYWluIik7CiAqICAgICByZXF1ZXN0LndyaXRlKC4uLik7ICAvLyBTdHJpbmdzIHdyaXR0ZW4gd2lsbCBiZSBJU08tODg1OS0xIGVuY29kZWQuCiAqCiAqIEFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgeW91IHVzZSBhbiB1bnN1cHBvcnRlZCBlbmNvZGluZyBhbmQgdGhlCiAqIGB3cml0ZSgpYCBtZXRob2QgYmVpbmcgdXNlZCB0YWtlcyBhIHN0cmluZyBwYXJhbWV0ZXIuCiAqLwphYnN0cmFjdCBjbGFzcyBIdHRwQ2xpZW50UmVxdWVzdCBpbXBsZW1lbnRzIElPU2luayB7CiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgcmVxdWVzdGVkIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBzdGF0ZS4KICAgKgogICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFs6dHJ1ZTpdLgogICAqLwogIGJvb2wgcGVyc2lzdGVudENvbm5lY3Rpb247CgogIC8qKgogICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIFs6dHJ1ZTpdIGlmIHRoaXMgcmVxdWVzdCBzaG91bGQKICAgKiBhdXRvbWF0aWNhbGx5IGZvbGxvdyByZWRpcmVjdHMuIFRoZSBkZWZhdWx0IGlzIFs6dHJ1ZTpdLgogICAqCiAgICogQXV0b21hdGljIHJlZGlyZWN0IHdpbGwgb25seSBoYXBwZW4gZm9yICJHRVQiIGFuZCAiSEVBRCIgcmVxdWVzdHMKICAgKiBhbmQgb25seSBmb3IgdGhlIHN0YXR1cyBjb2RlcyBbOkh0dHBTdGF0dXMubW92ZWRQZXJtYW5lbnRseTpdCiAgICogKDMwMSksIFs6SHR0cFN0YXR1cy5mb3VuZDpdICgzMDIpLAogICAqIFs6SHR0cFN0YXR1cy5tb3ZlZFRlbXBvcmFyaWx5Ol0gKDMwMiwgYWxpYXMgZm9yCiAgICogWzpIdHRwU3RhdHVzLmZvdW5kOl0pLCBbOkh0dHBTdGF0dXMuc2VlT3RoZXI6XSAoMzAzKSBhbmQKICAgKiBbOkh0dHBTdGF0dXMudGVtcG9yYXJ5UmVkaXJlY3Q6XSAoMzA3KS4gRm9yCiAgICogWzpIdHRwU3RhdHVzLnNlZU90aGVyOl0gKDMwMykgYXV0b21hdGljIHJlZGlyZWN0IHdpbGwgYWxzbyBoYXBwZW4KICAgKiBmb3IgIlBPU1QiIHJlcXVlc3RzIHdpdGggdGhlIG1ldGhvZCBjaGFuZ2VkIHRvICJHRVQiIHdoZW4KICAgKiBmb2xsb3dpbmcgdGhlIHJlZGlyZWN0LgogICAqCiAgICogQWxsIGhlYWRlcnMgYWRkZWQgdG8gdGhlIHJlcXVlc3Qgd2lsbCBiZSBhZGRlZCB0byB0aGUgcmVkaXJlY3Rpb24KICAgKiByZXF1ZXN0KHMpLiBIb3dldmVyLCBhbnkgYm9keSBzZW5kIHdpdGggdGhlIHJlcXVlc3Qgd2lsbCBub3QgYmUKICAgKiBwYXJ0IG9mIHRoZSByZWRpcmVjdGlvbiByZXF1ZXN0KHMpLgogICAqLwogIGJvb2wgZm9sbG93UmVkaXJlY3RzOwoKICAvKioKICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVkaXJlY3RzIHRvIGZvbGxvdwogICAqIHdoZW4gW2ZvbGxvd1JlZGlyZWN0c10gaXMgYHRydWVgLiBJZiB0aGlzIG51bWJlciBpcyBleGNlZWRlZAogICAqIGFuIGVycm9yIGV2ZW50IHdpbGwgYmUgYWRkZWQgd2l0aCBhIFtSZWRpcmVjdEV4Y2VwdGlvbl0uCiAgICoKICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA1LgogICAqLwogIGludCBtYXhSZWRpcmVjdHM7CgogIC8qKgogICAqIFRoZSBtZXRob2Qgb2YgdGhlIHJlcXVlc3QuCiAgICovCiAgU3RyaW5nIGdldCBtZXRob2Q7CgogIC8qKgogICAqIFRoZSB1cmkgb2YgdGhlIHJlcXVlc3QuCiAgICovCiAgVXJpIGdldCB1cmk7CgogIC8vLyBHZXRzIGFuZCBzZXRzIHRoZSBjb250ZW50IGxlbmd0aCBvZiB0aGUgcmVxdWVzdC4KICAvLy8KICAvLy8gSWYgdGhlIHNpemUgb2YgdGhlIHJlcXVlc3QgaXMgbm90IGtub3duIGluIGFkdmFuY2Ugc2V0IGNvbnRlbnQgbGVuZ3RoIHRvCiAgLy8vIC0xLCB3aGljaCBpcyBhbHNvIHRoZSBkZWZhdWx0LgogIGludCBjb250ZW50TGVuZ3RoOwoKICAvKioKICAgKiBHZXRzIG9yIHNldHMgaWYgdGhlIFtIdHRwQ2xpZW50UmVxdWVzdF0gc2hvdWxkIGJ1ZmZlciBvdXRwdXQuCiAgICoKICAgKiBEZWZhdWx0IHZhbHVlIGlzIGB0cnVlYC4KICAgKgogICAqIF9fTm90ZV9fOiBEaXNhYmxpbmcgYnVmZmVyaW5nIG9mIHRoZSBvdXRwdXQgY2FuIHJlc3VsdCBpbiB2ZXJ5IHBvb3IKICAgKiBwZXJmb3JtYW5jZSwgd2hlbiB3cml0aW5nIG1hbnkgc21hbGwgY2h1bmtzLgogICAqLwogIGJvb2wgYnVmZmVyT3V0cHV0OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBjbGllbnQgcmVxdWVzdCBoZWFkZXJzLgogICAqCiAgICogVGhlIGNsaWVudCByZXF1ZXN0IGhlYWRlcnMgY2FuIGJlIG1vZGlmaWVkIHVudGlsIHRoZSBjbGllbnQKICAgKiByZXF1ZXN0IGJvZHkgaXMgd3JpdHRlbiB0byBvciBjbG9zZWQuIEFmdGVyIHRoYXQgdGhleSBiZWNvbWUKICAgKiBpbW11dGFibGUuCiAgICovCiAgSHR0cEhlYWRlcnMgZ2V0IGhlYWRlcnM7CgogIC8qKgogICAqIENvb2tpZXMgdG8gcHJlc2VudCB0byB0aGUgc2VydmVyIChpbiB0aGUgJ2Nvb2tpZScgaGVhZGVyKS4KICAgKi8KICBMaXN0PENvb2tpZT4gZ2V0IGNvb2tpZXM7CgogIC8vLyBBIFtIdHRwQ2xpZW50UmVzcG9uc2VdIGZ1dHVyZSB0aGF0IHdpbGwgY29tcGxldGUgb25jZSB0aGUgcmVzcG9uc2UgaXMKICAvLy8gYXZhaWxhYmxlLgogIC8vLwogIC8vLyBJZiBhbiBlcnJvciBvY2N1cnMgYmVmb3JlIHRoZSByZXNwb25zZSBpcyBhdmFpbGFibGUsIHRoaXMgZnV0dXJlIHdpbGwKICAvLy8gY29tcGxldGUgd2l0aCBhbiBlcnJvci4KICBGdXR1cmU8SHR0cENsaWVudFJlc3BvbnNlPiBnZXQgZG9uZTsKCiAgLyoqCiAgICogQ2xvc2UgdGhlIHJlcXVlc3QgZm9yIGlucHV0LiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBbZG9uZV0uCiAgICovCiAgRnV0dXJlPEh0dHBDbGllbnRSZXNwb25zZT4gY2xvc2UoKTsKCiAgLy8vIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNsaWVudCBjb25uZWN0aW9uLgogIC8vLwogIC8vLyBSZXR1cm5zIFs6bnVsbDpdIGlmIHRoZSBzb2NrZXQgaXMgbm90IGF2YWlsYWJsZS4KICBIdHRwQ29ubmVjdGlvbkluZm8gZ2V0IGNvbm5lY3Rpb25JbmZvOwp9CgovKioKICogSFRUUCByZXNwb25zZSBmb3IgYSBjbGllbnQgY29ubmVjdGlvbi4KICoKICogVGhlIGJvZHkgb2YgYSBbSHR0cENsaWVudFJlc3BvbnNlXSBvYmplY3QgaXMgYQogKiBbU3RyZWFtXSBvZiBkYXRhIGZyb20gdGhlIHNlcnZlci4gTGlzdGVuIHRvIHRoZSBib2R5IHRvIGhhbmRsZQogKiB0aGUgZGF0YSBhbmQgYmUgbm90aWZpZWQgd2hlbiB0aGUgZW50aXJlIGJvZHkgaXMgcmVjZWl2ZWQuCiAqCiAqICAgICBuZXcgSHR0cENsaWVudCgpLmdldCgnbG9jYWxob3N0JywgODAsICcvZmlsZS50eHQnKQogKiAgICAgICAgICAudGhlbigoSHR0cENsaWVudFJlcXVlc3QgcmVxdWVzdCkgPT4gcmVxdWVzdC5jbG9zZSgpKQogKiAgICAgICAgICAudGhlbigoSHR0cENsaWVudFJlc3BvbnNlIHJlc3BvbnNlKSB7CiAqICAgICAgICAgICAgcmVzcG9uc2UudHJhbnNmb3JtKHV0ZjguZGVjb2RlcikubGlzdGVuKChjb250ZW50cykgewogKiAgICAgICAgICAgICAgLy8gaGFuZGxlIGRhdGEKICogICAgICAgICAgICB9KTsKICogICAgICAgICAgfSk7CiAqLwphYnN0cmFjdCBjbGFzcyBIdHRwQ2xpZW50UmVzcG9uc2UgaW1wbGVtZW50cyBTdHJlYW08TGlzdDxpbnQ+PiB7CiAgLyoqCiAgICogUmV0dXJucyB0aGUgc3RhdHVzIGNvZGUuCiAgICoKICAgKiBUaGUgc3RhdHVzIGNvZGUgbXVzdCBiZSBzZXQgYmVmb3JlIHRoZSBib2R5IGlzIHdyaXR0ZW4KICAgKiB0by4gU2V0dGluZyB0aGUgc3RhdHVzIGNvZGUgYWZ0ZXIgd3JpdGluZyB0byB0aGUgYm9keSB3aWxsIHRocm93CiAgICogYSBgU3RhdGVFcnJvcmAuCiAgICovCiAgaW50IGdldCBzdGF0dXNDb2RlOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSByZWFzb24gcGhyYXNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIGNvZGUuCiAgICoKICAgKiBUaGUgcmVhc29uIHBocmFzZSBtdXN0IGJlIHNldCBiZWZvcmUgdGhlIGJvZHkgaXMgd3JpdHRlbgogICAqIHRvLiBTZXR0aW5nIHRoZSByZWFzb24gcGhyYXNlIGFmdGVyIHdyaXRpbmcgdG8gdGhlIGJvZHkgd2lsbCB0aHJvdwogICAqIGEgYFN0YXRlRXJyb3JgLgogICAqLwogIFN0cmluZyBnZXQgcmVhc29uUGhyYXNlOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBjb250ZW50IGxlbmd0aCBvZiB0aGUgcmVzcG9uc2UgYm9keS4gUmV0dXJucyAtMSBpZiB0aGUgc2l6ZSBvZgogICAqIHRoZSByZXNwb25zZSBib2R5IGlzIG5vdCBrbm93biBpbiBhZHZhbmNlLgogICAqCiAgICogSWYgdGhlIGNvbnRlbnQgbGVuZ3RoIG5lZWRzIHRvIGJlIHNldCwgaXQgbXVzdCBiZSBzZXQgYmVmb3JlIHRoZQogICAqIGJvZHkgaXMgd3JpdHRlbiB0by4gU2V0dGluZyB0aGUgY29udGVudCBsZW5ndGggYWZ0ZXIgd3JpdGluZyB0byB0aGUgYm9keQogICAqIHdpbGwgdGhyb3cgYSBgU3RhdGVFcnJvcmAuCiAgICovCiAgaW50IGdldCBjb250ZW50TGVuZ3RoOwoKICAvKioKICAgKiBHZXRzIHRoZSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gc3RhdGUgcmV0dXJuZWQgYnkgdGhlIHNlcnZlci4KICAgKgogICAqIElmIHRoZSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gc3RhdGUgbmVlZHMgdG8gYmUgc2V0LCBpdCBtdXN0IGJlCiAgICogc2V0IGJlZm9yZSB0aGUgYm9keSBpcyB3cml0dGVuIHRvLiBTZXR0aW5nIHRoZSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gc3RhdGUKICAgKiBhZnRlciB3cml0aW5nIHRvIHRoZSBib2R5IHdpbGwgdGhyb3cgYSBgU3RhdGVFcnJvcmAuCiAgICovCiAgYm9vbCBnZXQgcGVyc2lzdGVudENvbm5lY3Rpb247CgogIC8qKgogICAqIFJldHVybnMgd2hldGhlciB0aGUgc3RhdHVzIGNvZGUgaXMgb25lIG9mIHRoZSBub3JtYWwgcmVkaXJlY3QKICAgKiBjb2RlcyBbSHR0cFN0YXR1cy5tb3ZlZFBlcm1hbmVudGx5XSwgW0h0dHBTdGF0dXMuZm91bmRdLAogICAqIFtIdHRwU3RhdHVzLm1vdmVkVGVtcG9yYXJpbHldLCBbSHR0cFN0YXR1cy5zZWVPdGhlcl0gYW5kCiAgICogW0h0dHBTdGF0dXMudGVtcG9yYXJ5UmVkaXJlY3RdLgogICAqLwogIGJvb2wgZ2V0IGlzUmVkaXJlY3Q7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHNlcmllcyBvZiByZWRpcmVjdHMgdGhpcyBjb25uZWN0aW9uIGhhcyBiZWVuIHRocm91Z2guIFRoZQogICAqIGxpc3Qgd2lsbCBiZSBlbXB0eSBpZiBubyByZWRpcmVjdHMgd2VyZSBmb2xsb3dlZC4gW3JlZGlyZWN0c10gd2lsbCBiZQogICAqIHVwZGF0ZWQgYm90aCBpbiB0aGUgY2FzZSBvZiBhbiBhdXRvbWF0aWMgYW5kIGEgbWFudWFsIHJlZGlyZWN0LgogICAqLwogIExpc3Q8UmVkaXJlY3RJbmZvPiBnZXQgcmVkaXJlY3RzOwoKICAvKioKICAgKiBSZWRpcmVjdHMgdGhpcyBjb25uZWN0aW9uIHRvIGEgbmV3IFVSTC4gVGhlIGRlZmF1bHQgdmFsdWUgZm9yCiAgICogW21ldGhvZF0gaXMgdGhlIG1ldGhvZCBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdC4gVGhlIGRlZmF1bHQgdmFsdWUKICAgKiBmb3IgW3VybF0gaXMgdGhlIHZhbHVlIG9mIHRoZSBbSHR0cEhlYWRlcnMubG9jYXRpb25IZWFkZXJdIGhlYWRlciBvZgogICAqIHRoZSBjdXJyZW50IHJlc3BvbnNlLiBBbGwgYm9keSBkYXRhIG11c3QgaGF2ZSBiZWVuIHJlYWQgZnJvbSB0aGUKICAgKiBjdXJyZW50IHJlc3BvbnNlIGJlZm9yZSBjYWxsaW5nIFtyZWRpcmVjdF0uCiAgICoKICAgKiBBbGwgaGVhZGVycyBhZGRlZCB0byB0aGUgcmVxdWVzdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSByZWRpcmVjdGlvbgogICAqIHJlcXVlc3QuIEhvd2V2ZXIsIGFueSBib2R5IHNlbnQgd2l0aCB0aGUgcmVxdWVzdCB3aWxsIG5vdCBiZQogICAqIHBhcnQgb2YgdGhlIHJlZGlyZWN0aW9uIHJlcXVlc3QuCiAgICoKICAgKiBJZiBbZm9sbG93TG9vcHNdIGlzIHNldCB0byBbOnRydWU6XSwgcmVkaXJlY3Qgd2lsbCBmb2xsb3cgdGhlIHJlZGlyZWN0LAogICAqIGV2ZW4gaWYgdGhlIFVSTCB3YXMgYWxyZWFkeSB2aXNpdGVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBbOmZhbHNlOl0uCiAgICoKICAgKiBUaGUgbWV0aG9kIHdpbGwgaWdub3JlIFtIdHRwQ2xpZW50UmVxdWVzdC5tYXhSZWRpcmVjdHNdCiAgICogYW5kIHdpbGwgYWx3YXlzIHBlcmZvcm0gdGhlIHJlZGlyZWN0LgogICAqLwogIEZ1dHVyZTxIdHRwQ2xpZW50UmVzcG9uc2U+IHJlZGlyZWN0KAogICAgICBbU3RyaW5nIG1ldGhvZCwgVXJpIHVybCwgYm9vbCBmb2xsb3dMb29wc10pOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBjbGllbnQgcmVzcG9uc2UgaGVhZGVycy4KICAgKgogICAqIFRoZSBjbGllbnQgcmVzcG9uc2UgaGVhZGVycyBhcmUgaW1tdXRhYmxlLgogICAqLwogIEh0dHBIZWFkZXJzIGdldCBoZWFkZXJzOwoKICAvKioKICAgKiBEZXRhY2ggdGhlIHVuZGVybHlpbmcgc29ja2V0IGZyb20gdGhlIEhUVFAgY2xpZW50LiBXaGVuIHRoZQogICAqIHNvY2tldCBpcyBkZXRhY2hlZCB0aGUgSFRUUCBjbGllbnQgd2lsbCBubyBsb25nZXIgcGVyZm9ybSBhbnkKICAgKiBvcGVyYXRpb25zIG9uIGl0LgogICAqCiAgICogVGhpcyBpcyBub3JtYWxseSB1c2VkIHdoZW4gYSBIVFRQIHVwZ3JhZGUgaXMgbmVnb3RpYXRlZCBhbmQgdGhlCiAgICogY29tbXVuaWNhdGlvbiBzaG91bGQgY29udGludWUgd2l0aCBhIGRpZmZlcmVudCBwcm90b2NvbC4KICAgKi8KICBGdXR1cmU8U29ja2V0PiBkZXRhY2hTb2NrZXQoKTsKCiAgLyoqCiAgICogQ29va2llcyBzZXQgYnkgdGhlIHNlcnZlciAoZnJvbSB0aGUgJ3NldC1jb29raWUnIGhlYWRlcikuCiAgICovCiAgTGlzdDxDb29raWU+IGdldCBjb29raWVzOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBjZXJ0aWZpY2F0ZSBvZiB0aGUgSFRUUFMgc2VydmVyIHByb3ZpZGluZyB0aGUgcmVzcG9uc2UuCiAgICogUmV0dXJucyBudWxsIGlmIHRoZSBjb25uZWN0aW9uIGlzIG5vdCBhIHNlY3VyZSBUTFMgb3IgU1NMIGNvbm5lY3Rpb24uCiAgICovCiAgWDUwOUNlcnRpZmljYXRlIGdldCBjZXJ0aWZpY2F0ZTsKCiAgLyoqCiAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2xpZW50IGNvbm5lY3Rpb24uIFJldHVybnMgWzpudWxsOl0gaWYgdGhlIHNvY2tldAogICAqIGlzIG5vdCBhdmFpbGFibGUuCiAgICovCiAgSHR0cENvbm5lY3Rpb25JbmZvIGdldCBjb25uZWN0aW9uSW5mbzsKfQoKYWJzdHJhY3QgY2xhc3MgSHR0cENsaWVudENyZWRlbnRpYWxzIHt9CgovKioKICogUmVwcmVzZW50cyBjcmVkZW50aWFscyBmb3IgYmFzaWMgYXV0aGVudGljYXRpb24uCiAqLwphYnN0cmFjdCBjbGFzcyBIdHRwQ2xpZW50QmFzaWNDcmVkZW50aWFscyBleHRlbmRzIEh0dHBDbGllbnRDcmVkZW50aWFscyB7CiAgZmFjdG9yeSBIdHRwQ2xpZW50QmFzaWNDcmVkZW50aWFscyhTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgPT4KICAgICAgbmV3IF9IdHRwQ2xpZW50QmFzaWNDcmVkZW50aWFscyh1c2VybmFtZSwgcGFzc3dvcmQpOwp9CgovKioKICogUmVwcmVzZW50cyBjcmVkZW50aWFscyBmb3IgZGlnZXN0IGF1dGhlbnRpY2F0aW9uLiBEaWdlc3QKICogYXV0aGVudGljYXRpb24gaXMgb25seSBzdXBwb3J0ZWQgZm9yIHNlcnZlcnMgdXNpbmcgdGhlIE1ENQogKiBhbGdvcml0aG0gYW5kIHF1YWxpdHkgb2YgcHJvdGVjdGlvbiAocW9wKSBvZiBlaXRoZXIgIm5vbmUiIG9yCiAqICJhdXRoIi4KICovCmFic3RyYWN0IGNsYXNzIEh0dHBDbGllbnREaWdlc3RDcmVkZW50aWFscyBleHRlbmRzIEh0dHBDbGllbnRDcmVkZW50aWFscyB7CiAgZmFjdG9yeSBIdHRwQ2xpZW50RGlnZXN0Q3JlZGVudGlhbHMoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpID0+CiAgICAgIG5ldyBfSHR0cENsaWVudERpZ2VzdENyZWRlbnRpYWxzKHVzZXJuYW1lLCBwYXNzd29yZCk7Cn0KCi8qKgogKiBJbmZvcm1hdGlvbiBhYm91dCBhbiBbSHR0cFJlcXVlc3RdLCBbSHR0cFJlc3BvbnNlXSwgW0h0dHBDbGllbnRSZXF1ZXN0XSwgb3IKICogW0h0dHBDbGllbnRSZXNwb25zZV0gY29ubmVjdGlvbi4KICovCmFic3RyYWN0IGNsYXNzIEh0dHBDb25uZWN0aW9uSW5mbyB7CiAgSW50ZXJuZXRBZGRyZXNzIGdldCByZW1vdGVBZGRyZXNzOwogIGludCBnZXQgcmVtb3RlUG9ydDsKICBpbnQgZ2V0IGxvY2FsUG9ydDsKfQoKLyoqCiAqIFJlZGlyZWN0IGluZm9ybWF0aW9uLgogKi8KYWJzdHJhY3QgY2xhc3MgUmVkaXJlY3RJbmZvIHsKICAvKioKICAgKiBSZXR1cm5zIHRoZSBzdGF0dXMgY29kZSB1c2VkIGZvciB0aGUgcmVkaXJlY3QuCiAgICovCiAgaW50IGdldCBzdGF0dXNDb2RlOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBtZXRob2QgdXNlZCBmb3IgdGhlIHJlZGlyZWN0LgogICAqLwogIFN0cmluZyBnZXQgbWV0aG9kOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBmb3IgdGhlIHJlZGlyZWN0LgogICAqLwogIFVyaSBnZXQgbG9jYXRpb247Cn0KCi8qKgogKiBXaGVuIGRldGFjaGluZyBhIHNvY2tldCBmcm9tIGVpdGhlciB0aGUgWzpIdHRwU2VydmVyOl0gb3IgdGhlCiAqIFs6SHR0cENsaWVudDpdIGR1ZSB0byBhIEhUVFAgY29ubmVjdGlvbiB1cGdyYWRlIHRoZXJlIG1pZ2h0IGJlCiAqIHVucGFyc2VkIGRhdGEgYWxyZWFkeSByZWFkIGZyb20gdGhlIHNvY2tldC4gVGhpcyB1bnBhcnNlZCBkYXRhCiAqIHRvZ2V0aGVyIHdpdGggdGhlIGRldGFjaGVkIHNvY2tldCBpcyByZXR1cm5lZCBpbiBhbiBpbnN0YW5jZSBvZgogKiB0aGlzIGNsYXNzLgogKi8KYWJzdHJhY3QgY2xhc3MgRGV0YWNoZWRTb2NrZXQgewogIFNvY2tldCBnZXQgc29ja2V0OwogIExpc3Q8aW50PiBnZXQgdW5wYXJzZWREYXRhOwp9CgpjbGFzcyBIdHRwRXhjZXB0aW9uIGltcGxlbWVudHMgSU9FeGNlcHRpb24gewogIGZpbmFsIFN0cmluZyBtZXNz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aWIvX2h0dHAvaHR0cF9pbXBsLmRhcnTAAX8QLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5faHR0cDsKCmludCBfbmV4dFNlcnZpY2VJZCA9IDE7CgovLyBUT0RPKGFqb2huc2VuKTogVXNlIG90aGVyIHdheSBvZiBnZXR0aW5nIGEgdW5pcXVlIGlkLgphYnN0cmFjdCBjbGFzcyBfU2VydmljZU9iamVjdCB7CiAgaW50IF9fc2VydmljZUlkID0gMDsKICBpbnQgZ2V0IF9zZXJ2aWNlSWQgewogICAgaWYgKF9fc2VydmljZUlkID09IDApIF9fc2VydmljZUlkID0gX25leHRTZXJ2aWNlSWQrKzsKICAgIHJldHVybiBfX3NlcnZpY2VJZDsKICB9CgogIE1hcCBfdG9KU09OKGJvb2wgcmVmKTsKCiAgU3RyaW5nIGdldCBfc2VydmljZVBhdGggPT4gIiRfc2VydmljZVR5cGVQYXRoLyRfc2VydmljZUlkIjsKCiAgU3RyaW5nIGdldCBfc2VydmljZVR5cGVQYXRoOwoKICBTdHJpbmcgZ2V0IF9zZXJ2aWNlVHlwZU5hbWU7CgogIFN0cmluZyBfc2VydmljZVR5cGUoYm9vbCByZWYpIHsKICAgIGlmIChyZWYpIHJldHVybiAiQCRfc2VydmljZVR5cGVOYW1lIjsKICAgIHJldHVybiBfc2VydmljZVR5cGVOYW1lOwogIH0KfQoKY2xhc3MgX0NvcHlpbmdCeXRlc0J1aWxkZXIgaW1wbGVtZW50cyBCeXRlc0J1aWxkZXIgewogIC8vIFN0YXJ0IHdpdGggMTAyNCBieXRlcy4KICBzdGF0aWMgY29uc3QgaW50IF9JTklUX1NJWkUgPSAxMDI0OwoKICBzdGF0aWMgZmluYWwgX2VtcHR5TGlzdCA9IG5ldyBVaW50OExpc3QoMCk7CgogIGludCBfbGVuZ3RoID0gMDsKICBVaW50OExpc3QgX2J1ZmZlcjsKCiAgX0NvcHlpbmdCeXRlc0J1aWxkZXIoW2ludCBpbml0aWFsQ2FwYWNpdHkgPSAwXSkKICAgICAgOiBfYnVmZmVyID0gKGluaXRpYWxDYXBhY2l0eSA8PSAwKQogICAgICAgICAgICA/IF9lbXB0eUxpc3QKICAgICAgICAgICAgOiBuZXcgVWludDhMaXN0KF9wb3cycm91bmR1cChpbml0aWFsQ2FwYWNpdHkpKTsKCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGJ5dGVzKSB7CiAgICBpbnQgYnl0ZXNMZW5ndGggPSBieXRlcy5sZW5ndGg7CiAgICBpZiAoYnl0ZXNMZW5ndGggPT0gMCkgcmV0dXJuOwogICAgaW50IHJlcXVpcmVkID0gX2xlbmd0aCArIGJ5dGVzTGVuZ3RoOwogICAgaWYgKF9idWZmZXIubGVuZ3RoIDwgcmVxdWlyZWQpIHsKICAgICAgX2dyb3cocmVxdWlyZWQpOwogICAgfQogICAgYXNzZXJ0KF9idWZmZXIubGVuZ3RoID49IHJlcXVpcmVkKTsKICAgIGlmIChieXRlcyBpcyBVaW50OExpc3QpIHsKICAgICAgX2J1ZmZlci5zZXRSYW5nZShfbGVuZ3RoLCByZXF1aXJlZCwgYnl0ZXMpOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlc0xlbmd0aDsgaSsrKSB7CiAgICAgICAgX2J1ZmZlcltfbGVuZ3RoICsgaV0gPSBieXRlc1tpXTsKICAgICAgfQogICAgfQogICAgX2xlbmd0aCA9IHJlcXVpcmVkOwogIH0KCiAgdm9pZCBhZGRCeXRlKGludCBieXRlKSB7CiAgICBpZiAoX2J1ZmZlci5sZW5ndGggPT0gX2xlbmd0aCkgewogICAgICAvLyBUaGUgZ3JvdyBhbGdvcml0aG0gYWx3YXlzIGF0IGxlYXN0IGRvdWJsZXMuCiAgICAgIC8vIElmIHdlIGFkZGVkIG9uZSB0byBfbGVuZ3RoIGl0IHdvdWxkIHF1YWRydXBsZSB1bm5lY2Vzc2FyaWx5LgogICAgICBfZ3JvdyhfbGVuZ3RoKTsKICAgIH0KICAgIGFzc2VydChfYnVmZmVyLmxlbmd0aCA+IF9sZW5ndGgpOwogICAgX2J1ZmZlcltfbGVuZ3RoXSA9IGJ5dGU7CiAgICBfbGVuZ3RoKys7CiAgfQoKICB2b2lkIF9ncm93KGludCByZXF1aXJlZCkgewogICAgLy8gV2Ugd2lsbCBjcmVhdGUgYSBsaXN0IGluIHRoZSByYW5nZSBvZiAyLTQgdGltZXMgbGFyZ2VyIHRoYW4KICAgIC8vIHJlcXVpcmVkLgogICAgaW50IG5ld1NpemUgPSByZXF1aXJlZCAqIDI7CiAgICBpZiAobmV3U2l6ZSA8IF9JTklUX1NJWkUpIHsKICAgICAgbmV3U2l6ZSA9IF9JTklUX1NJWkU7CiAgICB9IGVsc2UgewogICAgICBuZXdTaXplID0gX3BvdzJyb3VuZHVwKG5ld1NpemUpOwogICAgfQogICAgdmFyIG5ld0J1ZmZlciA9IG5ldyBVaW50OExpc3QobmV3U2l6ZSk7CiAgICBuZXdCdWZmZXIuc2V0UmFuZ2UoMCwgX2J1ZmZlci5sZW5ndGgsIF9idWZmZXIpOwogICAgX2J1ZmZlciA9IG5ld0J1ZmZlcjsKICB9CgogIExpc3Q8aW50PiB0YWtlQnl0ZXMoKSB7CiAgICBpZiAoX2xlbmd0aCA9PSAwKSByZXR1cm4gX2VtcHR5TGlzdDsKICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0LnZpZXcoX2J1ZmZlci5idWZmZXIsIDAsIF9sZW5ndGgpOwogICAgY2xlYXIoKTsKICAgIHJldHVybiBidWZmZXI7CiAgfQoKICBMaXN0PGludD4gdG9CeXRlcygpIHsKICAgIGlmIChfbGVuZ3RoID09IDApIHJldHVybiBfZW1wdHlMaXN0OwogICAgcmV0dXJuIG5ldyBVaW50OExpc3QuZnJvbUxpc3QoCiAgICAgICAgbmV3IFVpbnQ4TGlzdC52aWV3KF9idWZmZXIuYnVmZmVyLCAwLCBfbGVuZ3RoKSk7CiAgfQoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfbGVuZ3RoOwoKICBib29sIGdldCBpc0VtcHR5ID0+IF9sZW5ndGggPT0gMDsKCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBfbGVuZ3RoICE9IDA7CgogIHZvaWQgY2xlYXIoKSB7CiAgICBfbGVuZ3RoID0gMDsKICAgIF9idWZmZXIgPSBfZW1wdHlMaXN0OwogIH0KCiAgc3RhdGljIGludCBfcG93MnJvdW5kdXAoaW50IHgpIHsKICAgIGFzc2VydCh4ID4gMCk7CiAgICAtLXg7CiAgICB4IHw9IHggPj4gMTsKICAgIHggfD0geCA+PiAyOwogICAgeCB8PSB4ID4+IDQ7CiAgICB4IHw9IHggPj4gODsKICAgIHggfD0geCA+PiAxNjsKICAgIHJldHVybiB4ICsgMTsKICB9Cn0KCmNvbnN0IGludCBfT1VUR09JTkdfQlVGRkVSX1NJWkUgPSA4ICogMTAyNDsKCnR5cGVkZWYgdm9pZCBfQnl0ZXNDb25zdW1lcihMaXN0PGludD4gYnl0ZXMpOwoKY2xhc3MgX0h0dHBJbmNvbWluZyBleHRlbmRzIFN0cmVhbTxMaXN0PGludD4+IHsKICBmaW5hbCBpbnQgX3RyYW5zZmVyTGVuZ3RoOwogIGZpbmFsIENvbXBsZXRlciBfZGF0YUNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXIoKTsKICBTdHJlYW08TGlzdDxpbnQ+PiBfc3RyZWFtOwoKICBib29sIGZ1bGxCb2R5UmVhZCA9IGZhbHNlOwoKICAvLyBDb21tb24gcHJvcGVydGllcy4KICBmaW5hbCBfSHR0cEhlYWRlcnMgaGVhZGVyczsKICBib29sIHVwZ3JhZGVkID0gZmFsc2U7CgogIC8vIENsaWVudFJlc3BvbnNlIHByb3BlcnRpZXMuCiAgaW50IHN0YXR1c0NvZGU7CiAgU3RyaW5nIHJlYXNvblBocmFzZTsKCiAgLy8gUmVxdWVzdCBwcm9wZXJ0aWVzLgogIFN0cmluZyBtZXRob2Q7CiAgVXJpIHVyaTsKCiAgYm9vbCBoYXNTdWJzY3JpYmVyID0gZmFsc2U7CgogIC8vIFRoZSB0cmFuc2ZlciBsZW5ndGggaWYgdGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZSBib2R5IGFzIGl0CiAgLy8gYXBwZWFycyBpbiB0aGUgbWVzc2FnZSAoUkZDIDI2MTYgc2VjdGlvbiA0LjQpLiBUaGlzIGNhbiBiZSAtMSBpZgogIC8vIHRoZSBsZW5ndGggb2YgdGhlIG1hc3NhZ2UgYm9keSBpcyBub3Qga25vd24gZHVlIHRvIHRyYW5zZmVyCiAgLy8gY29kaW5ncy4KICBpbnQgZ2V0IHRyYW5zZmVyTGVuZ3RoID0+IF90cmFuc2Zlckxlbmd0aDsKCiAgX0h0dHBJbmNvbWluZyh0aGlzLmhlYWRlcnMsIHRoaXMuX3RyYW5zZmVyTGVuZ3RoLCB0aGlzLl9zdHJlYW0pOwoKICBTdHJlYW1TdWJzY3JpcHRpb248TGlzdDxpbnQ+PiBsaXN0ZW4odm9pZCBvbkRhdGEoTGlzdDxpbnQ+IGV2ZW50KSwKICAgICAge0Z1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcn0pIHsKICAgIGhhc1N1YnNjcmliZXIgPSB0cnVlOwogICAgcmV0dXJuIF9zdHJlYW0uaGFuZGxlRXJyb3IoKGVycm9yKSB7CiAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKGVycm9yLm1lc3NhZ2UsIHVyaTogdXJpKTsKICAgIH0pLmxpc3RlbihvbkRhdGEsCiAgICAgICAgb25FcnJvcjogb25FcnJvciwgb25Eb25lOiBvbkRvbmUsIGNhbmNlbE9uRXJyb3I6IGNhbmNlbE9uRXJyb3IpOwogIH0KCiAgLy8gSXMgY29tcGxldGVkIG9uY2UgYWxsIGRhdGEgaGF2ZSBiZWVuIHJlY2VpdmVkLgogIEZ1dHVyZSBnZXQgZGF0YURvbmUgPT4gX2RhdGFDb21wbGV0ZXIuZnV0dXJlOwoKICB2b2lkIGNsb3NlKGJvb2wgY2xvc2luZykgewogICAgZnVsbEJvZHlSZWFkID0gdHJ1ZTsKICAgIGhhc1N1YnNjcmliZXIgPSB0cnVlOwogICAgX2RhdGFDb21wbGV0ZXIuY29tcGxldGUoY2xvc2luZyk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBfSHR0cEluYm91bmRNZXNzYWdlIGV4dGVuZHMgU3RyZWFtPExpc3Q8aW50Pj4gewogIGZpbmFsIF9IdHRwSW5jb21pbmcgX2luY29taW5nOwogIExpc3Q8Q29va2llPiBfY29va2llczsKCiAgX0h0dHBJbmJvdW5kTWVzc2FnZSh0aGlzLl9pbmNvbWluZyk7CgogIExpc3Q8Q29va2llPiBnZXQgY29va2llcyB7CiAgICBpZiAoX2Nvb2tpZXMgIT0gbnVsbCkgcmV0dXJuIF9jb29raWVzOwogICAgcmV0dXJuIF9jb29raWVzID0gaGVhZGVycy5fcGFyc2VDb29raWVzKCk7CiAgfQoKICBfSHR0cEhlYWRlcnMgZ2V0IGhlYWRlcnMgPT4gX2luY29taW5nLmhlYWRlcnM7CiAgU3RyaW5nIGdldCBwcm90b2NvbFZlcnNpb24gPT4gaGVhZGVycy5wcm90b2NvbFZlcnNpb247CiAgaW50IGdldCBjb250ZW50TGVuZ3RoID0+IGhlYWRlcnMuY29udGVudExlbmd0aDsKICBib29sIGdldCBwZXJzaXN0ZW50Q29ubmVjdGlvbiA9PiBoZWFkZXJzLnBlcnNpc3RlbnRDb25uZWN0aW9uOwp9CgpjbGFzcyBfSHR0cFJlcXVlc3QgZXh0ZW5kcyBfSHR0cEluYm91bmRNZXNzYWdlIGltcGxlbWVudHMgSHR0cFJlcXVlc3QgewogIGZpbmFsIEh0dHBSZXNwb25zZSByZXNwb25zZTsKCiAgZmluYWwgX0h0dHBTZXJ2ZXIgX2h0dHBTZXJ2ZXI7CgogIGZpbmFsIF9IdHRwQ29ubmVjdGlvbiBfaHR0cENvbm5lY3Rpb247CgogIF9IdHRwU2Vzc2lvbiBfc2Vzc2lvbjsKCiAgVXJpIF9yZXF1ZXN0ZWRVcmk7CgogIF9IdHRwUmVxdWVzdCh0aGlzLnJlc3BvbnNlLCBfSHR0cEluY29taW5nIF9pbmNvbWluZywgdGhpcy5faHR0cFNlcnZlciwKICAgICAgdGhpcy5faHR0cENvbm5lY3Rpb24pCiAgICAgIDogc3VwZXIoX2luY29taW5nKSB7CiAgICBpZiAoaGVhZGVycy5wcm90b2NvbFZlcnNpb24gPT0gIjEuMSIpIHsKICAgICAgcmVzcG9uc2UuaGVhZGVycwogICAgICAgIC4uY2h1bmtlZFRyYW5zZmVyRW5jb2RpbmcgPSB0cnVlCiAgICAgICAgLi5wZXJzaXN0ZW50Q29ubmVjdGlvbiA9IGhlYWRlcnMucGVyc2lzdGVudENvbm5lY3Rpb247CiAgICB9CgogICAgaWYgKF9odHRwU2VydmVyLl9zZXNzaW9uTWFuYWdlckluc3RhbmNlICE9IG51bGwpIHsKICAgICAgLy8gTWFwIHRvIHNlc3Npb24gaWYgZXhpc3RzLgogICAgICB2YXIgc2Vzc2lvbklkcyA9IGNvb2tpZXMKICAgICAgICAgIC53aGVyZSgoY29va2llKSA9PiBjb29raWUubmFtZS50b1VwcGVyQ2FzZSgpID09IF9EQVJUX1NFU1NJT05fSUQpCiAgICAgICAgICAubWFwKChjb29raWUpID0+IGNvb2tpZS52YWx1ZSk7CiAgICAgIGZvciAodmFyIHNlc3Npb25JZCBpbiBzZXNzaW9uSWRzKSB7CiAgICAgICAgX3Nlc3Npb24gPSBfaHR0cFNlcnZlci5fc2Vzc2lvbk1hbmFnZXIuZ2V0U2Vzc2lvbihzZXNzaW9uSWQpOwogICAgICAgIGlmIChfc2Vzc2lvbiAhPSBudWxsKSB7CiAgICAgICAgICBfc2Vzc2lvbi5fbWFya1NlZW4oKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgU3RyZWFtU3Vic2NyaXB0aW9uPExpc3Q8aW50Pj4gbGlzdGVuKHZvaWQgb25EYXRhKExpc3Q8aW50PiBldmVudCksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICByZXR1cm4gX2luY29taW5nLmxpc3RlbihvbkRhdGEsCiAgICAgICAgb25FcnJvcjogb25FcnJvciwgb25Eb25lOiBvbkRvbmUsIGNhbmNlbE9uRXJyb3I6IGNhbmNlbE9uRXJyb3IpOwogIH0KCiAgVXJpIGdldCB1cmkgPT4gX2luY29taW5nLnVyaTsKCiAgVXJpIGdldCByZXF1ZXN0ZWRVcmkgewogICAgaWYgKF9yZXF1ZXN0ZWRVcmkgPT0gbnVsbCkgewogICAgICB2YXIgcHJvdG8gPSBoZWFkZXJzWyd4LWZvcndhcmRlZC1wcm90byddOwogICAgICB2YXIgc2NoZW1lID0gcHJvdG8gIT0gbnVsbAogICAgICAgICAgPyBwcm90by5maXJzdAogICAgICAgICAgOiBfaHR0cENvbm5lY3Rpb24uX3NvY2tldCBpcyBTZWN1cmVTb2NrZXQgPyAiaHR0cHMiIDogImh0dHAiOwogICAgICB2YXIgaG9zdExpc3QgPSBoZWFkZXJzWyd4LWZvcndhcmRlZC1ob3N0J107CiAgICAgIFN0cmluZyBob3N0OwogICAgICBpZiAoaG9zdExpc3QgIT0gbnVsbCkgewogICAgICAgIGhvc3QgPSBob3N0TGlzdC5maXJzdDsKICAgICAgfSBlbHNlIHsKICAgICAgICBob3N0TGlzdCA9IGhlYWRlcnNbJ2hvc3QnXTsKICAgICAgICBpZiAoaG9zdExpc3QgIT0gbnVsbCkgewogICAgICAgICAgaG9zdCA9IGhvc3RMaXN0LmZpcnN0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBob3N0ID0gIiR7X2h0dHBTZXJ2ZXIuYWRkcmVzcy5ob3N0fToke19odHRwU2VydmVyLnBvcnR9IjsKICAgICAgICB9CiAgICAgIH0KICAgICAgX3JlcXVlc3RlZFVyaSA9IFVyaS5wYXJzZSgiJHNjaGVtZTovLyRob3N0JHVyaSIpOwogICAgfQogICAgcmV0dXJuIF9yZXF1ZXN0ZWRVcmk7CiAgfQoKICBTdHJpbmcgZ2V0IG1ldGhvZCA9PiBfaW5jb21pbmcubWV0aG9kOwoKICBIdHRwU2Vzc2lvbiBnZXQgc2Vzc2lvbiB7CiAgICBpZiAoX3Nlc3Npb24gIT0gbnVsbCkgewogICAgICBpZiAoX3Nlc3Npb24uX2Rlc3Ryb3llZCkgewogICAgICAgIC8vIEl0J3MgZGVzdHJveWVkLCBjbGVhciBpdC4KICAgICAgICBfc2Vzc2lvbiA9IG51bGw7CiAgICAgICAgLy8gQ3JlYXRlIG5ldyBzZXNzaW9uIG9iamVjdCBieSBjYWxsaW5nIHJlY3Vyc2l2ZS4KICAgICAgICByZXR1cm4gc2Vzc2lvbjsKICAgICAgfQogICAgICAvLyBJdCdzIGFscmVhZHkgbWFwcGVkLCB1c2UgaXQuCiAgICAgIHJldHVybiBfc2Vzc2lvbjsKICAgIH0KICAgIC8vIENyZWF0ZSBzZXNzaW9uLCBzdG9yZSBpdCBpbiBjb25uZWN0aW9uLCBhbmQgcmV0dXJuLgogICAgcmV0dXJuIF9zZXNzaW9uID0gX2h0dHBTZXJ2ZXIuX3Nlc3Npb25NYW5hZ2VyLmNyZWF0ZVNlc3Npb24oKTsKICB9CgogIEh0dHBDb25uZWN0aW9uSW5mbyBnZXQgY29ubmVjdGlvbkluZm8gPT4gX2h0dHBDb25uZWN0aW9uLmNvbm5lY3Rpb25JbmZvOwoKICBYNTA5Q2VydGlmaWNhdGUgZ2V0IGNlcnRpZmljYXRlIHsKICAgIHZhciBzb2NrZXQgPSBfaHR0cENvbm5lY3Rpb24uX3NvY2tldDsKICAgIGlmIChzb2NrZXQgaXMgU2VjdXJlU29ja2V0KSByZXR1cm4gc29ja2V0LnBlZXJDZXJ0aWZpY2F0ZTsKICAgIHJldHVybiBudWxsOwogIH0KfQoKY2xhc3MgX0h0dHBDbGllbnRSZXNwb25zZSBleHRlbmRzIF9IdHRwSW5ib3VuZE1lc3NhZ2UKICAgIGltcGxlbWVudHMgSHR0cENsaWVudFJlc3BvbnNlIHsKICBMaXN0PFJlZGlyZWN0SW5mbz4gZ2V0IHJlZGlyZWN0cyA9PiBfaHR0cFJlcXVlc3QuX3Jlc3BvbnNlUmVkaXJlY3RzOwoKICAvLyBUaGUgSHR0cENsaWVudCB0aGlzIHJlc3BvbnNlIGJlbG9uZ3MgdG8uCiAgZmluYWwgX0h0dHBDbGllbnQgX2h0dHBDbGllbnQ7CgogIC8vIFRoZSBIdHRwQ2xpZW50UmVxdWVzdCBvZiB0aGlzIHJlc3BvbnNlLgogIGZpbmFsIF9IdHRwQ2xpZW50UmVxdWVzdCBfaHR0cFJlcXVlc3Q7CgogIF9IdHRwQ2xpZW50UmVzcG9uc2UoCiAgICAgIF9IdHRwSW5jb21pbmcgX2luY29taW5nLCB0aGlzLl9odHRwUmVxdWVzdCwgdGhpcy5faHR0cENsaWVudCkKICAgICAgOiBzdXBlcihfaW5jb21pbmcpIHsKICAgIC8vIFNldCB1cmkgZm9yIHBvdGVudGlhbCBleGNlcHRpb25zLgogICAgX2luY29taW5nLnVyaSA9IF9odHRwUmVxdWVzdC51cmk7CiAgfQoKICBpbnQgZ2V0IHN0YXR1c0NvZGUgPT4gX2luY29taW5nLnN0YXR1c0NvZGU7CiAgU3RyaW5nIGdldCByZWFzb25QaHJhc2UgPT4gX2luY29taW5nLnJlYXNvblBocmFzZTsKCiAgWDUwOUNlcnRpZmljYXRlIGdldCBjZXJ0aWZpY2F0ZSB7CiAgICB2YXIgc29ja2V0ID0gX2h0dHBSZXF1ZXN0Ll9odHRwQ2xpZW50Q29ubmVjdGlvbi5fc29ja2V0OwogICAgaWYgKHNvY2tldCBpcyBTZWN1cmVTb2NrZXQpIHJldHVybiBzb2NrZXQucGVlckNlcnRpZmljYXRlOwogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlNvY2tldCBpcyBub3QgYSBTZWN1cmVTb2NrZXQiKTsKICB9CgogIExpc3Q8Q29va2llPiBnZXQgY29va2llcyB7CiAgICBpZiAoX2Nvb2tpZXMgIT0gbnVsbCkgcmV0dXJuIF9jb29raWVzOwogICAgX2Nvb2tpZXMgPSBuZXcgTGlzdDxDb29raWU+KCk7CiAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gaGVhZGVyc1tIdHRwSGVhZGVycy5zZXRDb29raWVIZWFkZXJdOwogICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7CiAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWx1ZSkgewogICAgICAgIF9jb29raWVzLmFkZChuZXcgQ29va2llLmZyb21TZXRDb29raWVWYWx1ZSh2YWx1ZSkpOwogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBfY29va2llczsKICB9CgogIGJvb2wgZ2V0IGlzUmVkaXJlY3QgewogICAgaWYgKF9odHRwUmVxdWVzdC5tZXRob2QgPT0gIkdFVCIgfHwgX2h0dHBSZXF1ZXN0Lm1ldGhvZCA9PSAiSEVBRCIpIHsKICAgICAgcmV0dXJuIHN0YXR1c0NvZGUgPT0gSHR0cFN0YXR1cy5tb3ZlZFBlcm1hbmVudGx5IHx8CiAgICAgICAgICBzdGF0dXNDb2RlID09IEh0dHBTdGF0dXMuZm91bmQgfHwKICAgICAgICAgIHN0YXR1c0NvZGUgPT0gSHR0cFN0YXR1cy5zZWVPdGhlciB8fAogICAgICAgICAgc3RhdHVzQ29kZSA9PSBIdHRwU3RhdHVzLnRlbXBvcmFyeVJlZGlyZWN0OwogICAgfSBlbHNlIGlmIChfaHR0cFJlcXVlc3QubWV0aG9kID09ICJQT1NUIikgewogICAgICByZXR1cm4gc3RhdHVzQ29kZSA9PSBIdHRwU3RhdHVzLnNlZU90aGVyOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgRnV0dXJlPEh0dHBDbGllbnRSZXNwb25zZT4gcmVkaXJlY3QoCiAgICAgIFtTdHJpbmcgbWV0aG9kLCBVcmkgdXJsLCBib29sIGZvbGxvd0xvb3BzXSkgewogICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7CiAgICAgIC8vIFNldCBtZXRob2QgYXMgZGVmaW5lZCBieSBSRkMgMjYxNiBzZWN0aW9uIDEwLjMuNC4KICAgICAgaWYgKHN0YXR1c0NvZGUgPT0gSHR0cFN0YXR1cy5zZWVPdGhlciAmJiBfaHR0cFJlcXVlc3QubWV0aG9kID09ICJQT1NUIikgewogICAgICAgIG1ldGhvZCA9ICJHRVQiOwogICAgICB9IGVsc2UgewogICAgICAgIG1ldGhvZCA9IF9odHRwUmVxdWVzdC5tZXRob2Q7CiAgICAgIH0KICAgIH0KICAgIGlmICh1cmwgPT0gbnVsbCkgewogICAgICBTdHJpbmcgbG9jYXRpb24gPSBoZWFkZXJzLnZhbHVlKEh0dHBIZWFkZXJzLmxvY2F0aW9uSGVhZGVyKTsKICAgICAgaWYgKGxvY2F0aW9uID09IG51bGwpIHsKICAgICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiUmVzcG9uc2UgaGFzIG5vIExvY2F0aW9uIGhlYWRlciBmb3IgcmVkaXJlY3QiKTsKICAgICAgfQogICAgICB1cmwgPSBVcmkucGFyc2UobG9jYXRpb24pOwogICAgfQogICAgaWYgKGZvbGxvd0xvb3BzICE9IHRydWUpIHsKICAgICAgZm9yICh2YXIgcmVkaXJlY3QgaW4gcmVkaXJlY3RzKSB7CiAgICAgICAgaWYgKHJlZGlyZWN0LmxvY2F0aW9uID09IHVybCkgewogICAgICAgICAgcmV0dXJuIG5ldyBGdXR1cmUuZXJyb3IoCiAgICAgICAgICAgICAgbmV3IFJlZGlyZWN0RXhjZXB0aW9uKCJSZWRpcmVjdCBsb29wIGRldGVjdGVkIiwgcmVkaXJlY3RzKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gX2h0dHBDbGllbnQKICAgICAgICAuX29wZW5VcmxGcm9tUmVxdWVzdChtZXRob2QsIHVybCwgX2h0dHBSZXF1ZXN0KQogICAgICAgIC50aGVuKChyZXF1ZXN0KSB7CiAgICAgIHJlcXVlc3QuX3Jlc3BvbnNlUmVkaXJlY3RzCiAgICAgICAgLi5hZGRBbGwodGhpcy5yZWRpcmVjdHMpCiAgICAgICAgLi5hZGQobmV3IF9SZWRpcmVjdEluZm8oc3RhdHVzQ29kZSwgbWV0aG9kLCB1cmwpKTsKICAgICAgcmV0dXJuIHJlcXVlc3QuY2xvc2UoKTsKICAgIH0pOwogIH0KCiAgU3RyZWFtU3Vic2NyaXB0aW9uPExpc3Q8aW50Pj4gbGlzdGVuKHZvaWQgb25EYXRhKExpc3Q8aW50PiBldmVudCksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICBpZiAoX2luY29taW5nLnVwZ3JhZGVkKSB7CiAgICAgIC8vIElmIHVwZ3JhZGVkLCB0aGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5ICdyZW1vdmVkJyBmb3JtIHRoZSBjbGllbnQuCiAgICAgIC8vIFNpbmNlIGxpc3RlbmluZyB0byB1cGdyYWRlZCBkYXRhIGlzICdib2d1cycsIHNpbXBseSBjbG9zZSBhbmQKICAgICAgLy8gcmV0dXJuIGVtcHR5IHN0cmVhbSBzdWJzY3JpcHRpb24uCiAgICAgIF9odHRwUmVxdWVzdC5faHR0cENsaWVudENvbm5lY3Rpb24uZGVzdHJveSgpOwogICAgICByZXR1cm4gbmV3IFN0cmVhbTxMaXN0PGludD4+LmVtcHR5KCkubGlzdGVuKG51bGwsIG9uRG9uZTogb25Eb25lKTsKICAgIH0KICAgIFN0cmVhbTxMaXN0PGludD4+IHN0cmVhbSA9IF9pbmNvbWluZzsKICAgIGlmIChfaHR0cENsaWVudC5hdXRvVW5jb21wcmVzcyAmJgogICAgICAgIGhlYWRlcnMudmFsdWUoSHR0cEhlYWRlcnMuY29udGVudEVuY29kaW5nSGVhZGVyKSA9PSAiZ3ppcCIpIHsKICAgICAgc3RyZWFtID0gc3RyZWFtLnRyYW5zZm9ybShnemlwLmRlY29kZXIpOwogICAgfQogICAgcmV0dXJuIHN0cmVhbS5saXN0ZW4ob25EYXRhLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsIG9uRG9uZTogb25Eb25lLCBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKTsKICB9CgogIEZ1dHVyZTxTb2NrZXQ+IGRldGFjaFNvY2tldCgpIHsKICAgIF9odHRwQ2xpZW50Ll9jb25uZWN0aW9uQ2xvc2VkKF9odHRwUmVxdWVzdC5faHR0cENsaWVudENvbm5lY3Rpb24pOwogICAgcmV0dXJuIF9odHRwUmVxdWVzdC5faHR0cENsaWVudENvbm5lY3Rpb24uZGV0YWNoU29ja2V0KCk7CiAgfQoKICBIdHRwQ29ubmVjdGlvbkluZm8gZ2V0IGNvbm5lY3Rpb25JbmZvID0+IF9odHRwUmVxdWVzdC5jb25uZWN0aW9uSW5mbzsKCiAgYm9vbCBnZXQgX3Nob3VsZEF1dGhlbnRpY2F0ZVByb3h5IHsKICAgIC8vIE9ubHkgdHJ5IHRvIGF1dGhlbnRpY2F0ZSBpZiB0aGVyZSBpcyBhIGNoYWxsZW5nZSBpbiB0aGUgcmVzcG9uc2UuCiAgICBMaXN0PFN0cmluZz4gY2hhbGxlbmdlID0gaGVhZGVyc1tIdHRwSGVhZGVycy5wcm94eUF1dGhlbnRpY2F0ZUhlYWRlcl07CiAgICByZXR1cm4gc3RhdHVzQ29kZSA9PSBIdHRwU3RhdHVzLnByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZCAmJgogICAgICAgIGNoYWxsZW5nZSAhPSBudWxsICYmCiAgICAgICAgY2hhbGxlbmdlLmxlbmd0aCA9PSAxOwogIH0KCiAgYm9vbCBnZXQgX3Nob3VsZEF1dGhlbnRpY2F0ZSB7CiAgICAvLyBPbmx5IHRyeSB0byBhdXRoZW50aWNhdGUgaWYgdGhlcmUgaXMgYSBjaGFsbGVuZ2UgaW4gdGhlIHJlc3BvbnNlLgogICAgTGlzdDxTdHJpbmc+IGNoYWxsZW5nZSA9IGhlYWRlcnNbSHR0cEhlYWRlcnMud3d3QXV0aGVudGljYXRlSGVhZGVyXTsKICAgIHJldHVybiBzdGF0dXNDb2RlID09IEh0dHBTdGF0dXMudW5hdXRob3JpemVkICYmCiAgICAgICAgY2hhbGxlbmdlICE9IG51bGwgJiYKICAgICAgICBjaGFsbGVuZ2UubGVuZ3RoID09IDE7CiAgfQoKICBGdXR1cmU8SHR0cENsaWVudFJlc3BvbnNlPiBfYXV0aGVudGljYXRlKGJvb2wgcHJveHlBdXRoKSB7CiAgICBGdXR1cmU8SHR0cENsaWVudFJlc3BvbnNlPiByZXRyeSgpIHsKICAgICAgLy8gRHJhaW4gYm9keSBhbmQgcmV0cnkuCiAgICAgIHJldHVybiBkcmFpbigpLnRoZW4oKF8pIHsKICAgICAgICByZXR1cm4gX2h0dHBDbGllbnQKICAgICAgICAgICAgLl9vcGVuVXJsRnJvbVJlcXVlc3QoCiAgICAgICAgICAgICAgICBfaHR0cFJlcXVlc3QubWV0aG9kLCBfaHR0cFJlcXVlc3QudXJpLCBfaHR0cFJlcXVlc3QpCiAgICAgICAgICAgIC50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0LmNsb3NlKCkpOwogICAgICB9KTsKICAgIH0KCiAgICBMaXN0PFN0cmluZz4gYXV0aENoYWxsZW5nZSgpIHsKICAgICAgcmV0dXJuIHByb3h5QXV0aAogICAgICAgICAgPyBoZWFkZXJzW0h0dHBIZWFkZXJzLnByb3h5QXV0aGVudGljYXRlSGVhZGVyXQogICAgICAgICAgOiBoZWFkZXJzW0h0dHBIZWFkZXJzLnd3d0F1dGhlbnRpY2F0ZUhlYWRlcl07CiAgICB9CgogICAgX0NyZWRlbnRpYWxzIGZpbmRDcmVkZW50aWFscyhfQXV0aGVudGljYXRpb25TY2hlbWUgc2NoZW1lKSB7CiAgICAgIHJldHVybiBwcm94eUF1dGgKICAgICAgICAgID8gX2h0dHBDbGllbnQuX2ZpbmRQcm94eUNyZWRlbnRpYWxzKF9odHRwUmVxdWVzdC5fcHJveHksIHNjaGVtZSkKICAgICAgICAgIDogX2h0dHBDbGllbnQuX2ZpbmRDcmVkZW50aWFscyhfaHR0cFJlcXVlc3QudXJpLCBzY2hlbWUpOwogICAgfQoKICAgIHZvaWQgcmVtb3ZlQ3JlZGVudGlhbHMoX0NyZWRlbnRpYWxzIGNyKSB7CiAgICAgIGlmIChwcm94eUF1dGgpIHsKICAgICAgICBfaHR0cENsaWVudC5fcmVtb3ZlUHJveHlDcmVkZW50aWFscyhjcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2h0dHBDbGllbnQuX3JlbW92ZUNyZWRlbnRpYWxzKGNyKTsKICAgICAgfQogICAgfQoKICAgIEZ1dHVyZSByZXF1ZXN0QXV0aGVudGljYXRpb24oX0F1dGhlbnRpY2F0aW9uU2NoZW1lIHNjaGVtZSwgU3RyaW5nIHJlYWxtKSB7CiAgICAgIGlmIChwcm94eUF1dGgpIHsKICAgICAgICBpZiAoX2h0dHBDbGllbnQuX2F1dGhlbnRpY2F0ZVByb3h5ID09IG51bGwpIHsKICAgICAgICAgIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgdmFyIHByb3h5ID0gX2h0dHBSZXF1ZXN0Ll9wcm94eTsKICAgICAgICByZXR1cm4gX2h0dHBDbGllbnQuX2F1dGhlbnRpY2F0ZVByb3h5KAogICAgICAgICAgICBwcm94eS5ob3N0LCBwcm94eS5wb3J0LCBzY2hlbWUudG9TdHJpbmcoKSwgcmVhbG0pOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChfaHR0cENsaWVudC5fYXV0aGVudGljYXRlID09IG51bGwpIHsKICAgICAgICAgIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9odHRwQ2xpZW50Ll9hdXRoZW50aWNhdGUoCiAgICAgICAgICAgIF9odHRwUmVxdWVzdC51cmksIHNjaGVtZS50b1N0cmluZygpLCByZWFsbSk7CiAgICAgIH0KICAgIH0KCiAgICBMaXN0PFN0cmluZz4gY2hhbGxlbmdlID0gYXV0aENoYWxsZW5nZSgpOwogICAgYXNzZXJ0KGNoYWxsZW5nZSAhPSBudWxsIHx8IGNoYWxsZW5nZS5sZW5ndGggPT0gMSk7CiAgICBfSGVhZGVyVmFsdWUgaGVhZGVyID0KICAgICAgICBfSGVhZGVyVmFsdWUucGFyc2UoY2hhbGxlbmdlWzBdLCBwYXJhbWV0ZXJTZXBhcmF0b3I6ICIsIik7CiAgICBfQXV0aGVudGljYXRpb25TY2hlbWUgc2NoZW1lID0KICAgICAgICBuZXcgX0F1dGhlbnRpY2F0aW9uU2NoZW1lLmZyb21TdHJpbmcoaGVhZGVyLnZhbHVlKTsKICAgIFN0cmluZyByZWFsbSA9IGhlYWRlci5wYXJhbWV0ZXJzWyJyZWFsbSJdOwoKICAgIC8vIFNlZSBpZiBhbnkgbWF0Y2hpbmcgY3JlZGVudGlhbHMgYXJlIGF2YWlsYWJsZS4KICAgIF9DcmVkZW50aWFscyBjciA9IGZpbmRDcmVkZW50aWFscyhzY2hlbWUpOwogICAgaWYgKGNyICE9IG51bGwpIHsKICAgICAgLy8gRm9yIGJhc2ljIGF1dGhlbnRpY2F0aW9uIGRvbid0IHJldHJ5IGFscmVhZHkgdXNlZCBjcmVkZW50aWFscwogICAgICAvLyBhcyB0aGV5IG11c3QgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIHJlcXVlc3QgY2F1c2luZwogICAgICAvLyB0aGlzIGF1dGhlbnRpY2F0ZSByZXNwb25zZS4KICAgICAgaWYgKGNyLnNjaGVtZSA9PSBfQXV0aGVudGljYXRpb25TY2hlbWUuQkFTSUMgJiYgIWNyLnVzZWQpIHsKICAgICAgICAvLyBDcmVkZW50aWFscyB3aGVyZSBmb3VuZCwgcHJlcGFyZSBmb3IgcmV0cnlpbmcgdGhlIHJlcXVlc3QuCiAgICAgICAgcmV0dXJuIHJldHJ5KCk7CiAgICAgIH0KCiAgICAgIC8vIERpZ2VzdCBhdXRoZW50aWNhdGlvbiBvbmx5IHN1cHBvcnRzIHRoZSBNRDUgYWxnb3JpdGhtLgogICAgICBpZiAoY3Iuc2NoZW1lID09IF9BdXRoZW50aWNhdGlvblNjaGVtZS5ESUdFU1QgJiYKICAgICAgICAgIChoZWFkZXIucGFyYW1ldGVyc1siYWxnb3JpdGhtIl0gPT0gbnVsbCB8fAogICAgICAgICAgICAgIGhlYWRlci5wYXJhbWV0ZXJzWyJhbGdvcml0aG0iXS50b0xvd2VyQ2FzZSgpID09ICJtZDUiKSkgewogICAgICAgIGlmIChjci5ub25jZSA9PSBudWxsIHx8IGNyLm5vbmNlID09IGhlYWRlci5wYXJhbWV0ZXJzWyJub25jZSJdKSB7CiAgICAgICAgICAvLyBJZiB0aGUgbm9uY2UgaXMgbm90IHNldCB0aGVuIHRoaXMgaXMgdGhlIGZpcnN0IGF1dGhlbnRpY2F0ZQogICAgICAgICAgLy8gcmVzcG9uc2UgZm9yIHRoZXNlIGNyZWRlbnRpYWxzLiBTZXQgdXAgYXV0aGVudGljYXRpb24gc3RhdGUuCiAgICAgICAgICBpZiAoY3Iubm9uY2UgPT0gbnVsbCkgewogICAgICAgICAgICBjcgogICAgICAgICAgICAgIC4ubm9uY2UgPSBoZWFkZXIucGFyYW1ldGVyc1sibm9uY2UiXQogICAgICAgICAgICAgIC4uYWxnb3JpdGhtID0gIk1ENSIKICAgICAgICAgICAgICAuLnFvcCA9IGhlYWRlci5wYXJhbWV0ZXJzWyJxb3AiXQogICAgICAgICAgICAgIC4ubm9uY2VDb3VudCA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBDcmVkZW50aWFscyB3aGVyZSBmb3VuZCwgcHJlcGFyZSBmb3IgcmV0cnlpbmcgdGhlIHJlcXVlc3QuCiAgICAgICAgICByZXR1cm4gcmV0cnkoKTsKICAgICAgICB9IGVsc2UgaWYgKGhlYWRlci5wYXJhbWV0ZXJzWyJzdGFsZSJdICE9IG51bGwgJiYKICAgICAgICAgICAgaGVhZGVyLnBhcmFtZXRlcnNbInN0YWxlIl0udG9Mb3dlckNhc2UoKSA9PSAidHJ1ZSIpIHsKICAgICAgICAgIC8vIElmIHN0YWxlIGlzIHRydWUgcmV0cnkgd2l0aCBuZXcgbm9uY2UuCiAgICAgICAgICBjci5ub25jZSA9IGhlYWRlci5wYXJhbWV0ZXJzWyJub25jZSJdOwogICAgICAgICAgLy8gQ3JlZGVudGlhbHMgd2hlcmUgZm91bmQsIHByZXBhcmUgZm9yIHJldHJ5aW5nIHRoZSByZXF1ZXN0LgogICAgICAgICAgcmV0dXJuIHJldHJ5KCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gQXNrIGZvciBtb3JlIGNyZWRlbnRpYWxzIGlmIG5vbmUgZm91bmQgb3IgdGhlIG9uZSBmb3VuZCBoYXMKICAgIC8vIGFscmVhZHkgYmVlbiB1c2VkLiBJZiBpdCBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgaXQgbXVzdCBub3cgYmUKICAgIC8vIGludmFsaWQgYW5kIGlzIHJlbW92ZWQuCiAgICBpZiAoY3IgIT0gbnVsbCkgewogICAgICByZW1vdmVDcmVkZW50aWFscyhjcik7CiAgICAgIGNyID0gbnVsbDsKICAgIH0KICAgIHJldHVybiByZXF1ZXN0QXV0aGVudGljYXRpb24oc2NoZW1lLCByZWFsbSkudGhlbigoY3JlZHNBdmFpbGFibGUpIHsKICAgICAgaWYgKGNyZWRzQXZhaWxhYmxlKSB7CiAgICAgICAgY3IgPSBfaHR0cENsaWVudC5fZmluZENyZWRlbnRpYWxzKF9odHRwUmVxdWVzdC51cmksIHNjaGVtZSk7CiAgICAgICAgcmV0dXJuIHJldHJ5KCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gTm8gY3JlZGVudGlhbHMgYXZhaWxhYmxlLCBjb21wbGV0ZSB3aXRoIG9yaWdpbmFsIHJlc3BvbnNlLgogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICB9KTsKICB9Cn0KCmNsYXNzIF9TdHJlYW1TaW5rSW1wbDxUPiBpbXBsZW1lbnRzIFN0cmVhbVNpbms8VD4gewogIGZpbmFsIFN0cmVhbUNvbnN1bWVyPFQ+IF90YXJnZXQ7CiAgZmluYWwgQ29tcGxldGVyIF9kb25lQ29tcGxldGVyID0gbmV3IENvbXBsZXRlcigpOwogIFN0cmVhbUNvbnRyb2xsZXI8VD4gX2NvbnRyb2xsZXJJbnN0YW5jZTsKICBDb21wbGV0ZXIgX2NvbnRyb2xsZXJDb21wbGV0ZXI7CiAgYm9vbCBfaXNDbG9zZWQgPSBmYWxzZTsKICBib29sIF9pc0JvdW5kID0gZmFsc2U7CiAgYm9vbCBfaGFzRXJyb3IgPSBmYWxzZTsKCiAgX1N0cmVhbVNpbmtJbXBsKHRoaXMuX3RhcmdldCk7CgogIHZvaWQgYWRkKFQgZGF0YSkgewogICAgaWYgKF9pc0Nsb3NlZCkgewogICAgICB0aHJvdyBTdGF0ZUVycm9yKCJTdHJlYW1TaW5rIGlzIGNsb3NlZCIpOwogICAgfQogICAgX2NvbnRyb2xsZXIuYWRkKGRhdGEpOwogIH0KCiAgdm9pZCBhZGRFcnJvcihlcnJvciwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pIHsKICAgIGlmIChfaXNDbG9zZWQpIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcigiU3RyZWFtU2luayBpcyBjbG9zZWQiKTsKICAgIH0KICAgIF9jb250cm9sbGVyLmFkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIEZ1dHVyZSBhZGRTdHJlYW0oU3RyZWFtPFQ+IHN0cmVhbSkgewogICAgaWYgKF9pc0JvdW5kKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJTdHJlYW1TaW5rIGlzIGFscmVhZHkgYm91bmQgdG8gYSBzdHJlYW0iKTsKICAgIH0KICAgIF9pc0JvdW5kID0gdHJ1ZTsKICAgIGlmIChfaGFzRXJyb3IpIHJldHVybiBkb25lOwogICAgLy8gV2FpdCBmb3IgYW55IHN5bmMgb3BlcmF0aW9ucyB0byBjb21wbGV0ZS4KICAgIEZ1dHVyZSB0YXJnZXRBZGRTdHJlYW0oKSB7CiAgICAgIHJldHVybiBfdGFyZ2V0LmFkZFN0cmVhbShzdHJlYW0pLndoZW5Db21wbGV0ZSgoKSB7CiAgICAgICAgX2lzQm91bmQgPSBmYWxzZTsKICAgICAgfSk7CiAgICB9CgogICAgaWYgKF9jb250cm9sbGVySW5zdGFuY2UgPT0gbnVsbCkgcmV0dXJuIHRhcmdldEFkZFN0cmVhbSgpOwogICAgdmFyIGZ1dHVyZSA9IF9jb250cm9sbGVyQ29tcGxldGVyLmZ1dHVyZTsKICAgIF9jb250cm9sbGVySW5zdGFuY2UuY2xvc2UoKTsKICAgIHJldHVybiBmdXR1cmUudGhlbigoXykgPT4gdGFyZ2V0QWRkU3RyZWFtKCkpOwogIH0KCiAgRnV0dXJlIGZsdXNoKCkgewogICAgaWYgKF9pc0JvdW5kKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJTdHJlYW1TaW5rIGlzIGJvdW5kIHRvIGEgc3RyZWFtIik7CiAgICB9CiAgICBpZiAoX2NvbnRyb2xsZXJJbnN0YW5jZSA9PSBudWxsKSByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZSh0aGlzKTsKICAgIC8vIEFkZGluZyBhbiBlbXB0eSBzdHJlYW0tY29udHJvbGxlciB3aWxsIHJldHVybiBhIGZ1dHVyZSB0aGF0IHdpbGwgY29tcGxldGUKICAgIC8vIHdoZW4gYWxsIGRhdGEgaXMgZG9uZS4KICAgIF9pc0JvdW5kID0gdHJ1ZTsKICAgIHZhciBmdXR1cmUgPSBfY29udHJvbGxlckNvbXBsZXRlci5mdXR1cmU7CiAgICBfY29udHJvbGxlckluc3RhbmNlLmNsb3NlKCk7CiAgICByZXR1cm4gZnV0dXJlLndoZW5Db21wbGV0ZSgoKSB7CiAgICAgIF9pc0JvdW5kID0gZmFsc2U7CiAgICB9KTsKICB9CgogIEZ1dHVyZSBjbG9zZSgpIHsKICAgIGlmIChfaXNCb3VuZCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiU3RyZWFtU2luayBpcyBib3VuZCB0byBhIHN0cmVhbSIpOwogICAgfQogICAgaWYgKCFfaXNDbG9zZWQpIHsKICAgICAgX2lzQ2xvc2VkID0gdHJ1ZTsKICAgICAgaWYgKF9jb250cm9sbGVySW5zdGFuY2UgIT0gbnVsbCkgewogICAgICAgIF9jb250cm9sbGVySW5zdGFuY2UuY2xvc2UoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfY2xvc2VUYXJnZXQoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRvbmU7CiAgfQoKICB2b2lkIF9jbG9zZVRhcmdldCgpIHsKICAgIF90YXJnZXQuY2xvc2UoKS50aGVuKF9jb21wbGV0ZURvbmVWYWx1ZSwgb25FcnJvcjogX2NvbXBsZXRlRG9uZUVycm9yKTsKICB9CgogIEZ1dHVyZSBnZXQgZG9uZSA9PiBfZG9uZUNvbXBsZXRlci5mdXR1cmU7CgogIHZvaWQgX2NvbXBsZXRlRG9uZVZhbHVlKHZhbHVlKSB7CiAgICBpZiAoIV9kb25lQ29tcGxldGVyLmlzQ29tcGxldGVkKSB7CiAgICAgIF9kb25lQ29tcGxldGVyLmNvbXBsZXRlKHZhbHVlKTsKICAgIH0KICB9CgogIHZvaWQgX2NvbXBsZXRlRG9uZUVycm9yKGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgIGlmICghX2RvbmVDb21wbGV0ZXIuaXNDb21wbGV0ZWQpIHsKICAgICAgX2hhc0Vycm9yID0gdHJ1ZTsKICAgICAgX2RvbmVDb21wbGV0ZXIuY29tcGxldGVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICB9CiAgfQoKICBTdHJlYW1Db250cm9sbGVyPFQ+IGdldCBfY29udHJvbGxlciB7CiAgICBpZiAoX2lzQm91bmQpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIlN0cmVhbVNpbmsgaXMgYm91bmQgdG8gYSBzdHJlYW0iKTsKICAgIH0KICAgIGlmIChfaXNDbG9zZWQpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIlN0cmVhbVNpbmsgaXMgY2xvc2VkIik7CiAgICB9CiAgICBpZiAoX2NvbnRyb2xsZXJJbnN0YW5jZSA9PSBudWxsKSB7CiAgICAgIF9jb250cm9sbGVySW5zdGFuY2UgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxUPihzeW5jOiB0cnVlKTsKICAgICAgX2NvbnRyb2xsZXJDb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyKCk7CiAgICAgIF90YXJnZXQuYWRkU3RyZWFtKF9jb250cm9sbGVyLnN0cmVhbSkudGhlbigoXykgewogICAgICAgIGlmIChfaXNCb3VuZCkgewogICAgICAgICAgLy8gQSBuZXcgc3RyZWFtIHRha2VzIG92ZXIgLSBmb3J3YXJkIHZhbHVlcyB0byB0aGF0IHN0cmVhbS4KICAgICAgICAgIF9jb250cm9sbGVyQ29tcGxldGVyLmNvbXBsZXRlKHRoaXMpOwogICAgICAgICAgX2NvbnRyb2xsZXJDb21wbGV0ZXIgPSBudWxsOwogICAgICAgICAgX2NvbnRyb2xsZXJJbnN0YW5jZSA9IG51bGw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIE5vIG5ldyBzdHJlYW0sIC5jbG9zZSB3YXMgY2FsbGVkLiBDbG9zZSBfdGFyZ2V0LgogICAgICAgICAgX2Nsb3NlVGFyZ2V0KCk7CiAgICAgICAgfQogICAgICB9LCBvbkVycm9yOiAoZXJyb3IsIHN0YWNrVHJhY2UpIHsKICAgICAgICBpZiAoX2lzQm91bmQpIHsKICAgICAgICAgIC8vIEEgbmV3IHN0cmVhbSB0YWtlcyBvdmVyIC0gZm9yd2FyZCBlcnJvcnMgdG8gdGhhdCBzdHJlYW0uCiAgICAgICAgICBfY29udHJvbGxlckNvbXBsZXRlci5jb21wbGV0ZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgICAgIF9jb250cm9sbGVyQ29tcGxldGVyID0gbnVsbDsKICAgICAgICAgIF9jb250cm9sbGVySW5zdGFuY2UgPSBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBObyBuZXcgc3RyZWFtLiBObyBuZWVkIHRvIGNsb3NlIHRhcmdldCwgYXMgaXQgaGFzIGFscmVhZHkKICAgICAgICAgIC8vIGZhaWxlZC4KICAgICAgICAgIF9jb21wbGV0ZURvbmVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBfY29udHJvbGxlckluc3RhbmNlOwogIH0KfQoKY2xhc3MgX0lPU2lua0ltcGwgZXh0ZW5kcyBfU3RyZWFtU2lua0ltcGw8TGlzdDxpbnQ+PiBpbXBsZW1lbnRzIElPU2luayB7CiAgRW5jb2RpbmcgX2VuY29kaW5nOwogIGJvb2wgX2VuY29kaW5nTXV0YWJsZSA9IHRydWU7CgogIF9JT1NpbmtJbXBsKFN0cmVhbUNvbnN1bWVyPExpc3Q8aW50Pj4gdGFyZ2V0LCB0aGlzLl9lbmNvZGluZykgOiBzdXBlcih0YXJnZXQpOwoKICBFbmNvZGluZyBnZXQgZW5jb2RpbmcgPT4gX2VuY29kaW5nOwoKICB2b2lkIHNldCBlbmNvZGluZyhFbmNvZGluZyB2YWx1ZSkgewogICAgaWYgKCFfZW5jb2RpbmdNdXRhYmxlKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJJT1NpbmsgZW5jb2RpbmcgaXMgbm90IG11dGFibGUiKTsKICAgIH0KICAgIF9lbmNvZGluZyA9IHZhbHVlOwogIH0KCiAgdm9pZCB3cml0ZShPYmplY3Qgb2JqKSB7CiAgICBTdHJpbmcgc3RyaW5nID0gJyRvYmonOwogICAgaWYgKHN0cmluZy5pc0VtcHR5KSByZXR1cm47CiAgICBhZGQoX2VuY29kaW5nLmVuY29kZShzdHJpbmcpKTsKICB9CgogIHZvaWQgd3JpdGVBbGwoSXRlcmFibGUgb2JqZWN0cywgW1N0cmluZyBzZXBhcmF0b3IgPSAiIl0pIHsKICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gb2JqZWN0cy5pdGVyYXRvcjsKICAgIGlmICghaXRlcmF0b3IubW92ZU5leHQoKSkgcmV0dXJuOwogICAgaWYgKHNlcGFyYXRvci5pc0VtcHR5KSB7CiAgICAgIGRvIHsKICAgICAgICB3cml0ZShpdGVyYXRvci5jdXJyZW50KTsKICAgICAgfSB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZShpdGVyYXRvci5jdXJyZW50KTsKICAgICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgICB3cml0ZShzZXBhcmF0b3IpOwogICAgICAgIHdyaXRlKGl0ZXJhdG9yLmN1cnJlbnQpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlbG4oW09iamVjdCBvYmplY3QgPSAiIl0pIHsKICAgIHdyaXRlKG9iamVjdCk7CiAgICB3cml0ZSgiXG4iKTsKICB9CgogIHZvaWQgd3JpdGVDaGFyQ29kZShpbnQgY2hhckNvZGUpIHsKICAgIHdyaXRlKG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKSk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBfSHR0cE91dGJvdW5kTWVzc2FnZTxUPiBleHRlbmRzIF9JT1NpbmtJbXBsIHsKICAvLyBVc2VkIHRvIG1hcmsgd2hlbiB0aGUgYm9keSBzaG91bGQgYmUgd3JpdHRlbi4gVGhpcyBpcyB1c2VkIGZvciBIRUFECiAgLy8gcmVxdWVzdHMgYW5kIGluIGVycm9yIGhhbmRsaW5nLgogIGJvb2wgX2VuY29kaW5nU2V0ID0gZmFsc2U7CgogIGJvb2wgX2J1ZmZlck91dHB1dCA9IHRydWU7CgogIGZpbmFsIFVyaSBfdXJpOwogIGZpbmFsIF9IdHRwT3V0Z29pbmcgX291dGdvaW5nOwoKICBmaW5hbCBfSHR0cEhlYWRlcnMgaGVhZGVyczsKCiAgX0h0dHBPdXRib3VuZE1lc3NhZ2UoVXJpIHVyaSwgU3RyaW5nIHByb3RvY29sVmVyc2lvbiwgX0h0dHBPdXRnb2luZyBvdXRnb2luZywKICAgICAge19IdHRwSGVhZGVycyBpbml0aWFsSGVhZGVyc30pCiAgICAgIDogX3VyaSA9IHVyaSwKICAgICAgICBoZWFkZXJzID0gbmV3IF9IdHRwSGVhZGVycyhwcm90b2NvbFZlcnNpb24sCiAgICAgICAgICAgIGRlZmF1bHRQb3J0Rm9yU2NoZW1lOiB1cmkuc2NoZW1lID09ICdodHRwcycKICAgICAgICAgICAgICAgID8gSHR0cENsaWVudC5kZWZhdWx0SHR0cHNQb3J0CiAgICAgICAgICAgICAgICA6IEh0dHBDbGllbnQuZGVmYXVsdEh0dHBQb3J0LAogICAgICAgICAgICBpbml0aWFsSGVhZGVyczogaW5pdGlhbEhlYWRlcnMpLAogICAgICAgIF9vdXRnb2luZyA9IG91dGdvaW5nLAogICAgICAgIHN1cGVyKG91dGdvaW5nLCBudWxsKSB7CiAgICBfb3V0Z29pbmcub3V0Ym91bmQgPSB0aGlzOwogICAgX2VuY29kaW5nTXV0YWJsZSA9IGZhbHNlOwogIH0KCiAgaW50IGdldCBjb250ZW50TGVuZ3RoID0+IGhlYWRlcnMuY29udGVudExlbmd0aDsKICB2b2lkIHNldCBjb250ZW50TGVuZ3RoKGludCBjb250ZW50TGVuZ3RoKSB7CiAgICBoZWFkZXJzLmNvbnRlbnRMZW5ndGggPSBjb250ZW50TGVuZ3RoOwogIH0KCiAgYm9vbCBnZXQgcGVyc2lzdGVudENvbm5lY3Rpb24gPT4gaGVhZGVycy5wZXJzaXN0ZW50Q29ubmVjdGlvbjsKICB2b2lkIHNldCBwZXJzaXN0ZW50Q29ubmVjdGlvbihib29sIHApIHsKICAgIGhlYWRlcnMucGVyc2lzdGVudENvbm5lY3Rpb24gPSBwOwogIH0KCiAgYm9vbCBnZXQgYnVmZmVyT3V0cHV0ID0+IF9idWZmZXJPdXRwdXQ7CiAgdm9pZCBzZXQgYnVmZmVyT3V0cHV0KGJvb2wgYnVmZmVyT3V0cHV0KSB7CiAgICBpZiAoX291dGdvaW5nLmhlYWRlcnNXcml0dGVuKSB0aHJvdyBuZXcgU3RhdGVFcnJvcigiSGVhZGVyIGFscmVhZHkgc2VudCIpOwogICAgX2J1ZmZlck91dHB1dCA9IGJ1ZmZlck91dHB1dDsKICB9CgogIEVuY29kaW5nIGdldCBlbmNvZGluZyB7CiAgICBpZiAoX2VuY29kaW5nU2V0ICYmIF9vdXRnb2luZy5oZWFkZXJzV3JpdHRlbikgewogICAgICByZXR1cm4gX2VuY29kaW5nOwogICAgfQogICAgdmFyIGNoYXJzZXQ7CiAgICBpZiAoaGVhZGVycy5jb250ZW50VHlwZSAhPSBudWxsICYmIGhlYWRlcnMuY29udGVudFR5cGUuY2hhcnNldCAhPSBudWxsKSB7CiAgICAgIGNoYXJzZXQgPSBoZWFkZXJzLmNvbnRlbnRUeXBlLmNoYXJzZXQ7CiAgICB9IGVsc2UgewogICAgICBjaGFyc2V0ID0gImlzby04ODU5LTEiOwogICAgfQogICAgcmV0dXJuIEVuY29kaW5nLmdldEJ5TmFtZShjaGFyc2V0KTsKICB9CgogIHZvaWQgYWRkKExpc3Q8aW50PiBkYXRhKSB7CiAgICBpZiAoZGF0YS5sZW5ndGggPT0gMCkgcmV0dXJuOwogICAgc3VwZXIuYWRkKGRhdGEpOwogIH0KCiAgdm9pZCB3cml0ZShPYmplY3Qgb2JqKSB7CiAgICBpZiAoIV9lbmNvZGluZ1NldCkgewogICAgICBfZW5jb2RpbmcgPSBlbmNvZGluZzsKICAgICAgX2VuY29kaW5nU2V0ID0gdHJ1ZTsKICAgIH0KICAgIHN1cGVyLndyaXRlKG9iaik7CiAgfQoKICB2b2lkIF93cml0ZUhlYWRlcigpOwoKICBib29sIGdldCBfaXNDb25uZWN0aW9uQ2xvc2VkID0+IGZhbHNlOwp9CgpjbGFzcyBfSHR0cFJlc3BvbnNlIGV4dGVuZHMgX0h0dHBPdXRib3VuZE1lc3NhZ2U8SHR0cFJlc3BvbnNlPgogICAgaW1wbGVtZW50cyBIdHRwUmVzcG9uc2UgewogIGludCBfc3RhdHVzQ29kZSA9IDIwMDsKICBTdHJpbmcgX3JlYXNvblBocmFzZTsKICBMaXN0PENvb2tpZT4gX2Nvb2tpZXM7CiAgX0h0dHBSZXF1ZXN0IF9odHRwUmVxdWVzdDsKICBEdXJhdGlvbiBfZGVhZGxpbmU7CiAgVGltZXIgX2RlYWRsaW5lVGltZXI7CgogIF9IdHRwUmVzcG9uc2UoVXJpIHVyaSwgU3RyaW5nIHByb3RvY29sVmVyc2lvbiwgX0h0dHBPdXRnb2luZyBvdXRnb2luZywKICAgICAgSHR0cEhlYWRlcnMgZGVmYXVsdEhlYWRlcnMsIFN0cmluZyBzZXJ2ZXJIZWFkZXIpCiAgICAgIDogc3VwZXIodXJpLCBwcm90b2NvbFZlcnNpb24sIG91dGdvaW5nLCBpbml0aWFsSGVhZGVyczogZGVmYXVsdEhlYWRlcnMpIHsKICAgIGlmIChzZXJ2ZXJIZWFkZXIgIT0gbnVsbCkgaGVhZGVycy5zZXQoJ3NlcnZlcicsIHNlcnZlckhlYWRlcik7CiAgfQoKICBib29sIGdldCBfaXNDb25uZWN0aW9uQ2xvc2VkID0+IF9odHRwUmVxdWVzdC5faHR0cENvbm5lY3Rpb24uX2lzQ2xvc2luZzsKCiAgTGlzdDxDb29raWU+IGdldCBjb29raWVzIHsKICAgIGlmIChfY29va2llcyA9PSBudWxsKSBfY29va2llcyA9IG5ldyBMaXN0PENvb2tpZT4oKTsKICAgIHJldHVybiBfY29va2llczsKICB9CgogIGludCBnZXQgc3RhdHVzQ29kZSA9PiBfc3RhdHVzQ29kZTsKICB2b2lkIHNldCBzdGF0dXNDb2RlKGludCBzdGF0dXNDb2RlKSB7CiAgICBpZiAoX291dGdvaW5nLmhlYWRlcnNXcml0dGVuKSB0aHJvdyBuZXcgU3RhdGVFcnJvcigiSGVhZGVyIGFscmVhZHkgc2VudCIpOwogICAgX3N0YXR1c0NvZGUgPSBzdGF0dXNDb2RlOwogIH0KCiAgU3RyaW5nIGdldCByZWFzb25QaHJhc2UgPT4gX2ZpbmRSZWFzb25QaHJhc2Uoc3RhdHVzQ29kZSk7CiAgdm9pZCBzZXQgcmVhc29uUGhyYXNlKFN0cmluZyByZWFzb25QaHJhc2UpIHsKICAgIGlmIChfb3V0Z29pbmcuaGVhZGVyc1dyaXR0ZW4pIHRocm93IG5ldyBTdGF0ZUVycm9yKCJIZWFkZXIgYWxyZWFkeSBzZW50Iik7CiAgICBfcmVhc29uUGhyYXNlID0gcmVhc29uUGhyYXNlOwogIH0KCiAgRnV0dXJlIHJlZGlyZWN0KFVyaSBsb2NhdGlvbiwge2ludCBzdGF0dXM6IEh0dHBTdGF0dXMubW92ZWRUZW1wb3JhcmlseX0pIHsKICAgIGlmIChfb3V0Z29pbmcuaGVhZGVyc1dyaXR0ZW4pIHRocm93IG5ldyBTdGF0ZUVycm9yKCJIZWFkZXIgYWxyZWFkeSBzZW50Iik7CiAgICBzdGF0dXNDb2RlID0gc3RhdHVzOwogICAgaGVhZGVycy5zZXQoImxvY2F0aW9uIiwgbG9jYXRpb24udG9TdHJpbmcoKSk7CiAgICByZXR1cm4gY2xvc2UoKTsKICB9CgogIEZ1dHVyZTxTb2NrZXQ+IGRldGFjaFNvY2tldCh7Ym9vbCB3cml0ZUhlYWRlcnM6IHRydWV9KSB7CiAgICBpZiAoX291dGdvaW5nLmhlYWRlcnNXcml0dGVuKSB0aHJvdyBuZXcgU3RhdGVFcnJvcigiSGVhZGVycyBhbHJlYWR5IHNlbnQiKTsKICAgIGRlYWRsaW5lID0gbnVsbDsgLy8gQmUgc3VyZSB0byBzdG9wIGFueSBkZWFkbGluZS4KICAgIHZhciBmdXR1cmUgPSBfaHR0cFJlcXVlc3QuX2h0dHBDb25uZWN0aW9uLmRldGFjaFNvY2tldCgpOwogICAgaWYgKHdyaXRlSGVhZGVycykgewogICAgICB2YXIgaGVhZGVyc0Z1dHVyZSA9CiAgICAgICAgICBfb3V0Z29pbmcud3JpdGVIZWFkZXJzKGRyYWluUmVxdWVzdDogZmFsc2UsIHNldE91dGdvaW5nOiBmYWxzZSk7CiAgICAgIGFzc2VydChoZWFkZXJzRnV0dXJlID09IG51bGwpOwogICAgfSBlbHNlIHsKICAgICAgLy8gSW1pdGF0ZSBoYXZpbmcgd3JpdHRlbiB0aGUgaGVhZGVycy4KICAgICAgX291dGdvaW5nLmhlYWRlcnNXcml0dGVuID0gdHJ1ZTsKICAgIH0KICAgIC8vIENsb3NlIGNvbm5lY3Rpb24gc28gdGhlIHNvY2tldCBpcyAnZnJlZScuCiAgICBjbG9zZSgpOwogICAgZG9uZS5jYXRjaEVycm9yKChfKSB7CiAgICAgIC8vIENhdGNoIGFueSBlcnJvciBvbiBkb25lLCBhcyB0aGV5IGF1dG9tYXRpY2FsbHkgd2lsbCBiZQogICAgICAvLyBwcm9wYWdhdGVkIHRvIHRoZSB3ZWJzb2NrZXQuCiAgICB9KTsKICAgIHJldHVybiBmdXR1cmU7CiAgfQoKICBIdHRwQ29ubmVjdGlvbkluZm8gZ2V0IGNvbm5lY3Rpb25JbmZvID0+IF9odHRwUmVxdWVzdC5jb25uZWN0aW9uSW5mbzsKCiAgRHVyYXRpb24gZ2V0IGRlYWRsaW5lID0+IF9kZWFkbGluZTsKCiAgdm9pZCBzZXQgZGVhZGxpbmUoRHVyYXRpb24gZCkgewogICAgaWYgKF9kZWFkbGluZVRpbWVyICE9IG51bGwpIF9kZWFkbGluZVRpbWVyLmNhbmNlbCgpOwogICAgX2RlYWRsaW5lID0gZDsKCiAgICBpZiAoX2RlYWRsaW5lID09IG51bGwpIHJldHVybjsKICAgIF9kZWFkbGluZVRpbWVyID0gbmV3IFRpbWVyKF9kZWFkbGluZSwgKCkgewogICAgICBfaHR0cFJlcXVlc3QuX2h0dHBDb25uZWN0aW9uLmRlc3Ryb3koKTsKICAgIH0pOwogIH0KCiAgdm9pZCBfd3JpdGVIZWFkZXIoKSB7CiAgICBCeXRlc0J1aWxkZXIgYnVmZmVyID0gbmV3IF9Db3B5aW5nQnl0ZXNCdWlsZGVyKF9PVVRHT0lOR19CVUZGRVJfU0laRSk7CgogICAgLy8gV3JpdGUgc3RhdHVzIGxpbmUuCiAgICBpZiAoaGVhZGVycy5wcm90b2NvbFZlcnNpb24gPT0gIjEuMSIpIHsKICAgICAgYnVmZmVyLmFkZChfQ29uc3QuSFRUUDExKTsKICAgIH0gZWxzZSB7CiAgICAgIGJ1ZmZlci5hZGQoX0NvbnN0LkhUVFAxMCk7CiAgICB9CiAgICBidWZmZXIuYWRkQnl0ZShfQ2hhckNvZGUuU1ApOwogICAgYnVmZmVyLmFkZChzdGF0dXNDb2RlLnRvU3RyaW5nKCkuY29kZVVuaXRzKTsKICAgIGJ1ZmZlci5hZGRCeXRlKF9DaGFyQ29kZS5TUCk7CiAgICBidWZmZXIuYWRkKHJlYXNvblBocmFzZS5jb2RlVW5pdHMpOwogICAgYnVmZmVyLmFkZEJ5dGUoX0NoYXJDb2RlLkNSKTsKICAgIGJ1ZmZlci5hZGRCeXRlKF9DaGFyQ29kZS5MRik7CgogICAgdmFyIHNlc3Npb24gPSBfaHR0cFJlcXVlc3QuX3Nlc3Npb247CiAgICBpZiAoc2Vzc2lvbiAhPSBudWxsICYmICFzZXNzaW9uLl9kZXN0cm95ZWQpIHsKICAgICAgLy8gTWFyayBhcyBub3QgbmV3LgogICAgICBzZXNzaW9uLl9pc05ldyA9IGZhbHNlOwogICAgICAvLyBNYWtlIHN1cmUgd2Ugb25seSBzZW5kIHRoZSBjdXJyZW50IHNlc3Npb24gaWQuCiAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb29raWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGNvb2tpZXNbaV0ubmFtZS50b1VwcGVyQ2FzZSgpID09IF9EQVJUX1NFU1NJT05fSUQpIHsKICAgICAgICAgIGNvb2tpZXNbaV0KICAgICAgICAgICAgLi52YWx1ZSA9IHNlc3Npb24uaWQKICAgICAgICAgICAgLi5odHRwT25seSA9IHRydWUKICAgICAgICAgICAgLi5wYXRoID0gIi8iOwogICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIWZvdW5kKSB7CiAgICAgICAgdmFyIGNvb2tpZSA9IG5ldyBDb29raWUoX0RBUlRfU0VTU0lPTl9JRCwgc2Vzc2lvbi5pZCk7CiAgICAgICAgY29va2llcy5hZGQoY29va2llCiAgICAgICAgICAuLmh0dHBPbmx5ID0gdHJ1ZQogICAgICAgICAgLi5wYXRoID0gIi8iKTsKICAgICAgfQogICAgfQogICAgLy8gQWRkIGFsbCB0aGUgY29va2llcyBzZXQgdG8gdGhlIGhlYWRlcnMuCiAgICBpZiAoX2Nvb2tpZXMgIT0gbnVsbCkgewogICAgICBfY29va2llcy5mb3JFYWNoKChjb29raWUpIHsKICAgICAgICBoZWFkZXJzLmFkZChIdHRwSGVhZGVycy5zZXRDb29raWVIZWFkZXIsIGNvb2tpZSk7CiAgICAgIH0pOwogICAgfQoKICAgIGhlYWRlcnMuX2ZpbmFsaXplKCk7CgogICAgLy8gV3JpdGUgaGVhZGVycy4KICAgIGhlYWRlcnMuX2J1aWxkKGJ1ZmZlcik7CiAgICBidWZmZXIuYWRkQnl0ZShfQ2hhckNvZGUuQ1IpOwogICAgYnVmZmVyLmFkZEJ5dGUoX0NoYXJDb2RlLkxGKTsKICAgIFVpbnQ4TGlzdCBoZWFkZXJCeXRlcyA9IGJ1ZmZlci50YWtlQnl0ZXMoKTsKICAgIF9vdXRnb2luZy5zZXRIZWFkZXIoaGVhZGVyQnl0ZXMsIGhlYWRlckJ5dGVzLmxlbmd0aCk7CiAgfQoKICBTdHJpbmcgX2ZpbmRSZWFzb25QaHJhc2UoaW50IHN0YXR1c0NvZGUpIHsKICAgIGlmIChfcmVhc29uUGhyYXNlICE9IG51bGwpIHsKICAgICAgcmV0dXJuIF9yZWFzb25QaHJhc2U7CiAgICB9CgogICAgc3dpdGNoIChzdGF0dXNDb2RlKSB7CiAgICAgIGNhc2UgSHR0cFN0YXR1cy5jb250aW51ZV86CiAgICAgICAgcmV0dXJuICJDb250aW51ZSI7CiAgICAgIGNhc2UgSHR0cFN0YXR1cy5zd2l0Y2hpbmdQcm90b2NvbHM6CiAgICAgICAgcmV0dXJuICJTd2l0Y2hpbmcgUHJvdG9jb2xzIjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLm9rOgogICAgICAgIHJldHVybiAiT0siOwogICAgICBjYXNlIEh0dHBTdGF0dXMuY3JlYXRlZDoKICAgICAgICByZXR1cm4gIkNyZWF0ZWQiOwogICAgICBjYXNlIEh0dHBTdGF0dXMuYWNjZXB0ZWQ6CiAgICAgICAgcmV0dXJuICJBY2NlcHRlZCI7CiAgICAgIGNhc2UgSHR0cFN0YXR1cy5ub25BdXRob3JpdGF0aXZlSW5mb3JtYXRpb246CiAgICAgICAgcmV0dXJuICJOb24tQXV0aG9yaXRhdGl2ZSBJbmZvcm1hdGlvbiI7CiAgICAgIGNhc2UgSHR0cFN0YXR1cy5ub0NvbnRlbnQ6CiAgICAgICAgcmV0dXJuICJObyBDb250ZW50IjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLnJlc2V0Q29udGVudDoKICAgICAgICByZXR1cm4gIlJlc2V0IENvbnRlbnQiOwogICAgICBjYXNlIEh0dHBTdGF0dXMucGFydGlhbENvbnRlbnQ6CiAgICAgICAgcmV0dXJuICJQYXJ0aWFsIENvbnRlbnQiOwogICAgICBjYXNlIEh0dHBTdGF0dXMubXVsdGlwbGVDaG9pY2VzOgogICAgICAgIHJldHVybiAiTXVsdGlwbGUgQ2hvaWNlcyI7CiAgICAgIGNhc2UgSHR0cFN0YXR1cy5tb3ZlZFBlcm1hbmVudGx5OgogICAgICAgIHJldHVybiAiTW92ZWQgUGVybWFuZW50bHkiOwogICAgICBjYXNlIEh0dHBTdGF0dXMuZm91bmQ6CiAgICAgICAgcmV0dXJuICJGb3VuZCI7CiAgICAgIGNhc2UgSHR0cFN0YXR1cy5zZWVPdGhlcjoKICAgICAgICByZXR1cm4gIlNlZSBPdGhlciI7CiAgICAgIGNhc2UgSHR0cFN0YXR1cy5ub3RNb2RpZmllZDoKICAgICAgICByZXR1cm4gIk5vdCBNb2RpZmllZCI7CiAgICAgIGNhc2UgSHR0cFN0YXR1cy51c2VQcm94eToKICAgICAgICByZXR1cm4gIlVzZSBQcm94eSI7CiAgICAgIGNhc2UgSHR0cFN0YXR1cy50ZW1wb3JhcnlSZWRpcmVjdDoKICAgICAgICByZXR1cm4gIlRlbXBvcmFyeSBSZWRpcmVjdCI7CiAgICAgIGNhc2UgSHR0cFN0YXR1cy5iYWRSZXF1ZXN0OgogICAgICAgIHJldHVybiAiQmFkIFJlcXVlc3QiOwogICAgICBjYXNlIEh0dHBTdGF0dXMudW5hdXRob3JpemVkOgogICAgICAgIHJldHVybiAiVW5hdXRob3JpemVkIjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLnBheW1lbnRSZXF1aXJlZDoKICAgICAgICByZXR1cm4gIlBheW1lbnQgUmVxdWlyZWQiOwogICAgICBjYXNlIEh0dHBTdGF0dXMuZm9yYmlkZGVuOgogICAgICAgIHJldHVybiAiRm9yYmlkZGVuIjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLm5vdEZvdW5kOgogICAgICAgIHJldHVybiAiTm90IEZvdW5kIjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLm1ldGhvZE5vdEFsbG93ZWQ6CiAgICAgICAgcmV0dXJuICJNZXRob2QgTm90IEFsbG93ZWQiOwogICAgICBjYXNlIEh0dHBTdGF0dXMubm90QWNjZXB0YWJsZToKICAgICAgICByZXR1cm4gIk5vdCBBY2NlcHRhYmxlIjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLnByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZDoKICAgICAgICByZXR1cm4gIlByb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkIjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLnJlcXVlc3RUaW1lb3V0OgogICAgICAgIHJldHVybiAiUmVxdWVzdCBUaW1lLW91dCI7CiAgICAgIGNhc2UgSHR0cFN0YXR1cy5jb25mbGljdDoKICAgICAgICByZXR1cm4gIkNvbmZsaWN0IjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLmdvbmU6CiAgICAgICAgcmV0dXJuICJHb25lIjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLmxlbmd0aFJlcXVpcmVkOgogICAgICAgIHJldHVybiAiTGVuZ3RoIFJlcXVpcmVkIjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLnByZWNvbmRpdGlvbkZhaWxlZDoKICAgICAgICByZXR1cm4gIlByZWNvbmRpdGlvbiBGYWlsZWQiOwogICAgICBjYXNlIEh0dHBTdGF0dXMucmVxdWVzdEVudGl0eVRvb0xhcmdlOgogICAgICAgIHJldHVybiAiUmVxdWVzdCBFbnRpdHkgVG9vIExhcmdlIjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLnJlcXVlc3RVcmlUb29Mb25nOgogICAgICAgIHJldHVybiAiUmVxdWVzdC1VUkkgVG9vIExvbmciOwogICAgICBjYXNlIEh0dHBTdGF0dXMudW5zdXBwb3J0ZWRNZWRpYVR5cGU6CiAgICAgICAgcmV0dXJuICJVbnN1cHBvcnRlZCBNZWRpYSBUeXBlIjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLnJlcXVlc3RlZFJhbmdlTm90U2F0aXNmaWFibGU6CiAgICAgICAgcmV0dXJuICJSZXF1ZXN0ZWQgcmFuZ2Ugbm90IHNhdGlzZmlhYmxlIjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLmV4cGVjdGF0aW9uRmFpbGVkOgogICAgICAgIHJldHVybiAiRXhwZWN0YXRpb24gRmFpbGVkIjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLmludGVybmFsU2VydmVyRXJyb3I6CiAgICAgICAgcmV0dXJuICJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiOwogICAgICBjYXNlIEh0dHBTdGF0dXMubm90SW1wbGVtZW50ZWQ6CiAgICAgICAgcmV0dXJuICJOb3QgSW1wbGVtZW50ZWQiOwogICAgICBjYXNlIEh0dHBTdGF0dXMuYmFkR2F0ZXdheToKICAgICAgICByZXR1cm4gIkJhZCBHYXRld2F5IjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLnNlcnZpY2VVbmF2YWlsYWJsZToKICAgICAgICByZXR1cm4gIlNlcnZpY2UgVW5hdmFpbGFibGUiOwogICAgICBjYXNlIEh0dHBTdGF0dXMuZ2F0ZXdheVRpbWVvdXQ6CiAgICAgICAgcmV0dXJuICJHYXRld2F5IFRpbWUtb3V0IjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLmh0dHBWZXJzaW9uTm90U3VwcG9ydGVkOgogICAgICAgIHJldHVybiAiSHR0cCBWZXJzaW9uIG5vdCBzdXBwb3J0ZWQiOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiAiU3RhdHVzICRzdGF0dXNDb2RlIjsKICAgIH0KICB9Cn0KCmNsYXNzIF9IdHRwQ2xpZW50UmVxdWVzdCBleHRlbmRzIF9IdHRwT3V0Ym91bmRNZXNzYWdlPEh0dHBDbGllbnRSZXNwb25zZT4KICAgIGltcGxlbWVudHMgSHR0cENsaWVudFJlcXVlc3QgewogIGZpbmFsIFN0cmluZyBtZXRob2Q7CiAgZmluYWwgVXJpIHVyaTsKICBmaW5hbCBMaXN0PENvb2tpZT4gY29va2llcyA9IG5ldyBMaXN0PENvb2tpZT4oKTsKCiAgLy8gVGhlIEh0dHBDbGllbnQgdGhpcyByZXF1ZXN0IGJlbG9uZ3MgdG8uCiAgZmluYWwgX0h0dHBDbGllbnQgX2h0dHBDbGllbnQ7CiAgZmluYWwgX0h0dHBDbGllbnRDb25uZWN0aW9uIF9odHRwQ2xpZW50Q29ubmVjdGlvbjsKCiAgZmluYWwgQ29tcGxldGVyPEh0dHBDbGllbnRSZXNwb25zZT4gX3Jlc3BvbnNlQ29tcGxldGVyID0KICAgICAgbmV3IENvbXBsZXRlcjxIdHRwQ2xpZW50UmVzcG9uc2U+KCk7CgogIGZpbmFsIF9Qcm94eSBfcHJveHk7CgogIEZ1dHVyZTxIdHRwQ2xpZW50UmVzcG9uc2U+IF9yZXNwb25zZTsKCiAgLy8gVE9ETyhham9obnNlbik6IEdldCBkZWZhdWx0IHZhbHVlIGZyb20gY2xpZW50PwogIGJvb2wgX2ZvbGxvd1JlZGlyZWN0cyA9IHRydWU7CgogIGludCBfbWF4UmVkaXJlY3RzID0gNTsKCiAgTGlzdDxSZWRpcmVjdEluZm8+IF9yZXNwb25zZVJlZGlyZWN0cyA9IFtdOwoKICBfSHR0cENsaWVudFJlcXVlc3QoX0h0dHBPdXRnb2luZyBvdXRnb2luZywgVXJpIHVyaSwgdGhpcy5tZXRob2QsIHRoaXMuX3Byb3h5LAogICAgICB0aGlzLl9odHRwQ2xpZW50LCB0aGlzLl9odHRwQ2xpZW50Q29ubmVjdGlvbikKICAgICAgOiB1cmkgPSB1cmksCiAgICAgICAgc3VwZXIodXJpLCAiMS4xIiwgb3V0Z29pbmcpIHsKICAgIC8vIEdFVCBhbmQgSEVBRCBoYXZlICdjb250ZW50LWxlbmd0aDogMCcgYnkgZGVmYXVsdC4KICAgIGlmIChtZXRob2QgPT0gIkdFVCIgfHwgbWV0aG9kID09ICJIRUFEIikgewogICAgICBjb250ZW50TGVuZ3RoID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGhlYWRlcnMuY2h1bmtlZFRyYW5zZmVyRW5jb2RpbmcgPSB0cnVlOwogICAgfQogIH0KCiAgRnV0dXJlPEh0dHBDbGllbnRSZXNwb25zZT4gZ2V0IGRvbmUgewogICAgaWYgKF9yZXNwb25zZSA9PSBudWxsKSB7CiAgICAgIF9yZXNwb25zZSA9CiAgICAgICAgICBGdXR1cmUud2FpdChbX3Jlc3BvbnNlQ29tcGxldGVyLmZ1dHVyZSwgc3VwZXIuZG9uZV0sIGVhZ2VyRXJyb3I6IHRydWUpCiAgICAgICAgICAgICAgLnRoZW4oKGxpc3QpID0+IGxpc3RbMF0pOwogICAgfQogICAgcmV0dXJuIF9yZXNwb25zZTsKICB9CgogIEZ1dHVyZTxIdHRwQ2xpZW50UmVzcG9uc2U+IGNsb3NlKCkgewogICAgc3VwZXIuY2xvc2UoKTsKICAgIHJldHVybiBkb25lOwogIH0KCiAgaW50IGdldCBtYXhSZWRpcmVjdHMgPT4gX21heFJlZGlyZWN0czsKICB2b2lkIHNldCBtYXhSZWRpcmVjdHMoaW50IG1heFJlZGlyZWN0cykgewogICAgaWYgKF9vdXRnb2luZy5oZWFkZXJzV3JpdHRlbikgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIlJlcXVlc3QgYWxyZWFkeSBzZW50Iik7CiAgICBfbWF4UmVkaXJlY3RzID0gbWF4UmVkaXJlY3RzOwogIH0KCiAgYm9vbCBnZXQgZm9sbG93UmVkaXJlY3RzID0+IF9mb2xsb3dSZWRpcmVjdHM7CiAgdm9pZCBzZXQgZm9sbG93UmVkaXJlY3RzKGJvb2wgZm9sbG93UmVkaXJlY3RzKSB7CiAgICBpZiAoX291dGdvaW5nLmhlYWRlcnNXcml0dGVuKSB0aHJvdyBuZXcgU3RhdGVFcnJvcigiUmVxdWVzdCBhbHJlYWR5IHNlbnQiKTsKICAgIF9mb2xsb3dSZWRpcmVjdHMgPSBmb2xsb3dSZWRpcmVjdHM7CiAgfQoKICBIdHRwQ29ubmVjdGlvbkluZm8gZ2V0IGNvbm5lY3Rpb25JbmZvID0+IF9odHRwQ2xpZW50Q29ubmVjdGlvbi5jb25uZWN0aW9uSW5mbzsKCiAgdm9pZCBfb25JbmNvbWluZyhfSHR0cEluY29taW5nIGluY29taW5nKSB7CiAgICB2YXIgcmVzcG9uc2UgPSBuZXcgX0h0dHBDbGllbnRSZXNwb25zZShpbmNvbWluZywgdGhpcywgX2h0dHBDbGllbnQpOwogICAgRnV0dXJlPEh0dHBDbGllbnRSZXNwb25zZT4gZnV0dXJlOwogICAgaWYgKGZvbGxvd1JlZGlyZWN0cyAmJiByZXNwb25zZS5pc1JlZGlyZWN0KSB7CiAgICAgIGlmIChyZXNwb25zZS5yZWRpcmVjdHMubGVuZ3RoIDwgbWF4UmVkaXJlY3RzKSB7CiAgICAgICAgLy8gUmVkaXJlY3QgYW5kIGRyYWluIHJlc3BvbnNlLgogICAgICAgIGZ1dHVyZSA9IHJlc3BvbnNlCiAgICAgICAgICAgIC5kcmFpbigpCiAgICAgICAgICAgIC50aGVuPEh0dHBDbGllbnRSZXNwb25zZT4oKF8pID0+IHJlc3BvbnNlLnJlZGlyZWN0KCkpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEVuZCB3aXRoIGV4Y2VwdGlvbiwgdG9vIG1hbnkgcmVkaXJlY3RzLgogICAgICAgIGZ1dHVyZSA9IHJlc3BvbnNlLmRyYWluKCkudGhlbjxIdHRwQ2xpZW50UmVzcG9uc2U+KChfKSB7CiAgICAgICAgICByZXR1cm4gbmV3IEZ1dHVyZTxIdHRwQ2xpZW50UmVzcG9uc2U+LmVycm9yKG5ldyBSZWRpcmVjdEV4Y2VwdGlvbigKICAgICAgICAgICAgICAiUmVkaXJlY3QgbGltaXQgZXhjZWVkZWQiLCByZXNwb25zZS5yZWRpcmVjdHMpKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfSBlbHNlIGlmIChyZXNwb25zZS5fc2hvdWxkQXV0aGVudGljYXRlUHJveHkpIHsKICAgICAgZnV0dXJlID0gcmVzcG9uc2UuX2F1dGhlbnRpY2F0ZSh0cnVlKTsKICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuX3Nob3VsZEF1dGhlbnRpY2F0ZSkgewogICAgICBmdXR1cmUgPSByZXNwb25zZS5fYXV0aGVudGljYXRlKGZhbHNlKTsKICAgIH0gZWxzZSB7CiAgICAgIGZ1dHVyZSA9IG5ldyBGdXR1cmU8SHR0cENsaWVudFJlc3BvbnNlPi52YWx1ZShyZXNwb25zZSk7CiAgICB9CiAgICBmdXR1cmUudGhlbigodikgPT4gX3Jlc3BvbnNlQ29tcGxldGVyLmNvbXBsZXRlKHYpLAogICAgICAgIG9uRXJyb3I6IF9yZXNwb25zZUNvbXBsZXRlci5jb21wbGV0ZUVycm9yKTsKICB9CgogIHZvaWQgX29uRXJyb3IoZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgX3Jlc3BvbnNlQ29tcGxldGVyLmNvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgLy8gR2VuZXJhdGUgdGhlIHJlcXVlc3QgVVJJIGJhc2VkIG9uIHRoZSBtZXRob2QgYW5kIHByb3h5LgogIFN0cmluZyBfcmVxdWVzdFVyaSgpIHsKICAgIC8vIEdlbmVyYXRlIHRoZSByZXF1ZXN0IFVSSSBzdGFydGluZyBmcm9tIHRoZSBwYXRoIGNvbXBvbmVudC4KICAgIFN0cmluZyB1cmlTdGFydGluZ0Zyb21QYXRoKCkgewogICAgICBTdHJpbmcgcmVzdWx0ID0gdXJpLnBhdGg7CiAgICAgIGlmIChyZXN1bHQuaXNFbXB0eSkgcmVzdWx0ID0gIi8iOwogICAgICBpZiAodXJpLmhhc1F1ZXJ5KSB7CiAgICAgICAgcmVzdWx0ID0gIiR7cmVzdWx0fT8ke3VyaS5xdWVyeX0iOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgaWYgKF9wcm94eS5pc0RpcmVjdCkgewogICAgICByZXR1cm4gdXJpU3RhcnRpbmdGcm9tUGF0aCgpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKG1ldGhvZCA9PSAiQ09OTkVDVCIpIHsKICAgICAgICAvLyBGb3IgdGhlIGNvbm5lY3QgbWV0aG9kIHRoZSByZXF1ZXN0IFVSSSBpcyB0aGUgaG9zdDpwb3J0IG9mCiAgICAgICAgLy8gdGhlIHJlcXVlc3RlZCBkZXN0aW5hdGlvbiBvZiB0aGUgdHVubmVsIChzZWUgUkZDIDI4MTcKICAgICAgICAvLyBzZWN0aW9uIDUuMikKICAgICAgICByZXR1cm4gIiR7dXJpLmhvc3R9OiR7dXJpLnBvcnR9IjsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoX2h0dHBDbGllbnRDb25uZWN0aW9uLl9wcm94eVR1bm5lbCkgewogICAgICAgICAgcmV0dXJuIHVyaVN0YXJ0aW5nRnJvbVBhdGgoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIHVyaS5yZW1vdmVGcmFnbWVudCgpLnRvU3RyaW5nKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIF93cml0ZUhlYWRlcigpIHsKICAgIEJ5dGVzQnVpbGRlciBidWZmZXIgPSBuZXcgX0NvcHlpbmdCeXRlc0J1aWxkZXIoX09VVEdPSU5HX0JVRkZFUl9TSVpFKTsKCiAgICAvLyBXcml0ZSB0aGUgcmVxdWVzdCBtZXRob2QuCiAgICBidWZmZXIuYWRkKG1ldGhvZC5jb2RlVW5pdHMpOwogICAgYnVmZmVyLmFkZEJ5dGUoX0NoYXJDb2RlLlNQKTsKICAgIC8vIFdyaXRlIHRoZSByZXF1ZXN0IFVSSS4KICAgIGJ1ZmZlci5hZGQoX3JlcXVlc3RVcmkoKS5jb2RlVW5pdHMpOwogICAgYnVmZmVyLmFkZEJ5dGUoX0NoYXJDb2RlLlNQKTsKICAgIC8vIFdyaXRlIEhUVFAvMS4xLgogICAgYnVmZmVyLmFkZChfQ29uc3QuSFRUUDExKTsKICAgIGJ1ZmZlci5hZGRCeXRlKF9DaGFyQ29kZS5DUik7CiAgICBidWZmZXIuYWRkQnl0ZShfQ2hhckNvZGUuTEYpOwoKICAgIC8vIEFkZCB0aGUgY29va2llcyB0byB0aGUgaGVhZGVycy4KICAgIGlmICghY29va2llcy5pc0VtcHR5KSB7CiAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb29raWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGkgPiAwKSBzYi53cml0ZSgiOyAiKTsKICAgICAgICBzYi4ud3JpdGUoY29va2llc1tpXS5uYW1lKS4ud3JpdGUoIj0iKS4ud3JpdGUoY29va2llc1tpXS52YWx1ZSk7CiAgICAgIH0KICAgICAgaGVhZGVycy5hZGQoSHR0cEhlYWRlcnMuY29va2llSGVhZGVyLCBzYi50b1N0cmluZygpKTsKICAgIH0KCiAgICBoZWFkZXJzLl9maW5hbGl6ZSgpOwoKICAgIC8vIFdyaXRlIGhlYWRlcnMuCiAgICBoZWFkZXJzLl9idWlsZChidWZmZXIpOwogICAgYnVmZmVyLmFkZEJ5dGUoX0NoYXJDb2RlLkNSKTsKICAgIGJ1ZmZlci5hZGRCeXRlKF9DaGFyQ29kZS5MRik7CiAgICBVaW50OExpc3QgaGVhZGVyQnl0ZXMgPSBidWZmZXIudGFrZUJ5dGVzKCk7CiAgICBfb3V0Z29pbmcuc2V0SGVhZGVyKGhlYWRlckJ5dGVzLCBoZWFkZXJCeXRlcy5sZW5ndGgpOwogIH0KfQoKLy8gVXNlZCBieSBfSHR0cE91dGdvaW5nIGFzIGEgdGFyZ2V0IG9mIGEgY2h1bmtlZCBjb252ZXJ0ZXIgZm9yIGd6aXAKLy8gY29tcHJlc3Npb24uCmNsYXNzIF9IdHRwR1ppcFNpbmsgZXh0ZW5kcyBCeXRlQ29udmVyc2lvblNpbmsgewogIGZpbmFsIF9CeXRlc0NvbnN1bWVyIF9jb25zdW1lOwogIF9IdHRwR1ppcFNpbmsodGhpcy5fY29uc3VtZSk7CgogIHZvaWQgYWRkKExpc3Q8aW50PiBjaHVuaykgewogICAgX2NvbnN1bWUoY2h1bmspOwogIH0KCiAgdm9pZCBhZGRTbGljZShMaXN0PGludD4gY2h1bmssIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIGlmIChjaHVuayBpcyBVaW50OExpc3QpIHsKICAgICAgX2NvbnN1bWUobmV3IFVpbnQ4TGlzdC52aWV3KGNodW5rLmJ1ZmZlciwgc3RhcnQsIGVuZCAtIHN0YXJ0KSk7CiAgICB9IGVsc2UgewogICAgICBfY29uc3VtZShjaHVuay5zdWJsaXN0KHN0YXJ0LCBlbmQgLSBzdGFydCkpOwogICAgfQogIH0KCiAgdm9pZCBjbG9zZSgpIHt9Cn0KCi8vIFRoZSBfSHR0cE91dGdvaW5nIGhhbmRsZXMgYWxsIG9mIHRoZSBmb2xsb3dpbmc6Ci8vICAtIEJ1ZmZlcmluZwovLyAgLSBHWmlwIGNvbXByZXNzaW9uCi8vICAtIENvbnRlbnQtTGVuZ3RoIHZhbGlkYXRpb24uCi8vICAtIEVycm9ycy4KLy8KLy8gTW9zdCBub3RhYmxlIGlzIHRoZSBHWmlwIGNvbXByZXNzaW9uLCB0aGF0IHVzZXMgYSBkb3VibGUtYnVmZmVyaW5nIHN5c3RlbSwKLy8gb25lIGJlZm9yZSBnemlwIChfZ3ppcEJ1ZmZlcikgYW5kIG9uZSBhZnRlciAoX2J1ZmZlcikuCmNsYXNzIF9IdHRwT3V0Z29pbmcgaW1wbGVtZW50cyBTdHJlYW1Db25zdW1lcjxMaXN0PGludD4+IHsKICBzdGF0aWMgY29uc3QgTGlzdDxpbnQ+IF9mb290ZXJBbmRDaHVuazBMZW5ndGggPSBjb25zdCBbCiAgICBfQ2hhckNvZGUuQ1IsCiAgICBfQ2hhckNvZGUuTEYsCiAgICAweDMwLAogICAgX0NoYXJDb2RlLkNSLAogICAgX0NoYXJDb2RlLkxGLAogICAgX0NoYXJDb2RlLkNSLAogICAgX0NoYXJDb2RlLkxGCiAgXTsKCiAgc3RhdGljIGNvbnN0IExpc3Q8aW50PiBfY2h1bmswTGVuZ3RoID0gY29uc3QgWwogICAgMHgzMCwKICAgIF9DaGFyQ29kZS5DUiwKICAgIF9DaGFyQ29kZS5MRiwKICAgIF9DaGFyQ29kZS5DUiwKICAgIF9DaGFyQ29kZS5MRgogIF07CgogIGZpbmFsIENvbXBsZXRlcjxTb2NrZXQ+IF9kb25lQ29tcGxldGVyID0gbmV3IENvbXBsZXRlcjxTb2NrZXQ+KCk7CiAgZmluYWwgU29ja2V0IHNvY2tldDsKCiAgYm9vbCBpZ25vcmVCb2R5ID0gZmFsc2U7CiAgYm9vbCBoZWFkZXJzV3JpdHRlbiA9IGZhbHNlOwoKICBVaW50OExpc3QgX2J1ZmZlcjsKICBpbnQgX2xlbmd0aCA9IDA7CgogIEZ1dHVyZSBfY2xvc2VGdXR1cmU7CgogIGJvb2wgY2h1bmtlZCA9IGZhbHNlOwogIGludCBfcGVuZGluZ0NodW5rZWRGb290ZXIgPSAwOwoKICBpbnQgY29udGVudExlbmd0aDsKICBpbnQgX2J5dGVzV3JpdHRlbiA9IDA7CgogIGJvb2wgX2d6aXAgPSBmYWxzZTsKICBCeXRlQ29udmVyc2lvblNpbmsgX2d6aXBTaW5rOwogIC8vIF9nemlwQWRkIGlzIHNldCBpZmYgdGhlIHNpbmsgaXMgYmVpbmcgYWRkZWQgdG8uIEl0J3MgdXNlZCB0byBzcGVjaWZ5IHdoZXJlCiAgLy8gZ3ppcHBlZCBkYXRhIHNob3VsZCBiZSB0YWtlbiAoc29tZXRpbWVzIGEgY29udHJvbGxlciwgc29tZXRpbWVzIGEgc29ja2V0KS4KICBfQnl0ZXNDb25zdW1lciBfZ3ppcEFkZDsKICBVaW50OExpc3QgX2d6aXBCdWZmZXI7CiAgaW50IF9nemlwQnVmZmVyTGVuZ3RoID0gMDsKCiAgYm9vbCBfc29ja2V0RXJyb3IgPSBmYWxzZTsKCiAgX0h0dHBPdXRib3VuZE1lc3NhZ2Ugb3V0Ym91bmQ7CgogIF9IdHRwT3V0Z29pbmcodGhpcy5zb2NrZXQpOwoKICAvLyBSZXR1cm5zIGVpdGhlciBhIGZ1dHVyZSBvciAnbnVsbCcsIGlmIGl0IHdhcyBhYmxlIHRvIHdyaXRlIGhlYWRlcnMKICAvLyBpbW1lZGlhdGVseS4KICBGdXR1cmUgd3JpdGVIZWFkZXJzKHtib29sIGRyYWluUmVxdWVzdDogdHJ1ZSwgYm9vbCBzZXRPdXRnb2luZzogdHJ1ZX0pIHsKICAgIGlmIChoZWFkZXJzV3JpdHRlbikgcmV0dXJuIG51bGw7CiAgICBoZWFkZXJzV3JpdHRlbiA9IHRydWU7CiAgICBGdXR1cmUgZHJhaW5GdXR1cmU7CiAgICBib29sIGd6aXAgPSBmYWxzZTsKICAgIGlmIChvdXRib3VuZCBpcyBfSHR0cFJlc3BvbnNlKSB7CiAgICAgIC8vIFNlcnZlciBzaWRlLgogICAgICBfSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gb3V0Ym91bmQ7CiAgICAgIGlmIChyZXNwb25zZS5faHR0cFJlcXVlc3QuX2h0dHBTZXJ2ZXIuYXV0b0NvbXByZXNzICYmCiAgICAgICAgICBvdXRib3VuZC5idWZmZXJPdXRwdXQgJiYKICAgICAgICAgIG91dGJvdW5kLmhlYWRlcnMuY2h1bmtlZFRyYW5zZmVyRW5jb2RpbmcpIHsKICAgICAgICBMaXN0IGFjY2VwdEVuY29kaW5ncyA9CiAgICAgICAgICAgIHJlc3BvbnNlLl9odHRwUmVxdWVzdC5oZWFkZXJzW0h0dHBIZWFkZXJzLmFjY2VwdEVuY29kaW5nSGVhZGVyXTsKICAgICAgICBMaXN0IGNvbnRlbnRFbmNvZGluZyA9CiAgICAgICAgICAgIG91dGJvdW5kLmhlYWRlcnNbSHR0cEhlYWRlcnMuY29udGVudEVuY29kaW5nSGVhZGVyXTsKICAgICAgICBpZiAoYWNjZXB0RW5jb2RpbmdzICE9IG51bGwgJiYKICAgICAgICAgICAgYWNjZXB0RW5jb2RpbmdzCiAgICAgICAgICAgICAgICAuZXhwYW5kKChsaXN0KSA9PiBsaXN0LnNwbGl0KCIsIikpCiAgICAgICAgICAgICAgICAuYW55KChlbmNvZGluZykgPT4gZW5jb2RpbmcudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT0gImd6aXAiKSAmJgogICAgICAgICAgICBjb250ZW50RW5jb2RpbmcgPT0gbnVsbCkgewogICAgICAgICAgb3V0Ym91bmQuaGVhZGVycy5zZXQoSHR0cEhlYWRlcnMuY29udGVudEVuY29kaW5nSGVhZGVyLCAiZ3ppcCIpOwogICAgICAgICAgZ3ppcCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChkcmFpblJlcXVlc3QgJiYgIXJlc3BvbnNlLl9odHRwUmVxdWVzdC5faW5jb21pbmcuaGFzU3Vic2NyaWJlcikgewogICAgICAgIGRyYWluRnV0dXJlID0gcmVzcG9uc2UuX2h0dHBSZXF1ZXN0LmRyYWluKCkuY2F0Y2hFcnJvcigoXykge30pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBkcmFpblJlcXVlc3QgPSBmYWxzZTsKICAgIH0KICAgIGlmICghaWdub3JlQm9keSkgewogICAgICBpZiAoc2V0T3V0Z29pbmcpIHsKICAgICAgICBpbnQgY29udGVudExlbmd0aCA9IG91dGJvdW5kLmhlYWRlcnMuY29udGVudExlbmd0aDsKICAgICAgICBpZiAob3V0Ym91bmQuaGVhZGVycy5jaHVua2VkVHJhbnNmZXJFbmNvZGluZykgewogICAgICAgICAgY2h1bmtlZCA9IHRydWU7CiAgICAgICAgICBpZiAoZ3ppcCkgdGhpcy5nemlwID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRMZW5ndGggPj0gMCkgewogICAgICAgICAgdGhpcy5jb250ZW50TGVuZ3RoID0gY29udGVudExlbmd0aDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGRyYWluRnV0dXJlICE9IG51bGwpIHsKICAgICAgICByZXR1cm4gZHJhaW5GdXR1cmUudGhlbigoXykgPT4gb3V0Ym91bmQuX3dyaXRlSGVhZGVyKCkpOwogICAgICB9CiAgICB9CiAgICBvdXRib3VuZC5fd3JpdGVIZWFkZXIoKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgRnV0dXJlIGFkZFN0cmVhbShTdHJlYW08TGlzdDxpbnQ+PiBzdHJlYW0pIHsKICAgIGlmIChfc29ja2V0RXJyb3IpIHsKICAgICAgc3RyZWFtLmxpc3RlbihudWxsKS5jYW5jZWwoKTsKICAgICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUob3V0Ym91bmQpOwogICAgfQogICAgaWYgKGlnbm9yZUJvZHkpIHsKICAgICAgc3RyZWFtLmRyYWluKCkuY2F0Y2hFcnJvcigoXykge30pOwogICAgICB2YXIgZnV0dXJlID0gd3JpdGVIZWFkZXJzKCk7CiAgICAgIGlmIChmdXR1cmUgIT0gbnVsbCkgewogICAgICAgIHJldHVybiBmdXR1cmUudGhlbigoXykgPT4gY2xvc2UoKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGNsb3NlKCk7CiAgICB9CiAgICBTdHJlYW1TdWJzY3JpcHRpb248TGlzdDxpbnQ+PiBzdWI7CiAgICAvLyBVc2UgbmV3IHN0cmVhbSBzbyB3ZSBhcmUgYWJsZSB0byBwYXVzZSAoc2VlIGJlbG93IGxpc3RlbikuIFRoZQogICAgLy8gYWx0ZXJuYXRpdmUgaXMgdG8gdXNlIHN0cmVhbS5leHRhbmQsIGJ1dCB0aGF0IHdvbid0IGdpdmUgdXMgYSB3YXkgb2YKICAgIC8vIHBhdXNpbmcuCiAgICB2YXIgY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyPExpc3Q8aW50Pj4oCiAgICAgICAgb25QYXVzZTogKCkgPT4gc3ViLnBhdXNlKCksIG9uUmVzdW1lOiAoKSA9PiBzdWIucmVzdW1lKCksIHN5bmM6IHRydWUpOwoKICAgIHZvaWQgb25EYXRhKExpc3Q8aW50PiBkYXRhKSB7CiAgICAgIGlmIChfc29ja2V0RXJyb3IpIHJldHVybjsKICAgICAgaWYgKGRhdGEubGVuZ3RoID09IDApIHJldHVybjsKICAgICAgaWYgKGNodW5rZWQpIHsKICAgICAgICBpZiAoX2d6aXApIHsKICAgICAgICAgIF9nemlwQWRkID0gY29udHJvbGxlci5hZGQ7CiAgICAgICAgICBfYWRkR1ppcENodW5rKGRhdGEsIF9nemlwU2luay5hZGQpOwogICAgICAgICAgX2d6aXBBZGQgPSBudWxsOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBfYWRkQ2h1bmsoX2NodW5rSGVhZGVyKGRhdGEubGVuZ3RoKSwgY29udHJvbGxlci5hZGQpOwogICAgICAgIF9wZW5kaW5nQ2h1bmtlZEZvb3RlciA9IDI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGNvbnRlbnRMZW5ndGggIT0gbnVsbCkgewogICAgICAgICAgX2J5dGVzV3JpdHRlbiArPSBkYXRhLmxlbmd0aDsKICAgICAgICAgIGlmIChfYnl0ZXNXcml0dGVuID4gY29udGVudExlbmd0aCkgewogICAgICAgICAgICBjb250cm9sbGVyLmFkZEVycm9yKG5ldyBIdHRwRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgIkNvbnRlbnQgc2l6ZSBleGNlZWRzIHNwZWNpZmllZCBjb250ZW50TGVuZ3RoLiAiCiAgICAgICAgICAgICAgICAiJF9ieXRlc1dyaXR0ZW4gYnl0ZXMgd3JpdHRlbiB3aGlsZSBleHBlY3RlZCAiCiAgICAgICAgICAgICAgICAiJGNvbnRlbnRMZW5ndGguICIKICAgICAgICAgICAgICAgICJbJHtuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoZGF0YSl9XSIpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBfYWRkQ2h1bmsoZGF0YSwgY29udHJvbGxlci5hZGQpOwogICAgfQoKICAgIHN1YiA9IHN0cmVhbS5saXN0ZW4ob25EYXRhLAogICAgICAgIG9uRXJyb3I6IGNvbnRyb2xsZXIuYWRkRXJyb3IsCiAgICAgICAgb25Eb25lOiBjb250cm9sbGVyLmNsb3NlLAogICAgICAgIGNhbmNlbE9uRXJyb3I6IHRydWUpOwogICAgLy8gV3JpdGUgaGVhZGVycyBub3cgdGhhdCB3ZSBhcmUgbGlzdGVuaW5nIHRvIHRoZSBzdHJlYW0uCiAgICBpZiAoIWhlYWRlcnNXcml0dGVuKSB7CiAgICAgIHZhciBmdXR1cmUgPSB3cml0ZUhlYWRlcnMoKTsKICAgICAgaWYgKGZ1dHVyZSAhPSBudWxsKSB7CiAgICAgICAgLy8gV2hpbGUgaW5jb21pbmcgaXMgYmVpbmcgZHJhaW5lZCwgdGhlIHBhdXNlRnV0dXJlIGlzIG5vbi1udWxsLiBQYXVzZQogICAgICAgIC8vIG91dHB1dCB1bnRpbCBpdCdzIGRyYWluZWQuCiAgICAgICAgc3ViLnBhdXNlKGZ1dHVyZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzb2NrZXQuYWRkU3RyZWFtKGNvbnRyb2xsZXIuc3RyZWFtKS50aGVuKChfKSB7CiAgICAgIHJldHVybiBvdXRib3VuZDsKICAgIH0sIG9uRXJyb3I6IChlcnJvciwgc3RhY2tUcmFjZSkgewogICAgICAvLyBCZSBzdXJlIHRvIGNsb3NlIGl0IGluIGNhc2Ugb2YgYW4gZXJyb3IuCiAgICAgIGlmIChfZ3ppcCkgX2d6aXBTaW5rLmNsb3NlKCk7CiAgICAgIF9zb2NrZXRFcnJvciA9IHRydWU7CiAgICAgIF9kb25lQ29tcGxldGVyLmNvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICBpZiAoX2lnbm9yZUVycm9yKGVycm9yKSkgewogICAgICAgIHJldHVybiBvdXRib3VuZDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgfQogICAgfSk7CiAgfQoKICBGdXR1cmUgY2xvc2UoKSB7CiAgICAvLyBJZiB3ZSBhcmUgYWxyZWFkeSBjbG9zZWQsIHJldHVybiB0aGF0IGZ1dHVyZS4KICAgIGlmIChfY2xvc2VGdXR1cmUgIT0gbnVsbCkgcmV0dXJuIF9jbG9zZUZ1dHVyZTsKICAgIC8vIElmIHdlIGVhcmxpZXIgc2F3IGFuIGVycm9yLCByZXR1cm4gaW1tZWRpYXRlLiBUaGUgbm90aWZpY2F0aW9uIHRvCiAgICAvLyBfSHR0cCpDb25uZWN0aW9uIGlzIGFscmVhZHkgZG9uZS4KICAgIGlmIChfc29ja2V0RXJyb3IpIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKG91dGJvdW5kKTsKICAgIGlmIChvdXRib3VuZC5faXNDb25uZWN0aW9uQ2xvc2VkKSByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZShvdXRib3VuZCk7CiAgICBpZiAoIWhlYWRlcnNXcml0dGVuICYmICFpZ25vcmVCb2R5KSB7CiAgICAgIGlmIChvdXRib3VuZC5oZWFkZXJzLmNvbnRlbnRMZW5ndGggPT0gLTEpIHsKICAgICAgICAvLyBJZiBubyBib2R5IHdhcyB3cml0dGVuLCBpZ25vcmVCb2R5IGlzIGZhbHNlIChpdCdzIG5vdCBhIEhFQUQKICAgICAgICAvLyByZXF1ZXN0KSBhbmQgdGhlIGNvbnRlbnQtbGVuZ3RoIGlzIHVuc3BlY2lmaWVkLCBzZXQgY29udGVudExlbmd0aCB0bwogICAgICAgIC8vIDAuCiAgICAgICAgb3V0Ym91bmQuaGVhZGVycy5jaHVua2VkVHJhbnNmZXJFbmNvZGluZyA9IGZhbHNlOwogICAgICAgIG91dGJvdW5kLmhlYWRlcnMuY29udGVudExlbmd0aCA9IDA7CiAgICAgIH0gZWxzZSBpZiAob3V0Ym91bmQuaGVhZGVycy5jb250ZW50TGVuZ3RoID4gMCkgewogICAgICAgIHZhciBlcnJvciA9IG5ldyBIdHRwRXhjZXB0aW9uKAogICAgICAgICAgICAiTm8gY29udGVudCBldmVuIHRob3VnaCBjb250ZW50TGVuZ3RoIHdhcyBzcGVjaWZpZWQgdG8gYmUgIgogICAgICAgICAgICAiZ3JlYXRlciB0aGFuIDA6ICR7b3V0Ym91bmQuaGVhZGVycy5jb250ZW50TGVuZ3RofS4iLAogICAgICAgICAgICB1cmk6IG91dGJvdW5kLl91cmkpOwogICAgICAgIF9kb25lQ29tcGxldGVyLmNvbXBsZXRlRXJyb3IoZXJyb3IpOwogICAgICAgIHJldHVybiBfY2xvc2VGdXR1cmUgPSBuZXcgRnV0dXJlLmVycm9yKGVycm9yKTsKICAgICAgfQogICAgfQogICAgLy8gSWYgY29udGVudExlbmd0aCB3YXMgc3BlY2lmaWVkLCB2YWxpZGF0ZSBpdC4KICAgIGlmIChjb250ZW50TGVuZ3RoICE9IG51bGwpIHsKICAgICAgaWYgKF9ieXRlc1dyaXR0ZW4gPCBjb250ZW50TGVuZ3RoKSB7CiAgICAgICAgdmFyIGVycm9yID0gbmV3IEh0dHBFeGNlcHRpb24oCiAgICAgICAgICAgICJDb250ZW50IHNpemUgYmVsb3cgc3BlY2lmaWVkIGNvbnRlbnRMZW5ndGguICIKICAgICAgICAgICAgIiAkX2J5dGVzV3JpdHRlbiBieXRlcyB3cml0dGVuIGJ1dCBleHBlY3RlZCAiCiAgICAgICAgICAgICIkY29udGVudExlbmd0aC4iLAogICAgICAgICAgICB1cmk6IG91dGJvdW5kLl91cmkpOwogICAgICAgIF9kb25lQ29tcGxldGVyLmNvbXBsZXRlRXJyb3IoZXJyb3IpOwogICAgICAgIHJldHVybiBfY2xvc2VGdXR1cmUgPSBuZXcgRnV0dXJlLmVycm9yKGVycm9yKTsKICAgICAgfQogICAgfQoKICAgIEZ1dHVyZSBmaW5hbGl6ZSgpIHsKICAgICAgLy8gSW4gY2FzZSBvZiBjaHVua2VkIGVuY29kaW5nIChhbmQgZ3ppcCksIGhhbmRsZSByZW1haW5pbmcgZ3ppcCBkYXRhIGFuZAogICAgICAvLyBhcHBlbmQgdGhlICdmb290ZXInIGZvciBjaHVua2VkIGVuY29kaW5nLgogICAgICBpZiAoY2h1bmtlZCkgewogICAgICAgIGlmIChfZ3ppcCkgewogICAgICAgICAgX2d6aXBBZGQgPSBzb2NrZXQuYWRkOwogICAgICAgICAgaWYgKF9nemlwQnVmZmVyTGVuZ3RoID4gMCkgewogICAgICAgICAgICBfZ3ppcFNpbmsuYWRkKAogICAgICAgICAgICAgICAgbmV3IFVpbnQ4TGlzdC52aWV3KF9nemlwQnVmZmVyLmJ1ZmZlciwgMCwgX2d6aXBCdWZmZXJMZW5ndGgpKTsKICAgICAgICAgIH0KICAgICAgICAgIF9nemlwQnVmZmVyID0gbnVsbDsKICAgICAgICAgIF9nemlwU2luay5jbG9zZSgpOwogICAgICAgICAgX2d6aXBBZGQgPSBudWxsOwogICAgICAgIH0KICAgICAgICBfYWRkQ2h1bmsoX2NodW5rSGVhZGVyKDApLCBzb2NrZXQuYWRkKTsKICAgICAgfQogICAgICAvLyBBZGQgYW55IHJlbWFpbmluZyBkYXRhIGluIHRoZSBidWZmZXIuCiAgICAgIGlmIChfbGVuZ3RoID4gMCkgewogICAgICAgIHNvY2tldC5hZGQobmV3IFVpbnQ4TGlzdC52aWV3KF9idWZmZXIuYnVmZmVyLCAwLCBfbGVuZ3RoKSk7CiAgICAgIH0KICAgICAgLy8gQ2xlYXIgcmVmZXJlbmNlcywgZm9yIGJldHRlciBHQy4KICAgICAgX2J1ZmZlciA9IG51bGw7CiAgICAgIC8vIEFuZCBmaW5hbGx5IGZsdXNoIGl0LiBBcyB3ZSBzdXBwb3J0IGtlZXAtYWxpdmUsIG5ldmVyIGNsb3NlIGl0IGZyb20KICAgICAgLy8gaGVyZS4gT25jZSB0aGUgc29ja2V0IGlzIGZsdXNoZWQsIHdlJ2xsIGJlIGFibGUgdG8gcmV1c2UgaXQgKHNpZ25hbGVkCiAgICAgIC8vIGJ5IHRoZSAnZG9uZScgZnV0dXJlKS4KICAgICAgcmV0dXJuIHNvY2tldC5mbHVzaCgpLnRoZW4oKF8pIHsKICAgICAgICBfZG9uZUNvbXBsZXRlci5jb21wbGV0ZShzb2NrZXQpOwogICAgICAgIHJldHVybiBvdXRib3VuZDsKICAgICAgfSwgb25FcnJvcjogKGVycm9yLCBzdGFja1RyYWNlKSB7CiAgICAgICAgX2RvbmVDb21wbGV0ZXIuY29tcGxldGVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgICAgaWYgKF9pZ25vcmVFcnJvcihlcnJvcikpIHsKICAgICAgICAgIHJldHVybiBvdXRib3VuZDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgICB2YXIgZnV0dXJlID0gd3JpdGVIZWFkZXJzKCk7CiAgICBpZiAoZnV0dXJlICE9IG51bGwpIHsKICAgICAgcmV0dXJuIF9jbG9zZUZ1dHVyZSA9IGZ1dHVyZS53aGVuQ29tcGxldGUoZmluYWxpemUpOwogICAgfQogICAgcmV0dXJuIF9jbG9zZUZ1dHVyZSA9IGZpbmFsaXplKCk7CiAgfQoKICBGdXR1cmU8U29ja2V0PiBnZXQgZG9uZSA9PiBfZG9uZUNvbXBsZXRlci5mdXR1cmU7CgogIHZvaWQgc2V0SGVhZGVyKExpc3Q8aW50PiBkYXRhLCBpbnQgbGVuZ3RoKSB7CiAgICBhc3NlcnQoX2xlbmd0aCA9PSAwKTsKICAgIF9idWZmZXIgPSBkYXRhOwogICAgX2xlbmd0aCA9IGxlbmd0aDsKICB9CgogIHZvaWQgc2V0IGd6aXAoYm9vbCB2YWx1ZSkgewogICAgX2d6aXAgPSB2YWx1ZTsKICAgIGlmIChfZ3ppcCkgewogICAgICBfZ3ppcEJ1ZmZlciA9IG5ldyBVaW50OExpc3QoX09VVEdPSU5HX0JVRkZFUl9TSVpFKTsKICAgICAgYXNzZXJ0KF9nemlwU2luayA9PSBudWxsKTsKICAgICAgX2d6aXBTaW5rID0gbmV3IFpMaWJFbmNvZGVyKGd6aXA6IHRydWUpCiAgICAgICAgICAuc3RhcnRDaHVua2VkQ29udmVyc2lvbihuZXcgX0h0dHBHWmlwU2luaygoZGF0YSkgewogICAgICAgIC8vIFdlIGFyZSBjbG9zaW5nIGRvd24gcHJlbWF0dXJlbHksIGR1ZSB0byBhbiBlcnJvci4gRGlzY2FyZC4KICAgICAgICBpZiAoX2d6aXBBZGQgPT0gbnVsbCkgcmV0dXJuOwogICAgICAgIF9hZGRDaHVuayhfY2h1bmtIZWFkZXIoZGF0YS5sZW5ndGgpLCBfZ3ppcEFkZCk7CiAgICAgICAgX3BlbmRpbmdDaHVua2VkRm9vdGVyID0gMjsKICAgICAgICBfYWRkQ2h1bmsoZGF0YSwgX2d6aXBBZGQpOwogICAgICB9KSk7CiAgICB9CiAgfQoKICBib29sIF9pZ25vcmVFcnJvcihlcnJvcikgPT4KICAgICAgKGVycm9yIGlzIFNvY2tldEV4Y2VwdGlvbiB8fCBlcnJvciBpcyBUbHNFeGNlcHRpb24pICYmCiAgICAgIG91dGJvdW5kIGlzIEh0dHBSZXNwb25zZTsKCiAgdm9pZCBfYWRkR1ppcENodW5rKExpc3Q8aW50PiBjaHVuaywgdm9pZCBhZGQoTGlzdDxpbnQ+IGRhdGEpKSB7CiAgICBpZiAoIW91dGJvdW5kLmJ1ZmZlck91dHB1dCkgewogICAgICBhZGQoY2h1bmspOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoY2h1bmsubGVuZ3RoID4gX2d6aXBCdWZmZXIubGVuZ3RoIC0gX2d6aXBCdWZmZXJMZW5ndGgpIHsKICAgICAgYWRkKG5ldyBVaW50OExpc3QudmlldyhfZ3ppcEJ1ZmZlci5idWZmZXIsIDAsIF9nemlwQnVmZmVyTGVuZ3RoKSk7CiAgICAgIF9nemlwQnVmZmVyID0gbmV3IFVpbnQ4TGlzdChfT1VUR09JTkdfQlVGRkVSX1NJWkUpOwogICAgICBfZ3ppcEJ1ZmZlckxlbmd0aCA9IDA7CiAgICB9CiAgICBpZiAoY2h1bmsubGVuZ3RoID4gX09VVEdPSU5HX0JVRkZFUl9TSVpFKSB7CiAgICAgIGFkZChjaHVuayk7CiAgICB9IGVsc2UgewogICAgICBfZ3ppcEJ1ZmZlci5zZXRSYW5nZSgKICAgICAgICAgIF9nemlwQnVmZmVyTGVuZ3RoLCBfZ3ppcEJ1ZmZlckxlbmd0aCArIGNodW5rLmxlbmd0aCwgY2h1bmspOwogICAgICBfZ3ppcEJ1ZmZlckxlbmd0aCArPSBjaHVuay5sZW5ndGg7CiAgICB9CiAgfQoKICB2b2lkIF9hZGRDaHVuayhMaXN0PGludD4gY2h1bmssIHZvaWQgYWRkKExpc3Q8aW50PiBkYXRhKSkgewogICAgaWYgKCFvdXRib3VuZC5idWZmZXJPdXRwdXQpIHsKICAgICAgaWYgKF9idWZmZXIgIT0gbnVsbCkgewogICAgICAgIC8vIElmIF9idWZmZXIgaXMgbm90IG51bGwsIHdlIGhhdmUgbm90IHdyaXR0ZW4gdGhlIGhlYWRlciB5ZXQuIFdyaXRlCiAgICAgICAgLy8gaXQgbm93LgogICAgICAgIGFkZChuZXcgVWludDhMaXN0LnZpZXcoX2J1ZmZlci5idWZmZXIsIDAsIF9sZW5ndGgpKTsKICAgICAgICBfYnVmZmVyID0gbnVsbDsKICAgICAgICBfbGVuZ3RoID0gMDsKICAgICAgfQogICAgICBhZGQoY2h1bmspOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoY2h1bmsubGVuZ3RoID4gX2J1ZmZlci5sZW5ndGggLSBfbGVuZ3RoKSB7CiAgICAgIGFkZChuZXcgVWludDhMaXN0LnZpZXcoX2J1ZmZlci5idWZmZXIsIDAsIF9sZW5ndGgpKTsKICAgICAgX2J1ZmZlciA9IG5ldyBVaW50OExpc3QoX09VVEdPSU5HX0JVRkZFUl9TSVpFKTsKICAgICAgX2xlbmd0aCA9IDA7CiAgICB9CiAgICBpZiAoY2h1bmsubGVuZ3RoID4gX09VVEdPSU5HX0JVRkZFUl9TSVpFKSB7CiAgICAgIGFkZChjaHVuayk7CiAgICB9IGVsc2UgewogICAgICBfYnVmZmVyLnNldFJhbmdlKF9sZW5ndGgsIF9sZW5ndGggKyBjaHVuay5sZW5ndGgsIGNodW5rKTsKICAgICAgX2xlbmd0aCArPSBjaHVuay5sZW5ndGg7CiAgICB9CiAgfQoKICBMaXN0PGludD4gX2NodW5rSGVhZGVyKGludCBsZW5ndGgpIHsKICAgIGNvbnN0IGhleERpZ2l0cyA9IGNvbnN0IFsKICAgICAgMHgzMCwKICAgICAgMHgzMSwKICAgICAgMHgzMiwKICAgICAgMHgzMywKICAgICAgMHgzNCwKICAgICAgMHgzNSwKICAgICAgMHgzNiwKICAgICAgMHgzNywKICAgICAgMHgzOCwKICAgICAgMHgzOSwKICAgICAgMHg0MSwKICAgICAgMHg0MiwKICAgICAgMHg0MywKICAgICAgMHg0NCwKICAgICAgMHg0NSwKICAgICAgMHg0NgogICAgXTsKICAgIGlmIChsZW5ndGggPT0gMCkgewogICAgICBpZiAoX3BlbmRpbmdDaHVua2VkRm9vdGVyID09IDIpIHJldHVybiBfZm9vdGVyQW5kQ2h1bmswTGVuZ3RoOwogICAgICByZXR1cm4gX2NodW5rMExlbmd0aDsKICAgIH0KICAgIGludCBzaXplID0gX3BlbmRpbmdDaHVua2VkRm9vdGVyOwogICAgaW50IGxlbiA9IGxlbmd0aDsKICAgIC8vIENvbXB1dGUgYSBmYXN0IGludGVnZXIgdmVyc2lvbiBvZiAobG9nKGxlbmd0aCArIDEpIC8gbG9nKDE2KSkuY2VpbCgpLgogICAgd2hpbGUgKGxlbiA+IDApIHsKICAgICAgc2l6ZSsrOwogICAgICBsZW4gPj49IDQ7CiAgICB9CiAgICB2YXIgZm9vdGVyQW5kSGVhZGVyID0gbmV3IFVpbnQ4TGlzdChzaXplICsgMik7CiAgICBpZiAoX3BlbmRpbmdDaHVua2VkRm9vdGVyID09IDIpIHsKICAgICAgZm9vdGVyQW5kSGVhZGVyWzBdID0gX0NoYXJDb2RlLkNSOwogICAgICBmb290ZXJBbmRIZWFkZXJbMV0gPSBfQ2hhckNvZGUuTEY7CiAgICB9CiAgICBpbnQgaW5kZXggPSBzaXplOwogICAgd2hpbGUgKGluZGV4ID4gX3BlbmRpbmdDaHVua2VkRm9vdGVyKSB7CiAgICAgIGZvb3RlckFuZEhlYWRlclstLWluZGV4XSA9IGhleERpZ2l0c1tsZW5ndGggJiAxNV07CiAgICAgIGxlbmd0aCA9IGxlbmd0aCA+PiA0OwogICAgfQogICAgZm9vdGVyQW5kSGVhZGVyW3NpemUgKyAwXSA9IF9DaGFyQ29kZS5DUjsKICAgIGZvb3RlckFuZEhlYWRlcltzaXplICsgMV0gPSBfQ2hhckNvZGUuTEY7CiAgICByZXR1cm4gZm9vdGVyQW5kSGVhZGVyOwogIH0KfQoKY2xhc3MgX0h0dHBDbGllbnRDb25uZWN0aW9uIHsKICBmaW5hbCBTdHJpbmcga2V5OwogIGZpbmFsIFNvY2tldCBfc29ja2V0OwogIGZpbmFsIGJvb2wgX3Byb3h5VHVubmVsOwogIGZpbmFsIFNlY3VyaXR5Q29udGV4dCBfY29udGV4dDsKICBmaW5hbCBfSHR0cFBhcnNlciBfaHR0cFBhcnNlcjsKICBTdHJlYW1TdWJzY3JpcHRpb24gX3N1YnNjcmlwdGlvbjsKICBmaW5hbCBfSHR0cENsaWVudCBfaHR0cENsaWVudDsKICBib29sIF9kaXNwb3NlID0gZmFsc2U7CiAgVGltZXIgX2lkbGVUaW1lcjsKICBib29sIGNsb3NlZCA9IGZhbHNlOwogIFVyaSBfY3VycmVudFVyaTsKCiAgQ29tcGxldGVyPF9IdHRwSW5jb21pbmc+IF9uZXh0UmVzcG9uc2VDb21wbGV0ZXI7CiAgRnV0dXJlPFNvY2tldD4gX3N0cmVhbUZ1dHVyZTsKCiAgX0h0dHBDbGllbnRDb25uZWN0aW9uKHRoaXMua2V5LCB0aGlzLl9zb2NrZXQsIHRoaXMuX2h0dHBDbGllbnQsCiAgICAgIFt0aGlzLl9wcm94eVR1bm5lbCA9IGZhbHNlLCB0aGlzLl9jb250ZXh0XSkKICAgICAgOiBfaHR0cFBhcnNlciA9IG5ldyBfSHR0cFBhcnNlci5yZXNwb25zZVBhcnNlcigpIHsKICAgIF9odHRwUGFyc2VyLmxpc3RlblRvU3RyZWFtKF9zb2NrZXQpOwoKICAgIC8vIFNldCB1cCBoYW5kbGVycyBvbiB0aGUgcGFyc2VyIGhlcmUsIHNvIHdlIGFyZSBzdXJlIHRvIGdldCAnb25Eb25lJyBmcm9tCiAgICAvLyB0aGUgcGFyc2VyLgogICAgX3N1YnNjcmlwdGlvbiA9IF9odHRwUGFyc2VyLmxpc3RlbigoaW5jb21pbmcpIHsKICAgICAgLy8gT25seSBoYW5kbGUgb25lIGluY29taW5nIHJlc3BvbnNlIGF0IHRoZSB0aW1lLiBLZWVwIHRoZQogICAgICAvLyBzdHJlYW0gcGF1c2VkIHVudGlsIHRoZSByZXNwb25zZSBoYXZlIGJlZW4gcHJvY2Vzc2VkLgogICAgICBfc3Vic2NyaXB0aW9uLnBhdXNlKCk7CiAgICAgIC8vIFdlIGFzc3VtZSB0aGUgcmVzcG9uc2UgaXMgbm90IGhlcmUsIHVudGlsIHdlIGhhdmUgc2VuZCB0aGUgcmVxdWVzdC4KICAgICAgaWYgKF9uZXh0UmVzcG9uc2VDb21wbGV0ZXIgPT0gbnVsbCkgewogICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKAogICAgICAgICAgICAiVW5leHBlY3RlZCByZXNwb25zZSAodW5zb2xpY2l0ZWQgcmVzcG9uc2Ugd2l0aG91dCByZXF1ZXN0KS4iLAogICAgICAgICAgICB1cmk6IF9jdXJyZW50VXJpKTsKICAgICAgfQoKICAgICAgLy8gQ2hlY2sgZm9yIHN0YXR1cyBjb2RlICcxMDAgQ29udGludWUnLiBJbiB0aGF0IGNhc2UganVzdAogICAgICAvLyBjb25zdW1lIHRoYXQgcmVzcG9uc2UgYXMgdGhlIGZpbmFsIHJlc3BvbnNlIHdpbGwgZm9sbG93CiAgICAgIC8vIGl0LiBUaGVyZSBpcyBjdXJyZW50bHkgbm8gQVBJIGZvciB0aGUgY2xpZW50IHRvIHdhaXQgZm9yCiAgICAgIC8vIHRoZSAnMTAwIENvbnRpbnVlJyByZXNwb25zZS4KICAgICAgaWYgKGluY29taW5nLnN0YXR1c0NvZGUgPT0gMTAwKSB7CiAgICAgICAgaW5jb21pbmcuZHJhaW4oKS50aGVuKChfKSB7CiAgICAgICAgICBfc3Vic2NyaXB0aW9uLnJlc3VtZSgpOwogICAgICAgIH0pLmNhdGNoRXJyb3IoKGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSkgewogICAgICAgICAgX25leHRSZXNwb25zZUNvbXBsZXRlci5jb21wbGV0ZUVycm9yKAogICAgICAgICAgICAgIG5ldyBIdHRwRXhjZXB0aW9uKGVycm9yLm1lc3NhZ2UsIHVyaTogX2N1cnJlbnRVcmkpLCBzdGFja1RyYWNlKTsKICAgICAgICAgIF9uZXh0UmVzcG9uc2VDb21wbGV0ZXIgPSBudWxsOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIF9uZXh0UmVzcG9uc2VDb21wbGV0ZXIuY29tcGxldGUoaW5jb21pbmcpOwogICAgICAgIF9uZXh0UmVzcG9uc2VDb21wbGV0ZXIgPSBudWxsOwogICAgICB9CiAgICB9LCBvbkVycm9yOiAoZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICAgIGlmIChfbmV4dFJlc3BvbnNlQ29tcGxldGVyICE9IG51bGwpIHsKICAgICAgICBfbmV4dFJlc3BvbnNlQ29tcGxldGVyLmNvbXBsZXRlRXJyb3IoCiAgICAgICAgICAgIG5ldyBIdHRwRXhjZXB0aW9uKGVycm9yLm1lc3NhZ2UsIHVyaTogX2N1cnJlbnRVcmkpLCBzdGFja1RyYWNlKTsKICAgICAgICBfbmV4dFJlc3BvbnNlQ29tcGxldGVyID0gbnVsbDsKICAgICAgfQogICAgfSwgb25Eb25lOiAoKSB7CiAgICAgIGlmIChfbmV4dFJlc3BvbnNlQ29tcGxldGVyICE9IG51bGwpIHsKICAgICAgICBfbmV4dFJlc3BvbnNlQ29tcGxldGVyLmNvbXBsZXRlRXJyb3IobmV3IEh0dHBFeGNlcHRpb24oCiAgICAgICAgICAgICJDb25uZWN0aW9uIGNsb3NlZCBiZWZvcmUgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkIiwKICAgICAgICAgICAgdXJpOiBfY3VycmVudFVyaSkpOwogICAgICAgIF9uZXh0UmVzcG9uc2VDb21wbGV0ZXIgPSBudWxsOwogICAgICB9CiAgICAgIGNsb3NlKCk7CiAgICB9KTsKICB9CgogIF9IdHRwQ2xpZW50UmVxdWVzdCBzZW5kKFVyaSB1cmksIGludCBwb3J0LCBTdHJpbmcgbWV0aG9kLCBfUHJveHkgcHJveHkpIHsKICAgIGlmIChjbG9zZWQpIHsKICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIlNvY2tldCBjbG9zZWQgYmVmb3JlIHJlcXVlc3Qgd2FzIHNlbnQiLAogICAgICAgICAgdXJpOiB1cmkpOwogICAgfQogICAgX2N1cnJlbnRVcmkgPSB1cmk7CiAgICAvLyBTdGFydCB3aXRoIHBhdXNpbmcgdGhlIHBhcnNlci4KICAgIF9zdWJzY3JpcHRpb24ucGF1c2UoKTsKICAgIF9Qcm94eUNyZWRlbnRpYWxzIHByb3h5Q3JlZHM7IC8vIENyZWRlbnRpYWxzIHVzZWQgdG8gYXV0aG9yaXplIHByb3h5LgogICAgX1NpdGVDcmVkZW50aWFscyBjcmVkczsgLy8gQ3JlZGVudGlhbHMgdXNlZCB0byBhdXRob3JpemUgdGhpcyByZXF1ZXN0LgogICAgdmFyIG91dGdvaW5nID0gbmV3IF9IdHRwT3V0Z29pbmcoX3NvY2tldCk7CiAgICAvLyBDcmVhdGUgbmV3IHJlcXVlc3Qgb2JqZWN0LCB3cmFwcGluZyB0aGUgb3V0Z29pbmcgY29ubmVjdGlvbi4KICAgIHZhciByZXF1ZXN0ID0KICAgICAgICBuZXcgX0h0dHBDbGllbnRSZXF1ZXN0KG91dGdvaW5nLCB1cmksIG1ldGhvZCwgcHJveHksIF9odHRwQ2xpZW50LCB0aGlzKTsKICAgIC8vIEZvciB0aGUgSG9zdCBoZWFkZXIgYW4gSVB2NiBhZGRyZXNzIG11c3QgYmUgZW5jbG9zZWQgaW4gW10ncy4KICAgIHZhciBob3N0ID0gdXJpLmhvc3Q7CiAgICBpZiAoaG9zdC5jb250YWlucygnOicpKSBob3N0ID0gIlskaG9zdF0iOwogICAgcmVxdWVzdC5oZWFkZXJzCiAgICAgIC4uaG9zdCA9IGhvc3QKICAgICAgLi5wb3J0ID0gcG9ydAogICAgICAuLl9hZGQoSHR0cEhlYWRlcnMuYWNjZXB0RW5jb2RpbmdIZWFkZXIsICJnemlwIik7CiAgICBpZiAoX2h0dHBDbGllbnQudXNlckFnZW50ICE9IG51bGwpIHsKICAgICAgcmVxdWVzdC5oZWFkZXJzLl9hZGQoJ3VzZXItYWdlbnQnLCBfaHR0cENsaWVudC51c2VyQWdlbnQpOwogICAgfQogICAgaWYgKHByb3h5LmlzQXV0aGVudGljYXRlZCkgewogICAgICAvLyBJZiB0aGUgcHJveHkgY29uZmlndXJhdGlvbiBjb250YWlucyB1c2VyIGluZm9ybWF0aW9uIHVzZSB0aGF0CiAgICAgIC8vIGZvciBwcm94eSBiYXNpYyBhdXRob3JpemF0aW9uLgogICAgICBTdHJpbmcgYXV0aCA9IF9DcnlwdG9VdGlscy5ieXRlc1RvQmFzZTY0KAogICAgICAgICAgdXRmOC5lbmNvZGUoIiR7cHJveHkudXNlcm5hbWV9OiR7cHJveHkucGFzc3dvcmR9IikpOwogICAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KEh0dHBIZWFkZXJzLnByb3h5QXV0aG9yaXphdGlvbkhlYWRlciwgIkJhc2ljICRhdXRoIik7CiAgICB9IGVsc2UgaWYgKCFwcm94eS5pc0RpcmVjdCAmJiBfaHR0cENsaWVudC5fcHJveHlDcmVkZW50aWFscy5sZW5ndGggPiAwKSB7CiAgICAgIHByb3h5Q3JlZHMgPSBfaHR0cENsaWVudC5fZmluZFByb3h5Q3JlZGVudGlhbHMocHJveHkpOwogICAgICBpZiAocHJveHlDcmVkcyAhPSBudWxsKSB7CiAgICAgICAgcHJveHlDcmVkcy5hdXRob3JpemUocmVxdWVzdCk7CiAgICAgIH0KICAgIH0KICAgIGlmICh1cmkudXNlckluZm8gIT0gbnVsbCAmJiAhdXJpLnVzZXJJbmZvLmlzRW1wdHkpIHsKICAgICAgLy8gSWYgdGhlIFVSTCBjb250YWlucyB1c2VyIGluZm9ybWF0aW9uIHVzZSB0aGF0IGZvciBiYXNpYwogICAgICAvLyBhdXRob3JpemF0aW9uLgogICAgICBTdHJpbmcgYXV0aCA9IF9DcnlwdG9VdGlscy5ieXRlc1RvQmFzZTY0KHV0ZjguZW5jb2RlKHVyaS51c2VySW5mbykpOwogICAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KEh0dHBIZWFkZXJzLmF1dGhvcml6YXRpb25IZWFkZXIsICJCYXNpYyAkYXV0aCIpOwogICAgfSBlbHNlIHsKICAgICAgLy8gTG9vayBmb3IgY3JlZGVudGlhbHMuCiAgICAgIGNyZWRzID0gX2h0dHBDbGllbnQuX2ZpbmRDcmVkZW50aWFscyh1cmkpOwogICAgICBpZiAoY3JlZHMgIT0gbnVsbCkgewogICAgICAgIGNyZWRzLmF1dGhvcml6ZShyZXF1ZXN0KTsKICAgICAgfQogICAgfQogICAgLy8gU3RhcnQgc2VuZGluZyB0aGUgcmVxdWVzdCAobGF6eSwgZGVsYXllZCB1bnRpbCB0aGUgdXNlciBwcm92aWRlcwogICAgLy8gZGF0YSkuCiAgICBfaHR0cFBhcnNlci5pc0hlYWQgPSBtZXRob2QgPT0gIkhFQUQiOwogICAgX3N0cmVhbUZ1dHVyZSA9IG91dGdvaW5nLmRvbmUudGhlbjxTb2NrZXQ+KChTb2NrZXQgcykgewogICAgICAvLyBSZXF1ZXN0IHNlbnQsIHNldCB1cCByZXNwb25zZSBjb21wbGV0ZXIuCiAgICAgIF9uZXh0UmVzcG9uc2VDb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPF9IdHRwSW5jb21pbmc+KCk7CgogICAgICAvLyBMaXN0ZW4gZm9yIHJlc3BvbnNlLgogICAgICBfbmV4dFJlc3BvbnNlQ29tcGxldGVyLmZ1dHVyZS50aGVuKChpbmNvbWluZykgewogICAgICAgIF9jdXJyZW50VXJpID0gbnVsbDsKICAgICAgICBpbmNvbWluZy5kYXRhRG9uZS50aGVuKChjbG9zaW5nKSB7CiAgICAgICAgICBpZiAoaW5jb21pbmcudXBncmFkZWQpIHsKICAgICAgICAgICAgX2h0dHBDbGllbnQuX2Nvbm5lY3Rpb25DbG9zZWQodGhpcyk7CiAgICAgICAgICAgIHN0YXJ0VGltZXIoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGNsb3NlZCkgcmV0dXJuOwogICAgICAgICAgaWYgKCFjbG9zaW5nICYmCiAgICAgICAgICAgICAgIV9kaXNwb3NlICYmCiAgICAgICAgICAgICAgaW5jb21pbmcuaGVhZGVycy5wZXJzaXN0ZW50Q29ubmVjdGlvbiAmJgogICAgICAgICAgICAgIHJlcXVlc3QucGVyc2lzdGVudENvbm5lY3Rpb24pIHsKICAgICAgICAgICAgLy8gUmV0dXJuIGNvbm5lY3Rpb24sIG5vdyB3ZSBhcmUgZG9uZS4KICAgICAgICAgICAgX2h0dHBDbGllbnQuX3JldHVybkNvbm5lY3Rpb24odGhpcyk7CiAgICAgICAgICAgIF9zdWJzY3JpcHRpb24ucmVzdW1lKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkZXN0cm95KCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgLy8gRm9yIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiBpZiBwcm94eSBjaGVjayBpZiB0aGUgcHJveHkKICAgICAgICAvLyByZXF1ZXN0cyB0aGUgY2xpZW50IHRvIHN0YXJ0IHVzaW5nIGEgbmV3IG5vbmNlIGZvciBwcm94eQogICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uLgogICAgICAgIGlmIChwcm94eUNyZWRzICE9IG51bGwgJiYKICAgICAgICAgICAgcHJveHlDcmVkcy5zY2hlbWUgPT0gX0F1dGhlbnRpY2F0aW9uU2NoZW1lLkRJR0VTVCkgewogICAgICAgICAgdmFyIGF1dGhJbmZvID0gaW5jb21pbmcuaGVhZGVyc1sicHJveHktYXV0aGVudGljYXRpb24taW5mbyJdOwogICAgICAgICAgaWYgKGF1dGhJbmZvICE9IG51bGwgJiYgYXV0aEluZm8ubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgdmFyIGhlYWRlciA9CiAgICAgICAgICAgICAgICBfSGVhZGVyVmFsdWUucGFyc2UoYXV0aEluZm9bMF0sIHBhcmFtZXRlclNlcGFyYXRvcjogJywnKTsKICAgICAgICAgICAgdmFyIG5leHRub25jZSA9IGhlYWRlci5wYXJhbWV0ZXJzWyJuZXh0bm9uY2UiXTsKICAgICAgICAgICAgaWYgKG5leHRub25jZSAhPSBudWxsKSBwcm94eUNyZWRzLm5vbmNlID0gbmV4dG5vbmNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBGb3IgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIGNoZWNrIGlmIHRoZSBzZXJ2ZXIgcmVxdWVzdHMgdGhlCiAgICAgICAgLy8gY2xpZW50IHRvIHN0YXJ0IHVzaW5nIGEgbmV3IG5vbmNlLgogICAgICAgIGlmIChjcmVkcyAhPSBudWxsICYmIGNyZWRzLnNjaGVtZSA9PSBfQXV0aGVudGljYXRpb25TY2hlbWUuRElHRVNUKSB7CiAgICAgICAgICB2YXIgYXV0aEluZm8gPSBpbmNvbWluZy5oZWFkZXJzWyJhdXRoZW50aWNhdGlvbi1pbmZvIl07CiAgICAgICAgICBpZiAoYXV0aEluZm8gIT0gbnVsbCAmJiBhdXRoSW5mby5sZW5ndGggPT0gMSkgewogICAgICAgICAgICB2YXIgaGVhZGVyID0KICAgICAgICAgICAgICAgIF9IZWFkZXJWYWx1ZS5wYXJzZShhdXRoSW5mb1swXSwgcGFyYW1ldGVyU2VwYXJhdG9yOiAnLCcpOwogICAgICAgICAgICB2YXIgbmV4dG5vbmNlID0gaGVhZGVyLnBhcmFtZXRlcnNbIm5leHRub25jZSJdOwogICAgICAgICAgICBpZiAobmV4dG5vbmNlICE9IG51bGwpIGNyZWRzLm5vbmNlID0gbmV4dG5vbmNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXF1ZXN0Ll9vbkluY29taW5nKGluY29taW5nKTsKICAgICAgfSkKICAgICAgICAgIC8vIElmIHdlIHNlZSBhIHN0YXRlIGVycm9yLCB3ZSBmYWlsZWQgdG8gZ2V0IHRoZSAnZmlyc3QnCiAgICAgICAgICAvLyBlbGVtZW50LgogICAgICAgICAgLmNhdGNoRXJyb3IoKGVycm9yKSB7CiAgICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIkNvbm5lY3Rpb24gY2xvc2VkIGJlZm9yZSBkYXRhIHdhcyByZWNlaXZlZCIsCiAgICAgICAgICAgIHVyaTogdXJpKTsKICAgICAgfSwgdGVzdDogKGVycm9yKSA9PiBlcnJvciBpcyBTdGF0ZUVycm9yKS5jYXRjaEVycm9yKChlcnJvciwgc3RhY2tUcmFjZSkgewogICAgICAgIC8vIFdlIGFyZSBkb25lIHdpdGggdGhlIHNvY2tldC4KICAgICAgICBkZXN0cm95KCk7CiAgICAgICAgcmVxdWVzdC5fb25FcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgIH0pOwoKICAgICAgLy8gUmVzdW1lIHRoZSBwYXJzZXIgbm93IHdlIGhhdmUgYSBoYW5kbGVyLgogICAgICBfc3Vic2NyaXB0aW9uLnJlc3VtZSgpOwogICAgICByZXR1cm4gczsKICAgIH0sIG9uRXJyb3I6IChlKSB7CiAgICAgIGRlc3Ryb3koKTsKICAgIH0pOwogICAgcmV0dXJuIHJlcXVlc3Q7CiAgfQoKICBGdXR1cmU8U29ja2V0PiBkZXRhY2hTb2NrZXQoKSB7CiAgICByZXR1cm4gX3N0cmVhbUZ1dHVyZS50aGVuKAogICAgICAgIChfKSA9PiBuZXcgX0RldGFjaGVkU29ja2V0KF9zb2NrZXQsIF9odHRwUGFyc2VyLmRldGFjaEluY29taW5nKCkpKTsKICB9CgogIHZvaWQgZGVzdHJveSgpIHsKICAgIGNsb3NlZCA9IHRydWU7CiAgICBfaHR0cENsaWVudC5fY29ubmVjdGlvbkNsb3NlZCh0aGlzKTsKICAgIF9zb2NrZXQuZGVzdHJveSgpOwogIH0KCiAgdm9pZCBjbG9zZSgpIHsKICAgIGNsb3NlZCA9IHRydWU7CiAgICBfaHR0cENsaWVudC5fY29ubmVjdGlvbkNsb3NlZCh0aGlzKTsKICAgIF9zdHJlYW1GdXR1cmUKICAgICAgICAudGltZW91dChfaHR0cENsaWVudC5pZGxlVGltZW91dCkKICAgICAgICAudGhlbigoXykgPT4gX3NvY2tldC5kZXN0cm95KCkpOwogIH0KCiAgRnV0dXJlPF9IdHRwQ2xpZW50Q29ubmVjdGlvbj4gY3JlYXRlUHJveHlUdW5uZWwoU3RyaW5nIGhvc3QsIGludCBwb3J0LAogICAgICBfUHJveHkgcHJveHksIGJvb2wgY2FsbGJhY2soWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlKSkgewogICAgX0h0dHBDbGllbnRSZXF1ZXN0IHJlcXVlc3QgPQogICAgICAgIHNlbmQobmV3IFVyaShob3N0OiBob3N0LCBwb3J0OiBwb3J0KSwgcG9ydCwgIkNPTk5FQ1QiLCBwcm94eSk7CiAgICBpZiAocHJveHkuaXNBdXRoZW50aWNhdGVkKSB7CiAgICAgIC8vIElmIHRoZSBwcm94eSBjb25maWd1cmF0aW9uIGNvbnRhaW5zIHVzZXIgaW5mb3JtYXRpb24gdXNlIHRoYXQKICAgICAgLy8gZm9yIHByb3h5IGJhc2ljIGF1dGhvcml6YXRpb24uCiAgICAgIFN0cmluZyBhdXRoID0gX0NyeXB0b1V0aWxzLmJ5dGVzVG9CYXNlNjQoCiAgICAgICAgICB1dGY4LmVuY29kZSgiJHtwcm94eS51c2VybmFtZX06JHtwcm94eS5wYXNzd29yZH0iKSk7CiAgICAgIHJlcXVlc3QuaGVhZGVycy5zZXQoSHR0cEhlYWRlcnMucHJveHlBdXRob3JpemF0aW9uSGVhZGVyLCAiQmFzaWMgJGF1dGgiKTsKICAgIH0KICAgIHJldHVybiByZXF1ZXN0LmNsb3NlKCkudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT0gSHR0cFN0YXR1cy5vaykgewogICAgICAgIHRocm93ICJQcm94eSBmYWlsZWQgdG8gZXN0YWJsaXNoIHR1bm5lbCAiCiAgICAgICAgICAgICIoJHtyZXNwb25zZS5zdGF0dXNDb2RlfSAke3Jlc3BvbnNlLnJlYXNvblBocmFzZX0pIjsKICAgICAgfQogICAgICB2YXIgc29ja2V0ID0gKHJlc3BvbnNlIGFzIF9IdHRwQ2xpZW50UmVzcG9uc2UpCiAgICAgICAgICAuX2h0dHBSZXF1ZXN0CiAgICAgICAgICAuX2h0dHBDbGllbnRDb25uZWN0aW9uCiAgICAgICAgICAuX3NvY2tldDsKICAgICAgcmV0dXJuIFNlY3VyZVNvY2tldC5zZWN1cmUoc29ja2V0LAogICAgICAgICAgaG9zdDogaG9zdCwgY29udGV4dDogX2NvbnRleHQsIG9uQmFkQ2VydGlmaWNhdGU6IGNhbGxiYWNrKTsKICAgIH0pLnRoZW4oKHNlY3VyZVNvY2tldCkgewogICAgICBTdHJpbmcga2V5ID0gX0h0dHBDbGllbnRDb25uZWN0aW9uLm1ha2VLZXkodHJ1ZSwgaG9zdCwgcG9ydCk7CiAgICAgIHJldHVybiBuZXcgX0h0dHBDbGllbnRDb25uZWN0aW9uKAogICAgICAgICAga2V5LCBzZWN1cmVTb2NrZXQsIHJlcXVlc3QuX2h0dHBDbGllbnQsIHRydWUpOwogICAgfSk7CiAgfQoKICBIdHRwQ29ubmVjdGlvbkluZm8gZ2V0IGNvbm5lY3Rpb25JbmZvID0+IF9IdHRwQ29ubmVjdGlvbkluZm8uY3JlYXRlKF9zb2NrZXQpOwoKICBzdGF0aWMgbWFrZUtleShib29sIGlzU2VjdXJlLCBTdHJpbmcgaG9zdCwgaW50IHBvcnQpIHsKICAgIHJldHVybiBpc1NlY3VyZSA/ICJzc2g6JGhvc3Q6JHBvcnQiIDogIiRob3N0OiRwb3J0IjsKICB9CgogIHZvaWQgc3RvcFRpbWVyKCkgewogICAgaWYgKF9pZGxlVGltZXIgIT0gbnVsbCkgewogICAgICBfaWRsZVRpbWVyLmNhbmNlbCgpOwogICAgICBfaWRsZVRpbWVyID0gbnVsbDsKICAgIH0KICB9CgogIHZvaWQgc3RhcnRUaW1lcigpIHsKICAgIGFzc2VydChfaWRsZVRpbWVyID09IG51bGwpOwogICAgX2lkbGVUaW1lciA9IG5ldyBUaW1lcihfaHR0cENsaWVudC5pZGxlVGltZW91dCwgKCkgewogICAgICBfaWRsZVRpbWVyID0gbnVsbDsKICAgICAgY2xvc2UoKTsKICAgIH0pOwogIH0KfQoKY2xhc3MgX0Nvbm5lY3Rpb25JbmZvIHsKICBmaW5hbCBfSHR0cENsaWVudENvbm5lY3Rpb24gY29ubmVjdGlvbjsKICBmaW5hbCBfUHJveHkgcHJveHk7CgogIF9Db25uZWN0aW9uSW5mbyh0aGlzLmNvbm5lY3Rpb24sIHRoaXMucHJveHkpOwp9CgpjbGFzcyBfQ29ubmVjdGlvblRhcmdldCB7CiAgLy8gVW5pcXVlIGtleSBmb3IgdGhpcyBjb25uZWN0aW9uIHRhcmdldC4KICBmaW5hbCBTdHJpbmcga2V5OwogIGZpbmFsIFN0cmluZyBob3N0OwogIGZpbmFsIGludCBwb3J0OwogIGZpbmFsIGJvb2wgaXNTZWN1cmU7CiAgZmluYWwgU2VjdXJpdHlDb250ZXh0IGNvbnRleHQ7CiAgZmluYWwgU2V0PF9IdHRwQ2xpZW50Q29ubmVjdGlvbj4gX2lkbGUgPSBuZXcgSGFzaFNldCgpOwogIGZpbmFsIFNldDxfSHR0cENsaWVudENvbm5lY3Rpb24+IF9hY3RpdmUgPSBuZXcgSGFzaFNldCgpOwogIGZpbmFsIFNldDxDb25uZWN0aW9uVGFzaz4gX3NvY2tldFRhc2tzID0gbmV3IEhhc2hTZXQoKTsKICBmaW5hbCBRdWV1ZSBfcGVuZGluZyA9IG5ldyBMaXN0UXVldWUoKTsKICBpbnQgX2Nvbm5lY3RpbmcgPSAwOwoKICBfQ29ubmVjdGlvblRhcmdldCgKICAgICAgdGhpcy5rZXksIHRoaXMuaG9zdCwgdGhpcy5wb3J0LCB0aGlzLmlzU2VjdXJlLCB0aGlzLmNvbnRleHQpOwoKICBib29sIGdldCBpc0VtcHR5ID0+IF9pZGxlLmlzRW1wdHkgJiYgX2FjdGl2ZS5pc0VtcHR5ICYmIF9jb25uZWN0aW5nID09IDA7CgogIGJvb2wgZ2V0IGhhc0lkbGUgPT4gX2lkbGUuaXNOb3RFbXB0eTsKCiAgYm9vbCBnZXQgaGFzQWN0aXZlID0+IF9hY3RpdmUuaXNOb3RFbXB0eSB8fCBfY29ubmVjdGluZyA+IDA7CgogIF9IdHRwQ2xpZW50Q29ubmVjdGlvbiB0YWtlSWRsZSgpIHsKICAgIGFzc2VydChoYXNJZGxlKTsKICAgIF9IdHRwQ2xpZW50Q29ubmVjdGlvbiBjb25uZWN0aW9uID0gX2lkbGUuZmlyc3Q7CiAgICBfaWRsZS5yZW1vdmUoY29ubmVjdGlvbik7CiAgICBjb25uZWN0aW9uLnN0b3BUaW1lcigpOwogICAgX2FjdGl2ZS5hZGQoY29ubmVjdGlvbik7CiAgICByZXR1cm4gY29ubmVjdGlvbjsKICB9CgogIF9jaGVja1BlbmRpbmcoKSB7CiAgICBpZiAoX3BlbmRpbmcuaXNOb3RFbXB0eSkgewogICAgICBfcGVuZGluZy5yZW1vdmVGaXJzdCgpKCk7CiAgICB9CiAgfQoKICB2b2lkIGFkZE5ld0FjdGl2ZShfSHR0cENsaWVudENvbm5lY3Rpb24gY29ubmVjdGlvbikgewogICAgX2FjdGl2ZS5hZGQoY29ubmVjdGlvbik7CiAgfQoKICB2b2lkIHJldHVybkNvbm5lY3Rpb24oX0h0dHBDbGllbnRDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKICAgIGFzc2VydChfYWN0aXZlLmNvbnRhaW5zKGNvbm5lY3Rpb24pKTsKICAgIF9hY3RpdmUucmVtb3ZlKGNvbm5lY3Rpb24pOwogICAgX2lkbGUuYWRkKGNvbm5lY3Rpb24pOwogICAgY29ubmVjdGlvbi5zdGFydFRpbWVyKCk7CiAgICBfY2hlY2tQZW5kaW5nKCk7CiAgfQoKICB2b2lkIGNvbm5lY3Rpb25DbG9zZWQoX0h0dHBDbGllbnRDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKICAgIGFzc2VydCghX2FjdGl2ZS5jb250YWlucyhjb25uZWN0aW9uKSB8fCAhX2lkbGUuY29udGFpbnMoY29ubmVjdGlvbikpOwogICAgX2FjdGl2ZS5yZW1vdmUoY29ubmVjdGlvbik7CiAgICBfaWRsZS5yZW1vdmUoY29ubmVjdGlvbik7CiAgICBfY2hlY2tQZW5kaW5nKCk7CiAgfQoKICB2b2lkIGNsb3NlKGJvb2wgZm9yY2UpIHsKICAgIC8vIEFsd2F5cyBjYW5jZWwgcGVuZGluZyBzb2NrZXQgY29ubmVjdGlvbnMuCiAgICBmb3IgKHZhciB0IGluIF9zb2NrZXRUYXNrcy50b0xpc3QoKSkgewogICAgICAvLyBNYWtlIHN1cmUgdGhlIHNvY2tldCBpcyBkZXN0cm95ZWQgaWYgdGhlIENvbm5lY3Rpb25UYXNrIGlzIGNhbmNlbGxlZC4KICAgICAgdC5zb2NrZXQudGhlbigocykgewogICAgICAgIHMuZGVzdHJveSgpOwogICAgICB9LCBvbkVycm9yOiAoZSkge30pOwogICAgICB0LmNhbmNlbCgpOwogICAgfQogICAgaWYgKGZvcmNlKSB7CiAgICAgIGZvciAodmFyIGMgaW4gX2lkbGUudG9MaXN0KCkpIHsKICAgICAgICBjLmRlc3Ryb3koKTsKICAgICAgfQogICAgICBmb3IgKHZhciBjIGluIF9hY3RpdmUudG9MaXN0KCkpIHsKICAgICAgICBjLmRlc3Ryb3koKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZm9yICh2YXIgYyBpbiBfaWRsZS50b0xpc3QoKSkgewogICAgICAgIGMuY2xvc2UoKTsKICAgICAgfQogICAgfQogIH0KCiAgRnV0dXJlPF9Db25uZWN0aW9uSW5mbz4gY29ubmVjdCgKICAgICAgU3RyaW5nIHVyaUhvc3QsIGludCB1cmlQb3J0LCBfUHJveHkgcHJveHksIF9IdHRwQ2xpZW50IGNsaWVudCkgewogICAgaWYgKGhhc0lkbGUpIHsKICAgICAgdmFyIGNvbm5lY3Rpb24gPSB0YWtlSWRsZSgpOwogICAgICBjbGllbnQuX2Nvbm5lY3Rpb25zQ2hhbmdlZCgpOwogICAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZShuZXcgX0Nvbm5lY3Rpb25JbmZvKGNvbm5lY3Rpb24sIHByb3h5KSk7CiAgICB9CiAgICBpZiAoY2xpZW50Lm1heENvbm5lY3Rpb25zUGVySG9zdCAhPSBudWxsICYmCiAgICAgICAgX2FjdGl2ZS5sZW5ndGggKyBfY29ubmVjdGluZyA+PSBjbGllbnQubWF4Q29ubmVjdGlvbnNQZXJIb3N0KSB7CiAgICAgIHZhciBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPF9Db25uZWN0aW9uSW5mbz4oKTsKICAgICAgX3BlbmRpbmcuYWRkKCgpIHsKICAgICAgICBjb21wbGV0ZXIuY29tcGxldGUoY29ubmVjdCh1cmlIb3N0LCB1cmlQb3J0LCBwcm94eSwgY2xpZW50KSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gY29tcGxldGVyLmZ1dHVyZTsKICAgIH0KICAgIHZhciBjdXJyZW50QmFkQ2VydGlmaWNhdGVDYWxsYmFjayA9IGNsaWVudC5fYmFkQ2VydGlmaWNhdGVDYWxsYmFjazsKCiAgICBib29sIGNhbGxiYWNrKFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSkgewogICAgICBpZiAoY3VycmVudEJhZENlcnRpZmljYXRlQ2FsbGJhY2sgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICByZXR1cm4gY3VycmVudEJhZENlcnRpZmljYXRlQ2FsbGJhY2soY2VydGlmaWNhdGUsIHVyaUhvc3QsIHVyaVBvcnQpOwogICAgfQoKICAgIEZ1dHVyZTxDb25uZWN0aW9uVGFzaz4gY29ubmVjdGlvblRhc2sgPSAoaXNTZWN1cmUgJiYgcHJveHkuaXNEaXJlY3QKICAgICAgICA/IFNlY3VyZVNvY2tldC5zdGFydENvbm5lY3QoaG9zdCwgcG9ydCwKICAgICAgICAgICAgY29udGV4dDogY29udGV4dCwgb25CYWRDZXJ0aWZpY2F0ZTogY2FsbGJhY2spCiAgICAgICAgOiBTb2NrZXQuc3RhcnRDb25uZWN0KGhvc3QsIHBvcnQpKTsKICAgIF9jb25uZWN0aW5nKys7CiAgICByZXR1cm4gY29ubmVjdGlvblRhc2sudGhlbigoQ29ubmVjdGlvblRhc2sgdGFzaykgewogICAgICBfc29ja2V0VGFza3MuYWRkKHRhc2spOwogICAgICBGdXR1cmUgc29ja2V0RnV0dXJlID0gdGFzay5zb2NrZXQ7CiAgICAgIGlmIChjbGllbnQuY29ubmVjdGlvblRpbWVvdXQgIT0gbnVsbCkgewogICAgICAgIHNvY2tldEZ1dHVyZSA9CiAgICAgICAgICAgIHNvY2tldEZ1dHVyZS50aW1lb3V0KGNsaWVudC5jb25uZWN0aW9uVGltZW91dCwgb25UaW1lb3V0OiAoKSB7CiAgICAgICAgICBfc29ja2V0VGFza3MucmVtb3ZlKHRhc2spOwogICAgICAgICAgdGFzay5jYW5jZWwoKTsKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gc29ja2V0RnV0dXJlLnRoZW4oKHNvY2tldCkgewogICAgICAgIF9jb25uZWN0aW5nLS07CiAgICAgICAgc29ja2V0LnNldE9wdGlvbihTb2NrZXRPcHRpb24udGNwTm9EZWxheSwgdHJ1ZSk7CiAgICAgICAgdmFyIGNvbm5lY3Rpb24gPQogICAgICAgICAgICBuZXcgX0h0dHBDbGllbnRDb25uZWN0aW9uKGtleSwgc29ja2V0LCBjbGllbnQsIGZhbHNlLCBjb250ZXh0KTsKICAgICAgICBpZiAoaXNTZWN1cmUgJiYgIXByb3h5LmlzRGlyZWN0KSB7CiAgICAgICAgICBjb25uZWN0aW9uLl9kaXNwb3NlID0gdHJ1ZTsKICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uCiAgICAgICAgICAgICAgLmNyZWF0ZVByb3h5VHVubmVsKHVyaUhvc3QsIHVyaVBvcnQsIHByb3h5LCBjYWxsYmFjaykKICAgICAgICAgICAgICAudGhlbigodHVubmVsKSB7CiAgICAgICAgICAgIGNsaWVudAogICAgICAgICAgICAgICAgLl9nZXRDb25uZWN0aW9uVGFyZ2V0KHVyaUhvc3QsIHVyaVBvcnQsIHRydWUpCiAgICAgICAgICAgICAgICAuYWRkTmV3QWN0aXZlKHR1bm5lbCk7CiAgICAgICAgICAgIF9zb2NrZXRUYXNrcy5yZW1vdmUodGFzayk7CiAgICAgICAgICAgIHJldHVybiBuZXcgX0Nvbm5lY3Rpb25JbmZvKHR1bm5lbCwgcHJveHkpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFkZE5ld0FjdGl2ZShjb25uZWN0aW9uKTsKICAgICAgICAgIF9zb2NrZXRUYXNrcy5yZW1vdmUodGFzayk7CiAgICAgICAgICByZXR1cm4gbmV3IF9Db25uZWN0aW9uSW5mbyhjb25uZWN0aW9uLCBwcm94eSk7CiAgICAgICAgfQogICAgICB9LCBvbkVycm9yOiAoZXJyb3IpIHsKICAgICAgICBfY29ubmVjdGluZy0tOwogICAgICAgIF9zb2NrZXRUYXNrcy5yZW1vdmUodGFzayk7CiAgICAgICAgX2NoZWNrUGVuZGluZygpOwogICAgICAgIHRocm93IGVycm9yOwogICAgICB9KTsKICAgIH0pOwogIH0KfQoKdHlwZWRlZiBib29sIEJhZENlcnRpZmljYXRlQ2FsbGJhY2soWDUwOUNlcnRpZmljYXRlIGNyLCBTdHJpbmcgaG9zdCwgaW50IHBvcnQpOwoKY2xhc3MgX0h0dHBDbGllbnQgaW1wbGVtZW50cyBIdHRwQ2xpZW50IHsKICBib29sIF9jbG9zaW5nID0gZmFsc2U7CiAgYm9vbCBfY2xvc2luZ0ZvcmNlZnVsbHkgPSBmYWxzZTsKICBmaW5hbCBNYXA8U3RyaW5nLCBfQ29ubmVjdGlvblRhcmdldD4gX2Nvbm5lY3Rpb25UYXJnZXRzID0KICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBfQ29ubmVjdGlvblRhcmdldD4oKTsKICBmaW5hbCBMaXN0PF9DcmVkZW50aWFscz4gX2NyZWRlbnRpYWxzID0gW107CiAgZmluYWwgTGlzdDxfUHJveHlDcmVkZW50aWFscz4gX3Byb3h5Q3JlZGVudGlhbHMgPSBbXTsKICBmaW5hbCBTZWN1cml0eUNvbnRleHQgX2NvbnRleHQ7CiAgRnVuY3Rpb24gX2F1dGhlbnRpY2F0ZTsKICBGdW5jdGlvbiBfYXV0aGVudGljYXRlUHJveHk7CiAgRnVuY3Rpb24gX2ZpbmRQcm94eSA9IEh0dHBDbGllbnQuZmluZFByb3h5RnJvbUVudmlyb25tZW50OwogIER1cmF0aW9uIF9pZGxlVGltZW91dCA9IGNvbnN0IER1cmF0aW9uKHNlY29uZHM6IDE1KTsKICBCYWRDZXJ0aWZpY2F0ZUNhbGxiYWNrIF9iYWRDZXJ0aWZpY2F0ZUNhbGxiYWNrOwoKICBEdXJhdGlvbiBnZXQgaWRsZVRpbWVvdXQgPT4gX2lkbGVUaW1lb3V0OwoKICBEdXJhdGlvbiBjb25uZWN0aW9uVGltZW91dDsKCiAgaW50IG1heENvbm5lY3Rpb25zUGVySG9zdDsKCiAgYm9vbCBhdXRvVW5jb21wcmVzcyA9IHRydWU7CgogIFN0cmluZyB1c2VyQWdlbnQgPSBfZ2V0SHR0cFZlcnNpb24oKTsKCiAgX0h0dHBDbGllbnQodGhpcy5fY29udGV4dCk7CgogIHZvaWQgc2V0IGlkbGVUaW1lb3V0KER1cmF0aW9uIHRpbWVvdXQpIHsKICAgIF9pZGxlVGltZW91dCA9IHRpbWVvdXQ7CiAgICBmb3IgKHZhciBjIGluIF9jb25uZWN0aW9uVGFyZ2V0cy52YWx1ZXMpIHsKICAgICAgZm9yICh2YXIgaWRsZSBpbiBjLl9pZGxlKSB7CiAgICAgICAgLy8gUmVzZXQgdGltZXIuIFRoaXMgaXMgZmluZSwgYXMgaXQncyBub3QgaGFwcGVuaW5nIG9mdGVuLgogICAgICAgIGlkbGUuc3RvcFRpbWVyKCk7CiAgICAgICAgaWRsZS5zdGFydFRpbWVyKCk7CiAgICAgIH0KICAgIH0KICB9CgogIHNldCBiYWRDZXJ0aWZpY2F0ZUNhbGxiYWNrKAogICAgICBib29sIGNhbGxiYWNrKFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0LCBTdHJpbmcgaG9zdCwgaW50IHBvcnQpKSB7CiAgICBfYmFkQ2VydGlmaWNhdGVDYWxsYmFjayA9IGNhbGxiYWNrOwogIH0KCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBvcGVuKAogICAgICBTdHJpbmcgbWV0aG9kLCBTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyBwYXRoKSB7CiAgICBjb25zdCBpbnQgaGFzaE1hcmsgPSAweDIzOwogICAgY29uc3QgaW50IHF1ZXN0aW9uTWFyayA9IDB4M2Y7CiAgICBpbnQgZnJhZ21lbnRTdGFydCA9IHBhdGgubGVuZ3RoOwogICAgaW50IHF1ZXJ5U3RhcnQgPSBwYXRoLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSBwYXRoLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIHZhciBjaGFyID0gcGF0aC5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoY2hhciA9PSBoYXNoTWFyaykgewogICAgICAgIGZyYWdtZW50U3RhcnQgPSBpOwogICAgICAgIHF1ZXJ5U3RhcnQgPSBpOwogICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gcXVlc3Rpb25NYXJrKSB7CiAgICAgICAgcXVlcnlTdGFydCA9IGk7CiAgICAgIH0KICAgIH0KICAgIFN0cmluZyBxdWVyeSA9IG51bGw7CiAgICBpZiAocXVlcnlTdGFydCA8IGZyYWdtZW50U3RhcnQpIHsKICAgICAgcXVlcnkgPSBwYXRoLnN1YnN0cmluZyhxdWVyeVN0YXJ0ICsgMSwgZnJhZ21lbnRTdGFydCk7CiAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBxdWVyeVN0YXJ0KTsKICAgIH0KICAgIFVyaSB1cmkgPSBuZXcgVXJpKAogICAgICAgIHNjaGVtZTogImh0dHAiLCBob3N0OiBob3N0LCBwb3J0OiBwb3J0LCBwYXRoOiBwYXRoLCBxdWVyeTogcXVlcnkpOwogICAgcmV0dXJuIF9vcGVuVXJsKG1ldGhvZCwgdXJpKTsKICB9CgogIEZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD4gb3BlblVybChTdHJpbmcgbWV0aG9kLCBVcmkgdXJsKSA9PgogICAgICBfb3BlblVybChtZXRob2QsIHVybCk7CgogIEZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD4gZ2V0KFN0cmluZyBob3N0LCBpbnQgcG9ydCwgU3RyaW5nIHBhdGgpID0+CiAgICAgIG9wZW4oImdldCIsIGhvc3QsIHBvcnQsIHBhdGgpOwoKICBGdXR1cmU8SHR0cENsaWVudFJlcXVlc3Q+IGdldFVybChVcmkgdXJsKSA9PiBfb3BlblVybCgiZ2V0IiwgdXJsKTsKCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBwb3N0KFN0cmluZyBob3N0LCBpbnQgcG9ydCwgU3RyaW5nIHBhdGgpID0+CiAgICAgIG9wZW4oInBvc3QiLCBob3N0LCBwb3J0LCBwYXRoKTsKCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBwb3N0VXJsKFVyaSB1cmwpID0+IF9vcGVuVXJsKCJwb3N0IiwgdXJsKTsKCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBwdXQoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBTdHJpbmcgcGF0aCkgPT4KICAgICAgb3BlbigicHV0IiwgaG9zdCwgcG9ydCwgcGF0aCk7CgogIEZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD4gcHV0VXJsKFVyaSB1cmwpID0+IF9vcGVuVXJsKCJwdXQiLCB1cmwpOwoKICBGdXR1cmU8SHR0cENsaWVudFJlcXVlc3Q+IGRlbGV0ZShTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyBwYXRoKSA9PgogICAgICBvcGVuKCJkZWxldGUiLCBob3N0LCBwb3J0LCBwYXRoKTsKCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBkZWxldGVVcmwoVXJpIHVybCkgPT4gX29wZW5VcmwoImRlbGV0ZSIsIHVybCk7CgogIEZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD4gaGVhZChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyBwYXRoKSA9PgogICAgICBvcGVuKCJoZWFkIiwgaG9zdCwgcG9ydCwgcGF0aCk7CgogIEZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD4gaGVhZFVybChVcmkgdXJsKSA9PiBfb3BlblVybCgiaGVhZCIsIHVybCk7CgogIEZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD4gcGF0Y2goU3RyaW5nIGhvc3QsIGludCBwb3J0LCBTdHJpbmcgcGF0aCkgPT4KICAgICAgb3BlbigicGF0Y2giLCBob3N0LCBwb3J0LCBwYXRoKTsKCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBwYXRjaFVybChVcmkgdXJsKSA9PiBfb3BlblVybCgicGF0Y2giLCB1cmwpOwoKICB2b2lkIGNsb3NlKHtib29sIGZvcmNlOiBmYWxzZX0pIHsKICAgIF9jbG9zaW5nID0gdHJ1ZTsKICAgIF9jbG9zaW5nRm9yY2VmdWxseSA9IGZvcmNlOwogICAgX2Nsb3NlQ29ubmVjdGlvbnMoX2Nsb3NpbmdGb3JjZWZ1bGx5KTsKICAgIGFzc2VydCghX2Nvbm5lY3Rpb25UYXJnZXRzLnZhbHVlcy5hbnkoKHMpID0+IHMuaGFzSWRsZSkpOwogICAgYXNzZXJ0KAogICAgICAgICFmb3JjZSB8fCAhX2Nvbm5lY3Rpb25UYXJnZXRzLnZhbHVlcy5hbnkoKHMpID0+IHMuX2FjdGl2ZS5pc05vdEVtcHR5KSk7CiAgfQoKICBzZXQgYXV0aGVudGljYXRlKEZ1dHVyZTxib29sPiBmKFVyaSB1cmwsIFN0cmluZyBzY2hlbWUsIFN0cmluZyByZWFsbSkpIHsKICAgIF9hdXRoZW50aWNhdGUgPSBmOwogIH0KCiAgdm9pZCBhZGRDcmVkZW50aWFscyhVcmkgdXJsLCBTdHJpbmcgcmVhbG0sIEh0dHBDbGllbnRDcmVkZW50aWFscyBjcikgewogICAgX2NyZWRlbnRpYWxzLmFkZChuZXcgX1NpdGVDcmVkZW50aWFscyh1cmwsIHJlYWxtLCBjcikpOwogIH0KCiAgc2V0IGF1dGhlbnRpY2F0ZVByb3h5KAogICAgICBGdXR1cmU8Ym9vbD4gZihTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyBzY2hlbWUsIFN0cmluZyByZWFsbSkpIHsKICAgIF9hdXRoZW50aWNhdGVQcm94eSA9IGY7CiAgfQoKICB2b2lkIGFkZFByb3h5Q3JlZGVudGlhbHMoCiAgICAgIFN0cmluZyBob3N0LCBpbnQgcG9ydCwgU3RyaW5nIHJlYWxtLCBIdHRwQ2xpZW50Q3JlZGVudGlhbHMgY3IpIHsKICAgIF9wcm94eUNyZWRlbnRpYWxzLmFkZChuZXcgX1Byb3h5Q3JlZGVudGlhbHMoaG9zdCwgcG9ydCwgcmVhbG0sIGNyKSk7CiAgfQoKICBzZXQgZmluZFByb3h5KFN0cmluZyBmKFVyaSB1cmkpKSA9PiBfZmluZFByb3h5ID0gZjsKCiAgRnV0dXJlPF9IdHRwQ2xpZW50UmVxdWVzdD4gX29wZW5VcmwoU3RyaW5nIG1ldGhvZCwgVXJpIHVyaSkgewogICAgaWYgKF9jbG9zaW5nKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJDbGllbnQgaXMgY2xvc2VkIik7CiAgICB9CgogICAgLy8gSWdub3JlIGFueSBmcmFnbWVudHMgb24gdGhlIHJlcXVlc3QgVVJJLgogICAgdXJpID0gdXJpLnJlbW92ZUZyYWdtZW50KCk7CgogICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKG1ldGhvZCk7CiAgICB9CiAgICBpZiAobWV0aG9kICE9ICJDT05ORUNUIikgewogICAgICBpZiAodXJpLmhvc3QuaXNFbXB0eSkgewogICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJObyBob3N0IHNwZWNpZmllZCBpbiBVUkkgJHVyaSIpOwogICAgICB9IGVsc2UgaWYgKHVyaS5zY2hlbWUgIT0gImh0dHAiICYmIHVyaS5zY2hlbWUgIT0gImh0dHBzIikgewogICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKAogICAgICAgICAgICAiVW5zdXBwb3J0ZWQgc2NoZW1lICcke3VyaS5zY2hlbWV9JyBpbiBVUkkgJHVyaSIpOwogICAgICB9CiAgICB9CgogICAgYm9vbCBpc1NlY3VyZSA9ICh1cmkuc2NoZW1lID09ICJodHRwcyIpOwogICAgaW50IHBvcnQgPSB1cmkucG9ydDsKICAgIGlmIChwb3J0ID09IDApIHsKICAgICAgcG9ydCA9CiAgICAgICAgICBpc1NlY3VyZSA/IEh0dHBDbGllbnQuZGVmYXVsdEh0dHBzUG9ydCA6IEh0dHBDbGllbnQuZGVmYXVsdEh0dHBQb3J0OwogICAgfQogICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGEgcHJveHkgc2VydmVyIHNob3VsZCBiZSB1c2VkIGZvciB0aGlzIGNvbm5lY3Rpb24uCiAgICB2YXIgcHJveHlDb25mID0gY29uc3QgX1Byb3h5Q29uZmlndXJhdGlvbi5kaXJlY3QoKTsKICAgIGlmIChfZmluZFByb3h5ICE9IG51bGwpIHsKICAgICAgLy8gVE9ETyhzZ2plc3NlKTogS2VlcCBhIG1hcCBvZiB0aGVzZSBhcyBub3JtYWxseSBvbmx5IGEgZmV3CiAgICAgIC8vIGNvbmZpZ3VyYXRpb24gc3RyaW5ncyB3aWxsIGJlIHVzZWQuCiAgICAgIHRyeSB7CiAgICAgICAgcHJveHlDb25mID0gbmV3IF9Qcm94eUNvbmZpZ3VyYXRpb24oX2ZpbmRQcm94eSh1cmkpKTsKICAgICAgfSBjYXRjaCAoZXJyb3IsIHN0YWNrVHJhY2UpIHsKICAgICAgICByZXR1cm4gbmV3IEZ1dHVyZS5lcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfZ2V0Q29ubmVjdGlvbih1cmkuaG9zdCwgcG9ydCwgcHJveHlDb25mLCBpc1NlY3VyZSkKICAgICAgICAudGhlbigoX0Nvbm5lY3Rpb25JbmZvIGluZm8pIHsKICAgICAgX0h0dHBDbGllbnRSZXF1ZXN0IHNlbmQoX0Nvbm5lY3Rpb25JbmZvIGluZm8pIHsKICAgICAgICByZXR1cm4gaW5mby5jb25uZWN0aW9uCiAgICAgICAgICAgIC5zZW5kKHVyaSwgcG9ydCwgbWV0aG9kLnRvVXBwZXJDYXNlKCksIGluZm8ucHJveHkpOwogICAgICB9CgogICAgICAvLyBJZiB0aGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkIGJlZm9yZSB0aGUgcmVxdWVzdCB3YXMgc2VudCwgY3JlYXRlCiAgICAgIC8vIGFuZCB1c2UgYW5vdGhlciBjb25uZWN0aW9uLgogICAgICBpZiAoaW5mby5jb25uZWN0aW9uLmNsb3NlZCkgewogICAgICAgIHJldHVybiBfZ2V0Q29ubmVjdGlvbih1cmkuaG9zdCwgcG9ydCwgcHJveHlDb25mLCBpc1NlY3VyZSkudGhlbihzZW5kKTsKICAgICAgfQogICAgICByZXR1cm4gc2VuZChpbmZvKTsKICAgIH0pOwogIH0KCiAgRnV0dXJlPF9IdHRwQ2xpZW50UmVxdWVzdD4gX29wZW5VcmxGcm9tUmVxdWVzdCgKICAgICAgU3RyaW5nIG1ldGhvZCwgVXJpIHVyaSwgX0h0dHBDbGllbnRSZXF1ZXN0IHByZXZpb3VzKSB7CiAgICAvLyBJZiB0aGUgbmV3IFVSSSBpcyByZWxhdGl2ZSAodG8gZWl0aGVyICcvJyBvciBzb21lIHN1Yi1wYXRoKSwKICAgIC8vIGNvbnN0cnVjdCBhIGZ1bGwgVVJJIGZyb20gdGhlIHByZXZpb3VzIG9uZS4KICAgIFVyaSByZXNvbHZlZCA9IHByZXZpb3VzLnVyaS5yZXNvbHZlVXJpKHVyaSk7CiAgICByZXR1cm4gX29wZW5VcmwobWV0aG9kLCByZXNvbHZlZCkudGhlbigoX0h0dHBDbGllbnRSZXF1ZXN0IHJlcXVlc3QpIHsKICAgICAgcmVxdWVzdAogICAgICAgIC8vIE9ubHkgZm9sbG93IHJlZGlyZWN0cyBpZiBpbml0aWFsIHJlcXVlc3QgZGlkLgogICAgICAgIC4uZm9sbG93UmVkaXJlY3RzID0gcHJldmlvdXMuZm9sbG93UmVkaXJlY3RzCiAgICAgICAgLy8gQWxsb3cgc2FtZSBudW1iZXIgb2YgcmVkaXJlY3RzLgogICAgICAgIC4ubWF4UmVkaXJlY3RzID0gcHJldmlvdXMubWF4UmVkaXJlY3RzOwogICAgICAvLyBDb3B5IGhlYWRlcnMuCiAgICAgIGZvciAodmFyIGhlYWRlciBpbiBwcmV2aW91cy5oZWFkZXJzLl9oZWFkZXJzLmtleXMpIHsKICAgICAgICBpZiAocmVxdWVzdC5oZWFkZXJzW2hlYWRlcl0gPT0gbnVsbCkgewogICAgICAgICAgcmVxdWVzdC5oZWFkZXJzLnNldChoZWFkZXIsIHByZXZpb3VzLmhlYWRlcnNbaGVhZGVyXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXF1ZXN0CiAgICAgICAgLi5oZWFkZXJzLmNodW5rZWRUcmFuc2ZlckVuY29kaW5nID0gZmFsc2UKICAgICAgICAuLmNvbnRlbnRMZW5ndGggPSAwOwogICAgfSk7CiAgfQoKICAvLyBSZXR1cm4gYSBsaXZlIGNvbm5lY3Rpb24gdG8gdGhlIGlkbGUgcG9vbC4KICB2b2lkIF9yZXR1cm5Db25uZWN0aW9uKF9IdHRwQ2xpZW50Q29ubmVjdGlvbiBjb25uZWN0aW9uKSB7CiAgICBfY29ubmVjdGlvblRhcmdldHNbY29ubmVjdGlvbi5rZXldLnJldHVybkNvbm5lY3Rpb24oY29ubmVjdGlvbik7CiAgICBfY29ubmVjdGlvbnNDaGFuZ2VkKCk7CiAgfQoKICAvLyBSZW1vdmUgYSBjbG9zZWQgY29ubmVjdGlvbiBmcm9tIHRoZSBhY3RpdmUgc2V0LgogIHZvaWQgX2Nvbm5lY3Rpb25DbG9zZWQoX0h0dHBDbGllbnRDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKICAgIGNvbm5lY3Rpb24uc3RvcFRpbWVyKCk7CiAgICB2YXIgY29ubmVjdGlvblRhcmdldCA9IF9jb25uZWN0aW9uVGFyZ2V0c1tjb25uZWN0aW9uLmtleV07CiAgICBpZiAoY29ubmVjdGlvblRhcmdldCAhPSBudWxsKSB7CiAgICAgIGNvbm5lY3Rpb25UYXJnZXQuY29ubmVjdGlvbkNsb3NlZChjb25uZWN0aW9uKTsKICAgICAgaWYgKGNvbm5lY3Rpb25UYXJnZXQuaXNFbXB0eSkgewogICAgICAgIF9jb25uZWN0aW9uVGFyZ2V0cy5yZW1vdmUoY29ubmVjdGlvbi5rZXkpOwogICAgICB9CiAgICAgIF9jb25uZWN0aW9uc0NoYW5nZWQoKTsKICAgIH0KICB9CgogIHZvaWQgX2Nvbm5lY3Rpb25zQ2hhbmdlZCgpIHsKICAgIGlmIChfY2xvc2luZykgewogICAgICBfY2xvc2VDb25uZWN0aW9ucyhfY2xvc2luZ0ZvcmNlZnVsbHkpOwogICAgfQogIH0KCiAgdm9pZCBfY2xvc2VDb25uZWN0aW9ucyhib29sIGZvcmNlKSB7CiAgICBmb3IgKHZhciBjb25uZWN0aW9uVGFyZ2V0IGluIF9jb25uZWN0aW9uVGFyZ2V0cy52YWx1ZXMudG9MaXN0KCkpIHsKICAgICAgY29ubmVjdGlvblRhcmdldC5jbG9zZShmb3JjZSk7CiAgICB9CiAgfQoKICBfQ29ubmVjdGlvblRhcmdldCBfZ2V0Q29ubmVjdGlvblRhcmdldChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIGJvb2wgaXNTZWN1cmUpIHsKICAgIFN0cmluZyBrZXkgPSBfSHR0cENsaWVudENvbm5lY3Rpb24ubWFrZUtleShpc1NlY3VyZSwgaG9zdCwgcG9ydCk7CiAgICByZXR1cm4gX2Nvbm5lY3Rpb25UYXJnZXRzLnB1dElmQWJzZW50KGtleSwgKCkgewogICAgICByZXR1cm4gbmV3IF9Db25uZWN0aW9uVGFyZ2V0KGtleSwgaG9zdCwgcG9ydCwgaXNTZWN1cmUsIF9jb250ZXh0KTsKICAgIH0pOwogIH0KCiAgLy8gR2V0IGEgbmV3IF9IdHRwQ2xpZW50Q29ubmVjdGlvbiwgZnJvbSB0aGUgbWF0Y2hpbmcgX0Nvbm5lY3Rpb25UYXJnZXQuCiAgRnV0dXJlPF9Db25uZWN0aW9uSW5mbz4gX2dldENvbm5lY3Rpb24oU3RyaW5nIHVyaUhvc3QsIGludCB1cmlQb3J0LAogICAgICBfUHJveHlDb25maWd1cmF0aW9uIHByb3h5Q29uZiwgYm9vbCBpc1NlY3VyZSkgewogICAgSXRlcmF0b3I8X1Byb3h5PiBwcm94aWVzID0gcHJveHlDb25mLnByb3hpZXMuaXRlcmF0b3I7CgogICAgRnV0dXJlPF9Db25uZWN0aW9uSW5mbz4gY29ubmVjdChlcnJvcikgewogICAgICBpZiAoIXByb3hpZXMubW92ZU5leHQoKSkgcmV0dXJuIG5ldyBGdXR1cmUuZXJyb3IoZXJyb3IpOwogICAgICBfUHJveHkgcHJveHkgPSBwcm94aWVzLmN1cnJlbnQ7CiAgICAgIFN0cmluZyBob3N0ID0gcHJveHkuaXNEaXJlY3QgPyB1cmlIb3N0IDogcHJveHkuaG9zdDsKICAgICAgaW50IHBvcnQgPSBwcm94eS5pc0RpcmVjdCA/IHVyaVBvcnQgOiBwcm94eS5wb3J0OwogICAgICByZXR1cm4gX2dldENvbm5lY3Rpb25UYXJnZXQoaG9zdCwgcG9ydCwgaXNTZWN1cmUpCiAgICAgICAgICAuY29ubmVjdCh1cmlIb3N0LCB1cmlQb3J0LCBwcm94eSwgdGhpcykKICAgICAgICAgIC8vIE9uIGVycm9yLCBjb250aW51ZSB3aXRoIG5leHQgcHJveHkuCiAgICAgICAgICAuY2F0Y2hFcnJvcihjb25uZWN0KTsKICAgIH0KCiAgICByZXR1cm4gY29ubmVjdChuZXcgSHR0cEV4Y2VwdGlvbigiTm8gcHJveGllcyBnaXZlbiIpKTsKICB9CgogIF9TaXRlQ3JlZGVudGlhbHMgX2ZpbmRDcmVkZW50aWFscyhVcmkgdXJsLCBbX0F1dGhlbnRpY2F0aW9uU2NoZW1lIHNjaGVtZV0pIHsKICAgIC8vIExvb2sgZm9yIGNyZWRlbnRpYWxzLgogICAgX1NpdGVDcmVkZW50aWFscyBjciA9CiAgICAgICAgX2NyZWRlbnRpYWxzLmZvbGQobnVsbCwgKF9TaXRlQ3JlZGVudGlhbHMgcHJldiwgdmFsdWUpIHsKICAgICAgdmFyIHNpdGVDcmVkZW50aWFscyA9IHZhbHVlIGFzIF9TaXRlQ3JlZGVudGlhbHM7CiAgICAgIGlmIChzaXRlQ3JlZGVudGlhbHMuYXBwbGllcyh1cmwsIHNjaGVtZSkpIHsKICAgICAgICBpZiAocHJldiA9PSBudWxsKSByZXR1cm4gdmFsdWU7CiAgICAgICAgcmV0dXJuIHNpdGVDcmVkZW50aWFscy51cmkucGF0aC5sZW5ndGggPiBwcmV2LnVyaS5wYXRoLmxlbmd0aAogICAgICAgICAgICA/IHNpdGVDcmVkZW50aWFscwogICAgICAgICAgICA6IHByZXY7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHByZXY7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIGNyOwogIH0KCiAgX1Byb3h5Q3JlZGVudGlhbHMgX2ZpbmRQcm94eUNyZWRlbnRpYWxzKF9Qcm94eSBwcm94eSwKICAgICAgW19BdXRoZW50aWNhdGlvblNjaGVtZSBzY2hlbWVdKSB7CiAgICAvLyBMb29rIGZvciBjcmVkZW50aWFscy4KICAgIHZhciBpdCA9IF9wcm94eUNyZWRlbnRpYWxzLml0ZXJhdG9yOwogICAgd2hpbGUgKGl0Lm1vdmVOZXh0KCkpIHsKICAgICAgaWYgKGl0LmN1cnJlbnQuYXBwbGllcyhwcm94eSwgc2NoZW1lKSkgewogICAgICAgIHJldHVybiBpdC5jdXJyZW50OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgX3JlbW92ZUNyZWRlbnRpYWxzKF9DcmVkZW50aWFscyBjcikgewogICAgaW50IGluZGV4ID0gX2NyZWRlbnRpYWxzLmluZGV4T2YoY3IpOwogICAgaWYgKGluZGV4ICE9IC0xKSB7CiAgICAgIF9jcmVkZW50aWFscy5yZW1vdmVBdChpbmRleCk7CiAgICB9CiAgfQoKICB2b2lkIF9yZW1vdmVQcm94eUNyZWRlbnRpYWxzKF9DcmVkZW50aWFscyBjcikgewogICAgaW50IGluZGV4ID0gX3Byb3h5Q3JlZGVudGlhbHMuaW5kZXhPZihjcik7CiAgICBpZiAoaW5kZXggIT0gLTEpIHsKICAgICAgX3Byb3h5Q3JlZGVudGlhbHMucmVtb3ZlQXQoaW5kZXgpOwogICAgfQogIH0KCiAgc3RhdGljIFN0cmluZyBfZmluZFByb3h5RnJvbUVudmlyb25tZW50KAogICAgICBVcmkgdXJsLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50KSB7CiAgICBjaGVja05vUHJveHkoU3RyaW5nIG9wdGlvbikgewogICAgICBpZiAob3B0aW9uID09IG51bGwpIHJldHVybiBudWxsOwogICAgICBJdGVyYXRvcjxTdHJpbmc+IG5hbWVzID0gb3B0aW9uLnNwbGl0KCIsIikubWFwKChzKSA9PiBzLnRyaW0oKSkuaXRlcmF0b3I7CiAgICAgIHdoaWxlIChuYW1lcy5tb3ZlTmV4dCgpKSB7CiAgICAgICAgdmFyIG5hbWUgPSBuYW1lcy5jdXJyZW50OwogICAgICAgIGlmICgobmFtZS5zdGFydHNXaXRoKCJbIikgJiYKICAgICAgICAgICAgICAgIG5hbWUuZW5kc1dpdGgoIl0iKSAmJgogICAgICAgICAgICAgICAgIlske3VybC5ob3N0fV0iID09IG5hbWUpIHx8CiAgICAgICAgICAgIChuYW1lLmlzTm90RW1wdHkgJiYgdXJsLmhvc3QuZW5kc1dpdGgobmFtZSkpKSB7CiAgICAgICAgICByZXR1cm4gIkRJUkVDVCI7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGNoZWNrUHJveHkoU3RyaW5nIG9wdGlvbikgewogICAgICBpZiAob3B0aW9uID09IG51bGwpIHJldHVybiBudWxsOwogICAgICBvcHRpb24gPSBvcHRpb24udHJpbSgpOwogICAgICBpZiAob3B0aW9uLmlzRW1wdHkpIHJldHVybiBudWxsOwogICAgICBpbnQgcG9zID0gb3B0aW9uLmluZGV4T2YoIjovLyIpOwogICAgICBpZiAocG9zID49IDApIHsKICAgICAgICBvcHRpb24gPSBvcHRpb24uc3Vic3RyaW5nKHBvcyArIDMpOwogICAgICB9CiAgICAgIHBvcyA9IG9wdGlvbi5pbmRleE9mKCIvIik7CiAgICAgIGlmIChwb3MgPj0gMCkgewogICAgICAgIG9wdGlvbiA9IG9wdGlvbi5zdWJzdHJpbmcoMCwgcG9zKTsKICAgICAgfQogICAgICAvLyBBZGQgZGVmYXVsdCBwb3J0IGlmIG5vIHBvcnQgY29uZmlndXJlZC4KICAgICAgaWYgKG9wdGlvbi5pbmRleE9mKCJbIikgPT0gMCkgewogICAgICAgIHZhciBwb3MgPSBvcHRpb24ubGFzdEluZGV4T2YoIjoiKTsKICAgICAgICBpZiAob3B0aW9uLmluZGV4T2YoIl0iKSA+IHBvcykgb3B0aW9uID0gIiRvcHRpb246MTA4MCI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKG9wdGlvbi5pbmRleE9mKCI6IikgPT0gLTEpIG9wdGlvbiA9ICIkb3B0aW9uOjEwODAiOwogICAgICB9CiAgICAgIHJldHVybiAiUFJPWFkgJG9wdGlvbiI7CiAgICB9CgogICAgLy8gRGVmYXVsdCB0byB1c2luZyB0aGUgcHJvY2VzcyBjdXJyZW50IGVudmlyb25tZW50LgogICAgaWYgKGVudmlyb25tZW50ID09IG51bGwpIGVudmlyb25tZW50ID0gX3BsYXRmb3JtRW52aXJvbm1lbnRDYWNoZTsKCiAgICBTdHJpbmcgcHJveHlDZmc7CgogICAgU3RyaW5nIG5vUHJveHkgPSBlbnZpcm9ubWVudFsibm9fcHJveHkiXTsKICAgIGlmIChub1Byb3h5ID09IG51bGwpIG5vUHJveHkgPSBlbnZpcm9ubWVudFsiTk9fUFJPWFkiXTsKICAgIGlmICgocHJveHlDZmcgPSBjaGVja05vUHJveHkobm9Qcm94eSkpICE9IG51bGwpIHsKICAgICAgcmV0dXJuIHByb3h5Q2ZnOwogICAgfQoKICAgIGlmICh1cmwuc2NoZW1lID09ICJodHRwIikgewogICAgICBTdHJpbmcgcHJveHkgPSBlbnZpcm9ubWVudFsiaHR0cF9wcm94eSJdOwogICAgICBpZiAocHJveHkgPT0gbnVsbCkgcHJveHkgPSBlbnZpcm9ubWVudFsiSFRUUF9QUk9YWSJdOwogICAgICBpZiAoKHByb3h5Q2ZnID0gY2hlY2tQcm94eShwcm94eSkpICE9IG51bGwpIHsKICAgICAgICByZXR1cm4gcHJveHlDZmc7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodXJsLnNjaGVtZSA9PSAiaHR0cHMiKSB7CiAgICAgIFN0cmluZyBwcm94eSA9IGVudmlyb25tZW50WyJodHRwc19wcm94eSJdOwogICAgICBpZiAocHJveHkgPT0gbnVsbCkgcHJveHkgPSBlbnZpcm9ubWVudFsiSFRUUFNfUFJPWFkiXTsKICAgICAgaWYgKChwcm94eUNmZyA9IGNoZWNrUHJveHkocHJveHkpKSAhPSBudWxsKSB7CiAgICAgICAgcmV0dXJuIHByb3h5Q2ZnOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gIkRJUkVDVCI7CiAgfQoKICBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBfcGxhdGZvcm1FbnZpcm9ubWVudENhY2hlID0gUGxhdGZvcm0uZW52aXJvbm1lbnQ7Cn0KCmNsYXNzIF9IdHRwQ29ubmVjdGlvbiBleHRlbmRzIExpbmtlZExpc3RFbnRyeTxfSHR0cENvbm5lY3Rpb24+CiAgICB3aXRoIF9TZXJ2aWNlT2JqZWN0IHsKICBzdGF0aWMgY29uc3QgX0FDVElWRSA9IDA7CiAgc3RhdGljIGNvbnN0IF9JRExFID0gMTsKICBzdGF0aWMgY29uc3QgX0NMT1NJTkcgPSAyOwogIHN0YXRpYyBjb25zdCBfREVUQUNIRUQgPSAzOwoKICAvLyBVc2UgSGFzaE1hcCwgYXMgd2UgZG9uJ3QgbmVlZCB0byBrZWVwIG9yZGVyLgogIHN0YXRpYyBNYXA8aW50LCBfSHR0cENvbm5lY3Rpb24+IF9jb25uZWN0aW9ucyA9CiAgICAgIG5ldyBIYXNoTWFwPGludCwgX0h0dHBDb25uZWN0aW9uPigpOwoKICBmaW5hbCAvKl9TZXJ2ZXJTb2NrZXQqLyBfc29ja2V0OwogIGZpbmFsIF9IdHRwU2VydmVyIF9odHRwU2VydmVyOwogIGZpbmFsIF9IdHRwUGFyc2VyIF9odHRwUGFyc2VyOwogIGludCBfc3RhdGUgPSBfSURMRTsKICBTdHJlYW1TdWJzY3JpcHRpb24gX3N1YnNjcmlwdGlvbjsKICBib29sIF9pZGxlTWFyayA9IGZhbHNlOwogIEZ1dHVyZSBfc3RyZWFtRnV0dXJlOwoKICBfSHR0cENvbm5lY3Rpb24odGhpcy5fc29ja2V0LCB0aGlzLl9odHRwU2VydmVyKQogICAgICA6IF9odHRwUGFyc2VyID0gbmV3IF9IdHRwUGFyc2VyLnJlcXVlc3RQYXJzZXIoKSB7CiAgICBfY29ubmVjdGlvbnNbX3NlcnZpY2VJZF0gPSB0aGlzOwogICAgX2h0dHBQYXJzZXIubGlzdGVuVG9TdHJlYW0oX3NvY2tldCk7CiAgICBfc3Vic2NyaXB0aW9uID0gX2h0dHBQYXJzZXIubGlzdGVuKChpbmNvbWluZykgewogICAgICBfaHR0cFNlcnZlci5fbWFya0FjdGl2ZSh0aGlzKTsKICAgICAgLy8gSWYgdGhlIGluY29taW5nIHdhcyBjbG9zZWQsIGNsb3NlIHRoZSBjb25uZWN0aW9uLgogICAgICBpbmNvbWluZy5kYXRhRG9uZS50aGVuKChjbG9zaW5nKSB7CiAgICAgICAgaWYgKGNsb3NpbmcpIGRlc3Ryb3koKTsKICAgICAgfSk7CiAgICAgIC8vIE9ubHkgaGFuZGxlIG9uZSBpbmNvbWluZyByZXF1ZXN0IGF0IHRoZSB0aW1lLiBLZWVwIHRoZQogICAgICAvLyBzdHJlYW0gcGF1c2VkIHVudGlsIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHNlbmQuCiAgICAgIF9zdWJzY3JpcHRpb24ucGF1c2UoKTsKICAgICAgX3N0YXRlID0gX0FDVElWRTsKICAgICAgdmFyIG91dGdvaW5nID0gbmV3IF9IdHRwT3V0Z29pbmcoX3NvY2tldCk7CiAgICAgIHZhciByZXNwb25zZSA9IG5ldyBfSHR0cFJlc3BvbnNlKAogICAgICAgICAgaW5jb21pbmcudXJpLAogICAgICAgICAgaW5jb21pbmcuaGVhZGVycy5wcm90b2NvbFZlcnNpb24sCiAgICAgICAgICBvdXRnb2luZywKICAgICAgICAgIF9odHRwU2VydmVyLmRlZmF1bHRSZXNwb25zZUhlYWRlcnMsCiAgICAgICAgICBfaHR0cFNlcnZlci5zZXJ2ZXJIZWFkZXIpOwogICAgICB2YXIgcmVxdWVzdCA9IG5ldyBfSHR0cFJlcXVlc3QocmVzcG9uc2UsIGluY29taW5nLCBfaHR0cFNlcnZlciwgdGhpcyk7CiAgICAgIF9zdHJlYW1GdXR1cmUgPSBvdXRnb2luZy5kb25lLnRoZW4oKF8pIHsKICAgICAgICByZXNwb25zZS5kZWFkbGluZSA9IG51bGw7CiAgICAgICAgaWYgKF9zdGF0ZSA9PSBfREVUQUNIRUQpIHJldHVybjsKICAgICAgICBpZiAocmVzcG9uc2UucGVyc2lzdGVudENvbm5lY3Rpb24gJiYKICAgICAgICAgICAgcmVxdWVzdC5wZXJzaXN0ZW50Q29ubmVjdGlvbiAmJgogICAgICAgICAgICBpbmNvbWluZy5mdWxsQm9keVJlYWQgJiYKICAgICAgICAgICAgIV9odHRwUGFyc2VyLnVwZ3JhZGUgJiYKICAgICAgICAgICAgIV9odHRwU2VydmVyLmNsb3NlZCkgewogICAgICAgICAgX3N0YXRlID0gX0lETEU7CiAgICAgICAgICBfaWRsZU1hcmsgPSBmYWxzZTsKICAgICAgICAgIF9odHRwU2VydmVyLl9tYXJrSWRsZSh0aGlzKTsKICAgICAgICAgIC8vIFJlc3VtZSB0aGUgc3Vic2NyaXB0aW9uIGZvciBpbmNvbWluZyByZXF1ZXN0cyBhcyB0aGUKICAgICAgICAgIC8vIHJlcXVlc3QgaXMgbm93IHByb2Nlc3NlZC4KICAgICAgICAgIF9zdWJzY3JpcHRpb24ucmVzdW1lKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIENsb3NlIHNvY2tldCwga2VlcC1hbGl2ZSBub3QgdXNlZCBvciBib2R5IHNlbnQgYmVmb3JlCiAgICAgICAgICAvLyByZWNlaXZlZCBkYXRhIHdhcyBoYW5kbGVkLgogICAgICAgICAgZGVzdHJveSgpOwogICAgICAgIH0KICAgICAgfSwgb25FcnJvcjogKF8pIHsKICAgICAgICBkZXN0cm95KCk7CiAgICAgIH0pOwogICAgICBvdXRnb2luZy5pZ25vcmVCb2R5ID0gcmVxdWVzdC5tZXRob2QgPT0gIkhFQUQiOwogICAgICByZXNwb25zZS5faHR0cFJlcXVlc3QgPSByZXF1ZXN0OwogICAgICBfaHR0cFNlcnZlci5faGFuZGxlUmVxdWVzdChyZXF1ZXN0KTsKICAgIH0sIG9uRG9uZTogKCkgewogICAgICBkZXN0cm95KCk7CiAgICB9LCBvbkVycm9yOiAoZXJyb3IpIHsKICAgICAgLy8gSWdub3JlIGZhaWxlZCByZXF1ZXN0cyB0aGF0IHdhcyBjbG9zZWQgYmVmb3JlIGhlYWRlcnMgd2FzIHJlY2VpdmVkLgogICAgICBkZXN0cm95KCk7CiAgICB9KTsKICB9CgogIHZvaWQgbWFya0lkbGUoKSB7CiAgICBfaWRsZU1hcmsgPSB0cnVlOwogIH0KCiAgYm9vbCBnZXQgaXNNYXJrZWRJZGxlID0+IF9pZGxlTWFyazsKCiAgdm9pZCBkZXN0cm95KCkgewogICAgaWYgKF9zdGF0ZSA9PSBfQ0xPU0lORyB8fCBfc3RhdGUgPT0gX0RFVEFDSEVEKSByZXR1cm47CiAgICBfc3RhdGUgPSBfQ0xPU0lORzsKICAgIF9zb2NrZXQuZGVzdHJveSgpOwogICAgX2h0dHBTZXJ2ZXIuX2Nvbm5lY3Rpb25DbG9zZWQodGhpcyk7CiAgICBfY29ubmVjdGlvbnMucmVtb3ZlKF9zZXJ2aWNlSWQpOwogIH0KCiAgRnV0dXJlPFNvY2tldD4gZGV0YWNoU29ja2V0KCkgewogICAgX3N0YXRlID0gX0RFVEFDSEVEOwogICAgLy8gUmVtb3ZlIGNvbm5lY3Rpb24gZnJvbSBzZXJ2ZXIuCiAgICBfaHR0cFNlcnZlci5fY29ubmVjdGlvbkNsb3NlZCh0aGlzKTsKCiAgICBfSHR0cERldGFjaGVkSW5jb21pbmcgZGV0YWNoZWRJbmNvbWluZyA9IF9odHRwUGFyc2VyLmRldGFjaEluY29taW5nKCk7CgogICAgcmV0dXJuIF9zdHJlYW1GdXR1cmUudGhlbigoXykgewogICAgICBfY29ubmVjdGlvbnMucmVtb3ZlKF9zZXJ2aWNlSWQpOwogICAgICByZXR1cm4gbmV3IF9EZXRhY2hlZFNvY2tldChfc29ja2V0LCBkZXRhY2hlZEluY29taW5nKTsKICAgIH0pOwogIH0KCiAgSHR0cENvbm5lY3Rpb25JbmZvIGdldCBjb25uZWN0aW9uSW5mbyA9PiBfSHR0cENvbm5lY3Rpb25JbmZvLmNyZWF0ZShfc29ja2V0KTsKCiAgYm9vbCBnZXQgX2lzQWN0aXZlID0+IF9zdGF0ZSA9PSBfQUNUSVZFOwogIGJvb2wgZ2V0IF9pc0lkbGUgPT4gX3N0YXRlID09IF9JRExFOwogIGJvb2wgZ2V0IF9pc0Nsb3NpbmcgPT4gX3N0YXRlID09IF9DTE9TSU5HOwogIGJvb2wgZ2V0IF9pc0RldGFjaGVkID0+IF9zdGF0ZSA9PSBfREVUQUNIRUQ7CgogIFN0cmluZyBnZXQgX3NlcnZpY2VUeXBlUGF0aCA9PiAnaW8vaHR0cC9zZXJ2ZXJjb25uZWN0aW9ucyc7CiAgU3RyaW5nIGdldCBfc2VydmljZVR5cGVOYW1lID0+ICdIdHRwU2VydmVyQ29ubmVjdGlvbic7CgogIE1hcCBfdG9KU09OKGJvb2wgcmVmKSB7CiAgICB2YXIgbmFtZSA9ICIke19zb2NrZXQuYWRkcmVzcy5ob3N0fToke19zb2NrZXQucG9ydH0gPC0+ICIKICAgICAgICAiJHtfc29ja2V0LnJlbW90ZUFkZHJlc3MuaG9zdH06JHtfc29ja2V0LnJlbW90ZVBvcnR9IjsKICAgIHZhciByID0gPFN0cmluZywgZHluYW1pYz57CiAgICAgICdpZCc6IF9zZXJ2aWNlUGF0aCwKICAgICAgJ3R5cGUnOiBfc2VydmljZVR5cGUocmVmKSwKICAgICAgJ25hbWUnOiBuYW1lLAogICAgICAndXNlcl9uYW1lJzogbmFtZSwKICAgIH07CiAgICBpZiAocmVmKSB7CiAgICAgIHJldHVybiByOwogICAgfQogICAgclsnc2VydmVyJ10gPSBfaHR0cFNlcnZlci5fdG9KU09OKHRydWUpOwogICAgdHJ5IHsKICAgICAgclsnc29ja2V0J10gPSBfc29ja2V0Ll90b0pTT04odHJ1ZSk7CiAgICB9IGNhdGNoIChfKSB7CiAgICAgIHJbJ3NvY2tldCddID0gewogICAgICAgICdpZCc6IF9zZXJ2aWNlUGF0aCwKICAgICAgICAndHlwZSc6ICdAU29ja2V0JywKICAgICAgICAnbmFtZSc6ICdVc2VyU29ja2V0JywKICAgICAgICAndXNlcl9uYW1lJzogJ1VzZXJTb2NrZXQnLAogICAgICB9OwogICAgfQogICAgc3dpdGNoIChfc3RhdGUpIHsKICAgICAgY2FzZSBfQUNUSVZFOgogICAgICAgIHJbJ3N0YXRlJ10gPSAiQWN0aXZlIjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBfSURMRToKICAgICAgICByWydzdGF0ZSddID0gIklkbGUiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIF9DTE9TSU5HOgogICAgICAgIHJbJ3N0YXRlJ10gPSAiQ2xvc2luZyI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgX0RFVEFDSEVEOgogICAgICAgIHJbJ3N0YXRlJ10gPSAiRGV0YWNoZWQiOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHJbJ3N0YXRlJ10gPSAnVW5rbm93bic7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gcjsKICB9Cn0KCi8vIEhUVFAgc2VydmVyIHdhaXRpbmcgZm9yIHNvY2tldCBjb25uZWN0aW9ucy4KY2xhc3MgX0h0dHBTZXJ2ZXIgZXh0ZW5kcyBTdHJlYW08SHR0cFJlcXVlc3Q+CiAgICB3aXRoIF9TZXJ2aWNlT2JqZWN0CiAgICBpbXBsZW1lbnRzIEh0dHBTZXJ2ZXIgewogIC8vIFVzZSBkZWZhdWx0IE1hcCBzbyB3ZSBrZWVwIG9yZGVyLgogIHN0YXRpYyBNYXA8aW50LCBfSHR0cFNlcnZlcj4gX3NlcnZlcnMgPSBuZXcgTWFwPGludCwgX0h0dHBTZXJ2ZXI+KCk7CgogIFN0cmluZyBzZXJ2ZXJIZWFkZXI7CiAgZmluYWwgSHR0cEhlYWRlcnMgZGVmYXVsdFJlc3BvbnNlSGVhZGVycyA9IF9pbml0RGVmYXVsdFJlc3BvbnNlSGVhZGVycygpOwogIGJvb2wgYXV0b0NvbXByZXNzID0gZmFsc2U7CgogIER1cmF0aW9uIF9pZGxlVGltZW91dDsKICBUaW1lciBfaWRsZVRpbWVyOwoKICBzdGF0aWMgRnV0dXJlPEh0dHBTZXJ2ZXI+IGJpbmQoCiAgICAgIGFkZHJlc3MsIGludCBwb3J0LCBpbnQgYmFja2xvZywgYm9vbCB2Nk9ubHksIGJvb2wgc2hhcmVkKSB7CiAgICByZXR1cm4gU2VydmVyU29ja2V0LmJpbmQoYWRkcmVzcywgcG9ydCwKICAgICAgICAgICAgYmFja2xvZzogYmFja2xvZywgdjZPbmx5OiB2Nk9ubHksIHNoYXJlZDogc2hhcmVkKQogICAgICAgIC50aGVuPEh0dHBTZXJ2ZXI+KChzb2NrZXQpIHsKICAgICAgcmV0dXJuIG5ldyBfSHR0cFNlcnZlci5fKHNvY2tldCwgdHJ1ZSk7CiAgICB9KTsKICB9CgogIHN0YXRpYyBGdXR1cmU8SHR0cFNlcnZlcj4gYmluZFNlY3VyZSgKICAgICAgYWRkcmVzcywKICAgICAgaW50IHBvcnQsCiAgICAgIFNlY3VyaXR5Q29udGV4dCBjb250ZXh0LAogICAgICBpbnQgYmFja2xvZywKICAgICAgYm9vbCB2Nk9ubHksCiAgICAgIGJvb2wgcmVxdWVzdENsaWVudENlcnRpZmljYXRlLAogICAgICBib29sIHNoYXJlZCkgewogICAgcmV0dXJuIFNlY3VyZVNlcnZlclNvY2tldC5iaW5kKGFkZHJlc3MsIHBvcnQsIGNvbnRleHQsCiAgICAgICAgICAgIGJhY2tsb2c6IGJhY2tsb2csCiAgICAgICAgICAgIHY2T25seTogdjZPbmx5LAogICAgICAgICAgICByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGU6IHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgc2hhcmVkOiBzaGFyZWQpCiAgICAgICAgLnRoZW48SHR0cFNlcnZlcj4oKHNvY2tldCkgewogICAgICByZXR1cm4gbmV3IF9IdHRwU2VydmVyLl8oc29ja2V0LCB0cnVlKTsKICAgIH0pOwogIH0KCiAgX0h0dHBTZXJ2ZXIuXyh0aGlzLl9zZXJ2ZXJTb2NrZXQsIHRoaXMuX2Nsb3NlU2VydmVyKSB7CiAgICBfY29udHJvbGxlciA9CiAgICAgICAgbmV3IFN0cmVhbUNvbnRyb2xsZXI8SHR0cFJlcXVlc3Q+KHN5bmM6IHRydWUsIG9uQ2FuY2VsOiBjbG9zZSk7CiAgICBpZGxlVGltZW91dCA9IGNvbnN0IER1cmF0aW9uKHNlY29uZHM6IDEyMCk7CiAgICBfc2VydmVyc1tfc2VydmljZUlkXSA9IHRoaXM7CiAgfQoKICBfSHR0cFNlcnZlci5saXN0ZW5Pbih0aGlzLl9zZXJ2ZXJTb2NrZXQpIDogX2Nsb3NlU2VydmVyID0gZmFsc2UgewogICAgX2NvbnRyb2xsZXIgPQogICAgICAgIG5ldyBTdHJlYW1Db250cm9sbGVyPEh0dHBSZXF1ZXN0PihzeW5jOiB0cnVlLCBvbkNhbmNlbDogY2xvc2UpOwogICAgaWRsZVRpbWVvdXQgPSBjb25zdCBEdXJhdGlvbihzZWNvbmRzOiAxMjApOwogICAgX3NlcnZlcnNbX3NlcnZpY2VJZF0gPSB0aGlzOwogIH0KCiAgc3RhdGljIEh0dHBIZWFkZXJzIF9pbml0RGVmYXVsdFJlc3BvbnNlSGVhZGVycygpIHsKICAgIHZhciBkZWZhdWx0UmVzcG9uc2VIZWFkZXJzID0gbmV3IF9IdHRwSGVhZGVycygnMS4xJyk7CiAgICBkZWZhdWx0UmVzcG9uc2VIZWFkZXJzLmNvbnRlbnRUeXBlID0gQ29udGVudFR5cGUudGV4dDsKICAgIGRlZmF1bHRSZXNwb25zZUhlYWRlcnMuc2V0KCdYLUZyYW1lLU9wdGlvbnMnLCAnU0FNRU9SSUdJTicpOwogICAgZGVmYXVsdFJlc3BvbnNlSGVhZGVycy5zZXQoJ1gtQ29udGVudC1UeXBlLU9wdGlvbnMnLCAnbm9zbmlmZicpOwogICAgZGVmYXVsdFJlc3BvbnNlSGVhZGVycy5zZXQoJ1gtWFNTLVByb3RlY3Rpb24nLCAnMTsgbW9kZT1ibG9jaycpOwogICAgcmV0dXJuIGRlZmF1bHRSZXNwb25zZUhlYWRlcnM7CiAgfQoKICBEdXJhdGlvbiBnZXQgaWRsZVRpbWVvdXQgPT4gX2lkbGVUaW1lb3V0OwoKICB2b2lkIHNldCBpZGxlVGltZW91dChEdXJhdGlvbiBkdXJhdGlvbikgewogICAgaWYgKF9pZGxlVGltZXIgIT0gbnVsbCkgewogICAgICBfaWRsZVRpbWVyLmNhbmNlbCgpOwogICAgICBfaWRsZVRpbWVyID0gbnVsbDsKICAgIH0KICAgIF9pZGxlVGltZW91dCA9IGR1cmF0aW9uOwogICAgaWYgKF9pZGxlVGltZW91dCAhPSBudWxsKSB7CiAgICAgIF9pZGxlVGltZXIgPSBuZXcgVGltZXIucGVyaW9kaWMoX2lkbGVUaW1lb3V0LCAoXykgewogICAgICAgIGZvciAodmFyIGlkbGUgaW4gX2lkbGVDb25uZWN0aW9ucy50b0xpc3QoKSkgewogICAgICAgICAgaWYgKGlkbGUuaXNNYXJrZWRJZGxlKSB7CiAgICAgICAgICAgIGlkbGUuZGVzdHJveSgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWRsZS5tYXJrSWRsZSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfQoKICBTdHJlYW1TdWJzY3JpcHRpb248SHR0cFJlcXVlc3Q+IGxpc3Rlbih2b2lkIG9uRGF0YShIdHRwUmVxdWVzdCBldmVudCksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICBfc2VydmVyU29ja2V0Lmxpc3RlbigoU29ja2V0IHNvY2tldCkgewogICAgICBzb2NrZXQuc2V0T3B0aW9uKFNvY2tldE9wdGlvbi50Y3BOb0RlbGF5LCB0cnVlKTsKICAgICAgLy8gQWNjZXB0IHRoZSBjbGllbnQgY29ubmVjdGlvbi4KICAgICAgX0h0dHBDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBuZXcgX0h0dHBDb25uZWN0aW9uKHNvY2tldCwgdGhpcyk7CiAgICAgIF9pZGxlQ29ubmVjdGlvbnMuYWRkKGNvbm5lY3Rpb24pOwogICAgfSwgb25FcnJvcjogKGVycm9yLCBzdGFja1RyYWNlKSB7CiAgICAgIC8vIElnbm9yZSBIYW5kc2hha2VFeGNlcHRpb25zIGFzIHRoZXkgYXJlIGJvdW5kIHRvIGEgc2luZ2xlIHJlcXVlc3QsCiAgICAgIC8vIGFuZCBhcmUgbm90IGZhdGFsIGZvciB0aGUgc2VydmVyLgogICAgICBpZiAoZXJyb3IgaXMhIEhhbmRzaGFrZUV4Y2VwdGlvbikgewogICAgICAgIF9jb250cm9sbGVyLmFkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgfQogICAgfSwgb25Eb25lOiBfY29udHJvbGxlci5jbG9zZSk7CiAgICByZXR1cm4gX2NvbnRyb2xsZXIuc3RyZWFtLmxpc3RlbihvbkRhdGEsCiAgICAgICAgb25FcnJvcjogb25FcnJvciwgb25Eb25lOiBvbkRvbmUsIGNhbmNlbE9uRXJyb3I6IGNhbmNlbE9uRXJyb3IpOwogIH0KCiAgRnV0dXJlIGNsb3NlKHtib29sIGZvcmNlOiBmYWxzZX0pIHsKICAgIGNsb3NlZCA9IHRydWU7CiAgICBGdXR1cmUgcmVzdWx0OwogICAgaWYgKF9zZXJ2ZXJTb2NrZXQgIT0gbnVsbCAmJiBfY2xvc2VTZXJ2ZXIpIHsKICAgICAgcmVzdWx0ID0gX3NlcnZlclNvY2tldC5jbG9zZSgpOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0ID0gbmV3IEZ1dHVyZS52YWx1ZSgpOwogICAgfQogICAgaWRsZVRpbWVvdXQgPSBudWxsOwogICAgaWYgKGZvcmNlKSB7CiAgICAgIGZvciAodmFyIGMgaW4gX2FjdGl2ZUNvbm5lY3Rpb25zLnRvTGlzdCgpKSB7CiAgICAgICAgYy5kZXN0cm95KCk7CiAgICAgIH0KICAgICAgYXNzZXJ0KF9hY3RpdmVDb25uZWN0aW9ucy5pc0VtcHR5KTsKICAgIH0KICAgIGZvciAodmFyIGMgaW4gX2lkbGVDb25uZWN0aW9ucy50b0xpc3QoKSkgewogICAgICBjLmRlc3Ryb3koKTsKICAgIH0KICAgIF9tYXliZVBlcmZvcm1DbGVhbnVwKCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBfbWF5YmVQZXJmb3JtQ2xlYW51cCgpIHsKICAgIGlmIChjbG9zZWQgJiYKICAgICAgICBfaWRsZUNvbm5lY3Rpb25zLmlzRW1wdHkgJiYKICAgICAgICBfYWN0aXZlQ29ubmVjdGlvbnMuaXNFbXB0eSAmJgogICAgICAgIF9zZXNzaW9uTWFuYWdlckluc3RhbmNlICE9IG51bGwpIHsKICAgICAgX3Nlc3Npb25NYW5hZ2VySW5zdGFuY2UuY2xvc2UoKTsKICAgICAgX3Nlc3Npb25NYW5hZ2VySW5zdGFuY2UgPSBudWxsOwogICAgICBfc2VydmVycy5yZW1vdmUoX3NlcnZpY2VJZCk7CiAgICB9CiAgfQoKICBpbnQgZ2V0IHBvcnQgewogICAgaWYgKGNsb3NlZCkgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIkh0dHBTZXJ2ZXIgaXMgbm90IGJvdW5kIHRvIGEgc29ja2V0Iik7CiAgICByZXR1cm4gX3NlcnZlclNvY2tldC5wb3J0OwogIH0KCiAgSW50ZXJuZXRBZGRyZXNzIGdldCBhZGRyZXNzIHsKICAgIGlmIChjbG9zZWQpIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJIdHRwU2VydmVyIGlzIG5vdCBib3VuZCB0byBhIHNvY2tldCIpOwogICAgcmV0dXJuIF9zZXJ2ZXJTb2NrZXQuYWRkcmVzczsKICB9CgogIHNldCBzZXNzaW9uVGltZW91dChpbnQgdGltZW91dCkgewogICAgX3Nlc3Npb25NYW5hZ2VyLnNlc3Npb25UaW1lb3V0ID0gdGltZW91dDsKICB9CgogIHZvaWQgX2hhbmRsZVJlcXVlc3QoX0h0dHBSZXF1ZXN0IHJlcXVlc3QpIHsKICAgIGlmICghY2xvc2VkKSB7CiAgICAgIF9jb250cm9sbGVyLmFkZChyZXF1ZXN0KTsKICAgIH0gZWxzZSB7CiAgICAgIHJlcXVlc3QuX2h0dHBDb25uZWN0aW9uLmRlc3Ryb3koKTsKICAgIH0KICB9CgogIHZvaWQgX2Nvbm5lY3Rpb25DbG9zZWQoX0h0dHBDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKICAgIC8vIFJlbW92ZSBpdHNlbGYgZnJvbSBlaXRoZXIgaWRsZSBvciBhY3RpdmUgY29ubmVjdGlvbnMuCiAgICBjb25uZWN0aW9uLnVubGluaygpOwogICAgX21heWJlUGVyZm9ybUNsZWFudXAoKTsKICB9CgogIHZvaWQgX21hcmtJZGxlKF9IdHRwQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7CiAgICBfYWN0aXZlQ29ubmVjdGlvbnMucmVtb3ZlKGNvbm5lY3Rpb24pOwogICAgX2lkbGVDb25uZWN0aW9ucy5hZGQoY29ubmVjdGlvbik7CiAgfQoKICB2b2lkIF9tYXJrQWN0aXZlKF9IdHRwQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7CiAgICBfaWRsZUNvbm5lY3Rpb25zLnJlbW92ZShjb25uZWN0aW9uKTsKICAgIF9hY3RpdmVDb25uZWN0aW9ucy5hZGQoY29ubmVjdGlvbik7CiAgfQoKICBfSHR0cFNlc3Npb25NYW5hZ2VyIGdldCBfc2Vzc2lvbk1hbmFnZXIgewogICAgLy8gTGF6eSBpbml0LgogICAgaWYgKF9zZXNzaW9uTWFuYWdlckluc3RhbmNlID09IG51bGwpIHsKICAgICAgX3Nlc3Npb25NYW5hZ2VySW5zdGFuY2UgPSBuZXcgX0h0dHBTZXNzaW9uTWFuYWdlcigpOwogICAgfQogICAgcmV0dXJuIF9zZXNzaW9uTWFuYWdlckluc3RhbmNlOwogIH0KCiAgSHR0cENvbm5lY3Rpb25zSW5mbyBjb25uZWN0aW9uc0luZm8oKSB7CiAgICBIdHRwQ29ubmVjdGlvbnNJbmZvIHJlc3VsdCA9IG5ldyBIdHRwQ29ubmVjdGlvbnNJbmZvKCk7CiAgICByZXN1bHQudG90YWwgPSBfYWN0aXZlQ29ubmVjdGlvbnMubGVuZ3RoICsgX2lkbGVDb25uZWN0aW9ucy5sZW5ndGg7CiAgICBfYWN0aXZlQ29ubmVjdGlvbnMuZm9yRWFjaCgoX0h0dHBDb25uZWN0aW9uIGNvbm4pIHsKICAgICAgaWYgKGNvbm4uX2lzQWN0aXZlKSB7CiAgICAgICAgcmVzdWx0LmFjdGl2ZSsrOwogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydChjb25uLl9pc0Nsb3NpbmcpOwogICAgICAgIHJlc3VsdC5jbG9zaW5nKys7CiAgICAgIH0KICAgIH0pOwogICAgX2lkbGVDb25uZWN0aW9ucy5mb3JFYWNoKChfSHR0cENvbm5lY3Rpb24gY29ubikgewogICAgICByZXN1bHQuaWRsZSsrOwogICAgICBhc3NlcnQoY29ubi5faXNJZGxlKTsKICAgIH0pOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIFN0cmluZyBnZXQgX3NlcnZpY2VUeXBlUGF0aCA9PiAnaW8vaHR0cC9zZXJ2ZXJzJzsKICBTdHJpbmcgZ2V0IF9zZXJ2aWNlVHlwZU5hbWUgPT4gJ0h0dHBTZXJ2ZXInOwoKICBNYXA8U3RyaW5nLCBkeW5hbWljPiBfdG9KU09OKGJvb2wgcmVmKSB7CiAgICB2YXIgciA9IDxTdHJpbmcsIGR5bmFtaWM+ewogICAgICAnaWQnOiBfc2VydmljZVBhdGgsCiAgICAgICd0eXBlJzogX3NlcnZpY2VUeXBlKHJlZiksCiAgICAgICduYW1lJzogJyR7YWRkcmVzcy5ob3N0fTokcG9ydCcsCiAgICAgICd1c2VyX25hbWUnOiAnJHthZGRyZXNzLmhvc3R9OiRwb3J0JywKICAgIH07CiAgICBpZiAocmVmKSB7CiAgICAgIHJldHVybiByOwogICAgfQogICAgdHJ5IHsKICAgICAgclsnc29ja2V0J10gPSBfc2VydmVyU29ja2V0Ll90b0pTT04odHJ1ZSk7CiAgICB9IGNhdGNoIChfKSB7CiAgICAgIHJbJ3NvY2tldCddID0gewogICAgICAgICdpZCc6IF9zZXJ2aWNlUGF0aCwKICAgICAgICAndHlwZSc6ICdAU29ja2V0JywKICAgICAgICAnbmFtZSc6ICdVc2VyU29ja2V0JywKICAgICAgICAndXNlcl9uYW1lJzogJ1VzZXJTb2NrZXQnLAogICAgICB9OwogICAgfQogICAgclsncG9ydCddID0gcG9ydDsKICAgIHJbJ2FkZHJlc3MnXSA9IGFkZHJlc3MuaG9zdDsKICAgIHJbJ2FjdGl2ZSddID0gX2FjdGl2ZUNvbm5lY3Rpb25zLm1hcCgoYykgPT4gYy5fdG9KU09OKHRydWUpKS50b0xpc3QoKTsKICAgIHJbJ2lkbGUnXSA9IF9pZGxlQ29ubmVjdGlvbnMubWFwKChjKSA9PiBjLl90b0pTT04odHJ1ZSkpLnRvTGlzdCgpOwogICAgclsnY2xvc2VkJ10gPSBjbG9zZWQ7CiAgICByZXR1cm4gcjsKICB9CgogIF9IdHRwU2Vzc2lvbk1hbmFnZXIgX3Nlc3Npb25NYW5hZ2VySW5zdGFuY2U7CgogIC8vIEluZGljYXRlZCBpZiB0aGUgaHR0cCBzZXJ2ZXIgaGFzIGJlZW4gY2xvc2VkLgogIGJvb2wgY2xvc2VkID0gZmFsc2U7CgogIC8vIFRoZSBzZXJ2ZXIgbGlzdGVuIHNvY2tldC4gVW50eXBlZCBhcyBpdCBjYW4gYmUgYm90aCBTZXJ2ZXJTb2NrZXQgYW5kCiAgLy8gU2VjdXJlU2VydmVyU29ja2V0LgogIGZpbmFsIGR5bmFtaWMgLypTZXJ2ZXJTb2NrZXR8U2VjdXJlU2VydmVyU29ja2V0Ki8gX3NlcnZlclNvY2tldDsKICBmaW5hbCBib29sIF9jbG9zZVNlcnZlcjsKCiAgLy8gU2V0IG9mIGN1cnJlbnRseSBjb25uZWN0ZWQgY2xpZW50cy4KICBmaW5hbCBMaW5rZWRMaXN0PF9IdHRwQ29ubmVjdGlvbj4gX2FjdGl2ZUNvbm5lY3Rpb25zID0KICAgICAgbmV3IExpbmtlZExpc3Q8X0h0dHBDb25uZWN0aW9uPigpOwogIGZpbmFsIExpbmtlZExpc3Q8X0h0dHBDb25uZWN0aW9uPiBfaWRsZUNvbm5lY3Rpb25zID0KICAgICAgbmV3IExpbmtlZExpc3Q8X0h0dHBDb25uZWN0aW9uPigpOwogIFN0cmVhbUNvbnRyb2xsZXI8SHR0cFJlcXVlc3Q+IF9jb250cm9sbGVyOwp9CgpjbGFzcyBfUHJveHlDb25maWd1cmF0aW9uIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIFBST1hZX1BSRUZJWCA9ICJQUk9YWSAiOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgRElSRUNUX1BSRUZJWCA9ICJESVJFQ1QiOwoKICBfUHJveHlDb25maWd1cmF0aW9uKFN0cmluZyBjb25maWd1cmF0aW9uKSA6IHByb3hpZXMgPSBuZXcgTGlzdDxfUHJveHk+KCkgewogICAgaWYgKGNvbmZpZ3VyYXRpb24gPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigiSW52YWxpZCBwcm94eSBjb25maWd1cmF0aW9uICRjb25maWd1cmF0aW9uIik7CiAgICB9CiAgICBMaXN0PFN0cmluZz4gbGlzdCA9IGNvbmZpZ3VyYXRpb24uc3BsaXQoIjsiKTsKICAgIGxpc3QuZm9yRWFjaCgoU3RyaW5nIHByb3h5KSB7CiAgICAgIHByb3h5ID0gcHJveHkudHJpbSgpOwogICAgICBpZiAoIXByb3h5LmlzRW1wdHkpIHsKICAgICAgICBpZiAocHJveHkuc3RhcnRzV2l0aChQUk9YWV9QUkVGSVgpKSB7CiAgICAgICAgICBTdHJpbmcgdXNlcm5hbWU7CiAgICAgICAgICBTdHJpbmcgcGFzc3dvcmQ7CiAgICAgICAgICAvLyBTa2lwIHRoZSAiUFJPWFkgIiBwcmVmaXguCiAgICAgICAgICBwcm94eSA9IHByb3h5LnN1YnN0cmluZyhQUk9YWV9QUkVGSVgubGVuZ3RoKS50cmltKCk7CiAgICAgICAgICAvLyBMb29rIGZvciBwcm94eSBhdXRoZW50aWNhdGlvbi4KICAgICAgICAgIGludCBhdCA9IHByb3h5LmluZGV4T2YoIkAiKTsKICAgICAgICAgIGlmIChhdCAhPSAtMSkgewogICAgICAgICAgICBTdHJpbmcgdXNlcmluZm8gPSBwcm94eS5zdWJzdHJpbmcoMCwgYXQpLnRyaW0oKTsKICAgICAgICAgICAgcHJveHkgPSBwcm94eS5zdWJzdHJpbmcoYXQgKyAxKS50cmltKCk7CiAgICAgICAgICAgIGludCBjb2xvbiA9IHVzZXJpbmZvLmluZGV4T2YoIjoiKTsKICAgICAgICAgICAgaWYgKGNvbG9uID09IC0xIHx8IGNvbG9uID09IDAgfHwgY29sb24gPT0gcHJveHkubGVuZ3RoIC0gMSkgewogICAgICAgICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAiSW52YWxpZCBwcm94eSBjb25maWd1cmF0aW9uICRjb25maWd1cmF0aW9uIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdXNlcm5hbWUgPSB1c2VyaW5mby5zdWJzdHJpbmcoMCwgY29sb24pLnRyaW0oKTsKICAgICAgICAgICAgcGFzc3dvcmQgPSB1c2VyaW5mby5zdWJzdHJpbmcoY29sb24gKyAxKS50cmltKCk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBMb29rIGZvciBwcm94eSBob3N0IGFuZCBwb3J0LgogICAgICAgICAgaW50IGNvbG9uID0gcHJveHkubGFzdEluZGV4T2YoIjoiKTsKICAgICAgICAgIGlmIChjb2xvbiA9PSAtMSB8fCBjb2xvbiA9PSAwIHx8IGNvbG9uID09IHByb3h5Lmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAiSW52YWxpZCBwcm94eSBjb25maWd1cmF0aW9uICRjb25maWd1cmF0aW9uIik7CiAgICAgICAgICB9CiAgICAgICAgICBTdHJpbmcgaG9zdCA9IHByb3h5LnN1YnN0cmluZygwLCBjb2xvbikudHJpbSgpOwogICAgICAgICAgaWYgKGhvc3Quc3RhcnRzV2l0aCgiWyIpICYmIGhvc3QuZW5kc1dpdGgoIl0iKSkgewogICAgICAgICAgICBob3N0ID0gaG9zdC5zdWJzdHJpbmcoMSwgaG9zdC5sZW5ndGggLSAxKTsKICAgICAgICAgIH0KICAgICAgICAgIFN0cmluZyBwb3J0U3RyaW5nID0gcHJveHkuc3Vic3RyaW5nKGNvbG9uICsgMSkudHJpbSgpOwogICAgICAgICAgaW50IHBvcnQ7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBwb3J0ID0gaW50LnBhcnNlKHBvcnRTdHJpbmcpOwogICAgICAgICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAiSW52YWxpZCBwcm94eSBjb25maWd1cmF0aW9uICRjb25maWd1cmF0aW9uLCAiCiAgICAgICAgICAgICAgICAiaW52YWxpZCBwb3J0ICckcG9ydFN0cmluZyciKTsKICAgICAgICAgIH0KICAgICAgICAgIHByb3hpZXMuYWRkKG5ldyBfUHJveHkoaG9zdCwgcG9ydCwgdXNlcm5hbWUsIHBhc3N3b3JkKSk7CiAgICAgICAgfSBlbHNlIGlmIChwcm94eS50cmltKCkgPT0gRElSRUNUX1BSRUZJWCkgewogICAgICAgICAgcHJveGllcy5hZGQobmV3IF9Qcm94eS5kaXJlY3QoKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJJbnZhbGlkIHByb3h5IGNvbmZpZ3VyYXRpb24gJGNvbmZpZ3VyYXRpb24iKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgY29uc3QgX1Byb3h5Q29uZmlndXJhdGlvbi5kaXJlY3QoKSA6IHByb3hpZXMgPSBjb25zdCBbY29uc3QgX1Byb3h5LmRpcmVjdCgpXTsKCiAgZmluYWwgTGlzdDxfUHJveHk+IHByb3hpZXM7Cn0KCmNsYXNzIF9Qcm94eSB7CiAgZmluYWwgU3RyaW5nIGhvc3Q7CiAgZmluYWwgaW50IHBvcnQ7CiAgZmluYWwgU3RyaW5nIHVzZXJuYW1lOwogIGZpbmFsIFN0cmluZyBwYXNzd29yZDsKICBmaW5hbCBib29sIGlzRGlyZWN0OwoKICBjb25zdCBfUHJveHkodGhpcy5ob3N0LCB0aGlzLnBvcnQsIHRoaXMudXNlcm5hbWUsIHRoaXMucGFzc3dvcmQpCiAgICAgIDogaXNEaXJlY3QgPSBmYWxzZTsKICBjb25zdCBfUHJveHkuZGlyZWN0KCkKICAgICAgOiBob3N0ID0gbnVsbCwKICAgICAgICBwb3J0ID0gbnVsbCwKICAgICAgICB1c2VybmFtZSA9IG51bGwsCiAgICAgICAgcGFzc3dvcmQgPSBudWxsLAogICAgICAgIGlzRGlyZWN0ID0gdHJ1ZTsKCiAgYm9vbCBnZXQgaXNBdXRoZW50aWNhdGVkID0+IHVzZXJuYW1lICE9IG51bGw7Cn0KCmNsYXNzIF9IdHRwQ29ubmVjdGlvbkluZm8gaW1wbGVtZW50cyBIdHRwQ29ubmVjdGlvbkluZm8gewogIEludGVybmV0QWRkcmVzcyByZW1vdGVBZGRyZXNzOwogIGludCByZW1vdGVQb3J0OwogIGludCBsb2NhbFBvcnQ7CgogIHN0YXRpYyBfSHR0cENvbm5lY3Rpb25JbmZvIGNyZWF0ZShTb2NrZXQgc29ja2V0KSB7CiAgICBpZiAoc29ja2V0ID09IG51bGwpIHJldHVybiBudWxsOwogICAgdHJ5IHsKICAgICAgX0h0dHBDb25uZWN0aW9uSW5mbyBpbmZvID0gbmV3IF9IdHRwQ29ubmVjdGlvbkluZm8oKTsKICAgICAgcmV0dXJuIGluZm8KICAgICAgICAuLnJlbW90ZUFkZHJlc3MgPSBzb2NrZXQucmVtb3RlQWRkcmVzcwogICAgICAgIC4ucmVtb3RlUG9ydCA9IHNvY2tldC5yZW1vdGVQb3J0CiAgICAgICAgLi5sb2NhbFBvcnQgPSBzb2NrZXQucG9ydDsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCmNsYXNzIF9EZXRhY2hlZFNvY2tldCBleHRlbmRzIFN0cmVhbTxMaXN0PGludD4+IGltcGxlbWVudHMgU29ja2V0IHsKICBmaW5hbCBTdHJlYW08TGlzdDxpbnQ+PiBfaW5jb21pbmc7CiAgZmluYWwgU29ja2V0IF9zb2NrZXQ7CgogIF9EZXRhY2hlZFNvY2tldCh0aGlzLl9zb2NrZXQsIHRoaXMuX2luY29taW5nKTsKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPExpc3Q8aW50Pj4gbGlzdGVuKHZvaWQgb25EYXRhKExpc3Q8aW50PiBldmVudCksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICByZXR1cm4gX2luY29taW5nLmxpc3RlbihvbkRhdGEsCiAgICAgICAgb25FcnJvcjogb25FcnJvciwgb25Eb25lOiBvbkRvbmUsIGNhbmNlbE9uRXJyb3I6IGNhbmNlbE9uRXJyb3IpOwogIH0KCiAgRW5jb2RpbmcgZ2V0IGVuY29kaW5nID0+IF9zb2NrZXQuZW5jb2Rpbmc7CgogIHZvaWQgc2V0IGVuY29kaW5nKEVuY29kaW5nIHZhbHVlKSB7CiAgICBfc29ja2V0LmVuY29kaW5nID0gdmFsdWU7CiAgfQoKICB2b2lkIHdyaXRlKE9iamVjdCBvYmopIHsKICAgIF9zb2NrZXQud3JpdGUob2JqKTsKICB9CgogIHZvaWQgd3JpdGVsbihbT2JqZWN0IG9iaiA9ICIiXSkgewogICAgX3NvY2tldC53cml0ZWxuKG9iaik7CiAgfQoKICB2b2lkIHdyaXRlQ2hhckNvZGUoaW50IGNoYXJDb2RlKSB7CiAgICBfc29ja2V0LndyaXRlQ2hhckNvZGUoY2hhckNvZGUpOwogIH0KCiAgdm9pZCB3cml0ZUFsbChJdGVyYWJsZSBvYmplY3RzLCBbU3RyaW5nIHNlcGFyYXRvciA9ICIiXSkgewogICAgX3NvY2tldC53cml0ZUFsbChvYmplY3RzLCBzZXBhcmF0b3IpOwogIH0KCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGJ5dGVzKSB7CiAgICBfc29ja2V0LmFkZChieXRlcyk7CiAgfQoKICB2b2lkIGFkZEVycm9yKGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSkgPT4KICAgICAgX3NvY2tldC5hZGRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CgogIEZ1dHVyZSBhZGRTdHJlYW0oU3RyZWFtPExpc3Q8aW50Pj4gc3RyZWFtKSB7CiAgICByZXR1cm4gX3NvY2tldC5hZGRTdHJlYW0oc3RyZWFtKTsKICB9CgogIHZvaWQgZGVzdHJveSgpIHsKICAgIF9zb2NrZXQuZGVzdHJveSgpOwogIH0KCiAgRnV0dXJlIGZsdXNoKCkgPT4gX3NvY2tldC5mbHVzaCgpOwoKICBGdXR1cmUgY2xvc2UoKSA9PiBfc29ja2V0LmNsb3NlKCk7CgogIEZ1dHVyZSBnZXQgZG9uZSA9PiBfc29ja2V0LmRvbmU7CgogIGludCBnZXQgcG9ydCA9PiBfc29ja2V0LnBvcnQ7CgogIEludGVybmV0QWRkcmVzcyBnZXQgYWRkcmVzcyA9PiBfc29ja2V0LmFkZHJlc3M7CgogIEludGVybmV0QWRkcmVzcyBnZXQgcmVtb3RlQWRkcmVzcyA9PiBfc29ja2V0LnJlbW90ZUFkZHJlc3M7CgogIGludCBnZXQgcmVtb3RlUG9ydCA9PiBfc29ja2V0LnJlbW90ZVBvcnQ7CgogIGJvb2wgc2V0T3B0aW9uKFNvY2tldE9wdGlvbiBvcHRpb24sIGJvb2wgZW5hYmxlZCkgewogICAgcmV0dXJuIF9zb2NrZXQuc2V0T3B0aW9uKG9wdGlvbiwgZW5hYmxlZCk7CiAgfQoKICBVaW50OExpc3QgZ2V0UmF3T3B0aW9uKFJhd1NvY2tldE9wdGlvbiBvcHRpb24pIHsKICAgIHJldHVybiBfc29ja2V0LmdldFJhd09wdGlvbihvcHRpb24pOwogIH0KCiAgdm9pZCBzZXRSYXdPcHRpb24oUmF3U29ja2V0T3B0aW9uIG9wdGlvbikgewogICAgX3NvY2tldC5zZXRSYXdPcHRpb24ob3B0aW9uKTsKICB9CgogIE1hcCBfdG9KU09OKGJvb2wgcmVmKSB7CiAgICByZXR1cm4gKF9zb2NrZXQgYXMgZHluYW1pYykuX3RvSlNPTihyZWYpOwogIH0KfQoKY2xhc3MgX0F1dGhlbnRpY2F0aW9uU2NoZW1lIHsKICBmaW5hbCBpbnQgX3NjaGVtZTsKCiAgc3RhdGljIGNvbnN0IFVOS05PV04gPSBjb25zdCBfQXV0aGVudGljYXRpb25TY2hlbWUoLTEpOwogIHN0YXRpYyBjb25zdCBCQVNJQyA9IGNvbnN0IF9BdXRoZW50aWNhdGlvblNjaGVtZSgwKTsKICBzdGF0aWMgY29uc3QgRElHRVNUID0gY29uc3QgX0F1dGhlbnRpY2F0aW9uU2NoZW1lKDEpOwoKICBjb25zdCBfQXV0aGVudGljYXRpb25TY2hlbWUodGhpcy5fc2NoZW1lKTsKCiAgZmFjdG9yeSBfQXV0aGVudGljYXRpb25TY2hlbWUuZnJvbVN0cmluZyhTdHJpbmcgc2NoZW1lKSB7CiAgICBpZiAoc2NoZW1lLnRvTG93ZXJDYXNlKCkgPT0gImJhc2ljIikgcmV0dXJuIEJBU0lDOwogICAgaWYgKHNjaGVtZS50b0xvd2VyQ2FzZSgpID09ICJkaWdlc3QiKSByZXR1cm4gRElHRVNUOwogICAgcmV0dXJuIFVOS05PV047CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBpZiAodGhpcyA9PSBCQVNJQykgcmV0dXJuICJCYXNpYyI7CiAgICBpZiAodGhpcyA9PSBESUdFU1QpIHJldHVybiAiRGlnZXN0IjsKICAgIHJldHVybiAiVW5rbm93biI7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBfQ3JlZGVudGlhbHMgewogIF9IdHRwQ2xpZW50Q3JlZGVudGlhbHMgY3JlZGVudGlhbHM7CiAgU3RyaW5nIHJlYWxtOwogIGJvb2wgdXNlZCA9IGZhbHNlOwoKICAvLyBEaWdlc3Qgc3BlY2lmaWMgZmllbGRzLgogIFN0cmluZyBoYTE7CiAgU3RyaW5nIG5vbmNlOwogIFN0cmluZyBhbGdvcml0aG07CiAgU3RyaW5nIHFvcDsKICBpbnQgbm9uY2VDb3VudDsKCiAgX0NyZWRlbnRpYWxzKHRoaXMuY3JlZGVudGlhbHMsIHRoaXMucmVhbG0pIHsKICAgIGlmIChjcmVkZW50aWFscy5zY2hlbWUgPT0gX0F1dGhlbnRpY2F0aW9uU2NoZW1lLkRJR0VTVCkgewogICAgICAvLyBDYWxjdWxhdGUgdGhlIEgoQTEpIHZhbHVlIG9uY2UuIFRoZXJlIGlzIG5vIG1lbnRpb25pbmcgb2YKICAgICAgLy8gdXNlcm5hbWUvcGFzc3dvcmQgZW5jb2RpbmcgaW4gUkZDIDI2MTcuIEhvd2V2ZXIgdGhlcmUgaXMgYW4KICAgICAgLy8gb3BlbiBkcmFmdCBmb3IgYWRkaW5nIGFuIGFkZGl0aW9uYWwgYWNjZXB0LWNoYXJzZXQgcGFyYW1ldGVyIHRvCiAgICAgIC8vIHRoZSBXV1ctQXV0aGVudGljYXRlIGFuZCBQcm94eS1BdXRoZW50aWNhdGUgaGVhZGVycywgc2VlCiAgICAgIC8vIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LXJlc2Noa2UtYmFzaWNhdXRoLWVuYy0wNi4gRm9yCiAgICAgIC8vIG5vdyBhbHdheXMgdXNlIFVURi04IGVuY29kaW5nLgogICAgICBfSHR0cENsaWVudERpZ2VzdENyZWRlbnRpYWxzIGNyZWRzID0gY3JlZGVudGlhbHM7CiAgICAgIHZhciBoYXNoZXIgPSBuZXcgX01ENSgpCiAgICAgICAgLi5hZGQodXRmOC5lbmNvZGUoY3JlZHMudXNlcm5hbWUpKQogICAgICAgIC4uYWRkKFtfQ2hhckNvZGUuQ09MT05dKQogICAgICAgIC4uYWRkKHJlYWxtLmNvZGVVbml0cykKICAgICAgICAuLmFkZChbX0NoYXJDb2RlLkNPTE9OXSkKICAgICAgICAuLmFkZCh1dGY4LmVuY29kZShjcmVkcy5wYXNzd29yZCkpOwogICAgICBoYTEgPSBfQ3J5cHRvVXRpbHMuYnl0ZXNUb0hleChoYXNoZXIuY2xvc2UoKSk7CiAgICB9CiAgfQoKICBfQXV0aGVudGljYXRpb25TY2hlbWUgZ2V0IHNjaGVtZSA9PiBjcmVkZW50aWFscy5zY2hlbWU7CgogIHZvaWQgYXV0aG9yaXplKEh0dHBDbGllbnRSZXF1ZXN0IHJlcXVlc3QpOwp9CgpjbGFzcyBfU2l0ZUNyZWRlbnRpYWxzIGV4dGVuZHMgX0NyZWRlbnRpYWxzIHsKICBVcmkgdXJpOwoKICBfU2l0ZUNyZWRlbnRpYWxzKHRoaXMudXJpLCByZWFsbSwgX0h0dHBDbGllbnRDcmVkZW50aWFscyBjcmVkcykKICAgICAgOiBzdXBlcihjcmVkcywgcmVhbG0pOwoKICBib29sIGFwcGxpZXMoVXJpIHVyaSwgX0F1dGhlbnRpY2F0aW9uU2NoZW1lIHNjaGVtZSkgewogICAgaWYgKHNjaGVtZSAhPSBudWxsICYmIGNyZWRlbnRpYWxzLnNjaGVtZSAhPSBzY2hlbWUpIHJldHVybiBmYWxzZTsKICAgIGlmICh1cmkuaG9zdCAhPSB0aGlzLnVyaS5ob3N0KSByZXR1cm4gZmFsc2U7CiAgICBpbnQgdGhpc1BvcnQgPQogICAgICAgIHRoaXMudXJpLnBvcnQgPT0gMCA/IEh0dHBDbGllbnQuZGVmYXVsdEh0dHBQb3J0IDogdGhpcy51cmkucG9ydDsKICAgIGludCBvdGhlclBvcnQgPSB1cmkucG9ydCA9PSAwID8gSHR0cENsaWVudC5kZWZhdWx0SHR0cFBvcnQgOiB1cmkucG9ydDsKICAgIGlmIChvdGhlclBvcnQgIT0gdGhpc1BvcnQpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB1cmkucGF0aC5zdGFydHNXaXRoKHRoaXMudXJpLnBhdGgpOwogIH0KCiAgdm9pZCBhdXRob3JpemUoSHR0cENsaWVudFJlcXVlc3QgcmVxdWVzdCkgewogICAgLy8gRGlnZXN0IGNyZWRlbnRpYWxzIGNhbm5vdCBiZSB1c2VkIHdpdGhvdXQgYSBub25jZSBmcm9tIHRoZQogICAgLy8gc2VydmVyLgogICAgaWYgKGNyZWRlbnRpYWxzLnNjaGVtZSA9PSBfQXV0aGVudGljYXRpb25TY2hlbWUuRElHRVNUICYmIG5vbmNlID09IG51bGwpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY3JlZGVudGlhbHMuYXV0aG9yaXplKHRoaXMsIHJlcXVlc3QpOwogICAgdXNlZCA9IHRydWU7CiAgfQp9CgpjbGFzcyBfUHJveHlDcmVkZW50aWFscyBleHRlbmRzIF9DcmVkZW50aWFscyB7CiAgU3RyaW5nIGhvc3Q7CiAgaW50IHBvcnQ7CgogIF9Qcm94eUNyZWRlbnRpYWxzKHRoaXMuaG9zdCwgdGhpcy5wb3J0LCByZWFsbSwgX0h0dHBDbGllbnRDcmVkZW50aWFscyBjcmVkcykKICAgICAgOiBzdXBlcihjcmVkcywgcmVhbG0pOwoKICBib29sIGFwcGxpZXMoX1Byb3h5IHByb3h5LCBfQXV0aGVudGljYXRpb25TY2hlbWUgc2NoZW1lKSB7CiAgICBpZiAoc2NoZW1lICE9IG51bGwgJiYgY3JlZGVudGlhbHMuc2NoZW1lICE9IHNjaGVtZSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHByb3h5Lmhvc3QgPT0gaG9zdCAmJiBwcm94eS5wb3J0ID09IHBvcnQ7CiAgfQoKICB2b2lkIGF1dGhvcml6ZShIdHRwQ2xpZW50UmVxdWVzdCByZXF1ZXN0KSB7CiAgICAvLyBEaWdlc3QgY3JlZGVudGlhbHMgY2Fubm90IGJlIHVzZWQgd2l0aG91dCBhIG5vbmNlIGZyb20gdGhlCiAgICAvLyBzZXJ2ZXIuCiAgICBpZiAoY3JlZGVudGlhbHMuc2NoZW1lID09IF9BdXRoZW50aWNhdGlvblNjaGVtZS5ESUdFU1QgJiYgbm9uY2UgPT0gbnVsbCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjcmVkZW50aWFscy5hdXRob3JpemVQcm94eSh0aGlzLCByZXF1ZXN0KTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIF9IdHRwQ2xpZW50Q3JlZGVudGlhbHMgaW1wbGVtZW50cyBIdHRwQ2xpZW50Q3JlZGVudGlhbHMgewogIF9BdXRoZW50aWNhdGlvblNjaGVtZSBnZXQgc2NoZW1lOwogIHZvaWQgYXV0aG9yaXplKF9DcmVkZW50aWFscyBjcmVkZW50aWFscywgSHR0cENsaWVudFJlcXVlc3QgcmVxdWVzdCk7CiAgdm9pZCBhdXRob3JpemVQcm94eShfUHJveHlDcmVkZW50aWFscyBjcmVkZW50aWFscywgSHR0cENsaWVudFJlcXVlc3QgcmVxdWVzdCk7Cn0KCmNsYXNzIF9IdHRwQ2xpZW50QmFzaWNDcmVkZW50aWFscyBleHRlbmRzIF9IdHRwQ2xpZW50Q3JlZGVudGlhbHMKICAgIGltcGxlbWVudHMgSHR0cENsaWVudEJhc2ljQ3JlZGVudGlhbHMgewogIFN0cmluZyB1c2VybmFtZTsKICBTdHJpbmcgcGFzc3dvcmQ7CgogIF9IdHRwQ2xpZW50QmFzaWNDcmVkZW50aWFscyh0aGlzLnVzZXJuYW1lLCB0aGlzLnBhc3N3b3JkKTsKCiAgX0F1dGhlbnRpY2F0aW9uU2NoZW1lIGdldCBzY2hlbWUgPT4gX0F1dGhlbnRpY2F0aW9uU2NoZW1lLkJBU0lDOwoKICBTdHJpbmcgYXV0aG9yaXphdGlvbigpIHsKICAgIC8vIFRoZXJlIGlzIG5vIG1lbnRpb25pbmcgb2YgdXNlcm5hbWUvcGFzc3dvcmQgZW5jb2RpbmcgaW4gUkZDCiAgICAvLyAyNjE3LiBIb3dldmVyIHRoZXJlIGlzIGFuIG9wZW4gZHJhZnQgZm9yIGFkZGluZyBhbiBhZGRpdGlvbmFsCiAgICAvLyBhY2NlcHQtY2hhcnNldCBwYXJhbWV0ZXIgdG8gdGhlIFdXVy1BdXRoZW50aWNhdGUgYW5kCiAgICAvLyBQcm94eS1BdXRoZW50aWNhdGUgaGVhZGVycywgc2VlCiAgICAvLyBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1yZXNjaGtlLWJhc2ljYXV0aC1lbmMtMDYuIEZvcgogICAgLy8gbm93IGFsd2F5cyB1c2UgVVRGLTggZW5jb2RpbmcuCiAgICBTdHJpbmcgYXV0aCA9CiAgICAgICAgX0NyeXB0b1V0aWxzLmJ5dGVzVG9CYXNlNjQodXRmOC5lbmNvZGUoIiR1c2VybmFtZTokcGFzc3dvcmQiKSk7CiAgICByZXR1cm4gIkJhc2ljICRhdXRoIjsKICB9CgogIHZvaWQgYXV0aG9yaXplKF9DcmVkZW50aWFscyBfLCBIdHRwQ2xpZW50UmVxdWVzdCByZXF1ZXN0KSB7CiAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KEh0dHBIZWFkZXJzLmF1dGhvcml6YXRpb25IZWFkZXIsIGF1dGhvcml6YXRpb24oKSk7CiAgfQoKICB2b2lkIGF1dGhvcml6ZVByb3h5KF9Qcm94eUNyZWRlbnRpYWxzIF8sIEh0dHBDbGllbnRSZXF1ZXN0IHJlcXVlc3QpIHsKICAgIHJlcXVlc3QuaGVhZGVycy5zZXQoSHR0cEhlYWRlcnMucHJveHlBdXRob3JpemF0aW9uSGVhZGVyLCBhdXRob3JpemF0aW9uKCkpOwogIH0KfQoKY2xhc3MgX0h0dHBDbGllbnREaWdlc3RDcmVkZW50aWFscyBleHRlbmRzIF9IdHRwQ2xpZW50Q3JlZGVudGlhbHMKICAgIGltcGxlbWVudHMgSHR0cENsaWVudERpZ2VzdENyZWRlbnRpYWxzIHsKICBTdHJpbmcgdXNlcm5hbWU7CiAgU3RyaW5nIHBhc3N3b3JkOwoKICBfSHR0cENsaWVudERpZ2VzdENyZWRlbnRpYWxzKHRoaXMudXNlcm5hbWUsIHRoaXMucGFzc3dvcmQpOwoKICBfQXV0aGVudGljYXRpb25TY2hlbWUgZ2V0IHNjaGVtZSA9PiBfQXV0aGVudGljYXRpb25TY2hlbWUuRElHRVNUOwoKICBTdHJpbmcgYXV0aG9yaXphdGlvbihfQ3JlZGVudGlhbHMgY3JlZGVudGlhbHMsIF9IdHRwQ2xpZW50UmVxdWVzdCByZXF1ZXN0KSB7CiAgICBTdHJpbmcgcmVxdWVzdFVyaSA9IHJlcXVlc3QuX3JlcXVlc3RVcmkoKTsKICAgIF9NRDUgaGFzaGVyID0gbmV3IF9NRDUoKQogICAgICAuLmFkZChyZXF1ZXN0Lm1ldGhvZC5jb2RlVW5pdHMpCiAgICAgIC4uYWRkKFtfQ2hhckNvZGUuQ09MT05dKQogICAgICAuLmFkZChyZXF1ZXN0VXJpLmNvZGVVbml0cyk7CiAgICB2YXIgaGEyID0gX0NyeXB0b1V0aWxzLmJ5dGVzVG9IZXgoaGFzaGVyLmNsb3NlKCkpOwoKICAgIFN0cmluZyBxb3A7CiAgICBTdHJpbmcgY25vbmNlOwogICAgU3RyaW5nIG5jOwogICAgdmFyIHg7CiAgICBoYXNoZXIgPSBuZXcgX01ENSgpLi5hZGQoY3JlZGVudGlhbHMuaGExLmNvZGVVbml0cykuLmFkZChbX0NoYXJDb2RlLkNPTE9OXSk7CiAgICBpZiAoY3JlZGVudGlhbHMucW9wID09ICJhdXRoIikgewogICAgICBxb3AgPSBjcmVkZW50aWFscy5xb3A7CiAgICAgIGNub25jZSA9IF9DcnlwdG9VdGlscy5ieXRlc1RvSGV4KF9DcnlwdG9VdGlscy5nZXRSYW5kb21CeXRlcyg0KSk7CiAgICAgICsrY3JlZGVudGlhbHMubm9uY2VDb3VudDsKICAgICAgbmMgPSBjcmVkZW50aWFscy5ub25jZUNvdW50LnRvUmFkaXhTdHJpbmcoMTYpOwogICAgICBuYyA9ICIwMDAwMDAwMCIuc3Vic3RyaW5nKDAsIDggLSBuYy5sZW5ndGggKyAxKSArIG5jOwogICAgICBoYXNoZXIKICAgICAgICAuLmFkZChjcmVkZW50aWFscy5ub25jZS5jb2RlVW5pdHMpCiAgICAgICAgLi5hZGQoW19DaGFyQ29kZS5DT0xPTl0pCiAgICAgICAgLi5hZGQobmMuY29kZVVuaXRzKQogICAgICAgIC4uYWRkKFtfQ2hhckNvZGUuQ09MT05dKQogICAgICAgIC4uYWRkKGNub25jZS5jb2RlVW5pdHMpCiAgICAgICAgLi5hZGQoW19DaGFyQ29kZS5DT0xPTl0pCiAgICAgICAgLi5hZGQoY3JlZGVudGlhbHMucW9wLmNvZGVVbml0cykKICAgICAgICAuLmFkZChbX0NoYXJDb2RlLkNPTE9OXSkKICAgICAgICAuLmFkZChoYTIuY29kZVVuaXRzKTsKICAgIH0gZWxzZSB7CiAgICAgIGhhc2hlcgogICAgICAgIC4uYWRkKGNyZWRlbnRpYWxzLm5vbmNlLmNvZGVVbml0cykKICAgICAgICAuLmFkZChbX0NoYXJDb2RlLkNPTE9OXSkKICAgICAgICAuLmFkZChoYTIuY29kZVVuaXRzKTsKICAgIH0KICAgIHZhciByZXNwb25zZSA9IF9DcnlwdG9VdGlscy5ieXRlc1RvSGV4KGhhc2hlci5jbG9zZSgpKTsKCiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpCiAgICAgIC4ud3JpdGUoJ0RpZ2VzdCAnKQogICAgICAuLndyaXRlKCd1c2VybmFtZT0iJHVzZXJuYW1lIicpCiAgICAgIC4ud3JpdGUoJywgcmVhbG09IiR7Y3JlZGVudGlhbHMucmVhbG19IicpCiAgICAgIC4ud3JpdGUoJywgbm9uY2U9IiR7Y3JlZGVudGlhbHMubm9uY2V9IicpCiAgICAgIC4ud3JpdGUoJywgdXJpPSIkcmVxdWVzdFVyaSInKQogICAgICAuLndyaXRlKCcsIGFsZ29yaXRobT0iJHtjcmVkZW50aWFscy5hbGdvcml0aG19IicpOwogICAgaWYgKHFvcCA9PSAiYXV0aCIpIHsKICAgICAgYnVmZmVyCiAgICAgICAgLi53cml0ZSgnLCBxb3A9IiRxb3AiJykKICAgICAgICAuLndyaXRlKCcsIGNub25jZT0iJGNub25jZSInKQogICAgICAgIC4ud3JpdGUoJywgbmM9IiRuYyInKTsKICAgIH0KICAgIGJ1ZmZlci53cml0ZSgnLCByZXNwb25zZT0iJHJlc3BvbnNlIicpOwogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgdm9pZCBhdXRob3JpemUoX0NyZWRlbnRpYWxzIGNyZWRlbnRpYWxzLCBIdHRwQ2xpZW50UmVxdWVzdCByZXF1ZXN0KSB7CiAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KAogICAgICAgIEh0dHBIZWFkZXJzLmF1dGhvcml6YXRpb25IZWFkZXIsIGF1dGhvcml6YXRpb24oY3JlZGVudGlhbHMsIHJlcXVlc3QpKTsKICB9CgogIHZvaWQgYXV0aG9yaXplUHJveHkoCiAgICAgIF9Qcm94eUNyZWRlbnRpYWxzIGNyZWRlbnRpYWxzLCBIdHRwQ2xpZW50UmVxdWVzdCByZXF1ZXN0KSB7CiAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KEh0dHBIZWFkZXJzLnByb3h5QXV0aG9yaXphdGlvbkhlYWRlciwKICAgICAgICBhdXRob3JpemF0aW9uKGNyZWRlbnRpYWxzLCByZXF1ZXN0KSk7CiAgfQp9CgpjbGFzcyBfUmVkaXJlY3RJbmZvIGltcGxlbWVudHMgUmVkaXJlY3RJbmZvIHsKICBmaW5hbCBpbnQgc3RhdHVzQ29kZTsKICBmaW5hbCBTdHJpbmcgbWV0aG9kOwogIGZpbmFsIFVyaSBsb2NhdGlvbjsKICBjb25zdCBfUmVkaXJlY3RJbmZvKHRoaXMuc3RhdHVzQ29kZSwgdGhpcy5tZXRob2QsIHRoaXMubG9jYXRpb24pOwp9CgpTdHJpbmcgX2dldEh0dHBWZXJzaW9uKCkgewogIHZhciB2ZXJzaW9uID0gUGxhdGZvcm0udmVyc2lvbjsKICAvLyBPbmx5IGluY2x1ZGUgbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gbnVtYmVycy4KICBpbnQgaW5kZXggPSB2ZXJzaW9uLmluZGV4T2YoJy4nLCB2ZXJzaW9uLmluZGV4T2YoJy4nKSArIDEpOwogIHZlcnNpb24gPSB2ZXJzaW9uLnN1YnN0cmluZygwLCBpbmRleCk7CiAgcmV0dXJuICdEYXJ0LyR2ZXJzaW9uIChkYXJ0OmlvKSc7Cn0KjF8ATk48ARQB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bm9fY29udGV4dF90YWtlb3ZlciI7CmNvbnN0IFN0cmluZyBfc2VydmVyTm9Db250ZXh0VGFrZW92ZXIgPSAic2VydmVyX25vX2NvbnRleHRfdGFrZW92ZXIiOwpjb25zdCBTdHJpbmcgX2NsaWVudE1heFdpbmRvd0JpdHMgPSAiY2xpZW50X21heF93aW5kb3dfYml0cyI7CmNvbnN0IFN0cmluZyBfc2VydmVyTWF4V2luZG93Qml0cyA9ICJzZXJ2ZXJfbWF4X3dpbmRvd19iaXRzIjsKCi8vIE1hdGNoZXMgX1dlYlNvY2tldE9wY29kZS4KY2xhc3MgX1dlYlNvY2tldE1lc3NhZ2VUeXBlIHsKICBzdGF0aWMgY29uc3QgaW50IE5PTkUgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgVEVYVCA9IDE7CiAgc3RhdGljIGNvbnN0IGludCBCSU5BUlkgPSAyOwp9CgpjbGFzcyBfV2ViU29ja2V0T3Bjb2RlIHsKICBzdGF0aWMgY29uc3QgaW50IENPTlRJTlVBVElPTiA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBURVhUID0gMTsKICBzdGF0aWMgY29uc3QgaW50IEJJTkFSWSA9IDI7CiAgc3RhdGljIGNvbnN0IGludCBSRVNFUlZFRF8zID0gMzsKICBzdGF0aWMgY29uc3QgaW50IFJFU0VSVkVEXzQgPSA0OwogIHN0YXRpYyBjb25zdCBpbnQgUkVTRVJWRURfNSA9IDU7CiAgc3RhdGljIGNvbnN0IGludCBSRVNFUlZFRF82ID0gNjsKICBzdGF0aWMgY29uc3QgaW50IFJFU0VSVkVEXzcgPSA3OwogIHN0YXRpYyBjb25zdCBpbnQgQ0xPU0UgPSA4OwogIHN0YXRpYyBjb25zdCBpbnQgUElORyA9IDk7CiAgc3RhdGljIGNvbnN0IGludCBQT05HID0gMTA7CiAgc3RhdGljIGNvbnN0IGludCBSRVNFUlZFRF9CID0gMTE7CiAgc3RhdGljIGNvbnN0IGludCBSRVNFUlZFRF9DID0gMTI7CiAgc3RhdGljIGNvbnN0IGludCBSRVNFUlZFRF9EID0gMTM7CiAgc3RhdGljIGNvbnN0IGludCBSRVNFUlZFRF9FID0gMTQ7CiAgc3RhdGljIGNvbnN0IGludCBSRVNFUlZFRF9GID0gMTU7Cn0KCmNsYXNzIF9FbmNvZGVkU3RyaW5nIHsKICBmaW5hbCBMaXN0PGludD4gYnl0ZXM7CiAgX0VuY29kZWRTdHJpbmcodGhpcy5ieXRlcyk7Cn0KCi8qKgogKiAgU3RvcmVzIHRoZSBoZWFkZXIgYW5kIGludGVnZXIgdmFsdWUgZGVyaXZlZCBmcm9tIG5lZ290aWF0aW9uIG9mCiAqICBjbGllbnRfbWF4X3dpbmRvd19iaXRzIGFuZCBzZXJ2ZXJfbWF4X3dpbmRvd19iaXRzLiBoZWFkZXJWYWx1ZSB3aWxsIGJlCiAqICBzZXQgaW4gdGhlIFdlYnNvY2tldCByZXNwb25zZSBoZWFkZXJzLgogKi8KY2xhc3MgX0NvbXByZXNzaW9uTWF4V2luZG93Qml0cyB7CiAgU3RyaW5nIGhlYWRlclZhbHVlOwogIGludCBtYXhXaW5kb3dCaXRzOwogIF9Db21wcmVzc2lvbk1heFdpbmRvd0JpdHMoW3RoaXMuaGVhZGVyVmFsdWUsIHRoaXMubWF4V2luZG93Qml0c10pOwogIFN0cmluZyB0b1N0cmluZygpID0+IGhlYWRlclZhbHVlOwp9CgovKioKICogVGhlIHdlYiBzb2NrZXQgcHJvdG9jb2wgdHJhbnNmb3JtZXIgaGFuZGxlcyB0aGUgcHJvdG9jb2wgYnl0ZSBzdHJlYW0KICogd2hpY2ggaXMgc3VwcGxpZWQgdGhyb3VnaCB0aGUgYGhhbmRsZURhdGFgLiBBcyB0aGUgcHJvdG9jb2wgaXMgcHJvY2Vzc2VkLAogKiBpdCdsbCBvdXRwdXQgZnJhbWUgZGF0YSBhcyBlaXRoZXIgYSBMaXN0PGludD4gb3IgU3RyaW5nLgogKgogKiBJbXBvcnRhbnQgaW5mb3JtYXRpb24gYWJvdXQgdXNhZ2U6IEJlIHN1cmUgeW91IHVzZSBjYW5jZWxPbkVycm9yLCBzbyB0aGUKICogc29ja2V0IHdpbGwgYmUgY2xvc2VkIHdoZW4gdGhlIHByb2Nlc3NvciBlbmNvdW50ZXIgYW4gZXJyb3IuIE5vdCB1c2luZyBpdAogKiB3aWxsIGxlYWQgdG8gdW5kZWZpbmVkIGJlaGF2aW91ci4KICovCmNsYXNzIF9XZWJTb2NrZXRQcm90b2NvbFRyYW5zZm9ybWVyIGV4dGVuZHMgU3RyZWFtVHJhbnNmb3JtZXJCYXNlPExpc3Q8aW50PiwKICAgICAgICBkeW5hbWljIC8qTGlzdDxpbnQ+fF9XZWJTb2NrZXRQaW5nfF9XZWJTb2NrZXRQb25nKi8gPgogICAgaW1wbGVtZW50cyBFdmVudFNpbms8TGlzdDxpbnQ+PiB7CiAgc3RhdGljIGNvbnN0IGludCBTVEFSVCA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBMRU5fRklSU1QgPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgTEVOX1JFU1QgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgTUFTSyA9IDM7CiAgc3RhdGljIGNvbnN0IGludCBQQVlMT0FEID0gNDsKICBzdGF0aWMgY29uc3QgaW50IENMT1NFRCA9IDU7CiAgc3RhdGljIGNvbnN0IGludCBGQUlMVVJFID0gNjsKICBzdGF0aWMgY29uc3QgaW50IEZJTiA9IDB4ODA7CiAgc3RhdGljIGNvbnN0IGludCBSU1YxID0gMHg0MDsKICBzdGF0aWMgY29uc3QgaW50IFJTVjIgPSAweDIwOwogIHN0YXRpYyBjb25zdCBpbnQgUlNWMyA9IDB4MTA7CiAgc3RhdGljIGNvbnN0IGludCBPUENPREUgPSAweEY7CgogIGludCBfc3RhdGUgPSBTVEFSVDsKICBib29sIF9maW4gPSBmYWxzZTsKICBib29sIF9jb21wcmVzc2VkID0gZmFsc2U7CiAgaW50IF9vcGNvZGUgPSAtMTsKICBpbnQgX2xlbiA9IC0xOwogIGJvb2wgX21hc2tlZCA9IGZhbHNlOwogIGludCBfcmVtYWluaW5nTGVuQnl0ZXMgPSAtMTsKICBpbnQgX3JlbWFpbmluZ01hc2tpbmdLZXlCeXRlcyA9IDQ7CiAgaW50IF9yZW1haW5pbmdQYXlsb2FkQnl0ZXMgPSAtMTsKICBpbnQgX3VubWFza2luZ0luZGV4ID0gMDsKICBpbnQgX2N1cnJlbnRNZXNzYWdlVHlwZSA9IF9XZWJTb2NrZXRNZXNzYWdlVHlwZS5OT05FOwogIGludCBjbG9zZUNvZGUgPSBXZWJTb2NrZXRTdGF0dXMuTk9fU1RBVFVTX1JFQ0VJVkVEOwogIFN0cmluZyBjbG9zZVJlYXNvbiA9ICIiOwoKICBFdmVudFNpbms8ZHluYW1pYyAvKkxpc3Q8aW50PnxfV2ViU29ja2V0UGluZ3xfV2ViU29ja2V0UG9uZyovID4gX2V2ZW50U2luazsKCiAgZmluYWwgYm9vbCBfc2VydmVyU2lkZTsKICBmaW5hbCBMaXN0IF9tYXNraW5nQnl0ZXMgPSBuZXcgTGlzdCg0KTsKICBmaW5hbCBCeXRlc0J1aWxkZXIgX3BheWxvYWQgPSBuZXcgQnl0ZXNCdWlsZGVyKGNvcHk6IGZhbHNlKTsKCiAgX1dlYlNvY2tldFBlck1lc3NhZ2VEZWZsYXRlIF9kZWZsYXRlOwogIF9XZWJTb2NrZXRQcm90b2NvbFRyYW5zZm9ybWVyKFt0aGlzLl9zZXJ2ZXJTaWRlID0gZmFsc2UsIHRoaXMuX2RlZmxhdGVdKTsKCiAgU3RyZWFtPGR5bmFtaWMgLypMaXN0PGludD58X1dlYlNvY2tldFBpbmd8X1dlYlNvY2tldFBvbmcqLyA+IGJpbmQoCiAgICAgIFN0cmVhbTxMaXN0PGludD4+IHN0cmVhbSkgewogICAgcmV0dXJuIG5ldyBTdHJlYW0uZXZlbnRUcmFuc2Zvcm1lZChzdHJlYW0sIChFdmVudFNpbmsgZXZlbnRTaW5rKSB7CiAgICAgIGlmIChfZXZlbnRTaW5rICE9IG51bGwpIHsKICAgICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiV2ViU29ja2V0IHRyYW5zZm9ybWVyIGFscmVhZHkgdXNlZC4iKTsKICAgICAgfQogICAgICBfZXZlbnRTaW5rID0gZXZlbnRTaW5rOwogICAgICByZXR1cm4gdGhpczsKICAgIH0pOwogIH0KCiAgdm9pZCBhZGRFcnJvcihPYmplY3QgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICBfZXZlbnRTaW5rLmFkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBfZXZlbnRTaW5rLmNsb3NlKCk7CiAgfQoKICAvKioKICAgKiBQcm9jZXNzIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgdW5kZXJseWluZyBjb21tdW5pY2F0aW9uIGNoYW5uZWwuCiAgICovCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGJ5dGVzKSB7CiAgICB2YXIgYnVmZmVyID0gYnl0ZXMgaXMgVWludDhMaXN0ID8gYnl0ZXMgOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KGJ5dGVzKTsKICAgIGludCBpbmRleCA9IDA7CiAgICBpbnQgbGFzdEluZGV4ID0gYnVmZmVyLmxlbmd0aDsKICAgIGlmIChfc3RhdGUgPT0gQ0xPU0VEKSB7CiAgICAgIHRocm93IG5ldyBXZWJTb2NrZXRFeGNlcHRpb24oIkRhdGEgb24gY2xvc2VkIGNvbm5lY3Rpb24iKTsKICAgIH0KICAgIGlmIChfc3RhdGUgPT0gRkFJTFVSRSkgewogICAgICB0aHJvdyBuZXcgV2ViU29ja2V0RXhjZXB0aW9uKCJEYXRhIG9uIGZhaWxlZCBjb25uZWN0aW9uIik7CiAgICB9CiAgICB3aGlsZSAoKGluZGV4IDwgbGFzdEluZGV4KSAmJiBfc3RhdGUgIT0gQ0xPU0VEICYmIF9zdGF0ZSAhPSBGQUlMVVJFKSB7CiAgICAgIGludCBieXRlID0gYnVmZmVyW2luZGV4XTsKICAgICAgaWYgKF9zdGF0ZSA8PSBMRU5fUkVTVCkgewogICAgICAgIGlmIChfc3RhdGUgPT0gU1RBUlQpIHsKICAgICAgICAgIF9maW4gPSAoYnl0ZSAmIEZJTikgIT0gMDsKCiAgICAgICAgICBpZiAoKGJ5dGUgJiAoUlNWMiB8IFJTVjMpKSAhPSAwKSB7CiAgICAgICAgICAgIC8vIFRoZSBSU1YyLCBSU1YzIGJpdHMgbXVzdCBib3RoIGJlIHplcm8uCiAgICAgICAgICAgIHRocm93IG5ldyBXZWJTb2NrZXRFeGNlcHRpb24oIlByb3RvY29sIGVycm9yIik7CiAgICAgICAgICB9CgogICAgICAgICAgX29wY29kZSA9IChieXRlICYgT1BDT0RFKTsKCiAgICAgICAgICBpZiAoX29wY29kZSAhPSBfV2ViU29ja2V0T3Bjb2RlLkNPTlRJTlVBVElPTikgewogICAgICAgICAgICBpZiAoKGJ5dGUgJiBSU1YxKSAhPSAwKSB7CiAgICAgICAgICAgICAgX2NvbXByZXNzZWQgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIF9jb21wcmVzc2VkID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoX29wY29kZSA8PSBfV2ViU29ja2V0T3Bjb2RlLkJJTkFSWSkgewogICAgICAgICAgICBpZiAoX29wY29kZSA9PSBfV2ViU29ja2V0T3Bjb2RlLkNPTlRJTlVBVElPTikgewogICAgICAgICAgICAgIGlmIChfY3VycmVudE1lc3NhZ2VUeXBlID09IF9XZWJTb2NrZXRNZXNzYWdlVHlwZS5OT05FKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU29ja2V0RXhjZXB0aW9uKCJQcm90b2NvbCBlcnJvciIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBhc3NlcnQoX29wY29kZSA9PSBfV2ViU29ja2V0T3Bjb2RlLlRFWFQgfHwKICAgICAgICAgICAgICAgICAgX29wY29kZSA9PSBfV2ViU29ja2V0T3Bjb2RlLkJJTkFSWSk7CiAgICAgICAgICAgICAgaWYgKF9jdXJyZW50TWVzc2FnZVR5cGUgIT0gX1dlYlNvY2tldE1lc3NhZ2VUeXBlLk5PTkUpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTb2NrZXRFeGNlcHRpb24oIlByb3RvY29sIGVycm9yIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF9jdXJyZW50TWVzc2FnZVR5cGUgPSBfb3Bjb2RlOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKF9vcGNvZGUgPj0gX1dlYlNvY2tldE9wY29kZS5DTE9TRSAmJgogICAgICAgICAgICAgIF9vcGNvZGUgPD0gX1dlYlNvY2tldE9wY29kZS5QT05HKSB7CiAgICAgICAgICAgIC8vIENvbnRyb2wgZnJhbWVzIGNhbm5vdCBiZSBmcmFnbWVudGVkLgogICAgICAgICAgICBpZiAoIV9maW4pIHRocm93IG5ldyBXZWJTb2NrZXRFeGNlcHRpb24oIlByb3RvY29sIGVycm9yIik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgV2ViU29ja2V0RXhjZXB0aW9uKCJQcm90b2NvbCBlcnJvciIpOwogICAgICAgICAgfQogICAgICAgICAgX3N0YXRlID0gTEVOX0ZJUlNUOwogICAgICAgIH0gZWxzZSBpZiAoX3N0YXRlID09IExFTl9GSVJTVCkgewogICAgICAgICAgX21hc2tlZCA9IChieXRlICYgMHg4MCkgIT0gMDsKICAgICAgICAgIF9sZW4gPSBieXRlICYgMHg3RjsKICAgICAgICAgIGlmIChfaXNDb250cm9sRnJhbWUoKSAmJiBfbGVuID4gMTI1KSB7CiAgICAgICAgICAgIHRocm93IG5ldyBXZWJTb2NrZXRFeGNlcHRpb24oIlByb3RvY29sIGVycm9yIik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoX2xlbiA9PSAxMjYpIHsKICAgICAgICAgICAgX2xlbiA9IDA7CiAgICAgICAgICAgIF9yZW1haW5pbmdMZW5CeXRlcyA9IDI7CiAgICAgICAgICAgIF9zdGF0ZSA9IExFTl9SRVNUOwogICAgICAgICAgfSBlbHNlIGlmIChfbGVuID09IDEyNykgewogICAgICAgICAgICBfbGVuID0gMDsKICAgICAgICAgICAgX3JlbWFpbmluZ0xlbkJ5dGVzID0gODsKICAgICAgICAgICAgX3N0YXRlID0gTEVOX1JFU1Q7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhc3NlcnQoX2xlbiA8IDEyNik7CiAgICAgICAgICAgIF9sZW5ndGhEb25lKCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFzc2VydChfc3RhdGUgPT0gTEVOX1JFU1QpOwogICAgICAgICAgX2xlbiA9IF9sZW4gPDwgOCB8IGJ5dGU7CiAgICAgICAgICBfcmVtYWluaW5nTGVuQnl0ZXMtLTsKICAgICAgICAgIGlmIChfcmVtYWluaW5nTGVuQnl0ZXMgPT0gMCkgewogICAgICAgICAgICBfbGVuZ3RoRG9uZSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoX3N0YXRlID09IE1BU0spIHsKICAgICAgICAgIF9tYXNraW5nQnl0ZXNbNCAtIF9yZW1haW5pbmdNYXNraW5nS2V5Qnl0ZXMtLV0gPSBieXRlOwogICAgICAgICAgaWYgKF9yZW1haW5pbmdNYXNraW5nS2V5Qnl0ZXMgPT0gMCkgewogICAgICAgICAgICBfbWFza0RvbmUoKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXNzZXJ0KF9zdGF0ZSA9PSBQQVlMT0FEKTsKICAgICAgICAgIC8vIFRoZSBwYXlsb2FkIGlzIG5vdCBoYW5kbGVkIG9uZSBieXRlIGF0IGEgdGltZSBidXQgaW4gYmxvY2tzLgogICAgICAgICAgaW50IHBheWxvYWRMZW5ndGggPSBtaW4obGFzdEluZGV4IC0gaW5kZXgsIF9yZW1haW5pbmdQYXlsb2FkQnl0ZXMpOwogICAgICAgICAgX3JlbWFpbmluZ1BheWxvYWRCeXRlcyAtPSBwYXlsb2FkTGVuZ3RoOwogICAgICAgICAgLy8gVW5tYXNrIHBheWxvYWQgaWYgbWFza2VkLgogICAgICAgICAgaWYgKF9tYXNrZWQpIHsKICAgICAgICAgICAgX3VubWFzayhpbmRleCwgcGF5bG9hZExlbmd0aCwgYnVmZmVyKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIENvbnRyb2wgZnJhbWUgYW5kIGRhdGEgZnJhbWUgc2hhcmUgX3BheWxvYWRzLgogICAgICAgICAgX3BheWxvYWQuYWRkKG5ldyBVaW50OExpc3QudmlldyhidWZmZXIuYnVmZmVyLCBpbmRleCwgcGF5bG9hZExlbmd0aCkpOwogICAgICAgICAgaW5kZXggKz0gcGF5bG9hZExlbmd0aDsKICAgICAgICAgIGlmIChfaXNDb250cm9sRnJhbWUoKSkgewogICAgICAgICAgICBpZiAoX3JlbWFpbmluZ1BheWxvYWRCeXRlcyA9PSAwKSBfY29udHJvbEZyYW1lRW5kKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoX2N1cnJlbnRNZXNzYWdlVHlwZSAhPSBfV2ViU29ja2V0TWVzc2FnZVR5cGUuVEVYVCAmJgogICAgICAgICAgICAgICAgX2N1cnJlbnRNZXNzYWdlVHlwZSAhPSBfV2ViU29ja2V0TWVzc2FnZVR5cGUuQklOQVJZKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNvY2tldEV4Y2VwdGlvbigiUHJvdG9jb2wgZXJyb3IiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoX3JlbWFpbmluZ1BheWxvYWRCeXRlcyA9PSAwKSBfbWVzc2FnZUZyYW1lRW5kKCk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gSGFjayAtIGFzIHdlIGFsd2F5cyBkbyBpbmRleCsrIGJlbG93LgogICAgICAgICAgaW5kZXgtLTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIE1vdmUgdG8gdGhlIG5leHQgYnl0ZS4KICAgICAgaW5kZXgrKzsKICAgIH0KICB9CgogIHZvaWQgX3VubWFzayhpbnQgaW5kZXgsIGludCBsZW5ndGgsIFVpbnQ4TGlzdCBidWZmZXIpIHsKICAgIGNvbnN0IGludCBCTE9DS19TSVpFID0gMTY7CiAgICAvLyBTa2lwIEludDMyeDQtdmVyc2lvbiBpZiBtZXNzYWdlIGlzIHNtYWxsLgogICAgaWYgKGxlbmd0aCA+PSBCTE9DS19TSVpFKSB7CiAgICAgIC8vIFN0YXJ0IGJ5IGFsaWduaW5nIHRvIDE2IGJ5dGVzLgogICAgICBmaW5hbCBpbnQgc3RhcnRPZmZzZXQgPSBCTE9DS19TSVpFIC0gKGluZGV4ICYgMTUpOwogICAgICBmaW5hbCBpbnQgZW5kID0gaW5kZXggKyBzdGFydE9mZnNldDsKICAgICAgZm9yIChpbnQgaSA9IGluZGV4OyBpIDwgZW5kOyBpKyspIHsKICAgICAgICBidWZmZXJbaV0gXj0gX21hc2tpbmdCeXRlc1tfdW5tYXNraW5nSW5kZXgrKyAmIDNdOwogICAgICB9CiAgICAgIGluZGV4ICs9IHN0YXJ0T2Zmc2V0OwogICAgICBsZW5ndGggLT0gc3RhcnRPZmZzZXQ7CiAgICAgIGZpbmFsIGludCBibG9ja0NvdW50ID0gbGVuZ3RoIH4vIEJMT0NLX1NJWkU7CiAgICAgIGlmIChibG9ja0NvdW50ID4gMCkgewogICAgICAgIC8vIENyZWF0ZSBtYXNrIGJsb2NrLgogICAgICAgIGludCBtYXNrID0gMDsKICAgICAgICBmb3IgKGludCBpID0gMzsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgIG1hc2sgPSAobWFzayA8PCA4KSB8IF9tYXNraW5nQnl0ZXNbKF91bm1hc2tpbmdJbmRleCArIGkpICYgM107CiAgICAgICAgfQogICAgICAgIEludDMyeDQgYmxvY2tNYXNrID0gbmV3IEludDMyeDQobWFzaywgbWFzaywgbWFzaywgbWFzayk7CiAgICAgICAgSW50MzJ4NExpc3QgYmxvY2tCdWZmZXIgPQogICAgICAgICAgICBuZXcgSW50MzJ4NExpc3QudmlldyhidWZmZXIuYnVmZmVyLCBpbmRleCwgYmxvY2tDb3VudCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBibG9ja0J1ZmZlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgYmxvY2tCdWZmZXJbaV0gXj0gYmxvY2tNYXNrOwogICAgICAgIH0KICAgICAgICBmaW5hbCBpbnQgYnl0ZXMgPSBibG9ja0NvdW50ICogQkxPQ0tfU0laRTsKICAgICAgICBpbmRleCArPSBieXRlczsKICAgICAgICBsZW5ndGggLT0gYnl0ZXM7CiAgICAgIH0KICAgIH0KICAgIC8vIEhhbmRsZSBlbmQuCiAgICBmaW5hbCBpbnQgZW5kID0gaW5kZXggKyBsZW5ndGg7CiAgICBmb3IgKGludCBpID0gaW5kZXg7IGkgPCBlbmQ7IGkrKykgewogICAgICBidWZmZXJbaV0gXj0gX21hc2tpbmdCeXRlc1tfdW5tYXNraW5nSW5kZXgrKyAmIDNdOwogICAgfQogIH0KCiAgdm9pZCBfbGVuZ3RoRG9uZSgpIHsKICAgIGlmIChfbWFza2VkKSB7CiAgICAgIGlmICghX3NlcnZlclNpZGUpIHsKICAgICAgICB0aHJvdyBuZXcgV2ViU29ja2V0RXhjZXB0aW9uKCJSZWNlaXZlZCBtYXNrZWQgZnJhbWUgZnJvbSBzZXJ2ZXIiKTsKICAgICAgfQogICAgICBfc3RhdGUgPSBNQVNLOwogICAgfSBlbHNlIHsKICAgICAgaWYgKF9zZXJ2ZXJTaWRlKSB7CiAgICAgICAgdGhyb3cgbmV3IFdlYlNvY2tldEV4Y2VwdGlvbigiUmVjZWl2ZWQgdW5tYXNrZWQgZnJhbWUgZnJvbSBjbGllbnQiKTsKICAgICAgfQogICAgICBfcmVtYWluaW5nUGF5bG9hZEJ5dGVzID0gX2xlbjsKICAgICAgX3N0YXJ0UGF5bG9hZCgpOwogICAgfQogIH0KCiAgdm9pZCBfbWFza0RvbmUoKSB7CiAgICBfcmVtYWluaW5nUGF5bG9hZEJ5dGVzID0gX2xlbjsKICAgIF9zdGFydFBheWxvYWQoKTsKICB9CgogIHZvaWQgX3N0YXJ0UGF5bG9hZCgpIHsKICAgIC8vIElmIHRoZXJlIGlzIG5vIGFjdHVhbCBwYXlsb2FkIHBlcmZvcm0gcGVyZm9ybSBjYWxsYmFja3Mgd2l0aG91dAogICAgLy8gZ29pbmcgdGhyb3VnaCB0aGUgUEFZTE9BRCBzdGF0ZS4KICAgIGlmIChfcmVtYWluaW5nUGF5bG9hZEJ5dGVzID09IDApIHsKICAgICAgaWYgKF9pc0NvbnRyb2xGcmFtZSgpKSB7CiAgICAgICAgc3dpdGNoIChfb3Bjb2RlKSB7CiAgICAgICAgICBjYXNlIF9XZWJTb2NrZXRPcGNvZGUuQ0xPU0U6CiAgICAgICAgICAgIF9zdGF0ZSA9IENMT1NFRDsKICAgICAgICAgICAgX2V2ZW50U2luay5jbG9zZSgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX1dlYlNvY2tldE9wY29kZS5QSU5HOgogICAgICAgICAgICBfZXZlbnRTaW5rLmFkZChuZXcgX1dlYlNvY2tldFBpbmcoKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBfV2ViU29ja2V0T3Bjb2RlLlBPTkc6CiAgICAgICAgICAgIF9ldmVudFNpbmsuYWRkKG5ldyBfV2ViU29ja2V0UG9uZygpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIF9wcmVwYXJlRm9yTmV4dEZyYW1lKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX21lc3NhZ2VGcmFtZUVuZCgpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBfc3RhdGUgPSBQQVlMT0FEOwogICAgfQogIH0KCiAgdm9pZCBfbWVzc2FnZUZyYW1lRW5kKCkgewogICAgaWYgKF9maW4pIHsKICAgICAgdmFyIGJ5dGVzID0gX3BheWxvYWQudGFrZUJ5dGVzKCk7CiAgICAgIGlmIChfZGVmbGF0ZSAhPSBudWxsICYmIF9jb21wcmVzc2VkKSB7CiAgICAgICAgYnl0ZXMgPSBfZGVmbGF0ZS5wcm9jZXNzSW5jb21pbmdNZXNzYWdlKGJ5dGVzKTsKICAgICAgfQoKICAgICAgc3dpdGNoIChfY3VycmVudE1lc3NhZ2VUeXBlKSB7CiAgICAgICAgY2FzZSBfV2ViU29ja2V0TWVzc2FnZVR5cGUuVEVYVDoKICAgICAgICAgIF9ldmVudFNpbmsuYWRkKHV0ZjguZGVjb2RlKGJ5dGVzKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIF9XZWJTb2NrZXRNZXNzYWdlVHlwZS5CSU5BUlk6CiAgICAgICAgICBfZXZlbnRTaW5rLmFkZChieXRlcyk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBfY3VycmVudE1lc3NhZ2VUeXBlID0gX1dlYlNvY2tldE1lc3NhZ2VUeXBlLk5PTkU7CiAgICB9CiAgICBfcHJlcGFyZUZvck5leHRGcmFtZSgpOwogIH0KCiAgdm9pZCBfY29udHJvbEZyYW1lRW5kKCkgewogICAgc3dpdGNoIChfb3Bjb2RlKSB7CiAgICAgIGNhc2UgX1dlYlNvY2tldE9wY29kZS5DTE9TRToKICAgICAgICBjbG9zZUNvZGUgPSBXZWJTb2NrZXRTdGF0dXMuTk9fU1RBVFVTX1JFQ0VJVkVEOwogICAgICAgIHZhciBwYXlsb2FkID0gX3BheWxvYWQudGFrZUJ5dGVzKCk7CiAgICAgICAgaWYgKHBheWxvYWQubGVuZ3RoID4gMCkgewogICAgICAgICAgaWYgKHBheWxvYWQubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNvY2tldEV4Y2VwdGlvbigiUHJvdG9jb2wgZXJyb3IiKTsKICAgICAgICAgIH0KICAgICAgICAgIGNsb3NlQ29kZSA9IHBheWxvYWRbMF0gPDwgOCB8IHBheWxvYWRbMV07CiAgICAgICAgICBpZiAoY2xvc2VDb2RlID09IFdlYlNvY2tldFN0YXR1cy5OT19TVEFUVVNfUkVDRUlWRUQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNvY2tldEV4Y2VwdGlvbigiUHJvdG9jb2wgZXJyb3IiKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwYXlsb2FkLmxlbmd0aCA+IDIpIHsKICAgICAgICAgICAgY2xvc2VSZWFzb24gPSB1dGY4LmRlY29kZShwYXlsb2FkLnN1Ymxpc3QoMikpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfc3RhdGUgPSBDTE9TRUQ7CiAgICAgICAgX2V2ZW50U2luay5jbG9zZSgpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBfV2ViU29ja2V0T3Bjb2RlLlBJTkc6CiAgICAgICAgX2V2ZW50U2luay5hZGQobmV3IF9XZWJTb2NrZXRQaW5nKF9wYXlsb2FkLnRha2VCeXRlcygpKSk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIF9XZWJTb2NrZXRPcGNvZGUuUE9ORzoKICAgICAgICBfZXZlbnRTaW5rLmFkZChuZXcgX1dlYlNvY2tldFBvbmcoX3BheWxvYWQudGFrZUJ5dGVzKCkpKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIF9wcmVwYXJlRm9yTmV4dEZyYW1lKCk7CiAgfQoKICBib29sIF9pc0NvbnRyb2xGcmFtZSgpIHsKICAgIHJldHVybiBfb3Bjb2RlID09IF9XZWJTb2NrZXRPcGNvZGUuQ0xPU0UgfHwKICAgICAgICBfb3Bjb2RlID09IF9XZWJTb2NrZXRPcGNvZGUuUElORyB8fAogICAgICAgIF9vcGNvZGUgPT0gX1dlYlNvY2tldE9wY29kZS5QT05HOwogIH0KCiAgdm9pZCBfcHJlcGFyZUZvck5leHRGcmFtZSgpIHsKICAgIGlmIChfc3RhdGUgIT0gQ0xPU0VEICYmIF9zdGF0ZSAhPSBGQUlMVVJFKSBfc3RhdGUgPSBTVEFSVDsKICAgIF9maW4gPSBmYWxzZTsKICAgIF9vcGNvZGUgPSAtMTsKICAgIF9sZW4gPSAtMTsKICAgIF9yZW1haW5pbmdMZW5CeXRlcyA9IC0xOwogICAgX3JlbWFpbmluZ01hc2tpbmdLZXlCeXRlcyA9IDQ7CiAgICBfcmVtYWluaW5nUGF5bG9hZEJ5dGVzID0gLTE7CiAgICBfdW5tYXNraW5nSW5kZXggPSAwOwogIH0KfQoKY2xhc3MgX1dlYlNvY2tldFBpbmcgewogIGZpbmFsIExpc3Q8aW50PiBwYXlsb2FkOwogIF9XZWJTb2NrZXRQaW5nKFt0aGlzLnBheWxvYWQgPSBudWxsXSk7Cn0KCmNsYXNzIF9XZWJTb2NrZXRQb25nIHsKICBmaW5hbCBMaXN0PGludD4gcGF5bG9hZDsKICBfV2ViU29ja2V0UG9uZyhbdGhpcy5wYXlsb2FkID0gbnVsbF0pOwp9Cgp0eXBlZGVmIC8qU3RyaW5nfEZ1dHVyZTxTdHJpbmc+Ki8gX1Byb3RvY29sU2VsZWN0b3IoTGlzdDxTdHJpbmc+IHByb3RvY29scyk7CgpjbGFzcyBfV2ViU29ja2V0VHJhbnNmb3JtZXJJbXBsCiAgICBleHRlbmRzIFN0cmVhbVRyYW5zZm9ybWVyQmFzZTxIdHRwUmVxdWVzdCwgV2ViU29ja2V0PgogICAgaW1wbGVtZW50cyBXZWJTb2NrZXRUcmFuc2Zvcm1lciB7CiAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxXZWJTb2NrZXQ+IF9jb250cm9sbGVyID0KICAgICAgbmV3IFN0cmVhbUNvbnRyb2xsZXI8V2ViU29ja2V0PihzeW5jOiB0cnVlKTsKICBmaW5hbCBfUHJvdG9jb2xTZWxlY3RvciBfcHJvdG9jb2xTZWxlY3RvcjsKICBmaW5hbCBDb21wcmVzc2lvbk9wdGlvbnMgX2NvbXByZXNzaW9uOwoKICBfV2ViU29ja2V0VHJhbnNmb3JtZXJJbXBsKHRoaXMuX3Byb3RvY29sU2VsZWN0b3IsIHRoaXMuX2NvbXByZXNzaW9uKTsKCiAgU3RyZWFtPFdlYlNvY2tldD4gYmluZChTdHJlYW08SHR0cFJlcXVlc3Q+IHN0cmVhbSkgewogICAgc3RyZWFtLmxpc3RlbigocmVxdWVzdCkgewogICAgICBfdXBncmFkZShyZXF1ZXN0LCBfcHJvdG9jb2xTZWxlY3RvciwgX2NvbXByZXNzaW9uKQogICAgICAgICAgLnRoZW4oKFdlYlNvY2tldCB3ZWJTb2NrZXQpID0+IF9jb250cm9sbGVyLmFkZCh3ZWJTb2NrZXQpKQogICAgICAgICAgLmNhdGNoRXJyb3IoX2NvbnRyb2xsZXIuYWRkRXJyb3IpOwogICAgfSwgb25Eb25lOiAoKSB7CiAgICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgICB9KTsKCiAgICByZXR1cm4gX2NvbnRyb2xsZXIuc3RyZWFtOwogIH0KCiAgc3RhdGljIExpc3Q8U3RyaW5nPiBfdG9rZW5pemVGaWVsZFZhbHVlKFN0cmluZyBoZWFkZXJWYWx1ZSkgewogICAgTGlzdDxTdHJpbmc+IHRva2VucyA9IG5ldyBMaXN0PFN0cmluZz4oKTsKICAgIGludCBzdGFydCA9IDA7CiAgICBpbnQgaW5kZXggPSAwOwogICAgd2hpbGUgKGluZGV4IDwgaGVhZGVyVmFsdWUubGVuZ3RoKSB7CiAgICAgIGlmIChoZWFkZXJWYWx1ZVtpbmRleF0gPT0gIiwiKSB7CiAgICAgICAgdG9rZW5zLmFkZChoZWFkZXJWYWx1ZS5zdWJzdHJpbmcoc3RhcnQsIGluZGV4KSk7CiAgICAgICAgc3RhcnQgPSBpbmRleCArIDE7CiAgICAgIH0gZWxzZSBpZiAoaGVhZGVyVmFsdWVbaW5kZXhdID09ICIgIiB8fCBoZWFkZXJWYWx1ZVtpbmRleF0gPT0gIlx0IikgewogICAgICAgIHN0YXJ0Kys7CiAgICAgIH0KICAgICAgaW5kZXgrKzsKICAgIH0KICAgIHRva2Vucy5hZGQoaGVhZGVyVmFsdWUuc3Vic3RyaW5nKHN0YXJ0LCBpbmRleCkpOwogICAgcmV0dXJuIHRva2VuczsKICB9CgogIHN0YXRpYyBGdXR1cmU8V2ViU29ja2V0PiBfdXBncmFkZShIdHRwUmVxdWVzdCByZXF1ZXN0LAogICAgICBfUHJvdG9jb2xTZWxlY3RvciBfcHJvdG9jb2xTZWxlY3RvciwgQ29tcHJlc3Npb25PcHRpb25zIGNvbXByZXNzaW9uKSB7CiAgICB2YXIgcmVzcG9uc2UgPSByZXF1ZXN0LnJlc3BvbnNlOwogICAgaWYgKCFfaXNVcGdyYWRlUmVxdWVzdChyZXF1ZXN0KSkgewogICAgICAvLyBTZW5kIGVycm9yIHJlc3BvbnNlLgogICAgICByZXNwb25zZQogICAgICAgIC4uc3RhdHVzQ29kZSA9IEh0dHBTdGF0dXMuYmFkUmVxdWVzdAogICAgICAgIC4uY2xvc2UoKTsKICAgICAgcmV0dXJuIG5ldyBGdXR1cmUuZXJyb3IoCiAgICAgICAgICBuZXcgV2ViU29ja2V0RXhjZXB0aW9uKCJJbnZhbGlkIFdlYlNvY2tldCB1cGdyYWRlIHJlcXVlc3QiKSk7CiAgICB9CgogICAgRnV0dXJlPFdlYlNvY2tldD4gdXBncmFkZShTdHJpbmcgcHJvdG9jb2wpIHsKICAgICAgLy8gU2VuZCB0aGUgdXBncmFkZSByZXNwb25zZS4KICAgICAgcmVzcG9uc2UKICAgICAgICAuLnN0YXR1c0NvZGUgPSBIdHRwU3RhdHVzLnN3aXRjaGluZ1Byb3RvY29scwogICAgICAgIC4uaGVhZGVycy5hZGQoSHR0cEhlYWRlcnMuY29ubmVjdGlvbkhlYWRlciwgIlVwZ3JhZGUiKQogICAgICAgIC4uaGVhZGVycy5hZGQoSHR0cEhlYWRlcnMudXBncmFkZUhlYWRlciwgIndlYnNvY2tldCIpOwogICAgICBTdHJpbmcga2V5ID0gcmVxdWVzdC5oZWFkZXJzLnZhbHVlKCJTZWMtV2ViU29ja2V0LUtleSIpOwogICAgICBfU0hBMSBzaGExID0gbmV3IF9TSEExKCk7CiAgICAgIHNoYTEuYWRkKCIka2V5JF93ZWJTb2NrZXRHVUlEIi5jb2RlVW5pdHMpOwogICAgICBTdHJpbmcgYWNjZXB0ID0gX0NyeXB0b1V0aWxzLmJ5dGVzVG9CYXNlNjQoc2hhMS5jbG9zZSgpKTsKICAgICAgcmVzcG9uc2UuaGVhZGVycy5hZGQoIlNlYy1XZWJTb2NrZXQtQWNjZXB0IiwgYWNjZXB0KTsKICAgICAgaWYgKHByb3RvY29sICE9IG51bGwpIHsKICAgICAgICByZXNwb25zZS5oZWFkZXJzLmFkZCgiU2VjLVdlYlNvY2tldC1Qcm90b2NvbCIsIHByb3RvY29sKTsKICAgICAgfQoKICAgICAgdmFyIGRlZmxhdGUgPSBfbmVnb3RpYXRlQ29tcHJlc3Npb24ocmVxdWVzdCwgcmVzcG9uc2UsIGNvbXByZXNzaW9uKTsKCiAgICAgIHJlc3BvbnNlLmhlYWRlcnMuY29udGVudExlbmd0aCA9IDA7CiAgICAgIHJldHVybiByZXNwb25zZS5kZXRhY2hTb2NrZXQoKS50aGVuPFdlYlNvY2tldD4oKHNvY2tldCkgPT4KICAgICAgICAgIG5ldyBfV2ViU29ja2V0SW1wbC5fZnJvbVNvY2tldCgKICAgICAgICAgICAgICBzb2NrZXQsIHByb3RvY29sLCBjb21wcmVzc2lvbiwgdHJ1ZSwgZGVmbGF0ZSkpOwogICAgfQoKICAgIHZhciBwcm90b2NvbHMgPSByZXF1ZXN0LmhlYWRlcnNbJ1NlYy1XZWJTb2NrZXQtUHJvdG9jb2wnXTsKICAgIGlmIChwcm90b2NvbHMgIT0gbnVsbCAmJiBfcHJvdG9jb2xTZWxlY3RvciAhPSBudWxsKSB7CiAgICAgIC8vIFRoZSBzdWdnZXN0ZWQgcHJvdG9jb2xzIGNhbiBiZSBzcHJlYWQgb3ZlciBtdWx0aXBsZSBsaW5lcywgZWFjaAogICAgICAvLyBjb25zaXN0aW5nIG9mIG11bHRpcGxlIHByb3RvY29scy4gVG8gdW5pZnkgYWxsIG9mIHRoZW0sIGZpcnN0IGpvaW4KICAgICAgLy8gdGhlIGxpc3RzIHdpdGggJywgJyBhbmQgdGhlbiB0b2tlbml6ZS4KICAgICAgcHJvdG9jb2xzID0gX3Rva2VuaXplRmllbGRWYWx1ZShwcm90b2NvbHMuam9pbignLCAnKSk7CiAgICAgIHJldHVybiBuZXcgRnV0dXJlPFN0cmluZz4oKCkgPT4gX3Byb3RvY29sU2VsZWN0b3IocHJvdG9jb2xzKSkKICAgICAgICAgIC50aGVuPFN0cmluZz4oKHByb3RvY29sKSB7CiAgICAgICAgaWYgKHByb3RvY29scy5pbmRleE9mKHByb3RvY29sKSA8IDApIHsKICAgICAgICAgIHRocm93IG5ldyBXZWJTb2NrZXRFeGNlcHRpb24oCiAgICAgICAgICAgICAgIlNlbGVjdGVkIHByb3RvY29sIGlzIG5vdCBpbiB0aGUgbGlzdCBvZiBhdmFpbGFibGUgcHJvdG9jb2xzIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwcm90b2NvbDsKICAgICAgfSkuY2F0Y2hFcnJvcigoZXJyb3IpIHsKICAgICAgICByZXNwb25zZQogICAgICAgICAgLi5zdGF0dXNDb2RlID0gSHR0cFN0YXR1cy5pbnRlcm5hbFNlcnZlckVycm9yCiAgICAgICAgICAuLmNsb3NlKCk7CiAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgIH0pLnRoZW48V2ViU29ja2V0Pih1cGdyYWRlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB1cGdyYWRlKG51bGwpOwogICAgfQogIH0KCiAgc3RhdGljIF9XZWJTb2NrZXRQZXJNZXNzYWdlRGVmbGF0ZSBfbmVnb3RpYXRlQ29tcHJlc3Npb24oSHR0cFJlcXVlc3QgcmVxdWVzdCwKICAgICAgSHR0cFJlc3BvbnNlIHJlc3BvbnNlLCBDb21wcmVzc2lvbk9wdGlvbnMgY29tcHJlc3Npb24pIHsKICAgIHZhciBleHRlbnNpb25IZWFkZXIgPSByZXF1ZXN0LmhlYWRlcnMudmFsdWUoIlNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9ucyIpOwoKICAgIGV4dGVuc2lvbkhlYWRlciA/Pz0gIiI7CgogICAgdmFyIGh2ID0gSGVhZGVyVmFsdWUucGFyc2UoZXh0ZW5zaW9uSGVhZGVyLCB2YWx1ZVNlcGFyYXRvcjogJywnKTsKICAgIGlmIChjb21wcmVzc2lvbi5lbmFibGVkICYmIGh2LnZhbHVlID09IF9XZWJTb2NrZXRJbXBsLlBFUl9NRVNTQUdFX0RFRkxBVEUpIHsKICAgICAgdmFyIGluZm8gPSBjb21wcmVzc2lvbi5fY3JlYXRlSGVhZGVyKGh2KTsKCiAgICAgIHJlc3BvbnNlLmhlYWRlcnMuYWRkKCJTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnMiLCBpbmZvLmhlYWRlclZhbHVlKTsKICAgICAgdmFyIHNlcnZlck5vQ29udGV4dFRha2VvdmVyID0KICAgICAgICAgIChodi5wYXJhbWV0ZXJzLmNvbnRhaW5zS2V5KF9zZXJ2ZXJOb0NvbnRleHRUYWtlb3ZlcikgJiYKICAgICAgICAgICAgICBjb21wcmVzc2lvbi5zZXJ2ZXJOb0NvbnRleHRUYWtlb3Zlcik7CiAgICAgIHZhciBjbGllbnROb0NvbnRleHRUYWtlb3ZlciA9CiAgICAgICAgICAoaHYucGFyYW1ldGVycy5jb250YWluc0tleShfY2xpZW50Tm9Db250ZXh0VGFrZW92ZXIpICYmCiAgICAgICAgICAgICAgY29tcHJlc3Npb24uY2xpZW50Tm9Db250ZXh0VGFrZW92ZXIpOwogICAgICB2YXIgZGVmbGF0ZSA9IG5ldyBfV2ViU29ja2V0UGVyTWVzc2FnZURlZmxhdGUoCiAgICAgICAgICBzZXJ2ZXJOb0NvbnRleHRUYWtlb3Zlcjogc2VydmVyTm9Db250ZXh0VGFrZW92ZXIsCiAgICAgICAgICBjbGllbnROb0NvbnRleHRUYWtlb3ZlcjogY2xpZW50Tm9Db250ZXh0VGFrZW92ZXIsCiAgICAgICAgICBzZXJ2ZXJNYXhXaW5kb3dCaXRzOiBpbmZvLm1heFdpbmRvd0JpdHMsCiAgICAgICAgICBjbGllbnRNYXhXaW5kb3dCaXRzOiBpbmZvLm1heFdpbmRvd0JpdHMsCiAgICAgICAgICBzZXJ2ZXJTaWRlOiB0cnVlKTsKCiAgICAgIHJldHVybiBkZWZsYXRlOwogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0KCiAgc3RhdGljIGJvb2wgX2lzVXBncmFkZVJlcXVlc3QoSHR0cFJlcXVlc3QgcmVxdWVzdCkgewogICAgaWYgKHJlcXVlc3QubWV0aG9kICE9ICJHRVQiKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChyZXF1ZXN0LmhlYWRlcnNbSHR0cEhlYWRlcnMuY29ubmVjdGlvbkhlYWRlcl0gPT0gbnVsbCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBib29sIGlzVXBncmFkZSA9IGZhbHNlOwogICAgcmVxdWVzdC5oZWFkZXJzW0h0dHBIZWFkZXJzLmNvbm5lY3Rpb25IZWFkZXJdLmZvckVhY2goKFN0cmluZyB2YWx1ZSkgewogICAgICBpZiAodmFsdWUudG9Mb3dlckNhc2UoKSA9PSAidXBncmFkZSIpIGlzVXBncmFkZSA9IHRydWU7CiAgICB9KTsKICAgIGlmICghaXNVcGdyYWRlKSByZXR1cm4gZmFsc2U7CiAgICBTdHJpbmcgdXBncmFkZSA9IHJlcXVlc3QuaGVhZGVycy52YWx1ZShIdHRwSGVhZGVycy51cGdyYWRlSGVhZGVyKTsKICAgIGlmICh1cGdyYWRlID09IG51bGwgfHwgdXBncmFkZS50b0xvd2VyQ2FzZSgpICE9ICJ3ZWJzb2NrZXQiKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIFN0cmluZyB2ZXJzaW9uID0gcmVxdWVzdC5oZWFkZXJzLnZhbHVlKCJTZWMtV2ViU29ja2V0LVZlcnNpb24iKTsKICAgIGlmICh2ZXJzaW9uID09IG51bGwgfHwgdmVyc2lvbiAhPSAiMTMiKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIFN0cmluZyBrZXkgPSByZXF1ZXN0LmhlYWRlcnMudmFsdWUoIlNlYy1XZWJTb2NrZXQtS2V5Iik7CiAgICBpZiAoa2V5ID09IG51bGwpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQp9CgpjbGFzcyBfV2ViU29ja2V0UGVyTWVzc2FnZURlZmxhdGUgewogIGJvb2wgc2VydmVyTm9Db250ZXh0VGFrZW92ZXI7CiAgYm9vbCBjbGllbnROb0NvbnRleHRUYWtlb3ZlcjsKICBpbnQgY2xpZW50TWF4V2luZG93Qml0czsKICBpbnQgc2VydmVyTWF4V2luZG93Qml0czsKICBib29sIHNlcnZlclNpZGU7CgogIFJhd1pMaWJGaWx0ZXIgZGVjb2RlcjsKICBSYXdaTGliRmlsdGVyIGVuY29kZXI7CgogIF9XZWJTb2NrZXRQZXJNZXNzYWdlRGVmbGF0ZSgKICAgICAge3RoaXMuY2xpZW50TWF4V2luZG93Qml0czogX1dlYlNvY2tldEltcGwuREVGQVVMVF9XSU5ET1dfQklUUywKICAgICAgdGhpcy5zZXJ2ZXJNYXhXaW5kb3dCaXRzOiBfV2ViU29ja2V0SW1wbC5ERUZBVUxUX1dJTkRPV19CSVRTLAogICAgICB0aGlzLnNlcnZlck5vQ29udGV4dFRha2VvdmVyOiBmYWxzZSwKICAgICAgdGhpcy5jbGllbnROb0NvbnRleHRUYWtlb3ZlcjogZmFsc2UsCiAgICAgIHRoaXMuc2VydmVyU2lkZTogZmFsc2V9KTsKCiAgdm9pZCBfZW5zdXJlRGVjb2RlcigpIHsKICAgIGlmIChkZWNvZGVyID09IG51bGwpIHsKICAgICAgZGVjb2RlciA9IG5ldyBSYXdaTGliRmlsdGVyLmluZmxhdGVGaWx0ZXIoCiAgICAgICAgICB3aW5kb3dCaXRzOiBzZXJ2ZXJTaWRlID8gY2xpZW50TWF4V2luZG93Qml0cyA6IHNlcnZlck1heFdpbmRvd0JpdHMsCiAgICAgICAgICByYXc6IHRydWUpOwogICAgfQogIH0KCiAgdm9pZCBfZW5zdXJlRW5jb2RlcigpIHsKICAgIGlmIChlbmNvZGVyID09IG51bGwpIHsKICAgICAgZW5jb2RlciA9IG5ldyBSYXdaTGliRmlsdGVyLmRlZmxhdGVGaWx0ZXIoCiAgICAgICAgICB3aW5kb3dCaXRzOiBzZXJ2ZXJTaWRlID8gc2VydmVyTWF4V2luZG93Qml0cyA6IGNsaWVudE1heFdpbmRvd0JpdHMsCiAgICAgICAgICByYXc6IHRydWUpOwogICAgfQogIH0KCiAgVWludDhMaXN0IHByb2Nlc3NJbmNvbWluZ01lc3NhZ2UoTGlzdDxpbnQ+IG1zZykgewogICAgX2Vuc3VyZURlY29kZXIoKTsKCiAgICB2YXIgZGF0YSA9IDxpbnQ+W107CiAgICBkYXRhLmFkZEFsbChtc2cpOwogICAgZGF0YS5hZGRBbGwoY29uc3QgWzB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmZdKTsKCiAgICBkZWNvZGVyLnByb2Nlc3MoZGF0YSwgMCwgZGF0YS5sZW5ndGgpOwogICAgdmFyIHJlc3VsdCA9IDxpbnQ+W107CiAgICBMaXN0PGludD4gb3V0OwoKICAgIHdoaWxlICgob3V0ID0gZGVjb2Rlci5wcm9jZXNzZWQoKSkgIT0gbnVsbCkgewogICAgICByZXN1bHQuYWRkQWxsKG91dCk7CiAgICB9CgogICAgaWYgKChzZXJ2ZXJTaWRlICYmIGNsaWVudE5vQ29udGV4dFRha2VvdmVyKSB8fAogICAgICAgICghc2VydmVyU2lkZSAmJiBzZXJ2ZXJOb0NvbnRleHRUYWtlb3ZlcikpIHsKICAgICAgZGVjb2RlciA9IG51bGw7CiAgICB9CgogICAgcmV0dXJuIG5ldyBVaW50OExpc3QuZnJvbUxpc3QocmVzdWx0KTsKICB9CgogIExpc3Q8aW50PiBwcm9jZXNzT3V0Z29pbmdNZXNzYWdlKExpc3Q8aW50PiBtc2cpIHsKICAgIF9lbnN1cmVFbmNvZGVyKCk7CiAgICB2YXIgcmVzdWx0ID0gPGludD5bXTsKICAgIFVpbnQ4TGlzdCBidWZmZXI7CgogICAgaWYgKG1zZyBpcyEgVWludDhMaXN0KSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKG1zZ1tpXSA8IDAgfHwgMjU1IDwgbXNnW2ldKSB7CiAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiTGlzdCBlbGVtZW50IGlzIG5vdCBhIGJ5dGUgdmFsdWUgIgogICAgICAgICAgICAgICIodmFsdWUgJHttc2dbaV19IGF0IGluZGV4ICRpKSIpOwogICAgICAgIH0KICAgICAgfQogICAgICBidWZmZXIgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KG1zZyk7CiAgICB9IGVsc2UgewogICAgICBidWZmZXIgPSBtc2c7CiAgICB9CgogICAgZW5jb2Rlci5wcm9jZXNzKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7CgogICAgTGlzdDxpbnQ+IG91dDsKICAgIHdoaWxlICgob3V0ID0gZW5jb2Rlci5wcm9jZXNzZWQoKSkgIT0gbnVsbCkgewogICAgICByZXN1bHQuYWRkQWxsKG91dCk7CiAgICB9CgogICAgaWYgKCghc2VydmVyU2lkZSAmJiBjbGllbnROb0NvbnRleHRUYWtlb3ZlcikgfHwKICAgICAgICAoc2VydmVyU2lkZSAmJiBzZXJ2ZXJOb0NvbnRleHRUYWtlb3ZlcikpIHsKICAgICAgZW5jb2RlciA9IG51bGw7CiAgICB9CgogICAgaWYgKHJlc3VsdC5sZW5ndGggPiA0KSB7CiAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdWJsaXN0KDAsIHJlc3VsdC5sZW5ndGggLSA0KTsKICAgIH0KCiAgICAvLyBSRkMgNzY5MiA3LjIuMy42LiAiR2VuZXJhdGluZyBhbiBFbXB0eSBGcmFnbWVudCIgc2F5cyB0aGF0IGlmIHRoZQogICAgLy8gY29tcHJlc3Npb24gbGlicmFyeSBkb2Vzbid0IGdlbmVyYXRlIGFueSBkYXRhIHdoZW4gdGhlIGJ1ZmVyIGlzIGVtcHR5LAogICAgLy8gdGhlbiBhbiBlbXB0eSB1bmNvbXByZXNzZWQgZGVmbGF0ZSBibG9jayBpcyB1c2VkIGZvciB0aGlzIHB1cnBvc2UuIFRoZQogICAgLy8gMHgwMCBibG9jayBoYXMgdGhlIEJGSU5BTCBoZWFkZXIgYml0IHNldCB0byAwIGFuZCB0aGUgQlRZUEUgaGVhZGVyIHNldCB0bwogICAgLy8gMDAgYWxvbmcgd2l0aCA1IGJpdHMgb2YgcGFkZGluZy4gVGhpcyBibG9jayBkZWNvZGVzIHRvIHplcm8gYnl0ZXMuCiAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PSAwKSB7CiAgICAgIHJldHVybiBbMHgwMF07CiAgICB9CgogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KCi8vIFRPRE8oYWpvaG5zZW4pOiBNYWtlIHRoaXMgdHJhbnNmb3JtZXIgcmV1c2FibGUuCmNsYXNzIF9XZWJTb2NrZXRPdXRnb2luZ1RyYW5zZm9ybWVyCiAgICBleHRlbmRzIFN0cmVhbVRyYW5zZm9ybWVyQmFzZTxkeW5hbWljLCBMaXN0PGludD4+IGltcGxlbWVudHMgRXZlbnRTaW5rIHsKICBmaW5hbCBfV2ViU29ja2V0SW1wbCB3ZWJTb2NrZXQ7CiAgRXZlbnRTaW5rPExpc3Q8aW50Pj4gX2V2ZW50U2luazsKCiAgX1dlYlNvY2tldFBlck1lc3NhZ2VEZWZsYXRlIF9kZWZsYXRlSGVscGVyOwoKICBfV2ViU29ja2V0T3V0Z29pbmdUcmFuc2Zvcm1lcih0aGlzLndlYlNvY2tldCkgewogICAgX2RlZmxhdGVIZWxwZXIgPSB3ZWJTb2NrZXQuX2RlZmxhdGU7CiAgfQoKICBTdHJlYW08TGlzdDxpbnQ+PiBiaW5kKFN0cmVhbSBzdHJlYW0pIHsKICAgIHJldHVybiBuZXcgU3RyZWFtPExpc3Q8aW50Pj4uZXZlbnRUcmFuc2Zvcm1lZChzdHJlYW0sCiAgICAgICAgKEV2ZW50U2luazxMaXN0PGludD4+IGV2ZW50U2luaykgewogICAgICBpZiAoX2V2ZW50U2luayAhPSBudWxsKSB7CiAgICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIldlYlNvY2tldCB0cmFuc2Zvcm1lciBhbHJlYWR5IHVzZWQiKTsKICAgICAgfQogICAgICBfZXZlbnRTaW5rID0gZXZlbnRTaW5rOwogICAgICByZXR1cm4gdGhpczsKICAgIH0pOwogIH0KCiAgdm9pZCBhZGQobWVzc2FnZSkgewogICAgaWYgKG1lc3NhZ2UgaXMgX1dlYlNvY2tldFBvbmcpIHsKICAgICAgYWRkRnJhbWUoX1dlYlNvY2tldE9wY29kZS5QT05HLCBtZXNzYWdlLnBheWxvYWQpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAobWVzc2FnZSBpcyBfV2ViU29ja2V0UGluZykgewogICAgICBhZGRGcmFtZShfV2ViU29ja2V0T3Bjb2RlLlBJTkcsIG1lc3NhZ2UucGF5bG9hZCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIExpc3Q8aW50PiBkYXRhOwogICAgaW50IG9wY29kZTsKICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKICAgICAgaWYgKG1lc3NhZ2UgaXMgU3RyaW5nKSB7CiAgICAgICAgb3Bjb2RlID0gX1dlYlNvY2tldE9wY29kZS5URVhUOwogICAgICAgIGRhdGEgPSB1dGY4LmVuY29kZShtZXNzYWdlKTsKICAgICAgfSBlbHNlIGlmIChtZXNzYWdlIGlzIExpc3Q8aW50PikgewogICAgICAgIG9wY29kZSA9IF9XZWJTb2NrZXRPcGNvZGUuQklOQVJZOwogICAgICAgIGRhdGEgPSBtZXNzYWdlOwogICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UgaXMgX0VuY29kZWRTdHJpbmcpIHsKICAgICAgICBvcGNvZGUgPSBfV2ViU29ja2V0T3Bjb2RlLlRFWFQ7CiAgICAgICAgZGF0YSA9IG1lc3NhZ2UuYnl0ZXM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IobWVzc2FnZSk7CiAgICAgIH0KCiAgICAgIGlmIChfZGVmbGF0ZUhlbHBlciAhPSBudWxsKSB7CiAgICAgICAgZGF0YSA9IF9kZWZsYXRlSGVscGVyLnByb2Nlc3NPdXRnb2luZ01lc3NhZ2UoZGF0YSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIG9wY29kZSA9IF9XZWJTb2NrZXRPcGNvZGUuVEVYVDsKICAgIH0KICAgIGFkZEZyYW1lKG9wY29kZSwgZGF0YSk7CiAgfQoKICB2b2lkIGFkZEVycm9yKE9iamVjdCBlcnJvciwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pIHsKICAgIF9ldmVudFNpbmsuYWRkRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgdm9pZCBjbG9zZSgpIHsKICAgIGludCBjb2RlID0gd2ViU29ja2V0Ll9vdXRDbG9zZUNvZGU7CiAgICBTdHJpbmcgcmVhc29uID0gd2ViU29ja2V0Ll9vdXRDbG9zZVJlYXNvbjsKICAgIExpc3Q8aW50PiBkYXRhOwogICAgaWYgKGNvZGUgIT0gbnVsbCkgewogICAgICBkYXRhID0gbmV3IExpc3Q8aW50PigpOwogICAgICBkYXRhLmFkZCgoY29kZSA+PiA4KSAmIDB4RkYpOwogICAgICBkYXRhLmFkZChjb2RlICYgMHhGRik7CiAgICAgIGlmIChyZWFzb24gIT0gbnVsbCkgewogICAgICAgIGRhdGEuYWRkQWxsKHV0ZjguZW5jb2RlKHJlYXNvbikpOwogICAgICB9CiAgICB9CiAgICBhZGRGcmFtZShfV2ViU29ja2V0T3Bjb2RlLkNMT1NFLCBkYXRhKTsKICAgIF9ldmVudFNpbmsuY2xvc2UoKTsKICB9CgogIHZvaWQgYWRkRnJhbWUoaW50IG9wY29kZSwgTGlzdDxpbnQ+IGRhdGEpIHsKICAgIGNyZWF0ZUZyYW1lKAogICAgICAgICAgICBvcGNvZGUsCiAgICAgICAgICAgIGRhdGEsCiAgICAgICAgICAgIHdlYlNvY2tldC5fc2VydmVyU2lkZSwKICAgICAgICAgICAgX2RlZmxhdGVIZWxwZXIgIT0gbnVsbCAmJgogICAgICAgICAgICAgICAgKG9wY29kZSA9PSBfV2ViU29ja2V0T3Bjb2RlLlRFWFQgfHwKICAgICAgICAgICAgICAgICAgICBvcGNvZGUgPT0gX1dlYlNvY2tldE9wY29kZS5CSU5BUlkpKQogICAgICAgIC5mb3JFYWNoKChlKSB7CiAgICAgIF9ldmVudFNpbmsuYWRkKGUpOwogICAgfSk7CiAgfQoKICBzdGF0aWMgSXRlcmFibGU8TGlzdDxpbnQ+PiBjcmVhdGVGcmFtZSgKICAgICAgaW50IG9wY29kZSwgTGlzdDxpbnQ+IGRhdGEsIGJvb2wgc2VydmVyU2lkZSwgYm9vbCBjb21wcmVzc2VkKSB7CiAgICBib29sIG1hc2sgPSAhc2VydmVyU2lkZTsgLy8gTWFza2luZyBub3QgaW1wbGVtZW50ZWQgZm9yIHNlcnZlci4KICAgIGludCBkYXRhTGVuZ3RoID0gZGF0YSA9PSBudWxsID8gMCA6IGRhdGEubGVuZ3RoOwogICAgLy8gRGV0ZXJtaW5lIHRoZSBoZWFkZXIgc2l6ZS4KICAgIGludCBoZWFkZXJTaXplID0gKG1hc2spID8gNiA6IDI7CiAgICBpZiAoZGF0YUxlbmd0aCA+IDY1NTM1KSB7CiAgICAgIGhlYWRlclNpemUgKz0gODsKICAgIH0gZWxzZSBpZiAoZGF0YUxlbmd0aCA+IDEyNSkgewogICAgICBoZWFkZXJTaXplICs9IDI7CiAgICB9CiAgICBVaW50OExpc3QgaGVhZGVyID0gbmV3IFVpbnQ4TGlzdChoZWFkZXJTaXplKTsKICAgIGludCBpbmRleCA9IDA7CgogICAgLy8gU2V0IEZJTiBhbmQgb3Bjb2RlLgogICAgdmFyIGhvYyA9IF9XZWJTb2NrZXRQcm90b2NvbFRyYW5zZm9ybWVyLkZJTiB8CiAgICAgICAgKGNvbXByZXNzZWQgPyBfV2ViU29ja2V0UHJvdG9jb2xUcmFuc2Zvcm1lci5SU1YxIDogMCkgfAogICAgICAgIChvcGNvZGUgJiBfV2ViU29ja2V0UHJvdG9jb2xUcmFuc2Zvcm1lci5PUENPREUpOwoKICAgIGhlYWRlcltpbmRleCsrXSA9IGhvYzsKICAgIC8vIERldGVybWluZSBzaXplIGFuZCBwb3NpdGlvbiBvZiBsZW5ndGggZmllbGQuCiAgICBpbnQgbGVuZ3RoQnl0ZXMgPSAxOwogICAgaWYgKGRhdGFMZW5ndGggPiA2NTUzNSkgewogICAgICBoZWFkZXJbaW5kZXgrK10gPSAxMjc7CiAgICAgIGxlbmd0aEJ5dGVzID0gODsKICAgIH0gZWxzZSBpZiAoZGF0YUxlbmd0aCA+IDEyNSkgewogICAgICBoZWFkZXJbaW5kZXgrK10gPSAxMjY7CiAgICAgIGxlbmd0aEJ5dGVzID0gMjsKICAgIH0KICAgIC8vIFdyaXRlIHRoZSBsZW5ndGggaW4gbmV0d29yayBieXRlIG9yZGVyIGludG8gdGhlIGhlYWRlci4KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoQnl0ZXM7IGkrKykgewogICAgICBoZWFkZXJbaW5kZXgrK10gPSBkYXRhTGVuZ3RoID4+ICgoKGxlbmd0aEJ5dGVzIC0gMSkgLSBpKSAqIDgpICYgMHhGRjsKICAgIH0KICAgIGlmIChtYXNrKSB7CiAgICAgIGhlYWRlclsxXSB8PSAxIDw8IDc7CiAgICAgIHZhciBtYXNrQnl0ZXMgPSBfQ3J5cHRvVXRpbHMuZ2V0UmFuZG9tQnl0ZXMoNCk7CiAgICAgIGhlYWRlci5zZXRSYW5nZShpbmRleCwgaW5kZXggKyA0LCBtYXNrQnl0ZXMpOwogICAgICBpbmRleCArPSA0OwogICAgICBpZiAoZGF0YSAhPSBudWxsKSB7CiAgICAgICAgVWludDhMaXN0IGxpc3Q7CiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHRleHQgbWVzc2FnZSBqdXN0IGRvIHRoZSBtYXNraW5nIGluc2lkZSB0aGUKICAgICAgICAvLyBlbmNvZGVkIGRhdGEuCiAgICAgICAgaWYgKG9wY29kZSA9PSBfV2ViU29ja2V0T3Bjb2RlLlRFWFQgJiYgZGF0YSBpcyBVaW50OExpc3QpIHsKICAgICAgICAgIGxpc3QgPSBkYXRhOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoZGF0YSBpcyBVaW50OExpc3QpIHsKICAgICAgICAgICAgbGlzdCA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoZGF0YSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsaXN0ID0gbmV3IFVpbnQ4TGlzdChkYXRhLmxlbmd0aCk7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGlmIChkYXRhW2ldIDwgMCB8fCAyNTUgPCBkYXRhW2ldKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiTGlzdCBlbGVtZW50IGlzIG5vdCBhIGJ5dGUgdmFsdWUgIgogICAgICAgICAgICAgICAgICAgICIodmFsdWUgJHtkYXRhW2ldfSBhdCBpbmRleCAkaSkiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgbGlzdFtpXSA9IGRhdGFbaV07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgaW50IEJMT0NLX1NJWkUgPSAxNjsKICAgICAgICBpbnQgYmxvY2tDb3VudCA9IGxpc3QubGVuZ3RoIH4vIEJMT0NLX1NJWkU7CiAgICAgICAgaWYgKGJsb2NrQ291bnQgPiAwKSB7CiAgICAgICAgICAvLyBDcmVhdGUgbWFzayBibG9jay4KICAgICAgICAgIGludCBtYXNrID0gMDsKICAgICAgICAgIGZvciAoaW50IGkgPSAzOyBpID49IDA7IGktLSkgewogICAgICAgICAgICBtYXNrID0gKG1hc2sgPDwgOCkgfCBtYXNrQnl0ZXNbaV07CiAgICAgICAgICB9CiAgICAgICAgICBJbnQzMng0IGJsb2NrTWFzayA9IG5ldyBJbnQzMng0KG1hc2ssIG1hc2ssIG1hc2ssIG1hc2spOwogICAgICAgICAgSW50MzJ4NExpc3QgYmxvY2tCdWZmZXIgPQogICAgICAgICAgICAgIG5ldyBJbnQzMng0TGlzdC52aWV3KGxpc3QuYnVmZmVyLCAwLCBibG9ja0NvdW50KTsKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2tCdWZmZXIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgYmxvY2tCdWZmZXJbaV0gXj0gYmxvY2tNYXNrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBIYW5kbGUgZW5kLgogICAgICAgIGZvciAoaW50IGkgPSBibG9ja0NvdW50ICogQkxPQ0tfU0laRTsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGxpc3RbaV0gXj0gbWFza0J5dGVzW2kgJiAzXTsKICAgICAgICB9CiAgICAgICAgZGF0YSA9IGxpc3Q7CiAgICAgIH0KICAgIH0KICAgIGFzc2VydChpbmRleCA9PSBoZWFkZXJTaXplKTsKICAgIGlmIChkYXRhID09IG51bGwpIHsKICAgICAgcmV0dXJuIFtoZWFkZXJdOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIFtoZWFkZXIsIGRhdGFdOwogICAgfQogIH0KfQoKY2xhc3MgX1dlYlNvY2tldENvbnN1bWVyIGltcGxlbWVudHMgU3RyZWFtQ29uc3VtZXIgewogIGZpbmFsIF9XZWJTb2NrZXRJbXBsIHdlYlNvY2tldDsKICBmaW5hbCBTb2NrZXQgc29ja2V0OwogIFN0cmVhbUNvbnRyb2xsZXIgX2NvbnRyb2xsZXI7CiAgU3RyZWFtU3Vic2NyaXB0aW9uIF9zdWJzY3JpcHRpb247CiAgYm9vbCBfaXNzdWVkUGF1c2UgPSBmYWxzZTsKICBib29sIF9jbG9zZWQgPSBmYWxzZTsKICBDb21wbGV0ZXIgX2Nsb3NlQ29tcGxldGVyID0gbmV3IENvbXBsZXRlcjxXZWJTb2NrZXQ+KCk7CiAgQ29tcGxldGVyIF9jb21wbGV0ZXI7CgogIF9XZWJTb2NrZXRDb25zdW1lcih0aGlzLndlYlNvY2tldCwgdGhpcy5zb2NrZXQpOwoKICB2b2lkIF9vbkxpc3RlbigpIHsKICAgIGlmIChfc3Vic2NyaXB0aW9uICE9IG51bGwpIHsKICAgICAgX3N1YnNjcmlwdGlvbi5jYW5jZWwoKTsKICAgIH0KICB9CgogIHZvaWQgX29uUGF1c2UoKSB7CiAgICBpZiAoX3N1YnNjcmlwdGlvbiAhPSBudWxsKSB7CiAgICAgIF9zdWJzY3JpcHRpb24ucGF1c2UoKTsKICAgIH0gZWxzZSB7CiAgICAgIF9pc3N1ZWRQYXVzZSA9IHRydWU7CiAgICB9CiAgfQoKICB2b2lkIF9vblJlc3VtZSgpIHsKICAgIGlmIChfc3Vic2NyaXB0aW9uICE9IG51bGwpIHsKICAgICAgX3N1YnNjcmlwdGlvbi5yZXN1bWUoKTsKICAgIH0gZWxzZSB7CiAgICAgIF9pc3N1ZWRQYXVzZSA9IGZhbHNlOwogICAgfQogIH0KCiAgdm9pZCBfY2FuY2VsKCkgewogICAgaWYgKF9zdWJzY3JpcHRpb24gIT0gbnVsbCkgewogICAgICB2YXIgc3Vic2NyaXB0aW9uID0gX3N1YnNjcmlwdGlvbjsKICAgICAgX3N1YnNjcmlwdGlvbiA9IG51bGw7CiAgICAgIHN1YnNjcmlwdGlvbi5jYW5jZWwoKTsKICAgIH0KICB9CgogIF9lbnN1cmVDb250cm9sbGVyKCkgewogICAgaWYgKF9jb250cm9sbGVyICE9IG51bGwpIHJldHVybjsKICAgIF9jb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIoCiAgICAgICAgc3luYzogdHJ1ZSwKICAgICAgICBvblBhdXNlOiBfb25QYXVzZSwKICAgICAgICBvblJlc3VtZTogX29uUmVzdW1lLAogICAgICAgIG9uQ2FuY2VsOiBfb25MaXN0ZW4pOwogICAgdmFyIHN0cmVhbSA9IF9jb250cm9sbGVyLnN0cmVhbQogICAgICAgIC50cmFuc2Zvcm0obmV3IF9XZWJTb2NrZXRPdXRnb2luZ1RyYW5zZm9ybWVyKHdlYlNvY2tldCkpOwogICAgc29ja2V0LmFkZFN0cmVhbShzdHJlYW0pLnRoZW4oKF8pIHsKICAgICAgX2RvbmUoKTsKICAgICAgX2Nsb3NlQ29tcGxldGVyLmNvbXBsZXRlKHdlYlNvY2tldCk7CiAgICB9LCBvbkVycm9yOiAoZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgICBfY2xvc2VkID0gdHJ1ZTsKICAgICAgX2NhbmNlbCgpOwogICAgICBpZiAoZXJyb3IgaXMgQXJndW1lbnRFcnJvcikgewogICAgICAgIGlmICghX2RvbmUoZXJyb3IsIHN0YWNrVHJhY2UpKSB7CiAgICAgICAgICBfY2xvc2VDb21wbGV0ZXIuY29tcGxldGVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIF9kb25lKCk7CiAgICAgICAgX2Nsb3NlQ29tcGxldGVyLmNvbXBsZXRlKHdlYlNvY2tldCk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgYm9vbCBfZG9uZShbZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pIHsKICAgIGlmIChfY29tcGxldGVyID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIGlmIChlcnJvciAhPSBudWxsKSB7CiAgICAgIF9jb21wbGV0ZXIuY29tcGxldGVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICB9IGVsc2UgewogICAgICBfY29tcGxldGVyLmNvbXBsZXRlKHdlYlNvY2tldCk7CiAgICB9CiAgICBfY29tcGxldGVyID0gbnVsbDsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgRnV0dXJlIGFkZFN0cmVhbSh2YXIgc3RyZWFtKSB7CiAgICBpZiAoX2Nsb3NlZCkgewogICAgICBzdHJlYW0ubGlzdGVuKG51bGwpLmNhbmNlbCgpOwogICAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZSh3ZWJTb2NrZXQpOwogICAgfQogICAgX2Vuc3VyZUNvbnRyb2xsZXIoKTsKICAgIF9jb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyKCk7CiAgICBfc3Vic2NyaXB0aW9uID0gc3RyZWFtLmxpc3RlbigoZGF0YSkgewogICAgICBfY29udHJvbGxlci5hZGQoZGF0YSk7CiAgICB9LCBvbkRvbmU6IF9kb25lLCBvbkVycm9yOiBfZG9uZSwgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICBpZiAoX2lzc3VlZFBhdXNlKSB7CiAgICAgIF9zdWJzY3JpcHRpb24ucGF1c2UoKTsKICAgICAgX2lzc3VlZFBhdXNlID0gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gX2NvbXBsZXRlci5mdXR1cmU7CiAgfQoKICBGdXR1cmUgY2xvc2UoKSB7CiAgICBfZW5zdXJlQ29udHJvbGxlcigpOwogICAgRnV0dXJlIGNsb3NlU29ja2V0KCkgewogICAgICByZXR1cm4gc29ja2V0LmNsb3NlKCkuY2F0Y2hFcnJvcigoXykge30pLnRoZW4oKF8pID0+IHdlYlNvY2tldCk7CiAgICB9CgogICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICAgIHJldHVybiBfY2xvc2VDb21wbGV0ZXIuZnV0dXJlLnRoZW4oKF8pID0+IGNsb3NlU29ja2V0KCkpOwogIH0KCiAgdm9pZCBhZGQoZGF0YSkgewogICAgaWYgKF9jbG9zZWQpIHJldHVybjsKICAgIF9lbnN1cmVDb250cm9sbGVyKCk7CiAgICBfY29udHJvbGxlci5hZGQoZGF0YSk7CiAgfQoKICB2b2lkIGNsb3NlU29ja2V0KCkgewogICAgX2Nsb3NlZCA9IHRydWU7CiAgICBfY2FuY2VsKCk7CiAgICBjbG9zZSgpOwogIH0KfQoKY2xhc3MgX1dlYlNvY2tldEltcGwgZXh0ZW5kcyBTdHJlYW0gd2l0aCBfU2VydmljZU9iamVjdCBpbXBsZW1lbnRzIFdlYlNvY2tldCB7CiAgLy8gVXNlIGRlZmF1bHQgTWFwIHNvIHdlIGtlZXAgb3JkZXIuCiAgc3RhdGljIE1hcDxpbnQsIF9XZWJTb2NrZXRJbXBsPiBfd2ViU29ja2V0cyA9IG5ldyBNYXA8aW50LCBfV2ViU29ja2V0SW1wbD4oKTsKICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfV0lORE9XX0JJVFMgPSAxNTsKICBzdGF0aWMgY29uc3QgU3RyaW5nIFBFUl9NRVNTQUdFX0RFRkxBVEUgPSAicGVybWVzc2FnZS1kZWZsYXRlIjsKCiAgZmluYWwgU3RyaW5nIHByb3RvY29sOwoKICBTdHJlYW1Db250cm9sbGVyIF9jb250cm9sbGVyOwogIFN0cmVhbVN1YnNjcmlwdGlvbiBfc3Vic2NyaXB0aW9uOwogIFN0cmVhbVNpbmsgX3Npbms7CgogIGZpbmFsIF9zb2NrZXQ7CiAgZmluYWwgYm9vbCBfc2VydmVyU2lkZTsKICBpbnQgX3JlYWR5U3RhdGUgPSBXZWJTb2NrZXQuY29ubmVjdGluZzsKICBib29sIF93cml0ZUNsb3NlZCA9IGZhbHNlOwogIGludCBfY2xvc2VDb2RlOwogIFN0cmluZyBfY2xvc2VSZWFzb247CiAgRHVyYXRpb24gX3BpbmdJbnRlcnZhbDsKICBUaW1lciBfcGluZ1RpbWVyOwogIF9XZWJTb2NrZXRDb25zdW1lciBfY29uc3VtZXI7CgogIGludCBfb3V0Q2xvc2VDb2RlOwogIFN0cmluZyBfb3V0Q2xvc2VSZWFzb247CiAgVGltZXIgX2Nsb3NlVGltZXI7CiAgX1dlYlNvY2tldFBlck1lc3NhZ2VEZWZsYXRlIF9kZWZsYXRlOwoKICBzdGF0aWMgZmluYWwgSHR0cENsaWVudCBfaHR0cENsaWVudCA9IG5ldyBIdHRwQ2xpZW50KCk7CgogIHN0YXRpYyBGdXR1cmU8V2ViU29ja2V0PiBjb25uZWN0KAogICAgICBTdHJpbmcgdXJsLCBJdGVyYWJsZTxTdHJpbmc+IHByb3RvY29scywgTWFwPFN0cmluZywgZHluYW1pYz4gaGVhZGVycywKICAgICAge0NvbXByZXNzaW9uT3B0aW9ucyBjb21wcmVzc2lvbjogQ29tcHJlc3Npb25PcHRpb25zLmNvbXByZXNzaW9uRGVmYXVsdH0pIHsKICAgIFVyaSB1cmkgPSBVcmkucGFyc2UodXJsKTsKICAgIGlmICh1cmkuc2NoZW1lICE9ICJ3cyIgJiYgdXJpLnNjaGVtZSAhPSAid3NzIikgewogICAgICB0aHJvdyBuZXcgV2ViU29ja2V0RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBVUkwgc2NoZW1lICcke3VyaS5zY2hlbWV9JyIpOwogICAgfQoKICAgIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7CiAgICAvLyBHZW5lcmF0ZSAxNiByYW5kb20gYnl0ZXMuCiAgICBVaW50OExpc3Qgbm9uY2VEYXRhID0gbmV3IFVpbnQ4TGlzdCgxNik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKICAgICAgbm9uY2VEYXRhW2ldID0gcmFuZG9tLm5leHRJbnQoMjU2KTsKICAgIH0KICAgIFN0cmluZyBub25jZSA9IF9DcnlwdG9VdGlscy5ieXRlc1RvQmFzZTY0KG5vbmNlRGF0YSk7CgogICAgdXJpID0gbmV3IFVyaSgKICAgICAgICBzY2hlbWU6IHVyaS5zY2hlbWUgPT0gIndzcyIgPyAiaHR0cHMiIDogImh0dHAiLAogICAgICAgIHVzZXJJbmZvOiB1cmkudXNlckluZm8sCiAgICAgICAgaG9zdDogdXJpLmhvc3QsCiAgICAgICAgcG9ydDogdXJpLnBvcnQsCiAgICAgICAgcGF0aDogdXJpLnBhdGgsCiAgICAgICAgcXVlcnk6IHVyaS5xdWVyeSwKICAgICAgICBmcmFnbWVudDogdXJpLmZyYWdtZW50KTsKICAgIHJldHVybiBfaHR0cENsaWVudC5vcGVuVXJsKCJHRVQiLCB1cmkpLnRoZW4oKHJlcXVlc3QpIHsKICAgICAgaWYgKHVyaS51c2VySW5mbyAhPSBudWxsICYmICF1cmkudXNlckluZm8uaXNFbXB0eSkgewogICAgICAgIC8vIElmIHRoZSBVUkwgY29udGFpbnMgdXNlciBpbmZvcm1hdGlvbiB1c2UgdGhhdCBmb3IgYmFzaWMKICAgICAgICAvLyBhdXRob3JpemF0aW9uLgogICAgICAgIFN0cmluZyBhdXRoID0gX0NyeXB0b1V0aWxzLmJ5dGVzVG9CYXNlNjQodXRmOC5lbmNvZGUodXJpLnVzZXJJbmZvKSk7CiAgICAgICAgcmVxdWVzdC5oZWFkZXJzLnNldChIdHRwSGVhZGVycy5hdXRob3JpemF0aW9uSGVhZGVyLCAiQmFzaWMgJGF1dGgiKTsKICAgICAgfQogICAgICBpZiAoaGVhZGVycyAhPSBudWxsKSB7CiAgICAgICAgaGVhZGVycy5mb3JFYWNoKChmaWVsZCwgdmFsdWUpID0+IHJlcXVlc3QuaGVhZGVycy5hZGQoZmllbGQsIHZhbHVlKSk7CiAgICAgIH0KICAgICAgLy8gU2V0dXAgdGhlIGluaXRpYWwgaGFuZHNoYWtlLgogICAgICByZXF1ZXN0LmhlYWRlcnMKICAgICAgICAuLnNldChIdHRwSGVhZGVycy5jb25uZWN0aW9uSGVhZGVyLCAiVXBncmFkZSIpCiAgICAgICAgLi5zZXQoSHR0cEhlYWRlcnMudXBncmFkZUhlYWRlciwgIndlYnNvY2tldCIpCiAgICAgICAgLi5zZXQoIlNlYy1XZWJTb2NrZXQtS2V5Iiwgbm9uY2UpCiAgICAgICAgLi5zZXQoIkNhY2hlLUNvbnRyb2wiLCAibm8tY2FjaGUiKQogICAgICAgIC4uc2V0KCJTZWMtV2ViU29ja2V0LVZlcnNpb24iLCAiMTMiKTsKICAgICAgaWYgKHByb3RvY29scyAhPSBudWxsKSB7CiAgICAgICAgcmVxdWVzdC5oZWFkZXJzLmFkZCgiU2VjLVdlYlNvY2tldC1Qcm90b2NvbCIsIHByb3RvY29scy50b0xpc3QoKSk7CiAgICAgIH0KCiAgICAgIGlmIChjb21wcmVzc2lvbi5lbmFibGVkKSB7CiAgICAgICAgcmVxdWVzdC5oZWFkZXJzCiAgICAgICAgICAgIC5hZGQoIlNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9ucyIsIGNvbXByZXNzaW9uLl9jcmVhdGVIZWFkZXIoKSk7CiAgICAgIH0KCiAgICAgIHJldHVybiByZXF1ZXN0LmNsb3NlKCk7CiAgICB9KS50aGVuKChyZXNwb25zZSkgewogICAgICB2b2lkIGVycm9yKFN0cmluZyBtZXNzYWdlKSB7CiAgICAgICAgLy8gRmx1c2ggZGF0YS4KICAgICAgICByZXNwb25zZS5kZXRhY2hTb2NrZXQoKS50aGVuKChzb2NrZXQpIHsKICAgICAgICAgIHNvY2tldC5kZXN0cm95KCk7CiAgICAgICAgfSk7CiAgICAgICAgdGhyb3cgbmV3IFdlYlNvY2tldEV4Y2VwdGlvbihtZXNzYWdlKTsKICAgICAgfQoKICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT0gSHR0cFN0YXR1cy5zd2l0Y2hpbmdQcm90b2NvbHMgfHwKICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnNbSHR0cEhlYWRlcnMuY29ubmVjdGlvbkhlYWRlcl0gPT0gbnVsbCB8fAogICAgICAgICAgIXJlc3BvbnNlLmhlYWRlcnNbSHR0cEhlYWRlcnMuY29ubmVjdGlvbkhlYWRlcl0KICAgICAgICAgICAgICAuYW55KCh2YWx1ZSkgPT4gdmFsdWUudG9Mb3dlckNhc2UoKSA9PSAidXBncmFkZSIpIHx8CiAgICAgICAgICByZXNwb25zZS5oZWFkZXJzLnZhbHVlKEh0dHBIZWFkZXJzLnVwZ3JhZGVIZWFkZXIpLnRvTG93ZXJDYXNlKCkgIT0KICAgICAgICAgICAgICAid2Vic29ja2V0IikgewogICAgICAgIGVycm9yKCJDb25uZWN0aW9uIHRvICckdXJpJyB3YXMgbm90IHVwZ3JhZGVkIHRvIHdlYnNvY2tldCIpOwogICAgICB9CiAgICAgIFN0cmluZyBhY2NlcHQgPSByZXNwb25zZS5oZWFkZXJzLnZhbHVlKCJTZWMtV2ViU29ja2V0LUFjY2VwdCIpOwogICAgICBpZiAoYWNjZXB0ID09IG51bGwpIHsKICAgICAgICBlcnJvcigiUmVzcG9uc2UgZGlkIG5vdCBjb250YWluIGEgJ1NlYy1XZWJTb2NrZXQtQWNjZXB0JyBoZWFkZXIiKTsKICAgICAgfQogICAgICBfU0hBMSBzaGExID0gbmV3IF9TSEExKCk7CiAgICAgIHNoYTEuYWRkKCIkbm9uY2UkX3dlYlNvY2tldEdVSUQiLmNvZGVVbml0cyk7CiAgICAgIExpc3Q8aW50PiBleHBlY3RlZEFjY2VwdCA9IHNoYTEuY2xvc2UoKTsKICAgICAgTGlzdDxpbnQ+IHJlY2VpdmVkQWNjZXB0ID0gX0NyeXB0b1V0aWxzLmJhc2U2NFN0cmluZ1RvQnl0ZXMoYWNjZXB0KTsKICAgICAgaWYgKGV4cGVjdGVkQWNjZXB0Lmxlbmd0aCAhPSByZWNlaXZlZEFjY2VwdC5sZW5ndGgpIHsKICAgICAgICBlcnJvcigiUmVhc3BvbnNlIGhlYWRlciAnU2VjLVdlYlNvY2tldC1BY2NlcHQnIGlzIHRoZSB3cm9uZyBsZW5ndGgiKTsKICAgICAgfQogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkQWNjZXB0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGV4cGVjdGVkQWNjZXB0W2ldICE9IHJlY2VpdmVkQWNjZXB0W2ldKSB7CiAgICAgICAgICBlcnJvcigiQmFkIHJlc3BvbnNlICdTZWMtV2ViU29ja2V0LUFjY2VwdCcgaGVhZGVyIik7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciBwcm90b2NvbCA9IHJlc3BvbnNlLmhlYWRlcnMudmFsdWUoJ1NlYy1XZWJTb2NrZXQtUHJvdG9jb2wnKTsKCiAgICAgIF9XZWJTb2NrZXRQZXJNZXNzYWdlRGVmbGF0ZSBkZWZsYXRlID0KICAgICAgICAgIG5lZ290aWF0ZUNsaWVudENvbXByZXNzaW9uKHJlc3BvbnNlLCBjb21wcmVzc2lvbik7CgogICAgICByZXR1cm4gcmVzcG9uc2UuZGV0YWNoU29ja2V0KCkudGhlbjxXZWJTb2NrZXQ+KChzb2NrZXQpID0+CiAgICAgICAgICBuZXcgX1dlYlNvY2tldEltcGwuX2Zyb21Tb2NrZXQoCiAgICAgICAgICAgICAgc29ja2V0LCBwcm90b2NvbCwgY29tcHJlc3Npb24sIGZhbHNlLCBkZWZsYXRlKSk7CiAgICB9KTsKICB9CgogIHN0YXRpYyBfV2ViU29ja2V0UGVyTWVzc2FnZURlZmxhdGUgbmVnb3RpYXRlQ2xpZW50Q29tcHJlc3Npb24oCiAgICAgIEh0dHBDbGllbnRSZXNwb25zZSByZXNwb25zZSwgQ29tcHJlc3Npb25PcHRpb25zIGNvbXByZXNzaW9uKSB7CiAgICBTdHJpbmcgZXh0ZW5zaW9uSGVhZGVyID0gcmVzcG9uc2UuaGVhZGVycy52YWx1ZSgnU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zJyk7CgogICAgaWYgKGV4dGVuc2lvbkhlYWRlciA9PSBudWxsKSB7CiAgICAgIGV4dGVuc2lvbkhlYWRlciA9ICIiOwogICAgfQoKICAgIHZhciBodiA9IEhlYWRlclZhbHVlLnBhcnNlKGV4dGVuc2lvbkhlYWRlciwgdmFsdWVTZXBhcmF0b3I6ICcsJyk7CgogICAgaWYgKGNvbXByZXNzaW9uLmVuYWJsZWQgJiYgaHYudmFsdWUgPT0gUEVSX01FU1NBR0VfREVGTEFURSkgewogICAgICB2YXIgc2VydmVyTm9Db250ZXh0VGFrZW92ZXIgPQogICAgICAgICAgaHYucGFyYW1ldGVycy5jb250YWluc0tleShfc2VydmVyTm9Db250ZXh0VGFrZW92ZXIpOwogICAgICB2YXIgY2xpZW50Tm9Db250ZXh0VGFrZW92ZXIgPQogICAgICAgICAgaHYucGFyYW1ldGVycy5jb250YWluc0tleShfY2xpZW50Tm9Db250ZXh0VGFrZW92ZXIpOwoKICAgICAgaW50IGdldFdpbmRvd0JpdHMoU3RyaW5nIHR5cGUpIHsKICAgICAgICB2YXIgbyA9IGh2LnBhcmFtZXRlcnNbdHlwZV07CiAgICAgICAgaWYgKG8gPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIERFRkFVTFRfV0lORE9XX0JJVFM7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaW50LnBhcnNlKG8sIG9uRXJyb3I6IChzKSA9PiBERUZBVUxUX1dJTkRPV19CSVRTKTsKICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBfV2ViU29ja2V0UGVyTWVzc2FnZURlZmxhdGUoCiAgICAgICAgICBjbGllbnRNYXhXaW5kb3dCaXRzOiBnZXRXaW5kb3dCaXRzKF9jbGllbnRNYXhXaW5kb3dCaXRzKSwKICAgICAgICAgIHNlcnZlck1heFdpbmRvd0JpdHM6IGdldFdpbmRvd0JpdHMoX3NlcnZlck1heFdpbmRvd0JpdHMpLAogICAgICAgICAgY2xpZW50Tm9Db250ZXh0VGFrZW92ZXI6IGNsaWVudE5vQ29udGV4dFRha2VvdmVyLAogICAgICAgICAgc2VydmVyTm9Db250ZXh0VGFrZW92ZXI6IHNlcnZlck5vQ29udGV4dFRha2VvdmVyKTsKICAgIH0KCiAgICByZXR1cm4gbnVsbDsKICB9CgogIF9XZWJTb2NrZXRJbXBsLl9mcm9tU29ja2V0KAogICAgICB0aGlzLl9zb2NrZXQsIHRoaXMucHJvdG9jb2wsIENvbXByZXNzaW9uT3B0aW9ucyBjb21wcmVzc2lvbiwKICAgICAgW3RoaXMuX3NlcnZlclNpZGUgPSBmYWxzZSwgX1dlYlNvY2tldFBlck1lc3NhZ2VEZWZsYXRlIGRlZmxhdGVdKSB7CiAgICBfY29uc3VtZXIgPSBuZXcgX1dlYlNvY2tldENvbnN1bWVyKHRoaXMsIF9zb2NrZXQpOwogICAgX3NpbmsgPSBuZXcgX1N0cmVhbVNpbmtJbXBsKF9jb25zdW1lcik7CiAgICBfcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5vcGVuOwogICAgX2RlZmxhdGUgPSBkZWZsYXRlOwoKICAgIHZhciB0cmFuc2Zvcm1lciA9IG5ldyBfV2ViU29ja2V0UHJvdG9jb2xUcmFuc2Zvcm1lcihfc2VydmVyU2lkZSwgX2RlZmxhdGUpOwogICAgX3N1YnNjcmlwdGlvbiA9IF9zb2NrZXQudHJhbnNmb3JtKHRyYW5zZm9ybWVyKS5saXN0ZW4oKGRhdGEpIHsKICAgICAgaWYgKGRhdGEgaXMgX1dlYlNvY2tldFBpbmcpIHsKICAgICAgICBpZiAoIV93cml0ZUNsb3NlZCkgX2NvbnN1bWVyLmFkZChuZXcgX1dlYlNvY2tldFBvbmcoZGF0YS5wYXlsb2FkKSk7CiAgICAgIH0gZWxzZSBpZiAoZGF0YSBpcyBfV2ViU29ja2V0UG9uZykgewogICAgICAgIC8vIFNpbXBseSBzZXQgcGluZ0ludGVydmFsLCBhcyBpdCdsbCBjYW5jZWwgYW55IHRpbWVycy4KICAgICAgICBwaW5nSW50ZXJ2YWwgPSBfcGluZ0ludGVydmFsOwogICAgICB9IGVsc2UgewogICAgICAgIF9jb250cm9sbGVyLmFkZChkYXRhKTsKICAgICAgfQogICAgfSwgb25FcnJvcjogKGVycm9yLCBzdGFja1RyYWNlKSB7CiAgICAgIGlmIChfY2xvc2VUaW1lciAhPSBudWxsKSBfY2xvc2VUaW1lci5jYW5jZWwoKTsKICAgICAgaWYgKGVycm9yIGlzIEZvcm1hdEV4Y2VwdGlvbikgewogICAgICAgIF9jbG9zZShXZWJTb2NrZXRTdGF0dXMuSU5WQUxJRF9GUkFNRV9QQVlMT0FEX0RBVEEpOwogICAgICB9IGVsc2UgewogICAgICAgIF9jbG9zZShXZWJTb2NrZXRTdGF0dXMuUFJPVE9DT0xfRVJST1IpOwogICAgICB9CiAgICAgIC8vIEFuIGVycm9yIGhhcHBlbmVkLCBzZXQgdGhlIGNsb3NlIGNvZGUgc2V0IGFib3ZlLgogICAgICBfY2xvc2VDb2RlID0gX291dENsb3NlQ29kZTsKICAgICAgX2Nsb3NlUmVhc29uID0gX291dENsb3NlUmVhc29uOwogICAgICBfY29udHJvbGxlci5jbG9zZSgpOwogICAgfSwgb25Eb25lOiAoKSB7CiAgICAgIGlmIChfY2xvc2VUaW1lciAhPSBudWxsKSBfY2xvc2VUaW1lci5jYW5jZWwoKTsKICAgICAgaWYgKF9yZWFkeVN0YXRlID09IFdlYlNvY2tldC5vcGVuKSB7CiAgICAgICAgX3JlYWR5U3RhdGUgPSBXZWJTb2NrZXQuY2xvc2luZzsKICAgICAgICBpZiAoIV9pc1Jlc2VydmVkU3RhdHVzQ29kZSh0cmFuc2Zvcm1lci5jbG9zZUNvZGUpKSB7CiAgICAgICAgICBfY2xvc2UodHJhbnNmb3JtZXIuY2xvc2VDb2RlLCB0cmFuc2Zvcm1lci5jbG9zZVJlYXNvbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIF9jbG9zZSgpOwogICAgICAgIH0KICAgICAgICBfcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5jbG9zZWQ7CiAgICAgIH0KICAgICAgLy8gUHJvdG9jb2wgY2xvc2UsIHVzZSBjbG9zZSBjb2RlIGZyb20gdHJhbnNmb3JtZXIuCiAgICAgIF9jbG9zZUNvZGUgPSB0cmFuc2Zvcm1lci5jbG9zZUNvZGU7CiAgICAgIF9jbG9zZVJlYXNvbiA9IHRyYW5zZm9ybWVyLmNsb3NlUmVhc29uOwogICAgICBfY29udHJvbGxlci5jbG9zZSgpOwogICAgfSwgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICBfc3Vic2NyaXB0aW9uLnBhdXNlKCk7CiAgICBfY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyKAogICAgICAgIHN5bmM6IHRydWUsCiAgICAgICAgb25MaXN0ZW46IF9zdWJzY3JpcHRpb24ucmVzdW1lLAogICAgICAgIG9uQ2FuY2VsOiAoKSB7CiAgICAgICAgICBfc3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogICAgICAgICAgX3N1YnNjcmlwdGlvbiA9IG51bGw7CiAgICAgICAgfSwKICAgICAgICBvblBhdXNlOiBfc3Vic2NyaXB0aW9uLnBhdXNlLAogICAgICAgIG9uUmVzdW1lOiBfc3Vic2NyaXB0aW9uLnJlc3VtZSk7CgogICAgX3dlYlNvY2tldHNbX3NlcnZpY2VJZF0gPSB0aGlzOwogIH0KCiAgU3RyZWFtU3Vic2NyaXB0aW9uIGxpc3Rlbih2b2lkIG9uRGF0YShtZXNzYWdlKSwKICAgICAge0Z1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcn0pIHsKICAgIHJldHVybiBfY29udHJvbGxlci5zdHJlYW0ubGlzdGVuKG9uRGF0YSwKICAgICAgICBvbkVycm9yOiBvbkVycm9yLCBvbkRvbmU6IG9uRG9uZSwgY2FuY2VsT25FcnJvcjogY2FuY2VsT25FcnJvcik7CiAgfQoKICBEdXJhdGlvbiBnZXQgcGluZ0ludGVydmFsID0+IF9waW5nSW50ZXJ2YWw7CgogIHZvaWQgc2V0IHBpbmdJbnRlcnZhbChEdXJhdGlvbiBpbnRlcnZhbCkgewogICAgaWYgKF93cml0ZUNsb3NlZCkgcmV0dXJuOwogICAgaWYgKF9waW5nVGltZXIgIT0gbnVsbCkgX3BpbmdUaW1lci5jYW5jZWwoKTsKICAgIF9waW5nSW50ZXJ2YWwgPSBpbnRlcnZhbDsKCiAgICBpZiAoX3BpbmdJbnRlcnZhbCA9PSBudWxsKSByZXR1cm47CgogICAgX3BpbmdUaW1lciA9IG5ldyBUaW1lcihfcGluZ0ludGVydmFsLCAoKSB7CiAgICAgIGlmIChfd3JpdGVDbG9zZWQpIHJldHVybjsKICAgICAgX2NvbnN1bWVyLmFkZChuZXcgX1dlYlNvY2tldFBpbmcoKSk7CiAgICAgIF9waW5nVGltZXIgPSBuZXcgVGltZXIoX3BpbmdJbnRlcnZhbCwgKCkgewogICAgICAgIC8vIE5vIHBvbmcgcmVjZWl2ZWQuCiAgICAgICAgX2Nsb3NlKFdlYlNvY2tldFN0YXR1cy5HT0lOR19BV0FZKTsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIGludCBnZXQgcmVhZHlTdGF0ZSA9PiBfcmVhZHlTdGF0ZTsKCiAgU3RyaW5nIGdldCBleHRlbnNpb25zID0+IG51bGw7CiAgaW50IGdldCBjbG9zZUNvZGUgPT4gX2Nsb3NlQ29kZTsKICBTdHJpbmcgZ2V0IGNsb3NlUmVhc29uID0+IF9jbG9zZVJlYXNvbjsKCiAgdm9pZCBhZGQoZGF0YSkgewogICAgX3NpbmsuYWRkKGRhdGEpOwogIH0KCiAgdm9pZCBhZGRVdGY4VGV4dChMaXN0PGludD4gYnl0ZXMpIHsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKGJ5dGVzLCAiYnl0ZXMiKTsKICAgIF9zaW5rLmFkZChuZXcgX0VuY29kZWRTdHJpbmcoYnl0ZXMpKTsKICB9CgogIHZvaWQgYWRkRXJyb3IoZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICBfc2luay5hZGRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQoKICBGdXR1cmUgYWRkU3RyZWFtKFN0cmVhbSBzdHJlYW0pID0+IF9zaW5rLmFkZFN0cmVhbShzdHJlYW0pOwogIEZ1dHVyZSBnZXQgZG9uZSA9PiBfc2luay5kb25lOwoKICBGdXR1cmUgY2xvc2UoW2ludCBjb2RlLCBTdHJpbmcgcmVhc29uXSkgewogICAgaWYgKF9pc1Jlc2VydmVkU3RhdHVzQ29kZShjb2RlKSkgewogICAgICB0aHJvdyBuZXcgV2ViU29ja2V0RXhjZXB0aW9uKCJSZXNlcnZlZCBzdGF0dXMgY29kZSAkY29kZSIpOwogICAgfQogICAgaWYgKF9vdXRDbG9zZUNvZGUgPT0gbnVsbCkgewogICAgICBfb3V0Q2xvc2VDb2RlID0gY29kZTsKICAgICAgX291dENsb3NlUmVhc29uID0gcmVhc29uOwogICAgfQogICAgaWYgKCFfY29udHJvbGxlci5pc0Nsb3NlZCkgewogICAgICAvLyBJZiBhIGNsb3NlIGhhcyBub3QgeWV0IGJlZW4gcmVjZWl2ZWQgZnJvbSB0aGUgb3RoZXIgZW5kIHRoZW4KICAgICAgLy8gICAxKSBtYWtlIHN1cmUgdG8gbGlzdGVuIG9uIHRoZSBzdHJlYW0gc28gdGhlIGNsb3NlIGZyYW1lIHdpbGwgYmUKICAgICAgLy8gICAgICBwcm9jZXNzZWQgaWYgcmVjZWl2ZWQuCiAgICAgIC8vICAgMikgc2V0IGEgdGltZXIgdGVybWluYXRlIHRoZSBjb25uZWN0aW9uIGlmIGEgY2xvc2UgZnJhbWUgaXMKICAgICAgLy8gICAgICBub3QgcmVjZWl2ZWQuCiAgICAgIGlmICghX2NvbnRyb2xsZXIuaGFzTGlzdGVuZXIgJiYgX3N1YnNjcmlwdGlvbiAhPSBudWxsKSB7CiAgICAgICAgX2NvbnRyb2xsZXIuc3RyZWFtLmRyYWluKCkuY2F0Y2hFcnJvcigoXykgPT4ge30pOwogICAgICB9CiAgICAgIGlmIChfY2xvc2VUaW1lciA9PSBudWxsKSB7CiAgICAgICAgLy8gV2hlbiBjbG9zaW5nIHRoZSB3ZWItc29ja2V0LCB3ZSBubyBsb25nZXIgYWNjZXB0IGRhdGEuCiAgICAgICAgX2Nsb3NlVGltZXIgPSBuZXcgVGltZXIoY29uc3QgRHVyYXRpb24oc2Vjb25kczogNSksICgpIHsKICAgICAgICAgIC8vIFJldXNlIGNvZGUgYW5kIHJlYXNvbiBmcm9tIHRoZSBsb2NhbCBjbG9zZS4KICAgICAgICAgIF9jbG9zZUNvZGUgPSBfb3V0Q2xvc2VDb2RlOwogICAgICAgICAgX2Nsb3NlUmVhc29uID0gX291dENsb3NlUmVhc29uOwogICAgICAgICAgaWYgKF9zdWJzY3JpcHRpb24gIT0gbnVsbCkgX3N1YnNjcmlwdGlvbi5jYW5jZWwoKTsKICAgICAgICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgICAgICAgICBfd2ViU29ja2V0cy5yZW1vdmUoX3NlcnZpY2VJZCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfc2luay5jbG9zZSgpOwogIH0KCiAgc3RhdGljIFN0cmluZyBnZXQgdXNlckFnZW50ID0+IF9odHRwQ2xpZW50LnVzZXJBZ2VudDsKCiAgc3RhdGljIHNldCB1c2VyQWdlbnQoU3RyaW5nIHVzZXJBZ2VudCkgewogICAgX2h0dHBDbGllbnQudXNlckFnZW50ID0gdXNlckFnZW50OwogIH0KCiAgdm9pZCBfY2xvc2UoW2ludCBjb2RlLCBTdHJpbmcgcmVhc29uXSkgewogICAgaWYgKF93cml0ZUNsb3NlZCkgcmV0dXJuOwogICAgaWYgKF9vdXRDbG9zZUNvZGUgPT0gbnVsbCkgewogICAgICBfb3V0Q2xvc2VDb2RlID0gY29kZTsKICAgICAgX291dENsb3NlUmVhc29uID0gcmVhc29uOwogICAgfQogICAgX3dyaXRlQ2xvc2VkID0gdHJ1ZTsKICAgIF9jb25zdW1lci5jbG9zZVNvY2tldCgpOwogICAgX3dlYlNvY2tldHMucmVtb3ZlKF9zZXJ2aWNlSWQpOwogIH0KCiAgU3RyaW5nIGdldCBfc2VydmljZVR5cGVQYXRoID0+ICdpby93ZWJzb2NrZXRzJzsKICBTdHJpbmcgZ2V0IF9zZXJ2aWNlVHlwZU5hbWUgPT4gJ1dlYlNvY2tldCc7CgogIE1hcDxTdHJpbmcsIGR5bmFtaWM+IF90b0pTT04oYm9vbCByZWYpIHsKICAgIHZhciBuYW1lID0gJyR7X3NvY2tldC5hZGRyZXNzLmhvc3R9OiR7X3NvY2tldC5wb3J0fSc7CiAgICB2YXIgciA9IDxTdHJpbmcsIGR5bmFtaWM+ewogICAgICAnaWQnOiBfc2VydmljZVBhdGgsCiAgICAgICd0eXBlJzogX3NlcnZpY2VUeXBlKHJlZiksCiAgICAgICduYW1lJzogbmFtZSwKICAgICAgJ3VzZXJfbmFtZSc6IG5hbWUsCiAgICB9OwogICAgaWYgKHJlZikgewogICAgICByZXR1cm4gcjsKICAgIH0KICAgIHRyeSB7CiAgICAgIHJbJ3NvY2tldCddID0gX3NvY2tldC5fdG9KU09OKHRydWUpOwogICAgfSBjYXRjaCAoXykgewogICAgICByWydzb2NrZXQnXSA9IHsKICAgICAgICAnaWQnOiBfc2VydmljZVBhdGgsCiAgICAgICAgJ3R5cGUnOiAnQFNvY2tldCcsCiAgICAgICAgJ25hbWUnOiAnVXNlclNvY2tldCcsCiAgICAgICAgJ3VzZXJfbmFtZSc6ICdVc2VyU29ja2V0JywKICAgICAgfTsKICAgIH0KICAgIHJldHVybiByOwogIH0KCiAgc3RhdGljIGJvb2wgX2lzUmVzZXJ2ZWRTdGF0dXNDb2RlKGludCBjb2RlKSB7CiAgICByZXR1cm4gY29kZSAhPSBudWxsICYmCiAgICAgICAgKGNvZGUgPCBXZWJTb2NrZXRTdGF0dXMuTk9STUFMX0NMT1NVUkUgfHwKICAgICAgICAgICAgY29kZSA9PSBXZWJTb2NrZXRTdGF0dXMuUkVTRVJWRURfMTAwNCB8fAogICAgICAgICAgICBjb2RlID09IFdlYlNvY2tldFN0YXR1cy5OT19TVEFUVVNfUkVDRUlWRUQgfHwKICAgICAgICAgICAgY29kZSA9PSBXZWJTb2NrZXRTdGF0dXMuQUJOT1JNQUxfQ0xPU1VSRSB8fAogICAgICAgICAgICAoY29kZSA+IFdlYlNvY2tldFN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IgJiYKICAgICAgICAgICAgICAgIGNvZGUgPCBX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ICBzdGF0aWMgY29uc3QgaW50IENSID0gMTM7IC8vICdccicKICBzdGF0aWMgY29uc3QgaW50IExGID0gMTA7IC8vICdcbicKICBzdGF0aWMgY29uc3QgaW50IExJTkVfTEVOR1RIID0gNzY7CgogIHN0YXRpYyBjb25zdCBTdHJpbmcgX2VuY29kZVRhYmxlID0KICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwoKICBzdGF0aWMgY29uc3QgU3RyaW5nIF9lbmNvZGVUYWJsZVVybFNhZmUgPQogICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXyI7CgogIC8vIExvb2t1cCB0YWJsZSB1c2VkIGZvciBmaW5kaW5nIEJhc2UgNjQgYWxwaGFiZXQgaW5kZXggb2YgYSBnaXZlbiBieXRlLgogIC8vIC0yIDogT3V0c2lkZSBCYXNlIDY0IGFscGhhYmV0LgogIC8vIC0xIDogJ1xyJyBvciAnXG4nCiAgLy8gIDAgOiA9IChQYWRkaW5nIGNoYXJhY3RlcikuCiAgLy8gPjAgOiBCYXNlIDY0IGFscGhhYmV0IGluZGV4IG9mIGdpdmVuIGJ5dGUuCiAgc3RhdGljIGNvbnN0IExpc3Q8aW50PiBfZGVjb2RlVGFibGUgPSBjb25zdCBbCiAgICAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTEsIC0yLCAtMiwgLTEsIC0yLCAtMiwgLy8KICAgIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAvLwogICAgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCA2MiwgLTIsIDYyLCAtMiwgNjMsIC8vCiAgICA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgLTIsIC0yLCAtMiwgMDAsIC0yLCAtMiwgLy8KICAgIC0yLCAwMCwgMDEsIDAyLCAwMywgMDQsIDA1LCAwNiwgMDcsIDA4LCAwOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAvLwogICAgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAtMiwgLTIsIC0yLCAtMiwgNjMsIC8vCiAgICAtMiwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgLy8KICAgIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MSwgLTIsIC0yLCAtMiwgLTIsIC0yLCAvLwogICAgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC8vCiAgICAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLy8KICAgIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAvLwogICAgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC8vCiAgICAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLy8KICAgIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAvLwogICAgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC8vCiAgICAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMgogIF07CgogIHN0YXRpYyBSYW5kb20gX3JuZyA9IG5ldyBSYW5kb20uc2VjdXJlKCk7CgogIHN0YXRpYyBVaW50OExpc3QgZ2V0UmFuZG9tQnl0ZXMoaW50IGNvdW50KSB7CiAgICBmaW5hbCBVaW50OExpc3QgcmVzdWx0ID0gbmV3IFVpbnQ4TGlzdChjb3VudCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgcmVzdWx0W2ldID0gX3JuZy5uZXh0SW50KDB4ZmYpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBTdHJpbmcgYnl0ZXNUb0hleChMaXN0PGludD4gYnl0ZXMpIHsKICAgIHZhciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBmb3IgKHZhciBwYXJ0IGluIGJ5dGVzKSB7CiAgICAgIHJlc3VsdC53cml0ZSgnJHtwYXJ0IDwgMTYgPyAnMCcgOiAnJ30ke3BhcnQudG9SYWRpeFN0cmluZygxNil9Jyk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CiAgfQoKICBzdGF0aWMgU3RyaW5nIGJ5dGVzVG9CYXNlNjQoTGlzdDxpbnQ+IGJ5dGVzLAogICAgICBbYm9vbCB1cmxTYWZlID0gZmFsc2UsIGJvb2wgYWRkTGluZVNlcGFyYXRvciA9IGZhbHNlXSkgewogICAgaW50IGxlbiA9IGJ5dGVzLmxlbmd0aDsKICAgIGlmIChsZW4gPT0gMCkgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBmaW5hbCBTdHJpbmcgbG9va3VwID0gdXJsU2FmZSA/IF9lbmNvZGVUYWJsZVVybFNhZmUgOiBfZW5jb2RlVGFibGU7CiAgICAvLyBTaXplIG9mIDI0IGJpdCBjaHVua3MuCiAgICBmaW5hbCBpbnQgcmVtYWluZGVyTGVuZ3RoID0gbGVuLnJlbWFpbmRlcigzKTsKICAgIGZpbmFsIGludCBjaHVua0xlbmd0aCA9IGxlbiAtIHJlbWFpbmRlckxlbmd0aDsKICAgIC8vIFNpemUgb2YgYmFzZSBvdXRwdXQuCiAgICBpbnQgb3V0cHV0TGVuID0gKChsZW4gfi8gMykgKiA0KSArICgocmVtYWluZGVyTGVuZ3RoID4gMCkgPyA0IDogMCk7CiAgICAvLyBBZGQgZXh0cmEgZm9yIGxpbmUgc2VwYXJhdG9ycy4KICAgIGlmIChhZGRMaW5lU2VwYXJhdG9yKSB7CiAgICAgIG91dHB1dExlbiArPSAoKG91dHB1dExlbiAtIDEpIH4vIExJTkVfTEVOR1RIKSA8PCAxOwogICAgfQogICAgTGlzdDxpbnQ+IG91dCA9IG5ldyBMaXN0PGludD4ob3V0cHV0TGVuKTsKCiAgICAvLyBFbmNvZGUgMjQgYml0IGNodW5rcy4KICAgIGludCBqID0gMCwgaSA9IDAsIGMgPSAwOwogICAgd2hpbGUgKGkgPCBjaHVua0xlbmd0aCkgewogICAgICBpbnQgeCA9ICgoYnl0ZXNbaSsrXSA8PCAxNikgJiAweEZGRkZGRikgfAogICAgICAgICAgKChieXRlc1tpKytdIDw8IDgpICYgMHhGRkZGRkYpIHwKICAgICAgICAgIGJ5dGVzW2krK107CiAgICAgIG91dFtqKytdID0gbG9va3VwLmNvZGVVbml0QXQoeCA+PiAxOCk7CiAgICAgIG91dFtqKytdID0gbG9va3VwLmNvZGVVbml0QXQoKHggPj4gMTIpICYgMHgzRik7CiAgICAgIG91dFtqKytdID0gbG9va3VwLmNvZGVVbml0QXQoKHggPj4gNikgJiAweDNGKTsKICAgICAgb3V0W2orK10gPSBsb29rdXAuY29kZVVuaXRBdCh4ICYgMHgzZik7CiAgICAgIC8vIEFkZCBvcHRpb25hbCBsaW5lIHNlcGFyYXRvciBmb3IgZWFjaCA3NiBjaGFyIG91dHB1dC4KICAgICAgaWYgKGFkZExpbmVTZXBhcmF0b3IgJiYgKytjID09IDE5ICYmIGogPCBvdXRwdXRMZW4gLSAyKSB7CiAgICAgICAgb3V0W2orK10gPSBDUjsKICAgICAgICBvdXRbaisrXSA9IExGOwogICAgICAgIGMgPSAwOwogICAgICB9CiAgICB9CgogICAgLy8gSWYgaW5wdXQgbGVuZ3RoIGlmIG5vdCBhIG11bHRpcGxlIG9mIDMsIGVuY29kZSByZW1haW5pbmcgYnl0ZXMgYW5kCiAgICAvLyBhZGQgcGFkZGluZy4KICAgIGlmIChyZW1haW5kZXJMZW5ndGggPT0gMSkgewogICAgICBpbnQgeCA9IGJ5dGVzW2ldOwogICAgICBvdXRbaisrXSA9IGxvb2t1cC5jb2RlVW5pdEF0KHggPj4gMik7CiAgICAgIG91dFtqKytdID0gbG9va3VwLmNvZGVVbml0QXQoKHggPDwgNCkgJiAweDNGKTsKICAgICAgb3V0W2orK10gPSBQQUQ7CiAgICAgIG91dFtqKytdID0gUEFEOwogICAgfSBlbHNlIGlmIChyZW1haW5kZXJMZW5ndGggPT0gMikgewogICAgICBpbnQgeCA9IGJ5dGVzW2ldOwogICAgICBpbnQgeSA9IGJ5dGVzW2kgKyAxXTsKICAgICAgb3V0W2orK10gPSBsb29rdXAuY29kZVVuaXRBdCh4ID4+IDIpOwogICAgICBvdXRbaisrXSA9IGxvb2t1cC5jb2RlVW5pdEF0KCgoeCA8PCA0KSB8ICh5ID4+IDQpKSAmIDB4M0YpOwogICAgICBvdXRbaisrXSA9IGxvb2t1cC5jb2RlVW5pdEF0KCh5IDw8IDIpICYgMHgzRik7CiAgICAgIG91dFtqKytdID0gUEFEOwogICAgfQoKICAgIHJldHVybiBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMob3V0KTsKICB9CgogIHN0YXRpYyBMaXN0PGludD4gYmFzZTY0U3RyaW5nVG9CeXRlcyhTdHJpbmcgaW5wdXQsCiAgICAgIFtib29sIGlnbm9yZUludmFsaWRDaGFyYWN0ZXJzID0gdHJ1ZV0pIHsKICAgIGludCBsZW4gPSBpbnB1dC5sZW5ndGg7CiAgICBpZiAobGVuID09IDApIHsKICAgICAgcmV0dXJuIG5ldyBMaXN0PGludD4oMCk7CiAgICB9CgogICAgLy8gQ291bnQgJ1xyJywgJ1xuJyBhbmQgaWxsZWdhbCBjaGFyYWN0ZXJzLCBGb3IgaWxsZWdhbCBjaGFyYWN0ZXJzLAogICAgLy8gaWYgW2lnbm9yZUludmFsaWRDaGFyYWN0ZXJzXSBpcyBmYWxzZSwgdGhyb3cgYW4gZXhjZXB0aW9uLgogICAgaW50IGV4dHJhc0xlbiA9IDA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGludCBjID0gX2RlY29kZVRhYmxlW2lucHV0LmNvZGVVbml0QXQoaSldOwogICAgICBpZiAoYyA8IDApIHsKICAgICAgICBleHRyYXNMZW4rKzsKICAgICAgICBpZiAoYyA9PSAtMiAmJiAhaWdub3JlSW52YWxpZENoYXJhY3RlcnMpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oJ0ludmFsaWQgY2hhcmFjdGVyOiAke2lucHV0W2ldfScpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmICgobGVuIC0gZXh0cmFzTGVuKSAlIDQgIT0gMCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKCcnJ1NpemUgb2YgQmFzZSA2NCBjaGFyYWN0ZXJzIGluIElucHV0CiAgICAgICAgICBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gSW5wdXQ6ICRpbnB1dCcnJyk7CiAgICB9CgogICAgLy8gQ291bnQgcGFkIGNoYXJhY3RlcnMsIGlnbm9yZSBpbGxlZ2FsIGNoYXJhY3RlcnMgYXQgdGhlIGVuZC4KICAgIGludCBwYWRMZW5ndGggPSAwOwogICAgZm9yIChpbnQgaSA9IGxlbiAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGludCBjdXJyZW50Q29kZVVuaXQgPSBpbnB1dC5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoX2RlY29kZVRhYmxlW2N1cnJlbnRDb2RlVW5pdF0gPiAwKSBicmVhazsKICAgICAgaWYgKGN1cnJlbnRDb2RlVW5pdCA9PSBQQUQpIHBhZExlbmd0aCsrOwogICAgfQogICAgaW50IG91dHB1dExlbiA9ICgoKGxlbiAtIGV4dHJhc0xlbikgKiA2KSA+PiAzKSAtIHBhZExlbmd0aDsKICAgIExpc3Q8aW50PiBvdXQgPSBuZXcgTGlzdDxpbnQ+KG91dHB1dExlbik7CgogICAgZm9yIChpbnQgaSA9IDAsIG8gPSAwOyBvIDwgb3V0cHV0TGVuOykgewogICAgICAvLyBBY2N1bXVsYXRlIDQgdmFsaWQgNiBiaXQgQmFzZSA2NCBjaGFyYWN0ZXJzIGludG8gYW4gaW50LgogICAgICBpbnQgeCA9IDA7CiAgICAgIGZvciAoaW50IGogPSA0OyBqID4gMDspIHsKICAgICAgICBpbnQgYyA9IF9kZWNvZGVUYWJsZVtpbnB1dC5jb2RlVW5pdEF0KGkrKyldOwogICAgICAgIGlmIChjID49IDApIHsKICAgICAgICAgIHggPSAoKHggPDwgNikgJiAweEZGRkZGRikgfCBjOwogICAgICAgICAgai0tOwogICAgICAgIH0KICAgICAgfQogICAgICBvdXRbbysrXSA9IHggPj4gMTY7CiAgICAgIGlmIChvIDwgb3V0cHV0TGVuKSB7CiAgICAgICAgb3V0W28rK10gPSAoeCA+PiA4KSAmIDB4RkY7CiAgICAgICAgaWYgKG8gPCBvdXRwdXRMZW4pIG91dFtvKytdID0geCAmIDB4RkY7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBvdXQ7CiAgfQp9CgovLyBDb25zdGFudHMuCmNvbnN0IF9NQVNLXzggPSAweGZmOwpjb25zdCBfTUFTS18zMiA9IDB4ZmZmZmZmZmY7CmNvbnN0IF9CSVRTX1BFUl9CWVRFID0gODsKY29uc3QgX0JZVEVTX1BFUl9XT1JEID0gNDsKCi8vIEJhc2UgY2xhc3MgZW5jYXBzdWxhdGluZyBjb21tb24gYmVoYXZpb3IgZm9yIGNyeXB0b2dyYXBoaWMgaGFzaAovLyBmdW5jdGlvbnMuCmFic3RyYWN0IGNsYXNzIF9IYXNoQmFzZSB7CiAgLy8gSGFzaGVyIHN0YXRlLgogIGZpbmFsIGludCBfY2h1bmtTaXplSW5Xb3JkczsKICBmaW5hbCBpbnQgX2RpZ2VzdFNpemVJbldvcmRzOwogIGZpbmFsIGJvb2wgX2JpZ0VuZGlhbldvcmRzOwogIGludCBfbGVuZ3RoSW5CeXRlcyA9IDA7CiAgTGlzdDxpbnQ+IF9wZW5kaW5nRGF0YTsKICBMaXN0PGludD4gX2N1cnJlbnRDaHVuazsKICBMaXN0PGludD4gX2g7CiAgYm9vbCBfZGlnZXN0Q2FsbGVkID0gZmFsc2U7CgogIF9IYXNoQmFzZSgKICAgICAgdGhpcy5fY2h1bmtTaXplSW5Xb3JkcywgdGhpcy5fZGlnZXN0U2l6ZUluV29yZHMsIHRoaXMuX2JpZ0VuZGlhbldvcmRzKQogICAgICA6IF9wZW5kaW5nRGF0YSA9IFtdIHsKICAgIF9jdXJyZW50Q2h1bmsgPSBuZXcgTGlzdChfY2h1bmtTaXplSW5Xb3Jkcyk7CiAgICBfaCA9IG5ldyBMaXN0KF9kaWdlc3RTaXplSW5Xb3Jkcyk7CiAgfQoKICAvLyBVcGRhdGUgdGhlIGhhc2hlciB3aXRoIG1vcmUgZGF0YS4KICBhZGQoTGlzdDxpbnQ+IGRhdGEpIHsKICAgIGlmIChfZGlnZXN0Q2FsbGVkKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKAogICAgICAgICAgJ0hhc2ggdXBkYXRlIG1ldGhvZCBjYWxsZWQgYWZ0ZXIgZGlnZXN0IHdhcyByZXRyaWV2ZWQnKTsKICAgIH0KICAgIF9sZW5ndGhJbkJ5dGVzICs9IGRhdGEubGVuZ3RoOwogICAgX3BlbmRpbmdEYXRhLmFkZEFsbChkYXRhKTsKICAgIF9pdGVyYXRlKCk7CiAgfQoKICAvLyBGaW5pc2ggdGhlIGhhc2ggY29tcHV0YXRpb24gYW5kIHJldHVybiB0aGUgZGlnZXN0IHN0cmluZy4KICBMaXN0PGludD4gY2xvc2UoKSB7CiAgICBpZiAoX2RpZ2VzdENhbGxlZCkgewogICAgICByZXR1cm4gX3Jlc3VsdEFzQnl0ZXMoKTsKICAgIH0KICAgIF9kaWdlc3RDYWxsZWQgPSB0cnVlOwogICAgX2ZpbmFsaXplRGF0YSgpOwogICAgX2l0ZXJhdGUoKTsKICAgIGFzc2VydChfcGVuZGluZ0RhdGEubGVuZ3RoID09IDApOwogICAgcmV0dXJuIF9yZXN1bHRBc0J5dGVzKCk7CiAgfQoKICAvLyBSZXR1cm5zIHRoZSBibG9jayBzaXplIG9mIHRoZSBoYXNoIGluIGJ5dGVzLgogIGludCBnZXQgYmxvY2tTaXplIHsKICAgIHJldHVybiBfY2h1bmtTaXplSW5Xb3JkcyAqIF9CWVRFU19QRVJfV09SRDsKICB9CgogIC8vIENyZWF0ZSBhIGZyZXNoIGluc3RhbmNlIG9mIHRoaXMgSGFzaC4KICBuZXdJbnN0YW5jZSgpOwoKICAvLyBPbmUgcm91bmQgb2YgdGhlIGhhc2ggY29tcHV0YXRpb24uCiAgX3VwZGF0ZUhhc2goTGlzdDxpbnQ+IG0pOwoKICAvLyBIZWxwZXIgbWV0aG9kcy4KICBfYWRkMzIoeCwgeSkgPT4gKHggKyB5KSAmIF9NQVNLXzMyOwogIF9yb3VuZFVwKHZhbCwgbikgPT4gKHZhbCArIG4gLSAxKSAmIC1uOwoKICAvLyBSb3RhdGUgbGVmdCBsaW1pdGluZyB0byB1bnNpZ25lZCAzMi1iaXQgdmFsdWVzLgogIGludCBfcm90bDMyKGludCB2YWwsIGludCBzaGlmdCkgewogICAgdmFyIG1vZF9zaGlmdCA9IHNoaWZ0ICYgMzE7CiAgICByZXR1cm4gKCh2YWwgPDwgbW9kX3NoaWZ0KSAmIF9NQVNLXzMyKSB8CiAgICAgICAgKCh2YWwgJiBfTUFTS18zMikgPj4gKDMyIC0gbW9kX3NoaWZ0KSk7CiAgfQoKICAvLyBDb21wdXRlIHRoZSBmaW5hbCByZXN1bHQgYXMgYSBsaXN0IG9mIGJ5dGVzIGZyb20gdGhlIGhhc2ggd29yZHMuCiAgTGlzdDxpbnQ+IF9yZXN1bHRBc0J5dGVzKCkgewogICAgdmFyIHJlc3VsdCA9IDxpbnQ+W107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IF9oLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc3VsdC5hZGRBbGwoX3dvcmRUb0J5dGVzKF9oW2ldKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8gQ29udmVydHMgYSBsaXN0IG9mIGJ5dGVzIHRvIGEgY2h1bmsgb2YgMzItYml0IHdvcmRzLgogIF9ieXRlc1RvQ2h1bmsoTGlzdDxpbnQ+IGRhdGEsIGludCBkYXRhSW5kZXgpIHsKICAgIGFzc2VydCgoZGF0YS5sZW5ndGggLSBkYXRhSW5kZXgpID49IChfY2h1bmtTaXplSW5Xb3JkcyAqIF9CWVRFU19QRVJfV09SRCkpOwoKICAgIGZvciAodmFyIHdvcmRJbmRleCA9IDA7IHdvcmRJbmRleCA8IF9jaHVua1NpemVJbldvcmRzOyB3b3JkSW5kZXgrKykgewogICAgICB2YXIgdzMgPSBfYmlnRW5kaWFuV29yZHMgPyBkYXRhW2RhdGFJbmRleF0gOiBkYXRhW2RhdGFJbmRleCArIDNdOwogICAgICB2YXIgdzIgPSBfYmlnRW5kaWFuV29yZHMgPyBkYXRhW2RhdGFJbmRleCArIDFdIDogZGF0YVtkYXRhSW5kZXggKyAyXTsKICAgICAgdmFyIHcxID0gX2JpZ0VuZGlhbldvcmRzID8gZGF0YVtkYXRhSW5kZXggKyAyXSA6IGRhdGFbZGF0YUluZGV4ICsgMV07CiAgICAgIHZhciB3MCA9IF9iaWdFbmRpYW5Xb3JkcyA/IGRhdGFbZGF0YUluZGV4ICsgM10gOiBkYXRhW2RhdGFJbmRleF07CiAgICAgIGRhdGFJbmRleCArPSA0OwogICAgICB2YXIgd29yZCA9ICh3MyAmIDB4ZmYpIDw8IDI0OwogICAgICB3b3JkIHw9ICh3MiAmIF9NQVNLXzgpIDw8IDE2OwogICAgICB3b3JkIHw9ICh3MSAmIF9NQVNLXzgpIDw8IDg7CiAgICAgIHdvcmQgfD0gKHcwICYgX01BU0tfOCk7CiAgICAgIF9jdXJyZW50Q2h1bmtbd29yZEluZGV4XSA9IHdvcmQ7CiAgICB9CiAgfQoKICAvLyBDb252ZXJ0IGEgMzItYml0IHdvcmQgdG8gZm91ciBieXRlcy4KICBMaXN0PGludD4gX3dvcmRUb0J5dGVzKGludCB3b3JkKSB7CiAgICBMaXN0PGludD4gYnl0ZXMgPSBuZXcgTGlzdChfQllURVNfUEVSX1dPUkQpOwogICAgYnl0ZXNbMF0gPSAod29yZCA+PiAoX2JpZ0VuZGlhbldvcmRzID8gMjQgOiAwKSkgJiBfTUFTS184OwogICAgYnl0ZXNbMV0gPSAod29yZCA+PiAoX2JpZ0VuZGlhbldvcmRzID8gMTYgOiA4KSkgJiBfTUFTS184OwogICAgYnl0ZXNbMl0gPSAod29yZCA+PiAoX2JpZ0VuZGlhbldvcmRzID8gOCA6IDE2KSkgJiBfTUFTS184OwogICAgYnl0ZXNbM10gPSAod29yZCA+PiAoX2JpZ0VuZGlhbldvcmRzID8gMCA6IDI0KSkgJiBfTUFTS184OwogICAgcmV0dXJuIGJ5dGVzOwogIH0KCiAgLy8gSXRlcmF0ZSB0aHJvdWdoIGRhdGEgdXBkYXRpbmcgdGhlIGhhc2ggY29tcHV0YXRpb24gZm9yIGVhY2gKICAvLyBjaHVuay4KICBfaXRlcmF0ZSgpIHsKICAgIHZhciBsZW4gPSBfcGVuZGluZ0RhdGEubGVuZ3RoOwogICAgdmFyIGNodW5rU2l6ZUluQnl0ZXMgPSBfY2h1bmtTaXplSW5Xb3JkcyAqIF9CWVRFU19QRVJfV09SRDsKICAgIGlmIChsZW4gPj0gY2h1bmtTaXplSW5CeXRlcykgewogICAgICB2YXIgaW5kZXggPSAwOwogICAgICBmb3IgKDsgKGxlbiAtIGluZGV4KSA+PSBjaHVua1NpemVJbkJ5dGVzOyBpbmRleCArPSBjaHVua1NpemVJbkJ5dGVzKSB7CiAgICAgICAgX2J5dGVzVG9DaHVuayhfcGVuZGluZ0RhdGEsIGluZGV4KTsKICAgICAgICBfdXBkYXRlSGFzaChfY3VycmVudENodW5rKTsKICAgICAgfQogICAgICBfcGVuZGluZ0RhdGEgPSBfcGVuZGluZ0RhdGEuc3VibGlzdChpbmRleCwgbGVuKTsKICAgIH0KICB9CgogIC8vIEZpbmFsaXplIHRoZSBkYXRhLiBBZGQgYSAxIGJpdCB0byB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlLiBFeHBhbmQgd2l0aAogIC8vIDAgYml0cyBhbmQgYWRkIHRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UuCiAgX2ZpbmFsaXplRGF0YSgpIHsKICAgIF9wZW5kaW5nRGF0YS5hZGQoMHg4MCk7CiAgICB2YXIgY29udGVudHNMZW5ndGggPSBfbGVuZ3RoSW5CeXRlcyArIDk7CiAgICB2YXIgY2h1bmtTaXplSW5CeXRlcyA9IF9jaHVua1NpemVJbldvcmRzICogX0JZVEVTX1BFUl9XT1JEOwogICAgdmFyIGZpbmFsaXplZExlbmd0aCA9IF9yb3VuZFVwKGNvbnRlbnRzTGVuZ3RoLCBjaHVua1NpemVJbkJ5dGVzKTsKICAgIHZhciB6ZXJvUGFkZGluZyA9IGZpbmFsaXplZExlbmd0aCAtIGNvbnRlbnRzTGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB6ZXJvUGFkZGluZzsgaSsrKSB7CiAgICAgIF9wZW5kaW5nRGF0YS5hZGQoMCk7CiAgICB9CiAgICB2YXIgbGVuZ3RoSW5CaXRzID0gX2xlbmd0aEluQnl0ZXMgKiBfQklUU19QRVJfQllURTsKICAgIGFzc2VydChsZW5ndGhJbkJpdHMgPCBwb3coMiwgMzIpKTsKICAgIGlmIChfYmlnRW5kaWFuV29yZHMpIHsKICAgICAgX3BlbmRpbmdEYXRhLmFkZEFsbChfd29yZFRvQnl0ZXMoMCkpOwogICAgICBfcGVuZGluZ0RhdGEuYWRkQWxsKF93b3JkVG9CeXRlcyhsZW5ndGhJbkJpdHMgJiBfTUFTS18zMikpOwogICAgfSBlbHNlIHsKICAgICAgX3BlbmRpbmdEYXRhLmFkZEFsbChfd29yZFRvQnl0ZXMobGVuZ3RoSW5CaXRzICYgX01BU0tfMzIpKTsKICAgICAgX3BlbmRpbmdEYXRhLmFkZEFsbChfd29yZFRvQnl0ZXMoMCkpOwogICAgfQogIH0KfQoKLy8gVGhlIE1ENSBoYXNoZXIgaXMgdXNlZCB0byBjb21wdXRlIGFuIE1ENSBtZXNzYWdlIGRpZ2VzdC4KY2xhc3MgX01ENSBleHRlbmRzIF9IYXNoQmFzZSB7CiAgX01ENSgpIDogc3VwZXIoMTYsIDQsIGZhbHNlKSB7CiAgICBfaFswXSA9IDB4Njc0NTIzMDE7CiAgICBfaFsxXSA9IDB4ZWZjZGFiODk7CiAgICBfaFsyXSA9IDB4OThiYWRjZmU7CiAgICBfaFszXSA9IDB4MTAzMjU0NzY7CiAgfQoKICAvLyBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgSGFzaC4KICBfTUQ1IG5ld0luc3RhbmNlKCkgewogICAgcmV0dXJuIG5ldyBfTUQ1KCk7CiAgfQoKICBzdGF0aWMgY29uc3QgX2sgPSBjb25zdCBbCiAgICAweGQ3NmFhNDc4LCAweGU4YzdiNzU2LCAweDI0MjA3MGRiLCAweGMxYmRjZWVlLCAweGY1N2MwZmFmLCAweDQ3ODdjNjJhLCAvLwogICAgMHhhODMwNDYxMywgMHhmZDQ2OTUwMSwgMHg2OTgwOThkOCwgMHg4YjQ0ZjdhZiwgMHhmZmZmNWJiMSwgMHg4OTVjZDdiZSwgLy8KICAgIDB4NmI5MDExMjIsIDB4ZmQ5ODcxOTMsIDB4YTY3OTQzOGUsIDB4NDliNDA4MjEsIDB4ZjYxZTI1NjIsIDB4YzA0MGIzNDAsIC8vCiAgICAweDI2NWU1YTUxLCAweGU5YjZjN2FhLCAweGQ2MmYxMDVkLCAweDAyNDQxNDUzLCAweGQ4YTFlNjgxLCAweGU3ZDNmYmM4LCAvLwogICAgMHgyMWUxY2RlNiwgMHhjMzM3MDdkNiwgMHhmNGQ1MGQ4NywgMHg0NTVhMTRlZCwgMHhhOWUzZTkwNSwgMHhmY2VmYTNmOCwgLy8KICAgIDB4Njc2ZjAyZDksIDB4OGQyYTRjOGEsIDB4ZmZmYTM5NDIsIDB4ODc3MWY2ODEsIDB4NmQ5ZDYxMjIsIDB4ZmRlNTM4MGMsIC8vCiAgICAweGE0YmVlYTQ0LCAweDRiZGVjZmE5LCAweGY2YmI0YjYwLCAweGJlYmZiYzcwLCAweDI4OWI3ZWM2LCAweGVhYTEyN2ZhLCAvLwogICAgMHhkNGVmMzA4NSwgMHgwNDg4MWQwNSwgMHhkOWQ0ZDAzOSwgMHhlNmRiOTllNSwgMHgxZmEyN2NmOCwgMHhjNGFjNTY2NSwgLy8KICAgIDB4ZjQyOTIyNDQsIDB4NDMyYWZmOTcsIDB4YWI5NDIzYTcsIDB4ZmM5M2EwMzksIDB4NjU1YjU5YzMsIDB4OGYwY2NjOTIsIC8vCiAgICAweGZmZWZmNDdkLCAweDg1ODQ1ZGQxLCAweDZmYTg3ZTRmLCAweGZlMmNlNmUwLCAweGEzMDE0MzE0LCAweDRlMDgxMWExLCAvLwogICAgMHhmNzUzN2U4MiwgMHhiZDNhZjIzNSwgMHgyYWQ3ZDJiYiwgMHhlYjg2ZDM5MQogIF07CgogIHN0YXRpYyBjb25zdCBfciA9IGNvbnN0IFsKICAgIDcsIDEyLCAxNywgMjIsIDcsIDEyLCAxNywgMjIsIDcsIDEyLCAxNywgMjIsIDcsIDEyLCAxNywgMjIsIDUsIDksIDE0LCAvLwogICAgMjAsIDUsIDksIDE0LCAyMCwgNSwgOSwgMTQsIDIwLCA1LCA5LCAxNCwgMjAsIDQsIDExLCAxNiwgMjMsIDQsIDExLCAvLwogICAgMTYsIDIzLCA0LCAxMSwgMTYsIDIzLCA0LCAxMSwgMTYsIDIzLCA2LCAxMCwgMTUsIDIxLCA2LCAxMCwgMTUsIDIxLCA2LCAvLwogICAgMTAsIDE1LCAyMSwgNiwgMTAsIDE1LCAyMQogIF07CgogIC8vIENvbXB1dGUgb25lIGl0ZXJhdGlvbiBvZiB0aGUgTUQ1IGFsZ29yaXRobSB3aXRoIGEgY2h1bmsgb2YKICAvLyAxNiAzMi1iaXQgcGllY2VzLgogIHZvaWQgX3VwZGF0ZUhhc2goTGlzdDxpbnQ+IG0pIHsKICAgIGFzc2VydChtLmxlbmd0aCA9PSAxNik7CgogICAgdmFyIGEgPSBfaFswXTsKICAgIHZhciBiID0gX2hbMV07CiAgICB2YXIgYyA9IF9oWzJdOwogICAgdmFyIGQgPSBfaFszXTsKCiAgICB2YXIgdDA7CiAgICB2YXIgdDE7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2NDsgaSsrKSB7CiAgICAgIGlmIChpIDwgMTYpIHsKICAgICAgICB0MCA9IChiICYgYykgfCAoKH5iICYgX01BU0tfMzIpICYgZCk7CiAgICAgICAgdDEgPSBpOwogICAgICB9IGVsc2UgaWYgKGkgPCAzMikgewogICAgICAgIHQwID0gKGQgJiBiKSB8ICgofmQgJiBfTUFTS18zMikgJiBjKTsKICAgICAgICB0MSA9ICgoNSAqIGkpICsgMSkgJSAxNjsKICAgICAgfSBlbHNlIGlmIChpIDwgNDgpIHsKICAgICAgICB0MCA9IGIgXiBjIF4gZDsKICAgICAgICB0MSA9ICgoMyAqIGkpICsgNSkgJSAxNjsKICAgICAgfSBlbHNlIHsKICAgICAgICB0MCA9IGMgXiAoYiB8ICh+ZCAmIF9NQVNLXzMyKSk7CiAgICAgICAgdDEgPSAoNyAqIGkpICUgMTY7CiAgICAgIH0KCiAgICAgIHZhciB0ZW1wID0gZDsKICAgICAgZCA9IGM7CiAgICAgIGMgPSBiOwogICAgICBiID0gX2FkZDMyKAogICAgICAgICAgYiwgX3JvdGwzMihfYWRkMzIoX2FkZDMyKGEsIHQwKSwgX2FkZDMyKF9rW2ldLCBtW3QxXSkpLCBfcltpXSkpOwogICAgICBhID0gdGVtcDsKICAgIH0KCiAgICBfaFswXSA9IF9hZGQzMihhLCBfaFswXSk7CiAgICBfaFsxXSA9IF9hZGQzMihiLCBfaFsxXSk7CiAgICBfaFsyXSA9IF9hZGQzMihjLCBfaFsyXSk7CiAgICBfaFszXSA9IF9hZGQzMihkLCBfaFszXSk7CiAgfQp9CgovLyBUaGUgU0hBMSBoYXNoZXIgaXMgdXNlZCB0byBjb21wdXRlIGFuIFNIQTEgbWVzc2FnZSBkaWdlc3QuCmNsYXNzIF9TSEExIGV4dGVuZHMgX0hhc2hCYXNlIHsKICAvLyBDb25zdHJ1Y3QgYSBTSEExIGhhc2hlciBvYmplY3QuCiAgX1NIQTEoKQogICAgICA6IF93ID0gbmV3IExpc3QoODApLAogICAgICAgIHN1cGVyKDE2LCA1LCB0cnVlKSB7CiAgICBfaFswXSA9IDB4Njc0NTIzMDE7CiAgICBfaFsxXSA9IDB4RUZDREFCODk7CiAgICBfaFsyXSA9IDB4OThCQURDRkU7CiAgICBfaFszXSA9IDB4MTAzMjU0NzY7CiAgICBfaFs0XSA9IDB4QzNEMkUxRjA7CiAgfQoKICAvLyBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgSGFzaC4KICBfU0hBMSBuZXdJbnN0YW5jZSgpIHsKICAgIHJldHVybiBuZXcgX1NIQTEoKTsKICB9CgogIC8vIENvbXB1dGUgb25lIGl0ZXJhdGlvbiBvZiB0aGUgU0hBMSBhbGdvcml0aG0gd2l0aCBhIGNodW5rIG9mCiAgLy8gMTYgMzItYml0IHBpZWNlcy4KICB2b2lkIF91cGRhdGVIYXNoKExpc3Q8aW50PiBtKSB7CiAgICBhc3NlcnQobS5sZW5ndGggPT0gMTYpOwoKICAgIHZhciBhID0gX2hbMF07CiAgICB2YXIgYiA9IF9oWzFdOwogICAgdmFyIGMgPSBfaFsyXTsKICAgIHZhciBkID0gX2hbM107CiAgICB2YXIgZSA9IF9oWzRdOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODA7IGkrKykgewogICAgICBpZiAoaSA8IDE2KSB7CiAgICAgICAgX3dbaV0gPSBtW2ldOwogICAgICB9IGVsc2Ugewog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IHwgYXNjdGltZS1kYXRlCiAgLy8gcmZjMTEyMy1kYXRlID0gd2tkYXkgIiwiIFNQIGRhdGUxIFNQIHRpbWUgU1AgIkdNVCIKICAvLyByZmM4NTAtZGF0ZSAgPSB3ZWVrZGF5ICIsIiBTUCBkYXRlMiBTUCB0aW1lIFNQICJHTVQiCiAgLy8gYXNjdGltZS1kYXRlID0gd2tkYXkgU1AgZGF0ZTMgU1AgdGltZSBTUCA0RElHSVQKICAvLyBkYXRlMSAgICAgICAgPSAyRElHSVQgU1AgbW9udGggU1AgNERJR0lUCiAgLy8gICAgICAgICAgICAgICAgOyBkYXkgbW9udGggeWVhciAoZS5nLiwgMDIgSnVuIDE5ODIpCiAgLy8gZGF0ZTIgICAgICAgID0gMkRJR0lUICItIiBtb250aCAiLSIgMkRJR0lUCiAgLy8gICAgICAgICAgICAgICAgOyBkYXktbW9udGgteWVhciAoZS5nLiwgMDItSnVuLTgyKQogIC8vIGRhdGUzICAgICAgICA9IG1vbnRoIFNQICggMkRJR0lUIHwgKCBTUCAxRElHSVQgKSkKICAvLyAgICAgICAgICAgICAgICA7IG1vbnRoIGRheSAoZS5nLiwgSnVuICAyKQogIC8vIHRpbWUgICAgICAgICA9IDJESUdJVCAiOiIgMkRJR0lUICI6IiAyRElHSVQKICAvLyAgICAgICAgICAgICAgICA7IDAwOjAwOjAwIC0gMjM6NTk6NTkKICAvLyB3a2RheSAgICAgICAgPSAiTW9uIiB8ICJUdWUiIHwgIldlZCIKICAvLyAgICAgICAgICAgICAgfCAiVGh1IiB8ICJGcmkiIHwgIlNhdCIgfCAiU3VuIgogIC8vIHdlZWtkYXkgICAgICA9ICJNb25kYXkiIHwgIlR1ZXNkYXkiIHwgIldlZG5lc2RheSIKICAvLyAgICAgICAgICAgICAgfCAiVGh1cnNkYXkiIHwgIkZyaWRheSIgfCAiU2F0dXJkYXkiIHwgIlN1bmRheSIKICAvLyBtb250aCAgICAgICAgPSAiSmFuIiB8ICJGZWIiIHwgIk1hciIgfCAiQXByIgogIC8vICAgICAgICAgICAgICB8ICJNYXkiIHwgIkp1biIgfCAiSnVsIiB8ICJBdWciCiAgLy8gICAgICAgICAgICAgIHwgIlNlcCIgfCAiT2N0IiB8ICJOb3YiIHwgIkRlYyIKCiAgLyoqCiAgICogRm9ybWF0IGEgZGF0ZSBhY2NvcmRpbmcgdG8KICAgKiBbUkZDLTExMjNdKGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzExMjMgIlJGQy0xMTIzIiksCiAgICogZS5nLiBgVGh1LCAxIEphbiAxOTcwIDAwOjAwOjAwIEdNVGAuCiAgICovCiAgc3RhdGljIFN0cmluZyBmb3JtYXQoRGF0ZVRpbWUgZGF0ZSkgewogICAgY29uc3QgTGlzdCB3a2RheSA9IGNvbnN0IFsiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiLCAiU3VuIl07CiAgICBjb25zdCBMaXN0IG1vbnRoID0gY29uc3QgWwogICAgICAiSmFuIiwKICAgICAgIkZlYiIsCiAgICAgICJNYXIiLAogICAgICAiQXByIiwKICAgICAgIk1heSIsCiAgICAgICJKdW4iLAogICAgICAiSnVsIiwKICAgICAgIkF1ZyIsCiAgICAgICJTZXAiLAogICAgICAiT2N0IiwKICAgICAgIk5vdiIsCiAgICAgICJEZWMiCiAgICBdOwoKICAgIERhdGVUaW1lIGQgPSBkYXRlLnRvVXRjKCk7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCkKICAgICAgLi53cml0ZSh3a2RheVtkLndlZWtkYXkgLSAxXSkKICAgICAgLi53cml0ZSgiLCAiKQogICAgICAuLndyaXRlKGQuZGF5IDw9IDkgPyAiMCIgOiAiIikKICAgICAgLi53cml0ZShkLmRheS50b1N0cmluZygpKQogICAgICAuLndyaXRlKCIgIikKICAgICAgLi53cml0ZShtb250aFtkLm1vbnRoIC0gMV0pCiAgICAgIC4ud3JpdGUoIiAiKQogICAgICAuLndyaXRlKGQueWVhci50b1N0cmluZygpKQogICAgICAuLndyaXRlKGQuaG91ciA8PSA5ID8gIiAwIiA6ICIgIikKICAgICAgLi53cml0ZShkLmhvdXIudG9TdHJpbmcoKSkKICAgICAgLi53cml0ZShkLm1pbnV0ZSA8PSA5ID8gIjowIiA6ICI6IikKICAgICAgLi53cml0ZShkLm1pbnV0ZS50b1N0cmluZygpKQogICAgICAuLndyaXRlKGQuc2Vjb25kIDw9IDkgPyAiOjAiIDogIjoiKQogICAgICAuLndyaXRlKGQuc2Vjb25kLnRvU3RyaW5nKCkpCiAgICAgIC4ud3JpdGUoIiBHTVQiKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgLyoqCiAgICogUGFyc2UgYSBkYXRlIHN0cmluZyBpbiBlaXRoZXIgb2YgdGhlIGZvcm1hdHMKICAgKiBbUkZDLTExMjNdKGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzExMjMgIlJGQy0xMTIzIiksCiAgICogW1JGQy04NTBdKGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzg1MCAiUkZDLTg1MCIpIG9yCiAgICogQU5TSSBDJ3MgYXNjdGltZSgpIGZvcm1hdC4gVGhlc2UgZm9ybWF0cyBhcmUgbGlzdGVkIGhlcmUuCiAgICoKICAgKiAgICAgVGh1LCAxIEphbiAxOTcwIDAwOjAwOjAwIEdNVAogICAqICAgICBUaHVyc2RheSwgMS1KYW4tMTk3MCAwMDowMDowMCBHTVQKICAgKiAgICAgVGh1IEphbiAgMSAwMDowMDowMCAxOTcwCiAgICoKICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgW1JGQy0yNjE2IHNlY3Rpb24KICAgKiAzLjEuMV0oaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjYxNiNzZWN0aW9uLTMuMy4xCiAgICogIlJGQy0yNjE2IHNlY3Rpb24gMy4xLjEiKS4KICAgKi8KICBzdGF0aWMgRGF0ZVRpbWUgcGFyc2UoU3RyaW5nIGRhdGUpIHsKICAgIGZpbmFsIGludCBTUCA9IDMyOwogICAgY29uc3QgTGlzdCB3a2RheXMgPSBjb25zdCBbIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0IiwgIlN1biJdOwogICAgY29uc3QgTGlzdCB3ZWVrZGF5cyA9IGNvbnN0IFsKICAgICAgIk1vbmRheSIsCiAgICAgICJUdWVzZGF5IiwKICAgICAgIldlZG5lc2RheSIsCiAgICAgICJUaHVyc2RheSIsCiAgICAgICJGcmlkYXkiLAogICAgICAiU2F0dXJkYXkiLAogICAgICAiU3VuZGF5IgogICAgXTsKICAgIGNvbnN0IExpc3QgbW9udGhzID0gY29uc3QgWwogICAgICAiSmFuIiwKICAgICAgIkZlYiIsCiAgICAgICJNYXIiLAogICAgICAiQXByIiwKICAgICAgIk1heSIsCiAgICAgICJKdW4iLAogICAgICAiSnVsIiwKICAgICAgIkF1ZyIsCiAgICAgICJTZXAiLAogICAgICAiT2N0IiwKICAgICAgIk5vdiIsCiAgICAgICJEZWMiCiAgICBdOwogICAgY29uc3QgTGlzdCB3a2RheXNMb3dlckNhc2UgPSBjb25zdCBbCiAgICAgICJtb24iLAogICAgICAidHVlIiwKICAgICAgIndlZCIsCiAgICAgICJ0aHUiLAogICAgICAiZnJpIiwKICAgICAgInNhdCIsCiAgICAgICJzdW4iCiAgICBdOwogICAgY29uc3QgTGlzdCB3ZWVrZGF5c0xvd2VyQ2FzZSA9IGNvbnN0IFsKICAgICAgIm1vbmRheSIsCiAgICAgICJ0dWVzZGF5IiwKICAgICAgIndlZG5lc2RheSIsCiAgICAgICJ0aHVyc2RheSIsCiAgICAgICJmcmlkYXkiLAogICAgICAic2F0dXJkYXkiLAogICAgICAic3VuZGF5IgogICAgXTsKICAgIGNvbnN0IExpc3QgbW9udGhzTG93ZXJDYXNlID0gY29uc3QgWwogICAgICAiamFuIiwKICAgICAgImZlYiIsCiAgICAgICJtYXIiLAogICAgICAiYXByIiwKICAgICAgIm1heSIsCiAgICAgICJqdW4iLAogICAgICAianVsIiwKICAgICAgImF1ZyIsCiAgICAgICJzZXAiLAogICAgICAib2N0IiwKICAgICAgIm5vdiIsCiAgICAgICJkZWMiCiAgICBdOwoKICAgIGZpbmFsIGludCBmb3JtYXRSZmMxMTIzID0gMDsKICAgIGZpbmFsIGludCBmb3JtYXRSZmM4NTAgPSAxOwogICAgZmluYWwgaW50IGZvcm1hdEFzY3RpbWUgPSAyOwoKICAgIGludCBpbmRleCA9IDA7CiAgICBTdHJpbmcgdG1wOwogICAgaW50IGZvcm1hdDsKCiAgICB2b2lkIGV4cGVjdChTdHJpbmcgcykgewogICAgICBpZiAoZGF0ZS5sZW5ndGggLSBpbmRleCA8IHMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIkludmFsaWQgSFRUUCBkYXRlICRkYXRlIik7CiAgICAgIH0KICAgICAgU3RyaW5nIHRtcCA9IGRhdGUuc3Vic3RyaW5nKGluZGV4LCBpbmRleCArIHMubGVuZ3RoKTsKICAgICAgaWYgKHRtcCAhPSBzKSB7CiAgICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIkludmFsaWQgSFRUUCBkYXRlICRkYXRlIik7CiAgICAgIH0KICAgICAgaW5kZXggKz0gcy5sZW5ndGg7CiAgICB9CgogICAgaW50IGV4cGVjdFdlZWtkYXkoKSB7CiAgICAgIGludCB3ZWVrZGF5OwogICAgICAvLyBUaGUgZm9ybWF0dGluZyBvZiB0aGUgd2Vla2RheSBzaWduYWxzIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGUgc3RyaW5nLgogICAgICBpbnQgcG9zID0gZGF0ZS5pbmRleE9mKCIsIiwgaW5kZXgpOwogICAgICBpZiAocG9zID09IC0xKSB7CiAgICAgICAgaW50IHBvcyA9IGRhdGUuaW5kZXhPZigiICIsIGluZGV4KTsKICAgICAgICBpZiAocG9zID09IC0xKSB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigiSW52YWxpZCBIVFRQIGRhdGUgJGRhdGUiKTsKICAgICAgICB0bXAgPSBkYXRlLnN1YnN0cmluZyhpbmRleCwgcG9zKTsKICAgICAgICBpbmRleCA9IHBvcyArIDE7CiAgICAgICAgd2Vla2RheSA9IHdrZGF5cy5pbmRleE9mKHRtcCk7CiAgICAgICAgaWYgKHdlZWtkYXkgIT0gLTEpIHsKICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdEFzY3RpbWU7CiAgICAgICAgICByZXR1cm4gd2Vla2RheTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdG1wID0gZGF0ZS5zdWJzdHJpbmcoaW5kZXgsIHBvcyk7CiAgICAgICAgaW5kZXggPSBwb3MgKyAxOwogICAgICAgIHdlZWtkYXkgPSB3a2RheXMuaW5kZXhPZih0bXApOwogICAgICAgIGlmICh3ZWVrZGF5ICE9IC0xKSB7CiAgICAgICAgICBmb3JtYXQgPSBmb3JtYXRSZmMxMTIzOwogICAgICAgICAgcmV0dXJuIHdlZWtkYXk7CiAgICAgICAgfQogICAgICAgIHdlZWtkYXkgPSB3ZWVrZGF5cy5pbmRleE9mKHRtcCk7CiAgICAgICAgaWYgKHdlZWtkYXkgIT0gLTEpIHsKICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdFJmYzg1MDsKICAgICAgICAgIHJldHVybiB3ZWVrZGF5OwogICAgICAgIH0KICAgICAgfQogICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigiSW52YWxpZCBIVFRQIGRhdGUgJGRhdGUiKTsKICAgIH0KCiAgICBpbnQgZXhwZWN0TW9udGgoU3RyaW5nIHNlcGFyYXRvcikgewogICAgICBpbnQgcG9zID0gZGF0ZS5pbmRleE9mKHNlcGFyYXRvciwgaW5kZXgpOwogICAgICBpZiAocG9zIC0gaW5kZXggIT0gMykgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIkludmFsaWQgSFRUUCBkYXRlICRkYXRlIik7CiAgICAgIHRtcCA9IGRhdGUuc3Vic3RyaW5nKGluZGV4LCBwb3MpOwogICAgICBpbmRleCA9IHBvcyArIDE7CiAgICAgIGludCBtb250aCA9IG1vbnRocy5pbmRleE9mKHRtcCk7CiAgICAgIGlmIChtb250aCAhPSAtMSkgcmV0dXJuIG1vbnRoOwogICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigiSW52YWxpZCBIVFRQIGRhdGUgJGRhdGUiKTsKICAgIH0KCiAgICBpbnQgZXhwZWN0TnVtKFN0cmluZyBzZXBhcmF0b3IpIHsKICAgICAgaW50IHBvczsKICAgICAgaWYgKHNlcGFyYXRvci5sZW5ndGggPiAwKSB7CiAgICAgICAgcG9zID0gZGF0ZS5pbmRleE9mKHNlcGFyYXRvciwgaW5kZXgpOwogICAgICB9IGVsc2UgewogICAgICAgIHBvcyA9IGRhdGUubGVuZ3RoOwogICAgICB9CiAgICAgIFN0cmluZyB0bXAgPSBkYXRlLnN1YnN0cmluZyhpbmRleCwgcG9zKTsKICAgICAgaW5kZXggPSBwb3MgKyBzZXBhcmF0b3IubGVuZ3RoOwogICAgICB0cnkgewogICAgICAgIGludCB2YWx1ZSA9IGludC5wYXJzZSh0bXApOwogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gY2F0Y2ggKGUpIHsKICAgICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigiSW52YWxpZCBIVFRQIGRhdGUgJGRhdGUiKTsKICAgICAgfQogICAgfQoKICAgIHZvaWQgZXhwZWN0RW5kKCkgewogICAgICBpZiAoaW5kZXggIT0gZGF0ZS5sZW5ndGgpIHsKICAgICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigiSW52YWxpZCBIVFRQIGRhdGUgJGRhdGUiKTsKICAgICAgfQogICAgfQoKICAgIGludCB3ZWVrZGF5ID0gZXhwZWN0V2Vla2RheSgpOwogICAgaW50IGRheTsKICAgIGludCBtb250aDsKICAgIGludCB5ZWFyOwogICAgaW50IGhvdXJzOwogICAgaW50IG1pbnV0ZXM7CiAgICBpbnQgc2Vjb25kczsKICAgIGlmIChmb3JtYXQgPT0gZm9ybWF0QXNjdGltZSkgewogICAgICBtb250aCA9IGV4cGVjdE1vbnRoKCIgIik7CiAgICAgIGlmIChkYXRlLmNvZGVVbml0QXQoaW5kZXgpID09IFNQKSBpbmRleCsrOwogICAgICBkYXkgPSBleHBlY3ROdW0oIiAiKTsKICAgICAgaG91cnMgPSBleHBlY3ROdW0oIjoiKTsKICAgICAgbWludXRlcyA9IGV4cGVjdE51bSgiOiIpOwogICAgICBzZWNvbmRzID0gZXhwZWN0TnVtKCIgIik7CiAgICAgIHllYXIgPSBleHBlY3ROdW0oIiIpOwogICAgfSBlbHNlIHsKICAgICAgZXhwZWN0KCIgIik7CiAgICAgIGRheSA9IGV4cGVjdE51bShmb3JtYXQgPT0gZm9ybWF0UmZjMTEyMyA/ICIgIiA6ICItIik7CiAgICAgIG1vbnRoID0gZXhwZWN0TW9udGgoZm9ybWF0ID09IGZvcm1hdFJmYzExMjMgPyAiICIgOiAiLSIpOwogICAgICB5ZWFyID0gZXhwZWN0TnVtKCIgIik7CiAgICAgIGhvdXJzID0gZXhwZWN0TnVtKCI6Iik7CiAgICAgIG1pbnV0ZXMgPSBleHBlY3ROdW0oIjoiKTsKICAgICAgc2Vjb25kcyA9IGV4cGVjdE51bSgiICIpOwogICAgICBleHBlY3QoIkdNVCIpOwogICAgfQogICAgZXhwZWN0RW5kKCk7CiAgICByZXR1cm4gbmV3IERhdGVUaW1lLnV0Yyh5ZWFyLCBtb250aCArIDEsIGRheSwgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIDApOwogIH0KCiAgLy8gUGFyc2UgYSBjb29raWUgZGF0ZSBzdHJpbmcuCiAgc3RhdGljIERhdGVUaW1lIF9wYXJzZUNvb2tpZURhdGUoU3RyaW5nIGRhdGUpIHsKICAgIGNvbnN0IExpc3QgbW9udGhzTG93ZXJDYXNlID0gY29uc3QgWwogICAgICAiamFuIiwKICAgICAgImZlYiIsCiAgICAgICJtYXIiLAogICAgICAiYXByIiwKICAgICAgIm1heSIsCiAgICAgICJqdW4iLAogICAgICAianVsIiwKICAgICAgImF1ZyIsCiAgICAgICJzZXAiLAogICAgICAib2N0IiwKICAgICAgIm5vdiIsCiAgICAgICJkZWMiCiAgICBdOwoKICAgIGludCBwb3NpdGlvbiA9IDA7CgogICAgdm9pZCBlcnJvcigpIHsKICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIkludmFsaWQgY29va2llIGRhdGUgJGRhdGUiKTsKICAgIH0KCiAgICBib29sIGlzRW5kKCkgPT4gcG9zaXRpb24gPT0gZGF0ZS5sZW5ndGg7CgogICAgYm9vbCBpc0RlbGltaXRlcihTdHJpbmcgcykgewogICAgICBpbnQgY2hhciA9IHMuY29kZVVuaXRBdCgwKTsKICAgICAgaWYgKGNoYXIgPT0gMHgwOSkgcmV0dXJuIHRydWU7CiAgICAgIGlmIChjaGFyID49IDB4MjAgJiYgY2hhciA8PSAweDJGKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKGNoYXIgPj0gMHgzQiAmJiBjaGFyIDw9IDB4NDApIHJldHVybiB0cnVlOwogICAgICBpZiAoY2hhciA+PSAweDVCICYmIGNoYXIgPD0gMHg2MCkgcmV0dXJuIHRydWU7CiAgICAgIGlmIChjaGFyID49IDB4N0IgJiYgY2hhciA8PSAweDdFKSByZXR1cm4gdHJ1ZTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGJvb2wgaXNOb25EZWxpbWl0ZXIoU3RyaW5nIHMpIHsKICAgICAgaW50IGNoYXIgPSBzLmNvZGVVbml0QXQoMCk7CiAgICAgIGlmIChjaGFyID49IDB4MDAgJiYgY2hhciA8PSAweDA4KSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKGNoYXIgPj0gMHgwQSAmJiBjaGFyIDw9IDB4MUYpIHJldHVybiB0cnVlOwogICAgICBpZiAoY2hhciA+PSAweDMwICYmIGNoYXIgPD0gMHgzOSkgcmV0dXJuIHRydWU7IC8vIERpZ2l0CiAgICAgIGlmIChjaGFyID09IDB4M0EpIHJldHVybiB0cnVlOyAvLyAnOicKICAgICAgaWYgKGNoYXIgPj0gMHg0MSAmJiBjaGFyIDw9IDB4NUEpIHJldHVybiB0cnVlOyAvLyBBbHBoYQogICAgICBpZiAoY2hhciA+PSAweDYxICYmIGNoYXIgPD0gMHg3QSkgcmV0dXJuIHRydWU7IC8vIEFscGhhCiAgICAgIGlmIChjaGFyID49IDB4N0YgJiYgY2hhciA8PSAweEZGKSByZXR1cm4gdHJ1ZTsgLy8gQWxwaGEKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGJvb2wgaXNEaWdpdChTdHJpbmcgcykgewogICAgICBpbnQgY2hhciA9IHMuY29kZVVuaXRBdCgwKTsKICAgICAgaWYgKGNoYXIgPiAweDJGICYmIGNoYXIgPCAweDNBKSByZXR1cm4gdHJ1ZTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGludCBnZXRNb250aChTdHJpbmcgbW9udGgpIHsKICAgICAgaWYgKG1vbnRoLmxlbmd0aCA8IDMpIHJldHVybiAtMTsKICAgICAgcmV0dXJuIG1vbnRoc0xvd2VyQ2FzZS5pbmRleE9mKG1vbnRoLnN1YnN0cmluZygwLCAzKSk7CiAgICB9CgogICAgaW50IHRvSW50KFN0cmluZyBzKSB7CiAgICAgIGludCBpbmRleCA9IDA7CiAgICAgIGZvciAoOyBpbmRleCA8IHMubGVuZ3RoICYmIGlzRGlnaXQoc1tpbmRleF0pOyBpbmRleCsrKTsKICAgICAgcmV0dXJuIGludC5wYXJzZShzLnN1YnN0cmluZygwLCBpbmRleCkpOwogICAgfQoKICAgIHZhciB0b2tlbnMgPSBbXTsKICAgIHdoaWxlICghaXNFbmQoKSkgewogICAgICB3aGlsZSAoIWlzRW5kKCkgJiYgaXNEZWxpbWl0ZXIoZGF0ZVtwb3NpdGlvbl0pKSBwb3NpdGlvbisrOwogICAgICBpbnQgc3RhcnQgPSBwb3NpdGlvbjsKICAgICAgd2hpbGUgKCFpc0VuZCgpICYmIGlzTm9uRGVsaW1pdGVyKGRhdGVbcG9zaXRpb25dKSkgcG9zaXRpb24rKzsKICAgICAgdG9rZW5zLmFkZChkYXRlLnN1YnN0cmluZyhzdGFydCwgcG9zaXRpb24pLnRvTG93ZXJDYXNlKCkpOwogICAgICB3aGlsZSAoIWlzRW5kKCkgJiYgaXNEZWxpbWl0ZXIoZGF0ZVtwb3NpdGlvbl0pKSBwb3NpdGlvbisrOwogICAgfQoKICAgIFN0cmluZyB0aW1lU3RyOwogICAgU3RyaW5nIGRheU9mTW9udGhTdHI7CiAgICBTdHJpbmcgbW9udGhTdHI7CiAgICBTdHJpbmcgeWVhclN0cjsKCiAgICBmb3IgKHZhciB0b2tlbiBpbiB0b2tlbnMpIHsKICAgICAgaWYgKHRva2VuLmxlbmd0aCA8IDEpIGNvbnRpbnVlOwogICAgICBpZiAodGltZVN0ciA9PSBudWxsICYmCiAgICAgICAgICB0b2tlbi5sZW5ndGggPj0gNSAmJgogICAgICAgICAgaXNEaWdpdCh0b2tlblswXSkgJiYKICAgICAgICAgICh0b2tlblsxXSA9PSAiOiIgfHwgKGlzRGlnaXQodG9rZW5bMV0pICYmIHRva2VuWzJdID09ICI6IikpKSB7CiAgICAgICAgdGltZVN0ciA9IHRva2VuOwogICAgICB9IGVsc2UgaWYgKGRheU9mTW9udGhTdHIgPT0gbnVsbCAmJiBpc0RpZ2l0KHRva2VuWzBdKSkgewogICAgICAgIGRheU9mTW9udGhTdHIgPSB0b2tlbjsKICAgICAgfSBlbHNlIGlmIChtb250aFN0ciA9PSBudWxsICYmIGdldE1vbnRoKHRva2VuKSA+PSAwKSB7CiAgICAgICAgbW9udGhTdHIgPSB0b2tlbjsKICAgICAgfSBlbHNlIGlmICh5ZWFyU3RyID09IG51bGwgJiYKICAgICAgICAgIHRva2VuLmxlbmd0aCA+PSAyICYmCiAgICAgICAgICBpc0RpZ2l0KHRva2VuWzBdKSAmJgogICAgICAgICAgaXNEaWdpdCh0b2tlblsxXSkpIHsKICAgICAgICB5ZWFyU3RyID0gdG9rZW47CiAgICAgIH0KICAgIH0KCiAgICBpZiAodGltZVN0ciA9PSBudWxsIHx8CiAgICAgICAgZGF5T2ZNb250aFN0ciA9PSBudWxsIHx8CiAgICAgICAgbW9udGhTdHIgPT0gbnVsbCB8fAogICAgICAgIHllYXJTdHIgPT0gbnVsbCkgewogICAgICBlcnJvcigpOwogICAgfQoKICAgIGludCB5ZWFyID0gdG9JbnQoeWVhclN0cik7CiAgICBpZiAoeWVhciA+PSA3MCAmJiB5ZWFyIDw9IDk5KQogICAgICB5ZWFyICs9IDE5MDA7CiAgICBlbHNlIGlmICh5ZWFyID49IDAgJiYgeWVhciA8PSA2OSkgeWVhciArPSAyMDAwOwogICAgaWYgKHllYXIgPCAxNjAxKSBlcnJvcigpOwoKICAgIGludCBkYXlPZk1vbnRoID0gdG9JbnQoZGF5T2ZNb250aFN0cik7CiAgICBpZiAoZGF5T2ZNb250aCA8IDEgfHwgZGF5T2ZNb250aCA+IDMxKSBlcnJvcigpOwoKICAgIGludCBtb250aCA9IGdldE1vbnRoKG1vbnRoU3RyKSArIDE7CgogICAgdmFyIHRpbWVMaXN0ID0gdGltZVN0ci5zcGxpdCgiOiIpOwogICAgaWYgKHRpbWVMaXN0Lmxlbmd0aCAhPSAzKSBlcnJvcigpOwogICAgaW50IGhvdXIgPSB0b0ludCh0aW1lTGlzdFswXSk7CiAgICBpbnQgbWludXRlID0gdG9JbnQodGltZUxpc3RbMV0pOwogICAgaW50IHNlY29uZCA9IHRvSW50KHRpbWVMaXN0WzJdKTsKICAgIGlmIChob3VyID4gMjMpIGVycm9yKCk7CiAgICBpZiAobWludXRlID4gNTkpIGVycm9yKCk7CiAgICBpZiAoc2Vjb25kID4gNTkpIGVycm9yKCk7CgogICAgcmV0dXJuIG5ldyBEYXRlVGltZS51dGMoeWVhciwgbW9udGgsIGRheU9mTW9udGgsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCAwKTsKICB9Cn0KgYYATk48ARQBBEQMBBEuNgU+ODo1LjkwNzcvMSoqMjdCMjIyAQYgQCoGKFAfDQ0NDQ0NDQ0NDQ0MBwEfKSQUJSATIhMhKCEqIyojFxoEAQYyQD8/BSYrIgUwPSAGJxdRIhARExIQEg8HIA0NDQ0NDQ0NDQ0NDAcpDQ0NDQ0NDAcrEBETEhASDwcpDQ0NDQ0NDQ0NDQ0MBwEhICEBExAQARwsPAg8FjwIGQYBGhNOKhcsSyoZJx0iGgoPKhknHSIaCikdIRoKCDoGASgwUCgXJyU6BgEmDyIuDxsILyYMJBYnPAgGARciPAgGASMNDw4PEREjIDEcHiAgHA0TPEAdHiAgFQYRTwQBITIpDQ0NDQ0NDQ0NDQ0MBwEWARM8BgEtASEiJTU1NTUUBgEkIjU1Piw+Pj4UBgEdIjMUBgEhJz0GARoVPi8GARUXQhxFQUIGARQaFRQBICYdHx9JGT8fPRokHx8fGQgGARshHBsPBgEfIhQ0HgErNAEoAScnIyUlHB4eAU8EAgEZZGFydDpfaHR0cC9odHRwX2RhdGUuZGFydDNvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvX2h0dHAvaHR0cF9oZWFkZXJzLmRhcnTAAGsoLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5faHR0cDsKCmNsYXNzIF9IdHRwSGVhZGVycyBpbXBsZW1lbnRzIEh0dHBIZWFkZXJzIHsKICBmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IF9oZWFkZXJzOwogIGZpbmFsIFN0cmluZyBwcm90b2NvbFZlcnNpb247CgogIGJvb2wgX211dGFibGUgPSB0cnVlOyAvLyBBcmUgdGhlIGhlYWRlcnMgY3VycmVudGx5IG11dGFibGU/CiAgTGlzdDxTdHJpbmc+IF9ub0ZvbGRpbmdIZWFkZXJzOwoKICBpbnQgX2NvbnRlbnRMZW5ndGggPSAtMTsKICBib29sIF9wZXJzaXN0ZW50Q29ubmVjdGlvbiA9IHRydWU7CiAgYm9vbCBfY2h1bmtlZFRyYW5zZmVyRW5jb2RpbmcgPSBmYWxzZTsKICBTdHJpbmcgX2hvc3Q7CiAgaW50IF9wb3J0OwoKICBmaW5hbCBpbnQgX2RlZmF1bHRQb3J0Rm9yU2NoZW1lOwoKICBfSHR0cEhlYWRlcnModGhpcy5wcm90b2NvbFZlcnNpb24sCiAgICAgIHtpbnQgZGVmYXVsdFBvcnRGb3JTY2hlbWU6IEh0dHBDbGllbnQuZGVmYXVsdEh0dHBQb3J0LAogICAgICBfSHR0cEhlYWRlcnMgaW5pdGlhbEhlYWRlcnN9KQogICAgICA6IF9oZWFkZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+KCksCiAgICAgICAgX2RlZmF1bHRQb3J0Rm9yU2NoZW1lID0gZGVmYXVsdFBvcnRGb3JTY2hlbWUgewogICAgaWYgKGluaXRpYWxIZWFkZXJzICE9IG51bGwpIHsKICAgICAgaW5pdGlhbEhlYWRlcnMuX2hlYWRlcnMuZm9yRWFjaCgobmFtZSwgdmFsdWUpID0+IF9oZWFkZXJzW25hbWVdID0gdmFsdWUpOwogICAgICBfY29udGVudExlbmd0aCA9IGluaXRpYWxIZWFkZXJzLl9jb250ZW50TGVuZ3RoOwogICAgICBfcGVyc2lzdGVudENvbm5lY3Rpb24gPSBpbml0aWFsSGVhZGVycy5fcGVyc2lzdGVudENvbm5lY3Rpb247CiAgICAgIF9jaHVua2VkVHJhbnNmZXJFbmNvZGluZyA9IGluaXRpYWxIZWFkZXJzLl9jaHVua2VkVHJhbnNmZXJFbmNvZGluZzsKICAgICAgX2hvc3QgPSBpbml0aWFsSGVhZGVycy5faG9zdDsKICAgICAgX3BvcnQgPSBpbml0aWFsSGVhZGVycy5fcG9ydDsKICAgIH0KICAgIGlmIChwcm90b2NvbFZlcnNpb24gPT0gIjEuMCIpIHsKICAgICAgX3BlcnNpc3RlbnRDb25uZWN0aW9uID0gZmFsc2U7CiAgICAgIF9jaHVua2VkVHJhbnNmZXJFbmNvZGluZyA9IGZhbHNlOwogICAgfQogIH0KCiAgTGlzdDxTdHJpbmc+IG9wZXJhdG9yIFtdKFN0cmluZyBuYW1lKSA9PiBfaGVhZGVyc1tuYW1lLnRvTG93ZXJDYXNlKCldOwoKICBTdHJpbmcgdmFsdWUoU3RyaW5nIG5hbWUpIHsKICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CiAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gX2hlYWRlcnNbbmFtZV07CiAgICBpZiAodmFsdWVzID09IG51bGwpIHJldHVybiBudWxsOwogICAgaWYgKHZhbHVlcy5sZW5ndGggPiAxKSB7CiAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJNb3JlIHRoYW4gb25lIHZhbHVlIGZvciBoZWFkZXIgJG5hbWUiKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZXNbMF07CiAgfQoKICB2b2lkIGFkZChTdHJpbmcgbmFtZSwgdmFsdWUpIHsKICAgIF9jaGVja011dGFibGUoKTsKICAgIF9hZGRBbGwoX3ZhbGlkYXRlRmllbGQobmFtZSksIHZhbHVlKTsKICB9CgogIHZvaWQgX2FkZEFsbChTdHJpbmcgbmFtZSwgdmFsdWUpIHsKICAgIGFzc2VydChuYW1lID09IF92YWxpZGF0ZUZpZWxkKG5hbWUpKTsKICAgIGlmICh2YWx1ZSBpcyBJdGVyYWJsZSkgewogICAgICBmb3IgKHZhciB2IGluIHZhbHVlKSB7CiAgICAgICAgX2FkZChuYW1lLCBfdmFsaWRhdGVWYWx1ZSh2KSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIF9hZGQobmFtZSwgX3ZhbGlkYXRlVmFsdWUodmFsdWUpKTsKICAgIH0KICB9CgogIHZvaWQgc2V0KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKICAgIF9jaGVja011dGFibGUoKTsKICAgIG5hbWUgPSBfdmFsaWRhdGVGaWVsZChuYW1lKTsKICAgIF9oZWFkZXJzLnJlbW92ZShuYW1lKTsKICAgIGlmIChuYW1lID09IEh0dHBIZWFkZXJzLnRyYW5zZmVyRW5jb2RpbmdIZWFkZXIpIHsKICAgICAgX2NodW5rZWRUcmFuc2ZlckVuY29kaW5nID0gZmFsc2U7CiAgICB9CiAgICBfYWRkQWxsKG5hbWUsIHZhbHVlKTsKICB9CgogIHZvaWQgcmVtb3ZlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKICAgIF9jaGVja011dGFibGUoKTsKICAgIG5hbWUgPSBfdmFsaWRhdGVGaWVsZChuYW1lKTsKICAgIHZhbHVlID0gX3ZhbGlkYXRlVmFsdWUodmFsdWUpOwogICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IF9oZWFkZXJzW25hbWVdOwogICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7CiAgICAgIGludCBpbmRleCA9IHZhbHVlcy5pbmRleE9mKHZhbHVlKTsKICAgICAgaWYgKGluZGV4ICE9IC0xKSB7CiAgICAgICAgdmFsdWVzLnJlbW92ZVJhbmdlKGluZGV4LCBpbmRleCArIDEpOwogICAgICB9CiAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09IDApIF9oZWFkZXJzLnJlbW92ZShuYW1lKTsKICAgIH0KICAgIGlmIChuYW1lID09IEh0dHBIZWFkZXJzLnRyYW5zZmVyRW5jb2RpbmdIZWFkZXIgJiYgdmFsdWUgPT0gImNodW5rZWQiKSB7CiAgICAgIF9jaHVua2VkVHJhbnNmZXJFbmNvZGluZyA9IGZhbHNlOwogICAgfQogIH0KCiAgdm9pZCByZW1vdmVBbGwoU3RyaW5nIG5hbWUpIHsKICAgIF9jaGVja011dGFibGUoKTsKICAgIG5hbWUgPSBfdmFsaWRhdGVGaWVsZChuYW1lKTsKICAgIF9oZWFkZXJzLnJlbW92ZShuYW1lKTsKICB9CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoU3RyaW5nIG5hbWUsIExpc3Q8U3RyaW5nPiB2YWx1ZXMpKSB7CiAgICBfaGVhZGVycy5mb3JFYWNoKGYpOwogIH0KCiAgdm9pZCBub0ZvbGRpbmcoU3RyaW5nIG5hbWUpIHsKICAgIGlmIChfbm9Gb2xkaW5nSGVhZGVycyA9PSBudWxsKSBfbm9Gb2xkaW5nSGVhZGVycyA9IG5ldyBMaXN0PFN0cmluZz4oKTsKICAgIF9ub0ZvbGRpbmdIZWFkZXJzLmFkZChuYW1lKTsKICB9CgogIGJvb2wgZ2V0IHBlcnNpc3RlbnRDb25uZWN0aW9uID0+IF9wZXJzaXN0ZW50Q29ubmVjdGlvbjsKCiAgdm9pZCBzZXQgcGVyc2lzdGVudENvbm5lY3Rpb24oYm9vbCBwZXJzaXN0ZW50Q29ubmVjdGlvbikgewogICAgX2NoZWNrTXV0YWJsZSgpOwogICAgaWYgKHBlcnNpc3RlbnRDb25uZWN0aW9uID09IF9wZXJzaXN0ZW50Q29ubmVjdGlvbikgcmV0dXJuOwogICAgaWYgKHBlcnNpc3RlbnRDb25uZWN0aW9uKSB7CiAgICAgIGlmIChwcm90b2NvbFZlcnNpb24gPT0gIjEuMSIpIHsKICAgICAgICByZW1vdmUoSHR0cEhlYWRlcnMuY29ubmVjdGlvbkhlYWRlciwgImNsb3NlIik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKF9jb250ZW50TGVuZ3RoID09IC0xKSB7CiAgICAgICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigKICAgICAgICAgICAgICAiVHJ5aW5nIHRvIHNldCAnQ29ubmVjdGlvbjogS2VlcC1BbGl2ZScgb24gSFRUUCAxLjAgaGVhZGVycyB3aXRoICIKICAgICAgICAgICAgICAibm8gQ29udGVudExlbmd0aCIpOwogICAgICAgIH0KICAgICAgICBhZGQoSHR0cEhlYWRlcnMuY29ubmVjdGlvbkhlYWRlciwgImtlZXAtYWxpdmUiKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKHByb3RvY29sVmVyc2lvbiA9PSAiMS4xIikgewogICAgICAgIGFkZChIdHRwSGVhZGVycy5jb25uZWN0aW9uSGVhZGVyLCAiY2xvc2UiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZW1vdmUoSHR0cEhlYWRlcnMuY29ubmVjdGlvbkhlYWRlciwgImtlZXAtYWxpdmUiKTsKICAgICAgfQogICAgfQogICAgX3BlcnNpc3RlbnRDb25uZWN0aW9uID0gcGVyc2lzdGVudENvbm5lY3Rpb247CiAgfQoKICBpbnQgZ2V0IGNvbnRlbnRMZW5ndGggPT4gX2NvbnRlbnRMZW5ndGg7CgogIHZvaWQgc2V0IGNvbnRlbnRMZW5ndGgoaW50IGNvbnRlbnRMZW5ndGgpIHsKICAgIF9jaGVja011dGFibGUoKTsKICAgIGlmIChwcm90b2NvbFZlcnNpb24gPT0gIjEuMCIgJiYKICAgICAgICBwZXJzaXN0ZW50Q29ubmVjdGlvbiAmJgogICAgICAgIGNvbnRlbnRMZW5ndGggPT0gLTEpIHsKICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oCiAgICAgICAgICAiVHJ5aW5nIHRvIGNsZWFyIENvbnRlbnRMZW5ndGggb24gSFRUUCAxLjAgaGVhZGVycyB3aXRoICIKICAgICAgICAgICInQ29ubmVjdGlvbjogS2VlcC1BbGl2ZScgc2V0Iik7CiAgICB9CiAgICBpZiAoX2NvbnRlbnRMZW5ndGggPT0gY29udGVudExlbmd0aCkgcmV0dXJuOwogICAgX2NvbnRlbnRMZW5ndGggPSBjb250ZW50TGVuZ3RoOwogICAgaWYgKF9jb250ZW50TGVuZ3RoID49IDApIHsKICAgICAgaWYgKGNodW5rZWRUcmFuc2ZlckVuY29kaW5nKSBjaHVua2VkVHJhbnNmZXJFbmNvZGluZyA9IGZhbHNlOwogICAgICBfc2V0KEh0dHBIZWFkZXJzLmNvbnRlbnRMZW5ndGhIZWFkZXIsIGNvbnRlbnRMZW5ndGgudG9TdHJpbmcoKSk7CiAgICB9IGVsc2UgewogICAgICByZW1vdmVBbGwoSHR0cEhlYWRlcnMuY29udGVudExlbmd0aEhlYWRlcik7CiAgICAgIGlmIChwcm90b2NvbFZlcnNpb24gPT0gIjEuMSIpIHsKICAgICAgICBjaHVua2VkVHJhbnNmZXJFbmNvZGluZyA9IHRydWU7CiAgICAgIH0KICAgIH0KICB9CgogIGJvb2wgZ2V0IGNodW5rZWRUcmFuc2ZlckVuY29kaW5nID0+IF9jaHVua2VkVHJhbnNmZXJFbmNvZGluZzsKCiAgdm9pZCBzZXQgY2h1bmtlZFRyYW5zZmVyRW5jb2RpbmcoYm9vbCBjaHVua2VkVHJhbnNmZXJFbmNvZGluZykgewogICAgX2NoZWNrTXV0YWJsZSgpOwogICAgaWYgKGNodW5rZWRUcmFuc2ZlckVuY29kaW5nICYmIHByb3RvY29sVmVyc2lvbiA9PSAiMS4wIikgewogICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigKICAgICAgICAgICJUcnlpbmcgdG8gc2V0ICdUcmFuc2Zlci1FbmNvZGluZzogQ2h1bmtlZCcgb24gSFRUUCAxLjAgaGVhZGVycyIpOwogICAgfQogICAgaWYgKGNodW5rZWRUcmFuc2ZlckVuY29kaW5nID09IF9jaHVua2VkVHJhbnNmZXJFbmNvZGluZykgcmV0dXJuOwogICAgaWYgKGNodW5rZWRUcmFuc2ZlckVuY29kaW5nKSB7CiAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBfaGVhZGVyc1tIdHRwSGVhZGVycy50cmFuc2ZlckVuY29kaW5nSGVhZGVyXTsKICAgICAgaWYgKCh2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMubGFzdCAhPSAiY2h1bmtlZCIpKSB7CiAgICAgICAgLy8gSGVhZGVycyBkb2VzIG5vdCBzcGVjaWZ5IGNodW5rZWQgZW5jb2RpbmcgLSBhZGQgaXQgaWYgc2V0LgogICAgICAgIF9hZGRWYWx1ZShIdHRwSGVhZGVycy50cmFuc2ZlckVuY29kaW5nSGVhZGVyLCAiY2h1bmtlZCIpOwogICAgICB9CiAgICAgIGNvbnRlbnRMZW5ndGggPSAtMTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIEhlYWRlcnMgZG9lcyBzcGVjaWZ5IGNodW5rZWQgZW5jb2RpbmcgLSByZW1vdmUgaXQgaWYgbm90IHNldC4KICAgICAgcmVtb3ZlKEh0dHBIZWFkZXJzLnRyYW5zZmVyRW5jb2RpbmdIZWFkZXIsICJjaHVua2VkIik7CiAgICB9CiAgICBfY2h1bmtlZFRyYW5zZmVyRW5jb2RpbmcgPSBjaHVua2VkVHJhbnNmZXJFbmNvZGluZzsKICB9CgogIFN0cmluZyBnZXQgaG9zdCA9PiBfaG9zdDsKCiAgdm9pZCBzZXQgaG9zdChTdHJpbmcgaG9zdCkgewogICAgX2NoZWNrTXV0YWJsZSgpOwogICAgX2hvc3QgPSBob3N0OwogICAgX3VwZGF0ZUhvc3RIZWFkZXIoKTsKICB9CgogIGludCBnZXQgcG9ydCA9PiBfcG9ydDsKCiAgdm9pZCBzZXQgcG9ydChpbnQgcG9ydCkgewogICAgX2NoZWNrTXV0YWJsZSgpOwogICAgX3BvcnQgPSBwb3J0OwogICAgX3VwZGF0ZUhvc3RIZWFkZXIoKTsKICB9CgogIERhdGVUaW1lIGdldCBpZk1vZGlmaWVkU2luY2UgewogICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IF9oZWFkZXJzW0h0dHBIZWFkZXJzLmlmTW9kaWZpZWRTaW5jZUhlYWRlcl07CiAgICBpZiAodmFsdWVzICE9IG51bGwpIHsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gSHR0cERhdGUucGFyc2UodmFsdWVzWzBdKTsKICAgICAgfSBvbiBFeGNlcHRpb24gY2F0Y2ggKGUpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIHNldCBpZk1vZGlmaWVkU2luY2UoRGF0ZVRpbWUgaWZNb2RpZmllZFNpbmNlKSB7CiAgICBfY2hlY2tNdXRhYmxlKCk7CiAgICAvLyBGb3JtYXQgImlmTW9kaWZpZWRTaW5jZSIgaGVhZGVyIHdpdGggZGF0ZSBpbiBHcmVlbndpY2ggTWVhbiBUaW1lIChHTVQpLgogICAgU3RyaW5nIGZvcm1hdHRlZCA9IEh0dHBEYXRlLmZvcm1hdChpZk1vZGlmaWVkU2luY2UudG9VdGMoKSk7CiAgICBfc2V0KEh0dHBIZWFkZXJzLmlmTW9kaWZpZWRTaW5jZUhlYWRlciwgZm9ybWF0dGVkKTsKICB9CgogIERhdGVUaW1lIGdldCBkYXRlIHsKICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBfaGVhZGVyc1tIdHRwSGVhZGVycy5kYXRlSGVhZGVyXTsKICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkgewogICAgICB0cnkgewogICAgICAgIHJldHVybiBIdHRwRGF0ZS5wYXJzZSh2YWx1ZXNbMF0pOwogICAgICB9IG9uIEV4Y2VwdGlvbiBjYXRjaCAoZSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgc2V0IGRhdGUoRGF0ZVRpbWUgZGF0ZSkgewogICAgX2NoZWNrTXV0YWJsZSgpOwogICAgLy8gRm9ybWF0ICJEYXRlVGltZSIgaGVhZGVyIHdpdGggZGF0ZSBpbiBHcmVlbndpY2ggTWVhbiBUaW1lIChHTVQpLgogICAgU3RyaW5nIGZvcm1hdHRlZCA9IEh0dHBEYXRlLmZvcm1hdChkYXRlLnRvVXRjKCkpOwogICAgX3NldCgiZGF0ZSIsIGZvcm1hdHRlZCk7CiAgfQoKICBEYXRlVGltZSBnZXQgZXhwaXJlcyB7CiAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gX2hlYWRlcnNbSHR0cEhlYWRlcnMuZXhwaXJlc0hlYWRlcl07CiAgICBpZiAodmFsdWVzICE9IG51bGwpIHsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gSHR0cERhdGUucGFyc2UodmFsdWVzWzBdKTsKICAgICAgfSBvbiBFeGNlcHRpb24gY2F0Y2ggKGUpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIHNldCBleHBpcmVzKERhdGVUaW1lIGV4cGlyZXMpIHsKICAgIF9jaGVja011dGFibGUoKTsKICAgIC8vIEZvcm1hdCAiRXhwaXJlcyIgaGVhZGVyIHdpdGggZGF0ZSBpbiBHcmVlbndpY2ggTWVhbiBUaW1lIChHTVQpLgogICAgU3RyaW5nIGZvcm1hdHRlZCA9IEh0dHBEYXRlLmZvcm1hdChleHBpcmVzLnRvVXRjKCkpOwogICAgX3NldChIdHRwSGVhZGVycy5leHBpcmVzSGVhZGVyLCBmb3JtYXR0ZWQpOwogIH0KCiAgQ29udGVudFR5cGUgZ2V0IGNvbnRlbnRUeXBlIHsKICAgIHZhciB2YWx1ZXMgPSBfaGVhZGVyc1siY29udGVudC10eXBlIl07CiAgICBpZiAodmFsdWVzICE9IG51bGwpIHsKICAgICAgcmV0dXJuIENvbnRlbnRUeXBlLnBhcnNlKHZhbHVlc1swXSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIHZvaWQgc2V0IGNvbnRlbnRUeXBlKENvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7CiAgICBfY2hlY2tNdXRhYmxlKCk7CiAgICBfc2V0KEh0dHBIZWFkZXJzLmNvbnRlbnRUeXBlSGVhZGVyLCBjb250ZW50VHlwZS50b1N0cmluZygpKTsKICB9CgogIHZvaWQgY2xlYXIoKSB7CiAgICBfY2hlY2tNdXRhYmxlKCk7CiAgICBfaGVhZGVycy5jbGVhcigpOwogICAgX2NvbnRlbnRMZW5ndGggPSAtMTsKICAgIF9wZXJzaXN0ZW50Q29ubmVjdGlvbiA9IHRydWU7CiAgICBfY2h1bmtlZFRyYW5zZmVyRW5jb2RpbmcgPSBmYWxzZTsKICAgIF9ob3N0ID0gbnVsbDsKICAgIF9wb3J0ID0gbnVsbDsKICB9CgogIC8vIFtuYW1lXSBtdXN0IGJlIGEgbG93ZXItY2FzZSB2ZXJzaW9uIG9mIHRoZSBuYW1lLgogIHZvaWQgX2FkZChTdHJpbmcgbmFtZSwgdmFsdWUpIHsKICAgIGFzc2VydChuYW1lID09IF92YWxpZGF0ZUZpZWxkKG5hbWUpKTsKICAgIC8vIFVzZSB0aGUgbGVuZ3RoIGFzIGluZGV4IG9uIHdoYXQgbWV0aG9kIHRvIGNhbGwuIFRoaXMgaXMgbm90YWJsZQogICAgLy8gZmFzdGVyIHRoYW4gY29tcHV0aW5nIGhhc2ggYW5kIGxvb2tpbmcgdXAgaW4gYSBoYXNoLW1hcC4KICAgIHN3aXRjaCAobmFtZS5sZW5ndGgpIHsKICAgICAgY2FzZSA0OgogICAgICAgIGlmIChIdHRwSGVhZGVycy5kYXRlSGVhZGVyID09IG5hbWUpIHsKICAgICAgICAgIF9hZGREYXRlKG5hbWUsIHZhbHVlKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKEh0dHBIZWFkZXJzLmhvc3RIZWFkZXIgPT0gbmFtZSkgewogICAgICAgICAgX2FkZEhvc3QobmFtZSwgdmFsdWUpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSA3OgogICAgICAgIGlmIChIdHRwSGVhZGVycy5leHBpcmVzSGVhZGVyID09IG5hbWUpIHsKICAgICAgICAgIF9hZGRFeHBpcmVzKG5hbWUsIHZhbHVlKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMTA6CiAgICAgICAgaWYgKEh0dHBIZWFkZXJzLmNvbm5lY3Rpb25IZWFkZXIgPT0gbmFtZSkgewogICAgICAgICAgX2FkZENvbm5lY3Rpb24obmFtZSwgdmFsdWUpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAxMjoKICAgICAgICBpZiAoSHR0cEhlYWRlcnMuY29udGVudFR5cGVIZWFkZXIgPT0gbmFtZSkgewogICAgICAgICAgX2FkZENvbnRlbnRUeXBlKG5hbWUsIHZhbHVlKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMTQ6CiAgICAgICAgaWYgKEh0dHBIZWFkZXJzLmNvbnRlbnRMZW5ndGhIZWFkZXIgPT0gbmFtZSkgewogICAgICAgICAgX2FkZENvbnRlbnRMZW5ndGgobmFtZSwgdmFsdWUpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAxNzoKICAgICAgICBpZiAoSHR0cEhlYWRlcnMudHJhbnNmZXJFbmNvZGluZ0hlYWRlciA9PSBuYW1lKSB7CiAgICAgICAgICBfYWRkVHJhbnNmZXJFbmNvZGluZyhuYW1lLCB2YWx1ZSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChIdHRwSGVhZGVycy5pZk1vZGlmaWVkU2luY2VIZWFkZXIgPT0gbmFtZSkgewogICAgICAgICAgX2FkZElmTW9kaWZpZWRTaW5jZShuYW1lLCB2YWx1ZSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgX2FkZFZhbHVlKG5hbWUsIHZhbHVlKTsKICB9CgogIHZvaWQgX2FkZENvbnRlbnRMZW5ndGgoU3RyaW5nIG5hbWUsIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgaXMgaW50KSB7CiAgICAgIGNvbnRlbnRMZW5ndGggPSB2YWx1ZTsKICAgIH0gZWxzZSBpZiAodmFsdWUgaXMgU3RyaW5nKSB7CiAgICAgIGNvbnRlbnRMZW5ndGggPSBpbnQucGFyc2UodmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdHlwZSBmb3IgaGVhZGVyIG5hbWVkICRuYW1lIik7CiAgICB9CiAgfQoKICB2b2lkIF9hZGRUcmFuc2ZlckVuY29kaW5nKFN0cmluZyBuYW1lLCB2YWx1ZSkgewogICAgaWYgKHZhbHVlID09ICJjaHVua2VkIikgewogICAgICBjaHVua2VkVHJhbnNmZXJFbmNvZGluZyA9IHRydWU7CiAgICB9IGVsc2UgewogICAgICBfYWRkVmFsdWUoSHR0cEhlYWRlcnMudHJhbnNmZXJFbmNvZGluZ0hlYWRlciwgdmFsdWUpOwogICAgfQogIH0KCiAgdm9pZCBfYWRkRGF0ZShTdHJpbmcgbmFtZSwgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSBpcyBEYXRlVGltZSkgewogICAgICBkYXRlID0gdmFsdWU7CiAgICB9IGVsc2UgaWYgKHZhbHVlIGlzIFN0cmluZykgewogICAgICBfc2V0KEh0dHBIZWFkZXJzLmRhdGVIZWFkZXIsIHZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHR5cGUgZm9yIGhlYWRlciBuYW1lZCAkbmFtZSIpOwogICAgfQogIH0KCiAgdm9pZCBfYWRkRXhwaXJlcyhTdHJpbmcgbmFtZSwgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSBpcyBEYXRlVGltZSkgewogICAgICBleHBpcmVzID0gdmFsdWU7CiAgICB9IGVsc2UgaWYgKHZhbHVlIGlzIFN0cmluZykgewogICAgICBfc2V0KEh0dHBIZWFkZXJzLmV4cGlyZXNIZWFkZXIsIHZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHR5cGUgZm9yIGhlYWRlciBuYW1lZCAkbmFtZSIpOwogICAgfQogIH0KCiAgdm9pZCBfYWRkSWZNb2RpZmllZFNpbmNlKFN0cmluZyBuYW1lLCB2YWx1ZSkgewogICAgaWYgKHZhbHVlIGlzIERhdGVUaW1lKSB7CiAgICAgIGlmTW9kaWZpZWRTaW5jZSA9IHZhbHVlOwogICAgfSBlbHNlIGlmICh2YWx1ZSBpcyBTdHJpbmcpIHsKICAgICAgX3NldChIdHRwSGVhZGVycy5pZk1vZGlmaWVkU2luY2VIZWFkZXIsIHZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHR5cGUgZm9yIGhlYWRlciBuYW1lZCAkbmFtZSIpOwogICAgfQogIH0KCiAgdm9pZCBfYWRkSG9zdChTdHJpbmcgbmFtZSwgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSBpcyBTdHJpbmcpIHsKICAgICAgaW50IHBvcyA9IHZhbHVlLmluZGV4T2YoIjoiKTsKICAgICAgaWYgKHBvcyA9PSAtMSkgewogICAgICAgIF9ob3N0ID0gdmFsdWU7CiAgICAgICAgX3BvcnQgPSBIdHRwQ2xpZW50LmRlZmF1bHRIdHRwUG9ydDsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAocG9zID4gMCkgewogICAgICAgICAgX2hvc3QgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgcG9zKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgX2hvc3QgPSBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAocG9zICsgMSA9PSB2YWx1ZS5sZW5ndGgpIHsKICAgICAgICAgIF9wb3J0ID0gSHR0cENsaWVudC5kZWZhdWx0SHR0cFBvcnQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIF9wb3J0ID0gaW50LnBhcnNlKHZhbHVlLnN1YnN0cmluZyhwb3MgKyAxKSk7CiAgICAgICAgICB9IG9uIEZvcm1hdEV4Y2VwdGlvbiBjYXRjaCAoZSkgewogICAgICAgICAgICBfcG9ydCA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIF9zZXQoSHR0cEhlYWRlcnMuaG9zdEhlYWRlciwgdmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdHlwZSBmb3IgaGVhZGVyIG5hbWVkICRuYW1lIik7CiAgICB9CiAgfQoKICB2b2lkIF9hZGRDb25uZWN0aW9uKFN0cmluZyBuYW1lLCB2YWx1ZSkgewogICAgdmFyIGxvd2VyQ2FzZVZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTsKICAgIGlmIChsb3dlckNhc2VWYWx1ZSA9PSAnY2xvc2UnKSB7CiAgICAgIF9wZXJzaXN0ZW50Q29ubmVjdGlvbiA9IGZhbHNlOwogICAgfSBlbHNlIGlmIChsb3dlckNhc2VWYWx1ZSA9PSAna2VlcC1hbGl2ZScpIHsKICAgICAgX3BlcnNpc3RlbnRDb25uZWN0aW9uID0gdHJ1ZTsKICAgIH0KICAgIF9hZGRWYWx1ZShuYW1lLCB2YWx1ZSk7CiAgfQoKICB2b2lkIF9hZGRDb250ZW50VHlwZShTdHJpbmcgbmFtZSwgdmFsdWUpIHsKICAgIF9zZXQoSHR0cEhlYWRlcnMuY29udGVudFR5cGVIZWFkZXIsIHZhbHVlKTsKICB9CgogIHZvaWQgX2FkZFZhbHVlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBfaGVhZGVyc1tuYW1lXTsKICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewogICAgICB2YWx1ZXMgPSBuZXcgTGlzdDxTdHJpbmc+KCk7CiAgICAgIF9oZWFkZXJzW25hbWVdID0gdmFsdWVzOwogICAgfQogICAgaWYgKHZhbHVlIGlzIERhdGVUaW1lKSB7CiAgICAgIHZhbHVlcy5hZGQoSHR0cERhdGUuZm9ybWF0KHZhbHVlKSk7CiAgICB9IGVsc2UgaWYgKHZhbHVlIGlzIFN0cmluZykgewogICAgICB2YWx1ZXMuYWRkKHZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhbHVlcy5hZGQoX3ZhbGlkYXRlVmFsdWUodmFsdWUudG9TdHJpbmcoKSkpOwogICAgfQogIH0KCiAgdm9pZCBfc2V0KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKICAgIGFzc2VydChuYW1lID09IF92YWxpZGF0ZUZpZWxkKG5hbWUpKTsKICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBuZXcgTGlzdDxTdHJpbmc+KCk7CiAgICBfaGVhZGVyc1tuYW1lXSA9IHZhbHVlczsKICAgIHZhbHVlcy5hZGQodmFsdWUpOwogIH0KCiAgX2NoZWNrTXV0YWJsZSgpIHsKICAgIGlmICghX211dGFibGUpIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJIVFRQIGhlYWRlcnMgYXJlIG5vdCBtdXRhYmxlIik7CiAgfQoKICBfdXBkYXRlSG9zdEhlYWRlcigpIHsKICAgIGJvb2wgZGVmYXVsdFBvcnQgPSBfcG9ydCA9PSBudWxsIHx8IF9wb3J0ID09IF9kZWZhdWx0UG9ydEZvclNjaGVtZTsKICAgIF9zZXQoImhvc3QiLCBkZWZhdWx0UG9ydCA/IGhvc3QgOiAiJGhvc3Q6JF9wb3J0Iik7CiAgfQoKICBfZm9sZEhlYWRlcihTdHJpbmcgbmFtZSkgewogICAgaWYgKG5hbWUgPT0gSHR0cEhlYWRlcnMuc2V0Q29va2llSGVhZGVyIHx8CiAgICAgICAgKF9ub0ZvbGRpbmdIZWFkZXJzICE9IG51bGwgJiYgX25vRm9sZGluZ0hlYWRlcnMuaW5kZXhPZihuYW1lKSAhPSAtMSkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICB2b2lkIF9maW5hbGl6ZSgpIHsKICAgIF9tdXRhYmxlID0gZmFsc2U7CiAgfQoKICB2b2lkIF9idWlsZChCeXRlc0J1aWxkZXIgYnVpbGRlcikgewogICAgZm9yIChTdHJpbmcgbmFtZSBpbiBfaGVhZGVycy5rZXlzKSB7CiAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBfaGVhZGVyc1tuYW1lXTsKICAgICAgYm9vbCBmb2xkID0gX2ZvbGRIZWFkZXIobmFtZSk7CiAgICAgIHZhciBuYW1lRGF0YSA9IG5hbWUuY29kZVVuaXRzOwogICAgICBidWlsZGVyLmFkZChuYW1lRGF0YSk7CiAgICAgIGJ1aWxkZXIuYWRkQnl0ZShfQ2hhckNvZGUuQ09MT04pOwogICAgICBidWlsZGVyLmFkZEJ5dGUoX0NoYXJDb2RlLlNQKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoaSA+IDApIHsKICAgICAgICAgIGlmIChmb2xkKSB7CiAgICAgICAgICAgIGJ1aWxkZXIuYWRkQnl0ZShfQ2hhckNvZGUuQ09NTUEpOwogICAgICAgICAgICBidWlsZGVyLmFkZEJ5dGUoX0NoYXJDb2RlLlNQKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGJ1aWxkZXIuYWRkQnl0ZShfQ2hhckNvZGUuQ1IpOwogICAgICAgICAgICBidWlsZGVyLmFkZEJ5dGUoX0NoYXJDb2RlLkxGKTsKICAgICAgICAgICAgYnVpbGRlci5hZGQobmFtZURhdGEpOwogICAgICAgICAgICBidWlsZGVyLmFkZEJ5dGUoX0NoYXJDb2RlLkNPTE9OKTsKICAgICAgICAgICAgYnVpbGRlci5hZGRCeXRlKF9DaGFyQ29kZS5TUCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJ1aWxkZXIuYWRkKHZhbHVlc1tpXS5jb2RlVW5pdHMpOwogICAgICB9CiAgICAgIGJ1aWxkZXIuYWRkQnl0ZShfQ2hhckNvZGUuQ1IpOwogICAgICBidWlsZGVyLmFkZEJ5dGUoX0NoYXJDb2RlLkxGKTsKICAgIH0KICB9CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIF9oZWFkZXJzLmZvckVhY2goKFN0cmluZyBuYW1lLCBMaXN0PFN0cmluZz4gdmFsdWVzKSB7CiAgICAgIHNiLi53cml0ZShuYW1lKS4ud3JpdGUoIjogIik7CiAgICAgIGJvb2wgZm9sZCA9IF9mb2xkSGVhZGVyKG5hbWUpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChpID4gMCkgewogICAgICAgICAgaWYgKGZvbGQpIHsKICAgICAgICAgICAgc2Iud3JpdGUoIiwgIik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzYi4ud3JpdGUoIlxuIikuLndyaXRlKG5hbWUpLi53cml0ZSgiOiAiKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc2Iud3JpdGUodmFsdWVzW2ldKTsKICAgICAgfQogICAgICBzYi53cml0ZSgiXG4iKTsKICAgIH0pOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQoKICBMaXN0PENvb2tpZT4gX3BhcnNlQ29va2llcygpIHsKICAgIC8vIFBhcnNlIGEgQ29va2llIGhlYWRlciB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIGluIFJGQyA2MjY1LgogICAgdmFyIGNvb2tpZXMgPSBuZXcgTGlzdDxDb29raWU+KCk7CiAgICB2b2lkIHBhcnNlQ29va2llU3RyaW5nKFN0cmluZyBzKSB7CiAgICAgIGludCBpbmRleCA9IDA7CgogICAgICBib29sIGRvbmUoKSA9PiBpbmRleCA9PSAtMSB8fCBpbmRleCA9PSBzLmxlbmd0aDsKCiAgICAgIHZvaWQgc2tpcFdTKCkgewogICAgICAgIHdoaWxlICghZG9uZSgpKSB7CiAgICAgICAgICBpZiAoc1tpbmRleF0gIT0gIiAiICYmIHNbaW5kZXhdICE9ICJcdCIpIHJldHVybjsKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgfQogICAgICB9CgogICAgICBTdHJpbmcgcGFyc2VOYW1lKCkgewogICAgICAgIGludCBzdGFydCA9IGluZGV4OwogICAgICAgIHdoaWxlICghZG9uZSgpKSB7CiAgICAgICAgICBpZiAoc1tpbmRleF0gPT0gIiAiIHx8IHNbaW5kZXhdID09ICJcdCIgfHwgc1tpbmRleF0gPT0gIj0iKSBicmVhazsKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpOwogICAgICB9CgogICAgICBTdHJpbmcgcGFyc2VWYWx1ZSgpIHsKICAgICAgICBpbnQgc3RhcnQgPSBpbmRleDsKICAgICAgICB3aGlsZSAoIWRvbmUoKSkgewogICAgICAgICAgaWYgKHNbaW5kZXhdID09ICIgIiB8fCBzW2luZGV4XSA9PSAiXHQiIHx8IHNbaW5kZXhdID09ICI7IikgYnJlYWs7CiAgICAgICAgICBpbmRleCsrOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcy5zdWJzdHJpbmcoc3RhcnQsIGluZGV4KTsKICAgICAgfQoKICAgICAgYm9vbCBleHBlY3QoU3RyaW5nIGV4cGVjdGVkKSB7CiAgICAgICAgaWYgKGRvbmUoKSkgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmIChzW2luZGV4XSAhPSBleHBlY3RlZCkgcmV0dXJuIGZhbHNlOwogICAgICAgIGluZGV4Kys7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KCiAgICAgIHdoaWxlICghZG9uZSgpKSB7CiAgICAgICAgc2tpcFdTKCk7CiAgICAgICAgaWYgKGRvbmUoKSkgcmV0dXJuOwogICAgICAgIFN0cmluZyBuYW1lID0gcGFyc2VOYW1lKCk7CiAgICAgICAgc2tpcFdTKCk7CiAgICAgICAgaWYgKCFleHBlY3QoIj0iKSkgewogICAgICAgICAgaW5kZXggPSBzLmluZGV4T2YoJzsnLCBpbmRleCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgc2tpcFdTKCk7CiAgICAgICAgU3RyaW5nIHZhbHVlID0gcGFyc2VWYWx1ZSgpOwogICAgICAgIHRyeSB7CiAgICAgICAgICBjb29raWVzLmFkZChuZXcgX0Nvb2tpZShuYW1lLCB2YWx1ZSkpOwogICAgICAgIH0gY2F0Y2ggKF8pIHsKICAgICAgICAgIC8vIFNraXAgaXQsIGludmFsaWQgY29va2llIGRhdGEuCiAgICAgICAgfQogICAgICAgIHNraXBXUygpOwogICAgICAgIGlmIChkb25lKCkpIHJldHVybjsKICAgICAgICBpZiAoIWV4cGVjdCgiOyIpKSB7CiAgICAgICAgICBpbmRleCA9IHMuaW5kZXhPZignOycsIGluZGV4KTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBfaGVhZGVyc1tIdHRwSGVhZGVycy5jb29raWVIZWFkZXJdOwogICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7CiAgICAgIHZhbHVlcy5mb3JFYWNoKChoZWFkZXJWYWx1ZSkgPT4gcGFyc2VDb29raWVTdHJpbmcoaGVhZGVyVmFsdWUpKTsKICAgIH0KICAgIHJldHVybiBjb29raWVzOwogIH0KCiAgc3RhdGljIFN0cmluZyBfdmFsaWRhdGVGaWVsZChTdHJpbmcgZmllbGQpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGQubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKCFfSHR0cFBhcnNlci5faXNUb2tlbkNoYXIoZmllbGQuY29kZVVuaXRBdChpKSkpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICAgICAiSW52YWxpZCBIVFRQIGhlYWRlciBmaWVsZCBuYW1lOiAke2pzb24uZW5jb2RlKGZpZWxkKX0iKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZpZWxkLnRvTG93ZXJDYXNlKCk7CiAgfQoKICBzdGF0aWMgX3ZhbGlkYXRlVmFsdWUodmFsdWUpIHsKICAgIGlmICh2YWx1ZSBpcyEgU3RyaW5nKSByZXR1cm4gdmFsdWU7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICghX0h0dHBQYXJzZXIuX2lzVmFsdWVDaGFyKHZhbHVlLmNvZGVVbml0QXQoaSkpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigKICAgICAgICAgICAgIkludmFsaWQgSFRUUCBoZWFkZXIgZmllbGQgdmFsdWU6ICR7anNvbi5lbmNvZGUodmFsdWUpfSIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQp9CgpjbGFzcyBfSGVhZGVyVmFsdWUgaW1wbGVtZW50cyBIZWFkZXJWYWx1ZSB7CiAgU3RyaW5nIF92YWx1ZTsKICBNYXA8U3RyaW5nLCBTdHJpbmc+IF9wYXJhbWV0ZXJzOwogIE1hcDxTdHJpbmcsIFN0cmluZz4gX3VubW9kaWZpYWJsZVBhcmFtZXRlcnM7CgogIF9IZWFkZXJWYWx1ZShbdGhpcy5fdmFsdWUgPSAiIiwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzXSkgewogICAgaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICBfcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPi5mcm9tKHBhcmFtZXRlcnMpOwogICAgfQogIH0KCiAgc3RhdGljIF9IZWFkZXJWYWx1ZSBwYXJzZShTdHJpbmcgdmFsdWUsCiAgICAgIHtwYXJhbWV0ZXJTZXBhcmF0b3I6ICI7IiwKICAgICAgdmFsdWVTZXBhcmF0b3I6IG51bGwsCiAgICAgIHByZXNlcnZlQmFja3NsYXNoOiBmYWxzZX0pIHsKICAgIC8vIFBhcnNlIHRoZSBzdHJpbmcuCiAgICB2YXIgcmVzdWx0ID0gbmV3IF9IZWFkZXJWYWx1ZSgpOwogICAgcmVzdWx0Ll9wYXJzZSh2YWx1ZSwgcGFyYW1ldGVyU2VwYXJhdG9yLCB2YWx1ZVNlcGFyYXRvciwgcHJlc2VydmVCYWNrc2xhc2gpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIFN0cmluZyBnZXQgdmFsdWUgPT4gX3ZhbHVlOwoKICB2b2lkIF9lbnN1cmVQYXJhbWV0ZXJzKCkgewogICAgaWYgKF9wYXJhbWV0ZXJzID09IG51bGwpIHsKICAgICAgX3BhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKICAgIH0KICB9CgogIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0IHBhcmFtZXRlcnMgewogICAgX2Vuc3VyZVBhcmFtZXRlcnMoKTsKICAgIGlmIChfdW5tb2RpZmlhYmxlUGFyYW1ldGVycyA9PSBudWxsKSB7CiAgICAgIF91bm1vZGlmaWFibGVQYXJhbWV0ZXJzID0gbmV3IFVubW9kaWZpYWJsZU1hcFZpZXcoX3BhcmFtZXRlcnMpOwogICAgfQogICAgcmV0dXJuIF91bm1vZGlmaWFibGVQYXJhbWV0ZXJzOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoX3ZhbHVlKTsKICAgIGlmIChwYXJhbWV0ZXJzICE9IG51bGwgJiYgcGFyYW1ldGVycy5sZW5ndGggPiAwKSB7CiAgICAgIF9wYXJhbWV0ZXJzLmZvckVhY2goKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKICAgICAgICBzYi4ud3JpdGUoIjsgIikuLndyaXRlKG5hbWUpLi53cml0ZSgiPSIpLi53cml0ZSh2YWx1ZSk7CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQoKICB2b2lkIF9wYXJzZShTdHJpbmcgcywgU3RyaW5nIHBhcmFtZXRlclNlcGFyYXRvciwgU3RyaW5nIHZhbHVlU2VwYXJhdG9yLAogICAgICBib29sIHByZXNlcnZlQmFja3NsYXNoKSB7CiAgICBpbnQgaW5kZXggPSAwOwoKICAgIGJvb2wgZG9uZSgpID0+IGluZGV4ID09IHMubGVuZ3RoOwoKICAgIHZvaWQgc2tpcFdTKCkgewogICAgICB3aGlsZSAoIWRvbmUoKSkgewogICAgICAgIGlmIChzW2luZGV4XSAhPSAiICIgJiYgc1tpbmRleF0gIT0gIlx0IikgcmV0dXJuOwogICAgICAgIGluZGV4Kys7CiAgICAgIH0KICAgIH0KCiAgICBTdHJpbmcgcGFyc2VWYWx1ZSgpIHsKICAgICAgaW50IHN0YXJ0ID0gaW5kZXg7CiAgICAgIHdoaWxlICghZG9uZSgpKSB7CiAgICAgICAgaWYgKHNbaW5kZXhdID09ICIgIiB8fAogICAgICAgICAgICBzW2luZGV4XSA9PSAiXHQiIHx8CiAgICAgICAgICAgIHNbaW5kZXhdID09IHZhbHVlU2VwYXJhdG9yIHx8CiAgICAgICAgICAgIHNbaW5kZXhdID09IHBhcmFtZXRlclNlcGFyYXRvcikgYnJlYWs7CiAgICAgICAgaW5kZXgrKzsKICAgICAgfQogICAgICByZXR1cm4gcy5zdWJzdHJpbmcoc3RhcnQsIGluZGV4KTsKICAgIH0KCiAgICB2b2lkIGV4cGVjdChTdHJpbmcgZXhwZWN0ZWQpIHsKICAgICAgaWYgKGRvbmUoKSB8fCBzW2luZGV4XSAhPSBleHBlY3RlZCkgewogICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgaGVhZGVyIHZhbHVlIik7CiAgICAgIH0KICAgICAgaW5kZXgrKzsKICAgIH0KCiAgICB2b2lkIG1heWJlRXhwZWN0KFN0cmluZyBleHBlY3RlZCkgewogICAgICBpZiAoc1tpbmRleF0gPT0gZXhwZWN0ZWQpIGluZGV4Kys7CiAgICB9CgogICAgdm9pZCBwYXJzZVBhcmFtZXRlcnMoKSB7CiAgICAgIHZhciBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CiAgICAgIF9wYXJhbWV0ZXJzID0gbmV3IFVubW9kaWZpYWJsZU1hcFZpZXcocGFyYW1ldGVycyk7CgogICAgICBTdHJpbmcgcGFyc2VQYXJhbWV0ZXJOYW1lKCkgewogICAgICAgIGludCBzdGFydCA9IGluZGV4OwogICAgICAgIHdoaWxlICghZG9uZSgpKSB7CiAgICAgICAgICBpZiAoc1tpbmRleF0gPT0gIiAiIHx8CiAgICAgICAgICAgICAgc1tpbmRleF0gPT0gIlx0IiB8fAogICAgICAgICAgICAgIHNbaW5kZXhdID09ICI9IiB8fAogICAgICAgICAgICAgIHNbaW5kZXhdID09IHBhcmFtZXRlclNlcGFyYXRvciB8fAogICAgICAgICAgICAgIHNbaW5kZXhdID09IHZhbHVlU2VwYXJhdG9yKSBicmVhazsKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpLnRvTG93ZXJDYXNlKCk7CiAgICAgIH0KCiAgICAgIFN0cmluZyBwYXJzZVBhcmFtZXRlclZhbHVlKCkgewogICAgICAgIGlmICghZG9uZSgpICYmIHNbaW5kZXhdID09ICJcIiIpIHsKICAgICAgICAgIC8vIFBhcnNlIHF1b3RlZCB2YWx1ZS4KICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICB3aGlsZSAoIWRvbmUoKSkgewogICAgICAgICAgICBpZiAoc1tpbmRleF0gPT0gIlxcIikgewogICAgICAgICAgICAgIGlmIChpbmRleCArIDEgPT0gcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgaGVhZGVyIHZhbHVlIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUJhY2tzbGFzaCAmJiBzW2luZGV4ICsgMV0gIT0gIlwiIikgewogICAgICAgICAgICAgICAgc2Iud3JpdGUoc1tpbmRleF0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpbmRleCsrOwogICAgICAgICAgICB9IGVsc2UgaWYgKHNbaW5kZXhdID09ICJcIiIpIHsKICAgICAgICAgICAgICBpbmRleCsrOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNiLndyaXRlKHNbaW5kZXhdKTsKICAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBQYXJzZSBub24tcXVvdGVkIHZhbHVlLgogICAgICAgICAgdmFyIHZhbCA9IHBhcnNlVmFsdWUoKTsKICAgICAgICAgIHJldHVybiB2YWwgPT0gIiIgPyBudWxsIDogdmFsOwogICAgICAgIH0KICAgICAgfQoKICAgICAgd2hpbGUgKCFkb25lKCkpIHsKICAgICAgICBza2lwV1MoKTsKICAgICAgICBpZiAoZG9uZSgpKSByZXR1cm47CiAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXJzZVBhcmFtZXRlck5hbWUoKTsKICAgICAgICBza2lwV1MoKTsKICAgICAgICBpZiAoZG9uZSgpKSB7CiAgICAgICAgICBwYXJhbWV0ZXJzW25hbWVdID0gbnVsbDsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgbWF5YmVFeHBlY3QoIj0iKTsKICAgICAgICBza2lwV1MoKTsKICAgICAgICBpZiAoZG9uZSgpKSB7CiAgICAgICAgICBwYXJhbWV0ZXJzW25hbWVdID0gbnVsbDsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgU3RyaW5nIHZhbHVlID0gcGFyc2VQYXJhbWV0ZXJWYWx1ZSgpOwogICAgICAgIGlmIChuYW1lID09ICdjaGFyc2V0JyAmJiB0aGlzIGlzIF9Db250ZW50VHlwZSAmJiB2YWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICAvLyBDaGFyc2V0IHBhcmFtZXRlciBvZiBDb250ZW50VHlwZXMgYXJlIGFsd2F5cyBsb3dlci1jYXNlLgogICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpOwogICAgICAgIH0KICAgICAgICBwYXJhbWV0ZXJzW25hbWVdID0gdmFsdWU7CiAgICAgICAgc2tpcFdTKCk7CiAgICAgICAgaWYgKGRvbmUoKSkgcmV0dXJuOwogICAgICAgIC8vIFRPRE86IEltcGxlbWVudCBzdXBwb3J0IGZvciBtdWx0aS12YWx1ZWQgcGFyYW1ldGVycy4KICAgICAgICBpZiAoc1tpbmRleF0gPT0gdmFsdWVTZXBhcmF0b3IpIHJldHVybjsKICAgICAgICBleHBlY3QocGFyYW1ldGVyU2VwYXJhdG9yKTsKICAgICAgfQogICAgfQoKICAgIHNraXBXUygpOwogICAgX3ZhbHVlID0gcGFyc2VWYWx1ZSgpOwogICAgc2tpcFdTKCk7CiAgICBpZiAoZG9uZSgpKSByZXR1cm47CiAgICBtYXliZUV4cGVjdChwYXJhbWV0ZXJTZXBhcmF0b3IpOwogICAgcGFyc2VQYXJhbWV0ZXJzKCk7CiAgfQp9CgpjbGFzcyBfQ29udGVudFR5cGUgZXh0ZW5kcyBfSGVhZGVyVmFsdWUgaW1wbGVtZW50cyBDb250ZW50VHlwZSB7CiAgU3RyaW5nIF9wcmltYXJ5VHlwZSA9ICIiOwogIFN0cmluZyBfc3ViVHlwZSA9ICIiOwoKICBfQ29udGVudFR5cGUoU3RyaW5nIHByaW1hcnlUeXBlLCBTdHJpbmcgc3ViVHlwZSwgU3RyaW5nIGNoYXJzZXQsCiAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykKICAgICAgOiBfcHJpbWFyeVR5cGUgPSBwcmltYXJ5VHlwZSwKICAgICAgICBfc3ViVHlwZSA9IHN1YlR5cGUsCiAgICAgICAgc3VwZXIoIiIpIHsKICAgIGlmIChfcHJpbWFyeVR5cGUgPT0gbnVsbCkgX3ByaW1hcnlUeXBlID0gIiI7CiAgICBpZiAoX3N1YlR5cGUgPT0gbnVsbCkgX3N1YlR5cGUgPSAiIjsKICAgIF92YWx1ZSA9ICIkX3ByaW1hcnlUeXBlLyRfc3ViVHlwZSI7CiAgICBpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIF9lbnN1cmVQYXJhbWV0ZXJzKCk7CiAgICAgIHBhcmFtZXRlcnMuZm9yRWFjaCgoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CiAgICAgICAgU3RyaW5nIGxvd2VyQ2FzZUtleSA9IGtleS50b0xvd2VyQ2FzZSgpOwogICAgICAgIGlmIChsb3dlckNhc2VLZXkgPT0gImNoYXJzZXQiKSB7CiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3BhcmFtZXRlcnNbbG93ZXJDYXNlS2V5XSA9IHZhbHVlOwogICAgICB9KTsKICAgIH0KICAgIGlmIChjaGFyc2V0ICE9IG51bGwpIHsKICAgICAgX2Vuc3VyZVBhcmFtZXRlcnMoKTsKICAgICAgdGhpcy5fcGFyYW1ldGVyc1siY2hhcnNldCJdID0gY2hhcnNldC50b0xvd2VyQ2FzZSgpOwogICAgfQogIH0KCiAgX0NvbnRlbnRUeXBlLl8oKTsKCiAgc3RhdGljIF9Db250ZW50VHlwZSBwYXJzZShTdHJpbmcgdmFsdWUpIHsKICAgIHZhciByZXN1bHQgPSBuZXcgX0NvbnRlbnRUeXBlLl8oKTsKICAgIHJlc3VsdC5fcGFyc2UodmFsdWUsICI7IiwgbnVsbCwgZmFsc2UpOwogICAgaW50IGluZGV4ID0gcmVzdWx0Ll92YWx1ZS5pbmRleE9mKCIvIik7CiAgICBpZiAoaW5kZXggPT0gLTEgfHwgaW5kZXggPT0gKHJlc3VsdC5fdmFsdWUubGVuZ3RoIC0gMSkpIHsKICAgICAgcmVzdWx0Ll9wcmltYXJ5VHlwZSA9IHJlc3VsdC5fdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7CiAgICAgIHJlc3VsdC5fc3ViVHlwZSA9ICIiOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0Ll9wcmltYXJ5VHlwZSA9CiAgICAgICAgICByZXN1bHQuX3ZhbHVlLnN1YnN0cmluZygwLCBpbmRleCkudHJpbSgpLnRvTG93ZXJDYXNlKCk7CiAgICAgIHJlc3VsdC5fc3ViVHlwZSA9IHJlc3VsdC5fdmFsdWUuc3Vic3RyaW5nKGluZGV4ICsgMSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgU3RyaW5nIGdldCBtaW1lVHlwZSA9PiAnJHByaW1hcnlUeXBlLyRzdWJUeXBlJzsKCiAgU3RyaW5nIGdldCBwcmltYXJ5VHlwZSA9PiBfcHJpbWFyeVR5cGU7CgogIFN0cmluZyBnZXQgc3ViVHlwZSA9PiBfc3ViVHlwZTsKCiAgU3RyaW5nIGdldCBjaGFyc2V0ID0+IHBhcmFtZXRlcnNbImNoYXJzZXQiXTsKfQoKY2xhc3MgX0Nvb2tpZSBpbXBsZW1lbnRzIENvb2tpZSB7CiAgU3RyaW5nIG5hbWU7CiAgU3RyaW5nIHZhbHVlOwogIERhdGVUaW1lIGV4cGlyZXM7CiAgaW50IG1heEFnZTsKICBTdHJpbmcgZG9tYWluOwogIFN0cmluZyBwYXRoOwogIGJvb2wgaHR0cE9ubHkgPSBmYWxzZTsKICBib29sIHNlY3VyZSA9IGZhbHNlOwoKICBfQ29va2llKFt0aGlzLm5hbWUsIHRoaXMudmFsdWVdKSB7CiAgICAvLyBEZWZhdWx0IHZhbHVlIG9mIGh0dHBvbmx5IGlzIHRydWUuCiAgICBodHRwT25seSA9IHRydWU7CiAgICBfdmFsaWRhdGUoKTsKICB9CgogIF9Db29raWUuZnJvbVNldENvb2tpZVZhbHVlKFN0cmluZyB2YWx1ZSkgewogICAgLy8gUGFyc2UgdGhlICdzZXQtY29va2llJyBoZWFkZXIgdmFsdWUuCiAgICBfcGFyc2VTZXRDb29raWVWYWx1ZSh2YWx1ZSk7CiAgfQoKICAvLyBQYXJzZSBhICdzZXQtY29va2llJyBoZWFkZXIgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBpbiBSRkMgNjI2NS4KICB2b2lkIF9wYXJzZVNldENvb2tpZVZhbHVlKFN0cmluZyBzKSB7CiAgICBpbnQgaW5kZXggPSAwOwoKICAgIGJvb2wgZG9uZSgpID0+IGluZGV4ID09IHMubGVuZ3RoOwoKICAgIFN0cmluZyBwYXJzZU5hbWUoKSB7CiAgICAgIGludCBzdGFydCA9IGluZGV4OwogICAgICB3aGlsZSAoIWRvbmUoKSkgewogICAgICAgIGlmIChzW2luZGV4XSA9PSAiPSIpIGJyZWFrOwogICAgICAgIGluZGV4Kys7CiAgICAgIH0KICAgICAgcmV0dXJuIHMuc3Vic3RyaW5nKHN0YXJ0LCBpbmRleCkudHJpbSgpOwogICAgfQoKICAgIFN0cmluZyBwYXJzZVZhbHVlKCkgewogICAgICBpbnQgc3RhcnQgPSBpbmRleDsKICAgICAgd2hpbGUgKCFkb25lKCkpIHsKICAgICAgICBpZiAoc1tpbmRleF0gPT0gIjsiKSBicmVhazsKICAgICAgICBpbmRleCsrOwogICAgICB9CiAgICAgIHJldHVybiBzLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpLnRyaW0oKTsKICAgIH0KCiAgICB2b2lkIGV4cGVjdChTdHJpbmcgZXhwZWN0ZWQpIHsKICAgICAgaWYgKGRvbmUoKSkgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSBoZWFkZXIgdmFsdWUgWyRzXSIpOwogICAgICBpZiAoc1tpbmRleF0gIT0gZXhwZWN0ZWQpIHsKICAgICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigiRmFpbGVkIHRvIHBhcnNlIGhlYWRlciB2YWx1ZSBbJHNdIik7CiAgICAgIH0KICAgICAgaW5kZXgrKzsKICAgIH0KCiAgICB2b2lkIHBhcnNlQXR0cmlidXRlcygpIHsKICAgICAgU3RyaW5nIHBhcnNlQXR0cmlidXRlTmFtZSgpIHsKICAgICAgICBpbnQgc3RhcnQgPSBpbmRleDsKICAgICAgICB3aGlsZSAoIWRvbmUoKSkgewogICAgICAgICAgaWYgKHNbaW5kZXhdID09ICI9IiB8fCBzW2luZGV4XSA9PSAiOyIpIGJyZWFrOwogICAgICAgICAgaW5kZXgrKzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHMuc3Vic3RyaW5nKHN0YXJ0LCBpbmRleCkudHJpbSgpLnRvTG93ZXJDYXNlKCk7CiAgICAgIH0KCiAgICAgIFN0cmluZyBwYXJzZUF0dHJpYnV0ZVZhbHVlKCkgewogICAgICAgIGludCBzdGFydCA9IGluZGV4OwogICAgICAgIHdoaWxlICghZG9uZSgpKSB7CiAgICAgICAgICBpZiAoc1tpbmRleF0gPT0gIjsiKSBicmVhazsKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogICAgICB9CgogICAgICB3aGlsZSAoIWRvbmUoKSkgewogICAgICAgIFN0cmluZyBuYW1lID0gcGFyc2VBdHRyaWJ1dGVOYW1lKCk7CiAgICAgICAgU3RyaW5nIHZhbHVlID0gIiI7CiAgICAgICAgaWYgKCFkb25lKCkgJiYgc1tpbmRleF0gPT0gIj0iKSB7CiAgICAgICAgICBpbmRleCsrOyAvLyBTa2lwIHRoZSA9IGNoYXJhY3Rlci4KICAgICAgICAgIHZhbHVlID0gcGFyc2VBdHRyaWJ1dGVWYWx1ZSgpOwogICAgICAgIH0KICAgICAgICBpZiAobmFtZSA9PSAiZXhwaXJlcyIpIHsKICAgICAgICAgIGV4cGlyZXMgPSBIdHRwRGF0ZS5fcGFyc2VDb29raWVEYXRlKHZhbHVlKTsKICAgICAgICB9IGVsc2UgaWYgKG5hbWUgPT0gIm1heC1hZ2UiKSB7CiAgICAgICAgICBtYXhBZ2UgPSBpbnQucGFyc2UodmFsdWUpOwogICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSAiZG9tYWluIikgewogICAgICAgICAgZG9tYWluID0gdmFsdWU7CiAgICAgICAgfSBlbHNlIGlmIChuYW1lID09ICJwYXRoIikgewogICAgICAgICAgcGF0aCA9IHZhbHVlOwogICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSAiaHR0cG9ubHkiKSB7CiAgICAgICAgICBodHRwT25seSA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChuYW1lID09ICJzZWN1cmUiKSB7CiAgICAgICAgICBzZWN1cmUgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAoIWRvbmUoKSkgaW5kZXgrKzsgLy8gU2tpcCB0aGUgOyBjaGFyYWN0ZXIKICAgICAgfQogICAgfQoKICAgIG5hbWUgPSBwYXJzZU5hbWUoKTsKICAgIGlmIChkb25lKCkgfHwgbmFtZS5sZW5ndGggPT0gMCkgewogICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigiRmFpbGVkIHRvIHBhcnNlIGhlYWRlciB2YWx1ZSBbJHNdIik7CiAgICB9CiAgICBpbmRleCsrOyAvLyBTa2lwIHRoZSA9IGNoYXJhY3Rlci4KICAgIHZhbHVlID0gcGFyc2VWYWx1ZSgpOwogICAgX3ZhbGlkYXRlKCk7CiAgICBpZiAoZG9uZSgpKSByZXR1cm47CiAgICBpbmRleCsrOyAvLyBTa2lwIHRoZSA7IGNoYXJhY3Rlci4KICAgIHBhcnNlQXR0cmlidXRlcygpOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2IuLndyaXRlKG5hbWUpLi53cml0ZSgiPSIpLi53cml0ZSh2YWx1ZSk7CiAgICBpZiAoZXhwaXJlcyAhPSBudWxsKSB7CiAgICAgIHNiLi53cml0ZSgiOyBFeHBpcmVzPSIpLi53cml0ZShIdHRwRGF0ZS5mb3JtYXQoZXhwaXJlcykpOwogICAgfQogICAgaWYgKG1heEFnZSAhPSBudWxsKSB7CiAgICAgIHNiLi53cml0ZSgiOyBNYXgtQWdlPSIpLi53cml0ZShtYXhBZ2UpOwogICAgfQogICAgaWYgKGRvbWFpbiAhPSBudWxsKSB7CiAgICAgIHNiLi53cml0ZSgiOyBEb21haW49IikuLndyaXRlKGRvbWFpbik7CiAgICB9CiAgICBpZiAocGF0aCAhPSBudWxsKSB7CiAgICAgIHNiLi53cml0ZSgiOyBQYXRoPSIpLi53cml0ZShwYXRoKTsKICAgIH0KICAgIGlmIChzZWN1cmUpIHNiLndyaXRlKCI7IFNlY3VyZSIpOwogICAgaWYgKGh0dHBPbmx5KSBzYi53cml0ZSgiOyBIdHRwT25seSIpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQoKICB2b2lkIF92YWxpZGF0ZSgpIHsKICAgIGNvbnN0IHNlcGFyYXRvcnMgPSBjb25zdCBbCiAgICAgICIoIiwKICAgICAgIikiLAogICAgICAiPCIsCiAgICAgICI+IiwKICAgICAgIkAiLAogICAgICAiLCIsCiAgICAgICI7IiwKICAgICAgIjoiLAogICAgICAiXFwiLAogICAgICAnIicsCiAgICAgICIvIiwKICAgICAgIlsiLAogICAgICAiXSIsCiAgICAgICI/IiwKICAgICAgIj0iLAogICAgICAieyIsCiAgICAgICJ9IgogICAgXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGg7IGkrKykgewogICAgICBpbnQgY29kZVVuaXQgPSBuYW1lLmNvZGVVbml0c1tpXTsKICAgICAgaWYgKGNvZGVVbml0IDw9IDMyIHx8CiAgICAgICAgICBjb2RlVW5pdCA+PSAxMjcgfHwKICAgICAgICAgIHNlcGFyYXRvcnMuaW5kZXhPZihuYW1lW2ldKSA+PSAwKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigKICAgICAgICAgICAgIkludmFsaWQgY2hhcmFjdGVyIGluIGNvb2tpZSBuYW1lLCBjb2RlIHVuaXQ6ICckY29kZVVuaXQnIik7CiAgICAgIH0KICAgIH0KCiAgICBpZiAodmFsdWVbMF0gPT0gJyInICYmIHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdID09ICciJykgewogICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGggLSAxKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHsKICAgICAgaW50IGNvZGVVbml0ID0gdmFsdWUuY29kZVVuaXRzW2ldOwogICAg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CiAgLy8gQnl0ZXMgZm9yICJIVFRQLzEuIi4KICBzdGF0aWMgY29uc3QgSFRUUDFET1QgPSBjb25zdCBbNzIsIDg0LCA4NCwgODAsIDQ3LCA0OSwgNDZdOwogIC8vIEJ5dGVzIGZvciAiSFRUUC8xLjAiLgogIHN0YXRpYyBjb25zdCBIVFRQMTAgPSBjb25zdCBbNzIsIDg0LCA4NCwgODAsIDQ3LCA0OSwgNDYsIDQ4XTsKICAvLyBCeXRlcyBmb3IgIkhUVFAvMS4xIi4KICBzdGF0aWMgY29uc3QgSFRUUDExID0gY29uc3QgWzcyLCA4NCwgODQsIDgwLCA0NywgNDksIDQ2LCA0OV07CgogIHN0YXRpYyBjb25zdCBib29sIFQgPSB0cnVlOwogIHN0YXRpYyBjb25zdCBib29sIEYgPSBmYWxzZTsKICAvLyBMb29wdXAtbWFwIGZvciB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnM6ICcoKTw+QCw7OlxcIi9bXT89e30gXHQnLgogIHN0YXRpYyBjb25zdCBTRVBBUkFUT1JfTUFQID0gY29uc3QgWwogICAgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgVCwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgLy8KICAgIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIFQsIEYsIFQsIEYsIEYsIEYsIEYsIEYsIFQsIFQsIEYsIEYsIFQsIEYsIEYsIFQsIC8vCiAgICBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBULCBULCBULCBULCBULCBULCBULCBGLCBGLCBGLCBGLCBGLCBGLCBGLCAvLwogICAgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgVCwgVCwgVCwgRiwgRiwgLy8KICAgIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIC8vCiAgICBGLCBGLCBGLCBULCBGLCBULCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCAvLwogICAgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgLy8KICAgIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIC8vCiAgICBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCAvLwogICAgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgLy8KICAgIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYKICBdOwp9CgovLyBGcmVxdWVudGx5IHVzZWQgY2hhcmFjdGVyIGNvZGVzLgpjbGFzcyBfQ2hhckNvZGUgewogIHN0YXRpYyBjb25zdCBpbnQgSFQgPSA5OwogIHN0YXRpYyBjb25zdCBpbnQgTEYgPSAxMDsKICBzdGF0aWMgY29uc3QgaW50IENSID0gMTM7CiAgc3RhdGljIGNvbnN0IGludCBTUCA9IDMyOwogIHN0YXRpYyBjb25zdCBpbnQgQU1QRVJTQU5EID0gMzg7CiAgc3RhdGljIGNvbnN0IGludCBDT01NQSA9IDQ0OwogIHN0YXRpYyBjb25zdCBpbnQgREFTSCA9IDQ1OwogIHN0YXRpYyBjb25zdCBpbnQgU0xBU0ggPSA0NzsKICBzdGF0aWMgY29uc3QgaW50IFpFUk8gPSA0ODsKICBzdGF0aWMgY29uc3QgaW50IE9ORSA9IDQ5OwogIHN0YXRpYyBjb25zdCBpbnQgQ09MT04gPSA1ODsKICBzdGF0aWMgY29uc3QgaW50IFNFTUlfQ09MT04gPSA1OTsKICBzdGF0aWMgY29uc3QgaW50IEVRVUFMID0gNjE7Cn0KCi8vIFN0YXRlcyBvZiB0aGUgSFRUUCBwYXJzZXIgc3RhdGUgbWFjaGluZS4KY2xhc3MgX1N0YXRlIHsKICBzdGF0aWMgY29uc3QgaW50IFNUQVJUID0gMDsKICBzdGF0aWMgY29uc3QgaW50IE1FVEhPRF9PUl9SRVNQT05TRV9IVFRQX1ZFUlNJT04gPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgUkVTUE9OU0VfSFRUUF9WRVJTSU9OID0gMjsKICBzdGF0aWMgY29uc3QgaW50IFJFUVVFU1RfTElORV9NRVRIT0QgPSAzOwogIHN0YXRpYyBjb25zdCBpbnQgUkVRVUVTVF9MSU5FX1VSSSA9IDQ7CiAgc3RhdGljIGNvbnN0IGludCBSRVFVRVNUX0xJTkVfSFRUUF9WRVJTSU9OID0gNTsKICBzdGF0aWMgY29uc3QgaW50IFJFUVVFU1RfTElORV9FTkRJTkcgPSA2OwogIHN0YXRpYyBjb25zdCBpbnQgUkVTUE9OU0VfTElORV9TVEFUVVNfQ09ERSA9IDc7CiAgc3RhdGljIGNvbnN0IGludCBSRVNQT05TRV9MSU5FX1JFQVNPTl9QSFJBU0UgPSA4OwogIHN0YXRpYyBjb25zdCBpbnQgUkVTUE9OU0VfTElORV9FTkRJTkcgPSA5OwogIHN0YXRpYyBjb25zdCBpbnQgSEVBREVSX1NUQVJUID0gMTA7CiAgc3RhdGljIGNvbnN0IGludCBIRUFERVJfRklFTEQgPSAxMTsKICBzdGF0aWMgY29uc3QgaW50IEhFQURFUl9WQUxVRV9TVEFSVCA9IDEyOwogIHN0YXRpYyBjb25zdCBpbnQgSEVBREVSX1ZBTFVFID0gMTM7CiAgc3RhdGljIGNvbnN0IGludCBIRUFERVJfVkFMVUVfRk9MRElOR19PUl9FTkRJTkcgPSAxNDsKICBzdGF0aWMgY29uc3QgaW50IEhFQURFUl9WQUxVRV9GT0xEX09SX0VORCA9IDE1OwogIHN0YXRpYyBjb25zdCBpbnQgSEVBREVSX0VORElORyA9IDE2OwoKICBzdGF0aWMgY29uc3QgaW50IENIVU5LX1NJWkVfU1RBUlRJTkdfQ1IgPSAxNzsKICBzdGF0aWMgY29uc3QgaW50IENIVU5LX1NJWkVfU1RBUlRJTkdfTEYgPSAxODsKICBzdGF0aWMgY29uc3QgaW50IENIVU5LX1NJWkUgPSAxOTsKICBzdGF0aWMgY29uc3QgaW50IENIVU5LX1NJWkVfRVhURU5TSU9OID0gMjA7CiAgc3RhdGljIGNvbnN0IGludCBDSFVOS19TSVpFX0VORElORyA9IDIxOwogIHN0YXRpYyBjb25zdCBpbnQgQ0hVTktFRF9CT0RZX0RPTkVfQ1IgPSAyMjsKICBzdGF0aWMgY29uc3QgaW50IENIVU5LRURfQk9EWV9ET05FX0xGID0gMjM7CiAgc3RhdGljIGNvbnN0IGludCBCT0RZID0gMjQ7CiAgc3RhdGljIGNvbnN0IGludCBDTE9TRUQgPSAyNTsKICBzdGF0aWMgY29uc3QgaW50IFVQR1JBREVEID0gMjY7CiAgc3RhdGljIGNvbnN0IGludCBGQUlMVVJFID0gMjc7CgogIHN0YXRpYyBjb25zdCBpbnQgRklSU1RfQk9EWV9TVEFURSA9IENIVU5LX1NJWkVfU1RBUlRJTkdfQ1I7Cn0KCi8vIEhUVFAgdmVyc2lvbiBvZiB0aGUgcmVxdWVzdCBvciByZXNwb25zZSBiZWluZyBwYXJzZWQuCmNsYXNzIF9IdHRwVmVyc2lvbiB7CiAgc3RhdGljIGNvbnN0IGludCBVTkRFVEVSTUlORUQgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgSFRUUDEwID0gMTsKICBzdGF0aWMgY29uc3QgaW50IEhUVFAxMSA9IDI7Cn0KCi8vIFN0YXRlcyBvZiB0aGUgSFRUUCBwYXJzZXIgc3RhdGUgbWFjaGluZS4KY2xhc3MgX01lc3NhZ2VUeXBlIHsKICBzdGF0aWMgY29uc3QgaW50IFVOREVURVJNSU5FRCA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBSRVFVRVNUID0gMTsKICBzdGF0aWMgY29uc3QgaW50IFJFU1BPTlNFID0gMDsKfQoKLyoqCiAqIFRoZSBfSHR0cERldGFjaGVkU3RyZWFtU3Vic2NyaXB0aW9uIHRha2VzIGEgc3Vic2NyaXB0aW9uIGFuZCBzb21lIGV4dHJhIGRhdGEsCiAqIGFuZCBtYWtlcyBpdCBwb3NzaWJsZSB0byAiaW5qZWN0IiB0aGUgZGF0YSBpbiBmcm9tIG9mIG90aGVyIGRhdGEgZXZlbnRzCiAqIGZyb20gdGhlIHN1YnNjcmlwdGlvbi4KICoKICogSXQgZG9lcyBzbyBieSBvdmVycmlkaW5nIHBhdXNlL3Jlc3VtZSwgc28gdGhhdCBvbmNlIHRoZQogKiBfSHR0cERldGFjaGVkU3RyZWFtU3Vic2NyaXB0aW9uIGlzIHJlc3VtZWQsIGl0J2xsIGRlbGl2ZXIgdGhlIGRhdGEgYmVmb3JlCiAqIHJlc3VtaW5nIHRoZSB1bmRlcmxheWluZyBzdWJzY3JpcHRpb24uCiAqLwpjbGFzcyBfSHR0cERldGFjaGVkU3RyZWFtU3Vic2NyaXB0aW9uIGltcGxlbWVudHMgU3RyZWFtU3Vic2NyaXB0aW9uPExpc3Q8aW50Pj4gewogIFN0cmVhbVN1YnNjcmlwdGlvbjxMaXN0PGludD4+IF9zdWJzY3JpcHRpb247CiAgTGlzdDxpbnQ+IF9pbmplY3REYXRhOwogIGJvb2wgX2lzQ2FuY2VsZWQgPSBmYWxzZTsKICBpbnQgX3BhdXNlQ291bnQgPSAxOwogIEZ1bmN0aW9uIF91c2VyT25EYXRhOwogIGJvb2wgX3NjaGVkdWxlZCA9IGZhbHNlOwoKICBfSHR0cERldGFjaGVkU3RyZWFtU3Vic2NyaXB0aW9uKAogICAgICB0aGlzLl9zdWJzY3JpcHRpb24sIHRoaXMuX2luamVjdERhdGEsIHRoaXMuX3VzZXJPbkRhdGEpOwoKICBib29sIGdldCBpc1BhdXNlZCA9PiBfc3Vic2NyaXB0aW9uLmlzUGF1c2VkOwoKICBGdXR1cmU8VD4gYXNGdXR1cmU8VD4oW1QgZnV0dXJlVmFsdWVdKSA9PgogICAgICBfc3Vic2NyaXB0aW9uLmFzRnV0dXJlPFQ+KGZ1dHVyZVZhbHVlKTsKCiAgRnV0dXJlIGNhbmNlbCgpIHsKICAgIF9pc0NhbmNlbGVkID0gdHJ1ZTsKICAgIF9pbmplY3REYXRhID0gbnVsbDsKICAgIHJldHVybiBfc3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogIH0KCiAgdm9pZCBvbkRhdGEodm9pZCBoYW5kbGVEYXRhKExpc3Q8aW50PiBkYXRhKSkgewogICAgX3VzZXJPbkRhdGEgPSBoYW5kbGVEYXRhOwogICAgX3N1YnNjcmlwdGlvbi5vbkRhdGEoaGFuZGxlRGF0YSk7CiAgfQoKICB2b2lkIG9uRG9uZSh2b2lkIGhhbmRsZURvbmUoKSkgewogICAgX3N1YnNjcmlwdGlvbi5vbkRvbmUoaGFuZGxlRG9uZSk7CiAgfQoKICB2b2lkIG9uRXJyb3IoRnVuY3Rpb24gaGFuZGxlRXJyb3IpIHsKICAgIF9zdWJzY3JpcHRpb24ub25FcnJvcihoYW5kbGVFcnJvcik7CiAgfQoKICB2b2lkIHBhdXNlKFtGdXR1cmUgcmVzdW1lU2lnbmFsXSkgewogICAgaWYgKF9pbmplY3REYXRhID09IG51bGwpIHsKICAgICAgX3N1YnNjcmlwdGlvbi5wYXVzZShyZXN1bWVTaWduYWwpOwogICAgfSBlbHNlIHsKICAgICAgX3BhdXNlQ291bnQrKzsKICAgICAgaWYgKHJlc3VtZVNpZ25hbCAhPSBudWxsKSB7CiAgICAgICAgcmVzdW1lU2lnbmFsLndoZW5Db21wbGV0ZShyZXN1bWUpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHJlc3VtZSgpIHsKICAgIGlmIChfaW5qZWN0RGF0YSA9PSBudWxsKSB7CiAgICAgIF9zdWJzY3JpcHRpb24ucmVzdW1lKCk7CiAgICB9IGVsc2UgewogICAgICBfcGF1c2VDb3VudC0tOwogICAgICBfbWF5YmVTY2hlZHVsZURhdGEoKTsKICAgIH0KICB9CgogIHZvaWQgX21heWJlU2NoZWR1bGVEYXRhKCkgewogICAgaWYgKF9zY2hlZHVsZWQpIHJldHVybjsKICAgIGlmIChfcGF1c2VDb3VudCAhPSAwKSByZXR1cm47CiAgICBfc2NoZWR1bGVkID0gdHJ1ZTsKICAgIHNjaGVkdWxlTWljcm90YXNrKCgpIHsKICAgICAgX3NjaGVkdWxlZCA9IGZhbHNlOwogICAgICBpZiAoX3BhdXNlQ291bnQgPiAwIHx8IF9pc0NhbmNlbGVkKSByZXR1cm47CiAgICAgIHZhciBkYXRhID0gX2luamVjdERhdGE7CiAgICAgIF9pbmplY3REYXRhID0gbnVsbDsKICAgICAgLy8gVG8gZW5zdXJlIHRoYXQgJ3N1YnNjcmlwdGlvbi5pc1BhdXNlZCcgaXMgZmFsc2UsIHdlIHJlc3VtZSB0aGUKICAgICAgLy8gc3Vic2NyaXB0aW9uIGhlcmUuIFRoaXMgaXMgZmluZSBhcyBwb3RlbnRpYWwgZXZlbnRzIGFyZSBkZWxheWVkLgogICAgICBfc3Vic2NyaXB0aW9uLnJlc3VtZSgpOwogICAgICBpZiAoX3VzZXJPbkRhdGEgIT0gbnVsbCkgewogICAgICAgIF91c2VyT25EYXRhKGRhdGEpOwogICAgICB9CiAgICB9KTsKICB9Cn0KCmNsYXNzIF9IdHRwRGV0YWNoZWRJbmNvbWluZyBleHRlbmRzIFN0cmVhbTxMaXN0PGludD4+IHsKICBmaW5hbCBTdHJlYW1TdWJzY3JpcHRpb248TGlzdDxpbnQ+PiBzdWJzY3JpcHRpb247CiAgZmluYWwgTGlzdDxpbnQ+IGJ1ZmZlcmVkRGF0YTsKCiAgX0h0dHBEZXRhY2hlZEluY29taW5nKHRoaXMuc3Vic2NyaXB0aW9uLCB0aGlzLmJ1ZmZlcmVkRGF0YSk7CgogIFN0cmVhbVN1YnNjcmlwdGlvbjxMaXN0PGludD4+IGxpc3Rlbih2b2lkIG9uRGF0YShMaXN0PGludD4gZXZlbnQpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSkgewogICAgaWYgKHN1YnNjcmlwdGlvbiAhPSBudWxsKSB7CiAgICAgIHN1YnNjcmlwdGlvbgogICAgICAgIC4ub25EYXRhKG9uRGF0YSkKICAgICAgICAuLm9uRXJyb3Iob25FcnJvcikKICAgICAgICAuLm9uRG9uZShvbkRvbmUpOwogICAgICBpZiAoYnVmZmVyZWREYXRhID09IG51bGwpIHsKICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uLi5yZXN1bWUoKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IF9IdHRwRGV0YWNoZWRTdHJlYW1TdWJzY3JpcHRpb24oCiAgICAgICAgICBzdWJzY3JpcHRpb24sIGJ1ZmZlcmVkRGF0YSwgb25EYXRhKQogICAgICAgIC4ucmVzdW1lKCk7CiAgICB9IGVsc2UgewogICAgICAvLyBUT0RPKDI2Mzc5KTogYWRkIHRlc3QgZm9yIHRoaXMgYnJhbmNoLgogICAgICByZXR1cm4gbmV3IFN0cmVhbTxMaXN0PGludD4+LmZyb21JdGVyYWJsZShbYnVmZmVyZWREYXRhXSkubGlzdGVuKG9uRGF0YSwKICAgICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsIG9uRG9uZTogb25Eb25lLCBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKTsKICAgIH0KICB9Cn0KCi8qKgogKiBIVFRQIHBhcnNlciB3aGljaCBwYXJzZXMgdGhlIGRhdGEgc3RyZWFtIGdpdmVuIHRvIFtjb25zdW1lXS4KICoKICogSWYgYW4gSFRUUCBwYXJzZXIgZXJyb3Igb2NjdXJzLCB0aGUgcGFyc2VyIHdpbGwgc2lnbmFsIGFuIGVycm9yIHRvIGVpdGhlcgogKiB0aGUgY3VycmVudCBfSHR0cEluY29taW5nIG9yIHRoZSBfcGFyc2VyIGl0c2VsZi4KICoKICogVGhlIGNvbm5lY3Rpb24gdXBncmFkZXMgKGUuZy4gc3dpdGNoaW5nIGZyb20gSFRUUC8xLjEgdG8gdGhlCiAqIFdlYlNvY2tldCBwcm90b2NvbCkgaXMgaGFuZGxlZCBpbiBhIHNwZWNpYWwgd2F5LiBJZiBjb25uZWN0aW9uCiAqIHVwZ3JhZGUgaXMgc3BlY2lmaWVkIGluIHRoZSBoZWFkZXJzLCB0aGVuIG9uIHRoZSBjYWxsYmFjayB0bwogKiBbOnJlc3BvbnNlU3RhcnQ6XSB0aGUgWzp1cGdyYWRlOl0gcHJvcGVydHkgb24gdGhlIFs6SHR0cFBhcnNlcjpdCiAqIG9iamVjdCB3aWxsIGJlIFs6dHJ1ZTpdIGluZGljYXRpbmcgdGhhdCBmcm9tIG5vdyBvbiB0aGUgcHJvdG9jb2wgaXMKICogbm90IEhUVFAgYW55bW9yZSBhbmQgbm8gbW9yZSBjYWxsYmFja3Mgd2lsbCBoYXBwZW4sIHRoYXQgaXMKICogWzpkYXRhUmVjZWl2ZWQ6XSBhbmQgWzpkYXRhRW5kOl0gYXJlIG5vdCBjYWxsZWQgaW4gdGhpcyBjYXNlIGFzCiAqIHRoZXJlIGlzIG5vIG1vcmUgSFRUUCBkYXRhLiBBZnRlciB0aGUgdXBncmFkZSB0aGUgbWV0aG9kCiAqIFs6cmVhZFVucGFyc2VkRGF0YTpdIGNhbiBiZSB1c2VkIHRvIHJlYWQgYW55IHJlbWFpbmluZyBieXRlcyBpbiB0aGUKICogSFRUUCBwYXJzZXIgd2hpY2ggYXJlIHBhcnQgb2YgdGhlIHByb3RvY29sIHRoZSBjb25uZWN0aW9uIGlzCiAqIHVwZ3JhZGluZyB0by4gVGhlc2UgYnl0ZXMgY2Fubm90IGJlIHByb2Nlc3NlZCBieSB0aGUgSFRUUCBwYXJzZXIKICogYW5kIHNob3VsZCBiZSBoYW5kbGVkIGFjY29yZGluZyB0byB3aGF0ZXZlciBwcm90b2NvbCBpcyBiZWluZwogKiB1cGdyYWRlZCB0by4KICovCmNsYXNzIF9IdHRwUGFyc2VyIGV4dGVuZHMgU3RyZWFtPF9IdHRwSW5jb21pbmc+IHsKICAvLyBTdGF0ZS4KICBib29sIF9wYXJzZXJDYWxsZWQgPSBmYWxzZTsKCiAgLy8gVGhlIGRhdGEgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgcGFyc2VkLgogIFVpbnQ4TGlzdCBfYnVmZmVyOwogIGludCBfaW5kZXg7CgogIGZpbmFsIGJvb2wgX3JlcXVlc3RQYXJzZXI7CiAgaW50IF9zdGF0ZTsKICBpbnQgX2h0dHBWZXJzaW9uSW5kZXg7CiAgaW50IF9tZXNzYWdlVHlwZTsKICBpbnQgX3N0YXR1c0NvZGUgPSAwOwogIGludCBfc3RhdHVzQ29kZUxlbmd0aCA9IDA7CiAgZmluYWwgTGlzdDxpbnQ+IF9tZXRob2QgPSBbXTsKICBmaW5hbCBMaXN0PGludD4gX3VyaV9vcl9yZWFzb25fcGhyYXNlID0gW107CiAgZmluYWwgTGlzdDxpbnQ+IF9oZWFkZXJGaWVsZCA9IFtdOwogIGZpbmFsIExpc3Q8aW50PiBfaGVhZGVyVmFsdWUgPSBbXTsKCiAgaW50IF9odHRwVmVyc2lvbjsKICBpbnQgX3RyYW5zZmVyTGVuZ3RoID0gLTE7CiAgYm9vbCBfcGVyc2lzdGVudENvbm5lY3Rpb247CiAgYm9vbCBfY29ubmVjdGlvblVwZ3JhZGU7CiAgYm9vbCBfY2h1bmtlZDsKCiAgYm9vbCBfbm9NZXNzYWdlQm9keSA9IGZhbHNlOwogIGludCBfcmVtYWluaW5nQ29udGVudCA9IC0xOwoKICBfSHR0cEhlYWRlcnMgX2hlYWRlcnM7CgogIC8vIFRoZSBjdXJyZW50IGluY29taW5nIGNvbm5lY3Rpb24uCiAgX0h0dHBJbmNvbWluZyBfaW5jb21pbmc7CiAgU3RyZWFtU3Vic2NyaXB0aW9uPExpc3Q8aW50Pj4gX3NvY2tldFN1YnNjcmlwdGlvbjsKICBib29sIF9wYXVzZWQgPSB0cnVlOwogIGJvb2wgX2JvZHlQYXVzZWQgPSBmYWxzZTsKICBTdHJlYW1Db250cm9sbGVyPF9IdHRwSW5jb21pbmc+IF9jb250cm9sbGVyOwogIFN0cmVhbUNvbnRyb2xsZXI8TGlzdDxpbnQ+PiBfYm9keUNvbnRyb2xsZXI7CgogIGZhY3RvcnkgX0h0dHBQYXJzZXIucmVxdWVzdFBhcnNlcigpIHsKICAgIHJldHVybiBuZXcgX0h0dHBQYXJzZXIuXyh0cnVlKTsKICB9CgogIGZhY3RvcnkgX0h0dHBQYXJzZXIucmVzcG9uc2VQYXJzZXIoKSB7CiAgICByZXR1cm4gbmV3IF9IdHRwUGFyc2VyLl8oZmFsc2UpOwogIH0KCiAgX0h0dHBQYXJzZXIuXyh0aGlzLl9yZXF1ZXN0UGFyc2VyKSB7CiAgICBfY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyPF9IdHRwSW5jb21pbmc+KAogICAgICAgIHN5bmM6IHRydWUsCiAgICAgICAgb25MaXN0ZW46ICgpIHsKICAgICAgICAgIF9wYXVzZWQgPSBmYWxzZTsKICAgICAgICB9LAogICAgICAgIG9uUGF1c2U6ICgpIHsKICAgICAgICAgIF9wYXVzZWQgPSB0cnVlOwogICAgICAgICAgX3BhdXNlU3RhdGVDaGFuZ2VkKCk7CiAgICAgICAgfSwKICAgICAgICBvblJlc3VtZTogKCkgewogICAgICAgICAgX3BhdXNlZCA9IGZhbHNlOwogICAgICAgICAgX3BhdXNlU3RhdGVDaGFuZ2VkKCk7CiAgICAgICAgfSwKICAgICAgICBvbkNhbmNlbDogKCkgewogICAgICAgICAgaWYgKF9zb2NrZXRTdWJzY3JpcHRpb24gIT0gbnVsbCkgewogICAgICAgICAgICBfc29ja2V0U3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgX3Jlc2V0KCk7CiAgfQoKICBTdHJlYW1TdWJzY3JpcHRpb248X0h0dHBJbmNvbWluZz4gbGlzdGVuKHZvaWQgb25EYXRhKF9IdHRwSW5jb21pbmcgZXZlbnQpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSkgewogICAgcmV0dXJuIF9jb250cm9sbGVyLnN0cmVhbS5saXN0ZW4ob25EYXRhLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsIG9uRG9uZTogb25Eb25lLCBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKTsKICB9CgogIHZvaWQgbGlzdGVuVG9TdHJlYW0oU3RyZWFtPExpc3Q8aW50Pj4gc3RyZWFtKSB7CiAgICAvLyBMaXN0ZW4gdG8gdGhlIHN0cmVhbSBhbmQgaGFuZGxlIGRhdGEgYWNjb3JkaW5nbHkuIFdoZW4gYQogICAgLy8gX0h0dHBJbmNvbWluZyBpcyBjcmVhdGVkLCBfZGF0YVBhdXNlLCBfZGF0YVJlc3VtZSwgX2RhdGFEb25lIGlzCiAgICAvLyBnaXZlbiB0byBwcm92aWRlIGEgd2F5IG9mIGNvbnRyb2xsaW5nIHRoZSBwYXJzZXIuCiAgICAvLyBUT0RPKGFqb2huc2VuKTogUmVtb3ZlIF9kYXRhUGF1c2UsIF9kYXRhUmVzdW1lIGFuZCBfZGF0YURvbmUgYW5kIGNsZWFuIHVwCiAgICAvLyBob3cgdGhlIF9IdHRwSW5jb21pbmcgc2lnbmFscyB0aGUgcGFyc2VyLgogICAgX3NvY2tldFN1YnNjcmlwdGlvbiA9CiAgICAgICAgc3RyZWFtLmxpc3Rlbihfb25EYXRhLCBvbkVycm9yOiBfY29udHJvbGxlci5hZGRFcnJvciwgb25Eb25lOiBfb25Eb25lKTsKICB9CgogIHZvaWQgX3BhcnNlKCkgewogICAgdHJ5IHsKICAgICAgX2RvUGFyc2UoKTsKICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgX3N0YXRlID0gX1N0YXRlLkZBSUxVUkU7CiAgICAgIF9yZXBvcnRFcnJvcihlLCBzKTsKICAgIH0KICB9CgogIC8vIFByb2Nlc3MgZW5kIG9mIGhlYWRlcnMuIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFyc2VyIHNob3VsZCBzdG9wCiAgLy8gcGFyc2luZyBhbmQgcmV0dXJuLiBUaGlzIHdpbGwgYmUgaW4gY2FzZSBvZiBlaXRoZXIgYW4gdXBncmFkZQogIC8vIHJlcXVlc3Qgb3IgYSByZXF1ZXN0IG9yIHJlc3BvbnNlIHdpdGggYW4gZW1wdHkgYm9keS4KICBib29sIF9oZWFkZXJzRW5kKCkgewogICAgX2hlYWRlcnMuX211dGFibGUgPSBmYWxzZTsKCiAgICBfdHJhbnNmZXJMZW5ndGggPSBfaGVhZGVycy5jb250ZW50TGVuZ3RoOwogICAgLy8gSWdub3JlIHRoZSBDb250ZW50LUxlbmd0aCBoZWFkZXIgaWYgVHJhbnNmZXItRW5jb2RpbmcKICAgIC8vIGlzIGNodW5rZWQgKFJGQyAyNjE2IHNlY3Rpb24gNC40KQogICAgaWYgKF9jaHVua2VkKSBfdHJhbnNmZXJMZW5ndGggPSAtMTsKCiAgICAvLyBJZiBhIHJlcXVlc3QgbWVzc2FnZSBoYXMgbmVpdGhlciBDb250ZW50LUxlbmd0aCBub3IKICAgIC8vIFRyYW5zZmVyLUVuY29kaW5nIHRoZSBtZXNzYWdlIG11c3Qgbm90IGhhdmUgYSBib2R5IChSRkMKICAgIC8vIDI2MTYgc2VjdGlvbiA0LjMpLgogICAgaWYgKF9tZXNzYWdlVHlwZSA9PSBfTWVzc2FnZVR5cGUuUkVRVUVTVCAmJgogICAgICAgIF90cmFuc2Zlckxlbmd0aCA8IDAgJiYKICAgICAgICBfY2h1bmtlZCA9PSBmYWxzZSkgewogICAgICBfdHJhbnNmZXJMZW5ndGggPSAwOwogICAgfQogICAgaWYgKF9jb25uZWN0aW9uVXBncmFkZSkgewogICAgICBfc3RhdGUgPSBfU3RhdGUuVVBHUkFERUQ7CiAgICAgIF90cmFuc2Zlckxlbmd0aCA9IDA7CiAgICB9CiAgICBfY3JlYXRlSW5jb21pbmcoX3RyYW5zZmVyTGVuZ3RoKTsKICAgIGlmIChfcmVxdWVzdFBhcnNlcikgewogICAgICBfaW5jb21pbmcubWV0aG9kID0gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKF9tZXRob2QpOwogICAgICBfaW5jb21pbmcudXJpID0KICAgICAgICAgIFVyaS5wYXJzZShuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoX3VyaV9vcl9yZWFzb25fcGhyYXNlKSk7CiAgICB9IGVsc2UgewogICAgICBfaW5jb21pbmcuc3RhdHVzQ29kZSA9IF9zdGF0dXNDb2RlOwogICAgICBfaW5jb21pbmcucmVhc29uUGhyYXNlID0gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKF91cmlfb3JfcmVhc29uX3BocmFzZSk7CiAgICB9CiAgICBfbWV0aG9kLmNsZWFyKCk7CiAgICBfdXJpX29yX3JlYXNvbl9waHJhc2UuY2xlYXIoKTsKICAgIGlmIChfY29ubmVjdGlvblVwZ3JhZGUpIHsKICAgICAgX2luY29taW5nLnVwZ3JhZGVkID0gdHJ1ZTsKICAgICAgX3BhcnNlckNhbGxlZCA9IGZhbHNlOwogICAgICB2YXIgdG1wID0gX2luY29taW5nOwogICAgICBfY2xvc2VJbmNvbWluZygpOwogICAgICBfY29udHJvbGxlci5hZGQodG1wKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoX3RyYW5zZmVyTGVuZ3RoID09IDAgfHwKICAgICAgICAoX21lc3NhZ2VUeXBlID09IF9NZXNzYWdlVHlwZS5SRVNQT05TRSAmJiBfbm9NZXNzYWdlQm9keSkpIHsKICAgICAgX3Jlc2V0KCk7CiAgICAgIHZhciB0bXAgPSBfaW5jb21pbmc7CiAgICAgIF9jbG9zZUluY29taW5nKCk7CiAgICAgIF9jb250cm9sbGVyLmFkZCh0bXApOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGVsc2UgaWYgKF9jaHVua2VkKSB7CiAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5DSFVOS19TSVpFOwogICAgICBfcmVtYWluaW5nQ29udGVudCA9IDA7CiAgICB9IGVsc2UgaWYgKF90cmFuc2Zlckxlbmd0aCA+IDApIHsKICAgICAgX3JlbWFpbmluZ0NvbnRlbnQgPSBfdHJhbnNmZXJMZW5ndGg7CiAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5CT0RZOwogICAgfSBlbHNlIHsKICAgICAgLy8gTmVpdGhlciBjaHVua2VkIG5vciBjb250ZW50IGxlbmd0aC4gRW5kIG9mIGJvZHkKICAgICAgLy8gaW5kaWNhdGVkIGJ5IGNsb3NlLgogICAgICBfc3RhdGUgPSBfU3RhdGUuQk9EWTsKICAgIH0KICAgIF9wYXJzZXJDYWxsZWQgPSBmYWxzZTsKICAgIF9jb250cm9sbGVyLmFkZChfaW5jb21pbmcpOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvLyBGcm9tIFJGQyAyNjE2LgogIC8vIGdlbmVyaWMtbWVzc2FnZSA9IHN0YXJ0LWxpbmUKICAvLyAgICAgICAgICAgICAgICAgICAqKG1lc3NhZ2UtaGVhZGVyIENSTEYpCiAgLy8gICAgICAgICAgICAgICAgICAgQ1JMRgogIC8vICAgICAgICAgICAgICAgICAgIFsgbWVzc2FnZS1ib2R5IF0KICAvLyBzdGFydC1saW5lICAgICAgPSBSZXF1ZXN0LUxpbmUgfCBTdGF0dXMtTGluZQogIC8vIFJlcXVlc3QtTGluZSAgICA9IE1ldGhvZCBTUCBSZXF1ZXN0LVVSSSBTUCBIVFRQLVZlcnNpb24gQ1JMRgogIC8vIFN0YXR1cy1MaW5lICAgICA9IEhUVFAtVmVyc2lvbiBTUCBTdGF0dXMtQ29kZSBTUCBSZWFzb24tUGhyYXNlIENSTEYKICAvLyBtZXNzYWdlLWhlYWRlciAgPSBmaWVsZC1uYW1lICI6IiBbIGZpZWxkLXZhbHVlIF0KICB2b2lkIF9kb1BhcnNlKCkgewogICAgYXNzZXJ0KCFfcGFyc2VyQ2FsbGVkKTsKICAgIF9wYXJzZXJDYWxsZWQgPSB0cnVlOwogICAgaWYgKF9zdGF0ZSA9PSBfU3RhdGUuQ0xPU0VEKSB7CiAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJEYXRhIG9uIGNsb3NlZCBjb25uZWN0aW9uIik7CiAgICB9CiAgICBpZiAoX3N0YXRlID09IF9TdGF0ZS5GQUlMVVJFKSB7CiAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJEYXRhIG9uIGZhaWxlZCBjb25uZWN0aW9uIik7CiAgICB9CiAgICB3aGlsZSAoX2J1ZmZlciAhPSBudWxsICYmCiAgICAgICAgX2luZGV4IDwgX2J1ZmZlci5sZW5ndGggJiYKICAgICAgICBfc3RhdGUgIT0gX1N0YXRlLkZBSUxVUkUgJiYKICAgICAgICBfc3RhdGUgIT0gX1N0YXRlLlVQR1JBREVEKSB7CiAgICAgIC8vIERlcGVuZGluZyBvbiBfaW5jb21pbmcsIHdlIGVpdGhlciBicmVhayBvbiBfYm9keVBhdXNlZCBvciBfcGF1c2VkLgogICAgICBpZiAoKF9pbmNvbWluZyAhPSBudWxsICYmIF9ib2R5UGF1c2VkKSB8fAogICAgICAgICAgKF9pbmNvbWluZyA9PSBudWxsICYmIF9wYXVzZWQpKSB7CiAgICAgICAgX3BhcnNlckNhbGxlZCA9IGZhbHNlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpbnQgYnl0ZSA9IF9idWZmZXJbX2luZGV4KytdOwogICAgICBzd2l0Y2ggKF9zdGF0ZSkgewogICAgICAgIGNhc2UgX1N0YXRlLlNUQVJUOgogICAgICAgICAgaWYgKGJ5dGUgPT0gX0NvbnN0LkhUVFBbMF0pIHsKICAgICAgICAgICAgLy8gU3RhcnQgcGFyc2luZyBtZXRob2Qgb3IgSFRUUCB2ZXJzaW9uLgogICAgICAgICAgICBfaHR0cFZlcnNpb25JbmRleCA9IDE7CiAgICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5NRVRIT0RfT1JfUkVTUE9OU0VfSFRUUF9WRVJTSU9OOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gU3RhcnQgcGFyc2luZyBtZXRob2QuCiAgICAgICAgICAgIGlmICghX2lzVG9rZW5DaGFyKGJ5dGUpKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIkludmFsaWQgcmVxdWVzdCBtZXRob2QiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBfbWV0aG9kLmFkZChieXRlKTsKICAgICAgICAgICAgaWYgKCFfcmVxdWVzdFBhcnNlcikgewogICAgICAgICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJJbnZhbGlkIHJlc3BvbnNlIGxpbmUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBfc3RhdGUgPSBfU3RhdGUuUkVRVUVTVF9MSU5FX01FVEhPRDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9TdGF0ZS5NRVRIT0RfT1JfUkVTUE9OU0VfSFRUUF9WRVJTSU9OOgogICAgICAgICAgaWYgKF9odHRwVmVyc2lvbkluZGV4IDwgX0NvbnN0LkhUVFAubGVuZ3RoICYmCiAgICAgICAgICAgICAgYnl0ZSA9PSBfQ29uc3QuSFRUUFtfaHR0cFZlcnNpb25JbmRleF0pIHsKICAgICAgICAgICAgLy8gQ29udGludWUgcGFyc2luZyBIVFRQIHZlcnNpb24uCiAgICAgICAgICAgIF9odHRwVmVyc2lvbkluZGV4Kys7CiAgICAgICAgICB9IGVsc2UgaWYgKF9odHRwVmVyc2lvbkluZGV4ID09IF9Db25zdC5IVFRQLmxlbmd0aCAmJgogICAgICAgICAgICAgIGJ5dGUgPT0gX0NoYXJDb2RlLlNMQVNIKSB7CiAgICAgICAgICAgIC8vIEhUVFAvIHBhcnNlZC4gQXMgbWV0aG9kIGlzIGEgdG9rZW4gdGhpcyBjYW5ub3QgYmUgYQogICAgICAgICAgICAvLyBtZXRob2QgYW55bW9yZS4KICAgICAgICAgICAgX2h0dHBWZXJzaW9uSW5kZXgrKzsKICAgICAgICAgICAgaWYgKF9yZXF1ZXN0UGFyc2VyKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIkludmFsaWQgcmVxdWVzdCBsaW5lIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX3N0YXRlID0gX1N0YXRlLlJFU1BPTlNFX0hUVFBfVkVSU0lPTjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIERpZCBub3QgcGFyc2UgSFRUUCB2ZXJzaW9uLiBFeHBlY3QgbWV0aG9kIGluc3RlYWQuCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2h0dHBWZXJzaW9uSW5kZXg7IGkrKykgewogICAgICAgICAgICAgIF9tZXRob2QuYWRkKF9Db25zdC5IVFRQW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYnl0ZSA9PSBfQ2hhckNvZGUuU1ApIHsKICAgICAgICAgICAgICBfc3RhdGUgPSBfU3RhdGUuUkVRVUVTVF9MSU5FX1VSSTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBfbWV0aG9kLmFkZChieXRlKTsKICAgICAgICAgICAgICBfaHR0cFZlcnNpb24gPSBfSHR0cFZlcnNpb24uVU5ERVRFUk1JTkVEOwogICAgICAgICAgICAgIGlmICghX3JlcXVlc3RQYXJzZXIpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJJbnZhbGlkIHJlc3BvbnNlIGxpbmUiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgX3N0YXRlID0gX1N0YXRlLlJFUVVFU1RfTElORV9NRVRIT0Q7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9TdGF0ZS5SRVNQT05TRV9IVFRQX1ZFUlNJT046CiAgICAgICAgICBpZiAoX2h0dHBWZXJzaW9uSW5kZXggPCBfQ29uc3QuSFRUUDFET1QubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIENvbnRpbnVlIHBhcnNpbmcgSFRUUCB2ZXJzaW9uLgogICAgICAgICAgICBfZXhwZWN0KGJ5dGUsIF9Db25zdC5IVFRQMURPVFtfaHR0cFZlcnNpb25JbmRleF0pOwogICAgICAgICAgICBfaHR0cFZlcnNpb25JbmRleCsrOwogICAgICAgICAgfSBlbHNlIGlmIChfaHR0cFZlcnNpb25JbmRleCA9PSBfQ29uc3QuSFRUUDFET1QubGVuZ3RoICYmCiAgICAgICAgICAgICAgYnl0ZSA9PSBfQ2hhckNvZGUuT05FKSB7CiAgICAgICAgICAgIC8vIEhUVFAvMS4xIHBhcnNlZC4KICAgICAgICAgICAgX2h0dHBWZXJzaW9uID0gX0h0dHBWZXJzaW9uLkhUVFAxMTsKICAgICAgICAgICAgX3BlcnNpc3RlbnRDb25uZWN0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgX2h0dHBWZXJzaW9uSW5kZXgrKzsKICAgICAgICAgIH0gZWxzZSBpZiAoX2h0dHBWZXJzaW9uSW5kZXggPT0gX0NvbnN0LkhUVFAxRE9ULmxlbmd0aCAmJgogICAgICAgICAgICAgIGJ5dGUgPT0gX0NoYXJDb2RlLlpFUk8pIHsKICAgICAgICAgICAgLy8gSFRUUC8xLjAgcGFyc2VkLgogICAgICAgICAgICBfaHR0cFZlcnNpb24gPSBfSHR0cFZlcnNpb24uSFRUUDEwOwogICAgICAgICAgICBfcGVyc2lzdGVudENvbm5lY3Rpb24gPSBmYWxzZTsKICAgICAgICAgICAgX2h0dHBWZXJzaW9uSW5kZXgrKzsKICAgICAgICAgIH0gZWxzZSBpZiAoX2h0dHBWZXJzaW9uSW5kZXggPT0gX0NvbnN0LkhUVFAxRE9ULmxlbmd0aCArIDEpIHsKICAgICAgICAgICAgX2V4cGVjdChieXRlLCBfQ2hhckNvZGUuU1ApOwogICAgICAgICAgICAvLyBIVFRQIHZlcnNpb24gcGFyc2VkLgogICAgICAgICAgICBfc3RhdGUgPSBfU3RhdGUuUkVTUE9OU0VfTElORV9TVEFUVVNfQ09ERTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJJbnZhbGlkIHJlc3BvbnNlIGxpbmUiKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9TdGF0ZS5SRVFVRVNUX0xJTkVfTUVUSE9EOgogICAgICAgICAgaWYgKGJ5dGUgPT0gX0NoYXJDb2RlLlNQKSB7CiAgICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5SRVFVRVNUX0xJTkVfVVJJOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKF9Db25zdC5TRVBBUkFUT1JfTUFQW2J5dGVdIHx8CiAgICAgICAgICAgICAgICBieXRlID09IF9DaGFyQ29kZS5DUiB8fAogICAgICAgICAgICAgICAgYnl0ZSA9PSBfQ2hhckNvZGUuTEYpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigiSW52YWxpZCByZXF1ZXN0IG1ldGhvZCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9tZXRob2QuYWRkKGJ5dGUpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgX1N0YXRlLlJFUVVFU1RfTElORV9VUkk6CiAgICAgICAgICBpZiAoYnl0ZSA9PSBfQ2hhckNvZGUuU1ApIHsKICAgICAgICAgICAgaWYgKF91cmlfb3JfcmVhc29uX3BocmFzZS5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJJbnZhbGlkIHJlcXVlc3QgVVJJIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX3N0YXRlID0gX1N0YXRlLlJFUVVFU1RfTElORV9IVFRQX1ZFUlNJT047CiAgICAgICAgICAgIF9odHRwVmVyc2lvbkluZGV4ID0gMDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChieXRlID09IF9DaGFyQ29kZS5DUiB8fCBieXRlID09IF9DaGFyQ29kZS5MRikgewogICAgICAgICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJJbnZhbGlkIHJlcXVlc3QgVVJJIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX3VyaV9vcl9yZWFzb25fcGhyYXNlLmFkZChieXRlKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9TdGF0ZS5SRVFVRVNUX0xJTkVfSFRUUF9WRVJTSU9OOgogICAgICAgICAgaWYgKF9odHRwVmVyc2lvbkluZGV4IDwgX0NvbnN0LkhUVFAxRE9ULmxlbmd0aCkgewogICAgICAgICAgICBfZXhwZWN0KGJ5dGUsIF9Db25zdC5IVFRQMTFbX2h0dHBWZXJzaW9uSW5kZXhdKTsKICAgICAgICAgICAgX2h0dHBWZXJzaW9uSW5kZXgrKzsKICAgICAgICAgIH0gZWxzZSBpZiAoX2h0dHBWZXJzaW9uSW5kZXggPT0gX0NvbnN0LkhUVFAxRE9ULmxlbmd0aCkgewogICAgICAgICAgICBpZiAoYnl0ZSA9PSBfQ2hhckNvZGUuT05FKSB7CiAgICAgICAgICAgICAgLy8gSFRUUC8xLjEgcGFyc2VkLgogICAgICAgICAgICAgIF9odHRwVmVyc2lvbiA9IF9IdHRwVmVyc2lvbi5IVFRQMTE7CiAgICAgICAgICAgICAgX3BlcnNpc3RlbnRDb25uZWN0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgICBfaHR0cFZlcnNpb25JbmRleCsrOwogICAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gX0NoYXJDb2RlLlpFUk8pIHsKICAgICAgICAgICAgICAvLyBIVFRQLzEuMCBwYXJzZWQuCiAgICAgICAgICAgICAgX2h0dHBWZXJzaW9uID0gX0h0dHBWZXJzaW9uLkhUVFAxMDsKICAgICAgICAgICAgICBfcGVyc2lzdGVudENvbm5lY3Rpb24gPSBmYWxzZTsKICAgICAgICAgICAgICBfaHR0cFZlcnNpb25JbmRleCsrOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJJbnZhbGlkIHJlc3BvbnNlIGxpbmUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGJ5dGUgPT0gX0NoYXJDb2RlLkNSKSB7CiAgICAgICAgICAgICAgX3N0YXRlID0gX1N0YXRlLlJFUVVFU1RfTElORV9FTkRJTkc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgX2V4cGVjdChieXRlLCBfQ2hhckNvZGUuTEYpOwogICAgICAgICAgICAgIF9tZXNzYWdlVHlwZSA9IF9NZXNzYWdlVHlwZS5SRVFVRVNUOwogICAgICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5IRUFERVJfU1RBUlQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9TdGF0ZS5SRVFVRVNUX0xJTkVfRU5ESU5HOgogICAgICAgICAgX2V4cGVjdChieXRlLCBfQ2hhckNvZGUuTEYpOwogICAgICAgICAgX21lc3NhZ2VUeXBlID0gX01lc3NhZ2VUeXBlLlJFUVVFU1Q7CiAgICAgICAgICBfc3RhdGUgPSBfU3RhdGUuSEVBREVSX1NUQVJUOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgX1N0YXRlLlJFU1BPTlNFX0xJTkVfU1RBVFVTX0NPREU6CiAgICAgICAgICBpZiAoYnl0ZSA9PSBfQ2hhckNvZGUuU1ApIHsKICAgICAgICAgICAgX3N0YXRlID0gX1N0YXRlLlJFU1BPTlNFX0xJTkVfUkVBU09OX1BIUkFTRTsKICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA9PSBfQ2hhckNvZGUuQ1IpIHsKICAgICAgICAgICAgLy8gU29tZSBIVFRQIHNlcnZlcnMgZG9lcyBub3QgZm9sbG93IHRoZSBzcGVjLiBhbmQgc2VuZAogICAgICAgICAgICAvLyBcclxuIHJpZ2h0IGFmdGVyIHRoZSBzdGF0dXMgY29kZS4KICAgICAgICAgICAgX3N0YXRlID0gX1N0YXRlLlJFU1BPTlNFX0xJTkVfRU5ESU5HOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX3N0YXR1c0NvZGVMZW5ndGgrKzsKICAgICAgICAgICAgaWYgKChieXRlIDwgMHgzMCAmJiAweDM5IDwgYnl0ZSkgfHwgX3N0YXR1c0NvZGVMZW5ndGggPiAzKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIkludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIGNvZGUiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBfc3RhdHVzQ29kZSA9IF9zdGF0dXNDb2RlICogMTAgKyBieXRlIC0gMHgzMDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgX1N0YXRlLlJFU1BPTlNFX0xJTkVfUkVBU09OX1BIUkFTRToKICAgICAgICAgIGlmIChieXRlID09IF9DaGFyQ29kZS5DUikgewogICAgICAgICAgICBfc3RhdGUgPSBfU3RhdGUuUkVTUE9OU0VfTElORV9FTkRJTkc7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoYnl0ZSA9PSBfQ2hhckNvZGUuQ1IgfHwgYnl0ZSA9PSBfQ2hhckNvZGUuTEYpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigiSW52YWxpZCByZXNwb25zZSByZWFzb24gcGhyYXNlIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX3VyaV9vcl9yZWFzb25fcGhyYXNlLmFkZChieXRlKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9TdGF0ZS5SRVNQT05TRV9MSU5FX0VORElORzoKICAgICAgICAgIF9leHBlY3QoYnl0ZSwgX0NoYXJDb2RlLkxGKTsKICAgICAgICAgIF9tZXNzYWdlVHlwZSA9PSBfTWVzc2FnZVR5cGUuUkVTUE9OU0U7CiAgICAgICAgICBpZiAoX3N0YXR1c0NvZGUgPCAxMDAgfHwgX3N0YXR1c0NvZGUgPiA1OTkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIkludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIGNvZGUiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhpcyByZXNwb25zZSB3aWxsIG5ldmVyIGhhdmUgYSBib2R5LgogICAgICAgICAgICBpZiAoX3N0YXR1c0NvZGUgPD0gMTk5IHx8CiAgICAgICAgICAgICAgICBfc3RhdHVzQ29kZSA9PSAyMDQgfHwKICAgICAgICAgICAgICAgIF9zdGF0dXNDb2RlID09IDMwNCkgewogICAgICAgICAgICAgIF9ub01lc3NhZ2VCb2R5ID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgX3N0YXRlID0gX1N0YXRlLkhFQURFUl9TVEFSVDsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9TdGF0ZS5IRUFERVJfU1RBUlQ6CiAgICAgICAgICBfaGVhZGVycyA9IG5ldyBfSHR0cEhlYWRlcnModmVyc2lvbik7CiAgICAgICAgICBpZiAoYnl0ZSA9PSBfQ2hhckNvZGUuQ1IpIHsKICAgICAgICAgICAgX3N0YXRlID0gX1N0YXRlLkhFQURFUl9FTkRJTkc7CiAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gX0NoYXJDb2RlLkxGKSB7CiAgICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5IRUFERVJfRU5ESU5HOwogICAgICAgICAgICBfaW5kZXgtLTsgLy8gTWFrZSB0aGUgbmV3IHN0YXRlIHNlZSB0aGUgTEYgYWdhaW4uCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBTdGFydCBvZiBuZXcgaGVhZGVyIGZpZWxkLgogICAgICAgICAgICBfaGVhZGVyRmllbGQuYWRkKF90b0xvd2VyQ2FzZUJ5dGUoYnl0ZSkpOwogICAgICAgICAgICBfc3RhdGUgPSBfU3RhdGUuSEVBREVSX0ZJRUxEOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgX1N0YXRlLkhFQURFUl9GSUVMRDoKICAgICAgICAgIGlmIChieXRlID09IF9DaGFyQ29kZS5DT0xPTikgewogICAgICAgICAgICBfc3RhdGUgPSBfU3RhdGUuSEVBREVSX1ZBTFVFX1NUQVJUOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFfaXNUb2tlbkNoYXIoYnl0ZSkpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigiSW52YWxpZCBoZWFkZXIgZmllbGQgbmFtZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9oZWFkZXJGaWVsZC5hZGQoX3RvTG93ZXJDYXNlQnl0ZShieXRlKSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBfU3RhdGUuSEVBREVSX1ZBTFVFX1NUQVJUOgogICAgICAgICAgaWYgKGJ5dGUgPT0gX0NoYXJDb2RlLkNSKSB7CiAgICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5IRUFERVJfVkFMVUVfRk9MRElOR19PUl9FTkRJTkc7CiAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gX0NoYXJDb2RlLkxGKSB7CiAgICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5IRUFERVJfVkFMVUVfRk9MRF9PUl9FTkQ7CiAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgIT0gX0NoYXJDb2RlLlNQICYmIGJ5dGUgIT0gX0NoYXJDb2RlLkhUKSB7CiAgICAgICAgICAgIC8vIFN0YXJ0IG9mIG5ldyBoZWFkZXIgdmFsdWUuCiAgICAgICAgICAgIF9oZWFkZXJWYWx1ZS5hZGQoYnl0ZSk7CiAgICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5IRUFERVJfVkFMVUU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBfU3RhdGUuSEVBREVSX1ZBTFVFOgogICAgICAgICAgaWYgKGJ5dGUgPT0gX0NoYXJDb2RlLkNSKSB7CiAgICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5IRUFERVJfVkFMVUVfRk9MRElOR19PUl9FTkRJTkc7CiAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gX0NoYXJDb2RlLkxGKSB7CiAgICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5IRUFERVJfVkFMVUVfRk9MRF9PUl9FTkQ7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfaGVhZGVyVmFsdWUuYWRkKGJ5dGUpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgX1N0YXRlLkhFQURFUl9WQUxVRV9GT0xESU5HX09SX0VORElORzoKICAgICAgICAgIF9leHBlY3QoYnl0ZSwgX0NoYXJDb2RlLkxGKTsKICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5IRUFERVJfVkFMVUVfRk9MRF9PUl9FTkQ7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBfU3RhdGUuSEVBREVSX1ZBTFVFX0ZPTERfT1JfRU5EOgogICAgICAgICAgaWYgKGJ5dGUgPT0gX0NoYXJDb2RlLlNQIHx8IGJ5dGUgPT0gX0NoYXJDb2RlLkhUKSB7CiAgICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5IRUFERVJfVkFMVUVfU1RBUlQ7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBTdHJpbmcgaGVhZGVyRmllbGQgPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoX2hlYWRlckZpZWxkKTsKICAgICAgICAgICAgU3RyaW5nIGhlYWRlclZhbHVlID0gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKF9oZWFkZXJWYWx1ZSk7CiAgICAgICAgICAgIGlmIChoZWFkZXJGaWVsZCA9PSAidHJhbnNmZXItZW5jb2RpbmciICYmCiAgICAgICAgICAgICAgICBfY2FzZUluc2Vuc2l0aXZlQ29tcGFyZSgiY2h1bmtlZCIuY29kZVVuaXRzLCBfaGVhZGVyVmFsdWUpKSB7CiAgICAgICAgICAgICAgX2NodW5rZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChoZWFkZXJGaWVsZCA9PSAiY29ubmVjdGlvbiIpIHsKICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gdG9rZW5zID0gX3Rva2VuaXplRmllbGRWYWx1ZShoZWFkZXJWYWx1ZSk7CiAgICAgICAgICAgICAgZmluYWwgYm9vbCBpc1Jlc3BvbnNlID0gX21lc3NhZ2VUeXBlID09IF9NZXNzYWdlVHlwZS5SRVNQT05TRTsKICAgICAgICAgICAgICBmaW5hbCBib29sIGlzVXBncmFkZUNvZGUgPQogICAgICAgICAgICAgICAgICAoX3N0YXR1c0NvZGUgPT0gSHR0cFN0YXR1cy51cGdyYWRlUmVxdWlyZWQpIHx8CiAgICAgICAgICAgICAgICAgICAgICAoX3N0YXR1c0NvZGUgPT0gSHR0cFN0YXR1cy5zd2l0Y2hpbmdQcm90b2NvbHMpOwogICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBmaW5hbCBib29sIGlzVXBncmFkZSA9IF9jYXNlSW5zZW5zaXRpdmVDb21wYXJlKAogICAgICAgICAgICAgICAgICAgICJ1cGdyYWRlIi5jb2RlVW5pdHMsIHRva2Vuc1tpXS5jb2RlVW5pdHMpOwogICAgICAgICAgICAgICAgaWYgKChpc1VwZ3JhZGUgJiYgIWlzUmVzcG9uc2UpIHx8CiAgICAgICAgICAgICAgICAgICAgKGlzVXBncmFkZSAmJiBpc1Jlc3BvbnNlICYmIGlzVXBncmFkZUNvZGUpKSB7CiAgICAgICAgICAgICAgICAgIF9jb25uZWN0aW9uVXBncmFkZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfaGVhZGVycy5fYWRkKGhlYWRlckZpZWxkLCB0b2tlbnNbaV0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBfaGVhZGVycy5fYWRkKGhlYWRlckZpZWxkLCBoZWFkZXJWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX2hlYWRlckZpZWxkLmNsZWFyKCk7CiAgICAgICAgICAgIF9oZWFkZXJWYWx1ZS5jbGVhcigpOwoKICAgICAgICAgICAgaWYgKGJ5dGUgPT0gX0NoYXJDb2RlLkNSKSB7CiAgICAgICAgICAgICAgX3N0YXRlID0gX1N0YXRlLkhFQURFUl9FTkRJTkc7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA9PSBfQ2hhckNvZGUuTEYpIHsKICAgICAgICAgICAgICBfc3RhdGUgPSBfU3RhdGUuSEVBREVSX0VORElORzsKICAgICAgICAgICAgICBfaW5kZXgtLTsgLy8gTWFrZSB0aGUgbmV3IHN0YXRlIHNlZSB0aGUgTEYgYWdhaW4uCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy8gU3RhcnQgb2YgbmV3IGhlYWRlciBmaWVsZC4KICAgICAgICAgICAgICBfaGVhZGVyRmllbGQuYWRkKF90b0xvd2VyQ2FzZUJ5dGUoYnl0ZSkpOwogICAgICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5IRUFERVJfRklFTEQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9TdGF0ZS5IRUFERVJfRU5ESU5HOgogICAgICAgICAgX2V4cGVjdChieXRlLCBfQ2hhckNvZGUuTEYpOwogICAgICAgICAgaWYgKF9oZWFkZXJzRW5kKCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm47CgogICAgICAgIGNhc2UgX1N0YXRlLkNIVU5LX1NJWkVfU1RBUlRJTkdfQ1I6CiAgICAgICAgICBfZXhwZWN0KGJ5dGUsIF9DaGFyQ29kZS5DUik7CiAgICAgICAgICBfc3RhdGUgPSBfU3RhdGUuQ0hVTktfU0laRV9TVEFSVElOR19MRjsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9TdGF0ZS5DSFVOS19TSVpFX1NUQVJUSU5HX0xGOgogICAgICAgICAgX2V4cGVjdChieXRlLCBfQ2hhckNvZGUuTEYpOwogICAgICAgICAgX3N0YXRlID0gX1N0YXRlLkNIVU5LX1NJWkU7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBfU3RhdGUuQ0hVTktfU0laRToKICAgICAgICAgIGlmIChieXRlID09IF9DaGFyQ29kZS5DUikgewogICAgICAgICAgICBfc3RhdGUgPSBfU3RhdGUuQ0hVTktfU0laRV9FTkRJTkc7CiAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gX0NoYXJDb2RlLlNFTUlfQ09MT04pIHsKICAgICAgICAgICAgX3N0YXRlID0gX1N0YXRlLkNIVU5LX1NJWkVfRVhURU5TSU9OOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaW50IHZhbHVlID0gX2V4cGVjdEhleERpZ2l0KGJ5dGUpOwogICAgICAgICAgICBfcmVtYWluaW5nQ29udGVudCA9IF9yZW1haW5pbmdDb250ZW50ICogMTYgKyB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9TdGF0ZS5DSFVOS19TSVpFX0VYVEVOU0lPTjoKICAgICAgICAgIGlmIChieXRlID09IF9DaGFyQ29kZS5DUikgewogICAgICAgICAgICBfc3RhdGUgPSBfU3RhdGUuQ0hVTktfU0laRV9FTkRJTkc7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBfU3RhdGUuQ0hVTktfU0laRV9FTkRJTkc6CiAgICAgICAgICBfZXhwZWN0KGJ5dGUsIF9DaGFyQ29kZS5MRik7CiAgICAgICAgICBpZiAoX3JlbWFpbmluZ0NvbnRlbnQgPiAwKSB7CiAgICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5CT0RZOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX3N0YXRlID0gX1N0YXRlLkNIVU5LRURfQk9EWV9ET05FX0NSOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgX1N0YXRlLkNIVU5LRURfQk9EWV9ET05FX0NSOgogICAgICAgICAgX2V4cGVjdChieXRlLCBfQ2hhckNvZGUuQ1IpOwogICAgICAgICAgX3N0YXRlID0gX1N0YXRlLkNIVU5LRURfQk9EWV9ET05FX0xGOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgX1N0YXRlLkNIVU5LRURfQk9EWV9ET05FX0xGOgogICAgICAgICAgX2V4cGVjdChieXRlLCBfQ2hhckNvZGUuTEYpOwogICAgICAgICAgX3Jlc2V0KCk7CiAgICAgICAgICBfY2xvc2VJbmNvbWluZygpOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgX1N0YXRlLkJPRFk6CiAgICAgICAgICAvLyBUaGUgYm9keSBpcyBub3QgaGFuZGxlZCBvbmUgYnl0ZSBhdCBhIHRpbWUgYnV0IGluIGJsb2Nrcy4KICAgICAgICAgIF9pbmRleC0tOwogICAgICAgICAgaW50IGRhdGFBdmFpbGFibGUgPSBfYnVmZmVyLmxlbmd0aCAtIF9pbmRleDsKICAgICAgICAgIGlmIChfcmVtYWluaW5nQ29udGVudCA+PSAwICYmIGRhdGFBdmFpbGFibGUgPiBfcmVtYWluaW5nQ29udGVudCkgewogICAgICAgICAgICBkYXRhQXZhaWxhYmxlID0gX3JlbWFpbmluZ0NvbnRlbnQ7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBBbHdheXMgcHJlc2VudCB0aGUgZGF0YSBhcyBhIHZpZXcuIFRoaXMgd2F5IHdlIGNhbiBoYW5kbGUgYWxsCiAgICAgICAgICAvLyBjYXNlcyBsaWtlIHRoaXMsIGFuZCB0aGUgdXNlciB3aWxsIG5vdCBleHBlcmllbmNlIGRpZmZlcmVudCBkYXRhCiAgICAgICAgICAvLyB0eXBlZCAod2hpY2ggY291bGQgbGVhZCB0byBwb2x5bW9ycGhpYyB1c2VyIGNvZGUpLgogICAgICAgICAgTGlzdDxpbnQ+IGRhdGEgPSBuZXcgVWludDhMaXN0LnZpZXcoCiAgICAgICAgICAgICAgX2J1ZmZlci5idWZmZXIsIF9idWZmZXIub2Zmc2V0SW5CeXRlcyArIF9pbmRleCwgZGF0YUF2YWlsYWJsZSk7CiAgICAgICAgICBfYm9keUNvbnRyb2xsZXIuYWRkKGRhdGEpOwogICAgICAgICAgaWYgKF9yZW1haW5pbmdDb250ZW50ICE9IC0xKSB7CiAgICAgICAgICAgIF9yZW1haW5pbmdDb250ZW50IC09IGRhdGEubGVuZ3RoOwogICAgICAgICAgfQogICAgICAgICAgX2luZGV4ICs9IGRhdGEubGVuZ3RoOwogICAgICAgICAgaWYgKF9yZW1haW5pbmdDb250ZW50ID09IDApIHsKICAgICAgICAgICAgaWYgKCFfY2h1bmtlZCkgewogICAgICAgICAgICAgIF9yZXNldCgpOwogICAgICAgICAgICAgIF9jbG9zZUluY29taW5nKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgX3N0YXRlID0gX1N0YXRlLkNIVU5LX1NJWkVfU1RBUlRJTkdfQ1I7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9TdGF0ZS5GQUlMVVJFOgogICAgICAgICAgLy8gU2hvdWxkIGJlIHVucmVhY2hhYmxlLgogICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgLy8gU2hvdWxkIGJlIHVucmVhY2hhYmxlLgogICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgX3BhcnNlckNhbGxlZCA9IGZhbHNlOwogICAgaWYgKF9idWZmZXIgIT0gbnVsbCAmJiBfaW5kZXggPT0gX2J1ZmZlci5sZW5ndGgpIHsKICAgICAgLy8gSWYgYWxsIGRhdGEgaXMgcGFyc2VkIHJlbGVhc2UgdGhlIGJ1ZmZlciBhbmQgcmVzdW1lIHJlY2VpdmluZwogICAgICAvLyBkYXRhLgogICAgICBfcmVsZWFzZUJ1ZmZlcigpOwogICAgICBpZiAoX3N0YXRlICE9IF9TdGF0ZS5VUEdSQURFRCAmJiBfc3RhdGUgIT0gX1N0YXRlLkZBSUxVUkUpIHsKICAgICAgICBfc29ja2V0U3Vic2NyaXB0aW9uLnJlc3VtZSgpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIF9vbkRhdGEoTGlzdDxpbnQ+IGJ1ZmZlcikgewogICAgX3NvY2tldFN1YnNjcmlwdGlvbi5wYXVzZSgpOwogICAgYXNzZXJ0KF9idWZmZXIgPT0gbnVsbCk7CiAgICBfYnVmZmVyID0gYnVmZmVyOwogICAgX2luZGV4ID0gMDsKICAgIF9wYXJzZSgpOwogIH0KCiAgdm9pZCBfb25Eb25lKCkgewogICAgLy8gb25Eb25lIGNhbmNlbHMgdGhlIHN1YnNjcmlwdGlvbi4KICAgIF9zb2NrZXRTdWJzY3JpcHRpb24gPSBudWxsOwogICAgaWYgKF9zdGF0ZSA9PSBfU3RhdGUuQ0xPU0VEIHx8IF9zdGF0ZSA9PSBfU3RhdGUuRkFJTFVSRSkgcmV0dXJuOwoKICAgIGlmIChfaW5jb21pbmcgIT0gbnVsbCkgewogICAgICBpZiAoX3N0YXRlICE9IF9TdGF0ZS5VUEdSQURFRCAmJgogICAgICAgICAgIShfc3RhdGUgPT0gX1N0YXRlLlNUQVJUICYmICFfcmVxdWVzdFBhcnNlcikgJiYKICAgICAgICAgICEoX3N0YXRlID09IF9TdGF0ZS5CT0RZICYmICFfY2h1bmtlZCAmJiBfdHJhbnNmZXJMZW5ndGggPT0gLTEpKSB7CiAgICAgICAgX2JvZHlDb250cm9sbGVyLmFkZEVycm9yKAogICAgICAgICAgICBuZXcgSHR0cEV4Y2VwdGlvbigiQ29ubmVjdGlvbiBjbG9zZWQgd2hpbGUgcmVjZWl2aW5nIGRhdGEiKSk7CiAgICAgIH0KICAgICAgX2Nsb3NlSW5jb21pbmcodHJ1ZSk7CiAgICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIElmIHRoZSBjb25uZWN0aW9uIGlzIGlkbGUgdGhlIEhUVFAgc3RyZWFtIGlzIGNsb3NlZC4KICAgIGlmIChfc3RhdGUgPT0gX1N0YXRlLlNUQVJUKSB7CiAgICAgIGlmICghX3JlcXVlc3RQYXJzZXIpIHsKICAgICAgICBfcmVwb3J0RXJyb3IobmV3IEh0dHBFeGNlcHRpb24oCiAgICAgICAgICAgICJDb25uZWN0aW9uIGNsb3NlZCBiZWZvcmUgZnVsbCBoZWFkZXIgd2FzIHJlY2VpdmVkIikpOwogICAgICB9CiAgICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoX3N0YXRlID09IF9TdGF0ZS5VUEdSQURFRCkgewogICAgICBfY29udHJvbGxlci5jbG9zZSgpOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKF9zdGF0ZSA8IF9TdGF0ZS5GSVJTVF9CT0RZX1NUQVRFKSB7CiAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5GQUlMVVJFOwogICAgICAvLyBSZXBvcnQgdGhlIGVycm9yIHRocm91Z2ggdGhlIGVycm9yIGNhbGxiYWNrIGlmIGFueS4gT3RoZXJ3aXNlCiAgICAgIC8vIHRocm93IHRoZSBlcnJvci4KICAgICAgX3JlcG9ydEVycm9yKG5ldyBIdHRwRXhjZXB0aW9uKAogICAgICAgICAgIkNvbm5lY3Rpb24gY2xvc2VkIGJlZm9yZSBmdWxsIGhlYWRlciB3YXMgcmVjZWl2ZWQiKSk7CiAgICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoIV9jaHVua2VkICYmIF90cmFuc2Zlckxlbmd0aCA9PSAtMSkgewogICAgICBfc3RhdGUgPSBfU3RhdGUuQ0xPU0VEOwogICAgfSBlbHNlIHsKICAgICAgX3N0YXRlID0gX1N0YXRlLkZBSUxVUkU7CiAgICAgIC8vIFJlcG9ydCB0aGUgZXJyb3IgdGhyb3VnaCB0aGUgZXJyb3IgY2FsbGJhY2sgaWYgYW55LiBPdGhlcndpc2UKICAgICAgLy8gdGhyb3cgdGhlIGVycm9yLgogICAgICBfcmVwb3J0RXJyb3IoCiAgICAgICAgICBuZXcgSHR0cEV4Y2VwdGlvbigiQ29ubmVjdGlvbiBjbG9zZWQgYmVmb3JlIGZ1bGwgYm9keSB3YXMgcmVjZWl2ZWQiKSk7CiAgICB9CiAgICBfY29udHJvbGxlci5jbG9zZSgpOwogIH0KCiAgU3RyaW5nIGdldCB2ZXJzaW9uIHsKICAgIHN3aXRjaCAoX2h0dHBWZXJzaW9uKSB7CiAgICAgIGNhc2UgX0h0dHBWZXJzaW9uLkhUVFAxMDoKICAgICAgICByZXR1cm4gIjEuMCI7CiAgICAgIGNhc2UgX0h0dHBWZXJzaW9uLkhUVFAxMToKICAgICAgICByZXR1cm4gIjEuMSI7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGludCBnZXQgbWVzc2FnZVR5cGUgPT4gX21lc3NhZ2VUeXBlOwogIGludCBnZXQgdHJhbnNmZXJMZW5ndGggPT4gX3RyYW5zZmVyTGVuZ3RoOwogIGJvb2wgZ2V0IHVwZ3JhZGUgPT4gX2Nvbm5lY3Rpb25VcGdyYWRlICYmIF9zdGF0ZSA9PSBfU3RhdGUuVVBHUkFERUQ7CiAgYm9vbCBnZXQgcGVyc2lzdGVudENvbm5lY3Rpb24gPT4gX3BlcnNpc3RlbnRDb25uZWN0aW9uOwoKICB2b2lkIHNldCBpc0hlYWQoYm9vbCB2YWx1ZSkgewogICAgaWYgKHZhbHVlKSBfbm9NZXNzYWdlQm9keSA9IHRydWU7CiAgfQoKICBfSHR0cERldGFjaGVkSW5jb21pbmcgZGV0YWNoSW5jb21pbmcoKSB7CiAgICAvLyBTaW11bGF0ZSBkZXRhY2hlZCBieSBtYXJraW5nIGFzIHVwZ3JhZGVkLgogICAgX3N0YXRlID0gX1N0YXRlLlVQR1JBREVEOwogICAgcmV0dXJuIG5ldyBfSHR0cERldGFjaGVkSW5jb21pbmcoX3NvY2tldFN1YnNjcmlwdGlvbiwgcmVhZFVucGFyc2VkRGF0YSgpKTsKICB9CgogIExpc3Q8aW50PiByZWFkVW5wYXJzZWREYXRhKCkgewogICAgaWYgKF9idWZmZXIgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBpZiAoX2luZGV4ID09IF9idWZmZXIubGVuZ3RoKSByZXR1cm4gbnVsbDsKICAgIHZhciByZXN1bHQgPSBfYnVmZmVyLnN1Ymxpc3QoX2luZGV4KTsKICAgIF9yZWxlYXNlQnVmZmVyKCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBfcmVzZXQoKSB7CiAgICBpZiAoX3N0YXRlID09IF9TdGF0ZS5VUEdSQURFRCkgcmV0dXJuOwogICAgX3N0YXRlID0gX1N0YXRlLlNUQVJUOwogICAgX21lc3NhZ2VUeXBlID0gX01lc3NhZ2VUeXBlLlVOREVURVJNSU5FRDsKICAgIF9oZWFkZXJGaWVsZC5jbGVhcigpOwogICAgX2hlYWRlclZhbHVlLmNsZWFyKCk7CiAgICBfbWV0aG9kLmNsZWFyKCk7CiAgICBfdXJpX29yX3JlYXNvbl9waHJhc2UuY2xlYXIoKTsKCiAgICBfc3RhdHVzQ29kZSA9IDA7CiAgICBfc3RhdHVzQ29kZUxlbmd0aCA9IDA7CgogICAgX2h0dHBWZXJzaW9uID0gX0h0dHBWZXJzaW9uLlVOREVURVJNSU5FRDsKICAgIF90cmFuc2Zlckxlbmd0aCA9IC0xOwogICAgX3BlcnNpc3RlbnRDb25uZWN0aW9uID0gZmFsc2U7CiAgICBfY29ubmVjdGlvblVwZ3JhZGUgPSBmYWxzZTsKICAgIF9jaHVua2VkID0gZmFsc2U7CgogICAgX25vTWVzc2FnZUJvZHkgPSBmYWxzZTsKICAgIF9yZW1haW5pbmdDb250ZW50ID0gLTE7CgogICAgX2hlYWRlcnMgPSBudWxsOwogIH0KCiAgdm9pZCBfcmVsZWFzZUJ1ZmZlcigpIHsKICAgIF9idWZmZXIgPSBudWxsOwogICAgX2luZGV4ID0gbnVsbDsKICB9CgogIHN0YXRpYyBib29sIF9pc1Rva2VuQ2hhcihpbnQgYnl0ZSkgewogICAgcmV0dXJuIGJ5dGUgPiAzMSAmJiBieXRlIDwgMTI4ICYmICFfQ29uc3QuU0VQQVJBVE9SX01BUFtieXRlXTsKICB9CgogIHN0YXRpYyBib29sIF9pc1ZhbHVlQ2hhcihpbnQgYnl0ZSkgewogICAgcmV0dXJuIChieXRlID4gMzEgJiYgYnl0ZSA8IDEyOCkgfHwKICAgICAgICAoYnl0ZSA9PSBfQ2hhckNvZGUuU1ApIHx8CiAgICAgICAgKGJ5dGUgPT0gX0NoYXJDb2RlLkhUKTsKICB9CgogIHN0YXRpYyBMaXN0PFN0cmluZz4gX3Rva2VuaXplRmllbGRWYWx1ZShTdHJpbmcgaGVhZGVyVmFsdWUpIHsKICAgIExpc3Q8U3RyaW5nPiB0b2tlbnMgPSBuZXcgTGlzdDxTdHJpbmc+KCk7CiAgICBpbnQgc3RhcnQgPSAwOwogICAgaW50IGluZGV4ID0gMDsKICAgIHdoaWxlIChpbmRleCA8IGhlYWRlclZhbHVlLmxlbmd0aCkgewogICAgICBpZiAoaGVhZGVyVmFsdWVbaW5kZXhdID09ICIsIikgewogICAgICAgIHRva2Vucy5hZGQoaGVhZGVyVmFsdWUuc3Vic3RyaW5nKHN0YXJ0LCBpbmRleCkpOwogICAgICAgIHN0YXJ0ID0gaW5kZXggKyAxOwogICAgICB9IGVsc2UgaWYgKGhlYWRlclZhbHVlW2luZGV4XSA9PSAiICIgfHwgaGVhZGVyVmFsdWVbaW5kZXhdID09ICJcdCIpIHsKICAgICAgICBzdGFydCsrOwogICAgICB9CiAgICAgIGluZGV4Kys7CiAgICB9CiAgICB0b2tlbnMuYWRkKGhlYWRlclZhbHVlLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpKTsKICAgIHJldHVybiB0b2tlbnM7CiAgfQoKICBzdGF0aWMgaW50IF90b0xvd2VyQ2FzZUJ5dGUoaW50IHgpIHsKICAgIC8vIE9wdGltaXplZCB2ZXJzaW9uOgogICAgLy8gIC0gIDB4NDEgaXMgJ0EnCiAgICAvLyAgLSAgMHg3ZiBpcyBBU0NJSSBtYXNrCiAgICAvLyAgLSAgMjYgaXMgdGhlIG51bWJlciBvZiBhbHBoYSBjaGFyYWN0ZXJzLgogICAgLy8gIC0gIDB4MjAgaXMgdGhlIGRlbHRhIGJldHdlZW4gbG93ZXIgYW5kIHVwcGVyIGNoYXJzLgogICAgcmV0dXJuICgoKHggLSAweDQxKSAmIDB4N2YpIDwgMjYpID8gKHggfCAweDIwKSA6IHg7CiAgfQoKICAvLyBleHBlY3RlZCBzaG91bGQgYWxyZWFkeSBiZSBsb3dlcmNhc2UuCiAgYm9vbCBfY2FzZUluc2Vuc2l0aXZlQ29tcGFyZShMaXN0PGludD4gZXhwZWN0ZWQsIExpc3Q8aW50PiB2YWx1ZSkgewogICAgaWYgKGV4cGVjdGVkLmxlbmd0aCAhPSB2YWx1ZS5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGV4cGVjdGVkW2ldICE9IF90b0xvd2VyQ2FzZUJ5dGUodmFsdWVbaV0pKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGludCBfZXhwZWN0KGludCB2YWwxLCBpbnQgdmFsMikgewogICAgaWYgKHZhbDEgIT0gdmFsMikgewogICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigiRmFpbGVkIHRvIHBhcnNlIEhUVFAiKTsKICAgIH0KICB9CgogIGludCBfZXhwZWN0SGV4RGlnaXQoaW50IGJ5dGUpIHsKICAgIGlmICgweDMwIDw9IGJ5dGUgJiYgYnl0ZSA8PSAweDM5KSB7CiAgICAgIHJldHVybiBieXRlIC0gMHgzMDsgLy8gMCAtIDkKICAgIH0gZWxzZSBpZiAoMHg0MSA8PSBieXRlICYmIGJ5dGUgPD0gMHg0NikgewogICAgICByZXR1cm4gYnl0ZSAtIDB4NDEgKyAxMDsgLy8gQSAtIEYKICAgIH0gZWxzZSBpZiAoMHg2MSA8PSBieXRlICYmIGJ5dGUgPD0gMHg2NikgewogICAgICByZXR1cm4gYnl0ZSAtIDB4NjEgKyAxMDsgLy8gYSAtIGYKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgSFRUUCIpOwogICAgfQogIH0KCiAgdm9pZCBfY3JlYXRlSW5jb21pbmcoaW50IHRyYW5zZmVyTGVuZ3RoKSB7CiAgICBhc3NlcnQoX2luY29taW5nID09IG51bGwpOwogICAgYXNzZXJ0KF9ib2R5Q29udHJvbGxlciA9PSBudWxsKTsKICAgIGFzc2VydCghX2JvZHlQYXVzZWQpOwogICAgdmFyIGluY29taW5nOwogICAgX2JvZHlDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8TGlzdDxpbnQ+PigKICAgICAgICBzeW5jOiB0cnVlLAogICAgICAgIG9uTGlzdGVuOiAoKSB7CiAgICAgICAgICBpZiAoaW5jb21pbmcgIT0gX2luY29taW5nKSByZXR1cm47CiAgICAgICAgICBhc3NlcnQoX2JvZHlQYXVzZWQpOwogICAgICAgICAgX2JvZHlQYXVzZWQgPSBmYWxzZTsKICAgICAgICAgIF9wYXVzZVN0YXRlQ2hhbmdlZCgpOwogICAgICAgIH0sCiAgICAgICAgb25QYXVzZTogKCkgewogICAgICAgICAgaWYgKGluY29taW5nICE9IF9pbmNvbWluZykgcmV0dXJuOwogICAgICAgICAgYXNzZXJ0KCFfYm9keVBhdXNlZCk7CiAgICAgICAgICBfYm9keVBhdXNlZCA9IHRydWU7CiAgICAgICAgICBfcGF1c2VTdGF0ZUNoYW5nZWQoKTsKICAgICAgICB9LAogICAgICAgIG9uUmVzdW1lOiAoKSB7CiAgICAgICAgICBpZiAoaW5jb21pbmcgIT0gX2luY29taW5nKSByZXR1cm47CiAgICAgICAgICBhc3NlcnQoX2JvZHlQYXVzZWQpOwogICAgICAgICAgX2JvZHlQYXVzZWQgPSBmYWxzZTsKICAgICAgICAgIF9wYXVzZVN0YXRlQ2hhbmdlZCgpOwogICAgICAgIH0sCiAgICAgICAgb25DYW5jZWw6ICgpIHsKICAgICAgICAgIGlmIChpbmNvbWluZyAhPSBfaW5jb21pbmcpIHJldHVybjsKICAgICAgICAgIGlmIChfc29ja2V0U3Vic2NyaXB0aW9uICE9IG51bGwpIHsKICAgICAgICAgICAgX3NvY2tldFN1YnNjcmlwdGlvbi5jYW5jZWwoKTsKICAgICAgICAgIH0KICAgICAgICAgIF9jbG9zZUluY29taW5nKHRydWUpOwogICAgICAgICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICAgICAgICB9KTsKICAgIGluY29taW5nID0gX2luY29taW5nID0KICAgICAgICBuZXcgX0h0dHBJbmNvbWluZyhfaGVhZGVycywgdHJhbnNmZXJMZW5ndGgsIF9ib2R5Q29udHJvbGxlci5zdHJlYW0pOwogICAgX2JvZHlQYXVzZWQgPSB0cnVlOwogICAgX3BhdXNlU3RhdGVDaGFuZ2VkKCk7CiAgfQoKICB2b2lkIF9jbG9zZUluY29taW5nKFtib29sIGNsb3NpbmcgPSBmYWxzZV0pIHsKICAgIC8vIElnbm9yZSBtdWx0aXBsZSBjbG9zZSAoY2FuIGhhcHBlbiBpbiByZS1lbnRyYW5jZSkuCiAgICBpZiAoX2luY29taW5nID09IG51bGwpIHJldHVybjsKICAgIHZhciB0bXAgPSBfaW5jb21pbmc7CiAgICB0bXAuY2xvc2UoY2xvc2luZyk7CiAgICBfaW5jb21p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IFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0Ll9odHRwOwoKY29uc3QgU3RyaW5nIF9EQVJUX1NFU1NJT05fSUQgPSAiREFSVFNFU1NJRCI7CgovLyBBIF9IdHRwU2Vzc2lvbiBpcyBhIG5vZGUgaW4gYSBkb3VibGUtbGlua2VkIGxpc3QsIHdpdGggX25leHQgYW5kIF9wcmV2IGJlaW5nCi8vIHRoZSBwcmV2aW91cyBhbmQgbmV4dCBwb2ludGVycy4KY2xhc3MgX0h0dHBTZXNzaW9uIGltcGxlbWVudHMgSHR0cFNlc3Npb24gewogIC8vIERlc3Ryb3llZCBtYXJrZWQuIFVzZWQgYnkgdGhlIGh0dHAgY29ubmVjdGlvbiB0byBzZWUgaWYgYSBzZXNzaW9uIGlzIHZhbGlkLgogIGJvb2wgX2Rlc3Ryb3llZCA9IGZhbHNlOwogIGJvb2wgX2lzTmV3ID0gdHJ1ZTsKICBEYXRlVGltZSBfbGFzdFNlZW47CiAgRnVuY3Rpb24gX3RpbWVvdXRDYWxsYmFjazsKICBfSHR0cFNlc3Npb25NYW5hZ2VyIF9zZXNzaW9uTWFuYWdlcjsKICAvLyBQb2ludGVycyBpbiB0aW1lb3V0IHF1ZXVlLgogIF9IdHRwU2Vzc2lvbiBfcHJldjsKICBfSHR0cFNlc3Npb24gX25leHQ7CiAgZmluYWwgU3RyaW5nIGlkOwoKICBmaW5hbCBNYXAgX2RhdGEgPSBuZXcgSGFzaE1hcCgpOwoKICBfSHR0cFNlc3Npb24odGhpcy5fc2Vzc2lvbk1hbmFnZXIsIHRoaXMuaWQpIDogX2xhc3RTZWVuID0gbmV3IERhdGVUaW1lLm5vdygpOwoKICB2b2lkIGRlc3Ryb3koKSB7CiAgICBfZGVzdHJveWVkID0gdHJ1ZTsKICAgIF9zZXNzaW9uTWFuYWdlci5fcmVtb3ZlRnJvbVRpbWVvdXRRdWV1ZSh0aGlzKTsKICAgIF9zZXNzaW9uTWFuYWdlci5fc2Vzc2lvbnMucmVtb3ZlKGlkKTsKICB9CgogIC8vIE1hcmsgdGhlIHNlc3Npb24gYXMgc2Vlbi4gVGhpcyB3aWxsIHJlc2V0IHRoZSB0aW1lb3V0IGFuZCBtb3ZlIHRoZSBub2RlIHRvCiAgLy8gdGhlIGVuZCBvZiB0aGUgdGltZW91dCBxdWV1ZS4KICB2b2lkIF9tYXJrU2VlbigpIHsKICAgIF9sYXN0U2VlbiA9IG5ldyBEYXRlVGltZS5ub3coKTsKICAgIF9zZXNzaW9uTWFuYWdlci5fYnVtcFRvRW5kKHRoaXMpOwogIH0KCiAgRGF0ZVRpbWUgZ2V0IGxhc3RTZWVuID0+IF9sYXN0U2VlbjsKCiAgYm9vbCBnZXQgaXNOZXcgPT4gX2lzTmV3OwoKICB2b2lkIHNldCBvblRpbWVvdXQodm9pZCBjYWxsYmFjaygpKSB7CiAgICBfdGltZW91dENhbGxiYWNrID0gY2FsbGJhY2s7CiAgfQoKICAvLyBNYXAgaW1wbGVtZW50YXRpb246CiAgYm9vbCBjb250YWluc1ZhbHVlKHZhbHVlKSA9PiBfZGF0YS5jb250YWluc1ZhbHVlKHZhbHVlKTsKICBib29sIGNvbnRhaW5zS2V5KGtleSkgPT4gX2RhdGEuY29udGFpbnNLZXkoa2V5KTsKICBvcGVyYXRvciBbXShrZXkpID0+IF9kYXRhW2tleV07CiAgdm9pZCBvcGVyYXRvciBbXT0oa2V5LCB2YWx1ZSkgewogICAgX2RhdGFba2V5XSA9IHZhbHVlOwogIH0KCiAgcHV0SWZBYnNlbnQoa2V5LCBpZkFic2VudCkgPT4gX2RhdGEucHV0SWZBYnNlbnQoa2V5LCBpZkFic2VudCk7CiAgYWRkQWxsKE1hcCBvdGhlcikgPT4gX2RhdGEuYWRkQWxsKG90aGVyKTsKICByZW1vdmUoa2V5KSA9PiBfZGF0YS5yZW1vdmUoa2V5KTsKICB2b2lkIGNsZWFyKCkgewogICAgX2RhdGEuY2xlYXIoKTsKICB9CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoa2V5LCB2YWx1ZSkpIHsKICAgIF9kYXRhLmZvckVhY2goZik7CiAgfQoKICBJdGVyYWJsZTxNYXBFbnRyeT4gZ2V0IGVudHJpZXMgPT4gX2RhdGEuZW50cmllczsKCiAgdm9pZCBhZGRFbnRyaWVzKEl0ZXJhYmxlPE1hcEVudHJ5PiBlbnRyaWVzKSB7CiAgICBfZGF0YS5hZGRFbnRyaWVzKGVudHJpZXMpOwogIH0KCiAgTWFwPEssIFY+IG1hcDxLLCBWPihNYXBFbnRyeTxLLCBWPiB0cmFuc2Zvcm0oa2V5LCB2YWx1ZSkpID0+CiAgICAgIF9kYXRhLm1hcCh0cmFuc2Zvcm0pOwoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChrZXksIHZhbHVlKSkgewogICAgX2RhdGEucmVtb3ZlV2hlcmUodGVzdCk7CiAgfQoKICBNYXA8SywgVj4gY2FzdDxLLCBWPigpID0+IF9kYXRhLmNhc3Q8SywgVj4oKTsKICB1cGRhdGUoa2V5LCB1cGRhdGUodmFsdWUpLCB7aWZBYnNlbnQoKX0pID0+CiAgICAgIF9kYXRhLnVwZGF0ZShrZXksIHVwZGF0ZSwgaWZBYnNlbnQ6IGlmQWJzZW50KTsKCiAgdm9pZCB1cGRhdGVBbGwodXBkYXRlKGtleSwgdmFsdWUpKSB7CiAgICBfZGF0YS51cGRhdGVBbGwodXBkYXRlKTsKICB9CgogIEl0ZXJhYmxlIGdldCBrZXlzID0+IF9kYXRhLmtleXM7CiAgSXRlcmFibGUgZ2V0IHZhbHVlcyA9PiBfZGF0YS52YWx1ZXM7CiAgaW50IGdldCBsZW5ndGggPT4gX2RhdGEubGVuZ3RoOwogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2RhdGEuaXNFbXB0eTsKICBib29sIGdldCBpc05vdEVtcHR5ID0+IF9kYXRhLmlzTm90RW1wdHk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICdIdHRwU2Vzc2lvbiBpZDokaWQgJF9kYXRhJzsKfQoKLy8gUHJpdmF0ZSBjbGFzcyB1c2VkIHRvIG1hbmFnZSBhbGwgdGhlIGFjdGl2ZSBzZXNzaW9ucy4gVGhlIHNlc3Npb25zIGFyZSBzdG9yZWQKLy8gaW4gdHdvIHdheXM6Ci8vCi8vICAqIEluIGEgbWFwLCBtYXBwaW5nIGZyb20gSUQgdG8gSHR0cFNlc3Npb24uCi8vICAqIEluIGEgbGlua2VkIGxpc3QsIHVzZWQgYXMgYSB0aW1lb3V0IHF1ZXVlLgpjbGFzcyBfSHR0cFNlc3Npb25NYW5hZ2VyIHsKICBNYXA8U3RyaW5nLCBfSHR0cFNlc3Npb24+IF9zZXNzaW9uczsKICBpbnQgX3Nlc3Npb25UaW1lb3V0ID0gMjAgKiA2MDsgLy8gMjAgbWlucy4KICBfSHR0cFNlc3Npb24gX2hlYWQ7CiAgX0h0dHBTZXNzaW9uIF90YWlsOwogIFRpbWVyIF90aW1lcjsKCiAgX0h0dHBTZXNzaW9uTWFuYWdlcigpIDogX3Nlc3Npb25zID0ge307CgogIFN0cmluZyBjcmVhdGVTZXNzaW9uSWQoKSB7CiAgICBjb25zdCBpbnQgX0tFWV9MRU5HVEggPSAxNjsgLy8gMTI4IGJpdHMuCiAgICB2YXIgZGF0YSA9IF9DcnlwdG9VdGlscy5nZXRSYW5kb21CeXRlcyhfS0VZX0xFTkdUSCk7CiAgICByZXR1cm4gX0NyeXB0b1V0aWxzLmJ5dGVzVG9IZXgoZGF0YSk7CiAgfQoKICBfSHR0cFNlc3Npb24gZ2V0U2Vzc2lvbihTdHJpbmcgaWQpID0+IF9zZXNzaW9uc1tpZF07CgogIF9IdHRwU2Vzc2lvbiBjcmVhdGVTZXNzaW9uKCkgewogICAgdmFyIGlkID0gY3JlYXRlU2Vzc2lvbklkKCk7CiAgICAvLyBUT0RPKGFqb2huc2VuKTogQ29uc2lkZXIgYWRkaW5nIGEgbGltaXQgYW5kIHRocm93aW5nIGFuIGV4Y2VwdGlvbi4KICAgIC8vIFNob3VsZCBiZSB2ZXJ5IHVubGlrZWx5IGhvd2V2ZXIuCiAgICB3aGlsZSAoX3Nlc3Npb25zLmNvbnRhaW5zS2V5KGlkKSkgewogICAgICBpZCA9IGNyZWF0ZVNlc3Npb25JZCgpOwogICAgfQogICAgdmFyIHNlc3Npb24gPSBfc2Vzc2lvbnNbaWRdID0gbmV3IF9IdHRwU2Vzc2lvbih0aGlzLCBpZCk7CiAgICBfYWRkVG9UaW1lb3V0UXVldWUoc2Vzc2lvbik7CiAgICByZXR1cm4gc2Vzc2lvbjsKICB9CgogIHZvaWQgc2V0IHNlc3Npb25UaW1lb3V0KGludCB0aW1lb3V0KSB7CiAgICBfc2Vzc2lvblRpbWVvdXQgPSB0aW1lb3V0OwogICAgX3N0b3BUaW1lcigpOwogICAgX3N0YXJ0VGltZXIoKTsKICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBfc3RvcFRpbWVyKCk7CiAgfQoKICB2b2lkIF9idW1wVG9FbmQoX0h0dHBTZXNzaW9uIHNlc3Npb24pIHsKICAgIF9yZW1vdmVGcm9tVGltZW91dFF1ZXVlKHNlc3Npb24pOwogICAgX2FkZFRvVGltZW91dFF1ZXVlKHNlc3Npb24pOwogIH0KCiAgdm9pZCBfYWRkVG9UaW1lb3V0UXVldWUoX0h0dHBTZXNzaW9uIHNlc3Npb24pIHsKICAgIGlmIChfaGVhZCA9PSBudWxsKSB7CiAgICAgIGFzc2VydChfdGFpbCA9PSBudWxsKTsKICAgICAgX3RhaWwgPSBfaGVhZCA9IHNlc3Npb247CiAgICAgIF9zdGFydFRpbWVyKCk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoX3RpbWVyICE9IG51bGwpOwogICAgICBhc3NlcnQoX3RhaWwgIT0gbnVsbCk7CiAgICAgIC8vIEFkZCB0byBlbmQuCiAgICAgIF90YWlsLl9uZXh0ID0gc2Vzc2lvbjsKICAgICAgc2Vzc2lvbi5fcHJldiA9IF90YWlsOwogICAgICBfdGFpbCA9IHNlc3Npb247CiAgICB9CiAgfQoKICB2b2lkIF9yZW1vdmVGcm9tVGltZW91dFF1ZXVlKF9IdHRwU2Vzc2lvbiBzZXNzaW9uKSB7CiAgICBpZiAoc2Vzc2lvbi5fbmV4dCAhPSBudWxsKSB7CiAgICAgIHNlc3Npb24uX25leHQuX3ByZXYgPSBzZXNzaW9uLl9wcmV2OwogICAgfQogICAgaWYgKHNlc3Npb24uX3ByZXYgIT0gbnVsbCkgewogICAgICBzZXNzaW9uLl9wcmV2Ll9uZXh0ID0gc2Vzc2lvbi5fbmV4dDsKICAgIH0KICAgIGlmIChfaGVhZCA9PSBzZXNzaW9uKSB7CiAgICAgIC8vIFdlIHJlbW92ZWQgdGhlIGhlYWQgZWxlbWVudCwgc3RhcnQgbmV3IHRpbWVyLgogICAgICBfaGVhZCA9IHNlc3Npb24uX25leHQ7CiAgICAgIF9zdG9wVGltZXIoKTsKICAgICAgX3N0YXJ0VGltZXIoKTsKICAgIH0KICAgIGlmIChfdGFpbCA9PSBzZXNzaW9uKSB7CiAgICAgIF90YWlsID0gc2Vzc2lvbi5fcHJldjsKICAgIH0KICAgIHNlc3Npb24uX25leHQgPSBzZXNzaW9uLl9wcmV2ID0gbnVsbDsKICB9CgogIHZvaWQgX3RpbWVyVGltZW91dCgpIHsKICAgIF9zdG9wVGltZXIoKTsgLy8gQ2xlYXIgdGltZXIuCiAgICBhc3NlcnQoX2hlYWQgIT0gbnVsbCk7CiAgICB2YXIgc2Vzc2lvbiA9IF9oZWFkOwogICAgc2Vzc2lvbi5kZXN0cm95KCk7IC8vIFdpbGwgcmVtb3ZlIHRoZSBzZXNzaW9uIGZyb20gdGltZW91dCBxdWV1ZSBhbmQgbWFwLgogICAgaWYgKHNlc3Npb24uX3RpbWVvdXRDYWxsYmFjayAhPSBudWxsKSB7CiAgICAgIHNlc3Npb24uX3RpbWVvdXRDYWxsYmFjaygpOwogICAgfQogIH0KCiAgdm9pZCBfc3RhcnRUaW1lcigpIHsKICAgIGFzc2VydChfdGltZXIgPT0gbnVsbCk7CiAgICBpZiAoX2hlYWQgIT0gbnVsbCkgewogICAgICBpbnQgc2Vjb25kcyA9IG5ldyBEYXRlVGltZS5ub3coKS5kaWZmZXJlbmNlKF9oZWFkLmxhc3RTZWVuKS5pblNlY29uZHM7CiAgICAgIF90aW1lciA9IG5ldyBUaW1lcigKICAgICAgICAgIG5ldyBEdXJhdGlvbihzZWNvbmRzOiBfc2Vzc2lvblRpbWVvdXQgLSBzZWNvbmRzKSwgX3RpbWVyVGltZW91dCk7CiAgICB9CiAgfQoKICB2b2lkIF9zdG9wVGltZXIoKSB7CiAgICBpZiAoX3RpbWVyICE9IG51bGwpIHsKICAgICAgX3RpbWVyLmNhbmNlbCgpOwogICAgICBfdGltZXIgPSBudWxsOwogICAgfQogIH0KfQqAzwBOTjwBFAEuAVAjLFEbFhYdJyAWFhMBIwFQARMXMyoEAVAjFSQmBAEmARwBKCEEARk7MyIiGAQBQiwkERMEASUWBAEzATAfBAE/HAEsHQQBMC41AScdBAEjJyIlKwE0AgFREAMwMRwnLRYWEAEqAR0tOSoEATcBISBKKCgeBj4hFAQBKR8SEwQBERIEASomIQQBMhkdHxUNHh0VHR0XBgQBNyErBiErBhw3HRQVBhwdBioEARkiGxlOLCIGBAEXHBlNGkwGBAEWGhcVBgQCARxkYXJ0Ol9odHRwL2h0dHBfc2Vzc2lvbi5kYXJ0MG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9faHR0cC9vdmVycmlkZXMuZGFydJCDLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5faHR0cDsKCmZpbmFsIF9odHRwT3ZlcnJpZGVzVG9rZW4gPSBuZXcgT2JqZWN0KCk7Cgpjb25zdCBfYXN5bmNSdW5ab25lZCA9IHJ1blpvbmVkOwoKLy8vIFRoaXMgY2xhc3MgZmFjaWxpdGF0ZXMgb3ZlcnJpZGluZyBbSHR0cENsaWVudF0gd2l0aCBhIG1vY2sgaW1wbGVtZW50YXRpb24uCi8vLyBJdCBzaG91bGQgYmUgZXh0ZW5kZWQgYnkgYW5vdGhlciBjbGFzcyBpbiBjbGllbnQgY29kZSB3aXRoIG92ZXJyaWRlcwovLy8gdGhhdCBjb25zdHJ1Y3QgYSBtb2NrIGltcGxlbWVudGF0aW9uLiBUaGUgaW1wbGVtZW50YXRpb24gaW4gdGhpcyBiYXNlIGNsYXNzCi8vLyBkZWZhdWx0cyB0byB0aGUgYWN0dWFsIFtIdHRwQ2xpZW50XSBpbXBsZW1lbnRhdGlvbi4gRm9yIGV4YW1wbGU6Ci8vLwovLy8gYGBgCi8vLyBjbGFzcyBNeUh0dHBDbGllbnQgaW1wbGVtZW50cyBIdHRwQ2xpZW50IHsKLy8vICAgLi4uCi8vLyAgIC8vIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBIdHRwQ2xpZW50IGludGVyZmFjZQovLy8gICAuLi4KLy8vIH0KLy8vCi8vLyBtYWluKCkgewovLy8gICBIdHRwT3ZlcnJpZGVzLnJ1blpvbmVkKCgpIHsKLy8vICAgICAuLi4KLy8vICAgICAvLyBPcGVyYXRpb25zIHdpbGwgdXNlIE15SHR0cENsaWVudCBpbnN0ZWFkIG9mIHRoZSByZWFsIEh0dHBDbGllbnQKLy8vICAgICAvLyBpbXBsZW1lbnRhdGlvbiB3aGVuZXZlciBIdHRwQ2xpZW50IGlzIHVzZWQuCi8vLyAgICAgLi4uCi8vLyAgIH0sIGNyZWF0ZUh0dHBDbGllbnQ6IChTZWN1cml0eUNvbnRleHQgYykgPT4gbmV3IE15SHR0cENsaWVudChjKSk7Ci8vLyB9Ci8vLyBgYGAKYWJzdHJhY3QgY2xhc3MgSHR0cE92ZXJyaWRlcyB7CiAgc3RhdGljIEh0dHBPdmVycmlkZXMgX2dsb2JhbDsKCiAgc3RhdGljIEh0dHBPdmVycmlkZXMgZ2V0IGN1cnJlbnQgewogICAgcmV0dXJuIFpvbmUuY3VycmVudFtfaHR0cE92ZXJyaWRlc1Rva2VuXSA/PyBfZ2xvYmFsOwogIH0KCiAgLy8vIFRoZSBbSHR0cE92ZXJyaWRlc10gdG8gdXNlIGluIHRoZSByb290IFtab25lXS4KICAvLy8KICAvLy8gVGhlc2UgYXJlIHRoZSBbSHR0cE92ZXJyaWRlc10gdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIHJvb3QgWm9uZSwgYW5kIGluCiAgLy8vIFpvbmUncyB0aGF0IGRvIG5vdCBzZXQgW0h0dHBPdmVycmlkZXNdIGFuZCB3aG9zZSBhbmNlc3RvcnMgdXAgdG8gdGhlIHJvb3QKICAvLy8gWm9uZSBkbyBub3Qgc2V0IFtIdHRwT3ZlcnJpZGVzXS4KICBzdGF0aWMgc2V0IGdsb2JhbChIdHRwT3ZlcnJpZGVzIG92ZXJyaWRlcykgewogICAgX2dsb2JhbCA9IG92ZXJyaWRlczsKICB9CgogIC8vLyBSdW5zIFtib2R5XSBpbiBhIGZyZXNoIFtab25lXSB1c2luZyB0aGUgcHJvdmlkZWQgb3ZlcnJpZGVzLgogIHN0YXRpYyBSIHJ1blpvbmVkPFI+KFIgYm9keSgpLAogICAgICB7SHR0cENsaWVudCBGdW5jdGlvbihTZWN1cml0eUNvbnRleHQpIGNyZWF0ZUh0dHBDbGllbnQsCiAgICAgIFN0cmluZyBGdW5jdGlvbihVcmkgdXJpLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50KQogICAgICAgICAgZmluZFByb3h5RnJvbUVudmlyb25tZW50LAogICAgICBab25lU3BlY2lmaWNhdGlvbiB6b25lU3BlY2lmaWNhdGlvbiwKICAgICAgRnVuY3Rpb24gb25FcnJvcn0pIHsKICAgIEh0dHBPdmVycmlkZXMgb3ZlcnJpZGVzID0KICAgICAgICBuZXcgX0h0dHBPdmVycmlkZXNTY29wZShjcmVhdGVIdHRwQ2xpZW50LCBmaW5kUHJveHlGcm9tRW52aXJvbm1lbnQpOwogICAgcmV0dXJuIF9hc3luY1J1blpvbmVkPFI+KGJvZHksCiAgICAgICAgem9uZVZhbHVlczoge19odHRwT3ZlcnJpZGVzVG9rZW46IG92ZXJyaWRlc30sCiAgICAgICAgem9uZVNwZWNpZmljYXRpb246IHpvbmVTcGVjaWZpY2F0aW9uLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IpOwogIH0KCiAgLy8vIFJ1bnMgW2JvZHldIGluIGEgZnJlc2ggW1pvbmVdIHVzaW5nIHRoZSBvdmVycmlkZXMgZm91bmQgaW4gW292ZXJyaWRlc10uCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCBbb3ZlcnJpZGVzXSBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGV4dGVuZHMKICAvLy8gW0h0dHBPdmVycmlkZXNdLgogIHN0YXRpYyBSIHJ1bldpdGhIdHRwT3ZlcnJpZGVzPFI+KFIgYm9keSgpLCBIdHRwT3ZlcnJpZGVzIG92ZXJyaWRlcywKICAgICAge1pvbmVTcGVjaWZpY2F0aW9uIHpvbmVTcGVjaWZpY2F0aW9uLCBGdW5jdGlvbiBvbkVycm9yfSkgewogICAgcmV0dXJuIF9hc3luY1J1blpvbmVkPFI+KGJvZHksCiAgICAgICAgem9uZVZhbHVlczoge19odHRwT3ZlcnJpZGVzVG9rZW46IG92ZXJyaWRlc30sCiAgICAgICAgem9uZVNwZWNpZmljYXRpb246IHpvbmVTcGVjaWZpY2F0aW9uLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IpOwogIH0KCiAgLy8vIFJldHVybnMgYSBuZXcgW0h0dHBDbGllbnRdIHVzaW5nIHRoZSBnaXZlbiBbY29udGV4dF0uCiAgLy8vCiAgLy8vIFdoZW4gdGhpcyBvdmVycmlkZSBpcyBpbnN0YWxsZWQsIHRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBiZWhhdmlvciBvZgogIC8vLyBgbmV3IEh0dHBDbGllbnRgLgogIEh0dHBDbGllbnQgY3JlYXRlSHR0cENsaWVudChTZWN1cml0eUNvbnRleHQgY29udGV4dCkgewogICAgcmV0dXJuIG5ldyBfSHR0cENsaWVudChjb250ZXh0KTsKICB9CgogIC8vLyBSZXNvbHZlcyB0aGUgcHJveHkgc2VydmVyIHRvIGJlIHVzZWQgZm9yIEhUVFAgY29ubmVjdGlvbnMuCiAgLy8vCiAgLy8vIFdoZW4gdGhpcyBvdmVycmlkZSBpcyBpbnN0YWxsZWQsIHRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBiZWhhdmlvciBvZgogIC8vLyBgSHR0cENsaWVudC5maW5kUHJveHlGcm9tRW52aXJvbm1lbnRgLgogIFN0cmluZyBmaW5kUHJveHlGcm9tRW52aXJvbm1lbnQoVXJpIHVybCwgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudCkgewogICAgcmV0dXJuIF9IdHRwQ2xpZW50Ll9maW5kUHJveHlGcm9tRW52aXJvbm1lbnQodXJsLCBlbnZpcm9ubWVudCk7CiAgfQp9CgpjbGFzcyBfSHR0cE92ZXJyaWRlc1Njb3BlIGV4dGVuZHMgSHR0cE92ZXJyaWRlcyB7CiAgZmluYWwgSHR0cE92ZXJyaWRlcyBfcHJldmlvdXMgPSBIdHRwT3ZlcnJpZGVzLmN1cnJlbnQ7CgogIGZpbmFsIEh0dHBDbGllbnQgRnVuY3Rpb24oU2VjdXJpdHlDb250ZXh0KSBfY3JlYXRlSHR0cENsaWVudDsKICBmaW5hbCBTdHJpbmcgRnVuY3Rpb24oVXJpIHVyaSwgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudCkKICAgICAgX2ZpbmRQcm94eUZyb21FbnZpcm9ubWVudDsKCiAgX0h0dHBPdmVycmlkZXNTY29wZSh0aGlzLl9jcmVhdGVIdHRwQ2xpZW50LCB0aGlzLl9maW5kUHJveHlGcm9tRW52aXJvbm1lbnQpOwoKICBAb3ZlcnJpZGUKICBIdHRwQ2xpZW50IGNyZWF0ZUh0dHBDbGllbnQoU2VjdXJpdHlDb250ZXh0IGNvbnRleHQpIHsKICAgIGlmIChfY3JlYXRlSHR0cENsaWVudCAhPSBudWxsKSByZXR1cm4gX2NyZWF0ZUh0dHBDbGllbnQoY29udGV4dCk7CiAgICBpZiAoX3ByZXZpb3VzICE9IG51bGwpIHJldHVybiBfcHJldmlvdXMuY3JlYXRlSHR0cENsaWVudChjb250ZXh0KTsKICAgIHJldHVybiBzdXBlci5jcmVhdGVIdHRwQ2xpZW50KGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGZpbmRQcm94eUZyb21FbnZpcm9ubWVudChVcmkgdXJsLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50KSB7CiAgICBpZiAoX2ZpbmRQcm94eUZyb21FbnZpcm9ubWVudCAhPSBudWxsKSB7CiAgICAgIHJldHVybiBfZmluZFByb3h5RnJvbUVudmlyb25tZW50KHVybCwgZW52aXJvbm1lbnQpOwogICAgfQogICAgaWYgKF9wcmV2aW91cyAhPSBudWxsKSB7CiAgICAgIHJldHVybiBfcHJldmlvdXMuZmluZFByb3h5RnJvbUVudmlyb25tZW50KHVybCwgZW52aXJvbm1lbnQpOwogICAgfQogICAgcmV0dXJuIHN1cGVyLmZpbmRQcm94eUZyb21FbnZpcm9ubWVudCh1cmwsIGVudmlyb25tZW50KTsKICB9Cn0KeABOTjwBFAEqASEBT0lQRQQILwo3CgYEDSIMSzcMSAYIHyABJTkEATUGT1AnLxkEAUIhPkAkKxseTSM2LhsEAU4GShdGQSM2LhsEATwGTxg5JQQBQQZPLU5EBAIBMjkBQEIhAU8BDDlGRywEAQxOLToGHUMGPQQCARlkYXJ0Ol9odHRwL292ZXJyaWRlcy5kYXJ0MG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9faHR0cC93ZWJzb2NrZXQuZGFydMAAQ1gvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0Ll9odHRwOwoKLyoqCiAqIFdlYlNvY2tldCBzdGF0dXMgY29kZXMgdXNlZCB3aGVuIGNsb3NpbmcgYSBXZWJTb2NrZXQgY29ubmVjdGlvbi4KICovCmFic3RyYWN0IGNsYXNzIFdlYlNvY2tldFN0YXR1cyB7CiAgc3RhdGljIGNvbnN0IGludCBub3JtYWxDbG9zdXJlID0gMTAwMDsKICBzdGF0aWMgY29uc3QgaW50IGdvaW5nQXdheSA9IDEwMDE7CiAgc3RhdGljIGNvbnN0IGludCBwcm90b2NvbEVycm9yID0gMTAwMjsKICBzdGF0aWMgY29uc3QgaW50IHVuc3VwcG9ydGVkRGF0YSA9IDEwMDM7CiAgc3RhdGljIGNvbnN0IGludCByZXNlcnZlZDEwMDQgPSAxMDA0OwogIHN0YXRpYyBjb25zdCBpbnQgbm9TdGF0dXNSZWNlaXZlZCA9IDEwMDU7CiAgc3RhdGljIGNvbnN0IGludCBhYm5vcm1hbENsb3N1cmUgPSAxMDA2OwogIHN0YXRpYyBjb25zdCBpbnQgaW52YWxpZEZyYW1lUGF5bG9hZERhdGEgPSAxMDA3OwogIHN0YXRpYyBjb25zdCBpbnQgcG9saWN5VmlvbGF0aW9uID0gMTAwODsKICBzdGF0aWMgY29uc3QgaW50IG1lc3NhZ2VUb29CaWcgPSAxMDA5OwogIHN0YXRpYyBjb25zdCBpbnQgbWlzc2luZ01hbmRhdG9yeUV4dGVuc2lvbiA9IDEwMTA7CiAgc3RhdGljIGNvbnN0IGludCBpbnRlcm5hbFNlcnZlckVycm9yID0gMTAxMTsKICBzdGF0aWMgY29uc3QgaW50IHJlc2VydmVkMTAxNSA9IDEwMTU7CgogIEBEZXByZWNhdGVkKCJVc2Ugbm9ybWFsQ2xvc3VyZSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE5PUk1BTF9DTE9TVVJFID0gbm9ybWFsQ2xvc3VyZTsKICBARGVwcmVjYXRlZCgiVXNlIGdvaW5nQXdheSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IEdPSU5HX0FXQVkgPSBnb2luZ0F3YXk7CiAgQERlcHJlY2F0ZWQoIlVzZSBwcm90b2NvbEVycm9yIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgUFJPVE9DT0xfRVJST1IgPSBwcm90b2NvbEVycm9yOwogIEBEZXByZWNhdGVkKCJVc2UgdW5zdXBwb3J0ZWREYXRhIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgVU5TVVBQT1JURURfREFUQSA9IHVuc3VwcG9ydGVkRGF0YTsKICBARGVwcmVjYXRlZCgiVXNlIHJlc2VydmVkMTAwNCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IFJFU0VSVkVEXzEwMDQgPSByZXNlcnZlZDEwMDQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBub1N0YXR1c1JlY2VpdmVkIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgTk9fU1RBVFVTX1JFQ0VJVkVEID0gbm9TdGF0dXNSZWNlaXZlZDsKICBARGVwcmVjYXRlZCgiVXNlIGFibm9ybWFsQ2xvc3VyZSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IEFCTk9STUFMX0NMT1NVUkUgPSBhYm5vcm1hbENsb3N1cmU7CiAgQERlcHJlY2F0ZWQoIlVzZSBpbnZhbGlkRnJhbWVQYXlsb2FkRGF0YSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IElOVkFMSURfRlJBTUVfUEFZTE9BRF9EQVRBID0gaW52YWxpZEZyYW1lUGF5bG9hZERhdGE7CiAgQERlcHJlY2F0ZWQoIlVzZSBwb2xpY3lWaW9sYXRpb24gaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBQT0xJQ1lfVklPTEFUSU9OID0gcG9saWN5VmlvbGF0aW9uOwogIEBEZXByZWNhdGVkKCJVc2UgbWVzc2FnZVRvb0JpZyBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE1FU1NBR0VfVE9PX0JJRyA9IG1lc3NhZ2VUb29CaWc7CiAgQERlcHJlY2F0ZWQoIlVzZSBtaXNzaW5nTWFuZGF0b3J5RXh0ZW5zaW9uIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgTUlTU0lOR19NQU5EQVRPUllfRVhURU5TSU9OID0gbWlzc2luZ01hbmRhdG9yeUV4dGVuc2lvbjsKICBARGVwcmVjYXRlZCgiVXNlIGludGVybmFsU2VydmVyRXJyb3IgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBJTlRFUk5BTF9TRVJWRVJfRVJST1IgPSBpbnRlcm5hbFNlcnZlckVycm9yOwogIEBEZXByZWNhdGVkKCJVc2UgcmVzZXJ2ZWQxMDE1IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgUkVTRVJWRURfMTAxNSA9IHJlc2VydmVkMTAxNTsKfQoKLyoqCiAqIFRoZSBbQ29tcHJlc3Npb25PcHRpb25zXSBjbGFzcyBhbGxvd3MgeW91IHRvIGNvbnRyb2wKICogdGhlIG9wdGlvbnMgb2YgV2ViU29ja2V0IGNvbXByZXNzaW9uLgogKi8KY2xhc3MgQ29tcHJlc3Npb25PcHRpb25zIHsKICAvLy8gRGVmYXVsdCBXZWJTb2NrZXQgQ29tcHJlc3Npb24gb3B0aW9ucy4KICAvLy8KICAvLy8gQ29tcHJlc3Npb24gd2lsbCBiZSBlbmFibGVkIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOgogIC8vLwogIC8vLyAqIGBjbGllbnROb0NvbnRleHRUYWtlb3ZlcmA6IGZhbHNlCiAgLy8vICogYHNlcnZlck5vQ29udGV4dFRha2VvdmVyYDogZmFsc2UKICAvLy8gKiBgY2xpZW50TWF4V2luZG93Qml0c2A6IDE1CiAgLy8vICogYHNlcnZlck1heFdpbmRvd0JpdHNgOiAxNQogIHN0YXRpYyBjb25zdCBDb21wcmVzc2lvbk9wdGlvbnMgY29tcHJlc3Npb25EZWZhdWx0ID0KICAgICAgY29uc3QgQ29tcHJlc3Npb25PcHRpb25zKCk7CiAgQERlcHJlY2F0ZWQoIlVzZSBjb21wcmVzc2lvbkRlZmF1bHQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IENvbXByZXNzaW9uT3B0aW9ucyBERUZBVUxUID0gY29tcHJlc3Npb25EZWZhdWx0OwoKICAvLy8gRGlzYWJsZXMgV2ViU29ja2V0IENvbXByZXNzaW9uLgogIHN0YXRpYyBjb25zdCBDb21wcmVzc2lvbk9wdGlvbnMgY29tcHJlc3Npb25PZmYgPQogICAgICBjb25zdCBDb21wcmVzc2lvbk9wdGlvbnMoZW5hYmxlZDogZmFsc2UpOwogIEBEZXByZWNhdGVkKCJVc2UgY29tcHJlc3Npb25PZmYgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IENvbXByZXNzaW9uT3B0aW9ucyBPRkYgPSBjb21wcmVzc2lvbk9mZjsKCiAgLy8vIENvbnRyb2xzIHdoZXRoZXIgdGhlIGNsaWVudCB3aWxsIHJldXNlIGl0cyBjb21wcmVzc2lvbiBpbnN0YW5jZXMuCiAgZmluYWwgYm9vbCBjbGllbnROb0NvbnRleHRUYWtlb3ZlcjsKCiAgLy8vIENvbnRyb2xzIHdoZXRoZXIgdGhlIHNlcnZlciB3aWxsIHJldXNlIGl0cyBjb21wcmVzc2lvbiBpbnN0YW5jZXMuCiAgZmluYWwgYm9vbCBzZXJ2ZXJOb0NvbnRleHRUYWtlb3ZlcjsKCiAgLy8vIERldGVybWluZXMgdGhlIG1heCB3aW5kb3cgYml0cyBmb3IgdGhlIGNsaWVudC4KICBmaW5hbCBpbnQgY2xpZW50TWF4V2luZG93Qml0czsKCiAgLy8vIERldGVybWluZXMgdGhlIG1heCB3aW5kb3cgYml0cyBmb3IgdGhlIHNlcnZlci4KICBmaW5hbCBpbnQgc2VydmVyTWF4V2luZG93Qml0czsKCiAgLy8vIEVuYWJsZXMgb3IgZGlzYWJsZXMgV2ViU29ja2V0IGNvbXByZXNzaW9uLgogIGZpbmFsIGJvb2wgZW5hYmxlZDsKCiAgY29uc3QgQ29tcHJlc3Npb25PcHRpb25zKAogICAgICB7dGhpcy5jbGllbnROb0NvbnRleHRUYWtlb3ZlcjogZmFsc2UsCiAgICAgIHRoaXMuc2VydmVyTm9Db250ZXh0VGFrZW92ZXI6IGZhbHNlLAogICAgICB0aGlzLmNsaWVudE1heFdpbmRvd0JpdHMsCiAgICAgIHRoaXMuc2VydmVyTWF4V2luZG93Qml0cywKICAgICAgdGhpcy5lbmFibGVkOiB0cnVlfSk7CgogIC8vLyBQYXJzZXMgbGlzdCBvZiByZXF1ZXN0ZWQgc2VydmVyIGhlYWRlcnMgdG8gcmV0dXJuIHNlcnZlciBjb21wcmVzc2lvbgogIC8vLyByZXNwb25zZSBoZWFkZXJzLgogIC8vLwogIC8vLyBVc2VzIFtzZXJ2ZXJNYXhXaW5kb3dCaXRzXSB2YWx1ZSBpZiBzZXQsIG90aGVyd2lzZSB3aWxsIGF0dGVtcHQgdG8gdXNlCiAgLy8vIHZhbHVlIGZyb20gaGVhZGVycy4gRGVmYXVsdHMgdG8gW1dlYlNvY2tldC5ERUZBVUxUX1dJTkRPV19CSVRTXS4gUmV0dXJucyBhCiAgLy8vIFtfQ29tcHJlc3Npb25NYXhXaW5kb3dCaXRzXSBvYmplY3Qgd2hpY2ggY29udGFpbnMgdGhlIHJlc3BvbnNlIGhlYWRlcnMgYW5kCiAgLy8vIG5lZ290aWF0ZWQgbWF4IHdpbmRvdyBiaXRzLgogIF9Db21wcmVzc2lvbk1heFdpbmRvd0JpdHMgX2NyZWF0ZVNlcnZlclJlc3BvbnNlSGVhZGVyKEhlYWRlclZhbHVlIHJlcXVlc3RlZCkgewogICAgdmFyIGluZm8gPSBuZXcgX0NvbXByZXNzaW9uTWF4V2luZG93Qml0cygpOwoKICAgIGludCBtd2I7CiAgICBTdHJpbmcgcGFydDsKICAgIGlmIChyZXF1ZXN0ZWQ/LnBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICBwYXJ0ID0gcmVxdWVzdGVkLnBhcmFtZXRlcnNbX3NlcnZlck1heFdpbmRvd0JpdHNdOwogICAgfQogICAgaWYgKHBhcnQgIT0gbnVsbCkgewogICAgICBpZiAocGFydC5sZW5ndGggPj0gMiAmJiBwYXJ0LnN0YXJ0c1dpdGgoJzAnKSkgewogICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJJbGxlZ2FsIDAgcGFkZGluZyBvbiB2YWx1ZS4iKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBtd2IgPSBzZXJ2ZXJNYXhXaW5kb3dCaXRzID09IG51bGwKICAgICAgICAgICAgPyBpbnQucGFyc2UocGFydCwKICAgICAgICAgICAgICAgIG9uRXJyb3I6IChzb3VyY2UpID0+IF9XZWJTb2NrZXRJbXBsLkRFRkFVTFRfV0lORE9XX0JJVFMpCiAgICAgICAgICAgIDogc2VydmVyTWF4V2luZG93Qml0czsKICAgICAgICBpbmZvLmhlYWRlclZhbHVlID0gIjsgc2VydmVyX21heF93aW5kb3dfYml0cz0ke213Yn0iOwogICAgICAgIGluZm8ubWF4V2luZG93Qml0cyA9IG13YjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaW5mby5oZWFkZXJWYWx1ZSA9ICIiOwogICAgICBpbmZvLm1heFdpbmRvd0JpdHMgPSBfV2ViU29ja2V0SW1wbC5ERUZBVUxUX1dJTkRPV19CSVRTOwogICAgfQogICAgcmV0dXJuIGluZm87CiAgfQoKICAvLy8gUmV0dXJucyBkZWZhdWx0IHZhbHVlcyBmb3IgY2xpZW50IGNvbXByZXNzaW9uIHJlcXVlc3QgaGVhZGVycy4KICBTdHJpbmcgX2NyZWF0ZUNsaWVudFJlcXVlc3RIZWFkZXIoSGVhZGVyVmFsdWUgcmVxdWVzdGVkLCBpbnQgc2l6ZSkgewogICAgdmFyIGluZm8gPSAiIjsKCiAgICAvLyBJZiByZXNwb25kaW5nIHRvIGEgdmFsaWQgcmVxdWVzdCwgc3BlY2lmeSBzaXplCiAgICBpZiAocmVxdWVzdGVkICE9IG51bGwpIHsKICAgICAgaW5mbyA9ICI7IGNsaWVudF9tYXhfd2luZG93X2JpdHM9JHNpemUiOwogICAgfSBlbHNlIHsKICAgICAgLy8gQ2xpZW50IHJlcXVlc3QuIFNwZWNpZnkgZGVmYXVsdAogICAgICBpZiAoY2xpZW50TWF4V2luZG93Qml0cyA9PSBudWxsKSB7CiAgICAgICAgaW5mbyA9ICI7IGNsaWVudF9tYXhfd2luZG93X2JpdHMiOwogICAgICB9IGVsc2UgewogICAgICAgIGluZm8gPSAiOyBjbGllbnRfbWF4X3dpbmRvd19iaXRzPSRjbGllbnRNYXhXaW5kb3dCaXRzIjsKICAgICAgfQogICAgICBpZiAoc2VydmVyTWF4V2luZG93Qml0cyAhPSBudWxsKSB7CiAgICAgICAgaW5mbyArPSAiOyBzZXJ2ZXJfbWF4X3dpbmRvd19iaXRzPSRzZXJ2ZXJNYXhXaW5kb3dCaXRzIjsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBpbmZvOwogIH0KCiAgLy8vIENyZWF0ZSBhIENvbXByZXNzaW9uIEhlYWRlci4KICAvLy8KICAvLy8gSWYgW3JlcXVlc3RlZF0gaXMgbnVsbCBvciBjb250YWlucyBjbGllbnQgcmVxdWVzdCBoZWFkZXJzLCByZXR1cm5zIENsaWVudAogIC8vLyBjb21wcmVzc2lvbiByZXF1ZXN0IGhlYWRlcnMgd2l0aCBkZWZhdWx0IHNldHRpbmdzIGZvcgogIC8vLyBgY2xpZW50X21heF93aW5kb3dfYml0c2AgaGVhZGVyIHZhbHVlLiAgSWYgW3JlcXVlc3RlZF0gY29udGFpbnMgc2VydmVyCiAgLy8vIHJlc3BvbnNlIGhlYWRlcnMgdGhpcyBtZXRob2QgcmV0dXJucyBhIFNlcnZlciBjb21wcmVzc2lvbiByZXNwb25zZSBoZWFkZXIKICAvLy8gbmVnb3RpYXRpbmcgdGhlIG1heCB3aW5kb3cgYml0cyBmb3IgYm90aCBjbGllbnQgYW5kIHNlcnZlciBhcyByZXF1ZXN0ZWQKICAvLy8gYHNlcnZlcl9tYXhfd2luZG93X2JpdHNgIHZhbHVlLiAgVGhpcyBtZXRob2QgcmV0dXJucyBhCiAgLy8vIFtfQ29tcHJlc3Npb25NYXhXaW5kb3dCaXRzXSBvYmplY3Qgd2l0aCB0aGUgcmVzcG9uc2UgaGVhZGVycyBhbmQKICAvLy8gbmVnb3RpYXRlZCBgbWF4V2luZG93Qml0c2AgdmFsdWUuCiAgX0NvbXByZXNzaW9uTWF4V2luZG93Qml0cyBfY3JlYXRlSGVhZGVyKFtIZWFkZXJWYWx1ZSByZXF1ZXN0ZWRdKSB7CiAgICB2YXIgaW5mbyA9IG5ldyBfQ29tcHJlc3Npb25NYXhXaW5kb3dCaXRzKCIiLCAwKTsKICAgIGlmICghZW5hYmxlZCkgewogICAgICByZXR1cm4gaW5mbzsKICAgIH0KCiAgICBpbmZvLmhlYWRlclZhbHVlID0gX1dlYlNvY2tldEltcGwuUEVSX01FU1NBR0VfREVGTEFURTsKCiAgICBpZiAoY2xpZW50Tm9Db250ZXh0VGFrZW92ZXIgJiYKICAgICAgICAocmVxdWVzdGVkID09IG51bGwgfHwKICAgICAgICAgICAgKHJlcXVlc3RlZCAhPSBudWxsICYmCiAgICAgICAgICAgICAgICByZXF1ZXN0ZWQucGFyYW1ldGVycy5jb250YWluc0tleShfY2xpZW50Tm9Db250ZXh0VGFrZW92ZXIpKSkpIHsKICAgICAgaW5mby5oZWFkZXJWYWx1ZSArPSAiOyBjbGllbnRfbm9fY29udGV4dF90YWtlb3ZlciI7CiAgICB9CgogICAgaWYgKHNlcnZlck5vQ29udGV4dFRha2VvdmVyICYmCiAgICAgICAgKHJlcXVlc3RlZCA9PSBudWxsIHx8CiAgICAgICAgICAgIChyZXF1ZXN0ZWQgIT0gbnVsbCAmJgogICAgICAgICAgICAgICAgcmVxdWVzdGVkLnBhcmFtZXRlcnMuY29udGFpbnNLZXkoX3NlcnZlck5vQ29udGV4dFRha2VvdmVyKSkpKSB7CiAgICAgIGluZm8uaGVhZGVyVmFsdWUgKz0gIjsgc2VydmVyX25vX2NvbnRleHRfdGFrZW92ZXIiOwogICAgfQoKICAgIHZhciBoZWFkZXJMaXN0ID0gX2NyZWF0ZVNlcnZlclJlc3BvbnNlSGVhZGVyKHJlcXVlc3RlZCk7CiAgICBpbmZvLmhlYWRlclZhbHVlICs9IGhlYWRlckxpc3QuaGVhZGVyVmFsdWU7CiAgICBpbmZvLm1heFdpbmRvd0JpdHMgPSBoZWFkZXJMaXN0Lm1heFdpbmRvd0JpdHM7CgogICAgaW5mby5oZWFkZXJWYWx1ZSArPQogICAgICAgIF9jcmVhdGVDbGllbnRSZXF1ZXN0SGVhZGVyKHJlcXVlc3RlZCwgaW5mby5tYXhXaW5kb3dCaXRzKTsKCiAgICByZXR1cm4gaW5mbzsKICB9Cn0KCi8qKgogKiBUaGUgW1dlYlNvY2tldFRyYW5zZm9ybWVyXSBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byB1cGdyYWRlIGEKICogW0h0dHBSZXF1ZXN0XSB0byBhIFtXZWJTb2NrZXRdIGNvbm5lY3Rpb24uIEl0IHN1cHBvcnRzIGJvdGgKICogdXBncmFkaW5nIGEgc2luZ2xlIFtIdHRwUmVxdWVzdF0gYW5kIHVwZ3JhZGluZyBhIHN0cmVhbSBvZgogKiBbSHR0cFJlcXVlc3Rdcy4KICoKICogVG8gdXBncmFkZSBhIHNpbmdsZSBbSHR0cFJlcXVlc3RdIHVzZSB0aGUgc3RhdGljIFt1cGdyYWRlXSBtZXRob2QuCiAqCiAqICAgICBIdHRwU2VydmVyIHNlcnZlcjsKICogICAgIHNlcnZlci5saXN0ZW4oKHJlcXVlc3QpIHsKICogICAgICAgaWYgKC4uLikgewogKiAgICAgICAgIFdlYlNvY2tldFRyYW5zZm9ybWVyLnVwZ3JhZGUocmVxdWVzdCkudGhlbigod2Vic29ja2V0KSB7CiAqICAgICAgICAgICAuLi4KICogICAgICAgICB9KTsKICogICAgICAgfSBlbHNlIHsKICogICAgICAgICAvLyBEbyBub3JtYWwgSFRUUCByZXF1ZXN0IHByb2Nlc3NpbmcuCiAqICAgICAgIH0KICogICAgIH0pOwogKgogKiBUbyB0cmFuc2Zvcm0gYSBzdHJlYW0gb2YgW0h0dHBSZXF1ZXN0XSBldmVudHMgYXMgaXQgaW1wbGVtZW50cyBhCiAqIHN0cmVhbSB0cmFuc2Zvcm1lciB0aGF0IHRyYW5zZm9ybXMgYSBzdHJlYW0gb2YgSHR0cFJlcXVlc3QgaW50byBhCiAqIHN0cmVhbSBvZiBXZWJTb2NrZXRzIGJ5IHVwZ3JhZGluZyBlYWNoIEh0dHBSZXF1ZXN0IGZyb20gdGhlIEhUVFAgb3IKICogSFRUUFMgc2VydmVyLCB0byB0aGUgV2ViU29ja2V0IHByb3RvY29sLgogKgogKiAgICAgc2VydmVyLnRyYW5zZm9ybShuZXcgV2ViU29ja2V0VHJhbnNmb3JtZXIoKSkubGlzdGVuKCh3ZWJTb2NrZXQpID0+IC4uLik7CiAqCiAqIFRoaXMgdHJhbnNmb3JtZXIgc3RyaXZlcyB0byBpbXBsZW1lbnQgV2ViU29ja2V0cyBhcyBzcGVjaWZpZWQgYnkgUkZDNjQ1NS4KICovCmFic3RyYWN0IGNsYXNzIFdlYlNvY2tldFRyYW5zZm9ybWVyCiAgICBpbXBsZW1lbnRzIFN0cmVhbVRyYW5zZm9ybWVyPEh0dHBSZXF1ZXN0LCBXZWJTb2NrZXQ+IHsKICAvKioKICAgKiBDcmVhdGUgYSBuZXcgW1dlYlNvY2tldFRyYW5zZm9ybWVyXS4KICAgKgogICAqIElmIFtwcm90b2NvbFNlbGVjdG9yXSBpcyBwcm92aWRlZCwgW3Byb3RvY29sU2VsZWN0b3JdIHdpbGwgYmUgY2FsbGVkIHRvCiAgICogc2VsZWN0IHdoYXQgcHJvdG9jb2wgdG8gdXNlLCBpZiBhbnkgd2VyZSBwcm92aWRlZCBieSB0aGUgY2xpZW50LgogICAqIFtwcm90b2NvbFNlbGVjdG9yXSBpcyBzaG91bGQgcmV0dXJuIGVpdGhlciBhIFtTdHJpbmddIG9yIGEgW0Z1dHVyZV0KICAgKiBjb21wbGV0aW5nIHdpdGggYSBbU3RyaW5nXS4gVGhlIFtTdHJpbmddIG11c3QgZXhpc3QgaW4gdGhlIGxpc3Qgb2YKICAgKiBwcm90b2NvbHMuCiAgICoKICAgKiBJZiBbY29tcHJlc3Npb25dIGlzIHByb3ZpZGVkLCB0aGUgW1dlYlNvY2tldF0gY3JlYXRlZCB3aWxsIGJlIGNvbmZpZ3VyZWQKICAgKiB0byBuZWdvdGlhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIFtDb21wcmVzc2lvbk9wdGlvbnNdLiBJZiBub25lIGlzIHNwZWNpZmllZAogICAqIHRoZW4gdGhlIFtXZWJTb2NrZXRdIHdpbGwgYmUgY3JlYXRlZCB3aXRoIHRoZSBkZWZhdWx0IFtDb21wcmVzc2lvbk9wdGlvbnNdLgogICAqLwogIGZhY3RvcnkgV2ViU29ja2V0VHJhbnNmb3JtZXIoCiAgICAgIHsvKlN0cmluZ3xGdXR1cmU8U3RyaW5nPiovIHByb3RvY29sU2VsZWN0b3IoTGlzdDxTdHJpbmc+IHByb3RvY29scyksCiAgICAgIENvbXByZXNzaW9uT3B0aW9ucyBjb21wcmVzc2lvbjogQ29tcHJlc3Npb25PcHRpb25zLmNvbXByZXNzaW9uRGVmYXVsdH0pIHsKICAgIHJldHVybiBuZXcgX1dlYlNvY2tldFRyYW5zZm9ybWVySW1wbChwcm90b2NvbFNlbGVjdG9yLCBjb21wcmVzc2lvbik7CiAgfQoKICAvKioKICAgKiBVcGdyYWRlcyBhIFtIdHRwUmVxdWVzdF0gdG8gYSBbV2ViU29ja2V0XSBjb25uZWN0aW9uLiBJZiB0aGUKICAgKiByZXF1ZXN0IGlzIG5vdCBhIHZhbGlkIFdlYlNvY2tldCB1cGdyYWRlIHJlcXVlc3QgYW4gSFRUUCByZXNwb25zZQogICAqIHdpdGggc3RhdHVzIGNvZGUgNTAwIHdpbGwgYmUgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgcmV0dXJuZWQKICAgKiBmdXR1cmUgd2lsbCBjb21wbGV0ZSB3aXRoIHRoZSBbV2ViU29ja2V0XSB3aGVuIHRoZSB1cGdyYWRlIHByb2Nlc3MKICAgKiBpcyBjb21wbGV0ZS4KICAgKgogICAqIElmIFtwcm90b2NvbFNlbGVjdG9yXSBpcyBwcm92aWRlZCwgW3Byb3RvY29sU2VsZWN0b3JdIHdpbGwgYmUgY2FsbGVkIHRvCiAgICogc2VsZWN0IHdoYXQgcHJvdG9jb2wgdG8gdXNlLCBpZiBhbnkgd2VyZSBwcm92aWRlZCBieSB0aGUgY2xpZW50LgogICAqIFtwcm90b2NvbFNlbGVjdG9yXSBpcyBzaG91bGQgcmV0dXJuIGVpdGhlciBhIFtTdHJpbmddIG9yIGEgW0Z1dHVyZV0KICAgKiBjb21wbGV0aW5nIHdpdGggYSBbU3RyaW5nXS4gVGhlIFtTdHJpbmddIG11c3QgZXhpc3QgaW4gdGhlIGxpc3Qgb2YKICAgKiBwcm90b2NvbHMuCiAgICoKICAgKiBJZiBbY29tcHJlc3Npb25dIGlzIHByb3ZpZGVkLCB0aGUgW1dlYlNvY2tldF0gY3JlYXRlZCB3aWxsIGJlIGNvbmZpZ3VyZWQKICAgKiB0byBuZWdvdGlhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIFtDb21wcmVzc2lvbk9wdGlvbnNdLiBJZiBub25lIGlzIHNwZWNpZmllZAogICAqIHRoZW4gdGhlIFtXZWJTb2NrZXRdIHdpbGwgYmUgY3JlYXRlZCB3aXRoIHRoZSBkZWZhdWx0IFtDb21wcmVzc2lvbk9wdGlvbnNdLgogICAqLwogIHN0YXRpYyBGdXR1cmU8V2ViU29ja2V0PiB1cGdyYWRlKEh0dHBSZXF1ZXN0IHJlcXVlc3QsCiAgICAgIHtwcm90b2NvbFNlbGVjdG9yKExpc3Q8U3RyaW5nPiBwcm90b2NvbHMpLAogICAgICBDb21wcmVzc2lvbk9wdGlvbnMgY29tcHJlc3Npb246IENvbXByZXNzaW9uT3B0aW9ucy5jb21wcmVzc2lvbkRlZmF1bHR9KSB7CiAgICByZXR1cm4gX1dlYlNvY2tldFRyYW5zZm9ybWVySW1wbC5fdXBncmFkZSgKICAgICAgICByZXF1ZXN0LCBwcm90b2NvbFNlbGVjdG9yLCBjb21wcmVzc2lvbik7CiAgfQoKICAvKioKICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcmVxdWVzdCBpcyBhIHZhbGlkIFdlYlNvY2tldCB1cGdyYWRlIHJlcXVlc3QuCiAgICovCiAgc3RhdGljIGJvb2wgaXNVcGdyYWRlUmVxdWVzdChIdHRwUmVxdWVzdCByZXF1ZXN0KSB7CiAgICByZXR1cm4gX1dlYlNvY2tldFRyYW5zZm9ybWVySW1wbC5faXNVcGdyYWRlUmVxdWVzdChyZXF1ZXN0KTsKICB9Cn0KCi8qKgogKiBBIHR3by13YXkgSFRUUCBjb21tdW5pY2F0aW9uIG9iamVjdCBmb3IgY2xpZW50IG9yIHNlcnZlciBhcHBsaWNhdGlvbnMuCiAqCiAqIFRoZSBzdHJlYW0gZXhwb3NlcyB0aGUgbWVzc2FnZXMgcmVjZWl2ZWQuIEEgdGV4dCBtZXNzYWdlIHdpbGwgYmUgb2YgdHlwZQogKiBgU3RyaW5nYCBhbmQgYSBiaW5hcnkgbWVzc2FnZSB3aWxsIGJlIG9mIHR5cGUgYExpc3Q8aW50PmAuCiAqLwphYnN0cmFjdCBjbGFzcyBXZWJTb2NrZXQKICAgIGltcGxlbWVudHMKICAgICAgICBTdHJlYW08ZHluYW1pYyAvKlN0cmluZ3xMaXN0PGludD4qLyA+LAogICAgICAgIFN0cmVhbVNpbms8ZHluYW1pYyAvKlN0cmluZ3xMaXN0PGludD4qLyA+IHsKICAvKioKICAgKiBQb3NzaWJsZSBzdGF0ZXMgb2YgdGhlIGNvbm5lY3Rpb24uCiAgICovCiAgc3RhdGljIGNvbnN0IGludCBjb25uZWN0aW5nID0gMDsKICBzdGF0aWMgY29uc3QgaW50IG9wZW4gPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgY2xvc2luZyA9IDI7CiAgc3RhdGljIGNvbnN0IGludCBjbG9zZWQgPSAzOwoKICBARGVwcmVjYXRlZCgiVXNlIGNvbm5lY3RpbmcgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBDT05ORUNUSU5HID0gY29ubmVjdGluZzsKICBARGVwcmVjYXRlZCgiVXNlIG9wZW4gaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBPUEVOID0gb3BlbjsKICBARGVwcmVjYXRlZCgiVXNlIGNsb3NpbmcgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBDTE9TSU5HID0gY2xvc2luZzsKICBARGVwcmVjYXRlZCgiVXNlIGNsb3NlZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IENMT1NFRCA9IGNsb3NlZDsKCiAgLyoqCiAgICogU2V0IGFuZCBnZXQgdGhlIGludGVydmFsIGZvciBzZW5kaW5nIHBpbmcgc2lnbmFscy4gSWYgYSBwaW5nIG1lc3NhZ2UgaXMgbm90CiAgICogYW5zd2VyZWQgYnkgYSBwb25nIG1lc3NhZ2UgZnJvbSB0aGUgcGVlciwgdGhlIGBXZWJTb2NrZXRgIGlzIGFzc3VtZWQKICAgKiBkaXNjb25uZWN0ZWQgYW5kIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZCB3aXRoIGEKICAgKiBbV2ViU29ja2V0U3RhdHVzLkdPSU5HX0FXQVldIGNsb3NlIGNvZGUuIFdoZW4gYSBwaW5nIHNpZ25hbCBpcyBzZW50LCB0aGUKICAgKiBwb25nIG1lc3NhZ2UgbXVzdCBiZSByZWNlaXZlZCB3aXRoaW4gW3BpbmdJbnRlcnZhbF0uCiAgICoKICAgKiBUaGVyZSBhcmUgbmV2ZXIgdHdvIG91dHN0YW5kaW5nIHBpbmdzIGF0IGFueSBnaXZlbiB0aW1lLCBhbmQgdGhlIG5leHQgcGluZwogICAqIHRpbWVyIHN0YXJ0cyB3aGVuIHRoZSBwb25nIGlzIHJlY2VpdmVkLgogICAqCiAgICogU2V0IHRoZSBbcGluZ0ludGVydmFsXSB0byBgbnVsbGAgdG8gZGlzYWJsZSBzZW5kaW5nIHBpbmcgbWVzc2FnZXMuCiAgICoKICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgbnVsbGAuCiAgICovCiAgRHVyYXRpb24gcGluZ0ludGVydmFsOwoKICAvKioKICAgKiBDcmVhdGUgYSBuZXcgV2ViU29ja2V0IGNvbm5lY3Rpb24uIFRoZSBVUkwgc3VwcGxpZWQgaW4gW3VybF0KICAgKiBtdXN0IHVzZSB0aGUgc2NoZW1lIGB3c2Agb3IgYHdzc2AuCiAgICoKICAgKiBUaGUgW3Byb3RvY29sc10gYXJndW1lbnQgaXMgc3BlY2lmeWluZyB0aGUgc3VicHJvdG9jb2xzIHRoZQogICAqIGNsaWVudCBpcyB3aWxsaW5nIHRvIHNwZWFrLgogICAqCiAgICogVGhlIFtoZWFkZXJzXSBhcmd1bWVudCBpcyBzcGVjaWZ5aW5nIGFkZGl0aW9uYWwgSFRUUCBoZWFkZXJzIGZvcgogICAqIHNldHRpbmcgdXAgdGhlIGNvbm5lY3Rpb24uIFRoaXMgd291bGQgdHlwaWNhbGx5IGJlIHRoZSBgT3JpZ2luYAogICAqIGhlYWRlciBhbmQgcG90ZW50aWFsbHkgY29va2llcy4gVGhlIGtleXMgb2YgdGhlIG1hcCBhcmUgdGhlIGhlYWRlcgogICAqIGZpZWxkcyBhbmQgdGhlIHZhbHVlcyBhcmUgZWl0aGVyIFN0cmluZyBvciBMaXN0PFN0cmluZz4uCiAgICoKICAgKiBJZiBbaGVhZGVyc10gaXMgcHJvdmlkZWQsIHRoZXJlIGFyZSBhIG51bWJlciBvZiBoZWFkZXJzCiAgICogd2hpY2ggYXJlIGNvbnRyb2xsZWQgYnkgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIHByb2Nlc3MuIFRoZXNlCiAgICogaGVhZGVycyBhcmU6CiAgICoKICAgKiAgIC0gYGNvbm5lY3Rpb25gCiAgICogICAtIGBzZWMtd2Vic29ja2V0LWtleWAKICAgKiAgIC0gYHNlYy13ZWJzb2NrZXQtcHJvdG9jb2xgCiAgICogICAtIGBzZWMtd2Vic29ja2V0LXZlcnNpb25gCiAgICogICAtIGB1cGdyYWRlYAogICAqCiAgICogSWYgYW55IG9mIHRoZXNlIGFyZSBwYXNzZWQgaW4gdGhlIGBoZWFkZXJzYCBtYXAgdGhleSB3aWxsIGJlIGlnbm9yZWQuCiAgICoKICAgKiBJZiB0aGUgYHVybGAgY29udGFpbnMgdXNlciBpbmZvcm1hdGlvbiB0aGlzIHdpbGwgYmUgcGFzc2VkIGFzIGJhc2ljCiAgICogYXV0aGVudGljYXRpb24gd2hlbiBzZXR0aW5nIHVwIHRoZSBjb25uZWN0aW9uLgogICAqLwogIHN0YXRpYyBGdXR1cmU8V2ViU29ja2V0PiBjb25uZWN0KFN0cmluZyB1cmwsCiAgICAgICAgICB7SXRlcmFibGU8U3RyaW5nPiBwcm90b2NvbHMsCiAgICAgICAgICBNYXA8U3RyaW5nLCBkeW5hbWljPiBoZWFkZXJzLAogICAgICAgICAgQ29tcHJlc3Npb25PcHRpb25zIGNvbXByZXNzaW9uOgogICAgICAgICAgICAgIENvbXByZXNzaW9uT3B0aW9ucy5jb21wcmVzc2lvbkRlZmF1bHR9KSA9PgogICAgICBfV2ViU29ja2V0SW1wbC5jb25uZWN0KHVybCwgcHJvdG9jb2xzLCBoZWFkZXJzLCBjb21wcmVzc2lvbjogY29tcHJlc3Npb24pOwoKICBARGVwcmVjYXRlZCgnVGhpcyBjb25zdHJ1Y3RvciB3aWxsIGJlIHJlbW92ZWQgaW4gRGFydCAyLjAuIFVzZSBgaW1wbGVtZW50c2AnCiAgICAgICcgaW5zdGVhZCBvZiBgZXh0ZW5kc2AgaWYgaW1wbGVtZW50aW5nIHRoaXMgYWJzdHJhY3QgY2xhc3MuJykKICBXZWJTb2NrZXQoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFdlYlNvY2tldCBmcm9tIGFuIGFscmVhZHktdXBncmFkZWQgc29ja2V0LgogICAqCiAgICogVGhlIGluaXRpYWwgV2ViU29ja2V0IGhhbmRzaGFrZSBtdXN0IGhhdmUgb2NjdXJyZWQgcHJpb3IgdG8gdGhpcyBjYWxsLiBBCiAgICogV2ViU29ja2V0IGNsaWVudCBjYW4gYXV0b21hdGljYWxseSBwZXJmb3JtIHRoZSBoYW5kc2hha2UgdXNpbmcKICAgKiBbV2ViU29ja2V0LmNvbm5lY3RdLCB3aGlsZSBhIHNlcnZlciBjYW4gZG8gc28gdXNpbmcKICAgKiBbV2ViU29ja2V0VHJhbnNmb3JtZXIudXBncmFkZV0uIFRvIG1hbnVhbGx5IHVwZ3JhZGUgYW4gW0h0dHBSZXF1ZXN0XSwKICAgKiBbSHR0cFJlc3BvbnNlLmRldGFjaFNvY2tldF0gbWF5IGJlIGNhbGxlZC4KICAgKgogICAqIFtwcm90b2NvbF0gc2hvdWxkIGJlIHRoZSBwcm90b2NvbCBuZWdvdGlhdGVkIGJ5IHRoaXMgaGFuZHNoYWtlLCBpZiBhbnkuCiAgICoKICAgKiBbc2VydmVyU2lkZV0gbXVzdCBiZSBwYXNzZWQgZXhwbGljaXRseS4gSWYgaXQncyBgZmFsc2VgLCB0aGUgV2ViU29ja2V0IHdpbGwKICAgKiBhY3QgYXMgdGhlIGNsaWVudCBhbmQgbWFzayB0aGUgbWVzc2FnZXMgaXQgc2VuZHMuIElmIGl0J3MgYHRydWVgLCBpdCB3aWxsCiAgICogYWN0IGFzIHRoZSBzZXJ2ZXIgYW5kIHdpbGwgbm90IG1hc2sgaXRzIG1lc3NhZ2VzLgogICAqCiAgICogSWYgW2NvbXByZXNzaW9uXSBpcyBwcm92aWRlZCwgdGhlIFtXZWJTb2NrZXRdIGNyZWF0ZWQgd2lsbCBiZSBjb25maWd1cmVkCiAgICogdG8gbmVnb3RpYXRlIHdpdGggdGhlIHNwZWNpZmllZCBbQ29tcHJlc3Npb25PcHRpb25zXS4gSWYgbm9uZSBpcyBzcGVjaWZpZWQKICAgKiB0aGVuIHRoZSBbV2ViU29ja2V0XSB3aWxsIGJlIGNyZWF0ZWQgd2l0aCB0aGUgZGVmYXVsdCBbQ29tcHJlc3Npb25PcHRpb25zXS4KICAgKi8KICBmYWN0b3J5IFdlYlNvY2tldC5mcm9tVXBncmFkZWRTb2NrZXQoU29ja2V0IHNvY2tldCwKICAgICAge1N0cmluZyBwcm90b2NvbCwKICAgICAgYm9vbCBzZXJ2ZXJTaWRlLAogICAgICBDb21wcmVzc2lvbk9wdGlvbnMgY29tcHJlc3Npb246IENvbXByZXNzaW9uT3B0aW9ucy5jb21wcmVzc2lvbkRlZmF1bHR9KSB7CiAgICBpZiAoc2VydmVyU2lkZSA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJUaGUgc2VydmVyU2lkZSBhcmd1bWVudCBtdXN0IGJlIHBhc3NlZCAiCiAgICAgICAgICAiZXhwbGljaXRseSB0byBXZWJTb2NrZXQuZnJvbVVwZ3JhZGVkU29ja2V0LiIpOwogICAgfQogICAgcmV0dXJuIG5ldyBfV2ViU29ja2V0SW1wbC5fZnJvbVNvY2tldCgKICAgICAgICBzb2NrZXQsIHByb3RvY29sLCBjb21wcmVzc2lvbiwgc2VydmVyU2lkZSk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjb25uZWN0aW9uLgogICAqLwogIGludCBnZXQgcmVhZHlTdGF0ZTsKCiAgLyoqCiAgICogVGhlIGV4dGVuc2lvbnMgcHJvcGVydHkgaXMgaW5pdGlhbGx5IHRoZSBlbXB0eSBzdHJpbmcuIEFmdGVyIHRoZQogICAqIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIHRoaXMgc3RyaW5nIHJlZmxlY3RzIHRoZQogICAqIGV4dGVuc2lvbnMgdXNlZCBieSB0aGUgc2VydmVyLgogICAqLwogIFN0cmluZyBnZXQgZXh0ZW5zaW9uczsKCiAgLyoqCiAgICogVGhlIHByb3RvY29sIHByb3BlcnR5IGlzIGluaXRpYWxseSB0aGUgZW1wdHkgc3RyaW5nLiBBZnRlciB0aGUKICAgKiBXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCB0aGUgdmFsdWUgaXMgdGhlIHN1YnByb3RvY29sCiAgICogc2VsZWN0ZWQgYnkgdGhlIHNlcnZlci4gSWYgbm8gc3VicHJvdG9jb2wgaXMgbmVnb3RpYXRlZCB0aGUKICAgKiB2YWx1ZSB3aWxsIHJlbWFpbiBbOm51bGw6XS4KICAgKi8KICBTdHJpbmcgZ2V0IHByb3RvY29sOwoKICAvKioKICAgKiBUaGUgY2xvc2UgY29kZSBzZXQgd2hlbiB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgY2xvc2VkLiBJZgogICAqIHRoZXJlIGlzIG5vIGNsb3NlIGNvZGUgYXZhaWxhYmxlIHRoaXMgcHJvcGVydHkgd2lsbCBiZSBbOm51bGw6XQogICAqLwogIGludCBnZXQgY2xvc2VDb2RlOwoKICAvKioKICAgKiBUaGUgY2xvc2UgcmVhc29uIHNldCB3aGVuIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBjbG9zZWQuIElmCiAgICogdGhlcmUgaXMgbm8gY2xvc2UgcmVhc29uIGF2YWlsYWJsZSB0aGlzIHByb3BlcnR5IHdpbGwgYmUgWzpudWxsOl0KICAgKi8KICBTdHJpbmcgZ2V0IGNsb3NlUmVhc29uOwoKICAvKioKICAgKiBDbG9zZXMgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLiBTZXQgdGhlIG9wdGlvbmFsIFtjb2RlXSBhbmQgW3JlYXNvbl0KICAgKiBhcmd1bWVudHMgdG8gc2VuZCBjbG9zZSBpbmZvcm1hdGlvbiB0byB0aGUgcmVtb3RlIHBlZXIuIElmIHRoZXkgYXJlCiAgICogb21pdHRlZCwgdGhlIHBlZXIgd2lsbCBzZWUgW1dlYlNvY2tldFN0YXR1cy5OT19TVEFUVVNfUkVDRUlWRURdIGNvZGUKICAgKiB3aXRoIG5vIHJlYXNvbi4KICAgKi8KICBGdXR1cmUgY2xvc2UoW2ludCBjb2RlLCBTdHJpbmcgcmVhc29uXSk7CgogIC8qKgogICAqIFNlbmRzIGRhdGEgb24gdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLiBUaGUgZGF0YSBpbiBbZGF0YV0gbXVzdAogICAqIGJlIGVpdGhlciBhIGBTdHJpbmdgLCBvciBhIGBMaXN0PGludD5gIGhvbGRpbmcgYnl0ZXMuCiAgICovCiAgdm9pZCBhZGQoLypTdHJpbmd8TGlzdDxpbnQ+Ki8gZGF0YSk7CgogIC8qKgogICAqIFNlbmRzIGRhdGEgZnJvbSBhIHN0cmVhbSBvbiBXZWJTb2NrZXQgY29ubmVjdGlvbi4gRWFjaCBkYXRhIGV2ZW50IGZyb20KICAgKiBbc3RyZWFtXSB3aWxsIGJlIHNlbmQgYXMgYSBzaW5nbGUgV2ViU29ja2V0IGZyYW1lLiBUaGUgZGF0YSBmcm9tIFtzdHJlYW1dCiAgICogbXVzdCBiZSBlaXRoZXIgYFN0cmluZ2BzLCBvciBgTGlzdDxpbnQ+YHMgaG9sZGluZyBieXRlcy4KICAgKi8KICBGdXR1cmUgYWRkU3RyZWFtKFN0cmVhbSBzdHJlYW0pOwoKICAvKioKICAgKiBTZW5kcyBhIHRleHQgbWVzc2FnZSB3aXRoIHRoZSB0ZXh0IHJlcHJlc2VudGVkIGJ5IFtieXRlc10uCiAgICoKICAgKiBUaGUgW2J5dGVzXSBzaG91bGQgYmUgdmFsaWQgVVRGLTggZW5jb2RlZCBVbmljb2RlIGNoYXJhY3RlcnMuIElmIHRoZXkgYXJlCiAgICogbm90LCB0aGUgcmVjZWl2aW5nIGVuZCB3aWxsIGNsb3NlIHRoZSBjb25uZWN0aW9uLgogICAqLwogIHZvaWQgYWRkVXRmOFRleHQoTGlzdDxpbnQ+IGJ5dGVzKTsKCiAgLyoqCiAgICogR2V0cyB0aGUgdXNlciBhZ2VudCB1c2VkIGZvciBXZWJTb2NrZXQgY29ubmVjdGlvbnMuCiAgICovCiAgc3RhdGljIFN0cmluZyBnZXQgdXNlckFnZW50ID0+IF9XZWJTb2NrZXRJbXBsLnVzZXJBZ2VudDsKCiAgLyoqCiAgICogU2V0cyB0aGUgdXNlciBhZ2VudCB0byB1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kINrhZKDa4WUg2uFl4NrhZiDa4Wcg2uFnYNrhaCDa4Wjg2uFpoNrhaiDa4Wrg2uFrINrha+Da4Wwg2uFs4NrhbSDa4W4g2uFuYNrhbyDa4W9g2uFwoNrhcODa4XHg2uFyoNrhc2Da4XQg2uF0oNrhdSDa4XWg2uF14NrhduDa4Xdg2uF34NrheKDa4Xlg2uF54NrheqDa4Xrg2uF7oNrhfCDa4Xyg2uF84NrhfeDa4X4g2uEmYNrhf2Da4X/g2uGAINrhgODa4YEg2uGCINrhJSDa4YMg2uElYNrhg+Da4YSg2uGFYNrhhiDa4Sag2uGHINrhh+Da4Yig2uGJYNrhiaDa4Yqg2uGK4Nrhi+Da4Ywg2uGNINrhjWDa4Y3g2uGOINrhjyDa4Y9g2uGQYNrhkODa4ZGg2uGSINrhkqDa4ZMg2uGT4NrhlCDa4ZSg2uGVINrhlaDa4ZXg2uGWYNrhluDa4Zeg2uGX4NrhmKDa4Zjg2uGZ4NrhmiDa4Zsg2uGbYNrhnGDa4Zyg2uGdoNrhneDa4Z7g2uGfINrhoCDa4aBg2uGhINrhoWDa4aIg2uGiYNrho6Da4aPg2uGk4NrhpSDa4aXg2uGmINrhpuDa4adg2uGoINrhqKDa4alg2uGp4NrhqqDa4asg2uGr4NrhrCDa4a0g2uGtoNrhriDa4a6g2uGvINrhr6Da4bAg2uGwoNrhsSDa4bGg2uGyYNrhsuDa4bNg2uGz4NrhtKDa4bUg2uG14NrhtmDa4bbg2uG3YNrht+Da4bgg2uG5INrhuWDa4bpg2uG6oNrhu6Da4bwg2uG84NrhvWDa4b3g2uG+YNrhvyDa4b+g2uHAYNrhwKDa4cGg2uHB4NrhwuDa4cMg2uHD4NrhxGDa4cUg2uHFYNrhxmDa4cag2uHH4NrhyKDa4clg2uHJoNrhyuDa4csg2uHMINrhzGDa4c2g2uHOINrhzuDa4c8g2uHQINrh0GDa4dFg2uHRoNrh0uDa4dMg2uHUINrh1GDa4dVg2uHV4Nrh1mDa4dag2uHXoNrh1+Da4djg2uHZYNrh2eDa4dog2uHbINrh26Da4dwg2uHcYNrh3SDa4d1g2uHeINrh3mDa4d9g2uHfoNrh4KDa4eFg2uHiINrh4qDa4eNg2uHj4Nrh5KDa4eUg2uHl4Nrh5iDa4ecg2uHnYNrh6CDa4ejg2uHpoNrh6eDa4erg2uHrYNrh7CDa4eyg2uHtINrh7eDa4e6g2uHvINrh76Da4fAg2uHwoNrh8ODa4fHg2uHyINrh8yDa4fPg2uH0YNrh9KDa4fWg2uH2INrh9uDa4fdg2uH34Nrh+GDa4fjg2uH5YNrh+eDa4fpg2uH7INrh+2Da4fvg2uH8YNrh/ODa4f0g2uH94Nrh/mDa4f8g2uH/oNriACDa4gCg2uIBYNriAeDa4gJg2uIDINriA6Da4gQg2uIE4NriBWDa4gXg2uIGYNriByDa4geg2uIIINriCKDa4gkg2uIJYNriCqDa4grg2uIL4NriDCDa4gzg2uINYNriDiDa4g5g2uIPYNriD6Da4hCg2uIQ4NriEeDa4hIg2uITINriE6Da4hRg2uIUoNriFWDa4hWg2uIWoNriFuDa4hfg2uIYINriGKDa4hkg2uIZoNriGiDa4hrg2uIbYNriHCDa4hxg2uIc4NriHWDa4h4g2uIeYNriHyDa4h/g2uIgoNriISDa4iGg2uIh4NriIuDa4iNg2uIj4NriJGDa4iTg2uIlINriJiDa4iZg2uInINriJ2Da4igg2uIoYNriKSDa4img2uIqYNriKuDa4itg2uIr4NriLKDa4izg2uItoNriLmDa4i7g2uIvINriMCDa4jCg2uIxINriMWDa4jIg2uIyoNriM2Da4jPg2uI0oNriNODa4jWg2uI14NriNqDa4jbg2uI3oNriN+Da4jjg2uI5INriOiDa4jpg2uI7oNriO+Da4jyg2uI84NriPeDa4j4g2uI/INriP2Da4kAg2uJAYNriQSDa4kFg2uJCINriQuDa4kNg2uJDoNriRKDa4kTg2uJF4NriRmDa4kbg2uJHINriR+Da4kgg2uJI4NriSWDa4kng2uJKYNriSuDa4ktg2uJL4NriTGDa4kzg2uJNYNriTeDa4k5g2uJO4NriT2Da4k/g2uJQINriUSDa4lFg2uJSYNriUqDa4lOg2uJT4NriVODa4lWg2uJWYNriVyDa4lfg2uJYYNriWODa4llg2uJaINriWqDa4lsg2uJb4NriXKDa4lzg2uJdoNriXeDa4l6g2uJfINriX+Da4mAg2uJhYNriYaDa4mKg2uJi4NriZCDa4mRg2uJlYNriZaDa4mag2uJnYNriaCDa4mhg2uJpYNriaeDa4mqg2uJq4NribCDa4mxg2uJtINribWDa4m5g2uJuoNrib2Da4m+g2uJwoNricSDa4nHg2uJyYNricyDa4nOg2uJ0INridGDa4nVg2uJ1oNridmDa4nag2uJ3oNrid+Da4njg2uJ5INrieiDa4npg2uJ7INrie+Da4nyg2uJ9YNrifiDa4n7g2uJ/oNrigCDa4oCg2uKA4NrigeDa4oJg2uKC4Nrig2Da4oQg2uKE4NrihaDa4oYg2uKGoNrihyDa4oeg2uKIYNriiODa4olg2uKJ4NriimDa4org2uKLYNrii+Da4owg2uKM4NrijWDa4o3g2uKOINrijyDa4o9g2uKQINrikGDa4pEg2uKRoNrikiDa4pKg2uKTINrik6Da4pQg2uKUoNrilSDa4pVg2uKWYNriluDa4peg2uKYINrimODa4pmg2uKaYNrimqDa4Sbg2uKboNrinCDa4pzg2uKdoNriniDa4p6g2uKe4Nrin6Da4p/g2uKgoNrioSDa4qGg2uKiINrioqDa4qMg2uKjoNrio+Da4qSg2uKk4NripaDa4VNg2uKmoNripyDa4qeg2uKoINriqKDa4qkg2uKpoNriqeDa4qqg2uKrINriq6Da4SWg2uKsYNrirODa4q1g2uKt4NrirmDa4q7g2uKvYNrir+Da4rBg2uKw4NrhJyDa4rGg2uKyINrisqDa4rMg2uKzoNritCDa4rRg2uK1YNritiDa4rag2uK3INrit+Da4rgg2uK5INriuaDa4rog2uK64Nriu6Da4rxg2uK9INriveDa4r6g2uK/YNriwCDa4sDg2uLBoNriwmDa4sMg2uLD4NrixKDa4sUg2uLFoNrixeDa4sbg2uLHINriyCDa4sig2uLJINriyWDa4sog2uLKYNriy2Da4sug2uLM4NrizWDa4s3g2uLOYNrizuDa4s8g2uLP4Nri0CDa4tFg2uLRoNri0mDa4tKg2uLTYNri06Da4tTg2uLVINri1iDa4tag2uLXYNri2CDa4tig2uLY4Nri2eDa4tog2uLbINri2+Da4txg2uLcoNri3aDa4t4g2uLeoNri3yDa4t+g2uLf4Nri4ODa4uEg2uLh4Nri4iDa4uMg2uLjoNri5GDa4uSg2uLlYNri5aDa4uag2uLm4Nri56Da4ufg2uLo4Nri6WDa4ung2uLqINri62Da4uug2uLsoNri7ODa4u4g2uLuoNri7yDa4u/g2uLwoNrhJeDa4vFg2uBnoNri8mDa4vKg2uLz4Nri9CDa4vUg2uL1oNri9mDa4vag2uL3oNri9+Da4vkg2uL5oNri+mDa4vrg2uL7oNri++Da4vzg2uL9INri/iDa4v5g2uL/oNri/+Da4wDg2uMBINrjAiDa4wJg2uMDYNrjA6Da4wSg2uMFINrjBaDa4wXg2uMG4NrjB6Da4wgg2uMIoNrjCWDa4wmg2uMKYNrjCyDa4wug2uMMINrjDKDa4wzg2uMOINrjDmDa4w8g2uMPYNrjEGDa4xCg2uMRYNrjEaDa4xLg2uMTYNrjE+Da4xRg2uMU4NrjFSDa4xXg2uMWYNrjFyDa4xeg2uMYINrjGGDa4xkg2uMZYNrjGiDa4xqg2uMbINrjG6Da4xwg2uMcYNrjHSDa4x1g2uMeINrjHmDa4x8g2uMfYNrjIGDa4yEg2uMh4NrjImDa4yLg2uMjYNrjJCDa4ySg2uMlINrjJWDa4yYg2uMmoNrjJyDa4yeg2uMoYNrjKODa4ymg2uMqINrjKqDa4ysg2uMr4NrjLKDa4y0g2uMt4NrjLmDa4y7g2uMvoNrjMCDa4Sdg2uMw4NrjMWDa4zGg2uMyoNrjMuDa4zOg2uMz4NrjNODa4zUg2uM14NrjNqDa4zdg2uM34NrjOKDa4zjg2uM5oNrjOeDa4zrg2uM7INrjPCDa4zxg2uM9INrjPaDa4z4g2uM+4NrjP6Da4z/g2uNA4NrjQWDa40Ig2uNCYNrjQyDa40Ng2uNEINrjRGDa40Ug2uNFYNrjRiDa40bg2uNHYNrjR6Da40ig2uNI4NrjSeDa40og2uNLYNrjS6Da40zg2uNNINrjTiDa405g2uNPYNrjT6Da41Cg2uNRYNrjUeDa41Ig2uNTINrjU6Da41Rg2uNUoNrjVeDa41Yg2uNXINrjV2Da41hg2uNYoNrjWWDa41mg2uEnoNrjWuDa4Sfg2uNb4NrhKCDa41yg2uNdINrjXWDa414g2uNeYNrjXyDa419g2uNgINrjYKDa42Fg2uNhoNrjYqDa42Lg2uNj4NrjZGDa42Tg2uNlYNrjZeDa42Yg2uNm4NrjZ2Da42gg2uNoYNrjaSDa42mg2uNqYNrjauDa42ug2uNsINrjbKDa420g2uNtoNrjbeDa427g2uNvINrjb+Da43Ag2uNw4NrjcSDa43Hg2uNyINrjcyDa43Ng2uN0INrjdGDa43Vg2uN1oNrjdmDa43ag2uN34NrjeCDa43jg2uN5INrjeiDa43pg2uN7YNrje+Da43zg2uN9YNrjfiDa436g2uN/YNrjf+Da44Cg2uOBINrjgeDa44Jg2uOC4NrjgyDa44Pg2uOEYNrjhSDa44Wg2uOGINrjhmDa44dg2uOH4NrjiKDa44jg2uOJoNrjieDa44rg2uOLINrjjCDa44xg2uONINrjjaDa445g2uOOoNrjj6Da44/g2uOQ4NrjkWDa45Ig2uOSoNrjk2Da45Qg2uOUoNrjlODa45Xg2uOWINrjlyDa45eg2uOYYNrjmSDa45mg2uOZ4NrjmuDa45tg2uOcINrjnKDa450g2uOdoNrjniDa455g2uOfINrjn6Da46Ag2uOgYNrjoWDa46Gg2uOiYNrjoqDa46Og2uOj4NrjpODa46Ug2uOmINrjpuDa46dg2uOoINrjqKDa46lg2uOp4NrjqiDa46tg2uOr4NrjrKDa460g2uOtoNrjriDa466g2uOvINrjr6Da47Ag2uOw4NrjsSDa47Ig2uOyYNrjs2Da47Pg2uO0oNrjtODa47Wg2uO2INrjtqDa47cg2uO3oNrjt+Da47ig2uO44NrjueDa47og2uO7INrju+Da47xg2uO8oNrjvaDa473g2uO+oNrjvuDaJgQh4OBzoeDjv+Hg8AAi0CHho8Ch4aPBoeGjwmHho8Lh4aPFoeGjxqHho8ih4aPKIeGjyuHho8th4aPMIeGjzSHho83h4aPOYeGjzyHho8/h4aPQoeGj0aHho9Ih4aPSoeGj0yHho9Oh4aPT4eGj1GHho9Sh4aPVIeGj1WHho9bh4aPXoeGj2CHho9ih4aPZYeGj2qHho9th4aPcYeGj3SHho93h4aPeoeGj3yHho9/h4aPgIeGj4SHho+Hh4aPioeGj4yHho+Ph4aPkYeGj5OHho+Vh4aPmIeGj5uHho+dh4aPn4eGj6KHho+lh4aPqIeGj6qHho+wh4aPwIeGj8KHho/Fh4aPx4eGj8mHho/Lh4aPzYeGj9GHho/Sh4aP1IeGj9WHho/Yh4aP2oeGj9yHho/eh4aP4YeGj+SHho/mh4aP6IeGj+qHho/sh4aP74eGj/KHho/0h4aP9oeGj/iHho/5h4aP+4eGj/2Hho//h4aQAYeGkAOHhpAFh4aQB4eGkAmHhpAMh4aQEIeGkBKHhpAUh4aQF4eGkBmHhpAch4aQHoeGkCCHhpAjh4aQJoeGkCyHhpAwh4aQM4eGkDWHhpA3h4aQOYeGkDuHhpA+h4aQQIeGkEOHhpBFh4aQR4eGkEmHhpBMh4aQUIeGkFKHhpBVh4aQWIeGkFuHhpBeh4aQYoeGkGSHhpBph4aQa4eGkGyHhpBth4aQboeGkHCHhpB0h4aQdoeGkHqHhpB8h4aQfoeGkIGHhpCHh4aQiYeGkIyHhpCOh4aQkYeGkJOHhpCWh4aQmIeGkJqHhpCbh4aQnYeGkJ+HhpCih4aQpIeGkKaHhpCoh4aQqoeGkK2HhpCvh4aQsoeGkLSHhpC1h4aQuIeGkLqHhpC8h4aQvoeGkMGHhpDDh4aQxYeGkMeHhpDIh4aQy4eGkM2HhpDPh4aQ0YeGkNSHhpDXh4aQ2YeGkNuHhpDeh4aQ4IeGkOWHhpDnh4aQ6oeGkO6HhpDwh4aQ9IeGkPaHhpD9h4aQ/4eGkQGHhpEEh4aRB4eGkQmHhpELh4aRDYeGkRCHhpESh4aRFIeGkRaHhpEZh4aRG4eGkR2HhpEgh4aRIoeGkSqHhpEwh4aRM4eGkTWHhpE3h4aRPIeGkUCHhpFDh4aRRIeGkUaHhpFJh4aRS4eGkU2HhpFPh4aRUYeGkVOHhpFVh4aRWYeGkVuHhpFeh4aRYYeGkWSHhpFnh4aRaYeGkWuHhpFuh4aRcIeGkXKHhpF0h4aRd4eGkXmHhpF7h4aRfoeGkYCHhpGDh4aRh4eGkYuHhpGOh4aRkIeGkZKHhpGUh4aRlYeGkZeHhpGbh4aRnYeGkaCHhpGih4aRpYeGkaeHhpGoh4aRqoeGka2HhpGvh4aRsYNohG6IiJgSiImAsIiJJ4iJhWiIiYVpiImEc4iImBCIjyOIiJgWiJEAg2iEk4iTmBKIlIIaiJQiiJSFVoiUVIiTmBCImYHriJmEx4iTmBaInACDaIVqiJ6YEoifIoifhVaInpgTiKJUiKKCGoiemBCIpYHriKWEx4iemBaIqACDaIVriKqYEoirhWyIq4VtiKuEzYiqmBaIrwCDaIGyiLGYEoiygKCIsoQXiLJaiLKFboixmBOIt4IaiLciiLeFVoi3VIixmBCIvIHfiLyEwYixmBaIvwCDaIRwiMGYEojChW+IwoS/iMKBi4jChMKIwoRziMKEd4jBmBOIyYIaiMkiiMmFVojJVIjJgKCIyYQXiMlaiMmEcYjJhHKIwZgQiNOFc4jThUGIwZgWiNYAg2iEb4jYmBKI2YRxiNmEcojZhHOI2YCgiNiYFYjehXaI2JgQiOCFc4jghUGI2JgWiOMAAMAAi0GI5ZgSiOaRv4jmkcaI5pHHiOaRzIjlgZ+I65gSiOwniOzAAItBiO4oiOwpiOyB54jsguiI7JG4iOyBgIjskbuI7JG9iOuYEIj3I4jrmBaI+QAAwACLQoj7mBCI/JHYiPyBoIj7kdaI/5gSiQCEzokAgemJAJHXiP+YFokEAADAAItDiQaYEYkHkgGJBpgSiQmSCIkGmBCJC5IJiQuSDokLwACLQ4kOkhOJBpIEiRCYE4kRkgWJEZIDiRCYEIkUkgaJEJgWiRYAiQaSB4kYmBKJGZICiRmSA4kZkgWJGJgWiR0AAMAAi0SJH5gQiSCSGokfgaSJIpgSiSNviSOB4YkjkhaJI5IXiSKYFokoAIkfkhiJKpgSiSuSGYkrgemJK5HgiSqYFokvAADAAItFiTGYEIkyga+JMpIdAMAAi0aJNYRXiTaYEok3kiGJNpgQiTmEhYk2mBaJO8AAi0aJPICoiTWSI4k+mBKJP4CgiT6YE4lBg4mJPpgQiUNBiUODUYlDhIaJQ4SHiUPAAItGiUiSJIk+mBaJSgCJNYGwiUyYEolNgKCJTJgTiU+DiYlMmBCJUUGJUYNRiVGEholRhIeJTJgWiVYAAMAAi0eJWJgQiVmBsYlZki2JWZIzAMAAi0iJXZgSiV6SWIldmBCJYJJaiWCSXIlgkl2JXYGziWSYE4llgdOJZZJIiWWSSYllkkSJZJgQiWqSTYlqkk6JapJSiWqSVYlkmBaJb5JDiW8AiW+SRoldkleJc5gSiXSB04l0kkSJc5gWiXcAAMAAi0mJeZgQiXqBtIl6kpmJepKbiXmSa4l+mBKJfyeJf8AAi0mJgSiJfymJf0+Jf5JtiX+Sb4l/knGJf5JziX+SdYl/kneJf5J5iX+Se4l/kn2Jf5J/iX+SgYl/koOJf5KFiX+Sh4l/komJf5KLiX+SjYl/ko+Jf5KRiX+Sk4l+mBCJmSOJfpgWiZsAAMAAi0qJnYG1iZ6YEomfJ4mfwACLSomhKImfKYmfkp2Jn5KfiZ+SoYmfkqOJnpgQiagjiZ6YFomqAADAAItLiayYEomtkqaJrZKnia2SqImtgcSJrYHBia2SqYmtkqqJrYG9ia2Sq4mtkqyJrYG/ia2BwImtgbiJrZKtia2Sromtkq+JrZKwia2SsYmtkrKJrZKzia2StImtkrWJrZK2ia2St4mtgbmJrZK4ia2SuYmtkrqJrZK7ia2SvImtkr2JrZK+ia2Sv4mtgbqJrZLAia2SwYmtksKJrZLDia2SxImtksWJrZLGia2Bu4mtkseJrZLIia2SyYmtksqJrZLLia2SzImtks2JrZLOia2Sz4mtktCJrZLRia2S0omtktOJrZLUia2S1YmtktaJrZLXia2S2ImtktmJrZLaia2S24mtktyJrZLdia2S3omtgcWJrZLfia2BvImtkuCJrZLhia2BxomtkuKJrYHHia2S44mtkuSJrZLlia2S5omtkueJrYHIia2S6ImtkumJrZLqia2S64mtkuyJrZLtia2S7omtku+JrZLwia2S8YmtkvKJrYHJia2S84mtkvSJrZL1ia2S9omtkveJrZL4ia2ByomtkvmJrZL6ia2S+4mtkvyJrYG+ia2S/YmtgcKJrYHDia2S/omtkv+JrZMAiayYEIockwGKHJMDihyTBYockwaKHJMHAMAAi0yKIoHLiiOYE4okg66KJIOviiRViiSA/Iokg2iKJIOJiiRaiiSAtookgtKKJIF5iiOYEIovg6yKL4Pxii+AoYovgJ+KL5MTii+TFIovkxWKL5MXii+DvIovQYovI4ovkxCKL4LQii+THoovgWWKL5Mgii+TIYovkyKKL5Mjii+DEoovkyeKL5Mpii9Rii+TKoovkyuKL5Msii+TLYovky6KL5Mvii+R4oovkzCKL4Enii/AAItMilCTH4ojmBaKUgCKIoHMilSYEopVWopVgPyKVcAAi0yKWJMyilSYFYpaAIpUmBCKXIPwilyAoYpcg+eKXIHQilSYE4phgtIAwACLTYpjmBGKZJM2imOTCopmmBKKZ8AAi02KaIVyimiTOIpmmBOKa1eKZpgQim1WimaYFopvAIpjkzmKcZgSinLAAItNinOTOopzkziKc4VyinGYE4p3V4pxmBCKeVaKcZgWinsAimOTC4p9mBKKfsAAi02Kf5M6in+TOIp9mBOKglWKfZgW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lruUSJa8lEiWvZRIlr6USJa/lEiWwJRIlsKUR5aolEeR8pRHlrWUR5a2lEeWt5RHlsGURpgQlGnAAItXlGqWw5RqlwCUapcGlGqW9pRqlweUapcLlGqXPJRql0uUaZZglGmWYpRplmSUaZZjlGmWZZRpll+UaZbKlGmWZ5RpltOUaZbVlGmW1pRpltiUaZZplGmW4ZRphPiUaZbklGmW5pRpluiUaZbqlGmW7JRplu6UaZbwlGmW8pRplvSUaZZqlGmW95RplviUaZb5lGmW55RplumUaZbrlGmW7ZRplu+UaZbxlGmW85RplvWUaZb6lGmW+5RplvyUaZb+lGmUSJRplv+UaZb9lGmEBpRplwWUaZZrlGmWbpRplwmUaZcMlGmXCpRplx6UaZcilGmW3ZRplyaUaZcIlGmWZpRplt+UaZcqlGmXLZRplt6UaZZolGmUT5RplzCUaZcxlGmXNpRplGmUaZcylGmXOZRplG+UaZc7lGmXL5RplKCUaZTDlGmU2pRplL2UaZTIlGmU6ZRplOyUaZTulGmU8JRplPKUaZT0lGmU/5RplRKUaZUVlGmVF5RplR+UaZUhlGmVLZRplS+UaZUjlGmVJZRplTCUaZUylGmVPJRplT6UaZUnlGmVQJRplUKUaZU2lGmVOJRplUmUaZdDlGmVTZRplVKUaZVWlGmVW5RplV+UaZVllGmVapRplW6UaZVylGmVdJRplXaUaZbblGmVeZRpltyUaZV7lGmVfJRplX+UaZWBlGmVg5RplYWUaZWHlGmViZRplYuUaZWOlGmVkJRplZOUaZWVlGmVmZRplZuUaZVGlGmVnpRplaGUaZdKlGmVo5RplaeUaZWqlGmVrJRplbCUaZWylGmVl5RplbSUaZW2lGmVuJRplbyUaZXAlGmVw5RplciUaZXKlGmVzJRplc6UaZXRlGmV1ZRpldiUaZXelGmV5ZRpl0CUaZc6lGmXTZRpleeUaZX4lGmV85RplfSUaZX2lGmV/JRplKiUaZYClGmWDpRplhCUaZYLlGmWE5Rpl0+UaZdRlGmXU5Rpl1WUaZdXlGmXWZRpl1uUaZddlGmXX5Rpl2GUaZZ8lGmWHpRplh+UaZSilGmUxJRpliSUaZYllGmUvpRpljyUaZY9lGmWIZRpliKUaZRglGmUY5RpljaUaZY3lGmWOZRpljqUaZYx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lwWYzpcFmM+XBZjQlwWY0ZcFmNSXBZaRlwWY1pcFmNiXBZaQlwWY2pcFmNuXBZjdlwWY3pcFmOCXBZjhlwWECpcFmO+XBZjslwWXMZcFhAaXBZbWlwWZAJcFghGXBZkBlwWZApcFmQOXBZj7lwWZBJcFmOmXBZkFlwWZBpcFlmqXBZb6lwWY/ZcFmQ6XBZkPlwWZEZcFlKiXBZYLlwWZFZcFlmiXBZjklwWZGJcFmR2XBZkglwWZLZcFmSyXBZkclwWZGpcFmRuXBYT4lwWZE5cFmTSXBZj8lwWZN5cFmTWXBZkUlwWZPpcFmT+XBZkrlwWXO5cFly+XBZRPlwWUvZcFlNqXBZTDlwWUyJcFlKCXBZRvlwWVEpcFlTyXBZUnlwWVPpcFlUCXBZVClwWVSZcFlU2XBZVSlwWZXpcFmVaXBZVWlwWVW5cFlV+XBZVllwWVapcFlW6XBZVylwWVf5cFlYGXBZWDlwWVhZcFlYeXBZWJlwWVi5cFlY6XBZWQlwWVk5cFlZWXBZV0lwWVdpcFlXmXBZV7lwWVfJcFlZmXBZWblwWVRpcFlZ6XBZWhlwWUY5cFlGCXBZdZlwWVFZcFlReXBZlXlwWZXZcFlR+XBZUhlwWVLZcFlS+XBZUjlwWVJZcFlTCXBZUylwWVo5cFmW+XBZWnlwWVqpcFlayXBZWwlwWVspcFlbSXBZW2lwWVuJcFlbyXBZXAlwWVw5cFlciXBZXKlwWVzJcFlc6XBZXRlwWV1ZcFldiXBZXelwWV5ZcFleeXBZdAlwWVNpcFlTiXBZdhlwWU6ZcFlOyXBZTulwWU8JcFlPKXBZT0lwWXW5cFlfOXBZX0lwWV9pcFlfyXBZYClwWWDpcFlhCXBZYTlwWVl5cFl1GXBZY2lwWWOZcFljGXBZY8lwWWKJcFlk+XBZdPlvOYFpe2AJaZmZKXuJgSl7mSIZe5mZOXuZmUl7mZlZe5mZaXuZmXl7mZmJe5mZmXuZmal7mZm5e5mZyXuZmdl7mZnpe5mZ+XuZmgl7mZoZe5maKXuZmjl7mZpJe5maWXuJgQl86ZqJfOmamXzpdZl86VEpfOlTyXzpU+l86VJ5fOlUCXzpVCl86VSZfOlU2XzpVSl86VVpfOlW6XzpVyl86Vf5fOlYGXzpWDl86VhZfOlYeXzpWJl86Vi5fOlY6XzpWTl86VlZfOlXSX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oYyV5aGMleehi5gWoaIAoBSh4qGkmBChpZdhoaWVo6GllaehpZWqoaWVrKGllbChpZWyoaWVtKGllbahpZW4oaWVvKGllcChpZXDoaWVyqGllcyhpZXOoaWV0aGlldihpZXeoaWV5aGlleehpJgWobsAAMAAi36hvYSMob6YEqG/wACLfqHAoeShwKHlocCh5qG/gLChv5Qcob8nob6YE6HHklGhx5cDoceXKKHHlwGhx5cCob6YEKHNoeehzZRMoc2WVaHNoeihzZRLoc2USaHNllOhzaHsoc2USqHNofChzZZXoc0joc2X6qHNofKhvpgWodzAAIt+od2AqKHchPQAwACLf6HgnbOh4ZgSoeKh9aHiofah4ZgWoeUAAMAAi4Ch55gRoeih+aHnnRmh6pgSoeuEKqHrlG6h65Tcoeuh+qHrofuh66H8oeqYFaHyAKHqmBOh9JWgofSVC6H0lTuh9JUdofSh/qH0lXih9JVVofSVfqH0lR6h9KH/ofSa9KH0mwyh9JrvoeqYEKIClVqiApVeogKVZKICogGiAqICogKVnaIClZKiApUOogKVKKIClSmh6pgWog2h/aHnogOiD5gSohCiBKIPmBOiEpWgohKVC6ISof+iEprvog+YEKIXlZ2iF5UNoheiBaIXwACLgKIbogaiG6ILoheZ06IPmBaiHwAAwACLgaIhmBKiIqIVoiKiFqIioheiIqIYoiKiGaIiohqiIqIboiKiHKIhohOiK5gSoiyiFKIrmBaiLgAAwACLgqIwoh6iMZgSojKiH6IyoiCiMpR8ojKSOKIylLCiMpS/ojKSPaIylMWiMosqojKU6qIylO2iMpTvojKU8aIylPOiMpWfojKVnKIylSKiMpUkojKVJqIyoiGiMpI5ojKVE6IylRaiMpUYojKVIKIylSuiMpUuojKSPqIylTGiMpU6ojKVPaIylT+iMpVBojKiIqIylUeiMpVKojKVTqIylVOiMpVXojKVXKIylWCiMpVmojKVbaIylW+iMpI/ojKVd6IyoiOiMqIkojKSPKIylX2iMpWAojKVgqIylYSiMpWGojKViKIylYyiMpWRojKVlKIykjqiMpWaojKVRKIyoiWiMqImojKiJ6IyoiiiMqIpojKViqIyoiqiMpI3ojKVpKIylauiMpWtojKVsaIylbOiMpW1ojKVt6IylbmiMpW9ojKVwaIylcmiMpXLojKVzaIylc+iMpXWojKV2aIykkGiMpXmojKiK6IylamiMpYJojKV96IylfKiMpI1ojKV9aIylfmiMpX9ojKSQKIyoiyiMqItojKiLqIyoi+iMqIwojKVlqIyojGiMqIyojKiM6IyojSiMqI1ojKiNqIyojeiMqI4ojKiOaIyojuiMZgWoqQAojCiPKKmmBKip5YaoqeWHaKnliCip5YjoqeWJ6Knliqip5YvoqeWNaKnljiip5Y7oqeWQKKnlkeip5ZLoqeWTqKmmBaitgAAwACLg6K4mBCiuaJRoriiPqK7mBCivJjToruYFqK+AKK4oj+iwJgSosHAAIuDosKiQKLAmBCixJjTosCYFqLGAKK4okGiyJgSosnAAIuDosqiQqLKokOiyqJAosiYFaLOAKLImBOi0KJEotCY8KLImBCi057sotOY06LTmPKiyJgWoteVNKK4okWi2ZgSotqX36Laokai2ZgQot2e8aLdokei3ZSiot2UT6Ldl1+i3ZXrotmYFqLkAADAAIuEouaiVqLnmBKi6MAAi4Si6aJXoueYE6LrgPyi64NooueYEKLuT6Luk+Ci7pp3ou7AAIuEovKiW6Lyolii8qJaoueYFqL2AADAAIuFoviiX6L5mBKi+qJgovqiYqL6omSi+sAAi4Wi/oVEovmYEKMAwACLhaMBommjAJrJowCbBqMAomyjAJrSowCa8KMAmsujAKJuowCaxqMAom+i+ZgWowwAowyiZ6MMomijDJyuoviicKMRmBKjEoQJoxLAAIuFoxSadaMRmBOjFpQ4oxaicaMRmBCjGcAAi4WjGqJ0oxma0qMZmvCjGZrLoxmibqMRmBajIACi+KJ2oyKYEqMjklGjI5RCoyPAAIuFoyaid6MimBOjKIQJoyiUPqMoonGjIpgQoyyieKMslD+jLJrLoyyibqMimBajMQCjMaJkAMAAi4ajNJgSozWig6M1ooSjNaKFozWihqM1ooejNaKIozWiiaM1ooqjNaKLozWijKM1oo2jNaKOozWij6M1opCjNaKRozWikqM1opOjNaKUozWilaM1opajNaKXozWimKM1opmjNaKaozWim6M1opyjNaKdozWinqM1op+jNaKgozWioaM1oqKjNaKjozWipKM1oqWjNaKmozWip6M1oqijNaKpozWiqqM1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HpgSpR+djqUemBClIZQ/pSGjO6UhRKUemBalJQCk66OapSeYEqUogLClKIPmpSiEF6UohBilJ5gTpS2B06Uto4qlLSKlLaM/pSeYFqUyAKTro5ulNJgTpTWSUaU1g+ClNYRCpTWjbaU1hEClNYRBpTWUrKU1g96lNYRGpTWjnKU1o52lNSKlNJgWpUIApOudG6VEmBOlRZJRpUUipUSYEKVInWmlRJgWpUoApOujnqVMmBKlTZ2PpU2ZzaVNV6VMmBClUValTJgWpVMApOujn6VVmBKlVqOgpVajoaVWgLClVZgQpVpWpVWYFqVcAADAAIuTpV6YEKVfo7OlXp0cpWGYEqVio6alYqOnpWKUh6VilJGlYZgTpWeZPKVnhAmlYZgQpWqe8aVqnXGlaqOupWqjsaVqo7KlaoHfpWGYFqVxAADAAIuUpXOYEqV0pDyldKQ+pXOdHaV3mBKleIHjpXiSCqV4nvWleIQrpXiEKqV4o8WleKPGpXijx6V4o8ileKOwpXijyaV4o8qleKPLpXeYE6WGndKlhp3TpYaB06V3mBClipIGpYqjzqWKo9Klip3epYqd26WKnvOliqPZpYqdQ6WKnUSliqPzpYqdRaWKnUqlip1epYqdX6WKnU2lip1JpYqdRqWKnWClip1hpYqkBqWKpAeliqQNpYqdSKWKkdqliqQYpYqdUKWKpBuliqQdpYqdTqWKnVKlip1TpYqdVKWKnVWlip1WpYqdV6WKnVilip1PpYqdQaWKnVGliqQ2pYqkOqWKhDulioQ+pYqewqWKne6lip3vpXeYFqW5AADAAIuVpbuYEKW8pPOlvJ0epbzAAIuVpb+k9aW7pEilwZgSpcKkSaXBmBClxJYXpcQjpcGYFqXHAKXHpEqlx6RLpcekTaW7pE+lzJgSpc2kUKXNlkWlzaRRpc2kUqXNpFOlzZ2YpcyYEKXUpFWl1JRjpdSUYKXUlKCl1JTapdSUw6XUlG+l1JTIpdSWE6XUpFal1KRYpdSU/6XUleWl1JS9pdSVf6XUlTCl1JXIpdSVFaXUlYml1JWLpdSVjqXUlUKl1JVApdSVl6XUpFml1KRbpdSkXaXMmBal8AClu6RgpfKYEqXzn7yl84QipfOEX6XzhCql85ZFpfOB2KXzpFSl852YpfOkYaXzpGKl86RjpfOkZKXznXql86RlpfOkZqXz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L5gSrDAgrDBXrDCbLqwwVawwqI2sMIF4rDCojqwwqI+sMFqsMKiQrC+YFqw7AKwuqJKsPZgSrD4grD5XrD6ok6w+Vaw+Vqw+qI6sPqiUrD6olaw+qJasPqiXrD5arD6oj6w+qJisPqiQrD2YFqxNAKwun5KsT5gSrFCbG6xQV6xQVaxQVqxQqI6sUKiarFColKxQqJusUKicrFCB36xQknesUFqsUIPQrFAnrFCoj6xQqJ2sT5gWrGEArC6fk6xjmBKsZKierGSon6xkqKGsZKiirGSopKxkqKasZKiorGSoqqxkqKusZKisrGSoraxkqK+sZKixrGSos6xkqLWsZKi3rGSouaxkqLusZKi9rGSov6xkqMGsZKjDrGSoxaxjmBasfAAAwACLr6x+n5Ssf5gTrICTDax/mBCsgoIjrH+YFqyEAADAAIuwrIaoyqyHmBasiACshqjLrIqYEKyLqMysipgWrI0ArIaozayPmBaskAAAwACLsaySqNGsk5gTrJSbDayUmuGslJsMrJSa9KyUmuyslJshrJSa7ayUqNKslJsirJSbC6yUmyqslJsUrJSa/ayUmwGslJsDrJSo06yUmvuslJrurJSbFqyUmuuslJrIrJSbBayUqNSslKjVrJSo1qyUqNeslKjYrJSo2ayUqNqslKjcrJSdLqyUlaCslJU7rJSh/qyUlR2slJV4rJSVVayUlX6slJTdrJSVC6yUlR6slKjerJSo36yUqOislKjprJSo6qyUqOuslKjsrJSo7ayUqO6slKjvrJSo8KyUqPGslKjyrJSo86yUqPSslKj2rJSo96yUqPislKj5rJSo+qyUqPuslKj8rJSo/ayUqP6slKj/rJSpAKyUqQGslKkCrJSpA6yUqQSslKkFrJSpBqyUqQeslKkIrJSpCayUqQqslKkLrJSpDKyUqQ2slKkOrJSpD6yUqRCslKkRrJSpEqyUqROslKkUrJSpFayUqRaslKkXrJSpGKyUqRmslKkarJSpG6yUqRyslKkdrJSpH6yUqSCslKkirJSpI6yUqSSslKklrJSpJqyUqSeslKkorJSpKayUqSqslKkrrJSpLKyUqS2slKkurJSpL6yUqTCslKkxrJSpMqyUqTOslKk0rJSpNayUqTaslKk3rJSpOKyUqTmslKk6rJSpO6yUqTyslKk9rJSpPqyUqT+slKlArJSpQayUqUKslKlDrJSpRKyUqUWslKlGrJSpR6yUqUislKlJrJSpSqyUqUuslKlMrJSpTayUqU6slKlPrJSpUKyUqVGslKlSrJSpU6yUqVSslKlVrJSpVqyUqVeslKlYrJSpWayUqVqslKlbrJSpXKyUqV2slKlerJSpX6yUqWCslKlhrJSpYqyUqWOslKlkrJSpZayUqWaslKlqrJSpa6yUqWyslKltrJSpbqyUqW+slKlwrJOYEK1DqNutQ6jdrUOm5K1Dpw2tQ6b/rUOiAa1DlZ2tQ6ICrUOo4K1DqOGtQ6jirUOo461DqOetQ6j1rUOpHq1DqSGtQ6lnrUOpaK1DqWmtQ6lxrUOpcqyTmBatWQCskqlzrVuYE61cqXStXKl1rVybD61cqXatXKl3rVypeq1cqXutW5gQrWSpeK1kqXmtZKl8rVuYFq1oAKySqX2tapgQrWupfq1rqX+ta6mArWupga1rqYSta6mFrWupi61rqYyta6mNrWupjq1rqZKta6mTrWqYE614qYKteKmDrXiph614qYiteKmJrXipiq14qY+teKmQrXipka1qmBatggCskqmUrYSYEq2FwACLsa2GqZWthpqTrYaala2GmpethpqWrYaamK2GmpmthpqhrYaplq2Gmp+thpqUrYaaoK2Gmq+thpqarYaam62GmpythqmXrYaana2Gmq6thpqwrYaakq2Gmq2thprArYapmK2GqZmthqmarYapm62GqZythqmdrYapnq2GqZ+thqmgrYapoa2GqaKthqmjrYappK2GqaWthqmmrYapp62GqaithqmprYapqq2GqauthqmsrYapra2Gqa6thqmvrYapsK2GqbGthqmyrYaps62GqbSthqm1rYaptq2Gqbethqm4rYapua2Gqbqthqm7rYapvK2Gqb2thqm+rYapv62GqcCthqnBrYapwq2GqcOthqnErYapxa2GqcathqnHrYapyK2GqcmthqnKrYapy62GqcythqnNrYapzq2Gqc+thqnQrYap0a2GqdKthqnTrYap1K2GmsGthqnVrYap1q2GqdethqnYrYap2a2GqdqthqnbrYap3K2Gqd2thqnerYap362GqeCthqnhrYap4q2GqeOthqnkrYap5a2GqeathqnnrYap6K2GqemthqnqrYap662GqeythqntrYSYE631mw2t9ZrhrfWbDK31mvSt9ZrsrfWbIa31mu2t9ajSrfWbIq31mwut9ZsqrfWbFK31mv2t9ZsBrfWbA631qNOt9Zr7rfWa7q31mxat9ZrrrfWayK31mwWt9ajUrfWo1a31qNat9ajXrfWo2K31qNmt9ajarfWo3K31nS6t9ZWgrfWVO631of6t9ZUdrfWVeK31lVWt9ZV+rfWU3a31lQut9ZUerfWo3q31qN+t9ajorfWo6a31qOqt9ajrrfWo7K31qO2t9ajurfWo7631qPCt9ajxrfWo8q31qPOt9aj0rfWo9q31qPet9aj4rfWo+a31qPqt9aj7rfWo/K31qP2t9aj+rfWo/631qQCt9akBrfWpAq31qQOt9akErfWpBa31qQat9akHrfWpCK31qQmt9akKrfWpC631qQyt9akNrfWpDq31qQ+t9akQrfWpEa31qRKt9akTrfWpFK31qRWt9akWrfWpF631qRit9akZrfWpGq31qRut9akcrfWpHa31qR+t9akgrfWpgq31qYOt9amHrfWpiK31qYmt9amKrfWpdK31qXWt9akirfWpI631qSSt9aklrfWpJq31qSet9ZsPrfWpdq31qXet9akorfWpKa31qSqt9akrrfWpLK31qS2t9akurfWpL631qTCt9akxrfWpMq31qTOt9ak0rfWpNa31qTat9ak3rfWpOK31qTmt9ak6rfWpO631qTyt9ak9rfWpPq31qT+t9alArfWpQa31qUKt9alDrfWpRK31qUWt9alGrfWpR631qUit9alJrfWpSq31qUut9alMrfWpTa31qU6t9alPrfWpUK31qVGt9alSrfWpU631qVSt9alVrfWpVq31qVet9alYrfWpWa31qVqt9albrfWpXK31qV2t9alerfWpX631qWCt9alhrfWpYq31qWOt9alkrfWpZa31qWat9alqrfWpa631qWyt9altrfWpbq31qW+t9aoErfWpj631qZCt9alwrfWpka31qXqt9al7rYSYEK61wACLsa62qfOutqnurrap9K62qf2utqnyrrap9662qfiutqoGrraqDK62qg2utqoOrraqH662qiCutqo6rraqQa62qkKutqpirraqaa61qNuutajdrrWpfq61qX+utabkrrWnDa61pv+utaIBrrWVna61ogKutajgrrWo4a61qOKutajjrrWo5661qYCutaj1rrWpHq61qYGutamErrWpha61qSGutamLrrWpjK61qY2utal4rrWpZ661qWiutalprrWpjq61qXmutamSrrWpca61qXyutamTrrWpcq2EmBau7QCskp+Vru+YE67wqnCu8J/2rvCELK7wnS6u75gQrvWY0K71n+eu9Z/zrvWp+671qnGu9an8rvWp/q71qnKu9an/rvWqdK71qnWu9ap2rvWqc671qniu9aoBrvWqAK71qnmu9ap6rvWUm671qnuu9ap8rvWqfa71qn6u9ap/rvWqgK71qoGu9aqCru+YFq8RAKySqoOvE5gQrxSqhK8UqoWvFKqGrxSqh68UqoivFKqJrxSqiq8TmBavHACskqqMrx6YEK8fqo2vH6qOrx+qj68fqpCvH6qRrx+qkq8fqpOvH6qUrx6YFq8oAADAAIuyryqYEK8rq3uvKqqery2YEq8uqp+vLoCwry7AAIuyrzGqoK8tmBCvM4HfrzMjry2YE682qqSvLZgWrzgAryqflq86mBKvO8AAi7KvPKqmrzyqp688qqqvPKqrrzyqrK88qq2vPKqurzyqr687n/uvO6qorzuqsK87gh6vOpgTr0mAsK9JwACLsq9LqrSvSYIvr0mCjq9JgpCvSZ/mr0mqta9Jn86vOpgQr1PAAIuyr1Sqtq9UqrqvVKq+r1Sqwa9UqsCvVKrEr1SqvK9UqtOvVKrXr1Sq3q9Uqt+vVKrgr1Sq4a9UquSvVKrlr1Sq5q9Uqt2vVKrrr1Sq7q9UqvSvU6q3r1OquK9TqrmvU6rDr1Oqva9TqvGvU4Ijr1Oq/a9Tn/ivU6r/r1OrAK9TqwGvOpgWr3UAryqrFq93mBKveKsXr3iC3q94wACLsq97qxivd5gWr32SQ699AK8qqxuvgJgSr4GdZq+BJ6+AmBavhACvKqscr4aYEq+HwACLsq+Iqx2viKser4aYE6+LqrGvhpgQr42q6q+Nk+avjcAAi7KvkKsgr4aYFq+SAK8qqyevlJgSr5XAAIuyr5aqoK+Wqyivlaqyr5SYE6+aWq+UmBCvnMAAi7Kvnasfr5wjr5SYFq+gAK8qqyqvopgSr6Oq1a+jqyuvo6ssr6OrLa+jwACLsq+oqy6vopgTr6qDaK+imBCvrKr4r6yUQa+slD+vrKrcr6KYFq+xAK8qn5Svs5gSr7SrL6+zmBCvtqbFr7OYFq+4AK8qqzCvupgSr7uZPK+6mBCvvabFr7qYFq+/AK8qqzGvwZgSr8KSW6/BmBCvxKbFr8GYFq/GAK8qqzKvyJgSr8mEH6/ImBCvy6bFr8iYFq/NAK8qn5evz5gSr9CDq6/Qn/uv0Ks0r9DAAIuyr9SrNa/Uqzav1Ks3r9SrOK/Uqqqv1Kqvr9CrOa/Qqu+vz5gVr92TFq/dq0Gvz5gQr+CrTa/gq1mv4Ktar+CrXK/gq12v4Kter+CrYa/gq2Kv4Ktjr+CrZq/gq2iv4Ktpr8+YE6/tq1uvz5gWr+8Aryqrba/xmBKv8pQ4r/KUPq/yqsyv8pinr/GYEK/3lEGv95Q/r/eq3K/xmBav+wCvKqtvr/2YEq/+lF6v/pjqr/2YELABq26v/ZgWsAMAryqrcLAFmBKwBsAAi7KwB6txsAercrAHq3OwBZgQsAufGrALloiwC6t0sAuV9LALlguwC5X8sAuWArALq3mwC6t6sAuV9rAFmBawFgAAwACLs7AYq4GwGZgQsBqgQLAag2uwGZgVsB0AsBirgrAfmBKwIICgsB+YELAioECwIoNrsB+YFrAlALAYq4OwJ5gSsCibPLAnmBCwKqBAsCqDa7AnmBawLQCwGKuEsC+YErAwgKCwL5gQsDKgQLAyg2uwL5gWsDUAsBirhbA3mBCwOKBAsDiDa7A3mBawOwAAwACLtLA9q4ywPpgSsD+CHrA/n+GwP8AAi7SwQquNsEKrjrBCq4+wQquQsD+fwbA/gRCwPpgTsEl+sEmf2bA+mBCwTIIjsEyrlLBMlE+wTMAAi7SwUKufsFCrobBQq6ywUKvCsFCrprBQq62wUKuTsEyUvbBMlKCwTKu0sEyrmrA+mBawXACwPavEsF6YErBfq8WwX6vGsF6YFrBiALA9q8ewZJgQsGWryLBkmBawZwCwPZ+ZsGmYErBqqqiwaoIesGqry7Bqq8ywasAAi7Swb6vNsG+rkrBvq86wb6uRsG+r0LBqq5awaqvPsGqrlbBpmBOweICwsHir27BpmBCwe6AUsHuryLB7q9Kwe6vUsHur1bB7q9mwe6vasHur3LB7q92we6vfsHurmLB7q+Gwe6ulsHuCCLB7q+awe6vlsHur5LBpmBawjQCwPawHsI+YErCQwACLtLCRq96wj5gTsJOBP7CTWrCPmBawlgAAwACLtbCYrAmwmZgTsJqAsLCZmBawnACwmKwKsJ6YE7CfoCqwnpgWsKEAsJisC7CjmBKwpICwsKSrDrCklF6wpICgsKOYELCpI7CjmBawqwCwmKwOsK2YE7CuhAmwrqwPsK6D37CtmBawsgCwmKwQsLSYE7C1hAmwtJgWsLcAsJisEbC5mBOwuqwSsLonsLmYFrC9ALCYqMiwv5gTsMCibbDAhEawwIPesMCUrLDAhEWwwIRCsMCqVrDAhECwwIRBsMCm37DAg+KwwIPfsMCSabDAhAmwv5gWsM8AsJisE7DRmBaw0gCwmKwUsNSYE7DVg+Sw1awVsNWU9bDUmBaw2QCwmJUAsNuYErDcnA+w3KwWsNyb1rDcrBiw3JW/sNysF7DcrBmw3Cmw25gQsOUjsNuYE7DnJ7DbmBaw6cAAi7Ww6oCosJisGrDsmBOw7arCsO2rtrDtqmyw7JgWsPEAsJisG7DzmBOw9JhQsPOYFrD2ALCYrByw+JgWsPkAsJisHbD7mBKw/IOrsPysH7D8lGyw/JRtsPySXrD7mBWxAqwgsQKrQbD7mBCxBatNsQVBsQUjsPuYE7EJrCOxCawksQmsJbEJg4mxCawmsQmX/7D7mBaxEACxEKJ/sRCZywDAAIu2sRSfm7EVmBKxFsAAi7axF6w1sRasNrEWgh6xFZgTsRuAsLEbn++xG5/XsRWYELEfn/CxH6AdsRWYFrEiALEUn5qxJJgSsSWsOrEloCyxJJgTsSif2LEorDuxKKw8sSigLrEooDSxKJpBsSSYELEvoCmxL4IPsS+DvLEvn/2xL6AvsS+gMLEvndyxJJgWsTcAsRSsPbE5mBCxOqw+sTqsQbE6rEKxOqxDsTqsRLE6rEWxOqxGsTqsR7E6rEixOqxKsTqd3LE5mBaxRgCxFKxLsUiYErFJwACLtrFKrEyxSJgTsUyTb7FMo9exTJ+1sUiYELFQrE2xUKxOsVCsT7FQrFCxUKxRsVCgKbFQgg+xUKxTsUiYFrFZALEUn5yxW5gSsVyqqLFck2+xXICwsVzAAIu2sWCsVbFgrFaxYKxXsWCsWLFgrFmxYJ+ysWCsWrFgrFuxXKPXsVygLLFcrDmxW5gTsWyf2LFsrDyxbJpBsWygNLFsoC6xbKw7sVuYELFzoDCxc5/9sXPAAIu2sXasXrF2rGexdqxisXascbF2rGmxdqx1sXasaLF2rHmxc6AvsXOsTbFzrFCxc6xRsXOsTrFzrE+xc4O8sXOd3LFzI7FzrHyxW5gWsYkAsRSsgbGLmBKxjJ+/sYuYELGOqtGxjqrHsY6qzbGOrIKxi5gWsZMAsRSsg7GVmBCxlqx+sZWYFrGYAADAAIu3sZqsh7GbmBCxnJ/lsZyf0rGcrIqxnKyLsZysjbGcrJixnJ/3sZysm7GcrJyxnKBQsZuYE7Gnn+axp6q1saesiLGnrImxp6iDsaesjLGbmBaxrgCxmqydsbCYELGxrJ6xsayfsbGsoLGwmBaxtQCxmqyhsbeYErG4rKKxuMAAi7exuqyjsbeYE7G8qIOxt5gWsb4AsZqspbHAmBCxwaBmscGgZ7HAmBaxxAAAwACLuLHGrKixx5gSscjAAIu4scmT8LHIrKmxyKyqscisq7HHmBOxzquksc6qPbHOrKyxzqytsceYELHTrK6x06yvsdOssLHTI7HHmBax2MAAi7ix2YCoscafnbHbmBCx3Kyysdyss7HbmBax3wCxxqy0seGYFrHiALHGrLWx5JgTseWdLrHllR6x5ZTdseWVO7HllR2x5ZV4seWh/rHllVWx5abkseWnDbHlpv+x5ay2seWVC7HlrLex5ay4seWsubHlrLqx5ay7seWsvLHlrL2x5ay+seWsv7HlrMCx5azBseWswrHkmBCx/6zDsf+sxLH/rMWx/6zGsf+sx7H/rMix/6zJsf+syrH/rMux/6zMsf+szbH/rM6x/6zPsf+A/LH/rNCx/6zRsf+s0rH/rNOx/6sJsf+s1LH/rNWx/6zWsf+s17H/rNix/6zZsf+s2rH/rNux/6zcsf+s3bH/rN6x/6zfsf+s4LH/rOGx/6zisf+s47H/rOSx/6zlsf+s5rH/rOex/6zosf+s6bH/rOqx/6zrsf+s7LH/rO2x/5Pmsf+s7rH/k+ex/6zvsf+DxrH/rPCx/6zxsf+s8rH/rPax/6z3sf+kj7H/rPix/6z5sf+m+LH/rPqx/6z7sf+s/LH/rP2x/6z+sf+tALH/rQGx/60Csf+tBbH/rQax/60Hsf+tCLH/rQmx/60Ksf+tC7H/qjyx/60Msf+tDbH/gtCx/60Qsf+tEbH/qUCx/60Ssf+tE7H/rRSx/60Vsf+tFrHkmBayVgAAwACLubJYrReyWZgQslojslmYFrJcALJYrRiyXpgTsl+dLrJfrMKyX6zBsl+swLJfrL+yX6y+sl+svbJfrLyyX6y7sl+surJfrLmyX6y4sl+st7JflQuyX6y2sl+m/7Jfpw2yX6bksl+VVbJfof6yX5V4sl+VHbJflTuyX5Tdsl+VHrJemBCyea0WsnmtFbJ5rRSyea0TsnmtErJ5qUCyea0RsnmtELJ5gtCyea0MsnmqPLJ5rQuyea0KsnmtCbJ5rQiyea0HsnmtBrJ5rQWyea0CsnmtAbJ5rQCyeaz+snms/bJ5rPyyeaz7snms+rJ5pviyeaz5snms+LJ5pI+yeaz3snms9rJ5rPKyeazxsnms8LJ5rQ2yeYPGsnms77J5k+eyeazusnmT5rJ5rO2yeazssnms67J5rOqyeazpsnms6LJ5rOeyeazmsnms5bJ5rOSyeazjsnms4rJ5rOGyeazgsnms37J5rN6yeazdsnms3LJ5rNuyeazasnms2bJ5rNiyeazXsnms1rJ5rNWyeazUsnmrCbJ5rNOyeazSsnms0bJ5rNCyeYD8snmsz7J5rM6yeazNsnmszLJ5rMuyeazKsnmsybJ5rMiyeazHsnmsxrJ5rMWyeazEsnmsw7JemBay0ACyWJ+estKYELLTrLKy06yzstKYFrLWALJYrR+y2JgQstmtILLZrSKy2JgWstwAslitJbLemBCy360mst+tDLLfrSiy3yOy3pgWsuQAAMAAi7qy5pgQsueuMrLmrTiy6ZgSsurAAIu6suutObLrrTqy6607suutPLLrrT2y660+suutP7LrrUCy661BsuutQrLrrUOy661EsuutRbLrrUay661HsuutSLLrrUmy661KsuutS7LrrUyy661NsuutTrLrrU+y661QsuutUbLrrVKy661TsuutVLLrrVWy661WsuutV7LpmBOzC6q1swudLrMLrLazC5UdswusurMLrLmzC6y7swuVeLMLof6zC5U7swuU3bMLpuSzC6y8swusuLMLrLezC6cNswusvbMLpv+zC6y+swuVVbMLlR6zC6zAswuswbMLrMKzC5ULswusv7MLrVuzC61cswutXbMLrV6zC61fsumYELMrrVizK6zIsyusybMrrMOzK6zEsyusxbMrrMazK6zHsyusyrMrrMuzK6zMsyvAAIu6szetZbM3rWazN61oszetbbM3rXGzN61zszetcrM3rXWzN610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6AC1zK6FteqYELXrroa1666HteuuiLXrrom1666Kteuui7Xrroy1666NteuujrXrro+1666QteuukbXrrpK1666TteuulLXrrpW1666Wteuul7Xrrpi1666ZteuumrXrrpu1666cteuunbXrrp61666fteuuoLXrrqG1666iteuuo7XrrqS1666lteuuprXrrqe1666oteuuqbXrrqq1666rteuurLXqmBa2EwC1zK6tthWYE7YWrq62FoMVthaBi7YWhMK2Fq6vthausLYWg4m2FqwmthWYELYfQbYfI7YVmBa2IgC1zK6ytiSYErYlwACLvLYmrrO2Jq60tiSYE7Yprq62KYMVtimBi7YphMK2Ka6vtimusLYprCa2JJgQtjEjtiSYFrYzALYzrri2M665tcyuurY3mBK2OIMVtjiur7Y3mBO2O6wmtjeYELY9I7Y3mBa2PwC1zK67tkGYE7ZCrq62Qq6wtkKur7ZChMK2QoGLtkKDFbZCrry2QZgQtkojtkGYFrZMALXMrr62TpgStk+uv7ZPrn+2T67Atk6YE7ZTrsO2U67Etk6YFrZWrsG2Vq7CAMAAi722Wa7StlqYELZboB62W2C2WpgTtl6TU7ZamBa2YAC2Wa7TtmKYErZjwACLvbZkrtS2ZK7VtmSu1rZkrte2ZK7YtmSu2bZkrtq2ZK7btmKYELZtruC2ba7htm2u4rZtruW2ba7dtm2u37Ztrum2YpgWtnUAtlmu6rZ3mBK2eCe2eMAAi722eii2eCm2eK7rtniu7bZ4ru+2eK7xtneYELaBI7Z3mBa2gwC2WZ+jtoWYEraGqj+2hq7ztoau9LaGrvW2hq72toaCHraGrve2hquytoau+LaGwACLvbaQrvm2kK77tpCu/LaQrv22kK7/tpCvALaQrwG2kK8CtpCvA7aQrwS2kK8FtpCvBraQrwi2kK8Jtoau+raGrv62hqyUtoaf0baGrJm2hqiHtoavB7aGrwq2hq8LtoWYE7aon7C2qK8MtqiTU7aorI62qJ/Otqif1Laorw62qK8PtqivEbaorxO2qK8VtqivGbaorxq2qK8ctqivHraomKe2qK80tqivK7aFmBC2u68gtruvIba7n/G2u6ACtruf8La7oB22u68struvNba7oBK2u683truf6La7oB62u6AVtrugBLa7rz22u8AAi722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mBa6UQC4HrFXulOYErpUwACLxLpVsVi6VLFZulSxWrpTmBC6WbD/ulmxALpZsVu6U5gWul0AuB6xXLpfmBK6YLFdumCf7Lpgq9e6YJMNul+YELplI7plsQS6ZbFhumWxCbplsQi6ZbEMul+YE7pshDy6bJJEul+YFrpvALgesWK6cZgSunKSRLpxmBC6dJQOunGYFrp2ALgesWO6eJgSunmSRLp4mBC6eyO6e5QOuniYFrp+ALgesWW6gJgQuoEjuoCYFrqDALgesWe6hZgQuoaUDrqGsP+6hiO6hZgTuoqxaLqKkkS6hZgWuo0AuB6xarqPmBK6kLFruo+YELqSlA66kiO6j5gTupWSRLqPmBa6lwC4HrFuupmYErqakw26mpJEupqxb7qasVK6mZgQup+w/7qflA66n7EJup8jupmYFrqkALgesXG6ppgSuqexcrqnhEG6p5/suqaYE7qrhDy6q4CKuqaYELqusQS6rrFhuq4juq6UDrqmmBa6swC4HrF0urWYELq2I7q2lA66tZgWurkAuB6xdrq7mBC6vCO6vJQOuruYFrq/ALgesXi6wZgSusKTDbrBmBO6xIQ8usGYFrrGALgesXm6yJgSusmm37rImBC6y6zeusuw/7rLsQS6y7EFusuUDrrLsQm6y7EIusuxDLrLI7rImBO61bF+usiYFrrXALgesYG62ZgQutqw/7rasQS62rEFutqUDrrasSG62iO62ZgTuuGAirrZmBa64wC4HrGDuuWYErrmpt+65ZgTuuiEPLrlmBC66rD/uuqxBLrqsQW66pQOuuqxCbrqsQi66rEMuuojuuWYFrrzALgesYW69ZgSuvaxhrr2sYe69rGIuvaTDbr2sYm69rGKuvWYE7r9hDy6/bGOuv2xj7r9sZC6/YCKuvWYELsDsP+7A7EEuwOxBbsDlA67A7EhuwMjuvWYFrsKwACLxLsLgKi7CrGLuwqxjLsKsY24HrGSuxCYErsRkku7EJgTuxOEPLsQmBa7FQC4HrGTuxeYELsYlA67F5gTuxqdj7sXmBa7HAC4HrGUux6YELsflA67H7Ehux6YE7sinY+7IoCKux6YFrslALgesZW7J5gTuyixlrsor7G7J5gQuyuw/7snmBa7LQC4HrGXuy+YErswsZi7MLGWuzCvsbswsZm7MLGauy+YELs2lA67NrEhuzaw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8ZgWwABD9QDAAEOltR7AAEP3mBLAAEP4J8AAQ/jAAIvPwABD+ijAAEP4KcAAQ/iUmMAAQ/idQMAAQ/iaOsAAQ/ioIsAAQ/eYEMAARAEjwABD95gWwABEAwDAAEOltSPAAEQFmBLAAEQGmTzAAEQFmBDAAEQImcnAAEQItSXAAEQFmBbAAEQLAMAAQ6W1JsAARA2YE8AARA6a7cAARA6VC8AARA6VoMAARA6h/8AARA2YEMAARBOZ08AARBOZxsAARBO1KMAARBOl1MAARBPAAIvQwABEGLUpwABEGLUswABEGLUrwABEGLUqwABEDZgWwABEHbUnwABDpbU7wABEH5gSwABEIIQrwABEH5gTwABEIpsNwABEIprtwABEIprvwABEIpsLwABEIpULwABEIpWgwABEIqH/wABEH5gQwABEKrU8wABEKrU9wABEKpnOwABEKpUNwABEKpWdwABEKpnTwABEKpnGwABEH5gWwABEMgAAwACL0cAARDSjCcAARDWYEsAARDaSW8AARDa1R8AARDWYEMAARDmUDsAARDmVEMAARDmUD8AARDWYFsAARD0AAMAAi9LAAEQ/nSLAAERAmBLAAERBp5bAAERAmBPAAERDmTzAAERDgdPAAERDo6bAAERDnRPAAERDtUvAAERDoz/AAERAmBDAAERKtUrAAERKtUzAAERKtU3AAERKo6vAAERKnWvAAERKnVLAAERKtVXAAERKpCHAAERKnU3AAERKtVjAAERKtVvAAERKtVzAAERKnVTAAERKnVXAAERKtW7AAERKtW/AAERKtXHAAERKtXPAAERKtXTAAERKnVfAAERKwACL0sAARF+1fcAARF+1fsAARF+1h8AARF+1icAAREq1YMAAREq1YcAAREq1YsAAREq1gsAAREqkKcAAREqkKsAAREqoAMAAREq1m8AAREq1ncAAREq1nsAAREq1ocAAREq1osAAREqdVsAAREqddMAARECYFsAARHIAAMAAi9PAAER0owrAAER1mBLAAER2p9bAAER2lR3AAER2lVXAAER2laDAAER2puTAAER1mBXAAER8AMAARHWYE8AARH6Uh8AARHWYEMAARIC1TcAARICe8cAARIC1ncAARHWYFsAARISSQwDAAIvUwABEhp0jwABEh5gSwABEiJREwABEiJHwwABEiIIXwABEh5gUwABEjJJFwABEh5gTwABEjrW5wABEjoHTwABEjrW9wABEh5gQwABEkp7xwABEkqOuwABEh5gWwABElQAAwACL1cAARJejC8AARJiYEsAARJmdZsAARJiYE8AARJuB08AARJiYEMAARJ2e8cAARJ2dd8AARJ21wcAARJ2oFcAARJiYFsAARKIAAMAAi9bAAESkowzAAESlmBDAAESmnvHAAESmo6vAAESmnWvAAESmqE7AAESmnXfAAESlmBbAAESsAADAAIvXwABErqMNwABEr5gSwABEsCLAAESwgefAAESwtcnAAESvmBPAAES0gdPAAESvmBDAAES2tU3AAES2tUrAAESvmBbAAES5AADAAIvYwABEu6MOwABEvJgSwABEvbW9wABEvaODwABEvJgQwABEwJ7xwABEwKOrwABEwJ1rwABEwKhOwABEwJ13wABEvJgWwABExgAAwACL2cAARMidJcAARMmYEMAARMqoTsAARMq1zMAARMqe8cAARMqjq8AARMqda8AARMq1B8AARMqdd8AARMmYFsAARNIAAMAAi9rAAETUow/AAETVmBLAAETWkejAAETWp+zAAETVmBbAAETZAADAAIvbwABE26MRwABE3JgSwABE3afMwABE3ZJPwABE3bXRwABE3JgTwABE4aeWwABE4ZJMwABE4ZXdwABE3JgUwABE5ZJMwABE3JgQwABE57VZwABE57XTwABE557xwABE56f0wABE57XYwABE57XZwABE3JgWwABE7gDAAETbnSbAAETwmBLAAETxhDDAAETxp8vAAETxtdrAAETxp5bAAETwmBPAAET2nRPAAET2ghzAAET2tdTAAET2kkzAAET2tdzAAET2gdPAAETwmBTAAET9tdTAAETwmBDAAET/nvHAAET/o7HAAET/p/TAAET/qADAAETwmBbAAEUEAMAARNujEMAARQaYEsAARQeYUMAARQeny8AARQe13cAARQe13sAARQe138AARQenlsAARQaYE8AARQ6dE8AARQ6UrMAARQ6ERcAARQ611MAARQ6CHMAARQ6jbsAARQ613MAARQ6B08AARQaYEMAARRee8cAARRe108AARRe14cAARRe15MAARRejscAARRen9MAARReoAMAARQaYFsAARR8AwABE26MSwABFIZgSwABFIqfPwABFIpJEwABFIZgTwABFJZJMwABFIZgQwABFJ7VZwABFJ57xwABFJ6OxwABFIZgWwABFKwAAwACL3MAARS2YEsAARS616cAARS2jE8AARTCYEsAARTGB08AARTGUbsAARTCYEMAARTSe8cAARTS16MAARTS1SsAARTS1TMAARTS1TcAARTCYE8AARTq1S8AARTCYFsAARTwAAMAAi93AAEU+oxTAAEU/mBDAAEVAnvHAAEVAo6vAAEVAnWvAAEU/mBbAAEVEAADAAIvewABFRqMVwABFR5gSwABFSLXswABFSKeWwABFR5gTwABFS50TwABFS4DPwABFS4HTwABFS4OJwABFR5gQwABFULVNwABFULVKwABFULXuwABFUKf1wABFUKgAwABFUJ13wABFUEHAAEVQte/AAEVHmBbAAEVZAMAARVm17QDAAIvfwABFXKMWwABFXZgSwABFXpJRwABFXoQYwABFXpJLwABFXZgTwABFYoQXwABFYqOdwABFYoPiwABFYoPgwABFYoHTwABFYqM/wABFXZgWwABFaQAAwACL4MAARWujF8AARWyYEsAARW2SUcAARW218sAARW2EF8AARW2n68AARWyYE8AARXKEGMAARXKjP8AARWyYEMAARXW188AARXW19cAARWyYFsAARXgAAMAAi+HAAEV6tffAAEV7mBDAAEV8o4jAAEV7mBbAAEV+AMAARXqjGMAARYCYEsAARYGAsMAARYGjicAARYGEF8AARYGEGMAARYCYE8AARYaSUcAARYajP8AARYCYFsAARYkAAMAAi+LAAEWLmBDAAEWMox8AwACL48AARY6Bl8AARY+YEsAARZCEssAARY+YEMAARZKR6cAARZKR2sAARY+YFsAARZUAAMAAi+TAAEWXmBDAAEWYo2/AAEWYne/AAEWYtkfAAEWXozTAAEWcmBLAAEWdmTzAAEWcmBPAAEWfo4PAAEWfhBjAAEWflIbAAEWfo6bAAEWftUvAAEWflJvAAEWflIfAAEWfnUDAAEWcmBDAAEWolD/AAEWotUzAAEWcmBTAAEWrlIfAAEWcmBbAAEWtAADAAIvlwABFr6M1wABFsJgTwABFsZHwwABFsbVLwABFsYIXwABFsJgQwABFtbXowABFtbVMwABFsJgWwABFuAAAwACL5sAARbqjR8AARbuYEsAARbyR5MAARbuYEMAARb6XV8AARb6V88AARb6V9MAARb6V9sAARb6V+MAARb6V/MAARb6WAsAARb6WEMAARb6WC8AARbuYFsAARcgAAMAAi+fAAEXKmBLAAEXLo2bAAEXLo2fAAEXLtmTAAEXLo2jAAEXLo2nAAEXLo2rAAEXLp5DAAEXLp4/AAEXLp43AAEXLp47AAEXLp4zAAEXLtmXAAEXLtlDAAEXLtlLAAEXLtlTAAEXLtlbAAEXLtljAAEXLtlrAAEXLtlzAAEXKtk/AAEXfmBLAAEXgJ8AAReDAAIvnwABF4ijAAEXgKcAAReC2UMAAReC2UsAAReC2VMAAReC2VsAAReC2WMAAReC2WsAAReC2XMAARd+YEMAARewjwABF35gWwABF7gDAAEXKtl7AAEXwmBLAAEXxghzAAEXxq9fAAEXwmBXAAEX0m63AAEXwmBDAAEX2I8AARfaCyMAARfa2YsAARfCYFsAARfoAAMAAi+jAAEX8mBDAAEX9wACL6MAARf62asAARfyjtcAARgCYEMAARgGkGsAARgCYFsAARgMAwABF/LZnwABGBZgQwABGBrZowABGBZgWwABGCADAAEX8pW/AAEYKmBLAAEYLklvAAEYKmBDAAEYNI8AARgqYFsAARg8AwABF/KVwwABGEZgSwABGEoIXwABGEZgQwABGFCPAAEYRmBbAAEYWAMAARfylccAARhiYEsAARhmVCMAARhiYEMAARhsjwABGGJgWwABGHQDAAEX8tmnAAEYfmBLAAEYggIrAAEYfmBDAAEYiI8AARh+YFsAARiQAAMAAi+nAAEYmo7bAAEYnmBLAAEYoo+zAAEYoo+7AAEYolFLAAEYohBfAAEYnmBPAAEYthBjAAEYnmBDAAEYvo+/AAEYnmBbAAEYxAADAAIvqwABGM5gQwABGNLZwwABGM6O3wABGNpgSwABGN4Q0wABGN4Q1wABGN6fkwABGN5lxwABGN4LewABGN5RSwABGN6gxwABGN4QXwABGN6g3wABGN6fgwABGNpgTwABGQoQYwABGNpgQwABGRKhIwABGNpgWwABGRgAAwACL68AARkiYEsAARkm5G8AARkm5HMAARkiYEMAARkylgMAARkyjbMAARky5HsAARky5IMAARkijusAARlGYEsAARlKECcAARlKSW8AARlK2o8AARlKEK8AARlKEKsAARlKUrMAARlK2pMAARlKEN8AARlK2pcAARlK2psAARlKAoMAARlLAAIvrwABGXqXswABGUqZlwABGUoHgwABGUranwABGUraowABGUrapwABGUraqwABGUrarwABGUqULwABGUrW/wABGUqQ4wABGUqQ3wABGUraswABGUratwABGUp16wABGUrauwABGUravwABGUrawwABGUp2QwABGUraxwABGUraywABGUrazwABGUZgTwABGdba4wABGdba5wABGdZZFwABGdba6wABGUZgQwABGeq7BwABGera7wABGera9wABGera/wABGera8wABGera+wABGerbCwABGerbDwABGerbEwABGerbHwABGerbIwABGerbKwABGerbLwABGerbOwABGeqUewABGerbQwABGerbRwABGerbTwABGerbVwABGerbfwABGerbhwABGerbmwABGerbowABGerbtwABGerbuwABGerbwwABGerb0wABGerb2wABGerb3wABGerb5wABGerb6wABGesAAi+vAAEaatv3AAEZ6tv7AAEZ6tuvAAEZ6tuzAAEZ6txXAAEZ6o+HAAEZ6tbzAAEZ6twnAAEZ6tyDAAEZ6tyHAAEZ6tyTAAEZ6tyfAAEZ6tynAAEZ6ty/AAEZ6tzLAAEZ6tzPAAEZ6tzXAAEZ6tzfAAEZ6tznAAEZ6tzzAAEZ6t0TAAEZ6tz/AAEZ6t0DAAEZ6t0HAAEZ6tz7AAEZ6pUPAAEZ6txLAAEZ6t07AAEZ6t0/AAEZ6t1DAAEZ6t1TAAEZ6t1XAAEZ6qf/AAEZ6t1jAAEZ6t1zAAEZ6t2XAAEZ6t2jAAEZ6t2nAAEZ6t2vAAEZ6t3DAAEZ6t3XAAEZ6t3fAAEZ6t3rAAEZ6t3/AAEZ6t4LAAEZ6t4TAAEZ6t4jAAEZ6t4rAAEZ6t4zAAEZ6t5PAAEZ6t5jAAEZ6t5bAAEZ6t5rAAEZ6t5vAAEZ6t5zAAEZ6t57AAEZ6t6DAAEZ6t6HAAEZ6t6TAAEZ6t6XAAEZ6t6bAAEZ6t6jAAEZ6t63AAEZ6t67AAEZ6t7LAAEZ6t7TAAEZ6t7bAAEZ6t7jAAEZ6t73AAEZ6t8fAAEZ6t8/AAEZ6t9HAAEZ6t9TAAEZ6t9vAAEZ6t9/AAEZ6t+XAAEZ6t+jAAEZ6t+vAAEZ6t+TAAEZ6t+7AAEZ6t/HAAEZ6t/LAAEZ6t/jAAEZ6t/vAAEZ6uAHAAEZ6txjAAEZ6uATAAEZ6uAfAAEZ6uAnAAEZ6uAzAAEZ6uBPAAEZ6uBbAAEZ6uBfAAEZ6uBrAAEZ6uB3AAEZ6uB7AAEZ6uCTAAEZ6uCbAAEZ6uCfAAEZ6uCnAAEZ6uCrAAEZ6uC3AAEZ6uC/AAEZ6uDHAAEZ6uDLAAEZ6uDfAAEZ6uDjAAEZ6uDrAAEZ6uEXAAEZ6uE3AAEZ6uFHAAEZ6uFPAAEZ6uFTAAEZ6uFfAAEZ6uFnAAEZ6ttjAAEZ6txPAAEZ6tx/AAEZ6uF/AAEZ6uGDAAEZ6uGLAAEZ6uGPAAEZ6uGTAAEZ6uGXAAEZ6uGbAAEZ6ttnAAEZ6uGvAAEZ6uG3AAEZ6uG7AAEZ6uG/AAEZ6uHDAAEZ6uHHAAEZ6uHLAAEZ6uHXAAEZ6uHjAAEZ6uHzAAEZ6uH7AAEZ6uIDAAEZ6uIHAAEZ6uIPAAEZ6uIXAAEZ6uIfAAEZ6uIjAAEZ6uInAAEZ6uIrAAEZ6uIzAAEZ6uI3AAEZ6uJLAAEZ6uJPAAEZ6uJXAAEZ6uJbAAEZ6uJvAAEZ6uJzAAEZ6uJ7AAEZ6uKLAAEZ6uKbAAEZ6uKfAAEZ6uKjAAEZ6uKzAAEZ6uK7AAEZ6uLDAAEZ6uLLAAEZ6uLPAAEZ6uLfAAEZ6uLnAAEZ6uLvAAEZ6uL3AAEZ6uL/AAEZ6uMTAAEZ6uMfAAEZ6uMnAAEZ6uNLAAEZ6uNbAAEZ6uNjAAEZ6uN/AAEZ6uOHAAEZ6uObAAEZ6uOrAAEZ6uPPAAEZ6uPTAAEZ6uPXAAEZ6uPfAAEZ6uPnAAEZ6uPvAAEZ6uP3AAEZ6ptfAAEZ6tt7AAEZ6ts/AAEZ6uN7AAEZ6tw/AAEZ6t4bAAEZ6ts3AAEZ6tePAAEZ6uP7AAEZ6uP/AAEZ6tvLAAEZ6tvvAAEZ6uQLAAEZ6uQTAAEZ6uQXAAEZ6uQfAAEZ6uQjAAEZ6tw7AAEZ6uQrAAEZ6tzHAAEZ6nTjAAEZ6t1HAAEZ6uAPAAEZ6ttTAAEZ6uQ3AAEZ6uQ7AAEZ6t4nAAEZ6uJHAAEZ6turAAEZ6ty3AAEZ6tw3AAEZ6pp3AAEZ6ptbAAEZ6ppnAAEZ6pprAAEZ6pp7AAEZ6pp/AAEZRmBbAAEd5AMAAR3m2tsAAR3m2t8AARkiSa8AAR32YEsAAR36PMcAAR36EF8AAR32YE8AAR4GAsMAAR32YEMAAR4MjwABHfZgWwABHhQDAAEZIuRTAAEeHmBLAAEeIsTrAAEeIghzAAEeItb/AAEeIklHAAEeIhBfAAEeHmBPAAEeOhBjAAEeOuOTAAEeOuPDAAEeOuO7AAEeOt8rAAEeOoz/AAEeHmBDAAEeVuOjAAEeVuPLAAEeVuO/AAEeVt87AAEeVt8zAAEeVuNvAAEeHmBbAAEecAMAARki5FsAAR56YEsAAR5+SUcAAR5+3qsAAR5+3rMAAR5+1v8AAR5+EF8AAR56YE8AAR6WEGMAAR6W3ysAAR6WxOsAAR6WCHMAAR6W45MAAR6W48MAAR6W47sAAR6WjP8AAR56YEMAAR6646MAAR6648sAAR66478AAR663zsAAR663zMAAR66428AAR56YFsAAR7UAwABGSLgzwABHt5gSwABHuJ7wwABHuIQXwABHuFrAAEe4gKDAAEe3mBDAAEe9uI/AAEe9uAbAAEe9txnAAEe9I8AAR7eYFsAAR8IAwABGSLivwABHxJgSwABHxYCwwABHxYQXwABHxJgQwABHyCPAAEfEmBbAAEfKAADAAIvswABHzKO7wABHzZgSwABHzoQqwABHzpZFwABHzrkjwABHzrkkwABHzrklwABHzpsOwABHzqSZwABHzrkmwABHzqaiwABHzrknwABHzrkowABHzZgQwABH2sAAi+zAAEfbuSrAAEfbuSvAAEfbuS3AAEfbuSzAAEfbuS/AAEfbuTDAAEfbuTHAAEfbuS7AAEfbuTvAAEfbuTrAAEfbuT3AAEfbuT7AAEfbuT/AAEfbuTzAAEfalYnAAEfalYvAAEfalY7AAEfNmBbAAEftAADAAIvtwABH76O8wABH8JgSwABH8YQqwABH8ZULwABH8bkkwABH8blFwABH8blGwABH8aQ5wABH8JgQwABH+MAAi+3AAEf5uSrAAEf5uUfAAEf5uUjAAEf4lYvAAEfwmBbAAEf+AADAAIvuwABIAKO9wABIAZgSwABIArlRwABIAZgQwABIBLcawABIBLlTwABIBLlSwABIBLlXwABIBLlZwABIBLlcwABIAZgWwABICwAAwACL78AASA2YEMAASA6CxcAASA25YcAASBCYEsAASBG5YsAASBCYEMAASBO3wcAASBCYFsAASBUAAMAAi/DAAEgXuWfAAEgYmBLAAEgZwACL8MAASBq5aMAASBq5acAASBq5asAASBqfa8AASBq5a8AASBq5bMAASBq5bcAASBiYE8AASCLAAIvwwABIIyjAAEgjuW7AAEgYmBDAAEgmuW/AAEgmwACL8MAASCi5csAASBiYFsAASCoAwABIF7l5wABILJgSwABILcAAi/DAAEguuWjAAEguuWrAAEgun2vAAEguuWvAAEgurDXAAEguuXrAAEguuXvAAEgsmBDAAEg2paLAAEg2ZcAASDbAAIvwwABIObl9wABIObmGwABIObmAwABIObl8wABIObmIwABIOYNMwABIObl/wABIObmfwABINrmcwABINrmdwABINrmewABILJgWwABIRQDAAEgXo8HAAEhHmBLAAEhIwACL8MAASEm5oMAASEm5jsAASEm5j8AASEeYE8AASE2kLsAASEeYEMAASE+5dMAASE/AAIvwwABIUbmhwABIUbmxwABIUbm4wABIUbm1wABIUbl4wABIUbm9wABIUbm+wABIT7mlwABIT6WmwABIT6QywABIT7mewABIT7m6wABIT7m7wABIR5gWwABIXwDAAEgXub/AAEhhmBLAAEhiwACL8MAASGO5dcAASGGYE8AASGWUrcAASGGYEMAASGe5wMAASGGYFsAASGkAwABIF7nBwABIa5gSwABIbMAAi/DAAEhtuXXAAEhrmBPAAEhvlNzAAEhrmBbAAEhxon/AAEhxmcvAAEgXucLAAEh0mBLAAEh1wACL8MAASHa5dcAASHSYE8AASHiD5cAASHiUusAASHiCF8AASHSYFMAASHyD5cAASHyUusAASHSYFsAASH8AAMAAi/HAAEiBo8LAAEiCmBLAAEiDhAnAAEiDhCvAAEiDhCrAAEiDhDfAAEiDtqXAAEiDo8jAAEiDucbAAEiDo9zAAEiDlJXAAEiDucfAAEiDlmzAAEiDgKDAAEiCmBDAAEiQtt/AAEiQttXAAEiQucnAAEiQuc3AAEiQuc/AAEiQudHAAEiQudPAAEiQudXAAEiQt/vAAEiQudjAAEiQudrAAEiQud3AAEiQud/AAEiQuHzAAEiQuH7AAEiQt5vAAEiQt5zAAEiQuPnAAEiQuDLAAEiQueHAAEiQuATAAEiQuePAAEiQtubAAEiQt9HAAEiQuezAAEiQufLAAEiQtuHAAEiQuAfAAEiQtvTAAEiQtvfAAEiQt2XAAEiQufTAAEiQt2jAAEiQt2nAAEiQt2vAAEiQt3DAAEiQt3XAAEiQt3fAAEiQufbAAEiQufnAAEiQuf3AAEiQuf/AAEiQugLAAEiQugTAAEiQugbAAEiQugnAAEiQugzAAEiQug7AAEiQuhPAAEiQuhfAAEiQuhjAAEiQuhrAAEiQuPPAAEiQuPXAAEiQuPfAAEiQuFnAAEiQuhzAAEiQuiDAAEiQuiHAAEiQuiPAAEiQuiXAAEiQuifAAEiQo+DAAEiQufDAAEiQuh/AAEiQuevAAEiQui7AAEiQtu3AAEiQuL/AAEiQujDAAEiQujLAAEiQujTAAEiQujXAAEiQujfAAEiQujnAAEiQujvAAEiQukDAAEiQukTAAEiQukXAAEiQukfAAEiQufHAAEiQui3AAEiQuefAAEiQqf/AAEiQukzAAEiQuk3AAEiQnTjAAEiQttTAAEiQuejAAEiQuerAAEiQulHAAEiQulLAAEiCmBbAAEjtAADAAIvywABI76PDwABI8JgQwABI8bpUwABI8JgWwABI8wAAwACL88AASPW6V8AASPaYEsAASPcnwABI98AAi/PAAEj5KMAASPcpwABI97ZQwABI97pZwABI94GzwABI9pgQwABI/yPAAEj2mBbAAEkBAMAASPWjxMAASQOYEsAASQSECcAASQSEN8AASQS2pcAASQS2uMAASQS6XMAASQSn4sAASQSnzMAASQOYE8AASQyAoMAASQOYEMAASQ66XcAASQ66XsAASQ621cAASQ6238AASQ65zcAASQ66CcAASQ66BsAASQ66DMAASQ66GMAASQ66DsAASQ66E8AASQ65/cAASQ65+cAASQ659sAASQ66F8AASQ66GsAASQ65/8AASQ66AsAASQ63WMAASQ66Z8AASQ63acAASQ63a8AASQ63cMAASQ63d8AASQ66BMAASQ63ZcAASQ659MAASQ66bMAASQ66MsAASQ66MMAASQ66NMAASQ66bsAASQ66b8AASQ66csAASQ66c8AASQ66dMAASQ66dsAASQ66N8AASQ66d8AASQ66OcAASQ66e8AASQ66fMAASQ657MAASQ66IcAASQ66I8AASQ66JcAASQ658sAASQ66gMAASQ66gsAASQ66J8AASQ652sAASQ66QMAASQ64fMAASQ64fsAASQ63dcAASQ63+MAASQ63+8AASQ652MAASQ64+cAASQ64B8AASQ64HcAASQ64HsAASQ64KcAASQ64KsAASQ64LcAASQ64L8AASQ64JMAASQ64MsAASQ654cAASQ64v8AASQ66O8AASQ66iMAASQ64AcAASQ64JsAASQ64BMAASQ64J8AASQ6548AASQ624cAASQ625sAASQ66icAASQ6488AASQ649MAASQ649cAASQ6498AASQ65ycAASQ64WcAASQ66jsAASQ66HMAASQ66IMAASQ63m8AASQ63nMAASQ6298AASQ629MAASQ66LsAASQ627cAASQ653cAASQ6538AASQ66kcAASQ66k8AASQ66NcAASQ630cAASQ6dOMAASQ66UsAASQ66lMAASQ621MAASQOYFsAASXgAAMAAi/TAAEl6mBDAAEl7pYLAAEl7torAAEl7tonAAEl6uSLAAEl/mBDAAEmAlQfAAEmAlA7AAEmAlRDAAEl6uprAAEmEmBDAAEmFlQfAAEmFlA7AAEmFlRDAAEmEmBbAAEmJAMAASXqNmcAASYuYEsAASYySR8AASYykkcAASYyiAMAASYuYEMAASZCUD8AASZCUFMAASYuYFsAASZMAwABJerqbwABJlZgQwABJlpUHwABJlpQOwABJlpUQwABJlZgWwABJmgDAAEl6pEPAAEmcmBLAAEmdlU/AAEmdgTzAAEmdlVDAAEmcmBDAAEmhlA/AAEmhlBTAAEmcmBbAAEmkAMAASXq6nMAASaaYEMAASaeVB8AASaeUDsAASaeVEMAASaaYFsAASasAwABJeqRBwABJrZgSwABJrpW6wABJrpVPwABJrpW7wABJrpJMwABJrZgQwABJs5QPwABJs5QUwABJrZgWwABJtgDAAEl6up3AAEm4mBDAAEm5lQfAAEm5lA7AAEm5lRDAAEm4mBbAAEm9AMAASXqkQsAASb+YEsAAScCSS8AAScCDlMAAScCmu8AAScCSTMAAScCdaMAAScCVv8AASb+YEMAASceUD8AASceUFMAASb+YFsAAScoAwABJeqWBwABJzJgTwABJzYOWwABJzYCKwABJzJgUwABJ0IOWwABJ0ICKwABJzJgQwABJ05QOwABJerqjwABJ1ZgTwABJ1oOWwABJ1oCKwABJ1ZgUwABJ2YOWwABJ2YCKwABJ1ZgQwABJ3JQOwABJ1ZgWwABJ3gDAAEl6pEfAAEngmBLAAEnhkkfAAEnhpJHAAEnhpvfAAEngmBDAAEnllA/AAEnllBTAAEngmBbAAEnoAMAASXq6pMAASeqYE8AASeuDlsAASeuAisAASeqYFMAASe6DlsAASe6AisAASeqYEMAASfGUDsAASeqYFsAASfMAwABJeqRGwABJ9ZgSwABJ9pVPwABJ9oE8wABJ9pVQwABJ9ZgQwABJ+pQPwABJ+pQUwABJ9ZgWwABJ/QDAAEl6uqXAAEn/mBPAAEoAg5bAAEoAgIrAAEn/mBTAAEoDg5bAAEoDgIrAAEn/mBDAAEoGlA7AAEn/mBbAAEoIAMAASXqkRMAASgqYEsAASguVusAASguVT8AASguVu8AASguSTMAASgqYEMAAShCUD8AAShCUFMAASgqYFsAAShMAwABJerqmwABKFZgTwABKFoOWwABKFoCKwABKFZgUwABKGYOWwABKGYCKwABKFZgQwABKHJQOwABKFZgWwABKHgDAAEl6pEXAAEogmBLAAEohkkvAAEohg5TAAEohprvAAEohkkzAAEohnWjAAEohlb/AAEogmBDAAEoolA/AAEoolBTAAEogmBbAAEorAADAAIv1wABKLaVywABKLpgTwABKL4QqwABKL4CgwABKLpgUwABKMqQ3wABKLpgQwABKNKbXwABKNLhfwABKNJ04wABKNLbewABKNLcNwABKNKbWwABKLpgWwABKOwAAwACL9sAASj25Y8AASj6YEsAASj/AAIv2wABKQLmgwABKQLlswABKP5REwABKPpgQwABKRLlvwABKRCPAAEo+mBbAAEpHAMAASj2lc8AASkmYEsAASkq6p8AASkrAAIv2wABKTLqowABKSZgQwABKTpdXwABKTpYCwABKTpX8wABKTpYLwABKTpYQwABKSZgWwABKVADAAEo9pXTAAEpWmBLAAEpXwACL9sAASli6qcAASli6qsAASli6q8AASli6rMAASlaYE8AASl25c8AASlaYEMAASl9lwABKX7lvwABKVpgWwABKYgDAAEo9pXXAAEpkmBLAAEplpdnAAEplhCrAAEplpC7AAEplpCLAAEpluq7AAEplpqvAAEplpqrAAEplo8nAAEpkmBDAAEpupmHAAEpupmLAAEpupmPAAEpupDDAAEpupDTAAEpupqzAAEpupC3AAEputbrAAEpuuq/AAEpkmBbAAEp4AADAAIv3wABKepgQwABKe7lkwABKe7sPwABKe7sQwABKerqzwABKf5gSwABKgJW/wABKgKcZwABKgKcawABKgLq0wABKgMAAi/fAAEqFurXAAEqFurbAAEqAurfAAEqAurjAAEqAurnAAEp/mBXAAEqLAMAASn+YEMAASo26vMAASo2nG8AASo2nLsAASo26w8AASo3AAIv3wABKkrrBwABKf5gWwABKlMAAi/fAAEqVgKjAAEp6usXAAEqXmBLAAEqYJ8AASpjAAIv3wABKmijAAEqYKcAASpiEUcAASpi6x8AASpi6ycAASpeYEMAASqAjwABKl5gWwABKogDAAEp6pXfAAEqkmBLAAEqlhCrAAEqlwACL98AASqeTMsAASqSYFcAASqkAwABKpJgTwABKq4QJwABKq6ZlwABKq6QiwABKq4CgwABKpJgQwABKsLbpwABKsLcDwABKsKZqwABKsLbSwABKsKbKwABKsLcCwABKpJgWwABKt6ZmwABKeqV4wABKuZgSwABKurrLwABKuqXvwABKuoCgwABKuoRGwABKuqXZwABKuqPJwABKuqQiwABKupRuwABKuoQJwABKurrMwABKuqW+wABKuqcYwABKurrNwABKurrOwABKuZgQwABKyaapwABKyacxwABKyabVwABKyabfwABKyaXKwABKyazTwABKybrawABKyaXBwABKyacVwABKyaY5wABKyaXGwABKyaXHwABKybrCwABKyaZnwABKybrkwABKyabDwABKybq7wABKyaXOwABKyacWwABKyacowABKyaXIwABKybbpwABKyaZpwABKybcDwABKyaavwABKyabJwABKybbSwABKyabKwABKyacQwABKybcCwABKyacSwABKybrDwABKyaZswABKyacdwABKybr5wABKyaXMwABKyaa+wABKyaaowABKybrEwABKyaa8wABKycAAi/fAAEryuuvAAEryutzAAEryutjAAEryutTAAEq5mBPAAEr3pmXAAEq5mBbAAEr5pmbAAEp6mbzAAEr7mBLAAEr8hCrAAEr8tSTAAEr7mBDAAEr/mcnAAEr/tSXAAEr/uwLAAEr/mb3AAEr7mBbAAEsEAMAASnqldsAASwaYEsAASweSR8AASweCF8AASwaYFsAASwoAAMAAi/jAAEsMpXnAAEsNmBLAAEsOwACL+MAASw+TMsAASw2YFcAASxEAwABLEbsRwABLDZgTwABLFLdjwABLDZgQwABLFqctwABLFreLwABLFrc7wABLFrgVwABLFreRwABLFrdIwABLFrb/wABLFrdiwABLFrgRwABLFrsSwABLDZgWwABLIaZmwABLDLsTwABLI5gTwABLJLdjwABLI5gQwABLJqctwABLJreLwABLJrc7wABLJrgVwABLJreRwABLJrdIwABLJrb/wABLJrdiwABLJrgRwABLJrsSwABLI5gWwABLMaZmwABLDKV6wABLM5gSwABLNKQiwABLNMAAi/jAAEs2uxTAAEs2uxXAAEs2uxbAAEs2uxfAAEs2uxjAAEs2uxnAAEs2uxrAAEs2uxvAAEszmBPAAEs/t2PAAEszmBDAAEtBpy3AAEtBttTAAEtBt4vAAEtBtzvAAEtBuBXAAEtBt5HAAEtBt0jAAEtBtv/AAEtBt2LAAEtBpnDAAEtBuBHAAEtBpnLAAEtBuxLAAEtBpnXAAEtBpnbAAEtBpnjAAEtBpnrAAEtBwACL+MAAS1O7J8AAS1O7IsAAS1O7IMAAS1O7JMAAS1O7LsAAS1O7JcAASzOYFsAAS1qmZsAAS1rAAIv4wABLXICowABLDKV7wABLXpgSwABLX5JLwABLX5u+wABLX7sqwABLX7srwABLX7W/wABLX8AAi/jAAEtluzbAAEtluzfAAEtemBDAAEtowACL+MAAS2m7HMAAS2m7OcAAS2m7OsAAS16YFsAAS20AwABLDKV8wABLb5gSwABLcMAAi/jAAEtxuzvAAEtxuyPAAEtvmBDAAEt0uz3AAEtvmBbAAEt2AMAAS3bAAIv4wABLeLs8wABLDLs+wABLepgSwABLe7sewABLe7sdwABLepgWwABLfgDAAEsMuz/AAEuAmBLAAEuBsinAAEuAmBDAAEuDI8AAS4PAAIv4wABLhbscwABLgJgWwABLhwDAAEsMu0XAAEuJmBLAAEuKsnDAAEuKuybAAEuJmBbAAEuNAMAASwy7RsAAS4+YEMAAS5AjwABLkMAAi/jAAEuSuxzAAEuPmBbAAEuUAMAASwy7SMAAS5aYFsAAS5cAAMAAi/nAAEuZmBDAAEuapX3AAEuau07AAEuZu0nAAEudmBLAAEuelQvAAEueu0rAAEudmBDAAEuhlgLAAEuhlfzAAEuhncfAAEuhgiPAAEudmBbAAEumAADAAIv6wABLqJgQwABLqblmwABLqbllwABLqaV/wABLqLTQwABLrZgSwABLrpYEwABLrpYFwABLrZgQwABLsZ13wABLsSPAAEutmBbAAEu0AMAAS7TAAIv6wABLtoCowABLqLtQwABLuJgTwABLuZrtwABLuZULwABLuZWgwABLuaH/wABLuJgQwABLvpnTwABLvpnGwABLvrUowABLvqXUwABLvsAAi9DAAEvDtSnAAEvDtSzAAEvDtSvAAEvDtSrAAEu4mBbAAEvIAMAAS6ilfsAAS8qYE8AAS8ua7cAAS8qYEMAAS82ZxsAAS821PMAAS821PcAAS82VKcAAS82m6MAAS827VcAAS827U8AAS82Z08AAS82mp8AAS82lw8AAS82iBcAAS827XcAAS827XMAAS83AAIv6wABL27tawABL27tZwABLypgWwABL3gDAAEuourLAAEvgmBLAAEvhwACL+sAAS+K7YMAAS+CYEMAAS+SfF8AAS+CYFsAAS+YAAMAAi/vAAEvopYPAAEvpmBDAAEvqlA7AAEvqlRDAAEvqlA/AAEvpmBbAAEvuAADAAIv8wABL8JgQwABL8aWEwABL8bvnwABL8bahwABL8bvowABL8bvpwABL8bvqwABL8LtwwABL+JgTwABL+aW+wABL+Y8xwABL+bX0wABL+bkfwABL+JgQwABL/rbAwABL/q6VwABL/rt2wABL/rt6wABL/rhWwABL/rt7wABL/rt+wABL/rt/wABL/sAAi/zAAEwHu3LAAEwHu3XAAEwHu3fAAEwHu3jAAEwHu3HAAEv+u3TAAEv4mBbAAEwOAMAAS/C7gMAATBCYE8AATBGlvsAATBGPMcAATBG19MAATBG5H8AATBCYEMAATBa2wMAATBaulcAATBa7dsAATBa7esAATBa4VsAATBa7e8AATBa7fsAATBa7f8AATBbAAIv8wABMH7tywABMH7t1wABMH7t3wABMH7t4wABMH7txwABMFrt0wABMEJgWwABMJgDAAEvwu4HAAEwomBPAAEwpo2zAAEwomBbAAEwrAMAAS/C7gsAATC2YEsAATC6SS8AATC6VFMAATC2YE8AATDG5H8AATC2YEMAATDPAAIv8wABMNLt3wABMNLt4wABMM7cwwABMM7t0wABMM4PxwABMLZgWwABMOgDAAEvwu4XAAEw8mBDAAEw9u4bAAEw8mBPAAEw/o2zAAEw/u4fAAEw8mBbAAExCAMAAS/C7iMAATESYEsAATEWEPMAATEWAsMAATEWif8AATEWZy8AATEXAAIv8wABMSruJwABMRJgTwABMTLkfwABMRJgQwABMTruKwABMTrcwwABMTrt0wABMToPxwABMTsAAi/zAAExTu3LAAExTu3XAAExTu3fAAExTu3jAAExTu3HAAExEmBbAAExZkkPAAEvwu5DAAExbmBPAAExco2zAAExcu4fAAExbmBbAAExfAMAAS/C7kcAATGGYEsAATGKAsMAATGKif8AATGKZy8AATGGYE8AATGa5H8AATGGYEMAATGjAAIv8wABMabt3wABMabt4wABMaLcwwABMaLt0wABMaIPxwABMYZgWwABMbwDAAEvwu5LAAExxmBPAAExyo2zAAExxmBbAAEx0AMAAS/C7k8AATHaYEsAATHeEPMAATHe7lMAATHeAsMAATHeif8AATHeZy8AATHeCF8AATHaYEMAATH67isAATH7AAIv8wABMgLt3wABMgLt4wABMgLtxwABMfrcwwABMfrt0wABMfoPxwABMdpgTwABMh7kfwABMdpgWwABMiQDAAEvwu5jAAEyLmBPAAEyMo2zAAEyLmBbAAEyOAMAAS/C7mcAATJCYEsAATJGAsMAATJGif8AATJGZy8AATJCYE8AATJW5H8AATJCYEMAATJfAAIv8wABMmLt3wABMmLt4wABMl7cwwABMl7t0wABMl4PxwABMkJgWwABMngDAAEvwu5rAAEygmBDAAEyhu4bAAEygmBPAAEyjuR/AAEyju5vAAEyjo2zAAEygmBbAAEynAMAAS/C7nMAATKmYEsAATKqEPMAATKonwABMqqJ/wABMqpnLwABMqqcRwABMqrudwABMqZgQwABMsbuewABMsbuKwABMscAAi/zAAEy0u3LAAEy0u3XAAEy0u3fAAEy0u3jAAEy0u5/AAEy0u3HAAEyxtzDAAEyxu3TAAEyxg/HAAEypmBbAAEy+kkPAAEvwu6TAAEzAmBPAAEzBuR/AAEzBu5vAAEzBo2zAAEzAmBbAAEzFAMAAS/C7pcAATMeYEsAATMgnwABMyKJ/wABMyJnLwABMyLudwABMx5gQwABMzbuewABMzcAAi/zAAEzPu5/AAEzPu3LAAEzPu3XAAEzPu3fAAEzPu3jAAEzPu3HAAEzNtzDAAEzNu3TAAEzNg/HAAEzHmBbAAEzZAMAAS/C7psAATNuYE8AATNy5H8AATNy7m8AATNyjbMAATNuYFsAATOAAwABL8LunwABM4pgSwABM4yfAAEzjon/AAEzjmcvAAEzju53AAEzimBDAAEzou57AAEzowACL/MAATOq7n8AATOq7csAATOq7dcAATOq7d8AATOq7eMAATOq7ccAATOi3MMAATOi7dMAATOiD8cAATOKYFsAATPQAwABL8LuowABM9pgTwABM97dkwABM96NswABM9pgWwABM+gDAAEvwu6nAAEz8mBLAAEz9t2TAAEz9u6rAAEz8mBPAAE0AuR/AAEz8mBDAAE0CwACL/MAATQO7d8AATQO7eMAATQK3MMAATQK7dMAATQKD8cAATPyYFsAATQkAwABL8LutwABNC5gTwABNDLkfwABNDKNswABNC5gWwABNDwDAAEvwu67AAE0RmBLAAE0Sg+bAAE0RmBDAAE0UwACL/MAATRW7d8AATRS3MMAATRSD8cAATRGYFsAATRkAwABL8LuwwABNG5gTwABNHLuxwABNHLuywABNHLkfwABNHKNswABNG5gQwABNIbbcwABNIbgAwABNIbcwwABNIbhqwABNIYPxwABNG5gWwABNJwDAAEvwu7jAAE0pmBLAAE0qu7HAAE0qu7LAAE0pmBDAAE0twACL/MAATS67csAATS67d8AATS67eMAATS27dMAATSmYFsAATTMAwABL8Lu5wABNNZgTwABNNp1mwABNNqNswABNNZgQwABNObgAwABNObhqwABNOYPxwABNNZgWwABNPQDAAEvwu73AAE0/mBLAAE1AnWbAAE0/mBPAAE1CkkfAAE0/mBDAAE1Eu3/AAE1EttzAAE1EtzDAAE0/mBbAAE1IAMAAS/C7v8AATUqYE8AATUujbMAATUqYFsAATU0AwABL8LvAwABNT5gSwABNULkfwABNUJJHwABNUICKwABNT5gQwABNVMAAi/zAAE1Vu3LAAE1Vu3fAAE1Vu3HAAE1UtzDAAE1Ug/HAAE1PmBbAAE1bAMAAS/C7wsAATV2YEMAATV67w8AATV63S8AATV628sAATV63MMAATV623MAATV6ulcAATV67esAATV64VsAATV67e8AATV67dsAATV62wMAATV67fsAATV67f8AATV64asAATV2YE8AATW2AsMAATW25H8AATV2YFsAATXAAwABL8LvEwABNcpgTwABNc6NswABNcpgQwABNdbcwwABNdbvDwABNdbf/wABNcpgWwABNeQDAAEvwu8XAAE17mBLAAE18gLDAAE17mBDAAE1+rpXAAE1+u3rAAE1+tsDAAE1+g/HAAE1+wACL/MAATYO7xsAATXuYFsAATYUAwABL8LvHwABNh5gTwABNiJ1mwABNiLkfwABNiKNswABNh5gQwABNjIPxwABNh5gWwABNjgDAAEvwu8jAAE2QmBLAAE2RnWbAAE2RhDzAAE2RgLDAAE2QmBDAAE2VrpXAAE2VtsDAAE2VtzDAAE2QmBbAAE2ZAMAAS/C7ycAATZuYE8AATZy228AATZy5H8AATZuYEMAATZ+3MMAATZ+ulcAATZ+7dsAATZ+7esAATZ+4VsAATZ+7e8AATZ+7fsAATZ+7f8AATZuYFsAATagAwABL8LvKwABNqpgSwABNq7bbwABNqpgWwABNrQDAAEvwu8vAAE2vmBPAAE2wgIrAAE2wt5TAAE2wo2zAAE2vmBDAAE20tsDAAE20tsHAAE20u8zAAE20tvLAAE2vmBbAAE25AMAAS/C7zcAATbuYEsAATbyAisAATby3lMAATbuYEMAATb+D8cAATbuYFsAATcEAwABL8LvPwABNw5gTwABNxLKWwABNxJUawABNxKNswABNw5gQwABNyLbAwABNyLbBwABNyIPxwABNw5gWwABNzADAAEvwu9LAAE3OmBLAAE3PspbAAE3PlRrAAE3OmBbAAE3SAMAAS/C708AATdSYE8AATdWC3sAATdW5H8AATdWjbMAATdSYEMAATdm2wMAATdm3/8AATdm3MMAATdm23MAATdm7fsAATdm7f8AATdmD8cAATdSYFsAATeEAwABL8LvXwABN45gSwABN5ILewABN45gWwABN5gDAAEvwu9jAAE3omBPAAE3pu7HAAE3pkknAAE3puR/AAE3po2zAAE3omBDAAE3utsDAAE3utzDAAE3uuADAAE3ug/HAAE3omBbAAE3zAMAAS/C72cAATfWYEsAATfa7scAATfaSScAATfWYFsAATfkAwABL8LvawABN+5gTwABN/CLAAE38uR/AAE38o2zAAE37mBDAAE4Ag/HAAE4AptfAAE4AtsDAAE4ArpXAAE4Au3bAAE4Au3rAAE4AuFbAAE4Au3vAAE4Au37AAE4Au3/AAE4AtvLAAE4AtzDAAE4AttzAAE4AuADAAE4At//AAE4AuGrAAE37mBbAAE4RAMAAS/C73MAAThOYEsAAThQiwABOE5gWwABOFgDAAEvwtpvAAE4YmBLAAE4Zu93AAE4ZtqrAAE4ZhD3AAE4YmBPAAE4duR/AAE4do2zAAE4YmBDAAE4gtsDAAE4gu9/AAE4gtvLAAE4gttzAAE4gtzDAAE4gu+DAAE4grpXAAE4gu3bAAE4gu3rAAE4guFbAAE4gu3vAAE4gu+HAAE4gg/HAAE4YmBbAAE4uAMAAS/C2kcAATjCYEsAATjGAsMAATjCYEMAATjO3S8AATjOD8cAATjCYE8AATjZUwABOMJgWwABOOADAAEvwu+TAAE46mBDAAE47u8PAAE47t0vAAE47tvLAAE47tzDAAE47ttzAAE47rpXAAE47u3rAAE47uFbAAE47u3vAAE47u3bAAE47tsDAAE47u37AAE47u3/AAE47uGrAAE46mBPAAE5KgLDAAE5KuR/AAE46mBbAAE5NAMAAS/C2j8AATk+YEsAATlAiwABOT5gTwABOUrkfwABOUqNswABOT5gQwABOVbvDwABOVbcwwABOVbbAwABOVYPxwABOT5gWwABOWgDAAEvwtpjAAE5cmBLAAE5dVMAATlyYE8AATl+5H8AATl+jbMAATlyYEMAATmK2wMAATmKulcAATmK3S8AATmK7dsAATmK7esAATmK4VsAATmK7e8AATmK3MMAATmKD8cAATlyYFsAATmwAwABL8LaQwABObpgTwABOb7kfwABOb6NswABObpgQwABOcrbAwABOcq6VwABOcrdLwABOcrt2wABOcrt6wABOcrhWwABOcrt7wABOcrcwwABObpgWwABOewDAAEvwtpTAAE59mBPAAE5+o2zAAE59mBDAAE6Au3TAAE6Au3/AAE59mBbAAE6DAADAAIv9wABOhZgQwABOhrv0wABOhqdAwABOhqc/wABOhac8wABOipgSwABOi4CwwABOi4QXwABOipgVwABOjrvswABOipgTwABOkJJFwABOkKhPwABOipgQwABOk7dnwABOkyPAAE6KmBbAAE6WAMAATpbAAIv9wABOmICowABOhbvuwABOmpgSwABOm48xwABOmpgTwABOnYCwwABOnYQXwABOnZJFwABOnahPwABOmpgQwABOordnwABOoiPAAE6amBbAAE6lAMAAToWnPcAATqeYEsAATqiSRcAATqeYEMAATqq3Z8AATqojwABOp5gWwABOrQDAAE6Fpz7AAE6vmBLAAE6wqC/AAE6vmBDAAE6yt2fAAE6yI8AATq+YFsAATrUAwABOtcAAi/3AAE63gKjAAE6Fu/LAAE65mBLAAE66qC/AAE65mBDAAE68t2fAAE68I8AATrmYFsAATr8AAMAAi/7AAE7Bp0HAAE7CmBLAAE7DghfAAE7CmBDAAE7FtU3AAE7FtUrAAE7CmBPAAE7Io2zAAE7CmBbAAE7KAADAAIv/wABOzJ0JwABOzZgSwABOzqODwABOzpSGwABOzp1AwABOzp2OwABOzpSJwABOzp7owABOzqOswABOzrv4wABOzZgTwABO16NswABO15SbwABO16eywABO15SHwABO16OnwABO14QJwABOzZgUwABO3pSHwABOzZgQwABO4LkDwABO4J1NwABO4LWbwABO4LWdwABO4IO8wABO4ETAAE7gnTjAAE7gtbHAAE7NmBbAAE7pAMAATsy7+8AATuuYEsAATuyB08AATuy7+sAATuuYFsAATu8AAMAAjADAAE7xo6PAAE7ymBLAAE7zhBfAAE7zhBjAAE7zgLDAAE7zkkTAAE7zoGrAAE7zgdPAAE7ymBPAAE76oz/AAE7ymBDAAE78qEnAAE7ymBbAAE7+AADAAIwBwABPAJ0gwABPAZgSwABPAoNmwABPAZgTwABPBJJRwABPBIQYwABPBIQXwABPBIHTwABPBJ0TwABPBKM/wABPBKOKwABPBIPiwABPBIRFwABPBIPjwABPBIRCwABPBIPgwABPBIRAwABPBJSswABPBKOdwABPBJ09wABPBKNtwABPBIRBwABPBIPewABPBJQ9wABPBIRGwABPBKOcwABPBLEjwABPBJSbwABPBKeywABPBLwAwABPAZgQwABPH6gAwABPH6OxwABPH51NwABPAZgWwABPIwAAwACMAsAATyWjMsAATyaYE8AATyejbMAATyaYFsAATykAAMAAjAPAAE8ro7nAAE8smBPA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YZ0qwABQYpgSwABQY5HwwABQY6NrwABQY4CwwABQY5JRwABQYpgTwABQaKOcwABQaKM/wABQaLVLwABQYpgQwABQbLVNwABQbLVKwABQYpgWwABQbwAAwACMFMAAUHGjc8AAUHKYEsAAUHOVCsAAUHOWEsAAUHKYE8AAUHaxI8AAUHajbMAAUHKYEMAAUHmD8cAAUHkjwABQebXuwABQeZ13wABQcpgWwABQfgAAwACMFcAAUICnS8AAUIGYEsAAUIKD5sAAUIKEF8AAUIKEGMAAUIGYEMAAUIaoScAAUIaoSsAAUIaoS8AAUIYjwABQgZgWwABQiwAAwACMFsAAUI2nTMAAUI6YE8AAUI+jbMAAUI6YFsAAUJEAAMAAjBfAAFCTmBDAAFCUp0/AAFCTp07AAFCWmBLAAFCXvDDAAFCXkgrAAFCXkg/AAFCXkhDAAFCXngHAAFCXkgLAAFCXg6/AAFCXngLAAFCXvDHAAFCXkgPAAFCWmBDAAFCinfnAAFCinfzAAFCinfrAAFCinf3AAFCiuMvAAFCip1jAAFCip2TAAFCip2XAAFCip1HAAFCip1PAAFCip1XAAFCip1fAAFCip1rAAFCip1vAAFCip1zAAFCip13AAFCip2HAAFCip2LAAFCip2PAAFCingXAAFCingbAAFCip1bAAFCip2bAAFCingfAAFCikgbAAFCivDLAAFCivErAAFCivEjAAFCivD3AAFCivEfAAFCivELAAFCivEPAAFCivEDAAFCivEnAAFCivEbAAFCivEXAAFCivETAAFCivDzAAFCivDfAAFCivDvAAFCivDrAAFCivD/AAFCivEHAAFCivE3AAFCivDbAAFCivEvAAFCivDjAAFCivFXAAFCivFTAAFCivFjAAFCivFfAAFCip1LAAFCiwACMF8AAUNe8XsAAUKK8NMAAUKK8NcAAUKK8YcAAUKK8PsAAUKK8OcAAUKK8ZcAAUKK8Z8AAUKK8a8AAUKK8bMAAUKK8ZMAAUKK8bcAAUKK8Y8AAUKKbj8AAUKK8T8AAUKK8aMAAUKK8cMAAUJaYE8AAUOmd9MAAUOmd+8AAUJaYFsAAUOwAwABQk7xywABQ7pgTwABQ71XAAFDvgPzAAFDvg2jAAFDvgtLAAFDvgXnAAFDvgLbAAFDvmAHAAFDumBDAAFD3kyHAAFD3kyfAAFD3g7zAAFD3gtDAAFD3kx7AAFD3gWXAAFD3kyPAAFD3kynAAFD3kyzAAFD3UcAAUPeBJ8AAUPeTMMAAUPeAn8AAUPeTIsAAUPeTKsAAUPeDEsAAUPeTF8AAUPeTLcAAUPeTLsAAUPeTL8AAUPeAocAAUPeR4sAAUPdPwABQ94CZwABQ95PgwABQ952AwABREbx0wABREbx1wABREbx4wABQ95PiwABQ95PlwABQ94HQwABQ95MgwABQ95WmwABQ94CiwABQ97x5wABQ95szwABQ913AAFD3gP/AAFD3tyPAAFD3sMTAAFD3mmnAAFD3gxfAAFD3vILAAFD3gK7AAFD3vIfAAFD3g3bAAFD3vIjAAFD3nZbAAFD3rhXAAFD3vInAAFD3vIvAAFD3I8AAUO6YFMAAUS2C0sAAUS2BecAAUO6YFsAAUTAAwABQk7yMwABRMpgSwABRM7FKwABRM7yNwABRMpgTwABRNlrAAFEymBDAAFE4RMAAUTiAssAAUThPwABROLyPwABROLyQwABRMpgUwABRPlrAAFEymBbAAFFAAADAAIwYwABRQpgQwABRQ7yUwABRQqd2wABRRZgTwABRRp78wABRRZgQwABRSJ7XwABRRZgWwABRSgAAwACMGcAAUUyYEMAAUU28pMAAUU2nksAAUU2nicAAUU2nisAAUU2ni8AAUU28rcAAUU2c1sAAUU2s08AAUUy8msAAUVaYEsAAUVee/MAAUVeSXsAAUVe7DsAAUVe8m8AAUVaYEMAAUVye18AAUVaYFsAAUV4AwABRTLyfwABRYJgSwABRYZJewABRYbyewABRYJgQwABRZJ8awABRZJYOwABRZJXzwABRZJX0wABRZJX2wABRZJX8wABRZJYLwABRZJYCwABRZJYQwABRYJgWwABRbgDAAFFMp4jAAFFwmBLAAFFxH8AAUXGdfsAAUXGoCMAAUXCYFsAAUXUAwABRTLygwABRd5gSwABReLyhwABReIPvwABReJ8ZwABReLyiwABRd5gQwABRfbyjwABRfZMmwABRd5gWwABRgAAAwACMGsAAUYKYEMAAUYO8t8AAUYOdGMAAUYOnksAAUYO8vsAAUYO8wMAAUYO8w8AAUYO8xsAAUYO8yMAAUYO8y8AAUYO8zcAAUYOnlcAAUYOnlMAAUYO81cAAUYOnk8AAUYO6sMAAUYK8ssAAUZOYEsAAUZSe/MAAUZSVusAAUZS7DsAAUZS8m8AAUZOYEMAAUZme18AAUZOYFsAAUZsAwABRgry1wABRnZgQwABRnpdXwABRnry2wABRnpXzwABRnpX0wABRnpX2wABRnpX4wABRnpX8wABRnpYCwABRnpYQwABRnpYLwABRnZgWwABRqQAAwACMG8AAUauYEMAAUayoHADAAIwcwABRrqgdwABRr5gSwABRsIQXwABRsKg0wABRsJVPwABRsJHhwABRr5gWwABRtQAAwACMHcAAUbeYEcAAUbi82MAAUbi82cAAUbeYE8AAUbuBfsAAUbu9A8AAUbu9BMAAUbeYEMAAUb/AAIwdwABRwL0AwABRwL0FwABRv70BwABRv5XUwABRv70GwABRv70HwABRt7zawABRx5gSwABRyJPPwABRyLzbwABRyLzcwABRyLzdwABRx5gVwABRzbzfwABRx5gQwABRz7zxwABRz7zywABRzyPAAFHHmBbAAFHTvN7AAFG3vPrAAFHVmBLAAFHWJ8AAUdaBTcAAUda87MAAUda87cAAUdaTMcAAUdWYEMAAUdyD8cAAUdxBwABR3CPAAFHVmBPAAFHgg4nAAFHVmBbAAFHiAADAAIwewABR5JgRwABR5b0LwABR5JgQwABR570mwABR5L0OwABR6ZgSwABR6oIGwABR6r0PwABR6r0QwABR6r0RwABR6ZgUwABR770SwABR6ZgQwABR8ZMgwABR8b0VwABR8YHdwABR8UTAAFHxgLLAAFHxmJDAAFHxgJnAAFHxk+DAAFHxgdDAAFHxg7zAAFHxvRfAAFHxgJ/AAFHxpsXAAFHxvRrAAFHxk+LAAFHpmBPAAFIBgdzAAFIBKcAAUgGVjcAAUgFawABSAYD8wABSAYNowABR6ZgWwABSCADAAFHkvRvAAFIKmBLAAFILg5TAAFIKmBPAAFINVcAAUg1awABSDYD8wABSDYNowABSDYLSwABSDYF5wABSDYC2wABSCpgQwABSFZMgwABSFYCfwABSFYEnwABSFZMiwABSFYLQwABSFYO8wABSFZMqwABSFYMSwABSFZMewABSFVHAAFIVgWXAAFIVgKHAAFIVkeLAAFIVky7AAFIVky/AAFIVkxfAAFIVky3AAFIVkyPAAFIVkynAAFIVkyzAAFIVkyHAAFIVkyfA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wABaaq2KwABaaqtEwABaar/ZwABaaqwhwABaaqtMwABaaq36wABaar/awABaar/bwABaar/cwABaar/dwABaar/ewABaar/fwABaar/gwABaapZ4wABaar/hwABaar/iwABaar/jwABaaq2IwABaaq5ZwABaaq5bwABaar/kwABaar/lwABaapZ5wABaar/mwABaar/nwABaar/owABaar/pwABaapgnwABaarKcwABaar3cwABaapg6wABaaq2wwABaar3dwABaaqtHwABaapg5wABaaqbRwABaaq2JwABaaq91wABaaqtIwABaar/qwABaar/rwABaar/swABaaq5YwABaaq4vwABaar/twABaar/uwABaar/vwABaar/wwABaaqtJwABaar/xwABaaqtFwABaaqtLwABaaZgWwABaqQDAAFohv/LAAFqrmBDAAFqsv/PAAFqsv/TAAFqsv/XAAFqsv/bAAFqsv/fAAFqrmBbAAFqyAMAAWiG/+MAAWrSYEMAAWrW/+cAAWrSYFsAAWrcAwABaIb/6wABauZgSwABauq//wABausAAjC7AAFq8v/vAAFq8v/zAAFq8v/3AAFq8v/7AAFq8v//AAFq8wABAAMAAWrzAAEABwABavKsdwABavMAAQALAAFq5mBDAAFrGghvAAFrGghPAAFrGrYXAAFrGv8bAAFrGlmnAAFrGwACMLsAAWszAAEAKwABazMAAQA3AAFrMwABAD8AAWszAAEAQwABazMAAQBLAAFrMwABAFcAAWszAAEAUwABazMAAQBbAAFrMwABAF8AAWszAAEAYwABazMAAQBnAAFrMwABAB8AAWszAAEAnwABazMAAQCrAAFrMwABAJsAAWszAAEATwABazMAAQAjAAFrMwABALsAAWszAAEAvwABazMAAQAPAAFrMuWvAAFrMwABALcAAWszAAEAswABazMAAQAnAAFrMwABAEcAAWsa/xMAAWsa/u8AAWsaW68AAWsaW9cAAWsaW+cAAWsati8AAWsarTsAAWsa/usAAWsaBS8AAWsarUcAAWsa/wMAAWsa/wcAAWsarWMAAWsa/x8AAWsa/yMAAWsamwsAAWsa/ycAAWsauMMAAWsa/zsAAWsa/z8AAWsa/0MAAWrmYFsAAWvsAwABaIcAAQDDAAFr9mBLAAFr+r//AAFr+wACMLsAAWwDAAEAxwABbAMAAQDLAAFsAwABAM8AAWwC//8AAWwDAAEAAwABbAMAAQAHAAFsAqx3AAFsAwABAAsAAWv2YEMAAWwmCG8AAWwmCE8AAWwm/0sAAWwm/1MAAWwm/1sAAWwmthMAAWwmYJ8AAWwmYOsAAWwmYOcAAWwmm0cAAWwnAAEA0wABbCcAAQDXAAFsJwABANsAAWwnAAEA3wABbCcAAQDjAAFsJwACMLsAAWxnAAEA6wABbGcAAQDzAAFsZwABAO8AAWxnAAEA9wABbGcAAQEXAAFsZwABARsAAWxnAAEBIwABbGcAAQE3AAFsZwABAS8AAWxnAAEA/wABbGcAAQFHAAFsZwABAScAAWxnAAEBVwABbGcAAQFjAAFsZwABAVMAAWxnAAEBTwABbGcAAQFvAAFsZwABAXMAAWxnAAEA+wABbGcAAQGrAAFsZwABAa8AAWxnAAEADwABbGblrwABbGcAAQFLAAFsZwABAQMAAWxnAAEBQwABbGcAAQEfAAFsJv+nAAFsJlnnAAFsJv+fAAFsJv97AAFsJv9zAAFsJv93AAFsJv9vAAFsJrfrAAFsJv9rAAFsJq0LAAFsJq0TAAFsJq0bAAFsJv+PAAFsJri/AAFsJv+7AAFsJv+/AAFsJv+TAAFsJv+rAAFsJv/HAAFr9mBPAAFtIv9PAAFtIv9XAAFtIv9fAAFtIwACMLsAAW0zAAEBhwABa/ZgWwABbTgDAAFohll7AAFtQmBLAAFtRhAHAAFtRwACMLsAAW1PAAEBswABbU5u8wABbUJgQwABbVsAAjC7AAFtXwABAA8AAW1e5a8AAW1fAAEAtwABbV8AAQCzAAFtXwABACcAAW1fAAEARwABbVoIPwABbUJgTwABbX1rAAFtQmBbAAFthAMAAWiHAAEBtwABbY5gSwABbZMAAjC7AAFtll8vAAFtll8rAAFtjmBDAAFtowACMLsAAW2nAAEADwABbablrwABbacAAQG7AAFtpwABAUsAAW2nAAEBAwABbacAAQFDAAFtpwABAR8AAW2OYE8AAW3HAAIwuwABbcsAAQGHAAFtjmBbAAFt0AMAAWiHAAEBzwABbdpgSwABbdyfAAFt3wACMLsAAW3kowABbdynAAFt3moLAAFt3wABAdcAAW3eDsMAAW3fAAEB4wABbd4CgwABbd7oWwABbd5SUwABbd5YKwABbd8AAQH7AAFt3wABAXsAAW3fAAECBwABbd7J/wABbd8AAQITAAFt3k4zAAFt3hB/AAFt3lFfAAFt3moXAAFt3moPAAFt2mBDAAFuOI8AAW3aYFsAAW5AAwABaIcAAQIvAAFuSmBLAAFuTJ8AAW5PAAIwuwABblSjAAFuTKcAAW5OECcAAW5OZPMAAW5KYEMAAW5ojwABbkpgWwABbnADAAFohwABAjsAAW56YEsAAW58nwABbn8AAjC7AAFuhKMAAW58pwABbn8AAQI/AAFufsXzAAFufwABAksAAW5/AAECUwABbn8AAQJbAAFuemBDAAFupI8AAW56YFsAAW6sAwABaIcAAQJjAAFutmBLAAFuuJ8AAW67AAIwuwABbsCjAAFuuKcAAW66ZPMAAW66SW8AAW66DssAAW6614MAAW66dfsAAW67AAECewABbroQfwABbrZgQwABbuiPAAFutmBbAAFu8AMAAWiHAAEChwABbvpgSwABbvyfAAFu/wACMLsAAW8EowABbvynAAFu/hDDAAFu/mFDAAFu/wABAY8AAW7/AAEBawABbvpgQwABbyCPAAFu+mBbAAFvKAMAAWiHAAECmwABbzJgSwABbzSfAAFvNwACMLsAAW88owABbzSnAAFvNmTzAAFvNteDAAFvMmBDAAFvUI8AAW8yYFsAAW9YAwABaIaIewABb2JgSwABb2YCKwABb2JgTwABb24OJwABb2JgQwABb3UHAAFvdI8AAW9iYFsAAW+AAwABaIcAAQKrAAFvimBLAAFvjJ8AAW+PAAIwuwABb5SjAAFvjKcAAW+OEUcAAW+PAAECswABb46e0wABb48AAQK/AAFvjlN3AAFvjrzjAAFvjlgHAAFvjnS7AAFvjwABAtcAAW+KYEMAAW/EjwABb4pgWwABb8wDAAFohwABAt8AAW/WYEsAAW/bAAIwuwABb95a0wABb9ZgQwABb+Z8awABb+cAAQLjAAFv5lfbAAFv5q3rAAFv5q3nAAFv5lgLAAFv5lfzAAFv5lgvAAFv5lfTAAFv5q3TAAFv1mBbAAFwEAMAAWiHAAEC5wABcBpgSwABcByfAAFwHwACMLsAAXAkowABcBynAAFwHhFHAAFwHwABArMAAXAfAAEC8wABcB5TdwABcB8AAQK/AAFwHrzjAAFwHlgHAAFwHnS7AAFwHlKfAAFwHwABAxMAAXAfAAEDGwABcB8AAQMjAAFwHwABAysAAXAaYEMAAXBkjwABcBpgWwABcGwDAAFohwABAzMAAXB2YEsAAXB7AAIwuwABcH5a0wABcHZgQwABcIcAAQLjAAFwhl1fAAFwhlfPAAFwhlfTAAFwhlfbAAFwhlfjAAFwhlfzAAFwhlgLAAFwhlhDAAFwhlgvAAFwdmBbAAFwsAMAAWiHAAEDOwABcLpgSwABcL8AAjC7AAFwwlrTAAFwwwABAz8AAXC6YEMAAXDOCEcAAXC6YFsAAXDUAwABaIcAAQNHAAFw3mBLAAFw4wACMLsAAXDmxK8AAXDnAAEDPwABcN5gQwABcPJ05wABcN5gWwABcPgDAAFohwABA08AAXECYEsAAXEHAAIwuwABcQsAAQNTAAFxCwABA1cAAXECYEMAAXEXAAEBPwABcQJgWwABcRwDAAFohwABA18AAXEmYEsAAXEqDssAAXErAAIwuwABcTJp1wABcTMAAQNjAAFxMonfAAFxJmBDAAFxQqfvAAFxQwABATsAAXFDAAEBKwABcUCPAAFxJmBbAAFxVAMAAWiHAAEDfwABcV5gSwABcWIOywABcWMAAjC7AAFxaonfAAFxXmBDAAFxcwABASsAAXFwjwABcV5gWwABcXwDAAFohwABA4cAAXGGYEsAAXGKDssAAXGLAAIwuwABcZMAAQOLAAFxkwABA48AAXGGYEMAAXGfAAIwuwABcaMAAQOTAAFxnwABAX8AAXGfAAEAdwABcZyPAAFxhmBbAAFxtAMAAWiHAAEDnwABcb5gQwABccK5swABccKtDwABccK2KwABccL/ZwABccKwhwABccL/mwABccL/lwABccK91wABccL/fwABccL3dwABccL3cwABccKtHwABccKtIwABccL/gwABccK5bwABccL/swABccK5YwABccK5ZwABccKtMwABccK2wwABccK2IwABccK2JwABccL/rwABccL/twABccL/wwABccKtJwABccLKcwABccKtFwABccKtLwABccL/owABccJZ4wABccL/hwABccL/iwABcb5gWwABckgDAAFohwABA6sAAXJSYEMAAXJWtjsAAXJW/ucAAXJWtscAAXJW/ysAAXJW938AAXJWuXcAAXJWsIsAAXJW/vMAAXJW/w8AAXJW93sAAXJWrUsAAXJWrU8AAXJWrVsAAXJW/y8AAXJWuXMAAXJW/vcAAXJWuXsAAXJWE+MAAXJWtjMAAXJWubcAAXJWtjcAAXJWvecAAXJW/wsAAXJW/zMAAXJW/zcAAXJWrVMAAXJWyncAAXJWrUMAAXJWrVcAAXJW/xcAAXJWWaMAAXJW/vsAAXJW/v8AAXJSYFsAAXLcAwABaIcAAQOvAAFy5mBLAAFy6wACMLsAAXLvAAEDswABcu8AAQOLAAFy7wABA48AAXLmYEMAAXL/AAEDtwABcv5Z8wABcv5WVwABcv5XnwABcv5WnwABcv5XlwABcv5XDwABcv5W8wABcv5XAwABcv5W2wABcv5W4wABcv5W0wABcv5WJwABcv5WLwABcv5WOwABcv5UfwABcv5UhwABcv5U8wABcv5UjwABcv5UlwABcv5UnwABcv5VAwABcv5WywABcv5XIwABcv5XKwABcv5VCwABcv5UVwABcv5VGwABcv5U+wABcv5UtwABcv5WXwABcuZgWwABc3wDAAFohwABA7sAAXOGYEsAAXOLAAIwuwABc48AAQOzAAFzjwABA4sAAXOPAAEDjwABc4ZgQwABc58AAQO/AAFznwABAGsAAXOfAAEBdwABc55ZPwABc55ZMwABc55ZJwABc55ZCwABc55Y8wABc55Y5wABc55Y2wABc55YxwABc55YswABc55YowABc55YkwABc55YhwABc55YewABc55YbwABc55dRwABc4ZgWwABc+gDAAFohwABA88AAXPyYEsAAXP3AAIwuwABc/q5rwABc/JgQwABdAMAAjC7AAF0BwABAA8AAXQG5a8AAXQHAAEARwABdAcAAQAnAAF0BwABALMAAXQHAAEAtwABdAIIPwABc/JgTwABdCVrAAFz8mBbAAF0LAMAAWiHAAED1wABdDZgSwABdDsAAjC7AAF0PlADAAF0PrmvAAF0NmBDAAF0SwACMLsAAXRPAAED2wABdE8AAQAPAAF0TuWvAAF0TwABAUsAAXRPAAEBHwABdE8AAQFDAAF0TwABAQMAAXQ2YE8AAXRvAAIwuwABdHMAAQGHAAF0NmBbAAF0eAADAAIwvwABdILKnwABdIZgSwABdIifAAF0iwACML8AAXSQowABdIinAAF0iwABBAcAAXSKb8sAAXSKcCcAAXSGYEMAAXSojwABdIZgW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wABeQZQOwABePJgWwABeQwDAAF5DkkPAAF3dwABBsMAAXkaYEsAAXkdjwABeR4ITwABeR4E/wABeRpgWwABeSwDAAF3dwABBscAAXk2YEsAAXk6CGsAAXk2YEMAAXlCUDsAAXk2YFsAAXlIAwABeUpJDwABd3cAAQbLAAF5VmBLAAF5Wq/LAAF5VmBbAAF5YAMAAXliSQ8AAXd2oUMAAXluYEsAAXlyCF8AAXlylm8AAXlyrsMAAXlyCGsAAXlyD4sAAXlySRcAAXluYEMAAXmOUDsAAXluYFsAAXmUAwABeZZJDwABd3cAAQbPAAF5omBLAAF5pghfAAF5omBDAAF5rlA7AAF5omBbAAF5tAMAAXm2SQ8AAXd3AAEG0wABecJgSwABecavywABecJgWwABecwDAAF5zkkPAAF3dwABBtcAAXnaYEsAAXnfAAEG2wABed8AAQbfAAF53wABBuMAAXnfAAEG5wABed6u/wABed6NrwABed6uwwABed4IXwABed5TcwABed6u7wABed57wwABed6u8wABed6u+wABed4IawABedpgQwABehpQOwABedpgWwABeiADAAF6IkkPAAF3dwABBusAAXouYEsAAXoyST8AAXouYEMAAXo6UDsAAXouYFsAAXpAAwABekJJDwABd3atvwABek5gSwABelIHTwABelKvXwABek5gWwABelwDAAF3dwABBvMAAXpmYEsAAXpqAsMAAXpqCF8AAXpqnJ8AAXpmYFsAAXp4AwABd3cAAQb3AAF6gmBLAAF6hg97AAF6hg+LAAF6hg+PAAF6hg+TAAF6gmBbAAF6mAMAAXd3AAEG+wABeqJgSwABeqSfAAF6pwACMMMAAXqsowABeqSnAAF6phAnAAF6pq57AAF6pkk/AAF6plETAAF6phB/AAF6pqvPAAF6plgHAAF6pq8HAAF6omBDAAF62I8AAXqiYFsAAXrgAwABd3cAAQcfAAF66mBDAAF67wABBqsAAXrvAAEGswABeu5RPwABeu5SgwABeu5S9wABeu5WYwABeu6uawABeu5RvwABeu8AAQbvAAF67wABBrsAAXrqYFsAAXsYAwABd3cAAQcjAAF7ImBDAAF7JwABBqsAAXsnAAEGswABeyZRPwABeyZSgwABeyZS9wABeyZWYwABeyauawABeyZRvwABeycAAQa7A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wABg9MAAjDfAAGD2KMAAYPQpwABg9MAAQsXAAGD0wABCx8AAYPTAAELJwABg9MAAQsvAAGDzmBDAAGD9I8AAYPOYFsAAYP8AwABgLsAAQs3AAGEBmBLAAGECwABCzsAAYQLAAELPwABhAsAAQtDAAGECwABC0cAAYQLAAELSwABhAsAAQtPAAGECwABC1MAAYQGYFsAAYQoAwABgLsAAQtXAAGEMmBLAAGENpGLAAGENrWnAAGENmTzAAGEMmBDAAGERqJnAAGERstjAAGERI8AAYQyYE8AAYRXAAIw3wABhFsAAQqjAAGEMmBbAAGEYAMAAYC7AAELWwABhGpgSwABhGyfAAGEbwACMN8AAYR0owABhGynAAGEbwABC18AAYRvAAELZwABhGpgQwABhIiPAAGEamBbAAGEkAMAAYC7AAELbwABhJpgSwABhJ8AAQs7AAGEnwABC3MAAYSfAAELdwABhJ6idwABhJpgWwABhLADAAGAuwABC3sAAYS6YEsAAYS+e28AAYS/AAELfwABhLpgTwABhMsAAQuDAAGEywABCe8AAYTKy8sAAYTKzRMAAYTLAAIw3wABhN8AAQqjAAGEumBDAAGE5sunAAGE5sufAAGE5pLrAAGE5sz3AAGE5nTnAAGE5ghHAAGE5suLAAGE5wABCrsAAYTmxDMAAYTkjwABhLpgWwABhRLVywABhRJJDwABgLsAAQuHAAGFHmBDAAGFIsufAAGFInXfAAGFHmBPAAGFLwABCrcAAYUuzRcAAYUuy8MAAYUuy78AAYUuy7sAAYUuy8cAAYUvAAEJ+wABhR5gWwABhUwDAAGFTtXLAAGAuwABC4sAAYVaYEsAAYVfAAELgwABhVpgTwABhWZ7bwABhWcAAQq3AAGFZwACMN8AAYVzAAEKowABhWbLxwABhWbNFwABhWbLwwABhWbLvwABhWbLuwABhWcAAQn7AAGFWmBDAAGFksufAAGFknXfAAGFWmBbAAGFnAMAAYWe1csAAYC7AAELjwABhapgSwABha8AAjDfAAGFswABC5MAAYWzAAELlwABhbMAAQubAAGFswABC58AAYWzAAELowABhapgQwABhcrLiwABhcsAAQq7AAGFynXfAAGFqmBPAAGF2svDAAGF2wABCvcAAYXbAAEJ+wABhapgWwABhegDAAGF6tXIAwACMOMAA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ZqGuS8AAZp6YEMAAZqzAAEV/wABmrMAARZPAAGaswABFlMAAZqzAAEWVwABmrMAARZbAAGaswABFl8AAZqzAAEWZwABmrMAARZrAAGaswABFm8AAZqzAAEWcwABmrMAARYHAAGaswABFhMAAZqzAAEWdwABmrMAARZ7AAGaswABFoMAAZqzAAEWhwABmrMAARaLAAGaswABFo8AAZqzAAEWkwABmrMAARabAAGaswABFqMAAZqzAAEWqwABmrMAARazAAGaswABFrcAAZqyuZcAAZqzAAEWuwABmrMAARa/AAGaswABFsMAAZqyuY8AAZqyuZMAAZqyCD8AAZqyB0MAAZqzAAEWxwABmrMAARbLAAGaswABDD8AAZp6YFsAAZtAAwABmmsAARbPAAGbSmBLAAGbTwABFtMAAZtOyS8AAZtOuS8AAZtPAAEW1wABm08AARbbAAGbTwABFt8AAZtPAAEW4wABm02/AAGbTgn/AAGbTn87AAGbTwACMRMAAZt6v3sAAZt6//sAAZtOf4cAAZtOgCMAAZtOVCMAAZtPAAEWSwABm08AARbnAAGbTrJTAAGbSmBPAAGbnwACMRMAAZuiy08AAZtKYEMAAZurAAEWZwABm6sAARYTAAGbqwABFusAAZurAAEWwwABm6sAARazAAGbqwABFncAAZurAAEWewABm6q5jwABm6q5kwABm6sAARZTAAGbqwABFlcAAZurAAEWWwABm6sAARX/AAGbqwABF0MAAZurAAEX5wABm6sAAReHAAGbqwABFk8AAZurAAEX9wABm6sAARgLAAGbqtEjAAGbqwABGBcAAZurAAEX1wABm6sAARdPAAGbqwABF0sAAZurAAEWqwABm6sAARZzAAGbqwABFmsAAZurAAEWbwABm6sAARa/AAGbqwABFrsAAZurAAEWtwABm6sAARaHAAGbqwABFoMAAZurAAEWXwABm6sAARabAAGbqwABFqMAAZurAAEWiwABm6sAARaPAAGbqwABFpMAAZuqCD8AAZuqB0MAAZurAAEWBwABm6q5lwABm6sAARbHAAGbqwABFssAAZurAAEMPwABm0pgWwABnGQDAAGaawABGFsAAZxuYEsAAZxzAAIxEwABnHa05wABnG5gTwABnH8AAjETAAGcgstPAAGcbmBDAAGciwABGF8AAZyLAAEYYwABn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NZgQwABoO6tNwABoNZgTwABoPapWwABoPcAAjEbAAGg/v53AAGg1mBbAAGhBAMAAZ4rAAEZuwABoQ5gSwABoRIOrwABoRJJPwABoRKIAwABoRIOJwABoQ5gVwABoSatBwABoQ5gQwABoS6tNwABoQ5gTwABoTcAAjEbAAGhOv53AAGhDmBbAAGhQAMAAZ4rAAEZxwABoUpgSwABoU4OrwABoU4PfwABoUpgVwABoVqtBwABoUpgQwABoWKtNwABoUpgTwABoWoRAwABoWsAAjEbAAGhcv53AAGhSmBbAAGheAMAAZ4rAAEZywABoYJgSwABoYYOrwABoYYPfwABoYJgVwABoZKtBwABoYJgQwABoZqtNwABoYJgTwABoaKbfwABoaIRBwABoaMAAjEbAAGhrv53AAGhgmBbAAGhtAMAAZ4rAAEJVwABob5gSwABocIOrwABocKbfwABocIPiwABob5gVwABodKtBwABob5gQwABodqtNwABob5gTwABoeIRCwABoeMAAjEbAAGh6v53AAGhvmBbAAGh8AMAAZ4rAAEV6wABofpgSwABof4OrwABofpgVwABogatBwABofpgQwABog6tNwABofpgTwABohcAAjEbAAGiGv53AAGh+mBbAAGiIAMAAZ4rAAEKjwABoipgSwABoi4OrwABoipgVwABojatBwABoipgQwABoj6tNwABoipgTwABokcAAjEbAAGiSv53AAGiKmBbAAGiUAMAAZ4rAAEZ2wABolpgSwABolyfAAGiXwACMRsAAaJkowABolynAAGiXmTzAAGiXklvAAGiXlgHAAGiXnY/AAGiWmBDAAGigI8AAaJaYFsAAaKIAwABnisAARnvAAGikmBLAAGilg6vAAGilrBLAAGilgLDAAGilJ8AAaKSYFcAAaKqrQcAAaKSYEMAAaKyrTcAAaKwjwABopJgWwABorwAAwACMSMAAaLGYEMAAaLLAAIxIwABos8AAR73AAGixwABGg8AAaLWYEsAAaLbAAEaEwABotsAARoXAAGi2wABGhsAAaLbAAEaHwABotsAARojAAGi2wABGicAAaLbAAEaKwABotsAARovAAGi2wABGjMAAaLbAAEaNwABotsAARo7AAGi2wABGj8AAaLbAAEaQwABotq9KwABotsAARpHAAGi2wABGksAAaLavTMAAaLbAAEaTwABotsAARpTAAGi2wABGlcAAaLbAAEaWwABotsAARpfAAGi2wABGmMAAaLbAAEaZwABotsAARprAAGi2wABGm8AAaLafzsAAaLbAAIxIwABo0sAARpzAAGjSwABGncAAaLbAAEaewABotsAARp/AAGi2wABGoMAAaLbAAEahwABotsAARqLAAGi2wABGo8AAaLbAAEakwABotsAARqXAAGi2wABGpsAAaLbAAEanwABotZgTwABo34EQwABo37G3wABo307AAGjfg2bAAGjfwABGqMAAaN/AAEapwABo35jzwABo36BOwABo35W/wABo38AARqrAAGjfwABGq8AAaN/AAEavwABotZgQwABo7MAARqzAAGjsr1HAAGjswABGsMAAaOzAAEaxwABo7MAARq3AAGjswABGtMAAaOzAAEa1wABo7MAARrbAAGjswABGt8AAaOzAAEa5wABo7LjvwABo7JWowABo7MAARrvAAGjswABGvMAAaOybksAAaOzAAEbAwABo7MAARsLAAGjswABGw8AAaOzAAEbEwABo7MAAjEjAAGkAwABGxcAAaQDAAEc8wABo7MAARsfAAGjswABGysAAaOzAAEbMwABo7MAARs/AAGjswABG0cAAaOzAAEbSwABo7MAARtPAAGjstv7AAGjswABG18AAaOzAAEauwABo7MAARt7AAGjswABG4MAAaOzAAEbiwABo7MAARuPAAGjswABG5MAAaOzAAEbowABo7LAHwABo7MAARuvAAGjstFPAAGjslafAAGjssA7AAGjswABG8cAAaOzAAEbzwABo7JXVwABo7MAARvTAAGjstG/AAGjssA/AAGjsuOjAAGjswABG8MAAaOzAAEb8wABo7MAARv3AAGjslazAAGjslaPAAGjswABHCMAAaOzAAEcOwABo7JXnwABo7MAARxDAAGjswABHAMAAaOzAAEcTwABo7LAdwABo7MAARxbAAGjswABHF8AAaOzAAEcYwABo7MAARxnAAGjswABHGsAAaOzAAEcbwABo7JWywABo7MAARx3AAGjswABHHsAAaOzAAEcfwABo7MAARyDAAGjswABHIcAAaOzAAEciwABo7JVWwABo7JXrwABo7MAARyPAAGjswABHJMAAaOzAAEclwABo7MAARybAAGjswABHJ8AAaOzAAEcowABo7MAARynAAGjswABHKsAAaOzAAEcrwABo7MAARy7AAGjswABBrMAAaOzAAEcywABo7MAARzPAAGjssD3AAGjssEXAAGjssEbAAGjslYfAAGjswABHO8AAaOywScAAaOyV5cAAaOzAAEdLwABo7MAAR07AAGjswABHT8AAaOzAAEdRwABo7MAAR1TAAGjswABHVcAAaLWYFsAAaVQAwABoscAAR1fAAGlWmBLAAGlXwABHWMAAaVevVsAAaVevV8AAaVevWMAAaVevWcAAaVevVMAAaVevWsAAaVeo+sAAaVaYE8AAaWCVv8AAaWDAAEdZwABpVpgQwABpY8AAR1TAAGljwABG0sAAaWPAAEbRwABpY8AARtfAAGljwABGrMAAaWPAAEbowABpY7b+wABpVpgWwABpawDAAGixwABHc8AAaW2YEsAAaW6vRcAAaW6vRsAAaW6pAMAAaW6vSMAAaW6vScAAaW2YE8AAaXTAAEaqwABpbZgQwABpdsAAR1TAAGl2tv7AAGl2wABG0sAAaXbAAEbRwABpdsAARtfAAGl2wABG6MAAaXbAAEaswABpbZgWwABpfgDAAGixwABHjsAAaYCYEsAAaYHAAEePwABpgcAAR5DAAGmBqP7AAGmBr07AAGmBr0/AAGmBqP/AAGmBr1DAAGmBr0jAAGmBqPrAAGmAmBPAAGmLwABGq8AAaYvAAEeRwABpi8AAR5LAAGmAmBDAAGmPwABHVMAAaY+2/sAAaY/AAEbSwABpj8AARtHAAGmPwABG18AAaY/AAEaswABpj8AARujAAGmAmBbAAGmXAMAAaLHAAEe0wABpmZgSwABpmsAARr3AAGmahFPAAGmawABHtcAAaZrAAEe2wABpmoP2wABpmsAARtnAAGmap9zAAGmawABG3cAAaZrAAEbcwABpmsAAR7fAAGmam5LAAGmZmBDAAGmmnxrAAGmmwABFk8AAaabAAEbgwABppsAARuLAAGmmwABG48AAaabAAEbkwABpprAHwABpprRTwABpppWnwABpprAOwABppsAARvHAAGmmwABG88AAaaaV1cAAaabAAEb0wABpprRvwABpprAPwABppsAARvzAAGmmwABG/cAAaaaVrMAAaaaVo8AAaabAAEcIwABppsAARw7AAGmmwABG3sAAaaaV58AAaaawHcAAaabAAEcWwABppsAARxfAAGmmwABHGMAAaabAAEcZwABppsAARxrAAGmmwABHG8AAaaaVssAAaabAAEclwABppsAARybAAGmmwABHJ8AAaabAAEcdwABppsAARx7AAGmmwABHH8AAaabAAEcgwABppsAARyHAAGmmwABHIsAAaaaVVsAAaaaV68AAaabAAEcjwABppsAARyTAAGmmwABHKMAAaabAAEcpwABppsAARyrAAGmmwABHK8AAaabAAEcuwABppsAAQazAAGmmwABHMsAAaabAAEczwABpprA9wABpprBFwABpprBGwABpppWHwABpprBJwABpppXlwABppsAAR0vAAGmmwABHTsAAaabAAEdPwABppsAAR1HAAGmmwABHVcAAaZmYFsAAaecAAMAAjEkAwACMSsAAaequz8AAaeuYEMAAaezAAEfBwABp7MAAR8LAAGnswABHw8AAaezAAEfEwABp7MAAR8XAAGnswABHxsAAaezAAEfHwABp7MAAR8jAAGnrmBbAAGn1AADAAIxLwABp95gSwABp+MAAR97AAGn4wABH4MAAafeYE8AAafvAAEfhwABp98AAR8rAAGn9mBLAAGn+n+HAAGn+rwzAAGn+wABHy8AAaf6BIcAAaf7AAEfMwABp/ZgTwABqBMAAR87AAGn9mBDAAGoGwABHz8AAagbAAEfTwABqBoIPwABp/ZgWwABqCgDAAGn3wABH1cAAagyYEsAAag3AAIxLwABqDsAAR9bAAGoMmBPAAGoQgSHAAGoMmBDAAGoSg6vAAGoSm2PAAGoSwABH28AAahLAAEfcwABqEsAAR9HAAGoST8AAahLAAEfawABqDJgWwABqGgAAwACMTMAAahzAAEfjwABqHZgSwABqHifAAGoewACMTMAAaiAowABqHinAAGoewABDLcAAah7AAEMuwABqHZgQwABqJSPAAGodmBbAAGonAMAAahzAAEfmwABqKZgSwABqKrNiwABqKsAAQ0vAAGoqs2HAAGoqsVLAAGoqsqnAAGoqwABDTMAAairAAENOwABqKsAAjEzAAGoywABH58AAaimYE8AAajTAAENQwABqKZgQwABqNsAAR+jAAGo2q9LAAGopmBbAAGo5AMAAahzAAEfqwABqO5gSwABqPMAAjEzAAGo9q3PAAGo9wABH68AAaj3AAEfswABqPcAAR+3AAGo9wABH7sAAaj3AAEfvwABqPcAAR/DAAGo9wABH8cAAaj3AAEfywABqPcAAR/PAAGo9wABH9MAAaj3AAEf1wABqPcAAR/bAAGo9wABH98AAaj3AAEf4wABqPcAAR/nAAGo9wABH+sAAaj3AAEf7wABqPcAAR/zAAGo9wABH/cAAaj3AAEf+wABqPcAAR//AAGo9wABIAMAAaj3AAEgBwABqPcAASALAAGo9wABIA8AAaj3AAEgEwABqPcAASAXAAGo9wABIBsAAaj3AAEgHwABqPcAASAjAAGo9wABICcAAaj3AAEgKwABqPcAASAvAAGo9wABIDMAAaj3AAEgNwABqPcAASA7AAGo9wABID8AAaj3AAEgQwABqPcAASBHAAGo9wABIEsAAaj3AAEgTwABqPcAASBTAAGo9wABIFcAAaj3AAEgWwABqPcAASBfAAGo9wABIGMAAaj2aocAAaj2anMAAaj2am8AAaj2p0MAAaj3AAEgZwABqPamiwABqPamnwABqPanPwABqPcAASBrAAGo9wABIG8AAaj3AAEgcwABqPcAASB3AAGo9wABIHsAAaj3AAEgfwABqPcAASCDAAGo9wABIIcAAaj3AAEgiwABqPcAASCPAAGo9wABIJMAAaj3AAEglwABqO5gTwABqgalUwABqgalSwABqgcAASCfAAGqBwABIKMAAaoHAAEgpwABqgcAASCrAAGqBwABIK8AAaoHAAEgswABqgaliwABqgcAASC/AAGqBqWDAAGqBwABIM8AAaoHAAEg0wABqgcAASDXAAGqBwABINsAAaoHAAEg3wABqgcAASDjAAGqBwABIJsAAaoGpRMAAaoGpRcAAaoHAAEg5wABqgcAASD7AAGqBwABIP8AAaoHAAEhAwABqgcAASEHAAGqBwABIQsAAaoHAAEhDwABqgcAASETAAGqBwABIRcAAaoHAAEhHwABqgcAASEnAAGqBwABISsAAaoHAAEhLwABqgcAASEzAAGqBwABITcAAaoHAAEhOwABqgapbwABqgcAASE/AAGqBwABBm8AAaoHAAEhQwABqgcAASFHAAGqBwABIUsAAaoG62cAAaoHAAEhUwABqgcAASFXAAGqBwABIVsAAaoHAAEhXwABqgcAASFjAAGqBwABIWcAAaoGrwcAAaoHAAEhawABqgcAASFvAAGqBwABIXMAAaoGa7cAAaoGbA8AAaoGbAcAAaoGpI8AAaoHAAEhdwABqgajqwABqgajvwABqgakiwABqgcAASF7AAGqBwABIX8AAaoGpPsAAaoGqT8AAaoHAAEhgwABqgcAASGHAAGqBwABIYsAAaoGojcAAaoHAAEhjwABqgcAASGTAAGqBwABIZcAAajuYEMAAasrAAIxMwABqy8AASDrAAGrLwABIMMAAasvAAEgtwABqysAASGbAAGo7mBbAAGrQAADAAIxNwABq0sAASGjAAGrTmBLAAGrUgLDAAGrTmBDAAGrWwABIacAAatbAAEhqwABq05gTwABq2awlwABq05gWwABq2wDAAGrSwABIa8AAat2YE8AAat6sJcAAat2YEMAAauDAAEhqwABq3ZgWwABq4gDAAGrSwABIbsAAauSYE8AAauWsJcAAauSYEMAAaufAAEhqwABq5JgWwABq6QDAAGrSwABIb8AAauuYE8AAauysJcAAauuYEMAAau7AAEhqwABq65gWwABq8ADAAGrSwABIcMAAavKYE8AAavOsJcAAavKYEMAAavXAAEhqwABq8pgWwABq9wDAAGrSwABIccAAavmYE8AAavqsJcAAavmYEMAAavzAAEhqwABq+ZgWwABq/gDAAGrSwABIdMAAawCYEsAAawHAAEh1wABrAcAASJXAAGsAmBDAAGsEwABIlsAAawTAAEiawABrBMAASJjAAGsEwABIm8AAawCYFsAAawkAAMAAjE7AAGsLwABIpsAAawyYEsAAaw3AAIxOwABrDrLTwABrDqtzwABrDsAASKfAAGsOwABIqMAAaw7AAEPLwABrDsAASKnAAGsOwABIqsAAaw7AAEirwABrDJgQwABrF6xEwABrF6xDwABrF8AAjE7AAGsawABIrMAAaxrAAEitwABrGsAASK7AAGsawABIr8AAaxrAAEiwwABrGsAASLLAAGsXrD7AAGsXrEfAAGsXrEjAAGsXrErAAGsXrEbAAGsXrEXAAGsXrELAAGsXrEHAAGsXndzAAGsMmBbAAGsqAADAAIxPwABrLMAASLPAAGstmBLAAGsurx/AAGstmBPAAGswgLDAAGstmBbAAGsyAMAAayzAAEi1wABrNJgSwABrNcAASLbAAGs0mBDAAGs3qMzAAGs3wABIt8AAazSYFsAAazoAAMAAjFDAAGs8wABIuMAAaz2YEsAAaz7AAIxQwABrP8AAQ2PAAGs/stPAAGs/q3PAAGs9mBPAAGtDUcAAaz2YEMAAa0WsQcAAa0WscMAAa0WEB8AAaz2YFsAAa0kAwABrPMAASLrAAGtLmBLAAGtMUcAAa0uYEMAAa07AAEi8wABrS5gWwABrUADAAGs8wABIvsAAa1KYEsAAa1NRwABrUpgQwABrVcAASLHAAGtVwABIwMAAa1WUicAAa1KYE8AAa1nAAEi/wABrUpgWwABrWwDAAGs8wABIw8AAa12YEsAAa17AAIxQwABrX7LTwABrX6tzwABrX8AAQ2PAAGtfrwXAAGtewABIxMAAa16smsAAa16yqcAAa17AAEi9wABrXsAASLvAAGtewABIucAAa17AAEjBwABrXZgQwABra4QHwABra8AAjFDAAGttwABIyMAAa2vAAEjCwABrXZgWwABrcAAAwACMUcAAa3LAAEjKwABrc5gSwABrdMAAjFHAAGt1rFXAAGt1stPAAGt1q3PAAGt1wABIp8AAa3Wso8AAa3WvCMAAa3WvBcAAa3Wu/8AAa3WzI8AAa3WzJ8AAa3OYEMAAa4Cv1MAAa4DAAEjNwABrc5gWwABrgwDAAGtywABI2MAAa4WYEsAAa4bAAIxRwABrh6xVwABrh7LTwABrh6tzwABrh8AASKfAAGuHwABDY8AAa4fAAEiowABrh8AAQ8vAAGuHrwnAAGuHrvnAAGuHrwTAAGuHrvvAAGuFmBDAAGuTwABI2cAAa5OvM8AAa4WYFsAAa5YAAMAAjFLAAGuYmI7AAGuZmBLAAGuawABI4MAAa5rAAEjnwABrmsAASOrAAGuawABJzsAAa5rAAEnawABrmsAASdvAAGuawACMUsAAa6HAAEncwABrocAASd3AAGuhwABJ+sAAa6HAAEn8wABrocAASf3AAGuhwABJ/8AAa6HAAEoAwABrocAASgHAAGuhwABKAsAAa6HAAEoDwABrocAASgbAAGuhrTnAAGuhn73AAGuhrv3AAGuhwABKFsAAa6HAAEoXwABrocAAShrAAGuhwABKG8AAa6HAAEocwABrocAASh7AAGuhwABKH8AAa6HAAEoiwABrmsAASd7AAGuawABJ4MAAa5qiYMAAa5rAAEniwABrmqJiwABrmsAASeXAAGuawABJ58AAa5rAAEnowABrmsAASenAAGuawABJ68AAa5rAAEntwABrmsAASe/AAGuawABJ8cAAa5rAAEnzwABrmsAASfXAAGuawABJ98AAa5rAAEn5wABrmsAASf7AAGuawABKBMAAa5rAAEoHwABrmpxJwABrmsAASgnAAGuawABKC8AAa5rAAEoMwABrmsAASg3AAGuawABKDsAAa5rAAEoPwABrmsAAShDAAGuawABKEcAAa5rAAEoSwABrmsAAShPAAGuawABKFMAAa5rAAEoVwABrmsAAShjAAGuawABKGcAAa5rAAEodwABrmsAASiHAAGuZmBPAAGvdwABKI8AAa93AAEokwABr3cAASiXAAGvdwABKJ8AAa93AAEopwABr3cAASivAAGvdwABKLMAAa92vHMAAa92f5sAAa93AAIxSwABr56tzwABr58AAQ2PAAGvdwABKNsAAa93AAEo4wABr3cAASjrAAGvdwABKO8AAa920zcAAa93AAEo+wABr3cAASkDAAGvdwABKQcAAa93AAEqrwABr3cAASkbAAGvdwABKR8AAa93AAEprwABr3cAARKHAAGvdwABEkMAAa93AAEpIwABr3cAARJnAAGvdwABEmsAAa93AAESbwABr3cAARJzAAGvdwABEmMAAa93AAESSwABr3cAARKLAAGvdwABKs8AAa5mYFMAAbAGvHMAAa5mYEMAAbAPAAIxSwABsBMAASi/AAGwEwABKQsAAbATAAEpLwABsBMAASlfAAGwEwABKd8AAbATAAEp4wABsBMAASn/AAGwEwABKgcAAbATAAEpvwABsBMAASnTAAGwEwABKg8AAbATAAEpkwABsBMAASonAAGwEwABKW8AAbATAAEpowABsBMAASpDAAGwEwABKkcAAbATAAEqSwABsBMAASoXAAGwEwABKhMAAbATAAEqXwABsBMAASpXAAGwEwABKVsAAbATAAEqfwABsBMAASqLAAGwEwABKk8AAbAPAAEo0wABsA8AASjXAAGwDwABKRMAAbAPAAEpMwABsA8AASk7AAGwDwABKUMAAbAPAAEpRwABsA8AASlLAAGwDwABKVMAAbAPAAEpVwABsA8AASlnAAGwDwABKXMAAbAPAAEpfwABsA8AASmDAAGwDwABKYcAAbAPAAEpYwABsA8AASj3AAGwDwABKacAAbAPAAEptwABsA8AASm7AAGwDwABKcMAAbAPAAEpywABsA8AASnPAAGwDwABKdcAAbAPAAEpxwABsA8AASnzAAGwDwABKZsAAbAPAAEplwABsA8AASn3AAGwDwABKfsAAbAPAAER/wABsA8AASorAAGwDwABKT8AAbAPAAEqcwABsA8AAQ33AAGwDwABDe8AAbAPAAEpJwABsA5X6wABsA8AASqHAAGwDr0LAAGwDwABKo8AAbAPAAEqlwABsA8AASqbAAGwDwABKpMAAbAPAAEqnwABsA8AASqjAAGwDwABEgcAAbAPAAEqqwABsA8AASrXAAGwDwABIbcAAbAPAAEhywABsA8AASHPAAGwDwABKRcAAbAOvSsAAbAOvS8AAbAOvTcAAbAPAAEpdwABrmZgWwABsWADAAGuYwABKyMAAbFqYEsAAbFucScAAbFvAAErJwABsW8AASsrAAGxbwABKy8AAbFuvHMAAbFuf2cAAbFvAAErMwABsW4T0wABsW8AASs3AAGxbwABKzsAAbFtawABsWpgQwABsZ5iPwABsZ8AAStHAAGxnwABK08AAbGfAAErXwABsZ0/AAGxnwABK2MAAbGfAAIxSwABsbsAASs/AAGxnq5rAAGxnlUbAAGxntBHAAGxnvtzAAGxntAjAAGxntAvAAGxntAXAAGxntA7AAGxnlojAAGxntBnAAGxntBzAAGxntCLAAGxnnbDAAGxnsCDAAGxnvtrAAGxnvtvAAGxamBbAAGyAAMAAa5jAAErdwABsgpgSwABsg8AAjFLAAGyEwABK3sAAbITAAErfwABsg68cwABsg5/ZwABsg8AASuDAAGyCmBDAAGyKwABK1MAAbIrAAIxSwABsjMAASs/AAGyMwABK4cAAbIzAAEriwABsjMAASuXAAGyMwABK5sAAbIzAAErqwABsjLtxwABsirQRwABsir7cwABsirQFwABsiquawABsipVGwABsirQIwABsirQLwABsirQOwABsipaIwABsirQZwABsirQcwABsirQiwABsip2wwABsirAgwABsir7awABsir7bwABsgpgWwABspADAAGuYwABK68AAbKaYEsAAbKevHMAAbKeDesAAbKaYEMAAbKrAAEq2wABsqp8awABsqp2wwABsqpX8wABsqpYLwABsqqt6wABsqpYCwABsppgWwABssgDAAGuYwABK7MAAbLSYEsAAbLXA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NMAASLDAAG40wABL3cAAbjTAAEiywABuNMAAS97AAG4zrETAAG4zrEPAAG4zrD7AAG4zrEfAAG4zrEjAAG4zrErAAG4zrEbAAG4zrEXAAG4zrELAAG4zrEHAAG4zwABL28AAbjOd3MAAbiOYFsAAbkwAAMAAjFXAAG5OsAPAAG5PmBLAAG5Qg6vAAG5QwABL4cAAblDAAEviwABuUMAAS+PAAG5QwABL5MAAblDAAEvlwABuUMAAS+bAAG5QwABL58AAblDAAEvowABuUMAAjFXAAG5awABL6cAAbk+YFcAAblyrQcAAbk+YEMAAbl6rTcAAbl5BwABuXsAAjFXAAG5hwABL7MAAbmHAAEvtwABuYcAAS+7AAG5ewABL78AAbl7AAEvwwABuXrD9wABuXrD+wABuXq99wABuXrF6wABuXq9+wABuXrF7wABuXsAAS/HAAG5esfnAAG5ewABL8sAAbl6yBcAAbl7AAEvzwABuXsAAS/TAAG5ewABL9cAAbl6yCsAAbl7AAEv2wABuXrINwABuXsAAS/fAAG5ewABL+MAAbl7AAEv5wABuXq97wABuXsAAS/rAAG5er3zAAG5ewABL+8AAbl7AAEv8wABuXsAAS/3AAG5ewABL/sAAbl5PwABuXsAATADAAG5egtDAAG5eI8AAbk+YE8AAboWDicAAboWEEsAAbk+YFsAAbogAwABuiJU0wABuiMAAS+rAAG5OwABMCMAAboyYEsAAbo3AAIxVwABujsAATAnAAG6Or3DAAG6OwABMCsAAbo7AAEwLwABujJgQwABuk698wABuk697wABuk7IFwABuk7H5wABuk8AARbvAAG6Tr33AAG6TsebAAG6TT8AAbpMjwABujJgTwABunau8wABuna+MwABunZJbwABujJgWwABuoQDAAG6hwABMDADAAIxWwABupJgQwABupcAATCDAAG6kr5DAAG6nmBLAAG6owACMVsAAbqnAAEwSwABup5gQwABuq66CwABup5gWwABurQDAAG6kwABME8AAbq+YEsAAbrDAAIxWwABusa+SwABuscAATAnAAG6xKMAAbrCufMAAbq+YEMAAbrbAAIxWwABut8AATBXAAG63wABMF8AAbrfAAEwZwABut8AATBrAAG63wABMG8AAbrfAAEwcwABut8AATB3AAG63wABMGMAAbrauhsAAbrauqsAAbrauqcAAbrauqMAAbraup8AAbraupcAAbraupsAAbrauo8AAbraupMAAbrauosAAbrauocAAbrauoMAAbraun8AAbraunsAAbrauncAAbraunMAAbraum8AAbraulsAAbraul8AAbraumMAAbraumcAAbraumsAAbraulcAAbrauk8AAbraulMAAbrauksAAbraukcAAbraukMAAbraujsAAbrauj8AAbraujcAAbraujMAAbraui8AAbrauisAAbrauq8AAbrauicAAbrauh8AAbrauiMAAbraurMAAbq+YFsAAbucAwABu58AATBTAAG6kwABMH8AAbuqYEsAAbuuDFcAAbuuur8AAbuuursAAbuqYFsAAbu8AwABu7665AMAAjFfAAG7ywABMJsAAbvOYEMAAbvTAAEJOwABu85gWwABu9gDAAG7ywABMKcAAbviYEMAAbvnAAEwqwABu+JgWwABu+wDAAG7ywABMK8AAbv2YEMAAbv7AAEI1wABu/sAAQjfAAG79mBbAAG8BAMAAbvLAAEwswABvA5gQwABvBMAATC3AAG8DmBbAAG8GAMAAbvLAAEwuwABvCJgSwABvCYMdwABvCJgQwABvC8AATC3AAG8ImBbAAG8NAMAAbvLAAEwvwABvD5gQwABvEMAATDDAAG8QwABMMsAAbxDAAEwzwABvD5gWwABvFADAAG7ywABMNMAAbxaYEsAAbxeue8AAbxaYEMAAbxnAAEwwwABvGcAATDLAAG8ZwABMM8AAbxaYFsAAbx0AwABu8sAATDXAAG8fmBDAAG8gwABCT8AAbx+YFsAAbyIAAMAAjFjAAG8kmBHAAG8lwABMNsAAbySYEMAAbyfAAIxYwABvKMAATJ/AAG8nwABMoMAAbyfAAEyhwABvJMAATDjAAG8smBLAAG8tgLDAAG8twABMOcAAbyyYE8AAbzCDicAAbyyYEMAAbzIjwABvMpPXwABvLJgWwABvNcAAjFjAAG82gKjAAG8kwABMPMAAbziYEsAAbznAAEw9wABvOcAATD7AAG85wABMP8AAbznAAExAwABvOcAAjFjAAG8+wABMQcAAbzkpwABvOJgTwABvQbD/wABvQcAATELAAG9BsZ3AAG9BsZzAAG9BJ8AAbziYEMAAb0cjwABvR8AAjFjAAG9JwABMSMAAb0eBPMAAb0fAAExKwABvOJgWwABvTcAAjFjAAG9OgKjAAG8kvaXAAG9QmBLAAG9Rg6vAAG9RwABFvMAAb1HAAETdwABvUcAATEzAAG9RsZjAAG9Rq7zAAG9RsZnAAG9RsQDAAG9RsPnAAG9QmBPAAG9bwABMTcAAb1vAAExOwABvW8AATE/AAG9bwABMUMAAb1CYFcAAb2CrQcAAb1CYEMAAb2KrTcAAb2IjwABvYsAAjFjAAG9lwABMXcAAb2XAAExewABvZcAATF/AAG9lwABMksAAb2XAAEyVwABvYsAATGDAAG9iwABMgsAAb2LAAEyNwABvYsAATJPAAG9iwABMlMAAb1CYFsAAb3AAwABvcJJDwABvJMAATJbAAG9zmBLAAG90wACMWMAAb3XAAEyXwABvc5gTwABvd6q1wABvd5/OwABvd6iDwABvd4J3wABvd5/mwABvc5gQwABvfcAAjFjAAG9+wABMmMAAb36h0cAAb37AAEyZwABvfsAATJrAAG99wABMm8AAb33AAEycwABvfcAATJ3AAG9zmBbAAG+GAADAAIxZwABviMAATKTAAG+JmBLAAG+KklHAAG+KklvAAG+KlPXAAG+KwABGHsAAb4rAAEylwABvisAATKbAAG+KvgnAAG+KwABMp8AAb4mYFsAAb5MAwABviMAATKjAAG+VmBLAAG+WntXAAG+WwABMqcAAb5bAAEyqwABvlrbGwABvlsAATKvAAG+WwABGi8AAb5bAAIxawABvnYVywABvlsAATKzAAG+WwABMrcAAb5bAAEyuwABvlp7wwABvlsAATK/AAG+VmBPAAG+kgh7AAG+kn7zAAG+krzLAAG+kn+HAAG+kqYbAAG+kn87AAG+kb8AAb6SqtcAAb6SrssAAb6SgC8AAb6SvKMAAb6SvOsAAb6Sq9cAAb6SvDMAAb6SvKsAAb6SYp8AAb6SvHMAAb6SgE8AAb6SfwMAAb6SVCMAAb6RXwABvpKBgwABvpMAATMHAAG+kwABMwsAAb5WYEMAAb72uwcAAb72uwsAAb73AAEywwABvvcAATLHAAG+9wABMssAAb72wZcAAb72gKcAAb72CD8AAb73AAEyzwABvvbG3wABvvcAATLTAAG+9wABMtcAAb71PwABvvcAATLfAAG+9wABMuMAAb73AAEy5wABvvcAATLrAAG+9wABMu8AAb73AAEzAwABvvcAATL/AAG+9wABMw8AAb5WYFMAAb9NXwABvlZgWwABv1QDAAG+IwABMyMAAb9eYEMAAb9i+D8AAb9eYFsAAb9oAwABviMAATMnAAG/cmBLAAG/dwABMwcAAb93AAEzKwABv3Z/hwABv3cAAjFnAAG/hrFjAAG/hwABMzMAAb+HAAEzOwABv4a+SwABv4cAATNDAAG/hwABM0cAAb+HAAEzSwABv4cAATNPAAG/hwABM1MAAb+HAAEzVwABv3a8ywABv3bOGwABv3cAATMvAAG/dwABMzcAAb92CHsAAb92gC8AAb93AAEzPwABv3cAATMLAAG/dr6HAAG/dwABM1sAAb93AAEzXwABv3JgTwABv95+8wABv98AARh7AAG/3wABMpcAAb/fAAIxZwABv+6tzwABv+68BwABv+8AATNrAAG/7wABM2cAAb/vAAE65wABv96BgwABv3JgQwABwAsAAjFnAAHADwABM28AAcAPAAEzdwABwA8AATNjAAHADwABM38AAcAPAAEzrwABwA8AATOHAAHADwABM9MAAcAPAAEz7wABwA8AATQDAAHADwABNGsAAcAPAAE0YwABwA8AATRzAAHADwABNHsAAcAPAAE0EwABwA8AATSrAAHADwABNJcAAcAPAAE0kwABwA8AATS/AAHADwABNPsAAcAPAAE1AwABwA8AATW/AAHADwABNcMAAcAPAAE1uwABwA8AATbrAAHADwABNw8AAcAPAAE3EwABwA8AATcXAAHADwABNwcAAcAPAAE3CwABwA8AATcnAAHADwABN2MAAcAPAAE3cwABwA8AATe3AAHADwABN78AAcAPAAE3wwABwA8AATfLAAHADwABN88AAcAPAAE30wABwA8AATfXAAHADwABN9sAAcAPAAE33wABwA8AATXzAAHADwABNWcAAcAPAAE4fwABwA8AATi7AAHADwABOQcAAcAPAAE1UwABwA8AATXvAAHADwABOX8AAcAPAAE4KwABwA8AATnDAAHADwABN6sAAcAPAAE3swABwA8AATUzAAHADwABOe8AAcAPAAE1kwABwA8AATRfAAHADwABOmMAAcAPAAE6dwABwA8AATQLAAHADwABOmcAAcAPAAE6nwABwA8AATpvAAHADwABOsMAAcAPAAE6cwABwA8AATWbAAHADwABOmsAAcAPAAE61wABwA8AATrbAAHADwABOu8AAcAPAAE6MwABwA8AATVrAAHACnvHAAHACwABM4sAAcALAAEywwABwAsAATOTAAHACq8nAAHACwABNIcAAcALAAEzpwABwAsAATOXAAHACuI/AAHACwABNO8AAcALAAE00wABwAsAATOrAAHACv3fAAHACwABM4MAAcALAAE0JwABwAsAATQrAAHACwABM8cAAcALAAEz4wABwApdPwABwApWhwABwApWewABwApWnwABwApWswABwApWjwABwApWXwABwAsAATWXAAHAClc7AAHAClbzAAHAClcDAAHACwABMv8AAcAKVtsAAcAKVuMAAcAKVzMAAcALAAE01wABwApVywABwAsAATa7AAHACwABNq8AAcALAAE2wwABwApWwwABwAsAATbHAAHAClbTAAHAClbLAAHAClcrAAHAClcPAAHAClVLAAHAClU3AAHAClXbAAHAClXnAAHAClXvAAHAClXTAAHAClX/AAHAClXzAAHAClYnAAHAClYvAAHAClY7AAHAClZDAAHAClYHAAHAClTDAAHAClTLAAHAClR/AAHAClRXAAHAClSHAAHAClSPAAHAClSXAAHAClSfAAHAClS/AAHAClRfAAHACleXAAHAClZnAAHAClZvAAHAClUDAAHACwABN+sAAcALAAE35wABwAsAATfjAAHACwABODcAAcALAAE4PwABwAsAAThHAAHACwABOE8AAcALAAE4VwABwAsAAThbAAHACwABOF8AAcALAAE4ZwABwAsAAThvAAHACwABOHcAAcALAAE4LwABwAsAATh7AAHAClP/AAHAClefAAHAClZXAAHAClUbAAHAClTzAAHAClS3AAHAClT7AAHAClULAAHAClW7AAHACwABOecAAcAKVh8AAcAKV3sAAcAKVk8AAcAKVhcAAcAKVg8AAcAKVScAAcAKVVsAAcAKV0cAAcAKV2MAAb9yYFsAAcLUAwABviMAATr3AAHC3mBLAAHC4wABNC8AAcLiVaMAAcLjAAE0dwABwt5gWwABwvADAAG+IwABOvsAAcL6YEsAAcL+ST8AAcL/AAE6ywABwv8AATrPAAHC/wABOtMAAcL/AAE6xwABwv8AATKnAAHC/wABOusAAcL6YFsAAcMcAwABviMAATr/AAHDJmBLAAHDKwABOwMAAcMrAAE7BwABwysAATsLAAHDKwABOw8AAcMrAAE6SwABwysAATo/AAHDKgrnAAHDKwABOxMAAcMrAAE7FwABwysAATsbAAHDJmBDAAHDVwABOx8AAcNXAAE7IwABw1cAAQO3AAHDVl0/AAHDVlc7AAHDVlYfAAHDVwACMWcAAcNzAAE7MwABw1ZW8wABw1ZXAwABw1ZW2wABw1ZW4wABw1ZXRwABw1ZXYwABw1ZWVwABw1ZXnwABw1ZT/wABw1ZVSwABw1ZT0wABw1ZWwwABwyZgTwABw6sAATsnAAHDJmBbAAHDsAMAAb4jAAE7RwABw7pgSwABw77KPwABw74K5wABw78AATo3AAHDvwABOksAAcO/AAE7EwABw78AATsXAAHDvwABO0sAAcO/AAE7GwABw7pgQwABw+MAATsfAAHD4wABOyMAAcPjAAEDtwABw+MAATtPAAHD4l0/AAHD4lc7AAHD4lYfAAHD4lazAAHD4laPAAHD4lafAAHD4lXTAAHD4lR/AAHD4lSPAAHD4lSHAAHD4lSXAAHD4lRXAAHD4lYPAAHD4lTDAAHD4lULAAHD4lUDAAHD4lTzAAHD4wACMWcAAcQ7AAE7WwABw+JVywABw+JXlwABw+JW8wABw+JXAwABw+JW2wABw+JW4wABw+JXRwABw+JXYwABw+JXMwABw+JWVwABw+JXnwABw+JT/wABw+JVSwABw+JT0wABw+JWwwABw7pgTwABxH8AATsnAAHDumBbAAHEhAMAAb4jAAE7bwABxI5gSwABxJMAATtzAAHEkwABO3cAAcSTAAE7ewABxJMAATt/AAHEkwABO4MAAcSTAAE7hwABxJMAATuLAAHEkwABO48AAcSTAAE7kwABxJMAATuXAAHEkwABO5sAAcSSBfcAAcSTAAE7nwABxJMAATZzAAHEkwABO6MAAcSTAAE7pwABxJMAATurAAHEjmBDAAHE2wACMWcAAcTfAAE7rwABxN8AATu3AAHE3wABO78AAcTbAAE2AwABxNsAATX/AAHE2rqbAAHE2wABNgcAAcSOYFsAAcT8AwABviKMUwABxQZgSwABxQsAAjFnAAHFDr5LAAHFBmBPAAHFFg+bAAHFBmBDAAHFHwABO+sAAcUGYFsAAcUkAwABviMAATvzAAHFLmBDAAHFMpQ7AAHFMl1vAAHFMlOnAAHFMlPLAAHFMl1nAAHFMlYfAAHFLmBbAAHFTAMAAb4jAAE79wABxVZgWwABxVgAAwACMW8AAcVjAAE8AwABxWZgQwABxWsAATwHAAHFawABPAsAAcVrAAE8DwABxWsAATwTAAHFawABPBcAAcVmYFsAAcWAAAMAAjFzAAHFimBDAAHFjwACMXMAAcWTAAE92wABxYsAATwnAAHFmmBLAAHFng6vAAHFnwACMXMAAcWmvksAAcWnAAE8LwABxacAATwzAAHFpwABPDcAAcWnAAE8OwABxZpgVwABxb6tBwABxZpgQwABxcatNwABxccAARYfAAHFxwABNE8AAcXHAAE1twABxccAARiHAAHFmmBbAAHF3AMAAcWLAAE8XwABxeZgSwABxesAAjFzAAHF7r5LAAHF7r5XAAHF7rFXAAHF7wABPC8AAcXvAAE8MwABxe8AATw3AAHF7wABPDsAAcXmYEMAAcYPAAIxcwABxhMAATxjAAHGEwABPKcAAcYPAAE8gwABxeZgWwABxiADAAHFiwABPL8AAcYqYEsAAcYuDq8AAcYvAAE8xwABxi7F8wABxi8AATyXAAHGLwABFhcAAcYqYEMAAcZHAAE8zwABxkcAATzTAAHGRI8AAcZHAAE1FwABxkatNwABxipgVwABxl6tBwABxipgWwABxmZJDwABxmZMWwABxYsAATzfAAHGcmBLAAHGdg6vAAHGdgefAAHGcmBPAAHGgwABNFMAAcZyYFcAAcaKrQcAAcZyYEMAAcaSrTcAAcZyYFsAAcaaSQ8AAcaaTFsAAcWLAAE85wABxqZgSwABxqoOrwABxqsAATzvAAHGpmBPAAHGtwABPPMAAcamYFcAAca+rQcAAcamYEMAAcbGrTcAAcamYFsAAcbOSQ8AAcbOTFsAAcWLAAE89wABxtpgSwABxt4OrwABxt6u1wABxt8AARl7AAHG3wABPP8AAcbexfMAAcbfAAE5pwABxt8AAT0DAAHG2mBXAAHG/q0HAAHG2mBDAAHHBq03AAHHBwABOa8AAccHAAEWIwABxtpgTwABxxcAAT0PAAHHFwABPRsAAccWsD8AAcbaYFsAAccmSQ8AAccnAAE9BwABxYsAAT0fAAHHMmBLAAHHNg6vAAHHMmBXAAHHPq0HAAHHMmBDAAHHRq03AAHHRI8AAccyYE8AAcdSsD8AAccyYFsAAcdYAwABxYsAAT0rAAHHYmBLAAHHZqSLAAHHYmBPAAHHbgLDAAHHbg4nAAHHYmBDAAHHeQcAAcd4jwABx2JgWwABx4QDAAHFiwABPTMAAceOYEsAAceSDq8AAceTAAEp2wABx45gVwABx56tBwABx45gQwABx6atNwABx45gTwABx68AASkPAAHHjmBbAAHHtAMAAce2SQ8AAcWLAAE9OwABx8JgSwABx8YOrwABx8cAARfrAAHHxlG7AAHHxwABPUMAAcfGUhsAAcfCYFcAAcferQcAAcfCYEMAAcfmrTcAAcfCYE8AAcfuUm8AAcfuqgsAAcfu64cAAcfudQMAAcfuUh8AAcfuUpsAAcfCYFsAAcgIAwABxYsAAT1HAAHIEmBLAAHIFg6vAAHIEmBXAAHIHq0HAAHIEmBDAAHIJq03AAHIJI8AAcgSYE8AAcgysD8AAcgSYFsAAcg4AwABxYsAAT1PAAHIQmBLAAHIRg6vAAHIRwABK98AAchCYFcAAchSrQcAAchCYEMAAcharTcAAchCYE8AAchiUrMAAchCYFsAAchoAwABxYsAAT1XAAHIcmBLAAHIdg6vAAHIduuHAAHIcmBXAAHIgq0HAAHIcmBDAAHIiq03AAHIcmBbAAHIkAMAAcWLAAE9XwAByJpgSwAByJ4OrwAByJ4S+wAByJpgVwAByKqtBwAByJpgQwAByLKtNwAByLCPAAHImmBPAAHIvghzAAHIvg7LAAHImmBbAAHIyAMAAcWLAAE9cwAByNJgSwAByNcAARfrAAHI1wABPXcAAcjSYE8AAcjjAAE9ewAByNJgQwAByOq+gwAByNJgWwAByPADAAHFiwABPYMAAcj6YEsAAcj/AAIxdwAByQKTnwAByPpgTwAByQrXgwAByPpgQwAByRKp+wAByPpgWwAByRgDAAHFiwABPYcAAckiYE8AAckm14MAAckiYEMAAckurusAAckiYFsAAck0AwABxYsAAT2PAAHJPmBLAAHJQg6vAAHJQlN3AAHJQteDAAHJQwABPZcAAck+YFcAAclWrQcAAck+YEMAAclerTcAAcleqfcAAcleqfsAAck+YFsAAclsAwABxYsAAT2bAAHJdmBLAAHJeg6vAAHJewACMXMAAcmCPDMAAcl2YFcAAcmKrQcAAcl2YEMAAcmSrTcAAcmSqgMAAcmTAAE9rwAByXZgTwAByaMAAT2XAAHJdmBbAAHJqAMAAcWLAAE9uwABybJgSwABybYOrwABybYS+wABybYIcwABybYOywABybJgVwABycqtBwABybJgQwABydKtNwABydCPAAHJsmBbAAHJ3AMAAcWLAAE9xwAByeZgSwAByeoOrwAByeoS+wAByeZgVwAByfatBwAByeZgQwAByf6tNwAByfyPAAHJ5mBPAAHKCghzAAHKCg7LAAHJ5mBbAAHKFAMAAcWLAAE91wAByh5gQwAByiMAAQ6PAAHKIwABDpMAAcojAAEOlwAByiMAATxvAAHKIwABPHMAAcojAAEOmwAByiMAAQ6fAAHKHmBbAAHKQAADAAIxewABykpgQwAByk8AAT5zAAHKTpmfAAHKTwABPncAAcpPAAE+ewAByksAAT3nAAHKYmBPAAHKZqrXAAHKZlQjAAHKZn+bAAHKYmBDAAHKdwABM3MAAcp3AAE96wAByncAAT3vAAHKdqn3AAHKdqgHAAHKdwABPfMAAcp3AAE3rwABynZrLwAByncAATO/AAHKdoynAAHKducDAAHKdmtLAAHKdwABPfcAAcp3AAE3pwAByncAAQ47AAHKdmI/AAHKdwABOV8AAcp3AAE5TwAByncAATk3AAHKdwABKRMAAcp3AAEJbwAByncAATV3AAHKdwABPfsAAcp3AAE9/wAByncAARfvAAHKdr6DAAHKdwABO+8AAcp2aycAAcp3AAE5RwAByncAATV/AAHKdwABNDsAAcp3AAE0/wAByncAATyTAAHKdwABGBMAAcpiYFsAAcsAAwAByksAAT4DAAHLCmBDAAHLDr6XAAHLDr6bAAHLDr6fAAHLDr6jAAHLDr6nAAHLDrkfAAHLDrjzAAHLDrj7AAHLDrj3AAHLDr6vAAHLDr6zAAHLDr63AAHLDr67AAHLDr6/AAHLDr7DAAHLCmBbAAHLTAMAAcpLAAE+CwABy1ZgTwABy1qUMwABy1ZgQwABy2MAATRDAAHLYwABNS8AActjAAEYfwABy2MAARiDAAHLYwABNs8AActjAAE20wABy2MAATbfAAHLYwABNwMAActjAAE28wABy2MAATv7AAHLYwABNjMAActjAAE1rwABy2MAATXrAAHLYwABNiMAActirTcAActWYFsAAcugAwABykrZ6wABy6pgSwABy6yfAAHLrwACMXsAAcu0owABy6ynAAHLrwABPg8AAcuuYUMAAcuvAAEZSwABy68AAQXHAAHLrwABGWMAAcuuokMAAcuvAAEZcwABy6pgQwABy9yPAAHLqmBbAAHL5AMAAcpLAAE+LwABy+5gTwABy/IIcwABy/IOywABy/IS+wABy+5gVwABzAKtBwABy+5gQwABzAqtNwAByksAAT43AAHMEmBLAAHMFJ8AAcwXAAIxewABzByjAAHMFKcAAcwXAAE+DwABzBavBwABzBaQawABzBJgQwABzDSPAAHMEmBbAAHMPAMAAcpLAAE+RwABzEZgSwABzEoOrwABzEoOywABzEZgVwABzFatBwABzEZgQwABzF6tNwABzFyPAAHMRmBPAAHMahL7AAHMaghzAAHMRmBbAAHMdAMAAcpLAAE+VwABzH5gSwABzIIOrwABzIIOywABzIIIcwABzH5gVwABzJKtBwABzH5gQwABzJqtNwABzJiPAAHMfmBPAAHMphL7AAHMfmBbAAHMrAMAAcpLAAE+YwABzLZgTwABzLoIcwABzLoOywABzLoS+wABzLZgVwABzMqtBwABzLZgQwABzNKtNwAByksAAT5nAAHM2mBLAAHM3g6vAAHM3g7LAAHM2mBXAAHM6q0HAAHM2mBDAAHM8q03AAHM8I8AAczaYE8AAcz+EvsAAcz+CHMAAczaYFsAAc0IAAMAAjF/AAHNEwABPosAAc0WYEMAAc0arusAAc0WYFsAAc0gAwABzRMAAT6PAAHNKmBLAAHNLg6vAAHNLwABPpcAAc0vAAE+mwABzS8AARKHAAHNLwABPp8AAc0vAAE+owABzS8AAT6rAAHNLwABPrMAAc0vAAE+uwABzS8AAT7DAAHNLwABPssAAc0vAAE+0wABzS2/AAHNLn87AAHNLwACMX8AAc1qrc8AAc1qy08AAc1rAAE+2wABzWsAAT7fAAHNawABDysAAc1q5jsAAc1rAAE+4wABzWsAAT73AAHNawABPvsAAc1rAAE+/wABzWsAAT8DAAHNawABPwcAAc0uv78AAc0uELMAAc0uUOMAAc0uUPsAAc0ujg8AAc0uUN8AAc0ue0sAAc0uq+cAAc0vAAE+5wABzS8AAT7rAAHNLwABPu8AAc0vAAE+8wABzS7QwwABzS6r7wABzS6iDwABzSpgQwABzdqtNwABzdq+awABzdp/nwABzdsAAjF/AAHN6wABP7cAAc3rAAE/vwABzesAAT/LAAHN6wABP9cAAc3rAAE/0wABzeqn3wABzesAAUAzAAHN6wABQDcAAc3rAAFAOwABzesAAUBDAAHN6wABQEsAAc3rAAFATwABzesAAUBTAAHN6wABQFcAAc3rAAFAWwABzesAAUBfAAHN6wABQGMAAc3rAAFAZwABzesAAUBrAAHN6wABQKcAAc3rAAFAvwABzesAAUFHAAHN6wABQVMAAc3rAAFBawABzesAAUFLAAHN6wABQYMAAc3rAAFBlwABzesAAUGHAAHN6wABQZsAAc3rAAFBewABzesAAUGnAAHN2qfzAAHN2qfvAAHN2qnLAAHN2qf/AAHN2qgHAAHN2msnAAHN2mtLAAHN2wABP88AAc3bAAE/3wABzdsAAT33AAHN2msvAAHN2wABN6cAAc3ajKcAAc3bAAFABwABzdsAATO/AAHN2ucDAAHN2wABM3MAAc3bAAE97wABzdsAAT3/AAHN2wABPesAAc3aqfcAAc3bAAFAJwABzdr90wABzdr9KwABzdqp5wABzdqp8wABzdsAARUPAAHN2v0nAAHN2wABQG8AAc3bAAEU/wABzdr92wABzdsAAUB3AAHN2wABQHsAAc3bAAE1dwABzdsAARgTAAHN2mI/AAHN2wABPfMAAc3bAAE3rwABzdsAAUCTAAHN2wABQIsAAc3bAAFAjwABzdsAAUCfAAHN2wABOV8AAc3bAAE5TwABzdsAATk3AAHN2wABKRMAAc3bAAFA2wABzdsAAQlvAAHN2wABQOcAAc3bAAEOOwABzdsAAUDvAAHN2wABQPMAAc3bAAFA9wABzdsAAT9vAAHN2wABQPsAAc3bAAFA/wABzdsAAUEDAAHN2wABQQcAAc3bAAFBCwABzdsAAUEPAAHN2wABQRMAAc3bAAFBFwABzdqRVwABzdsAAT8vAAHN2wABPzsAAc3bAAE/SwABzdqqPwABzdq+gwABzdsAATvvAAHN2wABP7sAAc3bAAE1fwABzdsAAT+nAAHN2wABP8cAAc3bAAE/9wABzdsAAT+fAAHN2wABP/sAAc3bAAE/2wABzdsAAT/zAAHN2wABNDsAAc3bAAEX7wABzdsAAT37AAHN2q7rAAHN2qo7AAHN2qo3AAHN2wABPJMAAc3bAAFBcwABzdsAATT/AAHN2wABOUcAAc0qYE8AAc/KVCMAAc/Kf5sAAc/KqtcAAc/LAAIxfwABz9sAAT+bAAHP2wABP6MAAc/KWRcAAc/Kl2cAAc/LAAFBIwABzSpgWwABz/ADAAHP8q0HAAHNEwABQbsAAc/+YEsAAdACrAsAAc/+YE8AAdAKdLsAAdAKqcMAAdAKf9sAAdAKELMAAc/+YEMAAdAeY0MAAdAeqecAAdAeqAMAAdAeqesAAdAeUm8AAdAeqe8AAdAeqkMAAdAeqkcAAdAeqfMAAdAeqksAAdAeqAcAAdAeqfcAAdAeqfsAAdAeqlMAAdAeqk8AAdAeqgMAAdAeqf8AAdAeqgcAAdAep/8AAdAep/sAAdAeqc8AAdAeqeMAAdAeqdMAAdAeqjcAAdAeqdcAAdAeqdsAAdAeqjsAAdAeqj8AAdAeqccAAdAep/MAAdAep+8AAdAef88AAdAef58AAdAeqgsAAc/+YFsAAdCoAwABzRMAAUHjAAHQsmBLAAHQtn+bAAHQtqrXAAHQtn87AAHQtqIPAAHQtwACMX8AAdDKsVcAAdCyYE8AAdDSCd8AAdCyYFsAAdDYAwABzRMAAUHnAAHQ4mBLAAHQ5wACMX8AAdDqvksAAdDrAAFB6wAB0OsAAUHvAAHQ4mBDAAHQ+wACMX8AAdD/AAFAKwAB0OJgWwAB0QQDAAHNEwABQfMAAdEOYEsAAdETAAIxfwAB0Ra+SwAB0RcAAUHrAAHRDmBPAAHRIqrXAAHRIlQjAAHRIn87AAHRItJPAAHRDmBDAAHRNv3TAAHRNtCnAAHRNtEjAAHRNtEzAAHRNtInAAHRDmBbAAHRTAMAAc0TAAFB+wAB0VZgSwAB0VsAAjF/AAHRXhUTAAHRXmnXAAHRXwABA2MAAdFeid8AAdFek58AAdFWYEMAAdF3AAE/IwAB0XZ/0wAB0XcAAT97AAHRdwABP38AAdF3AAE/gwAB0XcAAT+HAAHRdn/PAAHRdwABP48AAdF3AAE/kwAB0Xb8gwAB0Xb/zwAB0Xb/0wAB0Xb/1wAB0Xb/2wAB0Xb/3wAB0VZgWwAB0bQAAwACMYMAAdG/AAFCLwAB0cJgSwAB0cYOrwAB0ca8owAB0ca86wAB0car1wAB0ca5MwAB0ccAAjGDAAHR3wABQjcAAdHfAAFCOwAB0d8AAUI/AAHR3wABQkMAAdHfAAFCRwAB0ca3IwAB0cbNLwAB0cbNdwAB0cbNewAB0cbNQwAB0ca8pwAB0cax7wAB0caXZwAB0casCwAB0ca8qwAB0cauowAB0caAJwAB0cbLUwAB0cbOGwAB0caiBwAB0cJgVwAB0jKtBwAB0cJgQwAB0jqtNwAB0jq1pwAB0jq32wAB0jq33wAB0jpnVwAB0jq3HwAB0jq3MwAB0jq3GwAB0jq3JwAB0jq4awAB0jq2AwAB0jq3FwAB0jq3NwAB0jsAAjGDAAHScwABQo8AAdJzAAFCWwAB0nMAAUKHAAHSOrcrAAHSOs4jAAHSOq9jAAHSOwABQpMAAdI6tEcAAdI6vesAAdI6txMAAdHCYE8AAdKef5sAAdKeqtcAAdKesiMAAdKegH8AAdKephsAAdHCYFsAAdK0AwAB0b8AAUKbAAHSvmBLAAHSwqwLAAHSvmBDAAHSywACMYMAAdLPAAFCnwAB0s8AAUKjAAHSywABHwcAAdLLAAEfEwAB0ssAAR8LAAHSywABHw8AAdLLAAEfFwAB0ssAAR8bAAHSywABHx8AAdLLAAEfIwAB0r5gWwAB0vgDAAHRvwABQs8AAdMCYEsAAdMHAAIxgwAB0wq+VwAB0wJgQwAB0xL/5wAB0wJgWwAB0xgAAwACMYcAAdMiYEcAAdMnAAFC0wAB0yJgQwAB0y76lwAB0y8AAUPfAAHTIwABPCMAAdM6YEsAAdM/AAIxhwAB00K+SwAB00MAARRrAAHTQwABFG8AAdNCvlcAAdNDAAFC1wAB00KxVwAB00MAAULbAAHTOmBPAAHTYwACMYcAAdNmy08AAdNmrc8AAdM6YEMAAdNyvmMAAdNzAAIxhwAB03sAAULjAAHTewABQ0sAAdN7AAFC5wAB03sAAULrAAHTewABQysAAdN7AAFDQwAB03MAATy3AAHTOmBbAAHTmAMAAdMjAAFDcwAB06JgQwAB06cAATxzAAHTpwABDo8AAdOnAAEOkwAB06cAATxvAAHTpwABDpsAAdOnAAEOlwAB06cAAQ6fAAHTomBbAAHTxAMAAdMjAAFDdwAB085gSwAB09K8qwAB09MAAUMjAAHT0wABQxsAAdPOYEMAAdPjAAE8cwAB0+MAAQ6PAAHT4wABDpMAAdPjAAE8bwAB0+MAAQ6bAAHT4wABDpcAAdPjAAEOnwAB085gWwAB1AADAAHTIwABQ3sAAdQKYEMAAdQPAAFDZwAB1A8AAULzAAHUDwABCeMAAdQPAAFDRwAB1A8AAQn/AAHUDwABQ38AAdQPAAFDDwAB1A8AAUMHAAHUDwABQ4MAAdQPAAFDOwAB1A8AAUNPAAHUDwABQwsAAdQPAAFDEwAB1ApgWwAB1EQDAAHTIwABQ48AAdROYEsAAdRTAAIxhwAB1Fa+cwAB1E5gQwAB1F8AAUNHAAHUXwABQ5MAAdRfAAFDZwAB1F8AAULzAAHUXwABCeMAAdRfAAFDlwAB1F8AAUObAAHUXwABCf8AAdROYFsAAdSAAwAB0yMAAUOvAAHUimBLAAHUjwABQ1cAAdSPAAIxhwAB1JcAAUOzAAHUimBDAAHUnwABQ7cAAdSefGsAAdSeWiMAAdSeV9MAAdSeV/MAAdSeWC8AAdSeresAAdSeWAsAAdSerecAAdSeV9sAAdSerdMAAdSKYFsAAdTMAwAB0yMAAUPHAAHU1mBLAAHU2wABQ5MAAdTbAAFDywAB1NZgQwAB1ObQRwAB1ObQIwAB1ObQLwAB1ObQFwAB1ObQOwAB1Ob7awAB1Ob7cwAB1OauawAB1OZaIwAB1ObQZwAB1ObQcwAB1ObQiwAB1OZ2wwAB1ObAgwAB1Ob7bwAB1OZVGwAB1OcAAjGHAAHVKwABQ88AAdTWYFsAAdUwAAMAAjGLAAHVOmBDAAHVPwABRKsAAdU7AAFD9wAB1UZgSwAB1UoOrwAB1UsAAjGLAAHVUwABQ/8AAdVGYFcAAdVarQcAAdVGYEMAAdVirTcAAdVjAAEYDwAB1WMAATy7AAHVRmBbAAHVcAMAAdVySQ8AAdU7AAFEEwAB1X5gSwAB1YIOrwAB1YMAAjGLAAHViwABRBsAAdWLAAFEHwAB1YsAAUQjAAHViwABRCcAAdWLAAFEKwAB1X5gQwAB1aKtNwAB1aMAAjGLAAHVqwABRD8AAdWi/+cAAdWjAAE2zwAB1aMAATbTAAHVowABNvMAAdWjAAE7+wAB1aMAATYzAAHVowABNt8AAdWjAAE3AwAB1aMAATWvAAHVowABNesAAdWjAAE2IwAB1aMAATRDAAHVowABNS8AAdWjAAEYfwAB1aMAARiDAAHVfmBPAAHV7pQzAAHVfmBbAAHV9AMAAdX2rQcAAdU7AAEyiwAB1gJgSwAB1gcAAURPAAHWBuM3AAHWBklvAAHWBwABREMAAdYHAAFERwAB1gJgQwAB1h8AAjGLAAHWIwABRFMAAdYjAAFEXwAB1h5dPwAB1h8AAURjAAHWHwABRGcAAdYeVtMAAdYeVysAAdYeVw8AAdYCYFsAAdZEAwAB1TsAAURvAAHWTmBLAAHWUg6vAAHWUqwbAAHWUo5TAAHWUwACMYsAAdZjAAFEdwAB1lMAAURXAAHWUwABRFsAAdZS45MAAdZS48MAAdZOYFcAAdZ6rQcAAdZOYEMAAdaCrTcAAdaDAAE2lwAB1oCPAAHWTmBPAAHWkmKXAAHWTmBbAAHWmAMAAdU7AAFElwAB1qJgSwAB1qYHTwAB1qbG9wAB1qbjkwAB1qbjwwAB1qJgTwAB1roCwwAB1qJgQwAB1sCPAAHWomBbAAHWyAMAAdU7AAFEowAB1tJgSwAB1tYCwwAB1tasGwAB1tcAAUQzAAHW0mBPAAHW5wACMYsAAdbq/ncAAdbSYEMAAdbwjwAB1tJgWwAB1vgDAAHVOwABRKcAAdcCYEsAAdcGDssAAdcHAAIxiwAB1w48MwAB1wJgQwAB1xcAATNzAAHXAmBPAAHXHteDAAHXAmBbAAHXJAADAAIxjwAB1y8AAQwPAAHXMmBPAAHXNwABDUMAAdc3AAEjPwAB1zYR8wAB1zcAASNLAAHXNwABI08AAdc3AAEjUwAB1zcAASNfAAHXNwABDMsAAdc2vKMAAdc3AAEQJwAB1zJgWwAB12AAAwACMZMAAddqYEMAAddvAAFE9wAB128AAjGTAAHXdwABRQcAAdd3AAFFCwAB13cAAUUPAAHXdwABRRMAAdd3AAFFFwAB13cAAUUbAAHXdwABRR8AAdd3AAFFIwAB128AAUUnAAHXawABRLMAAdeeYEsAAdejAAIxkwAB16cAAUS3AAHXpwABRLsAAdenAAFEvwAB16cAAUTDAAHXpwABRMcAAdenAAFEywAB16cAAUTPAAHXpwABRNMAAdenAAFE1wAB16cAAUTbAAHXnmBDAAHX0wABRN8AAdfTAAFE4wAB19MAAUTnAAHX0wABMoMAAdfTAAEyhwAB19L2ywAB19L20wAB19L2zwAB19L21wAB19MAAUTrAAHX0vdfAAHX0vdjAAHX0vdnAAHX0vdrAAHX0ve3AAHX0vfLAAHXnmBbAAHYFAMAAddrAAFE7wAB2B5gSwAB2CKBqwAB2CMAAQx/AAHYHmBPAAHYLgLDAAHYHmBDAAHYNI8AAdgeYFsAAdg8AAMAAjGXAAHYRr7PAAHYSmBLAAHYTwABNMsAAdhPAAE8QwAB2E8AATybAAHYSmBDAAHYXI8AAdhKYFsAAdhkAwAB2EcAAUUvAAHYbmBLAAHYcwABPMcAAdhzAAE8ywAB2HMAATyXAAHYcwABQV8AAdhzAAEWFwAB2HMAATx/AAHYcwABPHsAAdhzAAE8dwAB2G5gQwAB2JSPAAHYbmBbAAHYnAMAAdieTFsAAdifAAFFMwAB2EcAAUVDAAHYrmBLAAHYswACMZcAAdi2qCMAAdiuYE8AAdi/AAE0UwAB2K5gWwAB2MQDAAHYxwABRUcAAdhHAAFFSwAB2NJgSwAB2NcAATzvAAHY0mBPAAHY3wABPPMAAdjSYFsAAdjkAwAB2EcAAUVPAAHY7mBLAAHY8gLDAAHY8v6jAAHY7mBbAAHY/AMAAdhHAAFFUwAB2QZgSwAB2QifAAHZCwACMZcAAdkQowAB2QinAAHZCwABRVcAAdkLAAFFXwAB2QsAAQZnAAHZCr6rAAHZCpwLAAHZCwABRXMAAdkLAAFFewAB2QsAAUWDAAHZCwABRYsAAdkLAAFFkwAB2QsAAUWbAAHZCwABRaMAAdkLAAFFqwAB2QsAAUWzAAHZCwABRbsAAdkLAAFFwwAB2QZgQwAB2VyPAAHZBmBbAAHZZAMAAdhHAAFFywAB2W5gSwAB2XIIcwAB2XJJbwAB2XKrLwAB2XKYNwAB2XMAAQZzAAHZcwABRVcAAdlzAAFFXwAB2XMAAQZnAAHZcr6rAAHZcpwLAAHZcwABRXMAAdlzAAFFuwAB2W5gTwAB2aYOJwAB2W5gQwAB2a0HAAHZrI8AAdluYFsAAdm7AAIxlwAB2b8AAUXPAAHZuwABRZsAAdm7AAFFowAB2bsAAUWrAAHZuwABRbMAAdm7AAFFewAB2bsAAUWDAAHZuwABRYsAAdm7AAFFkwAB2bsAAUXDAAHYRwABRecAAdnqYEsAAdnsnwAB2e8AAjGXAAHZ9KMAAdnspwAB2e5k8wAB2e5MxwAB2e52PwAB2e5JPwAB2epgQwAB2hCPAAHZ6mBbAAHaGAMAAdhHAAFF+wAB2iJgSwAB2iYHnwAB2iYIXwAB2iYIcwAB2iawSwAB2iJgVwAB2jgDAAHaImBDAAHaQlA7AAHaQlA/AAHaQQcAAdpAjwAB2iJgTwAB2lYOJwAB2iJgWwAB2l5JDAMAAjGbAAHaZmBDAAHaawACMZsAAdpvAAFIZwAB2mcAAUYXAAHadmBDAAHaewABRhsAAdp7AAFGHwAB2nsAAUYjAAHaewABRicAAdp7AAFGKwAB2nsAAUYvAAHaewABRjMAAdp7AAFGNwAB2nsAAUY7AAHaewABRj8AAdp7AAFGQwAB2nsAAUZHAAHaewABRksAAdp7AAEOtwAB2nsAAUZTAAHaewABRlcAAdp7AAFGWwAB2nsAAUZfAAHaewABRmMAAdp7AAFGZwAB2nqxzwAB2nsAAUZrAAHaewABRm8AAdp7AAFGcwAB2nsAAUZ3AAHaewABRnsAAdp7AAFGfwAB2nsAAUaDAAHaewABRocAAdp7AAEi8wAB2nsAAUaLAAHaewABRo8AAdp7AAFGkwAB2nsAAUaXAAHaewABRpsAAdp7AAFGnwAB2nsAAUajAAHaewABRqcAAdp6y6MAAdp7AAFGqwAB2nrLgwAB2nsAAUavAAHaewABRrMAAdp7AAFGtwAB2nsAAUa7AAHaewABRr8AAdp7AAFGwwAB2nsAAUbHAAHaewABRssAAdp7AAFGzwAB2nsAAUbTAAHaewABDOsAAdp7AAFG1wAB2nsAAUbbAAHaewABRt8AAdp7AAFG4wAB2nsAAUbnAAHaewABRusAAdp2YFsAAdtkAwAB2mcAAUbvAAHbbmBLAAHbcr9PAAHbbmBDAAHbewACMZsAAdt/AAFG8wAB23sAAUb3AAHbewABRvsAAdt7AAFG/wAB23sAAUcDAAHbewABRwcAAdt7AAFHCwAB23sAAUcPAAHbewABRxMAAdt7AAFHFwAB23sAAUcbAAHbewABRx8AAdt7AAFHIwAB23sAAUcnAAHbewABRysAAdt7AAFHMwAB23sAAUc3AAHbewABRzsAAdt7AAFHPwAB23sAAUdDAAHbewABR0cAAdt7AAFHSwAB23sAAUdPAAHbewABR1MAAdt7AAFHVwAB23sAAUdbAAHbewABR18AAdt7AAFHYwAB23sAATQ/AAHbewABR2sAAdt7AAFHbwAB23sAAUdzAAHbewABR3cAAdt6k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AFAkwAB4AJrLwAB4AMAATO/AAHgAoynAAHgAucDAAHgAmtLAAHgAwABPfcAAeADAAE3pwAB4AMAAQ47AAHgAmI/AAHgAwABOV8AAeADAAE5TwAB4AMAATk3AAHgAwABKRMAAeADAAEJbwAB4AMAATV3AAHgAwABCWcAAeACvvMAAeADAAFABwAB4AL3zwAB4AL30wAB4AL3xwAB4AMAAUjrAAHgAwABSO8AAeADAAFI8wAB4AMAAUjXAAHgAwABSNsAAeACvxsAAd/iYFsAAeCMAwAB398AAUj3AAHglmBLAAHgmJ8AAeCbAAIxrwAB4KCjAAHgmKcAAeCaqP8AAeCau88AAeCau9MAAeCau9cAAeCbAAELOwAB4JZgQwAB4MCPAAHglmBbAAHgyAADAAIxswAB4NJgQwAB4NcAAjGzAAHg2wABSk8AAeDXAAFKUwAB4NMAAUkbAAHg5mBLAAHg6b8AAeDqfzsAAeDrAAIxswAB4PcAAUHrAAHg9q3PAAHg9stPAAHg9wABPtsAAeD3AAE+3wAB4PcAAQ8rAAHg9uY7AAHg9wABPuMAAeD3AAFJHwAB4PcAAUkjAAHg9wABSScAAeD3AAEM9wAB4PcAAT8DAAHg9wABPwcAAeDqTWsAAeDqELMAAeDqUOMAAeDqUPsAAeDqjg8AAeDqUN8AAeDrAAE/cwAB4Op7SwAB4Oqr5wAB4OsAAT7nAAHg6wABPusAAeDrAAE+7wAB4OsAAT7zAAHg6tDDAAHg6qvvAAHg6wABSFcAAeDmYE8AAeFyVCMAAeFyf5sAAeFyqtcAAeFzAAIxswAB4YMAAT+bAAHhgwABP6MAAeFyWRcAAeFyl2cAAeFykUMAAeFzAAFBIwAB4XKiDwAB4XMAAUmfAAHg5mBDAAHhpr5rAAHhpn+fAAHhpwACMbMAAeGzAAE/twAB4bMAAT+/AAHhswABP8sAAeGzAAE/1wAB4bMAAT/TAAHhsqffAAHhswABQDsAAeGzAAFAMwAB4bMAAUA3AAHhswABQEsAAeGzAAFATwAB4bMAAUBXAAHhswABSTMAAeGzAAFAWwAB4bMAAUBfAAHhswABQGMAAeGzAAFAZwAB4bMAAUBrAAHhswABSTsAAeGzAAFApwAB4bMAAUC/AAHhswABSUcAAeGzAAFJVwAB4bMAAUlfAAHhswABSWcAAeGzA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e52YFsAAe6gAwAB7nMAAU5bAAHuqmBLAAHurwACMdcAAe6zAAEDPwAB7rMAAU5fAAHuslIzAAHuswABTmMAAe6zAAFOZwAB7rMAAU5rAAHuswABTm8AAe6zAAFOcwAB7rJqqwAB7q8AAUhXAAHurhCvAAHuqmBPAAHu4wABQIMAAe7iv18AAe7iv2MAAe7iv08AAe7iUbsAAe7itmsAAe7jAAFOewAB7uMAAU5/AAHu4mw7AAHuqmBTAAHvClG7AAHvCrZrAAHvCwABTnsAAe8LAAFOfwAB7qpgQwAB7x8AAU53AAHvHl0/AAHvHlljAAHvHlE/AAHvHlKDAAHvHlQ3AAHvHwACMdcAAe87AAFOhwAB7zsAAU6rAAHvOwABTosAAe87AAFOrwAB7zsAAU6/AAHvOwABTuMAAe87AAFOowAB7zsAAU8TAAHvOwABTysAAe8fAAFHiwAB7x8AAUerAAHvHlR/AAHvHwABR5MAAe8eVIcAAe8fAAFHjwAB7x5UjwAB7x8AAUeHAAHvHlSfAAHvHwABR5cAAe8eVJcAAe8fAAFOpwAB7x8AAUeDAAHvHlTzAAHvHwABTt8AAe8eVFcAAe8fAAFO9wAB7x5UXwAB7x8AAUcbAAHvHlTDAAHvHwABRx8AAe8eVMsAAe8fAAFHewAB7x5VAwAB7x6SvwAB7x5VCwAB7x8AAUefAAHvHlS3AAHvHwABR6MAAe8eVL8AAe8fAAFHmwAB7x5U+wAB7x5VNwAB7x5VJwAB7x5VSwAB7x8AAUdDAAHvHlW7AAHvHlZnAAHvHlZvAAHvHwABRycAAe8eVRsAAe8eVp8AAe8eVo8AAe8fAAFHRwAB7x5VywAB7x8AAUczAAHvHlVbAAHvHwABRvcAAe8eVdsAAe8fAAFG+wAB7x5V5wAB7x8AAUb/AAHvHlXvAAHvHwABRwMAAe8eVdMAAe8fAAFHBwAB7x5V/wAB7x8AAUcLAAHvHlXzAAHvHwABRw8AAe8eVicAAe8fAAFHEwAB7x5WLwAB7x8AAUcXAAHvHlY7AAHvHlZDAAHvHwABRzsAAe8eVlcAAe8fAAFHSwAB7x5WHwAB7x5XIwAB7x5XKwAB7x5WywAB7x5W0wAB7x5XewAB7x5T0wAB7x8AAUdbAAHvHlOzAAHvHwABR2MAAe8eU8MAAe8fAAFHpwAB7x5TuwAB7x5TywAB7x5U4wAB7x5WswAB7x5W8wAB7x8AAUdPAAHvHlcDAAHvHlbjAAHvHlbbAAHvHwABTz8AAe8eVw8AAe8eVzsAAe8eVzMAAe8eV0cAAe8fAAFHUwAB7x5XVwAB7x5XYwAB7x8AAUdXAAHvHlYHAAHvHwABR18AAe8eVnsAAe8fAAFHIwAB7x5WwwAB7x8AAUc3AAHvHlefAAHvHwABND8AAe8fAAEcqwAB7x8AAUdrAAHvHwABTzcAAe8fAAFHdwAB7x5TawAB7x8AAUdvAAHvHlMPAAHvHwABR3MAAe8eUvcAAe8fAAFHPwAB7x5XlwAB7x8AAUevAAHvHlZfAAHuqmBbAAHxQAMAAe5zAAFPVwAB8UpgSwAB8U5UqwAB8U5T9wAB8UpgWwAB8VgDAAHucwABT1sAAfFiYEsAAfFmnJ8AAfFnAAFPXwAB8WcAAU9jAAHxZwACMdcAAfF2V/8AAfFiYEMAAfF/AAFO7wAB8X0HAAHxfwACMdcAAfGLAAFPZwAB8XyPAAHxYmBPAAHxlg4nAAHxYmBbAAHxnAMAAe5zAAFPfwAB8aZgSwAB8aqcnwAB8asAAU+DAAHxqwABT4cAAfGmYEMAAfG7AAFO6wAB8blHAAHxuwABTu8AAfG7AAIx1wAB8csAAU9nAAHxuI8AAfGmYFsAAfHUAwAB7nMAAU/PAAHx3mBLAAHx4wACMdcAAfHnAAFP0wAB8d5gQwAB8e8AAU7rAAHx7UcAAfHuT4MAAfHuTKsAAfHvAAFO7wAB8e7TCwAB8eyPAAHx3mBbAAHyDAADAAIx2wAB8hcAAU/vAAHyGmBLAAHyHqwLAAHyHn+bAAHyHrIjAAHyHqrXAAHyHryjAAHyHrzrAAHyHqvXAAHyHrkzAAHyHrcjAAHyHs0vAAHyHwACMdsAAfJKywsAAfJLAAEPLwAB8h7NewAB8h7NQwAB8h6uowAB8h68pwAB8h6+UwAB8h6XZwAB8h6AJwAB8hpgTwAB8nK8qwAB8nKx7wAB8hpgQwAB8n61pwAB8hpgWwAB8oQAAwACMR8AAfKOYEcAAfKTAAFP+wAB8o5VEwAB8ppgSwAB8pyfAAHynwACMR8AAfKkowAB8pynAAHynwABT/8AAfKfAAFQBwAB8p8AAVAPAAHynwABUBcAAfKaYEMAAfLAjwAB8ppgWwAB8sgDAAHyj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AH5OmBDAAH5TI8AAfk6YFsAAflWWBMAAflWWBQDAAIx7wAB+WLTRwAB+WZgSwAB+WoQrwAB+WZgQwAB+XLU+wAB+XMAAVLLAAH5cwABUtMAAflmYFsAAfmAAwAB+WMAAVLXAAH5imBDAAH5jwABUqMAAfmPAAFSpwAB+Y8AAVKvAAH5jwABUrsAAfmPAAFSswAB+Y8AAVKrAAH5jwABUrcAAfmPAAFSvwAB+YpgWwAB+bADAAH5YwABUtsAAfm6YEMAAfm/AAFSrwAB+b8AAVK3AAH5vwABUqsAAfm/AAFSuwAB+b8AAVKjAAH5vwABUrMAAfm/AAFSvwAB+b8AAVKnAAH5umBbAAH54AMAAfljAAFS4wAB+epgQwAB+e8AAVKzAAH57wABUq8AAfnvAAFSowAB+e8AAVKrAAH57wABUrsAAfnvAAFStwAB+e8AAVK/AAH57wABUqcAAfnqYFsAAfoQAwAB+WMAAVMXAAH6GmBDAAH6HwABUrcAAfofAAFSuwAB+h8AAVKvAAH6HwABUqMAAfofAAFSswAB+h8AAVKrAAH6HwABUr8AAfofAAFSpwAB+hpgWwAB+kADAAH5YwABUxsAAfpKYEMAAfpPAAFSrwAB+k8AAVKjAAH6TwABUrMAAfpPAAFSqwAB+k8AAVK7AAH6TwABUrcAAfpPAAFSvwAB+k8AAVKnAAH6SmBbAAH6cAMAAfljAAFTHwAB+npgQwAB+n8AAVKvAAH6fwABUqsAAfp/AAFSowAB+n8AAVKnAAH6fwABUrcAAfp/AAFSswAB+n8AAVK7AAH6fwABUr8AAfp6YFsAAfqgAwAB+WMAAVMnAAH6qmBDAAH6rwABUrsAAfqvAAFStwAB+q8AAVKvAAH6rwABUqMAAfqvAAFSswAB+q8AAVKrAAH6rwABUr8AAfqvAAFSpwAB+qpgWwAB+tAAAwACMfMAAfra1t8AAfreYEsAAfri19MAAfreYEMAAfrq3icAAfreYFsAAfrwAwAB+vLa3AMAAjH3AAH6/tdDAAH7AmBPAAH7BhAnAAH7BpmXAAH7Btb/AAH7Btq7AAH7BtfTAAH7BgeDAAH7AmBDAAH7Iqf/AAH7ItrzAAH7It1XAAH7It1zAAH7Ity/AAH7ItePAAH7ItvLAAH7ItvvAAH7IuQLAAH7ItxPAAH7ItxLAAH7Itx/AAH7IuQ3AAH7IuQ7AAH7IuQrAAH7ItzHAAH7IuG3AAH7IuQjAAH7It1HAAH7It07AAH7It0/AAH7It1DAAH7It1TAAH7Its/AAH7Itw7AAH7IturAAH7Ity3AAH7IuAPAAH7Ipp3AAH7IppnAAH7IpprAAH7Ipp7AAH7Ipp/AAH7AmBbAAH7qAADAAIx+wAB+7LXxwAB+7ZgQwAB+7lTAAH7utx7AAH7uuF7AAH7uuF3AAH7utyvAAH7utyzAAH7ut3TAAH7ut+fAAH7ut+rAAH7ut33AAH7ut37AAH7ut9rAAH7ut97AAH7ut+3AAH7utwHAAH7ut23AAH7ut/fAAH7ut/bAAH7uu77AAH7ut/DAAH7umD7AAH7uqI3AAH7uuQ/AAH7ulhjAAH7uuHvAAH7uuHTAAH7uuHPAAH7ut8bAAH7ut8XAAH7uuKrAAH7uuKnAAH7uuMPAAH7uuMLAAH7ut9DAAH7umW7AAH7uuOfAAH7uuETAAH7ut0nAAH7uuPHAAH7uuJrAAH7utwjAAH7uuLzAAH7ut83AAH7ut5LAAH7uuBDAAH7uwABU1sAAfu63R8AAfu63RsAAfu63JsAAfu64tsAAfu63h8AAfu63b8AAfu63y8AAfu63Q8AAfu6qW8AAfu62/MAAfu64TMAAfu63o8AAfu63scAAfu62ycAAfu64usAAfu64xsAAfu63w8AAfu643cAAfu63xMAAfu64kcAAfu63wsAAfu65DMAAfu63sMAAfu7AAFTfwAB+7sAAVODAAH7uwABU4cAAfu7AAFTiwAB+7sAAVOPAAH7uwABU5MAAfu7AAFTlwAB+7sAAVObAAH7uwABU58AAfu7AAFTowAB+7sAAVOnAAH7uwABU6sAAfu7AAFTrwAB+7sAAVOzAAH7uwABU7cAAfu7AAFTuwAB+7sAAVO/AAH7uwABU8MAAfu7AAFTxwAB+7sAAVPLAAH7uty7AAH7tmBbAAH9JAADAAIx/wAB/S7ZywAB/TJgSwAB/TSfAAH9NwACMf8AAf08owAB/TSnAAH9NhFHAAH9NprHAAH9NqfDAAH9MmBDAAH9VI8AAf0yYFsAAf1cAAMAAjIDAAH9ZmBDAAH9atn7AAH9awABVCsAAf1rAAFULwAB/WsAAVQzAAH9atoDAAH9atoHAAH9atoLAAH9atn/AAH9awABVDsAAf1m2fcAAf2SYEsAAf2UnwAB/ZcAAjIDAAH9nKMAAf2UpwAB/ZcAAVPjAAH9lwABU+sAAf2XAAFT8wAB/ZcAAVP7AAH9lwABVAMAAf2XAAFUCwAB/ZcAAVQTAAH9lwABVBsAAf2SYEMAAf3IjwAB/ZJgWwAB/dADAAH9ZwABVCMAAf3aYEMAAf3fAAFUJwAB/dpgWwAB/eQAAwACMgcAAf3u2hcAAf3yYEsAAf30nwAB/fcAAjIHAAH9/KMAAf30pwAB/fcAAVRHAAH99wABVE8AAf33AAFUVwAB/fJgQwAB/hSPAAH98mBbAAH+HAMAAf3u2iMAAf4mYEsAAf4qdjsAAf4q3qsAAf4q3rMAAf4mYEMAAf4620MAAf47AAFUXwAB/jsAAVRjAAH+OuNDAAH+OpRbAAH+OpRfAAH+Ot6nAAH+Ot6vAAH+Ot8nAAH+Ot8jAAH+Ot6jAAH+OwABVGcAAf47AAFUbwAB/jsAAVR3AAH+OwABVH8AAf464x8AAf47AAFUgwAB/jsAAVSHAAH+OwABVIsAAf47AAFUkwAB/jsAAVSXAAH+OwABVJ8AAf47AAFUowAB/jsAAVSrAAH+OwABVK8AAf47AAFUtwAB/jreIwAB/jreKwAB/jsAAVS7AAH+OwABVL8AAf4mYFsAAf60AAMAAjILAAH+vtovAAH+wmBLAAH+xJ8AAf7HAAIyCwAB/syjAAH+xKcAAf7HAAFUxwAB/scAAVTPAAH+xsmTAAH+wmBDAAH+5I8AAf7CYFsAAf7sAAMAAjIPAAH+9u2fAAH++mBDAAH+/tsDAAH+/rpXAAH+/u3bAAH+/u3rAAH+/uFbAAH+/u3vAAH+/u37AAH+/u3/AAH++mBbAAH/IAMAAf722jsAAf8qYEsAAf8ulvsAAf8uPMcAAf8qYE8AAf8619MAAf865H8AAf86jbMAAf86AoMAAf867m8AAf8673cAAf867h8AAf8qYEMAAf9a2wcAAf9a28sAAf9a3MMAAf9a23MAAf9a4AMAAf9a3/8AAf9a4asAAf9aD8cAAf9YjwAB/ypgWwAB/4ADAAH+9tqDAAH/imBXAAH/jAMAAf+KYE8AAf+WjbMAAf727acAAf+eYFcAAf+iSQ8AAf+eYEMAAf+q7hsAAf+eYE8AAf+yjbMAAf+y7h8AAf722nMAAf++YFcAAf/AAwAB/75gTwAB/8qNswAB/8ruHwAB/vbtowAB/9ZgVwAB/9gDAAH/1mBPAAH/4o2zAAH+9u2rAAH/6mBXAAH/7AMAAf/qYE8AAf/2jbMAAf722ksAAf/+YFcAAgACSQ8AAf/+YEMAAgAK7hsAAf/+YE8AAgAS5H8AAgAS7m8AAgASjbMAAf727a8AAgAiYFcAAgAkAwACACJgTwACAC7kfwACAC7ubwACAC6NswAB/vbaawACAD5gVwACAEADAAIAPmBPAAIASuR/AAIASu5vAAIASo2zAAH+9tpnAAIAWmBXAAIAXAMAAgBfAAFU4wACAFpgTwACAGrdkwACAGqNswAB/vbaTwACAHZgVwACAHgDAAIAdmBPAAIAguR/AAIAgo2zAAH+9u2XAAIAjmBXAAIAkAMAAgCOYE8AAgCa7scAAgCa7ssAAgCa5H8AAgCajbMAAgCOYEMAAgCu23MAAgCu4AMAAgCu3MMAAgCu4asAAgCuD8cAAf722ncAAgDGYFcAAgDIAwACAMZgTwACANJ1mwACANKNswACAMZgQwACAN7gAwACAN7hqwACAN4PxwAB/vbaXwACAO5gVwACAPADAAIA7mBPAAIA+o2zAAH+9u2bAAIBAmBDAAIBBu8PAAIBBt0vAAIBBtvLAAIBBtzDAAIBBttzAAIBBrpXAAIBBu3rAAIBBuFbAAIBBu3vAAIBBu3bAAIBBtsDAAIBBu37AAIBBu3/AAIBBuGrAAIBAmBPAAIBQgLDAAIBQuR/AAIBAmBbAAIBTAMAAf722n8AAgFWYFcAAgFYAwACAVZgTwACAWKNswACAVZgQwACAWrcwwACAWrvDwACAWrf/wAB/vbaewACAXpgVwACAXwDAAIBemBPAAIBhnWbAAIBhuR/AAIBho2zAAIBemBDAAIBlg/HAAH+9u2TAAIBnmBPAAIBottvAAIBouR/AAIBnmBDAAIBrtzDAAIBrrpXAAIBru3bAAIBru3rAAIBruFbAAIBru3vAAIBru37AAIBru3/AAIBnmBbAAIB0AMAAf722jMAAgHaYFcAAgHcAwACAdpgTwACAeYCKwACAebeUwACAeaNswACAdpgQwACAfbbAwACAfbbBwACAfbvMwACAfbbywAB/vbaNwACAgpgVwACAgwDAAICCmBPAAICFspbAAICFlRrAAICFo2zAAICCmBDAAICJtsDAAICJtsHAAICJg/HAAH+9tpbAAICNmBXAAICOAMAAgI2YE8AAgJCC3sAAgJC5H8AAgJCjbMAAgI2YEMAAgJS2wMAAgJS3/8AAgJS3MMAAgJS23MAAgJS7fsAAgJS7f8AAgJSD8cAAf727bMAAgJyYFcAAgJ0AwACAnJgTwACAn7uxwACAn5JJwACAn7kfwACAn6NswACAnJgQwACApLbAwACApLcwwACApLgAwACApIPxwAB/vbaVwACAqZgVwACAqgDAAICpmBPAAICsIsAAgKy5H8AAgKyjbMAAgKmYEMAAgLCD8cAAgLCm18AAgLC2wMAAgLCulcAAgLC7dsAAgLC7esAAgLC4VsAAgLC7e8AAgLC7fsAAgLC7f8AAgLC28sAAgLC3MMAAgLC23MAAgLC4AMAAgLC3/8AAgLC4agDAAIyEwACAwZgQwACAwrttwACAwrtuAMAAjIUAwACMhsAAgMa5T8AAgMeYEsAAgMinhsAAgMeYEMAAgMq3wcAAgMeYFsAAgMwAAMAAjIfAAIDOuVDAAIDPmBPAAIDQgKDAAIDPmBDAAIDSwABVPsAAgNLAAFVAwACA0rchwACA0rfRwACA0sAAVUHAAIDSt8/AAIDSwABVH8AAgNK3pMAAgNK3pcAAgNK3MsAAgNK3M8AAgNK3NcAAgNK3N8AAgNK6NMAAgNK6NcAAgNK6bMAAgNK6MsAAgNK6dMAAgNK6b8AAgNK6kcAAgNK6csAAgNK6N8AAgNK6MMAAgNK6dsAAgNK6k8AAgNK6c8AAgNK6OcAAgNLAAFVKwACA0roMwACA0sAAVUvAAIDSwABVTMAAgNLAAFVNwACA0rhjwACA0rhlwACA0sAAVVDAAIDSuFnAAIDSwABVIMAAgNK4lsAAgNLAAFUiwACA0sAAVSTAAIDSwABVJcAAgNLAAFUnwACA0sAAVVPAAIDSujvAAIDSwABVVMAAgNK6GMAAgNLAAFVVwACA0rcgwACA0rqOwACA0rocwACA0rgdwACA0rgewACA0rnhwACA0rgxwACA0rgywACA0rbmwACA0reywACA0re0wACA0re2wACA0sAAVRvAAIDSt7jAAIDSt8fAAIDSwABVKMAAgNLAAFUqwACA0riewACA0riswACA0ribwACA0ricwACA0sAAVSvAAIDSwABVLcAAgNK4isAAgNK4ksAAgNK4icAAgNK4k8AAgNLAAFUZwACA0rbuwACA0rnywACA0rqAwACA0sAAVVnAAIDSuIXAAIDSuojAAIDSuePAAIDSud3AAIDSud/AAIDSum7AAIDSudrAAIDSukDAAIDSwABVWsAAgNK6CcAAgNK6BMAAgNLAAFVbwACA0rnYwACA0sAAVVzAAIDSt4zAAIDSt4jAAIDSt4rAAIDSwABVLsAAgNLAAFUvwACA0sAAVV/AAIDSug7AAIDSuhPAAIDSuhfAAIDSwABVYcAAgNK5/cAAgNLAAFViwACA0rn5wACA0rn2wACA0rhkwACA0rhrwACA0sAAVWPAAIDSt57AAIDSt5rAAIDSt5vAAIDSt5zAAIDSwABVZcAAgNK3k8AAgNK3mMAAgNK2+cAAgNK2+sAAgNK29sAAgNK298AAgNK29MAAgNLAAFVnwACA0rkHwACA0sAAVWnAAIDSuK7AAIDSuLDAAIDSuLLAAIDSwABVa8AAgNK59MAAgNK37sAAgNK3aMAAgNLAAFVtwACA0rdrwACA0rd3wACA0sAAVW/AAIDSui7AAIDStu3AAIDSuoLAAIDSuifAAIDSwABVcMAAgNK238AAgNK208AAgNK21cAAgNLAAFVxwACA0rgkwACA0sAAVXLAAIDSuhrAAIDSwABVc8AAgNK5ycAAgNLAAFV0wACA0rogwACA0sAAVXXAAIDSuiHAAIDSuiPAAIDSuiXAAIDSt3/AAIDSt4LAAIDSt4TAAIDStynAAIDSwABVd8AAgNK6BsAAgNLAAFV4wACA0rjWwACA0rjHwACA0rjYwACA0sAAVXnAAIDSt/LAAIDSuBrAAIDSwABVesAAgNK4s8AAgNLAAFV7wACA0rnNwACA0sAAVX3AAIDStuHAAIDSunzAAIDSuezAAIDSwABVfsAAgNK438AAgNK4N8AAgNK4OMAAgNK4OsAAgNK4t8AAgNK4RcAAgNK3+8AAgNK3+MAAgNK3/cAAgNK3+sAAgNK6Z8AAgNK4AcAAgNK4BMAAgNLAAFWDwACA0rh8wACA0rh+wACA0rnRwACA0rjzwACA0rj0wACA0rj1wACA0sAAVYTAAIDSuPfAAIDSuIzAAIDSuJXAAIDSt6DAAIDSt6HAAIDSwABVIcAAgNK4ucAAgNK4CcAAgNK3psAAgNK3OcAAgNK3PMAAgNK4E8AAgNK4FsAAgNK4F8AAgNK4YsAAgNK4bsAAgNLAAFUdwACA0re9wACA0riiwACA0rhvwACA0rhwwACA0rhxwACA0rhywACA0rh1wACA0rh4wACA0rgmwACA0rgnwACA0rdYwACA0rhNwACA0rgMwACA0rflwACA0rjhwACA0rjqwACA0ri7wACA0ri9wACA0ri/wACA0rfowACA0rd6wACA0rfUwACA0rffwACA0rfrwACA0rdwwACA0riDwACA0rhgwACA0rhmwACA0rnPwACA0rnTwACA0rnVwACA0rj5wACA0rkEwACA0rkFwACA0rn/wACA0roCwACA0rckwACA0rcnwACA0rdlwACA0rdpwACA0riBwACA0rjJwACA0rjSwACA0riAwACA0rhXwACA0rhRwACA0rhUwACA0rgpwACA0rgqwACA0rgtwACA0rgvwACA0rgHwACA0sAAVYfAAIDSuMTAAIDSt8HAAIDSwABViMAAgNLAAFUJwACA0rj9wACA0rd1wACA0sAAVYnAAIDSwABVisAAgNLAAFWOwACA0sAAVZDAAIDPmBTAAIHqwABVP8AAgM+YFsAAgewAAMAAjIjAAIHumBHAAIHvwABVrcAAge6jvsAAgfGYEsAAgfKj18AAgfK5VMAAgfK5VcAAgfK5VsAAgfLAAFWuwACB8sAAVa/AAIHywABVsMAAgfGYE8AAgfqAoMAAgfqvQcAAgfrAAFWxwACB+sAAVbLAAIH6wABVs8AAgfrAAFW0wACB+sAAVbXAAIH6wABVtsAAgfGYEMAAggOj2MAAggPAAFW8wACCA8AAVcXAAIIDwABVusAAggPAAFXNwACCA8AAVc7AAIIDwABVz8AAggPAAFXGwACCA8AAVcPAAIIDwABV18AAggPAAFW/wACCA8AAVd3AAIIDwABV28AAggPAAFXkwACCA8AAVebAAIIDwABVwcAAggPAAFXcwACCA8AAVenAAIIDwABV6sAAggPAAFXrwACCA8AAVezAAIIDwABVxMAAggPAAFXxwACCA8AAVe/AAIIDuivAAIIDuejAAIIDwABVucAAggPAAEHRwACCA8AAVfnAAIIDwABV+8AAggPAAFX8wACCA7oswACCA8AAVgDAAIIDulXAAIIDwABV+MAAggPAAFX9wACCA7pUwACCA8AAVf/AAIIDwABWBcAAggPAAFYBwACCA8AAVgPAAIIDwABV1cAAggPAAFXzwACCA8AAVhDAAIIDuV3AAIIDwABV0sAAggPAAFXRwACCA8AAVhLAAIIDwABBzcAAggPAAFYUwACCA8AAVhXAAIIDwABWF8AAggPAAFYYwACCA8AAVdPAAIIDwABWH8AAggPAAFYgwACCA8AAViHAAIIDwABWI8AAggPAAFYkwACCA8AAVfrAAIIDwABV2cAAggPAAFYpwACCA8AAVirAAIIDukrAAIIDwABVyMAAggO6LcAAggPAAFYuwACCA8AAVjHAAIIDwABWMMAAggPAAFY0wACCA7pIwACCA8AAVjXAAIIDwABWNsAAggPAAFY5wACCA8AAVjrAAIIDwABWEcAAggPAAFY7wACCA8AAVgLAAIIDwABWPsAAggPAAFXawACCA8AAVdbAAIIDwABWBsAAggPAAFYEwACCA8AAVePAAIIDwABWGcAAggPAAFZFwACCA8AAVhbAAIIDwABV/sAAggO6S8AAggPAAFZGwACCA8AAVkrAAIIDwABWScAAggPAAFZNwACCA8AAVlPAAIIDwABWVcAAggPAAFZXwACCA8AAVlTAAIIDwABWWcAAggPAAFZPwACCA7lbwACCA7lZwACCA8AAVlvAAIIDwABWWsAAggO6ScAAggPAAFZdwACCA8AAVl/AAIIDwABWccAAggPAAFZjwACCA8AAVnbAAIIDwABWYMAAggPAAFZ1wACCA7cawACCA8AAVnnAAIIDwABWesAAggPAAFZ4wACCA8AAVn/AAIIDwABWfMAAggPAAFaBwACCA8AAVoDAAIIDwABWk8AAggPAAFaZwACCA8AAVpjAAIIDwABWm8AAggPAAFaawACCA8AAVo/AAIIDwABWkMAAggPAAFaUwACCA8AAVpXAAIIDwABWo8AAggPAAFaWwACCA8AAVqXAAIIDwABWicAAggPAAFanwACCA8AAVqnAAIIDwABWkcAAggPAAFaIwACCA8AAVpLAAIIDwABWisAAggPAAFaLwACCA8AAVkHAAIIDwABWjMAAggPAAFaqwACCA7lTwACCA8AAVo3AAIIDwABWjsAAggPAAFaFwACCA7lYwACCA7lXwACCA8AAVfTAAIIDwABWqMAAggPAAFaCwACCA8AAVqzAAIIDwABWg8AAggPAAFatwACCA8AAVq/AAIIDwABWpsAAggPAAFZzwACCA8AAVmXAAIIDwABWYcAAggPAAFa3wACCA8AAVrnAAIIDwABWZsAAggPAAFZnwACCA8AAVrrAAIIDwABWu8AAggPAAFa9wACCA8AAVsDAAIIDwABWvMAAggPAAFbBwACCA8AAVmnAAIIDwABWasAAggPAAFZiwACCA7lcwACCA8AAVnTAAIIDwABWh8AAggPAAFZ3wACCA8AAVmjAAIIDwABWa8AAggPAAFZswACCA8AAVsjAAIIDwABWy8AAggPAAFbMwACCA8AAVm3AAIIDwABWOMAAggPAAFZvwACCA8AAVm7AAIIDwABWcMAAggPAAFbNwACCA8AAVkvAAIIDwABWTMAAggPAAFZewACCA8AAVcnAAIIDwABVu8AAggPAAFYmwACCA8AAVczAAIIDwABWzsAAggPAAFbPwACCA8AAVtDAAIIDkxHAAIIDtxvAAIIDwABW0cAAggPAAFbTwACCA8AAVtXAAIIDwABW1MAAggPAAFbbwACCA8AAVuDAAIIDwABW48AAggPAAFbkwACCA8AAVuHAAIHxmBbAAILVAADAAIyJwACC17lfwACC2JgSwACC2cAAVujAAILZmDLAAILZIsAAgtiYEMAAgt0jwACC2JgWwACC3wDAAILfwABW6QDAAIyKwACC4rZ4wACC45gSwACC5CfAAILkwACMisAAguYowACC5CnAAILkkjbAAILklOjAAILklaLAAILjmBDAAILsI8AAguOYFsAAgu4AAMAAjIvAAILwmBDAAILxvAfAAILxvAjAAILxvAnAAILwtkrAAIL1mBLAAIL2J8AAgvbAAIyLwACC+CjAAIL2KcAAgvbAAFbvwACC9sAAVvHAAIL2wABW88AAgvWYEMAAgv4jwACC9ZgWwACDAAAAwACMjMAAgwKYEcAAgwPAAFWtwACDApgQwACDBcAAVZPAAIMFwABXHMAAgwK2ecAAgwiYEsAAgwnAAFb1wACDCag0wACDCcAAVvbAAIMJnuvAAIMJwABW98AAgwnAAFb4wACDCcAAVvnAAIMJwABW+sAAgwnAAFb7wACDCcAAVvzAAIMJwABW/cAAgwmTl8AAgwnAAFb+wACDCcAAVv/AAIMJwABXAMAAgwnAAFcBwACDCcAAVwLAAIMJwABXA8AAgwnAAFcEwACDCcAA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C8AAV5nAAIQvmBLAAIQwnB/AAIQvmBDAAIQyg2bAAIQyvGDAAIQyI8AAhC+YFsAAhDYAAMAAjJPAAIQ4mBHAAIQ5wABXmsAAhDnAAFebwACEOMAAV5zAAIQ8mBLAAIQ9wABXncAAhD3AAIyTwACEP6xVwACEP6tzwACEP6xYwACEP8AAQ8vAAIQ/rv3AAIQ/rwHAAIQ/wABXoMAAhD/AAFejwACEPcAAV6HAAIQ9wABXosAAhDyYE8AAhErAAIyTwACES8AARPHAAIQ8mBDAAIRNwABXqMAAhE3AAIyTwACET8AASs/AAIRPwABXqsAAhE/AAFe7wACETauawACETbQRwACETb7cwACETbQIwACETbQLwACETbQFwACETbQOwACETZaIwACETbQZwACETbQcwACETcAAV8XAAIRNnbDAAIRNsCDAAIRNvtrAAIRNtCLAAIRNlUbAAIRNwABXzMAAhE3AAFe5wACETb7bwACEPJgWwACEZgAAwACMlMAAhGjAAFfOwACEaZgTwACEaoCwwACEaZgQwACEbLB+wACEaZgWwACEbgDAAIRowABXz8AAhHCYEsAAhHGfvMAAhHG+BsAAhHCYE8AAhHSAsMAAhHCYEMAAhHbAAFfRwACEdr4IwACEdsAAV9LAAIR2wABX08AAhHCYFsAAhHsAwACEaMAASGfAAIR9mBLAAIR+wABX1MAAhH7AAFfVwACEfsAAV9bAAIR+wABX18AAhH7AAIyUwACEg8AAV9jAAISDrFXAAISDwABE8cAAhIPAAEiqwACEg68GwACEg68EwACEg678wACEg679wACEg675wACEg8AAV9nAAISDwABX2sAAhIOtOcAAhIPAAFfbwACEfsAAV9zAAIR+wABX3cAAhH7AAFfewACEfsAAV9/AAIR+wABX4MAAhH6e8MAAhH7AAFfhwACEfsAAV+LAAIR+wABX48AAhH7AAFfkwACEfsAAV+XAAIR+wABX5sAAhH7AAFfnwACEfsAAV+jAAIR+wABX6cAAhH6yXsAAhH7AAFfqwACEfZgTwACEopJMwACEosAAjJTAAISkwABX68AAhKSrc8AAhKTAAENjwACEpMAAQ3PAAISkwABQkMAAhH2YEMAAhKrAAFfswACEqsAAV+3AAISqwABX78AAhKrAAFf0wACEqsAAV/XAAISqwABX9sAAhKrAAFf3wACEqq7BwACEqq7CwACEqsAAV/jAAISqwABX/8AAhKrAAIyUwACEtsAAWAHAAIS2wABYYsAAhKqwfsAAhKrAAFgEwACEqqciwACEqsAAWAvAAISqwABYDMAAhKrAAFgNwACEqsAAWA7AAISqwABYEMAAhKrAAFgRwACEqpU2wACEqsAAWBbAAISqwABYGMAAhKrAAFgZwACEqsAAWBrAAISqsLrAAISqnxrAAISqwABGxMAAhKrAAEbCwACEqsAAWB7AAISqwABYH8AAhKrAAFggwACEqsAAWCHAAISqslTAAISqslbAAISqslfAAISqsljAAISqslvAAISqslrAAISqslXAAISqwABYJcAAhKqyU8AAhKqyUsAAhKrAAFg3wACEqsAAWEDAAISqwABYCMAAhKrAAFhCwACEqsAAWETAAISqwABYRsAAhKrAAFgqwACEqsAAWEPAAISqwABYUcAAhKqwK8AAhKqwgsAAhKqwi8AAhKrAAFhTwACEqrCHwACEqsAAWFTAAISqwABYVcAAhKqwHMAAhKqwBsAAhKqwEsAAhKqwNMAAhKqwRMAAhKqwCMAAhKqwCcAAhKqwCsAAhKqwC8AAhKqwPsAAhKqwP8AAhKqwSMAAhKqwPMAAhKqwNcAAhKqwBcAAhKqwLcAAhKqwLsAAhKqwGsAAhKqwG8AAhKqwDMAAhKqwE8AAhKqwGcAAhKqwM8AAhKqwDsAAhKqwD8AAhKqwFMAAhKqwScAAhKrAAFhewACEqsAAWGDAAISqsB3AAISqsCDAAISqsCPAAISqsCfAAISqsCjAAISqsDbAAISqwABYaMAAhKrAAFhlwACEqsAAWGfAAISqwABYZsAAhKqwJMAAhKqwIsAAhKqwIcAAhKqwJcAAhKqwJsAAhKqwFcAAhKqwFsAAhKqwGMAAhKqwOsAAhKqwMMAAhKqwMcAAhKrAAFh1wACEqrAXwACEqrAQwACEqrARwACEqsAAWDPAAISqwABYeMAAhKqVmMAAhKqVScAAhKrAAFh7wACEqsAAWGHAAISqsDfAAISqsDLAAISqsDjAAISqsD3AAISqsEbAAISqlYfAAISqsAfAAISqsEzAAISqsDnAAISqsA3AAISqwABYg8AAhKqwR8AAhKqwRcAAhKqwQMAAhKqwLMAAhKqwQcAAhKqwQsAAhKqwQ8AAhKqwL8AAhKrAAFiPwACEqrAewACEqrAfwACEqqpXwACEqsAAWJHAAISqwABYlcAAhKqqWMAAhKrAAFiWwACEqqpZwACEqsAAWJfAAISqwABYmcAAhKrAAFicwACEqsAAWJ3AAISqwABYnsAAhKrAAFifwACEqsAAWKHAAISqwABYosAAhKrAAFikwACEqsAAWKXAAISqwABYpsAAhKqoSsAAhKrAAFinwACEqsAAWKjAAISqwABYqsAAhKrAAFivwACEqsAAWLDAAISqsCnAAISqsCrAAISqwABYgMAAhKrAAFiBwACEqsAAWLPAAISqsErAAISqsEvAAISqsE3AAISqsE7AAISqsE/AAISqwABYtsAAhKqwO8AAhH2YFsAAhV4AAMAAjJXAAIVgmBDAAIVhwABZicAAhWDAAFi8wACFY5gTwACFZICwwACFY5gQwACFZrB+wACFY5gWwACFaADAAIVgwABYvcAAhWqYEsAAhWvAAIyVwACFbK+cwACFa8AAWL7AAIVrwABYv8AAhWqYE8AAhXCAsMAAhXDAAIyVwACFcqBFwACFcqxVwACFcq78wACFapgQwACFdr4HwACFapgWwACFeADAAIVgwABYycAAhXqYEsAAhXvAAFjKwACFe4CwwACFe8AAjJXAAIV+q43AAIV+rFXAAIV+rvzAAIV+rTnAAIV+wABX68AAhX7AAFjLwACFfsAAWMzAAIV6mBPAAIWGqrXAAIWGwACMlcAAhYjAAFCQwACFiMAAQ2PAAIV6mBDAAIWLsH7AAIWLsFPAAIWLwABYzcAAhYvAAIyVwACFj8AAWNfAAIWPwABY1sAAhY/AAFjYwACFj8AAWQTAAIWLsFnAAIWLwABY2sAAhYvAAFjbwACFi7A3wACFi7AMwACFi5VJwACFi7CHwACFi8AAWN3AAIWLwABY3sAAhYvAAFjhwACFi8AAWOPAAIWLsCPAAIWLwABY6cAAhYuwDcAAhYvAAFjiwACFi7AGwACFi7A0wACFi7CCwACFi8AAWPTAAIWLsIvAAIWLwABY9cAAhYuwHMAAhYvAAFj5wACFi7AdwACFi7ApwACFi7BKwACFi7BLwACFi8AAWP7AAIWLsBXAAIWLsBjAAIWLsB7AAIWLsCLAAIWLsCTAAIWLsCHAAIWLsCXAAIWLwABZBsAAhYuwQsAAhYuwQ8AAhYuwNsAAhYvAAFkMwACFi7BPwACFi7BOwACFepgWwACFvgDAAIVgwABZGMAAhcCYEsAAhcHAAFjBwACFwYJ0wACFwZ/hwACFwYCwwACFwZ7VwACFwJgTwACFx8AAjJXAAIXIwABQkMAAhcCYEMAAhcqwfsAAhcqwU8AAhcrAAFkZwACFyrAewACFyrAfwACFyrAjwACFwJgWwACF0QDAAIVgwABZHcAAhdOYEsAAhdSAsMAAhdSf4cAAhdS+BcAAhdTAAIyVwACF2MAAWMzAAIXUm6fAAIXUwABZHsAAhdTAAFjHwACF1MAAWR/AAIXTmBPAAIXewACMlcAAhd/AAFCQwACF3sAAWSDAAIXTmBDAAIXiwABZIcAAheLAAFkiwACF4sAAWSTAAIXiwABZJ8AAheLAAFkmwACF4rB+wACF4rBTwACF4sAAWSvAAIXiwABZKcAAheLAAFkwwACF4sAAWSzAAIXiwABZKMAAheLAAFk0wACF4sAAWSrAAIXiwABZN8AAhdOYFsAAhfIAwACFYMAAWTjAAIX0mBLAAIX1ntXAAIX1wABZOcAAhfWaQsAAhfW+BcAAhfWf4cAAhfSYE8AAhfvAAIyVwACF/MAAUJDAAIX7wABYvsAAhfSYEMAAhf/AAFkjwACF/8AARZPAAIX/wABZOsAAhf+wicAAhf+wHcAAhf+wRcAAhfSYFsAAhgYAwACFYMAAWT/AAIYImBLAAIYJgLDAAIYImBDAAIYLsH7AAIYImBbAAIYNAMAAhWDAAFlBwACGD5gSwACGEICwwACGD5gQwACGErB+wACGD5gWwACGFADAAIVgwABZQsAAhhaYEsAAhheZbsAAhhfAAFlDwACGFpgWwACGGgDAAIVgwABZRMAAhhyYEsAAhh3AAIyVwACGHsAAUJDAAIYdgLDAAIYdvMnAAIYdwABZRcAAhh3AAFlGwACGHJgQwACGJLB+wACGJMAAWUjAAIYkwABZSsAAhiTAAFlPwACGJLBTwACGJMAAWUfAAIYkwABZU8AAhhyYFsAAhiwAwACFYMAAWVTAAIYumBLAAIYvwACMlcAAhjDAAFCQwACGL4CwwACGL8AAWMbAAIYvKcAAhi6YEMAAhjWwfsAAhjWwU8AAhi6YFsAAhjgAwACFYMAAWVnAAIY6mBLAAIY7gLDAAIY7n+HAAIY6mBPAAIY+wACMlcAAhj/AAFCQwACGOpgQwACGQbB+wACGQcAAWVvAAIZBsCnAAIZBsBzAAIZBwABZYMAAhjqYFsAAhkcAwACFYMAAWWHAAIZJmBLAAIZKgh7AAIZKn+HAAIZKwACMlcAAhk2vAcAAhk3AAFjMwACGSoCwwACGSsAAWWLAAIZKwABZY8AAhkrAAFjIwACGSZgTwACGVMAAjJXAAIZVwABQkMAAhkmYEMAAhlewfsAAhlewU8AAhlfAAFllwACGV7AVwACGV7AYwACGV8AAjJXAAIZdwABZZ8AAhlewFsAAhlewEMAAhlfAAFlswACGV7BZwACGV7AswACGV8AAWXHAAIZXsEDAAIZXsEHAAIZXsC/AAIZXsB7AAIZXsB/AAIZXsIHAAIZXsA3AAIZXlZjAAIZXsB3AAIZXsCDAAIZXsCnAAIZXsCrAAIZXlUnAAIZXsDfAAIZXsIvAAIZXsELAAIZXsEvAAIZXsE3AAIZXsE7AAIZXsE/AAIZJmBbAAIZ5AMAAhWDAAFl1wACGe5gSwACGfCfAAIZ8wACMlcAAhn4owACGfCnAAIZ8WsAAhnuYEMAAhoIjwACGe5gWwACGhADAAIVgwABZd8AAhoaYEsAAhoef4cAAhoeVaMAAhofAAFl4wACGh8AAWXnAAIaGmBPAAIaMwACMlcAAho3AAFCQwACGhpgQwACGj8AAWXrAAIaPwABZe8AAho+D4MAAho/AAFl8wACGj6zJwACGj8AAWX3AAIaPwABZa8AAho/AAFlqwACGj8AAWWnAAIaPwABZaMAAho/AAFltwACGj8AAWXLAAIaPwABZc8AAho/AAFl0wACGj8AAWYPAAIaPwABZZMAAho+dd8AAhoaYFsAAhqEAAMAAjJbAAIajwABZisAAhqSYEsAAhqXAAIyWwACGppQAwACGpJgWwACGqADAAIajwABZi8AAhqqYE8AAhquiasAAhquDicAAhqqYFsAAhq4AwACGo8AAU/3AAIawmBPAAIaxwABAIcAAhrGDicAAhrCYFsAAhrQAwACGo8AAWYzAAIa2mBPAAIa3wABAI8AAhreDicAAhraYFsAAhroAwACGo8AAWY3AAIa8mBbAAIa9AMAAhqPAAFmOwACGv5gWwACGwADAAIajwABZj8AAhsKYFsAAhsMAwACGo8AAWZDAAIbFmBPAAIbGwABAOcAAhsWYFsAAhsgAwACGo8AAWZHAAIbKmBPAAIbLwABAIsAAhsqYFsAAhs0AwACGo8AAWZLAAIbPmBPAAIbQwABAJMAAhs+YFsAAhtIAwACGo8AAWZPAAIbUmBLAAIbVwACMlsAAhtai+8AAhtaT/sAAhtSYEMAAhtnAAE/DwACG1JgTwACG25f/wACG21rAAIbUmBbAAIbeAMAAhqPAAFmUwACG4JgQwACG4cAATDDAAIbhwABP4sAAhuGDvMAAhuCYFsAAhuUAwACGo8AAWZbAAIbnmBLAAIbowACMlsAAhumua8AAhueYEMAAhuvAAE/FwACG55gWwACG7QDAAIajwABZmMAAhu+YEMAAhvDAAE/QwACG8MAATDDAAIbwwABP4sAAhvCDvMAAhu+YFsAAhvUAwACGo8AAWZ7AAIb3mBLAAIb4wACMlsAAhvmplcAAhveYEMAAhvvAAE/EwACG95gWwACG/QDAAIajwABZoMAAhv+YEMAAhwDAAEwwwACHAMAAT+LAAIcAg7zAAIb/mBbAAIcEAADAAIyXwACHBpgRwACHB8AAWaTAAIcGwABZpcAAhwmYEsAAhwrAAIyXwACHC8AAWabAAIcKwABZp8AAhwmYE8AAhw6kVMAAhwmYEMAAhxCdqsAAhwmYFsAAhxIAwACHBqTswACHFJgSwACHFcAAjJfAAIcWhUDAAIcVwABZp8AAhxSYEMAAhxmkesAAhxmBVcAAhxSYFsAAhxwAwACHBsAAWarAAIcemBDAAIcfl1HAAIcflk/AAIcflkLAAIcfljzAAIcfljnAAIcfljbAAIcfljHAAIcemBbAAIcnAMAAhwbAAFmrwACHKZgSwACHKpJHwACHKoQfwACHKZgQwACHLZQPwACHLZQOwACHLZQUwACHLUHAAIctI8AAhymYE8AAhzODicAAhymYFsAAhzUAAMAAjJjAAIc3wABZsMAAhziYEMAAhzkjwACHOJgWwACHOwDAAIc3wABZssAAhz2YFcAAhz6TFsAAhz2YEMAAh0AjwACHPZgWwACHQgDAAIc3wABZs8AAh0SYFcAAh0WTFsAAh0SYEMAAh0cjwACHRJgWwACHSQDAAIc3wABZtMAAh0uYEsAAh0zAAIyYwACHTbmOwACHS5gQwACHT4FUwACHT5dPwACHT8AAQj3AAIdPwABToMAAh0+XWcAAh0+VcsAAh0+Vk8AAh0+Ve8AAh0+VocAAh0+VdMAAh0+VVsAAh0+VfMAAh0+VdsAAh0+VecAAh0+Vf8AAh0+VicAAh0+Vi8AAh0+VjsAAh0+VF8AAh0+VIcAAh0+VJcAAh0+Vg8AAh0+VMMAAh0+VMsAAh0+VL8AAh0+Vh8AAh0+VhcAAh0+VTcAAh0+VScAAh0+VUsAAh0+VbsAAh0+VgcAAh0+VlcAAh0+VmcAAh0+Vm8AAh0+VEsAAh0+VnsAAh0+Vl8AAh0uYE8AAh3aWRcAAh3aUbsAAh0uYFsAAh3kAAMAAjJkAwACMmsAAh3yYEMAAh33AAFm2wACHfcAASk3AAId9vQcAwACMm8AAh4G/uMAAh4KYE8AAh4NawACHgpgQwACHhYIPwACHha2FwACHha5twACHhYT4wACHhatOwACHhatRwACHha2OwACHhYFLwACHhb+5wACHhawiwACHhatWwACHha2LwACHhb+6wACHgpgWwACHkwDAAIeBwABA6sAAh5WYEMAAh5atjsAAh5a/ucAAh5asIsAAh5arVsAAh5aE+MAAh5aubcAAh5WYFsAAh50AwACHgcAAQM7AAIefmBLAAIegwACMm8AAh6HAAFm+wACHocAAQM/AAIefmBDAAIekghHAAIefmBbAAIemAMAAh4G/+sAAh6iYEsAAh6nAAIybwACHqr//wACHqsAAQADAAIeqwABAAsAAh6iYEMAAh66thcAAh66ti8AAh66rTsAAh66/usAAh66BS8AAh66rUcAAh67AAIybwACHtcAAQBPAAIe1wABACMAAh7XAAEAtwACHtcAAQCzAAIe1wABACcAAh7XAAEARwACHqJgWwACHvADAAIeBll7AAIe+mBLAAIe/hAHAAIe/wACMm8AAh8HAAEBswACHwZu8wACHvpgQwACHxMAAjJvAAIfFwABALcAAh8XAAEAswACHxcAAQAnAAIfFwABAEcAAh8SCD8AAh76YE8AAh8tawACHvpgWwACHzQDAAIeBl5zAAIfPmBLAAIfQl53AAIfQl57AAIfQl5/AAIfQwACMm8AAh9SWtMAAh9SXoMAAh9SXosAAh9SXo8AAh9BawACH0JehwACHz5gTwACH24MVwACHz5gQwACH3ZdJwACH3ZbFwACH3ZbHwACH3ZbIwACH3ZbGwACH3YQHwACH3ZbEwACHz5gWwACH5QAAwACMnMAAh+e/0cAAh+iYEMAAh+mthMAAh+mubMAAh+mrQ8AAh+mrQsAAh+mrRsAAh+mtisAAh+mrRMAAh+m/2cAAh+msIcAAh+mrTMAAh+mt+sAAh+m/2sAAh+iYFsAAh/YAwACH58AAQOfAAIf4mBDAAIf5rmzAAIf5q0PAAIf5rYrAAIf5v9nAAIf5rCHAAIf5q0zAAIf4mBbAAIgAAMAAh+fAAEDRwACIApgSwACIA8AAjJzAAIgEwABZv8AAiATAAEDPwACIBMAAWcDAAIgCmBDAAIgInTnAAIgCmBbAAIgKAMAAh+fAAEAwwACIDJgSwACIDcAAjJzAAIgOv//AAIgOwABAAMAAiA7AAEACwACIDJgQwACIEq2EwACIEq36wACIEr/awACIEsAAjJzAAIgWwABAP8AAiBbAAEBJwACIFsAAQFLAAIgWwABAQMAAiBbAAEBQwACIFsAAQEfAAIgSq0LAAIgSq0TAAIgSq0bAAIgMmBbAAIggAMAAh+eWb8AAiCKYEsAAiCPAAIycwACIJJfLwACIJJfKwACIIpgQwACIJ8AAjJzAAIgowABAbsAAiCjAAEBSwACIKMAAQEDAAIgowABAUMAAiCjAAEBHwACIIpgWwACILgAAwACMU8AAiDCYEcAAiDHAAFnJwACIMcAAWcrAAIgwmBLAAIg0wABbesAAiDSCAsAAiDCYEMAAiDeDsMAAiDfAAER7wACIN8AAWjzAAIg3wABaP8AAiDfAAFo9wACIN8AARI7AAIg3wABaQMAAiDfAAFpBwACIN8AAWkLAAIg3wABaQ8AAiDeoY8AAiDDAAFnLwACIQ5gQwACIRMAAQazAAIhElafAAIhElaPAAIhElazAAIhEsB3AAIhEwABHCMAAiETAAEcOwACIRMAAR1HAAIhEwABG/cAAiESwD8AAiESwDsAAiESwPcAAiESVh8AAiESwScAAiESV1cAAiESwRcAAiETAAEbzwACIRMAARvzAAIhElefAAIhElbLAAIhEwABHIcAAiETAAEdVwACIRMAARx7AAIhEwABHS8AAiETAAEbkwACIRMAAR07AAIhEtG/AAIhEwABHKMAAiETAAEbxwACIRLRTwACIRMAARy7AAIhEwABHK8AAiETAAEdPwACIRLBGwACIRJXlwACIRMAARyrAAIhEwABG4MAAiETAAEckwACIRMAARt7AAIhEwABHJcAAiETAAEcmwACIRMAARyfAAIhEwABHHcAAiETAAEciwACIRMAARyDAAIhEwABHH8AAiESVVsAAiESV68AAiETAAEcjwACIRMAARuPAAIhEwABG4sAAiETAAEcpwACIRMAARzLAAIhEwABHM8AAiESwB8AAiETAAEb0wACIRMAARxbAAIhEwABHGMAAiETAAEcZwACIRMAARxrAAIhEwABHG8AAiETAAEcXwACIQ5gWwACIgwDAAIgwwABZzcAAiIWYEMAAiIbAAEI9wACIhsAAQazAAIiGwABGwsAAiIbAAFnOwACIhrCNwACIhpWnwACIhpWjwACIhpWswACIhrAdwACIhsAARwjAAIiGwABHDsAAiIbAAEdRwACIhsAARv3AAIiGsA/AAIiGsA7AAIiGsD3AAIiGlYfAAIiGsEnAAIiGsEXAAIiGlefAAIiGlbLAAIiGwABHIcAAiIaV1cAAiIbAAEbzwACIhsAARvzAAIiGwABGxMAAiIbAAFnPwACIhsAARx7AAIiGwABHS8AAiIbAAEbkwACIhsAAR07AAIiGtG/AAIiGwABHKMAAiIbAAEbxwACIhrRTwACIhsAARy7AAIiGwABHK8AAiIbAAEbgwACIhsAAR0/AAIiGleXAAIiGwABHKsAAiIawRsAAiIbAAEckwACIhsAARt7AAIiGwABZ0MAAiIbAAEclwACIhsAARybAAIiGwABHJ8AAiIbAAFnRwACIhsAARx3AAIiGwABHIsAAiIbAAEcgwACIhsAARx/AAIiGlVbAAIiGlevAAIiGwABHI8AAiIbAAEbjwACIhsAARuLAAIiGwABHKcAAiIbAAEcywACIhsAARzPAAIiGwABZ0sAAiIbAAEcWwACIhsAARxjAAIiGwABHGcAAiIbAAEcawACIhsAARxvAAIiGwABHF8AAiIbAAEb0wACIhrAHwACIhsAAR1XAAIiFmBbAAIjOAMAAiDDAAFnTwACI0JgQwACI0cAAQazAAIjRlafAAIjRlaPAAIjRlazAAIjRsB3AAIjRwABHCMAAiNHAAEcOwACI0cAAR1HAAIjRwABG/cAAiNGwD8AAiNGwDsAAiNGwPcAAiNGVh8AAiNGwScAAiNGV1cAAiNGwRcAAiNHAAEbzwACI0cAARvzAAIjRlefAAIjRlbLAAIjRwABHIcAAiNHAAEdVwACI0cAARx7AAIjRwABHS8AAiNHAAEbkwACI0cAAR07AAIjRtG/AAIjRwABHKMAAiNHAAEbxwACI0bRTwACI0cAARy7AAIjRwABHK8AAiNHAAEdPwACI0bBGwACI0ZXlwACI0cAARyrAAIjRwABG4MAAiNHAAEckwACI0cAARt7AAIjRwABHJcAAiNHAAEcmwACI0cAARyfAAIjRwABHHcAAiNHAAEciwACI0cAARyDAAIjRwABHH8AAiNGVVsAAiNGV68AAiNHAAEcjwACI0cAARuPAAIjRwABG4sAAiNHAAEcpwACI0cAARzLAAIjRwABHM8AAiNGwB8AAiNHAAEb0wACI0cAARxbAAIjRwABHGMAAiNHAAEcZwACI0cAARxrAAIjRwABHG8AAiNHAAEcXwACI0JgWwACJEADAAIgwwABZ1MAAiRKYEMAAiRPAAEI9wACJE8AAQazAAIkTwABGwsAAiRPAAFnOwACJE7CNwACJE5WnwACJE5WjwACJE5WswACJE7AdwACJE8AARwjAAIkTwABHDsAAiRPAAEdRwACJE8AARv3AAIkTsA/AAIkTsA7AAIkTsD3AAIkTlYfAAIkTsEnAAIkTsEXAAIkTlefAAIkTlbLAAIkTwABHIcAAiROV1cAAiRPAAEbzwACJE8AARvzAAIkTwABGxMAAiRPAAFnPwACJE8AARx7AAIkTwABHS8AAiRPAAEbkwACJE8AAR07AAIkTtG/AAIkTwABHKMAAiRPAAEbxwACJE7RTwACJE8AARy7AAIkTwABHK8AAiRPAAEbgwACJE8AAR0/AAIkTleXAAIkTwABHKsAAiROwRsAAiRPAAEckwACJE8AARt7AAIkTwABZ0MAAiRPAAEclwACJE8AARybAAIkTwABHJ8AAiRPAAFnRwACJE8AARx3AAIkTwABHIsAAiRPAAEcgwACJE8AARx/AAIkTlVbAAIkTlevAAIkTwABHI8AAiRPAAEbjwACJE8AARuLAAIkTwABHKcAAiRPAAEcywACJE8AARzPAAIkTwABZ0sAAiRPAAEcWwACJE8AARxjAAIkTwABHGcAAiRPAAEcawACJE8AARxvAAIkTwABHF8AAiRPAAEb0wACJE7AHwACJE8AAR1XAAIkSmBbAAIlbAMAAiDCud8AAiV2YFsAAiV4AwACIMJQNwACJYJgSwACJYcAAjFPAAIliwABZ1sAAiWCYE8AAiWSgYcAAiWTAAFgvwACJYJgQwACJZ5QOwACJZ5QPwACJZ5UQwACJZ8AAWdXAAIlnwACMU8AAiWzAAEvBwACJZ68xwACJZ8AAWdfAAIlnwABZ2MAAiWeobcAAiWCYFsAAiXIAwACIMMAAWdnAAIl0mBLAAIl1kkzAAIl0mBDAAIl3lA7AAIl3lRDAAIl3lA/AAIl3wABZ1cAAiXfAAIxTwACJfMAAS8HAAIl0mBbAAIl+AMAAiDCVosAAiYCYEMAAiYHAAFnYwACJgJgWwACJgwDAAIgwlaTAAImFmBLAAImGlaXAAImFmBDAAImIlA7AAImIlRDAAImIlA/AAImIwABZ1cAAiYjAAIxTwACJjcAAS8HAAImFmBbAAImPAMAAiY+VNMAAiDCSN8AAiZKYEsAAiZOSR8AAiZKYEMAAiZWUDsAAiZWVEMAAiZWUD8AAiZXAAFnVwACJlcAAjFPAAImawABLwcAAiZKYFsAAiZwAwACIMJWrwACJnpgQwACJn5QOwACJn5UQwACJn5QPwACJn8AAWdXAAImfwACMU8AAiaTAAEvBwACJnpgWwACJpgDAAIgwwABZ2sAAiaiYEsAAiamVT8AAiamBPMAAiamVUMAAiaiYE8AAia3AAFncwACJqJgQwACJr5QOwACJr5UQwACJr5QPwACJr8AAWdXAAImvwACMU8AAibTAAEvBwACJqJgWwACJtgDAAIm2wABZ28AAiDDAAFndwACJuZgSwACJupJMwACJuZgWwACJvADAAIgwwABZ3sAAib6YEsAAib+kusAAib+VT8AAib+mxcAAib6YEMAAicOUDsAAicOVEMAAicOUD8AAicPAAFnVwACJw8AAjFPAAInIwABLwcAAib6YFsAAicoAwACIMLitwACJzJgSwACJzcAARuXAAInNg4jAAInMmBDAAInQlA7AAInQlRDAAInQlA/AAInQwABZ1cAAidDAAIxTwACJ1cAAS8HAAInMmBbAAInXAMAAiDDAAFnfwACJ2ZgSwACJ2pVPwACJ2ZgQwACJ3JQOwACJ3JUQwACJ3JQPwACJ3MAAWdXAAIncwACMU8AAieHAAEvBwACJ2ZgWwACJ4wDAAIgwwABZ4MAAieWYEsAAieaVT8AAieWYEMAAieiUDsAAieiVEMAAieiUD8AAiejAAFnVwACJ6MAAjFPAAIntwABLwcAAieWYFsAAie8AwACIMMAAVRPAAInxmBLAAInywABG+MAAifGYEMAAifSUDsAAifSVEMAAifSUD8AAifTAAFnVwACJ9MAAjFPAAIn5wABLwcAAifGYFsAAifsAwACIMMAAVRHAAIn9mBLAAIn+wABG+MAAif2YEMAAigCUDsAAigCVEMAAigCUD8AAigDAAFnVwACKAMAAjFPAAIoFwABLwcAAif2YFsAAigcAwACIMMAAWeHAAIoJmBLAAIoKgIrAAIoJmBDAAIoMlA7AAIoMlRDAAIoMlA/AAIoMwABZ1cAAigzAAIxTwACKEcAAS8HAAIoJmBbAAIoTAMAAiDCVhsAAihWYEsAAihaSR8AAihWYEMAAihiUDsAAihiVEMAAihiUD8AAihjAAFnVwACKGMAAjFPAAIodwABLwcAAihWYFsAAih8AwACIMMAAWeLAAIohmBLAAIoikkzAAIoiwABHP8AAiiLAAEdAwACKIZgQwACKJpQOwACKJpUQwACKJpQPwACKJsAAWdXAAIomwACMU8AAiivAAEvBwACKIZgWwACKLQDAAIgwldLAAIovmBLAAIownWbAAIowkkzAAIovmBDAAIozlA7AAIozlRDAAIozlA/AAIozwABZ1cAAijPAAIxTwACKOMAAS8HAAIovmBbAAIo6AMAAiDDAAFnjwACKPJgSwACKPYOWwACKPZXCwACKPJgQwACKQJQOwACKQJUQwACKQJQPwACKQMAAWdXAAIpAwACMU8AAikXAAEvBwACKPJgWwACKRwDAAIgwwABZ5MAAikmYEsAAikqSTMAAikmYFsAAikwAwACIMMAAWeXAAIpOmBLAAIpPkkfAAIpOmBDAAIpRlA7AAIpRlRDAAIpRlA/AAIpRwABZ1cAAilHAAIxTwACKVsAAS8HAAIpOmBbAAIpYAMAAiDDAAFnmwACKWpgQwACKW5QOwACKW5UQwACKW5QPwACKW8AAWdXAAIpbwACMU8AAimDAAEvBwACKWpgWwACKYgDAAIgwlebAAIpkmBLAAIplgLDAAIplkk/AAIpkmBDAAIpolA7AAIpolRDAAIpolA/AAIpowABZ1cAAimjAAIxTwACKbcAAS8HAAIpkmBbAAIpv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WJjAAI0DwABaQMAAjQPAAFpBwACNA5tBwACNA8AAWkLAAI0DwABaQ8AAjQKYFsAAjR8AwACIMMAAWkTAAI0hmBLAAI0io9rAAI0iIsAAjSGYEMAAjSUjwACNIZgWwACNJwDAAIgwwABaTMAAjSmYEsAAjSrAAFpNwACNKsAAWk7AAI0qwABaRcAAjSqBQMAAjSrAAFpPwACNKsAAQdTAAI0qwABaUMAAjSrAAELOwACNKsAAWlHAAI0qwABaUsAAjSqcUMAAjSqYyMAAjSrAAFpTwACNKsAAWlTAAI0qwABaVcAAjSrAAFpWwACNKsAAWlfAAI0qwABaWMAAjSrAAFpZwACNKsAAWlrAAI0qnGPAAI0qwABaW8AAjSqcYsAAjSqclsAAjSqcdsAAjSrAAFpcwACNKsAAQ5vAAI0qwABaXcAAjSrAAFpewACNKsAAWl/AAI0qwABaYMAAjSrAAFphwACNKZgTwACNS8AAWmPAAI1LwABaZMAAjSmYEMAAjU7AAFplwACNTsAAWmbAAI1OwABaacAAjU69fMAAjU7AAFprwACNTsAAWmLAAI1OwABadcAAjU7AAFp2wACNTsAAWnfAAI1OwABaeMAAjU7AAFp7wACNToLowACNTsAAWnzAAI1OwABWgMAAjU7AAFZTwACNTsAAWoTAAI1OwABaf8AAjU7AAFqIwACNTsAAWovAAI1OwABaicAAjU7AAFqOwACNTsAAWo/AAI1OwABakMAAjU7AAFqRwACNTsAAWpbAAI1OwABagMAAjU63GsAAjU7AAFqXwACNTsAAWpnAAI1OwABamsAAjU6SR8AAjU6SUMAAjU7AAFZiwACNTsAAVl3AAI1OwABanMAAjU7AAFqowACNTsAAWp3AAI1OwABansAAjU7AAFqfwACNTsAAWqDAAI1OwABag8AAjU7AAFqhwACNTsAAWqLAAI1OwABasMAAjU7AAFqjwACNTsAAWqTAAI1OwABapcAAjU7AAFquwACNKZgWwACNfwDAAIgwwABas8AAjYGYEsAAjYKC/cAAjYKBPsAAjYLAAFq0wACNgsAAWrXAAI2BmBDAAI2HVsAAjYGYE8AAjYlXwACNgZgWwACNiwDAAIgwwABatsAAjY2YEsAAjY6C/cAAjY6BPsAAjY2YE8AAjZFVwACNjZgWwACNkwDAAIgwwABat8AAjZWYEsAAjZbAAEJKwACNlsAAQkvAAI2WwABauMAAjZbAAEJJwACNlZgQwACNm8AAWrnAAI2VmBbAAI2dAMAAiDDAAFq6wACNn5gQwACNoILowACNoKvdwACNoKvcwACNoKvfwACNn5gWwACNpQDAAIgwwABau8AAjaeYEsAAjaiCEsAAjaeYEMAAjaqr3cAAjaq0wsAAjaeYFsAAja0AwACIMJjCwACNr5gSwACNsG/AAI2wgefAAI2wwABCSsAAjbDAAFq8wACNsMAAWr3AAI2wwACMU8AAjbbAAFq+wACNtoOewACNtoOfwACNsMAAWr/AAI2wwABawMAAjbDAAFrBwACNsMAAWsLAAI2wwABaw8AAjbDAAFrFwACNsMAAWsfAAI2wwABOhsAAja+YEMAAjcLAAFrIwACNwoOkwACNwoOlwACNwsAAWsnAAI3CwABaysAAjcLAAFrLwACNwmjAAI3CwABazsAAjcLAAFrPwACNwsAAWtDAAI3CwABa0cAAjcKjlsAAjcLAAIxTwACNz8AAWs3AAI3PwABa7sAAjcLAAFrSwACNwqvcwACNwsAAWtTAAI3CnxrAAI3CwABa1cAAjcLAAEGqwACNwsAAQazAAI3CwABa2sAAjcLAAFrbwACNwsAAWuDAAI3CwABa3sAAjcKVp8AAjcKVo8AAjcKVrMAAjcLAAFrhwACNwrAdwACNwsAARwjAAI3CwABHDsAAjcLAAEdRwACNwsAARv3AAI3CsA/AAI3CsA7AAI3CsD3AAI3CwABHVcAAjcKVh8AAjcKwScAAjcKV1cAAjcKwRcAAjcLAAEbzwACNwsAARvzAAI3ClbLAAI3CwABa5sAAjcKV58AAjcLAAFrZwACNwsAAR0vAAI3CwABG5MAAjcLAAEdOwACNwrRvwACNwsAARyjAAI3CwABG8cAAjcK0U8AAjcLAAEcuwACNwsAARyvAAI3CwABHT8AAjcKwRsAAjcKV5cAAjcLAAEcqwACNwsAAVzTAAI3CwABa9cAAjcLAAEbgwACNwsAARyTAAI3CwABG3sAAjcLAAEclwACNwsAAWvvAAI3CwABHJsAAjcLAAEcnwACNwsAARx3AAI3CwABHIsAAjcKVVsAAjcKV68AAjcLAAEcjwACNwsAARyDAAI3CwABHH8AAjcLAAEbjwACNwsAARuLAAI3CwABHKcAAjcLAAEcywACNwsAARzPAAI3CwABHHsAAjcLAAEchwACNwsAAWdLAAI3CwABHFsAAjcLAAEcYwACNwsAARxnAAI3CwABHGsAAjcLAAEcbwACNwsAARxfAAI3CwABG9MAAjcKwB8AAja+YE8AAjiGDosAAjiHAAFrMwACNr5gWwACOJADAAIgwwABbAcAAjiaYEsAAjieUCMAAjieDFMAAjiaYEMAAjipPwACOKoO8wACOJpgWwACOLQDAAIgwwABbAsAAji+YEsAAjjCje8AAjjDAAFsDwACOMMAAWufAAI4wg7PAAI4wwABbBMAAjjDAAFsGwACOL5gQwACON8AAWwjAAI43wABbCcAAjjfAAFsKwACON5XnwACON8AARyTAAI43wABG3sAAjjewRsAAjjfAAEb0wACON5XlwACOL5gWwACOQQDAAIgwwABbC8AAjkOYEsAAjkSB58AAjkOYEMAAjkbAAEGswACORsAAQj3AAI5GlafAAI5GlaPAAI5GlazAAI5GsB3AAI5GwABHCMAAjkbAAEcOwACORsAAR1HAAI5GwABG/cAAjkawD8AAjkawDsAAjkawPcAAjkaVh8AAjkawScAAjkaV1cAAjkawRcAAjkbAAEbzwACORsAARvzAAI5GlefAAI5GlbLAAI5GwABHIcAAjkbAAEbEwACOQ5gWwACOXgDAAIgwwABbDcAAjmCYEMAAjmGYj8AAjmGlHsAAjmHAAFsPwACOYZZrwACOYZZuwACOYJgWwACOZwDAAIgwwABbEMAAjmmYEMAAjmqYj8AAjmqlHsAAjmrAAFsPwACOapZrwACOapZuwACOaZgWwACOcADAAIgwwABbEcAAjnKYEsAAjnOVY8AAjnPAAFsSwACOc8AAWxPAAI5zwABbFMAAjnPAAFsVwACOc8AAWxbAAI5zwABbF8AAjnPAAFsYwACOcpgQwACOfJZrwACOfJZuwACOfJiPwACOfMAAWxnAAI58pR7AAI58wABbD8AAjnzAAFsawACOfMAAWxvAAI5ymBbAAI6FAMAAiDDAAFsfwACOh5gSwACOiJJRwACOiIOywACOiK54wACOiMAAQjbAAI6HmBDAAI6NwABa08AAjo2r38AAjoeYFsAAjpAAwACIMMAAWyDAAI6SmBLAAI6TwABbIcAAjpPAAFsiwACOkpgQwACOlsAAWiTAAI6WwABaJcAAjpbAAFomwACOlsAAWifAAI6SmBbAAI6bAMAAiDCFa8AAjp2YEsAAjp6C/cAAjp64EMAAjp7AAFoowACOnqviwACOnp88wACOnq7IwACOnsAAWyPAAI6dmBPAAI6mtcTAAI6dmBDAAI6owACMU8AAjqnAAFsmwACOqcAAWyTAAI6oqJnAAI6dmBbAAI6tAMAAjq3AAFslwACOrcAAWyfAAIgwwABbLcAAjrGYEsAAjrLAAFoowACOssAARpDAAI6ywABbLsAAjrGYEMAAjrZgwACOtoLowACOtqJUwACOtsAAWy/AAI62nxrAAI62wABbMcAAjrbAAFsywACOtsAAQj3AAI62wABbNMAAjrbAAFs1wACOtsAARxbAAI62wABHF8AAjrbAAFs5wACOtsAARxjAAI62wABHGcAAjrbAAEcawACOtsAARxvAAI62wABbQ8AAjrbAAEGswACOtpWnwACOtpWjwACOtpWswACOtrAdwACOtsAAW0bAAI62wABbR8AAjrbAAEcIwACOtsAARw7AAI62wABbUsAAjrbAAEdRwACOtsAARv3AAI62sA/AAI62sA7AAI62sD3AAI62wABHVcAAjraVh8AAjrawScAAjraV1cAAjrawRcAAjrbAAEbzwACOtsAARvzAAI62lefAAI62lbLAAI62wABHIcAAjrbAAEcewACOtsAAR0vAAI62wABG5MAAjrbAAEdOwACOtrRvwACOtsAARyjAAI62wABG8cAAjrbAAFtewACOtrRTwACOtsAARy7AAI62wABHK8AAjrbAAEdPwACOtrBGwACOtpXlwACOtsAARyrAAI62wABG4MAAjrbAAEckwACOtsAARt7AAI62wABHJcAAjrbAAEcmwACOtsAARyfAAI62wABHHcAAjrbAAEciwACOtsAARyDAAI62wABHH8AAjraVVsAAjraV68AAjrbAAEcjwACOtsAARuPAAI62wABG4sAAjrbAAEcpwACOtsAARzLAAI62wABHM8AAjrbAAEb0wACOtrAHwACOsZgWwACPBQDAAIgwwABbbMAAjweYEsAAjwjAAFttwACPCMAAWyPAAI8IgNDAAI8HmBDAAI8MwABbMMAAjwyfGsAAjwzAAEI9wACPDMAAWdLAAI8HmBbAAI8RAMAAiDDAAFtuwACPE5gQwACPFMAAW2/AAI8UwABbcMAAjxTAAFtzwACPFMAAW3bAAI8UwABbd8AAjxTAAEGswACPFMAARxfAAI8UwABHG8AAjxTAAEcawACPFMAARxnAAI8UwABHGMAAjxTAAEcWwACPFMAARvTAAI8UsAfAAI8UwABHM8AAjxTAAEcywACPFMAARynAAI8UwABG4sAAjxTAAEbjwACPFJXrwACPFMAARyPAAI8UlVbAAI8UwABHH8AAjxTAAEcgwACPFMAARyLAAI8UwABHHcAAjxTAAEcnwACPFMAARybAAI8UwABHJcAAjxTAAEbewACPFMAARyTAAI8UwABG4MAAjxTAAEcqwACPFJXlwACPFLBGwACPFMAAR0/AAI8UwABHK8AAjxTAAEcuwACPFLRTwACPFMAARvHAAI8UwABHKMAAjxS0b8AAjxTAAEdOwACPFMAARuTAAI8UwABHS8AAjxTAAEcewACPFMAAR1XAAI8UwABHIcAAjxSVssAAjxSV58AAjxTAAEb8wACPFMAARvPAAI8UsEXAAI8UldXAAI8UsEnAAI8UlYfAAI8UsD3AAI8UsA7AAI8UsA/AAI8UwABG/cAAjxTAAEdRwACPFMAARw7AAI8UwABHCMAAjxSwHcAAjxSVrMAAjxSVo8AAjxSVp8AAjxOYFsAAj1gAAMAAjJ3AAI9amBDAAI9bwABbgcAAj1rAAFt8wACPXZgSwACPXsAAizbAAI9fg57AAI9fg5/AAI9fg6DAAI9dmBPAAI9jg6LAAI9jg6PAAI9dmBTAAI9mg6PAAI9dmBDAAI9og6TAAI9og6XAAI9og6bAAI9dmBbAAI9sAMAAj1rAAFt9wACPbpgSwACPb4N6wACPb4OpwACPbpgQwACPcoOqwACPcoOtwACPck/AAI9yg7HAAI9yg7TAAI9yg7jAAI9yg7rAAI9yg7bAAI9yg7XAAI9yg7/AAI9umBbAAI99AMAAj1rAAFt+wACPf5gSwACPgIN6wACPf5gQwACPgsAAW3/AAI+CwABCPcAAj4KV68AAj4K0U8AAj4LAAEciwACPgsAAQkfAAI9/mBbAAI+JAMAAj1rAAFuAwACPi5gQwACPjILowACPi5gWwACPjgAAwACMnsAAj5DAAFuEwACPkZgSwACPksAAUivAAI+Sr9PAAI+RmBDAAI+VwABSLMAAj5XAAFIjwACPlcAAUi7AAI+RmBbAAI+ZAMAAj5DAAFuFwACPm5gSwACPnMAAjJ7AAI+dwABSR8AAj53AAFuGwACPncAAW4fAAI+dwABbiMAAj53AAFuJwACPncAAW4rAAI+dwABbi8AAj53AAFuMwACPncAAW43AAI+dwABbjsAAj53AAFuPwACPncAAW5DAAI+dwABbkcAAj5uYE8AAj6vAAIyewACPrMAAW5LAAI+swABbk8AAj5uYEMAAj6/AAFIcwACPr5dPwACPr8AAQj3AAI+vwABToMAAj6/AAFuUwACPr8AAW5fAAI+vwABbmMAAj6+VOMAAj6+V0cAAj6+V2MAAj6+VFcAAj6+VF8AAj6/AAIyewACPvMAAW57AAI+8wABbnMAAj7zAAFugwACPvMAAW5/AAI+8wABbrsAAj7zAAFuqwACPvMAAW6HAAI+vleXAAI+vlYPAAI+vlhPAAI+vlcDAAI+vlbbAAI+vlbjAAI+vlbzAAI+vlT7AAI+vlS/AAI+vlS3AAI+vwABbo8AAj6+UvcAAj6+Uw8AAj6+U2sAAj6+VlcAAj6+V58AAj6+V9MAAj6+V+MAAj6+V88AAj6+V9sAAj6+V/MAAj6+WAsAAj6+WDsAAj6+WEMAAj6/AAFudwACPr8AAW6LAAI+vlYHAAI+vlW7AAI+vlXLAAI+vlZPAAI+vld7AAI+vlZ7AAI+vlaHAAI+vlP/AAI+vlYnAAI+vlYvAAI+vlY7AAI+vlZDAAI+vlXzAAI+vlXTAAI+vlXbAAI+vlXnAAI+vlX/AAI+vlXvAAI+vlVbAAI+vlTDAAI+vlTLAAI+vlUDAAI+vlULAAI+vlVLAAI+vlTzAAI+vlR/AAI+vlSHAAI+vlSPAAI+vlSXAAI+vlUnAAI+vlU3AAI+vlZnAAI+vlZvAAI+vldXAAI+vlUbAAI+vlYfAAI+vlYXAAI+vlafAAI+vlbDAAI+vlc7AAI+vlazAAI+vlaPAAI+vlcPAAI+vlcjAAI+vlcrAAI+vlbTAAI+vlbLAAI+vlOzAAI+vlPLAAI+vlO7AAI+vlPDAAI+vlPTAAI+vlczAAI+vlZfAAI+bmBbAAJAUAMAAj5DAAFuvwACQFpgSwACQFyfAAJAXwACMnsAAkBkowACQFynAAJAXhB/AAJAXwABbscAAkBfAAFuzwACQFpgQwACQHyPAAJAWmBbA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wACTNL/+wACTNMAAXNjAAJM0wABc2cAAkzTAAFzawACTNMAAXNvAAJM0wABc3MAAkzTAAFzdwACTNMAAXN7AAJM0wABM08AAkzTAAFuMwACTNMAAXN/AAJM0wABc4MAAkzTAAFzhwACTNMAAXOLAAJM0lIzAAJMymBPAAJNLwACMo8AAk0zAAFzkwACTTMAAXObAAJNMwABc58AAk0yvksAAk0zAAFzrwACTS8AARaXAAJNLlG7AAJMymBTAAJNUwACMo8AAk1XAAFzkwACTMpgQwACTV8AAjKPAAJNYwABc6MAAk1jAAEzbwACTWMAAXOzAAJNYwABc7cAAk1jAAF0swACTWMAAXQPAAJNYwABdBsAAk1jAAF0FwACTWMAAXTbAAJNYwABdOMAAk1jAAF05wACTWMAAXUDAAJNYwABdKcAAk1eCI8AAk1fAAFzwwACTV8AARaDAAJNXnxrAAJNXlojAAJNXwABND8AAk1eUw8AAk1eU7MAAk1eU7sAAk1eU8MAAk1eU8sAAk1fAAFz0wACTV5T/wACTV5VGwACTV8AAXPnAAJNXl1nAAJNXl2HAAJNXlXzAAJNXwABc/MAAk1eVp8AAk1eVo8AAk1eVrMAAk1eVsMAAk1eVtMAAk1eVssAAk1eVw8AAk1eVyMAAk1eVysAAk1eVicAAk1fAAF0OwACTV5WLwACTV8AAXRTAAJNXlY7AAJNXwABdFsAAk1eVzsAAk1eVe8AAk1fAAF0cwACTV5V2wACTV8AAXR7AAJNXlXnAAJNXwABdIMAAk1eVdMAAk1fAAF0hwACTV5VWwACTV5V/wACTV8AAXSPAAJNXlYHAAJNXwABdJMAAk1eV5cAAk1eVFcAAk1eVF8AAk1fAAFz2wACTV5U8wACTV8AAXS7AAJNXwABdL8AAk1fAAF0rwACTV5WZwACTV5WbwACTV5XAwACTV8AATWzAAJNXlULAAJNXwABc98AAk1fAAF0nwACTV8AAXTvAAJNXwABdPMAAk1eVQMAAk1eVnsAAk1eVMMAAk1fAAF0+wACTV5UywACTV8AAUeLAAJNXlR/AAJNXlSPAAJNXlSHAAJNXlYPAAJNXwABc/8AAk1eVzMAAk1eVbsAAk1eVScAAk1eVTcAAk1eVUsAAk1fAAF1VwACTV5XnwACTV5WVwACTV5W2wACTV5W4wACTV5W8wACTV5XRwACTV5XYwACTV5XVwACTV5WHwACTV5WFwACTV8AAXVzAAJNXlS3AAJNXlS/AAJNXlT7AAJNXlXLAAJNXlZPAAJNXld7AAJNXlaHAAJNXlRLAAJNXlZfAAJMymBbAAJPMAMAAkzHAAF1gwACTzpgSwACTz4PmwACTz5JHwACTzpgQwACT0pdRwACT0pYbwACT0pYewACT0pYhwACT0pYkwACT0pYowACT0pYswACT0pYxwACT0pY2wACT0pY5wACT0pY8wACT0pZCwACT0pZJwACT0pZMwACT0pZPwACTzpgWwACT4gDAAJMxwABdYsAAk+SYEsAAk+Wf7MAAk+Wr18AAk+SYFsAAk+gAwACTMcAAXWPAAJPqmBLAAJPrwACMo8AAk+zAAFEHwACT7MAAXWTAAJPswABdZcAAk+vAAFz4wACT68AAXQLAAJPqmBXAAJPyuEvAAJPqmBPAAJP0wABc/cAAk/TAAFzuwACT6pgQwACT98AAXO/AAJP3wABdG8AAk/eYO8AAk/fAAFz1wACT97/qwACT98AATRnAAJP3wABdQ8AAk/fAAF1ZwACT98AAXQHAAJP3wABdBMAAk/fAAF0KwACT98AATYvAAJP3wABNosAAk/erCsAAk/fAAIyjwACUBsAAXDbAAJP3I8AAk+qYFsAAlAnAAF1mwACUCcAAXWfAAJQJq8HAAJQJwABdaMAAlAmSQwDAAIykwACUD8AAXXnAAJQQmBLAAJQRwABdesAAlBHAAIykwACUE8AAXXvAAJQQmBPAAJQVwABF3sAAlBCYEMAAlBeCI8AAlBfAAIykwACUGcAAXX7AAJQZwABdgMAAlBnAAF19wACUGcAAXYnAAJQZwABdh8AAlBfAAFyEwACUF8AAXG3AAJQXwABcgMAAlBCYFsAAlCIAwACUD8AAXYzAAJQkmBDAAJQlwABcbcAAlCSYFsAAlCcAAMAAjKXAAJQpmBLAAJQqwABdj8AAlCrAAF2QwACUKsAAXZHAAJQqwABdksAAlCrAAF2TAMAAjKbAAJQwwABSJMAAlDGYEsAAlDLAAIymwACUM8AAXZbAAJQylbrAAJQyklHAAJQyuEvAAJQywABdl8AAlDGYE8AAlDnAAFy/wACUOb6lwACUMZgQwACUPMAAXZrAAJQ8RMAAlDyAssAAlDzAAF2bwACUPMAAjKbAAJRBwABdnMAAlEHAAFw2wACUPMAAXaHAAJQ8lbvAAJQ8qwrAAJQ8I8AAlDGYFsAAlEgAwACUSLhLwACUSMAAXWjAAJQwwABdrMAAlEyYEsAAlE2UOsAAlE3AAFzuwACUTcAAXWrAAJRMmBXAAJRRkxbAAJRMmBDAAJRTwABc9cAAlFOYO8AAlFODvMAAlFPAAF0BwACUTJgWwACUWADAAJRYwABdrcAAlDDAAFwnwACUW5gSwACUXJUqwACUXJT9wACUW5gTwACUX1rAAJRfVcAAlF+DicAAlFuYEMAAlGMjwACUY0HAAJRjwABcecAAlGODvMAAlGOTHsAAlGOC0MAAlFuYFsAAlGoAwACUapU0wACUMMAAXbXAAJRtmBLAAJRulSrAAJRulP3AAJRuwACMpsAAlHHAAF22wACUbZgTwACUc8AAjKbAAJR0wABduMAAlHNXwACUbZgQwACUd1bAAJRtmBbAAJR5AMAAlDDAAF25wACUe5gSwACUfMAAjKbAAJR9wABRB8AAlHuYEMAAlH+wusAAlH+mxcAAlH/AAF1ZwACUf8AAXQHAAJR/wABdBMAAlH/AAF0KwACUf8AATYvAAJR/wABNosAAlH+rCsAAlH/AAIymwACUicAAXDbAAJR/I8AAlHuYFsAAlIwAwACUjJMWwACUjLhLwACUjMAAXWgAwACMp8AAlJGYEsAAlJLAAF3LwACUksAAXc7AAJSRwABdyMAAlJWYEsAAlJbAAEXHwACUlsAARcbAAJSVmBDAAJSZgiPAAJSZwABchMAAlJnAAFxtwACUmcAAXIDAAJSVmBbAAJSeAADAAIyowACUoJgSwACUocAAXdPAAJSgwABd0MAAlKOYEsAAlKTAAEXJwACUpMAARcvAAJSkwABFzMAAlKOYEMAAlKiCI8AAlKjAAFyEwACUqMAAXG3AAJSowABcgMAAlKOYFsAAlK0AAMAAjKnAAJSvmBLAAJSwwABd2MAAlK/AAF3VwACUspgSwACUs8AARcfAAJSymBDAAJS1giPAAJS1wABchMAAlLXAAFxtwACUtcAAXIDAAJSymBbAAJS6AADAAIyqwACUvMAAXdrAAJS9mBLAAJS+wABd28AAlL4ZwACUvqW7wACUvsAAXd3AAJS+wABd3sAAlL7AAF3fwACUvZgQwACUxcAARdHAAJTFwABF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AJXArzvAAJW9mBbAAJXCAMAAlZnAAEOfwACVxJgTwACVxcAAXpLAAJXEmBDAAJXHwABekMAAlcfAAFiOwACVx8AAWIvAAJXHwABOTMAAlcevRMAAlcfAAFiMwACVx8AAV7zAAJXHwABYcsAAlcfAAF6IwACVx8AARIjAAJXHwABEfsAAlcfAAF6TwACVx8AAXpTAAJXHwABYecAAlcfAAF6JwACVx6vDwACVxJgWwACV2ADAAJWZwABelcAAldqYEsAAldvAAF6SwACV2pgTwACV3a8MwACV2pgQwACV38AAXpbAAJXfwABemMAAld/AAF6ZwACV38AAWIzAAJXfr0TAAJXfwABXvMAAld/AAF6IwACV38AARIjAAJXamBbAAJXoAADAAIyvwACV6sAAXpvAAJXrmBLAAJXswACMr8AAle3AAF6cwACV7atzwACV7a75wACV7Z+9wACV7a05wACV7cAATM7AAJXrmBPAAJX0wACMr8AAlfXAAETxwACV65gQwACV98AAjK/AAJX4wABencAAlfjAAF6jwACV98AAXqXAAJXrmBbAAJX8AADAAIywwACV/sAAXrDAAJX/mBLAAJYAwACMsMAAlgGsVcAAlgGrc8AAlgHAAF6cwACWAa8JwACWAa75wACWAa8EwACWAa8AwACWAZ+9wACWAa05wACV/5gTwACWC8AAjLDAAJYMwABDY8AAlgzAAENzwACWDMAARPHAAJX/mBDAAJYQwABescAAlhDAAIywwACWEsAAXs7AAJYSwABe1MAAlhDAAF7owACWEMAAXu3AAJX/mBbAAJYXAADAAIyxwACWGcAAXu/AAJYamBDAAJYbwABe8MAAlhqYFsAAlh0AAMAAjLLAAJYfwABe98AAliCYE8AAliGEusAAliGAisAAliHAAIyywACWJMAASxrAAJYgmBDAAJYmwABCPsAAliCYFsAAligAwACWH8AAXvjAAJYqmBLAAJYrwACMssAAliyT8MAAlizAAEsawACWK4S6wACWKpgTwACWMMAASjHAAJYwgIrAAJYwwABKjMAAliqYEMAAljSlosAAljTAAEI+wACWNIHfwACWNCPAAJYqmBbAAJY5AMAAlh/AAF78wACWO5gSwACWPMAAjLLAAJY9k/DAAJY7mBDAAJY/wABe/cAAljuYE8AAlkGAisAAlkHAAFnpwACWO5gWwACWRADAAJYfnSzAAJZGmBLAAJZHwACMssAAlkisVcAAlkjAAETxwACWSK79wACWSJ+9wACWSMAAXv7AAJZIwABe/8AAlkjAAF8AwACWSMAAXwHAAJZHn87AAJZGmBDAAJZSwABfAsAAllLAAF8DwACWUsAAXwTAAJZSwABfBsAAllLAAF8IwACWUsAAXwnAAJZSwACMssAAllnAAF8FwACWWcAAXwzAAJZSwABfB8AAllLAAEI7wACWRpgWwACWXgAAwACMs8AAlmDAAETLwACWYZgSwACWYsAAjLPAAJZjwABenMAAlmOtOcAAlmOsWMAAlmOvCcAAlmLAAF8UwACWYpoJwACWYsAARPXAAJZip5fAAJZhmBPAAJZswACMs8AAlm2rc8AAlm3AAENjwACWbcAAQ3PAAJZhmBDAAJZxwABfFcAAlnHAAF8cwACWccAAXx7AAJZxwABfL8AAlnHAAF8zwACWccAAXzfAAJZxwABfOMAAlmGYFsAAlnkAAMAAjLTAAJZ7wABfOsAAlnyYEMAAln3AAF87wACWfcAAXzzAAJZ9wABfRsAAln3AAF9IwACWfcAAX07AAJZ8mBbAAJaDAADAAIy1wACWhcAAX1nAAJaGmBLAAJaHwABfWsAAlofAAIy1wACWicAAXpzAAJaJrvnAAJaJrv3AAJaJwABDY8AAlonAAENzwACWiZ+9wACWia05wACWicAATM7AAJaGmBPAAJaSwACMtcAAlpPAAETxwACWhpgQwACWlcAAX1vAAJaVwABfXMAAlpXAAF9kwACWhpgWwACWmQAAwACMtsAAlpuYEcAAlpzAAF9xwACWm8AAX3PAAJaemBLAAJafgLDAAJafkkfAAJaemBbAAJaiAMAAlpvAAF90wACWpJgSwACWpcAAX3XAAJallJbAAJalqJDAAJakmBbAAJapAMAAlpvAAF92wACWq5gSwACWrMAAX3fAAJaswACMtsAAlq7AAF94wACWq5gQwACWsMAAX3nAAJawwABfe8AAlrDAAF98wACWsMAAX33AAJarmBbAAJa1AMAAlpvAAF+AwACWt5gSwACWuMAAjLbAAJa5q3PAAJa5wABfgcAAlrmu+cAAlrnAAF+DwACWua79wACWucAAX4TAAJa4wABfgsAAlreYEMAAlsHAAF+FwACWwcAAjLbAAJbDwABfisAAlreYFsAAlsUAwACWm8AAX47AAJbHmBLAAJbIwACMtsAAlsmrc8AAlsnAAF+BwACWx5gQwACWzMAAX4jAAJbMnxrAAJbMlojAAJbMq3TAAJbMlfTAAJbMlgvAAJbMlfzAAJbMlgLAAJbMq3nAAJbMq3rAAJbMlfbAAJbHmBbAAJbYAADAAIy3wACW2sAAXn/AAJbbmBLAAJbcwACMt8AAlt2y08AAlt3AAF+QwACW3axVwACW3Z+9wACW3cAAX4PAAJbbmBPAAJbjwABejsAAluPAAF6PwACW25gQwACW5sAAXozAAJbmwABei8AAltuYFsAAlukAAMAAjLjAAJbrwABfl8AAluyYEsAAlu3AAIxLwACW7sAAR9bAAJbsmBPAAJbwgSHAAJbsmBDAAJbyg6vAAJbym2PAAJbywABH28AAlvLAAEfcwACW8sAAR9HAAJbyT8AAlvLAAEfawACW7JgWwACW+gDAAJbrwABHycAAlvyYEsAAlv2f4cAAlv2vDMAAlv2BIcAAlvyYEMAAlwHAAEfTwACXAcAAX5jAAJcBwABfmsAAlwHAAF+bwACXAbBTwACW/JgWwACXBwDAAJbrwABfqcAAlwmYEsAAlwqf4cAAlwqvDMAAlwqwWMAAlwmYE8AAlw7AAIy4wACXD8AAUJDAAJcJmBDAAJcRnxrAAJcRwABfn8AAlxGwK8AAlxGwDMAAlxHAAFhRwACXEbAFwACXEbAGwACXEbAIwACXEbAJwACXEbAKwACXEbALwACXEbANwACXEbAOwACXEZWYwACXEbAPwACXEbAQwACXEbARwACXEbASwACXEbATwACXEbAVwACXEbAWwACXEbA6wACXEbAYwACXEbAwwACXEbAxwACXEbAZwACXEbAawACXEbAbwACXEbAcwACXEbAdwACXEcAAX73AAJcRsB7AAJcRsB/AAJcRsCDAAJcRsCHAAJcRwABf3cAAlxGwI8AAlxGwIsAAlxGwJMAAlxGwJcAAlxGwJsAAlxGwJ8AAlxGwKMAAlxGwF8AAlxGwLcAAlxGwLsAAlxGwL8AAlxGwM8AAlxGwNMAAlxGwNcAAlxGVScAAlxGwN8AAlxGwMsAAlxGwOMAAlxGwO8AAlxGwPcAAlxGwPsAAlxGwP8AAlxGwQMAAlxGwLMAAlxGwNsAAlxGwQcAAlxGwQsAAlxGwQ8AAlxGwRMAAlxGwRcAAlxGwRsAAlxGVh8AAlxGwR8AAlxGwSMAAlxGwPMAAlxGwFMAAlxGwScAAlxGwKcAAlxGwKsAAlxGwSsAAlxHAAIy4wACXXsAAYBDAAJcRsEvAAJcRsDnAAJcRsE3AAJcRsE7AAJcRsE/AAJcRsAfAAJcRsEzAAJcJmBbAAJdnAADAAIy5wACXaZgSwACXasAAYHnAAJdqwABge8AAl2rAAGB9wACXasAAYH/AAJdqwABggcAAl2rAAGCCwACXasAAYIPAAJdqwABghcAAl2rAAGCHwACXasAAYInAAJdqwABgi8AAl2rAAGCMwACXasAAYI3AAJdqwABgjsAAl2rAAGCPwACXasAAYJHAAJdqwABgksAAl2rAAGCUwACXasAAYJbAAJdqwABgmMAAl2rAAGCawACXasAAYJzAAJdqwABgnsAAl2rAAGCgwACXasAAYKLAAJdqwABgpMAAl2rAAGCmwACXasAAYKfAAJdqwABgqcAAl2rAAGCqwACXaapnwACXiZgSwACXiifAAJeKwACMucAAl4wowACXiinAAJeKwABgH8AAl4rAAGAhwACXisAAYCPAAJeKwABgJcAAl4rAAGAnwACXisAAYCnAAJeKwABgK8AAl4rAAGAtwACXisAAYC/AAJeKwABgMcAAl4rAAGAzwACXisAAYDXAAJeKwABgN8AAl4rAAGA5wACXisAAYDvAAJeKwABgPcAAl4rAAGA/wACXisAAYEHAAJeKwABgQ8AAl4rAAGBFwACXisAAYEfAAJeKwABgScAAl4rAAGBLwACXisAAYE3AAJeKwABgT8AAl4rAAGBRwACXisAAYFPAAJeKwABgVcAAl4rAAGBXwACXisAAYFnAAJeKwABgW8AAl4rAAGBdwACXisAAYF/AAJeKwABgYcAAl4mYEMAAl7EjwACXiZgWwACXswDAAJdpqmjAAJe1mBLAAJe2J8AAl7bAAIy5wACXuCjAAJe2KcAAl7bAAGBjwACXtsAAYGXAAJe2sSTAAJe2wABgaMAAl7bAAGBqwACXtsAAYGzAAJe2wABgbsAAl7bAAGBwwACXtsAAYHLAAJe2pNLAAJe2wABgdcAAl7bAAFA5wACXtpYXwACXtZgQwACXyCPAAJe1mBbAAJfKAADAAIy6wACXzJgQwACXzcAAYUbAAJfMwABgrcAAl8+YEsAAl9CueMAAl9CuecAAl9CufMAAl8+YE8AAl9Sue8AAl9STjMAAl9SDicAAl9SsJsAAl8+YEMAAl9lBwACX2cAAjLrAAJfbwABgrsAAl9kjwACXz5gWwACX3gDAAJfMwABgscAAl+CYEMAAl+HAAEJOwACX4a6EwACX4a6DwACX4JgWwACX5QDAAJfMwABgssAAl+eYE8AAl+isJsAAl+iue8AAl+iTjMAAl+eYFsAAl+wAwACXzMAAYLPAAJfumBLAAJfvrnjAAJfvrnrAAJfvwABCNsAAl+6YEMAAl/PAAGC0wACX8yPAAJfumBbAAJf2AMAAl8zAAGC4wACX+JgQwACX+UTAAJf4mBbAAJf7AMAAl8zAAGC5wACX/ZgSwACX/sAAjLrAAJf/wABgusAAl/2YEMAAmAHAAGC7wACYAcAAYLzAAJgBRMAAl/2YFsAAmAUAwACXzMAAYL7AAJgHmBLAAJgIJ8AAmAjAAIy6wACYCijAAJgIKcAAmAjAAGC/wACYCMAAYMHAAJgHmBDAAJgPI8AAmAeYFsAAmBEAwACXzMAAYMPAAJgTmBLAAJgUJ8AAmBTAAIy6wACYFijAAJgUKcAAmBTAAGC/wACYFMAAYMXAAJgUwABgx8AAmBOYEMAAmBwjwACYE5gWwACYHgDAAJfMwABgycAAmCCYEsAAmCGrA8AAmCHAAGDLwACYIcAATCjAAJghwABgzMAAmCHAAGDNwACYIcAAYM7AAJggmBDAAJgowABCT8AAmCjAAEI3wACYIJgWwACYKwDAAJfMwABg0cAAmC2YEsAAmC7AAEwowACYLZgQwACYMJ8awACYMMAAQj3AAJgwlaPAAJgwwABHS8AAmDDAAEdOwACYMMAARuTAAJgtmBbAAJg3AMAAl8zAAGDSwACYOZgTwACYOsAATCjAAJg5mBDAAJg8wABg08AAmDmYFsAAmD4AwACXzMAAYNTAAJhAmBPAAJhBwABMKMAAmECYEMAAmEPAAGDTwACYQJgWwACYRQDAAJfMwABg1cAAmEeYEsAAmEjAAGDQwACYSMAATCjAAJhIwACMusAAmEvAAGDWwACYR5gQwACYTcAAYNfAAJhNp/XAAJhHmBbAAJhQAMAAl8zAAGDcwACYUpgTwACYU8AATCjAAJhSmBDAAJhVwABg08AAmFKYFsAAmFcAwACXzMAAYN3AAJhZmBLAAJhawABg0MAAmFrAAEwowACYWZgQwACYXcAAYNfAAJhZmBbAAJhfAMAAl8zAAGDhwACYYZgSwACYYoOywACYYsAAYOLAAJhiwABg38AAmGGYEMAAmGbAAGDjwACYYZgWwACYaADAAJfMwABg58AAmGqYEsAAmGvAAGDowACYa8AAYOnAAJhrwABg6sAAmGqYE8AAmG+AisAAmGqYEMAAmHEjwACYapgWwACYcwDAAJfMwABg7sAAmHWYEsAAmHYnwACYdsAAjLrAAJh4KMAAmHYpwACYdsAAYO/AAJh2wABg8cAAmHab28AAmHab78AAmHab2sAAmHWYEMAAmIAjwACYdZgWwACYggDAAJfMwABg9sAAmISYEsAAmIUnwACYhcAAjLrAAJiHKMAAmIUpwACYhcAAYPfAAJiFwABg+cAAmIWyiMAAmIWb/8AAmIXAAGD9wACYhZwIwACYhZvZwACYhZvfwACYhZwRwACYhcAAYQPAAJiFwABhBcAAmIXAAGEHwACYhcAAYQnAAJiFwABhC8AAmIXAAGENwACYhcAAYQ/AAJiFwABhEcAAmIXAAGETwACYhJgQwACYnCPAAJiEmBbAAJieAMAAl8zAAGEVwACYoJgQwACYocAAYRbAAJihwABhF8AAmKHAAGEYwACYocAAYRnAAJihwABg18AAmKCYFsAAmKcAwACXzMAAYRrAAJipmBLAAJiqwABhG8AAmKrAAEwowACYqsAAYRzAAJiquovAAJiqwABg6MAAmKrAAGDqwACYqsAAYR3AAJiqwABhHsAAmKmYEMAAmLPAAGEfwACYs8AAYSDAAJizwABhIcAAmLPAAGEiwACYs8AAYSPAAJizqfXAAJizwABCPcAAmLOfGsAAmLOWiMAAmLPAAIy6wACYvcAAYSfAAJizwABG3sAAmLPAAEckwACYs5WnwACYs8AAYSTAAJizwABhK8AAmLOVo8AAmLOVrMAAmLPAAEbxwACYs8AARyjAAJizwABG4MAAmLPAAEdPwACYs8AARx3AAJizwABHIsAAmLPAAEcgwACYs8AARx/AAJizlevAAJizwABHS8AAmLOV5cAAmLPAAEdOwACYs8AARuTAAJizsB3AAJizwABHCMAAmLPAAEdRwACYs8AARv3AAJiztFPAAJizsEbAAJizsD3AAJizlYfAAJizsA/AAJizsA7AAJizsEnAAJizldXAAJiztG/AAJizwABHLsAAmLPAAEcrwACYs8AARynAAJizwABHMsAAmLPAAEczwACYs7BFwACYs8AARvPAAJizwABG/MAAmLPAAEbjwACYs8AARuLAAJizlbLAAJizwABhJcAAmKmYFsAAmOwAwACXzMAAYTDAAJjumBLAAJjvwACMusAAmPDAAGExwACY8MAAYTLAAJjwwABhM8AAmPDAAGE0wACY8MAAYTXAAJjwwABhNsAAmPDAAGE3wACY7pgQwACY+MAAYTjAAJj4wABhOcAAmPjAAGE6wACY+MAAYTvAAJj4wABhPMAAmPgjwACY7pgWwACY/wDAAJfMwABhQ8AAmQGYE8AAmQLAAEwowACZAZgQwACZBMAAYNPAAJkBmBbAAJkGAMAAl8zAAGFEwACZCJgSwACZCcAAYM/AAJkJwABMKMAAmQiYEMAAmQzAAGDXwACZDMAAYRfAAJkImBbAAJkPAMAAl8zAAGFFwACZEZgSwACZEsAAYRvAAJkSwABgz8AAmRGYEMAAmRVEwACZEZgWwACZFwAAwACMu8AAmRnAAGFHwACZGpgSwACZG8AAYUjAAJkbnYHAAJkamBDAAJkepQ7AAJkewABG3sAAmR7AAFnSwACZGpgWwACZIsAAjLvAAJkjgKjAAJkZwABhScAAmSWYEsAAmSarvMAAmSWYEMAAmSifGsAAmSjAAEcewACZKMAARyHAAJkowABG5MAAmSjAAEdOwACZKMAARvHAAJkotFPAAJkolYfAAJkowABHKMAAmSjAAEcuwACZKMAAR0/AAJkowABHK8AAmSjAAEbgwACZJZgWwACZNgDAAJkZwABhSsAAmTiYEMAAmTnAAEWTwACZOcAAYUvAAJk5p1TAAJk5nxrAAJk5wABCPcAAmTnAAFnRwACZOcAARxbAAJk5wABHGsAAmTnAAEbjwACZOcAARuLAAJk5wABHKcAAmTnAAEcywACZOcAARuTAAJk5wABG8cAAmTnAAEcowACZObRTwACZOZWHwACZOcAARy7AAJk5wABHT8AAmTnAAEbgwACZOcAAjLvAAJlOwABhTMAAmTiYFsAAmVAAAMAAjLzAAJlSwABhTcAAmVOYEMAAmVSVB8AAmVOYFsAAmVYAAMAAjL3AAJlYwABMo8AAmVmYEsAAmVqEUcAAmVrAAGFPwACZWsAAYVDAAJlawACMvcAAmV7AAGFRwACZXsAAYVLAAJlewABhU8AAmVmYE8AAmWLAAE1CwACZYsAATUnAAJliwABNSMAAmVmYFsAAmWbAAIy9wACZZ4CoAMAAjFrAAJlpwABhVMAAmWqYEsAAmWue1cAAmWvAAEypwACZa8AATKrAAJlrtsbAAJlrwABMq8AAmWvAAEaLwACZa8AAjFrAAJlyhXLAAJlrwABMrMAAmWvAAEytwACZa8AATK7AAJlrnvDAAJlrwABMr8AAmWqYE8AAmXmCHsAAmXmfvMAAmXmvMsAAmXmf4cAAmXmphsAAmXmfzsAAmXlvwACZeaq1wACZeauywACZeaALwACZea8owACZea86wACZear1wACZea8MwACZea8qwACZeZinwACZea8cwACZeaATwACZeZ/AwACZeZUIwACZeVfAAJl5oGDAAJl5wABMwcAAmXnAAEzCwACZapgQwACZkq7BwACZkq7CwACZksAATLDAAJmSwABMscAAmZLAAEyywACZkrBlwACZkqApwACZkoIPwACZksAATLPAAJmSsbfAAJmSwABMtMAAmZLAAEy1wACZkk/AAJmSwABMt8AAmZLAAEy4wACZksAATLnAAJmSwABMusAAmZLAAEy7wACZksAATMDAAJmSwABMv8AAmZLAAEzDwACZapgUwACZqFfAAJlqmBbAAJmqAADAAIy+wACZrMAAYVXAAJmtmBLAAJmuwABhVsAAma7AAE2awACZrZgQwACZsbjpwACZsbJjwACZrZgWwACZtADAAJmswABhV8AAmbaYEsAAmbeB08AAmbaYFcAAmbkAwACZtpgQwACZu8AATbbAAJm7wABNtcAAmbvAAE2mwACZu8AATZnAAJm7wABhWMAAmbvAAE2kwACZu4IPwACZtpgTwACZw5ilwACZrMAAYVnAAJnFmBLAAJnGn87AAJnFmBDAAJnIwABNtsAAmcjAAE21wACZyMAATabAAJnIwABNmcAAmciCD8AAmcjAAGFYwACZyMAATaTAAJnFmBPAAJnQmKXAAJnQgdPAAJnFmBbAAJnTAMAAmazAAGFcwACZ1ZgSwACZ1oPmwACZ1oHTwACZ1sAAYV3AAJnVmBDAAJnawABNtsAAmdrAAE21wACZ2sAATabAAJnawABNmcAAmdrAAGFYwACZ2sAATaTAAJnagg/AAJnVmBPAAJnimKXAAJnVmBbAAJnkAMAAmazAAGFfwACZ5pgSwACZ58AATv/AAJnmmBDAAJnpwABNtsAAmenAAGFgwACZ6cAATbXAAJnpgg/AAJnmmBbAAJnuAADAAIy/wACZ8MAAYWHAAJnxmBLAAJnyg+bAAJnygRDAAJnxmBDAAJn1l0/AAJn1l1nAAJn1lVbAAJn1nh7AAJn1wABhY8AAmfWyR8AAmfGYFsAAmfwAAMAAjMDAAJn+wABducAAmf+YEsAAmgDAAEz/wACaAMAAYWTAAJoAg+bAAJoAwABNMsAAmgDAAGFlwACaAL+owACaAKsGwACaALQswACaAMAAjMDAAJoJwABDY8AAmgnAAENzwACaAMAAYWbAAJoAwABhZ8AAmgDAAGFowACZ/5gTwACaD5/hwACaD8AAjMDAAJoRwABQkMAAmhGrjcAAmf+YEMAAmhTAAE0IwACaFMAAYWnAAJoUwABha8AAmhSWa8AAmhTAAGFuwACaFK9TwACaFMAAYXfAAJoUwABhasAAmhTAAE0RwACaFMAAjMDAAJoewABhecAAmhS/6sAAmhTAAEzywACaFMAAYX/AAJoUwABM/sAAmhTAAE0ZwACaFMAATYvAAJoUwABNjsAAmhTAAE2TwACaFMAAYYTAAJoUwABNosAAmhTAAGGGwACaFMAATZvAAJoUwABhdcAAmhTAAGF8wACaFMAATXHAAJn/mBbAAJovAMAAmi+TFsAAmf7AAGGMwACaMpgSwACaM4CwwACaM7+owACaM6sGwACaM4OJwACaM8AAjMDAAJo4wABhjcAAmjKYEMAAmjojwACaMpgWwACaPAAAwACMwcAAmj7AAGGPwACaP5gSwACaQIPmwACaP5gQwACaQsAATWzAAJpCwABNjsAAmkLAAE2iwACaQsAAYZjAAJpCwABNscAAmj+YFsAAmkgAwACaPsAAYZ7AAJpKmBLAAJpLg+bAAJpKmBDAAJpNwABNscAAmk3AAGGYwACaSpgWwACaUADAAJo+wABhn8AAmlKYEMAAmlOXT8AAmlOVtsAAmlOVvMAAmlOVuMAAmlOVwMAAmlOVw8AAmlKYFsAAmloAAMAAjMLAAJpcwABhoMAAml2YEsAAml7AAE2owACaXpluwACaXsAAYaHAAJpewABhosAAml6e1cAAml2YFsAAmmQAwACaXMAAYaPAAJpmmBLAAJpng+bAAJpnwABhpMAAmmaYEMAAmmrAAGGlwACaasAATWjAAJpqwABhqsAAmmrAAGGowACaasAAYa/AAJpqwABNNcAAmmrAAE3XwACaasAAYbPAAJpqwABN28AAmmrAAIzCwACadMAAYbLAAJpmmBbAAJp2AADAAIzDwACaeMAAYbzAAJp5mBDAAJp6wABhvcAAmnqVysAAmnqVp8AAmnqVssAAmnqVuMAAmnqVvMAAmnqVwMAAmnqVw8AAmnqVyMAAmnqVzMAAmnqV0cAAmnqVtsAAmnqV1cAAmnqV2MAAmnqV58AAmnqU/8AAmnqXYcAAmnqXT8AAmnmYFsAAmo3AAIzDwACajoCoAMAAjMTAAJqQwABhw8AAmpGYEsAAmpInwACaksAAjMTAAJqUKMAAmpIpwACakoRRwACakrZmwACakoDPwACaksAAYcfAAJqRmBDAAJqbI8AAmpGYFsAAmp0AwACakJ0pwACan5gSwACaoIPmwACan5gQwACaosAATlvAAJqiwACMxMAAmqTAAGHJwACapMAAYcrAAJqiwABNSsAAmqLAAEzzwACaosAATPfAAJqiwABM+sAAmqLAAE76wACaosAATnrAAJqiwABhzMAAmqLAAE59wACaosAATRbAAJqiwABNrcAAmp+YE8AAmrHAAEz5wACan5gWwACaswAAwACMxcAAmrXAAGHRwACatpgQwACat8AATNzAAJq3msvAAJq3wABM78AAmrejKcAAmre5wMAAmrea0sAAmreqfcAAmrfAAE99wACat6oBwACat8AAT3zAAJq3wABP98AAmreqecAAmrfAAE/zwACat8AAUBvAAJq3v3bAAJq3v0nAAJq3v3TAAJq3v0rAAJq3wABFP8AAmreqfMAAmraYE8AAmsyqtcAAmsyfzsAAmraYFsAAms8AAMAAjF3AAJrRwABh08AAmtKYEsAAmtPAAIxdwACa1MAAYdTAAJrUwABA1cAAmtKYE8AAmteB6sAAmtev8MAAmtdawACa0pgQwACa28AAT8jAAJrbn+fAAJrbwABP4cAAmtKYFsAAmt8AwACa0cAAYdXAAJrhmBLAAJrig6vAAJrihAnAAJriwACMXcAAmuXAAGHXwACa5cAA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mBbAAJ0eAADAAIzKwACdIMAAYkvAAJ0hmBDAAJ0ilXTAAJ0ilVbAAJ0hmBbAAJ0lAMAAnSDAAGJMwACdJ5gSwACdKMAAQlzAAJ0oqwLAAJ0owABiTcAAnSjAAIzKwACdLMAAYk7AAJ0nmBPAAJ0uwACMysAAnS+rc8AAnSeYEMAAnTGfGsAAnTGXWcAAnTHAAIzKwACdNMAAYk/AAJ00wABiUMAAnTTAAGJRwACdMZVCwACdMZUVwACdMZUwwACdMZV8wACdMZV7wACdMZV2wACdMZV5wACdMZV0wACdMZV/wACdMZVWwACdMZWOwACdMZWLwACdMZWJwACdMZWBwACdMZVywACdMZVGwACdMZVJwACdMZVSwACdMZUfwACdMZU8wACdMZVAwACdMZVNwACdMZWZwACdMZWbwACdMcAAYhTAAJ0nmBbAAJ1RAMAAnSDAAGJUwACdU5gSwACdVKsCwACdVMAAYlXAAJ1UomTAAJ1TmBDAAJ1YhXXAAJ1YnbDAAJ1YlKjAAJ1YwABAuMAAnViWEMAAnViWAsAAnViV/MAAnViV9sAAnViV9MAAnViV88AAnViV+MAAnVOYFsAAnWQAwACdIMAAYlbAAJ1mmBLAAJ1nqwLAAJ1mmBDAAJ1pl1HAAJ1plk/AAJ1plkzAAJ1plknAAJ1plkLAAJ1pljzAAJ1pljbAAJ1pljnAAJ1pljHAAJ1plizAAJ1plijAAJ1pliTAAJ1pliHAAJ1plh7AAJ1plhvAAJ1mmBbAAJ15AADAAIzLwACde5gQwACdfMAAYn/AAJ17wABiWsAAnX6YEsAAnX/AAIzLwACdgMAAYdTAAJ2AwABA1cAAnX6YE8AAnYOB6sAAnYOv8MAAnYNawACdfpgQwACdh6+8wACdh8AAjMvAAJ2JwABiW8AAnYnAAGJcwACdh5/nwACdh8AAT+HAAJ2HhXXAAJ1+mBbAAJ2PAMAAnXvAAGJdwACdkZgSwACdkoQJwACdksAAjMvAAJ2UwABh18AAnZTAAGHYwACdlMAAYdnAAJ2RmBDAAJ2YwACMy8AAnZnAAGJewACdmcAAYl/AAJ2YqfvAAJ2Yn/PAAJ2YwABASsAAnZjAAE/kwACdmIV1wACdkZgWwACdoQDAAJ17wABiYcAAnaOYEsAAnaSECcAAnaTAAIzLwACdpsAAYmLAAJ2kmOrAAJ2j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nr7AAGKGwACeviPAAJ65mBbAAJ7BAADAAIxnwACew8AAYpXAAJ7EmBLAAJ7FwACMZ8AAnsaua8AAnsSYE8AAnsjAAFHtwACexJgQwACeysAAjGfAAJ7LwABR7sAAnsvAAFHvwACeysAAUbTAAJ7KwABRs8AAnsrAAFGywACeysAAUbHAAJ7KwABRsMAAnsrAAFGvwACeysAAUa7AAJ7KwABRrcAAnsrAAFGswACeysAAUavAAJ7KsuDAAJ7KwABRqsAAnsqy6MAAnsrAAFGowACeysAAUanAAJ7KwABRp8AAnsrAAFGmwACeysAAUaXAAJ7KwABRpMAAnsrAAFGiwACeysAAUaPAAJ7KwABIvMAAnsrAAFGhwACeysAAUaDAAJ7KwABRn8AAnsrAAFGewACeysAAUZ3AAJ7KwABRnMAAnsrAAFGbwACeysAAUZrAAJ7KrHPAAJ7KwABRmcAAnsrAAFGYwACeysAAUZfAAJ7KwABRlsAAnsrAAFGVwACeysAAUZTAAJ7KwABDrcAAnsrAAFGSwACeysAAUZHAAJ7KwABRkMAAnsrAAFGPwACeysAAUY7AAJ7KwABRjMAAnsrAAFGNwACeysAAUYvAAJ7KwABRisAAnsrAAFGJwACeysAAUYjAAJ7KwABRh8AAnsrAAFGGwACeysAAQzrAAJ7KwABRtcAAnsrAAFG2wACeysAAUbfAAJ7KwABRuMAAnsrAAFG5wACeysAAUbrAAJ7EmBbAAJ8IAMAAnsPAAGKWwACfCpgSwACfC8AAjGfAAJ8MkzLAAJ8KmBXAAJ8OwABClMAAnwqYEMAAnxDAAGKXwACfEKn1wACew8AAYpjAAJ8TmBLAAJ8Ug6vAAJ8UwACMZ8AAnxbAAFHwwACfFsAAUfHAAJ8WwABR8sAAnxbAAFHzwACfFsAAUfTAAJ8WwABR9cAAnxbAAFH2wACfFsAAUffAAJ8WwABR+MAAnxbAAFH5wACfFsAAUfrAAJ8WwABR+8AAnxbAAFH8wACfFsAAUf3AAJ8WwABR/sAAnxbAAEfnwACfFrNuwACfFsAAUf/AAJ8WwABSAMAAnxbAAFIBwACfFsAARGPAAJ8WwABSAsAAnxbAAERKwACfFsAAUgPAAJ8WwABSBMAAnxbAAFIFwACfFsAAUgbAAJ8WwABSB8AAnxbAAFIIwACfFsAAUgnAAJ8WwABSCsAAnxbAAFILwACfFsAAUgzAAJ8WwABSDcAAnxbAAENCwACfFsAAUg7AAJ8WwABSD8AAnxbAAFIQwACfFsAAUhLAAJ8WwABSEcAAnxbAAFITwACfE5gQwACfQMAAYpfAAJ9AqfXAAJ8TmBbAAJ9DAMAAn0PAAEKUwACew8AAYprAAJ9GmBLAAJ9Hg6vAAJ9HkkTAAJ9HpLfAAJ9HpLjAAJ9GmBXAAJ9MAMAAn0zAAEKUwACfRpgQwACfT8AAYpfAAJ9GmBbAAJ9RkkPAAJ7DwABim8AAn1OYEsAAn1SDq8AAn1SC/cAAn1SB08AAn1SsJcAAn1OYFcAAn1nAAEKUwACfU5gQwACfW8AAYpfAAJ9TmBbAAJ9dAMAAnsPAAGKewACfX5gSwACfYIOrwACfYICwwACfYKwlwACfX5gVwACfZMAAQpTAAJ9fmBDAAJ9mwABil8AAn1+YFsAAn2gAwACew8AAYp/AAJ9qmBLAAJ9rg6vAAJ9rlRvAAJ9rwABimcAAn2uB08AAn2qYFcAAn3DAAEKUwACfapgQwACfcsAAYpfAAJ9qmBbAAJ90AMAAnsPAAGKgwACfdpgSwACfd4OrwACfd5UbwACfd8AAYpnAAJ93gLDAAJ92mBXAAJ98wABClMAAn3aYEMAAn37AAGKXwACfdpgWwACfgADAAJ7DwABiocAAn4KYEsAAn4ODq8AAn4OVG8AAn4OsJcAAn4KYFcAAn4fAAEKUwACfgpgQwACficAAYpfAAJ+CmBbAAJ+LAMAAnsPAAGKiwACfjZgSwACfjoOrwACfjpUbwACfjsAAYpnAAJ+OgdPAAJ+OrCXAAJ+NmBXAAJ+UwABClMAAn42YEMAAn5bAAGKXwACfjZgWwACfmADAAJ7DwABio8AAn5qYEsAAn5uDq8AAn5uVG8AAn5vAAGKZwACfm4CwwACfm6wlwACfmpgVwACfocAAQpTAAJ+amBDAAJ+jwABil8AAn5qYFsAAn6UAwACew8AAYqTAAJ+nmBLAAJ+og6vAAJ+oqsvAAJ+orCXAAJ+nmBXAAJ+swABClMAAn6eYEMAAn67AAGKXwACfp5gWwACfsADAAJ7DwABipcAAn7KYEsAAn7ODq8AAn7OB08AAn7OsJcAAn7OUV8AAn7KYFcAAn7jAAEKUwACfspgQwACfusAAYpfAAJ+ymBbAAJ+8AMAAnsPAAGKmwACfvpgSwACfv4OrwACfv5hQwACfv4IXwACfv6wlwACfv5RXwACfv4PiwACfvpgVwACfxsAAQpTAAJ++mBDAAJ/IwABil8AAn76YFsAAn8oAwACew8AAYqfAAJ/MmBLAAJ/Ng6vAAJ/NmTzAAJ/NkkTAAJ/NlFfAAJ/MmBXAAJ/SwABClMAAn8yYEMAAn9TAAGKXwACfzJgWwACf1gDAAJ7DwABiqMAAn9iYEsAAn9knwACf2cAAjGfAAJ/bKMAAn9kpwACf2cAASE/AAJ/ZqI3AAJ/ZldTAAJ/ZuETAAJ/ZqlvAAJ/ZwABirsAAn9nAAGKwwACf2cAASEPAAJ/ZwABIQsAAn9nAAEhJwACf2JgQwACf6CPAAJ/YmBbAAJ/qAMAAnsPAAGK1wACf7JgSwACf7YOrwACf7YIXwACf7YIcwACf7JgVwACf8cAAQpTAAJ/smBDAAJ/zwABil8AAn+yYFsAAn/UAwACew8AAYrbAAJ/3mBLAAJ/4J8AAn/jAAIxnwACf+ijAAJ/4KcAAn/jAAEGYwACf+MAAQZrAAJ/4wABIRMAAn/jAAEhRwACf+MAAQZfAAJ/4wABBmcAAn/i7KMAAn/jAAGK+wACf+JT1wACf+MAAYsHAAJ/3mBDAAKAHI8AAn/eYFsAAoAkAwACew8AAYsPAAKALmBLAAKAMg6vAAKAMmFDAAKAMrCXAAKALmBXAAKAQwABClMAAoAuYEMAAoBLAAGKXwACgC5gWwACgFADAAJ7DwABixMAAoBaYEsAAoBeDq8AAoBeCF8AAoBeUV8AAoBaYFcAAoBvAAEKUwACgFpgQwACgHcAAYpfAAKAWmBbAAKAfAMAAnsPAAGLFwACgIZgSwACgIoOrwACgIqciwACgIpJEwACgIZgVwACgJsAAQpTAAKAhmBDAAKAowABil8AAoCGYFsAAoCoAwACew8AAYsbAAKAsmBLAAKAtg6vAAKAtgdPAAKAtlFfAAKAsmBXAAKAxwABClMAAoCyYEMAAoDPAAGKXwACgLJgWwACgNQDAAJ7DwABix8AAoDeYEsAAoDiDq8AAoDiVYcAAoDiVYsAAoDiD4sAAoDiA/MAAoDeYFcAAoD7AAEKUwACgN5gQwACgQMAAYpfAAKA3mBbAAKBCAMAAnsPAAGLIwACgRJgSwACgRYOrwACgRaIAwACgRYPiwACgRYD8wACgRJgVwACgSsAAQpTAAKBEmBDAAKBMwABil8AAoESYFsAAoE4AwACew8AAYsnAAKBQmBLAAKBRg6vAAKBRg7LAAKBRghzAAKBRlRvAAKBRwABDVMAAoFCYFcAAoFfAAEKUwACgUJgQwACgWcAAYpfAAKBQmBbAAKBbAADAAIzNAMAAjM7AAKBewABizMAAoF+YE8AAoGDAAIzOwACgYaxVwACgYayjwACgYcAAUkjAAKBgn87AAKBgqwLAAKBgpQzAAKBgrJrAAKBglkXAAKBgqrXAAKBfmBDAAKBrwACMzsAAoGzAAGLNwACgbMAAYs/AAKBswABi1cAAoGvAAFGmwACga8AAUafAAKBrwABRtsAAoGvAAFG1wACga8AAUZTAAKBrwABRlcAAoGvAAFGWwACga8AAUbfAAKBrwABRhsAAoGvAAFGHwACga8AAUYjAAKBrwABRicAAoGvAAFGKwACga8AAUYvAAKBrwABRjMAAoGvAAFGNwACga8AAUY7AAKBrwABRqMAAoGvAAFGpwACga8AAUbrAAKBrwABRtMAAoGuy6MAAoGvAAFG4wACga8AAUY/AAKBrwABRkMAAoGvAAFGRwACga8AAUbHAAKBrwABRssAAoGvAAFGzwACga8AAUarAAKBrsuDAAKBrwABRrMAAoGvAAFGrwACga8AAUa3AAKBrwABRrsAAoGvAAFGvwACga8AAUbDAAKBrwABDOsAAoGvAAFGSwACga8AAQ63AAKBrwABRl8AAoGvAAFGYwACga8AAUZnAAKBrrHPAAKBrwABRmsAAoGvAAFGbwACga8AAUZzAAKBrwABRncAAoGvAAFGewACga8AAUZ/AAKBrwABRoMAAoGvAAFGhwACga8AASLzAAKBrwABRosAAoGvAAFGjwACga8AAUaXAAKBrwABRpMAAoGvAAFG5wACgX5gWwACgqgDAAKBewABi3MAAoKyYEsAAoK2smsAAoK2rAsAAoK2fzsAAoK3AAIzOwACgsaxVwACgscAAYt3AAKCxwABSSMAAoK2lDMAAoKyYE8AAoLaqtcAAoLbAAIzOwACguKyjwACgtq/XwACgtq/YwACgrJgWwACgvADAAKBewABi3sAAoL6YEsAAoL+smsAAoL+rAsAAoL+fzsAAoL/AAIzOwACgw6xVwACgw8AAUkjAAKC/pQzAAKC+mBPAAKDHlkXAAKDHqrXAAKDHwACMzsAAoMqso8AAoL6YEMAAoMyFdcAAoL6YFsAAoM4AwACgXsAAYt/AAKDQmBPAAKDRwACMzsAAoNKsVcAAoNKso8AAoNLAAFJIwACg0Z/OwACg0asCwACg0aUMwACg0ayawACg0ZZFwACg0aq1wACg0JgQwACg3MAAjM7AAKDdwABizcAAoN3AAGLPwACg3cAAYtXAAKDcwABRpsAAoNzAAFGnwACg3MAAUbbAAKDcwABRtcAAoNzAAFGUwACg3MAAUZXAAKDcwABRlsAAoNzAAFG3wACg3MAAUYbAAKDcwABRh8AAoNzAAFGIwACg3MAAUYnAAKDcwABRisAAoNzAAFGLwACg3MAAUYzAAKDcwABRjcAAoNzAAFGOwACg3MAAUajAAKDcwABRqcAAoNzAAFG6wACg3MAAUbTAAKDcsujAAKDcwABRuMAAoNzAAFGPwACg3MAAUZDAAKDcwABRkcAAoNzAAFGxwACg3MAAUbLAAKDcwABRs8AAoNzAAFGqwACg3LLgwACg3MAAUazAAKDcwABRq8AAoNzAAFGtwACg3MAAUa7AAKDcwABRr8AAoNzAAFGwwACg3MAAQzrAAKDcwABRksAAoNzAAEOtwACg3MAAUZfAAKDcwABRmMAAoNzAAFGZwACg3KxzwACg3MAAUZrAAKDcwABRm8AAoNzAAFGcwACg3MAAUZ3AAKDcwABRnsAAoNzAAFGfwACg3MAAUaDAAKDcwABRocAAoNzAAEi8wACg3MAAUaLAAKDcwABRo8AAoNzAAFGlwACg3MAAUaTAAKDcwABRucAAoNCYFsAAoRsAAMAAjM/AAKEdwABi4MAAoR6YEsAAoR+VjcAAoR/AAIzPwAChIcAAYuHAAKEemBDAAKEjwACMz8AAoSTAAGLiwAChJMAAYunAAKEjwABZAsAAoSPAAFkFwAChI8AAWOzAAKEjwABZA8AAoSPAAFjtwAChI8AAUr7AAKEjwABSwMAAoSPAAFLCwAChI8AAUsTAAKEjwABSxsAAoSPAAFLPwAChI8AAUtHAAKEjwABS1sAAoSPAAFLYwAChI8AAUtrAAKEjwABS3MAAoSPAAFLiwAChI8AAUujAAKEjwABS7cAAoSPAAFLvwAChI8AAUvHAAKEjwABS88AAoSPAAFL2wAChI8AAUvjAAKEjwABS+sAAoSPAAFL+wAChI8AAUvzAAKEjwABTAcAAoSPAAFMDwAChI8AAUwbAAKEjwABTCMAAoSPAAFMKwAChI8AAUwzAAKEjwABi/8AAoSO0wsAAoSMjwAChHpgWwAChSwDAAKEdwABjAsAAoU2YEsAAoU6Dq8AAoU7AAENQwAChTZgQwAChUSPAAKFNmBbAAKFTAADAAIzQwAChVcAAVM3AAKFWmBDAAKFXVMAAoVe3HsAAoVe4XsAAoVe4XcAAoVe3K8AAoVe3LMAAoVe3dMAAoVe358AAoVe36sAAoVe3fcAAoVe3fsAAoVe32sAAoVe33sAAoVe37cAAoVe3AcAAoVe3bcAAoVe398AAoVe39sAAoVe7vsAAoVe38MAAoVeYPsAAoVeojcAAoVe5D8AAoVeWGMAAoVe4e8AAoVe4dMAAoVe4c8AAoVe3xsAAoVe3xcAAoVe4qsAAoVe4qcAAoVe4w8AAoVe4wsAAoVe30MAAoVeZbsAAoVe458AAoVe4RMAAoVe3ScAAoVe48cAAoVe4msAAoVe3CMAAoVe4vMAAoVe3zcAAoVe3ksAAoVe4EMAAoVfAAFTWwAChV7dHwAChV7dGwAChV7cmwAChV7i2wAChV7eHwAChV7dvwAChV7fLwAChV7dDwAChV6pbwAChV7b8wAChV7hMwAChV7ejwAChV7exwAChV7bJwAChV7i6wAChV7jGwAChV7fDwAChV7jdwAChV7fEwAChV7iRwAChV7fCwAChV7kMwAChV7ewwAChV8AAVN/AAKFXwABU4MAAoVfAAFThwAChV8AAVOLAAKFXwABU48AAoVfAAFTkwAChV8AAVOXAAKFXwABU5sAAoVfAAFTnwAChV8AAVOjAAKFXwABU6cAAoVfAAFTqwAChV8AAVOvAAKFXwABU7MAAoVfAAFTtwAChV8AAVO7AAKFXwABU78AAoVfAAFTwwAChV8AAVPHAAKFXwABU8sAAoVaYFsAAobEAwAChVcAAYwfAAKGzmBLAAKG0wABHTcAAobSAoMAAobOYEMAAobeUDsAAobeVEMAAobeUD8AAobeUFMAAobOYFsAAobwAAMAAjNHAAKG+wABjCMAAob+YEsAAocCB4sAAob+YEMAAocLAAFW4wAChwsAAVcfAAKHCwABVwMAAocLAAFW+wAChwsAAVcLAAKHCwABV8MAAocLAAFXuwAChv5gWwAChygDAAKG+wABjCsAAocyYEsAAoc0nwAChzcAAjNHAAKHPKMAAoc0pwAChzcAAYwvAAKHNt3bAAKHNlDDAAKHNwABjD8AAoc26G8AAoc25zMAAoc3AAGMTwAChzJgQwACh2SPAAKHMmBbAAKHbAADAAIzSwACh3cAAVZLAAKHemBLAAKHfo9fAAKHfwABWxMAAod6YE8AAoeKAoMAAod6YEMAAoeTAAFVAwACh5Li9wACh5MAAVUHAAKHktznAAKHkwABVH8AAoeTAAFUZwACh5LcywACh5Lc1wACh5Lg3wACh5Lo0wACh5LoywACh5LpswACh5MAAVUrAAKHkwABVS8AAoeTAAFViwACh5MAAVWHAAKHkuGLAAKHkuGPAAKHkwABVUMAAoeTAAFUgwACh5MAAVSLAAKHkwABVLsAAoeTAAFVTwACh5MAAVVTAAKHkuo7AAKHkt5rAAKHkwABVHcAAoeTAAFUrwACh5LibwACh5MAAVRvAAKHkwABVKMAAoeS4HcAAoeS4McAAoeS4icAAoeS4jMAAoeTAAFVZwACh5LgBwACh5LqIwACh5LgmwACh5MAAVVrAAKHkuG/AAKHkuHDAAKHkwABVXMAAoeTAAFVfwACh5MAAVWPAAKHktvnAAKHktvbAAKHkuLDAAKHkwABVa8AAoeS3aMAAoeTAAFV5wACh5MAAVW/AAKHkttPAAKHkwABVcMAAoeS6gsAAoeS6MMAAoeS4isAAoeS6bsAAoeS4YMAAoeTAAFVxwACh5MAAVXLAAKHkwABVc8AAoeTAAFV0wACh5MAAVXrAAKHkwABVdcAAoeTAAFV3wACh5LjHwACh5LjJwACh5MAAVXjAAKHkt4jAAKHkwABVfcAAoeS6fMAAoeTAAFV+wACh5MAAVYPAAKHkwABVW8AAoeS488AAoeTAAFWEwACh5MAAVWXAAKHkt6DAAKHkwABVIcAAoeTAAFUlwACh5MAAVYfAAKHkwABVicAAoeS3IcAAoeS4v8AAoeS3z8AAoeS3PMAAoeS3pMAAoeS27sAAoeS3M8AAoeS3N8AAoeS4OMAAoeS6NcAAoeS6N8AAoeS6DMAAoeTAAFVNwACh5Ln5wACh5Ln9wACh5LhuwACh5LhlwACh5LhZwACh5LiWwACh5MAAVSTAAKHkwABVL8AAoeS6O8AAoeS6GMAAoeS6HMAAoeS3m8AAoeS25sAAoeS3vcAAoeS4osAAoeS4rMAAoeTAAFUtwACh5LicwACh5LfHwACh5MAAVSrAAKHkuB7AAKHkuDLAAKHkuJPAAKHkuJXAAKHkuIXAAKHkuATAAKHkuePAAKHkuCfAAKHkugnAAKHkuHLAAKHkuHXAAKHkt4zAAKHkuhPAAKHkt57AAKHktvrAAKHktvfAAKHkuLLAAKHkufTAAKHkt+7AAKHkt9/AAKHkt2vAAKHkt/LAAKHktu3AAKHkttXAAKHktt/AAKHkuifAAKHkujnAAKHkuJLAAKHkukDAAKHkuGbAAKHkuCTAAKHkuhrAAKHkucnAAKHkuiDAAKHkuLPAAKHkt4TAAKHkugbAAKHkuNjAAKHkuNLAAKHkuNbAAKHkt4rAAKHkwABVe8AAoeS24cAAoeS57MAAoeS4RcAAoeS4fMAAoeS52MAAoeS49cAAoeS498AAoeS3k8AAoeS3ocAAoeS4ucAAoeTAAFUnwACh5LjEwACh5LgJwACh5LemwACh5LfRwACh5LjhwACh5LjfwACh5Lg6wACh5Lp0wACh5LqRwACh5LnfwACh5LpvwACh5LndwACh5MAAVY7AAKHkwABVisAAoeS4E8AAoeS4FsAAoeS4F8AAoeS46sAAoeTAAFVMwACh5Ln2wACh5LhkwACh5LhrwACh5LhxwACh5Li7wACh5Ld/wACh5MAAVYjAAKHkt4LAAKHktyDAAKHkwABVVcAAoeS4t8AAoeS4L8AAoeS6gMAAoeS3WMAAoeS6BMAAoeS6F8AAoeS4TcAAoeTAAFVtwACh5MAAVWfAAKHkuQfAAKHkui7AAKHkugLAAKHkuH7AAKHkwABVacAAoeS3pcAAoeS5zcAAoeS4DMAAoeS4rsAAoeS35cAAoeS36MAAoeS3esAAoeS31MAAoeS368AAoeS6k8AAoeS6dsAAoeS4g8AAoeS52sAAoeS3cMAAoeS6IcAAoeS6I8AAoeS6JcAAoeS5z8AAoeTAAFWQwACh5LnTwACh5LeywACh5Le0wACh5Le2wACh5LiewACh5Le4wACh5LecwACh5LnhwACh5LnywACh5Lb0wACh5Lf4wACh5LpnwACh5LnVwACh5LnRwACh5Lj5wACh5LeYwACh5LkEwACh5Ln/wACh5LckwACh5LcnwACh5LoOwACh5LdlwACh5LpywACh5LpzwACh5LfBwACh5Lj9wACh5Ld1wACh5LcpwACh5Lh4wACh5Ld3wACh5MAAVQnAAKHkt2nAAKHkuIHAAKHkuQXAAKHkuIDAAKHkuBrAAKHkt/vAAKHkuPTAAKHkuFfAAKHkuFTAAKHkuFHAAKHkuCnAAKHkuCrAAKHkuC3AAKHkuAfAAKHkwABVPsAAoeS3/cAAoeS3+sAAod6YFMAAovzAAFU/wACh3pgWwACi/gAAwACM08AAowCYEsAAowHAAFWXwACjAJgQwACjA8AAVZXAAKMDwABVlsAAowDAAFWUwACjBpgSwACjB8AAVp/AAKMHwABWoMAAowaYEMAAowqCxcAAowrAAFahwACjBpgWwACjDQAAwACM1MAAow/AAFWYwACjEJgSwACjESfAAKMRwACM1MAAoxMowACjESnAAKMRwABjGMAAoxHAAGMawACjEcAAYxzAAKMQmBDAAKMZI8AAoxCYFsAAoxsAAMAAjNXAAKMdmBDAAKMem9PAAKMdwABVmcAAoyCYEsAAoyGj2sAAoyG6M8AAoyG6j8AAoyG248AAoyG6fcAAoyHAAGMewACjIbbiwACjIbbkwACjIcAAYx/AAKMhwABjIMAAoyCYEMAAoyzAAFZIwACjLMAAVgjAAKMswABWUcAAoyzAAFYswACjLMAAVrLAAKMswABB5cAAoyzAAGMlwACjLMAAYybAAKMswABjJ8AAoyzAAGMowACjLMAAYynAAKMswABjKsAAoyzAAGMrwACjLMAAYyHAAKMgmBbAAKM7AADAAIzWwACjPcAAVZrAAKM+mBLAAKM/unXAAKM/ukLAAKM/udvAAKM+mBDAAKNDgdDAAKNDunTAAKNDum/AAKNDud3AAKM+mBbAAKNIAMAAoz3AAFWbwACjSpgSwACjS7oQwACjS7oPwACjS7n6wACjS8AAVeLAAKNKmBDAAKNQgdDAAKNQufnAAKNQugnAAKNQugbAAKNQug7AAKNKmBbAAKNWAMAAoz3AAFWcwACjWJgSwACjWbg7wACjWbpCwACjWJgQwACjXIHQwACjXLpvwACjXLp2wACjWJgWwACjYAAAwACM18AAo2LAAFWdwACjY5gQwACjZMAAVeXAAKNkwABV+sAAo2TAAFXKwACjZMAAVejAAKNkwABWQsAAo2TAAIzXwACjasAAYzPAAKNjmBbAAKNsAMAAo2LAAGM0wACjbpgQwACjb8AAVeXAAKNvwABV+sAAo2/AAFXKwACjb8AAVejAAKNvwABWQsAAo2/AAIzXwACjdcAAYzPAAKNumBbAAKN3AADAAIzYwACjeZgSwACjesAAVaTAAKN6wABVpcAAo3rAAECswACjeZgQwACjfsAAYzvAAKN+wABVo8AAo37AAFWhwACjfsAAVaLAAKN+wABVoMAAo3nAAFWewACjhJgTwACjhcAAVq7AAKOFwABWtMAAo4WtbMAAo4SYEMAAo4nAAFYTwACjicAAVe3AAKOJwABjOMAAo4nAAFX3wACjicAAVfXAAKOEmBbAAKOPAMAAo3nAAFWfwACjkZgTwACjksAAYznAAKOSkmfAAKOSwABMvsAAo5GYEMAAo5bAAFX0wACjlsAAVfbAAKOWkxfAAKORmBbAAKOaAADAAIzZwACjnJgQwACjncAAY2DAAKOdwABjYcAAo53AAGNiwACjnMAAY0TAAKOhmBDAAKOiwABV2cAAo6GYFsAAo6QAwACjnMAAY0XAAKOmmBDAAKOnwABV2cAAo6aYFsAAo6kAwACjnMAAY0bAAKOrmBDAAKOswABV2cAAo6uYFsAAo64AwACjnMAAY0jAAKOwmBDAAKOxwABV2cAAo7CYFsAAo7MAwACjs7CrwACjs8AAY0nAAKOcwABjSsAAo7eYEMAAo7jAAFXZwACjt5gWwACjugDAAKO6sKvAAKOcwABjS8AAo72YEMAAo77AAFXZwACjvZgWwACjwADAAKOcwABjTMAAo8KYEMAAo8PAAFXZwACjwpgWwACjxQDAAKOcwABjTcAAo8eYEMAAo8jAAFXZwACjx5gWwACjygDAAKPKsKvAAKOcwABjTsAAo82YEMAAo87AAFXZwACjzZgWwACj0ADAAKOcwABjT8AAo9KYEMAAo9PAAFXZwACj0pgWwACj1QDAAKOcwABjUMAAo9eYEMAAo9jAAFXZwACj15gWwACj2gDAAKOcwABjUcAAo9yYEMAAo93AAFXZwACj3JgWwACj3wDAAKOcwABjUsAAo+GYEMAAo+LAAFXZwACj4ZgWwACj5ADAAKPksKvAAKOcwABjU8AAo+eYEMAAo+jAAFXZwACj55gWwACj6gDAAKPqsKvAAKOcwABjVMAAo+2YEMAAo+7AAFXZwACj7ZgWwACj8ADAAKOcwABjVcAAo/KYEMAAo/PAAFXZwACj8pgWwACj9QDAAKOcwABjVsAAo/eYEMAAo/jAAFXZwACj95gWwACj+gDAAKP6sKvAAKP6wABW/8AAo/rAAFcAwACjnMAAY1fAAKP/mBDAAKQAwABV2cAAo/+YFsAApAIAwACjnMAAY1jAAKQEmBDAAKQFwABV2cAApASYFsAApAcAwACkB7CrwACkB8AAY0nAAKOcwABjWcAApAuYEMAApAzAAFXZwACkC5gWwACkDgDAAKQOsKvAAKQOwABTWMAAo5zAAGNawACkEpgQwACkE8AAVdnAAKQSmBbAAKQVAMAAo5zAAGNbwACkF5gSwACkGMAAY0fAAKQXmBDAAKQawABV2cAApBeYFsAApBwAwACjnMAAY1zAAKQemBDAAKQfwABV2cAApB6YFsAApCEAwACjnMAAY13AAKQjmBDAAKQkwABV2cAApCOYFsAApCYAwACkJrCrwACkJsAAY17AAKOcwABjX8AApCqYEMAApCvAAFXZwACkKpgWwACkLQAAwACM2sAApC/AAGNjwACkMJgTwACkMYCwwACkMJgQwACkM7B+wACkMJgWwACkNQDAAKQvwABjZMAApDeYEsAApDjAAIzawACkOa05wACkOcAAQ3PAAKQ5rFXAAKQ4ntXAAKQ3mBPAAKQ+wACM2sAApD/AAFCQwACkN5gQwACkQbB+wACkQbBTwACkQbBZwACkQbApwACkQbAcwACkQcAAY2XAAKRBwACM2sAApEjAAGNmwACkQbCFwACkQbAmwACkQbA2wACkQcAAY2fAAKRBsBbAAKRBsB3AAKQ3mBbAAKRQAMAApC/AAGN0wACkUpgTwACkU4CwwACkUpgQwACkVbB+wACkUpgWwACkVwDAAKQvwABjdcAApFmYEMAApFqwfsAApFqwU8AApFqwS8AApFmYFsAApF4AwACkL8AAY3bAAKRgmBPAAKRhgLDAAKRgmBDAAKRjsH7AAKRgmBbAAKRlAMAApC/AAGN3wACkZ5gSwACkaMAAjNrAAKRprFXAAKRnmBDAAKRrsH7AAKRrsFPAAKRrsErAAKRnmBbAAKRvAMAApC/AAGN4wACkcZgTwACkcoCwwACkcZgQwACkdLB+wACkcZgWwACkdgDAAKQvwABjecAApHiYEsAApHnAAIzawACkeq05wACkeqxVwACkeJgTwACkfcAAjNrAAKR+wABQkMAApHiYEMAApICwfsAApICwU8AApICwWcAApICwFsAApICwQcAApIDAAGN6wACkeJgWwACkhwDAAKQvwABjfsAApImYE8AApIqAsMAApImYEMAApIywfsAApImYFsAApI4AwACkL8AAY3/AAKSQmBLAAKSRwACM2sAApJLAAFCQwACkksAAV9nAAKSRwABjgMAApJHAAGOBwACkkcAAV9zAAKSQmBDAAKSYwABjgsAApJiwfsAApJjAAGODwACkmMAAY4TAAKSYwABjhcAApJiwWcAApJiwJsAApJiwKcAApJiwDcAApJiwHMAApJiwSsAApJiwS8AApJjAAGOIwACkmMAAY4nAAKSYsFPAAKSYwABjisAApJCYFsAApKkAwACkL8AAY4/AAKSrmBPAAKSsgLDAAKSrmBDAAKSusH7AAKSrmBbAAKSwAMAApC/AAGOQwACkspgSwACks8AAV9zAAKSzwABX3cAApLKYEMAApLbAAGOCwACktrB+wACktsAAY5HAAKS2wABjksAApLawU8AApLKYFsAApLwAwACkL8AAY5rAAKS+mBPAAKS/gLDAAKS+mBDAAKTBsH7AAKS+mBbAAKTDAMAApC/AAGObwACkxZgSwACkxsAAjNrAAKTHrFXAAKTFmBDAAKTJsH7AAKTJsFPAAKTJwACM2sAApMzAAGOcwACkzMAAQM/AAKTMwABjoMAApMzAAGOhwACkzMAAY6LAAKTJsEbAAKTJlZjAAKTFmBbAAKTUAMAApC/AAGOmwACk1pgSwACk14CwwACk1pgWwACk2QAAwACM28AApNvAAGOnwACk3JgSwACk3WPAAKTdghPAAKTcmBDAAKTgI8AApNyYFsAApOIAwACk28AAY6jAAKTkmBLAAKTlY8AApOXAAFi+wACk5JgQwACk6MAAY6vAAKToT8AApOjAAGOuwACk6CPAAKTkmBbAAKTtAMAApO3AAGOpwACk28AAY7DAAKTwmBLAAKTxwABjscAApPHAAGOywACk8cAAY7PAAKTxwABX/cAApPHAAFf+wACk8JgQwACk95PgwACk90/AAKT3wABhhsAApPfAAGO2wACk98AAY7fAAKT3gtDAAKT3I8AApPCYE8AApP+A/MAApPCYFsAApQEAwACk28AAY7jAAKUDmBPAAKUEgLDAAKUDmBDAAKUGsH7AAKUDmBbAAKUIAMAApNvAAGO5wAClCpgSwAClC8AAV9zAAKULwABX3cAApQvAAGO6wAClC8AAV/3AAKULwABX/sAApQqYEMAApRGwfsAApRHAAGO8wAClEcAAY77AAKURwABjvcAApRHAAGO/wAClEbBTwAClEcAAY8LAAKUKmBbAAKUZAMAApNvAAGPDwAClG5gSwAClHIL9wAClHMAAWEXAAKUbmBDAAKUfI8AApRuYFsAApSEAwACk28AAY8XAAKUjmBLAAKUkvSnAAKUkwABFx8AApSOYEMAApSfAAGPGwAClJ8AARcjAAKUnI8AApSOYE8AApSuA/MAApSOYFsAApS0AwACk28AAY8nAAKUvmBLAAKUwwABjysAApTDAAGPLwAClMMAAY8zAAKUwwABjzcAApS+YEMAApTXAAFhQwAClNZiPwAClNcAAWE/AAKU1wABjz8AApTW3csAApTXAAGPGwAClNcAARcjAAKUvmBPAAKU9l43AAKUvmBbAAKU/AMAApNvAAGPQwAClQZgSwAClQo8AwAClQsAAjNvAAKVErvnAAKVCg/bAAKVCwABj0cAApULAAGPSwAClQsAAWoHAAKVBmBDAAKVKwABj1MAApUrAAGPVwAClSsAAY9bAAKVKwABj18AApUrAAGPYwAClSsAAY9nAAKVBmBbAAKVRAMAApNvAAGPawAClU5gTwAClVICwwAClU5gQwAClVrB+wAClU5gWwAClWADAAKTbwABj28AApVqYEsAApVvAAIzbwAClXK75wAClW8AAV/3AAKVbwABX/sAApVvAAFfcwAClW48AwAClWpgQwAClYrB+wAClYrBTwAClYsAAY9/AAKViwABjrsAApWLAAGPiwAClYsAAY97AAKViwABj3cAApVqYFsAApWoAAMAAjNzAAKVswABj48AApW2YEsAApW6AsMAApW7AAIzcwAClcK05wAClcMAAY+TAAKVwwABYzMAApW2YE8AApXTAAIzcwACldatzwACldcAAQ3PAAKV1wABQkMAApW2YEMAApXmwfsAApXmwU8AApXmwWcAApXmwhMAApXnAAGPnwAClecAAY+bAAKV5wABj6cAApXnAAGPqwAClecAAY57AAKV5sCDAAKV5wABj7MAApXmwNsAApW2YFsAApYYAAMAAjN3AAKWIwABj8sAApYmYEsAApYrAAGPzwAClippCwAClisAAY/TAAKWKn9/AAKWKb8AApYqqtcAApYqf4cAApYrAAIzdwAClksAAWMvAAKWJmBPAAKWUgLDAAKWUqYbAAKWJmBDAAKWXwABVocAApZfAAGP1wACll7B+wACll7BTwACll8AAY/bAAKWXwABj98AApZewgcAApZfAAGP6wACll7A0wACll7AGwACll7ASwACll7BIwACll7A8wACll7A1wACll7AFwACll7BZwACll7A4wACll7BKwACll7BLwACll8AAY/3AAKWXwABj/sAApZfAAGP/wACll8AAZADAAKWXwABj+cAApZfAAGP4wACll8AAZAHAAKWXsIXAAKWJmBbAAKWzAADAAIzewACltcAAZAPAAKW2mBLAAKW3wABkBMAApbfAAGQFwACltpgQwAClusAAZAbAAKW6wABkB8AApbrAAGQIwAClusAAZAnAAKW6wABkCsAApbrAAGQLwAClusAAZAzAAKW6wABkDcAApbrAAGQPwACltpgWwAClxADAAKW1wABkEMAApcaYEsAApceA+8AApcaYEMAApcldwAClyYFBwAClyYFWwAClyYMswAClyZt3wAClycAARoHAAKXGmBPAAKXQpMTAAKXQvu7AAKXQpL3AAKXGmBbAAKXUAMAApbXAAGQRwACl1pgSwACl18AAZBLAAKXWmBDAAKXZXcAApdmBQcAApdaYFsAApdwAwACltcAAZBPAAKXemBLAAKXfgIrAAKXemBDAAKXhXcAApeGBQcAApeGBVsAApeGDLMAApeGbd8AApeHAAEaBwACl4UHAAKXhI8AApd6YE8AApeqDicAApeqkxMAApeq+7sAApeqkvcAApd6YFsAApe8AwACltcAAZBbAAKXxmBDAAKXyXcAApfKBQcAApfKBVsAApfKbd8AApfLAAEaBwACl8iPAAKXxmBPAAKX5pMTAAKX5vu7AAKXxmBbAAKX8AMAApbXAAGQYwACl/pgQwACl/13AAKX/gUHAAKX/gVbAAKX/m3fAAKX/wABGgcAApf8jwACl/pgTwACmBqTEwACmBr7uwACl/pgWwACmCQDAAKW1wABkGsAApguYEMAApgxdwACmDIFBwACmDIFWwACmDJt3wACmDMAARoHAAKYMI8AApguYE8AAphOkxMAAphO+7sAApguYFsAAphYAwACltcAAZBvAAKYYmBLAAKYZsFvAAKYYmBDAAKYbQcAAphtdwACmG4FBwACmG4FWwACmGyPAAKYYmBPAAKYhg4nAAKYhpMTAAKYhvu7AAKYYmBbAAKYlAMAApbXAAGQewACmJ5gTwACmKL7uwACmJ5gWwACmKgDAAKW1wABkH8AApiyYEsAApi2VS8AApi2VTMAApiyYFsAApjAAwACltcAAZCDAAKYymBDAAKYzQcAApjOBVsAApjNdwACmM4FBwACmMyPAAKYymBPAAKY5g4nAAKY5pMTAAKY5vu7AAKYymBbAAKY9AMAApbXAAGQiwACmP5gQwACmQEHAAKZAgVbAAKZAXcAApkCBQcAApkAjwACmP5gTwACmRoOJwACmRqTEwACmRr7uwACmP5gWwACmSgDAAKW1wABkJMAApkyYEsAApk2AisAApkyYEMAApk9BwACmT13AAKZPgyzAAKZPgUHAAKZPgVbAAKZPI8AApkyYE8AAplaDicAAplakxMAApla+7sAApkyYFsAAploAwACltcAASbbAAKZcmBLAAKZdlgTAAKZdlgXAAKZdgPvAAKZcmBDAAKZhk+bAAKZhk+fAAKZhXcAApmGBQcAApmGBVsAApmGDLMAApmFBwACmYVzAAKZhgIvAAKZhgUrAAKZhgUjAAKZhI8AAplyYE8AApm6DicAApm6kxMAApm6+7sAApm7AAGQnwACmXJgWwACmcwDAAKZzwABkJsAApnODcMAApbXAAGQpwACmd5gSwACmeMAAZCrAAKZ4wABYvsAApnif4cAApniA+8AApni+BcAApnie1cAApneYE8AApn+AsMAApneYEMAApoGwfsAApoHAAGQswACmgbBTwACmgbBZwACmgbA4wACmgZWYwACmgbAVwACmgbAYwACmgbANwACmgbCLwACmgcAAZDbAAKaBwABkN8AApoGwPMAApoGwI8AApoHAAGQ6wACmgbAGwACmgbBEwACmgbAIwACmgbCMwACmgcAAZDLAAKaBwABkPMAApoHAAGQ9wACmgcAAZD7AAKaBsIjAAKaBsDnAAKZ3mBbAAKabAMAApbXAAGRBwACmnZgSwACmnp/hwACmnsAAWL7AAKaegPvAAKadmBDAAKaigiPAAKainxrAAKaisDjAAKaisIzAAKaisAbAAKaisETAAKaiwABkOsAApp2YFsAApqoAAMAAjN/AAKaswABkR8AApq2YEsAApq6X/8AApq6X38AApq7AAGRIwACmrZgTwACmsoD8wACmslrAAKatmBDAAKa1T8AAprWT38AAprXAAFlRwACmtZu3wACmtYChwACmtZPzwACmtZPnwACmtcAAZErAAKatmBbAAKa+AMAApqzAAGRPwACmwJgSwACmwYCKwACmwYOQwACmwYNmwACmwJgTwACmxYOJwACmwJgWwACmxwAAwACM4MAApsmYEsAApsrAAIzgwACmy8AAZFDAAKbJmBDAAKbNwABkUcAAps3AAGRUwACmzbx5wACmzZMUwACmzcAAjODAAKbSwABkVsAAptLAAGRZwACm0sAAZFrAAKbStLnAAKbNwABkV8AAps3AAGJZAMAAjOHAAKbZmBHAAKbawABkZsAAptrAAGRnwACm2ZgSwACm3cAAjOHAAKbewABkbsAAptmYEMAApuDAAIzhwACm4cAAZG/AAKbZwABkaMAApuOYEsAApuTAAIzhwACm5cAAZGnAAKblwABkasAApuXAAGRrwACm45gQwACm6UTAAKbpgLLAAKbpgJnAAKbpvRfAAKbpkyDAAKbpgdDAAKbpgd3AAKbpvRXAAKbpg7zAAKbpgJ/AAKbpmJDAAKbpk+DAAKbpk+LAAKbpkyvAAKbppsXAAKbpvRrAAKbpI8AApunAAIzhwACm+8AAZGzAAKbjmBPAAKb9lY3AAKb9gPzAAKb9g2jAAKb9gdzAAKb9WsAApv0pwACm45gWwACnBADAAKcEkxYAwACM4sAApwfAAGRwwACnCJgSwACnCcAAjOLAAKcKwABkccAApwiYE8AApwxVwACnDID8wACnDFrAAKcImBDAAKcQgtDAAKcImBbAAKcSAMAApwfAAGRywACnFJgSwACnFcAAjOLAAKcWwABkc8AApxSYE8AApxhXwACnFJgQwACnGlbAAKcUmBbAAKccAADAAIzjwACnHsAAZHTAAKcfmBLAAKcgwACM48AApyHAAGR1wACnH5gQwACnI8AAjOPAAKckwABkdsAApyNEwACnI4CywACnI4HQwACnI5PgwACnI5PiwACnI5PlwACnH5gUwACnLFrAAKcfmBPAAKcuWsAApy6dgMAApzCxK8AApx+YFsAApzIAAMAAjOTAAKc0wABkecAApzWYEsAApzbAAIzkwACnN70owACnNZgQwACnOUTAAKc1mBPAAKc7gdzAAKc1mBbAAKc9AADAAIzlwACnP5gSwACnQMAAjOXAAKdBwABkesAAp0HAAGR7wACnQcAAZHzAAKdBwABkfcAAp0HAAGR+wACnQcAAZH/AAKc/mBDAAKdIwABkgMAAp0jAAGSEwACnSMAAZIXAAKdIwABkicAAp0jAAGSMwACnSMAAZI3AAKdIwABkjsAAp0jAAIzlwACnUMAAZI/AAKdQwABkksAAp1DAAGSVwACnUMAAZJbAAKdQwABklwDAAIzmwACnVpgRwACnV8AAZJjAAKdWmBLAAKdZwACM5sAAp1rAAGS+wACnVsAAZJnAAKdcmBLAAKddwACM5sAAp16TMsAAp1yYFcAAp2AAwACnXJgQwACnYpJ3wACnYoOQwACnYr2UwACnVsAAZJzAAKdmmBLAAKdnwACM5sAAp2jAAGSdwACnaMAAZJ7AAKdmmBDAAKdrknfAAKdrg5DAAKdrvZTAAKdmmBbAAKdvAMAAp1bAAGSgwACncZgQwACncpJ3wACncoOQwACncr2UwACncZgWwACndgDAAKdWwABkocAAp3iYEMAAp3mSd8AAp3mDkMAAp3m9lMAAp3iYFsAAp30AwACnVsAAZKLAAKd/mBLAAKeAwACM5sAAp4HAAGSjwACnf5gQwACng5J3wACng4OQwACng72UwACnf5gWwACnhwDAAKdWwABkqsAAp4mYEsAAp4rAAIzmwACni8AAZKPAAKeJmBDAAKeNknfAAKeNg5DAAKeNvZTAAKeJmBbAAKeRAMAAp1bAAGSrwACnk5gSwACnlMAAjObAAKeVwABko8AAp5OYEMAAp5eSd8AAp5eDkMAAp5OYFsAAp5oAwACnVsAAZKzAAKecmBDAAKedvZTAAKecmBbAAKefAMAAp1bAAGStwACnoZgQwACnor2UwACnoZgWwACnpADAAKdWwABkrsAAp6aYEsAAp6fAAGSvwACnp4OWwACnp4CKwACnppgTwACnq4OJwACnppgQwACnrUHAAKemmBbAAKevAMAAp1bAAGSywACnsZgSwACnssAAjObAAKezwABksMAAp7PAAGSxwACnsZgQwACntpJ3wACntoOQwACntr2UwACnsZgWwACnugDAAKdWwABktsAAp7yYEsAAp73AAIzmwACnvsAAZLfAAKe8mBDAAKfAknfAAKfAg5DAAKfAvZTAAKe8mBbAAKfEAMAAp1bAAGS6wACnxpgSwACnx8AAjObAAKfIwABka8AAp8jAAGS7wACnxpgQwACny5J3wACny4OQwACny72UwACnxpgWwACnzwDAAKfPmcTAAKdWwABkvMAAp9KYEMAAp9OSd8AAp9ODkMAAp9O9lMAAp9KYFsAAp9cAAMAAjOfAAKfZwABkv8AAp9qYFsAAp9sAwACn25MWAMAAjOjAAKfewABkwMAAp9+YFsAAp+AAwACn4JMWAMAAjOnAAKfjmBDAAKfkwABkwcAAp+TAAGTGwACn5MAAZMfAAKfkwABkyMAAp+TAAGTNwACn5MAAZNDAAKfkwABk1ADAAIzqwACn7MAAZNnAAKftmBLAAKfuwACM6sAAp+/AAGRxwACn7ZgTwACn8VXAAKftmBbAAKfzAMAAp+zAAGTcwACn9ZgSwACn9sAAjOrAAKf3wABkc8AAp/eFcsAAp/WYEMAAp/pWwACn9ZgTwACn/FfAAKf1mBbAAKf+AADAAIzrwACoAMAAZN3AAKgBmBLAAKgCwACM68AAqAOTMsAAqAGYFcAAqAUAwACoAZgTwACoB1rAAKgHgPzAAKgHg2jAAKgHgtLAAKgBmBDAAKgMgtDAAKgMT8AAqAyAmcAAqAyd3cAAqAyT4MAAqAyT4cAAqAyB0MAAqAyAocAAqAyR4sAAqADAAGTewACoFpgSwACoF8AAjOvAAKgYwABk38AAqBisW8AAqBibvMAAqBeWCMAAqBaYEMAAqB1PwACoHYCZwACoHYHQwACoHYLQwACoHZPgwACoHZPhwACoHZ3dwACoHYChwACoHZHiwACoHSPAAKgdwACM68AAqCirH8AAqCjAAGTgwACoKMAAZOLAAKgowABk48AAqCjAAGTkwACoKMAAV4fAAKgWmBPAAKgvgtLAAKgvgPzAAKgvg2jAAKgvWsAAqBaYFsAAqDQAAMAAjOzAAKg2wABk78AAqDeYE8AAqDhVwACoOID8wACoOINowACoOILSwACoOIF5wACoOIC2wACoOJgBwACoN5gQwACoQJMhwACoQJMnwACoQIO8wACoQILQwACoQJMewACoQIFlwACoQJMjwACoQJMpwACoQJMswACoQFHAAKhAgSfAAKhAkzDAAKhAgJ/AAKhAkyLAAKhAkyrAAKhAgxLAAKhAkxfAAKhAky3AAKhAky7AAKhAky/AAKhAgKHAAKhAkeLAAKhAT8AAqECAmcAAqECT4MAAqECdgMAAqFq8dMAAqFq8dcAAqFq8eMAAqECT4sAAqECT5cAAqECB0MAAqECTIMAAqECVpsAAqECAosAAqEC8ecAAqECbM8AAqEBdwACoQID/wACoQLcjwACoQLDEwACoQJppwACoQIMXwACoQLyCwACoQICuwACoQLyHwACoQIN2wACoQLyIwACoQJ2WwACoQK4VwACoQLyJwACoQLyLwACoQCPAAKg3mBTAAKh2gtLAAKh2gXnAAKg3mBbAAKh5AMAAqDbAAGTwwACoe5gSwACofMAAjOzAAKh9wABk38AAqH3AAGTxwACofcAAZPLAAKh9wABk88AAqHuYEMAAqILAAIzswACog8AAZPXAAKiDwABlAcAAqIPAAGUCwACog6sfwACog8AAV4fAAKiDwABlBcAAqIPAAGT4wACogk/AAKiCgJnAAKiCkyDAAKiCkyvAAKiCI8AAqIKD58AAqILAAGT7wACogp3dwACogpWmwACogkTAAKiCgLLAAKh7mBXAAKiWkxbAAKh7mBPAAKiYWsAAqHuYFMAAqJpawACoe5gWwAConADAAKicwACM7MAAqJ6AqMAAqDbAAGUIwACooJgSwACoocAAjOzAAKiip4TAAKigmBPAAKikwACM7MAAqKXAAGTywACopcAAZPPAAKigmBTAAKiowACM7MAAqKnAAGTywACoqcAAZPPAAKigmBbAAKisAADAAIztwACorsAAZQnAAKivmBDAAKiwwACM7sAAqLHAAGR2wACosE/AAKiwgJnAAKiwk+DAAKiwk+HAAKiwk+TAAKiwk+LAAKiwk+XAAKiwgdDAAKivmBbAAKi7AMAAqK7AAGULwACovZgSwACovsAAjO3AAKi/vS7AAKi/wABlDMAAqL2YE8AAqMJawACowlXAAKjCwACM7cAAqMXAAGUNwACoxcAAZQ7AAKi9mBDAAKjIgtDAAKjIk9/AAKjIkeLAAKi9mBbAAKjMAMAAqMyTFgDAAIzvwACoz8AAZQ/A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wACsEJgQwACsEyPAAKwQmBbAAKwVAADAAIz2wACsF5gRwACsGMAAZefAAKwXwABl6cAArBqYEsAArBvAAIz2wACsHKxVwACsHJ+ywACsHLLTwACsHKtzwACsHMAAX4HAAKwcrFjAAKwcrwnAAKwcwABIqMAArBzAAGXqwACsHMAAQ2PAAKwcwABDy8AArBzAAENzwACsHMAAV9nAAKwcwABfg8AArByu/cAArByvBMAArByvAMAArBzAAGXrwACsHK75wACsHMAAV6DAAKwcrTnAAKwcrwHAAKwcwABl7MAArBzAAEzOwACsHMAAUJHAAKwcwABX68AArBzAAE/mwACsHMAAX5DAAKwcwABl7cAArByadcAArBzAAGXuwACsHMAAZe/AAKwcwABl8MAArBzAAGXxwACsG7ydwACsGpgQwACsQMAAZfLAAKxAwACM9sAArELAAGYJwACsQsAAZfTAAKxCwABmC8AArELAAGYMwACsQsAAZgXAAKxCwABmGMAArELAAGYHwACsQsAAZhzAAKxCwABmGsAArELAAGYewACsQsAAZhvAAKxCwABmIcAArELAAGYZwACsQsAAZgPAAKxCwABmIsAArELAAGY1wACsQsAAZf7AAKxCwABmQsAArELAAGZDwACsQsAAZkTAAKxCwABmOsAArELAAGZHwACsQsAAZkjAAKxCwABmPsAArELAAGYkwACsQsAAZg3AAKxCwABmMcAArELAAGY0wACsQsAAZjLAAKxCwABmMMAArELAAGX7wACsQsAAZf3AAKwamBbAAKxjAMAArBfAAGZNwACsZZgSwACsZsAAjPbAAKxnrFXAAKxnq3PAAKxnstPAAKxnwABfgcAArGesWMAArGeu+cAArGfAAETxwACsZ8AAZerAAKxnwABDY8AArGfAAENzwACsZ68EwACsZ605wACsZ8AAX5DAAKxnwABl68AArGfAAFCRwACsZquzwACsZsAAZjbAAKxmwABl9sAArGbAAGX6wACsZsAAZfjAAKxmwABl/MAArGbAAGZOwACsZsAAZZPAAKxmwABFAsAArGWYEMAArIDAAGYCwACsgMAAZlDAAKyAwABmU8AArIDAAGZUwACsgMAAZlbAAKyAwABmWcAArIDAAGZbwACsgMAAZl/AAKyAwABDx8AArGWYFsAArIoAwACsF8AAZmDAAKyMmBLAAKyNwACM9sAArI6sVcAArI6y08AArI6rc8AArI6fvcAArI7AAENjwACsjq75wACsjq05wACsjJgQwACslsAAZkrAAKyWwABmZMAArJbAAGZlwACslsAAZmfAAKyWwABmZsAArIyYFsAArJwAwACsF8AAZmjAAKyemBLAAKyflDjAAKyflD7AAKyemBbAAKyiAMAArBfAAGZpwACspJgSwACspcAAjPbAAKymm1fAAKymwABmasAArKbAAGZrwACspYCwwACsparzwACspJgQwACsrMAAjPbAAKytwABmbMAArKyUQcAArKyUP8AArKyDvMAArKSYE8AArLJawACspJgWwACstIF4wACstJlxwACsF8AAZm3AAKy3mBLAAKy4wACM9sAArLmqpsAArLnAAFCRwACsucAAZm7AAKy5wABmb8AArLnAAGZwwACsucAAZnHAAKy4wABmBMAArLeYE8AArMHAAGWSwACswcAAZgbAAKzBwABmCMAArLeYEMAArMXAAIz2wACsxsAAZnLAAKzFwABl9cAArMXAAGX3wACsxcAAZfnAAKzFwABA78AArMXAAGYfwACst5gWwACszQAAwACM98AArM/AAF6RwACs0JgSwACs0YK6wACs0JgTwACs08AAXobAAKzQmBDAAKzVrzvAAKzQmBbAAKzXAMAArM/AAEOfwACs2ZgSwACs2sAAjPfAAKzboEXAAKzbrTnAAKzbwABE8cAArNqvDMAArNmYE8AArODAAIz3wACs4a+cwACs4J/OwACs2ZgQwACs5MAAXpDAAKzkwABelMAArOTAAF6TwACs5MAAWHnAAKzkwABOTMAArOTAAER+wACs5MAAWI7AAKzkwABYi8AArOTAAFhywACs5MAAXonAAKzkq8PAAKzZmBbAAKzwAADAAIz4wACs8pgQwACs88AAZonAAKzzwABmjQDAAIz5wACs9sAAYsvAAKz3mBLAAKz4gLDAAKz4wACM+cAArPrAAEfnwACs+sAAUgbAAKz6wABSCMAArPrAAFIHwACs+sAAZo/AAKz6wABmkMAArPrAAENjwACs+sAAZpHAAKz6wABDQsAArPrAAERKwACs95gTwACtBYD8wACtBcAASM/AAK0FhHzAAK0FwABI0sAArQXAAEMywACtBcAASNPAAK0FwABDUMAArQXAAEjUwACtBa8owACtBcAASNfAAK0FwABECcAArPeYEMAArRHAAFGOwACtEcAAUY3AAK0RwABRjMAArRHAAEM6wACtEcAAYtPAAK0RwABi0MAArRHAAGLSwACtEcAAYtHAAK0RwABmksAArRHAAETawACtESPAAKz3mBbAAK0dAADAAIz6wACtH8AAZp3AAK0gmBLAAK0hwACM+sAArSLAAEfnwACtIJgQwACtJE/AAK0kwABmnsAArSSB3cAArSSAssAArSREwACtJJPgwACtJIO8wACtJLTCwACtJCPAAK0kwABmoMAArSCYE8AArS+A/MAArS+DaMAArSCYFsAArTIAAMAAjPvAAK00mBLAAK01wABmu8AArTXAAGa8wACtNMAAZqfAAK04mBLAAK05wABmqMAArTiYEMAArTuCxcAArTvAAFahwACtOJgWwACtPgDAAK00wABmqcAArUCYEMAArUHAAFahwACtQJgWwACtQwDAAK00wABmqsAArUWYEMAArUbAAFahwACtRZgWwACtSADAAK00wABmq8AArUqYEMAArUvAAFahwACtSpgWwACtTQDAAK00wABmrMAArU+YEMAArVDAAFahwACtT5gWwACtUgDAAK00wABmrcAArVSYEMAArVWCxcAArVSYFsAArVcAwACtNMAAZq7AAK1ZmBDAAK1agsXAAK1ZmBbAAK1cAMAArTTAAGavwACtXpgQwACtX4LFwACtX8AAVqHAAK1emBbAAK1iAMAArTTAAGawwACtZJgQwACtZcAAVqHAAK1kmBbAAK1nAMAArTTAAGaxwACtaZgQwACtasAAVqHAAK1pmBbAAK1sAMAArTTAAGaywACtbpgQwACtb4LFwACtb8AAVqHAAK1umBbAAK1yAMAArTTAAGazwACtdJgQwACtdYLFwACtdcAAVqHAAK10mBbAAK14AMAArTTAAGa0wACtepgQwACte8AAVqHAAK16mBbAAK19AMAArTTAAGa1wACtf5gQwACtgMAAVqHAAK1/mBbAAK2CAMAArTTAAGa2wACthJgQwACthYLFwACthJgWwACthwDAAK00wABmt8AArYmYEMAArYqCxcAArYmYFsAArYwAwACtNMAAZrjAAK2OmBLAAK2PwABmucAArY/AAGa6wACtjpgTwACtksAAVp/AAK2OmBDAAK2UgsXAAK2UwABWocAArY6YFsAArZcAAMAAjPzAAK2ZmBLAAK2awABm38AArZrAAGbgwACtmsAAZuHAAK2awABm4sAArZrAAGbjwACtmsAAZuTAAK2awABm5cAArZrAAGbmwACtmsAAZufAAK2awABm6MAArZmYEMAAraXAAGbpwACtpcAAZurAAK2lwABm68AAraXAAGbswACtpcAAZu/AAK2ZudfAAK2rmBPAAK2swABWrsAArazAAFa0wACtrK1swACtq5gQwACtsMAAVhPAAK2wwABV7cAArbDAAGM4wACtsMAAVffAAK2wwABV9cAArauYFsAArbYAwACtmcAAZr7AAK24mBPAAK25wABWrsAArbnAAFa0wACtua1swACtuJgQwACtvcAAVhPAAK29wABV7cAArb3AAGM4wACtvcAAVffAAK29wABV9cAArbiYFsAArcMAwACtmcAAZr/AAK3FmBPAAK3GwABWrsAArcatbMAArcWYEMAArcnAAGbAwACtycAAVfXAAK3FmBbAAK3MAMAArZnAAGbBwACtzpgSwACtz5zdwACtzpgTwACt0cAAVq7AAK3RwABWtMAArdGtbMAArc6YEMAArdXAAFYTwACt1cAAVe3AAK3VwABjOMAArdXAAFX3wACt1cAAZsDAAK3VwABV9cAArc6YFsAArdwAwACtmcAAZsLAAK3emBPAAK3fwABWrsAArd+tbMAArd6YEMAAreLAAGbAwACt4sAAVfXAAK3emBbAAK3lAMAArZnAAGbDwACt55gTwACt6MAAVq7AAK3owABWtMAAreitbMAAreeYEMAArezAAFYTwACt7MAAVe3AAK3swABjOMAArezAAFX3wACt7MAAZsDAAK3swABV9cAAreeYFsAArfMAwACtmZX1wACt9ZgTwACt9sAAVq7AAK32wABWtMAArfatbMAArfWYEMAArfrAAFYTwACt+sAAVe3AAK36wABjOMAArfrAAFX3wACt+sAAVfXAAK31mBbAAK4AAMAArZnAAGbEwACuApgSwACuA2PAAK4DkkTAAK4DwABmxcAArgOCE8AArgPAAGbGwACuA8AAZsfAAK4CmBPAAK4KwABWrsAArgrAAFa0wACuCq1swACuApgQwACuDsAAVhPAAK4OwABV7cAArg7AAGM4wACuDsAAVffAAK4OwABV9cAArg7AAGM/wACuDsAAYz7AAK4OwABjQcAArg7AAGNCwACuDsAAYzzAAK4OwABjQMAArg7AAGM9wACuDsAAZszAAK4CmBbAAK4cAMAArhzAAIz8wACuHsAAZsjAAK2ZwABmzsAAriCYE8AAriGSZ8AAriCYEMAAriPAAFX0wACuI8AAVfbAAK4jkxfAAK4gmBbAAK4nAMAArZnAAGbPwACuKZgTwACuKsAAYznAAK4qkmfAAK4qwABMvsAArimYEMAAri7AAFX0wACuLsAAVfbAAK4ukxfAAK4uwABm0cAAri7AAGbQwACuKZgWwACuNADAAK2ZwABm0sAArjaYE8AArjfAAEy+wACuNpgQwACuOcAAZtHAAK45wABm0MAArjaYFsAArjwAwACtmcAAZtTAAK4+mBPAAK4/wABMvsAArj6YEMAArkHAAGbRwACuQcAAZtDAAK4+mBbAAK5EAMAArZnAAGbVwACuRpgSwACuR2PAAK5Ht13AAK5HkmfAAK5HwABm1sAArkaYEMAArkzAAGNDwACuTMAAVfTAAK5MwABV9sAArkzAAGbYwACuTMAAZtfAAK5MkxfAAK5GmBbAAK5TAADAAIz9wACuVZgQwACuVsAAZvDAAK5Vg5jAAK5YmBLAAK5ZgtLAAK5ZgXnAAK5YmBbAAK5cAADAAIz+wACuXsAAZvHAAK5fmBDAAK5gwACM/sAArmHAAGR2wACuYJMgwACuYILQwACuYIPGwACuYJMnwACuYJPfwACuYJMrwACuYJMswACuYJMwwACuYJHiwACuYJPmwACuYJPnwACuYJPowACuYE/AAK5ggJnAAK5ggdDAAK5gk+DAAK5gk+HAAK5gk+LAAK5gk+XAAK5gk+TAAK5fmBPAAK53VcAArndawACud8AAjPDAAK56wABka8AArnrAAGUmwACuX5gWwACufQAAwACM/8AArn+YEsAAroDAAGf3wACugMAAZ/nAAK6AwABn+8AAroDAAGdDwACugMAAZ//AAK6AwABoAcAArn/AAGb4wACuh5gSwACuiIIewACuiK8MwACuiJNvwACuiMAAZvnAAK6Ir6HAAK6IwABmdsAArojAAIz/wACuj605wACuj8AAZvrAAK6IwABmh8AArojAAGaGwACuiMAAZvvAAK6IwABm/cAArojAAGb+wACuiMAAZwDAAK6HmBPAAK6Yn7zAAK6Yn87AAK6HmBDAAK6bwABnAsAArpvAAE5MwACum8AAZoLAAK6bwABelMAArpvAAF6TwACum8AAZnjAAK6bwABmd8AArpvAAF6QwACum8AAZxPAAK6bwABnD8AArpvAAGcdwACum8AAZxHAAK6bwABnHMAArpvAAGcSwACuh5gWwACuqgDAAK5/wABnNMAArqyYEsAArq2CHsAArq2vDMAArq2fvMAArq3AAGb5wACurcAAZzXAAK6twACM/8AArrOtOcAArrPAAGc2wACus8AAZzfAAK6zwABnOMAArqyYE8AArrjAAGc5wACuuMAAZzrAAK64wABnO8AArqyYEMAArrzAAE5MwACuvMAAZnfAAK68lWfAAK68q9nAAK68wABnCsAArrzAAGdmwACuvMAAZw3AAK68wABnQMAArrzAAGdNwACuvMAAZ3XAAK68wABndsAArrzAAGdTwACuvMAAZ43AAK68wABeWcAArrzAAF5bwACuvMAAZ4/AAK68wABnkcAArrzAAGdVwACuvMAAZ1fAAK68wACM/8AArtDAAGeewACuvMAAZ6vAAK68t8TAAK68wABnWcAArrzAAGdawACuvMAAZ1vAAK68wABnXMAArrzAAGfQwACuvMAAZxDAAK68wABn48AArrzAAGflwACuvMAAZ+fAAK68wABnXsAArrzAAGdgwACurJgWwACu3wDAAK5/wABn8cAAruGYEsAAruLAAIz/wACu48AAUQfAAK7hmBPAAK7lgPzAAK7lg2jAAK7hmBDAAK7owABJMsAArujAAFnYwACu4ZgWwACu6wDAAK5/wABn9MAAru2YEsAAru7AAGdqwACu7pWlwACu7ZgWwACu8QDAAK5/wABn9cAArvOYEsAArvTAAGCTwACu9MAAYJXAAK70wABgl8AArvOYFsAArvgAwACuf8AAZ/bAAK76mBLAAK77wACM/8AArvyT8MAArvqYEMAArv7AAGfiwACu+pgTwACvAICKwACvAMAAWenAAK76mBbAAK8DAADAAI0AwACvBcAAZvTAAK8GmBLAAK8HwACNAMAArwjAAGgDwACvCMAAaATAAK8GmBXAAK8LAMAArwaYEMAArw2DP8AArw2h0sAArw3AAErUwACvBpgWwACvEcAAjQDAAK8SgKjAAK8FwABoBcAArxSYEsAArxXAAI0AwACvFpPwwACvFJgTwACvGICKwACvFJgQwACvGk/AAK8agg/AAK8UmBbAAK8dAADAAI0BwACvH8AAZvXAAK8gmBLAAK8hgXTAAK8hgrzAAK8hwABoB8AAryHAAGgIwACvIZWNwACvIcAAaAnAAK8hwABoCsAAryG0uMAAryCYEMAAryrAAGgLwACvKsAAaAzAAK8qnvHAAK8qwACNAcAAry7AAGgSwACvKsAAaBfAAK8qwABoJcAAryrAAGgpwACvKsAAaDzAAK8qwABoP8AAryCYFsAArzUAwACvH8AAaEXAAK83mBLAAK84wACNAcAArzmT8MAArzjAAGhGwACvOMAAaEfAAK84wABoSMAArzjAAGhJwACvOMAAaErAAK83mBDAAK9Am5rAAK9AkhTAAK9AwABoTcAArzeYFsAAr0QAwACvH8AAaE7AAK9GmBLAAK9HtLfAAK9HtK3AAK9GmBbAAK9KAMAArx/AAGhPwACvTJgSwACvTcAAjQHAAK9OpHPAAK9MmBDAAK9QwACNAcAAr1HAAGhQwACvUE/AAK9QwABk+8AAr1DAAGhSwACvUMAAaFPAAK9QwABoVcAAr1CDvMAAr1DAAGgVwACvTJgWwACvWgDAAK8fwABoVsAAr1yYEsAAr12An8AAr1yYEMAAr1/AAEwwwACvX0TAAK9cmBPAAK9ihPnAAK9cmBbAAK9kAADAAI0CwACvZsAAZvbAAK9nmBLAAK9owACNAsAAr2mTMsAAr2eYFcAAr2sAwACvZ5gQwACvbZnhwACvZsAAaFjAAK9vmBLAAK9wwACNAsAAr3HAAFCRwACvccAAaFnAAK9vmBDAAK90meHAAK90wABoWsAAr3TAAGhbwACvdMAAaFzAAK90wABoXcAAr3SZ4sAAr3TAAGhewACvdMAAaF/AAK90q5rAAK90tBHAAK90vtzAAK90tAjAAK90tAvAAK90tAXAAK90tA7AAK90lojAAK90tBnAAK90tBzAAK90tCLAAK90nbDAAK90sCDAAK90vtrAAK90vtvAAK90lUbAAK9vmBbAAK+NAMAAr2bAAGhpwACvj5gSwACvkJvxwACvkJwAwACvkJxMwACvkJxGwACvkLPNwACvkJxQwACvkLPhwACvkJwJwACvkLPkwACvkLPUwACvkLPtwACvkL7QwACvkL7SwACvkL7VwACvkMAAaGrAAK+Qs/jAAK+PmBDAAK+hghzAAK+hq5rAAK+htBHAAK+hvtzAAK+htAjAAK+htAvAAK+htAXAAK+htA7AAK+hlojAAK+htBnAAK+htBzAAK+htCLAAK+hnbDAAK+hsCDAAK+hvtrAAK+hvtvAAK+hlUbAAK+PmBbAAK+zAMAAr2bAAGhrwACvtZgQwACvtoIcwACvtpX2wACvtqt6wACvtpYCwACvtpX8wACvtpYLwACvtpX0wACvtZgWwACvvgDAAK9mwABobMAAr8CYEsAAr8HAAI0CwACvwsAAZvrAAK/CwABobcAAr8CYEMAAr8WZ4cAAr8WV9sAAr8WresAAr8WWAsAAr8WV/MAAr8WWC8AAr8WV9MAAr8XAAI0CwACvzcAAaG/AAK/AmBbAAK/PAADAAI0DwACv0ZgSwACv0sAAaHPAAK/RmBDAAK/UwABodQDAAI0EAMAAjQXAAK/XwABoecAAr9iYEsAAr9mD+sAAr9iYEMAAr9tBwACv2yPAAK/YmBPAAK/eg4nAAK/YmBbAAK/gAADAAI0GwACv4sAAaHrAAK/jmBPAAK/kwABoe8AAr+OYEMAAr+aFdcAAr+ar6MAAr+OYFsAAr+kAAMAAjQfAAK/rwABofsAAr+yYEsAAr+3AAI0HwACv7sAAaH/AAK/uk+/AAK/smBDAAK/xhXXAAK/xq+jAAK/smBbAAK/0AMAAr+vAAGiAwACv9pgSwACv98AAjQfAAK/4wABogcAAr/jAAGiCwACv+MAAaIPAAK/4wABohMAAr/aYEMAAr/1PwACv/cAAaIbAAK/9gg/AAK/2mBbAALABAADAAI0IwACwA5gSwACwBMAAaI/AALAEwACNCMAAsAbAAGiQwACwBsAAaMnAALADwABoiMAAsAmYEsAAsArAAGh7wACwCZgQwACwDKvowACwCZgWwACwDsAAjQjAALAPgKjAALADwABoicAAsBGYEsAAsBKSGcAAsBGYEMAAsBTAAGiOwACwEZgWwACwFgAAwACNCcAAsBiYEsAAsBnAAGjTwACwGMAAaMrAALAbmBLAALAcwABoe8AAsBuYEMAAsB6r6MAAsBuYFsAAsCDAAI0JwACwIYCowACwGMAAaMvAALAjmBLAALAkkhnAALAkwACNCcAAsCbAAGjMwACwI5gQwACwKMAAaI7AALAjmBbAALAqAADAAI0KwACwLJgSwACwLcAAaOXAALAtwACNCsAAsC/AAGiQwACwLMAAaNTAALAxmBLAALAywABoe8AAsDGYEMAAsDTAAE4IwACwNKvowACwMZgWwACwN8AAjQrAALA4gKjAALAswABo1cAAsDqYEsAAsDuSGcAAsDvAAI0KwACwPcAAaMzAALA6mBDAALA/wACNCsAAsEDAAGjcwACwQMAAaN3AALBAwABo3sAAsEDAAGjfwACwQMAAaODAALBAwABo4cAAsEDAAGjiwACwP8AAaI7AALA6mBbAALBJAADAAI0LAMAAjQzAALBMwABpFsAAsE2YEsAAsE7AAI0MwACwT5PwwACwTZgTwACwUYCKwACwTZgQwACwU0/AALBTgg/AALBNmBbAALBWAADAAI0NwACwWMAAaRfAALBZmBLAALBawACNDcAAsFuWtMAAsFvAAGkYwACwW8AAaRnAALBbwABpGsAAsFvAAGkcwACwW8AAaR3AALBbwABohMAAsFmYE8AAsGOSGcAAsFmYEMAAsGXAAGiOwACwZU/AALBlgg/AALBlwACNDcAAsGnAAGkiwACwacAAaSDAALBpwABpIcAAsGnAAGktwACwWZgWwACwbgAAwACNDsAAsHCYEsAAsHHAAGkywACwccAAaTPAALBxwABpNMAAsHCYEMAAsHXAAGk1wACwdcAAaTYAwACND8AAsHjAAGk4wACweZgSwACwesAAjQ/AALB7wABpOcAAsHvAAGiEwACweZgTwACwfppvwACwfrCowACweZgQwACwgYHQwACwgU/AALCBgg/AALB5mBbAALCFAADAAI0QwACwh8AAaTvAALCImBLAALCJwACNEMAAsIqXoMAAsIrAAGiEwACwiJgTwACwjYP6wACwjbCowACwiJgQwACwkIHQwACwkE/AALCQwABohsAAsJCCD8AAsIiYFsAAsJUAAMAAjRHAALCXmBLAALCYwABpQMAAsJfAAGk/wACwmpgTwACwm4V0wACwm4GIwACwmpgWwACwnsAAjRHAALCfgKgAwACNEsAAsKGYEsAAsKKTf8AAsKHAAGlEwACwpJgTwACwpYV0wACwpYGIwACwpJgWwACwqMAAjRLAALCpgKgAwACNE8AAsKvAAGlFwACwrJgSwACwrcAAjRPAALCul6DAALCuwABohMAAsKyYE8AAsLGDsMAAsLGwqMAAsKyYEMAAsLSB0MAAsLRPwACwtMAAaIbAALC0gg/AALCsmBbAALC5AADAAI0UAMAAjRXAALC8mBLAALC9wABpPcAAsLyYEMAAsL/AAI0VwACwwMAAaUnAALDAwABpTcAAsLzAAGlHwACww5gQwACwxIV1wACwxKvowACww5gWwACwx8AAjRXAALDIgKjAALC8wABpSMAAsMqYEsAAsMvAAI0VwACwzJa0wACwypgQwACwzk/AALDOwABohsAAsM6CD8AAsMqYFsAAsNIAAMAAjRbAALDUmBLAALDVwABpPsAAsNSYEMAAsNfAAI0WwACw2MAAaVrAALDUwABpT8AAsNqYEMAAsNuFdcAAsNur6MAAsNqYFsAAsN7AAI0WwACw34CowACw1MAAaVLAALDhmBLAALDiwACNFsAAsOOWtMAAsOPAAGlTwACw4ZgQwACw5sAAaIbAALDmwABpV8AAsOaCD8AAsObAAI0WwACw6sAAaVTAALDhmBbAALDsAMAAsNTAAGlZwACw7pgSwACw78AAjRbAALDwlrTAALDwwABpU8AAsO6YEMAAsPNPwACw88AAaIbAALDzgg/AALDzwACNFsAAsPfAAGlUwACw7pgWwACw+QAAwACNF8AAsPuYEsAAsPzAAGlCwACw+5gQwACw/sAAjRfAALD/wABpScAAsP/AAGlNwACw+8AAaWLAALECmBDAALEDhXXAALEDq+jAALECmBbAALEGwACNF8AAsQeAqMAAsPvAAGljwACxCZgSwACxCsAAjRfAALELlrTAALEJmBDAALENT8AAsQ3AAGiGwACxDYIPwACxCZgWwACxEQAAwACNGMAAsROYEsAAsRTAAGlDwACxFMAAjRjAALEWwABpacAAsROYEMAAsRjAAI0YwACxGcAAaVrAALEZwABpbMAAsRPAAGllwACxHJgQwACxHYV1wACxHavowACxHJgWwACxIMAAjRjAALEhgKjAALETwABpZ8AAsSOYEsAAsSTAAI0YwACxJZa0wACxJcAAaVPAALEjmBDAALEowABohsAAsSjAAGlXwACxKIIPwACxKMAAjRjAALEswABpVMAAsSOYFsAAsS4AwACxE8AAaWjAALEwmBLAALExwACNGMAAsTKWtMAAsTLAAGlTwACxMJgQwACxNU/AALE1wABohsAAsTWCD8AAsTXAAI0YwACxOcAAaVTAALEwmBbAALE7AADAAI0ZwACxPcAAaXDAALE+mBLAALE/wABpccAAsT/AAI0ZwACxQZegwACxQZu8wACxPpgTwACxRMAAjRnAALFFwABpcsAAsUXAAGlzwACxRFrAALFEwABpf8AAsUTAAGkkwACxRKPWwACxRIISwACxPpgQwACxTUTAALFNgLLAALFNwACNGcAAsVCrH8AAsVDAAGRWwACxUMAAaXfAALFQwABpeMAAsVDAAGl8wACxUMAAaXbAALFQwABXh8AAsVDAAGl+wACxUMAAaXXAALFNT8AAsU2AmcAAsU28icAAsU2dlsAAsU2DF8AAsT6YFMAAsV9awACxPpgWwACxYQDAALE9wABpgMAAsWOYE8AAsWTAAI0ZwACxZcAAaXPAALFjmBbAALFnAMAAsT3AAGmBwACxaZgTwACxasAAjRnAALFrwABpc8AAsWmYFsAAsW0AwACxPcAAaYLAALFvmBDAALFwwACNGcAAsXHAAGl1wACxb5gWwACxcwDAALE9wABphMAAsXWYEMAAsXbAAI0ZwACxd8AAaXXAALF1mBbAALF5AMAAsT3AAGmFwACxe5gQwACxfMAAjRnAALF9wABpdcAAsXuYFsAAsX8AwACxPcAAaYbAALGBmBDAALGCwACNGcAAsYPAAGl1wACxgZgWwACxhQDAALE9wABph8AAsYeYEMAAsYjAAI0ZwACxicAAaXXAALGHmBbAALGLAMAAsT3AAGmIwACxjZgQwACxjsAAjRnAALGPwABpdcAAsY2YFsAAsZEAwACxPcAAaYnAALGTmBDAALGUwACNGcAAsZXAAGl1wACxk5gWwACxlwDAALE9wABpisAAsZmYEMAAsZrAAI0ZwACxm8AAaXXAALGZmBbAALGdAMAAsT3AAGmLwACxn5gQwACxoMAAjRnAALGhwABpdcAAsZ+YFsAAsaMAwACxPcAAaYzAALGlmBDAALGmwACNGcAAsafAAGl1wACxpZgWwACxqQDAALE9wABpjcAAsauYEMAAsazAAI0ZwACxrcAAaXXAALGrmBbAALGvAMAAsT3AAGmOwACxsZgSwACxssAAjRnAALGzwABkesAAsbGYE8AAsbXAAI0ZwACxtsAAaXPAALGxmBDAALG4wACNGcAAsbnAAGl1wACxsZgWwACxuwDAALE9wABpj8AAsb2YE8AAsb7AAI0ZwACxv8AAaXPAALG9mBDAALHBwACNGcAAscLAAGl1wACxvZgWwACxxAAAwACNGsAAscaYEMAAscfAAGmRAJqQwACxyZgRwACxysAAaanAALHKwABpqsAAscrAAGmswACxysAAaa3AALHKwABprsAAscrAAGmvwACxysAAabDAALHKwABpscAAscrAAGmywACxysAAabPAALHKwABptMAAscrAAGm1wACxysAAabbAALHKwABpt8AAscrAAGm4wACxysAAabnAALHKwABpusAAscrAAGm7wACxysAAabzAALHKwABpvcAAscrAAGm+wACxysAAab/AALHKwABpwMAAscrAAGnBwACxysAAacPAALHKwABpxMAAscrAAGnFwACxysAAacbAALHKwABpx8AAscrAAGnIwACxysAAacnAALHKwABpysAAscrAAGnLwACxysAAaczAALHKwABpzcAAscrAAGnOwACxysAAac/AALHKwABp0MAAscrAAGnRwACxysAAadLAALHJmBLAALHzmpDAALH0wABrpcAAsfTAAGumwACx9MAAa6fAALH0wABrqMAAsfTAAGupwACx9MAAa6rAALHJmBDAALH7mpDAALH8wABrq8AAsfya3sAAsfyax8AAsfya4MAAsfya2MAAsfya2sAAsfya5sAAsfya3MAAsfzAAGuxwACx/MAAa7PAALH8wABrtcAAsfzAAGu3wACx/MAAa7jAALH8wABrucAAsfzAAGu7wACx/MAAa7zAALH8wABrvcAAsfzAAGu+wACx/MAAa8HAALH8wABrwsAAsfzAAGvDwACx/MAAa8XAALH8wABrxsAAsfzAAGvIwACx/MAAa8nAALH8wABrysAAsfzAAGvLwACx/MAAa83AALH8wABrzsAAsfzAAGvPwACx/MAAa9DAALH8wABr0cAAsfzAAGvSwACx/MAAa9PAALH8wABr1MAAsfzAAGvWwACx/MAAa9fAALH8wABr2MAAsfzAAGvZwACx/MAAa9rAALH8wABr28AAsfzAAGvcwACx/MAAa93AALH8wABr38AAsfzAAGvgwACx/MAAa+HAALH8wABr4sAAsfzAAGvjwACx/MAAa+rAALH7wABqicAAsfuFSsAAscma48AAsjCYEsAAsjGakMAAsjLAAGnUwACyMcAAadXAALIwmBDAALI1wABp1sAAsjWBbMAAsjVjwACyMJgTwACyOYFtwACyOcAAadfAALIwmBbAALI8AMAAscmazMAAsj6YEsAAsj/AAEeSwACyP8AASCrAALI/wABp2cAAsj/AAGnawACyP8AAadvAALI/wABp3MAAsj/AAGndwACyPpgTwACyR4GGwACyPpgQwACyScAAaeLAALJJwABp48AAsklPwACySZrQwACySZrOwACySYIPwACyScAAad7AALJJwABp38AAsknAAGngwACyPpgWwACyUwDAALHJwABp6cAAslWYEsAAslaakMAAslfAAEgVwACyVZgWwACyWQDAALHJwABp6sAAsluYEsAAslyakMAAsl3AAGnrwACyW5gWwACyXwDAALHJwABp7MAAsmGYE8AAsmLAAGntwACyYZgWwACyZADAALHJwABp7sAAsmaYEsAAsmeakMAAsmjAAGnvwACyaMAAafDAALJowABp8cAAsmjAAGnywACyaMAAafPAALJowABp9MAAsmaYEMAAsm+akMAAsnDAAGn2wACycMAAafjAALJwwABp+sAAsnDAAGn8wACycMAAaf3AALJmmBPAALJ2mpDAALJ3wABp+cAAsnfAAGn7wACyZpgWwACyegDAALHJwABp/sAAsnyYEsAAsn2akMAAsn7AAGn/wACyfsAAae/AALJ+wABp8MAAsn7AAGoAwACyfsAAagHAALJ+wABc5MAAsn7AAGoCwACyfsAAagPAALJ+wABqBMAAsn7AAGoFwACyfcAAad7AALJ9wABp4MAAsnyYE8AAsovAAGoGwACyi8AAad/AALKLgYbAALKLhAHAALKLsKjAALKLwABp5MAAsovAAGnnwACyi5qQwACyk8AAagvAALKTwABp+cAAspPAAGoMwACyk8AAag3AALKTwABqCsAAsou8UcAAsnyYFMAAsprAAGoGwACymsAAad/AALJ8mBDAALKdmpDAALKewABqDsAAsp7AAGoPwACynsAAahHAALKewABqE8AAsp7AAGoUwACynsAAahbAALKewABqF8AAsp7AAGoYwACynqsfwACynsAAaiHAALKewABpVMAAsp7AAGojwACynsAAahXAALKdT8AAsp2azsAAsp2CD8AAsp2a0MAAsnyYFsAAsrAAwACxycAAaifAALKymBPAALKzmpDAALK0wABqDcAAsrKYEMAAsraakMAAsrfAAGoYwACyt8AAahvAALK3wABqHcAAsrfAAGofwACyspgWwACyvADAALHJwABqKMAAsr6YEMAAsr+akMAAssDAAGobwACywMAAah3AALLAwABqH8AAsr6YFsAAssQAwACxycAAairAALLGmBLAALLHmpDAALLIwABZwMAAssaYE8AAssqakMAAssvAAGorwACyxpgQwACyzZqQwACyzsAAaizAALLOwABqFcAAss1PwACyzZrOwACyzYIPwACyxpgWwACy1ADAALHJwABqLsAAstaYEsAAsteTl8AAsteAoMAAstaYEMAAstqf48AAstaYFsAAstwAwACxycAAajDAALLemBLAALLfmpDAALLgwABjpcAAst6YEMAAsuIjwACy3pgWwACy5ADAALHJmvHAALLmmBbAALLnmpDAALLogKjAALHJA8AAsuqYEsAAsuuakMAAsuzAAGozwACy7MAAajTAALLqmBXAALLvAMAAsu/AAGo3wACy75kiwACy74CKwACy74LowACy78AAajnAALLqmBDAALL2wABqOsAAsvaBZcAAsvaDvMAAsvaakMAAsvrAAGpDwACy9sAAakTAALL2gTzAALL2gYLAALL2gY/AALL2wABqScAAsvbAAGpKwACxycAAak3AALMCmBLAALMDIsAAswOBQ8AAswKYEMAAswYjwACzApgWwACzCADAALHJmujAALMKmBXAALMLAMAAswuZIsAAswqYE8AAsw6BbcAAsw7AAGnXwACzCpgQwACzEcAAadbAALMRgWzAALHJwABqT8AAsxSYEsAAsxWBbcAAsxSYEMAAsxfAAGnWwACzF4FswACzF5qQwACzGsAAakDAALMUmBPAALMcwABp18AAsxSYFsAAsx4AwACxycAAalHAALMgmBDAALMhwABp1sAAsyGakMAAsyPAAGpAwACzIJgWwACzJQDAALHJwABqUsAAsyeYEMAAsyjAAGnWwACzKJqQwACzKsAAakDAALMnmBbAALMsAMAAscnAAGpTwACzLpgSwACzL8AAVBbAALMvwABqVMAAsy/AAGpVwACzL8AAalbAALMvwABqV8AAsy/AAGpYwACzL8AAalnAALMvwABqWsAAsy/AAGpbwACzL8AAalzAALMvmpDAALM6wABqXcAAsy+BEMAAsy+B4sAAsy+ZM8AAsy/AAGocwACzLpgTwACzQJqQwACzQcAAal7AALNBwABqY8AAs0HAAGpkwACzQcAAamXAALNBwABqZsAAs0DAAGpfwACzQMAAamDAALNAwABqYcAAs0DAAGpiwACzQMAAamfAALMumBDAALNMwABqaMAAs0zAAGpqwACzTMAAaj3AALNMwABqbMAAsy6YFsAAs1GBPMAAs1GBgsAAs1GBj8AAscmqGcAAs1WYEsAAs1aakMAAs1fAAGptwACzV8AAam7AALNXwABqb8AAs1fAAGpwwACzV8AAanHAALNXwABqcsAAs1fAAFzkwACzV8AAal7AALNXwABqc8AAs1WYE8AAs2GakMAAs2LAAGolwACzYsAAanjAALNiwABqecAAs2LAAGp6wACzYsAAanvAALNiwABqfMAAs2LAAGqEwACzYsAAaoXAALNVmBDAALNrmpDAALNswABqfcAAs2zAAGqAwACzbMAAaoLAALNswABqg8AAs2zAAGp2wACzbMAAaobAALNswABqh8AAs2zAAGqIwACzbMAAag/AALNswABqisAAs2zAAGqNwACzbMAAaozAALNswABqjsAAs2zAAGqPwACzbMAAajbAALNswABqQcAAs2zAAGpAwACzbMAAaibAALNswABqkMAAs2zAAGo4wACzbMAAapHAALNrgTzAALNrgYLAALNrgY/AALNrwABqScAAs2vAAGpKwACzVZgWwACzhwDAALOHwABqdMAAs4fAAGp1wACzh8AAanfAALOHgIrAALHJwABqn8AAs42YEsAAs46ZM8AAs46DZsAAs42YFsAAs5EAwACxycAAaqDAALOTmBDAALOUmpDAALOVwABqocAAs5OYFsAAs5cAwACxyZqRwACzmZgSwACzmpqQwACzm5MywACzmZgVwACznZU0wACzncAAaqPAALOdwABqpcAAs53AAGqmwACzncAAaqfAALOdwABqrMAAs5mYEMAAs6TAAGquwACzpMAAaq/AALOkgYrAALOkgSfAALOkgJ/AALOkwABqsMAAs6TAAGqxwACzpMAAaj3AALOkkyLAALOkwABqs8AAs6SBh8AAs6STKsAAs6SDEsAAs6RRwACzpILQwACzpIO8wACzpJMewACzpIFlwACzpJMgwACzpIChwACzpJHiwACzpMAAarjAALOkky7AALOkky/AALOkkxfAALOkky3AALOkwABqu8AAs6STI8AAs6STKcAAs6STLMAAs6STIcAAs6TAAGpKwACzmZgTwACzxcAAae3AALPFWsAAs8WA/MAAs8WC0sAAs8WBecAAs8WAtsAAs5mYFsAAs8wAwACzzJqQwACzzpXpwACxycAAasLAALPQmBDAALPRmxvAALPRwABp9cAAs9GBfMAAs9GDP8AAs9GBjMAAs9GBlcAAs9HAAGq6wACz0JgTwACz2cAAaeTAALPQmBbAALPbAMAAscmfTcAAs92YEMAAs95PwACz3prOwACz3oIPwACz3ZgWwACz4gDAALHJwABqxsAAs+SYEsAAs+WakMAAs+bAAGrHwACz5JgTwACz6MAAae3AALPkmBDAALPqwABqr8AAs+qBisAAs+SYFsAAs+0AwACxycAAasjAALPvmBDAALPwmtDAALPwgg/AALPvmBbAALPzAMAAscnAAGrJwACz9ZgQwACz9oIPwACz9ZgTwACz+LxRwACz9ZgWwACz+gDAALHJwABqysAAs/yYEsAAs/2akMAAs/6TMsAAs/yYFcAAtAAAwAC0AMAAaszAALQAwABqzcAAs/yYEMAAtATAAGquwAC0BJ0+wAC0BJMgwACxycAAatXAALQImBDAALQJkyDAALQImBbAALQLAMAAscmqG8AAtA2YFcAAtA4AwAC0DZgQwAC0EFbAALQQmxvAALQNmBPAALQTV8AAscnAAGrWwAC0FZgSwAC0FpqQwAC0F5a0wAC0FZgQwAC0GU/AALQZms7AALQZgg/AALQVmBbAALQdAMAAscnAAGrXwAC0H5gTwAC0IIGGwAC0IMAAad7AALQgwABqBsAAtCDAAGnfwAC0IMAAaeDAALQghAHAALQgsKjAALQgwABp5MAAtCDAAGnnwAC0H5gVwAC0KgDAALQqwABq2MAAtB+YFMAAtC3AAGnewAC0LcAAagbAALQtwABp38AAtC3AAGngwAC0H5gQwAC0Mk/AALQyms7AALQygg/AALQymtDAALHJwABq28AAtDeYEMAAtDhPwAC0OJrOwAC0OIIPwAC0N5gWwAC0PADAALHJwABq3MAAtD6YEMAAtD+akMAAtEDAAGoTwAC0QMAAahbAALRAwABqF8AAtEDAAGoUwAC0PpgWwAC0RQDAALHJwABq3cAAtEeYFsAAtEgAwACxycAAat7AALRKmBLAALRLmpDAALRMwABp/8AAtEzAAGrfwAC0TMAAauDAALRMwABq4cAAtEzAAGoAwAC0TMAAagHAALRMwABq4sAAtEzAAFzkwAC0TMAAagXAALRLwABp3sAAtEvAAGoGwAC0S8AAad/AALRLwABp4MAAtEqYE8AAtFqBhsAAtFqEAcAAtFqakMAAtF3AAGrjwAC0XcAAauTAALRdwABqDMAAtF3AAGoNwAC0XcAAaubAALRdmxnAALRawABp58AAtFqwqMAAtFrAAGnkwAC0WrxRwAC0SpgQwAC0aJqQwAC0acAAaujAALRpwABq6cAAtGnAAGoOwAC0acAAaqTAALRpqx/AALRpwABqIcAAtGnAAGlUwAC0acAAahPAALRpwABqFMAAtGnAAGoWwAC0acAAahfAALRomtDAALRoT8AAtGiazsAAtGiCD8AAtEqYFsAAtHkAwACxycAAavDAALR7mBPAALR8mpDAALR9wABc5MAAtHuYFMAAtH+akMAAtIDAAFzkwAC0e5gQwAC0gpqQwAC0g8AAahvAALSDwABqHcAAtIPAAGofwAC0e5gWwAC0hwDAALHJwABq8cAAtImYEMAAtIqakMAAtIvAAGobwAC0i8AAah3AALSLwABqH8AAtImYFsAAtI8AwACxycAAavLAALSRmBbAALSSAMAAtJGYEMAAtJSakMAAtJXAAGobwAC0lcAAah3AALSVwABqH8AAscnAAGrzwAC0mZgWwAC0mgDAALSZmBPAALScmpDAALSdwABc5MAAtJmYFMAAtJ+akMAAtKDAAFzkwAC0mZgQwAC0opqQwAC0o8AAahvAALSjwABqHcAAtKPAAGofwACxyaoawAC0p5gSwAC0qJqQwAC0qcAAahLAALSnmBDAALSrmpDAALSswABq9MAAtKtBwAC0p5gTwAC0r4OJwAC0p5gWwAC0sQDAALHJwABq9cAAtLOYEsAAtLSakMAAtLXAAGoSwAC0s5gQwAC0t5qQwAC0uMAAavbAALS4wABp/MAAtLjAAGn9wAC0s5gWwAC0vADAALHJwABq98AAtL6YEsAAtL+akMAAtMCEtMAAtL6YEMAAtMJPwAC0wprOwAC0woIPwAC0wprQwAC0vpgTwAC0x7xRwAC0vpgWwAC0yQDAALHJwABq+MAAtMuYEsAAtMzAAGogwAC0zMAAavnAALTLmBDAALTPwABq+sAAtM+BjMAAtM+BlcAAtM+bG8AAtM/AAGnWwAC0y5gWwAC01QDAALHJwABq+8AAtNeYEsAAtNjAAGrnwAC015gWwAC02gDAALHJwABq/MAAtNyYEMAAtN2akMAAtN6rH8AAtN7AAGohwAC03sAAaVTAALTcmBbAALTiAMAAscnAAGr9wAC05JgQwAC05ZqQwAC05sAAahvAALTmwABqHcAAtObAAGofwAC05JgWwAC06gDAALHJwABq/sAAtOyYEsAAtO2akMAAtO7AAGr/wAC07sAAagDAALTuwABrAMAAtO7AAGrgwAC07sAAawHAALTuwABrAsAAtO7AAGsDwAC07sAAawTAALTuwABrBcAAtO7AAGpkwAC07sAAawbAALTuwABqXsAAtO7AAFzkwAC07sAAawfAALTuwABZwMAAtOyYEMAAtP6akMAAtP/AAGruwAC0/8AAaxPAALT/wABrEcAAtP+rH8AAtP/AAGohwAC0/8AAaVTAALT/wABp/MAAtP/AAGn9wAC0/8AAavbAALT/wABqKcAAtP/AAGobwAC0/8AAah3AALT/wABqH8AAtP/AAGrvwAC0/8AAaxnAALT+wABp9cAAtP6BfMAAtP6DP8AAtP6BjMAAtP6BlcAAtP6bG8AAtP7AAGq6wAC07JgTwAC1FpqQwAC1F8AAauXAALUXwABohMAAtRfAAGrjwAC1F8AAaxXAALUXwABrEMAAtRfAAGorwAC1F8AAaw3AALUXwABrFsAAtRfAAGsSwAC1F8AAaxfAALUWwABp5MAAtOyYFsAAtSMAwACxycAAax/AALUlmBLAALUmmpDAALUnwABqbcAAtSfAAGnhwAC1JZgQwAC1KoGKwAC1KpqQwAC1LMAAavTAALUswABrIMAAtSWYFsAAtS8AwACxycAAayHAALUxmBLAALUympDAALUzwABZwMAAtTPAAGsiwAC1MZgQwAC1NpqQwAC1N8AAavTAALUxmBbAALU5AMAAscnAAGsjwAC1O5gSwAC1PJqQwAC1PcAAayTAALU7mBPAALU/gPzAALU7mBDAALVBwABqLcAAtUGB0MAAtTuYFsAAtUQAwACxycAAayfAALVGmBLAALVHg2bAALVGmBDAALVJwABrKMAAtUaYFsAAtUsAwACxycAAaynAALVNmBLAALVOgIrAALVNmBDAALVQwABrKMAAtU2YFsAAtVIAwACxycAAayrAALVUmBLAALVVgujAALVVldTAALVUmBDAALVYwABrKMAAtVSYFsAAtVoAwACxycAAayvAALVcmBDAALVdwABrKMAAtVyYE8AAtV+DZsAAtVyYFMAAtWGDZsAAtVyYFsAAtWMAwACxycAAay3AALVlmBLAALVmmpDAALVnwABrLsAAtWfAAGsvwAC1Z8AAauDAALVnwABc5MAAtWWYE8AAtWyA/MAAtWzAAGnbwAC1bJqQwAC1b8AAazDAALVlmBDAALVxwABrCMAAtXHAAGsPwAC1ccAAai3AALVxgdDAALVlmBbAALV2AMAAscnAAGsxwAC1eJgSwAC1ecAAazLAALV5wABrM8AAtXiYE8AAtXyA/MAAtXiYEMAAtX5PwAC1fsAAai3AALV+gdDAALV4mBbAALWCAMAAscnAAGs0wAC1hJgSwAC1hZqQwAC1hsAAazXAALWGwABrNsAAtYbAAGs3wAC1hsAAal7AALWGwABc5MAAtYbAAGsGwAC1hJgTwAC1jZqQwAC1jsAAaznAALWOwABrOsAAtY3AAGnkwAC1hJgQwAC1kpqQwAC1k8AAazjAALWTwABqH8AAtZLAAGn1wAC1koF8wAC1koM/wAC1koGMwAC1koGVwAC1kpsbwAC1ksAAarrAALWEmBbAALWdAMAAscnAAGs7wAC1n5gSwAC1oJqQwAC1obErwAC1ocAAazzAALWhwABrPcAAtaHAAGpewAC1ocAAahLAALWhmxnAALWfmBPAALWowABp7cAAtaiakMAAtarAAGtCwAC1n5gQwAC1rIGKwAC1rJqQwAC1rsAAavbAALWuwABrIMAAta7AAGs/wAC1rsAAa0DAALWuwABrQcAAtZ+YFsAAtbQAwACxycAAa0PAALW2mBLAALW3mpDAALW4wABqx8AAtbaYEMAAtbrAAGn1wAC1uoF8wAC1uoM/wAC1uoGMwAC1uoGVwAC1upsbwAC1usAAarrAALW2mBPAALXCwABp5MAAtbaYFsAAtcQAwACxyZsYwAC1xpgSwAC1x5qQwAC1yJsZwAC1yMAAa0XAALXIwABrDcAAtcaYE8AAtcxXwAC1xpgQwAC1zlbAALXOmpDAALXQwABrR8AAtdDAAGsFwAC10MAAamTAALXQwABrBsAAtc6bG8AAtcaYFsAAtdYAwACxycAAa0rAALXYmBPAALXZwABp7cAAtdiYEMAAtduBisAAtdiYFsAAtd0AwACxycAAa0vAALXfmBLAALXgmpDAALXhsSvAALXfmBPAALXjwABp7cAAtd+YEMAAteWBisAAteWakMAAtefAAGr0wAC158AAa0zAALXnwABrTcAAtefAAGtOwAC135gWwAC17ADAALHJwABrT8AAte6YEsAAte+akMAAtfDAAGrHwAC18JsZwAC17pgQwAC185qQwAC19KsfwAC19MAAaiHAALX0wABp/MAAtfTAAGn9wAC19MAAavbAALX0wABrTMAAtfTAAGtNwAC19MAAa07AALXumBbAALX9AMAAscnAAGtQwAC1/5gSwAC2AJqQwAC2AcAAa1HAALX/mBDAALYDmpDAALYEwABrTMAAtf+YFsAAtgYAwACxycAAa1PAALYImBLAALYJmpDAALYKwABrVMAAtgiYEMAAtgyakMAAtg3AAGtMwAC2CJgWwAC2DwDAALHJwABrVsAAthGYEsAAthKakMAAthPAAGtXwAC2EZgQwAC2FZqQwAC2FsAAa0zAALYRmBbAALYYAMAAscnAAGtYwAC2GpgSwAC2G5qQwAC2HMAAa1TAALYcwABrUcAAthqYEMAAth+akMAAtiDAAGtNwAC2GpgWwAC2IgDAALHJwABrWcAAtiSYEsAAtiWakMAAtiai/MAAtiSYEMAAtiiakMAAtinAAGr0wAC2KcAAa0zAALYkmBbAALYsAMAAscnAAGtawAC2LpgSwAC2L5qQwAC2MMAAa1vAALYumBPAALYympDAALYzwABrXMAAtjOi/MAAtjOT8MAAti6YFMAAtjeakMAAtjjAAGtcwAC2OKL8wAC2OJPwwAC2LpgWwAC2PADAALHJwABrXcAAtj6YEsAAtj+akMAAtkDAAGtRwAC2PpgQwAC2QpqQwAC2Q8AAa0zAALY+mBbAALZFAMAAscnAAGtewAC2R5gSwAC2SJqQwAC2SaL8wAC2R5gQwAC2S5qQwAC2TMAAavTAALZMwABrTMAAtkeYFsAAtk8AwACxycAAa1/AALZRmBLAALZSmpDAALZTwABrUcAAtlGYEMAAtlWakMAAtlbAAGr0wAC2VsAAa0zAALZRmBbAALZZAMAAscnAAGthwAC2W5gSwAC2XJqQwAC2XcAAa2LAALZds/zAALZbmBDAALZgmpDAALZhwABq9MAAtmHAAGtMwAC2W5gWwAC2ZADAALHJwABrZcAAtmaYEsAAtmeakMAAtmiWtMAAtmaYEMAAtmpPwAC2aprOwAC2aoIPwAC2ZpgWwAC2bgDAALHJwABrZsAAtnCYEsAAtnGakMAAtnLAAGtnwAC2cpsZwAC2cJgTwAC2dZqQwAC2dsAAa2rAALZwmBDAALZ4mpDAALZ5qx/AALZ5wABqIcAAtnnAAGlUwAC2ecAAafzAALZ5wABp/cAAtnnAAGr2wAC2ecAAa0zAALZ5wABrTcAAtnnAAGtOwAC2cJgWwAC2gwDAALHJwABrbMAAtoWYEsAAtoaakMAAtofAAGttwAC2hZgQwAC2iZ0+wAC2hZgWwAC2iwDAALHJwABrbsAAto2YEsAAto6akMAAto/AAGttwAC2j8AAasfAALaNmBPAALaSwABp7cAAto2YEMAAtpSBisAAto2YFsAAtpYAwACxycAAa2/AALaYmBLAALaZmpDAALaawABrTMAAtprAAGtNwAC2msAAa07AALaalrTAALaYmBPAALafmpDAALagwABohMAAtpiYEMAAtqJPwAC2oprOwAC2ooIPwAC2mJgWwAC2pgDAALHJwABrcsAAtqiYEMAAtqmdPsAAtqiYFsAAtqsAwACxycAAa3TAALatmBLAALaumpDAALavwABrdcAAtq2YEMAAtrGdPsAAtq2YFsAAtrMAwACxycAAa3bAALa1mBLAALa2mpDAALa3wABrIMAAtrWYEMAAtrmdPsAAtrWYFsAAtrsAwACxycAAa3fAALa9mBLAALa+mpDAALa/wABrIMAAtr/AAGrHwAC2vZgQwAC2woGKwAC2vZgWwAC2xADAALHJwABreMAAtsaYFcAAtscAwAC2x8AAaqfAALbGmBDAALbKgiPAALbKmxvAALbKmpDAALbNwABrfcAAts3AAGt/wAC2xpgTwAC20MAAa3zAALbQhVnAALHJwABrgMAAttOYEsAAttSC6MAAttSV1MAAttOYEMAAttcjwAC205gTwAC22Zp/wAC22sAAa4HAALbTmBTAALbcmn/AALbdwABrgcAAttOYFsAAtt8AwACxycAAa4PAALbhmBLAALbin3fAALbikk/AALbhmBbAALblAMAAscmfXcAAtueYEsAAtuiakMAAtumTMsAAtueYFcAAtusAwAC265MWwAC255gTwAC27sAAapPAALbugiPAALbun3PAALbun3XAALbuwABqgcAAtu7AAGp/wAC27sAAawnAALbuwABqHMAAtu7AAGqJwAC27sAAar7AALbuwABresAAtu7AAElBwAC27sAAa4TAALHJwABrhcAAtvyYEsAAtv3AAGqTwAC2/YIjwAC2/Z9zwAC2/Z91wAC2/cAAaoHAALb9wABqf8AAtv3AAGsJwAC2/cAAahzAALb9wABqicAAtv3AAGq+wAC2/cAAa3rAALb9wABJQcAAtv3AAGuEwAC2/JgWwAC3CwDAALHJn1zAALcNmBDAALcOwABqk8AAtw6CI8AAtw6fc8AAtw6fdcAAtw7AAGqBwAC3DsAAan/AALcOwABrCcAAtw7AAGocwAC3DsAAaonAALcOwABqvsAAtw7AAGt6wAC3DsAASUHAALcOwABrhMAAtw2YFsAAtxwAwACxyYVJwAC3HpgSwAC3H4T0wAC3H5qQwAC3IYVywAC3HpgTwAC3I1fAALcjklHAALcjwABrhsAAtx6YEMAAtyfAAGqTwAC3J8AAapbAALcnwABrhMAAtyeCI8AAtyefc8AAtyefdcAAtyfAAGsdwAC3J8AAasHAALcnwABrG8AAtyfAAGqBwAC3J8AAan/AALcnwABrCcAAtyfAAGuKwAC3J8AAa4vAALcnwABrjMAAtyfAAGt5wAC3J8AAakfAALcnwABrjcAAtyfAAGocwAC3J8AAaonAALcnwABqvsAAtyfAAGt6wAC3J8AASUHAALcnmpDAALc/wABrjsAAtz/AAGuPwAC3J0TAALcemBbAALdDmpDAALdEgKjAALHJwABrkMAAt0aYEsAAt0eakMAAt0jAAGuRwAC3RpgQwAC3SsAAapPAALdKgiPAALdKn3PAALdKn3XAALdKwABqgcAAt0rAAGp/wAC3SsAAawnAALdKwABqHMAAt0rAAGqJwAC3SsAAar7AALdKwABresAAt0rAAElBwAC3SsAAa4TAALdGmBbAALdYAMAAscnAAGucwAC3WpgTwAC3W5qQwAC3XJ9ywAC3XJ90wAC3XJ92wAC3XMAAa5XAALdcwABrlsAAt1zAAGuXwAC3XMAAa5jAALdcwABrmcAAt1zAAGt9wAC3XMAAa3/AALdcwABrmsAAt1zAAGubwAC3XMAAa5PAALdcp4TAALdcpHPAALdbklHAALdamBDAALdtwABqlsAAt1qYFsAAt28AwACxycAAa53AALdxmBLAALdympDAALdzn3LAALdzn3TAALdzn3bAALdzwABrlcAAt3PAAGuWwAC3c8AAa5fAALdzwABrmMAAt3PAAGuZwAC3c8AAa33AALdzwABrf8AAt3PAAGuawAC3c8AAa5vAALdzwABrk8AAt3PAAGuewAC3c6RzwAC3cpJRwAC3cZgTwAC3hJqQwAC3haeEwAC3hMAAa4bAALdxmBDAALeIwABrHcAAt4jAAGrBwAC3iMAAaxvAALeIwABrisAAt4jAAGuLwAC3iMAAa4zAALeIwABrecAAt4jAAGpHwAC3iMAAa43AALeIRMAAt4jAAGqTwAC3iMAAa4TAALeIgiPAALeIn3PAALeIn3XAALeIwABqgcAAt4jAAGp/wAC3iMAAawnAALeIwABqHMAAt4jAAGqJwAC3iMAAar7AALeIwABresAAt4jAAElBwAC3cZgWwAC3oADAALHJwABrosAAt6KYEsAAt6OakMAAt6TAAGujwAC3pMAAa6TAALeimBPAALenmpDAALeon3LAALeon3TAALeon3bAALeowABrlcAAt6jAAGuWwAC3qMAAa5fAALeowABrmMAAt6jAAGuZwAC3qMAAa33AALeowABrf8AAt6jAAGuawAC3qMAAa5vAALeowABrk8AAt6ikc8AAt6inhMAAt6eSUcAAt6fAAGuGwAC3opgQwAC3usAAax3AALe6wABqwcAAt7rAAGsbwAC3usAAa4rAALe6wABri8AAt7rAAGuMwAC3usAAa3nAALe6wABqR8AAt7rAAGuNwAC3ukTAALe6wABqk8AAt7rAAGuEwAC3uoIjwAC3up9zwAC3up91wAC3usAAaoHAALe6wABqf8AAt7rAAGsJwAC3usAAahzAALe6wABqicAAt7rAAGq+wAC3usAAa3rAALe6wABJQcAAt6KYFsAAt9IAAJ2AwAC31JgRwAC31cAAabzAALfVwABr+cAAt9XAAGm5wAC31JgSwAC32Z2AwAC32sAAbPXAALfawABkbsAAt9SY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gp2AwAC5g5X/wAC5g7P8wAC5g8AAbEvAALmDwABsVMAAuYPAAGxVwAC5g8AAbFfAALmDwABsWcAAuYPAAGxbwAC5g8AAbF7AALmCgdDAALmCgLLAALmCmJDAALmCk+DAALmCgd3AALmCRMAAuYK9FcAAuYKDvMAAuX+YE8AAuZWdgMAAuZbAAGxKwAC5lVrAALmVgPzAALmVg2jAALmVgdzAALmVKcAAt9TAAGxnwAC5nZgWwAC5ngDAALmdmBLAALmgnYDAALmhwABsOcAAuaHAAGw6wAC5ocAAbDvAALmhwABsPMAAuZ2YEMAAuaadgMAAuafAAGw9wAC5p8AAbEDAALmnwABsRMAAuafAAGxGwAC5p8AAbEfAALmnwABsScAAuafAAGxLwAC5nZgTwAC5r52AwAC5sMAAbErAALmvWsAAt9TAAGxowAC5s5gWwAC5tADAALmzmBDAALm2nYDAALm3lf/AALm3s/zAALfUwABsacAAubqYFsAAubsAwAC31MAAbGrAALm9mBbAALm+AMAAub2YE8AAucCB3MAAucCVjcAAucBawAC5wID8wAC5wINowAC5wCnAALm9mBDAALnHRMAAuceAssAAuceT4MAAuceB0MAAuceTIMAAuceDvMAAuceAmcAAuce9FcAAuceYkMAAucemxcAAuce9GsAAuceAn8AAuce9F8AAuceT4sAAuceB3cAAuccjwAC31MAAbGvAALnYmBbAALnZAMAAudiYEMAAududgMAAudyV/8AAudyz/MAAudzAAGxLwAC53MAAbFTAALncwABsVcAAudzAAGxXwAC53MAAbFnAALncwABsW8AAudzAAGxewAC524HQwAC524CywAC525iQwAC525PgwAC524HdwAC520TAALnbvRXAALnbg7zAALnYmBPAALnunYDAALnvwABsSsAAue5awAC57oD8wAC57oNowAC57oHcwAC57inAALfUwABsbMAAufaYFsAAufcAwAC59pgSwAC5+Z2AwAC5+sAAbDnAALn6wABsOsAAufrAAGw7wAC5+sAAbDzAALn2mBDAALn/nYDAALoAwABsPcAAugDAAGxAwAC6AMAAbETAALoAwABsRsAAugDAAGxHwAC6AMAAbEnAALoAwABsS8AAufaYE8AAugidgMAAugnAAGxKwAC6CFrAALfUwABsbcAAugyYEsAAug2dgMAAug7AAGwgwAC6DsAAbCHAALoOwABsCsAAugyYEMAAuhKdgMAAuhOV/8AAuhOz/MAAuhKB3cAAuhJEwAC6EpPgwAC6DJgWwAC6GQDAALfUwABsbsAAuhuYEsAAuhydgMAAuh3AAGTxwAC6Ha5rwAC6HcAAbG/AALoduW7AALodwABscMAAuhuYE8AAuiNVwAC6I1rAALojgPzAALojg2jAALobmBbAALooAMAAt9TAAGxxwAC6KpgSwAC6K52AwAC6LMAAZPHAALosrmvAALoswABsb8AAuiy5bsAAuizAAGxwwAC6LMAAbErAALorV8AAuiqYEMAAujRWwAC6KpgWwAC6NgDAALfUwABscsAAujiYFsAAujkAwAC6OJgSwAC6O52AwAC6PMAAbDnAALo8wABsOsAAujzAAGw7wAC6PMAAbDzAALo4mBDAALpBnYDAALpCwABsPcAAukLAAGxAwAC6QsAAbETAALpCwABsRsAAukLAAGxHwAC6QsAAbEnAALpCwABsS8AAujiYE8AAukqdgMAAukvAAGxKwAC6SlrAALfUwABsc8AAuk6YFsAAuk8AwAC6TpgQwAC6UZ2AwAC6UpX/wAC6UrP8wAC31MAAbHTAALpVmBbAALpWAMAAulWYEMAAulhPwAC6WILQwAC6WJPfwAC6WJPgwAC6WJHiwAC6WJMgwAC6WJMnwAC6WJMwwAC6WIHQwAC6WICZwAC6WJPhwAC6WJPkwAC6WJPiwAC6WJPlwAC6WIPGwAC6WJPmwAC6WJPnwAC6WJPowAC6WIChwAC6WICfwAC6WCPAALpYgSfAALpYkyLAALpYg7zAALpYkyrAALpYgxLAALpYkx7AALpYUcAAuliBZcAAuliTLsAAuliTL8AAuliTF8AAuliTLcAAuliTI8AAuliTKcAAuliTLMAAuliTIcAAulWYE8AAun5VwAC6flrAALp+gPzAALp+g2jAALp+gLbAALp+gtLAALp+gXnAALfUwABsd8AAuoaYEMAAuoedgMAAuojAAGwXwAC6iMAAbFTAALqIwABsVcAAuojAAGx4wAC6iMAAbFfAALqHkyDAALqHgdDAALqHT8AAuoeT38AAuoeC0MAAuoeT4MAAuoeR4sAAuoaYE8AAupVawAC6lYLSwAC6lYF5wAC6lVXAALqGmBbAALqaAMAAt9TAAGx5wAC6nJgWwAC6nQDAALqcmBDAALqfnYDAALqglf/AALqgs/zAALfUwABsesAAuqOYEMAAuqSR4sAAuqSdgMAAuqbAAGwXwAC6pJMgwAC6o5gWwAC6qQDAALfUwABse8AAuquYEsAAuqydgMAAuq3AAGwgwAC6rcAAbCHAALqtwABsCsAAuquYEMAAurGdgMAAurKV/8AAurKz/MAAurGC0MAAurGT38AAurGT4MAAurGTIMAAurGR4sAAuquYFsAAuroAwAC31MAAZRHAALq8mBLAALq9nYDAALq+sSvAALq8mBDAALrAkyDAALrARMAAuryYE8AAusNawAC6vJgWwAC6xQDAALfUwABI28AAuseYEMAAusidgMAAusnAAGwIwAC6x5gVwAC6ywDAALrLvqXAALrLkxbAALrLmajAALrLwABqpsAAusvAAGx8wAC6y8AAbH3AALfUwABsfsAAutOYFcAAutQAwAC61L6lwAC61JMWwAC61JmowAC605gTwAC62VXAALfUwABdlcAAutuYEMAAutyTIMAAutyAn8AAutyBJ8AAutyTMMAAutyTIsAAutyTJ8AAutyC0MAAutyDvMAAutyTKsAAutyDEsAAutyTHsAAutxRwAC63IFlwAC63IChwAC63JHiwAC63JMuwAC63JMvwAC63JMXwAC63JMtwAC63JMjwAC63JMpwAC63JMswAC63JMhwAC63CPAALrbmBPAALr1WsAAuvWA/MAAuvWDaMAAuvWC0sAAuvWBecAAuvWAtsAAutuYFsAAuvwAwAC31JM1wAC6/pgQwAC6/8AAbH/AALr/wABsg8AAuv6YFsAAuwIAwAC31MAAbITAALsEmBLAALsFnYDAALsGwABshcAAuwbAAGyGwAC7BsAAbIfAALsGwABrJMAAuwbAAFzkwAC7BJgTwAC7DMAAZKnAALsEmBDAALsOg2bAALsOnYDAALsQwABsiMAAuwSYFsAAuxIAwAC31KoFwAC7FJgVwAC7FQDAALsVvqXAALsVkxbAALsVmajAALsVwABqpsAAuxXAAGx8wAC7FcAAbH3AALfUqgvAALsdmBXAALseAMAAux6+pcAAux6TFsAAux6ZqMAAux2YEMAAuyODvMAAux2YE8AAuyVVwAC31MAAbIrAALsnmBLAALsonYDAALsp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YsAAv3bAAG1UwAC/dsAAbVXAAL92nKbAAL92wABtVsAAv3bAAG1XwAC/dsAAbVjAAL92wABtWcAAv3bAAG1awAC/dsAAbVvAAL92wABtXMAAv3bAAG1dwAC/dsAAbV7AAL92wABtX8AAv3bAAG1gwAC/dsAAWlfAAL92wABaWMAAv3bAAG1hwAC/dsAAbWLAAL92wABtY8AAv3bAAG1kwAC/dsAAbWXAAL92wABtZsAAv3bAAG1nwAC/dsAAbWjAAL92wABtacAAv3bAAG1qwAC/dsAAbWvAAL92wABtbMAAv3bAAG1twAC/dsAAbW7AAL92wABtb8AAv3bAAG1wwAC/dsAAbXHAAL92wABtcsAAv3bAAG1zwAC/dsAAbXTAAL92wABtdcAAv3bAAG12wAC/dsAAbXfAAL92wABteMAAv3bAAG15wAC/dsAAbXrAAL92wABte8AAv3aj18AAv3aB4sAAv3bAAF1uwAC/dsAAbXzAAL92ghLAAL91mBDAAL/NwABtfcAAv83AAG1+wAC/zYIPwAC/zcAAbYPAAL/NwABthMAAv83AAG2FwAC/zcAAbYbAAL/NwABth8AAv83AAG2IwAC/zcAAWQjAAL/NwABtMsAAv83AAG0zwAC/zcAAbYrAAL/NwABtjMAAv83AAG2LwAC/zcAAbY3AAL/NwABtksAAv82CxcAAv83AAG2bwAC/zcAAbZrAAL/NwABtmcAAv83AAG2dwAC/zcAAbZjAAL/NwABtocAAv83AAG2RwAC/zcAAbY/AAL/NwABtkMAAv83AAG2nwAC/zcAAbajAAL/NwABtjsAAv83AAG2BwAC/zcAAbZzAAL/NgVTAAL91mBPAAL/vgRDAAL/vwABtHMAAv+/AAFeRwAC/dZgUwAC/88AAV5HAAL91mBbAAL/1AMAAvwDAAG21wAC/95gSwAC/+MAAV5HAAL/4wABtHMAAv/eYEMAAv/vAAG2DwAC/+8AAWQjAAL/7wABthcAAv/vAAG2HwAC/+8AAbYbAAL/7wABtiMAAv/vAAG2EwAC/+8AAbTPAAL/3mBbAAMAEAMAAvwDAAG22wADABpgSwADAB8AAjRvAAMAIwABtt8AAwAjAAG0awADACJa0wADABpgQwADADMAAjRvAAMANwABtuMAAwAzAAGiGwADADE/AAMAMgg/AAMAMwABpV8AA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JADAAL8AwABuocAAwiaYEsAAwifAAI0bwADCKMAAbRrAAMImmBDAAMIqhXXAAMIqq+jAAMIqnT7AAMImmBbAAMIuAMAAvwDAAG6iwADCMJgSwADCMcAAbqPAAMIxwABupMAAwjHAAG6lwADCMcAAbqbAAMIxwABup8AAwjG3bsAAwjHAAG6owADCMcAAbqnAAMIxwABuqsAAwjHAAG6rwADCMcAAbqzAAMIxwABurcAAwjHAAG6uwADCMcAAbq/AAMIxwACNG8AAwkDAAG6wwADCQMAAbo/AAMIwmBPAAMJDwACNG8AAwkTAAG6xwADCMJgQwADCRoFLwADCRsAAbrPAAMJGg9bAAMJGwAButMAAwkaTBMAAwkbAAG61wADCRsAAjRvAAMJNwAButsAAwk3AAG63wADCRsAAbrjAAMJGwABuucAAwkaE+MAAwkbAAG67wADCMJgWwADCVADAAL8AwABuwMAAwlaYEsAAwlfAAI0bwADCWIOewADCVpgQwADCWpkGwADCWoT4wADCWsAAbrvAAMJWmBbAAMJeAMAAvwDAAG7CwADCYJgSwADCYcAAjRvAAMJilrTAAMJgmBDAAMJkskfAAMJkg/HAAMJkwAButMAAwmSBS8AAwmTAAG6zwADCZIPWwADCYJgTwADCa8AAjRvAAMJswABuscAAwmCYFsAAwm4AwAC/AMAAbsPAAMJwmBbAAMJxAMAAwnCYEsAAwnPAAI0bwADCdIOewADCcJgQwADCdpkGwADCdoT4wADCdsAAbrvAAL8AwABuxMAAwnqYEsAAwnvAAI0bwADCfMAAbpbAAMJ6mBDAAMJ+mQbAAMJ6mBbAAMKAAMAAvwDAAG7FwADCgpgSwADCg8AAbpjAAMKDwABumsAAwoOCEsAAwoMnwADCgpgQwADCiLJHwADCiIQHwADCiMAAbrTAAMKIwABuxsAAwoiBS8AAwojAAG6zwADCiIPWwADCiMAAbsjAAMKIwABux8AAwoiWYMAAwoKYE8AAwpPAAI0bwADClMAAbrHAAMKCmBbAAMKWAMAAvwDAAG7JwADCmJgWwADCmQDAAMKYmBLAAMKbwACNG8AAwpyDnsAAwpiYEMAAwp6ZBsAAwp6E+MAAwp7AAG67wAC/AMAAbsrAAMKimBLAAMKjo5bAAMKimBDAAMKlmQbAAMKimBbAAMKnAMAA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wADEuZgWwADEugDAAMSQwABv5cAAxLyYFsAAxL0AwADEkMAAb+bAAMS/mBbAAMTAAMAAxJDAAG/nwADEwpgWwADEwwDAAMSQwABv6MAAxMWYFsAAxMYAwADEkMAAb+nAAMTImBbAAMTJAMAAxJDAAG/qwADEy5gWwADEzADAAMSQwABv68AAxM6YFsAAxM8AwADEkMAAVPrAAMTRmBbAAMTSAMAAxJDAAG/swADE1JgWwADE1QDAAMSQwABv7cAAxNeYFsAAxNgAwADEkMAAb+7AAMTamBbAAMTbAMAAxJDAAG/vwADE3ZgWwADE3gDAAMSQwABv8MAAxOCYFsAAxOEAwADEkMAAb/HAAMTjmBDAAMTkwABv8sAAxOST38AAxOTAAG/2wADE5EHAAMTjmBXAAMTpoCnAAMTjmBPAAMTrg4kAmo/AAMTtmBHAAMTuwABwCsAAxO7AAGm6wADE7sAAcAvAAMTuwABwDMAAxO2YEsAAxPPAAHFKwADE85qPwADE9cAAcUvAAMTznAbAAMTzwABtCMAAxPPAAGmZwADE7ZgQwADE+pqPwADE+8AAcUzAAMT7wABxTsAAxPvAAHFSwADE+8AAcVPAAMT7wABxWcAAxPvAAHFbwADE+8AAcV/AAMT7wABxZcAAxPrAAHFdwADE+pMDwADE+sAAbQvAAMT6qmHAAMT6wABxZsAAxPrAAHFpwADE+sAAaZrAAMTtwABplMAAxQuYEsAAxQzAAHANwADFDMAAcA7AAMUMwABwD8AAxQzAAHAQwADFDMAAcBHAAMUMwABwEsAAxQzAAHATwADFDMAAcBTAAMUMwABwFcAAxQyaj8AAxRbAAHAWwADFFsAAcBfAAMULmBTAAMUZwABwGMAAxQuYE8AAxRvAAHAYwADFC5gWwADFHQDAAMTtwABwGcAAxR+YEMAAxSCbt8AAxR+YFsAAxSIAwADE7cAAbQnAAMUkmBLAAMUlwABwHMAAxSXAAHAdwADFJcAAcB7AAMUlwABwH8AAxSXAAHAgwADFJcAAcCHAAMUlwABwIsAAxSSYEMAAxS3AAHAjwADFJJgWwADFLwDAAMTtwABwJcAAxTGYFsAAxTIAwADE7cAAcCbAAMU0mBLAAMU1mo/AAMU2wABwJ8AAxTSYE8AAxThawADFNJgQwADFOkTAAMU6wABwKMAAxTSYFsAAxT0AwADE7aMuwADFP5gSwADFQICwwADFP5gWwADFQgDAAMTtwABpm8AAxUSYEsAAxUWBdMAAxUSYFsAAxUcAwADE7cAAcCrAAMVJmBLAAMVKwABwK8AAxUrAAHAswADFSsAAcC3AAMVKwABwLsAAxUrAAHAvwADFSsAAcDDAAMVKwABwMcAAxUrAAHAywADFSsAAcDPAAMVKwABwNMAAxUrAAHA1wADFSsAAcDbAAMVKwABwN8AAxUrAAHA4wADFSsAAcDnAAMVKnYHAAMVKwABwOsAAxUrAAHA7wADFSsAAcDzAAMVKwABwPcAAxUrAAHA+wADFSsAAcD/AAMVKwABwQMAAxUrAAHBBwADFSsAAcELAAMVKwABwQ8AAxUqbMsAAxUrAAHBEwADFSsAAcEXAAMVKwABwRsAAxUrAAHBHwADFSsAAcEjAAMVKwABwScAAxUrAAHBKwADFSsAAcEvAAMVKwABwTMAAxUrAAHBNwADFSsAAcE7AAMVKwABwT8AAxUrAAHBQwADFSsAAcFHAAMVKwABwUsAAxUrAAHBTwADFSsAAcFTAAMVKwABwVcAAxUrAAHBWwADFSsAAcFfAAMVKwABwWMAAxUrAAHBZwADFSsAAcFrAAMVKwABwW8AAxUrAAHBcwADFSsAAcF3AAMVKwABwXsAAxUrAAHBfwADFSsAAcGDAAMVKwABwYcAAxUrAAHBiwADFSsAAcGPAAMVKwABwZMAAxUrAAHBlwADFSsAAcGbAAMVKwABwZ8AAxUqb38AAxUrAAHBpwADFSsAAcGvAAMVKwABwbcAAxUrAAHBvwADFSsAAcHHAAMVKwABwc8AAxUrAAHB1wADFSsAAcHfAAMVKwABwecAAxUrAAHB7wADFSsAAcH3AAMVKwABwf8AAxUrAAHCBwADFSsAAcIPAAMVKwABwhcAAxUrAAHCHwADFSsAAcInAAMVKwABwi8AAxUrAAHCNwADFSsAAcI/AAMVKwABwkcAAxUrAAHCTwADFSsAAcJXAAMVKwABwl8AAxUrAAHCZwADFSsAAcJvAAMVKwABwncAAxUrAAHCfwADFSsAAcKHAAMVKwABwo8AAxUrAAHClwADFSsAAcKfAAMVKwABwqcAAxUrAAHCrwADFSsAAcK3AAMVKwABwr8AAxUrAAHCxwADFSsAAcLPAAMVKwABwtcAAxUrAAHC3wADFSsAAcLnAAMVKwABwu8AAxUmYFsAAxbUAwADE7cAAaZXAAMW3mBLAAMW4mo/AAMW5sSvAAMW3mBPAAMW7wABp7cAAxbeYEMAAxb2BisAAxb2TIMAAxbeYFsAAxcAAwADE7cAAcL3AAMXCmBLAAMXDmo/AAMXEsSvAAMXEwABqXsAAxcTAAGtMwADFxMAAa03AAMXCmBDAAMXJmxvAAMXJwABp9cAAxcmBfMAAxcmDP8AAxcmaj8AAxc7AAGsFwADFyYGMwADFyYGVwADFycAAarrAAMXCmBPAAMXTwABp5MAAxcKYFsAAxdUAwADE7cAAaZbAAMXXmBLAAMXYmo/AAMXZsSvAAMXXmBDAAMXbkyDAAMXbnT7AAMXXmBbAAMXeAMAAxO3AAG0KwADF4JgSwADF4ZqPwADF4rErwADF4JgQwADF5IV1wADF5J0+wADF5JMgwADF4JgWwADF6ADAAMTtwABwvsAAxeqYE8AAxeuaj8AAxeyxK8AAxetVwADF61rAAMXrgPzAAMXrg2jAAMXrgtLAAMXrgXnAAMXrgLbAAMXqmBDAAMX1kxfAAMX1ky7AAMX1kyHAAMX1gtDAAMX1kynAAMX1I8AAxeqYFsAAxfwAwADE7cAAcL/AAMX+mBLAAMX/mo/AAMYAsSvAAMX+mBDAAMYCVsAAxf6YE8AAxgRXwADF/pgWwADGBgDAAMTtwABwwMAAxgiYEsAAxgmaj8AAxgqxK8AAxgiYFcAAxgwAwADGCJgQwADGDpMgwADGCJgWwADGEJqPwADGEYCowADE7cAAcMHAAMYTmBbAAMYUAMAAxO3AAHDCwADGFpgWwADGFwDAAMYWmBPAAMYZVcAAxhmA/MAAxhmDaMAAxhmC0sAAxhmBecAAxhmAtsAAxhmYAcAAxhaYEMAAxiGTIcAAxiGTJ8AAxiGDvMAAxiGC0MAAxiGTHsAAxiGBZcAAxiGTI8AAxiGTKcAAxiGTLMAAxiFRwADGIYEnwADGIZMwwADGIYCfwADGIZMiwADGIZMqwADGIYMSwADGIZMXwADGIZMtwADGIZMuwADGIZMvwADGIYChwADGIZHiwADGIU/AAMYhgJnAAMYhk+DAAMYhnYDAAMY7vHTAAMY7vHXAAMY7vHjAAMYhk+LAAMYhk+XAAMYhgdDAAMYhkyDAAMYhlabAAMYhgKLAAMYhvHnAAMYhmzPAAMYhXcAAxiGA/8AAxiG3I8AAxiGwxMAAxiGaacAAxiGDF8AAxiG8gsAAxiGArsAAxiG8h8AAxiGDdsAAxiG8iMAAxiGdlsAAxiGuFcAAxiG8icAAxiG8i8AAxiEjwADGFpgUwADGV4LSwADGV4F5wADE7cAAcMPAAMZamBPAAMZbmo/AAMZcsSvAAMZamBDAAMZeRMAAxl6AssAAxl5PwADGXoCZwADGXoCiwADGXrx5wADGXp2WwADGXryJwADGXryLwADGXpPgwADGXq4VwADGXpWmwADGXpPiwADGXpPlwADGXrcjwADGXoMXwADGXrDEwADGXpppwADGXryCwADGWpgUwADGclrAAMZamBbAAMZ0AMAAxO3AAHDFwADGdpgSwADGd5qPwADGeLErwADGdpgQwADGepMgwADGdpgWwADGfADAAMTtwABwxsAAxn6YEsAAxn+aj8AAxoCxK8AAxoCrHsAAxn6YEMAAxoOaj8AAxoTAAHDHwADGhMAAcMjAAMaEwABLwcAAxoOTIMAAxoNPwADGg4CZwADGg5PgwADGg5PhwADGg5PkwADGg5PiwADGg5PlwADGg4PGwADGg5PnwADGg5PowADGg5PmwADGg4HQwADGg5HiwADGg5PfwADGfpgWwADGlwDAAMTtwABwy8AAxpmYEsAAxpqaj8AAxpuxK8AAxpmYEMAAxp2TIMAAxp29FcAAxp2B3cAAxp1EwADGnYCywADGnZiQwADGnYCZwADGnZPgwADGnYHQwADGnYO8wADGnabFwADGnb0awADGnb0XwADGnZPiwADGmZgTwADGrIHcwADGrCnAAMasWsAAxqyA/MAAxqyDaMAAxqyVjcAAxpmYFsAAxrMAwADE7cAAcM7AAMa1mBLAAMa2mo/AAMa3sSvAAMa1mBDAAMa5kyDAAMa5nd3AAMa5labAAMa5T8AAxrnAAGT7wADGuYPnwADGuZPgwADGuYCZwADGuZPiwADGuZPlwADGuYHQwADGtZgWwADGxQDAAMTtwABwz8AAxseYE8AAxshawADGx5gWwADGygDAAMTtwABw0MAAxsyYE8AAxs1awADGzVXAAMbNgPzAAMbNgtLAAMbNgXnAAMbNgLbAAMbMmBDAAMbUkyHAAMbUg7zAAMbUgtDAAMbUkx7AAMbUgWXAAMbUkyPAAMbUkynAAMbUkyzAAMbUUcAAxtSBJ8AAxtSAn8AAxtSTKsAAxtSDEsAAxtSTF8AAxtSTLcAAxtSTLsAAxtSTL8AAxtSAocAAxtSR4sAAxsyYFsAAxugAwADE7cAAcNHAAMbqmBLAAMbrmo/AAMbswABlDcAAxuyfa8AAxuzAAHDSwADG6pgTwADG8JqPwADG8cAAcNPAAMbxwABLq8AAxvBawADG6pgQwADG9ZMhwADG9ZMXwADG9ZMuwADG9YChwADG6pgWwADG+gDAAMTtwABw1sAAxvyYEsAAxv2aj8AAxv7AAGUNwADG/pu8wADG/pQAwADG/oVywADG/JgTwADHA1fAAMb8mBDAAMcFVsAAxvyYFsAAxwcAwADE7cAAcNfAAMcJmBLAAMcKmo/AAMcLwABlDcAAxwvAAHDYwADHCZgVwADHDgDAAMcJmBPAAMcQVcAAxxBawADHEID8wADHEILSwADHEIF5wADHEIC2wADHCZgQwADHF5MhwADHCZgWwADHGZqPwADHGoCowADE7cAAcNnAAMccmBbAAMcdAMAAxO3AAHDawADHH5gSwADHIJqPwADHIYVywADHIcAAayTAAMchwABw2MAAxx+YEMAAxyVWwADHH5gTwADHJ1fAAMcfmBbAAMcpAMAAxO3AAHDbwADHK5gSwADHLJqPwADHLbErwADHLcAAcNjAAMcrmBPAAMcwWsAAxyuYEMAAxzKTIcAAxyuYFsAAxzQAwADE7cAAcNzAAMc2mBLAAMc3mo/AAMc4wABlDcAAxzjAAHDYwADHNpgTwADHO1XAAMc2mBDAAMc9gJ/AAMc2mBbAAMc/AMAAxO3AAHDdwADHQZgSwADHQpqPwADHQ8AAayTAAMdDwABw2MAAx0GYEMAAx0ZWwADHQZgTwADHSFfAAMdBmBbAAMdKAMAAxO3AAHDewADHTJgSwADHTZqPwADHTsAAZQ3AAMdOwABw2MAAx0yYE8AAx1FVwADHTJgWwADHUwDAAMTtwABw38AAx1WYEsAAx1aaj8AAx1fAAGskwADHV8AAcNjAAMdXwABw4MAAx1eFcsAAx1WYE8AAx1xXwADHVZgQwADHXlbAAMdVmBbAAMdgAMAAxO3AAHDhwADHYpgSwADHY5qPwADHZMAAZQ3AAMdkwABw4sAAx2KYFcAAx2cAwADHYpgTwADHaVXAAMdimBbAAMdrmo/AAMdsgKjAAMTtwABw5MAAx26YE8AAx29awADHbpgWwADHcQDAAMTtwABw5sAAx3OYEsAAx3Saj8AAx3XAAGskwADHdZP/wADHc5gQwADHeFbAAMdzmBPAAMd6V8AAx3OYFsAAx3wAwADE7cAAcOfAAMd+mBLAAMd/mo/AAMeAwABlDcAAx4DAAHDYwADHfpgTwADHg1XAAMd+mBbAAMeFAMAAxO3AAHDowADHh5gSwADHiJqPwADHicAAayTAAMeJwABw2MAAx4nAAHDpwADHh5gQwADHjVbAAMeHmBPAAMePV8AAx4eYFsAAx5EAwADE7cAAcOrAAMeTmBLAAMeUmo/AAMeVwABlDcAAx5XAAHDrwADHk5gVwADHmADAAMeTmBDAAMeakxfAAMeTmBPAAMecVcAAx5OYFsAAx56aj8AAx5+AqMAAxO3AAHDswADHoZgVwADHogDAAMehmBPAAMekWsAAx6GYEMAAx6aTF8AAx6GYFsAAx6iaj8AAx6mAqMAAxO3AAHDtwADHq5gSwADHrJqPwADHrcAAayTAAMetwABw68AAx6uYEMAAx7BWwADHq5gTwADHslfAAMermBbAAMe0AMAAxO3AAHDuwADHtpgSwADHt5qPwADHuMAAZQ3AAMe4wABw2MAAx7aYE8AAx7tVwADHtpgWwADHvQDAAMTtwABw78AAx7+YEsAAx8Caj8AAx8HAAGskwADHwcAAcNjAAMfBwABw8MAAx7+YEMAAx8VWwADHv5gTwADHx1fAAMe/mBbAAMfJAMAAxO3AAHDxwADHy5gTwADHzFXAAMfMgPzAAMfMWsAAx8yC0sAAx8yBecAAx8yAtsAAx8uYEMAAx9ODvMAAx9OTIcAAx9OC0MAAx9OTHsAAx9OBZcAAx9OTI8AAx9OTKcAAx9OTLMAAx9NRwADH04EnwADH04CfwADH05MqwADH04MSwADH05MXwADH05MtwADH05MuwADH05MvwADH04ChwADH05HiwADHy5gWwADH5wDAAMTtwABpl8AAx+mYEMAAx+pWwADH6ZgTwADH7FfAAMfpmBbAAMfuAMAAxO3AAHDywADH8JgSwADH8ZqPwADH8sAAbIvAAMfywABuWcAAx/CYFcAAx/XAAHDzwADH8JgTwADH91XAAMf3WsAAx/eA/MAAx/eDaMAAx/eC0sAAx/eBecAAx/CYEMAAx/6C0MAAx/CYFsAAyAAAwADE7cAAcPTAAMgCmBDAAMgDkxfAAMgDky7AAMgDkyHAAMgCmBPAAMgHgtLAAMgHgXnAAMgCmBbAAMgKAMAAxO3AAHD1wADIDJgSwADIDZqPwADIDsAAXbjAAMgOwABw9sAAyAyYEMAAyBFWwADIDJgTwADIE1fAAMgMmBbAAMgVAMAAxO3AAHD3wADIF5gSwADIGJqPwADIGbErwADIF5gTwADIG1XAAMgXmBbAAMgdAMAAxO3AAHD4wADIH5gSwADIIJqPwADIIbErwADIH5gQwADII1bAAMgfmBPAAMglV8AAyB+YFsAAyCcAwADE7cAAaZjAAMgpmBDAAMgqwABw+cAAyCrAAHD6wADIKsAAcPvAAMgpmBbAAMguAMAAxO3AAHD8wADIMJgUwADIMVrAAMgwmBDAAMgzT8AAyDOdlsAAyDO8icAAyDOAmcAAyDOT4MAAyDOT4sAAyDOT5cAAyDOB0MAAyDOuFcAAyDOVpsAAyDOwxMAAyDO8gsAAyDCYFsAAyEAAwADE7cAAcQDAAMhCmBDAAMhDgLLAAMhDvIvAAMhDT8AAyEOdlsAAyEO8icAAyEOAmcAAyEOT4MAAyEOT4sAAyEOT5cAAyEOAosAAyEO8ecAAyEOB0MAAyEOuFcAAyEOVpsAAyEODF8AAyEOwxMAAyEO8gsAAyEOaacAAyEKYFMAAyFZawADIVoLSwADIVoF5wADIQpgWwADIWgDAAMTtwABxBsAAyFyYFsAAyF0AwADIXJgUwADIX1rAAMhcmBDAAMhhT8AAyGGdlsAAyGG8icAAyGGAmcAAyGGT4MAAyGGT4sAAyGGT5cAAyGGB0MAAyGGuFcAAyGGVpsAAyGGwxMAAyGG8gsAAxO3AAHEHwADIbpgWwADIbwDAAMhumBDAAMhxgLLAAMhxvIvAAMhxT8AAyHGdlsAAyHG8icAAyHGAmcAAyHGT4MAAyHGT4sAAyHGT5cAAyHGAosAAyHG8ecAAyHGB0MAAyHGuFcAAyHGVpsAAyHGDF8AAyHGwxMAAyHG8gsAAyHGaacAAyG6YFMAAyIRawADIhILSwADIhIF5wADE7cAAcQjAAMiImBLAAMiJmo/AAMiKwABxCcAAyIiYE8AAyIxawADIiJgQwADIjpMhwADIiJgWwADIkADAAMTtwABxCsAAyJKYEsAAyJOaj8AAyJTAAEL/wADIkpgQwADIlkTAAMiWvRXAAMiWgd3AAMiWg7zAAMiSmBPAAMibWsAAyJspwADIm4HcwADIm4D8wADIm4NowADIkpgWwADIoQDAAMTtwABxC8AAyKOYEsAAyKSaj8AAyKWxK8AAyKOYE8AAyKdawADIo5gQwADIqZMhwADIo5gWwADIqwDAAMTtwABxDMAAyK2YEMAAyK5PwADIrsAAVBPAAMiuWsAAyK6T4MAAyK2YFsAAyLMAwADE7cAAcRHAAMi1mBDAAMi2T8AAyLZawADItpPgwADItZgWwADIugDAAMTtwABxFcAAyLyYEsAAyL2aj8AAyL7AAHEWwADIvJgQwADIwICiwADIwMAAcRfAAMjAmo/AAMjDwABxGcAAyMPAAHEawADIw8AAcRzAAMi8mBbAAMjHAMAAxO2ai8AAyMmYEsAAyMqaj8AAyMsowADIysAAcS/AAMjKwABxNMAAyMrAAFsuwADIysAAcTjAAMjKwABxOsAAyMrAAHE+wADIyZgQwADI00HAAMjTI8AAyNOYj8AAyNPAAHFCwADI08AAcUXAAMjTwABxRsAAyMmYE8AAyNqDicAAyMmYFsAAyNwAwADI3MAAcT/AAMjcqmTAAMTtwABsisAAyOCYEsAAyOGC0sAAyOGBecAAyOFawADI4JgTwADI5YD8wADI5VXAAMjgmBDAAMjoT8AAyOjAAGT7wADI6JPgwADI4JgWwADI7ADAAMTtwABsk8AAyO6YEsAAyO+aj8AAyPDAAGnzwADI8MAAafTAAMjwk/7AAMjumBDAAMj0wABslMAAyO6YFsAAyPYAwADE7cAAbJHAAMj4mBLAAMj5V8AAyPmaj8AAyPuT/sAAyPiYEMAAyP1WwADI+JgWwADI/wAAwACNHsAAyQGYEcAAyQLAAHFuwADJAsAAcW/AAMkCwABxcMAAyQLAAHFxwADJAZgSwADJB8AAjR7AAMkIwAByCsAAyQGYEMAAyQrAAI0ewADJC8AAcgvAAMkLwAByDMAAyQvAAHINwADJC8AAcg7AAMkLwAByD8AAyQvAAHIQwADJC8AAchHAAMkLwAByFMAAyQHAAHFywADJFJgVwADJFQDAAMkUmBDAAMkXQcAAyRfAAI0ewADJGbP8wADJGcAAcXTAAMkUmBPAAMkcg4nAAMkBwABxd8AAyR6YEsAAyR/AAI0ewADJIMAAcXjAAMkgwABqEsAAyR6YE8AAySPAAG9nwADJHpgQwADJJYGKwADJJYIPwADJHpgWwADJKADAAMkowABxecAAyQHAAHF6wADJK5gSwADJLMAAjR7AAMktwABxe8AAySuYFcAAyS8AwADJK5gQwADJMYIPwADJMUHAAMkxwACNHsAAyTTAAHF/wADJNMAAcX7AAMk0wABxgsAAyTTAAHGDwADJNMAAcX3AAMk0wABxhcAAySuYE8AAyTvAAG9nwADJO4OJwADJK5gUwADJPk7AAMkBwABxh8AAyUCYEMAAyUG3SsAAyUFBwADJQcAAjR7AAMlEwABxf8AAyUTAAHF0wADJRMAAcYjAAMlAmBPAAMlIg4nAAMlAmBbAAMlKAMAAyQHAAHGMwADJTJgSwADJTcAAjR7AAMlOk/7AAMlOwABxjcAAyUyYE8AAyVGA/MAAyVGC0sAAyUyYEMAAyVSY+cAAyVRPwADJVJ3dwADJVJPgwADJVMAAjR7AAMlZwABsBcAAyVnAAGTjwADJWcAAZOTAAMlZwABxkcAAyVmh5MAAyVnAAHGUwADJWcAAcZXAAMlZoljAAMlZwABxlsAAyVnAAHGXwADJTJgWwADJZADAAMkBwABxmMAAyWaYEsAAyWfAAI0ewADJaMAAcZnAAMlowABxmsAAyWjAAHGbwADJaMAAcZzAAMlowABxncAAyWjAAHGewADJaMAAcZ/AAMlowABxoMAAyWjAAHGhwADJaMAAcaLAAMlowABxo8AAyWjAAHGkwADJaMAAbkvAAMlowABxpcAAyWjAAHGmwADJaMAAcafAAMlowABxj8AAyWjAAGyawADJaMAAcajAAMlmmBDAAMl8wACNHsAAyX3AAHGpwADJfcAAa33AAMl9wABxkMAAyX3AAHGuwADJfcAAcazAAMl9wABxr8AAyX3AAHGwwADJfcAAcbLAAMl9wABxs8AAyX3AAHG1wADJfcAAcYPAAMl9wABxucAAyX3AAHG6wADJfcAAcbvAAMl9wABxvMAAyX3AAGnrwADJfJsbwADJZpgVwADJjwDAAMmPwABqp8AAyWaYE8AAyZLAAI0ewADJk8AAca3AAMmShVnAAMmSwABrfMAAyWaYFsAAyZfAAI0ewADJmJXpwADJAcAAcb3AAMmamBLAAMmbIsAAyZqYEMAAyZ0jwADJmpgWwADJnwDAAMkBDMAAyaGYEsAAyaLAAI0ewADJo8AAcb/AAMmjwABxwMAAyaPAAHHBwADJo8AAccLAAMmjwABxw8AAyaPAAHHEwADJo8AAccXAAMmjwABxxsAAyaPAAHHHwADJo8AAccjAAMmjwABxycAAyaLAAGp0wADJosAAccrAAMmiwABva8AAyaLAAHHLwADJosAAcczAAMmhmBDAAMm0wACNHsAAybXAAHHNwADJtcAAcc7AAMm1wABx1MAAybXAAHHawADJtcAAcdzAAMm1wABx3sAAybXAAHHgwADJtcAAceLAAMm1wABx5MAAybXAAHHlwADJtcAAcfnAAMm0wABx68AAybTAAHHtwADJtMAAce/AAMm0gYzAAMm0gZXAAMm0wABx+sAAybTAAHH8wADJtMAAcf3AAMm0wABZUcAAybTAAEt9wADJtMAAcf/AAMm0wAByAMAAyaGYE8AAyc2jbMAAyc1XwADJzW7AAMnNbcAAyc2FT8AAyaGYFsAAydMAwADJAcAAbyrAAMnVmBDAAMnWt0rAAMnWQcAAydWYE8AAydmDicAAydWYFsAAydsAwADJAcAAcgTAAMndmBXAAMneAMAAyd7AAHF5wADJ3ZgQwADJ4YGKwADJ4YIPwADJ3ZgTwADJ5MAAb2fAAMkBwABvK8AAyeaYFcAAyecAwADJ5pgUwADJ6U7AAMnmmBDAAMnrgg/AAMnmmBPAAMntwABvZ8AAyQHAAHIHwADJ75gSwADJ8MAAjR7AAMnxwAByCMAAyfCV1MAAye+YEMAAyfQjwADJ75gTwADJ9pp/wADJ98AAa4HAAMnvmBTAAMn5mn/AAMn6wABrgcAAye+YFsAAyfwAwADJAcAAcgnAAMn+mBXAAMn/AADAAI0fwADKAZgSwADKAoMGwADKAsAAck7AAMoCwAByT8AAygLAAHJQwADKAsAAclHAAMoCwAByUsAAygLAAHJTwADKAsAAclTAAMoBmBDAAMoLwACNH8AAygzAAHJVwADKDMAAclfAAMoMwAByWcAAygzAAHJawADKDMAAclzAAMoMwAByXsAAygzAAHJgwADKDMAAcmLAAMoMwAByZMAAygzAAHJmwADKDMAAcmjAAMoMwAByasAAygzAAFjLwADKDMAAcnfAAMoLm3fAAMoLwABGgcAAygvAAHJtwADKC8AAcm7AAMoLwAByb8AAygvAAHJxwADKC8AAcnLAAMoLwAByc8AAygvAAHJ0wADKC8AAcnXAAMoLwABydsAAygu0mcAAyguTV8AAygHAAHIawADKKJgSwADKKcAAjR/AAMoqwABc5MAAyirAAHIbwADKKsAAchzAAMoqwAByHcAAyirAAHIewADKKsAAch/AAMoqwAByIMAAyiiYEMAAyjLAAI0fwADKM8AAciLAAMozwAByKMAAyjPAAHIqwADKM8AAcizAAMoyvHzAAMoywAByJsAAyjLAAHInwADKKJgWwADKO8AAjR/AAMo8wAByIcAAygHAAHItwADKPpgSwADKP8AAjR/AAMpAwAByHcAAykDAAHIewADKPpgQwADKQ8AAjR/AAMpEwAByLsAAykO8fMAAykPAAHImwADKQ8AAcifAAMo+mBbAAMpJAMAAygHAAHIxwADKS5gQwADKTJMmwADKTKf1wADKTMAAcjLAAMpMwAByM8AAykuYFsAAylEAwADKAcAAcjTAAMpTmBLAAMpUgzDAAMpUs4fAAMpTmBDAAMpXI8AAyldBwADKV13AAMpXgUHAAMpXgz7AAMpXwAByN8AAylfAAHI4wADKU5gTwADKX4OJwADKX8AASufAAMpTmBbAAMpiAMAAygHAAGbzwADKZJgVwADKZQDAAMplwAByOcAAymSYEMAAymi8fMAAymjAAHImwADKaMAAcifAAMoBwAByOsAAymyYE8AAym2VS8AAym2jecAAym2BRMAAym3AAHI7wADKbZVMwADKbcAAcjzAAMptg4nAAMptwAByRcAAym3AAHJGwADKbcAAckfAAMptwABySMAAymyYEMAAynkjwADKeUHAAMp5k+fAAMp5rWHAAMp5wAByQcAAynnAAHJCwADKecAAckTAAMpsmBbAAMqBAMAAygHAAHJJwADKg5gSwADKhJVLwADKhKN5wADKhIFEwADKhMAAcjvAAMqDmBXAAMqJwABySsAAyoOYFsAAyosAwADKAcAAckvAAMqNmBLAAMqOlUvAAMqOo3nAAMqOwACNH8AAypHAAHJMwADKkcAAck3AAMqNmBXAAMqUwABySsAAyo2YE8AAypaBRMAAypbAAHI7wADKjZgUwADKmYFEwADKmcAAcjvAAMqNmBbAAMqcAACbB8AAyp6YEsAAyp+bB8AAyqDAAHN9wADKnpgQwADKopsHwADKo8AAc37AAMqjwABjpcAAyqPAAHN/wADKo8AAc4DAAMqjrrTAAMqjwABiYsAAyqPAAHOFwADKo8AAc4fAAMqiwABzTsAAyqLAAHNPwADKosAAc1bAAMqiwABzWMAAyp7AAHJ5wADKsJgSwADKsZsHwADKssAAcnrAAMqwmBDAAMq0I8AAyrCYFsAAyrYAwADKnsAAcnvAAMq4mBLAAMq5nS7AAMq5wABArMAAyrmbB8AAyryFRMAAyrzAAHJ8wADKuJgTwADKv4QswADKv6ipwADKuJgQwADKwpsHwADKw8AAcn3AAMrDwAByf8AAysIjwADKuJgWwADKxwDAAMqewABygsAAysmYEsAAysqBi8AAysqEwsAAysqursAAysmYEMAAys4jwADKyZgWwADK0ADAAMqewAByg8AAytKYFsAAytMAwADKnsAAcoTAAMrVmBLAAMrWo2zAAMrWwAByhcAAytWYE8AAytnAAHKGwADK1ZgQwADK2yPAAMrbwAByiMAAytubB8AAyt7AAHKKwADK1ZgWwADK4ADAAMqewAByjMAAyuKYEsAAyuOnrsAAyuPAAHKNwADK44RAwADK44PewADK44RGwADK45sHwADK6YS0wADK4pgTwADK65Q9wADK66NtwADK65wqwADK64RFwADK68AAco7AAMrrqsLAAMrrq7bAAMrrg+TAAMrrwABNIcAAyuuD38AAyuuEQcAAyuuV6sAAyuvAAGd+wADK66fKwADK65TcwADK657wwADK64S+wADK65HwwADK64L9wADK4pgWwADK/wDAAMqewAByj8AAywGYEsAAywKnrsAAywKbB8AAywSEtMAAywGYE8AAywbAAHKNwADLBsAAZ37AAMsGghfAAMsGtdXAAMsGtcbAAMsGg97AAMsGhEbAAMsGg+LAAMsGg+DAAMsGlerAAMsGwABykMAAywaC38AAywaEvsAAywaR8MAAywGYFsAAyxUAwADKnsAAcpHAAMsXmBLAAMsYmwfAAMsZwAByksAAyxeYEMAAyxubB8AAyxzAAHKTwADLHMAAcpXAAMscwABylsAAyxuy4sAAyxu5wMAAyxvAAHKZwADLG6eGwADLF5gWwADLJADAAMqewAByncAAyyaYEsAAyyebB8AAyyiPDMAAyyaYE8AAyyqCF8AAyyrAAHKewADLKsAAcpTAAMsqg4nAAMsmmBDAAMsvI8AAyy9BwADLL7nAwADLL8AAcpnAAMsvsuLAAMsvmwfAAMs1wAByk8AAyzXAAHKVwADLNcAAcpbAAMs1wAByo8AAyyaYFsAAyzoAwADKnsAAcqXAAMs8mBLAAMs9mwfAAMs+wABypsAAyzyYE8AAy0CST8AAyzyYEMAAy0Kp9cAAy0IjwADLQpsHwADLRcAAcqjAAMs8mBbAAMtHAMAAyp7AAHKqwADLSZgTwADLSpsHwADLS8AAcqvAAMtJmBbAAMtNAMAAyp7AAHKswADLT5gSwADLUJsHwADLUcAAcqvAAMtRwAByrcAAy1HAAHKuwADLUcAAcq/AAMtRwABysMAAy1HAAHKxwADLUcAAcrLAAMtRwABys8AAy1HAAHK0wADLUcAAcrXAAMtRwABnosAAy1HAAHK2wADLUcAAcrfAAMtRwAByuMAAy1Gk58AAy1HAAEEIwADLUIPfwADLUJSPwADLT5gTwADLZMAAcrrAAMtkwAByucAAy2TAAHKNwADLZMAAZ37AAMtkp67AAMtklerAAMtkhEbAAMtkhL7AAMtkmwfAAMttwAByvcAAy23AAHK8wADLbcAAcsrAAMtklJjAAMtkwAByv8AAy2SUmsAAy2TAAHLDwADLZMAAcsTAAMtkwABHTcAAy2Sjg8AAy2SSRMAAy2TAAHK+wADLZMAAcsvAAMtkkfDAAMtkg4nAAMtPmBDAAMt9I8AAy33AAE4IwADLfUHAAMt9mdPAAMt9wAByzsAAy32Z0cAAy32bB8AAy4TAAHLRwADLhMAActPAAMuEwABy1cAAy4TAAHLXwADLhMAActnAAMuEwABy28AAy4TAAHLdwADLhMAAcsbAAMuEwAByx8AAy4TAAHKTwADLhMAAcpXAAMuEwABylsAAy4TAAHLkwADLhMAAcubAAMuEwABy6MAAy0+YFsAAy5QAwADKnsAAcurAAMuWmBLAAMuXmwfAAMuYwABy68AAy5jAAHKtwADLmMAAcuzAAMuYwABM08AAy5jAAHLtwADLlpgTwADLnpsHwADLn8AAcsrAAMuewAByjcAAy56rtcAAy56U3MAAy56e8MAAy57AAHK+wADLnsAAcsvAAMueo4PAAMuekkTAAMuekfDAAMuehL7AAMuWmBDAAMurI8AAy6ubB8AAy63AAHLuwADLrcAAcvPAAMutwABy78AAy5aYFsAAy7EAwADKnsAAcvbAAMuzmBLAAMu0mwfAAMu1wAByksAAy7XAAHKtwADLtcAAcrPAAMuzmBPAAMu5wAByjcAAy7nAAGd+wADLuZXqwADLuYS+wADLuZHwwADLuYOJwADLs5gQwADLwEHAAMuzmBbAAMvCAMAAyp7AAHL3wADLxJgSwADLxZsHwADLxsAAcq7AAMvGwABy+MAAy8SYE8AAy8mnrsAAy8mD3sAAy8mERsAAy8mfGMAAy8nAAHK6wADLycAAcrnAAMvJmwfAAMvQwAByq8AAy8mjg8AAy8mSRMAAy8nAAHK+wADLycAAcsvAAMvJg4nAAMvEmBDAAMvXI8AAy9dBwADL15nTwADL18AAcs7AAMvXmwfAAMvcwABy+8AAy9zAAHL9wADLxJgWwADL3wDAAMqewABy/8AAy+GYEsAAy+KbB8AAy+PAAHKrwADL48AAcq/AAMvjwAByscAAy+PAAHKuwADL48AAcwDAAMvjpOfAAMvjwABBCMAAy+GYE8AAy+uERsAAy+unrsAAy+vAAHMBwADL68AAcrrAAMvrwAByucAAy+vAAHK+wADL68AAcsvAAMvro4PAAMvrkkTAAMvhmBDAAMv1I8AAy/WZ08AAy/XAAHLOwADL9ZsHwADL+cAAcwPAAMv5wABzBcAAy+GYFsAAy/wAwADKnsAAcwfAAMv+mBLAAMv/wAByjcAAy/+AoMAAy/+bB8AAzALAAHK4wADMAsAAcwjAAMv+mBPAAMwFwABnfsAAzAWnrsAAzAWV6sAAzAWERsAAzAWbB8AAzArAAHKywADMBcAAR03AAMwFhL7AAMwFkfDAAMwFg4nAAMwFwABzCsAAy/6YEMAAzBFBwADMESPAAMwRmwfAAMwUwABzC8AAzBTAAHKTwADMFMAAcpXAAMwUwABylsAAzBTAAHLGwADL/pgWwADMGgDAAMqewABzEcAAzByYEsAAzB2j6sAAzB2bB8AAzB/AAHMSwADMHZRSwADMHYLewADMHZRdwADMHZRewADMHZHwwADMHJgTwADMJpRcwADMJpRbwADMJoS+wADMHJgQwADMKqiNwADMKpsHwADMLMAAcxjAAMwcmBbAAMwuAMAAyp7AAHMawADMMJgSwADMMcAAcxvAAMwxlGXAAMwwmBPAAMw0lGjAAMwwmBbAAMw2AMAAyp7AAHMdwADMOJgSwADMOZsHwADMOsAAcrLAAMw6wABzHsAAzDrAAHMpwADMOsAAcq7AAMw6wABM08AAzDrAAHLtwADMOsAAcyrAAMw5g97AAMw5wABzH8AAzDnAAHMgwADMOcAAcyHAAMw5wABzIsAAzDnAAHMjwADMOcAAcyTAAMw5wABzJcAAzDnAAHMmwADMOcAAcyfAAMw5wABzKMAAzDiYE8AAzE2D38AAzE2EQMAAzE2EQcAAzE2ERcAAzE3AAHKOwADMTarCwADMTcAATSHAAMxNq7bAAMxNg+TAAMxNlD3AAMxNnCrAAMxNp67AAMxNlerAAMxNhEbAAMxNlNzAAMxNnvDAAMxNo23AAMxNp8rAAMxNgv3AAMw4mBDAAMxhmwfAAMxiwAByycAAzGLAAHMywADMYsAAczTAAMxiwABzK8AAzGLAAHM3wADMYSPAAMw4mBbAAMxpAMAAyp7AAHM5wADMa5gSwADMbKeuwADMbIPewADMbIPgwADMbIPiwADMbJsHwADMcY8MwADMa5gTwADMc4RGwADMc5sHwADMdcAAcrLAAMxzghfAAMxrmBDAAMx4I8AAzHibB8AAzHrAAHM8wADMa5gWwADMfADAAMqewABzPsAAzH6YEsAAzH+bB8AAzIDAAGzGwADMgMAAcz/AAMyAwABzQMAAzIDAAGlzwADMgI8MwADMf7XVwADMf7XGwADMfpgTwADMiILfwADMiMAAcpDAAMyIhL7AAMyIkfDAAMyIghfAAMx+mBDAAMyOI8AAzI6bB8AAzJDAAHNDwADMfpgWwADMkgDAAMqewABzRcAAzJSYEsAAzJXAAHKNwADMlJgTwADMl5XqwADMl4RGwADMl6euwADMl4S+wADMl5HwwADMl8AAcrrAAMyXwAByucAAzJejg8AAzJeSRMAAzJfAAHK+wADMl8AAcsvAAMyXwABnfsAAzJeDicAAzJSYEMAAzKVBwADMpSPAAMylmdPAAMylwAByzsAAzJSYFsAAzKoAwADKnsAAc0jAAMysmBLAAMytmwfAAMyuwABzScAAzK7AAHNKwADMrsAAc0zAAMysmBDAAMyywABzTsAAzLLA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wADOQZMpwADOQZMswADOQZMhwADOQU/AAM5BgJnAAM5BnZbAAM5BvInAAM5BgKLAAM5BgK7AAM5Bg3bAAM5BlabAAM5BrhXAAM5Bk+LAAM5Bk+XAAM5BgP/AAM5BvIvAAM5BmmnAAM43mBTAAM5vgtLAAM5vgXnAAM43mBbAAM5yAMAAzZLAAHOcwADOdJgTwADOdcAAaX/AAM51o9bAAM51ghLAAM51mAHAAM51VcAAznWC0sAAznWBecAAznWAtsAAznSYEMAAzn7AAI0hwADOf8AAc5TAAM5+kzDAAM5+kyfAAM5+kyDAAM5+vIfAAM5+vIjAAM5+XcAAzn6C0MAAzn68ecAAzn6DF8AAzn6BJ8AAzn6TLsAAzn6TL8AAzn6TF8AAzn6TLcAAzn6bM8AAzn63I8AAzn6AocAAzn6R4sAAzn6DvMAAzn6TKsAAzn6DEsAAzn6An8AAzn6TIsAAzn6THsAAzn6BZcAAzn6TI8AAzn6TKcAAzn6TLMAAzn6TIcAAzn5PwADOfoCZwADOfp2WwADOfryJwADOfoCiwADOfoCuwADOfoN2wADOfpWmwADOfq4VwADOfpPiwADOfpPlwADOfoD/wADOfryLwADOfpppwADOdJgUwADOrILSwADOrIF5wADOdJgWwADOrwDAAM2SwABzncAAzrGYE8AAzrLAAGl/wADOsqPWwADOsoISwADOspgBwADOslXAAM6ygtLAAM6ygXnAAM6ygLbAAM6xmBDAAM67wACNIcAAzrzAAHOUwADOu5MwwADOu5MnwADOu5MgwADOu7yHwADOu7yIwADOu13AAM67gtDAAM67vHnAAM67gxfAAM67gSfAAM67ky7AAM67ky/AAM67kxfAAM67ky3AAM67mzPAAM67tyPAAM67gKHAAM67keLAAM67g7zAAM67kyrAAM67gxLAAM67gJ/AAM67kyLAAM67kx7AAM67gWXAAM67kyPAAM67kynAAM67kyzAAM67kyHAAM67T8AAzruAmcAAzrudlsAAzru8icAAzruAosAAzruArsAAzruDdsAAzruVpsAAzruuFcAAzruT4sAAzruT5cAAzruA/8AAzru8i8AAzruaacAAzrGYFMAAzumC0sAAzumBecAAzrGYFsAAzuwAwADNksAAc57AAM7umBLAAM7vwACNIcAAzvCua8AAzu6YFcAAzvLAAI0hwADO88AAc5/AAM7umBPAAM71wABpJMAAzvWDicAAzu6YEMAAzvhBwADO+MAAaSbAAM74wABzoMAAzviXpMAAzvjAAHOhwADO+MAAc6LAAM74wABzo8AAzvjAAHOkwADO+MAAc6XAAM74wABzpsAAzvjAAHOnwADO+MAAc6jAAM74wABzqcAAzvjAAHOqwADO+MAAc6vAAM74wABzrMAAzu6YFsAAzwkAwADNksAAc63AAM8LmBPAAM8MwABpf8AAzwyj1sAAzwzAAGkkwADPDIISwADPDFrAAM8LmBDAAM8SwACNIcAAzxPAAHOvwADPE8AAc7HAAM8TwABzs8AAzxPAAHO1wADPE8AAc7fAAM8TwABzucAAzxPAAHO7wADPE8AAc73AAM8TwABzv8AAzxPAAHPBwADPE8AAc8PAAM8TwABzxcAAzxPAAHPHwADPE8AAc8nAAM8TwABzy8AAzxPAAHPNwADPE8AAc8/AAM8TwABz0cAAzxPAAHPTwADPE8AAc9XAAM8TwABz18AAzxPAAHPZwADPE8AAc9vAAM8TwABz3cAAzxPAAHPfwADPE8AAc+HAAM8TwABz48AAzwuYFsAAzy8AwADNksAAc+bAAM8xmBbAAM8yAMAAzzGYE8AAzzTAAGl/wADPNKPWwADPNIISwADPNJgBwADPNFXAAM80gtLAAM80gXnAAM80gLbAAM8xmBDAAM89wACNIcAAzz7AAHOUwADPPZMwwADPPZMnwADPPZMgwADPPbyHwADPPbyIwADPPV3AAM89gtDAAM89vHnAAM89gxfAAM89gSfAAM89ky7AAM89ky/AAM89kxfAAM89ky3AAM89mzPAAM89tyPAAM89gKHAAM89keLAAM89g7zAAM89kyrAAM89gxLAAM89gJ/AAM89kyLAAM89kx7AAM89gWXAAM89kyPAAM89kynAAM89kyzAAM89kyHAAM89T8AAzz2AmcAAzz2dlsAAzz28icAAzz2AosAAzz2ArsAAzz2DdsAAzz2VpsAAzz2uFcAAzz2T4sAAzz2T5cAAzz2A/8AAzz28i8AAzz2aacAAzzGYFMAAz2uC0sAAz2uBecAAzZLAAHPnwADPbpgQwADPb0TAAM9vgLLAAM9vwACNIcAAz3LAAHOUwADPb7yCwADPbpgTwADPdcAAaX/AAM9umBbAAM93AMAAzZLAAHPowADPeZgWwADPegDAAM95mBPAAM98wABpf8AAz3yj1sAAz3yCEsAAz3yYAcAAz3xVwADPfILSwADPfIF5wADPfIC2wADPeZgQwADPhcAAjSHAAM+GwABzlMAAz4WTMMAAz4WTJ8AAz4WTIMAAz4W8h8AAz4W8iMAAz4VdwADPhYLQwADPhbx5wADPhYMXwADPhYEnwADPhZMuwADPhZMvwADPhZMXwADPhZMtwADPhZszwADPhbcjwADPhYChwADPhZHiwADPhYO8wADPhZMqwADPhYMSwADPhYCfwADPhZMiwADPhZMewADPhYFlwADPhZMjwADPhZMpwADPhZMswADPhZMhwADPhU/AAM+FgJnAAM+FnZbAAM+FvInAAM+FgKLAAM+FgK7AAM+Fg3bAAM+FlabAAM+FrhXAAM+Fk+LAAM+Fk+XAAM+FgP/AAM+FvIvAAM+FmmnAAM95mBTAAM+zgtLAAM+zgXnAAM2SwABz6cAAz7aYEMAAz7dEwADPt4CywADPt8AAjSHAAM+6wABzlMAAz7e8gsAAz7aYE8AAz73AAGl/wADPtpgWwADPvwDAAM2SwABz6sAAz8GYFsAAz8IAwADPwZgTwADPxMAAaX/AAM/Eo9bAAM/EghLAAM/EmAHAAM/EVcAAz8SC0sAAz8SBecAAz8SAtsAAz8GYEMAAz83AAI0hwADPzsAAc5TAAM/NkzDAAM/NkyfAAM/NkyDAAM/NvIfAAM/NvIjAAM/NXcAAz82C0MAAz828ecAAz82DF8AAz82BJ8AAz82TLsAAz82TL8AAz82TF8AAz82TLcAAz82bM8AAz823I8AAz82AocAAz82R4sAAz82DvMAAz82TKsAAz82DEsAAz82An8AAz82TIsAAz82THsAAz82BZcAAz82TI8AAz82TKcAAz82TLMAAz82TIcAAz81PwADPzYCZwADPzZ2WwADPzbyJwADPzYCiwADPzYCuwADPzYN2wADPzZWmwADPza4VwADPzZPiwADPzZPlwADPzYD/wADPzbyLwADPzZppwADPwZgUwADP+4LSwADP+4F5wADNksAAc+vAAM/+mBDAAM//RMAAz/+AssAAz//AAI0hwADQAsAAc5TAAM//vILAAM/+mBPAANAFwABpf8AAz/6YFsAA0AcAwADNksAAc+zAANAJmBbAANAKAMAA0AmYE8AA0AzAAGl/wADQDKPWwADQDIISwADQDJgBwADQDFXAANAMgtLAANAMgXnAANAMgLbAANAJmBDAANAVwACNIcAA0BbAAHOUwADQFZMwwADQFZMnwADQFZMgwADQFbyHwADQFbyIwADQFV3AANAVgtDAANAVvHnAANAVgxfAANAVgSfAANAVky7AANAVky/AANAVkxfAANAVky3AANAVmzPAANAVtyPAANAVgKHAANAVkeLAANAVg7zAANAVkyrAANAVgxLAANAVgJ/AANAVkyLAANAVkx7AANAVgWXAANAVkyPAANAVkynAANAVkyzAANAVkyHAANAVT8AA0BWAmcAA0BWdlsAA0BW8icAA0BWAosAA0BWArsAA0BWDdsAA0BWVpsAA0BWuFcAA0BWT4sAA0BWT5cAA0BWA/8AA0BW8i8AA0BWaacAA0AmYFMAA0EOC0sAA0EOBecAAzZLAAHPtwADQRpgQwADQR0TAANBHgLLAANBHgxfAANBHwACNIcAA0EvAAHOUwADQS8AAc+7AANBLwABz78AA0Ee8gsAA0EaYE8AA0FDAAGl/wADQRpgWwADQUgDAAM2SwABz8MAA0FSYFsAA0FUAwADQVJgTwADQV8AAaX/AANBXo9bAANBXghLAANBXmAHAANBXVcAA0FeC0sAA0FeBecAA0FeAtsAA0FSYEMAA0GDAAI0hwADQYcAAc5TAANBgkzDAANBgkyfAANBgkyDAANBgvIfAANBgvIjAANBgXcAA0GCC0MAA0GC8ecAA0GCDF8AA0GCBJ8AA0GCTLsAA0GCTL8AA0GCTF8AA0GCTLcAA0GCbM8AA0GC3I8AA0GCAocAA0GCR4sAA0GCDvMAA0GCTKsAA0GCDEsAA0GCAn8AA0GCTIsAA0GCTHsAA0GCBZcAA0GCTI8AA0GCTKcAA0GCTLMAA0GCTIcAA0GBPwADQYICZwADQYJ2WwADQYLyJwADQYICiwADQYICuwADQYIN2wADQYJWmwADQYK4VwADQYJPiwADQYJPlwADQYID/wADQYLyLwADQYJppwADQVJgUwADQjoLSwADQjoF5wADNksAAc/HAANCRmBDAANCSRMAA0JKAssAA0JKDF8AA0JLAAI0hwADQlsAAc5TAANCWwABz8sAA0JbAAHPzwADQkryCwADQkZgTwADQm8AAaX/AANCRmBbAANCdAMAAzZLAAHP0wADQn5gWwADQoADAANCfmBPAANCiwABpf8AA0KKj1sAA0KKCEsAA0KKYAcAA0KJVwADQooLSwADQooF5wADQooC2wADQn5gQwADQq8AAjSHAANCswABzlMAA0KuTMMAA0KuTJ8AA0KuTIMAA0Ku8h8AA0Ku8iMAA0KtdwADQq4LQwADQq7x5wADQq4MXwADQq4EnwADQq5MuwADQq5MvwADQq5MXwADQq5MtwADQq5szwADQq7cjwADQq4ChwADQq5HiwADQq4O8wADQq5MqwADQq4MSwADQq4CfwADQq5MiwADQq5MewADQq4FlwADQq5MjwADQq5MpwADQq5MswADQq5MhwADQq0/AANCrgJnAANCrnZbAANCrvInAANCrgKLAANCrgK7AANCrg3bAANCrlabAANCrrhXAANCrk+LAANCrk+XAANCrgP/AANCrvIvAANCrmmnAANCfmBTAANDZgtLAANDZgXnAAM2SwABz9cAA0NyYEMAA0N1EwADQ3YCywADQ3cAAjSHAANDgwABzlMAA0ODAAHP2wADQ4MAAc/fAANDdvILAANDcmBPAANDlwABpf8AA0NyYFsAA0OcAwADNksAAc/jAANDpmBbAANDqAMAA0OmYE8AA0OzAAGl/wADQ7KPWwADQ7IISwADQ7JgBwADQ7FXAANDsgtLAANDsgXnAANDsgLbAANDpmBDAAND1wACNIcAA0PbAAHOUwADQ9ZMwwADQ9ZMnwADQ9ZMgwADQ9byHwADQ9byIwADQ9V3AAND1gtDAAND1vHnAAND1gxfAAND1gSfAAND1ky7AAND1ky/AAND1kxfAAND1ky3AAND1mzPAAND1tyPAAND1gKHAAND1keLAAND1g7zAAND1kyrAAND1gxLAAND1gJ/AAND1kyLAAND1kx7AAND1gWXAAND1kyPAAND1kynAAND1kyzAAND1kyHAAND1T8AA0PWAmcAA0PWdlsAA0PW8icAA0PWAosAA0PWArsAA0PWDdsAA0PWVpsAA0PWuFcAA0PWT4sAA0PWT5cAA0PWA/8AA0PW8i8AA0PWaacAA0OmYFMAA0SOC0sAA0SOBecAAzZLAAHP5wADRJpgQwADRJ0TAANEngLLAANEnwACNIcAA0SrAAHOUwADRKsAAc/rAANEqwABz+8AA0Se8gsAA0SaYE8AA0S/AAGl/wADRJpgWwADRMQDAAM2SwABz/MAA0TOYFsAA0TQAwADRM5gTwADRNsAAaX/AANE2o9bAANE2ghLAANE2mAHAANE2VcAA0TaC0sAA0TaBecAA0TaAtsAA0TOYEMAA0T/AAI0hwADRQMAAc5TAANE/kzDAANE/kyfAANE/kyDAANE/vIfAANE/vIjAANE/XcAA0T+C0MAA0T+8ecAA0T+DF8AA0T+BJ8AA0T+TLsAA0T+TL8AA0T+TF8AA0T+TLcAA0T+bM8AA0T+3I8AA0T+AocAA0T+R4sAA0T+DvMAA0T+TKsAA0T+DEsAA0T+An8AA0T+TIsAA0T+THsAA0T+BZcAA0T+TI8AA0T+TKcAA0T+TLMAA0T+TIcAA0T9PwADRP4CZwADRP52WwADRP7yJwADRP4CiwADRP4CuwADRP4N2wADRP5WmwADRP64VwADRP5PiwADRP5PlwADRP4D/wADRP7yLwADRP5ppwADRM5gUwADRbYLSwADRbYF5wADNksAAc/3AANFwmBDAANFxRMAA0XGAssAA0XHAAI0hwADRdMAAc5TAANF0wABz/sAA0XTAAHP/wADRcbyCwADRcJgTwADRecAAaX/AANFwmBbAANF7AMAAzZLAAHQAwADRfZgWwADRfgDAANF9mBPAANGAwABpf8AA0YCj1sAA0YCCEsAA0YCYAcAA0YBVwADRgILSwADRgIF5wADRgIC2wADRfZgQwADRicAAjSHAANGKwABzlMAA0YmTMMAA0YmTJ8AA0YmTIMAA0Ym8h8AA0Ym8iMAA0YldwADRiYLQwADRibx5wADRiYMXwADRiYEnwADRiZMuwADRiZMvwADRiZMXwADRiZMtwADRiZszwADRibcjwADRiYChwADRiZHiwADRiYO8wADRiZMqwADRiYMSwADRiYCfwADRiZMiwADRiZMewADRiYFlwADRiZMjwADRiZMpwADRiZMswADRiZMhwADRiU/AANGJgJnAANGJnZbAANGJvInAANGJgKLAANGJgK7AANGJg3bAANGJlabAANGJrhXAANGJk+LAANGJk+XAANGJgP/AANGJvIvAANGJmmnAANF9mBTAANG3gtLAANG3gXnAAM2SwAB0AcAA0bqYEMAA0btEwADRu4CywADRu8AAjSHAANG+wABzlMAA0b7AAHQCwADRvsAAdAPAANG7vILAANG6mBPAANHDwABpf8AA0bqYFsAA0cUAwADNksAAdATAANHHmBbAANHIAMAA0ceYE8AA0crAAGl/wADRyqPWwADRyoISwADRypgBwADRylXAANHKgtLAANHKgXnAANHKgLbAANHHmBDAANHTwACNIcAA0dTAAHOUwADR05MwwADR05MnwADR05MgwADR07yHwADR07yIwADR013AANHTgtDAANHTvHnAANHTgxfAANHTgSfAANHTky7AANHTky/AANHTkxfAANHTky3AANHTmzPAANHTtyPAANHTgKHAANHTkeLAANHTg7zAANHTkyrAANHTgxLAANHTgJ/AANHTkyLAANHTkx7AANHTgWXAANHTkyPAANHTkynAANHTkyzAANHTkyHAANHTT8AA0dOAmcAA0dOdlsAA0dO8icAA0dOAosAA0dOArsAA0dODdsAA0dOVpsAA0dOuFcAA0dOT4sAA0dOT5cAA0dOA/8AA0dO8i8AA0dOaacAA0ceYFMAA0gGC0sAA0gGBecAAzZLAAHQFwADSBJgQwADSBUTAANIFgLLAANIFwACNIcAA0gjAAHOUwADSCMAAdAbAANIIwAB0B8AA0gW8gsAA0gSYE8AA0g3AAGl/wADSBJgWwADSDwDAAM2SwAB0CMAA0hGYFsAA0hIAwADSEZgTwADSFMAAaX/AANIUo9bAANIUghLAANIUmAHAANIUVcAA0hSC0sAA0hSBecAA0hSAtsAA0hGYEMAA0h3AAI0hwADSHsAAc5TAANIdkzDAANIdkyfAANIdkyDAANIdvIfAANIdvIjAANIdXcAA0h2C0MAA0h28ecAA0h2DF8AA0h2BJ8AA0h2TLsAA0h2TL8AA0h2TF8AA0h2TLcAA0h2bM8AA0h23I8AA0h2AocAA0h2R4sAA0h2DvMAA0h2TKsAA0h2DEsAA0h2An8AA0h2TIsAA0h2THsAA0h2BZcAA0h2TI8AA0h2TKcAA0h2TLMAA0h2TIcAA0h1PwADSHYCZwADSHZ2WwADSHbyJwADSHYCiwADSHYCuwADSHYN2wADSHZWmwADSHa4VwADSHZPiwADSHZPlwADSHYD/wADSHbyLwADSHZppwADSEZgUwADSS4LSwADSS4F5wADNksAAdAnAANJOmBDAANJPRMAA0k+AssAA0k/AAI0hwADSUsAAc5TAANJSwAB0CsAA0lLAAHQLwADST7yCwADSTpgTwADSV8AAaX/AANJOmBbAANJZAMAAzZLAAHQMwADSW5gWwADSXADAANJbmBPAANJewABpf8AA0l6j1sAA0l6CEsAA0l6YAcAA0l5VwADSXoLSwADSXoF5wADSXoC2wADSW5gQwADSZ8AAjSHAANJowABzlMAA0meTMMAA0meTJ8AA0meTIMAA0me8h8AA0me8iMAA0mddwADSZ4LQwADSZ7x5wADSZ4MXwADSZ4EnwADSZ5MuwADSZ5MvwADSZ5MXwADSZ5MtwADSZ5szwADSZ7cjwADSZ4ChwADSZ5HiwADSZ4O8wADSZ5MqwADSZ4MSwADSZ4CfwADSZ5MiwADSZ5MewADSZ4FlwADSZ5MjwADSZ5MpwADSZ5MswADSZ5MhwADSZ0/AANJngJnAANJnnZbAANJnvInAANJngKLAANJngK7AANJng3bAANJnlabAANJnrhXAANJnk+LAANJnk+XAANJngP/AANJnvIvAANJnmmnAANJbmBTAANKVgtLAANKVgXnAAM2SwAB0DcAA0piYEMAA0plEwADSmYCywADSmcAAjSHAANKcwABzlMAA0pzAAHQOwADSnMAAdA/AANKZvILAANKYmBPAANKhwABpf8AA0piYFsAA0qMAwADNksAAdBDAANKlmBbAANKmAMAA0qWYE8AA0qjAAGl/wADSqKPWwADSqIISwADSqJgBwADSqFXAANKogtLAANKogXnAANKogLbAANKlmBDAANKxwACNIcAA0rLAAHOUwADSsZMwwADSsZMnwADSsZMgwADSsbyHwADSsbyIwADSsV3AANKxgtDAANKxvHnAANKxgxfAANKxgSfAANKxky7AANKxky/AANKxkxfAANKxky3AANKxmzPAANKxtyPAANKxgKHAANKxkeLAANKxg7zAANKxkyrAANKxgxLAANKxgJ/AANKxkyLAANKxkx7AANKxgWXAANKxkyPAANKxkynAANKxkyzAANKxkyHAANKxT8AA0rGAmcAA0rGdlsAA0rG8icAA0rGAosAA0rGArsAA0rGDdsAA0rGVpsAA0rGuFcAA0rGT4sAA0rGT5cAA0rGA/8AA0rG8i8AA0rGaacAA0qWYFMAA0t+C0sAA0t+BecAAzZLAAHQRwADS4pgQwADS40TAANLjgLLAANLjwACNIcAA0ubAAHOUwADS5sAAdBLAANLmwAB0E8AA0uO8gsAA0uKYE8AA0uvAAGl/wADS4pgWwADS7QDAAM2SwAB0FMAA0u+YFsAA0vAAwADS75gTwADS8sAAaX/AANLyo9bAANLyghLAANLymAHAANLyVcAA0vKC0sAA0vKBecAA0vKAtsAA0u+YEMAA0vvAAI0hwADS/MAAc5TAANL7kzDAANL7kyfAANL7kyDAANL7vIfAANL7vIjAANL7XcAA0vuC0MAA0vu8ecAA0vuDF8AA0vuBJ8AA0vuTLsAA0vuTL8AA0vuTF8AA0vuTLcAA0vubM8AA0vu3I8AA0vuAocAA0vuR4sAA0vuDvMAA0vuTKsAA0vuDEsAA0vuAn8AA0vuTIsAA0vuTHsAA0vuBZcAA0vuTI8AA0vuTKcAA0vuTLMAA0vuTIcAA0vtPwADS+4CZwADS+52WwADS+7yJwADS+4CiwADS+4CuwADS+4N2wADS+5WmwADS+64VwADS+5PiwADS+5PlwADS+4D/wADS+7yLwADS+5ppwADS75gUwADTKYLSwADTKYF5wADNksAAdBXAANMsmBDAANMtRMAA0y2AssAA0y3AAI0hwADTMMAAc5TAANMwwAB0FsAA0zDAAHQXwADTLbyCwADTLJgTwADTNcAAaX/AANMsmBbAANM3AMAAzZLAAHQYwADTOZgWwADTOgDAANM5mBPAANM8wABpf8AA0zyj1sAA0zyCEsAA0zyYAcAA0zxVwADTPILSwADTPIF5wADTPIC2wADTOZgQwADTRcAAjSHAANNGwABzlMAA00WTMMAA00WTJ8AA00WTIMAA00W8h8AA00W8iMAA00VdwADTRYLQwADTRbx5wADTRYMXwADTRYEnwADTRZMuwADTRZMvwADTRZMXwADTRZMtwADTRZszwADTRbcjwADTRYChwADTRZHiwADTRYO8wADTRZMqwADTRYMSwADTRYCfwADTRZMiwADTRZMewADTRYFlwADTRZMjwADTRZMpwADTRZMswADTRZMhwADTRU/AANNFgJnAANNFnZbAANNFvInAANNFgKLAANNFgK7AANNFg3bAANNFlabAANNFrhXAANNFk+LAANNFk+XAANNFgP/AANNFvIvAANNFmmnAANM5mBTAANNzgtLAANNzgXnAAM2SwAB0GcAA03aYEMAA03dEwADTd4CywADTd8AAjSHAANN6wABzlMAA03e8gsAA03aYE8AA033AAGl/wADTdpgWwADTfwDAAM2SwAB0GsAA04GYFsAA04IAwADTgZgTwADThMAAaX/AANOEo9bAANOEghLAANOEmAHAANOEVcAA04SC0sAA04SBecAA04SAtsAA04GYEMAA043AAI0hwADTjsAAc5TAANONkzDAANONkyfAANONkyDAANONvIfAANONvIjAANONXcAA042C0MAA0428ecAA042DF8AA042BJ8AA042TLsAA042TL8AA042TF8AA042TLcAA042bM8AA0423I8AA042AocAA042R4sAA042DvMAA042TKsAA042DEsAA042An8AA042TIsAA042THsAA042BZcAA042TI8AA042TKcAA042TLMAA042TIcAA041PwADTjYCZwADTjZ2WwADTjbyJwADTjYCiwADTjYCuwADTjYN2wADTjZWmwADTja4VwADTjZPiwADTjZPlwADTjYD/wADTjbyLwADTjZppwADTgZgUwADTu4LSwADTu4F5wADNksAAdBvAANO+mBDAANO/RMAA07+AssAA07/AAI0hwADTwsAAc5TAANO/vILAANO+mBPAANPFwABpf8AA076YFsAA08cAwADNksAAdBzAANPJmBbAANPKAMAA08mYE8AA08zAAGl/wADTzKPWwADTzIISwADTzJgBwADTzFXAANPMgtLAANPMgXnAANPMgLbAANPJmBDAANPVwACNIcAA09bAAHOUwADT1ZMwwADT1ZMnwADT1ZMgwADT1byHwADT1byIwADT1V3AANPVgtDAANPVvHnAANPVgxfAANPVgSfAANPVky7AANPVky/AANPVkxfAANPVky3AANPVmzPAANPVtyPAANPVgKHAANPVkeLAANPVg7zAANPVkyrAANPVgxLAANPVgJ/AANPVkyLAANPVkx7AANPVgWXAANPVkyPAANPVkynAANPVkyzAANPVkyHAANPVT8AA09WAmcAA09WdlsAA09W8icAA09WAosAA09WArsAA09WDdsAA09WVpsAA09WuFcAA09WT4sAA09WT5cAA09WA/8AA09W8i8AA09WaacAA08mYFMAA1AOC0sAA1AOBecAAzZLAAHQdwADUBpgQwADUB0TAANQHgLLAANQHwACNIcAA1ArAAHOUwADUB7yCwADUBpgTwADUDcAAaX/AANQGmBbAANQPAMAAzZLAAHQewADUEZgWwADUEgDAANQRmBPAANQUwABpf8AA1BSj1sAA1BSCEsAA1BSYAcAA1BRVwADUFILSwADUFIF5wADUFIC2wADUEZgQwADUHcAAjSHAANQewABzlMAA1B2TMMAA1B2TJ8AA1B2TIMAA1B28h8AA1B28iMAA1B1dwADUHYLQwADUHbx5wADUHYMXwADUHYEnwADUHZMuwADUHZMvwADUHZMXwADUHZMtwADUHZszwADUHbcjwADUHYChwADUHZHiwADUHYO8wADUHZMqwADUHYMSwADUHYCfwADUHZMiwADUHZMewADUHYFlwADUHZMjwADUHZMpwADUHZMswADUHZMhwADUHU/AANQdgJnAANQdnZbAANQdvInAANQdgKLAANQdgK7AANQdg3bAANQdlabAANQdrhXAANQdk+LAANQdk+XAANQdgP/AANQdvIvAANQdmmnAANQRmBTAANRLgtLAANRLgXnAAM2SwAB0H8AA1E6YEMAA1E9EwADUT4CywADUT8AAjSHAANRSwABzlMAA1FLAAHPuwADUUsAAc+/AANRPvILAANROmBPAANRXwABpf8AA1E6YFsAA1FkAwADNksAAdCDAANRbmBbAANRcAMAA1FuYE8AA1F7AAGl/wADUXqPWwADUXoISwADUXpgBwADUXlXAANRegtLAANRegXnAANRegLbAANRbmBDAANRnwACNIcAA1GjAAHOUwADUZ5MwwADUZ5MnwADUZ5MgwADUZ7yHwADUZ7yIwADUZ13AANRngtDAANRnvHnAANRngxfAANRngSfAANRnky7AANRnky/AANRnkxfAANRnky3AANRnmzPAANRntyPAANRngKHAANRnkeLAANRng7zAANRnkyrAANRngxLAANRngJ/AANRnkyLAANRnkx7AANRngWXAANRnkyPAANRnkynAANRnkyzAANRnkyHAANRnT8AA1GeAmcAA1GedlsAA1Ge8icAA1GeAosAA1GeArsAA1GeDdsAA1GeVpsAA1GeuFcAA1GeT4sAA1GeT5cAA1GeA/8AA1Ge8i8AA1GeaacAA1FuYFMAA1JWC0sAA1JWBecAAzZLAAHQhwADUmJgQwADUmUTAANSZgLLAANSZwACNIcAA1JzAAHOUwADUnMAAc/LAANScwABz88AA1Jm8gsAA1JiYE8AA1KHAAGl/wADUmJgWwADUowDAAM2SwAB0IsAA1KWYFsAA1KYAwADUpZgTwADUqMAAaX/AANSoo9bAANSoghLAANSomAHAANSoVcAA1KiC0sAA1KiBecAA1KiAtsAA1KWYEMAA1LHAAI0hwADUssAAc5TAANSxkzDAANSxkyfAANSxkyDAANSxvIfAANSxvIjAANSxXcAA1LGC0MAA1LG8ecAA1LGDF8AA1LGBJ8AA1LGTLsAA1LGTL8AA1LGTF8AA1LGTLcAA1LGbM8AA1LG3I8AA1LGAocAA1LGR4sAA1LGDvMAA1LGTKsAA1LGDEsAA1LGAn8AA1LGTIsAA1LGTHsAA1LGBZcAA1LGTI8AA1LGTKcAA1LGTLMAA1LGTIcAA1LFPwADUsYCZwADUsZ2WwADUsbyJwADUsYCiwADUsYCuwADUsYN2wADUsZWmwADUsa4VwADUsZPiwADUsZPlwADUsYD/wADUsbyLwADUsZppwADUpZgUwADU34LSwADU34F5wADNksAAdCPAANTimBDAANTjRMAA1OOAssAA1OPAAI0hwADU5sAAc5TAANTmwABz9sAA1ObAAHP3wADU47yCwADU4pgTwADU68AAaX/AANTimBbAANTtAMAAzZLAAHQkwADU75gWwADU8ADAANTvmBPAANTywABpf8AA1PKj1sAA1PKCEsAA1PKYAcAA1PJVwADU8oLSwADU8oF5wADU8oC2wADU75gQwADU+8AAjSHAANT8wABzlMAA1PuTMMAA1PuTJ8AA1PuTIMAA1Pu8h8AA1Pu8iMAA1PtdwADU+4LQwADU+7x5wADU+4MXwADU+4EnwADU+5MuwADU+5MvwADU+5MXwADU+5MtwADU+5szwADU+7cjwADU+4ChwADU+5HiwADU+4O8wADU+5MqwADU+4MSwADU+4CfwADU+5MiwADU+5MewADU+4FlwADU+5MjwADU+5MpwADU+5MswADU+5MhwADU+0/AANT7gJnAANT7nZbAANT7vInAANT7gKLAANT7gK7AANT7g3bAANT7labAANT7rhXAANT7k+LAANT7k+XAANT7gP/AANT7vIvAANT7mmnAANTvmBTAANUpgtLAANUpgXnAAM2SwAB0JcAA1SyYEMAA1S1EwADVLYCywADVLcAAjSHAANUwwABzlMAA1TDAAHP6wADVMMAAc/vAANUtvILAANUsmBPAANU1wABpf8AA1SyYFsAA1TcAwADNksAAdCbAANU5mBbAANU6AMAA1TmYE8AA1TzAAGl/wADVPKPWwADVPIISwADVPJgBwADVPFXAANU8gtLAANU8gXnAANU8gLbAANU5mBDAANVFwACNIcAA1UbAAHOUwADVRZMwwADVRZMnwADVRZMgwADVRbyHwADVRbyIwADVRV3AANVFgtDAANVFvHnAANVFgxfAANVFgSfAANVFky7AANVFky/AANVFkxfAANVFky3AANVFmzPAANVFtyPAANVFgKHAANVFkeLAANVFg7zAANVFkyrAANVFgxLAANVFgJ/AANVFkyLAANVFkx7AANVFgWXAANVFkyPAANVFkynAANVFkyzAANVFkyHAANVFT8AA1UWAmcAA1UWdlsAA1UW8icAA1UWAosAA1UWArsAA1UWDdsAA1UWVpsAA1UWuFcAA1UWT4sAA1UWT5cAA1UWA/8AA1UW8i8AA1UWaacAA1TmYFMAA1XOC0sAA1XOBecAAzZLAAHQnwADVdpgQwADVd0TAANV3gLLAANV3wACNIcAA1XrAAHOUwADVesAAc/7AANV6wABz/8AA1Xe8gsAA1XaYE8AA1X/AAGl/wADVdpgWwADVgQDAAM2SwAB0KMAA1YOYFsAA1YQAwADVg5gTwADVhsAAaX/AANWGo9bAANWGghLAANWGmAHAANWGVcAA1YaC0sAA1YaBecAA1YaAtsAA1YOYEMAA1Y/AAI0hwADVkMAAc5TAANWPkzDAANWPkyfAANWPkyDAANWPvIfAANWPvIjAANWPXcAA1Y+C0MAA1Y+8ecAA1Y+DF8AA1Y+BJ8AA1Y+TLsAA1Y+TL8AA1Y+TF8AA1Y+TLcAA1Y+bM8AA1Y+3I8AA1Y+AocAA1Y+R4sAA1Y+DvMAA1Y+TKsAA1Y+DEsAA1Y+An8AA1Y+TIsAA1Y+THsAA1Y+BZcAA1Y+TI8AA1Y+TKcAA1Y+TLMAA1Y+TIcAA1Y9PwADVj4CZwADVj52WwADVj7yJwADVj4CiwADVj4CuwADVj4N2wADVj5WmwADVj64VwADVj5PiwADVj5PlwADVj4D/wADVj7yLwADVj5ppwADVg5gUwADVvYLSwADVvYF5wADNksAAdCnAANXAmBDAANXBRMAA1cGAssAA1cHAAI0hwADVxMAAc5TAANXEwAB0AsAA1cTAAHQDwADVwbyCwADVwJgTwADVycAAaX/AANXAmBbAANXLAMAAzZLAAHQqwADVzZgWwADVzgDAANXNmBPAANXQwABpf8AA1dCj1sAA1dCCEsAA1dCYAcAA1dBVwADV0ILSwADV0IF5wADV0IC2wADVzZgQwADV2cAAjSHAANXawABzlMAA1dmTMMAA1dmTJ8AA1dmTIMAA1dm8h8AA1dm8iMAA1dldwADV2YLQwADV2bx5wADV2YMXwADV2YEnwADV2ZMuwADV2ZMvwADV2ZMXwADV2ZMtwADV2ZszwADV2bcjwADV2YChwADV2ZHiwADV2YO8wADV2ZMqwADV2YMSwADV2YCfwADV2ZMiwADV2ZMewADV2YFlwADV2ZMjwADV2ZMpwADV2ZMswADV2ZMhwADV2U/AANXZgJnAANXZnZbAANXZvInAANXZgKLAANXZgK7AANXZg3bAANXZlabAANXZrhXAANXZk+LAANXZk+XAANXZgP/AANXZvIvAANXZmmnAANXNmBTAANYHgtLAANYHgXnAAM2SwAB0K8AA1gqYEMAA1gtEwADWC4CywADWC8AAjSHAANYOwABzlMAA1g7AAHQGwADWDsAAdAfAANYLvILAANYKmBPAANYTwABpf8AA1gqYFsAA1hUAwADNksAAdCzAANYXmBbAANYYAMAA1heYE8AA1hrAAGl/wADWGqPWwADWGoISwADWGpgBwADWGlXAANYagtLAANYagXnAANYagLbAANYXmBDAANYjwACNIcAA1iTAAHOUwADWI5MwwADWI5MnwADWI5MgwADWI7yHwADWI7yIwADWI13AANYjgtDAANYjvHnAANYjgxfAANYjgSfAANYjky7AANYjky/AANYjkxfAANYjky3AANYjmzPAANYjtyPAANYjgKHAANYjkeLAANYjg7zAANYjkyrAANYjgxLAANYjgJ/AANYjkyLAANYjkx7AANYjgWXAANYjkyPAANYjkynAANYjkyzAANYjkyHAANYjT8AA1iOAmcAA1iOdlsAA1iO8icAA1iOAosAA1iOArsAA1iODdsAA1iOVpsAA1iOuFcAA1iOT4sAA1iOT5cAA1iOA/8AA1iO8i8AA1iOaacAA1heYFMAA1lGC0sAA1lGBecAAzZLAAHQtwADWVJgQwADWVUTAANZVgLLAANZVwACNIcAA1ljAAHOUwADWWMAAdArAANZYwAB0C8AA1lW8gsAA1lSYE8AA1l3AAGl/wADWVJgWwADWXwDAAM2SwAB0LsAA1mGYFsAA1mIAwADWYZgTwADWZMAAaX/AANZko9bAANZkghLAANZkmAHAANZkVcAA1mSC0sAA1mSBecAA1mSAtsAA1mGYEMAA1m3AAI0hwADWbsAAc5TAANZtkzDAANZtkyfAANZtkyDAANZtvIfAANZtvIjAANZtXcAA1m2C0MAA1m28ecAA1m2DF8AA1m2BJ8AA1m2TLsAA1m2TL8AA1m2TF8AA1m2TLcAA1m2bM8AA1m23I8AA1m2AocAA1m2R4sAA1m2DvMAA1m2TKsAA1m2DEsAA1m2An8AA1m2TIsAA1m2THsAA1m2BZcAA1m2TI8AA1m2TKcAA1m2TLMAA1m2TIcAA1m1PwADWbYCZwADWbZ2WwADWbbyJwADWbYCiwADWbYCuwADWbYN2wADWbZWmwADWba4VwADWbZPiwADWbZPlwADWbYD/wADWbbyLwADWbZppwADWYZgUwADWm4LSwADWm4F5wADNksAAdC/AANaemBDAANafRMAA1p+AssAA1p/AAI0hwADWosAAc5TAANaiwAB0DsAA1qLAAHQPwADWn7yCwADWnpgTwADWp8AAaX/AANaemBbAANapAMAAzZLAAHQwwADWq5gWwADWrADAANarmBPAANauwABpf8AA1q6j1sAA1q6CEsAA1q6YAcAA1q5VwADWroLSwADWroF5wADWroC2wADWq5gQwADWt8AAjSHAANa4wABzlMAA1reTMMAA1reTJ8AA1reTIMAA1re8h8AA1re8iMAA1rddwADWt4LQwADWt7x5wADWt4MXwADWt4EnwADWt5MuwADWt5MvwADWt5MXwADWt5MtwADWt5szwADWt7cjwADWt4ChwADWt5HiwADWt4O8wADWt5MqwADWt4MSwADWt4CfwADWt5MiwADWt5MewADWt4FlwADWt5MjwADWt5MpwADWt5MswADWt5MhwADWt0/AANa3gJnAANa3nZbAANa3vInAANa3gKLAANa3gK7AANa3g3bAANa3labAANa3rhXAANa3k+LAANa3k+XAANa3gP/AANa3vIvAANa3mmnAANarmBTAANblgtLAANblgXnAAM2SwAB0McAA1uiYEMAA1ulEwADW6YCywADW6cAAjSHAANbswABzlMAA1uzAAHQSwADW7MAAdBPAANbpvILAANbomBPAANbxwABpf8AA1uiYFsAA1vMAwADNksAAdDLAANb1mBbAANb2AMAA1vWYE8AA1vjAAGl/wADW+KPWwADW+IISwADW+JgBwADW+FXAANb4gtLAANb4gXnAANb4gLbAANb1mBDAANcBwACNIcAA1wLAAHOUwADXAZMwwADXAZMnwADXAZMgwADXAbyHwADXAbyIwADXAV3AANcBgtDAANcBvHnAANcBgxfAANcBgSfAANcBky7AANcBky/AANcBkxfAANcBky3AANcBmzPAANcBtyPAANcBgKHAANcBkeLAANcBg7zAANcBkyrAANcBgxLAANcBgJ/AANcBkyLAANcBkx7AANcBgWXAANcBkyPAANcBkynAANcBkyzAANcBkyHAANcBT8AA1wGAmcAA1wGdlsAA1wG8icAA1wGAosAA1wGArsAA1wGDdsAA1wGVpsAA1wGuFcAA1wGT4sAA1wGT5cAA1wGA/8AA1wG8i8AA1wGaacAA1vWYFMAA1y+C0sAA1y+BecAAzZLAAHQzwADXMpgQwADXM0TAANczgLLAANczwACNIcAA1zbAAHOUwADXNsAAdBbAANc2wAB0F8AA1zO8gsAA1zKYE8AA1zvAAGl/wADXMpgWwADXPQDAAM2SwAB0NMAA1z+YEMAA10BdwADXQIFWwADXQIFBwADXQIM+wADXQEnAANdAkoPAANdAwAB0O8AA10CSecAA10DAAHQ+wADXQL6iwADXQMAAdEHAANdAwAB0Q8AA10CXSMAA10DAAHRGwADXQLx5wADXQMAAdE/AANdAwAB0UsAA10DAAHRUwADXQMAAdFbAANdAwAB0WMAA10Cbd8AA10DAAEaBwADXQMAAcnbAANdAwAB0XcAA10DAAHRfwADXP5gTwADXWoMwwADXWrOHwADXWsAARWDAANdawABlUcAA11rAAHRMwADXP5gWwADXYADAAM2SwAB0YcAA12KYEMAA12OA38AA12ODLMAA12ODg8AA12NdwADXY4FBwADXY7x5wADXY8AAdE/AANdjwAB0UsAA12PAAHRUwADXY8AAdFbAANdjwAB0WMAA12PAAHR6wADXY8AAdHzAANdjwAB0fsAA12PAAHSAwADXY6dTwADXYpgTwADXdIMwwADXdLOHwADXdMAARWDAANd0wABlUcAA13TAAHRMwADXdMAAdHLAANd0wAB0dMAA13TAAHR2wADXdMAAdHjAANdimBbAANd+AMAAzZLAAHSDwADXgJgQwADXgV3AANeBgVbAANeBgUHAANeBgz7AANeBScAA14HAAHRDwADXgZdIwADXgcAAdEbAANeBwAB0UsAA14HAAHRUwADXgZt3wADXgcAARoHAANeBwABydsAA14CYE8AA14+DMMAA14+zh8AA14/AAHRMwADXgJgWwADXkwDAAM2SwAB0lMAA15WYEsAA15bAAI0hwADXl8AAdJXAANeXm7zAANeXwABsxsAA15eFcsAA15WYEMAA15xWwADXlZgTwADXnlfAANeVmBbAANegAMAAzZLAAHSWwADXopgTwADXo8AAaSTAANejghLAANejwACNIcAA16bAAHSXwADXo6PWwADXo1rAANeimBbAANeqAMAAzZLAAHScwADXrJgWwADXrQDAANesmBPAANevwABpf8AA16+j1sAA16+CEsAA16+YAcAA169VwADXr4LSwADXr4F5wADXr4C2wADXrJgQwADXuMAAjSHAANe5wABzlMAA17iTMMAA17iTJ8AA17iTIMAA17i8h8AA17i8iMAA17hdwADXuILQwADXuLx5wADXuIMXwADXuIEnwADXuJMuwADXuJMvwADXuJMXwADXuJMtwADXuJszwADXuLcjwADXuIChwADXuJHiwADXuIO8wADXuJMqwADXuIMSwADXuICfwADXuJMiwADXuJMewADXuIFlwADXuJMjwADXuJMpwADXuJMswADXuJMhwADXuE/AANe4gJnAANe4nZbAANe4vInAANe4gKLAANe4gK7AANe4g3bAANe4labAANe4rhXAANe4k+LAANe4k+XAANe4gP/AANe4vIvAANe4mmnAANesmBTAANfmgtLAANfmgXnAAM2SwAB0ncAA1+mYFcAA1+oAwADX6ZgQwADX7ETAANfsgLLAANfswACNIcAA1+/AAHOUwADX7LyCwADX6ZgTwADX8sAAaX/AAM2SwAB0n8AA1/SYFsAA1/UAwADX9JgTwADX98AAaX/AANf3o9bAANf3ghLAANf3mAHAANf3VcAA1/eC0sAA1/eBecAA1/eAtsAA1/SYEMAA2ADAAI0hwADYAcAAc5TAANgAkzDAANgAkyfAANgAkyDAANgAvIfAANgAvIjAANgAXcAA2ACC0MAA2AC8ecAA2ACDF8AA2ACBJ8AA2ACTLsAA2ACTL8AA2ACTF8AA2ACTLcAA2ACbM8AA2AC3I8AA2ACAocAA2ACR4sAA2ACDvMAA2ACTKsAA2ACDEsAA2ACAn8AA2ACTIsAA2ACTHsAA2ACBZcAA2ACTI8AA2ACTKcAA2ACTLMAA2ACTIcAA2ABPwADYAICZwADYAJ2WwADYALyJwADYAICiwADYAICuwADYAIN2wADYAJWmwADYAK4VwADYAJPiwADYAJPlwADYAID/wADYALyLwADYAJppwADX9JgUwADYLoLSwADYLoF5wADNksAAdKDAANgxmBXAANgyAMAA2DGYEMAA2DREwADYNICywADYNMAAjSHAANg3wABzlMAA2DS8gsAA2DGYE8AA2DrAAGl/wADNksAAdKLAANg8mBbAANg9AMAA2DyYE8AA2D/AAGl/wADYP6PWwADYP4ISwADYP5gBwADYP1XAANg/gtLAANg/gXnAANg/gLbAANg8mBDAANhIwACNIcAA2EnAAHOUwADYSJMwwADYSJMnwADYSJMgwADYSLyHwADYSLyIwADYSF3AANhIgtDAANhIvHnAANhIgxfAANhIgSfAANhIky7AANhIky/AANhIkxfAANhIky3AANhImzPAANhItyPAANhIgKHAANhIkeLAANhIg7zAANhIkyrAANhIgxLAANhIgJ/AANhIkyLAANhIkx7AANhIgWXAANhIkyPAANhIkynAANhIkyzAANhIkyHAANhIT8AA2EiAmcAA2EidlsAA2Ei8icAA2EiAosAA2EiArsAA2EiDdsAA2EiVpsAA2EiuFcAA2EiT4sAA2EiT5cAA2EiA/8AA2Ei8i8AA2EiaacAA2DyYFMAA2HaC0sAA2HaBecAAzZLAAHSjwADYeZgVwADYegDAANh5mBDAANh8RMAA2HyAssAA2HzAAI0hwADYf8AAc5TAANh8vILAANh5mBPAANiCwABpf8AAzZLAAHSlwADYhJgWwADYhQDAANiEmBPAANiHwABpf8AA2Iej1sAA2IeCEsAA2IeYAcAA2IdVwADYh4LSwADYh4F5wADYh4C2wADYhJgQwADYkMAAjSHAANiRwABzlMAA2JCTMMAA2JCTJ8AA2JCTIMAA2JC8h8AA2JC8iMAA2JBdwADYkILQwADYkLx5wADYkIMXwADYkIEnwADYkJMuwADYkJMvwADYkJMXwADYkJMtwADYkJszwADYkLcjwADYkIChwADYkJHiwADYkIO8wADYkJMqwADYkIMSwADYkICfwADYkJMiwADYkJMewADYkIFlwADYkJMjwADYkJMpwADYkJMswADYkJMhwADYkE/AANiQgJnAANiQnZbAANiQvInAANiQgKLAANiQgK7AANiQg3bAANiQlabAANiQrhXAANiQk+LAANiQk+XAANiQgP/AANiQvIvAANiQmmnAANiEmBTAANi+gtLAANi+gXnAAM2SwAB0psAA2MGYFcAA2MIAwADYwZgQwADYxETAANjEgLLAANjEgxfAANjEwACNIcAA2MjAAHOUwADYxLyCwADYwZgTwADYy8AAaX/AAM2SwAB0qMAA2M2YFsAA2M4AwADYzZgTwADY0MAAaX/AANjQo9bAANjQghLAANjQmAHAANjQVcAA2NCC0sAA2NCBecAA2NCAtsAA2M2YEMAA2NnAAI0hwADY2sAAc5TAANjZkzDAANjZkyfAANjZkyDAANjZvIfAANjZvIjAANjZXcAA2NmC0MAA2Nm8ecAA2NmDF8AA2NmBJ8AA2NmTLsAA2NmTL8AA2NmTF8AA2NmTLcAA2NmbM8AA2Nm3I8AA2NmAocAA2NmR4sAA2NmDvMAA2NmTKsAA2NmDEsAA2NmAn8AA2NmTIsAA2NmTHsAA2NmBZcAA2NmTI8AA2NmTKcAA2NmTLMAA2NmTIcAA2NlPwADY2YCZwADY2Z2WwADY2byJwADY2YCiwADY2YCuwADY2YN2wADY2ZWmwADY2a4VwADY2ZPiwADY2ZPlwADY2YD/wADY2byLwADY2ZppwADYzZgUwADZB4LSwADZB4F5wADNksAAdKnAANkKmBXAANkLAMAA2QqYEMAA2Q1EwADZDYCywADZDYMXwADZDcAAjSHAANkRwABzlMAA2Q28gsAA2QqYE8AA2RTAAGl/wADNksAAdKvAANkWmBbAANkXAMAA2RaYE8AA2RnAAGl/wADZGaPWwADZGYISwADZGZgBwADZGVXAANkZgtLAANkZgXnAANkZgLbAANkWmBDAANkiwACNIcAA2SPAAHOUwADZIpMwwADZIpMnwADZIpMgwADZIryHwADZIryIwADZIl3AANkigtDAANkivHnAANkigxfAANkigSfAANkiky7AANkiky/AANkikxfAANkiky3AANkimzPAANkityPAANkigKHAANkikeLAANkig7zAANkikyrAANkigxLAANkigJ/AANkikyLAANkikx7AANkigWXAANkikyPAANkikynAANkikyzAANkikyHAANkiT8AA2SKAmcAA2SKdlsAA2SK8icAA2SKAosAA2SKArsAA2SKDdsAA2SKVpsAA2SKuFcAA2SKT4sAA2SKT5cAA2SKA/8AA2SK8i8AA2SKaacAA2RaYFMAA2VCC0sAA2VCBecAAzZLAAHSswADZU5gVwADZVADAANlTmBDAANlWRMAA2VaAssAA2VbAAI0hwADZWcAAc5TAANlWvILAANlTmBPAANlcwABpf8AAzZLAAHSuwADZXpgWwADZXwDAANlemBPAANlhwABpf8AA2WGj1sAA2WGCEsAA2WGYAcAA2WFVwADZYYLSwADZYYF5wADZYYC2wADZXpgQwADZasAAjSHAANlrwABzlMAA2WqTMMAA2WqTJ8AA2WqTIMAA2Wq8h8AA2Wq8iMAA2WpdwADZaoLQwADZarx5wADZaoMXwADZaoEnwADZapMuwADZapMvwADZapMXwADZapMtwADZapszwADZarcjwADZaoChwADZapHiwADZaoO8wADZapMqwADZaoMSwADZaoCfwADZapMiwADZapMewADZaoFlwADZapMjwADZapMpwADZapMswADZapMhwADZak/AANlqgJnAANlqnZbAANlqvInAANlqgKLAANlqgK7AANlqg3bAANlqlabAANlqrhXAANlqk+LAANlqk+XAANlqgP/AANlqvIvAANlqmmnAANlemBTAANmYgtLAANmYgXnAAM2SwAB0r8AA2ZuYFcAA2ZwAwADZm5gQwADZnkTAANmegLLAANmewACNIcAA2aHAAHOUwADZnryCwADZm5gTwADZpMAAaX/AAM2SwAB0scAA2aaYFsAA2acAwADZppgTwADZqcAAaX/AANmpo9bAANmpghLAANmpmAHAANmpVcAA2amC0sAA2amBecAA2amAtsAA2aaYEMAA2bLAAI0hwADZs8AAc5TAANmykzDAANmykyfAANmykyDAANmyvIfAANmyvIjAANmyXcAA2bKC0MAA2bK8ecAA2bKDF8AA2bKBJ8AA2bKTLsAA2bKTL8AA2bKTF8AA2bKTLcAA2bKbM8AA2bK3I8AA2bKAocAA2bKR4sAA2bKDvMAA2bKTKsAA2bKDEsAA2bKAn8AA2bKTIsAA2bKTHsAA2bKBZcAA2bKTI8AA2bKTKcAA2bKTLMAA2bKTIcAA2bJPwADZsoCZwADZsp2WwADZsryJwADZsoCiwADZsoCuwADZsoN2wADZspWmwADZsq4VwADZspPiwADZspPlwADZsoD/wADZsryLwADZspppwADZppgUwADZ4ILSwADZ4IF5wADNksAAdLLAANnjmBXAANnkAMAA2eOYEMAA2eZEwADZ5oCywADZ5sAAjSHAANnpwABzlMAA2ea8gsAA2eOYE8AA2ezAAGl/wADNksAAdLTAANnumBbAANnvAMAA2e6YE8AA2fHAAGl/wADZ8aPWwADZ8YISwADZ8ZgBwADZ8VXAANnxgtLAANnxgXnAANnxgLbAANnumBDAANn6wACNIcAA2fvAAHOUwADZ+pMwwADZ+pMnwADZ+pMgwADZ+ryHwADZ+ryIwADZ+l3AANn6gtDAANn6vHnAANn6gxfAANn6gSfAANn6ky7AANn6ky/AANn6kxfAANn6ky3AANn6mzPAANn6tyPAANn6gKHAANn6keLAANn6g7zAANn6kyrAANn6gxLAANn6gJ/AANn6kyLAANn6kx7AANn6gWXAANn6kyPAANn6kynAANn6kyzAANn6kyHAANn6T8AA2fqAmcAA2fqdlsAA2fq8icAA2fqAosAA2fqArsAA2fqDdsAA2fqVpsAA2fquFcAA2fqT4sAA2fqT5cAA2fqA/8AA2fq8i8AA2fqaacAA2e6YFMAA2iiC0sAA2iiBecAAzZLAAHS1wADaK5gVwADaLADAANormBDAANouRMAA2i6AssAA2i7AAI0hwADaMcAAc5TAANouvILAANormBPAANo0wABpf8AAzZLAAHS3wADaNpgWwADaNwDAANo2mBPAANo5wABpf8AA2jmj1sAA2jmCEsAA2jmYAcAA2jlVwADaOYLSwADaOYF5wADaOYC2wADaNpgQwADaQsAAjSHAANpDwABzlMAA2kKTMMAA2kKTJ8AA2kKTIMAA2kK8h8AA2kK8iMAA2kJdwADaQoLQwADaQrx5wADaQoMXwADaQoEnwADaQpMuwADaQpMvwADaQpMXwADaQpMtwADaQpszwADaQrcjwADaQoChwADaQpHiwADaQoO8wADaQpMqwADaQoMSwADaQoCfwADaQpMiwADaQpMewADaQoFlwADaQpMjwADaQpMpwADaQpMswADaQpMhwADaQk/AANpCgJnAANpCnZbAANpCvInAANpCgKLAANpCgK7AANpCg3bAANpClabAANpCrhXAANpCk+LAANpCk+XAANpCgP/AANpCvIvAANpCmmnAANo2mBTAANpwgtLAANpwgXnAAM2SwAB0uMAA2nOYFcAA2nQAwADac5gQwADadkTAANp2gLLAANp2wACNIcAA2nnAAHOUwADadryCwADac5gTwADafMAAaX/AAM2SwAB0usAA2n6YFsAA2n8AwADafpgTwADagcAAaX/AANqBo9bAANqBghLAANqBmAHAANqBVcAA2oGC0sAA2oGBecAA2oGAtsAA2n6YEMAA2orAAI0hwADai8AAc5TAANqKkzDAANqKkyfAANqKkyDAANqKvIfAANqKvIjAANqKXcAA2oqC0MAA2oq8ecAA2oqDF8AA2oqBJ8AA2oqTLsAA2oqTL8AA2oqTF8AA2oqTLcAA2oqbM8AA2oq3I8AA2oqAocAA2oqR4sAA2oqDvMAA2oqTKsAA2oqDEsAA2oqAn8AA2oqTIsAA2oqTHsAA2oqBZcAA2oqTI8AA2oqTKcAA2oqTLMAA2oqTIcAA2opPwADaioCZwADaip2WwADairyJwADaioCiwADaioCuwADaioN2wADaipWmwADaiq4VwADaipPiwADaipPlwADaioD/wADairyLwADaipppwADafpgUwADauILSwADauIF5wADNksAAdLvAANq7mBXAANq8AMAA2ruYEMAA2r5EwADavoCywADavsAAjSHAANrBwABzlMAA2r68gsAA2ruYE8AA2sTAAGl/wADNksAAdL3AANrGmBbAANrHAMAA2saYE8AA2snAAGl/wADayaPWwADayYISwADayZgBwADayVXAANrJgtLAANrJgXnAANrJgLbAANrGmBDAANrSwACNIcAA2tPAAHOUwADa0pMwwADa0pMnwADa0pMgwADa0ryHwADa0ryIwADa0l3AANrSgtDAANrSvHnAANrSgxfAANrSgSfAANrSky7AANrSky/AANrSkxfAANrSky3AANrSmzPAANrStyPAANrSgKHAANrSkeLAANrSg7zAANrSkyrAANrSgxLAANrSgJ/AANrSkyLAANrSkx7AANrSgWXAANrSkyPAANrSkynAANrSkyzAANrSkyHAANrST8AA2tKAmcAA2tKdlsAA2tK8icAA2tKAosAA2tKArsAA2tKDdsAA2tKVpsAA2tKuFcAA2tKT4sAA2tKT5cAA2tKA/8AA2tK8i8AA2tKaacAA2saYFMAA2wCC0sAA2wCBecAAzZLAAHS+wADbA5gVwADbBADAANsDmBDAANsGRMAA2waAssAA2wbAAI0hwADbCcAAc5TAANsGvILAANsDmBPAANsMwABpf8AAzZLAAHTAwADbDpgWwADbDwDAANsOmBPAANsRwABpf8AA2xGj1sAA2xGCEsAA2xGYAcAA2xFVwADbEYLSwADbEYF5wADbEYC2wADbDpgQwADbGsAAjSHAANsbwABzlMAA2xqTMMAA2xqTJ8AA2xqTIMAA2xq8h8AA2xq8iMAA2xpdwADbGoLQwADbGrx5wADbGoMXwADbGoEnwADbGpMuwADbGpMvwADbGpMXwADbGpMtwADbGpszwADbGrcjwADbGoChwADbGpHiwADbGoO8wADbGpMqwADbGoMSwADbGoCfwADbGpMiwADbGpMewADbGoFlwADbGpMjwADbGpMpwADbGpMswADbGpMhwADbGk/AANsagJnAANsanZbAANsavInAANsagKLAANsagK7AANsag3bAANsalabAANsarhXAANsak+LAANsak+XAANsagP/AANsavIvAANsammnAANsOmBTAANtIgtLAANtIgXnAAM2SwAB0wcAA20uYFcAA20wAwADbS5gQwADbTkTAANtOgLLAANtOwACNIcAA21HAAHOUwADbTryCwADbS5gTwADbVMAAaX/AAM2SwAB0w8AA21aYFsAA21cAwADbVpgTwADbWcAAaX/AANtZo9bAANtZghLAANtZmAHAANtZVcAA21mC0sAA21mBecAA21mAtsAA21aYEMAA22LAAI0hwADbY8AAc5TAANtikzDAANtikyfAANtikyDAANtivIfAANtivIjAANtiXcAA22KC0MAA22K8ecAA22KDF8AA22KBJ8AA22KTLsAA22KTL8AA22KTF8AA22KTLcAA22KbM8AA22K3I8AA22KAocAA22KR4sAA22KDvMAA22KTKsAA22KDEsAA22KAn8AA22KTIsAA22KTHsAA22KBZcAA22KTI8AA22KTKcAA22KTLMAA22KTIcAA22JPwADbYoCZwADbYp2WwADbYryJwADbYoCiwADbYoCuwADbYoN2wADbYpWmwADbYq4VwADbYpPiwADbYpPlwADbYoD/wADbYryLwADbYpppwADbVpgUwADbkILSwADbkIF5wADNksAAdMTAANuTmBXAANuUAMAA25OYEMAA25ZEwADbloCywADblsAAjSHAANuZwABzlMAA25a8gsAA25OYE8AA25zAAGl/wADNksAAdMbAANuemBXAANufAMAA256YE8AA26GCEsAA26HAAGkkwADbocAAaX/AANuhwACNIcAA26XAAHSXwADboaPWwADboVrAANuemBDAANupwAB0yMAA26nAAHTJwADbqcAAdMrAANupwAB0y8AA26nAAHTMwADbqcAAdM3AANupwABAKcAA26nAAEBWwADbqcAAdM7AANupwAB0z8AA26nAAGkqwADbqcAAaSfAANupwAB00MAA26nAAHTRwADbqcAAdNLAANupwAB008AA26nAAHTUwADbqcAAdNXAANupwABAV8AA26nAAEAowADbqcAAdNbAANupwAB018AAzZLAAHTYwADbwJgTwADbwcAAaSTAANvAmBDAANvDl6TAANvDwABzoMAA28PAAHOhwADbw8AAc6PAANvDwABzosAA28PAAHOlwADbw8AAc6TAANvDwABzp8AA28PAAHOmwADbw8AAc6vAANvDwABzqMAA28PAAHOpwADbw8AAc6rAANvDwABzrMAA28PAAGkmwADbwJgWwADb0wDAAM2SwAB02cAA29WYE8AA29bAAGl/wADb1qPWwADb1sAAaSTAANvWghLAANvVmBbAANvbAMAAzZLAAHTawADb3ZgQwADb3l3AANvdmBbAANvgAMAAzZLAAHTbwADb4pgQwADb413AANvimBbAANvlAMAAzZLAAHTcwADb55gSwADb6MAAjSHAANvpwAB03cAA2+jAAHTewADb6MAAdN/AANvog3LAANvnmBbAANvuwACNIcAA2++AqMAAzZLAAHTgwADb8ZgVwADb8sAAjSHAANvzwAB04cAA2/IAwADb8sAAS4rAANvxmBDAANv3wAB0yMAA2/fAAHTJwADb98AAdMrAANv3wAB0y8AA2/fAAHTMwADb98AAdM3AANv3wABAKcAA2/fAAEBWwADb98AAdM7AANv3wAB0z8AA2/fAAGkqwADb98AAaSfAANv3wAB00MAA2/fAAHTRwADb98AAdNLAANv3wAB008AA2/fAAHTUwADb98AAdNXAANv3wABAV8AA2/fAAEAowADNksAAdOPAANwMmBLAANwNwAB05MAA3AyYFcAA3A8AwADcD8AAdObAANwPwABLisAAzZKEisAA3BOYEsAA3BTAAHTkwADcE5gVwADcFgDAANwWwAB05sAA3BbAAEuKwADcE5gQwADcGl3AAM2SwAB06MAA3ByYEsAA3B3AAHTkwADcHJgVwADcHwDAANwfwAB05sAA3B/AAEuKwADNksAAdOrAANwjmBLAANwkwAB05MAA3COYFcAA3CYAwADcJsAAdObAANwmwABLisAAzZK8LcAA3CqYEsAA3CvAAHTkwADcKpgVwADcLQDAANwtwAB05sAA3C3AAEuKwADNksAAcATAANwxmBLAANwywAB05MAA3DGYFcAA3DQAwADcNMAAdObAANw0wABLisAAzZK8LsAA3DiYEsAA3DnAAHTkwADcOJgVwADcOwDAANw7wAB05sAA3DvAAEuKwADNksAAdO/AANw/mBLAANxAwAB05MAA3D+YFcAA3EIAwADcQsAAdObAANxCwABLisAAzZLAAHTxwADcRpgSwADcR8AAdOTAANxGmBXAANxJAMAA3EnAAHTmwADcScAAS4rAAM2SwAB088AA3E2YEsAA3E7AAHTkwADcTZgVwADcUADAANxQwAB05sAA3FDAAEuKwADNksAAdPXAANxUmBLAANxVwAB05MAA3FSYFcAA3FcAwADcV8AAdObAANxXwABLisAAzZLAAHT3wADcW5gSwADcXMAAdOTAANxbmBXAANxeAMAA3F7AAHTmwADcXsAAS4rAANxbmBDAANxiXcAAzZLAAHT5wADcZJgSwADcZcAAdOTAANxkmBXAANxnAMAA3GfAAHTmwADcZ8AAS4rAANxkmBDAANxrXcAAzZLAAHT7wADcbZgSwADcbsAAdOTAANxtmBXAANxwAMAA3HDAAHTmwADccMAAS4rAANxtmBDAANx0XcAAzZLAAHT9wADcdpgSwADcd8AAdP7AANx3wAB0/8AA3HfAAHUAwADcd8AAdQHAANx3wAB1AsAA3HfAAHUDwADcd8AAdQTAANx3wAB1BcAA3HfAAHUGwADcd8AAdQfAANx3wAB1CMAA3HfAAHUJwADcd8AAdQrAANx3wAB1C8AA3HfAAHUMwADcd8AAdQ3AANx3wAB1DsAA3HfAAHUPwADcd8AAdRDAANx3wAB1EcAA3HfAAHUSwADcd8AAdRPAANx3wAB1FMAA3HfAAHUVwADcd8AAdRbAANx3wAB1F8AA3HfAAHUYwADcd8AAdRnAANx3wAB1GsAA3HfAAHUbwADcd8AAdRzAANx3wAB1HcAA3HfAAHUewADcd8AAdR/AANx3wAB1IMAA3HfAAHUhwADcd8AAdSLAANx3wAB1I8AA3HfAAHUkwADcd8AAdSXAANx3wAB1JsAA3HfAAHUnwADcd8AAdSjAANx3wAB1KcAA3HfAAHUqwADcd8AAdSvAANx3wAB1LMAA3HfAAHUtwADcd8AAdS7AANx3wAB1L8AA3HfAAHUwwADcd8AAdTHAANx3wAB1MsAA3HfAAHUzwADcd8AAdTTAANx3wAB1NcAA3HfAAHU2wADcd8AAdTfAANx3wAB1OMAA3HfAAHU5wADcd8AAdTrAANx3wAB1O8AA3HfAAHU8wADcd8AAdT3AANx3wAB1PsAA3HfAAHU/wADcd8AAdUDAANx3wAB1QcAA3HfAAHVCwADcd8AAdUPAANx3wAB1RMAA3HfAAHVFwADcd8AAdUbAANx3wAB1R8AA3HfAAHVIwADcd8AAdUnAANx3wAB1SsAA3HfAAHVLwADcd8AAdUzAANx3wAB1TcAA3HfAAHVOwADcd8AAdU/AANx3wAB1UMAA3HfAAHVRwADcd8AAdVLAANx3wAB1U8AA3HfAAHVUwADcd8AAdVXAANx3wAB1VsAA3HfAAHVXwADcd8AAdVjAANx3wAB1WcAA3HfAAHVawADcd8AAdVvAANx3wAB1XMAA3HfAAHVdwADcd8AAdV7AANx3wAB1X8AA3HfAAHVgwADcd8AAdWHAANx3wAB1YsAA3HfAAHVjwADcd8AAdWTAANx3wAB1ZcAA3HfAAHVmwADcd8AAdWfAANx3wAB1aMAA3HfAAHVpwADcd8AAdWrAANx3wAB1a8AA3HfAAHVswADcd8AAdW3AANx3wAB1bsAA3HfAAHVvwADcd8AAdXDAANx3wAB1ccAA3HfAAHVywADcd8AAdXPAANx3wAB1dMAA3HfAAHV1wADcd8AAdXbAANx3wAB1d8AA3HfAAHV4wADcd8AAdXnAANx3wAB1esAA3HfAAHV7wADcd8AAdXzAANx3wAB1fcAA3HfAAHV+wADcd8AAdX/AANx3wAB1gMAA3HfAAHWBwADcd8AAdYLAANx3wAB1g8AA3HfAAHWEwADcd8AAdYXAANx3wAB1hsAA3HfAAHWHwADcd8AAdYjAANx3wAB1icAA3HfAAHWKwADcd8AAdYvAANx3wAB1jMAA3HfAAHWNwADcd8AAdY7AANx3wAB1j8AA3HfAAHWQwADcd8AAdZHAANx3wAB1ksAA3HfAAHWTwADcd8AAdZTAANx3wAB1lcAA3HfAAHWWwADcd8AAdZfAANx3wAB1mMAA3HfAAHWZwADcd8AAdZrAANx3wAB1m8AA3HfAAHWcwADcd8AAdZ3AANx3wAB1nsAA3HfAAHWfwADcd8AAdaDAANx3wAB1ocAA3HfAAHWiwADcd8AAdaPAANx3wAB1pMAA3HfAAHWlwADcd8AAdabAANx3wAB1p8AA3HfAAHWowADcd8AAdanAANx3wAB1qsAA3HfAAHWrwADcd8AAdazAANx3wAB1rcAA3HfAAHWuwADcd8AAda/AANx3wAB1sMAA3HfAAHWxwADcd8AAdbLAANx3wAB1s8AA3HfAAHW0wADcd8AAdbXAANx3wAB1tsAA3HfAAHW3wADcd8AAdbjAANx3wAB1ucAA3HfAAHW6wADcd8AAdbvAANx3wAB1vMAA3HfAAHW9wADcd8AAdb7AANx3wAB1v8AA3HfAAHXAwADcd8AAdcHAANx3wAB1wsAA3HfAAHXDwADcd8AAdcTAANx3wAB1xcAA3HfAAHXGwADcd8AAdcfAANx3wAB1yMAA3HfAAHXJwADcd8AAdcrAANx3wAB1y8AA3HfAAHXMwADcd8AAdc3AANx3wAB1zsAA3HfAAHXPwADcd8AAddDAANx3wAB10cAA3HfAAHXSwADcd8AAddPAANx3wAB11MAA3HfAAHXVwADcd8AAddbAANx3wAB118AA3HfAAHXYwADcd8AAddnAANx3wAB12sAA3HfAAHXbwADcd8AAddzAANx3wAB13cAA3HfAAHXewADcd8AAdd/AANx3wAB14MAA3HfAAHXhwADcd8AAdeLAANx3wAB148AA3HfAAHXkwADcd8AAdeXAANx3wAB15sAA3HfAAHXnwADcd8AAdejAANx3wAB16cAA3HfAAHXqwADcd8AAdevAANx3wAB17MAA3HfAAHXtwADcd8AAde7AANx3wAB178AA3HfAAHXwwADcd8AAdfHAANx3wAB18sAA3HfAAHXzwADcd8AAdfTAANx3wAB19cAA3HfAAHX2wADcd8AAdffAANx3wAB1+MAA3HfAAHX5wADcd8AAdfrAANx3wAB1+8AA3HfAAHX8wADcd8AAdf3AANx2mBXAAN14AMAA3XjAAHX/wADdeMAAdgHAAN14wAB2A8AA3XjAAHYFwADcdpgQwADdfl3AAN1+gVbAAN1+gUHAAN1+gz7AAN1+ScAA3X6Sg8AA3X7AAHQ7wADdfpJ5wADdfsAAdD7AAN1+vqLAAN1+wAB0QcAA3X7AAHRDwADdfpdIwADdfsAAdEbAAN1+vHnAAN1+wAB0T8AA3X7AAHRSwADdfsAAdFTAAN1+wAB0VsAA3X7AAHRYwADdfpt3wADdfsAARoHAAN1+wABydsAA3X7AAHRdwADdfsAAdF/AANx2mBPAAN2YgzDAAN2Ys4fAAN2YwABFYMAA3ZjAAGVRwADdmMAAdEzAAM2SwAB2B8AA3Z6YEsAA3Z/AAHT+wADdn8AAdP/AAN2fwAB1AMAA3Z/AAHUBwADdn8AAdQLAAN2fwAB1A8AA3Z/AAHUEwADdn8AAdQXAAN2fwAB1BsAA3Z/AAHUHwADdn8AAdQjAAN2fwAB1CcAA3Z/AAHUKwADdn8AAdQvAAN2fwAB1DMAA3Z/AAHUNwADdn8AAdQ7AAN2fwAB1D8AA3Z/AAHUQwADdn8AAdRHAAN2fwAB1EsAA3Z/AAHUTwADdn8AAdRTAAN2fwAB1FcAA3Z/AAHUWwADdn8AAdRfAAN2fwAB1GMAA3Z/AAHUZwADdn8AAdRrAAN2fwAB1G8AA3Z/AAHUcwADdn8AAdR3AAN2fwAB1HsAA3Z/AAHUfwADdn8AAdSDAAN2fwAB1IcAA3Z/AAHUiwADdn8AAdSPAAN2fwAB1JMAA3Z/AAHUlwADdn8AAdSbAAN2fwAB1J8AA3Z/AAHUowADdn8AAdSnAAN2fwAB1KsAA3Z/AAHUrwADdn8AAdSzAAN2fwAB1LcAA3Z/AAHUuwADdn8AAdS/AAN2fwAB1MMAA3Z/AAHUxwADdn8AAdTLAAN2fwAB1M8AA3Z/AAHU0wADdn8AAdTXAAN2fwAB1NsAA3Z/AAHU3wADdn8AAdTjAAN2fwAB1OcAA3Z/AAHU6wADdn8AAdTvAAN2fwAB1PMAA3Z/AAHU9wADdn8AAdT7AAN2fwAB1P8AA3Z/AAHVAwADdn8AAdUHAAN2fwAB1QsAA3Z/AAHVDwADdn8AAdUTAAN2fwAB1RcAA3Z/AAHVGwADdn8AAdUfAAN2fwAB1SMAA3Z/AAHVJwADdn8AAdUrAAN2fwAB1S8AA3Z/AAHVMwADdn8AAdU3AAN2fwAB1TsAA3Z/AAHVPwADdn8AAdVDAAN2fwAB1UcAA3Z/AAHVSwADdn8AAdVPAAN2fwAB1VMAA3Z/AAHVVwADdn8AAdVbAAN2fwAB1V8AA3Z/AAHVYwADdn8AAdVnAAN2fwAB1WsAA3Z/AAHVbwADdn8AAdVzAAN2fwAB1XcAA3Z/AAHVewADdn8AAdV/AAN2fwAB1YMAA3Z/AAHVhwADdn8AAdWLAAN2fwAB1Y8AA3Z/AAHVkwADdn8AAdWXAAN2fwAB1ZsAA3Z/AAHVnwADdn8AAdWjAAN2fwAB1acAA3Z/AAHVqwADdn8AAdWvAAN2fwAB1bMAA3Z/AAHVtwADdn8AAdW7AAN2fwAB1b8AA3Z/AAHVwwADdn8AAdXHAAN2fwAB1csAA3Z/AAHVzwADdn8AAdXTAAN2fwAB1dcAA3Z/AAHV2wADdn8AAdXfAAN2fwAB1eMAA3Z/AAHV5wADdn8AAdXrAAN2fwAB1e8AA3Z/AAHV8wADdn8AAdX3AAN2fwAB1fsAA3Z/AAHV/wADdn8AAdYDAAN2fwAB1gcAA3Z/AAHWCwADdn8AAdYPAAN2fwAB1hMAA3Z/AAHWFwADdn8AAdYbAAN2fwAB1h8AA3Z/AAHWIwADdn8AAdYnAAN2fwAB1isAA3Z/AAHWLwADdn8AAdYzAAN2fwAB1jcAA3Z/AAHWOwADdn8AAdY/AAN2fwAB1kMAA3Z/AAHWRwADdn8AAdZLAAN2fwAB1k8AA3Z/AAHWUwADdn8AAdZXAAN2fwAB1lsAA3Z/AAHWXwADdn8AAdZjAAN2fwAB1mcAA3Z/AAHWawADdn8AAdZvAAN2fwAB1nMAA3Z/AAHWdwADdn8AAdZ7AAN2fwAB1n8AA3Z/AAHWgwADdn8AAdaHAAN2fwAB1osAA3Z/AAHWjwADdn8AAdaTAAN2fwAB1pcAA3Z/AAHWmwADdn8AAdafAAN2fwAB1qMAA3Z/AAHWpwADdn8AAdarAAN2fwAB1q8AA3Z/AAHWswADdn8AAda3AAN2fwAB1rsAA3Z/AAHWvwADdn8AAdbDAAN2fwAB1scAA3Z/AAHWywADdn8AAdbPAAN2fwAB1tMAA3Z/AAHW1wADdn8AAdbbAAN2fwAB1t8AA3Z/AAHW4wADdn8AAdbnAAN2fwAB1usAA3Z/AAHW7wADdn8AAdbzAAN2fwAB1vcAA3Z/AAHW+wADdn8AAdb/AAN2fwAB1wMAA3Z/AAHXBwADdn8AAdcLAAN2fwAB1w8AA3Z/AAHXEwADdn8AAdcXAAN2fwAB1xsAA3Z/AAHXHwADdn8AAdcjAAN2fwAB1ycAA3Z/AAHXKwADdn8AAdcvAAN2fwAB1zMAA3Z/AAHXNwADdn8AAdc7AAN2fwAB1z8AA3Z/AAHXQwADdn8AAddHAAN2fwAB10sAA3Z/AAHXTwADdn8AAddTAAN2fwAB11cAA3Z/AAHXWwADdn8AAddfAAN2fwAB12MAA3Z/AAHXZwADdn8AAddrAAN2fwAB128AA3Z/AAHXcwADdn8AAdd3AAN2fwAB13sAA3Z/AAHXfwADdn8AAdeDAAN2fwAB14cAA3Z/AAHXiwADdn8AAdePAAN2fwAB15MAA3Z/AAHXlwADdn8AAdebAAN2fwAB158AA3Z/AAHXowADdn8AAdenAAN2fwAB16sAA3Z/AAHXrwADdn8AAdezAAN2fwAB17cAA3Z/AAHXuwADdn8AAde/AAN2fwAB18MAA3Z/AAHXxwADdn8AAdfLAAN2fwAB188AA3Z/AAHX0wADdn8AAdfXAAN2fwAB19sAA3Z/AAHX3wADdn8AAdfjAAN2fwAB1+cAA3Z/AAHX6wADdn8AAdfvAAN2fwAB1/MAA3Z/AAHX9wADdnpgVwADeoADAAN6gmoLAAN6gwAB2CsAA3Z6YEMAA3qSA38AA3qSDLMAA3qSDg8AA3qRdwADepIFBwADepLx5wADepMAAdE/AAN6kwAB0UsAA3qTAAHRUwADepMAAdFbAAN6kwAB0WMAA3qTAAHR6wADepMAAdHzAAN6kwAB0fsAA3qTAAHSAwADepKdTwADdnpgTwADetYMwwADetbOHwADetcAARWDAAN61wABlUcAA3rXAAHRMwADetcAAdHLAAN61wAB0dMAA3rXAAHR2wADetcAAdHjAAM2SwAB2DMAA3r+YFcAA3sAAwADewMAAdf/AAN7AwAB2AcAA3sDAAHYQwADev5gQwADexV3AAN7FgVbAAN7FgUHAAN7Fgz7AAN7FScAA3sXAAHRDwADexZdIwADexcAAdEbAAN7FwAB0UsAA3sXAAHRUwADexZt3wADexcAARoHAAN7FwABydsAA3r+YE8AA3tODMMAA3tOzh8AA3tPAAHRMwADNksAAdhLAAN7XmBLAAN7YwACNIcAA3tmua8AA3teYE8AA3tvAAGkkwADe15gQwADe3ZekwADe3cAAc6DAAN7dwABzocAA3t3AAHOjwADe3cAAc6LAAN7dwABzpcAA3t3AAHOkwADe3cAAc6fAAN7dwABzpsAA3t3AAHOrwADe3cAAc6jAAN7dwABzqcAA3t3AAHOqwADe3cAAc6zAAN7dwABpJsAA3teYFsAA3u0AwADNksAAdhPAAN7vmBLAAN7wwACNIcAA3vGua8AA3u+YEMAA3vPAAHTIwADe88AAdMnAAN7zwAB0ysAA3vPAAHTLwADe88AAdMzAAN7zwAB0zcAA3vPAAEApwADe88AAQFbAAN7zwAB0zsAA3vPAAHTPwADe88AAaSrAAN7zwABpJ8AA3vPAAHTQwADe88AAdNHAAN7zwAB00sAA3vPAAHTTwADe88AAdNTAAN7zwAB01cAA3vPAAEBXwADe88AAQCjAAN7zwACNIcAA3wiTH8AA3u+YE8AA3wrAAGl/wADfCqPWwADfCsAAaSTAAN8KghLAAN7vmBbAAN8PAMAAzZLAAHYVwADfEZgTwADfEsAAjSHAAN8Tk/7AAN8TrmvAAN8SWsAA3xLAAGl/wADfEqPWwADfEsAAaSTAAN8SghLAAN8RmBDAAN8bRMAA3xGYFsAA3x0AwADNksAAdhfAAN8fmBbAAN8gAMAA3x+YE8AA3yLAAI0hwADfI5P+wADfI65rwADfIlrAAN8iwABpf8AA3yKj1sAA3yLAAGkkwADfIoISwADfH5gQwADfK0TAAM2SwAB2GMAA3y2YEsAA3y7AAI0hwADfL5P+wADfLZgWwADfMQDAAM2SwAB2GcAA3zOYFsAA3zQAwADfM5gTwADfNsAAjSHAAN83k/7AAN83rmvAAN82WsAA3zbAAGl/wADfNqPWwADfNsAAaSTAAN82ghLAAN8zmBDAAN8/RMAAzZLAAHYawADfQZgSwADfQsAAjSHAAN9Dk/7AAN9BmBbAAN9FAMAAzZLAAHYbwADfR5gWwADfSADAAN9HmBPAAN9KwACNIcAA30uT/sAA30uua8AA30pawADfSsAAaX/AAN9Ko9bAAN9KwABpJMAA30qCEsAA30eYEMAA31NEwADNksAAdhzAAN9VmBLAAN9WwACNIcAA31eT/sAA31WYFsAA31kAwADNksAAdh3AAN9bmBbAAN9cAMAA31uYE8AA317AAI0hwADfX5P+wADfX65rwADfXlrAAN9ewABpf8AA316j1sAA317AAGkkwADfXoISwADfW5gQwADfZ0TAAM2SwAB2HsAA32mYEsAA32rAAI0hwADfa5P+wADfaZgWwADfbQDAAM2SwAB2H8AA32+YFsAA33AAwADfb5gTwADfcsAAjSHAAN9zk/7AAN9zrmvAAN9yWsAA33LAAGl/wADfcqPWwADfcsAAaSTAAN9yghLAAN9vmBDAAN97RMAAzZLAAHYgwADffZgSwADffsAAjSHAAN9/k/7AAN99mBbAAN+BAMAAzZLAAHYhwADfg5gWwADfhADAAN+DmBPAAN+GwACNIcAA34eT/sAA34eua8AA34ZawADfhsAAaX/AAN+Go9bAAN+GwABpJMAA34aCEsAA34OYEMAA349EwADNksAAdiLAAN+RmBLAAN+SwACNIcAA35OT/sAA35GYFsAA35UAwADNksAAdiPAAN+XmBbAAN+YAMAA35eYE8AA35rAAI0hwADfm5P+wADfm65rwADfmlrAAN+awABpf8AA35qj1sAA35rAAGkkwADfmoISwADfl5gQwADfo0TAAM2SwAB2JMAA36WYEsAA36bAAI0hwADfp5P+wADfpZgWwADfqQDAAM2SwAB2JcAA36uYFsAA36wAwADfq5gTwADfrsAA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KJsZwADjKMAAahLAAOMmmBDAAOMrv4nAAOMswAB5McAA4yzAAHkzwADjJpgWwADjLwDAAOKrwAB5NcAA4zGYEsAA4zK/icAA4zObGcAA4zPAAGoSwADjMZgQwADjNr+JwADjN8AAeTHAAOM3wAB5M8AA4zGYFsAA4zoAwADiq8AAeTfAAOM8mBDAAOM9wABCT8AA4z3AAHk5wADjPJgWwADjQADAAOKrwAB5O8AA40KYEMAA40O/icAA40TAAGxVwADjQpgWwADjRgDAAOKrwAB5PsAA40iYEMAA40m/icAA40rAAGxVwADjSJgWwADjTADAAOKrwAB5QsAA406YEsAA40/AAHlDwADjT7+JwADjUcAAeUTAAONRwAB5RcAA41HAAHlGwADjTpgQwADjVb+JwADjVsAAeUfAAONWwAB5ScAA41bAAHlKwADjTpgWwADjWgDAAOKrwAB5TMAA41yYEsAA412/icAA417AAHlNwADjXJgQwADjYL+JwADjYZsswADjYcAAeU/AAONhwAB5UcAA42HAAHlTwADjXJgTwADjZr+JwADjZ8AAeVTAAONnwAB5VcAA41yYFsAA42q/icAA42uAqMAA4qvAAHlWwADjbZgSwADjbsAAd4nAAONuv4nAAONwwABqEsAA43DAAGyawADjbZgTwADjc4GGwADjbZgQwADjdb+JwADjdsAAeVfAAON2wABrE8AA43bAAHlawADjdsAAeVzAAONtmBbAAON7AMAA4qvAAHlewADjfZgSwADjfr+JwADjf8AAbznAAON/wAB5X8AA432YFsAA44IAwADiq8AAeWDAAOOEmBbAAOOFAMAA4qvAAHlhwADjh5gSwADjiL+JwADjicAAeWLAAOOJwAB5ZMAA44nAAG9vwADjicAAdl/AAOOJwABQesAA44nAAHllwADjicAAeWbAAOOJwAB5Z8AA44nAAHlowADjicAAeWnAAOOJwAB5asAA44nAAHlrwADjicAAeWzAAOOIwAB5Y8AA44eYE8AA45i/icAA45nAAHl5wADjmcAAeXvAAOOZwAB5fMAA45iEA8AA45gLwADjmArAAOOYFMAA45jAAHmcwADjh5gQwADjor+JwADjo8AAeX3AAOOjwAB5fsAA46PAAHl/wADjo8AAeYHAAOOjwAB5dMAA46PAAHmKwADjo59rwADjo8AAeZPAAOOjwAB5i8AA46PAAHmWwADjosAAWVHAAOOHmBbAAOOvAMAA4qvAAHmdwADjsZgSwADjsr+JwADjs8AAeZ7AAOOzwAB5n8AA47PAAHmgwADjs8AAeaHAAOOzwAB5osAA47PAAHmjwADjs8AAeajAAOOzwAB5qcAA47LAAHmkwADjssAAeaXAAOOywAB5psAA47LAAHmnwADjssAAb9bAAOOxmBPAAOPBghfAAOPBg3LAAOPBwAB5qsAA48HAAHmrwADjwcAAeazAAOPBwAB5rcAA48GDicAA47GYEMAA48mTFMAA48m/icAA48vAAHmxwADjy8AAebPAAOPJQcAA48kjwADjsZgVwADj0ILFwADj0MAAQvHAAOOxmBbAAOPTAMAA4qvAAHm1wADj1ZgSwADj1oCwwADj1ifAAOPWwAB25MAA49WYEMAA49ojwADj1ZgWwADj3ADAAOKrwAB5t8AA496YFsAA498AwADiq8AAebjAAOPhmBbAAOPiAMAA4+GYEsAA4+S/icAA4+XAAHm5wADj4ZgTwADj57+JwADj6MAAebrAAOPowAB5u8AA4+jAAHm8wADj6MAAeb3AAOPhmBDAAOPtv4nAAOPuwABvUMAA4+7AAHm+wADiq8AAeb/AAOPxmBLAAOPywAB5wMAA4/LAAHnBwADj8sAAecLAAOPywAB5w8AA4/LAAHnEwADj8sAAecXAAOPywAB5xsAA4/LAAHnHwADj8sAAecjAAOPywAB5ycAA4/LAAHnKwADj8sAAecvAAOPywAB5zMAA4/LAAHnNwADj8sAAec7AAOPywAB5z8AA4/LAAHnQwADj8sAAedHAAOPywAB50sAA4/LAAHnTwADj8sAAedTAAOPywAB51cAA4/LAAHnWwADj8sAAedfAAOPywAB52MAA4/LAAHnZwADj8sAAedrAAOPywAB528AA4/LAAHncwADj8sAAed3AAOPywAB53sAA4/LAAHnfwADj8sAAeeDAAOPywAB54cAA4/LAAHniwADj8sAAeePAAOPywAB55MAA4/K/icAA5BjAAHnlwADkGMAAeebAAOPysKjAAOPywAB558AA4/LAAHnowADj8sAAeenAAOPywAB56sAA4/LAAHnrwADj8sAAeezAAOPywAB3tsAA4/LAAHntwADj8sAAee7AAOPywAB578AA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AOahmBTAAOasV8AA5qGYEMAA5q7AAHZOwADmrsAAdvDAAOauwAB3esAA5q6nfsAA5q7AAHttwADmrsAAe27AAOauwAB7b8AA5q7AAHtxwADmroMUwADmrsAAe3TAAOauI8AA4qvAAHt1wADmupgSwADmu7+JwADmvMAAeWTAAOa8wAB7dsAA5rqYE8AA5r9HwADmv1fAAOa/gKDAAOa/wAB7csAA5r/AAHtrwADmupgQwADmxb+JwADmxoVywADmxsAAe3rAAObGwAB7fMAA5sbAAHt+wADmxsAAe4DAAObGmyzAAObGwAB7g8AA5sbAAHuFwADmxsAAe4fAAObGwAB7l8AA5sbAAHuZwADmxsAAe47AAObGwAB7j8AA5sWDUcAA5sWDUsAA5sXAAHZOwADmxcAAdvDAAObFwAB3esAA5sWnfsAA5sXAAHtvwADmxcAAe3HAAObFgxTAAObFwAB7dMAA5sUjwADmupgUwADm31fAAOa6mBbAAObhAMAA5uHAAHtowADiq8AAe53AAObkmBXAAOblAMAA5uSYEMAA5ufAAHkWwADiq8AAe57AAObpmBLAAObqwAB7n8AA5urAAHugwADm6sAAe6HAAObqwAB7osAA5urAAHujwADm6sAAe6TAAObqwAB7pcAA5urAAHumwADm6sAAe6fAAObqwAB7d8AA5urAAHZPwADm6sAAe3PAAObqwABHksAA5urAAHuowADm6sAAe6nAAObqwABJAMAA5uq/icAA5vvAAHuqwADm6sAAeevAAObpmBDAAOb+v4nAAOb/wAB6x8AA5v/AAHurwADm/sAAad7AAOb+wABp38AA5v7AAGngwADm/oNmwADm/oIPwADm/oLowADm6ZgTwADnCIGGwADm6ZgWwADnCgDAAOKrwAB7sMAA5wyYEsAA5w2/icAA5w7AAHuxwADnDsAAe7LAAOcOwAB7s8AA5w7AAHu0wADnDsAAe7XAAOcMmBbAAOcUAMAA4qvAAHu2wADnFpgQwADnF7+JwADnGMAAe7fAAOcYwABqG8AA5xaYFsAA5xsAwADiqwjAAOcdmBLAAOcenTnAAOcewAB7u8AA5x6CEcAA5x7AAHu9wADnHp4ewADnHsAAe7/AAOcewAB7wcAA5x7AAHvCwADnHsAAe8TAAOcewAB7xcAA5x6/icAA5ynAAHllwADnHZgWwADnK7+JwADnLJXpwADiq8AAe8fAAOcumBLAAOcvwAB6GMAA5y/AAHvIwADnL8AAe8rAAOcvwAB7y8AA5y/AAHvNwADnL8AAe87AAOcvwAB70MAA5y/AAHvRwADnL7+JwADnOI8MwADnLpgWwADnOr+JwADnO5XpwADiqwfAAOc9mBXAAOc+AMAA5z6T1sAA5z7AAHtowADnPZgQwADnQsAAdk7AAOdCwAB28MAA50LAAHtvwADnQsAAe3HAAOdCm7fAAOdCwAB71MAA50JawADnQoNUwADnQsAAe9XAAOdCwAB71sAA50LAAHvXwADnQsAAe9jAAOdCwAB72cAA50LAAHvawADnQsAAe9vAAOdCwAB73MAA50KgKcAA50KBUMAA50LAAHvdwADnQoQFwADnQoSGwADnQoP7wADnQoSHwADnQsAAZhPAAOdCwAB73sAA50LAAHvfwADnQsAAdlDAAOdCp3LAAOdCwAB74MAA50KEC8AA5z2YE8AA52HAAHtywADnYUfAAOKrwAB74cAA52SYEMAA52WCD8AA52WBU8AA52WWccAA52XAAHviwADnZZ05wADnZcAAev/AAOdlwAB5HsAA52WDVsAA52WWYMAA52XAAHvjwADnZcAAeSHAAOdlg0LAAOdlgUvAAOdlgVLAAOdlgUDAAOdlwAB75MAA52XAAHkkwADnZcAAe+XAAOdlvmfAAOdlwAB75sAA52VawADnZYNUwADnZYQHwADnZcAAe+fAAOdlwAB5KcAA52XAAHvowADnZcAAe+nAAOdlwAB76sAA52UjwADnZJgTwADng0fAAOdkmBbAAOeFAMAA4quBrsAA54eYEsAA54giwADniEfAAOeIgwDAAOeHmBDAAOeMI8AA54eYFsAA544AwADiq8AAe+zAAOeQmBLAAOeRv4nAAOeSwABqEsAA55LAAHlkwADnksAAe+3AAOeSwABsxsAA55K5a8AA55LAAHvuwADnksAAe+/AAOeSwAB78MAA55KzK8AA55LAAHvxwADnkJgQwADnnYGKwADnnb+JwADnn8AAe/PAAOefwAB79cAA55/AAHv0wADnn59rwADnkJgWwADnpADAAOekwAB78sAA4qvAAHv7wADnp5gSwADnqL+JwADnqcAAe/zAAOepwAB7/cAA56eYEMAA56ya0MAA56yCD8AA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pMAAfkzAAOukwAB+TcAA66TAAH5OwADrpL+JwADrrcAAen3AAOutwAB+T8AA663AAGoSwADrrcAAasfAAOutwAB+UMAA663AAH5RwADrrcAAflLAAOutwAB+U8AA663AAHqHwADrrcAAeobAAOutwAB+VMAA663AAH5VwADrrcAAflbAAOutwAB+V8AA663AAH5YwADrrcAAflnAAOutwAB77sAA663AAH5awADrrcAAflvAAOutwAB+XMAA663AAH5dwADrrcAAfl7AAOutwAB+X8AA66TAAG/WwADrpMAAerbAAOukgefAAOukwAB6q8AA66TAAHqswADrpMAAfjjAAOujmBDAAOvLv4nAAOvMwAB+Z8AA68zAAH5pwADrzMAAfmzAAOvMwABpVMAA68zAAH5iwADrzMAAfmPAAOvMwAB+d8AA68zAAH54wADrzMAAfmTAAOvMhUDAAOvMwAB+ecAA68zAAH5mwADrzMAAfmHAAOvMwAB6g8AA68zAAHqCwADrzMAAfnDAAOvMwAB+fsAA68zAAH6AwADrzMAAfnrAAOvMwAB+e8AA68zAAH5twADrzMAAfoPAAOvMwAB+aMAA68zAAH5/wADry8AAehLAAOvLgYrAAOvLwAB58cAA68uCD8AA68vAAGs+wADry505wADry4IRwADry8AAelLAAOvLwAB6VMAA68vAAHpXwADry8AAeqnAAOujmBPAAOvwg3PAAOvwnP7AAOvwnP/AAOvwwAB6icAA6/DAAHqQwADr8MAAeq3AAOvwwAB6r8AA66OYFMAA6/i/icAA6/nAAHKuwADr+MAAeonAAOv4wAB6kMAA66OYFsAA6/0AwADiq8AAfonAAOv/mBLAAOwAEsAA7ABjwADsAIITwADsAJf/wADr/5gQwADsBcAAforAAOwFwAB+i8AA7AWdOcAA7AWCEcAA7AXAAH6BwADsBcAAfoLAAOv/mBPAAOwMgPzAAOwMWsAA7AzAAH6MwADsDMAATAzAAOwMwAB+jcAA6/+YFsAA7BIAwADiq8AAfpLAAOwUmBXAAOwVAMAA7BSYEMAA7BfAAHoSwADsF8AAeZHAAOwXwAB6usAA7BfAAHqvwADsF8AAerzAAOwXwAB6qcAA7BekusAA7BfAAHq9wADsF8AAesLAAOwXwAB6xMAA7Be/icAA7CLAAHrHwADs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7rTAAH/cwADutMAAf97AAO60wAB/4MAA7rTAAH/hwADutMAAf+LAAO60wAB/48AA7rTAAH/kwADutMAAf+XAAO60wAB/5sAA7rTAAH/nwADutMAAf+jAAO60wAB/6cAA7rTAAHGNwADutMAAf+rAAO60wAB/68AA7rTAAH/swADutMAAf+3AAO60wAB/7sAA7rPAAHYBwADus8AATXjAAO6zwAB/18AA7rKYEMAA7tOCxcAA7tOaf8AA7tXAAH/ywADu1cAAf/XAAO7VwAB/+MAA7tXAAH/+wADu1cAAf//AAO7VwACAC8AA7tXAAIANwADu1cAAgBnAAO7VwACAG8AA7tXAAIAewADu1cAAgB/AAO7VwACAIMAA7tXAAIAowADu1cAAgCrAAO7VwACAK8AA7tXAAIAswADu1cAAgC7AAO7VwACAMcAA7tXAAIAywADu1cAAgDPAAO7VwACANMAA7tXAAIA1wADu1cAAgDbAAO7VwACAN8AA7tXAAIA5wADu1cAAgD3AAO7VwACAR8AA7tXAAIBJwADu1cAAgErAAO7VwACAS8AA7tXAAIBNwADu1cAAgFLAAO7VwACATsAA7tXAAIBdwADu1cAAgHbAAO7VwACAocAA7tXAAICjwADu04FWwADu05dIwADu04OCwADu04OEwADu04HfwADu04MswADu04DfwADu04ODwADu05KVwADu013AAO7TgUHAAO7Tgz7AAO7TQcAA7tOSmMAA7tOXqsAA7tNJwADu01zAAO7TgUrAAO7TgIvAAO7TgUjAAO7TkpbAAO7TwABybsAA7tPAAIBfwADu08AAgI7AAO7TwACAkMAA7tOkTsAA7tOk4sAA7tOkwcAA7tOkTMAA7tMjwADu04POwADuspgTwADvGpp/wADvG8AAgAzAAO8ag4nAAO8awABC88AA7xrAAErowADvGsAAaVDAAO8atQzAAO8apMTAAO8awACAkcAA7rKYFcAA7ySTFsAA7ySaf8AA7ybAAIAQwADvJsAAgBHAAO6ymBbAAO8pmn/AAO8qgKjAAO8qwAB/78AA7iDAAICnwADvLZgTwADvLpp/wADvL8AAgGfAAO8tmBDAAO8xmn/AAO8ywABpScAA7zLAAIBtwADvMsAAgGzAAO8ywACAbsAA7y2YFsAA7zcAwADuIMAAgKjAAO85mBLAAO86mn/AAO87wACAqcAA7zvAAIBnwADvO8AAgKrAAO87wACAq8AA7zvAAICswADvO8AAgK3AAO87wACArsAA7zvAAICvwADvO8AAgLDAAO87wACAscAA7zvAAICywADvOZgQwADvR5p/wADvSMAAgLPAAO9IwACAtMAA70jAAIC1wADvSMAAaUnAAO9IwACAbsAA70jAAIC6wADvSMAAgGzAAO9IwACAbcAA7zmYFsAA71EAwADuIMAAgLvAAO9TmBLAAO9Umn/AAO9VwACAqcAA71XAAIBnwADvVcAAgLzAAO9VwACAvcAA71XAAIC+wADvVcAAgL/AAO9VwACAq8AA71XAAIDAwADvU5gQwADvXpp/wADvX8AAaUnAAO9fwACAbsAA71/AAIC6wADvX8AAgGzAAO9fwACAbcAA71OYFsAA72UAwADuIMAAgMLAAO9nmBLAAO9owACAw8AA72jAAIDEwADvaMAAgMXAAO9omn/AAO9swABAz8AA72zAAIDGwADvZ5gVwADvb8AAgMfAAO9nmBPAAO9xg4nAAO9xmn/AAO9zwACAysAA73GkxMAA73GfMcAA73GWJsAA73Gki8AA73HAAErowADvZ5gQwADvel3AAO96mn/AAO98qx/AAO98wACAzMAA73zAAIBtwADvfMAAgM/AAO98wACATcAA73zAAIDSwADvfMAAgNTAAO98wACA18AA73zAAIDZwADvfMAAgNvAAO98wACA3cAA73zAAIDewADvfMAAgN/AAO98wACA4MAA73zAAIDhwADvfMAAgOLAAO98wACA48AA73zAAG9KwADvfMAAgPTAAO98wACA98AA73zAAID7wADveoFBwADveoM+wADvepKYwADveknAAO96kpbAAO96l6rAAO96gVbAAO96QcAA73pcwADveoCLwADveoFIwADveoFKwADvepdIwADver58wADvesAAgOjAAO96wACA6cAA73q+Z8AA73q+gMAA73rAAIAUwADvesAAgOrAAO96pIzAAO96wAB0RsAA73qkwcAA73qkTMAA73ojwADveoFJwADvesAAV7HAAO96wACA+cAA73qB38AA7iDAAIEGwADvr5gSwADvsJp/wADvscAAgQfAAO+xwACBCMAA77HAAIEJwADvscAAgQrAAO+wIsAA76+YEMAA77eaf8AA77jAAIELwADvuMAAgQ7AAO+4wACBEMAA77cjwADvr5gTwADvvZp/wADvvsAAgRHAAO+vmBbAAO/Amn/AAO/BmyzAAO4gwACBFsAA78OYEMAA78Saf8AA78XAAIELwADvxCPAAO/DmBbAAO/Imn/AAO/JmyzAAO4gwACBHcAA78uYEsAA78yaf8AA783AAIEIwADvzcAAgQnAAO/NwACBCsAA783AAIEewADvy5gQwADv0iPAAO/LmBbAAO/Umn/AAO/VmyzAAO4gwACBH8AA79eYEsAA79iaf8AA79nAAHJ6wADv15gQwADv2yPAAO/XmBbAAO/dAMAA7iCjK8AA79+YEsAA7+Caf8AA7+HAAIEewADv35gQwADv4yPAAO/fmBbAAO/lAMAA7iCjLcAA7+eYEsAA7+iaf8AA7+kowADv55gQwADv6yPAAO/nmBbAAO/tAMAA7iDAAIEjwADv75gSwADv8Jp/wADv8cAAgSTAAO/xwACBJcAA7/HAAIEmwADv8cAAcqbAAO/xwAB+NMAA7/HAAGh/wADv75gQwADv+EHAAO/4mn/AAO/6wABLwcAA7/rAAIEowADv75gTwADv/YOJwADv/SDAAO/vmBbAAPAAAMAA7iDAAIErwADwApgSwADwA5p/wADwBMAAeyDAAPACmBDAAPAGnZbAAPAGrhXAAPAGk+DAAPAGvInAAPAGvIvAAPAGsMTAAPAGgP/AAPAGmn/AAPAOwAB/zMAA8A7AAIE3wADwDsAAf8TAAPAOwACBQMAA8A7AAIE7wADwDsAAV4fAAPAOwACBNcAA8A7AAIFCwADwBkTAAPAGgLLAAPAGT8AA8AaAmcAA8AaVpsAA8AaDvMAA8AZRwADwBpMhwADwBoHQwADwBiPAAPAGgKHAAPAGkeLAAPACmBXAAPAjAMAA8CPAAIEswADwI8AAWezAAPACmBPAAPAnmn/AAPAowACBLsAA8CdawADwJ4LSwADwJ4F5wADwJ4C2wADwJ4D8wADwJ4NowADwJ1XAAPACmBTAAPAxWsAA7iDAAIFJwADwM5gSwADwNJp/wADwNcAAgUrAAPAzmBDAAPA3kyDAAPA3RMAA8DeDvMAA8DeB3cAA8De9FcAA8DeAssAA8DeAmcAA8DeYkMAA8DeB0MAA8DeT4MAA8DeAn8AA8De9F8AA8DemxcAA8De9GsAA8DeT4sAA8DcjwADwM5gTwADwSID8wADwSINowADwSFrAAPBIgdzAAPBIKcAA8EiVjcAA8DOYFsAA8E+af8AA8FCbLMAA7iDAAIFPwADwUpgSwADwU5p/wADwVKRzwADwUpgTwADwVlXAAPBWWsAA8FKYFsAA8FkAwADuIMAAgVDAAPBbmBLAAPBcmn/AAPBdpHPAAPBbmBPAAPBfVcAA8F9awADwW5gWwADwYgDAAO4gwACBUcAA8GSYEsAA8GWaf8AA8Gakc8AA8GSYE8AA8GhVwADwaFrAAPBkmBbAAPBrAMAA7iDAAIFSwADwbZgSwADwbpp/wADwb6RzwADwb8AAgVPAAPBvhXLAAPBtmBDAAPBzVsAA8G2YE8AA8HVXwADwbZgWwADwdwDAAO4gwACBVMAA8HmYEsAA8Hqaf8AA8Hukc8AA8HvAAIFTwADwe4VywADweZgQwADwf1bAAPB5mBPAAPCBV8AA8HmYFsAA8IMAwADuIMAAgVXAAPCFmBLAAPCGmn/AAPCHpHPAAPCHwACBU8AA8IeFcsAA8IWYEMAA8ItWwADwhZgTwADwjVfAAPCFmBbAAPCPAMAA7iDAAIFWwADwkZgSwADwkpp/wADwk8AAf+nAAPCRmBDAAPCVXcAA8JWBQcAA8JWDPsAA8JWSmMAA8JVJwADwlZKWwADwlYFWwADwlYMswADwlYDfwADwlYODwADwlZeqwADwlZp/wADwocAAgVvAAPChwACBWMAA8KHAAIFZwADwocAAgVrAAPChwACBX8AA8KHAAIFhwADwocAAgN3AAPChwACA3sAA8KHAAIDfwADwocAAgODAAPChwACA4cAA8KHAAIDiwADwocAAgOPAAPChwACA2cAA8KHAAIFrwADwocAAgWzAAPChwACAdsAA8JWDhMAA8JWDgsAA8JVcwADwlYCLwADwlYFIwADwlYFKwADwlUHAAPCVl0jAAPCVpE7AAPCVpOLAAPCVgd/AAPCVvnzAAPCVwACA6MAA8JXAAIDpwADwlb5nwADwlb6AwADwlcAAgBTAAPCVwACA6sAA8JWkjMAA8JXAAHRGwADwlaTBwADwlaRMwADwlYFJwADwlcAAV7HAAPCVwACA+cAA8JWDzsAA8JXAAIBfwADwlcAAgI7AAPCVwACAkMAA8JGYE8AA8NDAAErowADw0MAAaVDAAPDQtQzA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wADzY4FKwADzY4FIwADzY0HAAPNjgd/AAPNjI8AA82OXSMAA82OBVsAA80+YE8AA83HAAIPpwADzccAAg+rAAPNxwACD68AA83HAAIPswADzcYFGwADzcZ3fwADzcYOJwADzcaTEwADzT5gWwADzegDAAPN6mn/AAPN8wACD58AA7iCRyMAA836YEsAA83+af8AA84DAAGuBwADzfpgQwADzgpt5wADzgpp/wADzhMAAg/LAAPOEwACD88AA836YE8AA84eV1MAA836YFsAA84kAwADuIMAAg/TAAPOLmBLAAPOMIsAA84uYEMAA844jwADzi5gWwADzkADAAO4gwABI/cAA85KYFsAA85MAwADuIMAAg/bAAPOVmBbAAPOWAMAA7iDAAIP3wADzmJgQwADzmSPAAPOYmBbAAPObAMAA7iDAAIP5wADznZgSwADznpp/wADzn8AAg/rAAPOewACD+8AA856AsMAA854iwADznZgQwADzpMAAg/3AAPOkI8AA852YE8AA86eaf8AA86jAAIP+wADzqMAAhAHAAPOdmBbAAPOrAMAA86uAisAA86vAAFiawADuIMAASPrAAPOvmBLAAPOwY8AA87CCE8AA87Caf8AA87OTMsAA86+YFcAA87UnwADzr5gQwADzt8AAhAfAAPO3wACECMAA87fAAIQJwADzt8AAhAzAAPOvmBPAAPO8mn/AAPO9wACD/sAA873AAIQBwADzr5gWwADzwADAAPPAgIrAAPPAwABjrMAA7iDAAIQTwADzxJgSwADzxcAAhAbAAPPFWsAA88SYE8AA88hjwADzyIITwADzyJp/wADzy8AAg/7AAPPLwACEAcAA88SYFsAA884AwADuIJqOwADz0JgSwADz0Zp/wADz0sAAgQjAAPPSwACBCcAA89CYEMAA89Waf8AA89bAAIELwADz1SPAAPPQmBbAAPPZAMAA89maf8AA89ubLMAA7iCjKsAA892YEsAA896af8AA89/AAIEIwADz38AAgQnAAPPfwACEG8AA892YEMAA8+Oaf8AA8+TAAIELwADz4yPAAPPdmBbAAPPnmn/AAPPomyzAAPPnAMAA7iCbCcAA8+uYEsAA8+yaf8AA8+3AAIJgwADz7cAAb2/AAPPtwACCYsAA8+3AAIQgwADz7cAAYpTAAPPtwACEIcAA8+3AAIQi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wAD7tIMIwAD7tMAAdqjAAPu0nPjAAPu0ltLAAPu0wACHh8AA+7TAAEjkwAD7tMAAh4jAAPu0g67AAPu0wACHisAA+7ScBsAA+7TAAIeJwAD7tIIPwAD7tMAAh4zAAPu0wACHksAA+7TAAI0nwAD7xsAAiVTAAPvGwACIksAA+8bAAIkpwAD7xsAAiJPAAPvGwACJRcAA+8bAAIlVwAD7xsAAiUrAAPvGwACJW8AA+8bAAIiewAD7xsAAiJzAAPvGwACIocAA+8bAAIigwAD7xsAAiWDAAPuZmBbAAPvUAMAA9/PAAIluwAD71pgWwAD71wDAAPvWmBLAAPvZwACNJ8AA+9rAAHm5wAD71pgTwAD73MAAjSfAAPvdwAB5usAA+93AAHm7wAD73cAAebzAAPvdwAB5vcAA+9aYEMAA++LAAI0nwAD748AAb1DAAPvjwAB5vsAA9/PAAIlvwAD75pgSwAD758AAjSfAAPvowACJcMAA++jAAIlxwAD76MAAiXLAAPvowACJc8AA++jAAIl0wAD76MAAen3AAPvowACIesAA++jAAIkWwAD76MAAXOTAAPvomxnAAPvowACJdcAA++jAAIkbwAD75pgQwAD79cAAiXnAAPv1wAB5kcAA+/XAAId6wAD79cAAjSfAAPv5wABvUMAA++aYE8AA+/vAAIl6wAD7+5z9wAD7+8AAjSfAAPv+wACJfMAA+/7AAIl9wAD7/sAAiLvAAPv+wACJfsAA+/7AAHm8wAD7/sAAeb3AAPvmmBbAAPwFAMAA9/PAAImJwAD8B5gWwAD8CADAAPwImpDAAPwKlenAAPwHmBLAAPwMwACNJ8AA/A3AAHm5wAD8B5gTwAD8D8AAjSfAAPwQwAB5usAA/BDAAHm7wAD8EMAAebzAAPwQwAB5vcAA/AeYEMAA/BXAAI0nwAD8FsAAb1DAAPwWwAB5vsAA9/PAAImKwAD8GZgSwAD8GsAAjSfAAPwbwACJi8AA/BvAAIlRwAD8G8AAiRjAAPwbwACIfsAA/BvAAImMwAD8G8AAiY3AAPwbwACJjsAA/BvAAImPwAD8G8AAahLAAPwawACGjsAA/BrAAIaRwAD8GsAAho/AAPwawABJAMAA/BmYEMAA/CmdPsAA/CnAAIaSwAD8KcAAjSfAAPwswACJkMAA/CzAAHw9wAD8LMAAiXjAAPws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AV8AAF2KhgFfAABdipoBXwAAXYqaAV8AAF2KmgFfAABdwAD1HQFgnoRgwADDZV3AAPUdAWCK7V3AAPUdAWCK7V3AAPVOAmDAAPZdYMAA9l1dwAD1HQFgwAD0eV3AAPUdAWDAAPR5YQFgwAD2XWDAAPZdYQFgwAD2XWDAAPZdYQFgwAD2XWDAAPZdYQFgwAD2XWDAAPZdYQFgwAD2XWDAAPZdYMAAw5pgwADDZWDAAMNlXcAA9R0BYMAA9HldwAD1HQFgwAD0eV2LewJfAABfAQBdwAD1HQFbXcAA9R0BW13AAPUdAVtdwAD1HQFbXcAA9U4CXwAAXwEAXcAA9U4CXwAAXwEAYQJfAABfAQBcYQJfAABfAQBcXYubAV8AAF2LmwFfAABdi6YBXwAAXYumAV8AAF2LtAFfAABdwAD1HQFbXcAA9R0BW13AAPYOAV8AAF3AAPYOAV8AAF2LtAFfAABhAV8AAGDAAPKzYQFfAABgwADys2EBXwAAYMAA8rNhAV8AAFxhAV8AAFxdwAD2DgFfAABdi9sBXwAAXYvbAV8AAF2L5gFfAABdi+YBXwAAXcAA9R0BYI2fXcAA9R0BYI0xXcAA9R0BYI5jXcAA9R0BYIzOXcAA9R0BYI0xXcAA9R0BYI2fXcAA9R0BYIypXcAA9R0BYIx1XcAA9R0BYIyPXcAA9R0BYI5jXcAA9R0BYI5jXcAA9R0BYI5jXcAA9R0BYJL2XcAA9R0BYJL2XcAA9R0BYI1eXcAA9R0BYI2fXcAA9R0BYI0xXcAA9R0BYI19XcAA9R0BYI5jXcAA9R0BYI5jYQBcXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXcAA9U4CYIw3YI5jXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFWAltbXaFW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AmDAAPZdYJpGXcAA9R0BYJvfXcAA9U4CYMAA9l1dwAD1HQFgm99dwAD1HQFgm99dwAD1HQFgm99dwAD1HQFgwAD1xV3AAPUdAWDAAPXFXcAA9R0BYMAA9cVdwAD1HQFgwAD1xV3AAPUdAWDAAPXFXcAA9R0BYMAA9cVdwAD1HQFgwAD1xV3AAPUdAWDAAPXFXcAA9R0BYMAA9cVdwAD1HQFgwAD1xV3AAPUdAWDAAPXFXcAA9R0BYMAA9cVdwAD1HQFgwAD1xV3AAPUdAWDAAPXFXcAA9R0BYMAA9cVdwAD1HQFgwAD1xV3AAPUdAWDAAPXFXcAA9R0BYMAA9cVdwAD1HQFgwAD1xV3AAPUdAWDAAPXFXcAA9R0BYMAA9cVdwAD1HQFgwAD1xV3AAPUdAWDAAPXFXcAA9R0BYMAA9cVdwAD1HQFgwAD1xV3AAPUdAWDAAPXFXcAA9R0BYMAA9cVdwAD1HQFgwAD1xV3AAPUdAWDAAPXFXcAA9R0BYMAA9cVdwAD1HQFgwAD1xV3AAPUdAWDAAPXFXcAA9R0BYMAA9cVgwADB4F3AAPUdAWDAAPXFXcAA9R0BYMAA9cVdwAD1HQFgwAD1xV3AAPUdAWDAAPXFXcAA9R0BYMAA9cVdwAD1HQFgwAD1xV3AAPUdAWDAAPXFXcAA9R0BYMAA9cVdwAD1HQFgwAD1xV3AAPUdAWDAAPXFXcAA9R0BYMAA9cVdwAD1HQFgwAD1xV3AAPUdAWDAAPXFXcAA9R0BYMAA9cVdwAD1HQFgwAD1xV3AAPUdAWDAAPXFXcAA9R0BYMAA9cVdwAD1HQFgwAD1xV3AAPUdAWDAAPXFXcAA9R0BYMAA9cVdwAD1HQFgwAD1xV3AAPUdAWDAAPXFXcAA9R0BYMAA9cVdwAD1HQFgwAD1xV3AAPUdAWCb313AAPVOAmDAAPZdW13AAPVOAmDAAPZdW13AAPVOAmDAAPZdW13AAPVOAmDAAPZdW13AAPVOAmDAAPZdW13AAPVOAmDAAPZdW2EBYMAA9l1dwACy6gFgwAD1gmEBYMAA9l1dwACy6gFgwAD1gmEBYMAA9l1dwACy6gFgwAD1gmEBYMAA9l1dwACy6gFgwAD1gmEBYMAA9l1dwACy6gFgwAD1gmEBYMAA9l1dwACy6gFgwAD1gmEAXcAAsuoBXwAAYQBgwAD23l3AAPVO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XwAAXwEAXaDpAl8AAF8BAF2g6QJfAABfAQBdoOkCXwAAXwEAXaDpAl8AAF8BAF2hVgJfAABfAQBdoVYCXwAAXwEAXaFWAl8AAF8BAF2hVgJfAABfAQBdoVYCXwAAXwEAXaFWAl8AAF8BAF2hVgJfAABfAQBdoVYCXwAAXwEAXaFWAl8AAF8BAF2hVgJfAABfAQBdoVYCXwAAXwEAXaFWAl8AAF8BAF2hVgJfAABfAQBdoVYCXwAAXwEAXaFWAl8AAF8BAF2hVgJfAABfAQBdoVYCXwAAXwEAXaFWAl8AAF8BAF2hVgJfAABfAQBdoVYCXwAAXwEAXaFWAl8AAF8BAF2hVgJfAABfAQBdoVYCXwAAXwEAXaFWAl8AAF8BAF2hVgJfAABfAQBdoVYCXwAAXwEAXaFWAl8AAF8BAF2hVgJfAABfAQBdoVYCXwAAXwEAXaFWAl8AAF8BAF2hVgJfAABfAQBdoVYCXwAAXwEAXaFWAl8AAF8BAF2hVgJfAABfAQBdoVYCXwAAXwEAXaFWAl8AAF8BAF2hVgJfAABfAQBdoVYCXwAAXwEAXaFWAl8AAF8BAF2hVgJfAABfAQBdoVYCXwAAXwEAXaFWAl8AAF8BAF2hVgJfAABfAQBdoVYCXwAAXwEAXaFWAl8AAF8BAF2hVgJfAABfAQBdoVYCXwAAXwEAXaFWAl8AAF8BAF2hiwJfAABfAQBdoYsCXwAAXwEAXaGLAl8AAF8BAF2hiwJfAABfAQBdoYsCXwAAXwEAXaGLAl8AAF8BAF2hiwJfAABfAQBdoYsCXwAAXwEAXaGLAl8AAF8BAF2hiwJfAABfAQBdoYsCXwAAXwEAXaGLAl8AAF8BAF2hiwJfAABfAQBdoYsCXwAAXwEAXaGLAl8AAF8BAF2hiwJfAABfAQBdoYsCXwAAXwEAXaGLAl8AAF8BAF2hiwJfAABfAQBdoYsCXwAAXwEAXaGkAl8AAF8BAF2hpAJfAABfAQBdoaQCXwAAXwEAXaGkAl8AAF8BAF2hpAJfAABfAQBdoaQCXwAAXwEAXaGkAl8AAF8BAF2hpAJfAABfAQBdoaQCXwAAXwEAXaGkAl8AAF8BAF2hpAJfAABfAQBdoaQCXwAAXwEAXaGkAl8AAF8BAF2hpAJfAABfAQBdoaQCXwAAXwEAXaGkAl8AAF8BAF2hpAJfAABfAQBdoaQC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wAD1xV3AAPUdAV3AAPUdAWDAAPXFXcAA9R0BYMAA9cVdwAD1HQFdwAD1HQFgwAD1xV3AAPUdAWDAAPXFXcAA9R0BXcAA9R0BYMAA9cVdwAD1HQFgwAD1xV3AAPUdAWDAAPXFXcAA9R0BYMAA9cVdwAD1HQFgwAD1xV3AAPUdAWCIsV3AAPUdAWDAAPXFXcAA9R0BYMAA9cVdwAD1HQFgwAD1xV3AAPUdAWDAAPXFXcAA9R0BYMAA9cVdwAD1HQFdwAD1HQFgwAD1xWDAAPZdXcAA9R0BXcAA9R0BYMAA9cVdwAD1HQFgwAD1xV3AAFByAmDAAFBOYMAA9cVdwAD1HQFgwABQTl3AAPUdAWDAAFHVXcAA9R0BYMAAUdVhAWDAAPZdYMAA8rNeAAEEAWDAAPZdA5VPYQFgwAD2XWDAAPKzqHtgwAD0eah8YMAA8rMBV8AAUbkAXGEBYMAA9l1gwADys14AAwMDYKu/YKvxYMAA9l0AAVesBwBbXcAA9U4CXwAAXwEAXcAA9U4CXwAAXwEAYQBfAQBdwAD1TgJfAABfAQBdwAD1TgJfAABfAQBdwAD1TgJfAABfAQBdwAD1TgJfAABfAQBdwAD02wFfAABdwAD02wFfAABdwAD02wFfAABdwAD02wFfAABdwAD02wFfAABdwAD1HQFfAABdwAD1HQFfAABdwAD1HQFfAABdwAD1HQFfAABdwAD1HQFfAABdwAD1HQFfAABdwAD1HQFfAABdwAD1HQFfAABdwAD1HQFfAABdwAD1HQFfAABdwAD1HQFfAABdwAD1HQFfAABdwAD1HQFfAABdwAD1HQFfAABdwAD2DgFfAABdwAD2DgFfAABdwAD1HQFbYQBfAQBdwABSiAJfAABfAQBdwAD1HQFbXcAAUqcBXwAAYQFfAABgwADys2EBXwAAYMAA8rNdwAD2DgFfAABdwAD2DgFfAABdwAD2DgFbXcAA9g4BW13AAPYOAV8AAF3AAPUdAVteAAEBAVsAAVesBQBbXcAAs90BYMAA9l1dwACz3QFgwAD2XWEAXGEAXF3AAPUdAWDAAPZdYMAA9G9gwADBvl3AAPUdAWDAAFMxXcAA9R0BYMAAUzFdwAD1TgJbXcAA9U4CW1tdwAD1TgJbW2EBW1tdwAD1TgJbW13AAPVOAltdwAD1TgJbXcAA9R0BW13AAPVOAltd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AWCS4V3AAPUdAWCSxl3AAFw3AWDAAFxhXcAAXDcBYMAA9t5dwABcNwFgwAD2XV3AAFw3AWCwo2DAAMNlXcAA9R0BYMAA9HlgwADDZV3AAPUdAWDAAFibXcAA9R0BYMAAWJtdwAD1HQFgkuFdwAD1HQFgkuFdwAD1TgJfAABgwAD0eWEBXwAAXGEAXwAAXcAA9R0BXwAAXcAA9U4CYMAA9t5gwABcSV3AAPVOAmDAAPZdYMAAXFddwAD1TgJgwAD2XWCMqV3AAPVOAmDAAPZdYMAAXGFdwAD1TgJgwAD2XWDAAFxhYQBfAABdwAD1HQFfAABhAF8AAF3AAPUdAWDAAPZdXcAA9R0BYMAAWDZdwAD1HQFgkuFdwAD1HQFfAABdwAD1HQFfAABdwAD1HQFfAABhAF8BAF3AAPVOAl8AAF8BAGEAXwEAXcAA9U4CXwAAXwEAYQBfAQBdwAD1TgJfAABfAQBhAF8BAF3AAPVOAl8AAF8BAGEAXwEAXcAA9U4CXwAAXwEAXcAA9R0BXwAAYQBfAQBdwAD1TgJfAABfAQBdwAD1HQFfAABhAF8AAF3AAPVOAmDAAPZdXwAAXcAA9R0BXwAAYQBfAQBdwAD1TgJfAABfAQBdwAD1HQFgsKNhAF8AAF3AAPVOAmCwo18AAF3AAPUdAWCSWWEBXwAAXGEBXwAAXGEBXwAAXGEBXwAAXGEBXwAAXGEBXwAAXGEBXwAAXGEBXwAAXGEBXwAAXGEBXwAAXF3AAPUdAWCMdV3AAPVOAmDAAPR5YIwVXcAA9U4CYIwVYMAA9HldwAD1TgJgwAD0eWCTBV3AAPVOAmCTBWDAAPR5XcAA9R0BW13AAPUdAVtdwAD1HQFbXcAA9R0BW13AAPUdAVtdwAD1HQFbXcAA9R0BYMAAXiVdwAD1HQFgwABePF3AAPUdAWDAAF52XcAA9R0BYMAAXotdwAD1HQFgwABeW13AAPUdAWDAAF5oXcAA9R0BYMAAXk1dwAD1HQFgwABek13AAPVOAmDAAF3hXcAA9R0BYMAAXeFdwAD1HQFgwABeM13AAPVOAmDAAPZdW13AAPVOAmDAAPZdW13AAPUdAWDAAPZdXcAA9R0BYMAAXnZdwAD1HQFgwABeW13AAPUdAWDAAF48XcAA9R0BYMAAXmhdwAD1HQFgwABedl3AAPUdAWDAAF5bXcAA9U4C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jZ9gwACGvF3AAPVOAmCS4WCwuV3AAPVOAmDAAIa2XcAA9R0BYMAAhrxdwACG/wNgwACGqmDAAJr0YMAAmuFdwACG/wNgwACGsGDAAJteYMAAmwxdwACG7wJgwACGtmDAAJuWYQFgq/Fgq+FhAWCr8WCr4V3AAIb/A2DAAIaqYMAAmvRgwACa4V3AAIb/A2DAAIaqYMAAmvRgwACa4V3AAIb/A2DAAIaqYMAAmvRgwACa4WEBYLC/XF3AAIb/A2DAAIaqYMAAmvRgwACa4V3AAIb/A2DAAIaqYMAAmvRgwACa4WEBYLCtXF3AAIb/A2DAAIawYMAAm15gwACbDF3AAIb/A2DAAIawYMAAm15gwACbDF3AAIb/A2DAAIawYMAAm15gwACbDF3AAIb/A2DAAIawYMAAm15gwACbDF2KVAFgwABYXWEBYJL2YMAAWF1hAWCS9mDAAFhdXYpUAWDAAFhdYQFgkvZgwABYXV2KVAFgwABYXWEBYJL2YMAAWF1dilQBYMAAWF1diiMBYMAAWF1dwACG7wJgwACGymDAAJxGXcAAhv8DYMAAhrBgwACbXmDAAJsMXcAAhv8DYMAAhrBgwACbXmDAAJsMXcAA9R0BYMAAWDZdwAD1HQFgwABYNmEBYJICYMAAWDZdwAD1HQFgwABYNmEBYJICYMAAWDZgwAD2XV3AAPUdAWDAAPZdXcAA9R0BYMAAWDZhAWCSAmDAAFg2XcAA9R0BYMAAWDZhAWDAAFg2YMAAWDZhAWDAAFg2YMAAWDZdwACG/wNgwACGsGDAAJteYMAAmwxdwACG/wNgwACGsGDAAJteYMAAmwxdwACG/wNgwACGsGDAAJteYMAAmwxdwACG7wJgwACGtmDAAJuWXcAAhu8CYMAAhrZgwACbll3AAIbvAmDAAIa2YMAAm5ZdwACG7wJgwACGxWDAAJxRXcAAhu8CYMAAhsVgwACcUV3AAIb/A2DAAIawYMAAm15gwACbDF3AAIb/A2DAAIawYMAAm15gwACbDF3AAIb/A2DAAIawYMAAm15gwACbDF3AAIb/A2DAAIawYMAAm15gwACbDF3AAIb/A2DAAIawYMAAm15gwACbDF3AAIb/A2DAAIawYMAAm15gwACbDF3AAIb/A2DAAIawYMAAm15gwACbDGEBYLC/XF3AAIb/A2DAAIawYMAAm15gwACb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YMAA3BNdwAD2KwFdwAD1HQFgwAD0eWDAANwTYMAA3BNgwADcE2DAANwTYMAA3BNgwADcE2DAANwTYMAA3BNdwAD2KwFdwAD1HQFgwAD0eWDAANwTXcAA9isBXcAA9R0BYMAA9HldwAD2KwFdwAD1HQFgwAD0eV3AAPYrAV3AAPUdAWDAAPR5YQBfAABdwAD1HQFfAABhAF8AAF3AAPUdAWDAAPZdYQBfAABdwAD1TgJgwAD2XV8AAF3AAPYOAWDAAPR5XcAA9R0BXwAAYQBfAABdwAD1HQFfAABdwAD1TgJgwAD2213AAIgCAVtdwACIAgFbXcAAiAIBYMAA9t5dwACIAgFgwAD2XV3AAPUdAWDAAPR5YMAAw2VdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACJEgJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBdwACI0AJfAABfAQBhAmDAAPZdYMAA9l1gwACL/mECYMAA9l1gwAD2XWDAAIv+YQJgwAD2XWDAAPZdYMAAi/5dwAD1HQFgwACL5F3AAPUdAWDAAIvkXcAA9R0BYMAAjEldwAD1HQFgwACKl13AAPUdAWDAAIqXXcAA9R0BYMAAjFZdwAD1HQFgwACMVl3AAPUdAWDAAIt2XcAA9R0BYMAAi3ZdwAD1HQFgwACMVl3AAPUdAWDAAIxJXcAA9R0BYMAAipddwAD1HQFgwACMVl3AAPUdAWDAAIr1YQFgwACKnlxhAWDAAIqeXF3AAPUdAWDAAImAXcAA9R0BYMAAjFZbW2EBYMAAipdgwACJgGEBYMAAipdgwACJgGEBYMAAipdgwACJgF3AAPUdAWDAAIxWXcAA9R0BW13AAPUdAWDAAIpJXcAA9R0BYMAA9l1hAWDAAIqXYMAA8rNdwAD2DgFfAABdwAD1HQFfAABdwACOJgFgwAD2XV3AAI4mAWDAAPZdXcAA9R0BXcAA9U4CYMAA9l1gwAD2XV3AAPUdAWDAAPR5XcAA9R0BYMAA9HldwAD1HQFgwAD0eV3AAPUdAWDAAPR5XcAA9U4CYMAA9l1gwAD2XV3AAPVOAmDAAPZdYMAAjp1dwAD1TgJgwAD2XWDAAI6dYQFbYMAAipdhAVtgwACLdmEBW2DAAImAXcAA9R0BYMAAiYBdwAD1HQFgwACJgGEBW1xeAAEBAVsAAVfAAIgzAFtdwAD1HQFgwACJgF3AAPUdAWDAAImAXcAA9R0BYMAAiYBhAVtcXgABAQFbAAFXwACIMwBbXgABAQFbAAFXwACIMwBbYQFgwACMZGEBW2DAAPXFYQFbYMAA9cVeAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFtdwAD1HQFgwACK9V4AAQEBWwABV8AAiDMAW14AAQEBWwABV8AAiDMAW14AAQEBWwABV8AAiDMAW14AAQEBWwABV8AAiDMAW14AAQEBWwABV8AAiDMAW14AAQEBWwABV8AAiDMAW14AAQEBWwABV8AAiDMAW14AAQEBWwABV8AAiDMAW14AAQEBWwABV8AAiDMAW13AAPUdAWDAAIqXXcAA9R0BYMAAipdhAltbW14AAQEBWwABV8AAiDMAW14AAQEBWwABV8AAiDMAW14AAQEBWwABV8AAiDMAW14AAQEBWwABV8AAiDMAW14AAQEBWwABV8AAiDMAW14AAQEBWwABV8AAiDMAW14AAQEBWwABV8AAiDMAW14AAQEBWwABV8AAiDMAW14AAQEBWwABV8AAiDMAW13AAPUdAWDAAIt2XcAA9R0BYMAAi3ZeAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFteAAEBAVsAAVfAAIgzAFtdwAD1HQFgwACMSV3AAPUdAWDAAIxJXgABAQFbAAFXwACIMwBbXgABAQFbAAFXwACIMwBbXgABAQFbAAFXwACIMwBbXcAA9g4BYMAAiWBdwAD2DgFgwACJYF3AAPYOAWDAAPZdXcAA9R0BYMAA9l1gwAD0b12KIwFgwAD2XWDAAI9uYMAAj25gwACPf2DAAI9/YMAAj39hAFxdwAD2DgFgkgJd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wAD1HQFfAABhAl8AAF8AAGDAAPR5XcAA9R0BXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAApuMDXwAAXwEAXwIAXcAA9U4CXwAAXcAArlgCXwEAXwIAXcAApuMDXwAAXwEAXwIAXcAA9U4CXwAAXcAArlgCXwEAXwIAYQJfAQBfAgBcYQJfAQBfAgBdwAD1dQJfAwBfBABdwAD1TgJfAABdwACuWAJfAQBfAgBhAF8CAGECXwEAXwIAYMAA8rNdwAD1TgJfAABdwACuWAJfAQBfAgBhAV8CAF8CAGEAXwIAXcAA9U4CXwAAXcAArlgCXwEAXwIAYQJfAQBfAgBfAgBdwAD1HQFbXcAAp1wBXwEAXcAAp1wBXwEAXcAAp1wBXwAAXcAAp1wBXwAAXcAAp1wBXwAAXcAAp1wBXwAAXcAAuscCXwAAYMAA9HldwAC6xwJfAABgwAD0eV3AAKdcAV8AAF3AAKdcAVtdwACnXAFbXcAAp1wBW13AAKdcAVtdwAD1TgJgwACnpmDAAPR5XcAA9U4CYMAAp6ZgwAD0eV3AAKdcAV8AAF3AAKdcAV8BAF3AAKdcAV8AAF3AAKdcAV8AAF3AAKehAVtdwACnsQJbW13AAKeJAVtdwACnfwFbXcAAp5wBW13AAKdcAVtdwACnoQFbXcAAp7ECW1tdwACniQFbXcAAp38BW13AAKecAVtdwACnXAFbXcAAp9oCXwAAXwEAXcAAp98BXwAAXcAA9U4CXwIAXwMAYQJfAABfAQBfAgBhAl8AAF8BAF8DAF3AAPVOAl8AAF8BAF3AAPVOAl8AAF8BAGECXwEAXwEAXwEAXcAA9U4CXwEAXcAA9R0BXwAAYQFfAABfAQBdwAD1HQFfAABhAV8AAF8BAGECXwEAXwEAYMAA9HlhAV8AAF8BAGECXwEAXwEAYMAA9HldwAD1TgJfAABdwAD2DgFfAABdwAD2DgFfAABdwAC6xwJfAABgwAD0eV3AALrHAl8AAGDAAPR5XcAA9R0BXwAAXcAAutMBXwAAYQFfAABgwAD1gl3AALrHAl8AAGDAAPR5XcAAuscCXwAAYMAA9HldwAD2DgFfAABdwAD1HQFdwAD2DgFfAABhAV8AAGDAAPWCXcAAp/UBXwAAXcAAp/UBXwAAXcAA9R0BXwAAXcAAqBYBXwAAXcAAqBYBXwAAXcAAqBYBXwAAXcAAqBYBXwAAXcAAqBYBXwAAXcAAqBYBXwAAXcAAqBYBXwAAXcAAqBYBXwAAXcAAqBYBXwAAXcAA9R0BXwAAXcAA9g4BXwAAXcAAqBYBXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAAqBYBXwAAYQFfAABcXcAAqDcBXwAAXcAAqDcBXwAAYQFfAABgwADys2EBXwAAYMAA8rNhAV8AAGDAAPKzYQBfAABhAV8AAGDAAPKzYQBfAABhAV8AAGDAAPKzYQBfAABhAl8AAF8AAF8AAGECXwEAXwAAXwEAXcAA9R0BXwAAXcAA9g4BXwAAXcAAqDcBXwAAXcAAqDcBXwAAXcAAqDcBXwAAYQFfAABgwADys13AAPUdAV8AAF3AAKg3AV8AAF3AAKg3AV8AAF3AAKg3AV8AAF3AAPUdAV8AAF3AAPUdAV8AAF3AAPUdAV8AAF3AAKg3AV8AAF3AAKg3AV8AAF3AAKg3AV8AAF3AAKg3AV8AAF3AAKg3AV8AAF3AAKg3AV8AAGEBXwAAYMAA8rNhAV8AAGDAAPKzXcAAqDcBXwAAXcAAqDcBXwAAXcAAqDcBXwAAXcAAqDcBXwAAXcAAqDcBXwAAXcAAqDcBXwAAXcAAqDcBXwAAXcAAqHsBXwAAXcAA9R0BXwEAXcAAqHsBXwEAXcAAqHsBXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAAqHsBXwAAXcAAqHsBXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAAqHsBXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAA9R0BXwAAXcAAqHsBXwAAXcAAqHsBXwAAXcAAqKACXwAAXwEAXcAA9g4BXwAAXcAA9NsBXwAAXcAA9g4BXwAAXcAAqNABXwAAXcAA9g4BXcAA9g4BXwAAXcAA9NsBXwAAXcAA9NsBXwAAXcAA9NsBXwAAXcAA9NsBXwAAXcAA9NsBXwAAXcAA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CjWCAAASrQAKNc8AABKzAApIdAAAErkAClEtAAASxwAKUsgAABLQAApTMQAAEtkAClNUAAAS4gAKU38AABLrAApTqgAAEvQAClPWAAAS/QAKVE8AABMGAApYfgAAEw8AClmwAAATGAAKWi4AABMhAAparwAAEyoACl5+AAATMwAKYUUAABM8AAphoAAAE0gACmNXAAATUQAKZAkAABNaAAplPQAAE2MACmVgAAATbAAKZeAAABN1AApmGwAAE34ACmrhAAAThwAKawgAABONAApuuAAAE5MACm9nAAATnAAKb/gAABOlAApxbwAAE64ACnKiAAATtwAKdYsAABPAAAp2bQAAE8kACoBxAAAT0gAKgNgAABPdAAqFrQAAE+gACoXfAAAT8wAKiQkAABP+AAqJxgAAFAkACorFAAAUFAAKjv0AABQZAAqPYwAAFCsACo+EAAAUNAAKkUEAABRJAArC6AAAFFIACs13AAAUYgAKz2gAABRuAArdDAAAFHoACt05AAAUfwAK3koAABSEAAruqgAAFIkACvZJAAAUkgALMMEAABSfAAt1swAAFK0AC3XPAAAUtgALdncAABTKAAt2kwAAFNMAC3dAAAAU3AALd4UAABTnAAt3ygAAFPIAC3gPAAAU/QALeFQAABUIAAt4xgAAFRMAC3j6AAAVHgALeUwAABUpAAt5ZQAAFTQAC3m8AAAVPwALee8AABVKAAt6CAAAFVUAC3qNAAAVYAALezIAABVrAAt7SwAAFXYAC3veAAAVgQALfC4AABWMAAt8fQAAFZcAC3yWAAAVogALfRwAABWtAAt9agAAFbgAC323AAAVwwALfdAAABXOAAt+FQAAFdkAC35gAAAV5AALfrIAABXvAAt+6AAAFfoAC39bAAAWBQALf6QAABYQAAt/7QAAFhsAC4A2AAAWJgALgH8AABYxAAuAyAAAFjwAC4DXAAAWRwALgV4AABZMAAuBzgAAFlcAC4HnAAAWYgALgk8AABZtAAuClAAAFngAC4LGAAAWgwALgxkAABaOAAuDTwAAFpkAC4OUAAAWpAALg8YAABavAAuEGQAAFroAC4RPAAAWxQALhJQAABbQAAuExgAAFtsAC4T5AAAW5gALhUwAABbxAAuFgAAAFvwAC4W8AAAXBwALhlEAABcSAAuGeQAAFx0AC4aSAAAXKAALhyAA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ACptABHQfgAAKnYAEdDBAAAqfwAR0WgAACqIABHR4QAAKpEAEdIuAAAqmgAR0qQAACqjABHUIAAAKqwAEdSEAAAquAAR1J0AACrBABHcRQAAKsoAEdzhAAAq0wAR3RgAACrcABHigwAAKuUAEeMYAAAq7gAR49MAACr3ABHrIwAAKwAAEetGAAArCQAR62kAACsSABH5IAAAKxsAEfl6AAArJAAR/KUAACstABH83gAAKzYAEf8PAAArPwAR/3YAACtIABIXJwAAK1EAEh1lAAArVAASJGQAACtdABIkmQAAK2YAEmarAAArbwASZvwAACt6ABJn9wAAK4UAEnsJAAArjAASgJYAACuXABKCoAAAK5wAEoNTAAAroQAShqUAACuxABKHPwAAK7wAEofSAAArxwASiHcAACvSABKJIgAAK90AEow9AAAr6AASnhQAACvtABKelwAAK/AAEp8HAAAr8wASoMEAACv2ABKn3gAALAEAEqq1AAAsDgASrmoAACwlABKvwAAALDAAErCWAAAsPAASsN4AACxIABKyqQAALFQAErNXAAAsYAAStWgAACxsABK2uwAALHcAErduAAAsggASuE4AACyLABK4cQAALJYAErwmAAAsmQASyVMAACycABLN5QAALJ8AEs5mAAAsogASzoQAACytABLOxQAALLAAEtRaAAAsswAS1dYAACy2ABLW8AAALMEAEt5nAAAszAAS9zQAACzVABL5bQAALOMAEvvYAAAs7gAS+/kAAC0AABL8PgAALQsAEwFYAAAtFAATAjMAAC0kABMFcQAALTQAEwWsAAAtQgATBtYAAC1kABMHEQAALXIAEwfhAAAtlAATCBwAAC2iABMI7gAALcQAEwkpAAAt0gATCh4AAC30ABMKSgAALf8AEws2AAAuCgATDJ4AAC4VABMNNAAALiUAEw2CAAAuNQATL8IAAC4+ABMxWQAALkoAEzG3AAAuUwATO/cAAC5fABM8VwAALmoAEz0rAAAudQATPY4AAC6AABNEjQAALosAE0WUAAAukgATRfgAAC6dABNHbQAALqcAE03UAAAusQATU1EAAC68ABNUfwAALscAE1TPAAAu1wATWiwAAC7iABNpHQAALuwAE2+vAAAu/AATcUgAAC8JABN0BwAALxQAE3U+AAAvHwATdWoAAC8qABN1lAAALzUAE3qdAAAvPwATevMAAC9KABN8MAAAL1UAE3xcAAAvZAATgUMAAC9vABOBpwAAL38AE4U9AAAvjwAThV8AAC+aABOFgQAAL6UAE42SAAAvsAATjp0AAC+/ABOQmgAAL9YAE6jlAAAv3QATqSQAAC/qABOqsQAAL/cAE6s1AAAwAgATq08AADAxABOsYgAAMD4AE6x8AAAwbQAUhXkAADB6ABSHAgAAMH8AFIdJAAAwhAAUijcAADCJABSR+AAAMJIAFJRyAAAwlQAUmR0AADCeABScmgAAMKwAFJ7gAAAwuAAUoPUAADDEABShJQAAMNAAFK6qAAAw3AAUsMQAADDlABSxagAAMPMAFLI4AAAxBwAUteQAADEQABS4UgAAMRMAFLktAAAxHwAUuggAADErABS66QAAMTcAFL2VAAAxRQAUv5QAADFRABTAbAAAMWUAFMEbAAAxcAAUwsMAADGEABTDcgAAMY8AFMUAAAAxowAUxZYAADGuABTFmwAAMbkAFMoiAAAxzQAUywwAADHbABTVmQAAMeAAFNgjAAAx7AAU2EsAADH1ABTYgQAAMgEAFNyMAAAyDQAU3LgAADIZABTd4gAAMiIAFN4OAAAyLgAU3zoAADI3ABTfZgAAMkUAFOozAAAyTgAU6okAADJ0ABTq4QAAMpoAFOuGAAAyuAAU69gAADLEABTzyAAAMswAFP7xAAAy2gAU/6IAADLoABUD/AAAMvQAFQRYAAAzCwAVCBgAADMVABUJOgAAMyEAFQpjAAAzLQAVC6wAADM7ABUOigAAM0QAFQ92AAAzRwAVEMoAADNKABURVgAAM00AFR87AAAzUAAVH2EAADNgABUhCAAAM2sAFSHdAAAzeQAVInAAADOEABUjJgAAM48AFSOVAAAzmgAVJjgAADOlABUnlQAAM7MAFShIAAAzvgAVKUYAADPMABUqMQAAM9cAFStJAAAz4gAVLGUAADPtABUtJAAAM/gAFS31AAA0BgAVMQsAADQRABUxowAANBwAFTPcAAA0JwAVNLEAADQ1ABU2DgAANEAAFTb+AAA0SwAVOEcAADRZABU4iAAANGQAFT6IAAA0bwAVPu0AADR9ABU/MAAANIsAFT95AAA0nQAVP/sAADSmABVBsgAANLIAFUKJAAA0uwAVQ1UAADTEABVDWgAANM8AFURwAAA04wAVRYsAADTzABVGXgAANQMAFUfIAAA1EwAVT20AADUcABVPoQAANSEAFU+zAAA1LAAVVMIAADUxABVXIwAANTwAFVkPAAA1RwAVZxYAADVSABWHNAAANVsAFYefAAA1ZgAVh90AADVxABWIGwAANXwAFYikAAA1hwAViMIAADWSABWJNgAANZsAFY/SAAA1pgAVkHsAADWsABWRlgAANbUAFZRbAAA1vQAV5PoAADXGABXlOAAANdgAFfctAAA15AAV918AADXxABYZbQAANf4AFkOfAAA2BwAWRD0AADYVABZEoAAANiMAFm6lAAA2MQAWbwUAADY6ABaqCAAANkMAFszzAAA2TAAWzbIAADZVABbS5gAANl4AFtMdAAA2ZwAW1LkAADZwABbVFgAANnkAFtVMAAA2ggAW1pYAADaLABbewAAANpQAFuu2AAA2pwAXDAwAADauABdNNgAANrcAF01pAAA2xQAXTgQAADbTABdPUwAANuEAF0/LAAA27wAXT/4AADb9ABdQmgAANwsAF1gsAAA3FAAXagcAADcdABdqJAAANysAF2urAAA3MAAXbCUAADc+ABeGdQAAN0oAF5LnAAA3UwAXluAAADdhABeXSQAAN28AF5eMAAA3eAAXmI4AADeGABeZtAAAN5QAF5nQAAA3nwAXmo0AADeqABeaqgAAN7UAF5r9AAA3wAAXm1AAADfJABebowAAN9IAF8VjAAA32wAXxpQAADfpABfHBwAAN/QAF8ppAAA4AAAX0SgAADgLABfRvQAAOBkAF9JPAAA4JwAX0z4AADg1ABfTngAAOEAAF9ilAAA4SwAX2OUAADhUABfZBAAAOF4AF9koAAA4aAAX2bcAADhxABgJ5AAAOHsAGAwLAAA4gQAYDpcAADiKABhSXgAAOJgAGFKAAAA4oQAYVDwAADiqABhVwAAAOLMAGFbAAAA4ugAYVxoAADjDABhYcQAAOMwAGFmfAAA41QAYWcMAADjeABha2QAAOOcAGF6+AAA48AAYX5IAADj2ABh9DAAAOPwAGH99AAA5BQAYgJQAADkOABiC2AAAORcAGIMEAAA5IAAYkv0AADkpABiTXAAAOTIAGJS6AAA5OwAYlN4AADlEABiWFgAAOU8AGJaNAAA5WAAYni0AADlhABk5+AAAOWoAGTpkAAA5cwAZV3AAADl8ABmYlAAAOYUAGZonAAA5jgAZmmcAADmXABmaiQAAOaAAGc7hAAA5qQAZ0CkAADm9ABnwWQAAOcYAGfCUAAA50QAZ8NIAADnaABnw8gAAOeMAGfFsAAA5/wAZ8ZUAADoIABn2WAAAOiQAGfZ2AAA6QAAZ9xMAADpSABn3qQAAOn0AGfgDAAA6qAAZ+JgAADrTABn6cQAAOv4AGfr9AAA7FwAZ/qIAADslABn/WwAAOzAAGf+bAAA7OQAZ/9gAADtCABoBOQAAO0sAGgJIAAA7WQAaAm0AADtiABoC8gAAO20AGgNZAAA7eAAaA7sAADuDABoEZgAAO44AGgUqAAA7qgAaBogAADu1ABoG9QAAO9EAGgqEAAA72gAaCuYAADvlABoLTQAAO/AAGgu0AAA7+wAaDBMAADwGABoMGAAAPBEAGgy4AAA8JwAaDL0AADwyABoNLgAAPEgAGg1dAAA8VgAaDpkAADxyABoPIAAAPIgAGg8+AAA8lAAaD2AAADyfABoP3gAAPKoAGhEiAAA8uAAaEZEAADzUABoSIgAAPN4AGhPHAAA86QAaE+gAADz0ABoVGAAAPP8AGhawAAA9CgAaGFgAAD0TABoZwQAAPRwAGhvLAAA9JQAaHNEAAD0rABoebQAAPUAAGh8aAAA9UgAaH8oAAD1dABostgAAPWgAGiy5AAA9cQAaN/4AAD2DABo42wAAPZEAGjpyAAA9nwAaO3sAAD2oABo8uQAAPbEAGj6GAAA9ugAaP/sAAD3DABpA7gAAPc4AGkF0AAA91wAaQl4AAD3gABpEOAAAPewAGkReAAA99QAaRPQAAD4RABpFJwAAPhoAGkehAAA+NgAaTbgAAD5BABpN4AAAPl0AGk4HAAA+bwAaTsMAAD57ABpP1wAAPrIAGlCKAAA+6QAaUYEAAD8gABpTLAAAP1cAGlPmAAA/cAAaVKkAAD9+ABpVGQAAP4kAGlZjAAA/lAAaVqwAAD+dABpWzwAAP6YAGljjAAA/rwAaWV0AAD+4ABpZzgAAP8EAGln/AAA/zAAaWkwAAD/VABpaggAAP94AGlrKAAA/6QAaWxIAAD/0ABpbPwAAP/0AGluHAABACAAaW88AAEATABpcFwAAQB4AGlyNAABAKQAaXQMAAEA0ABpd6QAAQD8AGl67AABAWwAaYAQAAEBpABpgcwAAQIUAGmKaAABAjwAaYyEAAEClABpjQQAAQLEAGmNjAABAvAAaZRwAAEDHABpl/QAAQNIAGmZhAABA2wAaZwUAAEDmABpnmQAAQPEAGmf3AABA/AAaZ/wAAEEHABpoiAAAQR0AGmiNAABBKAAaaSQAAEE+ABppYwAAQUkAGmsbAABBVwAabBwAAEFzABpswgAAQX4AGm1WAABBiQAabrgAAEGUABpwtQAAQbAAGnNDAABBuQAac9cAAEHLABp09gAAQdQAGnUYAABB3QAaeSEAAEHmABp6wgAAQe8AGn5dAABB/QAag9gAAEIGABqD/AAAQhUAGoQgAABCJAAahEQAAEIzABqIjwAAQkIAGom7AABCTQAaiucAAEJYABqMEwAAQmMAGo4FAABCbgAak1EAAEJ5ABqTfQAAQoIAGpQNAABCiwAalDkAAEKUABqVSQAAQp0AGpV1AABCpgAalwUAAEKvABqXMQAAQrgAGr++AABCwQAawsYAAELJABrFzgAAQtEAGsjWAABC2QAay7AAAELhABrOjgAAQukAGtXJAABC8QAa174AAEL5ABrdmAAAQwQAGuFMAABDDAAa6QMAAEMcABrvVAAAQyQAGvXkAABDMgAbACQAAEM6ABsEhwAAQ0IAGwiBAABDSgAbDvwAAENSABsSzQAAQ1oAGxaLAABDYgAbHKsAAENqABs5qAAAQ3IAG0EyAABDegAbSicAAEOCABtQuwAAQ4oAG1nZAABDkgAbXdQAAEOaABtl2AAAQ6IAG20NAABDqgAbdGMAAEOyABuAtwAAQ7oAG4auAABDwgAblMgAAEPKABuY6wAAQ88AG5ueAABD1AAbm/kAAEPZABuerAAAQ94AG6AGAABD4wAbodIAAEPoABunmQAAQ+0AG6fdAABD8gAbrCIAAEP3ABuskQAAQ/wAG61IAABEAQAbrbcAAEQGABuubgAARAsAG67dAABEEAAbr5QAAEQVABuwAgAARBoAG7EXAABEHwAbtxcAAEQkABu3WgAARDgAG7iZAABEQQAbuNEAAERVABu6FQAARF4AG7pNAABEcgAbuxEAAER7ABu8MAAARIYAG7zbAABEjwAbvaMAAESjABu+TgAARKwAG8RyAABEwAAb0FoAAETQABvY+wAARN4AG9weAABE6QAb358AAET3ABvlcQAARQIAG+bWAABFDQAb7GYAAEUYABvs7QAARSMAG+8zAABFLgAb+mgAAEU5ABv8LQAARVQAG/3aAABFXwAcAOEAAEVqABwCIQAARXUAHAJPAABFhgAcA1EAAEWXABwDgwAARagAHAO3AABFuQAcBEcAAEXKABwHAgAARdsAHAdCAABF7AAcB2UAAEX9ABwH1gAARg4AHApYAABGHwAcC0cAAEYqABwL1wAARjUAHAz8AABGQAAcDbsAAEZLABwRJQAARlYAHBLOAABGZAAcFsoAAEZtABwX7gAARngAHBitAABGgwAcGgYAAEaOABwbRgAARpkAHB74AABGpAAcH54AAEavABwkGQAARrQAHCUpAABGvwAcJcMAAEbKABws+gAARtUAHDxeAABG2gAcPJgAAEbjABw8vQAARuwAHD58AABG9QAcPrcAAEb6ABw/RAAARwMAHD+6AABHDAAcQLsAAEcVABxA+AAARx4AHEM7AABHJwAcRMEAAEcwABxFUgAARzUAHEisAABHPgAcVzYAAEdHABxXngAAR0wAHGJEAABHUQAcYrMAAEdaABxkbwAAR2MAHGUUAABHbAAcaocAAEdxABxq/wAAR4gAHGwkAABHnwAcbM8AAEe2ABx8eAAAR8gAHH5BAABH2AAcf9wAAEfhAByKkgAAR+8AHI1zAABH+QAcjaoAAEgHAByNwgAASBYAHJOtAABIJQAclB8AAEguAByUSQAASDcAHJY0AABIQAAcmFwAAEhJAByaxgAASFIAHJtfAABIVQAcnDsAAEheAByd5wAASGcAHJ9yAABIagAcoHYAAEhzAByiogAASHwAHKOiAABIhQAcp9MAAEiOABypqgAASJcAHK0nAABIowAcs+wAAEisABy4AgAASLUAHLmxAABIvgAcvdwAAEjHABy+1QAASNAAHMIEAABI1QAc5ewAAEjeABzr5gAASOoAHOxGAABI+gAc7VYAAEkKABzt4gAASRoAHO5VAABJKgAc8VIAAEk6ABzy1wAASUUAHPlZAABJVQAc+dwAAEleABz6awAASWMAHPr7AABJbAAc/IoAAEl1ABz+hwAASX4AHQhXAABJgwAdEiMAAEmIAB0StAAASZEAHROQAABJmgAdFtUAAEmjAB0YHwAASbUAHRjQAABJxgAdGw4AAEnRAB0i0QAASdYAHSfEAABJ5AAdKWYAAEnvAB0p5wAASfoAHTNWAABKBQAdNO4AAEoOAB01EgAAShcAHTZbAABKIAAdOBoAAEopAB05BAAASjUAHTl1AABKPQAdOcYAAEpFAB1PXAAASk0AHVD8AABKYgAdUyoAAEprAB1ThAAASnQAHVSvAABKfQAdVp0AAEqGAB1W+QAASo8AHVgkAABKmAAdYbwAAEqhAB1i5AAASq0AHWTeAABKtgAdarQAAEq/AB1q/QAASsgAHWwEAABK0QAdbCsAAEraAB1xHAAASuMAHXLaAABK7wAdc0IAAEr4AB11AAAASwEAHXcGAABLCgAdfiAAAEsPAB1/GwAASxQAHYOEAABLGQAdmUEAAEsiAB2aGwAASysAHZwEAABLNAAdnwAAAEs/AB2i+wAAS1EAHaPVAABLWgAdqJ0AAEtjAB2rOAAAS24AHaxoAABLeQAdxxEAAEuEAB3ZdQAAS5EAHdprAABLmgAd7OkAAEujAB3tVwAAS64AHgdbAABLswAeB4kAAEu8AB4TkgAAS8UAHh5CAABLzgAeH8AAAEvZAB4k1AAAS+QAHifZAABL7QAeLDUAAEv2AB4siAAATAEAHloaAABMDAAeWz8AAEwuAB5zLgAATDsAHnTJAABMRAAedRgAAExNAB518gAATFYAHnlKAABMXwAeeY0AAExoAB6O9gAATHEAHpG+AABMegAelaUAAEyJAB6V0wAATI4AHpYDAABMkwAelh0AAEyYAB6ZMQAATJ0AHqb4AABMpgAeq+sAAEyvAB6vLAAATLgAHq9eAABMvwAess0AAEzGAB6zIAAATM8AHuWdAABM2AAe7eYAAEzjAB7xbwAATOwAHvJ8AABM9QAe8zsAAEz+AB8NpgAATQcAHyPtAABNEAAfbrIAAE0ZAB9w4wAATR4AH3FXAABNKQAfdZkAAE0yAB96jwAATT0AH46aAABNRgAfkMoAAE1LAB+SsgAATVAAH5UEAABNVQAfqUcAAE1eAB+6TAAATW4AH8tnAABNdwAf2y8AAE2AAB/bpQAATYkAH9wbAABNkgAf6asAAE2bAB/p3QAATaQAH+pdAABNrQAf7h0AAE2yAB/wvQAATcIAH/w6AABNywAgAXgAAE3UACAEAAAATd0AIAaTAABN5gAgCIQAAE3vACAIxQAATfgAIApIAABOAQAgDXMAAE4KACAPlwAAThMAIBSWAABOHAAgFxwAAE4lACAZdAAATi4AIBtjAABONwAgG6QAAE5AACAdNQAATkkAICKmAABOUgAgKdMAAE5bACAyFQAATmQAIDu+AABObwAgQV0AAE54ACBDdgAATnsAIEW5AABOhQAgReMAAE6IACBGTQAATosAIEZ3AABOjgAgR14AAE6RACBJcwAATpsAIEmdAABOngAgSgcAAE6hACBKMQAATqQAIEz4AABOpwAgTSIAAE6qACBW5wAATq0AIFcUAABOtgAgbGEAAE7CACBtBQAATs4AIHeXAABO1wAgeG8AAE7gACB4rwAATukAIHzFAABO8gAggGgAAE77ACCCNgAATwQAIILmAABPDQAggysAAE8WACCNjQAATx8AII5pAABPKAAgjz8AAE8xACCQMgAATzoAIJNxAABPQwAg878AAE9TACD9YwAAT1wAIP/GAABPZwAhFOYAAE9zACEluAAAT34AISqXAABPigAhMXQAAE+WACE22wAAT6IAITeXAABPrQAhOBQAAE+4ACE41gAAT8MAITlSAABPzgAhObAAAE/ZACFF4wAAT+QAIUd3AABP8AAhSXkAAE/8ACFMxwAAUAgAIVDjAABQFAAhVfwAAFAgACFbGAAAUCwAIVyZAABQPQAhXVQAAFBOACFh6QAAUF8AIWk2AABQdQAhat8AAFCBACFtpwAAUI0AIXKeAABQmQAhdiIAAFClACF4rAAAULEAIXo6AABQugAhfLMAAFDGACF+rgAAUNQAIYD+AABQ6wAhhgoAAFD2ACGQUwAAUQIAIZpcAABRDgAhm9MAAFEcACGfjAAAUSoAIaVdAABROAAhqwUAAFFGACHo+gAAUVQAIfSSAABRXwAh9LAAAFFoACIGUwAAUXEAIkUhAABRfQAiRUYAAFGGACJKVwAAUY8AIkqIAABRnQAiTDYAAFGmACJTsQAAUa8AIlTrAABRuAAiVTkAAFHBACJWZgAAUcoAInWuAABR1gAidhoAAFHeACJ2swAAUeYAIncMAABR7gAid3EAAFH2ACJ6iAAAUf4AInrRAABSCQAijrMAAFIUACKaqwAAUh0AIqcXAABSKwAiqIMAAFI5ACKsFQAAUkcAIq1DAABSUgAisnAAAFJkACKzsQAAUm8AIsEaAABSegAiwlIAAFKDACLFuAAAUowAItRJAABSlQAi1IMAAFKeACLUqAAAUqcAItZnAABSsAAi1qIA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AGYmACmInQAAZjYAKYomAABmRAApjMUAAGZUACmR1QAAZmQAKZL8AABmaQApkxIAAGZyACmVFwAAZncAKZZKAABmggApl3cAAGaNACmYygAAZpYAKZodAABmnwApm3AAAGaoACmc4gAAZrEAKZzzAABmtgApnmUAAGbCACmedgAAZscAKZ/oAABm0wApn/kAAGbYACmhawAAZuQAKaF8AABm6QApou4AAGb1ACmi/wAAZvoAKaRSAABnBgAppcQAAGcPACml1QAAZxQAKacoAABnIAApqJcAAGcpACmoqAAAZy4AKaw1AABnPAApra0AAGdFACmtvgAAZ0oAKa9eAABnVgApsMUAAGdfACmw1gAAZ2QAKbH8AABncAApu/AAAGd5ACm9JgAAZ38AKb5cAABnhQApv40AAGeLACnBiQAAZ5EAKcK2AABnlwApw+MAAGedACnF7wAAZ6MAKcrFAABnqQApzZ0AAGevACnP7wAAZ7UAKdJFAABnvgAp0noAAGfMACnf3QAAZ9oAKeASAABn6AAp57oAAGf2ACnoLQAAZ/0AKei3AABoBAAp6TMAAGgLACnprwAAaBIAKeorAABoGQAqaDgAAGggACpo1AAAaCsAKmlwAABoNgAqajIAAGhBACpqzwAAaEwAKmtrAABoVwAqbAcAAGhiACpttAAAaG0AKm6YAABoeAAqb0AAAGiOACpxcwAAaJkAKnG4AABopQAqc1IAAGixACp2BAAAaLwAKnZDAABoxwAqdoIAAGjSACp2xAAAaN0AKnk6AABo6AAqeXwAAGjzACqPjAAAaP4AKpYEAABpDgAqlsQAAGkZACqX4AAAaSkAKpuqAABpPAAqnfEAAGlOACqitwAAaWAAKqMcAABpcAAqo2YAAGmAACqkKAAAaZAAKqXKAABpmAAqp2UAAGmgACqoPAAAaagAKqiEAABpsAAqqWUAAGm4ACqrlQAAacAAKq3XAABpyAAqrr0AAGnQACqvdgAAadgAKq+tAABp4AAqtMoAAGnoACrTgQAAafQAKtVKAABqCgAq1ZMAAGoWACsACAAAaiIAKwCcAABqMgArAmIAAGo9ACsDiQAAakYAKwR+AABqTwArBK0AAGpfACsF/gAAam8AKxRSAABqfwArFGwAAGqJACsXNwAAapcAKxegAABqnwArGBcAAGqnACsYdgAAaq8AKxlKAABqtwArGcwAAGrBACsbOQAAas8AKxtfAABq2gArHWsAAGrlACsd1QAAavAAKx5MAABq+gArH1MAAGsIACshfQAAaxIAKyKeAABrHgArJFAAAGsnACskrAAAazUAKyb3AABrQAArJ2YAAGtFACs37gAAa0oAKzqBAABrUwArOu4AAGteACs7DAAAa2kAKzuLAABrcgArPB4AAGt9ACs8WQAAa4gAKzybAABrkwArQ8cAAGueACtD3wAAa6QAK0SFAABrrQArRh8AAGu2ACtJyAAAa74AK0pGAABrxwArUDMAAGvQACtVoQAAa9sAK1l+AABr5gArWboAAGvxACtaagAAa/wAK1sRAABsBwArW00AAGwSACtb5gAAbB0AK1wiAABsKAArXRUAAGwzACteSAAAbD4AK2IVAABsSQArYlEAAGxUACtjAQAAbF8AK2OoAABsagArY+QAAGx1ACtkzQAAbIAAK2XlAABsiwAraQgAAGyWACtpLAAAbKEAK2oMAABsrAArasAAAGy3ACtrKAAAbMIAK2toAABszQArbwYAAGzYACtvKgAAbOMAK3D+AABs7gArcUwAAGz5ACtyJAAAbQQAK3KAAABtDwArcrYAAG0aACt3EwAAbSUAK3qeAABtMAArfioAAG07ACuDWQAAbUYAK4O1AABtUQAri+0AAG1cACuMhwAAbWcAK41aAABtcgArklsAAG19ACuVaQAAbYgAK5j/AABtkwArn/EAAG2eACugsAAAbakAK8TkAABttAArxVQAAG29ACvK+wAAbcYAK9GjAABt0QAr1OwAAG3cACvVCgAAbecAK9W1AABt7QAr1dMAAG34ACvWfgAAbf4AK9acAABuCQAr10cAAG4PACvXZQAAbhoAK9ijAABuIAAr2mEAAG40ACvaqwAAbj8AK9wyAABuSgAr3jcAAG5VACvgigAAbmAAK+CmAABuawAr4QQAAG52ACvhJAAAboEAK+FBAABujAAr4ZUAAG6XACvhsgAAbqIAK+qBAABurQAr6zAAAG62ACvztQAAbr8AK/RrAABuxgAr9MoAAG7NACwLEwAAbtgALBBfAABu7AAsFGIAAG8AACwVXgAAbxQALBXqAABvHQAsF1UAAG8mACwdmwAAby8ALB3TAABvQwAsHjEAAG9MACwekwAAb1UALB/vAABvXgAsICcAAG9yACwgRgAAb3sALCSXAABvhAAsJW4AAG+SACwluwAAb6YALCpvAABvugAsLGAAAG/DACwssQAAb8wALC0HAABv1QAsLZ0AAG/eACwtzgAAb+cALC3/AABv8AAsLjAAAG/5ACwumQAAcAIALC7GAABwCwAsM+8AAHAUACw0HQAAcB0ALDXzAABwJgAsNhUAAHAvACxMcAAAcDgALE7uAABwRgAsUdgAAHBPACxTMgAAcFgALFS1AABwYgAsVQ0AAHBrACxaDQAAcHQALFqvAABwfAAsW9oAAHCEACxd1AAAcI4ALG2SAABwlwAsgxYAAHCiACyDgAAAcLAALIQjAABwuwAshpAAAHDJACyK3QAAcNQALIs+AABw4QAsi5YAAHDuACyMZAAAcPYALI0gAABxAwAsjsUAAHEQACyRDQAAcR0ALJESAABxJgAskbkAAHE6ACyUuwAAcUcALJUvAABxWgAsl8IAAHFtACyYBAAAcXgALJhKAABxgAAsmUsAAHGIACyZkQAAcZAALJr+AABxmAAsm88AAHGgACyc7wAAca4ALJz0AABxtwAsnZMAAHHJACyojwAAcdcALLYgAABx4gAsto0AAHHrACy2+gAAcfQALLdrAABx/QAsudEAAHIIACy6kwAAchEALLsMAAByGgAsu00AAHIgACy7dQAAcikALLwfAAByMgAsveQAAHI4ACy/uQAAcj4ALL/hAAByRAAswEUAAHJNACzAkgAAclYALMDTAAByYgAswTcAAHJrACzC4QAAcnQALMODAAByegAsw8cAAHKAACzECgAAcpEALMREAABylwAsxHEAAHKlACzFfwAAcrMALMbYAAByuQAsxy0AAHK/ACzHowAAcsoALMncAABy1QAsymcAAHLlACzKfAAAcu4ALMrcAABy/gAsy60AAHMOACzM1wAAcxcALM1JAABzJwAszY4AAHM3ACzOxAAAc0cALM8XAABzTQAsz38AAHNTACzP2gAAc1kALNEtAABzaQAs0d0AAHNyACzS/AAAc3gALNMkAABzfgAs03IAAHOHACzTlQAAc5AALNSxAABzlgAs1TcAAHOfACzVPAAAc6gALNa0AABzugAs11MAAHPFACzXWAAAc84ALNpWAABz4gAs2oEAAHPrACzarAAAc/QALN4zAABz/QAs340AAHQGACzhEAAAdBAA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AIpVADMrYQAAimEAMywBAACKagAzNf8AAIpzADM4jwAAinsAMzlmAACKgwAzPPIAAIqLADNWDwAAio4AM1agAACKmQAzZFIAAIqkADNkeAAAiq0AM3FJAACKtgAzcbIAAIrBADNzsQAAiswAM3b+AACK2gAzeicAAIroADN9MAAAivMAM4PQAACK/AAzhi8AAIr/ADOHlgAAiwcAM4gEAACLGgAziDIAAIsjADOIiAAAiywAM4keAACLNgAziVgAAIs8ADOJnwAAi0YAM4qoAACLTwAzi+wAAItaADOM1QAAi2UAM4z6AACLcAAzlJoAAIt5ADOVMQAAi4IAM5XIAACLiwAzll8AAIuUADOW9gAAi50AM5f9AACLpgAzmUgAAIuvADObSgAAi7gAM51HAACLwQAznckAAIvKADOenAAAi9MAM5+cAACL3AAzoToAAIvlADOiaAAAi+4AM6SOAACL9wAzpWwAAIwAADOltQAAjAkAM6a1AACMEgAzqIYAAIwbADOptAAAjCQAM60IAACMLQAzskAAAIw2ADOyqAAAjD8AM7bhAACMSAAzuRcAAIxRADO5hAAAjFoAM7upAACMYwAzwGcAAIxsADPE/wAAjHUAM8ZTAACMfgAzx9UAAIyKADPJVAAAjJMAM8nKAACMoQAzy+4AAIyqADPM3gAAjLgAM86zAACMwQAz0rwAAIzMADPTjQAAjNUAM9UwAACM4wAz1WsAAIzsADPW7wAAjPUAM9tmAACM/gAz3S0AAI0HADPiqQAAjRAAM+LbAACNFwAz43IAAI0eADPlpgAAjSYAM+lQAACNLgAz6kMAAI03ADPupQAAjUAAM+83AACNSwAz8sUAAI1UADP5JQAAjV0AM/ovAACNawAz/HoAAI15ADP9UgAAjYIAM/3KAACNkAAz/1oAAI2ZADQEIwAAjaIANARYAACNuAA0BPkAAI3OADQFjgAAjdUANAZfAACN6wA0BwAAAI3yADQH0QAAjggANAiXAACODwA0C88AAI4WADQOwwAAjh8ANA9fAACOKQA0EBUAAI4zADQQyQAAjjwANBKhAACORQA0E84AAI5OADQU8gAAjlcANBWrAACOYAA0FlkAAI5pADQY2wAAjnIANBq1AACOewA0G2QAAI6EADQdPAAAjo0ANB6FAACOlgA0HzwAAI6fADQhJAAAjqgANCGpAACOsQA0IlcAAI66ADQjiQAAjsMANCQeAACOzAA0JZUAAI7VADQmdgAAjt4ANCrGAACO5wA0MQQAAI7wADQzYQAAjv0ANDUsAACPCgA0NVIAAI8TADQ4UwAAjxwANDraAACPJQA0OzgAAI8uADQ81AAAjz4AND7FAACPRQA0P/MAAI9OADRAmwAAj1UANEEwAACPXAA0RLIAAI9jADRHfAAAj2wANElfAACPdQA0SoEAAI9+ADRNWAAAj4cANFIIAACPkAA0Va8AAI+ZADRV8AAAj6IANFYRAACPqwA0WcQAAI+0ADRieAAAj70ANGSLAACPxgA0ZRIAAI/PADRoqQAAj9gANGlqAACP4QA0efoAAI/qADR6fwAAj/MANHxrAACP/AA0hyMAAJAFADSIbQAAkAwANIi3AACQEwA0kEsAAJAaADSQYgAAkCEANJB7AACQKAA0lGMAAJArADSWKwAAkDQANJdaAACQPQA0mF4AAJBGADSZjQAAkE8ANJsyAACQWAA0nEkAAJBhADSfEAAAkGoANKvgAACQdQA0uP4AAJB+ADS5JwAAkIIANLlQAACQhgA0+PoAAJCKADUD3wAAkI0ANQTPAACQkwA1DegAAJCZADUOXgAAkKkANSkCAACQuQA1KZAAAJDLADUpqgAAkN0ANSsRAACQ5gA1LEkAAJD0ADUssAAAkQIANS0QAACREAA1LqYAAJEeADUvBgAAkSwANTBEAACROgA1MK0AAJFIADU0BAAAkVEANTaAAACRXwA1OJkAAJFoADV/7QAAkXEANYCeAACRgwA1v/sAAJGVADXBSwAAka4ANcKZAACRxwA10KQAAJHZADXQ2AAAke4ANdFhAACSAwA10tQAAJIRADXTCAAAkiYANdP+AACSOwA11LEAAJJJADXVqgAAkl4ANdZtAACSbgA12KsAAJJ8ADXa7QAAkowANdtFAACSmgA124UAAJKoADXccQAAkrYANd47AACSxgA15tAAAJLSADXoVAAAkuAANej4AACS7gA16hgAAJMDADXsDwAAkxEANexeAACTHwA17JUAAJMtADXtxwAAkzsANe7HAACTRwA1/e4AAJNdADX+sQAAk3IANf+2AACThwA2ALkAAJOXADYA9wAAk58ANgJ9AACTpwA2A4wAAJO8ADYEvQAAk9EANgUkAACT5gA2Bd8AAJPsADYHJgAAlAEANgerAACUFgA2CI0AAJQcADYJcQAAlDEANguyAACURgA2Eb4AAJRbADYSnQAAlHAANhKwAACUeQA2Ev8AAJSDADYUUQAAlI0ANhR7AACUlgA2FQ8AAJSgADYVIgAAlKkANhVeAACUswA2FfgAAJS8ADYW+wAAlMUANho+AACU1QA2HZ4AAJTqADYg3QAAlP8ANiPIAACVCgA2I9oAAJUVADYj/wAAlR8ANiQRAACVKgA2JR4AAJU0ADYlggAAlTkANiWuAACVRAA2JcAAAJVPADYmbQAAlVkANiewAACVZAA2KSwAAJVwADYsGAAAlXwANi0mAACVkQA2LgwAAJWmADYu+gAAlbsANi/PAACVywA2MJ4AAJXbADYxagAAlesANjIwAACV+wA2MvAAAJYLADY0DQAAliAANjT2AACWNQA2NbYAAJZKADY2gwAAll8ANjeWAACWdAA2OGsAAJaJADY40wAAlp4ANjmEAACWpAA2OewAAJa5ADY6KQAAlsIANjtzAACW1wA2PEsAAJbnADY+nwAAlvcANj+OAACXDAA2QI4AAJchADZBawAAlzYANkINAACXRgA2QsIAAJdbADZFRgAAl3AANkZ2AACXgAA2R6gAAJeQADZU3QAAl6AANlViAACXqgA2VawAAJexADZWBQAAl7sANlZNAACXxwA2VpUAAJfTADZW3QAAl98ANlclAACX6wA2V20AAJf3ADZXtQAAmAMANlf9AACYDwA2WEUAAJgbADZYjQAAmCcANljVAACYMwA2WR0AAJg/ADZZZQAAmEsANlmtAACYVwA2WfUAAJhjADZonAAAmG8ANnxjAACYegA2fPUAAJiKADaD4wAAmJoANoR+AACYowA2hYcAAJivADaIXAAAmLsANon+AACYywA2jAMAAJjgADaMzwAAmPAANo9oAACZBQA2k0YAAJkTADaXYwAAmSEANpsKAACZMQA2mw8AAJk8ADabyAAAmVIANp7iAACZXgA2pbQAAJluADam4QAAmXwANqcZAACZigA2p2sAAJmYADapEQAAmaYANqstAACZtAA2q2UAAJnCADasmgAAmdAANq1OAACZ2wA2rX4AAJnmADatwwAAmfEANq5DAACZ/AA2rpEAAJoHADau7gAAmhIANrDJAACaHQA2siQAAJotADay4QAAmjgANtHcAACaTgA21jEAAJpjADbeDgAAmnMANt7YAACagwA236YAAJqTADbgdAAAmqMANuFAAACaswA2/NsAAJrDADb+KgAAmtoANwHmAACa6AA3AgIAAJr0ADcCSgAAmwAANwRiAACbDAA3BkUAAJsVADcGYgAAmx4ANwerAACbJwA3CJUAAJswADcahwAAm0IANxqqAACbSwA3GxIAAJtUADccAwAAm10ANxy6AACbYgA3KVQAAJtrADcpgAAAm3QANyn4AACbggA3Ky4AAJuOADcrdQAAm5wANyv3AACbqAA3LKoAAJu0ADcwVwAAm8AANzE0AACbyQA3MlcAAJvSADcyzgAAm9sANzMOAACb5AA3MzkAAJvtADc5xQAAm/YANzy8AACcBAA3PNUAAJwLADc9FAAAnA8ANz0tAACcFgA3PzsAAJwaADc/UwAAnCgAN0EhAACcNAA3Rm8AAJxIADdGtAAAnFYAN0jkAACcZAA3ScYAAJxwADdLbQAAnHwAN0xRAACciAA3WhsAAJyUADdbNwAAnJ0AN16yAACcpgA3Z+UAAJyrADdn9wAAnLYAN2ksAACcuwA3agcAAJzOADdqZQAAnOEAN2saAACc5gA3bAMAAJz5ADdshwAAnQQAN209AACdFAA3bYgAAJ0ZADdxbwAAnR4AN3YhAACdIwA3dtMAAJ0oADd4YAAAnS0AN3ntAACdMgA3fKQAAJ03ADd91wAAnTwAN36/AACdSgA3fxEAAJ1PADeEEAAAnVQAN4ZEAACdXwA3hnIAAJ1nADeGywAAnW8AN4n/AACdewA3ix4AAJ2JADeLIQAAnZIAN4yzAACdpgA3jaIAAJ20ADeRQgAAncIAN5J5AACd0AA3lWMAAJ3eADeVZgAAnecAN54/AACd+wA3n8oAAJ4JADegSQAAnhkAN6ILAACeKQA3p2kAAJ43ADeo7wAAnkAAN6mkAACeTgA3svcAAJ5cADe/WwAAnmcAN8shAACeeQA3zA8AAJ6QADfNigAAnpsAN86hAACepgA30AsAAJ7HADfTOAAAnugAN9OeAACe9gA31AoAAJ7/ADfUmQAAnw0AN9TVAACfIQA31U0AAJ8sADfViQAAn0AAN9YBAACfSwA31j0AAJ9fADfXCwAAn2oAN9fuAACfeAA32GAAAJ+GADfYxAAAn5QAN9kQAACfnQA32UgAAJ+jADfllAAAn6kAODqEAACftAA4O18AAJ+/ADg8gAAAn8oAOD2DAACf1QA4PlQAAJ/eADg/WgAAn+cAOEByAACf8gA4QXgAAJ/9ADhCfgAAoAgAOEOEAACgEwA4RKMAAKAeADhF7AAAoCkAOEdBAACgNAA4SIAAAKA/ADhJugAAoEoAOEsWAACgVQA4TEkAAKBgADhODgAAoGsAOE9UAACgdgA4UEgAAKB/ADhQSwAAoIoAOFFkAACgngA4VZUAAKCpADhX2QAAoLIAOFk6AACgvQA4WiwAAKDIADhbHgAAoNMAOFwsAACg3gA4XUEAAKDpADheTwAAoPQAOF+NAACg/wA4YGQAAKEKADhhOwAAoRUAOGISAAChIAA4YukAAKErADhj4wAAoTYAOGTUAAChQQA4ZaUAAKFKADhmdgAAoVMAOGdHAAChXAA4aBgAAKFlADho6QAAoW4AOH8RAAChdwA4f78AAKGFADiDPwAAoY4AOIPdAAChmQA4hKAAAKGiADiFFAAAoasAOIbIAAChtAA4i1UAAKG3ADiRkQAAocAAOLEHAACh0gA4sagAAKHnADiyfwAAofwAOLOWAACiDAA4s8gAAKIUADi1BAAAohwAOLXnAACiMQA4tuIAAKJGADi3NwAAolsAOLfQAACiYQA4uNsAAKJ2ADi5SAAAoosAOLm7AACikQA4un4AAKKmADi7OAAAorsAOL0GAACi0AA4wgYAAKLlADjCvQAAovoAOMLMAACjAwA4ww0AAKMNADjEJQAAoxcAOMRHAACjIAA4xMEAAKMqADjE0AAAozMAOMUCAACjPQA4xYIAAKNGADjGWQAAo08AOMj2AACjXwA4y8EAAKN0ADjOjwAAo4kAONF6AACjlAA40YwAAKOfADjRsQAAo6kAONHDAACjtAA40tAAAKO+ADjTNAAAo8MAONNgAACjzgA403IAAKPZADjUHwAAo+MAONViAACj7gA41t4AAKP6ADjZ5QAApAYAONrzAACkGwA429kAAKQwADjcxwAApEUAON2WAACkVQA43msAAKRlADjfNwAApHUAON/3AACkhQA44RQAAKSaADjh/QAApK8AOOLKAACkxAA44/wAAKTZADjkdwAApO4AOOWVAACk9AA45moAAKUJADjm0gAApR4AOOgOAAClJAA46HYAAKU5ADjoswAApUIAOOn9AAClVwA46tUAAKVnADjtKQAApXcAOO4YAACljAA47xgAAKWhADjv+gAApbYAOPChAAClxgA48R4AAKXbADjx9gAApesAOQFAAACmAAA5AcUAAKYKADkCDwAAphEAOQJoAACmGwA5ArAAAKYnADkC+AAApjMAOQNAAACmPwA5A4gAAKZLADkD0AAAplcAOQQYAACmYwA5BGAAAKZvADkEqAAApnsAOQTwAACmhwA5BTgAAKaTADkFgAAApp8AOQXIAACmqwA5BhAAAKa3ADkGWAAApsMAORXHAACmzwA5GnIAAKbaADkeAwAApugAOR83AACm9gA5ISIAAKcLADkkMwAApxkAOSVFAACnJQA5JmcAAKcuADkqogAApzcAOTOwAACnRQA5NUIAAKdTADk6owAAp2EAOTudAACncQA5PYUAAKeKADk+owAAp6MAOT/pAACnswA5QGwAAKfDADlERAAAp9gAOUTZAACn5AA5RWoAAKfvADlHggAAp/sAOW8RAACoEAA5cAIAAKglADlw8wAAqDoAOXH2AACoTwA5cuEAAKhfADl3QgAAqHQAObbqAACohAA5w0wAAKiNADnD8wAAqJUAOgyKAAConQA6DLYAAKinADoNAQAAqLEAOg0tAACouwA6DiQAAKjFADpyggAAqM8AOnLDAACo2AA6dY4AAKjdADp1uwAAqOQAOnbfAACo6wA6d1QAAKjwADp36gAAqPcAOnirAACo/gA6ekMAAKkDADp6iAAAqQgAOnsPAACpDQA6fCYAAKkSADp80QAAqRcAOn0YAACpHAA6fWkAAKkhADqpywAAqSYAOrC1AACpMgA6s3AAAKk+ADq45AAAqUoAOrowAACpVwA6u8kAAKl6ADq8WwAAqYQAOr2sAACppwA6wCkAAKmxADrBlQAAqb8AOsJYAACpyAA6w6IAAKnWADrEUQAAqd8AOsY6AACp6wA6xmkAAKn0ADrIDgAAqgUAOtG0AACqFgA60tgAAKofADrYHwAAqigAOtlQAACqNAA62qcAAKpCADrcLgAAqk4AOuBHAACqVwA64kkAAKpjADrkoAAAqm8AOuhGAACqewA69RgAAKqHADsaRgAAqpMAOyD4AACqnAA7LA0AAKqlADssuwAAqrUAOzHgAACqxQA7MugAAKrOADszGwAAquUAOzNEAACq/AA7M+gAAKsHADs0SwAAqxMAOzUNAACrHwA7OBUAAKsoADs5JQAAqzEAOzmJAACrOgA7OnoAAKtFADs61wAAq04AOzu6AACrVwA7PBsAAKtgADs8TQAAq2kAOzyYAACrkgA7QJ4AAKu7ADtE7QAAq8sAO0VtAACr1AA7RjUAAKvdADtIRQAAq+sAO0moAACr+QA7SzMAAKwHADtMEQAArBUAO0zwAACsHgA7TScAAKwnADtfFQAArDUAO189AACsQAA7X2UAAKxLADtfjQAArFYAO1/eAACsYQA7YKcAAKxsADth9QAArHcAO2IaAACsggA7YpAAAKyNADti0wAArJgAO2SvAACsowA7ZNQAAKyuADtk+gAArLkAO2U9AACsxAA7aVkAAKzPADtsMwAArNoAO20mAACs5AA7bVQAAKzvADttvQAArQQAO3L4AACtDwA7hUMAAK0UADuJygAArR4AO4pQAACtKQA7ioQAAK00ADuK2wAArT8AO4sNAACtSgA7i9oAAK1VADuU3QAArWAAO5fPAACtawA7mOEAAK12ADujUQAArYEAO6NtAACtiAA7rswAAK2NADuvLwAArZsAO6/DAACtpgA7te4AAK2uADu2TgAArbwAO7l7AACtxwA7vr4AAK3PADvBeAAArdcAO8f5AACt3wA7yWUAAK3mADvJlwAAre8AO8nMAACt9gA7ytwAAK39ADvLQAAArgQAO8vaAACuCwA70EUAAK4SADvj3wAArh0AO+QZAACuJgA75D4AAK4vADvl/QAArjgAO+Y4AACuPQA75sUAAK5GADvnOwAArk8AO+g8AACuWAA76HkAAK5hADvqvAAArmoAO+xCAACucwA77NMAAK54ADvwLQAAroEAO/bnAACuigA7+PEAAK6YADv5aAAArqMAPAjTAACurgA8CRsAAK63ADwJXQAArsMAPBRjAACuzwA8FKgAAK7UADwVIAAArtkAPBVPAACu3gA8FZoAAK7jADwV/gAArugAPBYtAACu7QA8FngAAK7yADwW2gAArvcAPBcfAACu/AA8F5cAAK8BADwXxgAArwYAPBgRAACvCwA8GHUAAK8QADwYpAAArxUAPBjvAACvGgA8GWEAAK8fADwZpgAAryQAPBoeAACvKQA8Gk0AAK8uADwamAAArzMAPBr8AACvOAA8GysAAK89ADwbdgAAr0IAPBwLAACvRwA8HFAAAK9MADwcyAAAr1EAPBz3AACvVgA8HUIAAK9bADwdpgAAr2AAPB3VAACvZQA8HiAAAK9qADweggAAr28APB7HAACvdAA8Hz8AAK95ADwfbgAAr34APB+5AACvgwA8IB0AAK+IADwgTAAAr40APCCXAACvkgA8IQkAAK+XADwhTgAAr5wAPCHGAACvoQA8IfUAAK+mADwiQAAAr6sAPCKkAACvsAA8ItMAAK+1ADwjHgAAr7oAPDAiAACvvwA8SJYAAK/IADxKqAAAr80APEuDAACv0gA8mtYAAK/XADyhOQAAr+IAPKIMAACv6wA8opcAAK/0ADyi/wAAr/0APKNcAACwBgA8o3IAALAPADyljQAAsBgAPNwCAACwIQA/5YMAALAsAD/mxwAAsDcAP+jpAACwQgA/6VEAALBNAD/pwAAAsFgAP+qgAACwYwA/61cAALBuAD/xwAAAsHkAP/I9AACwhAA/9awAALCJAD/2rwAAsJQAQAp7AACwnwBACrYAALCkAEAK/gAAsKkAQAvcAACwrgBAC/oAALCzAEAMKQAAsLgAQAw/AACwvQBAD0YAALDCAEARnwAAsM0AQBMKAACw2ABAEyUAALDjAEAUWgAAsO4AQBTGAACw+QBAFNQAALEEAEAVEgAAsQsAQBWSAACxFgBAFe4AALEhAEAV/AAAsSwAQBdcAACxMwBAHaIAALE+AEAeKgAAsUkAQCJ/AACxVABAKCIAALFfAEAouAAAsWsAQDboAACxdwBAOIIAALGAAEA6dAAAsYoAQDuLAACxlABAPkUAALGeAEA+ogAAsakAQD9+AACxtABAQTgAALG/AEBBgAAAsdUAQEGcAACx6wBAQcYAALIBAEBB/gAAshcAQEJGAACyLQBAQnoAALJDAEBC2AAAslkAQENPAACybwBARmoAALKFAEBG+AAAspAAQEdHAACymwBAR3YAALKmAEBVWAAAsrEAQFq2AACyvABAW4EAALLHAEBccQAAstIAQGmBAACy3QBAasoAALLoAEBspgAAsvMAQHBaAACy/gBAcIgAALMEAEB4cwAAswoAQHjzAACzFQBAeSAAALMhAEB5WQAAsy0AQHo2AACzOQBAerIAALNEAEB+1wAAs08AQISyAACzWgBAhVgAALNlAECFmgAAs3AAQImVAACzewBAicQA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ANBdAEnWVgAA0GgASdZ7AADQcgBJ1q0AANB9AEnaFAAA0IIASdqPAADQhwBJ3REAANCMAEndYgAA0JEASd14AADQlgBJ3fcAANCbAEnegAAA0KAASd6XAADQqQBJ3scAANCuAEne3gAA0LcASd9ZAADQvgBJ33AAANDHAEnhgQAA0M4ASeGrAADQ2QBJ4hYAANDkAEniiwAA0O8ASeOSAADQ+gBJ5XEAAND/AEnlsgAA0QoASeZLAADRFQBJ5u0AANEgAEny0wAA0SsASfNVAADROQBJ9LIAANFHAEn3ugAA0VIASff3AADRawBJ+o0AANF7AEn6ygAA0ZQASf89AADRpABKADUAANG3AEoAdQAA0cUASgabAADR2ABKBrgAANHjAEoG2wAA0esASgeZAADR9gBKCVsAANIBAEoJqgAA0gwASgnJAADSFwBKCfEAANIiAEoLogAA0i0ASgulAADSOABKDJUAANJOAEoMmAAA0lkASg7UAADSbwBKD0IAANJ3AEoQpwAA0n8AShEFAADSiwBKEaQAANKXAEoR1gAA0qMAShHZAADSrgBKFVoAANLEAEoYaAAA0s8AShh/AADS1ABKG7oAANLfAEob4gAA0usAShwKAADS9wBKHl8AANMDAEoehwAA0xUASiAkAADTJwBKIFoAANMyAEohqgAA0z0ASiG4AADTSQBKKW0AANNOAEopmQAA01kASimrAADTZABKKv8AANNpAEorMwAA03QASitNAADTfwBKK4EAANOEAEor2gAA048ASiv0AADTmgBKLBkAANOfAEosfwAA06oASiz2AADTtQBKLhkAANPAAEovcQAA08sASi/iAADT1gBKMDkAANPhAEozHgAA0+YASjeHAADT6wBKN6QAANP0AEo4GAAA0/0ASjiOAADUCABKONMAANQRAEo5SAAA1BoASjn2AADUJQBKOhUAANQuAEo6qwAA1DcASjuWAADUQgBKPBkAANRLAEo/owAA1FYASkB0AADUZABKQUMAANRyAEpCTwAA1IAASkL1AADUjQBKQxgAANSVAEpDOQAA1J0ASkmmAADUpQBKTVkAANSqAEpNcQAA1LIASk24AADUuQBKTuwAANTMAEpP2gAA1NEASlCdAADU1gBKUVcAANTbAEpSjwAA1OAASlNfAADU5QBKV8MAANTqAEpYVwAA1PMASljOAADU/ABKWOYAANUCAEqzDQAA1Q4ASrNHAADVFwBKvn0AANUgAErEGgAA1TAASs5lAADVOwBKzpYAANVPAErXIwAA1WMAStdYAADVawBK18MAANVzAErYrgAA1XsASvvRAADVgwBK/X8AANWKAEr+kgAA1ZEASxr/AADVmABLG2kAANWjAEsb0wAA1a4ASx2lAADVuQBLHmoAANXJAEsevQAA1dkASx9eAADV6QBLI+sAANX5AEtM0wAA1f4AS04DAADWBwBLYJgAANYQAEtiJwAA1iAAS2OwAADWKwBLZFsAANY2AEtlAwAA1jsAS2cgAADWQABLaVEAANZLAEtsBgAA1lYAS3kvAADWYQBLe2wAANZtAEt/nAAA1nkAS3/NAADWhQBLgloAANaRAEuEqgAA1p0AS47lAADWqQBLkCwAANa1AEuRngAA1sUAS5Z8AADW0QBLlq4AANbdAEuatwAA1ukAS5tmAADW9QBLnBcAANcBAEueMgAA1w0AS5+xAADXGQBLoP0AANclAEujBAAA1zEAS6hvAADXPQBLqdMAANdAAEurIAAA10UAS6zvAADXSABLrS8AANdTAEuvFgAA114AS7kJAADXYQBLudkAANdsAEvBXAAA13cAS8XgAADXegBLyOEAANd9AEvJTQAA14AAS8oLAADXiQBLyj0AANeMAEvLEgAA15UAS8xWAADXmABLzyIAANehAEvnuAAA16oAS+gHAADXrwBL6BwAANe0AEvoPQAA17kAS+uGAADXvgBL7bYAANfHAEv7DgAA19AATAA0AADX4ABMAlcAANfwAEwE0QAA1/YATBLiAADYAgBMFE8AANgIAEwU9QAA2A4ATDUaAADYFwBMNcsAANgpAEw7ngAA2DsATDxPAADYTQBMbdsAANhfAExt6QAA2G4ATG4wAADYdwBMblEAANiAAExvGQAA2I8ATHDMAADYngBMcRgAANitAExyWwAA2LgATHPzAADYxwBMdDIAANjWAEx3NgAA2OUATHihAADY8ABMgqoAANj4AEyC0QAA2QEATIL5AADZFQBMhLkAANkeAEyE3gAA2S0ATIVdAADZPABMjrkAANlFAEyQuQAA2VAATJHOAADZVQBMk68AANleAEyUqgAA2WMATJidAADZaABMmXoAANltAEyaMAAA2XIATJqqAADZdwBMmyQAANl8AEybngAA2YEATJymAADZhgBMpX8AANmLAEy14AAA2aAATLbDAADZqwBMt0UAANm2AEy6FwAA2cEATMENAADZygBMwXAAANnVAEzC7AAA2eAATMRaAADZ6wBM2Q4AANn2AEzZ6QAA2gIATNr4AADaDgBM28YAANocAEzchgAA2icATN7BAADaMgBM4GMAANo9AEzoEQAA2ksATOh8AADaWQBM81EAANpkAEz1SQAA2m8ATPZOAADafQBM97UAANqIAEz5VgAA2pMATPmZAADangBNACAAANqpAE0A3QAA2rIATQT2AADawgBNBzIAANrSAE0HeAAA2uAATQfOAADa7gBNCCoAANr8AE0J8wAA2woATQtqAADbEABNDG8AANseAE0PYAAA2ywATRfqAADbOABNGEMAANtBAE0a3QAA20oATRscAADbWABNG0kAANtmAE0dEAAA228ATR1gAADbfQBNHYwAANuLAE0eEAAA25QATR48AADbogBNHucAANurAE0gKwAA27kATSEcAADbzQBNIZgAANvqAE0htQAA2/4ATSHzAADcBABNI5kAANwhAE0mQgAA3C8ATShTAADcNQBNKRcAANw7AE0rsgAA3EQATSzvAADcUgBNLiwAANxgAE0vSgAA3G4ATUXeAADcdwBNRoEAANyJAE1XjgAA3JsATVfRAADcoABNWnYAANylAE1lagAA3LUATWWxAADcvgBNZqEAANzHAE1nIgAA3NAATWovAADc2QBNaxEAANzgAE1rNgAA3OcATXKGAADc9wBNc2EAAN0CAE10ggAA3Q0ATXWFAADdGABNdlYAAN0hAE13XAAA3SoATXh0AADdNQBNeXoAAN1AAE16gAAA3UsATXuGAADdVgBNfKUAAN1hAE197gAA3WwATX9DAADddwBNgIIAAN2CAE2BvAAA3Y0ATYMYAADdmABNhEsAAN2jAE2GEAAA3a4ATYdWAADduQBNiEoAAN3CAE2ITQAA3c0ATYlmAADd4QBNjZcAAN3sAE2P2wAA3fUATZE8AADeAABNki4AAN4LAE2TIAAA3hYATZQuAADeIQBNlUMAAN4sAE2WUQAA3jcATZePAADeQgBNmGYAAN5NAE2ZPQAA3lgATZoUAADeYwBNmusAAN5uAE2b5QAA3nkATZzWAADehABNnacAAN6NAE2eeAAA3pYA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APzoAFa1mQAA/O0AVrohAAD88gBWuxcAAPz7AFa79AAA/QQAVrwmAAD9DQBWvN4AAP0WAFa9fQAA/R8AVr5VAAD9KABWv8YAAP0xAFbAUwAA/ToAVsFeAAD9QwBWw8YAAP1MAFbD6QAA/VMAVsT9AAD9WgBWxYAAAP1jAFbHhAAA/WwAVsfwAAD9dQBWySUAAP1+AFbJhQAA/YcAVsoIAAD9kABWyjMAAP2ZAFbKjAAA/aIAVsrZAAD9qwBWy4sAAP20AFbLvQAA/b0AVs0SAAD9xgBWzUoAAP3PAFbOJwAA/dgAVs7SAAD94QBWzyQAAP3qAAAXsAAAAAHAAI0pABQjKS05PUFJUVZcY2Vod4CLgJeAm4CjgKuAtoDFgNKA5YDzgQCBB4EOgR+BJYEtgTGBOYFAgUiBaYF0gYeBjIGRgZeBnYG3gb+B24HhgfuCA4IfgjeCWYJtgnGCeYKKgpKCnYKugrqCyoLcgt2C84L9gv+DD4MRgxODHoMpgy2DNYM2g0aDToNSg1qDYYNkg2aDaoNvg3GDeoOCg4qDkYOWg6CDpoOng6iDqYO6g8mD0IPug/eD/IQVhByELoQ9hECETIRXhGOEbYR6hIWEjISUhJ+Es4S+hMiEzYTUhOCE8YT9hQaFEoUjhTOFPoVRhVyFaIVzhY2Fm4WrhbSFtoXahe6F84X0hhuGHoZBhk6GYIZ4hrWG3obmhxOHPYdKh0+HVYdah1uHaIdzh3yHf4eCh4iHjIeNh6WHrYfAh8qHy4fUh+uH+YgJiBCIF4gYiByIJYgoiDWIP4hLiFGIV4iUiLCIvYjTiRKJJYkwiWCJc4l/iY6JmomhiauJrIm2icKJzYnSidmJ/oojijWKPopDilWKYYpsim2KbopvinCKeYqVitGK3YruiwGLBIsFixKLFosmi0uLWItli3uLioubi7GLzovWi+SMAYwOjBWMGIwojCqMLIw5jFaMcIx6jI2MpYypjK2MtIzLjNCM14zojOmM/o0LjUCNSo1QjViNXY1jjWeNdI2CjYiNkY2gjaaNr43CjceN1I3mjfmOGY4sjkmOUo5mjnKOgI6Hjo+OlI6ajqWOv47EjtKO2Y7ejt+O4o7vjwGPEY8hjzKPPI9Kj0uPVo9lj2+Pf4+Ej5aPpY+rj7qPxI/Ij92P5o/qj/KP85ALkBOQGJAfkC2QM5A1kESQRpBRkFeQW5BskHaQfpCCkJGQmpCekKSQqpCxkL2QzZDakOyQ+pEJkRiRJpE9kUaRTZFXkWORZpFnkXGRgpGKkZGRnpGrkbGRtZKlkrCsZKxorHOseqyJrLisw6zHrMus0qzerOWs7qzzrQmtEK1ErU6tV61lrW6tdK19rYStkK2WrZqtn62jraqttq3Brc+t3K3jrfGt964ArgauHq4urjiuSK5erm2uf66Hrp2up66yrreuz67lrvavCq8ery6vSq9Xr2+vf6+Sr6Kvtq/Vr+Ov+bALsBiwL7A+sECwQrBEsEawULBTsFewWrBfsGKwZbBosGywbrBwsHKwdLB2sHiwfLCHsJCwnbC6sL+w0bDZsN+w8bEAsRGxF7EksSyxLbExsTWxQLFJsVKxXLFpsW6xeLGEsYqxnrGlsbOxvLHGsdKx37HvsfWyDbIRsiGyLbIusjmyRbJPsliyXLJqsnCygLKFsoayj7KcsqeysbKzssCyxrLXsuCy9LL8sw+zGrMwszWzRbNPs1SzZLNps2+zcrOAs5CzmbOds62zwLPEs8mzzbPes+a0BrQktEi0Z7RqtHG0fbSVtKy0sbTFtN208rULtRq1LLU/tVa1bbWItaW1yLXltgi2HLY0tkq2ZLZvtoK2krajtri2yLbetvi3FLc0t0+3breCt5W3r7fCt9W36LgFuCa4P7hSuF24a7h4uIi4qbjRuN247bj/uRW5ILkvuUW5Ybl3uX25hbmhucK5yrnVueG58bn9ugy6H7o2ukO6U7pjuna6e7qCuoq6lbqkura6zrrruxu7M7s4u0q7Ybtxu4a7jrumu6+7v7vSu9q75bvuu/q8AbwLvB+8N7xBvE68XrxyvJS8s7zJvOK8970PvSK9Ob1RvW29eL2GvYy9j72evbO9w73TveK96r30vfW99r4FvhC+G74uvj++T75lvni+jr6hvqi+uL7Gvtq+8b8Dvxe/M79Hv1i/Yb9tv4K/lr+xv8W/1r/qv/nAAEADwABACMAAQBfAAEArwABAM8AAQFfAAECFwABAssAAQL/AAEDewABA78AAQPzAAEEEwABBEMAAQRXAAEEgwABBKcAAQTLAAEE5wABBQMAAQVbAAEFgwABBYcAAQXfAAEGbwABBr8AAQbXAAEHBwABBx8AAQdjAAEHiwABB+8AAQhDAAEIawABCLcAAQjjAAEI9wABCUcAAQlXAAEJbwABCasAAQnzAAEKFwABCiMAAQpfAAEKowABCuMAAQsPAAELNwABC18AAQuTAAELowABC7cAAQvrAAEMRwABDEsAAQyPAAEMpwABDN8AAQznAAENAwABDRsAAQ0jAAENXwABDWcAAQ2nAAENqwABDcMAAQ3bAAEN9wABDhcAAQ4/AAEOSwABDosAAQ6TAAEOwwABDvMAAQ8fAAEPLwABDzsAAQ9LAAEPYwABD48AAQ+vAAEP4wABECcAARA3AAEQnwABEQsAARErAAERUwABEXMAARGbAAERrwABEcsAARHbAAER7wABEgcAARI7AAESXwABEncAARK3AAETJwABEzsAARM/AAETVwABE2sAAROjAAETpwABE7sAARQDAAEUIwABFCcAARQvAAEUpwABFP8AARUjAAEVdwABFbMAARXDAAEWBwABFisAARYvAAEWRwABFncAARavAAEW4wABF1MAARebAAEXrwABF8sAARgrAAEYRwABGI8AARifAAEYywABGOsAARkXAAEZQwABGXMAARl/AAEZlwABGb8AARnbAAEaAwABGjMAARpjAAEaxwABGv8AARsDAAEbBwABGwsAARsPAAEbEwABGxcAARsbAAEbHwABG0MAARtjAAEbkwABG5cAARvjAAEb8wABHAsAARwzAAEcdwABHJ8AARzHAAEc1wABHPsAAR0nAAEdNwABHVsAAR17AAEdiwABHZsAAR2vAAEdzwABHfsAAR4bAAEePwABHlcAAR5fAAEeawABHpsAAR7bAAEe9wABHxcAAR9TAAEfcwABH3sAAR9/AAEfhwABH5cAAR+jAAEfywABH+MAASADAAEgLwABID8AASBPAAEgXwABIG8AASB/AAEgjwABIK8AASDLAAEgzwABIO8AASEvAAEhOwABIVcAASFnAAEhawABIW8AASGDAAEhhwABIbMAASHjAAEiDwABIk8AASJXAAEigwABIr8AASLnAAEjDwABIzsAASNXAAEjWwABI3sAASOXAAEjowABI78AASPXAAEj5wABI/cAASQPAAEkXwABJG8AASSHAAEkpwABJOcAASUrAAElMwABJXMAASV/AAElowABJasAASXHAAElywABJdcAASYLAAEmGwABJisAASZDAAEmSwABJn8AASajAAEmzwABJvMAASb3AAEm+wABJ1cAASefAAEnpwABJ6sAASffAAEoFwABKD8AAShHAAEoTwABKFcAAShfAAEoZwABKJsAASjXAAEo6wABKP8AASkTAAEpJwABKTsAASl/AAEpnwABKccAASnjAAEp9wABKhMAASo3AAEqXwABKosAASqnAAEqwwABKtsAASr7AAErDwABKxsAASsvAAErSwABK2sAASuPAAErpwABK8MAASvLAAEsLwABLFcAASyLAAEsrwABLMsAASzjAAEtPwABLVMAAS2PAAEt5wABLhsAAS6LAAEu1wABLy8AAS8/AAEvTwABL2cAAS+TAAEvtwABL/8AATATAAEwWwABMHcAATC3AAEw+wABMUsAATF7AAExpwABMdcAATIrAAEyYwABMncAATKjAAEy6wABMu8AATLzAAEzGwABMzcAATNzAAEzewABM8MAATQLAAE0SwABNI8AATSvAAE07wABNS8AATVrAAE1wwABNhsAATZjAAE20wABNxcAATeLAAE4KwABOE8AAThzAAE4lwABON8AATj3AAE5ewABOZ8AATn7AAE6CwABOo8AATqvAAE6zwABOwcAATs3AAE7pwABPBcAATxjAAE8twABPNcAATzzAAE9YwABPYMAAT2jAAE9wwABPd8AAT4bAAE+PwABPnMAAT6bAAE+4wABPv8AAT9fAAE/0wABQC8AAUCfAAFA+wABQWMAAUGjAAFBywABQdsAAUIHAAFCIwABQkcAAUKvAAFDAwABQ0sAAUNnAAFDnwABQ8cAAUQLAAFEMwABRHcAAUSrAAFE8wABRRcAAUVHAAFFlwABRdMAAUY3AAFGowABRsMAAUcbAAFHQwABR08AAUefAAFIVwABSKsAAUkbAAFJKwABSY8AAUnPAAFKAwABSksAAUprAAFKuwABSvMAAUs/AAFLhwABS88AAUxbAAFMswABTU8AAU17AAFN6wABTi8AAU63AAFPBwABT2cAAU+XAAFP3wABUDMAAVBjAAFQjwABUL8AAVEfAAFRRwABUWsAAVGfAAFR0wABUfMAAVITAAFSSwABUncAAVLPAAFTJwABU0MAAVPbAAFUcwABVVcAAVWjAAFVwwABVksAAVabAAFW/wABV4cAAVfvAAFYSwABWMsAAVkzAAFZXwABWYcAAVmfAAFZ0wABWk8AAVq/AAFazwABWvMAAVsjAAFbWwABW6sAAVwPAAFcWwABXHsAAVynAAFc5wABXU8AAV1nAAFdkwABXa8AAV3/AAFeIwABXk8AAV6XAAFe4wABXvcAAV8nAAFfXwABX3cAAV+XAAFfuwABX/sAAWAzAAFgSwABYGsAAWDHAAFhRwABYZsAAWHXAAFiEwABYl8AAWKnAAFi7wABYxsAAWNPAAFjawABY68AAWP7AAFkMwABZFMAAWSHAAFk0wABZPMAAWVbAAFlowABZcMAAWYjAAFmSwABZusAAWc7AAFngwABZ8MAAWfvAAFoAwABaHsAAWjrAAFpNwABaWcAAWmHAAFpzwABaisAAWpDAAFqUwABaqsAAWrfAAFq/wABayMAAWuvAAFr1wABa/sAAWwfAAFsQwABbEsAAWxbAAFsdwABbO8AAW1LAAFtbwABbY8AAW2zAAFttwABbccAAW3nAAFuBwABbqsAAW6zAAFuvwABbu8AAW8bAAFvRwABb4MAAW/PAAFwBwABcC8AAXBjAAFwiwABcLsAAXEHAAFxOwABcW8AAXGPAAFx+wABcm8AAXKzAAFy7wABcxsAAXM/AAFzXwABc6cAAXPbAAF0FwABdHMAAXS7AAF1gwABdjcAAXZfAAF2hwABdqcAAXbPAAF3YwABd38AAXefAAF4LwABeFcAAXh/AAF4nwABeQcAAXk/AAF5kwABeacAAXonAAF6WwABeq8AAXr3AAF7KwABe2cAAXuLAAF7twABe/sAAXw3AAF8PwABfHsAAXyXAAF84wABfU8AAX1zAAF+FwABfjMAAX5DAAF+cwABfqMAAX7HAAF+4wABfwsAAX8XAAF/TwABf3sAAX/TAAF/4wABgAMAAYAbAAGAZwABgPcAAYEjAAGBOwABgYMAAYG3AAGB6wABgj8AAYJ/AAGC+wABgwcAAYNPAAGDZwABg4cAAYO3AAGDzwABg/cAAYQvAAGEgwABhMsAAYT3AAGFIwABhUMAAYVjAAGF0wABheMAAYZLAAGGhwABhqcAAYbbAAGHBwABhycAAYdjAAGHjwABh8MAAYf7AAGIGwABiD8AAYhfAAGIdwABiJMAAYivAAGIzwABiPcAAYkTAAGJKwABibMAAYqTAAGLCwABi3MAAYvPAAGMKwABjJMAAYzfAAGNtwABj0sAAY+XAAGP7wABkCsAAZCLAAGRbwABkh8AAZNfAAGT/wABlI8AAZUbAAGVZwABlb8AAZX7AAGWJwABlpMAAZdXAAGXswABl/8AAZhPAAGY6wABmZMAAZofAAGabwABmy8AAZvXAAGciwABnSMAAZ3vAAGecwABn58AAaDPAAGhQwABoacAAaIXAAGiiwABo6sAAaQPAAGkYwABpKcAAaT/AAGlYwABpasAAaZLAAGmuwABpzcAAaeXAAGoRwABqJsAAaj7AAGpPwABqb8AAar/AAGrUwABq7MAAav3AAGtNwABrYcAAa3jAAGuIwABrosAAa/jAAGxjwABsdMAAbIjAAGyVwABsq8AAbOPAAG0KwABtmsAAbgvAAG4uwABuTcAAbmPAAG6JwABu68AAbxjAAG86wABvWMAAb4fAAG/awABwBcAAcCzAAHBCwABwW8AAcG3AAHCzwABw1MAAcPbAAHElwABxQ8AAcV3AAHF8wABxtsAAcejAAHIDwAByGsAAcjXAAHJbwAByfsAAcqDAAHK+wABy4MAAcvLAAHMHwABzFcAAc0nAAHNzwABzr8AAc9XAAHP3wAB0IMAAdEzAAHRxwAB0l8AAdMLAAHTZwAB088AAdQbAAHUTwAB1KcAAdWvAAHWJwAB1o8AAdcvAAHX2wAB2GsAAdmHAAHaJwAB2tMAAdtjAAHcowAB3c8AAd5bAAHe1wAB38cAAeC/AAHhSwAB4ccAAeKzAAHjRwAB5HMAAeTjAAHlZwAB5dsAAeZXAAHnEwAB6GcAAejXAAHpgwAB6h8AAep7AAHrAwAB60MAAetzAAHruwAB7FcAAe5TAAHvvwAB8EsAAfDHAAHxFwAB8YsAAfILAAHybwAB8wMAAfOjAAH0GwAB9J8AAfUHAAH1ywAB9sMAAfb/AAH3RwAB93MAAfiXAAH54wAB+lsAAfrfAAH7RwAB+4cAAfvTAAH8AwAB/L8AAf1XAAH9pwAB/gMAAf5DAAH+6wAB/6MAAgAjAAIArwACAR8AAgF/AAIB5wACAlcAAgLTAAIDMwACA4MAAgPvAAIEZwACBMMAAgUPAAIFYwACBesAAgZjAAIGywACBzcAAgevAAIICwACCFcAAgjfAAIJVwACCb8AAgpDAAIK1wACC0sAAguvAAIMPwACDMcAAg1bAAIN0wACDjsAAg6PAAIO7wACDzMAAhAnAAIQnwACEPMAAhFTAAIRlwACEosAAhNnAAITqwACE/sAAhQvAAIVEwACFd8AAhYbAAIWYwACFo8AAhdrAAIYLwACGGcAAhirAAIY0wACGXMAAhwHAAIciwACHRsAAh2PAAIeJwACHw8AAh+nAAIgSwACINMAAiGLAAIiLwACIt8AAiNzAAIkZwACJNcAAiVTAAIlswACJh8AAia3AAInhwACKBsAAii7AAIpPwACKdcAAirXAAIrNwACK6MAAivzAAIsiwACLNsAAi03AAItdwACLbcAAi43AAIwKwACMJsAAjD7AAIxuwACMj8AAjNrAAIz3wACNEMAAjSvAAI1IwACNi8AAjaTAAI25wACN0MAAjffAAI43wACOWsAAjnnAAI6hwACOvcAAjtzAAI70wACPD8AAjyXAAI9QwACPe8AAj6LAAI/FwACP58AAkFbAAJB0wACQjsAAkLfAAJEbwACRQMAAkWHAAJGKwACSFMAAkjnAAJJawACSgsAAks7AAJLywACTEsAAkyTAAJNHwACTlsAAk7XAAJPQwACT+MAAlDjAAJRcwACUfMAAlKXAAJTXwACVfMAAlarAAJXUwACV88AAlhXAAJaiwACWwMAAltrAAJb2wACXRMAAl1zAAJdwwACXkcAAl7XAAJfSwACX68AAmBbAAJg2wACYWcAAmHXAAJiNwACYt8AAmNfAAJj6wACZFsAAmS7AAJlYwACZe8AAmbfAAJnWwACZ8cAAmiDAAJo+wACamMAAmrLAAJrIwACa68AAmyzAAJtLwACbZsAAm4DAAJunwACb98AAnBrAAJw5wACcWsAAnHvAAJyfwACcvMAAnN3AAJ0jwACdPsAAnVzAAJ1zwACdjMAAnb7AAJ3UwACd7cAAnf/AAJ4lwACeQcAAnpjAAJ6wwACexMAAntvAAJ7rwACe/sAAnwrAAJ9OwACfqsAAn8/AAJ/3wACgGMAAoDnAAKCDwACg2MAAoPzAAKErwACha8AAoYvAAKGnwAChvMAAodLAAKHrwACh/cAAohHAAKI9wACigsAAopHAAKKjwACirsAAouvAAKMMwACjIcAAoznAAKNKwACjaMAAo5HAAKPjwACj/sAApCDAAKQ3wACkSsAApF/AAKR1wACkjsAApKDAAKS0wACk78AApQzAAKUswAClRcAApWvAAKWIwAClqMAApcvAAKXnwACmEcAAplzAAKaOwACmr8AAptPAAKbwwACnDcAApzXAAKdRwACncMAAp4jAAKegwACn5cAAqAzAAKg3wACoWsAAqHnAAKiTwACosMAAqMbAAKjVwACo+MAAqRHAAKktwACpQsAAqYvAAKmvwACp1MAAqgbAAKonwACqRMAAqmLAAKqDwACqncAAqubAAKs7wACrU8AAq3zAAKuQwACroMAAq7fAAKvRwACr5MAArCPAAKw4wACsUMAArGHAAKyewACstMAArM3AAKzfwACtHcAArVXAAK1owACtfsAArY3AAK3OwACt88AArg/AAK4/wACulMAArqzAAK7AwACu5cAArwHAAK8iwACvOsAAr07AAK9twACvmcAAr77AAK/mwACwCsAAsCTAALA5wACwZ8AAsHjAALCFwACwp8AAsNXAALEGwACxMMAAsVjAALGUwACxx8AAsf3AALIswACyScAAsnzAALLYwACy98AAsybAALNRwACzgcAAs5jAALOywACzxcAAtBLAALREwAC0ZMAAtLXAALTRwAC06cAAtP/AALUkwAC1OcAAtVrAALV3wAC1lcAAtfPAALZYwAC2csAAtojAALamwAC2wMAAtzLAALdIwAC3WsAAt3zAALelwAC3w8AAt93AALf6wAC4GsAAuDPAALhiwAC4k8AAuKjAALjAwAC40cAAuQrAALk2wAC5XcAAuZnAALnGwAC56cAAugjAALobwAC6McAAukDAALp7wAC6m8AAurjAALriwAC6+8AAuxDAALskwAC7RsAAu2bAALuEwAC7nsAAu8nAALwHwAC8LsAAvFHAALxxwAC8qcAAvMXAALzdwAC89cAAvSbAAL06wAC9SsAAvVrAAL14wAC9ksAAvajAAL3AwAC98cAAvgXAAL4VwAC+M8AAvk3AAL5jwAC+c8AAvpLAAL7JwAC+5MAAvvvAAL8awAC/QMAAv17AAL+AwAC/nsAAv73AAL/0wADAD8AAwCbAAMBFwADAa8AAwInAAMCrwADAycAAwOPAAMEQwADBQ8AAwVnAAMFrwADBj8AAwc/AAMHvwADCC8AAwijAAMJRwADCacAAwo7AAMKvwADCzsAAwvDAAMMLwADDIsAAwzrAAMNZwADDe8AAw5bAAMOtwADD0cAAw+/AAMQPwADEK8AAxEbAAMRkwADEe8AAxI3AAMSzwADE3MAAxPrAAMUbwADFNcAAxV7AAMWLwADFl8AAxabAAMWuwADFzsAAxfXAAMY8wADGX8AAxn7AAMaawADGssAAxs3AAMbhwADG8MAAxxPAAMciwADHNMAAxz/AAMdmwADHi8AAx6DAAMe4wADHycAAx9nAAMf1wADIGMAAyD7AAMhdwADIp8AAyMXAAMjgwADI/sAAyRXAAMkowADJNsAAyU/AAMlrwADJgMAAyZjAAMmpwADJvcAAycrAAMnbwADJ6cAAygDAAMoawADKLcAAykLAAMpjwADKc8AAyobAAMqSwADKqMAAysfAAMrZwADK58AAywbAAMs4wADLU8AAy2rAAMt8wADLl8AAy8LAAMvZwADL7MAAzAHAAMwhwADMPcAAzFXAAMxwwADMmsAAzLHAAMzEwADM18AAzO7AAM0IwADNG8AAzTTAAM1MwADNdMAAzbjAAM3MwADN3MAAze3AAM4JwADONcAAzk3AAM5hwADOdcAAzozAAM6cwADOrcAAztfAAM7xwADPG8AAzzHAAM9DwADPWsAAz33AAM+QwADPn8AAz7jAAM/UwADP6cAA0APAANAbwADQNMAA0FDAANBlwADQmcAA0K/AANDIwADQ2sAA0OfAAND8wADRFMAA0SXAANE6wADRUMAA0XXAANGHwADRlcAA0azAANHBwADR3MAA0e3AANH6wADSDsAA0jHAANJBwADSTcAA0l/AANJuwADSgMAA0ovAANKawADStsAA0uvAANNEwADTXMAA03DAANODwADTmcAA06jAANPXwADUE8AA1CzAANRmwADUe8AA1IzAANSlwADUwcAA1NbAANVewADVc8AA1avAANW8wADVycAA1dXAANXwwADWK8AA1kLAANZVwADWbcAA1oPAANacwADWrsAA1uzAANcEwADXH8AA1zPAANdzwADXisAA16TAANe3wADX9sAA2AfAANgbwADYKMAA2FPAANh3wADYlsAA2LjAANjTwADY+8AA2UjAANl0wADZo8AA2cvAANn3wADaJ8AA2m/AANp/wADaksAA2p7AANrHwADa5cAA2wbAANsgwADbSMAA223AANuIwADbpsAA273AANviwADcK8AA3DzAANxQwADcXcAA3IfAANyhwADcvsAA3NTAAN0DwADdFsAA3SzAAN07wADdZ8AA3YHAAN2kwADdu8AA3dHAAN3jwADd9cAA3grAAN4YwADeKMAA3l/AAN59wADensAA3rjAAN7xwADfFMAA3zTAAN9RwADfbcAA34XAAN+XwADfrMAA37rAAOpkwADqd8AA6o3AAOqcwADrL8AA60nAAOvnwADr/cAA7A/AAOwqwADsocAA7LjAAOzLwADs38AA7UnAAO1ZwADtZcAA7YDAAO3nwADt/sAA7hHAAO4nwADudMAA7obAAO6UwADuq8AA7wLAAO8VwADvJMAA7zrAAO+PwADvocAA76/AAO/YwADwBMAA8CnAAPBgwADwzMAA8PLAAPEbwADxPcAA8XfAAPGMwADxocAA8bnAAPHKwADyB8AA8j7AAPJNwADyX8AA8mrAAPKhwADywMAA8uDAAPMHwADzTsAA82rAAPOCwADzl8AA88TAAPP/wAD0T8AA9HjAAPSdwAD0wMAA9OTAAPUTwAD1M8AA9U/AAPV+wAD1xcAA9fDAAPYXwAD2N8AA9mvAAPaIwAD2uMAA9uTAAPcNwAD3VsAA93zAAPehwAD3wsAA9+DAAPf/wAD4IcAA+DzAAPhxwAD4i8AA+KjAAPi+wAD4+cAA+RnAAPlZwAD5dcAA+Y3AAPmjwAD5wcAA+eLAAPn8wAD6FsAA+j7AAPpgwAD6fMAA+pvAAPqzwAD60cAA+v/AAPscwAD7PMAA+1XAAPtxwAD7zcAA+/rAAPwTwAD8L8AA/ETAAPxXwAD8gcAA/J/AAPzAwAD82sAA/P/AAP1AwAD9d8AA/bzAAP3xwAD+JMAA/lPAAP57wAD+qsAA/tzAAP8HwAD/QcAA/2fAAP99wAD/l8AA/6nAAP+3wAD/x8AA/9zAAP/0wAEABcABABvAAQBBwAEAVsABAHrAAQChwAEAwcABAPHAAQEUwAEBOsABAVnAAQF8wAEBxcABAezAAQIWwAECOcABAnHAAQKLwAECqMABAr7AAQLXwAEDH8ABAzPAAQNWwAEDZsABA3LAAQN/wAEDpMABA93AAQP+wAEEG8ABBDXAAQRfwAEEksABBLjAAQTawAEE/MABBSHAAQU/wAEFYcABBavAAQXRwAEF+sABBhzAAQZTwAEGbsABBozAAQajwAEG28ABBxbAAQcswAEHRcABB1fAAQeKwAEHwMABB9jAAQfzwAEIB8ABCDzAAQh0wAEIisABCKPAAQi1wAEI6MABCQLAAQknwAEJTsABCWTAAQl2wAEJicABCaXAAQnmwAEKCsABCiLAAQo2wAEKTMABCmvAAQrPwAELC8ABCybAAQs9wAELWMABC3zAAQvDwAEL48ABC//AAQwSwAEMKMABDDfAAQxmwAEMosABDLvAAQz1wAENCsABDRvAAQ1FwAENh8ABDa3AAQ3PwAEN58ABDgTAAQ5pwAEOqMABDsHAAQ7WwAEO98ABDyDAAQ+YwAEPvcABD97AARAGwAEQl8ABELvAARDbwAERC8ABEaXAARHxwAESHcABEkXAARJqwAES2MABEvnAARMWwAETPMABE6jAARPKwAET6MABFBbAARSLwAEUtcABFNvAART8wAEVIMABFT3AARV2wAEVkMABFbnAARXPwAEV4cABFf3AARYcwAEWNMABFlPAARaHwAEWqcABFs7AARbswAEXCcABFyvAARdQwAEXbsABF5HAARe7wAEZu8ABGeHAARoDwAEaM8ABGx/AARtLwAEbc8ABG5vAAR3CwAEd5sABHgbAAR40wAEfR8ABH3HAAR+XwAEft8ABH9rAAR/2wAEgMMABIHDAASCRwAEgv8ABINzAASD1wAEhEcABITbAASGAwAEhocABIb7AASHdwAEiA8ABImfAASKrwAEizcABIuvAASMIwAEjL8ABI1nAASN8wAEjqMABI8PAASPYwAEj6cABJAvAASRHwAEkx8ABJOXAAST/wAElG8ABJTjAASV1wAEljsABJaPAASXIwAEl8MABJhHAASZJwAEmcMABJprAASa9wAEm58ABJxHAASc4wAEnXsABJ4DAASemwAEn18ABJ/nAASgXwAEoOMABKGzAASiJwAEoosABKM/AASj/wAEpKMABKUvAASl+wAEptMABKePAASodwAEqPsABKlvAASqKwAEqzMABKvfAASscwAErQ8ABK2bAASuFwAErm8ABK7bAASvNwAEr7sABLBDAASwtwAEsRsABLG7AASyZwAEsvcABLNrAAS0JwAEtMsABLV3AAS2EwAEtusABLezAAS4owAEuTMABLm7AAS6OwAEuqsABLt3AAS8UwAEvQ8ABL27AAS+PwAEvtsABL9PAAS/swAEwDMABMCrAATBGwAEwXsABMILAATCYwAEwuMABMNTAATDzwAExEcABMSvAATFSwAExb8ABMZLAATGxwAEx2cABMg7AATIywAEyUsABMmjAATKBwAEyk8ABMrPAATLbwAEzAcABM0bAATN+wAEzoMABM77AATPXwAE0L8ABNETAATRVwAE0Z8ABNHrAATSQwAE0n8ABNN7AATUUwAE1LsABNUXAATVbwAE1bcABNYzAATXRwAE2H8ABNjrAATZRwAE2a8ABNonAATbHwAE3DsABNyjAATc+wAE3V8ABN3TAATexwAE398ABOBDAATglwAE4PcABOFrAATiXwAE43cABOPbAATkLwAE5I8ABOUPAATmMwAE5z8ABOevAAToDwAE6GMABOjLAATp8wAE6z8ABOuXAATr3wAE7DMABOyvAATtzwAE7tMABO8/AATvmwAE7+cABPBzAATxpwAE8iMABPKPAATy8wAE82MABPO3AAT0EwAE9HMABPTDAAT1HwAE9V8ABPWnAAT2pwAE9xsABPeDAAT35wAE+DsABPiLAAT45wAE+ScABPpjAAT6uwAE+x8ABPtnAAT7xwAE/JsABP0PAAT9jwAE/fMABP5jAAT/nwAFAc8ABQIrAAUC/wAFA0sABQOHAAUD6wAFBIMABQTXAAUFGwAFBY8ABQYPAAUGcwAFCGMABQi/AAUJJwAFCXMABQnPAAUKLwAFCrcABQsnAAULowAFDAMABQ6LAAUO6wAFD1cABQ+nAAURiwAFEgcABRKPAAUS+wAFE3sABRPPAAUUBwAFFEMABRSLAAUUtwAFFa8ABRbTAAUXNwAFGBcABRhrAAUYrwAFGRcABRlrAAUZzwAFGvcABRs7AAUbbwAFG98ABRxbAAUcuwAFHbMABR6nAAUfMwAFH8sABSBHAAUgxwAFIYcABSH/AAUkvwAFJUMABSWrAAUmAwAFJn8ABScHAAUncwAFJ+8ABShzAAUo+wAFKc8ABSpHAAUqrwAFKzcABSwLAAUsgwAFLOsABS1zAAUuBwAFLn8ABS77AAUvwwAFMDcABTC3AAUxGwAFMhcABTJ7AAUy6wAFMz8ABTO3AAU0fwAFNNcABTU/AAU1hwAFNb8ABTX/AAU2WwAFNsMABTcPAAU32wAFOE8ABTjPAAU5MwAFOfsABTpTAAU62wAFO28ABTvnAAU8lwAFPQ8ABT2TAAU9+wAFP08ABUBjAAVA8wAFQaMABUIjAAVCkwAFQt8ABUM3AAVDcwAFQ6cABUVXAAVGZwAFRtcABUdTAAVHswAFSDcABUlnAAVJ2wAFSlsABUq/AAVLKwAFTBsABUz7AAVNgwAFTeMABU5bAAVOwwAFT2MABVCvAAVTewAFVAsABVSLAAVVFwAFVVcABVWHAAVWIwAFVl8ABVaLAAVW5wAFV6sABVgXAAVYjwAFWOsABVlPAAVaNwAFWw8ABVt3AAVb6wAFXEMABV1HAAVdzwAFXiMABV8zAAVfdwAFX6sABV/rAAVgbwAFYP8ABWFzAAViCwAFYpMABWMDAAVjfwAFY98ABWRHAAVlAwAFZa8ABWZjAAVndwAFaBsABWivAAVpWwAFae8ABWwTAAVslwAFbQsABW2rAAVuPwAFbt8ABW9jAAVv4wAFcL8ABXELAAVxYwAFcZ8ABXKHAAVz3wAFdDcABXSbAAV04wAFdU8ABXZDAAV3RwAFd7sABXg7AAV4nwAFeXMABXo/AAV6kwAFevMABXs3AAV8CwAFfO8ABX0vAAV9ewAFfasABX6HAAV/cwAFf98ABYBXAAWAswAFgRcABYG3AAWCOwAFgzcABYOrAAWEDwAFhJcABYUrAAWFowAFhkcABYffAAWIIwAFiMcABYoTAAWKRwAFimsABYrbAAWLfwAFi98ABYwvAAWMkwAFjRMABY2fAAWODwAFjp8ABY8HAAWQswAFkf8ABZJXAAWSnwAFkwcABZRHAAWUnwAFlOcABZVDAAWVqwAFlfcABZZTAAWXhwAFmFMABZifAAWY9wAFmTMABZpXAAWazwAFm1MABZu7AAWcRwAFnQcABZ13AAWd8wAFnlMABZ7/AAWfbwAFn+sABaBLAAWgvwAFoasABaMTAAWjmwAFpGcABaTfAAWlRwAFpcsABab/AAWncwAFp9cABag/AAWoswAFqQsABalzAAWp+wAFq18ABavXAAWsPwAFrGcABaynAAWs+wAFrSsABa1LAAWtlwAFre8ABa4rAAWucwAFrq8ABa73AAWvIwAFr3cABa/bAAWwYwAFsLcABbD7AAWxbwAFsgMABbJnAAWyuwAFsv8ABbNPAAWzgwAFtC8ABbR/AAW02wAFtRsABbXLAAW2DwAFtl8ABbaTAAW3IwAFt08ABbeHAAW3owAFuLsABbnfAAW6dwAFu0MABb2/AAW+RwAFvr8ABb9zAAW/+wAFwLcABcEvAAXBlwAFwh8ABcLrAAXDYwAFw8sABcRnAAXE7wAFxb8ABcY3AAXGnwAFxxsABcejAAXIDwAFyLsABckvAAXJzwAFyjMABcqHAAXLEwAFzGsABcznAAXNUwAFzasABc5LAAXPtwAF0EcABdDHAAXRMwAF0csABdM3AAXTvwAF1DcABdTLAAXWKwAF1q8ABdcjAAXXhwAF2BsABdp/AAXbrwAF3DMABdynAAXdPwAF31MABd/TAAXgWwAF4NMABeFnAAXiuwAF4z8ABeOzAAXkTwAF5KsABeVrAAXltwAF5fMABeavAAXnBwAF508ABeeHAAXnywAF5/MABehHAAXpUwAF6acABeoHAAXqSwAF6usABesjAAXrZwAF648ABex3AAXtZwAF7dcABe5TAAXuswAF7y8ABe+LAAXwewAF8YMABfHPAAXyCwAF8l8ABfLjAAX0EwAF9IcABfTrAAX1TwAF9YcABfXLAAX18wAF9ncABfazAAX2+wAF9ycABff7AAX4xwAF+R8ABfmDAAX5ywAF+oMABfu3AAX8KwAF/KsABf0PAAX9iwAF/e8ABf8bAAX/bwAF/7MABgADAAYBLwAGAjsABgJ7AAYCqwAGAwcABgM/AAYDgwAGA6sABgRbAAYE9wAGBTsABgXjAAYGFwAGBjsABgZzAAYGwwAGBx8ABgdfAAYHwwAGCE8ABgjnAAYJYwAGCpsABgsLAAYLhwAGC+cABgyXAAYM/wAGDXMABg3LAAYORwAGDrcABg87AAYPiwAGD+sABhA7AAYQiwAGEOcABhEnAAYSJwAGEucABhNnAAYT8wAGFGMABhS/AAYVVwAGFdcABhZjAAYW0wAGF08ABhgXAAYZiwAGGg8ABhqfAAYbEwAGG7MABhzTAAYdPwAGHaMABh4TAAYeZwAGH38ABiAzAAYglwAGIQcABiFbAAYhwwAGIocABiMPAAYjowAGJBsABiTHAAYl1wAGJp8ABidDAAYn3wAGKJcABik/AAYpqwAGKiMABip/AAYrUwAGLFcABizbAAYtnwAGLhMABi53AAYu8wAGL3MABi//AAYwbwAGMOMABjGvAAYyrwAGMvsABjNTAAYzjwAGM+MABjSTAAY0+wAGNW8ABjXHAAY2HwAGNscABjdHAAY30wAGOEMABjj/AAY5awAGOeMABjo/AAY6jwAGO28ABjv7AAY8RwAGPIMABj0zAAY+qwAGPxsABj97AAY/6wAGQEMABkCLAAZBEwAGQacABkIfAAZC4wAGQ08ABkPHAAZEIwAGRK8ABkVLAAZF8wAGRn8ABke3AAZIDwAGSHcABki/AAZI9wAGSTcABkl7AAZJywAGSf8ABkpnAAZLJwAGS68ABkxDAAZMuwAGTU8ABk4XAAZOewAGUKMABlD3AAZROwAGUasABlPbAAZUOwAGVIsABlTPAAZVHwAGVVMABlWTAAZWFwAGV2sABlffAAZYQwAGWMMABlkTAAZZbwAGWa8ABlnbAAZaiwAGW9MABlxzAAZdAwAGXW8ABl4nAAZffwAGYCcABmC/AAZhMwAGYbsABmLrAAZjYwAGY8sABmQzAAZlUwAGZasABmXzAAZmNwAGZocABma7AAZnlwAGZ/sABmhLAAZopwAGaOcABmnXAAZqJwAGaoMABmrDAAZrswAGa/sABmxPAAZshwAGbW8ABm3jAAZuYwAGbscABm9DAAZwFwAGcJ8ABnEzAAZxqwAGchsABnJvAAZyzwAGcxMABnOHAAZ0DwAGdFcABnSrAAZ04wAGdUsABnWfAAZ1/wAGdkMABnaPAAZ3GwAGeHcABnjLAAZ5KwAGeW8ABnoDAAZ6bwAGeucABntDAAZ7owAGfDsABnyDAAZ81wAGfQ8ABn5DAAZ+rwAGfzcABn/nAAaAXwAGgMcABoFXAAaCBwAGgqsABoPbAAaEbwAGhPMABoWHAAaF+wAGhpcABob7AAaHTwAGh6cABogbAAaItwAGiRsABolvAAaJxwAGijsABorXAAaLOwAGi48ABovnAAaMhwAGjaMABo4zAAaOswAGjw8ABo93AAaPwwAGkF8ABpDHAAaRdwAGkc8ABpIXAAaSWwAGktcABpOrAAaUFwAGlHMABpTXAAaVRwAGlZsABpX/AAaWtwAGl0sABpjbAAaZXwAGmdMABppTAAaa6wAGm48ABpwXAAacjwAGnQMABp2DAAad5wAGnuMABp/HAAagOwAGoLsABqEfAAah0wAGomsABqKzAAajBwAGoz8ABqOfAAakLwAGpRsABqWbAAamCwAGppMABqbjAAanPwAGp38ABqfjAAaocwAGqN8ABqlXAAapswAGqlcABqsjAAarzwAGrIcABq0jAAatrwAGrh8ABq57AAavbwAGr7sABq/3AAawawAGsMsABrHPAAayfwAGss8ABrMPAAazXwAGs7sABrP7AAa0owAGte8ABrYvAAa2ewAGtqsABrefAAa36wAGuFsABrjXAAa5NwAGuYcABrn/AAa6iwAGu1sABrvbAAa8VwAGvMMABr0XAAa9dwAGvbsABr53AAa/OwAGv4sABr/nAAbAJwAGwFcABsCTAAbA2wAGwTcABsFvAAbBlwAGwgsABsKPAAbC8wAGw0cABsO/AAbEQwAGxKsABsV7AAbGFwAGxq8ABsc7AAbHtwAGyDsABsjLAAbJPwAGyccABspvAAbK6wAGy3MABsvfAAbMmwAGzScABs2/AAbOOwAGzscABs/fAAbQJwAG0HsABtCzAAbRWwAG0fsABtJTAAbStwAG0v8ABtNzAAbUIwAG1H8ABtVbAAbW9wAG10MABtd/AAbX2wAG2LcABtovAAbaewAG2rcABtsTAAbb7wAG3YsABt3XAAbeEwAG3oMABt7/AAbfXwAG38sABuGnAAbiWwAG4rcABuMjAAbjbwAG46sABuPrAAbkQwAG5OMABuUrAAblYwAG5gMABucXAAbnpwAG6CcABuhzAAbojwAG6MsABuj3AAbpYwAG6gMABupfAAbqqwAG6vsAButfAAbrzwAG7CMABuyXAAbs2wAG7TcABu2fAAbt6wAG7mcABu8fAAbvhwAG8FcABvCvAAbw9wAG8WMABvG3AAbyFwAG8lsABvKfAAbzAwAG80cABvObAAbz3wAG9GMABvS7AAb1LwAG9ZMABvXXAAb2JwAG9lsABvcXAAb3WwAG96sABvffAAb4WwAG+Z8ABvnnAAb6OwAG+nMABvq7AAb7gwAG/DMABv1PAAb/swAHAFMABwDjAAcBNwAHAZcABwHbAAcCowAHA3cABwPLAAcEKwAHBG8ABwWvAAcGAwAHBmMABwanAAcG/wAHB98ABwgPAAcIIwAHCC8ABwjPAAcJDwAHCTsABwnbAAcKowAHCxMABwvPAAcMMwAHDG8ABwzzAAcNBwAHDR8ABw07AAcNXwAHDYMABw2rAAcNvwAHDh8ABw47AAcOcwAHDw8ABw9bAAcQBwAHERcABxGjAAcRxwAHEeMABxHrAAcSFwAHEjMABxKLAAcTMwAHE+cABxP7AAcUMwAHFgcABxaLAAcXswAHGGMABxmfAAcZuwAHGo8ABxuPAAccLwAHHG8ABxzXAAcdawAHHX8ABx3jAAceSwAHHvsABx8nA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Ail8wAIpfsACKYDAAimCwAIphMACKYbAAimMwAIplsACKZnAAimcwAIpn8ACKajAAimrwAIprcACKa/AAimxwAIps8ACKbXAAim3wAIpucACKbvAAim9wAIpv8ACKcHAAinDwAIpxcACKcfAAinJwAIpy8ACKc3AAinPwAIp0cACKdPAAinVwAIp18ACKdnAAinbwAIp78ACKgTAAioKwAIqE8ACKhXAAioXwAIqGcACKhvAAiodwAIqH8ACKiHAAiojwAIqJcACKifAAiopwAIqK8ACKi3AAiovwAIqMcACKjPAAio1wAIqN8ACKjnAAio7wAIqPcACKj/AAipSwAIqVsACKmrAAipwwAIqdcACKoXAAiqUwAIqpMACKq7AAiq7wAIqyMACKtDAAirkwAIq+MACKw3AAiscwAIrNcACK0HAAitTwAIrXsACK2XAAitwwAIreMACK4LAAiuGwAIriMACK5HAAiuYwAIrqcACK63AAiuxwAIrt8ACK8TAAivRwAIr28ACK+bAAiv7wAIsAMACLAzAAiwQwAIsGcACLB/AAiwpwAIsL8ACLDvAAixCwAIsTMACLFTAAixdwAIsY8ACLGnAAix0wAIsfcACLIHAAiyKwAIsk8ACLJnAAiymwAIsr8ACLM3AAizZwAIs58ACLOjAAiztwAIs/8ACLQ7AAi0QwAItEsACLRzAAi0uwAItNsACLUvAAi1SwAItZ8ACLXjAAi2OwAItn8ACLaPAAi2vwAItu8ACLcDAAi3FwAIt0MACLdvAAi3jwAIt78ACLffAAi4GwAIuFsACLiLAAi4nwAIuOcACLkfAAi5dwAIuYMACLm/AAi53wAIuesACLozAAi6cwAIupMACLrLAAi65wAIuxsACLtbAAi7ewAIu7MACLvTAAi77wAIvCcACLxLAAi8UwAIvHMACLynAAi82wAIvS8ACL1zAAi9mwAIvasACL3HAAi96wAIvhsACL4nAAi+QwAIvmMACL5/AAi+twAIvwMACL8PAAi/VwAIv1sACL+HAAi/owAIv9sACL/3AAi//wAIwEsACMCnAAjAqwAIwMcACMDjAAjBFwAIwVcACMFrAAjBywAIwg8ACMIfAAjCRwAIwmMACMK3AAjDVwAIw5cACMO7AAjESwAIxHsACMSnAAjE1wAIxPMACMUfAAjFLwAIxUMACMVvA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AlYhwAJWIsACVj7AAlZNwAJWbsACVpjAAlaawAJWqcACVrDAAla/wAJW0cACVuXAAlcCwAJXFcACVy3AAldOwAJXYcACV3nAAleawAJXqMACV7XAAle/wAJX3sACV+3AAlgBwAJYCsACWBjAAlgtwAJYN8ACWEnAAlhWwAJYZMACWG7AAlh9wAJYhsACWIrAAliUwAJYn8ACWKrAAli3wAJY3cACWPHAAlj6wAJZB8ACWRDAAlkawAJZJcACWTLAAlk8wAJZSMACWVXAAlldwAJZZsACWW7AAll4wAJZhMACWZ7AAlmxwAJZucACWcXAAlnVwAJZ48ACWfLAAloAwAJaCcACWhfAAloawAJaI8ACWi3AAlo5wAJaUMACWlvAAlplwAJaasACWnPAAlp6wAJah8ACWpjAAlqiwAJauMACWsXAAlrYwAJa6sACWvvAAlsTwAJbKcACW0DAAltZwAJbZcACW2nAAlt0wAJbfsACW4fAAlugwAJbt8ACW8DAAlvGwAJb6sACW/7AAlwKwAJcF8ACXCTAAlw0wAJcQcACXFPAAlxowAJcdcACXIXAAlyWwAJcs8ACXNHAAlz4wAJdD8ACXSPAAl0swAJdOcACXUzAAl1awAJdX8ACXW3AAl15wAJdicACXaTAAl29wAJd3cACXf3AAl4YwAJeNcACXkfAAl5lwAJefcACXpLAAl6cwAJeosACXrHAAl64wAJewMACXsjAAl7QwAJe2cACXunAAl7wwAJe+cACXwrAAl8bwAJfI8ACXyzAAl81wAJfOMACX1DAAl9XwAJfbcACX3/AAl+IwAJfn8ACX6bAAl+zwAJfv8ACX8rAAl/jwAJf9sACYBjAAmAtwAJgPsACYEPAAmBMwAJgWcACYFzAAmBywAJghMACYJbAAmCkwAJgtsACYMTAAmDcwAJg8MACYRrAAmFAwAJhV8ACYWrAAmF8wAJhisACYZ7AAmGuwAJhwMACYdHAAmHjwAJh88ACYgTAAmIdwAJiK8ACYkLAAmJQwAJicMACYofAAmKPwAJincACYqPAAmKywAJixMACYtTAAmLqwAJi/MACYwrAAmMawAJjL8ACY0LAAmNMwAJjVsACY2TAAmN5wAJjqMACY7PAAmO7wAJjysACY8/AAmPYwAJj4MACY/nAAmQGwAJkGcACZDHAAmQ+wAJkScACZF7AAmRvwAJkcMACZIHAAmSgwAJkwMACZM3AAmTowAJk/cACZQ/AAmUZwAJlTsACZWPAAmVswAJlpMACZa/AAmXlwAJl+MACZhDAAmYmwAJmN8ACZk3AAmZiwAJmbMACZoLAAmaFwAJmjcACZp3AAma5wAJmyMACZtnAAmbjwAJm78ACZxDAAmcowAJnMcACZznAAmdNwAJnT8ACZ1HAAmdpwAJndMACZ3fAAmeAwAJnlcACZ6nAAme4wAJn2MACZ9/AAmfqwAJoCMACaBfAAmg5wAJoTMACaHLAAmiKwAJotsACaMXAAmjnwAJo+MACaRzAAmkuwAJpU8ACaWDAAmmAwAJplsACacDAAmnQwAJp88ACahXAAmozwAJqW8ACanzAAmqjwAJqw8ACau3AAmsOwAJrMMACa1zAAmt5wAJroMACa8PAAmvgwAJr/sACbCbAAmxDwAJsasACbIfAAmyuwAJsxMACbOLAAm0KwAJtL8ACbUrAAm2DwAJto8ACbc3AAm3twAJuF8ACbkbAAm5+wAJuoMACbsvAAm7wwAJvH8ACb0LAAm9nwAJvlsACb6XAAm+rwAJvtsACb8fAAm/TwAJv5MACb+zAAm/7wAJwAsACcAzAAnAUwAJwHcACcCbAAnA6wAJwScACcFjAAnBlwAJwb8ACcHvAAnB/wAJwiMACcI3AAnCUwAJwocACcK7AAnDAwAJwy8ACcNDAAnDVwAJw2sACcN/AAnDtwAJw9sACcQnAAnESwAJxIMACcSnAAnExwAJxOcACcU/AAnFZwAJxYsACcWbAAnF/wAJxmcACcaPAAnGlwAJxt8ACccbAAnHZwAJx88ACchDAAnIvwAJyTsACcmjAAnKEwAJyl8ACcqPAAnK7wAJyyMACctLAAnLgwAJy78ACcwHAAnMHwAJzEsACcx7AAnMtwAJzO8ACc0XAAnNWwAJzZcACc3rAAnODwAJzosACc7XAAnO/wAJzycACc9jAAnPgwAJz8cACc/TAAnQJwAJ0G8ACdCrAAnQvwAJ0OcACdETAAnRVwAJ0a8ACdHbAAnSEwAJ0mMACdK3AAnS/wAJ0zsACdNrAAnTzwAJ1A8ACdRrAAnUxwAJ1RsACdV3AAnVvwAJ1gMACdYvAAnWfwAJ1rMACdbbAAnXJwAJ108ACdeDAAnXtwAJ19cACdgbAAnYWwAJ2JcACdinAAnZQwAJ2WMACdmvAAnZwwAJ2lsACdqjAAna6wAJ2y8ACdubAAnb9wAJ3FMACdyrAAndkwAJ3ccACd5zAAneqwAJ3ssACd7vAAnfCwAJ3ysACd9LAAnfcwAJ36cACd/vAAngLwAJ4DsACeDnAAnhMwAJ4X8ACeHDAAnh+wAJ4xMACeNzAAnj4wAJ5H8ACeSzAAnk7wAJ5TMACeV3AAnlowAJ5gcACeYnAAnmTwAJ5nMACearAAnnKwAJ56MACefvAAnoywAJ6RsACek/AAnpdwAJ6Z8ACenbAAnqOwAJ6pMACerXAAnrAwAJ6ycACetLAAnrfwAJ69MACev7AAnsQwAJ7GsACeyzAAntAwAJ7TMACe1rAAntpwAJ7hcACe6fAAnuzwAJ7xsACe9PAAnviwAJ8A8ACfB7AAnwwwAJ8RMACfE/AAnxnwAJ8dsACfH/AAnyPwAJ8osACfLjAAnzXwAJ858ACfP/AAn0SwAJ9H8ACfT3AAn1KwAJ9ZsACfXLAAn2AwAJ9kcACfaTAAn24wAJ9zMACfdrAAn3xwAJ+BsACfiHAAn44wAJ+W8ACfmLAAn50wAJ+f8ACfo/AAn6mwAJ+t8ACftLAAn7ewAJ++MACfwHAAn8QwAJ/FcACfyfAAn80wAJ/TsACf1fAAn97wAJ/jMACf53AAn+qwAJ/vcACf9fAAn/owAJ/9MACgAvAAoAewAKAN8ACgEPAAoBSwAKAXsACgGzAAoB5wAKAhMACgInAAoCbwAKAoMACgKfAAoCywAKAvcACgOLAAoDvwAKA/MACgP3AAoEDwAKBCcACgRXAAoEZwAKBHcACgSjAAoEywAKBPsACgVHAAoFbwAKBXcACgV/AAoFlwAKBacACgWvAAoFxwAKBc8ACgXzAAoF+wAKBhsACgZPAAoGXwAKBosACgabAAoGywAKBvMACgcXAAoHQwAKB4cACge/AAoIDwAKCD8ACgiDAAoIuwAKCOsACgjvAAoJbwAKCYMACgmPAAoJswAKCfMACgoPAAoKRwAKCnsACgqXAAoKzwAKCvMACgsfAAoLMwAKC0MACgtbAAoLlwAKC6MACgvHAAoL8wAKDC8ACgxnAAoMlwAKDM8ACg0bAAoNSwAKDYMACg2zAAoN2wAKDicACg5XAAoOiwAKDrcACg7zAAoPQwAKD6MACg/zAAoQVwAKEJ8AChD3AAoRQwAKEZcAChGvAAoRywAKEdMAChHfAAoR+wAKEh8AChJDAAoSXwAKEnMAChLfAAoTDwAKE0cAChOjAAoT5wAKFA8AChRDAAoUUwAKFI8AChSvAAoUwwAKFQ8AChVjAAoVfwAKFasAChXXAAoWWwAKFo8AChaXAAoWvwAKFvMAChcbAAoXRwAKF3MAChebAAoX4wAKGCMAChg7AAoYXwAKGGMAChhnAAoYbwAKGJ8AChinAAoY7wAKGRMAChlHAAoZiwAKGcMAChpDAAoalwAKGssAChrnAAoa/wAKGzMAChtnAAobvwAKHAcAChxDAAoclwAKHMsAChzTAAodFwAKHS8ACh0/AAodUwAKHWcACh1/AAodnwAKHfsACh4DAAoeBwAKHg8ACh5LAAoebwAKHrMACh73AAofJwAKH3MACh+LAAoflwAKH7cACiAvAAoghwAKIRsACiGXAAoh0wAKIgMACiI3AAoiYwAKIm8ACiKHAAoi3wAKI0sACiOPAAojywAKI/8ACiRXAAokdwAKJJcACiTDAAok7wAKJQ8ACiUbAAolVwAKJacACiYHAAomKwAKJncACiaLAAommwAKJrcACibfAAonEwAKJzcACid/AAonrwAKJ/8ACigLAAooHwAKKCsACigvAAooVwAKKJMACijfAAoo5wAKKO8ACij3AAopBwAKKQ8ACikrAAopRwAKKU8ACimDAAopkwAKKa8ACinDAAop1wAKKeMACinrAAop/wAKKjcACipDAAoqYwAKKnsACiqDAAoqlwAKKqsACiqzAAoqvwAKKvMACisLAAorFwAKKycACitDAAorYwAKK2sACit7AAorkwAKK58ACiunAAoruwAKK/sACiwXAAosLwAKLEsACixfAAosbwAKLIsACizXAAotBwAKLSMACi0zAAotPwAKLU8ACi1fAAothwAKLa8ACi3bAAouIwAKLksACi53AAoulwAKLr8ACi7nAAovEwAKLz8ACi9TAAovcwAKL6sACi/DAAov3wAKMA8ACjArAAowQwAKMIMACjCLAAowkwAKMJsACjEHAAoxSwAKMWcACjG3AAox9wAKMi8ACjKLAAoyxwAKMycACjN/AAoz+wAKNGsACjSvAAo08wAKNUcACjVTAAo1rwAKNgcACjZrAAo2nwAKNrMACjbrAAo3PwAKN3MACjfLAAo39wAKODsACjhfAAo4qwAKOQsACjkfAAo5bwAKObMACjn3AAo6DwAKOlcACjpzAAo6uwAKOwcACjtPAAo7fwAKO58ACjvLAAo75wAKPBsACjxnAAo8pwAKPOcACj03AAo9qwAKPfMACj4vAAo+bwAKPocACj6zAAo+4wAKPv8ACj83AAo/awAKP48ACj+3AAo/2wAKQAMACkAvAApAXwAKQIsACkC7AApA6wAKQR8ACkFDAApBawAKQX8ACkG/AApCFwAKQksACkLfAApDIwAKQ0cACkN3AApDwwAKREsACkSjAApEwwAKRO8ACkUzAApFdwAKRZMACkXXAApGBwAKRkMACkZvAApGqwAKRtsACkcjAApHZwAKSAMACkgjAApIKwAKSI8ACkjnAApJZwAKSZ8ACkoPAApKgwAKSrcACkrXAApLEwAKS3sACkurAApMDwAKTF8ACkxvAApMgwAKTKMACkzDAApM5wAKTPsACk0PAApNLwAKTU8ACk1XAApNXwAKTY8ACk3vAApOAwAKThcACk4/AApOgwAKTqsACk77AApPHwAKT0cACk+PAApP9wAKUE8AClCLAApQ5wAKUTMAClFjAApRkwAKUdMAClIDAApSNwAKUlcAClJ7AApSowAKUrMAClL7AApTQwAKU5cAClPDAApUVwAKVJcAClS3AApU9wAKVUsAClWrAApV6wAKVksAClbLAApXIwAKV2cACleXAApXrwAKWCMAClgzAApYOwAKWEsAClh7AApY7wAKWRcAClk7AApZZwAKWacAClnnAApaMwAKWn8AClqrAApa5wAKWx8ACltbAApb0wAKXCsAClx7AApcxwAKXPsACl1TAApdpwAKXeMACl4vAApeUwAKXncACl6bAApe5wAKXvsACl9fAApfawAKX7sACl/TAApf/wAKYCsACmA/AApgZwAKYIcACmCnAApgxwAKYPMACmE3AAphiwAKYbsACmH/AApiQwAKYmcACmKjAApixwAKYt8ACmLvAApi/wAKYwsACmMXAApjLwAKY0cACmNXAApjYwAKY4MACmOjAApjuwAKY9sACmQDAApkQwAKZHsACmSjAApkuwAKZOsACmUbAAplQwAKZWsACmWPAAplswAKZeMACmYTAApmOwAKZl8ACmaDAApmuwAKZvMACmcjAApnSwAKZ4MACmfDAApoGwAKaKsACmk7AAppiwAKafsACmpHAApq3wAKaxMACmtTAAprowAKa9cACmwHAApsRwAKbHcACmzbAAptEwAKbY8ACm4LAApuZwAKbuMACm9nAApwFwAKcJMACnEXAApxkwAKchMACnKXAApy6wAKczsACnN3AApzpwAKc9MACnQLAAp0UwAKdNMACnUXAAp1dwAKdacACnXPAAp2PwAKdmMACnbLAAp3TwAKd28ACnf3AAp4GwAKeJMACnizAAp5KwAKedcACnpTAAp6ewAKes8ACnsnAAp7gwAKe+MACnxbAAp8swAKfS8ACn2LAAp92wAKfgsACn4vAAp+jwAKft8ACn9XAAp/qwAKgAMACoBbAAqAfwAKgLsACoDjAAqBDwAKgTsACoFvAAqBmwAKgc8ACoH7AAqCGwAKgmMACoKHAAqCpwAKgvMACoMvAAqDgwAKg8cACoRTAAqEdwAKhKsACoTfAAqFAwAKhU8ACoW7AAqF6wAKhgsACoYXAAqGNwAKhnMACoarAAqG3wAKhw8ACoebAAqH3wAKiBcACog7AAqIWwAKiIcACoi3AAqI4wAKiPsACokjAAqJVwAKiZsAConXAAqJ/wAKiisACoqTAAqKzwAKiwMACotTAAqLawAKi7cACow3AAqMjwAKjOMACo0PAAqNOwAKjWcACo3fAAqOEwAKjlcACo6LAAqO1wAKj0sACo+TAAqPtwAKkEsACpBnAAqQswAKkO8ACpFLAAqRcwAKkZsACpG7AAqRzwAKkj8ACpKHAAqStwAKktsACpMTAAqTIwAKk3MACpOrAAqT1wAKlDcACpRzAAqU8wAKlSsACpVHAAqVhwAKlbMACpW7AAqWXwAKltMACpd/AAqXqwAKl8sACpf3AAqYJwAKmFsACphjAAqY0wAKmR8ACplvAAqZlwAKmd8ACpoPAAqaOwAKmlcACpqDAAqaowAKmyMACptTAAqbowAKnA8ACpxXAAqc1wAKnPMACp0nAAqdSwAKnZ8ACp3vAAqeCwAKnlsACp7vAAqfOwAKn+8ACqBzAAqgjwAKoJcACqEHAAqhtwAKoesACqIXAAqiuwAKo4MACqO7AAqkhwAKpKcACqVfAAqlnwAKpg8ACqYbAAqmLwAKpl8ACqaTAAqmtwAKpucACqcPAAqnPwAKp4cACqejAAqn1wAKp+MACqfrAAqoRwAKqE8ACqhvAAqoowAKqOsACqkjAAqpawAKqbcACqnvAAqqHwAKqi8ACqpXAAqqdwAKqo8ACqq7AAqq3wAKqwcACqs3AAqrPwAKq28ACquXAAqrowAKq7cACqwHAAqsOwAKrHMACqzTAAqs9wAKrSsACq1vAAqtvwAKrgcACq5TAAquvwAKrwsACq8rAAqvTwAKr48ACq/HAAqwFwAKsEsACrBzAAqwowAKsOcACrEbAAqxTwAKsXMACrGXAAqxxwAKshMACrI7AAqySwAKsnsACrKrAAqyxwAKsxcACrMzAAqzYwAKs4MACrP3AAq0JwAKtF8ACrSzAAq0+wAKtS8ACrVPAAq2dwAKtscACrcXAAq3ZwAKuEsACrkvAAq5VwAKuXcACrm3AAq51wAKujsACrpbAAq6fwAKuqcACrqvAAq6xwAKutsACrr7AAq7DwAKuyMACrszAAq7RwAKu1sACrufAAq7swAKu9MACrv3AAq8EwAKvDMACrw7AAq8VwAKvGcACrx3AAq8hwAKvJ8ACry7AAq82wAKvPcACr0LAAq9HwAKvTMACr1PAAq9WwAKvXsACr2HAAq9lwAKvZ8ACr3HAAq93wAKvecACr4LAAq+LwAKvjcACr5TAAq+ZwAKvn8ACr6XAAq+owAKvrMACr67AAq+wwAKvuMACr7zAAq/BwAKvxsACr83AAq/TwAKv1sACr9rAAq/gwAKv5sACr+vAAq/xwAKv9cACr/nAAq/+wAKwAsACsAXAArAMwAKwD8ACsBPAArAYwAKwHMACsCHAArApwAKwOsACsEnAArBPwAKwYMACsGfAArBzwAKwfMACsJHAArCcwAKwrcACsL7AArDHwAKwzsACsN3AArDiwAKw7MACsPfAArD+wAKxCMACsRvAArEwwAKxQcACsUTAArFSwAKxXMACsWTAArF1wAKxiMACsZzAArGvwAKxw8ACsdPAArHnwAKx+MACsgjAArIcwAKyL8ACskbAArJZwAKyZ8ACsn3AArKSwAKylcACspvAArKmwAKyscACsrvAArLFwAKyz8ACstLAArLkwAKy7sACswHAArMHwAKzEMACsyPAArM5wAKzPMACs0jAArNKwAKzTMACs1DAArNXwAKzYcACs2TAArNnwAKzbsACs3jAArN7wAKzgcACs4PAArOIwAKzjcACs5LAArOawAKznMACs6/AArO6wAKzzsACs9DAArPVwAKz3cACs+DAArPiwAKz58ACs+zAArP0wAKz98ACs//AArQKwAK0DsACtBLAArQXwAK0H8ACtCHAArQmwAK0K8ACtDPAArQ2wAK0O8ACtEPAArRFwAK0UMACtFLAArRkwAK0bsACtIHAArSIwAK0ksACtJTAArSawAK0p8ACtKvAArSywAK0tMACtL3AArS/wAK0x8ACtNbAArTYwAK06cACtP3AArUAwAK1CcACtQ7AArUWwAK1GMACtRzAArUjwAK1JcACtUTAArVjwAK1ZMACtWnAArV0wAK1gsACtYXAArWNwAK1jsACtZfAArWrwAK1yMACtczAArXVwAK15MACtezAArX0wAK198ACtgLAArYUwAK2KMACtj3AArZPwAK2YsACtnrAAraOwAK2ncACtrPAArbIwAK22sACtufAArb8wAK3DsACtyTAArc2wAK3S8ACt2HAArd0wAK3icACt57AAre0wAK3ysACt9rAArftwAK4BsACuBfAArgpwAK4PMACuEvAArhawAK4cMACuHvAAriCwAK4i8ACuJjAArigwAK4rcACuLXAArjBwAK4z8ACuNvAArjmwAK478ACuPjAArj/wAK5AcACuQPAArkhwAK5McACuTzAArk+wAK5QsACuU3AArlYwAK5YsACuXPAArmCwAK5l8ACua3AArnBwAK52MACueLAArnwwAK6A8ACug7AArolwAK6MMACuj3AArpBwAK6TsACulfAArpewAK6Y8ACun3AArqRwAK6ncACuqvAArq4wAK6wsACusbAArrNwAK62MACuubAArrpwAK6/8ACuwrAArsUwAK7JcACuzHAArtFwAK7V8ACu2HAArtwwAK7eMACu4XAAruZwAK7qMACu7zAArvCwAK7zMACu9bAArvpwAK79cACu//AArwOwAK8H8ACvC/AArxBwAK8TcACvF/AArx0wAK8f8ACvJHAAryjwAK8tcACvMnAArzfwAK89cACvQPAAr0TwAK9HsACvTTAAr1PwAK9YMACvXHAAr18wAK9icACvZbAAr2iwAK9ssACvbPAAr2+wAK9ycACvdHAAr3ZwAK948ACvefAAr3vwAK998ACvgfAAr4OwAK+EsACviTAAr4uwAK+R8ACvljAAr5kwAK+eMACvoTAAr6XwAK+oMACvq7AAr7BwAK+3MACvvTAAr8QwAK/I8ACvzPAAr9GwAK/VsACv27AAr99wAK/iMACv5bAAr+qwAK/w8ACv9zAAr/nwALAAsACwBbAAsAowALAM8ACwEnAAsBjwALAf8ACwJLAAsCkwALAucACwNDAAsDgwALA6sACwPXAAsEAwALBB8ACwRrAAsEqwALBOsACwWHAAsF+wALBl8ACwbfAAsG7wALB0sACwejAAsH3wALCCcACwijAAsIywALCN8ACwlDAAsJYwALCXsACwm7AAsKOwALCoMACwq3AAsK8wALCy8ACwtDAAsLXwALC4sACwvLAAsMEwALDGcACwyzAAsM6wALDVsACw2HAAsNuwALDgcACw43AAsOSwALDl8ACw6jAAsOxwALDucACw9DAAsPiwALD8MACw/bAAsQOwALEGcACxCzAAsRHwALEWcACxGfAAsRywALEe8ACxJPAAsSqwALEsMACxMTAAsTMwALE28ACxObAAsT6wALFAsACxRTAAsUfwALFJ8ACxTDAAsU5wALFQ8ACxUzAAsVTwALFXMACxWPAAsVxwALFgMACxZDAAsWhwALFrMACxcfAAsXcwALF6MACxfHAAsX+wALGDsACxiHAAsY1wALGRcACxljAAsZ4wALGscACxrjAAsbGwALG28ACxu/AAsb/wALHKcACx0/AAsdXwALHY8ACx2jAAsd5wALHhsACx5XAAsehwALHqsACx8DAAsfOwALH1sACx+LAAsf8wALIF8ACyCPAAsgpwALIOsACyEPAAshNwALIWMACyGTAAshywALIfMACyIzAAsiWwALIocACyKrAAsi3wALIwcACyMzAAsjawALI8MACyRLAAsklwALJR8ACyVrAAsl8wALJjsACyaXAAsnEwALJ4sACyfPAAsn9wALKEsACyhPAAsokwALKLsACyjXAAso5wALKRcACylXAAspiwALKccACyoXAAsqQwALKmsACyqLAAsq/wALKzcACyt/AAsrxwALK/MACyxzAAsszwALLPMACy0vAAstUwALLZcACy3zAAsuJwALLmsACy6LAAsuvwALLt8ACy8jAAsvLwALL4MACy/fAAswAwALMBMACzAzAAswawALMK8ACzDTAAsw6wALMScACzFbAAsxlwALMf8ACzI3AAsydwALMrMACzLXAAszCwALMy8ACzNjAAszhwALM5MACzOfAAszpwALM68ACzO/AAszzwALNC8ACzSDAAs0ywALNRsACzV7AAs11wALNjcACzafAAs3CwALN1sACzenAAs37wALOCsACzifAAs40wALOQMACzk/AAs5bwALOZMACznLAAs6DwALOj8ACzp7AAs6swALOu8ACzsXAAs7OwALO2cACzuTAAs7swALO9MACzv7AAs8WwALPL8ACzz/AAs9HwALPUsACz17AAs9owALPdsACz37AAs+XwALPscACz8LAAs/RwALP3MACz+fAAs/xwALP/sAC0AnAAtAjwALQLsAC0DzAAtBKwALQZMAC0HfAAtCFwALQkMAC0J7AAtCpwALQtMAC0MLAAtDQwALQ28AC0OvAAtD4wALREcAC0S3AAtE/wALRTMAC0VzAAtFowALRdcAC0YTAAtGRwALRosAC0bDAAtHEwALR1cAC0eXAAtHwwALR/sAC0gvAAtIwwALSRcAC0lzAAtJ2wALSlsAC0rTAAtLCwALS5cAC0vbAAtMQwALTKsAC0zrAAtNGwALTUMAC02DAAtN7wALTh8AC05vAAtOmwALTtcAC08PAAtPTwALT38AC0/TAAtQNwALUIMAC1DPAAtRIwALUYsAC1G/AAtR7wALUjcAC1KfAAtSvwALUvMAC1MjAAtTVwALU4MAC1PfAAtUDwALVEcAC1SPAAtUlwALVNsAC1UnAAtVdwALVesAC1ZfAAtWpwALVuMAC1c7AAtXXwALV6MAC1fnAAtYkwALWNcAC1jnAAtZDwALWXcAC1mjAAtZ5wALWmcAC1rLAAtbDwALW1MAC1uPAAtb7wALXE8AC1ynAAtc2wALXPMAC10rAAtdXwALXZcAC13PAAteAwALXjsAC16TAAteuwALXzMAC1+/AAtf0wALX/MAC2AfAAtgSwALYF8AC2CTAAtgqwALYP8AC2F/AAthswALYiMAC2KvAAtjGwALY2MAC2OnAAtj4wALZDsAC2RjAAtkjwALZL8AC2TvAAtlMwALZVsAC2V/AAtlwwALZc8AC2XnAAtmDwALZiMAC2ZTAAtmjwALZtcAC2cDAAtnVwALZ4sAC2f3AAtoiwALaNMAC2jrAAtpCwALaSsAC2lHAAtpZwALaY8AC2nfAAtqZwALarMAC2sjAAtrfwALa8sAC2wXAAtsGwALbGcAC2yzAAts/wALbTsAC213AAttkwALbbMAC24PAAtuQwALbocAC27DAAtu5wALbx8AC29nAAtvmwALb8MAC2/3AAtwCwALcE8AC3CXAAtw1wALcRsAC3FXAAtxjwALcdcAC3JXAAtytwALcwsAC3NfAAtzfwALc9MAC3PnAAtz+wALdDsAC3R7AAt0owALdO8AC3UHAAt1SwALdZsAC3XDAAt2AwALdk8AC3bLAAt24wALdx8AC3c/AAt34wALd/cAC3gnAAt4WwALeIsAC3jLAAt48wALeR8AC3lfAAt5lwALed8AC3orAAt6mwALetMAC3r/AAt7TwALe3cAC3uTAAt76wALfCcAC3xzAAt8lwALfLcAC30DAAt9OwALfWMAC34zAAt+fwALfuMAC38DAAt/UwALf48AC3+/AAuAUwALgJMAC4DjAAuBEwALgVcAC4GHAAuBqwALgcMAC4HnAAuCEwALglsAC4KHAAuCswALgusAC4MDAAuDFwALg2MAC4OXAAuDrwALg98AC4PvAAuENwALhEsAC4SXAAuE2wALhOsAC4ULAAuFLwALhVMAC4V7AAuFiwALhZMAC4WbAAuFowALhasAC4XvAAuGTwALhnMAC4Z7AAuG5wALhycAC4dPAAuHiwALh9MAC4gLAAuIPwALiHcAC4izAAuI0wALiP8AC4knAAuJiwALid8AC4oDAAuKZwALircAC4sLAAuLLwALiz8AC4tfAAuLpwALi+cAC4wfAAuMWwALjIsAC4yrAAuM1wALjR8AC41zAAuN4wALjiMAC46LAAuO5wALjysAC49vAAuPrwALj98AC5AnAAuQVwALkHcAC5CvAAuQ2wALkTMAC5FjAAuRkwALkeMAC5IDAAuSQwALkn8AC5KjAAuS0wALkx8AC5NXAAuTpwALk/8AC5RHAAuUtwALlSsAC5VnAAuVgwALldMAC5YnAAuWRwALlocAC5a3AAuW+wALlzMAC5dvAAuXvwALl/sAC5gPAAuYUwALmNMAC5lHAAuZewALmcMAC5nnAAuaBwALmjsAC5prAAuauwALmxMAC5s/AAubhwALm78AC5wXAAucPwALnG8AC5y7AAudbwALnZsAC53DAAud6wALnhcAC54zAAuemwALnscAC58fAAufLwALn38AC5/bAAugIwALoFcAC6CPAAug3wALoSMAC6FbAAuhewALobcAC6H/AAuiMwALopMAC6LXAAujHwALo08AC6ODAAujqwALo9sAC6QHAAukRwALpJcAC6TjAAulGwALpVcAC6WDAAulswALpeMAC6YLAAumYwALpp8AC6cbAAunowALp8sAC6gHAAuoTwALqJsAC6jXAAupLwALqYcAC6nXAAuqBwALqkMAC6pzAAuqvwALqusAC6snAAurVwALq38AC6uvAAur0wALq/MAC6wLAAusLwALrGMAC6yfAAus7wALrUMAC617AAutkwALrcMAC63rAAuuGwALrmMAC66LAAuumwALruMAC68DAAuvMwALr0MAC69zAAuvmwALr88AC6//AAuwIwALsLcAC7D7AAuxQwALsXMAC7GXAAux2wALsgMAC7InAAuyawALsscAC7MjAAuzgwALs88AC7P3AAu0NwALtHMAC7SjAAu02wALtRcAC7U3AAu1nwALtdsAC7X/AAu2KwALtmcAC7aHAAu27wALtysAC7ePAAu31wALuAsAC7gvAAu4WwALuJ8AC7jLAAu5KwALuV8AC7mHAAu5rwALuf8AC7ovAAu6bwALuscAC7sLAAu7dwALu6MAC7vPAAu8EwALvFsAC7yPAAu80wALvQcAC70fAAu9gwALvdsAC74jAAu+SwALvo8AC76vAAu+xwALvvcAC78fAAu/awALv6cAC7/vAAu//wALwA8AC8ArAAvAhwALwMMAC8DrAAvBDwALwU8AC8GLAAvBxwALwjMAC8JrAAvC0wALwxMAC8ODAAvD1wALxFsAC8SrAAvFKwALxccAC8X7AAvGXwALxs8AC8dvAAvH4wALyIcAC8jbAAvJXwALyasAC8onAAvKYwALys8AC8sbAAvLlwALzAMAC8yfAAvM7wALzW8AC82LAAvN1wALzgcAC85nAAvOowALzw8AC89jAAvP5wAL0IMAC9FPAAvRnwAL0h8AC9KPAAvTLwAL0+8AC9TfAAvVMwAL1bcAC9YfAAvWtwAL1zcAC9fnAAvYZwAL2RcAC9mvAAvadwAL2vcAC9unAAvcKwAL3N8AC91PAAvd7wAL3j8AC96/AAvfFwAL358AC+ArAAvg5wAL4VcAC+H3AAviWwAL4u8AC+NvAAvkHwAL5JMAC+U3AAvlwwAL5n8AC+bXAAvnXwAL5+cAC+ifA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A0CSwANAtMADQMTAA0DMwANA18ADQOPAA0D2wANBAsADQRbAA0EcwANBKMADQT3AA0FAwANBScADQU/AA0FbwANBacADQW/AA0F3wANBfsADQYrAA0GbwANBqMADQbDAA0G+wANB1MADQd3AA0HlwANB9MADQf7AA0IKwANCF8ADQiPAA0I2wANCQMADQlzAA0JnwANCbMADQnfAA0KDwANCisADQpDAA0KhwANCqsADQrbAA0LEwANC1sADQufAA0LuwANDC8ADQyzAA0M2wANDQcADQ1vAA0N2wANDhcADQ5DAA0OZwANDrsADQ73AA0PKwAND18ADQ+XAA0P8wANECcADRCHAA0QwwANEQcADREzAA0RjwANEcsADRIXAA0SUwANEmsADRKDAA0S5wANExMADRM/AA0TkwANE+cADRQrAA0UQwANFHsADRSzAA0U9wANFScADRVPAA0VhwANFb8ADRX/AA0WNwANFoMADRa/AA0XEwANF2cADRe7AA0YDwANGIcADRirAA0Y9wANGRcADRk7AA0ZdwANGY8ADRmbAA0ZzwANGe8ADRoTAA0aWwANGnMADRqnAA0a7wANGx8ADRtrAA0bjwANG8cADRwbAA0cPwANHG8ADRyfAA0c1wANHQcADR1DAA0dZwANHYsADR2/AA0eBwANHicADR43AA0eVwANHpcADR6/AA0e3wANHzsADR9/AA0fmwANH78ADR/jAA0f+wANICcADSBPAA0gowANISMADSFjAA0hwwANIe8ADSIjAA0idwANIuMADSMfAA0jQwANI38ADSO3AA0kGwANJG8ADSS3AA0lHwANJV8ADSWfAA0l9wANJkcADSaLAA0m5wANJx8ADSdPAA0ngwANJ7MADSfnAA0oFwANKNMADSkPAA0pXwANKbMADSnLAA0qLwANKo8ADSrzAA0rPwANK3MADSu7AA0sCwANLF8ADS0rAA0tbwANLc8ADS5DAA0uewANLu8ADS9DAA0vlwANMC8ADTCDAA0wvwANMRsADTGLAA0x2wANMgcADTJPAA0yhwANMwsADTN/AA0z1wANNCcADTR3AA00rwANNRcADTVDAA01lwANQrMADUMLAA1QHwANUH8ADVCnAA1Q1wANUPsADVEnAA1RWwANUYMADVG7AA1SDwANUjsADVJjAA1SiwANUqsADVLTAA1S+wANU0sADVOPAA1TtwANU+sADVQ3AA1UawANVKMADVTzAA1VOwANVYsADVYHAA1WZwANVrMADVbzAA1XSwANV3cADVe3AA1X+wANWEMADVh7AA1YzwANWPMADVk/AA1ZbwANWZ8ADVnTAA1aAwANWj8ADVp/AA1amwANWusADVsPAA1bZwANW8sADVwPAA1cTwANXF8ADVyrAA1c9wANXSsADV2DAA1dvwANXdsADV43AA1eawANXpcADV6zAA1e1wANXvsADV8XAA1fTwANX1sADV+HAA1frwANYBsADWBHAA1g4wANYSMADWFrAA1hqwANYcsADWILAA1iYwANYnMADWKHAA1inwANYssADWLbAA1i/wANY0MADWN/AA1j4wANZFcADWS3AA1k3wANZU8ADWVfAA1lnwANZb8ADWYfAA1mjwANZqMADWbDAA1nRwANZ3sADWfXAA1oSwANaHcADWjjAA1pOwANaW8ADWm/AA1p4wANaicADWp7AA1q0wANaz8ADWufAA1r0wANa/8ADWwzAA1sZwANbMMADWzjAA1tLwANbWcADW27AA1tywANbjMADW7jAA1u+wANbwMADW83AA1vXwANb3MADW/bAA1v+wANcCMADXCTAA1w0wANcUsADXHvAA1yYwANcr8ADXL3AA1ziwANc8cADXQLAA10OwANdGsADXSLAA10rwANdNMADXUXAA12IwANdu8ADXfHAA14HwANeDcADXhnAA14mwANeKsADXjjAA15BwANeR8ADXk7AA15YwANeYMADXoXAA16UwANencADXrLAA17AwANeysADXt7AA17uwANfCsADXxfAA18qwANfMcADX03AA19iwANfdcADX6DAA1+ywANfxsADX9jAA1/uwANgBsADYB3AA2AmwANgOMADYEjAA2BVwANgZsADYHvAA2CPwANgmcADYJzAA2CjwANgr8ADYLPAA2DEwANg0MADYOnAA2D+wANhCsADYSfAA2EzwANhQMADYU3AA2FSwANhXcADYXnAA2GEwANhhsADYZPAA2GcwANhpsADYbXAA2HDwANh1MADYefAA2H0wANh/MADYh/AA2IuwANiPcADYkfAA2JhwANidsADYpjAA2KowANitcADYszAA2LgwANi9MADYv3AA2MJwANjG8ADYy7AA2M5wANjTsADY2DAA2NxwANjgsADY7TAA2PZwANkEMADZBTAA2QtwANkO8ADZEzAA2RowANkgcADZI/AA2SgwANkt8ADZMzAA2TqwANk9sADZRDAA2UgwANlMsADZUjAA2VqwANlgMADZaTAA2WqwANly8ADZeHAA2XwwANmAcADZiLAA2Y4wANmScADZnHAA2aZwANmvMADZsLAA2bPwANm2cADZu7AA2cQwANnJ8ADZzbAA2dJwANnXcADZ27AA2eLwANnkMADZ5rAA2fAwANnzMADZ93AA2gFwANoGMADaCvAA2gvwANoPsADaE/AA2hgwANob8ADaHzAA2iOwANolcADaJvAA2itwANoysADaOXAA2kEwANpE8ADaTTAA2lBwANpVMADaW3AA2l5wANpicADaZXAA2mlwANptsADacjAA2nXwANp7MADagbAA2oXwANqKsADajrAA2pOwANqVcADamvAA2qFwANql8ADaqjAA2q5wANqysADauPAA2r2wANrE8ADazPAA2tMwANrVMADa2PAA2uBwANrmMADa6nAA2u4wANr1MADa+HAA2vqwANr/MADbAvAA2wXwANsIsADbDDAA2xAwANsR8ADbE3AA2xXwANsX8ADbGrAA2x+wANsjMADbJzAA2yzwANsyMADbNLAA2zrwANs7sADbPbAA20HwANtE8ADbR7AA20vwANtOMADbULAA21HwANtS8ADbVHAA21awANtbMADbX3AA22NwANtlsADbZ7AA22mwANtssADbbjAA23GwANt0sADbezAA234wANuHcADbiTAA24wwANuRcADblLAA25hwANubcADbn3AA26GwANupsADbrbAA27UwANu5cADbvLAA27/wANvCsADbxrAA28vwANvVMADb13AA29pwANvd8ADb4XAA2+bwANvtsADb8vAA2/lwANv78ADb/7AA3AMwANwH8ADcDHAA3BHwANwYsADcH3AA3CdwANwwcADcNLAA3D7wANxBsADcRPAA3EgwANxMsADcUHAA3FHwANxWMADcWjAA3F+wANxmcADcaTAA3GzwANxw8ADcdfAA3HywANyCMADchjAA3IowANySMADcmDAA3J1wANylMADcqXAA3LJwANy18ADcuPAA3LwwANzA8ADcw3AA3McwANzNcADc0XAA3NjwANzesADc5HAA3ObwANzocADc73AA3PQwANz28ADc+LAA3PqwANz8cADc/zAA3QMwAN0IcADdDDAA3Q3wAN0UcADdGnAA3SGwAN0o8ADdMXAA3TYwAN08MADdQLAA3UZwAN1K8ADdULAA3VOwAN1ZsADdXXAA3WDwAN1oMADdb/AA3XjwAN2BMADdhjAA3Y+wAN2WsADdmfAA3Z3wAN2mMADdqfAA3azwAN2zcADdtvAA3bqwAN3BMADdxnAA3c4wAN3VsADd3nAA3eHwAN3msADd63AA3e+wAN31sADd/PAA3gLwAN4KMADeEXAA3hnwAN4f8ADeJzAA3iuwAN4wcADeNjAA3jqwAN498ADeRPAA3kowAN5QsADeWbAA3mPwAN5o8ADebzAA3ncwAN58cADef3AA3obwAN6KMADejnAA3pLwAN6W8ADemnAA3p+wAN6kMADeqfAA3q+wAN62MADeuzAA3r+wAN7CsADexHAA3skwAN7LsADe0DAA3tQwAN7YcADe2/AA3uCwAN7msADe6zAA3vLwAN74MADe/TAA3wNwAN8HcADfCzAA3xGwAN8VsADfHHAA3yCwAN8nMADfLbAA3zVwAN85sADfPbAA30FwAN9DsADfSHAA31BwAN9Y8ADfYrAA32uwAN9uMADfeHAA330wAN9+cADff/AA34XwAN+JMADfjbAA35DwAN+VcADfmjAA36AwAN+msADfrnAA37awAN+7MADfvzAA38RwAN/JMADf0TAA39UwAN/asADf37AA3+VwAN/s8ADf9PAA3/pwAN/+cADgAbAA4AUwAOAI8ADgDfAA4BJwAOAV8ADgGfAA4B4wAOAhcADgJHAA4CowAOAwMADgM/AA4DewAOBAMADgQjAA4EgwAOBPsADgU3AA4FpwAOBecADgYvAA4GSwAOBncADga3AA4G1wAOBvcADgdPAA4HnwAOCAcADghPAA4ImwAOCMcADgj7AA4JhwAOCZ8ADgoDAA4KNwAOCrMADgr7AA4LYwAOC8cADgvjAA4MCwAODG8ADgyfAA4MwwAODOsADg0zAA4NfwAODa8ADg3rAA4OUwAODoMADg7TAA4O+wAODysADg97AA4PxwAOEAMADhBHAA4QdwAOEKsADhDLAA4Q/wAOES8ADhFPAA4RgwAOEa8ADhHbAA4SQwAOEmMADhLDAA4TPwAOE4cADhO7AA4T9wAOFDsADhRvAA4UswAOFOcADhUjAA4VZwAOFYcADhWvAA4V0wAOFecADhYPAA4WTwAOFn8ADhazAA4W1wAOFwMADhcfAA4XXwAOF7MADhfbAA4YAwAOGDMADhhfAA4YjwAOGNMADhkXAA4ZNwAOGVcADhmDAA4ZxwAOGeMADhovAA4aiwAOGt8ADhsfAA4bXwAOG48ADhu/AA4cEwAOHI8ADhzbAA4dEwAOHT8ADh2PAA4dvwAOHhsADh5jAA4e1wAOHxMADh87AA4fawAOH6MADh/bAA4gIwAOIGsADiCDAA4gswAOIQMADiFPAA4hzwAOIg8ADiJnAA4iswAOIt8ADiMrAA4jZwAOI6cADiPjAA4kEwAOJIMADiTjAA4lZwAOJXsADiWXAA4lnwAOJacADiXbAA4mAwAOJlcADiaLAA4m5wAOJxMADidbAA4nmwAOJ8sADigjAA4obwAOKMsADikHAA4pOwAOKXsADim7AA4p8wAOKi8ADiqzAA4q7wAOKzMADitnAA4ruwAOK+cADiv/AA4sFwAOLF8ADiyTAA4sywAOLPMADi0/AA4tfwAOLcsADi4LAA4uQwAOLmMADi67AA4u7wAOLw8ADi83AA4vdwAOL8cADjA7AA4wiwAOMPsADjETAA4xQwAOMUsADjGPAA4x5wAOMiMADjI7AA4yZwAOMnsADjK7AA4y+wAOMxcADjNXAA4zowAOM7cADjQDAA40QwAONGcADjSLAA40rwAONRcADjUzAA41awAONXcADjX3AA42FwAONjsADjaTAA42twAONsMADjbjAA43UwAON5cADjfvAA44ewAOOMMADjkfAA45ZwAOOb8ADjoPAA46cwAOOrsADjr3AA47VwAOO+cADjx/AA48rwAOPOMADj07AA49fwAOPecADj4XAA4+MwAOPn8ADj6XAA4+wwAOPxMADj9PAA4/nwAOP+cADkAPAA5AJwAOQGcADkCzAA5A3wAOQSsADkFzAA5BlwAOQf8ADkIHAA5CGwAOQksADkKvAA5C2wAOQzcADkN7AA5DqwAOQ+8ADkQLAA5ELwAORE8ADkSvAA5FDwAORWcADkWrAA5F7wAORjcADkZXAA5GcwAORrMADkcPAA5HOwAOR1MADkezAA5H8wAOSGMADkibAA5I0wAOSQ8ADklbAA5JmwAOSdcADkoXAA5KWwAOSqMADkrfAA5LEwAOS5cADkvXAA5L8wAOTDcADkyHAA5MpwAOTOMADk0bAA5NYwAOTX8ADk27AA5N6wAOTjcADk53AA5OswAOTt8ADk8LAA5PPwAOT3MADk+XAA5PtwAOT+cADlALAA5QRwAOUGMADlCrAA5QzwAOUQsADlFTAA5RjwAOUccADlHzAA5SKwAOUlsADlJzAA5S7wAOUzsADlOLAA5TywAOU/sADlQTAA5UYwAOVI8ADlS3AA5U/wAOVScADlVrAA5VvwAOVhMADlZzAA5WqwAOVr8ADlbzAA5XJwAOV1sADle3AA5X/wAOWEMADliHAA5Y/wAOWWMADlnXAA5aBwAOWlsADlqbAA5bCwAOW3MADlu3AA5b+wAOXCcADlxzAA5cgwAOXPMADl07AA5dbwAOXb8ADl4nAA5eUwAOXqsADl7PAA5e9wAOX2cADl+bAA5fwwAOX98ADmA7AA5gYwAOYJMADmDLAA5g8wAOYRcADmE7AA5hXwAOYYMADmG7AA5h0wAOYicADmJPAA5iiwAOYrcADmL3AA5jHwAOY3MADmOXAA5jwwAOY+sADmQPAA5kMwAOZFsADmSDAA5k3wAOZP8ADmVfAA5lgwAOZcMADmXrAA5mMwAOZm8ADmaTAA5mtwAOZusADmcPAA5nSwAOZ4sADme/AA5n4wAOaCcADmhfAA5omwAOaQcADmlPAA5pkwAOagcADmovAA5qmwAOa5cADmwTAA5sPwAObLMADmz7AA5tPwAObXsADm2nAA5t4wAObgsADm5DAA5uawAObpsADm7fAA5vKwAOb1sADm+XAA5vzwAOcAsADnAzAA5wXwAOcJcADnDTAA5w6wAOcPsADnEjAA5xSwAOcXcADnGPAA5xowAOcb8ADnHnAA5yAwAOchcADnJHAA5yawAOco8ADnLvAA5zKwAOc2MADnPHAA50AwAOdG8ADnTfAA51HwAOdYMADnXPAA52HwAOdkcADnZ7AA52pwAOdtMADncHAA53NwAOd1sADneDAA53lwAOd7cADnfbAA54AwAOeDsADnhfAA54rwAOeNsADnkjAA55WwAOeX8ADnmLAA55swAOee8ADnoXAA56OwAOel8ADnpvAA56rwAOetsADnsXAA57PwAOe28ADnuLAA57rwAOe98ADnwXAA58cwAOfLsADnz3AA59HwAOfT8ADn1LAA59gwAOfacADn3TAA596wAOfhsADn43AA5+cwAOfpsADn7jAA5/FwAOf2cADn+jAA5/2wAOf/8ADoBbAA6AowAOgMsADoDzAA6BQwAOgYcADoHTAA6CAwAOgp8ADoLrAA6DUwAOg5sADoPrAA6ENwAOhHMADoSvAA6E5wAOhRsADoVrAA6FqwAOhecADoYzAA6GawAOhqcADobfAA6HOwAOh4cADofLAA6IHwAOiFsADoiTAA6I9wAOiUsADomHAA6J2wAOigMADoovAA6KZwAOirsADornAA6LRwAOi4MADovXAA6MPwAOjJcADo0DAA6NPwAOjZMADo37AA6OUwAOjr8ADo8HAA6PkwAOj+MADpAjAA6QZwAOkK8ADpDPAA6Q8wAOkR8ADpFzAA6RrwAOkfcADpIvAA6SbwAOkr8ADpL/AA6TNwAOk5sADpP3AA6UXwAOlN8ADpUnAA6VWwAOlYsADpW/AA6V5wAOlhsADpZHAA6WcwAOluMADpdbAA6XvwAOmBsADphbAA6YtwAOmQMADplHAA6ZnwAOmf8ADppHAA6aewAOmq8ADpsvAA6blwAOm/MADpw7AA6cawAOnK8ADpzvAA6dPwAOnY8ADp3TAA6eLwAOnp8ADp8LAA6fXwAOn58ADp/3AA6gSwAOoKcADqD/AA6hVwAOoasADqH/AA6iWwAOooMADqKvAA6i3wAOozsADqOnAA6j/wAOpEcADqSTAA6k3wAOpQsADqVTAA6lhwAOpfsADqZvAA6mtwAOpvsADqdPAA6nhwAOqBcADqiXAA6pFwAOqXsADqnHAA6qGwAOqlsADqqjAA6q6wAOqzMADquLAA6rywAOrCcADqx/AA6tAwAOrT8ADq1vAA6towAOrc8ADq4PAA6uPwAOrqMADq8LAA6vawAOr78ADrADAA6wRwAOsIcADrDfAA6xWwAOsZ8ADrHXAA6yLwAOsoMADrLbAA6zVwAOs+sADrRPAA60kwAOtNMADrU7AA61bwAOtasADrX7AA62NwAOtnsADra7AA63CwAOt2cADrffAA64TwAOuJMADrjbAA65HwAOuVsADrm7AA66FwAOupMADrr7AA67PwAOu2cADrujAA67+wAOvEcADrx7AA68uwAOvQcADr03AA69XwAOvYcADr27AA6+CwAOvlsADr63AA6+6wAOvw8ADr+DAA6/ywAOv9sADsATAA7AZwAOwKsADsDrAA7BOwAOwXcADsG3AA7B8wAOwlMADsLrAA7DgwAOw8sADsQLAA7EYwAOxM8ADsUrAA7FmwAOxdsADsYzAA7GnwAOxvsADsdrAA7HtwAOyBcADsiDAA7JBwAOyVMADsmLAA7JvwAOyfcADsojAA7KWwAOyosADsq7AA7LLwAOy6sADswTAA7McwAOzLcADs0XAA7NZwAOza8ADs4LAA7ObwAOzrsADs7zAA7PKwAOz5cADs/3AA7QPwAO0GsADtCjAA7Q5wAO0TcADtFrAA7RswAO0fcADtIrAA7ScwAO0rcADtMLAA7TXwAO06cADtP7AA7UWwAO1LsADtUvAA7VnwAO1fcADtZXAA7WgwAO1rMADtbnAA7XRwAO17cADtgTAA7YrwAO2RcADtlfAA7ZxwAO2jMADtqHAA7a5wAO2x8ADttXAA7brwAO2/cADtxDAA7cawAO3IsADtyrAA7c5wAO3ScADt23AA7d/wAO3hMADt4rAA7eVwAO3qcADt7PAA7e6wAO3xcADt9jAA7fowAO3/sADuA/AA7gZwAO4LMADuDjAA7hCwAO4W8ADuGjAA7iAwAO4iMADuI7AA7iawAO4pMADuLHAA7jJwAO43sADuPbAA7kFwAO5EMADuRzAA7kpwAO5QMADuVDAA7ldwAO5bcADuYDAA7mRwAO5mMADuanAA7m3wAO5zMADueTAA7oCwAO6GMADujHAA7o8wAO6RMADukvAA7pTwAO6WMADumDAA7pmwAO6bMADuoHAA7qYwAO6qsADurrAA7rFwAO618ADuuXAA7rxwAO7AsADuxXAA7siwAO7KsADuzLAA7tQwAO7ZMADu2rAA7tvwAO7f8ADu4bAA7uXwAO7qMADu7DAA7uywAO7vMADu8/AA7vfwAO75sADu/LAA7v6wAO8BcADvBHAA7wjwAO8PcADvEjAA7xPwAO8VsADvFzAA7xiwAO8c8ADvIjAA7yYwAO8q8ADvK7AA7yzwAO8wsADvMzAA7zUwAO83MADvOfAA7z0wAO9A8ADvRnAA70uwAO9QcADvVjAA71nwAO9e8ADvZLAA728wAO9xcADvdrAA73ywAO9+8ADvgTAA74awAO+I8ADvi3AA75JwAO+XcADvm3AA756wAO+hcADvpnAA76qwAO+t8ADvs7AA77gwAO+8sADvw7AA78ewAO/KcADvzfAA79QwAO/ZMADv3PAA7+LwAO/n8ADv6vAA7+7wAO/xsADv9nAA7/lwAO//8ADwBrAA8AkwAPANsADwEbAA8BXwAPAb8ADwILAA8CcwAPAssADwMbAA8DdwAPA88ADwQ3AA8EqwAPBT8ADwVzAA8FpwAPBgcADwZLAA8GtwAPBx8ADwdXAA8HiwAPB+MADwgLAA8IOwAPCFsADwh/AA8IrwAPCLsADwj/AA8JKwAPCWcADwmjAA8JywAPCf8ADwo/AA8KawAPCpsADwrnAA8LHwAPC4sADwuzAA8LzwAPC98ADwwfAA8MawAPDKMADwz3AA8NLwAPDWsADw2rAA8OKwAPDlsADw7TAA8PKwAPD+sADxA/AA8QnwAPEWMADxG/AA8SLwAPEq8ADxLbAA8TBwAPEz8ADxNjAA8TiwAPE+MADxQXAA8UTwAPFH8ADxSbAA8U1wAPFSsADxVnAA8VjwAPFe8ADxYHAA8WGwAPFkMADxaXAA8W0wAPFxMADxdjAA8X1wAPGAMADxhTAA8YqwAPGPsADxlrAA8ZswAPGl8ADxs7AA8blwAPG/cADxxfAA8cmwAPHOsADx0LAA8dLwAPHXcADx2TAA8dtwAPHfsADx4nAA8eYwAPHrsADx7/AA8fJwAPH1cADx+HAA8f7wAPIEsADyBrAA8giwAPIK8ADyDvAA8hGwAPITcADyFTAA8huwAPIgMADyITAA8iOwAPIkMADyJTAA8ibwAPIqMADyLPAA8i5wAPIxMADyNTAA8jcwAPI6MADyPHAA8kEwAPJCMADyRPAA8kWwAPJIsADyUTAA8lRwAPJU8ADyWTAA8lwwAPJgcADyZHAA8mfwAPJrsADyb7AA8nKwAPJ08ADydfAA8ncwAPJ5MADyezAA8n2wAPKAMADygfAA8oOwAPKF8ADyiPAA8ozwAPKPMADykrAA8pYwAPKaMADynPAA8p/wAPKjMADyprAA8qqwAPKusADysjAA8rUwAPK4cADyvXAA8sEwAPLD8ADyx7AA8suwAPLQMADy0vAA8tXwAPLZcADy3/AA8uRwAPLmcADy6HAA8urwAPLtsADy73AA8vJwAPL1sADy+XAA8v0wAPMAcADzA7AA8wdwAPMJsADzDfAA8xDwAPMS8ADzFjAA8xmwAPMdsADzITAA8ySwAPMo8ADzK/AA8zBwAPM1MADzOfAA8z8wAPNC8ADzSjAA802wAPNQsADzWnAA82EwAPNnMADzarAA82zwAPNxcADzdrAA83owAPN+sADzgbAA84PwAPOHMADzijAA842wAPORMADzlnAA85mwAPObcADznzAA86NwAPOlsADzqTAA866wAPOzcADzubAA877wAPPD8ADzxvAA88iwAPPKcADzzHAA89SwAPPXsADz2zAA897wAPPhsADz5HAA8+awAPPr8ADz8PAA8/bwAPP+sADz//AA9ATwAPQKsAD0DfAA9BGwAPQU8AD0GLAA9BrwAPQf8AD0InAA9CQwAPQm8AD0KLAA9CowAPQtMAD0MHAA9DSwAPQ28AD0OzAA9DxwAPRAMAD0Q7AA9EgwAPRMcAD0UDAA9FQwAPRVsAD0WjAA9FxwAPRfsAD0YrAA9GUwAPRn8AD0a7AA9G/wAPRyMAD0dPAA9HbwAPR/8AD0gbAA9ITwAPSJMAD0i7AA9JCwAPSWMAD0m/AA9J9wAPSjcAD0p/AA9KqwAPSwcAD0s3AA9LZwAPS58AD0u7AA9MBwAPTDsAD0xfAA9MlwAPTN8AD00PAA9NQwAPTW8AD02TAA9NzwAPTgMAD04zAA9OawAPTo8AD06nAA9OywAPTwMAD08bAA9PWwAPT4sAD0+zAA9PwwAPT/cAD1A7AA9QhwAPUL8AD1DjAA9Q8wAPUQcAD1EnAA9RQwAPUWsAD1F3AA9RkwAPUdcAD1IPAA9SPwAPUmcAD1K/AA9TDwAPUzMAD1O/AA9UfwAPVKcAD1WTAA9V0wAPVfcAD1Y3AA9WRwAPVmsAD1aHAA9WswAPVtcAD1bzAA9XHwAPV1MAD1d7AA9XswAPV/cAD1hDAA9YewAPWLsAD1kHAA9ZTwAPWZMAD1nLAA9aFwAPWksAD1prAA9ajwAPWq8AD1rHAA9a+wAPWysAD1tHAA9bawAPW5cAD1u7AA9b7wAPXDcAD1xzAA9cnwAPXNcAD10fAA9dQwAPXWsAD12TAA9d0wAPXhcAD15rAA9efwAPXscAD18TAA9fWwAPX3sAD1+nAA9f1wAPYB8AD2BbAA9gjwAPYLMAD2D/AA9hSwAPYZ8AD2HjAA9h6wAPYicAD2JjAA9ijwAPYrcAD2LbAA9jDwAPYysAD2NXAA9jnwAPY8sAD2QvAA9kSwAPZPsAD2U/AA9lqwAPZe8AD2YfAA9mXwAPZr8AD2bfAA9nCwAPZ28AD2fPAA9oOwAPaJsAD2jnAA9pNwAPaWMAD2mTAA9pxwAPafsAD2orAA9qZwAPao8AD2rPAA9rBwAPa0sAD2uTAA9rvwAPbB8AD2yLAA9sqwAPbOMAD20jAA9tVwAPbZcAD23PAA9t5wAPbjMAD26DAA9u5wAPbycAD29bAA9vvwAPb/cAD3BDAA9wWwAPcKMAD3C7AA9w9wAPcS8AD3GTAA9x6wAPcjMAD3J3AA9yvwAPcwsAD3M7AA9zfwAPc78AD3Q7AA90dwAPdLsAD3TbAA91HwAPdXsAD3WXAA91ywAPde8AD3YvAA92rwAPds8AD3cHAA93vwAPd+8AD3hTAA94kwAPeM8AD3kzAA95awAPecsAD3oLAA96LwAPensAD3rXAA97PwAPe8MAD3wzAA98dwAPfM8AD30bAA99UwAPfZcAD333AA9+RwAPfp8AD37zAA9/IwAPf58AD3/jAA+AFwAPgIsAD4DTAA+BHwAPgX8AD4HrAA+CVwAPgqcAD4L/AA+DPwAPg+cAD4QvAA+EowAPhPsAD4UrAA+FOwAPhU8AD4VjAA+FpwAPhe8AD4YbAA+GRwAPhncAD4arAA+G2wAPhzMAD4dnAA+HswAPh98AD4gfAA+IUwAPiHsAD4ijAA+I3wAPiRMAD4lDAA+JcwAPiZcAD4nnAA+KIwAPim8AD4q3AA+LAwAPi1cAD4unAA+L+wAPjCsAD4xvAA+MmwAPjMcAD4z3AA+NNwAPjX8AD42vAA+NywAPjf8AD44zAA+OSwAPjo8AD47XAA+PFwAPj2cAD4+XAA+P2wAPkBMAD5BbAA+QdwAPkLsAD5DvAA+REwAPkTMAD5FTAA+RlwAPkfMAD5IvAA+STwAPkocAD5KnAA+S3wAPkwMAD5M/AA+TXwAPk5cAD5PbAA+UBwAPlDMAD5SvAA+U2wAPlSsAD5VfAA+VlwAPldsAD5Y3AA+WfwAPlrcAD5b7AA+XMwAPl2cAD5ejAA+X0wAPmCcAD5hHAA+YmwAPmPsAD5lDAA+ZewAPmbMAD5n3AA+aOwAPmosAD5rLAA+bGwAPm18AD5ubAA+b/wAPnK8AD5zPAA+c5wAPnPcAD50/AA+dnwAPnf8AD543AA+eswAPnyMAD59zA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BANrwAQDfsAEA43ABAOfwAQDr8AEA77ABAPLwAQD7MAEA/XABAP/wAQEB8AEBBbABAQhwAQEXcAEBGfABAR4wAQEjcAEBJ7ABATFwAQE0MAEBPHABAUHwAQFM8AEBTfABAVRwAQFW8AEBW3ABAWEwAQFlMAEBaTABAWxwAQFt8AEBc/ABAXgwAQF8cAEBfzABAYPwAQGMMAEBk7ABAZcwAQGdcAEBofABAaewAQGssAEBsXABAbUwAQG7cAEBwPABAcJwAQHIcAEBybABAdFwAQHXMAEB3zABAe2wAQH08AECArABAggwAQIUcAECGHABAiUwAQIqsAECNfABAjxwAQJAcAECTTABAk+wAQJZ8AECXnABAmLwAQJmcAECcbABAnWwAQJ58AECe7ABAoBwAQKA8AECgnABAoTwAQKJMAECivABApAwAQKR8AEClXABApiwAQKeMAECpvABAqwwAQKuMAECs7ABArwwAQLAMAECw7ABAsfwAQLLMAECzXABAtEwAQLUcAEC2HABAttwAQLf8AEC5TABAupwAQLscAEC8PABAvVwAQL6cAEC/jABAwUwAQMIsAEDDXABAxMwAQMXMAEDH3ABAyFwAQMmMAEDKXABAy/wAQMzsAEDNXABAzqwAQM98AEDQfABA0ZwAQNI8AEDS3ABA04wAQNRMAEDWHABA15wAQNiMAEDZzABA27wAQN08AEDefABA3zwAQOC8AEDhnABA4nwAQOPsAEDlHABA5owAQOfcAEDpnABA6+wAQO1cAEDujABA74wAQPBcAEDxvABA8nwAQPP8AED1fABA95wAQPjsAED5nABA+wwAQPx8AED+jABA/0wAQQBcAEECbABBBAwAQQUcAEEGbABBCOwAQQnsAEELXABBDJwAQQ5MAEEPPABBEHwAQRL8AEEULABBFUwAQRYcAEEWjABBFxwAQResAEEY3ABBGcwAQRtcAEEdTABBHlwAQR8MAEEibABBI1wAQSRcAEElfABBJpwAQSe8AEEojABBKVwAQSscAEErnABBLOwAQS3sAEEurABBL7wAQTCMAEEyTABBMywAQTO8AEE0rABBNiwAQTc8AEE4rABBObwAQTpsAEE7vABBPMwAQT3cAEE/fABBQFwAQUG8AEFCnABBRJwAQUWsAEFGTABBR6wAQUh8AEFJ/ABBSzwAQUw8AEFNTABBTgwAQU7MAEFQbABBUfwAQVSMAEFV3ABBVvwAQVhMAEFZvABBWpwAQVt8AEFcTABBXXwAQV68AEFgLABBYbwAQWLMAEFkDABBZKwAQWW8AEFm7ABBaDwAQWlMAEFqbABBa4wAQW0cAEFuDABBb1wAQW/8AEFyHABBcuwAQXRcAEF1vABBdowAQXdsAEF4XABBeXwAQXpMAEF7LABBe4wAQXvcAEF8vABBfbwAQX4cAEF+rABBfwwAQX88AEF/vABBgAwAQYC8AEGBzABBgpwAQYM8AEGEDABBhOwAQYXsAEGG7ABBiAwAQYicAEGJnABBirwAQYtMAEGNfABBj8wAQZCsAEGRnABBkuwAQZUMAEGVzABBl8wAQZhsAEGarABBm1wAQZvcAEGcXABBnNwAQZ18AEGeLABBntwAQZ98AEGgLABBoOwAQaHsAEGijABBo1wAQaQMAEGk7ABBpZwAQaYsAEGm7ABBp7wAQaiMAEGpjABBqmwAQar8AEGrvABBrMwAQa2cAEGuDABBrqwAQa+sAEGwrABBscwAQbNMAEG0zABBtkwAQbdcAEG4XABBufwAQbt8AEG77ABBvTwAQb4cAEG/DABBv5wAQcB8AEHBfABBwkwAQcMcAEHEDABBxPwAQcXMAEHGfABBx+wAQckcAEHJnABBytwAQcwcAEHMnABBzXwAQc4sAEHPDABBz/wAQdCsAEHRrABB0rwAQdOcAEHUbABB1RwAQdWsAEHW7ABB2DwAQdi8AEHZ7ABB2swAQdtsAEHcrABB3jwAQd+sAEHgfABB4ZwAQeHsAEHi3ABB48wAQeUsAEHljABB5rwAQed8AEHofABB6bwAQepsAEHqzABB67wAQezMAEHtzABB71wAQfBsAEHxLABB8YwAQfK8AEHzbABB8+wAQfU8AEH2LABB9swAQfdcAEH4jABB+PwAQfncAEH7XABB/GwAQf18AEH/DABB//wAQgDsAEICTABCA0wAQgQMAEIEzABCBhwAQgdsAEIH/ABCCNwAQgnMAEIKXABCCvwAQgtsAEIMLABCDXwAQg6MAEIPjABCEDwAQhFcAEISzABCE8wAQhUsAEIWLABCFywAQhgcAEIYvABCGUwAQhpMAEIazABCG5wAQhzMAEIdzABCHswAQh8sAEIgPABCIJwAQiJMAEIjLABCI4wAQiQ8AEIk3A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BEenwARHy8AER9zABEfnwARH9sAESATABEgNwARIIcAESCvABEg0wARIQsAESFjABEh0wARIf8AESKDABEitwARIy8AESOLABEjwwARI/cAESQXABEkXwARJKcAESUDABElWwARJbMAESYXABEmhwARJvcAESd3ABEnvwARKAsAESh/ABEonwARKMsAESjzABEpEwARKUMAESlXABEphwARKbMAESnXABEqCwARKlMAESqPABEqvwARKusAESsPABErQwARK2cAESvHABEr/wARLDsAESxfABEslwARLMcAES0fABEtewARLbMAES3nABEuIwARLmMAES6XABEu2wARLw8AES9HABEvgwARL6sAES/rABEwKwARMD8AETCDABEwhwARMNMAETFjABEyFwARM18AETTLABE2MwARNs8AETc7ABE3mwARN/cAEThLABE4pwAROQ8AETlvABE51wAROjMAETqPABE69wARO1cAETu/ABE8zwARPRMAET1rABE9uwARPhMAET67ABE/FwARP7MAEUDnABFBMwARQbcAEUK7ABFEXwARRacAEUcbABFIKwARSTcAEUnzABFLbwARTSsAEU2LABFOpwARUCsAEVFHABFRxwARUi8AEVNrABFUHwARVUMAEVXLABFW5wARV38AEVh/ABFZrwARW8cAEVxHABFcvwARXT8AEV5HABFfcwARYE8AEWErABFhuwARYkMAEWK3ABFjDwARY3MAEWOLABFj/wARZA8AEWR7ABFkzwARZX8AEWWrABFmMwARZrsAEWbnABFnbwARZ+MAEWgHABFohwARaQMAEWkXABFphwARaasAEWorABFqkwARauMAEWuPABFrnwARbAsAEWxzABFsfwARbOcAEW1TABFtxwARbiMAEW7bABFvDwARb58AEXATABFwIwARcI8AEXCjABFxEwARcUsAEXHfABFyLwARctsAEXMXABFzrwARdCMAEXRXABF05wARdRcAEXVrABF1hwARdiMAEXbnABF3WwARd4MAEXevABF4GwAReEcAEXifABF4wwAReO8AEXlDABF5YwAReYsAEXnrABF6FwAReksAEXqrABF61wARewsAEXtjABF7hwARe58AEXv3ABF8HwARfEMAEXxnABF8bwARfMMAEXzjABF9BwARfVsAEX17ABF9nwARfccAEX3PABF+CwARfn8AEX6/ABF/AwARfzcAEX9vABF/nwARf+sAEYA3ABGAjwARgSMAEYFvABGBnwARgesAEYIbABGCXwARgn8AEYLXABGC+wARgyMAEYOXABGD1wARhDsAEYSbABGExwARhPcAEYVPABGFywARhfMAEYZDABGGXwARhoMAEYa/ABGG5wARhxsAEYdbABGHewARh9cAEYgPABGIQwARiIMAEYj/ABGJRwARiZ8AEYnfABGKRwARiosAEYrrABGLIwARi8sAEYwPABGMOwARjGsAEYx7ABGMlwARjLsAEYzjABGNEwARjTMAEY1nABGNiwARjZ8AEY23ABGN6wARjiMAEY63ABGPIwARj1sAEY+XABGP8wARkBsAEZA/ABGQbwARkOcAEZErABGRiwARkf8AEZIbABGSOwARknsAEZLTABGS6wARkwcAEZM/ABGTYwARk4sAEZOrABGTzwARlDsAEZR3ABGUuwARlQ8AEZVnABGVjwARlbsAEZX7ABGWfwARluMAEZd3ABGX1wARmD8AEZh3ABGYuwARmQsAEZlnABGZswARmkMAEZqfABGbAwARm58AEZwHABGcdwARnNcAEZz7ABGdJwARnWcAEZ2TABGeDwARnn8AEZ7XABGfOwARn0cAEZ+DABGfvwARoAcAEaAXABGgLwARoE8AEaB7ABGgowARoL8AEaDLABGg1wARoOsAEaFXABGhlwARof8AEaJzABGivwARovsAEaM/ABGjbwARo6cAEaPDABGj8wARpAsAEaRfABGkjwARpN8AEaUHABGlIwARpVsAEaVzABGliwARpecAEaY7ABGmYwARpocAEabPABGnFwARp0cAEafnABGoAwARqHsAEajDABGo6wARqeMAEaojABGqSwARqucAEasHABGrNwARq6sAEavrABGsIwARrHsAEayzABGsxwARrQsAEa1PABGtmwARrecAEa4jABGuYwARrp8AEa73ABGvKwARr0cAEa97ABGvqwARr/sAEbBfABGw1wARsOsAEbD/ABGxFwARsWcAEbF/ABGxpwARsc8AEbIXABGyewARsrcAEbLzABGzPwARs2MAEbPHABGz9wARtBsAEbRHABG0cwARtJcAEbTrABG1GwARtUsAEbWDABG1swARteMAEbYjABG2XwARtp8AEbbbABG3DwARt0MAEbdzABG3rwARt+MAEbgzABG4ewARuOcAEbkDABG5FwARuTMAEblfABG5iwARubMAEbnHABG57wARuhcAEbpDABG6VwARumsAEbqvABG68wARuzsAEbujABG73wARu+sAEbwfABG8TwARvGsAEbx7ABG83wARvQsAEb0vABG9fwARvc8AEb4fABG+awARvrsAEb7bABG/DwARwB8AEcBLABHAnwARwQsAEcGLABHB+wARwmcAEcKHABHCrwARwrMAEcLvABHDAwARwxcAEcNLABHDXwARw3MAEcOHABHDpwARw78AEcPXABHD6wARxF8AEcSTABHExwARxQsAEcVXABHFfwARxbsAEcYPABHGQwARxqMAEccbABHHZwARx6cAEcgPABHIPwARyK8AEcj3ABHJPwARyWMAEcmLABHJwwARydMAEcnzABHKLwARylsAEcqHABHK3wARywsAEcs/ABHLowARzAcAEcxLABHMlwARzMsAEc0LABHNgwARzbcAEc4DABHOTwARzpsAEc73ABHPVwARz7MAEdATABHQYwAR0LsAEdEjABHRXwAR0YsAEdG3ABHR7wAR0lcAEdL7ABHTTwAR098AEdP3ABHUjwAR1ScAEdWDABHV9wAR1lMAEdbPABHW7wAR1ysAEdefABHXuwAR1+8AEdhjABHYowAR2OcAEdk7ABHZewAR2b8AEdoHABHaOwAR2nMAEdrjABHbMwAR218AEduzABHb3wAR3CcAEdxzABHcywAR3NMAEdzbABHdIwAR3W8AEd3LABHeKwAR3ksAEd5vABHeqwAR3tcAEd8HABHfMwAR33cAEd+3ABHgFwAR4GsAEeCzABHg+wAR4U8AEeGrABHh1wAR4g8AEeJjABHixwAR4ucAEeMvABHjYwAR458AEePfABHkOwAR5GcAEeR7ABHkswAR5PcAEeU3ABHlXwAR5Z8AEeXDABHmAwAR5msAEeavABHm6wAR50MAEefPABHoIwAR6HcAEeibABHpLwAR6X8AEenPABHqVwAR6t8AEesbABHrSwAR63MAEeuPABHr2wAR7F8AEeybABHtMwAR7b8AEe4XABHuUwAR7r8AEe83ABHvmwAR78MAEe/fABHwEwAR8EcAEfBvABHwlwAR8OMAEfELABHxVwAR8aMAEfHPABHyRwAR8qcAEfLnABHzPwAR828AEfPPABH0CwAR9GcAEfSfABH03wAR9SMAEfXDABH19wAR9ksAEfavABH3NwAR93MAEfebABH3zwAR+E8AEfjDABH42wAR+RsAEflfABH5dwAR+cMAEfn7ABH6LwAR+lMAEfrHABH7MwAR+3cAEfvXABH8WwAR/MMAEf1rABH97wAR/lcAEf7rABH/cwAR/+MAEgBPABIA5wASAWMAEgHPABICRwASAqsAEgMzABIDowASBBsAEgRjABIEtwASBScAEgWfABIF8wASBkcAEgaLABIGtwASBvcAEgcjABIHhwASCAcAEgijABII7wASCTcAEgm3ABIKMwASCs8AEgt/ABIL/wASDKsAEg1LABIN5wASDm8AEg8fABIPswASEDcAEhDHABIROwASEZ8AEhIbABISuwASEzsAEhOzABIUHwASFG8AEhSbABIU+wASFUsAEhVzABIV1wASFkMAEhbDABIXSwASF68AEhgXABIYfwASGRcAEhm7ABIaPwASGrsAEhrzABIbZwASG5cAEhv3ABIcMwASHGMAEhzPABIdNwASHaMAEh3vABIeGwASHlcAEh6TABIeywASHvsAEh8bABIfbwASH4MAEh/LABIf7wASIEcAEiBnABIguwASIM8AEiEXABIhLwASIXsAEiGHABIhxwASIecAEiIzABIiVwASIosAEiLnABIjZwASI5sAEiO3ABIj1wASJCcAEiRDABIkrwASJSMAEiVPABIlfwASJZcAEiXHABIl9wASJkMAEiaLABImxwASJucAEicXABInRwASJ2sAEieLABInowASJ+cAEigPABIoPwASKF8AEihzABIoowASKMMAEikfABIpdwASKa8AEinzABIqIwASKlsAEip/ABIqtwASKusAEisvABIriwASK68AEivzABIsTwASLHMAEizTABItVwASLbMAEi4LABIuWwASLtsAEi8rABIvcwASL88AEjAbABIwbwASMNsAEjEnABIxkwASMdMAEjIXABIycwASMsMAEjLvABIzBwASMzcAEjNvABIz0wASNDsAEjSvABI0/wASNTMAEjV7ABI1rwASNgMAEjYvABI2awASNssAEjc/ABI3swASOAcAEjhvABI4jwASOJcAEjjDABI44wASORcAEjlbABI5qwASOdcAEjnzABI6IwASOkMAEjqTABI6zwASOwcAEjtDABI7gwASO6MAEjvLABI73wASPDMAEjxjABI8lwASPNcAEj0TABI9UwASPasAEj4jABI+cwASPrMAEj7zABI/JwASP1sAEj+DABI/rwASP+8AEkAPABJAZwASQPMAEkELABJBLwASQXsAEkHLABJB/wASQjsAEkJrABJCrwASQtsAEkMTABJDTwASQ4cAEkOrABJDwwASQ/MAEkRHABJEewASRPsAEkVTABJFdwASRccAEkYLABJGVwASRu8AEkdDABJHawASR7sAEkfzABJINwASSHMAEkijABJI4wASSRsAEklvABJJiwASSe8AEkonABJKRwASSnsAEkqnABJLCwASS08AEkuPABJLzwASTBcAEkyLABJM1wASTRsAEk1PABJNiwASTcMAEk43ABJOkwASTyMAEk97ABJPnwAST/cAElBLABJQbwASUKcAElDjABJRNwASUY8AElH7ABJSNwASUo8AElK3ABJS3wASUxcAElN7ABJT3wASVA8AElRrABJUiwASVPsAElVTABJVqwASVh8AElZ7ABJWowASVrMAElcLABJXbwASV8cAElf7ABJYIwASWFMAElinABJY1wASWP8AElk7ABJZhwASWbMAEln3ABJaCwASWl8AElprABJawwASWw8AEltPABJbrwASW/sAElwbABJcRwASXJcAElzPABJdGwASXWsAEl2fABJd4wASXjcAEl6LABJemwASXssAEl73ABJfHwASX2MAEl+nABJf9wASYE8AEmBzABJgkwASYPcAEmFHABJhtwASYesAEmIrABJiUwASYn8AEmK/ABJi6wASYx8AEmOLABJjtwASY/MAEmQDABJkQwASZHMAEmSbABJk1wASZPsAEmUvABJldwASZbcAEmXfABJmHwASZmcAEmabABJmrwASZyMAEmdrABJnlwASZ7MAEmfjABJoHwASaE8AEmhnABJoywASaPsAEmlHABJphwASaa8AEmnjABJqCwASakcAEmqjABJqxwASax8AEmuPABJrtwASa/8AEmwzABJshwASbMMAEm0LABJtbwASba8AEm3TABJuCwASbicAEm5LABJuawASbosAEm7HABJu8wASb0sAEm+TABJv3wAScC8AEnBbABJwxwAScRsAEnFvABJxuwASchsAEnJjABJywwAScucAEnNLABJzpwASc/cAEnRHABJ0ZwASdM8AEnU3ABJ1hwASdasAEnXrABJ2FwASdmMAEnabABJ22wASdz8AEnePABJ35wASeIMAEnkLABJ5ewASehcAEnqbABJ7SwASe+MAEnwrABJ8UwASfHcAEnyrABJ8/wASfUMAEn17ABJ9mwASfeMAEn47ABJ+jwASfx8AEn9fABJ/iwASf7MAEn/vABKANwASgHMAEoCTABKA9wASgTcAEoFnABKBmwASgeMAEoIfABKCawASgpMAEoK3ABKC+wASgycAEoNXABKDhwASg7MAEoPDABKD7wAShCsAEoRPABKEiwAShLMAEoUHABKFLwAShVsAEoWXABKFxwAShgMAEoZHABKGcwAShp8AEobrABKHHwASh1MAEoeXABKHwwASh+sAEog/ABKIewASiJsAEojjABKJIwASiUcAEomDABKJtwASigsAEopfABKK0wASiuMAEot/ABKLpwASi9cAEow7ABKMXwASjJsAEo0TABKNVwASjaMAEo4PABKOSwASjn8AEo63ABKO+wASjycAEo9nABKPjwASj8MAEpADABKQDwASkDcAEpBfABKQjwASkMMAEpD3ABKRXwASkX8AEpGjABKSIwASkoMAEpK7ABKS8wASk0cAEpNvABKTqwASk/sAEpRDABKUbwASlKsAEpTnABKVBwASlSsAEpWXABKV9wASlnsAEpb3ABKXZwASmA8AEpivABKZQwASmZsAEpoHABKaWwASmt8AEptLABKbnwASm+sAEpwrABKcTwASnIcAEpyrABKc6wASnSMAEp1PABKdjwASnbMAEp3jABKd9wASnh8AEp5bABKeiwASnr8AEp8DABKfOwASn2cAEp+jABKfywASn/MAEqArABKgVwASoKcAEqDHABKg9wASoVMAEqGXABKh3wASoiMAEqKPABKi4wASoycAEqO7ABKkNwASpIcAEqUfABKlnwASpfsAEqZLABKmcwASppsAEqbnABKnHwASp3MAEqe7ABKn8wASqEMAEqiHABKpAwASqT8AEql/ABKpswASqfsAEqovABKqcwASqucAEqtPABKrtwASq/8AEqxHABKslwASrOsAEq0rABKtUwASrXcAEq3HABKt6wASrg8AEq5nABKukwASrtMAEq8HABKvRwASr3sAEq/jABKwMwASsIMAErDXABKxEwASsV8AErGTABKxzwASsf8AErIzABKyYwASstcAErNHABKzfwASs9sAErQfABK0bwAStLMAErTrABK1JwAStY8AErX7ABK2WwAStq8AErb7ABK3HwASt08AErePABK3uwASuAsAErhTABK4jwASuN8AErkHABK5QwASuWcAErmzABK58wASug8AEronABK6bwASurcAErrvABK7IwASu1MAErt/ABK7nwASu7MAErvfABK78wASvEcAErxvABK8uwASvQcAEr03ABK9dwASvbcAEr3/ABK+LwASvnMAEr6rABK++wASvzMAEr9fABK/kwASv7cAEr/fABLAFwASwFMAEsCXABLA2wASwQMAEsE7ABLBewASwasAEsHnABLCIwASwksAEsKbABLCwwASwv8AEsNDABLDgwASw68AEsPjABLEGwASxF8AEsSXABLE3wASxRMAEsVLABLFbwASxZsAEsXLABLF6wASxgcAEsZbABLGlwASxrsAEscLABLHLwASx18AEseTABLHuwASyFMAEsiLABLIqwASyMcAEskjABLJXwASyaMAEsnPABLJ/wASyhsAEspbABLKnwASyssAEssPABLLdwASy7MAEsvrABLMKwASzF8AEsyzABLM7wASzV8AEs2vABLOBwASzncAEs7fABLPQwASz38AEs/rABLQQwAS0HsAEtC7ABLQ4wAS0UcAEtGDABLR4wAS0g8AEtJTABLSkwAS0scAEtMTABLTYwAS05sAEtPXABLT/wAS1CMAEtRLABLUfwAS1KsAEtTjABLVXwAS1aMAEtW7ABLV4wAS1kMAEtZfABLWiwAS1ssAEtcfABLXiwAS19MAEtfvABLYFwAS2C8AEthHABLYcwAS2KcAEtjTABLZDwAS2VsAEtmvABLZ8wAS2k8AEtqbABLa6wAS20MAEtt7ABLbswAS29MAEtvzABLcEwAS3CMAEtwvABLcUwAS3I8AEtzLABLdHwAS3WMAEt2rABLd+wAS3i8AEt5jABLeewAS3psAEt8LABLfLwAS35cAEt/PABLgSwAS4H8AEuDDABLg2wAS4PMAEuELABLhiwAS4ecAEuIHABLiLwAS4mcAEuLLABLjNwAS418AEuODABLjxwAS5AcAEuRLABLkfwAS5L8AEuUDABLlJwAS5VcAEuWDABLluwAS5hcAEuZbABLmzwAS5wcAEudbABLnqwAS5/8AEuhHABLogwAS6K8AEui/ABLo3wAS6P8AEukbABLpVwAS6Y8AEunLABLqRwAS6m8AEuqXABLqrwAS6vMAEusrABLrawAS66MAEuvjABLsGwAS7D8AEuybABLsqwAS7PMAEu1HABLtuwAS7hcAEu5fABLukwAS7tsAEu9PABLvewAS78cAEvArABLwYwAS8KsAEvD3ABLxPwAS8X8AEvG/ABLx9wAS8hsAEvI/ABLycwAS8sMAEvMbABLzZwAS85MAEvPnABL0UwAS9J8AEvS/ABL1VwAS9c8AEvYDABL2dwAS9scAEvc7ABL3kwAS99cAEvg3ABL4cwAS+I8AEvi7ABL45wAS+R8AEvlXABL5pwAS+csAEvn3ABL6LwAS+n8AEvrLABL7GwAS+1MAEvufABL7xwAS/AcAEvwvABL8TwAS/J8AEvzTABL9EwAS/UcAEv1vABL9iwAS/eMAEv4nABL+RwAS/rsAEv8bABL/ZwAS/7cAEv/rABMAUwATAMMAEwDfABMBAwATAS8AEwFTABMBawATAesAEwJTABMClwATAsMAEwMXABMDUwATBDsAEwULABMFOwATBWsAEwWDABMFrwATBc8AEwZjABMGjwATBwsAEwdfABMHmwATB/cAEwg7ABMImwATCOMAEwkzABMJawATCa8AEwnnABMKGwATCk8AEwqDABMKuwATCucAEwsrABMLSwATC4MAEwunABML/wATDEMAEwyTABMMywATDQMAEw07ABMNewATDbcAEw3fABMOIwATDkcAEw5rABMOowATDusAEw8nABMPbwATD6sAEw/bABMQPwATEIsAExDbABMREwATES8AExFbABMRawATEYcAExGzABMRwwATEfsAExInABMSbwATEqsAExLPABMS/wATEycAExNLABMTfwATE7cAExPjABMULwATFFMAExSHABMUowATFLMAExTzABMVKwATFV8AExXTABMWNwATFpcAExbfABMXWwATF78AExg7ABMYnwATGMMAExjrABMZMwATGZcAExnbABMaOwATGmcAExqzABMa5wATGzsAExtrABMbvwATG/MAExxHABMckwATHNMAEx0fABMdXwATHasAEx3rABMeBwATHjMAEx5DABMehwATHqsAEx8LABMfOwATH38AEx/TABMgCwATIGMAEyCnABMg9wATIUcAEyGbABMh5wATIkMAEyKTABMiwwATIwsAEyM3ABMjVwATI5cAEyPPABMkEwATJHcAEyTXABMlKwATJVMAEyWfABMluwATJgMAEyaHABMmywATJv8AEydDABMngwATJ58AEye/ABMn4wATKBMAEyhbABMonwATKNMAEykDABMpEwATKV8AEymjABMp0wATKlcAEyq/ABMrJwATK5cAEyvTABMsKwATLIsAEyzrABMtMwATLWsAEy2fABMt7wATLhcAEy5nABMujwATLt8AEy8rABMvXwATL3sAEy+vABMwEwATMFMAEzB/ABMwnwATMNcAEzErABMxfwATMaMAEzH7ABMyLwATMn8AEzKTABMynwATMuMAEzMrABMzUwATM4cAEzPLABMz9wATNDsAEzSXABM0twATNNMAEzTfABM06wATNS8AEzXfABM2fwATNyMAEzfPABM4RwATOFcAEzjPABM5TwATOc8AEzp/ABM7HwATO8MAEzxvABM8twATPR8AEz1PABM9ewATPacAEz3LABM9+wATPksAEz6bABM+5wATPx8AEz93ABM/rwATP/cAE0BPABNA2wATQPcAE0E3ABNBiwATQd8AE0IjABNCYwATQq8AE0MLABNDTwATQ4MAE0PXABNENwATRHMAE0SrABNFHwATRacAE0XrABNGpwATRusAE0enABNH4wATSCMAE0iDABNIuwATSOMAE0kvABNJgwATSc8AE0n3ABNKPwATSmMAE0qPABNKswATSyMAE0tHABNLkwATS8cAE0wTABNMUwATTH8AE0yrABNM0wATTPMAE00fABNNcwATTacAE03nABNOMwATTl8AE06nABNO9wATT0sAE0+LABNP0wATUAsAE1A3ABNQgwATUMcAE1EfABNRawATUa8AE1HLABNSEwATUlMAE1J/ABNSvwATUzMAE1NPABNThwATU6cAE1O7ABNTzwATVBsAE1RXABNUnwATVOsAE1UTABNVSwATVYcAE1ZzABNW2wATVwsAE1cTABNXGwATVyMAE1dfABNXpwATV78AE1gLABNYiwATWKsAE1jjABNZMwATWVsAE1mDABNZvwATWfMAE1pDABNawwATWvcAE1tTABNbowATW8cAE1vvABNcEwATXEsAE1xzABNcrwATXNcAE10DABNdawATXZ8AE133ABNeEwATXksAE16DABNezwATXu8AE18rABNfVwATX3sAE1+TABNfowATYAMAE2A3ABNgTwATYGsAE2CrABNhEwATYTMAE2GLABNh3wATYfcAE2IbABNiTwATYpMAE2KzABNi0wATYyMAE2NfABNjiwATY7sAE2PvABNkEwATZMcAE2T/ABNlcwATZasAE2XfABNmOwATZoMAE2azABNm6wATZ/cAE2hLABNojwATaO8AE2k7ABNpdwATaeMAE2obABNqXwATatcAE2s/ABNrZwATa8MAE2wPABNsLwATbI8AE2y3ABNs+wATbWsAE22TABNt5wATbkMAE26zABNu/wATb38AE2/bABNwSwATcLMAE3EvABNxWwATcasAE3I/ABNyowATcr8AE3L7ABNzPwATc5cAE3PXABN0NwATdFsAE3SDABN0jwATdOsAE3U/ABN1awATdX8AE3W7ABN1+wATdjcAE3c3ABN3nwATd88AE3gPABN5JwATeTcAE3mHABN5+wATej8AE3p3ABN6ywATevsAE3sbABN7QwATe2sAE3yjABN9JwATfocAE38fABN/ZwATf7cAE4APABOALwATgW8AE4H3ABODBwATg0sAE4O7ABOD7wAThBsAE4RnABOEmwAThL8AE4UPABOFUwAThoMAE4cDABOIOwATiL8AE4nHABOKMwATil8AE4qXABOK0wATi9MAE4w7ABOMZwATjX8AE427ABON9wATji8AE45nABOO6wATjzcAE4+DABOP9wATkQ8AE5FPABORiwATkdsAE5IzABOSXwATk3cAE5PrABOUIwATlU8AE5V3ABOXAwATl3cAE5f/ABOY5wATmUMAE5pLABOatwATm88AE5wPABOcawATnMMAE54LABOeUwATnp8AE58TABOgAwAToBcAE6A/ABOgbwAToM8AE6InABOiuwATo7sAE6PvABOkVwATpIsAE6TPABOlNwATpaMAE6XzABOmNwATpmMAE6ebABOnxwATp/sAE6gjABOobwATqMMAE6j/ABOpTwATqYMAE6mvABOp7wATqjMAE6qPABOqywATqxcAE6trABOrwwATq/8AE6xnABOsswATrQ8AE60vABOtYwATrbsAE65HABOuXwATrqMAE66/ABOvKwATr1cAE6+HABOv7wATsDcAE7CDABOw+wATsXMAE7H7ABOylwATswMAE7MXABOzfwATs9MAE7QHABO0gwATtQ8AE7VfABO1kwATtesAE7YnABO2dwATtq8AE7cXABO3ewATt/cAE7hPABO4mwATuPsAE7kzABO5UwATuaMAE7n/ABO6PwATuq8AE7rnABO7awATu7MAE7wrABO8lwATvOsAE70rABO9hwATvf8AE74jABO+SwATvnMAE76jABO+/wATvy8AE79TABO/dwATwAcAE8BzABPAwwATwPsAE8FTABPBiwATwcsAE8IXABPCYwATwscAE8LvABPDJwATw2sAE8O3ABPD9wATxCMAE8RTABPEhwATxMcAE8T7ABPFLwATxWsAE8WXABPF5wATxgcAE8YzABPGVwATxocAE8a7ABPGywATxusAE8cvABPHjwATx/MAE8gPABPIQwATyHcAE8i3ABPI7wATyR8AE8k7ABPJYwATybsAE8nnABPKEwATylsAE8p/ABPK2wATy0cAE8unABPLzwATzDsAE8yDABPMrwATzMMAE807ABPNswATzhsAE85XABPOiwATzs8AE873ABPPZwATz48AE8+zABPPzwAT0AcAE9AnABPQUwAT0G8AE9CHABPQkwAT0K8AE9DXABPQ5wAT0QsAE9EvABPRVwAT0YcAE9GzABPR4wAT0hMAE9I3ABPSXwAT0pcAE9K7ABPS9wAT0w8AE9M3ABPTYwAT07cAE9PHABPT/wAT1D8AE9RfABPUiwAT1OcAE9UjABPVSwAT1WsAE9WvABPWBwAT1ksAE9ZfABPWrwAT1tMAE9bzABPXWwAT13sAE9efABPXwwAT19MAE9gfABPYYwAT2I8AE9i7ABPZAwAT2UMAE9l/ABPZwwAT2hcAE9qjABPa9wAT2z8AE9uvABPcCwAT3FMAE9yPABPc4wAT3SsAE91rABPdpwAT3esAE94vABPeewAT3scAE98HABPfOwAT35MAE9/XABPgKwAT4IsAE+CzABPhNwAT4YcAE+GvABPiEwAT4ocAE+L7ABPjFwAT408AE+OTABPjqwAT5CMAE+Q3ABPkhwAT5L8AE+UXABPlWwAT5YcAE+XbABPmBwAT5jcAE+aDABPmlwAT5s8AE+cLABPnPwAT53sAE+e/ABPn4wAT6AcAE+gvABPoTwAT6HcAE+iPABPovwAT6NsAE+kLABPpbwAT6Z8AE+nTA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BUunwAVLx8AFS87ABUvXwAVL68AFS/rABUwJwAVMFMAFTCDABUwuwAVMPMAFTErABUxWwAVMX8AFTGfABUxywAVMicAFTJXABUyowAVMt8AFTMXABUzWwAVM38AFTOrABU0DwAVNEsAFTSbABU06wAVNSsAFTWTABU1zwAVNesAFTYzABU2mwAVNrMAFTbDABU2+wAVNxMAFTc7ABU3ewAVN7MAFTfjABU4EwAVOFMAFTiPABU4vwAVOQcAFTlHABU5ewAVOaMAFToLABU6ewAVOp8AFTrbABU7FwAVO0sAFTu3ABU76wAVPCcAFTx/ABU85wAVPTsAFT1XABU9swAVPfMAFT4rABU+UwAVPn8AFT6vABU+0wAVPusAFT8DABU/PwAVP28AFT+7ABU/+wAVQD8AFUB/ABVAwwAVQQcAFUFbABVBuwAVQgMAFUJHABVCgwAVQr8AFUL7ABVDLwAVQ3cAFUOnABVDwwAVRBsAFURPABVEdwAVRJsAFUUbABVFPwAVRWMAFUWnABVF8wAVRisAFUanABVHCwAVR1cAFUd/ABVHnwAVR+8AFUhLABVIpwAVSO8AFUkrABVJcwAVSbMAFUpfABVKbwAVSq8AFUr3ABVLOwAVS28AFUubABVLywAVS98AFUwPABVMOwAVTGMAFUx/ABVMnwAVTMcAFU0LABVNNwAVTVsAFU1/ABVNowAVTdMAFU4XABVOUwAVTpMAFU6zABVO5wAVT18AFU+bABVPxwAVUAcAFVBHABVQcwAVUJ8AFVDfABVRYwAVUYcAFVGfABVR3wAVUicAFVKXABVS1wAVUz8AFVNrABVTvwAVU+cAFVP3ABVUIwAVVH8AFVTTABVVAwAVVSsAFVVrABVVkwAVVbMAFVXjABVWNwAVVmMAFVazABVW1wAVVxsAFVdbABVXnwAVV88AFVgPABVYbwAVWLsAFVjzABVZPwAVWWcAFVnbABVaTwAVWrcAFVsnABVblwAVW/sAFVx3ABVc6wAVXTsAFV1XABVdewAVXY8AFV23ABVd2wAVXd8AFV3/ABVeMwAVXmsAFV6XABVezwAVXwMAFV87ABVffwAVX78AFV/fABVf+wAVYDsAFWBPABVgmwAVYNsAFWFTABVhkwAVYdMAFWIHABViNwAVYlcAFWJ7ABViqwAVYs8AFWLvABVjIwAVY1cAFWOTABVj0wAVY/8AFWQvABVkawAVZJcAFWTXABVlIwAVZWMAFWWnABVlzwAVZicAFWaTABVmswAVZuMAFWcLABVnawAVZ9MAFWf3ABVogwAVaQMAFWl3ABVpowAVajcAFWq3ABVrgwAVa/MAFWzfABVt3wAVbmcAFW7nABVvQwAVb5MAFW/XABVwEwAVcHsAFXDXABVxVwAVccsAFXIbABVyTwAVcpcAFXLvABVzJwAVc4MAFXPHABV0MwAVdJMAFXTjABV1KwAVdWsAFXX3ABV2ewAVdsMAFXb/ABV3NwAVd5sAFXf7ABV4awAVeJMAFXjHABV48wAVeSMAFXk/ABV5XwAVeasAFXnrABV6HwAVek8AFXq7ABV7BwAVe2sAFXvPABV8EwAVfGcAFXzPABV9OwAVfZcAFX3/ABV+OwAVfssAFX8XABV/VwAVf4MAFX/LABWAUwAVgLcAFYEXABWBPwAVgZsAFYH3ABWCNwAVgpMAFYLvABWDVwAVg6cAFYPzABWEfwAVhNcAFYUXABWFZwAVhdMAFYZHABWGowAVhxsAFYebABWIAwAViHMAFYj3ABWJSwAViZsAFYnrABWKNwAVipMAFYrrABWLSwAVi3sAFYuvABWL9wAVjB8AFYxrABWMvwAVjOMAFY1LABWNhwAVjdMAFY4jABWOZwAVjosAFY7bABWPJwAVj3cAFY/LABWP9wAVkEMAFZBjABWQswAVkOsAFZFTABWRZwAVkasAFZH7ABWSWwAVkncAFZK/ABWTKwAVk1MAFZOvABWUDwAVlF8AFZTHABWVQwAVlZ8AFZX7ABWWjwAVlycAFZfbABWYSwAVmKcAFZkfABWZZwAVmZ8AFZnvABWaNwAVmmMAFZqPABWa8wAVm4sAFZvfABWcXwAVnJcAFZzDABWc7wAVnQ8AFZ1HABWdgwAVnc8AFZ4LABWeQwAVnpcAFZ7XABWfMwAVn2sAFZ+HABWfvwAVoDcAFaBPABWgbwAVoIsAFaCrABWg3wAVoPcAFaEjABWhiwAVod8AFaIrABWiRwAVoocAFaLHABWi9wAVozMAFaOTABWkFwAVpDsAFaSjABWk4wAVpS8AFaWjABWl0wAVpf8AFaYnABWmVwAVppMAFabrABWnawAVp88AFagPABWoWwAVqKsAFaj7ABWpDwAVqYMAFamrABWp9wAVqlsAFaq/ABWrEwAVq3MAFav7ABWscwAVrL8AFa1PABWtkwAVresAFa4zABWugwAVrssAFa83ABWvkwAVr/8AFbB3ABWw/wAVsXMAFbH7ABWyPwAVsl8AFbKrABWy7wAVsy8AFbODABWzrwAVs/cAFbQzABW0ewAVtLcAFbUHABW1IwAVtYsAFbW/ABW2EwAVtn8AFbbrABW3QwAVt68AFbfjABW4GwAVuEsAFbh7ABW4swAVuQMAFblLABW5fwAVubsAFboXABW6NwAVumMAFbqjABW64wAVuycAFbtnABW7qwAVu8cAFbvvABW8HwAVvFcAFbyLABW8xwAVvQsAFb0rABW9SwAVvZMAFb3bABW99wAVvjMAFb5zABW+uwAVvuMAFb8TABW/SwAVv4cAFb/TABW/9wAVwB8AFcBLABXAbwAVwL8AFcD3ABXBLwAVwZsAFcIbABXCmwAVwzcAFcPTABXEgwAVxNsAFcVHABXFiwAVxfsAFcZTABXGhwAVxs8AFccTABXHawAVx88AFcgDABXIDwAVyDsAFch/ABXJAwAVyTsAFcl7ABXJtwAVyfMAFconABXKWwAVyssAFcr7ABXLIwAVy28AFcujABXMqwAVzOsAFc07ABXNbwAVzb8AFc4TABXOYwAVzpMAFc7PABXO6wAVzy8AFc97ABXP4wAV0CcAFdBTABXQrwAV0Q8AFdFbABXRlwAV0bcAFdIXABXSQwAV0ssAFdLvABXTSwAV068AFdQrABXUYwAV1L8AFdU/ABXVTwAV1bsAFdX3ABXWKwAV1mMAFda7ABXW4wAV1x8AFddPABXXVwAV18sAFdfTABXX6wAV2D8AFdh7ABXYkwAV2L8AFdjfABXZAwAV2SMAFdlLABXZdwAV2ecAFdpLABXazwAV21MAFdvLABXb+wAV3C8AFdxbABXckwAV3LsAFdz3ABXdNwAV3U8AFd1fABXdowAV3gcAFd4/ABXeWwAV3n8AFd7bABXfBwAV3zsAFd9nABXfkwAV37cAFd/bABXgEwAV4DcAFeBvABXgrwAV4QsAFeFfABXh9wAV4lsAFeMDABXjcwAV458AFeQTABXkSwAV5IMAFeTHABXlNwAV5YsAFeW3ABXl5wAV5isAFeZbABXmnwAV5r8AFebjABXnMwAV52cAFeerABXn4wAV6CsAFeh7ABXo0wAV6OcAFelXABXpnwAV6ecAFeofABXqWwAV6rMAFer3ABXrTwAV66MAFevTABXsDwAV7FMAFey7ABXs5wAV7Q8AFe0vABXtQwAV7Y8AFe4rABXufwAV7qMAFe7rABXvIwAV738AFe/rABXwHwAV8G8AFfCHABXw4wAV8TsAFfGPABXxrwAV8e8AFfIfABXyTwAV8ocAFfLLABXzKwAV83sAFfOzABX0BwAV9CsAFfSjABX1JwAV9XMAFfWHABX12wAV9jcAFfafABX23wAV9wsAFfdXABX3nwAV9/sAFfg7ABX4awAV+KcAFfjrABX5MwAV+asAFfnzABX6UwAV+p8AFfrnABX7OwAV+0sAFftjABX7cwAV+4sAFfvfABX8JwAV/GMAFfyzABX82wAV/ScAFf1LABX9awAV/acAFf3nABX98wAV/jsAFf6jABX+ywAV/vcAFf83ABX/XwAV/3cAFf/bABYABwAWAD8AFgCfABYA1wAWAP8AFgEjABYBRwAWAXMAFgGbABYCDwAWAqsAFgNTABYDkwAWA8cAFgQ7ABYEpwAWBT8AFgV7ABYFswAWBhcAFgY/ABYGgwAWBqsAFgbTABYHAwAWBz8AFgd/ABYHnwAWCDcAFgh/ABYIrwAWCOMAFglPABYJdwAWCa8AFgoDABYKVwAWCnsAFgqPABYK7wAWC1cAFgufABYMHwAWDE8AFgynABYM2wAWDRsAFg0/ABYNewAWDccAFg33ABYOVwAWDs8AFg8XABYPGwAWDzsAFg9XABYPfwAWD78AFhALABYQUwAWEJsAFhD7ABYREwAWEXcAFhGPABYR8wAWEhcAFhKHABYSqwAWExsAFhM7ABYTpwAWE8cAFhQzABYUiwAWFMMAFhT/ABYVIwAWFW8AFhW3ABYV5wAWFjcAFhZvABYWywAWFxMAFhdDABYXmwAWF+cAFhgjABYYUwAWGIcAFhjLABYY+wAWGUcAFhmjABYZ7wAWGj8AFhp3ABYaswAWGwsAFhuDABYbvwAWG/cAFhwrABYcRwAWHJsAFhzrABYdOwAWHZMAFh2rABYeAwAWHmcAFh8HABYfawAWH7MAFh/3ABYgIwAWIGMAFiCnABYg2wAWIQ8AFiFjABYhewAWIcsAFiHjABYiOwAWIm8AFiLXABYi/wAWI1cAFiOfABYjzwAWJAsAFiRbABYk6wAWJa8AFiX3ABYmTwAWJo8AFibPABYnFwAWJ0cAFifPABYoEwAWKKsAFijfABYpBwAWKS8AFilbABYppwAWKe8AFio7ABYqWwAWKn8AFiqjABYq7wAWKxsAFitPABYrhwAWK88AFiwPABYsRwAWLIcAFiy/ABYs6wAWLTMAFi1rABYtowAWLbsAFi3vABYuIwAWLk8AFi6TABYu1wAWLxMAFi8vABYvRwAWL4cAFi+zABYv2wAWMEsAFjB/ABYwvwAWMNsAFjFnABYxmwAWMb8AFjHTABYx3wAWMfcAFjIjABYycwAWMocAFjLbABYzEwAWM08AFjO/ABY0QwAWNFMAFjSHABY0qwAWNMcAFjUfABY1NwAWNbMAFjXbABY2HwAWNkcAFjaTABY3CwAWN3sAFje7ABY39wAWOCMAFjhbABY43wAWOQ8AFjljABY5jwAWOccAFjnjABY6KwAWOtsAFjsPABY7MwAWO48AFjvPABY8CwAWPHsAFjzLABY88wAWPRsAFj1zABY91wAWPhsAFj57ABY+uwAWPusAFj8bABY/TwAWP48AFj+/ABZANwAWQFsAFkDHABZA9wAWQS8AFkGDABZB7wAWQn8AFkMHABZDJwAWQ1cAFkODABZDswAWQ88AFkP7ABZEIwAWRE8AFkR7ABZE0wAWRQcAFkWDABZFswAWRhsAFkZXABZGhwAWRr8AFkc/ABZHcwAWR7MAFkfnABZIMwAWSIsAFkjXABZJEwAWSWMAFknPABZKMwAWSpcAFkq3ABZK3wAWSxsAFktjABZLpwAWTF8AFkyrABZMwwAWTRcAFk03ABZNYwAWTbcAFk47ABZOgwAWTvsAFk83ABZPowAWT+cAFlAvABZQdwAWUL8AFlDvABZRTwAWUZMAFlIHABZSOwAWUp8AFlLbABZTRwAWU3MAFlPPABZT6wAWVEcAFlRrABZUmwAWVPMAFlVLABZVlwAWVeMAFlYjABZWYwAWVqMAFla/ABZW9wAWVy8AFldnABZXgwAWV58AFlfrABZYGwAWWFsAFlifABZY8wAWWVMAFlm3ABZaEwAWWkcAFlp7ABZbAwAWWz8AFltHABZbewAWW4cAFluzABZb9wAWXC8AFlxnABZckwAWXMcAFlz7ABZdHwAWXU8AFl17ABZdrwAWXdcAFl4DABZeRwAWXmcAFl6PABZewwAWXuMAFl8PABZfTwAWX28AFl+rABZf6wAWYCMAFmBDABZghwAWYK8AFmDjABZhLwAWYX8AFmGvABZh4wAWYhcAFmJHABZiswAWYw8AFmM/ABZjlwAWY8MAFmPzABZkGwAWZEcAFmSDABZkpwAWZOMAFmUvABZlawAWZZMAFmXDABZl4wAWZjMAFmZTABZmewAWZrcAFmbLABZm+wAWZw8AFmdnABZnowAWZ98AFmfzABZowwAWaO8AFmlvABZppwAWahMAFmpPABZqkwAWaqsAFmrjABZq9wAWazMAFmuTABZrywAWbAcAFmwPABZsFwAWbFMAFmybABZs0wAWbQMAFm1DABZtdwAWbccAFm4rABZuhwAWbr8AFm8HABZvIwAWb2MAFm+LABZvqwAWb8sAFnCHABZwswAWcMMAFnD7ABZxTwAWcYsAFnG7ABZx3wAWcnMAFnKrABZy0wAWcycAFnNHABZzawAWc48AFnO3ABZz+wAWdC8AFnRTABZ0fwAWdKMAFnTTABZ09wAWdRsAFnVTABZ1fwAWdaMAFnXPABZ1+wAWdisAFnZHABZ2vwAWdv8AFndPABZ3dwAWd5MAFnfHABZ39wAWeB8AFng/ABZ4XwAWeH8AFnjTABZ5BwAWeS8AFnlTABZ5lwAWeb8AFnrDABZ7MwAWe1cAFnuHABZ7xwAWe/8AFnw3ABZ8owAWfRMAFn1zABZ92wAWfj8AFn6nABZ+zwAWfw8AFn9nABZ/pwAWf+8AFoBDABaAiwAWgMsAFoETABaBbwAWgbsAFoIHABaCJwAWgn8AFoK3ABaC5wAWgzMAFoN7ABaDpwAWg+8AFoQXABaEOwAWhG8AFoS3ABaEzwAWhOMAFoUTABaFgwAWhbMAFoXbABaGKwAWhmcAFobrABaHGwAWh0sAFodvABaHmwAWh88AFofvABaIMwAWiGcAFoiPABaIuwAWiQMAFoknABaJpwAWidcAFopHABaKfwAWiq8AFosbABaLWwAWi3sAFoujABaL3wAWjAsAFowrABaMYwAWjI8AFozDABaM9wAWjRsAFo2zABaN6wAWjoMAFo6rABaO5wAWjysAFo/LABaP/wAWkA8AFpBLABaQxwAWkPMAFpEzABaRuwAWkgMAFpIrABaVIwAWlVcAFpbDABaW+wAWl4MAFpfDABaX8wAWmFcAFprfABabHwAWm2cAFpurABab1wAWnA8AFpxLABacpwAWnMMAFp0DABadOwAWnuMAFp8rABag7wAWoRcAFqF3ABakMwAWpGcAFqSDABakzwAWpWsAFqXPABaoowAWqMcAFqkzABapewAWqYcAFqpHABaqiwAWqtsAFqsTABarUwAWq3sAFqvTABasHwAWrJMAFqzfABat1wAWrf8AFq5jABaufwAWrqsAFq7fABavHwAWr0sAFq9vABay5wAWszMAFrNPABa0vwAWtOcAFrZvABa3+wAWuDcAFrivABa5BwAWuYcAFrn3ABa8ewAWvUsAFr2LABa+QwAWvnMAFr6fABa+uwAWv2sAFr/DABbAAwAWwEsAFsCHABbAuwAWwMcAFsEDABbBIwAWwUsAFsGrABbBzwAWwhcAFsJ7ABbCrwAWwtsAFsMLABbDNwAWw58AFsP/ABbEYwAWxMMAFsTfABbE9wAWxSMAFsVPABbFWwAWxX8AFsW/ABbF6wAWxh8AFsZ3ABbGnwAWxr8AFsbnABbG9wAWxxMAFscrABbHOwAWx18AFsenABbHzwAWyCsAFsi/ABbI2wAWyU8AFsmfABbKAwAWyjsAFsr/ABbLuwAWy+8AFswTABbMQwAWzIsAFszDABbNHwAWzWMAFs2rABbN0wAWzgcAFs4/ABbOmwAWzwcAFs9LABbPawAWz7MAFs/nABbQDwAW0DsAFtBjABbQjwAW0NcAFtEvABbRdwAW0cMAFtIPABbSVwAW0ocAFtLbABbTIwAW008AFtOfABbT7wAW1CsAFtRrABbUkwAW1MMAFtULABbVMwAW1Y8AFtW3ABbV+wAW1jcAFtaPABbW1wAW1x8AFtdfABbXfwAW17sAFtfnABbYNwAW2IsAFti7ABbZBwAW2TcAFtl/ABbZywAW2gsAFtpbABbaiwAW2sMAFtr7ABbbRwAW25sAFtvDABbcBwAW3CsAFtxbABbcjwAW3OcAFt1PABbdfwAW3fMAFt4PABbeNwAW3yMAFt/7ABbgKwAW4E8AFuBzABbgowAW4MsAFuDvABbhMwAW4VcAFuJDABbjFwAW49cAFuQfABbkZwAW5KsAFuTXABblJwAW5WsAFuWTABbl3wAW5i8AFuZ7ABbm0wAW5v8AFucrABbnUwAW54cAFue7ABbn8wAW6BcAFuhbABbofwAW6NcAFumrABbp6wAW6iMAFup3ABbquwAW6v8AFus7ABbrcwAW65sAFuvnABbsNwAW7GMAFuyrABbs8wAW7S8AFu17ABbtrwAW7eMAFu4rABbuhwAW7scAFu8LABbvOwAW76cAFvALABbwUwAW8IsAFvD/ABbxqwAW8kcAFvKnABbyzwAW8w8AFvNXABbzcwAW86sAFvPnABb0HwAW9FsAFvSHABb0twAW9OcAFvUbABb1RwAW9XcAFvX7ABb2gwAW9u8AFvdfABb3wwAW+CsAFvh3ABb4xwAW+PcAFvkrABb5hwAW+ecAFvorABb6cwAW+r8AFvsPABb7TwAW+5MAFvvTABb8AwAW/DcAFvyTABb84wAW/QMAFv1zABb9rwAW/hcAFv6XABb+2wAW/wcAFv8nABb/iwAW/9cAFwAbABcARwAXAIMAFwCnABcBMwAXAY8AFwGvABcB4wAXAj8AFwJ7ABcCxwAXAysAFwNzABcEAwAXBLMAFwVXABcFpwAXBdsAFwYzABcGbwAXBtcAFwcDABcHlwAXB/8AFwgfABcInwAXCOcAFwkzABcJbwAXCeMAFwoLABcKMwAXCmcAFwrTABcLOwAXC28AFwuvABcL2wAXDCsAFwxvABcNAwAXDW8AFw2TABcNywAXDe8AFw4jABcOTwAXDoMAFw67ABcO6wAXDysAFw9rABcP3wAXEAsAFxA3ABcQlwAXEOMAFxEjABcRPwAXEZsAFxHrABcSLwAXEm8AFxK3ABcS3wAXEvcAFxMXABcTLwAXE0cAFxNrABcTxwAXE+sAFxP7ABcUTwAXFFsAFxR7ABcUnwAXFL8AFxTnABcVCwAXFVMAFxV3ABcVvwAXFdMAFxXvABcWBwAXFhcAFxYvABcWUwAXFnsAFxazABcW3wAXFwMAFxcjABcXYwAXF3sAFxejABcXzwAXF+cAFxgbABcYVwAXGIMAFxijABcY0wAXGPsAFxkvABcZSwAXGXcAFxmfABcZywAXGfsAFxoXABcaUwAXGo8AFxr3ABcbGwAXGzMAFxtfABcbhwAXG7MAFxvfABccCwAXHCMAFxw7ABccYwAXHIsAFxyzABcc6wAXHQcAFx0rABcdRwAXHV8AFx1zABcdswAXHcMAFx3TABcd4wAXHfMAFx4nABceWwAXHosAFx6nABce/wAXHzMAFx+HABcflwAXH6sAFx/HABcgDwAXID8AFyCnABcg5wAXIRcAFyEnABchRwAXIWcAFyF/ABchlwAXIb8AFyHrABch/wAXIhcAFyJPABcigwAXIs8AFyLvABcjDwAXIzcAFyNPABcjbwAXI6MAFyPXABcj9wAXJCMAFyRXABckfwAXJLsAFyTvABclDwAXJUcAFyWHABcl3wAXJfsAFyYzABcmUwAXJm8AFyaLABcmvwAXJucAFycDABcnHwAXJ08AFydzABcnmwAXJ7cAFyfPABcn+wAXKCcAFyhPABcoewAXKJ8AFyjfABco+wAXKRcAFyk3ABcpVwAXKXcAFymXABcptwAXKesAFyoTABcqPwAXKm8AFyqnABcq4wAXKxMAFysrABcrYwAXK48AFyvTABcsBwAXLDMAFyxjABcsiwAXLK8AFyzbABctCwAXLVMAFy2HABctwwAXLfMAFy4LABcuNwAXLksAFy5zABcuiwAXLp8AFy7TABcu7wAXLwcAFy8fABcvLwAXL0cAFy9/ABcvswAXMBMAFzBDABcwdwAXMJMAFzDLABcw5wAXMRsAFzE7ABcxewAXMasAFzHbABcyHwAXMkMAFzJfABcycwAXMrcAFzLjABcy8wAXMwcAFzMjABczWwAXM4sAFzO3ABczzwAXM+8AFzQPABc0LwAXNFcAFzR7ABc0mwAXNLMAFzUHABc1GwAXNVMAFzVrABc1gwAXNZcAFzW7ABc12wAXNhMAFzYjABc2QwAXNl8AFzZ3ABc2rwAXNuMAFzcbABc3RwAXN3sAFzeLABc3qwAXN7cAFzffABc4AwAXOCcAFzhPABc4swAXOLcAFzi7ABc4vwAXOMMAFzjHABc4ywAXOM8AFzjTABc41wAXONsAFzjfABc5UwAXOZcAFznDABc6DwAXOjsAFzpXABc6mwAXOqsAFzrrABc6/wAXOw8AFzs7ABc7UwAXO4cAFzuvABc74wAXPAcAFzw7ABc8XwAXPJ8AFzzPABc9GwAXPVcAFz2jABc93wAXPicAFz5fABc+4wAXP1cAFz+PABc/ywAXQCcAF0BrABdAfwAXQLcAF0D/ABdBKwAXQWcAF0GzABdCAwAXQlMAF0KjABdCvwAXQssAF0MHABdDTwAXQ7cAF0QDABdEOwAXRGcAF0STABdE5wAXRSMAF0VXABdFowAXRh8AF0Z7ABdGzwAXRvsAF0cnABdHXwAXR68AF0f7ABdIOwAXSHMAF0i7ABdI9wAXSU8AF0l/ABdJvwAXSfcAF0pDABdKiwAXSrMAF0r7ABdLOwAXS08AF0unABdL6wAXTDMAF0xrABdMtwAXTO8AF013ABdODwAXTkMAF05bABdOhwAXTq8AF07XABdPQwAXT7cAF1AHABdQRwAXUIsAF1C/ABdQ6wAXUT8AF1GHABdRvwAXUh8AF1IzABdSpwAXUtcAF1MjABdTTwAXU5sAF1OzABdT8wAXVDcAF1SbABdU1wAXVU8AF1WDABdVswAXVdMAF1YTABdWQwAXVnsAF1bTABdXFwAXVx8AF1eDABdXrwAXWAcAF1h/ABdY1wAXWSMAF1kzABdZnwAXWhsAF1p7ABdakwAXWtsAF1srABdbgwAXW6MAF1vnABdcMwAXXHMAF1yzABdc+wAXXU8AF12bABdeAwAXXmsAF17fABdfTwAXX5MAF1/3ABdgOwAXYJ8AF2ELABdhcwAXYc8AF2IzABdiYwAXYrsAF2MnABdjSwAXY38AF2OrABdj5wAXZCcAF2RjABdkzwAXZOsAF2U3ABdlUwAXZZ8AF2XzABdmPwAXZlsAF2aDABdm2wAXZzsAF2eXABdnywAXZ+MAF2gPABdoVwAXaI8AF2j7ABdpVwAXaaMAF2nzABdqEwAXansAF2qPABdrCwAXaysAF2trABdrewAXa68AF2wLABdsMwAXbDcAF2yzABds7wAXbWcAF23fABduMwAXbosAF27bABdvJwAXb3MAF2+3ABdv1wAXcDMAF3BzABdwfwAXcIsAF3CzABdw4wAXcPMAF3D/ABdxCwAXcUcAF3FzABdxvwAXcesAF3H3ABdyBwAXch8AF3JDABdyUwAXcmMAF3JzABdyhwAXcpcAF3KnABdytwAXcsMAF3LPABdy3wAXcu8AF3L7ABdzFwAXc2sAF3OfABdz3wAXdCcAF3Q/ABd0VwAXdHsAF3STABd0swAXdNsAF3TjABd1AwAXdR8AF3UzABd2KwAXdkcAF3Z7ABd2lwAXds8AF3dTABd3cwAXd88AF3fjABd4FwAXeC8AF3hbABd4fwAXeUMAF3mTABd5swAXed8AF3oDABd6EwAXejMAF3pTABd6lwAXesMAF3r/ABd7JwAXe1MAF3uHABd7rwAXe+MAF3wTABd8XwAXfJMAF30bABd9JwAXfVsAF32rABd91wAXfgMAF34nABd+awAXfpMAF37XABd++wAXfxcAF3+XABd/7wAXf/sAF4AbABeAMwAXgGcAF4CLABeA4wAXgP8AF4EfABeBbwAXgicAF4NjABeDcwAXg4MAF4OrABeD2wAXhCcAF4RXABeEgwAXhLMAF4TPABeE9wAXhUsAF4VXABeFfwAXhccAF4XnABeGHwAXhksAF4ZrABeHAwAXiAsAF4hjABeItwAXikMAF4pvABeKuwAXixcAF4t7ABeLgwAXi4sAF4uTABeLmwAXi6MAF4urABeLswAXi7sAF4vDABeLywAXi9MAF4vbABeL4wAXi+sAF4vzABeL+wAXjAMAF4wLABeMEwAXjBsAF4wnABeMMwAXjD8AF4xLABeMVwAXjGMAF4xvABeMewAXjIcAF4yTABeMnwAXjKsAF4y3ABeMwwAXjM8AF4zbABeM5wAXjPMAF4z/ABeNCwAXjRcAF40jABeNLwAXjTsAF41HABeNUwAXjV8AF41rABeNdwAXjYMAF42TABeNowAXjbMAF43DABeN0wAXjeMAF43zABeOAwAXjhMAF44jABeOMwAXjkMAF45TABeOYwAXjnMAF46DABeOkwAXjqMAF46zABeOwwAXjtMAF47jABeO8wAXjwMAF48TABePIwAXjzMAF49DABePUwAXj2MAF49zABePgwAXj5MAF4+jABePswAXj8MAF4/TABeP4wAXj/MAF5ADABeQEwAXkCMAF5AzABeQQwAXkFMAF5BjABeQcwAXkIMAF5CTABeQtwAXkQMAF5E7ABeRlwAXkasAF5G3ABeR0wAXkfsAF5IPABeSRwAXkm8AF5KzABeS6wAXkxcAF5MzABeTawAXk/MAF5SDABeUwwAXlO8AF5UHABeVPwAXlVMAF5WHABeVjwAXldsAF5X7ABeWOwAXlmcAF5bTABeW/wAXlzMAF5eDABeXzwAXmC8AF5hzABeYvwAXmSsAF5mrABeZ0wAXmecAF5prABeapwAXmtcAF5tHABebnwAXm/cAF5xLABecawAXnMsAF50fABedXwAXnXcAF52rABed3wAXngcAF54vABeeVwAXnoMAF56zABeeywAXnvcAF58bABefQwAXn2sAF59zABef4wAXoBsAF6CzABehGwAXoV8AF6HXABeiLwAXom8AF6LjABejFwAXo08AF6N7A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BhZ/wAYWisAGFpHABha5wAYWxcAGFtLABhbawAYW68AGFvbABhcIwAYXHMAGFz3ABhdPwAYXYcAGF27ABhd/wAYXk8AGF53ABherwAYXuMAGF8jABhfXwAYX4cAGF+vABhgIwAYYGcAGGDPABhhGwAYYT8AGGGLABhiFwAYYpsAGGLvABhjQwAYY6MAGGPvABhkSwAYZJMAGGUfABhlZwAYZasAGGYDABhmcwAYZqcAGGa/ABhm5wAYZzcAGGdLABhnxwAYZ/MAGGgnABhoZwAYaJ8AGGjTABho8wAYaUcAGGnfABhqUwAYapMAGGsLABhrYwAYa7cAGGvfABhsGwAYbGcAGGyXABhtAwAYbZsAGG4DABhulwAYbr8AGG7jABhvKwAYb1sAGG+vABhv3wAYcBcAGHBbABhwhwAYcLMAGHD3ABhxGwAYcT8AGHGTABhxtwAYcecAGHIfABhySwAYco8AGHL3ABhzLwAYc38AGHPLABh0IwAYdFcAGHSnABh0zwAYdQMAGHUvABh1awAYdZ8AGHXjABh2HwAYdkMAGHZ7ABh22wAYdwMAGHczABh3fwAYd88AGHfzABh4RwAYeF8AGHirABh44wAYeT8AGHmHABh5twAYeesAGHovABh6bwAYeqMAGHrHABh67wAYe1MAGHvfABh8TwAYfLsAGH0jABh9WwAYfasAGH4bABh+bwAYfs8AGH8rABh/cwAYf6sAGIAzABiAgwAYgL8AGIDvABiBEwAYgVsAGIHPABiCRwAYgmcAGIKrABiDGwAYg48AGIPrABiECwAYhLMAGIT/ABiFRwAYha8AGIXrABiGHwAYhpsAGIcHABiHhwAYh98AGIgrABiIfwAYiKsAGIi/ABiJAwAYiU8AGImHABiJzwAYii8AGIpvABiK0wAYiycAGItbABiLswAYi/cAGIwnABiMUwAYjHsAGIzPABiM/wAYjU8AGI2nABiNuwAYjhcAGI5TABiOiwAYjtcAGI8jABiPawAYj78AGJAXABiQgwAYkLcAGJDzABiRJwAYkWsAGJG7ABiR7wAYkhsAGJJXABiSiwAYkr8AGJL3ABiTSwAYk6sAGJPfABiUEwAYlE8AGJSTABiUywAYlOcAGJUrABiVWwAYlYsAGJXLABiWEwAYlmsAGJbLABiXSwAYl7sAGJfjABiYJwAYmF8AGJiLA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BldOwAZXWcAGV2TABldzwAZXf8AGV4zABleYwAZXp8AGV7bABlfDwAZX0sAGV97ABlfvwAZX+sAGWAnABlgfwAZYNMAGWFTABlhhwAZYc8AGWITABliZwAZYrcAGWL/ABljQwAZY38AGWOvABlj9wAZZCMAGWRnABlkvwAZZQcAGWU/ABllnwAZZdMAGWYXABlmWwAZZoMAGWavABlmzwAZZycAGWd3ABlnxwAZZ+cAGWg/ABloowAZaPsAGWlTABlpiwAZaasAGWnbABlqEwAZaksAGWqPABlqtwAZav8AGWs3ABlrxwAZbAcAGWwzABlsawAZbMMAGW07ABltxwAZbgcAGW5vABluxwAZbzcAGW+PABlv1wAZcB8AGXB3ABlwvwAZcPMAGXEnABlx7wAZcisAGXJ/ABly0wAZcxcAGXNTABlzxwAZc/cAGXQzABl0WwAZdJ8AGXTPABl1JwAZdW8AGXYbABl2LwAZdsMAGXcXABl3VwAZd5sAGXgPABl4TwAZeIMAGXkLABl5RwAZeW8AGXnDABl6EwAZemcAGXqnABl7GwAZe2cAGXvDABl8IwAZfE8AGXyjABl9BwAZfXMAGX3bABl+BwAZfm8AGX7TABl/QwAZf6MAGX/nABmAYwAZgKsAGYErABmBYwAZgccAGYK3ABmC8wAZg2cAGYObABmDxwAZhLMAGYTXABmFSwAZhZMAGYX3ABmGUwAZhosAGYbzABmHMwAZh48AGYfrABmIFwAZiJsAGYkDABmJOwAZiZsAGYnrABmKbwAZircAGYsbABmLUwAZi6cAGYvbABmMFwAZjEMAGYyPABmMuwAZjO8AGY1LABmNtwAZjfsAGY53ABmO2wAZj3cAGY+bABmP/wAZkD8AGZBzABmQ6wAZkS8AGZG3ABmSGwAZksMAGZLnABmTKwAZk3sAGZObABmT8wAZlCsAGZRnABmUhwAZlOcAGZVLABmVlwAZlfsAGZY/ABmWlwAZlx8AGZdrABmXqwAZl98AGZgjABmYWwAZmLMAGZj/ABmZNwAZmWMAGZmzABmaHwAZmkMAGZpfABmaowAZmwcAGZtDABmbewAZm6cAGZvrABmcIwAZnGcAGZyrABmcvwAZnQMAGZ07ABmdiwAZnc8AGZ4bABmeWwAZnqcAGZ7nABmfUwAZn48AGZ+zABmf6wAZoA8AGaBvABmgxwAZoQ8AGaFLABmhmwAZocsAGaIPABmiYwAZoqMAGaLzABmjNwAZo38AGaO/ABmj8wAZpDcAGaRvABmkswAZpOsAGaU/ABmlgwAZpbsAGaX3ABmmJwAZpm8AGaarABmnBwAZp1cAGaenABmn6wAZqD8AGahrABmoswAZqQMAGalHABmp1wAZqicAGaprABmqpwAZqtcAGaszABmrgwAZq8MAGav3ABmsHwAZrDsAGaxnABmskwAZrQsAGa2DABmuHwAZrncAGa8bABmvuwAZsGsAGbELABmxcwAZsdcAGbJXABmylwAZsucAGbOfABm0IwAZtDsAGbRfABm04wAZtY8AGbYPABm2TwAZto8AGbbPABm2/wAZtzcAGbefABm33wAZuBcAGbhHABm4lwAZuN8AGbkvABm5UwAZuXcAGbl/ABm5hwAZuacAGbnHABm6CwAZukcAGbpnABm6ewAZupcAGbq3ABm6ywAZuucAGbtPABm75wAZvBMAGbxDABm8ewAZvL8AGbzvABm9HwAZvU8AGb2DABm9swAZveMAGb4TABm+PwAZvmsAGb6XABm+wwAZvvMAGb8jABm/TwAZv38AGb+7ABnAJwAZwEMAGcCXABnAxwAZwRcAGcFbABnBnwAZwasAGcH/ABnCFwAZwncAGcKfABnDDwAZw0MAGcN/ABnDnwAZw+cAGcQ7ABnEUwAZxLcAGcUXABnFIwAZxXsAGcWHABnF3wAZxesAGcZDABnGTwAZxqcAGca3ABnHEwAZxx8AGcd3ABnHgwAZx9sAGcfnABnIPwAZyE8AGcirABnI/wAZyQ8AGclrABnJvwAZycsAGcojABnKKwAZyn8AGcqLABnK4wAZy1sAGcvPABnL6wAZzFMAGcyLABnM0wAZzRsAGc1bABnNlwAZzf8AGc5nABnOzwAZzwMAGc9XABnPxwAZ0BMAGdBXABnQvwAZ0QMAGdFXABnRhwAZ0ccAGdILABnSLwAZ0msAGdKrABnS0wAZ0y8AGdOLABnT7wAZ1FcAGdTfABnVBwAZ1VcAGdWTABnWAwAZ1isAGdZfABnWvwAZ1wcAGddHABnXuwAZ2BMAGdhXABnYiwAZ2K8AGdjfABnZFwAZ2WcAGdmrABnaGwAZ2lcAGdpzABnaiwAZ2usAGdsvABnbcwAZ27sAGdwDABncTwAZ3J8AGdzzABndOwAZ3ZMAGd3vABneEwAZ3ksAGd57ABne3wAZ31sAGd+PABnfxwAZ3+8AGeBDABngfwAZ4LcAGeDfABnhGwAZ4U8AGeGDABnhqwAZ4c8AGeH3ABniFwAZ4kMAGeJXABnibwAZ4psAGeK/ABni5wAZ4xMAGeNPABnjhwAZ47sAGePjABnkBwAZ5E8AGeSHABnkvwAZ5PsAGeVLABnlewAZ5a8AGeXjABnmGwAZ5kcAGeZ7ABnmqwAZ5wcAGecjABnnWwAZ54MAGeerABnn4wAZ6C8AGehvABnojwAZ6M8AGekrABnpWwAZ6ZcAGenPABnqPwAZ6pMAGesfABnrewAZ7A8AGexrABns/wAZ7U8AGe2rABnuJwAZ7o8AGe7TABnvFwAZ74MAGe/3ABnwSwAZ8L8AGfFXABnx1wAZ8e8AGfILABnynwAZ8sMAGfMDABnzLwAZ808AGfN3ABn0DwAZ9DsAGfRfABn0gwAZ9K8AGfS3ABn02wAZ9VMAGfV3ABn1vwAZ9gMAGfYvABn2QwAZ9nMAGfa/ABn3UwAZ928AGfd3ABn3pwAZ9/8AGfhnABn4uwAZ+SMAGflHABn5ZwAZ+acAGfnnABn6HwAZ+lMAGfqrABn6uwAZ+wMAGfs/ABn7swAZ/AsAGfx3ABn84wAZ/VcAGf3HABn+PwAZ/psAGf7DABn/SwAZ/6MAGgBbABoApwAaAVMAGgHXABoCBwAaAlMAGgK7ABoC9wAaA18AGgO7ABoD8wAaBGcAGgSbABoFAwAaBU8AGgVzABoFowAaBcsAGgYPABoGHwAaBi8AGgZzABoGxwAaBwMAGgdHABoH5wAaCEsAGgiTABoJJwAaCZMAGgnPABoKPwAaCv8AGgtvABoLzwAaDDMAGgxvABoM0wAaDR8AGg2zABoOJwAaDssAGg9PABoPnwAaD9sAGhAbABoQIwAaEIcAGhC7ABoQ1wAaEPsAGhErABoRdwAaEasAGhHzABoSLwAaEosAGhK/ABoS8wAaExsAGhNLABoTmwAaE8sAGhP7ABoUKwAaFFcAGhSPABoUywAaFO8AGhUzABoViwAaFccAGhXjABoWRwAaFmMAGhafABoW2wAaFxcAGhdzABoXvwAaGBMAGhhbABoYnwAaGP8AGhlnABoZfwAaGZsAGhm3ABoZ6wAaGh8AGho3ABoaawAaGoMAGhqbABobCwAaG0sAGht3ABobtwAaG+sAGhwvABocdwAaHLsAGh0TABodZwAaHacAGh3nABoeVwAaHqMAGh87ABofewAaH6sAGh/7ABogJwAaIHMAGiCrABog4wAaIUMAGiGfABoh0wAaIgcAGiIzABoiXwAaIncAGiKPABoipwAaIr8AGiMfABojZwAaI7MAGiPXABokMwAaJGcAGiSbABok/wAaJRsAGiWfABolzwAaJhcAGiZjABomgwAaJsMAGibvABonGwAaJ1sAGieHABontwAaJ+8AGigjABooUwAaKIMAGiizABoowwAaKRMAGilvABop2wAaKlsAGirLABorIwAaK4sAGiv3ABosSwAaLJsAGiz3ABotNwAaLZMAGi3vABouMwAaLncAGi7TABovGwAaL5cAGi/nABowPwAaMI8AGjDvABoxTwAaMXsAGjGTABoxwwAaMdsAGjILABoyRwAaMpsAGjLXABozKwAaM08AGjOLABozrwAaM+sAGjQzABo0kwAaNNsAGjU7ABo1jwAaNdsAGjZbABo2mwAaNtcAGjcnABo3awAaN5sAGjfrABo3/wAaOE8AGjhvABo4ywAaONsAGjknABo5awAaObsAGjoTABo6XwAaOqMAGjrTABo7HwAaO2sAGjuTABo75wAaPDMAGjyXABo88wAaPU8AGj2rABo9+wAaPk8AGj6jABo+6wAaPzcAGj9vABo/mwAaP8sAGkATABpAUwAaQI8AGkDDABpBHwAaQUsAGkGfABpB5wAaQk8AGkJzABpCnwAaQtMAGkNXABpDlwAaQ+cAGkQ7ABpEWwAaRKcAGkTfABpFLwAaRUsAGkWDABpFswAaRe8AGkY3ABpGUwAaRn8AGkbHABpHBwAaR1cAGkenABpH7wAaSCsAGkhbABpIvwAaSQ8AGklXABpJewAaSacAGkoPABpKXwAaSp8AGkrDABpLBwAaSysAGktfABpLnwAaS9MAGkwHABpMMwAaTGsAGky7ABpNBwAaTW8AGk2XABpN9wAaTk8AGk6rABpO9wAaT18AGk+vABpP7wAaUBsAGlCPABpQwwAaUO8AGlEzABpRpwAaUcsAGlH3ABpSYwAaUrMAGlL3ABpTGwAaU2sAGlOzABpUBwAaVF8AGlSrABpU9wAaVTsAGlVrABpVxwAaVfcAGlYPABpWVwAaVp8AGlbbABpXFwAaV2MAGlejABpYQwAaWKsAGljnABpZIwAaWXMAGlnLABpZ8wAaWlMAGlqfABpa5wAaW0cAGluHABpb0wAaXCcAGlxTABpcdwAaXNMAGl0/ABpdlwAaXgMAGl5PABpebwAaXrcAGl8fABpfSwAaX58AGl/vABpgBwAaYEcAGmCfABphFwAaYTcAGmFzABphjwAaYb8AGmHvABpiPwAaYncAGmKvABpi6wAaYxcAGmMzABpjXwAaY5cAGmPbABpkQwAaZHsAGmSzABpk3wAaZU8AGmXLABpmBwAaZisAGmZXABpmgwAaZq8AGmbbABpnCwAaZ0sAGmePABpn7wAaaGsAGmirABppBwAaaV8AGmmLABpp2wAaalcAGmrPABprQwAaa68AGmvnABpsawAabI8AGmy3ABptawAabaMAGm3fABpuLwAabmMAGm6jABpu7wAab0sAGm+XABpv4wAacB8AGnBfABpwrwAacNMAGnEHABpxXwAacasAGnHbABpyFwAackcAGnJ7ABpynwAacsMAGnMPABpzQwAac4MAGnOvABpz2wAac/8AGnQjABp0PwAadJMAGnTLABp06wAadSMAGnVHABp1xwAadisAGnaPABp21wAad0sAGnefABp3zwAaeCsAGnh7ABp4/wAaeT8AGnmvABp6AwAaelMAGnqXABp6ywAaez8AGntnABp7pwAae9MAGnwzABp8SwAafJ8AGnzrABp9MwAafV8AGn3HABp+CwAaflcAGn63ABp/CwAaf1sAGn/TABqAFwAagD8AGoBzABqAjwAagOsAGoEXABqBYwAagcMAGoH/ABqCEwAagkMAGoJ/ABqCswAagvMAGoMrABqDawAag58AGoPzABqEHwAahHcAGoTPABqFGwAahUMAGoWjABqF6wAahjMAGoZPABqGuwAahv8AGoc/ABqHfwAah6sAGognABqInwAaiMsAGojzABqJFwAaiUMAGoljABqJawAaibMAGooHABqKNwAaimsAGoq7ABqLJwAaizsAGoufABqL5wAajBMAGoyPABqNAwAajUcAGo1zABqN3wAajiMAGo6LABqOtwAajxMAGo9XABqPpwAaj88AGpAnABqQdwAakNsAGpEfABqRiwAakcMAGpH7ABqSWwAakpcAGpLrABqTtwAak98AGpQvABqUVwAalOsAGpUrABqVbwAalcMAGpYPABqWYwAalqcAGpb3ABqXQwAal5sAGpfrABqYNwAamIMAGpkXABqZvwAamh8AGpp/ABqapwAamvcAGptbABqbzwAanEcAGpx7ABqcywAanPMAGp1XABqdrwAand8AGp4/ABqeiwAantcAGp8TABqfNwAan0cAGp+XABqgEwAaoHsAGqC3ABqg/wAaoUcAGqGHABqhxwAaohMAGqJjABqiqwAaovsAGqOvABqkBwAapG8AGqTvABqlEwAapYMAGqXzABqmcwAapuMAGqcHABqnLwAap0sAGqdrABqnqwAap9cAGqf/ABqoZwAaqJ8AGqjvABqpQwAaqX8AGqnHABqqUwAaqrMAGqsDABqrWwAaq7sAGqvvABqsRwAarMsAGq0HABqtiwAarb8AGq4DABquPwAarn8AGq7zABqvMwAar8MAGrAbABqwawAasKMAGrDTABqw8wAasRsAGrFvABqxywAasfMAGrIPABqyQwAasmsAGrKfABqywwAaswMAGrMvABqzUwAas4sAGrP3ABq0KwAatI8AGrTvABq1WwAatYcAGrWzABq2CwAatpcAGrcbABq3SwAat3cAGrebABq3pwAat78AGrgvABq4SwAauHsAGriDABq4uwAauPsAGrkjABq5UwAaubMAGrojABq6cwAaupsAGrr/ABq7KwAau1MAGrufABq74wAavCsAGrxrABq88wAavRcAGr2LABq9vwAavkMAGr6LABq/IwAav38AGr/XABrAGwAawGsAGsEDABrBSwAawYsAGsHzABrCKwAawocAGsKnABrC9wAawzMAGsODABrD3wAaxDsAGsSPABrEwwAaxScAGsWTABrF0wAaxj8AGsaDABrG9wAax1cAGsfnABrIZwAayS8AGslvABrJowAaygcAGspfABrKtwAayxcAGstPABrLvwAay98AGswXABrMfwAazNsAGs07ABrNewAazcMAGs4zABrOiwAazw8AGs9rABrP8wAa0DMAGtBvABrQ1wAa0QcAGtFjABrRxwAa0f8AGtJjABrSjwAa0ucAGtMbABrTewAa0+8AGtQzABrUkwAa1K8AGtTXABrVBwAa1SsAGtVPABrVewAa1b8AGtYDABrWTwAa1nsAGtbnABrXNwAa14MAGteLABrXuwAa1+MAGtgzABrYbwAa2JsAGtjvABrZKwAa2Y8AGtnjABraAwAa2ksAGtqvABrbGwAa268AGtwrABrczwAa3SsAGt2vABredwAa32cAGt+fABrf/wAa4EcAGuCXABrhDwAa4V8AGuGTABrh7wAa4lcAGuK/ABri7wAa40cAGuOfABrkHwAa5HMAGuTvABrlPwAa5Z8AGuX3ABrmDwAa5k8AGuaXABrmuwAa5wcAGudbABrn1wAa5+8AGugvABroiwAa6LcAGukLABrpQwAa6Z8AGunbABrqPwAa6ocAGurfABrrOwAa64sAGuwDABrsKwAa7HsAGuzTABrs/wAa7ScAGu1zABrthwAa7dcAGu3rABrt/wAa7hsAGu5DABruawAa7qsAGu8DABrvOwAa728AGu/PABrv+wAa8A8AGvA3ABrwTwAa8JMAGvCfABrwpwAa8Q8AGvF3ABrxtwAa8iMAGvJ7ABrytwAa8t8AGvNPABrzcwAa84cAGvPvABr0LwAa9GcAGvSDABr0owAa9NMAGvULABr1KwAa9f8AGvaDABr2swAa9ucAGvcfABr3PwAa92sAGveDABr31wAa9+MAGvfvABr3/wAa+CMAGvgrABr4MwAa+EcAGvibABr5PwAa+ZMAGvnXABr56wAa+h8AGvpbABr6iwAa+tsAGvtTABr7hwAa+/8AGvxDABr8ZwAa/M8AGv0HABr9EwAa/XsAGv3vABr+IwAa/lcAGv6HABr+1wAa/x8AGv97ABr/1wAbAA8AGwBHABsAgwAbAMMAGwEbABsBSwAbAYsAGwGnABsBuwAbAf8AGwJPABsCewAbArMAGwMLABsDSwAbA4cAGwPLABsD/wAbBGcAGwTbABsFEwAbBUMAGwWfABsFxwAbBesAGwY3ABsGcwAbBosAGwarABsGtwAbBssAGwbvABsHFwAbB28AGwejABsH+wAbCF8AGwijABsIwwAbCRsAGwlXABsJewAbCbsAGwnvABsKcwAbCqcAGwrvABsLIwAbC18AGwuTABsLvwAbC+sAGwwfABsMUwAbDGsAGwyTABsMywAbDP8AGw1HABsNtwAbDecAGw4jABsOawAbDs8AGw8XABsPVwAbD58AGw/nABsQFwAbEIcAGxC/ABsQ1wAbERMAGxFLABsRbwAbEasAGxIHABsSXwAbEpcAGxLXABsTDwAbE0cAGxObABsTtwAbFAsAGxRTABsUiwAbFOMAGxUXABsVVwAbFasAGxX7ABsWNwAbFksAGxZ3ABsWmwAbFtMAGxbrABsXBwAbFycAGxeDABsXywAbGA8AGxgzABsYWwAbGLMAGxj/ABsZPwAbGYMAGxm/ABsaCwAbGksAGxqPABsaxwAbGvMAGxs/ABsbgwAbG6MAGxvTABscIwAbHF8AGxybABscrwAbHN8AGx0XABsdQwAbHYsAGx2jABsd8wAbHj8AGx6XABseswAbHusAGx8nABsfRwAbH3MAGx+/ABsgPwAbILcAGyETABshNwAbIV8AGyGLABsh1wAbIe8AGyIjABsicwAbIqsAGyLjABsjPwAbI18AGyOHABsjwwAbJA8AGyRDABskZwAbJH8AGySvABsk2wAbJRcAGyVjABslewAbJcsAGyYnABsmZwAbJqcAGybrABsnGwAbJ28AGyerABsoIwAbKEsAGyibABsoswAbKQMAGykfABspewAbKY8AGymfABspswAbKc8AGyoDABsqJwAbKkcAGyqvABsq8wAbKxsAGyuLABsr2wAbK+cAGywTABssRwAbLHsAGyyDABssrwAbLNsAGyz/ABstGwAbLUcAGy1jABstewAbLaMAGy3jABsuOwAbLocAGy6/ABsvAwAbL1MAGy+DABsvvwAbL+MAGzATABswYwAbMLsAGzDzABsxewAbMaMAGzHLABsx8wAbMhcAGzJ/ABsy5wAbMwsAGzMnABszrwAbM/cAGzQDABs0jwAbNMMAGzT3ABs1HwAbNZsAGzXLABs2DwAbNk8AGzZnABs2qwAbNt8AGzcTABs3OwAbN3cAGzePABs3mwAbN78AGzgTABs4UwAbOLMAGzlTABs5YwAbOXsAGzmrABs5swAbObsAGznnABs5/wAbOjMAGzpzABs6pwAbOucAGzszABs7bwAbO58AGzuvABs7+wAbPGsAGzyDABs8pwAbPS8AGz1nABs9mwAbPe8AGz4XABs+WwAbPn8AGz6nABs+5wAbPx8AGz9XABs/qwAbP+MAG0ADABtARwAbQKsAG0DfABtBJwAbQX8AG0HLABtB1wAbQeMAG0IzABtCfwAbQp8AG0LDABtC/wAbQ0MAG0NnABtDjwAbQ6sAG0O3ABtEOwAbRIcAG0THABtFBwAbRUcAG0WnABtF4wAbRiMAG0ZvABtGowAbRscAG0bvABtHGwAbR0sAG0fjABtIDwAbSEMAG0hrABtIqwAbSNMAG0kLABtJTwAbSX8AG0oPABtKdwAbSs8AG0sPABtLUwAbS3cAG0urABtLywAbTB8AG0yDABtMzwAbTQcAG01jABtNvwAbTesAG05TABtOdwAbTp8AG07nABtPCwAbT1cAG0+DABtPrwAbT/sAG1A/ABtQZwAbUIcAG1DXABtQ9wAbUScAG1E/ABtRbwAbUZsAG1GjABtRzwAbUh8AG1IvABtSYwAbUo8AG1K3ABtS3wAbUwcAG1NXABtTdwAbU9sAG1QHABtUJwAbVH8AG1TDABtVAwAbVU8AG1WjABtV0wAbVksAG1ZvABtWswAbVwsAG1dXABtXxwAbWAMAG1gTABtYTwAbWM8AG1kDABtZFwAbWSsAG1lPABtZdwAbWdsAG1o/ABta1wAbWwsAG1s/ABtbawAbW5sAG1vTABtcGwAbXD8AG1xfABtcmwAbXO8AG10TABtdSwAbXYsAG13TABteMwAbXnsAG17bABtfEwAbX0sAG1+DABtfpwAbX+cAG2AnABtgbwAbYM8AG2EDABthUwAbYXcAG2GjABth8wAbYhcAG2I3ABtiXwAbYnsAG2LnABtjKwAbY2MAG2OHABtjrwAbZAMAG2RDABtkVwAbZHMAG2SzABtk3wAbZRMAG2UzABtlawAbZZ8AG2XbABtmIwAbZlMAG2afABtm1wAbZwcAG2c7ABtnXwAbZ2cAG2erABtoWwAbaI8AG2iXABto2wAbaRMAG2lzABtqEwAbamMAG2sPABtrTwAba1cAG2uXABtsMwAbbH8AG2zfABttVwAbbZcAG24LABtuawAbbs8AG28TABtvjwAbb+8AG3B7ABtw5wAbcTMAG3GHABtxywAbchMAG3JLABtynwAbctMAG3PDABt0EwAbdC8AG3RPABt0awAbdJcAG3TLABt07wAbdQ8AG3UvABt1twAbdc8AG3XzABt2KwAbdmsAG3arABt27wAbd18AG3d7ABt3qwAbd9cAG3fnABt4EwAbeDcAG3iPABt4twAbeOcAG3k7ABt5awAbeZsAG3nTABt6GwAbek8AG3p7ABt6lwAbep8AG3q3ABt60wAbeuMAG3rvABt7AwAbewsAG3sjABt7LwAbe0cAG3t3ABt7hwAbe6MAG3vjABt8BwAbfEMAG3yXABt82wAbfPsAG31XABt9hwAbfbMAG33bABt+MwAbfl8AG35vABt+ewAbfycAG39DABt/hwAbf7sAG4AjABuAdwAbgKcAG4DLABuA2wAbgQ8AG4EbABuBPwAbgV8AG4GXABuBswAbgecAG4IfABuCVwAbgp8AG4K7ABuC7wAbgy8AG4NTABuDlwAbg78AG4PfABuEHwAbhOsAG4VDABuF9wAbhkMAG4cLABuHXwAbiBcAG4jbABuJKwAbie8AG4pDABuLEwAbi28AG4vzABuMJwAbjDsAG4xfABuMuwAbjRMAG40rABuNiwAbjesAG45HABuOowAbjscAG48rABuPewAbj5cAG4/DABuPywAbkD8AG5BvABuQnwAbkM8AG5EXABuRJwAbkWMAG5FrABuRhwAbkacAG5H3ABuSHwAbkl8AG5JnABuSjwAbktcAG5L7ABuTKwAbk0sAG5N3ABuTpwAbk9sAG5QfABuUTwAblHcAG5SrABuUwwAblNcAG5UzABuVOwAblWsAG5WbABuVvwAblfcAG5Y/ABuWUwAblm8AG5aXABuWowAblrsAG5bTABuW6wAblwMAG5cfABuXOwAbl08AG5d3ABuXnwAbmBsAG5hfABuYmwAbmSsAG5lLABuZfwAbmccAG5oPABuaTwAbmlsAG5p/ABuarwAbmscAG5r3ABubIwAbm3MAG5w/ABucbwAbnL8AG50HABudHwAbnWMAG52jABud2wAbnhMAG55PABueiwAbntMAG5+nABuf1wAbn/sAG6AbABugtwAboQ8AG6FLABuhYwAboc8AG6IvABuiTwAbouMAG6MvABujhwAbo7MAG6PXABuj9wAbpBsAG6SbABulGwAbpUsAG6WDABultwAbpeMAG6YXABumSwAbpnMAG6aLABumywAbpzsAG6dvABun4wAbqF8AG6ibABuoxwAbqO8AG6k/ABupewAbqZsAG6n7ABuqGwAbqkMAG6pfABuqiwAbqtsAG6s3ABurXwAbq9cAG6xLABus3wAbrQMAG61DAButawAbrbMAG633ABuuVwAbrscAG68TABuvTwAbr4MAG6/PABuwMwAbsNMAG7EPABuxcwAbse8AG7I7ABuyYwAbsosAG7KvABuy7wAbsy8AG7NfABuzwwAbs/sAG7RrABu0hwAbtMMAG7UDABu1JwAbtUMAG7VjA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BxvBwAcbzMAHG8/ABxvYwAcb2sAHG+HABxvpwAcb+8AHHA/ABxwzwAccR8AHHFXABxxkwAccfsAHHIrABxyjwAccvsAHHNvABxzqwAcc9cAHHPzABx0PwAcdFcAHHSDABx01wAcdQMAHHVPABx1fwAcddsAHHZfABx2kwAcdv8AHHcbABx3TwAcd38AHHerABx3/wAceDcAHHhrABx4gwAceJsAHHjfABx5SwAceXsAHHnTABx6LwAcelcAHHqfABx6uwAcetMAHHsDABx7OwAce1sAHHu3ABx75wAcfBcAHHwvABx8UwAcfGcAHHx3ABx8fwAcfN8AHH0PABx9MwAcfVcAHH1/ABx9uwAcfeMAHH3rABx+RwAcfp8AHH7nABx/BwAcf0cAHH97ABx/zwAcf9cAHH/fAByATwAcgGcAHICPAByArwAcgQsAHIEXAByBMwAcgUsAHIGHAByBvwAcgkMAHIKHAByCxwAcgysAHINzAByDowAcg9cAHIRLAByEywAchQsAHIXHAByGQwAchocAHIcHAByHRwAciBcAHIiTAByI0wAciVMAHImHAByJqwAcic8AHIozAByKkwAciscAHIrnAByLMwAci28AHIt/AByLjwAci78AHIvvAByMKwAcjEMAHIxbAByMiwAcjKsAHIzrAByNBwAcjScAHI1DAByNbwAcjZMAHI2vAByN4wAcjgcAHI4fAByOSwAcjlsAHI6PAByOpwAcjsMAHI7nAByPAwAcjysAHI9XAByPYwAcj38AHI+fAByP1wAckGMAHJBrAByQjwAckMsAHJEHAByRNwAckZcAHJHLABySBwAckiMAHJIrABySMwAckjsAHJJDABySmwAckqMAHJLPAByS8wAckw8AHJMfAByTZwAck5cAHJO3AByT3wAclBsAHJRLAByUcwAclI8AHJTLAByVAwAclT8AHJVLAByVZwAclYcAHJWfAByVtwAclf8AHJYnAByWhwAclrsAHJbrAByXJwAcl2MAHJezAByX7wAcmB8AHJhTAByYlwAcmMsAHJkTAByZWwAcma8AHJnfAByaIwAcmlMAHJqXABya0wAcmwcAHJtHAByblwAcm/sAHJxbAByc1wAcnRcAHJ2DAByd4wAcnicAHJ5jAByejwAcnsMAHJ7vAByfIwAcn0sAHJ93AByfkwAcn+cAHKALABygJwAcoMMAHKELAByhawAcoZcAHKG7AByh4wAcoicAHKKrAByi4wAco0sAHKODABykCwAcpHMAHKTDAByk5wAcpRMAHKU3ABylSwAcpYMAHKXLABymBwAcpn8AHKb3ABynEwAcp28AHKeHABynowAcqA8AHKhHAByoZwAcrl8AHK7rAByvKwAcr4cAHK/rABywNwAcsSMAHLF3AByycwAcsqcAHLLrABzFSwAcz5cAHNd7ABzYCwAc2FMAHNiTABzY0wAc2QsAHNlHABzZ4wAc2mcAHNqXABza3wAc2wsAHNtjABzbqwAc29sAHNw/ABzcmwAc3NMAHNz3ABzdNwAc3WMAHN2bABzd3wAc3h8AHN6jABzezwAc30MAHN9LABzfuwAc4CcAHODjABzhSwAc4XsAHOGvABzh9wAc4isAHOJjABzihwAc4xMAHONrABzkFwAc5EsAHOSHABzk9wAc5SsAHOWjABzl7wAc5gMAHOZTABzmjwAc50MAHOd3ABzn1wAc6EcAHOh/ABzo0wAc6UsAHOmDABzp9wAc6msAHOqrABzq5wAc6wcAHOsjABzrRwAc618AHOt7ABzrnwAc68MAHOvnABzsJwAc7E8AHOyfABzuEwAc7jMAHO6/ABzvUwAc8xcAHPM7ABzz1wAc9BMAHPR3ABz03wAc9O8AHPT/ABz1TwAc9Y8AHPXPABz2RwAc+LMAHPjXABz44wAc+P8AHPnjABz6DwAc+tMAHPzPABz9AwAc/TsAHP2HABz9rwAc/gMAHP4XABz+gwAdARcAHQQnAB0FYwAdB0cAHQevAB0H9wAdCCcAHQhbAB0JCwAdCXsAHQonAB0KewAdCsMAHQr/AB0LSwAdGwMAHRs3AB0bywAdG/8AHRw3AB0cgwAdHNMAHRzjAB0dAwAdHTcAHR1rAB0dpwAdHdcAHR4HAB0eKwAdHosAHR7fAB0fMwAdH3sAHR+fAB0f6wAdIA8AHSBLAB0gbwAdIIsAHSDzAB0hiwAdIhsAHSJjAB0ijwAdIrsAHSLbAB0jXwAdI58AHSPvAB0kewAdJMcAHSTnAB0k9wAdJS8AHSVrAB0lwwAdJdsAHSYTAB0mMwAdJl8AHSaHAB0m1wAdJw8AHSdHAB0niwAdJ8sAHSgLAB0oQwAdKHcAHSijAB0o8wAdKTsAHSlfAB0pvwAdKkcAHSp/AB0qswAdKtcAHStTAB0rjwAdLCsAHSxfAB0svwAdLRMAHS2fAB0t2wAdLm8AHS8PAB0vXwAdL6sAHS/rAB0wUwAdOVcAHT+fAB1ABwAdQDsAHUBjAB1AuwAdQM8AHUEPAB1BOwAdQWMAHUGLAB1BpwAdQc8AHUInAB1CTwAdQqMAHUL/AB1DNwAdQ2cAHUObAB1luwAdZhcAHWZzAB1nHwAdZ3cAHWe3AB1n9wAdaEsAHWiTAB1ozwAdaScAHWmLAB1pzwAdafsAHWpDAB1qmwAdasMAHWrzAB1rJwAda3cAHWvHAB1r+wAdbC8AHWxrAB1spwAdbScAHW3LAB1uDwAdbn8AHW7DAB1u4wAdbwcAHW8fAB1vZwAdb6sAHW/XAB1v+wAdcB8AHXBbAB1wiwAdcMcAHXD/AB1xHwAdcW8AHXGrAB1x1wAdcf8AHXJHAB1ygwAdcu8AHXNjAB1zpwAdc+sAHXQzAB10WwAddI8AHXSzAB11NwAddcsAHXYPAB12wwAdd28AHXebAB13+wAdeGMAHXiLAB15DwAdeUsAHXlXAB15iwAdeccAHXnzAB15/wAdehsAHXpHAB16iwAdep8AHXq/AB161wAdevsAHXsPAB17LwAdezsAHXtHAB17owAde88AHXvzAB18CwAdfB8AHXwrAB18QwAdfGMAHXx3AB18jwAdfK8AHXzLAB19IwAdfUsAHX1jAB19cwAdfZcAHX2/AB194wAdfhMAHX5fAB1+dwAdfpsAHX6zAB1+wwAdfxMAHX87AB1/VwAdf38AHX+nAB1/6wAdf/MAHYAfAB2AQwAdgGsAHYCTAB2AswAdgM8AHYD/AB2BHwAdgUsAHYFbAB2BbwAdgZMAHYG7AB2B6wAdgicAHYJDAB2CdwAdgocAHYK7AB2C7wAdgzsAHYNvAB2DuwAdhAcAHYRTAB2EgwAdhK8AHYUDAB2FTwAdhYMAHYWTAB2FtwAdhe8AHYYnAB2GSwAdhnsAHYafAB2GvwAdht8AHYbzAB2HMwAdh2MAHYd3AB2HiwAdh6sAHYfPAB2H9wAdiBcAHYhHAB2IjwAdiMMAHYjbAB2I9wAdiS8AHYk7AB2JZwAdiYcAHYmrAB2JtwAdid8AHYn7AB2KPwAdin8AHYqjAB2KvwAditMAHYr3AB2LIwAdiz8AHYtPAB2LlwAdi+MAHYwjAB2MUwAdjHMAHYyDAB2MywAdjOsAHY0XAB2NTwAdjZMAHY3XAB2OLwAdjn8AHY6bAB2O9wAdjysAHY+HAB2PuwAdkBcAHZBDAB2QlwAdkMcAHZEfAB2RTwAdkacAHZHXAB2SLwAdkl8AHZK3AB2S5wAdkz8AHZNvAB2TxwAdk/8AHZRfAB2UiwAdlN8AHZVDAB2VzwAdljsAHZbPAB2XKwAdl68AHZf3AB2YZwAdmMcAHZlPAB2ZlwAdmgcAHZo/AB2anwAdmr8AHZsHAB2bMwAdm4cAHZvLAB2cNwAdnLcAHZ1fAB2d0wAdnm8AHZ7jAB2ffwAdoBMAHaDPAB2hYwAdoh8AHaKnAB2jVwAdo4sAHaPnAB2kUwAdpOcAHaU/AB2lvwAdphsAHaafAB2m7wAdp2cAHae/AB2oPwAdqJ8AHaknAB2pewAdqfcAHap/AB2rLwAdq48AHavHAB2sJwAdrE8AHayfAB2s0wAdrS8AHa2LAB2uDwAdrnMAHa7/AB2vNwAdr5cAHa/jAB2wGwAdsHsAHbDPAB2xEwAdsY8AHbG7AB2yIwAdslMAHbK7AB2zCwAds5MAHbPDAB2z4wAds/cAHbQ/AB20ewAdtMsAHbUTAB21RwAdtXcAHbXDAB22BwAdtisAHbZnAB22kwAdtusAHbdHAB23lwAdt88AHbgnAB24dwAduL8AHbj/AB25TwAduZcAHbnvAB26PwAduncAHbqnAB268wAduzcAHbuHAB270wAdu/8AHbwrAB28awAdvKcAHbzTAB28+wAdvTsAHb1XAB29cwAdvZcAHb2vAB29xwAdvlMAHb63AB2+5wAdvwMAHb8LAB2/rwAdv/cAHcAnAB3AUwAdwJ8AHcCvAB3A0wAdwQ8AHcFfAB3BnwAdweMAHcIzAB3CYwAdwqsAHcK/AB3DHwAdwzMAHcOTAB3D0wAdxCsAHcRHAB3EpwAdxLMAHcUDAB3FiwAdxZMAHcXjAB3GHwAdxlcAHcaXAB3GtwAdxucAHcc7AB3HqwAdyAsAHckPAB3JYwAdyX8AHcmXAB3J4wAdyisAHcpLAB3KYwAdy2cAHcu7AB3L+wAdzEMAHcxzAB3MowAdzOMAHc1LAB3NcwAdzaMAHc4PAB3OJwAdzmMAHc6vAB3O8wAdz08AHc+XAB3P5wAd0A8AHdAzAB3QgwAd0JMAHdDPAB3RDwAd0VcAHdGTAB3RswAd0dcAHdIfAB3SPwAd0oMAHdK3AB3S5wAd0v8AHdM7AB3TdwAd068AHdPzAB3UKwAd1HsAHdTvAB3VHwAd1XMAHdWvAB3WDwAd1kMAHdabAB3WwwAd1w8AHddLAB3XqwAd19sAHdgvAB3YcwAd2NsAHdj3AB3ZNwAd2WsAHdmHAB3ZmwAd2cMAHdnnAB3aJwAd2lsAHdp/AB3atwAd2s8AHdr7AB3bHwAd218AHdubAB3bwwAd2/8AHdw/AB3cXwAd3JsAHdzLAB3c9wAd3R8AHd1nAB3dhwAd3bMAHd3jAB3eCwAd3isAHd5jAB3erwAd3vMAHd9LAB3fuwAd4AcAHeBnAB3gtwAd4RMAHeF7AB3hmwAd4d8AHeIrAB3iTwAd4mMAHeKjAB3i9wAd4z8AHeQvAB3kbwAd5L8AHeUDAB3lXwAd5acAHeXvAB3mPwAd5l8AHebPAB3nFwAd52sAHeefAB3n2wAd6C8AHeiTAB3o4wAd6RMAHelXAB3pkwAd6b8AHen3AB3qMwAd6v8AHevXAB3sGwAd7C8AHex7AB3szwAd7ScAHe1zAB3ttwAd7c8AHe4XAB3uXwAd7p8AHe8XAB3vYwAd758AHe/3AB3wGwAd8C8AHfBbAB3wmwAd8MMAHfELAB3xIwAd8TsAHfFvAB3xjwAd8cMAHfIbAB3yYwAd8psAHfL3AB3zowAd8+sAHfRPAB30bwAd9JcAHfS3AB30zwAd9UcAHfVrAB31rwAd9e8AHfY3AB32WwAd9ocAHfa3AB32xwAd9v8AHfcjAB33WwAd948AHffLAB339wAd+B8AHfhfAB34hwAd+McAHfj/AB35KwAd+VcAHfmPAB35rwAd+dcAHfn7AB36LwAd+msAHfqfAB364wAd+zsAHftfAB37iwAd+7MAHfvzAB38KwAd/GcAHfy3AB388wAd/R8AHf2fAB39ywAd/hMAHf47AB3+WwAd/oMAHf6vAB3+2wAd/wMAHf9TAB3/gwAd/7sAHf/vAB4AJwAeAEcAHgBrAB4AjwAeANsAHgETAB4BawAeAasAHgHjAB4CEwAeAjsAHgJ3AB4CtwAeAxMAHgODAB4EAwAeBIcAHgS7AB4FTwAeBXcAHgWfAB4F1wAeBhcAHgZTAB4G/wAeB4MAHgevAB4H5wAeCDcAHghjAB4IjwAeCLsAHgjnAB4JCwAeCTMAHglbAB4JfwAeCa8AHgnbAB4KDwAeClcAHgqrAB4K+wAeCx8AHguHAB4LuwAeC98AHgwbAB4MawAeDI8AHgy3AB4M8wAeDTcAHg1vAB4NuwAeDhMAHg5nAB4OjwAeDvcAHg8vAB4PdwAeD7MAHhATAB4QZwAeENMAHhFPAB4RswAeEicAHhJjAB4S3wAeE08AHhN7AB4T5wAeFCMAHhRTAB4UywAeFU8AHhZPAB4X1wAeGBcAHhhLAB4YpwAeGPsAHhlXAB4Z6wAeGmMAHhq3AB4a1wAeGzsAHhuHAB4bxwAeHBcAHhxXAB4cpwAeHQ8AHh1rAB4eFwAeHnMAHh7HAB4e7wAeHycAHh9PAB4fmwAeIBMAHiBDAB4ghwAeILcAHiDzAB4hKwAeIWsAHiGHAB4hrwAeIesAHiH/AB4iJwAeIj8AHiJfAB4igwAeIvMAHiMPAB4jdwAeI6sAHiPbAB4kLwAeJJMAHiTXAB4k+wAeJWcAHiW7AB4l5wAeJfcAHiYnAB4mlwAeJtcAHic7AB4nowAeJ9MAHihXAB4o+wAeKScAHiljAB4pmwAeKfcAHipjAB4qxwAeK78AHiwPAB4tUwAeLcsAHi33AB4uKwAeLksAHi6TAB4uwwAeLwcAHi97AB4vrwAeMAsAHjBPAB4wwwAeMQcAHjGHAB4xzwAeMfMAHjIfAB4yUwAeMpcAHjLDAB4y/wAeM0MAHjPDAB4z8wAeNBcAHjQ7AB40bwAeNNsAHjUvAB41YwAeNZcAHjXLAB42PwAeNnsAHja7AB426wAeN0MAHjeDAB431wAeN/8AHjg3AB44YwAeOJ8AHjjTAB45GwAeOe8AHjozAB46cwAeOsMAHjrrAB47IwAeO1MAHjuXAB472wAeO+sAHjv7AB48CwAePBsAHjxDAB48lwAePMMAHj0PAB49PwAePX8AHj2zAB494wAePh8AHj5vAB4+swAePvMAHj8zAB4/hwAeP6MAHj/zAB5AFwAeQGMAHkCLAB5AswAeQOsAHkEfAB5BVwAeQZsAHkHfAB5CIwAeQmMAHkKfAB5C1wAeQyMAHkNvAB5DtwAeRBcAHkRbAB5EswAeRP8AHkUfAB5FZwAeRbcAHkYDAB5GUwAeRrMAHkcPAB5HjwAeR9sAHkhLAB5IswAeSScAHkl3AB5JlwAeSccAHkozAB5KiwAeSucAHks/AB5LiwAeS+8AHkw/AB5MewAeTOsAHk1LAB5NgwAeTe8AHk5LAB5OewAeTs8AHk8DAB5PLwAeT3MAHk+vAB5QHwAeUI8AHlGPAB5R9wAeUg8AHlJTAB5SjwAeUtcAHlMzAB5TjwAeU9MAHlQ/AB5UawAeVKsAHlTrAB5VDwAeVUMAHlV/AB5VywAeVfsAHlZPAB5WswAeVv8AHlcvAB5XUwAeV4MAHlejAB5XwwAeV+cAHlgnAB5YawAeWLsAHlj3AB5ZIwAeWU8AHlljAB5ZewAeWZMAHlmfAB5ZtwAeWesAHlovAB5aVwAeWoMAHlqbAB5awwAeWvcAHlsfAB5bQwAeW2cAHlt3AB5bpwAeW7sAHlwTAB5cSwAeXIsAHlzbAB5dDwAeXVMAHl2bAB5drwAeXgMAHl5DAB5e2wAeXxMAHl8vAB5fhwAeX9sAHmAzAB5gbwAeYOcAHmEzAB5hhwAeYbcAHmIjAB5itwAeYxMAHmNvAB5jmwAeY+8AHmQfAB5kdwAeZJ8AHmTvAB5lFwAeZTcAHmVnAB5lxwAeZgcAHmZ/AB5nLwAeZ2MAHmeLAB5nwwAeZ/cAHmgfAB5oSwAeaGsAHmj7AB5pqwAeajsAHmp/AB5qpwAeaucAHmsbAB5rXwAea7cAHmvfAB5sCwAebGMAHmyjAB5s8wAebWcAHm3LAB5uLwAebnsAHm6zAB5u8wAeb2sAHm+7AB5wKwAecEcAHnDDAB5xNwAecaMAHnHfAB5ycwAecusAHnNXAB5z1wAedGsAHnTXAB51WwAedd8AHnaLAB52/wAed3cAHngbAB54nwAeeRsAHnl7AB56HwAeeqcAHnsvAB57ywAefFsAHnznAB59XwAefX8AHn4fAB5+nwAefxsAHn+3AB6AfwAegNsAHoD7AB6BKwAegaMAHoHjAB6CGwAeglMAHoJ3AB6CowAegs8AHoLbAB6C8wAegyMAHoM3AB6DVwAeg3cAHoQvAB6EewAehT8AHoWXAB6GVwAehqsAHobzAB6HGwAehz8AHodvAB6IKwAeiHsAHoizAB6I2wAeiTcAHolrAB6JrwAeiesAHopXAB6KgwAeitMAHoszAB6LhwAei/sAHowfAB6MQwAejGMAHo0bAB6NYwAejZ8AHo4DAB6OHwAejkMAHo5nAB6OgwAejqcAHo7HAB6PAwAej8sAHpAnAB6QcwAekJcAHpC3AB6QywAekPcAHpEfAB6RUwAekY8AHpGjAB6RqwAekecAHpILAB6SOwAeklsAHpKXAB6SvwAektMAHpLzAB6TCwAekxMAHpNPAB6TawAek38AHpOrAB6TwwAek+sAHpQfAB6UXwAelSMAHpV7AB6VrwAelf8AHpZzAB6WzwAel28AHpfDAB6X9wAemCcAHphnAB6YdwAemIcAHpizAB6YzwAemO8AHpkrAB6ZXwAemXsAHpmrAB6Z2wAemfsAHpoDAB6aLwAemmMAHpqrAB6a4wAemv8AHps/AB6bgwAem98AHpwPAB6cTwAenG8AHp0rAB6dewAena8AHp3TAB6eFwAenjsAHp5jAB6erwAenusAHp9HAB6fgwAen7MAHqAnAB6ghwAeoNMAHqFnAB6hmwAeoasAHqITAB6iTwAeoosAHqLTAB6jAwAeozMAHqN3AB6jkwAeo+MAHqQLAB6kRwAepHsAHqUDAB6lbwAepb8AHqXzAB6mGwAepksAHqanAB6m2wAepw8AHqdHAB6ncwAep6sAHqfHAB6n3wAeqAsAHqhXAB6olwAeqMMAHqkDAB6pOwAeqXcAHqm/AB6pxwAeqf8AHqoTAB6qPwAeql8AHqp/AB6qwwAequcAHqsTAB6rHwAeq0sAHqtXAB6rhwAeq8cAHqwrAB6sXwAerJMAHqzjAB6tAwAerUcAHq17AB6t0wAerf8AHq47AB6uVwAerosAHq7DAB6vFwAer0MAHq+fAB6v8wAesB8AHrBHAB6wcwAesJMAHrC/AB6xEwAesUcAHrFvAB6xkwAesd8AHrInAB6yQwAesmMAHrK3AB6y8wAesy8AHrNjAB6zvwAes98AHrQXAB60ZwAetIMAHrSvAB601wAetPcAHrUfAB61PwAetWcAHrWHAB61nwAetbMAHrXPAB617wAetiMAHrZTAB62lwAetscAHrbvAB62/wAetycAHrc3AB63VwAet4sAHre7AB64CwAeuDMAHrhjAB64hwAeuK8AHrjPAB649wAeuSMAHrlHAB65YwAeuX8AHrmvAB654wAeuhcAHrpDAB66gwAeurcAHrrrAB66/wAeuysAHrs/AB67gwAeu88AHrwfAB68RwAevIsAHryzAB688wAevQsAHr0jAB69qwAevdsAHr4XAB6+KwAevlcAHr6DAB6+rwAevtsAHr8PAB6/YwAev3cAHr+LAB6/wwAewA8AHsBjAB7AlwAewL8AHsDnAB7BOwAewWMAHsGLAB7BwwAewjMAHsKjAB7C5wAewwcAHsMnAB7DcwAew4sAHsOjAB7D6wAexAsAHsRjAB7EfwAexJ8AHsSnAB7ErwAexNcAHsTzAB7FCwAexSMAHsVfAB7FnwAexd8AHsYfAB7GWwAexn8AHsajAB7GrwAexrsAHsbXAB7HBwAex08AHsezAB7H3wAeyAMAHsgjAB7IUwAeyIsAHsi3AB7I/wAeyRsAHsk/AB7JcwAeyZ8AHsnHAB7JzwAeyicAHspPAB7KqwAeyscAHsrvAB7LGwAey0cAHstfAB7LZwAey28AHsuHAB7LpwAey8sAHsvnAB7L+wAezBcAHsw3AB7MXwAezJcAHsyrAB7MywAezPMAHs03AB7NUwAezW8AHs2LAB7N9wAezhMAHs4zAB7OTwAezoMAHs6vAB7O0wAezvcAHs8nAB7PWwAez58AHs/jAB7P/wAe0DsAHtBnAB7QiwAe0LcAHtD7AB7RJwAe0WMAHtGbAB7RvwAe0ecAHtIbAB7SOwAe0mcAHtKHAB7S8wAe0xcAHtMvAB7TQwAe01cAHtOTAB7TtwAe098AHtP/AB7UHwAe1D8AHtRfAB7UfwAe1KcAHtTDAB7VFwAe1TMAHtWbAB7VxwAe1fsAHtYjAB7WQwAe1nMAHtanAB7W4wAe1xsAHtezAB7YNwAe2FcAHth7AB7YnwAe2NcAHtkfAB7ZLwAe2X8AHtpfAB7bGwAe22cAHtuHAB7b1wAe3LMAHtz/AB7dGwAe3WsAHt27AB7ePwAe3m8AHt7LAB7fEwAe34cAHt+/AB7gIwAe4EcAHuB7AB7g2wAe4PsAHuE3AB7hnwAe4ccAHuH7AB7iZwAe40MAHuNnAB7jhwAe5BMAHuQ/AB7kbwAe5JsAHuS7AB7k8wAe5SMAHuV7AB7lnwAe5cMAHuYbAB7mMwAe5mMAHuaHAB7m0wAe5yMAHudXAB7nZwAe57MAHufnAB7n/wAe6CMAHuhLAB7ocwAe6KsAHujPAB7o6wAe6RMAHulLAB7pgwAe6aMAHumzAB7pxwAe6dsAHunfAB7p8wAe6jMAHupfAB7qnwAe6v8AHusPAB7rNwAe61MAHutvAB7rhwAe66MAHuu/AB7r9wAe7D8AHuzDAB7s9wAe7T8AHu2TAB7tywAe7f8AHu4zAB7ugwAe7qcAHu7PAB7vBwAe71sAHu+rAB7v+wAe8DcAHvBfAB7wrwAe8P8AHvFHAB7xxwAe8dcAHvI3AB7yswAe8w8AHvOLAB7z5wAe9DMAHvR7AB70rwAe9OsAHvUrAB71/wAe9jsAHvavAB725wAe90MAHvdzAB735wAe+FcAHvivAB74+wAe+S8AHvmzAB76DwAe+tMAHvs3AB77hwAe+9MAHvwfAB78jwAe/KsAHv0TAB79WwAe/bMAHv3PAB7+FwAe/j8AHv6TAB7++wAe/xcAHv9bAB7/iwAe/6MAHv/vAB8AMwAfAGMAHwCDAB8A0wAfAUcAHwF/AB8BtwAfAecAHwIPAB8CRwAfAocAHwLfAB8DFwAfAzMAHwNrAB8DzwAfA/8AHwQjAB8EfwAfBMMAHwTvAB8FGwAfBVMAHwWXAB8FvwAfBgcAHwY/AB8GcwAfBqcAHwbfAB8HMwAfB18AHwefAB8H1wAfCAMAHwgzAB8IXwAfCIsAHwjjAB8JOwAfCZMAHwoTAB8KkwAfCwMAHwtzAB8LnwAfC8cAHwv3AB8MIwAfDFsAHwyDAB8M+wAfDTMAHw1XAB8NowAfDfMAHw4LAB8OMwAfDnMAHw6/AB8PIwAfD08AHw9rAB8PqwAfEAMAHxBDAB8QmwAfESMAHxFbAB8RowAfEdcAHxIDAB8SLwAfEmcAHxKnAB8S3wAfExMAHxOHAB8TpwAfE88AHxQnAB8UZwAfFJcAHxUHAB8VbwAfFbcAHxX3AB8WMwAfFncAHxazAB8W/wAfF0cAHxe/AB8YJwAfGFMAHxkHAB8ZUwAfGccAHxpvAB8atwAfGvcAHxs/AB8bjwAfG+cAHxwrAB8cbwAfHKsAHxzfAB8dRwAfHbcAHx4HAB8eKwAfHqMAHx8XAB8f2wAfIBsAHyBrAB8gqwAfIN8AHyEPAB8hTwAfIYsAHyHzAB8ifwAfIrsAHyLzAB8jNwAfI28AHyOXAB8j0wAfJAcAHyRPAB8kjwAfJRcAHyU7AB8lbwAfJY8AHyYHAB8mmwAfJtMAHybvAB8nCwAfJ8MAHyf7AB8oQwAfKLsAHykrAB8pWwAfKYsAHynHAB8qIwAfKmsAHyq7AB8rBwAfKzcAHyt/AB8rqwAfLBcAHyyDAB8s4wAfLRcAHy0/AB8tgwAfLc8AHy5HAB8uhwAfLq8AHy8DAB8vXwAfL5cAHy/DAB8v9wAfMC8AHzBTAB8wmwAfMOcAHzEvAB8xdwAfMbMAHzIHAB8yXwAfMo8AHzLzAB8zIwAfM1cAHzOnAB8z5wAfNGsAHzSnAB80zwAfNPcAHzVPAB81fwAfNaMAHzZLAB82kwAfNtMAHzcTAB83iwAfN+MAHzgfAB84TwAfOH8AHzivAB842wAfOPsAHzknAB85ewAfObcAHzn7AB86UwAfOnsAHzrDAB87SwAfO6cAHzwLAB88dwAfPK8AHzzfAB889wAfPSsAHz1LAB89UwAfPacAHz3XAB8+DwAfPpcAHz6jAB8+zwAfPxsAHz9bAB8/jwAfQDsAH0CXAB9A8wAfQcMAH0KXAB9C4wAfQ08AH0OTAB9D1wAfRAcAH0RLAB9EbwAfROMAH0UPAB9FSwAfRYcAH0XHAB9GCwAfRmMAH0abAB9G3wAfRv8AH0cnAB9HSwAfR2sAH0d/AB9HnwAfR8cAH0f7AB9IIwAfSFMAH0iDAB9InwAfSMMAH0jvAB9JDwAfSTcAH0ljAB9JlwAfScMAH0njAB9J/wAfSicAH0o/AB9KZwAfSosAH0rDAB9K+wAfSxMAH0s7AB9LWwAfS4cAH0u/AB9MKwAfTFsAH0zXAB9NCwAfTWcAH02vAB9N1wAfThMAH05bAB9OqwAfTusAH08bAB9PbwAfT6sAH0/fAB9QCwAfUE8AH1CPAB9Q2wAfUQ8AH1E/AB9RmwAfUdMAH1IvAB9SkwAfUq8AH1L3AB9TOwAfU2MAH1ObAB9TswAfU98AH1QnAB9UXwAfVIcAH1TPAB9U/wAfVVsAH1XHAB9WMwAfVq8AH1b7AB9XVwAfV7MAH1fnAB9YQwAfWGMAH1iPAB9YvwAfWNsAH1kHAB9ZPwAfWY8AH1pPAB9aZwAfWn8AH1q/AB9a/wAfW1MAH1uDAB9bvwAfXAMAH1xrAB9c5wAfXRsAH11fAB9dewAfXbsAH13nAB9eOwAfXnsAH16PAB9enwAfXq8AH17rAB9fOwAfX1sAH1+bAB9f7wAfYB8AH2BvAB9glwAfYO8AH2FbAB9hnwAfYd8AH2IfAB9iNwAfYocAH2KnAB9i7wAfYyMAH2NrAB9jfwAfY7MAH2QHAB9kfwAfZPMAH2W7AB9mCwAfZk8AH2abAB9mxwAfZu8AH2crAB9nUwAfZ4MAH2eLAB9nnwAfZ78AH2fXAB9oBwAfaDMAH2hfAB9ojwAfaK8AH2l3AB9qIwAfakMAH2p/AB9qrwAfatcAH2r/AB9rJwAfa0sAH2tvAB9rkwAfa+cAH2wfAB9sTwAfbHcAH2yjAB9s+wAfbScAH22PAB9tuwAfbecAH24bAB9udwAfbrcAH28LAB9vYwAfb48AH2/rAB9wWwAfcK8AH3DnAB9w/wAfcVMAH3F7AB9xswAfcd8AH3IbAB9yNwAfcpsAH3K7AB9zBwAfczsAH3ObAB90CwAfdEcAH3STAB90xwAfdQsAH3VLAB91fwAfdbMAH3XnAB92PwAfdqcAH3bTAB93CwAfd2cAH3ebAB94mwAfeQ8AH3lLAB95hwAfecsAH3n/AB96PwAfeosAH3q/AB967wAfey8AH3trAB97vwAfe/sAH3wzAB98VwAffJcAH3yzAB985wAffRsAH31PAB99cwAffacAH33PAB9+AwAffjsAH35nAB9+pwAffuMAH37rAB9/BwAff1MAH39nAB9/pwAff9sAH4ATAB+AawAfgJMAH4DbAB+A6wAfgUsAH4HzAB+CiwAfgwMAH4M7AB+EDwAfhNMAH4VvAB+FlwAfhbcAH4XbAB+GbwAfhp8AH4bHAB+HCwAfhyMAH4dnAB+HswAfh9MAH4gfAB+ITwAfiHcAH4inAB+JAwAfiScAH4lPAB+JnwAfidsAH4n/AB+KTwAfipcAH4q7AB+K5wAfixcAH4tLAB+LiwAfi6cAH4vHAB+MFwAfjR8AH407AB+NbwAfjYsAH44LAB+RFwAfkVcAH5F/AB+R1wAfkfsAH5KDAB+VywAfleMAH5YfAB+WOwAflvMAH5cTAB+XOwAfl2sAH5ejAB+XtwAfl/cAH5iLAB+Y1wAfmScAH5mPAB+ZswAfmhcAH5rzAB+bYwAfnDsAH6CnAB+g7wAfoSsAH6FbAB+hkwAfoesAH6IbAB+iNwAfomcAH6KHAB+i3wAfo2MAH6OvAB+j8wAfpCMAH6RfAB+kjwAfpK8AH6TjAB+lFwAfqhsAH6pnAB+rFwAfq6MAH6vTAB+r5wAfrCMAH6xLAB+smwAfrP8AH61LAB+tawAfrb8AH64DAB+uPwAgFTMAIIdbACCTlwAgk/cAIKy7ACCtFwAgs4sAILO3ACCz2wAgtAcAILRvACC0owAgtOMAILUvACC1gwAgtasAILXvACC2IwAgtmcAILafACC21wAgtyMAILc7ACC3UwAgt5MAILfLACC4AwAguDMAILg7ACC4ewAguK8AILi7ACC45wAguTcAILlrACC5vwAguesAILonACC6nwAguv8AILs/ACC7hwAgu88AILvvACC8JwAgvFMAILxvACC8xwAgvQ8AIL1bACC9mwAgve8AIL4zACC+fwAgvtcAIL7/ACC/LwAgv2MAIL+TACC/xwAgv+8AIMAbACDATwAgwHsAIMDLACDBDwAgwWcAIMGjACDB/wAgwj8AIMJXACDCZwAgwoMAIMKzACDC6wAgwx8AIMNvACDDwwAgw/cAIMSXACDE9wAgxRsAIMVTACDFhwAgxacAIMXDACDF7wAgxkcAIMZjACDGlwAgxrcAIMdHACDHiwAgx88AIMgDACDIPwAgyG8AIMinACDI4wAgySMAIMkzACDJQwAgyV8AIMl7ACDJlwAgybMAIMnHACDJ2wAgyl8AIMqPACDKuwAgywsAIMtPACDLYwAgzB8AIMxzACDMmwAgzMMAIM0rACDNZwAg3uMAIN8PACDfNwAg35MAIOAPACDgJwAg4DcAIOBbACDgfwAg4KMAIOCzACDgxwAg4OsAIOETACDhUwAg4XsAIOGfACDh1wAg4fcAIOIPACDiGwAg4jsAIOJjACDiiwAg4rMAIOLLACDi8wAg4v8AIOMXACDjPwAg42cAIOOPACDjtwAg498AIOQHACDkLwAg5FcAIOR/ACDkpwAg5M8AIOT3ACDlHwAg5UcAIOVvACDllwAg5b8AIOXnACDmDwAg5jcAIOZfACDmhwAg5q8AIObXACDm/wAg5ycAIOdPACDndwAg558AIOfHACDn7wAg6BcAIOg/ACDoZwAg6I8AIOi3ACDo3wAg6QcAIOkvACDpVwAg6X8AIOmnACDpzwAg6fcAIOofACDqRwAg6m8AIOqXACDqvwAg6ucAIOsPACDrNwAg618AIOuHACDrrwAg69cAIOwLACDsGwAg7D8AIOxjACDsiwAg7JsAIOzDACDs6wAg7RMAIO07ACDtSwAg7WMAIO2PACDttwAg7d8AIO4HACDuLwAg7lcAIO5/ACDumwAg7qcAIO63ACDuzwAg7ucAIO7/ACDvFwAg7ysAIO8/ACDvVwAg738AIO+nACDvzwAg7/cAIPAfACDwRwAg8G8AIPCXACDwvwAg8OcAIPEPACDxNwAg8V8AIPGHACDxrwAg8dcAIPH/ACDyJwAg8k8AIPJ3ACDynwAg8scAIPLvACDzFwAg8z8AIPNnACDzjwAg87cAIPPfACD0BwAg9C8AIPRXACD0fwAg9KcAIPTPACD09wAg9R8AIPVHACD1bwAg9ZcAIPW/ACD15wAg9g8AIPY3ACD2XwAg9ocAIPavACD21wAg9v8AIPcfACD3OwAg928AIPfPACD4DwAg+EcAIPh3ACD4twAg+TcAIPlXACD5iwAg+bcAIPnfACD6EwAg+jMAIPpbACD6fwAg+r8AIPsDACD7JwAg+18AIPubACD7uwAg/K8AIPzfACD8/wAg/RsAIP0zACD9XwAg/Y8AIP2jACD9uwAg/dsAIP4XACD+MwAg/p8AIP7rACD/FwAg/z8AIP9nACD/hwAg/5MAIP/PACEABwAhAD8AIQBvACEAwwAhAQ8AIQE3ACEBcwAhAZMAIQG/ACEB1wAhAgsAIQJPACECmwAhAsMAIQLbACEDZwAhA6MAIQPLACED4wAhBAsAIQQrACEEUwAhBPcAIQVDACEFXwAhBYsAIQWvACEF7wAhBi8AIQZXACEGgwAhBt8AIQcXACEHYwAhB78AIQf3ACEIGwAhCGcAIQjDACEI8wAhCRsAIQlDACEJowAhCfMAIQpTACEKcwAhCrMAIQrrACELGwAhC08AIQtzACELpwAhC/MAIQwPACEMVwAhDH8AIQy/ACEM7wAhDSsAIQ1rACENjwAhDdcAIQ3/ACEOLwAhDlsAIQ6PACEOtwAhDv8AIQ8vACEPWwAhD4sAIQ+3ACEP5wAhEBMAIRBHACEQewAhEK8AIRDrACERHwAhEV8AIRHXACER/wAhEjcAIRJfACESswAhEucAIRM3ACETYwAhE5sAIROvACET7wAhFG8AIRS3ACEU4wAhFSMAIRV/ACEVqwAhFgMAIRZDACEWgwAhFuMAIRcLACEXLwAhF5MAIRfjACEYBwAhGD8AIRh/ACEYswAhGOsAIRkjACEZawAhGcsAIRobACEaVwAhGocAIRq3ACEa/wAhGzcAIRtfACEbmwAhG8MAIRvnACEcEwAhHGcAIRy/ACEdEwAhHXMAIR2nACEd1wAhHhsAIR5jACEeywAhHvMAIR8vACEfbwAhH8sAISA7ACEgrwAhIP8AISFfACEhpwAhIg8AISI/ACEiawAhIp8AISLHACEi3wAhIv8AISMrACEjYwAhI4MAISPDACEj7wAhJDcAISSLACEkqwAhJMsAISTrACElEwAhJS8AISVzACElkwAhJhsAISZbACEmhwAhJr8AIScHACEnOwAhJ1sAISebACEnxwAhKB8AIShbACEojwAhKPcAISkjACEpNwAhKVsAISlzACEppwAhKcMAISn7ACEqHwAhKnMAISq7ACEq2wAhKv8AIStnACErnwAhK9MAISwTACEsWwAhLJ8AISzbACEtBwAhLSMAIS4PACEuRwAhLoMAIS6jACEu3wAhLxsAIS9LACEvjwAhL78AIS/bACEwFwAhMEMAITBrACEwnwAhMNMAITEDACExNwAhMW8AITITACEyywAhMu8AITMjACEzSwAhM3MAITOXACEz0wAhM/cAITQXACE0VwAhNUcAITV3ACE1rwAhNicAITajACE2zwAhNz8AITdrACE3qwAhN9MAITgPACE4SwAhOJ8AITj/ACE5dwAhOaMAITnTACE5/wAhOiMAITpHACE6kwAhOq8AITq/ACE62wAhOwMAITsvACE7TwAhO4MAITu7ACE8AwAhPB8AITw3ACE8UwAhPHsAITyvACE9DwAhPTMAIT1TACE9bwAhPZMAIT23ACE99wAhPlMAIT57ACE+2wAhPxcAIT9PACE/iwAhP68AIT/jACFAIwAhQEsAIUBvACFArwAhQOsAIUE3ACFBewAhQa8AIUHDACFB8wAhQiMAIUJTACFCjwAhQq8AIULPACFC9wAhQ0MAIUODACFDrwAhQ98AIUQfACFERwAhRI8AIUSvACFE7wAhRUMAIUV3ACFFowAhRc8AIUYXACFGOwAhRl8AIUaDACFGuwAhRwMAIUc/ACFHZwAhR5MAIUe3ACFH4wAhSA8AIUhjACFIvwAhSP8AIUlLACFJnwAhSbcAIUnnACFKIwAhSkcAIUp3ACFKuwAhSv8AIUtDACFLhwAhS8cAIUwTACFMUwAhTIMAIUzXACFM9wAhTUMAIU2DACFN0wAhTg8AIU4rACFOkwAhTssAIU8DACFPTwAhT3sAIU+PACFP3wAhUCsAIVBPACFQlwAhUQcAIVEvACFRawAhUZcAIVHHACFR5wAhUicAIVI7ACFSXwAhUqcAIVLnACFTAwAhUyMAIVNnACFThwAhU7MAIVPXACFT5wAhVB8AIVRjACFUhwAhVJ8AIVSzACFU3wAhVP8AIVUfACFVSwAhVXsAIVWnACFV4wAhVi8AIVZrACFWswAhVtsAIVcDACFXMwAhV1sAIVd3ACFXrwAhV9cAIVgbACFYPwAhWG8AIViPACFYmwAhWKMAIVirACFYswAhWLsAIVjDACFYywAhWR8AIVmLACFZywAhWe8AIVorACFaZwAhWtMAIVs7ACFbjwAhW9MAIVwXACFcUwAhXLMAIVzTACFc/wAhXTsAIV1zACFdqwAhXccAIV4XACFeTwAhXscAIV9fACFf7wAhYCMAIWBnACFgnwAhYRMAIWGLACFh4wAhYjcAIWKDACFi3wAhYwMAIWNLACFjhwAhY8MAIWQDACFkfwAhZKcAIWTfACFlTwAhZacAIWXzACFmSwAhZpMAIWbbACFnIwAhZz8AIWdbACFnjwAhZ68AIWgHACFoxwAhabcAIWnbACFp/wAhajcAIWpvACFqmwAhausAIWsnACFrQwAha3MAIWuvACFrzwAhbAcAIWwjACFsTwAhbHMAIWyzACFs0wAhbPsAIW0vACFtWwAhbX8AIW3PACFt6wAhbkMAIW5nACFuhwAhbs8AIW8DACFvHwAhb08AIW+DACFvswAhcA8AIXBHACFwjwAhcM8AIXELACFxTwAhcZMAIXHTACFyLwAhclcAIXJ/ACFymwAhcr8AIXLbACFzCwAhc1MAIXOTACFz0wAhc/MAIXQ/ACF0hwAhdNMAIXUnACF1mwAhdpsAIXbDACF3JwAhd2sAIXePACF3xwAhd/cAIXg7ACF4ZwAheJcAIXjDACF5NwAheWcAIXl7ACF5owAhecsAIXnzACF6HwAhelMAIXpvACF6twAheuMAIXtDACF7cwAhe4cAIXvHACF78wAhfDMAIXxXACF8kwAhfLcAIXzrACF9BwAhfUsAIX3TACF+EwAhfisAIX5PACF+gwAhfuMAIX87ACF/ZwAhf6cAIX/rACGAdwAhgK8AIYETACGBOwAhgZMAIYGnACGCHwAhgn8AIYKTACGC3wAhgysAIYNfACGDbwAhg58AIYQXACGEZwAhhI8AIYS7ACGE6wAhhR8AIYUvACGFdwAhhZsAIYW/ACGF4wAhhgcAIYY3ACGGewAhhsMAIYcnACGHPwAhh1cAIYeLACGHzwAhiAcAIYhXACGIdwAhiLsAIYkTACGJbwAhiacAIYnvACGKBwAhihsAIYovACGKWwAhipMAIYq7ACGK8wAhizsAIYtfACGLfwAhi7MAIYvzACGMJwAhjFsAIYyvACGM8wAhjRcAIY0vACGNawAhjZsAIY23ACGONwAhjlcAIY7DACGPVwAhj7sAIZBHACGQrwAhkTsAIZGrACGSCwAhklcAIZKbACGTAwAhk38AIZOzACGUBwAhlRMAIZW7ACGV8wAhlj8AIZaXACGWtwAhly8AIZdbACGXpwAhl+cAIZgrACGYawAhmJsAIZi/ACGY+wAhmXMAIZnLACGaBwAhmmcAIZqjACGbAwAhmyMAIZtXACGbdwAhm6sAIZvjACGcNwAhnJ8AIZ0LACGdUwAhnasAIZ3nACGeJwAhnocAIZ6vACGe3wAhnwMAIZ+fACGgGwAhoDsAIaBrACGgnwAhoU8AIaFzACGhrwAhoe8AIaIjACGiVwAhoosAIaK/ACGjDwAho18AIaOfACGjwwAho+cAIaQPACGkLwAhpGsAIaSHACGkpwAhpNsAIaT7ACGlQwAhpV8AIaWDACGllwAhpccAIaYHACGmMwAhpl8AIaZ7ACGmowAhpssAIabzACGnKwAhp08AIadvACGnrwAhp+MAIagjACGobwAhqMMAIakDACGpGwAhqTMAIal/ACGp0wAhqfMAIaoXACGqMwAhqmMAIaqbACGq3wAhqwcAIas/ACGrfwAhq7cAIavbACGr9wAhrCsAIaxrACGsowAhrMcAIazrACGtGwAhrTsAIa1nACGttwAhriMAIa57ACGu0wAhrwsAIa9vACGv0wAhsA8AIbBjACGwtwAhsRsAIbF/ACGx7wAhsl8AIbKDACGyzwAhsxsAIbNLACGzfwAhs88AIbPzACG0FwAhtEcAIbRnACG0hwAhtK8AIbTbACG0+wAhtSMAIbVLACG1cwAhtacAIbXLACG2CwAhticAIbZTACG2uwAhty8AIbffACG4GwAhuEMAIblDACG5XwAhuXMAIbmPACG5zwAhuesAIboHACG6MwAhuo8AIbq3ACG65wAhuyMAIbsrACG7MwAhvFsAIb3vACG+RwAhvpMAIb9rACHAkwAhweMAIcOrACHEHwAhxO8AIcYPACHHVwAhx8MAIcgDACHIEwAhyCcAIchnACHJIwAhyksAIcuXACHLnwAhy9MAIcwnACHMWwAhzaMAIc4XACHOgwAhzrcAIc7jACHO/wAhz1MAIc+HACHPvwAhz9MAIdAjACHQXwAh0NMAIdDzACHRKwAh0T8AIdF/ACHRpwAh0b8AIdHzACHSHwAh0jsAIdJ/ACHTJwAh03MAIdOnACHT4wAh0/sAIdQnACHUVwAh1L8AIdTvACHVGwAh1ScAIdWPACHV4wAh1g8AIdZDACHWawAh1psAIdcjACHXQwAh148AIdgHACHYWwAh2K8AIdkDACHZHwAh2ecAIdoTACHaRwAh2msAIdrDACHa9wAh2xsAIdt3ACHbwwAh298AIdv/ACHcYwAh3MsAId0PACHdMwAh3VcAId1/ACHdrwAh3hcAId4/ACHeXwAh3o8AId6zACHe+wAh318AId+TACHfvwAh3+cAIeAvACHgUwAh4HMAIeDTACHg/wAh4R8AIeGXACHhzwAh4hMAIeI7ACHiZwAh4n8AIeKrACHiywAh4uMAIeMHACHjKwAh41cAIeNrACHjgwAh46cAIeQrACHkWwAh5HcAIeSfACHk4wAh5QMAIeUfACHlUwAh5YcAIeXPACHl4wAh5gcAIeZjACHmfwAh5p8AIebDACHnAwAh51cAIed7ACHn1wAh6CsAIeiHACHoowAh6PsAIemTACHqTwAh6n8AIerfACHrFwAh608AIeuPACHr6wAh7BcAIew7ACHsXwAh7H8AIeyfACHszwAh7RMAIe1LACHtdwAh7ZcAIe2zACHt7wAh7isAIe5bACHujwAh7qsAIe7fACHvDwAh7zcAIe9jACHvswAh8A8AIfA3ACHwbwAh8KMAIfDjACHxBwAh8TMAIfF7ACHx0wAh8fMAIfIzACHyUwAh8o8AIfKvACHy4wAh8xMAIfNDACHzawAh85MAIfO/ACHz8wAh9BcAIfQ/ACH0bwAh9I8AIfTXACH1CwAh9TsAIfWLACH1pwAh9dsAIfYHACH2RwAh9ocAIfa/ACH23wAh9wsAIfdTACH3dwAh96cAIffbACH4BwAh+EsAIfiLACH4twAh+OMAIfkHACH5KwAh+VMAIfmHACH5qwAh+e8AIfozACH6dwAh+r8AIfr/ACH7RwAh+48AIfvXACH8EwAh/DcAIfxDACH8XwAh/JsAIfy/ACH80wAh/QMAIf0bACH9MwAh/UsAIf1rACH9iwAh/aMAIf27ACH90wAh/esAIf4DACH+GwAh/jMAIf5LACH+YwAh/nsAIf6jACH+2wAh/xcAIf9TACH/gwAh/6MAIf/DACH/5wAiAAMAIgA3ACIASwAiAHMAIgCfACIAywAiAO8AIgEXACIBKwAiAW8AIgGzACIB5wAiAh8AIgI/ACICXwAiAoMAIgKfACIC2wAiAwsAIgM7ACIDXwAiA48AIgO7ACID2wAiBB8AIgRrACIEhwAiBMMAIgTvACIFKwAiBWsAIgWPACIFswAiBeMAIgYrACIGcwAiBr8AIgcLACIHVwAiB5sAIgfjACIIFwAiCFsAIgiHACIIxwAiCN8AIgkPACIJOwAiCV8AIgmHACIJqwAiCdcAIgofACIKMwAiClMAIgq/ACIK6wAiCxcAIgtLACILawAiC8MAIgwrACIMawAiDKMAIg0PACINZwAiDY8AIg2zACIN+wAiDhcAIg5XACIOcwAiDqsAIg7jACIPMwAiD48AIg/TACIQKwAiEEcAIhB7ACIQvwAiEP8AIhEvACIRUwAiEYcAIhGzACIR1wAiEgcAIhI/ACISawAiEp8AIhLbACITEwAiE1cAIhOjACIT0wAiFAsAIhRDACIUkwAiFNsAIhT7ACIVNwAiFVMAIhVvACIVmwAiFiMAIhY7ACIWiwAiFrsAIhbXACIXOwAiF1sAIhefACIYJwAiGHcAIhirACIY5wAiGRcAIhlnACIZiwAiGbMAIhnnACIaFwAiGjcAIhqLACIatwAiGucAIhtXACIbhwAiG+sAIhy3ACIdCwAiHWsAIh2nACId1wAiHf8AIh53ACIemwAiHvcAIh93ACIfowAiH8MAIh/fACIf/wAiIDsAIiBrACIgxwAiIPcAIiEnACIhcwAiIZcAIiITACIiRwAiInMAIiNzACIjfwAiJCcAIiT3ACIlKwAiJUsAIiWDACIlvwAiJr8AIicHACIoBwAiKDMAIihbACIohwAiKKsAIijbACIpAwAiKS8AIilfACIphwAiKc8AIin7ACIqJwAiKlsAIirDACIq0wAiKw8AIit7ACIrpwAiK+8AIixLACIsowAiLNcAIi0PACItLwAiLU8AIi1XACItlwAiLcsAIi3nACIuAwAiLlcAIi6jACIu3wAiLxMAIi9PACIvswAiMFMAIjB/ACIwnwAiMMMAIjDjACIxEwAiMVMAIjFrACIx5wAiMisAIjJnACIylwAiMtMAIjMXACIzLwAiM4cAIjPrACI0MwAiNFMAIjSbACI0ywAiNSMAIjVjACI1pwAiNfcAIjYbACI2SwAiNm8AIjaDACI2wwAiNw8AIjc/ACI3owAiN8sAIjf7ACI4DwAiOB8AIjg/ACI4awAiOIcAIji/ACI41wAiOOsAIjkPACI54wAiOh8AIjpbACI6lwAiOr8AIjrnACI7DwAiOycAIjsvACI7RwAiO1sAIjuHACI7pwAiO98AIjwXACI8VwAiPHsAIjyDACI8mwAiPK8AIjzLACI84wAiPPcAIj0nACI9TwAiPXMAIj2rACI90wAiPfsAIj4jACI+TwAiPnMAIj6fACI+twAiPt8AIj7zACI/CwAiPx8AIj8zACI/bwAiP9cAIkAbACJATwAiQHcAIkE3ACJCCwAiQkcAIkK/ACJC4wAiQxMAIkM/ACJDawAiQ5MAIkPPACJEFwAiRGMAIkR/ACJEqwAiRNMAIkT/ACJFHwAiRT8AIkV/ACJFmwAiRgsAIkY7ACJGiwAiRrcAIkb3ACJHGwAiRycAIkdDACJHewAiR5sAIkezACJH1wAiR+8AIkgHACJIHwAiSDcAIkhPACJIZwAiSHsAIkizACJI2wAiSRsAIklHACJJjwAiSbsAIknnACJKEwAiSksAIkpzACJKkwAiSsMAIkr3ACJK/wAiSwcAIktbACJLhwAiS98AIk0HACJNdwAiTccAIk4HACJOWwAiTrMAIk/LACJQMwAiUF8AIlCTACJQxwAiUQ8AIlFLACJRjwAiUd8AIlJ7ACJS8wAiUyMAIlNnACJTfwAiU7cAIlPbACJUMwAiVGsAIlSzACJU/wAiVZ8AIlXfACJWPwAiVqMAIlcHACJXMwAiV18AIlerACJX8wAiWEsAIlhrACJYtwAiWOcAIlkLACJZNwAiWWMAIlmTACJZvwAiWfsAIlorACJajwAiWscAIlsHACJbNwAiW2MAIlxDACJcgwAiXK8AIlzrACJdFwAiXTcAIl13ACJdmwAiXd8AIl4rACJeWwAiXpMAIl6/ACJe2wAiXxcAIl+TACJfxwAiX+8AImBDACJgnwAiYTsAImGvACJh1wAiYe8AImITACJiQwAiYmsAImKXACJiowAiYq8AImLrACJjJwAiY2sAImOrACJj9wAiZEsAImSXACJk4wAiZRMAImVDACJlcwAiZa8AImXfACJmBwAiZlMAImaTACJm0wAiZycAImc3ACJnjwAiZ6MAImfbACJn+wAiaDMAImhrACJonwAiaM8AImkDACJpXwAiaa8AImoDACJqIwAiak8AImqDACJqrwAiavsAImtbACJrgwAia7MAImvrACJsJwAibG8AImy3ACJs6wAibSMAIm1nACJtqwAibdcAIm4bACJuUwAiboMAIm7LACJu+wAibxsAIm8/ACJvWwAib48AIm+3ACJvzwAicB8AInA7ACJwTwAicLMAInDTACJw7wAicQsAInErACJxQwAicdMAInH7ACJyKwAicl8AInKbACJytwAict8AInMrACJzWwAic8MAInP3ACJ0EwAidC8AInRbACJ0iwAidKsAInTrACJ1AwAidTMAInVfACJ1bwAidY8AInWzACJ12wAidgMAInajACJ2zwAidw8AIncvACJ3XwAid3sAInejACJ3uwAid9cAInhXACJ4ZwAieVsAInmDACJ5rwAiedcAInn7ACJ6DwAielsAInqLACJ65wAiexsAIns/ACJ7cwAie6cAInvjACJ8BwAifDsAInxrACJ9AwAiffcAIn4rACJ+1wAifxsAIn/XACJ/9wAigJsAIoC/ACKA1wAigN8AIoDzACKBKwAigYMAIoG7ACKCAwAigksAIoJbACKCdwAigrsAIoL7ACKDQwAig4cAIoOXACKD5wAihF8AIoSDACKEpwAihMsAIoUPACKFNwAihYMAIoXDACKGJwAihm8AIobbACKHDwAih0cAIoejACKH5wAiiE8AIoirACKJKwAiiYcAIooHACKKawAiivMAIoszACKLgwAii/MAIowvACKMiwAijMMAIo0bACKNYwAijcsAIo4LACKOawAijqcAIo73ACKPZwAij4cAIo/HACKQJwAikHMAIpDfACKQ/wAikT8AIpF/ACKRzwAikesAIpIPACKSLwAikksAIpJ3ACKSqwAikssAIpL7ACKTGwAik0MAIpN7ACKTmwAik8MAIpP7ACKULwAilD8AIpRTACKUZwAilHsAIpSPACKUpwAilL8AIpTXACKU7wAilQMAIpUTACKVSwAilWMAIpWzACKVzwAilgcAIpYrACKWawAilp8AIpbHACKW/wAilxcAIpczACKXRwAil3MAIpeTACKXwwAil+8AIpgrACKYNwAimF8AIpiPACKYzwAimQcAIpkrACKZZwAimYsAIpmzACKZ1wAimgMAIpo3ACKaewAimrcAIprnACKbNwAim4sAIpvXACKcGwAinGcAIpy3ACKdDwAinWsAIp2vACKd4wAinhsAIp4vACKeTwAinm8AIp6PACKe7wAin0cAIp+LACKfywAioAsAIqBPACKgYwAioJcAIqCvACKg0wAioO8AIqEPACKhGwAioUMAIqFnACKhrwAiodcAIqHfACKh+wAiohsAIqKHACKiqwAiotsAIqMTACKjPwAio3sAIqOTACKjzwAipA8AIqRPACKkbwAipJsAIqS7ACKk/wAipUMAIqVrACKlmwAipdcAIqX7ACKmOwAipm8AIqbbACKnEwAipzMAIqdDACKnewAip8MAIqgXACKoWwAiqKsAIqkbACKpXwAiqacAIqnzACKqCwAiqksAIqqHACKq1wAiqxMAIqt/ACKr+wAirGMAIqyvACKs+wAirTMAIq1bACKtowAirdsAIq43ACKuiwAirtcAIq8HACKvMwAir6cAIrAPACKwYwAisK8AIrEnACKxLwAisWcAIrGDACKxzwAise8AIrI/ACKyswAis08AIrN3ACKzywAis/8AIrRfACK0mwAitQMAIrVDACK1rwAitfMAIrZjACK2dwAitrsAIrb/ACK3bwAit5MAIrfjACK4EwAiuG8AIriTACK44wAiuSsAIrmfACK5ywAiuiMAIrpTACK6swAiuvMAIrtfACK7gwAiu9cAIrv7ACK8SwAivJMAIr0DACK9OwAivZ8AIr4TACK+rwAivusAIr9TACK/cwAiv8MAIr/TACLAEwAiwE8AIsC3ACLBAwAiwXsAIsHbACLCXwAiwq8AIsMjACLDewAiw/sAIsR3ACLFFwAixV8AIsXTACLGEwAixn8AIsbTACLHTwAix4sAIsfzACLIHwAiyHcAIsjDACLJOwAiyXcAIsnfACLKRwAiytMAIstHACLL3wAizDcAIsx7ACLMqwAizNsAIs1LACLN8wAizicAIs4vACLOTwAizmsAIs6rACLO5wAizxsAIs9HACLPYwAiz2sAIs9zACLPlwAiz/MAItAjACLQXwAi0I8AItCzACLQ1wAi0PcAItEnACLRXwAi0WcAItHbACLSEwAi0lsAItKPACLSwwAi0vsAItMzACLTdwAi06cAItPPACLT8wAi1F8AItSXACLUxwAi1QsAItVPACLVewAi1asAItXTACLWPwAi1m8AItazACLW9wAi1yMAItdXACLXnwAi19cAIthbACLYowAi2NcAItkbACLZXwAi2YMAItmfACLZtwAi2gcAItqLACLbIwAi26MAItv3ACLcfwAi3T8AIt3HACLeYwAi3ucAIt8zACLfgwAi39MAIt//ACLgKwAi4HsAIuDPACLhSwAi4g8AIuKzACLjQwAi45MAIuQPACLkswAi5UMAIuVTACLltwAi5dsAIuYDACLmHwAi5lcAIuZfACLmqwAi5r8AIubXACLm7wAi5wcAIucfACLnNwAi50MAIudPACLnWwAi52cAIudzACLniwAi56MAIue3ACLn9wAi5/8AIugrACLoVwAi6I8AIumbACLqmwAi64cAIuvvACLsNwAi7EMAIuyjACLtBwAi7S8AIu33ACLuQwAi7lMAIu5bACLuqwAi7t8AIu8LACLvQwAi72MAIu+zACLwFwAi8LcAIvDrACLxOwAi8X8AIvGbACLxuwAi8dcAIvILACLyRwAi8qMAIvLjACLy7wAi8xcAIvM/ACLznwAi8/MAIvRnACL0uwAi9QcAIvUrACL1SwAi9dcAIvaDACL2wwAi9uMAIvcLACL3VwAi95sAIvf7ACL4EwAi+CsAIvhDACL4twAi+OMAIvkvACL5nwAi+c8AIvozACL6uwAi+vcAIvsnACL7YwAi+6sAIvvrACL8IwAi/F8AIvybACL88wAi/ScAIv17ACL95wAi/icAIv5HACL+jwAi/tsAIv8HACL/bwAi/6cAIv/bACL/9wAjAFsAIwDXACMBDwAjAUcAIwHHACMCAwAjAh8AIwJTACMChwAjAtMAIwM3ACMDnwAjA8cAIwPbACMD+wAjBCsAIwRTACMEZwAjBIsAIwSjACMEywAjBPcAIwUzACMFcwAjBYsAIwWvACMF2wAjBhMAIwYnACMGYwAjBpsAIwa7ACMG2wAjBwsAIwcvACMHfwAjB8cAIwfzACMIJwAjCE8AIwhjACMIfwAjCK8AIwjXACMI9wAjCRsAIwljACMJqwAjCfcAIworACMKdwAjCs8AIwr7ACMLIwAjCz8AIwtrACMLrwAjC+sAIwwfACMMawAjDL8AIw0TACMNbwAjDasAIw3LACMN4wAjDf8AIw4TACMOJwAjDksAIw5vACMOlwAjDr8AIw7vACMPKwAjD2cAIw+zACMP9wAjECcAIxBLACMQewAjEKsAIxEPACMR4wAjEhsAIxJvACMSrwAjEscAIxL/ACMTFwAjEzsAIxN7ACMTmwAjE9cAIxQLACMUWwAjFKMAIxTvACMViwAjFkMAIxaLACMW3wAjF08AIxg3ACMYRwAjGJMAIxjnACMZKwAjGY8AIxmjACMZ1wAjGfcAIxpfACMa1wAjG3cAIxunACMb3wAjHF8AIxzfACMdBwAjHUcAIx1fACMdowAjHdMAIx4jACMeWwAjHnsAIx67ACMfBwAjHzMAIx9zACMfswAjH98AIx/7ACMgIwAjIE8AIyB/ACMgpwAjIQsAIyFvACMh3wAjIlsAIyLnACMjKwAjI5sAIyPPACMj9wAjJB8AIyRLACMkbwAjJMMAIyTrACMlFwAjJU8AIyVrACMlkwAjJbsAIyXbACMmAwAjJisAIyY/ACMmZwAjJo8AIybPACMnPwAjJ1MAIyd7ACMnmwAjJ8MAIygDACMoMwAjKHsAIyifACMo0wAjKPcAIylLACMpVwAjKZMAIymnACMpuwAjKc8AIynnACMp/wAjKicAIyprACMqgwAjKrsAIyrTACMq6wAjKxcAIysjACMrKwAjKzMAIytfACMrowAjK78AIyvzACMsDwAjLC8AIyxbACMsgwAjLKcAIyzPACMtDwAjLScAIy1DACMtUwAjLV8AIy1zACMtiwAjLZMAIy2vACMtwwAjLesAIy4vACMuPwAjLncAIy6TACMuqwAjLtMAIy7jACMvAwAjLxMAIy8zACMvQwAjL2MAIy93ACMvmwAjL68AIy/TACMv5wAjMAsAIzAfACMwQwAjMFMAIzBzACMwkwAjMKcAIzCzACMwvwAjMNsAIzDnACMw8wAjMQMAIzETACMxIwAjMTMAIzFjACMxkwAjMeMAIzHzACMyOwAjMlsAIzKfACMy9wAjMzMAIzODACMz6wAjNCcAIzRXACM0owAjNM8AIzTzA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CP+8wAj/xcAI/9rACP/pwAj/98AJAATACQAbwAkANcAJAE3ACQB8wAkAksAJAJTACQDawAkA88AJATjACQFQwAkBncAJAb3ACQIEwAkCHsAJAmTACQJ9wAkCxMAJAt7ACQMkwAkDPcAJA4TACQOewAkD5MAJA/3ACQRFwAkEYMAJBKrACQTHwAkFEcAJBS7ACQV2wAkFkcAJBdnACQX0wAkF/MAJBgTACQYMwAkGFMAJBh/ACQYqwAkGNMAJBj7ACQZJwAkGT8AJBlbACQZewAkGbcAJBnXACQZ+wAkGhsAJBo/ACQaawAkGr8AJBrjACQbAwAkG2MAJBuvACQb3wAkHAsAJBw7ACQcewAkHJMAJBy3ACQc5wAkHRcAJB1LACQdgwAkHasAJB3fACQd5wAkHicAJB5jACQejwAkHpcAJB6/ACQfBwAkHysAJB8/ACQfgwAkH68AJB/jACQgEwAkIEsAJCB3ACQgtwAkIQMAJCFHACQhlwAkIcsAJCIHACQiTwAkIo8AJCK3ACQi8wAkIzsAJCN7ACQjswAkJAsAJCRTACQkmwAkJK8AJCTDACQk2wAkJQ8AJCU/ACQliwAkJe8AJCY3ACQmSwAkJnMAJCc7ACQnWwAkJ5MAJChbACQoqwAkKOsAJClvACQqMwAkKlcAJCqbACQquwAkKvMAJCszACQrmwAkLBsAJCxDACQsWwAkLKsAJC0bACQtawAkLgcAJC5nACQuswAkLyMAJC8vACQvawAkL6sAJDAPACQwVwAkMIsAJDCjACQwvwAkMQcAJDEvACQxgwAkMe8AJDH7ACQyHwAkMlcAJDJ/ACQy4wAkMvMAJDMfACQzYwAkM58AJDO7ACQz4wAkNE8AJDTLACQ1AwAkNQ8AJDVXACQ1gwAkNaMAJDWvACQ1wwAkNhMAJDZbACQ2dwAkNrsAJDbvACQ29wAkNzcAJDdbACQ3ZwAkN4sAJDe7ACQ31wAkOCcAJDg/ACQ4owAkOMsAJDkXACQ5OwAkOXcAJDm3ACQ5wwAkOesAJDoTACQ6UwAkOo8AJDqnACQ6vwAkOtMAJDr/ACQ7NwAkO2cAJDuTACQ7zwAkO+MAJDwfACQ8ZwAkPP8AJD0jACQ91wAkPesAJD4LACQ+JwAkPksAJD5vACQ+fwAkPqMAJD7DACQ+7wAkP5MAJD+rACRATwAkQHMAJEFDACRB1wAkQjsAJEJ3ACRCmwAkQsMAJELnACRDDwAkQ08AJEPbACREiwAkRLMAJETbACRFAwAkRTMAJEV/ACRFlwAkRccAJEYzACRGZwAkRp8AJEbLACRG4wAkRvcAJEcHACRHHwAkRy8AJEePACRH5wAkSCcAJEhnACRIpwAkSOsAJEk3ACRJlwAkSf8AJEpfACRKtwAkSxcAJEtbACRLowAkS/MAJEwXACRMVwAkTKsAJEyzACRNBwAkTUcAJE2PACRNrwAkTh8AJE5rACROjwAkTuMAJE8HACRPMwAkT2MAJE9zACRPswAkT9sAJFCjACRQwwAkUYMAJFHLACRR3wAkUg8AJFI/ACRSawAkUuMAJFNHACRTZwAkU78AJFP/ACRUFwAkVF8AJFSPACRU1wAkVScAJFWHACRV5wAkVjMAJFaXACRW6wAkV0MAJFd3ACRXywAkV+8AJFhPACRYewAkWL8AJFknACRZhwAkWccAJFonACRaawAkWoMAJFq3ACRazwAkWvMAJFubACRcXwAkXLMAJFzTACRdRwAkXVMAJF1vACRdowAkXdcAJF4DACReLwAkXpsAJF6nACRfLwAkX6cAJF/rACRgYwAkYMMAJGEbACRh4wAkYmMAJGKfACRi9wAkY28AJGPzACRkYwAkZJ8AJGTfACRk6wAkZPcAJGVDACRlbwAkZYsAJGWfACRl+wAkZjMAJGafACRmywAkZxMAJGeHACRnwwAkZ/8AJGh3ACRoywAkaPMAJGk3ACRpewAkadcAJGoXACRqWwAkancAJGqfACRqxwAkaucAJGsHACRrawAka8sAJGv7ACRsHwAkbDcAJGyPACRsswAkbQMAJG0/ACRtZwAkbZMAJG27ACRt8wAkbkMAJG6XACRuxwAkbxMAJG9XACRvowAkb+sAJHAnACRwewAkcL8AJHEDACRxXwAkcZ8AJHHjACRyfwAkcuMAJHNDACRzjwAkc9sAJHQzACR0XwAkdIcAJHS7ACR03wAkdQMAJHU/ACR1XwAkdYMAJHXHACR2BwAkdisAJHZrACR2hwAkdscAJHbPACR3CwAkdy8AJHdnACR3hwAkd78AJHf3ACR4HwAkeDsAJHhbACR4jwAkeLMAJHjHACR45wAkeT8AJHmPACR5qwAkebcAJHnnACR6MwAkemsAJHrDACR62wAkexMAJHtPACR7owAke/MAJHyvACR83wAkfW8AJH2DACR9rwAkfoMAJH8LACR/PwAkf+8AJIBbACSAjwAkgMMAJID3ACSBHwAkgV8AJIIXACSCxwAkgwsAJINDACSDVwAkg2sAJIODACSDtwAkg/sAJIQrACSEbwAkhJMAJITDACSE8wAkhT8AJIVzACSFkwAkhdMAJIYnACSGWwAkhncAJIaLACSGwwAkhyMAJIefACSIMwAkiD8AJIibACSIpwAkiMsAJIjXACSI+wAkiQcAJIkvACSJPwAkiXMAJImTACSJtwAkic8AJInnACSKEwAkij8AJIpTACSKawAkio8AJIq3ACSK5wAkixcAJItPACSLiwAki8sAJIwHACSMKwAkjGcAJIyfACSMuwAkjNsAJIzzACSNIwAkjWMAJI2vACSNzwAkjj8AJI5jACSOgwAkjqsAJI7PACSPKwAkj5MAJI//ACSQcwAkkMsAJJEnACSRXwAkkYMAJJGnACSR2wAkkhcAJJI3ACSSYwAkkmsAJJKbACSTFwAkkzcAJJNbACSTjwAkk7sAJJPnACSUIwAklEsAJJRrACSUlwAklN8AJJUPACSVNwAklWcAJJWvACSWGwAklksAJJaLACSXBwAkly8AJJePACSXxwAkl/sAJJgnACSYawAkmIcAJJizACSZDwAkmVcAJJl7ACSZrwAkmdcAJJn3ACSaIwAkmj8AJJqLACSauwAkmxsAJJs7ACSbiwAkm9cAJJw3ACScfwAknMMAJJznACSdIwAknUsAJJ13ACSeEwAknmsAJJ6zACSexwAknusAJJ8jACSfQwAkn5MAJJ/zACSgIwAkoJMAJKDHACShEwAkoXsAJKHjACSiCwAkooMAJKKzACSi5wAko0MAJKPPACSkUwAkpH8AJKSjACSkswAkpN8AJKUnACSlXwAkpZ8AJKXrACSmFwAkplMAJKaPACSmxwAkpwcAJKdXACSntwAkqAcAJKhfACSorwAkqOMAJKkvACSpfwAkqd8AJKpDACSqjwAkqvsAJKtbACSrtwAkq/sAJKwzACSsfwAkrOMAJK03ACStnwAkrgcAJK5TACSuuwAkrxcAJK+HACSvrwAkr8sAJK//ACSwVwAksOMAJLFHACSyDwAkspsAJLLXACSzFwAks58AJLPfACS0QwAktM8AJLUnACS1pwAkthcAJLavA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CVgrwAlYN8AJWE7ACVhbwAlYacAJWILACViRwAlYocAJWLzACVjFwAlYzcAJWNjACVjjwAlY8MAJWP3ACVkKwAlZIMAJWTbACVlBwAlZUcAJWWHACVlswAlZdcAJWYDACVmTwAlZpsAJWbDACVnGwAlZ2sAJWfLACVn4wAlZ/8AJWgnACVoRwAlaHMAJWiTACVouwAlaNsAJWj3ACVpTwAlaZMAJWm/ACVqDwAlajsAJWqLACVqtwAlawcAJWsjACVrYwAla6MAJWvXACVsFwAlbDMAJWxzACVs1wAlbV8AJW3/ACVuSwAlbnMAJW83ACVv1wAlcBcAJXCLACVwvwAlcPMAJXEvACVx7wAlctcAJXL/ACVzlwAlc7MAJXPvACV0GwAldE8AJXR/ACV0iwAldOsAJXU/ACV1XwAldZMAJXWzACV11wAldfcAJXYnACV2VwAldpcAJXbLACV26wAldxcAJXcnACV3RwAld2sAJXevACV30wAleDMAJXhvACV4kwAleLMAJXjvACV5KwAleU8AJXmDACV52wAlemMAJXq3ACV6zwAlet8AJXsfACV7MwAle3cAJXuPACV71wAle/sAJXwjACV8dwAlfLMAJXz3ACV9YwAlfYMAJX2bACV94wAlfgcAJX4rACV+fwAlfrcAJX7zACV/WwAlf58AJX/nACWAWwAlgIMAJYCjACWA0wAlgRMAJYFPACWBmwAlgcsAJYILACWCRwAlgpMAJYKzACWC3wAlgxsAJYNPACWDjwAlg78AJYPzACWEIwAlhF8AJYSPACWEswAlhNMAJYTrACWFEwAlhTsAJYVnACWFkwAlhc8AJYYDACWGPwAlhlcAJYZ3ACWGtwAlht8AJYcHACWHTwAlh58AJYe7ACWH4wAliAsAJYhXACWIawAliJcAJYi7ACWI4wAliPcAJYlPACWJpwAlidMAJYpLACWKkwAlir8AJYrrACWLJwAli1MAJYuPACWL1wAljAMAJYxHACWMgwAljN8AJY0LACWNJwAljVMAJY2PACWN4wAljfcAJY4bACWOqwAljusAJY9jACWPnwAlj+sAJZBXACWQiwAlkM8AJZDnACWRPwAlkX8AJZHPACWSRwAlkssAJZL/ACWTQwAlk7MAJZPzACWUQwAllNMAJZT3ACWVHwAllVcAJZWPACWV/wAllh8AJZZbACWWgwAllxsAJZc3ACWXZwAll7cAJZf7ACWYXwAlmJ8AJZjPACWY9wAlmUcAJZmXACWZ9wAlmlMAJZp3ACWanwAlmuMAJZsfACWbSwAlm4cAJZvDACWcAwAlnHsAJZy7ACWc9wAlnT8AJZ17ACWdrwAlnd8AJZ4XACWeHwAlnksAJZ5/ACWeqwAln0cAJZ+XACWfpwAln+cAJaALACWgLwAloIMAJaCTACWg0wAloPcAJaETACWhMwAloWMAJaGXACWhywAloe8AJaIPACWiUwAloncAJaKbACWiuwAlov8AJaMTACWjTwAlo5sAJaPrACWkOwAlpHsAJaSjACWk4wAlpQ8AJaUbACWlJwAlpTMAJaU/ACWlSwAlpVcAJaVjACWlbwAlpYsAJaWnACWlywAlpjcAJaaPACWmwwAlpwsAJaczACWnpwAlp9MAJafvACWoFwAlqCsAJag/ACWozwAlqP8AJak/ACWpdwAlqhMAJapHACWqhwAlqscAJasPACWrPwAlq6cAJav/ACWsQwAlrGMAJax7ACWsowAlrLsAJazjACWtGwAlrUMAJa1/ACWttwAlrecAJa4nACWuawAlrr8AJa8jACWvQwAlr18AJa9zACWvuwAlsFMAJbCDACWwuwAlsPcAJbE/ACWxXwAlsYcAJbG7ACWyJwAlspsAJbLXACWy7wAlszcAJbNPACWzZwAls68AJbPHACW0DwAltB8AJbQvACW0bwAltKsAJbTvACW1GwAltTMAJbWHACW14wAltjcAJbZvACW2ywAltxMAJbdnACW3wwAluA8AJbhjACW4bwAluLcAJbjfACW5LwAlugcAJbrDACW7EwAlu1MAJbuPACW7ywAlu98AJbv7ACW8GwAlvEcAJbxbACW8iwAlvP8AJb0zACW9qwAlvdMAJb4/ACW+bwAlvuMAJb7/ACW/KwAlv5sAJb/LACXAPwAlwLMAJcDvACXA+wAlwSMAJcFvACXBnwAlweMAJcIHACXCXwAlwo8AJcKzACXC2wAlwvsAJcMfACXDYwAlw4cAJcOvACXD1wAlxBcAJcRHACXEbwAlxJMAJcTLACXFEwAlxWMAJcWHACXFxwAlxf8AJcY3ACXGkwAlxt8AJccjACXHdwAlx8MAJcfrACXH9wAlyB8AJcgrACXIVwAlyH8AJciXACXIvwAlyQcAJclHACXJawAlyXMAJcmfACXJ7wAlyicAJcpXACXKhwAlyrcAJcrzACXLKwAly3cAJcvHACXL5wAlzDcAJczTACXNTwAlzX8AJc3HACXODwAlzjsAJc5fACXOnwAlzxcAJc8/ACXPcwAlz6MAJc/PACXP9wAl0B8AJdBHACXQbwAl0I8AJdCvACXRDwAl0TMAJdFjACXRnwAl0c8AJdIXACXSVwAl0qMAJdLjACXTLwAl01MAJdODACXTtwAl09cAJdQHACXUOwAl1HMAJdSrACXU4wAl1RsAJdU7ACXVbwAl1Y8AJdWvACXV3wAl1i8AJdZ7ACXWtwAl1vMAJdcvACXXewAl18MAJdgHACXYSwAl2IcAJdjHACXZCwAl2TMAJdlfACXZhwAl2a8AJdnXACXZ6wAl2gcAJdpfACXa1wAl2x8AJdtnACXbwwAl3BMAJdx3ACXctwAl3N8AJd0LACXdJwAl3VsAJd2jACXd6wAl3i8AJd5vACXevwAl3w8AJd9rACXflwAl38sAJeAPACXgOwAl4HcAJeCXACXg4wAl4RsAJeFnACXhswAl4esAJeIrACXihwAl4r8AJeLfACXi+wAl4w8AJeMrACXjPwAl42MAJeN/ACXjkwAl458AJePDACXj3wAl5CcAJeRPACXkiwAl5OMAJeUXACXlXwAl5asAJeaPACXmswAl5usAJecvACXnbwAl56MAJee3ACXnywAl6DcAJeiPACXo7wAl6WsAJenDACXp7wAl6ksAJeqXACXrEwAl62MAJeuzACXsIwAl7G8AJeybACXs5wAl7QMAJe0vACXtkwAl7ccAJe3nACXuIwAl7nMAJe6jACXu0wAl7x8AJe9PACXvmwAl77MAJe/nACXv9wAl8CMAJfBTACXwpwAl8OsAJfEXACXxMwAl8XsAJfGnACXx/wAl8icAJfI/ACXyfwAl8scAJfL3ACXzKwAl84sAJfOrACXzywAl9BsAJfRfACX0qwAl9R8AJfU7ACX1VwAl9YsAJfWjACX1uwAl9dMAJfXrACX2BwAl9iMAJfY7ACX2UwAl9m8AJfaLACX2pwAl9sMAJfbbACX28wAl9wsAJfcjACX3PwAl91sAJfd3ACX3kwAl968AJffLACX35wAl+AMAJfgfACX4OwAl+FcAJfhzACX4jwAl+KsAJfjHACX44wAl+P8AJfkbACX5NwAl+VMAJflvACX5iwAl+acAJfnDACX53wAl+fsAJfoTACX6KwAl+kcAJfpjACX6fwAl+psAJfq/ACX64wAl+v8AJfsbACX7OwAl+1sAJft3ACX7kwAl+6sAJfvDACX8CwAl/FMAJfyfACX85wAl/TMAJf1/ACX9xwAl/g8AJf5bACX+pwAl/vMAJf8/ACX/iwAl/9cAJgAjACYAbwAmALsAJgEHACYBUwAmAZ8AJgHrACYCMwAmAn8AJgLLACYDHwAmA2sAJgO7ACYEBwAmBE8AJgSLACYEtwAmBPsAJgU7ACYFdwAmBb8AJgXvACYGNwAmBn8AJgavACYHAwAmByMAJgdLACYHiwAmB7sAJgf7ACYIGwAmCEcAJgh3ACYIpwAmCOMAJgkfACYJUwAmCXcAJgmfACYKBwAmCm8AJgrTACYLPwAmC38AJgu7ACYL9wAmDCcAJgxjACYMowAmDN8AJg0fACYNSwAmDZMAJg3fACYOEwAmDlsAJg53ACYOowAmDucAJg8rACYPcwAmD58AJg/PACYQAwAmED8AJhB3ACYQqwAmEN8AJhEjACYRVwAmEdMAJhIzACYScwAmEqMAJhNTACYTkwAmE9sAJhQXACYUSwAmFPMAJhWbACYV9wAmFj8AJhcbACYXiwAmF8cAJhibACYZdwAmGd8AJhn7ACYaJwAmGuMAJhsTACYbRwAmG3sAJhunACYb1wAmHG8AJh0fACYdRwAmHZcAJh37ACYeNwAmHmcAJh6fACYe1wAmHucAJh8DACYfJwAmH0MAJh9/ACYfrwAmH9cAJiAHACYgLwAmIFMAJiBrACYgjwAmIKsAJiDfACYhDwAmIVcAJiGnACYh4wAmIhcAJiJ/ACYiuwAmIvMAJiO/ACYkewAmJKcAJiVLACYldwAmJZcAJiXLACYmAwAmJk8AJiZfACYmbwAmJoMAJibDACYm1wAmJxcAJicjACYnXwAmJ3MAJierACYoBwAmKFsAJiiXACYozwAmKS8AJilnACYpxwAmKesAJio3ACYqWwAmKqcAJirnACYrHwAmK5cAJivLACYsBwAmLDcAJixzACYsjwAmLNsAJizrACYtKwAmLWsAJi2bACYtwwAmLe8AJi5HACYuhwAmLscAJi7/ACYvLwAmL3MAJi+bACYwCwAmMDMAJjCjACYw3wAmMWMAJjGTACYyCwAmMk8AJjLbACYzBwAmM3sAJjOnACY0GwAmNFcAJjSLACY03wAmNVcAJjVzACY1kwAmNb8AJjXjACY2OwAmNl8AJja3ACY21wAmNvcAJjczACY3awAmN5MAJje/ACY4FwAmOC8AJjh3ACY4wwAmORMAJjl3ACY5ywAmOgMAJjonACY6PwAmOl8AJjqTACY6rwAmOs8AJjsTACY77wAmPEMAJjybACY8ywAmPO8AJj0XACY9KwAmPTcAJj1bACY9nwAmPc8AJj4TACY+NwAmPnsAJj6rACY+7wAmPycAJj9zACY/owAmP9sAJj/jACY/6wAmQBcAJkA3ACZAVwAmQNcAJkGPACZCDwAmQo8AJkNHACZDxwAmRD8AJkSzACZE3wAmRPcAJkUnACZFWwAmRccAJkYHACZGXwAmRqMAJkbzACZHIwAmR18AJkefACZH0wAmSAsAJkhHACZIiwAmSMMAJkkDACZJMwAmSVMAJkl3ACZJlwAmSbcAJkoHACZKFwAmSlcAJkqbACZKxwAmSvMAJks3ACZLpwAmS/sAJky/ACZNDwAmTbcAJk3jACZOLwAmTosAJk7DACZO2wAmTzcAJk+vACZP4wAmUDsAJlCnACZRAwAmUTMAJlGLACZR9wAmUkcAJlKPACZSzwAmUy8AJlNvACZTuwAmVBcAJlR7ACZU1wAmVOcAJlT3ACZVNwAmVUcAJlWHACZV6wAmVlMAJla/ACZXNwAmV8cAJlfvACZYMwAmWGsAJlijACZZAwAmWVMAJlmjACZZ+wAmWk8AJlpvACZakwAmWrcAJlrvACZbKwAmW5MAJlvPACZcFwAmXF8AJly7ACZdHwAmXUcAJl27ACZd9wAmXisAJl5jACZekwAmXscAJl8DACZfVwAmX48AJl/HACZgTwAmYMcAJmEjACZhbwAmYcMAJmIXACZiPwAmYpcAJmNXACZjawAmY/MAJmS3ACZk5wAmZQsAJmUnACZlRwAmZXsAJmWvACZl3wAmZoMAJmbTACZnBwAmZ0cAJmd7ACZnuwAmZ9cAJmgTACZoOwAmaIcAJmirACZouwAmaOcAJmkLACZpRwAmaX8AJmmrACZp3wAmagsAJmpHACZqdwAmaqsAJmrjACZrAwAmaz8AJmtfACZrgwAma6MAJmvPACZr/wAmbCsAJmxPACZsiwAmbMMAJmzvACZtNwAmbXcAJm2bACZtuwAmbhMAJm5PACZudwAmbp8AJm7LACZu9wAmbz8AJm9TACZvhwAmb8MAJm/vACZwKwAmcGMAJnB7ACZwvwAmcPcAJnEfACZxVwAmcX8AJnG3ACZybwAmcrcAJnMTACZzPwAmc2cAJnOPACZztwAmc+8AJnQnACZ0MwAmdFcAJnSLACZ0vwAmdOsAJnUHACZ1VwAmdXMAJnW/ACZ2CwAmdk8AJnaXACZ21wAmdxsAJndXACZ3hwAmd7cAJnfjACZ3/wAmeEcAJniTACZ40wAmeQsAJnlTACZ5fwAmeZMAJnnrACZ6HwAmeicAJnpnACZ6uwAmesMAJnrLACZ67wAmew8AJntPACZ7fwAme7sAJnvjACZ8DwAmfDMAJnw7ACZ8+wAmfS8AJn1TACZ9cwAmfaMAJn3rACZ+GwAmfjsAJn53ACZ+uwAmfuMAJn7/ACZ/LwAmf18AJn+HACZ/pwAmf9MAJoADACaAWwAmgI8AJoDHACaBAwAmgTMAJoFXACaBdwAmgZ8AJoHXACaB8wAmggcAJoInACaCXwAmgm8AJoKXACaCtwAmgusAJoMHACaDGwAmg0cAJoO/ACaD8wAmhB8AJoQvACaEYwAmhI8AJoSnACaE3wAmhQsAJoUvACaFSwAmhWcAJoWfACaF1wAmhg8AJoZTACaGhwAmhqMAJobbACaG7wAmhwcAJocPACaHKwAmh0MAJoeLACaHzwAmh9cAJoffACaH5wAmh+8AJof3ACaH/wAmiBsAJohfACaIhwAmiK8AJokHACaJOwAmiUsAJolnACaJlwAmib8AJonLACaJ2wAmif8AJooLACaKFwAmijMAJopHACaKfwAmiqMAJorDACaKywAmitMAJor7ACaLdwAmi48AJou7ACaL4wAmi/8AJoxrACaM9wAmjS8AJo17ACaNuwAmje8AJo4LACaOHwAmjksAJo5bACaOawAmjocAJo6PACaOrwAmjscAJo7/ACaPHwAmj0cAJo9nACaPjwAmj5sAJo+3ACaPzwAmj/sAJpA7ACaQewAmkJcAJpCzACaQuwAmkNsAJpD3ACaREwAmkS8AJpFLACaRZwAmkZMAJpG/ACaR6wAmkhcAJpIzACaSTwAmkmsAJpKHACaSrwAmkzsAJpNHACaTbwAmk7MAJpPbACaUAwAmlEMAJpRjACaUhwAmlMMAJpTvACaVCwAmlVMAJpVvACaVgwAmlaMAJpWzACaVuwAmlfsAJpYnACaWVwAmlq8AJpbPACaW4wAmlyMAJpeLACaXqwAml+MAJpf3ACaYLwAmmEsAJph3ACaYmwAmmM8AJpjvACaZHwAmmUMAJpl3ACaZkwAmmaMAJpmzACaZuwAmmcMAJpnfACaaOwAmmmsAJpqzACabBwAmmzMAJptbACabkwAmm68AJpvrACacGwAmnEMAJpyDACacrwAmnQ8AJp1LACadjwAmnbcAJp3HACad7wAmnhcAJp4/ACaefwAmnqcAJp7DACae9wAmnx8AJp9fACafpwAmn78AJp/vACagKwAmoH8AJqCvACag9wAmoTMAJqFvACahqwAmofsAJqJDACailwAmovMAJqNnACajtwAmpAcAJqRDACakVwAmpGcAJqSXACakxwAmpPcAJqUjACalXwAmpY8AJqW/ACal+wAmpgcAJqY/ACamfwAmptcAJqb7ACanUwAmp8MAJqgPACaoMwAmqIMAJqjrACao/wAmqRsAJqlTACapjwAmqesAJqorACaqhwAmqssAJqsfACarWwAmq5sAJqurACarvwAmq9sAJqv/ACasNwAmrGcAJqyTACas7wAmrTcAJq1vACatnwAmrccAJq3bACauQwAmrmsAJq6LACauvwAmrwcAJq8rACavSwAmr2sAJq+TACavtwAmr+8AJrAvACawZwAmsMsAJrDrACaxWwAmsbsAJrIXACayTwAmsn8AJrKzACay/wAmszMAJrNjACaztwAms9sAJrQ7ACa0kwAmtLsAJrTrACa1GwAmtV8AJrV7ACa10wAmtfMAJrZDACa2nwAmtvsAJrcvACa3TwAmt1sAJrd3ACa3jwAmt8MAJrffACa4JwAmuFsAJrjDACa47wAmuRMAJrlHACa5ewAmua8AJrnPACa6AwAmupMAJrsHACa7kwAmu/MAJrxbACa8wwAmvSMAJr1LACa9swAmvhsAJr5zACa/AwAmv0sAJr+PACa/1wAmwA8AJsBzACbA0wAmwTcAJsFzACbBywAmwgcAJsJfACbCtwAmww8AJsNnACbD0wAmxDcAJsSvACbFBwAmxUcAJsV7ACbF0wAmxesAJsYbACbGKwAmxlcAJsabACbGpwAmxrMAJsa/ACbGywAmxtcAJsbjACbG7wAmxvsAJscHACbHEwAmxx8AJscrACbHNwAmx0MAJsdPACbHWwAmx2cAJsdzACbHfwAmx4sAJseXACbHowAmx68AJse7ACbHxwAmx9MAJsffACbH6wAmx/cAJsgDACbIDwAmyBsAJsgnACbIMwAmyD8AJshLACbIVwAmyGMAJshvACbIewAmyIcAJsiTACbInwAmyKsAJsi3ACbIwwAmyM8AJsjbACbI5wAmyPMAJsj/ACbJCwAmyRcAJskjACbJLwAmyTsAJslHACbJUwAmyV8AJslrACbJdwAmyYMAJsmPACbJmwAmyacAJsmzACbJvwAmycsAJsnXACbJ4wAmye8AJsn7ACbKBwAmyhMAJsofACbKKwAmyjcAJspDACbKTwAmylsAJspnACbKcwAmyn8AJsqLACbKlwAmyqMAJsqvACbKuwAmyscAJsrTACbK2wAmyuMAJsrrACbK8wAmyvsAJssDACbLCwAmyw8AJssTACbLFwAmyxsAJssfACbLIwAmyycAJssrACbLMwAmyzsAJstDACbLSwAmy1MAJstbACbLYwAmy2sAJstzACbLewAmy4MAJsuLACbLkwAmy5sAJsujACbLqwAmy7MAJsu7ACbLwwAmy8sAJsvTACbL2wAmy+MAJsvrACbL8wAmy/sAJswDACbMCwAmzBMAJswbACbMIwAmzCsAJswzACbMOwAmzEMAJsxLACbMUwAmzFsAJsxjACbMawAmzHMAJsx7ACbMgwAmzIsAJsyTACbMmwAmzKMAJsyrACbMswAmzLsAJszDACbMywAmzNMAJszbACbM4wAmzOsAJszzACbM+wAmzQMAJs0LACbNEwAmzRsAJs0jACbNKwAmzTMAJs07ACbNQwAmzUsAJs1TACbNWwAmzWMAJs1rACbNcwAmzXsAJs2DACbNiwAmzZMAJs2bACbNowAmzasAJs2zACbNuwAmzcMAJs3LACbN0wAmzdsAJs3jACbN6wAmzfMAJs37ACbOHwAmzkMAJs5nACbO9wAmzysAJs9fACbPowAmz/cAJtADACbQKwAm0E8AJtCjACbQuwAm0P8AJtEnACbROwAm0c8AJtIHACbSPwAm0lsAJtJ3ACbSkwAm0qsAJtLTACbS/wAm0ycAJtNPACbTbwAm04cAJtOjACbT0wAm0/sAJtQrACbUVwAm1IMAJtS7ACbU0wAm1RcAJtVfACbVkwAm1eMAJtYrACbWiwAm1rcAJtcHACbXQwAm13MAJtfHACbX9wAm2CMAJthzACbZAwAm2UMAJtl3ACbZswAm2dMAJtn3ACbaWwAm2qcAJtrrACbbdwAm29MAJtwLACbcHwAm3GcAJtyPACbc6wAm3UMAJt2jACbeNwAm3mcAJt6fACberwAm3u8AJt8fACbfOwAm31MAJt9/ACbfnwAm38sAJuAXACbgLwAm4FcAJuB/ACbgpwAm4LMAJuDvACbhVwAm4X8AJuGrACbhxwAm4gsAJuJDACbidwAm4p8AJuLTACbjHwAm40sAJuOPACbj4wAm5B8AJuSDACbk0wAm5QsAJuVjACblrwAm5dsAJuY/ACbmiwAm5pcAJuanACbm8wAm5x8AJudLACbnhwAm57MAJufbACboEwAm6F8AJujnACbpGwAm6ZsAJunjACbqCwAm6lcAJupnACbqiwAm6sMAJusnACbrVwAm65MAJuvjACbsNwAm7LMAJuzbACbtDwAm7U8AJu2DACbtqwAm7dcAJu4HACbuOwAm7n8AJu7jACbvVwAm76cAJu/3ACbwQwAm8IsAJvCrACbwvwAm8N8AJvEjACbxYwAm8ZsAJvHrACbyLwAm8kcAJvKHACby9wAm8yMAJvN3ACbz8wAm9GMAJvSrACb02wAm9RcAJvV3ACb1qwAm9fMAJvYjACb2VwAm9p8AJvbnACb3FwAm918AJvenACb33wAm+AMAJvhDACb4gwAm+MMAJvkDACb5QwAm+YMAJvnDACb6AwAm+oMAJvsDACb7gwAm/AMAJvyDACb9AwAm/YMAJv2nACb95wAm/icAJv5nACb+pwAm/yMAJv+jACcAHwAnAJsAJwFTACcBlwAnAhcAJwJfACcC2wAnAxcAJwM/ACcDcwAnA38AJwObACcDqwAnA9MAJwPrACcEDwAnBD8AJwRbACcEfwAnBNcAJwU3ACcFywAnBhcAJwZLACcGgwAnBzsAJwebACcILwAnCIcAJwlfACcJtwAnCo8AJwq/ACcLIwAnCzsAJwtbACcLvwAnC/MAJwxHACcMWwAnDJsAJwy7ACcM8wAnDScAJw03ACcNdwAnDcMAJw4XACcOawAnDpMAJw6vACcPfwAnD88AJw/zACcQHwAnEDcAJxBPACcQbwAnEL8AJxDfACcRJwAnEW8AJxGjACcR1wAnEgMAJxIrACcSYwAnEpMAJxK/ACcS2wAnEx8AJxM3ACcTUwAnE3cAJxOXACcTrwAnE88AJxPnACcUEwAnFC8AJxRPACcUYwAnFHcAJxSHACcUlwAnFK8AJxTTACcU7wAnFQ8AJxUvACcVYwAnFcsAJxYLACcWOwAnFrcAJxebACcYOwAnGEsAJxhfACcYawAnGHsAJxiTACcYvwAnGOsAJxj3ACcZXwAnGccAJxofACcaRwAnGssAJxtDACcbUwAnG5cAJxv/ACccdwAnHMsAJx0PACcdswAnHjMAJx63ACcfWwAnH58AJx/LACcgBwAnIEsAJyCPACcg0wAnIP8AJyEvACchVwAnIYMAJyGnACch2wAnIesAJyH3ACciAwAnIg8AJyInACciXwAnIqMAJyLnACcjFwAnI0cAJyNvACcjowAnI/cAJyQPACckTwAnJH8AJySrACckywAnJQcAJyUvACclmwAnJdMAJyYbACcmVwAnJo8AJybHACcm5wAnJ0cAJyeLACcnvwAnJ/sAJygzACcoTwAnKLMAJyjHACcpCwAnKVsAJymTACcp0wAnKhcAJypjACcqgwAnKp8AJyrfACcq+wAnKw8AJys7ACcrSwAnK1cAJyt/ACcrrwAnK9cAJyvjACcsOwAnLF8AJyyHACcsrwAnLN8AJyzrACctIwAnLV8AJy17ACcthwAnLacAJy3nACcuEwAnLjcAJy5nACcuowAnLrcAJy7PACcu1wAnLt8AJy7nACcvDwAnL0MAJy9nACcvgwAnL8MAJy/fACcv6wAnMBcAJzBPACcwbwAnMNcAJzErACcxawAnMaMAJzHPACcyIwAnMncAJzLDACczCwAnM18AJzOrACcz8wAnNCsAJzRfACc0kwAnNLcAJzTrACc1CwAnNSMAJzU/ACc1YwAnNYcAJzWrACc1vwAnNfsAJzY3ACc2XwAnNqsAJzbnACc3HwAnN18AJzeDACc3vwAnN/cAJzgrACc4TwAnOH8AJzi/ACc47wAnORcAJzlXACc5YwAnOacAJznTACc5+wAnOkMAJzp3ACc6mwAnOusAJzsnACc7YwAnO4cAJzujACc74wAnPFMAJzzPACc9CwAnPTcAJz2nACc9/wAnPicAJz5vACc+3wAnPzcAJz+nACdACwAnQEcAJ0DXA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CgeJwAoHl8AKB6PACgewwAoHv8AKB8fACgfYwAoH68AKB/fACgf6wAoIBcAKCBHACggkwAoIMMAKCDTACgg+wAoIS8AKCFvACghmwAoIb8AKCILACgiZwAoIosAKCLXACgkDwAoJEsAKCSPACgk1wAoJRMAKCUbACglTwAoJh8AKCZXACgmgwAoJpsAKCa3ACgm2wAoJwsAKCc/ACgnYwAoJ4cAKCePACgnlwAoJ58AKCenACgntwAoJ/cAKCgjACgoMwAoKDsAKChDACgoSwAoKF8AKChnACgohwAoKJsAKCinACgoswAoKL8AKCjLACgo1wAoKOMAKCjvACgo+wAoKQcAKCkTACgpHwAoKSsAKCk3ACgpQwAoKU8AKClbACgpZwAoKXMAKCl/ACgphwAoKY8AKCmfACgppwAoKb8AKCnfACgp9wAoKhMAKCo3ACgqVwAoKm8AKCqPACgqpwAoKr8AKCr7ACgrBwAoKxMAKCsfACgrKwAoKzcAKCtDACgrhwAoK8MAKCvPACgr2wAoK+cAKCvzACgr/wAoLAsAKCwXACgsIwAoLC8AKCw7ACgsbwAoLJ8AKCzTACgtGwAoLU8AKC17ACgtnwAoLcMAKC3PACguDwAoLl8AKC5zACgunwAoLtcAKC73ACgvEwAoL0cAKC9nACgvgwAoL6sAKC/LACgv+wAoMBsAKDA7ACgwfwAoMLcAKDELACgxawAoMb8AKDIPACgyRwAoMlMAKDLPACgzAwAoMx8AKDMrACg0KwAoNGsAKDSTACg1bwAoNd8AKDbXACg2+wAoNz8AKDdfACg3fwAoN6sAKDfjACg4HwAoOGMAKDizACg4/wAoOYMAKDm7ACg6KwAoOlcAKDqDACg6owAoOtcAKDsbACg7MwAoO1cAKDt/ACg7qwAoO+MAKDxjACg8mwAoPR8AKD1PACg9qwAoPe8AKD5fACg+iwAoPscAKD8PACg/WwAoP4sAKD+7ACg/2wAoQAsAKEAnAChASwAoQJsAKEETAChBTwAoQZcAKEHjAChB/wAoQh8AKEJHAChCbwAoQpMAKEKvAChCzwAoQvcAKEMfAChD1wAoRJMAKES7AChE7wAoRSsAKEVjAChFkwAoRbMAKEXnAChGHwAoRj8AKEaLAChGrwAoRs8AKEb/AChHKwAoR2cAKEeHAChHuwAoSBcAKEg/AChIYwAoSJ8AKEjHAChI6wAoSS8AKElPAChJjwAoSbcAKEnrAChKNwAoSmcAKEqvAChLAwAoS3MAKEuDAChLkwAoTEMAKEybAChM5wAoTSsAKE2LAChNrwAoTfsAKE4vAChOUwAoTmcAKE6bAChO1wAoTysAKE9DAChPgwAoT8cAKFAjAChQawAoUL8AKFEHAChRKwAoUT8AKFFLAChRcwAoUYcAKFG/AChR+wAoUksAKFJ7AChSrwAoUtMAKFLzAChTEwAoU0sAKFOXAChTxwAoVBMAKFRHAChUcwAoVKcAKFTLAChVAwAoVTsAKFVjAChVpwAoVfcAKFYrAChWWwAoVocAKFafAChWywAoVu8AKFc7AChXVwAoV3cAKFfrAChYEwAoWEcAKFiDAChYwwAoWQcAKFkbAChZPwAoWW8AKFmTAChZ2wAoWgcAKFo3AChadwAoWpsAKFq/AChbBwAoWz8AKFuzAChb8wAoXBMAKFwjAChcXwAoXKsAKF0LAChdWwAoXbMAKF4vAChedwAoXssAKF8HAChfMwAoX38AKF+/AChgJwAoYEMAKGCLAChg0wAoYPcAKGE3AChhawAoYbsAKGHnAChiBwAoYmMAKGKPAChi2wAoYvsAKGMXAChjRwAoY3sAKGObAChjzwAoZCcAKGRbAChkgwAoZLMAKGUHAChlOwAoZU8AKGVzAChlkwAoZb8AKGYDAChmMwAoZl8AKGabAChm1wAoZwsAKGc7AChn8wAoaGsAKGibAChpfwAoab8AKGpvAChq3wAoaxsAKGtvAChrmwAoa7sAKGvjAChsDwAobGcAKGybAChs0wAobb8AKG53AChvCwAobzMAKG9HAChvgwAob5MAKG+rAChv7wAocBMAKHArAChwUwAocJcAKHC3AChxGwAocT8AKHGLAChyMwAocmsAKHKvAChzMwAoc2MAKHODAChzkwAoc7cAKHPzACh0NwAodEsAKHRnACh0lwAodMMAKHTfACh1AwAodSMAKHVXACh1hwAodccAKHYHACh2IwAodj8AKHaLACh2/wAod1sAKHeTACh3qwAod/sAKHgnACh4RwAoeI8AKHjXACh5BwAoeS8AKHlfACh5wwAoeeMAKHoDACh6RwAoeocAKHrrACh7OwAoe18AKHuDACh7uwAoe/sAKHwXACh8VwAofJMAKHz3ACh9JwAofT8AKH1nACh9ewAofZMAKH2zACh9zwAofe8AKH4PACh+NwAofl8AKH6LACh+twAof3MAKH+vACh/ywAof98AKH//ACiAIwAogFMAKIB3ACiAowAogMcAKID/ACiBHwAogU8AKIGPACiBswAogc8AKIH7ACiCXwAogq8AKILDACiC5wAogwMAKIMrACiDQwAog1MAKINvACiDjwAohBcAKIRDACiEYwAohJcAKITHACiFDwAohU8AKIW7ACiF9wAohh8AKIZ3ACiGkwAohtMAKIcHACiHkwAoh6MAKIffACiIKwAoiFsAKIiPACiIwwAoiTMAKIlTACiJiwAoidcAKIoTACiKZwAoioMAKIqfACiKswAoissAKIrfACiK8wAoiyMAKIsvACiLbwAoi48AKIuzACiL9wAojC8AKIyHACiM8wAojWMAKI1vACiNhwAojY8AKI2rACiN0wAojfcAKI4bACiONwAojmsAKI6HACiOrwAojscAKI73ACiPKwAoj0MAKI9TACiPcwAoj4sAKI+jACiP1wAoj/sAKJADACiQEwAokDsAKJBTACiQzwAokSMAKJFvACiRrwAokhMAKJJfACiSwwAoky8AKJN/ACiTrwAok98AKJQnACiUVwAolM8AKJUvACiVYwAolbsAKJYTACiWOwAolosAKJbPACiXHwAol28AKJd/ACiXnwAol7sAKJf7ACiYKwAomFsAKJiLACiYpwAomMcAKJlDACiZbwAomZsAKJnDACiaCwAoml8AKJqLACiavwAomvcAKJs7ACibawAom68AKJwDACicMwAonGMAKJyTACic2wAonPsAKJ0zACiddwAonZMAKJ2/ACid+wAonkMAKJ5bACiejwAonscAKJ7nACifEwAon08AKJ+HACif6wAooE8AKKCnACig+wAooUsAKKFnACihswAooiMAKKKbACii/wAooysAKKOHACijrwAoo+MAKKQHACikQwAopHcAKKSvACilRwAopgsAKKbHACim8wAopzMAKKdjACinkwAop98AKKgfACioLwAoqD8AKKiPACiovwAoqOMAKKkjACipNwAoqZMAKKm3ACip3wAoqf8AKKo7ACiqhwAoqsMAKKrbACirFwAoq0MAKKuLACirswAoq98AKKwTACisRwAorJcAKKzjACitJwAorWMAKK2XACituwAore8AKK4rACiuWwAorpsAKK7XACivMwAor28AKK+jACiwBwAosDcAKLBvACiw0wAosPsAKLFPACixhwAosesAKLIrACiylwAosssAKLMrACizcwAos+MAKLQjACi0jwAotPcAKLWDACi1wwAoti8AKLZrACi2zwAotzsAKLfPACi4AwAouGMAKLirACi48wAouWsAKLmjACi5rwAouhcAKLpzACi6zwAouxsAKLtnACi70wAou/cAKLwDACi8bwAovNMAKL07ACi9nwAovf8AKL4zACi+owAovxMAKL87ACi/iwAov8sAKL/3ACjANwAowFsAKMCDACjA2wAowRsAKMFnACjBlwAowo8AKMN3ACjDvwAow+cAKMSDACjFLwAoxVcAKMV7ACjFpwAoxe8AKMY/ACjGkwAoxtMAKMcDACjHKwAox1MAKMd7ACjHowAox8sAKMffACjH7wAox/8AKMgnACjITwAoyHcAKMifACjIxwAoyP8AKMljACjJ1wAoyfsAKMobACjKNwAoykMAKMpTACjKYwAoynMAKMqLACjKmwAoyscAKMrjACjK/wAoy0cAKMurACjMAwAozD8AKMyLACjMtwAozOsAKM0LACjNKwAozbcAKM3bACjOEwAozk8AKM57ACjOnwAoztMAKM7vACjPLwAoz28AKM+XACjPvwAoz+MAKNAPACjQkwAo0R8AKNFTACjRowAo0fsAKNIzACjSawAo0s8AKNMTACjTQwAo02MAKNPnACjUAwAo1CcAKNRrACjUuwAo1RMAKNUvACjWGwAo1m8AKNarACjXCwAo1xMAKNdXACjXqwAo2BcAKNhPACjYhwAo2N8AKNljACjZfwAo2acAKNobACjaUwAo2tsAKNr7ACjbLwAo22sAKNuXACjbvwAo2+cAKNwPACjcGwAo3EcAKNxrACjcswAo3OMAKN0nACjdOwAo3WcAKN37ACjeMwAo3l8AKN6rACje8wAo3x8AKN9PACjfdwAo36cAKN/bACjgAwAo4C8AKOBbACjgYwAo4G8AKODPACjg8wAo4ScAKOFHACjhgwAo4f8AKOLfACjjFwAo408AKOQ7ACjk4wAo5UsAKOV/ACjl0wAo5gcAKOZbACjmdwAo5pcAKObPACjnCwAo518AKOefACjnxwAo6BMAKOhLACjo2wAo6TsAKOmjACjqAwAo6msAKOq7ACjrEwAo62MAKOu7ACjr9wAo7AsAKOwzACjsywAo7U8AKO4LACjukwAo70cAKO/TACjwVwAo8Q8AKPG7ACjyXwAo8usAKPNTACjz2wAo9L8AKPWrACj2lwAo92cAKPgrACj5BwAo+csAKPp7ACj7HwAo+98AKPx/ACj9VwAo/jsAKP8vACkAIwApASMAKQHHACkCnwApA2sAKQQTACkE9wApBbcAKQYvACkGswApBzMAKQfTACkIbwApCQMAKQmXACkJ8wApCpMAKQs7ACkLywApDFcAKQzPACkNXwApDgMAKQ63ACkPswApEI8AKREzACkR1wApEnMAKRMvACkT5wApFIcAKRUjACkV8wApFosAKRdPACkYIwApGNcAKRmXACkaMwApGw8AKRv7ACkcuwApHYsAKR5rACkfPwApH78AKSBfACkg9wApIXcAKSH/ACkitwApI0sAKSQDACkkbwApJPcAKSWbACkmKwApJp8AKScXACknlwApKAcAKSiLACko9wApKYcAKSp7ACkrOwApLAcAKSzXACktrwApLocAKS9vACkwMwApMJcAKTF7ACkyEwApMwMAKTPXACk0vwApNZ8AKTaHACk3RwApN7cAKTijACk5hwApOkcAKTs3ACk8SwApPTcAKT3vACk+mwApP5sAKUBnAClBXwApQhcAKUMPAClDxwApRKsAKUVnAClGKwApRucAKUeLAClIMwApSMsAKUlfAClKHwApSsMAKUtfAClMKwApTLcAKU1jAClN5wApTpMAKU9zAClQGwApUOMAKVGDAClSPwApUu8AKVO3AClUbwApVS8AKVXLAClWewApV0MAKVfPAClYewApWVsAKVpHAClbAwApW38AKVx7ACldNwApXdcAKV63AClfYwApYF8AKWFbACliRwApYzcAKWQjACllEwApZi8AKWc/ACloSwApaWsAKWpvAClrYwApbGMAKW1nACluUwApb2MAKXBfAClxTwApcicAKXLrAClzhwApdGcAKXVbACl2TwApdvMAKXevACl4SwApeOcAKXm3ACl6qwApe6MAKXyPACl9KwApfjMAKX8HACl/0wApgK8AKYF7ACmCewApg48AKYSDACmFewAphpcAKYezACmIqwApibcAKYpnACmLWwApjDMAKY1LACmOGwApjw8AKY/jACmQuwApkb8AKZK3ACmTqwAplIsAKZVnACmWSwApl1MAKZg3ACmZDwApmfsAKZrXACmbvwApnKsAKZ1/ACmegwApn3sAKaBbACmhQwApoicAKaKfACmjMwAppA8AKaTfACmllwAppjMAKab7ACmntwApqHMAKakPACmpuwApqncAKas3ACmruwAprHsAKa0bACmt3wAprqsAKa9TACmv8wApsK8AKbFXACmyKwApssMAKbM7ACmz3wAptJcAKbUTACm13wAptosAKbc/ACm3+wApuJMAKblDACm6AwApussAKbufACm8jwApvVcAKb33ACm+mwApv2MAKcA7ACnBEwApwdsAKcJ7ACnDJwApw9cAKcR/ACnFOwApxecAKcZnACnHMwApyBcAKcjrACnJ6wApyt8AKcu7ACnMYwApzMsAKc2rACnOZwApzz8AKc/3ACnQmwAp0UsAKdH3ACnSgwAp0ysAKdPDACnUewAp1UcAKdXzACnWvwAp12MAKdgPACnYrwAp2T8AKdnLACnaawAp2vsAKduDACncOwAp3OsAKd2vACnedwAp3vsAKd+bACngfwAp4RcAKeHTACnigwAp43MAKeQTACnkxwAp5YcAKeY/ACnm1wAp5/cAKeirACnplwAp6qMAKetbACnsHwAp7LcAKe2PACnuUwAp70MAKfALACnw4wAp8ecAKfKnACnzXwAp9C8AKfTnACn12wAp9sMAKfePACn4bwAp+R8AKfn3ACn6zwAp+6cAKfx7ACn9DwAp/acAKf5PACn+5wAp/5sAKgAjACoAqwAqAU8AKgH7ACoCjwAqAzcAKgO7ACoEgwAqBSsAKgX3ACoGuwAqB38AKggfACoI4wAqCZsAKgpPACoLAwAqC8sAKgyDACoNWwAqDj8AKg8XACoQGwAqERcAKhILACoS5wAqE7MAKhSHACoVewAqFmcAKhdDACoX4wAqGJcAKhlbACoZ5wAqGqsAKhtrACocEwAqHN8AKh2PACoeNwAqHvcAKh/PACogdwAqIRcAKiG7ACoidwAqIv8AKiOHACokGwAqJKsAKiVnAComUwAqJwsAKiefACooWwAqKT8AKiorACorEwAqK9sAKiy7ACotowAqLpcAKi9bACowVwAqMQsAKjHLACoymwAqM1cAKjQfACo0uwAqNVMAKjYHACo3AwAqN+8AKjjXACo5cwAqOgMAKjqjACo7QwAqO9cAKjx3ACo9HwAqPbcAKj5LACo/DwAqP88AKkBfACpA6wAqQXMAKkH7ACpCswAqQ1sAKkRrACpFWwAqRjsAKkbvACpHiwAqSIcAKklfACpJ4wAqSqsAKkuzACpMPwAqTPsAKk3TACpOgwAqTusAKk9jACpP0wAqUEMAKlCvACpRHwAqUZcAKlIHACpSkwAqUxcAKlOLACpULwAqVOcAKlVXACpV1wAqVpcAKlcfACpXrwAqWD8AKljfACpZfwAqWhMAKlqLACpauwAqWvMAKlsTACpbQwAqW2cAKlubACpb1wAqXBsAKlxXACpciwAqXNcAKlz3ACpdHwAqXZ2NvbXBpbGVyLmJpbi5kYXJ0MmpzZGFydDJqcy5jbWRsaW5lRnV0dXJldXRmOExpbmVTcGxpdHRlcmV4aXRGaWxlRmlsZU1vZGVQbGF0Zm9ybXN0ZGluc3RkZXJySXNvbGF0ZWZlYXBpQ29tcGlsZXJPcHRpb25zc3RhY2tUcmFjZUZpbGVQcmVmaXhIYW5kbGVPcHRpb25kYXRhRXhpdEZ1bmNleGl0Q29kZUNvbXBpbGVGdW5jY29tcGlsZXJPcHRpb25zY29tcGlsZXJJbnB1dGNvbXBpbGVyRGlhZ25vc3RpY3Njb21waWxlck91dHB1dE9wdGlvbkhhbmRsZXJwYXR0ZXJuX2hhbmRsZW11bHRpcGxlQXJndW1lbnRzaGFuZGxlYXJndW1lbnRjYWxsQWJvcnRMZWdtZXNzYWdldG9TdHJpbmdBYm9ydGVkIGR1ZSB0byAtLXRocm93LW9uLWVycm9yOiBfRXhpdFNpZ25hbENvbXBpbGF0aW9uU3RyYXRlZ3lpbmRleF9uYW1ldmFsdWVzZGlyZWN0Q29tcGlsYXRpb25TdHJhdGVneS5kaXJlY3R0b0tlcm5lbENvbXBpbGF0aW9uU3RyYXRlZ3kudG9LZXJuZWx0b0RhdGFDb21waWxhdGlvblN0cmF0ZWd5LnRvRGF0YWZyb21EYXRhQ29tcGlsYXRpb25TdHJhdGVneS5mcm9tRGF0YV9kZWZhdWx0U3BlY2lmaWNhdGlvblVyaS4uLy4uLy4uLy4uL3Nkay9saWIvbGlicmFyaWVzLmpzb25PVVRQVVRfTEFOR1VBR0VfREFSVERhcnRCVUlMRF9JRGRpYWdub3N0aWNIYW5kbGVyZXhpdEZ1bmNjb21waWxlRnVuY2VuYWJsZVdyaXRlU3RyaW5nX0VYSVRfU0lHTkFMZXh0cmFjdFBhcmFtZXRlcmlzT3B0aW9uYWxBcmd1bWVudG1eKC1bYS16QS1aXXwtLS4rPSkoLiopZmlyc3RNYXRjaD09VW5rbm93biBvcHRpb24gIiIuW11leHRyYWN0UGF0aGlzRGlyZWN0b3J5cGF0aGVuZHNXaXRoL3BhcnNlQ29tbWFuZExpbmVoYW5kbGVyc2FyZ3ZwYXR0ZXJuc2hhbmRsZXJhZGReKGpvaW4pJHxeKCkkYXJndW1lbnRzaXRlcmF0b3Jtb3ZlTmV4dGN1cnJlbnRtYXRjaGdyb3VwQ291bnRsZW5ndGhpPCtJbnRlcm5hbCBlcnJvcjogIiIgZGlkIG5vdCBtYXRjaGNvbXBpbGVrZXJuZWxJbml0aWFsaXplZENvbXBpbGVyU3RhdGV3YWxsY2xvY2tzdGFydGxpYnJhcmllc1NwZWNpZmljYXRpb25VcmlyZXNvbHZlbGliL2xpYnJhcmllcy5qc29ub3V0cHV0U3BlY2lmaWVkb3V0c291cmNlTWFwT3V0cmVhZERhdGFVcml3cml0ZURhdGFVcmliYXplbFBhdGhzcGFja2FnZUNvbmZpZ3BhY2thZ2VSb290b3B0aW9uc3dhbnRIZWxwd2FudFZlcnNpb250cnVzdFR5cGVBbm5vdGF0aW9uc2NoZWNrZWRNb2Rlc3Ryb25nTW9kZWhpbnRzdmVyYm9zZXRocm93T25FcnJvcnRocm93T25FcnJvckNvdW50c2hvd1dhcm5pbmdzc2hvd0hpbnRzZW5hYmxlQ29sb3Jzb3B0aW1pemF0aW9uTGV2ZWxwbGF0Zm9ybUJpbmFyaWVzZW52aXJvbm1lbnRjb21waWxhdGlvblN0cmF0ZWd5cGFzc1Rocm91Z2hpZ25vcmVPcHRpb24tLWJ1aWxkLWlkPXNldExpYnJhcnlTcGVjaWZpY2F0aW9uVXJpc2V0UGFja2FnZVJvb3RzZXRQYWNrYWdlQ29uZmlnc2V0T3V0cHV0LW9FcnJvcjogTWlzc2luZyBmaWxlIGFmdGVyIC1vIG9wdGlvbi5zZXRPcHRpbWl6YXRpb25MZXZlbHZhbHVlPkVycm9yOiBVbnN1cHBvcnRlZCBvcHRpbWl6YXRpb24gbGV2ZWwgJycsIHN1cHBvcnRlZCBsZXZlbHMgYXJlOiAwLCAxLCAyLCAzLCA0c2V0T3V0cHV0VHlwZS0tb3V0cHV0LXR5cGU9ZGFydC0tb3V0cHV0LXR5cGU9ZGFydC1tdWx0aS0tb3V0cHV0LXR5cGU9ZGFydCBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiBJdCB3YXMgZGVwcmVjYXRlZCBzaW5jZSBEYXJ0IDEuMTEgYW5kIHJlbW92ZWQgaW4gRGFydCAxLjE5LnNldFN0cmlwT3B0aW9uICctLWZvcmNlLXN0cmlwJyBpcyBub3QgaW4gdXNlIG5vdyB0aGF0LS1vdXRwdXQtdHlwZT1kYXJ0IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuc2V0QmF6ZWxQYXRoc3BhdGhzYWRkQWxsc3BsaXQsZ2V0RGVwc091dHB1dHNvdXJjZUZpbGVzZmlsZW5hbWVzbWFwdXJpdG9MaXN0c29ydApzZXRBbGxvd05hdGl2ZUV4dGVuc2lvbnNPcHRpb24gJycgaXMgbm90IHN1cHBvcnRlZC5zZXRWZXJib3NlXy0tdmVyYm9zZXNldFRydXN0VHlwZUFubm90YXRpb25zc2V0Q2hlY2tlZE1vZGVhZGRJbkVudmlyb25tZW50ZXFJbmRleGluZGV4T2Y9bmFtZXN1YnN0cmluZ1tdPXNldENhdGVnb3JpZXNjYXRlZ29yaWVzaXNTZXJ2ZXJNb2Rlc2luZ2xlU2VydmVyVGhlIC0tY2F0ZWdvcmllcyBmbGFnIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgZGVsZXRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLCBwbGVhc2UgdXNlICcnIGluc3RlYWQgb2YgJy0tY2F0ZWdvcmllcz1TZXJ2ZXInLlRoZSAtLWNhdGVnb3JpZXMgZmxhZyBpcyBkZXByZWNhdGVkLCBzZWUgdGhlIHVzYWdlIGZvciBkZXRhaWxzLnNldFBsYXRmb3JtQmluYXJpZXNzZXRSZWFkRGF0YUNhbm5vdCByZWFkIGFuZCB3cml0ZSBzZXJpYWxpemVkIHNpbXVsdGFuZW91c2x5LnNldERpbGxEZXBlbmRlbmNpZXNkZXBlbmRlbmNpZXN1cmlEZXBlbmRlbmNpZXNzcGxpdE1hcEpvaW5vbk1hdGNob25Ob25NYXRjaHBzZXRDZmVPbmx5c2V0V3JpdGVEYXRhc2V0RHVtcEluZm89anNvbj1iaW5hcnlFcnJvcjogVW5zdXBwb3J0ZWQgZHVtcC1pbmZvIGZvcm1hdCAnc3VwcG9ydGVkIGZvcm1hdHMgYXJlOiBqc29uIG9yIGJpbmFyeWhhbmRsZVRocm93T25FcnJvcnBhcmFtZXRlcmNvdW50aGFuZGxlU2hvcnRPcHRpb25zc2hvcnRPcHRpb25zc2hvcnRPcHRpb252aD9jLVtjaHZtP10rLS10aHJvdy1vbi1lcnJvcig/Oj1bMC05XSspPy0tb3V0cHV0LXR5cGU9ZGFydHwtLW91dHB1dC10eXBlPWRhcnQtbXVsdGl8LS1vdXRwdXQtdHlwZT1qcy0tdXNlLWtlcm5lbC0tbGlicmFyeS1yb290PS4rLS1saWJyYXJpZXMtc3BlYz0uKz0uK3wtLW91dD0uK3wtby4qLU8uKi0tZm9yY2Utc3RyaXA9LiotLWVuYWJsZVtfLV1jaGVja2VkW18tXW1vZGV8LS1jaGVja2VkLS1oZWxwfC9cP3wvaC0tcGFja2FnZXM9ListLXBhY2thZ2Utcm9vdD0uK3wtcC4rLS1jYXRlZ29yaWVzPS4qLS1kZWZlcnJlZC1tYXA9ListLWRpc2FsbG93LXVuc2FmZS1ldmFsLS1lbmFibGUtZXhwZXJpbWVudGFsLW1pcnJvcnMtLXN0cm9uZy0tZW5hYmxlLWFzeW5jLS1lbmFibGUtbnVsbC1hd2FyZS1vcGVyYXRvcnMtLWVuYWJsZS1lbnVtLUQuKz0uKi0uKlVua25vd24gb3B0aW9uICcnLi4qaW5wdXRQcm92aWRlcicgaXMgbm90IG5lZWRlZCBpbiBEYXJ0IDIuMC4gVG8gZW5hYmxlIGFzc2VydGlvbnMgdXNlICcnIGluc3RlYWQuJyBpcyBub3QgYXZhaWxhYmxlIGluIERhcnQgMi4wLiBUcnkgdXNpbmcgJ2hpbnRpbmZvaXNFbXB0eU5vIERhcnQgZmlsZSBzcGVjaWZpZWQuZXh0cmFzdWJsaXN0RXh0cmEgYXJndW1lbnRzOiAgJyBtYXkgbm90IGJlIHVzZWQgaW4gY2hlY2tlZCBtb2RlLkNhbm5vdCBzcGVjaWZ5IGJvdGggJy0tcGFja2FnZS1yb290JyBhbmQgJy0tcGFja2FnZXMuc2NyaXB0TmFtZW91dC5qc291dC5kaWxsLmRhdGEtLW91dD0ubWFwLS1zb3VyY2UtbWFwPW91dHB1dFByb3ZpZGVyb25JbmZvb25GYWlsdXJlY29tcGlsYXRpb25Eb25lcmVzdWx0aXNTdWNjZXNzQ29tcGlsYXRpb24gZmFpbGVkLi5kZXBzZ2V0U291cmNlVXJpc2RhcnRDaGFyYWN0ZXJzUmVhZGpzQ2hhcmFjdGVyc1dyaXR0ZW50b3RhbENoYXJhY3RlcnNXcml0dGVuSmF2YVNjcmlwdGpzQ2hhcmFjdGVyc1ByaW1hcnl0b3RhbENoYXJhY3RlcnNXcml0dGVuUHJpbWFyeUNvbXBpbGVkICBjaGFyYWN0ZXJzIERhcnQgdG8gIGNoYXJhY3RlcnMgSmF2YVNjcmlwdCBpbiBlbGFwc2VkIHNlY29uZHNpbnB1dG91dHB1dERhcnQgZmlsZSAoKSBjb21waWxlZCB0byBKYXZhU2NyaXB0OiBmaWxlc2FsbE91dHB1dEZpbGVzanNDb3VudHdoZXJlZi5qc0VtaXR0ZWQgZmlsZSAgSmF2YVNjcmlwdCBmaWxlcy5kYXRhQnl0ZXNXcml0dGVudG90YWxEYXRhV3JpdHRlbiBrZXJuZWwgYnl0ZXMgaW4gZGlsbE91dHB1dCkgY29tcGlsZWQgdG8gLlNlcmlhbGl6ZWQgIGJ5dGVzIGRhdGEgaW4gZGF0YU91dHB1dCkgc2VyaWFsaXplZCB0byAgYW5kIGRhdGFDaGFyYWN0ZXJzUmVhZCBieXRlcyBkYXRhIHRvIHNjcmlwdGF1dG9SZWFkRmlsZVVyaWVudHJ5UG9pbnR0aGVuX2Zvcm1hdENoYXJhY3RlckNvdW50c2VwYXJhdG9ydGV4dHBvc2l0aW9uLV9mb3JtYXREdXJhdGlvbkFzU2Vjb25kc2R1cmF0aW9ud2lkdGhzZWNvbmRzaW5NaWxsaXNlY29uZHNkaWdpdHM+PXRvU3RyaW5nQXNGaXhlZDw9d3JpdGVTdHJpbmdzY2hlbWVmaWxlVW5oYW5kbGVkIHNjaGVtZSB0b0ZpbGVQYXRob3BlblN5bmNtb2Rld3JpdGVTdHJpbmdTeW5jY2xvc2VTeW5jZmFpbHJlcG9ydHVuYXJ5LUVycm9yOiBjb21waWxlck1haW46YXN5bmNfY29tcGxldGVyOnJldHVybl92YWx1ZTphc3luY19zdGFja190cmFjZTphc3luY19vcF90aGVuOmFzeW5jX29wX2Vycm9yOmF3YWl0X2p1bXBfdmFyOmF3YWl0X2N0eF92YXI6c2F2ZWRfdHJ5X2NvbnRleHRfdmFyMDphc3luY19vcDpyZXN1bHQ6ZXhjZXB0aW9uOnN0YWNrX3RyYWNlYW55YXN0YXJ0c1dpdGgtLWxpYnJhcmllcy1zcGVjPWlzU2NoZW1lcGFja2FnZWxpYnJhcmllc0pzb25jb21wbGV0ZUVycm9yZnV0dXJlaGVscFVzYWdlOiBkYXJ0MmpzIFtvcHRpb25zXSBkYXJ0ZmlsZQoKQ29tcGlsZXMgRGFydCB0byBKYXZhU2NyaXB0LgoKQ29tbW9uIG9wdGlvbnM6CiAgLW8gPGZpbGU+IEdlbmVyYXRlIHRoZSBvdXRwdXQgaW50byA8ZmlsZT4uCiAgLW0gICAgICAgIEdlbmVyYXRlIG1pbmlmaWVkIG91dHB1dC4KICAtaCAgICAgICAgRGlzcGxheSB0aGlzIG1lc3NhZ2UgKGFkZCAtdiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWxsIG9wdGlvbnMpLnZlcmJvc2VIZWxwVXNhZ2U6IGRhcnQyanMgW29wdGlvbnNdIGRhcnRmaWxlCgpDb21waWxlcyBEYXJ0IHRvIEphdmFTY3JpcHQuCgpTdXBwb3J0ZWQgb3B0aW9uczoKICAtaCwgL2gsIC8/LCAtLWhlbHAKICAgIERpc3BsYXkgdGhpcyBtZXNzYWdlIChhZGQgLXYgZm9yIGluZm9ybWF0aW9uIGFib3V0IGFsbCBvcHRpb25zKS4KCiAgLW8gPGZpbGU+LCAtLW91dD08ZmlsZT4KICAgIEdlbmVyYXRlIHRoZSBvdXRwdXQgaW50byA8ZmlsZT4uCgogIC1tLCAtLW1pbmlmeQogICAgR2VuZXJhdGUgbWluaWZpZWQgb3V0cHV0LgoKICAtLWVuYWJsZS1hc3NlcnRzCiAgICBFbmFibGUgYXNzZXJ0aW9ucy4KCiAgLXYsIC0tdmVyYm9zZQogICAgRGlzcGxheSB2ZXJib3NlIGluZm9ybWF0aW9uLgoKICAtRDxuYW1lPj08dmFsdWU+CiAgICBEZWZpbmUgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuCgogIC0tdmVyc2lvbgogICAgRGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uLgoKICAtLXBhY2thZ2VzPTxwYXRoPgogICAgUGF0aCB0byB0aGUgcGFja2FnZSByZXNvbHV0aW9uIGNvbmZpZ3VyYXRpb24gZmlsZSwgd2hpY2ggc3VwcGxpZXMgYSBtYXBwaW5nCiAgICBvZiBwYWNrYWdlIG5hbWVzIHRvIHBhdGhzLgoKICAtLXN1cHByZXNzLXdhcm5pbmdzCiAgICBEbyBub3QgZGlzcGxheSBhbnkgd2FybmluZ3MuCgogIC0tZmF0YWwtd2FybmluZ3MKICAgIFRyZWF0IHdhcm5pbmdzIGFzIGNvbXBpbGF0aW9uIGVycm9ycy4KCiAgLS1zdXBwcmVzcy1oaW50cwogICAgRG8gbm90IGRpc3BsYXkgYW55IGhpbnRzLgoKICAtLWVuYWJsZS1kaWFnbm9zdGljLWNvbG9ycwogICAgQWRkIGNvbG9ycyB0byBkaWFnbm9zdGljIG1lc3NhZ2VzLgoKICAtLXRlcnNlCiAgICBFbWl0IGRpYWdub3N0aWNzIHdpdGhvdXQgc3VnZ2VzdGlvbnMgZm9yIGhvdyB0byBnZXQgcmlkIG9mIHRoZSBkaWFnbm9zZWQKICAgIHByb2JsZW1zLgoKICAtLXNob3ctcGFja2FnZS13YXJuaW5ncwogICAgU2hvdyB3YXJuaW5ncyBhbmQgaGludHMgZ2VuZXJhdGVkIGZyb20gcGFja2FnZXMuCgogIC0tY3NwCiAgICBEaXNhYmxlIGR5bmFtaWMgZ2VuZXJhdGlvbiBvZiBjb2RlIGluIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LiBUaGlzIGlzCiAgICBuZWNlc3NhcnkgdG8gc2F0aXNmeSBDU1AgcmVzdHJpY3Rpb25zIChzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvQ1NQLykuCgogIC0tbm8tc291cmNlLW1hcHMKICAgIERvIG5vdCBnZW5lcmF0ZSBhIHNvdXJjZSBtYXAgZmlsZS4KCiAgLU88MCwxLDIsMyw0PgogICAgQ29udHJvbHMgb3B0aW1pemF0aW9ucyB0aGF0IGNhbiBoZWxwIHJlZHVjZSBjb2RlLXNpemUgYW5kIGltcHJvdmUKICAgIHBlcmZvcm1hbmNlIG9mIHRoZSBnZW5lcmF0ZWQgY29kZSBmb3IgZGVwbG95bWVudC4KCiAgICAtTzAKICAgICAgIERpc2FibGVzIGFsbCBvcHRpbWl6YXRpb25zLiBFcXVpdmFsZW50IHRvIGNhbGxpbmcgZGFydDJqcyB3aXRoIHRoZXNlCiAgICAgICBleHRyYSBmbGFnczoKICAgICAgICAtLWRpc2FibGUtaW5saW5pbmcKICAgICAgICAtLWRpc2FibGUtdHlwZS1pbmZlcmVuY2UKICAgICAgICAtLWRpc2FibGUtcnRpLW9wdGltaXphdGlvbnMKCgogICAgICAgU29tZSBvcHRpbWl6YXRpb25zIGNhbm5vdCBiZSBkaXNzYWJsZWQgYXQgdGhpcyB0aW1lLCBhcyB3ZSBhZGQgdGhlIG9wdGlvbgogICAgICAgdG8gZGlzYWJsZSB0aGVtLCB0aGV5IHdpbGwgYmUgYWRkZWQgaGVyZSBhcyB3ZWxsLgoKICAgIC1PMQogICAgICAgRW5hYmxlcyBkZWZhdWx0IG9wdGltaXphdGlvbnMuIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBkYXJ0MmpzIHdpdGggbm8KICAgICAgIGV4dHJhIGZsYWdzLgoKICAgIC1PMgogICAgICAgRW5hYmxlcyBvcHRpbWl6YXRpb25zIHRoYXQgcmVzcGVjdCB0aGUgbGFuZ3VhZ2Ugc2VtYW50aWNzIGFuZCBhcmUgc2FmZQogICAgICAgZm9yIGFsbCBwcm9ncmFtcy4gSXQgaG93ZXZlciBjaGFuZ2VzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdHlwZXMsCiAgICAgICB3aGljaCB3aWxsIG5vIGxvbmdlciBiZSBjb25zaXN0ZW50IHdpdGggdGhlIERhcnQgVk0gb3IgRERDLgoKICAgICAgIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBkYXJ0MmpzIHdpdGggdGhlc2UgZXh0cmEgZmxhZ3M6CiAgICAgICAgLS1taW5pZnkKICAgICAgICAtLWxheC1ydW50aW1lLXR5cGUtdG8tc3RyaW5nCgogICAgLU8zCiAgICAgICBFbmFibGVzIG9wdGltaXphdGlvbnMgdGhhdCByZXNwZWN0IHRoZSBsYW5ndWFnZSBzZW1hbnRpY3Mgb25seSBvbgogICAgICAgcHJvZ3JhbXMgdGhhdCBkb24ndCBldmVyIHRocm93IGFueSBzdWJ0eXBlIG9mIGBFcnJvcmAuICBUaGVzZQogICAgICAgb3B0aW1pemF0aW9ucyBpbXByb3ZlIHRoZSBnZW5lcmF0ZWQgY29kZSwgYnV0IHRoZXkgbWF5IGNhdXNlIHByb2dyYW1zIHRvCiAgICAgICBiZWhhdmUgdW5leHBlY3RlZGx5IGlmIHRoaXMgYXNzdW1wdGlvbiBpcyBub3QgbWV0LiAgVG8gdXNlIHRoaXMKICAgICAgIG9wdGlvbiwgd2UgcmVjb21tZW5kIHRoYXQgeW91IHByb3Blcmx5IHRlc3QgeW91ciBhcHBsaWNhdGlvbiBmaXJzdAogICAgICAgd2l0aG91dCBpdCwgYW5kIGVuc3VyZSB0aGF0IG5vIHN1YnR5cGUgb2YgYEVycm9yYCAoc3VjaCBhcyBgVHlwZUVycm9yYCkKICAgICAgIGlzIGV2ZXIgdGhyb3duLgoKICAgICAgIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBkYXJ0MmpzIHdpdGggdGhlc2UgZXh0cmEgZmxhZ3M6CiAgICAgICAgIC1PMgogICAgICAgICAtLW9taXQtaW1wbGljaXQtY2hlY2tzCgogICAgLU80CiAgICAgICBFbmFibGVzIG1vcmUgYWdncmVzc2l2ZSBvcHRpbWl6YXRpb25zIHRoYW4gLU8zLCBidXQgd2l0aCB0aGUgc2FtZQogICAgICAgYXNzdW1wdGlvbnMuIFRoZXNlIG9wdGltaXphdGlvbnMgYXJlIG9uIGEgc2VwYXJhdGUgZ3JvdXAgYmVjYXVzZSB0aGV5CiAgICAgICBhcmUgbW9yZSBzdXNjZXB0aWJsZSB0byB2YXJpYXRpb25zIGluIGlucHV0IGRhdGEuIFRvIHVzZSB0aGlzIG9wdGlvbiB3ZQogICAgICAgcmVjb21tZW5kIHRvIHBheSBzcGVjaWFsIGF0dGVudGlvbiB0byB0ZXN0IGVkZ2UgY2FzZXMgaW4gdXNlciBpbnB1dC4KCiAgICAgICBFcXVpdmFsZW50IHRvIGNhbGxpbmcgZGFydDJqcyB3aXRoIHRoZXNlIGV4dHJhIGZsYWdzOgogICAgICAgICAtTzMKICAgICAgICAgLS10cnVzdC1wcmltaXRpdmVzCgogICAgV2hpbGUgc29tZSBvZiB0aGUgaW5kaXZpZHVhbCBvcHRpbWl6YXRpb25zIGFuZCBmbGFncyBtYXkgY2hhbmdlIHdpdGggdGltZSwKICAgIHdlIGludGVuZCB0byBrZWVwIHRoZSAtTyogZmxhZ3Mgc3RhYmxlLiBOZXcgc2FmZSBvcHRpbWl6YXRpb25zIG1heSBiZSBhZGRlZAogICAgb24gYW55IGxldmVsLCBhbmQgb3B0aW1pemF0aW9ucyB0aGF0IG9ubHkgd29yayBvbiBzb21lIHByb2dyYW1zIG1heSBtb3ZlIHVwCiAgICBmcm9tIG9uZSBsZXZlbCB0byB0aGUgbmV4dCAoZm9yIGluc3RhbmNlLCBvbmNlIGFsdGVybmF0aXZlIHNhZmUKICAgIG9wdGltaXphdGlvbnMgYXJlIGltcGxlbWVudGVkLCBgb21pdC1pbXBsaWNpdC1jaGVja3NgIG1heSBiZSByZW1vdmVkIG9yIG1heQogICAgbW92ZSB0byB0aGUgTzQgbGV2ZWwpLgoKVGhlIGZvbGxvd2luZyBpbmRpdmlkdWFsIG9wdGlvbnMgYXJlIGluY2x1ZGVkIGluIHNvbWUgb2YgdGhlIC1PIG9wdGltaXphdGlvbgpsZXZlbHMgYWJvdmUuIFRoZXkgaGVscCByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBjb2RlLCBidXQgdGhleSBtYXkKY2F1c2UgcHJvZ3JhbXMgdG8gYmVoYXZlIHVuZXhwZWN0ZWRseSBpZiBhc3N1bXB0aW9ucyBhcmUgbm90IG1ldC4gT25seSB0dXJuIG9uCnRoZXNlIGZsYWdzIGlmIHlvdSBoYXZlIGVub3VnaCB0ZXN0IGNvdmVyYWdlIHRvIGVuc3VyZSB0aGV5IGFyZSBzYWZlIHRvIHVzZToKCiAgLS1vbWl0LWltcGxpY2l0LWNoZWNrcwogICAgT21pdCBpbXBsaWNpdCBydW50aW1lIGNoZWNrcywgc3VjaCBhcyBwYXJhbWV0ZXIgY2hlY2tzIGFuZCBpbXBsaWNpdAogICAgZG93bmNhc3RzLiBUaGVzZSBjaGVja3MgYXJlIGluY2x1ZGVkIGJ5IGRlZmF1bHQgaW4gRGFydCAyLjAuIEJ5CiAgICB1c2luZyB0aGlzIGZsYWcgdGhlIGNoZWNrcyBhcmUgcmVtb3ZlZCwgaG93ZXZlciB0aGUgY29tcGlsZXIgd2lsbCBhc3N1bWUKICAgIHRoYXQgYWxsIHN1Y2ggY2hlY2tzIHdlcmUgdmFsaWQgYW5kIG1heSB1c2UgdGhpcyBpbmZvcm1hdGlvbiBmb3IKICAgIG9wdGltaXphdGlvbnMuIFVzZSB0aGlzIG9wdGlvbiBvbmx5IGlmIHlvdSBoYXZlIGVub3VnaCB0ZXN0aW5nIHRvIGVuc3VyZQogICAgdGhhdCB5b3VyIHByb2dyYW0gd29ya3Mgd2l0aCB0aGUgY2hlY2tzLgoKICAtLXRydXN0LXByaW1pdGl2ZXMKICAgIEFzc3VtZSB0aGF0IG9wZXJhdGlvbnMgb24gbnVtYmVycywgc3RyaW5ncywgYW5kIGxpc3RzIGhhdmUgdmFsaWQgaW5wdXRzLgogICAgVGhpcyBvcHRpb24gYWxsb3dzIHRoZSBjb21waWxlciB0byBkcm9wIHJ1bnRpbWUgY2hlY2tzIGZvciB0aG9zZSBvcGVyYXRpb25zLgogICAgTm90ZTogYSB3ZWxsLXR5cGVkIHByb2dyYW0gaXMgbm90IGd1YXJhbnRlZWQgdG8gaGF2ZSB2YWxpZCBpbnB1dHMuIEZvcgogICAgZXhhbXBsZSwgYW4gaW50IGluZGV4IGFyZ3VtZW50IG1heSBiZSBudWxsIG9yIG91dCBvZiByYW5nZS4KCiAgLS1sYXgtcnVudGltZS10eXBlLXRvLXN0cmluZwogICAgT21pdHMgcmVpZmllZCBjbGFzcyB0eXBlIGFyZ3VtZW50cyB3aGVuIHRoZXNlIGFyZSBvbmx5IG5lZWRlZCBmb3IgYHRvU3RyaW5nYAogICAgb24gYHJ1bnRpbWVUeXBlYC4gVGhpcyBpcyB1c2VmdWwgaWYgYHJ1bnRpbWVUeXBlLnRvU3RyaW5nKClgIGlzIG9ubHkgdXNlZAogICAgZm9yIGRlYnVnZ2luZy4gTm90ZSB0aGF0IHNlbWFudGljcyBvZiBvdGhlciB1c2VzIG9mIGAucnVudGltZVR5cGVgLCBmb3IKICAgIGluc3RhbmNlIGBhLnJ1bnRpbWVUeXBlID09IGIucnVudGltZVR5cGVgLCBpcyBub3QgYWZmZWN0ZWQgYnkgdGhpcyBmbGFnLgoKVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBvbmx5IHVzZWQgZm9yIGNvbXBpbGVyIGRldmVsb3BtZW50IGFuZCBtYXkKYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uOgoKICAtLXRocm93LW9uLWVycm9yCiAgICBUaHJvdyBhbiBleGNlcHRpb24gaWYgYSBjb21waWxlLXRpbWUgZXJyb3IgaXMgZGV0ZWN0ZWQuCgogIC0tbGlicmFyaWVzLXNwZWM9PGZpbGU+CiAgICBBIC5qc29uIGZpbGUgY29udGFpbmluZyB0aGUgbGlicmFyaWVzIHNwZWNpZmljYXRpb24gZm9yIGRhcnQyanMuCgogIC0tYWxsb3ctbW9jay1jb21waWxhdGlvbgogICAgRG8gbm90IGdlbmVyYXRlIGEgY2FsbCB0byBtYWluIGlmIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nCiAgICBsaWJyYXJpZXMgYXJlIHVzZWQ6IGRhcnQ6ZG9tLCBkYXJ0Omh0bWwgZGFydDppby4KCiAgLS1kaXNhYmxlLW5hdGl2ZS1saXZlLXR5cGUtYW5hbHlzaXMKICAgIERpc2FibGUgdGhlIG9wdGltaXphdGlvbiB0aGF0IHJlbW92ZXMgdW51c2VkIG5hdGl2ZSB0eXBlcyBmcm9tIGRhcnQ6aHRtbAogICAgYW5kIHJlbGF0ZWQgbGlicmFyaWVzLgoKICAtLXNlcnZlci1tb2RlCiAgICBDb21waWxlIHdpdGggc2VydmVyIHN1cHBvcnQuIFRoZSBjb21waWxlciB3aWxsIHVzZSBhIGxpYnJhcnkgc3BlY2lmaWNhdGlvbgogICAgdGhhdCBkaXNhYmxlcyBkYXJ0Omh0bWwgYnV0IHN1cHBvcnRzIGRhcnQ6anMgaW4gY29uZGl0aW9uYWwgaW1wb3J0cy4KCiAgLS1jYXRlZ29yaWVzPTxjYXRlZ29yaWVzPgogICAgKGRlcHJlY2F0ZWQpCiAgICBVc2UgJy0tc2VydmVyLW1vZGUnIGluc3RlYWQgb2YgJy0tY2F0ZWdvcmllcz1TZXJ2ZXInLiBBbGwgb3RoZXIgY2F0ZWdvcnkKICAgIHZhbHVlcyBoYXZlIG5vIGVmZmVjdCBvbiB0aGUgY29tcGlsZXIgYmVoYXZpb3IuCgogIC0tZGVmZXJyZWQtbWFwPTxmaWxlPgogICAgR2VuZXJhdGVzIGEganNvbiBmaWxlIHdpdGggYSBtYXBwaW5nIGZyb20gZWFjaCBkZWZlcnJlZCBpbXBvcnQgdG8gYSBsaXN0IG9mCiAgICB0aGUgcGFydC5qcyBmaWxlcyB0aGF0IHdpbGwgYmUgbG9hZGVkLgoKICAtLWR1bXAtaW5mb1s9PGZvcm1hdD5dCiAgICBHZW5lcmF0ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdlbmVyYXRlZCBjb2RlLiAnZm9ybWF0JyBjYW4gYmUgZWl0aGVyCiAgICAnanNvbicgb3IgJ2JpbmFyeScuCiAgICBZb3UgY2FuIGluc3BlY3QgdGhlIGdlbmVyYXRlZCBkYXRhIHVzaW5nIHRvb2xzIGZyb20gJ3BhY2thZ2U6ZGFydDJqc19pbmZvJy4KCiAgLS1nZW5lcmF0ZS1jb2RlLXdpdGgtY29tcGlsZS10aW1lLWVycm9ycwogICAgR2VuZXJhdGVzIG91dHB1dCBldmVuIGlmIHRoZSBwcm9ncmFtIGNvbnRhaW5zIGNvbXBpbGUtdGltZSBlcnJvcnMuIFVzZSB0aGUKICAgIGV4aXQgY29kZSB0byBkZXRlcm1pbmUgaWYgY29tcGlsYXRpb24gZmFpbGVkLgoKICAtLW5vLWZyZXF1ZW5jeS1iYXNlZC1taW5pZmljYXRpb24KICAgIEV4cGVyaW1lbnRhbC4gIERpc2FibGVkIHRoZSBuZXcgZnJlcXVlbmN5IGJhc2VkIG1pbmlmeWluZyBuYW1lciBhbmQgdXNlIHRoZQogICAgb2xkIG5hbWVyIGluc3RlYWQuCnRyaW1oZWxwQW5kRXhpdHZlcnNpb248bm9uLVNESyBidWlsZD5EYXJ0LXRvLUphdmFTY3JpcHQgY29tcGlsZXIgKGRhcnQyanMpIHZlcnNpb246IGhlbHBBbmRGYWlsbWFpbmxhc3QtLWJhdGNoaW50ZXJuYWxNYWlub25FcnJvcmV4Y2VwdGlvbnRyYWNlVGhlIGNvbXBpbGVyIGNyYXNoZWQ6IGlnbm9yZWRUaGUgY29tcGlsZXIgY3Jhc2hlZDogZXJyb3Igd2hpbGUgcHJpbnRpbmcgZXhjZXB0aW9uY2F0Y2hFcnJvcmJhdGNoTWFpbmJhdGNoQXJndW1lbnRzZXJyb3JDb2Rlc3RyZWFtdHJhbnNmb3JtZGVjb2RlcnN1YnNjcmlwdGlvbmxpc3RlbmxpbmVwYXVzZWFyZ3N3aW5kb3dzd2hlbkNvbXBsZXRlPj4+IFRFU1QgT0s+Pj4gVEVTVCBDUkFTSD4+PiBURVNUIEZBSUx3cml0ZWxuPj4+IEVPRiBTVERFUlJyZXN1bWVDb21wb25lbnRUYXJnZXREaWFnbm9zdGljTWVzc2FnZUhhbmRsZXJFeHBlcmltZW50YWxGbGFnRmlsZVN5c3RlbVByb2Nlc3NlZE9wdGlvbnNMaWJyYXJpZXNTcGVjaWZpY2F0aW9uQ29tcGlsZXJDb250ZXh0bWVzc2FnZU1pc3NpbmdNYWluU2V2ZXJpdHlnZW5lcmF0ZUtlcm5lbEludGVybmFsRXJyb3JUb2tlblN0cmluZ1Rva2VuVG9rZW5Jbml0aWFsaXplZENvbXBpbGVyU3RhdGVwYXJzZUV4cGVyaW1lbnRhbEZsYWdzRGlhZ25vc3RpY01lc3NhZ2VnZXRNZXNzYWdlQ2hhck9mZnNldGdldE1lc3NhZ2VIZWFkZXJUZXh0Z2V0TWVzc2FnZUxlbmd0aGdldE1lc3NhZ2VSZWxhdGVkSW5mb3JtYXRpb25nZXRNZXNzYWdlVXJpZGVmYXVsdEV4cGVyaW1lbnRhbEZsYWdzRmlsZVN5c3RlbUVudGl0eUZpbGVTeXN0ZW1FeGNlcHRpb25rZXJuZWxGb3JQcm9ncmFtRGF0YUZpbGVTeXN0ZW1FbnRpdHljb21wdXRlUGxhdGZvcm1CaW5hcmllc0xvY2F0aW9uTG9jYXRlZE1lc3NhZ2VSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5b3BlcmF0b3JGcm9tU3RyaW5nQXN5bmNNb2RpZmllcmlzVXNlckRlZmluYWJsZU9wZXJhdG9yaXNNaW51c09wZXJhdG9yJCQkMCQ5JEEkQkFDS1NMQVNIJENSJERFTCREUSRIQVNIJExGJExTJFBTJFRBQiRaJF8kYSRnJHMkekxpbmtMaW5rQnVpbGRlckxpbmtFbnRyeXJlbGF0aXZpemVVcmljbGVhclN0cmluZ1Rva2VuQ2Fub25pY2FsaXplcmNsZWFyaW5pdGlhbGl6ZUNvbXBpbGVyb2xkU3RhdGV0YXJnZXRsaW5rZWREZXBlbmRlbmNpZXNwYWNrYWdlc0ZpbGVVcmlleHBlcmltZW50YWxGbGFnc3ZlcmlmeWVuYWJsZUFzc2VydHNtYXBFcXVhbGJmbGFna2V5c2NvbnRhaW5zS2V5bGlzdEVxdWFsY29tcGFyZVRvbGVnYWN5TW9kZXByb2Nlc3NlZE9wdHNzdGF0ZWZpbGVTeXN0ZW1vbkRpYWdub3N0aWNpbnB1dHNjbGVhckZpbGVTeXN0ZW1DYWNoZWNvbnRleHRjb21waWxlclJlc3VsdGNvbXBvbmVudG1haW5NZXRob2R3aXRoTG9jYXRpb250b2tlblRvU3RyaW5nYXNzZXJ0aW9uTWVzc2FnZWxleGVtZWdldFN1cHBvcnRlZExpYnJhcnlOYW1lc2pzb25zcGVjaWZpY2F0aW9uRm9yYWxsTGlicmFyaWVzbGlzU3VwcG9ydGVkY29tcGlsZXJfbmV3RGlhZ25vc3RpY0lucHV0S2luZFVURjhJbnB1dEtpbmQuVVRGOGJpbmFyeUlucHV0S2luZC5iaW5hcnlJbnB1dFRpbnB1dEtpbmRDb21waWxlcklucHV0cmVhZEZyb21VcmlPdXRwdXRUeXBlanNPdXRwdXRUeXBlLmpzanNQYXJ0T3V0cHV0VHlwZS5qc1BhcnRzb3VyY2VNYXBPdXRwdXRUeXBlLnNvdXJjZU1hcGR1bXBJbmZvT3V0cHV0VHlwZS5kdW1wSW5mb2RlZmVycmVkTWFwT3V0cHV0VHlwZS5kZWZlcnJlZE1hcGRlYnVnT3V0cHV0VHlwZS5kZWJ1Z091dHB1dFNpbmtjbG9zZUJpbmFyeU91dHB1dFNpbmt3cml0ZWJ1ZmZlcmVuZENvbXBpbGVyT3V0cHV0Y3JlYXRlT3V0cHV0U2lua2V4dGVuc2lvbnR5cGVjcmVhdGVCaW5hcnlTaW5rQ29tcGlsZXJEaWFnbm9zdGljc2NvZGViZWdpbmtpbmRDb21waWxhdGlvblJlc3VsdGNvbXBpbGVyY29tcGlsZXJPcHRpb25zIG11c3QgYmUgbm9uLW51bGxjb21waWxlcklucHV0IG11c3QgYmUgbm9uLW51bGxjb21waWxlckRpYWdub3N0aWNzIG11c3QgYmUgbm9uLW51bGxjb21waWxlck91dHB1dCBtdXN0IGJlIG5vbi1udWxscnVuc3VjY2Vzc2tlcm5lbExvYWRlcmluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZWRhcnQyanMuY21kbGluZS5vcHRpb25zRmxhZ3NhbGxvd01vY2tDb21waWxhdGlvbi0tYWxsb3ctbW9jay1jb21waWxhdGlvbmFsbG93TmF0aXZlRXh0ZW5zaW9ucy0tYWxsb3ctbmF0aXZlLWV4dGVuc2lvbnNkaXNhYmxlSW5saW5pbmctLWRpc2FibGUtaW5saW5pbmdkaXNhYmxlUHJvZ3JhbVNwbGl0LS1kaXNhYmxlLXByb2dyYW0tc3BsaXRkaXNhYmxlRGlhZ25vc3RpY0NvbG9ycy0tZGlzYWJsZS1kaWFnbm9zdGljLWNvbG9yc2Rpc2FibGVOYXRpdmVMaXZlVHlwZUFuYWx5c2lzLS1kaXNhYmxlLW5hdGl2ZS1saXZlLXR5cGUtYW5hbHlzaXN1c2VUcml2aWFsQWJzdHJhY3RWYWx1ZURvbWFpbi0tdXNlLXRyaXZpYWwtYWJzdHJhY3QtdmFsdWUtZG9tYWluZGlzYWJsZVR5cGVJbmZlcmVuY2UtLWRpc2FibGUtdHlwZS1pbmZlcmVuY2VkaXNhYmxlUnRpT3B0aW1pemF0aW9uLS1kaXNhYmxlLXJ0aS1vcHRpbWl6YXRpb24tLWR1bXAtaW5mb2VuYWJsZUFzc2VydE1lc3NhZ2UtLWFzc2VydC1tZXNzYWdlZW5hYmxlQ2hlY2tlZE1vZGUtLWVuYWJsZS1jaGVja2VkLW1vZGUtLWVuYWJsZS1hc3NlcnRzZW5hYmxlRGlhZ25vc3RpY0NvbG9ycy0tZW5hYmxlLWRpYWdub3N0aWMtY29sb3JzZXhwZXJpbWVudGFsVHJhY2tBbGxvY2F0aW9ucy0tZXhwZXJpbWVudGFsLXRyYWNrLWFsbG9jYXRpb25zZXhwZXJpbWVudGFsQWxsb2NhdGlvbnNQYXRoLS1leHBlcmltZW50YWwtYWxsb2NhdGlvbnMtcGF0aGV4cGVyaW1lbnRMb2NhbE5hbWVzLS1leHBlcmltZW50LWNvZGUtMWV4cGVyaW1lbnRTdGFydHVwRnVuY3Rpb25zLS1leHBlcmltZW50LWNvZGUtMmV4cGVyaW1lbnRUb0Jvb2xlYW4tLWV4cGVyaW1lbnQtY29kZS0zZXhwZXJpbWVudENhbGxJbnN0cnVtZW50YXRpb24tLWV4cGVyaW1lbnQtY2FsbC1pbnN0cnVtZW50YXRpb25lbmFibGVMYW5ndWFnZUV4cGVyaW1lbnRzLS1lbmFibGUtZXhwZXJpbWVudGZhc3RTdGFydHVwLS1mYXN0LXN0YXJ0dXBmYXRhbFdhcm5pbmdzLS1mYXRhbC13YXJuaW5nc2dlbmVyYXRlQ29kZVdpdGhDb21waWxlVGltZUVycm9ycy0tZ2VuZXJhdGUtY29kZS13aXRoLWNvbXBpbGUtdGltZS1lcnJvcnNwcmV2aWV3RGFydDItLXByZXZpZXctZGFydC0yb21pdEltcGxpY2l0Q2hlY2tzLS1vbWl0LWltcGxpY2l0LWNoZWNrc29taXRBc0Nhc3RzLS1vbWl0LWFzLWNhc3RzbGF4UnVudGltZVR5cGVUb1N0cmluZy0tbGF4LXJ1bnRpbWUtdHlwZS10by1zdHJpbmctLXBsYXRmb3JtLWJpbmFyaWVzPS4rbWluaWZ5LS1taW5pZnlub0ZyZXF1ZW5jeUJhc2VkTWluaWZpY2F0aW9uLS1uby1mcmVxdWVuY3ktYmFzZWQtbWluaWZpY2F0aW9ubm9NaW5pZnktLW5vLW1pbmlmeW5vU291cmNlTWFwcy0tbm8tc291cmNlLW1hcHNwcmVzZXJ2ZVVyaXMtLXByZXNlcnZlLXVyaXNzaG93UGFja2FnZVdhcm5pbmdzLS1zaG93LXBhY2thZ2Utd2FybmluZ3NzdXBwcmVzc0hpbnRzLS1zdXBwcmVzcy1oaW50c3N1cHByZXNzV2FybmluZ3MtLXN1cHByZXNzLXdhcm5pbmdzdGVyc2UtLXRlcnNldGVzdE1vZGUtLXRlc3QtbW9kZXRydXN0UHJpbWl0aXZlcy0tdHJ1c3QtcHJpbWl0aXZlcy0tdHJ1c3QtdHlwZS1hbm5vdGF0aW9uc3RydXN0SlNJbnRlcm9wVHlwZUFubm90YXRpb25zLS1leHBlcmltZW50YWwtdHJ1c3QtanMtaW50ZXJvcC10eXBlLWFubm90YXRpb25zdXNlQ29udGVudFNlY3VyaXR5UG9saWN5LS1jc3B1c2VNdWx0aVNvdXJjZUluZm8tLXVzZS1tdWx0aS1zb3VyY2UtaW5mb3VzZU5ld1NvdXJjZUluZm8tLXVzZS1uZXctc291cmNlLWluZm9wcm9ncmVzcy0tc2hvdy1pbnRlcm5hbC1wcm9ncmVzcy0tdmVyc2lvbmRpbGxEZXBlbmRlbmNpZXMtLWRpbGwtZGVwZW5kZW5jaWVzcmVhZERhdGEtLXJlYWQtZGF0YXdyaXRlRGF0YS0td3JpdGUtZGF0YWNmZU9ubHktLWNmZS1vbmx5ZGVidWdHbG9iYWxJbmZlcmVuY2UtLWRlYnVnLWdsb2JhbC1pbmZlcmVuY2VzZXJ2ZXJNb2RlLS1zZXJ2ZXItbW9kZW5ld0RlZmVycmVkU3BsaXQtLW5ldy1kZWZlcnJlZC1zcGxpdHJlcG9ydEludmFsaWRJbmZlcnJlZERlZmVycmVkVHlwZXMtLXJlcG9ydC1pbnZhbGlkLWRlZmVycmVkLXR5cGVzYmVuY2htYXJraW5nUHJvZHVjdGlvbi0tYmVuY2htYXJraW5nLXByb2R1Y3Rpb25jb25kaXRpb25hbERpcmVjdGl2ZXMtLWNvbmRpdGlvbmFsLWRpcmVjdGl2ZXNnZW5lcmljTWV0aG9kU3ludGF4LS1nZW5lcmljLW1ldGhvZC1zeW50YXhpbml0aWFsaXppbmdGb3JtYWxBY2Nlc3MtLWluaXRpYWxpemluZy1mb3JtYWwtYWNjZXNzcmVzb2x2ZU9ubHktLXJlc29sdmUtb25seU9wdGlvbj0uKnJlc29sdXRpb25JbnB1dC0tcmVzb2x1dGlvbi1pbnB1dD0uKy0tYmF6ZWwtcGF0aHM9LitjdXJyZW50RGlyZWN0b3J5bmF0aXZlVG9VcmlQYXRoZmlsZW5hbWVyZXBsYWNlQWxsXDp1cmlQYXRoVG9OYXRpdmVuYXRpdmVUb1VyaWFwcGVuZFNsYXNoZGFydDJqcy5zcmMub3B0aW9uc0RpYWdub3N0aWNPcHRpb25zdGVyc2VEaWFnbm9zdGljc3Nob3dBbGxQYWNrYWdlV2FybmluZ3NoaWRlUGFja2FnZVdhcm5pbmdzc2hvd1BhY2thZ2VXYXJuaW5nc0Zvcmxhbmd1YWdlRXhwZXJpbWVudHNidWlsZElkY29tcGlsZUZvclNlcnZlcmRlZmVycmVkTWFwVXJpc2hvd25QYWNrYWdlV2FybmluZ3N1c2VEdW1wSW5mb0JpbmFyeUZvcm1hdGVuYWJsZU1pbmlmaWNhdGlvbl9kaXNhYmxlTWluaWZpY2F0aW9uZW5hYmxlTmF0aXZlTGl2ZVR5cGVBbmFseXNpc2VuYWJsZVVzZXJBc3NlcnRpb25zZ2VuZXJhdGVTb3VyY2VNYXBvdXRwdXRVcmlzb3VyY2VNYXBVcmlhc3NpZ25tZW50Q2hlY2tQb2xpY3lwYXJhbWV0ZXJDaGVja1BvbGljeWltcGxpY2l0RG93bmNhc3RDaGVja1BvbGljeWNvbmRpdGlvbkNoZWNrUG9saWN5dXNlRnJlcXVlbmN5TmFtZXJzaG93SW50ZXJuYWxQcm9ncmVzc3VzZUNGRUNvbnN0YW50c2hhc0J1aWxkSWRwYXJzZS0tZGVmZXJyZWQtbWFwPS0tcGxhdGZvcm0tYmluYXJpZXM9dmFsaWRhdGVbbGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaV0gaXMgbnVsbC5bbGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaV0gc2hvdWxkIGJlIGEgZmlsZTogT25seSBvbmUgb2YgW3BhY2thZ2VSb290XSBvciBbcGFja2FnZUNvbmZpZ10gbWF5IGJlIGdpdmVuLltwYWNrYWdlUm9vdF0gbXVzdCBlbmQgd2l0aCBhIC9NaXNzaW5nIHJlcXVpcmVkIGRlcml2ZU9wdGlvbnNjb250YWluc3BhdGhTZWdtZW50c2ZpcnN0Q2hlY2tQb2xpY3lpc1RydXN0ZWRpc0VtaXR0ZWR0cnVzdGVkY2hlY2tlZENoZWNrUG9saWN5KGlzVHJ1c3RlZD1pc0VtaXR0ZWQ9KV9VTkRFVEVSTUlORURfQlVJTERfSURidWlsZCBudW1iZXIgY291bGQgbm90IGJlIGRldGVybWluZWRfZXh0cmFjdFN0cmluZ09wdGlvbnByZWZpeGRlZmF1bHRWYWx1ZW9wdGlvbl9leHRyYWN0VXJpT3B0aW9uX2hhc09wdGlvbl9leHRyYWN0T3B0aW9uYWxDc3ZPcHRpb25fZXh0cmFjdFVyaUxpc3RPcHRpb25zdHJpbmdVcmlzX2V4dHJhY3RFeHBlcmltZW50c2V4cGVyaW1lbnRzZXJyb3Jzb3VyY2VfZmlsZV9wcm92aWRlcm1hdGhjb2xvcnNNZXNzYWdlQ2FsbGJhY2tTb3VyY2VGaWxlUHJvdmlkZXJpc1dpbmRvd3Njd2R1dGY4U291cmNlRmlsZXNiaW5hcnlTb3VyY2VGaWxlc3JlYWRCeXRlc0Zyb21VcmlyZXNvdXJjZVVyaWlzQWJzb2x1dGVyZXNvbHZlVXJpX3JlYWRGcm9tRmlsZWh0dHBodHRwc19yZWFkRnJvbUh0dHBVbmtub3duIHNjaGVtZSBpbiB1cmkgJydfcmVhZEZyb21GaWxlU3luY3NvdXJjZXplcm9UZXJtaW5hdGVkZXhvc0Vycm9yZGV0YWlsIChFcnJvciByZWFkaW5nICcnIGF1dG9SZWFkRnJvbUZpbGVlY2xpZW50Z2V0VXJscmVxdWVzdHJlc3BvbnNlc3RhdHVzQ29kZW1zZ0ZhaWx1cmUgZ2V0dGluZyA6IHJlYXNvblBocmFzZXNwbGl0Q29udGVudHRvdGFsTGVuZ3RoZm9sZG9sZGxpc3RvZmZzZXRjb250ZW50UGFydHNldFJhbmdldW5pbXBsZW1lbnRlZGdldFV0ZjhTb3VyY2VGaWxldXJpc0NvbXBpbGVyU291cmNlRmlsZVByb3ZpZGVyRm9ybWF0dGluZ0RpYWdub3N0aWNIYW5kbGVycHJvdmlkZXJpc0Fib3J0aW5nbGFzdEtpbmRmYXRhbENvdW50RkFUQUxvcmRpbmFsSU5GT0luZm86SW5mbzogcHJlZml4TWVzc2FnZVdhcm5pbmc6IEhpbnQ6IEludGVybmFsIEVycm9yOiBVbmV4cGVjdGVkIGRpYWdub3N0aWMga2luZDogZmF0YWwmaXNJbmZvY29sb3JVbmtub3duIGtpbmQ6IHguZGFydGdldExvY2F0aW9uTWVzc2FnZWNvbG9yaXplQDoKUmFuZG9tQWNjZXNzRmlsZU91dHB1dFByb3ZpZGVydG90YWxDaGFyYWN0ZXJzV3JpdHRlbmNyZWF0ZVVyaVVua25vd24gb3V0cHV0IHR5cGU6IGlzUHJpbWFyeU91dHB1dCBpbiBjaGFyYWN0ZXJzV3JpdHRlbmNodW5rU2l6ZSpvbkRvbmVieXRlc1dyaXR0ZW53cml0ZUJ5dGVzU3luY3dyaXRlRnJvbVN5bmNSYW5kb21BY2Nlc3NCaW5hcnlPdXRwdXRTaW5rX091dHB1dFNpbmtXcmFwcGVyb25BZGRvbkNsb3NlX0JpbmFyeU91dHB1dFNpbmtXcmFwcGVyb25Xcml0ZUJhemVsSW5wdXRQcm92aWRlcmRpcnNzZWFyY2hQYXRoc19yZXNvbHZlcmVzb2x2ZWRVcmkvYmF6ZWwtcm9vdC9iYXplbC1yb290L2RpcmV4aXN0c2V4aXN0c1N5bmNyZWFkQWxsbGVuZ3RoU3luY2J1ZmZlckxlbmd0aHJlYWRJbnRvU3luY2RhcnQyanMudXRpbC5jb21tYW5kX2xpbmVFU0NBUEVfTUFQUElOR25yDXQJCAwLc3BsaXRMaW5laW5RdW90ZXNvcGVuaW5nUXVvdGUiVW5maW5pc2hlZCBlc2NhcGU6IG5leHRtYXBwZWRpc05vdEVtcHR5VW5jbG9zZWQgcXVvdGVzOiB1cmlfZXh0cmFzcmVsYXRpdml6ZWJhc2VlcXVhbHNOQ1N0b0xvd2VyQ2FzZWRhcnRub3JtYWxpemV1c2VySW5mb2hvc3Rwb3J0cXVlcnlmcmFnbWVudGxhc3RJbmRleE9mdXJpUGFydHNiYXNlUGFydHNjb21tb25zYi4uL2RhcnQyanMudXRpbGluZGVudGF0aW9uLmRhcnRIYXNoaW5nU01JX01BU0ttaXhIYXNoQ29kZUJpdHNleGlzdGluZzw8Xj4+aGlnaGxvd29iamVjdEhhc2hvYmplY3RoYXNoQ29kZW9iamVjdHNIYXNob2JqMW9iajJvYmozb2JqNG9iajVoYXNobGlzdEhhc2hzZXRIYXNoRWl0ZXJhYmxldW5vcmRlcmVkTWFwSGFzaGtleW1hcEhhc2hQYWlyQUJvdGhlcihJbmRlbnRhdGlvbl9pbmRlbnRMZXZlbF9pbmRlbnRMaXN0X2luZGVudGF0aW9uVW5pdCAgaW5kZW50YXRpb25pbmRlbnRhdGlvblVuaXRpbmRlbnRNb3JlaW5kZW50TGVzc2luZGVudEJsb2NrVGFnZ2luZ050YWdTdGFja3B1c2hUYWd0YWdwcmVwZW5kcG9wVGFnaGVhZHRhaWxzdHJpbmdhZGREZWZhdWx0UGFyYW1ldGVyc25vZGVwYXJhbXNvcGVuTm9kZWFkZEN1cnJlbnRJbmRlbnRhZGRUeXBlV2l0aFBhcmFtcz4Kb3BlbkFuZENsb3NlTm9kZS8+CmNsb3NlTm9kZTwvZm9yRWFjaGtzdHJ2YWx1ZVRvU3RyaW5nJmx0OyZndDtbbnVsbF09ImVxdWFsRWxlbWVudHNlcXVhbFNldHNjb250YWluc0FsbGVxdWFsTWFwc0tWd3JpdGVKc29uRXNjYXBlZENoYXJzT25hZGRDb2RlVW5pdEVzY2FwZWRcdTB0b1JhZGl4U3RyaW5nd3JpdGVFc2NhcGVkT25jb2RlVW5pdEF0XCJcdFxuXHJcXHdyaXRlQ2hhckNvZGVjb21wdXRlSGFzaENvZGVwYXJ0MXBhcnQycGFydDNwYXJ0NHBhcnQ1bW9kaWZpZXJzVG9TdHJpbmdpc1N0YXRpY2lzQWJzdHJhY3Rpc0ZpbmFsaXNWYXJpc0NvbnN0aXNGYWN0b3J5aXNFeHRlcm5hbGlzQ292YXJpYW50YnVpbGRlcmFkZExhc3RzdGF0aWNhYnN0cmFjdGZpbmFsdmFyY29uc3RmYWN0b3J5ZXh0ZXJuYWxjb3ZhcmlhbnR0b0xpbmtwcmludE9uLCBsb25nZXN0Q29tbW9uUHJlZml4TGVuZ3RobWFrZVVuaXF1ZXN1Z2dlc3RlZE5hbWV1c2VkTmFtZXNjb3VudGVya2VybmVsbG9hZENvbXBvbmVudEZyb21CaW5hcnlieXRlc3JlYWRBc0J5dGVzU3luY2xvYWRDb21wb25lbnRGcm9tQnl0ZXNyZWFkQ29tcG9uZW50bG9hZENvbXBvbmVudFNvdXJjZUZyb21CeXRlc3JlYWRDb21wb25lbnRTb3VyY2V3cml0ZUNvbXBvbmVudFRvQmluYXJ5c2lua251bGxzdGRvdXRub25CbG9ja2luZ29wZW5Xcml0ZXdyaXRlQ29tcG9uZW50RmlsZWZsdXNod3JpdGVMaWJyYXJ5VG9UZXh0bGlicmFyeXdyaXRlTGlicmFyeUZpbGV3cml0ZUFzU3RyaW5nU3luY3dyaXRlQ29tcG9uZW50VG9UZXh0c2hvd0V4dGVybmFsc2hvd09mZnNldHNzaG93TWV0YWRhdGFrZXJuZWwudGFyZ2V0LnRhcmdldHNfVGFyZ2V0QnVpbGRlcmZsYWdzVGFyZ2V0RmxhZ3NEaWFnbm9zdGljUmVwb3J0ZXJNQ2NoYXJPZmZzZXRmaWxlVXJpTnVtYmVyU2VtYW50aWNzdm1OdW1iZXJTZW1hbnRpY3Mudm1OdW1iZXJTZW1hbnRpY3MuanNDb25zdGFudHNCYWNrZW5kbG93ZXJMaXN0Q29uc3RhbnRjb25zdGFudGxvd2VyU2V0Q29uc3RhbnRsb3dlck1hcENvbnN0YW50bnVtYmVyU2VtYW50aWNzZXh0cmFSZXF1aXJlZExpYnJhcmllc2V4dHJhRGVjbGFyZWRWYXJpYWJsZXNyZXF1aXJlZFNka0NsYXNzZXNlbmFibGVOb1N1Y2hNZXRob2RGb3J3YXJkZXJzZW5hYmxlU3VwZXJNaXhpbnNwZXJmb3JtT3V0bGluZVRyYW5zZm9ybWF0aW9uc3BlcmZvcm1Nb2R1bGFyVHJhbnNmb3JtYXRpb25zT25MaWJyYXJpZXNjb3JlVHlwZXNoaWVyYXJjaHlsaWJyYXJpZXNkaWFnbm9zdGljUmVwb3J0ZXJsb2dnZXJwZXJmb3JtVHJhbnNmb3JtYXRpb25zT25Qcm9jZWR1cmVwcm9jZWR1cmVtYXlEZWZpbmVSZXN0cmljdGVkVHlwZWNvcmVhbGxvd1BsYXRmb3JtUHJpdmF0ZUxpYnJhcnlBY2Nlc3NpbXBvcnRlcmltcG9ydGVkZGFydF9pbnRlcm5hbC9lbmFibGVOYXRpdmVuYXRpdmVFeHRlbnNpb25FeHBlY3RzU3RyaW5nZXJyb3JPblVuZXhhY3RXZWJJbnRMaXRlcmFsc3N1cHBvcnRzU2V0TGl0ZXJhbHNpbnN0YW50aWF0ZUludm9jYXRpb25yZWNlaXZlcmlzU3VwZXJpbnN0YW50aWF0ZU5vU3VjaE1ldGhvZEVycm9yaXNNZXRob2Rpc0dldHRlcmlzU2V0dGVyaXNGaWVsZGlzTG9jYWxWYXJpYWJsZWlzRHluYW1pY2lzQ29uc3RydWN0b3Jpc1RvcExldmVsY29uZmlndXJlQ29tcG9uZW50VGFyZ2V0KGNvbmNyZXRlTGlzdExpdGVyYWxDbGFzc2NvbmNyZXRlQ29uc3RMaXN0TGl0ZXJhbENsYXNzY29uY3JldGVNYXBMaXRlcmFsQ2xhc3Njb25jcmV0ZUNvbnN0TWFwTGl0ZXJhbENsYXNzY29uY3JldGVJbnRMaXRlcmFsQ2xhc3Njb25jcmV0ZVN0cmluZ0xpdGVyYWxDbGFzc2NvbnN0YW50c0JhY2tlbmROb25lVGFyZ2V0bm9uZXRhcmdldE5hbWVzdGFyZ2V0c2dldFRhcmdldGZyb250X2VuZC5jb21waWxlcl9vcHRpb25zcGFyc2VFeHBlcmltZW50YWxGbGFnU3RhbmRhcmRGaWxlU3lzdGVtc2RrUm9vdGlucHV0U3VtbWFyaWVzc2RrU3VtbWFyeWRlY2xhcmVkVmFyaWFibGVzY29tcGlsZVNka2NoYXNlRGVwZW5kZW5jaWVzdGFyZ2V0UGF0Y2hlc2Vudmlyb25tZW50RGVmaW5lc2RlYnVnRHVtcG9taXRQbGF0Zm9ybXNldEV4aXRDb2RlT25Qcm9ibGVtZW1iZWRTb3VyY2VUZXh0dGhyb3dPbkVycm9yc0ZvckRlYnVnZ2luZ3Rocm93T25XYXJuaW5nc0ZvckRlYnVnZ2luZ2J5dGVjb2Rld3JpdGVGaWxlT25DcmFzaFJlcG9ydGV4cGVyaW1lbnRuby1Vbmtub3duIGV4cGVyaW1lbnQ6IEV4cGVyaW1lbnQgc3BlY2lmaWVkIHdpdGggY29uZmxpY3RpbmcgdmFsdWVzOiBObyBkZWZhdWx0IHZhbHVlIGZvciBmcm9udF9lbmQuZGlhZ25vc3RpY19tZXNzYWdlQ29kZURpYWdub3N0aWNNZXNzYWdlRnJvbUpzb25Gb3JtYXR0ZWRNZXNzYWdlYW5zaUZvcm1hdHRlZHBsYWluVGV4dEZvcm1hdHRlZHNldmVyaXR5Z2V0TWVzc2FnZUNvZGVPYmplY3RnZXRNZXNzYWdlQ29kZWdldE1lc3NhZ2VBcmd1bWVudHNyZWxhdGVkSW5mb3JtYXRpb25jb25zdGFudFVwZGF0ZTIwMThFeHBlcmltZW50YWxGbGFnLmNvbnN0YW50VXBkYXRlMjAxOGNvbnRyb2xGbG93Q29sbGVjdGlvbnNFeHBlcmltZW50YWxGbGFnLmNvbnRyb2xGbG93Q29sbGVjdGlvbnNzZXRMaXRlcmFsc0V4cGVyaW1lbnRhbEZsYWcuc2V0TGl0ZXJhbHNzcHJlYWRDb2xsZWN0aW9uc0V4cGVyaW1lbnRhbEZsYWcuc3ByZWFkQ29sbGVjdGlvbnNjb25zdGFudC11cGRhdGUtMjAxOGNvbnRyb2wtZmxvdy1jb2xsZWN0aW9uc3NldC1saXRlcmFsc3NwcmVhZC1jb2xsZWN0aW9uc2Zyb250X2VuZC5maWxlX3N5c3RlbWVudGl0eUZvclVyaXJlYWRBc0J5dGVzcmVhZEFzU3RyaW5nRmlsZVN5c3RlbUV4Y2VwdGlvbih1cmk9OyBtZXNzYWdlPVVpbnQ4TGlzdEJpbmFyeUJ1aWxkZXJDYW5vbmljYWxOYW1lTG9jYXRpb25QYWNrYWdlc3BhY2thZ2VfY29uZmlnTWFwUGFja2FnZXNwcmludERpYWdub3N0aWNNZXNzYWdlY29tbWFuZF9saW5lX3JlcG9ydGluZ01lc3NhZ2VtZXNzYWdlQ2FudEluZmVyUGFja2FnZXNGcm9tTWFueUlucHV0c21lc3NhZ2VDYW50SW5mZXJQYWNrYWdlc0Zyb21QYWNrYWdlVXJpbWVzc2FnZUludGVybmFsUHJvYmxlbVByb3ZpZGVkQm90aENvbXBpbGVTZGtBbmRTZGtTdW1tYXJ5bWVzc2FnZU1pc3NpbmdJbnB1dG5vTGVuZ3RodGVtcGxhdGVDYW5ub3RSZWFkU2RrU3BlY2lmaWNhdGlvbnRlbXBsYXRlQ2FudFJlYWRGaWxldGVtcGxhdGVJbnB1dEZpbGVOb3RGb3VuZHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVW5zdXBwb3J0ZWR0ZW1wbGF0ZVBhY2thZ2VzRmlsZUZvcm1hdHRlbXBsYXRlU2RrUm9vdE5vdEZvdW5kdGVtcGxhdGVTZGtTcGVjaWZpY2F0aW9uTm90Rm91bmR0ZW1wbGF0ZVNka1N1bW1hcnlOb3RGb3VuZGdldExvY2F0aW9uRGVidWdBYm9ydFRpY2tlclVyaVRyYW5zbGF0b3JMaWJyYXJpZXNTcGVjaWZpY2F0aW9uRXhjZXB0aW9uVGFyZ2V0TGlicmFyaWVzU3BlY2lmaWNhdGlvbl9yYXdfcGFja2FnZXNfcGFja2FnZXNVcmlfdXJpVHJhbnNsYXRvcl9zZGtTdW1tYXJ5Q29tcG9uZW50X2lucHV0U3VtbWFyaWVzQ29tcG9uZW50c19saW5rZWREZXBlbmRlbmNpZXNfc2RrUm9vdF9zZGtTdW1tYXJ5X3Nka1N1bW1hcnlCeXRlc19saWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpdGlja2VyX2ZpbGVTeXN0ZW1fdGFyZ2V0X2NvbXB1dGVkU2RrRGVmYXVsdHNpc1ZlcmJvc2VwYWNrYWdlc1VyaV9lbnN1cmVTZGtEZWZhdWx0c2xvYWRTZGtTdW1tYXJ5Qnl0ZXNlbnRyeV9yZWFkQXNCeXRlc3BhY2thZ2VzVXJpUmF3Zm9ybWF0bG9jYXRpb25mb3JtYXR0ZWRmb3JtYXR0ZWRDb250ZXh0d2l0aEZvcm1hdHRpbmdjb2x1bW5sb2dFcnJvcnJlcG9ydERpYWdub3N0aWNNZXNzYWdlX2RlZmF1bHREaWFnbm9zdGljTWVzc2FnZUhhbmRsZXJyZXBvcnRXaXRob3V0TG9jYXRpb253aXRob3V0TG9jYXRpb252YWxpZGF0ZU9wdGlvbnNlcnJvck9uTWlzc2luZ0lucHV0OmFzeW5jX3RlbXBvcmFyeV8wOmFzeW5jX3RlbXBvcmFyeV8xZGVidWdTdHJpbmd3aXRoQXJndW1lbnRzc3VtbWFyeV9jcmVhdGVGaWxlU3lzdGVtaXNFeHBlcmltZW50RW5hYmxlZGxvYWRTZGtTdW1tYXJ5bmFtZVJvb3Rsb2FkQ29tcG9uZW50c2RrU3VtbWFyeUNvbXBvbmVudHBsYXRmb3Jtc2RrU3VtbWFyeSBhbHJlYWR5IGxvYWRlZC5sb2FkSW5wdXRTdW1tYXJpZXNhbGxCeXRlc2lucHV0U3VtbWFyaWVzQ29tcG9uZW50c2NvbXBvbmVudHNpbnB1dFN1bW1hcmllc0NvbXBvbmVudHMgYWxyZWFkeSBsb2FkZWQubG9hZExpbmtEZXBlbmRlbmNpZXNkaXNhYmxlTGF6eVJlYWRpbmdnZXRVcmlUcmFuc2xhdG9yYnlwYXNzQ2FjaGVsb2dNc1N0YXJ0ZWQgYnVpbGRpbmcgVXJpVHJhbnNsYXRvcl9jb21wdXRlTGlicmFyeVNwZWNpZmljYXRpb25SZWFkIGxpYnJhcmllcyBmaWxlX2dldFBhY2thZ2VzcGFja2FnZXNSZWFkIHBhY2thZ2VzIGZpbGU6c2F2ZWRfdHJ5X2NvbnRleHRfdmFyMV9mYXN0YXNwZWNjcmVhdGVQYWNrYWdlc0Zyb21GaWxlX2ZpbmRQYWNrYWdlc2NvbnRlbnRzc2NyaXB0VXJpRXhwZWN0ZWQgaW5wdXQgVXJpIHRvIGJlIGFic29sdXRlOiBjaGVja0luRGlyY2FuZGlkYXRlLnBhY2thZ2VzcGFyZW50RGlyLi5yb290cmVwbGFjZWluZmVyIHRoZSBkZWZhdWx0IHNkayBsb2NhdGlvbnZtX3BsYXRmb3JtX3N0cm9uZy5kaWxsd3JpdGVMaXN0ZWxlbWVudHM6IDxlbXB0eT5zICAtIElucHV0czogT3V0cHV0OiBXYXMgZGlhZ25vc3RpYyBtZXNzYWdlIGhhbmRsZXIgcHJvdmlkZWQ6IG5veWVzRmlsZVN5c3RlbTogcnVudGltZVR5cGUocHJvdmlkZWQ6IElucHV0IFN1bW1hcmllc0xpbmtlZCBEZXBlbmRlbmNpZXNQYWNrYWdlcyB1cmk6IFBhY2thZ2VzOiBDb21waWxlIFNESzogU0RLIHJvb3Q6ICAocHJvdmlkZWQ6IFNESyBzcGVjaWZpY2F0aW9uOiBTREsgc3VtbWFyeTogTGVnYWN5IG1vZGU6IFRhcmdldDogdGhyb3dPbkVycm9yc0ZvckRlYnVnZ2luZzogdGhyb3dPbldhcm5pbmdzRm9yRGVidWdnaW5nOiBleGl0IG9uIHByb2JsZW06IEVtYmVkIHNvdXJjZXM6IGRlYnVnRHVtcDogdmVyYm9zZTogdmVyaWZ5OiBIZXJtZXRpY0ZpbGVTeXN0ZW1pbmNsdWRlZEZpbGVzX3JlYWxGaWxlU3lzdGVtSGVybWV0aWNBY2Nlc3NFeGNlcHRpb25JbnZhbGlkIGFjY2VzcyB0byB0aGUgZmlsZSBpcyBhY2Nlc3NlZCBpbiBhIG1vZHVsYXIgaGVybWV0aWMgYnVpbGQsIGJ1dCBpdCB3YXMgbm90IGV4cGxpY2l0bHkgbGlzdGVkIGFzIGFuIGlucHV0Lmpzb25EZWNvZGVqc29uRW5jb2RlX3RhcmdldHN0YXJnZXRTcGVjTm8gbGlicmFyeSBzcGVjaWZpY2F0aW9uIGZvciB0YXJnZXQgImJhc2VVcmlqc29uRGF0YXRvcC1sZXZlbCBzcGVjaWZpY2F0aW9uIGlzIG5vdCBhIG1hcHRhcmdldE5hbWV0YXJnZXREYXRhY29tbWVudDp0YXJnZXQgc3BlY2lmaWNhdGlvbiBmb3IgJycgaXMgbm90IGEgbWFwdGFyZ2V0IHNwZWNpZmljYXRpb24gZm9yICcnIGRvZXNuJ3QgaGF2ZSBhIGxpYnJhcmllcyBlbnRyeWxpYnJhcmllc0RhdGFsaWJyYXJpZXMgZW50cnkgZm9yICdsaWJyYXJ5IGRhdGEgZm9yICcnIGluIHRhcmdldCAnY2hlY2tBbmRSZXNvbHZldXJpU3RyaW5ndXJpIHZhbHVlICcnIGlzIG5vdCBhIHN0cmluZyhmcm9tIGxpYnJhcnkgJycpdXJpIHNjaGVtZSBpbiAncGF0Y2hlc3BhdGNoZXMgZW50cnkgZm9yICcnIGlzIG5vdCBhIGxpc3Qgb3IgYSBzdHJpbmdzdXBwb3J0ZWQic3VwcG9ydGVkIiBlbnRyeTogZXhwZWN0ZWQgYSAnYm9vbCcgYnV0IGdvdCBhICcnICgnX3JlcG9ydEVycm9ydG9Kc29uU3RyaW5ndG9Kc29uTWFwcGF0aEZvcl9saWJyYXJpZXNsaWJsaWJyYXJ5SW5mb0ZvckxpYnJhcnlJbmZvZmFzdGEuY29tcGlsZXJfY29udGV4dFpvbmVydW5ab25lZFNvdXJjZWNvbXB1dGVFbmFibGVDb2xvcnNtZXNzYWdlSW50ZXJuYWxQcm9ibGVtTWlzc2luZ0NvbnRleHR1cmlUb1NvdXJjZWVycm9yc2VuYWJsZUNvbG9yc0NhY2hlZGNhY2hlZFNka1Jvb3RkaXNhYmxlQ29sb3JzZm9ybWF0V2l0aG91dExvY2F0aW9ucmVjb3JkRGVwZW5kZW5jeUV4cGVjdGVkIGEgZmlsZS1VUkksIGJ1dCBnb3Q6ICd0aXBJbnRlcm5hbCBwcm9ibGVtOiAKVGlwOiBpc0FjdGl2ZXJ1bkluQ29udGV4dGFjdGlvbnpvbmVWYWx1ZXNydW5XaXRoT3B0aW9uc3J1bldpdGhEZWZhdWx0T3B0aW9uc2NvbXBpbGVyQ29udGV4dEtleWZhc3RhLmNvZGVzSnNvbkVuY29kZXJDb25zdGFudERhcnRUeXBlZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZXV0aWxmYXN0YV9jb2Rlc19nZW5lcmF0ZWQuZGFydFN1bW1hcnlUZW1wbGF0ZXRlbXBsYXRlYW5hbHl6ZXJDb2Rlc01lc3NhZ2VDb2RlVGVtcGxhdGVtZXNzYWdlVGVtcGxhdGV0aXBUZW1wbGF0ZW1lc3NhZ2VPYmplY3Rsb2NhdGVkTWVzc2FnZTpzeW5jX29wOml0ZXJhdG9yX2N1cnJlbnR0b0pzb25lbmNvZGVyY29udmVydGZyb21Kc29uanNvblN0cmluZ2RlY29kZWRkZWNvZGV0ZW1wbGF0ZUFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uVGhlIGNsYXNzICcjbmFtZScgaXMgYWJzdHJhY3QgYW5kIGNhbid0IGJlIGluc3RhbnRpYXRlZC5jb2RlQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25BYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbk5FV19XSVRIX0FCU1RSQUNUX0NMQVNTY29kZUFic3RyYWN0Q2xhc3NNZW1iZXJtZXNzYWdlQWJzdHJhY3RDbGFzc01lbWJlckFic3RyYWN0Q2xhc3NNZW1iZXJNZW1iZXJzIG9mIGNsYXNzZXMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgJ2Fic3RyYWN0Jy5UcnkgcmVtb3ZpbmcgdGhlICdhYnN0cmFjdCcga2V5d29yZC4gWW91IGNhbiBhZGQgdGhlICdhYnN0cmFjdCcga2V5d29yZCBiZWZvcmUgdGhlIGNsYXNzIGRlY2xhcmF0aW9uLmNvZGVBYnN0cmFjdE5vdFN5bmNtZXNzYWdlQWJzdHJhY3ROb3RTeW5jQWJzdHJhY3ROb3RTeW5jTk9OX1NZTkNfQUJTVFJBQ1RfTUVUSE9EQWJzdHJhY3QgbWV0aG9kcyBjYW4ndCB1c2UgJ2FzeW5jJywgJ2FzeW5jKicsIG9yICdzeW5jKicudGVtcGxhdGVBYnN0cmFjdFJlZGlyZWN0ZWRDbGFzc0luc3RhbnRpYXRpb25GYWN0b3J5IHJlZGlyZWN0cyB0byBjbGFzcyAnI25hbWUnLCB3aGljaCBpcyBhYnN0cmFjdCBhbmQgY2FuJ3QgYmUgaW5zdGFudGlhdGVkLmNvZGVBYnN0cmFjdFJlZGlyZWN0ZWRDbGFzc0luc3RhbnRpYXRpb25BYnN0cmFjdFJlZGlyZWN0ZWRDbGFzc0luc3RhbnRpYXRpb25GQUNUT1JZX1JFRElSRUNUU19UT19BQlNUUkFDVF9DTEFTU3RlbXBsYXRlQWNjZXNzRXJyb3JBY2Nlc3MgZXJyb3I6ICcjbmFtZScuY29kZUFjY2Vzc0Vycm9yQWNjZXNzRXJyb3J0ZW1wbGF0ZUFtYmlndW91c1N1cGVydHlwZXMnI25hbWUnIGNhbid0IGltcGxlbWVudCBib3RoICcjdHlwZScgYW5kICcjdHlwZTInY29kZUFtYmlndW91c1N1cGVydHlwZXNBbWJpZ3VvdXNTdXBlcnR5cGVzQU1CSUdVT1VTX1NVUEVSVFlQRVNjb2RlQW5vbnltb3VzQnJlYWtUYXJnZXRPdXRzaWRlRnVuY3Rpb25tZXNzYWdlQW5vbnltb3VzQnJlYWtUYXJnZXRPdXRzaWRlRnVuY3Rpb25Bbm9ueW1vdXNCcmVha1RhcmdldE91dHNpZGVGdW5jdGlvbkxBQkVMX0lOX09VVEVSX1NDT1BFQ2FuJ3QgYnJlYWsgdG8gYSB0YXJnZXQgaW4gYSBkaWZmZXJlbnQgZnVuY3Rpb24uY29kZUFub255bW91c0NvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9ubWVzc2FnZUFub255bW91c0NvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uQW5vbnltb3VzQ29udGludWVUYXJnZXRPdXRzaWRlRnVuY3Rpb25DYW4ndCBjb250aW51ZSBhdCBhIHRhcmdldCBpbiBhIGRpZmZlcmVudCBmdW5jdGlvbi50ZW1wbGF0ZUFyZ3VtZW50VHlwZU5vdEFzc2lnbmFibGVUaGUgYXJndW1lbnQgdHlwZSAnI3R5cGUnIGNhbid0IGJlIGFzc2lnbmVkIHRvIHRoZSBwYXJhbWV0ZXIgdHlwZSAnI3R5cGUyJy5UcnkgY2hhbmdpbmcgdGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlciwgb3IgY2FzdGluZyB0aGUgYXJndW1lbnQgdG8gJyN0eXBlMicuY29kZUFyZ3VtZW50VHlwZU5vdEFzc2lnbmFibGVBcmd1bWVudFR5cGVOb3RBc3NpZ25hYmxlQVJHVU1FTlRfVFlQRV9OT1RfQVNTSUdOQUJMRXRlbXBsYXRlQXNjaWlDb250cm9sQ2hhcmFjdGVyVGhlIGNvbnRyb2wgY2hhcmFjdGVyICN1bmljb2RlIGNhbiBvbmx5IGJlIHVzZWQgaW4gc3RyaW5ncyBhbmQgY29tbWVudHMuY29kZUFzY2lpQ29udHJvbENoYXJhY3RlckFzY2lpQ29udHJvbENoYXJhY3RlcklMTEVHQUxfQ0hBUkFDVEVSY29kZUFzc2VydEFzRXhwcmVzc2lvbm1lc3NhZ2VBc3NlcnRBc0V4cHJlc3Npb25Bc3NlcnRBc0V4cHJlc3Npb25gYXNzZXJ0YCBjYW4ndCBiZSB1c2VkIGFzIGFuIGV4cHJlc3Npb24uY29kZUFzc2VydEV4dHJhbmVvdXNBcmd1bWVudG1lc3NhZ2VBc3NlcnRFeHRyYW5lb3VzQXJndW1lbnRBc3NlcnRFeHRyYW5lb3VzQXJndW1lbnRgYXNzZXJ0YCBjYW4ndCBoYXZlIG1vcmUgdGhhbiB0d28gYXJndW1lbnRzLmNvZGVBc3luY0FzSWRlbnRpZmllcm1lc3NhZ2VBc3luY0FzSWRlbnRpZmllckFzeW5jQXNJZGVudGlmaWVyQVNZTkNfS0VZV09SRF9VU0VEX0FTX0lERU5USUZJRVInYXN5bmMnIGNhbid0IGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBpbiAnYXN5bmMnLCAnYXN5bmMqJywgb3IgJ3N5bmMqJyBtZXRob2RzLmNvZGVBd2FpdEFzSWRlbnRpZmllcm1lc3NhZ2VBd2FpdEFzSWRlbnRpZmllckF3YWl0QXNJZGVudGlmaWVyJ2F3YWl0JyBjYW4ndCBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIgaW4gJ2FzeW5jJywgJ2FzeW5jKicsIG9yICdzeW5jKicgbWV0aG9kcy5jb2RlQXdhaXRGb3JOb3RBc3luY21lc3NhZ2VBd2FpdEZvck5vdEFzeW5jQXdhaXRGb3JOb3RBc3luY0FTWU5DX0ZPUl9JTl9XUk9OR19DT05URVhUVGhlIGFzeW5jaHJvbm91cyBmb3ItaW4gY2FuIG9ubHkgYmUgdXNlZCBpbiBmdW5jdGlvbnMgbWFya2VkIHdpdGggJ2FzeW5jJyBvciAnYXN5bmMqJy5UcnkgbWFya2luZyB0aGUgZnVuY3Rpb24gYm9keSB3aXRoIGVpdGhlciAnYXN5bmMnIG9yICdhc3luYyonLCBvciByZW1vdmluZyB0aGUgJ2F3YWl0JyBiZWZvcmUgdGhlIGZvciBsb29wLmNvZGVBd2FpdE5vdEFzeW5jbWVzc2FnZUF3YWl0Tm90QXN5bmNBd2FpdE5vdEFzeW5jQVdBSVRfSU5fV1JPTkdfQ09OVEVYVCdhd2FpdCcgY2FuIG9ubHkgYmUgdXNlZCBpbiAnYXN5bmMnIG9yICdhc3luYyonIG1ldGhvZHMudGVtcGxhdGVCb3VuZElzc3VlVmlhQ3ljbGVOb25TaW1wbGljaXR5R2VuZXJpYyB0eXBlICcjbmFtZScgY2FuJ3QgYmUgdXNlZCB3aXRob3V0IHR5cGUgYXJndW1lbnRzIGluIHRoZSBib3VuZHMgb2YgaXRzIG93biB0eXBlIHZhcmlhYmxlcy4gSXQgaXMgcmVmZXJlbmNlZCBpbmRpcmVjdGx5IHRocm91Z2ggJyNuYW1lMicuVHJ5IHByb3ZpZGluZyB0eXBlIGFyZ3VtZW50cyB0byAnI25hbWUyJyBoZXJlIG9yIHRvIHNvbWUgb3RoZXIgcmF3IHR5cGVzIGluIHRoZSBib3VuZHMgYWxvbmcgdGhlIHJlZmVyZW5jZSBjaGFpbi5jb2RlQm91bmRJc3N1ZVZpYUN5Y2xlTm9uU2ltcGxpY2l0eUJvdW5kSXNzdWVWaWFDeWNsZU5vblNpbXBsaWNpdHlOT1RfSU5TVEFOVElBVEVEX0JPVU5EdGVtcGxhdGVCb3VuZElzc3VlVmlhTG9vcE5vblNpbXBsaWNpdHlHZW5lcmljIHR5cGUgJyNuYW1lJyBjYW4ndCBiZSB1c2VkIHdpdGhvdXQgdHlwZSBhcmd1bWVudHMgaW4gdGhlIGJvdW5kcyBvZiBpdHMgb3duIHR5cGUgdmFyaWFibGVzLlRyeSBwcm92aWRpbmcgdHlwZSBhcmd1bWVudHMgdG8gJyNuYW1lJyBoZXJlLmNvZGVCb3VuZElzc3VlVmlhTG9vcE5vblNpbXBsaWNpdHlCb3VuZElzc3VlVmlhTG9vcE5vblNpbXBsaWNpdHl0ZW1wbGF0ZUJvdW5kSXNzdWVWaWFSYXdUeXBlV2l0aE5vblNpbXBsZUJvdW5kc0dlbmVyaWMgdHlwZSAnI25hbWUnIGNhbid0IGJlIHVzZWQgd2l0aG91dCB0eXBlIGFyZ3VtZW50cyBpbiBhIHR5cGUgdmFyaWFibGUgYm91bmQuY29kZUJvdW5kSXNzdWVWaWFSYXdUeXBlV2l0aE5vblNpbXBsZUJvdW5kc0JvdW5kSXNzdWVWaWFSYXdUeXBlV2l0aE5vblNpbXBsZUJvdW5kc2NvZGVCcmVha091dHNpZGVPZkxvb3BtZXNzYWdlQnJlYWtPdXRzaWRlT2ZMb29wQnJlYWtPdXRzaWRlT2ZMb29wQSBicmVhayBzdGF0ZW1lbnQgY2FuJ3QgYmUgdXNlZCBvdXRzaWRlIG9mIGEgbG9vcCBvciBzd2l0Y2ggc3RhdGVtZW50LlRyeSByZW1vdmluZyB0aGUgYnJlYWsgc3RhdGVtZW50LnRlbXBsYXRlQnJlYWtUYXJnZXRPdXRzaWRlRnVuY3Rpb25DYW4ndCBicmVhayB0byAnI25hbWUnIGluIGEgZGlmZmVyZW50IGZ1bmN0aW9uLmNvZGVCcmVha1RhcmdldE91dHNpZGVGdW5jdGlvbkJyZWFrVGFyZ2V0T3V0c2lkZUZ1bmN0aW9udGVtcGxhdGVCdWlsdEluSWRlbnRpZmllckFzVHlwZVRoZSBidWlsdC1pbiBpZGVudGlmaWVyICcjbGV4ZW1lJyBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZS5UcnkgY29ycmVjdGluZyB0aGUgbmFtZSB0byBtYXRjaCBhbiBleGlzdGluZyB0eXBlLmNvZGVCdWlsdEluSWRlbnRpZmllckFzVHlwZUJ1aWx0SW5JZGVudGlmaWVyQXNUeXBlQlVJTFRfSU5fSURFTlRJRklFUl9BU19UWVBFdGVtcGxhdGVCdWlsdEluSWRlbnRpZmllckluRGVjbGFyYXRpb25DYW4ndCB1c2UgJyNsZXhlbWUnIGFzIGEgbmFtZSBoZXJlLmNvZGVCdWlsdEluSWRlbnRpZmllckluRGVjbGFyYXRpb25CdWlsdEluSWRlbnRpZmllckluRGVjbGFyYXRpb25CVUlMVF9JTl9JREVOVElGSUVSX0lOX0RFQ0xBUkFUSU9OY29kZUNhbmRpZGF0ZUZvdW5kbWVzc2FnZUNhbmRpZGF0ZUZvdW5kQ2FuZGlkYXRlRm91bmRGb3VuZCB0aGlzIGNhbmRpZGF0ZSwgYnV0IHRoZSBhcmd1bWVudHMgZG9uJ3QgbWF0Y2gudGVtcGxhdGVDYW5kaWRhdGVGb3VuZElzRGVmYXVsdENvbnN0cnVjdG9yVGhlIGNsYXNzICcjbmFtZScgaGFzIGEgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMuY29kZUNhbmRpZGF0ZUZvdW5kSXNEZWZhdWx0Q29uc3RydWN0b3JDYW5kaWRhdGVGb3VuZElzRGVmYXVsdENvbnN0cnVjdG9yY29kZUNhbm5vdEFzc2lnblRvUGFyZW50aGVzaXplZEV4cHJlc3Npb25tZXNzYWdlQ2Fubm90QXNzaWduVG9QYXJlbnRoZXNpemVkRXhwcmVzc2lvbkNhbm5vdEFzc2lnblRvUGFyZW50aGVzaXplZEV4cHJlc3Npb25BU1NJR05NRU5UX1RPX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTkNhbid0IGFzc2lnbiB0byBhIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbi5jb2RlQ2Fubm90QXNzaWduVG9TdXBlcm1lc3NhZ2VDYW5ub3RBc3NpZ25Ub1N1cGVyQ2Fubm90QXNzaWduVG9TdXBlck5PVF9BTl9MVkFMVUVDYW4ndCBhc3NpZ24gdG8gc3VwZXIuVW5hYmxlIHRvIHJlYWQgdGhlICdsaWJyYXJpZXMuanNvbicgc3BlY2lmaWNhdGlvbiBmaWxlOgogICNzdHJpbmcuY29kZUNhbm5vdFJlYWRTZGtTcGVjaWZpY2F0aW9uQ2Fubm90UmVhZFNka1NwZWNpZmljYXRpb25jb2RlQ2FudERpc2FtYmlndWF0ZUFtYmlndW91c0luZm9ybWF0aW9ubWVzc2FnZUNhbnREaXNhbWJpZ3VhdGVBbWJpZ3VvdXNJbmZvcm1hdGlvbkNhbnREaXNhbWJpZ3VhdGVBbWJpZ3VvdXNJbmZvcm1hdGlvbkJvdGggSXRlcmFibGUgYW5kIE1hcCBzcHJlYWQgZWxlbWVudHMgZW5jb3VudGVyZWQgaW4gYW1iaWd1b3VzIGxpdGVyYWwuY29kZUNhbnREaXNhbWJpZ3VhdGVOb3RFbm91Z2hJbmZvcm1hdGlvbm1lc3NhZ2VDYW50RGlzYW1iaWd1YXRlTm90RW5vdWdoSW5mb3JtYXRpb25DYW50RGlzYW1iaWd1YXRlTm90RW5vdWdoSW5mb3JtYXRpb25Ob3QgZW5vdWdoIHR5cGUgaW5mb3JtYXRpb24gdG8gZGlzYW1iaWd1YXRlIGJldHdlZW4gbGl0ZXJhbCBzZXQgYW5kIGxpdGVyYWwgbWFwLlRyeSBwcm92aWRpbmcgdHlwZSBhcmd1bWVudHMgZm9yIHRoZSBsaXRlcmFsIGV4cGxpY2l0bHkgdG8gZGlzYW1iaWd1YXRlIGl0LmNvZGVDYW50SW5mZXJQYWNrYWdlc0Zyb21NYW55SW5wdXRzQ2FudEluZmVyUGFja2FnZXNGcm9tTWFueUlucHV0c0Nhbid0IGluZmVyIGEgLnBhY2thZ2VzIGZpbGUgd2hlbiBjb21waWxpbmcgbXVsdGlwbGUgaW5wdXRzLlRyeSBzcGVjaWZ5aW5nIHRoZSBmaWxlIGV4cGxpY2l0bHkgd2l0aCB0aGUgLS1wYWNrYWdlcyBvcHRpb24uY29kZUNhbnRJbmZlclBhY2thZ2VzRnJvbVBhY2thZ2VVcmlDYW50SW5mZXJQYWNrYWdlc0Zyb21QYWNrYWdlVXJpQ2FuJ3QgaW5mZXIgYSAucGFja2FnZXMgZmlsZSBmcm9tIGFuIGlucHV0ICdwYWNrYWdlOionIFVSSS50ZW1wbGF0ZUNhbnRJbmZlclR5cGVEdWVUb0NpcmN1bGFyaXR5Q2FuJ3QgaW5mZXIgdGhlIHR5cGUgb2YgJyNzdHJpbmcnOiBjaXJjdWxhcml0eSBmb3VuZCBkdXJpbmcgdHlwZSBpbmZlcmVuY2UuU3BlY2lmeSB0aGUgdHlwZSBleHBsaWNpdGx5LmNvZGVDYW50SW5mZXJUeXBlRHVlVG9DaXJjdWxhcml0eUNhbnRJbmZlclR5cGVEdWVUb0NpcmN1bGFyaXR5UkVDVVJTSVZFX0NPTVBJTEVfVElNRV9DT05TVEFOVHRlbXBsYXRlQ2FudEluZmVyVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzQ2FuJ3QgaW5mZXIgYSB0eXBlIGZvciAnI25hbWUnIGFzIHNvbWUgb2YgdGhlIGluaGVyaXRlZCBtZW1iZXJzIGhhdmUgZGlmZmVyZW50IHR5cGVzLlRyeSBhZGRpbmcgYW4gZXhwbGljaXQgdHlwZS5jb2RlQ2FudEluZmVyVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzQ2FudEluZmVyVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzSU5WQUxJRF9NRVRIT0RfT1ZFUlJJREVFcnJvciB3aGVuIHJlYWRpbmcgJyN1cmknOiAjc3RyaW5nY29kZUNhbnRSZWFkRmlsZUNhbnRSZWFkRmlsZVVSSV9ET0VTX05PVF9FWElTVHRlbXBsYXRlQ2FudFVzZURlZmVycmVkUHJlZml4QXNDb25zdGFudCcjbGV4ZW1lJyBjYW4ndCBiZSB1c2VkIGluIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBiZWNhdXNlIGl0J3MgbWFya2VkIGFzICdkZWZlcnJlZCcgd2hpY2ggbWVhbnMgaXQgaXNuJ3QgYXZhaWxhYmxlIHVudGlsIGxvYWRlZC5UcnkgbW92aW5nIHRoZSBjb25zdGFudCBmcm9tIHRoZSBkZWZlcnJlZCBsaWJyYXJ5LCBvciByZW1vdmluZyAnZGVmZXJyZWQnIGZyb20gdGhlIGltcG9ydC4KY29kZUNhbnRVc2VEZWZlcnJlZFByZWZpeEFzQ29uc3RhbnRDYW50VXNlRGVmZXJyZWRQcmVmaXhBc0NvbnN0YW50Q09OU1RfREVGRVJSRURfQ0xBU1Njb2RlQ2FudFVzZVByZWZpeEFzRXhwcmVzc2lvbm1lc3NhZ2VDYW50VXNlUHJlZml4QXNFeHByZXNzaW9uQ2FudFVzZVByZWZpeEFzRXhwcmVzc2lvblBSRUZJWF9JREVOVElGSUVSX05PVF9GT0xMT1dFRF9CWV9ET1RBIHByZWZpeCBjYW4ndCBiZSB1c2VkIGFzIGFuIGV4cHJlc3Npb24uY29kZUNhbnRVc2VQcmVmaXhXaXRoTnVsbEF3YXJlbWVzc2FnZUNhbnRVc2VQcmVmaXhXaXRoTnVsbEF3YXJlQ2FudFVzZVByZWZpeFdpdGhOdWxsQXdhcmVBIHByZWZpeCBjYW4ndCBiZSB1c2VkIHdpdGggbnVsbC1hd2FyZSBvcGVyYXRvcnMuSXQgc2hvdWxkIGJlIHNhZmUgdG8gcmVtb3ZlIHRoZSAnPycgYXMgYSBwcmVmaXggaXMgbmV2ZXIgbnVsbC5jb2RlQ2F0Y2hTeW50YXhtZXNzYWdlQ2F0Y2hTeW50YXhDYXRjaFN5bnRheCdjYXRjaCcgbXVzdCBiZSBmb2xsb3dlZCBieSAnKGlkZW50aWZpZXIpJyBvciAnKGlkZW50aWZpZXIsIGlkZW50aWZpZXIpJy5ObyB0eXBlcyBhcmUgbmVlZGVkLCB0aGUgZmlyc3QgaXMgZ2l2ZW4gYnkgJ29uJywgdGhlIHNlY29uZCBpcyBhbHdheXMgJ1N0YWNrVHJhY2UnLmNvZGVDYXRjaFN5bnRheEV4dHJhUGFyYW1ldGVyc21lc3NhZ2VDYXRjaFN5bnRheEV4dHJhUGFyYW1ldGVyc0NhdGNoU3ludGF4RXh0cmFQYXJhbWV0ZXJzY29kZUNsYXNzSW5DbGFzc21lc3NhZ2VDbGFzc0luQ2xhc3NDbGFzc0luQ2xhc3NDbGFzc2VzIGNhbid0IGJlIGRlY2xhcmVkIGluc2lkZSBvdGhlciBjbGFzc2VzLlRyeSBtb3ZpbmcgdGhlIGNsYXNzIHRvIHRoZSB0b3AtbGV2ZWwuY29kZUNvbG9uSW5QbGFjZU9mSW5tZXNzYWdlQ29sb25JblBsYWNlT2ZJbkNvbG9uSW5QbGFjZU9mSW5Gb3ItaW4gbG9vcHMgdXNlICdpbicgcmF0aGVyIHRoYW4gYSBjb2xvbi5UcnkgcmVwbGFjaW5nIHRoZSBjb2xvbiB3aXRoIHRoZSBrZXl3b3JkICdpbicudGVtcGxhdGVDb25mbGljdHNXaXRoQ29uc3RydWN0b3JDb25mbGljdHMgd2l0aCBjb25zdHJ1Y3RvciAnI25hbWUnLmNvZGVDb25mbGljdHNXaXRoQ29uc3RydWN0b3JDb25mbGljdHNXaXRoQ29uc3RydWN0b3JDT05GTElDVFNfV0lUSF9DT05TVFJVQ1RPUnRlbXBsYXRlQ29uZmxpY3RzV2l0aEZhY3RvcnlDb25mbGljdHMgd2l0aCBmYWN0b3J5ICcjbmFtZScuY29kZUNvbmZsaWN0c1dpdGhGYWN0b3J5Q29uZmxpY3RzV2l0aEZhY3Rvcnl0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhNZW1iZXJDb25mbGljdHMgd2l0aCBtZW1iZXIgJyNuYW1lJy5jb2RlQ29uZmxpY3RzV2l0aE1lbWJlckNvbmZsaWN0c1dpdGhNZW1iZXJDT05GTElDVFNfV0lUSF9NRU1CRVJ0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhNZW1iZXJXYXJuaW5nY29kZUNvbmZsaWN0c1dpdGhNZW1iZXJXYXJuaW5nQ29uZmxpY3RzV2l0aE1lbWJlcldhcm5pbmd0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhTZXR0ZXJDb25mbGljdHMgd2l0aCBzZXR0ZXIgJyNuYW1lJy5jb2RlQ29uZmxpY3RzV2l0aFNldHRlckNvbmZsaWN0c1dpdGhTZXR0ZXJ0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhTZXR0ZXJXYXJuaW5nY29kZUNvbmZsaWN0c1dpdGhTZXR0ZXJXYXJuaW5nQ29uZmxpY3RzV2l0aFNldHRlcldhcm5pbmd0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhUeXBlVmFyaWFibGVDb25mbGljdHMgd2l0aCB0eXBlIHZhcmlhYmxlICcjbmFtZScuY29kZUNvbmZsaWN0c1dpdGhUeXBlVmFyaWFibGVDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlQ09ORkxJQ1RJTkdfVFlQRV9WQVJJQUJMRV9BTkRfTUVNQkVSY29kZUNvbmZsaWN0c1dpdGhUeXBlVmFyaWFibGVDYXVzZW1lc3NhZ2VDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlQ2F1c2VDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlQ2F1c2VUaGlzIGlzIHRoZSB0eXBlIHZhcmlhYmxlLmNvZGVDb25zdEFmdGVyRmFjdG9yeW1lc3NhZ2VDb25zdEFmdGVyRmFjdG9yeUNvbnN0QWZ0ZXJGYWN0b3J5VGhlIG1vZGlmaWVyICdjb25zdCcgc2hvdWxkIGJlIGJlZm9yZSB0aGUgbW9kaWZpZXIgJ2ZhY3RvcnknLlRyeSByZS1vcmRlcmluZyB0aGUgbW9kaWZpZXJzLmNvZGVDb25zdEFuZENvdmFyaWFudG1lc3NhZ2VDb25zdEFuZENvdmFyaWFudENvbnN0QW5kQ292YXJpYW50TWVtYmVycyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSBib3RoICdjb25zdCcgYW5kICdjb3ZhcmlhbnQnLlRyeSByZW1vdmluZyBlaXRoZXIgdGhlICdjb25zdCcgb3IgJ2NvdmFyaWFudCcga2V5d29yZC5jb2RlQ29uc3RBbmRGaW5hbG1lc3NhZ2VDb25zdEFuZEZpbmFsQ29uc3RBbmRGaW5hbE1lbWJlcnMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgYm90aCAnY29uc3QnIGFuZCAnZmluYWwnLlRyeSByZW1vdmluZyBlaXRoZXIgdGhlICdjb25zdCcgb3IgJ2ZpbmFsJyBrZXl3b3JkLmNvZGVDb25zdEFuZFZhcm1lc3NhZ2VDb25zdEFuZFZhckNvbnN0QW5kVmFyTWVtYmVycyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSBib3RoICdjb25zdCcgYW5kICd2YXInLlRyeSByZW1vdmluZyBlaXRoZXIgdGhlICdjb25zdCcgb3IgJ3Zhcicga2V5d29yZC5jb2RlQ29uc3RDbGFzc21lc3NhZ2VDb25zdENsYXNzQ29uc3RDbGFzc0NsYXNzZXMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgJ2NvbnN0Jy5UcnkgcmVtb3ZpbmcgdGhlICdjb25zdCcga2V5d29yZC4gSWYgeW91J3JlIHRyeWluZyB0byBpbmRpY2F0ZSB0aGF0IGluc3RhbmNlcyBvZiB0aGUgY2xhc3MgY2FuIGJlIGNvbnN0YW50cywgcGxhY2UgdGhlICdjb25zdCcga2V5d29yZCBvbiAgdGhlIGNsYXNzJyBjb25zdHJ1Y3RvcihzKS5jb2RlQ29uc3RDb25zdHJ1Y3Rvck5vbkZpbmFsRmllbGRtZXNzYWdlQ29uc3RDb25zdHJ1Y3Rvck5vbkZpbmFsRmllbGRDb25zdENvbnN0cnVjdG9yTm9uRmluYWxGaWVsZENPTlNUX0NPTlNUUlVDVE9SX1dJVEhfTk9OX0ZJTkFMX0ZJRUxEQ29uc3RydWN0b3IgaXMgbWFya2VkICdjb25zdCcgc28gYWxsIGZpZWxkcyBtdXN0IGJlIGZpbmFsLmNvZGVDb25zdENvbnN0cnVjdG9yTm9uRmluYWxGaWVsZENhdXNlbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JOb25GaW5hbEZpZWxkQ2F1c2VDb25zdENvbnN0cnVjdG9yTm9uRmluYWxGaWVsZENhdXNlRmllbGQgaXNuJ3QgZmluYWwsIGJ1dCBjb25zdHJ1Y3RvciBpcyAnY29uc3QnLmNvZGVDb25zdENvbnN0cnVjdG9yUmVkaXJlY3Rpb25Ub05vbkNvbnN0bWVzc2FnZUNvbnN0Q29uc3RydWN0b3JSZWRpcmVjdGlvblRvTm9uQ29uc3RDb25zdENvbnN0cnVjdG9yUmVkaXJlY3Rpb25Ub05vbkNvbnN0QSBjb25zdGFudCBjb25zdHJ1Y3RvciBjYW4ndCBjYWxsIGEgbm9uLWNvbnN0YW50IGNvbnN0cnVjdG9yLmNvZGVDb25zdENvbnN0cnVjdG9yV2l0aEJvZHltZXNzYWdlQ29uc3RDb25zdHJ1Y3RvcldpdGhCb2R5Q29uc3RDb25zdHJ1Y3RvcldpdGhCb2R5Q09OU1RfQ09OU1RSVUNUT1JfV0lUSF9CT0RZQSBjb25zdCBjb25zdHJ1Y3RvciBjYW4ndCBoYXZlIGEgYm9keS5UcnkgcmVtb3ZpbmcgZWl0aGVyIHRoZSAnY29uc3QnIGtleXdvcmQgb3IgdGhlIGJvZHkuY29kZUNvbnN0Q29uc3RydWN0b3JXaXRoTm9uQ29uc3RTdXBlcm1lc3NhZ2VDb25zdENvbnN0cnVjdG9yV2l0aE5vbkNvbnN0U3VwZXJDb25zdENvbnN0cnVjdG9yV2l0aE5vbkNvbnN0U3VwZXJDT05TVF9DT05TVFJVQ1RPUl9XSVRIX05PTl9DT05TVF9TVVBFUkNvbnN0YW50IGNvbnN0cnVjdG9yIGNhbid0IGNhbGwgbm9uLWNvbnN0YW50IHN1cGVyIGNvbnN0cnVjdG9ycy5jb2RlQ29uc3RFdmFsQ2lyY3VsYXJpdHltZXNzYWdlQ29uc3RFdmFsQ2lyY3VsYXJpdHlDb25zdEV2YWxDaXJjdWxhcml0eUNvbnN0YW50IGV4cHJlc3Npb24gZGVwZW5kcyBvbiBpdHNlbGYuY29kZUNvbnN0RXZhbENvbnRleHRtZXNzYWdlQ29uc3RFdmFsQ29udGV4dENvbnN0RXZhbENvbnRleHRXaGlsZSBhbmFseXppbmc6dGVtcGxhdGVDb25zdEV2YWxEZWZlcnJlZExpYnJhcnknI25hbWUnIGNhbid0IGJlIHVzZWQgaW4gYSBjb25zdGFudCBleHByZXNzaW9uIGJlY2F1c2UgaXQncyBtYXJrZWQgYXMgJ2RlZmVycmVkJyB3aGljaCBtZWFucyBpdCBpc24ndCBhdmFpbGFibGUgdW50aWwgbG9hZGVkLmNvZGVDb25zdEV2YWxEZWZlcnJlZExpYnJhcnlDb25zdEV2YWxEZWZlcnJlZExpYnJhcnlOT05fQ09OU1RBTlRfREVGQVVMVF9WQUxVRV9GUk9NX0RFRkVSUkVEX0xJQlJBUll0ZW1wbGF0ZUNvbnN0RXZhbER1cGxpY2F0ZUVsZW1lbnRUaGUgZWxlbWVudCAnI2NvbnN0YW50JyBjb25mbGljdHMgd2l0aCBhbm90aGVyIGV4aXN0aW5nIGVsZW1lbnQgaW4gdGhlIHNldC5jb2RlQ29uc3RFdmFsRHVwbGljYXRlRWxlbWVudENvbnN0RXZhbER1cGxpY2F0ZUVsZW1lbnRFUVVBTF9FTEVNRU5UU19JTl9DT05TVF9TRVR0ZW1wbGF0ZUNvbnN0RXZhbER1cGxpY2F0ZUtleVRoZSBrZXkgJyNjb25zdGFudCcgY29uZmxpY3RzIHdpdGggYW5vdGhlciBleGlzdGluZyBrZXkgaW4gdGhlIG1hcC5jb2RlQ29uc3RFdmFsRHVwbGljYXRlS2V5Q29uc3RFdmFsRHVwbGljYXRlS2V5RVFVQUxfS0VZU19JTl9DT05TVF9NQVB0ZW1wbGF0ZUNvbnN0RXZhbEVsZW1lbnRJbXBsZW1lbnRzRXF1YWxUaGUgZWxlbWVudCAnI2NvbnN0YW50JyBkb2VzIG5vdCBoYXZlIGEgcHJpbWl0aXZlIG9wZXJhdG9yICc9PScuY29kZUNvbnN0RXZhbEVsZW1lbnRJbXBsZW1lbnRzRXF1YWxDb25zdEV2YWxFbGVtZW50SW1wbGVtZW50c0VxdWFsQ09OU1RfU0VUX0VMRU1FTlRfVFlQRV9JTVBMRU1FTlRTX0VRVUFMU2NvZGVDb25zdEV2YWxGYWlsZWRBc3NlcnRpb25tZXNzYWdlQ29uc3RFdmFsRmFpbGVkQXNzZXJ0aW9uQ29uc3RFdmFsRmFpbGVkQXNzZXJ0aW9uQ09OU1RfRVZBTF9USFJPV1NfRVhDRVBUSU9OVGhpcyBhc3NlcnRpb24gZmFpbGVkLnRlbXBsYXRlQ29uc3RFdmFsRmFpbGVkQXNzZXJ0aW9uV2l0aE1lc3NhZ2VUaGlzIGFzc2VydGlvbiBmYWlsZWQgd2l0aCBtZXNzYWdlOiAjc3RyaW5nY29kZUNvbnN0RXZhbEZhaWxlZEFzc2VydGlvbldpdGhNZXNzYWdlQ29uc3RFdmFsRmFpbGVkQXNzZXJ0aW9uV2l0aE1lc3NhZ2V0ZW1wbGF0ZUNvbnN0RXZhbEZyZWVUeXBlUGFyYW1ldGVyVGhlIHR5cGUgJyN0eXBlJyBpcyBub3QgYSBjb25zdGFudCBiZWNhdXNlIGl0IGRlcGVuZHMgb24gYSB0eXBlIHBhcmFtZXRlciwgb25seSBpbnN0YW50aWF0ZWQgdHlwZXMgYXJlIGFsbG93ZWQuY29kZUNvbnN0RXZhbEZyZWVUeXBlUGFyYW1ldGVyQ29uc3RFdmFsRnJlZVR5cGVQYXJhbWV0ZXJ0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRCaW5hcnlPcGVyYW5kVHlwZUJpbmFyeSBvcGVyYXRvciAnI3N0cmluZycgb24gJyNjb25zdGFudCcgcmVxdWlyZXMgb3BlcmFuZCBvZiB0eXBlICcjdHlwZScsIGJ1dCB3YXMgb2YgdHlwZSAnI3R5cGUyJy5jb2RlQ29uc3RFdmFsSW52YWxpZEJpbmFyeU9wZXJhbmRUeXBlQ29uc3RFdmFsSW52YWxpZEJpbmFyeU9wZXJhbmRUeXBldGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkRXF1YWxzT3BlcmFuZFR5cGVCaW5hcnkgb3BlcmF0b3IgJz09JyByZXF1aXJlcyByZWNlaXZlciBjb25zdGFudCAnI2NvbnN0YW50JyBvZiB0eXBlICdOdWxsJywgJ2Jvb2wnLCAnaW50JywgJ2RvdWJsZScsIG9yICdTdHJpbmcnLCBidXQgd2FzIG9mIHR5cGUgJyN0eXBlJy5jb2RlQ29uc3RFdmFsSW52YWxpZEVxdWFsc09wZXJhbmRUeXBlQ29uc3RFdmFsSW52YWxpZEVxdWFsc09wZXJhbmRUeXBldGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkTWV0aG9kSW52b2NhdGlvblRoZSBtZXRob2QgJyNzdHJpbmcnIGNhbid0IGJlIGludm9rZWQgb24gJyNjb25zdGFudCcgd2l0aGluIGEgY29uc3QgY29udGV4dC5jb2RlQ29uc3RFdmFsSW52YWxpZE1ldGhvZEludm9jYXRpb25Db25zdEV2YWxJbnZhbGlkTWV0aG9kSW52b2NhdGlvblVOREVGSU5FRF9PUEVSQVRPUnRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFByb3BlcnR5R2V0VGhlIHByb3BlcnR5ICcjc3RyaW5nJyBjYW4ndCBiZSBhY2Nlc3NlZCBvbiAnI2NvbnN0YW50JyB3aXRoaW4gYSBjb25zdCBjb250ZXh0LmNvZGVDb25zdEV2YWxJbnZhbGlkUHJvcGVydHlHZXRDb25zdEV2YWxJbnZhbGlkUHJvcGVydHlHZXR0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRTdGF0aWNJbnZvY2F0aW9uVGhlIGludm9jYXRpb24gb2YgJyNuYW1lJyBpcyBub3QgYWxsb3dlZCB3aXRoaW4gYSBjb25zdCBjb250ZXh0LmNvZGVDb25zdEV2YWxJbnZhbGlkU3RhdGljSW52b2NhdGlvbkNvbnN0RXZhbEludmFsaWRTdGF0aWNJbnZvY2F0aW9uQ09OU1RfSU5JVElBTElaRURfV0lUSF9OT05fQ09OU1RBTlRfVkFMVUV0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRTdHJpbmdJbnRlcnBvbGF0aW9uT3BlcmFuZFRoZSAnI2NvbnN0YW50JyBjYW4ndCBiZSB1c2VkIGFzIHBhcnQgb2YgYSBzdHJpbmcgaW50ZXJwb2xhdGlvbiB3aXRoaW4gYSBjb25zdCBjb250ZXh0LCBvbmx5IHZhbHVlcyBvZiB0eXBlICdudWxsJywgJ2Jvb2wnLCAnaW50JywgJ2RvdWJsZScsIG9yICdTdHJpbmcnIGNhbiBiZSB1c2VkLmNvZGVDb25zdEV2YWxJbnZhbGlkU3RyaW5nSW50ZXJwb2xhdGlvbk9wZXJhbmRDb25zdEV2YWxJbnZhbGlkU3RyaW5nSW50ZXJwb2xhdGlvbk9wZXJhbmRDT05TVF9FVkFMX1RZUEVfQk9PTF9OVU1fU1RSSU5HdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkU3ltYm9sTmFtZVRoZSBzeW1ib2wgbmFtZSBtdXN0IGJlIGEgdmFsaWQgcHVibGljIERhcnQgbWVtYmVyIG5hbWUsIHB1YmxpYyBjb25zdHJ1Y3RvciBuYW1lLCBvciBsaWJyYXJ5IG5hbWUsIG9wdGlvbmFsbHkgcXVhbGlmaWVkLCBidXQgd2FzICcjY29uc3RhbnQnLmNvZGVDb25zdEV2YWxJbnZhbGlkU3ltYm9sTmFtZUNvbnN0RXZhbEludmFsaWRTeW1ib2xOYW1ldGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkVHlwZUV4cGVjdGVkIGNvbnN0YW50ICcjY29uc3RhbnQnIHRvIGJlIG9mIHR5cGUgJyN0eXBlJywgYnV0IHdhcyBvZiB0eXBlICcjdHlwZTInLmNvZGVDb25zdEV2YWxJbnZhbGlkVHlwZUNvbnN0RXZhbEludmFsaWRUeXBlY29kZUNvbnN0RXZhbEl0ZXJhdGlvbkluQ29uc3RMaXN0bWVzc2FnZUNvbnN0RXZhbEl0ZXJhdGlvbkluQ29uc3RMaXN0Q29uc3RFdmFsSXRlcmF0aW9uSW5Db25zdExpc3ROT05fQ09OU1RBTlRfTElTVF9FTEVNRU5USXRlcmF0aW9uIGNhbid0IGJlIHVzZWQgaW4gYSBjb25zdGFudCBsaXN0LmNvZGVDb25zdEV2YWxJdGVyYXRpb25JbkNvbnN0TWFwbWVzc2FnZUNvbnN0RXZhbEl0ZXJhdGlvbkluQ29uc3RNYXBDb25zdEV2YWxJdGVyYXRpb25JbkNvbnN0TWFwTk9OX0NPTlNUQU5UX01BUF9FTEVNRU5USXRlcmF0aW9uIGNhbid0IGJlIHVzZWQgaW4gYSBjb25zdGFudCBtYXAuY29kZUNvbnN0RXZhbEl0ZXJhdGlvbkluQ29uc3RTZXRtZXNzYWdlQ29uc3RFdmFsSXRlcmF0aW9uSW5Db25zdFNldENvbnN0RXZhbEl0ZXJhdGlvbkluQ29uc3RTZXROT05fQ09OU1RBTlRfU0VUX0VMRU1FTlRJdGVyYXRpb24gY2FuJ3QgYmUgdXNlZCBpbiBhIGNvbnN0YW50IHNldC50ZW1wbGF0ZUNvbnN0RXZhbEtleUltcGxlbWVudHNFcXVhbFRoZSBrZXkgJyNjb25zdGFudCcgZG9lcyBub3QgaGF2ZSBhIHByaW1pdGl2ZSBvcGVyYXRvciAnPT0nLmNvZGVDb25zdEV2YWxLZXlJbXBsZW1lbnRzRXF1YWxDb25zdEV2YWxLZXlJbXBsZW1lbnRzRXF1YWxDT05TVF9NQVBfS0VZX0VYUFJFU1NJT05fVFlQRV9JTVBMRU1FTlRTX0VRVUFMU3RlbXBsYXRlQ29uc3RFdmFsTmVnYXRpdmVTaGlmdEJpbmFyeSBvcGVyYXRvciAnI3N0cmluZycgb24gJyNzdHJpbmcyJyByZXF1aXJlcyBub24tbmVnYXRpdmUgb3BlcmFuZCwgYnV0IHdhcyAnI3N0cmluZzMnLmNvZGVDb25zdEV2YWxOZWdhdGl2ZVNoaWZ0Q29uc3RFdmFsTmVnYXRpdmVTaGlmdHRlbXBsYXRlQ29uc3RFdmFsTm9uQ29uc3RhbnRMaXRlcmFsQ2FuJ3QgaGF2ZSBhIG5vbi1jb25zdGFudCAjc3RyaW5nIGxpdGVyYWwgd2l0aGluIGEgY29uc3QgY29udGV4dC5jb2RlQ29uc3RFdmFsTm9uQ29uc3RhbnRMaXRlcmFsQ29uc3RFdmFsTm9uQ29uc3RhbnRMaXRlcmFsTk9OX0NPTlNUQU5UX0RFRkFVTFRfVkFMVUV0ZW1wbGF0ZUNvbnN0RXZhbE5vbkNvbnN0YW50VmFyaWFibGVHZXRUaGUgdmFyaWFibGUgJyNzdHJpbmcnIGlzIG5vdCBhIGNvbnN0YW50LCBvbmx5IGNvbnN0YW50IGV4cHJlc3Npb25zIGFyZSBhbGxvd2VkLmNvZGVDb25zdEV2YWxOb25Db25zdGFudFZhcmlhYmxlR2V0Q29uc3RFdmFsTm9uQ29uc3RhbnRWYXJpYWJsZUdldE5PTl9DT05TVEFOVF9WQUxVRV9JTl9JTklUSUFMSVpFUmNvZGVDb25zdEV2YWxOb3RMaXN0T3JTZXRJblNwcmVhZG1lc3NhZ2VDb25zdEV2YWxOb3RMaXN0T3JTZXRJblNwcmVhZENvbnN0RXZhbE5vdExpc3RPclNldEluU3ByZWFkQ09OU1RfU1BSRUFEX0VYUEVDVEVEX0xJU1RfT1JfU0VUT25seSBsaXN0cyBhbmQgc2V0cyBjYW4gYmUgdXNlZCBpbiBzcHJlYWRzIGluIGNvbnN0YW50IGxpc3RzIGFuZCBzZXRzLmNvZGVDb25zdEV2YWxOb3RNYXBJblNwcmVhZG1lc3NhZ2VDb25zdEV2YWxOb3RNYXBJblNwcmVhZENvbnN0RXZhbE5vdE1hcEluU3ByZWFkQ09OU1RfU1BSRUFEX0VYUEVDVEVEX01BUE9ubHkgbWFwcyBjYW4gYmUgdXNlZCBpbiBzcHJlYWRzIGluIGNvbnN0YW50IG1hcHMuY29kZUNvbnN0RXZhbE51bGxWYWx1ZW1lc3NhZ2VDb25zdEV2YWxOdWxsVmFsdWVDb25zdEV2YWxOdWxsVmFsdWVOdWxsIHZhbHVlIGR1cmluZyBjb25zdGFudCBldmFsdWF0aW9uLnRlbXBsYXRlQ29uc3RFdmFsWmVyb0Rpdmlzb3JCaW5hcnkgb3BlcmF0b3IgJyNzdHJpbmcnIG9uICcjc3RyaW5nMicgcmVxdWlyZXMgbm9uLXplcm8gZGl2aXNvciwgYnV0IGRpdmlzb3Igd2FzICcwJy5jb2RlQ29uc3RFdmFsWmVyb0Rpdmlzb3JDb25zdEV2YWxaZXJvRGl2aXNvckNPTlNUX0VWQUxfVEhST1dTX0lEQlpFY29kZUNvbnN0RmFjdG9yeW1lc3NhZ2VDb25zdEZhY3RvcnlDb25zdEZhY3RvcnlPbmx5IHJlZGlyZWN0aW5nIGZhY3RvcnkgY29uc3RydWN0b3JzIGNhbiBiZSBkZWNsYXJlZCB0byBiZSAnY29uc3QnLlRyeSByZW1vdmluZyB0aGUgJ2NvbnN0JyBrZXl3b3JkLCBvciByZXBsYWNpbmcgdGhlIGJvZHkgd2l0aCAnPScgZm9sbG93ZWQgYnkgYSB2YWxpZCB0YXJnZXQuY29kZUNvbnN0RmFjdG9yeVJlZGlyZWN0aW9uVG9Ob25Db25zdG1lc3NhZ2VDb25zdEZhY3RvcnlSZWRpcmVjdGlvblRvTm9uQ29uc3RDb25zdEZhY3RvcnlSZWRpcmVjdGlvblRvTm9uQ29uc3RSRURJUkVDVF9UT19OT05fQ09OU1RfQ09OU1RSVUNUT1JDb25zdGFudCBmYWN0b3J5IGNvbnN0cnVjdG9yIGNhbid0IGRlbGVnYXRlIHRvIGEgbm9uLWNvbnN0YW50IGNvbnN0cnVjdG9yLlRyeSByZWRpcmVjdGluZyB0byBhIGRpZmZlcmVudCBjb25zdHJ1Y3RvciBvciBtYXJraW5nIHRoZSB0YXJnZXQgY29uc3RydWN0b3IgJ2NvbnN0Jy50ZW1wbGF0ZUNvbnN0RmllbGRXaXRob3V0SW5pdGlhbGl6ZXJUaGUgY29uc3QgdmFyaWFibGUgJyNuYW1lJyBtdXN0IGJlIGluaXRpYWxpemVkLlRyeSBhZGRpbmcgYW4gaW5pdGlhbGl6ZXIgKCc9IDxleHByZXNzaW9uPicpIHRvIHRoZSBkZWNsYXJhdGlvbi5jb2RlQ29uc3RGaWVsZFdpdGhvdXRJbml0aWFsaXplckNvbnN0RmllbGRXaXRob3V0SW5pdGlhbGl6ZXJDT05TVF9OT1RfSU5JVElBTElaRURjb2RlQ29uc3RJbnN0YW5jZUZpZWxkbWVzc2FnZUNvbnN0SW5zdGFuY2VGaWVsZENvbnN0SW5zdGFuY2VGaWVsZENPTlNUX0lOU1RBTkNFX0ZJRUxET25seSBzdGF0aWMgZmllbGRzIGNhbiBiZSBkZWNsYXJlZCBhcyBjb25zdC5UcnkgdXNpbmcgJ2ZpbmFsJyBpbnN0ZWFkIG9mICdjb25zdCcsIG9yIGFkZGluZyB0aGUga2V5d29yZCAnc3RhdGljJy5jb2RlQ29uc3RNZXRob2RtZXNzYWdlQ29uc3RNZXRob2RDb25zdE1ldGhvZEdldHRlcnMsIHNldHRlcnMgYW5kIG1ldGhvZHMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgJ2NvbnN0Jy5UcnkgcmVtb3ZpbmcgdGhlICdjb25zdCcga2V5d29yZC5jb2RlQ29uc3RydWN0b3JDeWNsaWNtZXNzYWdlQ29uc3RydWN0b3JDeWNsaWNDb25zdHJ1Y3RvckN5Y2xpY1JFQ1VSU0lWRV9DT05TVFJVQ1RPUl9SRURJUkVDVFJlZGlyZWN0aW5nIGNvbnN0cnVjdGVycyBjYW4ndCBiZSBjeWNsaWMuVHJ5IHRvIGhhdmUgYWxsIGNvbnN0cnVjdG9ycyBldmVudHVhbGx5IHJlZGlyZWN0IHRvIGEgbm9uLXJlZGlyZWN0aW5nIGNvbnN0cnVjdG9yLnRlbXBsYXRlQ29uc3RydWN0b3JOb3RGb3VuZENvdWxkbid0IGZpbmQgY29uc3RydWN0b3IgJyNuYW1lJy5jb2RlQ29uc3RydWN0b3JOb3RGb3VuZENvbnN0cnVjdG9yTm90Rm91bmRDT05TVFJVQ1RPUl9OT1RfRk9VTkRjb2RlQ29uc3RydWN0b3JOb3RTeW5jbWVzc2FnZUNvbnN0cnVjdG9yTm90U3luY0NvbnN0cnVjdG9yTm90U3luY05PTl9TWU5DX0NPTlNUUlVDVE9SQ29uc3RydWN0b3IgYm9kaWVzIGNhbid0IHVzZSAnYXN5bmMnLCAnYXN5bmMqJywgb3IgJ3N5bmMqJy5jb2RlQ29uc3RydWN0b3JXaXRoUmV0dXJuVHlwZW1lc3NhZ2VDb25zdHJ1Y3RvcldpdGhSZXR1cm5UeXBlQ29uc3RydWN0b3JXaXRoUmV0dXJuVHlwZUNvbnN0cnVjdG9ycyBjYW4ndCBoYXZlIGEgcmV0dXJuIHR5cGUuVHJ5IHJlbW92aW5nIHRoZSByZXR1cm4gdHlwZS5jb2RlQ29uc3RydWN0b3JXaXRoVHlwZUFyZ3VtZW50c21lc3NhZ2VDb25zdHJ1Y3RvcldpdGhUeXBlQXJndW1lbnRzQ29uc3RydWN0b3JXaXRoVHlwZUFyZ3VtZW50c1dST05HX05VTUJFUl9PRl9UWVBFX0FSR1VNRU5UU19DT05TVFJVQ1RPUkEgY29uc3RydWN0b3IgaW52b2NhdGlvbiBjYW4ndCBoYXZlIHR5cGUgYXJndW1lbnRzIG9uIHRoZSBjb25zdHJ1Y3RvciBuYW1lLlRyeSB0byBwbGFjZSB0aGUgdHlwZSBhcmd1bWVudHMgb24gdGhlIGNsYXNzIG5hbWUuY29kZUNvbnN0cnVjdG9yV2l0aFR5cGVQYXJhbWV0ZXJzbWVzc2FnZUNvbnN0cnVjdG9yV2l0aFR5cGVQYXJhbWV0ZXJzQ29uc3RydWN0b3JXaXRoVHlwZVBhcmFtZXRlcnNUWVBFX1BBUkFNRVRFUl9PTl9DT05TVFJVQ1RPUkNvbnN0cnVjdG9ycyBjYW4ndCBoYXZlIHR5cGUgcGFyYW1ldGVycy5jb2RlQ29uc3RydWN0b3JXaXRoV3JvbmdOYW1lbWVzc2FnZUNvbnN0cnVjdG9yV2l0aFdyb25nTmFtZUNvbnN0cnVjdG9yV2l0aFdyb25nTmFtZUlOVkFMSURfQ09OU1RSVUNUT1JfTkFNRVRoZSBuYW1lIG9mIGEgY29uc3RydWN0b3IgbXVzdCBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgZW5jbG9zaW5nIGNsYXNzLnRlbXBsYXRlQ29uc3RydWN0b3JXaXRoV3JvbmdOYW1lQ29udGV4dFRoZSBuYW1lIG9mIHRoZSBlbmNsb3NpbmcgY2xhc3MgaXMgJyNuYW1lJy5jb2RlQ29uc3RydWN0b3JXaXRoV3JvbmdOYW1lQ29udGV4dENvbnN0cnVjdG9yV2l0aFdyb25nTmFtZUNvbnRleHRjb2RlQ29udGludWVMYWJlbE5vdFRhcmdldG1lc3NhZ2VDb250aW51ZUxhYmVsTm90VGFyZ2V0Q29udGludWVMYWJlbE5vdFRhcmdldExBQkVMX1VOREVGSU5FRFRhcmdldCBvZiBjb250aW51ZSBtdXN0IGJlIGEgbGFiZWwuY29kZUNvbnRpbnVlT3V0c2lkZU9mTG9vcG1lc3NhZ2VDb250aW51ZU91dHNpZGVPZkxvb3BDb250aW51ZU91dHNpZGVPZkxvb3BBIGNvbnRpbnVlIHN0YXRlbWVudCBjYW4ndCBiZSB1c2VkIG91dHNpZGUgb2YgYSBsb29wIG9yIHN3aXRjaCBzdGF0ZW1lbnQuVHJ5IHJlbW92aW5nIHRoZSBjb250aW51ZSBzdGF0ZW1lbnQudGVtcGxhdGVDb250aW51ZVRhcmdldE91dHNpZGVGdW5jdGlvbkNhbid0IGNvbnRpbnVlIGF0ICcjbmFtZScgaW4gYSBkaWZmZXJlbnQgZnVuY3Rpb24uY29kZUNvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uQ29udGludWVUYXJnZXRPdXRzaWRlRnVuY3Rpb25jb2RlQ29udGludWVXaXRob3V0TGFiZWxJbkNhc2VtZXNzYWdlQ29udGludWVXaXRob3V0TGFiZWxJbkNhc2VDb250aW51ZVdpdGhvdXRMYWJlbEluQ2FzZUEgY29udGludWUgc3RhdGVtZW50IGluIGEgc3dpdGNoIHN0YXRlbWVudCBtdXN0IGhhdmUgYSBsYWJlbCBhcyBhIHRhcmdldC5UcnkgYWRkaW5nIGEgbGFiZWwgYXNzb2NpYXRlZCB3aXRoIG9uZSBvZiB0aGUgY2FzZSBjbGF1c2VzIHRvIHRoZSBjb250aW51ZSBzdGF0ZW1lbnQudGVtcGxhdGVDb3VsZE5vdFBhcnNlVXJpQ291bGRuJ3QgcGFyc2UgVVJJICcjc3RyaW5nJzoKICAjc3RyaW5nMi5jb2RlQ291bGROb3RQYXJzZVVyaUNvdWxkTm90UGFyc2VVcmljb2RlQ292YXJpYW50QWZ0ZXJGaW5hbG1lc3NhZ2VDb3ZhcmlhbnRBZnRlckZpbmFsQ292YXJpYW50QWZ0ZXJGaW5hbFRoZSBtb2RpZmllciAnY292YXJpYW50JyBzaG91bGQgYmUgYmVmb3JlIHRoZSBtb2RpZmllciAnZmluYWwnLmNvZGVDb3ZhcmlhbnRBZnRlclZhcm1lc3NhZ2VDb3ZhcmlhbnRBZnRlclZhckNvdmFyaWFudEFmdGVyVmFyVGhlIG1vZGlmaWVyICdjb3ZhcmlhbnQnIHNob3VsZCBiZSBiZWZvcmUgdGhlIG1vZGlmaWVyICd2YXInLmNvZGVDb3ZhcmlhbnRBbmRTdGF0aWNtZXNzYWdlQ292YXJpYW50QW5kU3RhdGljQ292YXJpYW50QW5kU3RhdGljTWVtYmVycyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSBib3RoICdjb3ZhcmlhbnQnIGFuZCAnc3RhdGljJy5UcnkgcmVtb3ZpbmcgZWl0aGVyIHRoZSAnY292YXJpYW50JyBvciAnc3RhdGljJyBrZXl3b3JkLmNvZGVDb3ZhcmlhbnRNZW1iZXJtZXNzYWdlQ292YXJpYW50TWVtYmVyQ292YXJpYW50TWVtYmVyR2V0dGVycywgc2V0dGVycyBhbmQgbWV0aG9kcyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSAnY292YXJpYW50Jy5UcnkgcmVtb3ZpbmcgdGhlICdjb3ZhcmlhbnQnIGtleXdvcmQudGVtcGxhdGVDeWNsZUluVHlwZVZhcmlhYmxlc1R5cGUgJyNuYW1lJyBpcyBhIGJvdW5kIG9mIGl0c2VsZiB2aWEgJyNzdHJpbmcnLlRyeSBicmVha2luZyB0aGUgY3ljbGUgYnkgcmVtb3ZpbmcgYXQgbGVhc3Qgb24gb2YgdGhlICdleHRlbmRzJyBjbGF1c2VzIGluIHRoZSBjeWNsZS5jb2RlQ3ljbGVJblR5cGVWYXJpYWJsZXNDeWNsZUluVHlwZVZhcmlhYmxlc1RZUEVfUEFSQU1FVEVSX1NVUEVSVFlQRV9PRl9JVFNfQk9VTkR0ZW1wbGF0ZUN5Y2xpY0NsYXNzSGllcmFyY2h5JyNuYW1lJyBpcyBhIHN1cGVydHlwZSBvZiBpdHNlbGYuY29kZUN5Y2xpY0NsYXNzSGllcmFyY2h5Q3ljbGljQ2xhc3NIaWVyYXJjaHlSRUNVUlNJVkVfSU5URVJGQUNFX0lOSEVSSVRBTkNFdGVtcGxhdGVDeWNsaWNSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnNDeWNsaWMgZGVmaW5pdGlvbiBvZiBmYWN0b3J5ICcjbmFtZScuY29kZUN5Y2xpY1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yc0N5Y2xpY1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yc1JFQ1VSU0lWRV9GQUNUT1JZX1JFRElSRUNUdGVtcGxhdGVDeWNsaWNUeXBlZGVmVGhlIHR5cGVkZWYgJyNuYW1lJyBoYXMgYSByZWZlcmVuY2UgdG8gaXRzZWxmLmNvZGVDeWNsaWNUeXBlZGVmQ3ljbGljVHlwZWRlZlRZUEVfQUxJQVNfQ0FOTk9UX1JFRkVSRU5DRV9JVFNFTEZjb2RlRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVybWVzc2FnZURlY2xhcmVkTWVtYmVyQ29uZmxpY3RzV2l0aEluaGVyaXRlZE1lbWJlckRlY2xhcmVkTWVtYmVyQ29uZmxpY3RzV2l0aEluaGVyaXRlZE1lbWJlckRFQ0xBUkVEX01FTUJFUl9DT05GTElDVFNfV0lUSF9JTkhFUklURURDYW4ndCBkZWNsYXJlIGEgbWVtYmVyIHRoYXQgY29uZmxpY3RzIHdpdGggYW4gaW5oZXJpdGVkIG9uZS5jb2RlRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVyQ2F1c2VtZXNzYWdlRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVyQ2F1c2VEZWNsYXJlZE1lbWJlckNvbmZsaWN0c1dpdGhJbmhlcml0ZWRNZW1iZXJDYXVzZVRoaXMgaXMgdGhlIGluaGVyaXRlZCBtZW1iZXIudGVtcGxhdGVEZWZhdWx0VmFsdWVJblJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yQ2FuJ3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgaGVyZSBiZWNhdXNlIGFueSBkZWZhdWx0IHZhbHVlcyBvZiAnI25hbWUnIHdvdWxkIGJlIHVzZWQgaW5zdGVhZC5UcnkgcmVtb3ZpbmcgdGhlIGRlZmF1bHQgdmFsdWUuY29kZURlZmF1bHRWYWx1ZUluUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JEZWZhdWx0VmFsdWVJblJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yREVGQVVMVF9WQUxVRV9JTl9SRURJUkVDVElOR19GQUNUT1JZX0NPTlNUUlVDVE9SY29kZURlZmVycmVkQWZ0ZXJQcmVmaXhtZXNzYWdlRGVmZXJyZWRBZnRlclByZWZpeERlZmVycmVkQWZ0ZXJQcmVmaXhUaGUgZGVmZXJyZWQga2V5d29yZCBzaG91bGQgY29tZSBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIHByZWZpeCAoJ2FzJyBjbGF1c2UpLlRyeSBtb3ZpbmcgdGhlIGRlZmVycmVkIGtleXdvcmQgYmVmb3JlIHRoZSBwcmVmaXgudGVtcGxhdGVEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWRDYW4ndCB1c2UgdGhlIG5hbWUgJyNuYW1lJyBmb3IgYSBkZWZlcnJlZCBsaWJyYXJ5LCBhcyB0aGUgbmFtZSBpcyB1c2VkIGVsc2V3aGVyZS5jb2RlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkU0hBUkVEX0RFRkVSUkVEX1BSRUZJWHRlbXBsYXRlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkQ2F1c2UnI25hbWUnIGlzIHVzZWQgaGVyZS5jb2RlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkQ2F1c2VEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWRDYXVzZXRlbXBsYXRlRGVmZXJyZWRUeXBlQW5ub3RhdGlvblRoZSB0eXBlICcjdHlwZScgaXMgZGVmZXJyZWQgbG9hZGVkIHZpYSBwcmVmaXggJyNuYW1lJyBhbmQgY2FuJ3QgYmUgdXNlZCBhcyBhIHR5cGUgYW5ub3RhdGlvbi5UcnkgcmVtb3ZpbmcgJ2RlZmVycmVkJyBmcm9tIHRoZSBpbXBvcnQgb2YgJyNuYW1lJyBvciB1c2UgYSBzdXBlcnR5cGUgb2YgJyN0eXBlJyB0aGF0IGlzbid0IGRlZmVycmVkLmNvZGVEZWZlcnJlZFR5cGVBbm5vdGF0aW9uRGVmZXJyZWRUeXBlQW5ub3RhdGlvblRZUEVfQU5OT1RBVElPTl9ERUZFUlJFRF9DTEFTU3RlbXBsYXRlRGlsbE91dGxpbmVTdW1tYXJ5SW5kZXhlZCAjY291bnQgbGlicmFyaWVzICgjY291bnQyIGJ5dGVzKSBpbiAjbnVtMSUuM21zLCB0aGF0IGlzLAojbnVtMiUxMi4zIGJ5dGVzL21zLCBhbmQKI251bTMlMTIuMyBtcy9saWJyYXJpZXMuY29kZURpbGxPdXRsaW5lU3VtbWFyeURpbGxPdXRsaW5lU3VtbWFyeXRlbXBsYXRlRGlyZWN0Q3ljbGVJblR5cGVWYXJpYWJsZXNUeXBlICcjbmFtZScgY2FuJ3QgdXNlIGl0c2VsZiBhcyBhIGJvdW5kLmNvZGVEaXJlY3RDeWNsZUluVHlwZVZhcmlhYmxlc0RpcmVjdEN5Y2xlSW5UeXBlVmFyaWFibGVzY29kZURpcmVjdGl2ZUFmdGVyRGVjbGFyYXRpb25tZXNzYWdlRGlyZWN0aXZlQWZ0ZXJEZWNsYXJhdGlvbkRpcmVjdGl2ZUFmdGVyRGVjbGFyYXRpb25EaXJlY3RpdmVzIG11c3QgYXBwZWFyIGJlZm9yZSBhbnkgZGVjbGFyYXRpb25zLlRyeSBtb3ZpbmcgdGhlIGRpcmVjdGl2ZSBiZWZvcmUgYW55IGRlY2xhcmF0aW9ucy5jb2RlRHVwbGljYXRlRGVmZXJyZWRtZXNzYWdlRHVwbGljYXRlRGVmZXJyZWREdXBsaWNhdGVEZWZlcnJlZEFuIGltcG9ydCBkaXJlY3RpdmUgY2FuIG9ubHkgaGF2ZSBvbmUgJ2RlZmVycmVkJyBrZXl3b3JkLlRyeSByZW1vdmluZyBhbGwgYnV0IG9uZSAnZGVmZXJyZWQnIGtleXdvcmQudGVtcGxhdGVEdXBsaWNhdGVMYWJlbEluU3dpdGNoU3RhdGVtZW50VGhlIGxhYmVsICcjbmFtZScgd2FzIGFscmVhZHkgdXNlZCBpbiB0aGlzIHN3aXRjaCBzdGF0ZW1lbnQuVHJ5IGNob29zaW5nIGEgZGlmZmVyZW50IG5hbWUgZm9yIHRoaXMgbGFiZWwuY29kZUR1cGxpY2F0ZUxhYmVsSW5Td2l0Y2hTdGF0ZW1lbnREdXBsaWNhdGVMYWJlbEluU3dpdGNoU3RhdGVtZW50Y29kZUR1cGxpY2F0ZVByZWZpeG1lc3NhZ2VEdXBsaWNhdGVQcmVmaXhEdXBsaWNhdGVQcmVmaXhBbiBpbXBvcnQgZGlyZWN0aXZlIGNhbiBvbmx5IGhhdmUgb25lIHByZWZpeCAoJ2FzJyBjbGF1c2UpLlRyeSByZW1vdmluZyBhbGwgYnV0IG9uZSBwcmVmaXgudGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb24nI25hbWUnIGlzIGFscmVhZHkgZGVjbGFyZWQgaW4gdGhpcyBzY29wZS5jb2RlRHVwbGljYXRlZERlY2xhcmF0aW9uRHVwbGljYXRlZERlY2xhcmF0aW9uRFVQTElDQVRFX0RFRklOSVRJT050ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbkNhdXNlUHJldmlvdXMgZGVjbGFyYXRpb24gb2YgJyNuYW1lJy5jb2RlRHVwbGljYXRlZERlY2xhcmF0aW9uQ2F1c2VEdXBsaWNhdGVkRGVjbGFyYXRpb25DYXVzZXRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uU3ludGhldGljQ2F1c2VQcmV2aW91cyBkZWNsYXJhdGlvbiBvZiAnI25hbWUnIGlzIGltcGxpZWQgYnkgdGhpcyBkZWZpbml0aW9uLmNvZGVEdXBsaWNhdGVkRGVjbGFyYXRpb25TeW50aGV0aWNDYXVzZUR1cGxpY2F0ZWREZWNsYXJhdGlvblN5bnRoZXRpY0NhdXNldGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2VDYW4ndCB1c2UgJyNuYW1lJyBiZWNhdXNlIGl0IGlzIGRlY2xhcmVkIG1vcmUgdGhhbiBvbmNlLmNvZGVEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2VEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2V0ZW1wbGF0ZUR1cGxpY2F0ZWRFeHBvcnQnI25hbWUnIGlzIGV4cG9ydGVkIGZyb20gYm90aCAnI3VyaScgYW5kICcjdXJpMicuY29kZUR1cGxpY2F0ZWRFeHBvcnREdXBsaWNhdGVkRXhwb3J0QU1CSUdVT1VTX0VYUE9SVHRlbXBsYXRlRHVwbGljYXRlZEV4cG9ydEluVHlwZWNvZGVEdXBsaWNhdGVkRXhwb3J0SW5UeXBlRHVwbGljYXRlZEV4cG9ydEluVHlwZXRlbXBsYXRlRHVwbGljYXRlZEltcG9ydCcjbmFtZScgaXMgaW1wb3J0ZWQgZnJvbSBib3RoICcjdXJpJyBhbmQgJyN1cmkyJy5jb2RlRHVwbGljYXRlZEltcG9ydER1cGxpY2F0ZWRJbXBvcnR0ZW1wbGF0ZUR1cGxpY2F0ZWRJbXBvcnRJblR5cGVjb2RlRHVwbGljYXRlZEltcG9ydEluVHlwZUR1cGxpY2F0ZWRJbXBvcnRJblR5cGVBTUJJR1VPVVNfSU1QT1JUdGVtcGxhdGVEdXBsaWNhdGVkTGlicmFyeUV4cG9ydEEgbGlicmFyeSB3aXRoIG5hbWUgJyNuYW1lJyBpcyBleHBvcnRlZCBtb3JlIHRoYW4gb25jZS5jb2RlRHVwbGljYXRlZExpYnJhcnlFeHBvcnREdXBsaWNhdGVkTGlicmFyeUV4cG9ydEVYUE9SVF9EVVBMSUNBVEVEX0xJQlJBUllfTkFNRUR0ZW1wbGF0ZUR1cGxpY2F0ZWRMaWJyYXJ5RXhwb3J0Q29udGV4dCcjbmFtZScgaXMgYWxzbyBleHBvcnRlZCBoZXJlLmNvZGVEdXBsaWNhdGVkTGlicmFyeUV4cG9ydENvbnRleHREdXBsaWNhdGVkTGlicmFyeUV4cG9ydENvbnRleHR0ZW1wbGF0ZUR1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0QSBsaWJyYXJ5IHdpdGggbmFtZSAnI25hbWUnIGlzIGltcG9ydGVkIG1vcmUgdGhhbiBvbmNlLmNvZGVEdXBsaWNhdGVkTGlicmFyeUltcG9ydER1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0SU1QT1JUX0RVUExJQ0FURURfTElCUkFSWV9OQU1FRHRlbXBsYXRlRHVwbGljYXRlZExpYnJhcnlJbXBvcnRDb250ZXh0JyNuYW1lJyBpcyBhbHNvIGltcG9ydGVkIGhlcmUuY29kZUR1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0Q29udGV4dER1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0Q29udGV4dHRlbXBsYXRlRHVwbGljYXRlZE1vZGlmaWVyVGhlIG1vZGlmaWVyICcjbGV4ZW1lJyB3YXMgYWxyZWFkeSBzcGVjaWZpZWQuVHJ5IHJlbW92aW5nIGFsbCBidXQgb25lIG9jY3VyZW5jZSBvZiB0aGUgbW9kaWZpZXIuY29kZUR1cGxpY2F0ZWRNb2RpZmllckR1cGxpY2F0ZWRNb2RpZmllcnRlbXBsYXRlRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZENhbid0IGRlY2xhcmUgJyNuYW1lJyBiZWNhdXNlIGl0IHdhcyBhbHJlYWR5IHVzZWQgaW4gdGhpcyBzY29wZS5jb2RlRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZER1cGxpY2F0ZWROYW1lUHJldmlvdXNseVVzZWRSRUZFUkVOQ0VEX0JFRk9SRV9ERUNMQVJBVElPTnRlbXBsYXRlRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZENhdXNlUHJldmlvdXMgdXNlIG9mICcjbmFtZScuY29kZUR1cGxpY2F0ZWROYW1lUHJldmlvdXNseVVzZWRDYXVzZUR1cGxpY2F0ZWROYW1lUHJldmlvdXNseVVzZWRDYXVzZXRlbXBsYXRlRHVwbGljYXRlZE5hbWVkQXJndW1lbnREdXBsaWNhdGVkIG5hbWVkIGFyZ3VtZW50ICcjbmFtZScuY29kZUR1cGxpY2F0ZWROYW1lZEFyZ3VtZW50RHVwbGljYXRlZE5hbWVkQXJndW1lbnREVVBMSUNBVEVfTkFNRURfQVJHVU1FTlR0ZW1wbGF0ZUR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lRHVwbGljYXRlZCBwYXJhbWV0ZXIgbmFtZSAnI25hbWUnLmNvZGVEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZUR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1ldGVtcGxhdGVEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZUNhdXNlT3RoZXIgcGFyYW1ldGVyIG5hbWVkICcjbmFtZScuY29kZUR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lQ2F1c2VEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZUNhdXNlY29kZUVtcHR5TmFtZWRQYXJhbWV0ZXJMaXN0bWVzc2FnZUVtcHR5TmFtZWRQYXJhbWV0ZXJMaXN0RW1wdHlOYW1lZFBhcmFtZXRlckxpc3RNSVNTSU5HX0lERU5USUZJRVJOYW1lZCBwYXJhbWV0ZXIgbGlzdHMgY2Fubm90IGJlIGVtcHR5LlRyeSBhZGRpbmcgYSBuYW1lZCBwYXJhbWV0ZXIgdG8gdGhlIGxpc3QuY29kZUVtcHR5T3B0aW9uYWxQYXJhbWV0ZXJMaXN0bWVzc2FnZUVtcHR5T3B0aW9uYWxQYXJhbWV0ZXJMaXN0RW1wdHlPcHRpb25hbFBhcmFtZXRlckxpc3RPcHRpb25hbCBwYXJhbWV0ZXIgbGlzdHMgY2Fubm90IGJlIGVtcHR5LlRyeSBhZGRpbmcgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHRvIHRoZSBsaXN0LmNvZGVFbmNvZGluZ21lc3NhZ2VFbmNvZGluZ0VuY29kaW5nVW5hYmxlIHRvIGRlY29kZSBieXRlcyBhcyBVVEYtOC50ZW1wbGF0ZUVudW1Db25zdGFudFNhbWVOYW1lQXNFbmNsb3NpbmdOYW1lIG9mIGVudW0gY29uc3RhbnQgJyNuYW1lJyBjYW4ndCBiZSB0aGUgc2FtZSBhcyB0aGUgZW51bSdzIG93biBuYW1lLmNvZGVFbnVtQ29uc3RhbnRTYW1lTmFtZUFzRW5jbG9zaW5nRW51bUNvbnN0YW50U2FtZU5hbWVBc0VuY2xvc2luZ0VOVU1fQ09OU1RBTlRfV0lUSF9FTlVNX05BTUVjb2RlRW51bURlY2xhcmF0aW9uRW1wdHltZXNzYWdlRW51bURlY2xhcmF0aW9uRW1wdHlFbnVtRGVjbGFyYXRpb25FbXB0eUVNUFRZX0VOVU1fQk9EWUFuIGVudW0gZGVjbGFyYXRpb24gY2FuJ3QgYmUgZW1wdHkuY29kZUVudW1JbkNsYXNzbWVzc2FnZUVudW1JbkNsYXNzRW51bUluQ2xhc3NFbnVtcyBjYW4ndCBiZSBkZWNsYXJlZCBpbnNpZGUgY2xhc3Nlcy5UcnkgbW92aW5nIHRoZSBlbnVtIHRvIHRoZSB0b3AtbGV2ZWwuY29kZUVudW1JbnN0YW50aWF0aW9ubWVzc2FnZUVudW1JbnN0YW50aWF0aW9uRW51bUluc3RhbnRpYXRpb25JTlNUQU5USUFURV9FTlVNRW51bXMgY2FuJ3QgYmUgaW5zdGFudGlhdGVkLmNvZGVFcXVhbGl0eUNhbm5vdEJlRXF1YWxpdHlPcGVyYW5kbWVzc2FnZUVxdWFsaXR5Q2Fubm90QmVFcXVhbGl0eU9wZXJhbmRFcXVhbGl0eUNhbm5vdEJlRXF1YWxpdHlPcGVyYW5kQW4gZXF1YWxpdHkgZXhwcmVzc2lvbiBjYW4ndCBiZSBhbiBvcGVyYW5kIG9mIGFub3RoZXIgZXF1YWxpdHkgZXhwcmVzc2lvbi5UcnkgcmUtd3JpdGluZyB0aGUgZXhwcmVzc2lvbi50ZW1wbGF0ZUV4cGVjdGVkQWZ0ZXJCdXRHb3RFeHBlY3RlZCAnI3N0cmluZycgYWZ0ZXIgdGhpcy5jb2RlRXhwZWN0ZWRBZnRlckJ1dEdvdEV4cGVjdGVkQWZ0ZXJCdXRHb3RFWFBFQ1RFRF9UT0tFTmNvZGVFeHBlY3RlZEFuSW5pdGlhbGl6ZXJtZXNzYWdlRXhwZWN0ZWRBbkluaXRpYWxpemVyRXhwZWN0ZWRBbkluaXRpYWxpemVyRXhwZWN0ZWQgYW4gaW5pdGlhbGl6ZXIuY29kZUV4cGVjdGVkQmxvY2ttZXNzYWdlRXhwZWN0ZWRCbG9ja0V4cGVjdGVkQmxvY2tFeHBlY3RlZCBhIGJsb2NrLlRyeSBhZGRpbmcge30uY29kZUV4cGVjdGVkQmxvY2tUb1NraXBtZXNzYWdlRXhwZWN0ZWRCbG9ja1RvU2tpcEV4cGVjdGVkQmxvY2tUb1NraXBNSVNTSU5HX0ZVTkNUSU9OX0JPRFlFeHBlY3RlZCBhIGZ1bmN0aW9uIGJvZHkgb3IgJz0+Jy5jb2RlRXhwZWN0ZWRCb2R5bWVzc2FnZUV4cGVjdGVkQm9keUV4cGVjdGVkQm9keXRlbXBsYXRlRXhwZWN0ZWRCdXRHb3RFeHBlY3RlZCAnI3N0cmluZycgYmVmb3JlIHRoaXMuY29kZUV4cGVjdGVkQnV0R290RXhwZWN0ZWRCdXRHb3R0ZW1wbGF0ZUV4cGVjdGVkQ2xhc3NCb2R5VG9Ta2lwRXhwZWN0ZWQgYSBjbGFzcyBvciBtaXhpbiBib2R5LCBidXQgZ290ICcjbGV4ZW1lJy5jb2RlRXhwZWN0ZWRDbGFzc0JvZHlUb1NraXBFeHBlY3RlZENsYXNzQm9keVRvU2tpcE1JU1NJTkdfQ0xBU1NfQk9EWXRlbXBsYXRlRXhwZWN0ZWRDbGFzc01lbWJlckV4cGVjdGVkIGEgY2xhc3MgbWVtYmVyLCBidXQgZ290ICcjbGV4ZW1lJy5jb2RlRXhwZWN0ZWRDbGFzc01lbWJlckV4cGVjdGVkQ2xhc3NNZW1iZXJFWFBFQ1RFRF9DTEFTU19NRU1CRVJ0ZW1wbGF0ZUV4cGVjdGVkQ2xhc3NPck1peGluQm9keWNvZGVFeHBlY3RlZENsYXNzT3JNaXhpbkJvZHlFeHBlY3RlZENsYXNzT3JNaXhpbkJvZHl0ZW1wbGF0ZUV4cGVjdGVkRGVjbGFyYXRpb25FeHBlY3RlZCBhIGRlY2xhcmF0aW9uLCBidXQgZ290ICcjbGV4ZW1lJy5jb2RlRXhwZWN0ZWREZWNsYXJhdGlvbkV4cGVjdGVkRGVjbGFyYXRpb25FWFBFQ1RFRF9FWEVDVVRBQkxFY29kZUV4cGVjdGVkRWxzZU9yQ29tbWFtZXNzYWdlRXhwZWN0ZWRFbHNlT3JDb21tYUV4cGVjdGVkRWxzZU9yQ29tbWFFeHBlY3RlZCAnZWxzZScgb3IgY29tbWEudGVtcGxhdGVFeHBlY3RlZEVudW1Cb2R5RXhwZWN0ZWQgYSBlbnVtIGJvZHksIGJ1dCBnb3QgJyNsZXhlbWUnLkFuIGVudW0gZGVmaW5pdGlvbiBtdXN0IGhhdmUgYSBib2R5IHdpdGggYXQgbGVhc3Qgb25lIGNvbnN0YW50IG5hbWUuY29kZUV4cGVjdGVkRW51bUJvZHlFeHBlY3RlZEVudW1Cb2R5TUlTU0lOR19FTlVNX0JPRFl0ZW1wbGF0ZUV4cGVjdGVkRnVuY3Rpb25Cb2R5RXhwZWN0ZWQgYSBmdW5jdGlvbiBib2R5LCBidXQgZ290ICcjbGV4ZW1lJy5jb2RlRXhwZWN0ZWRGdW5jdGlvbkJvZHlFeHBlY3RlZEZ1bmN0aW9uQm9keWNvZGVFeHBlY3RlZEhleERpZ2l0bWVzc2FnZUV4cGVjdGVkSGV4RGlnaXRFeHBlY3RlZEhleERpZ2l0TUlTU0lOR19IRVhfRElHSVRBIGhleCBkaWdpdCAoMC05IG9yIEEtRikgbXVzdCBmb2xsb3cgJzB4Jy50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllckV4cGVjdGVkIGFuIGlkZW50aWZpZXIsIGJ1dCBnb3QgJyNsZXhlbWUnLmNvZGVFeHBlY3RlZElkZW50aWZpZXJFeHBlY3RlZElkZW50aWZpZXJ0ZW1wbGF0ZUV4cGVjdGVkSW5zdGVhZEV4cGVjdGVkICcjc3RyaW5nJyBpbnN0ZWFkIG9mIHRoaXMuY29kZUV4cGVjdGVkSW5zdGVhZEV4cGVjdGVkSW5zdGVhZGNvZGVFeHBlY3RlZE5hbWVkQXJndW1lbnRtZXNzYWdlRXhwZWN0ZWROYW1lZEFyZ3VtZW50RXhwZWN0ZWROYW1lZEFyZ3VtZW50RVhUUkFfUE9TSVRJT05BTF9BUkdVTUVOVFNFeHBlY3RlZCBuYW1lZCBhcmd1bWVudC5jb2RlRXhwZWN0ZWRPbmVFeHByZXNzaW9ubWVzc2FnZUV4cGVjdGVkT25lRXhwcmVzc2lvbkV4cGVjdGVkT25lRXhwcmVzc2lvbkV4cGVjdGVkIG9uZSBleHByZXNzaW9uLCBidXQgZm91bmQgYWRkaXRpb25hbCBpbnB1dC5jb2RlRXhwZWN0ZWRPcGVuUGFyZW5zbWVzc2FnZUV4cGVjdGVkT3BlblBhcmVuc0V4cGVjdGVkT3BlblBhcmVuc0V4cGVjdGVkICcoJy5jb2RlRXhwZWN0ZWRTdGF0ZW1lbnRtZXNzYWdlRXhwZWN0ZWRTdGF0ZW1lbnRFeHBlY3RlZFN0YXRlbWVudEV4cGVjdGVkIGEgc3RhdGVtZW50LnRlbXBsYXRlRXhwZWN0ZWRTdHJpbmdFeHBlY3RlZCBhIFN0cmluZywgYnV0IGdvdCAnI2xleGVtZScuY29kZUV4cGVjdGVkU3RyaW5nRXhwZWN0ZWRTdHJpbmdFWFBFQ1RFRF9TVFJJTkdfTElURVJBTHRlbXBsYXRlRXhwZWN0ZWRUb2tlbkV4cGVjdGVkIHRvIGZpbmQgJyNzdHJpbmcnLmNvZGVFeHBlY3RlZFRva2VuRXhwZWN0ZWRUb2tlbnRlbXBsYXRlRXhwZWN0ZWRUeXBlRXhwZWN0ZWQgYSB0eXBlLCBidXQgZ290ICcjbGV4ZW1lJy5jb2RlRXhwZWN0ZWRUeXBlRXhwZWN0ZWRUeXBlRVhQRUNURURfVFlQRV9OQU1FY29kZUV4cGVjdGVkVXJpbWVzc2FnZUV4cGVjdGVkVXJpRXhwZWN0ZWRVcmlFeHBlY3RlZCBhIFVSSS50ZW1wbGF0ZUV4cGVyaW1lbnROb3RFbmFibGVkVGhpcyByZXF1aXJlcyB0aGUgLS0jc3RyaW5nIGV4cGVyaW1lbnQgdG8gYmUgZW5hYmxlZC5UcnkgZW5hYmxpbmcgdGhpcyBleHBlcmltZW50IGJ5IGFkZGluZyBpdCB0byB0aGUgY29tbWFuZCBsaW5lIHdoZW4gY29tcGlsaW5nIGFuZCBydW5uaW5nLmNvZGVFeHBlcmltZW50Tm90RW5hYmxlZEV4cGVyaW1lbnROb3RFbmFibGVkY29kZUV4cG9ydEFmdGVyUGFydG1lc3NhZ2VFeHBvcnRBZnRlclBhcnRFeHBvcnRBZnRlclBhcnRFeHBvcnQgZGlyZWN0aXZlcyBtdXN0IHByZWNlZGUgcGFydCBkaXJlY3RpdmVzLlRyeSBtb3ZpbmcgdGhlIGV4cG9ydCBkaXJlY3RpdmVzIGJlZm9yZSB0aGUgcGFydCBkaXJlY3RpdmVzLnRlbXBsYXRlRXhwb3J0SGlkZXNFeHBvcnRFeHBvcnQgb2YgJyNuYW1lJyAoZnJvbSAnI3VyaScpIGhpZGVzIGV4cG9ydCBmcm9tICcjdXJpMicuY29kZUV4cG9ydEhpZGVzRXhwb3J0RXhwb3J0SGlkZXNFeHBvcnRjb2RlRXhwcmVzc2lvbk5vdE1ldGFkYXRhbWVzc2FnZUV4cHJlc3Npb25Ob3RNZXRhZGF0YUV4cHJlc3Npb25Ob3RNZXRhZGF0YVRoaXMgY2FuJ3QgYmUgdXNlZCBhcyBtZXRhZGF0YTsgbWV0YWRhdGEgc2hvdWxkIGJlIGEgcmVmZXJlbmNlIHRvIGEgY29tcGlsZS10aW1lIGNvbnN0YW50IHZhcmlhYmxlLCBvciBhIGNhbGwgdG8gYSBjb25zdGFudCBjb25zdHJ1Y3Rvci50ZW1wbGF0ZUV4dGVuZGluZ0VudW0nI25hbWUnIGlzIGFuIGVudW0gYW5kIGNhbid0IGJlIGV4dGVuZGVkIG9yIGltcGxlbWVudGVkLmNvZGVFeHRlbmRpbmdFbnVtRXh0ZW5kaW5nRW51bUVYVEVORFNfRU5VTXRlbXBsYXRlRXh0ZW5kaW5nUmVzdHJpY3RlZCcjbmFtZScgaXMgcmVzdHJpY3RlZCBhbmQgY2FuJ3QgYmUgZXh0ZW5kZWQgb3IgaW1wbGVtZW50ZWQuY29kZUV4dGVuZGluZ1Jlc3RyaWN0ZWRFeHRlbmRpbmdSZXN0cmljdGVkRVhURU5EU19ESVNBTExPV0VEX0NMQVNTY29kZUV4dGVybmFsQWZ0ZXJDb25zdG1lc3NhZ2VFeHRlcm5hbEFmdGVyQ29uc3RFeHRlcm5hbEFmdGVyQ29uc3RUaGUgbW9kaWZpZXIgJ2V4dGVybmFsJyBzaG91bGQgYmUgYmVmb3JlIHRoZSBtb2RpZmllciAnY29uc3QnLmNvZGVFeHRlcm5hbEFmdGVyRmFjdG9yeW1lc3NhZ2VFeHRlcm5hbEFmdGVyRmFjdG9yeUV4dGVybmFsQWZ0ZXJGYWN0b3J5VGhlIG1vZGlmaWVyICdleHRlcm5hbCcgc2hvdWxkIGJlIGJlZm9yZSB0aGUgbW9kaWZpZXIgJ2ZhY3RvcnknLmNvZGVFeHRlcm5hbEFmdGVyU3RhdGljbWVzc2FnZUV4dGVybmFsQWZ0ZXJTdGF0aWNFeHRlcm5hbEFmdGVyU3RhdGljVGhlIG1vZGlmaWVyICdleHRlcm5hbCcgc2hvdWxkIGJlIGJlZm9yZSB0aGUgbW9kaWZpZXIgJ3N0YXRpYycuY29kZUV4dGVybmFsQ2xhc3NtZXNzYWdlRXh0ZXJuYWxDbGFzc0V4dGVybmFsQ2xhc3NDbGFzc2VzIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlICdleHRlcm5hbCcuVHJ5IHJlbW92aW5nIHRoZSBrZXl3b3JkICdleHRlcm5hbCcuY29kZUV4dGVybmFsQ29uc3RydWN0b3JXaXRoQm9keW1lc3NhZ2VFeHRlcm5hbENvbnN0cnVjdG9yV2l0aEJvZHlFeHRlcm5hbENvbnN0cnVjdG9yV2l0aEJvZHlFeHRlcm5hbCBjb25zdHJ1Y3RvcnMgY2FuJ3QgaGF2ZSBhIGJvZHkuVHJ5IHJlbW92aW5nIHRoZSBib2R5IG9mIHRoZSBjb25zdHJ1Y3Rvciwgb3IgcmVtb3ZpbmcgdGhlIGtleXdvcmQgJ2V4dGVybmFsJy5jb2RlRXh0ZXJuYWxDb25zdHJ1Y3RvcldpdGhGaWVsZEluaXRpYWxpemVyc21lc3NhZ2VFeHRlcm5hbENvbnN0cnVjdG9yV2l0aEZpZWxkSW5pdGlhbGl6ZXJzRXh0ZXJuYWxDb25zdHJ1Y3RvcldpdGhGaWVsZEluaXRpYWxpemVyc0VYVEVSTkFMX0NPTlNUUlVDVE9SX1dJVEhfRklFTERfSU5JVElBTElaRVJTQW4gZXh0ZXJuYWwgY29uc3RydWN0b3IgY2FuJ3QgaW5pdGlhbGl6ZSBmaWVsZHMuVHJ5IHJlbW92aW5nIHRoZSBmaWVsZCBpbml0aWFsaXplcnMsIG9yIHJlbW92aW5nIHRoZSBrZXl3b3JkICdleHRlcm5hbCcuY29kZUV4dGVybmFsRW51bW1lc3NhZ2VFeHRlcm5hbEVudW1FeHRlcm5hbEVudW1FbnVtcyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSAnZXh0ZXJuYWwnLmNvZGVFeHRlcm5hbEZhY3RvcnlSZWRpcmVjdGlvbm1lc3NhZ2VFeHRlcm5hbEZhY3RvcnlSZWRpcmVjdGlvbkV4dGVybmFsRmFjdG9yeVJlZGlyZWN0aW9uQSByZWRpcmVjdGluZyBmYWN0b3J5IGNhbid0IGJlIGV4dGVybmFsLlRyeSByZW1vdmluZyB0aGUgJ2V4dGVybmFsJyBtb2RpZmllci5jb2RlRXh0ZXJuYWxGYWN0b3J5V2l0aEJvZHltZXNzYWdlRXh0ZXJuYWxGYWN0b3J5V2l0aEJvZHlFeHRlcm5hbEZhY3RvcnlXaXRoQm9keUV4dGVybmFsIGZhY3RvcmllcyBjYW4ndCBoYXZlIGEgYm9keS5UcnkgcmVtb3ZpbmcgdGhlIGJvZHkgb2YgdGhlIGZhY3RvcnksIG9yIHJlbW92aW5nIHRoZSBrZXl3b3JkICdleHRlcm5hbCcuY29kZUV4dGVybmFsRmllbGRtZXNzYWdlRXh0ZXJuYWxGaWVsZEV4dGVybmFsRmllbGRGaWVsZHMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgJ2V4dGVybmFsJy5jb2RlRXh0ZXJuYWxNZXRob2RXaXRoQm9keW1lc3NhZ2VFeHRlcm5hbE1ldGhvZFdpdGhCb2R5RXh0ZXJuYWxNZXRob2RXaXRoQm9keUFuIGV4dGVybmFsIG9yIG5hdGl2ZSBtZXRob2QgY2FuJ3QgaGF2ZSBhIGJvZHkuY29kZUV4dGVybmFsVHlwZWRlZm1lc3NhZ2VFeHRlcm5hbFR5cGVkZWZFeHRlcm5hbFR5cGVkZWZUeXBlZGVmcyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSAnZXh0ZXJuYWwnLnRlbXBsYXRlRXh0cmFuZW91c01vZGlmaWVyQ2FuJ3QgaGF2ZSBtb2RpZmllciAnI2xleGVtZScgaGVyZS5UcnkgcmVtb3ZpbmcgJyNsZXhlbWUnLmNvZGVFeHRyYW5lb3VzTW9kaWZpZXJFeHRyYW5lb3VzTW9kaWZpZXJjb2RlRmFjdG9yeU5vdFN5bmNtZXNzYWdlRmFjdG9yeU5vdFN5bmNGYWN0b3J5Tm90U3luY05PTl9TWU5DX0ZBQ1RPUllGYWN0b3J5IGJvZGllcyBjYW4ndCB1c2UgJ2FzeW5jJywgJ2FzeW5jKicsIG9yICdzeW5jKicuY29kZUZhY3RvcnlUb3BMZXZlbERlY2xhcmF0aW9ubWVzc2FnZUZhY3RvcnlUb3BMZXZlbERlY2xhcmF0aW9uRmFjdG9yeVRvcExldmVsRGVjbGFyYXRpb25Ub3AtbGV2ZWwgZGVjbGFyYXRpb25zIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlICdmYWN0b3J5Jy5UcnkgcmVtb3ZpbmcgdGhlIGtleXdvcmQgJ2ZhY3RvcnknLnRlbXBsYXRlRmFzdGFDTElBcmd1bWVudFJlcXVpcmVkRXhwZWN0ZWQgdmFsdWUgYWZ0ZXIgJyNuYW1lJy5jb2RlRmFzdGFDTElBcmd1bWVudFJlcXVpcmVkRmFzdGFDTElBcmd1bWVudFJlcXVpcmVkY29kZUZhc3RhVXNhZ2VMb25nbWVzc2FnZUZhc3RhVXNhZ2VMb25nRmFzdGFVc2FnZUxvbmdTdXBwb3J0ZWQgb3B0aW9uczoKCiAgLW8gPGZpbGU+LCAtLW91dHB1dD08ZmlsZT4KICAgIEdlbmVyYXRlIHRoZSBvdXRwdXQgaW50byA8ZmlsZT4uCgogIC1oLCAvaCwgLz8sIC0taGVscAogICAgRGlzcGxheSB0aGlzIG1lc3NhZ2UgKGFkZCAtdiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWxsIG9wdGlvbnMpLgoKICAtdiwgLS12ZXJib3NlCiAgICBEaXNwbGF5IHZlcmJvc2UgaW5mb3JtYXRpb24uCgogIC1EbmFtZQogIC1EbmFtZT12YWx1ZQogICAgRGVmaW5lIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIGluIHRoZSBjb21waWxlLXRpbWUgZW52aXJvbm1lbnQuCgogIC0tbm8tZGVmaW5lcwogICAgSWdub3JlIGFsbCAtRCBvcHRpb25zIGFuZCBsZWF2ZSBlbnZpcm9ubWVudCBjb25zdGFudHMgdW5ldmFsdWF0ZWQuCgogIC0tCiAgICBTdG9wIG9wdGlvbiBwYXJzaW5nLCB0aGUgcmVzdCBvZiB0aGUgY29tbWFuZCBsaW5lIGlzIGFzc3VtZWQgdG8gYmUKICAgIGZpbGUgbmFtZXMgb3IgYXJndW1lbnRzIHRvIHRoZSBEYXJ0IHByb2dyYW0uCgogIC0tcGFja2FnZXM9PGZpbGU+CiAgICBVc2UgcGFja2FnZSByZXNvbHV0aW9uIGNvbmZpZ3VyYXRpb24gPGZpbGU+LCB3aGljaCBzaG91bGQgY29udGFpbiBhIG1hcHBpbmcKICAgIG9mIHBhY2thZ2UgbmFtZXMgdG8gcGF0aHMuCgogIC0tcGxhdGZvcm09PGZpbGU+CiAgICBSZWFkIHRoZSBTREsgcGxhdGZvcm0gZnJvbSA8ZmlsZT4sIHdoaWNoIHNob3VsZCBiZSBpbiBEaWxsL0tlcm5lbCBJUiBmb3JtYXQKICAgIGFuZCBjb250YWluIHRoZSBEYXJ0IFNESy4KCiAgLS10YXJnZXQ9ZGFydDJqc3xkYXJ0MmpzX3NlcnZlcnxkYXJ0X3J1bm5lcnxmbHV0dGVyfGZsdXR0ZXJfcnVubmVyfG5vbmV8dm0KICAgIFNwZWNpZnkgdGhlIHRhcmdldCBjb25maWd1cmF0aW9uLgoKICAtLWVuYWJsZS1hc3NlcnRzCiAgICBDaGVjayBhc3NlcnRzIGluIGluaXRpYWxpemVycyBkdXJpbmcgY29uc3RhbnQgZXZhbHVhdGlvbi4KCiAgLS12ZXJpZnkKICAgIENoZWNrIHRoYXQgdGhlIGdlbmVyYXRlZCBvdXRwdXQgaXMgZnJlZSBvZiB2YXJpb3VzIHByb2JsZW1zLiBUaGlzIGlzIG1vc3RseQogICAgdXNlZnVsIGZvciBkZXZlbG9wZXJzIG9mIHRoaXMgY29tcGlsZXIgb3IgS2VybmVsIHRyYW5zZm9ybWF0aW9ucy4KCiAgLS1kdW1wLWlyCiAgICBQcmludCBjb21waWxlZCBsaWJyYXJpZXMgaW4gS2VybmVsIHNvdXJjZSBub3RhdGlvbi4KCiAgLS1vbWl0LXBsYXRmb3JtCiAgICBFeGNsdWRlIHRoZSBwbGF0Zm9ybSBmcm9tIHRoZSBzZXJpYWxpemVkIGRpbGwgZmlsZS4KCiAgLS1ieXRlY29kZQogICAgR2VuZXJhdGUgYnl0ZWNvZGUuIFN1cHBvcnRlZCBvbmx5IGZvciBTREsgcGxhdGZvcm0gY29tcGlsYXRpb24uCgogIC0tZXhjbHVkZS1zb3VyY2UKICAgIERvIG5vdCBpbmNsdWRlIHNvdXJjZSBjb2RlIGluIHRoZSBkaWxsIGZpbGUuCgogIC0tY29tcGlsZS1zZGs9PHNkaz4KICAgIENvbXBpbGUgdGhlIFNESyBmcm9tIHNjcmF0Y2ggaW5zdGVhZCBvZiByZWFkaW5nIGl0IGZyb20gYSAuZGlsbCBmaWxlCiAgICAoc2VlIC0tcGxhdGZvcm0pLgoKICAtLXNkaz08c2RrPgogICAgTG9jYXRpb24gb2YgdGhlIFNESyBzb3VyY2VzIGZvciB1c2Ugd2hlbiBjb21waWxpbmcgYWRkaXRpb25hbCBwbGF0Zm9ybQogICAgbGlicmFyaWVzLgoKICAtLXN1cGVybWl4aW4KICAgIElnbm9yZWQgZm9yIG5vdy4KCiAgLS1zaW5nbGUtcm9vdC1zY2hlbWU9U3RyaW5nCiAgLS1zaW5nbGUtcm9vdC1iYXNlPTxkaXI+CiAgICBTcGVjaWZ5IGEgY3VzdG9tIFVSSSBzY2hlbWUgYW5kIGEgbG9jYXRpb24gb24gZGlzayB3aGVyZSBzdWNoIFVSSXMgYXJlCiAgICBtYXBwZWQgdG8uCgogICAgV2hlbiBzcGVjaWZpZWQsIHRoZSBjb21waWxlciBjYW4gYmUgaW52b2tlZCB3aXRoIGlucHV0cyB1c2luZyB0aGUgY3VzdG9tCiAgICBVUkkgc2NoZW1lLiBUaGUgY29tcGlsZXIgY2FuIGlnbm9yZSB0aGUgZXhhY3QgbG9jYXRpb24gb2YgZmlsZXMgb24gZGlzawogICAgYW5kIGFzIGEgcmVzdWx0IHRvIHByb2R1Y2Ugb3V0cHV0IHRoYXQgaXMgaW5kZXBlbmRlbmRlbnQgb2YgdGhlIGFic29sdXRlCiAgICBsb2NhdGlvbiBvZiBmaWxlcyBvbiBkaXNrLiBUaGlzIGlzIG1vc3RseSB1c2VmdWwgZm9yIGludGVncmF0aW5nIHdpdGgKICAgIGJ1aWxkIHN5c3RlbXMuCgogIC0tZmF0YWw9ZXJyb3JzCiAgLS1mYXRhbD13YXJuaW5ncwogICAgTWFrZXMgbWVzc2FnZXMgb2YgdGhlIGdpdmVuIGtpbmRzIGZhdGFsLCB0aGF0IGlzLCBpbW1lZGlhdGVseSBzdG9wIHRoZQogICAgY29tcGlsZXIgd2l0aCBhIG5vbi16ZXJvIGV4aXQtY29kZS4gSW4gLS12ZXJib3NlIG1vZGUsIGFsc28gZGlzcGxheSBhbgogICAgaW50ZXJuYWwgc3RhY2sgdHJhY2UgZnJvbSB0aGUgY29tcGlsZXIuIE11bHRpcGxlIGtpbmRzIGNhbiBiZSBzZXBhcmF0ZWQgYnkKICAgIGNvbW1hcywgZm9yIGV4YW1wbGUsIC0tZmF0YWw9ZXJyb3JzLHdhcm5pbmdzLgoKICAtLWVuYWJsZS1leHBlcmltZW50PTxmbGFnPgogICAgRW5hYmxlIG9yIGRpc2FibGUgYW4gZXhwZXJpbWVudGFsIGZsYWcsIHVzZWQgdG8gZ3VhcmQgZmVhdHVyZXMgY3VycmVudGx5CiAgICBpbiBkZXZlbG9wbWVudC4gUHJlZml4IGFuIGV4cGVyaW1lbnQgbmFtZSB3aXRoICduby0nIHRvIGRpc2FibGUgaXQuCiAgICBNdWx0aXBsZSBleHBlcmltZW50cyBjYW4gYmUgc2VwYXJhdGVkIGJ5IGNvbW1hcy5jb2RlRmFzdGFVc2FnZVNob3J0bWVzc2FnZUZhc3RhVXNhZ2VTaG9ydEZhc3RhVXNhZ2VTaG9ydEZyZXF1ZW50bHkgdXNlZCBvcHRpb25zOgoKICAtbyA8ZmlsZT4gR2VuZXJhdGUgdGhlIG91dHB1dCBpbnRvIDxmaWxlPi4KICAtaCAgICAgICAgRGlzcGxheSB0aGlzIG1lc3NhZ2UgKGFkZCAtdiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWxsIG9wdGlvbnMpLnRlbXBsYXRlRmZpRmllbGRBbm5vdGF0aW9uRmllbGQgJyNuYW1lJyByZXF1aXJlcyBleGFjdGx5IG9uZSBhbm5vdGF0aW9uIHRvIGRlY2xhcmUgaXRzIEMrKyB0eXBlLCB3aGljaCBjYW5ub3QgYmUgVm9pZC4gZGFydDpmZmkgc3RydWN0cyAoUG9pbnRlcjxWb2lkPikgY2Fubm90IGhhdmUgcmVndWxhciBEYXJ0IGZpZWxkcy5jb2RlRmZpRmllbGRBbm5vdGF0aW9uRmZpRmllbGRBbm5vdGF0aW9udGVtcGxhdGVGZmlGaWVsZEluaXRpYWxpemVyRmllbGQgJyNuYW1lJyBpcyBhIGRhcnQ6ZmZpIFBvaW50ZXIgdG8gYSBzdHJ1Y3QgZmllbGQgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNvbnN0cnVjdG9yIGV4ZWN1dGlvbi5jb2RlRmZpRmllbGRJbml0aWFsaXplckZmaUZpZWxkSW5pdGlhbGl6ZXJ0ZW1wbGF0ZUZmaU5vdFN0YXRpYyNuYW1lIGV4cGVjdHMgYSBzdGF0aWMgZnVuY3Rpb24gYXMgcGFyYW1ldGVyLiBkYXJ0OmZmaSBvbmx5IHN1cHBvcnRzIGNhbGxpbmcgc3RhdGljIERhcnQgZnVuY3Rpb25zIGZyb20gYy5jb2RlRmZpTm90U3RhdGljRmZpTm90U3RhdGljdGVtcGxhdGVGZmlTdHJ1Y3RBbm5vdGF0aW9uQ2xhc3MgJyNuYW1lJyBpcyBhIGRhcnQ6ZmZpIFBvaW50ZXIgYnV0IGhhcyBubyBzdHJ1Y3QgYW5ub3RhdGlvbi4gT25seSBzdHJ1Y3QgUG9pbnRlcnMgY2FuIGhhdmUgZmllbGRzLmNvZGVGZmlTdHJ1Y3RBbm5vdGF0aW9uRmZpU3RydWN0QW5ub3RhdGlvbnRlbXBsYXRlRmZpVHlwZUludmFsaWRFeHBlY3RlZCB0eXBlICcjdHlwZScgdG8gYmUgYSB2YWxpZCBhbmQgaW5zdGFudGlhdGVkIHN1YnR5cGUgb2YgJ05hdGl2ZVR5cGUnLmNvZGVGZmlUeXBlSW52YWxpZEZmaVR5cGVJbnZhbGlkdGVtcGxhdGVGZmlUeXBlTWlzbWF0Y2hFeHBlY3RlZCB0eXBlICcjdHlwZScgdG8gYmUgJyN0eXBlMicsIHdoaWNoIGlzIHRoZSBEYXJ0IHR5cGUgY29ycmVzcG9uZGluZyB0byAnI3R5cGUzJy5jb2RlRmZpVHlwZU1pc21hdGNoRmZpVHlwZU1pc21hdGNodGVtcGxhdGVGZmlUeXBlVW5zaXplZE1ldGhvZCAnI25hbWUnIGNhbm5vdCBiZSBjYWxsZWQgb24gc29tZXRoaW5nIG9mIHR5cGUgJyN0eXBlJyBhcyB0aGlzIHR5cGUgaXMgdW5zaXplZC5jb2RlRmZpVHlwZVVuc2l6ZWRGZmlUeXBlVW5zaXplZGNvZGVGaWVsZEluaXRpYWxpemVkT3V0c2lkZURlY2xhcmluZ0NsYXNzbWVzc2FnZUZpZWxkSW5pdGlhbGl6ZWRPdXRzaWRlRGVjbGFyaW5nQ2xhc3NGaWVsZEluaXRpYWxpemVkT3V0c2lkZURlY2xhcmluZ0NsYXNzQSBmaWVsZCBjYW4gb25seSBiZSBpbml0aWFsaXplZCBpbiBpdCdzIGRlY2xhcmluZyBjbGFzc1RyeSBwYXNzaW5nIGEgdmFsdWUgaW50byB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3Rvciwgb3IgbW92aW5nIHRoZSBpbml0aWFsaXphdGlvbiBpbnRvIHRoZSBjb25zdHJ1Y3RvciBib2R5LmNvZGVGaWVsZEluaXRpYWxpemVyT3V0c2lkZUNvbnN0cnVjdG9ybWVzc2FnZUZpZWxkSW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3JGaWVsZEluaXRpYWxpemVyT3V0c2lkZUNvbnN0cnVjdG9yRmllbGQgZm9ybWFsIHBhcmFtZXRlcnMgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIGNvbnN0cnVjdG9yLlRyeSByZW1vdmluZyAndGhpcy4nLmNvZGVGaW5hbEFuZENvdmFyaWFudG1lc3NhZ2VGaW5hbEFuZENvdmFyaWFudEZpbmFsQW5kQ292YXJpYW50TWVtYmVycyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSBib3RoICdmaW5hbCcgYW5kICdjb3ZhcmlhbnQnLlRyeSByZW1vdmluZyBlaXRoZXIgdGhlICdmaW5hbCcgb3IgJ2NvdmFyaWFudCcga2V5d29yZC5jb2RlRmluYWxBbmRWYXJtZXNzYWdlRmluYWxBbmRWYXJGaW5hbEFuZFZhck1lbWJlcnMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgYm90aCAnZmluYWwnIGFuZCAndmFyJy5UcnkgcmVtb3ZpbmcgdGhlIGtleXdvcmQgJ3ZhcicudGVtcGxhdGVGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWRGaW5hbCBmaWVsZCAnI25hbWUnIGlzIG5vdCBpbml0aWFsaXplZC5UcnkgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQgaW4gdGhlIGRlY2xhcmF0aW9uIG9yIGluIGV2ZXJ5IGNvbnN0cnVjdG9yLmNvZGVGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWRGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWRGSU5BTF9OT1RfSU5JVElBTElaRUR0ZW1wbGF0ZUZpbmFsRmllbGROb3RJbml0aWFsaXplZEJ5Q29uc3RydWN0b3JGaW5hbCBmaWVsZCAnI25hbWUnIGlzIG5vdCBpbml0aWFsaXplZCBieSB0aGlzIGNvbnN0cnVjdG9yLlRyeSB0byBpbml0aWFsaXplIHRoZSBmaWVsZCB1c2luZyBhbiBpbml0aWFsaXppbmcgZm9ybWFsIG9yIGEgZmllbGQgaW5pdGlhbGl6ZXIuY29kZUZpbmFsRmllbGROb3RJbml0aWFsaXplZEJ5Q29uc3RydWN0b3JGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWRCeUNvbnN0cnVjdG9yRklOQUxfTk9UX0lOSVRJQUxJWkVEX0NPTlNUUlVDVE9SXzF0ZW1wbGF0ZUZpbmFsRmllbGRXaXRob3V0SW5pdGlhbGl6ZXJUaGUgZmluYWwgdmFyaWFibGUgJyNuYW1lJyBtdXN0IGJlIGluaXRpYWxpemVkLmNvZGVGaW5hbEZpZWxkV2l0aG91dEluaXRpYWxpemVyRmluYWxGaWVsZFdpdGhvdXRJbml0aWFsaXplcnRlbXBsYXRlRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkJyNuYW1lJyBpcyBhIGZpbmFsIGluc3RhbmNlIHZhcmlhYmxlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC5jb2RlRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkRklOQUxfSU5JVElBTElaRURfTVVMVElQTEVfVElNRVN0ZW1wbGF0ZUZpbmFsSW5zdGFuY2VWYXJpYWJsZUFscmVhZHlJbml0aWFsaXplZENhdXNlJyNuYW1lJyB3YXMgaW5pdGlhbGl6ZWQgaGVyZS5jb2RlRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkQ2F1c2VGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWRDYXVzZXRlbXBsYXRlRm9ySW5Mb29wRWxlbWVudFR5cGVOb3RBc3NpZ25hYmxlQSB2YWx1ZSBvZiB0eXBlICcjdHlwZScgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICcjdHlwZTInLlRyeSBjaGFuZ2luZyB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUuY29kZUZvckluTG9vcEVsZW1lbnRUeXBlTm90QXNzaWduYWJsZUZvckluTG9vcEVsZW1lbnRUeXBlTm90QXNzaWduYWJsZUZPUl9JTl9PRl9JTlZBTElEX0VMRU1FTlRfVFlQRWNvZGVGb3JJbkxvb3BFeGFjdGx5T25lVmFyaWFibGVtZXNzYWdlRm9ySW5Mb29wRXhhY3RseU9uZVZhcmlhYmxlRm9ySW5Mb29wRXhhY3RseU9uZVZhcmlhYmxlQSBmb3ItaW4gbG9vcCBjYW4ndCBoYXZlIG1vcmUgdGhhbiBvbmUgbG9vcCB2YXJpYWJsZS5jb2RlRm9ySW5Mb29wTm90QXNzaWduYWJsZW1lc3NhZ2VGb3JJbkxvb3BOb3RBc3NpZ25hYmxlRm9ySW5Mb29wTm90QXNzaWduYWJsZUNhbid0IGFzc2lnbiB0byB0aGlzLCBzbyBpdCBjYW4ndCBiZSB1c2VkIGluIGEgZm9yLWluIGxvb3AudGVtcGxhdGVGb3JJbkxvb3BUeXBlTm90SXRlcmFibGVUaGUgdHlwZSAnI3R5cGUnIHVzZWQgaW4gdGhlICdmb3InIGxvb3AgbXVzdCBpbXBsZW1lbnQgJyN0eXBlMicuY29kZUZvckluTG9vcFR5cGVOb3RJdGVyYWJsZUZvckluTG9vcFR5cGVOb3RJdGVyYWJsZUZPUl9JTl9PRl9JTlZBTElEX1RZUEVjb2RlRm9ySW5Mb29wV2l0aENvbnN0VmFyaWFibGVtZXNzYWdlRm9ySW5Mb29wV2l0aENvbnN0VmFyaWFibGVGb3JJbkxvb3BXaXRoQ29uc3RWYXJpYWJsZUZPUl9JTl9XSVRIX0NPTlNUX1ZBUklBQkxFQSBmb3ItaW4gbG9vcC12YXJpYWJsZSBjYW4ndCBiZSAnY29uc3QnLlRyeSByZW1vdmluZyB0aGUgJ2NvbnN0JyBtb2RpZmllci5jb2RlRnVuY3Rpb25UeXBlRGVmYXVsdFZhbHVlbWVzc2FnZUZ1bmN0aW9uVHlwZURlZmF1bHRWYWx1ZUZ1bmN0aW9uVHlwZURlZmF1bHRWYWx1ZURFRkFVTFRfVkFMVUVfSU5fRlVOQ1RJT05fVFlQRUNhbid0IGhhdmUgYSBkZWZhdWx0IHZhbHVlIGluIGEgZnVuY3Rpb24gdHlwZS5jb2RlRnVuY3Rpb25UeXBlZFBhcmFtZXRlclZhcm1lc3NhZ2VGdW5jdGlvblR5cGVkUGFyYW1ldGVyVmFyRnVuY3Rpb25UeXBlZFBhcmFtZXRlclZhckZVTkNUSU9OX1RZUEVEX1BBUkFNRVRFUl9WQVJGdW5jdGlvbi10eXBlZCBwYXJhbWV0ZXJzIGNhbid0IHNwZWNpZnkgJ2NvbnN0JywgJ2ZpbmFsJyBvciAndmFyJyBpbiBwbGFjZSBvZiBhIHJldHVybiB0eXBlLlRyeSByZXBsYWNpbmcgdGhlIGtleXdvcmQgd2l0aCBhIHJldHVybiB0eXBlLmNvZGVHZW5lcmF0b3JSZXR1cm5zVmFsdWVtZXNzYWdlR2VuZXJhdG9yUmV0dXJuc1ZhbHVlR2VuZXJhdG9yUmV0dXJuc1ZhbHVlUkVUVVJOX0lOX0dFTkVSQVRPUidzeW5jKicgYW5kICdhc3luYyonIGNhbid0IHJldHVybiBhIHZhbHVlLmNvZGVHZW5lcmljRnVuY3Rpb25UeXBlSW5Cb3VuZG1lc3NhZ2VHZW5lcmljRnVuY3Rpb25UeXBlSW5Cb3VuZEdlbmVyaWNGdW5jdGlvblR5cGVJbkJvdW5kR0VORVJJQ19GVU5DVElPTl9UWVBFX0NBTk5PVF9CRV9CT1VORFR5cGUgdmFyaWFibGVzIGNhbid0IGhhdmUgZ2VuZXJpYyBmdW5jdGlvbiB0eXBlcyBpbiB0aGVpciBib3VuZHMudGVtcGxhdGVHZW5lcmljRnVuY3Rpb25UeXBlSW5mZXJyZWRBc0FjdHVhbFR5cGVBcmd1bWVudFVuZXhwZWN0ZWQgZ2VuZXJpYyBmdW5jdGlvbiB0eXBlICcjdHlwZScgaW5mZXJyZWQgYXMgYSB0eXBlIGFyZ3VtZW50LlRyeSBwcm92aWRpbmcgYSBub24tZ2VuZXJpYyBmdW5jdGlvbiB0eXBlIGV4cGxpY2l0bHkuY29kZUdlbmVyaWNGdW5jdGlvblR5cGVJbmZlcnJlZEFzQWN0dWFsVHlwZUFyZ3VtZW50R2VuZXJpY0Z1bmN0aW9uVHlwZUluZmVycmVkQXNBY3R1YWxUeXBlQXJndW1lbnRHRU5FUklDX0ZVTkNUSU9OX0NBTk5PVF9CRV9UWVBFX0FSR1VNRU5UY29kZUdlbmVyaWNGdW5jdGlvblR5cGVVc2VkQXNBY3R1YWxUeXBlQXJndW1lbnRtZXNzYWdlR2VuZXJpY0Z1bmN0aW9uVHlwZVVzZWRBc0FjdHVhbFR5cGVBcmd1bWVudEdlbmVyaWNGdW5jdGlvblR5cGVVc2VkQXNBY3R1YWxUeXBlQXJndW1lbnRVbmV4cGVjdGVkIGdlbmVyaWMgZnVuY3Rpb24gdHlwZSBmb3VuZCBpbiBhIHR5cGUgYXJndW1lbnQuVHJ5IHVzaW5nIGEgbm9uLWdlbmVyaWMgZnVuY3Rpb24gdHlwZS50ZW1wbGF0ZUdldHRlck5vdEZvdW5kR2V0dGVyIG5vdCBmb3VuZDogJyNuYW1lJy5jb2RlR2V0dGVyTm90Rm91bmRHZXR0ZXJOb3RGb3VuZFVOREVGSU5FRF9HRVRURVJjb2RlR2V0dGVyV2l0aEZvcm1hbHNtZXNzYWdlR2V0dGVyV2l0aEZvcm1hbHNHZXR0ZXJXaXRoRm9ybWFsc0dFVFRFUl9XSVRIX1BBUkFNRVRFUlNBIGdldHRlciBjYW4ndCBoYXZlIGZvcm1hbCBwYXJhbWV0ZXJzLlRyeSByZW1vdmluZyAnKC4uLiknLmNvZGVJbGxlZ2FsQXNzaWdubWVudFRvTm9uQXNzaWduYWJsZW1lc3NhZ2VJbGxlZ2FsQXNzaWdubWVudFRvTm9uQXNzaWduYWJsZUlsbGVnYWxBc3NpZ25tZW50VG9Ob25Bc3NpZ25hYmxlSWxsZWdhbCBhc3NpZ25tZW50IHRvIG5vbi1hc3NpZ25hYmxlIGV4cHJlc3Npb24uY29kZUlsbGVnYWxBc3luY0dlbmVyYXRvclJldHVyblR5cGVtZXNzYWdlSWxsZWdhbEFzeW5jR2VuZXJhdG9yUmV0dXJuVHlwZUlsbGVnYWxBc3luY0dlbmVyYXRvclJldHVyblR5cGVJTExFR0FMX0FTWU5DX0dFTkVSQVRPUl9SRVRVUk5fVFlQRUZ1bmN0aW9ucyBtYXJrZWQgJ2FzeW5jKicgbXVzdCBoYXZlIGEgcmV0dXJuIHR5cGUgYXNzaWduYWJsZSB0byAnU3RyZWFtJy5jb2RlSWxsZWdhbEFzeW5jR2VuZXJhdG9yVm9pZFJldHVyblR5cGVtZXNzYWdlSWxsZWdhbEFzeW5jR2VuZXJhdG9yVm9pZFJldHVyblR5cGVJbGxlZ2FsQXN5bmNHZW5lcmF0b3JWb2lkUmV0dXJuVHlwZUZ1bmN0aW9ucyBtYXJrZWQgJ2FzeW5jKicgY2FuJ3QgaGF2ZSByZXR1cm4gdHlwZSAndm9pZCcuY29kZUlsbGVnYWxBc3luY1JldHVyblR5cGVtZXNzYWdlSWxsZWdhbEFzeW5jUmV0dXJuVHlwZUlsbGVnYWxBc3luY1JldHVyblR5cGVJTExFR0FMX0FTWU5DX1JFVFVSTl9UWVBFRnVuY3Rpb25zIG1hcmtlZCAnYXN5bmMnIG11c3QgaGF2ZSBhIHJldHVybiB0eXBlIGFzc2lnbmFibGUgdG8gJ0Z1dHVyZScudGVtcGxhdGVJbGxlZ2FsTWl4aW5UaGUgdHlwZSAnI25hbWUnIGNhbid0IGJlIG1peGVkIGluLmNvZGVJbGxlZ2FsTWl4aW5JbGxlZ2FsTWl4aW5JTExFR0FMX01JWElOdGVtcGxhdGVJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9yc0Nhbid0IHVzZSAnI25hbWUnIGFzIGEgbWl4aW4gYmVjYXVzZSBpdCBoYXMgY29uc3RydWN0b3JzLmNvZGVJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9yc0lsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzTUlYSU5fREVDTEFSRVNfQ09OU1RSVUNUT1J0ZW1wbGF0ZUlsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzQ2F1c2VUaGlzIGNvbnN0cnVjdG9yIHByZXZlbnRzIHVzaW5nICcjbmFtZScgYXMgYSBtaXhpbi5jb2RlSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnNDYXVzZUlsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzQ2F1c2Vjb2RlSWxsZWdhbFN5bmNHZW5lcmF0b3JSZXR1cm5UeXBlbWVzc2FnZUlsbGVnYWxTeW5jR2VuZXJhdG9yUmV0dXJuVHlwZUlsbGVnYWxTeW5jR2VuZXJhdG9yUmV0dXJuVHlwZUlMTEVHQUxfU1lOQ19HRU5FUkFUT1JfUkVUVVJOX1RZUEVGdW5jdGlvbnMgbWFya2VkICdzeW5jKicgbXVzdCBoYXZlIGEgcmV0dXJuIHR5cGUgYXNzaWduYWJsZSB0byAnSXRlcmFibGUnLmNvZGVJbGxlZ2FsU3luY0dlbmVyYXRvclZvaWRSZXR1cm5UeXBlbWVzc2FnZUlsbGVnYWxTeW5jR2VuZXJhdG9yVm9pZFJldHVyblR5cGVJbGxlZ2FsU3luY0dlbmVyYXRvclZvaWRSZXR1cm5UeXBlRnVuY3Rpb25zIG1hcmtlZCAnc3luYyonIGNhbid0IGhhdmUgcmV0dXJuIHR5cGUgJ3ZvaWQnLmNvZGVJbXBsZW1lbnRzQmVmb3JlRXh0ZW5kc21lc3NhZ2VJbXBsZW1lbnRzQmVmb3JlRXh0ZW5kc0ltcGxlbWVudHNCZWZvcmVFeHRlbmRzVGhlIGV4dGVuZHMgY2xhdXNlIG11c3QgYmUgYmVmb3JlIHRoZSBpbXBsZW1lbnRzIGNsYXVzZS5UcnkgbW92aW5nIHRoZSBleHRlbmRzIGNsYXVzZSBiZWZvcmUgdGhlIGltcGxlbWVudHMgY2xhdXNlLmNvZGVJbXBsZW1lbnRzQmVmb3JlT25tZXNzYWdlSW1wbGVtZW50c0JlZm9yZU9uSW1wbGVtZW50c0JlZm9yZU9uVGhlIG9uIGNsYXVzZSBtdXN0IGJlIGJlZm9yZSB0aGUgaW1wbGVtZW50cyBjbGF1c2UuVHJ5IG1vdmluZyB0aGUgb24gY2xhdXNlIGJlZm9yZSB0aGUgaW1wbGVtZW50cyBjbGF1c2UuY29kZUltcGxlbWVudHNCZWZvcmVXaXRobWVzc2FnZUltcGxlbWVudHNCZWZvcmVXaXRoSW1wbGVtZW50c0JlZm9yZVdpdGhUaGUgd2l0aCBjbGF1c2UgbXVzdCBiZSBiZWZvcmUgdGhlIGltcGxlbWVudHMgY2xhdXNlLlRyeSBtb3ZpbmcgdGhlIHdpdGggY2xhdXNlIGJlZm9yZSB0aGUgaW1wbGVtZW50cyBjbGF1c2UuY29kZUltcGxlbWVudHNGdXR1cmVPcm1lc3NhZ2VJbXBsZW1lbnRzRnV0dXJlT3JJbXBsZW1lbnRzRnV0dXJlT3InRnV0dXJlT3InIGNhbid0IGJlIHVzZWQgaW4gYW4gJ2ltcGxlbWVudHMnIGNsYXVzZS50ZW1wbGF0ZUltcGxlbWVudHNSZXBlYXRlZCcjbmFtZScgY2FuIG9ubHkgYmUgaW1wbGVtZW50ZWQgb25jZS5UcnkgcmVtb3ZpbmcgI2NvdW50IG9mIHRoZSBvY2N1cnJlbmNlcy5jb2RlSW1wbGVtZW50c1JlcGVhdGVkSW1wbGVtZW50c1JlcGVhdGVkSU1QTEVNRU5UU19SRVBFQVRFRHRlbXBsYXRlSW1wbGVtZW50c1N1cGVyQ2xhc3MnI25hbWUnIGNhbid0IGJlIHVzZWQgaW4gYm90aCAnZXh0ZW5kcycgYW5kICdpbXBsZW1lbnRzJyBjbGF1c2VzLlRyeSByZW1vdmluZyBvbmUgb2YgdGhlIG9jY3VycmVuY2VzLmNvZGVJbXBsZW1lbnRzU3VwZXJDbGFzc0ltcGxlbWVudHNTdXBlckNsYXNzSU1QTEVNRU5UU19TVVBFUl9DTEFTU3RlbXBsYXRlSW1wbGljaXRDYWxsT2ZOb25NZXRob2RDYW5ub3QgaW52b2tlIGFuIGluc3RhbmNlIG9mICcjdHlwZScgYmVjYXVzZSBpdCBkZWNsYXJlcyAnY2FsbCcgdG8gYmUgc29tZXRoaW5nIG90aGVyIHRoYW4gYSBtZXRob2QuVHJ5IGNoYW5naW5nICdjYWxsJyB0byBhIG1ldGhvZCBvciBleHBsaWNpdGx5IGludm9rZSAnY2FsbCcuY29kZUltcGxpY2l0Q2FsbE9mTm9uTWV0aG9kSW1wbGljaXRDYWxsT2ZOb25NZXRob2RJTVBMSUNJVF9DQUxMX09GX05PTl9NRVRIT0R0ZW1wbGF0ZUltcGxpY2l0TWl4aW5PdmVycmlkZUNvbnRleHRPdmVycmlkZSB3YXMgaW50cm9kdWNlZCB3aGVuIHRoZSBtaXhpbiAnI25hbWUnIHdhcyBhcHBsaWVkIHRvICcjbmFtZTInLmNvZGVJbXBsaWNpdE1peGluT3ZlcnJpZGVDb250ZXh0SW1wbGljaXRNaXhpbk92ZXJyaWRlQ29udGV4dGNvZGVJbXBvcnRBZnRlclBhcnRtZXNzYWdlSW1wb3J0QWZ0ZXJQYXJ0SW1wb3J0QWZ0ZXJQYXJ0SW1wb3J0IGRpcmVjdGl2ZXMgbXVzdCBwcmVjZWRlIHBhcnQgZGlyZWN0aXZlcy5UcnkgbW92aW5nIHRoZSBpbXBvcnQgZGlyZWN0aXZlcyBiZWZvcmUgdGhlIHBhcnQgZGlyZWN0aXZlcy50ZW1wbGF0ZUltcG9ydEhpZGVzSW1wb3J0SW1wb3J0IG9mICcjbmFtZScgKGZyb20gJyN1cmknKSBoaWRlcyBpbXBvcnQgZnJvbSAnI3VyaTInLmNvZGVJbXBvcnRIaWRlc0ltcG9ydEltcG9ydEhpZGVzSW1wb3J0dGVtcGxhdGVJbmNvbXBhdGlibGVSZWRpcmVjdGVlRnVuY3Rpb25UeXBlVGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHR5cGUgJyN0eXBlJyBpc24ndCBhIHN1YnR5cGUgb2YgJyN0eXBlMicuY29kZUluY29tcGF0aWJsZVJlZGlyZWN0ZWVGdW5jdGlvblR5cGVJbmNvbXBhdGlibGVSZWRpcmVjdGVlRnVuY3Rpb25UeXBlUkVESVJFQ1RfVE9fSU5WQUxJRF9UWVBFdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRUeXBlIGFyZ3VtZW50ICcjdHlwZScgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnI3R5cGUyJyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnI25hbWUnIG9uICcjbmFtZTInLlRyeSBjaGFuZ2luZyB0eXBlIGFyZ3VtZW50cyBzbyB0aGF0IHRoZXkgY29uZm9ybSB0byB0aGUgYm91bmRzLmNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJbmNvcnJlY3RUeXBlQXJndW1lbnRUWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFN0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudEluUmV0dXJuVHlwZVR5cGUgYXJndW1lbnQgJyN0eXBlJyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIGJvdW5kICcjdHlwZTInIG9mIHRoZSB0eXBlIHZhcmlhYmxlICcjbmFtZScgb24gJyNuYW1lMicgaW4gdGhlIHJldHVybiB0eXBlLmNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblJldHVyblR5cGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblJldHVyblR5cGV0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudEluU3VwZXJ0eXBlVHlwZSBhcmd1bWVudCAnI3R5cGUnIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJyN0eXBlMicgb2YgdGhlIHR5cGUgdmFyaWFibGUgJyNuYW1lJyBvbiAnI25hbWUyJyBpbiB0aGUgc3VwZXJ0eXBlICcjbmFtZTMnIG9mIGNsYXNzICcjbmFtZTQnLmNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZUluY29ycmVjdFR5cGVBcmd1bWVudEluU3VwZXJ0eXBldGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZUluZmVycmVkSW5mZXJyZWQgdHlwZSBhcmd1bWVudCAnI3R5cGUnIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJyN0eXBlMicgb2YgdGhlIHR5cGUgdmFyaWFibGUgJyNuYW1lJyBvbiAnI25hbWUyJyBpbiB0aGUgc3VwZXJ0eXBlICcjbmFtZTMnIG9mIGNsYXNzICcjbmFtZTQnLlRyeSBzcGVjaWZ5aW5nIHR5cGUgYXJndW1lbnRzIGV4cGxpY2l0bHkgc28gdGhhdCB0aGV5IGNvbmZvcm0gdG8gdGhlIGJvdW5kcy5jb2RlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGVJbmZlcnJlZEluY29ycmVjdFR5cGVBcmd1bWVudEluU3VwZXJ0eXBlSW5mZXJyZWR0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudEluZmVycmVkSW5mZXJyZWQgdHlwZSBhcmd1bWVudCAnI3R5cGUnIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJyN0eXBlMicgb2YgdGhlIHR5cGUgdmFyaWFibGUgJyNuYW1lJyBvbiAnI25hbWUyJy5jb2RlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5mZXJyZWRJbmNvcnJlY3RUeXBlQXJndW1lbnRJbmZlcnJlZHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50UXVhbGlmaWVkVHlwZSBhcmd1bWVudCAnI3R5cGUnIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJyN0eXBlMicgb2YgdGhlIHR5cGUgdmFyaWFibGUgJyNuYW1lJyBvbiAnI3R5cGUzLiNuYW1lMicuY29kZUluY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZEluY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50UXVhbGlmaWVkSW5mZXJyZWRJbmZlcnJlZCB0eXBlIGFyZ3VtZW50ICcjdHlwZScgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnI3R5cGUyJyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnI25hbWUnIG9uICcjdHlwZTMuI25hbWUyJy5jb2RlSW5jb3JyZWN0VHlwZUFyZ3VtZW50UXVhbGlmaWVkSW5mZXJyZWRJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWRJbmZlcnJlZGNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnRWYXJpYWJsZW1lc3NhZ2VJbmNvcnJlY3RUeXBlQXJndW1lbnRWYXJpYWJsZUluY29ycmVjdFR5cGVBcmd1bWVudFZhcmlhYmxlVGhpcyBpcyB0aGUgdHlwZSB2YXJpYWJsZSB3aG9zZSBib3VuZCBpc24ndCBjb25mb3JtZWQgdG8udGVtcGxhdGVJbmZlcnJlZFBhY2thZ2VVcmlJbnRlcnByZXRpbmcgdGhpcyBhcyBwYWNrYWdlIFVSSSwgJyN1cmknLmNvZGVJbmZlcnJlZFBhY2thZ2VVcmlJbmZlcnJlZFBhY2thZ2VVcmljb2RlSW5oZXJpdGVkTWVtYmVyc0NvbmZsaWN0bWVzc2FnZUluaGVyaXRlZE1lbWJlcnNDb25mbGljdEluaGVyaXRlZE1lbWJlcnNDb25mbGljdENPTkZMSUNUU19XSVRIX0lOSEVSSVRFRF9NRU1CRVJDYW4ndCBpbmhlcml0IG1lbWJlcnMgdGhhdCBjb25mbGljdCB3aXRoIGVhY2ggb3RoZXIuY29kZUluaGVyaXRlZE1lbWJlcnNDb25mbGljdENhdXNlMW1lc3NhZ2VJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3RDYXVzZTFJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3RDYXVzZTFUaGlzIGlzIG9uZSBpbmhlcml0ZWQgbWVtYmVyLmNvZGVJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3RDYXVzZTJtZXNzYWdlSW5oZXJpdGVkTWVtYmVyc0NvbmZsaWN0Q2F1c2UySW5oZXJpdGVkTWVtYmVyc0NvbmZsaWN0Q2F1c2UyVGhpcyBpcyB0aGUgb3RoZXIgaW5oZXJpdGVkIG1lbWJlci50ZW1wbGF0ZUluaXRpYWxpemVGcm9tRGlsbE5vdFNlbGZDb250YWluZWRUcmllZCB0byBpbml0aWFsaXplIGZyb20gYSBwcmV2aW91cyBjb21waWxhdGlvbiAoI3N0cmluZyksIGJ1dCB0aGUgZmlsZSB3YXMgbm90IHNlbGYtY29udGFpbmVkLiBUaGlzIG1pZ2h0IGJlIGEgYnVnLgoKVGhlIERhcnQgdGVhbSB3b3VsZCBncmVhdGx5IGFwcHJlY2lhdGUgaXQgaWYgeW91IHdvdWxkIHRha2UgYSBtb21lbnQgdG8gcmVwb3J0IHRoaXMgcHJvYmxlbSBhdCBodHRwOi8vZGFydGJ1Zy5jb20vbmV3LgpJZiB5b3UgYXJlIGNvbWZvcnRhYmxlIHdpdGggaXQsIGl0IHdvdWxkIGltcHJvdmUgdGhlIGNoYW5jZXMgb2YgZml4aW5nIGFueSBidWcgaWYgeW91IGluY2x1ZGVkIHRoZSBmaWxlICN1cmkgaW4geW91ciBlcnJvciByZXBvcnQsIGJ1dCBiZSBhd2FyZSB0aGF0IHRoaXMgZmlsZSBpbmNsdWRlcyB5b3VyIHNvdXJjZSBjb2RlLgpFaXRoZXIgd2F5LCB5b3Ugc2hvdWxkIHByb2JhYmx5IGRlbGV0ZSB0aGUgZmlsZSBzbyBpdCBkb2Vzbid0IHVzZSB1bm5lY2Vzc2FyeSBkaXNrIHNwYWNlLmNvZGVJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkSW5pdGlhbGl6ZUZyb21EaWxsTm90U2VsZkNvbnRhaW5lZHRlbXBsYXRlSW5pdGlhbGl6ZUZyb21EaWxsTm90U2VsZkNvbnRhaW5lZE5vRHVtcFRyaWVkIHRvIGluaXRpYWxpemUgZnJvbSBhIHByZXZpb3VzIGNvbXBpbGF0aW9uICgjc3RyaW5nKSwgYnV0IHRoZSBmaWxlIHdhcyBub3Qgc2VsZi1jb250YWluZWQuIFRoaXMgbWlnaHQgYmUgYSBidWcuCgpUaGUgRGFydCB0ZWFtIHdvdWxkIGdyZWF0bHkgYXBwcmVjaWF0ZSBpdCBpZiB5b3Ugd291bGQgdGFrZSBhIG1vbWVudCB0byByZXBvcnQgdGhpcyBwcm9ibGVtIGF0IGh0dHA6Ly9kYXJ0YnVnLmNvbS9uZXcuY29kZUluaXRpYWxpemVGcm9tRGlsbE5vdFNlbGZDb250YWluZWROb0R1bXBJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkTm9EdW1wdGVtcGxhdGVJbml0aWFsaXplRnJvbURpbGxVbmtub3duUHJvYmxlbVRyaWVkIHRvIGluaXRpYWxpemUgZnJvbSBhIHByZXZpb3VzIGNvbXBpbGF0aW9uICgjc3RyaW5nKSwgYnV0IGNvdWxkbid0LgpFcnJvciBtZXNzYWdlIHdhcyAnI3N0cmluZzInLgpTdGFja3RyYWNlIGluY2x1ZGVkICcjc3RyaW5nMycuClRoaXMgbWlnaHQgYmUgYSBidWcuCgpUaGUgRGFydCB0ZWFtIHdvdWxkIGdyZWF0bHkgYXBwcmVjaWF0ZSBpdCBpZiB5b3Ugd291bGQgdGFrZSBhIG1vbWVudCB0byByZXBvcnQgdGhpcyBwcm9ibGVtIGF0IGh0dHA6Ly9kYXJ0YnVnLmNvbS9uZXcuCklmIHlvdSBhcmUgY29tZm9ydGFibGUgd2l0aCBpdCwgaXQgd291bGQgaW1wcm92ZSB0aGUgY2hhbmNlcyBvZiBmaXhpbmcgYW55IGJ1ZyBpZiB5b3UgaW5jbHVkZWQgdGhlIGZpbGUgI3VyaSBpbiB5b3VyIGVycm9yIHJlcG9ydCwgYnV0IGJlIGF3YXJlIHRoYXQgdGhpcyBmaWxlIGluY2x1ZGVzIHlvdXIgc291cmNlIGNvZGUuCkVpdGhlciB3YXksIHlvdSBzaG91bGQgcHJvYmFibHkgZGVsZXRlIHRoZSBmaWxlIHNvIGl0IGRvZXNuJ3QgdXNlIHVubmVjZXNzYXJ5IGRpc2sgc3BhY2UuY29kZUluaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW10ZW1wbGF0ZUluaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtTm9EdW1wVHJpZWQgdG8gaW5pdGlhbGl6ZSBmcm9tIGEgcHJldmlvdXMgY29tcGlsYXRpb24gKCNzdHJpbmcpLCBidXQgY291bGRuJ3QuCkVycm9yIG1lc3NhZ2Ugd2FzICcjc3RyaW5nMicuClN0YWNrdHJhY2UgaW5jbHVkZWQgJyNzdHJpbmczJy4KVGhpcyBtaWdodCBiZSBhIGJ1Zy4KClRoZSBEYXJ0IHRlYW0gd291bGQgZ3JlYXRseSBhcHByZWNpYXRlIGl0IGlmIHlvdSB3b3VsZCB0YWtlIGEgbW9tZW50IHRvIHJlcG9ydCB0aGlzIHByb2JsZW0gYXQgaHR0cDovL2RhcnRidWcuY29tL25ldy5jb2RlSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW1Ob0R1bXBJbml0aWFsaXplRnJvbURpbGxVbmtub3duUHJvYmxlbU5vRHVtcGNvZGVJbml0aWFsaXplZFZhcmlhYmxlSW5Gb3JFYWNobWVzc2FnZUluaXRpYWxpemVkVmFyaWFibGVJbkZvckVhY2hJbml0aWFsaXplZFZhcmlhYmxlSW5Gb3JFYWNoVGhlIGxvb3AgdmFyaWFibGUgaW4gYSBmb3ItZWFjaCBsb29wIGNhbid0IGJlIGluaXRpYWxpemVkLlRyeSByZW1vdmluZyB0aGUgaW5pdGlhbGl6ZXIsIG9yIHVzaW5nIGEgZGlmZmVyZW50IGtpbmQgb2YgbG9vcC50ZW1wbGF0ZUluaXRpYWxpemVyRm9yU3RhdGljRmllbGQnI25hbWUnIGlzbid0IGFuIGluc3RhbmNlIGZpZWxkIG9mIHRoaXMgY2xhc3MuY29kZUluaXRpYWxpemVyRm9yU3RhdGljRmllbGRJbml0aWFsaXplckZvclN0YXRpY0ZpZWxkSU5JVElBTElaRVJfRk9SX1NUQVRJQ19GSUVMRHRlbXBsYXRlSW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3JPbmx5IGNvbnN0cnVjdG9ycyBjYW4gaGF2ZSBpbml0aWFsaXplcnMsIGFuZCAnI25hbWUnIGlzIG5vdCBhIGNvbnN0cnVjdG9yLmNvZGVJbml0aWFsaXplck91dHNpZGVDb25zdHJ1Y3RvckluaXRpYWxpemVyT3V0c2lkZUNvbnN0cnVjdG9ySU5JVElBTElaRVJfT1VUU0lERV9DT05TVFJVQ1RPUnRlbXBsYXRlSW5pdGlhbGl6aW5nRm9ybWFsVHlwZU1pc21hdGNoVGhlIHR5cGUgb2YgcGFyYW1ldGVyICcjbmFtZScsICcjdHlwZScgaXMgbm90IGEgc3VidHlwZSBvZiB0aGUgY29ycmVzcG9uZGluZyBmaWVsZCdzIHR5cGUsICcjdHlwZTInLlRyeSBjaGFuZ2luZyB0aGUgdHlwZSBvZiBwYXJhbWV0ZXIgJyNuYW1lJyB0byBhIHN1YnR5cGUgb2YgJyN0eXBlMicuY29kZUluaXRpYWxpemluZ0Zvcm1hbFR5cGVNaXNtYXRjaEluaXRpYWxpemluZ0Zvcm1hbFR5cGVNaXNtYXRjaElOVkFMSURfUEFSQU1FVEVSX0RFQ0xBUkFUSU9OY29kZUluaXRpYWxpemluZ0Zvcm1hbFR5cGVNaXNtYXRjaEZpZWxkbWVzc2FnZUluaXRpYWxpemluZ0Zvcm1hbFR5cGVNaXNtYXRjaEZpZWxkSW5pdGlhbGl6aW5nRm9ybWFsVHlwZU1pc21hdGNoRmllbGRUaGUgZmllbGQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgcGFyYW1ldGVyLklucHV0IGZpbGUgbm90IGZvdW5kOiAjdXJpLmNvZGVJbnB1dEZpbGVOb3RGb3VuZElucHV0RmlsZU5vdEZvdW5kdGVtcGxhdGVJbnRlZ2VyTGl0ZXJhbElzT3V0T2ZSYW5nZVRoZSBpbnRlZ2VyIGxpdGVyYWwgI3N0cmluZyBjYW4ndCBiZSByZXByZXNlbnRlZCBpbiA2NCBiaXRzLlRyeSB1c2luZyB0aGUgQmlnSW50IGNsYXNzIGlmIHlvdSBuZWVkIGFuIGludGVnZXIgbGFyZ2VyIHRoYW4gOSwyMjMsMzcyLDAzNiw4NTQsNzc1LDgwNyBvciBsZXNzIHRoYW4gLTksMjIzLDM3MiwwMzYsODU0LDc3NSw4MDguY29kZUludGVnZXJMaXRlcmFsSXNPdXRPZlJhbmdlSW50ZWdlckxpdGVyYWxJc091dE9mUmFuZ2VJTlRFR0VSX0xJVEVSQUxfT1VUX09GX1JBTkdFdGVtcGxhdGVJbnRlcmZhY2VDaGVja0NvbnRleHRCb3RoIG1lbWJlcnMgYXJlIGluaGVyaXRlZCBieSB0aGUgbm9uLWFic3RyYWN0IGNsYXNzICcjbmFtZScuY29kZUludGVyZmFjZUNoZWNrQ29udGV4dEludGVyZmFjZUNoZWNrQ29udGV4dGNvZGVJbnRlcm5hbFByb2JsZW1BbHJlYWR5SW5pdGlhbGl6ZWRtZXNzYWdlSW50ZXJuYWxQcm9ibGVtQWxyZWFkeUluaXRpYWxpemVkSW50ZXJuYWxQcm9ibGVtQWxyZWFkeUluaXRpYWxpemVkQXR0ZW1wdCB0byBzZXQgaW5pdGlhbGl6ZXIgb24gZmllbGQgd2l0aG91dCBpbml0aWFsaXplci5jb2RlSW50ZXJuYWxQcm9ibGVtQm9keU9uQWJzdHJhY3RNZXRob2RtZXNzYWdlSW50ZXJuYWxQcm9ibGVtQm9keU9uQWJzdHJhY3RNZXRob2RJbnRlcm5hbFByb2JsZW1Cb2R5T25BYnN0cmFjdE1ldGhvZEF0dGVtcHRpbmcgdG8gc2V0IGJvZHkgb24gYWJzdHJhY3QgbWV0aG9kLnRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtQ29uc3RydWN0b3JOb3RGb3VuZE5vIGNvbnN0cnVjdG9yIG5hbWVkICcjbmFtZScgaW4gJyN1cmknLmNvZGVJbnRlcm5hbFByb2JsZW1Db25zdHJ1Y3Rvck5vdEZvdW5kSW50ZXJuYWxQcm9ibGVtQ29uc3RydWN0b3JOb3RGb3VuZHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtQ29udGV4dFNldmVyaXR5Tm9uLWNvbnRleHQgbWVzc2FnZSBoYXMgY29udGV4dCBzZXZlcml0eTogI3N0cmluZ2NvZGVJbnRlcm5hbFByb2JsZW1Db250ZXh0U2V2ZXJpdHlJbnRlcm5hbFByb2JsZW1Db250ZXh0U2V2ZXJpdHl0ZW1wbGF0ZUludGVybmFsUHJvYmxlbURlYnVnQWJvcnRDb21waWxhdGlvbiBhYm9ydGVkIGR1ZSB0byBmYXRhbCAnI25hbWUnIGF0Ogojc3RyaW5nY29kZUludGVybmFsUHJvYmxlbURlYnVnQWJvcnRJbnRlcm5hbFByb2JsZW1EZWJ1Z0Fib3J0Y29kZUludGVybmFsUHJvYmxlbUV4dGVuZGluZ1VubW9kaWZpYWJsZVNjb3BlbWVzc2FnZUludGVybmFsUHJvYmxlbUV4dGVuZGluZ1VubW9kaWZpYWJsZVNjb3BlSW50ZXJuYWxQcm9ibGVtRXh0ZW5kaW5nVW5tb2RpZmlhYmxlU2NvcGVDYW4ndCBleHRlbmQgYW4gdW5tb2RpZmlhYmxlIHNjb3BlLmNvZGVJbnRlcm5hbFByb2JsZW1MYWJlbFVzYWdlSW5WYXJpYWJsZXNEZWNsYXJhdGlvbm1lc3NhZ2VJbnRlcm5hbFByb2JsZW1MYWJlbFVzYWdlSW5WYXJpYWJsZXNEZWNsYXJhdGlvbkludGVybmFsUHJvYmxlbUxhYmVsVXNhZ2VJblZhcmlhYmxlc0RlY2xhcmF0aW9uVW5leHBlY3RlZCB1c2FnZSBvZiBsYWJlbCBpbnNpZGUgZGVjbGFyYXRpb24gb2YgdmFyaWFibGVzLmNvZGVJbnRlcm5hbFByb2JsZW1NaXNzaW5nQ29udGV4dEludGVybmFsUHJvYmxlbU1pc3NpbmdDb250ZXh0Q29tcGlsZXIgY2Fubm90IHJ1biB3aXRob3V0IGEgY29tcGlsZXIgY29udGV4dC5BcmUgY2FsbHMgdG8gdGhlIGNvbXBpbGVyIHdyYXBwZWQgaW4gQ29tcGlsZXJDb250ZXh0LnJ1bkluQ29udGV4dD90ZW1wbGF0ZUludGVybmFsUHJvYmxlbU5vSW5mZXJyZWRUeXBlU3RvcmVkVGhlcmUncyBubyBpbmZlcnJlZCB0eXBlIGZvciAnI25hbWUnLmNvZGVJbnRlcm5hbFByb2JsZW1Ob0luZmVycmVkVHlwZVN0b3JlZEludGVybmFsUHJvYmxlbU5vSW5mZXJyZWRUeXBlU3RvcmVkdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZENvdWxkbid0IGZpbmQgJyNuYW1lJy5jb2RlSW50ZXJuYWxQcm9ibGVtTm90Rm91bmRJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtTm90Rm91bmRJbkNvdWxkbid0IGZpbmQgJyNuYW1lJyBpbiAnI25hbWUyJy5jb2RlSW50ZXJuYWxQcm9ibGVtTm90Rm91bmRJbkludGVybmFsUHJvYmxlbU5vdEZvdW5kSW5jb2RlSW50ZXJuYWxQcm9ibGVtUHJldmlvdXNUb2tlbk5vdEZvdW5kbWVzc2FnZUludGVybmFsUHJvYmxlbVByZXZpb3VzVG9rZW5Ob3RGb3VuZEludGVybmFsUHJvYmxlbVByZXZpb3VzVG9rZW5Ob3RGb3VuZENvdWxkbid0IGZpbmQgcHJldmlvdXMgdG9rZW4udGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Qcml2YXRlQ29uc3RydWN0b3JBY2Nlc3NDYW4ndCBhY2Nlc3MgcHJpdmF0ZSBjb25zdHJ1Y3RvciAnI25hbWUnLmNvZGVJbnRlcm5hbFByb2JsZW1Qcml2YXRlQ29uc3RydWN0b3JBY2Nlc3NJbnRlcm5hbFByb2JsZW1Qcml2YXRlQ29uc3RydWN0b3JBY2Nlc3Njb2RlSW50ZXJuYWxQcm9ibGVtUHJvdmlkZWRCb3RoQ29tcGlsZVNka0FuZFNka1N1bW1hcnlJbnRlcm5hbFByb2JsZW1Qcm92aWRlZEJvdGhDb21waWxlU2RrQW5kU2RrU3VtbWFyeVRoZSBjb21waWxlU2RrIGFuZCBzZGtTdW1tYXJ5IG9wdGlvbnMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZXRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtU3RhY2tOb3RFbXB0eSNuYW1lLnN0YWNrIGlzbid0IGVtcHR5OgogICNzdHJpbmdjb2RlSW50ZXJuYWxQcm9ibGVtU3RhY2tOb3RFbXB0eUludGVybmFsUHJvYmxlbVN0YWNrTm90RW1wdHl0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVN0b3JpbmdNdWx0aXBsZUluZmVycmVkVHlwZXNUaGVyZSdzIGFscmVhZHkgYW4gaW5mZXJyZWQgdHlwZSwgJyN0eXBlJywgZm9yICcjbmFtZScuY29kZUludGVybmFsUHJvYmxlbVN0b3JpbmdNdWx0aXBsZUluZmVycmVkVHlwZXNJbnRlcm5hbFByb2JsZW1TdG9yaW5nTXVsdGlwbGVJbmZlcnJlZFR5cGVzdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmV4cGVjdGVkRXhwZWN0ZWQgJyNzdHJpbmcnLCBidXQgZ290ICcjc3RyaW5nMicuY29kZUludGVybmFsUHJvYmxlbVVuZXhwZWN0ZWRJbnRlcm5hbFByb2JsZW1VbmV4cGVjdGVkdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmhhbmRsZWRVbmhhbmRsZWQgI3N0cmluZyBpbiAjc3RyaW5nMi5jb2RlSW50ZXJuYWxQcm9ibGVtVW5oYW5kbGVkSW50ZXJuYWxQcm9ibGVtVW5oYW5kbGVkdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmltcGxlbWVudGVkVW5pbXBsZW1lbnRlZCAjc3RyaW5nLmNvZGVJbnRlcm5hbFByb2JsZW1VbmltcGxlbWVudGVkSW50ZXJuYWxQcm9ibGVtVW5pbXBsZW1lbnRlZFVuc3VwcG9ydGVkIG9wZXJhdGlvbjogJyNuYW1lJy5jb2RlSW50ZXJuYWxQcm9ibGVtVW5zdXBwb3J0ZWRJbnRlcm5hbFByb2JsZW1VbnN1cHBvcnRlZHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVXJpTWlzc2luZ1NjaGVtZVRoZSBVUkkgJyN1cmknIGhhcyBubyBzY2hlbWUuY29kZUludGVybmFsUHJvYmxlbVVyaU1pc3NpbmdTY2hlbWVJbnRlcm5hbFByb2JsZW1VcmlNaXNzaW5nU2NoZW1ldGVtcGxhdGVJbnRlcm5hbFByb2JsZW1WZXJpZmljYXRpb25FcnJvclZlcmlmaWNhdGlvbiBvZiB0aGUgZ2VuZXJhdGVkIHByb2dyYW0gZmFpbGVkOgojc3RyaW5nY29kZUludGVybmFsUHJvYmxlbVZlcmlmaWNhdGlvbkVycm9ySW50ZXJuYWxQcm9ibGVtVmVyaWZpY2F0aW9uRXJyb3Jjb2RlSW50ZXJwb2xhdGlvbkluVXJpbWVzc2FnZUludGVycG9sYXRpb25JblVyaUludGVycG9sYXRpb25JblVyaUlOVkFMSURfTElURVJBTF9JTl9DT05GSUdVUkFUSU9OQ2FuJ3QgdXNlIHN0cmluZyBpbnRlcnBvbGF0aW9uIGluIGEgVVJJLnRlbXBsYXRlSW50ZXJzZWN0aW9uVHlwZUFzVHlwZUFyZ3VtZW50Q2FuJ3QgaW5mZXIgYSB0eXBlIGZvciAnI25hbWUnLCBpdCBjYW4gYmUgZWl0aGVyICcjdHlwZScgb3IgJyN0eXBlMicuVHJ5IGFkZGluZyBhIHR5cGUgYXJndW1lbnQgc2VsZWN0aW5nIG9uZSBvZiB0aGUgb3B0aW9ucy5jb2RlSW50ZXJzZWN0aW9uVHlwZUFzVHlwZUFyZ3VtZW50SW50ZXJzZWN0aW9uVHlwZUFzVHlwZUFyZ3VtZW50dGVtcGxhdGVJbnZhbGlkQXNzaWdubWVudFRyeSBjaGFuZ2luZyB0aGUgdHlwZSBvZiB0aGUgbGVmdCBoYW5kIHNpZGUsIG9yIGNhc3RpbmcgdGhlIHJpZ2h0IGhhbmQgc2lkZSB0byAnI3R5cGUyJy5jb2RlSW52YWxpZEFzc2lnbm1lbnRJbnZhbGlkQXNzaWdubWVudElOVkFMSURfQVNTSUdOTUVOVGNvZGVJbnZhbGlkQXdhaXRGb3JtZXNzYWdlSW52YWxpZEF3YWl0Rm9ySW52YWxpZEF3YWl0Rm9yVGhlIGtleXdvcmQgJ2F3YWl0JyBpc24ndCBhbGxvd2VkIGZvciBhIG5vcm1hbCAnZm9yJyBzdGF0ZW1lbnQuVHJ5IHJlbW92aW5nIHRoZSBrZXl3b3JkLCBvciB1c2UgYSBmb3ItZWFjaCBzdGF0ZW1lbnQudGVtcGxhdGVJbnZhbGlkQnJlYWtUYXJnZXRDYW4ndCBicmVhayB0byAnI25hbWUnLmNvZGVJbnZhbGlkQnJlYWtUYXJnZXRJbnZhbGlkQnJlYWtUYXJnZXR0ZW1wbGF0ZUludmFsaWRDYXN0RnVuY3Rpb25FeHByVGhlIGZ1bmN0aW9uIGV4cHJlc3Npb24gdHlwZSAnI3R5cGUnIGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJyN0eXBlMicuQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbiBleHByZXNzaW9uIG9yIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIHVzZWQuY29kZUludmFsaWRDYXN0RnVuY3Rpb25FeHBySW52YWxpZENhc3RGdW5jdGlvbkV4cHJJTlZBTElEX0NBU1RfRlVOQ1RJT05fRVhQUnRlbXBsYXRlSW52YWxpZENhc3RMaXRlcmFsTGlzdFRoZSBsaXN0IGxpdGVyYWwgdHlwZSAnI3R5cGUnIGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJyN0eXBlMicuQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBsaXN0IGxpdGVyYWwgb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC5jb2RlSW52YWxpZENhc3RMaXRlcmFsTGlzdEludmFsaWRDYXN0TGl0ZXJhbExpc3RJTlZBTElEX0NBU1RfTElURVJBTF9MSVNUdGVtcGxhdGVJbnZhbGlkQ2FzdExpdGVyYWxNYXBUaGUgbWFwIGxpdGVyYWwgdHlwZSAnI3R5cGUnIGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJyN0eXBlMicuQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBtYXAgbGl0ZXJhbCBvciB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyB1c2VkLmNvZGVJbnZhbGlkQ2FzdExpdGVyYWxNYXBJbnZhbGlkQ2FzdExpdGVyYWxNYXBJTlZBTElEX0NBU1RfTElURVJBTF9NQVB0ZW1wbGF0ZUludmFsaWRDYXN0TGl0ZXJhbFNldFRoZSBzZXQgbGl0ZXJhbCB0eXBlICcjdHlwZScgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnI3R5cGUyJy5DaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIHNldCBsaXRlcmFsIG9yIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIHVzZWQuY29kZUludmFsaWRDYXN0TGl0ZXJhbFNldEludmFsaWRDYXN0TGl0ZXJhbFNldElOVkFMSURfQ0FTVF9MSVRFUkFMX1NFVHRlbXBsYXRlSW52YWxpZENhc3RMb2NhbEZ1bmN0aW9uVGhlIGxvY2FsIGZ1bmN0aW9uIGhhcyB0eXBlICcjdHlwZScgdGhhdCBpc24ndCBvZiBleHBlY3RlZCB0eXBlICcjdHlwZTInLkNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24gb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC5jb2RlSW52YWxpZENhc3RMb2NhbEZ1bmN0aW9uSW52YWxpZENhc3RMb2NhbEZ1bmN0aW9uSU5WQUxJRF9DQVNUX0ZVTkNUSU9OdGVtcGxhdGVJbnZhbGlkQ2FzdE5ld0V4cHJUaGUgY29uc3RydWN0b3IgcmV0dXJucyB0eXBlICcjdHlwZScgdGhhdCBpc24ndCBvZiBleHBlY3RlZCB0eXBlICcjdHlwZTInLkNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGNvbnN0cnVjdGVkIG9yIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIHVzZWQuY29kZUludmFsaWRDYXN0TmV3RXhwckludmFsaWRDYXN0TmV3RXhwcklOVkFMSURfQ0FTVF9ORVdfRVhQUnRlbXBsYXRlSW52YWxpZENhc3RTdGF0aWNNZXRob2RUaGUgc3RhdGljIG1ldGhvZCBoYXMgdHlwZSAnI3R5cGUnIHRoYXQgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnI3R5cGUyJy5DaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIG1ldGhvZCBvciB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyB1c2VkLmNvZGVJbnZhbGlkQ2FzdFN0YXRpY01ldGhvZEludmFsaWRDYXN0U3RhdGljTWV0aG9kSU5WQUxJRF9DQVNUX01FVEhPRHRlbXBsYXRlSW52YWxpZENhc3RUb3BMZXZlbEZ1bmN0aW9uVGhlIHRvcCBsZXZlbCBmdW5jdGlvbiBoYXMgdHlwZSAnI3R5cGUnIHRoYXQgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnI3R5cGUyJy5jb2RlSW52YWxpZENhc3RUb3BMZXZlbEZ1bmN0aW9uSW52YWxpZENhc3RUb3BMZXZlbEZ1bmN0aW9uY29kZUludmFsaWRDYXRjaEFyZ3VtZW50c21lc3NhZ2VJbnZhbGlkQ2F0Y2hBcmd1bWVudHNJbnZhbGlkQ2F0Y2hBcmd1bWVudHNJTlZBTElEX0NBVENIX0FSR1VNRU5UU0ludmFsaWQgY2F0Y2ggYXJndW1lbnRzLmNvZGVJbnZhbGlkQ29kZVBvaW50bWVzc2FnZUludmFsaWRDb2RlUG9pbnRJbnZhbGlkQ29kZVBvaW50SU5WQUxJRF9DT0RFX1BPSU5UVGhlIGVzY2FwZSBzZXF1ZW5jZSBzdGFydGluZyB3aXRoICdcdScgaXNuJ3QgYSB2YWxpZCBjb2RlIHBvaW50LnRlbXBsYXRlSW52YWxpZENvbnRpbnVlVGFyZ2V0Q2FuJ3QgY29udGludWUgYXQgJyNuYW1lJy5jb2RlSW52YWxpZENvbnRpbnVlVGFyZ2V0SW52YWxpZENvbnRpbnVlVGFyZ2V0Y29kZUludmFsaWRIZXhFc2NhcGVtZXNzYWdlSW52YWxpZEhleEVzY2FwZUludmFsaWRIZXhFc2NhcGVBbiBlc2NhcGUgc2VxdWVuY2Ugc3RhcnRpbmcgd2l0aCAnXHgnIG11c3QgYmUgZm9sbG93ZWQgYnkgMiBoZXhhZGVjaW1hbCBkaWdpdHMuY29kZUludmFsaWRJbml0aWFsaXplcm1lc3NhZ2VJbnZhbGlkSW5pdGlhbGl6ZXJJbnZhbGlkSW5pdGlhbGl6ZXJOb3QgYSB2YWxpZCBpbml0aWFsaXplci5UbyBpbml0aWFsaXplIGEgZmllbGQsIHVzZSB0aGUgc3ludGF4ICduYW1lID0gdmFsdWUnLmNvZGVJbnZhbGlkSW5saW5lRnVuY3Rpb25UeXBlbWVzc2FnZUludmFsaWRJbmxpbmVGdW5jdGlvblR5cGVJbnZhbGlkSW5saW5lRnVuY3Rpb25UeXBlSU5WQUxJRF9JTkxJTkVfRlVOQ1RJT05fVFlQRUlubGluZSBmdW5jdGlvbiB0eXBlcyBjYW5ub3QgYmUgdXNlZCBmb3IgcGFyYW1ldGVycyBpbiBhIGdlbmVyaWMgZnVuY3Rpb24gdHlwZS5UcnkgY2hhbmdpbmcgdGhlIGlubGluZSBmdW5jdGlvbiB0eXBlIChhcyBpbiAnaW50IGYoKScpIHRvIGEgcHJlZml4ZWQgZnVuY3Rpb24gdHlwZSB1c2luZyB0aGUgYEZ1bmN0aW9uYCBrZXl3b3JkIChhcyBpbiAnaW50IEZ1bmN0aW9uKCkgZicpLnRlbXBsYXRlSW52YWxpZE9wZXJhdG9yVGhlIHN0cmluZyAnI2xleGVtZScgaXNuJ3QgYSB1c2VyLWRlZmluYWJsZSBvcGVyYXRvci5jb2RlSW52YWxpZE9wZXJhdG9ySW52YWxpZE9wZXJhdG9ydGVtcGxhdGVJbnZhbGlkUGFja2FnZVVyaUludmFsaWQgcGFja2FnZSBVUkkgJyN1cmknOgogICNzdHJpbmcuY29kZUludmFsaWRQYWNrYWdlVXJpSW52YWxpZFBhY2thZ2VVcmljb2RlSW52YWxpZFN1cGVySW5Jbml0aWFsaXplcm1lc3NhZ2VJbnZhbGlkU3VwZXJJbkluaXRpYWxpemVySW52YWxpZFN1cGVySW5Jbml0aWFsaXplckNhbiBvbmx5IHVzZSAnc3VwZXInIGluIGFuIGluaXRpYWxpemVyIGZvciBjYWxsaW5nIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yIChlLmcuICdzdXBlcigpJyBvciAnc3VwZXIubmFtZWRDb25zdHJ1Y3RvcigpJyljb2RlSW52YWxpZFN5bmNNb2RpZmllcm1lc3NhZ2VJbnZhbGlkU3luY01vZGlmaWVySW52YWxpZFN5bmNNb2RpZmllck1JU1NJTkdfU1RBUl9BRlRFUl9TWU5DSW52YWxpZCBtb2RpZmllciAnc3luYycuVHJ5IHJlcGxhY2luZyAnc3luYycgd2l0aCAnc3luYyonLmNvZGVJbnZhbGlkVGhpc0luSW5pdGlhbGl6ZXJtZXNzYWdlSW52YWxpZFRoaXNJbkluaXRpYWxpemVySW52YWxpZFRoaXNJbkluaXRpYWxpemVyQ2FuIG9ubHkgdXNlICd0aGlzJyBpbiBhbiBpbml0aWFsaXplciBmb3IgZmllbGQgaW5pdGlhbGl6YXRpb24gKGUuZy4gJ3RoaXMueCA9IHNvbWV0aGluZycpIGFuZCBjb25zdHJ1Y3RvciByZWRpcmVjdGlvbiAoZS5nLiAndGhpcygpJyBvciAndGhpcy5uYW1lZENvbnN0cnVjdG9yKCkpY29kZUludmFsaWRVbmljb2RlRXNjYXBlbWVzc2FnZUludmFsaWRVbmljb2RlRXNjYXBlSW52YWxpZFVuaWNvZGVFc2NhcGVBbiBlc2NhcGUgc2VxdWVuY2Ugc3RhcnRpbmcgd2l0aCAnXHUnIG11c3QgYmUgZm9sbG93ZWQgYnkgNCBoZXhhZGVjaW1hbCBkaWdpdHMgb3IgZnJvbSAxIHRvIDYgZGlnaXRzIGJldHdlZW4gJ3snIGFuZCAnfScuY29kZUludmFsaWRVc2VPZk51bGxBd2FyZUFjY2Vzc21lc3NhZ2VJbnZhbGlkVXNlT2ZOdWxsQXdhcmVBY2Nlc3NJbnZhbGlkVXNlT2ZOdWxsQXdhcmVBY2Nlc3NJTlZBTElEX1VTRV9PRl9OVUxMX0FXQVJFX0FDQ0VTU0Nhbm5vdCB1c2UgJz8uJyBoZXJlLlRyeSB1c2luZyAnLicuY29kZUludmFsaWRWb2lkbWVzc2FnZUludmFsaWRWb2lkSW52YWxpZFZvaWRUeXBlICd2b2lkJyBjYW4ndCBiZSB1c2VkIGhlcmUgYmVjYXVzZSBpdCBpc24ndCBhIHJldHVybiB0eXBlLlRyeSByZW1vdmluZyAndm9pZCcga2V5d29yZCBvciByZXBsYWNlIGl0IHdpdGggJ3ZhcicsICdmaW5hbCcsIG9yIGEgdHlwZS50ZW1wbGF0ZUludm9rZU5vbkZ1bmN0aW9uJyNuYW1lJyBpc24ndCBhIGZ1bmN0aW9uIG9yIG1ldGhvZCBhbmQgY2FuJ3QgYmUgaW52b2tlZC5jb2RlSW52b2tlTm9uRnVuY3Rpb25JbnZva2VOb25GdW5jdGlvbklOVk9DQVRJT05fT0ZfTk9OX0ZVTkNUSU9OdGVtcGxhdGVMYWJlbE5vdEZvdW5kQ2FuJ3QgZmluZCBsYWJlbCAnI25hbWUnLlRyeSBkZWZpbmluZyB0aGUgbGFiZWwsIG9yIGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gbWF0Y2ggYW4gZXhpc3RpbmcgbGFiZWwuY29kZUxhYmVsTm90Rm91bmRMYWJlbE5vdEZvdW5kY29kZUxpYnJhcnlEaXJlY3RpdmVOb3RGaXJzdG1lc3NhZ2VMaWJyYXJ5RGlyZWN0aXZlTm90Rmlyc3RMaWJyYXJ5RGlyZWN0aXZlTm90Rmlyc3RUaGUgbGlicmFyeSBkaXJlY3RpdmUgbXVzdCBhcHBlYXIgYmVmb3JlIGFsbCBvdGhlciBkaXJlY3RpdmVzLlRyeSBtb3ZpbmcgdGhlIGxpYnJhcnkgZGlyZWN0aXZlIGJlZm9yZSBhbnkgb3RoZXIgZGlyZWN0aXZlcy5jb2RlTGlzdExpdGVyYWxUb29NYW55VHlwZUFyZ3VtZW50c21lc3NhZ2VMaXN0TGl0ZXJhbFRvb01hbnlUeXBlQXJndW1lbnRzTGlzdExpdGVyYWxUb29NYW55VHlwZUFyZ3VtZW50c0VYUEVDVEVEX09ORV9MSVNUX1RZUEVfQVJHVU1FTlRTTGlzdCBsaXRlcmFsIHJlcXVpcmVzIGV4YWN0bHkgb25lIHR5cGUgYXJndW1lbnQudGVtcGxhdGVMb2FkTGlicmFyeUhpZGVzTWVtYmVyVGhlIGxpYnJhcnkgJyN1cmknIGRlZmluZXMgYSB0b3AtbGV2ZWwgbWVtYmVyIG5hbWVkICdsb2FkTGlicmFyeScuIFRoaXMgbWVtYmVyIGlzIGhpZGRlbiBieSB0aGUgc3BlY2lhbCBtZW1iZXIgJ2xvYWRMaWJyYXJ5JyB0aGF0IHRoZSBsYW5ndWFnZSBhZGRzIHRvIHN1cHBvcnQgZGVmZXJyZWQgbG9hZGluZy5UcnkgdG8gcmVuYW1lIG9yIGhpZGUgdGhlIG1lbWJlci5jb2RlTG9hZExpYnJhcnlIaWRlc01lbWJlckxvYWRMaWJyYXJ5SGlkZXNNZW1iZXJjb2RlTG9hZExpYnJhcnlUYWtlc05vQXJndW1lbnRzbWVzc2FnZUxvYWRMaWJyYXJ5VGFrZXNOb0FyZ3VtZW50c0xvYWRMaWJyYXJ5VGFrZXNOb0FyZ3VtZW50c0xPQURfTElCUkFSWV9UQUtFU19OT19BUkdVTUVOVFMnbG9hZExpYnJhcnknIHRha2VzIG5vIGFyZ3VtZW50cy50ZW1wbGF0ZUxvY2FsRGVmaW5pdGlvbkhpZGVzRXhwb3J0TG9jYWwgZGVmaW5pdGlvbiBvZiAnI25hbWUnIGhpZGVzIGV4cG9ydCBmcm9tICcjdXJpJy5jb2RlTG9jYWxEZWZpbml0aW9uSGlkZXNFeHBvcnRMb2NhbERlZmluaXRpb25IaWRlc0V4cG9ydHRlbXBsYXRlTG9jYWxEZWZpbml0aW9uSGlkZXNJbXBvcnRMb2NhbCBkZWZpbml0aW9uIG9mICcjbmFtZScgaGlkZXMgaW1wb3J0IGZyb20gJyN1cmknLmNvZGVMb2NhbERlZmluaXRpb25IaWRlc0ltcG9ydExvY2FsRGVmaW5pdGlvbkhpZGVzSW1wb3J0Y29kZU1hcExpdGVyYWxUeXBlQXJndW1lbnRNaXNtYXRjaG1lc3NhZ2VNYXBMaXRlcmFsVHlwZUFyZ3VtZW50TWlzbWF0Y2hNYXBMaXRlcmFsVHlwZUFyZ3VtZW50TWlzbWF0Y2hFWFBFQ1RFRF9UV09fTUFQX1RZUEVfQVJHVU1FTlRTQSBtYXAgbGl0ZXJhbCByZXF1aXJlcyBleGFjdGx5IHR3byB0eXBlIGFyZ3VtZW50cy5jb2RlTWVtYmVyV2l0aFNhbWVOYW1lQXNDbGFzc21lc3NhZ2VNZW1iZXJXaXRoU2FtZU5hbWVBc0NsYXNzTWVtYmVyV2l0aFNhbWVOYW1lQXNDbGFzc0EgY2xhc3MgbWVtYmVyIGNhbid0IGhhdmUgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZW5jbG9zaW5nIGNsYXNzLmNvZGVNZXRhZGF0YVR5cGVBcmd1bWVudHNtZXNzYWdlTWV0YWRhdGFUeXBlQXJndW1lbnRzTWV0YWRhdGFUeXBlQXJndW1lbnRzQU5OT1RBVElPTl9XSVRIX1RZUEVfQVJHVU1FTlRTQW4gYW5ub3RhdGlvbiAobWV0YWRhdGEpIGNhbid0IHVzZSB0eXBlIGFyZ3VtZW50cy50ZW1wbGF0ZU1ldGhvZE5vdEZvdW5kTWV0aG9kIG5vdCBmb3VuZDogJyNuYW1lJy5jb2RlTWV0aG9kTm90Rm91bmRNZXRob2ROb3RGb3VuZFVOREVGSU5FRF9NRVRIT0Rjb2RlTWlzc2luZ0FyZ3VtZW50TGlzdG1lc3NhZ2VNaXNzaW5nQXJndW1lbnRMaXN0TWlzc2luZ0FyZ3VtZW50TGlzdENvbnN0cnVjdG9yIGludm9jYXRpb25zIG11c3QgaGF2ZSBhbiBhcmd1bWVudCBsaXN0LmNvZGVNaXNzaW5nQXNzaWduYWJsZVNlbGVjdG9ybWVzc2FnZU1pc3NpbmdBc3NpZ25hYmxlU2VsZWN0b3JNaXNzaW5nQXNzaWduYWJsZVNlbGVjdG9yTWlzc2luZyBzZWxlY3RvciBzdWNoIGFzICcuPGlkZW50aWZpZXI+JyBvciAnWzBdJy5UcnkgYWRkaW5nIGEgc2VsZWN0b3IuY29kZU1pc3NpbmdBc3NpZ25tZW50SW5Jbml0aWFsaXplcm1lc3NhZ2VNaXNzaW5nQXNzaWdubWVudEluSW5pdGlhbGl6ZXJNaXNzaW5nQXNzaWdubWVudEluSW5pdGlhbGl6ZXJFeHBlY3RlZCBhbiBhc3NpZ25tZW50IGFmdGVyIHRoZSBmaWVsZCBuYW1lLmNvZGVNaXNzaW5nQ29uc3RGaW5hbFZhck9yVHlwZW1lc3NhZ2VNaXNzaW5nQ29uc3RGaW5hbFZhck9yVHlwZU1pc3NpbmdDb25zdEZpbmFsVmFyT3JUeXBlVmFyaWFibGVzIG11c3QgYmUgZGVjbGFyZWQgdXNpbmcgdGhlIGtleXdvcmRzICdjb25zdCcsICdmaW5hbCcsICd2YXInIG9yIGEgdHlwZSBuYW1lLlRyeSBhZGRpbmcgdGhlIG5hbWUgb2YgdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlIG9yIHRoZSBrZXl3b3JkICd2YXInLnRlbXBsYXRlTWlzc2luZ0V4cGxpY2l0VHlwZUFyZ3VtZW50c05vIHR5cGUgYXJndW1lbnRzIHByb3ZpZGVkLCAjY291bnQgcG9zc2libGUuY29kZU1pc3NpbmdFeHBsaWNpdFR5cGVBcmd1bWVudHNNaXNzaW5nRXhwbGljaXRUeXBlQXJndW1lbnRzY29kZU1pc3NpbmdFeHBvbmVudG1lc3NhZ2VNaXNzaW5nRXhwb25lbnRNaXNzaW5nRXhwb25lbnRNSVNTSU5HX0RJR0lUTnVtYmVycyBpbiBleHBvbmVudGlhbCBub3RhdGlvbiBzaG91bGQgYWx3YXlzIGNvbnRhaW4gYW4gZXhwb25lbnQgKGFuIGludGVnZXIgbnVtYmVyIHdpdGggYW4gb3B0aW9uYWwgc2lnbikuTWFrZSBzdXJlIHRoZXJlIGlzIGFuIGV4cG9uZW50LCBhbmQgcmVtb3ZlIGFueSB3aGl0ZXNwYWNlIGJlZm9yZSBpdC5jb2RlTWlzc2luZ0V4cHJlc3Npb25JblRocm93bWVzc2FnZU1pc3NpbmdFeHByZXNzaW9uSW5UaHJvd01pc3NpbmdFeHByZXNzaW9uSW5UaHJvd01pc3NpbmcgZXhwcmVzc2lvbiBhZnRlciAndGhyb3cnLkFkZCBhbiBleHByZXNzaW9uIGFmdGVyICd0aHJvdycgb3IgdXNlICdyZXRocm93JyB0byB0aHJvdyBhIGNhdWdodCBleGNlcHRpb25jb2RlTWlzc2luZ0Z1bmN0aW9uUGFyYW1ldGVyc21lc3NhZ2VNaXNzaW5nRnVuY3Rpb25QYXJhbWV0ZXJzTWlzc2luZ0Z1bmN0aW9uUGFyYW1ldGVyc01JU1NJTkdfRlVOQ1RJT05fUEFSQU1FVEVSU0EgZnVuY3Rpb24gZGVjbGFyYXRpb24gbmVlZHMgYW4gZXhwbGljaXQgbGlzdCBvZiBwYXJhbWV0ZXJzLlRyeSBhZGRpbmcgYSBwYXJhbWV0ZXIgbGlzdCB0byB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24udGVtcGxhdGVNaXNzaW5nSW1wbGVtZW50YXRpb25DYXVzZScjbmFtZScgaXMgZGVmaW5lZCBoZXJlLmNvZGVNaXNzaW5nSW1wbGVtZW50YXRpb25DYXVzZU1pc3NpbmdJbXBsZW1lbnRhdGlvbkNhdXNldGVtcGxhdGVNaXNzaW5nSW1wbGVtZW50YXRpb25Ob3RBYnN0cmFjdFRoZSBub24tYWJzdHJhY3QgY2xhc3MgJyNuYW1lJyBpcyBtaXNzaW5nIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlc2UgbWVtYmVyczoKI25hbWVzVHJ5IHRvIGVpdGhlcgogLSBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uLAogLSBpbmhlcml0IGFuIGltcGxlbWVudGF0aW9uIGZyb20gYSBzdXBlcmNsYXNzIG9yIG1peGluLAogLSBtYXJrIHRoZSBjbGFzcyBhcyBhYnN0cmFjdCwgb3IKIC0gcHJvdmlkZSBhICdub1N1Y2hNZXRob2QnIGltcGxlbWVudGF0aW9uLgpjb2RlTWlzc2luZ0ltcGxlbWVudGF0aW9uTm90QWJzdHJhY3RNaXNzaW5nSW1wbGVtZW50YXRpb25Ob3RBYnN0cmFjdENPTkNSRVRFX0NMQVNTX1dJVEhfQUJTVFJBQ1RfTUVNQkVSY29kZU1pc3NpbmdJbnB1dE1pc3NpbmdJbnB1dE5vIGlucHV0IGZpbGUgcHJvdmlkZWQgdG8gdGhlIGNvbXBpbGVyLmNvZGVNaXNzaW5nTWFpbk1pc3NpbmdNYWluTm8gJ21haW4nIG1ldGhvZCBmb3VuZC5UcnkgYWRkaW5nIGEgbWV0aG9kIG5hbWVkICdtYWluJyB0byB5b3VyIHByb2dyYW0uY29kZU1pc3NpbmdNZXRob2RQYXJhbWV0ZXJzbWVzc2FnZU1pc3NpbmdNZXRob2RQYXJhbWV0ZXJzTWlzc2luZ01ldGhvZFBhcmFtZXRlcnNNSVNTSU5HX01FVEhPRF9QQVJBTUVURVJTQSBtZXRob2QgZGVjbGFyYXRpb24gbmVlZHMgYW4gZXhwbGljaXQgbGlzdCBvZiBwYXJhbWV0ZXJzLlRyeSBhZGRpbmcgYSBwYXJhbWV0ZXIgbGlzdCB0byB0aGUgbWV0aG9kIGRlY2xhcmF0aW9uLmNvZGVNaXNzaW5nT3BlcmF0b3JLZXl3b3JkbWVzc2FnZU1pc3NpbmdPcGVyYXRvcktleXdvcmRNaXNzaW5nT3BlcmF0b3JLZXl3b3JkT3BlcmF0b3IgZGVjbGFyYXRpb25zIG11c3QgYmUgcHJlY2VkZWQgYnkgdGhlIGtleXdvcmQgJ29wZXJhdG9yJy5UcnkgYWRkaW5nIHRoZSBrZXl3b3JkICdvcGVyYXRvcicudGVtcGxhdGVNaXNzaW5nUGFydE9mQ2FuJ3QgdXNlICcjdXJpJyBhcyBhIHBhcnQsIGJlY2F1c2UgaXQgaGFzIG5vICdwYXJ0IG9mJyBkZWNsYXJhdGlvbi5jb2RlTWlzc2luZ1BhcnRPZk1pc3NpbmdQYXJ0T2ZQQVJUX09GX05PTl9QQVJUY29kZU1pc3NpbmdQcmVmaXhJbkRlZmVycmVkSW1wb3J0bWVzc2FnZU1pc3NpbmdQcmVmaXhJbkRlZmVycmVkSW1wb3J0TWlzc2luZ1ByZWZpeEluRGVmZXJyZWRJbXBvcnREZWZlcnJlZCBpbXBvcnRzIHNob3VsZCBoYXZlIGEgcHJlZml4LlRyeSBhZGRpbmcgYSBwcmVmaXggdG8gdGhlIGltcG9ydC5jb2RlTWlzc2luZ1R5cGVkZWZQYXJhbWV0ZXJzbWVzc2FnZU1pc3NpbmdUeXBlZGVmUGFyYW1ldGVyc01pc3NpbmdUeXBlZGVmUGFyYW1ldGVyc01JU1NJTkdfVFlQRURFRl9QQVJBTUVURVJTQSB0eXBlZGVmIG5lZWRzIGFuIGV4cGxpY2l0IGxpc3Qgb2YgcGFyYW1ldGVycy5UcnkgYWRkaW5nIGEgcGFyYW1ldGVyIGxpc3QgdG8gdGhlIHR5cGVkZWYudGVtcGxhdGVNaXhpbkFwcGxpY2F0aW9uSW5jb21wYXRpYmxlU3VwZXJ0eXBlJyN0eXBlJyBkb2Vzbid0IGltcGxlbWVudCAnI3R5cGUyJyBzbyBpdCBjYW4ndCBiZSB1c2VkIHdpdGggJyN0eXBlMycuY29kZU1peGluQXBwbGljYXRpb25JbmNvbXBhdGlibGVTdXBlcnR5cGVNaXhpbkFwcGxpY2F0aW9uSW5jb21wYXRpYmxlU3VwZXJ0eXBlTUlYSU5fQVBQTElDQVRJT05fTk9UX0lNUExFTUVOVEVEX0lOVEVSRkFDRXRlbXBsYXRlTWl4aW5JbmZlcmVuY2VOb01hdGNoaW5nQ2xhc3NUeXBlIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIGluZmVycmVkIGZvciB0aGUgbWl4aW4gJyNuYW1lJyBiZWNhdXNlICcjbmFtZTInIGRvZXMgbm90IGltcGxlbWVudCB0aGUgbWl4aW4ncyBzdXBlcnR5cGUgY29uc3RyYWludCAnI3R5cGUnLmNvZGVNaXhpbkluZmVyZW5jZU5vTWF0Y2hpbmdDbGFzc01peGluSW5mZXJlbmNlTm9NYXRjaGluZ0NsYXNzTUlYSU5fSU5GRVJFTkNFX05PX1BPU1NJQkxFX1NVQlNUSVRVVElPTmNvZGVNb3JlVGhhbk9uZVN1cGVyT3JUaGlzSW5pdGlhbGl6ZXJtZXNzYWdlTW9yZVRoYW5PbmVTdXBlck9yVGhpc0luaXRpYWxpemVyTW9yZVRoYW5PbmVTdXBlck9yVGhpc0luaXRpYWxpemVyU1VQRVJfSU5fUkVESVJFQ1RJTkdfQ09OU1RSVUNUT1JDYW4ndCBoYXZlIG1vcmUgdGhhbiBvbmUgJ3N1cGVyJyBvciAndGhpcycgaW5pdGlhbGl6ZXIuY29kZU11bHRpcGxlRXh0ZW5kc21lc3NhZ2VNdWx0aXBsZUV4dGVuZHNNdWx0aXBsZUV4dGVuZHNFYWNoIGNsYXNzIGRlZmluaXRpb24gY2FuIGhhdmUgYXQgbW9zdCBvbmUgZXh0ZW5kcyBjbGF1c2UuVHJ5IGNob29zaW5nIG9uZSBzdXBlcmNsYXNzIGFuZCBkZWZpbmUgeW91ciBjbGFzcyB0byBpbXBsZW1lbnQgKG9yIG1peCBpbikgdGhlIG90aGVycy5jb2RlTXVsdGlwbGVJbXBsZW1lbnRzbWVzc2FnZU11bHRpcGxlSW1wbGVtZW50c011bHRpcGxlSW1wbGVtZW50c01VTFRJUExFX0lNUExFTUVOVFNfQ0xBVVNFU0VhY2ggY2xhc3MgZGVmaW5pdGlvbiBjYW4gaGF2ZSBhdCBtb3N0IG9uZSBpbXBsZW1lbnRzIGNsYXVzZS5UcnkgY29tYmluaW5nIGFsbCBvZiB0aGUgaW1wbGVtZW50cyBjbGF1c2VzIGludG8gYSBzaW5nbGUgY2xhdXNlLmNvZGVNdWx0aXBsZUxpYnJhcnlEaXJlY3RpdmVzbWVzc2FnZU11bHRpcGxlTGlicmFyeURpcmVjdGl2ZXNNdWx0aXBsZUxpYnJhcnlEaXJlY3RpdmVzT25seSBvbmUgbGlicmFyeSBkaXJlY3RpdmUgbWF5IGJlIGRlY2xhcmVkIGluIGEgZmlsZS5UcnkgcmVtb3ZpbmcgYWxsIGJ1dCBvbmUgb2YgdGhlIGxpYnJhcnkgZGlyZWN0aXZlcy5jb2RlTXVsdGlwbGVPbkNsYXVzZXNtZXNzYWdlTXVsdGlwbGVPbkNsYXVzZXNNdWx0aXBsZU9uQ2xhdXNlc0VhY2ggbWl4aW4gZGVmaW5pdGlvbiBjYW4gaGF2ZSBhdCBtb3N0IG9uZSBvbiBjbGF1c2UuVHJ5IGNvbWJpbmluZyBhbGwgb2YgdGhlIG9uIGNsYXVzZXMgaW50byBhIHNpbmdsZSBjbGF1c2UuY29kZU11bHRpcGxlV2l0aG1lc3NhZ2VNdWx0aXBsZVdpdGhNdWx0aXBsZVdpdGhFYWNoIGNsYXNzIGRlZmluaXRpb24gY2FuIGhhdmUgYXQgbW9zdCBvbmUgd2l0aCBjbGF1c2UuVHJ5IGNvbWJpbmluZyBhbGwgb2YgdGhlIHdpdGggY2xhdXNlcyBpbnRvIGEgc2luZ2xlIGNsYXVzZS5jb2RlTmFtZWRGdW5jdGlvbkV4cHJlc3Npb25tZXNzYWdlTmFtZWRGdW5jdGlvbkV4cHJlc3Npb25OYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbk5BTUVEX0ZVTkNUSU9OX0VYUFJFU1NJT05BIGZ1bmN0aW9uIGV4cHJlc3Npb24gY2FuJ3QgaGF2ZSBhIG5hbWUudGVtcGxhdGVOYW1lZE1peGluT3ZlcnJpZGVDb250ZXh0T3ZlcnJpZGUgd2FzIGludHJvZHVjZWQgaW4gdGhlIG1peGluIGFwcGxpY2F0aW9uIGNsYXNzICcjbmFtZScuY29kZU5hbWVkTWl4aW5PdmVycmlkZUNvbnRleHROYW1lZE1peGluT3ZlcnJpZGVDb250ZXh0Y29kZU5hdGl2ZUNsYXVzZVNob3VsZEJlQW5ub3RhdGlvbm1lc3NhZ2VOYXRpdmVDbGF1c2VTaG91bGRCZUFubm90YXRpb25OYXRpdmVDbGF1c2VTaG91bGRCZUFubm90YXRpb25OYXRpdmUgY2xhdXNlIGluIHRoaXMgZm9ybSBpcyBkZXByZWNhdGVkLlRyeSByZW1vdmluZyB0aGlzIG5hdGl2ZSBjbGF1c2UgYW5kIGFkZGluZyBAbmF0aXZlKCkgb3IgQG5hdGl2ZSgnbmF0aXZlLW5hbWUnKSBiZWZvcmUgdGhlIGRlY2xhcmF0aW9uLnRlbXBsYXRlTm9Gb3JtYWxzQSBmdW5jdGlvbiBzaG91bGQgaGF2ZSBmb3JtYWwgcGFyYW1ldGVycy5UcnkgYWRkaW5nICcoKScgYWZ0ZXIgJyNsZXhlbWUnLCBvciBhZGQgJ2dldCcgYmVmb3JlICcjbGV4ZW1lJyB0byBkZWNsYXJlIGEgZ2V0dGVyLmNvZGVOb0Zvcm1hbHNOb0Zvcm1hbHN0ZW1wbGF0ZU5vU3VjaE5hbWVkUGFyYW1ldGVyTm8gbmFtZWQgcGFyYW1ldGVyIHdpdGggdGhlIG5hbWUgJyNuYW1lJy5jb2RlTm9TdWNoTmFtZWRQYXJhbWV0ZXJOb1N1Y2hOYW1lZFBhcmFtZXRlclVOREVGSU5FRF9OQU1FRF9QQVJBTUVURVJjb2RlTm9Vbm5hbWVkQ29uc3RydWN0b3JJbk9iamVjdG1lc3NhZ2VOb1VubmFtZWRDb25zdHJ1Y3RvckluT2JqZWN0Tm9Vbm5hbWVkQ29uc3RydWN0b3JJbk9iamVjdCdPYmplY3QnIGhhcyBubyB1bm5hbWVkIGNvbnN0cnVjdG9yLnRlbXBsYXRlTm9uQXNjaWlJZGVudGlmaWVyVGhlIG5vbi1BU0NJSSBjaGFyYWN0ZXIgJyNjaGFyYWN0ZXInICgjdW5pY29kZSkgY2FuJ3QgYmUgdXNlZCBpbiBpZGVudGlmaWVycywgb25seSBpbiBzdHJpbmdzIGFuZCBjb21tZW50cy5UcnkgdXNpbmcgYW4gVVMtQVNDSUkgbGV0dGVyLCBhIGRpZ2l0LCAnXycgKGFuIHVuZGVyc2NvcmUpLCBvciAnJCcgKGEgZG9sbGFyIHNpZ24pLmNvZGVOb25Bc2NpaUlkZW50aWZpZXJOb25Bc2NpaUlkZW50aWZpZXJ0ZW1wbGF0ZU5vbkFzY2lpV2hpdGVzcGFjZVRoZSBub24tQVNDSUkgc3BhY2UgY2hhcmFjdGVyICN1bmljb2RlIGNhbiBvbmx5IGJlIHVzZWQgaW4gc3RyaW5ncyBhbmQgY29tbWVudHMuY29kZU5vbkFzY2lpV2hpdGVzcGFjZU5vbkFzY2lpV2hpdGVzcGFjZWNvZGVOb25Db25zdENvbnN0cnVjdG9ybWVzc2FnZU5vbkNvbnN0Q29uc3RydWN0b3JOb25Db25zdENvbnN0cnVjdG9yTk9UX0NPTlNUQU5UX0VYUFJFU1NJT05DYW5ub3QgaW52b2tlIGEgbm9uLSdjb25zdCcgY29uc3RydWN0b3Igd2hlcmUgYSBjb25zdCBleHByZXNzaW9uIGlzIGV4cGVjdGVkLlRyeSB1c2luZyBhIGNvbnN0cnVjdG9yIG9yIGZhY3RvcnkgdGhhdCBpcyAnY29uc3QnLmNvZGVOb25Db25zdEZhY3RvcnltZXNzYWdlTm9uQ29uc3RGYWN0b3J5Tm9uQ29uc3RGYWN0b3J5Q2Fubm90IGludm9rZSBhIG5vbi0nY29uc3QnIGZhY3Rvcnkgd2hlcmUgYSBjb25zdCBleHByZXNzaW9uIGlzIGV4cGVjdGVkLmNvZGVOb25JbnN0YW5jZVR5cGVWYXJpYWJsZVVzZW1lc3NhZ2VOb25JbnN0YW5jZVR5cGVWYXJpYWJsZVVzZU5vbkluc3RhbmNlVHlwZVZhcmlhYmxlVXNlVFlQRV9QQVJBTUVURVJfUkVGRVJFTkNFRF9CWV9TVEFUSUNDYW4gb25seSB1c2UgdHlwZSB2YXJpYWJsZXMgaW4gaW5zdGFuY2UgbWV0aG9kcy5jb2RlTm9uTnVsbEF3YXJlU3ByZWFkSXNOdWxsbWVzc2FnZU5vbk51bGxBd2FyZVNwcmVhZElzTnVsbE5vbk51bGxBd2FyZVNwcmVhZElzTnVsbENhbid0IHNwcmVhZCBhIHZhbHVlIHdpdGggc3RhdGljIHR5cGUgTnVsbC5jb2RlTm9uUGFydE9mRGlyZWN0aXZlSW5QYXJ0bWVzc2FnZU5vblBhcnRPZkRpcmVjdGl2ZUluUGFydE5vblBhcnRPZkRpcmVjdGl2ZUluUGFydE5PTl9QQVJUX09GX0RJUkVDVElWRV9JTl9QQVJUVGhlIHBhcnQtb2YgZGlyZWN0aXZlIG11c3QgYmUgdGhlIG9ubHkgZGlyZWN0aXZlIGluIGEgcGFydC5UcnkgcmVtb3ZpbmcgdGhlIG90aGVyIGRpcmVjdGl2ZXMsIG9yIG1vdmluZyB0aGVtIHRvIHRoZSBsaWJyYXJ5IGZvciB3aGljaCB0aGlzIGlzIGEgcGFydC50ZW1wbGF0ZU5vblNpbXBsZUJvdW5kVmlhUmVmZXJlbmNlQm91bmQgb2YgdGhpcyB2YXJpYWJsZSByZWZlcmVuY2VzIHJhdyB0eXBlICcjbmFtZScuY29kZU5vblNpbXBsZUJvdW5kVmlhUmVmZXJlbmNlTm9uU2ltcGxlQm91bmRWaWFSZWZlcmVuY2V0ZW1wbGF0ZU5vblNpbXBsZUJvdW5kVmlhVmFyaWFibGVCb3VuZCBvZiB0aGlzIHZhcmlhYmxlIHJlZmVyZW5jZXMgdmFyaWFibGUgJyNuYW1lJyBmcm9tIHRoZSBzYW1lIGRlY2xhcmF0aW9uLmNvZGVOb25TaW1wbGVCb3VuZFZpYVZhcmlhYmxlTm9uU2ltcGxlQm91bmRWaWFWYXJpYWJsZWNvZGVOb3RBQ29uc3RhbnRFeHByZXNzaW9ubWVzc2FnZU5vdEFDb25zdGFudEV4cHJlc3Npb25Ob3RBQ29uc3RhbnRFeHByZXNzaW9uTm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbi50ZW1wbGF0ZU5vdEFQcmVmaXhJblR5cGVBbm5vdGF0aW9uJyNuYW1lLiNuYW1lMicgY2FuJ3QgYmUgdXNlZCBhcyBhIHR5cGUgYmVjYXVzZSAnI25hbWUnIGRvZXNuJ3QgcmVmZXIgdG8gYW4gaW1wb3J0IHByZWZpeC5jb2RlTm90QVByZWZpeEluVHlwZUFubm90YXRpb25Ob3RBUHJlZml4SW5UeXBlQW5ub3RhdGlvbk5PVF9BX1RZUEV0ZW1wbGF0ZU5vdEFUeXBlJyNuYW1lJyBpc24ndCBhIHR5cGUuY29kZU5vdEFUeXBlTm90QVR5cGVjb2RlTm90QVR5cGVDb250ZXh0bWVzc2FnZU5vdEFUeXBlQ29udGV4dE5vdEFUeXBlQ29udGV4dFRoaXMgaXNuJ3QgYSB0eXBlLmNvZGVOb3RBbkx2YWx1ZW1lc3NhZ2VOb3RBbkx2YWx1ZU5vdEFuTHZhbHVlQ2FuJ3QgYXNzaWduIHRvIHRoaXMudGVtcGxhdGVOb3RCaW5hcnlPcGVyYXRvcicjbGV4ZW1lJyBpc24ndCBhIGJpbmFyeSBvcGVyYXRvci5jb2RlTm90QmluYXJ5T3BlcmF0b3JOb3RCaW5hcnlPcGVyYXRvcnRlbXBsYXRlTm90Q29uc3RhbnRFeHByZXNzaW9uI3N0cmluZyBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uLmNvZGVOb3RDb25zdGFudEV4cHJlc3Npb25Ob3RDb25zdGFudEV4cHJlc3Npb25jb2RlT2JqZWN0RXh0ZW5kc21lc3NhZ2VPYmplY3RFeHRlbmRzT2JqZWN0RXh0ZW5kc1RoZSBjbGFzcyAnT2JqZWN0JyBjYW4ndCBoYXZlIGEgc3VwZXJjbGFzcy5jb2RlT2JqZWN0SW1wbGVtZW50c21lc3NhZ2VPYmplY3RJbXBsZW1lbnRzT2JqZWN0SW1wbGVtZW50c1RoZSBjbGFzcyAnT2JqZWN0JyBjYW4ndCBpbXBsZW1lbnQgYW55dGhpbmcuY29kZU9iamVjdE1peGVzSW5tZXNzYWdlT2JqZWN0TWl4ZXNJbk9iamVjdE1peGVzSW5UaGUgY2xhc3MgJ09iamVjdCcgY2FuJ3QgdXNlIG1peGlucy5jb2RlT25seVRyeW1lc3NhZ2VPbmx5VHJ5T25seVRyeUEgdHJ5IGJsb2NrIG11c3QgYmUgZm9sbG93ZWQgYnkgYW4gJ29uJywgJ2NhdGNoJywgb3IgJ2ZpbmFsbHknIGNsYXVzZS5UcnkgYWRkaW5nIGVpdGhlciBhIGNhdGNoIG9yIGZpbmFsbHkgY2xhdXNlLCBvciByZW1vdmUgdGhlIHRyeSBzdGF0ZW1lbnQudGVtcGxhdGVPcGVyYXRvck1pbnVzUGFyYW1ldGVyTWlzbWF0Y2hPcGVyYXRvciAnI25hbWUnIHNob3VsZCBoYXZlIHplcm8gb3Igb25lIHBhcmFtZXRlci5XaXRoIHplcm8gcGFyYW1ldGVycywgaXQgaGFzIHRoZSBzeW50YWN0aWMgZm9ybSAnLWEnLCBmb3JtYWxseSBrbm93biBhcyAndW5hcnktJy4gV2l0aCBvbmUgcGFyYW1ldGVyLCBpdCBoYXMgdGhlIHN5bnRhY3RpYyBmb3JtICdhIC0gYicsIGZvcm1hbGx5IGtub3duIGFzICctJy5jb2RlT3BlcmF0b3JNaW51c1BhcmFtZXRlck1pc21hdGNoT3BlcmF0b3JNaW51c1BhcmFtZXRlck1pc21hdGNoV1JPTkdfTlVNQkVSX09GX1BBUkFNRVRFUlNfRk9SX09QRVJBVE9SX01JTlVTdGVtcGxhdGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoME9wZXJhdG9yICcjbmFtZScgc2hvdWxkbid0IGhhdmUgYW55IHBhcmFtZXRlcnMuY29kZU9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gwT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDB0ZW1wbGF0ZU9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gxT3BlcmF0b3IgJyNuYW1lJyBzaG91bGQgaGF2ZSBleGFjdGx5IG9uZSBwYXJhbWV0ZXIuY29kZU9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gxT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDFXUk9OR19OVU1CRVJfT0ZfUEFSQU1FVEVSU19GT1JfT1BFUkFUT1J0ZW1wbGF0ZU9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gyT3BlcmF0b3IgJyNuYW1lJyBzaG91bGQgaGF2ZSBleGFjdGx5IHR3byBwYXJhbWV0ZXJzLmNvZGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMk9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gyY29kZU9wZXJhdG9yV2l0aE9wdGlvbmFsRm9ybWFsc21lc3NhZ2VPcGVyYXRvcldpdGhPcHRpb25hbEZvcm1hbHNPcGVyYXRvcldpdGhPcHRpb25hbEZvcm1hbHNBbiBvcGVyYXRvciBjYW4ndCBoYXZlIG9wdGlvbmFsIHBhcmFtZXRlcnMudGVtcGxhdGVPdmVycmlkZGVuTWV0aG9kQ2F1c2VUaGlzIGlzIHRoZSBvdmVycmlkZGVuIG1ldGhvZCAoJyNuYW1lJykuY29kZU92ZXJyaWRkZW5NZXRob2RDYXVzZU92ZXJyaWRkZW5NZXRob2RDYXVzZXRlbXBsYXRlT3ZlcnJpZGVGZXdlck5hbWVkQXJndW1lbnRzVGhlIG1ldGhvZCAnI25hbWUnIGhhcyBmZXdlciBuYW1lZCBhcmd1bWVudHMgdGhhbiB0aG9zZSBvZiBvdmVycmlkZGVuIG1ldGhvZCAnI25hbWUyJy5jb2RlT3ZlcnJpZGVGZXdlck5hbWVkQXJndW1lbnRzT3ZlcnJpZGVGZXdlck5hbWVkQXJndW1lbnRzSU5WQUxJRF9PVkVSUklERV9OQU1FRHRlbXBsYXRlT3ZlcnJpZGVGZXdlclBvc2l0aW9uYWxBcmd1bWVudHNUaGUgbWV0aG9kICcjbmFtZScgaGFzIGZld2VyIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRoYW4gdGhvc2Ugb2Ygb3ZlcnJpZGRlbiBtZXRob2QgJyNuYW1lMicuY29kZU92ZXJyaWRlRmV3ZXJQb3NpdGlvbmFsQXJndW1lbnRzT3ZlcnJpZGVGZXdlclBvc2l0aW9uYWxBcmd1bWVudHNJTlZBTElEX09WRVJSSURFX1BPU0lUSU9OQUx0ZW1wbGF0ZU92ZXJyaWRlTWlzbWF0Y2hOYW1lZFBhcmFtZXRlclRoZSBtZXRob2QgJyNuYW1lJyBkb2Vzbid0IGhhdmUgdGhlIG5hbWVkIHBhcmFtZXRlciAnI25hbWUyJyBvZiBvdmVycmlkZGVuIG1ldGhvZCAnI25hbWUzJy5jb2RlT3ZlcnJpZGVNaXNtYXRjaE5hbWVkUGFyYW1ldGVyT3ZlcnJpZGVNaXNtYXRjaE5hbWVkUGFyYW1ldGVydGVtcGxhdGVPdmVycmlkZU1vcmVSZXF1aXJlZEFyZ3VtZW50c1RoZSBtZXRob2QgJyNuYW1lJyBoYXMgbW9yZSByZXF1aXJlZCBhcmd1bWVudHMgdGhhbiB0aG9zZSBvZiBvdmVycmlkZGVuIG1ldGhvZCAnI25hbWUyJy5jb2RlT3ZlcnJpZGVNb3JlUmVxdWlyZWRBcmd1bWVudHNPdmVycmlkZU1vcmVSZXF1aXJlZEFyZ3VtZW50c0lOVkFMSURfT1ZFUlJJREVfUkVRVUlSRUR0ZW1wbGF0ZU92ZXJyaWRlVHlwZU1pc21hdGNoUGFyYW1ldGVyVGhlIHBhcmFtZXRlciAnI25hbWUnIG9mIHRoZSBtZXRob2QgJyNuYW1lMicgaGFzIHR5cGUgJyN0eXBlJywgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgdHlwZSwgJyN0eXBlMicsIGluIHRoZSBvdmVycmlkZGVuIG1ldGhvZCwgJyNuYW1lMycuQ2hhbmdlIHRvIGEgc3VwZXJ0eXBlIG9mICcjdHlwZTInLCBvciwgZm9yIGEgY292YXJpYW50IHBhcmFtZXRlciwgYSBzdWJ0eXBlLmNvZGVPdmVycmlkZVR5cGVNaXNtYXRjaFBhcmFtZXRlck92ZXJyaWRlVHlwZU1pc21hdGNoUGFyYW1ldGVydGVtcGxhdGVPdmVycmlkZVR5cGVNaXNtYXRjaFJldHVyblR5cGVUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIG1ldGhvZCAnI25hbWUnIGlzICcjdHlwZScsIHdoaWNoIGRvZXMgbm90IG1hdGNoIHRoZSByZXR1cm4gdHlwZSwgJyN0eXBlMicsIG9mIHRoZSBvdmVycmlkZGVuIG1ldGhvZCwgJyNuYW1lMicuQ2hhbmdlIHRvIGEgc3VidHlwZSBvZiAnI3R5cGUyJy5jb2RlT3ZlcnJpZGVUeXBlTWlzbWF0Y2hSZXR1cm5UeXBlT3ZlcnJpZGVUeXBlTWlzbWF0Y2hSZXR1cm5UeXBldGVtcGxhdGVPdmVycmlkZVR5cGVWYXJpYWJsZXNNaXNtYXRjaERlY2xhcmVkIHR5cGUgdmFyaWFibGVzIG9mICcjbmFtZScgZG9lc24ndCBtYXRjaCB0aG9zZSBvbiBvdmVycmlkZGVuIG1ldGhvZCAnI25hbWUyJy5jb2RlT3ZlcnJpZGVUeXBlVmFyaWFibGVzTWlzbWF0Y2hPdmVycmlkZVR5cGVWYXJpYWJsZXNNaXNtYXRjaElOVkFMSURfTUVUSE9EX09WRVJSSURFX1RZUEVfUEFSQU1FVEVSU3RlbXBsYXRlUGFja2FnZU5vdEZvdW5kQ291bGQgbm90IHJlc29sdmUgdGhlIHBhY2thZ2UgJyNuYW1lJyBpbiAnI3VyaScuY29kZVBhY2thZ2VOb3RGb3VuZFBhY2thZ2VOb3RGb3VuZFByb2JsZW0gaW4gcGFja2FnZXMgY29uZmlndXJhdGlvbiBmaWxlOiAjc3RyaW5nY29kZVBhY2thZ2VzRmlsZUZvcm1hdFBhY2thZ2VzRmlsZUZvcm1hdGNvZGVQYXJ0RXhwb3J0bWVzc2FnZVBhcnRFeHBvcnRQYXJ0RXhwb3J0RVhQT1JUX09GX05PTl9MSUJSQVJZQ2FuJ3QgZXhwb3J0IHRoaXMgZmlsZSBiZWNhdXNlIGl0IGNvbnRhaW5zIGEgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uLmNvZGVQYXJ0RXhwb3J0Q29udGV4dG1lc3NhZ2VQYXJ0RXhwb3J0Q29udGV4dFBhcnRFeHBvcnRDb250ZXh0VGhpcyBpcyB0aGUgZmlsZSB0aGF0IGNhbid0IGJlIGV4cG9ydGVkLmNvZGVQYXJ0SW5QYXJ0bWVzc2FnZVBhcnRJblBhcnRQYXJ0SW5QYXJ0QSBmaWxlIHRoYXQncyBhIHBhcnQgb2YgYSBsaWJyYXJ5IGNhbid0IGhhdmUgcGFydHMgaXRzZWxmLlRyeSBtb3ZpbmcgdGhlICdwYXJ0JyBkZWNsYXJhdGlvbiB0byB0aGUgY29udGFpbmluZyBsaWJyYXJ5LmNvZGVQYXJ0SW5QYXJ0TGlicmFyeUNvbnRleHRtZXNzYWdlUGFydEluUGFydExpYnJhcnlDb250ZXh0UGFydEluUGFydExpYnJhcnlDb250ZXh0VGhpcyBpcyB0aGUgY29udGFpbmluZyBsaWJyYXJ5LnRlbXBsYXRlUGFydE9mSW5MaWJyYXJ5Q2FuJ3QgaW1wb3J0ICcjdXJpJywgYmVjYXVzZSBpdCBoYXMgYSAncGFydCBvZicgZGVjbGFyYXRpb24uVHJ5IHJlbW92aW5nIHRoZSAncGFydCBvZicgZGVjbGFyYXRpb24sIG9yIHVzaW5nICcjdXJpJyBhcyBhIHBhcnQuY29kZVBhcnRPZkluTGlicmFyeVBhcnRPZkluTGlicmFyeUlNUE9SVF9PRl9OT05fTElCUkFSWXRlbXBsYXRlUGFydE9mTGlicmFyeU5hbWVNaXNtYXRjaFVzaW5nICcjdXJpJyBhcyBwYXJ0IG9mICcjbmFtZScgYnV0IGl0cyAncGFydCBvZicgZGVjbGFyYXRpb24gc2F5cyAnI25hbWUyJy5jb2RlUGFydE9mTGlicmFyeU5hbWVNaXNtYXRjaFBhcnRPZkxpYnJhcnlOYW1lTWlzbWF0Y2hQQVJUX09GX0RJRkZFUkVOVF9MSUJSQVJZY29kZVBhcnRPZlNlbGZtZXNzYWdlUGFydE9mU2VsZlBhcnRPZlNlbGZBIGZpbGUgY2FuJ3QgYmUgYSBwYXJ0IG9mIGl0c2VsZi5jb2RlUGFydE9mVHdpY2VtZXNzYWdlUGFydE9mVHdpY2VQYXJ0T2ZUd2ljZU9ubHkgb25lIHBhcnQtb2YgZGlyZWN0aXZlIG1heSBiZSBkZWNsYXJlZCBpbiBhIGZpbGUuVHJ5IHJlbW92aW5nIGFsbCBidXQgb25lIG9mIHRoZSBwYXJ0LW9mIGRpcmVjdGl2ZXMuY29kZVBhcnRPZlR3b0xpYnJhcmllc21lc3NhZ2VQYXJ0T2ZUd29MaWJyYXJpZXNQYXJ0T2ZUd29MaWJyYXJpZXNBIGZpbGUgY2FuJ3QgYmUgcGFydCBvZiBtb3JlIHRoYW4gb25lIGxpYnJhcnkuVHJ5IG1vdmluZyB0aGUgc2hhcmVkIGRlY2xhcmF0aW9ucyBpbnRvIHRoZSBsaWJyYXJpZXMsIG9yIGludG8gYSBuZXcgbGlicmFyeS5jb2RlUGFydE9mVHdvTGlicmFyaWVzQ29udGV4dG1lc3NhZ2VQYXJ0T2ZUd29MaWJyYXJpZXNDb250ZXh0UGFydE9mVHdvTGlicmFyaWVzQ29udGV4dFVzZWQgYXMgYSBwYXJ0IGluIHRoaXMgbGlicmFyeS50ZW1wbGF0ZVBhcnRPZlVyaU1pc21hdGNoVXNpbmcgJyN1cmknIGFzIHBhcnQgb2YgJyN1cmkyJyBidXQgaXRzICdwYXJ0IG9mJyBkZWNsYXJhdGlvbiBzYXlzICcjdXJpMycuY29kZVBhcnRPZlVyaU1pc21hdGNoUGFydE9mVXJpTWlzbWF0Y2h0ZW1wbGF0ZVBhcnRPZlVzZVVyaVVzaW5nICcjdXJpJyBhcyBwYXJ0IG9mICcjdXJpMicgYnV0IGl0cyAncGFydCBvZicgZGVjbGFyYXRpb24gc2F5cyAnI25hbWUnLlRyeSBjaGFuZ2luZyB0aGUgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uIHRvIHVzZSBhIHJlbGF0aXZlIGZpbGUgbmFtZS5jb2RlUGFydE9mVXNlVXJpUGFydE9mVXNlVXJpUEFSVF9PRl9VTk5BTUVEX0xJQlJBUlljb2RlUGFydE9ycGhhbm1lc3NhZ2VQYXJ0T3JwaGFuUGFydE9ycGhhblRoaXMgcGFydCBkb2Vzbid0IGhhdmUgYSBjb250YWluaW5nIGxpYnJhcnkuVHJ5IHJlbW92aW5nIHRoZSAncGFydCBvZicgZGVjbGFyYXRpb24udGVtcGxhdGVQYXJ0VHdpY2VDYW4ndCB1c2UgJyN1cmknIGFzIGEgcGFydCBtb3JlIHRoYW4gb25jZS5jb2RlUGFydFR3aWNlUGFydFR3aWNlRFVQTElDQVRFX1BBUlRjb2RlUGF0Y2hDbGFzc09yaWdpbm1lc3NhZ2VQYXRjaENsYXNzT3JpZ2luUGF0Y2hDbGFzc09yaWdpblRoaXMgaXMgdGhlIG9yaWdpbiBjbGFzcy5jb2RlUGF0Y2hDbGFzc1R5cGVWYXJpYWJsZXNNaXNtYXRjaG1lc3NhZ2VQYXRjaENsYXNzVHlwZVZhcmlhYmxlc01pc21hdGNoUGF0Y2hDbGFzc1R5cGVWYXJpYWJsZXNNaXNtYXRjaEEgcGF0Y2ggY2xhc3MgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiB0eXBlIHZhcmlhYmxlcyBhcyBpdHMgb3JpZ2luIGNsYXNzLmNvZGVQYXRjaERlY2xhcmF0aW9uTWlzbWF0Y2htZXNzYWdlUGF0Y2hEZWNsYXJhdGlvbk1pc21hdGNoUGF0Y2hEZWNsYXJhdGlvbk1pc21hdGNoVGhpcyBwYXRjaCBkb2Vzbid0IG1hdGNoIG9yaWdpbiBkZWNsYXJhdGlvbi5jb2RlUGF0Y2hEZWNsYXJhdGlvbk9yaWdpbm1lc3NhZ2VQYXRjaERlY2xhcmF0aW9uT3JpZ2luUGF0Y2hEZWNsYXJhdGlvbk9yaWdpblRoaXMgaXMgdGhlIG9yaWdpbiBkZWNsYXJhdGlvbi50ZW1wbGF0ZVBhdGNoSW5qZWN0aW9uRmFpbGVkQ2FuJ3QgaW5qZWN0ICcjbmFtZScgaW50byAnI3VyaScuVHJ5IGFkZGluZyAnQHBhdGNoJy5jb2RlUGF0Y2hJbmplY3Rpb25GYWlsZWRQYXRjaEluamVjdGlvbkZhaWxlZGNvZGVQYXRjaE5vbkV4dGVybmFsbWVzc2FnZVBhdGNoTm9uRXh0ZXJuYWxQYXRjaE5vbkV4dGVybmFsQ2FuJ3QgYXBwbHkgdGhpcyBwYXRjaCBhcyBpdHMgb3JpZ2luIGRlY2xhcmF0aW9uIGlzbid0IGV4dGVybmFsLlRyeSBhZGRpbmcgJ2V4dGVybmFsJyB0byB0aGUgb3JpZ2luIGRlY2xhcmF0aW9uLmNvZGVQbGF0Zm9ybVByaXZhdGVMaWJyYXJ5QWNjZXNzbWVzc2FnZVBsYXRmb3JtUHJpdmF0ZUxpYnJhcnlBY2Nlc3NQbGF0Zm9ybVByaXZhdGVMaWJyYXJ5QWNjZXNzSU1QT1JUX0lOVEVSTkFMX0xJQlJBUllDYW4ndCBhY2Nlc3MgcGxhdGZvcm0gcHJpdmF0ZSBsaWJyYXJ5LmNvZGVQb3NpdGlvbmFsQWZ0ZXJOYW1lZEFyZ3VtZW50bWVzc2FnZVBvc2l0aW9uYWxBZnRlck5hbWVkQXJndW1lbnRQb3NpdGlvbmFsQWZ0ZXJOYW1lZEFyZ3VtZW50UE9TSVRJT05BTF9BRlRFUl9OQU1FRF9BUkdVTUVOVFBsYWNlIHBvc2l0aW9uYWwgYXJndW1lbnRzIGJlZm9yZSBuYW1lZCBhcmd1bWVudHMuVHJ5IG1vdmluZyB0aGUgcG9zaXRpb25hbCBhcmd1bWVudCBiZWZvcmUgdGhlIG5hbWVkIGFyZ3VtZW50cywgb3IgYWRkIGEgbmFtZSB0byB0aGUgYXJndW1lbnQuY29kZVBvc2l0aW9uYWxQYXJhbWV0ZXJXaXRoRXF1YWxzbWVzc2FnZVBvc2l0aW9uYWxQYXJhbWV0ZXJXaXRoRXF1YWxzUG9zaXRpb25hbFBhcmFtZXRlcldpdGhFcXVhbHNXUk9OR19TRVBBUkFUT1JfRk9SX1BPU0lUSU9OQUxfUEFSQU1FVEVSUG9zaXRpb25hbCBvcHRpb25hbCBwYXJhbWV0ZXJzIGNhbid0IHVzZSAnOicgdG8gc3BlY2lmeSBhIGRlZmF1bHQgdmFsdWUuVHJ5IHJlcGxhY2luZyAnOicgd2l0aCAnPScuY29kZVByZWZpeEFmdGVyQ29tYmluYXRvcm1lc3NhZ2VQcmVmaXhBZnRlckNvbWJpbmF0b3JQcmVmaXhBZnRlckNvbWJpbmF0b3JUaGUgcHJlZml4ICgnYXMnIGNsYXVzZSkgc2hvdWxkIGNvbWUgYmVmb3JlIGFueSBzaG93L2hpZGUgY29tYmluYXRvcnMuVHJ5IG1vdmluZyB0aGUgcHJlZml4IGJlZm9yZSB0aGUgY29tYmluYXRvcnMuY29kZVByaXZhdGVOYW1lZFBhcmFtZXRlcm1lc3NhZ2VQcml2YXRlTmFtZWRQYXJhbWV0ZXJQcml2YXRlTmFtZWRQYXJhbWV0ZXJQUklWQVRFX09QVElPTkFMX1BBUkFNRVRFUkFuIG9wdGlvbmFsIG5hbWVkIHBhcmFtZXRlciBjYW4ndCBzdGFydCB3aXRoICdfJy5jb2RlUmVkaXJlY3RpbmdDb25zdHJ1Y3RvcldpdGhCb2R5bWVzc2FnZVJlZGlyZWN0aW5nQ29uc3RydWN0b3JXaXRoQm9keVJlZGlyZWN0aW5nQ29uc3RydWN0b3JXaXRoQm9keVJlZGlyZWN0aW5nIGNvbnN0cnVjdG9ycyBjYW4ndCBoYXZlIGEgYm9keS5UcnkgcmVtb3ZpbmcgdGhlIGJvZHksIG9yIG5vdCBtYWtpbmcgdGhpcyBhIHJlZGlyZWN0aW5nIGNvbnN0cnVjdG9yLnRlbXBsYXRlUmVkaXJlY3RpbmdGYWN0b3J5SW5jb21wYXRpYmxlVHlwZUFyZ3VtZW50VGhlIHR5cGUgJyN0eXBlJyBkb2Vzbid0IGV4dGVuZCAnI3R5cGUyJy5UcnkgdXNpbmcgYSBkaWZmZXJlbnQgdHlwZSBhcyBhcmd1bWVudC5jb2RlUmVkaXJlY3RpbmdGYWN0b3J5SW5jb21wYXRpYmxlVHlwZUFyZ3VtZW50UmVkaXJlY3RpbmdGYWN0b3J5SW5jb21wYXRpYmxlVHlwZUFyZ3VtZW50Y29kZVJlZGlyZWN0aW9uSW5Ob25GYWN0b3J5bWVzc2FnZVJlZGlyZWN0aW9uSW5Ob25GYWN0b3J5UmVkaXJlY3Rpb25Jbk5vbkZhY3RvcnlPbmx5IGZhY3RvcnkgY29uc3RydWN0b3IgY2FuIHNwZWNpZnkgJz0nIHJlZGlyZWN0aW9uLlRyeSBtYWtpbmcgdGhpcyBhIGZhY3RvcnkgY29uc3RydWN0b3IsIG9yIHJlbW92ZSB0aGUgcmVkaXJlY3Rpb24udGVtcGxhdGVSZWRpcmVjdGlvblRhcmdldE5vdEZvdW5kUmVkaXJlY3Rpb24gY29uc3RydWN0b3IgdGFyZ2V0IG5vdCBmb3VuZDogJyNuYW1lJ2NvZGVSZWRpcmVjdGlvblRhcmdldE5vdEZvdW5kUmVkaXJlY3Rpb25UYXJnZXROb3RGb3VuZFJFRElSRUNUX1RPX01JU1NJTkdfQ09OU1RSVUNUT1Jjb2RlUmVxdWlyZWRQYXJhbWV0ZXJXaXRoRGVmYXVsdG1lc3NhZ2VSZXF1aXJlZFBhcmFtZXRlcldpdGhEZWZhdWx0UmVxdWlyZWRQYXJhbWV0ZXJXaXRoRGVmYXVsdE5BTUVEX1BBUkFNRVRFUl9PVVRTSURFX0dST1VQTm9uLW9wdGlvbmFsIHBhcmFtZXRlcnMgY2FuJ3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUuVHJ5IHJlbW92aW5nIHRoZSBkZWZhdWx0IHZhbHVlIG9yIG1ha2luZyB0aGUgcGFyYW1ldGVyIG9wdGlvbmFsLmNvZGVSZXRocm93Tm90Q2F0Y2htZXNzYWdlUmV0aHJvd05vdENhdGNoUmV0aHJvd05vdENhdGNoUkVUSFJPV19PVVRTSURFX0NBVENIJ3JldGhyb3cnIGNhbiBvbmx5IGJlIHVzZWQgaW4gY2F0Y2ggY2xhdXNlcy5jb2RlUmV0dXJuRnJvbVZvaWRGdW5jdGlvbm1lc3NhZ2VSZXR1cm5Gcm9tVm9pZEZ1bmN0aW9uUmV0dXJuRnJvbVZvaWRGdW5jdGlvblJFVFVSTl9PRl9JTlZBTElEX1RZUEVDYW4ndCByZXR1cm4gYSB2YWx1ZSBmcm9tIGEgdm9pZCBmdW5jdGlvbi5jb2RlUmV0dXJuVHlwZUZ1bmN0aW9uRXhwcmVzc2lvbm1lc3NhZ2VSZXR1cm5UeXBlRnVuY3Rpb25FeHByZXNzaW9uUmV0dXJuVHlwZUZ1bmN0aW9uRXhwcmVzc2lvbkEgZnVuY3Rpb24gZXhwcmVzc2lvbiBjYW4ndCBoYXZlIGEgcmV0dXJuIHR5cGUuY29kZVJldHVybldpdGhvdXRFeHByZXNzaW9ubWVzc2FnZVJldHVybldpdGhvdXRFeHByZXNzaW9uUmV0dXJuV2l0aG91dEV4cHJlc3Npb25SRVRVUk5fV0lUSE9VVF9WQUxVRU11c3QgZXhwbGljaXRseSByZXR1cm4gYSB2YWx1ZSBmcm9tIGEgbm9uLXZvaWQgZnVuY3Rpb24uU0RLIHJvb3QgZGlyZWN0b3J5IG5vdCBmb3VuZDogI3VyaS5jb2RlU2RrUm9vdE5vdEZvdW5kU2RrUm9vdE5vdEZvdW5kU0RLIGxpYnJhcmllcyBzcGVjaWZpY2F0aW9uIG5vdCBmb3VuZDogI3VyaS5Ob3JtYWxseSwgdGhlIHNwZWNpZmljYXRpb24gaXMgYSBmaWxlIG5hbWVkICdsaWJyYXJpZXMuanNvbicgaW4gdGhlIERhcnQgU0RLIGluc3RhbGwgbG9jYXRpb24uY29kZVNka1NwZWNpZmljYXRpb25Ob3RGb3VuZFNka1NwZWNpZmljYXRpb25Ob3RGb3VuZFNESyBzdW1tYXJ5IG5vdCBmb3VuZDogI3VyaS5jb2RlU2RrU3VtbWFyeU5vdEZvdW5kU2RrU3VtbWFyeU5vdEZvdW5kY29kZVNldExpdGVyYWxUb29NYW55VHlwZUFyZ3VtZW50c21lc3NhZ2VTZXRMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHNTZXRMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHNBIHNldCBsaXRlcmFsIHJlcXVpcmVzIGV4YWN0bHkgb25lIHR5cGUgYXJndW1lbnQuY29kZVNldExpdGVyYWxzTm90U3VwcG9ydGVkbWVzc2FnZVNldExpdGVyYWxzTm90U3VwcG9ydGVkU2V0TGl0ZXJhbHNOb3RTdXBwb3J0ZWRTZXQgbGl0ZXJhbHMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LmNvZGVTZXRPck1hcExpdGVyYWxUb29NYW55VHlwZUFyZ3VtZW50c21lc3NhZ2VTZXRPck1hcExpdGVyYWxUb29NYW55VHlwZUFyZ3VtZW50c1NldE9yTWFwTGl0ZXJhbFRvb01hbnlUeXBlQXJndW1lbnRzQSBzZXQgb3IgbWFwIGxpdGVyYWwgcmVxdWlyZXMgZXhhY3RseSBvbmUgb3IgdHdvIHR5cGUgYXJndW1lbnRzLCByZXNwZWN0aXZlbHkudGVtcGxhdGVTZXR0ZXJOb3RGb3VuZFNldHRlciBub3QgZm91bmQ6ICcjbmFtZScuY29kZVNldHRlck5vdEZvdW5kU2V0dGVyTm90Rm91bmRVTkRFRklORURfU0VUVEVSY29kZVNldHRlck5vdFN5bmNtZXNzYWdlU2V0dGVyTm90U3luY1NldHRlck5vdFN5bmNJTlZBTElEX01PRElGSUVSX09OX1NFVFRFUlNldHRlcnMgY2FuJ3QgdXNlICdhc3luYycsICdhc3luYyonLCBvciAnc3luYyonLmNvZGVTZXR0ZXJXaXRoV3JvbmdOdW1iZXJPZkZvcm1hbHNtZXNzYWdlU2V0dGVyV2l0aFdyb25nTnVtYmVyT2ZGb3JtYWxzU2V0dGVyV2l0aFdyb25nTnVtYmVyT2ZGb3JtYWxzV1JPTkdfTlVNQkVSX09GX1BBUkFNRVRFUlNfRk9SX1NFVFRFUkEgc2V0dGVyIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIGZvcm1hbCBwYXJhbWV0ZXIudGVtcGxhdGVTb3VyY2VCb2R5U3VtbWFyeUJ1aWx0IGJvZGllcyBmb3IgI2NvdW50IGNvbXBpbGF0aW9uIHVuaXRzICgjY291bnQyIGJ5dGVzKSBpbiAjbnVtMSUuM21zLCB0aGF0IGlzLAojbnVtMiUxMi4zIGJ5dGVzL21zLCBhbmQKI251bTMlMTIuMyBtcy9jb21waWxhdGlvbiB1bml0LmNvZGVTb3VyY2VCb2R5U3VtbWFyeVNvdXJjZUJvZHlTdW1tYXJ5dGVtcGxhdGVTb3VyY2VPdXRsaW5lU3VtbWFyeUJ1aWx0IG91dGxpbmVzIGZvciAjY291bnQgY29tcGlsYXRpb24gdW5pdHMgKCNjb3VudDIgYnl0ZXMpIGluICNudW0xJS4zbXMsIHRoYXQgaXMsCiNudW0yJTEyLjMgYnl0ZXMvbXMsIGFuZAojbnVtMyUxMi4zIG1zL2NvbXBpbGF0aW9uIHVuaXQuY29kZVNvdXJjZU91dGxpbmVTdW1tYXJ5U291cmNlT3V0bGluZVN1bW1hcnljb2RlU3ByZWFkRWxlbWVudG1lc3NhZ2VTcHJlYWRFbGVtZW50U3ByZWFkRWxlbWVudEl0ZXJhYmxlIHNwcmVhZC50ZW1wbGF0ZVNwcmVhZEVsZW1lbnRUeXBlTWlzbWF0Y2hDYW4ndCBhc3NpZ24gc3ByZWFkIGVsZW1lbnRzIG9mIHR5cGUgJyN0eXBlJyB0byBjb2xsZWN0aW9uIGVsZW1lbnRzIG9mIHR5cGUgJyN0eXBlMicuY29kZVNwcmVhZEVsZW1lbnRUeXBlTWlzbWF0Y2hTcHJlYWRFbGVtZW50VHlwZU1pc21hdGNoTElTVF9FTEVNRU5UX1RZUEVfTk9UX0FTU0lHTkFCTEVjb2RlU3ByZWFkTWFwRWxlbWVudG1lc3NhZ2VTcHJlYWRNYXBFbGVtZW50U3ByZWFkTWFwRWxlbWVudE1hcCBzcHJlYWQudGVtcGxhdGVTcHJlYWRNYXBFbnRyeUVsZW1lbnRLZXlUeXBlTWlzbWF0Y2hDYW4ndCBhc3NpZ24gc3ByZWFkIGVudHJ5IGtleXMgb2YgdHlwZSAnI3R5cGUnIHRvIG1hcCBlbnRyeSBrZXlzIG9mIHR5cGUgJyN0eXBlMicuY29kZVNwcmVhZE1hcEVudHJ5RWxlbWVudEtleVR5cGVNaXNtYXRjaFNwcmVhZE1hcEVudHJ5RWxlbWVudEtleVR5cGVNaXNtYXRjaE1BUF9LRVlfVFlQRV9OT1RfQVNTSUdOQUJMRXRlbXBsYXRlU3ByZWFkTWFwRW50cnlFbGVtZW50VmFsdWVUeXBlTWlzbWF0Y2hDYW4ndCBhc3NpZ24gc3ByZWFkIGVudHJ5IHZhbHVlcyBvZiB0eXBlICcjdHlwZScgdG8gbWFwIGVudHJ5IHZhbHVlcyBvZiB0eXBlICcjdHlwZTInLmNvZGVTcHJlYWRNYXBFbnRyeUVsZW1lbnRWYWx1ZVR5cGVNaXNtYXRjaFNwcmVhZE1hcEVudHJ5RWxlbWVudFZhbHVlVHlwZU1pc21hdGNoTUFQX1ZBTFVFX1RZUEVfTk9UX0FTU0lHTkFCTEV0ZW1wbGF0ZVNwcmVhZE1hcEVudHJ5VHlwZU1pc21hdGNoVW5leHBlY3RlZCB0eXBlICcjdHlwZScgb2YgYSBtYXAgc3ByZWFkIGVudHJ5LiAgRXhwZWN0ZWQgJ2R5bmFtaWMnIG9yIGEgTWFwLmNvZGVTcHJlYWRNYXBFbnRyeVR5cGVNaXNtYXRjaFNwcmVhZE1hcEVudHJ5VHlwZU1pc21hdGNodGVtcGxhdGVTcHJlYWRUeXBlTWlzbWF0Y2hVbmV4cGVjdGVkIHR5cGUgJyN0eXBlJyBvZiBhIHNwcmVhZC4gIEV4cGVjdGVkICdkeW5hbWljJyBvciBhbiBJdGVyYWJsZS5jb2RlU3ByZWFkVHlwZU1pc21hdGNoU3ByZWFkVHlwZU1pc21hdGNoY29kZVN0YWNrT3ZlcmZsb3dtZXNzYWdlU3RhY2tPdmVyZmxvd1N0YWNrT3ZlcmZsb3dUaGUgZmlsZSBoYXMgdG9vIG1hbnkgbmVzdGVkIGV4cHJlc3Npb25zIG9yIHN0YXRlbWVudHMuVHJ5IHNpbXBsaWZ5aW5nIHRoZSBjb2RlLmNvZGVTdGF0aWNBZnRlckNvbnN0bWVzc2FnZVN0YXRpY0FmdGVyQ29uc3RTdGF0aWNBZnRlckNvbnN0VGhlIG1vZGlmaWVyICdzdGF0aWMnIHNob3VsZCBiZSBiZWZvcmUgdGhlIG1vZGlmaWVyICdjb25zdCcuY29kZVN0YXRpY0FmdGVyRmluYWxtZXNzYWdlU3RhdGljQWZ0ZXJGaW5hbFN0YXRpY0FmdGVyRmluYWxUaGUgbW9kaWZpZXIgJ3N0YXRpYycgc2hvdWxkIGJlIGJlZm9yZSB0aGUgbW9kaWZpZXIgJ2ZpbmFsJy5jb2RlU3RhdGljQWZ0ZXJWYXJtZXNzYWdlU3RhdGljQWZ0ZXJWYXJTdGF0aWNBZnRlclZhclRoZSBtb2RpZmllciAnc3RhdGljJyBzaG91bGQgYmUgYmVmb3JlIHRoZSBtb2RpZmllciAndmFyJy5jb2RlU3RhdGljQW5kSW5zdGFuY2VDb25mbGljdG1lc3NhZ2VTdGF0aWNBbmRJbnN0YW5jZUNvbmZsaWN0U3RhdGljQW5kSW5zdGFuY2VDb25mbGljdENPTkZMSUNUSU5HX1NUQVRJQ19BTkRfSU5TVEFOQ0VUaGlzIHN0YXRpYyBtZW1iZXIgY29uZmxpY3RzIHdpdGggYW4gaW5zdGFuY2UgbWVtYmVyLmNvZGVTdGF0aWNBbmRJbnN0YW5jZUNvbmZsaWN0Q2F1c2VtZXNzYWdlU3RhdGljQW5kSW5zdGFuY2VDb25mbGljdENhdXNlU3RhdGljQW5kSW5zdGFuY2VDb25mbGljdENhdXNlVGhpcyBpcyB0aGUgaW5zdGFuY2UgbWVtYmVyLmNvZGVTdGF0aWNDb25zdHJ1Y3Rvcm1lc3NhZ2VTdGF0aWNDb25zdHJ1Y3RvclN0YXRpY0NvbnN0cnVjdG9yQ29uc3RydWN0b3JzIGNhbid0IGJlIHN0YXRpYy5UcnkgcmVtb3ZpbmcgdGhlIGtleXdvcmQgJ3N0YXRpYycuY29kZVN0YXRpY09wZXJhdG9ybWVzc2FnZVN0YXRpY09wZXJhdG9yU3RhdGljT3BlcmF0b3JPcGVyYXRvcnMgY2FuJ3QgYmUgc3RhdGljLmNvZGVTdXBlckFzRXhwcmVzc2lvbm1lc3NhZ2VTdXBlckFzRXhwcmVzc2lvblN1cGVyQXNFeHByZXNzaW9uU1VQRVJfQVNfRVhQUkVTU0lPTkNhbid0IHVzZSAnc3VwZXInIGFzIGFuIGV4cHJlc3Npb24uVG8gZGVsZWdhdGUgYSBjb25zdHJ1Y3RvciB0byBhIHN1cGVyIGNvbnN0cnVjdG9yLCBwdXQgdGhlIHN1cGVyIGNhbGwgYXMgYW4gaW5pdGlhbGl6ZXIuY29kZVN1cGVyQXNJZGVudGlmaWVybWVzc2FnZVN1cGVyQXNJZGVudGlmaWVyU3VwZXJBc0lkZW50aWZpZXJFeHBlY3RlZCBpZGVudGlmaWVyLCBidXQgZ290ICdzdXBlcicuY29kZVN1cGVySW5pdGlhbGl6ZXJOb3RMYXN0bWVzc2FnZVN1cGVySW5pdGlhbGl6ZXJOb3RMYXN0U3VwZXJJbml0aWFsaXplck5vdExhc3RJTlZBTElEX1NVUEVSX0lOVk9DQVRJT05DYW4ndCBoYXZlIGluaXRpYWxpemVycyBhZnRlciAnc3VwZXInLmNvZGVTdXBlck51bGxBd2FyZW1lc3NhZ2VTdXBlck51bGxBd2FyZVN1cGVyTnVsbEF3YXJlVGhlIG9wZXJhdG9yICc/LicgY2Fubm90IGJlIHVzZWQgd2l0aCAnc3VwZXInIGJlY2F1c2UgJ3N1cGVyJyBjYW5ub3QgYmUgbnVsbC5UcnkgcmVwbGFjaW5nICc/Licgd2l0aCAnLid0ZW1wbGF0ZVN1cGVyY2xhc3NIYXNOb0NvbnN0cnVjdG9yU3VwZXJjbGFzcyBoYXMgbm8gY29uc3RydWN0b3IgbmFtZWQgJyNuYW1lJy5jb2RlU3VwZXJjbGFzc0hhc05vQ29uc3RydWN0b3JTdXBlcmNsYXNzSGFzTm9Db25zdHJ1Y3RvclVOREVGSU5FRF9DT05TVFJVQ1RPUl9JTl9JTklUSUFMSVpFUlVOREVGSU5FRF9DT05TVFJVQ1RPUl9JTl9JTklUSUFMSVpFUl9ERUZBVUxUdGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9EZWZhdWx0Q29uc3RydWN0b3JUaGUgc3VwZXJjbGFzcywgJyNuYW1lJywgaGFzIG5vIHVubmFtZWQgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMuY29kZVN1cGVyY2xhc3NIYXNOb0RlZmF1bHRDb25zdHJ1Y3RvclN1cGVyY2xhc3NIYXNOb0RlZmF1bHRDb25zdHJ1Y3Rvck5PX0RFRkFVTFRfU1VQRVJfQ09OU1RSVUNUT1JfSU1QTElDSVR0ZW1wbGF0ZVN1cGVyY2xhc3NIYXNOb0dldHRlclN1cGVyY2xhc3MgaGFzIG5vIGdldHRlciBuYW1lZCAnI25hbWUnLmNvZGVTdXBlcmNsYXNzSGFzTm9HZXR0ZXJTdXBlcmNsYXNzSGFzTm9HZXR0ZXJVTkRFRklORURfU1VQRVJfR0VUVEVSdGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9NZXRob2RTdXBlcmNsYXNzIGhhcyBubyBtZXRob2QgbmFtZWQgJyNuYW1lJy5jb2RlU3VwZXJjbGFzc0hhc05vTWV0aG9kU3VwZXJjbGFzc0hhc05vTWV0aG9kVU5ERUZJTkVEX1NVUEVSX01FVEhPRHRlbXBsYXRlU3VwZXJjbGFzc0hhc05vU2V0dGVyU3VwZXJjbGFzcyBoYXMgbm8gc2V0dGVyIG5hbWVkICcjbmFtZScuY29kZVN1cGVyY2xhc3NIYXNOb1NldHRlclN1cGVyY2xhc3NIYXNOb1NldHRlclVOREVGSU5FRF9TVVBFUl9TRVRURVJ0ZW1wbGF0ZVN1cGVyY2xhc3NNZXRob2RBcmd1bWVudE1pc21hdGNoU3VwZXJjbGFzcyBkb2Vzbid0IGhhdmUgYSBtZXRob2QgbmFtZWQgJyNuYW1lJyB3aXRoIG1hdGNoaW5nIGFyZ3VtZW50cy5jb2RlU3VwZXJjbGFzc01ldGhvZEFyZ3VtZW50TWlzbWF0Y2hTdXBlcmNsYXNzTWV0aG9kQXJndW1lbnRNaXNtYXRjaGNvZGVTdXBlcnR5cGVJc0Z1bmN0aW9ubWVzc2FnZVN1cGVydHlwZUlzRnVuY3Rpb25TdXBlcnR5cGVJc0Z1bmN0aW9uQ2FuJ3QgdXNlIGEgZnVuY3Rpb24gdHlwZSBhcyBzdXBlcnR5cGUudGVtcGxhdGVTdXBlcnR5cGVJc0lsbGVnYWxUaGUgdHlwZSAnI25hbWUnIGNhbid0IGJlIHVzZWQgYXMgc3VwZXJ0eXBlLmNvZGVTdXBlcnR5cGVJc0lsbGVnYWxTdXBlcnR5cGVJc0lsbGVnYWxFWFRFTkRTX05PTl9DTEFTU3RlbXBsYXRlU3VwZXJ0eXBlSXNUeXBlVmFyaWFibGVUaGUgdHlwZSB2YXJpYWJsZSAnI25hbWUnIGNhbid0IGJlIHVzZWQgYXMgc3VwZXJ0eXBlLmNvZGVTdXBlcnR5cGVJc1R5cGVWYXJpYWJsZVN1cGVydHlwZUlzVHlwZVZhcmlhYmxlY29kZVN3aXRjaENhc2VGYWxsVGhyb3VnaG1lc3NhZ2VTd2l0Y2hDYXNlRmFsbFRocm91Z2hTd2l0Y2hDYXNlRmFsbFRocm91Z2hDQVNFX0JMT0NLX05PVF9URVJNSU5BVEVEU3dpdGNoIGNhc2UgbWF5IGZhbGwgdGhyb3VnaCB0byB0aGUgbmV4dCBjYXNlLnRlbXBsYXRlU3dpdGNoRXhwcmVzc2lvbk5vdEFzc2lnbmFibGVUeXBlICcjdHlwZScgb2YgdGhlIHN3aXRjaCBleHByZXNzaW9uIGlzbid0IGFzc2lnbmFibGUgdG8gdGhlIHR5cGUgJyN0eXBlMicgb2YgdGhpcyBjYXNlIGV4cHJlc3Npb24uY29kZVN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlU3dpdGNoRXhwcmVzc2lvbk5vdEFzc2lnbmFibGVTV0lUQ0hfRVhQUkVTU0lPTl9OT1RfQVNTSUdOQUJMRWNvZGVTd2l0Y2hFeHByZXNzaW9uTm90QXNzaWduYWJsZUNhdXNlbWVzc2FnZVN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlQ2F1c2VTd2l0Y2hFeHByZXNzaW9uTm90QXNzaWduYWJsZUNhdXNlVGhlIHN3aXRjaCBleHByZXNzaW9uIGlzIGhlcmUuY29kZVN3aXRjaEhhc0Nhc2VBZnRlckRlZmF1bHRtZXNzYWdlU3dpdGNoSGFzQ2FzZUFmdGVyRGVmYXVsdFN3aXRjaEhhc0Nhc2VBZnRlckRlZmF1bHRUaGUgZGVmYXVsdCBjYXNlIHNob3VsZCBiZSB0aGUgbGFzdCBjYXNlIGluIGEgc3dpdGNoIHN0YXRlbWVudC5UcnkgbW92aW5nIHRoZSBkZWZhdWx0IGNhc2UgYWZ0ZXIgdGhlIG90aGVyIGNhc2UgY2xhdXNlcy5jb2RlU3dpdGNoSGFzTXVsdGlwbGVEZWZhdWx0c21lc3NhZ2VTd2l0Y2hIYXNNdWx0aXBsZURlZmF1bHRzU3dpdGNoSGFzTXVsdGlwbGVEZWZhdWx0c1RoZSAnZGVmYXVsdCcgY2FzZSBjYW4gb25seSBiZSBkZWNsYXJlZCBvbmNlLlRyeSByZW1vdmluZyBhbGwgYnV0IG9uZSBkZWZhdWx0IGNhc2UuY29kZVN5bnRoZXRpY1Rva2VubWVzc2FnZVN5bnRoZXRpY1Rva2VuU3ludGhldGljVG9rZW5UaGlzIGNvdWxkbid0IGJlIHBhcnNlZC50ZW1wbGF0ZVRoaXNBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXJDYW4ndCBhY2Nlc3MgJ3RoaXMnIGluIGEgZmllbGQgaW5pdGlhbGl6ZXIgdG8gcmVhZCAnI25hbWUnLmNvZGVUaGlzQWNjZXNzSW5GaWVsZEluaXRpYWxpemVyVGhpc0FjY2Vzc0luRmllbGRJbml0aWFsaXplclRISVNfQUNDRVNTX0ZST01fRklFTERfSU5JVElBTElaRVJjb2RlVGhpc0FzSWRlbnRpZmllcm1lc3NhZ2VUaGlzQXNJZGVudGlmaWVyVGhpc0FzSWRlbnRpZmllcklOVkFMSURfUkVGRVJFTkNFX1RPX1RISVNFeHBlY3RlZCBpZGVudGlmaWVyLCBidXQgZ290ICd0aGlzJy5jb2RlVGhpc0luaXRpYWxpemVyTm90QWxvbmVtZXNzYWdlVGhpc0luaXRpYWxpemVyTm90QWxvbmVUaGlzSW5pdGlhbGl6ZXJOb3RBbG9uZUZJRUxEX0lOSVRJQUxJWkVSX1JFRElSRUNUSU5HX0NPTlNUUlVDVE9SQ2FuJ3QgaGF2ZSBvdGhlciBpbml0aWFsaXplcnMgdG9nZXRoZXIgd2l0aCAndGhpcycudGVtcGxhdGVUaGlzT3JTdXBlckFjY2Vzc0luRmllbGRJbml0aWFsaXplckNhbid0IGFjY2VzcyAnI3N0cmluZycgaW4gYSBmaWVsZCBpbml0aWFsaXplci5jb2RlVGhpc09yU3VwZXJBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXJUaGlzT3JTdXBlckFjY2Vzc0luRmllbGRJbml0aWFsaXplclRISVNfQUNDRVNTX0ZST01fSU5JVElBTElaRVJ0ZW1wbGF0ZVRvb0Zld0FyZ3VtZW50c1RvbyBmZXcgcG9zaXRpb25hbCBhcmd1bWVudHM6ICNjb3VudCByZXF1aXJlZCwgI2NvdW50MiBnaXZlbi5jb2RlVG9vRmV3QXJndW1lbnRzVG9vRmV3QXJndW1lbnRzTk9UX0VOT1VHSF9SRVFVSVJFRF9BUkdVTUVOVFN0ZW1wbGF0ZVRvb01hbnlBcmd1bWVudHNUb28gbWFueSBwb3NpdGlvbmFsIGFyZ3VtZW50czogI2NvdW50IGFsbG93ZWQsIGJ1dCAjY291bnQyIGZvdW5kLlRyeSByZW1vdmluZyB0aGUgZXh0cmEgcG9zaXRpb25hbCBhcmd1bWVudHMuY29kZVRvb01hbnlBcmd1bWVudHNUb29NYW55QXJndW1lbnRzY29kZVRvcExldmVsT3BlcmF0b3JtZXNzYWdlVG9wTGV2ZWxPcGVyYXRvclRvcExldmVsT3BlcmF0b3JPcGVyYXRvcnMgbXVzdCBiZSBkZWNsYXJlZCB3aXRoaW4gYSBjbGFzcy5UcnkgcmVtb3ZpbmcgdGhlIG9wZXJhdG9yLCBtb3ZpbmcgaXQgdG8gYSBjbGFzcywgb3IgY29udmVydGluZyBpdCB0byBiZSBhIGZ1bmN0aW9uLmNvZGVUeXBlQWZ0ZXJWYXJtZXNzYWdlVHlwZUFmdGVyVmFyVHlwZUFmdGVyVmFyVmFyaWFibGVzIGNhbid0IGJlIGRlY2xhcmVkIHVzaW5nIGJvdGggJ3ZhcicgYW5kIGEgdHlwZSBuYW1lLlRyeSByZW1vdmluZyAndmFyLid0ZW1wbGF0ZVR5cGVBcmd1bWVudE1pc21hdGNoRXhwZWN0ZWQgI2NvdW50IHR5cGUgYXJndW1lbnRzLmNvZGVUeXBlQXJndW1lbnRNaXNtYXRjaFR5cGVBcmd1bWVudE1pc21hdGNoV1JPTkdfTlVNQkVSX09GX1RZUEVfQVJHVU1FTlRTdGVtcGxhdGVUeXBlQXJndW1lbnRzT25UeXBlVmFyaWFibGVDYW4ndCB1c2UgdHlwZSBhcmd1bWVudHMgd2l0aCB0eXBlIHZhcmlhYmxlICcjbmFtZScuVHJ5IHJlbW92aW5nIHRoZSB0eXBlIGFyZ3VtZW50cy5jb2RlVHlwZUFyZ3VtZW50c09uVHlwZVZhcmlhYmxlVHlwZUFyZ3VtZW50c09uVHlwZVZhcmlhYmxlY29kZVR5cGVCZWZvcmVGYWN0b3J5bWVzc2FnZVR5cGVCZWZvcmVGYWN0b3J5VHlwZUJlZm9yZUZhY3RvcnlGYWN0b3J5IGNvbnN0cnVjdG9ycyBjYW5ub3QgaGF2ZSBhIHJldHVybiB0eXBlLlRyeSByZW1vdmluZyB0aGUgdHlwZSBhcHBlYXJpbmcgYmVmb3JlICdmYWN0b3J5Jy50ZW1wbGF0ZVR5cGVOb3RGb3VuZFR5cGUgJyNuYW1lJyBub3QgZm91bmQuY29kZVR5cGVOb3RGb3VuZFR5cGVOb3RGb3VuZFVOREVGSU5FRF9DTEFTU3RlbXBsYXRlVHlwZU9yaWdpbicjbmFtZScgaXMgZnJvbSAnI3VyaScuY29kZVR5cGVPcmlnaW5UeXBlT3JpZ2ludGVtcGxhdGVUeXBlT3JpZ2luV2l0aEZpbGVVcmknI25hbWUnIGlzIGZyb20gJyN1cmknICgnI3VyaTInKS5jb2RlVHlwZU9yaWdpbldpdGhGaWxlVXJpVHlwZU9yaWdpbldpdGhGaWxlVXJpY29kZVR5cGVWYXJpYWJsZUR1cGxpY2F0ZWROYW1lbWVzc2FnZVR5cGVWYXJpYWJsZUR1cGxpY2F0ZWROYW1lVHlwZVZhcmlhYmxlRHVwbGljYXRlZE5hbWVBIHR5cGUgdmFyaWFibGUgY2FuJ3QgaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIGFub3RoZXIudGVtcGxhdGVUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZUNhdXNlVGhlIG90aGVyIHR5cGUgdmFyaWFibGUgbmFtZWQgJyNuYW1lJy5jb2RlVHlwZVZhcmlhYmxlRHVwbGljYXRlZE5hbWVDYXVzZVR5cGVWYXJpYWJsZUR1cGxpY2F0ZWROYW1lQ2F1c2Vjb2RlVHlwZVZhcmlhYmxlSW5Db25zdGFudENvbnRleHRtZXNzYWdlVHlwZVZhcmlhYmxlSW5Db25zdGFudENvbnRleHRUeXBlVmFyaWFibGVJbkNvbnN0YW50Q29udGV4dFRZUEVfUEFSQU1FVEVSX0lOX0NPTlNUX0VYUFJFU1NJT05UeXBlIHZhcmlhYmxlcyBjYW4ndCBiZSB1c2VkIGFzIGNvbnN0YW50cy5jb2RlVHlwZVZhcmlhYmxlSW5TdGF0aWNDb250ZXh0bWVzc2FnZVR5cGVWYXJpYWJsZUluU3RhdGljQ29udGV4dFR5cGVWYXJpYWJsZUluU3RhdGljQ29udGV4dFR5cGUgdmFyaWFibGVzIGNhbid0IGJlIHVzZWQgaW4gc3RhdGljIG1lbWJlcnMuY29kZVR5cGVWYXJpYWJsZVNhbWVOYW1lQXNFbmNsb3NpbmdtZXNzYWdlVHlwZVZhcmlhYmxlU2FtZU5hbWVBc0VuY2xvc2luZ1R5cGVWYXJpYWJsZVNhbWVOYW1lQXNFbmNsb3NpbmdDT05GTElDVElOR19UWVBFX1ZBUklBQkxFX0FORF9DTEFTU0EgdHlwZSB2YXJpYWJsZSBjYW4ndCBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgaXRzIGVuY2xvc2luZyBkZWNsYXJhdGlvbi5jb2RlVHlwZWRlZkluQ2xhc3NtZXNzYWdlVHlwZWRlZkluQ2xhc3NUeXBlZGVmSW5DbGFzc1R5cGVkZWZzIGNhbid0IGJlIGRlY2xhcmVkIGluc2lkZSBjbGFzc2VzLlRyeSBtb3ZpbmcgdGhlIHR5cGVkZWYgdG8gdGhlIHRvcC1sZXZlbC5jb2RlVHlwZWRlZk5vdEZ1bmN0aW9ubWVzc2FnZVR5cGVkZWZOb3RGdW5jdGlvblR5cGVkZWZOb3RGdW5jdGlvbklOVkFMSURfR0VORVJJQ19GVU5DVElPTl9UWVBFQ2FuJ3QgY3JlYXRlIHR5cGVkZWYgZnJvbSBub24tZnVuY3Rpb24gdHlwZS50ZW1wbGF0ZVVuZGVmaW5lZEdldHRlclRoZSBnZXR0ZXIgJyNuYW1lJyBpc24ndCBkZWZpbmVkIGZvciB0aGUgY2xhc3MgJyN0eXBlJy5UcnkgY29ycmVjdGluZyB0aGUgbmFtZSB0byB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBnZXR0ZXIsIG9yIGRlZmluaW5nIGEgZ2V0dGVyIG9yIGZpZWxkIG5hbWVkICcjbmFtZScuY29kZVVuZGVmaW5lZEdldHRlclVuZGVmaW5lZEdldHRlcnRlbXBsYXRlVW5kZWZpbmVkTWV0aG9kVGhlIG1ldGhvZCAnI25hbWUnIGlzbid0IGRlZmluZWQgZm9yIHRoZSBjbGFzcyAnI3R5cGUnLlRyeSBjb3JyZWN0aW5nIHRoZSBuYW1lIHRvIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIG1ldGhvZCwgb3IgZGVmaW5pbmcgYSBtZXRob2QgbmFtZWQgJyNuYW1lJy5jb2RlVW5kZWZpbmVkTWV0aG9kVW5kZWZpbmVkTWV0aG9kdGVtcGxhdGVVbmRlZmluZWRTZXR0ZXJUaGUgc2V0dGVyICcjbmFtZScgaXNuJ3QgZGVmaW5lZCBmb3IgdGhlIGNsYXNzICcjdHlwZScuVHJ5IGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gdGhlIG5hbWUgb2YgYW4gZXhpc3Rpbmcgc2V0dGVyLCBvciBkZWZpbmluZyBhIHNldHRlciBvciBmaWVsZCBuYW1lZCAnI25hbWUnLmNvZGVVbmRlZmluZWRTZXR0ZXJVbmRlZmluZWRTZXR0ZXJjb2RlVW5leHBlY3RlZERvbGxhckluU3RyaW5nbWVzc2FnZVVuZXhwZWN0ZWREb2xsYXJJblN0cmluZ1VuZXhwZWN0ZWREb2xsYXJJblN0cmluZ1VORVhQRUNURURfRE9MTEFSX0lOX1NUUklOR0EgJyQnIGhhcyBzcGVjaWFsIG1lYW5pbmcgaW5zaWRlIGEgc3RyaW5nLCBhbmQgbXVzdCBiZSBmb2xsb3dlZCBieSBhbiBpZGVudGlmaWVyIG9yIGFuIGV4cHJlc3Npb24gaW4gY3VybHkgYnJhY2VzICh7fSkuVHJ5IGFkZGluZyBhIGJhY2tzbGFzaCAoXCkgdG8gZXNjYXBlIHRoZSAnJCcudGVtcGxhdGVVbmV4cGVjdGVkVG9rZW5VbmV4cGVjdGVkIHRva2VuICcjbGV4ZW1lJy5jb2RlVW5leHBlY3RlZFRva2VuVW5leHBlY3RlZFRva2VuVU5FWFBFQ1RFRF9UT0tFTnRlbXBsYXRlVW5tYXRjaGVkVG9rZW5DYW4ndCBmaW5kICcjc3RyaW5nJyB0byBtYXRjaCAnI2xleGVtZScuY29kZVVubWF0Y2hlZFRva2VuVW5tYXRjaGVkVG9rZW50ZW1wbGF0ZVVucmVzb2x2ZWRQcmVmaXhJblR5cGVBbm5vdGF0aW9uJyNuYW1lLiNuYW1lMicgY2FuJ3QgYmUgdXNlZCBhcyBhIHR5cGUgYmVjYXVzZSAnI25hbWUnIGlzbid0IGRlZmluZWQuY29kZVVucmVzb2x2ZWRQcmVmaXhJblR5cGVBbm5vdGF0aW9uVW5yZXNvbHZlZFByZWZpeEluVHlwZUFubm90YXRpb250ZW1wbGF0ZVVuc3BlY2lmaWVkI3N0cmluZ2NvZGVVbnNwZWNpZmllZFVuc3BlY2lmaWVkdGVtcGxhdGVVbnN1cHBvcnRlZE9wZXJhdG9yVGhlICcjbGV4ZW1lJyBvcGVyYXRvciBpcyBub3Qgc3VwcG9ydGVkLmNvZGVVbnN1cHBvcnRlZE9wZXJhdG9yVW5zdXBwb3J0ZWRPcGVyYXRvclVOU1VQUE9SVEVEX09QRVJBVE9SY29kZVVuc3VwcG9ydGVkUHJlZml4UGx1c21lc3NhZ2VVbnN1cHBvcnRlZFByZWZpeFBsdXNVbnN1cHBvcnRlZFByZWZpeFBsdXMnKycgaXMgbm90IGEgcHJlZml4IG9wZXJhdG9yLlRyeSByZW1vdmluZyAnKycuY29kZVVudGVybWluYXRlZENvbW1lbnRtZXNzYWdlVW50ZXJtaW5hdGVkQ29tbWVudFVudGVybWluYXRlZENvbW1lbnRVTlRFUk1JTkFURURfTVVMVElfTElORV9DT01NRU5UQ29tbWVudCBzdGFydGluZyB3aXRoICcvKicgbXVzdCBlbmQgd2l0aCAnKi8nLnRlbXBsYXRlVW50ZXJtaW5hdGVkU3RyaW5nU3RyaW5nIHN0YXJ0aW5nIHdpdGggI3N0cmluZyBtdXN0IGVuZCB3aXRoICNzdHJpbmcyLmNvZGVVbnRlcm1pbmF0ZWRTdHJpbmdVbnRlcm1pbmF0ZWRTdHJpbmdVTlRFUk1JTkFURURfU1RSSU5HX0xJVEVSQUxjb2RlVW50ZXJtaW5hdGVkVG9rZW5tZXNzYWdlVW50ZXJtaW5hdGVkVG9rZW5VbnRlcm1pbmF0ZWRUb2tlbkluY29tcGxldGUgdG9rZW4udGVtcGxhdGVVbnRyYW5zbGF0YWJsZVVyaU5vdCBmb3VuZDogJyN1cmknY29kZVVudHJhbnNsYXRhYmxlVXJpVW50cmFuc2xhdGFibGVVcml0ZW1wbGF0ZVVzZU9mRGVwcmVjYXRlZElkZW50aWZpZXInI25hbWUnIGlzIGRlcHJlY2F0ZWQuY29kZVVzZU9mRGVwcmVjYXRlZElkZW50aWZpZXJVc2VPZkRlcHJlY2F0ZWRJZGVudGlmaWVyY29kZVZhckFzVHlwZU5hbWVtZXNzYWdlVmFyQXNUeXBlTmFtZVZhckFzVHlwZU5hbWVUaGUga2V5d29yZCAndmFyJyBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZSBuYW1lLmNvZGVWYXJSZXR1cm5UeXBlbWVzc2FnZVZhclJldHVyblR5cGVWYXJSZXR1cm5UeXBlVGhlIHJldHVybiB0eXBlIGNhbid0IGJlICd2YXInLlRyeSByZW1vdmluZyB0aGUga2V5d29yZCAndmFyJywgb3IgcmVwbGFjaW5nIGl0IHdpdGggdGhlIG5hbWUgb2YgdGhlIHJldHVybiB0eXBlLmNvZGVWb2lkRXhwcmVzc2lvbm1lc3NhZ2VWb2lkRXhwcmVzc2lvblZvaWRFeHByZXNzaW9uVVNFX09GX1ZPSURfUkVTVUxUVGhpcyBleHByZXNzaW9uIGhhcyB0eXBlICd2b2lkJyBhbmQgY2FuJ3QgYmUgdXNlZC50ZW1wbGF0ZVdlYkxpdGVyYWxDYW5ub3RCZVJlcHJlc2VudGVkRXhhY3RseVRoZSBpbnRlZ2VyIGxpdGVyYWwgI3N0cmluZyBjYW4ndCBiZSByZXByZXNlbnRlZCBleGFjdGx5IGluIEphdmFTY3JpcHQuVHJ5IGNoYW5naW5nIHRoZSBsaXRlcmFsIHRvIHNvbWV0aGluZyB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCBpbiBKYXZhc2NyaXB0LiBJbiBKYXZhc2NyaXB0ICNzdHJpbmcyIGlzIHRoZSBuZWFyZXN0IHZhbHVlIHRoYXQgY2FuIGJlIHJlcHJlc2VudGVkIGV4YWN0bHkuY29kZVdlYkxpdGVyYWxDYW5ub3RCZVJlcHJlc2VudGVkRXhhY3RseVdlYkxpdGVyYWxDYW5ub3RCZVJlcHJlc2VudGVkRXhhY3RseWNvZGVXaXRoQmVmb3JlRXh0ZW5kc21lc3NhZ2VXaXRoQmVmb3JlRXh0ZW5kc1dpdGhCZWZvcmVFeHRlbmRzVGhlIGV4dGVuZHMgY2xhdXNlIG11c3QgYmUgYmVmb3JlIHRoZSB3aXRoIGNsYXVzZS5UcnkgbW92aW5nIHRoZSBleHRlbmRzIGNsYXVzZSBiZWZvcmUgdGhlIHdpdGggY2xhdXNlLmNvZGVZaWVsZEFzSWRlbnRpZmllcm1lc3NhZ2VZaWVsZEFzSWRlbnRpZmllcllpZWxkQXNJZGVudGlmaWVyJ3lpZWxkJyBjYW4ndCBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIgaW4gJ2FzeW5jJywgJ2FzeW5jKicsIG9yICdzeW5jKicgbWV0aG9kcy5jb2RlWWllbGROb3RHZW5lcmF0b3JtZXNzYWdlWWllbGROb3RHZW5lcmF0b3JZaWVsZE5vdEdlbmVyYXRvcllJRUxEX0lOX05PTl9HRU5FUkFUT1IneWllbGQnIGNhbiBvbmx5IGJlIHVzZWQgaW4gJ3N5bmMqJyBvciAnYXN5bmMqJyBtZXRob2RzLml0ZW1pemVOYW1lc25hbWVzIC0gX3dpdGhBcmd1bWVudHNBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbk5vIG5hbWUgcHJvdmlkZWRUaGUgY2xhc3MgJycgaXMgYWJzdHJhY3QgYW5kIGNhbid0IGJlIGluc3RhbnRpYXRlZC5fd2l0aEFyZ3VtZW50c0Fic3RyYWN0UmVkaXJlY3RlZENsYXNzSW5zdGFudGlhdGlvbkZhY3RvcnkgcmVkaXJlY3RzIHRvIGNsYXNzICcnLCB3aGljaCBpcyBhYnN0cmFjdCBhbmQgY2FuJ3QgYmUgaW5zdGFudGlhdGVkLl93aXRoQXJndW1lbnRzQWNjZXNzRXJyb3JBY2Nlc3MgZXJyb3I6ICdfd2l0aEFyZ3VtZW50c0FtYmlndW91c1N1cGVydHlwZXNfdHlwZV90eXBlMmxhYmVsZXJ0eXBlUGFydHNsYWJlbFR5cGV0eXBlMlBhcnRzdHlwZTInIGNhbid0IGltcGxlbWVudCBib3RoICcnIGFuZCAnb3JpZ2luTWVzc2FnZXNfd2l0aEFyZ3VtZW50c0FyZ3VtZW50VHlwZU5vdEFzc2lnbmFibGVUaGUgYXJndW1lbnQgdHlwZSAnJyBjYW4ndCBiZSBhc3NpZ25lZCB0byB0aGUgcGFyYW1ldGVyIHR5cGUgJ1RyeSBjaGFuZ2luZyB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyLCBvciBjYXN0aW5nIHRoZSBhcmd1bWVudCB0byAnX3dpdGhBcmd1bWVudHNBc2NpaUNvbnRyb2xDaGFyYWN0ZXJjb2RlUG9pbnR1bmljb2RlVSt0b1VwcGVyQ2FzZXBhZExlZnRUaGUgY29udHJvbCBjaGFyYWN0ZXIgIGNhbiBvbmx5IGJlIHVzZWQgaW4gc3RyaW5ncyBhbmQgY29tbWVudHMuX3dpdGhBcmd1bWVudHNCb3VuZElzc3VlVmlhQ3ljbGVOb25TaW1wbGljaXR5bmFtZTJHZW5lcmljIHR5cGUgJycgY2FuJ3QgYmUgdXNlZCB3aXRob3V0IHR5cGUgYXJndW1lbnRzIGluIHRoZSBib3VuZHMgb2YgaXRzIG93biB0eXBlIHZhcmlhYmxlcy4gSXQgaXMgcmVmZXJlbmNlZCBpbmRpcmVjdGx5IHRocm91Z2ggJ1RyeSBwcm92aWRpbmcgdHlwZSBhcmd1bWVudHMgdG8gJycgaGVyZSBvciB0byBzb21lIG90aGVyIHJhdyB0eXBlcyBpbiB0aGUgYm91bmRzIGFsb25nIHRoZSByZWZlcmVuY2UgY2hhaW4uX3dpdGhBcmd1bWVudHNCb3VuZElzc3VlVmlhTG9vcE5vblNpbXBsaWNpdHknIGNhbid0IGJlIHVzZWQgd2l0aG91dCB0eXBlIGFyZ3VtZW50cyBpbiB0aGUgYm91bmRzIG9mIGl0cyBvd24gdHlwZSB2YXJpYWJsZXMuJyBoZXJlLl93aXRoQXJndW1lbnRzQm91bmRJc3N1ZVZpYVJhd1R5cGVXaXRoTm9uU2ltcGxlQm91bmRzJyBjYW4ndCBiZSB1c2VkIHdpdGhvdXQgdHlwZSBhcmd1bWVudHMgaW4gYSB0eXBlIHZhcmlhYmxlIGJvdW5kLl93aXRoQXJndW1lbnRzQnJlYWtUYXJnZXRPdXRzaWRlRnVuY3Rpb25DYW4ndCBicmVhayB0byAnJyBpbiBhIGRpZmZlcmVudCBmdW5jdGlvbi5fd2l0aEFyZ3VtZW50c0J1aWx0SW5JZGVudGlmaWVyQXNUeXBldG9rZW5UaGUgYnVpbHQtaW4gaWRlbnRpZmllciAnJyBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZS5fd2l0aEFyZ3VtZW50c0J1aWx0SW5JZGVudGlmaWVySW5EZWNsYXJhdGlvbkNhbid0IHVzZSAnJyBhcyBhIG5hbWUgaGVyZS5fd2l0aEFyZ3VtZW50c0NhbmRpZGF0ZUZvdW5kSXNEZWZhdWx0Q29uc3RydWN0b3InIGhhcyBhIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzLl93aXRoQXJndW1lbnRzQ2Fubm90UmVhZFNka1NwZWNpZmljYXRpb25ObyBzdHJpbmcgcHJvdmlkZWRVbmFibGUgdG8gcmVhZCB0aGUgJ2xpYnJhcmllcy5qc29uJyBzcGVjaWZpY2F0aW9uIGZpbGU6CiAgX3dpdGhBcmd1bWVudHNDYW50SW5mZXJUeXBlRHVlVG9DaXJjdWxhcml0eUNhbid0IGluZmVyIHRoZSB0eXBlIG9mICcnOiBjaXJjdWxhcml0eSBmb3VuZCBkdXJpbmcgdHlwZSBpbmZlcmVuY2UuX3dpdGhBcmd1bWVudHNDYW50SW5mZXJUeXBlRHVlVG9JbmNvbnNpc3RlbnRPdmVycmlkZXNDYW4ndCBpbmZlciBhIHR5cGUgZm9yICcnIGFzIHNvbWUgb2YgdGhlIGluaGVyaXRlZCBtZW1iZXJzIGhhdmUgZGlmZmVyZW50IHR5cGVzLl93aXRoQXJndW1lbnRzQ2FudFJlYWRGaWxldXJpX0Vycm9yIHdoZW4gcmVhZGluZyAnJzogX3dpdGhBcmd1bWVudHNDYW50VXNlRGVmZXJyZWRQcmVmaXhBc0NvbnN0YW50JyBjYW4ndCBiZSB1c2VkIGluIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBiZWNhdXNlIGl0J3MgbWFya2VkIGFzICdkZWZlcnJlZCcgd2hpY2ggbWVhbnMgaXQgaXNuJ3QgYXZhaWxhYmxlIHVudGlsIGxvYWRlZC5fd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhDb25zdHJ1Y3RvckNvbmZsaWN0cyB3aXRoIGNvbnN0cnVjdG9yICdfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhGYWN0b3J5Q29uZmxpY3RzIHdpdGggZmFjdG9yeSAnX3dpdGhBcmd1bWVudHNDb25mbGljdHNXaXRoTWVtYmVyQ29uZmxpY3RzIHdpdGggbWVtYmVyICdfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhNZW1iZXJXYXJuaW5nX3dpdGhBcmd1bWVudHNDb25mbGljdHNXaXRoU2V0dGVyQ29uZmxpY3RzIHdpdGggc2V0dGVyICdfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhTZXR0ZXJXYXJuaW5nX3dpdGhBcmd1bWVudHNDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlQ29uZmxpY3RzIHdpdGggdHlwZSB2YXJpYWJsZSAnX3dpdGhBcmd1bWVudHNDb25zdEV2YWxEZWZlcnJlZExpYnJhcnlfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbER1cGxpY2F0ZUVsZW1lbnRfY29uc3RhbnRjb25zdGFudFBhcnRzbGFiZWxDb25zdGFudFRoZSBlbGVtZW50ICcnIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgZXhpc3RpbmcgZWxlbWVudCBpbiB0aGUgc2V0Ll93aXRoQXJndW1lbnRzQ29uc3RFdmFsRHVwbGljYXRlS2V5VGhlIGtleSAnJyBjb25mbGljdHMgd2l0aCBhbm90aGVyIGV4aXN0aW5nIGtleSBpbiB0aGUgbWFwLl93aXRoQXJndW1lbnRzQ29uc3RFdmFsRWxlbWVudEltcGxlbWVudHNFcXVhbCcgZG9lcyBub3QgaGF2ZSBhIHByaW1pdGl2ZSBvcGVyYXRvciAnPT0nLl93aXRoQXJndW1lbnRzQ29uc3RFdmFsRmFpbGVkQXNzZXJ0aW9uV2l0aE1lc3NhZ2VUaGlzIGFzc2VydGlvbiBmYWlsZWQgd2l0aCBtZXNzYWdlOiBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEZyZWVUeXBlUGFyYW1ldGVyVGhlIHR5cGUgJycgaXMgbm90IGEgY29uc3RhbnQgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIGEgdHlwZSBwYXJhbWV0ZXIsIG9ubHkgaW5zdGFudGlhdGVkIHR5cGVzIGFyZSBhbGxvd2VkLl93aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZEJpbmFyeU9wZXJhbmRUeXBlQmluYXJ5IG9wZXJhdG9yICcnIG9uICcnIHJlcXVpcmVzIG9wZXJhbmQgb2YgdHlwZSAnJywgYnV0IHdhcyBvZiB0eXBlICdfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRFcXVhbHNPcGVyYW5kVHlwZUJpbmFyeSBvcGVyYXRvciAnPT0nIHJlcXVpcmVzIHJlY2VpdmVyIGNvbnN0YW50ICcnIG9mIHR5cGUgJ051bGwnLCAnYm9vbCcsICdpbnQnLCAnZG91YmxlJywgb3IgJ1N0cmluZycsIGJ1dCB3YXMgb2YgdHlwZSAnX3dpdGhBcmd1bWVudHNDb25zdEV2YWxJbnZhbGlkTWV0aG9kSW52b2NhdGlvblRoZSBtZXRob2QgJycgY2FuJ3QgYmUgaW52b2tlZCBvbiAnJyB3aXRoaW4gYSBjb25zdCBjb250ZXh0Ll93aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZFByb3BlcnR5R2V0VGhlIHByb3BlcnR5ICcnIGNhbid0IGJlIGFjY2Vzc2VkIG9uICdfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRTdGF0aWNJbnZvY2F0aW9uVGhlIGludm9jYXRpb24gb2YgJycgaXMgbm90IGFsbG93ZWQgd2l0aGluIGEgY29uc3QgY29udGV4dC5fd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRTdHJpbmdJbnRlcnBvbGF0aW9uT3BlcmFuZFRoZSAnJyBjYW4ndCBiZSB1c2VkIGFzIHBhcnQgb2YgYSBzdHJpbmcgaW50ZXJwb2xhdGlvbiB3aXRoaW4gYSBjb25zdCBjb250ZXh0LCBvbmx5IHZhbHVlcyBvZiB0eXBlICdudWxsJywgJ2Jvb2wnLCAnaW50JywgJ2RvdWJsZScsIG9yICdTdHJpbmcnIGNhbiBiZSB1c2VkLl93aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZFN5bWJvbE5hbWVUaGUgc3ltYm9sIG5hbWUgbXVzdCBiZSBhIHZhbGlkIHB1YmxpYyBEYXJ0IG1lbWJlciBuYW1lLCBwdWJsaWMgY29uc3RydWN0b3IgbmFtZSwgb3IgbGlicmFyeSBuYW1lLCBvcHRpb25hbGx5IHF1YWxpZmllZCwgYnV0IHdhcyAnX3dpdGhBcmd1bWVudHNDb25zdEV2YWxJbnZhbGlkVHlwZUV4cGVjdGVkIGNvbnN0YW50ICcnIHRvIGJlIG9mIHR5cGUgJ193aXRoQXJndW1lbnRzQ29uc3RFdmFsS2V5SW1wbGVtZW50c0VxdWFsX3dpdGhBcmd1bWVudHNDb25zdEV2YWxOZWdhdGl2ZVNoaWZ0c3RyaW5nMnN0cmluZzMnIHJlcXVpcmVzIG5vbi1uZWdhdGl2ZSBvcGVyYW5kLCBidXQgd2FzICdfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbE5vbkNvbnN0YW50TGl0ZXJhbENhbid0IGhhdmUgYSBub24tY29uc3RhbnQgIGxpdGVyYWwgd2l0aGluIGEgY29uc3QgY29udGV4dC5fd2l0aEFyZ3VtZW50c0NvbnN0RXZhbE5vbkNvbnN0YW50VmFyaWFibGVHZXRUaGUgdmFyaWFibGUgJycgaXMgbm90IGEgY29uc3RhbnQsIG9ubHkgY29uc3RhbnQgZXhwcmVzc2lvbnMgYXJlIGFsbG93ZWQuX3dpdGhBcmd1bWVudHNDb25zdEV2YWxaZXJvRGl2aXNvcicgcmVxdWlyZXMgbm9uLXplcm8gZGl2aXNvciwgYnV0IGRpdmlzb3Igd2FzICcwJy5fd2l0aEFyZ3VtZW50c0NvbnN0RmllbGRXaXRob3V0SW5pdGlhbGl6ZXJUaGUgY29uc3QgdmFyaWFibGUgJycgbXVzdCBiZSBpbml0aWFsaXplZC5fd2l0aEFyZ3VtZW50c0NvbnN0cnVjdG9yTm90Rm91bmRDb3VsZG4ndCBmaW5kIGNvbnN0cnVjdG9yICdfd2l0aEFyZ3VtZW50c0NvbnN0cnVjdG9yV2l0aFdyb25nTmFtZUNvbnRleHRUaGUgbmFtZSBvZiB0aGUgZW5jbG9zaW5nIGNsYXNzIGlzICdfd2l0aEFyZ3VtZW50c0NvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uQ2FuJ3QgY29udGludWUgYXQgJ193aXRoQXJndW1lbnRzQ291bGROb3RQYXJzZVVyaUNvdWxkbid0IHBhcnNlIFVSSSAnJzoKICBfd2l0aEFyZ3VtZW50c0N5Y2xlSW5UeXBlVmFyaWFibGVzVHlwZSAnJyBpcyBhIGJvdW5kIG9mIGl0c2VsZiB2aWEgJ193aXRoQXJndW1lbnRzQ3ljbGljQ2xhc3NIaWVyYXJjaHknIGlzIGEgc3VwZXJ0eXBlIG9mIGl0c2VsZi5fd2l0aEFyZ3VtZW50c0N5Y2xpY1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yc0N5Y2xpYyBkZWZpbml0aW9uIG9mIGZhY3RvcnkgJ193aXRoQXJndW1lbnRzQ3ljbGljVHlwZWRlZlRoZSB0eXBlZGVmICcnIGhhcyBhIHJlZmVyZW5jZSB0byBpdHNlbGYuX3dpdGhBcmd1bWVudHNEZWZhdWx0VmFsdWVJblJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yQ2FuJ3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgaGVyZSBiZWNhdXNlIGFueSBkZWZhdWx0IHZhbHVlcyBvZiAnJyB3b3VsZCBiZSB1c2VkIGluc3RlYWQuX3dpdGhBcmd1bWVudHNEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWRDYW4ndCB1c2UgdGhlIG5hbWUgJycgZm9yIGEgZGVmZXJyZWQgbGlicmFyeSwgYXMgdGhlIG5hbWUgaXMgdXNlZCBlbHNld2hlcmUuX3dpdGhBcmd1bWVudHNEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWRDYXVzZScgaXMgdXNlZCBoZXJlLl93aXRoQXJndW1lbnRzRGVmZXJyZWRUeXBlQW5ub3RhdGlvbicgaXMgZGVmZXJyZWQgbG9hZGVkIHZpYSBwcmVmaXggJycgYW5kIGNhbid0IGJlIHVzZWQgYXMgYSB0eXBlIGFubm90YXRpb24uVHJ5IHJlbW92aW5nICdkZWZlcnJlZCcgZnJvbSB0aGUgaW1wb3J0IG9mICcnIG9yIHVzZSBhIHN1cGVydHlwZSBvZiAnJyB0aGF0IGlzbid0IGRlZmVycmVkLl93aXRoQXJndW1lbnRzRGlsbE91dGxpbmVTdW1tYXJ5Y291bnQyX251bTFfbnVtMl9udW0zTm8gY291bnQgcHJvdmlkZWRObyBudW1iZXIgcHJvdmlkZWRudW0xbnVtMm51bTNJbmRleGVkICBsaWJyYXJpZXMgKCBieXRlcykgaW4gbXMsIHRoYXQgaXMsCiBieXRlcy9tcywgYW5kCiBtcy9saWJyYXJpZXMuX3dpdGhBcmd1bWVudHNEaXJlY3RDeWNsZUluVHlwZVZhcmlhYmxlcycgY2FuJ3QgdXNlIGl0c2VsZiBhcyBhIGJvdW5kLl93aXRoQXJndW1lbnRzRHVwbGljYXRlTGFiZWxJblN3aXRjaFN0YXRlbWVudFRoZSBsYWJlbCAnJyB3YXMgYWxyZWFkeSB1c2VkIGluIHRoaXMgc3dpdGNoIHN0YXRlbWVudC5fd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWREZWNsYXJhdGlvbicgaXMgYWxyZWFkeSBkZWNsYXJlZCBpbiB0aGlzIHNjb3BlLl93aXRoQXJndW1lbnRzRHVwbGljYXRlZERlY2xhcmF0aW9uQ2F1c2VQcmV2aW91cyBkZWNsYXJhdGlvbiBvZiAnX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkRGVjbGFyYXRpb25TeW50aGV0aWNDYXVzZScgaXMgaW1wbGllZCBieSB0aGlzIGRlZmluaXRpb24uX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2UnIGJlY2F1c2UgaXQgaXMgZGVjbGFyZWQgbW9yZSB0aGFuIG9uY2UuX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkRXhwb3J0dXJpMl91cmkyJyBpcyBleHBvcnRlZCBmcm9tIGJvdGggJ193aXRoQXJndW1lbnRzRHVwbGljYXRlZEV4cG9ydEluVHlwZV93aXRoQXJndW1lbnRzRHVwbGljYXRlZEltcG9ydCcgaXMgaW1wb3J0ZWQgZnJvbSBib3RoICdfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRJbXBvcnRJblR5cGVfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRMaWJyYXJ5RXhwb3J0QSBsaWJyYXJ5IHdpdGggbmFtZSAnJyBpcyBleHBvcnRlZCBtb3JlIHRoYW4gb25jZS5fd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRMaWJyYXJ5RXhwb3J0Q29udGV4dCcgaXMgYWxzbyBleHBvcnRlZCBoZXJlLl93aXRoQXJndW1lbnRzRHVwbGljYXRlZExpYnJhcnlJbXBvcnQnIGlzIGltcG9ydGVkIG1vcmUgdGhhbiBvbmNlLl93aXRoQXJndW1lbnRzRHVwbGljYXRlZExpYnJhcnlJbXBvcnRDb250ZXh0JyBpcyBhbHNvIGltcG9ydGVkIGhlcmUuX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkTW9kaWZpZXJUaGUgbW9kaWZpZXIgJycgd2FzIGFscmVhZHkgc3BlY2lmaWVkLl93aXRoQXJndW1lbnRzRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZENhbid0IGRlY2xhcmUgJycgYmVjYXVzZSBpdCB3YXMgYWxyZWFkeSB1c2VkIGluIHRoaXMgc2NvcGUuX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkTmFtZVByZXZpb3VzbHlVc2VkQ2F1c2VQcmV2aW91cyB1c2Ugb2YgJ193aXRoQXJndW1lbnRzRHVwbGljYXRlZE5hbWVkQXJndW1lbnREdXBsaWNhdGVkIG5hbWVkIGFyZ3VtZW50ICdfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lRHVwbGljYXRlZCBwYXJhbWV0ZXIgbmFtZSAnX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZUNhdXNlT3RoZXIgcGFyYW1ldGVyIG5hbWVkICdfd2l0aEFyZ3VtZW50c0VudW1Db25zdGFudFNhbWVOYW1lQXNFbmNsb3NpbmdOYW1lIG9mIGVudW0gY29uc3RhbnQgJycgY2FuJ3QgYmUgdGhlIHNhbWUgYXMgdGhlIGVudW0ncyBvd24gbmFtZS5fd2l0aEFyZ3VtZW50c0V4cGVjdGVkQWZ0ZXJCdXRHb3RFeHBlY3RlZCAnJyBhZnRlciB0aGlzLl93aXRoQXJndW1lbnRzRXhwZWN0ZWRCdXRHb3QnIGJlZm9yZSB0aGlzLl93aXRoQXJndW1lbnRzRXhwZWN0ZWRDbGFzc0JvZHlUb1NraXBFeHBlY3RlZCBhIGNsYXNzIG9yIG1peGluIGJvZHksIGJ1dCBnb3QgJ193aXRoQXJndW1lbnRzRXhwZWN0ZWRDbGFzc01lbWJlckV4cGVjdGVkIGEgY2xhc3MgbWVtYmVyLCBidXQgZ290ICdfd2l0aEFyZ3VtZW50c0V4cGVjdGVkQ2xhc3NPck1peGluQm9keV93aXRoQXJndW1lbnRzRXhwZWN0ZWREZWNsYXJhdGlvbkV4cGVjdGVkIGEgZGVjbGFyYXRpb24sIGJ1dCBnb3QgJ193aXRoQXJndW1lbnRzRXhwZWN0ZWRFbnVtQm9keUV4cGVjdGVkIGEgZW51bSBib2R5LCBidXQgZ290ICdfd2l0aEFyZ3VtZW50c0V4cGVjdGVkRnVuY3Rpb25Cb2R5RXhwZWN0ZWQgYSBmdW5jdGlvbiBib2R5LCBidXQgZ290ICdfd2l0aEFyZ3VtZW50c0V4cGVjdGVkSWRlbnRpZmllckV4cGVjdGVkIGFuIGlkZW50aWZpZXIsIGJ1dCBnb3QgJ193aXRoQXJndW1lbnRzRXhwZWN0ZWRJbnN0ZWFkJyBpbnN0ZWFkIG9mIHRoaXMuX3dpdGhBcmd1bWVudHNFeHBlY3RlZFN0cmluZ0V4cGVjdGVkIGEgU3RyaW5nLCBidXQgZ290ICdfd2l0aEFyZ3VtZW50c0V4cGVjdGVkVG9rZW5FeHBlY3RlZCB0byBmaW5kICdfd2l0aEFyZ3VtZW50c0V4cGVjdGVkVHlwZUV4cGVjdGVkIGEgdHlwZSwgYnV0IGdvdCAnX3dpdGhBcmd1bWVudHNFeHBlcmltZW50Tm90RW5hYmxlZFRoaXMgcmVxdWlyZXMgdGhlIC0tIGV4cGVyaW1lbnQgdG8gYmUgZW5hYmxlZC5fd2l0aEFyZ3VtZW50c0V4cG9ydEhpZGVzRXhwb3J0RXhwb3J0IG9mICcnIChmcm9tICcnKSBoaWRlcyBleHBvcnQgZnJvbSAnX3dpdGhBcmd1bWVudHNFeHRlbmRpbmdFbnVtJyBpcyBhbiBlbnVtIGFuZCBjYW4ndCBiZSBleHRlbmRlZCBvciBpbXBsZW1lbnRlZC5fd2l0aEFyZ3VtZW50c0V4dGVuZGluZ1Jlc3RyaWN0ZWQnIGlzIHJlc3RyaWN0ZWQgYW5kIGNhbid0IGJlIGV4dGVuZGVkIG9yIGltcGxlbWVudGVkLl93aXRoQXJndW1lbnRzRXh0cmFuZW91c01vZGlmaWVyQ2FuJ3QgaGF2ZSBtb2RpZmllciAnVHJ5IHJlbW92aW5nICdfd2l0aEFyZ3VtZW50c0Zhc3RhQ0xJQXJndW1lbnRSZXF1aXJlZEV4cGVjdGVkIHZhbHVlIGFmdGVyICdfd2l0aEFyZ3VtZW50c0ZmaUZpZWxkQW5ub3RhdGlvbkZpZWxkICcnIHJlcXVpcmVzIGV4YWN0bHkgb25lIGFubm90YXRpb24gdG8gZGVjbGFyZSBpdHMgQysrIHR5cGUsIHdoaWNoIGNhbm5vdCBiZSBWb2lkLiBkYXJ0OmZmaSBzdHJ1Y3RzIChQb2ludGVyPFZvaWQ+KSBjYW5ub3QgaGF2ZSByZWd1bGFyIERhcnQgZmllbGRzLl93aXRoQXJndW1lbnRzRmZpRmllbGRJbml0aWFsaXplcicgaXMgYSBkYXJ0OmZmaSBQb2ludGVyIHRvIGEgc3RydWN0IGZpZWxkIGFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIGluaXRpYWxpemVkIGJlZm9yZSBjb25zdHJ1Y3RvciBleGVjdXRpb24uX3dpdGhBcmd1bWVudHNGZmlOb3RTdGF0aWMgZXhwZWN0cyBhIHN0YXRpYyBmdW5jdGlvbiBhcyBwYXJhbWV0ZXIuIGRhcnQ6ZmZpIG9ubHkgc3VwcG9ydHMgY2FsbGluZyBzdGF0aWMgRGFydCBmdW5jdGlvbnMgZnJvbSBjLl93aXRoQXJndW1lbnRzRmZpU3RydWN0QW5ub3RhdGlvbkNsYXNzICcnIGlzIGEgZGFydDpmZmkgUG9pbnRlciBidXQgaGFzIG5vIHN0cnVjdCBhbm5vdGF0aW9uLiBPbmx5IHN0cnVjdCBQb2ludGVycyBjYW4gaGF2ZSBmaWVsZHMuX3dpdGhBcmd1bWVudHNGZmlUeXBlSW52YWxpZEV4cGVjdGVkIHR5cGUgJycgdG8gYmUgYSB2YWxpZCBhbmQgaW5zdGFudGlhdGVkIHN1YnR5cGUgb2YgJ05hdGl2ZVR5cGUnLl93aXRoQXJndW1lbnRzRmZpVHlwZU1pc21hdGNoX3R5cGUzdHlwZTNQYXJ0c3R5cGUzJyB0byBiZSAnJywgd2hpY2ggaXMgdGhlIERhcnQgdHlwZSBjb3JyZXNwb25kaW5nIHRvICdfd2l0aEFyZ3VtZW50c0ZmaVR5cGVVbnNpemVkTWV0aG9kICcnIGNhbm5vdCBiZSBjYWxsZWQgb24gc29tZXRoaW5nIG9mIHR5cGUgJycgYXMgdGhpcyB0eXBlIGlzIHVuc2l6ZWQuX3dpdGhBcmd1bWVudHNGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWRGaW5hbCBmaWVsZCAnJyBpcyBub3QgaW5pdGlhbGl6ZWQuX3dpdGhBcmd1bWVudHNGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWRCeUNvbnN0cnVjdG9yJyBpcyBub3QgaW5pdGlhbGl6ZWQgYnkgdGhpcyBjb25zdHJ1Y3Rvci5fd2l0aEFyZ3VtZW50c0ZpbmFsRmllbGRXaXRob3V0SW5pdGlhbGl6ZXJUaGUgZmluYWwgdmFyaWFibGUgJ193aXRoQXJndW1lbnRzRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkJyBpcyBhIGZpbmFsIGluc3RhbmNlIHZhcmlhYmxlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC5fd2l0aEFyZ3VtZW50c0ZpbmFsSW5zdGFuY2VWYXJpYWJsZUFscmVhZHlJbml0aWFsaXplZENhdXNlJyB3YXMgaW5pdGlhbGl6ZWQgaGVyZS5fd2l0aEFyZ3VtZW50c0ZvckluTG9vcEVsZW1lbnRUeXBlTm90QXNzaWduYWJsZUEgdmFsdWUgb2YgdHlwZSAnJyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ193aXRoQXJndW1lbnRzRm9ySW5Mb29wVHlwZU5vdEl0ZXJhYmxlJyB1c2VkIGluIHRoZSAnZm9yJyBsb29wIG11c3QgaW1wbGVtZW50ICdfd2l0aEFyZ3VtZW50c0dlbmVyaWNGdW5jdGlvblR5cGVJbmZlcnJlZEFzQWN0dWFsVHlwZUFyZ3VtZW50VW5leHBlY3RlZCBnZW5lcmljIGZ1bmN0aW9uIHR5cGUgJycgaW5mZXJyZWQgYXMgYSB0eXBlIGFyZ3VtZW50Ll93aXRoQXJndW1lbnRzR2V0dGVyTm90Rm91bmRHZXR0ZXIgbm90IGZvdW5kOiAnX3dpdGhBcmd1bWVudHNJbGxlZ2FsTWl4aW4nIGNhbid0IGJlIG1peGVkIGluLl93aXRoQXJndW1lbnRzSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnMnIGFzIGEgbWl4aW4gYmVjYXVzZSBpdCBoYXMgY29uc3RydWN0b3JzLl93aXRoQXJndW1lbnRzSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnNDYXVzZVRoaXMgY29uc3RydWN0b3IgcHJldmVudHMgdXNpbmcgJycgYXMgYSBtaXhpbi5fd2l0aEFyZ3VtZW50c0ltcGxlbWVudHNSZXBlYXRlZCcgY2FuIG9ubHkgYmUgaW1wbGVtZW50ZWQgb25jZS5UcnkgcmVtb3ZpbmcgIG9mIHRoZSBvY2N1cnJlbmNlcy5fd2l0aEFyZ3VtZW50c0ltcGxlbWVudHNTdXBlckNsYXNzJyBjYW4ndCBiZSB1c2VkIGluIGJvdGggJ2V4dGVuZHMnIGFuZCAnaW1wbGVtZW50cycgY2xhdXNlcy5fd2l0aEFyZ3VtZW50c0ltcGxpY2l0Q2FsbE9mTm9uTWV0aG9kQ2Fubm90IGludm9rZSBhbiBpbnN0YW5jZSBvZiAnJyBiZWNhdXNlIGl0IGRlY2xhcmVzICdjYWxsJyB0byBiZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIG1ldGhvZC5fd2l0aEFyZ3VtZW50c0ltcGxpY2l0TWl4aW5PdmVycmlkZUNvbnRleHRPdmVycmlkZSB3YXMgaW50cm9kdWNlZCB3aGVuIHRoZSBtaXhpbiAnJyB3YXMgYXBwbGllZCB0byAnX3dpdGhBcmd1bWVudHNJbXBvcnRIaWRlc0ltcG9ydEltcG9ydCBvZiAnJykgaGlkZXMgaW1wb3J0IGZyb20gJ193aXRoQXJndW1lbnRzSW5jb21wYXRpYmxlUmVkaXJlY3RlZUZ1bmN0aW9uVHlwZVRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB0eXBlICcnIGlzbid0IGEgc3VidHlwZSBvZiAnX3dpdGhBcmd1bWVudHNJbmNvcnJlY3RUeXBlQXJndW1lbnRUeXBlIGFyZ3VtZW50ICcnIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJycgb2YgdGhlIHR5cGUgdmFyaWFibGUgJ193aXRoQXJndW1lbnRzSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5SZXR1cm5UeXBlJyBpbiB0aGUgcmV0dXJuIHR5cGUuX3dpdGhBcmd1bWVudHNJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZW5hbWUzbmFtZTQnIGluIHRoZSBzdXBlcnR5cGUgJycgb2YgY2xhc3MgJ193aXRoQXJndW1lbnRzSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGVJbmZlcnJlZEluZmVycmVkIHR5cGUgYXJndW1lbnQgJ193aXRoQXJndW1lbnRzSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5mZXJyZWRfd2l0aEFyZ3VtZW50c0luY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZF93aXRoQXJndW1lbnRzSW5jb3JyZWN0VHlwZUFyZ3VtZW50UXVhbGlmaWVkSW5mZXJyZWRfd2l0aEFyZ3VtZW50c0luZmVycmVkUGFja2FnZVVyaUludGVycHJldGluZyB0aGlzIGFzIHBhY2thZ2UgVVJJLCAnX3dpdGhBcmd1bWVudHNJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkVHJpZWQgdG8gaW5pdGlhbGl6ZSBmcm9tIGEgcHJldmlvdXMgY29tcGlsYXRpb24gKCksIGJ1dCB0aGUgZmlsZSB3YXMgbm90IHNlbGYtY29udGFpbmVkLiBUaGlzIG1pZ2h0IGJlIGEgYnVnLgoKVGhlIERhcnQgdGVhbSB3b3VsZCBncmVhdGx5IGFwcHJlY2lhdGUgaXQgaWYgeW91IHdvdWxkIHRha2UgYSBtb21lbnQgdG8gcmVwb3J0IHRoaXMgcHJvYmxlbSBhdCBodHRwOi8vZGFydGJ1Zy5jb20vbmV3LgpJZiB5b3UgYXJlIGNvbWZvcnRhYmxlIHdpdGggaXQsIGl0IHdvdWxkIGltcHJvdmUgdGhlIGNoYW5jZXMgb2YgZml4aW5nIGFueSBidWcgaWYgeW91IGluY2x1ZGVkIHRoZSBmaWxlICBpbiB5b3VyIGVycm9yIHJlcG9ydCwgYnV0IGJlIGF3YXJlIHRoYXQgdGhpcyBmaWxlIGluY2x1ZGVzIHlvdXIgc291cmNlIGNvZGUuCkVpdGhlciB3YXksIHlvdSBzaG91bGQgcHJvYmFibHkgZGVsZXRlIHRoZSBmaWxlIHNvIGl0IGRvZXNuJ3QgdXNlIHVubmVjZXNzYXJ5IGRpc2sgc3BhY2UuX3dpdGhBcmd1bWVudHNJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkTm9EdW1wKSwgYnV0IHRoZSBmaWxlIHdhcyBub3Qgc2VsZi1jb250YWluZWQuIFRoaXMgbWlnaHQgYmUgYSBidWcuCgpUaGUgRGFydCB0ZWFtIHdvdWxkIGdyZWF0bHkgYXBwcmVjaWF0ZSBpdCBpZiB5b3Ugd291bGQgdGFrZSBhIG1vbWVudCB0byByZXBvcnQgdGhpcyBwcm9ibGVtIGF0IGh0dHA6Ly9kYXJ0YnVnLmNvbS9uZXcuX3dpdGhBcmd1bWVudHNJbml0aWFsaXplRnJvbURpbGxVbmtub3duUHJvYmxlbSksIGJ1dCBjb3VsZG4ndC4KRXJyb3IgbWVzc2FnZSB3YXMgJycuClN0YWNrdHJhY2UgaW5jbHVkZWQgJycuClRoaXMgbWlnaHQgYmUgYSBidWcuCgpUaGUgRGFydCB0ZWFtIHdvdWxkIGdyZWF0bHkgYXBwcmVjaWF0ZSBpdCBpZiB5b3Ugd291bGQgdGFrZSBhIG1vbWVudCB0byByZXBvcnQgdGhpcyBwcm9ibGVtIGF0IGh0dHA6Ly9kYXJ0YnVnLmNvbS9uZXcuCklmIHlvdSBhcmUgY29tZm9ydGFibGUgd2l0aCBpdCwgaXQgd291bGQgaW1wcm92ZSB0aGUgY2hhbmNlcyBvZiBmaXhpbmcgYW55IGJ1ZyBpZiB5b3UgaW5jbHVkZWQgdGhlIGZpbGUgX3dpdGhBcmd1bWVudHNJbml0aWFsaXplRnJvbURpbGxVbmtub3duUHJvYmxlbU5vRHVtcCcuClRoaXMgbWlnaHQgYmUgYSBidWcuCgpUaGUgRGFydCB0ZWFtIHdvdWxkIGdyZWF0bHkgYXBwcmVjaWF0ZSBpdCBpZiB5b3Ugd291bGQgdGFrZSBhIG1vbWVudCB0byByZXBvcnQgdGhpcyBwcm9ibGVtIGF0IGh0dHA6Ly9kYXJ0YnVnLmNvbS9uZXcuX3dpdGhBcmd1bWVudHNJbml0aWFsaXplckZvclN0YXRpY0ZpZWxkJyBpc24ndCBhbiBpbnN0YW5jZSBmaWVsZCBvZiB0aGlzIGNsYXNzLl93aXRoQXJndW1lbnRzSW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3JPbmx5IGNvbnN0cnVjdG9ycyBjYW4gaGF2ZSBpbml0aWFsaXplcnMsIGFuZCAnJyBpcyBub3QgYSBjb25zdHJ1Y3Rvci5fd2l0aEFyZ3VtZW50c0luaXRpYWxpemluZ0Zvcm1hbFR5cGVNaXNtYXRjaFRoZSB0eXBlIG9mIHBhcmFtZXRlciAnJywgJycgaXMgbm90IGEgc3VidHlwZSBvZiB0aGUgY29ycmVzcG9uZGluZyBmaWVsZCdzIHR5cGUsICdUcnkgY2hhbmdpbmcgdGhlIHR5cGUgb2YgcGFyYW1ldGVyICcnIHRvIGEgc3VidHlwZSBvZiAnX3dpdGhBcmd1bWVudHNJbnB1dEZpbGVOb3RGb3VuZElucHV0IGZpbGUgbm90IGZvdW5kOiBfd2l0aEFyZ3VtZW50c0ludGVnZXJMaXRlcmFsSXNPdXRPZlJhbmdlVGhlIGludGVnZXIgbGl0ZXJhbCAgY2FuJ3QgYmUgcmVwcmVzZW50ZWQgaW4gNjQgYml0cy5fd2l0aEFyZ3VtZW50c0ludGVyZmFjZUNoZWNrQ29udGV4dEJvdGggbWVtYmVycyBhcmUgaW5oZXJpdGVkIGJ5IHRoZSBub24tYWJzdHJhY3QgY2xhc3MgJ193aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtQ29uc3RydWN0b3JOb3RGb3VuZE5vIGNvbnN0cnVjdG9yIG5hbWVkICcnIGluICdfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbUNvbnRleHRTZXZlcml0eU5vbi1jb250ZXh0IG1lc3NhZ2UgaGFzIGNvbnRleHQgc2V2ZXJpdHk6IF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtRGVidWdBYm9ydENvbXBpbGF0aW9uIGFib3J0ZWQgZHVlIHRvIGZhdGFsICcnIGF0Ogpfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbU5vSW5mZXJyZWRUeXBlU3RvcmVkVGhlcmUncyBubyBpbmZlcnJlZCB0eXBlIGZvciAnX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZENvdWxkbid0IGZpbmQgJ193aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtTm90Rm91bmRJbl93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtUHJpdmF0ZUNvbnN0cnVjdG9yQWNjZXNzQ2FuJ3QgYWNjZXNzIHByaXZhdGUgY29uc3RydWN0b3IgJ193aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtU3RhY2tOb3RFbXB0eS5zdGFjayBpc24ndCBlbXB0eToKICBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVN0b3JpbmdNdWx0aXBsZUluZmVycmVkVHlwZXNUaGVyZSdzIGFscmVhZHkgYW4gaW5mZXJyZWQgdHlwZSwgJycsIGZvciAnX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1VbmV4cGVjdGVkJywgYnV0IGdvdCAnX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1VbmhhbmRsZWRVbmhhbmRsZWQgX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1VbmltcGxlbWVudGVkVW5pbXBsZW1lbnRlZCBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVVuc3VwcG9ydGVkVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiAnX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1VcmlNaXNzaW5nU2NoZW1lVGhlIFVSSSAnJyBoYXMgbm8gc2NoZW1lLl93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtVmVyaWZpY2F0aW9uRXJyb3JWZXJpZmljYXRpb24gb2YgdGhlIGdlbmVyYXRlZCBwcm9ncmFtIGZhaWxlZDoKX3dpdGhBcmd1bWVudHNJbnRlcnNlY3Rpb25UeXBlQXNUeXBlQXJndW1lbnQnLCBpdCBjYW4gYmUgZWl0aGVyICcnIG9yICdfd2l0aEFyZ3VtZW50c0ludmFsaWRBc3NpZ25tZW50VHJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIHRoZSBsZWZ0IGhhbmQgc2lkZSwgb3IgY2FzdGluZyB0aGUgcmlnaHQgaGFuZCBzaWRlIHRvICdfd2l0aEFyZ3VtZW50c0ludmFsaWRCcmVha1RhcmdldF93aXRoQXJndW1lbnRzSW52YWxpZENhc3RGdW5jdGlvbkV4cHJUaGUgZnVuY3Rpb24gZXhwcmVzc2lvbiB0eXBlICcnIGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJ193aXRoQXJndW1lbnRzSW52YWxpZENhc3RMaXRlcmFsTGlzdFRoZSBsaXN0IGxpdGVyYWwgdHlwZSAnX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdExpdGVyYWxNYXBUaGUgbWFwIGxpdGVyYWwgdHlwZSAnX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdExpdGVyYWxTZXRUaGUgc2V0IGxpdGVyYWwgdHlwZSAnX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdExvY2FsRnVuY3Rpb25UaGUgbG9jYWwgZnVuY3Rpb24gaGFzIHR5cGUgJycgdGhhdCBpc24ndCBvZiBleHBlY3RlZCB0eXBlICdfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0TmV3RXhwclRoZSBjb25zdHJ1Y3RvciByZXR1cm5zIHR5cGUgJ193aXRoQXJndW1lbnRzSW52YWxpZENhc3RTdGF0aWNNZXRob2RUaGUgc3RhdGljIG1ldGhvZCBoYXMgdHlwZSAnX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdFRvcExldmVsRnVuY3Rpb25UaGUgdG9wIGxldmVsIGZ1bmN0aW9uIGhhcyB0eXBlICdfd2l0aEFyZ3VtZW50c0ludmFsaWRDb250aW51ZVRhcmdldF93aXRoQXJndW1lbnRzSW52YWxpZE9wZXJhdG9yVGhlIHN0cmluZyAnJyBpc24ndCBhIHVzZXItZGVmaW5hYmxlIG9wZXJhdG9yLl93aXRoQXJndW1lbnRzSW52YWxpZFBhY2thZ2VVcmlJbnZhbGlkIHBhY2thZ2UgVVJJICdfd2l0aEFyZ3VtZW50c0ludm9rZU5vbkZ1bmN0aW9uJyBpc24ndCBhIGZ1bmN0aW9uIG9yIG1ldGhvZCBhbmQgY2FuJ3QgYmUgaW52b2tlZC5fd2l0aEFyZ3VtZW50c0xhYmVsTm90Rm91bmRDYW4ndCBmaW5kIGxhYmVsICdfd2l0aEFyZ3VtZW50c0xvYWRMaWJyYXJ5SGlkZXNNZW1iZXJUaGUgbGlicmFyeSAnJyBkZWZpbmVzIGEgdG9wLWxldmVsIG1lbWJlciBuYW1lZCAnbG9hZExpYnJhcnknLiBUaGlzIG1lbWJlciBpcyBoaWRkZW4gYnkgdGhlIHNwZWNpYWwgbWVtYmVyICdsb2FkTGlicmFyeScgdGhhdCB0aGUgbGFuZ3VhZ2UgYWRkcyB0byBzdXBwb3J0IGRlZmVycmVkIGxvYWRpbmcuX3dpdGhBcmd1bWVudHNMb2NhbERlZmluaXRpb25IaWRlc0V4cG9ydExvY2FsIGRlZmluaXRpb24gb2YgJycgaGlkZXMgZXhwb3J0IGZyb20gJ193aXRoQXJndW1lbnRzTG9jYWxEZWZpbml0aW9uSGlkZXNJbXBvcnQnIGhpZGVzIGltcG9ydCBmcm9tICdfd2l0aEFyZ3VtZW50c01ldGhvZE5vdEZvdW5kTWV0aG9kIG5vdCBmb3VuZDogJ193aXRoQXJndW1lbnRzTWlzc2luZ0V4cGxpY2l0VHlwZUFyZ3VtZW50c05vIHR5cGUgYXJndW1lbnRzIHByb3ZpZGVkLCAgcG9zc2libGUuX3dpdGhBcmd1bWVudHNNaXNzaW5nSW1wbGVtZW50YXRpb25DYXVzZScgaXMgZGVmaW5lZCBoZXJlLl93aXRoQXJndW1lbnRzTWlzc2luZ0ltcGxlbWVudGF0aW9uTm90QWJzdHJhY3RfbmFtZXNObyBuYW1lcyBwcm92aWRlZFRoZSBub24tYWJzdHJhY3QgY2xhc3MgJycgaXMgbWlzc2luZyBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZXNlIG1lbWJlcnM6Cl93aXRoQXJndW1lbnRzTWlzc2luZ1BhcnRPZicgYXMgYSBwYXJ0LCBiZWNhdXNlIGl0IGhhcyBubyAncGFydCBvZicgZGVjbGFyYXRpb24uX3dpdGhBcmd1bWVudHNNaXhpbkFwcGxpY2F0aW9uSW5jb21wYXRpYmxlU3VwZXJ0eXBlJyBkb2Vzbid0IGltcGxlbWVudCAnJyBzbyBpdCBjYW4ndCBiZSB1c2VkIHdpdGggJ193aXRoQXJndW1lbnRzTWl4aW5JbmZlcmVuY2VOb01hdGNoaW5nQ2xhc3NUeXBlIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIGluZmVycmVkIGZvciB0aGUgbWl4aW4gJycgYmVjYXVzZSAnJyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG1peGluJ3Mgc3VwZXJ0eXBlIGNvbnN0cmFpbnQgJ193aXRoQXJndW1lbnRzTmFtZWRNaXhpbk92ZXJyaWRlQ29udGV4dE92ZXJyaWRlIHdhcyBpbnRyb2R1Y2VkIGluIHRoZSBtaXhpbiBhcHBsaWNhdGlvbiBjbGFzcyAnX3dpdGhBcmd1bWVudHNOb0Zvcm1hbHNUcnkgYWRkaW5nICcoKScgYWZ0ZXIgJycsIG9yIGFkZCAnZ2V0JyBiZWZvcmUgJycgdG8gZGVjbGFyZSBhIGdldHRlci5fd2l0aEFyZ3VtZW50c05vU3VjaE5hbWVkUGFyYW1ldGVyTm8gbmFtZWQgcGFyYW1ldGVyIHdpdGggdGhlIG5hbWUgJ193aXRoQXJndW1lbnRzTm9uQXNjaWlJZGVudGlmaWVyY2hhcmFjdGVycnVuZXNOb3QgYSBjaGFyYWN0ZXIgJ1RoZSBub24tQVNDSUkgY2hhcmFjdGVyICcnICgpIGNhbid0IGJlIHVzZWQgaW4gaWRlbnRpZmllcnMsIG9ubHkgaW4gc3RyaW5ncyBhbmQgY29tbWVudHMuX3dpdGhBcmd1bWVudHNOb25Bc2NpaVdoaXRlc3BhY2VUaGUgbm9uLUFTQ0lJIHNwYWNlIGNoYXJhY3RlciBfd2l0aEFyZ3VtZW50c05vblNpbXBsZUJvdW5kVmlhUmVmZXJlbmNlQm91bmQgb2YgdGhpcyB2YXJpYWJsZSByZWZlcmVuY2VzIHJhdyB0eXBlICdfd2l0aEFyZ3VtZW50c05vblNpbXBsZUJvdW5kVmlhVmFyaWFibGVCb3VuZCBvZiB0aGlzIHZhcmlhYmxlIHJlZmVyZW5jZXMgdmFyaWFibGUgJycgZnJvbSB0aGUgc2FtZSBkZWNsYXJhdGlvbi5fd2l0aEFyZ3VtZW50c05vdEFQcmVmaXhJblR5cGVBbm5vdGF0aW9uJyBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZSBiZWNhdXNlICcnIGRvZXNuJ3QgcmVmZXIgdG8gYW4gaW1wb3J0IHByZWZpeC5fd2l0aEFyZ3VtZW50c05vdEFUeXBlJyBpc24ndCBhIHR5cGUuX3dpdGhBcmd1bWVudHNOb3RCaW5hcnlPcGVyYXRvcicgaXNuJ3QgYSBiaW5hcnkgb3BlcmF0b3IuX3dpdGhBcmd1bWVudHNOb3RDb25zdGFudEV4cHJlc3Npb24gaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbi5fd2l0aEFyZ3VtZW50c09wZXJhdG9yTWludXNQYXJhbWV0ZXJNaXNtYXRjaE9wZXJhdG9yICcnIHNob3VsZCBoYXZlIHplcm8gb3Igb25lIHBhcmFtZXRlci5fd2l0aEFyZ3VtZW50c09wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gwJyBzaG91bGRuJ3QgaGF2ZSBhbnkgcGFyYW1ldGVycy5fd2l0aEFyZ3VtZW50c09wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gxJyBzaG91bGQgaGF2ZSBleGFjdGx5IG9uZSBwYXJhbWV0ZXIuX3dpdGhBcmd1bWVudHNPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMicgc2hvdWxkIGhhdmUgZXhhY3RseSB0d28gcGFyYW1ldGVycy5fd2l0aEFyZ3VtZW50c092ZXJyaWRkZW5NZXRob2RDYXVzZVRoaXMgaXMgdGhlIG92ZXJyaWRkZW4gbWV0aG9kICgnJykuX3dpdGhBcmd1bWVudHNPdmVycmlkZUZld2VyTmFtZWRBcmd1bWVudHMnIGhhcyBmZXdlciBuYW1lZCBhcmd1bWVudHMgdGhhbiB0aG9zZSBvZiBvdmVycmlkZGVuIG1ldGhvZCAnX3dpdGhBcmd1bWVudHNPdmVycmlkZUZld2VyUG9zaXRpb25hbEFyZ3VtZW50cycgaGFzIGZld2VyIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRoYW4gdGhvc2Ugb2Ygb3ZlcnJpZGRlbiBtZXRob2QgJ193aXRoQXJndW1lbnRzT3ZlcnJpZGVNaXNtYXRjaE5hbWVkUGFyYW1ldGVyJyBkb2Vzbid0IGhhdmUgdGhlIG5hbWVkIHBhcmFtZXRlciAnJyBvZiBvdmVycmlkZGVuIG1ldGhvZCAnX3dpdGhBcmd1bWVudHNPdmVycmlkZU1vcmVSZXF1aXJlZEFyZ3VtZW50cycgaGFzIG1vcmUgcmVxdWlyZWQgYXJndW1lbnRzIHRoYW4gdGhvc2Ugb2Ygb3ZlcnJpZGRlbiBtZXRob2QgJ193aXRoQXJndW1lbnRzT3ZlcnJpZGVUeXBlTWlzbWF0Y2hQYXJhbWV0ZXJUaGUgcGFyYW1ldGVyICcnIG9mIHRoZSBtZXRob2QgJycgaGFzIHR5cGUgJycsIHdoaWNoIGRvZXMgbm90IG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nIHR5cGUsICcnLCBpbiB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsICdDaGFuZ2UgdG8gYSBzdXBlcnR5cGUgb2YgJycsIG9yLCBmb3IgYSBjb3ZhcmlhbnQgcGFyYW1ldGVyLCBhIHN1YnR5cGUuX3dpdGhBcmd1bWVudHNPdmVycmlkZVR5cGVNaXNtYXRjaFJldHVyblR5cGVUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIG1ldGhvZCAnJyBpcyAnJywgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlIHJldHVybiB0eXBlLCAnJywgb2YgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLCAnQ2hhbmdlIHRvIGEgc3VidHlwZSBvZiAnX3dpdGhBcmd1bWVudHNPdmVycmlkZVR5cGVWYXJpYWJsZXNNaXNtYXRjaERlY2xhcmVkIHR5cGUgdmFyaWFibGVzIG9mICcnIGRvZXNuJ3QgbWF0Y2ggdGhvc2Ugb24gb3ZlcnJpZGRlbiBtZXRob2QgJ193aXRoQXJndW1lbnRzUGFja2FnZU5vdEZvdW5kQ291bGQgbm90IHJlc29sdmUgdGhlIHBhY2thZ2UgJ193aXRoQXJndW1lbnRzUGFja2FnZXNGaWxlRm9ybWF0UHJvYmxlbSBpbiBwYWNrYWdlcyBjb25maWd1cmF0aW9uIGZpbGU6IF93aXRoQXJndW1lbnRzUGFydE9mSW5MaWJyYXJ5Q2FuJ3QgaW1wb3J0ICcnLCBiZWNhdXNlIGl0IGhhcyBhICdwYXJ0IG9mJyBkZWNsYXJhdGlvbi5UcnkgcmVtb3ZpbmcgdGhlICdwYXJ0IG9mJyBkZWNsYXJhdGlvbiwgb3IgdXNpbmcgJycgYXMgYSBwYXJ0Ll93aXRoQXJndW1lbnRzUGFydE9mTGlicmFyeU5hbWVNaXNtYXRjaFVzaW5nICcnIGFzIHBhcnQgb2YgJycgYnV0IGl0cyAncGFydCBvZicgZGVjbGFyYXRpb24gc2F5cyAnX3dpdGhBcmd1bWVudHNQYXJ0T2ZVcmlNaXNtYXRjaHVyaTNfdXJpM193aXRoQXJndW1lbnRzUGFydE9mVXNlVXJpX3dpdGhBcmd1bWVudHNQYXJ0VHdpY2UnIGFzIGEgcGFydCBtb3JlIHRoYW4gb25jZS5fd2l0aEFyZ3VtZW50c1BhdGNoSW5qZWN0aW9uRmFpbGVkQ2FuJ3QgaW5qZWN0ICcnIGludG8gJ193aXRoQXJndW1lbnRzUmVkaXJlY3RpbmdGYWN0b3J5SW5jb21wYXRpYmxlVHlwZUFyZ3VtZW50JyBkb2Vzbid0IGV4dGVuZCAnX3dpdGhBcmd1bWVudHNSZWRpcmVjdGlvblRhcmdldE5vdEZvdW5kUmVkaXJlY3Rpb24gY29uc3RydWN0b3IgdGFyZ2V0IG5vdCBmb3VuZDogJ193aXRoQXJndW1lbnRzU2RrUm9vdE5vdEZvdW5kU0RLIHJvb3QgZGlyZWN0b3J5IG5vdCBmb3VuZDogX3dpdGhBcmd1bWVudHNTZGtTcGVjaWZpY2F0aW9uTm90Rm91bmRTREsgbGlicmFyaWVzIHNwZWNpZmljYXRpb24gbm90IGZvdW5kOiBfd2l0aEFyZ3VtZW50c1Nka1N1bW1hcnlOb3RGb3VuZFNESyBzdW1tYXJ5IG5vdCBmb3VuZDogX3dpdGhBcmd1bWVudHNTZXR0ZXJOb3RGb3VuZFNldHRlciBub3QgZm91bmQ6ICdfd2l0aEFyZ3VtZW50c1NvdXJjZUJvZHlTdW1tYXJ5QnVpbHQgYm9kaWVzIGZvciAgY29tcGlsYXRpb24gdW5pdHMgKCBtcy9jb21waWxhdGlvbiB1bml0Ll93aXRoQXJndW1lbnRzU291cmNlT3V0bGluZVN1bW1hcnlCdWlsdCBvdXRsaW5lcyBmb3IgX3dpdGhBcmd1bWVudHNTcHJlYWRFbGVtZW50VHlwZU1pc21hdGNoQ2FuJ3QgYXNzaWduIHNwcmVhZCBlbGVtZW50cyBvZiB0eXBlICcnIHRvIGNvbGxlY3Rpb24gZWxlbWVudHMgb2YgdHlwZSAnX3dpdGhBcmd1bWVudHNTcHJlYWRNYXBFbnRyeUVsZW1lbnRLZXlUeXBlTWlzbWF0Y2hDYW4ndCBhc3NpZ24gc3ByZWFkIGVudHJ5IGtleXMgb2YgdHlwZSAnJyB0byBtYXAgZW50cnkga2V5cyBvZiB0eXBlICdfd2l0aEFyZ3VtZW50c1NwcmVhZE1hcEVudHJ5RWxlbWVudFZhbHVlVHlwZU1pc21hdGNoQ2FuJ3QgYXNzaWduIHNwcmVhZCBlbnRyeSB2YWx1ZXMgb2YgdHlwZSAnJyB0byBtYXAgZW50cnkgdmFsdWVzIG9mIHR5cGUgJ193aXRoQXJndW1lbnRzU3ByZWFkTWFwRW50cnlUeXBlTWlzbWF0Y2hVbmV4cGVjdGVkIHR5cGUgJycgb2YgYSBtYXAgc3ByZWFkIGVudHJ5LiAgRXhwZWN0ZWQgJ2R5bmFtaWMnIG9yIGEgTWFwLl93aXRoQXJndW1lbnRzU3ByZWFkVHlwZU1pc21hdGNoJyBvZiBhIHNwcmVhZC4gIEV4cGVjdGVkICdkeW5hbWljJyBvciBhbiBJdGVyYWJsZS5fd2l0aEFyZ3VtZW50c1N1cGVyY2xhc3NIYXNOb0NvbnN0cnVjdG9yU3VwZXJjbGFzcyBoYXMgbm8gY29uc3RydWN0b3IgbmFtZWQgJ193aXRoQXJndW1lbnRzU3VwZXJjbGFzc0hhc05vRGVmYXVsdENvbnN0cnVjdG9yVGhlIHN1cGVyY2xhc3MsICcnLCBoYXMgbm8gdW5uYW1lZCBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cy5fd2l0aEFyZ3VtZW50c1N1cGVyY2xhc3NIYXNOb0dldHRlclN1cGVyY2xhc3MgaGFzIG5vIGdldHRlciBuYW1lZCAnX3dpdGhBcmd1bWVudHNTdXBlcmNsYXNzSGFzTm9NZXRob2RTdXBlcmNsYXNzIGhhcyBubyBtZXRob2QgbmFtZWQgJ193aXRoQXJndW1lbnRzU3VwZXJjbGFzc0hhc05vU2V0dGVyU3VwZXJjbGFzcyBoYXMgbm8gc2V0dGVyIG5hbWVkICdfd2l0aEFyZ3VtZW50c1N1cGVyY2xhc3NNZXRob2RBcmd1bWVudE1pc21hdGNoU3VwZXJjbGFzcyBkb2Vzbid0IGhhdmUgYSBtZXRob2QgbmFtZWQgJycgd2l0aCBtYXRjaGluZyBhcmd1bWVudHMuX3dpdGhBcmd1bWVudHNTdXBlcnR5cGVJc0lsbGVnYWwnIGNhbid0IGJlIHVzZWQgYXMgc3VwZXJ0eXBlLl93aXRoQXJndW1lbnRzU3VwZXJ0eXBlSXNUeXBlVmFyaWFibGVUaGUgdHlwZSB2YXJpYWJsZSAnX3dpdGhBcmd1bWVudHNTd2l0Y2hFeHByZXNzaW9uTm90QXNzaWduYWJsZScgb2YgdGhlIHN3aXRjaCBleHByZXNzaW9uIGlzbid0IGFzc2lnbmFibGUgdG8gdGhlIHR5cGUgJycgb2YgdGhpcyBjYXNlIGV4cHJlc3Npb24uX3dpdGhBcmd1bWVudHNUaGlzQWNjZXNzSW5GaWVsZEluaXRpYWxpemVyQ2FuJ3QgYWNjZXNzICd0aGlzJyBpbiBhIGZpZWxkIGluaXRpYWxpemVyIHRvIHJlYWQgJ193aXRoQXJndW1lbnRzVGhpc09yU3VwZXJBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXJDYW4ndCBhY2Nlc3MgJycgaW4gYSBmaWVsZCBpbml0aWFsaXplci5fd2l0aEFyZ3VtZW50c1Rvb0Zld0FyZ3VtZW50c1RvbyBmZXcgcG9zaXRpb25hbCBhcmd1bWVudHM6ICByZXF1aXJlZCwgIGdpdmVuLl93aXRoQXJndW1lbnRzVG9vTWFueUFyZ3VtZW50c1RvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnRzOiAgYWxsb3dlZCwgYnV0ICBmb3VuZC5fd2l0aEFyZ3VtZW50c1R5cGVBcmd1bWVudE1pc21hdGNoRXhwZWN0ZWQgIHR5cGUgYXJndW1lbnRzLl93aXRoQXJndW1lbnRzVHlwZUFyZ3VtZW50c09uVHlwZVZhcmlhYmxlQ2FuJ3QgdXNlIHR5cGUgYXJndW1lbnRzIHdpdGggdHlwZSB2YXJpYWJsZSAnX3dpdGhBcmd1bWVudHNUeXBlTm90Rm91bmQnIG5vdCBmb3VuZC5fd2l0aEFyZ3VtZW50c1R5cGVPcmlnaW4nIGlzIGZyb20gJ193aXRoQXJndW1lbnRzVHlwZU9yaWdpbldpdGhGaWxlVXJpX3dpdGhBcmd1bWVudHNUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZUNhdXNlVGhlIG90aGVyIHR5cGUgdmFyaWFibGUgbmFtZWQgJ193aXRoQXJndW1lbnRzVW5kZWZpbmVkR2V0dGVyVGhlIGdldHRlciAnJyBpc24ndCBkZWZpbmVkIGZvciB0aGUgY2xhc3MgJ1RyeSBjb3JyZWN0aW5nIHRoZSBuYW1lIHRvIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGdldHRlciwgb3IgZGVmaW5pbmcgYSBnZXR0ZXIgb3IgZmllbGQgbmFtZWQgJ193aXRoQXJndW1lbnRzVW5kZWZpbmVkTWV0aG9kVHJ5IGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgbWV0aG9kLCBvciBkZWZpbmluZyBhIG1ldGhvZCBuYW1lZCAnX3dpdGhBcmd1bWVudHNVbmRlZmluZWRTZXR0ZXJUaGUgc2V0dGVyICdUcnkgY29ycmVjdGluZyB0aGUgbmFtZSB0byB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBzZXR0ZXIsIG9yIGRlZmluaW5nIGEgc2V0dGVyIG9yIGZpZWxkIG5hbWVkICdfd2l0aEFyZ3VtZW50c1VuZXhwZWN0ZWRUb2tlblVuZXhwZWN0ZWQgdG9rZW4gJ193aXRoQXJndW1lbnRzVW5tYXRjaGVkVG9rZW5DYW4ndCBmaW5kICcnIHRvIG1hdGNoICdfd2l0aEFyZ3VtZW50c1VucmVzb2x2ZWRQcmVmaXhJblR5cGVBbm5vdGF0aW9uJyBpc24ndCBkZWZpbmVkLl93aXRoQXJndW1lbnRzVW5zcGVjaWZpZWRfd2l0aEFyZ3VtZW50c1Vuc3VwcG9ydGVkT3BlcmF0b3InIG9wZXJhdG9yIGlzIG5vdCBzdXBwb3J0ZWQuX3dpdGhBcmd1bWVudHNVbnRlcm1pbmF0ZWRTdHJpbmdTdHJpbmcgc3RhcnRpbmcgd2l0aCAgbXVzdCBlbmQgd2l0aCBfd2l0aEFyZ3VtZW50c1VudHJhbnNsYXRhYmxlVXJpTm90IGZvdW5kOiAnX3dpdGhBcmd1bWVudHNVc2VPZkRlcHJlY2F0ZWRJZGVudGlmaWVyJyBpcyBkZXByZWNhdGVkLl93aXRoQXJndW1lbnRzV2ViTGl0ZXJhbENhbm5vdEJlUmVwcmVzZW50ZWRFeGFjdGx5IGNhbid0IGJlIHJlcHJlc2VudGVkIGV4YWN0bHkgaW4gSmF2YVNjcmlwdC5UcnkgY2hhbmdpbmcgdGhlIGxpdGVyYWwgdG8gc29tZXRoaW5nIHRoYXQgY2FuIGJlIHJlcHJlc2VudGVkIGluIEphdmFzY3JpcHQuIEluIEphdmFzY3JpcHQgIGlzIHRoZSBuZWFyZXN0IHZhbHVlIHRoYXQgY2FuIGJlIHJlcHJlc2VudGVkIGV4YWN0bHkuZmFzdGEuc2V2ZXJpdHlTZXZlcml0eS5jb250ZXh0U2V2ZXJpdHkuZXJyb3JlcnJvckxlZ2FjeVdhcm5pbmdTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmdTZXZlcml0eS5pZ25vcmVkaW50ZXJuYWxQcm9ibGVtU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtd2FybmluZ1NldmVyaXR5Lndhcm5pbmdzZXZlcml0eUVudW1OYW1lc0NPTlRFWFRFUlJPUkVSUk9SX0xFR0FDWV9XQVJOSU5HSUdOT1JFRElOVEVSTkFMX1BST0JMRU1XQVJOSU5Hc2V2ZXJpdHlFbnVtVmFsdWVzc2V2ZXJpdHlQcmVmaXhlc0Vycm9ySW50ZXJuYWwgcHJvYmxlbVdhcm5pbmdDb250ZXh0c2V2ZXJpdHlUZXh0c2ludGVybmFsIHByb2JsZW1mcm9udF9lbmQua2VybmVsX2dlbmVyYXRvcl9pbXBsd2l0aENyYXNoUmVwb3J0aW5nRGlsbFRhcmdldEtlcm5lbFRhcmdldHByaW50Q29tcG9uZW50VGV4dHNlcmlhbGl6ZUNvbXBvbmVudHZlcmlmeUNvbXBvbmVudExvYWRlckNvbXBpbGVyUmVzdWx0ZGVwc2dlbmVyYXRlS2VybmVsYnVpbGRTdW1tYXJ5YnVpbGRDb21wb25lbnR0cnVuY2F0ZVN1bW1hcnlmc3NvdXJjZUxvYWRlcnVyaVRyYW5zbGF0b3JkaWxsVGFyZ2V0ZXh0ZXJuYWxMaWJzaW1wb3J0VXJpdG9TZXRleGNsdWRlZGxvYWRlcmFwcGVuZExpYnJhcmllc2ZpbHRlcmlucHV0U3VtbWFyeWRlcGVuZGVuY3lidWlsZE91dGxpbmVza2VybmVsVGFyZ2V0c2V0RW50cnlQb2ludHNzdW1tYXJ5Q29tcG9uZW50bGlicmFyeUZpbHRlcmlzU291cmNlTGlicmFyeXRyaW1tZWRTdW1tYXJ5Q29tcG9uZW50bWV0YWRhdGFUcmFuc2Zvcm1lZCBvdXRsaW5laW5jbHVkZVNvdXJjZXNHZW5lcmF0ZWQgb3V0bGluZUdlbmVyYXRlZCBjb21wb25lbnRjdXJyZW50VXJpRm9yQ3Jhc2hSZXBvcnRpbmdmYXN0YS5zY2FubmVydW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyUnVuZVN0cmluZ1NjYW5uZXJVdGY4Qnl0ZXNTY2FubmVyZGVmYXVsdFJlY292ZXJ5U3RyYXRlZ3lpc0JpbmFyeU9wZXJhdG9yaXNUZXJuYXJ5T3BlcmF0b3Jpc1VuYXJ5T3BlcmF0b3JidWlsZFVuZXhwZWN0ZWRDaGFyYWN0ZXJUb2tlbkVPRl9UT0tFTktleXdvcmRSZWNvdmVydG9rZW5zbGluZVN0YXJ0c1NjYW5uZXJoYXNFcnJvcnN0b2tlbml6ZVNjYW5uZXJSZXN1bHR1bmljb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXJzY2FuaW5jbHVkZUNvbW1lbnRzcmVjb3ZlcltieXRlc106IHRoZSBsYXN0IGJ5dGUgbXVzdCBiZSBudWxsLnNjYW5uZXJzY2FuU3RyaW5nZW5hYmxlR3RHdEd0ZW5hYmxlR3RHdEd0RXFzY2FuTGF6eUFzc2lnbm1lbnRPcGVyYXRvcnNzb3VyY2UgbXVzdCBub3QgYmUgbnVsbF90b2tlbml6ZUFuZFJlY292ZXJlbmNvZGVJbmNyZW1lbnRhbENvbXBpbGVyd29ya2VySW5wdXRDYWNoZWluY3JlbWVudGFsQ29tcGlsZXJXb3JrZXJJbnB1dENvbXBvbmVudGRpZ2VzdGRpZ2VzdHNFcXVhbGZyb250X2VuZC5rZXJuZWxfZ2VuZXJhdG9ycE9wdGlvbnNrZXJuZWxGb3JDb21wb25lbnRzb3VyY2VzZnJvbnRfZW5kLnN0YW5kYXJkX2ZpbGVfc3lzdGVtaW9pbnN0YW5jZVN0YW5kYXJkRmlsZVN5c3RlbSBvbmx5IHN1cHBvcnRzIGZpbGU6KiBhbmQgZGF0YToqIFVSSXNfSW9GaWxlU3lzdGVtRW50aXR5X3RvRmlsZVN5c3RlbUV4Y2VwdGlvbm9zTWVzc2FnZWNvbnRlbnRBc0J5dGVzY29udGVudEFzU3RyaW5nZm9yY2VCdWlsZERpcnZtRGlyZWN0b3J5L2Jpbi8uLi8uLi8uLi9saWIvX2ludGVybmFsL3RyYW5zbGF0ZVNka29yZy1kYXJ0bGFuZy1zZGsvc2RrL3Nkay9saWIvbGlicmFyaWVzLmpzb25zZGsvb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvaXNFeGlzdGluZ0ZpbGVmYXN0YS5yZWRpcmVjdGluZ19mYWN0b3J5X2JvZHlEeW5hbWljVHlwZUV4cHJlc3Npb25FeHByZXNzaW9uU3RhdGVtZW50RnVuY3Rpb25Ob2RlSW52YWxpZEV4cHJlc3Npb25MZXRNZW1iZXJOdWxsTGl0ZXJhbFByb2NlZHVyZVN0YXRpY0dldFN0cmluZ0xpdGVyYWxUeXBlUGFyYW1ldGVyVHlwZVZhcmlhYmxlRGVjbGFyYXRpb25TdWJzdGl0dXRpb25pbnRlcm5hbHR5cGVBcmd1bWVudHNpbml0aWFsaXplcnVucmVzb2x2ZWRleHByZXNzaW9udW5yZXNvbHZlZE5hbWVpc1VucmVzb2x2ZWRib2R5RXhwcmVzc2lvbnZhcmlhYmxlYm9keWdldFZhbHVlcmVzdG9yZUZyb21EaWxsZnVuY3Rpb25zdGF0ZW1lbnRwYXJlbnRlbmNvZGVUeXBlQXJndW1lbnRzdmFyTmFtZVByZWZpeCN0eXBlQXJnZGVjb2RlVHlwZUFyZ3VtZW50c2VuY29kZWRSZWRpcmVjdGlvblRhcmdldGxldE5hbWUjcmVkaXJlY3RpbmdfZmFjdG9yeWlzUmVkaXJlY3RpbmdGYWN0b3J5bWVtYmVyZ2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keWdldFJlZGlyZWN0aW9uVGFyZ2V0dHlwZVBhcmFtZXRlcnN0b3J0b2lzZXRvcnRvaXNlQm9keWhhcmVoYXJlQm9keW5leHRUb3J0b2lzZW5leHRUeXBlQXJndW1lbnRzc3Vic3Vic3RpdHV0ZVR5cGV0eXBlQXJndW1lbnRDb3VudG5leHRUeXBlQXJndW1lbnRDb3VudGVuY2xvc2luZ0NsYXNzZmFzdGEub3BlcmF0b3JzT3BlcmF0b3JPcGVyYXRvci5hZGRiaXR3aXNlQW5kT3BlcmF0b3IuYml0d2lzZUFuZGJpdHdpc2VOb3RPcGVyYXRvci5iaXR3aXNlTm90Yml0d2lzZU9yT3BlcmF0b3IuYml0d2lzZU9yYml0d2lzZVhvck9wZXJhdG9yLmJpdHdpc2VYb3JkaXZpZGVPcGVyYXRvci5kaXZpZGVlcXVhbHNPcGVyYXRvci5lcXVhbHNncmVhdGVyVGhhbk9wZXJhdG9yLmdyZWF0ZXJUaGFuZ3JlYXRlclRoYW5FcXVhbHNPcGVyYXRvci5ncmVhdGVyVGhhbkVxdWFsc2luZGV4R2V0T3BlcmF0b3IuaW5kZXhHZXRpbmRleFNldE9wZXJhdG9yLmluZGV4U2V0bGVmdFNoaWZ0T3BlcmF0b3IubGVmdFNoaWZ0bGVzc1RoYW5PcGVyYXRvci5sZXNzVGhhbmxlc3NUaGFuRXF1YWxzT3BlcmF0b3IubGVzc1RoYW5FcXVhbHNtb2R1bG9PcGVyYXRvci5tb2R1bG9tdWx0aXBseU9wZXJhdG9yLm11bHRpcGx5cmlnaHRTaGlmdE9wZXJhdG9yLnJpZ2h0U2hpZnR0cmlwbGVTaGlmdE9wZXJhdG9yLnRyaXBsZVNoaWZ0c3VidHJhY3RPcGVyYXRvci5zdWJ0cmFjdHRydW5jYXRpbmdEaXZpZGVPcGVyYXRvci50cnVuY2F0aW5nRGl2aWRldW5hcnlNaW51c09wZXJhdG9yLnVuYXJ5TWludXN+JT4+Pn4vb3BlcmF0b3JUb1N0cmluZ29wZXJhdG9yb3BlcmF0b3JSZXF1aXJlZEFyZ3VtZW50Q291bnRmYXN0YS5wYXJzZXIuYXN5bmNfbW9kaWZpZXJTeW5jQXN5bmNNb2RpZmllci5TeW5jU3luY1N0YXJBc3luY01vZGlmaWVyLlN5bmNTdGFyQXN5bmNBc3luY01vZGlmaWVyLkFzeW5jQXN5bmNTdGFyQXN5bmNNb2RpZmllci5Bc3luY1N0YXJmYXN0YS5zY2FubmVyLmNoYXJhY3RlcnMkRU9GJFNUWCRCUyRWVEFCJEZGJFNQQUNFJEJBTkckUEVSQ0VOVCRBTVBFUlNBTkQkU1EkT1BFTl9QQVJFTiRDTE9TRV9QQVJFTiRTVEFSJFBMVVMkQ09NTUEkTUlOVVMkUEVSSU9EJFNMQVNIJDEkMiQzJDQkNSQ2JDckOCRDT0xPTiRTRU1JQ09MT04kTFQkRVEkR1QkUVVFU1RJT04kQVQkQiRDJEQkRSRGJEckSCRJJEokSyRMJE0kTiRPJFAkUSRSJFMkVCRVJFYkVyRYJFkkT1BFTl9TUVVBUkVfQlJBQ0tFVCRDTE9TRV9TUVVBUkVfQlJBQ0tFVCRDQVJFVCRCQUNLUElORyRiJGMkZCRlJGYkaCRpJGokayRsJG0kbiRvJHAkcSRyJHQkdSR2JHckeCR5JE9QRU5fQ1VSTFlfQlJBQ0tFVCRCQVIkQ0xPU0VfQ1VSTFlfQlJBQ0tFVCRUSUxERSROQlNQJEZJUlNUX1NVUlJPR0FURSRMQVNUX1NVUlJPR0FURSRMQVNUX0NPREVfUE9JTlRpc0hleERpZ2l0Y2hhcmFjdGVyQ29kZWhleERpZ2l0VmFsdWVoZXhEaWdpdGlzVW5pY29kZVNjYWxhclZhbHVlaXNVdGYxNkxlYWRTdXJyb2dhdGVpc1V0ZjE2VHJhaWxTdXJyb2dhdGVmYXN0YS51dGlsLmxpbmtMaW5rQnVpbGRlckltcGxlbWVudGF0aW9uTGlua0l0ZXJhdG9yTWFwcGVkTGlua0l0ZXJhYmxlbm8gZWxlbWVudHNlbGVtZW50c2VwYXJhdGVkQnlncm93YWJsZXNsb3dMZW5ndGhsaW5rZm5tYXBUb0xpc3RyZXZlcnNlcmV2ZXJzZVByZXBlbmRBbGxmcm9tc2tpcEluZGV4ICBvdXQgb2YgcmFuZ2VMaW5rLmhhc2hDb2RlZ2V0Omxlbmd0aE5vIGVsZW1lbnRzTW9yZSB0aGFuIG9uZSBlbGVtZW50ZXZlcnlfdW5zdXBwb3J0ZWRjYXN0ZWxlbWVudEF0ZXhwYW5kZmlyc3RXaGVyZW9yRWxzZWluaXRpYWxWYWx1ZWNvbWJpbmVmb2xsb3dlZEJ5Z2V0Omxhc3RsYXN0V2hlcmVyZWR1Y2VyZXR5cGVzaW5nbGVXaGVyZXNraXBXaGlsZXRha2V0YWtlV2hpbGV3aGVyZVR5cGVtZXRob2RfcmVkaXJlY3RpbmcjI3R5cGVBcmcwZmFzdGEudXRpbC5saW5rX2ltcGxlbWVudGF0aW9uSXRlcmFibGVCYXNlVHJhbnNmb3JtYXRpb25TX2xpbmtNYXBwZWRMaW5rSXRlcmF0b3JfdHJhbnNmb3JtYXRpb25bICBdbXlFbGVtZW50c0xpbmtFbnRyeS5oYXNoQ29kZWxhc3RMaW5rZmFzdGEudXRpbC5yZWxhdGl2aXplbmV3X2FwaUNvbXBpbGVySW5wdXRQcm92aWRlclJlYWRTdHJpbmdGcm9tVXJpQ29tcGlsZXJPdXRwdXRQcm92aWRlckRpYWdub3N0aWNIYW5kbGVySElOVFZFUkJPU0VfSU5GT3ZlcmJvc2UgaW5mb0NSQVNIY3Jhc2hsZWdfYXBpaW1wbEdlbmVyaWNUYXNrTWVhc3VyZXJDb21waWxlckltcGxtZWFzdXJlcnVzZXJIYW5kbGVyVGFza3VzZXJQcm92aWRlclRhc2ttYWtlUmVwb3J0ZXJ0YXNrc0RpYWdub3N0aWMgaGFuZGxlcklucHV0IHByb3ZpZGVyZW5hYmxlVGFza01lYXN1cmVtZW50c2xvZ2NhbGxVc2VySGFuZGxlcnNldHVwU2RrZW52c3VwcG9ydGVkTGlicmFyaWVzc3BlY2lmaWNhdGlvblVyaXNsb3dUZXh0ZGFydDJqc19zZXJ2ZXJkYXJ0Mmpzc2V0dXBEdXJhdGlvbmVsYXBzZWRXYWxsQ2xvY2tzZWxmVGFza21lYXN1cmVTdWJ0YXNraW1wbC5ydW50aW1pbmdzY29tcHV0ZVRpbWluZ3NfZm9ybWF0TXNtc1RpbWluZ3M6dG90YWxEdXJhdGlvbmFzeW5jRHVyYXRpb25lbGFwc2VkQXN5bmNXYWxsQ2xvY2tjdW11bGF0ZWREdXJhdGlvbnRpbWluZ0RhdGF0YXNrcnVubmluZ2lzUnVubmluZ21pbGxpc2Vjb25kcyAgIHN1YnRhc2tzdWJ0YXNrc3N1YnRpbWVnZXRTdWJ0YXNrVGltZWdldFN1YnRhc2tJc1J1bm5pbmcgPiBsb25nZXN0RGVzY3JpcHRpb25kZGVzY3JpcHRpb25wYWRkaW5ncGVyY2VudFBhZGRpbmdwZXJjZW50JSl1bmFjY291bnRlZER1cmF0aW9uICAgIFRvdGFsIGNvbXBpbGUtdGltZSA7IHNldHVwICBhc3luYyAgdW5hY2NvdW50ZWQgcmVwb3J0RGlhZ25vc3RpY2luZm9zX3JlcG9ydERpYWdub3N0aWNNZXNzYWdlZGlhZ25vc3RpY01lc3NhZ2VzcGFuc291cmNlU3Bhbm1lYXN1cmVyZXBvcnRDcmFzaEluVXNlckNvZGVVbmNhdWdodCBleGNlcHRpb24gaW4gZGlhZ25vc3RpYyBoYW5kbGVyY2FsbFVzZXJQcm92aWRlcm1lYXN1cmVJb1VuY2F1Z2h0IGV4Y2VwdGlvbiBpbiBpbnB1dCBwcm92aWRlcl9FbnZpcm9ubWVudGRlZmluaXRpb25zX2NvbXBsZXRlTWFwdmFsdWVPZmxpYnJhcnlOYW1ldHJ1ZXRvTWFwX1RpbWluZ0RhdGFfZGFydExpYnJhcnlFbnZpcm9ubWVudFByZWZpeGRhcnQubGlicmFyeS5kYXJ0MmpzLmNvbG9yc1JFU0VUG1swbUJMQUNLX0NPTE9SG1szMG1SRURfQ09MT1IbWzMxbUdSRUVOX0NPTE9SG1szMm1ZRUxMT1dfQ09MT1IbWzMzbUJMVUVfQ09MT1IbWzM0bU1BR0VOVEFfQ09MT1IbWzM1bUNZQU5fQ09MT1IbWzM2bVdISVRFX0NPTE9SG1szN213cmFwYmxhY2tyZWRncmVlbnllbGxvd2JsdWVtYWdlbnRhY3lhbndoaXRlZGFydDJqcy5pby5zb3VyY2VfZmlsZUxvY2F0aW9uUHJvdmlkZXJTb3VyY2VGaWxlY2FjaGVkS2VybmVsU291cmNlbGluZVN0YXJ0c0NhY2hla2VybmVsU291cmNlc2xvd1V0ZjhaZXJvVGVybWluYXRlZEJ5dGVzY2FjaGVkVGV4dGxpbmVTdGFydHNGcm9tU3RyaW5nc3RhcnRzc2xvd1N1YnN0cmluZ2luY2x1ZGVTb3VyY2VMaW5lc3RhcnRMb2NhdGlvbmVuZExvY2F0aW9ubGluZVN0YXJ0Y29sdW1uU3RhcnRsaW5lRW5kY29sdW1uRW5kYnVmdGV4dExpbmVnZXRUZXh0TGluZXRvQ29sdW1ubGluZXNVdGY4Qnl0ZXNTb3VyY2VGaWxlemVyb1Rlcm1pbmF0ZWRDb250ZW50bGVuZ3RoQ2FjaGVjb250ZW50Q2FjaGluZ1V0ZjhCeXRlc1NvdXJjZUZpbGVTdHJpbmdTb3VyY2VGaWxlZnJvbVVyaWZyb21OYW1lQmluYXJ5X3plcm9UZXJtaW5hdGVJZk5lY2Vzc2FyeWRhcnQyanMudXRpbC5lbXB0eXNldEltbXV0YWJsZUVtcHR5U2V0Ul9pbW11dGFibGVFcnJvckVtcHR5U2V0IGlzIGltbXV0YWJsZWxvb2t1cHJlbW92ZXJlbW92ZUFsbHJlbW92ZVdoZXJldGVzdHJldGFpbkFsbHJldGFpbldoZXJldW5pb25pbnRlcnNlY3Rpb25kaWZmZXJlbmNlX0VtcHR5U2V0SXRlcmF0b3JkYXJ0MmpzLnV0aWwubWFwbGV0TWFwQmFzZU1hcGxldF9NQVJLRVJDQVBBQ0lUWV9rZXlfdmFsdWVfZXh0cmFyZW1haW5pbmdjb3B5VG9jb3B5RnJvbWVhY2hLZXllYWNoVmFsdWV2YWx1ZUluZGV4X01hcGxldE1hcmtlcl9NYXBsZXRLZXlJdGVyYWJsZW1hcGxldF9NYXBsZXRTaW5nbGVJdGVyYXRvcl9lbGVtZW50X01hcGxldExpc3RJdGVyYXRvcl9saXN0X3JlbWFpbmluZ19pbmRleGRhcnQyanMudXRpbC5zZXRsZXRTZXRCYXNlU2V0bGV0X2NvbnRlbnRzX25ld1NldG5ld1NldGVhY2hzZXRfU2V0bGV0TWFya2VyX1NldGxldFNpbmdsZUl0ZXJhdG9yX1NldGxldExpc3RJdGVyYXRvcmtlcm5lbC5hc3ROb2RlYWNjZXB0dmlzaXRDaGlsZHJlblRyZWVOb2RlX2hhc2hDb3VudGVybm9PZmZzZXRmaWxlT2Zmc2V0dHJhbnNmb3JtQ2hpbGRyZW5yZXBsYWNlQ2hpbGRjaGlsZHJlcGxhY2VtZW50cmVwbGFjZVdpdGhlbmNsb3NpbmdDb21wb25lbnRfZ2V0TG9jYXRpb25JbkVuY2xvc2luZ0ZpbGVOYW1lZE5vZGVyZWZlcmVuY2VjYW5vbmljYWxOYW1lRmlsZVVyaU5vZGVSZWZlcmVuY2VSZWZlcmVuY2UgdG8gVW5ib3VuZCByZWZlcmVuY2Vhc0xpYnJhcnkgaXMgbm90IGJvdW5kIHRvIGFuIEFTVCBub2RlLiBBIGxpYnJhcnkgd2FzIGV4cGVjdGVkYXNDbGFzcyBpcyBub3QgYm91bmQgdG8gYW4gQVNUIG5vZGUuIEEgY2xhc3Mgd2FzIGV4cGVjdGVkYXNNZW1iZXIgaXMgbm90IGJvdW5kIHRvIGFuIEFTVCBub2RlLiBBIG1lbWJlciB3YXMgZXhwZWN0ZWRhc0ZpZWxkIGlzIG5vdCBib3VuZCB0byBhbiBBU1Qgbm9kZS4gQSBmaWVsZCB3YXMgZXhwZWN0ZWRhc0NvbnN0cnVjdG9yIGlzIG5vdCBib3VuZCB0byBhbiBBU1Qgbm9kZS4gQSBjb25zdHJ1Y3RvciB3YXMgZXhwZWN0ZWRhc1Byb2NlZHVyZSBpcyBub3QgYm91bmQgdG8gYW4gQVNUIG5vZGUuIEEgcHJvY2VkdXJlIHdhcyBleHBlY3RlZGFzVHlwZWRlZiBpcyBub3QgYm91bmQgdG8gYW4gQVNUIG5vZGUuIEEgdHlwZWRlZiB3YXMgZXhwZWN0ZWRMaWJyYXJ5RXh0ZXJuYWxGbGFnU3ludGhldGljRmxhZ3Byb2JsZW1zQXNKc29uYW5ub3RhdGlvbnNhZGRpdGlvbmFsRXhwb3J0c3BhcnRzdHlwZWRlZnNjbGFzc2VzcHJvY2VkdXJlc2ZpZWxkc19saWJyYXJ5SWRDb3VudGVyX2xpYnJhcnlJZGlzU3ludGhldGljbWVtYmVyc2FkZE1lbWJlcmFkZEFubm90YXRpb25hZGRDbGFzc2NsYXNzX2FkZEZpZWxkZmllbGRhZGRQcm9jZWR1cmVhZGRUeXBlZGVmdHlwZWRlZl9jb21wdXRlQ2Fub25pY2FsTmFtZXNnZXRDaGlsZEZyb21UeXBlZGVmYmluZFRvZ2V0Q2hpbGRGcm9tTWVtYmVyZ2V0Q2hpbGRhZGREZXBlbmRlbmN5YWRkUGFydHZpc2l0TGlicmFyeUxpYnJhcnlEZXBlbmRlbmN5aW1wb3J0ZWRMaWJyYXJ5UmVmZXJlbmNlY29tYmluYXRvcnNFeHBvcnRGbGFnRGVmZXJyZWRGbGFnaW1wb3J0ZWRMaWJyYXJ5ZGVmZXJyZWRJbXBvcnRpbXBvcnRleHBvcnRieVJlZmVyZW5jZWVuY2xvc2luZ0xpYnJhcnl0YXJnZXRMaWJyYXJ5aXNFeHBvcnRpc0ltcG9ydGlzRGVmZXJyZWRhbm5vdGF0aW9udmlzaXRMaWJyYXJ5RGVwZW5kZW5jeUxpYnJhcnlQYXJ0cGFydFVyaXZpc2l0TGlicmFyeVBhcnRDb21iaW5hdG9yaXNTaG93c2hvd2hpZGVpc0hpZGV2aXNpdENvbWJpbmF0b3JUeXBlZGVmdHlwZVBhcmFtZXRlcnNPZkZ1bmN0aW9uVHlwZXBvc2l0aW9uYWxQYXJhbWV0ZXJzbmFtZWRQYXJhbWV0ZXJzdGhpc1R5cGV2aXNpdFR5cGVkZWZ2aXNpdERhcnRUeXBlQ2xhc3NMZXZlbFRlbXBvcmFyeUNsYXNzTGV2ZWwuVGVtcG9yYXJ5VHlwZUNsYXNzTGV2ZWwuVHlwZUhpZXJhcmNoeUNsYXNzTGV2ZWwuSGllcmFyY2h5TWl4aW5DbGFzc0xldmVsLk1peGluQm9keUNsYXNzTGV2ZWwuQm9keUNsYXNzc3RhcnRGaWxlT2Zmc2V0ZmlsZUVuZE9mZnNldGxldmVsTGV2ZWxNYXNrRmxhZ0Fic3RyYWN0RmxhZ0VudW1GbGFnQW5vbnltb3VzTWl4aW5GbGFnRWxpbWluYXRlZE1peGluRmxhZ01peGluRGVjbGFyYXRpb25zdXBlcnR5cGVtaXhlZEluVHlwZWltcGxlbWVudGVkVHlwZXNjb25zdHJ1Y3RvcnNyZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnNfcmF3VHlwZV90aGlzVHlwZV9ib3R0b21UeXBlaXNBbm9ueW1vdXNNaXhpbmlzRW51bWlzRWxpbWluYXRlZE1peGluaXNNaXhpbkRlY2xhcmF0aW9uc3VwZXJjbGFzc0NvbnN0cmFpbnRzY29uc3RyYWludHNjbGFzc05vZGVjdXJyZW50Q2xhc3NzdWJzdGl0dXRpb25zdWJzdGl0dXRlU3VwZXJ0eXBlc3VwZXJjbGFzc21peGVkSW5DbGFzc21peGluaXNNaXhpbkFwcGxpY2F0aW9uZGVtYW5nbGVkTmFtZW5hbWVBc01peGluQXBwbGljYXRpb25uYW1lQXNNaXhpbkFwcGxpY2F0aW9uU3ViY2xhc3NzdXBlcnN2aXNpdENsYXNzYWNjZXB0UmVmZXJlbmNldmlzaXRDbGFzc1JlZmVyZW5jZWlzSW5FeHRlcm5hbExpYnJhcnlhc1Jhd1N1cGVydHlwZWFzVGhpc1N1cGVydHlwZXJhd1R5cGVib3R0b21UeXBldmlzaXRTdXBlcnR5cGV0cmFuc2Zvcm1lckZsYWdzaGFzR2V0dGVyaGFzU2V0dGVyaXNJbnN0YW5jZU1lbWJlcmdldHRlclR5cGVzZXR0ZXJUeXBlY29udGFpbnNTdXBlckNhbGxzRmllbGRGbGFnRmluYWxGbGFnQ29uc3RGbGFnU3RhdGljRmxhZ0hhc0ltcGxpY2l0R2V0dGVyRmxhZ0hhc0ltcGxpY2l0U2V0dGVyRmxhZ0NvdmFyaWFudEZsYWdHZW5lcmljQ292YXJpYW50SW1wbGhhc0ltcGxpY2l0R2V0dGVyaGFzSW1wbGljaXRTZXR0ZXJpc0dlbmVyaWNDb3ZhcmlhbnRJbXBsaXNNdXRhYmxlRmllbGRzIGNhbm5vdCBiZSBleHRlcm5hbHZpc2l0RmllbGR2aXNpdEZpZWxkUmVmZXJlbmNlQ29uc3RydWN0b3Jpbml0aWFsaXplcnNGbGFnRXh0ZXJuYWxGbGFnU3ludGhldGljdmlzaXRDb25zdHJ1Y3RvcnZpc2l0Q29uc3RydWN0b3JSZWZlcmVuY2VSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnRhcmdldFJlZmVyZW5jZXJlcXVpcmVkUGFyYW1ldGVyQ291bnR2aXNpdFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ydmlzaXRSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvclJlZmVyZW5jZWZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXRSZWZlcmVuY2Vmb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldFJlZmVyZW5jZUZsYWdGb3J3YXJkaW5nU3R1YkZsYWdGb3J3YXJkaW5nU2VtaVN0dWJGbGFnUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JGbGFnTm9TdWNoTWV0aG9kRm9yd2FyZGVyaXNGb3J3YXJkaW5nU3R1YmlzRm9yd2FyZGluZ1NlbWlTdHViZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldGZvcndhcmRpbmdTdHViSW50ZXJmYWNlVGFyZ2V0bmV3VmFsdWVzZXRUcmFuc2Zvcm1lckZsYWdzV2l0aG91dExhenlMb2FkaW5naXNSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcmlzU3ludGhldGljRm9yd2FyZGVyaXNOb1N1Y2hNZXRob2RGb3J3YXJkZXJpc0FjY2Vzc29ydmlzaXRQcm9jZWR1cmV2aXNpdFByb2NlZHVyZVJlZmVyZW5jZXJldHVyblR5cGVmdW5jdGlvblR5cGVQcm9jZWR1cmVLaW5kTWV0aG9kUHJvY2VkdXJlS2luZC5NZXRob2RHZXR0ZXJQcm9jZWR1cmVLaW5kLkdldHRlclNldHRlclByb2NlZHVyZUtpbmQuU2V0dGVyUHJvY2VkdXJlS2luZC5PcGVyYXRvckZhY3RvcnlQcm9jZWR1cmVLaW5kLkZhY3RvcnlJbml0aWFsaXplcnZpc2l0SW52YWxpZEluaXRpYWxpemVyRmllbGRJbml0aWFsaXplcmZpZWxkUmVmZXJlbmNldmlzaXRGaWVsZEluaXRpYWxpemVyU3VwZXJJbml0aWFsaXplcnZpc2l0U3VwZXJJbml0aWFsaXplclJlZGlyZWN0aW5nSW5pdGlhbGl6ZXJ2aXNpdFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXJMb2NhbEluaXRpYWxpemVydmlzaXRMb2NhbEluaXRpYWxpemVyQXNzZXJ0SW5pdGlhbGl6ZXJ2aXNpdEFzc2VydEluaXRpYWxpemVyYXN5bmNNYXJrZXJkYXJ0QXN5bmNNYXJrZXJfYm9keWxhenlCdWlsZGVyX2J1aWxkTGF6eWxhenlCdWlsZGVyTG9jYWxfZ2V0VHlwZU9mVmFyaWFibGVfZ2V0TmFtZWRUeXBlT2ZWYXJpYWJsZW5hbWVkdHlwZVBhcmFtZXRlcnNDb3B5dmlzaXRGdW5jdGlvbk5vZGVBc3luY01hcmtlckFzeW5jTWFya2VyLlN5bmNBc3luY01hcmtlci5TeW5jU3RhckFzeW5jTWFya2VyLkFzeW5jQXN5bmNNYXJrZXIuQXN5bmNTdGFyU3luY1lpZWxkaW5nQXN5bmNNYXJrZXIuU3luY1lpZWxkaW5nZ2V0U3RhdGljVHlwZXR5cGVzZ2V0U3RhdGljVHlwZUFzSW5zdGFuY2VPZmJvdW5kbnVsbFR5cGV1cGNhc3RUeXBlZ2V0VHlwZUFzSW5zdGFuY2VPZnR5cGVFcnJvciBpcyBub3QgYSBzdWJ0eXBlIG9mIGFjY2VwdDFhcmd2aXNpdEludmFsaWRFeHByZXNzaW9uVmFyaWFibGVHZXRwcm9tb3RlZFR5cGV2aXNpdFZhcmlhYmxlR2V0VmFyaWFibGVTZXR2aXNpdFZhcmlhYmxlU2V0UHJvcGVydHlHZXRpbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2VpbnRlcmZhY2VUYXJnZXRyZWNlaXZlclR5cGVuYW1lU3RyaW5naW50VHlwZXR5cGVUeXBldmlzaXRQcm9wZXJ0eUdldFByb3BlcnR5U2V0dmlzaXRQcm9wZXJ0eVNldERpcmVjdFByb3BlcnR5R2V0dmlzaXREaXJlY3RQcm9wZXJ0eUdldERpcmVjdFByb3BlcnR5U2V0dmlzaXREaXJlY3RQcm9wZXJ0eVNldERpcmVjdE1ldGhvZEludm9jYXRpb252aXNpdERpcmVjdE1ldGhvZEludm9jYXRpb25pc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3JnZXRUeXBlT2ZPdmVybG9hZGVkQXJpdGhtZXRpY3Bvc2l0aW9uYWxTdXBlclByb3BlcnR5R2V0ZGVjbGFyaW5nQ2xhc3N2aXNpdFN1cGVyUHJvcGVydHlHZXRTdXBlclByb3BlcnR5U2V0dmlzaXRTdXBlclByb3BlcnR5U2V0dmlzaXRTdGF0aWNHZXRTdGF0aWNTZXR2aXNpdFN0YXRpY1NldEFyZ3VtZW50c2VtcHR5Zm9yd2FyZGVkdmlzaXRBcmd1bWVudHNOYW1lZEV4cHJlc3Npb252aXNpdE5hbWVkRXhwcmVzc2lvbkludm9jYXRpb25FeHByZXNzaW9uTWV0aG9kSW52b2NhdGlvbmJvb2xUeXBldmlzaXRNZXRob2RJbnZvY2F0aW9uU3VwZXJNZXRob2RJbnZvY2F0aW9udmlzaXRTdXBlck1ldGhvZEludm9jYXRpb25TdGF0aWNJbnZvY2F0aW9udmlzaXRTdGF0aWNJbnZvY2F0aW9uQ29uc3RydWN0b3JJbnZvY2F0aW9udmlzaXRDb25zdHJ1Y3Rvckludm9jYXRpb25jb25zdHJ1Y3RlZFR5cGVJbnN0YW50aWF0aW9ud2l0aG91dFR5cGVQYXJhbWV0ZXJzdmlzaXRJbnN0YW50aWF0aW9uTm90b3BlcmFuZHZpc2l0Tm90TG9naWNhbEV4cHJlc3Npb25sZWZ0cmlnaHR2aXNpdExvZ2ljYWxFeHByZXNzaW9uQ29uZGl0aW9uYWxFeHByZXNzaW9uY29uZGl0aW9ub3RoZXJ3aXNlc3RhdGljVHlwZXZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uU3RyaW5nQ29uY2F0ZW5hdGlvbmV4cHJlc3Npb25zc3RyaW5nVHlwZXZpc2l0U3RyaW5nQ29uY2F0ZW5hdGlvbkxpc3RDb25jYXRlbmF0aW9udHlwZUFyZ3VtZW50bGlzdHNsaXRlcmFsTGlzdFR5cGV2aXNpdExpc3RDb25jYXRlbmF0aW9uU2V0Q29uY2F0ZW5hdGlvbnNldHNsaXRlcmFsU2V0VHlwZXZpc2l0U2V0Q29uY2F0ZW5hdGlvbk1hcENvbmNhdGVuYXRpb25rZXlUeXBldmFsdWVUeXBlbWFwc2xpdGVyYWxNYXBUeXBldmlzaXRNYXBDb25jYXRlbmF0aW9uSW5zdGFuY2VDcmVhdGlvbmNsYXNzUmVmZXJlbmNlZmllbGRWYWx1ZXNhc3NlcnRzdmlzaXRJbnN0YW5jZUNyZWF0aW9uZmllbGRSZWZ0cmFuc2Zvcm1lZElzRXhwcmVzc2lvbnZpc2l0SXNFeHByZXNzaW9uQXNFeHByZXNzaW9uRmxhZ1R5cGVFcnJvcmlzVHlwZUVycm9ydmlzaXRBc0V4cHJlc3Npb25CYXNpY0xpdGVyYWx2aXNpdFN0cmluZ0xpdGVyYWxJbnRMaXRlcmFsdmlzaXRJbnRMaXRlcmFsRG91YmxlTGl0ZXJhbGRvdWJsZVR5cGV2aXNpdERvdWJsZUxpdGVyYWxCb29sTGl0ZXJhbHZpc2l0Qm9vbExpdGVyYWx2aXNpdE51bGxMaXRlcmFsU3ltYm9sTGl0ZXJhbHN5bWJvbFR5cGV2aXNpdFN5bWJvbExpdGVyYWxUeXBlTGl0ZXJhbHZpc2l0VHlwZUxpdGVyYWxUaGlzRXhwcmVzc2lvbnZpc2l0VGhpc0V4cHJlc3Npb25SZXRocm93dmlzaXRSZXRocm93VGhyb3d2aXNpdFRocm93TGlzdExpdGVyYWx2aXNpdExpc3RMaXRlcmFsU2V0TGl0ZXJhbHZpc2l0U2V0TGl0ZXJhbE1hcExpdGVyYWxlbnRyaWVzdmlzaXRNYXBMaXRlcmFsTWFwRW50cnl2aXNpdE1hcEVudHJ5QXdhaXRFeHByZXNzaW9udW5mdXR1cmVUeXBldmlzaXRBd2FpdEV4cHJlc3Npb25GdW5jdGlvbkV4cHJlc3Npb252aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbkNvbnN0YW50RXhwcmVzc2lvbnZpc2l0Q29uc3RhbnRFeHByZXNzaW9udmlzaXRDb25zdGFudHZpc2l0TGV0QmxvY2tFeHByZXNzaW9udmlzaXRCbG9ja0V4cHJlc3Npb25Mb2FkTGlicmFyeWZ1dHVyZVR5cGV2aXNpdExvYWRMaWJyYXJ5Q2hlY2tMaWJyYXJ5SXNMb2FkZWRvYmplY3RUeXBldmlzaXRDaGVja0xpYnJhcnlJc0xvYWRlZFN0YXRlbWVudHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudEJsb2Nrc3RhdGVtZW50c3JlbW92ZUxhc3R2aXNpdEJsb2NrYWRkU3RhdGVtZW50QXNzZXJ0QmxvY2t2aXNpdEFzc2VydEJsb2NrRW1wdHlTdGF0ZW1lbnR2aXNpdEVtcHR5U3RhdGVtZW50QXNzZXJ0U3RhdGVtZW50Y29uZGl0aW9uU3RhcnRPZmZzZXRjb25kaXRpb25FbmRPZmZzZXR2aXNpdEFzc2VydFN0YXRlbWVudExhYmVsZWRTdGF0ZW1lbnR2aXNpdExhYmVsZWRTdGF0ZW1lbnRCcmVha1N0YXRlbWVudHZpc2l0QnJlYWtTdGF0ZW1lbnRXaGlsZVN0YXRlbWVudHZpc2l0V2hpbGVTdGF0ZW1lbnREb1N0YXRlbWVudHZpc2l0RG9TdGF0ZW1lbnRGb3JTdGF0ZW1lbnR2YXJpYWJsZXN1cGRhdGVzdmlzaXRGb3JTdGF0ZW1lbnRGb3JJblN0YXRlbWVudGJvZHlPZmZzZXRpc0FzeW5jdmlzaXRGb3JJblN0YXRlbWVudFN3aXRjaFN0YXRlbWVudGNhc2VzdmlzaXRTd2l0Y2hTdGF0ZW1lbnRTd2l0Y2hDYXNlZXhwcmVzc2lvbk9mZnNldHNpc0RlZmF1bHRkZWZhdWx0Q2FzZXZpc2l0U3dpdGNoQ2FzZUNvbnRpbnVlU3dpdGNoU3RhdGVtZW50dmlzaXRDb250aW51ZVN3aXRjaFN0YXRlbWVudElmU3RhdGVtZW50dmlzaXRJZlN0YXRlbWVudFJldHVyblN0YXRlbWVudHZpc2l0UmV0dXJuU3RhdGVtZW50VHJ5Q2F0Y2hjYXRjaGVzdmlzaXRUcnlDYXRjaENhdGNoZ3VhcmRzdGFja1RyYWNldmlzaXRDYXRjaFRyeUZpbmFsbHlmaW5hbGl6ZXJ2aXNpdFRyeUZpbmFsbHlZaWVsZFN0YXRlbWVudEZsYWdZaWVsZFN0YXJGbGFnTmF0aXZlaXNZaWVsZFN0YXJpc05hdGl2ZXZpc2l0WWllbGRTdGF0ZW1lbnRmaWxlRXF1YWxzT2Zmc2V0YmluYXJ5T2Zmc2V0Tm9UYWdGbGFnRmllbGRGb3JtYWxGbGFnSW5TY29wZWlzRmllbGRGb3JtYWxmb3JWYWx1ZXZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbkZ1bmN0aW9uRGVjbGFyYXRpb252aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb25OYW1lX2ludGVybmFsaXNQcml2YXRldmlzaXROYW1lX1ByaXZhdGVOYW1lOjpfY29tcHV0ZUhhc2hDb2RlX1B1YmxpY05hbWV1bmFsaWFzdW5hbGlhc09uY2VJbnZhbGlkVHlwZXZpc2l0SW52YWxpZFR5cGV2aXNpdER5bmFtaWNUeXBlVm9pZFR5cGV2aXNpdFZvaWRUeXBlQm90dG9tVHlwZXZpc2l0Qm90dG9tVHlwZUludGVyZmFjZVR5cGVjbGFzc05hbWVfZGVmYXVsdFR5cGVBcmd1bWVudHN2aXNpdEludGVyZmFjZVR5cGVGdW5jdGlvblR5cGV0eXBlZGVmVHlwZV9oYXNoQ29kZXR5cGVkZWZSZWZlcmVuY2V0eXBlZGVmdmlzaXRGdW5jdGlvblR5cGVnZXROYW1lZFBhcmFtZXRlcmxvd2VydXBwZXJwaXZvdG5hbWVkUGFyYW1ldGVyY29tcGFyaXNvblR5cGVkZWZUeXBldHlwZWRlZk5vZGV2aXNpdFR5cGVkZWZUeXBldmlzaXRUeXBlZGVmUmVmZXJlbmNlTmFtZWRUeXBldmlzaXROYW1lZFR5cGVwcm9tb3RlZEJvdW5kdmlzaXRUeXBlUGFyYW1ldGVyVHlwZVR5cGVQYXJhbWV0ZXJkZWZhdWx0VHlwZXZpc2l0VHlwZVBhcmFtZXRlcmlzRnVuY3Rpb25UeXBlVHlwZVBhcmFtZXRlclN1cGVydHlwZWFzSW50ZXJmYWNlVHlwZWdldFR5cGVhc0V4cHJlc3Npb25QcmltaXRpdmVDb25zdGFudE51bGxDb25zdGFudHZpc2l0TnVsbENvbnN0YW50dmlzaXROdWxsQ29uc3RhbnRSZWZlcmVuY2VCb29sQ29uc3RhbnR2aXNpdEJvb2xDb25zdGFudHZpc2l0Qm9vbENvbnN0YW50UmVmZXJlbmNlSW50Q29uc3RhbnR2aXNpdEludENvbnN0YW50dmlzaXRJbnRDb25zdGFudFJlZmVyZW5jZURvdWJsZUNvbnN0YW50dmlzaXREb3VibGVDb25zdGFudHZpc2l0RG91YmxlQ29uc3RhbnRSZWZlcmVuY2Vpc05hTlN0cmluZ0NvbnN0YW50dmlzaXRTdHJpbmdDb25zdGFudHZpc2l0U3RyaW5nQ29uc3RhbnRSZWZlcmVuY2VTeW1ib2xDb25zdGFudGxpYnJhcnlSZWZlcmVuY2V2aXNpdFN5bWJvbENvbnN0YW50dmlzaXRTeW1ib2xDb25zdGFudFJlZmVyZW5jZSNNYXBDb25zdGFudF9jYWNoZWRIYXNoQ29kZXZpc2l0TWFwQ29uc3RhbnR2aXNpdE1hcENvbnN0YW50UmVmZXJlbmNlPihDb25zdGFudE1hcEVudHJ5TGlzdENvbnN0YW50dmlzaXRMaXN0Q29uc3RhbnR2aXNpdExpc3RDb25zdGFudFJlZmVyZW5jZVNldENvbnN0YW50dmlzaXRTZXRDb25zdGFudHZpc2l0U2V0Q29uc3RhbnRSZWZlcmVuY2VJbnN0YW5jZUNvbnN0YW50dmlzaXRJbnN0YW5jZUNvbnN0YW50dmlzaXRJbnN0YW5jZUNvbnN0YW50UmVmZXJlbmNlIHt9UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudHRlYXJPZmZDb25zdGFudHZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudHZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudFJlZmVyZW5jZT4pdHlwZUVudmlyb25tZW50bWFwcGluZ1RlYXJPZmZDb25zdGFudHByb2NlZHVyZVJlZmVyZW5jZXZpc2l0VGVhck9mZkNvbnN0YW50dmlzaXRUZWFyT2ZmQ29uc3RhbnRSZWZlcmVuY2VUeXBlTGl0ZXJhbENvbnN0YW50dmlzaXRUeXBlTGl0ZXJhbENvbnN0YW50dmlzaXRUeXBlTGl0ZXJhbENvbnN0YW50UmVmZXJlbmNlVW5ldmFsdWF0ZWRDb25zdGFudHZpc2l0VW5ldmFsdWF0ZWRDb25zdGFudHZpc2l0VW5ldmFsdWF0ZWRDb25zdGFudFJlZmVyZW5jZW1haW5NZXRob2ROYW1lYWRvcHRDaGlsZHJlbmFkb3B0Q2hpbGRjb21wdXRlQ2Fub25pY2FsTmFtZXNGb3JMaWJyYXJ5Z2V0Q2hpbGRGcm9tVXJpdW5iaW5kQ2Fub25pY2FsTmFtZXN1bmJpbmRBbGx2aXNpdENvbXBvbmVudGFkZE1ldGFkYXRhUmVwb3NpdG9yeXJlcG9zaXRvcnlNZXRhZGF0YVJlcG9zaXRvcnl3cml0ZVRvQmluYXJ5cmVhZEZyb21CaW5hcnlCaW5hcnlTaW5rZ2V0QnVmZmVyT2Zmc2V0d3JpdGVCeXRlYnl0ZXdyaXRlQnl0ZXN3cml0ZVVJbnQzMndyaXRlVUludDMwd3JpdGVCeXRlTGlzdHdyaXRlTnVsbEFsbG93ZWRDYW5vbmljYWxOYW1lUmVmZXJlbmNld3JpdGVTdHJpbmdSZWZlcmVuY2V3cml0ZU5hbWV3cml0ZURhcnRUeXBld3JpdGVOb2RlZW50ZXJTY29wZW1lbWJlclNjb3BldmFyaWFibGVTY29wZWxlYXZlU2NvcGVCaW5hcnlTb3VyY2VjdXJyZW50T2Zmc2V0cmVhZEJ5dGVyZWFkQnl0ZXNyZWFkVUludHJlYWRVaW50MzJyZWFkQnl0ZUxpc3RyZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZXJlYWRTdHJpbmdSZWZlcmVuY2VyZWFkTmFtZXJlYWREYXJ0VHlwZXJlYWRGdW5jdGlvbk5vZGVfQ2hpbGRSZXBsYWNlcmRlZmF1bHRUcmVlTm9kZWFsbG93TWFsZm9ybWVkZW5kT2ZMaW5lSW50ZXJuYWwgZXJyb3JtaWRsaW5lSW5kZXhsaW5lTnVtYmVyY29sdW1uTnVtYmVyX3RlbXBvcmFyeUhhc2hDb2RlVGFibGVpbmZvcm1hdGl2ZXNldFBhcmVudHNub2Rlc3Zpc2l0TGlzdHZpc2l0b3J2aXNpdEl0ZXJhYmxldHJhbnNmb3JtVHlwZUxpc3RzdG9yZUluZGV4dHJhbnNmb3JtU3VwZXJ0eXBlTGlzdHRyYW5zZm9ybUxpc3RfZ2V0QXNUeXBlQXJndW1lbnRzZ2V0TWVtYmVyUmVmZXJlbmNlZ2V0Q2xhc3NSZWZlcmVuY2VnZXRDYW5vbmljYWxOYW1lT2ZNZW1iZXIgaGFzIG5vIGNhbm9uaWNhbCBuYW1lZ2V0Q2Fub25pY2FsTmFtZU9mQ2xhc3NnZXRDYW5vbmljYWxOYW1lT2ZMaWJyYXJ5bGlzdEhhc2hDb2RlaXRlbW1hcEhhc2hDb2RlbGlzdEVxdWFsc21hcEVxdWFsc2dldENhbm9uaWNhbE5hbWVPZlR5cGVkZWZfZ2V0TG9jYXRpb25JbkNvbXBvbmVudG5hbWVQYXJ0cyB3aXRoIGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvblN1YmNsYXNzTmFtZWtlcm5lbC5hc3RfdG9fYmluYXJ5Qnl0ZXNCdWlsZGVyTGlicmFyeUZpbHRlckJpbmFyeVByaW50ZXJfdmFyaWFibGVJbmRleGVyX2xhYmVsSW5kZXhlcl9zd2l0Y2hDYXNlSW5kZXhlcl90eXBlUGFyYW1ldGVySW5kZXhlcnN0cmluZ0luZGV4ZXJfY29uc3RhbnRJbmRleGVyX3NvdXJjZVVyaUluZGV4ZXJfY3VycmVudGx5SW5Ob25pbXBsZW1lbnRhdGlvbl9zb3VyY2VzRnJvbVJlYWxJbXBsZW1lbnRhdGlvbl9zb3VyY2VzRnJvbVJlYWxJbXBsZW1lbnRhdGlvbkluTGlicmFyeV9saWJyYXJ5RGVwZW5kZW5jeUluZGV4X21ldGFkYXRhU3Vic2VjdGlvbnNfbWFpblNpbmtfbWV0YWRhdGFTaW5rX2NvbnN0YW50c0J5dGVzU2lua19jb25zdGFudHNTaW5rX3NpbmtsaWJyYXJ5T2Zmc2V0c2NsYXNzT2Zmc2V0c3Byb2NlZHVyZU9mZnNldHNfYmluYXJ5T2Zmc2V0Rm9yU291cmNlVGFibGVfYmluYXJ5T2Zmc2V0Rm9yTGlua1RhYmxlX2JpbmFyeU9mZnNldEZvck1ldGFkYXRhUGF5bG9hZHNfYmluYXJ5T2Zmc2V0Rm9yTWV0YWRhdGFNYXBwaW5nc19iaW5hcnlPZmZzZXRGb3JTdHJpbmdUYWJsZV9iaW5hcnlPZmZzZXRGb3JDb25zdGFudFRhYmxlX2Nhbm9uaWNhbE5hbWVMaXN0X2tub3duQ2Fub25pY2FsTmFtZU5vblJvb3RUb3BzX3JlaW5kZXhlZENhbm9uaWNhbE5hbWVzaW5zaWRlRXh0ZXJuYWxMaWJyYXJ5X2VtcHR5TmFtZV9mbHVzaGZsdXNoQW5kRGVzdHJveWFkZEJ5dGVhZGRCeXRlc2FkZEJ5dGUyYWRkQnl0ZTR1dGY4Qnl0ZXN3cml0ZVN0cmluZ1RhYmxlaW5kZXhlcm1pbkxlbmd0aHJlcXVpcmVkTWluTGVuZ3RoYWxsb2NhdGVNaW5MZW5ndGhuZXdJbmRleG5ld0xlbmd0aGNvbnZlcnRlZHB1dHdyaXRlU3RyaW5nUmVmZXJlbmNlTGlzdHN0cmluZ3N3cml0ZUNvbnN0YW50UmVmZXJlbmNld3JpdGVDb25zdGFudFRhYmxldGFrZUJ5dGVzd3JpdGVDb25zdGFudFRhYmxlRW50cnlvbGRTaW5raW5pdGlhbE9mZnNldHdyaXRlSW50ZWdlcndyaXRlRG91Ymxld3JpdGVOdWxsQWxsb3dlZFJlZmVyZW5jZXdyaXRlQ2xhc3NSZWZlcmVuY2V3cml0ZU5vbk51bGxDYW5vbmljYWxOYW1lUmVmZXJlbmNlVW5zdXBwb3J0ZWQgY29uc3RhbnQgd3JpdGVVcmlSZWZlcmVuY2VpdGVtc3dyaXRlSXRlbXdyaXRlTm9kZUxpc3RsZW53cml0ZVByb2NlZHVyZU5vZGVMaXN0d3JpdGVQcm9jZWR1cmVOb2Rld3JpdGVGaWVsZE5vZGVMaXN0d3JpdGVGaWVsZE5vZGV3cml0ZUNsYXNzTm9kZUxpc3R3cml0ZUNsYXNzTm9kZXdyaXRlQ29uc3RydWN0b3JOb2RlTGlzdHdyaXRlQ29uc3RydWN0b3JOb2Rld3JpdGVSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvck5vZGVMaXN0d3JpdGVSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvck5vZGV3cml0ZVN3aXRjaENhc2VOb2RlTGlzdHdyaXRlU3dpdGNoQ2FzZU5vZGV3cml0ZUNhdGNoTm9kZUxpc3R3cml0ZUNhdGNoTm9kZXdyaXRlVHlwZWRlZk5vZGVMaXN0d3JpdGVUeXBlZGVmTm9kZV93cml0ZU5vZGVNZXRhZGF0YXdyaXRlRnVuY3Rpb25Ob2Rld3JpdGVBcmd1bWVudHNOb2Rld3JpdGVMaWJyYXJ5Tm9kZXdyaXRlT3B0aW9uYWxOb2Rld3JpdGVPcHRpb25hbEZ1bmN0aW9uTm9kZXdyaXRlTGlua1RhYmxld3JpdGVDYW5vbmljYWxOYW1lRW50cnlpbmRleExpbmtUYWJsZXNob3VsZFdyaXRlTGlicmFyeUNhbm9uaWNhbE5hbWVzX2luZGV4TGlua1RhYmxlSW50ZXJuYWxjaGlsZHJlbmNoaWxkcmVuT3JOdWxsaXNSb290Y29tcG9uZW50T2Zmc2V0d3JpdGVMaXN0T2ZTdHJpbmdzX2NvbGxlY3RNZXRhZGF0YV93cml0ZU5vZGVNZXRhZGF0YUltcGxjaGVja0Nhbm9uaWNhbE5hbWV3cml0ZUxpYnJhcmllc3dyaXRlVXJpVG9Tb3VyY2Vfd3JpdGVNZXRhZGF0YVNlY3Rpb253cml0ZUNvbXBvbmVudEluZGV4bm9kZU9mZnNldHN1YnNlY3Rpb25Ob2RlcyBvZiB0eXBlICBjYW4ndCBoYXZlIG1ldGFkYXRhLk5vZGUgd3JpdHRlbiBpbnRvIG1ldGFkYXRhIGNhbid0IGhhdmUgbWV0YWRhdGEgKG1ldGFkYXRhOiAsIG5vZGU6IG1ldGFkYXRhTWFwcGluZ2VudGVycHVzaFNjb3BlcG9wU2NvcGVtZXRhZGF0YVBheWxvYWRzQWxpZ25tZW50bWFwcGluZ0xlbmd0aGtlcm5lbEZpbGVBbGlnbm1lbnRudW1Db21wb25lbnRJbmRleEVudHJpZXN1bmFsaWduZWRTaXpldXJpQXNTdHJpbmdvdXRwdXRTdHJpbmdWaWFCdWZmZXJwcmV2aW91c0xpbmVTdGFydGppbXBvcnRVcmlBc1N0cmluZ3dyaXRlTGlicmFyeURlcGVuZGVuY3lSZWZlcmVuY2VSZWZlcmVuY2UgdG8gbGlicmFyeSBkZXBlbmRlbmN5ICBvdXQgb2Ygc2NvcGVNaXNzaW5nIGNhbm9uaWNhbCBuYW1lIGZvciB3cml0ZU5vbk51bGxSZWZlcmVuY2VHb3QgbnVsbCByZWZlcmVuY2Vub25Sb290VG9wRXhwZWN0ZWQgYSBjYW5vbmljYWwgbmFtZSB0byBiZSB2YWxpZCBidXQgd2FzIGBudWxsYC53cml0ZUxpYnJhcnlSZWZlcmVuY2VhbGxvd051bGxFeHBlY3RlZCBhIGxpYnJhcnkgcmVmZXJlbmNlIHRvIGJlIHZhbGlkIGJ1dCB3YXMgYG51bGxgLndyaXRlT2Zmc2V0RXhwZWN0ZWQgYSBjbGFzcyByZWZlcmVuY2UgdG8gYmUgdmFsaWQgYnV0IHdhcyBgbnVsbGAud3JpdGVBbm5vdGF0aW9uTGlzdHdyaXRlTGlicmFyeURlcGVuZGVuY2llc3dyaXRlQWRkaXRpb25hbEV4cG9ydHN3cml0ZUxpYnJhcnlQYXJ0c3NvdXJjZVJlZmVyZW5jZXNPZmZzZXRzb3VyY2VSZWZlcmVuY2VzQ291bnRpbXBvcnROb2Rld3JpdGVMaWJyYXJ5RGVwZW5kZW5jeXJlZnBhcnROb2Rld3JpdGVMaWJyYXJ5UGFydHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbkxpc3R3cml0ZUFubm90YXRpb25fZW5jb2RlQ2xhc3NGbGFnc2xldmVsSW5kZXhyZXN0b3JlU2NvcGVjdXJyZW50bHlJbk5vbmltcGxlbWVudGF0aW9uU2F2ZWR3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb25vbGRMYWJlbHNvbGRDYXNlc2xvZ2ljYWxPcGVyYXRvckluZGV4JiZ8fE5vdCBhIGxvZ2ljYWwgb3BlcmF0b3I6IGJpYXNlZFZhbHVlYWJzYWRkRG91Ymxld3JpdGVTdGF0ZW1lbnRPckVtcHR5X2VuY29kZVRyeUNhdGNoRmxhZ3NuZWVkc1N0YWNrVHJhY2V3cml0ZU9wdGlvbmFsVmFyaWFibGVEZWNsYXJhdGlvbmRlY2xhcmVkZWZhdWx0Tm9kZXNlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBOb2Rlc2RlZmF1bHRDb25zdGFudHNlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBDb25zdGFudHNkZWZhdWx0QmFzaWNMaXRlcmFsc2VyaWFsaXphdGlvbiBvZiBnZW5lcmljIEJhc2ljTGl0ZXJhbHNkZWZhdWx0Q29uc3RhbnRSZWZlcmVuY2VzZXJpYWxpemF0aW9uIG9mIGdlbmVyaWMgQ29uc3RhbnQgcmVmZXJlbmNlc2RlZmF1bHREYXJ0VHlwZXNlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBEYXJ0VHlwZXNkZWZhdWx0RXhwcmVzc2lvbnNlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBFeHByZXNzaW9uc2RlZmF1bHRJbml0aWFsaXplcnNlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBJbml0aWFsaXplcnNkZWZhdWx0TWVtYmVyc2VyaWFsaXphdGlvbiBvZiBnZW5lcmljIE1lbWJlcnNkZWZhdWx0TWVtYmVyUmVmZXJlbmNlc2VyaWFsaXphdGlvbiBvZiBnZW5lcmljIE1lbWJlciByZWZlcmVuY2VzZGVmYXVsdFN0YXRlbWVudHNlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBTdGF0ZW1lbnRzc2VyaWFsaXphdGlvbiBvZiBnZW5lcmljIFRyZWVOb2Rlc3NlcmlhbGl6YXRpb24gb2YgQm9vbENvbnN0YW50c3NlcmlhbGl6YXRpb24gb2YgQm9vbENvbnN0YW50IHJlZmVyZW5jZXNzZXJpYWxpemF0aW9uIG9mIENsYXNzIHJlZmVyZW5jZXNzZXJpYWxpemF0aW9uIG9mIENvbnN0cnVjdG9yIHJlZmVyZW5jZXNzZXJpYWxpemF0aW9uIG9mIERvdWJsZUNvbnN0YW50c3NlcmlhbGl6YXRpb24gb2YgRG91YmxlQ29uc3RhbnQgcmVmZXJlbmNlc3NlcmlhbGl6YXRpb24gb2YgRmllbGQgcmVmZXJlbmNlc3NlcmlhbGl6YXRpb24gb2YgSW5zdGFuY2VDb25zdGFudHNzZXJpYWxpemF0aW9uIG9mIEluc3RhbmNlQ29uc3RhbnQgcmVmZXJlbmNlc3NlcmlhbGl6YXRpb24gb2YgSW50Q29uc3RhbnRzc2VyaWFsaXphdGlvbiBvZiBJbnRDb25zdGFudCByZWZlcmVuY2Vzc2VyaWFsaXphdGlvbiBvZiBMaWJyYXJ5RGVwZW5kZW5jeXNzZXJpYWxpemF0aW9uIG9mIExpYnJhcnlQYXJ0c3NlcmlhbGl6YXRpb24gb2YgTGlzdENvbnN0YW50c3NlcmlhbGl6YXRpb24gb2YgTGlzdENvbnN0YW50IHJlZmVyZW5jZXNzZXJpYWxpemF0aW9uIG9mIFNldENvbnN0YW50c3NlcmlhbGl6YXRpb24gb2YgU2V0Q29uc3RhbnQgcmVmZXJlbmNlc3NlcmlhbGl6YXRpb24gb2YgTWFwQ29uc3RhbnRzc2VyaWFsaXphdGlvbiBvZiBNYXBDb25zdGFudCByZWZlcmVuY2Vzc2VyaWFsaXphdGlvbiBvZiBOYW1lc3NlcmlhbGl6YXRpb24gb2YgTnVsbENvbnN0YW50c3NlcmlhbGl6YXRpb24gb2YgTnVsbENvbnN0YW50IHJlZmVyZW5jZXNzZXJpYWxpemF0aW9uIG9mIFByb2NlZHVyZSByZWZlcmVuY2Vzc2VyaWFsaXphdGlvbiBvZiBDb21wb25lbnRzc2VyaWFsaXphdGlvbiBvZiBSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciByZWZlcmVuY2Vzc2VyaWFsaXphdGlvbiBvZiBTdHJpbmdDb25zdGFudHNzZXJpYWxpemF0aW9uIG9mIFN0cmluZ0NvbnN0YW50IHJlZmVyZW5jZXNzZXJpYWxpemF0aW9uIG9mIFN5bWJvbENvbnN0YW50c3NlcmlhbGl6YXRpb24gb2YgU3ltYm9sQ29uc3RhbnQgcmVmZXJlbmNlc3NlcmlhbGl6YXRpb24gb2YgUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudHMgc2VyaWFsaXphdGlvbiBvZiBQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50IHJlZmVyZW5jZXNzZXJpYWxpemF0aW9uIG9mIFRlYXJPZmZDb25zdGFudHMgc2VyaWFsaXphdGlvbiBvZiBUZWFyT2ZmQ29uc3RhbnQgcmVmZXJlbmNlc3NlcmlhbGl6YXRpb24gb2YgVHlwZUxpdGVyYWxDb25zdGFudHNzZXJpYWxpemF0aW9uIG9mIFR5cGVMaXRlcmFsQ29uc3RhbnQgcmVmZXJlbmNlc3NlcmlhbGl6YXRpb24gb2YgVHlwZWRlZiByZWZlcmVuY2Vzc2VyaWFsaXphdGlvbiBvZiBVbmV2YWx1YXRlZENvbnN0YW50c3NlcmlhbGl6YXRpb24gb2YgVW5ldmFsdWF0ZWRDb25zdGFudCByZWZlcmVuY2VzVmFyaWFibGVJbmRleGVyc2NvcGVzc3RhY2tIZWlnaHRudW1iZXJPZlZhcmlhYmxlc0xhYmVsSW5kZXhlclN3aXRjaENhc2VJbmRleGVyY2FzZU5vZGVDb25zdGFudEluZGV4ZXJvZmZzZXRzbmV4dE9mZnNldF9wcmludGVyb2xkT2Zmc2V0bmV3T2Zmc2V0VHlwZVBhcmFtZXRlckluZGV4ZXJUeXBlIHBhcmFtZXRlciAgaXMgbm90IGluZGV4ZWRTdHJpbmdJbmRleGVyVXJpSW5kZXhlckJ1ZmZlcmVkU2lua1NJWkVTQUZFX1NJWkVTTUFMTF9idWZmZXJmbHVzaGVkTGVuZ3RoX2RvdWJsZUJ1ZmZlcl9kb3VibGVCdWZmZXJVaW50OGFzVWludDhMaXN0Ynl0ZTFieXRlMmJ5dGUzYnl0ZTRhbHJlYWR5RW1pdHRlZHJlbWFpbmRlcl9NZXRhZGF0YVN1YnNlY3Rpb25CeXRlc1NpbmtOb3RRdWl0ZVN0cmluZ3dyaXRlVXRmOGNvZGVVbml0bmV4dENoYXJrZXJuZWwuYXN0X2Zyb21fYmluYXJ5UGFyc2VFcnJvcmJ5dGVJbmRleCBhdCBJbnZhbGlkS2VybmVsVmVyc2lvbkVycm9yVW5leHBlY3RlZCBLZXJuZWwgdmVyc2lvbiAoZXhwZWN0ZWQgKS5DYW5vbmljYWxOYW1lRXJyb3JfQ29tcG9uZW50SW5kZXhudW1iZXJPZkZpeGVkRmllbGRzYmluYXJ5T2Zmc2V0Rm9yU291cmNlVGFibGViaW5hcnlPZmZzZXRGb3JDYW5vbmljYWxOYW1lc2JpbmFyeU9mZnNldEZvck1ldGFkYXRhUGF5bG9hZHNiaW5hcnlPZmZzZXRGb3JNZXRhZGF0YU1hcHBpbmdzYmluYXJ5T2Zmc2V0Rm9yU3RyaW5nVGFibGViaW5hcnlPZmZzZXRGb3JDb25zdGFudFRhYmxlbWFpbk1ldGhvZFJlZmVyZW5jZWxpYnJhcnlDb3VudGNvbXBvbmVudEZpbGVTaXplSW5CeXRlc3ZhcmlhYmxlU3RhY2tsYWJlbFN0YWNrbGFiZWxTdGFja0Jhc2Vzd2l0Y2hDYXNlU3RhY2t0eXBlUGFyYW1ldGVyU3RhY2tfYnl0ZXNfYnl0ZU9mZnNldF9zdHJpbmdUYWJsZV9zb3VyY2VVcmlUYWJsZV9jb25zdGFudFRhYmxlX2xpbmtUYWJsZV90cmFuc2Zvcm1lckZsYWdzX2N1cnJlbnRMaWJyYXJ5X2NvbXBvbmVudFN0YXJ0T2Zmc2V0ZGVidWdQYXRoX2lzUmVhZGluZ0xpYnJhcnlJbXBsZW1lbnRhdGlvbl9kaXNhYmxlTGF6eVJlYWRpbmdieXRlT2Zmc2V0cmVhZERvdWJsZXJlYWRTdHJpbmdFbnRyeW51bUJ5dGVzbnVtQnl0ZU9yZGVyTWFya3Pvu79fcmVhZE1ldGFkYXRhTWFwcGluZ3NfYXNzb2NpYXRlTWV0YWRhdGFyZWFkU3RyaW5nVGFibGV0YWJsZWVuZE9mZnNldHNzdGFydE9mZnNldHJlYWRDb25zdGFudFRhYmxlcmVhZENvbnN0YW50VGFibGVFbnRyeWNvbnN0YW50VGFncmVhZEV4cHJlc3Npb25yZWFkTGlicmFyeVJlZmVyZW5jZXJlYWRDb25zdGFudFJlZmVyZW5jZXJlYWRDbGFzc1JlZmVyZW5jZWZpZWxkVmFsdWVDb3VudGdldFJlZmVyZW5jZXVuZXhwZWN0ZWQgY29uc3RhbnQgdGFnOiByZWFkVXJpUmVmZXJlbmNlcmVhZFN0cmluZ1JlZmVyZW5jZUxpc3RyZWFkU3RyaW5nT3JOdWxsSWZFbXB0eXJlYWRBbmRDaGVja09wdGlvblRhZ3VuZXhwZWN0ZWQgb3B0aW9uIHRhZzogcmVhZEFubm90YXRpb25MaXN0X2ZpbGxUcmVlTm9kZUxpc3RidWlsZE9iamVjdF9maWxsTm9uVHJlZU5vZGVMaXN0X3NraXBOb2RlTGlzdHNraXBPYmplY3RfbWVyZ2VOYW1lZE5vZGVMaXN0cmVhZE9iamVjdG51bWJlck9mTm9kZXNyZWFkTGlua1RhYmxlbGlua1Jvb3RiaWFzZWRQYXJlbnRJbmRleF9pbmRleENvbXBvbmVudHNzYXZlZEJ5dGVPZmZzZXRzaXplaW5kaWNhdGVkIHNpemUgZG9lcyBub3QgbWF0Y2ggZmlsZSBzaXplcmV2ZXJzZWRjaGVja0Nhbm9uaWNhbE5hbWVzbWFnaWNOb3QgYSAuZGlsbCBmaWxlICh3cm9uZyBtYWdpYyBudW1iZXIpLmNvbXBvbmVudEZpbGVTaXplc2NvbXBvbmVudEZpbGVJbmRleF9yZWFkT25lQ29tcG9uZW50X2NoZWNrQ2Fub25pY2FsTmFtZUNoaWxkcmVuX3JlYWRPbmVDb21wb25lbnRTb3VyY2VyZWFkU2luZ2xlRmlsZUNvbXBvbmVudGludmFsaWQgY29tcG9uZW50IGRhdGFDb25jYXRlbmF0ZWQgY29tcG9uZW50IGZpbGUgZ2l2ZW4gd2hlbiBhIHNpbmdsZSBjb21wb25lbnQgd2FzIGV4cGVjdGVkLlVucmVjb2duaXplZCBieXRlcyBmb2xsb3dpbmcgY29tcG9uZW50IGRhdGFwYXJlbnRDaGlsZHJlbkBtZXRob2RzQHR5cGVkZWZzQGZpZWxkc0BnZXR0ZXJzQHNldHRlcnNAZmFjdG9yaWVzQGNvbnN0cnVjdG9yc2NoZWNrUmVmZXJlbmNlTm9kZU51bGwgcmVmZXJlbmNlICgpIChDYW5vbmljYWwgbmFtZSBhbmQgcmVmZXJlbmNlIGRvZXNuJ3QgYWdyZWUuUmVmZXJlbmNlIGlzIG51bGwgKF9yZWFkQ29tcG9uZW50SW5kZXhjb21wb25lbnRGaWxlU2l6ZXNhdmVkQnl0ZUluZGV4TWFsZm9ybWVkIGJpbmFyeTogVGhpcyBjb21wb25lbnQgZmlsZSdzIGNvbXBvbmVudCBpbmRleCBpbmRpY2F0ZXMgdGhhdCB0aGUgZmlsZXNpemUgc2hvdWxkIGJlICBidXQgb3RoZXIgY29tcG9uZW50IGluZGV4ZXMgaGFzIGluZGljYXRlZCB0aGF0IHRoZSBzaXplIHNob3VsZCBiZSBmb3JtYXRWZXJzaW9ucmVhZFVyaVRvU291cmNlcmVhZExpc3RPZlN0cmluZ3NudW1iZXJPZkxpYnJhcmllc3JlYWRMaWJyYXJ5Z2V0TWVtYmVyUmVmZXJlbmNlRnJvbUludHVyaUJ5dGVzc291cmNlQ29kZWxpbmVDb3VudGltcG9ydFVyaUJ5dGVzZ2V0Q2Fub25pY2FsTmFtZVJlZmVyZW5jZUZyb21JbnRyZWFkTGlicmFyeURlcGVuZGVuY3lSZWZlcmVuY2VyZWFkTWVtYmVyUmVmZXJlbmNlRXhwZWN0ZWQgYSBtZW1iZXIgcmVmZXJlbmNlIHRvIGJlIHZhbGlkIGJ1dCB3YXMgYG51bGxgLnJlYWRUeXBlZGVmUmVmZXJlbmNlZW5kT2Zmc2V0cHJvY2VkdXJlQ291bnRjbGFzc0NvdW50c2hvdWxkV3JpdGVEYXRhX3JlYWRMaWJyYXJ5RGVwZW5kZW5jaWVzX3JlYWRBZGRpdGlvbmFsRXhwb3J0c19yZWFkTGlicmFyeVBhcnRzcmVhZFR5cGVkZWZyZWFkQ2xhc3NyZWFkRmllbGRyZWFkUHJvY2VkdXJlcmVhZExpYnJhcnlEZXBlbmRlbmN5cmVhZE9mZnNldHJlYWRFeHByZXNzaW9uTGlzdHByZWZpeE5hbWVyZWFkQ29tYmluYXRvckxpc3RudW1FeHBvcnRlZFJlZmVyZW5jZWV4cG9ydGVkTmFtZXJlYWRDb21iaW5hdG9ycmVhZExpYnJhcnlQYXJ0cmVhZEFuZFB1c2hUeXBlUGFyYW1ldGVyTGlzdHJlYWRBbmRQdXNoVmFyaWFibGVEZWNsYXJhdGlvbkxpc3Rub3JtYWwtY2xhc3NyZWFkU3VwZXJ0eXBlT3B0aW9ucmVhZFN1cGVydHlwZXJlYWRDb25zdHJ1Y3RvcnJlYWRSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcmdldEFuZFJlc2V0VHJhbnNmb3JtZXJGbGFnc2FkZFRyYW5zZm9ybWVyRmxhZ3JlYWRFeHByZXNzaW9uT3B0aW9uY29uc3RydWN0b3JwdXNoVmFyaWFibGVEZWNsYXJhdGlvbnNyZWFkSW5pdGlhbGl6ZXJraW5kSW5kZXhmdW5jdGlvbk5vZGVTaXplcmVhZEZ1bmN0aW9uTm9kZU5vd3JlYWRGdW5jdGlvbk5vZGVPcHRpb25yZWRpcmVjdGluZy1mYWN0b3J5LWNvbnN0cnVjdG9ycmVhZERhcnRUeXBlTGlzdHR5cGVQYXJhbWV0ZXJTdGFja0hlaWdodHZhcmlhYmxlU3RhY2tIZWlnaHRyZWFkQXJndW1lbnRzcmVhZEFuZFB1c2hWYXJpYWJsZURlY2xhcmF0aW9ucmVhZFN0YXRlbWVudHVuZXhwZWN0ZWQgaW5pdGlhbGl6ZXIgdGFnOiBsYXp5TG9hZEJvZHlvdXRlckVuZE9mZnNldG9sZExhYmVsU3RhY2tCYXNlcmVhZFN0YXRlbWVudE9wdGlvbl9zZXRMYXp5TG9hZEZ1bmN0aW9uY29tcG9uZW50U3RhcnRPZmZzZXRjdXJyZW50TGlicmFyeXB1c2hWYXJpYWJsZURlY2xhcmF0aW9ucmVhZFZhcmlhYmxlUmVmZXJlbmNldW5leHBlY3RlZCB2YXJpYWJsZSBpbmRleDogbG9naWNhbE9wZXJhdG9yVG9TdHJpbmd1bmV4cGVjdGVkIGxvZ2ljYWwgb3BlcmF0b3IgaW5kZXg6IHRhZ0J5dGVyZWFkRGFydFR5cGVPcHRpb25hc3NlcnRDb3VudHJlYWRNYXBFbnRyeUxpc3RyZWFkVmFyaWFibGVEZWNsYXJhdGlvbnJlYWRTdGF0ZW1lbnRMaXN0dW5leHBlY3RlZCBleHByZXNzaW9uIHRhZzogcmVhZE1hcEVudHJ5cmVhZFN0YXRlbWVudE9yTnVsbElmRW1wdHlyZWFkQmxvY2tyZWFkQXNzZXJ0QmxvY2tsYWJlbHJlYWRTd2l0Y2hDYXNlSW50b3JlYWRDYXRjaExpc3R1bmV4cGVjdGVkIHN0YXRlbWVudCB0YWc6IHJlYWRDYXRjaHJlYWRBbmRQdXNoVmFyaWFibGVEZWNsYXJhdGlvbk9wdGlvbnJlYWRTdXBlcnR5cGVMaXN0cmVhZE5hbWVkVHlwZUxpc3RyZWFkTmFtZWRUeXBldG90YWxQYXJhbWV0ZXJDb3VudHVuZXhwZWN0ZWQgZGFydCB0eXBlIHRhZzogcmVhZFR5cGVQYXJhbWV0ZXJudW1Bcmd1bWVudHNyZWFkTmFtZWRFeHByZXNzaW9uTGlzdHJlYWROYW1lZEV4cHJlc3Npb25CaW5hcnlCdWlsZGVyV2l0aE1ldGFkYXRhX3N1YnNlY3Rpb25zc3ViU2VjdGlvbkNvdW50bWFwcGluZ1N0YXJ0bWV0YWRhdGFPZmZzZXRfcmVhZE1ldGFkYXRhc2F2ZWRPZmZzZXRwYXJhbWtlcm5lbC5hc3RfdG9fdGV4dE5hbWVyZ2V0TmFtZXB1dElmQWJzZW50Tm9ybWFsTmFtZXJfQ29uc3RhbnROYW1lciZSZWN1cnNpdmVWaXNpdG9yJk5hbWVyQ29uc3RhbnROYW1lckRpc2FtYmlndWF0b3JVbmFtZXNUbmFtZXNVZGlzYW1iaWd1YXRla2V5MWtleTJwcm9wb3NlTmFtZWdldE5ld05hbWVwcm9wb3NlZE5hbWVDYW5ub3QgZGlzYW1iaWd1YXRlTmFtZVN5c3RlbSN0I20jY2xhc3MjbGliI1RsYWJlbHMjTGNvbnN0YW50cyNDcHJlZml4ZXNwYXRoU2VwYXJhdG9yW1wvXXB1bmN0dWF0aW9uWy46XW5hbWVWYXJpYWJsZW5hbWVNZW1iZXJuYW1lQ2xhc3NuYW1lTGlicmFyeW5hbWVUeXBlUGFyYW1ldGVybmFtZVN3aXRjaENhc2VuYW1lTGFiZWxlZFN0YXRlbWVudG5hbWVDb25zdGFudG5hbWVMaWJyYXJ5UHJlZml4YWJicmV2aWF0ZU5hbWVoYXNFbXB0eVBhdGhMbmFtZUNhbm9uaWNhbE5hbWVBc0xpYnJhcnlQcmVmaXhzbGFzaGRvdEFubm90YXRvcmFubm90YXRlVmFyaWFibGVwcmludGVyYW5ub3RhdGVSZXR1cm5hbm5vdGF0ZUZpZWxkUHJpbnRlcnN5bnRoZXRpY05hbWVzYW5ub3RhdG9yaW1wb3J0VGFibGVTUEFDRVdPUkRTWU1CT0xlbXB0eU5hbWVTdHJpbmfigKJlbXB0eU5hbWVjcmVhdGVJbm5lcnNob3VsZEhpZ2hsaWdodHN0YXJ0SGlnaGxpZ2h0ZW5kSGlnaGxpZ2h0Z2V0TGlicmFyeU5hbWVnZXRMaWJyYXJ5UmVmZXJlbmNlPE5vIExpYnJhcnk+Z2V0SW1wb3J0SW5kZXhnZXRDbGFzc05hbWU8Tm8gQ2xhc3M+Z2V0VHlwZWRlZlJlZmVyZW5jZTxObyBUeXBlZGVmPmdldE1lbWJlck5hbWU8Tm8gTWVtYmVyPmdldFZhcmlhYmxlTmFtZWdldFZhcmlhYmxlUmVmZXJlbmNlPE5vIFZhcmlhYmxlRGVjbGFyYXRpb24+Z2V0VHlwZVBhcmFtZXRlck5hbWVnZXRUeXBlUGFyYW1ldGVyUmVmZXJlbmNlPE5vIFR5cGVQYXJhbWV0ZXI+d3JpdGVDb21wb25lbnRQcm9ibGVtc3dyaXRlUHJvYmxlbXNBc0pzb25Qcm9ibGVtcyBpbiBjb21wb25lbnRoZWFkZXJlbmRMaW5lLy8vLyB0cmltbWVkdHJpbVJpZ2h0d3JpdGVXb3JkaW1wb3J0c2lubmVyd3JpdGVTdGFuZGFyZExpYnJhcnlDb250ZW50b3V0ZXJQcmludGVyaW1wb3J0c1RvUHJpbnRwcmludExpYnJhcnlJbXBvcnRUYWJsZWltcG9ydGVkTGlicmFyaWVzaW1wb3J0UGF0aGdldEltcG9ydFBhdGhzZWxmaW1wb3J0IHNlbGYgYXMgaW1wb3J0ICIiIGFzIFByb2JsZW1zIGluIGxpYnJhcnlhZGRpdGlvbmFsRXhwb3J0cyA9IChpc0ZpcnN0bm9kZUxpYnJhcnl3cml0ZVNwYWNlZHdyaXRlTWVtYmVyUmVmZXJlbmNlRnJvbVJlZmVyZW5jZXdyaXRlTWV0YWRhdGFhc2NvbnN0YW50cyBnZXRQcmVjZWRlbmNld3JpdGVTcGFjZWVuc3VyZVNwYWNld3JpdGVTeW1ib2x3cml0ZUNvbW1hZW5zdXJlV29yZEJvdW5kYXJ5d3JpdGVJbmRlbnRhdGlvbjxOdWxsPmhpZ2hsaWdodFtdbWRub2RlTWV0YWRhdGFbQHdyaXRlQW5ub3RhdGVkVHlwZXdyaXRlVHlwZTxObyBEYXJ0VHlwZT53cml0ZU9wdGlvbmFsVHlwZTxObyBTdXBlcnR5cGU+d3JpdGVDbGFzc1JlZmVyZW5jZUZyb21SZWZlcmVuY2V3cml0ZVR5cGVkZWZSZWZlcmVuY2V3cml0ZU1vZGlmaWVyaXNUaGVyZTxhbm9uPndyaXRlRnVuY3Rpb250ZXJtaW5hdGVMaW5ld3JpdGVUeXBlUGFyYW1ldGVyTGlzdHdyaXRlUGFyYW1ldGVyTGlzdHdyaXRlUmV0dXJuVHlwZWdldEFzeW5jTWFya2VyS2V5d29yZC8qIG9yaWdpbmFsbHkqL3dyaXRlRnVuY3Rpb25Cb2R5bWFya2Vyc3luY3N5bmMqYXN5bmNhc3luYyp5aWVsZGluZzxJbnZhbGlkIGFzeW5jIG1hcmtlcjoge317PT53cml0ZUV4cHJlc3Npb253cml0ZUJvZHl3cml0ZUZ1bmN0aW9uVHlwZXR5cGVkZWZQb3NpdGlvbmFsdHlwZWRlZk5hbWVkcGFyYW1ldGVyc0Fubm90YXRlZGZvcm1hbOKGkmNhbGxiYWNrZ2V0Q2xhc3NSZWZlcmVuY2VGcm9tUmVmZXJlbmNlZ2V0Q2Fub25pY2FsTmFtZVN0cmluZ05laXRoZXIgbm9kZSBub3IgY2Fub25pY2FsIG5hbWUgZm91bmRnZXRNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNldW5leHBlY3RlZCByb290dW5leHBlY3RlZCBAbGlicmFyeVN0cmluZ2NsYXNzU3RyaW5nY2xzYXROb2Rld3JpdGVWYXJpYWJsZVJlZmVyZW5jZXdyaXRlVHlwZVBhcmFtZXRlclJlZmVyZW5jZW1pbmltdW1QcmVjZWRlbmNlbmVlZHNQYXJlbnRlc2Vzc2VwYXJhdGVMaW5lc2dlbmVyaWMtY292YXJpYW50LWltcGxbZ2V0dGVyXVtzZXR0ZXJdW25vLWdldHRlcl1bbm8tc2V0dGVyXS8qIGZyb20gICovZm9yd2FyZGluZy1zdHViZm9yd2FyZGluZy1zZW1pLXN0dWJuby1zdWNoLW1ldGhvZC1mb3J3YXJkZXJzeW50aGV0aWNyZWRpcmVjdGluZ19mYWN0b3J5Y2xhc3N3aXRoZXh0ZW5kc2ltcGxlbWVudHNlbmRMaW5lU3RyaW5nIC8vIGZyb20gaW52YWxpZC1leHByZXNzaW9uZXNjYXBlU3RyaW5nd3JpdGVJbnRlcmZhY2VUYXJnZXQuez1zdXBlcm5ldyFwcmVjZWRlbmNld3JpdGVTdGF0aWNUeXBlZ2V0RXNjYXBlZENoYXJhY3Rlclx2XGZcJHBhcnQke2Fzc2VydF9hc3NlcnQoaXNhc3tUeXBlRXJyb3J9dGhpc3JldGhyb3d0aHJvd2F3YWl0bGV0aW5ibG9ja3dyaXRlQmxvY2tCb2R5ID0+ZGVmZXJyZWRhc3NlcnQpO2JyZWFrd2hpbGVkb2ZvcnVzZVZhcktleXdvcmRzd2l0Y2gpIHtjYXNlZGVmYXVsdGNvbnRpbnVlaWZlbHNlcmV0dXJudHJ5b25jYXRjaG5vLWV4Y2VwdGlvbi12YXJmaW5hbGx5eWllbGQqW3lpZWxkXXlpZWxkLi4uO2FsbEFyZ3NpbnZhbGlkLWluaXRpYWxpemVyaW52YWxpZC10eXBlZHluYW1pY3ZvaWQgPSAgPSAiID0gKFByZWNlZGVuY2VFWFBSRVNTSU9OQ09ORElUSU9OQUxMT0dJQ0FMX05VTExfQVdBUkVMT0dJQ0FMX09STE9HSUNBTF9BTkRFUVVBTElUWVJFTEFUSU9OQUxCSVRXSVNFX09SQklUV0lTRV9YT1JCSVRXSVNFX0FORFNISUZUQURESVRJVkVNVUxUSVBMSUNBVElWRVBSRUZJWFBPU1RGSVhUWVBFX0xJVEVSQUxQUklNQVJZQ0FMTEVFYmluYXJ5UHJlY2VkZW5jZT8/IT1vZmlzQXNzb2NpYXRpdmVCaW5hcnlPcGVyYXRvckV4cHJlc3Npb25QcmludGVyd3JpdGVlcmdsb2JhbERlYnVnZ2luZ05hbWVzZGVidWdMaWJyYXJ5TmFtZWRlYnVnQ2xhc3NOYW1lZGVidWdRdWFsaWZpZWRDbGFzc05hbWVkZWJ1Z01lbWJlck5hbWVkZWJ1Z1F1YWxpZmllZE1lbWJlck5hbWVkZWJ1Z1R5cGVQYXJhbWV0ZXJOYW1lZGVidWdRdWFsaWZpZWRUeXBlUGFyYW1ldGVyTmFtZWRlYnVnVmFyaWFibGVEZWNsYXJhdGlvbk5hbWVkZWJ1Z05vZGVUb1N0cmluZ2NvbXBvbmVudFRvU3RyaW5ncHJvY2VkdXJlS2luZFRvU3RyaW5nZ2V0aWxsZWdhbCBQcm9jZWR1cmVLaW5kOiBrZXJuZWwuY2xhc3NfaGllcmFyY2h5SGFuZGxlQW1iaWd1b3VzU3VwZXJ0eXBlc01peGluSW5mZXJyZXJpbmZlckNsYXNzSGllcmFyY2h5b25BbWJpZ3VvdXNTdXBlcnR5cGVzbWl4aW5JbmZlcnJlciBjYW4ndCBpbXBsZW1lbnQgYm90aCBfaW5pdGlhbGl6ZWdldE9yZGVyZWRDbGFzc2VzdW5vcmRlcmVkZ2VuZXJpY1N1cGVydHlwZXNPZmdldExlZ2FjeUxlYXN0VXBwZXJCb3VuZHR5cGUxZ2V0Q2xhc3NBc0luc3RhbmNlT2Zhc0luc3RhbnRpYXRpb25PZmdldERpc3BhdGNoVGFyZ2V0c2V0dGVyZ2V0RGlzcGF0Y2hUYXJnZXRzc2V0dGVyc2dldEludGVyZmFjZU1lbWJlcmdldEludGVyZmFjZU1lbWJlcnNnZXREZWNsYXJlZE1lbWJlcnNpc1N1YmNsYXNzT2ZzdWJjbGFzc2lzU3VidHlwZU9mc3VidHlwZWlzVXNlZEFzTWl4aW5mb3JFYWNoT3ZlcnJpZGVQYWlyYXBwbHlUcmVlQ2hhbmdlc3JlbW92ZWRMaWJyYXJpZXNlbnN1cmVLbm93bkxpYnJhcmllc3JlaXNzdWVBbWJpZ3VvdXNTdXBlcnR5cGVzRm9yYXBwbHlNZW1iZXJDaGFuZ2VzZmluZERlc2NlbmRhbnRzbWVyZ2VTb3J0ZWRMaXN0c3NlY29uZGZpcnN0TWVtYmVyc2Vjb25kTWVtYmVyY29tcGFyZWNvbXBhcmVNZW1iZXJzX2NvbXBhcmVOYW1lc2ZpcnN0TmFtZXNlY29uZE5hbWVmaXJzdEhhc2hzZWNvbmRIYXNoZmlyc3RTdHJpbmdzZWNvbmRTdHJpbmdmaXJzdExlbmd0aHNlY29uZExlbmd0aGZpcnN0TGlicmFyeXNlY29uZExpYnJhcnlmaXJzdFVuaXRzZWNvbmRVbml0ZGVsdGFmaW5kTWVtYmVyQnlOYW1lQ2xhc3NIaWVyYXJjaHlTdWJ0eXBlc2dldFN1YnR5cGVzT2ZnZXRTaW5nbGVUYXJnZXRGb3JJbnRlcmZhY2VJbnZvY2F0aW9uX0NsYXNzSW5mb1N1YnR5cGVjbGFzc0luZm90b3BEb3duSW5kZXhzdWJ0eXBlSW50ZXJ2YWxMaXN0X0Nsb3NlZFdvcmxkQ2xhc3NIaWVyYXJjaHlTdWJ0eXBlc19jbGFzc2VzQnlUb3BEb3duSW5kZXhfaW5mb0ZvcmludmFsaWRhdGVkX3RvcERvd25Tb3J0SW5kZXhfdG9wRG93blNvcnRWaXNpdHN1YkluZm9zdWJ0eXBlU2V0QnVpbGRlcmFkZFNpbmdsZXRvbmRpcmVjdEV4dGVuZGVyc3N1YnR5cGVJbmZvYWRkSW50ZXJ2YWxMaXN0ZGlyZWN0TWl4ZXJzZGlyZWN0SW1wbGVtZW50ZXJzYnVpbGRJbnRlcnZhbExpc3RUaGlzIGRhdGFzdHJ1Y3R1cmUgaGFzIGJlZW4gaW52YWxpZGF0ZWRzdWJ0eXBlc3RvQ2xvc2VkV29ybGRDbGFzc0hpZXJhcmNoeV9vbkFtYmlndW91c1N1cGVydHlwZXNfb25BbWJpZ3VvdXNTdXBlcnR5cGVzTm90V3JhcHBlZGtub3duTGlicmFyaWVzX3JlY29yZGVkQW1iaWd1b3VzU3VwZXJ0eXBlc19jYWNoZWRDbGFzc0hpZXJhcmNoeVN1YnR5cGVzX3RvcFNvcnRJbmRleHJlY29yZGVkbnVtYmVyT2ZDbGFzc2VzY29tcHV0ZVN1YnR5cGVzSW5mb3JtYXRpb251bm9yZGVyZWRTZXRfZ2V0UmFua2VkU3VwZXJjbGFzc0luZm9zbGVhc3RVcHBlckJvdW5kSW5mb3NoZWFwY2hhaW5sYXN0SW5mb25leHRJbmZvYWRkVG9IZWFwaW5mbzFpbmZvMmNsYXNzZXMxY2xhc3NlczJpMWkyY3VycmVudERlcHRobnVtQ2FuZGlkYXRlc0F0VGhpc0RlcHRobmV4dDJkZXB0aHN1cGVyVHlwZTFnZW5lcmljU3VwZXJUeXBlc3N1cGVyVHlwZTI6IE5vIGNsYXNzIGluZm8gZm9yIHN1cGVySW5mb2Nhc3RlZFR5cGVpbXBsZW1lbnRlZFNldHRlcnNpbXBsZW1lbnRlZEdldHRlcnNBbmRDYWxsc19idWlsZEludGVyZmFjZU1lbWJlcnNkZWNsYXJlZFNldHRlcnNkZWNsYXJlZEdldHRlcnNBbmRDYWxsc2Nyb3NzR2V0dGVyc1NldHRlcnNzdXBlckdldHRlcnNzdXBlclNldHRlcnNfcmVwb3J0T3ZlcnJpZGVzZGVjbGFyZWRMaXN0aW5oZXJpdGVkTGlzdGRlY2xhcmVkaW5oZXJpdGVkc3VwZXJ0eXBlc2xpYnNhZGRlZENsYXNzZXNTb3J0ZWRleHBlY3RlZFN0YXJ0SW5kZXhfdG9wb2xvZ2ljYWxTb3J0VmlzaXRvcmRlcmVkTGlzdF9pbml0aWFsaXplVG9wb2xvZ2ljYWxseVNvcnRlZENsYXNzZXNwcm9jZXNzZWRDbGFzc2Vzd29ya2xpc3R0b3BvbG9naWNhbEluZGV4X2J1aWxkRGVjbGFyZWRNZW1iZXJzX2J1aWxkSW1wbGVtZW50ZWRNZW1iZXJzaW50ZXJmYWNlU2V0dGVyc2ludGVyZmFjZUdldHRlcnNBbmRDYWxsc2V4cGVjdGVkU3RhcnRpbmdUb3BvbG9naWNhbEluZGV4X2NvbGxlY3RTdXBlcnNGb3JDbGFzc19yZWNvcmRTdXBlclR5cGVzTm8gaW5mbyBmb3IgIGZyb20gVW5leHBlY3RlZCB0b3BvbG9naWNhbEluZGV4ICggIT0gKSBmb3IgYmVpbmdWaXNpdGVkQ3ljbGljIGluaGVyaXRhbmNlIGludm9sdmluZyBzdXBlckRlcHRobWl4ZWRJbmZvbWl4aW5NZW1iZXJpbmhlcml0ZWRNZW1iZXJzaW5oZXJpdGVkU2V0dGVyc3NraXBBYnN0cmFjdE1lbWJlcnNhbGxJbmhlcml0ZWRNZW1iZXJzaW5oZXJpdEZyb21faW5oZXJpdE1lbWJlcnNkZWNsYXJlZE1lbWJlcmluaGVyaXRlZE1lbWJlcl9nZXRVbnNoYWRvd2VkSW5oZXJpdGVkTWVtYmVyc3JlY29yZEdlbmVyaWNTdXBlclR5cGVzdXBlcmNsYXNzU2V0QnVpbGRlcnN1cGVydHlwZVNldEJ1aWxkZXJzdXBlcnR5cGVJbmZvc3VwZXJjbGFzc0ludGVydmFsTGlzdHN1cGVydHlwZUludGVydmFsTGlzdG1peGVkSW5UeXBlSW5mb2dldEV4cGVuc2VIaXN0b2dyYW1pbnRlcnZhbHNvbGRMZW5ndGhmaWxsUmFuZ2VnZXRDb21wcmVzc2lvblJhdGlvc2l6ZXNnZXRTdXBlclR5cGVIYXNoVGFibGVTaXplc3VtX0ludGVydmFsTGlzdEJ1aWxkZXJldmVudHNhZGRJbnRlcnZhbGluc2lkZUNvdW50ZXZlbnRfQ2xhc3NJbmZvQ2xhc3NTZXRfY2xhc3Nlc19MdWJIZWFwc29ydHNCZWZvcmVzb3J0c0JlZm9yZVN0YXRpY19pbnRlcnZhbExpc3RDb250YWluc2ludGVydmFsTGlzdF9pbnRlcnZhbExpc3RTaXpla2VybmVsLmNvcmVfdHlwZXNDb3JlVHlwZXNyZXF1aXJlZENsYXNzZXNkYXJ0OmNvcmVPYmplY3ROdWxsYm9vbGludG51bWRvdWJsZVN0cmluZ0xpc3RNYXBJdGVyYWJsZUl0ZXJhdG9yU3ltYm9sRnVuY3Rpb25JbnZvY2F0aW9uRmFsbFRocm91Z2hFcnJvcmRhcnQ6X2ludGVybmFsZGFydDphc3luY1N0cmVhbV9jb3JlTGlicmFyeV9vYmplY3RDbGFzc19udWxsQ2xhc3NfYm9vbENsYXNzX2ludENsYXNzX251bUNsYXNzX2RvdWJsZUNsYXNzX3N0cmluZ0NsYXNzX2xpc3RDbGFzc19zZXRDbGFzc19tYXBDbGFzc19pdGVyYWJsZUNsYXNzX2l0ZXJhdG9yQ2xhc3Nfc3ltYm9sQ2xhc3NfdHlwZUNsYXNzX2Z1bmN0aW9uQ2xhc3NfaW52b2NhdGlvbkNsYXNzX2ludm9jYXRpb25NaXJyb3JDbGFzc19pbnZvY2F0aW9uTWlycm9yV2l0aFR5cGVDb25zdHJ1Y3Rvcl9ub1N1Y2hNZXRob2RFcnJvckRlZmF1bHRDb25zdHJ1Y3Rvcl9saXN0RnJvbUNvbnN0cnVjdG9yX2xpc3RVbm1vZGlmaWFibGVDb25zdHJ1Y3Rvcl9pZGVudGljYWxQcm9jZWR1cmVfZmFsbFRocm91Z2hFcnJvclVybEFuZExpbmVDb25zdHJ1Y3Rvcl9vYmplY3RFcXVhbHNfbWFwVW5tb2RpZmlhYmxlX2ludGVybmFsU3ltYm9sQ2xhc3NfYXN5bmNMaWJyYXJ5X2Z1dHVyZUNsYXNzX3N0YWNrVHJhY2VDbGFzc19zdHJlYW1DbGFzc19hc3luY0F3YWl0Q29tcGxldGVyQ2xhc3NfZnV0dXJlT3JDbGFzc19hc3luY0F3YWl0Q29tcGxldGVyQ29uc3RydWN0b3JfY29tcGxldGVPbkFzeW5jUmV0dXJuUHJvY2VkdXJlX2NvbXBsZXRlckNvbXBsZXRlRXJyb3Jfc3luY0l0ZXJhYmxlRGVmYXVsdENvbnN0cnVjdG9yX3N0cmVhbUl0ZXJhdG9yRGVmYXVsdENvbnN0cnVjdG9yX2FzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJEZWZhdWx0Q29uc3RydWN0b3JfYXN5bmNTdGFyTGlzdGVuSGVscGVyUHJvY2VkdXJlX2FzeW5jU3Rhck1vdmVOZXh0SGVscGVyUHJvY2VkdXJlX2FzeW5jU3RhY2tUcmFjZUhlbHBlclByb2NlZHVyZV9hc3luY1RoZW5XcmFwcGVySGVscGVyUHJvY2VkdXJlX2FzeW5jRXJyb3JXcmFwcGVySGVscGVyUHJvY2VkdXJlX2F3YWl0SGVscGVyUHJvY2VkdXJlX2Jvb2xGcm9tRW52aXJvbm1lbnRfbWlycm9yc0xpYnJhcnlfcHJhZ21hQ2xhc3NfcHJhZ21hTmFtZV9wcmFnbWFPcHRpb25zX3ByYWdtYUNvbnN0cnVjdG9yYXN5bmNFcnJvcldyYXBwZXJIZWxwZXJQcm9jZWR1cmVnZXRUb3BMZXZlbE1lbWJlcl9hc3luY0Vycm9yV3JhcHBlckhlbHBlcmFzeW5jTGlicmFyeWdldExpYnJhcnlhc3luY1N0YXJTdHJlYW1Db250cm9sbGVyQWRkZ2V0TWVtYmVyX0FzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJhc3luY1N0YXJTdHJlYW1Db250cm9sbGVyQWRkRXJyb3JhZGRFcnJvcmFzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJBZGRTdHJlYW1hZGRTdHJlYW1hc3luY1N0YXJTdHJlYW1Db250cm9sbGVyQ2xhc3NnZXRDbGFzc2FzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJDbG9zZWFzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJEZWZhdWx0Q29uc3RydWN0b3Jhc3luY1N0YXJTdHJlYW1Db250cm9sbGVyU3RyZWFtZ2V0OnN0cmVhbWFzeW5jU3Rhckxpc3RlbkhlbHBlcl9hc3luY1N0YXJMaXN0ZW5IZWxwZXJhc3luY1N0YXJNb3ZlTmV4dEhlbHBlcl9hc3luY1N0YXJNb3ZlTmV4dEhlbHBlcmFzeW5jU3RhY2tUcmFjZUhlbHBlclByb2NlZHVyZV9hc3luY1N0YWNrVHJhY2VIZWxwZXJhc3luY1RoZW5XcmFwcGVySGVscGVyUHJvY2VkdXJlX2FzeW5jVGhlbldyYXBwZXJIZWxwZXJhd2FpdEhlbHBlclByb2NlZHVyZV9hd2FpdEhlbHBlcmJvb2xDbGFzc2FzeW5jQXdhaXRDb21wbGV0ZXJDbGFzc19Bc3luY0F3YWl0Q29tcGxldGVyYXN5bmNBd2FpdENvbXBsZXRlckNvbnN0cnVjdG9yY29tcGxldGVPbkFzeW5jUmV0dXJuX2NvbXBsZXRlT25Bc3luY1JldHVybmNvbXBsZXRlckNvbXBsZXRlRXJyb3JDb21wbGV0ZXJjb21wbGV0ZXJGdXR1cmVnZXQ6ZnV0dXJlY29yZUxpYnJhcnlkb3VibGVDbGFzc2Z1bmN0aW9uQ2xhc3NmdXR1cmVDbGFzc2Z1dHVyZU9yQ2xhc3N0cnlHZXRDbGFzc0Z1dHVyZU9yaWRlbnRpY2FsUHJvY2VkdXJlaWRlbnRpY2FsaW50Q2xhc3NpbnRlcm5hbFN5bWJvbENsYXNzaW52b2NhdGlvbkNsYXNzaW52b2NhdGlvbk1pcnJvckNsYXNzX0ludm9jYXRpb25NaXJyb3JpbnZvY2F0aW9uTWlycm9yV2l0aFR5cGVDb25zdHJ1Y3Rvcl93aXRoVHlwZWl0ZXJhYmxlQ2xhc3NpdGVyYXRvckNsYXNzbGlzdENsYXNzbGlzdEZyb21Db25zdHJ1Y3Rvcmxpc3RVbm1vZGlmaWFibGVDb25zdHJ1Y3RvcnVubW9kaWZpYWJsZXNldENsYXNzU2V0bWFwQ2xhc3NtYXBVbm1vZGlmaWFibGVtaXJyb3JzTGlicmFyeXRyeUdldExpYnJhcnlkYXJ0Om1pcnJvcnNub1N1Y2hNZXRob2RFcnJvckRlZmF1bHRDb25zdHJ1Y3Rvck5vU3VjaE1ldGhvZEVycm9yd2l0aEludm9jYXRpb25udWxsQ2xhc3NudW1DbGFzc29iamVjdENsYXNzb2JqZWN0RXF1YWxzcHJhZ21hQ2xhc3NwcmFnbWFwcmFnbWFOYW1lcHJhZ21hT3B0aW9uc3ByYWdtYUNvbnN0cnVjdG9yc3RhY2tUcmFjZUNsYXNzU3RhY2tUcmFjZXN0cmVhbUNsYXNzc3RyZWFtSXRlcmF0b3JTdWJzY3JpcHRpb25fU3RyZWFtSXRlcmF0b3Jfc3Vic2NyaXB0aW9uc3RyZWFtSXRlcmF0b3JDYW5jZWxjYW5jZWxzdHJlYW1JdGVyYXRvckNsYXNzc3RyZWFtSXRlcmF0b3JEZWZhdWx0Q29uc3RydWN0b3JzdHJlYW1JdGVyYXRvck1vdmVOZXh0c3RyZWFtSXRlcmF0b3JDdXJyZW50Z2V0OmN1cnJlbnRzdHJpbmdDbGFzc3N5bWJvbENsYXNzc3luY0l0ZXJhYmxlRGVmYXVsdENvbnN0cnVjdG9yX1N5bmNJdGVyYWJsZXN5bmNJdGVyYXRvckNsYXNzX1N5bmNJdGVyYXRvcnN5bmNJdGVyYXRvckN1cnJlbnRzeW5jSXRlcmF0b3JZaWVsZEVhY2hJdGVyYWJsZV95aWVsZEVhY2hJdGVyYWJsZXR5cGVDbGFzc2ZhbGxUaHJvdWdoRXJyb3JVcmxBbmRMaW5lQ29uc3RydWN0b3JfY3JlYXRlYm9vbEZyb21FbnZpcm9ubWVudGZyb21FbnZpcm9ubWVudHBhY2thZ2VfY29uZmlnLnBhY2thZ2Vzbm9QYWNrYWdlc3BhY2thZ2VVcmlub3RGb3VuZGFzTWFwcGFja2FnZV9jb25maWcucGFja2FnZXNfZmlsZWlzVmFsaWRQYWNrYWdlTmFtZWJhc2VMb2NhdGlvbmlzQ29tbWVudHNlcGFyYXRvckluZGV4Y2hhck1pc3NpbmcgcGFja2FnZSBuYW1lTm8gJzonIG9uIGxpbmVwYWNrYWdlTmFtZU5vdCBhIHZhbGlkIHBhY2thZ2UgbmFtZXBhY2thZ2VMb2NhdGlvblNhbWUgcGFja2FnZSBuYW1lIG9jY3VyZWQgdHdpY2UucGFja2FnZU1hcHBpbmdjb21tZW50TXVzdCBiZSBhYnNvbHV0ZWNvbW1lbnRMaW5lIyAjIGdlbmVyYXRlZCBieSBwYWNrYWdlOnBhY2thZ2VfY29uZmlnIGF0ICIgaXMgbm90IGEgdmFsaWQgcGFja2FnZSBuYW1lUGFja2FnZSBsb2NhdGlvbiBtdXN0IG5vdCBiZSBhIHBhY2thZ2U6IFVSSV9yZWxhdGl2aXplaGFzUXVlcnloYXNGcmFnbWVudGhhc0F1dGhvcml0eW5vcm1hbGl6ZVBhdGguL3BhY2thZ2VfY29uZmlnLnBhY2thZ2VzX2ltcGxVbm1vZGlmaWFibGVNYXBWaWV3Y2hlY2tWYWxpZFBhY2thZ2VVcmlOb1BhY2thZ2VzTm8gcGFja2FnZSBuYW1lZCAiUGFja2FnZXNCYXNlcGFja2FnZUJhc2VnZXRCYXNlcGFja2FnZVBhdGhfbWFwcGluZ05vbkZpbGVQYWNrYWdlc0RpcmVjdG9yeVBhY2thZ2VzX3BhY2thZ2VCYXNlX2ZhaWxMaXN0aW5nUGFja2FnZXNDYW5ub3QgbGlzdCBwYWNrYWdlcyBmb3IgYSBiYXNlZCBwYWNrYWdlIHJvb3Rmcm9udF9lbmQudGVybWluYWxfY29sb3Jfc3VwcG9ydFByb2Nlc3NQcm9jZXNzUmVzdWx0QUxMX0NPREVTVEVSTUlOQUxfQ0FQQUJJTElUSUVTZW5hYmxlVGVybWluYWxDb2xvcnNwcmludGxuX2NvbXB1dGVFbmFibGVDb2xvcnNmcm9udF9lbmQuZGVidWdfY29tcHV0ZV9lbmFibGVfY29sb3Jzc3VwcG9ydHNBbnNpRXNjYXBlc05vdCBlbmFibGluZyBjb2xvcnMgYXMgQU5TSSBpcyBub3Qgc3VwcG9ydGVkLkVuYWJsaW5nIGNvbG9ycyBhcyBPUyBpcyBXaW5kb3dzLi9iaW4vc2gtY3R0eSA+IC9kZXYvbnVsbCAyPiAvZGV2L251bGxOb3QgZW5hYmxpbmcgY29sb3JzLCBzdGRpbiBpc24ndCBhIHRlcm1pbmFsLnByaW50ZiAnJXMnICcnIHwgdHB1dCAtU05vdCBlbmFibGluZyBjb2xvcnMsIHJ1bm5pbmcgdHB1dCBmYWlsZWQuTm90IGVuYWJsaW5nIGNvbG9ycywgdW5leHBlY3RlZCBvdXRwdXQgZnJvbSB0cHV0OiBudW1iZXJPZkNvbG9yc05vdCBlbmFibGluZyBjb2xvcnMsIGxlc3MgdGhhbiA4IGNvbG9ycyBzdXBwb3J0ZWQ6IGFsbENvZGVzTm90IGVuYWJsaW5nIGNvbG9ycywgY29sb3IgY29kZXMgZG9uJ3QgbWF0Y2g6IEVuYWJsaW5nIGNvbG9ycy5mYXN0YS5jb21tYW5kX2xpbmVfcmVwb3J0aW5nbWluQ3Jhc2hzYWZlVG9TdHJpbmdnZXRTb3VyY2VMaW5ldW5oYW5kbGVkaGlkZVdhcm5pbmdzc291cmNlTGluZWluZGVudExlbmd0aGxlbmd0aEluU291cmNlTGluZXBvaW50ZXJwb2ludGVyTGVuZ3RoLi4uOjFDcmFzaCB3aGVuIGZvcm1hdHRpbmc6IF0gaXNIaWRkZW5zaG91bGRUaHJvd09uaXNDb21waWxlVGltZUVycm9yZmFzdGEubWVzc2FnZXNnZXRMb2NhdGlvbkZyb21VcmlnZXRMb2NhdGlvbkZyb21Ob2RlZmFzdGEucHJvYmxlbXNEZWJ1Z0Fib3J0OiB3aGF0dW5leHBlY3RlZGV4cGVjdGVkYWN0dWFsdW5zdXBwb3J0ZWRvcGVyYXRpb25nZXRGaWxlVXJpZmFzdGEudGlja2Vyc3dwcmV2aW91c1RpY2tzaW5jZVN0YXJ0bXMucmVzZXRmYXN0YS51cmlfdHJhbnNsYXRvcmRhcnRMaWJyYXJpZXNnZXREYXJ0UGF0Y2hlc2lzUGxhdGZvcm1JbXBsZW1lbnRhdGlvbnRyYW5zbGF0ZXJlcG9ydE1lc3NhZ2VfdHJhbnNsYXRlRGFydFVyaV90cmFuc2xhdGVQYWNrYWdlVXJpaXNMaWJyYXJ5U3VwcG9ydGVkX3BhY2thZ2VVcmlOb3RGb3VuZF9wYWNrYWdlVXJpTm90Rm91bmROb1JlcG9ydGZhc3RhLnNjYW5uZXIudG9rZW5hbmFseXplclRva2VuVHlwZUlERU5USUZJRVJfVE9LRU5MQVpZX1RIUkVTSE9MRHZhbHVlT3JMYXp5U3Vic3RyaW5nY2Fub25pY2FsaXplcmZyb21TdHJpbmdjYW5vbmljYWxpemVwcmVjZWRpbmdDb21tZW50c2Zyb21TdWJzdHJpbmdmcm9tVXRmOEJ5dGVzYXNjaWlPbmx5Ym9vbFZhbHVlaXNJZGVudGlmaWVyY2Fub25pY2FsaXplZFN0cmluZ2RlY29kZVV0Zjhjb3B5Y29weUNvbW1lbnRzbm9TdWNoTWV0aG9kX3ZhbHVlPVN5bnRoZXRpY1N0cmluZ1Rva2VuX2xlbmd0aENvbW1lbnRUb2tlbnByZXZpb3Vzc2V0TmV4dFdpdGhvdXRTZXR0aW5nUHJldmlvdXNEYXJ0RG9jVG9rZW5fTGF6eVN1YnN0cmluZ19Db21wYWN0TGF6eVN1YnN0cmluZ19GdWxsTGF6eVN1YnN0cmluZ0RFRkFVTFRfQ09MT1IbWzM5OzQ5bWNvbG9ycwpzZXRhZiAwCnNldGFmIDEKc2V0YWYgMgpzZXRhZiAzCnNldGFmIDQKc2V0YWYgNQpzZXRhZiA2CnNldGFmIDcKb3AKX3N1cHBvcnRzQW5zaUVzY2FwZXNzdGRlcnJTdXBwb3J0c0NvbG9yc3N0ZG91dFN1cHBvcnRzQ29sb3JzTm90IGVuYWJsaW5nIGNvbG9ycywgc3Rkb3V0IGRvZXMgbm90IHN1cHBvcnQgQU5TSSBjb2xvcnMuTm90IGVuYWJsaW5nIGNvbG9ycywgc3RkZXJyIGRvZXMgbm90IHN1cHBvcnQgQU5TSSBjb2xvcnMuQmVnaW5Ub2tlbmVuZFRva2VucHJlY2VkaW5nQ29tbWVudGVuZEdyb3VwRG9jdW1lbnRhdGlvbkNvbW1lbnRUb2tlbkFCU1RSQUNUaXNCdWlsdEluaXNNb2RpZmllckFTQVNTRVJUQVNZTkNpc1BzZXVkb0FXQUlUQlJFQUtDQVNFQ0FUQ0hDTEFTU2lzVG9wTGV2ZWxLZXl3b3JkQ09OU1RDT05USU5VRUNPVkFSSUFOVERFRkFVTFRERUZFUlJFRERPRFlOQU1JQ0VMU0VFTlVNZW51bUVYUE9SVEVYVEVORFNFWFRFUk5BTEZBQ1RPUllGQUxTRWZhbHNlRklOQUxGSU5BTExZRk9SRlVOQ1RJT05HRVRISURFSUZJTVBMRU1FTlRTSU1QT1JUSU5JTlRFUkZBQ0VpbnRlcmZhY2VJU0xJQlJBUllNSVhJTk5BVElWRW5hdGl2ZU5FV05VTExPRk9OT1BFUkFUT1JQQVJUUEFUQ0hwYXRjaFJFVEhST1dSRVRVUk5TRVRTSE9XU09VUkNFU1RBVElDU1VQRVJTV0lUQ0hTWU5DVEhJU1RIUk9XVFJVRVRSWVRZUEVERUZWQVJWT0lEV0hJTEVXSVRIWUlFTERrZXl3b3Jkc2lzQnVpbHRJbk9yUHNldWRvaXNQc2V1ZG9LZXl3b3Jkc3ludGF4X2NyZWF0ZUtleXdvcmRNYXBrZXl3b3JkS2V5d29yZFRva2VuaXNLZXl3b3JkaXNLZXl3b3JkT3JJZGVudGlmaWVyU2ltcGxlVG9rZW5fcHJlY2VkaW5nQ29tbWVudF9zZXRDb21tZW50UGFyZW50Y2hhckNvdW50Y2hhckVuZGJlZm9yZVN5bnRoZXRpY2lzRW9maXNPcGVyYXRvcnN0cmluZ1ZhbHVlc2V0TmV4dG1hdGNoZXNBbnlTeW50aGV0aWNCZWdpblRva2VuU3ludGhldGljS2V5d29yZFRva2VucHJlY2VlZGluZ0NvbW1lbnRlb2ZsZXhpY2FsbHlGaXJzdFRva2VuQ2xhc3NOT19DTEFTU0FERElUSVZFX09QRVJBVE9SQVNTSUdOTUVOVF9PUEVSQVRPUkJJVFdJU0VfQU5EX09QRVJBVE9SQklUV0lTRV9PUl9PUEVSQVRPUkJJVFdJU0VfWE9SX09QRVJBVE9SQ0FTQ0FERV9PUEVSQVRPUkNPTkRJVElPTkFMX09QRVJBVE9SRVFVQUxJVFlfT1BFUkFUT1JJRl9OVUxMX09QRVJBVE9STE9HSUNBTF9BTkRfT1BFUkFUT1JMT0dJQ0FMX09SX09QRVJBVE9STVVMVElQTElDQVRJVkVfT1BFUkFUT1JSRUxBVElPTkFMX09QRVJBVE9SU0hJRlRfT1BFUkFUT1JVTkFSWV9QT1NURklYX09QRVJBVE9SVU5BUllfUFJFRklYX09QRVJBVE9SRU9GRE9VQkxFSEVYQURFQ0lNQUxoZXhhZGVjaW1hbElERU5USUZJRVJpZGVudGlmaWVyU1RSSU5HX0lOVElOVE1VTFRJX0xJTkVfQ09NTUVOVFNDUklQVF9UQUdTSU5HTEVfTElORV9DT01NRU5UU1RSSU5HQU1QRVJTQU5EQU1QRVJTQU5EX0FNUEVSU0FOREFNUEVSU0FORF9BTVBFUlNBTkRfRVEmJj1BTVBFUlNBTkRfRVEmPUFUQkFOR0JBTkdfRVFCQU5HX0VRX0VRIT09QkFSQkFSX0JBUkJBUl9CQVJfRVF8fD1CQVJfRVF8PUNPTE9OQ09NTUFDQVJFVENBUkVUX0VRXj1DTE9TRV9DVVJMWV9CUkFDS0VUQ0xPU0VfUEFSRU5DTE9TRV9TUVVBUkVfQlJBQ0tFVEVRRVFfRVFFUV9FUV9FUT09PUdUR1RfRVFHVF9HVEdUX0dUX0VRPj49R1RfR1RfR1RHVF9HVF9HVF9FUT4+Pj1IQVNISU5ERVhJTkRFWF9FUUxUTFRfRVFMVF9MVExUX0xUX0VRPDw9TUlOVVNNSU5VU19FUS09TUlOVVNfTUlOVVMtLU9QRU5fQ1VSTFlfQlJBQ0tFVE9QRU5fUEFSRU5PUEVOX1NRVUFSRV9CUkFDS0VUUEVSQ0VOVFBFUkNFTlRfRVElPVBFUklPRFBFUklPRF9QRVJJT0RQTFVTUExVU19FUSs9UExVU19QTFVTKytRVUVTVElPTlFVRVNUSU9OX1BFUklPRD8uUVVFU1RJT05fUVVFU1RJT05RVUVTVElPTl9RVUVTVElPTl9FUT8/PVNFTUlDT0xPTlNMQVNIU0xBU0hfRVEvPVNUQVJTVEFSX0VRKj1TVFJJTkdfSU5URVJQT0xBVElPTl9FWFBSRVNTSU9OU1RSSU5HX0lOVEVSUE9MQVRJT05fSURFTlRJRklFUiRUSUxERVRJTERFX1NMQVNIVElMREVfU0xBU0hfRVF+Lz1CQUNLUElOR2BCQUNLU0xBU0hQRVJJT0RfUEVSSU9EX1BFUklPRFBFUklPRF9QRVJJT0RfUEVSSU9EX1FVRVNUSU9OLi4uP0JBRF9JTlBVVG1hbGZvcm1lZCBpbnB1dFJFQ09WRVJZcmVjb3ZlcnlhbGx1bnNwZWNpZmllZGlzQWRkaXRpdmVPcGVyYXRvcmlzQXNzaWdubWVudE9wZXJhdG9yaXNBc3NvY2lhdGl2ZU9wZXJhdG9yaXNFcXVhbGl0eU9wZXJhdG9yaXNJbmNyZW1lbnRPcGVyYXRvcmlzTXVsdGlwbGljYXRpdmVPcGVyYXRvcmlzUmVsYXRpb25hbE9wZXJhdG9yaXNTaGlmdE9wZXJhdG9yaXNVbmFyeVBvc3RmaXhPcGVyYXRvcmlzVW5hcnlQcmVmaXhPcGVyYXRvcmlzU2VsZWN0b3JPcGVyYXRvck5PX1BSRUNFREVOQ0VBU1NJR05NRU5UX1BSRUNFREVOQ0VDQVNDQURFX1BSRUNFREVOQ0VDT05ESVRJT05BTF9QUkVDRURFTkNFSUZfTlVMTF9QUkVDRURFTkNFTE9HSUNBTF9PUl9QUkVDRURFTkNFTE9HSUNBTF9BTkRfUFJFQ0VERU5DRUVRVUFMSVRZX1BSRUNFREVOQ0VSRUxBVElPTkFMX1BSRUNFREVOQ0VCSVRXSVNFX09SX1BSRUNFREVOQ0VCSVRXSVNFX1hPUl9QUkVDRURFTkNFQklUV0lTRV9BTkRfUFJFQ0VERU5DRVNISUZUX1BSRUNFREVOQ0VBRERJVElWRV9QUkVDRURFTkNFTVVMVElQTElDQVRJVkVfUFJFQ0VERU5DRVBSRUZJWF9QUkVDRURFTkNFUE9TVEZJWF9QUkVDRURFTkNFU0VMRUNUT1JfUFJFQ0VERU5DRUNvbnN0YW50VmlzaXRvckRhcnRUeXBlVmlzaXRvcmJsYWNrbGlzdGVkQ29yZUNsYXNzZXNUeXBlTGFiZWxlcm5hbWVNYXBudWxsLXR5cGVudWxsLWNvbnN0YW50bWVzc2FnZXNvcmlnaW5NZXNzYWdlaXNPYmplY3RuYW1lRm9yQ2xhc3NjbGFzc2VzRm9yTmFtZWNsYXNzRm9yTmFtZWJvdHRvbS10eXBlIEZ1bmN0aW9uIGV4dGVuZHMgdHlwZUFyZz5bPntwcmludGluZyB1bmV2YWx1YXRlZCBjb25zdGFudHNMYWJlbGVkQ2xhc3NOYW1ldHlwZUxhYmVsZXIvKgogLSBmYXN0YS5jcmFzaENvbnRlbnRUeXBlSHR0cENsaWVudEh0dHBDbGllbnRSZXF1ZXN0U29ja2V0RXhjZXB0aW9uQ3Jhc2ggd2hlbiBjb21waWxpbmcgLAphdCBjaGFyYWN0ZXIgb2Zmc2V0IGRlZmF1bHRTZXJ2ZXJBZGRyZXNzaHR0cDovLzEyNy4wLjAuMTo1OTQxMC9oYXNDcmFzaGVkZmlyc3RTb3VyY2VVcmlyZXNldENyYXNoUmVwb3J0aW5ncmVwb3J0Q3Jhc2g6c2F2ZWRfdHJ5X2NvbnRleHRfdmFyMjpleGNlcHRpb24wOnN0YWNrX3RyYWNlMG5vdGVwYWNrYWdlOmZhc3Rhc2VydmVyVXJpcG9zdFVybGZvcmNlClNlbmRpbmcgY3Jhc2ggcmVwb3J0IGRhdGFwZXJzaXN0ZW50Q29ubmVjdGlvbmJ1ZmZlck91dHB1dGNvbm5lY3Rpb25JbmZvcmVtb3RlQWRkcmVzc3JlbW90ZVBvcnQgdG8gaGVhZGVyc2NvbnRlbnRUeXBlCgoKRkU6OkVSUk9SOjoKCgpFcnJvciB3aGVuIGNvbnZlcnRpbmcgIHRvIHN0cmluZy5jdXJyZW50VXJpZmFzdGEuZGlsbF90YXJnZXRDbGFzc0J1aWxkZXJUYXJnZXRJbXBsZW1lbnRhdGlvbkRpbGxMaWJyYXJ5QnVpbGRlckRpbGxMb2FkZXJsaWJyYXJ5QnVpbGRlcnNpc0xvYWRlZGJhY2tlbmRUYXJnZXRhZGRTb3VyY2VJbmZvcm1hdGlvbmZpbmFsaXplRXhwb3J0c2NyZWF0ZUxpYnJhcnlCdWlsZGVyb3JpZ2luYnJlYWtDeWNsZWFkZExpYnJhcnlmYXN0YS5rZXJuZWxfdGFyZ2V0Q2xvbmVWaXNpdG9yc3Vic3RpdHV0ZVR5cGVFbnZpcm9ubWVudERpbGxNZW1iZXJCdWlsZGVyQW1iaWd1b3VzQnVpbGRlclNvdXJjZUNsYXNzQnVpbGRlclNvdXJjZUxvYWRlcnRyYW5zZm9ybUxpYnJhcmllc0NsYXNzSGllcmFyY2h5QnVpbGRlckRlY2xhcmF0aW9uSW52YWxpZFR5cGVCdWlsZGVyS2VybmVsQ2xhc3NCdWlsZGVyS2VybmVsRmllbGRCdWlsZGVyS2VybmVsTGlicmFyeUJ1aWxkZXJLZXJuZWxOYW1lZFR5cGVCdWlsZGVyS2VybmVsUHJvY2VkdXJlQnVpbGRlckxpYnJhcnlCdWlsZGVyTmFtZWRUeXBlQnVpbGRlclR5cGVCdWlsZGVyVHlwZURlY2xhcmF0aW9uQnVpbGRlcktlcm5lbENvbnN0YW50RXJyb3JSZXBvcnRlck1ldGFkYXRhQ29sbGVjdG9ybWV0YWRhdGFDb2xsZWN0b3JkeW5hbWljVHlwZWV4Y2x1ZGVTb3VyY2VjbG9uZWRGb3JtYWxzY3JlYXRlTG9hZGVyYnVpbGRlckhpZXJhcmNoeW9lbnRyeVBvaW50c3BhY2thZ2VzTWFwYXNTdHJpbmdwYWNrYWdlOmFkZFByb2JsZW1yZWFkYWNjZXNzb3JidWlsZGVyc2NvbGxlY3RNeUNsYXNzZXNpc1BhdGNoYmluZG9iamVjdENsYXNzQnVpbGRlcmludGVyZmFjZXNjcmVhdGVUeXBlSW5mZXJlbmNlRW5naW5lYmVjb21lQ29yZUxpYnJhcnlyZXNvbHZlUGFydHNjb21wdXRlTGlicmFyeVNjb3Blc3Jlc29sdmVUeXBlc2NvbXB1dGVEZWZhdWx0VHlwZXNteUNsYXNzZXNjaGVja1NlbWFudGljc2ZpbmlzaFR5cGVWYXJpYWJsZXNmaW5hbGl6ZUluaXRpYWxpemluZ0Zvcm1hbHNpbnN0YWxsRGVmYXVsdFN1cGVydHlwZXNpbnN0YWxsU3ludGhldGljQ29uc3RydWN0b3JzcmVzb2x2ZUNvbnN0cnVjdG9yc2NvbXB1dGVDb3JlVHlwZXNidWlsZENsYXNzSGllcmFyY2h5Y29tcHV0ZUhpZXJhcmNoeXBlcmZvcm1Ub3BMZXZlbEluZmVyZW5jZWNoZWNrU3VwZXJ0eXBlc2NoZWNrQm91bmRzY2hlY2tPdmVycmlkZXNjaGVja0Fic3RyYWN0TWVtYmVyc2NoZWNrUmVkaXJlY3RpbmdGYWN0b3JpZXNhZGROb1N1Y2hNZXRob2RGb3J3YXJkZXJzY2hlY2tNaXhpbnNpbnN0YWxsQWxsQ29tcG9uZW50UHJvYmxlbXNhbGxDb21wb25lbnRQcm9ibGVtc0J1aWxkaW5nIGNvbXBvbmVudGJ1aWxkQm9kaWVzZmluaXNoQ2xvbmVkUGFyYW1ldGVyc2ZpbmlzaERlZmVycmVkTG9hZFRlYXJvZmZzZmluaXNoTm9TdWNoTWV0aG9kRm9yd2FyZGVyc2ZpbmlzaE5hdGl2ZU1ldGhvZHNmaW5pc2hQYXRjaE1ldGhvZHNmaW5pc2hBbGxDb25zdHJ1Y3RvcnNydW5CdWlsZFRyYW5zZm9ybWF0aW9uc2Zvcm1hdHRlZE1lc3NhZ2Vjb3B5U291cmNlZGVjbGFyYXRpb25leHBvcnRTY29wZXByb2JsZW1nZXRGaXJzdERlY2xhcmF0aW9uTGlua2VkIGNvbXBvbmVudGJ1aWxkTWl4ZWRJblR5cGVJbnN0YWxsZWQgT2JqZWN0IGFzIGltcGxpY2l0IHN1cGVyY2xhc3NpbnN0YWxsRm9yd2FyZGluZ0NvbnN0cnVjdG9yc2luc3RhbGxEZWZhdWx0Q29uc3RydWN0b3JJbnN0YWxsZWQgc3ludGhldGljIGNvbnN0cnVjdG9yc3Byb2NhZGRTeW50aGV0aWNDb25zdHJ1Y3Rvcm1ha2VEZWZhdWx0Q29uc3RydWN0b3JzdWJzdGl0dXRpb25NYXBnZXRTdWJzdGl0dXRpb25NYXBtYWtlTWl4aW5BcHBsaWNhdGlvbkNvbnN0cnVjdG9yY29weUZvcm1hbGNsb25lbWFrZUNvbnN0cnVjdG9yUmV0dXJuVHlwZW9yaWdpbmFsY2xvbmVydHlwZVN1YnN0aXR1dGlvbkNsb25lZCBkZWZhdWx0IHZhbHVlcyBvZiBmb3JtYWxzdHlwZVBhcmFtZXRlclR5cGVzdHlwZVBhcmFtZXRlcnBsYXRmb3JtTGlicmFyeWRhcnQ6Y29sbGVjdGlvbmZvdW5kbWlycm9yc0Nhbid0IGZpbmQgcGxhZm9ybUxpYnJhcmllc2ZpbmlzaENvbnN0cnVjdG9yc0ZpbmlzaGVkIGNvbnN0cnVjdG9yc3VuaW5pdGlhbGl6ZWRGaWVsZHNub25GaW5hbEZpZWxkc2NvbnN0cnVjdG9ySW5pdGlhbGl6ZWRGaWVsZHNzdXBlclRhcmdldGlzUmVkaXJlY3RpbmdteUluaXRpYWxpemVkRmllbGRzZmllbGRCdWlsZGVyc2NvcGVsb2NhbGluaXRpYWxpemVkRmllbGRzZGFydDpodG1sZGFydDpzdmdkYXJ0Ol9uYXRpdmVfdHlwZWRfZGF0YWRhcnQ6X2ludGVyY2VwdG9yc2pzX3N0cmluZy5kYXJ0aW5zZXJ0ZW5hYmxlQ29uc3RhbnRVcGRhdGUyMDE4ZGVzdWdhclNldHNFdmFsdWF0ZWQgY29uc3RhbnRzcnVuUHJvY2VkdXJlVHJhbnNmb3JtYXRpb25zVmVyaWZpZWQgY29tcG9uZW50cmVhZFBhdGNoRmlsZXNwYXJ0T2Zmc2V0c3BhcnRPZlVyaUtlcm5lbERpYWdub3N0aWNSZXBvcnRlcmRlZmF1bHRTdXBlckNvbnN0cnVjdG9ySU9TaW5rTGltaXRlZEJpbmFyeVByaW50ZXJCeXRlU2lua2tEZWJ1Z0NsYXNzTmFtZSNEZWJ1Z0NsYXNzd3JpdGVDb21wb25lbnRUb0ZpbGVieXRlU2lua3NlcmlhbGl6ZVByb2NlZHVyZWZha2VMaWJyYXJ5ZXZhbHVhdGVyZWFsQ2xhc3NmYWtlQ2xhc3N0eXBlUGFyYW1zdHlwZVBhcmFtbmV3Tm9kZXZpc2l0VHlwZXByb2dyYW1mYXN0YS52ZXJpZmllclRyYW5zZm9ybWVyRmxhZ1ZlcmlmeWluZ1Zpc2l0b3JUeXBlU2NoZW1hVmlzaXRvclVua25vd25UeXBlU3ludGhldGljRXhwcmVzc2lvbkp1ZGdtZW50RmFzdGFWZXJpZnlpbmdWaXNpdG9yc2tpcFBsYXRmb3JtaXNPdXRsaW5lY2hlY2tMb2NhdGlvbicgaGFzIG5vIGZpbGVVcmknIGhhcyBubyBmaWxlT2Zmc2V0Y2hlY2tTdXBlckludm9jYXRpb25jb250YWluaW5nTWVtYmVyZ2V0Q29udGFpbmluZ01lbWJlclN1cGVyIGNhbGwgb3V0c2lkZSBvZiBhbnkgbWVtYmVyU3VwZXIgY2FsbCBpbiBhIG1lbWJlciBsYWNraW5nIFRyYW5zZm9ybWVyRmxhZy5zdXBlckNhbGxzZGV0YWlsc05vIG9mZnNldCBmb3IgTGVha2luZyBzaGFkb3cgbm9kZTogSW52YWxpZCBpbml0aWFsaXplci52aXNpdFVua25vd25UeXBlVW5leHBlY3RlZCBhcHBlYXJhbmNlIG9mIHRoZSB1bmtub3duIHR5cGUuQXR0ZW1wdCB0byBpbnZva2UgcmVkaXJlY3RpbmcgZmFjdG9yeS52ZXJpZmllcmZhc3RhLmxvYWRlclF1ZXVldW5wYXJzZWRMaWJyYXJpZXNoYW5kbGVkRXJyb3JzdW5oYW5kbGVkRXJyb3Jzc2Vlbk1lc3NhZ2VzYnl0ZUNvdW50b3V0bGluZVN1bW1hcnlUZW1wbGF0ZWlzU291cmNlTG9hZGVyZGFydC1leHR0cmFuc2xhdGVVcmlsb2FkRXh0cmFSZXF1aXJlZExpYnJhcmllc21heUltcGxlbWVudFJlc3RyaWN0ZWRUeXBlc3JlY29yZEFjY2Vzc2lzUGFydGVuc3VyZUNvcmVMaWJyYXJ5YnVpbGRCb2R5bG9nU3VtbWFyeXJlbW92ZUZpcnN0YnVpbGRPdXRsaW5laW5NaWNyb3NlY29uZHN3YXNIYW5kbGVkcHJvYmxlbU9uTGlicmFyeWFkZE1lc3NhZ2VmaXhTZXZlcml0eW1lc3NhZ2U6IApjaGFyT2Zmc2V0OiAKZmlsZVVyaTogCnNldmVyaXR5OiBjb250ZXh0TWVzc2FnZWNyZWF0ZUZvcm1hdHRlZE1lc3NhZ2VnZXRBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yZ2V0Q29tcGlsZVRpbWVFcnJvcmdldER1cGxpY2F0ZWRGaWVsZEluaXRpYWxpemVyRXJyb3JnZXROYXRpdmVBbm5vdGF0aW9uY29tcHV0ZUNsYXNzQnVpbGRlckZyb21UYXJnZXRDbGFzc2NvbXB1dGVUeXBlQnVpbGRlcnVudHJhbnNsYXRhYmxlVXJpU2NoZW1lb3JnLWRhcnRsYW5nLXVudHJhbnNsYXRhYmxlLXVyaWRhcnQyanMuc2Nhbm5lci5zdHJpbmdfc2Nhbm5lckFycmF5QmFzZWRTY2FubmVyc2Nhbk9mZnNldGVuc3VyZVplcm9UZXJtaW5hdGlvbgBpc0xlZ2FsSWRlbnRpZmllcnN0YXJ0VG9rZW5hZHZhbmNlcGVla3N0cmluZ09mZnNldGN1cnJlbnRBc1VuaWNvZGVoYW5kbGVVbmljb2Rlc3RhcnRTY2FuT2Zmc2V0Y3JlYXRlU3Vic3RyaW5nVG9rZW5leHRyYU9mZnNldHRva2VuU3RhcnRjb21tZW50c2NyZWF0ZVN5bnRoZXRpY1N1YnN0cmluZ1Rva2Vuc3ludGhldGljQ2hhcnNjcmVhdGVDb21tZW50VG9rZW5jcmVhdGVEYXJ0RG9jVG9rZW5hdEVuZE9mRmlsZWZhc3RhLnNjYW5uZXIudXRmOF9ieXRlc19zY2FubmVydW5pY29kZUJvbUNoYXJhY3RlclJ1bmVzY2FuU2xhY2tzY2FuU2xhY2tPZmZzZXR1dGY4U2xhY2tsYXN0VW5pY29kZU9mZnNldHN0cmluZ09mZnNldFNsYWNrT2Zmc2V0Y29udGFpbnNCb21BdG51bWJlck9mQnl0ZXNIaW50Qk9NX1VURjhuZXh0Q29kZVBvaW50bmV4dEJ5dGVleHBlY3RlZEhpZ2hCeXRlc3Jlc2Zhc3RhLnNjYW5uZXIucmVjb3Zlck5vbkFzY2lpSWRlbnRpZmllclRva2VuZXJyb3JUYWlsZ29vZGdvb2RUYWlsYmVmb3JlR29vZFRhaWxyZWNvdmVySWRlbnRpZmllcmNvZGVVbml0c2FwcGVuZHJlY292ZXJFeHBvbmVudHJlY292ZXJTdHJpbmdyZWNvdmVySGV4RGlnaXRyZWNvdmVyU3RyaW5nSW50ZXJwb2xhdGlvbnJlY292ZXJDb21tZW50cmVjb3ZlclVubWF0Y2hlZHN5bnRoZXNpemVUb2tlbnNraXBUb0VvZmNsb3NlQnJhY2VGb3JvcGVuQnJhY2VjbG9zZVF1b3RlRm9yb3BlblF1b3RlIiIiJycnciJyJ3IiIiJyJycnZGFydF9zY2FubmVyLmVycm9yX3Rva2VudW5zdXBwb3J0ZWQgb3BlcmF0aW9uRW5jb2RpbmdFcnJvclRva2VuRW5jb2RpbmdFcnJvclRva2VuKClOb25Bc2NpaUlkZW50aWZpZXJUb2tlbihOb25Bc2NpaVdoaXRlc3BhY2VUb2tlbk5vbkFzY2lpV2hpdGVzcGFjZVRva2VuKEFzY2lpQ29udHJvbENoYXJhY3RlclRva2VuQXNjaWlDb250cm9sQ2hhcmFjdGVyVG9rZW4oVW5zdXBwb3J0ZWRPcGVyYXRvcihVbnRlcm1pbmF0ZWRTdHJpbmcoVW50ZXJtaW5hdGVkVG9rZW4oVW5tYXRjaGVkVG9rZW4oZmFzdGEuc2Nhbm5lci50b2tlbl9jb25zdGFudHNLRVlXT1JEX1RPS0VOU0NSSVBUX1RPS0VOQkFEX0lOUFVUX1RPS0VORE9VQkxFX1RPS0VOSU5UX1RPS0VOUkVDT1ZFUllfVE9LRU5IRVhBREVDSU1BTF9UT0tFTlNUUklOR19UT0tFTkFNUEVSU0FORF9UT0tFTkJBQ0tQSU5HX1RPS0VOQkFDS1NMQVNIX1RPS0VOQkFOR19UT0tFTkJBUl9UT0tFTkNPTE9OX1RPS0VOQ09NTUFfVE9LRU5FUV9UT0tFTkdUX1RPS0VOSEFTSF9UT0tFTk9QRU5fQ1VSTFlfQlJBQ0tFVF9UT0tFTk9QRU5fU1FVQVJFX0JSQUNLRVRfVE9LRU5PUEVOX1BBUkVOX1RPS0VOTFRfVE9LRU5NSU5VU19UT0tFTlBFUklPRF9UT0tFTlBMVVNfVE9LRU5RVUVTVElPTl9UT0tFTkFUX1RPS0VOQ0xPU0VfQ1VSTFlfQlJBQ0tFVF9UT0tFTkNMT1NFX1NRVUFSRV9CUkFDS0VUX1RPS0VOQ0xPU0VfUEFSRU5fVE9LRU5TRU1JQ09MT05fVE9LRU5TTEFTSF9UT0tFTlRJTERFX1RPS0VOU1RBUl9UT0tFTlBFUkNFTlRfVE9LRU5DQVJFVF9UT0tFTlNUUklOR19JTlRFUlBPTEFUSU9OX1RPS0VOTFRfRVFfVE9LRU5GVU5DVElPTl9UT0tFTlNMQVNIX0VRX1RPS0VOUEVSSU9EX1BFUklPRF9QRVJJT0RfVE9LRU5QRVJJT0RfUEVSSU9EX1RPS0VORVFfRVFfRVFfVE9LRU5FUV9FUV9UT0tFTkxUX0xUX0VRX1RPS0VOTFRfTFRfVE9LRU5HVF9FUV9UT0tFTkdUX0dUX0VRX1RPS0VOSU5ERVhfRVFfVE9LRU5JTkRFWF9UT0tFTkJBTkdfRVFfRVFfVE9LRU5CQU5HX0VRX1RPS0VOQU1QRVJTQU5EX0FNUEVSU0FORF9UT0tFTkFNUEVSU0FORF9BTVBFUlNBTkRfRVFfVE9LRU5BTVBFUlNBTkRfRVFfVE9LRU5CQVJfQkFSX1RPS0VOQkFSX0JBUl9FUV9UT0tFTkJBUl9FUV9UT0tFTlNUQVJfRVFfVE9LRU5QTFVTX1BMVVNfVE9LRU5QTFVTX0VRX1RPS0VOTUlOVVNfTUlOVVNfVE9LRU5NSU5VU19FUV9UT0tFTlRJTERFX1NMQVNIX0VRX1RPS0VOVElMREVfU0xBU0hfVE9LRU5QRVJDRU5UX0VRX1RPS0VOR1RfR1RfVE9LRU5DQVJFVF9FUV9UT0tFTkNPTU1FTlRfVE9LRU5TVFJJTkdfSU5URVJQT0xBVElPTl9JREVOVElGSUVSX1RPS0VOUVVFU1RJT05fUEVSSU9EX1RPS0VOUVVFU1RJT05fUVVFU1RJT05fVE9LRU5RVUVTVElPTl9RVUVTVElPTl9FUV9UT0tFTkdFTkVSSUNfTUVUSE9EX1RZUEVfQVNTSUdOX1RPS0VOR0VORVJJQ19NRVRIT0RfVFlQRV9MSVNUX1RPS0VOR1RfR1RfR1RfVE9LRU5QRVJJT0RfUEVSSU9EX1BFUklPRF9RVUVTVElPTl9UT0tFTkdUX0dUX0dUX0VRX1RPS0VOZmFzdGEuaW5jcmVtZW50YWxfY29tcGlsZXJJbmNyZW1lbnRhbEtlcm5lbEdlbmVyYXRvck1lbW9yeUZpbGVTeXN0ZW1CdWlsZGVyR3JhcGhzYXZlQXNHemlwSHlicmlkRmlsZVN5c3RlbVZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudExpYnJhcnlHcmFwaFNvdXJjZUxpYnJhcnlCdWlsZGVyb3V0bGluZU9ubHlpbnZhbGlkYXRlZFVyaXNkaWxsTG9hZGVkRGF0YXBsYXRmb3JtQnVpbGRlcnN1c2VyQnVpbGRlcnNpbml0aWFsaXplRnJvbURpbGxVcmljb21wb25lbnRUb0luaXRpYWxpemVGcm9taW5pdGlhbGl6ZWRGcm9tRGlsbHByZXZpb3VzUGFja2FnZXNVcmloYXNUb0NoZWNrUGFja2FnZVVyaXNyZW1haW5pbmdDb21wb25lbnRQcm9ibGVtc21vZHVsZXNUb0xvYWRkZWJ1Z0V4cHJVcmlvcmctZGFydGxhbmctZGVidWdzeW50aGV0aWNfZGVidWdfZXhwcmVzc2lvbnVzZXJDb2RlZnJvbUNvbXBvbmVudGNvbXB1dGVEZWx0YWZ1bGxDb21wb25lbnRieXRlc0xlbmd0aGluaXRpYWxpemVGcm9tQ29tcG9uZW50c3VtbWFyeUJ5dGVzcHJlcGFyZVN1bW1hcnlpbml0aWFsaXplRnJvbURpbGxzdGd6SW5pdGlhbGl6ZWRGcm9taW5pdGlhbGl6YXRpb25CeXRlc2luaXRpYWxpemVfZnJvbS5kaWxscmVjb3JkVGVtcG9yYXJ5RmlsZUZvclRlc3RpbmdpbnZhbGlkYXRlTm90S2VwdFVzZXJCdWlsZGVyc25vdFJldXNlZExpYnJhcmllc3JldXNlZExpYnJhcmllc2NvbXB1dGVSZXVzZWRMaWJyYXJpZXNub3RSZXVzZWRyZXVzZWRMaWJyYXJ5VXJpc29sZERpbGxMb2FkZWREYXRhcmVtb3ZlTGlicmFyeUZyb21SZW1haW5pbmdDb21wb25lbnRQcm9ibGVtc0RlY2lkZWQgdG8gcmV1c2UgIG9mICBsaWJyYXJpZXNsb2FkRW5zdXJlTG9hZGVkQ29tcG9uZW50c3VzZXJDb2RlT2xkY29tcG9uZW50V2l0aERpbGxyZWNvcmROb25GdWxsQ29tcG9uZW50Rm9yVGVzdGluZ3JlbGVhc2VBbmNpbGxhcnlSZXNvdXJjZXNjb21waWxlZExpYnJhcmllc3VzZXJMb2FkZWRVcmlNYWlub3V0cHV0TGlicmFyaWVzY29tcHV0ZVRyYW5zaXRpdmVDbG9zdXJlcmVpc3N1ZUNvbXBvbmVudFByb2JsZW1zcmVpc3N1ZUxpYnJhcnlQcm9ibGVtc2xvYWRlZE5vdEtlcHRtb2R1bGVsb2FkZWRBbnl0aGluZ3VzZWRDb21wb25lbnRpc3N1ZWRQcm9ibGVtc2dldFBhcnRGaWxlVXJpcGFyZW50RmlsZVVyaWlucHV0TGlicmFyaWVzaW5wdXRMaWJyYXJpZXNGaWx0ZXJlZGxpYnJhcnlNYXBwb3RlbnRpYWxseVJlZmVyZW5jZWRMaWJyYXJpZXNwb3RlbnRpYWxseVJlZmVyZW5jZWRJbnB1dExpYnJhcmllc2dyYXBobmVpZ2hib3JuZWlnaGJvcnNPZnBhcnRGaWxlVXJpUmVhZCBEZXNlcmlhbGl6ZWQgZW50aXR5c2F2ZUNvbXBvbmVudFByb2JsZW1zQWJvdXQgdG8gaW5pdGlhbGl6ZUZyb21Db21wb25lbnRmb3VuZERhcnRDb3JlRGlkIG5vdCBmaW5kIGRhcnQ6Y29yZSB3aGVuIHRyaWVkIHRvIGluaXRpYWxpemUgZnJvbSBjb21wb25lbnQuUmFuIGluaXRpYWxpemVGcm9tQ29tcG9uZW50QXBwZW5kZWQgbGlicmFyaWVzY29tcGlsZUV4cHJlc3Npb250eXBlRGVmaW5pdGlvbnNzeW50aGV0aWNQcm9jZWR1cmVOYW1lbGlicmFyeVVyaWtlcm5lbENsYXNzc2NvcGVCdWlsZGVyZGVidWdMaWJyYXJ5Y3JlYXRlTmVzdGVkU2NvcGVjb21iaW5hdG9yYWRkSW1wb3J0YWRkSW1wb3J0c1RvU2NvcGVoZnNtZW1vcnlwYXJhbWV0ZXJzYnVpbGRtb2RpZnlUYXJnZXRidWlsZEV4cHJlc3Npb25jb21waWxlZEV4cHJlc3Npb25zb3VyY2VCeXRlc2ludmFsaWRhdGVkSW1wb3J0VXJpc2lzSW52YWxpZGF0ZWRhZGRCdWlsZGVyQW5kSW52YWxpZGF0ZVVyaXNyZWNvcmRJbnZhbGlkYXRlZEltcG9ydFVyaXNGb3JUZXN0aW5nZGlyZWN0RGVwZW5kZW5jaWVzdmVydGV4dmVydGljZXN3b3JrTGlzdHJlbW92ZWRzZWVuVXJpc2ludmFsaWRhdGVpbnZhbGlkYXRlQWxsU291cmNlc3NldE1vZHVsZXNUb0xvYWRPbk5leHRDb21wdXRlRGVsdGFQYWNrYWdlQ2hhbmdlZEVycm9ySW5pdGlhbGl6ZUZyb21Db21wb25lbnRFcnJvckluY3JlbWVudGFsQ29tcGlsZXJEYXRha2VybmVsLnR5cGVfYWxnZWJyYVR5cGVQYXJhbWV0ZXJGaWx0ZXJQRnJlc2hUeXBlUGFyYW1ldGVyc2ZyZXNoVHlwZVBhcmFtZXRlcnNhcHBseVRvRnVuY3Rpb25UeXBlc3Vic3RpdHV0ZU5hbWVkc3Vic3RpdHV0ZVN1cGVyZnJvbU1hcGZpbHRlcmVkZnJvbVVwcGVyQW5kTG93ZXJCb3VuZHNmcm9tU3VwZXJ0eXBlZnJvbUludGVyZmFjZVR5cGVmcm9tVHlwZWRlZlR5cGVmcm9tUGFpcnNib3R0b21Gb3JDbGFzc3VwcGVyQm91bmRGb3JDbGFzc2dldFN1YnN0aXR1dGV1cHBlckJvdW5kY29udHJhdmFyaWFudHZpc2l0X051bGxTdWJzdGl0dXRpb25TdWJzdGl0dXRpb24uZW1wdHlfTWFwU3Vic3RpdHV0aW9uX01hcFN1YnN0aXR1dGlvbihfVG9wU3Vic3RpdHV0b3JpbnZlcnRWYXJpYW5jZWZyZXNoVHlwZVBhcmFtZXRlckNyZWF0ZSBhIGZyZXNoIGVudmlyb25tZW50IGZpcnN0X0NsYXNzQm90dG9tU3Vic3RpdHV0aW9uX0NvbWJpbmVkU3Vic3RpdHV0aW9uX0ZpbHRlcmVkU3Vic3RpdHV0aW9uZmlsdGVyRm5fSW5uZXJUeXBlU3Vic3RpdHV0b3JvdXRlcmZyZXNoX1R5cGVTdWJzdGl0dXRvcmNvdmFyaWFudENvbnRleHR1c2VDb3VudGVybmV3SW5uZXJFbnZpcm9ubWVudGJlZm9yZWJ1bXBDb3VudGVyc1VudGlsX0RlZXBUeXBlU3Vic3RpdHV0b3Jpc0luZmluaXRlX1R5cGVVbmlmaWNhdGlvbnF1YW50aWZpZWRWYXJpYWJsZXNfdW5pdmVyc2FsbHlRdWFudGlmaWVkVmFyaWFibGVzX3VuaWZ5X3N1YnN0aXR1dGVIZWFkbmV4dFR5cGVVbmV4cGVjdGVkIGN5Y2xlIGZvdW5kIGR1cmluZyB1bmlmaWNhdGlvbl9mYWlsbGVmdEluc3RhbmNlcmlnaHRJbnN0YW5jZWluc3RhbnRpYXRvcmluc3RhbnRpYXRvclR5cGVsZWZ0UmV0dXJucmlnaHRSZXR1cm5fdHJ5U3Vic3RpdHV0aW9uZGVlcFN1YnN0aXR1dGVfT2NjdXJyZW5jZVZpc2l0b3JoYW5kbGVUeXBlUGFyYW1ldGVyZ2V0VXBwZXJCb3VuZFN1YnN0aXR1dGlvbk1hcHN1YnN0aXR1dGVEZWVwc3Vic3RpdHV0b3Jjb250YWluc1R5cGVWYXJpYWJsZXVuaWZ5VHlwZXN1bmlmaWVyZ2V0RnJlc2hUeXBlUGFyYW1ldGVyc2ZyZXNoUGFyYW1ldGVyc2NvbXBpbGVyLmFwaS5sZWdhY3lFdmVudFNpbmtOdWxsU2lua0xlZ2FjeUNvbXBpbGVySW5wdXRfaW5wdXRQcm92aWRlcnNvdXJjZUZpbGVFeHBlY3RlZCBhICdTdHJpbmcnIG9yIGEgJ0xpc3Q8aW50PicgZnJvbSB0aGUgaW5wdXQgcHJvdmlkZXIsIGJ1dCBnb3Q6IExlZ2FjeUNvbXBpbGVyRGlhZ25vc3RpY3NfaGFuZGxlckxlZ2FjeUNvbXBpbGVyT3V0cHV0X291dHB1dFByb3ZpZGVyZGVmZXJyZWRfbWFwTGVnYWN5Q29tcGlsZXJPdXRwdXQuY3JlYXRlQmluYXJ5U2lua0xlZ2FjeU91dHB1dFNpbmtkYXJ0MmpzLmNvbW1vbi50YXNrc1pvbmVEZWxlZ2F0ZVpvbmVTcGVjaWZpY2F0aW9uQ29tcGlsZXJUYXNrX21lYXN1cmVyX3dhdGNoX3N1YnRhc2tzX2FzeW5jQ291bnRfem9uZVNwZWNpZmljYXRpb25fem9uZVZhbHVlc19pc0Rpc2FibGVkVW5rbm93biB0YXNrICd0aW1pbmd0b3RhbGVsYXBzZWRNaWxsaXNlY29uZHNfbWVhc3VyZVpvbmVkX3N0YXJ0X2N1cnJlbnRUYXNrc3RvcHN0b3BBc3luY1dhbGxDbG9ja19zdG9wc3RhcnRBc3luY1dhbGxDbG9ja3pvbmVTcGVjaWZpY2F0aW9uX3J1bnJ1blVuYXJ5X3J1blVuYXJ5cnVuQmluYXJ5X3J1bkJpbmFyeXpvbmVUMVQyYTFhMl9jdXJyZW50QXN5bmNUYXNrQ2FuJ3QgdHJhY2sgYXN5bmMgdGFzayAnJyBiZWNhdXNlICcnIGlzIGFscmVhZHkgYmVpbmcgdHJhY2tlZC5tZWFzdXJlSW9TdWJ0YXNrX3dhbGxDbG9ja19hc3luY1dhbGxDbG9ja19oYXNoQ29kZUdlbmVyYXRvcnN0YXJ0V2FsbENsb2Nrc3RvcFdhbGxDbG9ja2RhcnQyanMuY29tbW9uYXNzZXJ0RGVidWdNb2RlZmFpbGVkQXRNZXNzYWdlS2luZFNvdXJjZVNwYW5DVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFTk9fTE9DQVRJT05fU1BBTk5BQkxFU3Bhbm5hYmxlU3Bhbm5hYmxlQXNzZXJ0aW9uRmFpbHVyZXJldGFpbkRhdGFGb3JUZXN0aW5nZGFydDJqcy5jb21waWxlcl9iYXNlU2VsZWN0b3JzVXJpc1dvcmtJdGVtRWxlbWVudEVudmlyb25tZW50RGVmZXJyZWRMb2FkVGFza091dHB1dFVuaXREYXRhTWVzc2FnZVRlbXBsYXRlRHVtcEluZm9UYXNrRW5xdWV1ZXJFbnF1ZXVlVGFza1Jlc29sdXRpb25FbnF1ZXVlckFic3RyYWN0VmFsdWVTdHJhdGVneVRyaXZpYWxBYnN0cmFjdFZhbHVlU3RyYXRlZ3lUeXBlTWFza1N0cmF0ZWd5R2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHNHbG9iYWxUeXBlSW5mZXJlbmNlVGFza1NvdXJjZUluZm9ybWF0aW9uSmF2YVNjcmlwdEJhY2tlbmRLZXJuZWxMb2FkZXJUYXNrS2VybmVsUmVzdWx0TnVsbENvbXBpbGVyT3V0cHV0SEluc3RydWN0aW9uU2VsZWN0b3JJbXBhY3RTdHJhdGVneVdvcmxkSW1wYWN0V29ybGRJbXBhY3RCdWlsZGVySW1wbEpDbG9zZWRXb3JsZEtDbG9zZWRXb3JsZE1ha2VSZXBvcnRlckZ1bmN0aW9uQ29tcGlsZXJmcm9udGVuZFN0cmF0ZWd5YmFja2VuZFN0cmF0ZWd5X3JlcG9ydGVyX2ltcGFjdENhY2hlX2ltcGFjdENhY2hlRGVsZXRlcmltcGFjdFN0cmF0ZWd5c3RvcEFmdGVyQ2xvc2VkV29ybGRzdG9wQWZ0ZXJUeXBlSW5mZXJlbmNlX3VzZXJDb2RlTG9jYXRpb25zYmFja2VuZENsb3NlZFdvcmxkRm9yVGVzdGluZ2VsZW1lbnRzV2l0aENvbXBpbGVUaW1lRXJyb3JzZ2xvYmFsSW5mZXJlbmNlYmFja2VuZF9jb2RlZ2VuV29ybGRCdWlsZGVyYWJzdHJhY3RWYWx1ZVN0cmF0ZWd5ZW5xdWV1ZXJkZWZlcnJlZExvYWRUYXNrZHVtcEluZm9UYXNrc2VyaWFsaXphdGlvblRhc2tQSEFTRV9TQ0FOTklOR1BIQVNFX1JFU09MVklOR1BIQVNFX0RPTkVfUkVTT0xWSU5HUEhBU0VfQ09NUElMSU5HcGhhc2Vjb21waWxhdGlvbkZhaWxlZG9uUmVzb2x1dGlvblF1ZXVlRW1wdHlGb3JUZXN0aW5nb25Db2RlZ2VuUXVldWVFbXB0eUZvclRlc3RpbmdCRU5JR05fRVJST1JTa2VybmVsRnJvbnRFbmRUYXNrRnJvbnQgZW5kcmVwb3J0ZXJjcmVhdGVCYWNrZW5kbWFrZUVucXVldWVyY29uc3RhbnRDb21waWxlclRhc2tjcmVhdGVEZWZlcnJlZExvYWRUYXNraW1wYWN0Q2FjaGVpbXBhY3RDYWNoZURlbGV0ZXJjdXJyZW50RWxlbWVudHJlc29sdXRpb25Xb3JsZEJ1aWxkZXJyZXNvbHV0aW9ud29ybGRCdWlsZGVyY29kZWdlbldvcmxkQnVpbGRlckNvZGVnZW5Xb3JsZEJ1aWxkZXIgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0LnJ1bkludGVybmFsY2xlYXJTdGF0ZUNvbXBpbGluZyBkZXNlcmlhbGl6ZXJlc3VsdHNwZXJmb3JtR2xvYmFsVHlwZUluZmVyZW5jZWNsb3NlZFdvcmxkZ2VuZXJhdGVKYXZhU2NyaXB0Q29kZWxvYWRLZXJuZWwgbG9hZCBjb21wbGV0ZXJlZ2lzdGVyTG9hZGVkTGlicmFyaWVzZWxlbWVudEVudmlyb25tZW50bG9va3VwTGlicmFyeXNldEFubm90YXRpb25zcmVwb3J0V2FybmluZ01lc3NhZ2Vjb21waWxlRnJvbUtlcm5lbHJvb3RMaWJyYXJ5VXJpc2VsZWN0b3JzdGFydFJlc29sdXRpb25yZXNvbHV0aW9uRW5xdWV1ZXJoYXNSZXNvbHV0aW9uY3JlYXRlUmVzb2x1dGlvbkVucXVldWVyb25SZXNvbHV0aW9uU3RhcnRjb21wdXRlQ2xvc2VkV29ybGRmb3JFYWNoQ2xhc3NyZWdpc3RlckNsYXNzbWFpbkltcGFjdG1haW5GdW5jdGlvbmNvbXB1dGVNYWluYmVmb3JlUmVzb2x1dGlvbmNyZWF0ZUltcGFjdFN0cmF0ZWd5c3VwcG9ydERlZmVycmVkTG9hZGlzUHJvZ3JhbVNwbGl0c3VwcG9ydER1bXBJbmZvYXBwbHlJbXBhY3RSZXNvbHZpbmcuLi5wcm9jZXNzUXVldWVvblByb2dyZXNzc2hvd1Jlc29sdXRpb25Qcm9ncmVzc29uUmVzb2x1dGlvbkVuZHJlcG9ydFN1cHByZXNzZWRNZXNzYWdlc1N1bW1hcnllbmFibGVDb2RlZ2VuV2l0aEVycm9yc0lmU3VwcG9ydGVkY2hlY2tRdWV1ZWNsb3NlUmVzb2x1dGlvbkluZmVycmluZyB0eXBlcy4uLmluZmVycmVkRGF0YUJ1aWxkZXJhbm5vdGF0aW9uc0RhdGFydW5HbG9iYWxUeXBlSW5mZXJlbmNlZ2xvYmFsSW5mZXJlbmNlUmVzdWx0c3JlZ2lzdGVySkNsb3NlZFdvcmxkQ29tcGlsaW5nLi4uY29kZWdlbkVucXVldWVyc3RhcnRDb2RlZ2Vuc2hvd0NvZGVnZW5Qcm9ncmVzc3Byb2dyYW1TaXplYXNzZW1ibGVQcm9ncmFtaW5mZXJyZWREYXRhcmVwb3J0U2l6ZW9uQ29kZWdlbkVuZHNlcmlhbGl6ZXN0cmF0ZWd5aXJEYXRhd29ybGREYXRhc2VyaWFsaXplRGF0YWRlc2VyaWFsaXplRGF0YWRlc2VyaWFsaXplQ29tcG9uZW50Y3JlYXRlQ29kZWdlbkVucXVldWVyb25Db2RlZ2VuU3RhcnRzb3J0ZXJrQ2xvc2VkV29ybGRjbG9zZVdvcmxkakNsb3NlZFdvcmxkY3JlYXRlSkNsb3NlZFdvcmxkZW1wdHlRdWV1ZXdvcmt3aXRoQ3VycmVudEVsZW1lbnR3b3JrLnJ1bmltcGFjdFNvdXJjZW9wZW5jYW5vbmljYWxVcmlzdGFydFBoYXNlcXVldWVJc0Nsb3NlZG9uSW1wYWN0VXNlZGltcGFjdFVzZWNoZWNrTm9FbnF1ZXVlZEludm9rZWRJbnN0YW5jZU1ldGhvZHNjaGVja1F1ZXVlSXNFbXB0eVVuZXhwZWN0ZWQgcGhhc2U6IHNob3dQcm9ncmVzc1Jlc29sdmVkIHByb2Nlc3NlZEVudGl0aWVzIGVsZW1lbnRzLiBtZXRob2RzLm9uQ3Jhc2hJblVzZXJDb2RlbWFya0NvbXBpbGF0aW9uQXNGYWlsZWRmYXRhbERpYWdub3N0aWNSZXBvcnRlZHJlZ2lzdGVyQ29tcGlsZVRpbWVFcnJvcmN1cnJlbnRseUluVXNlckNvZGVpblVzZXJDb2RlYXNzdW1lSW5Vc2VyQ29kZV91cmlGcm9tRWxlbWVudGNvZGVMb2NhdGlvbmluU2FtZUxvY2F0aW9uZ2V0Q2Fub25pY2FsVXJpc2xhc2hQb3NlbGVtZW50SGFzQ29tcGlsZVRpbWVFcnJvcl9Db21waWxlck91dHB1dF9jb21waWxlcl91c2VyT3V0cHV0U3VwcHJlc3Npb25JbmZvd2FybmluZ3NDb21waWxlckRpYWdub3N0aWNSZXBvcnRlcl9jdXJyZW50RWxlbWVudGxhc3REaWFnbm9zdGljV2FzRmlsdGVyZWRzdXBwcmVzc2VkV2FybmluZ3NjcmVhdGVNZXNzYWdlc3Bhbm5hYmxlbWVzc2FnZUtpbmRzcGFuRnJvbVNwYW5uYWJsZXJlcG9ydEVycm9ycmVwb3J0RGlhZ25vc3RpY0ludGVybmFscmVwb3J0V2FybmluZ3JlcG9ydEhpbnRyZXBvcnRJbmZvZWxlbWVudEZyb21TcGFubmFibGVlcnJvckVsZW1lbnRoYXNSZXBvcnRlZEVycm9ycmVwb3J0QXNzZXJ0aW9uRmFpbHVyZXBsZWFzZVJlcG9ydENyYXNodW5oYW5kbGVkRXhjZXB0aW9uT25FbGVtZW50ZG91YmxlRmF1bHR0cnlUb1N0cmluZ19zcGFuRnJvbVN0cmF0ZWd5Tm8gZXJyb3IgbG9jYXRpb24uc291cmNlRWxlbWVudHNvdXJjZUluZm9ybWF0aW9uaW50ZXJuYWxFcnJvcnJlYXNvbjxleGNlcHRpb24gaW4gdG9TdHJpbmcoKT5fTWFwSW1wYWN0Q2FjaGVEZWxldGVydW5jYWNoZVdvcmxkSW1wYWN0ZW1wdHlDYWNoZV9FbXB0eUVudmlyb25tZW50UHJvZ3Jlc3NzdWZmaXhQcm9ncmVzc0ltcGxfc3RvcHdhdGNoSW50ZXJhY3RpdmVQcm9ncmVzc19zdG9wd2F0Y2hQaGFzZV9zdG9wd2F0Y2hJbnRlcnZhbHRpbWVyYXRlG1sxQRtbSxtbNDg7NTs0MG0bWzMwbT09PhtbMG0gIEVsYXBzZWQgdGltZTogIHMuIFJhdGU6ICB1bml0cy9tc2RhcnQyanMubWVzc2FnZXNzaGFyZWRfbWVzc2FnZXNBQlNUUkFDVF9HRVRURVJNZXNzYWdlS2luZC5BQlNUUkFDVF9HRVRURVJDQU5OT1RfUkVTT0xWRU1lc3NhZ2VLaW5kLkNBTk5PVF9SRVNPTFZFQ09NUElMRVJfQ1JBU0hFRE1lc3NhZ2VLaW5kLkNPTVBJTEVSX0NSQVNIRURDT01QTEVYX1JFVFVSTklOR19OU01NZXNzYWdlS2luZC5DT01QTEVYX1JFVFVSTklOR19OU01DT01QTEVYX1RIUk9XSU5HX05TTU1lc3NhZ2VLaW5kLkNPTVBMRVhfVEhST1dJTkdfTlNNTWVzc2FnZUtpbmQuQ09OU1RfQ09OU1RSVUNUT1JfV0lUSF9CT0RZQ09OU1RfRkFDVE9SWU1lc3NhZ2VLaW5kLkNPTlNUX0ZBQ1RPUllDT05TVFJVQ1RPUl9XSVRIX1JFVFVSTl9UWVBFTWVzc2FnZUtpbmQuQ09OU1RSVUNUT1JfV0lUSF9SRVRVUk5fVFlQRUNZQ0xJQ19DT01QSUxFX1RJTUVfQ09OU1RBTlRTTWVzc2FnZUtpbmQuQ1lDTElDX0NPTVBJTEVfVElNRV9DT05TVEFOVFNESVJFQ1RMWV9USFJPV0lOR19OU01NZXNzYWdlS2luZC5ESVJFQ1RMWV9USFJPV0lOR19OU01FUVVBTF9NQVBfRU5UUllfS0VZTWVzc2FnZUtpbmQuRVFVQUxfTUFQX0VOVFJZX0tFWUVRVUFMX1NFVF9FTlRSWU1lc3NhZ2VLaW5kLkVRVUFMX1NFVF9FTlRSWUVYVFJBTkVPVVNfTU9ESUZJRVJNZXNzYWdlS2luZC5FWFRSQU5FT1VTX01PRElGSUVSRVhUUkFORU9VU19NT0RJRklFUl9SRVBMQUNFTWVzc2FnZUtpbmQuRVhUUkFORU9VU19NT0RJRklFUl9SRVBMQUNFRk9SSU5fTk9UX0FTU0lHTkFCTEVNZXNzYWdlS2luZC5GT1JJTl9OT1RfQVNTSUdOQUJMRUdFTkVSSUNNZXNzYWdlS2luZC5HRU5FUklDSElEREVOX0hJTlRTTWVzc2FnZUtpbmQuSElEREVOX0hJTlRTSElEREVOX1dBUk5JTkdTTWVzc2FnZUtpbmQuSElEREVOX1dBUk5JTkdTSElEREVOX1dBUk5JTkdTX0hJTlRTTWVzc2FnZUtpbmQuSElEREVOX1dBUk5JTkdTX0hJTlRTSU1QTElDSVRfSlNfSU5URVJPUF9GSUVMRF9OT1RfU1VQUE9SVEVETWVzc2FnZUtpbmQuSU1QTElDSVRfSlNfSU5URVJPUF9GSUVMRF9OT1RfU1VQUE9SVEVESU5WQUxJRF9BU1NFUlRfVkFMVUVNZXNzYWdlS2luZC5JTlZBTElEX0FTU0VSVF9WQUxVRUlOVkFMSURfQVNTRVJUX1ZBTFVFX01FU1NBR0VNZXNzYWdlS2luZC5JTlZBTElEX0FTU0VSVF9WQUxVRV9NRVNTQUdFSU5WQUxJRF9CT09MX0ZST01fRU5WSVJPTk1FTlRfREVGQVVMVF9WQUxVRV9UWVBFTWVzc2FnZUtpbmQuSU5WQUxJRF9CT09MX0ZST01fRU5WSVJPTk1FTlRfREVGQVVMVF9WQUxVRV9UWVBFSU5WQUxJRF9DT05TVEFOVF9DQVNUTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9DQVNUSU5WQUxJRF9DT05TVEFOVF9BRERfVFlQRVNNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0FERF9UWVBFU0lOVkFMSURfQ09OU1RBTlRfQklOQVJZX0lOVF9UWVBFTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9CSU5BUllfSU5UX1RZUEVJTlZBTElEX0NPTlNUQU5UX0JJTkFSWV9OVU1fVFlQRU1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQklOQVJZX05VTV9UWVBFSU5WQUxJRF9DT05TVEFOVF9CSU5BUllfUFJJTUlUSVZFX1RZUEVNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0JJTkFSWV9QUklNSVRJVkVfVFlQRUlOVkFMSURfQ09OU1RBTlRfQ09NUExFTUVOVF9UWVBFTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9DT01QTEVNRU5UX1RZUEVJTlZBTElEX0NPTlNUQU5UX0NPTkRJVElPTkFMX1RZUEVNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0NPTkRJVElPTkFMX1RZUEVJTlZBTElEX0NPTlNUQU5UX0NPTlNUUlVDVE9STWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9DT05TVFJVQ1RPUklOVkFMSURfQ09OU1RBTlRfRElWTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9ESVZJTlZBTElEX0NPTlNUQU5UX0lOREVYTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9JTkRFWElOVkFMSURfQ09OU1RBTlRfSU5URVJQT0xBVElPTl9UWVBFTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9JTlRFUlBPTEFUSU9OX1RZUEVJTlZBTElEX0NPTlNUQU5UX05FR0FURV9UWVBFTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9ORUdBVEVfVFlQRUlOVkFMSURfQ09OU1RBTlRfTk9UX1RZUEVNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX05PVF9UWVBFSU5WQUxJRF9DT05TVEFOVF9TVFJJTkdfQUREX1RZUEVNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX1NUUklOR19BRERfVFlQRUlOVkFMSURfQ09OU1RBTlRfTlVNX0FERF9UWVBFTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9OVU1fQUREX1RZUEVJTlZBTElEX0NPTlNUQU5UX1NUUklOR19MRU5HVEhfVFlQRU1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfU1RSSU5HX0xFTkdUSF9UWVBFSU5WQUxJRF9DT05TVEFOVF9TSElGVE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfU0hJRlRJTlZBTElEX0ZST01fRU5WSVJPTk1FTlRfTkFNRV9UWVBFTWVzc2FnZUtpbmQuSU5WQUxJRF9GUk9NX0VOVklST05NRU5UX05BTUVfVFlQRUlOVkFMSURfSU5UX0ZST01fRU5WSVJPTk1FTlRfREVGQVVMVF9WQUxVRV9UWVBFTWVzc2FnZUtpbmQuSU5WQUxJRF9JTlRfRlJPTV9FTlZJUk9OTUVOVF9ERUZBVUxUX1ZBTFVFX1RZUEVJTlZBTElEX0xPR0lDQUxfQU5EX09QRVJBTkRfVFlQRU1lc3NhZ2VLaW5kLklOVkFMSURfTE9HSUNBTF9BTkRfT1BFUkFORF9UWVBFSU5WQUxJRF9MT0dJQ0FMX09SX09QRVJBTkRfVFlQRU1lc3NhZ2VLaW5kLklOVkFMSURfTE9HSUNBTF9PUl9PUEVSQU5EX1RZUEVJTlZBTElEX01FVEFEQVRBTWVzc2FnZUtpbmQuSU5WQUxJRF9NRVRBREFUQUlOVkFMSURfTUVUQURBVEFfR0VORVJJQ01lc3NhZ2VLaW5kLklOVkFMSURfTUVUQURBVEFfR0VORVJJQ0lOVkFMSURfUEFDS0FHRV9DT05GSUdNZXNzYWdlS2luZC5JTlZBTElEX1BBQ0tBR0VfQ09ORklHSU5WQUxJRF9QQUNLQUdFX1VSSU1lc3NhZ2VLaW5kLklOVkFMSURfUEFDS0FHRV9VUklJTlZBTElEX1NUUklOR19GUk9NX0VOVklST05NRU5UX0RFRkFVTFRfVkFMVUVfVFlQRU1lc3NhZ2VLaW5kLklOVkFMSURfU1RSSU5HX0ZST01fRU5WSVJPTk1FTlRfREVGQVVMVF9WQUxVRV9UWVBFSlNfSU5URVJPUF9DTEFTU19DQU5OT1RfRVhURU5EX0RBUlRfQ0xBU1NNZXNzYWdlS2luZC5KU19JTlRFUk9QX0NMQVNTX0NBTk5PVF9FWFRFTkRfREFSVF9DTEFTU0pTX0lOVEVST1BfQ0xBU1NfTk9OX0VYVEVSTkFMX0NPTlNUUlVDVE9STWVzc2FnZUtpbmQuSlNfSU5URVJPUF9DTEFTU19OT05fRVhURVJOQUxfQ09OU1RSVUNUT1JKU19JTlRFUk9QX0NMQVNTX05PTl9FWFRFUk5BTF9NRU1CRVJNZXNzYWdlS2luZC5KU19JTlRFUk9QX0NMQVNTX05PTl9FWFRFUk5BTF9NRU1CRVJKU19JTlRFUk9QX0ZJRUxEX05PVF9TVVBQT1JURURNZXNzYWdlS2luZC5KU19JTlRFUk9QX0ZJRUxEX05PVF9TVVBQT1JURURKU19JTlRFUk9QX0lOREVYX05PVF9TVVBQT1JURURNZXNzYWdlS2luZC5KU19JTlRFUk9QX0lOREVYX05PVF9TVVBQT1JURURKU19JTlRFUk9QX05PTl9FWFRFUk5BTF9NRU1CRVJNZXNzYWdlS2luZC5KU19JTlRFUk9QX05PTl9FWFRFUk5BTF9NRU1CRVJKU19JTlRFUk9QX01FTUJFUl9JTl9OT05fSlNfSU5URVJPUF9DTEFTU01lc3NhZ2VLaW5kLkpTX0lOVEVST1BfTUVNQkVSX0lOX05PTl9KU19JTlRFUk9QX0NMQVNTSlNfSU5URVJPUF9NRVRIT0RfV0lUSF9OQU1FRF9BUkdVTUVOVFNNZXNzYWdlS2luZC5KU19JTlRFUk9QX01FVEhPRF9XSVRIX05BTUVEX0FSR1VNRU5UU0pTX09CSkVDVF9MSVRFUkFMX0NPTlNUUlVDVE9SX1dJVEhfUE9TSVRJT05BTF9BUkdVTUVOVFNNZXNzYWdlS2luZC5KU19PQkpFQ1RfTElURVJBTF9DT05TVFJVQ1RPUl9XSVRIX1BPU0lUSU9OQUxfQVJHVU1FTlRTSlNfUExBQ0VIT0xERVJfQ0FQVFVSRU1lc3NhZ2VLaW5kLkpTX1BMQUNFSE9MREVSX0NBUFRVUkVMSUJSQVJZX05PVF9GT1VORE1lc3NhZ2VLaW5kLkxJQlJBUllfTk9UX0ZPVU5ETUlSUk9SU19MSUJSQVJZX05PVF9TVVBQT1JUX1dJVEhfQ0ZFTWVzc2FnZUtpbmQuTUlSUk9SU19MSUJSQVJZX05PVF9TVVBQT1JUX1dJVEhfQ0ZFTUlTU0lOR19FWFBSRVNTSU9OX0lOX1RIUk9XTWVzc2FnZUtpbmQuTUlTU0lOR19FWFBSRVNTSU9OX0lOX1RIUk9XTkFUSVZFX05PTl9JTlNUQU5DRV9JTl9OT05fTkFUSVZFX0NMQVNTTWVzc2FnZUtpbmQuTkFUSVZFX05PTl9JTlNUQU5DRV9JTl9OT05fTkFUSVZFX0NMQVNTTk9fU1VDSF9TVVBFUl9NRU1CRVJNZXNzYWdlS2luZC5OT19TVUNIX1NVUEVSX01FTUJFUk5PTl9OQVRJVkVfRVhURVJOQUxNZXNzYWdlS2luZC5OT05fTkFUSVZFX0VYVEVSTkFMTk9UX0FfQ09NUElMRV9USU1FX0NPTlNUQU5UTWVzc2FnZUtpbmQuTk9UX0FfQ09NUElMRV9USU1FX0NPTlNUQU5UTk9UX0FTU0lHTkFCTEVNZXNzYWdlS2luZC5OT1RfQVNTSUdOQUJMRVBMRUFTRV9SRVBPUlRfVEhFX0NSQVNITWVzc2FnZUtpbmQuUExFQVNFX1JFUE9SVF9USEVfQ1JBU0hQUkVBTUJMRU1lc3NhZ2VLaW5kLlBSRUFNQkxFTWVzc2FnZUtpbmQuUkVUSFJPV19PVVRTSURFX0NBVENIUkVUVVJOX0lOX0dFTkVSQVRJVkVfQ09OU1RSVUNUT1JNZXNzYWdlS2luZC5SRVRVUk5fSU5fR0VORVJBVElWRV9DT05TVFJVQ1RPUk1lc3NhZ2VLaW5kLlJFVFVSTl9JTl9HRU5FUkFUT1JSVU5USU1FX1RZUEVfVE9fU1RSSU5HX09CSkVDVE1lc3NhZ2VLaW5kLlJVTlRJTUVfVFlQRV9UT19TVFJJTkdfT0JKRUNUUlVOVElNRV9UWVBFX1RPX1NUUklOR19TVUJUWVBFTWVzc2FnZUtpbmQuUlVOVElNRV9UWVBFX1RPX1NUUklOR19TVUJUWVBFU1RSSU5HX0VYUEVDVEVETWVzc2FnZUtpbmQuU1RSSU5HX0VYUEVDVEVETWVzc2FnZUtpbmQuVU5ERUZJTkVEX0dFVFRFUlVOREVGSU5FRF9JTlNUQU5DRV9HRVRURVJfQlVUX1NFVFRFUk1lc3NhZ2VLaW5kLlVOREVGSU5FRF9JTlNUQU5DRV9HRVRURVJfQlVUX1NFVFRFUk1lc3NhZ2VLaW5kLlVOREVGSU5FRF9NRVRIT0RNZXNzYWdlS2luZC5VTkRFRklORURfT1BFUkFUT1JNZXNzYWdlS2luZC5VTkRFRklORURfU0VUVEVSVU5ERUZJTkVEX1NUQVRJQ19HRVRURVJfQlVUX1NFVFRFUk1lc3NhZ2VLaW5kLlVOREVGSU5FRF9TVEFUSUNfR0VUVEVSX0JVVF9TRVRURVJVTkRFRklORURfU1RBVElDX1NFVFRFUl9CVVRfR0VUVEVSTWVzc2FnZUtpbmQuVU5ERUZJTkVEX1NUQVRJQ19TRVRURVJfQlVUX0dFVFRFUk1lc3NhZ2VLaW5kLlVOREVGSU5FRF9TVVBFUl9TRVRURVJXUk9OR19BUkdVTUVOVF9GT1JfSlNNZXNzYWdlS2luZC5XUk9OR19BUkdVTUVOVF9GT1JfSlNXUk9OR19BUkdVTUVOVF9GT1JfSlNfRklSU1RNZXNzYWdlS2luZC5XUk9OR19BUkdVTUVOVF9GT1JfSlNfRklSU1RXUk9OR19BUkdVTUVOVF9GT1JfSlNfU0VDT05ETWVzc2FnZUtpbmQuV1JPTkdfQVJHVU1FTlRfRk9SX0pTX1NFQ09ORFdST05HX0FSR1VNRU5UX0ZPUl9KU19JTlRFUkNFUFRPUl9DT05TVEFOVE1lc3NhZ2VLaW5kLldST05HX0FSR1VNRU5UX0ZPUl9KU19JTlRFUkNFUFRPUl9DT05TVEFOVFNXSVRDSF9DQVNFX0ZPUkJJRERFTk1lc3NhZ2VLaW5kLlNXSVRDSF9DQVNFX0ZPUkJJRERFTlNXSVRDSF9DQVNFX1ZBTFVFX09WRVJSSURFU19FUVVBTFNNZXNzYWdlS2luZC5TV0lUQ0hfQ0FTRV9WQUxVRV9PVkVSUklERVNfRVFVQUxTU1dJVENIX0NBU0VfVFlQRVNfTk9UX0VRVUFMTWVzc2FnZUtpbmQuU1dJVENIX0NBU0VfVFlQRVNfTk9UX0VRVUFMU1dJVENIX0NBU0VfVFlQRVNfTk9UX0VRVUFMX0NBU0VNZXNzYWdlS2luZC5TV0lUQ0hfQ0FTRV9UWVBFU19OT1RfRVFVQUxfQ0FTRWhvd1RvRml4ZXhhbXBsZXNURU1QTEFURVMje3RleHR9Q2Fubm90IHJlc29sdmUgJyN7bmFtZX0nLk5vdCBhIGNvbXBpbGUtdGltZSBjb25zdGFudC5DeWNsZSBpbiB0aGUgY29tcGlsZS10aW1lIGNvbnN0YW50IGNvbXB1dGF0aW9uLkNhbm5vdCByZXNvbHZlIHNldHRlci5FeHBlY3RlZCBhICdTdHJpbmcnLCBidXQgZ290IGFuIGluc3RhbmNlIG9mICcje3R5cGV9Jy5Kcy1pbnRlcm9wIGNsYXNzICcje2Nsc30nIGNhbm5vdCBleHRlbmQgZnJvbSB0aGUgbm9uIGpzLWludGVyb3AgY2xhc3MgJyN7c3VwZXJjbGFzc30nLkFubm90YXRlIHRoZSBzdXBlcmNsYXNzIHdpdGggQEpTLiAgICAgICAgICAgICAgaW1wb3J0ICdwYWNrYWdlOmpzL2pzLmRhcnQnOwoKICAgICAgICAgICAgICBjbGFzcyBGb28geyB9CgogICAgICAgICAgICAgIEBKUygpCiAgICAgICAgICAgICAgY2xhc3MgQmFyIGV4dGVuZHMgRm9vIHsgfQoKICAgICAgICAgICAgICBtYWluKCkgewogICAgICAgICAgICAgICAgbmV3IEJhcigpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBKcy1pbnRlcm9wIGRvZXMgbm90IHN1cHBvcnQgW10gYW5kIFtdPSBvcGVyYXRvciBtZXRob2RzLlRyeSByZXBsYWNpbmcgW10gYW5kIFtdPSBvcGVyYXRvciBtZXRob2RzIHdpdGggbm9ybWFsIG1ldGhvZHMuICAgICAgICBpbXBvcnQgJ3BhY2thZ2U6anMvanMuZGFydCc7CgogICAgICAgIEBKUygpCiAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgIGV4dGVybmFsIG9wZXJhdG9yIFtdKGFyZyk7CiAgICAgICAgfQoKICAgICAgICBtYWluKCkgewogICAgICAgICAgbmV3IEZvbygpWzBdOwogICAgICAgIH0KICAgICAgICAgICAgICAgIGltcG9ydCAncGFja2FnZTpqcy9qcy5kYXJ0JzsKCiAgICAgICAgQEpTKCkKICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgZXh0ZXJuYWwgb3BlcmF0b3IgW109KGFyZywgdmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgbWFpbigpIHsKICAgICAgICAgIG5ldyBGb28oKVswXSA9IDE7CiAgICAgICAgfQogICAgICAgIFNvbWUgcGFyYW1ldGVycyBpbiBhbm9ueW1vdXMganMtaW50ZXJvcCBjbGFzcyAnI3tjbHN9JyBvYmplY3QgbGl0ZXJhbCBjb25zdHJ1Y3RvciBhcmUgcG9zaXRpb25hbCBpbnN0ZWFkIG9mIG5hbWVkLk1ha2UgYWxsIGFyZ3VtZW50cyBpbiBleHRlcm5hbCBmYWN0b3J5IG9iamVjdCBsaXRlcmFsIGNvbnN0cnVjdG9ycyBuYW1lZC5jbGFzcyBTdXBlciB7CiAgZmFjdG9yeSBTdXBlci5mb28oKSA9PiBudWxsOwp9CmNsYXNzIENsYXNzIGV4dGVuZHMgU3VwZXIgewogIENsYXNzKCkgOiBzdXBlci5mb28oKTsKfQptYWluKCkgPT4gbmV3IENsYXNzKCk7CkpzLWludGVyb3AgbWVtYmVycyBtdXN0IGJlICdleHRlcm5hbCcuSnMtaW50ZXJvcCBjbGFzcyBtZW1iZXJzIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBqcy1pbnRlcm9wIGNsYXNzZXMuVHJ5IG1hcmtpbmcgdGhlIGVuY2xvc2luZyBjbGFzcyBhcyBqcy1pbnRlcm9wIG9yIHJlbW92ZSB0aGUganMtaW50ZXJvcCBhbm5vdGF0aW9uIGZyb20gdGhlIG1lbWJlci5Db25zdHJ1Y3RvciAnI3tjb25zdHJ1Y3Rvcn0nIGluIGpzLWludGVyb3AgY2xhc3MgJyN7Y2xzfScgaXMgbm90IGV4dGVybmFsLlRyeSBhZGRpbmcgdGhlICdleHRlcm5hbCcgdG8gJyN7Y29uc3RydWN0b3J9Jy5NZW1iZXIgJyN7bWVtYmVyfScgaW4ganMtaW50ZXJvcCBjbGFzcyAnI3tjbHN9JyBpcyBub3QgZXh0ZXJuYWwuVHJ5IGFkZGluZyB0aGUgJ2V4dGVybmFsJyB0byAnI3ttZW1iZXJ9Jy4gICAgICAgICAgICAgIGltcG9ydCAncGFja2FnZTpqcy9qcy5kYXJ0JzsKCiAgICAgICAgICAgICAgQEpTKCkKICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgYmFyKCkge30KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIG1haW4oKSB7CiAgICAgICAgICAgICAgICBuZXcgRm9vKCkuYmFyKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIEpzLWludGVyb3AgbWV0aG9kICcje21ldGhvZH0nIGhhcyBuYW1lZCBhcmd1bWVudHMgYnV0IGlzIG5vdCBhIGZhY3RvcnkgY29uc3RydWN0b3Igb2YgYW4gQGFub255bW91cyBASlMgY2xhc3MuUmVtb3ZlIGFsbCBuYW1lZCBhcmd1bWVudHMgZnJvbSBqcy1pbnRlcm9wIG1ldGhvZCBvciBpbiB0aGUgY2FzZSBvZiBhIGZhY3RvcnkgY29uc3RydWN0b3IgYW5ub3RhdGUgdGhlIGNsYXNzIGFzIEBhbm9ueW1vdXMuICAgICAgICAgICAgICBpbXBvcnQgJ3BhY2thZ2U6anMvanMuZGFydCc7CgogICAgICAgICAgICAgIEBKUygpCiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIGV4dGVybmFsIGJhcihmb28sIHtiYXp9KTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIG1haW4oKSB7CiAgICAgICAgICAgICAgICBuZXcgRm9vKCkuYmFyKDQsIGJhejogNSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIEZpZWxkcyBpbiBqcy1pbnRlcm9wIGNsYXNzZXMgYXJlIG5vdCBzdXBwb3J0ZWQuVHJ5IHJlcGxhY2luZyB0aGUgZmllbGQgd2l0aCBhbiBleHRlcm5hbCBnZXR0ZXIgYW5kL29yIHNldHRlci5GaWVsZCBjYW4ndCBiZSBtYXJrZWQgYXMganMtaW50ZXJvcC5MaWJyYXJ5IG5vdCBmb3VuZCAnI3tyZXNvbHZlZFVyaX0nLlBhY2thZ2UgY29uZmlnIGZpbGUgJyN7dXJpfScgaXMgaW52YWxpZC4KI3tleGNlcHRpb259JyN7dXJpfScgaXMgbm90IGEgdmFsaWQgcGFja2FnZSBVUkkgKCN7ZXhjZXB0aW9ufSkuLy8gY2FuJ3QgaGF2ZSBhICd0b3AgbGV2ZWwnIHBhY2thZ2UgVVJJCmltcG9ydCAncGFja2FnZTpmb28uZGFydCc7CgptYWluKCkge30KLy8gY2FuJ3QgaGF2ZSAyIHNsYXNoZXMKaW1wb3J0ICdwYWNrYWdlOi8vZm9vL2Zvby5kYXJ0JzsKCm1haW4oKSB7fQovLyBwYWNrYWdlIG5hbWUgbXVzdCBiZSB2YWxpZAppbXBvcnQgJ3BhY2thZ2U6bm90C2FsaWQvZm9vLmRhcnQnOwoKbWFpbigpIHt9CkpTIGNvZGUgbXVzdCBub3QgdXNlICcjJyBwbGFjZWhvbGRlcnMgaW5zaWRlIGZ1bmN0aW9ucy5Vc2UgYW4gaW1tZWRpYXRlbHkgY2FsbGVkIEphdmFTY3JpcHQgZnVuY3Rpb24gdG8gY2FwdHVyZSB0aGUgdGhlIHBsYWNlaG9sZGVyIHZhbHVlcyBhcyBKYXZhU2NyaXB0IGZ1bmN0aW9uIHBhcmFtZXRlcnMuSlMgZXhwcmVzc2lvbiBtdXN0IHRha2UgdHdvIG9yIG1vcmUgYXJndW1lbnRzLkpTIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIGxpdGVyYWwuQXJndW1lbnQgZm9yICdKU19JTlRFUkNFUFRPUl9DT05TVEFOVCcgbXVzdCBiZSBhIHR5cGUgY29uc3RhbnQuVGhlIGdldHRlciAnI3tuYW1lfScgaGFzIG5vIGltcGxlbWVudGF0aW9uIGluIGNsYXNzICcje2NsYXNzfScuVHJ5IGFkZGluZyBhIGJvZHkgdG8gJyN7bmFtZX0nIG9yIGRlY2xhcmluZyAnI3tjbGFzc30nIHRvIGJlICdhYnN0cmFjdCcuY2xhc3MgQ2xhc3MgewogIGdldCBnZXR0ZXI7Cn0KbWFpbigpID0+IG5ldyBDbGFzcygpOwpBIG1ldGFkYXRhIGFubm90YXRpb24gbXVzdCBiZSBlaXRoZXIgYSByZWZlcmVuY2UgdG8gYSBjb21waWxlLXRpbWUgY29uc3RhbnQgdmFyaWFibGUgb3IgYSBjYWxsIHRvIGEgY29uc3RhbnQgY29uc3RydWN0b3IuVHJ5IHVzaW5nIGEgZGlmZmVyZW50IGNvbnN0YW50IHZhbHVlIG9yIHJlZmVyZW5jaW5nIGl0IHRocm91Z2ggYSBjb25zdGFudCB2YXJpYWJsZS5AT2JqZWN0IG1haW4oKSB7fUBwcmludCBtYWluKCkge31BIG1ldGFkYXRhIGFubm90YXRpb24gdXNpbmcgYSBjb25zdGFudCBjb25zdHJ1Y3RvciBjYW5ub3QgdXNlIHR5cGUgYXJndW1lbnRzLlRyeSByZW1vdmluZyB0aGUgdHlwZSBhcmd1bWVudHMgb3IgcmVmZXJlbmNpbmcgdGhlIGNvbnN0YW50IHRocm91Z2ggYSBjb25zdGFudCB2YXJpYWJsZS5jbGFzcyBDPFQ+IHsKICBjb25zdCBDKCk7Cn0KQEM8aW50PigpIG1haW4oKSB7fQpBbiBlbnRyeSB3aXRoIHRoZSBzYW1lIGtleSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbWFwLlRyeSByZW1vdmluZyB0aGUgcHJldmlvdXMgZW50cnkgb3IgY2hhbmdpbmcgdGhlIGtleSBpbiBvbmUgb2YgdGhlIGVudHJpZXMubWFpbigpIHsKICB2YXIgbSA9IGNvbnN0IHsnZm9vJzogMSwgJ2Zvbyc6IDJ9Owp9QW4gZW50cnkgYXBwZWFycyB0d2ljZSBpbiB0aGUgc2V0LlRyeSByZW1vdmluZyBvbmUgb2YgdGhlIGVudHJpZXMubWFpbigpIHsKICB2YXIgbSA9IGNvbnN0IHsnZm9vJywgJ2JhcicsICdmb28nfTsKfVRoZSBjb21waWxlciBjcmFzaGVkIHdoZW4gY29tcGlsaW5nIHRoaXMgZWxlbWVudC5UaGUgY29tcGlsZXIgaXMgYnJva2VuLgoKV2hlbiBjb21waWxpbmcgdGhlIGFib3ZlIGVsZW1lbnQsIHRoZSBjb21waWxlciBjcmFzaGVkLiBJdCBpcyBub3QKcG9zc2libGUgdG8gdGVsbCBpZiB0aGlzIGlzIGNhdXNlZCBieSBhIHByb2JsZW0gaW4geW91ciBwcm9ncmFtIG9yCm5vdC4gUmVnYXJkbGVzcywgdGhlIGNvbXBpbGVyIHNob3VsZCBub3QgY3Jhc2guCgpUaGUgRGFydCB0ZWFtIHdvdWxkIGdyZWF0bHkgYXBwcmVjaWF0ZSBpZiB5b3Ugd291bGQgdGFrZSBhIG1vbWVudCB0bwpyZXBvcnQgdGhpcyBwcm9ibGVtIGF0IGh0dHA6Ly9kYXJ0YnVnLmNvbS9uZXcuCgpQbGVhc2UgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOgoKKiB0aGUgbmFtZSBhbmQgdmVyc2lvbiBvZiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0sCgoqIHRoZSBEYXJ0IFNESyBidWlsZCBudW1iZXIgKCN7YnVpbGRJZH0pLCBhbmQKCiogdGhlIGVudGlyZSBtZXNzYWdlIHlvdSBzZWUgaGVyZSAoaW5jbHVkaW5nIHRoZSBmdWxsIHN0YWNrIHRyYWNlCiAgYmVsb3cgYXMgd2VsbCBhcyB0aGUgc291cmNlIGxvY2F0aW9uIGFib3ZlKS4KI3t3YXJuaW5nc30gd2FybmluZyhzKSBhbmQgI3toaW50c30gaGludChzKSBzdXBwcmVzc2VkIGluICN7dXJpfS4je3dhcm5pbmdzfSB3YXJuaW5nKHMpIHN1cHByZXNzZWQgaW4gI3t1cml9LiN7aGludHN9IGhpbnQocykgc3VwcHJlc3NlZCBpbiAje3VyaX0uV2hlbiBydW4gb24gdGhlIGNvbW1hbmQtbGluZSwgdGhlIGNvbXBpbGVkIG91dHB1dCBtaWdodCByZXF1aXJlIGEgcHJlYW1ibGUgZmlsZSBsb2NhdGVkIGluOgogIDxzZGs+L2xpYi9faW50ZXJuYWwvanNfcnVudGltZS9saWIvcHJlYW1ibGVzLmAje2NvbnN0YW50fWAgb2YgdHlwZSAnI3t0eXBlfScgaXMgbm90IGEgdmFsaWQgY29uc3RhbnQgY29uZGl0aW9uLiBNdXN0IGJlIGEgdmFsdWUgb2YgdHlwZSAnYm9vbCcuYCN7Y29uc3RhbnR9YCBvZiB0eXBlICcje3R5cGV9JyBpcyBub3QgdmFsaWQgaW4gY29uc3RhbnQgc3RyaW5nIGludGVycG9sYXRpb24uIE11c3QgYmUgYSB2YWx1ZSBvZiB0eXBlICdib29sJywgJ2ludCcsICdkb3VibGUnLCBvciAnU3RyaW5nJy5gI3tjb25zdGFudH1gIG9mIHR5cGUgJyN7dHlwZX0nIGlzIG5vdCBhIHZhbGlkIG9wZXJhbmQgb2YgYSBjb25zdGFudCBiaW5hcnkgI3tvcGVyYXRvcn0gZXhwcmVzc2lvbi4gTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgJ2Jvb2wnLCAnaW50JywgJ2RvdWJsZScsICdTdHJpbmcnLCBvciAnTnVsbCcuY29uc3RhbnQgYmluYXJ5ICsgZXhwcmVzc2lvbiBvbiAnU3RyaW5nJy4gTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgJ1N0cmluZycuYCN7Y29uc3RhbnR9YCBvZiB0eXBlICcje3R5cGV9JyBpcyBub3QgYSB2YWxpZCBvcGVyYW5kIGZvciBhIC5sZW5ndGggZXhwcmVzc2lvbi4gTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgJ1N0cmluZycuU2hpZnQgYW1vdW50IG11c3QgYmUgbm9uLW5lZ2F0aXZlIGluIGAje2xlZnR9ICN7b3BlcmF0b3J9ICN7cmlnaHR9YC5EaXZpc29yIG11c3QgYmUgbm9uLXplcm8gaW4gYCN7bGVmdH0gI3tvcGVyYXRvcn0gI3tyaWdodH1gLmNvbnN0YW50IGJpbmFyeSArIGV4cHJlc3Npb24gb24gJ251bScuIE11c3QgYmUgYSB2YWx1ZSBvZiB0eXBlICdpbnQnIG9yICdkb3VibGUnLmAje2NvbnN0YW50fWAgb2YgdHlwZSAnI3t0eXBlfScgaXMgbm90IGEgc3VidHlwZSBvZiAje2Nhc3RUeXBlfS5gI3tsZWZ0Q29uc3RhbnR9YCBvZiB0eXBlICcje2xlZnRUeXBlfScgYW5kIGAje3JpZ2h0Q29uc3RhbnR9YCBvZiB0eXBlICcje3JpZ2h0VHlwZX0nIGFyZSBub3QgdmFsaWQgb3BlcmFuZHMgb2YgYSBjb25zdGFudCBiaW5hcnkgKyBleHByZXNzaW9uLiBNdXN0IGJvdGggYmUgZWl0aGVyIG9mIHR5cGUgJ1N0cmluZycsIG9yIG9mIHR5cGVzICdpbnQnIG9yICdkb3VibGUnLidpbnQnLmNvbnN0YW50IHVuYXJ5ICN7b3BlcmF0b3J9IGV4cHJlc3Npb24uIE11c3QgYmUgYSB2YWx1ZSBvZiB0eXBlICdib29sJy5JbmRleCBleHByZXNzaW9ucyBhcmUgbm90IGFsbG93ZWQgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMuYCN7Y29uc3RhbnR9YCBvZiB0eXBlICcje3R5cGV9JyBpcyBub3QgYSB2YWxpZCBlbnZpcm9ubWVudCBuYW1lIGNvbnN0YW50LiBNdXN0IGJlIGEgdmFsdWUgb2YgdHlwZSAnU3RyaW5nJy5gI3tjb25zdGFudH1gIG9mIHR5cGUgJyN7dHlwZX0nIGlzIG5vdCBhIHZhbGlkIGBib29sLmZyb21FbnZpcm9ubWVudGAgZGVmYXVsdCB2YWx1ZSBjb25zdGFudC4gTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgJ2Jvb2wnIG9yIGBudWxsYC5gaW50LmZyb21FbnZpcm9ubWVudGAgZGVmYXVsdCB2YWx1ZSBjb25zdGFudC4gTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgJ2ludCcgb3IgYG51bGxgLmBTdHJpbmcuZnJvbUVudmlyb25tZW50YCBkZWZhdWx0IHZhbHVlIGNvbnN0YW50LiBNdXN0IGJlIGEgdmFsdWUgb2YgdHlwZSAnU3RyaW5nJyBvciBgbnVsbGAuYCN7Y29uc3RhbnR9YCBvZiB0eXBlICcje3R5cGV9JyBpcyBub3QgYSB2YWxpZCBsb2dpY2FsIGFuZCBvcGVyYW5kLiBgI3tjb25zdGFudH1gIG9mIHR5cGUgJyN7dHlwZX0nIGlzIG5vdCBhIHZhbGlkIGxvZ2ljYWwgb3Igb3BlcmFuZC4gQ29uc3RydWN0b3IgJyN7Y29uc3RydWN0b3JOYW1lfScgaXMgbm90IGEgdmFsaWQgY29uc3RhbnQgY29uc3RydWN0b3IuQXNzZXJ0aW9uICcje2Fzc2VydGlvbn0nIGZhaWxlZC5Bc3NlcnRpb24gZmFpbGVkOiAje21lc3NhZ2V9ZGFydDJqcyBubyBsb25nZXIgc3VwcG9ydHMgdGhlIGRhcnQ6bWlycm9ycyBsaWJyYXJ5LgoKQVBJcyBmcm9tIHRoaXMgbGlicmFyeSB3aWxsIHRocm93IGEgcnVudGltZSBlcnJvciBhdCB0aGlzIHRpbWUsIGJ1dCB0aGV5IHdpbGwKYmVjb21lIGEgY29tcGlsZS10aW1lIGVycm9yIGluIHRoZSBmdXR1cmUuVGhpcyAnbm9TdWNoTWV0aG9kJyBpbXBsZW1lbnRhdGlvbiBpcyBndWFyYW50ZWVkIHRvIHRocm93IGFuIGV4Y2VwdGlvbi4gVGhlIGdlbmVyYXRlZCBjb2RlIHdpbGwgYmUgc21hbGxlciBpZiBpdCBpcyByZXdyaXR0ZW4uUmV3cml0ZSB0byAnbm9TdWNoTWV0aG9kKEludm9jYXRpb24gaSkgPT4gc3VwZXIubm9TdWNoTWV0aG9kKGkpOycuZXhjZXB0aW9uLiBUaGUgZ2VuZXJhdGVkIGNvZGUgd2lsbCBiZSBzbWFsbGVyIGFuZCB0aGUgY29tcGlsZXIgd2lsbCBiZSBhYmxlIHRvIHBlcmZvcm0gbW9yZSBvcHRpbWl6YXRpb25zIGlmIGl0IGlzIHJld3JpdHRlbi5PdmVycmlkaW5nICdub1N1Y2hNZXRob2QnIGNhdXNlcyB0aGUgY29tcGlsZXIgdG8gZ2VuZXJhdGUgbW9yZSBjb2RlIGFuZCBwcmV2ZW50cyB0aGUgY29tcGlsZXIgZnJvbSBkb2luZyBzb21lIG9wdGltaXphdGlvbnMuQ29uc2lkZXIgcmVtb3ZpbmcgdGhpcyAnbm9TdWNoTWV0aG9kJyBpbXBsZW1lbnRhdGlvbi5Vc2luZyAnLnJ1bnRpbWVUeXBlLnRvU3RyaW5nKCknIGNhdXNlcyB0aGUgY29tcGlsZXIgdG8gZ2VuZXJhdGUgbW9yZSBjb2RlIGJlY2F1c2UgaXQgbmVlZHMgdG8gcHJlc2VydmUgdHlwZSBhcmd1bWVudHMgb24gYWxsIGdlbmVyaWMgY2xhc3NlcywgZXZlbiBpZiB0aGV5IGFyZSBub3QgbmVjZXNzYXJ5IGVsc2V3aGVyZS5JZiB1c2VkIG9ubHkgZm9yIGRlYnVnZ2luZywgY29uc2lkZXIgdXNpbmcgb3B0aW9uICB0byByZWR1Y2UgdGhlIGNvZGUgc2l6ZSBpbXBhY3QuVXNpbmcgJy5ydW50aW1lVHlwZS50b1N0cmluZygpJyBoZXJlIGNhdXNlcyB0aGUgY29tcGlsZXIgdG8gZ2VuZXJhdGUgbW9yZSBjb2RlIGJlY2F1c2UgaXQgbmVlZHMgdG8gcHJlc2VydmUgdHlwZSBhcmd1bWVudHMgb24gYWxsIGdlbmVyaWMgc3VidHlwZXMgb2YgJyN7cmVjZWl2ZXJUeXBlfScsIGV2ZW4gaWYgdGhleSBhcmUgbm90IG5lY2Vzc2FyeSBlbHNld2hlcmUuT25seSBleHRlcm5hbCBqcy1pbnRlcm9wIGZ1bmN0aW9ucyBhcmUgc3VwcG9ydGVkLlRyeSByZW1vdmluZyAnZXh0ZXJuYWwnIGtleXdvcmQgb3IgYW5ub3RhdGluZyB0aGUgZnVuY3Rpb24gYXMgYSBqcy1pbnRlcm9wIGZ1bmN0aW9uLk5hdGl2ZSBub24taW5zdGFuY2UgbWVtYmVycyBhcmUgb25seSBhbGxvd2VkIGluIG5hdGl2ZSBjbGFzc2VzLidjYXNlJyBleHByZXNzaW9uIHR5cGUgJyN7dHlwZX0nIG92ZXJyaWRlcyAnb3BlcmF0b3IgPT0nLidjYXNlJyBleHByZXNzaW9uIG1heSBub3QgYmUgb2YgdHlwZSAnI3t0eXBlfScuJ2Nhc2UnIGV4cHJlc3Npb25zIGRvIG5vdCBhbGwgaGF2ZSB0eXBlICcje3R5cGV9Jy4nY2FzZScgZXhwcmVzc2lvbiBvZiB0eXBlICcje3R5cGV9Jy5oYXNIb3dUb0ZpeGNvbXB1dGVNZXNzYWdlI3sjXHsuK1x9TWlzc2luZyBhcmd1bWVudHMgaW4gZXJyb3IgbWVzc2FnZTogIk1lc3NhZ2UuaGFzaENvZGVjb252ZXJ0VG9TdHJpbmd0b0RhcnRUZXh0RE9OVF9LTk9XX0hPV19UT19GSVhDb21wdXRlciBzYXlzIG5vIUVudmlyb25tZW50ZGFydDJqcy5pby5sb2NhdGlvbl9wcm92aWRlckNvZGVPdXRwdXRMaXN0ZW5lckxvY2F0aW9uQ29sbGVjdG9yX2NvbGxlY3RvblRleHRsaW5lU3RhcnRzPSxsZW5ndGg9a2VybmVsLmFzdC52aXNpdG9yRXhwcmVzc2lvblZpc2l0b3JTdGF0ZW1lbnRWaXNpdG9yTWVtYmVyVmlzaXRvckluaXRpYWxpemVyVmlzaXRvclRyZWVWaXNpdG9yRGFydFR5cGVWaXNpdG9yMU1lbWJlclJlZmVyZW5jZVZpc2l0b3JWaXNpdG9yUmVjdXJzaXZlVmlzaXRvclRyYW5zZm9ybWVyRXhwcmVzc2lvblZpc2l0b3IxU3RhdGVtZW50VmlzaXRvcjFCb2R5VmlzaXRvcjFrZXJuZWwuY2Fub25pY2FsX25hbWVfcGFyZW50X25vblJvb3RUb3BfY2hpbGRyZW5oYXNDaGlsZGdldENoaWxkRnJvbVF1YWxpZmllZE5hbWVDYW5ub3QgYWRkIGEgY2hpbGQgdG8gIGJlY2F1c2UgdGhpcyBuYW1lIGFscmVhZHkgaGFzIGEgY2hpbGQgbmFtZWQgcmVtb3ZlQ2hpbGQgaXMgYWxyZWFkeSBib3VuZENhbm5vdCBiaW5kICwgdGFyZ2V0IGlzIGFscmVhZHkgYm91bmQgdG8gdW5iaW5kY2hpbGRyZW5fZ2V0TWVtYmVyUXVhbGlmaWVyVW5leHBlY3RlZCBtZW1iZXI6IGtlcm5lbC50cmFuc2Zvcm1hdGlvbnMuZmxhZ3NzdXBlckNhbGxzc2VlbkJ5VmVyaWZpZXJrZXJuZWwudHlwZV9lbnZpcm9ubWVudEhpZXJhcmNoeUJhc2VkVHlwZUVudmlyb25tZW50RXJyb3JIYW5kbGVyeWllbGRUeXBlY3VycmVudEFzeW5jTWFya2VyZXJyb3JIYW5kbGVyZnJvbVN1YmNsYXNzbnVtVHlwZXJhd0Z1bmN0aW9uVHlwZWVsZW1lbnRUeXBlaXRlcmFibGVUeXBlc3RyZWFtVHlwZVN1YnR5cGVUZXN0ZXJ0eXBlQ2hlY2tzaXNUb3BfY29sbGVjdF9pc1N1YnR5cGVPZnN1YnR5cGVBcmdzdXBlcnR5cGVBcmdzdWJ0eXBlRnV0dXJlc3VwZXJ0eXBlRnV0dXJlX2lzRnVuY3Rpb25TdWJ0eXBlT2ZzdWJQYXJhbWV0ZXJzdXBlclBhcmFtZXRlcnN1YkJvdW5kc3VwZXJ0eXBlUGFyYW1ldGVyc3VidHlwZVBhcmFtZXRlcnN1YnR5cGVOYW1lSW5kZXhrZXJuZWwuY29xX2Fubm90Q29xTGliZGVzdFBhdGhSZWxhdGl2ZWNvcWNvcXJlZm5vY29xY29xb3B0Y29xc2luZ2xlY29xZGVmY29xc2luZ2xlZGVmY29xRW51bXNrZXJuZWwuYmluYXJ5LnRhZ1RhZ05vdGhpbmdTb21ldGhpbmdDb25zdFN0YXRpY0ludm9jYXRpb25Db25zdENvbnN0cnVjdG9ySW52b2NhdGlvblRydWVMaXRlcmFsRmFsc2VMaXRlcmFsUG9zaXRpdmVJbnRMaXRlcmFsTmVnYXRpdmVJbnRMaXRlcmFsQmlnSW50TGl0ZXJhbENvbnN0TGlzdExpdGVyYWxDb25zdE1hcExpdGVyYWxDb25zdFNldExpdGVyYWxBc3luY0ZvckluU3RhdGVtZW50U2ltcGxlSW50ZXJmYWNlVHlwZVNpbXBsZUZ1bmN0aW9uVHlwZU51bGxSZWZlcmVuY2VDbGFzc1JlZmVyZW5jZU1lbWJlclJlZmVyZW5jZURlcHJlY2F0ZWRfQ29uc3RhbnRFeHByZXNzaW9uU3BlY2lhbGl6ZWRUYWdIaWdoQml0U3BlY2lhbGl6ZWRUYWdNYXNrU3BlY2lhbGl6ZWRQYXlsb2FkTWFza1NwZWNpYWxpemVkVmFyaWFibGVHZXRTcGVjaWFsaXplZFZhcmlhYmxlU2V0U3BlY2lhbGl6ZWRJbnRMaXRlcmFsU3BlY2lhbGl6ZWRJbnRMaXRlcmFsQmlhc0NvbXBvbmVudEZpbGUyNDI3MTc4NDc5QmluYXJ5Rm9ybWF0VmVyc2lvbkNvbnN0YW50VGFna2VybmVsLmltcG9ydF90YWJsZUltcG9ydFRhYmxlQ29tcG9uZW50SW1wb3J0VGFibGVfbGlicmFyeUluZGV4TGlicmFyeUltcG9ydFRhYmxlX2ltcG9ydFBhdGhzX2ltcG9ydGVkTGlicmFyaWVzaW1wb3J0UGF0aHNfSW1wb3J0VGFibGVCdWlsZGVycmVmZXJlbmNlTGlicmFyeWFkZExpYnJhcnlJbXBvcnRyZWZlcmVuY2VVcml0YXJnZXRVcmkgY2Fubm90IHJlZmVyIHRvIGxpYnJhcnkgd2l0aG91dCBhbiBpbXBvcnQgVVJJaXNGaWxlT3JDdXN0b21TY2hlbWVpc1RhcmdldFNjaGVtZUZpbGVPckN1c3RvbWlzUmVmZXJlbmNlU2NoZW1lRmlsZU9yQ3VzdG9tcmVsYXRpdmVVcmkgY2Fubm90IHJlZmVyIHRvIGFwcGxpY2F0aW9uIGxpYnJhcnkgZXhwb3J0ZWRSZWZlcmVuY2VyZWxhdGl2ZVVyaVBhdGh0YXJnZXRTZWdtZW50c3JlZlNlZ21lbnRzc2FtZW9rZWRIZWFwX2l0ZW1zX3BhcmVudEluZGV4b3JwaGFuX3JlSW5zZXJ0X2ZpcnN0Q2hpbGRJbmRleGNoaWxkSW5kZXhuZXh0Q2hpbGRrZXJuZWwubGlicmFyeV9pbmRleExpYnJhcnlJbmRleGdldHRlclByZWZpeGdldDpzZXR0ZXJQcmVmaXhzZXQ6dG9wTGV2ZWxsaWJyYXJ5VXJpc2xpYnJhcnlVcmlTZXRieVVyaWNvcmVMaWJyYXJpZXNfZ2V0TGlicmFyeUluZGV4bGlicmFyeUluZGV4JyBoYXMgbm90IGJlZW4gaW5kZXhlZGNvbnRhaW5zTGlicmFyeW1lbWJlck5hbWV0cnlHZXRNZW1iZXJ0cnlHZXRUb3BMZXZlbE1lbWJlcl9DbGFzc1RhYmxlY29udGFpbmVyTmFtZWV4dGVybmFsIGxpYnJhcnkgJ2xpYnJhcnkgJ19nZXRDbGFzc0luZGV4JyBub3QgZm91bmQgaW4gX01lbWJlclRhYmxlX21lbWJlcnNnZXREaXNhbWJpZ3VhdGVkTmFtZXRvcC1sZXZlbCBvZiBjbGFzcyAnJyBpbiBBIG1lbWJlciB3aXRoIGRpc2FtYmlndWF0ZWQgbmFtZSAnJyB3YXMgbm90IGZvdW5kIGluIGdldHRlci4gRGlkIHlvdSBtZWFuICcnP2NoYXJjb2RlLmFzY2lpLmRvbGxhcl9sb3dlcmNhc2UkbnVsJHNvaCRzdHgkZXR4JGVvdCRlbnEkYWNrJGJlbCRicyRodCR0YWIkbGYkdnQkZmYkY3Ikc28kc2kkZGxlJGRjMSRkYzIkZGMzJGRjNCRuYWskc3luJGV0YiRjYW4kZW0kc3ViJGVzYyRmcyRncyRycyR1cyRkZWwkc3BhY2UkZXhjbGFtYXRpb24kcXVvdCRxdW90ZSRkb3VibGVfcXVvdGUkcXVvdGF0aW9uJGhhc2gkZG9sbGFyJHBlcmNlbnQkYW1wJGFtcGVyc2FuZCRhcG9zJGFwb3N0cm9waGUkc2luZ2xlX3F1b3RlJGxwYXJlbiRvcGVuX3BhcmVuJG9wZW5fcGFyZW50aGVzaXMkcnBhcmVuJGNsb3NlX3BhcmVuJGNsb3NlX3BhcmVudGhlc2lzJGFzdGVyaXNrJHBsdXMkY29tbWEkbWludXMkZGFzaCRkb3QkZnVsbHN0b3Akc2xhc2gkc29saWR1cyRkaXZpc2lvbiRjb2xvbiRzZW1pY29sb24kbHQkbGVzc190aGFuJGxhbmdsZSRvcGVuX2FuZ2xlJGVxdWFsJGd0JGdyZWF0ZXJfdGhhbiRyYW5nbGUkY2xvc2VfYW5nbGUkcXVlc3Rpb24kYXQkbGJyYWNrZXQkb3Blbl9icmFja2V0JGJhY2tzbGFzaCRyYnJhY2tldCRjbG9zZV9icmFja2V0JGNpcmN1bWZsZXgkY2FyZXQkaGF0JHVuZGVyc2NvcmUkdW5kZXJsaW5lJGJhY2txdW90ZSRncmF2ZSRsYnJhY2Ukb3Blbl9icmFjZSRwaXBlJGJhciRyYnJhY2UkY2xvc2VfYnJhY2UkdGlsZGVwYWNrYWdlX2NvbmZpZy51dGlsX3ZhbGlkUGFja2FnZU5hbWVDaGFyYWN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISAgJCAmJygpKissLS4gMDEyMzQ1Njc4OSA7ID0gIEBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiAgICBfIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6ICAgfiBfZmluZEludmFsaWRDaGFyYWN0ZXJub25Eb3ROb3QgYSBwYWNrYWdlOiBVUklQYWNrYWdlIFVSSXMgbXVzdCBub3QgaGF2ZSBhIGhvc3QgcGFydFBhY2thZ2UgVVJJcyBtdXN0IG5vdCBoYXZlIGEgcXVlcnkgcGFydFBhY2thZ2UgVVJJcyBtdXN0IG5vdCBoYXZlIGEgZnJhZ21lbnQgcGFydFBhY2thZ2UgVVJJcyBtdXN0IG5vdCBzdGFydCB3aXRoIGEgJy8nZmlyc3RTbGFzaFBhY2thZ2UgVVJJcyBtdXN0IHN0YXJ0IHdpdGggdGhlIHBhY2thZ2UgbmFtZSBmb2xsb3dlZCBieSBhICcvJ2JhZEluZGV4UGFja2FnZSBuYW1lcyBtdXMgYmUgbm9uLWVtcHR5UGFja2FnZSBuYW1lcyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIG5vbi0nLicgY2hhcmFjdGVyYmFkQ2hhckNvZGViYWRDaGFyUGFja2FnZSBuYW1lcyBtdXN0IG5vdCBjb250YWluIGZhc3RhLnNjYW5uZXIuc3RyaW5nX2Nhbm9uaWNhbGl6ZXJwYXlsb2FkU3RyaW5nQ2Fub25pY2FsaXplck1BU0tJTklUSUFMX1NJWkVfc2l6ZV9jb3VudF9ub2Rlc2hhc2hCeXRlc2hhc2hTdHJpbmdyZWhhc2huZXdTaXplbmV3Tm9kZXNTeW50YWN0aWNFbnRpdHlTdHJpbmdVdGlsaXRpZXNJTlRFUk5FUmludGVybmZhc3RhLmtlcm5lbF9idWlsZGVyZmFzdGFJbXBsaWNpdEZpZWxkVHlwZUtlcm5lbEVudW1CdWlsZGVyS2VybmVsRm9ybWFsUGFyYW1ldGVyQnVpbGRlcktlcm5lbEZ1bmN0aW9uVHlwZUJ1aWxkZXJLZXJuZWxJbnZhbGlkVHlwZUJ1aWxkZXJLZXJuZWxNaXhpbkFwcGxpY2F0aW9uQnVpbGRlcktlcm5lbFByZWZpeEJ1aWxkZXJLZXJuZWxDb25zdHJ1Y3RvckJ1aWxkZXJLZXJuZWxGdW5jdGlvbkJ1aWxkZXJLZXJuZWxSZWRpcmVjdGluZ0ZhY3RvcnlCdWlsZGVyS2VybmVsVHlwZUFsaWFzQnVpbGRlcktlcm5lbFR5cGVCdWlsZGVyS2VybmVsVHlwZVZhcmlhYmxlQnVpbGRlcktlcm5lbFZhcmlhYmxlQnVpbGRlckxvYWRMaWJyYXJ5QnVpbGRlclVubGlua2VkRGVjbGFyYXRpb25jb21wYXJlUHJvY2VkdXJlc2lzUmVkaXJlY3RpbmdHZW5lcmF0aXZlQ29uc3RydWN0b3JJbXBsZW1lbnRhdGlvbnRvS2VybmVsQ29tYmluYXRvcnNmYXN0YUNvbWJpbmF0b3JzbmFtZUxpc3RmYXN0YS50YXJnZXRfaW1wbGVtZW50YXRpb25yZXdyaXRlU2V2ZXJpdHljYWNoZWRBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yY2FjaGVkQ29tcGlsZVRpbWVFcnJvcmNhY2hlZER1cGxpY2F0ZWRGaWVsZEluaXRpYWxpemVyRXJyb3JjYWNoZWRGYWxsVGhyb3VnaEVycm9yY2FjaGVkTmF0aXZlQW5ub3RhdGlvbmNhY2hlZE5hdGl2ZUV4dGVuc2lvbkFubm90YXRpb25lbmFibGVDb250cm9sRmxvd0NvbGxlY3Rpb25zZW5hYmxlU2V0TGl0ZXJhbHNlbmFibGVTcHJlYWRDb2xsZWN0aW9uc2dldENvbnN0cnVjdG9yQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25FcnJvcl9Db21waWxlVGltZUVycm9yYnlwYXNzTGlicmFyeVByaXZhY3lfRHVwbGljYXRlZEZpZWxkSW5pdGlhbGl6ZXJFcnJvckV4dGVybmFsTmFtZW1lc3NhZ2VDb250ZXh0cHJvY2Vzc2VkT3B0aW9uc2Zhc3RhLmRpbGxfbGlicmFyeV9idWlsZGVyRHluYW1pY1R5cGVCdWlsZGVyU2NvcGVEaWxsQ2xhc3NCdWlsZGVyRGlsbFR5cGVBbGlhc0J1aWxkZXJ1bnNlcmlhbGl6YWJsZUV4cG9ydHNhZGRTeW50aGV0aWNEZWNsYXJhdGlvbk9mRHluYW1pY2FkZEJ1aWxkZXJjbGFzc0J1bGRlcl9leHBvcnRzI2FkZFNldHRlcmV4cG9ydFNjb3BlQnVpbGRlcmFkZFRvU2NvcGVjb21wdXRlQW1iaWd1b3VzRGVjbGFyYXRpb25mdWxsTmFtZUZvckVycm9yczxsaWJyYXJ5ICcnPm1lc3NhZ2VUZXh0Tm8gYnVpbGRlciBmb3IgJ0V4cG9ydGVkIGVsZW1lbnQgJycgbm90IGZvdW5kIGluICdmYXN0YS5kaWxsX2xvYWRlclR5cGVCdWlsZGVyQ29tcHV0ZXJjb21wb25lbnRMaWJyYXJpZXNyZXF1ZXN0ZWRMaWJyYXJpZXNidWlsZGVyLmxpYnJhcnlrZXJuZWxMaWJyYXJ5a2VybmVsLmNsb25lc3dpdGNoQ2FzZXNjbG9uZUFubm90YXRpb25zX2FjdGl2ZUZpbGVVcmllbnN1cmVNdXRhYmxlQ2xvbmluZyBvZiBsaWJyYXJpZXMgaXMgbm90IGltcGxlbWVudGVkQ2xvbmluZyBvZiBjbGFzc2VzIGlzIG5vdCBpbXBsZW1lbnRlZF9jbG9uZUZpbGVPZmZzZXRhY3RpdmVGaWxlVXJpU2F2ZWRjbG9uZU9wdGlvbmFsdmlzaXRPcHRpb25hbFR5cGVuZXdWYXJpYWJsZXN3aXRjaENhc2VuZXdFeGNlcHRpb25uZXdTdGFja1RyYWNlY2xvbmVGdW5jdGlvbk5vZGVCb2R5c2F2ZWRDbG9uZUFubm90YXRpb25zVW5pbXBsZW1lbnRlZCBjbG9uZSBmb3IgS2VybmVsIGV4cHJlc3Npb246IFVuaW1wbGVtZW50ZWQgY2xvbmUgZm9yIEtlcm5lbCBpbml0aWFsaXplcjogVW5pbXBsZW1lbnRlZCBjbG9uZSBmb3IgS2VybmVsIG1lbWJlcjogVW5pbXBsZW1lbnRlZCBjbG9uZSBmb3IgS2VybmVsIHN0YXRlbWVudDogQ2xvbmluZyBLZXJuZWwgbm9uLW1lbWJlcnMgaXMgbm90IHN1cHBvcnRlZC4gIFRyaWVkIGNsb25pbmcgQ2xvbmVXaXRob3V0Qm9keWZhc3RhLmRpbGxfbWVtYmVyX2J1aWxkZXJNZW1iZXJCdWlsZGVyYWJzdHJhY3RNYXNrY29uc3RNYXNrZXh0ZXJuYWxNYXNrZmluYWxNYXNrc3RhdGljTWFza21vZGlmaWVyc2RlYnVnTmFtZWlzUmVndWxhck1ldGhvZGlzUmVkaXJlY3RpbmdHZW5lcmF0aXZlQ29uc3RydWN0b3Jjb21wdXRlTW9kaWZpZXJzbW9kaWZpZXJmYXN0YS5zY29wZU5hbWVJdGVyYXRvclR5cGVWYXJpYWJsZUJ1aWxkZXJNdXRhYmxlU2NvcGVjbGFzc05hbWVPckRlYnVnTmFtZVNjb3BlKGlzTW9kaWZpYWJsZWZvcndhcmREZWNsYXJlZExhYmVsc3RvcGltbXV0YWJsZW5lc3RlZG5hbWVJdGVyYXRvcmNvcHlXaXRoUGFyZW50bG9jYWw9c2V0dGVycz1wYXJlbnQ9YmVjb21lUGFydE9md2l0aFR5cGVWYXJpYWJsZXN0eXBlVmFyaWFibGVzbmV3U2NvcGV0eXBlIHZhcmlhYmxlc2NyZWF0ZU5lc3RlZExhYmVsU2NvcGVyZWNvcmRVc2Vsb29rdXBJbmlzSW5zdGFuY2VTY29wZWhhc1Byb2JsZW1sb29rdXBTZXR0ZXJoYXNMb2NhbExhYmVsZGVjbGFyZUxhYmVsZm9yd2FyZERlY2xhcmVMYWJlbGNsYWltTGFiZWx1bmNsYWltZWRGb3J3YXJkRGVjbGFyYXRpb25zbG9va3VwTGFiZWxtZXJnZW1lcmdlTWVtYmVybmVzdGluZ0xldmVsd3JpdGVPbmluZGVudGNvbXB1dGVNaXhpblNjb3BlbmVlZHNDb3B5U2NvcGVCdWlsZGVyUHJvYmxlbUJ1aWxkZXJBY2Nlc3NFcnJvckJ1aWxkZXJpc1R5cGVEZWNsYXJhdGlvbmlzTG9jYWxTY29wZUxvY2FsRGVjbGFyYXRpb25JdGVyYXRvclNjb3BlTG9jYWxEZWNsYXJhdGlvbk5hbWVJdGVyYXRvcmxvY2FsTmFtZXNzZXR0ZXJOYW1lc2Zhc3RhLnNvdXJjZV9jbGFzc19idWlsZGVyQ29uc3RydWN0b3JSZWZlcmVuY2VCdWlsZGVyTWV0YWRhdGFCdWlsZGVyU2hhZG93Q2xhc3NhY3R1YWxDbHNjb25zdHJ1Y3RvclJlZmVyZW5jZXNzdGFydENoYXJPZmZzZXRjaGFyRW5kT2Zmc2V0YnVpbGRCdWlsZGVyc2J1aWxkU3VwZXJ0eXBlY29uc3RydWN0b3JTY29wZUJ1aWxkZXJtZW1iZXJCdWlsZGVycHJlcGFyZVRvcExldmVsSW5mZXJlbmNlc2V0dXBBcGlNZW1iZXJzaW50ZXJmYWNlUmVzb2x2ZXJmaW5pc2hQYXRjaGNvbXB1dGVEaXJlY3RTdXBlcnR5cGVzaW5pdGlhbGl6ZUNsYXNzZmFzdGEuc291cmNlX2xvYWRlckluc3RydW1lbnRhdGlvbkV4cG9ydEltcG9ydFNoYWRvd1R5cGVJbmZlcmVuY2VFbmdpbmVFbnVtQnVpbGRlckJvZHlCdWlsZGVyQ29sbGVjdGlvblRyYW5zZm9ybWVyU2V0TGl0ZXJhbFRyYW5zZm9ybWVyQ2xhc3NNZW1iZXJQYXJzZXJQYXJzZXJsZW5ndGhGb3JUb2tlbm9mZnNldEZvclRva2VuSW50ZXJmYWNlUmVzb2x2ZXJEaWV0TGlzdGVuZXJEaWV0UGFyc2VyT3V0bGluZUJ1aWxkZXJmdXR1cmVPZkJvdHRvbWl0ZXJhYmxlT2ZCb3R0b21zdHJlYW1PZkJvdHRvbXR5cGVJbmZlcmVuY2VFbmdpbmVpbnN0cnVtZW50YXRpb25jb2xsZWN0aW9uVHJhbnNmb3JtZXJzZXRMaXRlcmFsVHJhbnNmb3JtZXJzdXBwcmVzc0xleGljYWxFcnJvcnNhZGRQcm9ibGVtQXRBY2Nlc3NvcnNzeW50aGVzaXplU291cmNlRm9yTWlzc2luZ0ZpbGVoYXNTY2hlbWV6ZXJvVGVybWluYXRlZEJ5dGVzcmF3Qnl0ZXNnZXRTb3VyY2VuZXdQYXRoU2VnbWVudHMtcGF0Y2gvKiBvZmZzZXRJbkJ5dGVzbGlzdGVuZXJwYXJzZVVuaXRjcmVhdGVEaWV0TGlzdGVuZXJwYXJzZXJwYXJ0T2ZMaWJyYXJ5cGFydERpcmVjdGl2ZUluZGV4ZGlldExpc3RlbmVyZGVidWdFeHByZXNzaW9uIGluIGRlYnVnRXhwcmNyZWF0ZUxpc3RlbmVycGFyc2VTaW5nbGVFeHByZXNzaW9udXNlZFBhcnRzaW5jbHVkZVBhcnRzdmFsaWRhdGVQYXJ0UmVzb2x2ZWQgcGFydHNhcHBseVBhdGNoZXNBcHBsaWVkIHBhdGNoZXNleHBvcnRlcnNleHBvcnRlZXNzb3VyY2VMaWJyYXJ5YnVpbGRJbml0aWFsU2NvcGVzZXhwb3J0ZXJib3RoZXhwb3J0ZWRhZGRUb0V4cG9ydFNjb3Bld2FzQ2hhbmdlZGV4cG9ydGVlQ29tcHV0ZWQgbGlicmFyeSBzY29wZXNkZWJ1Z1ByaW50RXhwb3J0c2V4cG9ydHMgZXhwb3J0cyB0eXBlQ291bnQgdHlwZXNmb3JtYWxDb3VudEZpbmFsaXplZCAgaW5pdGlhbGl6aW5nIGZvcm1hbHNGaW5pc2hlZCBkZWZlcnJlZCBsb2FkIHRlYXJvZmZzIGZpbmlzaEZvcndhcmRlcnNGaW5pc2hlZCBmb3J3YXJkZXJzIGZvciAgcHJvY2VkdXJlcyBjb25zdHJ1Y3RvcnMgdHlwZS12YXJpYWJsZSBib3VuZHNDb21wdXRlZCBkZWZhdWx0IHR5cGVzIGZvciAgdHlwZSB2YXJpYWJsZXNGaW5pc2hlZCAgbmF0aXZlIG1ldGhvZHMgcGF0Y2ggbWV0aG9kc2NoZWNrT2JqZWN0Q2xhc3NIaWVyYXJjaHloYW5kbGVIaWVyYXJjaHlDeWNsZXNibGFja0xpc3RlZENsYXNzZXN0b3BvbG9naWNhbGx5U29ydGVkQ2xhc3Nlc3ByZXZpb3VzV29ya0xpc3RkaXJlY3RTdXBlcnR5cGVzYWxsU3VwZXJ0eXBlc1Byb2Nlc3NlZGNoZWNrQ2xhc3NTdXBlcnR5cGVzY2xhc3Nlc1dpdGhDeWNsZXNDaGVja2VkIGNsYXNzIGhpZXJhcmNoeWlzQ2xhc3NCdWlsZGVyY29uc3RydWN0b3J5bmFtZVRvRXhwb3J0c2Vycm9yRXhwb3J0c25hbWVUb0ltcG9ydHNlcnJvckltcG9ydHNDaGVja2VkIGltcG9ydHMgYW5kIGV4cG9ydHMgZm9yIGR1cGxpY2F0ZSBuYW1lc0J1aWx0IGNvbXBvbmVudGNvbXB1dGVGdWxsQ29tcG9uZW50YW1iaWd1b3VzVHlwZXNSZWNvcmRzcmVjb3JkaGFuZGxlQW1iaWd1b3VzU3VwZXJ0eXBlc0NvbXB1dGVkIGNsYXNzIGhpZXJhcmNoeWlnbm9yZUFtYmlndW91c1N1cGVydHlwZXNDb21wdXRlZCBjb3JlIHR5cGVzc291cmNlQ2xhc3Nlc0NoZWNrZWQgc3VwZXJ0eXBlc2NoZWNrQm91bmRzSW5PdXRsaW5ldHlwZVNjaGVtYUVudmlyb25tZW50Q2hlY2tlZCB0eXBlIGFyZ3VtZW50cyBvZiBzdXBlcnMgYWdhaW5zdCB0aGUgYm91bmRzQ2hlY2tlZCBvdmVycmlkZXNDaGVja2VkIGFic3RyYWN0IG1lbWJlcnNDaGVja2VkIHJlZGlyZWN0aW5nIGZhY3Rvcmllc2NoYW5nZWRDbGFzc2VzQWRkZWQgbm9TdWNoTWV0aG9kIGZvcndhcmRlcnNjaGVja01peGluRGVjbGFyYXRpb25jaGVja01peGluQXBwbGljYXRpb25DaGVja2VkIG1peGluIGRlY2xhcmF0aW9uIGFwcGxpY2F0aW9uc0J1aWx0IGNsYXNzIGhpZXJhcmNoeXByZXBhcmVUb3BMZXZlbGlzVHlwZUluZmVyZW5jZVByZXBhcmVkUHJlcGFyZWQgdG9wIGxldmVsIGluZmVyZW5jZWZpbmlzaFRvcExldmVsRmllbGRzbWVtYmVyQ291bnRmaW5hbGl6ZUNvdmFyaWFuY2VuZXdNZW1iZXJDb3VudGZpbmlzaFRvcExldmVsSW5pdGlhbGl6aW5nRm9ybWFsc1BlcmZvcm1lZCB0b3AgbGV2ZWwgaW5mZXJlbmNldHJhbnNmb3JtUG9zdEluZmVyZW5jZXRyYW5zZm9ybVNldExpdGVyYWxzdHJhbnNmb3JtQ29sbGVjdGlvbnN0cmFuc2Zvcm1Db25zdHRyYW5zZm9ybUxpc3RQb3N0SW5mZXJlbmNldHJhbnNmb3JtZXJkZWZhdWx0RGFydENvcmVTb3VyY2VpbXBvcnQgJ2RhcnQ6X2ludGVybmFsJzsKaW1wb3J0ICdkYXJ0OmFzeW5jJzsKCmV4cG9ydCAnZGFydDphc3luYycgc2hvdyBGdXR1cmUsIFN0cmVhbTsKCnByaW50KG9iamVjdCkge30KCmNsYXNzIEl0ZXJhdG9yIHt9CgpjbGFzcyBJdGVyYWJsZSB7fQoKY2xhc3MgTGlzdCBleHRlbmRzIEl0ZXJhYmxlIHsKICBmYWN0b3J5IExpc3QudW5tb2RpZmlhYmxlKGVsZW1lbnRzKSA9PiBudWxsOwp9CgpjbGFzcyBNYXAgZXh0ZW5kcyBJdGVyYWJsZSB7CiAgZmFjdG9yeSBNYXAudW5tb2RpZmlhYmxlKG90aGVyKSA9PiBudWxsOwp9CgpjbGFzcyBOb1N1Y2hNZXRob2RFcnJvciB7CiAgTm9TdWNoTWV0aG9kRXJyb3Iud2l0aEludm9jYXRpb24ocmVjZWl2ZXIsIGludm9jYXRpb24pOwp9CgpjbGFzcyBOdWxsIHt9CgpjbGFzcyBPYmplY3QgewogIG5vU3VjaE1ldGhvZChpbnZvY2F0aW9uKSA9PiBudWxsOwp9CgpjbGFzcyBTdHJpbmcge30KCmNsYXNzIFN5bWJvbCB7fQoKY2xhc3MgVHlwZSB7fQoKY2xhc3MgX0ludm9jYXRpb25NaXJyb3IgewogIF9JbnZvY2F0aW9uTWlycm9yLl93aXRoVHlwZShfbWVtYmVyTmFtZSwgX3R5cGUsIF90eXBlQXJndW1lbnRzLAogICAgICBfcG9zaXRpb25hbEFyZ3VtZW50cywgX25hbWVkQXJndW1lbnRzKTsKfQoKY2xhc3MgYm9vbCB7fQoKY2xhc3MgZG91YmxlIGV4dGVuZHMgbnVtIHt9CgpjbGFzcyBpbnQgZXh0ZW5kcyBudW0ge30KCmNsYXNzIG51bSB7fQoKY2xhc3MgX1N5bmNJdGVyYWJsZSB7fQoKY2xhc3MgX1N5bmNJdGVyYXRvciB7CiAgdmFyIF9jdXJyZW50OwogIHZhciBfeWllbGRFYWNoSXRlcmFibGU7Cn0KCmNsYXNzIEZ1bmN0aW9uIHt9CmRlZmF1bHREYXJ0QXN5bmNTb3VyY2VfYXN5bmNFcnJvcldyYXBwZXJIZWxwZXIoY29udGludWF0aW9uKSB7fQoKX2FzeW5jU3RhY2tUcmFjZUhlbHBlcihhc3luY19vcCkge30KCl9hc3luY1RoZW5XcmFwcGVySGVscGVyKGNvbnRpbnVhdGlvbikge30KCl9hd2FpdEhlbHBlcihvYmplY3QsIHRoZW5DYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgYXdhaXRlcikge30KCl9jb21wbGV0ZU9uQXN5bmNSZXR1cm4oY29tcGxldGVyLCB2YWx1ZSkge30KCmNsYXNzIF9Bc3luY1N0YXJTdHJlYW1Db250cm9sbGVyIHsKICBhZGQoZXZlbnQpIHt9CgogIGFkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKSB7fQoKICBhZGRTdHJlYW0oc3RyZWFtKSB7fQoKICBjbG9zZSgpIHt9CgogIGdldCBzdHJlYW0gPT4gbnVsbDsKfQoKY2xhc3MgQ29tcGxldGVyIHsKICBmYWN0b3J5IENvbXBsZXRlci5zeW5jKCkgPT4gbnVsbDsKCiAgZ2V0IGZ1dHVyZTsKCiAgY29tcGxldGUoW3ZhbHVlXSk7CgogIGNvbXBsZXRlRXJyb3IoZXJyb3IsIFtzdGFja1RyYWNlXSk7Cn0KCmNsYXNzIEZ1dHVyZSB7CiAgZmFjdG9yeSBGdXR1cmUubWljcm90YXNrKGNvbXB1dGF0aW9uKSA9PiBudWxsOwp9CgpjbGFzcyBGdXR1cmVPciB7Cn0KCmNsYXNzIF9Bc3luY0F3YWl0Q29tcGxldGVyIGltcGxlbWVudHMgQ29tcGxldGVyIHsKICBnZXQgZnV0dXJlID0+IG51bGw7CgogIGNvbXBsZXRlKFt2YWx1ZV0pIHt9CgogIGNvbXBsZXRlRXJyb3IoZXJyb3IsIFtzdGFja1RyYWNlXSkge30KfQoKY2xhc3MgU3RyZWFtIHt9CgpjbGFzcyBfU3RyZWFtSXRlcmF0b3IgewogIGdldCBjdXJyZW50ID0+IG51bGw7CgogIG1vdmVOZXh0KCkge30KCiAgY2FuY2VsKCkge30KfQpmYXN0YS5jb25zdGFudF9ldmFsdWF0b3JGb3JFbGVtZW50Rm9ySW5FbGVtZW50SWZFbGVtZW50Rm9yTWFwRW50cnlGb3JJbk1hcEVudHJ5SWZNYXBFbnRyeVNwcmVhZE1hcEVudHJ5SmF2YVNjcmlwdEludENvbnN0YW50YmlnSW50VmFsdWVmcm9tRG91YmxlZnJvbUJpZ0ludHRvRG91YmxlZnJvbVVJbnQ2NHRvVW5zaWduZWRDb25zdGFudHNUcmFuc2Zvcm1lcmNvbnN0YW50RXZhbHVhdG9ya2VlcEZpZWxkc2tlZXBWYXJpYWJsZXNldmFsdWF0ZUFubm90YXRpb25zZXJyb3JSZXBvcnRlcmNvbnZlcnRMaWJyYXJ5dHJhbnNmb3JtQW5ub3RhdGlvbnN3aXRoTmV3RW52aXJvbm1lbnR0cmFuc2Zvcm1FeHByZXNzaW9uc2V2YWx1YXRlQW5kVHJhbnNmb3JtV2l0aENvbnRleHRwb3NpdGlvbmFsUGFyYW1ldGVyQ291bnRldmFsdWF0ZVdpdGhDb250ZXh0YWRkVmFyaWFibGVWYWx1ZW1ha2VDb25zdGFudEV4cHJlc3Npb250cmVlQ29udGV4dHJ1bkluc2lkZUNvbnRleHRDb25zdGFudEV2YWx1YXRvcnVubW9kaWZpYWJsZVNldE1hcGlzSW5zdGFudGlhdGVkY2Fub25pY2FsaXphdGlvbkNhY2hlbm9kZUNhY2hlcHJpbWl0aXZlRXF1YWxDYWNoZW51bGxDb25zdGFudHRydWVDb25zdGFudGZhbHNlQ29uc3RhbnRjb250ZXh0Q2hhaW5pbnN0YW5jZUJ1aWxkZXJyZXBsYWNlbWVudE5vZGVzbG93ZXJlZHNlZW5VbmV2YWx1YXRlZENoaWxkbGF6eURlcHRocHVibGljSWRlbnRpZmllclJlZ0V4cF5bYS16QS1aJF1bYS16QS1aMC05XyRdKiRub25Vc2FibGVLZXl3b3Jkc19Vbm1vZGlmaWFibGVTZXRfbWFwc2hvdWxkQmVVbmV2YWx1YXRlZHRhcmdldGluZ0phdmFTY3JpcHRnZXRGaWxlT2Zmc2V0X2V2YWx1YXRlU3ViZXhwcmVzc2lvbmNvbnRleHRNZXNzYWdlc2ludmFsaWRyZXBvcnRJbnZhbGlkRXhwcmVzc2lvbnJlcG9ydEludmFsaWR1bmV2YWx1YXRlZGV4dHJhY3RlbnRlckxhenlsZWF2ZUxhenl1bmxvd2Vyd2FzVW5ldmFsdWF0ZWRmdW5wdXNoQ29udGV4dHBvcENvbnRleHRydW5JbnNpZGVDb250ZXh0SWZOb0NvbnRleHRjb250ZXh0Tm9kZUNvbnN0YW50IGV2YWx1YXRpb24gaGFzIG5vIHN1cHBvcnQgZm9yIG1ha2VCb29sQ29uc3RhbnRtYWtlRG91YmxlQ29uc3RhbnRldmFsdWF0ZURhcnRUeXBlaXNGaW5pdGV0cnVuY2F0ZVRvRG91YmxlYWRkVG9MaXN0T3JTZXRDb25zdGFudHNlZW5pc1NldHNwcmVhZGlzTnVsbEF3YXJldGVtcGxpc3RPclNldGhhc1ByaW1pdGl2ZUVxdWFsZW5zdXJlSXNTdWJ0eXBlbWFrZUxpc3RDb25zdGFudEZyb21QYXJ0c05vbi1jb25zdGFudCBpbiBjb25zdGFudCBsaXN0bWFrZVNldENvbnN0YW50RnJvbVBhcnRzbWFwRW50cmllc05vbi1jb25zdGFudCBpbiBjb25zdGFudCBzZXRzZXRfYWRkVG9NYXBDb25zdGFudHNlZW5LZXlzbWFrZU1hcENvbnN0YW50RnJvbVBhcnRzTm9uLWNvbnN0YW50IGluIGNvbnN0YW50IG1hcGtsYXNzaXNTeW1ib2xOb24tY29uc3QgY29uc3RydWN0b3IgaW52b2NhdGlvbi5Db25zdHJ1Y3RvciAiIiBoYXMgbm9uLXRyaXZpYWwgYm9keSAiIGJlbG9uZ3MgdG8gYWJzdHJhY3QgY2xhc3MgInBvc2l0aW9uYWxzZXZhbHVhdGVQb3NpdGlvbmFsQXJndW1lbnRzZXZhbHVhdGVOYW1lZEFyZ3VtZW50c2lzVW5hdmFpbGFibGV1bmV2YWx1YXRlZEFyZ3VtZW50c25hbWVWYWx1ZWlzVmFsaWRTeW1ib2xOYW1lZXZhbHVhdGVUeXBlQXJndW1lbnRzd2l0aE5ld0luc3RhbmNlQnVpbGRlcmhhbmRsZUNvbnN0cnVjdG9ySW52b2NhdGlvbmJ1aWxkVW5ldmFsdWF0ZWRJbnN0YW5jZWJ1aWxkSW5zdGFuY2VjaGVja0Fzc2VydHNldEZpZWxkVmFsdWVvcGVyYXRvck5hbWVzaXNWYWxpZFB1YmxpY0lkZW50aWZpZXJoYXNNYXRjaHBvc2l0aW9uYWxBcmd1bWVudHNuYW1lZEFyZ3VtZW50c2FkZFR5cGVQYXJhbWV0ZXJWYWx1ZWluaXRldmFsdWF0ZVN1cGVyVHlwZUFyZ3VtZW50c05vIHN1cHBvcnQgZm9yIGhhbmRsaW5nIGluaXRpYWxpemVyIG9mIHR5cGUgaXNaZXJvb3ByZWNlaXZlclZhbHVlb3RoZXJWYWx1ZXRvSW50ZXZhbHVhdGVCaW5hcnlCaXRPcGVyYXRpb25uZWdhdGl2ZWlzTmVnYXRpdmVldmFsdWF0ZUJpbmFyeVNoaWZ0T3BlcmF0aW9ubmVnYXRpdmVSZWNlaXZlcmV2YWx1YXRlQmluYXJ5TnVtZXJpY09wZXJhdGlvbkluc3RhbmNlIGZpZWxkIGFjY2VzcyBvdXRzaWRlIGNvbnN0cnVjdG9yQ291bGQgbm90IGV2YWx1YXRlIGZpZWxkIGdldCAgb24gaW5jb21wbGV0ZSBpbnN0YW5jZWxvb2t1cFZhcmlhYmxlVmFyaWFibGUgZ2V0IG9mIGEgbm9uLWNvbnN0IHZhcmlhYmxlLk5vIHN1cHBvcnQgZm9yICBpbiBhIHN0YXRpYy1nZXQuY29uY2F0ZW5hdGVkYm9vbENvbnN0YW50aW50VmFsdWVpc1N1YnR5cGVsaWJyYXJ5T2ZldmFsdWF0ZURhcnRUeXBlc1RoZSBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMgc3VwcGxpZWQgaW4gdGhlIHBhcnRpYWwgaW5zdGFudGlhdGlvbiBkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzIG9mIHRoZSBPbmx5IHRlYXItb2ZmIGNvbnN0YW50cyBjYW4gYmUgcGFydGlhbGx5IGluc3RhbnRpYXRlZC5jbGFzc0hhc1ByaW1pdGl2ZUVxdWFsY2FjaGVkY29uc3RhbnRUeXBlc3Vic2l0dXRlVHlwZXBhaXJwb3NpdGlvbmFsQXJnc25hbWVkQXJnc29sZEVudnNpZ25CaXQyMTQ3NDgzNjQ4dG9TaWduZWRVbmV4cGVjdGVkIGJpbmFyeSBudW1lcmljIG9wZXJhdGlvbiAnSW5zdGFuY2VCdWlsZGVyZXZhbHVhdG9yRXZhbHVhdGlvbkVudmlyb25tZW50X3R5cGVWYXJpYWJsZXNfdmFyaWFibGVzbG9va3VwUGFyYW1ldGVyVmFsdWVfQWJvcnREdWVUb0Vycm9yX0Fib3J0RHVlVG9JbnZhbGlkRXhwcmVzc2lvbkVycm9yUmVwb3J0ZXJTaW1wbGVFcnJvclJlcG9ydGVyX3JlcG9ydCBDb25zdGFudCBldmFsdWF0aW9uIGVycm9yOiBJc0luc3RhbnRpYXRlZFZpc2l0b3JfYXZhaWxhYmxlVmFyaWFibGVzQSB2aXNpdG9yIG1ldGhvZCBzZWVtcyB0byBiZSB1bmltcGxlbWVudGVkIXRyYW5zZm9ybUNvbXBvbmVudGNvbnN0YW50c1RyYW5zZm9ybWVyX2lzRm9ybWFsUGFyYW1ldGVyZmFzdGEua2VybmVsX2NvbnN0YW50c3NldENvbnN0cnVjdG9yTmFtZU9mZnNldHNldERvY3VtZW50YXRpb25Db21tZW50cHJlZGljYXRlZXhjbHVkZVVyaVRvU291cmNlbGlicmFyaWVzVG9Xcml0ZWtlcm5lbC5jaGVja3NWZXJpZmljYXRpb25FcnJvcjogVmVyaWZpY2F0aW9uIGVycm9yOlZlcmlmaWNhdGlvbiBlcnJvcjogQ29udGV4dDogJycuCk5vZGU6ICdUeXBlZGVmU3RhdGVEb25lVHlwZWRlZlN0YXRlLkRvbmVCZWluZ0NoZWNrZWRUeXBlZGVmU3RhdGUuQmVpbmdDaGVja2VkdHlwZVBhcmFtZXRlcnNJblNjb3BldHlwZWRlZlN0YXRlY2xhc3NUeXBlUGFyYW1ldGVyc0FyZUluU2NvcGVpbkNhdGNoQmxvY2tjdXJyZW50TWVtYmVyY3VycmVudFBhcmVudGNoZWNrZW50ZXJQYXJlbnRJbmNvcnJlY3QgcGFyZW50IHBvaW50ZXIgb24gIGV4cGVjdGVkICcnLCBidXQgZm91bmQ6ICdvbGRQYXJlbnRleGl0UGFyZW50ZW50ZXJMb2NhbFNjb3BlZXhpdExvY2FsU2NvcGV1bmRlY2xhcmVWYXJpYWJsZXZpc2l0V2l0aExvY2FsU2NvcGVkZWNsYXJlTWVtYmVyTWVtYmVyICcnIGhhcyBiZWVuIGRlY2xhcmVkIG1vcmUgdGhhbiBvbmNlLnVuZGVjbGFyZU1lbWJlcmRlY2xhcmVWYXJpYWJsZVZhcmlhYmxlICcnIGRlY2xhcmVkIG1vcmUgdGhhbiBvbmNlLmRlY2xhcmVUeXBlUGFyYW1ldGVyc01pc3NpbmcgYm91bmQgZm9yIHR5cGUgcGFyYW1ldGVyICdUeXBlIHBhcmFtZXRlciAnJyByZWRlY2xhcmVkLnVuZGVjbGFyZVR5cGVQYXJhbWV0ZXJzY2hlY2tWYXJpYWJsZUluU2NvcGUnIHVzZWQgb3V0IG9mIHNjb3BlLlR5cGVkZWYgJ2NoZWNrVHlwZWRlZicgcmVmZXJzIHRvIGl0c2VsZnNhdmVkVHlwZVBhcmFtZXRlcnNzYXZlZFBhcmVudFRoZSB0b3AtbGV2ZWwgZmllbGQgJycgc2hvdWxkIGJlIHN0YXRpY1RoZSBjb25zdCBmaWVsZCAnc2F2ZWRJbkNhdGNoQmxvY2tOYW1lZCBwYXJhbWV0ZXJzIGFyZSBub3Qgc29ydGVkIG9uIGZ1bmN0aW9uIHR5cGUgKFJldGhyb3cgbXVzdCBiZSBpbnNpZGUgYSBDYXRjaCBibG9jay5WYXJpYWJsZURlY2xhcmF0aW9uIG11c3QgYmUgYSBkaXJlY3QgY2hpbGQgb2YgYSBCbG9jaywgbm90IFN0YXRpY0dldCB3aXRob3V0IHRhcmdldC5TdGF0aWNHZXQgb2YgJycgd2l0aG91dCBnZXR0ZXIuJyB0aGF0J3MgYW4gaW5zdGFuY2UgbWVtYmVyLlN0YXRpY1NldCB3aXRob3V0IHRhcmdldC5TdGF0aWNTZXQgdG8gJycgd2l0aG91dCBzZXR0ZXIuY2hlY2tUYXJnZXRlZEludm9jYXRpb25TdGF0aWNJbnZvY2F0aW9uIG9mICdDb25zdGFudCBTdGF0aWNJbnZvY2F0aW9uIG9mICcnIHRoYXQgaXNuJ3QgYSBjb25zdCBleHRlcm5hbCBmYWN0b3J5LiB3aXRob3V0IHRhcmdldC4gd2l0aG91dCBmdW5jdGlvbi5hcmVBcmd1bWVudHNDb21wYXRpYmxlIHdpdGggaW5jb21wYXRpYmxlIGFyZ3VtZW50cyBmb3IgJ2V4cGVjdGVkVHlwZVBhcmFtZXRlcnMgd2l0aCB3cm9uZyBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMgZm9yICdEaXJlY3RQcm9wZXJ0eUdldCB3aXRob3V0IHRhcmdldC5EaXJlY3RQcm9wZXJ0eUdldCBvZiAnJyB0aGF0IGlzbid0IGFuIGluc3RhbmNlIG1lbWJlci5EaXJlY3RQcm9wZXJ0eVNldCB3aXRob3V0IHRhcmdldC5EaXJlY3RQcm9wZXJ0eVNldCBvZiAnJyB0aGF0IGlzIHN0YXRpYy5EaXJlY3RNZXRob2RJbnZvY2F0aW9uIHdpdGhvdXQgcmVjZWl2ZXIuQ29uc3RydWN0b3JJbnZvY2F0aW9uIG9mIGFic3RyYWN0IGNsYXNzLkNvbnN0YW50IENvbnN0cnVjdG9ySW52b2NhdGlvbiBmbyAnJyB0aGF0IGlzbid0IGNvbnN0Lk5vIHRhcmdldC5UYXJnZXQgaGFzIG5vIHBhcmVudC5Td2l0Y2ggY2FzZSBpc24ndCBjaGlsZCBvZiBwYXJlbnQuRGFuZ2xpbmcgcmVmZXJlbmNlIHRvICcnLCBwYXJlbnQgaXM6ICcnIHJlZmVyZW5jZWQgb3V0IG9mIHNjb3BlLCBwYXJlbnQgaXM6ICcnIHJlZmVyZW5jZWQgZnJvbSBzdGF0aWMgY29udGV4dCwgcGFyZW50IGlzOiAnVHlwZSAgcHJvdmlkZXMgIHR5cGUgYXJndW1lbnRzIGJ1dCB0aGUgY2xhc3MgZGVjbGFyZXMgcGFyYW1ldGVycy5UaGUgdHlwZWRlZiB0eXBlICB0eXBlIGFyZ3VtZW50cyBidXQgdGhlIHR5cGVkZWYgZGVjbGFyZXNDaGVja1BhcmVudFBvaW50ZXJzUGFyZW50IHBvaW50ZXIgb24gJ2lzICdidXQgc2hvdWxkIGJlICdjaGVja0luaXRpYWxpemVyc1R5cGVTY2hlbWFQcmludGVyX0lzS25vd25WaXNpdG9ycGFyYW1ldGVyVHlwZW5hbWVkUGFyYW1ldGVyVHlwZWlzS25vd25zY2hlbWF0eXBlU2NoZW1hVG9TdHJpbmdJbnN0cnVtZW50YXRpb25WYWx1ZUZvck1lbWJlckluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZUluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZUFyZ3NJbmZlcmVuY2VIZWxwZXJJbmNsdWRlc1R5cGVQYXJhbWV0ZXJzQ292YXJpYW50bHlJbmZlcmVuY2VOb2RlVHlwZUluZmVyZW5jZUVuZ2luZUV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHRUeXBlSW5mZXJyZXJUeXBlSW5mZXJyZXJJbXBsVHlwZVByb21vdGVyVHlwZVByb21vdGVySW1wbFR5cGVQcm9tb3Rpb25GYWN0VHlwZVByb21vdGlvblNjb3BlZ3JlYXRlc3RDbG9zdXJlVHlwZVNjaGVtYUVudmlyb25tZW50Z2V0UG9zaXRpb25hbFBhcmFtZXRlclR5cGVjb21iaW5lU3RhdGVtZW50c0NvbnRyb2xGbG93TWFwRW50cnljb252ZXJ0VG9FbGVtZW50SW1wbGljaXRUeXBlQXJndW1lbnRtYWtlTGV0aW5mZXJlbmNlX3Zpc2l0b3IuZGFydGluZmVycmVkX3R5cGVfdmlzaXRvci5kYXJ0Q2xhc3NJbmZlcmVuY2VJbmZvbmVlZHNDaGVja1Zpc2l0b3JnZXR0ZXJzQW5kTWV0aG9kc0FyZ3VtZW50c0p1ZGdtZW50X2hhc0V4cGxpY2l0VHlwZUFyZ3VtZW50c3Bvc2l0aW9uYWxKdWRnbWVudHNzZXROb25JbmZlcnJhYmxlQXJndW1lbnRUeXBlc3JlbW92ZU5vbkluZmVycmFibGVBcmd1bWVudFR5cGVzQXNzZXJ0SW5pdGlhbGl6ZXJKdWRnbWVudGp1ZGdtZW50YWNjZXB0SW5mZXJlbmNldmlzaXRBc3NlcnRJbml0aWFsaXplckp1ZGdtZW50QXNzZXJ0U3RhdGVtZW50SnVkZ21lbnRjb25kaXRpb25KdWRnbWVudG1lc3NhZ2VKdWRnbWVudHZpc2l0QXNzZXJ0U3RhdGVtZW50SnVkZ21lbnRCbG9ja0p1ZGdtZW50anVkZ21lbnRzdmlzaXRCbG9ja0p1ZGdtZW50Q2FzY2FkZUp1ZGdtZW50aW5mZXJyZWRUeXBlbmV4dENhc2NhZGV0YXJnZXRKdWRnbWVudGNhc2NhZGVKdWRnbWVudHNzZWN0aW9uZXh0ZW5kbmV3Q2FzY2FkZWZpbmFsaXpldHlwZUNvbnRleHR2aXNpdENhc2NhZGVKdWRnbWVudF9pbmZlcmVuY2VJbmZvY3JlYXRlQXBpTWVtYmVyc2NsZWFyQ2xhc3NJbmZlcmVuY2VJbmZvZ2V0Q2xhc3NJbmZlcmVuY2VJbmZvc2V0QnVpbGRlckNvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnRyaHNjb21iaW5lcm51bGxBd2FyZUNvbWJpbmVyaXNQb3N0SW5jRGVjaXNQcmVJbmNEZWNfZ2V0VG9TdHJpbmdQYXJ0c2Rlc3VnYXJlZGRlc3VnYXJlZD1yZWFkPXJocz13cml0ZT1jb21iaW5lcj1udWxsQXdhcmVDb21iaW5lcj1pc1Bvc3RJbmNEZWM9dHJ1ZWlzUHJlSW5jRGVjPXRydWVfaW5mZXJSaHNpbmZlcnJlcnJlYWRUeXBld3JpdGVDb250ZXh0aGVscGVyY29tYmluZXJNZW1iZXJjb21iaW5lZFR5cGVmaW5kTWV0aG9kSW52b2NhdGlvbk1lbWJlcmluc3RydW1lbnRlZGlzT3ZlcmxvYWRlZEFyaXRobWV0aWNPcGVyYXRvckFuZFR5cGVyaHNUeXBlY29tYmluZXJUeXBlZ2V0Q2FsbGVlRnVuY3Rpb25UeXBlZ2V0Q2FsbGVlVHlwZWluZmVyRXhwcmVzc2lvbmV4cGVjdGVkVHlwZWVuc3VyZUFzc2lnbmFibGVjaGVja0tpbmRwcmVDaGVja0ludm9jYXRpb25Db250cmF2YXJpYW5jZXJlcGxhY2VkQ29tYmluZXJoYW5kbGVJbnZvY2F0aW9uQ29udHJhdmFyaWFuY2VyZXBsYWNlZENvbWJpbmVyMl9zdG9yZUxldFR5cGVpc1ZvaWRBbGxvd2VkcmVwbGFjZWRSaHNlcXVhbHNJbnZvY2F0aW9uZ2V0U3RhbmRhcmRVcHBlckJvdW5kQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudFdpdGhSZWNlaXZlcnJlY2VpdmVyPWlzU3VwZXI9dHJ1ZV9pbmZlclJlY2VpdmVyY2xhc3NIaWVyYXJjaHlDb250aW51ZVN3aXRjaEp1ZGdtZW50dmlzaXRDb250aW51ZVN3aXRjaEp1ZGdtZW50RGVmZXJyZWRDaGVja0p1ZGdtZW50dmlzaXREZWZlcnJlZENoZWNrSnVkZ21lbnREb0p1ZGdtZW50dmlzaXREb0p1ZGdtZW50RG91YmxlSnVkZ21lbnR2aXNpdERvdWJsZUp1ZGdtZW50RXhwcmVzc2lvbkp1ZGdtZW50RW1wdHlTdGF0ZW1lbnRKdWRnbWVudHZpc2l0RW1wdHlTdGF0ZW1lbnRKdWRnbWVudEV4cHJlc3Npb25TdGF0ZW1lbnRKdWRnbWVudHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudEp1ZGdtZW50RmFjdG9yeUNvbnN0cnVjdG9ySW52b2NhdGlvbkp1ZGdtZW50YXJndW1lbnRKdWRnbWVudHN2aXNpdEZhY3RvcnlDb25zdHJ1Y3Rvckludm9jYXRpb25KdWRnbWVudFNoYWRvd0ZpZWxkaW5mZXJlbmNlTm9kZV90eXBlSW5mZXJyZXJfaXNJbXBsaWNpdGx5VHlwZWRzZXRJbmZlcnJlZFR5cGVlbmdpbmVpc0ltcGxpY2l0bHlUeXBlZHNldEluZmVyZW5jZU5vZGVTaGFkb3dGaWVsZEluaXRpYWxpemVydmlzaXRTaGFkb3dGaWVsZEluaXRpYWxpemVyRm9ySnVkZ21lbnR1cGRhdGVKdWRnbWVudHN2aXNpdEZvckp1ZGdtZW50RnVuY3Rpb25Ob2RlSnVkZ21lbnRGdW5jdGlvbkRlY2xhcmF0aW9uSnVkZ21lbnRfaGFzSW1wbGljaXRSZXR1cm5UeXBldmFyaWFibGVKdWRnbWVudGZ1bmN0aW9uSnVkZ21lbnR2aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb25KdWRnbWVudHNldEhhc0ltcGxpY2l0UmV0dXJuVHlwZWhhc0ltcGxpY2l0UmV0dXJuVHlwZUludmFsaWRTdXBlckluaXRpYWxpemVySnVkZ21lbnRhcmd1bWVudHNKdWRnbWVudHZpc2l0SW52YWxpZFN1cGVySW5pdGlhbGl6ZXJKdWRnbWVudElmTnVsbEp1ZGdtZW50bGVmdEp1ZGdtZW50cmlnaHRKdWRnbWVudHZpc2l0SWZOdWxsSnVkZ21lbnRJZkp1ZGdtZW50dmlzaXRJZkp1ZGdtZW50SWxsZWdhbEFzc2lnbm1lbnRKdWRnbWVudGFzc2lnbm1lbnRPZmZzZXR2aXNpdElsbGVnYWxBc3NpZ25tZW50SnVkZ21lbnRJbmRleEFzc2lnbm1lbnRKdWRnbWVudF9nZXRJbnZvY2F0aW9uQXJndW1lbnRzaW52b2NhdGlvbmluZGV4PXZpc2l0SW5kZXhBc3NpZ25tZW50SnVkZ21lbnRJbml0aWFsaXplckp1ZGdtZW50SW50SnVkZ21lbnRsaXRlcmFsYXNEb3VibGVuZWdhdGVkZG91YmxlVmFsdWV2aXNpdEludEp1ZGdtZW50U2hhZG93TGFyZ2VJbnRMaXRlcmFsaXNQYXJlbnRoZXNpemVkYXNJbnQ2NHZpc2l0U2hhZG93TGFyZ2VJbnRMaXRlcmFsU2hhZG93SW52YWxpZEluaXRpYWxpemVydmlzaXRTaGFkb3dJbnZhbGlkSW5pdGlhbGl6ZXJTaGFkb3dJbnZhbGlkRmllbGRJbml0aWFsaXplcnZpc2l0U2hhZG93SW52YWxpZEZpZWxkSW5pdGlhbGl6ZXJMaXN0TGl0ZXJhbEp1ZGdtZW50dmlzaXRMaXN0TGl0ZXJhbEp1ZGdtZW50U2V0TGl0ZXJhbEp1ZGdtZW50dmlzaXRTZXRMaXRlcmFsSnVkZ21lbnRNYXBMaXRlcmFsSnVkZ21lbnR2aXNpdE1hcExpdGVyYWxKdWRnbWVudFNoYWRvd01lbWJlck1ldGhvZEludm9jYXRpb25KdWRnbWVudF9pc0ltcGxpY2l0Q2FsbGlzSW1wbGljaXRDYWxsdmlzaXRNZXRob2RJbnZvY2F0aW9uSnVkZ21lbnROYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbkp1ZGdtZW50dmlzaXROYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbkp1ZGdtZW50TnVsbEF3YXJlTWV0aG9kSW52b2NhdGlvbkp1ZGdtZW50X2Rlc3VnYXJlZEludm9jYXRpb252aXNpdE51bGxBd2FyZU1ldGhvZEludm9jYXRpb25KdWRnbWVudE51bGxBd2FyZVByb3BlcnR5R2V0SnVkZ21lbnRfZGVzdWdhcmVkR2V0cmVjZWl2ZXJKdWRnbWVudHZpc2l0TnVsbEF3YXJlUHJvcGVydHlHZXRKdWRnbWVudFNoYWRvd1Byb2NlZHVyZW5vdCBhY2Nlc3NvclByb3BlcnR5QXNzaWdubWVudEp1ZGdtZW50bnVsbEF3YXJlR3VhcmRudWxsQXdhcmVHdWFyZD1faGFuZGxlV3JpdGVDb250cmF2YXJpYW5jZWZpbmRQcm9wZXJ0eVNldE1lbWJlcnZpc2l0UHJvcGVydHlBc3NpZ25tZW50SnVkZ21lbnRSZWRpcmVjdGluZ0luaXRpYWxpemVySnVkZ21lbnR2aXNpdFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXJKdWRnbWVudFJldHVybkp1ZGdtZW50cmV0dXJuS2V5d29yZExleGVtZXZpc2l0UmV0dXJuSnVkZ21lbnRTdGF0ZW1lbnRKdWRnbWVudFN0YXRpY0Fzc2lnbm1lbnRKdWRnbWVudHZpc2l0U3RhdGljQXNzaWdubWVudEp1ZGdtZW50U3VwZXJJbml0aWFsaXplckp1ZGdtZW50dmlzaXRTdXBlckluaXRpYWxpemVySnVkZ21lbnRTdXBlck1ldGhvZEludm9jYXRpb25KdWRnbWVudHZpc2l0U3VwZXJNZXRob2RJbnZvY2F0aW9uSnVkZ21lbnRTdXBlclByb3BlcnR5R2V0SnVkZ21lbnR2aXNpdFN1cGVyUHJvcGVydHlHZXRKdWRnbWVudFN3aXRjaENhc2VKdWRnbWVudGV4cHJlc3Npb25KdWRnbWVudHNTd2l0Y2hTdGF0ZW1lbnRKdWRnbWVudGV4cHJlc3Npb25KdWRnbWVudGNhc2VKdWRnbWVudHN2aXNpdFN3aXRjaFN0YXRlbWVudEp1ZGdtZW50U3ltYm9sTGl0ZXJhbEp1ZGdtZW50dmlzaXRTeW1ib2xMaXRlcmFsSnVkZ21lbnRJbnZhbGlkQ29uc3RydWN0b3JJbnZvY2F0aW9uSnVkZ21lbnR2aXNpdEludmFsaWRDb25zdHJ1Y3Rvckludm9jYXRpb25KdWRnbWVudEludmFsaWRXcml0ZUp1ZGdtZW50dmlzaXRJbnZhbGlkV3JpdGVKdWRnbWVudHZpc2l0U3ludGhldGljRXhwcmVzc2lvbkp1ZGdtZW50X3JlcGxhY2VXaXRoRGVzdWdhcmVkZGVzdWdhcmVkTGV0ZGVzdWdhcmVkQ29uZGl0aW9uYWxFeHByZXNzaW9uQ2F0Y2hKdWRnbWVudGV4Y2VwdGlvbkp1ZGdtZW50c3RhY2tUcmFjZUp1ZGdtZW50VHJ5Q2F0Y2hKdWRnbWVudGNhdGNoSnVkZ21lbnRzdmlzaXRUcnlDYXRjaEp1ZGdtZW50VHJ5RmluYWxseUp1ZGdtZW50dmlzaXRUcnlGaW5hbGx5SnVkZ21lbnRjcmVhdGVMb2NhbFR5cGVJbmZlcnJlcmNyZWF0ZVRvcExldmVsVHlwZUluZmVycmVyZ2V0RmllbGRUeXBlSW5mZXJyZXJTaGFkb3dUeXBlSW5mZXJyZXJ0eXBlUHJvbW90ZXJwcml2YXRlZ2V0RmllbGRJbml0aWFsaXplcnR5cGVOZWVkZWRpbmZlckZpZWxkVG9wTGV2ZWxpbmZlckluaXRpYWxpemVya2VybmVsSW5pdGlhbGl6ZXJpbmZlclN0YXRlbWVudFR5cGVMaXRlcmFsSnVkZ21lbnR2aXNpdFR5cGVMaXRlcmFsSnVkZ21lbnRTaGFkb3dUeXBlUHJvbW90ZXJnZXRWYXJpYWJsZUZ1bmN0aW9uTmVzdGluZ0xldmVsX2Z1bmN0aW9uTmVzdGluZ0xldmVsaXNQcm9tb3Rpb25DYW5kaWRhdGVrZXJuZWxWYXJpYWJsZURlY2xhcmF0aW9uX2lzTG9jYWxGdW5jdGlvbnNhbWVFeHByZXNzaW9uc3NldFZhcmlhYmxlTXV0YXRlZEFueXdoZXJlX211dGF0ZWRBbnl3aGVyZXNldFZhcmlhYmxlTXV0YXRlZEluQ2xvc3VyZV9tdXRhdGVkSW5DbG9zdXJld2FzVmFyaWFibGVNdXRhdGVkQW55d2hlcmVWYXJpYWJsZUFzc2lnbm1lbnRKdWRnbWVudHZpc2l0VmFyaWFibGVBc3NpZ25tZW50SnVkZ21lbnRmb3JTeW50aGV0aWNUb2tlbl9pbXBsaWNpdGx5VHlwZWRpc0xvY2FsRnVuY3Rpb25mb3JFZmZlY3Rpbml0aWFsaXplckp1ZGdtZW50dmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnRVbnJlc29sdmVkVGFyZ2V0SW52b2NhdGlvbkp1ZGdtZW50dmlzaXRVbnJlc29sdmVkVGFyZ2V0SW52b2NhdGlvbkp1ZGdtZW50VW5yZXNvbHZlZFZhcmlhYmxlQXNzaWdubWVudEp1ZGdtZW50aXNDb21wb3VuZHZpc2l0VW5yZXNvbHZlZFZhcmlhYmxlQXNzaWdubWVudEp1ZGdtZW50VmFyaWFibGVHZXRKdWRnbWVudF9mYWN0X3Njb3BldmlzaXRWYXJpYWJsZUdldEp1ZGdtZW50V2hpbGVKdWRnbWVudHZpc2l0V2hpbGVKdWRnbWVudFlpZWxkSnVkZ21lbnR2aXNpdFlpZWxkSnVkZ21lbnRMb2FkTGlicmFyeUp1ZGdtZW50dmlzaXRMb2FkTGlicmFyeUp1ZGdtZW50TG9hZExpYnJhcnlUZWFyT2ZmSnVkZ21lbnR2aXNpdExvYWRMaWJyYXJ5VGVhck9mZkp1ZGdtZW50X0NvbXBsZXhBc3NpZ25tZW50SW5mZXJlbmNlUmVzdWx0X1VuZmluaXNoZWRDYXNjYWRlU3ludGhldGljV3JhcHBlcndyYXBJbGxlZ2FsQXNzaWdubWVudHdyYXBJbmRleEFzc2lnbm1lbnR3cmFwSW52YWxpZENvbnN0cnVjdG9ySW52b2NhdGlvbndyYXBJbnZhbGlkV3JpdGV3cmFwUHJvcGVydHlBc3NpZ25tZW50d3JhcFN0YXRpY0Fzc2lnbm1lbnR3cmFwU3ludGhldGljRXhwcmVzc2lvbndyYXBVbnJlc29sdmVkVGFyZ2V0SW52b2NhdGlvbndyYXBVbnJlc29sdmVkVmFyaWFibGVBc3NpZ25tZW50d3JhcFZhcmlhYmxlQXNzaWdubWVudEluZmVyZW5jZVZpc2l0b3JtYXBFbnRyeUNsYXNzbWFwRW50cnlPZmZzZXRtYXBTcHJlYWRPZmZzZXRpdGVyYWJsZVNwcmVhZE9mZnNldGl0ZXJhYmxlU3ByZWFkVHlwZWlzRW1wdHlDb250ZXh0d3JhcEZ1dHVyZU9yVHlwZXN0b3JlSW5mZXJyZWRUeXBlYmVpbmdJbmZlcnJlZHRvQmVJbmZlcnJlZGluZmVySW5pdGlhbGl6aW5nRm9ybWFsaGFzRXhwbGljaXRUeXBlQXJndW1lbnRzaW5mZXJlbmNlUmVzdWx0aW5mZXJJbnZvY2F0aW9uY2hlY2tCb3VuZHNJbkNvbnN0cnVjdG9ySW52b2NhdGlvbmluZmVycmVkaGFkRXhwbGljaXRUeXBlQXJndW1lbnRzY2hlY2tCb3VuZHNJbkZhY3RvcnlJbnZvY2F0aW9uaW5pdGlhbGl6ZXJUeXBlaGFuZGxlRm9ySW5EZWNsYXJpbmdWYXJpYWJsZXR5cGVDaGVja3NOZWVkZWRpbmZlckZvckluSXRlcmFibGV0ZW1wVmFydmFyaWFibGVHZXRpbXBsaWNpdERvd25jYXN0cHJvbG9ndWV3cmFwVHlwZWluZmVycmVkRXhwcmVzc2lvblR5cGVyZXNvbHZlVHlwZVBhcmFtZXRlcmhhbmRsZUZvckluV2l0aG91dFZhcmlhYmxlc3ludGhldGljV3JpdGVUeXBlc3ludGhldGljQXNzaWdubWVudHdyaXRlTWVtYmVyZ2V0U2V0dGVyVHlwZWhhbmRsZUZvckluU3RhdGVtZW50V2l0aG91dFZhcmlhYmxldXBkYXRldmlzaXRGdW5jdGlvbk5vZGVKdWRnbWVudHJldHVybkNvbnRleHRyZXR1cm5UeXBlSW5zdHJ1bWVudGF0aW9uT2Zmc2V0aW5mZXJMb2NhbEZ1bmN0aW9uaW5mZXJNZXRhZGF0YUtlZXBpbmdIZWxwZXJza2lwVHlwZUFyZ3VtZW50SW5mZXJlbmNlbGhzVHlwZWNhbGxlZVR5cGVleHBlY3RlZEluZGV4VHlwZUZvcldyaXRlaW5kZXhDb250ZXh0aW5kZXhUeXBlcmVhZE1lbWJlcmNhbGxlZUZ1bmN0aW9uVHlwZWRlc3VnYXJlZEludm9jYXRpb25yZXBsYWNlZFJlYWRpc0RvdWJsZUNvbnRleHRkZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbmJ1aWxkUHJvYmxlbWdldFNwcmVhZEVsZW1lbnRUeXBlc3ByZWFkVHlwZWluZmVyRWxlbWVudGluZmVycmVkVHlwZUFyZ3VtZW50aW5mZXJyZWRTcHJlYWRUeXBlc2luZmVyZW5jZU5lZWRlZHNwcmVhZEVsZW1lbnRUeXBlaXNBc3NpZ25hYmxlY29uZGl0aW9uVHlwZXRoZW5UeXBlb3RoZXJ3aXNlVHlwZWNoZWNrRWxlbWVudGxpc3RUeXBlaW5mZXJyZWRUeXBlc2Zvcm1hbFR5cGVzYWN0dWFsVHlwZXNpbmZlckdlbmVyaWNGdW5jdGlvbk9yVHlwZXR5cGVBcmdzY2hlY2tCb3VuZHNJbkxpc3RMaXRlcmFsc3RvcmVTcHJlYWRNYXBFbnRyeUVsZW1lbnRUeXBlc3NwcmVhZE1hcEVudHJ5VHlwZWluZmVyTWFwRW50cnlpbmZlcnJlZEtleVR5cGVpbmZlcnJlZFZhbHVlVHlwZXNwcmVhZENvbnRleHRhY3R1YWxUeXBlc0ZvclNldGFjdHVhbEtleVR5cGVhY3R1YWxWYWx1ZVR5cGVhY3R1YWxFbGVtZW50VHlwZWtleUVycm9ydmFsdWVFcnJvcmVudHJ5VHlwZWlzTWFwaXNJdGVyYWJsZWFjdHVhbFR5cGVGb3JTZXRsZW5ndGhGb3JTZXRjaGVja01hcEVudHJ5Y2FjaGVkS2V5Y2FjaGVkVmFsdWVtYXBUeXBldHlwZUNvbnRleHRJc01hcHR5cGVDb250ZXh0SXNJdGVyYWJsZXNldExpdGVyYWxjYWNoZWRLZXlzY2FjaGVkVmFsdWVzaGFzTWFwRW50cnloYXNNYXBTcHJlYWRoYXNJdGVyYWJsZVNwcmVhZHNwcmVhZFR5cGVDb250ZXh0Y2FuQmVTZXRjYW5CZU1hcHNldEVsZW1lbnRzZm9ybWFsVHlwZXNGb3JTZXRzZXRUeXBlaW5mZXJyZWRUeXBlc0ZvclNldGNoZWNrQm91bmRzSW5NYXBMaXRlcmFsaW5mZXJNZXRob2RJbnZvY2F0aW9ucmVjZWl2ZXJWYXJpYWJsZWluZmVyUHJvcGVydHlHZXRkZXN1Z2FyZWRHZXR2YXJpYWJsZVR5cGVmaW5kUHJvcGVydHlHZXRNZW1iZXJoYW5kbGVQcm9wZXJ0eUdldENvbnRyYXZhcmlhbmNlY2xhc3NUeXBlUGFyYW1ldGVyc2Nsb3N1cmVDb250ZXh0aXNHZW5lcmF0b3JyZXR1cm5PcllpZWxkQ29udGV4dGhhbmRsZVJldHVybmNoZWNrQm91bmRzSW5TZXRMaXRlcmFsaW5zdGFudGlhdGVUZWFyT2ZmY2hlY2tCb3VuZHNJblN0YXRpY0ludm9jYXRpb25pbnRlcmZhY2VNZW1iZXJtZXRob2ROYW1lcHJvcGVydHlOYW1lZXhwcmVzc2lvblR5cGVjYXNlRXhwcmVzc2lvbmNhc2VFeHByZXNzaW9uVHlwZXZpc2l0Q2F0Y2hKdWRnbWVudGNhdGNoX2RlY2xhcmVkVHlwZWluZmVyRGVjbGFyYXRpb25UeXBlcmVwbGFjZWRJbml0aWFsaXplcmNoZWNrQm91bmRzSW5WYXJpYWJsZURlY2xhcmF0aW9ubXV0YXRlZEluQ2xvc3VyZWRlY2xhcmVkT3JJbmZlcnJlZFR5cGVjb21wdXRlUHJvbW90ZWRUeXBlaGFuZGxlWWllbGRJbmZlcnJlZFR5cGVWaXNpdG9yZ2V0SW5mZXJyZWRUeXBlcmVhZEluZmVycmVkVHlwZWludmFsaWRUb0JvdHRvbWludmFsaWRUb1RvcGNvbXB1dGVDb25zdHJ1Y3RvclJldHVyblR5cGVnZXRFeHBsaWNpdFR5cGVBcmd1bWVudHNjaGVja1dlYkludExpdGVyYWxzRXJyb3JJZlVuZXhhY3Rhc0ludG5lYXJlc3QweDBYZmFzdGEuYnVpbGRlcklkZW50aWZpZXJJbml0aWFsaXplZElkZW50aWZpZXJRdWFsaWZpZWROYW1lZGVwcmVjYXRlZF9leHRyYWN0VG9rZW5mbGF0dGVuTmFtZUJ1aWx0aW5UeXBlQnVpbGRlckVudW1Db25zdGFudEluZm9GaWVsZEJ1aWxkZXJGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyRnVuY3Rpb25UeXBlQnVpbGRlck1peGluQXBwbGljYXRpb25CdWlsZGVyTW9kaWZpZXJCdWlsZGVyUHJlZml4QnVpbGRlclByb2NlZHVyZUJ1aWxkZXJUeXBlQWxpYXNCdWlsZGVyVW5yZXNvbHZlZFR5cGVWb2lkVHlwZUJ1aWxkZXJmYXN0YS5zY2FubmVyLmFycmF5X2Jhc2VkX3NjYW5uZXJBYnN0cmFjdFNjYW5uZXJjbG9zZUJyYWNlSW5mb0Zvcmdyb3VwaW5nU3RhY2thcHBlbmRQcmVjZWRlbmNlVG9rZW5hcHBlbmRUb2tlbnNlbGVjdGNob2ljZWFwcGVuZEtleXdvcmRUb2tlbmRpc2NhcmRPcGVuTHRhcHBlbmRFb2ZUb2tlbmJlZ2luVG9rZW51bm1hdGNoZWRCZWdpbkdyb3VwYXBwZW5kV2hpdGVTcGFjZWxpbmVGZWVkSW5NdWx0aWxpbmVhcHBlbmRCZWdpbkdyb3VwYXBwZW5kRW5kR3JvdXBvcGVuS2luZGRpc2NhcmRCZWdpbkdyb3VwVW50aWxvcmlnaW5hbFN0YWNrYXBwZW5kR3RhcHBlbmRHdEd0YXBwZW5kRXJyb3JUb2tlbmFwcGVuZFN1YnN0cmluZ1Rva2VuYXBwZW5kU3ludGhldGljU3Vic3RyaW5nVG9rZW5kaXNjYXJkSW50ZXJwb2xhdGlvbmZyb250X2VuZC5tZW1vcnlfZmlsZV9zeXN0ZW1fZmlsZXNfZGlyZWN0b3JpZXMtIF9hZGRUcmFpbGluZ1NsYXNoTWVtb3J5RmlsZVN5c3RlbUVudGl0eWNyZWF0ZURpcmVjdG9yeUVudHJ5ICBpcyBhIGZpbGUuRmlsZSAgZG9lcyBub3QgZXhpc3Qud3JpdGVBc0J5dGVzU3luY191cGRhdGUgaXMgYSBkaXJlY3RvcnkuZmFzdGEuYnVpbGRlcl9ncmFwaEdyYXBoTGlicmFyeSBub3QgZm91bmQ6IGZhc3RhLmNvbWJpbmF0b3JEaXJlY3RvcnlHWmlwQ29kZWNnWmlwQ29kZWNnemlwcGVkSW5pdGlhbGl6ZWRGcm9tRGF0YXRlbXBEaXJjcmVhdGVUZW1wU3luYy5nemZyb250X2VuZC5zcmMuaHlicmlkX2ZpbGVfc3lzdGVtcGh5c2ljYWxfcGh5c2ljYWxIeWJyaWRGaWxlU3lzdGVtRW50aXR5X2RlbGVnYXRlX2ZzZGVsZWdhdGVmYXN0YS5rZXJuZWxfbGlicmFyeV9idWlsZGVyVHlwZUFyZ3VtZW50SXNzdWVmaW5kVHlwZUFyZ3VtZW50SXNzdWVzZmluZFR5cGVBcmd1bWVudElzc3Vlc0Zvckludm9jYXRpb25nZXRHZW5lcmljVHlwZU5hbWVoYXNDb25zdENvbnN0cnVjdG9yTWFza2hhc0luaXRpYWxpemVyTWFza2luaXRpYWxpemluZ0Zvcm1hbE1hc2ttaXhpbkRlY2xhcmF0aW9uTWFza25hbWVkTWl4aW5BcHBsaWNhdGlvbk1hc2tEZWNsYXJhdGlvbkJ1aWxkZXJjYWxjdWxhdGVCb3VuZHNmaW5kR2VuZXJpY0Z1bmN0aW9uVHlwZXNnZXROb25TaW1wbGljaXR5SXNzdWVzRm9yRGVjbGFyYXRpb25nZXROb25TaW1wbGljaXR5SXNzdWVzRm9yVHlwZVZhcmlhYmxlc2FjdHVhbE9yaWdpbm5hdGl2ZU1ldGhvZHNib3VuZGxlc3NUeXBlVmFyaWFibGVzZm9yd2FyZGVyc09yaWdpbnN1bnR5cGVkSW5pdGlhbGl6aW5nRm9ybWFsc2FkZE5hbWVkVHlwZWFkZFR5cGVhZGRNaXhpbkFwcGxpY2F0aW9ubWl4aW5zYWRkVm9pZFR5cGVkb2N1bWVudGF0aW9uQ29tbWVudHN1cGVydHlwZU9mZnNldGVuZE5lc3RlZERlY2xhcmF0aW9ubGlicmFyeURlY2xhcmF0aW9uY2xhc3NTY29wZWNsYXNzIGNvbnN0cnVjdG9yU2NvcGVoYXNDb25zdENvbnN0cnVjdG9yYXBwbHlNaXhpbnN0eXBlVmFyaWFibGVzQnlOYW1lY2hlY2tUeXBlVmFyaWFibGVzc2V0UGFyZW50c2V0UGFyZW50QW5kQ2hlY2tDb25mbGljdHN0dm93bmVyc3ViY2xhc3NOYW1ldW5uYW1lZCBtaXhpbiBhcHBsaWNhdGlvbnJ1bm5pbmdOYW1laXNOYW1lZE1peGluQXBwbGljYXRpb250eXBlVmFyaWFibGVOYW1lc3R5cGVWYXJpYWJsZXVzZXNUeXBlVmFyaWFibGVzZm9ybWFsc2lzR2VuZXJpY2Z1bGxuYW1lYXBwbGljYXRpb25UeXBlVmFyaWFibGVzYXBwbGljYXRpb25UeXBlQXJndW1lbnRzYmVnaW5OZXN0ZWREZWNsYXJhdGlvbm1peGluIGFwcGxpY2F0aW9uY29weVR5cGVWYXJpYWJsZXNjdXJyZW50RGVjbGFyYXRpb25uZXdUeXBlc25ld1R5cGVtaXhpbkRlY2xhcmF0aW9uY29tcHV0ZWRTdGFydENoYXJPZmZzZXRhcHBsaWNhdGlvbm1peGluIGFkZE5hbWVkTWl4aW5BcHBsaWNhdGlvbm1peGluQXBwbGljYXRpb25pbml0aWFsaXplclRva2VuRm9ySW5mZXJlbmNlaGFzSW5pdGlhbGl6ZXJhZGRDb25zdHJ1Y3RvcmNvbnN0cnVjdG9yTmFtZWNoYXJPcGVuUGFyZW5PZmZzZXRuYXRpdmVNZXRob2ROYW1lYWRkTmF0aXZlTWV0aG9kYWRkRmFjdG9yeU1ldGhvZHJlZGlyZWN0aW9uVGFyZ2V0ZmFjdG9yeURlY2xhcmF0aW9uI2ZhY3RvcnlfbWV0aG9kcHJvY2VkdXJlTmFtZWNvbXB1dGVBbmRWYWxpZGF0ZUNvbnN0cnVjdG9yTmFtZXNhdmVkRGVjbGFyYXRpb25hZGRFbnVtZW51bUNvbnN0YW50SW5mb3NhZGRGdW5jdGlvblR5cGVBbGlhcyN0eXBlZGVmYWRkRnVuY3Rpb25UeXBlI2Z1bmN0aW9uX3R5cGVhZGRGb3JtYWxQYXJhbWV0ZXJoYXNUaGlzYWRkVHlwZVZhcmlhYmxlYnVpbGRCdWlsZGVyYWRkTmF0aXZlRGVwZW5kZW5jeW5hdGl2ZUltcG9ydFBhdGhhZGREZXBlbmRlbmNpZXNpbXBvcnRJbmRleGV4cG9ydEluZGV4cHJlZml4QnVpbGRlcmlzTG9hZExpYnJhcnlwcmVmZXJyZWRvdGhlclVyaXByZWZlcnJlZFVyaWhpZGRlblVyaWJ1aWxkZXJUZW1wbGF0ZXRlYXJvZmZsb2FkTGlicmFyeUJ1aWxkZXJmb3J3YXJkZXJwb3NpdGlvbmFsQ291bnRmb3J3YXJkZXJQYXJhbWV0ZXJvcmlnaW5QYXJhbWV0ZXJvcmlnaW5OYW1lZE1hcG9yaWdpbk5hbWVkZm9yd2FyZGVyTmFtZWRiZWNvbWVOYXRpdmVmaW5pc2hjb21wdXRlRGVmYXVsdFR5cGVzRm9yVmFyaWFibGVzaGF2ZUVycm9uZW91c0JvdW5kc2dlbmVyaWNGdW5jdGlvblR5cGVzY2FsY3VsYXRlZEJvdW5kc3JlcG9ydElzc3Vlc2lzc3Vlc3BlcmZvcm1FcnJvclJlY292ZXJ5aW5jbHVkZVBhcnRwYXJ0T2Zmc2V0b3JpZ2luRGVjbGFyYXRpb25zYXBwbHlQYXRjaHBhdGNoRGVjbGFyYXRpb25zaW5qZWN0TWVtYmVyRnJvbVBhdGNoZXhwb3J0TWVtYmVyRnJvbVBhdGNocmVwb3J0VHlwZUFyZ3VtZW50SXNzdWVzdGFyZ2V0UmVjZWl2ZXJpc3N1ZWlzc3VlSW5mZXJyZWRlbmNsb3NpbmdUeXBlZW5jbG9zaW5nTmFtZXJlcG9ydFR5cGVBcmd1bWVudElzc3VlY2hlY2tCb3VuZHNJbkZpZWxkY2hlY2tCb3VuZHNJblR5cGVhbGxvd1N1cGVyQm91bmRlZGNoZWNrQm91bmRzSW5GdW5jdGlvbk5vZGVQYXJ0c2NoZWNrQm91bmRzSW5GdW5jdGlvbk5vZGVjaGVja0JvdW5kc0luTWV0aG9kSW52b2NhdGlvbnR5cGVJbmZlcnJlcnJlY2VpdmVyVHlwZUFyZ3VtZW50c21ldGhvZFBhcmFtZXRlcnNpbnN0YW50aWF0ZWRNZXRob2RQYXJhbWV0ZXJzZmluYWxpemVJbml0aWFsaXppbmdGb3JtYWxjb21wdXRlTGlicmFyeVVyaW5vIGxpYnJhcnkgcGFyZW50ZXh0cmFjdE5hbWVmYXN0YS5saWJyYXJ5X2dyYXBodXJpMWZhc3RhLnNvdXJjZV9saWJyYXJ5X2J1aWxkZXJyZXNvbHZlUmVsYXRpdmVVcmlDb25maWd1cmF0aW9uTUFMRk9STUVEX1VSSV9TQ0hFTUVvcmctZGFydGxhbmctbWFsZm9ybWVkLXVyaWltcG9ydFNjb3BlaW1wbGVtZW50YXRpb25CdWlsZGVyc2FjY2Vzc29yc3BhcnRPZk5hbWVjYW5BZGRJbXBsZW1lbnRhdGlvbkJ1aWxkZXJzYWNjZXNzUHJvYmxlbWZyb21TY29wZXN0b1Njb3BlYWRkQ29uc3RydWN0b3JSZWZlcmVuY2VoYXNNZW1iZXJzY3JlYXRlTmVzdGVkPHN5bnRheC1lcnJvcj51cmlJc1ZhbGlkdXJpT2Zmc2V0cGFyc2VkVXJpcXVhbGlmaWVyYWRkRXhwb3J0Y29uZmlndXJhdGlvbnNjb25maWdsb29rdXBJbXBvcnRDb25kaXRpb25kb3R0ZWROYW1lZXhwb3J0ZWRMaWJyYXJ5YWRkRXhwb3J0ZXJwcmVmaXhDaGFyT2Zmc2V0bmF0aXZlUGF0aG5hdGl2ZUV4dGVuc2lvblNjaGVtZWRhcnQtZXh0OnN0cmlwcGVkVXJpbmV3RmlsZVVyaWFkZFBhcnRPZmFkZEZpZWxkc2ZpZWxkSW5mb3NiZWZvcmVMYXN0aXNEdXBsaWNhdGVkRGVjbGFyYXRpb25mdWxsTmFtZWFkZEltcGxlbWVudGF0aW9uQnVpbGRlcnNlZW5QYXJ0c3BhcnREZWNsYXJhdGlvbnNkdXBsaWNhdGVkZXhwbGljaXRDb3JlSW1wb3J0ZmluYWxpemVJbXBvcnRzcmVzb2x2ZUluY2hlY2tUeXBlbm9ybWFsaXplVHlwZTxsaWJyYXJ5Pm5hbWVPclF1YWxpZmllZGJ1aWxkSW52YWxpZFR5cGVlbmRDaGFyT2Zmc2V0RmllbGRJbmZvY29tcGlsZXIubnVsbF9hcGlOdWxsQmluYXJ5U2lua051bGxCaW5hcnlTaW5rKGRhcnQyanMuZGlhZ25vc3RpY19saXN0ZW5lcnJlcG9ydEVycm9yTWVzc2FnZXJlcG9ydEhpbnRNZXNzYWdlZGFydDJqcy5kaWFnbm9zdGljcy5pbnZhcmlhbnRERUJVR19NT0RFRGVidWcgbW9kZSBpcyBub3QgZW5hYmxlZDogU3Bhbm5hYmxlIHdhcyBudWxsIGZvciBmYWlsZWRBdC4gVXNlIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUuZGFydDJqcy5kaWFnbm9zdGljcy5zb3VyY2Vfc3BhblNvdXJjZVNwYW4oZGFydDJqcy5kaWFnbm9zdGljcy5zcGFubmFibGVfU3Bhbm5hYmxlU2VudGluZWxBc3NlcnRpb24gZmFpbHVyZUN1cnJlbnQgZWxlbWVudE5vIGxvY2F0aW9uZGFydDJqcy5oZWxwZXJzRGVidWdQcmludERlYnVnV3JhcFByaW50UmVwb3J0SGVyZWRlYnVnTWVzc2FnZV9EZWJ1Z0luZGVudGF0aW9uREVCVUdfUFJJTlRfRU5BQkxFRF9pbmRlbnRhdGlvbl90cmFja2VkT2JqZWN0c3RyYWNrV2l0aFRyYWNlZW5hYmxlRGVidWdNb2RlZGVidWdQcmludF9kZWJ1Z1ByaW50ZGVidWdXcmFwUHJpbnRfZGVidWdXcmFwUHJpbnRzdGFydDplbmQ6ZGVidWdCcmVha3JlcG9ydEhlcmVfcmVwb3J0SGVyZUhFUkU6IHRyYWNrZG9UcmFja3ByaW50VHJhY2V0cmFjazogbGltaXR0aHJvd09uUHJpbnRpZlRyYWNrZWR0cmFja2VkOiBkYXJ0MmpzLmJhY2tlbmRfc3RyYXRlZ3lCYWNrZW5kU3RyYXRlZ3lvdXRwdXRVbml0RGF0YWNyZWF0ZUNvZGVnZW5Xb3JsZEJ1aWxkZXJuYXRpdmVCYXNpY0RhdGFzZWxlY3RvckNvbnN0cmFpbnRzU3RyYXRlZ3ljcmVhdGVDb2RlZ2VuV29ya0l0ZW1CdWlsZGVyY3JlYXRlU3NhQnVpbGRlcnNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3ljcmVhdGVUeXBlc0luZmVycmVyZGFydDJqcy5jb21tb24ubmFtZXNQdWJsaWNOYW1lQ2FsbFN0cnVjdHVyZUlkZW50aWZpZXJzbG9hZExpYnJhcnlub1N1Y2hNZXRob2RfcnVudGltZVR5cGVfc2lnbmF0dXJlOnNpZ25hdHVyZU5hbWVzZHluYW1pY190b1N0cmluZ19JTkRFWF9OQU1FSU5ERVhfU0VUX05BTUVDQUxMX05BTUVnZW5lcmljSW5zdGFudGlhdGlvbmluc3RhbnRpYXRlbm9TdWNoTWV0aG9kR2V0dGVydG9TdHJpbmdHZXR0ZXJoYXNoQ29kZV9BTExkYXJ0X2FzeW5jZGFydF9jb2xsZWN0aW9uY29sbGVjdGlvbmRhcnRfY29yZWRhcnRfaHRtbGh0bWxkYXJ0X2h0bWxfY29tbW9uaHRtbF9jb21tb25kYXJ0X2luZGV4ZWRfZGJpbmRleGVkX2RiZGFydF9pc29sYXRlaXNvbGF0ZWRhcnRfbWF0aGRhcnRfbWlycm9yc2RhcnRfX2ludGVybmFsZGFydF9fbmF0aXZlX3R5cGVkX2RhdGFfbmF0aXZlX3R5cGVkX2RhdGFkYXJ0X3R5cGVkX2RhdGF0eXBlZF9kYXRhZGFydF9zdmdzdmdkYXJ0X3dlYl9hdWRpb3dlYl9hdWRpb2RhcnRfd2ViX2dsd2ViX2dsZGFydF93ZWJfc3Fsd2ViX3NxbGRhcnRfX2pzX2hlbHBlcl9qc19oZWxwZXJkYXJ0X19pbnRlcmNlcHRvcnNfaW50ZXJjZXB0b3JzZGFydF9fZm9yZWlnbl9oZWxwZXJfZm9yZWlnbl9oZWxwZXJkYXJ0X19qc19uYW1lc19qc19uYW1lc2RhcnRfX2pzX2VtYmVkZGVkX25hbWVzX2pzX2VtYmVkZGVkX25hbWVzcGFja2FnZV9qc2pzL2pzLmRhcnRwYWNrYWdlX21ldGFfZGFydDJqc21ldGEvZGFydDJqcy5kYXJ0ZGFydDJqcy5jb21tb24ud29ya01lbWJlckVudGl0eWRhcnQyanMuY29tcGlsZV90aW1lX2NvbnN0YW50X2V2YWx1YXRvckNvbnN0YW50RW52aXJvbm1lbnRCYWNrZW5kQ29uc3RhbnRFbnZpcm9ubWVudHJlZ2lzdGVyTGF6eVN0YXRpY0NvbnN0YW50Q29tcGlsZXJUYXNrZGFydDJqcy50eXBlX3N5c3RlbWNvbnN0YW50X3N5c3RlbU5hdGl2ZUJhc2ljRGF0YUNvbW1vbkVsZW1lbnRzcmVzb3VyY2VDbGFzc3VubW9kaWZpYWJsZVNldENsYXNzdHlwZWREYXRhTGlicmFyeWpzSGVscGVyTGlicmFyeWludGVyY2VwdG9yc0xpYnJhcnlmb3JlaWduTGlicmFyeWludGVybmFsTGlicmFyeXR5cGVkRGF0YUNsYXNzc3ltYm9sQ29uc3RydWN0b3JUYXJnZXRpc1N5bWJvbENvbnN0cnVjdG9yaWRlbnRpY2FsRnVuY3Rpb25pc0Z1bmN0aW9uQXBwbHlNZXRob2R0eXBlTGl0ZXJhbFR5cGVzdGFja1RyYWNlVHlwZWlzTnVtYmVyT3JTdHJpbmdTdXBlcnR5cGVpc1N0cmluZ09ubHlTdXBlcnR5cGVpc0xpc3RTdXBlcnR5cGVnZXRDb25zdGFudE1hcFR5cGVGb3Jzb3VyY2VUeXBlaGFzUHJvdG9LZXlvbmx5U3RyaW5nS2V5c2dldENvbnN0YW50U2V0VHlwZUZvcnN5bWJvbEZpZWxkc3ltYm9sSW1wbGVtZW50YXRpb25UeXBlbWFwTGl0ZXJhbENsYXNzbWFwTGl0ZXJhbENvbnN0cnVjdG9ybWFwTGl0ZXJhbENvbnN0cnVjdG9yRW1wdHltYXBMaXRlcmFsVW50eXBlZE1ha2VybWFwTGl0ZXJhbFVudHlwZWRFbXB0eU1ha2Vyc2V0TGl0ZXJhbENsYXNzc2V0TGl0ZXJhbENvbnN0cnVjdG9yc2V0TGl0ZXJhbENvbnN0cnVjdG9yRW1wdHlzZXRMaXRlcmFsVW50eXBlZE1ha2Vyc2V0TGl0ZXJhbFVudHlwZWRFbXB0eU1ha2Vyb2JqZWN0Tm9TdWNoTWV0aG9kaXNEZWZhdWx0Tm9TdWNoTWV0aG9kSW1wbGVtZW50YXRpb25hc3luY0hlbHBlclN0YXJ0U3luY2FzeW5jSGVscGVyQXdhaXRhc3luY0hlbHBlclJldHVybmFzeW5jSGVscGVyUmV0aHJvd3dyYXBCb2R5eWllbGRTdGFyeWllbGRTaW5nbGVzeW5jU3RhclVuY2F1Z2h0RXJyb3Jhc3luY1N0YXJIZWxwZXJzdHJlYW1PZkNvbnRyb2xsZXJlbmRPZkl0ZXJhdGlvbnN5bmNTdGFySXRlcmFibGVmdXR1cmVJbXBsZW1lbnRhdGlvbmNvbnRyb2xsZXJTdHJlYW1zdHJlYW1JdGVyYXRvcnN0cmVhbUl0ZXJhdG9yQ29uc3RydWN0b3JzeW5jU3Rhckl0ZXJhYmxlRmFjdG9yeWFzeW5jQXdhaXRDb21wbGV0ZXJGYWN0b3J5YXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckZhY3Rvcnlqc0ludGVyY2VwdG9yQ2xhc3Nqc1N0cmluZ0NsYXNzanNBcnJheUNsYXNzanNOdW1iZXJDbGFzc2pzSW50Q2xhc3Nqc0RvdWJsZUNsYXNzanNOdWxsQ2xhc3Nqc0Jvb2xDbGFzc2pzUGxhaW5KYXZhU2NyaXB0T2JqZWN0Q2xhc3Nqc1Vua25vd25KYXZhU2NyaXB0T2JqZWN0Q2xhc3Nqc0phdmFTY3JpcHRGdW5jdGlvbkNsYXNzanNKYXZhU2NyaXB0T2JqZWN0Q2xhc3Nqc0luZGV4YWJsZUNsYXNzanNNdXRhYmxlSW5kZXhhYmxlQ2xhc3Nqc011dGFibGVBcnJheUNsYXNzanNGaXhlZEFycmF5Q2xhc3Nqc0V4dGVuZGFibGVBcnJheUNsYXNzanNVbm1vZGlmaWFibGVBcnJheUNsYXNzanNQb3NpdGl2ZUludENsYXNzanNVSW50MzJDbGFzc2pzVUludDMxQ2xhc3Npc0ZpbmRJbmRleEZvck5hdGl2ZVN1YmNsYXNzVHlwZWdldE5hdGl2ZUludGVyY2VwdG9yTWV0aG9kanNBcnJheVR5cGVkQ29uc3RydWN0b3JmaW5kSGVscGVyRnVuY3Rpb25jbG9zdXJlQ2xhc3Nib3VuZENsb3N1cmVDbGFzc3R5cGVMaXRlcmFsQ2xhc3Njb25zdE1hcExpdGVyYWxDbGFzc2NvbnN0U2V0TGl0ZXJhbENsYXNzdHlwZVZhcmlhYmxlQ2xhc3Nqc0ludm9jYXRpb25NaXJyb3JDbGFzc2ludm9jYXRpb25UeXBlQXJndW1lbnRHZXR0ZXJqc0luZGV4aW5nQmVoYXZpb3JJbnRlcmZhY2VzdGFja1RyYWNlSGVscGVyQ2xhc3Njb25zdGFudE1hcENsYXNzY29uc3RhbnRTdHJpbmdNYXBDbGFzc2NvbnN0YW50UHJvdG9NYXBDbGFzc2dlbmVyYWxDb25zdGFudE1hcENsYXNzYW5ub3RhdGlvbkNyZWF0ZXNDbGFzc2Fubm90YXRpb25SZXR1cm5zQ2xhc3Nhbm5vdGF0aW9uSlNOYW1lQ2xhc3NuYXRpdmVBbm5vdGF0aW9uQ2xhc3N0eXBlVmFyaWFibGVDb25zdHJ1Y3RvcmFzc2VydFRlc3Rhc3NlcnRUaHJvd2Fzc2VydEhlbHBlcmFzc2VydFVucmVhY2hhYmxlTWV0aG9kZ2V0SXNvbGF0ZUFmZmluaXR5VGFnTWFya2VycmVxdWlyZXNQcmVhbWJsZU1hcmtlcmxvYWRMaWJyYXJ5V3JhcHBlcmxvYWREZWZlcnJlZExpYnJhcnlib29sQ29udmVyc2lvbkNoZWNrdHJhY2VIZWxwZXJjbG9zdXJlRnJvbVRlYXJPZmZpc0pzSW5kZXhhYmxldGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb250aHJvd0luZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbmV4Y2VwdGlvblVud3JhcHBlcnRocm93UnVudGltZUVycm9ydGhyb3dVbnN1cHBvcnRlZEVycm9ydGhyb3dUeXBlRXJyb3J0aHJvd0Fic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3JjaGVja0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcnRocm93Q29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yc3RyaW5nSW50ZXJwb2xhdGlvbkhlbHBlcndyYXBFeGNlcHRpb25IZWxwZXJ0aHJvd0V4cHJlc3Npb25IZWxwZXJjbG9zdXJlQ29udmVydGVydHJhY2VGcm9tRXhjZXB0aW9uc2V0UnVudGltZVR5cGVJbmZvZ2V0UnVudGltZVR5cGVJbmZvZ2V0VHlwZUFyZ3VtZW50QnlJbmRleGNvbXB1dGVTaWduYXR1cmVnZXRSdW50aW1lVHlwZUFyZ3VtZW50c2dldFJ1bnRpbWVUeXBlQXJndW1lbnRnZXRSdW50aW1lVHlwZUFyZ3VtZW50SW50ZXJjZXB0ZWRhc3NlcnRJc1N1YnR5cGVjaGVja1N1YnR5cGVhc3NlcnRTdWJ0eXBlc3VidHlwZUNhc3RmdW5jdGlvblR5cGVUZXN0ZnV0dXJlT3JUZXN0Y2hlY2tTdWJ0eXBlT2ZSdW50aW1lVHlwZWFzc2VydFN1YnR5cGVPZlJ1bnRpbWVUeXBlc3VidHlwZU9mUnVudGltZVR5cGVDYXN0Y2hlY2tEZWZlcnJlZElzTG9hZGVkdGhyb3dOb1N1Y2hNZXRob2RjcmVhdGVSdW50aW1lVHlwZWZhbGxUaHJvdWdoRXJyb3JjcmVhdGVJbnZvY2F0aW9uTWlycm9yY3JlYXRlVW5tYW5nbGVkSW52b2NhdGlvbk1pcnJvcmN5Y2xpY1Rocm93SGVscGVyZGVmaW5lUHJvcGVydHlpc0V4dHJhY3RUeXBlQXJndW1lbnRzZ2V0SW5zdGFudGlhdGlvbkNsYXNzZ2V0SW5zdGFudGlhdGVGdW5jdGlvbmluc3RhbnRpYXRlZEdlbmVyaWNGdW5jdGlvblR5cGVleHRyYWN0RnVuY3Rpb25UeXBlT2JqZWN0RnJvbUludGVybmFsc3ltYm9sSW1wbGVtZW50YXRpb25DbGFzc2V4dGVybmFsTmFtZUNsYXNzZXh0ZXJuYWxOYW1lVHlwZXN5bWJvbFZhbGlkYXRlZENvbnN0cnVjdG9yanNHZXROYW1lRW51bWlzRm9yZWlnbkhlbHBlcmdldERlZmF1bHRTdXBlcmNsYXNzS0NvbW1vbkVsZW1lbnRzanNBbm5vdGF0aW9uQ2xhc3Nqc0Fub255bW91c0NsYXNzcHJhZ21hQ2xhc3NOYW1lRmllbGRwcmFnbWFDbGFzc09wdGlvbnNGaWVsZGlzQ3JlYXRlSW52b2NhdGlvbk1pcnJvckhlbHBlcmlzU3ltYm9sVmFsaWRhdGVkQ29uc3RydWN0b3JtZXRhTm9JbmxpbmVDbGFzc21ldGFUcnlJbmxpbmVDbGFzc2lzRXh0ZXJuYWxBbGxvd2VkSkNvbW1vbkVsZW1lbnRzaXNVbm5hbWVkTGlzdENvbnN0cnVjdG9yaXNGaWxsZWRMaXN0Q29uc3RydWN0b3Jpc0RlZmF1bHRFcXVhbGl0eUltcGxlbWVudGF0aW9uYXBwbGllc1RvSnNJbmRleGFibGVMZW5ndGhqc0FycmF5UmVtb3ZlTGFzdGpzQXJyYXlBZGRpc0pzU3RyaW5nU3BsaXRhcHBsaWVzVG9Kc1N0cmluZ1NwbGl0YWJzdHJhY3RWYWx1ZURvbWFpbmpzU3RyaW5nU3BsaXRqc1N0cmluZ1RvU3RyaW5nanNTdHJpbmdPcGVyYXRvckFkZGpzQ29uc3RDbGFzc2lzQ2hlY2tJbnRpc0NoZWNrTnVtaXNDaGVja1N0cmluZ2lzSW5zdGFudGlhdGlvbkNsYXNzdHlwZWRBcnJheU9mSW50Q2xhc3N0eXBlZEFycmF5T2ZEb3VibGVDbGFzc2pzQnVpbHRpbkVudW1pc0ZvcmVpZ25vcGVyYXRvckVxSGFuZGxlc051bGxBcmd1bWVudENvbW1vbkVsZW1lbnRzSW1wbF9lbnZfcmVzb3VyY2VDbGFzc191bm1vZGlmaWFibGVTZXRDbGFzc190eXBlZERhdGFMaWJyYXJ5X2pzSGVscGVyTGlicmFyeV9pbnRlcmNlcHRvcnNMaWJyYXJ5X2ZvcmVpZ25MaWJyYXJ5X2ludGVybmFsTGlicmFyeV90eXBlZERhdGFDbGFzc19zeW1ib2xDb25zdHJ1Y3RvclRhcmdldF9jb21wdXRlZFN5bWJvbENvbnN0cnVjdG9yRGVwZW5kZW5jaWVzX3N5bWJvbENvbnN0cnVjdG9ySW1wbGVtZW50YXRpb25UYXJnZXRfaWRlbnRpY2FsRnVuY3Rpb25fbWFwTGl0ZXJhbENsYXNzX21hcExpdGVyYWxDb25zdHJ1Y3Rvcl9tYXBMaXRlcmFsQ29uc3RydWN0b3JFbXB0eV9tYXBMaXRlcmFsVW50eXBlZE1ha2VyX21hcExpdGVyYWxVbnR5cGVkRW1wdHlNYWtlcl9zZXRMaXRlcmFsQ2xhc3Nfc2V0TGl0ZXJhbENvbnN0cnVjdG9yX3NldExpdGVyYWxDb25zdHJ1Y3RvckVtcHR5X3NldExpdGVyYWxVbnR5cGVkTWFrZXJfc2V0TGl0ZXJhbFVudHlwZWRFbXB0eU1ha2VyX29iamVjdE5vU3VjaE1ldGhvZF9zeW5jU3Rhckl0ZXJhYmxlRmFjdG9yeV9hc3luY0F3YWl0Q29tcGxldGVyRmFjdG9yeV9hc3luY1N0YXJTdHJlYW1Db250cm9sbGVyRmFjdG9yeV9qc0ludGVyY2VwdG9yQ2xhc3NfanNTdHJpbmdDbGFzc19qc0FycmF5Q2xhc3NfanNOdW1iZXJDbGFzc19qc0ludENsYXNzX2pzRG91YmxlQ2xhc3NfanNOdWxsQ2xhc3NfanNCb29sQ2xhc3NfanNQbGFpbkphdmFTY3JpcHRPYmplY3RDbGFzc19qc1Vua25vd25KYXZhU2NyaXB0T2JqZWN0Q2xhc3NfanNKYXZhU2NyaXB0RnVuY3Rpb25DbGFzc19qc0phdmFTY3JpcHRPYmplY3RDbGFzc19qc0luZGV4YWJsZUNsYXNzX2pzTXV0YWJsZUluZGV4YWJsZUNsYXNzX2pzTXV0YWJsZUFycmF5Q2xhc3NfanNGaXhlZEFycmF5Q2xhc3NfanNFeHRlbmRhYmxlQXJyYXlDbGFzc19qc1VubW9kaWZpYWJsZUFycmF5Q2xhc3NfanNQb3NpdGl2ZUludENsYXNzX2pzVUludDMyQ2xhc3NfanNVSW50MzFDbGFzc19nZXROYXRpdmVJbnRlcmNlcHRvck1ldGhvZF9qc0FycmF5VHlwZWRDb25zdHJ1Y3Rvcl9qc0FycmF5UmVtb3ZlTGFzdF9qc0FycmF5QWRkX2pzU3RyaW5nU3BsaXRfanNTdHJpbmdUb1N0cmluZ19qc1N0cmluZ09wZXJhdG9yQWRkX2pzQ29uc3RDbGFzc19qc0Fubm90YXRpb25DbGFzc19qc0Fub255bW91c0NsYXNzX2Nsb3N1cmVDbGFzc19ib3VuZENsb3N1cmVDbGFzc190eXBlTGl0ZXJhbENsYXNzX2NvbnN0TWFwTGl0ZXJhbENsYXNzX2NvbnN0U2V0TGl0ZXJhbENsYXNzX3R5cGVWYXJpYWJsZUNsYXNzX3ByYWdtYUNsYXNzTmFtZUZpZWxkX3ByYWdtYUNsYXNzT3B0aW9uc0ZpZWxkX2pzSW52b2NhdGlvbk1pcnJvckNsYXNzX2ludm9jYXRpb25UeXBlQXJndW1lbnRHZXR0ZXJfanNJbmRleGluZ0JlaGF2aW9ySW50ZXJmYWNlX25hdGl2ZUFubm90YXRpb25DbGFzc190eXBlVmFyaWFibGVDb25zdHJ1Y3Rvcl9hc3NlcnRUZXN0X2Fzc2VydFRocm93X2Fzc2VydEhlbHBlcl9hc3NlcnRVbnJlYWNoYWJsZU1ldGhvZF9nZXRJc29sYXRlQWZmaW5pdHlUYWdNYXJrZXJfcmVxdWlyZXNQcmVhbWJsZU1hcmtlcl9jYWNoZWRDaGVja0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcl9zeW1ib2xJbXBsZW1lbnRhdGlvbkNsYXNzX2V4dGVybmFsTmFtZUNsYXNzX3N5bWJvbEltcGxlbWVudGF0aW9uRmllbGRfc3ltYm9sVmFsaWRhdGVkQ29uc3RydWN0b3JfdHlwZWRBcnJheU9mSW50Q2xhc3NfdHlwZWRBcnJheU9mRG91YmxlQ2xhc3NfanNHZXROYW1lRW51bV9qc0J1aWx0aW5FbnVtX21ldGFBbm5vdGF0aW9uQ2hlY2tlZF9tZXRhTm9JbmxpbmVDbGFzc19tZXRhVHJ5SW5saW5lQ2xhc3NfZmluZENsYXNzUmVzb3VyY2VyZXF1aXJlZE5hdGl2ZVR5cGVkRGF0YV9maW5kQ29uc3RydWN0b3JfZW5zdXJlU3ltYm9sQ29uc3RydWN0b3JEZXBlbmRlbmNpZXNfZmluZExpYnJhcnlNZW1iZXJhcHBseWZpbGxlZF9nZXRSYXdUeXBlX2NyZWF0ZUludGVyZmFjZVR5cGVDb21wYXJhYmxlUGF0dGVybmxvb2t1cENsYXNzbG9va3VwTGlicmFyeU1lbWJlcl9maW5kQ2xhc3NNZW1iZXJsb29rdXBMb2NhbENsYXNzTWVtYmVybG9va3VwQ29uc3RydWN0b3JnZXRSYXdUeXBlY3JlYXRlSW50ZXJmYWNlVHlwZWNsYXNzRWxlbWVudHRyZWF0QXNSYXdzeW1ib2xJbXBsZW1lbnRhdGlvbkZpZWxkTGlua2VkSGFzaE1hcF9lbnN1cmVNYXBMaXRlcmFsSGVscGVyc19saXRlcmFsX2VtcHR5X21ha2VMaXRlcmFsX21ha2VFbXB0eUxpbmtlZEhhc2hTZXRfZW5zdXJlU2V0TGl0ZXJhbEhlbHBlcnNfZmluZEFzeW5jSGVscGVyQ2xhc3NfZmluZEFzeW5jSGVscGVyRnVuY3Rpb25fYXN5bmNTdGFydFN5bmNfYXN5bmNBd2FpdF9hc3luY1JldHVybl9hc3luY1JldGhyb3dfd3JhcEpzRnVuY3Rpb25Gb3JBc3luY19JdGVyYXRpb25NYXJrZXJ1bmNhdWdodEVycm9yX2FzeW5jU3RhckhlbHBlcl9zdHJlYW1PZkNvbnRyb2xsZXJfU3luY1N0YXJJdGVyYWJsZV9GdXR1cmVfQ29udHJvbGxlclN0cmVhbVN0cmVhbUl0ZXJhdG9yX21ha2VTeW5jU3Rhckl0ZXJhYmxlX21ha2VBc3luY0F3YWl0Q29tcGxldGVyX21ha2VBc3luY1N0YXJTdHJlYW1Db250cm9sbGVyX2ZpbmRJbnRlcmNlcHRvcnNDbGFzc19maW5kSW50ZXJjZXB0b3JzRnVuY3Rpb25JbnRlcmNlcHRvckpTU3RyaW5nSlNBcnJheUpTTnVtYmVySlNJbnRKU0RvdWJsZUpTTnVsbEpTQm9vbFBsYWluSmF2YVNjcmlwdE9iamVjdFVua25vd25KYXZhU2NyaXB0T2JqZWN0SmF2YVNjcmlwdEZ1bmN0aW9uSmF2YVNjcmlwdE9iamVjdEpTSW5kZXhhYmxlSlNNdXRhYmxlSW5kZXhhYmxlSlNNdXRhYmxlQXJyYXlKU0ZpeGVkQXJyYXlKU0V4dGVuZGFibGVBcnJheUpTVW5tb2RpZmlhYmxlQXJyYXlKU1Bvc2l0aXZlSW50SlNVSW50MzJKU1VJbnQzMWZpbmRJbmRleEZvck5hdGl2ZVN1YmNsYXNzVHlwZWdldE5hdGl2ZUludGVyY2VwdG9yaXNDYWxsdHlwZWRfaXNKc1N0cmluZ0NsYXNzYXBwbGllc2lzVGFyZ2V0aW5nTWVtYmVyaXNQb3RlbnRpYWxseVRydWVKU19DT05TVEpTX0Fub255bW91c19maW5kSGVscGVyRnVuY3Rpb25fZmluZEhlbHBlckNsYXNzQ2xvc3VyZUJvdW5kQ2xvc3VyZVR5cGVJbXBsQ29uc3RhbnRNYXBUeXBlVmFyaWFibGVKU0ludm9jYXRpb25NaXJyb3JKYXZhU2NyaXB0SW5kZXhpbmdCZWhhdmlvcl9TdGFja1RyYWNlQ3JlYXRlc1JldHVybnNKU05hbWVOYXRpdmVhc3NlcnRVbnJlYWNoYWJsZWdldElzb2xhdGVBZmZpbml0eVRhZ3JlcXVpcmVzUHJlYW1ibGVfbG9hZExpYnJhcnlXcmFwcGVyaWFlaW9vcmV1bndyYXBFeGNlcHRpb25pc0Z1bmN0aW9uY2hlY2tJbnRjaGVja051bWNoZWNrU3RyaW5nd3JhcEV4Y2VwdGlvbnRocm93RXhwcmVzc2lvbmNvbnZlcnREYXJ0Q2xvc3VyZVRvSlNnZXRUcmFjZUZyb21FeGNlcHRpb25nZXRGYWxsVGhyb3VnaEVycm9yX2NyZWF0ZUludm9jYXRpb25NaXJyb3J0aHJvd0N5Y2xpY0luaXRleHRyYWN0VHlwZUFyZ3VtZW50c19jaGVja1R5cGVBcmd1bWVudENvdW50VW5zdXBwb3J0ZWQgaW5zdGFudGlhdGlvbiBhcmd1bWVudCBjb3VudDogdmFsaWRhdGVkTmF0aXZlVHlwZWRBcnJheU9mSW50TmF0aXZlVHlwZWRBcnJheU9mRG91YmxlSnNHZXROYW1lSnNCdWlsdGluX2Vuc3VyZU1ldGFBbm5vdGF0aW9uc19Ob0lubGluZV9UcnlJbmxpbmVpc0Zyb21FbnZpcm9ubWVudENvbnN0cnVjdG9yVW5leHBlY3RlZCBmdW5jdGlvbiBpc0pzSW50ZXJvcENsYXNzaXNOYXRpdmVDbGFzc21haW5MaWJyYXJ5Zm9yRWFjaExpYnJhcnlNZW1iZXJsb29rdXBDbGFzc01lbWJlcmdldFN1cGVyQ2xhc3Nmb3JFYWNoTG9jYWxDbGFzc01lbWJlcmZvckVhY2hDbGFzc01lbWJlcmZvckVhY2hDb25zdHJ1Y3RvcnNraXBVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbnNmb3JFYWNoU3VwZXJ0eXBlZ2V0VGhpc1R5cGVpc0dlbmVyaWNDbGFzc2lzVW5uYW1lZE1peGluQXBwbGljYXRpb25nZXRUeXBlVmFyaWFibGVCb3VuZGdldEZ1bmN0aW9uVHlwZWdldEZ1bmN0aW9uVHlwZVZhcmlhYmxlc2dldExvY2FsRnVuY3Rpb25UeXBlZ2V0RmllbGRUeXBlZ2V0VW5hbGlhc2VkVHlwZWlzRW51bUNsYXNzS0VsZW1lbnRFbnZpcm9ubWVudGZvckVhY2hNaXhpbmdldEZpZWxkQ29uc3RhbnRGb3JUZXN0aW5naXNEZWZlcnJlZExvYWRMaWJyYXJ5R2V0dGVyZ2V0SW1wb3J0c2dldExpYnJhcnlNZXRhZGF0YWdldENsYXNzTWV0YWRhdGFnZXRNZW1iZXJNZXRhZGF0YWluY2x1ZGVQYXJhbWV0ZXJNZXRhZGF0YUpFbGVtZW50RW52aXJvbm1lbnRmb3JFYWNoSW5qZWN0ZWRDbGFzc01lbWJlcmZvckVhY2hDb25zdHJ1Y3RvckJvZHlmb3JFYWNoTmVzdGVkQ2xvc3VyZWlzU3VwZXJNaXhpbkFwcGxpY2F0aW9uZ2V0RWZmZWN0aXZlTWl4aW5DbGFzc2dldFR5cGVWYXJpYWJsZURlZmF1bHRUeXBlZ2V0QXN5bmNPclN5bmNTdGFyRWxlbWVudFR5cGVnZXRGdW5jdGlvbkFzeW5jT3JTeW5jU3RhckVsZW1lbnRUeXBlZGVmZXJyZWRfbG9hZENvbnN0YW50VmFsdWVDb25zdHJ1Y3RlZENvbnN0YW50VmFsdWVUeXBlQ29uc3RhbnRWYWx1ZURlZmVycmVkR2xvYmFsQ29uc3RhbnRWYWx1ZUluc3RhbnRpYXRpb25Db25zdGFudFZhbHVlS0xvY2FsRnVuY3Rpb25JbXBhY3RVc2VDYXNlV29ybGRJbXBhY3RWaXNpdG9ySW1wbE91dHB1dFVuaXRpc01haW5PdXRwdXRfaW1wb3J0c290aGVyU2l6ZW90aGVySW1wb3J0c2NtcGltcG9ydHNGb3JUZXN0aW5nT3V0cHV0VW5pdChfbWFpbk91dHB1dFVuaXRfYWxsT3V0cHV0VW5pdHNJTVBBQ1RfVVNFRGVmZXJyZWQgbG9hZF9pbXBvcnREZWZlck5hbWVfY2xhc3NUb1NldF9tZW1iZXJUb1NldF9sb2NhbEZ1bmN0aW9uVG9TZXRfY29uc3RhbnRUb1NldF9kZWZlcnJlZEltcG9ydERlc2NyaXB0aW9uc2ltcG9ydFNldHNtYWluU2V0dW5pdERlZmVycmVkIExvYWRpbmdfYWxsRGVmZXJyZWRJbXBvcnRzY29tbW9uRWxlbWVudHNfaXNFeHBsaWNpdGx5RGVmZXJyZWRjbGFzc0ltcG9ydHNUb21lbWJlckltcG9ydHNUb3R5cGVkZWZJbXBvcnRzVG9fY29sbGVjdERpcmVjdE1lbWJlckRlcGVuZGVuY2llc2lzTWVtYmVyVXNlZF9jb2xsZWN0RGVwZW5kZW5jaWVzRnJvbUltcGFjdGNvbGxlY3RDb25zdGFudHNJbkJvZHlfY29sbGVjdEFsbEVsZW1lbnRzQW5kQ29uc3RhbnRzUmVzb2x2ZWRGcm9tQ2xhc3NhZGRMaXZlSW5zdGFuY2VNZW1iZXJfY29sbGVjdFR5cGVEZXBlbmRlbmNpZXNfY29sbGVjdEFsbEVsZW1lbnRzQW5kQ29uc3RhbnRzUmVzb2x2ZWRGcm9tTWVtYmVyaXNHZW5lcmF0aXZlQ29uc3RydWN0b3Jjb2xsZWN0Q29uc3RhbnRzRnJvbU1ldGFkYXRhX2NvbGxlY3RUeXBlQXJndW1lbnREZXBlbmRlbmNpZXN3b3JsZEltcGFjdHZpc2l0SW1wYWN0dmlzaXRTdGF0aWNVc2VzdGF0aWNVc2V1c2VkRW50aXR5VW5leHBlY3RlZCBzdGF0aWMgdXNlIGxvY2FsRnVuY3Rpb25sb2NhbEZ1bmN0aW9uc3Zpc2l0VHlwZVVzZXR5cGVVc2Vpc0ludGVyZmFjZVR5cGVVbmV4cGVjdGVkIHR5cGUgdXNlOiB2aXNpdER5bmFtaWNVc2VkeW5hbWljVXNlX3VwZGF0ZUNvbnN0YW50UmVjdXJzaXZlb2xkU2V0cXVldWVjdXJyZW50U2V0X3VwZGF0ZUNsYXNzUmVjdXJzaXZlZ2V0RGVwZW5kZW5jaWVzVHJpZWQgdG8gYXNzaWduICB0byB0aGUgbWFpbiBvdXRwdXQgdW5pdCwgYnV0IGl0IHdhcyBhc3NpZ25lZCB0byBhZGRDb25zdGFudF9wcm9jZXNzRGVwZW5kZW5jaWVzX3VwZGF0ZU1lbWJlclJlY3Vyc2l2ZV91cGRhdGVMb2NhbEZ1bmN0aW9uX3Nob3VsZEFkZERlZmVycmVkRGVwZW5kZW5jeV9maXhEZXBlbmRlbmN5SW5mbycgaXMgZGVmZXJyZWQgYnV0IGFwcGVhcnMgdG8gYmUgaW5mZXJyZWQgYXMgYSByZXR1cm4gdHlwZSBvciBhIHR5cGUgcGFyYW1ldGVyIChkYXJ0YnVnLmNvbS8zNTMxMSkuX2ZpeENsYXNzRGVwZW5kZW5jeUluZm9fZml4TWVtYmVyRGVwZW5kZW5jeUluZm9fZml4Q29uc3RhbnREZXBlbmRlbmN5SW5mb3JlcHJlc2VudGVkVHlwZUNsYXNzIChpbiBjb25zdGFudCkgVHlwZWRlZiBzaW5nbGV0b25fY3JlYXRlT3V0cHV0VW5pdHNhZGRVbml0aW1wb3J0U2V0X3NldHVwSHVua3NUb0xvYWRodW5rc1RvTG9hZHVzZWRJbXBvcnROYW1lc2NvbXB1dGVJbXBvcnREZWZlck5hbWVzb3J0ZWRPdXRwdXRVbml0c291dHB1dFVuaXRfYnVpbGRSZXN1bHRiYWNrZW5kVXNhZ2VnbG9iYWxGdW5jdGlvbkRlcGVuZGVuY2llc2dsb2JhbENsYXNzRGVwZW5kZW5jaWVzbmV4dEl0ZW1jbGFzc01hcG1lbWJlck1hcGxvY2FsRnVuY3Rpb25NYXBjb25zdGFudE1hcGNsZWFudXBwcmVwYXJlY2hlY2tGb3JEZWZlcnJlZEVycm9yQ2FzZXNpZ25vcmVFbnRpdHlJbkR1bXBkdW1wZWxlbWVudE1hcGlkIGNscyBtZW1iZXJtZW1iZXJDb250ZXh0PGFub255bW91cz4gbG9jYWxpc1ByaW1pdGl2ZXRvU3RydWN0dXJlZFRleHR1bml0VGV4dCA8TUFJTiBVTklUPiBpbXBvcnRzOmVuY2xvc2luZ0xpYnJhcnlVcmkKICAgCiBlbGVtZW50czoKICAKIGNvbnN0YW50czoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KT3V0cHV0IHVuaXQ6IAogSW1wb3J0RGVzY3JpcHRpb25pbXBvcnRpbmdVcmlfaW1wb3J0aW5nTGlicmFyeWltcG9ydGluZ0xpYnJhcnltYWluTGlicmFyeVVyaV9EZWZlcnJlZEltcG9ydEltcG9ydFNldExhdHRpY2VfaW1wb3J0SW5kZXhfZW1wdHlTZXRfYWRkX3dyYXBhSW1wb3J0c2JJbXBvcnRzbGFzdEFJbmRleGxhc3RCSW5kZXhpbXBvcnRBaW1wb3J0QkltcG9ydFNldF90cmFuc2l0aW9uc0ltcG9ydFNldChzaXplOiBXb3JrUXVldWVwZW5kaW5nQ2xhc3Nlc3BlbmRpbmdNZW1iZXJzcGVuZGluZ0NvbnN0YW50c19pbXBvcnRTZXRzaW1wb3J0c1RvQWRkQ2xhc3NXb3JrSXRlbU1lbWJlcldvcmtJdGVtQ29uc3RhbnRXb3JrSXRlbW91dHB1dC11bml0LWRhdGFtYWluT3V0cHV0VW5pdF9jbGFzc1RvVW5pdF9tZW1iZXJUb1VuaXRfbG9jYWxGdW5jdGlvblRvVW5pdF9jb25zdGFudFRvVW5pdG91dHB1dFVuaXRzY29udmVydENsYXNzTWFwY29udmVydE1lbWJlck1hcGNvbnZlcnRDb25zdGFudE1hcGNsYXNzVG9Vbml0bWVtYmVyVG9Vbml0Y29uc3RhbnRUb1VuaXRkZWZlcnJlZEltcG9ydERlc2NyaXB0aW9uc3JlYWRGcm9tRGF0YVNvdXJjZXJlYWRCb29scmVhZExpc3RyZWFkU3RyaW5ncmVhZEltcG9ydHNyZWFkSW50cmVhZENsYXNzTWFwcmVhZE1lbWJlck1hcHJlYWRDb25zdGFudE1hcGltcG9ydERlZmVyTmFtZXJlYWRJbXBvcnRNYXByZWFkU3RyaW5nTWFwd3JpdGVUb0RhdGFTaW5rd3JpdGVCb29sb3V0cHV0VW5pdEluZGljZXN3cml0ZUltcG9ydHN3cml0ZUludHdyaXRlQ2xhc3NNYXB3cml0ZU1lbWJlck1hcHdyaXRlQ29uc3RhbnRNYXB3cml0ZUltcG9ydE1hcHdyaXRlU3RyaW5nTWFwaW1wb3J0RGVzY3JpcHRpb253cml0ZUxpYnJhcnlvdXRwdXRVbml0Rm9yQ2xhc3NvdXRwdXRVbml0Rm9yTWVtYmVyY29uc3RhbnRzRm9yVGVzdGluZ291dHB1dFVuaXRGb3JDb25zdGFudGlzRGVmZXJyZWRDbGFzc2hhc09ubHlOb25EZWZlcnJlZEltcG9ydFBhdGhzb3V0cHV0VW5pdEZyb21vdXRwdXRVbml0VG9oYXNPbmx5Tm9uRGVmZXJyZWRJbXBvcnRQYXRoc1RvQ29uc3RhbnRyZWdpc3RlckNvbnN0YW50RGVmZXJyZWRVc2VyZWdpc3RlckNvbG9jYXRlZE1lbWJlcnNleGlzdGluZ0VudGl0eW5ld0VudGl0eWdldEltcG9ydERlZmVyTmFtZU5vIGRlZmVycmVkIG5hbWUgZm9yIGdldEltcG9ydE5hbWVzY29tcHV0ZURlZmVycmVkTWFwb21pdHRlZFVuaXRzPHVubmFtZWQ+cGFydEZpbGVOYW1lc0RlcGVuZGVuY2llc3JlZ2lzdGVySW1wb3J0RGVwZW5kZW5jeUluZm9UeXBlRGVwZW5kZW5jeVZpc2l0b3JfZGVwZW5kZW5jaWVzX2ltcG9ydF9jb21tb25FbGVtZW50c3Zpc2l0RnV0dXJlT3JUeXBldW5hbGlhc2VkcGFyYW1ldGVyVHlwZXNvcHRpb25hbFBhcmFtZXRlclR5cGVzbmFtZWRQYXJhbWV0ZXJUeXBlc3Zpc2l0RnVuY3Rpb25UeXBlVmFyaWFibGV2aXNpdFR5cGVWYXJpYWJsZVR5cGVkZWZlcnJlZFBhcnRGaWxlTmFtZWFkZEV4dGVuc2lvbm91dFBhdGhvdXROYW1lLnBhcnQuanNkYXJ0MmpzLmRpYWdub3N0aWNzLmNvZGVfbG9jYXRpb25Db2RlTG9jYXRpb25TY2hlbWVMb2NhdGlvblBhY2thZ2VMb2NhdGlvblVyaUxvY2F0aW9uQW55TG9jYXRpb25kdW1wX2luZm9DaHVua2VkQ29udmVyc2lvblNpbmtTdHJpbmdDb252ZXJzaW9uU2lua0ludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZUdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHRqc0FzdEVsZW1lbnRJbmZvQ29sbGVjdG9yX2dsb2JhbEluZmVyZW5jZVJlc3VsdHNfZW50aXR5VG9JbmZvX2NvbnN0YW50VG9JbmZvX291dHB1dFRvSW5mb19jb25zdGFudFRvTm9kZV9ub2RlRGF0YV91bml0SW5mb0ZvckNvbnN0YW50c2hvdWxkS2VlcGltcGFjdHNpbmxpbmVDb3VudGxpYm5hbWVzaXplT2ZmdW5jdGlvbkluZm92aXNpdEZ1bmN0aW9udG9wTGV2ZWxGdW5jdGlvbnNmaWVsZEluZm90b3BMZXZlbFZhcmlhYmxlc2NsYXp6X3Jlc3VsdE9mTWVtYmVycmVzdWx0T2ZNZW1iZXJfcmVzdWx0T2ZQYXJhbWV0ZXJyZXN1bHRPZlBhcmFtZXRlcmNvbnRhaW5pbmdDbGFzc2lzRGVmaW5pdGVseVRydWVjb2RlT2ZfdW5pdEluZm9Gb3JNZW1iZXJmaWVsZERhdGFmaWVsZEFuYWx5c2lzZ2V0RmllbGREYXRhY292ZXJhZ2VJZGNsb3N1cmVTaXplX2FkZENsb3N1cmVJbmZvX3VuaXRJbmZvRm9yQ2xhc3NmdW5jdGlvbnNjbG9zdXJlSW5mb2Nsb3N1cmVzQ2xhc3MgbWVtYmVyIG5vdCBhIGZ1bmN0aW9uIG9yIGZpZWxkZW1pdHRlcm5lZWRlZENsYXNzZXN2aXNpdENsb3N1cmVDbGFzc2NhbGxNZXRob2Rpc0ZhY3RvcnlDb25zdHJ1Y3RvcmluZmVycmVkUGFyYW1ldGVyVHlwZXNmb3JFYWNoUGFyYW1ldGVyQXNMb2NhbHBhcmFtZXRlckluZGV4Zm9yRWFjaFBhcmFtZXRlcmluZmVycmVkUmV0dXJuVHlwZXNpZGVFZmZlY3RzZ2V0U2lkZUVmZmVjdHNPZkVsZW1lbnRpbmxpbmVkQ291bnRmdW5jdGlvbktpbmRuZXN0ZWRDbG9zdXJlc2Nsb3N1cmVfaW5mb0Zyb21PdXRwdXRVbml0Z2VuZXJhdGVkU2l6ZVNlbGVjdGlvbnNlbGVjdGVkRW50aXR5cmVjZWl2ZXJDb25zdHJhaW50SW5mb1JlcG9ydGVycmVwb3J0SW5saW5lZGlubGluZWRGcm9tRHVtcCBpbmZvdXNlQmluYXJ5Rm9ybWF0aW5mb0NvbGxlY3Rvcl9wcm9ncmFtU2l6ZV9lbnRpdHlUb05vZGVzaW5saW5lTWFwX3N0YWNrRHVtcCBJbmZvcmVnaXN0ZXJJbXBhY3RpbXBhY3R1bnJlZ2lzdGVySW1wYWN0Z2V0UmV0YWluaW5nc2VsZWN0aW9uc21hc2tsb2NhdGVNZW1iZXJzcmVnaXN0ZXJFbnRpdHlBc3RyZWdpc3RlckNvbnN0YW50QXN0c2hvdWxkRW1pdFRleHRlbnRlck5vZGVlbWl0X3RleHRleGl0Tm9kZWNsb3NpbmdzaXplT2ZOb2RlYXN0YWxsSW5mb2J1aWxkRHVtcEluZm9EYXRhZHVtcEluZm9CaW5hcnlkdW1wSW5mb0pzb25qc29uQnVmZmVyc3RhcnRDaHVua2VkQ29udmVyc2lvbmlzQmFja3dhcmRDb21wYXRpYmxlaW5mby5qc29uVmlldyB0aGUgZHVtcGVkIC5pbmZvLmpzb24gZmlsZSBhdCBodHRwczovL2RhcnQtbGFuZy5naXRodWIuaW8vZHVtcC1pbmZvLXZpc3VhbGl6ZXIuaW5mby5kYXRhVXNlIGBwYWNrYWdlOmRhcnQyanNfaW5mb2AgdG8gcGFyc2UgYW5kIHByb2Nlc3MgdGhlIGR1bXBlZCAuaW5mby5kYXRhIGZpbGUuc3RvcHdhdGNoZnVuY3Rpb25FbnRpdGllc3VzZXNzZWxlY3Rpb251c2VJbmZvZmllbGRFbnRpdHlvdXRlckluZm9pbmxpbmVkaW5saW5lZEluZm9kZWZlcnJlZEZpbGVzZW50cnlwb2ludGRhcnQyanNWZXJzaW9uY29tcGlsYXRpb25Nb21lbnRjb21waWxhdGlvbkR1cmF0aW9udG9Kc29uRHVyYXRpb25kdW1wSW5mb0R1cmF0aW9ubm9TdWNoTWV0aG9kRW5hYmxlZGlzTm9TdWNoTWV0aG9kVXNlZGlzUnVudGltZVR5cGVVc2VkaXNJc29sYXRlSW5Vc2Vpc0Z1bmN0aW9uQXBwbHlVc2VkaXNNaXJyb3JzVXNlZG1pbmlmaWVkX0NvZGVEYXRhZW50aXRpZXNFbnRpdHlMaWJyYXJ5RW50aXR5SW1wb3J0RW50aXR5aW1wb3J0KCBkZWZlcnJlZENsYXNzRW50aXR5aXNDbG9zdXJlVHlwZWRlZkVudGl0eVR5cGVWYXJpYWJsZUVudGl0eXR5cGVEZWNsYXJhdGlvbkZpZWxkRW50aXR5RnVuY3Rpb25FbnRpdHlwYXJhbWV0ZXJTdHJ1Y3R1cmVTWU5DX1NUQVJpc1lpZWxkaW5nQVNZTkNfU1RBUmFzeW5jUGFyc2VyU3RhdGVDb25zdHJ1Y3RvckVudGl0eUNvbnN0cnVjdG9yQm9keUVudGl0eUxvY2FsUGFyYW1ldGVyU3RydWN0dXJlcGFyYW1ldGVyLXN0cnVjdHVyZXJlcXVpcmVkUGFyYW1ldGVyc2Zyb21UeXBlcmVhZFN0cmluZ3N3cml0ZVN0cmluZ3NvcHRpb25hbFBhcmFtZXRlcnN0b3RhbFBhcmFtZXRlcnNjYWxsU3RydWN0dXJlc2hvcnRUZXh0UGFyYW1ldGVyU3RydWN0dXJlKHJlcXVpcmVkUGFyYW1ldGVycz1wb3NpdGlvbmFsUGFyYW1ldGVycz1uYW1lZFBhcmFtZXRlcnM9e30sdHlwZVBhcmFtZXRlcnM9ZGFydDJqcy5lbnF1ZXVlQ29uc3RhbnRVc2VEeW5hbWljVXNlU3RhdGljVXNlU3RhdGljVXNlS2luZFR5cGVVc2VUeXBlVXNlS2luZFdvcmxkSW1wYWN0VmlzaXRvcl9yZXNvbHV0aW9uY29kZWdlbkVucXVldWVyRm9yVGVzdGluZ0VucXVldWVSZXNvbHV0aW9uRW5xdWV1ZXIgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0Lm9uRW1wdHlGb3JUZXN0aW5nc2tpcEVucXVldWVyQ2hlY2tGb3JUZXN0aW5naXNSZXNvbHV0aW9uUXVldWVxdWV1ZUlzRW1wdHlFbnF1ZXVlckxpc3RlbmVycmVnaXN0ZXJJbnN0YW50aWF0ZWRUeXBlaXNHbG9iYWxuYXRpdmVVc2FnZXJlZ2lzdGVySW5zdGFudGlhdGVkQ2xhc3NyZWdpc3RlckltcGxlbWVudGVkQ2xhc3NyZWdpc3RlckdldE9mU3RhdGljRnVuY3Rpb25yZWdpc3RlckNsb3N1cml6ZWRNZW1iZXJyZWdpc3RlclVzZWRFbGVtZW50cmVnaXN0ZXJVc2VkQ29uc3RhbnRvblF1ZXVlT3Blbm9uUXVldWVFbXB0eXJlY2VudENsYXNzZXNvblF1ZXVlQ2xvc2VkRW5xdWV1ZXJJbXBsX2ltcGFjdFN0cmF0ZWd5Y2hlY2tDbGFzc3Byb2Nlc3NTdGF0aWNVc2Vwcm9jZXNzVHlwZVVzZXByb2Nlc3NEeW5hbWljVXNlcHJvY2Vzc0NvbnN0YW50VXNlY29uc3RhbnRVc2VjaGVja0VucXVldWVyQ29uc2lzdGVuY3lkaXJlY3RseUluc3RhbnRpYXRlZENsYXNzZXNfb3B0aW9uc19yZWNlbnRDbGFzc2VzX3JlY2VudENvbnN0YW50c193b3JsZEJ1aWxkZXJfd29ya0l0ZW1CdWlsZGVyX2ltcGFjdFZpc2l0b3JfcXVldWVyZXNvbHV0aW9uIGVucXVldWVyIHF1ZXVlIGlzIG5vdCBlbXB0eS5fcmVnaXN0ZXJJbnN0YW50aWF0ZWRUeXBlZ2xvYmFsRGVwZW5kZW5jeWlzUmVkaXJlY3Rpb25yZWdpc3RlclR5cGVJbnN0YW50aWF0aW9uX2FwcGx5Q2xhc3NVc2Vwcm9jZXNzQ2xhc3NNZW1iZXJzdXNlU2V0VW5lbnF1ZXVlZCB1c2Ugb2YgZHJ5UnVuX2FwcGx5TWVtYmVyVXNlX2FkZFRvV29ya0xpc3RfcmVnaXN0ZXJDbG9zdXJpemVkTWVtYmVyZ2V0IG9mIHN0YXRpYyBmdW5jdGlvbmluc3RhbnRpYXRlZCBjbGFzc2ltcGxlbWVudGVkIGNsYXNzcmVnaXN0ZXJEeW5hbWljVXNlcmVnaXN0ZXJDb25zdGFudFVzZWNvbnN0YW50IHVzZXJlZ2lzdGVyU3RhdGljVXNlX3JlZ2lzdGVySXNDaGVja3JlZ2lzdGVyVHlwZVZhcmlhYmxlVHlwZUxpdGVyYWxyZWdpc3RlcklzQ2hlY2tjbG9zdXJpemVkIG1lbWJlcl9mb3JFYWNoaXNNZW1iZXJQcm9jZXNzZWRyZWdpc3RlclByb2Nlc3NlZE1lbWJlcnJlY2VudHNfb25RdWV1ZUVtcHR5RW5xdWV1ZXIocHJvY2Vzc2VkTWVtYmVyc3JlZ2lzdGVyUHJvY2Vzc2VkRWxlbWVudEludGVybmFsd29ya0l0ZW1jcmVhdGVXb3JrSXRlbVJlc29sdXRpb24gd29yayBsaXN0IGlzIGNsb3NlZC4gVHJ5aW5nIHRvIGFkZCB1c2VkIGVsZW1lbnRFbnF1ZXVlckltcGxJbXBhY3RWaXNpdG9ydmlzaXRDb25zdGFudFVzZVdvcmtJdGVtQnVpbGRlcmRhcnQyanMuZnJvbnRlbmRfc3RyYXRlZ3lLRmllbGRBbmFseXNpc05hdGl2ZVJlc29sdXRpb25FbnF1ZXVlckZyb250ZW5kU3RyYXRlZ3lkYXJ0VHlwZXNhbm5vdGF0aW9uUHJvY2Vzc29yY3JlYXRlTmF0aXZlQ2xhc3NGaW5kZXJjcmVhdGVOb1N1Y2hNZXRob2RSZXNvbHZlcnJ1bnRpbWVUeXBlc05lZWRCdWlsZGVyRm9yVGVzdGluZ2NyZWF0ZVJlc29sdXRpb25Xb3JsZEJ1aWxkZXJuYXRpdmVEYXRhQnVpbGRlcmludGVyY2VwdG9yRGF0YUJ1aWxkZXJiYWNrZW5kVXNhZ2VCdWlsZGVycnRpTmVlZEJ1aWxkZXJhbGxvY2F0b3JBbmFseXNpc25hdGl2ZVJlc29sdXRpb25FbnF1ZXVlcm5vU3VjaE1ldGhvZFJlZ2lzdHJ5YW5ub3RhdGlvbnNEYXRhQnVpbGRlcmNsYXNzSGllcmFyY2h5QnVpbGRlcmNsYXNzUXVlcmllc2NyZWF0ZVJlc29sdXRpb25Xb3JrSXRlbUJ1aWxkZXJpbXBhY3RUcmFuc2Zvcm1lcmltcGFjdEJ1aWxkZXJjcmVhdGVSdW50aW1lVHlwZXNOZWVkQnVpbGRlcmNyZWF0ZUNsYXNzUXVlcmllc0Fubm90YXRpb25Qcm9jZXNzb3JleHRyYWN0TmF0aXZlQW5ub3RhdGlvbnNleHRyYWN0SnNJbnRlcm9wQW5ub3RhdGlvbnNwcm9jZXNzSnNJbnRlcm9wQW5ub3RhdGlvbnNGcm9udGVuZFN0cmF0ZWd5QmFzZW5hdGl2ZUJhc2ljRGF0YUJ1aWxkZXJfbmF0aXZlQmFzaWNEYXRhTmF0aXZlQmFzaWNEYXRhIGhhcyBub3QgYmVlbiBjb21wdXRlZCB5ZXQuSW1wYWN0Q2FjaGVEZWxldGVyZGFydDJqcy5hYnN0cmFjdF92YWx1ZV9kb21haW5QcmltaXRpdmVDb25zdGFudFZhbHVlQWJzdHJhY3RCb29sVHJ1ZUZhbHNlTWF5YmVpc0RlZmluaXRlbHlGYWxzZWlzUG90ZW50aWFsbHlGYWxzZXRydWVPck1heWJldHJ1ZU9yRmFsc2VtYXliZU9yRmFsc2VBYnN0cmFjdEJvb2wuY3JlYXRlRG9tYWluY3JlYXRlU2VsZWN0b3JTdHJhdGVneUFic3RyYWN0VmFsdWVBYnN0cmFjdFZhbHVlRG9tYWlubm9uTnVsbFR5cGVncm93YWJsZUxpc3RUeXBlZml4ZWRMaXN0VHlwZXVpbnQzMVR5cGV1aW50MzJUeXBlcG9zaXRpdmVJbnRUeXBlY29uc3RMaXN0VHlwZWNvbnN0U2V0VHlwZWNvbnN0TWFwVHlwZWVtcHR5VHlwZXN5bmNTdGFySXRlcmFibGVUeXBlYXN5bmNGdXR1cmVUeXBlYXN5bmNTdGFyU3RyZWFtVHlwZWNyZWF0ZU5vbk51bGxFeGFjdGNyZWF0ZU51bGxhYmxlRXhhY3RjcmVhdGVOb25OdWxsU3ViY2xhc3NjcmVhdGVOb25OdWxsU3VidHlwZWNyZWF0ZU51bGxhYmxlU3VidHlwZWlzVHlwZWRBcnJheWNvdWxkQmVUeXBlZEFycmF5ZXhjbHVkZU51bGxpbmNsdWRlTnVsbGNvbnRhaW5zVHlwZWNvbnRhaW5zT25seVR5cGVpc0luc3RhbmNlT2ZPck51bGxpc0luc3RhbmNlT2Zpc0V4YWN0aXNFeGFjdE9yTnVsbGdldEV4YWN0Q2xhc3Npc051bGxpc1ByaW1pdGl2ZU51bWJlcmlzUHJpbWl0aXZlQm9vbGVhbmlzUHJpbWl0aXZlQXJyYXlpc0luZGV4YWJsZVByaW1pdGl2ZWlzRml4ZWRBcnJheWlzRXh0ZW5kYWJsZUFycmF5aXNNdXRhYmxlQXJyYXlpc011dGFibGVJbmRleGFibGVpc0FycmF5aXNQcmltaXRpdmVTdHJpbmdpc0ludGVyY2VwdG9yaXNJbnRlZ2VyaXNVSW50MzJpc1VJbnQzMWlzUG9zaXRpdmVJbnRlZ2VyaXNQb3NpdGl2ZUludGVnZXJPck51bGxpc0ludGVnZXJPck51bGxpc051bWJlcmlzTnVtYmVyT3JOdWxsaXNEb3VibGVpc0RvdWJsZU9yTnVsbGlzQm9vbGVhbmlzQm9vbGVhbk9yTnVsbGlzU3RyaW5naXNTdHJpbmdPck51bGxpc1ByaW1pdGl2ZU9yTnVsbHVuaW9uT2ZNYW55YXJlRGlzam9pbnRjb21wdXRlQWJzdHJhY3RWYWx1ZUZvckNvbnN0YW50aXNDb250YWluZXJjcmVhdGVDb250YWluZXJWYWx1ZW9yaWdpbmFsVmFsdWVhbGxvY2F0aW9uTm9kZWFsbG9jYXRpb25FbGVtZW50Z2V0Q29udGFpbmVyRWxlbWVudFR5cGVnZXRDb250YWluZXJMZW5ndGhjcmVhdGVTZXRWYWx1ZWdldFNldEVsZW1lbnRUeXBlY3JlYXRlTWFwVmFsdWVnZXRNYXBLZXlUeXBlZ2V0TWFwVmFsdWVUeXBlaXNEaWN0aW9uYXJ5Y3JlYXRlRGljdGlvbmFyeVZhbHVlbWFwcGluZ3Njb250YWluc0RpY3Rpb25hcnlLZXlnZXREaWN0aW9uYXJ5VmFsdWVGb3JLZXlpc1NwZWNpYWxpemF0aW9uT2ZzcGVjaWFsaXphdGlvbmdlbmVyYWxpemF0aW9uZ2V0R2VuZXJhbGl6YXRpb25nZXRBbGxvY2F0aW9uTm9kZWdldEFsbG9jYXRpb25FbGVtZW50aXNQcmltaXRpdmVWYWx1ZWNyZWF0ZVByaW1pdGl2ZVZhbHVlZ2V0UHJpbWl0aXZlVmFsdWVjb21wdXRlUmVjZWl2ZXJuZWVkc05vU3VjaE1ldGhvZEhhbmRsaW5nZ2V0QWJzdHJhY3RWYWx1ZUZvck5hdGl2ZU1ldGhvZFBhcmFtZXRlclR5cGVzdXBlcnNldHN1YnNldGlzSW5sb2NhdGVTaW5nbGVNZW1iZXJpc0pzSW5kZXhhYmxlQW5kSXRlcmFibGVpc0ZpeGVkTGVuZ3RoSnNJbmRleGFibGVnZXRDb21wYWN0VGV4dHJlYWRBYnN0cmFjdFZhbHVlRnJvbURhdGFTb3VyY2V3cml0ZUFic3RyYWN0VmFsdWVUb0RhdGFTaW5rVHJpdmlhbEFic3RyYWN0VmFsdWVUcml2aWFsQWJzdHJhY3RWYWx1ZURvbWFpblRyaXZpYWxBYnN0cmFjdFZhbHVlRG9tYWluLmdldERpY3Rpb25hcnlWYWx1ZUZvcktleVRyaXZpYWxBYnN0cmFjdFZhbHVlRG9tYWluLmNvbnRhaW5zRGljdGlvbmFyeUtleVRyaXZpYWxBYnN0cmFjdFZhbHVlRG9tYWluLmdldE1hcFZhbHVlVHlwZVRyaXZpYWxBYnN0cmFjdFZhbHVlRG9tYWluLmdldE1hcEtleVR5cGVUcml2aWFsQWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRTZXRFbGVtZW50VHlwZVRyaXZpYWxBYnN0cmFjdFZhbHVlRG9tYWluLmdldENvbnRhaW5lckVsZW1lbnRUeXBlVHJpdmlhbFNlbGVjdG9yU3RyYXRlZ3ljcmVhdGVTZWxlY3RvckNvbnN0cmFpbnRzaW5pdGlhbENvbnN0cmFpbnRhcHBsaWVkVW5uYW1lZHdvcmxkYXBwbGllc1VubmFtZWRUcml2aWFsVW5pdmVyc2VTZWxlY3RvckNvbnN0cmFpbnRzYWRkUmVjZWl2ZXJDb25zdHJhaW50Y29uc3RyYWludGNhbkhpdFRyaXZpYWxVbml2ZXJzZVNlbGVjdG9yQ29uc3RyYWludHM6bWFza3NpclVuaXZlcnNlU2VsZWN0b3JDb25zdHJhaW50c1NlbGVjdG9yQ29uc3RyYWludHNTdHJhdGVneVR5cGVHcmFwaEluZmVycmVyY29udGFpbmVyX3R5cGVfbWFzay5kYXJ0ZGljdGlvbmFyeV90eXBlX21hc2suZGFydGZsYXRfdHlwZV9tYXNrLmRhcnRmb3J3YXJkaW5nX3R5cGVfbWFzay5kYXJ0bWFwX3R5cGVfbWFzay5kYXJ0c2V0X3R5cGVfbWFzay5kYXJ0dHlwZV9tYXNrLmRhcnR1bmlvbl90eXBlX21hc2suZGFydHZhbHVlX3R5cGVfbWFzay5kYXJ0Q29tbW9uTWFza3NfY2xvc2VkV29ybGRfZHluYW1pY1R5cGVfbm9uTnVsbFR5cGVfbnVsbFR5cGVfaW50VHlwZV91aW50MzJUeXBlX3VpbnQzMVR5cGVfcG9zaXRpdmVJbnRUeXBlX2RvdWJsZVR5cGVfbnVtVHlwZV9ib29sVHlwZV9mdW5jdGlvblR5cGVfbGlzdFR5cGVfY29uc3RMaXN0VHlwZV9maXhlZExpc3RUeXBlX2dyb3dhYmxlTGlzdFR5cGVfc2V0VHlwZV9jb25zdFNldFR5cGVfbWFwVHlwZV9jb25zdE1hcFR5cGVfc3RyaW5nVHlwZV90eXBlVHlwZV9zeW5jU3Rhckl0ZXJhYmxlVHlwZV9hc3luY0Z1dHVyZVR5cGVfYXN5bmNTdGFyU3RyZWFtVHlwZV9pbmRleGFibGVQcmltaXRpdmVUeXBlX3JlYWRhYmxlQXJyYXlUeXBlX211dGFibGVBcnJheVR5cGVfdW5tb2RpZmlhYmxlQXJyYXlUeXBlX2ludGVyY2VwdG9yVHlwZV9jYW5vbmljYWxpemVkVHlwZU1hc2tzZ2V0Q2FjaGVkTWFza2NyZWF0ZU1hc2tjYWNoZWRNYXNrc2luZGV4YWJsZVByaW1pdGl2ZVR5cGVyZWFkYWJsZUFycmF5VHlwZW11dGFibGVBcnJheVR5cGV1bm1vZGlmaWFibGVBcnJheVR5cGVpbnRlcmNlcHRvclR5cGVzYXRpc2ZpZXNpbnRlcnNlY3Rzbm9uTnVsbGFibGVudWxsYWJsZXR5cGVNYXNrX2NvbnRhaW5zVHlwZV9jb250YWluc09ubHlUeXBlY29udGFpbnNPbmx5X2lzSW5zdGFuY2VPZk9yTnVsbGlzSW1wbGVtZW50ZWRleHByZXNzaW9uTWFza2lzRGlzam9pbnRpc051bGxhYmxlX2lzTnVsbHNpbmdsZUNsYXNzaXNWYWx1ZXZhbHVlTWFza19jYW5CZVByaW1pdGl2ZU51bWJlcl9jYW5CZVByaW1pdGl2ZUFycmF5X2NhbkJlUHJpbWl0aXZlQm9vbGVhbl9jYW5CZVByaW1pdGl2ZVN0cmluZ19pc0luZGV4YWJsZVByaW1pdGl2ZWNvbnRhaW5zT25seVN0cmluZ2NvbnRhaW5zT25seUludGNvbnRhaW5zT25seU51bV9pc051bWJlck9yTnVsbGNvbnRhaW5zT25seURvdWJsZWNvbnRhaW5zT25seUJvb2xfaXNCb29sZWFuT3JOdWxsX2lzUHJpbWl0aXZlT3JOdWxsZm9yd2FyZFRvaGFzQW55U3RyaWN0U3ViY2xhc3NtaXhpblVzZXNPZmNvbnRhaW5zTWFza2lzSW5NYXNrZ2V0VmFsdWVGb3JLZXlyZWFkQ2FjaGVkd3JpdGVDYWNoZWRDb250YWluZXJUeXBlTWFza2NvbnRhaW5lci10eXBlLW1hc2tyZWFkVHJlZU5vZGVPck51bGxyZWFkTWVtYmVyT3JOdWxscmVhZEludE9yTnVsbHdyaXRlRW51bXdyaXRlVHJlZU5vZGVPck51bGx3cml0ZU1lbWJlck9yTnVsbHdyaXRlSW50T3JOdWxsZXF1YWxzRGlzcmVnYXJkTnVsbGZvcndhcmRJbnRlcnNlY3Rpb25pc0VtcHR5T3JOdWxsbmV3RWxlbWVudFR5cGVuZXdGb3J3YXJkVG9Db250YWluZXIoLCBlbGVtZW50OiAsIGxlbmd0aDogRGljdGlvbmFyeVR5cGVNYXNrZGljdGlvbmFyeS10eXBlLW1hc2tfdHlwZU1hcHR5cGVNYXBuZXdLZXlUeXBlbmV3VmFsdWVUeXBlRGljdGlvbmFyeSgsIGtleTogdmFsdWU6ICwgbWFwOiBGbGF0VHlwZU1hc2tmbGF0LXR5cGUtbWFza0VNUFRZRVhBQ1RTVUJDTEFTU1NVQlRZUEVleGFjdG5vbk51bGxFbXB0eW5vbk51bGxFeGFjdG5vbk51bGxTdWJjbGFzc25vbk51bGxTdWJ0eXBlbm9ybWFsaXplZGhhc0FueVN0cmljdFN1YnR5cGVoYXNPbmx5U3ViY2xhc3Nlc2NvbW1vbk1hc2tzcmVhZENsYXNzT3JOdWxsd3JpdGVDbGFzc09yTnVsbF9jbGFzc1F1ZXJ5aXNTdWJjbGFzc2lzVW5pb25pc0ZvcndhcmRpbmdpc1NpbmdsZUltcGxlbWVudGF0aW9uT2ZmbGF0T3RoZXJvdGhlckJhc2V1bmlvblNhbWV1bmlvblN0cmljdFN1YmNsYXNzdW5pb25TdHJpY3RTdWJ0eXBlY29tYmluZWRjb21tb25TdWJjbGFzc2VzX2lzRGlzam9pbnRIZWxwZXJzdHJpY3RTdWJjbGFzc2VzT2ZzdHJpY3RTdWJ0eXBlc09maW50ZXJzZWN0aW9uU2FtZWludGVyc2VjdGlvblN0cmljdFN1YmNsYXNzaW50ZXJzZWN0aW9uRW1wdHloYXNFbGVtZW50SW5oYXNBbnlTdWJjbGFzc1RoYXRNaXhlc2hhc0FueVN1YmNsYXNzVGhhdEltcGxlbWVudHNoYXNBbnlTdWJjbGFzc09mTWl4aW5Vc2VUaGF0SW1wbGVtZW50c21peGluVXNlc25lZWRzTm9TdWNoTWV0aG9kaW5jbHVkZXNDbG9zdXJlQ2FsbGVuY2xvc2luZ2V2ZXJ5U3VidHlwZUlzU3ViY2xhc3NPZk9yTWl4aW5Vc2VPZmlzU3ViY2xhc3NPZk1peGluVXNlT2ZvdGhlck1hc2tbZW1wdHldbnVsbHxleGFjdD1zdWJjbGFzcz1zdWJ0eXBlPUZvcndhcmRpbmdUeXBlTWFza1N1YmNsYXNzIHNob3VsZCBpbXBsZW1lbnQgaGFzaENvZGUgZ2V0dGVyQWxsb2NhdGlvblR5cGVNYXNrTWFwVHlwZU1hc2ttYXAtdHlwZS1tYXNrbmV3TWFwVHlwZU1hc2tNYXAoLCB2YWx1ZTogU2V0VHlwZU1hc2tzZXQtdHlwZS1tYXNrU2V0KEluY3JlYXNpbmdUeXBlTWFza1NldGlzQWxsX21hc2tzPGFsbD48bm9uZT5UeXBlTWFza1NlbGVjdG9yU3RyYXRlZ3lUeXBlTWFza0tpbmRmbGF0VHlwZU1hc2tLaW5kLmZsYXRUeXBlTWFza0tpbmQudW5pb25jb250YWluZXJUeXBlTWFza0tpbmQuY29udGFpbmVyVHlwZU1hc2tLaW5kLnNldFR5cGVNYXNrS2luZC5tYXBkaWN0aW9uYXJ5VHlwZU1hc2tLaW5kLmRpY3Rpb25hcnlUeXBlTWFza0tpbmQudmFsdWVUeXBlTWFza0Nhbm5vdCBjcmVhdGUgZXhhY3QgdHlwZSBtYXNrIGZvciB1bmluc3RhbnRpYXRlZCAuCmV4YWN0T3JFbXB0eUNhbm5vdCBjcmVhdGUgc3ViY2xhc3MgdHlwZSBtYXNrIGZvciB1bmluc3RhbnRpYXRlZCB0b3Btb3N0Z2V0THViT2ZJbnN0YW50aWF0ZWRTdWJjbGFzc2VzZ2V0THViT2ZJbnN0YW50aWF0ZWRTdWJ0eXBlc25vbk51bGxFeGFjdE9yRW1wdHl1bmlvbk9mcmVhZEVudW1VbmV4cGVjdGVkIFR5cGVNYXNrS2luZCBub25Gb3J3YXJkaW5nTWFza2Fzc2VydElzTm9ybWFsaXplZCBpcyBub3Qgbm9ybWFsaXplZDogZ2V0Tm90Tm9ybWFsaXplZFJlYXNvbkV4YWN0ICBpcyBub3QgaW5zdGFudGlhdGVkLlN1YmNsYXNzICBkb2VzIG5vdCBoYXZlIGFueSBzdWJjbGFzc2VzLlN1YnR5cGUgIG9ubHkgaGFzIHN1YmNsYXNzZXMuc3VibWFza2Rpc2pvaW50TWFza3NzdWJtYXNrUmVhc29uU3VibWFzayBVbmtub3duIHR5cGUgbWFzayBVbmlvblR5cGVNYXNrdW5pb24tdHlwZS1tYXNrTUFYX1VOSU9OX0xFTkdUSFBFUkZPUk1fRVhUUkFfQ09OVEFJTlNfQ0hFQ0tkaXNqb2ludHVuaW9uT2ZIZWxwZXJmbGF0TWFza2luTGlzdEluZGV4Y292ZXJlZG5ld01hc2tyZW1vdmVBdGZsYXR0ZW51c2VTdWJjbGFzc21hc2tzQmFzZXNjYW5kaWRhdGVzY29tbW9uU3VwZXJ0eXBlc09mYmVzdEVsZW1lbnRiZXN0S2luZGJlc3RTaXplaXNJbnN0YW50aWF0ZWRTdHJpY3RTdWJjbGFzc2lzRXhwbGljaXRseUluc3RhbnRpYXRlZHN0cmljdFN1YmNsYXNzQ291bnRzdHJpY3RTdWJ0eXBlQ291bnRuZXdMaXN0aW50ZXJzZWN0aW9uc25ld0l0ZXJhYmxlc2xvd0NvbnRhaW5zQ2hlY2tjb250YWluZWRJbkFueU9mbWFza0Rpc3JlZ2FyZE51bGxkaXNqb2ludE1hc2tjb250YWluZWRUeXBlTWFzayBiYXNlZCBjb250YWlubWVudCBjaGVjayBmYWlsZWQgZm9yIG1hc2tzU3RyaW5nVW5pb24oVmFsdWVUeXBlTWFza3ZhbHVlLXR5cGUtbWFza3JlYWRDb25zdGFudHdyaXRlQ29uc3RhbnRWYWx1ZShmb3JtYXRUeXBlRW1wdHludWxsRmxhZ3N1YkZsYWcgfCBiYXNlVHlwZWlzQ2FsbGVkT25jZXRocm93c0Fsd2F5c3R5cGVPZlNlbmR0eXBlT2ZHZXR0ZXJ0eXBlT2ZJdGVyYXRvcnR5cGVPZkl0ZXJhdG9yTW92ZU5leHR0eXBlT2ZJdGVyYXRvckN1cnJlbnRHbG9iYWxUeXBlSW5mZXJlbmNlRWxlbWVudERhdGFjb21wcmVzc1R5cGVzSW5mZXJyZXJhbmFseXplTWFpbmlzVHJpdmlhbHR5cGVPZlNlbGVjdG9yaXNGaXhlZEFycmF5Q2hlY2tlZEZvckdyb3dhYmxldHlwZU9mTmV3TGlzdHR5cGVPZkxpc3RMaXRlcmFsVHlwZSBpbmZlcmVuY2V0eXBlc0luZmVycmVySW50ZXJuYWxyZXN1bHRzRm9yVGVzdGluZ21haW5FbGVtZW50bm9TdWNoTWV0aG9kRGF0YWNhdGVnb3JpemVDb21wbGV4SW1wbGVtZW50YXRpb25zR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHNJbXBsZ2xvYmFsLXR5cGUtaW5mZXJlbmNlLXJlc3VsdHNfZGVhZEZpZWxkUmVzdWx0X2RlYWRNZXRob2RSZXN1bHRfdHJpdmlhbFBhcmFtZXRlclJlc3VsdG1lbWJlclJlc3VsdHNwYXJhbWV0ZXJSZXN1bHRzY2hlY2tlZEZvckdyb3dhYmxlTGlzdHNyZXR1cm5zTGlzdEVsZW1lbnRUeXBlU2V0X2FsbG9jYXRlZExpc3RzcmVhZExvY2FsTWFwcmVhZFRyZWVOb2Rlc2FsbG9jYXRlZExpc3RzcmVhZFRyZWVOb2RlTWFwd3JpdGVMb2NhbE1hcHdyaXRlVHJlZU5vZGVzd3JpdGVUcmVlTm9kZU1hcHVuZXhwZWN0ZWQgaW5wdXQ6IENvbnN0cnVjdG9yQm9keUVsZW1lbnRzIGFyZSBjcmVhdGVkIGFmdGVyIGdsb2JhbCB0eXBlIGluZmVyZW5jZSwgbm8gZGF0YSBpcyBhdmFpYWJsZSBmb3IgdGhlbS5pc0Nsb3N1cmVDYWxsaXNJbmRleFNldHJldHVybnNMaXN0RWxlbWVudFR5cGVyZXR1cm5zTWFwVmFsdWVUeXBldHlwZU9mTWVtYmVyV2l0aFNlbGVjdG9yaXNJbmRleFVuZXhwZWN0ZWQgbWVtYmVyIGN0b3JDYWxsR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdEltcGxnbG9iYWwtdHlwZS1pbmZlcmVuY2UtbWVtYmVyLXJlc3VsdF9kYXRhcmVhZFZhbHVlT3JOdWxsd3JpdGVWYWx1ZU9yTnVsbFRyaXZpYWxHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0c190cml2aWFsTWVtYmVyUmVzdWx0VHJpdmlhbEdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHRUcml2aWFsR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdC53cml0ZVRvRGF0YVNpbmtEZWFkRmllbGRHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0ZG9tYWluRGVhZEZpZWxkR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdC53cml0ZVRvRGF0YVNpbmtEZWFkTWV0aG9kR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdGRhcnQyanMuc291cmNlX2luZm9ybWF0aW9uSmF2YVNjcmlwdE5vZGVTb3VyY2VJbmZvcm1hdGlvbnN0YXJ0UG9zaXRpb25pbm5lclBvc2l0aW9uZW5kUG9zaXRpb25zb3VyY2VMb2NhdGlvbnNpbmxpbmluZ0NvbnRleHRGcmFtZUNvbnRleHRjYWxsSW5mb3JtYXRpb25pbmxpbmVkTWV0aG9kTmFtZShGcmFtZUNvbnRleHQ6IFNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3ljcmVhdGVCdWlsZGVyRm9yQ29udGV4dGJ1aWxkU291cmNlTWFwcGVkTWFya2Vyb25Db21wbGV0ZVNvdXJjZUluZm9ybWF0aW9uQnVpbGRlcmZvckNvbnRleHRidWlsZERlY2xhcmF0aW9uYnVpbGRTdHViYnVpbGRHZW5lcmljYnVpbGRDcmVhdGVidWlsZFJldHVybmJ1aWxkSW1wbGljaXRSZXR1cm5idWlsZExvb3BidWlsZEdldGJ1aWxkU2V0YnVpbGRDYWxsYnVpbGRJZmJ1aWxkTmV3YnVpbGRUaHJvd2J1aWxkQXNzZXJ0YnVpbGRBc3NpZ25tZW50YnVpbGRWYXJpYWJsZURlY2xhcmF0aW9uYnVpbGRBd2FpdGJ1aWxkWWllbGRidWlsZEFzeW5jQm9keWJ1aWxkQXN5bmNFeGl0YnVpbGRGb3JlaWduQ29kZWJ1aWxkU3RyaW5nSW50ZXJwb2xhdGlvbmJ1aWxkRm9ySW5JdGVyYXRvcmJ1aWxkRm9ySW5Nb3ZlTmV4dGJ1aWxkRm9ySW5DdXJyZW50YnVpbGRGb3JJblNldGJ1aWxkSW5kZXhidWlsZEluZGV4U2V0YnVpbGRCaW5hcnlidWlsZFVuYXJ5YnVpbGRUcnlidWlsZENhdGNoYnVpbGRJc2J1aWxkQXNidWlsZFN3aXRjaGJ1aWxkU3dpdGNoQ2FzZWJ1aWxkTGlzdExpdGVyYWxidWlsZEdvdG9Tb3VyY2VMb2NhdGlvbnNvdXJjZVVyaXNvdXJjZU5hbWVpc1ZhbGlkOltBYnN0cmFjdFNvdXJjZUxvY2F0aW9uX3NvdXJjZUZpbGVfbG9jYXRpb25JbnZhbGlkIHNvdXJjZSBsb2NhdGlvbiBpbiBvZmZzZXQ9LCBsZW5ndGg9ZnJvbUxvY2F0aW9uZnJvbU90aGVyT2Zmc2V0U291cmNlTG9jYXRpb25Ob1NvdXJjZUxvY2F0aW9uTWFya2Vyc2hvcnROYW1lPG5vLWxvY2F0aW9uPkZyYW1lRW50cnlwdXNoTG9jYXRpb25pc0VtcHR5UG9wcHVzaHBvcGlzUHVzaGlzUG9wY29tcHV0ZUVsZW1lbnROYW1lRm9yU291cmNlTWFwc2NvbXB1dGVTdHViU3VmZml4W2Z1bmN0aW9uLWVudHJ5JHBvc2l0aW9uYWxBcmd1bWVudENvdW50Z2V0T3JkZXJlZE5hbWVkQXJndW1lbnRzanNfYmFja2VuZC5iYWNrZW5kSW1wYWN0VHJhbnNmb3JtZXJDb2RlZ2VuUmVnaXN0cnlDb2RlZ2VuV29ya0l0ZW1Db2RlRW1pdHRlclRhc2tTb3J0ZXJTc2FGdW5jdGlvbkNvbXBpbGVyQ2xhc3NRdWVyaWVzRnVuY3Rpb25Db21waWxlckZ1bmN0aW9uSW5saW5lQ2FjaGVfdW5rbm93bl9tdXN0Tm90SW5saW5lX21heUlubGluZUluTG9vcE11c3ROb3RPdXRzaWRlX2NhbklubGluZUluTG9vcE11c3ROb3RPdXRzaWRlX2NhbklubGluZUluTG9vcE1heUlubGluZU91dHNpZGVfY2FuSW5saW5lX2NhY2hlZERlY2lzaW9uc190cnlJbmxpbmVGdW5jdGlvbnNmb3JFYWNoTm9JbmxpbmVtYXJrQXNOb25JbmxpbmFibGVmb3JFYWNoVHJ5SW5saW5lbWFya0FzVHJ5SW5saW5lY2hlY2tGdW5jdGlvbmdldEN1cnJlbnRDYWNoZURlY2lzaW9uRm9yVGVzdGluZ2NhbklubGluZWluc2lkZUxvb3BkZWNpc2lvbm1hcmtBc0lubGluYWJsZW9sZERlY2lzaW9uQ2FuJ3QgbWFyayBhIGZ1bmN0aW9uIGFzIG5vbi1pbmxpbmFibGUgYW5kIGlubGluYWJsZSBhdCB0aGUgc2FtZSB0aW1lLm1hcmtlZEFzVHJ5SW5saW5lU3ludGhldGljQ29uc3RhbnRLaW5kRFVNTVlfSU5URVJDRVBUT1JTeW50aGV0aWNDb25zdGFudEtpbmQuRFVNTVlfSU5URVJDRVBUT1JFTVBUWV9WQUxVRVN5bnRoZXRpY0NvbnN0YW50S2luZC5FTVBUWV9WQUxVRVRZUEVWQVJJQUJMRV9SRUZFUkVOQ0VTeW50aGV0aWNDb25zdGFudEtpbmQuVFlQRVZBUklBQkxFX1JFRkVSRU5DRU5BTUVTeW50aGV0aWNDb25zdGFudEtpbmQuTkFNRUpTX0JVSUxUSU5KU19FTUJFRERFRF9HTE9CQUxKU19JTlRFUkNFUFRPUl9DT05TVEFOVEpTX1NUUklOR19DT05DQVRmdW5jdGlvbkNvbXBpbGVyZ2VuZXJhdGVkQ29kZV9uYW1lcnNwZWNpYWxPcGVyYXRvckVxQ2xhc3Nlc19ydGlDaGVja3NCdWlsZGVyX3J0aVN1YnN0aXR1dGlvbnNfcnRpRW5jb2Rlcmh0bWxMaWJyYXJ5SXNMb2FkZWRfY3VzdG9tRWxlbWVudHNSZXNvbHV0aW9uQW5hbHlzaXNfY3VzdG9tRWxlbWVudHNDb2RlZ2VuQW5hbHlzaXNfZmllbGRBbmFseXNpc19jb2RlZ2VuSW1wYWN0VHJhbnNmb3JtZXJfbmF0aXZlRGF0YUJ1aWxkZXJfb25lU2hvdEludGVyY2VwdG9yRGF0YV9iYWNrZW5kVXNhZ2VCdWlsZGVyX2NoZWNrZWRNb2RlSGVscGVyc3N1cGVyTWVtYmVyRGF0YV9uYXRpdmVSZXNvbHV0aW9uRW5xdWV1ZXJfbmF0aXZlQ29kZWdlbkVucXVldWVydHJhY2VyY29kZWdlbkltcGFjdHNGb3JUZXN0aW5nbmFtZXJOYW1lciBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQuZmllbGRBbmFseXNpc0ZvclRlc3RpbmdjdXN0b21FbGVtZW50c1Jlc29sdXRpb25BbmFseXNpc0N1c3RvbUVsZW1lbnRzUmVzb2x1dGlvbkFuYWx5c2lzIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldC5jdXN0b21FbGVtZW50c0NvZGVnZW5BbmFseXNpc0N1c3RvbUVsZW1lbnRzQ29kZWdlbkFuYWx5c2lzIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldC5vbmVTaG90SW50ZXJjZXB0b3JEYXRhT25lU2hvdEludGVyY2VwdG9yRGF0YSBoYXMgbm90IGJlZW4gcHJlcGFyZWQgeWV0LnJ0aUNoZWNrc0J1aWxkZXJSdW50aW1lVHlwZXNDaGVja3NCdWlsZGVyIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldC5ydGlDaGVja3NCdWlsZGVyQ2xvc2VkUnVudGltZVR5cGVzQ2hlY2tzIGhhcyBhbHJlYWR5IGJlZW4gY29tcHV0ZWQucnRpQ2hlY2tzQnVpbGRlckZvclRlc3RpbmdydGlTdWJzdGl0dXRpb25zUnVudGltZVR5cGVzU3Vic3RpdHV0aW9ucyBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQucnRpRW5jb2RlclJ1bnRpbWVUeXBlc0VuY29kZXIgaGFzIG5vdCBiZWVuIGNyZWF0ZWQuY2hlY2tlZE1vZGVIZWxwZXJzanNDb25zdGFudENvbXBpbGVyZGV0ZXJtaW5lTmFtZXJ2YWxpZGF0ZUludGVyY2VwdG9ySW1wbGVtZW50c0FsbE9iamVjdE1ldGhvZHNpbnRlcmNlcHRvckNsYXNzaW50ZXJjZXB0b3JNZW1iZXJNZW1iZXIgIG5vdCBvdmVycmlkZGVuIGluIC4gRm91bmQgbmF0aXZlRGF0YWxpdmVOYXRpdmVDbGFzc2VzcnRpTmVlZG5hdGl2ZUNvZGVnZW5FbnF1ZXVlcmNvZGVnZW5tZXNzYWdlTGl0ZXJhbGVzY2FwZWRTdHJpbmdDb21waWxlIHRpbWUgZXJyb3IgaW4gZnVuY3Rpb24gKCkgeyB0aHJvdyBuZXcgRXJyb3IoIyk7IH13aXRoU291cmNlSW5mb3JtYXRpb25yZWdpc3RyeXRyYW5zZm9ybUNvZGVnZW5JbXBhY3RuYXRpdmVSZXNvbHV0aW9uRW5xdWV1ZXJGb3JUZXN0aW5nZ2V0R2VuZXJhdGVkQ29kZWVtaXREaWFnbm9zdGljaGFzRGlyZWN0Q2hlY2tGb3JpbnRlcmZhY2VUeXBlcHJvY2Vzc29yaW50ZXJjZXB0b3JEYXRhY3JlYXRlRW1pdHRlcnJ1bnRpbWVUeXBlc0ltcGxyZXdyaXRlQXN5bmNhc3luY1R5cGVQYXJhbWV0ZXJib2R5U291cmNlSW5mb3JtYXRpb25leGl0U291cmNlSW5mb3JtYXRpb25yZXdyaXRlcm1ldGhvZFByb3BlcnR5TmFtZV9tYWtlQXN5bmNSZXdyaXRlcnN0YXRpY0Z1bmN0aW9uQWNjZXNzaXRlcmFibGVGYWN0b3J5aXRlcmFibGVGYWN0b3J5VHlwZUFyZ3VtZW50c19mZXRjaEl0ZW1UeXBleWllbGRTdGFyRXhwcmVzc2lvbnVuY2F1Z2h0RXJyb3JFeHByZXNzaW9uc2FmZVZhcmlhYmxlTmFtZXNhZmVWYXJpYWJsZVByZWZpeEZvckFzeW5jUmV3cml0ZWJvZHlOYW1lZGVyaXZlQXN5bmNCb2R5TmFtZW5ld0NvbnRyb2xsZXJuZXdDb250cm9sbGVyVHlwZUFyZ3VtZW50c3lpZWxkRXhwcmVzc2lvbnJld3JpdGVnZXRUeXBlUmVwcmVzZW50YXRpb25zdGFydEZ1bmN0aW9uY29tcGxldGVyRmFjdG9yeWl0ZW1UeXBlRXhwcmVzc2lvbmFzeW5jU3RhcnRhc3luY0F3YWl0YXN5bmNSZXR1cm5hc3luY1JldGhyb3djb21wbGV0ZXJGYWN0b3J5VHlwZUFyZ3VtZW50c0phdmFTY3JpcHRJbXBhY3RTdHJhdGVneVN1cGVyTWVtYmVyRGF0YV9hbGlhc2VkU3VwZXJNZW1iZXJzbWF5YmVSZWdpc3RlckFsaWFzZWRTdXBlck1lbWJlcmNhblVzZUFsaWFzZWRTdXBlck1lbWJlcmlzQWxpYXNlZFN1cGVyTWVtYmVySW5mZXJyZWREYXRhZ2V0U2lkZUVmZmVjdHNPZlNlbGVjdG9yZ2V0Q2Fubm90VGhyb3dpc0NhbGxlZEluTG9vcGdldE1pZ2h0QmVQYXNzZWRUb0FwcGx5SW5mZXJyZWREYXRhQnVpbGRlcnJlZ2lzdGVyU2lkZUVmZmVjdHNGcmVlZ2V0U2lkZUVmZmVjdHNCdWlsZGVycmVnaXN0ZXJNaWdodEJlUGFzc2VkVG9BcHBseWdldEN1cnJlbnRseUtub3duTWlnaHRCZVBhc3NlZFRvQXBwbHlhZGRGdW5jdGlvbkNhbGxlZEluTG9vcHJlZ2lzdGVyQ2Fubm90VGhyb3dJbmZlcnJlZERhdGFJbXBsaW5mZXJyZWQtZGF0YV9mdW5jdGlvbnNDYWxsZWRJbkxvb3Bfc2lkZUVmZmVjdHNfc2lkZUVmZmVjdHNGcmVlRWxlbWVudHNfZWxlbWVudHNUaGF0Q2Fubm90VGhyb3dfZnVuY3Rpb25zVGhhdE1pZ2h0QmVQYXNzZWRUb0FwcGx5ZnVuY3Rpb25zQ2FsbGVkSW5Mb29wcmVhZE1lbWJlcnNzaWRlRWZmZWN0c0ZyZWVFbGVtZW50c2VsZW1lbnRzVGhhdENhbm5vdFRocm93ZnVuY3Rpb25zVGhhdE1pZ2h0QmVQYXNzZWRUb0FwcGx5d3JpdGVNZW1iZXJzZmllbGROZXZlckNoYW5nZXNzZXREZXBlbmRzT25JbnN0YW5jZVByb3BlcnR5U3RvcmVzZXRDaGFuZ2VzSW5zdGFuY2VQcm9wZXJ0eXNldEFsbFNpZGVFZmZlY3Rzc2V0RGVwZW5kc09uU29tZXRoaW5nU2lkZSBlZmZlY3RzIGhhdmUgbm90IGJlZW4gY29tcHV0ZWQgeWV0Ll9tYWtlU2lkZUVmZmVjdHNJbmZlcnJlZERhdGFCdWlsZGVySW1wbF9zaWRlRWZmZWN0c0J1aWxkZXJzcHJlbWF0dXJlU2lkZUVmZmVjdEFjY2Vzc2VzZm9yRWFjaE5vVGhyb3dzZm9yRWFjaE5vU2lkZUVmZmVjdHNJbmZlcnJlZCBkYXRhIGhhcyBhbHJlYWR5IGJlZW4gY29tcHV0ZWQuc2lkZUVmZmVjdHNCdWlsZGVyc3NpZGVFZmZlY3RzQnVpbGRlcmVtcHR5V29ya0xpc3RpblF1ZXVlZGVwZW5kZW50ZGVwZW5kaW5nVHJpdmlhbEluZmVycmVkRGF0YV9hbGxTaWRlRWZmZWN0c2RhcnQyanMuanNfbW9kZWwuc3RyYXRlZ3lLZXJuZWxTb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5SnNCYWNrZW5kU3RyYXRlZ3lfZWxlbWVudE1hcEpzQmFja2VuZFN0cmF0ZWd5LmVsZW1lbnRNYXAgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0LmxpdmVNZW1iZXJVc2FnZV9nbG9iYWxMb2NhbHNNYXBjbG9zdXJlRGF0YUJ1aWxkZXJjbG9zZWRXb3JsZEJ1aWxkZXJjb252ZXJ0Q2xvc2VkV29ybGRjbG9zdXJlTW9kZWxzZ2V0U291cmNlU3Bhbktlcm5lbENvZGVnZW5Xb3JrSXRlbUJ1aWxkZXJfYmFja2VuZEtlcm5lbENvZGVnZW5Xb3JrSXRlbUtlcm5lbFNzYUJ1aWxkZXJfaW5saW5lQ2FjaGVnZXRNZW1iZXJUaGlzVHlwZW5hdGl2ZUVtaXR0ZXJLZXJuZWxUb1R5cGVJbmZlcmVuY2VNYXBJbXBsX3RhcmdldFJlc3VsdHNfcmVzdWx0T2ZnZXRSZXR1cm5UeXBlT2ZyZWNlaXZlclR5cGVPZkludm9jYXRpb25yZWNlaXZlclR5cGVPZkdldHJlY2VpdmVyVHlwZU9mRGlyZWN0R2V0cmVjZWl2ZXJUeXBlT2ZTZXRsaXN0TGl0ZXJhbGlzSnNJbmRleGFibGVJdGVyYXRvcmluZmVycmVkSW5kZXhUeXBlZ2V0SW5mZXJyZWRUeXBlT2ZnZXRJbmZlcnJlZFR5cGVPZlBhcmFtZXRlcnNlbGVjdG9yVHlwZU9mdHlwZUZyb21OYXRpdmVCZWhhdmlvcm5hdGl2ZUJlaGF2aW9yZGFydDJqcy5rZXJuZWwuZnJvbnRlbmRfc3RyYXRlZ3lDbG9zdXJlU2NvcGVNb2RlbFNjb3BlTW9kZWxLZXJuZWxGcm9udEVuZFN0cmF0ZWd5X2NvbXBpbGVyVGFza19ydW50aW1lVHlwZXNOZWVkQnVpbGRlcl9hbm5vdGF0aW9uUHJvY2Vzc29yX21vZHVsYXJTdHJhdGVneV9pckFubm90YXRpb25EYXRha2VybmVsUmVzdWx0YWRkQ29tcG9uZW50aXJBbm5vdGF0aW9uRGF0YUZvclRlc3Rpbmdtb2R1bGFyU3RyYXRlZ3lGb3JUZXN0aW5nQW5ub3RhdGlvblByb2Nlc3NvciBoYXMgbm90IGJlZW4gY3JlYXRlZC5LZXJuZWxXb3JrSXRlbUJ1aWxkZXJfaW1wYWN0VHJhbnNmb3JtZXJfbmF0aXZlTWVtYmVyUmVzb2x2ZXJfYW5ub3RhdGlvbnNEYXRhQnVpbGRlcl9jbG9zdXJlTW9kZWxzS2VybmVsV29ya0l0ZW1nZXRNZW1iZXJOb2RlcmVzb2x2ZU5hdGl2ZU1lbWJlcnByYWdtYUFubm90YXRpb25EYXRhZ2V0UHJhZ21hQW5ub3RhdGlvbkRhdGFyZWdpc3RlclByYWdtYUFubm90YXRpb25zbW9kdWxhck1lbWJlckRhdGFnZXRNb2R1bGFyTWVtYmVyRGF0YXNjb3BlTW9kZWxjbG9zdXJlU2NvcGVNb2RlbHJlZ2lzdGVyU3RhdGljRmllbGRpbml0aWFsaXplckNvbXBsZXhpdHlpbXBhY3RCdWlsZGVyRGF0YWNvbXB1dGVXb3JsZEltcGFjdHZhcmlhYmxlU2NvcGVNb2RlbHRyYW5zZm9ybVJlc29sdXRpb25JbXBhY3RLZXJuZWxXb3JrSXRlbShLZXJuZWxNb2R1bGFyU3RyYXRlZ3l1c2VBc3NlcnRzaW5mZXJFZmZlY3RpdmVseUZpbmFsVmFyaWFibGVUeXBlc2NvbXB1dGVJbXBhY3R1c2VJbXBhY3REYXRhRm9yVGVzdGluZ2RhcnQyanMubGlicmFyeV9sb2FkZXJEYXJ0MmpzVGFyZ2V0X2NvbXBpbGVySW5wdXRfY29tcGlsZXJPdXRwdXRmb3JjZVNlcmlhbGl6YXRpb25rZXJuZWwgbG9hZGVyX3BsYXRmb3JtLmRpbGxpc0RpbGwuZGlsbHNlcmlhbGl6ZSBkaWxsV3JpdGluZyBkaWxsIHRvIGlyU2lua190b1Jlc3VsdHNlYXJjaGRlcGRhcnRDb3Jlcm9vdD0sbGlicmFyaWVzPVNlcmlhbGl6YXRpb25UYXNrU2VyaWFsaXphdGlvbnByb2dyYW1FbnZtYWluQ29tcG9uZW50c2VyaWFsaXplIGRhdGFXcml0aW5nIGRhdGEgdG8gZGVzZXJpYWxpemUgZGlsbFJlYWRpbmcgZGlsbCBmcm9tIGRpbGxJbnB1dGRlc2VyaWFsaXplIGRhdGFSZWFkaW5nIGRhdGEgZnJvbSBkYXRhSW5wdXRzZXJpYWxpemVHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0c2Rlc2VyaWFsaXplR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHNuZXdDbG9zZWRXb3JsZG5ld0luZmVycmVkRGF0YVNlcmlhbGl6YXRpb25TdHJhdGVneUJ5dGVzSW5NZW1vcnlTZXJpYWxpemF0aW9uU3RyYXRlZ3l1c2VEYXRhS2luZHNCeXRlc09uRGlza1NlcmlhbGl6YXRpb25TdHJhdGVneXdvcmxkLmRhdGFPYmplY3RzSW5NZW1vcnlTZXJpYWxpemF0aW9uU3RyYXRlZ3lTaWRlRWZmZWN0c0hWaXNpdG9ydmlzaXRBYnN2aXNpdEFkZHZpc2l0QXdhaXR2aXNpdEJpdEFuZHZpc2l0Qml0Tm90dmlzaXRCaXRPcnZpc2l0Qml0WG9ydmlzaXRCb29saWZ5dmlzaXRCb3VuZHNDaGVja3Zpc2l0QnJlYWt2aXNpdENvbnRpbnVldmlzaXRDcmVhdGV2aXNpdENyZWF0ZUJveHZpc2l0RGl2aWRldmlzaXRFeGl0dmlzaXRFeGl0VHJ5dmlzaXRGaWVsZEdldHZpc2l0RmllbGRTZXR2aXNpdEZvcmVpZ25Db2RldmlzaXRHZXRMZW5ndGh2aXNpdEdvdG92aXNpdEdyZWF0ZXJ2aXNpdEdyZWF0ZXJFcXVhbHZpc2l0SWRlbnRpdHl2aXNpdElmdmlzaXRJbmRleHZpc2l0SW5kZXhBc3NpZ252aXNpdEludGVyY2VwdG9ydmlzaXRJbnZva2VDbG9zdXJldmlzaXRJbnZva2VEeW5hbWljR2V0dGVydmlzaXRJbnZva2VEeW5hbWljTWV0aG9kdmlzaXRJbnZva2VEeW5hbWljU2V0dGVydmlzaXRJbnZva2VTdGF0aWN2aXNpdEludm9rZVN1cGVydmlzaXRJbnZva2VDb25zdHJ1Y3RvckJvZHl2aXNpdEludm9rZUdlbmVyYXRvckJvZHl2aXNpdElzdmlzaXRJc1ZpYUludGVyY2VwdG9ydmlzaXRMYXRlVmFsdWV2aXNpdExhenlTdGF0aWN2aXNpdExlc3N2aXNpdExlc3NFcXVhbHZpc2l0TGl0ZXJhbExpc3R2aXNpdExvY2FsR2V0dmlzaXRMb2NhbFNldHZpc2l0TG9jYWxWYWx1ZXZpc2l0TG9vcEJyYW5jaHZpc2l0TXVsdGlwbHl2aXNpdE5lZ2F0ZXZpc2l0T25lU2hvdEludGVyY2VwdG9ydmlzaXRQYXJhbWV0ZXJWYWx1ZXZpc2l0UGhpdmlzaXRSYW5nZUNvbnZlcnNpb252aXNpdFJlYWRNb2RpZnlXcml0ZXZpc2l0UmVmdmlzaXRSZW1haW5kZXJ2aXNpdFJldHVybnZpc2l0U2hpZnRMZWZ0dmlzaXRTaGlmdFJpZ2h0dmlzaXRTdGF0aWN2aXNpdFN0YXRpY1N0b3JldmlzaXRTdHJpbmdDb25jYXR2aXNpdFN0cmluZ2lmeXZpc2l0U3VidHJhY3R2aXNpdFN3aXRjaHZpc2l0VGhpc3Zpc2l0VGhyb3dFeHByZXNzaW9udmlzaXRUcnVuY2F0aW5nRGl2aWRldmlzaXRUcnl2aXNpdFR5cGVDb252ZXJzaW9udmlzaXRUeXBlS25vd252aXNpdFlpZWxkdmlzaXRUeXBlSW5mb1JlYWRSYXd2aXNpdFR5cGVJbmZvUmVhZFZhcmlhYmxldmlzaXRUeXBlSW5mb0V4cHJlc3Npb25IR3JhcGhWaXNpdG9ydmlzaXREb21pbmF0b3JUcmVlZnJhbWV2aXNpdEJhc2ljQmxvY2tkb21pbmF0ZWRCbG9ja3N2aXNpdFBvc3REb21pbmF0b3JUcmVlX0ZyYW1lSEluc3RydWN0aW9uVmlzaXRvcmN1cnJlbnRCbG9ja3Zpc2l0SW5zdHJ1Y3Rpb252aXNpdEluc3RydWN0aW9uTGlzdGluc3RydWN0aW9uSEdyYXBodGhpc0luc3RydWN0aW9ubmVlZHNBc3luY1Jld3JpdGVhc3luY0VsZW1lbnRUeXBlZXhwbGljaXRSZWNlaXZlclBhcmFtZXRlcmlzUmVjdXJzaXZlTWV0aG9kY2FsbGVkSW5Mb29wYmxvY2tzYWxsb2NhdGVkRml4ZWRMaXN0c2FkZE5ld0Jsb2NrYWRkQmxvY2thZGROZXdMb29wSGVhZGVyQmxvY2tsb29wSW5mb3JtYXRpb25pc0NvbnN0YW50YWRkQXRFeGl0YWRkRGVmZXJyZWRDb25zdGFudHdyYXBwZXJhZGRDb25zdGFudEludGFkZENvbnN0YW50SW50QXNVbnNpZ25lZGFkZENvbnN0YW50RG91YmxlYWRkQ29uc3RhbnRTdHJpbmdhZGRDb25zdGFudFN0cmluZ0Zyb21OYW1lYWRkQ29uc3RhbnRCb29sYWRkQ29uc3RhbnROdWxsYWRkQ29uc3RhbnRVbnJlYWNoYWJsZWFzc2lnbkRvbWluYXRvcnNwcmVkZWNlc3NvcnNpc0xvb3BIZWFkZXJhc3NpZ25Db21tb25Eb21pbmF0b3Jhc3NpZ25Eb21pbmF0b3JSYW5nZXNkZnNOdW1iZXJkb21pbmF0b3JEZnNJbmRvbWluYXRvckRmc091dHZhbGlkYXRvcnZpc2l0R3JhcGhIR3JhcGgoSEJhc2VWaXNpdG9ydmlzaXRCaW5hcnlBcml0aG1ldGljdmlzaXRJbnZva2VCaW5hcnl2aXNpdEJpbmFyeUJpdE9wdmlzaXRJbnZva2V2aXNpdEludm9rZUR5bmFtaWN2aXNpdEludm9rZUR5bmFtaWNGaWVsZHZpc2l0SW52b2tlVW5hcnl2aXNpdENvbmRpdGlvbmFsQnJhbmNodmlzaXRDb250cm9sRmxvd3Zpc2l0RmllbGRBY2Nlc3N2aXNpdFJlbGF0aW9uYWx2aXNpdENoZWNrdmlzaXRKdW1wdmlzaXRMb2NhbEFjY2Vzc1N1YkdyYXBoU3ViRXhwcmVzc2lvbmNvbmRpdGlvbkV4cHJlc3Npb25ISW5zdHJ1Y3Rpb25MaXN0aW50ZXJuYWxBZGRBZnRlcmN1cnNvcmludGVybmFsQWRkQmVmb3JlZGV0YWNoX3RydW5jYXRlZENvbnRhaW5zRm9yQXNzZXJ0aXNJbkJhc2ljQmxvY2t1c2VkQnlIQmFzaWNCbG9ja1NUQVRVU19ORVdTVEFUVVNfT1BFTlNUQVRVU19DTE9TRURzdGF0dXNwaGlzYmxvY2tGbG93cGFyZW50TG9vcEhlYWRlcmlzTGl2ZXN1Y2Nlc3NvcnNkb21pbmF0b3J3aXRoSWRpc05ld2lzT3BlbmlzQ2xvc2Vkc2V0QmxvY2tGbG93YmxvY2tJbmZvY29udGludWF0aW9uaXNMYWJlbGVkQmxvY2tlbmNsb3NpbmdMb29wSGVhZGVyYWRkQWZ0ZXJhZGRBdEVudHJ5bm90aWZ5QWRkZWRUb0Jsb2NrbW92ZUF0RXhpdGFkZFBoaXBoaXJlbW92ZVBoaW5vdGlmeVJlbW92ZWRGcm9tQmxvY2thZGRCZWZvcmVhZGRTdWNjZXNzb3Jwb3N0UHJvY2Vzc0xvb3BIZWFkZXJhZGRCYWNrRWRnZXVzZXJld3JpdGVJbnB1dHJld3JpdGVXaXRoQmV0dGVyVXNlcmJldHRlcnVzZXJjaGVja2VkSW5wdXRkb21pbmF0ZXNpc0V4aXRCbG9ja2FkZERvbWluYXRlZEJsb2NrcmVtb3ZlRG9taW5hdGVkQmxvY2tyZW1vdmVSYW5nZXByZWRlY2Vzc29yYmxvY2swYmxvY2sxZm9yRWFjaFBoaXNhdmVkZm9yRWFjaEluc3RydWN0aW9uSEJhc2ljQmxvY2soaWRDb3VudGVyX3VzZUd2blVOREVGSU5FRF9UWVBFQ09ERUJPT0xJRllfVFlQRUNPREVUWVBFX0dVQVJEX1RZUEVDT0RFQk9VTkRTX0NIRUNLX1RZUEVDT0RFSU5URUdFUl9DSEVDS19UWVBFQ09ERUlOVEVSQ0VQVE9SX1RZUEVDT0RFQUREX1RZUEVDT0RFRElWSURFX1RZUEVDT0RFTVVMVElQTFlfVFlQRUNPREVTVUJUUkFDVF9UWVBFQ09ERVNISUZUX0xFRlRfVFlQRUNPREVCSVRfT1JfVFlQRUNPREVCSVRfQU5EX1RZUEVDT0RFQklUX1hPUl9UWVBFQ09ERU5FR0FURV9UWVBFQ09ERUJJVF9OT1RfVFlQRUNPREVOT1RfVFlQRUNPREVJREVOVElUWV9UWVBFQ09ERUdSRUFURVJfVFlQRUNPREVHUkVBVEVSX0VRVUFMX1RZUEVDT0RFTEVTU19UWVBFQ09ERUxFU1NfRVFVQUxfVFlQRUNPREVTVEFUSUNfVFlQRUNPREVTVEFUSUNfU1RPUkVfVFlQRUNPREVGSUVMRF9HRVRfVFlQRUNPREVUWVBFX0NPTlZFUlNJT05fVFlQRUNPREVUWVBFX0tOT1dOX1RZUEVDT0RFSU5WT0tFX1NUQVRJQ19UWVBFQ09ERUlOREVYX1RZUEVDT0RFSVNfVFlQRUNPREVJTlZPS0VfRFlOQU1JQ19UWVBFQ09ERVNISUZUX1JJR0hUX1RZUEVDT0RFVFJVTkNBVElOR19ESVZJREVfVFlQRUNPREVJU19WSUFfSU5URVJDRVBUT1JfVFlQRUNPREVUWVBFX0lORk9fUkVBRF9SQVdfVFlQRUNPREVUWVBFX0lORk9fUkVBRF9WQVJJQUJMRV9UWVBFQ09ERVRZUEVfSU5GT19FWFBSRVNTSU9OX1RZUEVDT0RFRk9SRUlHTl9DT0RFX1RZUEVDT0RFUkVNQUlOREVSX1RZUEVDT0RFR0VUX0xFTkdUSF9UWVBFQ09ERUFCU19UWVBFQ09ERWluc3RydWN0aW9uVHlwZWlucHV0czogdXNlR3Zuc2V0VXNlR3ZuaXNNb3ZhYmxlaXNQdXJlaGFzU2lkZUVmZmVjdHNkZXBlbmRzT25Tb21ldGhpbmdjYW5UaHJvd2lzQWxsb2NhdGlvbm5vbkNoZWNraXNDb250cm9sRmxvd2lzQ29uZmxpY3RpbmdnZXREYXJ0UmVjZWl2ZXJvbmx5VGhyb3dzTlNNZ3ZuRXF1YWxzaGFzU2FtZVR5cGV0eXBlRXF1YWxzdHlwZUNvZGVpbnB1dHNMZW5ndGhvdGhlcklucHV0c2RhdGFFcXVhbHNndm5IYXNoQ29kZXRhcmdldEJsb2NrcmVtb3ZlVXNlcnJlbW92ZUZyb21MaXN0Y2hhbmdlVXNlb2xkSW5wdXRuZXdJbnB1dHJlcGxhY2VBbGxVc2Vyc0RvbWluYXRlZEJ5bmV3SW5zdHJ1Y3Rpb25tb3ZlQmVmb3JlaXNDb25zdGFudEJvb2xlYW5pc0NvbnN0YW50TnVsbGlzQ29uc3RhbnROdW1iZXJpc0NvbnN0YW50SW50ZWdlcmlzQ29uc3RhbnRTdHJpbmdpc0NvbnN0YW50TGlzdGlzQ29uc3RhbnRNYXBpc0NvbnN0YW50RmFsc2Vpc0NvbnN0YW50VHJ1ZWlzQ29kZU1vdGlvbkludmFyaWFudGlzSnNTdGF0ZW1lbnRjb252ZXJ0VHlwZWlzVHlwZVZhcmlhYmxlaXNGdW5jdGlvblR5cGVpc1ZvaWRpc0Z1dHVyZU9yY3JlYXRpbmcgY29tcG91bmQgY2hlY2sgdG8gICh0aGlzID0gaGFzU2FtZUxvb3BIZWFkZXJBc0RvbWluYXRlZFVzZXNfc291cmNlX2luc3RydWN0aW9uc19pbmRleGVzZXhjbHVkZURvbWluYXRvcmV4Y2x1ZGVQaGlPdXRFZGdlc19jb21wdXRlb2xkSW5zdHJ1Y3Rpb25JbnB1dCAgY2hhbmdlZC4KICBGb3VuZDogCiAgRXhwZWN0ZWQ6IGlzU2luZ2xldG9uaW5zdHJ1Y3Rpb25zX2FkZFVzZWlucHV0SW5kZXh1c2Vyc3VzZXJzSW5DdXJyZW50QmxvY2tkb21pbmF0b3JCbG9ja0hSZWZjb252ZXJzaW9uSFJlZihITGF0ZUluc3RydWN0aW9uSEJvb2xpZnlIQ2hlY2tIQm91bmRzQ2hlY2tBTFdBWVNfRkFMU0VGVUxMX0NIRUNLQUxXQVlTX0FCT1ZFX1pFUk9BTFdBWVNfQkVMT1dfTEVOR1RIQUxXQVlTX1RSVUVzdGF0aWNDaGVja3NhcnJheXJlcG9ydGVkSW5kZXhIQ29uZGl0aW9uYWxCcmFuY2h0cnVlQnJhbmNoZmFsc2VCcmFuY2hIQ29udHJvbEZsb3dIQ3JlYXRlaGFzUnRpSW5wdXRpbnN0YW50aWF0ZWRUeXBlc3J0aUlucHV0SENyZWF0ZShIQ3JlYXRlQm94SENyZWF0ZUJveCgpSEludm9rZV9pc0FsbG9jYXRpb25pc0ludGVyY2VwdGVkQ2FsbEFSR1VNRU5UU19PRkZTRVRzZXRBbGxvY2F0aW9uSEludm9rZUR5bmFtaWNzcGVjaWFsaXplcmlzSW50ZXJjZXB0ZWRpbnZva2UgZHluYW1pYzogc2VsZWN0b3I9LCBtYXNrPWlzQ2FsbE9uSW50ZXJjZXB0b3JISW52b2tlQ2xvc3VyZUhJbnZva2VEeW5hbWljTWV0aG9kaW52b2tlIGR5bmFtaWMgbWV0aG9kOiBzZWxlY3Rvcj1ISW52b2tlRHluYW1pY0ZpZWxkaW52b2tlIGR5bmFtaWMgZmllbGQ6IHNlbGVjdG9yPUhJbnZva2VEeW5hbWljR2V0dGVyaXNUZWFyT2ZmaW52b2tlIGR5bmFtaWMgZ2V0dGVyOiBzZWxlY3Rvcj1ISW52b2tlRHluYW1pY1NldHRlcm5lZWRzQ2hlY2tpbnZva2UgZHluYW1pYyBzZXR0ZXI6IHNlbGVjdG9yPSwgZWxlbWVudD1ISW52b2tlU3RhdGljdGFyZ2V0Q2FuVGhyb3dpbnZva2Ugc3RhdGljOiBISW52b2tlU3VwZXJjYWxsZXJpbnZva2Ugc3VwZXI6IEhJbnZva2VDb25zdHJ1Y3RvckJvZHlpbnZva2UgY29uc3RydWN0b3IgYm9keTogSEludm9rZUdlbmVyYXRvckJvZHlISW52b2tlR2VuZXJhdG9yQm9keShIRmllbGRBY2Nlc3NIRmllbGRHZXRjbGVhckFsbFNpZGVFZmZlY3RzY2xlYXJBbGxEZXBlbmRlbmNpZXN0aGlzTG9jYWxpc0ludGVyY2VwdGVkQ2xhc3Npc051bGxDaGVja0ZpZWxkR2V0KGVsZW1lbnQ9LHR5cGU9SEZpZWxkU2V0RmllbGRTZXQoZWxlbWVudD1IR2V0TGVuZ3RoR2V0TGVuZ3RoKClIUmVhZE1vZGlmeVdyaXRlQVNTSUdOX09QUFJFX09QUE9TVF9PUGpzT3BvcEtpbmRhc3NpZ25PcHByZU9wcG9zdE9waXNQcmVPcGlzUG9zdE9waXNBc3NpZ25PcFJlYWRNb2RpZnlXcml0ZSBITG9jYWxBY2Nlc3NITG9jYWxHZXRITG9jYWxTZXRIRm9yZWlnbmlzU3RhdGVtZW50SEZvcmVpZ25Db2RlY29kZVRlbXBsYXRldGhyb3dCZWhhdmlvcmZvcmVpZ25GdW5jdGlvbmVmZmVjdHNvbk5vbk51bGxpc09ubHlOdWxsTlNNR3VhcmRIRm9yZWlnbkNvZGUoIiIpSEludm9rZUJpbmFyeUhCaW5hcnlBcml0aG1ldGljSEFkZEhEaXZpZGVITXVsdGlwbHlIU3VidHJhY3RIVHJ1bmNhdGluZ0RpdmlkZUhSZW1haW5kZXJIU3dpdGNoZGVmYXVsdFRhcmdldEhTd2l0Y2ggY2FzZXMgPSBIQmluYXJ5Qml0T3BIU2hpZnRMZWZ0SFNoaWZ0UmlnaHRIQml0T3JIQml0QW5kSEJpdFhvckhJbnZva2VVbmFyeUhOZWdhdGVIQWJzSEJpdE5vdEhFeGl0SEdvdG9nb3RvSEp1bXB0b0xhYmVsSEJyZWFrYnJlYWtTd2l0Y2hDb250aW51ZUxvb3BicmVhayBsYWJlbE5hbWVIQ29udGludWVjb250aW51ZSBIVHJ5Y2F0Y2hCbG9ja2ZpbmFsbHlCbG9ja2pvaW5CbG9ja0hFeGl0VHJ5ZXhpdCB0cnlib2R5VHJ5U3VjY2Vzc29ySElmYmxvY2tJbmZvcm1hdGlvbnRoZW5CbG9ja2Vsc2VCbG9ja0hMb29wQnJhbmNoQ09ORElUSU9OX0ZJUlNUX0xPT1BET19XSElMRV9MT09QbG9vcC1icmFuY2hIQ29uc3RhbnRsaXRlcmFsOiBpc0Jvb2xpc051bWlzSW50aXNMaXN0aXNGYWxzZWlzVHJ1ZUhOb3RITG9jYWxWYWx1ZWxvY2FsIEhQYXJhbWV0ZXJWYWx1ZXVzZWRBc1ZhcmlhYmxlcGFyYW1ldGVyIEhUaGlzSFBoaUlTX05PVF9MT0dJQ0FMX09QRVJBVE9SSVNfQU5ESVNfT1Jsb2dpY2FsT3BlcmF0b3JUeXBlbm9JbnB1dHNzaW5nbGVJbnB1dG1hbnlJbnB1dHNhZGRJbnB1dHBoaSBIUmVsYXRpb25hbHVzZXNCb29saWZpZWRJbnRlcmNlcHRvckhJZGVudGl0eXNpbmdsZUNvbXBhcmlzb25PcEhHcmVhdGVySEdyZWF0ZXJFcXVhbEhMZXNzSExlc3NFcXVhbEhSZXR1cm5IVGhyb3dFeHByZXNzaW9udGhyb3cgZXhwcmVzc2lvbkhBd2FpdEhZaWVsZGhhc1N0YXJIVGhyb3dpc1JldGhyb3dIU3RhdGljc2V0RGVwZW5kc09uU3RhdGljUHJvcGVydHlTdG9yZXN0YXRpYyBISW50ZXJjZXB0b3JpbnRlcmNlcHRlZENsYXNzZXNpbnRlcmNlcHRvciBvbiBpc0NvbmRpdGlvbmFsQ29uc3RhbnRJbnRlcmNlcHRvcmNvbmRpdGlvbmFsQ29uc3RhbnRJbnRlcmNlcHRvckhPbmVTaG90SW50ZXJjZXB0b3JvbmUgc2hvdCBpbnRlcmNlcHRvcjogc2VsZWN0b3I9SExhenlTdGF0aWNsYXp5IHN0YXRpYyBIU3RhdGljU3RvcmVzZXRDaGFuZ2VzU3RhdGljUHJvcGVydHlzdGF0aWMgc3RvcmUgSExpdGVyYWxMaXN0bGl0ZXJhbCBsaXN0SEluZGV4c2V0RGVwZW5kc09uSW5kZXhTdG9yZWluZGV4IG9wZXJhdG9ySEluZGV4QXNzaWduc2V0Q2hhbmdlc0luZGV4aW5kZXggYXNzaWduIG9wZXJhdG9ySElzUkFXX0NIRUNLQ09NUE9VTkRfQ0hFQ0tWQVJJQUJMRV9DSEVDS3R5cGVFeHByZXNzaW9udXNlSW5zdGFuY2VPZmluc3RhbmNlT2Zjb21wb3VuZHJhd2ludGVyY2VwdG9yVW5leHBlY3RlZCByYXcgaXMtdGVzdCB0eXBlOiBjaGVja0NhbGxpc1Jhd0NoZWNraXNWYXJpYWJsZUNoZWNraXNDb21wb3VuZENoZWNrIGlzIEhJc1ZpYUludGVyY2VwdG9ySExhdGVWYWx1ZUhMYXRlVmFsdWUoSFR5cGVDb252ZXJzaW9uQ0hFQ0tFRF9NT0RFX0NIRUNLQVJHVU1FTlRfVFlQRV9DSEVDS0NBU1RfVFlQRV9DSEVDS0JPT0xFQU5fQ09OVkVSU0lPTl9DSEVDS1JFQ0VJVkVSX1RZUEVfQ0hFQ0tyZWNlaXZlclR5cGVDaGVja1NlbGVjdG9yY2hlY2tlZFR5cGVpbnB1dFR5cGVpc1JlY2VpdmVyVHlwZUNoZWNraXNUeXBlZGVmd2l0aFR5cGVSZXByZXNlbnRhdGlvbnR5cGVSZXByZXNlbnRhdGlvbnZpYU1ldGhvZE9uVHlwZXJlaWZpZWRUeXBlaGFzVHlwZVJlcHJlc2VudGF0aW9uaXNCb29sZWFuQ29udmVyc2lvbkNoZWNraXNDaGVja2VkTW9kZUNoZWNraXNBcmd1bWVudFR5cGVDaGVja2lzQ2FzdFR5cGVDaGVja2lzUmVkdW5kYW50SFR5cGVDb252ZXJzaW9uKHR5cGU9LCBraW5kPXJlcHJlc2VudGF0aW9uPWNoZWNrZWRJbnB1dD1IVHlwZUtub3dua25vd25UeXBlX2lzTW92YWJsZXBpbm5lZHdpdG5lc3NlZHdpdG5lc3NUeXBlS25vd24gaXNQaW5uZWRIUmFuZ2VDb252ZXJzaW9uSFN0cmluZ0NvbmNhdHN0cmluZyBjb25jYXRIU3RyaW5naWZ5c3RyaW5naWZ5SExvb3BJbmZvcm1hdGlvbmJhY2tFZGdlc2xvb3BCbG9ja0luZm9ybWF0aW9ud29ya1F1ZXVlcGFyZW50SGVhZGVySEJsb2NrRmxvd0hCbG9ja0luZm9ybWF0aW9uSFN0YXRlbWVudEluZm9ybWF0aW9uSEV4cHJlc3Npb25JbmZvcm1hdGlvbkhTdGF0ZW1lbnRJbmZvcm1hdGlvblZpc2l0b3J2aXNpdExhYmVsZWRCbG9ja0luZm92aXNpdExvb3BJbmZvdmlzaXRJZkluZm92aXNpdFRyeUluZm92aXNpdFN3aXRjaEluZm92aXNpdFNlcXVlbmNlSW5mb3Zpc2l0U3ViR3JhcGhJbmZvSEV4cHJlc3Npb25JbmZvcm1hdGlvblZpc2l0b3J2aXNpdEFuZE9ySW5mb3Zpc2l0U3ViRXhwcmVzc2lvbkluZm9IQmxvY2tJbmZvcm1hdGlvblZpc2l0b3JIU3ViR3JhcGhCbG9ja0luZm9ybWF0aW9uc3ViR3JhcGhIU3ViRXhwcmVzc2lvbkJsb2NrSW5mb3JtYXRpb25zdWJFeHByZXNzaW9uSFN0YXRlbWVudFNlcXVlbmNlSW5mb3JtYXRpb25ITGFiZWxlZEJsb2NrSW5mb3JtYXRpb25pc0NvbnRpbnVlaW1wbGljaXRITG9vcEJsb2NrSW5mb3JtYXRpb25XSElMRV9MT09QRk9SX0xPT1BGT1JfSU5fTE9PUFNXSVRDSF9DT05USU5VRV9MT09QTk9UX0FfTE9PUGxvb3BIZWFkZXJISWZCbG9ja0luZm9ybWF0aW9udGhlbkdyYXBoZWxzZUdyYXBoSEFuZE9yQmxvY2tJbmZvcm1hdGlvbmlzQW5kSFRyeUJsb2NrSW5mb3JtYXRpb25jYXRjaFZhcmlhYmxlSFN3aXRjaEJsb2NrSW5mb3JtYXRpb25IVHlwZUluZm9SZWFkUmF3SFR5cGVJbmZvUmVhZFZhcmlhYmxlaW50ZXJjZXB0ZWRub0ludGVyY2VwdG9ySFR5cGVJbmZvUmVhZFZhcmlhYmxlKFR5cGVJbmZvRXhwcmVzc2lvbktpbmRDT01QTEVURVR5cGVJbmZvRXhwcmVzc2lvbktpbmQuQ09NUExFVEVJTlNUQU5DRVR5cGVJbmZvRXhwcmVzc2lvbktpbmQuSU5TVEFOQ0VIVHlwZUluZm9FeHByZXNzaW9uZGFydFR5cGVpc1R5cGVWYXJpYWJsZVJlcGxhY2VtZW50SFR5cGVJbmZvRXhwcmVzc2lvbihraW5kQXNTdHJpbmdkYXJ0MmpzLnNlbGVjdG9ydXRpbHNTZWxlY3RvcktpbmRHRVRURVJTRVRURVJDQUxMU1BFQ0lBTHNwZWNpYWxjYW5vbmljYWxpemVkVmFsdWVza2luZD0sbWVtYmVyTmFtZT0sY2FsbFN0cnVjdHVyZTphcmd1bWVudENvdW50bmFtZWRBcmd1bWVudENvdW50aXNPcGVyYXRvck5hbWVzZWxlY3Rvck5hbWVmcm9tRWxlbWVudENhbid0IGdldCBzZWxlY3RvciBmcm9tIHVuYXJ5T3BlcmF0b3JiaW5hcnlPcGVyYXRvcmNhbGxDbG9zdXJlYXJpdHljYWxsQ2xvc3VyZUZyb21jYWxsQ29uc3RydWN0b3JjYWxsRGVmYXVsdENvbnN0cnVjdG9ycmVhZExpYnJhcnlPck51bGx3cml0ZUxpYnJhcnlPck51bGxpbnZvY2F0aW9uTWlycm9yTWVtYmVyTmFtZWludm9jYXRpb25NaXJyb3JLaW5kc2lnbmF0dXJlQXBwbGllc2FwcGxpZXNUb051bGxXaXRob3V0VGhyb3dTZWxlY3RvcihzdHJ1Y3R1cmVUb1N0cmluZ3RvQ2FsbFNlbGVjdG9ydG9Ob25HZW5lcmljbm9uR2VuZXJpY0R5bmFtaWNVc2VLaW5kQ29kZWdlbldvcmxkQnVpbGRlcmluc3RhbnRpYXRlZENsYXNzZXNmb3JFYWNoSW5zdGFuY2VGaWVsZGlzRWxpZGVkZm9yRWFjaERpcmVjdEluc3RhbmNlRmllbGRmb3JFYWNoSW52b2tlZE5hbWVmb3JFYWNoSW52b2tlZEdldHRlcmZvckVhY2hJbnZva2VkU2V0dGVyaGFzSW52b2tlZFNldHRlcmhhc0ludm9rZWRHZXR0ZXJpbnZvY2F0aW9uc0J5TmFtZWdldHRlckludm9jYXRpb25zQnlOYW1lc2V0dGVySW52b2NhdGlvbnNCeU5hbWVzdGF0aWNGdW5jdGlvbnNOZWVkaW5nR2V0dGVybWV0aG9kc05lZWRpbmdTdXBlckdldHRlcmFsbFJlZmVyZW5jZWRTdGF0aWNGaWVsZHNjbG9zdXJpemVkTWVtYmVyc2FkZENvbXBpbGVUaW1lQ29uc3RhbnRGb3JFbWlzc2lvbmdldENvbnN0YW50c0ZvckVtaXNzaW9ucHJlU29ydENvbXBhcmVjb25zdFR5cGVMaXRlcmFsc2xpdmVUeXBlQXJndW1lbnRzQ29kZWdlbldvcmxkQnVpbGRlckltcGxfd29ybGRfZGlyZWN0bHlJbnN0YW50aWF0ZWRDbGFzc2VzX2luc3RhbnRpYXRlZFR5cGVzX2ltcGxlbWVudGVkQ2xhc3Nlc19pbnZva2VkTmFtZXNfaW52b2tlZEdldHRlcnNfaW52b2tlZFNldHRlcnNfcHJvY2Vzc2VkQ2xhc3Nlc19zdGF0aWNNZW1iZXJVc2FnZV9pbnN0YW5jZU1lbWJlclVzYWdlX2luc3RhbmNlTWVtYmVyc0J5TmFtZV9pbnN0YW5jZUZ1bmN0aW9uc0J5TmFtZWlzQ2hlY2tzX2NvbnN0YW50VmFsdWVzX2NvbnN0VHlwZUxpdGVyYWxzX2xpdmVUeXBlQXJndW1lbnRzY29tcGlsZWRDb25zdGFudHNjbGFzc1VzYWdlRm9yVGVzdGluZ3N0YXRpY01lbWJlclVzYWdlRm9yVGVzdGluZ2luc3RhbmNlTWVtYmVyVXNhZ2VGb3JUZXN0aW5nX2VsZW1lbnRFbnZpcm9ubWVudGdsb2JhbExvY2Fsc01hcGNsYXNzVXNlZF9wcm9jZXNzSW5zdGFudGlhdGVkQ2xhc3NfZ2V0Q2xhc3NVc2FnZWltcGxlbWVudF9oYXNNYXRjaGluZ1NlbGVjdG9yc2VsZWN0b3JzaGFzSW52b2NhdGlvbm1lbWJlclVzZWRfcHJvY2Vzc19wcm9jZXNzU2V0dXNhZ2VyZWdpc3RlckR5bmFtaWNJbnZvY2F0aW9uX3JlZ2lzdGVyTmV3U2VsZWN0b3JpbnZva2VzZWxlY3Rvck1hcF9hc1VubW9kaWZpYWJsZV9yZWdpc3RlclN0YXRpY1VzZWNsb3N1cml6ZWRTdGF0aWNzdGVhck9mZnJlZ2lzdGVyU3RhdGljSW52b2NhdGlvbm5vcm1hbFVzZWluc3RhbmNlVXNhZ2VfZ2V0TWVtYmVyVXNhZ2VfcHJvY2Vzc0luc3RhbnRpYXRlZENsYXNzTWVtYmVyYXBwbGllZFVzZWhhc1JlYWRoYXNXcml0ZWhhc0ludm9rZWhhc1BlbmRpbmdDbG9zdXJpemF0aW9uVXNlaGFzUGVuZGluZ05vcm1hbFVzZXByb2Nlc3NDbGFzc3NlZW5Db25zdGFudHNzb3J0ZWRnZW5lcmljTG9jYWxGdW5jdGlvbnNnZW5lcmljSW5zdGFuY2VNZXRob2RzcHJvY2Vzc01lbWJlclVzZW1lbWJlclVzYWdlaGFzVXNldXNlck5vU3VjaE1ldGhvZHNnZW5lcmljTWV0aG9kc2lzTmF0aXZlTWVtYmVyZGVjbGFyZXJyZWdpc3RlckNvbnN0VHlwZUxpdGVyYWxyZWdpc3RlclR5cGVBcmd1bWVudEJhY2tlbmRVc2FnZUJhY2tlbmRVc2FnZUJ1aWxkZXJJbnRlcmNlcHRvckRhdGFCdWlsZGVyTmF0aXZlRGF0YUJ1aWxkZXJPcGVuV29ybGRSZXNvbHV0aW9uV29ybGRCdWlsZGVyZm9yRWFjaExvY2FsRnVuY3Rpb25sb2NhbEZ1bmN0aW9uc1dpdGhGcmVlVHlwZVZhcmlhYmxlc2Nsb3N1cml6ZWRNZW1iZXJzV2l0aEZyZWVUeXBlVmFyaWFibGVzZmllbGRTZXR0ZXJzZm9yRWFjaEluc3RhbnRpYXRlZENsYXNzY2xvc2VkV29ybGRGb3JUZXN0aW5nUmVzb2x1dGlvbkVucXVldWVyV29ybGRCdWlsZGVySW5zdGFuY2UgZGlyZWN0bHkgYWJzdHJhY3RseSBub25lIHJlZGlyZWN0SW5zdGFudGlhdGlvbkluZm9pbnN0YW50aWF0aW9uTWFwaXNEaXJlY3RseUluc3RhbnRpYXRlZGlzQWJzdHJhY3RseUluc3RhbnRpYXRlZGFkZEluc3RhbnRpYXRpb25JbnN0YW50aWF0aW9uICBpcyBub3QgYWxsb3dlZC5oYXNJbnN0YW50aWF0aW9uSW5zdGFudGlhdGlvbkluZm9bbmVlZHNDb21tYTx1bmtub3duPlJlc29sdXRpb25Xb3JsZEJ1aWxkZXJJbXBsX2luc3RhbnRpYXRpb25JbmZvX21lbWJlclVzYWdlX2RhcnRUeXBlc19pbnRlcmNlcHRvckRhdGFCdWlsZGVyX3J0aU5lZWRCdWlsZGVyX2FsbG9jYXRvckFuYWx5c2lzX25vU3VjaE1ldGhvZFJlZ2lzdHJ5X3NlbGVjdG9yQ29uc3RyYWludHNTdHJhdGVneV9jbGFzc0hpZXJhcmNoeUJ1aWxkZXJfY2xhc3NRdWVyaWVzaGFzUnVudGltZVR5cGVTdXBwb3J0aGFzRnVuY3Rpb25BcHBseVN1cHBvcnRfY2xvc2VkX2Nsb3NlZFdvcmxkQ2FjaGVfbGl2ZUluc3RhbmNlTWVtYmVyc19wcm9jZXNzZWRNZW1iZXJzbWVtYmVyVXNhZ2VGb3JUZXN0aW5nVGhlIHdvcmxkIGJ1aWxkZXIgaGFzIG5vdCB5ZXQgYmVlbiBjbG9zZWQuZ2V0SW5zdGFudGlhdGlvbk1hcGluc3RhbmNlc2NvbnRhaW5zVHlwZVZhcmlhYmxlc3VwZGF0ZUNsYXNzSGllcmFyY2h5Tm9kZUZvckNsYXNzZGlyZWN0bHlJbnN0YW50aWF0ZWRhYnN0cmFjdGx5SW5zdGFudGlhdGVkX2dldE1hdGNoaW5nQ2FsbFN0cnVjdHVyZXNjYWxsU3RydWN0dXJlc19nZXRJbnZvY2F0aW9uQ2FsbFN0cnVjdHVyZXNfaGFzSW52b2tlZEdldHRlcnNob3VsZEJlUmVtb3ZlZHVjb25zdGFudEluaXREaXJlY3Qgc3RhdGljIHVzZSBpcyBub3Qgc3VwcG9ydGVkIGZvciByZXNvbHV0aW9uLlN0YXRpYyB1c2UgIGlzIG5vdCBzdXBwb3J0ZWQgZHVyaW5nIHJlc29sdXRpb24uX2NyZWF0ZUNsYXNzVXNhZ2V1cGRhdGVVc2FnZXRyYWNrUGFyYW1ldGVyc2lzRnVsbHlJbnZva2VkZnVsbHlVc2VkVW5lbnF1ZXVlZCB1c2FnZSBvZiA6IGJlZm9yZTogLCBhZnRlcjogYWxsTWl4aW5Vc2VzT2Zwb3B1bGF0ZUhpZXJhcmNoeU5vZGVzdHlwZXNJbXBsZW1lbnRlZEJ5U3ViY2xhc3Nlc2FkZFN1YnR5cGVzdHlwZXNJbXBsZW1lbnRlZEJ5U3ViY2xhc3Nlc09mQ2xzZ2V0U3VwZXJ0eXBlc2NvbXB1dGVBc3NpZ25lZEluc3RhbmNlTWVtYmVyc2Fzc2lnbmVkSW5zdGFuY2VNZW1iZXJzaW5zdGFuY2VNZW1iZXJpc0luaGVyaXRlZElucmVsYXRpb25pc0luaGVyaXRlZEluQ2xhc3NtZW1iZXJIb2xkaW5nQ2xhc3Npc0luaGVyaXRlZEluRXhhY3RDbGFzc2lzSW5oZXJpdGVkSW5UaGlzQ2xhc3Npc0luaGVyaXRlZEluU3VidHlwZU9mVW5leHBlY3RlZCBDbGFzc1JlbGF0aW9uICBpcyB1c2VkIGJ1dCBub3QgcHJvY2Vzc2VkOiAgaXMgcHJvY2Vzc2VkIGJ1dCBub3QgdXNlZDogIGlzIHByb2Nlc3NlZCBidXQgaGFzIG5vdCB1c2FnZS5pbXBsZW1lbnRlZENsYXNzZXNsaXZlSW5zdGFuY2VNZW1iZXJzZGFydDJqcy51bml2ZXJzZS53b3JsZF9pbXBhY3RWaXNpdFVzZWR5bmFtaWNVc2Vzc3RhdGljVXNlc3R5cGVVc2VzY29uc3RhbnRVc2VzdGl0bGVkeW5hbWljIHVzZXNzdGF0aWMgdXNlc3R5cGUgdXNlc2NvbnN0YW50IHVzZXNXb3JsZEltcGFjdEJ1aWxkZXJyZWdpc3RlclR5cGVVc2VfZHluYW1pY1VzZXNfc3RhdGljVXNlc190eXBlVXNlc19jb25zdGFudFVzZXNhZGRJbXBhY3RTdGFnZWRXb3JsZEltcGFjdEJ1aWxkZXJjb2xsZWN0SW1wYWN0c19jdXJyZW50QnVpbGRlcl9idWlsZGVyc19lbnN1cmVCdWlsZGVyd29ybGRJbXBhY3RzVHJhbnNmb3JtZWRXb3JsZEltcGFjdFRyYW5zZm9ybWVkV29ybGRJbXBhY3QoSW1wYWN0VXNlQ2FzZShpbXBhY3RVc2VDYXNlX3Zpc2l0U3RhdGljVXNlX3Zpc2l0RHluYW1pY1VzZV92aXNpdFR5cGVVc2VfdmlzaXRDb25zdGFudFVzZWRhcnQyanMud29ybGRKRmllbGRBbmFseXNpc0ludGVyY2VwdG9yRGF0YU5hdGl2ZURhdGFOb1N1Y2hNZXRob2REYXRhUnVudGltZVR5cGVzTmVlZFdvcmxkY2xvc3VyZURhdGFMb29rdXB5Y29tcHV0ZVJlY2VpdmVyVHlwZUNvbnN0IGNvbnN0cnVjdG9yIGNhbid0IGhhdmUgYSBib2R5LlRyeSByZW1vdmluZyB0aGUgJ2NvbnN0JyBrZXl3b3JkIG9yIHRoZSBib2R5LiAgICAgICAgIGNsYXNzIEMgewogICAgICAgICAgIGNvbnN0IEMoKSB7fQogICAgICAgICB9CgogICAgICAgICBtYWluKCkgPT4gbmV3IEMoKTtUcnkgcmVtb3ZpbmcgdGhlICdjb25zdCcga2V5d29yZCBvciByZXBsYWNpbmcgdGhlIGJvZHkgd2l0aCAnPScgZm9sbG93ZWQgYnkgYSB2YWxpZCB0YXJnZXQuICAgICAgICAgY2xhc3MgQyB7CiAgICAgICAgICAgY29uc3QgZmFjdG9yeSBDKCkge30KICAgICAgICAgfQoKICAgICAgICAgbWFpbigpID0+IG5ldyBDKCk7Q2FuJ3QgaGF2ZSBtb2RpZmllciAnI3ttb2RpZmllcn0nIGhlcmUuVHJ5IHJlbW92aW5nICcje21vZGlmaWVyfScudmFyIFN0cmluZyBmb287IG1haW4oKXt9dmFyIGZpbmFsIGZvbzsgbWFpbigpe312YXIgdmFyIGZvbzsgbWFpbigpe312YXIgY29uc3QgZm9vOyBtYWluKCl7fXZhciBhYnN0cmFjdCBmb287IG1haW4oKXt9dmFyIHN0YXRpYyBmb287IG1haW4oKXt9dmFyIGV4dGVybmFsIGZvbzsgbWFpbigpe31maW5hbCB2YXIgZm9vOyBtYWluKCl7fWNvbnN0IHZhciBmb287IG1haW4oKXt9YWJzdHJhY3QgdmFyIGZvbzsgbWFpbigpe31zdGF0aWMgdmFyIGZvbzsgbWFpbigpe31leHRlcm5hbCB2YXIgZm9vOyBtYWluKCl7fVRyeSByZXBsYWNpbmcgbW9kaWZpZXIgJyN7bW9kaWZpZXJ9JyB3aXRoICd2YXInLCAnZmluYWwnLCBvciBhIHR5cGUuc2V0IGZvbzsgbWFpbigpe31hYnN0cmFjdCBmb287IG1haW4oKXt9c3RhdGljIGZvbzsgbWFpbigpe31leHRlcm5hbCBmb287IG1haW4oKXt9Y2xhc3MgQSB7IGludCBBKCkge30gfSBtYWluKCkgeyBuZXcgQSgpOyB9RGlkIHlvdSBtZWFuICdyZXRocm93Jz9SZXRocm93IG11c3QgYmUgaW5zaWRlIG9mIGNhdGNoIGNsYXVzZS5UcnkgbW92aW5nIHRoZSBleHByZXNzaW9uIGludG8gYSBjYXRjaCBjbGF1c2UsIG9yIHVzaW5nIGEgJ3Rocm93JyBleHByZXNzaW9uLm1haW4oKSB7IHJldGhyb3c7IH1Db25zdHJ1Y3RvcnMgY2FuJ3QgcmV0dXJuIHZhbHVlcy5UcnkgcmVtb3ZpbmcgdGhlIHJldHVybiBzdGF0ZW1lbnQgb3IgdXNpbmcgYSBmYWN0b3J5IGNvbnN0cnVjdG9yLiAgICAgICAgY2xhc3MgQyB7CiAgICAgICAgICBDKCkgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG1haW4oKSA9PiBuZXcgQygpO0Nhbid0IHJldHVybiBhIHZhbHVlIGZyb20gYSBnZW5lcmF0b3IgZnVuY3Rpb24gKHVzaW5nIHRoZSAnI3ttb2RpZmllcn0nIG1vZGlmaWVyKS5UcnkgcmVtb3ZpbmcgdGhlIHZhbHVlLCByZXBsYWNpbmcgJ3JldHVybicgd2l0aCAneWllbGQnIG9yIGNoYW5naW5nIHRoZSBtZXRob2QgYm9keSBtb2RpZmllci4gICAgICAgIGZvbygpIGFzeW5jKiB7IHJldHVybiAwOyB9CiAgICAgICAgbWFpbigpID0+IGZvbygpOwogICAgICAgICAgICAgICAgZm9vKCkgc3luYyogeyByZXR1cm4gMDsgfQogICAgICAgIG1haW4oKSA9PiBmb28oKTsKICAgICAgICAnI3tmcm9tVHlwZX0nIGlzIG5vdCBhc3NpZ25hYmxlIHRvICcje3RvVHlwZX0nLlRoZSBlbGVtZW50IHR5cGUgJyN7Y3VycmVudFR5cGV9JyBvZiAnI3tleHByZXNzaW9uVHlwZX0nIGlzIG5vdCBhc3NpZ25hYmxlIHRvICcje2VsZW1lbnRUeXBlfScuICAgICAgICBtYWluKCkgewogICAgICAgICAgTGlzdDxpbnQ+IGxpc3QgPSA8aW50PlsxLCAyXTsKICAgICAgICAgIGZvciAoU3RyaW5nIHggaW4gbGlzdCkgeDsKICAgICAgICB9CiAgICAgICAgQ2FuJ3QgcmVzb2x2ZSAnI3tuYW1lfScuVGhlIG1ldGhvZCAnI3ttZW1iZXJOYW1lfScgaXMgbm90IGRlZmluZWQgZm9yIHRoZSBjbGFzcyAnI3tjbGFzc05hbWV9Jy4gICAgICAgIGNsYXNzIEEgewogICAgICAgICAgZm9vKCkgeyBiYXIoKTsgfQogICAgICAgIH0KICAgICAgICBtYWluKCkgeyBuZXcgQSgpLmZvbygpOyB9CiAgICAgICAgVGhlIGdldHRlciAnI3ttZW1iZXJOYW1lfScgaXMgbm90IGRlZmluZWQgZm9yIHRoZSBjbGFzcyAnI3tjbGFzc05hbWV9Jy5jbGFzcyBBIHt9IG1haW4oKSB7IG5ldyBBKCkueDsgfWNsYXNzIEEge30gbWFpbigpIHsgQS54OyB9VGhlIHNldHRlciAnI3ttZW1iZXJOYW1lfScgaW4gY2xhc3MgJyN7Y2xhc3NOYW1lfScgY2FuIG5vdCBiZSB1c2VkIGFzIGEgZ2V0dGVyLmNsYXNzIEEgeyBzZXQgeCh5KSB7fSB9IG1haW4oKSB7IG5ldyBBKCkueDsgfVRoZSBvcGVyYXRvciAnI3ttZW1iZXJOYW1lfScgaXMgbm90IGRlZmluZWQgZm9yIHRoZSBjbGFzcyAnI3tjbGFzc05hbWV9Jy5jbGFzcyBBIHt9IG1haW4oKSB7IG5ldyBBKCkgKyAzOyB9VGhlIHNldHRlciAnI3ttZW1iZXJOYW1lfScgaXMgbm90IGRlZmluZWQgZm9yIHRoZSBjbGFzcyAnI3tjbGFzc05hbWV9Jy5jbGFzcyBBIHt9IG1haW4oKSB7IG5ldyBBKCkueCA9IDQ5OTsgfUNhbid0IHJlc29sdmUgJyN7bWVtYmVyTmFtZX0nIGluIGEgc3VwZXJjbGFzcyBvZiAnI3tjbGFzc05hbWV9Jy5UaGUgc2V0dGVyICcje21lbWJlck5hbWV9JyBpcyBub3QgZGVmaW5lZCBpbiBhIHN1cGVyY2xhc3Mgb2YgJyN7Y2xhc3NOYW1lfScuICAgICAgICBjbGFzcyBBIHt9CiAgICAgICAgY2xhc3MgQiBleHRlbmRzIEEgewogICAgICAgICAgZm9vKCkgeyBzdXBlci54ID0gNDk5OyB9CiAgICAgICAgfQogICAgICAgIG1haW4oKSB7IG5ldyBCKCkuZm9vKCk7IH0KICAgICAgICBDYW5ub3QgcmVzb2x2ZSBnZXR0ZXIgJyN7bmFtZX0nLnNldCBmb28oeCkge30gIG1haW4oKSB7IGZvbzsgfUNhbm5vdCByZXNvbHZlIHNldHRlciAnI3tuYW1lfScuICAgICAgICBtYWluKCkgewogICAgICAgICAgZmluYWwgeCA9IDE7CiAgICAgICAgICB4ID0gMjsKICAgICAgICB9ICAgICAgICBtYWluKCkgewogICAgICAgICAgY29uc3QgeCA9IDE7CiAgICAgICAgICB4ID0gMjsKICAgICAgICB9CiAgICAgICAgICAgICAgICBmaW5hbCB4ID0gMTsKICAgICAgICBtYWluKCkgeyB4ID0gMzsgfQogICAgICAgICAgICAgICAgY29uc3QgeCA9IDE7CiAgICAgICAgbWFpbigpIHsgeCA9IDM7IH0KICAgICAgICBnZXQgZm9vID0+IG51bGwgIG1haW4oKSB7IGZvbyA9IDU7IH1jb25zdCBmb28gPSAwICBtYWluKCkgeyBmb28gPSA1OyB9ZGFydDJqcy5jb25zdGFudHMuZXhwcmVzc2lvbnNDb25zdGFudEV4cHJlc3Npb25LaW5kQ29uc3RhbnRFeHByZXNzaW9uS2luZC5BU0JJTkFSWUNvbnN0YW50RXhwcmVzc2lvbktpbmQuQklOQVJZQk9PTENvbnN0YW50RXhwcmVzc2lvbktpbmQuQk9PTEJPT0xfRlJPTV9FTlZJUk9OTUVOVENvbnN0YW50RXhwcmVzc2lvbktpbmQuQk9PTF9GUk9NX0VOVklST05NRU5UQ09OQ0FURU5BVEVDb25zdGFudEV4cHJlc3Npb25LaW5kLkNPTkNBVEVOQVRFQ29uc3RhbnRFeHByZXNzaW9uS2luZC5DT05ESVRJT05BTENPTlNUUlVDVEVEQ29uc3RhbnRFeHByZXNzaW9uS2luZC5DT05TVFJVQ1RFRENvbnN0YW50RXhwcmVzc2lvbktpbmQuRE9VQkxFRVJST05FT1VTQ29uc3RhbnRFeHByZXNzaW9uS2luZC5FUlJPTkVPVVNDb25zdGFudEV4cHJlc3Npb25LaW5kLkZVTkNUSU9ORklFTERDb25zdGFudEV4cHJlc3Npb25LaW5kLkZJRUxESURFTlRJQ0FMQ29uc3RhbnRFeHByZXNzaW9uS2luZC5JREVOVElDQUxDb25zdGFudEV4cHJlc3Npb25LaW5kLklOVElOVF9GUk9NX0VOVklST05NRU5UQ29uc3RhbnRFeHByZXNzaW9uS2luZC5JTlRfRlJPTV9FTlZJUk9OTUVOVExJU1RDb25zdGFudEV4cHJlc3Npb25LaW5kLkxJU1RDb25zdGFudEV4cHJlc3Npb25LaW5kLlNFVE1BUENvbnN0YW50RXhwcmVzc2lvbktpbmQuTUFQQ29uc3RhbnRFeHByZXNzaW9uS2luZC5OVUxMQ29uc3RhbnRFeHByZXNzaW9uS2luZC5TVFJJTkdTVFJJTkdfRlJPTV9FTlZJUk9OTUVOVENvbnN0YW50RXhwcmVzc2lvbktpbmQuU1RSSU5HX0ZST01fRU5WSVJPTk1FTlRTVFJJTkdfTEVOR1RIQ29uc3RhbnRFeHByZXNzaW9uS2luZC5TVFJJTkdfTEVOR1RIQ29uc3RhbnRFeHByZXNzaW9uS2luZC5TWU1CT0xUWVBFQ29uc3RhbnRFeHByZXNzaW9uS2luZC5UWVBFVU5BUllDb25zdGFudEV4cHJlc3Npb25LaW5kLlVOQVJZTE9DQUxfVkFSSUFCTEVDb25zdGFudEV4cHJlc3Npb25LaW5kLkxPQ0FMX1ZBUklBQkxFUE9TSVRJT05BTF9SRUZFUkVOQ0VDb25zdGFudEV4cHJlc3Npb25LaW5kLlBPU0lUSU9OQUxfUkVGRVJFTkNFTkFNRURfUkVGRVJFTkNFQ29uc3RhbnRFeHByZXNzaW9uS2luZC5OQU1FRF9SRUZFUkVOQ0VDb25zdGFudEV4cHJlc3Npb25LaW5kLkFTU0VSVElOU1RBTlRJQVRJT05Db25zdGFudEV4cHJlc3Npb25LaW5kLklOU1RBTlRJQVRJT05nZXRLbm93blR5cGVfY3JlYXRlU3RydWN0dXJlZFRleHRfZXF1YWxzVXNlIENvbnN0YW50RXhwcmVzc2lvbi50b0RhcnRUZXh0KCkgb3IgQ29uc3RhbnRFeHByZXNzaW9uLnRvU3RydWN0dXJlZFRleHQoKSBpbnN0ZWFkIG9mIENvbnN0YW50RXhwcmVzc2lvbi50b1N0cmluZygpaXNJbXBsaWNpdGlzUG90ZW50aWFsRXJyb25lb3VzQ29uc3RhbnRFeHByZXNzaW9uRXJyb25lb3VzKClCb29sQ29uc3RhbnRFeHByZXNzaW9udmlzaXRCb29sQm9vbCh2YWx1ZT1JbnRDb25zdGFudEV4cHJlc3Npb252aXNpdEludEludCh2YWx1ZT1Eb3VibGVDb25zdGFudEV4cHJlc3Npb252aXNpdERvdWJsZURvdWJsZSh2YWx1ZT1TdHJpbmdDb25zdGFudEV4cHJlc3Npb252aXNpdFN0cmluZ1N0cmluZyh2YWx1ZT1OdWxsQ29uc3RhbnRFeHByZXNzaW9udmlzaXROdWxsTnVsbCgpTGlzdENvbnN0YW50RXhwcmVzc2lvbkxpc3QodHlwZT0sdmFsdWVzPVtkZWxpbWl0ZXJdKVNldENvbnN0YW50RXhwcmVzc2lvbnZpc2l0U2V0U2V0KHR5cGU9TWFwQ29uc3RhbnRFeHByZXNzaW9udmlzaXRNYXBNYXAodHlwZT0sZW50cmllcz1bLT5ldmFsdWF0ZU1hcEJvZHlDb25zdHJ1Y3RlZENvbnN0YW50RXhwcmVzc2lvbnZpc2l0Q29uc3RydWN0ZWRDb25zdHJ1Y3RlZCh0eXBlPSxjb25zdHJ1Y3Rvcj1jYWxsU3RydWN0dXJlPSxhcmd1bWVudHM9W2NvbXB1dGVJbnN0YW5jZURhdGFjb25zdGFudENvbnN0cnVjdG9yZ2V0Q29uc3RydWN0b3JDb25zdGFudE5vIGNvbnN0YW50IGNvbnN0cnVjdG9yIGNvbXB1dGVkIGZvciBjb21wdXRlSW5zdGFuY2VUeXBlaW5zdGFuY2VUeXBlZXZhbHVhdGVDb25zdHJ1Y3Rvcmluc3RhbmNlRGF0YWlzVmFsaWRBc0NvbnN0YW50ZmllbGRNYXBObyB2YWx1ZSBjb21wdXRlZCBmb3IgYXNzZXJ0aW9uYXNzZXJ0aW9uc0NvbmNhdGVuYXRlQ29uc3RhbnRFeHByZXNzaW9udmlzaXRDb25jYXRlbmF0ZUNvbmNhdGVuYXRlKGV4cHJlc3Npb25zPVtTeW1ib2xDb25zdGFudEV4cHJlc3Npb252aXNpdFN5bWJvbFN5bWJvbChuYW1lPVR5cGVDb25zdGFudEV4cHJlc3Npb25VbmV4cGVjdGVkIHR5cGUgY29uc3RhbnQgdHlwZTogVHlwZSh0eXBlPUFzQ29uc3RhbnRFeHByZXNzaW9udmlzaXRBc0FzKHZhbHVlPWV4cHJlc3Npb25WYWx1ZWNoZWNrQ2FzdHN0eXBlSW5Db250ZXh0Z2V0VHlwZUluQ29udGV4dGNhc3RUeXBlRmllbGRDb25zdGFudEV4cHJlc3Npb25GaWVsZChlbGVtZW50PWV2YWx1YXRlRmllbGRnZXRGaWVsZENvbnN0YW50TG9jYWxWYXJpYWJsZUNvbnN0YW50RXhwcmVzc2lvbnZpc2l0TG9jYWxWYXJpYWJsZUxvY2FsVmFyaWFibGUoZWxlbWVudD1nZXRMb2NhbENvbnN0YW50RnVuY3Rpb25Db25zdGFudEV4cHJlc3Npb25GdW5jdGlvbihlbGVtZW50PUJpbmFyeUNvbnN0YW50RXhwcmVzc2lvblBSRUNFREVOQ0VfTUFQTWlzc2luZyBwcmVjZW5kZW5jZSBmb3IgYmluYXJ5IG9wZXJhdG9yOiAncG90ZW50aWFsT3BlcmF0b3J2aXNpdEJpbmFyeUJpbmFyeShsZWZ0PSxvcD0scmlnaHQ9bGVmdFZhbHVlcmlnaHRWYWx1ZWxlZnRDb25zdGFudGxlZnRUeXBlcmlnaHRDb25zdGFudHJpZ2h0VHlwZXNoaWZ0bmVnYXRla25vd25MZWZ0VHlwZWtub3duUmlnaHRUeXBlVW5leHBlY3RlZCBjb25zdGFudCBiaW5hcnkgb3BlcmF0b3I6IElkZW50aWNhbENvbnN0YW50RXhwcmVzc2lvbnZpc2l0SWRlbnRpY2FsSWRlbnRpY2FsKGxlZnQ9VW5hcnlDb25zdGFudEV4cHJlc3Npb252aXNpdFVuYXJ5VW5hcnkob3A9LGV4cHJlc3Npb249U3RyaW5nTGVuZ3RoQ29uc3RhbnRFeHByZXNzaW9udmlzaXRTdHJpbmdMZW5ndGhTdHJpbmdMZW5ndGgoZXhwcmVzc2lvbj1Db25kaXRpb25hbENvbnN0YW50RXhwcmVzc2lvbnRydWVFeHBmYWxzZUV4cHZpc2l0Q29uZGl0aW9uYWxDb25kaXRpb25hbChjb25kaXRpb249LHRydWU9LGZhbHNlPWNvbmRpdGlvblZhbHVldHJ1ZVZhbHVlZmFsc2VWYWx1ZXRydWVUeXBlZmFsc2VUeXBlUG9zaXRpb25hbEFyZ3VtZW50UmVmZXJlbmNldmlzaXRQb3NpdGlvbmFsUG9zaXRpb25hbChpbmRleD1nZXRQb3NpdGlvbmFsQXJndW1lbnROYW1lZEFyZ3VtZW50UmVmZXJlbmNldmlzaXROYW1lZE5hbWVkKG5hbWU9Z2V0TmFtZWRBcmd1bWVudEZyb21FbnZpcm9ubWVudENvbnN0YW50RXhwcmVzc2lvbl9jaGVja05hbWVGcm9tRW52aXJvbm1lbnRCb29sRnJvbUVudmlyb25tZW50Q29uc3RhbnRFeHByZXNzaW9udmlzaXRCb29sRnJvbUVudmlyb25tZW50Ym9vbC5mcm9tRW52aXJvbm1lbnQobmFtZT0sZGVmYXVsdFZhbHVlPW5hbWVDb25zdGFudFZhbHVlZGVmYXVsdENvbnN0YW50VmFsdWVuYW1lU3RyaW5nQ29uc3RhbnRWYWx1ZXJlYWRGcm9tRW52aXJvbm1lbnRJbnRGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb252aXNpdEludEZyb21FbnZpcm9ubWVudGludC5mcm9tRW52aXJvbm1lbnQobmFtZT1TdHJpbmdGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb252aXNpdFN0cmluZ0Zyb21FbnZpcm9ubWVudFN0cmluZy5mcm9tRW52aXJvbm1lbnQobmFtZT1Bc3NlcnRDb25zdGFudEV4cHJlc3Npb24sbWVzc2FnZT12YWxpZEFzc2VydGVuYWJsZUFzc2VydGlvbnN2aXNpdEFzc2VydEluc3RhbnRpYXRpb25Db25zdGFudEV4cHJlc3Npb25JbnN0YW50aWF0aW9uKHR5cGVBcmd1bWVudHM9dHlwZUFyZ3VtZW50c0luQ29udGV4dENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3JleHBDb25zdEV4cFByaW50ZXJsZWZ0QXNzb2NpYXRpdmV3cml0ZVR5cGVBcmd1bWVudHMgYXMgY29uc3Qgd3JpdGVBbGxuYW1lZE9mZnNldGlkZW50aWNhbCgubGVuZ3RoID8gIDogYXJnc1tjb25zdCBib29sLmZyb21FbnZpcm9ubWVudCgsIGRlZmF1bHRWYWx1ZTogY29uc3QgaW50LmZyb21FbnZpcm9ubWVudChjb25zdCBTdHJpbmcuZnJvbUVudmlyb25tZW50KGRhcnQyanMuY29kZV9vdXRwdXRTb3VyY2VMb2NhdGlvbnNhZGRTb3VyY2VMb2NhdGlvbnRhcmdldE9mZnNldHNvdXJjZVBvc2l0aW9uYWRkUHVzaHB1c2hQb3NpdGlvbmFkZFBvcGZvckVhY2hTb3VyY2VMb2NhdGlvbmZyYW1lTWFya2Vyc19Tb3VyY2VMb2NhdGlvbnNJbXBsY29kZU91dHB1dG1hcmtlcnNzb3VyY2VMb2NhdGlvbmZyYW1lc19tZXJnZVNvdXJjZUxvY2F0aW9uc1Byb3ZpZGVyY3JlYXRlU291cmNlTG9jYXRpb25zQ29kZU91dHB1dGFkZEJ1ZmZlckFic3RyYWN0Q29kZU91dHB1dHNvdXJjZUxvY2F0aW9uc01hcF9hZGRJbnRlcm5hbENvZGUgb3V0cHV0IGlzIGNsb3NlZC4gVHJ5aW5nIHRvIHdyaXRlICdnZXRUZXh0Q29kZSBvdXRwdXQgaXMgYWxyZWFkeSBjbG9zZWQuQnVmZmVyZWRDb2RlT3V0cHV0Q29kZUJ1ZmZlckRvbid0IHVzZSBDb2RlQnVmZmVyLnRvU3RyaW5nKCkgc2luY2UgaXQgZHJvcHMgc291cmNlbWFwIGRhdGEuU3RyZWFtQ29kZU91dHB1dF9saXN0ZW5lcnNrZXJuZWwuaGllcmFyY2h5X2Jhc2VkX3R5cGVfZW52aXJvbm1lbnRJbnRlcm5lck51bGxJbnRlcm5lcmZhc3RhLmNsYXNzX2hpZXJhcmNoeV9idWlsZGVybm9TdWNoTWV0aG9kTmFtZVN0YW5kYXJkQm91bmRzVHlwZUNvbnN0cmFpbnRHYXRoZXJlclR5cGVDb25zdHJhaW50VHlwZXNvYmplY3RLZXJuZWxDbGFzc2Z1dHVyZUtlcm5lbENsYXNzZnV0dXJlT3JLZXJuZWxDbGFzc2Z1bmN0aW9uS2VybmVsQ2xhc3NudWxsS2VybmVsQ2xhc3NnZXROb2RlRnJvbUNsYXNzZ2V0Tm9kZUZyb21UeXBlZ2V0Tm9kZUZyb21LZXJuZWxDbGFzc2FzU3VwZXJ0eXBlT2ZjbHNOb2Rlc3VwZXJ0eXBlTm9kZXN1cGVyY2xhc3Nlc3N1cGVydHlwZURlY2xhcmF0aW9uZ2V0S2VybmVsVHlwZUFzSW5zdGFuY2VPZmdldEtlcm5lbExlZ2FjeUxlYXN0VXBwZXJCb3VuZG5vZGUxbm9kZTJub2RlczFjb21wdXRlQWxsU3VwZXJOb2Rlc25vZGVzMmNhbmRpZGF0ZTFjYW5kaWRhdGUybWF4SW5oZXJpdGFuY2VQYXRoQ2xhc3NIaWVyYXJjaHlOb2RlQnVpbGRlcmhhc05vU3VjaE1ldGhvZGFic3RyYWN0TWVtYmVyc2hhbmRsZU1lcmdlQ29uZmxpY3RtZXJnZUtpbmRyZXBvcnRJbmhlcml0YW5jZUNvbmZsaWN0c3RhdGljTWVtYmVyZHVwbGljYXRlaGFuZGxlT25seUFoYW5kbGVPbmx5QnN1cGVybm9kZWluZmVyTWl4aW5BcHBsaWNhdGlvbmxvY2FsTWVtYmVyc2xvY2FsU2V0dGVyc21lcmdlQWNjZXNzb3JzY2xhc3NNZW1iZXJzY2xhc3NTZXR0ZXJzaW50ZXJmYWNlTWVtYmVyc3N1YnN0U3VwZXJ0eXBlc2RpcmVjdEludGVyZmFjZXNtZXJnZUludGVyZmFjZXNtZXJnZWRNZW1iZXJzbWVyZ2VkU2V0dGVyc2FkZEludGVyZmFjZWRpcmVjdEludGVyZmFjZWludGVyZmFjZU5vZGVyZXBvcnRNaXNzaW5nTWVtYmVyc2luc3RhbGxOc21IYW5kbGVyc2NvbXB1dGVEZWZhdWx0VHlwZUFyZ3VtZW50c3N1YnN0ZWRzdWJzdG15RGVwdGhtZW1iZXJMaXN0c3NldHRlckxpc3RzbWVyZ2VMaXN0c2lzT2RkY29udGV4dE1hcHBhcmVudE5hbWVkaXNwbGF5TmFtZWFMaXN0Ykxpc3RrZXJuZWxNaXhlZEluVHlwZWluZmVycmVkQXJndW1lbnRzQ2xhc3NIaWVyYXJjaHlOb2RlICBMb25nZXN0IHBhdGggdG8gT2JqZWN0OiAgIHN1cGVyY2xhc3NlczotPiAgIGludGVyZmFjZXM6cHJpbnRNZW1iZXJzaGVhZGluZyAgICBjb21wYXJlTWF4SW5oZXJpdGFuY2VQYXRoTWVyZ2VSZXN1bHRNZXJnZUtpbmRNZXJnZUtpbmQuc3VwZXJjbGFzc01lcmdlS2luZC5pbnRlcmZhY2VzTWVyZ2VLaW5kLnN1cGVydHlwZXNNZXJnZUtpbmQuYWNjZXNzb3JzQnVpbGRlck1peGluSW5mZXJyZXJnYXRoZXJlcnJlcG9ydFByb2JsZW1fVHlwZUJ1aWxkZXJDb25zdHJhaW50R2F0aGVyZXImVHlwZUNvbnN0cmFpbnRHYXRoZXJlciZTdGFuZGFyZEJvdW5kc3N1YmNsYXNzaW5nZ2V0U3RhbmRhcmRMb3dlckJvdW5kX2Z1bmN0aW9uU3RhbmRhcmRMb3dlckJvdW5kX3R5cGVQYXJhbWV0ZXJTdGFuZGFyZFVwcGVyQm91bmRfaW50ZXJmYWNlU3RhbmRhcmRVcHBlckJvdW5kX2Z1bmN0aW9uU3RhbmRhcmRVcHBlckJvdW5kdHlwZTEgPSA7IHR5cGUyID0gZ3RvdGFsUG9zaXRpb25hbGZUeXBlZ1R5cGVoYXNQb3NpdGlvbmFsZk5hbWVnTmFtZW9yZGVyaGFzTmFtZWR0QXJnczF0QXJnczJ0QXJnc1R5cGVCdWlsZGVyQ29uc3RyYWludEdhdGhlcmVyYWRkTG93ZXJCb3VuZGFkZFVwcGVyQm91bmRpc1N1YnR5cGVPZktlcm5lbGNvbXBhcmVEZWNsYXJhdGlvbnNtZW1iZXJLaW5kaXNOYW1lVmlzaWJsZUluaXNJbmhlcml0YW5jZUNvbmZsaWN0aW1wbGllc1NldHRlcmluaGVyaXRlZENvbmZsaWN0Q29udGV4dGluaGVyaXRlZENvbmZsaWN0Q29udGV4dEtlcm5lbGZhc3RhLmltcGxpY2l0X3R5cGVpbml0aWFsaXplclRva2VuZmFzdGEua2VybmVsX2NsYXNzX2J1aWxkZXJ0eXBlX2FsZ2VicmFidWlsZFR5cGVzV2l0aEJ1aWx0QXJndW1lbnRzdHlwZVZhcmlhYmxlc0NvdW50YnVpbGRUeXBlQXJndW1lbnRzYnVpbGRUeXBlc3VwZXJDbGFzc3N1cGVyQ2xhc3NUeXBlZGVjbHByb2JsZW1zcHJvYmxlbXNPZmZzZXRzaW1wbGVtZW50ZWRyZXBldGl0aW9uc2NoZWNrQm91bmRzSW5TdXBlcnR5cGVyZWRpcmVjdGluZ3RhcmdldEJ1aWxkZXJhZGRSZWRpcmVjdGluZ0NvbnN0cnVjdG9yc2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keWNvbnN0cnVjdG9yc0ZpZWxkaGFuZGxlU2VlbkNvdmFyaWFudGNoZWNrT3ZlcnJpZGVpc0ludGVyZmFjZUNoZWNrQ29uc3RydWN0b3IgaW4gb3ZlcnJpZGUgY2hlY2suc2VlbkNvdmFyaWFudGNoZWNrTWV0aG9kT3ZlcnJpZGVjaGVja0dldHRlck92ZXJyaWRlY2hlY2tTZXR0ZXJPdmVycmlkZWRlY2xhcmVkTWVtYmVySGFzR2V0dGVyaW50ZXJmYWNlTWVtYmVySGFzR2V0dGVyZGVjbGFyZWRNZW1iZXJIYXNTZXR0ZXJpbnRlcmZhY2VNZW1iZXJIYXNTZXR0ZXJvdmVycmlkZVBhaXJDYWxsYmFja211c3RIYXZlSW1wbGVtZW50YXRpb25maW5kTWlzc2luZ0ltcGxlbWVudGF0aW9uc2Rpc3BhdGNoVGFyZ2V0c3RhcmdldEluZGV4Zm91bmRUYXJnZXRkaXNwYXRjaFRhcmdldGhhc1VzZXJEZWZpbmVkTm9TdWNoTWV0aG9kdHJhbnNmb3JtUHJvY2VkdXJlVG9Ob1N1Y2hNZXRob2RGb3J3YXJkZXJub1N1Y2hNZXRob2RJbnRlcmZhY2VhZGROb1N1Y2hNZXRob2RGb3J3YXJkZXJGb3JQcm9jZWR1cmVjbG9uZWRhZGROb1N1Y2hNZXRob2RGb3J3YXJkZXJHZXR0ZXJGb3JGaWVsZGFkZE5vU3VjaE1ldGhvZEZvcndhcmRlclNldHRlckZvckZpZWxkZXhpc3RpbmdGb3J3YXJkZXJzTmFtZXNleGlzdGluZ1NldHRlckZvcndhcmRlcnNOYW1lc2xlYXN0Q29uY3JldGVTdXBlcmNsYXNzc3VwZXJIYXNVc2VyRGVmaW5lZE5vU3VjaE1ldGhvZGNvbmNyZXRlY29uY3JldGVTZXR0ZXJzY2xzSGFzVXNlckRlZmluZWROb1N1Y2hNZXRob2RjaGFuZ2VkX2dldE1lbWJlclVyaV9jb21wdXRlSW50ZXJmYWNlU3Vic3RpdHV0aW9uZGVjbGFyZWRGdW5jdGlvbmludGVyZmFjZUZ1bmN0aW9uaW50ZXJmYWNlU3Vic3RpdHV0aW9uaW5oZXJpdGVkQ29udGV4dGRlY2xhcmVkUGFyYW1ldGVyaW50ZXJmYWNlUGFyYW1ldGVyZGVjbGFyZWRCb3VuZGludGVyZmFjZUJvdW5kX2NvbXB1dGVEZWNsYXJlZFN1YnN0aXR1dGlvbmRlY2xhcmVkU3Vic3RpdHV0aW9uX2NoZWNrVHlwZXNhc0lmRGVjbGFyZWRQYXJhbWV0ZXJpblBhcmFtZXRlcmRlY2xhcmVkTWVtYmVyTmFtZWludGVyZmFjZU1lbWJlck5hbWVjb21wYXJlTmFtZWRQYXJhbWV0ZXJzcDBwMXNvcnRlZEZyb21EZWNsYXJlZHNvcnRlZEZyb21JbnRlcmZhY2VkZWNsYXJlZE5hbWVkUGFyYW1ldGVyc2ludGVyZmFjZU5hbWVkUGFyYW1ldGVyc2Jhc2VOYW1lbWl4aW5OYW1lY2xhc3NOYW1lTGVuZ3RobWVtYmVyUGF0Y2hvcmlnaW5MZW5ndGhwYXRjaExlbmd0aGZpbmRTdGF0aWNCdWlsZGVyYWNjZXNzaW5nTGlicmFyeWZpbmRDb25zdHJ1Y3Rvck9yRmFjdG9yeWNvbXB1dGVSZWRpcmVjdGVlVHlwZXRhcmdldEZ1bmN0aW9uVHlwZXR5cGVQYXJhbWV0ZXJCb3VuZGNvbXB1dGVSZWRpcmVjdGVlTmFtZWNoZWNrUmVkaXJlY3RpbmdGYWN0b3J5ZmFjdG9yeVR5cGVyZWRpcmVjdGVlVHlwZWRpcmVjdFN1YnN0aXR1dGlvbk1hcGZhc3RhLmtlcm5lbF9lbnVtX2J1aWxkZXJzZWxmVHlwZWNvbnN0cnVjdG9yQnVpbGRlcnZhbHVlc0J1aWxkZXJ0b1N0cmluZ0J1aWxkZXJlbnVtQ29uc3RhbnRJbmZvc3RhcnRDaGFyT2Zmc2V0Q29tcHV0ZWRlbnVtQnVpbGRlcmVudW0gbGlicmFyeUJ1aWxkZXJpbmRleEZpZWxkQnVpbGRlcmZpcnN0TWVtYmVyTmFtZWRpbmRleEZpZWxkbmFtZUZpZWxkQnVpbGRlcm5hbWVGaWVsZHN1cGVyQ29uc3RydWN0b3JmYXN0YS5rZXJuZWxfZmllbGRfYnVpbGRlcktlcm5lbEJvZHlCdWlsZGVyY29tcGlsYXRpb25Vbml0aXNFbGlnaWJsZUZvckluZmVyZW5jZXJlY29yZFN0YXRpY0ZpZWxkSW5mZXJlbmNlQ2FuZGlkYXRlIGhhcyB1bmV4cGVjdGVkIHR5cGUgcGFyc2VGaWVsZEluaXRpYWxpemVyYnVpbHRUeXBlZmFzdGEua2VybmVsX2Zvcm1hbF9wYXJhbWV0ZXJfYnVpbGRlcmZ1bmN0aW9uTmVzdGluZ0xldmVsaXNJbml0aWFsaXppbmdGb3JtYWxmb3JGb3JtYWxQYXJhbWV0ZXJJbml0aWFsaXplclNjb3BlZmFzdGEua2VybmVsX2Z1bmN0aW9uX3R5cGVfYnVpbGRlcmJ1aWx0UmV0dXJuVHlwZWlzUG9zaXRpb25hbGlzUmVxdWlyZWRpc05hbWVkY2xvbmVkVHlwZVZhcmlhYmxlc2Zhc3RhLmtlcm5lbF9pbnZhbGlkX3R5cGVfYnVpbGRlcnN1cHByZXNzTWVzc2FnZWZhc3RhLmtlcm5lbF9taXhpbl9hcHBsaWNhdGlvbl9idWlsZGVyZmFzdGEua2VybmVsX2ludGVyZmFjZV90eXBlX2J1aWxkZXJoYW5kbGVJbnZhbGlkU3VwZXJ0eXBlY2xvbmVkQXJndW1lbnRzZmFzdGEua2VybmVsX3ByZWZpeF9idWlsZGVyZmFzdGEua2VybmVsX3Byb2NlZHVyZV9idWlsZGVyRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlcmFjdHVhbEJvZHluZXdCb2R5YnVpbGRGdW5jdGlvbmFzeW5jTW9kaWZpZXJpc09wdGlvbmFsI3N5bnRoZXRpY3JlbW92ZVR5cGVWYXJpYWJsZXNjaGVja1BhdGNocmVwb3J0UGF0Y2hNaXNtYXRjaGFjdHVhbEFzeW5jTW9kaWZpZXJuZXdNb2RpZmllcmlzRWxpZ2libGVGb3JUb3BMZXZlbEluZmVyZW5jZWhhc01vdmVkU3VwZXJJbml0aWFsaXplcnN1cGVySW5pdGlhbGl6ZXJyZWRpcmVjdGluZ0luaXRpYWxpemVyZnVuY3Rpb25Ob2RlaW5qZWN0SW52YWxpZEluaXRpYWxpemVybGFzdEluaXRpYWxpemVyYnVpbGRJbnZhbGlkSW5pdGlhbGl6ZXJhZGRJbml0aWFsaXplcm5ld1R5cGVBcmd1bWVudHNyZWRpcmVjdGluZ09yaWdpbmZhc3RhLmtlcm5lbF9mdW5jdGlvbl90eXBlX2FsaWFzX2J1aWxkZXJidWlsZFRoaXNUeXBlY3ljbGljVHlwZUFsaWFzTWFya2VyZmFzdGEua2VybmVsX3R5cGVfYnVpbGRlcmZhc3RhLmtlcm5lbF90eXBlX3ZhcmlhYmxlX2J1aWxkZXJhY3R1YWxQYXJhbWV0ZXJmcm9tS2VybmVsYXNUeXBlQnVpbGRlcmtlcm5lbFR5cGVQYXJhbWV0ZXJzRnJvbUJ1aWxkZXJzZmFzdGEua2VybmVsX3ZhcmlhYmxlX2J1aWxkZXJGb3Jlc3RpbXBvcnREZXBlbmRlbmN5Y3JlYXRlTG9hZExpYnJhcnlmb3Jlc3RjcmVhdGVUZWFyb2ZmTWV0aG9kX19sb2FkTGlicmFyeV9VbmxpbmtlZFNjb3BlZmFzdGFQYXRoL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS8vcGtnL2Zyb250X2VuZC90b29sL19mYXN0YS9jb21tYW5kX2xpbmUuZGFydGtlcm5lbC9ib2R5X2J1aWxkZXIuZGFydGJ1aWxkZXIvYnVpbHRpbl90eXBlX2J1aWxkZXIuZGFydGJ1aWxkZXIvY2xhc3NfYnVpbGRlci5kYXJ0YnVpbGRlci9jb25zdHJ1Y3Rvcl9yZWZlcmVuY2VfYnVpbGRlci5kYXJ0YnVpbGRlci9keW5hbWljX3R5cGVfYnVpbGRlci5kYXJ0YnVpbGRlci9maWVsZF9idWlsZGVyLmRhcnRidWlsZGVyL2Zvcm1hbF9wYXJhbWV0ZXJfYnVpbGRlci5kYXJ0YnVpbGRlci9mdW5jdGlvbl90eXBlX2J1aWxkZXIuZGFydGJ1aWxkZXIvbGlicmFyeV9idWlsZGVyLmRhcnRidWlsZGVyL21lbWJlcl9idWlsZGVyLmRhcnRidWlsZGVyL21peGluX2FwcGxpY2F0aW9uX2J1aWxkZXIuZGFydGJ1aWxkZXIvbmFtZWRfdHlwZV9idWlsZGVyLmRhcnRidWlsZGVyL3ByZWZpeF9idWlsZGVyLmRhcnRidWlsZGVyL3Byb2NlZHVyZV9idWlsZGVyLmRhcnRidWlsZGVyL3R5cGVfYnVpbGRlci5kYXJ0YnVpbGRlci90eXBlX3ZhcmlhYmxlX2J1aWxkZXIuZGFydGJ1aWxkZXIvdW5yZXNvbHZlZF90eXBlLmRhcnRidWlsZGVyL3ZvaWRfdHlwZV9idWlsZGVyLmRhcnRidWlsZGVyX2dyYXBoLmRhcnRjb21waWxlcl9jb250ZXh0LmRhcnRkaWxsL2RpbGxfY2xhc3NfYnVpbGRlci5kYXJ0ZGlsbC9kaWxsX2xpYnJhcnlfYnVpbGRlci5kYXJ0ZGlsbC9kaWxsX2xvYWRlci5kYXJ0ZGlsbC9kaWxsX3RhcmdldC5kYXJ0ZW50cnlfcG9pbnRzLmRhcnRleHBvcnQuZGFydGZhc3RhX2NvZGVzLmRhcnRpbXBvcnQuZGFydGluY3JlbWVudGFsX2NvbXBpbGVyLmRhcnRrZXJuZWwvZXhwcmVzc2lvbl9nZW5lcmF0b3IuZGFydGtlcm5lbC9leHByZXNzaW9uX2dlbmVyYXRvcl9oZWxwZXIuZGFydGtlcm5lbC9mYW5nb3JuLmRhcnRrZXJuZWwvZm9yZXN0LmRhcnRrZXJuZWwva2VybmVsX2NsYXNzX2J1aWxkZXIuZGFydGtlcm5lbC9rZXJuZWxfZW51bV9idWlsZGVyLmRhcnRrZXJuZWwva2VybmVsX2V4cHJlc3Npb25fZ2VuZXJhdG9yLmRhcnRrZXJuZWwva2VybmVsX2V4cHJlc3Npb25fZ2VuZXJhdG9yX2ltcGwuZGFydGtlcm5lbC9rZXJuZWxfZmllbGRfYnVpbGRlci5kYXJ0a2VybmVsL2tlcm5lbF9mb3JtYWxfcGFyYW1ldGVyX2J1aWxkZXIuZGFydGtlcm5lbC9rZXJuZWxfZnVuY3Rpb25fdHlwZV9idWlsZGVyLmRhcnRrZXJuZWwva2VybmVsX2ludmFsaWRfdHlwZV9idWlsZGVyLmRhcnRrZXJuZWwva2VybmVsX2xpYnJhcnlfYnVpbGRlci5kYXJ0a2VybmVsL2tlcm5lbF9taXhpbl9hcHBsaWNhdGlvbl9idWlsZGVyLmRhcnRrZXJuZWwva2VybmVsX25hbWVkX3R5cGVfYnVpbGRlci5kYXJ0a2VybmVsL2tlcm5lbF9wcmVmaXhfYnVpbGRlci5kYXJ0a2VybmVsL2tlcm5lbF9wcm9jZWR1cmVfYnVpbGRlci5kYXJ0a2VybmVsL2tlcm5lbF9zaGFkb3dfYXN0LmRhcnRrZXJuZWwva2VybmVsX3RhcmdldC5kYXJ0a2VybmVsL2tlcm5lbF90eXBlX2J1aWxkZXIuZGFydGtlcm5lbC9rZXJuZWxfdHlwZV92YXJpYWJsZV9idWlsZGVyLmRhcnRrZXJuZWwvbG9hZF9saWJyYXJ5X2J1aWxkZXIuZGFydGtlcm5lbC9tZXRhZGF0YV9jb2xsZWN0b3IuZGFydGtlcm5lbC90eXBlX2FsZ29yaXRobXMuZGFydGtlcm5lbC92ZXJpZmllci5kYXJ0bG9hZGVyLmRhcnRzY2FubmVyL2Vycm9yX3Rva2VuLmRhcnRzY2FubmVyL3JlY292ZXIuZGFydHNjb3BlLmRhcnRzb3VyY2UvZGlldF9saXN0ZW5lci5kYXJ0c291cmNlL291dGxpbmVfYnVpbGRlci5kYXJ0c291cmNlL3NvdXJjZV9jbGFzc19idWlsZGVyLmRhcnRzb3VyY2Uvc291cmNlX2xpYnJhcnlfYnVpbGRlci5kYXJ0c291cmNlL3NvdXJjZV9sb2FkZXIuZGFydHNvdXJjZS9zdGFja19saXN0ZW5lci5kYXJ0dGFyZ2V0X2ltcGxlbWVudGF0aW9uLmRhcnR0eXBlX2luZmVyZW5jZS9pbnRlcmZhY2VfcmVzb2x2ZXIuZGFydHR5cGVfaW5mZXJlbmNlL3R5cGVfaW5mZXJlbmNlX2VuZ2luZS5kYXJ0dHlwZV9pbmZlcmVuY2UvdHlwZV9pbmZlcnJlci5kYXJ0dHlwZV9pbmZlcmVuY2UvdHlwZV9zY2hlbWEuZGFydHV0aWwvbGluay5kYXJ0dXRpbC9saW5rX2ltcGxlbWVudGF0aW9uLmRhcnRmYXN0YS50YXJnZXRmYXN0YS5kaWxsX2NsYXNzX2J1aWxkZXJ0YXJnZXRTdXBlcnR5cGVtaXhlZEluVHlwZT1jb21wdXRlVHlwZVZhcmlhYmxlQnVpbGRlcnNmYXN0YS5kaWxsX3R5cGVkZWZfYnVpbGRlcmZhc3RhLnR5cGVfYnVpbGRlcl9jb21wdXRlckZvcm1hbFBhcmFtZXRlcktpbmRVbnN1cHBvcnRlZE5vdCBpbXBsZW1lbnRlZGtlcm5lbEFyZ3VtZW50c2Zhc3RhLm1vZGlmaWVyTW9kaWZpZXJFbnVtQWJzdHJhY3RNb2RpZmllckVudW0uQWJzdHJhY3RDb25zdE1vZGlmaWVyRW51bS5Db25zdENvdmFyaWFudE1vZGlmaWVyRW51bS5Db3ZhcmlhbnRFeHRlcm5hbE1vZGlmaWVyRW51bS5FeHRlcm5hbEZpbmFsTW9kaWZpZXJFbnVtLkZpbmFsU3RhdGljTW9kaWZpZXJFbnVtLlN0YXRpY1Zhck1vZGlmaWVyRW51bS5WYXJNb2RpZmllck1vZGlmaWVyLmZyb21TdHJpbmdtb2RpZmllcihNb2RpZmllckVudW0udmFsaWRhdGVWYXJGaW5hbE9yQ29uc3RNb2RpZmllci52YWxpZGF0ZVZhckZpbmFsT3JDb25zdGNvdmFyaWFudE1hc2t2YXJNYXNrcHJvcGVydHlJbnN0cnVtZW50YXRpb25WYWx1ZW1hdGNoZXNJbnN0cnVtZW50YXRpb25WYWx1ZUxpdGVyYWxfc2hvcnRlbkluc3RydW1lbnRhdGlvblN0cmluZ2RhcnQuY29yZTo6ZGFydC5hc3luYzo6dGVzdDo6ZmFzdGEuZXhwb3J0ZmFzdGEuaW1wb3J0Y3JlYXRlUHJlZml4QnVpbGRlcmZhc3RhLmJvZHlfYnVpbGRlckNvbnN0YW50Q29udGV4dGNhbGxOYW1laW5kZXhHZXROYW1laW5kZXhTZXROYW1lbWludXNOYW1lcGx1c05hbWVBc3NlcnRJZGVudGlmaWVyQ29udGV4dE1lbWJlcktpbmRsZW5ndGhPZlNwYW5vcHRpb25hbFF1b3RlYW5hbHl6ZVF1b3RldW5lc2NhcGV1bmVzY2FwZUZpcnN0U3RyaW5nUGFydHVuZXNjYXBlTGFzdFN0cmluZ1BhcnR1bmVzY2FwZVN0cmluZ0ZpeGVkTnVsbGFibGVMaXN0R3Jvd2FibGVMaXN0SnVtcFRhcmdldEtpbmROdWxsVmFsdWVQYXJzZXJSZWNvdmVyeVNjb3BlTGlzdGVuZXJjb252ZXJ0VG9NYXBFbnRyeWlzQ29udmVydGlibGVUb01hcEVudHJ5Q29uc3RuZXNzRGVsYXllZEFzc2lnbm1lbnREZWxheWVkUG9zdGZpeEluY3JlbWVudEdlbmVyYXRvckluY29tcGxldGVFcnJvckdlbmVyYXRvckluY29tcGxldGVQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvckluY29tcGxldGVTZW5kR2VuZXJhdG9ySW5kZXhlZEFjY2Vzc0dlbmVyYXRvckxvYWRMaWJyYXJ5R2VuZXJhdG9yUGFyZW50aGVzaXplZEV4cHJlc3Npb25HZW5lcmF0b3JQYXJzZXJFcnJvckdlbmVyYXRvclByZWZpeFVzZUdlbmVyYXRvclJlYWRPbmx5QWNjZXNzR2VuZXJhdG9yU2VuZEFjY2Vzc0dlbmVyYXRvclN0YXRpY0FjY2Vzc0dlbmVyYXRvclN1cGVySW5kZXhlZEFjY2Vzc0dlbmVyYXRvclRoaXNBY2Nlc3NHZW5lcmF0b3JUaGlzUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3JUeXBlVXNlR2VuZXJhdG9yVW5saW5rZWRHZW5lcmF0b3JVbnJlc29sdmVkTmFtZUdlbmVyYXRvclZhcmlhYmxlVXNlR2VuZXJhdG9yYnVpbGRJc051bGxzaGFkb3djbGFzc0J1aWxkZXJlbmNsb3NpbmdTY29wZXN0cmluZ0V4cGVjdGVkQWZ0ZXJOYXRpdmVpZ25vcmVNYWluSW5HZXRNYWluQ2xvc3VyZW5lZWRzSW1wbGljaXRTdXBlckluaXRpYWxpemVyZm9ybWFsUGFyYW1ldGVyU2NvcGVpbkluaXRpYWxpemVyaW5GaWVsZEluaXRpYWxpemVyaW5DYXRjaENsYXVzZXByb2JsZW1Jbkxvb3BPclN3aXRjaHN3aXRjaFNjb3BlY29uc3RhbnRDb250ZXh0Y3VycmVudExvY2FsVmFyaWFibGVUeXBlY3VycmVudExvY2FsVmFyaWFibGVNb2RpZmllcnNyZWRpcmVjdGluZ0ZhY3RvcnlJbnZvY2F0aW9uc3ZhcmlhYmxlc1dpdGhNZXRhZGF0YW11bHRpVmFyaWFibGVzV2l0aE1ldGFkYXRhX2J1aWx0aW51aXdpdGhQYXJlbnRzZm9yRmllbGRpbkNvbnN0cnVjdG9yaXNJbnN0YW5jZUNvbnRleHRpbXBsaWNpdFR5cGVBcmd1bWVudHBvcEZvclZhbHVldG9WYWx1ZXBvcEZvckVmZmVjdHRvRWZmZWN0cG9wRm9yVmFsdWVJZk5vdE51bGxidWlsZFNpbXBsZVJlYWRidWlsZEZvckVmZmVjdHBvcExpc3RGb3JWYWx1ZXBvcExpc3RGb3JFZmZlY3Rwb3BCbG9ja2Nsb3NlQnJhY2VzdGFja3BvcFN0YXRlbWVudElmTm90TnVsbHBvcFN0YXRlbWVudHdyYXBWYXJpYWJsZXNlbnRlclN3aXRjaFNjb3BlZXhpdFN3aXRjaFNjb3Blb3V0ZXJTd2l0Y2hTY29wZXdyYXBJblByb2JsZW1TdGF0ZW1lbnR3cmFwVmFyaWFibGVJbml0aWFsaXplckluRXJyb3J3cmFwSW5Mb2NhdGVkUHJvYmxlbWNyZWF0ZUp1bXBUYXJnZXRpbmZlckFubm90YXRpb25zaW5mZXJNZXRhZGF0YWJlZ2luTWV0YWRhdGFkZWJ1Z0V2ZW50ZW5kTWV0YWRhdGFwZXJpb2RCZWZvcmVOYW1lTWV0YWRhdGFwdXNoUXVhbGlmaWVkUmVmZXJlbmNlYnVpbGRDb25zdHJ1Y3RvclJlZmVyZW5jZUludm9jYXRpb25wZXJpb2RnZW5lcmF0b3JidWlsZFByb3BlcnR5QWNjZXNzc2F2ZWRDb25zdGFudENvbnRleHR3cmFwSW5Qcm9ibGVtZW5kTWV0YWRhdGFTdGFyTWV0YWRhdGFTdGFyZW5kVG9wTGV2ZWxGaWVsZHNzdGF0aWNUb2tlbmNvdmFyaWFudFRva2VudmFyRmluYWxPckNvbnN0VG9wTGV2ZWxGaWVsZHNlbmRGaWVsZHNGaWVsZHNmaW5pc2hGaWVsZHNpbmZlckZpZWxkSW5pdGlhbGl6ZXJidWlsZERhcnRUeXBlcmVzb2x2ZVJlZGlyZWN0aW5nRmFjdG9yeVRhcmdldHNmaW5pc2hWYXJpYWJsZU1ldGFkYXRhZW5kTWVtYmVyZW5kQmxvY2tGdW5jdGlvbkJvZHlCbG9ja0Z1bmN0aW9uQm9keXByZXBhcmVJbml0aWFsaXplcnNjb21wdXRlRm9ybWFsUGFyYW1ldGVySW5pdGlhbGl6ZXJTY29wZWJ1aWxkRmllbGRJbml0aWFsaXplcmZvcm1hbFR5cGVoYW5kbGVOb0luaXRpYWxpemVyc05vSW5pdGlhbGl6ZXJzYmVnaW5Jbml0aWFsaXplcnNlbmRJbml0aWFsaXplcnNJbml0aWFsaXplcnNiZWdpbkluaXRpYWxpemVyZW5kSW5pdGlhbGl6ZXJidWlsZFN1cGVySW5pdGlhbGl6ZXJpc1Rocm93X2NvbXB1dGVSZXR1cm5UeXBlQ29udGV4dGZpbmlzaEZ1bmN0aW9uZmluaXNoZWRyZWFsUGFyYW1ldGVybGl0ZXJhbE51bGxpbmZlclBhcmFtZXRlckluaXRpYWxpemVyaW5mZXJGdW5jdGlvbkJvZHlmdXR1cmVCb3R0b21UeXBlc3RyZWFtQm90dG9tVHlwZWl0ZXJhYmxlQm90dG9tVHlwZWFzeW5jLCBhc3luYyosIHN5bmMsIG9yIHN5bmMqZXhwcmVzc2lvblN0YXRlbWVudGZpbmlzaENvbnN0cnVjdG9yaW5pdGlhbFRhcmdldHJlcGxhY2VtZW50Tm9kZXJlc29sdmVkVGFyZ2V0Y29uc3RydWN0b3JOYW1lRm9yRGlhZ25vc3RpY3NldmFsdWF0ZUFyZ3VtZW50c0JlZm9yZWJ1aWxkQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25FcnJvcnJlZGlyZWN0aW5nRmFjdG9yeUJvZHllcnJvck5hbWV0aHJvd05vU3VjaE1ldGhvZEVycm9yYnVpbGRTdGF0aWNJbnZvY2F0aW9uY29uc3RuZXNzZmluaXNoTWV0YWRhdGF0ZW1wb3JhcnlQYXJlbnR0eXBlUGFyYW1ldGVyQnVpbGRlcnNlbnRlckZ1bmN0aW9uVHlwZVNjb3BlY29tcHV0ZUZvcm1hbFBhcmFtZXRlclNjb3BlcGFyc2VFeHByZXNzaW9uc3ludGhldGljUHJldmlvdXNUb2tlbmZha2VSZXR1cm5jaGVja0VtcHR5YXJndW1lbnRzRW1wdHljaGVja0FyZ3VtZW50c0ZvckZ1bmN0aW9uaGFuZGxlRXhwcmVzc2lvblN0YXRlbWVudGVuZEFyZ3VtZW50c2ZpcnN0TmFtZWRBcmd1bWVudEluZGV4Z2V0UmFuZ2VoYW5kbGVQYXJlbnRoZXNpemVkQ29uZGl0aW9uUGFyZW50aGVzaXplZENvbmRpdGlvbnBhcmVudGhlc2l6ZWRDb25kaXRpb25oYW5kbGVQYXJlbnRoZXNpemVkRXhwcmVzc2lvblBhcmVudGhlc2l6ZWRFeHByZXNzaW9uaGFuZGxlU2VuZFNlbmRhcmd1bWVudHNUeXBlQXJndW1lbnRzYXJndW1lbnRzU2V0VHlwZUFyZ3VtZW50c2J1aWxkRGFydFR5cGVBcmd1bWVudHNjYXN0QXJndW1lbnRzZmluaXNoU2VuZGRvSW52b2NhdGlvbmJ1aWxkTWV0aG9kSW52b2NhdGlvbmJlZ2luQ2FzY2FkZWVuZENhc2NhZGVjYXNjYWRlUmVjZWl2ZXJiZWdpbkNhc2VFeHByZXNzaW9uY2FzZUtleXdvcmRlbmRDYXNlRXhwcmVzc2lvbmNvbG9uYmVnaW5CaW5hcnlFeHByZXNzaW9ubGhzZW50ZXJMb2dpY2FsRXhwcmVzc2lvbmVuZEJpbmFyeUV4cHJlc3Npb25CaW5hcnlFeHByZXNzaW9uZG9Eb3RPckNhc2NhZGVFeHByZXNzaW9uZG9Mb2dpY2FsRXhwcmVzc2lvbmRvSWZOdWxsZG9JZk5vdE51bGx0aGlzQWNjZXNzb3JSZWNlaXZlcnRoaXNFeHByZXNzaW9uYnVpbGRCaW5hcnlPcGVyYXRvcmlzQ29uc3RhbnRFeHByZXNzaW9ubm90RXhwcmVzc2lvbmxvZ2ljYWxFeHByZXNzaW9uZXhpdExvZ2ljYWxFeHByZXNzaW9uY29uZGl0aW9uYWxFeHByZXNzaW9uc2VuZHdpdGhSZWNlaXZlcnBlcmlvZEluZGV4a2VybmVsTmFtZXdhcm5VbnJlc29sdmVkR2V0d2FyblVucmVzb2x2ZWRTZXR3YXJuVW5yZXNvbHZlZE1ldGhvZGFkZFByb2JsZW1FcnJvcklmQ29uc3RwbGFpbk5hbWVkb3RJbmRleHdhcm5UeXBlQXJndW1lbnRzTWlzbWF0Y2hsb29rdXBJbnN0YW5jZU1lbWJlcmxvb2t1cENvbnN0cnVjdG9yV2l0aFBhdGNoZXNnZXRTdXBlcmNsYXNzaGFuZGxlSWRlbnRpZmllcmRlcHJlY2F0ZWRkZXByZWNhdGVkX2lzU2NvcGVSZWZlcmVuY2VzY29wZUxvb2t1cGluRGVjbGFyYXRpb25hbGxvd2VkSW5Db25zdGFudEV4cHJlc3Npb25pc1F1YWxpZmllZF9nZXRNYWluQ2xvc3VyZWZhY3RnZXRGYWN0Rm9yQWNjZXNzY3VycmVudFNjb3BlcmVhZFRhcmdldGhhbmRsZVF1YWxpZmllZFF1YWxpZmllZHdpdGhRdWFsaWZpZXJiZWdpbkxpdGVyYWxTdHJpbmdoYW5kbGVTdHJpbmdQYXJ0U3RyaW5nUGFydGVuZExpdGVyYWxTdHJpbmdpbnRlcnBvbGF0aW9uQ291bnRsaXRlcmFsU3RyaW5ncXVvdGVzdHJpbmdDb25jYXRlbmF0aW9uRXhwcmVzc2lvbmhhbmRsZU5hdGl2ZUNsYXVzZW5hdGl2ZVRva2VuaGFzTmFtZU5hdGl2ZUNsYXVzZWFzTGl0ZXJhbFN0cmluZ2hhbmRsZVNjcmlwdFNjcmlwdGhhbmRsZVN0cmluZ0p1eHRhcG9zaXRpb25saXRlcmFsQ291bnRTdHJpbmdKdXh0YXBvc2l0aW9uaGFuZGxlTGl0ZXJhbEludExpdGVyYWxJbnRsYXJnZSBpbnRlZ2VybGl0ZXJhbEludGxpdGVyYWxMYXJnZUludGhhbmRsZUVtcHR5RnVuY3Rpb25Cb2R5c2VtaWNvbG9uRXhwcmVzc2lvbkZ1bmN0aW9uQm9keWhhbmRsZUV4cHJlc3Npb25GdW5jdGlvbkJvZHlhcnJvd1Rva2VuZW5kUmV0dXJuU3RhdGVtZW50aGFzRXhwcmVzc2lvbmJ1aWxkUHJvYmxlbVN0YXRlbWVudHJldHVyblN0YXRlbWVudGJlZ2luVGhlblN0YXRlbWVudGVudGVyVGhlbkZvclR5cGVQcm9tb3Rpb25lbmRUaGVuU3RhdGVtZW50ZW50ZXJFbHNlZW5kSWZTdGF0ZW1lbnRpZlRva2VuZWxzZVRva2VuZWxzZVBhcnR0aGVuUGFydGV4aXRDb25kaXRpb25hbGlmU3RhdGVtZW50ZW5kVmFyaWFibGVJbml0aWFsaXplcmFzc2lnbm1lbnRPcGVyYXRvclZhcmlhYmxlSW5pdGlhbGl6ZXJwdXNoTmV3TG9jYWxWYXJpYWJsZWVxdWFsc1Rva2VuaGFuZGxlTm9WYXJpYWJsZUluaXRpYWxpemVyTm9WYXJpYWJsZUluaXRpYWxpemVyYmVnaW5GaWVsZEluaXRpYWxpemVyZW5kRmllbGRJbml0aWFsaXplcmhhbmRsZU5vRmllbGRJbml0aWFsaXplck5vRmllbGRJbml0aWFsaXplcmVuZEluaXRpYWxpemVkSWRlbnRpZmllcm5hbWVUb2tlbmJlZ2luVmFyaWFibGVzRGVjbGFyYXRpb25lbmRWYXJpYWJsZXNEZWNsYXJhdGlvblZhcmlhYmxlc0RlY2xhcmF0aW9udmFyaWFibGVzRGVjbGFyYXRpb25lbmRCbG9ja2hhbmRsZUludmFsaWRUb3BMZXZlbEJsb2NraGFuZGxlQXNzaWdubWVudEV4cHJlc3Npb25Bc3NpZ25tZW50RXhwcmVzc2lvbmVudGVyTG9vcGVudGVyQnJlYWtUYXJnZXRicmVha1RhcmdldGVudGVyQ29udGludWVUYXJnZXRjb250aW51ZVRhcmdldGV4aXRMb29wT3JTd2l0Y2hidWlsZFZhcmlhYmxlRGVjbGFyYXRpb25zdmFyaWFibGVPckV4cHJlc3Npb25pc1ZhcmlhYmxlc0RlY2xhcmF0aW9udmFyaWFibGVzRGVjbGFyYXRpb25FeHRyYWN0RGVjbGFyYXRpb25zaGFuZGxlRm9ySW5pdGlhbGl6ZXJFbXB0eVN0YXRlbWVudEZvckluaXRpYWxpemVyRW1wdHlTdGF0ZW1lbnRoYW5kbGVGb3JJbml0aWFsaXplckV4cHJlc3Npb25TdGF0ZW1lbnRGb3JJbml0aWFsaXplckV4cHJlc3Npb25TdGF0ZW1lbnRoYW5kbGVGb3JJbml0aWFsaXplckxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbkZvckluaXRpYWxpemVyTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uaGFuZGxlRm9yTG9vcFBhcnRzZm9yS2V5d29yZGxlZnRQYXJlbmxlZnRTZXBhcmF0b3J1cGRhdGVFeHByZXNzaW9uQ291bnRlbmRGb3JDb250cm9sRmxvd0ZvckNvbnRyb2xGbG93Zm9yVG9rZW5jb25kaXRpb25TdGF0ZW1lbnRoYW5kbGVSZWNvdmVyYWJsZUVycm9yaXNFeHByZXNzaW9uU3RhdGVtZW50Z2V0RXhwcmVzc2lvbkZyb21FeHByZXNzaW9uU3RhdGVtZW50aXNFbXB0eVN0YXRlbWVudGZvck1hcEVudHJ5Zm9yRWxlbWVudGVuZEZvclN0YXRlbWVudGV4aXRDb250aW51ZVRhcmdldGV4aXRCcmVha1RhcmdldGhhc1VzZXJzc3ludGhldGljTGFiZWxlZFN0YXRlbWVudHJlc29sdmVDb250aW51ZXNmb3JTdGF0ZW1lbnRyZXNvbHZlQnJlYWtzZW5kQXdhaXRFeHByZXNzaW9uYXdhaXRFeHByZXNzaW9uaGFuZGxlQXN5bmNNb2RpZmllcmFzeW5jVG9rZW5zdGFyVG9rZW5oYW5kbGVMaXRlcmFsTGlzdGxlZnRCcmFja2V0Y29uc3RLZXl3b3JkcmlnaHRCcmFja2V0TGl0ZXJhbExpc3RlbGVtbGl0ZXJhbExpc3RidWlsZExpdGVyYWxTZXRsZWZ0QnJhY2VzZXRPck1hcEVudHJpZXNsaXRlcmFsU2V0aGFuZGxlTGl0ZXJhbFNldE9yTWFwcmlnaHRCcmFjZWhhc1NldEVudHJ5TGl0ZXJhbFNldE9yTWFwdHlwZUFyZ0NvdW50YnVpbGRMaXRlcmFsTWFwaGFuZGxlTGl0ZXJhbEJvb2xMaXRlcmFsQm9vbGxpdGVyYWxCb29saGFuZGxlTGl0ZXJhbERvdWJsZUxpdGVyYWxEb3VibGVsaXRlcmFsRG91YmxlaGFuZGxlTGl0ZXJhbE51bGxMaXRlcmFsTnVsbGxpdGVyYWxNYXBoYW5kbGVMaXRlcmFsTWFwRW50cnlMaXRlcmFsTWFwRW50cnltYXBFbnRyeXN5bWJvbFBhcnRUb1N0cmluZ2VuZExpdGVyYWxTeW1ib2xoYXNoVG9rZW5pZGVudGlmaWVyQ291bnRMaXRlcmFsU3ltYm9sbGl0ZXJhbFN5bWJvbFNpbmdsdWFybGl0ZXJhbFN5bWJvbE11bHRpcGxlaGFuZGxlTm9uTnVsbEFzc2VydEV4cHJlc3Npb25iYW5ncmVwb3J0Tm9uTnVsbEFzc2VydEV4cHJlc3Npb25Ob3RFbmFibGVkaGFuZGxlVHlwZXF1ZXN0aW9uTWFya3JlcG9ydEVycm9ySWZOdWxsYWJsZVR5cGVxdWFsaWZpZWRxdWFsaWZpZWRMb29rdXBidWlsZFR5cGVXaXRoUmVzb2x2ZWRBcmd1bWVudHNiZWdpbkZ1bmN0aW9uVHlwZWZ1bmN0aW9uLXR5cGUgc2NvcGVyZXBvcnREdXBsaWNhdGVkRGVjbGFyYXRpb25lbmRGdW5jdGlvblR5cGVmdW5jdGlvblRva2VudG9GdW5jdGlvblR5cGVoYW5kbGVWb2lkS2V5d29yZFZvaWRLZXl3b3JkaGFuZGxlQXNPcGVyYXRvckFzT3BlcmF0b3JBcyBleHByZXNzaW9uaGFuZGxlSXNPcGVyYXRvcm5vdElzT3BlcmF0b3Jpc0ludmVydGVkaXNFeHByZXNzaW9uaGFuZGxlSXNDaGVja0lzIGV4cHJlc3Npb25iZWdpbkNvbmRpdGlvbmFsRXhwcmVzc2lvbnF1ZXN0aW9uZW50ZXJUaGVuaGFuZGxlQ29uZGl0aW9uYWxFeHByZXNzaW9uQ29sb25lbmRDb25kaXRpb25hbEV4cHJlc3Npb25lbHNlRXhwcmVzc2lvbnRoZW5FeHByZXNzaW9uaGFuZGxlVGhyb3dFeHByZXNzaW9udGhyb3dUb2tlblRocm93RXhwcmVzc2lvbmJlZ2luRm9ybWFsUGFyYW1ldGVyZW5kRm9ybWFsUGFyYW1ldGVydGhpc0tleXdvcmRwZXJpb2RBZnRlclRoaXNGb3JtYWxQYXJhbWV0ZXJuYW1lTm9kZWdldEZvcm1hbGVuZE9wdGlvbmFsRm9ybWFsUGFyYW1ldGVyc09wdGlvbmFsRm9ybWFsUGFyYW1ldGVyc2JlZ2luRnVuY3Rpb25UeXBlZEZvcm1hbFBhcmFtZXRlcmVuZEZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXJGdW5jdGlvblR5cGVkRm9ybWFsUGFyYW1ldGVyYmVnaW5Gb3JtYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVFeHByZXNzaW9uZW5kRm9ybWFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlRXhwcmVzc2lvbkZvcm1hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZUV4cHJlc3Npb25kZWZhdWx0VmFsdWVFeHByZXNzaW9uaGFuZGxlVmFsdWVkRm9ybWFsUGFyYW1ldGVyVmFsdWVkRm9ybWFsUGFyYW1ldGVyaGFuZGxlRm9ybWFsUGFyYW1ldGVyV2l0aG91dFZhbHVlRm9ybWFsUGFyYW1ldGVyV2l0aG91dFZhbHVlYmVnaW5Gb3JtYWxQYXJhbWV0ZXJzZW5kRm9ybWFsUGFyYW1ldGVyc0Zvcm1hbFBhcmFtZXRlcnNvcHRpb25hbHNvcHRpb25hbHNDb3VudHBvcFBhZGRlZGJlZ2luQ2F0Y2hDbGF1c2VlbmRDYXRjaENsYXVzZUNhdGNoQ2xhdXNlaGFuZGxlQ2F0Y2hCbG9ja29uS2V5d29yZGNhdGNoS2V5d29yZGNvbW1hQ2F0Y2hCbG9ja2NhdGNoUGFyYW1ldGVyc3BvcElmTm90TnVsbGV4Y2VwdGlvblR5cGVjb21waWxlVGltZUVycm9yc3BhcmFtZXRlckNvdW50Y2F0Y2hDbGF1c2VlbmRUcnlTdGF0ZW1lbnRjYXRjaENvdW50dHJ5S2V5d29yZGZpbmFsbHlLZXl3b3JkY2F0Y2hCbG9ja3NjYXRjaEJsb2Nrc0FuZEVycm9yc3RyeUJsb2NrdHJ5U3RhdGVtZW50aGFuZGxlSW5kZXhlZEV4cHJlc3Npb25vcGVuU3F1YXJlQnJhY2tldGNsb3NlU3F1YXJlQnJhY2tldEluZGV4ZWRFeHByZXNzaW9uaGFuZGxlVW5hcnlQcmVmaXhFeHByZXNzaW9uVW5hcnlQcmVmaXhFeHByZXNzaW9uaW5jcmVtZW50T3BlcmF0b3JoYW5kbGVVbmFyeVByZWZpeEFzc2lnbm1lbnRFeHByZXNzaW9uVW5hcnlQcmVmaXhBc3NpZ25tZW50RXhwcmVzc2lvbmJ1aWxkUHJlZml4SW5jcmVtZW50aGFuZGxlVW5hcnlQb3N0Zml4QXNzaWdubWVudEV4cHJlc3Npb25VbmFyeVBvc3RmaXhBc3NpZ25tZW50RXhwcmVzc2lvbmVuZENvbnN0cnVjdG9yUmVmZXJlbmNlQ29uc3RydWN0b3JSZWZlcmVuY2VjaGFyTGVuZ3RoYXJnTWVzc2FnZWFyZ3VtZW50c1Bvc2l0aW9uYWxhcmd1bWVudHNOYW1lZGNoZWNrQXJndW1lbnRzRm9yVHlwZWJlZ2luTmV3RXhwcmVzc2lvbk5ldyBleHByZXNzaW9uYmVnaW5Db25zdEV4cHJlc3Npb25iZWdpbkNvbnN0TGl0ZXJhbGJlZ2luSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb25lbmRDb25zdExpdGVyYWxlbmROZXdFeHByZXNzaW9uTmV3RXhwcmVzc2lvbm5hbWVMYXN0SWRlbnRpZmllcm5hbWVMYXN0VG9rZW5pbnZva2VDb25zdHJ1Y3RvcmVuZEltcGxpY2l0Q3JlYXRpb25FeHByZXNzaW9uSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb25idWlsZENvbnN0cnVjdG9ySW52b2NhdGlvbmVuZENvbnN0RXhwcmVzc2lvbmJlZ2luSWZDb250cm9sRmxvd2JlZ2luVGhlbkNvbnRyb2xGbG93aGFuZGxlRWxzZUNvbnRyb2xGbG93ZW5kSWZDb250cm9sRmxvd2lmTWFwRW50cnlpZkVsZW1lbnRlbmRJZkVsc2VDb250cm9sRmxvd2Vsc2VFbnRyeXRoZW5FbnRyeWhhbmRsZVNwcmVhZEV4cHJlc3Npb25zcHJlYWRUb2tlblNwcmVhZEV4cHJlc3Npb25zcHJlYWRFbGVtZW50ZW5kVHlwZUFyZ3VtZW50c1R5cGVBcmd1bWVudHNoYW5kbGVJbnZhbGlkVHlwZUFyZ3VtZW50c0ludmFsaWRUeXBlQXJndW1lbnRzaGFuZGxlVGhpc0V4cHJlc3Npb25oYW5kbGVTdXBlckV4cHJlc3Npb25TdXBlckV4cHJlc3Npb25oYW5kbGVOYW1lZEFyZ3VtZW50TmFtZWRBcmd1bWVudGVuZEZ1bmN0aW9uTmFtZUZ1bmN0aW9uTmFtZWVudGVyRnVuY3Rpb25leGl0RnVuY3Rpb25iZWdpbkxvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbmJlZ2luTmFtZWRGdW5jdGlvbkV4cHJlc3Npb25uYW1lZCBmdW5jdGlvbmJlZ2luRnVuY3Rpb25FeHByZXNzaW9ucHVzaE5hbWVkRnVuY3Rpb25pc0Z1bmN0aW9uRXhwcmVzc2lvbmJ1aWxkRnVuY3Rpb25Ob2Rlb2xkSW5pdGlhbGl6ZXJpc0Vycm9uZW91c05vZGVlbmROYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbmVuZExvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbkxvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbmVuZEZ1bmN0aW9uRXhwcmVzc2lvbmVuZERvV2hpbGVTdGF0ZW1lbnRkb0tleXdvcmR3aGlsZUtleXdvcmREb1doaWxlU3RhdGVtZW50ZG9TdGF0ZW1lbnRiZWdpbkZvckluRXhwcmVzc2lvbmVuZEZvckluRXhwcmVzc2lvbkZvckluRXhwcmVzc2lvbmhhbmRsZUZvckluTG9vcFBhcnRzYXdhaXRUb2tlbmxlZnRQYXJlbnRoZXNpc2luS2V5d29yZGVuZEZvckluQ29udHJvbEZsb3dGb3JJbkNvbnRyb2xGbG93aW5Ub2tlbmx2YWx1ZWJ1aWxkRm9ySW5WYXJpYWJsZWNoZWNrRm9ySW5WYXJpYWJsZWJ1aWxkRm9ySW5Cb2R5Zm9ySW5NYXBFbnRyeWZvckluRWxlbWVudHZvaWRDb250ZXh0ZW5kRm9ySW5Gb3JJbmhhbmRsZUxhYmVsTGFiZWxiZWdpbkxhYmVsZWRTdGF0ZW1lbnRsYWJlbENvdW50ZW5kTGFiZWxlZFN0YXRlbWVudGVuZFJldGhyb3dTdGF0ZW1lbnRyZXRocm93VG9rZW5SZXRocm93U3RhdGVtZW50cmV0aHJvd1N0YXRlbWVudGhhbmRsZUZpbmFsbHlCbG9ja0ZpbmFsbHlCbG9ja2VuZFdoaWxlU3RhdGVtZW50d2hpbGVTdGF0ZW1lbnRoYW5kbGVFbXB0eVN0YXRlbWVudGVtcHR5U3RhdGVtZW50YmVnaW5Bc3NlcnRhc3NlcnRLZXl3b3JkZW5kQXNzZXJ0Y29tbWFUb2tlbnNlbWljb2xvblRva2VuYXNzZXJ0U3RhdGVtZW50YXNzZXJ0SW5pdGlhbGl6ZXJlbmRZaWVsZFN0YXRlbWVudHlpZWxkVG9rZW55aWVsZFN0YXRlbWVudGJlZ2luU3dpdGNoQmxvY2tzd2l0Y2ggYmxvY2tiZWdpblN3aXRjaENhc2VleHByZXNzaW9uQ291bnRmaXJzdFRva2VubGFiZWxzQW5kRXhwcmVzc2lvbnNsYWJlbEluZGV4ZXhwcmVzc2lvbkluZGV4bGFiZWxPckV4cHJlc3Npb25jcmVhdGVHb3RvVGFyZ2V0c3dpdGNoIGNhc2VlbmRTd2l0Y2hDYXNlZGVmYXVsdEtleXdvcmRjb2xvbkFmdGVyRGVmYXVsdHN0YXRlbWVudENvdW50ZW5kU3dpdGNoU3RhdGVtZW50c3dpdGNoS2V5d29yZGVuZFN3aXRjaEJsb2NrY2FzZUNvdW50U3dpdGNoQmxvY2tyZXNvbHZlR290b3NsYXN0Tm9kZWlzQmxvY2tidWlsZEZhbGxUaHJvdWdoRXJyb3JoYW5kbGVDYXNlTWF0Y2hDYXNlTWF0Y2hoYW5kbGVCcmVha1N0YXRlbWVudGhhc1RhcmdldGJyZWFrS2V5d29yZGlzQnJlYWtUYXJnZXRsYWJlbFRva2VuYnVpbGRQcm9ibGVtVGFyZ2V0T3V0c2lkZUxvY2FsRnVuY3Rpb25icmVha1N0YXRlbWVudGFkZEJyZWFraXNCcmVha2hhbmRsZUNvbnRpbnVlU3RhdGVtZW50Y29udGludWVLZXl3b3JkQ29udGludWVTdGF0ZW1lbnRuYW1lZFRhcmdldGlzR290b1RhcmdldGFkZEdvdG9pc0NvbnRpbnVlVGFyZ2V0Y29udGludWVTdGF0ZW1lbnRhZGRDb250aW51ZWJlZ2luVHlwZVZhcmlhYmxlaGFuZGxlVHlwZVZhcmlhYmxlc0RlZmluZWRlbmRUeXBlVmFyaWFibGVleHRlbmRzT3JTdXBlcmVuZFR5cGVWYXJpYWJsZXNUeXBlVmFyaWFibGVzaGFuZGxlTm9UeXBlVmFyaWFibGVzTm9UeXBlVmFyaWFibGVzdHlwZVZhcmlhYmxlQnVpbGRlcnNUb0tlcm5lbHR5cGVWYXJpYWJsZUJ1aWxkZXJzaGFuZGxlSW52YWxpZFN0YXRlbWVudGJ1aWxkSW52YWxpZFN1cGVySW5pdGlhbGl6ZXJidWlsZER1cGxpY2F0ZWRJbml0aWFsaXplcnByZXZpb3VzSW5pdGlhbGl6ZXJPZmZzZXRmaWVsZE5hbWVPZmZzZXRidWlsZFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXJjaGVja0NvbnN0cnVjdG9yQ3ljbGljaGFuZGxlT3BlcmF0b3JoYW5kbGVTeW1ib2xWb2lkU3ltYm9sVm9pZGhhbmRsZUludmFsaWRGdW5jdGlvbkJvZHl2YWxpZGF0ZVR5cGVVc2Vub25JbnN0YW5jZUFjY2Vzc0lzRXJyb3Jpc0lkZW50aWNhbE1ldGhvZCBpbnZvY2F0aW9uaXNUaGlzRXhwcmVzc2lvbm1ha2VTdGF0aWNHZXR3cmFwSW5EZWZlcnJlZENoZWNrY2hlY2tMaWJyYXJ5SXNMb2FkZWR1bnJlc29sdmVkVHlwZXVucmVzb2x2ZWRUeXBlc3NoYWRvd05vZGVvcGVyYXRvcihKdW1wVGFyZ2V0PGp1bXAtdGFyZ2V0PkxhYmVsVGFyZ2V0PGxhYmVsLXRhcmdldD5FbXB0eSBwYXJhbWV0ZXJzIHNob3VsZCBiZSBudWxsRm9ybWFsUGFyYW1ldGVycyhsYWJlbChub0xvY2F0aW9uaW52YWxpZENvbGxlY3Rpb25FbGVtZW50LnJlc3VsdGdldE5vZGVOYW1lcGxhaW5OYW1lRm9yUmVhZGFzeW5jTWFya2VyRnJvbVRva2Vuc2Zhc3RhLnRyYW5zZm9ybV9jb2xsZWN0aW9uc0NvbnRyb2xGbG93RWxlbWVudGxpc3RBZGRzZXRGYWN0b3J5c2V0QWRkbWFwUHV0bWFwRW50cnlLZXltYXBFbnRyeVZhbHVlZ2V0OmVudHJpZXNfZmluZFNldEZhY3RvcnlfdHJhbnNsYXRlTGlzdE9yU2V0X2FkZEV4cHJlc3Npb25FbGVtZW50X3RyYW5zbGF0ZUVsZW1lbnRfdHJhbnNsYXRlU3ByZWFkRWxlbWVudF90cmFuc2xhdGVJZkVsZW1lbnRfdHJhbnNsYXRlRm9yRWxlbWVudF90cmFuc2xhdGVGb3JJbkVsZW1lbnR0aGVuU3RhdGVtZW50c2Vsc2VTdGF0ZW1lbnRzdGhlbkJvZHllbHNlQm9keWxvb3BCb2R5bG9vcGVsdGNhc3RlZFZhcl9hZGROb3JtYWxFbnRyeV90cmFuc2xhdGVFbnRyeV90cmFuc2xhdGVTcHJlYWRFbnRyeV90cmFuc2xhdGVJZkVudHJ5X3RyYW5zbGF0ZUZvckVudHJ5X3RyYW5zbGF0ZUZvckluRW50cnl0aGVuU3RhdGVtZW50ZWxzZVN0YXRlbWVudGtleVZhcnZhbHVlVmFyZmFzdGEudHJhbnNmb3JtX3NldF9saXRlcmFsc2FkZE1ldGhvZHVubW9kaWZpYWJsZVNldENvbnN0cnVjdG9yX2ZpbmRBZGRNZXRob2RfZmluZFVubW9kaWZpYWJsZVNldENvbnN0cnVjdG9yY29sbGVjdGlvblVyaWNvbGxlY3Rpb25MaWJyYXJ5bWFwRXhwc2V0VmFyc2V0RXhwZmFzdGEucGFyc2VyLmNsYXNzX21lbWJlcl9wYXJzZXJFcnJvckRlbGVnYXRpb25MaXN0ZW5lckxpc3RlbmVyc2tpcFBhcnNlcnNraXBFeHByZXNzaW9ucGFyc2VJZGVudGlmaWVyRXhwcmVzc2lvbm1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9uc2FzeW5jU3RhdGVsb29wU3RhdGVwYXJzZUFyZ3VtZW50c09wdHNraXBBcmd1bWVudHNPcHRwYXJzZUZ1bmN0aW9uQm9keWFsbG93QWJzdHJhY3Rza2lwRnVuY3Rpb25Cb2R5cGFyc2VJbnZhbGlkQmxvY2tza2lwQmxvY2tmYXN0YS5wYXJzZXJQYXJzZXJFcnJvclRvcExldmVsUGFyc2VyRXJyb3JDb2xsZWN0aW5nTGlzdGVuZXJyZWNvdmVyYWJsZUVycm9yc0ZpZWxkSW5pdGlhbGl6ZXJJbmZlcmVuY2VOb2RlZ2V0TmFtZWRGb3JtYWxnZXROYW1lZFBhcmFtZXRlclR5cGVzdWJzdGl0dXRlVHlwZVBhcmFtc0FjY2Vzc29ySW5mZXJlbmNlTm9kZV9pbnRlcmZhY2VSZXNvbHZlcl9kZWNsYXJlZE1ldGhvZF9jYW5kaWRhdGVzX2VuZF9saWJyYXJ5X2ZpbGVVcmlfb2Zmc2V0cmVzb2x2ZUludGVybmFsZGVjbGFyZWRNZXRob2RvdmVycmlkZGVuVHlwZXNfY29tcHV0ZUFjY2Vzc29yT3ZlcnJpZGRlblR5cGVzaXNDaXJjdWxhcm1hdGNoVHlwZXNfZmllbGRyZXNvbHZlZENhbmRpZGF0ZW92ZXJyaWRkZW5UeXBlX3N1YnN0aXR1dGlvbkZvckZvcndhcmRpbmdOb2RlX2ZpbmFsUmVzb2x1dGlvbl9pbmZlcmVuY2VOb2RlX2ZpbmFsaXplX2NvbXB1dGVDb3ZhcmlhbmNlRml4ZXNzdHViX3Jlc29sdmVkQ2FuZGlkYXRlX2NyZWF0ZUZvcndhcmRpbmdTdHViaW50ZXJmYWNlUG9zaXRpb25hbFBhcmFtZXRlcnNpbnRlcmZhY2VUeXBlUGFyYW1ldGVyc2NyZWF0ZVN0dWJJZk5lZWRlZGlzSW1wbENyZWF0ZWRjcmVhdGVJbXBsSWZOZWVkZWRfY3JlYXRlRm9yd2FyZGluZ0ltcGxJZk5lZWRlZG90aGVyTWVtYmVyX2ZpbmFsaXplZENhbmRpZGF0ZW90aGVyUG9zaXRpb25hbFBhcmFtZXRlcnNvdGhlclBhcmFtZXRlcnN1cGVyVHlwZVBhcmFtZXRlcm90aGVyVHlwZVBhcmFtZXRlcnNvdGhlclR5cGVQYXJhbWV0ZXJfdHlwZUVudmlyb25tZW50X2luc3RydW1lbnRhdGlvbmZvcndhcmRpbmdTdHVic2VtaS1zdHVic3VwZXJDYWxsY29weVBhcmFtZXRlcnRhcmdldFR5cGVQYXJhbWV0ZXJzYWRkaXRpb25hbFN1YnN0aXR1dGlvbnRhcmdldFR5cGVQYXJhbWV0ZXJmaW5hbFRhcmdldGlzRGVjbGFyZWRJblRoaXNDbGFzc2luaGVyaXRlZE1lbWJlclN1YnN0aXR1dGlvbmluaGVyaXRlZE1lbWJlclR5cGVpc0JldHRlcmNyZWF0ZUZvcndhcmRpbmdJbXBsSWZOZWVkZWRGb3JUZXN0aW5nY3JlYXRlRm9yd2FyZGluZ1N0dWJGb3JUZXN0aW5nZ2V0Q2FuZGlkYXRlc19nZXRGb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0X3R5cGVJbmZlcmVuY2VFbmdpbmVfY29tcHV0ZU1ldGhvZE92ZXJyaWRkZW5UeXBlc2RlY2xhcmVkVHlwZVBhcmFtZXRlcnNjYW5kaWRhdGVGdW5jdGlvbm92ZXJyaWRkZW5UeXBlUGFyYW1ldGVyc2luZmVyTWV0aG9kVHlwZWdldHRlcnNnZXR0ZXJJbmRleHNldHRlckluZGV4Zm9yd2FyZGluZ05vZGVkZWNsYXJlZEdldHRlcmluaGVyaXRlZEdldHRlclN0YXJ0Z2V0dGVyRW5kY3VycmVudEtpbmRkZWNsYXJlZFNldHRlcmluaGVyaXRlZFNldHRlclN0YXJ0Z2V0dGVySW5mZXJlbmNlTm9kZV9jcmVhdGVJbmZlcmVuY2VOb2RlcmVwcmVzZW50YXRpdmVzZXR0ZXJJbmZlcmVuY2VOb2RlYXBpTWVtYmVyc19tZXJnZUNhbmRpZGF0ZXNjcm9zc1N0YXJ0Y3Jvc3NFbmRfZ2V0SW50ZXJmYWNlTWVtYmVyc2luZmVyZW5jZUluZm9mb3JFYWNoQXBpTWVtYmVybWFrZUNhbmRpZGF0ZXZhbHVlUGFyYW1fa2luZE9mX3JlcXVpcmVzVHlwZUluZmVyZW5jZVN5bnRoZXRpY0FjY2Vzc29yZ2V0RmllbGRTeW50aGV0aWNBY2Nlc3NvckZ1bmN0aW9uTm9kZVN5bnRoZXRpY1NldHRlclBhcmFtZXRlcmZhc3RhLmRpZXRfbGlzdGVuZXJpc0lnbm9yZWRQYXJzZXJFcnJvclN0YWNrTGlzdGVuZXJpbXBvcnRFeHBvcnREaXJlY3RpdmVJbmRleGN1cnJlbnRDbGFzc0lzUGFyc2VyUmVjb3ZlcnlkaXNjYXJkZW5kUGFydE9mcGFydEtleXdvcmRvZktleXdvcmRQYXJ0T2ZoYW5kbGVJbnZhbGlkVG9wTGV2ZWxEZWNsYXJhdGlvbkludmFsaWRUb3BMZXZlbERlY2xhcmF0aW9uaGFuZGxlTm9Bcmd1bWVudHNOb0FyZ3VtZW50c2hhbmRsZU5vVHlwZUFyZ3VtZW50c05vVHlwZUFyZ3VtZW50c2hhbmRsZU5vQ29uc3RydWN0b3JSZWZlcmVuY2VDb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHNOb0NvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzaGFuZGxlTm9UeXBlbGFzdENvbnN1bWVkTm9UeXBlZW5kVHlwZUxpc3RUeXBlTGlzdGhhbmRsZU5hbWVkTWl4aW5BcHBsaWNhdGlvbldpdGhDbGF1c2V3aXRoS2V5d29yZE5hbWVkTWl4aW5BcHBsaWNhdGlvbldpdGhDbGF1c2VoYW5kbGVDbGFzc1dpdGhDbGF1c2VDbGFzc1dpdGhDbGF1c2VoYW5kbGVDbGFzc05vV2l0aENsYXVzZUNsYXNzTm9XaXRoQ2xhdXNlaGFuZGxlTm9Gb3JtYWxQYXJhbWV0ZXJzTm9Gb3JtYWxQYXJhbWV0ZXJzZW5kRnVuY3Rpb25UeXBlQWxpYXN0eXBlZGVmS2V5d29yZEZ1bmN0aW9uVHlwZUFsaWFzdHlwZWRlZkJ1aWxkZXJsb29rdXBCdWlsZGVycGFyc2VNZXRhZGF0YW1ldGFkYXRhVG9rZW50b2tlbkZvck9mZnNldGJ1aWxkRmllbGRzZW5kVG9wTGV2ZWxNZXRob2RnZXRPclNldFRvcExldmVsTWV0aG9kYm9keVRva2VuY3JlYXRlRnVuY3Rpb25MaXN0ZW5lcmJ1aWxkRnVuY3Rpb25Cb2R5aGFuZGxlTm9GdW5jdGlvbkJvZHlOb0Z1bmN0aW9uQm9keWVuZExpYnJhcnlOYW1lbGlicmFyeUtleXdvcmRoYW5kbGVEb3R0ZWROYW1lZmlyc3RJZGVudGlmaWVyRG90dGVkTmFtZWVuZENvbmRpdGlvbmFsVXJpaWZLZXl3b3JkZXF1YWxTaWduQ29uZGl0aW9uYWxVcmllbmRDb25kaXRpb25hbFVyaXNDb25kaXRpb25hbFVyaXNoYW5kbGVPcGVyYXRvck5hbWVvcGVyYXRvcktleXdvcmRPcGVyYXRvck5hbWVoYW5kbGVJbnZhbGlkT3BlcmF0b3JOYW1lSW52YWxpZE9wZXJhdG9yTmFtZWhhbmRsZUlkZW50aWZpZXJMaXN0SWRlbnRpZmllckxpc3RlbmRTaG93c2hvd0tleXdvcmRTaG93ZW5kSGlkZWhpZGVLZXl3b3JkSGlkZWVuZENvbWJpbmF0b3JzQ29tYmluYXRvcnNoYW5kbGVJbXBvcnRQcmVmaXhkZWZlcnJlZEtleXdvcmRhc0tleXdvcmRJbXBvcnRQcmVmaXhwdXNoSWZOdWxsZW5kSW1wb3J0aW1wb3J0S2V5d29yZGltcG9ydFVyaVRva2VubGlicmFyeU5vZGVoYW5kbGVSZWNvdmVySW1wb3J0ZW5kRXhwb3J0ZXhwb3J0S2V5d29yZGVuZFBhcnRQYXJ0ZW5kRmFjdG9yeU1ldGhvZGZhY3RvcnlLZXl3b3JkRmFjdG9yeU1ldGhvZGJ1aWxkUmVkaXJlY3RpbmdGYWN0b3J5TWV0aG9kZW5kUmVkaXJlY3RpbmdGYWN0b3J5Qm9keWhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keU5hdGl2ZUZ1bmN0aW9uQm9keWhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keUlnbm9yZWROYXRpdmVGdW5jdGlvbkJvZHlJZ25vcmVkaGFuZGxlTmF0aXZlRnVuY3Rpb25Cb2R5U2tpcHBlZE5hdGl2ZUZ1bmN0aW9uQm9keVNraXBwZWRlbmRNZXRob2RiZWdpblBhcmFtdHlwZVBhcmFtZXRlclNjb3BlY29tcHV0ZVR5cGVQYXJhbWV0ZXJTY29wZXBhcnNlTWV0YWRhdGFTdGFycGFyc2VGb3JtYWxQYXJhbWV0ZXJzT3B0cGFyc2VGaWVsZHNoYW5kbGVJbnZhbGlkTWVtYmVySW52YWxpZE1lbWJlcmJlZ2luTWl4aW5EZWNsYXJhdGlvbm1peGluS2V5d29yZGJlZ2luQ2xhc3NEZWNsYXJhdGlvbmFic3RyYWN0VG9rZW5iZWdpbkNsYXNzT3JNaXhpbkJvZHllbmRDbGFzc09yTWl4aW5Cb2R5Q2xhc3NPck1peGluQm9keWVuZENsYXNzRGVjbGFyYXRpb25DbGFzc0RlY2xhcmF0aW9uZW5kTWl4aW5EZWNsYXJhdGlvbk1peGluRGVjbGFyYXRpb25lbmRFbnVtZW51bUtleXdvcmRFbnVtbWV0YWRhdGFBbmRWYWx1ZXN2YWx1ZU5hbWVlbmROYW1lZE1peGluQXBwbGljYXRpb25jbGFzc0tleXdvcmRpbXBsZW1lbnRzS2V5d29yZE5hbWVkTWl4aW5BcHBsaWNhdGlvbmdldEFzeW5jTWFya2VybGlzdGVuZXJGaW5pc2hGdW5jdGlvbm1ldGFkYXRhQ29uc3RhbnRzbGlzdGVuZXJGaW5pc2hGaWVsZHNwYXJzZUluaXRpYWxpemVyc09wdHBhcnNlQXN5bmNNb2RpZmllck9wdHBhcnNlVG9wTGV2ZWxNZW1iZXJwYXJzZUNsYXNzT3JNaXhpbk1lbWJlcmhhbmRsZUR1cGxpY2F0ZWROYW1lY2hlY2tCdWlsZGVybmVhcmVzdERlY2xhcmF0aW9ubWluRGlzdGFuY2VkaXN0YW5jZXRva2Vuc0Zvck9mZnNldHNpc0lnbm9yZWRFcnJvcmZhc3RhLmRpZXRfcGFyc2VycGFyc2VGb3JtYWxQYXJhbWV0ZXJzUmVzdHNraXBGb3JtYWxQYXJhbWV0ZXJzUmVzdGZhc3RhLm91dGxpbmVfYnVpbGRlck1ldGhvZEJvZHlNZXRob2RCb2R5LkFic3RyYWN0UmVndWxhck1ldGhvZEJvZHkuUmVndWxhck1ldGhvZEJvZHkuUmVkaXJlY3RpbmdGYWN0b3J5Qm9keWluQ29uc3RydWN0b3JOYW1lcG9wQ2hhck9mZnNldHBvcElkZW50aWZpZXJMaXN0aXNQYXJzZXJSZWNvdmVyeXBvc3RmaXh0eXBlTmFtZUVuZEltcG9ydHByZWZpeE9mZnNldEVuZENvbmRpdGlvbmFsVXJpc0VuZENvbmRpdGlvbmFsVXJpUmVjb3ZlckltcG9ydGhhbmRsZU5vTmFtZTpiYWRpbnRlcnBvbGF0aW9uT2Zmc2V0ZW5kSWRlbnRpZmllckxpc3RzdWZmaXhPZmZzZXRiZWdpbkNsYXNzT3JOYW1lZE1peGluQXBwbGljYXRpb25jbGFzcyBvciBtaXhpbiBhcHBsaWNhdGlvbmJlZ2luTmFtZWRNaXhpbkFwcGxpY2F0aW9uaGFuZGxlQ2xhc3NPck1peGluSW1wbGVtZW50c2ludGVyZmFjZXNDb3VudENsYXNzT3JNaXhpbkltcGxlbWVudHNoYW5kbGVSZWNvdmVyQ2xhc3NIZWFkZXJoYW5kbGVSZWNvdmVyTWl4aW5IZWFkZXJoYW5kbGVDbGFzc0V4dGVuZHNleHRlbmRzS2V5d29yZGhhbmRsZU1peGluT25udWxsSWZQYXJzZXJSZWNvdmVyeW1peGluVG9rZW5zdXBlcnR5cGVDb25zdHJhaW50c25hbWVPZmZzZXRjb21wdXRlUHJvY2VkdXJlS2luZGJlZ2luVG9wTGV2ZWxNZXRob2RleHRlcm5hbFRva2VuI21ldGhvZGZvcm1hbHNPZmZzZXRoYW5kbGVGdW5jdGlvbkJvZHlTa2lwcGVkaXNFeHByZXNzaW9uQm9keWJlZ2luTWV0aG9kYm9keUtpbmRuYW1lT3JPcGVyYXRvcnJlcXVpcmVkQXJndW1lbnRDb3VudHZhckZpbmFsT3JDb25zdE9mZnNldHNlZW5OYW1lc2JlZ2luRnVuY3Rpb25UeXBlQWxpYXNwb3BGaWVsZEluZm9zVHlwZVZhcmlhYmxlc0RlZmluZWRzdGVwc3ZpYWNvbnRhaW5pbmdMaWJyYXJ5YmVnaW5GYWN0b3J5TWV0aG9kY29uc3RUb2tlbmV4dGVuZHNPZmZzZXRoYW5kbGVDbGFzc0hlYWRlckNsYXNzSGVhZGVyaGFuZGxlTWl4aW5IZWFkZXJnZXREb2N1bWVudGF0aW9uQ29tbWVudGRvY1Rva2VuaW5TbGFzaC8qKi8vL2Zhc3RhLmNvbGxlY3Rpb25zX1NwcmVhZEVsZW1lbnQmRXhwcmVzc2lvbiZDb250cm9sRmxvd0VsZW1lbnRfSWZFbGVtZW50JkV4cHJlc3Npb24mQ29udHJvbEZsb3dFbGVtZW50X0ZvckVsZW1lbnQmRXhwcmVzc2lvbiZDb250cm9sRmxvd0VsZW1lbnRfRm9ySW5FbGVtZW50JkV4cHJlc3Npb24mQ29udHJvbEZsb3dFbGVtZW50Q29udHJvbEZsb3dNYXBFbnRyeS5rZXkgZ2V0dGVyZXhwckNvbnRyb2xGbG93TWFwRW50cnkua2V5IHNldHRlckNvbnRyb2xGbG93TWFwRW50cnkudmFsdWUgZ2V0dGVyQ29udHJvbEZsb3dNYXBFbnRyeS52YWx1ZSBzZXR0ZXJfU3ByZWFkTWFwRW50cnkmVHJlZU5vZGUmQ29udHJvbEZsb3dNYXBFbnRyeV9JZk1hcEVudHJ5JlRyZWVOb2RlJkNvbnRyb2xGbG93TWFwRW50cnlfRm9yTWFwRW50cnkmVHJlZU5vZGUmQ29udHJvbEZsb3dNYXBFbnRyeV9Gb3JJbk1hcEVudHJ5JlRyZWVOb2RlJkNvbnRyb2xGbG93TWFwRW50cnlpbkNvdmFyaWFudENvbnRleHRfdHlwZVBhcmFtZXRlcnNUb1NlYXJjaEZvcl9jdXJyZW50Tm9kZV9pc1Jlc29sdmVkX2lzQ2lyY3VsYXJfbmV4dE5vZGVwcmV2aW91c05vZGVzdGF0aWNJbmZlcmVuY2VOb2Rlc3Jlc29sdmVJbmZlcmVuY2VOb2RlaGFzQW55VHlwZVZhcmlhYmxlc3VuYXJ5TWludXNOYW1lVHlwZVZhcmlhYmxlRWxpbWluYXRvckNsb3N1cmVDb250ZXh0ZGVjbGFyZWRSZXR1cm5UeXBlX25lZWRUb0luZmVyUmV0dXJuVHlwZV9pbmZlcnJlZFVud3JhcHBlZFJldHVybk9yWWllbGRUeXBlaXNBcnJvd3JldHVyblN0YXRlbWVudHNyZXR1cm5FeHByZXNzaW9uVHlwZXNuZWVkVG9JbmZlclJldHVyblR5cGVnZXRUeXBlQXJndW1lbnRPZmNoZWNrVmFsaWRSZXR1cm5mbGF0dGVuZWRSZXR1cm5UeXBlZmxhdHRlbmVkRXhwcmVzc2lvblR5cGVpc1JldHVybkZyb21Bc3luY3Vud3JhcHBlZFR5cGVfd3JhcEFzeW5jT3JHZW5lcmF0b3JnZXREZXJpdmVkVHlwZUFyZ3VtZW50T2ZpbmZlclJldHVyblR5cGV3cmFwRnV0dXJlVHlwZU1ldGhvZENvbnRyYXZhcmlhbmNlQ2hlY2tLaW5kTWV0aG9kQ29udHJhdmFyaWFuY2VDaGVja0tpbmQubm9uZWNoZWNrTWV0aG9kUmV0dXJuTWV0aG9kQ29udHJhdmFyaWFuY2VDaGVja0tpbmQuY2hlY2tNZXRob2RSZXR1cm5jaGVja0dldHRlclJldHVybk1ldGhvZENvbnRyYXZhcmlhbmNlQ2hlY2tLaW5kLmNoZWNrR2V0dGVyUmV0dXJudW5rbm93bkZ1bmN0aW9uaW5mZXJyZWRUeXBlc01hcGxhc3RJbmZlcnJlZFN1YnN0aXR1dGlvbmxhc3RDYWxsZWVUeXBlYWN0dWFsVHlwZWluaXRpYWxFeHBlY3RlZFR5cGV1bmZ1dHVyZWRFeHBlY3RlZFR5cGVmdXR1cmVkRXhwZWN0ZWRUeXBlY2FsbE1lbWJlcl9zaG91bGRUZWFyT2ZmQ2FsbG51bGxDaGVja2NvbmRpdGlvbmFsZXJyb3JOb2RlX2dldFByZWNpc2VUeXBlRXJyb3JUZW1wbGF0ZXR5cGVDaGVja2ZpbmRJbnRlcmZhY2VNZW1iZXJlcnJvclRlbXBsYXRlX2dldEludGVyZmFjZU1lbWJlcm1ldGhvZEludm9jYXRpb25wcm9wZXJ0eUdldHByb3BlcnR5U2V0Zm9sbG93Q2FsbGNhbGxUeXBlbWVtYmVyQ2xhc3N0eXBlQXNJbnN0YW5jZU9mQ2xhc3NnZXRSZWFsVGFyZ2V0c2V0dGVyUGFyYW1ldGVyc2V4cHJlc3Npb25Ub1JlcGxhY2VjaGVja1JldHVybnJlcGxhY2VkRXhwcmVzc2lvbmNhbGxlZVR5cGVQYXJhbWV0ZXJzZXhwbGljaXRUeXBlQXJndW1lbnRzX2ZvckVhY2hBcmd1bWVudGluZmVycmVkRm9ybWFsVHlwZW5hbWVkVHlwZUluZGV4dW5pcXVlTmFtZWRwcmV2TmFtZWRFeHByZXNzaW9ubnVtUG9zaXRpb25hbEFyZ3Nmb3JtYWxUeXBlc0Zyb21Db250ZXh0bmVlZFRvU2V0UmV0dXJuVHlwZW9sZENsb3N1cmVDb250ZXh0cGFyZW50c2FjdHVhbFJlY2VpdmVyVHlwZWFjdHVhbE1ldGhvZE5hbWV0ZWFyb2ZmVHlwZWluc3RhbnRpYXRlZFR5cGV0eXBlUGFyYW1ldGVyc09jY3VyTmVnYXRpdmVseWNoZWNrZXJyZXNvbHZlT25lU3RlcHJlc29sdmVkc3RlcDFzdGVwMnR5cGVXaXRob3V0RnV0dXJlT3JuYW1lZEV4cHJlc3Npb25jbGFzc0luZmVyZW5jZUluZm9nZW5lcmF0ZUNvbnN0cmFpbnRzbWl4aW5DbGFzc21peGluU3VwZXJ0eXBlbWl4aW5TdXBlcmNsYXNzQ29tcGlsZXItZ2VuZXJhdGVkIG1peGluIGFwcGxpY2F0aW9ucyBoYXZlIGEgbWl4aW4gb3IgZWxzZSBpbXBsZW1lbnQgZXhhY3RseSBvbmUgdHlwZSBpbXBsZW1lbnRzIHMwczF1MHRyeVN1YnR5cGVNYXRjaGNvbXB1dGVDb25zdHJhaW50c2JvdW5kc2dldFBvc2l0aW9uYWxGb3JtYWxpc092ZXJsb2FkYWJsZUFyaXRobWV0aWNPcGVyYXRvcmRpc2FibGVkbXV0YXRlVmFyaWFibGVUeXBlUHJvbW90ZXJEaXNhYmxlZF9udWxsRmFjdHNfZmFjdENhY2hlX2ZhY3RDYWNoZVN0YXRlX2N1cnJlbnRGYWN0c19wcm9tb3Rpb25FeHByZXNzaW9uX3RydWVGYWN0c0ZvclByb21vdGlvbkV4cHJlc3Npb25fY3VycmVudFNjb3BlX2xhc3RGYWN0U2VxdWVuY2VOdW1iZXJfY29tcHV0ZVByb21vdGVkVHlwZWFmdGVyVHJ1ZWJlZm9yZUVsc2V0cnVlRmFjdHNfZmFjdHNXaGVuVHJ1ZWZhbHNlRmFjdHNfZmFjdHNXaGVuRmFsc2VfZW5jbG9zaW5nX21lcmdlRmFjdHNfcmVjb3JkUHJvbW90aW9uRXhwcmVzc2lvbnNob3J0Y3V0RmFjdHNfY29tcHV0ZUN1cnJlbnRGYWN0TWFwaXNDaGVja2NvbW1vbkFuY2VzdG9yc2VxdWVuY2VOdW1iZXJwcmV2aW91c0ZvclZhcmlhYmxlbmV3U3RhdGVjdXJyZW50bHlDYWNoZWRfcHJpbnRFdmVudGZhY3RDaGFpbihudWxsKSAtPiAgIF9wcm9tb3Rpb25FeHByZXNzaW9uOiAgICAgaWYgdHJ1ZTogaWZUcnVlaWZGYWxzZV9tdXRhdGVkSW5TY29wZXNfYWNjZXNzZWRJbkNsb3N1cmVJblNjb3Blc3Byb21vdGVyX3JlY29yZEFjY2Vzc2VkSW5TY29wZV9yZWNvcmRNdXRhdGVkSW5TY29wZV9kZXB0aF90b3BMZXZlbGNvbnRhaW5zU2NvcGVfQ29uZGl0aW9uYWxTY29wZV9Jc0NoZWNraXNDaGVjayhwcmV2aW91c1Byb21vdGVkVHlwZWFzc2lnbm1lbnRTY29wZWFjY2Vzc1Njb3BlcHJldmlvdXNUeXBlX0xvZ2ljYWxTY29wZV9OdWxsRmFjdFRyaWVkIHRvIGNyZWF0ZSBwcm9tb3RlZCB0eXBlIGZvciBubyB2YXJpYWJsZV9Ub3BMZXZlbFNjb3BlX1R5cGVTY2hlbWFFbGltaW5hdGlvblZpc2l0b3Jpc0xlYXN0Q2xvc3VyZW5ld1JldHVyblR5cGVuZXdQb3NpdGlvbmFsUGFyYW1ldGVyc25ld05hbWVkUGFyYW1ldGVyc2xlYXN0Q2xvc3VyZSA8OiA8dHlwZT4gPDogX1R5cGVTY2hlbWFFbnZpcm9ubWVudCZIaWVyYXJjaHlCYXNlZFR5cGVFbnZpcm9ubWVudCZTdGFuZGFyZEJvdW5kc3R5cGVQYXJhbWV0ZXJzVG9JbmZlcnJldHVybkNvbnRleHRUeXBlaW5mZXJUeXBlRnJvbUNvbnN0cmFpbnRzZG93bndhcmRzSW5mZXJQaGFzZWhhc09taXR0ZWRCb3VuZHR5cGVzRnJvbURvd253YXJkc0luZmVyZW5jZXR5cGVQYXJhbUJvdW5kZXh0ZW5kc0NvbnN0cmFpbnRfaW5mZXJUeXBlUGFyYW1ldGVyRnJvbUNvbnRleHRfaW5mZXJUeXBlUGFyYW1ldGVyRnJvbUFsbGtub3duVHlwZXN0eXBlU2F0aXNmaWVzQ29uc3RyYWludHNvbHZlVHlwZUNvbnN0cmFpbnRncm91bmRlZHR5cGVGcm9tQ29udGV4dEluZmVyZW5jZV9jb3JlVHlwZXNuZXdUeXBlUGFyYW1ldGVyc2Zhc3RhLmltcGxpY2l0X3R5cGVfYXJndW1lbnRlcXVhbHNOYW1lQ29udGV4dEF3YXJlR2VuZXJhdG9yRGVmZXJyZWRBY2Nlc3NHZW5lcmF0b3JFcnJvbmVvdXNFeHByZXNzaW9uR2VuZXJhdG9yRXhwcmVzc2lvbkdlbmVyYXRvck51bGxBd2FyZVByb3BlcnR5QWNjZXNzR2VuZXJhdG9yUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3JTdXBlclByb3BlcnR5QWNjZXNzR2VuZXJhdG9yVGhpc0luZGV4ZWRBY2Nlc3NHZW5lcmF0b3JVbmV4cGVjdGVkUXVhbGlmaWVkVXNlR2VuZXJhdG9ycHJpbnROb2RlT25wcmludFF1YWxpZmllZE5hbWVPbmtlcm5lbF9leHByZXNzaW9uX2dlbmVyYXRvcl9pbXBsLmRhcnRLZXJuZWxFeHByZXNzaW9uR2VuZXJhdG9yX2ZpbmlzaF9tYWtlU2ltcGxlUmVhZGNvbXBsZXhBc3NpZ25tZW50c3RhcnRDb21wbGV4QXNzaWdubWVudF9tYWtlU2ltcGxlV3JpdGVidWlsZE51bGxBd2FyZUFzc2lnbm1lbnRfbWFrZVJlYWRfbWFrZVdyaXRldG1wYnVpbGRDb21wb3VuZEFzc2lnbm1lbnRidWlsZFBvc3RmaXhJbmNyZW1lbnR2YWx1ZUFjY2Vzc2R1bW15bWFrZUludmFsaWRSZWFkbWFrZUludmFsaWRXcml0ZUtlcm5lbEdlbmVyYXRvcl9LZXJuZWxWYXJpYWJsZVVzZUdlbmVyYXRvciZLZXJuZWxHZW5lcmF0b3ImVmFyaWFibGVVc2VHZW5lcmF0b3JLZXJuZWxWYXJpYWJsZVVzZUdlbmVyYXRvciwgdmFyaWFibGU6ICwgcHJvbW90ZWRUeXBlOiBfS2VybmVsUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3ImS2VybmVsR2VuZXJhdG9yJlByb3BlcnR5QWNjZXNzR2VuZXJhdG9ybWFrZWlzVGhpc1Byb3BlcnR5QWNjZXNzS2VybmVsUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3JfcmVjZWl2ZXJWYXJpYWJsZXJlY2VpdmVyQWNjZXNzLCBfcmVjZWl2ZXJWYXJpYWJsZTogLCByZWNlaXZlcjogLCBuYW1lOiAsIGdldHRlcjogLCBzZXR0ZXI6IF9LZXJuZWxUaGlzUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3ImS2VybmVsR2VuZXJhdG9yJlRoaXNQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcktlcm5lbFRoaXNQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcl9LZXJuZWxOdWxsQXdhcmVQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvciZLZXJuZWxHZW5lcmF0b3ImTnVsbEF3YXJlUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3JLZXJuZWxOdWxsQXdhcmVQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcnJlY2VpdmVyRXhwcmVzc2lvbmtlcm5lbFByb3BlcnR5QXNzaWduLCByZWNlaXZlckV4cHJlc3Npb246ICwgdHlwZTogX0tlcm5lbFN1cGVyUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3ImS2VybmVsR2VuZXJhdG9yJlN1cGVyUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3JLZXJuZWxTdXBlclByb3BlcnR5QWNjZXNzR2VuZXJhdG9yX0tlcm5lbEluZGV4ZWRBY2Nlc3NHZW5lcmF0b3ImS2VybmVsR2VuZXJhdG9yJkluZGV4ZWRBY2Nlc3NHZW5lcmF0b3JwbGFpbk5hbWVGb3JXcml0ZUtlcm5lbEluZGV4ZWRBY2Nlc3NHZW5lcmF0b3JpbmRleFZhcmlhYmxlaW5kZXhBY2Nlc3NfbWFrZVdyaXRlQW5kUmV0dXJudmFsdWVWYXJpYWJsZSwgaW5kZXg6ICwgcmVjZWl2ZXJWYXJpYWJsZTogLCBpbmRleFZhcmlhYmxlOiBfS2VybmVsVGhpc0luZGV4ZWRBY2Nlc3NHZW5lcmF0b3ImS2VybmVsR2VuZXJhdG9yJlRoaXNJbmRleGVkQWNjZXNzR2VuZXJhdG9yS2VybmVsVGhpc0luZGV4ZWRBY2Nlc3NHZW5lcmF0b3JfS2VybmVsU3VwZXJJbmRleGVkQWNjZXNzR2VuZXJhdG9yJktlcm5lbEdlbmVyYXRvciZTdXBlckluZGV4ZWRBY2Nlc3NHZW5lcmF0b3JLZXJuZWxTdXBlckluZGV4ZWRBY2Nlc3NHZW5lcmF0b3JfS2VybmVsU3RhdGljQWNjZXNzR2VuZXJhdG9yJktlcm5lbEdlbmVyYXRvciZTdGF0aWNBY2Nlc3NHZW5lcmF0b3JLZXJuZWxTdGF0aWNBY2Nlc3NHZW5lcmF0b3J3cml0ZVRhcmdldCwgcmVhZFRhcmdldDogLCB3cml0ZVRhcmdldDogX0tlcm5lbExvYWRMaWJyYXJ5R2VuZXJhdG9yJktlcm5lbEdlbmVyYXRvciZMb2FkTGlicmFyeUdlbmVyYXRvcktlcm5lbExvYWRMaWJyYXJ5R2VuZXJhdG9yLCBidWlsZGVyOiBfS2VybmVsRGVmZXJyZWRBY2Nlc3NHZW5lcmF0b3ImS2VybmVsR2VuZXJhdG9yJkRlZmVycmVkQWNjZXNzR2VuZXJhdG9ycHJlZml4R2VuZXJhdG9yc3VmZml4R2VuZXJhdG9yb3BlcmF0b3JPZmZzZXRwcm9wZXJ0eUFjY2Vzc2RlZmVycmVkQWNjZXNzb3IucGxhaW5OYW1lRm9yUmVhZCwgcHJlZml4R2VuZXJhdG9yOiAsIHN1ZmZpeEdlbmVyYXRvcjogS2VybmVsRGVmZXJyZWRBY2Nlc3NHZW5lcmF0b3JfS2VybmVsVHlwZVVzZUdlbmVyYXRvciZLZXJuZWxSZWFkT25seUFjY2Vzc0dlbmVyYXRvciZUeXBlVXNlR2VuZXJhdG9yYXJndW1lbnRCdWlsZGVycywgZGVjbGFyYXRpb246ICwgcGxhaW5OYW1lRm9yUmVhZDogS2VybmVsVHlwZVVzZUdlbmVyYXRvcmxpdGVyYWxUeXBlX0tlcm5lbFJlYWRPbmx5QWNjZXNzR2VuZXJhdG9yJktlcm5lbEdlbmVyYXRvciZSZWFkT25seUFjY2Vzc0dlbmVyYXRvcktlcm5lbFJlYWRPbmx5QWNjZXNzR2VuZXJhdG9yLCBleHByZXNzaW9uOiBfS2VybmVsVW5yZXNvbHZlZE5hbWVHZW5lcmF0b3ImS2VybmVsR2VuZXJhdG9yJkVycm9uZW91c0V4cHJlc3Npb25HZW5lcmF0b3JidWlsZEVycm9yX0tlcm5lbFVucmVzb2x2ZWROYW1lR2VuZXJhdG9yJktlcm5lbEdlbmVyYXRvciZFcnJvbmVvdXNFeHByZXNzaW9uR2VuZXJhdG9yJlVucmVzb2x2ZWROYW1lR2VuZXJhdG9yS2VybmVsVW5yZXNvbHZlZE5hbWVHZW5lcmF0b3JfYnVpbGRVbnJlc29sdmVkVmFyaWFibGVBc3NpZ25tZW50X0tlcm5lbFVubGlua2VkR2VuZXJhdG9yJktlcm5lbEdlbmVyYXRvciZVbmxpbmtlZEdlbmVyYXRvcktlcm5lbFVubGlua2VkR2VuZXJhdG9yX0tlcm5lbENvbnRleHRBd2FyZUdlbmVyYXRvciZLZXJuZWxHZW5lcmF0b3ImQ29udGV4dEF3YXJlR2VuZXJhdG9yS2VybmVsQ29udGV4dEF3YXJlR2VuZXJhdG9yX0tlcm5lbERlbGF5ZWRBc3NpZ25tZW50Jktlcm5lbENvbnRleHRBd2FyZUdlbmVyYXRvciZEZWxheWVkQXNzaWdubWVudGhhbmRsZUFzc2lnbm1lbnRLZXJuZWxEZWxheWVkQXNzaWdubWVudCwgYXNzaWdubWVudE9wZXJhdG9yOiBfS2VybmVsRGVsYXllZFBvc3RmaXhJbmNyZW1lbnQmS2VybmVsQ29udGV4dEF3YXJlR2VuZXJhdG9yJkRlbGF5ZWRQb3N0Zml4SW5jcmVtZW50LCBiaW5hcnlPcGVyYXRvcjogLCBpbnRlcmZhY2VUYXJnZXQ6IEtlcm5lbERlbGF5ZWRQb3N0Zml4SW5jcmVtZW50X0tlcm5lbFByZWZpeFVzZUdlbmVyYXRvciZLZXJuZWxHZW5lcmF0b3ImUHJlZml4VXNlR2VuZXJhdG9yJyAhPSAsIHByZWZpeDogLCBkZWZlcnJlZDogS2VybmVsUHJlZml4VXNlR2VuZXJhdG9yX0tlcm5lbFVuZXhwZWN0ZWRRdWFsaWZpZWRVc2VHZW5lcmF0b3ImS2VybmVsR2VuZXJhdG9yJlVuZXhwZWN0ZWRRdWFsaWZpZWRVc2VHZW5lcmF0b3JLZXJuZWxVbmV4cGVjdGVkUXVhbGlmaWVkVXNlR2VuZXJhdG9yX0tlcm5lbFBhcnNlckVycm9yR2VuZXJhdG9yJktlcm5lbEdlbmVyYXRvciZQYXJzZXJFcnJvckdlbmVyYXRvciNwYXJzZXItZXJyb3JLZXJuZWxQYXJzZXJFcnJvckdlbmVyYXRvcmlzSW5pdGlhbGl6ZXIucGxhaW5OYW1lRm9yUmVhZGJ1aWxkRmllbGRJbml0aWFsaXplckVycm9yYnVpbGRDb25zdHJ1Y3RvckluaXRpYWxpemVyYnVpbGRBc3NpZ25tZW50RXJyb3IsIGlzSW5pdGlhbGl6ZXI6ICwgaXNTdXBlcjogX0luY29tcGxldGVFcnJvckdlbmVyYXRvciZJbmNvbXBsZXRlU2VuZEdlbmVyYXRvciZFcnJvbmVvdXNFeHByZXNzaW9uR2VuZXJhdG9yLCBtZXNzYWdlOiAsIGFyZ3VtZW50czogbWFrZUJpbmFyeW1ha2VPclJldXNlVmFyaWFibGVhZGp1c3RGb3JJbXBsaWNpdENhbGxpc0ZpZWxkT3JHZXR0ZXJmYXN0YS5xdWFsaWZpZWRfbmFtZXByZXNlcnZlVG9rZW5pZGVudGlmaWVyKF9Ub2tlbklkZW50aWZpZXJ0b2tlbi1pZGVudGlmaWVyKGluaXRpYWxpemVkLWlkZW50aWZpZXIocXVhbGlmaWVkLW5hbWUoX1Rva2VuUXVhbGlmaWVkTmFtZXRva2VuLXF1YWxpZmllZC1uYW1lKGZsYXR0ZW5RdWFsaWZpZWROYW1lT250b2tlbklkZW50aWZpZXJmYXN0YS5idWlsdGluX3R5cGVfYnVpbGRlcmZhc3RhLmNsYXNzX2J1aWxkZXJyZWRpcmVjdGluZ0NvbnN0cnVjdG9yc3JlZGlyZWN0Y3ljbGVSZXBvcnRlZENvbnN0cnVjdG9yUmVkaXJlY3Rpb25mYXN0YS5jb25zdHJ1Y3Rvcl9yZWZlcmVuY2VfYnVpbGRlcm1pZGRsZWZhc3RhLmRlY2xhcmF0aW9uLnRhcmdldGlzQW5vbnltb3VzTWl4aW5BcHBsaWNhdGlvbi5hcHBseVBhdGNoLmZpbmlzaFBhdGNoZmFzdGEuZHluYW1pY190eXBlX2J1aWxkZXJmYXN0YS5lbnVtX2J1aWxkZXJmYXN0YS5maWVsZF9idWlsZGVyZmFzdGEuZm9ybWFsX3BhcmFtZXRlcl9idWlsZGVyaXNNYW5kYXRvcnlGb3JtYWxQYXJhbWV0ZXJLaW5kaXNPcHRpb25hbE5hbWVkRm9ybWFsUGFyYW1ldGVyS2luZGlzT3B0aW9uYWxQb3NpdGlvbmFsRm9ybWFsUGFyYW1ldGVyS2luZGZhc3RhLmZ1bmN0aW9uX3R5cGVfYnVpbGRlcikgLT4gZmFzdGEuaW52YWxpZF90eXBlX2J1aWxkZXJmYXN0YS5saWJyYXJ5X2J1aWxkZXIuYXBwbHlQYXRjaGVzTGlicmFyeUxvY2FsRGVjbGFyYXRpb25JdGVyYXRvckxpYnJhcnlMb2NhbERlY2xhcmF0aW9uTmFtZUl0ZXJhdG9yZmFzdGEubWVtYmVyX2J1aWxkZXJpc0NsYXNzTWVtYmVyZmFzdGEubWV0YWRhdGFfYnVpbGRlcmZyb21Db25zdHJ1Y3RvcmNvbnN0cnVjdG9yUmVmZXJlbmNlZnJvbUV4cHJlc3Npb25Db25zdHJ1Y3Rvck1ldGFkYXRhQnVpbGRlckV4cHJlc3Npb25NZXRhZGF0YUJ1aWxkZXJmYXN0YS5taXhpbl9hcHBsaWNhdGlvbl9idWlsZGVyZmFzdGEubW9kaWZpZXJfYnVpbGRlcmZhc3RhLm5hbWVfaXRlcmF0b3JmYXN0YS5uYW1lZF90eXBlX2J1aWxkZXJ0eXBlTmFtZU9mZnNldGZsYXROYW1lZmFzdGEucHJlZml4X2J1aWxkZXJmYXN0YS5wcm9jZWR1cmVfYnVpbGRlcmZvcm1hbCBwYXJhbWV0ZXJmb3JtYWwgcGFyYW1ldGVyIGluaXRpYWxpemVydHlwZSBwYXJhbWV0ZXJmYXN0YS5mdW5jdGlvbl90eXBlX2FsaWFzX2J1aWxkZXJmYXN0YS50eXBlX2J1aWxkZXJmYXN0YS50eXBlX2RlY2xhcmF0aW9uX2J1aWxkZXJmYXN0YS50eXBlX3ZhcmlhYmxlX2J1aWxkZXJmYXN0YS51bnJlc29sdmVkX3R5cGVVbnJlc29sdmVkVHlwZShAZmFzdGEudm9pZF90eXBlX2J1aWxkZXJmYXN0YS5zY2FubmVyLmFic3RyYWN0X3NjYW5uZXJMaXN0TWl4aW5VaW50MTZMaXN0VWludDMyTGlzdEtleXdvcmRTdGF0ZUxBWllfQVNTSUdOTUVOVF9FTkFCTEVEY29tbWVudHNUYWlsYmlnU3dpdGNobmV4dExvd2VydG9rZW5pemVSYXdTdHJpbmdLZXl3b3JkT3JJZGVudGlmaWVydG9rZW5pemVLZXl3b3JkT3JJZGVudGlmaWVydG9rZW5pemVEb3RzT3JOdW1iZXJ0b2tlbml6ZUVxdWFsc3Rva2VuaXplU2xhc2hPckNvbW1lbnR0b2tlbml6ZVN0cmluZ3Rva2VuaXplTGVzc1RoYW50b2tlbml6ZUdyZWF0ZXJUaGFudG9rZW5pemVFeGNsYW1hdGlvbnRva2VuaXplT3BlblNxdWFyZUJyYWNrZXR0b2tlbml6ZUF0dG9rZW5pemVOdW1iZXJ0b2tlbml6ZUFtcGVyc2FuZHRva2VuaXplSGV4T3JOdW1iZXJ0b2tlbml6ZVF1ZXN0aW9udG9rZW5pemVCYXJ0b2tlbml6ZVBsdXN0b2tlbml6ZU1pbnVzdG9rZW5pemVNdWx0aXBseXRva2VuaXplQ2FyZXR0b2tlbml6ZVRpbGRldG9rZW5pemVQZXJjZW50dG9rZW5pemVUYWd0b2tlbml6ZUZyYWN0aW9uUGFydG5leHRuZXh0dG9rZW5pemVIZXhoYXNEaWdpdHN1bnRlcm1pbmF0ZWRzaG91bGRBZHZhbmNlZG9uZWhhc0RpZ2l0aGFzRXhwb25lbnREaWdpdHN0b2tlbml6ZU11bHRpTGluZUNvbW1lbnR0b2tlbml6ZVNpbmdsZUxpbmVDb21tZW50ZGFydGRvY2FwcGVuZERhcnREb2NhcHBlbmRDb21tZW50YXNjaWlPbmx5Q29tbWVudGFzY2lpT25seUxpbmVzdW5pY29kZVN0YXJ0bmVzdGluZ25ld0NvbW1lbnRfYXBwZW5kVG9Db21tZW50U3RyZWFtYWxsb3dEb2xsYXJuZXh0Q2FwaXRhbHRva2VuaXplSWRlbnRpZmllcnF1b3RlQ2hhcnRva2VuaXplTXVsdGlMaW5lU3RyaW5ndG9rZW5pemVTaW5nbGVMaW5lUmF3U3RyaW5ndG9rZW5pemVTaW5nbGVMaW5lU3RyaW5ncXVvdGVTdGFydHRva2VuaXplU3RyaW5nSW50ZXJwb2xhdGlvbnVudGVybWluYXRlZFN0cmluZ2lzTXVsdGlMaW5laXNSYXd0b2tlbml6ZUludGVycG9sYXRlZEV4cHJlc3Npb250b2tlbml6ZUludGVycG9sYXRlZElkZW50aWZpZXJ0b2tlbml6ZU11bHRpTGluZVJhd1N0cmluZ2FzY2lpT25seVN0cmluZ2FzY2lpT25seUxpbmVhZHZhbmNlQWZ0ZXJFcnJvcmVycm9yU3RhcnRfTGluZVN0YXJ0cyZPYmplY3QmTGlzdE1peGlubWF0Y2hGb3VuZF9jbG9zZUdhcF9maWx0ZXJyZXRhaW5NYXRjaGluZ3JldGFpbmVkX2NvbXBhcmVBbnlzaHVmZmxlcmFuZG9tcG9zbmV4dEludGxpc3RMZW5ndGhmaWxsc2tpcENvdW50b3RoZXJMaXN0b3RoZXJTdGFydHJlcGxhY2VSYW5nZW5ld0NvbnRlbnRzcmVtb3ZlTGVuZ3RoaW5zZXJ0TGVuZ3RoaW5zZXJ0RW5kaW5kZXhXaGVyZWxhc3RJbmRleFdoZXJlaW5zZXJ0QWxsaW5zZXJ0aW9uTGVuZ3Roc2V0QWxsTGluZVN0YXJ0c2FycmF5TGVuZ3RoZXhwZWN0ZWROdW1iZXJPZkxpbmVzZ3Jvd3N3aXRjaFRvVWludDMybmV3TGVuZ3RoTWluaW11bW5ld0FycmF5ZmFzdGEuZ3JhcGhjb21wdXRlU3Ryb25nQ29tcG9uZW50c3ByZW9yZGVyTnVtYmVyc3VuYXNzaWduZWRhc3NpZ25lZHJlY3Vyc2l2ZWx5U2VhcmNobmVpZ2hib3JQcmVvcmRlck51bWJlclR5cGVWYXJpYWJsZUdyYXBoZWRnZXN0eXBlUGFyYW1ldGVySW5kaWNlc2NvbGxlY3Rvcm9jY3VycmVkT2NjdXJyZW5jZUNvbGxlY3RvclZpc2l0b3JWYXJpYW5jZXVucmVsYXRlZGludmFyaWFudG1lZXRpbnN0YW50aWF0ZVRvQm91bmRzc3Ryb25nbHlDb25uZWN0ZWR1cHBlckJvdW5kc2xvd2VyQm91bmRzdHlwZVBhcmFtZXRlckluZGV4dHlwZWRlZlJoc1Jlc3VsdGFyZ3VtZW50c1Jlc3VsdGFyZ3VtZW50c1RvUmVwb3J0dHlwZWRlZkluc3RhbnRpYXRpb25zY29udmVydFN1cGVyQm91bmRlZFRvUmVndWxhckJvdW5kZWRyZXBsYWNlZFR5cGVBcmd1bWVudHNyZXBsYWNlZFJldHVyblR5cGVyZXBsYWNlZFBvc2l0aW9uYWxQYXJhbWV0ZXJzcmVwbGFjZWROYW1lZFBhcmFtZXRlcnNUeXBlVmFyaWFibGVzR3JhcGh2YXJpYWJsZUluZGljZXNjb2xsZWN0UmVmZXJlbmNlc0Zyb21UeXBlVmFyaWFibGVTZWFyY2hhbnlUeXBlVmFyaWFibGVzc3Vic3RpdHV0ZVJhbmdldXBwZXJTdWJzdGl0dXRpb25sb3dlclN1YnN0aXR1dGlvbnN1YnN0aXR1dGVkQXJndW1lbnRkeW5hbWljU3Vic3RpdHV0aW9ubnVsbFN1YnN0aXR1dGlvbnZhcmlhYmxlSW5kZXhmaW5kVmFyaWFibGVVc2VzSW5UeXBlZGVwZW5kZW50VmFyaWFibGVmaW5kSW5ib3VuZFJlZmVyZW5jZXN2YXJpYWJsZXNBbmREZXBlbmRlbmNpZXNkZXBlbmRlbmNlZmluZFJhd1R5cGVzV2l0aEluYm91bmRSZWZlcmVuY2VzdHlwZXNBbmREZXBlbmRlbmNpZXNoYXNJbmJvdW5kZ2V0SW5ib3VuZFJlZmVyZW5jZUlzc3Vlc3Jhd1R5cGVzQW5kTXV0dWFsRGVwZW5kZW5jaWVzZmluZFJhd1R5cGVQYXRoc1RvRGVjbGFyYXRpb252aXNpdGVkZGVwZW5kZW5jeVBhdGhmaW5kUmF3VHlwZUN5Y2xlc2N5Y2xlc2NvbnZlcnRSYXdUeXBlQ3ljbGVzSW50b0lzc3Vlc2N5Y2xlZmlyc3RFbmNvdW50ZXJlZFR5cGVjeWNsZXNUb1JlcG9ydGRlY2xhcmF0aW9uUGF0aEFuZE5hbWVsZXhNaW5QYXRoQW5kTmFtZXBhdGhBbmROYW1lcmF3VHlwZUN5Y2xlc0FzSXNzdWVzYnJlYWtDeWNsZXNjb250YWluZWRVcmlmYXN0YS5jb25maWd1cmF0aW9uVHJhY2VUcmFjZUFuZFJlcG9ydFN0YWNrVHJhY2VMaW5lc21heEZpbGVMZW5ndGhtYXhMaW5lTm9MZW5ndGhtYXhDb2x1bW5Ob0xlbmd0aGZyb21MaW5lc2Zyb21UcmFjZXJhbmdlU3RhcnRyYW5nZUVuZGZpbGVQcmVmaXhsYW1iZGFpbmRleFBhdHRlcm4jXGQrXHMqcmVwbGFjZUZpcnN0PGFzeW5jaHJvbm91cyBzdXNwZW5zaW9uPmxlZnRQYXJlblBvc3JpZ2h0UGFyZW5Qb3NsYXN0Q29sb25uZXh0VG9MYXN0Q29sb25saW5lTm9jb2x1bW5Obzxhbm9ueW1vdXMgY2xvc3VyZT5FcnJvciBwcmV0dGlmeWluZyAiIjogc3VidHJhY2VwcmV0dGlmeXNob3dDb2x1bW5Ob3Nob3dEb3RzZG90c2ZpbGVMZW5ndGggLmxpbmVOb0xlbmd0aGNvbHVtbk5vTGVuZ3RoU3RhY2tUcmFjZUxpbmVmaWxlVGV4dGxpbmVOb1RleHRjb2x1bW5Ob1RleHQgQCAgW190cmFjZXRyYWNlRXhjZXB0aW9uc2V4Y2VwdGlvbnN0cmFjZUFuZFJlcG9ydHJlcG9ydEFuZFRyYWNlX3RyYWNlQW5kUmVwb3J0cHJldHRpZnlTdGFja1RyYWNlcGFkaW50ZW5kZWRMZW5ndGhkb3RzTGVuZ3RoZG90c0luZGV4RGVidWdDYWxsYmFja2FyZzFhcmcyRGVidWdNYXBpbmRleFNldENhbGxiYWNrcHV0SWZBYnNlbnRDYWxsYmFja3JlbW92ZUNhbGxiYWNrYWRkQ2FsbGJhY2tSS1JWY29udGFpbnNWYWx1ZWlmQWJzZW50YWRkRW50cmllc0syVjJ1cGRhdGVBbGxEZWJ1Z0l0ZXJhYmxlRGVidWdMaXN0YWRkQWxsQ2FsbGJhY2tmaWxsVmFsdWVEZWJ1Z1NldE1hcFR5cGVBc3NlcnRlcnJ1bnRpbWVUeXBlc3Nob3dPYmplY3RzdmFsdWVzVHlwZXMgPT4gQ29sbGVjdGlvblR5cGVBc3NlcnRlcmFzc2VydFR5cGVFeHBlbnNpdmVNYXBfbWFwc2NvcGllc0tSVlJleHBlbnNpdmUoRXhwZW5zaXZlU2V0X3NldHNvYmplY3Rzb2JqZWN0c1RvUmVtb3Zlb2JqZWN0c1RvUmV0YWlucmV0YWluU2V0U3RhdHNyZWNvcmRNYXBmcm9tRXhpc3RpbmdnZXRNYXByZWNvcmRFbGVtZW50Z2V0TGlzdHJlY29yZEZyZXF1ZW5jeWV4YW1wbGVyZWNvcmRGcmVxdWVuY2llc3JlY29yZGVkRnJlcXVlbmNpZXNyZWNvcmRDb3VudGVycmVjb3JkVHJhY2VzYW1wbGVGcmVxdWVuY3lzdGFja1RyYWNlU2FtcGxlRnJlcXVlbmN5ZHVtcFN0YXRzYmVmb3JlQ2xvc2VkdW1wQ29ycmVsYXRpb25pZEFpZEJkYXRhQWRhdGFCU3RhdHNPdXRwdXREZWJ1Z091dHB1dFNpbmtPdXRwdXRTdGF0c1ByaW50ZXJncm91cGNyZWF0ZUdyb3VwQ29udGVudGNyZWF0ZUNoaWxkQ29udGVudGJlZ2luRXh0cmFlbmRFeHRyYV9CYXNlUHJpbnRlciZTdGF0c1ByaW50ZXImSW5kZW50YXRpb25CYXNlUHJpbnRlckNvbnNvbGVQcmludGVyZXh0cmFMZXZlbHNwYWNlbm9uTnVsbFZhbHVlc1hNTFByaW50ZXJlc2NhcGVvcGVuZWQ8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pl9TdGFja1RyYWNlTm9kZWNvbW1vblByZWZpeHN1YnRyYWNlc2xlYWZhZGRTdWJ0cmFjZWNvbW1vblByZWZpeExlbmd0aGR1bXBUcmFjZXNkdW1wU3VidHJhY2Vzc3RlcGNvdW50VGV4dC4uLgpfU3RhY2tUcmFjZVRyZWV0b3RhbENvdW50c2FtcGxlQWN0aXZlU3RhdHNmcmVxdWVuY3lNYXBzc2V0c01hcGNvdW50ZXJzTWFwdHJhY2VNYXBmcmVxdWVuY3lNYXBzdGF0c2R1bXBGcmVxdWVuY2llc2R1bXBTZXRzZHVtcENvdW50ZXJzZHVtcEl0ZXJhYmxlZGF0YU1hcGZyZXF1ZW5jaWVzZnJlcXVlbmN5ZHVtcEZyZXF1ZW5jeXNvcnRlZE1hcGNvdW50ZXJzZHVtcENvdW50ZXJoYXNEYXRhY2F0ZWdvcnlleGFtcGxlc0xpbWl0aGFzTW9yZWluY2x1ZGVDb3VudHRyYWNlc2R1bXBUcmFjZXRyZWVrZXlBa2V5QmNvcnJlbGF0aW9ucyB2cyBhQW5kQmFBbmROb3RCbm90QWFuZEJjb3JyZWxhdGlvbiAmJiAgJiYgIWNoaWxkRGF0YW5vbk51bGxJdGVyYWJsZV9zdGF0c2VuYWJsZVN0YXRzT3V0cHV0eG1sU3RhdHMgaGF2ZSBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuaW52ZXJzZU1hcGlzVmFsaWRLZXl0cnlTb3J0TWFwc29ydE1hcFRyYWNrTWFwX2NvdW50c19jb3VudHNNYXBjb3VudHNwcmludEhpc3RvZ3JhbSAtLSAgbWFwc2luY3JlbWVudGFjY3VtdWxhdGVkICAtLSAlOiBsZW5ndGggPD0gX25vdGlmeUxlbmd0aENoYW5nZWRqc19iYWNrZW5kanNfYmFja2VuZC5uYXRpdmVfZGF0YU5hdGl2ZUJlaGF2aW9yZ2V0TmF0aXZlVGFnc09mQ2xhc3NoYXNOYXRpdmVUYWdzRm9yY2VkTm9uTGVhZmlzTmF0aXZlT3JFeHRlbmRzTmF0aXZlaXNKc0ludGVyb3BVc2VkaXNKc0ludGVyb3BMaWJyYXJ5aXNKc0ludGVyb3BNZW1iZXJnZXROYXRpdmVNZXRob2RCZWhhdmlvcmdldE5hdGl2ZUZpZWxkTG9hZEJlaGF2aW9yZ2V0TmF0aXZlRmllbGRTdG9yZUJlaGF2aW9yaGFzRml4ZWRCYWNrZW5kTmFtZWdldEZpeGVkQmFja2VuZE5hbWVnZXRGaXhlZEJhY2tlbmRNZXRob2RQYXRoZ2V0SnNJbnRlcm9wTGlicmFyeU5hbWVpc0Fub255bW91c0pzSW50ZXJvcENsYXNzZ2V0SnNJbnRlcm9wQ2xhc3NOYW1lZ2V0SnNJbnRlcm9wTWVtYmVyTmFtZWNvbXB1dGVVbmVzY2FwZWRKU0ludGVyb3BOYW1lTmF0aXZlQmFzaWNEYXRhQnVpbGRlcnNldE5hdGl2ZUNsYXNzVGFnSW5mb3RhZ0luZm9tYXJrQXNKc0ludGVyb3BMaWJyYXJ5bWFya0FzSnNJbnRlcm9wQ2xhc3Npc0Fub255bW91c21hcmtBc0pzSW50ZXJvcE1lbWJlcnNldE5hdGl2ZU1ldGhvZEJlaGF2aW9yYmVoYXZpb3JzZXROYXRpdmVGaWVsZExvYWRCZWhhdmlvcnNldE5hdGl2ZUZpZWxkU3RvcmVCZWhhdmlvcnNldE5hdGl2ZU1lbWJlck5hbWVOYXRpdmVCYXNpY0RhdGFCdWlsZGVySW1wbG5hdGl2ZUNsYXNzVGFnSW5mb2pzSW50ZXJvcExpYnJhcmllc2pzSW50ZXJvcENsYXNzZXNhbm9ueW1vdXNKc0ludGVyb3BDbGFzc2VzanNJbnRlcm9wTWVtYmVyc3RhZ1RleHROYXRpdmVCYXNpY0RhdGFCdWlsZGVyIGlzIGNsb3NlZC4gVHJ5aW5nIHRvIG1hcmsgIGFzIGEgbmF0aXZlIGNsYXNzLk5hdGl2ZSB0YWcgaW5mbyBzZXQgaW5jb25zaXN0ZW50bHkgb24gRXhpc3RpbmcgdGFnIGluZm8gJ25ldyB0YWcgaW5mbyAnIGFzIGEganMtaW50ZXJvcCBsaWJyYXJ5LiBhcyBhIGpzLWludGVyb3AgY2xhc3MuIGFzIGEganMtaW50ZXJvcCBtZW1iZXIucmVvcGVuRm9yVGVzdGluZ05hdGl2ZUJhc2ljRGF0YUltcGxuYXRpdmUtYmFzaWMtZGF0YWZyb21JcmZvckVhY2hOYXRpdmVDbGFzc2ZvckVhY2hKc0ludGVyb3BMaWJyYXJ5Zm9yRWFjaEpzSW50ZXJvcENsYXNzZm9yRWFjaEpzSW50ZXJvcE1lbWJlcmlzTm9uTGVhZnJlYWRMaWJyYXJ5TWFwcmVhZENsYXNzZXN3cml0ZUxpYnJhcnlNYXB3cml0ZUNsYXNzZXNfaXNKc0ludGVyb3BNZW1iZXJOYXRpdmVEYXRhQnVpbGRlckltcGxuYXRpdmVNZW1iZXJOYW1lbmF0aXZlTWV0aG9kQmVoYXZpb3JuYXRpdmVGaWVsZExvYWRCZWhhdmlvcm5hdGl2ZUZpZWxkU3RvcmVCZWhhdmlvck5hdGl2ZSBtZW1iZXIgbmFtZSBzZXQgaW5jb25zaXN0ZW50bHkgb24gRXhpc3RpbmcgbmFtZSAnbmV3IG5hbWUgJ05hdGl2ZURhdGFJbXBsbmF0aXZlLWRhdGFfanNJbnRlcm9wRXNjYXBlUHJlZml4SlMkZm9yRWFjaE5hdGl2ZU1ldGhvZERhdGFjcmVhdGVzQW5ub3RhdGlvbnNyZXR1cm5zQW5ub3RhdGlvbnNpc0pzSW50ZXJvcGdldE5hdGl2ZUJlaGF2aW9yRm9yTWV0aG9kZm9yRWFjaE5hdGl2ZUZpZWxkRGF0YWdldE5hdGl2ZUJlaGF2aW9yRm9yRmllbGRMb2FkZ2V0TmF0aXZlQmVoYXZpb3JGb3JGaWVsZFN0b3JlX2pzQ2xhc3NOYW1lSGVscGVyX2pzTWVtYmVyTmFtZUhlbHBlcl9qc0xpYnJhcnlOYW1lSGVscGVyanNJbnRlcm9wTmFtZSBpcyBqcyBpbnRlcm9wIGJ1dCBqcyBpbnRlcm9wIG5hbWUgaGFzIG5vdCB5ZXQgYmVlbiBjb21wdXRlZC5fZml4ZWRCYWNrZW5kQ2xhc3NQYXRoTm8gbmF0aXZlIG1ldGhvZCBiZWhhdmlvciBoYXMgYmVlbiBjb21wdXRlZCBmb3IgTm8gbmF0aXZlIGZpZWxkIGxvYWQgYmVoYXZpb3IgaGFzIGJlZW4gY29tcHV0ZWQgZm9yIE5vIG5hdGl2ZSBmaWVsZCBzdG9yZSBiZWhhdmlvciBoYXMgYmVlbiBjb21wdXRlZCBmb3IgTmF0aXZlQ2xhc3NUYWd0YWdzIW5vbmxlYWZzc2FfYnVpbGRlcm9wdGltaXplcnNvdXJjZUluZm9ybWF0aW9uRmFjdG9yeW9wdGltaXplZ2VuZXJhdGVDb2Rlc291cmNlSW5mb3JtYXRpb25CdWlsZGVyU3NhQnVpbGRlclNzYUJ1aWxkZXJUYXNrX3NvdXJjZUluZm9ybWF0aW9uRmFjdG9yeVNTQSBidWlsZGVyU3NhQnVpbGRlckZpZWxkTWl4aW5oYW5kbGVDb25zdGFudEZpZWxkaXNMYXp5d29ybGRfYnVpbGRlclNlbGVjdG9yQ29uc3RyYWludHNTdHJvbmdNb2RlV29ybGRTdHJhdGVneVN0cm9uZ01vZGVXb3JsZENvbnN0cmFpbnRzX2NvbnN0cmFpbnRzU3Ryb25nTW9kZUNvbnN0cmFpbnRpc1RoaXNTdHJvbmdNb2RlQ29uc3RyYWludChXb3JsZEJ1aWxkZXJ0eXBlVmFyaWFibGVUeXBlTGl0ZXJhbHNmb3JFYWNoU3RhdGljVHlwZUFyZ3VtZW50Zm9yRWFjaER5bmFtaWNUeXBlQXJndW1lbnRXb3JsZEJ1aWxkZXJCYXNlX3N0YXRpY1R5cGVBcmd1bWVudERlcGVuZGVuY2llc19keW5hbWljVHlwZUFyZ3VtZW50RGVwZW5kZW5jaWVzX3JlZ2lzdGVyU3RhdGljVHlwZUFyZ3VtZW50RGVwZW5kZW5jeV9yZWdpc3RlckR5bmFtaWNUeXBlQXJndW1lbnREZXBlbmRlbmN5ZGFydDJqcy5lbGVtZW50cy5uYW1lc2lzQWNjZXNzaWJsZUZyb21pc1NpbWlsYXJUb3NpbWlsYXJIYXNoQ29kZWlzUHJpdmF0ZU5hbWVpc1B1YmxpY05hbWVQcml2YXRlTmFtZWRhcnQyanMuY2FsbF9zdHJ1Y3R1cmVjYWxsLXN0cnVjdHVyZU5PX0FSR1NPTkVfQVJHVFdPX0FSR1NUSFJFRV9BUkdTRk9VUl9BUkdTdW5uYW1lZHdpdGhUeXBlQXJndW1lbnRDb3VudGlzVW5uYW1lZGFyaXR5PSwgdHlwZXM9Q2FsbFN0cnVjdHVyZShjYWxsU2VsZWN0b3JvcHRpb25hbFBhcmFtZXRlckNvdW50bmFtZUluZGV4c2FtZU5hbWVzTmFtZWRDYWxsU3RydWN0dXJlX29yZGVyZWROYW1lZEFyZ3VtZW50cywgbmFtZWQ9W2RhcnQyanMuY29uc3RhbnRfc3lzdGVtT3BlcmF0aW9uVW5hcnlPcGVyYXRpb25CaW5hcnlPcGVyYXRpb25CaXROb3RPcGVyYXRpb25pc01pbnVzWmVyb2ludENvbnN0YW50TmVnYXRlT3BlcmF0aW9uX2ZvbGRkb3VibGVDb25zdGFudE5vdE9wZXJhdGlvbkJpbmFyeUJpdE9wZXJhdGlvbmxlZnRJbnRyaWdodEludHJlc3VsdFZhbHVlZm9sZEludHNCaXRBbmRPcGVyYXRpb25CaXRPck9wZXJhdGlvbkJpdFhvck9wZXJhdGlvblNoaWZ0TGVmdE9wZXJhdGlvblNoaWZ0UmlnaHRPcGVyYXRpb250cnVuY2F0ZWRWYWx1ZVNJR05fQklUQmluYXJ5Qm9vbE9wZXJhdGlvbmxlZnRCb29scmlnaHRCb29sZm9sZEJvb2xzQm9vbGVhbkFuZE9wZXJhdGlvbkJvb2xlYW5Pck9wZXJhdGlvbkFyaXRobWV0aWNOdW1PcGVyYXRpb25sZWZ0TnVtcmlnaHROdW1mb2xkZWRWYWx1ZWZvbGROdW1zaXNEaXZpZGVpc1RydW5jYXRpbmdEaXZpZGVTdWJ0cmFjdE9wZXJhdGlvbk11bHRpcGx5T3BlcmF0aW9uTW9kdWxvT3BlcmF0aW9uUmVtYWluZGVyT3BlcmF0aW9uVHJ1bmNhdGluZ0RpdmlkZU9wZXJhdGlvbnJhdGlvdHJ1bmNhdGVEaXZpZGVPcGVyYXRpb25BZGRPcGVyYXRpb25sZWZ0U3RyaW5ncmlnaHRTdHJpbmdSZWxhdGlvbmFsTnVtT3BlcmF0aW9uTGVzc09wZXJhdGlvbkxlc3NFcXVhbE9wZXJhdGlvbkdyZWF0ZXJPcGVyYXRpb25HcmVhdGVyRXF1YWxPcGVyYXRpb25FcXVhbHNPcGVyYXRpb25pc0NvbnN0cnVjdGVkT2JqZWN0SWRlbnRpdHlPcGVyYXRpb25sZWZ0RG91YmxlcmlnaHREb3VibGVJZk51bGxPcGVyYXRpb25Db2RlVW5pdEF0T3BlcmF0aW9uY2hhckNvZGVBdHN0cmluZ0NvbnN0YW50aW5kZXhDb25zdGFudFJvdW5kT3BlcmF0aW9ucm91bmR0cnlUb1JvdW5kc2V2ZXJhbFVMUHJvdW5kZWRyb3VuZFRvRG91Ymxlcm91bmRlZDFyb3VuZGVkMlVuZm9sZGVkVW5hcnlPcGVyYXRpb25KYXZhU2NyaXB0U2V0Q29uc3RhbnRKYXZhU2NyaXB0TWFwQ29uc3RhbnRQUk9UT19QUk9QRVJUWV9fcHJvdG9fX0RBUlRfQ0xBU1NEQVJUX1NUUklOR19DTEFTU0NvbnN0YW50U3RyaW5nTWFwREFSVF9QUk9UT19DTEFTU0NvbnN0YW50UHJvdG9NYXBEQVJUX0dFTkVSQUxfQ0xBU1NHZW5lcmFsQ29uc3RhbnRNYXBMRU5HVEhfTkFNRUpTX09CSkVDVF9OQU1FX2pzT2JqZWN0S0VZU19OQU1FX2tleXNQUk9UT19WQUxVRV9wcm90b1ZhbHVlSlNfREFUQV9OQU1FX2pzRGF0YWtleUxpc3Rwcm90b1ZhbHVlX0JJVFMzMjQyOTQ5NjcyOTViaXRBbmRiaXROb3RiaXRPcmJpdFhvcmJvb2xlYW5BbmRib29sZWFuT3JlcXVhbGdyZWF0ZXJFcXVhbGdyZWF0ZXJpZGVudGl0eWlmTnVsbGxlc3NFcXVhbGxlc3NzaGlmdExlZnRzaGlmdFJpZ2h0X2ludGVnZXJCZWNvbWVzTmFuT3JJbmZpbml0eV9jb252ZXJ0VG9KYXZhU2NyaXB0Q29uc3RhbnRmbG9vclZhbHVlZG91YmxlUmVzdWx0dHJ1bmNhdGVkY3JlYXRlSW50Y3JlYXRlSW50RnJvbUludF9jcmVhdGVJbnQzMmNyZWF0ZURvdWJsZWNyZWF0ZVN0cmluZ2NyZWF0ZUJvb2xjcmVhdGVOdWxsY3JlYXRlTGlzdGNyZWF0ZVR5cGVpc1Bvc2l0aXZlSW5maW5pdHlpc05lZ2F0aXZlSW5maW5pdHljcmVhdGVTZXRudWxsc2NyZWF0ZU1hcGtleXNUeXBla2V5c0xpc3RjcmVhdGVTeW1ib2xsb29rdXBVbmFyeWxvb2t1cEJpbmFyeWRhcnQyanMuY29uc3RhbnRzLnZhbHVlc0NvbnN0YW50VmFsdWVLaW5kQ29uc3RhbnRWYWx1ZUtpbmQuRlVOQ1RJT05Db25zdGFudFZhbHVlS2luZC5OVUxMQ29uc3RhbnRWYWx1ZUtpbmQuSU5UQ29uc3RhbnRWYWx1ZUtpbmQuRE9VQkxFQ29uc3RhbnRWYWx1ZUtpbmQuQk9PTENvbnN0YW50VmFsdWVLaW5kLlNUUklOR0NvbnN0YW50VmFsdWVLaW5kLkxJU1RDb25zdGFudFZhbHVlS2luZC5TRVRDb25zdGFudFZhbHVlS2luZC5NQVBDb25zdGFudFZhbHVlS2luZC5DT05TVFJVQ1RFRENvbnN0YW50VmFsdWVLaW5kLlRZUEVJTlRFUkNFUFRPUkNvbnN0YW50VmFsdWVLaW5kLklOVEVSQ0VQVE9SU1lOVEhFVElDQ29uc3RhbnRWYWx1ZUtpbmQuU1lOVEhFVElDQ29uc3RhbnRWYWx1ZUtpbmQuSU5TVEFOVElBVElPTkRFRkVSUkVEX0dMT0JBTENvbnN0YW50VmFsdWVLaW5kLkRFRkVSUkVEX0dMT0JBTE5PTl9DT05TVEFOVENvbnN0YW50VmFsdWVLaW5kLk5PTl9DT05TVEFOVENvbnN0YW50VmFsdWVWaXNpdG9ydmlzaXRTeW50aGV0aWN2aXNpdERlZmVycmVkR2xvYmFsdmlzaXROb25Db25zdGFudGlzVHlwZWlzRHVtbXlpc09uZVVzZSBDb25zdGFudFZhbHVlLnRvRGFydFRleHQoKSBvciBDb25zdGFudFZhbHVlLnRvU3RydWN0dXJlZFRleHQoKSBpbnN0ZWFkIG9mIENvbnN0YW50VmFsdWUudG9TdHJpbmcoKS5GdW5jdGlvbkNvbnN0YW50VmFsdWUyMTQ3NDgzNjQ3RnVuY3Rpb25Db25zdGFudChQcmltaXRpdmVDb25zdGFudC49PVByaW1pdGl2ZUNvbnN0YW50Lmhhc2hDb2RlTnVsbENvbnN0YW50VmFsdWVKc051bGxOdW1Db25zdGFudFZhbHVlSW50Q29uc3RhbnRWYWx1ZV9jYWNoZWRWYWx1ZXNpbnRDb25zdGFudFZhbGlzUG9zaXRpdmVvdGhlckludEludENvbnN0YW50KERvdWJsZUNvbnN0YW50VmFsdWVvdGhlckRvdWJsZURvdWJsZUNvbnN0YW50KEJvb2xDb25zdGFudFZhbHVlQm9vbENvbnN0YW50KFRydWVDb25zdGFudFZhbHVlRmFsc2VDb25zdGFudFZhbHVlU3RyaW5nQ29uc3RhbnRWYWx1ZW90aGVyU3RyaW5ndG9EYXJ0U3RyaW5nU3RyaW5nQ29uc3RhbnQoT2JqZWN0Q29uc3RhbnRWYWx1ZV91bnBhcnNlVHlwZUFyZ3VtZW50c1R5cGVDb25zdGFudChMaXN0Q29uc3RhbnRWYWx1ZUxpc3RDb25zdGFudChTZXRDb25zdGFudFZhbHVlb3RoZXJTZXRTZXRDb25zdGFudCh9KU1hcENvbnN0YW50VmFsdWVfbG9va3VwTWFwb3RoZXJNYXBsb29rdXBNYXBNYXBDb25zdGFudChpbnRlcmNlcHRvcihJbnRlcmNlcHRvckNvbnN0YW50KFN5bnRoZXRpY0NvbnN0YW50VmFsdWV2YWx1ZUtpbmRzeW50aGV0aWMoU3ludGhldGljQ29uc3RhbnQob3RoZXJWYXJfZmllbGRzU29ydGVkQnlOYW1lQ29uc3RydWN0ZWRDb25zdGFudCgpKUluc3RhbnRpYXRpb25Db25zdGFudChyZWZlcmVuY2VkaXNSZWZlcmVuY2VkZWZlcnJlZF9nbG9iYWwoRGVmZXJyZWRHbG9iYWxDb25zdGFudChOb25Db25zdGFudFZhbHVlTm9uQ29uc3RhbnQ+Pm5vbi1jb25zdGFudDw8dHJlYXRBc0R5bmFtaWNpc0Z1bmN0aW9uVHlwZVZhcmlhYmxlY29udGFpbnNGcmVlVHlwZVZhcmlhYmxlc19jb250YWluc0ZyZWVUeXBlVmFyaWFibGVzZm9yRWFjaFR5cGVWYXJpYWJsZWFzc3VtcHRpb25zYmluZGluZ3NfQXNzdW1wdGlvbnNfYXNzdW1wdGlvbk1hcF9hZGRBc3N1bXB0aW9uYXNzdW1lX3JlbW92ZUFzc3VtcHRpb25mb3JnZXRpc0Fzc3VtZWRfQXNzdW1wdGlvbnMoKS0+YXJndW1lbnRIYXNoX2VxdWFsc0ludGVybmFsbmV3VW5hbGlhc2VkVHlwZVZhcmlhYmxlVHlwZUZ1bmN0aW9uVHlwZVZhcmlhYmxlX2JvdW5kQm91bmQgaGFzbid0IGJlZW4gc2V0LkJvdW5kIGhhcyBhbHJlYWR5IGJlZW4gc2V0LkludmFsaWQgcmV0dXJuIHR5cGUgaW4gSW52YWxpZCBwYXJhbWV0ZXIgdHlwZXMgaW4gSW52YWxpZCBvcHRpb25hbCBwYXJhbWV0ZXIgdHlwZXMgaW4gSW52YWxpZCBuYW1lZCBwYXJhbWV0ZXJzIGluIEludmFsaWQgbmFtZWQgcGFyYW1ldGVyIHR5cGVzIGluIEludmFsaWQgdHlwZSB2YXJpYWJsZXMgaW4gcmVzdG9yZWhhc0ZyZWVuZXdQYXJhbWV0ZXJUeXBlc25ld09wdGlvbmFsUGFyYW1ldGVyVHlwZXNuZXdOYW1lZFBhcmFtZXRlclR5cGVzbmV3VHlwZVZhcmlhYmxlc25ld0JvdW5kbmVlZHNPcHRpb25hbENvbW1hbmVlZHNOYW1lZENvbW1hRnV0dXJlT3JUeXBlbmV3VHlwZUFyZ3VtZW50QmFzZURhcnRUeXBlVmlzaXRvckFic3RyYWN0VHlwZVJlbGF0aW9uZW5zdXJlUmVzb2x2ZWRnZXRVbmFsaWFzZWRhc0luc3RhbmNlT2ZnZXRDYWxsVHlwZWludGVybmFsIGVycm9yOiB1bmtub3duIHR5cGUgaW52YWxpZFR5cGVBcmd1bWVudHNpbnZhbGlkRnVuY3Rpb25SZXR1cm5UeXBlc2ludmFsaWRGdW5jdGlvblBhcmFtZXRlclR5cGVzaW52YWxpZFR5cGVWYXJpYWJsZUJvdW5kc2ludmFsaWRDYWxsYWJsZVR5cGVjaGVja1R5cGVBcmd1bWVudHN0VHlwZUFyZ3NzVHlwZUFyZ3N0ZnNmZ2V0Q29tbW9uVHlwZVZhcmlhYmxlc0NvdW50dmlzaXRGdW5jdGlvblR5cGVJbnRlcm5hbHRwc3Nwc3NOb3RFbXB0eXROb3RFbXB0eXROZXh0c05leHRpbmNvbXBhdGlibGVQYXJhbWV0ZXJzdE5hbWVzdFR5cGVzc05hbWVzc1R5cGVzdEluZGV4c0luZGV4c2VlblR5cGVWYXJpYWJsZXNNb3JlU3BlY2lmaWNWaXNpdG9yaXNNb3JlU3BlY2lmaWNTdWJ0eXBlVmlzaXRvcnNGdXR1cmVPcnRJbnRlcmZhY2VQb3RlbnRpYWxTdWJ0eXBlVmlzaXRvcl9hc3N1bWVJbnN0YW50aWF0aW9uc2lzUG90ZW50aWFsU3VidHlwZWFzc3VtZUluc3RhbnRpYXRpb25zRGFydFR5cGVzSVNfU1VCVFlQRU1BWUJFX1NVQlRZUEVOT1RfU1VCVFlQRWNvbXB1dGVTdWJ0eXBlUmVsYXRpb25zdWJzdEJ5Q29udGV4dGdldFN1cGVydHlwZWdldEludGVyZmFjZXNjaGVja1R5cGVWYXJpYWJsZUJvdW5kc2NoZWNrVHlwZVZhcmlhYmxlQm91bmRnZXRDbGFzc0NvbnRleHRjb250ZXh0Q2xhc3Nfc3Vic3RUeXBlc19lcXVhbFR5cGVzY29tcGlsZXIuc3JjLmtlcm5lbC5kYXJ0MmpzX3RhcmdldERhcnQyanNDb25zdGFudHNCYWNrZW5kX2FsbG93ZWREYXJ0U2NoZW1lUGF0aHNqc191dGlsX3JlcXVpcmVkTGlicmFyaWVzZGFydDpfY2hyb21lZGFydDpfZm9yZWlnbl9oZWxwZXJkYXJ0Ol9qc19lbWJlZGRlZF9uYW1lc2RhcnQ6X2pzX2hlbHBlcmRhcnQ6X2pzX25hbWVzZGFydDpodG1sX2NvbW1vbmRhcnQ6aW5kZXhlZF9kYmRhcnQ6aW9kYXJ0OmpzZGFydDpqc191dGlsZGFydDp3ZWJfYXVkaW9kYXJ0OndlYl9nbGRhcnQ6d2ViX3NxbG1heWJlRW5hYmxlTmF0aXZlYWxsb3dlZFRlc3RMaWJyYXJ5dGVzdHMvY29tcGlsZXIvZGFydDJqc19uYXRpdmV0ZXN0cy9jb21waWxlci9kYXJ0MmpzX2V4dHJhZ2VuZXJhdGVkX3Rlc3RzL2RhcnQyanNfbmF0aXZlL25hdGl2ZV90ZXN0YWxsb3dlZERhcnRMaWJyYXJ5S0xpYnJhcnlsaWJyYXJ5KEtDbGFzc2NsYXNzKEtUeXBlZGVmdHlwZWRlZihLTWVtYmVyX2lzU3RhdGljX2tpbmRLRnVuY3Rpb25LQ29uc3RydWN0b3JLR2VuZXJhdGl2ZUNvbnN0cnVjdG9yS0ZhY3RvcnlDb25zdHJ1Y3RvcktNZXRob2RLR2V0dGVyS1NldHRlcktGaWVsZEtUeXBlVmFyaWFibGV0eXBlX3ZhcmlhYmxlKGV4ZWN1dGFibGVDb250ZXh0bG9jYWxfZnVuY3Rpb25LTG9jYWxUeXBlVmFyaWFibGVsb2NhbF90eXBlX3ZhcmlhYmxlKGtFbGVtZW50UHJlZml4azphYnN0cmFjdF9zaW5rLmRhcnRhYnN0cmFjdF9zb3VyY2UuZGFydGJpbmFyeV9zaW5rLmRhcnRiaW5hcnlfc291cmNlLmRhcnRoZWxwZXJzLmRhcnRtZW1iZXJfZGF0YS5kYXJ0bWl4aW5zLmRhcnRub2RlX2luZGV4ZXIuZGFydG9iamVjdF9zaW5rLmRhcnRvYmplY3Rfc291cmNlLmRhcnREYXRhU2lua3dyaXRlU3RyaW5nT3JOdWxsd3JpdGVVcml3cml0ZU1lbWJlck5vZGV3cml0ZU1lbWJlck5vZGVzd3JpdGVNZW1iZXJOb2RlTWFwd3JpdGVMaWJyYXJ5RGVwZW5kZW5jeU5vZGV3cml0ZUxpYnJhcnlEZXBlbmRlbmN5Tm9kZU9yTnVsbHdyaXRlVHJlZU5vZGV3cml0ZVR5cGVQYXJhbWV0ZXJOb2Rld3JpdGVUeXBlUGFyYW1ldGVyTm9kZXN3cml0ZURhcnRUeXBlc3dyaXRlRGFydFR5cGVOb2Rld3JpdGVEYXJ0VHlwZU5vZGVzd3JpdGVTb3VyY2VTcGFud3JpdGVDbGFzc3dyaXRlVHlwZWRlZndyaXRlTG9jYWx3cml0ZUxvY2FsT3JOdWxsd3JpdGVMb2NhbHN3cml0ZUNvbnN0YW50T3JOdWxsd3JpdGVDb25zdGFudHN3cml0ZURvdWJsZVZhbHVld3JpdGVJbnRlZ2VyVmFsdWV3cml0ZUltcG9ydERhdGFTb3VyY2VyZWdpc3RlckNvbXBvbmVudExvb2t1cGNvbXBvbmVudExvb2t1cHJlZ2lzdGVyRW50aXR5TG9va3VwZW50aXR5TG9va3VwcmVnaXN0ZXJMb2NhbExvb2t1cGxvY2FsTG9va3VwZW1wdHlBc051bGxyZWFkU3RyaW5nT3JOdWxscmVhZFVyaXJlYWRMaWJyYXJ5Tm9kZXJlYWRDbGFzc05vZGVyZWFkVHlwZWRlZk5vZGVyZWFkTWVtYmVyTm9kZXJlYWRNZW1iZXJOb2Rlc3JlYWRNZW1iZXJOb2RlTWFwcmVhZExpYnJhcnlEZXBlbmRlbmN5Tm9kZXJlYWRMaWJyYXJ5RGVwZW5kZW5jeU5vZGVPck51bGxyZWFkVHJlZU5vZGVyZWFkVHlwZVBhcmFtZXRlck5vZGVyZWFkVHlwZVBhcmFtZXRlck5vZGVzcmVhZERhcnRUeXBlc3JlYWREYXJ0VHlwZU5vZGVyZWFkRGFydFR5cGVOb2Rlc3JlYWRTb3VyY2VTcGFucmVhZExvY2FscmVhZExvY2FsT3JOdWxscmVhZExvY2Fsc3JlYWRDb25zdGFudE9yTnVsbHJlYWREb3VibGVWYWx1ZXJlYWRJbnRlZ2VyVmFsdWVyZWFkQ29uc3RhbnRzcmVhZEltcG9ydEVudGl0eUxvb2t1cGdldExpYnJhcnlCeUluZGV4Z2V0Q2xhc3NCeUluZGV4Z2V0VHlwZWRlZkJ5SW5kZXhnZXRNZW1iZXJCeUluZGV4Z2V0VHlwZVZhcmlhYmxlQnlJbmRleExvY2FsTG9va3VwZ2V0TG9jYWxCeUluZGV4QWJzdHJhY3REYXRhU2lua19kYXJ0VHlwZVdyaXRlcl9kYXJ0VHlwZU5vZGVXcml0ZXJfdGFnc19tZW1iZXJEYXRhX3N0cmluZ0luZGV4X3VyaUluZGV4X21lbWJlck5vZGVJbmRleF9nZW5lcmFsQ2FjaGVzX2JlZ2luZXhpc3RpbmdUYWdVbmV4cGVjdGVkIHRhZyBlbmQuIEV4cGVjdGVkICwgZm91bmQgX3dyaXRlRGF0YUtpbmRfd3JpdGVVcmlfd3JpdGVJbnRJbnRlcm5hbF93cml0ZURhcnRUeXBlZnVuY3Rpb25UeXBlVmFyaWFibGVzTWlzc2luZyBEYXJ0VHlwZSBpcyBub3QgYWxsb3dlZC5fd3JpdGVEYXJ0VHlwZU5vZGVNaXNzaW5nIGlyLkRhcnRUeXBlIG5vZGUgaXMgbm90IGFsbG93ZWQuX3dyaXRlTWVtYmVyTm9kZV93cml0ZU1lbWJlck5vZGVJbnRlcm5hbF93cml0ZUVudW1JbnRlcm5hbF93cml0ZUNsYXNzTm9kZV93cml0ZVN0cmluZ193cml0ZUxpYnJhcnlOb2RlX3dyaXRlVHlwZWRlZk5vZGVfd3JpdGVCb29sX3dyaXRlVHJlZU5vZGVfd3JpdGVGdW5jdGlvbk5vZGVfd3JpdGVUeXBlUGFyYW1ldGVyZ2V0SW5kZXhObyBlbmNsb3NpbmcgbWVtYmVyIG9mIFRyZWVOb2RlIG1lbWJlckRhdGFnZXRJbmRleEJ5VHJlZU5vZGVObyBUcmVlTm9kZSBpbmRleCBmb3VuZCBmb3IgVW5zdXBwb3J0ZWQgRnVuY3Rpb25Ob2RlIHBhcmVudCBVbnN1cHBvcnRlZCBUeXBlUGFyYW1ldGVyIHBhcmVudCBjbGFzc0luZGV4dHlwZWRlZkluZGV4bWVtYmVySW5kZXhsb2NhbEluZGV4VW5zdXBwb3J0ZWQgbG9jYWwgX3dyaXRlQ29uc3RhbnRfd3JpdGVEb3VibGVWYWx1ZXNldEZsb2F0NjRnZXRVaW50MTZfd3JpdGVCaWdJbnRVbnN1cHBvcnRlZCBjb25zdGFudCB2YWx1ZSBraW5kIF93cml0ZVN0cmluZ0ludGVybmFsX3dyaXRlVXJpSW50ZXJuYWxfd3JpdGVJbXBvcnRfd3JpdGVJbXBvcnRJbnRlcm5hbEFic3RyYWN0RGF0YVNvdXJjZV9jb21wb25lbnRMb29rdXBfZW50aXR5TG9va3VwX2xvY2FsTG9va3VwZ2V0SW5kZXhlZExpYnJhcnlnZXRJbmRleGVkQ2xhc3NnZXRJbmRleGVkVHlwZWRlZmdldEluZGV4ZWRNZW1iZXJnZXRJbmRleGVkVHlwZVZhcmlhYmxldHlwZVZhcmlhYmxlSW5kZXhfcmVhZERhcnRUeXBlc19yZWFkRGFydFR5cGVfcmVhZERhcnRUeXBlTm9kZXNfcmVhZERhcnRUeXBlTm9kZV9jaGVja0RhdGFLaW5kX3JlYWRVcmlfcmVhZEludEludGVybmFsdHlwZVZhcmlhYmxlQ291bnRVbmV4cGVjdGVkIERhcnRUeXBlS2luZCB0eXBlUGFyYW1ldGVyQ291bnRuYW1lZFBhcmFtZXRlckNvdW50X3JlYWRNZW1iZXJEYXRhX3JlYWRNZW1iZXJEYXRhSW50ZXJuYWxfcmVhZEVudW1JbnRlcm5hbF9yZWFkQ2xhc3NEYXRhX3JlYWRTdHJpbmdsb29rdXBNZW1iZXJfcmVhZExpYnJhcnlEYXRhVW5zdXBwb3J0ZWQgX01lbWJlcktpbmQgX3JlYWRUeXBlZGVmTm9kZWxvb2t1cFR5cGVkZWZnZXRMaWJyYXJ5RGF0YUJ5VXJpX3JlYWRVcmlJbnRlcm5hbF9yZWFkQm9vbF9yZWFkU3RyaW5nSW50ZXJuYWxfcmVhZFRyZWVOb2RlX3JlYWRDb25zdGFudF9yZWFkRG91YmxlVmFsdWVzZXRVaW50MTZnZXRGbG9hdDY0X3JlYWRCaWdJbnRVbmV4cGV4dGVkIGNvbnN0YW50IHZhbHVlIGtpbmQgZnVuY3Rpb25EZWNsYXJhdGlvbl9yZWFkRnVuY3Rpb25Ob2RlX3JlYWRUeXBlUGFyYW1ldGVyZ2V0Q29uc3RhbnR0cmVlTm9kZWdldFRyZWVOb2RlQnlJbmRleE5vIFRyZWVOb2RlIGZvdW5kIGZvciBpbmRleCBfZXJyb3JDb250ZXh0VW5leHBlY3RlZCBfVHJlZU5vZGVLaW5kIGZ1bmN0aW9uRXhwcmVzc2lvblVuZXhwZWN0ZWQgX0Z1bmN0aW9uTm9kZUtpbmQgVW5leHBlY3RlZCBfVHlwZVBhcmFtZXRlcktpbmQga2luZCBleHBlY3RlZEtpbmRhY3R1YWxLaW5kSW52YWxpZCBkYXRhIGtpbmQuIFVuZXhwZWN0ZWQgbG9jYWwga2luZCBfcmVhZEltcG9ydF9yZWFkSW1wb3J0SW50ZXJuYWxfYnVmZmVyZWRTaW5rQmluYXJ5U291cmNlSW1wbF9yZWFkQnl0ZUludmFsaWQgZGF0YSBraW5kIGluZGV4LiBFeHBlY3RlZCBvbmUgb2YgLCBmb3VuZCBpbmRleCAgT2Zmc2V0IERhdGFLaW5kRGF0YUtpbmQuYm9vbHVpbnQzMERhdGFLaW5kLnVpbnQzMERhdGFLaW5kLnN0cmluZ2VudW1WYWx1ZURhdGFLaW5kLmVudW1WYWx1ZURhdGFLaW5kLnVyaURhdGFLaW5kLmxpYnJhcnlOb2RlRGF0YUtpbmQuY2xhc3NOb2RlRGF0YUtpbmQudHlwZWRlZk5vZGVtZW1iZXJOb2RlRGF0YUtpbmQubWVtYmVyTm9kZURhdGFLaW5kLnRyZWVOb2RldHlwZVBhcmFtZXRlck5vZGVEYXRhS2luZC50eXBlUGFyYW1ldGVyTm9kZURhdGFLaW5kLmRhcnRUeXBlZGFydFR5cGVOb2RlRGF0YUtpbmQuZGFydFR5cGVOb2RlRGF0YUtpbmQuc291cmNlU3BhbkRhdGFLaW5kLmNvbnN0YW50RGF0YUtpbmQuaW1wb3J0RGF0YUtpbmQuZG91YmxlRGF0YUtpbmQuaW50TWVtYmVyQ29udGV4dEtpbmRNZW1iZXJDb250ZXh0S2luZC5saWJyYXJ5TWVtYmVyQ29udGV4dEtpbmQuY2xzTG9jYWxLaW5kakxvY2FsTG9jYWxLaW5kLmpMb2NhbExvY2FsS2luZC50aGlzTG9jYWxib3hMb2NhbExvY2FsS2luZC5ib3hMb2NhbGFub255bW91c0Nsb3N1cmVMb2NhbExvY2FsS2luZC5hbm9ueW1vdXNDbG9zdXJlTG9jYWx0eXBlVmFyaWFibGVMb2NhbExvY2FsS2luZC50eXBlVmFyaWFibGVMb2NhbF9UcmVlTm9kZUtpbmRfVHJlZU5vZGVLaW5kLmNsc19UcmVlTm9kZUtpbmQubWVtYmVyX1RyZWVOb2RlS2luZC5ub2RlX1RyZWVOb2RlS2luZC5mdW5jdGlvbk5vZGVfVHJlZU5vZGVLaW5kLnR5cGVQYXJhbWV0ZXJmdW5jdGlvbkRlY2xhcmF0aW9uVmFyaWFibGVfVHJlZU5vZGVLaW5kLmZ1bmN0aW9uRGVjbGFyYXRpb25WYXJpYWJsZV9UcmVlTm9kZUtpbmQuY29uc3RhbnRfRnVuY3Rpb25Ob2RlS2luZF9GdW5jdGlvbk5vZGVLaW5kLnByb2NlZHVyZV9GdW5jdGlvbk5vZGVLaW5kLmNvbnN0cnVjdG9yX0Z1bmN0aW9uTm9kZUtpbmQuZnVuY3Rpb25FeHByZXNzaW9uX0Z1bmN0aW9uTm9kZUtpbmQuZnVuY3Rpb25EZWNsYXJhdGlvbl9UeXBlUGFyYW1ldGVyS2luZF9UeXBlUGFyYW1ldGVyS2luZC5jbHNfVHlwZVBhcmFtZXRlcktpbmQuZnVuY3Rpb25Ob2RlVGFnKERhcnRUeXBlS2luZERhcnRUeXBlS2luZC5ub25ldm9pZFR5cGVEYXJ0VHlwZUtpbmQudm9pZFR5cGVEYXJ0VHlwZUtpbmQudHlwZVZhcmlhYmxlZnVuY3Rpb25UeXBlVmFyaWFibGVEYXJ0VHlwZUtpbmQuZnVuY3Rpb25UeXBlVmFyaWFibGVEYXJ0VHlwZUtpbmQuZnVuY3Rpb25UeXBlRGFydFR5cGVLaW5kLmludGVyZmFjZVR5cGVEYXJ0VHlwZUtpbmQudHlwZWRlZkRhcnRUeXBlS2luZC5keW5hbWljVHlwZWZ1dHVyZU9yRGFydFR5cGVLaW5kLmZ1dHVyZU9yRGFydFR5cGVXcml0ZXJ2aXNpdFR5cGVzRGFydFR5cGVOb2RlS2luZERhcnRUeXBlTm9kZUtpbmQubm9uZURhcnRUeXBlTm9kZUtpbmQudm9pZFR5cGV0eXBlUGFyYW1ldGVyVHlwZURhcnRUeXBlTm9kZUtpbmQudHlwZVBhcmFtZXRlclR5cGVEYXJ0VHlwZU5vZGVLaW5kLmZ1bmN0aW9uVHlwZURhcnRUeXBlTm9kZUtpbmQuZnVuY3Rpb25UeXBlVmFyaWFibGVEYXJ0VHlwZU5vZGVLaW5kLmludGVyZmFjZVR5cGVEYXJ0VHlwZU5vZGVLaW5kLnR5cGVkZWZEYXJ0VHlwZU5vZGVLaW5kLmR5bmFtaWNUeXBlRGFydFR5cGVOb2RlS2luZC5ib3R0b21UeXBlaW52YWxpZFR5cGVEYXJ0VHlwZU5vZGVLaW5kLmludmFsaWRUeXBldGhpc0ludGVyZmFjZVR5cGVEYXJ0VHlwZU5vZGVLaW5kLnRoaXNJbnRlcmZhY2VUeXBlZXhhY3RJbnRlcmZhY2VUeXBlRGFydFR5cGVOb2RlS2luZC5leGFjdEludGVyZmFjZVR5cGVkb2VzTm90Q29tcGxldGVEYXJ0VHlwZU5vZGVLaW5kLmRvZXNOb3RDb21wbGV0ZURhcnRUeXBlTm9kZVdyaXRlclVuZXhwZWN0ZWQgaXIuRGFydFR5cGUgSW5kZXhlZFNpbmtfY2FjaGV3cml0ZVZhbHVlSW5kZXhlZFNvdXJjZXJlYWRWYWx1ZUNvbXBvbmVudExvb2t1cF9jb21wb25lbnRfbGlicmFyeU1hcE5vIGxpYnJhcnkgZm91bmQgZm9yIF9MaWJyYXJ5RGF0YV90eXBlZGVmc0R1cGxpY2F0ZSBjbGFzcyAnIHRyeWluZyB0byBhZGQgRHVwbGljYXRlIHR5cGVkZWYgJ3RyeWluZyB0byBhZGQgRHVwbGljYXRlIG1lbWJlciAnX0xpYnJhcnlEYXRhKF9DbGFzc0RhdGFfQ2xhc3NEYXRhKF9NZW1iZXJEYXRhX2luZGV4VG9Ob2RlTWFwX25vZGVUb0luZGV4TWFwX2Vuc3VyZU1hcHNObyBpbmRleCBmb3VuZCBmb3IgX01lbWJlckRhdGEoRGF0YVNvdXJjZU1peGluaGFzVmFsdWVoYXNDbGFzc0RhdGFTaW5rTWl4aW5fVHJlZU5vZGVJbmRleGVyVmlzaXRvcl9jdXJyZW50SW5kZXhyZWdpc3Rlck5vZGVfQ29uc3RhbnROb2RlSW5kZXhlclZpc2l0b3JyZWdpc3RlckNvbnN0YW50Q29uc3RhbnQgd2l0aG91dCBpbmRleDogSW5kZXggd2l0aG91dCBjb25zdGFudDogVW5leHBlY3RlZCBjb25zdGFudDogT2JqZWN0U2lua2JlZ2luOk9iamVjdFNvdXJjZV9yZWFkIHZhbHVlLCBmb3VuZCBleHBlY3RlZFRhZ2FjdHVhbFRhZ1VuZXhwZWN0ZWQgYmVnaW4gdGFnLiBVbmV4cGVjdGVkIGVuZCB0YWcuIAo+IGZ1bmN0aW9uVHlwZU5vZGVUYWdmdW5jdGlvbi10eXBlLW5vZGVfY29tcHV0ZU1lbWJlck5hbWVkYXJ0MmpzLnVuaXZlcnNlLnVzZUlOVk9LRUR5bmFtaWNVc2VLaW5kLklOVk9LRUR5bmFtaWNVc2VLaW5kLkdFVER5bmFtaWNVc2VLaW5kLlNFVHRoaXM6ZXhhY3Q6R2VuZXJpY0R5bmFtaWNVc2VfdHlwZUFyZ3VtZW50c1R5cGUgYXJndW1lbnQgY291bnQgbWlzbWF0Y2guIFNlbGVjdG9yIGhhcyAgYnV0ICB3ZXJlIHBhc3NlZC5Db25zdHJhaW5lZER5bmFtaWNVc2VTVEFUSUNfVEVBUl9PRkZTdGF0aWNVc2VLaW5kLlNUQVRJQ19URUFSX09GRlNVUEVSX1RFQVJfT0ZGU3RhdGljVXNlS2luZC5TVVBFUl9URUFSX09GRlNVUEVSX0ZJRUxEX1NFVFN0YXRpY1VzZUtpbmQuU1VQRVJfRklFTERfU0VURklFTERfR0VUU3RhdGljVXNlS2luZC5GSUVMRF9HRVRGSUVMRF9TRVRTdGF0aWNVc2VLaW5kLkZJRUxEX1NFVENMT1NVUkVTdGF0aWNVc2VLaW5kLkNMT1NVUkVDTE9TVVJFX0NBTExTdGF0aWNVc2VLaW5kLkNMT1NVUkVfQ0FMTENBTExfTUVUSE9EU3RhdGljVXNlS2luZC5DQUxMX01FVEhPRENPTlNUUlVDVE9SX0lOVk9LRVN0YXRpY1VzZUtpbmQuQ09OU1RSVUNUT1JfSU5WT0tFQ09OU1RfQ09OU1RSVUNUT1JfSU5WT0tFU3RhdGljVXNlS2luZC5DT05TVF9DT05TVFJVQ1RPUl9JTlZPS0VSRURJUkVDVElPTlN0YXRpY1VzZUtpbmQuUkVESVJFQ1RJT05ESVJFQ1RfSU5WT0tFU3RhdGljVXNlS2luZC5ESVJFQ1RfSU5WT0tFSU5MSU5JTkdTdGF0aWNVc2VLaW5kLklOTElOSU5HU3RhdGljVXNlS2luZC5JTlZPS0VTdGF0aWNVc2VLaW5kLkdFVFN0YXRpY1VzZUtpbmQuU0VURklFTERfSU5JVFN0YXRpY1VzZUtpbmQuRklFTERfSU5JVEZJRUxEX0NPTlNUQU5UX0lOSVRTdGF0aWNVc2VLaW5kLkZJRUxEX0NPTlNUQU5UX0lOSVR0eXBlQXJndW1lbnRzSGFzaGluaXQ6ZGVmOnN0YXRpY0ludm9rZVN0YXRpYyBpbnZva2UgZWxlbWVudCAgbXVzdCBiZSBhIHRvcC1sZXZlbCBvciBzdGF0aWMgbWV0aG9kLk5vdCBDYWxsU3RydWN0dXJlIGZvciBzdGF0aWMgaW52b2NhdGlvbiBvZiBlbGVtZW50IHN0YXRpY1RlYXJPZmZTdGF0aWMgdGVhci1vZmYgZWxlbWVudCBzdGF0aWNHZXRTdGF0aWMgZ2V0IGVsZW1lbnQgIG11c3QgYmUgYSBmaWVsZCBvciBhIGdldHRlci5zdGF0aWNTZXRTdGF0aWMgc2V0IGVsZW1lbnQgbXVzdCBiZSBhIHRvcC1sZXZlbCBvciBzdGF0aWMgbWV0aG9kLiBtdXN0IGJlIGEgZmllbGQgb3IgYSBzZXR0ZXIuc3RhdGljSW5pdFN0YXRpYyBpbml0IGVsZW1lbnQgIG11c3QgYmUgYSBmaWVsZC5zdXBlckludm9rZVN1cGVyIGludm9rZSBlbGVtZW50ICBtdXN0IGJlIGFuIGluc3RhbmNlIG1ldGhvZC5Ob3QgQ2FsbFN0cnVjdHVyZSBmb3Igc3VwZXIgaW52b2NhdGlvbiBvZiBlbGVtZW50IHN1cGVyR2V0U3VwZXIgZ2V0IGVsZW1lbnQgc3VwZXJGaWVsZFNldFN1cGVyIHNldCBlbGVtZW50IHN1cGVyU2V0dGVyU2V0IG11c3QgYmUgYSBzZXR0ZXIuc3VwZXJUZWFyT2Zmc3VwZXJDb25zdHJ1Y3Rvckludm9rZUNvbnN0cnVjdG9yIGludm9rZSBlbGVtZW50ICBtdXN0IGJlIGEgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3Rvci5Ob3QgQ2FsbFN0cnVjdHVyZSBmb3Igc3VwZXIgY29uc3RydWN0b3IgaW52b2NhdGlvbiBvZiBlbGVtZW50IGNvbnN0cnVjdG9yQm9keUludm9rZU5vdCBDYWxsU3RydWN0dXJlIGZvciBjb25zdHJ1Y3RvciBib2R5IGludm9jYXRpb24gb2YgZWxlbWVudCBnZW5lcmF0b3JCb2R5SW52b2tlZGlyZWN0SW52b2tlRGlyZWN0IGludm9rZSBlbGVtZW50ICBtdXN0IGJlIGFuIGluc3RhbmNlIG1lbWJlci4gbXVzdCBiZSBhIG1ldGhvZC5kaXJlY3RHZXREaXJlY3QgZ2V0IGVsZW1lbnQgZGlyZWN0U2V0RGlyZWN0IHNldCBlbGVtZW50IGNvbnN0cnVjdG9ySW52b2tlQ29uc3RydWN0b3IgaW52b2NhdGlvbiBlbGVtZW50ICBtdXN0IGJlIGEgY29uc3RydWN0b3IuTm90IENhbGxTdHJ1Y3R1cmUgZm9yIGNvbnN0cnVjdG9yIGludm9jYXRpb24gb2YgZWxlbWVudCB0eXBlZENvbnN0cnVjdG9ySW52b2tlTm8gdHlwZSBwcm92aWRlZCBmb3IgY29uc3RydWN0b3IgaW52b2NhdGlvbi5UeXBlZCBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIGVsZW1lbnQgbXVzdCBiZSBhIGNvbnN0cnVjdG9yLmNvbnN0Q29uc3RydWN0b3JJbnZva2VDb25zdCBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIGVsZW1lbnQgY29uc3RydWN0b3JSZWRpcmVjdE5vIHR5cGUgcHJvdmlkZWQgZm9yIGNvbnN0cnVjdG9yIHJlZGlyZWN0aW9uLkNvbnN0cnVjdG9yIHJlZGlyZWN0aW9uIGVsZW1lbnQgZmllbGRJbml0RmllbGQgaW5pdCBlbGVtZW50ICBtdXN0IGJlIGFuIGluc3RhbmNlIGZpZWxkLmZpZWxkQ29uc3RhbnRJbml0ZmllbGRHZXQgbXVzdCBiZSBhbiBpbnN0YW5jZSBvciBib3hlZCBmaWVsZC5maWVsZFNldGNsb3N1cmVDYWxsaW1wbGljaXRJbnZva2Vjb25zdHJ1Y3RvcklubGluaW5nbWV0aG9kSW5saW5pbmdTdGF0aWNVc2UoR2VuZXJpY1N0YXRpY1VzZVR5cGUgYXJndW1lbnQgY291bnQgbWlzbWF0Y2guIENhbGwgc3RydWN0dXJlIGhhcyBJU19DSEVDS1R5cGVVc2VLaW5kLklTX0NIRUNLQVNfQ0FTVFR5cGVVc2VLaW5kLkFTX0NBU1RDQVRDSF9UWVBFVHlwZVVzZUtpbmQuQ0FUQ0hfVFlQRVR5cGVVc2VLaW5kLlRZUEVfTElURVJBTFR5cGVVc2VLaW5kLklOU1RBTlRJQVRJT05OQVRJVkVfSU5TVEFOVElBVElPTlR5cGVVc2VLaW5kLk5BVElWRV9JTlNUQU5USUFUSU9OQ09OU1RfSU5TVEFOVElBVElPTlR5cGVVc2VLaW5kLkNPTlNUX0lOU1RBTlRJQVRJT05JTVBMSUNJVF9DQVNUVHlwZVVzZUtpbmQuSU1QTElDSVRfQ0FTVFBBUkFNRVRFUl9DSEVDS1R5cGVVc2VLaW5kLlBBUkFNRVRFUl9DSEVDS1JUSV9WQUxVRVR5cGVVc2VLaW5kLlJUSV9WQUxVRVRZUEVfQVJHVU1FTlRUeXBlVXNlS2luZC5UWVBFX0FSR1VNRU5UaXM6YXM6Y2F0Y2g6bGl0Omluc3Q6Y29uc3Q6bmF0aXZlOmltcGw6cGFyYW06cnRpOnR5cGVBcmc6YXNDYXN0cGFyYW1ldGVyQ2hlY2tpbXBsaWNpdENhc3RjYXRjaFR5cGV0eXBlTGl0ZXJhbGluc3RhbnRpYXRpb25jb25zdEluc3RhbnRpYXRpb25uYXRpdmVJbnN0YW50aWF0aW9uY29uc3RUeXBlTGl0ZXJhbGluc3RhbmNlQ29uc3RydWN0b3JUeXBlVXNlKGN1c3RvbUVsZW1lbnRzQ29uc3RhbnRVc2UoZGFydDJqc19pbmZvLmluZm9JbmZvQmFzaWNJbmZvQ29kZUluZm9BbGxJbmZvbWlub3JWZXJzaW9udmlzaXRBbGxQcm9ncmFtSW5mb3Zpc2l0UHJvZ3JhbU91dHB1dFVuaXRJbmZvdmlzaXRPdXRwdXRDbGFzc0luZm9Db2RlU3BhbkNvbnN0YW50SW5mb19GaWVsZEluZm8mQmFzaWNJbmZvJkNvZGVJbmZvVHlwZWRlZkluZm9fRnVuY3Rpb25JbmZvJkJhc2ljSW5mbyZDb2RlSW5mb0Z1bmN0aW9uSW5mb1RPUF9MRVZFTF9GVU5DVElPTl9LSU5EQ0xPU1VSRV9GVU5DVElPTl9LSU5ETUVUSE9EX0ZVTkNUSU9OX0tJTkRDT05TVFJVQ1RPUl9GVU5DVElPTl9LSU5EQ2xvc3VyZUluZm92aXNpdENsb3N1cmVQYXJhbWV0ZXJJbmZvRnVuY3Rpb25Nb2RpZmllcnNJbmZvS2luZEluZm9LaW5kLmxpYnJhcnlJbmZvS2luZC5jbGF6ekluZm9LaW5kLmZ1bmN0aW9uSW5mb0tpbmQuZmllbGRJbmZvS2luZC5jb25zdGFudEluZm9LaW5kLm91dHB1dFVuaXRJbmZvS2luZC50eXBlZGVmSW5mb0tpbmQuY2xvc3VyZUluZm9WaXNpdG9yUmVjdXJzaXZlSW5mb1Zpc2l0b3JraW5kVG9TdHJpbmdraW5kRnJvbVN0cmluZ0pzb25Ub0FsbEluZm9Db252ZXJ0ZXJwYXJzZUxpYnJhcnlwYXJzZUNsYXNzcGFyc2VGdW5jdGlvbnBhcnNlQ2xvc3VyZXBhcnNlRmllbGRwYXJzZVR5cGVkZWZwYXJzZUNvbnN0YW50aG9sZGluZ3NyY3BhcnNlT3V0cHV0VW5pdHBhcnNlUHJvZ3JhbWRlZmVycmVkRmlsZXNNYXBpbXBvcnRNYXBwYXJzZUlkcGFyc2VDb2RlcHJvZ3JhbUluZm9fcGFyc2VEdXJhdGlvbm1pY3Jvc2Vjb25kc2hvdXJzbWludXRlc3NlY29uZHNJbk1pbGxpc21pbnV0ZXNJbk1pbGxpc2hvdXJzSW5NaWxsaXN0b3RhbE1pbGxpc3BhcnNlUGFyYW1ldGVycGFyc2VNb2RpZmllcnNzZXJpYWxpemVkSWRmdW5jdGlvbi9jbG9zdXJlL2xpYnJhcnkvY2xhc3MvZmllbGQvY29uc3RhbnQvdHlwZWRlZi9vdXRwdXRVbml0L2pzb25Db2RlQWxsSW5mb1RvSnNvbkNvbnZlcnRlcmlkc3VzZWRJZHNpZEZvcnVzZUxpYnJhcnlVcmlmb3JJZF92aXNpdExpc3RfdmlzaXRBbGxJbmZvRWxlbWVudHNqc29uTGlicmFyaWVzanNvbkNsYXNzZXNqc29uRnVuY3Rpb25zanNvblR5cGVkZWZzanNvbkZpZWxkc2pzb25Db25zdGFudHNqc29uQ2xvc3VyZXNfdmlzaXREZXBlbmRlbmN5SW5mb192aXNpdEFsbEluZm9Ib2xkaW5nX3Zpc2l0QWxsSW5mb0RlcGVuZGVuY2llc2pzb25Ib2xkaW5nanNvbkRlcGVuZGVuY2llc2R1bXBfdmVyc2lvbmR1bXBfbWlub3JfdmVyc2lvbl92aXNpdEJhc2ljSW5mb19zZXJpYWxpemVDb2RlX3Zpc2l0RnVuY3Rpb25Nb2RpZmllcnNtb2RzX3Zpc2l0UGFyYW1ldGVySW5mb0FsbEluZm9Kc29uQ29kZWNJZF90b1NvcnRlZFNlcmlhbGl6ZWRJZHNnZXRJZHdyaXRlRGF0ZWRhdGV0b0lzbzg2MDFTdHJpbmd3cml0ZUR1cmF0aW9ud3JpdGVJbmZvV2l0aEtpbmR3cml0ZURlcGVuZGVuY2llc193cml0ZURlcGVuZGVuY3lJbmZvX3dyaXRlT3V0cHV0T3JOdWxsX3Zpc2l0Q29kZVNwYW5fd3JpdGVDb25zdGFudE9yTnVsbEJpbmFyeVJlYWRlcnJlYWREYXRlcmVhZER1cmF0aW9ucmVhZEluZm9XaXRoS2luZHJlYWRGdW5jdGlvbnJlYWRPdXRwdXRyZWFkQ2xvc3VyZXdhcm5pbmc6IGRhdGEgd2FzIGVuY29kZWQgd2l0aCBmb3JtYXQgdmVyc2lvbiAsIGJ1dCBkZWNvZGVkIHdpdGggcmVhZERlcGVuZGVuY2llc19yZWFkRGVwZW5kZW5jeUluZm9kZXBlbmRlbmNpZXNUb3RhbHJlYWRQcm9ncmFtX3JlYWRCYXNpY0luZm9fcmVhZE91dHB1dE9yTnVsbF9yZWFkQ29kZVNwYW5fcmVhZENvbnN0YW50T3JOdWxsaGFzT3V0cHV0X3JlYWRGdW5jdGlvbk1vZGlmaWVyc19yZWFkUGFyYW1ldGVySW5mb19zdGF0aWNNYXNrX2NvbnN0TWFza19mYWN0b3J5TWFza19leHRlcm5hbE1hc2tEYXJ0MkpTSmF2YVNjcmlwdFByaW50aW5nQ29udGV4dG1vbml0b3JvdXRCdWZmZXJjb2RlUG9zaXRpb25MaXN0ZW5lcm9uU3RhcnRQb3NpdGlvbmNsb3NpbmdQb3NpdGlvbm9uUG9zaXRpb25zQXN0Q29udGFpbmVyY29udGFpbmVkTm9kZXNUb2tlbkZpbmFsaXplcmZpbmFsaXplVG9rZW5zVG9rZW5Db3VudGVydmlzaXROb2RlbWFya1NlZW5jb3VudFRva2Vuc1JlZmVyZW5jZUNvdW50ZWRBc3ROb2RlVW5wYXJzZWROb2RlX2VuYWJsZU1pbmlmaWNhdGlvbl9wcm90ZWN0Rm9yRXZhbF9jYWNoZWRMaXRlcmFsbGl0ZXJhbEV4cHJlc3Npb25mdW5jdGlvbiBwcmV0dHlQcmludGFsbG93VmFyaWFibGVNaW5pZmljYXRpb25yZW5hbWVyRm9yTmFtZXNzaG91bGRDb21wcmVzc091dHB1dG1pbmlmeUxvY2FsVmFyaWFibGVzY3JlYXRlQ29kZUJ1ZmZlcnNvdXJjZUluZm9ybWF0aW9uUHJvY2Vzc29yY3JlYXRlUHJvY2Vzc29ycHJvY2Vzc2lzSWRlbnRpdHlUZW1wbGF0ZWlzTnVsbEd1YXJkT25GaXJzdEFyZ3VtZW50YWNjZXNzaG9sZW5hbWVPclBvc2l0aW9uSkZpZWxkX2NsYXNzRGF0YV9zdGF0aWNGaWVsZERhdGFrZXJuZWxTdHJhdGVneWdldENsYXNzTm9kZWZpZWxkRWxlbWVudGdldENvbnN0YW50VmFsdWVyZXF1aXJlQ29uc3RhbnRpbXBsaWNpdE51bGxjb25zdHJ1Y3RvckVsZW1lbnRpbml0aWFsaXplclZhbHVlY29uc3RhbnRWYWx1ZWNvbXBsZXhpdHlnZXRBbGxvY2F0b3JEYXRhRm9yVGVzdGluZ2dldFN0YXRpY0ZpZWxkRGF0YUZvclRlc3RpbmdDbGFzc0RhdGFTdGF0aWNGaWVsZERhdGFoYXNEZXBlbmRlbmNpZXNBbGxvY2F0b3JEYXRhQWxsb2NhdG9yRGF0YShpbml0aWFsVmFsdWU9aW5pdGlhbGl6ZXJzPUluaXRpYWxpemVyS2luZEluaXRpYWxpemVyS2luZC5kaXJlY3RJbml0aWFsaXplcktpbmQucG9zaXRpb25hbEluaXRpYWxpemVyS2luZC5uYW1lZGNvbXBsZXhJbml0aWFsaXplcktpbmQuY29tcGxleFVuZXhwZWN0ZWQga2luZCBmaWVsZC1hbmFseXNpc19maWVsZERhdGFjYW5CZUVsaWRlZGhhc05vRWxpc2lvbmNsYXNzRGF0YWtGaWVsZGpGaWVsZHRvQmFja2VuZE1lbWJlcmlzVG9vQ29tcGxleGluY2x1ZGVJbml0aWFsVmFsdWVpbml0aWFsQ29uc3RhbnRzaW5BbGxDb25zdHJ1Y3RvcnNjb25zdHJ1Y3RvclVzYWdlaW52b2tlZFBhcmFtZXRlcnN0b0JhY2tlbmRDb25zdGFudGlzRWZmZWN0aXZlbHlDb25zdGFudGlzSW5pdGlhbGl6ZWRJbkFsbG9jYXRvcmlzRWZmZWN0aXZlbHlGaW5hbGluZGVwZW5kZW50RmllbGRzZGVwZW5kZW50RmllbGRzc3RhdGljRmllbGREYXRhcHJvY2Vzc2VkRmllbGRzY3VycmVudEZpZWxkc2VhZ2VyQ3JlYXRpb25JbmRleHByb2Nlc3NGaWVsZGlzRWFnZXJlYWdlckZpZWxkRGVwZW5kZW5jaWVzY3JlYXRpb25JbmRleG90aGVyRmllbGRvdGhlckRhdGFlYWdlckZpZWxkRGVwZW5kZW5jaWVzRm9yVGVzdGluZ2FMb2NhdGlvbmJMb2NhdGlvbkZpZWxkQW5hbHlzaXNEYXRhZmllbGQtYW5hbHlzaXMtZGF0YWZyb21EYXRhU291cmNlRmllbGRBbmFseXNpc0RhdGEoaW5pdGlhbFZhbHVlPWlzSW5pdGlhbGl6ZWRJbkFsbG9jYXRvcj1pc0VmZmVjdGl2ZWx5RmluYWw9LGlzRWxpZGVkPWlzRWFnZXI9LGVhZ2VyQ3JlYXRpb25JbmRleD1lYWdlckZpZWxkRGVwZW5kZW5jaWVzPUJpbmFyeU91dHB1dFNpbmtBZGFwdGVyZGFydDJqcy5qcy5lbnF1ZXVlQ29kZWdlbkVucXVldWVyX3Byb2Nlc3NlZEVudGl0aWVzY29kZWdlbiBlbnF1ZXVlckNvZGVnZW4gd29yayBsaXN0IGlzIGNsb3NlZC4gVHJ5aW5nIHRvIGFkZCBNYXRoSlNpZ25hdHVyZU1ldGhvZE1lbWJlclVzZWRDYWxsYmFja0NsYXNzVXNlZENhbGxiYWNrQWJzdHJhY3RVc2FnZV9wZW5kaW5nVXNlX29yaWdpbmFsVXNlbWludXNoYXNTYW1lVXNhZ2VNZW1iZXJVc2FnZXBlbmRpbmdVc2VoYXNJbml0ZnVsbHlVc2VGaWVsZFVzYWdlX2luaXRpYWxDb25zdGFudHNGaWVsZFVzYWdlKCxoYXNJbml0PSxoYXNSZWFkPWhhc1dyaXRlPSxwZW5kaW5nVXNlPWluaXRpYWxDb25zdGFudHM9RmluYWxGaWVsZFVzYWdlRmluYWxGaWVsZFVzYWdlKGhhc1JlYWQ9RnVuY3Rpb25Vc2FnZVBhcmFtZXRlclRyYWNraW5nRnVuY3Rpb25Vc2FnZV9wYXJhbWV0ZXJVc2FnZWlzRnVsbHlVc2VkYWxyZWFkeUhhc0ludm9rZWhhc1BhcnRpYWxDaGFuZ2VHZXR0ZXJVc2FnZVNldHRlclVzYWdlQ29uc3RydWN0b3JVc2FnZVBhcmFtZXRlclRyYWNraW5nQ29uc3RydWN0b3JVc2FnZU1lbWJlclVzZU5PUk1BTE1lbWJlclVzZS5OT1JNQUxDTE9TVVJJWkVfSU5TVEFOQ0VNZW1iZXJVc2UuQ0xPU1VSSVpFX0lOU1RBTkNFQ0xPU1VSSVpFX1NUQVRJQ01lbWJlclVzZS5DTE9TVVJJWkVfU1RBVElDUEFSVElBTF9VU0VNZW1iZXJVc2UuUEFSVElBTF9VU0VNZW1iZXJVc2VzTk9ORU5PUk1BTF9PTkxZQ0xPU1VSSVpFX0lOU1RBTkNFX09OTFlDTE9TVVJJWkVfU1RBVElDX09OTFlBTExfSU5TVEFOQ0VBTExfU1RBVElDUEFSVElBTF9VU0VfT05MWUNsYXNzVXNhZ2VDbGFzc1VzZUlOU1RBTlRJQVRFRENsYXNzVXNlLklOU1RBTlRJQVRFRElNUExFTUVOVEVEQ2xhc3NVc2UuSU1QTEVNRU5URURDbGFzc1VzZXNJTlNUQU5USUFURURfT05MWUlNUExFTUVOVEVEX09OTFlTdGF0aWNNZW1iZXJVc2FnZWhhc05vcm1hbFVzZWhhc0Nsb3N1cml6YXRpb25HZW5lcmFsU3RhdGljTWVtYmVyVXNhZ2VTdGF0aWNGdW5jdGlvblVzYWdlUGFyYW1ldGVyVXNhZ2VfcGFyYW1ldGVyU3RydWN0dXJlX2hhc0ludm9rZV9wcm92aWRlZFBvc2l0aW9uYWxQYXJhbWV0ZXJzX2FyZUFsbFR5cGVQYXJhbWV0ZXJzUHJvdmlkZWRfdW5wcm92aWRlZE5hbWVkUGFyYW1ldGVyc3Byb3ZpZGVkUG9zaXRpb25hbFBhcmFtZXRlcnNhcmVBbGxUeXBlUGFyYW1ldGVyc1Byb3ZpZGVkdW5wcm92aWRlZE5hbWVkUGFyYW1ldGVyc25ld1Byb3ZpZGVkUG9zaXRpb25hbFBhcmFtZXRlcnNfcHJvdmlkZWROYW1lZFBhcmFtZXRlcnNDb3VudGRhcnQyanMudXRpbC5lbnVtc2V0RW51bVNldGZyb21WYWx1ZWZpeGVkZnJvbVZhbHVlc2JpdExlbmd0aDFfRW51bVNldF9Db25zdEVudW1TZXRFbnVtU2V0LnZhbHVlPUVudW1TZXQuYWRkRW51bVNldC5hZGRBbGxFbnVtU2V0LmNsZWFyRW51bVNldC5yZW1vdmVFbnVtU2V0LnJlbW92ZUFsbF9FbnVtU2V0SXRlcmFibGVfZW51bVNldF92YWx1ZXNfRW51bVNldEl0ZXJhdG9yX21hc2tkYXJ0MmpzLmJhY2tlbmRfYXBpUmVzb2x1dGlvbkltcGFjdGpzX2JhY2tlbmQuYmFja2VuZC5hbm5vdGF0aW9uc1ByYWdtYUFubm90YXRpb25mb3JGdW5jdGlvbnNPbmx5Zm9yRmllbGRzT25seWludGVybmFsT25seW5vSW5saW5ldHJ5SW5saW5lZGlzYWJsZUZpbmFsbm9FbGlzaW9ubm9UaHJvd3Nub1NpZGVFZmZlY3RzYXNzdW1lRHluYW1pY0Fubm90YXRpb25zRGF0YWhhc0Fzc3VtZUR5bmFtaWNoYXNOb0lubGluZWhhc1RyeUlubGluZWhhc0Rpc2FibGVGaW5hbGhhc05vVGhyb3dzaGFzTm9TaWRlRWZmZWN0c0Fubm90YXRpb25zRGF0YUltcGxhbm5vdGF0aW9ucy1kYXRhcHJhZ21hQW5ub3RhdGlvbnNfaGFzUHJhZ21hQW5ub3RhdGlvbnNEYXRhQnVpbGRlcmNvbXB1dGVQcmFnbWFBbm5vdGF0aW9uRGF0YWRhcnQyanM6b3B0aW9uc1ZhbHVlaGFzT3B0aW9uc3Byb2Nlc3NNZW1iZXJBbm5vdGF0aW9uc3BsYXRmb3JtQW5ub3RhdGlvbnNBbGxvd2VkQHByYWdtYSgnJykgYW5ub3RhdGlvbiBkb2VzIG5vdCB0YWtlIG9wdGlvbnMnKSBhbm5vdGF0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBtZXRob2RzIGFuZCBjb25zdHJ1Y3RvcnMuZm9yIGZpZWxkcy5VbnJlY29nbml6ZWQgZGFydDJqcyBwcmFnbWEgQHByYWdtYSgnVW5rbm93biBkYXJ0MmpzIHByYWdtYSBAcHJhZ21hKCdAcHJhZ21hKCdkYXJ0MmpzOnRyeUlubGluZScpIG11c3Qgbm90IGJlIHVzZWQgd2l0aCBAcHJhZ21hKCdkYXJ0MmpzOm5vSW5saW5lJykuQHByYWdtYSgnZGFydDJqczpub1Rocm93cycpIHNob3VsZCBhbHdheXMgYmUgY29tYmluZWQgd2l0aCBAcHJhZ21hKCdkYXJ0MmpzOm5vU2lkZUVmZmVjdHMnKSBzaG91bGQgYWx3YXlzIGJlIGNvbWJpbmVkIHdpdGggbmVlZFRvSW5pdGlhbGl6ZUlzb2xhdGVBZmZpbml0eVRhZ25lZWRUb0luaXRpYWxpemVEaXNwYXRjaFByb3BlcnR5aXNGdW5jdGlvblVzZWRCeUJhY2tlbmRpc0ZpZWxkVXNlZEJ5QmFja2VuZGhlbHBlckNsYXNzZXNVc2VkcnVudGltZVR5cGVVc2VzcmVnaXN0ZXJCYWNrZW5kRnVuY3Rpb25Vc2VyZWdpc3RlckJhY2tlbmRDbGFzc1VzZXJlZ2lzdGVyR2xvYmFsRnVuY3Rpb25EZXBlbmRlbmN5cmVnaXN0ZXJHbG9iYWxDbGFzc0RlcGVuZGVuY3lwcm9jZXNzQmFja2VuZEltcGFjdGJhY2tlbmRJbXBhY3RyZWdpc3RlclVzZWRNZW1iZXJyZWdpc3RlclJ1bnRpbWVUeXBlVXNlcnVudGltZVR5cGVVc2VCYWNrZW5kVXNhZ2VCdWlsZGVySW1wbF9mcm9udGVuZFN0cmF0ZWd5X2dsb2JhbEZ1bmN0aW9uRGVwZW5kZW5jaWVzX2dsb2JhbENsYXNzRGVwZW5kZW5jaWVzX2hlbHBlckZ1bmN0aW9uc1VzZWRfaGVscGVyQ2xhc3Nlc1VzZWRfcnVudGltZVR5cGVVc2VzX25lZWRUb0luaXRpYWxpemVJc29sYXRlQWZmaW5pdHlUYWdfbmVlZFRvSW5pdGlhbGl6ZURpc3BhdGNoUHJvcGVydHlfaXNWYWxpZEJhY2tlbmRVc2VCYWNrZW5kIHVzZSBvZiBfaXNWYWxpZEVudGl0eV9pbnRlcm5hbC9qc19ydW50aW1lL2xpYi9fcHJvY2Vzc0JhY2tlbmRTdGF0aWNVc2VfcHJvY2Vzc0JhY2tlbmRJbnN0YW50aWF0aW9uZ2xvYmFsVXNlc2dsb2JhbENsYXNzZXNvdGhlckltcGFjdG90aGVySW1wYWN0c2ZlYXR1cmVmZWF0dXJlc2hlbHBlckZ1bmN0aW9uc1VzZWRCYWNrZW5kVXNhZ2VJbXBsYmFja2VuZC11c2FnZWFyZ3VtZW50VHlwZWpzX2JhY2tlbmQuaW50ZXJjZXB0b3JfZGF0YWlzSW50ZXJjZXB0ZWRNZXRob2RmaWVsZEhhc0ludGVyY2VwdGVkR2V0dGVyZmllbGRIYXNJbnRlcmNlcHRlZFNldHRlcmlzSW50ZXJjZXB0ZWROYW1laXNJbnRlcmNlcHRlZFNlbGVjdG9yaXNJbnRlcmNlcHRlZE1peGluU2VsZWN0b3Jpc01peGVkSW50b0ludGVyY2VwdGVkQ2xhc3NnZXRJbnRlcmNlcHRlZENsYXNzZXNPbm1heUdlbmVyYXRlSW5zdGFuY2VvZkNoZWNrYWRkSW50ZXJjZXB0b3JzYWRkSW50ZXJjZXB0b3JzRm9yTmF0aXZlQ2xhc3NNZW1iZXJzSW50ZXJjZXB0b3JEYXRhSW1wbGludGVyY2VwdG9yLWRhdGFfbmF0aXZlRGF0YWludGVyY2VwdGVkTWVtYmVyc2NsYXNzZXNNaXhlZEludG9JbnRlcmNlcHRlZENsYXNzZXNfaW50ZXJjZXB0ZWRNaXhpbkVsZW1lbnRzX2ludGVyY2VwdGVkQ2xhc3Nlc0NhY2hlX25vQ2xhc3Nlc2ludGVyY2VwdGVkTWVtYmVyc0NvdW50X2lzQ29tcGlsZVRpbWVPbmx5Q2xhc3NuYXRpdmVTdWJjbGFzc2VzbmF0aXZlU3ViY2xhc3Nlc09mTWl4aW5mb3JFYWNoU3RyaWN0U3ViY2xhc3NPZkludGVyY2VwdG9yRGF0YUJ1aWxkZXJJbXBsX2ludGVyY2VwdGVkRWxlbWVudHNfaW50ZXJjZXB0ZWRDbGFzc2VzX2NsYXNzZXNNaXhlZEludG9JbnRlcmNlcHRlZENsYXNzZXNPbmVTaG90SW50ZXJjZXB0b3JEYXRhX2ludGVyY2VwdG9yRGF0YV9vbmVTaG90SW50ZXJjZXB0b3JzX3NwZWNpYWxpemVkR2V0SW50ZXJjZXB0b3JzZ2V0T25lU2hvdEludGVyY2VwdG9yU2VsZWN0b3JvbmVTaG90SW50ZXJjZXB0b3JOYW1lc3NwZWNpYWxpemVkR2V0SW50ZXJjZXB0b3JOYW1lc2dldFNwZWNpYWxpemVkR2V0SW50ZXJjZXB0b3JzRm9ycmVnaXN0ZXJPbmVTaG90SW50ZXJjZXB0b3JuYW1lRm9yR2V0T25lU2hvdEludGVyY2VwdG9ycmVnaXN0ZXJTcGVjaWFsaXplZEdldEludGVyY2VwdG9ybmFtZUZvckdldEludGVyY2VwdG9yTm9TdWNoTWV0aG9kUmVnaXN0cnlyZWdpc3Rlck5vU3VjaE1ldGhvZG5vU3VjaE1ldGhvZEVsZW1lbnRoYXNUaHJvd2luZ05vU3VjaE1ldGhvZGhhc0NvbXBsZXhOb1N1Y2hNZXRob2ROb1N1Y2hNZXRob2RSZWdpc3RyeUltcGxkZWZhdWx0SW1wbHN0aHJvd2luZ0ltcGxzbm90QXBwbGljYWJsZUltcGxzb3RoZXJJbXBsc191bmNhdGVnb3JpemVkSW1wbHNmb3J3YXJkaW5nU3ludGF4SW1wbHNfcmVzb2x2ZXJpbnRlcm5hbFJlc29sdmVyRm9yVGVzdGluZ19jYXRlZ29yaXplSW1wbGhhc0ZvcndhcmRpbmdTeW50YXhnZXRTdXBlck5vU3VjaE1ldGhvZGhhc1Rocm93aW5nU3ludGF4aXNDb21wbGV4Tm9TdWNoTWV0aG9kRGF0YUltcGxuby1zdWNoLW1ldGhvZC1kYXRhY29tcGxleE5vUmV0dXJuSW1wbHNjb21wbGV4UmV0dXJuaW5nSW1wbHNOc21DYXRlZ29yeU5zbUNhdGVnb3J5LkRFRkFVTFRUSFJPV0lOR05zbUNhdGVnb3J5LlRIUk9XSU5HTk9UX0FQUExJQ0FCTEVOc21DYXRlZ29yeS5OT1RfQVBQTElDQUJMRU9USEVSTnNtQ2F0ZWdvcnkuT1RIRVJOb1N1Y2hNZXRob2RSZXNvbHZlcmpzX2JhY2tlbmQucnVudGltZV90eXBlc0VtaXR0ZXJPblZhcmlhYmxlQ2FsbGJhY2tTaG91bGRFbmNvZGVUeXBlZGVmQ2FsbGJhY2tUeXBlQ2hlY2tzY2xhc3NOZWVkc1R5cGVBcmd1bWVudHNtZXRob2ROZWVkc1R5cGVBcmd1bWVudHNtZXRob2ROZWVkc1NpZ25hdHVyZXNlbGVjdG9yTmVlZHNUeXBlQXJndW1lbnRzaW5zdGFudGlhdGlvbk5lZWRzVHlwZUFyZ3VtZW50c1RyaXZpYWxSdW50aW1lVHlwZXNOZWVkUnVudGltZVR5cGVzTmVlZEJ1aWxkZXJyZWdpc3RlckNsYXNzVXNpbmdUeXBlVmFyaWFibGVMaXRlcmFscmVnaXN0ZXJNZXRob2RVc2luZ1R5cGVWYXJpYWJsZUxpdGVyYWxyZWdpc3RlckxvY2FsRnVuY3Rpb25Vc2luZ1R5cGVWYXJpYWJsZUxpdGVyYWxyZWdpc3RlckdlbmVyaWNJbnN0YW50aWF0aW9uY29tcHV0ZVJ1bnRpbWVUeXBlc05lZWRUcml2aWFsUnVudGltZVR5cGVzTmVlZEJ1aWxkZXJSdW50aW1lVHlwZXNDaGVja3NyZXF1aXJlZENoZWNrc2dldFJlZmVyZW5jZWRDbGFzc2VzVHJpdmlhbFR5cGVzQ2hlY2tzX3R5cGVDaGVja3NfYWxsQ2xhc3Nlc1J1bnRpbWVUeXBlc0NoZWNrc0J1aWxkZXJyZWdpc3RlclR5cGVWYXJpYWJsZUJvdW5kc1N1YnR5cGVDaGVja2NvbXB1dGVSZXF1aXJlZENoZWNrc1RyaXZpYWxSdW50aW1lVHlwZXNDaGVja3NCdWlsZGVyX3N1YnN0aXR1dGlvbnNjbGFzc1VzZU1hcGdldENsYXNzU2V0Y2xhc3NVc2VkaXJlY3RJbnN0YW5jZWNoZWNrZWRJbnN0YW5jZWNoZWNrZWRUeXBlQXJndW1lbnRfcmVxdWlyZWRDaGVja3NfY29tcHV0ZUNoZWNrc2NvbXB1dGVDaGVja2VkQ2xhc3Nlc2ltcGxpY2l0SXNDaGVja3Njb21wdXRlQ2hlY2tlZEZ1bmN0aW9uc0NsYXNzQ29sbGVjdG9yY29sbGVjdGlzVHlwZUFyZ3VtZW50UnVudGltZVR5cGVzU3Vic3RpdHV0aW9uc01peGluX3R5cGVzX3J0aU5lZWRoYW5kbGVkZW1wdHlVc2Vjb21wdXRlQ2hlY2tzY2hlY2tzc3VwZXJDaGVja3NleHRlbmRzU3VwZXJDbGFzc1RyaXZpYWxseWlzVHJpdmlhbFN1YnN0aXR1dGlvbmNvbXB1dGVTdWJzdGl0dXRpb25uZWVkc0lzaW5oZXJpdGVkQ2xhc3Nlc3Byb2Nlc3NTdXBlcnR5cGVjaGVja2VkQ2xhc3NjaGVja2VkQ2xhc3NVc2Vpbmhlcml0c0Zyb21DaGVja2VkQ2xhc3NuZWVkc1R5cGVBcmd1bWVudHNGb3JDaGVja2VkQ2xhc3Npc0NoZWNrZWRpbXBsZW1lbnRzQ2hlY2tlZFRyaXZpYWxseWlzQ2hlY2tlZEdlbmVyaWNjaGVja0Zyb21TdXBlckNsYXNzZ2V0Q2xhc3Nlc1VzZWRJblN1YnN0aXR1dGlvbnNpbnN0YW50aWF0ZWRjbGFzc0NoZWNrc2NvbGxlY3RBbGxvcmlnaW5hbFR5cGVnZXRTdWJzdGl0dXRpb25hbHdheXNHZW5lcmF0ZUZ1bmN0aW9uVHJpdmlhbFJ1bnRpbWVUeXBlc1N1YnN0aXR1dGlvbnNSdW50aW1lVHlwZXNTdWJzdGl0dXRpb25zaGFzVHlwZUFyZ3VtZW50c1J1bnRpbWVUeXBlc0VuY29kZXJpc1NpbXBsZUZ1bmN0aW9uVHlwZWdldFNpZ25hdHVyZUVuY29kaW5ndGhpc19nZXRTdWJzdGl0dXRpb25SZXByZXNlbnRhdGlvbm9uVmFyaWFibGVnZXRTdWJzdGl0dXRpb25Db2RldGVtcGxhdGVGb3JJc0Z1bmN0aW9uVHlwZXRlbXBsYXRlRm9ySXNGdXR1cmVPclR5cGV0ZW1wbGF0ZUZvcklzVm9pZFR5cGV0ZW1wbGF0ZUZvcklzRHluYW1pY1R5cGV0ZW1wbGF0ZUZvcklzSnNJbnRlcm9wVHlwZUFyZ3VtZW50Z2V0RnVuY3Rpb25UaGF0UmV0dXJuc051bGxOYW1lc2hvdWxkRW5jb2RlVHlwZWRlZmdldFR5cGVSZXByZXNlbnRhdGlvbkZvclR5cGVDb25zdGFudF9SdW50aW1lVHlwZXNCYXNlcmVnaXN0ZXJJbXBsaWNpdENoZWNrc2NsYXNzZXNVc2luZ0NoZWNrc1J1bnRpbWVUeXBlc05lZWRJbXBscnVudGltZS10eXBlcy1uZWVkY2xhc3Nlc05lZWRpbmdUeXBlQXJndW1lbnRzbWV0aG9kc05lZWRpbmdTaWduYXR1cmVtZXRob2RzTmVlZGluZ1R5cGVBcmd1bWVudHNsb2NhbEZ1bmN0aW9uc05lZWRpbmdTaWduYXR1cmVsb2NhbEZ1bmN0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzc2VsZWN0b3JzTmVlZGluZ1R5cGVBcmd1bWVudHNpbnN0YW50aWF0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzVHlwZVZhcmlhYmxlVGVzdHNfbWV0aG9kc19hcHBsaWVkU2VsZWN0b3JNYXBfaW5zdGFudGlhdGlvbk1hcGV4cGxpY2l0SXNDaGVja3NnZW5lcmljSW5zdGFudGlhdGlvbnNmb3JSdGlOZWVkc19zZXR1cERlcGVuZGVuY2llc19wcm9wYWdhdGVUZXN0c19wcm9wYWdhdGVMaXRlcmFsc19jb2xsZWN0UmVzdWx0c2NsYXNzVGVzdHNGb3JUZXN0aW5naGFzVGVzdGRpcmVjdENsYXNzVGVzdHNGb3JUZXN0aW5naGFzRGlyZWN0VGVzdG1ldGhvZFRlc3RzRm9yVGVzdGluZ2RpcmVjdE1ldGhvZFRlc3RzRm9yVGVzdGluZ2dldFR5cGVBcmd1bWVudERlcGVuZGVuY2llc2ZvckVhY2hBcHBsaWVkU2VsZWN0b3Jmb3JFYWNoR2VuZXJpY0luc3RhbnRpYXRpb25fZ2V0Q2xhc3NOb2RlX2dldE1ldGhvZE5vZGVpbnN0YW5jZU5hbWVpc0NhbGxUYXJnZXRpc05vU3VjaE1ldGhvZHJlZ2lzdGVyRGVwZW5kZW5jaWVzcHJvY2Vzc0NoZWNrZWRUeXBlcHJvY2Vzc0VudGl0eXNlbGVjdG9yQXBwbGllc3Byb2Nlc3NUeXBlVmFyaWFibGVUeXBlbWFya1Rlc3Rwcm9jZXNzVHlwZW1hcmtJbmRpcmVjdFRlc3R0eXBlVmFyaWFibGVUeXBlbWFya0RpcmVjdExpdGVyYWxhZGRJbXBsaWNpdENoZWNrYWRkSW1wbGljaXRDaGVja3NhZGROb2RlX3Rlc3RTdGF0ZSBkaXJlY3QgdGVzdCBpbmRpcmVjdCB0ZXN0X2xpdGVyYWxTdGF0ZSBkaXJlY3QgbGl0ZXJhbCBpbmRpcmVjdCBsaXRlcmFsY2xhc3NlczptZXRob2RzOmV4cGxpY2l0IGlzLXRlc3RzOmltcGxpY2l0IGlzLXRlc3RzOlJ0aU5vZGVoYXNJbmRpcmVjdFRlc3RoYXNEaXJlY3RMaXRlcmFsaGFzSW5kaXJlY3RMaXRlcmFsaGFzTGl0ZXJhbHNldFRlc3RTdGF0ZW1hcmtEaXJlY3RUZXN0c2V0TGl0ZXJhbFN0YXRlbWFya0luZGlyZWN0TGl0ZXJhbENsYXNzTm9kZU1ldGhvZE5vZGVNZXRob2ROb2RlKGZ1bmN0aW9uPSxwYXJhbWV0ZXJTdHJ1Y3R1cmU9LGlzQ2FsbFRhcmdldD0saW5zdGFuY2VOYW1lPVJ1bnRpbWVUeXBlc05lZWRCdWlsZGVySW1wbGNsYXNzZXNVc2luZ1R5cGVWYXJpYWJsZUxpdGVyYWxzbWV0aG9kc1VzaW5nVHlwZVZhcmlhYmxlTGl0ZXJhbHNsb2NhbEZ1bmN0aW9uc1VzaW5nVHlwZVZhcmlhYmxlTGl0ZXJhbHNzZWxlY3RvcnNOZWVkaW5nVHlwZUFyZ3VtZW50c0ZvclRlc3RpbmdpbnN0YW50aWF0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzRm9yVGVzdGluZ19nZW5lcmljSW5zdGFudGlhdGlvbnN0eXBlVmFyaWFibGVUZXN0c0ZvclRlc3Rpbmd0eXBlVmFyaWFibGVUZXN0c3BvdGVudGlhbGx5TmVlZFR5cGVBcmd1bWVudHNmb3JFYWNoU3RyaWN0U3VidHlwZU9mY2hlY2tDbG9zdXJlc3BvdGVudGlhbFN1YnR5cGVPZmNoZWNrRnVuY3Rpb25UeXBlbG9jYWxGdW5jdGlvbnNUb1JlbW92ZWNsb3N1cml6ZWRNZW1iZXJzVG9SZW1vdmVwcm9jZXNzQ2hlY2tzaXRmbmVlZGVkT25BbGxuZWVkZWRPbkZ1bmN0aW9uc2NsYXNzZXNEaXJlY3RseU5lZWRpbmdSdW50aW1lVHlwZWltcGxpZWRDbGFzc2VzVW5leHBlY3RlZCB0eXBlIHJlY2VpdmVyQ2xhc3Nlc2FyZ3VtZW50Q2xhc3Nlc3JlY2VpdmVyQ2xhc3Nhcmd1bWVudENsYXNzYWxsQ2xhc3Nlc05lZWRpbmdSdW50aW1lVHlwZXN1YmNsYXNzZXNPZnN1YnR5cGVzT2ZfUnVudGltZVR5cGVzQ2hlY2tzX3R5cGVMaXRlcmFsc19SdW50aW1lVHlwZXNJbXBsJl9SdW50aW1lVHlwZXNCYXNlJlJ1bnRpbWVUeXBlc1N1YnN0aXR1dGlvbnNNaXhpblJ1bnRpbWVUeXBlc0ltcGxjaGVja2VkVHlwZUFyZ3VtZW50c2NoZWNrZWRCb3VuZHNjYWNoZWRSZXF1aXJlZENoZWNrc2NsYXNzVXNlTWFwRm9yVGVzdGluZ2NoZWNrZWRGdW5jdGlvblR5cGVzdHlwZUxpdGVyYWxzbGl2ZVR5cGVWaXNpdG9yb25DbGFzc3Rlc3RlZFR5cGVWaXNpdG9ydmlzaXRlZFN1cGVyQ2xhc3Nlc3Byb2Nlc3NNZXRob2RUeXBlQXJndW1lbnRzaXNGdW5jdGlvbkNoZWNrZWRsaXZlQ2xhc3Nlc1J1bnRpbWVUeXBlc0VuY29kZXJJbXBsX3JlcHJlc2VudGF0aW9uR2VuZXJhdG9yZ2V0VHlwZVZhcmlhYmxlTmFtZWdldFR5cGVFbmNvZGluZ2VuY29kaW5nZnVuY3Rpb24oIykgeyByZXR1cm4gIyB9Y29udGV4dE5hbWVmdW5jdGlvbiAoKSB7IHJldHVybiAjKCMsICMsICMpOyB9cXVvdGVOYW1lZnVuY3Rpb24oKSB7IHJldHVybiAjIH1nZXRKc0ludGVyb3BUeXBlQXJndW1lbnRzZ2VuZXJhdGVGdW5jdGlvblRoYXRSZXR1cm5zTnVsbGludGVybmFsR2xvYmFsZnVuY3Rpb25UaGF0UmV0dXJuc051bGx1bmlxdWVOYW1lRm9yVHlwZUNvbnN0YW50RWxlbWVudCgpLT5UeXBlUmVwcmVzZW50YXRpb25HZW5lcmF0b3J0eXBlZGVmQmluZGluZ3NlbmNvZGVUeXBlZGVmcmVwcmVzZW50YXRpb25nZXRKYXZhU2NyaXB0Q2xhc3NOYW1ldHlwZUFjY2Vzc2dldER5bmFtaWNWYWx1ZWdldFZvaWRWYWx1ZS0xZ2V0SnNJbnRlcm9wVHlwZUFyZ3VtZW50VmFsdWUtMm51bWJlcmV4cHJlc3Npb25UZW1wbGF0ZUZvcmZ1bmN0aW9uVHlwZVRhZycgaW4gI2Z1dHVyZU9yVGFnIyA9PT0gLTEjID09IG51bGwjID09PSAtMnByb3BlcnRpZXNhZGRQcm9wZXJ0eWZ1bmN0aW9uVHlwZUdlbmVyaWNCb3VuZHNUYWdmdW5jdGlvblR5cGVSZXR1cm5UeXBlVGFnZnVuY3Rpb25UeXBlUmVxdWlyZWRQYXJhbWV0ZXJzVGFnZnVuY3Rpb25UeXBlT3B0aW9uYWxQYXJhbWV0ZXJzVGFnZnVuY3Rpb25UeXBlTmFtZWRQYXJhbWV0ZXJzVGFnc2hvdWxkRW5jb2RldW5hbGlhc2VkVHlwZW9sZEJpbmRpbmdzZW5jb2RlZFR5cGVkZWZ0eXBlZGVmVGFnZnV0dXJlT3JUeXBlVGFnVHlwZUNoZWNrTWFwcGluZ2hvbGRlciA8OiBBcmd1bWVudENvbGxlY3RvckZ1bmN0aW9uQXJndW1lbnRDb2xsZWN0b3JpbkZ1bmN0aW9uVHlwZXRyaXZpYWxqc0ludGVyb3BTdWJzdGl0dXRpb24oaXNUcml2aWFsPWlzRnVuY3Rpb249LGlzSnNJbnRlcm9wPSxhcmd1bWVudHM9cGFyYW1ldGVycz1UeXBlQ2hlY2tfbmV4dEhhc2hUeXBlQ2hlY2soY2xzPSxuZWVkc0lzPSxzdWJzdGl0dXRpb249VHlwZVZpc2l0b3JTdGF0ZVR5cGVWaXNpdG9yU3RhdGUuZGlyZWN0Y292YXJpYW50VHlwZUFyZ3VtZW50VHlwZVZpc2l0b3JTdGF0ZS5jb3ZhcmlhbnRUeXBlQXJndW1lbnRjb250cmF2YXJpYW50VHlwZUFyZ3VtZW50VHlwZVZpc2l0b3JTdGF0ZS5jb250cmF2YXJpYW50VHlwZUFyZ3VtZW50VHlwZVZpc2l0b3JTdGF0ZS50eXBlTGl0ZXJhbFR5cGVWaXNpdG9yX3Zpc2l0ZWRGdW5jdGlvblR5cGVWYXJpYWJsZXNvblR5cGVWYXJpYWJsZW9uRnVuY3Rpb25UeXBlY292YXJpYW50QXJndW1lbnRVbmV4cGVjdGVkIFR5cGVWaXNpdG9yU3RhdGUgY29udHJhdmFyaWFudEFyZ3VtZW50Q2xhc3NDaGVja3NDbGFzc0NoZWNrcyhDbGFzc0Z1bmN0aW9uVHlwZWNhbGxGdW5jdGlvbnNpZ25hdHVyZUZ1bmN0aW9ucnRpVmFsdWVDbGFzc1VzZShfY29tcHV0ZUZ1bmN0aW9uVHlwZU5hdGl2ZUVtaXR0ZXJOYXRpdmVDbGFzc0ZpbmRlck5hdGl2ZUVucXVldWVyb25JbnN0YW50aWF0ZWRUeXBlcHJvY2Vzc05hdGl2ZUNsYXNzZXNyZWdpc3Rlck5hdGl2ZUJlaGF2aW9yY2F1c2VoYXNJbnN0YW50aWF0ZWROYXRpdmVDbGFzc2VzTmF0aXZlRW5xdWV1ZXJCYXNlX3JlZ2lzdGVyZWRDbGFzc2VzX3VudXNlZENsYXNzZXNfYWxsVXNlZE1lc3NhZ2VlbmFibGVMaXZlVHlwZUFuYWx5c2lzX3JlZ2lzdGVyVHlwZVVzZXNfcHJvY2Vzc05hdGl2ZUJlaGF2aW9ycmVnaXN0ZXJJbnN0YW50aWF0aW9udW51c2VkQmVmb3JlbWF0Y2hpbmdDbGFzc2VzdHlwZXNJbnN0YW50aWF0ZWRfZmluZFVudXNlZENsYXNzZXNNYXRjaGluZ25hdGl2ZUNsYXNzbmF0aXZlVHlwZXNwZWNUeXBlIHdhcyBfb25GaXJzdE5hdGl2ZUNsYXNzQWxsIG5hdGl2ZSB0eXBlcyBtYXJrZWQgYXMgdXNlZCBkdWUgdG8gX2ZpbmROYXRpdmVFeGNlcHRpb25zRXhjZXB0aW9uX25hdGl2ZUNsYXNzRmluZGVyX25hdGl2ZUNsYXNzZXNuYXRpdmVDbGFzc2VzRm9yVGVzdGluZ3JlZ2lzdGVyZWRDbGFzc2VzRm9yVGVzdGluZ25hdGl2ZUNsYXNzZXNjb21wdXRlTmF0aXZlQ2xhc3Nlc2ZvcmNlZCBuYXRpdmUgZWxlbWVudHMgdXNlZCwgIG5hdGl2ZSBlbGVtZW50cyBkZWFkLk5hdGl2ZUNvZGVnZW5FbnF1ZXVlcl9lbWl0dGVyX2RvbmVBZGRTdWJ0eXBlc3dhcyByZXNvbHZlZF9hZGRTdWJ0eXBlc2RpcmVjdFN1YnR5cGVzIG5hdGl2ZSBjbGFzc2VzLCAgbmF0aXZlIGNsYXNzZXMgb21pdHRlZC5OYXRpdmVNZW1iZXJSZXNvbHZlcmFubm90YXRpb25EYXRhQmFzZU5hdGl2ZUNsYXNzRmluZGVyX3RhZ093bmVyX3Byb2Nlc3NOYXRpdmVDbGFzc2VzSW5MaWJyYXJ5X3Byb2Nlc3NTdWJjbGFzc2VzT2ZOYXRpdmVDbGFzc2VzX3Byb2Nlc3NOYXRpdmVDbGFzc1RhZyAnJyBhbHJlYWR5IGluIHVzZSBieSAnX2ZpbmRFeHRlbmRzTmFtZU9mQ2xhc3NuYXRpdmVDbGFzc2VzQW5kU3ViY2xhc3Nlc3BvdGVudGlhbEV4dGVuZHNleHRlbmRzTmFtZXBvdGVudGlhbFN1YmNsYXNzZXNuYXRpdmVTdXBlcmNsYXNzT2Z3YWxrUG90ZW50aWFsU3ViY2xhc3Nlc25hdGl2ZVN1cGVyY2xhc3Npc0Fubm90YXRpb25hbm5vdGF0aW9uQ2xhc3Njb25zdHJ1Y3RlZE9iamVjdHJlYWRBbm5vdGF0aW9uTmFtZUFubm90YXRpb25zIG5lZWRzIG9uZSBzdHJpbmc6IHNwZWNTdHJpbmdDb25zdGFudGlzSW5kaXJlY3RseUluc3RhbnRpYXRlZGFueVN0cmljdFN1YmNsYXNzT2ZhbnlTdHJpY3RTdWJ0eXBlT2ZoYXZlQW55Q29tbW9uU3VidHlwZXNjbHMxcXVlcnkxY2xzMnF1ZXJ5MmdldENsYXNzSGllcmFyY2h5Tm9kZUNsYXNzSGllcmFyY2h5SW1wbGNsYXNzLWhpZXJhcmNoeV9jbGFzc0hpZXJhcmNoeU5vZGVzX2NsYXNzU2V0c2NsYXNzSGllcmFyY2h5Tm9kZXNjbGFzc1NldHNjbGFzc1NldGZvckVhY2hTdWJjbGFzc05vIENsYXNzU2V0IGZvciApOiBjbGFzc0hpZXJhcmNoeU5vZGVObyBDbGFzc0hpZXJhcmNoeU5vZGUgZm9yIGhhc1N1YnR5cGVoYXNTdWJjbGFzc3N1YmNsYXNzZXNCeU1hc2tzdWJjbGFzc2Vzc3RyaWN0aW5zdGFudGlhdGVkU3ViY2xhc3NDb3VudGFueVN1YmNsYXNzc3VidHlwZXNCeU1hc2tpbnN0YW50aWF0ZWRTdWJ0eXBlQ291bnRmb3JFYWNoU3VidHlwZWFueVN1YnR5cGVjbGFzc1NldEFjbGFzc1NldEJzdWJ0eXBlc09mQnN1YnR5cGVPZkFoYXNPbmx5SW5zdGFudGlhdGVkU3ViY2xhc3Nlc0NsYXNzZXMgaW4gdGhlIGNsb3NlZCB3b3JsZCByZWxhdGVkIHRvIEluc3RhbnRpYXRlZCBjbGFzc2VzIGluIHRoZSBjbG9zZWQgd29ybGQ6Cmluc3RhbnRpYXRlZE9ubHl3aXRoUmVzcGVjdFRvX2luaGVyaXRlZEluVGhpc0NsYXNzQ2FjaGVNYXBfaW5oZXJpdGVkSW5TdWJ0eXBlQ2FjaGVNYXBDbGFzc0hpZXJhcmNoeU5vZGUvQ2xhc3NTZXQgbWlzbWF0Y2g6IF9lbnN1cmVDbGFzc1NldGdldERlY2xhcmF0aW9uX2Vuc3VyZUNsYXNzSGllcmFyY2h5Tm9kZXBhcmVudE5vZGVnZXRIaWVyYXJjaHlEZXB0aHN1YnR5cGVTZXRhZGRTdWJ0eXBlYXBwbGllZE1peGluZ2V0QXBwbGllZE1peGlucmVnaXN0ZXJNaXhpblVzZW1peGluU2V0X3VwZGF0ZVN1cGVyQ2xhc3NIaWVyYXJjaHlOb2RlRm9yQ2xhc3NpbXBsZW1lbnRzRnVuY3Rpb25faXNTdWJ0eXBlT2ZDbGFzc1NldCBmb3IgIGhhcyBub3QgYmVlbiBjb21wdXRlZCB5ZXQuZXhhY3RDbGFzc2V4YWN0Q2xhc3NOb2RlbWVtYmVySG9sZGluZ0NsYXNzU2V0bWl4aW5BcHBsaWNhdGlvbk5vZGVzdGhpc0NsYXNzY2FjaGVpc0luaGVyaXRlZEluVGhpc0NsYXNzT2ZfSW5oZXJpdGVkSW5UaGlzQ2xhc3NDYWNoZV9pbmhlcml0aW5nQ2xhc3Nlc19jb21wdXRlSW5oZXJpdGluZ0luVGhpc0NsYXNzU2V0aGFzTGl2ZUNsYXNzbWVtYmVySG9sZGluZ0NsYXNzTm9kZXZhbGlkYXRpbmdTZXRwcm9jZXNzSGllcmFyY2h5bWl4ZXJOb2RlaW5oZXJpdGluZ0NsYXNzaW5oZXJpdGluZ0NsYXNzTm9kZXRoaXNDbGFzc1NldF9Jbmhlcml0ZWRJblN1YnR5cGVDYWNoZV9jb21wdXRlSW5oZXJpdGluZ0luU3VidHlwZVNldHN1YmNsYXNzSW1wbGVtZW50c3pfTGl2ZVNldF9yZXN1bHRDbGFzc1F1ZXJ5Q2xhc3NRdWVyeS5FWEFDVENsYXNzUXVlcnkuU1VCQ0xBU1NDbGFzc1F1ZXJ5LlNVQlRZUEVTdWJjbGFzc1Jlc3VsdEtpbmRTdWJjbGFzc1Jlc3VsdEtpbmQuRU1QVFlFWEFDVDFTdWJjbGFzc1Jlc3VsdEtpbmQuRVhBQ1QxRVhBQ1QyU3ViY2xhc3NSZXN1bHRLaW5kLkVYQUNUMlNVQkNMQVNTMVN1YmNsYXNzUmVzdWx0S2luZC5TVUJDTEFTUzFTVUJDTEFTUzJTdWJjbGFzc1Jlc3VsdEtpbmQuU1VCQ0xBU1MyU1VCVFlQRTFTdWJjbGFzc1Jlc3VsdEtpbmQuU1VCVFlQRTFTVUJUWVBFMlN1YmNsYXNzUmVzdWx0S2luZC5TVUJUWVBFMlN1YmNsYXNzUmVzdWx0S2luZC5TRVRTdWJjbGFzc1Jlc3VsdFN1YmNsYXNzUmVzdWx0KCxjbGFzc2VzPXR5cGVfZ3JhcGhfaW5mZXJyZXJKQ2xvc3VyZUNhbGxNZXRob2Rkb05vdEVucXVldWVfaW5mZXJyZWREYXRhQnVpbGRlckdyYXBoIGluZmVycmVyY3JlYXRlSW5mZXJyZXJFbmdpbmVGb3JydW5PdmVyQWxsRWxlbWVudHNidWlsZFJlc3VsdHNnZXRDYWxsZXJzT2ZGb3JUZXN0aW5nY3JlYXRlTWVtYmVyUmVzdWx0c3R5cGVJbmZvcm1hdGlvbmRhdGFPZk1lbWJlcmZyZWVWYXJpYWJsZXNmb3JFYWNoTWVtYmVyVHlwZWdldFNjb3BlSW5mb2ZvckVhY2hGcmVlVmFyaWFibGVnZXRJbmZlcnJlZFR5cGVPZk1lbWJlcmNvbXB1dGVJc0NhbGxlZE9uY2Vmb3JFYWNoUGFyYW1ldGVyVHlwZWNoZWNrc0dyb3dhYmxldHlwZXMuY29uc3RhbnRzQ29uc3RhbnRWYWx1ZVR5cGVNYXNrc1VuZXhwZWN0ZWQgRHVtbXlDb25zdGFudEtpbmQ6IGNvbXB1dGVUeXBlTWFza0luZmVycmVyRW5naW5lY29uY3JldGVUeXBlc2FuYWx5emVhbmFseXplTGlzdEFuZEVucXVldWVhbmFseXplU2V0QW5kRW5xdWV1ZWFuYWx5emVNYXBBbmRFbnF1ZXVlYWRkUmV0dXJuVHlwZUZvck1ldGhvZHVudXNlZGZvckVhY2hFbGVtZW50TWF0Y2hpbmdnZXREZWZhdWx0VHlwZU9mUGFyYW1ldGVyaGFzQWxyZWFkeUNvbXB1dGVkVHlwZU9mUGFyYW1ldGVyRGVmYXVsdHNldERlZmF1bHRUeXBlT2ZQYXJhbWV0ZXJjaGVja0lmRXhwb3Nlc1RoaXNyZWNvcmRFeHBvc2VzVGhpc2V4cG9zZXNUaGlzcmVjb3JkUmV0dXJuVHlwZXJlY29yZFR5cGVPZkZpZWxkcmVnaXN0ZXJBd2FpdHJlZ2lzdGVyWWllbGRyZWdpc3RlckNhbGxlZENsb3N1cmVpbkxvb3ByZWdpc3RlckNhbGxlZE1lbWJlcmNhbGxlZXJlZ2lzdGVyQ2FsbGVkU2VsZWN0b3Jpc0NvbmRpdGlvbmFsdXBkYXRlUGFyYW1ldGVyQXNzaWdubWVudHNhZGRUb1F1ZXVldXBkYXRlU2VsZWN0b3JJbk1lbWJlcnJldHVyblR5cGVPZk1lbWJlcnR5cGVPZk1lbWJlcnR5cGVPZlBhcmFtZXRlcnR5cGVPZk5hdGl2ZUJlaGF2aW9yY2FuRmllbGRCZVVzZWRGb3JHbG9iYWxPcHRpbWl6YXRpb25zY2FuRnVuY3Rpb25QYXJhbWV0ZXJzQmVVc2VkRm9yR2xvYmFsT3B0aW1pemF0aW9uc0luZmVycmVyRW5naW5lSW1wbGRlZmF1bHRUeXBlT2ZQYXJhbWV0ZXJhbmFseXplZEVsZW1lbnRzTUFYX0NIQU5HRV9DT1VOVG92ZXJhbGxSZWZpbmVDb3VudGFkZGVkSW5HcmFwaGdlbmVyYXRpdmVDb25zdHJ1Y3RvcnNFeHBvc2luZ1RoaXN1cGRhdGVTaWRlRWZmZWN0c3NldEFsbFNpZGVFZmZlY3RzQW5kRGVwZW5kc09uU29tZXRoaW5ndHlwZXNSZXR1cm5lZG1hcHBlZFR5cGVjb21wdXRlTFVCc2V0VHlwZU1hc2tzZXRJdGVyYXRvclR5cGVNYXNrc2V0Q3VycmVudFR5cGVNYXNrc2V0TW92ZU5leHRUeXBlTWFza2FuYWx5emVkc3VjY2VlZGVkYmFpbGVkT3V0Y2FsbHNHcm93YWJsZU1ldGhvZGFzc2lnbm1lbnRzYWRkQXNzaWdubWVudGtleUFzc2lnbm1lbnRzYWRkRW50cnlBc3NpZ25tZW50dmFsdWVBc3NpZ25tZW50c21hcEFzc2lnbm1lbnRzYWRkTWFwQXNzaWdubWVudG1hcmtBc0luZmVycmVkdHlwZUluZm9NYXBhbmFseXplQWxsRWxlbWVudHNiZWZvcmVBbmFseXNpc2J1aWxkV29ya1F1ZXVlcmVmaW5lYWxsb2NhdGVkU2V0c2FsbG9jYXRlZE1hcHNiYWlsZWRPdXRPbmFsbG9jYXRlZENsb3N1cmVzY29udGludWVBbmFseXppbmd0cmFjZWQgY2xvc3VyZSAgKGJhaWwpZ2l2ZVVwY2xlYXJBc3NpZ25tZW50c21heWJlUmVzdW1ldHJhY2VkVHlwZW1pZ2h0QmVQYXNzZWRUb0Z1bmN0aW9uQXBwbHljYWxsZWRFbGVtZW50bG9va3VwQ2FsbE1ldGhvZGNhbGxlZXNVbmV4cGVjdGVkIGNsb3N1cmUgYWxsb2NhdGlvbiBpbmZvIGJlZm9yZVRyYWNpbmdzZWVuVHlwZXNfaW5mb2F0IGFmdGVyIHJlZmluZUNvdW50Z2V0SW5mZXJyZWRTaWduYXR1cmUgZm9yIGhhc0Nsb3N1cmVDYWxsVGFyZ2V0czxDbG9zdXJlLmNhbGw+Y29uY3JldGVUYXJnZXRzZ2V0SW5mZXJyZWRTaWduYXR1cmVPZk1ldGhvZCBmb3Igc29tZSB1bmtub3duIGtpbmQgb2YgY2xvc3VyZSA6OiBhZnRlckFuYWx5c2lzSW5mZXJyZWQgIHR5cGVzLnByb2Nlc3NMb29wSW5mb3JtYXRpb25BZGRlZCAgZWxlbWVudHMgaW4gaW5mZXJlbmNpbmcgZ3JhcGgud2l0aE1lbWJlcmNvbXB1dGVNZW1iZXJCb2R5ZGVmaW5pdGlvbmdldE1lbWJlckRlZmluaXRpb25VbmV4cGVjdGVkIG1lbWJlciBkZWZpbml0aW9uOiBjb21wdXRlTWVtYmVyVHlwZUluZm9ybWF0aW9uZnVuY3Rpb25Db25zdGFudGFsbG9jYXRlQ2xvc3VyZXJlZmluZWRUeXBlYWxsb2NhdGVkVHlwZXNpc0ZpZWxkSW5pdGlhbGl6ZXJQb3RlbnRpYWxseU51bGxnZXRMb2NhbHNNYXBnZXRTdGF0aWNUeXBlUHJvdmlkZXJoYXNDYWxsVHlwZWFsbG9jYXRlZENhbGxzb2xkVHlwZWFiYW5kb25JbmZlcmVuY2luZ0FOT01BTFkgV0FSTklORzogbWF4IHJlZmluZW1lbnQgcmVhY2hlZCBmb3IgaGFzU3RhYmxlVHlwZXN0YWJpbGl6ZW9yZGVyZWRUeXBlSW5mb3JtYXRpb25zcmVtb3ZlQXNzaWdubWVudGNsb3N1cml6ZWRDb3VudHRhZ0FzVGVhck9mZkNsb3N1cmVQYXJhbWV0ZXJObyBkZWZhdWx0IHR5cGUgZm9yIGFkZFVzZXJzT2ZhZGRUb0dyYXBobWVtYmVyVHlwZUluZm9ybWF0aW9uc3BhcmFtZXRlclR5cGVJbmZvcm1hdGlvbnNjYWxsZXJzRm9yVGVzdGluZ0tlcm5lbFR5cGVTeXN0ZW1TdHJhdGVneWNoZWNrQ2xhc3NFbnRpdHljaGVja01hcE5vZGVjaGVja1NldE5vZGVjaGVja0xpc3ROb2RlY2hlY2tMb29wUGhpTm9kZWNoZWNrUGhpTm9kZWNyZWF0ZVBhcmFtZXRlclR5cGVJbmZvcm1hdGlvbmxvY2Fsc01hcGdldEZ1bmN0aW9uTm9kZUZvclBhcmFtZXRlcmdldExvY2FsVHlwZWdldENsb3N1cmVJbmZvbWVtYmVyVHlwZUluZm9ybWF0aW9uY3JlYXRlTWVtYmVyVHlwZUluZm9ybWF0aW9uS2VybmVsR2xvYmFsVHlwZUluZmVyZW5jZUVsZW1lbnREYXRhZ2xvYmFsLXR5cGUtaW5mZXJlbmNlLWVsZW1lbnQtZGF0YV9zZW5kTWFwX2l0ZXJhdG9yTWFwX2N1cnJlbnRNYXBfbW92ZU5leHRNYXBzZW5kTWFwaXRlcmF0b3JNYXBjdXJyZW50TWFwbW92ZU5leHRNYXBfbWFwc1RvTnVsbGRhcnQyanMuY29tbW9uLmNvZGVnZW5Db2RlZ2VuSW1wYWN0dHlwZVZhcmlhYmxlQm91bmRzU3VidHlwZUNoZWNrc2NvbnN0U3ltYm9sc3NwZWNpYWxpemVkR2V0SW50ZXJjZXB0b3JzdXNlc0ludGVyY2VwdG9yYXN5bmNNYXJrZXJzX0NvZGVnZW5JbXBhY3RfdHlwZVZhcmlhYmxlQm91bmRzU3VidHlwZUNoZWNrc19jb25zdFN5bWJvbHNfdXNlc0ludGVyY2VwdG9yX2FzeW5jTWFya2Vyc3JlZ2lzdGVyQ29uc3RTeW1ib2xyZWdpc3RlclVzZUludGVyY2VwdG9ycmVnaXN0ZXJBc3luY01hcmtlcmlzRm9yUmVzb2x1dGlvbkNvZGVnZW5SZWdpc3RyeSBmb3IgcmVnaXN0ZXJJbnN0YW50aWF0ZWRDbG9zdXJlZGFydDJqcy5qc19tb2RlbC5lbGVtZW50c0NsYXNzSGllcmFyY2h5Tm9kZXNNYXBLZXlKTGlicmFyeUpDbGFzc0tpbmRKQ2xhc3NLaW5kLm5vZGVKQ2xhc3NLaW5kLmNsb3N1cmVKQ2xhc3NLaW5kLnJlY29yZF9KQ2xhc3MmSW5kZXhlZENsYXNzJkNsYXNzSGllcmFyY2h5Tm9kZXNNYXBLZXlfY2xhc3NIaWVyYXJjaHlOb2RlSkNsYXNzVW5leHBlY3RlZCBDbGFzc0tpbmQgSlR5cGVkZWZKTWVtYmVyS2luZGdlbmVyYXRpdmVDb25zdHJ1Y3RvckpNZW1iZXJLaW5kLmdlbmVyYXRpdmVDb25zdHJ1Y3RvcmZhY3RvcnlDb25zdHJ1Y3RvckpNZW1iZXJLaW5kLmZhY3RvcnlDb25zdHJ1Y3RvcmNvbnN0cnVjdG9yQm9keUpNZW1iZXJLaW5kLmNvbnN0cnVjdG9yQm9keUpNZW1iZXJLaW5kLmZpZWxkSk1lbWJlcktpbmQuZ2V0dGVySk1lbWJlcktpbmQuc2V0dGVySk1lbWJlcktpbmQubWV0aG9kY2xvc3VyZUZpZWxkSk1lbWJlcktpbmQuY2xvc3VyZUZpZWxkY2xvc3VyZUNhbGxNZXRob2RKTWVtYmVyS2luZC5jbG9zdXJlQ2FsbE1ldGhvZGdlbmVyYXRvckJvZHlKTWVtYmVyS2luZC5nZW5lcmF0b3JCb2R5c2lnbmF0dXJlTWV0aG9kSk1lbWJlcktpbmQuc2lnbmF0dXJlTWV0aG9kcmVjb3JkRmllbGRKTWVtYmVyS2luZC5yZWNvcmRGaWVsZEpNZW1iZXJVbmV4cGVjdGVkIEpNZW1iZXJLaW5kIEpGdW5jdGlvbkpDb25zdHJ1Y3RvckpHZW5lcmF0aXZlQ29uc3RydWN0b3JnZW5lcmF0aXZlLWNvbnN0cnVjdG9ySkZhY3RvcnlDb25zdHJ1Y3RvcmZhY3RvcnktY29uc3RydWN0b3JKQ29uc3RydWN0b3JCb2R5Y29uc3RydWN0b3ItYm9keWNvbnN0cnVjdG9yX2JvZHlKTWV0aG9kSkdlbmVyYXRvckJvZHlnZW5lcmF0b3ItYm9keWdlbmVyYXRvcl9ib2R5SkdldHRlckpTZXR0ZXJjbG9zdXJlLWNhbGwtbWV0aG9kY2xvc3VyZV9jYWxsc2lnbmF0dXJlLW1ldGhvZEpUeXBlVmFyaWFibGVLaW5kSlR5cGVWYXJpYWJsZUtpbmQuY2xzSlR5cGVWYXJpYWJsZUtpbmQubWVtYmVySlR5cGVWYXJpYWJsZUtpbmQudHlwZWRlZkpUeXBlVmFyaWFibGVLaW5kLmxvY2FsSlR5cGVWYXJpYWJsZXR5cGUtdmFyaWFibGVVbmV4cGVjdGVkIHR5cGUgdmFyaWFibGUgZGVjbGFyZXIganNFbGVtZW50UHJlZml4ajpyZXdyaXRlX2FzeW5jbWF4ZXJyb3JfY29kZXNBc3luY1Jld3JpdGVyQmFzZWxvY2FsVmFyaWFibGVzY29udGludWVMYWJlbHNicmVha0xhYmVsc2ZpbmFsbHlMYWJlbHNoYW5kbGVyTGFiZWxzZXhpdExhYmVscmV0aHJvd0xhYmVsanVtcFRhcmdldHNjb250aW51ZVN0YWNrYnJlYWtTdGFja3JldHVyblN0YWNrdmFyaWFibGVSZW5hbWluZ3NhbmFseXNpc3Jlc3VsdE5hbWVlcnJvckNvZGVOYW1lZ290b05hbWVoYW5kbGVyTmFtZWhhc0hhbmRsZXJMYWJlbHNuZXh0TmFtZXJldHVyblZhbHVlTmFtZWN1cnJlbnRFcnJvck5hbWVvdXRlckxhYmVsTmFtZXNlbGZOYW1ldHlwZUFyZ3VtZW50TmFtZXNfc3Bhbm5hYmxlX2N1cnJlbnRMYWJlbGN1cnJlbnRUZW1wVmFySW5kZXh0ZW1wVmFySGlnaFdhdGVyTWFya3RlbXBWYXJOYW1lc2xhYmVsbGVkUGFydHNsYWJlbENvbW1lbnRzaGFzVHJ5QmxvY2tzaW5zaWRlVW50cmFuc2xhdGVkQnJlYWthYmxlaGFzSnVtcFRob3VnaE91dGVyTGFiZWxuZWVkc1JldGhyb3djdXJyZW50U3RhdGVtZW50QnVmZmVycmV0dXJuVmFsdWVjdXJyZW50RXJyb3Jpc1N5bmNTdGFyaXNBc3luY1N0YXJpbml0aWFsaXplTmFtZXNmcmVzaE5hbWVyZXdyaXRlRnVuY3Rpb25jdXJyZW50RXJyb3JIYW5kbGVyYWxsb2NhdGVUZW1wVmFydXNlVGVtcFZhcm9yaWdpbmFsTmFtZXNhZmVOYW1lcHJvY2Vzc1R5cGVBcmd1bWVudHNuZXdMYWJlbGJlZ2luTGFiZWxzZXRHb3RvVmFyaWFibGUjID0gI2dvdG9BbmRCcmVha2dvdG8gYWRkRXhwcmVzc2lvblN0YXRlbWVudHNob3VsZFRyYW5zZm9ybWhhc0F3YWl0T3JZaWVsZE5vZGUgIGNhbm5vdCBiZSB0cmFuc2Zvcm1lZCBieSB0aGUgYXdhaXQtc3luYyB0cmFuc2Zvcm1lcnVucmVhY2hhYmxlSW50ZXJuYWwgZXJyb3IsIHRyeWluZyB0byB2aXNpdCB2aXNpdFN0YXRlbWVudHZpc2l0RXhwcmVzc2lvbklnbm9yZVJlc3VsdHZpc2l0RXhwcmVzc2lvbl9zdG9yZUlmTmVjZXNzYXJ5IyA9ICM7d2l0aEV4cHJlc3Npb25zdG9yZW9sZFRlbXBWYXJJbmRleHdpdGhDYWxsVGFyZ2V0RXhwcmVzc2lvbnN0b3JlZElmTmVlZGVkd2l0aEV4cHJlc3Npb24ycjFyMndpdGhFeHByZXNzaW9uc2xhc3RUcmFuc2Zvcm1JbmRleGFkZFN1Y2Nlc3NFeGl0YWRkRXJyb3JFeGl0YWRkRnVuY3Rpb25FeGl0c3Jld3JpdHRlbkJvZHl2YXJpYWJsZURlY2xhcmF0aW9uc2Z1bmN0aW9uU291cmNlSW5mb3JtYXRpb252YXJpYWJsZUluaXRpYWxpemF0aW9uc0Z1bmN0aW9uIHN0YXJ0aGFzRXhwbGljaXRSZXR1cm5zY2xhdXNlc3doaWxlICh0cnVlKSB7I31oYXNGaW5hbGx5aGFzWWllbGR2aXNpdEZ1bk5lc3RlZCBmdW5jdGlvbiBpcyBhIGdlbmVyYXRvciBvciBhc3luY2hyb25vdXMudmlzaXRBY2Nlc3MjWyNddmlzaXRBcnJheUhvbGV2aXNpdEFycmF5SW5pdGlhbGl6ZXJ2aXNpdEFzc2lnbm1lbnRsZWZ0SGFuZFNpZGVldmFsdWF0ZWRVbmV4cGVjdGVkIGFzc2lnbm1lbnQgbGVmdCBoYW5kIHNpZGUgYXdhaXRTdGF0ZW1lbnRhZnRlckF3YWl0cmV0dXJuaW5nIGZyb20gYXdhaXQuaXNSZXN1bHR0aGVuTGFiZWxqb2luTGFiZWxhc3NpZ25MZWZ0aWYgKCMpIHsjfSBlbHNlICN0cmFuc2xhdGVKdW1wdmlzaXRDYWxsc3RvcmVUYXJnZXR2aXNpdENhc2V2aXNpdENvbW1lbnQjID8gIyA6ICNlbHNlTGFiZWwjID0gIyA/ICMgOiAjO3RhcmdldExhYmVsanVtcFN0YWNrZmlyc3RUYXJnZXRqc0p1bXBTdGFja3Zpc2l0RGVmYXVsdHZpc2l0RG9vbGRJbnNpZGVVbnRyYW5zbGF0ZWRCcmVha2FibGVkbyB7I30gd2hpbGUgKCMpdHJhbnNsYXRlVG9TdGF0ZW1lbnRzdGFydExhYmVsZG8gYm9keWNvbnRpbnVlTGFiZWxkbyBjb25kaXRpb25hZnRlckxhYmVsYWZ0ZXIgZG9pZiAoIykgI3Zpc2l0Rm9yb2xkSW5zaWRlVW50cmFuc2xhdGVkZm9yIGNvbmRpdGlvbmZvciB1cGRhdGVhZnRlciBmb3J0cml2aWFsIGNvbmRpdGlvbnZpc2l0Rm9ySW5KYXZhc2NyaXB0IGZvci1pbiBub3QgaW1wbGVtZW50ZWQgeWV0IGluIHRoZSBhd2FpdCB0cmFuc2Zvcm1hdGlvbnRyYW5zbGF0ZVRvU3RhdGVtZW50U2VxdWVuY2VvbGRCdWZmZXJyZXN1bHRCdWZmZXJ0cmFuc2xhdGVUb0Jsb2NrdHJhbnNsYXRlZFRoZW50cmFuc2xhdGVkRWxzZXZpc2l0SW50ZXJwb2xhdGVkRXhwcmVzc2lvbnZpc2l0SW50ZXJwb2xhdGVkRGVjbGFyYXRpb252aXNpdEludGVycG9sYXRlZExpdGVyYWx2aXNpdEludGVycG9sYXRlZFBhcmFtZXRlcnZpc2l0SW50ZXJwb2xhdGVkU2VsZWN0b3J2aXNpdEludGVycG9sYXRlZFN0YXRlbWVudGJyZWFrTGFiZWx2aXNpdExpdGVyYWxCb29sdmlzaXRMaXRlcmFsRXhwcmVzc2lvbnZpc2l0TGl0ZXJhbE51bGx2aXNpdExpdGVyYWxOdW1iZXJ2aXNpdExpdGVyYWxTdGF0ZW1lbnR2aXNpdExpdGVyYWxTdHJpbmd2aXNpdFBhcmVudGhlc2VzdmlzaXROYW1lZEZ1bmN0aW9udmlzaXREZWZlcnJlZEV4cHJlc3Npb252aXNpdERlZmVycmVkTnVtYmVydmlzaXREZWZlcnJlZFN0cmluZ3Zpc2l0TmV3dmlzaXRPYmplY3RJbml0aWFsaXplcnZpc2l0UGFyYW1ldGVydmlzaXRQb3N0Zml4VW5leHBlY3RlZCBwb3N0Zml4IG9wZXJhdG9yIGFyZ3VtZW50IHZpc2l0UHJlZml4VW5leHBlY3RlZCBwcmVmaXggIG9wZXJhdG9yIGFyZ3VtZW50IHZpc2l0UHJvcGVydHl2aXNpdFJlZ0V4cExpdGVyYWxjbGF1c2VhZnRlcmFmdGVyIHN3aXRjaGFueUNhc2VFeHByZXNzaW9uVHJhbnNmb3JtZWRkZWZhdWx0SW5kZXhoYXNEZWZhdWx0VW5rbm93biBjbGF1c2UgdHlwZSBzZXRFcnJvckhhbmRsZXJfZmluYWxsaWVzVXBUb0FuZEVuY2xvc2luZ0hhbmRsZXJoYW5kbGVyTGFiZWxmaW5hbGx5TGFiZWxjYXRjaFBhcnRmaW5hbGx5UGFydHVuY2F1Z2h0TGFiZWx1bmNhdWdodGFmdGVyRmluYWxseUxhYmVsYWZ0ZXIgZmluYWxseSMucHVzaCgjKTtlcnJvclJlbmFtZWVuY2xvc2luZ0ZpbmFsbGllc25leHRMYWJlbC8vIGdvdG8gdGhlIG5leHQgZmluYWxseSBoYW5kbGVyIyA9ICMucG9wKCk7dmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uTGlzdGluaXRpYWxpemF0aW9uZGVjbGFyYXRpb25zdmlzaXRWYXJpYWJsZUluaXRpYWxpemF0aW9udmlzaXRWYXJpYWJsZVVzZXJlbmFtaW5ndmlzaXRXaGlsZXdoaWxlIGNvbmRpdGlvbmFmdGVyIHdoaWxlYWRkWWllbGR2aXNpdERhcnRZaWVsZGFmdGVyIHlpZWxkQXN5bmNSZXdyaXRlcmNvbXBsZXRlck5hbWVjb21wbGV0ZXJZaWVsZCBpbiBub24tZ2VuZXJhdGluZyBhc3luYyBmdW5jdGlvbnRoZW5IZWxwZXJDYWxsI3RoZW5IZWxwZXIoI2N1cnJlbnRFcnJvciwgI2NvbXBsZXRlcil0aGVuSGVscGVyaW1wbGljaXQgcmV0dXJucnVudGltZUhlbHBlckNhbGwjcnVudGltZUhlbHBlcigjcmV0dXJuVmFsdWUsICNjb21wbGV0ZXIpcnVudGltZUhlbHBlciMoIylhc3luY0hlbHBlckNhbGwjYXN5bmNIZWxwZXIoI3ZhbHVlLCAjYm9keU5hbWUpYXN5bmNIZWxwZXJhc3luY1JldGhyb3dDYWxsI2FzeW5jUmV0aHJvdygjcmVzdWx0LCAjY29tcGxldGVyKXJldHVybkFzeW5jUmV0aHJvd2Vycm9yQ2hlY2sgICAgICBpZiAoI2Vycm9yQ29kZSA9PT0gI0VSUk9SKSB7CiAgICAgICAgaWYgKCNoYXNIYW5kbGVyTGFiZWxzKSB7CiAgICAgICAgICAgICNjdXJyZW50RXJyb3IgPSAjcmVzdWx0OwogICAgICAgICAgICAjZ290byA9ICNoYW5kbGVyOwogICAgICAgIH0gZWxzZQogICAgICAgICAgICAjcmV0dXJuQXN5bmNSZXRocm93OwogICAgICB9aW5uZXJGdW5jdGlvbiAgICAgIGZ1bmN0aW9uICgjZXJyb3JDb2RlLCAjcmVzdWx0KSB7CiAgICAgICAgI2Vycm9yQ2hlY2s7CiAgICAgICAgI3Jld3JpdHRlbkJvZHk7CiAgICAgIH1hc3luY1N0YXJ0Q2FsbCNhc3luY1N0YXJ0KCNib2R5TmFtZSwgI2NvbXBsZXRlcilyZXR1cm5Bc3luY1N0YXJ0d3JhcEJvZHlDYWxsI3dyYXBCb2R5KCNpbm5lckZ1bmN0aW9uKSAgICAgICAgZnVuY3Rpb24gKCNwYXJhbWV0ZXJzLCAjdHlwZVBhcmFtZXRlcnMpIHsKICAgICAgICAgICN2YXJpYWJsZURlY2xhcmF0aW9uczsKICAgICAgICAgIHZhciAjYm9keU5hbWUgPSAjd3JhcEJvZHlDYWxsOwogICAgICAgICAgI3JldHVybkFzeW5jU3RhcnQ7CiAgICAgICAgfVN5bmNTdGFyUmV3cml0ZXJkaWFnbm9zdGljTGlzdGVuZXJyZW5hbWVkUGFyYW1ldGVyc3JlbmFtZWROYW1lY29weVBhcmFtZXRlcnNzZXRDdXJyZW50RXJyb3IjY3VycmVudEVycm9yID0gI3Jlc3VsdHNldEdvdG8jZ290byA9ICNoYW5kbGVyY2hlY2tFcnJvckNvZGUgICAgICAgICAgaWYgKCNlcnJvckNvZGUgPT09ICNFUlJPUikgewogICAgICAgICAgICAgICNzZXRDdXJyZW50RXJyb3I7CiAgICAgICAgICAgICAgI3NldEdvdG87CiAgICAgICAgICB9aW5uZXJJbm5lckZ1bmN0aW9uICAgICAgICAgIGZ1bmN0aW9uICNib2R5KCNlcnJvckNvZGUsICNyZXN1bHQpIHsKICAgICAgICAgICAgI2NoZWNrRXJyb3JDb2RlOwogICAgICAgICAgICAjaGVscGVyQm9keTsKICAgICAgICAgIH1oZWxwZXJCb2R5cmV0dXJuSW5uZXJJbm5lckZ1bmN0aW9uICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKCNoYXNQYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgICAgI2NvcHlQYXJhbWV0ZXJzOwogICAgICAgICAgICB9CiAgICAgICAgICAgICN2YXJEZWNsOwogICAgICAgICAgICAjcmV0dXJuSW5uZXJJbm5lckZ1bmN0aW9uOwogICAgICAgICAgfWhhc1BhcmFtZXRlcnN2YXJEZWNsY2FsbEl0ZXJhYmxlRmFjdG9yeSNpdGVyYWJsZUZhY3RvcnkoI2lubmVyRnVuY3Rpb24sICN0eXBlKXJldHVybkNhbGxJdGVyYWJsZUZhY3RvcnkgICAgICAgICAgZnVuY3Rpb24gKCNyZW5hbWVkUGFyYW1ldGVycywgI3R5cGVQYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgIGlmICgjbmVlZHNUaGlzKQogICAgICAgICAgICAgIHZhciAjc2VsZiA9IHRoaXM7CiAgICAgICAgICAgICNyZXR1cm5DYWxsSXRlcmFibGVGYWN0b3J5OwogICAgICAgICAgfQogICAgICAgICAgbmVlZHNUaGlzdW5jYXVnaHRFcnJvckV4cHJlc3Npb25DYWxsZW5kT2ZJdGVyYXRpb25DYWxsIygpU3luYyogZnVuY3Rpb25zIGNhbm5vdCBjb250YWluIGF3YWl0IHN0YXRlbWVudHMuQXN5bmNTdGFyUmV3cml0ZXJuZXh0V2hlbkNhbmNlbGVkTmFtZWNvbnRyb2xsZXJOYW1lbmV4dFdoZW5DYW5jZWxlZGNvbnRyb2xsZXJlbmNsb3NpbmdGaW5hbGx5TGFiZWxzeWllbGRFeHByZXNzaW9uQ2FsbCN5aWVsZEV4cHJlc3Npb24oI2V4cHJlc3Npb24pYXN5bmNTdGFySGVscGVyQ2FsbCNhc3luY1N0YXJIZWxwZXIoI3lpZWxkRXhwcmVzc2lvbkNhbGwsICNib2R5TmFtZSwgI2NvbnRyb2xsZXIpdXBkYXRlTmV4dCNuZXh0ID0gI25leHRXaGVuQ2FuY2VsZWRjYWxsUG9wI25leHQucG9wKClnb3RvQ2FuY2VsbGVkI2dvdG8gPSAjY2FsbFBvcHVwZGF0ZUVycm9yZ290b0Vycm9yICAgICAgICBzd2l0Y2ggKCNlcnJvckNvZGUpIHsKICAgICAgICAgIGNhc2UgI1NUUkVBTV9XQVNfQ0FOQ0VMRUQ6CiAgICAgICAgICAgICN1cGRhdGVOZXh0OwogICAgICAgICAgICAjZ290b0NhbmNlbGxlZDsKICAgICAgICAgICAgI2JyZWFrOwogICAgICAgICAgY2FzZSAjRVJST1I6CiAgICAgICAgICAgICN1cGRhdGVFcnJvcjsKICAgICAgICAgICAgI2dvdG9FcnJvcjsKICAgICAgICB9U1RSRUFNX1dBU19DQU5DRUxFRGlmRXJyb3IgICAgICAgIGlmICgjZXJyb3JDb2RlID09PSAjRVJST1IpIHsKICAgICAgICAgICN1cGRhdGVFcnJvcjsKICAgICAgICAgICNnb3RvRXJyb3I7CiAgICAgICAgfWlmSGFzWWllbGQgICAgICAgIGlmICgjaGFzWWllbGQpIHsKICAgICAgICAgICNzd2l0Y2hDYXNlCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICNpZkVycm9yOwogICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gKCNlcnJvckNvZGUsICNyZXN1bHQpIHsKICAgICAgICAgICNpZkhhc1lpZWxkOwogICAgICAgICAgI3Jld3JpdHRlbkJvZHk7CiAgICAgICAgfWRlY2xhcmVCb2R5TmFtZXZhciAjYm9keU5hbWUgPSAjd3JhcEJvZHlDYWxsO3N0cmVhbU9mQ29udHJvbGxlckNhbGwjc3RyZWFtT2ZDb250cm9sbGVyKCNjb250cm9sbGVyKXJldHVyblN0cmVhbU9mQ29udHJvbGxlckNhbGwgICAgICAgIGZ1bmN0aW9uICgjcGFyYW1ldGVycywgI3R5cGVQYXJhbWV0ZXJzKSB7CiAgICAgICAgICAjZGVjbGFyZUJvZHlOYW1lOwogICAgICAgICAgI3ZhcmlhYmxlRGVjbGFyYXRpb25zOwogICAgICAgICAgI3JldHVyblN0cmVhbU9mQ29udHJvbGxlckNhbGw7CiAgICAgICAgfSNhc3luY0hlbHBlcigjY3VycmVudEVycm9yLCAjZXJyb3JDb2RlLCAjY29udHJvbGxlcilzdHJlYW1IZWxwZXJDYWxsI3N0cmVhbUhlbHBlcihudWxsLCAjc3VjY2Vzc0NvZGUsICNjb250cm9sbGVyKXN0cmVhbUhlbHBlcnN1Y2Nlc3NDb2RlIygjLCAjKSNhc3luY0hlbHBlcigjdmFsdWUsICNib2R5TmFtZSwgI2NvbnRyb2xsZXIpUHJlVHJhbnNsYXRpb25BbmFseXNpc2xvb3BzQW5kU3dpdGNoZXNsYWJlbGxlZFN0YXRlbWVudHNjdXJyZW50RnVuY3Rpb25jb250YWluc0F3YWl0c3RtdGFyZ2V0U3RhdGVtZW50ZW5jbG9zZWRVbmV4cGVjdGVkX21ha2VWYXJpYWJsZUluaXRpYWxpemVyaW5pdFZhbHVlZGFydDJqcy5qc19lbWl0dGVyZGFydDJqcy5qc19lbWl0dGVyLnNvcnRlcnNvcnRMaWJyYXJpZXNzb3J0Q2xhc3Nlc3NvcnRUeXBlZGVmc3NvcnRNZW1iZXJzY29tcGFyZUxpYnJhcmllc0J5TG9jYXRpb25jb21wYXJlQ2xhc3Nlc0J5TG9jYXRpb25jb21wYXJlVHlwZWRlZnNCeUxvY2F0aW9uY29tcGFyZU1lbWJlcnNCeUxvY2F0aW9uSFRyYWNlclRyYWNlcnRyYWNlQWN0aXZldHJhY2VGaWx0ZXJjZmdpc0VuYWJsZWR0cmFjZUNvbXBpbGF0aW9uY29tcGlsYXRpb25wcmludFByb3BlcnR5bWlsbGlzZWNvbmRzU2luY2VFcG9jaHRyYWNlR3JhcGhpck9iamVjdFRyYWNlclV0aWxfaW5kdGFnTmFtZWJlZ2luX2VuZF9hZGRJbmRlbnRwcmludEVtcHR5UHJvcGVydHlmb3JtYXRQcnR5aW52YWxpZCBwcm9wZXJ0eSB0eXBlOiBUUkFDRV9GSUxURVJfUEFUVEVSTl9GUk9NX0VOVklST05NRU5URFVNUF9JUlRSQUNFX0ZJTFRFUl9QQVRURVJOX0ZPUl9URVNUVFJBQ0VfRklMVEVSX1BBVFRFUk5kYXJ0MmpzLmpzX2hlbHBlcnMuaW1wYWN0QmFja2VuZEZlYXR1cmVCYWNrZW5kRmVhdHVyZS5uZWVkVG9Jbml0aWFsaXplSXNvbGF0ZUFmZmluaXR5VGFnQmFja2VuZEZlYXR1cmUubmVlZFRvSW5pdGlhbGl6ZURpc3BhdGNoUHJvcGVydHlCYWNrZW5kSW1wYWN0X2ZlYXR1cmVzY3JlYXRlSW1wYWN0d29ybGRJbXBhY3RCdWlsZGVyQmFja2VuZEltcGFjdHNfZ2V0UnVudGltZVR5cGVBcmd1bWVudF9jb21wdXRlU2lnbmF0dXJlX21haW5XaXRoQXJndW1lbnRzX2FzeW5jQm9keV9zeW5jU3RhckJvZHlfYXN5bmNTdGFyQm9keV90eXBlVmFyaWFibGVCb3VuZENoZWNrX2Fic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uX2ZhbGxUaHJvdWdoRXJyb3JfYXNDaGVja190aHJvd05vU3VjaE1ldGhvZF9zdHJpbmdWYWx1ZXNfbnVtVmFsdWVzX2Jvb2xWYWx1ZXNfbnVsbFZhbHVlX2xpc3RWYWx1ZXNfdGhyb3dSdW50aW1lRXJyb3JfdGhyb3dVbnN1cHBvcnRlZEVycm9yX3N1cGVyTm9TdWNoTWV0aG9kX2NvbnN0YW50TWFwTGl0ZXJhbF9jb25zdGFudFNldExpdGVyYWxfc3ltYm9sQ29uc3RydWN0b3JfY29uc3RTeW1ib2xfYXNzZXJ0V2l0aG91dE1lc3NhZ2VfYXNzZXJ0V2l0aE1lc3NhZ2VfYXN5bmNGb3JJbl9zdHJpbmdJbnRlcnBvbGF0aW9uX3N0cmluZ0p1eHRhcG9zaXRpb25fY2F0Y2hTdGF0ZW1lbnRfdGhyb3dFeHByZXNzaW9uX2xhenlGaWVsZF90eXBlTGl0ZXJhbF9zdGFja1RyYWNlSW5DYXRjaF9zeW5jRm9ySW5fdHlwZVZhcmlhYmxlRXhwcmVzc2lvbl90eXBlQ2hlY2tfZ2VuZXJpY1R5cGVDaGVja19nZW5lcmljSXNDaGVja190eXBlVmFyaWFibGVUeXBlQ2hlY2tfZnVuY3Rpb25UeXBlQ2hlY2tfZnV0dXJlT3JUeXBlQ2hlY2tfbmF0aXZlVHlwZUNoZWNrX2Nsb3N1cmVfaW50ZXJjZXB0b3JVc2VfbnVtQ2xhc3Nlc19saXN0T3JTdHJpbmdDbGFzc2VzX25hdGl2ZU9yRXh0ZW5kc0NsYXNzX2xpc3RDbGFzc2VzX2pzSW5kZXhpbmdCZWhhdmlvcl90cmFjZUhlbHBlcl9hc3NlcnRVbnJlYWNoYWJsZV9ydW50aW1lVHlwZVN1cHBvcnRfZGVmZXJyZWRMb2FkaW5nX25vU3VjaE1ldGhvZFN1cHBvcnRfbG9hZExpYnJhcnlfbWVtYmVyQ2xvc3VyZV9zdGF0aWNDbG9zdXJlX3R5cGVWYXJpYWJsZU1pcnJvcl9nZW5lcmljSW5zdGFudGlhdGlvbmxpc3RWYWx1ZXNtYWluV2l0aEFyZ3VtZW50c2FzeW5jQm9keXN5bmNTdGFyQm9keWFzeW5jU3RhckJvZHl0eXBlVmFyaWFibGVCb3VuZENoZWNrYWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25fbmVlZHNTdHJpbmdOZWVkZWQgdG8gZW5jb2RlIHRoZSBtZXNzYWdlLmFzQ2hlY2tfbmVlZHNMaXN0TmVlZGVkIHRvIGVuY29kZSB0aGUgYXJndW1lbnRzIGZvciB0aHJvdyBOb1N1Y2hNZXRob2RFcnJvci5OZWVkZWQgdG8gZW5jb2RlIHRoZSBuYW1lIGZvciB0aHJvdyBOb1N1Y2hNZXRob2RFcnJvci5zdHJpbmdWYWx1ZXNudW1WYWx1ZXNpbnRWYWx1ZXNkb3VibGVWYWx1ZXNib29sVmFsdWVzbnVsbFZhbHVlc3VwZXJOb1N1Y2hNZXRob2RfbmVlZHNJbnROZWVkZWQgdG8gZW5jb2RlIHRoZSBpbnZvY2F0aW9uIGtpbmQgb2Ygc3VwZXIubm9TdWNoTWV0aG9kLk5lZWRlZCB0byBlbmNvZGUgdGhlIGFyZ3VtZW50cyBvZiBzdXBlci5ub1N1Y2hNZXRob2QuTmVlZGVkIHRvIGVuY29kZSB0aGUgbmFtZSBvZiBzdXBlci5ub1N1Y2hNZXRob2QuY29uc3RhbnRNYXBMaXRlcmFsY29uc3RhbnRTZXRMaXRlcmFsc3ltYm9sQ29uc3RydWN0b3Jjb25zdFN5bWJvbGFzc2VydFdpdGhvdXRNZXNzYWdlYXNzZXJ0V2l0aE1lc3NhZ2Vhc3luY0Zvckluc3RyaW5nSW50ZXJwb2xhdGlvblN0cmluZ3MgYXJlIGNyZWF0ZWQuc3RyaW5nSnV4dGFwb3NpdGlvblN0cmluZy5jb25jYXQgaXMgdXNlZC5udWxsTGl0ZXJhbGJvb2xMaXRlcmFsaW50TGl0ZXJhbGRvdWJsZUxpdGVyYWxzdHJpbmdMaXRlcmFsY2F0Y2hTdGF0ZW1lbnRsYXp5RmllbGRzdGFja1RyYWNlSW5DYXRjaHN5bmNGb3JJbnR5cGVWYXJpYWJsZUV4cHJlc3Npb25OZWVkZWQgZm9yIGFjY2Vzc2luZyBhIHR5cGUgdmFyaWFibGUgbGl0ZXJhbCBvbiB0aGlzLmdlbmVyaWNUeXBlQ2hlY2tnZW5lcmljSXNDaGVja3R5cGVWYXJpYWJsZVR5cGVDaGVja2Z1bmN0aW9uVHlwZUNoZWNrZnV0dXJlT3JUeXBlQ2hlY2tuYXRpdmVUeXBlQ2hlY2tpbnRlcmNlcHRvclVzZW51bUNsYXNzZXNsaXN0T3JTdHJpbmdDbGFzc2VzbmF0aXZlT3JFeHRlbmRzQ2xhc3NsaXN0Q2xhc3Nlc2pzSW5kZXhpbmdCZWhhdmlvcnJ1bnRpbWVUeXBlU3VwcG9ydGRlZmVycmVkTG9hZGluZ25vU3VjaE1ldGhvZFN1cHBvcnRtZW1iZXJDbG9zdXJlc3RhdGljQ2xvc3VyZXR5cGVWYXJpYWJsZU1pcnJvcmdldEdlbmVyaWNJbnN0YW50aWF0aW9uU3NhQ29kZUdlbmVyYXRvckNoZWNrZWRNb2RlSGVscGVyZ2V0U3RhdGljVXNlZ2VuZXJhdGVBZGRpdGlvbmFsQXJndW1lbnRzUHJvcGVydHlDaGVja2VkTW9kZUhlbHBlcmFkZGl0aW9uYWxBcmd1bWVudG9wZXJhdG9ySXNUeXBlVHlwZVZhcmlhYmxlQ2hlY2tlZE1vZGVIZWxwZXJGdW5jdGlvblR5cGVSZXByZXNlbnRhdGlvbkNoZWNrZWRNb2RlSGVscGVyRnV0dXJlT3JSZXByZXNlbnRhdGlvbkNoZWNrZWRNb2RlSGVscGVyU3VidHlwZUNoZWNrZWRNb2RlSGVscGVyb3BlcmF0b3JJc3N1YnN0aXR1dGlvbk5hbWVDaGVja2VkTW9kZUhlbHBlcnNoZWxwZXJzc3RyaW5nVHlwZUNhc3RzdHJpbmdUeXBlQ2hlY2tkb3VibGVUeXBlQ2FzdGRvdWJsZVR5cGVDaGVja251bVR5cGVDYXN0bnVtVHlwZUNoZWNrYm9vbFR5cGVDYXN0Ym9vbFR5cGVDaGVja2ludFR5cGVDYXN0aW50VHlwZUNoZWNrbnVtYmVyT3JTdHJpbmdTdXBlck5hdGl2ZVR5cGVDYXN0bnVtYmVyT3JTdHJpbmdTdXBlck5hdGl2ZVR5cGVDaGVja251bWJlck9yU3RyaW5nU3VwZXJUeXBlQ2FzdG51bWJlck9yU3RyaW5nU3VwZXJUeXBlQ2hlY2tzdHJpbmdTdXBlck5hdGl2ZVR5cGVDYXN0c3RyaW5nU3VwZXJOYXRpdmVUeXBlQ2hlY2tzdHJpbmdTdXBlclR5cGVDYXN0c3RyaW5nU3VwZXJUeXBlQ2hlY2tsaXN0VHlwZUNhc3RsaXN0VHlwZUNoZWNrbGlzdFN1cGVyTmF0aXZlVHlwZUNhc3RsaXN0U3VwZXJOYXRpdmVUeXBlQ2hlY2tsaXN0U3VwZXJUeXBlQ2FzdGxpc3RTdXBlclR5cGVDaGVja2ludGVyY2VwdGVkVHlwZUNhc3RpbnRlcmNlcHRlZFR5cGVDaGVja3Byb3BlcnR5VHlwZUNhc3Rwcm9wZXJ0eVR5cGVDaGVja2Z1bmN0aW9uVHlwZUNhc3RmdXR1cmVPckNhc3RmdXR1cmVPckNoZWNrY2hlY2tlZE1vZGVIZWxwZXJCeU5hbWVnZXRDaGVja2VkTW9kZUhlbHBlcnR5cGVDYXN0Z2V0Q2hlY2tlZE1vZGVIZWxwZXJJbnRlcm5hbG5hdGl2ZUNoZWNrT25seWdldE5hdGl2ZUNoZWNrZWRNb2RlSGVscGVyZ2V0Q2hlY2tlZE1vZGVIZWxwZXJOYW1lSW50ZXJuYWxVbmV4cGVjdGVkIHR5cGU6IG5hdGl2ZUNoZWNrVHlwZUNhc3RudW1iZXJPclN0cmluZ1N1cGVyTmF0aXZlbnVtYmVyT3JTdHJpbmdTdXBlcnN0cmluZ1N1cGVyTmF0aXZlc3RyaW5nU3VwZXJsaXN0U3VwZXJOYXRpdmVsaXN0U3VwZXJqc19iYWNrZW5kLmJhY2tlbmQuY29kZWdlbl9saXN0ZW5lckNvZGVnZW5FbnF1ZXVlckxpc3RlbmVyX2ltcGFjdHNfYmFja2VuZFVzYWdlX2N1c3RvbUVsZW1lbnRzQW5hbHlzaXNfbmF0aXZlRW5xdWV1ZXJfaXNOb1N1Y2hNZXRob2RVc2VkX3JlZ2lzdGVyQ29tcHV0ZVNpZ25hdHVyZV9jb21wdXRlTWFpbkltcGFjdF9jb21wdXRlSW1wYWN0Rm9yQ29tcGlsZVRpbWVDb25zdGFudF9jb21wdXRlSW1wYWN0Rm9yQ29tcGlsZVRpbWVDb25zdGFudEludGVybmFsX2NvbXB1dGVJbXBhY3RGb3JJbnN0YW50aWF0ZWRDb25zdGFudFR5cGVyZWdpc3RlclR5cGVDb25zdGFudF9wcm9jZXNzQ2xhc3NKYXZhU2NyaXB0Q29uc3RhbnRUYXNrQ29uc3RhbnRIYW5kbGVySmF2YVNjcmlwdENvbnN0YW50Q29tcGlsZXJsYXp5U3RhdGljc2dldExhemlseUluaXRpYWxpemVkRmllbGRzRm9yRW1pc3Npb25DdXN0b21FbGVtZW50c0FuYWx5c2lzQmFzZWRlbWFuZGVkQ3VzdG9tRWxlbWVudHNSZXNvbHV0aW9uQW5hbHlzaXNhbGxDbGFzc2VzU2VsZWN0ZWRyZWdpc3RlclR5cGVMaXRlcmFsc2VsZWN0ZWRDbGFzc2VzQ3VzdG9tRWxlbWVudHNDb2RlZ2VuQW5hbHlzaXNuZWVkc1RhYmxlbmVlZHNDbGFzc2FjdGl2ZUNsYXNzZXNjb21wdXRlRXNjYXBpbmdDb25zdHJ1Y3RvcnNDdXN0b21FbGVtZW50c0FuYWx5c2lzSm9pbmZvclJlc29sdXRpb25uZXdBY3RpdmVDbGFzc2VzaXNFeHRlbnNpb25lc2NhcGluZ0NvbnN0cnVjdG9yc19tYWtlVHlwZUNvbnN0YW50anNfYmFja2VuZC5iYWNrZW5kLmltcGFjdF90cmFuc2Zvcm1lckphdmFTY3JpcHRJbXBhY3RUcmFuc2Zvcm1lcmhhc0FzQ2FzdGhhc1R5cGVMaXRlcmFsb25Jc0NoZWNrbWFwTGl0ZXJhbFVzZW1hcExpdGVyYWxzc2V0TGl0ZXJhbFVzZWxpc3RMaXRlcmFsVXNlbGlzdExpdGVyYWxzY29uc3RTeW1ib2xOYW1lc2NvbnN0YW50TGl0ZXJhbHNVbmV4cGVjdGVkIGNvbnN0YW50IGxpdGVyYWw6IGNsYXNzRW50aXR5c2VlbkNsYXNzZXNDb2RlZ2VuSW1wYWN0VHJhbnNmb3JtZXJvbklzQ2hlY2tGb3JDb2RlZ2VuanNfYmFja2VuZC5uYW1lckhhc2hNYXBmaWVsZF9uYW1pbmdfbWl4aW4uZGFydGZyZXF1ZW5jeV9uYW1lci5kYXJ0bWluaWZ5X25hbWVyLmRhcnRuYW1lcl9uYW1lcy5kYXJ0amF2YVNjcmlwdEtleXdvcmRzaW5zdGFuY2VvZnR5cGVvZmRlYnVnZ2VyZGVsZXRlcHVibGljcHJvdGVjdGVkcmVzZXJ2ZWRQcm9wZXJ0eVN5bWJvbHNwcm90b3R5cGVldmFscmVzZXJ2ZWRHbG9iYWxTeW1ib2xzTmFOSW5maW5pdHl1bmRlZmluZWRwYXJzZUludHBhcnNlRmxvYXRkZWNvZGVVUklkZWNvZGVVUklDb21wb25lbnRlbmNvZGVVUkllbmNvZGVVUklDb21wb25lbnRBcnJheUJvb2xlYW5OdW1iZXJEYXRlUmVnRXhwRXZhbEVycm9yUmFuZ2VFcnJvclJlZmVyZW5jZUVycm9yU3ludGF4RXJyb3JUeXBlRXJyb3JVUklFcnJvcmFwcGxpY2F0aW9uQ2FjaGVjbG9zZWRDb21wb25lbnRzY29udHJvbGxlcnNjcnlwdG9kZWZhdWx0U3RhdHVzZGlhbG9nQXJndW1lbnRzZGlyZWN0b3JpZXNkb2N1bWVudGZyYW1lRWxlbWVudGZ1bGxTY3JlZW5nbG9iYWxTdG9yYWdlaGlzdG9yeWlubmVySGVpZ2h0aW5uZXJXaWR0aGxvY2F0aW9uYmFybG9jYWxTdG9yYWdlbWVudWJhcm1veklubmVyU2NyZWVuWG1veklubmVyU2NyZWVuWW1velNjcmVlblBpeGVsc1BlckNzc1BpeGVsbmF2aWdhdG9yb3BlbmVyb3V0ZXJIZWlnaHRvdXRlcldpZHRocGFnZVhPZmZzZXRwYWdlWU9mZnNldHBlcnNvbmFsYmFycGtjczExc2NyZWVuc2Nyb2xsYmFyc3Njcm9sbE1heFhzY3JvbGxNYXhZc2Vzc2lvblN0b3JhZ2VzaWRlYmFyc3RhdHVzYmFydG9vbGJhcndpbmRvd2FsZXJ0YWRkRXZlbnRMaXN0ZW5lcmF0b2JiYWNrYmx1cmJ0b2FjYXB0dXJlRXZlbnRzY2xlYXJJbnRlcnZhbGNsZWFyVGltZW91dGNvbmZpcm1kaXNhYmxlRXh0ZXJuYWxDYXB0dXJlZGlzcGF0Y2hFdmVudGVuYWJsZUV4dGVybmFsQ2FwdHVyZWZpbmRmb2N1c2ZvcndhcmRHZWNrb0FjdGl2ZVhPYmplY3RnZXRBdHRlbnRpb25nZXRBdHRlbnRpb25XaXRoQ3ljbGVDb3VudGdldENvbXB1dGVkU3R5bGVnZXRTZWxlY3Rpb25ob21lbWF4aW1pemVtaW5pbWl6ZW1vdmVCeW1vdmVUb29wZW5EaWFsb2dwb3N0TWVzc2FnZXByaW50cHJvbXB0UXVlcnlJbnRlcmZhY2VyZWxlYXNlRXZlbnRzcmVtb3ZlRXZlbnRMaXN0ZW5lcnJlc2l6ZUJ5cmVzaXplVG9yb3V0ZUV2ZW50c2Nyb2xsc2Nyb2xsQnlzY3JvbGxCeUxpbmVzc2Nyb2xsQnlQYWdlc3Njcm9sbFRvc2V0SW50ZXJ2YWxzZXRSZXNpemVhYmxlc2V0VGltZW91dHNob3dNb2RhbERpYWxvZ3NpemVUb0NvbnRlbnR1dWVzY2FwZXVwZGF0ZUNvbW1hbmRzWFBDTmF0aXZlV3JhcHBlclhQQ1NhZmVKU09qYmVjdFdyYXBwZXJvbmFib3J0b25iZWZvcmV1bmxvYWRvbmNoYW5nZW9uY2xpY2tvbmNsb3Nlb25jb250ZXh0bWVudW9uZHJhZ2Ryb3BvbmVycm9yb25mb2N1c29uaGFzaGNoYW5nZW9ua2V5ZG93bm9ua2V5cHJlc3NvbmtleXVwb25sb2Fkb25tb3VzZWRvd25vbm1vdXNlbW92ZW9ubW91c2VvdXRvbm1vdXNlb3Zlcm9ubW91c2V1cG9ubW96b3JpZW50YXRpb25vbnBhaW50b25yZXNldG9ucmVzaXplb25zY3JvbGxvbnNlbGVjdG9uc3VibWl0b251bmxvYWRvbnRvdWNoY2FuY2Vsb250b3VjaGVuZG9udG91Y2htb3Zlb250b3VjaHN0YXJ0b25nZXN0dXJlc3RhcnRvbmdlc3R1cmVjaGFuZ2Vvbmdlc3R1cmVlbmR1bmV2YWxnZXRQcm90b3R5cGVPZmF0dGFjaEV2ZW50Y2xpZW50SW5mb3JtYXRpb25jbGlwYm9hcmREYXRhY3JlYXRlUG9wdXBkaWFsb2dIZWlnaHRkaWFsb2dMZWZ0ZGlhbG9nVG9wZGlhbG9nV2lkdGhvbmFmdGVycHJpbnRvbmJlZm9yZWRlYWN0aXZhdGVvbmJlZm9yZXByaW50b25jb250cm9sc2VsZWN0b25kZWFjdGl2YXRlb25oZWxwb25yZXNpemVlbmREZWJ1Z0VudW1lcmF0b3JHbG9iYWxJbWFnZUFjdGl2ZVhPYmplY3RWQkFycmF5QW5jaG9yQXBwbGV0QXR0ckNhbnZhc0NhbnZhc0dyYWRpZW50Q2FudmFzUGF0dGVybkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRENEQVRBU2VjdGlvbkNoYXJhY3RlckRhdGFDb21tZW50Q1NTMlByb3BlcnRpZXNDU1NSdWxlQ1NTU3R5bGVTaGVldERvY3VtZW50RG9jdW1lbnRGcmFnbWVudERvY3VtZW50VHlwZURPTUV4Y2VwdGlvbkRPTUltcGxlbWVudGF0aW9uRE9NUGFyc2VyRWxlbWVudEV2ZW50RXh0ZXJuYWxJbnRlcmZhY2VGbGFzaFBsYXllckZvcm1GcmFtZUhpc3RvcnlIVE1MQ29sbGVjdGlvbkhUTUxEb2N1bWVudEhUTUxFbGVtZW50SUZyYW1lSlNPYmplY3RLZXlFdmVudE1pbWVUeXBlTW91c2VFdmVudE5hdmlnYXRvck5vZGVMaXN0UGx1Z2luUHJvY2Vzc2luZ0luc3RydWN0aW9uUmFuZ2VSYW5nZUV4Y2VwdGlvblNjcmVlblNlbGVjdFRhYmxlVGFibGVDZWxsVGFibGVSb3dUYWJsZVNlbGVjdGlvblRleHRUZXh0QXJlYVVJRXZlbnRXaW5kb3dYTUxIdHRwUmVxdWVzdFhNTFNlcmlhbGl6ZXJYUGF0aEV4Y2VwdGlvblhQYXRoUmVzdWx0WFNMVFByb2Nlc3NvcmphdmFuZXRzY2FwZXN1bkphdmFPYmplY3RKYXZhQ2xhc3NKYXZhQXJyYXlKYXZhTWVtYmVycmVzZXJ2ZWRHbG9iYWxPYmplY3ROYW1lc0RGR0hKT1FXWFlacmVzZXJ2ZWRHbG9iYWxIZWxwZXJGdW5jdGlvbnN1c2VyR2xvYmFsT2JqZWN0c19qc1Jlc2VydmVkX2pzVmFyaWFibGVSZXNlcnZlZGFzeW5jUHJlZml4JGFzeW5jJHN0YXRpY1N0YXRlSG9sZGVyZ2V0JGxhenlHZXR0ZXJQcmVmaXgkZ2V0JHNldCRzdXBlclByZWZpeHN1cGVyJG1ldGFkYXRhRmllbGRjYWxsUHJlZml4Y2FsbE5hbWVGaWVsZCRjYWxsTmFtZXN0dWJOYW1lRmllbGQkc3R1Yk5hbWVyZWZsZWN0YWJsZUZpZWxkJHJlZmxlY3RhYmxlcmVmbGVjdGlvbkluZm9GaWVsZCRyZWZsZWN0aW9uSW5mb3JlZmxlY3Rpb25OYW1lRmllbGQkcmVmbGVjdGlvbk5hbWVtZXRhZGF0YUluZGV4RmllbGQkbWV0YWRhdGFJbmRleG1ldGhvZHNXaXRoT3B0aW9uYWxBcmd1bWVudHNGaWVsZCRtZXRob2RzV2l0aE9wdGlvbmFsQXJndW1lbnRzZGVmZXJyZWRBY3Rpb24kZGVmZXJyZWRBY3Rpb25jbGFzc0Rlc2NyaXB0b3JQcm9wZXJ0eV9jYWxsUHJlZml4RG9sbGFyY2FsbCRfbGl0ZXJhbERvbGxhcl9saXRlcmFsVW5kZXJzY29yZWxpdGVyYWxQbHVzX2xpdGVyYWxEeW5hbWljX2xpdGVyYWxBc3luY1ByZWZpeF9saXRlcmFsR2V0dGVyUHJlZml4X2xpdGVyYWxTZXR0ZXJQcmVmaXhfc3RhdGljc1Byb3BlcnR5TmFtZXJ0aU5hbWUkdGlfcnRpRmllbGRKc05hbWVuYXRpdmVTcGVjUHJvcGVydHleW0EtWmEtel8kXVtBLVphLXowLTlfJF0qJE5PTl9JREVOVElGSUVSX0NIQVJbXkEtWmEtel8wLTkkXWdsb2JhbFNjb3BldXNlckdsb2JhbHN1c2VyR2xvYmFsc1NlY29uZE5hbWVpbnRlcm5hbEdsb2JhbHNpbnN0YW5jZVNjb3BldXNlckluc3RhbmNlTWVtYmVyc3VzZXJJbnN0YW5jZU1lbWJlcnNPcmlnaW5hbE5hbWVpbnRlcm5hbEluc3RhbmNlTWVtYmVyc3VzZXJJbnN0YW5jZU9wZXJhdG9yc3VzZXJHZXR0ZXJzdXNlclNldHRlcnNfY29uc3RhbnRTY29wZV9wcml2YXRlTmFtaW5nU2NvcGVzcG9wdWxhck5hbWVDb3VudGVyc2xpYnJhcnlMb25nTmFtZXNfY29uc3RhbnROYW1lc19jb25zdGFudExvbmdOYW1lc19jb25zdGFudEhhc2hlcnNob3J0UHJpdmF0ZU5hbWVPd25lcnNfbGlicmFyeUtleXNfbm9uSWRlbnRpZmllclJFW15BLVphLXowLTlfJF1mdW5jdGlvblR5cGVOYW1lTWFwX2Z1bmN0aW9uVHlwZU5hbWVyanNSZXNlcnZlZGpzVmFyaWFibGVSZXNlcnZlZGNhbGxDYXRjaEFsbE5hbWVjYWxsKnJlcXVpcmVkUGFyYW1ldGVyRmllbGQkcmVxdWlyZWRBcmdDb3VudGRlZmF1bHRWYWx1ZXNGaWVsZCRkZWZhdWx0VmFsdWVzc3RhdGljc1Byb3BlcnR5TmFtZXJ0aUZpZWxkSnNOYW1lTmFtZXIucnRpRW5jb2RlciBoYXMgbm90IGJlZW4gc2V0Lk5hbWVyLnJ0aUVuY29kZXIgaGFzIGFscmVhZHkgYmVlbiBzZXQuX3JlZ2lzdGVyTmFtZWpzTmFtZWlzRmluYWxpemVkZ2V0dGVyTmFtZXNldHRlck5hbWVjcmVhdGVNaW5pZmllZEdsb2JhbE5hbWVNYXBjcmVhdGVNaW5pZmllZEluc3RhbmNlTmFtZU1hcGRlZmVycmVkTWV0YWRhdGFOYW1lZGVmZXJyZWRNZXRhZGF0YWRlZmVycmVkVHlwZXNOYW1lZGVmZXJyZWRUeXBlc2lzb2xhdGVOYW1laXNvbGF0ZVByb3BlcnRpZXNOYW1lJGlzb2xhdGVQcm9wZXJ0aWVzaW52b2NhdGlvbk5hbWVTVEFUSUNfQ0xPU1VSRV9OQU1FX05BTUUkbmFtZWNsb3N1cmVJbnZvY2F0aW9uU2VsZWN0b3JOYW1lc2hvdWxkTWluaWZ5X2dldFByaXZhdGVTY29wZUZvcnJvb3RPZlNjb3BlZ2V0TmFtZUZvckpzR2V0TmFtZWFzTmFtZW9wZXJhdG9yQXNQcmVmaXhvcGVyYXRvclNpZ25hdHVyZWZ1bmN0aW9uVHlwZVZvaWRSZXR1cm5UYWdydW50aW1lVHlwZU5hbWVFcnJvcjogTmFtZXIgaGFzIG5vIG5hbWUgZm9yICJfbmV3UmVmZXJlbmNlY29uc3RhbnROYW1lbG9uZ05hbWVjb25zdGFudExvbmdOYW1lZ2V0RnJlc2hOYW1lYnJlYWtMYWJlbE5hbWVpbXBsaWNpdEJyZWFrTGFiZWxOYW1lY29udGludWVMYWJlbE5hbWVjJGltcGxpY2l0Q29udGludWVMYWJlbE5hbWVwcml2YXRlTmFtZV9wcm9wb3NlTmFtZUZvckxpYnJhcnlfcHJvcG9zZU5hbWVGb3JDb25zdHJ1Y3RvckJvZHljYWxsU3VmZml4Rm9yU2lnbmF0dXJlY29uc3RydWN0b3JCb2R5TmFtZWN0b3JfZGlzYW1iaWd1YXRlSW50ZXJuYWxNZW1iZXJnZW5lcmF0b3JCb2R5SW5zdGFuY2VNZXRob2ROYW1lb3BlcmF0b3JOYW1lVG9JZGVudGlmaWVyJGJvZHkkaW5zdGFuY2VNZXRob2ROYW1lZGVyaXZlQ2FsbE1ldGhvZE5hbWVjYWxsU3VmZml4Rm9yU3RydWN0dXJlc3VmZml4ZXNkaXNhbWJpZ3VhdGVkTmFtZV9kaXNhbWJpZ3VhdGVNZW1iZXJkZXJpdmVHZXR0ZXJOYW1lZGVyaXZlU2V0dGVyTmFtZW9wZXJhdG9ySWRlbnRpZmllcl9kaXNhbWJpZ3VhdGVPcGVyYXRvcnNwZWNpYWxTZWxlY3Rvck5hbWVVbmV4cGVjdGVkIHNlbGVjdG9yIGtpbmQ6IGdlbmVyaWNJbnN0YW50aWF0aW9uUHJlZml4VW5leHBlY3RlZCBzcGVjaWFsIHNlbGVjdG9yOiBpbnZvY2F0aW9uTWlycm9ySW50ZXJuYWxOYW1lZmllbGRBY2Nlc3Nvck5hbWVfZGlzYW1iaWd1YXRlR2xvYmFsTWVtYmVyZmllbGRQcm9wZXJ0eU5hbWVpbnN0YW5jZUZpZWxkUHJvcGVydHlOYW1lZ2xvYmFsUHJvcGVydHlOYW1lRm9yTWVtYmVyZ2xvYmFsUHJvcGVydHlOYW1lRm9yQ2xhc3NfZGlzYW1iaWd1YXRlR2xvYmFsVHlwZWdsb2JhbFByb3BlcnR5TmFtZUZvclR5cGVkZWNsYXJlZE5hbWVfaXNTaGFkb3dpbmdTdXBlckZpZWxkX2lzVXNlckNsYXNzRXh0ZW5kaW5nTmF0aXZlZmllbGROYW1lbWVtYmVyTGlicmFyeWZvdW5kTWVtYmVyc2V0dGVyRm9yTWVtYmVyZ2V0dGVyRm9yRWxlbWVudGdldHRlckZvck1lbWJlcl9kaXNhbWJpZ3VhdGVJbnRlcm5hbEdsb2JhbG5ld05hbWVfZ2VuZXJhdGVMaWJyYXJ5S2V5a2V5QmFzZV9kaXNhbWJpZ3VhdGVHbG9iYWxfcHJvcG9zZU5hbWVGb3JNZW1iZXJfcHJvcG9zZU5hbWVGb3JUeXBlZ2xvYmFsc2xpYnJhcnlLZXlzYW5pdGl6ZUZvckFubm90YXRpb25zX2Rpc2FtYmlndWF0ZU1lbWJlckJ5S2V5cmVzZXJ2ZVB1YmxpY01lbWJlck5hbWVsaWJyYXJ5UHJlZml4aXNVc2VkcmVnaXN0ZXJVc2VzYW5pdGl6ZUZvck5hdGl2ZXNtYXlDbGFzaE5hdGl2ZV9nZW5lcmF0ZUZyZXNoU3RyaW5nRm9yTmFtZV9zYW5pdGl6ZUZvckFubm90YXRpb25zX3Nhbml0aXplRm9yTmF0aXZlc19zYW5pdGl6ZUZvcktleXdvcmRzaXNVbnVzZWRfcHJvcG9zZU5hbWVGb3JDb25zdHJ1Y3RvciRib2R5X3Byb3Bvc2VOYW1lRm9yTGF6eVN0YXRpY0dldHRlcnJlcGxhY2VycmVwbGFjZUFsbE1hcHBlZGxpYl9kaXNhbWJpZ3VhdGVkc3VmZml4Rm9yR2V0SW50ZXJjZXB0b3JhYmJyZXZpYXRlSV9nZXRTdWZmaXhGb3JJbnRlcmNlcHRlZENsYXNzZXNnZXRJbnRlcmNlcHRvciRhbGlhc2VkU3VwZXJNZW1iZXJQcm9wZXJ0eU5hbWVfaXNQcm9wZXJ0eU9mU3RhdGljU3RhdGVIb2xkZXJnbG9iYWxPYmplY3RGb3JNZW1iZXJnbG9iYWxPYmplY3RGb3JMaWJyYXJ5Z2xvYmFsT2JqZWN0Rm9yQ2xhc3NnbG9iYWxPYmplY3RGb3JUeXBlbGF6eUluaXRpYWxpemVyTmFtZXN0YXRpY0Nsb3N1cmVOYW1lJGNsb3N1cmVnbG9iYWxPYmplY3RGb3JDb25zdGFudG9wZXJhdG9ySXNQcmVmaXgkaXMkYXMkc2lnbmF0dXJlJGluc3RhbnRpYXRlZnVuY3JldG9wdHR5cGVzT2Zmc2V0TmFtZXR5cGVzT2Zmc2V0Z2V0RnVuY3Rpb25UeXBlTmFtZWNvbXB1dGVOYW1lJGVxJG5vdCRpbmRleCRpbmRleFNldCRtdWwkZGl2JG1vZCR0ZGl2JGFkZCRzaGwkc2hyJGdlJGxlJGFuZCR4b3Ikb3IkbmVnYXRlQ29uc3RhbnROYW1pbmdWaXNpdG9yTUFYX0ZSQUdNRU5UU01BWF9FWFRSQV9MRU5HVEhERUZBVUxUX1RBR19MRU5HVEhoYXNoZXJmYWlsZWRmcmFnbWVudHNfdmlzaXRDT05TVEFOVGdldEhhc2hUYWdDX2hhc2hXb3JkZ2V0SGFzaGRpZ2l0MDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphZGRSb290YWRkSWRlbnRpZmllcm1ldGhvZHNkdW1teV9yZWNlaXZlclVuZXhwZWN0ZWQgU3ludGhldGljQ29uc3RhbnRWYWx1ZURlZmVycmVkQ29uc3RhbnRDYW5vbmljYWxIYXNoZXJfTUFTS19VSU5UMzJfTElNSVRoYXNoZXNfaGFzaFN0cmluZ19oYXNoTGlzdFN5bnRoZXRpY0NvbnN0YW50VmFsdWUgc2hvdWxkIG5ldmVyIGJlIG5hbWVkIGFuZCBuZXZlciBiZSBzdWJjb25zdGFudF9oYXNoSW50X2hhc2hEb3VibGVtYWduaXR1ZGVzaWduZnJhY3Rpb25fY29tYmluZUZ1bmN0aW9uVHlwZU5hbWVyTmFtaW5nU2NvcGVfc3VnZ2VzdGVkTmFtZXNfdXNlZE5hbWVzc3VnZ2VzdE5hbWVhZGRTdWdnZXN0aW9uc3VnZ2VzdGlvbmhhc1N1Z2dlc3Rpb25pc1N1Z2dlc3Rpb25fTWluaWZpZWRGaWVsZE5hbWVyZmllbGRSZWdpc3RyeV9taW5pZmllZEluc3RhbmNlRmllbGRQcm9wZXJ0eU5hbWVib3hjb250YWluc0ZpZWxkX0ZpZWxkTmFtaW5nUmVnaXN0cnlnbG9iYWxOYW1lc2dsb2JhbENvdW50bmFtZVN0b3JlX0ZpZWxkTmFtaW5nU2NvcGVzdXBlclNjb3BlX2ZpZWxkTmFtZUNvdW50ZXJyb290U2NvcGVpbmhlcml0aW5oZXJpdGFuY2VCYXNlZEZpZWxkTmFtZUNvdW50ZXJfbG9jYWxGaWVsZE5hbWVDb3VudGVydmFsZm9yQ2xhc3Nmb3JCb3hfaXNOYW1lVW51c2VkX25leHROYW1lX01peGluRmllbGROYW1pbmdTY29wZW1peGVkSW5wcm9wb3NlZF9Cb3hGaWVsZE5hbWluZ1Njb3BlX0ZyZXF1ZW5jeUJhc2VkTmFtZXImTmFtZXImX01pbmlmaWVkRmllbGROYW1lcl9GcmVxdWVuY3lCYXNlZE5hbWVyJk5hbWVyJl9NaW5pZmllZEZpZWxkTmFtZXImX01pbmlmaWVkT25lU2hvdEludGVyY2VwdG9yTmFtZXIkZ2V0JHNldGNhbGxTdWZmaXgkaW50ZXJjZXB0ZWRGcmVxdWVuY3lCYXNlZE5hbWVyX3Rva2VuU2NvcGVzbmV3U2NvcGVGb3JpbGxlZ2FsTmFtZXNpbGxlZ2FsdG9rZW5TY29wZWNvbXBhcmVSZWZlcmVuY2VDb3VudF9yY1Rva2VuU2NvcGVfaW5jcmVtZW50UG9zaXRpb25vdmVyZmxvd19pbmNyZW1lbnROYW1lZ2V0TmV4dE5hbWVwcm9wb3NhbF9NaW5pZnlOYW1lciZOYW1lciZfTWluaWZpZWRGaWVsZE5hbWVyX01pbmlmeU5hbWVyJk5hbWVyJl9NaW5pZmllZEZpZWxkTmFtZXImX01pbmlmeUNvbnN0cnVjdG9yQm9keU5hbWVyX2NvbnN0cnVjdG9yQm9keVNjb3Blc2NvbnN0cnVjdG9yQm9keUtleUZvcl9NaW5pZnlOYW1lciZOYW1lciZfTWluaWZpZWRGaWVsZE5hbWVyJl9NaW5pZnlDb25zdHJ1Y3RvckJvZHlOYW1lciZfTWluaWZpZWRPbmVTaG90SW50ZXJjZXB0b3JOYW1lck1pbmlmeU5hbWVyQUxQSEFCRVRfQ0hBUkFDVEVSU0FMUEhBTlVNRVJJQ19DSEFSQUNURVJTX3Jlc2VydmVkTmF0aXZlUHJvcGVydGllc2NoY3hjeWRiZHhkeWZyZnhmeWdvazFrMmszazRyeHJ5eDF4MnkxeTJhbHRhcmNDQ1dpbjFpbjJtMTFtMTJtMTNtMTRtMjFtMjJtMjNtMjRtMzFtMzJtMzNtMzRtNDFtNDJtNDNtNDRub3dPTkVyZWxyZXZSR0JzZHB1aWR1cmxVUkxhYmJyYXhlc2F4aXNCQUNLYmV0YWJpYXNCbG9iQkxVUkJPVEhCWVRFY2l0ZWNsaXBjb2xzY3Vlc0RFQ1JET05FZmFjZWZvbnRmb3JtZ2FpbmhyZWZIUlRGSURMRUlOQ1JJTklUaXNJZEtFRVBrbmVlbGFuZ0xFU1NOb25lb25seU9QRU5waW5ncGxheXJlY3RSZWN0cmVmWHJlZllSR0JBcm93c3NhdmVzZWVkc2Vla1NJTkVzdGF0dmlld3dhcm5aRVJPX2JhZE5hbWVzcmVzZXJ2ZUJhY2tlbmROYW1lc19nZXRVbnVzZWROYW1lX3BvcHVsYXRlU3VnZ2VzdGVkTmFtZXNhZGQkMSRuZWNsb25lJDBtb3ZlTmV4dCQwc3R5bGVub1N1Y2hNZXRob2QkMXRvU3RyaW5nJDBVbnN1cHBvcnRlZEVycm9yJEFyZ3VtZW50RXJyb3IkU3RhdGVFcnJvciRLZXlfS2V5TGlzdF9MaXN0JGZyb21MaW5rZWRIYXNoTWFwX0xpbmtlZEhhc2hNYXAkX2VtcHR5TGlua2VkSGFzaE1hcF9MaW5rZWRIYXNoTWFwJF9saXRlcmFsUmFuZ2VFcnJvciR2YWx1ZXN1Z2dlc3Rpb25zbGV0dGVyX2NhbGN1bGF0ZUhhc2hjb2Rlc19sZXR0ZXJOdW1iZXJoMl9hbHBoYU51bWVyaWNOdW1iZXJfYmFkTmFtZV9oYXNCYW5uZWRQcmVmaXhzdGFydExldHRlcl9Db25zdHJ1Y3RvckJvZHlOYW1pbmdTY29wZV9zdGFydEluZGV4X2NvbnN0cnVjdG9yc251bWJlck9mQ29uc3RydWN0b3JzZm9yTWl4aW5BcHBsaWNhdGlvbmNvbnN0cnVjdG9yIGJvZHkgbWlzc2luZ0Bjb25zdHJ1Y3RvckJvZHlAX2dldENvbnN0cnVjdG9yTGlzdF9NaW5pZnlDb25zdHJ1Y3RvckJvZHlOYW1lcl9NaW5pZmllZE9uZVNob3RJbnRlcmNlcHRvck5hbWVyX05hbWVyTmFtZU5hbWUoQ2Fubm90IGNvbnZlcnQgYSBuYW1lIHRvIGEgc3RyaW5nX05hbWVyTmFtZUtpbmRzU3RyaW5nQmFja2VkX05hbWVyTmFtZUtpbmRzLlN0cmluZ0JhY2tlZF9OYW1lck5hbWVLaW5kcy5HZXR0ZXJfTmFtZXJOYW1lS2luZHMuU2V0dGVyX05hbWVyTmFtZUtpbmRzLkFzeW5jQ29tcG91bmRfTmFtZXJOYW1lS2luZHMuQ29tcG91bmRfTmFtZXJOYW1lS2luZHMuVG9rZW5TdHJpbmdCYWNrZWROYW1lX2Nsb25lX1ByZWZpeGVkTmFtZW90aGVyU2FtZUtpbmRHZXR0ZXJOYW1lU2V0dGVyTmFtZV9Bc3luY05hbWVhbGxvd1JlbmFtZUNvbXBvdW5kTmFtZV9wYXJ0c19jYWNoZWROYW1lVG9rZW5OYW1lb3RoZXJUb2tlblRva2VuTmFtZSgpPSBoYXMgYWxyZWFkeSBiZWVuIGZpbmFsaXplZC5fTmFtZVJlZmVyZW5jZWpzX2JhY2tlbmQuYmFja2VuZC5yZXNvbHV0aW9uX2xpc3RlbmVyUmVzb2x1dGlvbkVucXVldWVyTGlzdGVuZXJfZGVmZXJyZWRMb2FkVGFza19pc0xvYWRMaWJyYXJ5RnVuY3Rpb25SZXNvbHZlZF9yZWdpc3RlckJhY2tlbmRJbXBhY3RfYWRkSW50ZXJjZXB0b3JzX2NvbXB1dGVEZWZlcnJlZExvYWRpbmdJbXBhY3RkZWZlcnJlZCBsb2FkbmF0aXZlIGNsYXNzZXNtYWluIGltcGFjdGNvbXB1dGVIZWxwZXJzSW1wYWN0YWxsUGFyYW1ldGVyVHlwZXNfcmVnaXN0ZXJSdW50aW1lVHlwZV9yZWdpc3RlckNoZWNrZWRNb2RlSGVscGVyc3VuaXZlcnNlLnNpZGVfZWZmZWN0c3NpZGUtZWZmZWN0c0ZMQUdfQ0hBTkdFU19JTkRFWEZMQUdfQ0hBTkdFU19JTlNUQU5DRV9QUk9QRVJUWUZMQUdfQ0hBTkdFU19TVEFUSUNfUFJPUEVSVFlGTEFHX0NIQU5HRVNfQ09VTlRGTEFHX0RFUEVORFNfT05fSU5ERVhfU1RPUkVGTEFHX0RFUEVORFNfT05fSU5TVEFOQ0VfUFJPUEVSVFlfU1RPUkVGTEFHX0RFUEVORFNfT05fU1RBVElDX1BST1BFUlRZX1NUT1JFRkxBR19ERVBFTkRTX09OX0NPVU5UX2ZsYWdzZnJvbUZsYWdzU2lkZUVmZmVjdHMuaGFzaENvZGVfZ2V0RmxhZ19zZXRGbGFnX2NsZWFyRmxhZ2dldENoYW5nZXNGbGFnc2dldERlcGVuZHNPbkZsYWdzZGVwZW5kc09uU3RhdGljUHJvcGVydHlTdG9yZWNsZWFyRGVwZW5kc09uU3RhdGljUHJvcGVydHlTdG9yZWNsZWFyQ2hhbmdlc1N0YXRpY1Byb3BlcnR5Y2hhbmdlc1N0YXRpY1Byb3BlcnR5ZGVwZW5kc09uSW5kZXhTdG9yZWNsZWFyRGVwZW5kc09uSW5kZXhTdG9yZWNsZWFyQ2hhbmdlc0luZGV4Y2hhbmdlc0luZGV4ZGVwZW5kc09uSW5zdGFuY2VQcm9wZXJ0eVN0b3JlY2xlYXJEZXBlbmRzT25JbnN0YW5jZVByb3BlcnR5U3RvcmVjbGVhckNoYW5nZXNJbnN0YW5jZVByb3BlcnR5Y2hhbmdlc0luc3RhbmNlUHJvcGVydHljb21wdXRlRGVwZW5kc09uRmxhZ3NkZXBlbmRzT25kZXBlbmRzRmxhZ3NzZXRUb1NpZGVFZmZlY3RzKHJlYWRzIG5vdGhpbmcgYW55dGhpbmcgaW5kZXggZmllbGQgc3RhdGljOyB3cml0ZXNTaWRlRWZmZWN0c0J1aWxkZXJfbWVtYmVyX2ZyZWVfZGVwZW5kaW5nZnJlZVNpZGVFZmZlY3RzQnVpbGRlcihtZW1iZXI9ZnJlZT1zaWRlRWZmZWN0cz1kZXBlbmRpbmc9ZGFydDJqcy5zb3VyY2VfaW5mb3JtYXRpb24ua2VybmVsX2JhY2tlbmRTdHJhdGVneUtlcm5lbFNvdXJjZUluZm9ybWF0aW9uQnVpbGRlcndpdGhDb250ZXh0X2dldFNvdXJjZUxvY2F0aW9uTm8gbG9jYXRpb24gZm91bmQgZm9yIF9idWlsZEZ1bmN0aW9uX2J1aWxkVHJlZU5vZGVfYnVpbGRGdW5jdGlvbkVuZF9idWlsZEZ1bmN0aW9uRXhpdF9idWlsZEJvZHlfYnVpbGRNZW1iZXJCb2R5X2J1aWxkTWVtYmVyRXhpdG5ld0NvbnRleHRLZXJuZWxTb3VyY2VMb2NhdGlvbmNvbXB1dGVLZXJuZWxFbGVtZW50TmFtZUZvclNvdXJjZU1hcHM8YW5vbnltb3VzIGZ1bmN0aW9uPi48YW5vbnltb3VzIGZ1bmN0aW9uPmVuY2xvc2luZ01lbWJlcmVuY2xvc2luZ01lbWJlck5hbWVqcy5zb3VyY2VfbWFwcGluZ0phdmFTY3JpcHRTb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5c291cmNlTWFwcGVyUHJvdmlkZXJyZWFkZXJTb3VyY2VJbmZvcm1hdGlvblJlYWRlcmdldFNvdXJjZUluZm9ybWF0aW9uQ29kZVBvc2l0aW9uTGlzdGVuZXJTb3VyY2VNYXBwZXJQcm92aWRlcmNyZWF0ZVNvdXJjZU1hcHBlclNvdXJjZU1hcHBlclByb3ZpZGVySW1wbFNvdXJjZU1hcHBlcnJlZ2lzdGVyY29kZU9mZnNldHJlZ2lzdGVyUHVzaHJlZ2lzdGVyUG9wU291cmNlTG9jYXRpb25zTWFwcGVyU291cmNlSW5mb3JtYXRpb25Qcm9jZXNzb3JUeXBlTG9va3VwdHlwZVN0cmluZ1NwZWNpYWxUeXBlSnNPYmplY3Q9T2JqZWN0VW5rbm93biBTcGVjaWFsVHlwZSAnTmF0aXZlVGhyb3dCZWhhdmlvck5FVkVSTUFZTlVMTF9OU01OVUxMX05TTV9USEVOX01BWV9iaXRzaXNOdWxsTlNNR3VhcmRuZXZlcm1heW51bGwoMSludWxsKDEpK21heU5hdGl2ZVRocm93QmVoYXZpb3IoX2JpdHNUb1ZhbHVlYml0c29ybmF0aXZlLWJlaGF2aW9yY29kZVRlbXBsYXRlVGV4dFBVUkVQVVJFX0FMTE9DQVRJT05DSEFOR0VTX09USEVSREVQRU5EU19PVEhFUnJlYWRUeXBlc3NwZWNpYWxDb3VudHBhcnNlRm9yZWlnbkpTd3JpdGVUeXBlc3NwZWNpYWxUeXBlc05hdGl2ZUJlaGF2aW9yKHJldHVybnM6ICwgY3JlYXRlczogLCBzaWRlRWZmZWN0czogLCB0aHJvd3M6ICwgaXNBbGxvY2F0aW9uLCB1c2VHdm5fbWFrZVB1cmVfbWFrZUNoYW5nZXNPdGhlcl9tYWtlRGVwZW5kc090aGVycHJvY2Vzc1NwZWNTdHJpbmdzcGVjU3RyaW5ndmFsaWRUYWdzc2V0U2lkZUVmZmVjdHNzZXRUaHJvd3NzZXRJc0FsbG9jYXRpb25sb29rdXBUeXBlc2VlbkVycm9ya25vd25UYWdzY3JlYXRlc3JldHVybnNkZXBlbmRzdGhyb3dzZ3ZucmVzb2x2ZVR5cGVzU3RyaW5nb25UeXBlb25WYXJvblZvaWR0eXBlc1N0cmluZ3NwZWNzdGFnQW5kVmFsdWVJbnZhbGlkIDx0YWc+Ojx2YWx1ZT4gcGFpciAnRHVwbGljYXRlIHRhZyAnJyBpcyBub3QgdmFsaWQgaGVyZS5Vbmtub3duIHRhZyAndGFnVmFsdWVMb29rdXB0YWdTdHJpbmdVbmtub3duICcnIHNwZWNpZmljYXRpb246ICdJbnZhbGlkIHR5cGUgc3RyaW5nICdjcmVhdGVzOnRocm93c09wdGlvbmJvb2xPcHRpb25zdGhyb3dzS2luZCduZXcnIGFuZCAnZ3ZuJyBhcmUgaW5jb21wYXRpYmxlcHJvY2Vzc0VmZmVjdHMnZWZmZWN0cycgYW5kICdkZXBlbmRzJyBtdXN0IG9jY3VyIHRvZ2V0aGVyLnNwbGl0RWZmZWN0c01pc3Npbmcgc2lkZS1lZmZlY3QgZmxhZy5lZmZlY3Ruby1pbmRleG5vLWluc3RhbmNlbm8tc3RhdGljVW5yZWNvZ25pemVkIHNpZGUtZWZmZWN0IGZsYWc6ICdzcGxpdERlcGVuZGVuY2llc01pc3Npbmcgc2lkZS1lZmZlY3QgZGVwZW5kZW5jeSBmbGFnLm9mSnNDYWxsY29kZVN0cmluZ3NpZGVFZmZlY3RzQXJlRW5jb2RlZEluU3BlY1N0cmluZ25ld0VmZmVjdHN0aHJvd0JlaGF2aW9yRnJvbVNwZWNTdHJpbmdfZmlsbE5hdGl2ZUJlaGF2aW9yT2ZCdWlsdGluT3JFbWJlZGRlZEdsb2JhbG9mSnNCdWlsdGluQ2FsbG9mSnNFbWJlZGRlZEdsb2JhbENhbGxfcGFyc2VUeXBlQmVoYXZpb3JCdWlsZGVyX2JlaGF2aW9yX292ZXJyaWRlV2l0aEFubm90YXRpb25zX2VzY2FwZV9jYXB0dXJlYnVpbGRGaWVsZExvYWRCZWhhdmlvcmJ1aWxkRmllbGRTdG9yZUJlaGF2aW9yYnVpbGRNZXRob2RCZWhhdmlvcmNyZWF0ZUFubm90YXRpb25zX2dldEFubm90YXRpb25zZ2V0Q3JlYXRlc0Fubm90YXRpb25zZ2V0UmV0dXJuc0Fubm90YXRpb25zSnVtcFZpc2l0b3JUYXJnZXRDaGVja3NTdGFja0ZyYW1lbGV0QmluZGluZ3N0eXBlSW5mZXJlbmNlTWFwc3RhdGljVHlwZVByb3ZpZGVyX0tlcm5lbFNzYUdyYXBoQnVpbGRlciZWaXNpdG9yJkdyYXBoQnVpbGRlcmluVHJ5U3RhdGVtZW50bG9jYWxzSGFuZGxlcmxvb3BEZXB0aGxhc3RPcGVuZWRCbG9ja2lzUmVhY2hhYmxlbGFzdEFkZGVkUGFyYW1ldGVyZWxpZGVkUGFyYW1ldGVyc3BvcEJvb2xpZmllZHB1c2hDaGVja051bGxkdXBjbG9zZUFuZEdvdG9FeGl0aXNBYm9ydGVkb3Blbk5ld0Jsb2NrbmV3QmxvY2thZGRQYXJhbWV0ZXJ3cmFwU3RhdGVtZW50R3JhcGh3cmFwRXhwcmVzc2lvbkdyYXBoYnVpbGRMaXRlcmFsTGlzdGNhbGxTZXRSdW50aW1lVHlwZUluZm9XaXRoVHlwZUFyZ3VtZW50c3J0aUlucHV0c25ld09iamVjdHR5cGVJbmZvY2FsbFNldFJ1bnRpbWVUeXBlSW5mb2hhbmRsZUluVHJ5U3RhdGVtZW50dGFyZ2V0RWxlbWVudHR5cGVCdWlsZGVyZ2V0RmxhZ1ZhbHVlZmxhZ05hbWVNSU5JRklFRE1VU1RfUkVUQUlOX01FVEFEQVRBVVNFX0NPTlRFTlRfU0VDVVJJVFlfUE9MSUNZX0tlcm5lbFNzYUdyYXBoQnVpbGRlciZWaXNpdG9yJkdyYXBoQnVpbGRlciZTc2FCdWlsZGVyRmllbGRNaXhpbktlcm5lbFNzYUdyYXBoQnVpbGRlcmluaXRpYWxUYXJnZXRFbGVtZW50Y3VycmVudEltcGxpY2l0SW5zdGFudGlhdGlvbnNfaW5mb1JlcG9ydGVycmV0aHJvd2FibGVFeGNlcHRpb25fc291cmNlSW5mb3JtYXRpb25TdHJhdGVneWxvb3BIYW5kbGVyX2luRXhwcmVzc2lvbk9mVGhyb3dfaW5saW5pbmdTdGFja19yZXR1cm5Mb2NhbF9yZXR1cm5UeXBlX2luTGF6eUluaXRpYWxpemVyRXhwcmVzc2lvbl9jdXJyZW50RnJhbWVpbmxpbmVDYWNoZWZ1bmN0aW9uVHlwZVBhcmFtZXRlckxvY2Fsc19lbnRlckZyYW1lX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlcl90eXBlSW5mZXJlbmNlTWFwX2dldFN0YXRpY1R5cGVnZXREYXJ0VHlwZV9lZmZlY3RpdmVUYXJnZXRFbGVtZW50Rm9yY2FsbFNvdXJjZUluZm9ybWF0aW9uX2xlYXZlRnJhbWVidWlsZEV4dGVybmFsRnVuY3Rpb25Ob2RlX2Vuc3VyZURlZmF1bHRBcmd1bWVudFZhbHVlc2J1aWxkRmllbGRObyBjYXNlIGltcGxlbWVudGVkIHRvIGhhbmRsZSB0YXJnZXQ6IGJ1aWxkQ29uc3RydWN0b3JidWlsZENvbnN0cnVjdG9yQm9keW9yaWdpbmFsQ2xvc3VyZU5vZGVVbmV4cGVjdGVkIGZ1bmN0aW9uIHNpZ25hdHVyZTogIGluc2lkZSBhIG5vbi1jbG9zdXJlOiBidWlsZE1ldGhvZFNpZ25hdHVyZWJ1aWxkR2VuZXJhdG9yQm9keV9mdW5jdGlvbk5vZGVPZkludmFsaWQgZ3JhcGggZm9yICAoYm9keSlyZWdpc3RlckRlZmF1bHRWYWx1ZWdldE1ldGhvZE5vIGNvbnN0YW50IGNvbXB1dGVkIGZvciBvcGVuRnVuY3Rpb25yZWFkVGhpc3BvdGVudGlhbGx5Q2hlY2tPclRydXN0VHlwZU9mUGFyYW1ldGVyX2dldERhcnRUeXBlSWZWYWxpZGZpZWxkVmFsdWVjaGVja0luc3RydWN0aW9ucG90ZW50aWFsbHlDaGVja09yVHJ1c3RUeXBlT2ZBc3NpZ25tZW50Y2xvc2VGdW5jdGlvbmNoZWNrT3JUcnVzdFR5cGVzcG90ZW50aWFsbHlDaGVja09yVHJ1c3RUeXBlT2ZDb25kaXRpb25fYWRkQ2xhc3NUeXBlVmFyaWFibGVzSWZOZWVkZWRuZWVkc1R5cGVBcmd1bWVudHNfdHlwZVZhcmlhYmxlZ2V0VHlwZVZhcmlhYmxlQXNMb2NhbGRpcmVjdExvY2Fsc19hZGRGdW5jdGlvblR5cGVWYXJpYWJsZXNJZk5lZWRlZGVsaWRlVHlwZVBhcmFtZXRlcnNfY29tcHV0ZVR5cGVBcmd1bWVudERlZmF1bHRWYWx1ZWNvbnN0cnVjdG9yRGF0YV9idWlsZEluaXRpYWxpemVyc2NvbnN0cnVjdG9yQXJndW1lbnRzaXNDdXN0b21FbGVtZW50Tm8gaW5pdGlhbGl6ZXIgdmFsdWUgZm9yIGZpZWxkIHN1YnN0SW5Db250ZXh0YWRkSW1wbGljaXRJbnN0YW50aWF0aW9ucmVtb3ZlSW1wbGljaXRJbnN0YW50aWF0aW9uY29uc3RydWN0b3JDaGFpbmJvZHlDYWxsSW5wdXRzaW5saW5lZENvbnN0cnVjdG9yZ2V0Q29uc3RydWN0b3JCb2R5aGFuZGxlUGFyYW1ldGVyZ2V0TG9jYWxWYXJpYWJsZWlzQm94ZWRzY29wZURhdGFnZXRDYXB0dXJlZFNjb3BlcmVxdWlyZXNDb250ZXh0Qm94aW5saW5lZENvbnN0cnVjdG9yQ2xhc3NhbmFseXplVHlwZUFyZ3VtZW50X3RyeUlubGluZU1ldGhvZF9pbnZva2VDb25zdHJ1Y3RvckJvZHl1cGRhdGVMb2NhbF9pc0VtcHR5U3RhdGVtZW50aW5saW5lZFRhcmdldF9lbnN1cmVUeXBlVmFyaWFibGVzRm9ySW5pdGlhbGl6ZXJzaW5jbHVkZWRDbGFzc2VzX2NvbGxlY3RGaWVsZFZhbHVlc1VuZXhwZWN0ZWQgbWVtYmVyIGRlZmluaXRpb24gaWdub3JlQWxsb2NhdG9yQW5hbHlzaXNpc1JlZGlyZWN0aW5nQ29uc3RydWN0b3JidXQgZm91bmQgZm91bmRTdXBlck9yUmVkaXJlY3RDYWxsX2lubGluZVN1cGVySW5pdGlhbGl6ZXJfaW5saW5lUmVkaXJlY3RpbmdJbml0aWFsaXplcmlyLkludmFsaWRJbml0aWFsaXplciBub3QgaGFuZGxlZFVuaGFuZGxlZCBpbml0aWFsaXplciBpci5BbGwgY29uc3RydWN0b3JzIHNob3VsZCBoYXZlIHN1cGVyLSBvciByZWRpcmVjdGluZy0gaW5pdGlhbGl6ZXJzLCBleGNlcHQgT2JqZWN0KClfbm9ybWFsaXplQW5kQnVpbGRBcmd1bWVudHNidWlsdEFyZ3VtZW50c3Bvc2l0aW9uYWxJbmRleGNvcnJlc3BvbmRpbmdOYW1lZHN1cGVyT3JSZWRpcmVjdENvbnN0cnVjdG9yX2lubGluZVN1cGVyT3JSZWRpcmVjdENvbW1vbmNhbGxlckNsYXNzb2xkU2NvcGVJbmZvc2NvcGVJbmZvbmV3U2NvcGVJbmZvYnVpbGRHZW5lcmF0b3JoYW5kbGVJZnZpc2l0Q29uZGl0aW9udmlzaXRUaGVudmlzaXRFbHNldW5yZWFjaGFibGUtdGhyb3dlbXB0eVBhcmFtZXRlcnNhZGRDb21tZW50IGluZmVycmVkIGFzIFtlbXB0eV1zdGF0ZW1lbnRUZW1wbGF0ZVlpZWxkaW5nX2dlbmVyYXRlZEVudHJ5SXNFbXB0eWdldEdlbmVyYXRvckJvZHlfcG90ZW50aWFsbHlBZGRGdW5jdGlvblBhcmFtZXRlclR5cGVDaGVja3N0YXJnZXRDaGVja3NjaGVja1R5cGVQYXJhbWV0ZXJzbm9kZUlzQ29uc3RydWN0b3JCb2R5X2hhbmRsZVBhcmFtZXRlcmlzQm94ZWRWYXJpYWJsZW5ld1BhcmFtZXRlck5vIGluaXRpYWwgaW5zdHJ1Y3Rpb24gZm9yIGNoZWNrQWxsUGFyYW1ldGVyc2NoZWNrQ292YXJpYW50UGFyYW1ldGVyc3RydXN0VHlwZU9mUGFyYW1ldGVyZ2V0TG9jYWxUeXBlVmFyaWFibGVfYXNzZXJ0SXNUeXBlVGhlIHR5cGUgYXJndW1lbnQgJycgaXMgbm90IGEgc3VidHlwZSBvZiB0aGUgdHlwZSB2YXJpYWJsZSBib3VuZCAnJyBvZiB0eXBlIHZhcmlhYmxlICduYXRpdmVOYW1ldGVtcGxhdGVSZWNlaXZlcnRlbXBsYXRlQXJndW1lbnRzIy5fcHVzaFN0YXRpY0ludm9jYXRpb251bmNhY2hlZEV4cHJlc3Npb25UZW1wbGF0ZXBhcmFtZXRlck1hcGVsaWRlZFBhcmFtZXRlclNldGlzR2VuZXJhdGl2ZUNvbnN0cnVjdG9yQm9keV9kZWZhdWx0VmFsdWVGb3JQYXJhbWV0ZXJfaW5zZXJ0Q292ZXJhZ2VDYWxsVW5oYW5kbGVkIG5vZGUgY2hlY2tMb2FkZ2V0SW1wb3J0bG9hZElkZ2V0U3Bhbm5hYmxlcHJlZml4Q29uc3RhbnR1cmlDb25zdGFudE5vbi1lbXB0eSBpbnN0cnVjdGlvbiBzdGFjay5Ob24tZW1wdHkgaW5zdHJ1Y3Rpb24gc3RhY2tfdmlzaXRUaHJvd0V4cHJlc3Npb25pc1ZhbGlkQXN5bmNSZXR1cm5UeXBlX2VtaXRSZXR1cm5idWlsZEluaXRpYWxpemVyYnVpbGRDb25kaXRpb25idWlsZFVwZGF0ZWp1bXBUYXJnZXRnZXRKdW1wVGFyZ2V0Rm9yRm9yaGFuZGxlTG9vcGdldENhcHR1cmVkTG9vcFNjb3BlX2J1aWxkQXN5bmNGb3JJbl9idWlsZEZvckluSW5kZXhhYmxlX2J1aWxkRm9ySW5JdGVyYXRvcmNyZWF0ZUxvY2FsX2lpc0ZpeGVkb3JpZ2luYWxMZW5ndGhidWlsZEdldExlbmd0aGJ1aWxkQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yQ2hlY2tsb29wVmFyaWFibGVMb2NhbG9uZWFkZEluc3RydWN0aW9uZ2V0SnVtcFRhcmdldEZvckZvckluX3B1c2hEeW5hbWljSW52b2NhdGlvbl9hZGRUeXBlQXJndW1lbnRzdHJ5QnVpbGRlcmZpbmFsaXplckZ1bmN0aW9uY2xvc2VUcnlCb2R5YnVpbGRGaW5hbGx5QmxvY2tjbGVhblVwdHlwZUluZm9TZXR0ZXJGblVuZXhwZWN0ZWQgYHN0YWNrLmxhc3RgOiBGb3VuZCBleHBlY3RlZCAgb3IgYW4gSEludm9rZVN0YXRpYy4gU3RhdGU6IHR5cGVJbmZvPSwgc3RhY2s9Z2V0SnVtcFRhcmdldEZvcldoaWxlc2F2ZWRMb2NhbHNsb29wQ2xvc3VyZUluZm9zdGFydExvb3BnZXRKdW1wVGFyZ2V0Rm9yRG9qdW1wSGFuZGxlcmJlZ2luTG9vcEhlYWRlcmxvb3BJbmZvbG9vcEVudHJ5QmxvY2tib2R5RW50cnlCbG9ja2hhc0NvbnRpbnVlc2VudGVyTG9vcEJvZHlib2R5RXhpdEJsb2NraXNBYm9ydGluZ0JvZHlsb29wSXNEZWdlbmVyYXRlY29uZGl0aW9uQmxvY2tjb250aW51ZUhhbmRsZXJzZm9yRWFjaENvbnRpbnVlbG9jYWxzbWVyZ2VNdWx0aXBsZWJvZHlHcmFwaGJvZHlJbmZvY29uZGl0aW9uSW5zdHJ1Y3Rpb25jb25kaXRpb25FbmRCbG9ja2F2b2lkQ3JpdGljYWxFZGdlY29uZGl0aW9uRXhpdEJsb2NrZW5kTG9vcGxvb3BCbG9ja0luZm9oYXNBbnlCcmVha2FkZExhYmVsZm9yRWFjaEJyZWFrYnJlYWtJbnN0cnVjdGlvbmJyYW5jaEJ1aWxkZXJvcGVyYW5kVHlwZWV4cHJlc3Npb25JbnN0cnVjdGlvbmdlbmVyYXRlVHlwZUVycm9yaW52YWxpZCB0eXBlYnVpbGRUeXBlQ29udmVyc2lvbmdlbmVyYXRlRXJyb3JlcnJvck1lc3NhZ2VnZW5lcmF0ZVVuc3VwcG9ydGVkRXJyb3JjcmVhdGVKdW1wSGFuZGxlcmlzTG9vcEp1bXBnZXRKdW1wVGFyZ2V0Rm9yQnJlYWtnZW5lcmF0ZUNvbnRpbnVlRm9yQnJlYWtnZW5lcmF0ZUNvbnRpbnVlZ2VuZXJhdGVCcmVha2dldEp1bXBUYXJnZXRGb3JMYWJlbGJlZm9yZUxvY2Fsc2JyZWFrSGFuZGxlcnNfYnVpbGRTd2l0Y2hDYXNlQ29uc3RhbnRzc3dpdGNoU3RhdGVtZW50Z2V0SnVtcFRhcmdldEZvckNvbnRpbnVlU3dpdGNoaGFzQ29udGludWVjYXNlSW5kZXhzd2l0Y2hJbmRleGdldEp1bXBUYXJnZXRGb3JTd2l0Y2hfYnVpbGRTaW1wbGVTd2l0Y2hTdGF0ZW1lbnRfYnVpbGRDb21wbGV4U3dpdGNoU3RhdGVtZW50X2lzRGVmYXVsdENhc2VfYnVpbGRFeHByZXNzaW9uX2dldFN3aXRjaENvbnN0YW50c3BhcmVudFN3aXRjaGNvbnN0YW50c0xvb2t1cGNvbnN0YW50TGlzdF9oYW5kbGVTd2l0Y2hzd2l0Y2hUYXJnZXRjYXNlU291cmNlSW5mb3JtYXRpb25ub3RVc2VkZ2V0Q29uc3RhbnRzaXNEZWZhdWx0Q2FzZWV4cHJlc3Npb25TdGFydHN3aXRjaEluc3RydWN0aW9uZXhwcmVzc2lvbkVuZGhDb25zdGFudGNhc2VIYW5kbGVyc0NvbnRpbnVlIGNhbm5vdCB0YXJnZXQgYSBzd2l0Y2guZXhwcmVzc2lvbkluZm9icmFuY2hlcmhhbmRsZUNvbmRpdGlvbmFsX2hhbmRsZUxvZ2ljYWxFeHByZXNzaW9udmlzaXRSaWdodGlubmVyTGVmdGhhbmRsZUxvZ2ljYWxCaW5hcnlfc2V0TGlzdFJ1bnRpbWVUeXBlSW5mb0lmTmVlZGVkbGlzdEluc3RydWN0aW9uYXJnTGlzdHR5cGVJbnB1dHNyZXR1cm5UeXBlTWFza2NvbnN0cnVjdG9yQXJnc2lyLk1hcEVudHJ5IHNob3VsZCBiZSBoYW5kbGVkIGluIHZpc2l0TWFwTGl0ZXJhbFVuZXhwZWN0ZWQgdHlwZSBsaXRlcmFsIHN0YXRpY1RhcmdldFVuZXhwZWN0ZWQgZmllbGQgZGF0YSBmb3IgbGV0QmluZGluZ2lyLkRpcmVjdFByb3BlcnR5U2V0aXIuRGlyZWN0TWV0aG9kSW52b2NhdGlvbmdldFN1cGVyTWVtYmVyX2dlbmVyYXRlU3VwZXJOb1N1Y2hNZXRob2RnZXRTZWxlY3Rvcl9idWlsZEludm9rZVN1cGVyX3Zpc2l0TG9jYWxTZXR0ZXJpbml0aWFsaXplZFZhbHVlX3Zpc2l0UG9zaXRpb25hbEFyZ3VtZW50c192aXNpdEFyZ3VtZW50c0ZvckR5bmFtaWNUYXJnZXRuYW1lZFZhbHVlc192aXNpdEFyZ3VtZW50c0Zvck5hdGl2ZVN0YXRpY1RhcmdldF9maWxsRHluYW1pY1R5cGVBcmd1bWVudHNfZ2V0Q29uc3RydWN0b3JUeXBlQXJndW1lbnRzX2dldENsYXNzVHlwZUFyZ3VtZW50c19nZXRTdGF0aWNUeXBlQXJndW1lbnRzX3Zpc2l0QXJndW1lbnRzRm9yU3RhdGljVGFyZ2V0aGFuZGxlSW52b2tlU3RhdGljRm9yZWlnbmhhbmRsZUV4dHJhY3RUeXBlQXJndW1lbnRzaGFuZGxlSW52b2tlRmFjdG9yeUNvbnN0cnVjdG9yY2FuIG9ubHkgYmUgdXNlZCBhcyBhIGNvbnN0IGNvbnN0cnVjdG9yaXNGaXhlZExpc3Rpc0ZpeGVkTGlzdENvbnN0cnVjdG9yQ2FsbGlzR3Jvd2FibGVMaXN0Q29uc3RydWN0b3JDYWxscmVzdWx0VHlwZWlzSlNBcnJheVR5cGVkQ29uc3RydWN0b3JfaW5mZXJyZWRUeXBlT2ZOZXdMaXN0VW5leHBlY3RlZCBhcmd1bWVudHMuIEV4cGVjdGVkIDEtMiBhcmd1bWVudCwgYWN0dWFsOiBsZW5ndGhJbnB1dG5ldyBBcnJheSgjKWZvcmVpZ24jLmZpeGVkJGxlbmd0aCA9IEFycmF5bmV3SW5zdGFuY2V0eXBlVmFsdWVfaW50ZXJjZXB0b3JGb3JoYW5kbGVGb3JlaWduSnNEQVJUX0NMT1NVUkVfVE9fSlNoYW5kbGVGb3JlaWduRGFydENsb3N1cmVUb0pzUkFXX0RBUlRfRlVOQ1RJT05fUkVGaGFuZGxlRm9yZWlnblJhd0Z1bmN0aW9uUmVmSlNfU0VUX1NUQVRJQ19TVEFURWhhbmRsZUZvcmVpZ25Kc1NldFN0YXRpY1N0YXRlSlNfR0VUX1NUQVRJQ19TVEFURWhhbmRsZUZvcmVpZ25Kc0dldFN0YXRpY1N0YXRlSlNfR0VUX05BTUVoYW5kbGVGb3JlaWduSnNHZXROYW1laGFuZGxlRm9yZWlnbkpzRW1iZWRkZWRHbG9iYWxoYW5kbGVGb3JlaWduSnNCdWlsdGluSlNfR0VUX0ZMQUdoYW5kbGVGb3JlaWduSnNHZXRGbGFnSlNfRUZGRUNUaGFuZGxlSnNJbnRlcmNlcHRvckNvbnN0YW50Z2V0SW50ZXJjZXB0b3JoYW5kbGVGb3JlaWduR2V0SW50ZXJjZXB0b3JoYW5kbGVKc1N0cmluZ0NvbmNhdF9oYW5kbGVDcmVhdGVJbnZvY2F0aW9uTWlycm9yVW5rbm93biBmb3JlaWduOiBuYW1lTGl0ZXJhbHR5cGVBcmd1bWVudHNMaXRlcmFscG9zaXRpb25hbEFyZ3VtZW50c0xpdGVyYWxuYW1lZEFyZ3VtZW50c0xpdGVyYWxraW5kTGl0ZXJhbFVuZXhwZWN0ZWQgbmFtZWQgYXJndW1lbnRzIHZhbHVlIGluIGNyZWF0ZUludm9jYXRpb25NaXJycm9yOiBhcmd1bWVudHNJbnN0cnVjdGlvbmFyZ3VtZW50TmFtZXNhcmd1bWVudE5hbWVhcmd1bWVudE5hbWVDb25zdGFudGFyZ3VtZW50TmFtZXNJbnN0cnVjdGlvbmludGVybmFsTmFtZWtpbmRDb25zdGFudF91bmV4cGVjdGVkRm9yZWlnbkFyZ3VtZW50c21pblBvc2l0aW9uYWxtYXhQb3NpdGlvbmFscGx1cmFsaXplQXJndW1lbnRzYWRqZWN0aXZlbm8gb25lIHR3byBiYWR0eXBlIEVycm9yOiAnJyB0YWtlcyAsIG5vdCBwaHJhc2VhdCBsZWFzdCBFcnJvcjogVG9vIGZldyBhcmd1bWVudHMuICdhdCBtb3N0IEVycm9yOiBUb28gbWFueSBhcmd1bWVudHMuICcnIGRvZXMgbm90IHRha2UgbmFtZWQgYXJndW1lbnRzLl9mb3JlaWduQ29uc3RhbnRTdHJpbmdBcmd1bWVudEVycm9yOiBFeHBlY3RlZCBTdHJpbmcgY29uc3RhbnQgYXMgdG8gJ3JlcXVpcmVzIGEgc3RhdGljIG1ldGhvZCBvciB0b3AtbGV2ZWwgbWV0aG9kaGFuZGxlVGFyZ2V0ZXhwcmVzc2lvblRlbXBsYXRlWWllbGRpbmdkb2VzIG5vdCBoYW5kbGUgYSBjbG9zdXJlIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVycyA9ICNFcnJvcjogRXhwZWN0ZWQgYSBKc0dldE5hbWUgZW51bSB2YWx1ZS5nbG9iYWxOYW1lc2Vjb25kIGdlbmVyYXRlRW1iZWRkZWRHbG9iYWxBY2Nlc3NnZXROYXRpdmVCZWhhdmlvckZvckpzRW1iZWRkZWRHbG9iYWxDYWxsTm8gTmF0aXZlQmVoYXZpb3IgZm9yIHNzYVR5cGVuYW1lQXJndW1lbnRnZXRKc0J1aWx0aW5UZW1wbGF0ZUVycm9yOiBFeHBlY3RlZCBhIEpzQnVpbHRpbiBlbnVtIHZhbHVlLmdldE5hdGl2ZUJlaGF2aW9yRm9ySnNCdWlsdGluQ2FsbEVycm9yOiBVbmtub3duIGludGVybmFsIGZsYWcgImFyZ3VtZW50SW5zdHJ1Y3Rpb25hcmd1bWVudENvbnN0YW50Z2V0TmF0aXZlQmVoYXZpb3JGb3JKc0NhbGxNaXNtYXRjaCBiZXR3ZWVuIG51bWJlciBvZiBwbGFjZWhvbGRlcnMgYW5kIG51bWJlciBvZiBhcmd1bWVudHMudHJ1c3RlZE1hc2t0cnVzdFR5cGVNYXNrVHlwZSBhcmd1bWVudCB0b28gbmFycm93IGZvciBzcGVjaWZpZWQgYmVoYXZpb3IgdHlwZSAgZG9lcyBub3QgYWxsb3cgYWxsIHZhbHVlcyBpbiBfaW52b2tlSnNJbnRlcm9wRnVuY3Rpb25pc09wdGltaXphYmxlT3BlcmF0aW9uT25JbmRleGFibGVpc0xlbmd0aGlzT3B0aW1pemFibGVPcGVyYXRpb25wb3NpdGlvbnNmaWx0ZXJlZEFyZ3VtZW50c3BhcmFtZXRlck5hbWVNYXBwYXJhbWV0ZXJOYW1lbmV3ICMoIyhjbG9zdXJlQ2xhc3NFbnRpdHljYXB0dXJlZFZhcmlhYmxlc2dldExvY2FsRm9yRmllbGRmdW5jRXhwcmVzc2lvbnR5cGVBcmd1bWVudHNOZWVkZWRHZW5lcmljIGZ1bmN0aW9uIGluc3RhbnRpYXRpb24gbm90IGltcGxlbWVudGVkIGZvciAgdHlwZSBhcmd1bWVudHNfY29udGFpbmluZ0NsYXNzcHVibGljTmFtZXRhcmdldERlZmluaXRpb25zdWJ0eXBlSW5zdHJ1Y3Rpb25pbmZpeHN1cGVydHlwZUluc3RydWN0aW9ucHJlZml4SW5zdHJ1Y3Rpb25pbmZpeEluc3RydWN0aW9uc3VmZml4SW5zdHJ1Y3Rpb25wdXNoSXNUZXN0YWRkVHlwZVZhcmlhYmxlUmVmZXJlbmNlX2Nhbklnbm9yZVR5cGVBcmd1bWVudHNyZXByZXNlbnRhdGlvbnNidWlsZFR5cGVBcmd1bWVudFJlcHJlc2VudGF0aW9uc2lzRmllbGROYW1lYXNGaWVsZE5hbWVhd2FpdGVkcmV0aHJvd2FibGVFeGNlcHRpb24gc2hvdWxkIG5vdCBiZSBudWxsLnN0cmluZ0NvbmNhdHN0cmluZ0J1aWxkZXJ0cnlDYXRjaHByb3ZpZGVkQXJndW1lbnRzY3VycmVudE5vZGVjYWNoZWRDYW5CZUlubGluZWRtZWV0c0hhcmRDb25zdHJhaW50c01pc3Npbmcgc2VsZWN0b3IgZm9yIGlubGluaW5nIG9mIGRvZXNOb3RDb250YWluQ29kZXJlZHVjdGl2ZUhldXJpc3RpY19pc0NhbGxlZE9uY2VvbWl0SW1wbGljaXRDYXN0c2hldXJpc3RpY1NheUdvb2RUb0dvYWxsb3dMb29wc0Nhbm5vdCBpbmxpbmUgbnVtUGFyYW1ldGVyc21heElubGluaW5nTm9kZXNtYXJrZWRUcnlJbmxpbmVjYWxsZWRPbmNlZG9JbmxpbmluZ1VuZXhwZWN0ZWQgaW5zdGFuY2UgdHlwZSBmb3IgY29tcGlsZWRBcmd1bWVudHNfY29tcGxldGVDYWxsQXJndW1lbnRzTGlzdF9lbnRlcklubGluZWRNZXRob2RfZG9JbmxpbmVfbGVhdmVJbmxpbmVkTWV0aG9kX3Byb3ZpZGVkQXJndW1lbnRzS25vd25Ub0JlQ29tcGxldGVfY29tcGxldGVEeW5hbWljQ2FsbEFyZ3VtZW50c0xpc3RzZWxlY3RvckFyZ3VtZW50TmFtZXNjb21waWxlZEFyZ3VtZW50SW5kZXhwb3NpdGlvbmFsQXJndW1lbnRPZmZzZXRuYW1lZEFyZ3VtZW50T2Zmc2V0cG9zaXRpb25hbEFyZ3VtZW50SW5kZXhuYW1lZEFyZ3VtZW50SW5kZXhObyBjb25zdGFudCBjb21wdXRlZCBmb3IgcGFyYW1ldGVyIHR5cGVBcmd1bWVudE9mZnNldHR5cGVBcmd1bWVudEluZGV4X3NldHVwU3RhdGVGb3JJbmxpbmluZ2ZvckdlbmVyYXRpdmVDb25zdHJ1Y3RvckJvZHlhcmd1bWVudEluZGV4aGFzQm94aW5saW5lZEJveGlubGluZVR5cGVQYXJhbWV0ZXJzT25seSBhcmd1bWVudHMgaGF2ZSBiZWVuIHJlYWQgZnJvbTogIHBhc3NlZCB0byBfcmVzdG9yZVN0YXRlb2xkTG9jYWxzSGFuZGxlcm9sZFJldHVybkxvY2Fsb2xkUmV0dXJuVHlwZW9sZFN0YWNrX3Zpc2l0SW5saW5lZEZ1bmN0aW9uX3BvdGVudGlhbGx5Q2hlY2tJbmxpbmVkUGFyYW1ldGVyVHlwZXNVbmV4cGVjdGVkIGlubGluZWQgZnVuY3Rpb246IGNoZWNrZWRPclRydXN0ZWRfYWxsSW5saW5lZEZ1bmN0aW9uc0NhbGxlZE9uY2VhbGxGdW5jdGlvbnNDYWxsZWRPbmNlX2lzRnVuY3Rpb25DYWxsZWRPbmNlaWRDb25zdGFudENvbnN0cnVjdG9yRGF0YUtlcm5lbElubGluaW5nU3RhdGVJbmxpbmVXZWVkZXJJTkxJTklOR19OT0RFU19PVVRTSURFX0xPT1BJTkxJTklOR19OT0RFU19PVVRTSURFX0xPT1BfQVJHX0ZBQ1RPUklOTElOSU5HX05PREVTX0lOU0lERV9MT09QSU5MSU5JTkdfTk9ERVNfSU5TSURFX0xPT1BfQVJHX0ZBQ1RPUnNlZW5SZXR1cm5ub2RlQ291bnR0b29EaWZmaWN1bHRSZWFzb25jYW5CZUlubGluZWRjYW5ub3RCZUlubGluZWRSZWFzb250b29EaWZmaWN1bHR0b28gbWFueSBub2Rlc2NvZGUgYWZ0ZXIgcmV0dXJuX2hhbmRsZUxvb3Bhc3luYy9hd2FpdGNvbW1vblByZWZpeENvdW50dGhlbkNvdW50ZWxzZUNvdW50SW5saW5lUmVkdWN0aXZlV2VlZGVyY2FsbENvdW50cmVnaXN0ZXJDYWxsdG9vIG1hbnkgY2FsbHNsb25nIHN0cmluZ19wcm9jZXNzQXJndW1lbnRzZXh0ZXJuYWwgY29uc3QgY29uc3RydWN0b3J0eXBlIGFyZ3VtZW50c2luY3JlYXNpbmcgYXJndW1lbnRzYXJndW1lbnQgZGVmYXVsdGluZ1RyeUNhdGNoRmluYWxseUJ1aWxkZXJrZXJuZWxCdWlsZGVydHJ5U291cmNlSW5mb3JtYXRpb25lbnRlckJsb2Nrc3RhcnRUcnlCbG9ja2VuZFRyeUJsb2Nrc3RhcnRDYXRjaEJsb2NrZW5kQ2F0Y2hCbG9ja3N0YXJ0RmluYWxseUJsb2NrZW5kRmluYWxseUJsb2NrZXhpdEJsb2NrdHJ5SW5zdHJ1Y3Rpb25wcmV2aW91c2x5SW5UcnlTdGF0ZW1lbnRjYXRjaEdyYXBoZmluYWxseUdyYXBob3JpZ2luYWxTYXZlZExvY2Fsc19hZGRFeGl0VHJ5U3VjY2Vzc29yc3VjY2Vzc29yX2FkZE9wdGlvbmFsU3VjY2Vzc29yYmxvY2syX3NldEJsb2NrU3VjY2Vzc29yc2J1aWxkRmluYWxpemVyb2xkUmV0aHJvd2FibGVFeGNlcHRpb251bndyYXBwZWRFeGNlcHRpb25jYXRjaGVzSW5kZXhwdXNoQ29uZGl0aW9uZXhjZXB0aW9uVmFyaWFibGV0cmFjZUluc3RydWN0aW9udHJhY2VWYXJpYWJsZW5leHRDYXRjaGZpcnN0QmxvY2tjb21wdXRlVHlwZVZhcmlhYmxlQWNjZXNzZ2V0Q2xhc3NUeXBlVmFyaWFibGVBY2Nlc3NGb3JNZW1iZXJfRXJyb25lb3VzSW5pdGlhbGl6ZXJWaXNpdG9yS2VybmVsU3dpdGNoQ2FzZUp1bXBIYW5kbGVyZ2V0SnVtcFRhcmdldEZvclN3aXRjaENhc2V0YXJnZXRJbmRleE1hcEFic3RyYWN0VmFsdWVGYWN0b3J5aW5mZXJyZWRSZXR1cm5UeXBlRm9yRWxlbWVudGluZmVycmVkVHlwZUZvck1lbWJlcmluZmVycmVkVHlwZUZvclBhcmFtZXRlcmluZmVycmVkVHlwZUZvclNlbGVjdG9yZnJvbU5hdGl2ZUJlaGF2aW9yZnJvbU5hdGl2ZVR5cGVVbmV4cGVjdGVkIGVtcHR5IHJldHVybiB2YWx1ZSBmb3IgSnNDbG9zZWRXb3JsZEJ1aWxkZXJDbG9zdXJlRGF0YUltcGxjbG9zdXJlLWRhdGFfc2NvcGVNYXBfY2FwdHVyZWRTY29wZXNNYXBfY2FwdHVyZWRTY29wZUZvclNpZ25hdHVyZU1hcF9sb2NhbENsb3N1cmVSZXByZXNlbnRhdGlvbk1hcHNjb3BlTWFwY2FwdHVyZWRTY29wZXNNYXBjYXB0dXJlZFNjb3BlRm9yU2lnbmF0dXJlTWFwbG9jYWxDbG9zdXJlUmVwcmVzZW50YXRpb25NYXBNaXNzaW5nIHNjb3BlIGluZm8gZm9yIGxvb3BOb2RlQ29ycmVzcG9uZGluZyBjbG9zdXJlIGNsYXNzIG5vdCBmb3VuZCBmb3IgQ2xvc3VyZXMgZm91bmQgZm9yIENsb3N1cmVEYXRhQnVpbGRlcl91cGRhdGVTY29wZUJhc2VkT25SdGlOZWVkb3V0ZXJtb3N0RW50aXR5aW5jbHVkZUZvclJ0aWxvY2FsRnVuY3Rpb25OZWVkc1R5cGVBcmd1bWVudHNsb2NhbEZ1bmN0aW9uTmVlZHNTaWduYXR1cmV0aGlzVXNlZEFzRnJlZVZhcmlhYmxlSWZOZWVkc1J0aXRoaXNVc2VkQXNGcmVlVmFyaWFibGVmcmVlVmFyaWFibGVzRm9yUnRpY3JlYXRlQ2xvc3VyZUVudGl0aWVzY2FsbE1ldGhvZHNtb2RlbGFsbEJveGVkVmFyaWFibGVzbWFrZVJlY29yZENvbnRhaW5lcmJveGVkVmFyaWFibGVzY2xvc3VyZXNUb0dlbmVyYXRlVW5leHBlY3RlZCBjbG9zdXJlIG5vZGUgY2xvc3VyZUNsYXNzSW5mb19wcm9kdWNlU3ludGhldGljRWxlbWVudHNjcmVhdGVTaWduYXR1cmVNZXRob2RjYXB0dXJlZFNjb3Blc2lnbmF0dXJlQ2FwdHVyZWRTY29wZWJ1aWxkQ2xvc3VyZUNsYXNzc2V0TG9jYWxzTWFwSnNTY29wZUluZm9zY29wZS1pbmZvbG9jYWxzVXNlZEluVHJ5T3JTeW5jaGFzVGhpc0xvY2FsZm9yRWFjaEJveGVkVmFyaWFibGVsb2NhbElzVXNlZEluVHJ5T3JTeW5jdGhpcz1sb2NhbHNVc2VkSW5UcnlPclN5bmM9e0pzQ2FwdHVyZWRTY29wZWNhcHR1cmVkLXNjb3BlSnNDYXB0dXJlZExvb3BTY29wZWNhcHR1cmVkLWxvb3Atc2NvcGVib3hlZExvb3BWYXJpYWJsZXNoYXNCb3hlZExvb3BWYXJpYWJsZXNLZXJuZWxDbG9zdXJlQ2xhc3NJbmZvY2xvc3VyZS1yZXByZXNlbnRhdGlvbi1pbmZvY2xvc3VyZUVudGl0eWxvY2FsVG9GaWVsZE1hcGZyb21TY29wZUluZm9jbG9zdXJlU291cmNlTm9kZWNyZWF0ZWRGaWVsZEVudGl0aWVzTm8gbG9jYWwgZm9yIC4gT3B0aW9uczogdGhpc0ZpZWxkRW50aXR5SkNsb3N1cmVDbGFzc2Nsb3N1cmUtY2xhc3NjbG9zdXJlX2NsYXNzKEFub255bW91c0Nsb3N1cmVMb2NhbGFub255bW91c19jbG9zdXJlX2xvY2FsKEpDbG9zdXJlRmllbGRjbG9zdXJlLWZpZWxkUmVjb3JkQ2xhc3NEYXRhcmVjb3JkLWNsYXNzLWRhdGFvcmRlcmVkVHlwZVNldEpSZWNvcmRyZWNvcmRfY29udGFpbmVyKEpSZWNvcmRGaWVsZHJlY29yZC1maWVsZENsb3N1cmVDbGFzc0RhdGFjbG9zdXJlLWNsYXNzLWRhdGFDbG9zdXJlQ2xhc3NEZWZpbml0aW9uY2xvc3VyZS1jbGFzcy1kZWZpbml0aW9uQ2xvc3VyZUNsYXNzRGVmaW5pdGlvbi5ub2RlIGZvciBDbG9zdXJlQ2xhc3NEZWZpbml0aW9uKGtpbmQ6LGxvY2F0aW9uOkNsb3N1cmVNZW1iZXJEYXRhbWVtYmVyVGhpc1R5cGVzdGF0aWNUeXBlc0Nsb3N1cmVNZW1iZXJEYXRhLnN0YXRpY1R5cGVzX0Nsb3N1cmVGdW5jdGlvbkRhdGEmQ2xvc3VyZU1lbWJlckRhdGEmRnVuY3Rpb25EYXRhVHlwZVZhcmlhYmxlc01peGluX0Nsb3N1cmVGdW5jdGlvbkRhdGEmQ2xvc3VyZU1lbWJlckRhdGEmRnVuY3Rpb25EYXRhVHlwZVZhcmlhYmxlc01peGluJkZ1bmN0aW9uRGF0YUZvckVhY2hQYXJhbWV0ZXJNaXhpbnVzZU5hdGl2ZU9yZGVyaW5nQ2xvc3VyZUZ1bmN0aW9uRGF0YWNsb3N1cmUtZnVuY3Rpb24tZGF0YWNsYXNzVHlwZVZhcmlhYmxlQWNjZXNzQ2xvc3VyZUZpZWxkRGF0YWNsb3N1cmUtZmllbGQtZGF0YXNvdXJjZU5vZGVVbmV4cGVjdGVkIG5vZGUgdHlwZSBDbG9zdXJlRmllbGREYXRhLmdldEZpZWxkVHlwZWdldEZpZWxkQ29uc3RhbnRFeHByZXNzaW9uVW5leHBlY3RlZCBmaWVsZCBDbG9zdXJlRmllbGREYXRhLmdldEZpZWxkQ29uc3RhbnRFeHByZXNzaW9uQ2xvc3VyZU1lbWJlckRlZmluaXRpb25jbG9zdXJlLW1lbWJlci1kZWZpbml0aW9uQ2xvc3VyZU1lbWJlckRlZmluaXRpb24oa2luZDpSZWNvcmRDb250YWluZXJEZWZpbml0aW9ucmVjb3JkLWRlZmluaXRpb25SZWNvcmRDb250YWluZXJEZWZpbml0aW9uLm5vZGUgZm9yIFJlY29yZENvbnRhaW5lckRlZmluaXRpb24oa2luZDpDbG9zdXJlUnRpTmVlZF9nZXRMb2NhbE9ubHkga25vdyBob3cgdG8gZ2V0L2NyZWF0ZSBsb2NhbHMgZm9yIFZhcmlhYmxlRGVjbGFyYXRpb25zIG9yIFR5cGVQYXJhbWV0ZXJUeXBlV2l0aENvbnRleHQuIFJlY2lldmVkIEpzVG9FbGVtZW50TWFwZ2V0SW50ZXJmYWNlVHlwZWdldFR5cGVWYXJpYWJsZVR5cGVnZXRDYWxsU3RydWN0dXJlZ2V0VHlwZWRlZlR5cGVnZXRDbGFzc0RlZmluaXRpb25nZXREYXJ0VHlwZXNLZXJuZWxUb1R5cGVJbmZlcmVuY2VNYXBmb3JJblN0YXRlbWVudEtlcm5lbFRvTG9jYWxzTWFwcmVndWxhck1lbWJlcktpbmQucmVndWxhck1lbWJlcktpbmQuY29uc3RydWN0b3JNZW1iZXJLaW5kLmNvbnN0cnVjdG9yQm9keU1lbWJlcktpbmQuY2xvc3VyZUNhbGxNZW1iZXJLaW5kLmNsb3N1cmVGaWVsZE1lbWJlcktpbmQuc2lnbmF0dXJlTWVtYmVyS2luZC5nZW5lcmF0b3JCb2R5TWVtYmVyRGVmaW5pdGlvblVuZXhwZWN0ZWQgTWVtYmVyS2luZCBDbGFzc0tpbmRDbGFzc0tpbmQucmVndWxhckNsYXNzS2luZC5jbG9zdXJlQ2xhc3NLaW5kLnJlY29yZFJlZ3VsYXJNZW1iZXJEZWZpbml0aW9ucmVndWxhci1tZW1iZXItZGVmaW5pdGlvblJlZ3VsYXJNZW1iZXJEZWZpbml0aW9uKGtpbmQ6bm9kZTpTcGVjaWFsTWVtYmVyRGVmaW5pdGlvbnNwZWNpYWwtbWVtYmVyLWRlZmluaXRpb25TcGVjaWFsTWVtYmVyRGVmaW5pdGlvbihraW5kOkNsYXNzRGVmaW5pdGlvblJlZ3VsYXJDbGFzc0RlZmluaXRpb25yZWd1bGFyLWNsYXNzLWRlZmluaXRpb25SZWd1bGFyQ2xhc3NEZWZpbml0aW9uKGtpbmQ6Z2V0RnVuY3Rpb25Ob2RlZm9yRWFjaE9yZGVyZWRQYXJhbWV0ZXJCeUZ1bmN0aW9uTm9kZWZvckVhY2hPcmRlcmVkUGFyYW1ldGVyVW5leHBlY3RlZCBmdW5jdGlvbiBkZWZpbml0aW9uIEJveExvY2FsVGhpc0xvY2FsSnNUb1dvcmxkQnVpbGRlckpzS2VybmVsVG9FbGVtZW50TWFwanMta2VybmVsLXRvLWVsZW1lbnQtbWFwbGlicmFyeVRhZ2NsYXNzVGFnbWVtYmVyVGFndHlwZVZhcmlhYmxlVGFndHlwZS12YXJpYWJsZXNsaWJyYXJ5RGF0YVRhZ2xpYnJhcnktZGF0YWNsYXNzRGF0YVRhZ2NsYXNzLWRhdGF0eXBlZGVmRGF0YVRhZ3R5cGVkZWYtZGF0YW1lbWJlckRhdGFUYWdtZW1iZXItZGF0YXR5cGVWYXJpYWJsZURhdGFUYWd0eXBlLXZhcmlhYmxlLWRhdGFuZXN0ZWRDbG9zdXJlc1RhZ25lc3RlZC1jbG9zdXJlc190eXBlQ29udmVydGVyX2NvbnN0YW50RW52aXJvbm1lbnRfY2xhc3NIaWVyYXJjaHl0eXBlZGVmTWFwdHlwZVZhcmlhYmxlTWFwY29uc3RydWN0b3JNYXBtZXRob2RNYXBfbmVzdGVkQ2xvc3VyZU1hcF9nZW5lcmF0b3JCb2RpZXNfaW5qZWN0ZWRDbGFzc01lbWJlcnNfY2FjaGVkVHlwZUxvb2t1cFJhd19jYWNoZWRUeXBlTG9va3VwRnVsbG9sZExpYnJhcnlnZXRFbnRpdHlnZXRFbnZnZXREYXRhbmV3TGlicmFyeW5ld0VudnJlZ2lzdGVyTGlicmFyeW9sZENsYXNzbmV3Q2xhc3Njb252ZXJ0Q2xhc3NvbGRUeXBlZGVmbmV3VHlwZWRlZmNvbnZlcnRUeXBlZGVmb2xkTWVtYmVyc2tpcEluZGV4bmV3TWVtYmVyY29udmVydE1lbWJlck1lbWJlciBpbmRleCBtaXNtYXRjaDogT2xkIG1lbWJlciAgaGFzIGluZGV4IHdoZXJlYXMgbmV3IG1lbWJlciBvbGRUeXBlVmFyaWFibGVvbGRUeXBlVmFyaWFibGVEYXRhbmV3VHlwZURlY2xhcmF0aW9ubmV3VHlwZVZhcmlhYmxlY3JlYXRlVHlwZVZhcmlhYmxlZW52SXNDbG9zZWR0eXBlZGVmQ291bnRyZWdpc3RlclR5cGVkZWZyZWdpc3Rlck1lbWJlcnJlZ2lzdGVyVHlwZVZhcmlhYmxlZm9yRWFjaExpYnJhcnlyZWdpc3RlckJ5SW5kZXhmb3JFYWNoVHlwZWRlZmZvckVhY2hNZW1iZXJfX19tYWluRnVuY3Rpb25nZXRNZXRob2RJbnRlcm5hbF9tYWluTGlicmFyeWdldExpYnJhcnlJbnRlcm5hbGZyb21TcGFubmFibGVObyBkYXRhIGZvciBsaWJyYXJ5RW52X2dldExpYnJhcnlOYW1lY2hlY2tGYW1pbHlfZm9yRWFjaExpYnJhcnlNZW1iZXJjbGFzc0VudmdldENsYXNzSW50ZXJuYWxfZm9yRWFjaENsYXNzZ2V0U3VwZXJUeXBlX2Vuc3VyZVN1cGVydHlwZXNfZW5zdXJlVGhpc0FuZFJhd1R5cGVnZXRUeXBlVmFyaWFibGVJbnRlcm5hbGdldFR5cGVWYXJpYWJsZXN1cGVyZGF0YWxpbmtCdWlsZGVyZGVmYXVsdFN1cGVyY2xhc3NjcmVhdGVPcmRlcmVkVHlwZVNldGdldFR5cGVkZWZJbnRlcm5hbGdldEZpZWxkSW50ZXJuYWxnZXRDb25zdHJ1Y3RvckludGVybmFsTm8gZW5jbG9zaW5nIGNsYXNzIGZvciBzdXBlciBtZW1iZXIgYWNjZXNzIGluIHN1cGVyTWVtYmVyZ2V0U3VwZXJDb25zdHJ1Y3RvcnRhcmdldE5vZGVzb3VyY2VDbGFzc3RhcmdldENsYXNzU3VwZXIgY29uc3RydWN0b3IgZm9yICBub3QgZm91bmQuZ2V0UGFyYW1ldGVyVHlwZXNvcnRlZE5hbWVkUGFyYW1ldGVyc2NvbXB1dGVDb25zdGFudFZhbHVlX2dldENvbnN0YW50VmFsdWVjb25zdGFudFJlcXVpcmVkX2dldEZ1bmN0aW9uVHlwZV9nZXRGdW5jdGlvblR5cGVWYXJpYWJsZXNfZ2V0RmllbGRUeXBlZ2V0Qm91bmRfZ2V0VHlwZVZhcmlhYmxlRGVmYXVsdFR5cGVnZXREZWZhdWx0VHlwZV9pc01peGluQXBwbGljYXRpb25faXNVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbl9pc1N1cGVyTWl4aW5BcHBsaWNhdGlvbl9mb3JFYWNoU3VwZXJ0eXBlX2ZvckVhY2hDb25zdHJ1Y3Rvcl9mb3JFYWNoTG9jYWxDbGFzc01lbWJlcl9mb3JFYWNoQ2xhc3NNZW1iZXJfZ2V0Q29uc3RydWN0b3JDb25zdGFudF9nZXRGaWVsZENvbnN0YW50RXhwcmVzc2lvbmdldE9yZGVyZWRUeXBlU2V0bWF4RGVwdGhnZXRNZW1iZXJEZWZpbml0aW9uSW50ZXJuYWxnZXRDbGFzc0RlZmluaXRpb25JbnRlcm5hbG1lbWJlckRlZmluaXRpb25jYWNoZWRTdGF0aWNUeXBlc05vIHN0YXRpYyB0eXBlcyBjYWNoZWQgZm9yIGdldEdldHRlclNlbGVjdG9yZ2V0U2V0dGVyU2VsZWN0b3JnZXRJbnZvY2F0aW9uU2VsZWN0b3JDYW4gb25seSBnZXQgdGhlIHNlbGVjdG9yIGZvciBhIHByb3BlcnR5IGdldCBvciBhbiBpbnZvY2F0aW9uOiBpck5hbWV0eXBlTG9va3VwcmVzb2x2ZUFzUmF3X3R5cGVMb29rdXBjYWNoZWRNYXlMb29rdXBJbk1haW5tYXlMb29rdXBJbk1haW5tYWluVXJpZmluZEluTGlicmFyeWZpbmRJbl9nZXRTdHJpbmdBcmd1bWVudEpTIGJ1aWx0aW4gZXhwcmVzc2lvbiBoYXMgbm8gdHlwZS5KUyBidWlsdGluIGlzIG1pc3NpbmcgbmFtZS5VbmV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50LkpTIGVtYmVkZGVkIGdsb2JhbCBleHByZXNzaW9uIGhhcyBubyB0eXBlLkpTIGVtYmVkZGVkIGdsb2JhbCBpcyBtaXNzaW5nIG5hbWUuSlMgZW1iZWRkZWQgZ2xvYmFsIGhhcyBtb3JlIHRoYW4gMiBhcmd1bWVudHMuZXh0cmFjdEVudW1JbmRleEZyb21Db25zdGFudFZhbHVlTm8gZXhwcmVzc2lvbiBmb3IgY29uc3RhbnQuTm8gY29uc3RhbnQgZm9yIGdldE1ldGFkYXRhTm8gc3VwZXIgbm9TdWNoTWV0aG9kIGZvdW5kIGZvciBjbGFzcyBjcmVhdGVMaWJyYXJ5Y3JlYXRlQ2xhc3NjcmVhdGVUeXBlZGVmY3JlYXRlR2VuZXJhdGl2ZUNvbnN0cnVjdG9yY3JlYXRlRmFjdG9yeUNvbnN0cnVjdG9yY3JlYXRlQ29uc3RydWN0b3JCb2R5Y3JlYXRlR2VuZXJhdG9yQm9keWNyZWF0ZUdldHRlcmNyZWF0ZU1ldGhvZGNyZWF0ZVNldHRlcmNyZWF0ZUZpZWxkVW5leHBlY3RlZCBlbnRpdHkgLCBleHBlY3RlZCBmYW1pbHkgbGlicmFyeUxpc3RJbnRlcm5hbE5vIGxpYnJhcnkgZW50aXR5IGZvciBObyBjbGFzcyBlbnRpdHkgZm9yIE5vIGZpZWxkIGVudGl0eSBmb3IgTm8gZnVuY3Rpb24gZW50aXR5IGZvciBObyBjb25zdHJ1Y3RvciBlbnRpdHkgZm9yIE5vIHR5cGUgdmFyaWFibGUgZW50aXR5IGZvciAgb24gTm8gdHlwZWRlZiBlbnRpdHkgZm9yIF9nZXRDb25zdHJ1Y3RvckJvZHlfZ2V0UGFyYW1ldGVyU3RydWN0dXJlRnJvbUZ1bmN0aW9uTm9kZWFkZENvbnN0cnVjdG9yQm9keV9jb25zdHJ1Y3RSZWNvcmRGaWVsZEVudHJ5Ym94ZWRGaWVsZGJveGVkRmllbGRzY2FwdHVyZWRWYXJpYWJsZXNBY2Nlc3NvcmNvbnRhaW5lckRhdGFleHRlbmRDbGFzc19pc0luUmVjb3JkcmVjb3JkRmllbGRzVmlzaWJsZUluU2NvcGVjb25zdHJ1Y3RDbG9zdXJlQ2xhc3N0eXBlVmFyaWFibGVBY2Nlc3NfY29tcHV0ZUNsb3N1cmVOYW1lY2xvc3VyZURhdGFfYnVpbGRDbG9zdXJlQ2xhc3NGaWVsZHNfY29uc3RydWN0U2lnbmF0dXJlTWV0aG9kZmllbGROdW1iZXJjYXB0dXJlZExvY2FsY29uc3RydWN0ZWRGaWVsZF9jb25zdHJ1Y3RDbG9zdXJlRmllbGRGb3JSZWNvcmRfY29uc3RydWN0Q2xvc3VyZUZpZWxkVW5leHBlY3RlZCBmaWVsZCBub2RlIHR5cGU6IF9ib3hfX2dldENsb3N1cmVWYXJpYWJsZU5hbWVhbm9ueW1vdXNfY2FwdHVyZWRfZnVuY3Rpb25EYXRhYnVpbHRpblRlbXBsYXRlRm9ySnNFbGVtZW50RW52aXJvbm1lbnRVbmV4cGVjdGVkIG1hcmtlciBUaGUgY29uc3RydWN0b3IgJycgd2FzIG5vdCBmb3VuZCBpbiBjbGFzcyAnaW4gbGlicmFyeSBUaGUgbWVtYmVyICcnIHdhcyBub3QgZm91bmQgaW4gJyB3YXMgbm90IGZvdW5kIGluIGxpYnJhcnkgJycgIHdhcyBub3QgZm91bmQgaW4gbGlicmFyeSAnJyB3YXMgbm90IGZvdW5kLkpzQmVoYXZpb3JCdWlsZGVySnNDb25zdGFudEVudmlyb25tZW50X2Vudmlyb25tZW50X3ZhbHVlTWFwSnNFdmFsdWF0aW9uRW52aXJvbm1lbnRfRXZhbHVhdGlvbkVudmlyb25tZW50LmdldExvY2FsQ29uc3RhbnRfRW50aXR5TG9va3VwTGlicmFyeSBmb3IgaW5kZXggIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZC5DbGFzcyBmb3IgaW5kZXggVHlwZWRlZiBmb3IgaW5kZXggTWVtYmVyIGZvciBpbmRleCBUeXBlIHZhcmlhYmxlIGZvciBpbmRleCBObyBsaWJyYXJ5IGZvdW5kIGZvciBpbmRleCBObyBjbGFzcyBmb3VuZCBmb3IgaW5kZXggTm8gdHlwZWRlZiBmb3VuZCBmb3IgaW5kZXggTm8gbWVtYmVyIGZvdW5kIGZvciBpbmRleCBObyB0eXBlIHZhcmlhYmxlIGZvdW5kIGZvciBpbmRleCBGdW5jdGlvblNldEpzQ2xvc2VkV29ybGRjbG9zZWQtd29ybGRfYWxsRnVuY3Rpb25zX2xpdmVNaXhpblVzZXNfc3VidHlwZUNvdmVyZWRCeUNhY2hlX2Fic3RyYWN0VmFsdWVEb21haW5fc29ydGVyc2Vjb25kTWFwc3ViY2xhc3Nlc05lZWROb1N1Y2hNZXRob2Ryb290Tm9kZXJvb3RDbGFzc19oYXNDb25jcmV0ZU1hdGNoc3RvcEF0U3VwZXJjbGFzc05vIGNsYXNzIHNldCBmb3Igc3VidHlwZU5vZGVzdWJ0eXBlTm9kZXN0eXBlU2V0b3RoZXJUeXBlU2V0c290aGVyQ2xhc3NvdGhlclR5cGVTZXRjb21tb25TdXBlcnR5cGVzYWRkTGl2ZVVzZV9pc05hbWVkTWl4aW5BcHBsaWNhdGlvbmN1cnJlbnRNaXhpbl9lbnN1cmVGdW5jdGlvblNldGhhc0FueVVzZXJEZWZpbmVkR2V0dGVyIGhhcyBub3QgYmVlbiBpbnN0YW50aWF0ZWQuS2VybmVsU29ydGVyX2NvbXBhcmVMaWJyYXJpZXNfY29tcGFyZVNvdXJjZVNwYW5zZW50aXR5MXNvdXJjZVNwYW4xZW50aXR5MnNvdXJjZVNwYW4ycmVndWxhckNsYXNzZXN1bm5hbWVkTWl4aW5zTXVsdGlwbGUgbWl4aW5zIG5hbWVkIGRlZmluaXRpb24xZGVmaW5pdGlvbjJLZXJuZWxTb3J0ZXIuY29tcGFyZVR5cGVkZWZzQnlMb2NhdGlvbiB1bmltcGxlbWVudGVkTG9jYWxMb29rdXBJbXBsX0VudGl0eUNvbnZlcnRlcl9jbG9zdXJlRGF0YUJ1aWxkZXJfYWJzdHJhY3RWYWx1ZVN0cmF0ZWd5a091dHB1dFVuaXREYXRhX2NvbnZlcnRCYWNrZW5kVXNhZ2VfY29udmVydE5hdGl2ZURhdGFfY29udmVydEludGVyY2VwdG9yRGF0YWNvbnZlcnRDbGFzc0hpZXJhcmNoeU5vZGV0b0JhY2tlbmRDbGFzc2hpZXJhcmNoeURlcHRoY29udmVydENsYXNzU2V0bmV3Q2xhc3NTZXRuZXdTdWJ0eXBldG9CYWNrZW5kTWVtYmVyU2V0dG9CYWNrZW5kQ2xhc3NNYXB0b0JhY2tlbmRDbGFzc1NldHRvQmFja2VuZE1lbWJlck1hcGtlcm5lbFJ0aU5lZWRsb2NhbEZ1bmN0aW9uc05vZGVzTmVlZGluZ1NpZ25hdHVyZVVuZXhwZWN0ZWQgbG9jYWwgZnVuY3Rpb24gbm9kZTogbG9jYWxGdW5jdGlvbnNOb2Rlc05lZWRpbmdUeXBlQXJndW1lbnRzalJ0aU5lZWRfY29udmVydFJ1bnRpbWVUeXBlc05lZWRjYWxsTWV0aG9kc05lZWRpbmdTaWduYXR1cmVjYWxsTWV0aG9kc05lZWRpbmdUeXBlQXJndW1lbnRzb2xkTm9TdWNoTWV0aG9kRGF0YXRvQmFja2VuZEZ1bmN0aW9uU2V0b2xkQW5ub3RhdGlvbnNEYXRhX2NvbnZlcnRPdXRwdXRVbml0RGF0YXRvQmFja2VuZFR5cGVfY29udmVydE5hdGl2ZUJhc2ljRGF0YXRvQmFja2VuZExpYnJhcnlNYXBjb252ZXJ0TmF0aXZlQmVoYXZpb3JUeXBlYWxsb3dGcmVlVmFyaWFibGVzY29udmVydE5hdGl2ZUJlaGF2aW9ybmV3QmVoYXZpb3JiYWNrZW5kTWV0aG9kdG9CYWNrZW5kTGlicmFyeW9yaWdpbmFsQ2xvc3VyZUZ1bmN0aW9uTm9kZWJhY2tlbmRFbnRpdHlUcml2aWFsQ2xvc3VyZVJ0aU5lZWRKc0Nsb3N1cmVSdGlOZWVkSnNUb0Zyb250ZW5kTWFwdG9CYWNrZW5kTGlicmFyeVNldHRvQmFja2VuZEZpZWxkU2V0YmFja2VuZEZpZWxkYmFja2VuZEZ1bmN0aW9uSnNUb0Zyb250ZW5kTWFwSW1wbHRvQmFja2VuZEVudGl0eXRvQmFja2VuZFR5cGVkZWZ0b0JhY2tlbmRUeXBlVmFyaWFibGV1bmV4cGVjdGVkIGVudGl0eSBMb2NhbCBmdW5jdGlvbiB0eXBlIHZhcmlhYmxlcyBhcmUgbm90IHN1cHBvcnRlZC5pbmRleGVkVHlwZVZhcmlhYmxlTnVsbCBub3QgYWxsb3dlZCBhcyBjb25zdGFudCB2YWx1ZS5fVHlwZUNvbnZlcnRlcl9mdW5jdGlvblR5cGVWYXJpYWJsZXNjb252ZXJ0VHlwZXNjb252ZXJ0ZXJGdW5jdGlvbiB0eXBlIHZhcmlhYmxlICBub3QgZm91bmQgaW4gX0NvbnN0YW50Q29udmVydGVydHlwZUNvbnZlcnRlcl9oYW5kbGVWYWx1ZXNObyBiYWNrZW5kIGZpZWxkIGZvciBVbmV4cGVjdGVkIHZpc2l0SW50ZXJjZXB0b3IgVW5leHBlY3RlZCBEZWZlcnJlZEdsb2JhbENvbnN0YW50VmFsdWUgY29udmVydE1hcGNvbnZlcnRLZXljb252ZXJ0VmFsdWVuZXdNYXBuZXdLZXlkYXJ0MmpzLmpzX21vZGVsLmxvY2Fsc0dsb2JhbExvY2Fsc01hcGdsb2JhbC1sb2NhbHMtbWFwX2xvY2Fsc01hcHNtYXBDb3VudHJldmVyc2VNYXBObyBtZW1iZXIgcHJvdmlkZWQuTG9jYWxzIG1hcCBhbHJlYWR5IGNyZWF0ZWQgZm9yIEtlcm5lbFRvTG9jYWxzTWFwSW1wbGxvY2Fscy1tYXBfY3VycmVudE1lbWJlcl9sb2NhbHNfdmFyaWFibGVNYXBfanVtcFRhcmdldE1hcF9icmVha3NBc0NvbnRpbnVlbG9jYWxzQ291bnRpc1JlZ3VsYXJQYXJhbWV0ZXJqdW1wQ291bnRyZXZlcnNlZE1hcF9lbnN1cmVKdW1wTWFwanVtcFRhcmdldE1hcGJyZWFrc0FzQ29udGludWVObyB0YXJnZXQgZm9yIGp1bXBJbmRleF9nZXRKdW1wVGFyZ2V0aXNTd2l0Y2hpc1N3aXRjaENhc2VfZ2V0T3JDcmVhdGVMYWJlbGNhbkJlQnJlYWtUYXJnZXRjYW5CZUNvbnRpbnVlVGFyZ2V0bmVlZHNMYWJlbEpKdW1wVGFyZ2V0anVtcC10YXJnZXRfbGFiZWxzbGFiZWxEZWZpbml0aW9uSkp1bXBUYXJnZXQobWVtYmVyQ29udGV4dD0sbmVzdGluZ0xldmVsPSxpc0JyZWFrVGFyZ2V0PSxpc0NvbnRpbnVlVGFyZ2V0PSxsYWJlbHM9SkxhYmVsRGVmaW5pdGlvbkpMYWJlbERlZmluaXRpb24oLGxhYmVsTmFtZT1KTG9jYWxMb2NhbERhdGFmb3JFYWNoT3JkZXJlZFBhcmFtZXRlckFzTG9jYWxkYXJ0MmpzLmNvbW1vbi5yZXNvbHV0aW9uSXJBbm5vdGF0aW9uRGF0YV9uYXRpdmVDbGFzc05hbWVzX25hdGl2ZU1lbWJlcnNfbmF0aXZlTWVtYmVyTmFtZXNfY3JlYXRlc0Fubm90YXRpb25zX3JldHVybnNBbm5vdGF0aW9uc19qc0ludGVyb3BMaWJyYXJ5TmFtZXNfanNJbnRlcm9wQ2xhc3NOYW1lc19hbm9ueW1vdXNKc0ludGVyb3BDbGFzc2VzX2pzSW50ZXJvcE1lbWJlck5hbWVzX21lbWJlclByYWdtYUFubm90YXRpb25zZ2V0TmF0aXZlQ2xhc3NOYW1laGFzTmF0aXZlQm9keWdldE5hdGl2ZU1lbWJlck5hbWVnZXRNZW1iZXJQcmFnbWFBbm5vdGF0aW9uRGF0YVByYWdtYUFubm90YXRpb25EYXRhUHJhZ21hQW5ub3RhdGlvbkRhdGEocHJvY2Vzc0Fubm90YXRpb25zcHJvY2Vzc01lbWJlcnByYWdtYUFubm90YXRpb25uYXRpdmVDbGFzc05hbWVfZ2V0TmF0aXZlQ2xhc3NOYW1lX2lzTmF0aXZlTWVtYmVyX2dldE5hdGl2ZU1lbWJlck5hbWVfZ2V0Q3JlYXRlc0Fubm90YXRpb25fZ2V0UmV0dXJuc0Fubm90YXRpb25fZ2V0SnNJbnRlcm9wTmFtZV9pc0Fub255bW91c0pzSW50ZXJvcF9nZXRQcmFnbWFBbm5vdGF0aW9uY29tcHV0ZVByYWdtYUFubm90YXRpb25EYXRhRnJvbUlyY29uc3RhbnRFeHByZXNzaW9uS2VybmVsU2NvcGVJbmZvd2l0aEJveGVkVmFyaWFibGVzS2VybmVsU2NvcGVJbmZvKHRoaXM9ZnJlZVZyaWFibGVzPWZyZWVWYXJpYWJsZXNGb3JSdGk9e0tlcm5lbENhcHR1cmVkU2NvcGVmb3JTaWduYXR1cmVLZXJuZWxDYXB0dXJlZExvb3BTY29wZU5vZGVCb3hWYXJpYWJsZVVzZUtpbmRleHBsaWNpdFZhcmlhYmxlVXNlS2luZC5leHBsaWNpdGxvY2FsVHlwZVZhcmlhYmxlVXNlS2luZC5sb2NhbFR5cGVWYXJpYWJsZVVzZUtpbmQuaW1wbGljaXRDYXN0VmFyaWFibGVVc2VLaW5kLmxpc3RMaXRlcmFsVmFyaWFibGVVc2VLaW5kLnNldExpdGVyYWxtYXBMaXRlcmFsVmFyaWFibGVVc2VLaW5kLm1hcExpdGVyYWxjb25zdHJ1Y3RvclR5cGVBcmd1bWVudFZhcmlhYmxlVXNlS2luZC5jb25zdHJ1Y3RvclR5cGVBcmd1bWVudHN0YXRpY1R5cGVBcmd1bWVudFZhcmlhYmxlVXNlS2luZC5zdGF0aWNUeXBlQXJndW1lbnRpbnN0YW5jZVR5cGVBcmd1bWVudFZhcmlhYmxlVXNlS2luZC5pbnN0YW5jZVR5cGVBcmd1bWVudGxvY2FsVHlwZUFyZ3VtZW50VmFyaWFibGVVc2VLaW5kLmxvY2FsVHlwZUFyZ3VtZW50bWVtYmVyUGFyYW1ldGVyVmFyaWFibGVVc2VLaW5kLm1lbWJlclBhcmFtZXRlcmxvY2FsUGFyYW1ldGVyVmFyaWFibGVVc2VLaW5kLmxvY2FsUGFyYW1ldGVybWVtYmVyUmV0dXJuVHlwZVZhcmlhYmxlVXNlS2luZC5tZW1iZXJSZXR1cm5UeXBlbG9jYWxSZXR1cm5UeXBlVmFyaWFibGVVc2VLaW5kLmxvY2FsUmV0dXJuVHlwZWZpZWxkVHlwZVZhcmlhYmxlVXNlS2luZC5maWVsZFR5cGVpbnN0YW50aWF0aW9uVHlwZUFyZ3VtZW50VmFyaWFibGVVc2VLaW5kLmluc3RhbnRpYXRpb25UeXBlQXJndW1lbnRWYXJpYWJsZVVzZV9zaW1wbGVWYXJpYWJsZVVzZShraW5kPSxtZW1iZXI9bG9jYWxGdW5jdGlvbj0saW52b2NhdGlvbj1pbnN0YW50aWF0aW9uPVR5cGVWYXJpYWJsZUtpbmRUeXBlVmFyaWFibGVLaW5kLmNsc1R5cGVWYXJpYWJsZUtpbmQubWV0aG9kVHlwZVZhcmlhYmxlS2luZC5sb2NhbFR5cGVWYXJpYWJsZUtpbmQuZnVuY3Rpb25UeXBlVmFyaWFibGVUeXBlV2l0aENvbnRleHRVbmV4cGVjdGVkIHR5cGUgZGVjbGFyYXRpb246IFR5cGVWYXJpYWJsZVR5cGVXaXRoQ29udGV4dC5hY2NlcHRUeXBlVmFyaWFibGVUeXBlV2l0aENvbnRleHQudmlzaXRDaGlsZHJlblR5cGVWYXJpYWJsZVR5cGVXaXRoQ29udGV4dCh0eXBlPSxjb250ZXh0PSx0eXBlRGVjbGFyYXRpb249SW1wYWN0UmVnaXN0cnlyZWdpc3RlckludExpdGVyYWxyZWdpc3RlckRvdWJsZUxpdGVyYWxyZWdpc3RlckJvb2xMaXRlcmFscmVnaXN0ZXJTdHJpbmdMaXRlcmFscmVnaXN0ZXJTeW1ib2xMaXRlcmFscmVnaXN0ZXJOdWxsTGl0ZXJhbHJlZ2lzdGVyTGlzdExpdGVyYWxyZWdpc3RlclNldExpdGVyYWxyZWdpc3Rlck1hcExpdGVyYWxyZWdpc3RlclN0YXRpY1RlYXJPZmZyZWdpc3RlclN0YXRpY0dldHJlZ2lzdGVyU3RhdGljU2V0cmVnaXN0ZXJBc3NlcnR3aXRoTWVzc2FnZXJlZ2lzdGVyU3luY1N0YXJyZWdpc3RlckFzeW5jcmVnaXN0ZXJBc3luY1N0YXJyZWdpc3RlclN0cmluZ0NvbmNhdGVuYXRpb25yZWdpc3RlckxvY2FsRnVuY3Rpb25yZWdpc3RlckxvY2FsV2l0aG91dEluaXRpYWxpemVycmVnaXN0ZXJJbXBsaWNpdENhc3RyZWdpc3RlckFzQ2FzdHJlZ2lzdGVyVGhyb3dyZWdpc3RlclN5bmNGb3JJbnJlZ2lzdGVyQXN5bmNGb3JJbnJlZ2lzdGVyQ2F0Y2hyZWdpc3RlclN0YWNrVHJhY2VyZWdpc3RlckNhdGNoVHlwZXJlZ2lzdGVyRmllbGRJbml0aWFsaXphdGlvbnJlZ2lzdGVyRmllbGRDb25zdGFudEluaXRpYWxpemF0aW9ucmVnaXN0ZXJMb2FkTGlicmFyeXJlZ2lzdGVyUmVkaXJlY3RpbmdJbml0aWFsaXplcnJlZ2lzdGVyUGFyYW1ldGVyQ2hlY2tyZWdpc3RlckxhenlGaWVsZHJlZ2lzdGVyTmV3cmVnaXN0ZXJDb25zdEluc3RhbnRpYXRpb25yZWdpc3RlckxvY2FsRnVuY3Rpb25JbnZvY2F0aW9ucmVnaXN0ZXJJbnN0YW5jZUludm9jYXRpb25yZWdpc3RlckZ1bmN0aW9uSW52b2NhdGlvbnJlZ2lzdGVyRHluYW1pY0dldHJlZ2lzdGVySW5zdGFuY2VHZXRyZWdpc3RlckR5bmFtaWNTZXRyZWdpc3Rlckluc3RhbmNlU2V0cmVnaXN0ZXJTdXBlckludm9jYXRpb25yZWdpc3RlclN1cGVyR2V0cmVnaXN0ZXJTdXBlclNldHJlZ2lzdGVyU3VwZXJJbml0aWFsaXplcnJlZ2lzdGVyQ29uc3RydWN0b3JOb2RlcmVnaXN0ZXJGaWVsZE5vZGVyZWdpc3RlclByb2NlZHVyZU5vZGVyZWdpc3RlclN0YXRpY0ludm9jYXRpb25Ob2RlcmVnaXN0ZXJTd2l0Y2hTdGF0ZW1lbnROb2RlcmVnaXN0ZXJDb25zdENvbnN0cnVjdG9ySW52b2NhdGlvbk5vZGVJbXBhY3RCdWlsZGVyQmFzZV9jb21wdXRlQ2xhc3NSZWxhdGlvbkZyb21UeXBlaGFuZGxlSW50TGl0ZXJhbGhhbmRsZURvdWJsZUxpdGVyYWxoYW5kbGVCb29sTGl0ZXJhbGhhbmRsZVN0cmluZ0xpdGVyYWxoYW5kbGVTeW1ib2xMaXRlcmFsaGFuZGxlTnVsbExpdGVyYWxoYW5kbGVMaXN0TGl0ZXJhbGhhbmRsZVNldExpdGVyYWxoYW5kbGVNYXBMaXRlcmFsaGFuZGxlU3RhdGljR2V0aGFuZGxlU3RhdGljU2V0aGFuZGxlQXNzZXJ0U3RhdGVtZW50aGFuZGxlSW5zdGFudGlhdGlvbmhhbmRsZUFzeW5jTWFya2VyVW5leHBlY3RlZCBhc3luYyBtYXJrZXI6IGhhbmRsZVN0cmluZ0NvbmNhdGVuYXRpb25oYW5kbGVGdW5jdGlvbkRlY2xhcmF0aW9uaGFuZGxlRnVuY3Rpb25FeHByZXNzaW9uaGFuZGxlVmFyaWFibGVEZWNsYXJhdGlvbmhhbmRsZUlzRXhwcmVzc2lvbmhhbmRsZUFzRXhwcmVzc2lvbmhhbmRsZVRocm93aGFuZGxlRm9ySW5TdGF0ZW1lbnRoYW5kbGVDYXRjaGhhbmRsZVR5cGVMaXRlcmFsaGFuZGxlRmllbGRJbml0aWFsaXplcmhhbmRsZUxvYWRMaWJyYXJ5aGFuZGxlUmVkaXJlY3RpbmdJbml0aWFsaXplcmFyZ3VtZW50VHlwZXNoYW5kbGVTaWduYXR1cmVoYW5kbGVDb25zdHJ1Y3RvcmhhbmRsZUZpZWxkaGFuZGxlUHJvY2VkdXJlaGFuZGxlU3RhdGljSW52b2NhdGlvbnBvc2l0aW9uQXJndW1lbnRzaGFuZGxlTWV0aG9kSW52b2NhdGlvbmhhbmRsZURpcmVjdE1ldGhvZEludm9jYXRpb25oYW5kbGVQcm9wZXJ0eUdldGhhbmRsZURpcmVjdFByb3BlcnR5R2V0aGFuZGxlUHJvcGVydHlTZXRoYW5kbGVEaXJlY3RQcm9wZXJ0eVNldGhhbmRsZVN1cGVyTWV0aG9kSW52b2NhdGlvbmhhbmRsZVN1cGVyUHJvcGVydHlHZXRoYW5kbGVTdXBlclByb3BlcnR5U2V0aGFuZGxlU3VwZXJJbml0aWFsaXplcmhhbmRsZVJ1bnRpbWVUeXBlVXNlaGFuZGxlQ29uc3RhbnRFeHByZXNzaW9uX0ltcGFjdEJ1aWxkZXImSW1wYWN0QnVpbGRlckJhc2UmSW1wYWN0UmVnaXN0cnlNaXhpbmltcGFjdERhdGFfcmVnaXN0ZXJGZWF0dXJlX3JlZ2lzdGVyVHlwZVVzZV9zdXBlckluaXRpYWxpemVyc19zdXBlclNldHNfc3VwZXJHZXRzX3N1cGVySW52b2NhdGlvbnNfaW5zdGFuY2VTZXRzX2R5bmFtaWNTZXRzX2luc3RhbmNlR2V0c19keW5hbWljR2V0c19mdW5jdGlvbkludm9jYXRpb25zX2luc3RhbmNlSW52b2NhdGlvbnNfZHluYW1pY0ludm9jYXRpb25zX2xvY2FsRnVuY3Rpb25JbnZvY2F0aW9uc19zdGF0aWNJbnZvY2F0aW9uc19jb25zdHJ1Y3Rvckludm9jYXRpb25zX2NvbnN0SW5zdGFudGlhdGlvbnNfcmVkaXJlY3RpbmdJbml0aWFsaXplcnNfZmllbGRJbml0aWFsaXplcnNfZmllbGRDb25zdGFudEluaXRpYWxpemVyc19sb2NhbEZ1bmN0aW9uc19zdGF0aWNTZXRzX3N0YXRpY0dldHNfc3RhdGljVGVhck9mZnNfbWFwTGl0ZXJhbHNfbGlzdExpdGVyYWxzX3NldExpdGVyYWxzX3N5bWJvbExpdGVyYWxzX3N0cmluZ0xpdGVyYWxzX2Jvb2xMaXRlcmFsc19kb3VibGVMaXRlcmFsc19pbnRMaXRlcmFsc19jb25zdHJ1Y3Rvck5vZGVzX2ZpZWxkTm9kZXNfcHJvY2VkdXJlTm9kZXNfc3RhdGljSW52b2NhdGlvbk5vZGVzX3N3aXRjaFN0YXRlbWVudE5vZGVzX2NvbnN0Q29uc3RydWN0b3JJbnZvY2F0aW9uTm9kZXNJbXBhY3RCdWlsZGVydHlwZU1hcHNGb3JUZXN0aW5nSW1wYWN0QnVpbGRlckRhdGFDb25zdGFudEltcGFjdFZpc2l0b3JVbmV4cGVjdGVkIGNvbnN0YW50IF9nZXROYW1lZEFyZ3VtZW50c01vZHVsYXJNZW1iZXJEYXRhTW9kdWxhclN0cmF0ZWd5Y29tcHV0ZU1vZGVsVmFyaWFibGVTY29wZU1vZGVsZ2V0U2NvcGVGb3Jhc3NpZ25lZFZhcmlhYmxlc1ZhcmlhYmxlU2NvcGVNb2RlbEltcGxfYXNzaWduZWRWYXJpYWJsZXNjcmVhdGVTY29wZUZvcnJlZ2lzdGVyQXNzaWduZWRWYXJpYWJsZVZhcmlhYmxlU2NvcGVoYXNDb250aW51ZVN3aXRjaFZhcmlhYmxlU2NvcGVJbXBsX3N1YlNjb3Blc2FkZFN1YlNjb3Blc3ViU2NvcGVWYXJpYWJsZUNvbGxlY3Rvck1peGluY3VycmVudFZhcmlhYmxlU2NvcGV2aXNpdEluVmFyaWFibGVTY29wZW9sZFNjb3BlcmVnaXN0ZXJDb250aW51ZVN3aXRjaGtlcm5lbC5kZWZlcnJlZF9sb2FkX2RhdGFLZXJuZWxEZWZlcnJlZExvYWRUYXNrX2FkZGl0aW9uYWxFeHBvcnRzU2V0c19maW5kSW1wb3J0c1Rvbm9kZU5hbWVmaW5kLWltcG9ydHNnZXRMaWJyYXJ5Tm9kZWdldFR5cGVkZWZOb2RlQ29uc3RhbnRDb2xsZWN0b3JfaXNWaXNpYmxlS2VybmVsVG9FbGVtZW50TWFwZ2V0Rm9yZWlnbktpbmRnZXRJbnRlcmZhY2VUeXBlRm9ySnNJbnRlcmNlcHRvckNhbGxnZXRMb2NhbEZ1bmN0aW9uRm9yZWlnbktpbmRGb3JlaWduS2luZC5KU0ZvcmVpZ25LaW5kLkpTX0JVSUxUSU5Gb3JlaWduS2luZC5KU19FTUJFRERFRF9HTE9CQUxGb3JlaWduS2luZC5KU19JTlRFUkNFUFRPUl9DT05TVEFOVEZvcmVpZ25LaW5kLk5PTkVkYXJ0MmpzLmtlcm5lbC5lbGVtZW50X21hcG5hdGl2ZV9iYXNpY19kYXRhLmRhcnRub19zdWNoX21ldGhvZF9yZXNvbHZlci5kYXJ0S2VybmVsVG9FbGVtZW50TWFwSW1wbF9jb25zdGFudEV2YWx1YXRvcl9jb25zdGFudFZhbHVlZmllcl9uYXRpdmVCZWhhdmlvckJ1aWxkZXJlbnN1cmVDbGFzc01lbWJlcnNlbnN1cmVNZW1iZXJzX2ZvckVhY2hNaXhpbktlcm5lbFRvRWxlbWVudE1hcEJhc2UuX2ZvckVhY2hJbmplY3RlZENsYXNzTWVtYmVyX2dldFR5cGVkZWZOb2RlZ2V0UGFyYW1ldGVyU3RydWN0dXJlaW5jbHVkZVR5cGVQYXJhbWV0ZXJzX2dldExpYnJhcnlDcmVhdGVFbnZpcm9ubWVudCBvZiAgaXMgY2xvc2VkLiBUcnlpbmcgdG8gY3JlYXRlIGxpYnJhcnkgZm9yIF9nZXRDbGFzc0NyZWF0ZWNsYXNzIGZvciBfZ2V0VHlwZWRlZkNyZWF0ZXR5cGVkZWYgZm9yIF9nZXRUeXBlVmFyaWFibGVDcmVhdGV0eXBlIHZhcmlhYmxlIGZvciBVbnN1cHBvcnRlZCBmdW5jdGlvbiB0eXBlIHBhcmFtZXRlciBwYXJlbnQgbm9kZSBVbnN1cHBvcnRlZCB0eXBlIHBhcmFtZXRlciB0eXBlIG5vZGUgX2dldENvbnN0cnVjdG9yQ3JlYXRlY29uc3RydWN0b3IgZm9yIGlzRnJvbUVudmlyb25tZW50VW5leHBlY3RlZCBjb25zdHJ1Y3RvciBub2RlOiBfZ2V0TWV0aG9kQ3JlYXRlZnVuY3Rpb24gZm9yIENhbm5vdCBjcmVhdGUgbWV0aG9kIGZyb20gZmFjdG9yeS5fZ2V0RmllbGRDcmVhdGVmaWVsZCBmb3IgbmF0aXZlQmVoYXZpb3JCdWlsZGVyZ2V0Q2FjaGVkU3RhdGljVHlwZXNnZXRUeXBlTWFwc0ZvclRlc3RpbmdfbG9va3VwUHJvY2VkdXJlSW52YWxpZCBsb2NhbCBmdW5jdGlvbiBub2RlOiBfaW1wbGVtZW50c0Z1bmN0aW9uVW5leHBlY3RlZCBtZXRob2Qgbm9kZSBLZXJuZWxFbGVtZW50RW52aXJvbm1lbnRsaWJyYXJ5RGF0YUtlcm5lbEJlaGF2aW9yQnVpbGRlcktlcm5lbENvbnN0YW50RW52aXJvbm1lbnRLZXJuZWxFdmFsdWF0aW9uRW52aXJvbm1lbnRLZXJuZWxOYXRpdmVNZW1iZXJSZXNvbHZlcl9pZGVudGlmaWVyXlthLXpBLVpfJF1bYS16QS1aMC05XyRdKiRfcHJvY2Vzc01ldGhvZEFubm90YXRpb25zX2NvbXB1dGVOYXRpdmVNZXRob2RCZWhhdmlvcl9wcm9jZXNzRmllbGRBbm5vdGF0aW9uc2ZpZWxkTG9hZEJlaGF2aW9yX2NvbXB1dGVOYXRpdmVGaWVsZExvYWRCZWhhdmlvcmZpZWxkU3RvcmVCZWhhdmlvcl9jb21wdXRlTmF0aXZlRmllbGRTdG9yZUJlaGF2aW9yX3NldE5hdGl2ZU5hbWVfZmluZEpzTmFtZUZyb21Bbm5vdGF0aW9uQEpTTmFtZSguLi4pIGFubm90YXRpb24gaXMgbm90IHN1cHBvcnRlZCBmb3Igc3RhdGljIGZpZWxkczogX2lzTmF0aXZlTWV0aG9kX3NldE5hdGl2ZU5hbWVGb3JTdGF0aWNNZXRob2RfaXNJZGVudGlmaWVybmF0aXZlTmFtZXNVbmFibGUgdG8gZGV0ZXJtaW5lIGEgbmF0aXZlIG5hbWUgZm9yIHRoZSBlbmNsb3NpbmcgY2xhc3MsIG9wdGlvbnM6IFRvbyBtYW55IEpTTmFtZSBhbm5vdGF0aW9uczogS2VybmVsQ2xhc3NRdWVyaWVzS2VybmVsQW5ub3RhdGlvblByb2Nlc3Nvcl9uYXRpdmVCYXNpY0RhdGFCdWlsZGVyYW5ub3RhdGlvbk5hbWVUb28gbWFueSBuYW1lIGFubm90YXRpb25zLmdldEpzSW50ZXJvcE5hbWVjaGVja0Z1bmN0aW9uUGFyYW1ldGVyc2lzRXhwbGljaXRseWx5SnNMaWJyYXJ5aXNKc0xpYnJhcnlpbXBsZW1lbnRzSnNKYXZhU2NyaXB0T2JqZWN0Q2xhc3NLZXJuZWxOb1N1Y2hNZXRob2RSZXNvbHZlcmZpcnN0UGFyYW1ldGVyX2NyZWF0ZURpYWdub3N0aWNNZXNzYWdlcmVwb3J0TG9jYXRlZE1lc3NhZ2Vjb21waWxlci5rZXJuZWwuZnJvbnRfZW5kX2FkYXB0ZXJDb21waWxlckZpbGVTeXN0ZW1fQ29tcGlsZXJGaWxlU3lzdGVtRW50aXR5RmlsZSBub3QgZm91bmRyZXBvcnRGcm9udEVuZE1lc3NhZ2VfZ2V0U3Bhbm5hYmxlX2NvbnZlcnRNZXNzYWdlbWFpbk1lc3NhZ2V1bmhhbmRsZWQgc2V2ZXJpdHkgQ2xvc3VyZURhdGFTY29wZUluZm9LaW5kU2NvcGVJbmZvS2luZC5zY29wZUluZm9TY29wZUluZm9LaW5kLmNhcHR1cmVkU2NvcGVjYXB0dXJlZExvb3BTY29wZVNjb3BlSW5mb0tpbmQuY2FwdHVyZWRMb29wU2NvcGVjbG9zdXJlUmVwcmVzZW50YXRpb25JbmZvU2NvcGVJbmZvS2luZC5jbG9zdXJlUmVwcmVzZW50YXRpb25JbmZvU2NvcGVJbmZvVW5leHBlY3RlZCBTY29wZUluZm9LaW5kIC53cml0ZVRvRGF0YVNpbmtDYXB0dXJlZFNjb3BlVW5leHBlY3RlZCBDYXB0dXJlZFNjb3BlIGtpbmQgQ2FwdHVyZWRMb29wU2NvcGVVbmV4cGVjdGVkIENhcHR1cmVkTG9vcFNjb3BlIGtpbmQgQ2xvc3VyZVJlcHJlc2VudGF0aW9uSW5mb1VuZXhwZWN0ZWQgQ2xvc3VyZVJlcHJlc2VudGF0aW9uSW5mbyBraW5kIEJveExvY2FsKFR5cGVWYXJpYWJsZUxvY2FsdHlwZV92YXJpYWJsZV9sb2NhbChKU0VudGl0eVByaXZhdGVseU5hbWVkSlNFbnRpdHllbGVtZW50cy5qdW1wc0xhYmVsRGVmaW5pdGlvbmlzVGFyZ2V0SW52b2tlRHluYW1pY1NwZWNpYWxpemVyY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlc3RyeUNvbnZlcnRUb0J1aWx0aW5yZW5hbWVUb09wdGltaXplZFNlbGVjdG9ybG9va3VwU3BlY2lhbGl6ZXJJbmRleEFzc2lnblNwZWNpYWxpemVyX3ZhbHVlUGFyYW1ldGVyQ2hlY2tBbHdheXNTdWNjZWVkc3JlZ2lzdGVySW5kZXhBc3NpZ25JbmRleFNwZWNpYWxpemVycmVnaXN0ZXJJbmRleEJpdE5vdFNwZWNpYWxpemVycmVnaXN0ZXJCaXROb3RVbmFyeU5lZ2F0ZVNwZWNpYWxpemVycmVnaXN0ZXJVbmFyeU5lZ2F0ZUFic1NwZWNpYWxpemVycmVnaXN0ZXJBYnNyZWdpc3Rlck9wdGltaXphdGlvbkJpbmFyeUFyaXRobWV0aWNTcGVjaWFsaXplcmlzQnVpbHRpbmJ1aWx0aW5uZXdCdWlsdGluVmFyaWFudGlucHV0c0FyZVBvc2l0aXZlSW50ZWdlcnNpbnB1dHNBcmVVSW50MzFBZGRTcGVjaWFsaXplcnJlZ2lzdGVyQWRkRGl2aWRlU3BlY2lhbGl6ZXJyZWdpc3RlckRpdmlkZU1vZHVsb1NwZWNpYWxpemVyY2FuQmVQb3NpdGl2ZVplcm9pblBoaWNhbkJlTmVnYXRpdmVaZXJvcmVnaXN0ZXJNb2R1bG9SZW1haW5kZXJTcGVjaWFsaXplcnJlZ2lzdGVyUmVtYWluZGVyTXVsdGlwbHlTcGVjaWFsaXplcnJlZ2lzdGVyTXVsdGlwbHlTdWJ0cmFjdFNwZWNpYWxpemVycmVnaXN0ZXJTdWJ0cmFjdFRydW5jYXRpbmdEaXZpZGVTcGVjaWFsaXplcmhhc1VpbnQzMVJlc3VsdGlzTm90WmVyb2lzVHdvT3JHcmVhdGVyX3RkaXZGYXN0cmVnaXN0ZXJUcnVuY2F0aW5nRGl2aWRlQmluYXJ5Qml0T3BTcGVjaWFsaXplcmFyZ3VtZW50TGVzc1RoYW4zMmFyZ3VtZW50SW5SYW5nZVNoaWZ0TGVmdFNwZWNpYWxpemVyX3NobFBvc2l0aXZlcmVnaXN0ZXJTaGlmdExlZnRTaGlmdFJpZ2h0U3BlY2lhbGl6ZXJfc2hyQm90aFBvc2l0aXZlX3NoclJlY2VpdmVyUG9zaXRpdmVfc2hyT3RoZXJQb3NpdGl2ZXJlZ2lzdGVyU2hpZnRSaWdodEJpdE9yU3BlY2lhbGl6ZXJyZWdpc3RlckJpdE9yQml0QW5kU3BlY2lhbGl6ZXJyZWdpc3RlckJpdEFuZEJpdFhvclNwZWNpYWxpemVycmVnaXN0ZXJCaXRYb3JSZWxhdGlvbmFsU3BlY2lhbGl6ZXJFcXVhbHNTcGVjaWFsaXplcnJlZ2lzdGVyRXF1YWxzTGVzc1NwZWNpYWxpemVycmVnaXN0ZXJMZXNzR3JlYXRlclNwZWNpYWxpemVycmVnaXN0ZXJHcmVhdGVyR3JlYXRlckVxdWFsU3BlY2lhbGl6ZXJyZWdpc3RlckdyZWF0ZXJFcXVhbExlc3NFcXVhbFNwZWNpYWxpemVycmVnaXN0ZXJMZXNzRXF1YWxDb2RlVW5pdEF0U3BlY2lhbGl6ZXJfY29kZVVuaXRBdHJlZ2lzdGVyQ29kZVVuaXRBdENvbXBhcmVUb1NwZWNpYWxpemVycmVnaXN0ZXJDb21wYXJlVG9JZGVtcG90ZW50U3RyaW5nT3BlcmF0aW9uU3BlY2lhbGl6ZXJTdWJzdHJpbmdTcGVjaWFsaXplcnJlZ2lzdGVyU3Vic3RyaW5nVHJpbVNwZWNpYWxpemVycmVnaXN0ZXJUcmltUGF0dGVybk1hdGNoU3BlY2lhbGl6ZXJyZWdpc3RlclBhdHRlcm5NYXRjaFJvdW5kU3BlY2lhbGl6ZXJyZWdpc3RlclJvdW5kSFZhbGlkYXRvcnZpc2l0ZWVtYXJrSW52YWxpZGVtcHR5IGJsb2NrYmxvY2sgZW5kcyB3aXRoIG5vbi10YWlsIG5vZGUuSWYgbm9kZSB3aXRob3V0IHR3byBzdWNjZXNzb3JzQ29uZGl0aW9uYWwgbm9kZSB3aXRob3V0IHR3byBzdWNjZXNzb3JzYXZvaWRDcml0aWNhbEVkZ2VCbG9ja0NyaXRpY2FsIGVkZ2UgYmxvY2sgY29udGFpbnMgaW5zdHJ1Y3Rpb25zR290byBub2RlIHdpdGggbm90IGV4YWN0bHkgb25lIHN1Y2Nlc3NvckJyZWFrIG9yIGNvbnRpbnVlIG5vZGUgd2l0aG91dCBvbmUgc3VjY2Vzc29yUmV0dXJuIG9yIHRocm93IG5vZGUgd2l0aCA+IDEgc3VjY2Vzc29yIG9yIG5vdCBnb2luZyB0byBleGl0LWJsb2NrRXhpdCBibG9jayB3aXRoIHN1Y2Nlc3Nvck5vbi1leGl0IGJsb2NrIHdpdGhvdXQgc3VjY2Vzc29yYmxvY2sgd2l0aG91dCBpZHN1Y2Nlc3NvciB3aXRob3V0IGlkc3VjY2Vzc29yIHdpdGggbG93ZXIgaWQsIGJ1dCBub3QgYSBsb29wLWhlYWRlclNTQSBncmFwaCBjb250YWlucyBjcml0aWNhbCBlZGdlLmxhc3RJZGRvbWluYXRlZGRvbWluYXRlZCBibG9jayBub3QgcG9pbnRpbmcgYmFja2RvbWluYXRlZC5pZCA9PSBudWxsIG9yIGRvbWluYXRlZCBoYXMgPD0gaWREZWZpbml0aW9uIGRvZXMgbm90IGRvbWluYXRlIHVzZWNvdW50SW5zdHJ1Y3Rpb25ldmVyeUluc3RydWN0aW9uaGFzQ29ycmVjdElucHV0c2luQmFzaWNCbG9ja2hhc0NvcnJlY3RVc2VzSW5zdHJ1Y3Rpb24gaW4gd3JvbmcgYmxvY2tJbmNvcnJlY3QgaW5wdXRzSW5jb3JyZWN0IHVzZXNlbnRpdHlfdXRpbHNjb21wYXJlTGlicmFyaWVzVXJpc2J5Q2Fub25pY2FsVXJpUGF0aF9jb21wYXJlQ2Fub25pY2FsVXJpYVNlZ21lbnRzYlNlZ21lbnRzYUliSWFTZWdtZW50YlNlZ21lbnRjb21wYXJlU291cmNlVXJpc2NvbXBhcmVFbnRpdGllc2VsZW1lbnQxbGluZTFjb2x1bW4xZWxlbWVudDJsaW5lMmNvbHVtbjJyZWNvbnN0cnVjdENvbnN0cnVjdG9yTmFtZXJlY29uc3RydWN0Q29uc3RydWN0b3JOYW1lU291cmNlU3RyaW5nb3BlcmF0b3IkZXFvcGVyYXRvciRub3RvcGVyYXRvciRpbmRleG9wZXJhdG9yJGluZGV4U2V0b3BlcmF0b3IkbXVsb3BlcmF0b3IkZGl2b3BlcmF0b3IkbW9kb3BlcmF0b3IkdGRpdm9wZXJhdG9yJGFkZG9wZXJhdG9yJHNobG9wZXJhdG9yJHNocm9wZXJhdG9yJGdlb3BlcmF0b3IkZ3RvcGVyYXRvciRsZW9wZXJhdG9yJGx0b3BlcmF0b3IkYW5kb3BlcmF0b3IkeG9yb3BlcmF0b3Ikb3JvcGVyYXRvciRzdWJvcGVyYXRvciRuZWdhdGVjb25zdHJ1Y3RPcGVyYXRvck5hbWVPck51bGxpc1VuYXJ5Y29uc3RydWN0T3BlcmF0b3JOYW1lb3BlcmF0b3JOYW1lVW5oYW5kbGVkIG9wZXJhdG9yOiBkYXJ0MmpzLm9wZXJhdG9yc1VuYXJ5T3BlcmF0b3JLaW5kTk9UVW5hcnlPcGVyYXRvcktpbmQuTk9UTkVHQVRFVW5hcnlPcGVyYXRvcktpbmQuTkVHQVRFQ09NUExFTUVOVFVuYXJ5T3BlcmF0b3JLaW5kLkNPTVBMRU1FTlRVbmFyeU9wZXJhdG9yaXNVc2VyRGVmaW5hYmxlZnJvbUtpbmRCaW5hcnlPcGVyYXRvcktpbmRCaW5hcnlPcGVyYXRvcktpbmQuRVFOT1RfRVFCaW5hcnlPcGVyYXRvcktpbmQuTk9UX0VRQmluYXJ5T3BlcmF0b3JLaW5kLklOREVYQUREQmluYXJ5T3BlcmF0b3JLaW5kLkFERFNVQkJpbmFyeU9wZXJhdG9yS2luZC5TVUJNVUxCaW5hcnlPcGVyYXRvcktpbmQuTVVMRElWQmluYXJ5T3BlcmF0b3JLaW5kLkRJVklESVZCaW5hcnlPcGVyYXRvcktpbmQuSURJVk1PREJpbmFyeU9wZXJhdG9yS2luZC5NT0RTSExCaW5hcnlPcGVyYXRvcktpbmQuU0hMU0hSQmluYXJ5T3BlcmF0b3JLaW5kLlNIUkdURVFCaW5hcnlPcGVyYXRvcktpbmQuR1RFUUJpbmFyeU9wZXJhdG9yS2luZC5HVExURVFCaW5hcnlPcGVyYXRvcktpbmQuTFRFUUJpbmFyeU9wZXJhdG9yS2luZC5MVEFOREJpbmFyeU9wZXJhdG9yS2luZC5BTkRPUkJpbmFyeU9wZXJhdG9yS2luZC5PUlhPUkJpbmFyeU9wZXJhdG9yS2luZC5YT1JCaW5hcnlPcGVyYXRvcktpbmQuTE9HSUNBTF9BTkRCaW5hcnlPcGVyYXRvcktpbmQuTE9HSUNBTF9PUklGX05VTExCaW5hcnlPcGVyYXRvcktpbmQuSUZfTlVMTEJpbmFyeU9wZXJhdG9ycGFyc2VVc2VyRGVmaW5hYmxlX05vdEVxdWFsc09wZXJhdG9yX0xvZ2ljYWxPcGVyYXRvcl9JZk51bGxPcGVyYXRvcmludm9jYXRpb25NaXJyb3JNZXRob2RLaW5kaW52b2NhdGlvbk1pcnJvckdldHRlcktpbmRpbnZvY2F0aW9uTWlycm9yU2V0dGVyS2luZENsYXNzUmVsYXRpb25DbGFzc1JlbGF0aW9uLnN1YnR5cGVDbGFzc1JlbGF0aW9uLnRoaXNFeHByZXNzaW9uQ2xhc3NSZWxhdGlvbi5leGFjdFN0YXRpY1R5cGVWaXNpdG9yX3BlbmRpbmdSdW50aW1lVHlwZVVzZURhdGFfY3VycmVudFZhcmlhYmxlc19pbnZhbGlkYXRlZFZhcmlhYmxlc190eXBlTWFwQmFzZV90eXBlTWFwV2hlblRydWVfdHlwZU1hcFdoZW5GYWxzZWNvbXBsZXRlc3R5cGVNYXBXaGVuVHJ1ZXR5cGVNYXBXaGVuRmFsc2V2aXNpdE5vZGVzX2NvbXB1dGVQcm9wZXJ0eUdldFR5cGVfbmFycm93SW5zdGFuY2VSZWNlaXZlcmxlZnRSdW50aW1lVHlwZUV4cHJlc3Npb25yaWdodFJ1bnRpbWVUeXBlRXhwcmVzc2lvblVuZXhwZWN0ZWQgUnVudGltZVR5cGVVc2VEYXRhIGZvciBpc0NvbXBsZXRlcmVjZWl2ZXJTdWJzdGl0dXRpb25fdmlzaXRBcmd1bWVudHNpc1NwZWNpYWxDYXNlZEJpbmFyeU9wZXJhdG9yX2dldE1lbWJlcl9pc0FwcGxpY2FibGVpc0Z1bmN0aW9uVHlwZUFwcGxpY2FibGVnZXROYW1lZFBhcmFtZXRlcnNpc1R5cGVBcHBsaWNhYmxlX3VwZGF0ZU1ldGhvZEludm9jYXRpb25UYXJnZXRuZWVkZWRQb3NpdGlvbmFsQ2hlY2tzbmVlZGVkTmFtZWRDaGVja3NuYW1lZEFyZ3VtZW50bmFtZWRUeXBlbGV0VmFyaWFibGVzdXBkYXRlQXJndW1lbnRjaGVja2VkUGFyYW1ldGVyVHlwZWhhbmRsZVZhcmlhYmxlR2V0X2NvbXB1dGVNZXRob2RJbnZvY2F0aW9uVHlwZWFmdGVySW52b2NhdGlvbnByb21vdGV0eXBlT2ZVbmV4cGVjdGVkIHByb21vdGlvbiBvZiBoYW5kbGVWYXJpYWJsZVNldGFmdGVyTGVmdFdoZW5UcnVlYWZ0ZXJMZWZ0V2hlbkZhbHNlYWZ0ZXJSaWdodFdoZW5UcnVlYWZ0ZXJSaWdodFdoZW5GYWxzZWFmdGVyT3BlcmFuZFdoZW5UcnVlYWZ0ZXJPcGVyYW5kV2hlbkZhbHNlX2hhbmRsZUNvbmRpdGlvbmFsYWZ0ZXJDb25kaXRpb25XaGVuVHJ1ZWFmdGVyQ29uZGl0aW9uV2hlbkZhbHNlYWZ0ZXJUaGVuYWZ0ZXJPdGhlcndpc2VhZnRlck9wZXJhbmRfY29tcHV0ZUluc3RhbnRpYXRpb25UeXBlSW5jb21wbGV0ZSBSdW50aW1lVHlwZVVzZURhdGE6IF9vbGRWYXJpYWJsZXN2aXNpdFNpZ25hdHVyZWJlZm9yZUxvb3BoYW5kbGVTd2l0Y2hTdGF0ZW1lbnRhZnRlckV4cHJlc3Npb25hZnRlclN0YXRlbWVudGJlZm9yZUNhc2ViZWZvcmVDb25kaXRpb25iZWZvcmVDbG9zdXJlQXJndW1lbnRUeXBlc1R5cGVIb2xkZXJ0cnVlVHlwZXNmYWxzZVR5cGVzX2dldFRleHR0eXBlc1RvVGV4dHRydWU6ZmFsc2U6VHlwZUhvbGRlcihkZWNsYXJlZD1UYXJnZXRJbmZvdHlwZUhvbGRlcnN0eXBlc09mSW50ZXJlc3RuZXdUeXBlSG9sZGVyc2FkZFR5cGVIb2xkZXJ0eXBlSG9sZGVyYWRkQXNDb3B5bmV3VHlwZXNPZkludGVyZXN0YWRkVHlwZUhvbGRlcnNvdGhlclRydWVUeXBlc290aGVyRmFsc2VUeXBlc290aGVyVHlwZXNPZkludGVyZXN0bmV3VHJ1ZVR5cGVzbmV3RmFsc2VUeXBlc3RoaXNUcnVlVHlwZXN0aGlzRmFsc2VUeXBlc1RhcmdldEluZm8oZGVjbGFyZWRUeXBlPXR5cGVIb2xkZXJzPWRlY2xhcmF0aW9uc09mSW50ZXJlc3Q9VHlwZU1hcF90YXJnZXRJbmZvTWFwbmV3SW5mb01hcHRhcmdldEluZm90eXBlT2ZJbnRlcmVzdHR5cGVIb2xkZXJJZk5vbk51bGx0eXBlSG9sZGVySWZOdWxsVHlwZU1hcChLQ2xvc2VkV29ybGRJbXBsZGFydDJqcy53b3JsZC5jbGFzc19zZXRJbmRleGVkQ2xhc3NGb3JFYWNoRnVuY3Rpb25VTklOU1RBTlRJQVRFREluc3RhbnRpYXRpb24uVU5JTlNUQU5USUFURURESVJFQ1RMWV9JTlNUQU5USUFURURJbnN0YW50aWF0aW9uLkRJUkVDVExZX0lOU1RBTlRJQVRFRElORElSRUNUTFlfSU5TVEFOVElBVEVESW5zdGFudGlhdGlvbi5JTkRJUkVDVExZX0lOU1RBTlRJQVRFREFCU1RSQUNUTFlfSU5TVEFOVElBVEVESW5zdGFudGlhdGlvbi5BQlNUUkFDVExZX0lOU1RBTlRJQVRFRGNsYXNzLWhpZXJhcmNoeS1ub2RlRVhQTElDSVRMWV9JTlNUQU5USUFURURfbGVhc3RVcHBlckluc3RhbnRpYXRlZFN1YmNsYXNzX2luc3RhbnRpYXRlZFN1YmNsYXNzQ291bnRfZGlyZWN0U3ViY2xhc3Nlc2FkZERpcmVjdFN1YmNsYXNzaW5jbHVkZURpcmVjdGx5SW5zdGFudGlhdGVkaW5jbHVkZUluZGlyZWN0bHlJbnN0YW50aWF0ZWRpbmNsdWRlVW5pbnN0YW50aWF0ZWRpbmNsdWRlQWJzdHJhY3RseUluc3RhbnRpYXRlZF91cGRhdGVQYXJlbnRJbnN0YW50aWF0ZWRTdWJjbGFzc0NvdW50X3VwZGF0ZUluc3RhbnRpYXRlZFN1YmNsYXNzQ291bnRjaGFuZ2Vub2RlTWFwTm8gQ2xhc3NIaWVyYXJjaHlOb2RlIGZvciBzdXBlcmNsYXNzIG1hc2tWYWx1ZWRpcmVjdFN1YmNsYXNzZXNpbmNsdWRlUm9vdG5leHRTdGVwc3ViRm9yRWFjaF9jb21wdXRlTGVhc3RVcHBlckluc3RhbnRpYXRlZFN1YmNsYXNzaXNSZWxhdGVkVG9fc3ViY2xhc3NhYnN0cmFjdCAgaW5kaXJlY3RseSwKY2xhc3Mtc2V0X2xlYXN0VXBwZXJJbnN0YW50aWF0ZWRTdWJ0eXBlX3N1YnR5cGVzX21peGluQXBwbGljYXRpb25zbWl4aW5BcHBsaWNhdGlvbnNuZXdTdWJ0eXBlc2FkZGVkb3RoZXJTdWJ0eXBlb3RoZXJIaWVyYXJjaHlEZXB0aF9jb21wdXRlTGVhc3RVcHBlckluc3RhbnRpYXRlZFN1YnR5cGVzdWJub2RlWwogIHN1YnR5cGVzOgogIG1peGluLWFwcGxpY2F0aW9uczoKQ2xhc3NIaWVyYXJjaHlOb2RlSXRlcmFibGVObyByb290IGZvciBpdGVyYWJsZS5DbGFzc0hpZXJhcmNoeU5vZGVJdGVyYXRvcl9maW5kTmV4dF9pc1ZhbGlkU3VidHlwZXNJdGVyYWJsZVN1YnR5cGVzSXRlcmF0b3JoaWVyYXJjaHlOb2Rlc0l0ZXJhdGlvblN0ZXBJdGVyYXRpb25TdGVwLkNPTlRJTlVFU1RPUEl0ZXJhdGlvblN0ZXAuU1RPUFNLSVBfU1VCQ0xBU1NFU0l0ZXJhdGlvblN0ZXAuU0tJUF9TVUJDTEFTU0VTQ2xhc3NIaWVyYXJjaHlOb2Rlc01hcENsYXNzSGllcmFyY2h5Tm9kZXNNYXAgZm9yIENsYXNzSGllcmFyY2h5Tm9kZXNNYXAua2V5c0NsYXNzSGllcmFyY2h5Tm9kZXNNYXAucmVtb3ZlQ2xhc3NIaWVyYXJjaHlOb2Rlc01hcC5jbGVhcmRhcnQyanMuY29uc3RhbnRzLmNvbnN0cnVjdG9yc0NvbnN0YW50Q29uc3RydWN0b3JLaW5kR0VORVJBVElWRUNvbnN0YW50Q29uc3RydWN0b3JLaW5kLkdFTkVSQVRJVkVSRURJUkVDVElOR19HRU5FUkFUSVZFQ29uc3RhbnRDb25zdHJ1Y3RvcktpbmQuUkVESVJFQ1RJTkdfR0VORVJBVElWRVJFRElSRUNUSU5HX0ZBQ1RPUllDb25zdGFudENvbnN0cnVjdG9yS2luZC5SRURJUkVDVElOR19GQUNUT1JZQ29uc3RhbnRDb25zdHJ1Y3RvcktpbmQuRVJST05FT1VTSW5zdGFuY2VEYXRhQ29uc3RhbnRDb25zdHJ1Y3RvckNvbnN0YW50Q29uc3RydWN0b3JWaXNpdG9ydmlzaXRHZW5lcmF0aXZldmlzaXRSZWRpcmVjdGluZ0dlbmVyYXRpdmV2aXNpdFJlZGlyZWN0aW5nRmFjdG9yeXZpc2l0RXJyb25lb3VzR2VuZXJhdGl2ZUNvbnN0YW50Q29uc3RydWN0b3JkZWZhdWx0VmFsdWVzc3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb25hcHBsaWVkSW5zdGFuY2VEYXRheyd0eXBlJzogLAogJ2RlZmF1bHQ6LAogJ2ZpZWxkOiwKICdjb25zdHJ1Y3RvcjogbWFwMW1hcDJhcHBseUluc3RhbmNlRGF0YWNvbnN0cnVjdG9ySW52b2NhdGlvbmFwcGxpZWRGaWVsZE1hcGFwcGxpZWRBc3NlcnRpb25zUmVkaXJlY3RpbmdHZW5lcmF0aXZlQ29uc3RhbnRDb25zdHJ1Y3RvcnRoaXNDb25zdHJ1Y3Rvckludm9jYXRpb24sCiAnY29uc3RydWN0b3InOiBSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdGFudENvbnN0cnVjdG9ydGFyZ2V0Q29uc3RydWN0b3JJbnZvY2F0aW9uJ2NvbnN0cnVjdG9yJzogRXJyb25lb3VzQ29uc3RhbnRDb25zdHJ1Y3RvckVycm9uZW91c0NvbnN0YW50Q29uc3RydWN0b3IuY29tcHV0ZUluc3RhbmNlVHlwZWRhcnQyanMuY29uc3RhbnRzLmV2YWx1YXRpb25lbmNsb3NpbmdDb25zdHJ1Y3RlZFR5cGVFdmFsdWF0aW9uRW52aXJvbm1lbnRCYXNlX3NwYW5uYWJsZVN0YWNrX2N1cnJlbnRseUV2YWx1YXRlZEZpZWxkc05vcm1hbGl6ZWRBcmd1bWVudHNObyBkZWZhdWx0IHZhbHVlIGZvciBuYW1lZCBhcmd1bWVudCAnTm8gdmFsdWUgZm9yIG5hbWVkIGFyZ3VtZW50ICdObyBkZWZhdWx0IHZhbHVlIGZvciBwb3NpdGlvbmFsIGFyZ3VtZW50IE5vIHZhbHVlIGZvciBwb3NpdGlvbmFsIGFyZ3VtZW50IE5vcm1hbGl6ZWRBcmd1bWVudHNbZGVmYXVsdFZhbHVlcz17fSxjYWxsU3RydWN0dXJlPV1dZnJvbnRfZW5kLnNyYy5mYXN0YS5uYW1lc2FtcGVyc2FuZE5hbWViYXJOYW1lY2FyZXROYW1lZGl2aXNpb25OYW1lZG91YmxlQW1wZXJzYW5kTmFtZWRvdWJsZUJhck5hbWVkb3VibGVRdWVzdGlvbk5hbWVncmVhdGVyVGhhbk5hbWVncmVhdGVyVGhhbk9yRXF1YWxzTmFtZWlkZW50aWNhbE5hbWVsZWZ0U2hpZnROYW1lbGVuZ3RoTmFtZWxlc3NUaGFuTmFtZWxlc3NUaGFuT3JFcXVhbHNOYW1lbXVsdGlwbHlOYW1lbXVzdGFjaGVOYW1lbmVnYXRpb25OYW1lcGVyY2VudE5hbWVyaWdodFNoaWZ0TmFtZXRyaXBsZVNoaWZ0TmFtZXRpbGRlTmFtZV9wcm90b0NvbnN0cmFpbnRzX3BhcmFtZXRlcnNUb0NvbnN0cmFpbnByb3RvQ29uc3RyYWludGlzVXBwZXJvbGRQcm90b0NvbnN0cmFpbnRzTGVuZ3RoaXNNYXRjaF9pc1N1YnR5cGVNYXRjaF9jb25zdHJhaW5Mb3dlcl9jb25zdHJhaW5VcHBlcl9pc0Z1bmN0aW9uU3VidHlwZU1hdGNoc3VidHlwZVN1YnN0aXR1dGlvbnN1cGVydHlwZVN1YnN0aXR1dGlvbmZyZXNoVHlwZVZhcmlhYmxlc19tYXRjaFR5cGVGb3JtYWxzX2lzSW50ZXJmYWNlU3VidHlwZU1hdGNobWF0Y2hpbmdTdXBlcnR5cGVPZlN1YnR5cGVfaXNUb3BwYXJhbXMxcGFyYW1zMnN1YnN0aXR1dGlvbjFzdWJzdGl0dXRpb24ycEZyZXNodmFyaWFibGVGcmVzaGJvdW5kMWJvdW5kMlR5cGVTY2hlbWFDb25zdHJhaW50R2F0aGVyZXJfUHJvdG9Db25zdHJhaW50ZmFzdGEudHlwZXNpc0R5bmFtaWNSZWxhdGVkaXNWb2lkUmVsYXRlZGlzRnV0dXJlT3JSZWxhdGVkaXNJbnRlcmZhY2VSZWxhdGVkaXNGdW5jdGlvblJlbGF0ZWRpc1R5cGVQYXJhbWV0ZXJSZWxhdGVkaXNJbnRlcnNlY3Rpb25SZWxhdGVkaXNUeXBlZGVmUmVsYXRlZFVuaGFuZGxlZCB0eXBlOiBVbmhhbmRsZWQgdHlwZSBjb21iaW5hdGlvbjogYXJlU3VidHlwZXNPZktlcm5lbE51bWJlcnMgb2YgdHlwZSBhcmd1bWVudHMgZG9uJ3QgbWF0Y2ggaXNTYW1lVHlwZUtlcm5lbFR5cGVSZWxhdGlvbklzSW50ZXJmYWNlU3VidHlwZU9mYXNTdXBlcnR5cGVJc0Z1bmN0aW9uU3VidHlwZU9mc1R5cGVWYXJpYWJsZXN0VHlwZVZhcmlhYmxlc3R5cGVWYXJpYWJsZVN1YnN0aXR1dGlvbnNlY29uZEJvdW5kc0NoZWNrTmVlZGVkc1R5cGVWYXJpYWJsZXRUeXBlVmFyaWFibGVzUG9zaXRpb25hbHRQb3NpdGlvbmFsc05hbWVkdE5hbWVkc0NvdW50dENvdW50SXNUeXBlUGFyYW1ldGVyU3VidHlwZU9mSXNUeXBlZGVmU3VidHlwZU9mSXNGdXR1cmVPclN1YnR5cGVPZnRGdXR1cmVPcklzSW50ZXJzZWN0aW9uU3VidHlwZU9mc0ludGVyc2VjdGlvbnRJbnRlcnNlY3Rpb25mYXN0YS5rZXJuZWxfYm9keV9idWlsZGVyRmFuZ29ybmZhc3RhLmV4cHJlc3Npb25fZ2VuZXJhdG9yX2hlbHBlcmZhc3RhLmZvcmVzdGV4Y2VwdGlvblBhcmFtZXRlcnN0YWNrVHJhY2VQYXJhbWV0ZXJ1cGRhdGVyc3JpZ2h0UGFyZW50aGVzaXNlbHNlS2V5d29yZG5vdE9wZXJhdG9ybGFiZWxlZFN0YXRlbWVudGxlZnRPcGVyYW5kcmlnaHRPcGVyYW5kcmV0aHJvd0tleXdvcmRyZXR1cm5LZXl3b3JkdGhyb3dLZXl3b3JkY2F0Y2hDbGF1c2VzeWllbGRLZXl3b3Jkc3RhcnZhcmlhYmxlVXNlR2VuZXJhdG9ycHJvcGVydHlBY2Nlc3NHZW5lcmF0b3J0aGlzUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3JudWxsQXdhcmVQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcnN1cGVyUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3JpbmRleGVkQWNjZXNzR2VuZXJhdG9ydGhpc0luZGV4ZWRBY2Nlc3NHZW5lcmF0b3JzdXBlckluZGV4ZWRBY2Nlc3NHZW5lcmF0b3JzdGF0aWNBY2Nlc3NHZW5lcmF0b3Jsb2FkTGlicmFyeUdlbmVyYXRvcmRlZmVycmVkQWNjZXNzR2VuZXJhdG9ydHlwZVVzZUdlbmVyYXRvcnJlYWRPbmx5QWNjZXNzR2VuZXJhdG9ydW5yZXNvbHZlZE5hbWVHZW5lcmF0b3J1bmxpbmtlZEdlbmVyYXRvcmRlbGF5ZWRBc3NpZ25tZW50ZGVsYXllZFBvc3RmaXhJbmNyZW1lbnRwcmVmaXhVc2VHZW5lcmF0b3J1bmV4cGVjdGVkUXVhbGlmaWVkVXNlR2VuZXJhdG9ycGFyc2VyRXJyb3JHZW5lcmF0b3JmYXN0YS5jb25zdGFudF9jb250ZXh0Q29uc3RhbnRDb250ZXh0Lm5vbmVDb25zdGFudENvbnRleHQuaW5mZXJyZWRDb25zdGFudENvbnRleHQucmVxdWlyZWRmYXN0YS5xdW90ZVNpbmdsZVF1b3RlLlNpbmdsZURvdWJsZVF1b3RlLkRvdWJsZU11bHRpTGluZVNpbmdsZVF1b3RlLk11bHRpTGluZVNpbmdsZU11bHRpTGluZURvdWJsZVF1b3RlLk11bHRpTGluZURvdWJsZVJhd1NpbmdsZVF1b3RlLlJhd1NpbmdsZVJhd0RvdWJsZVF1b3RlLlJhd0RvdWJsZVJhd011bHRpTGluZVNpbmdsZVF1b3RlLlJhd011bHRpTGluZVNpbmdsZVJhd011bHRpTGluZURvdWJsZVF1b3RlLlJhd011bHRpTGluZURvdWJsZVVuZXNjYXBlRXJyb3JMaXN0ZW5lcmhhbmRsZVVuZXNjYXBlRXJyb3JsZW5ndGhPZk9wdGlvbmFsV2hpdGVzcGFjZVByZWZpeGZpcnN0UXVvdGVMZW5ndGhsYXN0UXVvdGVMZW5ndGhpc0xhc3RRdW90ZVN5bnRoZXRpY3VuZXNjYXBlQ29kZVVuaXRzcmVzdWx0T2Zmc2V0ZmFzdGEuc2NvcGVfbGlzdGVuZXJCcmVha0p1bXBUYXJnZXRLaW5kLkJyZWFrQ29udGludWVKdW1wVGFyZ2V0S2luZC5Db250aW51ZUdvdG9KdW1wVGFyZ2V0S2luZC5Hb3RvY3JlYXRlQnJlYWtUYXJnZXRjcmVhdGVDb250aW51ZVRhcmdldGJlZ2luQmxvY2tGdW5jdGlvbkJvZHlibG9jayBmdW5jdGlvbiBib2R5YmVnaW5Gb3JTdGF0ZW1lbnRmb3Igc3RhdG1lbnRiZWdpbkZvckNvbnRyb2xGbG93Zm9yIGluIGEgY29sbGVjdGlvbmJlZ2luQmxvY2tiZWdpbkRvV2hpbGVTdGF0ZW1lbnRiZWdpbldoaWxlU3RhdGVtZW50YmVnaW5Eb1doaWxlU3RhdGVtZW50Qm9keWRvLXdoaWxlIHN0YXRlbWVudCBib2R5ZW5kRG9XaGlsZVN0YXRlbWVudEJvZHliZWdpbldoaWxlU3RhdGVtZW50Qm9keXdoaWxlIHN0YXRlbWVudCBib2R5ZW5kV2hpbGVTdGF0ZW1lbnRCb2R5YmVnaW5Gb3JTdGF0ZW1lbnRCb2R5Zm9yIHN0YXRlbWVudCBib2R5ZW5kRm9yU3RhdGVtZW50Qm9keWJlZ2luRm9ySW5Cb2R5Zm9yLWluIGJvZHllbmRGb3JJbkJvZHliZWdpbkVsc2VTdGF0ZW1lbnRlbmRFbHNlU3RhdGVtZW50ZmFzdGEuY29uc3RuZXNzZXhwbGljaXRDb25zdENvbnN0bmVzcy5leHBsaWNpdENvbnN0ZXhwbGljaXROZXdDb25zdG5lc3MuZXhwbGljaXROZXdDb25zdG5lc3MuaW1wbGljaXRmYXN0YS5leHByZXNzaW9uX2dlbmVyYXRvcihvZmZzZXQ6IGZyb21CdWlsZGVyYnVpbGRlclNldHRlclN0YXRpY0FjY2Vzc0dlbmVyYXRvci5mcm9tQnVpbGRlcmZhc3RhLmtlcm5lbF9hcGlmYXN0YS5rZXJuZWxfYXN0X2FwaWZhc3RhLnBhcnNlci5saXN0ZW5lcmxvZ0V2ZW50c3VwcHJlc3NQYXJzZUVycm9yc2JlZ2luQXJndW1lbnRzYmVnaW5Bd2FpdEV4cHJlc3Npb25DYXNjYWRlQ2FzZUV4cHJlc3Npb25DbGFzc0V4dGVuZHNDbGFzc0ltcGxlbWVudHNSZWNvdmVyQ2xhc3NIZWFkZXJNaXhpbk9uTWl4aW5IZWFkZXJSZWNvdmVyTWl4aW5IZWFkZXJiZWdpbkNvbWJpbmF0b3JzYmVnaW5Db21waWxhdGlvblVuaXRoYW5kbGVEaXJlY3RpdmVzT25seWVuZENvbXBpbGF0aW9uVW5pdENvbXBpbGF0aW9uVW5pdENvbnN0TGl0ZXJhbGJlZ2luQ29uc3RydWN0b3JSZWZlcmVuY2VEb1doaWxlU3RhdGVtZW50Qm9keVdoaWxlU3RhdGVtZW50Qm9keWJlZ2luRW51bWJlZ2luRXhwb3J0aGFuZGxlRXh0cmFuZW91c0V4cHJlc3Npb25FeHRyYW5lb3VzRXhwcmVzc2lvbkZvclN0YXRlbWVudEJvZHlGb3JJbkJvZHliZWdpbkZ1bmN0aW9uTmFtZWJlZ2luSGlkZWJlZ2luVHlwZUxpc3RiZWdpbklmU3RhdGVtZW50VGhlblN0YXRlbWVudEVsc2VTdGF0ZW1lbnRiZWdpbkltcG9ydEltcG9ydFJlY292ZXJ5YmVnaW5Db25kaXRpb25hbFVyaXNiZWdpbkNvbmRpdGlvbmFsVXJpYmVnaW5Jbml0aWFsaXplZElkZW50aWZpZXJhc3NpZ25tZW50YmVnaW5WYXJpYWJsZUluaXRpYWxpemVyQ29uc3RydWN0b3JJbml0aWFsaXplcmhhbmRsZUludmFsaWRFeHByZXNzaW9uSW52YWxpZEZ1bmN0aW9uQm9keWhhbmRsZUludmFsaWRUeXBlUmVmZXJlbmNlSW52YWxpZFR5cGVSZWZlcmVuY2ViZWdpbkxpYnJhcnlOYW1lTGlicmFyeU5hbWVoYW5kbGVJbnRlcnBvbGF0aW9uRXhwcmVzc2lvbkxpdGVyYWxTdHJpbmdiZWdpbk1lbWJlcmJlZ2luTWV0YWRhdGFTdGFyYmVnaW5PcHRpb25hbEZvcm1hbFBhcmFtZXRlcnNiZWdpblBhcnRiZWdpblBhcnRPZmJlZ2luUmVkaXJlY3RpbmdGYWN0b3J5Qm9keWJlZ2luUmV0dXJuU3RhdGVtZW50RW1wdHlGdW5jdGlvbkJvZHliZWdpblNob3diZWdpblN3aXRjaFN0YXRlbWVudGJlZ2luTGl0ZXJhbFN5bWJvbGJlZ2luUmV0aHJvd1N0YXRlbWVudGVuZFRvcExldmVsRGVjbGFyYXRpb25Ub3BMZXZlbERlY2xhcmF0aW9uYmVnaW5Ub3BMZXZlbE1lbWJlcmJlZ2luVHJ5U3RhdGVtZW50VHJ5U3RhdGVtZW50Tm9uTnVsbEFzc2VydEV4cHJlc3Npb25ub24tbnVsbGFibGVOb05hbWViZWdpblR5cGVBcmd1bWVudHNiZWdpblR5cGVWYXJpYWJsZXNDb25zdEV4cHJlc3Npb25FbHNlQ29udHJvbEZsb3diZWdpbllpZWxkU3RhdGVtZW50aGFuZGxlRXJyb3JUb2tlbmRpc2NhcmRUeXBlUmVwbGFjZWRXaXRoQ29tbWVudFR5cGVBc3NpZ25oYW5kbGVDb21tZW50UmVmZXJlbmNlVGV4dHJlZmVyZW5jZVNvdXJjZXJlZmVyZW5jZU9mZnNldENvbW1lbnRSZWZlcmVuY2VUZXh0aGFuZGxlQ29tbWVudFJlZmVyZW5jZW5ld0tleXdvcmRoYW5kbGVOb0NvbW1lbnRSZWZlcmVuY2VmYXN0YS5wYXJzZXIucGFyc2VyRm9yd2FyZGluZ0xpc3RlbmVybG9va3NMaWtlRXhwcmVzc2lvblN0YXJ0TGl0ZXJhbEVudHJ5SW5mb2NvbXB1dGVMaXRlcmFsRW50cnlsb29rc0xpa2VMaXRlcmFsRW50cnlzaW1wbGVFbnRyeUxvb3BTdGF0ZU1vZGlmaWVyUmVjb3ZlcnlDb250ZXh0Q2xhc3NIZWFkZXJSZWNvdmVyeUxpc3RlbmVySW1wb3J0UmVjb3ZlcnlMaXN0ZW5lck1peGluSGVhZGVyUmVjb3ZlcnlMaXN0ZW5lclRva2VuU3RyZWFtUmV3cml0ZXJUeXBlSW5mb1R5cGVQYXJhbU9yQXJnSW5mb2NvbXB1dGVNZXRob2RUeXBlQXJndW1lbnRzY29tcHV0ZVR5cGVjb21wdXRlVHlwZVBhcmFtT3JBcmdpc1ZhbGlkVHlwZVJlZmVyZW5jZW5vVHlwZW5vVHlwZVBhcmFtT3JBcmdmaW5kTm9uWmVyb0xlbmd0aFRva2VuZmluZFByZXZpb3VzTm9uWmVyb0xlbmd0aFRva2VuaXNMZXR0ZXJpc0xldHRlck9yRGlnaXRpc09uZU9maXNPbmVPZk9yRW9maXNXaGl0ZXNwYWNlX01lc3NhZ2VXaXRoQXJndW1lbnRjYWNoZWRSZXdyaXRlcnN0YXRlbWVudERlcHRoZXhwcmVzc2lvbkRlcHRoaW5HZW5lcmF0b3JpbkFzeW5jaW5QbGFpblN5bmNpc0JyZWFrQWxsb3dlZGlzQ29udGludWVBbGxvd2VkaXNDb250aW51ZVdpdGhMYWJlbEFsbG93ZWRkaXJlY3RpdmVTdGF0ZWNoZWNrU2NyaXB0VGFncGFyc2VTY3JpcHRwYXJzZVRvcExldmVsRGVjbGFyYXRpb25JbXBscmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbnBhcnNlRGlyZWN0aXZlc25leHRWYWx1ZWNoZWNrSW1wb3J0cGFyc2VJbXBvcnRjaGVja0V4cG9ydHBhcnNlRXhwb3J0Y2hlY2tMaWJyYXJ5cGFyc2VMaWJyYXJ5TmFtZXBhcnNlUGFydE9yUGFydE9mcGFyc2VUb3BMZXZlbERlY2xhcmF0aW9ucGFyc2VUb3BMZXZlbEtleXdvcmREZWNsYXJhdGlvbmNoZWNrRGVjbGFyYXRpb25wYXJzZVRvcExldmVsTWVtYmVySW1wbHJlcG9ydFJlY292ZXJhYmxlRXJyb3JpbnNlcnRUb2tlbiNzeW50aGV0aWNfZnVuY3Rpb25fcGFyc2VJbnZhbGlkVG9wTGV2ZWxEZWNsYXJhdGlvbnBhcnNlQ2xhc3NEZWNsYXJhdGlvbk1vZGlmaWVyc3BhcnNlVG9wTGV2ZWxLZXl3b3JkTW9kaWZpZXJzcmVwb3J0VG9wTGV2ZWxNb2RpZmllckVycm9yYWZ0ZXJNb2RpZmllcnNwYXJzZUNsYXNzT3JOYW1lZE1peGluQXBwbGljYXRpb25wYXJzZUVudW1wYXJzZU1peGluSW50ZXJuYWwgZXJyb3I6IFVuaGFuZGxlZCB0b3AgbGV2ZWwga2V5d29yZCAncGFyc2VRdWFsaWZpZWRlbnN1cmVTZW1pY29sb25wYXJzZUltcG9ydFByZWZpeE9wdGRlZmVycmVkVG9rZW5lbnN1cmVJZGVudGlmaWVyZW5zdXJlTGl0ZXJhbFN0cmluZ3BhcnNlQ29uZGl0aW9uYWxVcmlTdGFycGFyc2VDb21iaW5hdG9yU3RhcnBhcnNlSW1wb3J0UmVjb3ZlcnlwcmltYXJ5TGlzdGVuZXJyZWNvdmVyeUxpc3RlbmVyZmlyc3REZWZlcnJlZEtleXdvcmRoYXNQcmVmaXhoYXNDb21iaW5hdG9yc2tpcFVuZXhwZWN0ZWRUb2tlbk9wdHBhcnNlQ29uZGl0aW9uYWxVcmlpbnNlcnRQYXJlbnNwYXJzZURvdHRlZE5hbWVlcXVhbGl0eVNpZ25tb3ZlU3ludGhldGljcGFyc2VIaWRlcGFyc2VTaG93cGFyc2VJZGVudGlmaWVyTGlzdHBhcnNlVHlwZUxpc3RlbnN1cmVUeXBlT3JWb2lkY2hlY2tQYXJ0T2ZwYXJzZVBhcnRPZmNoZWNrUGFydHBhcnNlUGFydGF0VG9rZW5wYXJzZVF1YWxpZmllZFJlc3RPcHRwYXJzZUFyZ3VtZW50c3NraXBUeXBlcGFyc2VWYXJpYWJsZXNwYXJzZVR5cGVwYXJzZUZvcm1hbFBhcmFtZXRlcnNSZXF1aXJlZE9wdHBhcnNlTWl4aW5BcHBsaWNhdGlvblJlc3RpbnNlcnRTeW50aGV0aWNJZGVudGlmaWVycGFyc2VXaXRoQ2xhdXNlT3B0cGFyc2VHZXR0ZXJPckZvcm1hbFBhcmFtZXRlcnNwYXJzZUZvcm1hbFBhcmFtZXRlcnNpc1VuYXJ5TWludXNtaXNzaW5nUGFyYW1ldGVyTWVzc2FnZXNraXBGb3JtYWxQYXJhbWV0ZXJzcGFyc2VPcHRpb25hbFBvc2l0aW9uYWxQYXJhbWV0ZXJzZW5zdXJlQ2xvc2VQYXJlbnBhcnNlT3B0aW9uYWxOYW1lZFBhcmFtZXRlcnNyZXdyaXRlU3F1YXJlQnJhY2tldHNwYXJzZUZvcm1hbFBhcmFtZXRlcnJld3JpdGVBbmRSZWNvdmVycGFyYW1ldGVyS2luZHBhcnNlRm9ybWFsUGFyYW1ldGVyTW9kaWZpZXJzYmVmb3JlVHlwZWlzTmFtZWRQYXJhbWV0ZXJuYW1lQ29udGV4dGJlZm9yZUlubGluZUZ1bmN0aW9uVHlwZWNsb3NlcmVuZElubGluZUZ1bmN0aW9uVHlwZWNvbnRpbnVhdGlvbkNvbnRleHRwYXJzZVF1YWxpZmllZFJlc3RlbnN1cmVCbG9ja3BhcnNlTmFtZWRNaXhpbkFwcGxpY2F0aW9uZW5zdXJlVHlwZU5vdFZvaWRwYXJzZUNsYXNzSGVhZGVyT3B0cGFyc2VDbGFzc0hlYWRlclJlY292ZXJ5cGFyc2VDbGFzc09yTWl4aW5Cb2R5cGFyc2VDbGFzc0V4dGVuZHNPcHRwYXJzZUNsYXNzT3JNaXhpbkltcGxlbWVudHNPcHRwYXJzZU5hdGl2ZUNsYXVzZWhhc0V4dGVuZHNoYXNJbXBsZW1lbnRzaGFzV2l0aGluY29ycmVjdEV4dGVuZHNLZXl3b3JkaGVhZGVyU3RhcnRwYXJzZU1peGluSGVhZGVyT3B0cGFyc2VNaXhpbkhlYWRlclJlY292ZXJ5cGFyc2VNaXhpbk9uT3B0aGFzT25wYXJzZU1peGluT25wYXJzZVN0cmluZ1BhcnRlcnJvclJlcG9ydGVkcmVwb3J0RXJyb3JUb2tlbm1lc3NhZ2VPblRva2VucmVjb3ZlcnlUZW1wbGF0ZW5vdEVvZk9yVmFsdWVwYXJzZVR5cGVWYXJpYWJsZXNPcHRiZWZvcmVTdGFydHBhcnNlVG9wTGV2ZWxNb2RpZmllcnMjc3ludGhldGljX2lkZW50aWZpZXJfcGFyc2VUb3BMZXZlbE1ldGhvZGZpZWxkQ291bnRwYXJzZUZpZWxkSW5pdGlhbGl6ZXJPcHRwYXJzZU1ldGhvZFR5cGVWYXJzYXZlZEFzeW5jTW9kaWZpZXJ0eXBlVmFycGFyc2VWYXJpYWJsZUluaXRpYWxpemVyT3B0cGFyc2VJbml0aWFsaXplcnNwYXJzZUluaXRpYWxpemVyYmVmb3JlRXhwcmVzc2lvbnBhcnNlQXNzZXJ0cGFyc2VTdXBlckluaXRpYWxpemVyRXhwcmVzc2lvbnBhcnNlSW5pdGlhbGl6ZXJFeHByZXNzaW9uUmVzdGluc2VydEJsb2NrYmVnaW5Hcm91cG9wZW5QYXJlbmVuc3VyZUNvbG9ubmV3VG9rZW4iInBhcnNlTGl0ZXJhbFN0cmluZ3JlcGxhY2VUb2tlbkZvbGxvd2luZ2V4cGVjdGVkTmV4dGV4cGVjdGVkVmFsdWVza2lwQ2xhc3NPck1peGluQm9keXBhcnNlQ2xhc3NPck1peGluTWVtYmVySW1wbHVuYXJ5cGFyc2VDbGFzc01lbWJlck1vZGlmaWVyc3BhcnNlRmFjdG9yeU1ldGhvZHBhcnNlTWV0aG9kcGFyc2VJbnZhbGlkT3BlcmF0b3JEZWNsYXJhdGlvbnJlY292ZXJGcm9tSW52YWxpZENsYXNzTWVtYmVycGFyc2VPcGVyYXRvck5hbWViZWZvcmVQYXJhbXBhcnNlUmVkaXJlY3RpbmdGYWN0b3J5Qm9keXN0YXRpY09yQ292YXJpYW50cGFyc2VNb2RpZmllcnNBZnRlckZhY3RvcnliZWZvcmVUb2tlbnBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucGFyc2VBc3luY09wdEJvZHlwYXJzZUZ1bmN0aW9uTGl0ZXJhbGJlZm9yZU5hbWVwYXJzZU5hbWVkRnVuY3Rpb25SZXN0b2ZGdW5jdGlvbkV4cHJlc3Npb25wYXJzZUNvbnN0cnVjdG9yUmVmZXJlbmNlc2tpcEFzeW5jTW9kaWZpZXJwYXJzZUV4cHJlc3Npb25GdW5jdGlvbkJvZHlzYXZlZExvb3BTdGF0ZXBhcnNlU3RhdGVtZW50cmVjb3ZlckZyb21TdGFja092ZXJmbG93cGFyc2VTdGF0ZW1lbnRYcGFyc2VMYWJlbGVkU3RhdGVtZW50cGFyc2VFeHByZXNzaW9uU3RhdGVtZW50T3JEZWNsYXJhdGlvbkFmdGVyTW9kaWZpZXJzcGFyc2VCbG9ja3BhcnNlUmV0dXJuU3RhdGVtZW50dmFyT3JGaW5hbHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudE9yRGVjbGFyYXRpb25wYXJzZUlmU3RhdGVtZW50cGFyc2VGb3JTdGF0ZW1lbnRwYXJzZVJldGhyb3dTdGF0ZW1lbnRwYXJzZVdoaWxlU3RhdGVtZW50cGFyc2VEb1doaWxlU3RhdGVtZW50cGFyc2VUcnlTdGF0ZW1lbnRwYXJzZVN3aXRjaFN0YXRlbWVudHBhcnNlQnJlYWtTdGF0ZW1lbnRwYXJzZUNvbnRpbnVlU3RhdGVtZW50cGFyc2VBc3NlcnRTdGF0ZW1lbnRwYXJzZUVtcHR5U3RhdGVtZW50cGFyc2VZaWVsZFN0YXRlbWVudEludGVybmFsIGVycm9yOiBVbmtub3duIGFzeW5jU3RhdGU6ICdwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRPckNvbnN0RGVjbGFyYXRpb25sb29rc0xpa2VBd2FpdEV4cHJlc3Npb25wYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRwYXJzZUxhYmVscGFyc2VUaHJvd0V4cHJlc3Npb25wYXJzZVByZWNlZGVuY2VFeHByZXNzaW9ucGFyc2VFeHByZXNzaW9uV2l0aG91dENhc2NhZGVwYXJzZUNvbmRpdGlvbmFsRXhwcmVzc2lvblJlc3RhbGxvd0Nhc2NhZGVzcGFyc2VVbmFyeUV4cHJlc3Npb250b2tlbkxldmVsbGFzdEJpbmFyeUV4cHJlc3Npb25MZXZlbHBhcnNlQ2FzY2FkZUV4cHJlc3Npb25wYXJzZVByaW1hcnlwYXJzZUFyZ3VtZW50T3JJbmRleFN0YXJwYXJzZUlzT3BlcmF0b3JSZXN0cGFyc2VBc09wZXJhdG9yUmVzdGNhc2NhZGVPcGVyYXRvcnBhcnNlU2VuZG1hcmtwYXJzZUF3YWl0RXhwcmVzc2lvbnBhcnNlSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb25wYXJzZVNlbmRPckZ1bmN0aW9uTGl0ZXJhbHBhcnNlTGl0ZXJhbEludHBhcnNlTGl0ZXJhbERvdWJsZXBhcnNlTGl0ZXJhbFN5bWJvbHBhcnNlTGl0ZXJhbEJvb2xwYXJzZUxpdGVyYWxOdWxscGFyc2VUaGlzRXhwcmVzc2lvbnBhcnNlU3VwZXJFeHByZXNzaW9ucGFyc2VOZXdFeHByZXNzaW9ucGFyc2VDb25zdEV4cHJlc3Npb25wYXJzZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uT3JGdW5jdGlvbkxpdGVyYWxwYXJzZUxpdGVyYWxMaXN0U3VmZml4cGFyc2VMaXRlcmFsU2V0T3JNYXBTdWZmaXhwYXJzZUxpdGVyYWxMaXN0U2V0TWFwT3JGdW5jdGlvbm5leHRUb2tlbnBhcnNlUGFyZW50aGVzaXplZEV4cHJlc3Npb25lbnN1cmVQYXJlbnRoZXNpemVkQ29uZGl0aW9ucGFyc2VFeHByZXNzaW9uSW5QYXJlbnRoZXNpc1Jlc3RwYXJzZUV4cHJlc3Npb25JblBhcmVudGhlc2lzdGhpc1Rva2Vuc3VwZXJUb2tlbmlmQ291bnRoYXNFbnRyeWlmQ29uZGl0aW9uRGVsdGFjb21wdXRlTmV4dGlzTWFwRW50cnlwYXJzZUxpdGVyYWxGdW5jdGlvblN1ZmZpeHR5cGVQYXJhbU9yQXJncGFyc2VNYXBMaXRlcmFsRW50cnlsb29rc0xpa2VGdW5jdGlvbkJvZHllbnN1cmVBcmd1bWVudHNwYXJzZUFyZ3VtZW50c1Jlc3RwYXJzZUNvbnN0cnVjdG9ySW52b2NhdGlvbkFyZ3VtZW50c3BhcnNlU2luZ2xlTGl0ZXJhbFN0cmluZ2hhc1NlZW5OYW1lZEFyZ3VtZW50Y29tcHV0ZVR5cGVBZnRlcklzT3JBc3NraXBDaGFpbmVkQXNJc09wZXJhdG9yc2FzTm9uTnVsbGFibGVsb29rc0xpa2VMb2NhbEZ1bmN0aW9ub25seVBhcnNlVmFyaWFibGVEZWNsYXJhdGlvblN0YXJ0bW9kaWZpZXJDb250ZXh0cGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uTW9kaWZpZXJzYmVmb3JlRm9ybWFsc2NvdWxkQmVFeHByZXNzaW9uYWZ0ZXJJZGVudGlmaWVyb3JpZ2luYWxMaXN0ZW5lcnBhcnNlVmFyaWFibGVzRGVjbGFyYXRpb25SZXN0ZW5kV2l0aFNlbWljb2xvbnBhcnNlT3B0aW9uYWxseUluaXRpYWxpemVkSWRlbnRpZmllcnBhcnNlRm9yTG9vcFBhcnRzU3RhcnRwYXJzZUZvckxvb3BQYXJ0c01pZHBhcnNlRm9ySW5SZXN0cGFyc2VGb3JSZXN0bG9vcFBhcnRjbG9zZVBhcmVucGFyc2VGb3JMb29wUGFydHNSZXN0cGFyc2VGb3JJbkxvb3BQYXJ0c1Jlc3R3aGlsZVRva2VuZG9Ub2tlbmZvcndhcmRFcnJvcnNvcGVuUGFyZW5zZXhjZXB0aW9uTmFtZXRyYWNlTmFtZXBhcnNlU3dpdGNoQmxvY2tiZWdpblN3aXRjaGJlZ2luQ2FzZXBlZWtQYXN0TGFiZWxzcGFyc2VTdGF0ZW1lbnRzSW5Td2l0Y2hDYXNlcHJldmlvdXNUb2tlbnJlcG9ydEFuZFNraXBDbGFzc0luQ2xhc3NyZXBvcnRBbmRTa2lwRW51bUluQ2xhc3NyZXBvcnRBbmRTa2lwVHlwZWRlZkluQ2xhc3NmaW5kRGFydERvY2lzTXVsdGlsaW5lcGFyc2VDb21tZW50UmVmZXJlbmNlc3BhcnNlUmVmZXJlbmNlc0luU2luZ2xlTGluZUNvbW1lbnRzcGFyc2VSZWZlcmVuY2VzSW5NdWx0aUxpbmVDb21tZW50bXVsdGlMaW5lRG9jaW5Db2RlQmxvY2tjb2RlQmxvY2tgYGAqICAgICBwYXJzZUNvbW1lbnRSZWZlcmVuY2VzSW5UZXh0Ly8vICAgIGNvbW1lbnRUb2tlbjpdcmVmZXJlbmNlU3RhcnRmaW5kUmVmZXJlbmNlRW5kaXNMaW5rVGV4dGVuZENvZGVCbG9ja3BhcnNlT25lQ29tbWVudFJlZmVyZW5jZXBhcnNlT25lQ29tbWVudFJlZmVyZW5jZVJlc3RpZGVudGlmaWVyT3JPcGVyYXRvcnJpZ2h0SW5kZXhmYXN0YS5wYXJzZXIucGFyc2VyX2Vycm9yYmVnaW5PZmZzZXRmcm9tVG9rZW5zZmFzdGEucGFyc2VyLkFzc2VydEFzc2VydC5FeHByZXNzaW9uQXNzZXJ0LkluaXRpYWxpemVyQXNzZXJ0LlN0YXRlbWVudGZhc3RhLnBhcnNlci5mb3JtYWxfcGFyYW1ldGVyX2tpbmRtYW5kYXRvcnlGb3JtYWxQYXJhbWV0ZXJLaW5kLm1hbmRhdG9yeW9wdGlvbmFsTmFtZWRGb3JtYWxQYXJhbWV0ZXJLaW5kLm9wdGlvbmFsTmFtZWRvcHRpb25hbFBvc2l0aW9uYWxGb3JtYWxQYXJhbWV0ZXJLaW5kLm9wdGlvbmFsUG9zaXRpb25hbGltcG9ydFByZWZpeERlY2xhcmF0aW9uZG90dGVkTmFtZUNvbnRpbnVhdGlvbm1ldGFkYXRhUmVmZXJlbmNlbWV0YWRhdGFDb250aW51YXRpb25tZXRhZGF0YUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50c3R5cGVkZWZEZWNsYXJhdGlvbmZpZWxkSW5pdGlhbGl6ZXJmb3JtYWxQYXJhbWV0ZXJEZWNsYXJhdGlvbmNhdGNoUGFyYW1ldGVybGlicmFyeU5hbWVDb250aW51YXRpb25wYXJ0TmFtZXBhcnROYW1lQ29udGludWF0aW9uZW51bURlY2xhcmF0aW9uZW51bVZhbHVlRGVjbGFyYXRpb25jbGFzc09yTWl4aW5EZWNsYXJhdGlvbnR5cGVWYXJpYWJsZURlY2xhcmF0aW9ucHJlZml4ZWRUeXBlUmVmZXJlbmNldHlwZVJlZmVyZW5jZXR5cGVSZWZlcmVuY2VDb250aW51YXRpb250b3BMZXZlbFZhcmlhYmxlRGVjbGFyYXRpb25maWVsZERlY2xhcmF0aW9udG9wTGV2ZWxGdW5jdGlvbkRlY2xhcmF0aW9ubWV0aG9kRGVjbGFyYXRpb25tZXRob2REZWNsYXJhdGlvbkNvbnRpbnVhdGlvbmxvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbmxvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbkNvbnRpbnVhdGlvbmNvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uY29uc3RydWN0b3JSZWZlcmVuY2VDb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHNsYWJlbERlY2xhcmF0aW9ubGl0ZXJhbFN5bWJvbGxpdGVyYWxTeW1ib2xDb250aW51YXRpb25leHByZXNzaW9uQ29udGludWF0aW9ubmFtZWRBcmd1bWVudFJlZmVyZW5jZWxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbmxhYmVsUmVmZXJlbmNlaW5MaWJyYXJ5T3JQYXJ0T2ZEZWNsYXJhdGlvbmluU3ltYm9saXNDb250aW51YXRpb25pc0J1aWx0SW5JZGVudGlmaWVyQWxsb3dlZGxvb2tzTGlrZVN0YXRlbWVudFN0YXJ0ZmFzdGEucGFyc2VyLm1lbWJlcl9raW5kTWVtYmVyS2luZC5DYXRjaE1lbWJlcktpbmQuRmFjdG9yeU1lbWJlcktpbmQuRnVuY3Rpb25UeXBlQWxpYXNGdW5jdGlvblR5cGVkUGFyYW1ldGVyTWVtYmVyS2luZC5GdW5jdGlvblR5cGVkUGFyYW1ldGVyR2VuZXJhbGl6ZWRGdW5jdGlvblR5cGVNZW1iZXJLaW5kLkdlbmVyYWxpemVkRnVuY3Rpb25UeXBlTWVtYmVyS2luZC5Mb2NhbE5vblN0YXRpY01ldGhvZE1lbWJlcktpbmQuTm9uU3RhdGljTWV0aG9kU3RhdGljTWV0aG9kTWVtYmVyS2luZC5TdGF0aWNNZXRob2RNZW1iZXJLaW5kLlRvcExldmVsTWV0aG9kTm9uU3RhdGljRmllbGRNZW1iZXJLaW5kLk5vblN0YXRpY0ZpZWxkU3RhdGljRmllbGRNZW1iZXJLaW5kLlN0YXRpY0ZpZWxkVG9wTGV2ZWxGaWVsZE1lbWJlcktpbmQuVG9wTGV2ZWxGaWVsZGZhc3RhLnBhcnNlci50b3BfbGV2ZWxfcGFyc2VyZmFzdGEucGFyc2VyLnV0aWxiZWZvcmVDbG9zZUJyYWNlVG9rZW5Gb3Jpc0RpZ2l0dG9rZW5WYWx1ZXNraXBNZXRhZGF0YXNwbGl0R3RFcXNwbGl0R3RHdHNwbGl0R3RHdEVxc3BsaXRHdEZyb21HdEd0RXFzcGxpdEd0RnJvbUd0R3RHdHNwbGl0R3RGcm9tR3RHdEd0RXFzeW50aGV0aWNHdGZhc3RhLmlnbm9yZWRfcGFyc2VyX2Vycm9yc2Zhc3RhLnN0YWNrX2xpc3RlbmVyTnVsbFZhbHVlLkFyZ3VtZW50c0FzTnVsbFZhbHVlLkFzQXdhaXRUb2tlbk51bGxWYWx1ZS5Bd2FpdFRva2VuTnVsbFZhbHVlLkJsb2NrQnJlYWtUYXJnZXROdWxsVmFsdWUuQnJlYWtUYXJnZXRDYXNjYWRlUmVjZWl2ZXJOdWxsVmFsdWUuQ2FzY2FkZVJlY2VpdmVyTnVsbFZhbHVlLkNvbWJpbmF0b3JzQ29tbWVudHNOdWxsVmFsdWUuQ29tbWVudHNOdWxsVmFsdWUuQ29uZGl0aW9uYWxVcmlzQ29uZGl0aW9uYWxseVNlbGVjdGVkSW1wb3J0TnVsbFZhbHVlLkNvbmRpdGlvbmFsbHlTZWxlY3RlZEltcG9ydENvbnN0cnVjdG9ySW5pdGlhbGl6ZXJTZXBhcmF0b3JOdWxsVmFsdWUuQ29uc3RydWN0b3JJbml0aWFsaXplclNlcGFyYXRvckNvbnN0cnVjdG9ySW5pdGlhbGl6ZXJzTnVsbFZhbHVlLkNvbnN0cnVjdG9ySW5pdGlhbGl6ZXJzQ29uc3RydWN0b3JSZWZlcmVuY2VDb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHNOdWxsVmFsdWUuQ29uc3RydWN0b3JSZWZlcmVuY2VDb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHNDb250aW51ZVRhcmdldE51bGxWYWx1ZS5Db250aW51ZVRhcmdldE51bGxWYWx1ZS5EZWZlcnJlZERvY3VtZW50YXRpb25Db21tZW50TnVsbFZhbHVlLkRvY3VtZW50YXRpb25Db21tZW50TnVsbFZhbHVlLkV4cHJlc3Npb25FeHRlbmRzQ2xhdXNlTnVsbFZhbHVlLkV4dGVuZHNDbGF1c2VOdWxsVmFsdWUuRmllbGRJbml0aWFsaXplck51bGxWYWx1ZS5Gb3JtYWxQYXJhbWV0ZXJzRnVuY3Rpb25Cb2R5TnVsbFZhbHVlLkZ1bmN0aW9uQm9keUZ1bmN0aW9uQm9keUFzeW5jVG9rZW5OdWxsVmFsdWUuRnVuY3Rpb25Cb2R5QXN5bmNUb2tlbkZ1bmN0aW9uQm9keVN0YXJUb2tlbk51bGxWYWx1ZS5GdW5jdGlvbkJvZHlTdGFyVG9rZW5OdWxsVmFsdWUuSWRlbnRpZmllck51bGxWYWx1ZS5JZGVudGlmaWVyTGlzdE51bGxWYWx1ZS5Jbml0aWFsaXplcnNMYWJlbHNOdWxsVmFsdWUuTGFiZWxzTnVsbFZhbHVlLk1ldGFkYXRhTW9kaWZpZXJzTnVsbFZhbHVlLk1vZGlmaWVyc1BhcmFtZXRlckRlZmF1bHRWYWx1ZU51bGxWYWx1ZS5QYXJhbWV0ZXJEZWZhdWx0VmFsdWVQcmVmaXhOdWxsVmFsdWUuUHJlZml4TnVsbFZhbHVlLlN0cmluZ0xpdGVyYWxTd2l0Y2hTY29wZU51bGxWYWx1ZS5Td2l0Y2hTY29wZU51bGxWYWx1ZS5UeXBlTnVsbFZhbHVlLlR5cGVBcmd1bWVudHNUeXBlQnVpbGRlckxpc3ROdWxsVmFsdWUuVHlwZUJ1aWxkZXJMaXN0TnVsbFZhbHVlLlR5cGVMaXN0TnVsbFZhbHVlLlR5cGVWYXJpYWJsZU51bGxWYWx1ZS5UeXBlVmFyaWFibGVzVmFyRmluYWxPckNvbnN0VG9rZW5OdWxsVmFsdWUuVmFyRmluYWxPckNvbnN0VG9rZW5XaXRoQ2xhdXNlTnVsbFZhbHVlLldpdGhDbGF1c2VmaW5pc2hTaW5nbGVFeHByZXNzaW9udG9rZW5Pck51bGxwcmludEV2ZW50Ci0tLS0tLS0tLS0tLS0tLS0tLSAgPj4gc3RyaW5nIGludGVycG9sYXRpb25TdGFja19ncm93cG9wTGlzdHN0YXJ0SW5kZXhhcnJheUluZGV4UGFyc2VyUmVjb3ZlcnkoQGZhc3RhLnNjYW5uZXIua2V5d29yZHNfS0VZV09SRF9TVEFURUtFWVdPUkRfU1RBVEVjb21wdXRlS2V5d29yZFN0YXRlVGFibGVpc0xvd2VyY2FzZWNodW5rY2h1bmtTdGFydGlzTGVhZkFycmF5S2V5d29yZFN0YXRlZm9vOyBMb3dlckNhc2VBcnJheUtleXdvcmRTdGF0ZVVwcGVyQ2FzZUFycmF5S2V5d29yZFN0YXRlTGVhZktleXdvcmRTdGF0ZV9Db25zdGFudFJlZmVyZW5jZUdlbmVyYXRvcl9Db25zdGFudExpc3RHZW5lcmF0b3JDb25zdGFudEVtaXR0ZXJDT01NRU5UX1JFXiAqKC8vLiopP1xufCAgKi8vW14nJyJcbl0qJG11bHRpTGluZV90YXNrY29uc3RhbnRSZWZlcmVuY2VHZW5lcmF0b3JtYWtlQ29uc3RhbnRMaXN0X2V4cG9uZW50aWFsUkUoWy0rXT8pKFswLTldKykoLihbMC05XSopKT9lKFstK10/WzAtOV0rKWdlbmVyYXRlVGhlIGZ1bmN0aW9uIGNvbnN0YW50IGRvZXMgbm90IG5lZWQgc3BlY2lmaWMgSlMgY29kZS5fc2hvcnRlbkV4cG9uZW50aWFsUmVwcmVzZW50YXRpb25udW1iZXJTdHJpbmdsZWFkaW5nRGlnaXRzZnJhY3Rpb25EaWdpdHNleHBvbmVudGFsdGVybmF0aXZlY3V0b2ZmdG9TdHJpbmdBc0V4cG9uZW50aWFsMC8wMS8wLTEvMHNob3J0ZW5lZCEwITFhc2NpaW1heWJlQWRkVHlwZUFyZ3VtZW50c0NvbXBpbGVyIGVuY291dGVyZWQgdW5leHBlY3RlZCBzZXQgY2xhc3MgX3JlaWZpZWRUeXBlQXJndW1lbnRzY29uc3RydWN0b3JBY2Nlc3Nqc01hcGtleUV4cHJlc3Npb252YWx1ZUV4cHJlc3Npb25qc0dlbmVyYWxNYXBlbWl0dGVkQXJndW1lbnRDb3VudENvbXBpbGVyIGhhcyB1bmV4cGVjdGVkIGZpZWxkIENvbXBpbGVyIGFuZCAgZGlzYWdyZWUgb24gbnVtYmVyIG9mIGZpZWxkcy5nZXRIZWxwZXJQcm9wZXJ0eV92YXJpYWJsZVVuZXhwZWN0ZWQgdHlwZSB2YXJpYWJsZSAnIGluIGNvbnN0YW50ICdydGlpbnRlcmNlcHRvclByb3RvdHlwZUFjY2Vzc1VuZXhwZWN0ZWQgRHVtbXlDb25zdGFudEtpbmQgc3RyaXBDb21tZW50c3Jhd0phdmFTY3JpcHRDb2RlZ2VuUGhhc2VTc2FDb2RlR2VuZXJhdG9yVGFza1NTQSBjb2RlIGdlbmVyYXRvcmJ1aWxkSmF2YVNjcmlwdEZ1bmN0aW9uZ2VuZXJhdGVMYXp5SW5pdGlhbGl6ZXJnZW5lcmF0ZU1ldGhvZFRZUEVfU1RBVEVNRU5UVFlQRV9FWFBSRVNTSU9OVFlQRV9ERUNMQVJBVElPTmlzR2VuZXJhdGluZ0V4cHJlc3Npb25fY29kZWdlblRhc2tfc3VwZXJNZW1iZXJEYXRhX3RyYWNlcl93b3JrZ2VuZXJhdGVBdFVzZVNpdGVjb250cm9sRmxvd09wZXJhdG9yc2JyZWFrQWN0aW9uY29udGludWVBY3Rpb25pbXBsaWNpdENvbnRpbnVlQWN0aW9uY3VycmVudENvbnRhaW5lcmV4cHJlc3Npb25TdGFja29sZENvbnRhaW5lclN0YWNrdmFyaWFibGVOYW1lc3Nob3VsZEdyb3VwVmFyRGVjbGFyYXRpb25zY29sbGVjdGVkVmFyaWFibGVEZWNsYXJhdGlvbnNkZWNsYXJlZExvY2Fsc2N1cnJlbnRHcmFwaGN1cnJlbnRCbG9ja0luZm9ybWF0aW9uYmxvY2tRdWV1ZV9yZWdpc3RyeWlzR2VuZXJhdGVBdFVzZVNpdGVoYXNOb25CaXRPcFVzZXJwaGlTZXRiaXRXaWR0aE1BWGJpdE9wbGVmdFdpZHRoc2hpZnRDb3VudHJlcXVpcmVzVWludENvbnZlcnNpb25wdXNoU3RhdGVtZW50aW5zZXJ0U3RhdGVtZW50QXRTdGFydHB1c2hFeHByZXNzaW9uQXNTdGF0ZW1lbnRwcmVHZW5lcmF0ZU1ldGhvZHJ1blBoYXNlR3JhcGggbm90IHZhbGlkIGFmdGVyIGludGVydmFsQnVpbGRlcmFsbG9jYXRvcmxpdmVJbnN0cnVjdGlvbnNsaXZlSW50ZXJ2YWxzaGFuZGxlRGVsYXllZFZhcmlhYmxlRGVjbGFyYXRpb25zbmV4dFN0YXRlbWVudF9zYWZlSW5Jbml0aWFsaXplcnVuaW5pdGlhbGl6ZWRkZWNsYXJhdGlvbkxpc3R2aXNpdFN1YkdyYXBobmV3U3ViR3JhcGhvbGRTdWJHcmFwaG9sZEJsb2NrUXVldWVlbnRlclN1YkdyYXBobGltaXRzYmFzaWNCbG9ja2lzSlNFeHByZXNzaW9uaXNKU0NvbmRpdGlvbmdlbmVyYXRlU3RhdGVtZW50c2dlbmVyYXRlU3RhdGVtZW50c0luTmV3QmxvY2tvbGRDb250YWluZXJ1bndyYXBTdGF0ZW1lbnRnZW5lcmF0ZUV4cHJlc3Npb25vbGRJc0dlbmVyYXRpbmdFeHByZXNzaW9ub2xkRXhwcmVzc2lvblN0YWNrc2VxdWVuY2VFbGVtZW50c2V4cHJlc3Npb25TdWJHcmFwaGlzVmFyaWFibGVEZWNsYXJlZHZhcmlhYmxlTmFtZWdlbmVyYXRlRXhwcmVzc2lvbkFzc2lnbm1lbnRhc3NpZ25WYXJpYWJsZWRlZmluZW5lZWRzQXNzaWdubWVudHR5cGVDb252ZXJzaW9uaW5wdXROYW1lY29udGludWVBc0JyZWFraW1wbGljaXRDb250aW51ZUFzQnJlYWtpbXBsaWNpdEJyZWFrV2l0aExhYmVsd3JhcEludG9MYWJlbHNicmVha0xhYmVsU3RyaW5naGFuZGxlZERlZmF1bHRzdGF0ZW1lbnRJbmRleHZpc2l0Qm9keUlnbm9yZUxhYmVsc29sZEluZm9pc0NvbmRpdGlvbkV4cHJlc3Npb25pbml0aWFsaXphdGlvblR5cGVhdm9pZENvbnRhaW5lcmFzc2lnblBoaXNPZlN1Y2Nlc3NvcnNoYXNQaGlVcGRhdGVzanNJbml0aWFsaXphdGlvbmRlbGF5ZWRWYXJpYWJsZXNDb3VudGFsbFNpbXBsZUFzc2lnbm1lbnRzaXNDb21tYU9wZXJhdG9yaW5pdHNqc0NvbmRpdGlvbmpzVXBkYXRlc25ld0xpdGVyYWxCb29saWZUZXN0anNCcmVha2V4aXRMb29wd3JhcExvb3BCb2R5Rm9yQ29udGludWVleGl0QXZvaWRDb250YWluZXJoYXNFeGl0UGhpVXBkYXRlc2F2b2lkRWRnZXVwZGF0ZUJvZHlVbmV4cGVjdGVkIGxvb3Aga2luZDogY29udGludWVMYWJlbFN0cmluZ2xhYmVsZWRCbG9ja0luZm9jb250aW51ZU92ZXJyaWRlc2hhbmRsZUJsb2NrRmxvd29sZEJsb2NrSW5mb3JtYXRpb25jb250aW51ZVN1YkdyYXBoaXRlcmF0ZUJhc2ljQmxvY2tlbWl0QXNzaWdubWVudGRlc3RpbmF0aW9uc2VxdWVudGlhbGl6ZUNvcGllc2luc3RydWN0aW9uQ29waWVzdGVtcE5hbWVkb0Fzc2lnbm1lbnRzb3VyY2VJbmZvcm1hdGlvbk1hcGRlc3RpbmF0aW9uTmFtZWN1cnJlbnRMb2NhdGlvbnJlYWR5cHJ1bmVkQ29waWVzZ2V0Q29weUhhbmRsZXJnZXRTd2FwVGVtcGhhbmRsZUludm9rZUJpbmFyeWpzTGVmdHZpc2l0Qml0SW52b2tlQmluYXJ5dmlzaXRCaXRJbnZva2VVbmFyeWVtaXRJZGVudGl0eUNvbXBhcmlzb25pbnZlcnNlbGVmdEVxdWFsc051bGxyaWdodEVxdWFsc051bGx0cmlwbGVFcU1hdGguYWJzKCMpZG9taW5hdGVkLmxlbmd0aCA9IG5vZGUuYmxvY2sgIT0gY3VycmVudEdyYXBoLmVudHJ5dmlzaXRUcnkgc2hvdWxkIG5vdCBiZSBjYWxsZWQudHJ5Q29udHJvbEZsb3dPcGVyYXRpb25hdFVzZVNpdGVnZW5lcmF0ZUlmZ2VuZXJhdGVOb3RfYXNzZW1ibGVJZlRoZW5FbHNlIyAmJiAjbWV0aG9kTGl0ZXJhbHJlZ2lzdGVyTWV0aG9kSW52b2tlcmVnaXN0ZXJHZXR0ZXJyZWdpc3RlclNldHRlcmdldE9wdGltaXplZFNlbGVjdG9yRm9yRWxlbWVudCAgZXhwZWN0ZWQgdG8gYmUgbWl4ZWQgaW4uIGRvZXMgbm90IGFwcGx5IHRvIHRocm93RnVuY3Rpb24oMCwgIykoIykjIHx8ICNzdXBlckVsZW1lbnQjLiMuY2FsbCgjKXByb3RvdHlwZUFjY2Vzc2hhc0JlZW5JbnN0YW50aWF0ZWQjLiMoIylyZWdpc3RlckZvcmVpZ25UeXBlc2ludGVycG9sYXRlZEV4cHJlc3Npb25zanNDbGFzc1JlZmVyZW5jZWdlbmVyYXRlQ29uc3RhbnRjb25zdGFudFJlZmVyZW5jZXR5cGVDb25zdGFudG1hcFJlbGF0aW9uYWxPcGVyYXRvcmludmVyc2VPcGVyYXRvcmNhbkdlbmVyYXRlT3B0aW1pemVkQ29tcGFyaXNvbnJlbGF0aW9uYWxoYW5kbGVkQnlTcGVjaWFsQ2FzZWVtaXRJc2VtaXRJc1ZpYUludGVyY2VwdG9yaWZCbG9ja2dlbmVyYXRlVGhyb3dXaXRoSGVscGVydW5kZXJvdmVyIyA8IDBqc0luZGV4IyA+Pj4gMCAhPT0gI3VuZGVyT3ZlcmpzSGVscGVyaXNvbGF0ZVN0YXRpY0Nsb3N1cmVBY2Nlc3NzdGF0aWNGaWVsZEFjY2Vzc2xhenlHZXR0ZXJpc29sYXRlTGF6eUluaXRpYWxpemVyQWNjZXNzZ2VuZXJhdGVBcnJheUxpdGVyYWxvcjBjaGVja0JpZ0ludG1hdGhGbG9vckNhbGxNYXRoLmZsb29yKCMpICNjaGVja1R5cGVPZmNoZWNrRG91YmxlY2hlY2tCb29sYm9vbGVhbmNoZWNrT2JqZWN0bm90TnVsbGVxTnVsbGNoZWNrQXJyYXljaGVja0ZpZWxkRXhpc3RzY2hlY2tGaWVsZERvZXNOb3RFeGlzdGNoZWNrSW1tdXRhYmxlQXJyYXlpbW11dGFibGUkbGlzdGNoZWNrTXV0YWJsZUFycmF5Y2hlY2tFeHRlbmRhYmxlQXJyYXlmaXhlZCRsZW5ndGhjaGVja0ZpeGVkQXJyYXljaGVja051bGxjaGVja05vbk51bGxjaGVja1R5cGVWaWFQcm9wZXJ0eWNoZWNrVHlwZVZpYUluc3RhbmNlb2YjIGluc3RhbmNlb2YgI2hhbmRsZU51bWJlck9yU3RyaW5nU3VwZXJ0eXBlQ2hlY2tudW1iZXJUZXN0c3RyaW5nVGVzdG9iamVjdFRlc3Rjb21iaW5lcjJoYW5kbGVTdHJpbmdTdXBlcnR5cGVDaGVja2hhbmRsZUxpc3RPclN1cGVydHlwZUNoZWNrYXJyYXlUZXN0bnVtVGVzdGdlbmVyYXRlUmVjZWl2ZXJPckFyZ3VtZW50VHlwZVRlc3RVbmV4cGVjdGVkIGNoZWNrOiAjLiN0eXBlVmFyaWFibGVBY2Nlc3NOZWVkc1N1YnN0aXR1dGlvbmhlbHBlckVsZW1lbnQjKCMsICMsICMsICMpIygjLCAjLCAjKU5vdCBhbGwgaW5wdXQgaXMgcmVhZCBmb3IgdHlwZSByZWNlaXZlck1hc2tPcHRpbWl6YXRpb25QaGFzZVNzYU9wdGltaXplclRhc2tyYW5nZXNsb2dnZXJzRm9yVGVzdGluZ1NTQSBvcHRpbWl6ZXJib3VuZHNDaGVja2VkY29kZU1vdGlvbmxvYWRFbGltaW5hdGlvbnBoYXNlc2RjZW1vdmVkQ29kZWVsaW1pbmF0ZWRTaWRlRWZmZWN0c25ld0d2bkNhbmRpZGF0ZXNTc2FJbnN0cnVjdGlvblNpbXBsaWZpZXJNQVhfU0hBUkVEX0NPTlNUQU5UX0ZPTERFRF9TVFJJTkdfTEVOR1RIX2xvZ19ncmFwaHNpbXBsaWZ5UGhpc2IxYjJjb250cm9sRmxvd3Rlc3RlZHdoZW5OdWxsVmFsdWV3aGVuTm90TnVsbFZhbHVld2hlbk51bGxCbG9ja3doZW5Ob3ROdWxsQmxvY2tfc2FtZU9yUmVmaW5lbWVudE9mX2lzQm9vbENvbnN0YW50X21vc3RseUVtcHR5aW5zbmdldENvbnN0YW50RnJvbVR5cGVwcm9wYWdhdGVDb25zdGFudFZhbHVlVG9Vc2VzZm9sZGVkZm9sZFVuYXJ5dHJ5T3B0aW1pemVMZW5ndGhJbnRlcmNlcHRlZEdldHRlcmFjdHVhbFJlY2VpdmVyY29uc3RhbnRJbnB1dGhhbmRsZUludGVyY2VwdGVkQ2FsbGZvbGRCaW5hcnloYW5kbGVTdHJpbmdTcGxpdG9wdGltaXplZHJlc3VsdE1hc2tzcGxpdEluc3RydWN0aW9uc3RyaW5nVHlwZUluZm90YWdJbnN0cnVjdGlvbnRyeUlubGluZU5hdGl2ZU1ldGhvZGluc2VydGlvblBvaW50ZHVtbXlHZXRyZWdpc3RlckZpZWxkQ2FsbHJlZ2lzdGVyQ29uc3RhbnRGaWVsZENhbGxpbnB1dFBvc2l0aW9uY2hlY2tQYXJhbWV0ZXJUeXBlcGFyYW1ldGVyQWJzdHJhY3RWYWx1ZWNvbnN0YW50SW5zdHJ1Y3Rpb25vcDFvcDJhbGxVc2Vyc0FyZUJvb2xpZmllc2hhbmRsZUlkZW50aXR5Q2hlY2ttYWtlVHJ1ZW1ha2VGYWxzZWNvbXBhcmVDb25zdGFudHNpbXBsaWZ5Q29uZGl0aW9uaXNOZWdhdGVkZG9taW5hdGluZ2hvaXN0ZWRyZXBmaW5kQ29uY3JldGVGaWVsZEZvckR5bmFtaWNBY2Nlc3Njb25zdHJ1Y3RlZENvbnN0YW50Y29uc3RhbnRSZWNlaXZlcmluZGV4SW5zdHJ1Y3Rpb25yZWdpc3RlckZpZWxkR2V0cmVnaXN0ZXJDb25zdGFudEZpZWxkR2V0X2RpcmVjdEZpZWxkR2V0cmVnaXN0ZXJGaWVsZFNldGhhbmRsZUFycmF5VHlwZUluZm9maXJzdEFyZ3VtZW50Z2V0U3RyaW5nbGVmdENvbmNhdHRyeUNvbnN0YW50dG9TdHJpbmdUeXBlbmVlZHNTdWJzdGl0dXRpb25Gb3JUeXBlVmFyaWFibGVBY2Nlc3N0cnlDb3B5SW5mb2V4cGVjdGVkSW5kZXhuZXh0U291cmNlZmluaXNoR3JvdW5kVHlwZWdyb3VuZFR5cGV0eXBlQXRWYXJpYWJsZWZpbmlzaFN1YnN0aXR1dGVkY3JlYXRlZENsYXNzc2VsZWN0VHlwZUFyZ3VtZW50RnJvbU9iamVjdENyZWF0aW9uaW5zdHJ1Y3Rpb25Gb3JUeXBlVmFyaWFibGVyZWdpc3Rlckluc3RhbnRpYXRpb25zU3NhQ2hlY2tJbnNlcnRlcmluc2VydEJvdW5kc0NoZWNraW5kZXhOb2RlaW5kZXhBcmd1bWVudG1pbnVzT25lU3NhRGVhZENvZGVFbGltaW5hdG9ydHJpdmlhbERlYWRTdG9yZVJlY2VpdmVyc3phcEluc3RydWN0aW9uQ2FjaGV6YXBJbnN0cnVjdGlvbnRlbXBsYXRlVGhyb3dzTlNNb25OdWxsaGFzRm9sbG93aW5nVGhyb3dpbmdOU01pc0RlYWRCbG9ja2lzVHJpdmlhbERlYWRTdG9yZVJlY2VpdmVyaXNEZWFkVXNlaXNEZWFkQ29kZWlzVHJpdmlhbERlYWRTdG9yZWNsZWFuUGhpc3NpbXBsaWZ5Q29udHJvbEZsb3dyZW1vdmVVc2Vyc3NpbXBsaWZ5UGhpZXZhY3VhdGVUYWtlbkJyYW5jaHNlZW5VbnJlZmluZWRCYXNlcmVmaW5lbWVudHRoZW5TaXplbWVhc3VyZUVtcHR5SW50ZXJ2YWxlbHNlU2l6ZW5ld0NvbmRpdGlvbmJyYW5jaHJlcGxhY2VJbnB1dGluZGV4T2ZMaXZlYnlyZW1vdmVJbnB1dFNzYUxpdmVCbG9ja0FuYWx5emVybGl2ZW1hcmtCbG9ja0xpdmVzd2l0Y2hSYW5nZWxvd2VyVmFsdWV1cHBlclZhbHVlbGl2ZUxhYmVsc1NzYURlYWRQaGlFbGltaW5hdG9ybGl2ZVBoaXNTc2FSZWR1bmRhbnRQaGlFbGltaW5hdG9yR3ZuV29ya0l0ZW12YWx1ZVNldFNzYUdsb2JhbFZhbHVlTnVtYmVyZXJibG9ja0NoYW5nZXNGbGFnc2xvb3BDaGFuZ2VzRmxhZ3Njb21wdXRlQ2hhbmdlc0ZsYWdzbW92ZUxvb3BJbnZhcmlhbnRDb2RlY2hhbmdlc0ZsYWdzbW92ZUxvb3BJbnZhcmlhbnRDb2RlRnJvbUJsb2NrcHJlaGVhZGVyaXNMb29wQWx3YXlzVGFrZW5maXJzdEluc3RydWN0aW9uSW5Mb29wbG9vcEludmFyaWFudElucHV0c2lzSW5wdXREZWZpbmVkQWZ0ZXJEb21pbmF0b3JvbGRDaGFuZ2VzRmxhZ3NraWxsc3VjY2Vzc29yVmFsdWVzZ2V0Q2hhbmdlc0ZsYWdzRm9yRG9taW5hdGVkQmxvY2tTc2FDb2RlTW90aW9uaW5zbjFpbnNuMnRvUmV3cml0ZWNhbkJlTW92ZWRTc2FUeXBlQ29udmVyc2lvbkluc2VydGVyU3NhVHlwZWNvbnZlcnNpb25JbnNlcnRlcmluc2VydFR5cGVQcm9wYWdhdGlvbkZvckRvbWluYXRlZFVzZXJzY29udmVydGVkVHlwZWRvbWluYXRlZFVzZXN0cnVlVGFyZ2V0c2ZhbHNlVGFyZ2V0c2NvbGxlY3RUYXJnZXRzU3NhTG9hZEVsaW1pbmF0aW9ubWVtb3J5U2V0bWVtb3JpZXNpbnRlcnNlY3Rpb25Gb3JjaGVja05ld0d2bkNhbmRpZGF0ZXNoYXNVc2VHdm5fdmlzaXRGaWVsZEdldGxvb2t1cEZpZWxkVmFsdWVyZWdpc3RlckZpZWxkVmFsdWVyZWdpc3RlckZpZWxkVmFsdWVVcGRhdGVyZWdpc3RlckFsbG9jYXRpb25zaG91bGRUcmFja0luaXRpYWxWYWx1ZXNraWxsQWZmZWN0ZWRCeU1BWF9IRUFQX0RFUFRIaW50ZXJlc3RpbmdVc2VoZWFwRGVwdGhoYW5kbGVTdGF0aWNMb2FkbG9va3VwS2V5ZWRWYWx1ZXJlZ2lzdGVyS2V5ZWRWYWx1ZXJlZ2lzdGVyS2V5ZWRWYWx1ZVVwZGF0ZU1lbW9yeUZlYXR1cmVNZW1vcnlGZWF0dXJlLmxlbmd0aE1lbW9yeVNldGtleWVkVmFsdWVzbm9uRXNjYXBpbmdSZWNlaXZlcnNtdXN0QWxpYXNtYXlBbGlhc2lzQ29uY3JldGVlc2NhcGVzVW5leHBlY3RlZCBtZW1iZXIvZmVhdHVyZTogcmVjZWl2ZXJzVG9SZW1vdmVmaWVsZHNUb1JlbW92ZXdlYWtJbmRleG90aGVySW5kZXhmaW5kQ29tbW9uSW5zdHJ1Y3Rpb25wcmVkZWNlc3NvckluZGV4dXNlcjJwaGlUeXBlaXNOb25Fc2NhcGluZ1VzZW90aGVyVmFsdWVzaXNGaXhlZExlbmd0aF9JbmRleGVkSW5kZXhlZExpYnJhcnlJbmRleGVkTWVtYmVySW5kZXhlZEZ1bmN0aW9uSW5kZXhlZENvbnN0cnVjdG9ySW5kZXhlZEZpZWxkSW5kZXhlZFR5cGVWYXJpYWJsZUluZGV4ZWRUeXBlZGVmSW5kZXhlZExvY2FsRW50aXR5TWFwQmFzZUVudGl0eU1hcEUwRW50aXR5RGF0YU1hcEJhc2VEYXRhIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGNyZWF0ZWQgZm9yIEVudGl0eURhdGFNYXBEMERhdGEgbGlzdCBsZW5ndGggIGluY29uc2lzdGVudCB3aXRoIGVudGl0eSBsaXN0IGxlbmd0aCBEYXRhIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGNyZWF0ZWQuRW50aXR5RGF0YUVudk1hcEJhc2VFbnYgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgY3JlYXRlZCBmb3IgRW50aXR5RGF0YUVudk1hcFYwRW52IGxpc3QgbGVuZ3RoIEVudiBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBjcmVhdGVkLlJlcG9ydEVycm9yRnVuY3Rpb25EYXJ0MmpzQ29uc3RhbnRFdmFsdWF0b3Jfc3VwcG9ydFJlZXZhbHVhdGlvbkZvclRlc3RpbmdyZXF1aXJlc0NvbnN0YW50c3VwcG9ydFJlZXZhbHVhdGlvbkZvclRlc3RpbmdJbnZhbGlkIGNvbnN0YW50IHJlc3VsdCBVbmV2YWx1YXRlZENvbnN0YW50RmluZGVyQ29uc3RhbnRSZWZlcmVuY2VDb25zdGFudFJlZmVyZW5jZS52aXNpdENoaWxkcmVuQ29uc3RhbnRSZWZlcmVuY2UuYWNjZXB0Q29uc3RhbnRSZWZlcmVuY2UudHJhbnNmb3JtQ2hpbGRyZW5Db25zdGFudFJlZmVyZW5jZShjb25zdGFudD1Eb2VzTm90Q29tcGxldGVUeXBlRG9lc05vdENvbXBsZXRlVHlwZSgpVGhpc0ludGVyZmFjZVR5cGVFeGFjdEludGVyZmFjZVR5cGVTdGF0aWNUeXBlQmFzZWRhcnQyanNfaW5mby5zcmMudXRpbGdyYXBoRnJvbUluZm8gIGluZm86IGRlcGVuZGVuY3kgZ3JhcGggaW5mb3JtYXRpb24gaXMgd29yayBpbiBwcm9ncmVzcyBhbmQgbWlnaHQgYmUgaW5jb21wbGV0ZWFkZEVkZ2VpbmZvUGF0aHNlZ21lbnRjdXJyZW50QmFzZXNlZ21lbnRTdHJpbmdfd3JpdGVJbnRfcmVhZEludF9wZW5kaW5nc2VyaWFsaXphdGlvbiBjeWNsZXMgbm90IHN1cHBvcnRlZGpzX2FzdGNoYXJDb2Rlc3NyYy9ub2Rlcy5kYXJ0c3JjL2J1aWxkZXIuZGFydHNyYy9wcmludGVyLmRhcnRzcmMvdGVtcGxhdGUuZGFydHNyYy9lcXVpdmFsZW5jZV92aXNpdG9yLmRhcnRSZW5hbWVySW5zdGFudGlhdG9yTm9kZVZpc2l0b3Jjb25kQmFzZVZpc2l0b3J2aXNpdExvb3B2aXNpdFZhcmlhYmxlUmVmZXJlbmNldmlzaXRUb2tlbnZpc2l0TGl0ZXJhbHZpc2l0SW50ZXJwb2xhdGVkTm9kZU5vZGVWaXNpdG9yMUJhc2VWaXNpdG9yMXZpc2l0Q2hpbGRyZW4xX3NvdXJjZUluZm9ybWF0aW9uYXNWYXJpYWJsZVVzZXRvU3RhdGVtZW50UHJvZ3JhbUlmbm9FbHNlaGFzRWxzZUxvb3BGb3JXaGlsZURvUmV0dXJuVHJ5U3dpdGNoU3dpdGNoQ2xhdXNlQ2FzZURlZmF1bHRMaXRlcmFsU3RhdGVtZW50RGFydFlpZWxkcHJlY2VkZW5jZUxldmVsTGl0ZXJhbFN0cmluZ0Zyb21OYW1lTGl0ZXJhbEV4cHJlc3Npb253aXRoRGF0YVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0aW5kZW50U3BsaXRzUGFyZW50aGVzZXNBc3NpZ25tZW50VmFyaWFibGVJbml0aWFsaXphdGlvbkNvbmRpdGlvbmFsQ2FsbE5ld0ludGVybmFsIEVycm9yOiBVbmhhbmRsZWQgYmluYXJ5IG9wZXJhdG9yOiBQb3N0Zml4VmFyaWFibGVSZWZlcmVuY2VfaWRlbnRpZmllclJFXltBLVphLXpfJF1bQS1aYS16XyQwLTldKiROb24taWRlbnRpZmllciBuYW1lICdWYXJpYWJsZVVzZShQYXJhbWV0ZXJUaGlzTmFtZWRGdW5jdGlvbkZ1bmFzeW5jU3RhcnN5bmNTdGFyUHJvcGVydHlBY2Nlc3NpbmRleGVkRGVmZXJyZWRUb2tlbkRlZmVycmVkTnVtYmVyRGVmZXJyZWRTdHJpbmdEZWZlcnJlZEV4cHJlc3Npb25MaXRlcmFsTGl0ZXJhbE51bWJlckFycmF5SW5pdGlhbGl6ZXJBcnJheUhvbGVPYmplY3RJbml0aWFsaXplcmlzT25lTGluZXJQcm9wZXJ0eUludGVycG9sYXRlZE5vZGVfSW50ZXJwb2xhdGVkRXhwcmVzc2lvbiZFeHByZXNzaW9uJkludGVycG9sYXRlZE5vZGVJbnRlcnBvbGF0ZWRFeHByZXNzaW9uX0ludGVycG9sYXRlZExpdGVyYWwmTGl0ZXJhbCZJbnRlcnBvbGF0ZWROb2RlSW50ZXJwb2xhdGVkTGl0ZXJhbF9JbnRlcnBvbGF0ZWRQYXJhbWV0ZXImRXhwcmVzc2lvbiZJbnRlcnBvbGF0ZWROb2RlSW50ZXJwb2xhdGVkUGFyYW1ldGVySW50ZXJwb2xhdGVkUGFyYW1ldGVyLm5hbWUgbXVzdCBub3QgYmUgaW52b2tlZF9JbnRlcnBvbGF0ZWRTZWxlY3RvciZFeHByZXNzaW9uJkludGVycG9sYXRlZE5vZGVJbnRlcnBvbGF0ZWRTZWxlY3Rvcl9JbnRlcnBvbGF0ZWRTdGF0ZW1lbnQmU3RhdGVtZW50JkludGVycG9sYXRlZE5vZGVJbnRlcnBvbGF0ZWRTdGF0ZW1lbnRfSW50ZXJwb2xhdGVkRGVjbGFyYXRpb24mRXhwcmVzc2lvbiZJbnRlcnBvbGF0ZWROb2RlSW50ZXJwb2xhdGVkRGVjbGFyYXRpb25ObyBuYW1lIGZvciB0aGUgaW50ZXJwb2xhdGVkIG5vZGVSZWdFeHBMaXRlcmFsQXdhaXRKc0J1aWxkZXJfZmluZEV4cHJlc3Npb25UZW1wbGF0ZV9maW5kU3RhdGVtZW50VGVtcGxhdGV0aHJvdyBsb29rdXBFeHByZXNzaW9uVGVtcGxhdGVkZWZpbmVFeHByZXNzaW9uVGVtcGxhdGVsb29rdXBTdGF0ZW1lbnRUZW1wbGF0ZWRlZmluZVN0YXRlbWVudFRlbXBsYXRlZm9yY2VDb3B5dW5jYWNoZWRTdGF0ZW1lbnRUZW1wbGF0ZV9sZWdhY3lFc2NhcGVkU3RyaW5nZXNjYXBlZAp8InwIfAl8C3wNXGJDYW5ub3QgYmUgYm90aCBVVEY4IGFuZCBBU0NJSXNpbmdsZVF1b3Rlc2RvdWJsZVF1b3Rlc290aGVyRXNjYXBlc3VucGFpcmVkU3Vycm9nYXRlc3J1bmV1c2VTaW5nbGVRdW90ZXNceGxlYWRpbmd0cmFpbGluZ19pc1VucGFpcmVkU3Vycm9nYXRlNDI5NDk2NTI0OF9pcnJlZ3VsYXJFc2NhcGVcJ3N0cmluZ1BhcnRjb25jYXRlbmF0ZVN0cmluZ3NhZGRRdW90ZXNqb2luTGl0ZXJhbHNudW1BcnJheXN0cmluZ0FycmF5cHJvcGVydHlDYWxsb2JqZWN0TGl0ZXJhbE1pbmlKc1BhcnNlckVycm9ybGFzdFBvc2l0aW9ubmV3bGluZVBvc2xhc3RMaW5lU3RhcnRzcGFjZXNbXlx0XUVycm9yIGluIE1pbmlKc1BhcnNlcjoKXgpNaW5pSnNQYXJzZXJsYXN0Q2F0ZWdvcnlsYXN0VG9rZW5za2lwcGVkTmV3bGluZWludGVycG9sYXRlZFZhbHVlc0FMUEhBTlVNRVJJQ0FTU0lHTk1FTlRET1RMUEFSRU5SUEFSRU5MQlJBQ0VSQlJBQ0VMU1FVQVJFUlNRVUFSRVFVRVJZV0hJVEVTUEFDRUNBVEVHT1JJRVNISUdIRVNUX1BBUlNFX0JJTkFSWV9QUkVDRURFTkNFQklOQVJZX1BSRUNFREVOQ0VVTkFSWV9PUEVSQVRPUlNPUEVSQVRPUlNfVEhBVF9MT09LX0xJS0VfSURFTlRJRklFUlNnZXRUb2tlbmhhc05hbWVkSG9sZXNoYXNQb3NpdGlvbmFsSG9sZXNzaW5nbGVDaGFyQ2F0ZWdvcnljYXRlZ29yeVRvU3RyaW5nY2F0VW5rbm93bjogaXNBc3NpZ25tZW50c3ltYm9sZ2V0RGVsaW1pdGVkY3VycmVudENvZGVVbnRlcm1pbmF0ZWQgbGl0ZXJhbE51bWVyaWMgYW5kIGhleCBlc2NhcGVzIGFyZSBub3QgYWxsb3dlZCBpbiBsaXRlcmFsc25leHRQb3NpdGlvblVudGVybWluYXRlZCBjb21tZW50VW5wYXJzZWFibGUgbnVtYmVybmV3Q2F0YmluYXJ5UHJlY2VuZGVuY2VVbmtub3duIG9wZXJhdG9yZXhwZWN0Q2F0ZWdvcnlhY2NlcHRDYXRlZ29yeWV4cGVjdFNlbWljb2xvbmFjY2VwdFNlbWljb2xvbkV4cGVjdGVkIFNFTUlDT0xPTk5vIGF1dG9tYXRpYyBzZW1pY29sb24gaW5zZXJ0aW9uIGF0IHByZWNlZGluZyBuZXdsaW5lYWNjZXB0U3RyaW5ncGFyc2VIYXNoaG9sZU5hbWVIb2xlcyBtdXN0IGFsbCBiZSBwb3NpdGlvbmFsIG9yIG5hbWVkLiBwYXJzZU9iamVjdEluaXRpYWxpemVycGFyc2VBc3NpZ25tZW50cmVnZXhwRXhwZWN0ZWQgcHJpbWFyeSBleHByZXNzaW9ucGFyc2VWYXJpYWJsZURlY2xhcmF0aW9ucGFyc2VGdW5Pbmx5IHN5bmMqIGlzIHZhbGlkIC0gc3luYyBpcyBpbXBsaWVkaW50ZXJwb2xhdGVkTGl0ZXJhbEV4cGVjdGVkIHByb3BlcnR5IG5hbWVwYXJzZU1lbWJlcmdldERvdFJoc2luQnJhY2VzcGFyc2VDYWxsUGFyZW50aGVzZXMgYXJlIHJlcXVpcmVkIGZvciBuZXdFeHBlY3RlZCBhbHBoYW51bWVyaWMgaWRlbnRpZmllcnBhcnNlUG9zdGZpeHBhcnNlVW5hcnlIaWdocGFyc2VVbmFyeUxvd3BhcnNlQmluYXJ5bWF4UHJlY2VkZW5jZW1pblByZWNlZGVuY2VsYXN0U3ltYm9saGlnaGVycGFyc2VDb25kaXRpb25hbHBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbkxpc3RmaXJzdFZhcmlhYmxlZmluaXNoVmFyaWFibGVEZWNsYXJhdGlvbkxpc3RwYXJzZVZhckRlY2xhcmF0aW9uT3JFeHByZXNzaW9uVW5wYXJzZWQganVuazogcGFyc2VSZXR1cm5wYXJzZVRocm93cGFyc2VCcmVha09yQ29udGludWVwYXJzZUlmVGhlbkVsc2VwYXJzZUZvcnBhcnNlRnVuY3Rpb25EZWNsYXJhdGlvbnBhcnNlVHJ5cGFyc2VXaGlsZXBhcnNlRG9wYXJzZVN3aXRjaENhc2Ugb3V0c2lkZSBzd2l0Y2guRGVmYXVsdCBvdXRzaWRlIHN3aXRjaC5wYXJzZVlpZWxkTm90IGltcGxlbWVudGVkIGluIG1pbmkgcGFyc2VyY2hlY2tGb3JJbnRlcnBvbGF0ZWRTdGF0ZW1lbnR0aHJvdyBleHByZXNzaW9uIG11c3QgYmUgb24gc2FtZSBsaW5lZmluaXNoRm9yb2JqZWN0RXhwcmVzc2lvbnBhcnNlQ2F0Y2hleHBlY3RlZCAnZmluYWxseSdwYXJzZVN3aXRjaENsYXVzZWV4cGVjdGVkIGNhc2Ugb3IgZGVmYXVsdE1pc3Npbmcgd2hpbGUgYWZ0ZXIgZG8gYm9keS5fSW50ZXJsZWF2ZUl0ZXJhdG9yaXNOZXh0U2VwYXJhdG9yaXNJbml0aWFsaXplZF9JbnRlcmxlYXZlSXRlcmFibGVKYXZhU2NyaXB0UHJpbnRpbmdPcHRpb25zcHJlZmVyU2VtaWNvbG9uVG9OZXdsaW5lSW5NaW5pZmllZE91dHB1dGlkZW50aXR5UmVuYW1lckphdmFTY3JpcHRQcmludGluZ0NvbnRleHRTaW1wbGVKYXZhU2NyaXB0UHJpbnRpbmdDb250ZXh0ZGFuZ2xpbmdFbHNlVmlzaXRvcmxvY2FsTmFtZXJfY2hhckNvdW50aW5Gb3JJbml0YXRTdGF0ZW1lbnRCZWdpbnBlbmRpbmdTZW1pY29sb25wZW5kaW5nU3BhY2VpZGVudGlmaWVyQ2hhcmFjdGVyUmVnRXhwXlthLXpBLVpfMC05JF1leHByZXNzaW9uQ29udGludWF0aW9uUmVnRXhwXlstKyhbXWxhc3RBZGRlZFN0cmluZ2RldGVybWluZVJlbmFtZXJmb3JjZUxpbmVsaW5lT3V0c3BhY2VPdXRsYXN0Q2hhckNvZGVfZW1pdG91dExub3V0U2VtaWNvbG9uTG5vdXRJbmRlbnRvdXRJbmRlbnRMbnN0YXJ0Tm9kZWFkZFRvTm9kZWVuZE5vZGV2aXNpdENvbW1hU2VwYXJhdGVkaGFzUmVxdWlyZWRUeXBlbmV3SW5Gb3JJbml0bmV3QXRTdGF0ZW1lbnRCZWdpbnZpc2l0TmVzdGVkRXhwcmVzc2lvbnVud3JhcEJsb2NrSWZTaW5nbGVTdGF0ZW1lbnRibG9ja0JvZHluZWVkc1NlcGFyYXRpb25uZWVkc05ld2xpbmVibG9ja091dHNob3VsZEluZGVudGJsb2NrT3V0V2l0aG91dEJyYWNlc2lmT3V0bmVlZHNCcmFjZXN0aGVuV2FzQmxvY2sgaW5kZWZhdWx0OmZ1bmN0aW9uT3V0dmFyc3JlcXVpcmVkUHJlY2VkZW5jZW5lZWRzUGFyZW50aGVzZXN2YXIgdXNlSW5kZW50bGFzdFdhc0JpZ3RoaXNJc0JpZ19pc1NtYWxsSW5pdGlhbGl6YXRpb25uZXcgbGVmdFByZWNlZGVuY2VSZXF1aXJlbWVudHJpZ2h0UHJlY2VkZW5jZVJlcXVpcmVtZW50bGVmdFNwYWNlRm9yZ290IG9wZXJhdG9yOiBjaGFyQ29kZWlzVmFsaWRKYXZhU2NyaXB0SWQic3VwZXIiImNhdGNoInNlbGVjdG9yU3RyaW5nZmllbGRXaXRoUXVvdGVzbmFtZWRGdW5jdGlvbm91dHB1dE51bWJlcldpdGhSZXF1aXJlZFdoaXRlc3BhY2VVbnJlYWNoYWJsZWV4aXRPbmVMaW5lck1vZGVuYW1lTnVtYmVyV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgSlM6IGF3YWl0IE9yZGVyZWRTZXRWYXJDb2xsZWN0b3JlbmFibGVSZW5hbWluZ2Rpc2FibGVWYXJpYWJsZU1pbmlmaWNhdGlvblBhdHRlcm46Om5vcmVuYW1pbmc6OmVuYWJsZVZhcmlhYmxlTWluaWZpY2F0aW9uUGF0dGVybjo6ZG9yZW5hbWluZzo6Zm9yRWFjaFZhcmZvckVhY2hQYXJhbWNvbGxlY3RWYXJzSW5GdW5jdGlvbkRhbmdsaW5nRWxzZVZpc2l0b3JGb3Jnb3Qgbm9kZTogTG9jYWxOYW1lcm9sZE5hbWVkZWNsYXJlUGFyYW1ldGVySWRlbnRpdHlOYW1lck1pbmlmeVJlbmFtZXJwYXJhbWV0ZXJOdW1iZXJTdGFja3ZhcmlhYmxlTnVtYmVyU3RhY2twYXJhbWV0ZXJOdW1iZXJ2YXJpYWJsZU51bWJlckxPV0VSX0NBU0VfTEVUVEVSU0xFVFRFUlNESUdJVFNudGhMZXR0ZXJhdm9pZFJlbmFtaW5nZ2V0TmFtZU51bWJlcmFscGhhQ2hhcnNuYW1lU3BhY2VTaXplW2EtekEtWl1bYS16QS1aMC05XSpFbnRlckV4aXROb2RlVGVtcGxhdGVNYW5hZ2VyZXhwcmVzc2lvblRlbXBsYXRlc3N0YXRlbWVudFRlbXBsYXRlc2hvbGVOYW1lc19jb21waWxld2l0aEV4cHJlc3Npb25SZXN1bHRfY2hlY2tOb1BsYWNlaG9sZGVyc3dpdGhTdGF0ZW1lbnRSZXN1bHRXcm9uZyBudW1iZXIgb2YgdGVtcGxhdGUgYXJndW1lbnRzLCBnaXZlbiAsIHNvdXJjZTogInVudXNlZE5hbWVzVGVtcGxhdGUgYXJndW1lbnRzIGhhcyB1bnVzZWQgbWFwcGluZ3M6IFRlbXBsYXRlIGFyZ3VtZW50cyBpcyBtaXNzaW5nIG1hcHBpbmdzIGZvcjogSW5zdGFudGlhdG9yR2VuZXJhdG9yVmlzaXRvcmlkZW50aWZpZXJSRW1ha2VOdWxsY29udGFpbnNJbnRlcnBvbGF0ZWROb2Rlc3Zpc2l0TnVsbGFibGV2aXNpdFNwbGF5YWJsZVVuaW1wbGVtZW50ZWQgSW5zdGFudGlhdG9yR2VuZXJhdG9yVmlzaXRvciBmb3IgY29udmVydFN0cmluZ1RvVmFyaWFibGVVc2Vjb252ZXJ0U3RyaW5nVG9WYXJpYWJsZURlY2xhcmF0aW9uSW50ZXJwb2xhdGVkIHZhbHVlICMgaXMgbm90IGFuIEV4cHJlc3Npb246ICBpcyBub3QgYSBkZWNsYXJhdGlvbjogdmlzaXRTcGxheWFibGVFeHByZXNzaW9udG9FeHByZXNzaW9uIGlzIG5vdCBhbiBFeHByZXNzaW9uIG9yIExpc3Qgb2YgRXhwcmVzc2lvbnM6ICBpcyBub3QgYSBMaXRlcmFsOiB0b1BhcmFtZXRlciBpcyBub3QgYSBQYXJhbWV0ZXIgb3IgTGlzdCBvZiBQYXJhbWV0ZXJzOiAgaXMgbm90IGEgc2VsZWN0b3I6ICBpcyBub3QgYSBTdGF0ZW1lbnQ6IHZpc2l0U3BsYXlhYmxlU3RhdGVtZW50YSBTdGF0ZW1lbnQgb3IgTGlzdCBvZiBTdGF0ZW1lbnRzOiBpbnN0YW50aWF0b3JzdmlzaXRJZkNvbmRpdGlvbmFsQ29tcGlsYXRpb252aXNpdElmTm9ybWFsY29tcGlsZUNvbmRpdGlvbmlzIG5vdCBhbiBFeHByZXNzaW9uOiBtYWtlQ29uZGl0aW9ubWFrZVRoZW5tYWtlT3RoZXJ3aXNlbWFrZUluaXRtYWtlVXBkYXRlbWFrZUJvZHltYWtlTGVmdEhhbmRTaWRlbWFrZU9iamVjdFRPRE9tYWtlRXhwcmVzc2lvbm1ha2VDYXRjaG1ha2VGaW5hbGx5bWFrZURlY2xhcmF0aW9ubWFrZUtleW1ha2VDYXNlc21ha2VDYXNlbWFrZU5hbWVtYWtlRnVuY3Rpb25kZWNsYXJhdGlvbk1ha2Vyc21ha2VWYWx1ZWhhbmRsZUNhbGxPck5ld21ha2VUYXJnZXRhcmd1bWVudE1ha2Vyc2NhbGxBcmd1bWVudHNtYWtlTGVmdG1ha2VSaWdodG1ha2VPcGVyYW5kbWFrZVJlY2VpdmVybWFrZVNlbGVjdG9ycGFyYW1NYWtlcnNwYXJ0TWFrZXJzbWFrZUVuY2xvc2VkZWxlbWVudE1ha2Vyc3Byb3BlcnR5TWFrZXJzSW50ZXJwb2xhdGVkTm9kZUFuYWx5c2lzY29udGFpbnNJbnRlcnBvbGF0ZWROb2RlRXF1aXZhbGVuY2VWaXNpdG9yZmFpbEF0dGVzdFZhbHVlc3ZhbHVlMXZhbHVlMnRlc3RMYWJlbHNsYWJlbDFsYWJlbDJ0ZXN0Tm9kZXN0ZXN0Tm9kZUxpc3RzbGlzdDFsaXN0MnRlbXBsYXRlTWFuYWdlcmpzLmRlYnVnX0RlYnVnUHJpbnRlciZCYXNlVmlzaXRvciZJbmRlbnRhdGlvbl9EZWJ1Z1ByaW50ZXImQmFzZVZpc2l0b3ImSW5kZW50YXRpb24mVGFnZ2luZ0RlYnVnUHJpbnRlcnZpc2l0Tm9kZVdpdGhDaGlsZHJlbkxlbmllbnRQcmludGluZ0NvbnRleHRub2RlVG9TdHJpbmdwcmV0dHlwcmludGluZ0NvbnRleHRfU2NvcGVNb2RlbEJ1aWxkZXImVmlzaXRvciZWYXJpYWJsZUNvbGxlY3Rvck1peGluU2NvcGVNb2RlbEJ1aWxkZXJfbW9kZWxfc2NvcGVWYXJpYWJsZXNfZXhlY3V0YWJsZUNvbnRleHRfaXNJbnNpZGVDbG9zdXJlX291dGVybW9zdE5vZGVfbXV0YXRlZFZhcmlhYmxlc19jYXB0dXJlZFZhcmlhYmxlc19pblRyeV9jdXJyZW50U2NvcGVJbmZvX2hhc1RoaXNMb2NhbF9ib3hDb3VudGVyX2N1cnJlbnRUeXBlVXNhZ2Vfc2NvcGVzQ2FwdHVyZWRJbkNsb3N1cmVNYXBfY2xvc3VyZXNUb0dlbmVyYXRlYXR0YWNoQ2FwdHVyZWRTY29wZVZhcmlhYmxlc2NhcHR1cmVkVmFyaWFibGVzRm9yU2NvcGVub2RlQm94Z2V0Qm94TmFtZWVudGVyTmV3U2NvcGV2aXNpdE5ld1Njb3Blb2xkU2NvcGVWYXJpYWJsZXNvbGRJblRyeV9tYXJrVmFyaWFibGVBc1VzZWR2aXNpdEluQ29udGV4dF9oYW5kbGVWYXJpYWJsZURlY2xhcmF0aW9uX2luQ3VycmVudENvbnRleHRfcmVnaXN0ZXJOZWVkc1RoaXNfdXNlVHlwZVZhcmlhYmxlQXNMb2NhbHZpc2l0Tm9kZXNJbkNvbnRleHR2aXNpdEludm9rYWJsZW9sZElzSW5zaWRlQ2xvc3VyZW9sZEV4ZWN1dGFibGVDb250ZXh0c2F2ZWRTY29wZUluZm9zYXZlZElzSW5zaWRlQ2xvc3VyZWZyZWVWYXJpYWJsZWZyZWVWYXJpYWJsZUZvclJ0aV9hbmFseXplVHlwZVZhcmlhYmxlb2xkQ3VycmVudFR5cGVVc2FnZXBhcmFtZXRlclVzYWdlbWFrZUVhZ2VyX2lzRmllbGRPckNvbnN0cnVjdG9yQ29tcGxleGl0eUxldmVsQ29tcGxleGl0eUxldmVsLmNvbnN0YW50cG90ZW50aWFsbHlFYWdlckNvbXBsZXhpdHlMZXZlbC5wb3RlbnRpYWxseUVhZ2VyZGVmaW5pdGVseUxhenlDb21wbGV4aXR5TGV2ZWwuZGVmaW5pdGVseUxhenlJbml0aWFsaXplckNvbXBsZXhpdHllYWdlcmxhenkmZmllbGRzPVtVbmV4cGVjdGVkIGNvbXBsZXhpdHkgbGV2ZWwgSW5pdGlhbGl6ZXJDb21wbGV4aXR5KE51bGxBd2FyZUV4cHJlc3Npb25zeW50aGV0aWNWYXJpYWJsZV9GcmVlVmFyaWFibGVWaXNpdG9yRnJlZVZhcmlhYmxlVmlzaXRvci5kZWZhdWx0VHlwZU5vZGVub2RlVG9EZWJ1Z1N0cmluZ3RleHRMZW5ndGhibG9ja1RleHRuYW1lZE9yZGVyaW5nbmF0aXZlT3JkZXJpbmdjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZUFzeW5jIG1hcmtlciAgaXMgbm90IHN1cHBvcnRlZC5nZXROdWxsQXdhcmVFeHByZXNzaW9uZ2V0RGVmZXJyZWRJbXBvcnRjb250YWluc0ZyZWVWYXJpYWJsZXNSdW50aW1lVHlwZVVzZUtpbmR1bmtub3duUnVudGltZVR5cGVVc2VLaW5kLnVua25vd25SdW50aW1lVHlwZVVzZUtpbmQuZXF1YWxzUnVudGltZVR5cGVVc2VLaW5kLnN0cmluZ1J1bnRpbWVUeXBlVXNlRGF0YVVuZXhwZWN0ZWQgUnVudGltZVR5cGVVc2VLaW5kIFJ1bnRpbWVUeXBlVXNlRGF0YShraW5kPXJlY2VpdmVyR2V0PSxyZWNlaXZlcj1yZWNlaXZlclR5cGU9LGFyZ3VtZW50R2V0PWFyZ3VtZW50PSxhcmd1bWVudFR5cGU9Y29tcHV0ZVJ1bnRpbWVUeXBlVXNlcmVjZWl2ZXJEYXRhaXNHZXRSdW50aW1lVHlwZWFzR2V0UnVudGltZVR5cGVpc0ludm9rZVRvU3RyaW5ncmVjZWl2ZXJHZXRhcmd1bWVudEdldG51bGxBd2FyZW90aGVyR2V0UnVudGltZVR5cGVvdGhlck51bGxBd2FyZU1pc3NpbmcgcmVjZWl2ZXJHZXQgaW4gTWlzc2luZyBhcmd1bWVudEdldCBpbiBEdXBsaWNhdGUgcHJvcGVydHkgZ2V0IGluIGNvbXBpbGVyLnVuaXZlcnNlLmZlYXR1cmVGZWF0dXJlQUJTVFJBQ1RfQ0xBU1NfSU5TVEFOVElBVElPTkZlYXR1cmUuQUJTVFJBQ1RfQ0xBU1NfSU5TVEFOVElBVElPTkZlYXR1cmUuQVNTRVJUQVNTRVJUX1dJVEhfTUVTU0FHRUZlYXR1cmUuQVNTRVJUX1dJVEhfTUVTU0FHRUZlYXR1cmUuQVNZTkNBU1lOQ19GT1JfSU5GZWF0dXJlLkFTWU5DX0ZPUl9JTkZlYXR1cmUuQVNZTkNfU1RBUkNBVENIX1NUQVRFTUVOVEZlYXR1cmUuQ0FUQ0hfU1RBVEVNRU5UQ09NUElMRV9USU1FX0VSUk9SRmVhdHVyZS5DT01QSUxFX1RJTUVfRVJST1JGQUxMX1RIUk9VR0hfRVJST1JGZWF0dXJlLkZBTExfVEhST1VHSF9FUlJPUkZJRUxEX1dJVEhPVVRfSU5JVElBTElaRVJGZWF0dXJlLkZJRUxEX1dJVEhPVVRfSU5JVElBTElaRVJMQVpZX0ZJRUxERmVhdHVyZS5MQVpZX0ZJRUxETE9DQUxfV0lUSE9VVF9JTklUSUFMSVpFUkZlYXR1cmUuTE9DQUxfV0lUSE9VVF9JTklUSUFMSVpFUkxPQURfTElCUkFSWUZlYXR1cmUuTE9BRF9MSUJSQVJZU1RBQ0tfVFJBQ0VfSU5fQ0FUQ0hGZWF0dXJlLlNUQUNLX1RSQUNFX0lOX0NBVENIU1RSSU5HX0lOVEVSUE9MQVRJT05GZWF0dXJlLlNUUklOR19JTlRFUlBPTEFUSU9OU1RSSU5HX0pVWFRBUE9TSVRJT05GZWF0dXJlLlNUUklOR19KVVhUQVBPU0lUSU9OU1VQRVJfTk9fU1VDSF9NRVRIT0RGZWF0dXJlLlNVUEVSX05PX1NVQ0hfTUVUSE9EU1lNQk9MX0NPTlNUUlVDVE9SRmVhdHVyZS5TWU1CT0xfQ09OU1RSVUNUT1JTWU5DX0ZPUl9JTkZlYXR1cmUuU1lOQ19GT1JfSU5GZWF0dXJlLlNZTkNfU1RBUlRIUk9XX0VYUFJFU1NJT05GZWF0dXJlLlRIUk9XX0VYUFJFU1NJT05USFJPV19OT19TVUNIX01FVEhPREZlYXR1cmUuVEhST1dfTk9fU1VDSF9NRVRIT0RUSFJPV19SVU5USU1FX0VSUk9SRmVhdHVyZS5USFJPV19SVU5USU1FX0VSUk9SVEhST1dfVU5TVVBQT1JURURfRVJST1JGZWF0dXJlLlRIUk9XX1VOU1VQUE9SVEVEX0VSUk9SVFlQRV9WQVJJQUJMRV9CT1VORFNfQ0hFQ0tGZWF0dXJlLlRZUEVfVkFSSUFCTEVfQk9VTkRTX0NIRUNLTWFwTGl0ZXJhbFVzZU1hcExpdGVyYWxVc2UoLGlzQ29uc3RhbnQ6LGlzRW1wdHk6U2V0TGl0ZXJhbFVzZVNldExpdGVyYWxVc2UoTGlzdExpdGVyYWxVc2VMaXN0TGl0ZXJhbFVzZShSdW50aW1lVHlwZVVzZXN0cmluZzplcXVhbHM6dW5rbm93bjpSdW50aW1lVHlwZVVzZShraW5kPSxhcmd1bWVudD1HZW5lcmljSW5zdGFudGlhdGlvbkdlbmVyaWNJbnN0YW50aWF0aW9uKGZ1bmN0aW9uVHlwZTp0eXBlQXJndW1lbnRzOmNvbXBpbGVyLnNyYy5pbmZlcnJlci50eXBlX2dyYXBoX25vZGVzQXJndW1lbnRzVHlwZXNUeXBlSW5mb3JtYXRpb25fYXNzaWdubWVudHNpc1N0YWJsZV9zdGF0aWNIYXNoQ29kZVNUT1BfVFJBQ0tJTkdfQVNTSUdOTUVOVFNfTUFSS0VSbm9Bc3NpZ25tZW50c3VudHJhY2tlZHdpdGhBc3NpZ25tZW50c2NvbnRleHRNZW1iZXJtaWdodFJlc3VtZWFkZFVzZXJhcmVBc3NpZ25tZW50c1RyYWNrZWRzYWZlVHlwZXJlbW92ZUFuZENsZWFyUmVmZXJlbmNlc190b1N0cnVjdHVyZWRUZXh0QXBwbHlhYmxlVHlwZUluZm9ybWF0aW9uUGxhY2Vob2xkZXJUeXBlSW5mb3JtYXRpb25DYW5ub3QgdmlzaXQgcGxhY2Vob2xkZXJDYW5ub3QgcmVmaW5lIHBsYWNlaG9sZGVyUGxhY2Vob2xkZXIgW1BhcmFtZXRlckFzc2lnbm1lbnRzRWxlbWVudFR5cGVJbmZvcm1hdGlvbmRpc2FibGVJbmZlcmVuY2VGb3JDbG9zdXJlc193aXRoQXNzaWdubWVudHNfTWVtYmVyVHlwZUluZm9ybWF0aW9uJkVsZW1lbnRUeXBlSW5mb3JtYXRpb24mQXBwbHlhYmxlVHlwZUluZm9ybWF0aW9uTWVtYmVyVHlwZUluZm9ybWF0aW9uX2NhbGxlcnNhZGRDYWxscmVtb3ZlQ2FsbGNhbGxzX2NvbXB1dGVJc0NhbGxlZE9uY2Vpc0NhbGxlZE9uY2UgaGFzIGFscmVhZHkgYmVlbiBjb21wdXRlZC5pc0Nsb3N1cml6ZWRoYW5kbGVTcGVjaWFsQ2FzZXNfaGFuZGxlRnVuY3Rpb25DYXNlcG90ZW50aWFsbHlOYXJyb3dUeXBlX3BvdGVudGlhbGx5TmFycm93VHlwZXZpc2l0TWVtYmVyVHlwZUluZm9ybWF0aW9uRmllbGRUeXBlSW5mb3JtYXRpb25HZXR0ZXJUeXBlSW5mb3JtYXRpb25fZ2V0dGVyU2V0dGVyVHlwZUluZm9ybWF0aW9uX3NldHRlck1ldGhvZFR5cGVJbmZvcm1hdGlvbl9tZXRob2RGYWN0b3J5Q29uc3RydWN0b3JUeXBlSW5mb3JtYXRpb25fY29uc3RydWN0b3JHZW5lcmF0aXZlQ29uc3RydWN0b3JUeXBlSW5mb3JtYXRpb25QYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb25fcGFyYW1ldGVyX2lzSW5zdGFuY2VNZW1iZXJQYXJhbWV0ZXJfaXNDbG9zdXJlUGFyYW1ldGVyX2lzSW5pdGlhbGl6aW5nRm9ybWFsX2lzVGVhck9mZkNsb3N1cmVQYXJhbWV0ZXJ2aXNpdFBhcmFtZXRlclR5cGVJbmZvcm1hdGlvblBhcmFtZXRlciBQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24uZ2V0SW5mZXJyZWRTaWduYXR1cmVDYWxsVHlwZUNhbGxUeXBlLmFjY2Vzc2ZvckluQ2FsbFR5cGUuZm9ySW5fQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24mVHlwZUluZm9ybWF0aW9uJkFwcGx5YWJsZVR5cGVJbmZvcm1hdGlvbkNhbGxTaXRlVHlwZUluZm9ybWF0aW9uX2NhbGxDYWxsIHNpdGUgU3RhdGljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb25fZ2V0Q2FsbGVkVHlwZUluZm9pc1N5bnRoZXNpemVkX2dldENhbGxlZFR5cGVJbmZvV2l0aFNlbGVjdG9ydmlzaXRTdGF0aWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbkR5bmFtaWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbl9jYWxsVHlwZV9oYXNDbG9zdXJlQ2FsbFRhcmdldHNfY29uY3JldGVUYXJnZXRzY29tcHV0ZVR5cGVkU2VsZWN0b3J0YXJnZXRzSW5jbHVkZUNvbXBsZXhOb1N1Y2hNZXRob2RoYW5kbGVJbnRyaXNpZmllZFNlbGVjdG9ydWludDMxSW1wbGVtZW50YXRpb25pc1Bvc2l0aXZlSW50dHJ5TGF0ZXJub25OdWxsRW1wdHlUeXBlaGFzTm9Bcmd1bWVudHNvbGRUYXJnZXRzam9pblR5cGVNYXNrc0RpY3Rpb25hcnkgbG9va3VwIGZvciAgeWllbGRzICB5aWVsZHMgW251bGxdLk1hcCBsb29rdXAgZm9yIHZpc2l0RHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uQ2xvc3VyZUNhbGxTaXRlVHlwZUluZm9ybWF0aW9uQ2Fubm90IGNvbXB1dGUgY2FsbGVlcyBvZiBhIGNsb3N1cmUgY2FsbC5DbG9zdXJlIGNhbGwgdmlzaXRDbG9zdXJlQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb25Db25jcmV0ZVR5cGVJbmZvcm1hdGlvbk5vdCBzdXBwb3J0ZWR2aXNpdENvbmNyZXRlVHlwZUluZm9ybWF0aW9uU3RyaW5nTGl0ZXJhbFR5cGVJbmZvcm1hdGlvbiB2YWx1ZSB2aXNpdFN0cmluZ0xpdGVyYWxUeXBlSW5mb3JtYXRpb25Cb29sTGl0ZXJhbFR5cGVJbmZvcm1hdGlvbnZpc2l0Qm9vbExpdGVyYWxUeXBlSW5mb3JtYXRpb25OYXJyb3dUeXBlSW5mb3JtYXRpb250eXBlQW5ub3RhdGlvbm5hcnJvd2VkVHlwZUFOT01BTFkgV0FSTklORzogbmFycm93ZWQgIHZpYSBOYXJyb3cgdG8gdmlzaXROYXJyb3dUeXBlSW5mb3JtYXRpb25JbmZlcnJlZFR5cGVJbmZvcm1hdGlvbnBhcmVudFR5cGVfTGlzdFR5cGVJbmZvcm1hdGlvbiZUeXBlSW5mb3JtYXRpb24mVHJhY2VkVHlwZUluZm9ybWF0aW9uX2Zsb3dzSW50b2Zsb3dzSW50b2FkZEZsb3dzSW50b1RhcmdldHNMaXN0VHlwZUluZm9ybWF0aW9uaW5mZXJyZWRMZW5ndGhMaXN0IHR5cGUgdmlzaXRMaXN0VHlwZUluZm9ybWF0aW9uRWxlbWVudEluQ29udGFpbmVyVHlwZUluZm9ybWF0aW9uRWxlbWVudCBpbiBjb250YWluZXIgdmlzaXRFbGVtZW50SW5Db250YWluZXJUeXBlSW5mb3JtYXRpb25fU2V0VHlwZUluZm9ybWF0aW9uJlR5cGVJbmZvcm1hdGlvbiZUcmFjZWRUeXBlSW5mb3JtYXRpb25TZXRUeXBlSW5mb3JtYXRpb25TZXQgdHlwZSB2aXNpdFNldFR5cGVJbmZvcm1hdGlvbkVsZW1lbnRJblNldFR5cGVJbmZvcm1hdGlvbkVsZW1lbnQgaW4gc2V0IHZpc2l0RWxlbWVudEluU2V0VHlwZUluZm9ybWF0aW9uX01hcFR5cGVJbmZvcm1hdGlvbiZUeXBlSW5mb3JtYXRpb24mVHJhY2VkVHlwZUluZm9ybWF0aW9uTWFwVHlwZUluZm9ybWF0aW9uX2FsbEtleXNBcmVTdHJpbmdzaW5EaWN0aW9uYXJ5TW9kZW5vbk51bGxuZXdJbmZva2V5U3RyaW5nbmV3SW5mb3Nub3Qgc3VwcG9ydGVkdmlzaXRNYXBUeXBlSW5mb3JtYXRpb250b1R5cGVNYXNrTWFwICAoSzosIFY6KSBjb250ZW50cyBLZXlJbk1hcFR5cGVJbmZvcm1hdGlvbnZpc2l0S2V5SW5NYXBUeXBlSW5mb3JtYXRpb25LZXkgaW4gTWFwIFZhbHVlSW5NYXBUeXBlSW5mb3JtYXRpb252aXNpdFZhbHVlSW5NYXBUeXBlSW5mb3JtYXRpb25WYWx1ZSBpbiBNYXAgUGhpRWxlbWVudFR5cGVJbmZvcm1hdGlvbmJyYW5jaE5vZGVpc1RyeVBoaSggWyAuLi4gXXZpc2l0UGhpRWxlbWVudFR5cGVJbmZvcm1hdGlvbl9DbG9zdXJlVHlwZUluZm9ybWF0aW9uJlR5cGVJbmZvcm1hdGlvbiZBcHBseWFibGVUeXBlSW5mb3JtYXRpb25DbG9zdXJlVHlwZUluZm9ybWF0aW9uQ2xvc3VyZSB2aXNpdENsb3N1cmVUeXBlSW5mb3JtYXRpb25UcmFjZWRUeXBlSW5mb3JtYXRpb25Bd2FpdFR5cGVJbmZvcm1hdGlvbl9ub2RldmlzaXRBd2FpdFR5cGVJbmZvcm1hdGlvbllpZWxkVHlwZUluZm9ybWF0aW9uWWllbGR2aXNpdFlpZWxkVHlwZUluZm9ybWF0aW9uVHlwZUluZm9ybWF0aW9uVmlzaXRvcnZhbGlkQ2FsbFR5cGVVbmV4cGVjdGVkIGNhbGwgdHlwZSBfbmFycm93VHlwZW90aGVyVHlwZUtlcm5lbFR5cGVHcmFwaEJ1aWxkZXJfaW5mZXJyZXJfYW5hbHl6ZWRNZW1iZXJfYW5hbHl6ZWROb2RlX2xvY2Fsc01hcF9pbkdlbmVyYXRpdmVDb25zdHJ1Y3Rvcl9zdGF0ZUludGVybmFsX3N0YXRlQWZ0ZXJXaGVuVHJ1ZUludGVybmFsX3N0YXRlQWZ0ZXJXaGVuRmFsc2VJbnRlcm5hbF9zaWRlRWZmZWN0c0J1aWxkZXJfYnJlYWtzRm9yX2NvbnRpbnVlc0Zvcl9jYXB0dXJlZEFuZEJveGVkX3N0YXRpY1R5cGVQcm92aWRlcl9hY2N1bXVsYXRlSXNDaGVja3NfbG9vcExldmVsY2FwdHVyZWRBbmRCb3hlZF9zdGF0ZWluR2VuZXJhdGl2ZUNvbnN0cnVjdG9yX3N0YXRlQWZ0ZXJXaGVuVHJ1ZV9zdGF0ZUFmdGVyV2hlbkZhbHNlX3NldFN0YXRlQWZ0ZXJ3aGVuVHJ1ZXdoZW5GYWxzZV9jbG9zdXJlRGF0YUxvb2t1cF9pc0luQ2xhc3NPclN1YmNsYXNzX2NoZWNrSWZFeHBvc2VzVGhpc2lzVGhpc0V4cG9zZWRtYXJrVGhpc0FzRXhwb3NlZGlzSW5jb21wYXRpYmxlSW52b2tlYW5hbHl6ZWRNZXRob2Rjb25kaXRpb25Db250ZXh0b2xkQWNjdW11bGF0ZUlzQ2hlY2tzaGFuZGxlUGFyYW1ldGVyc3VwZGF0ZUZpZWxkYW5hbHl6ZUFyZ3VtZW50c2hhbmRsZUNvbnN0cnVjdG9ySW52b2tlc2VlblJldHVybk9yVGhyb3djcmVhdGVJbnN0YW50aWF0aW9uVHlwZUluZm9ybWF0aW9uVW5oYW5kbGVkIGV4cHJlc3Npb246IFVuaGFuZGxlZCBzdGF0ZW1lbnQ6IGNyZWF0ZU51bGxUeXBlSW5mb3JtYXRpb25hYm9ydHNzdGF0ZUJlZm9yZWhhbmRsZUNvbmRpdGlvbnN0YXRlQWZ0ZXJNZXNzYWdlbWVyZ2VEaWFtb25kRmxvd3NlZW5CcmVha09yQ29udGludWVfc2V0dXBCcmVha3NBbmRDb250aW51ZXNtZXJnZUFmdGVyQnJlYWtzX2dldEJyZWFrc19jbGVhckJyZWFrc0FuZENvbnRpbnVlc2NvbnRpbnVlVGFyZ2V0c3N0YXRlQmVmb3JlQ2FzZXN0YXRlQWZ0ZXJDYXNlbWVyZ2VBbGxzdGF0ZXNUb01lcmdlaGFzRGVmYXVsdENhc2VrZWVwT3duTG9jYWxzY3JlYXRlTGlzdFR5cGVJbmZvcm1hdGlvbmVsZW1lbnRUeXBlc2FsbG9jYXRlUGhpYWRkUGhpSW5wdXRjb250YWluZXJUeXBlYWxsb2NhdGVMaXN0Y3JlYXRlU2V0VHlwZUluZm9ybWF0aW9uYWxsb2NhdGVTZXRjcmVhdGVNYXBUeXBlSW5mb3JtYXRpb25lbnRyeVR5cGVza2V5VHlwZXN2YWx1ZVR5cGVzYWxsb2NhdGVNYXBtYXJrSW5pdGlhbGl6YXRpb25Bc0luZGVmaW5pdGVjcmVhdGVCb29sVHlwZUluZm9ybWF0aW9uYm9vbExpdGVyYWxUeXBlY3JlYXRlSW50VHlwZUluZm9ybWF0aW9uZ2V0Q29uY3JldGVUeXBlRm9yY3JlYXRlRG91YmxlVHlwZUluZm9ybWF0aW9uY3JlYXRlU3RyaW5nVHlwZUluZm9ybWF0aW9uc3RyaW5nTGl0ZXJhbFR5cGVjcmVhdGVTeW1ib2xMaXRlcmFsVHlwZUluZm9ybWF0aW9uY3JlYXRlVHlwZUxpdGVyYWxJbmZvcm1hdGlvblVuZXhwZWN0ZWQgcGFyYW1ldGVyIGRlY2xhcmF0aW9uLk1pc3NpbmcgdHlwZSBpbmZvcm1hdGlvbiBmb3IgaGFuZGxlU3RhdGljSW52b2tlbmFycm93VHlwZV9wb3RlbnRpYWxseUFkZE51bGxDaGVja25ld1R5cGVkU2VsZWN0b3JoYW5kbGVEeW5hbWljSW52b2tlX2hhbmRsZUR5bmFtaWNzZWxlY3Rvck5lZWRzVXBkYXRlaGFuZGxlRHluYW1pY0dldGhhbmRsZUR5bmFtaWNTZXRjdXJyZW50TWFza21vdmVOZXh0TWFza2l0ZXJhdG9yVHlwZWl0ZXJhdG9yU2VsZWN0b3JpdGVyYXRvck1hc2tjdXJyZW50VHlwZV9nZXRMb29wQmFja0VkZ2VzbG9naWNfZmluZExlbmd0aF9pc0NvbnN0cnVjdG9yT2ZUeXBlZEFycmF5U3ViY2xhc3Nhcmd1bWVudHNUeXBlc2hhbmRsZUNsb3N1cmVDYWxsaGFuZGxlRm9yZWlnbkludm9rZVVuZXhwZWN0ZWQgc3RhdGljIGludm9jYXRpb24gdGFyZ2V0OiBjcmVhdGVTdGF0aWNHZXRUeXBlSW5mb3JtYXRpb250eXBlZE1hc2tfcG90ZW50aWFsbHlBZGRJc0NoZWNrc3RhdGVBZnRlckNoZWNrV2hlblRydWVzdGF0ZUFmdGVyQ2hlY2tXaGVuRmFsc2VuYXJyb3dMb2NhbHN0YXRlQWZ0ZXJDb25kaXRpb25XaGVuVHJ1ZXN0YXRlQWZ0ZXJDb25kaXRpb25XaGVuRmFsc2VzdGF0ZUFmdGVyVGhlbnN0YXRlQWZ0ZXJFbHNlc3RhdGVBZnRlck9wZXJhbmRXaGVuVHJ1ZXN0YXRlQWZ0ZXJPcGVyYW5kV2hlbkZhbHNlc3RhdGVBZnRlckxlZnRXaGVuVHJ1ZXN0YXRlQWZ0ZXJMZWZ0V2hlbkZhbHNlc3RhdGVBZnRlclJpZ2h0V2hlblRydWVzdGF0ZUFmdGVyUmlnaHRXaGVuRmFsc2VzdGF0ZUFmdGVyV2hlblRydWVzdGF0ZUFmdGVyV2hlbkZhbHNlc3RhdGVBZnRlclVuZXhwZWN0ZWQgbG9naWNhbCBvcGVyYXRvciAnZmlyc3RUeXBlc2Vjb25kVHlwZWFsbG9jYXRlRGlhbW9uZFBoaWhhbmRsZUxvY2FsRnVuY3Rpb25sb2NhbEZ1bmN0aW9uVHlwZWNsb3N1cmVTdGF0ZXN0YXRlQWZ0ZXJCb2R5bWVyZ2VGbG93c3RhdGVCZWZvcmVDYXRjaHN0YXRlQWZ0ZXJDYXRjaGhhbmRsZVN1cGVyTm9TdWNoTWV0aG9kTm8gbWVtYmVyIGZvdW5kIGZvciBzdXBlciBwcm9wZXJ0eSBnZXQ6IE5vIG1lbWJlciBmb3VuZCBmb3Igc3VwZXIgcHJvcGVydHkgc2V0OiBVbmV4cGVjdGVkIHN1cGVyIGludm9jYXRpb24gdGFyZ2V0OiBUeXBlSW5mb3JtYXRpb25Db25zdGFudFZpc2l0b3JVbmV4cGVjdGVkIHVuZXZhbHVhdGVkIGNvbnN0YW50OiBSZWZpbmVtZW50TG9jYWxTdGF0ZV9maWVsZHNfdHJ5QmxvY2tpbml0aWFsY2hpbGRQYXRoZGVlcENvcHlPZmZpZWxkU2NvcGVpc0luZGVmaW5pdGV0aGVuQnJhbmNoZWxzZUJyYW5jaGluUGxhY2VzdGF0ZXNhbGxCcmFuY2hlc0Fib3J0TG9jYWxTdGF0ZSgpIFsgIGxvY2FsczoKXWxvY2Fscz0sZmllbGRzPSxzZWVuUmV0dXJuT3JUaHJvdyxzZWVuQnJlYWtPckNvbnRpbnVlY29tcGlsZXIuc3JjLmluZmVycmVyLmNsb3N1cmVfdHJhY2VyQ2xvc3VyZVRyYWNlclZpc2l0b3J0cmFjZWRFbGVtZW50c19jYWxsc1RvQW5hbHl6ZVRyYWNpbmcgYWJzdHJhY3QgbWV0aG9kczogX2FuYWx5emVDYWxsX3RhZ0FzRnVuY3Rpb25BcHBseVRhcmdldCBtaWdodCBiZSBwYXNzZWQgdG8gYXBwbHk6IF9yZWdpc3RlckNhbGxGb3JMYXRlckFuYWx5c2lzZnVuY3Rpb25FbGVtZW50Y3VycmVudFVzZXJiYWlsb3V0UGFzc2VkIHRvIGEgY2xvc3VyZWNhbGxlZFVzZWQgaW4gSlMgX2NoZWNrSWZGdW5jdGlvbkFwcGx5c3RhdGljIGNhbGxfY2hlY2tJZkN1cnJlbnRVc2VyZHluYW1pYyBjYWxsYWRkTmV3RXNjYXBlSW5mb3JtYXRpb25TdGF0aWNUZWFyT2ZmQ2xvc3VyZVRyYWNlclZpc2l0b3J0cmFjZWRFbGVtZW50Y29tcGlsZXIuc3JjLmluZmVycmVyLmRlYnVnVkVSQk9TRVBSSU5UX1NVTU1BUllBTk9NQUxZX1dBUk5QUklOVF9HUkFQSFBSSU5UX0dSQVBIX0FMTF9OT0RFU2xvY2Fsc19oYW5kbGVySXRlcmFibGVNaXhpbl9sZXZlbGNvcHlPZlVuZXhwZWN0ZWQgYmxvY2sgIGZvciBWYXJpYWJsZVNjb3BlLnRyeUJsb2NrY29tbW9uUGFyZW50Zm9yRWFjaExvY2FsVW50aWxTY29wZV9mb3JFYWNoTG9jYWxVbnRpbFNjb3Blc2VlbkxvY2Fsc1Njb3BlIG5vdCBmb3VuZDogCm9yaWdpbj1zY29wZT1mb3JFYWNoTG9jYWxWYXJpYWJsZVNjb3BlKCAgbGV2ZWw6ICBjb3B5T2Y6VmFyaWFibGVTY29wZSggIHRyeUJsb2NrOiAgIHZhcmlhYmxlczogICAgICAgIHBhcmVudDogICAgIHJlc3R9IEZpZWxkSW5pdGlhbGl6YXRpb25TY29wZWludGVybmFsRnJvbXRoZW5TY29wZWVsc2VTY29wZW90aGVyU2NvcGV7IHBvc2l0aW9uYWwgPSAsIG5hbWVkID0gIH1Bcmd1bWVudHNUeXBlcy5oYXNoQ29kZUFyZ3VtZW50c1R5cGVzSXRlcmF0b3JfaXRlcmF0ZVBvc2l0aW9uYWxpdGVyYXRlZV9jdXJyZW50SXRlcmF0b3JMb2NhbHNIYW5kbGVyTm8gY29tbW9uIHBhcmVudCBmb3IKMToyOk5vbi1lbXB0eSBjb21tb24gcGFyZW50IGZvcgpteVR5cGVtZXJnZUxvY2FsZWxzZVR5cGVEaWZmIGNvbW1vbiBwYXJlbnQgZm9yCgoyOmNvbW1vbjptZXJnZWRhbGxvY2F0ZUxvb3BQaGlMb2NhbHNIYW5kbGVyKGNvbXBpbGVyLnNyYy5pbmZlcnJlci5saXN0X3RyYWNlckxpc3RUcmFjZXJWaXNpdG9ycG9zaXRpb25hbExlbmd0aFVzZWQgaW4gYSBub3Qtb2sgc2VsZWN0b3Jva0xpc3RTZWxlY3RvcnNTZXRjaGVja011dGFibGVjaGVja0dyb3dhYmxlZG9Ob3RDaGFuZ2VMZW5ndGhTZWxlY3RvcnNTZXRjb21waWxlci5zcmMuaW5mZXJyZXIubWFwX3RyYWNlck1hcFRyYWNlclZpc2l0b3JBZGRpbmcgbWFwIHdpdGggdW5rbm93biB0eXBlaW5mbyB0byBjdXJyZW50IG1hcE1hcCB1c2VkIGluIGEgbm90LW9rIHNlbGVjdG9yIFtva01hcFNlbGVjdG9yc1NldGNvbXBpbGVyLnNyYy5pbmZlcnJlci5zZXRfdHJhY2VyU2V0VHJhY2VyVmlzaXRvckFkZGluZyBpdGVyYWJsZSB3aXRoIHVua25vd24gdHlwZWluZm8gdG8gY3VycmVudCBzZXRTZXQgdXNlZCBpbiBhIG5vdC1vayBzZWxlY3RvciBbb2tTZXRTZWxlY3RvclNldGRhcnQyanMuaW5mZXJyZXIudHlwZV9ncmFwaF9kdW1wVHlwZUdyYXBoRHVtcG91dHB1dERpcnR5cGVncmFwaGFzc2lnbm1lbnRzQmVmb3JlQW5hbHlzaXNhc3NpZ25tZW50c0JlZm9yZVRyYWNpbmd1c2VkRmlsZW5hbWVzYWxsVHlwZXNmaWxlbmFtZUZyb21FbGVtZW50YWRkTWlzc2luZ05vZGVzZ2V0LXNldC0tY29uc3RydWN0b3JzZXJpYWxOdW1iZXJfR3JhcGhHZW5lcmF0b3JnbG9iYWxub2RlSWRlc2NhcGVSZWdleHBbInt9PD58XWRlZmF1bHROb2RlQ29sb3IjZWVmZmVlcGhpQ29sb3IjZWVmZmZmbmFycm93Q29sb3JjYWxsQ29sb3IjZmZmZmVldW5jaGFuZ2VkRWRnZWFkZGVkRWRnZWdyZWVuNHJlbW92ZWRFZGdlcmVkM3RlbXBvcmFyeUVkZ2VvcmFuZ2VnZXROb2RlZGlncmFwaCB7c2hvcnRlbmdldEZyZXNoSWRlc2NhcGVMYWJlbGRzdGRzdFRleHRDb25jcmV0ZXw8cmV0dXJuVHlwZT4gIFtzaGFwZT1yZWNvcmQsc3R5bGU9ZG90dGVkLGxhYmVsPSIiXSBbY29sb3I9IjpyZXR1cm5UeXBlIC0+IGdldFN0eWxlRm9yTm9kZXN0eWxlPWRvdHRlZHN0eWxlPWZpbGxlZCxmaWxsY29sb3I9ImFwcGVuZERldGFpbHMKKHJldHVybiB2YWx1ZSkKKGZyb20gPGE+IHt7fXwgW3NoYXBlPXJlY29yZCxsYWJlbD0iIixvcmlnaW5hbFNldHRyYWNlclNldE5hcnJvdwpQaGkgRWxlbWVudEluQ29udGFpbmVyRWxlbWVudEluU2V0S2V5SW5NYXBWYWx1ZUluTWFwU3RyaW5nTGl0ZXJhbAoiQm9vbExpdGVyYWwKaGFuZGxlQ2FsbGFyZ05hbWVDbG9zdXJlQ2FsbFNpdGVTdGF0aWNDYWxsU2l0ZUR5bmFtaWNDYWxsU2l0ZW9iak1lbWJlcgpDbG9zdXJlCkF3YWl0CllpZWxkClR5cGVTeXN0ZW1TdHJhdGVneVR5cGVTeXN0ZW1fb3JkZXJlZFR5cGVJbmZvcm1hdGlvbnNudWxsVHlwZUNhY2hlaW50VHlwZUNhY2hldWludDMyVHlwZUNhY2hldWludDMxVHlwZUNhY2hlcG9zaXRpdmVJbnRUeXBlQ2FjaGVkb3VibGVUeXBlQ2FjaGVudW1UeXBlQ2FjaGVib29sVHlwZUNhY2hlZnVuY3Rpb25UeXBlQ2FjaGVsaXN0VHlwZUNhY2hlY29uc3RMaXN0VHlwZUNhY2hlZml4ZWRMaXN0VHlwZUNhY2hlZ3Jvd2FibGVMaXN0VHlwZUNhY2hlc2V0VHlwZUNhY2hlY29uc3RTZXRUeXBlQ2FjaGVtYXBUeXBlQ2FjaGVjb25zdE1hcFR5cGVDYWNoZXN0cmluZ1R5cGVDYWNoZXR5cGVUeXBlQ2FjaGVkeW5hbWljVHlwZUNhY2hlYXN5bmNGdXR1cmVUeXBlQ2FjaGVzeW5jU3Rhckl0ZXJhYmxlVHlwZUNhY2hlYXN5bmNTdGFyU3RyZWFtVHlwZUNhY2hlQWxyZWFkeSBjb25zdHJ1Y3RpbmcgZ3JhcGggZm9yIF9pc05vbk51bGxOYXJyb3dVbmV4cGVjdGVkIGFic3RyYWN0IG1lbWJlciBfZ2V0SW5mZXJyZWRUeXBlT2ZNZW1iZXJpc0VsZW1lbnRJbmZlcnJlZGVsZW1lbnRUeXBlTWFza2tleVR5cGVNYXNrdmFsdWVUeXBlTWFza2tleVR5cGVJbmZvdmFsdWVUeXBlSW5mb2ZpcnN0SW5wdXRzZWNvbmRJbnB1dF9hZGRQaGlpc0R5bmFtaWNJbmdvcmluZ051bGxtYXlCZU51bGxTVUNDRVNTZGFydDJqcy5qc19lbWl0dGVyLmNsYXNzX3N0dWJfZ2VuZXJhdG9yQ2xhc3NTdHViR2VuZXJhdG9yZ2VuZXJhdGVDbGFzc0NvbnN0cnVjdG9yaGFzUnRpRmllbGR0eXBlSW5pdHN0aGlzLiMgPSAjZmllbGRJbml0aWFsaXplcnNmdW5jdGlvbigjLCAjKSB7ICM7ICM7IHRoaXMuIygpO31nZW5lcmF0ZUdldHRlcmZ1bmN0aW9uKCMpIHsgcmV0dXJuICMuIyB9Z2VuZXJhdGVTZXR0ZXJmdW5jdGlvbigjLCB2KSB7IHJldHVybiAjLiMgPSB2OyB9Z2VuZXJhdGVDYWxsU3R1YnNGb3JHZXR0ZXJyZWNlaXZlckFyZ3VtZW50TmFtZSRyZWNlaXZlcmJ1aWxkR2V0dGVydGhpcy4jKCMpIy4jKClnZW5lcmF0ZWRTdHVic2dlbmVyYXRlZFNlbGVjdG9yc2Nsb3N1cmVDYWxsTmFtZWZ1bmN0aW9uKCMpIHsgcmV0dXJuICMuIygjKTsgfWNvbXB1dGVTZWxlY3RvcnNGb3JOc21IYW5kbGVyc2pzTmFtZXNhZGROb1N1Y2hNZXRob2RIYW5kbGVyc2lnbm9yZW1hc2tTZXRnZW5lcmF0ZVN0dWJGb3JOb1N1Y2hNZXRob2RwYXJhbWV0ZXJOYW1lc2FyZ05hbWVzdGhpcy4jbm9TdWNoTWV0aG9kTmFtZSgjcmVjZWl2ZXIsCiAgICAgICAgICAgICAgICAgICAgI2NyZWF0ZUludm9jYXRpb25NaXJyb3IoI21ldGhvZE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2ludGVybmFsTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYXJndW1lbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNuYW1lZEFyZ3VtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdHlwZUFyZ3VtZW50Q291bnQpKWZ1bmN0aW9uKCRyZWNlaXZlciwgIykgeyByZXR1cm4gIyB9YnVpbGRUZWFyT2ZmQ29kZXRlYXJPZmZBY2Nlc3NFeHByZXNzaW9udGVhck9mZkdsb2JhbE9iamVjdFN0cmluZ3RlYXJPZmZHbG9iYWxPYmplY3RmdW5jdGlvbigpIHsgdGhyb3cgIkhlbHBlciAnY2xvc3VyZUZyb21UZWFyT2ZmJyBtaXNzaW5nLiIgfU1pc3NpbmdIZWxwZXJGdW5jdGlvbihmdW5jdGlvbigpIHsgdGhyb3cgIkhlbHBlciAnY2xvc3VyZUZyb21UZWFyT2ZmJyBtaXNzaW5nLiIgfSkoKXRlYXJPZmZHZXR0ZXJ0ZWFyT2ZmQWNjZXNzVGV4dGZ1bmN0aW9uIHRlYXJPZmZHZXR0ZXIoZnVuY3MsIGFwcGx5VHJhbXBvbGluZUluZGV4LCByZWZsZWN0aW9uSW5mbywgbmFtZSwgaXNJbnRlcmNlcHRlZCkgewogIHJldHVybiBpc0ludGVyY2VwdGVkCiAgICAgID8gbmV3IEZ1bmN0aW9uKCJmdW5jcyIsICJhcHBseVRyYW1wb2xpbmVJbmRleCIsICJyZWZsZWN0aW9uSW5mbyIsICJuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgI3RlYXJPZmZHbG9iYWxPYmplY3RTdHJpbmcsICJjIiwKICAgICAgICAgICJyZXR1cm4gZnVuY3Rpb24gdGVhck9mZl8iICsgbmFtZSArIChmdW5jdGlvbkNvdW50ZXIrKykgKyAiKHJlY2VpdmVyKSB7IiArCiAgICAgICAgICAgICJpZiAoYyA9PT0gbnVsbCkgYyA9ICIgKyAjdGVhck9mZkFjY2Vzc1RleHQgKyAiKCIgKwogICAgICAgICAgICAgICAgInRoaXMsIGZ1bmNzLCBhcHBseVRyYW1wb2xpbmVJbmRleCwgcmVmbGVjdGlvbkluZm8sIGZhbHNlLCB0cnVlLCBuYW1lKTsiICsKICAgICAgICAgICAgICAgICJyZXR1cm4gbmV3IGModGhpcywgZnVuY3NbMF0sIHJlY2VpdmVyLCBuYW1lKTsiICsKICAgICAgICAgICAifSIpKGZ1bmNzLCBhcHBseVRyYW1wb2xpbmVJbmRleCwgcmVmbGVjdGlvbkluZm8sIG5hbWUsICN0ZWFyT2ZmR2xvYmFsT2JqZWN0LCBudWxsKQogICAgICA6IG5ldyBGdW5jdGlvbigiZnVuY3MiLCAiYXBwbHlUcmFtcG9saW5lSW5kZXgiLCAicmVmbGVjdGlvbkluZm8iLCAibmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICN0ZWFyT2ZmR2xvYmFsT2JqZWN0U3RyaW5nLCAiYyIsCiAgICAgICAgICAicmV0dXJuIGZ1bmN0aW9uIHRlYXJPZmZfIiArIG5hbWUgKyAoZnVuY3Rpb25Db3VudGVyKyspKyAiKCkgeyIgKwogICAgICAgICAgICAiaWYgKGMgPT09IG51bGwpIGMgPSAiICsgI3RlYXJPZmZBY2Nlc3NUZXh0ICsgIigiICsKICAgICAgICAgICAgICAgICJ0aGlzLCBmdW5jcywgYXBwbHlUcmFtcG9saW5lSW5kZXgsIHJlZmxlY3Rpb25JbmZvLCBmYWxzZSwgZmFsc2UsIG5hbWUpOyIgKwogICAgICAgICAgICAgICAgInJldHVybiBuZXcgYyh0aGlzLCBmdW5jc1swXSwgbnVsbCwgbmFtZSk7IiArCiAgICAgICAgICAgICAifSIpKGZ1bmNzLCBhcHBseVRyYW1wb2xpbmVJbmRleCwgcmVmbGVjdGlvbkluZm8sIG5hbWUsICN0ZWFyT2ZmR2xvYmFsT2JqZWN0LCBudWxsKTsKfSAgICAgIGZ1bmN0aW9uIHRlYXJPZmZHZXR0ZXIoZnVuY3MsIGFwcGx5VHJhbXBvbGluZUluZGV4LCByZWZsZWN0aW9uSW5mbywgbmFtZSwgaXNJbnRlcmNlcHRlZCkgewogICAgICAgIHZhciBjYWNoZSA9IG51bGw7CiAgICAgICAgcmV0dXJuIGlzSW50ZXJjZXB0ZWQKICAgICAgICAgICAgPyBmdW5jdGlvbihyZWNlaXZlcikgewogICAgICAgICAgICAgICAgaWYgKGNhY2hlID09PSBudWxsKSBjYWNoZSA9ICMoCiAgICAgICAgICAgICAgICAgICAgdGhpcywgZnVuY3MsIGFwcGx5VHJhbXBvbGluZUluZGV4LCByZWZsZWN0aW9uSW5mbywgZmFsc2UsIHRydWUsIG5hbWUpOwogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBjYWNoZSh0aGlzLCBmdW5jc1swXSwgcmVjZWl2ZXIsIG5hbWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmIChjYWNoZSA9PT0gbnVsbCkgY2FjaGUgPSAjKAogICAgICAgICAgICAgICAgICAgIHRoaXMsIGZ1bmNzLCBhcHBseVRyYW1wb2xpbmVJbmRleCwgcmVmbGVjdGlvbkluZm8sIGZhbHNlLCBmYWxzZSwgbmFtZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGNhY2hlKHRoaXMsIGZ1bmNzWzBdLCBudWxsLCBuYW1lKTsKICAgICAgICAgICAgICB9OwogICAgICB9ICAgICAgZnVuY3Rpb24gdGVhck9mZihmdW5jcywgYXBwbHlUcmFtcG9saW5lSW5kZXgsCiAgICAgICAgICByZWZsZWN0aW9uSW5mbywgaXNTdGF0aWMsIG5hbWUsIGlzSW50ZXJjZXB0ZWQpIHsKICAgICAgdmFyIGNhY2hlID0gbnVsbDsKICAgICAgcmV0dXJuIGlzU3RhdGljCiAgICAgICAgICA/IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGlmIChjYWNoZSA9PT0gbnVsbCkgY2FjaGUgPSAjdGVhck9mZigKICAgICAgICAgICAgICAgICAgdGhpcywgZnVuY3MsIGFwcGx5VHJhbXBvbGluZUluZGV4LAogICAgICAgICAgICAgICAgICByZWZsZWN0aW9uSW5mbywgdHJ1ZSwgZmFsc2UsIG5hbWUpLnByb3RvdHlwZTsKICAgICAgICAgICAgICByZXR1cm4gY2FjaGU7CiAgICAgICAgICAgIH0KICAgICAgICAgIDogdGVhck9mZkdldHRlcihmdW5jcywgYXBwbHlUcmFtcG9saW5lSW5kZXgsCiAgICAgICAgICAgICAgcmVmbGVjdGlvbkluZm8sIG5hbWUsIGlzSW50ZXJjZXB0ZWQpOwogICAgfWRhcnQyanMuanNfZW1pdHRlci5jb2RlX2VtaXR0ZXJfdGFza3N0YXJ0dXBfanNfZW1pdHRlclR5cGVUZXN0UmVnaXN0cnl0eXBlVGVzdFJlZ2lzdHJ5X25hdGl2ZUVtaXR0ZXJfZW1pdHRlckZhY3RvcnlOYXRpdmVFbWl0dGVyIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldC5FbWl0dGVyIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldC5Db2RlIGVtaXR0ZXJzdXBwb3J0c1JlZmxlY3Rpb24jLnByb3RvdHlwZWludGVyY2VwdG9yQ2xhc3NBY2Nlc3N0ZW1wbGF0ZUZvckJ1aWx0aW5fZmluYWxpemVSdGljb21wdXRlUmVxdWlyZWRUeXBlQ2hlY2tzY29tcHV0ZVJ0aU5lZWRlZENsYXNzZXNwcm9ncmFtQnVpbGRlcnJ0aUNoZWNrc3J0aU5lZWRlZENsYXNzZXNlbWl0UHJvZ3JhbUVtaXR0ZXJGYWN0b3J5cHJvZ3JhbUZvclRlc3Rpbmdjb21wYXJlQ29uc3RhbnRzaXNDb25zdGFudElubGluZWRPckFscmVhZHlFbWl0dGVkRW1pdHRlckJhc2VnbG9iYWxQcm9wZXJ0eUFjY2Vzc0Zvck1lbWJlcnBhZ2xvYmFsUHJvcGVydHlBY2Nlc3NGb3JDbGFzc2dsb2JhbFByb3BlcnR5QWNjZXNzRm9yVHlwZWRhcnQyanMuanNfZW1pdHRlci5pbnN0YW50aWF0aW9uX3N0dWJfZ2VuZXJhdG9ySW5zdGFudGlhdGlvblN0dWJHZW5lcmF0b3JfZW1pdHRlclRhc2tfZ2VuZXJhdGVTdHViaW5zdGFudGlhdGlvbkNsYXNzZnVuY3Rpb25GaWVsZHRhcmdldFNlbGVjdG9ydGhpcy4jWyNdZnVuY3Rpb24oIykgeyByZXR1cm4gdGhpcy4jLiMoIyk7IH1fZ2VuZXJhdGVTaWduYXR1cmVTdHViZnVuY3Rpb24oKSB7IHJldHVybiAjKCModGhpcy4jKSwgdGhpcy4jKTsgfWdlbmVyYXRlU3R1YnNfZ2VuZXJpY0Nsb3N1cmVDYW4ndCBmaW5kIENsb3N1cmUgZmllbGQgb2YgY2FsbFNlbGVjdG9yc2NvbXB1dGVMaXZlUGFyYW1ldGVyU3RydWN0dXJlc3BhcmFtZXRlclN0cnVjdHVyZXNzdHVic2dlbmVyaWNDYWxsU3RydWN0dXJlZ2VuZXJpY1NlbGVjdG9yZGFydDJqcy5qc19lbWl0dGVyLmludGVyY2VwdG9yX3N0dWJfZ2VuZXJhdG9yZW1iZWRkZWROYW1lc0ludGVyY2VwdG9yU3R1YkdlbmVyYXRvcmdlbmVyYXRlR2V0SW50ZXJjZXB0b3JNZXRob2RpbnRlcmNlcHRvckZvcmJ1aWxkSW50ZXJjZXB0b3JDaGVjayh0eXBlb2YgcmVjZWl2ZXIpID09ICJib29sZWFuImludGVybmFsIGVycm9ycmVjZWl2ZXIuY29uc3RydWN0b3IgPT0gQXJyYXkodHlwZW9mIHJlY2VpdmVyKSA9PSAic3RyaW5nInJlY2VpdmVyID09IG51bGxpZiAoIykgcmV0dXJuICNoYXNBcnJheWhhc0Jvb2xoYXNEb3VibGVoYXNJbnRoYXNOdWxsaGFzTnVtYmVyaGFzU3RyaW5naGFzTmF0aXZlYW55TmF0aXZlQ2xhc3Nlc3doZW5OdW1iZXJpbnRlcmNlcHRvckZvck51bWJlcnsKICAgICAgICAgICAgaWYgKE1hdGguZmxvb3IocmVjZWl2ZXIpID09IHJlY2VpdmVyKSByZXR1cm4gIzsKICAgICAgICAgICAgcmV0dXJuICM7CiAgICAgICAgfXJldHVybiAjaWYgKHR5cGVvZiByZWNlaXZlciA9PSAibnVtYmVyIikgIztpZiAocmVjZWl2ZXIgPT0gbnVsbCkgcmV0dXJuIHJlY2VpdmVyewogICAgICAgICAgaWYgKHR5cGVvZiByZWNlaXZlciAhPSAib2JqZWN0IikgewogICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVjZWl2ZXIgPT0gImZ1bmN0aW9uIiApIHJldHVybiAjOwogICAgICAgICAgICAgIHJldHVybiByZWNlaXZlcjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChyZWNlaXZlciBpbnN0YW5jZW9mICMpIHJldHVybiByZWNlaXZlcjsKICAgICAgICAgIHJldHVybiAjKHJlY2VpdmVyKTsKICAgICAgfWpzVW5rbm93bmlmICghKHJlY2VpdmVyIGluc3RhbmNlb2YgIykpIHJldHVybiAjO3JldHVybiByZWNlaXZlcmZ1bmN0aW9uKHJlY2VpdmVyKSB7ICM7IH1fZ2VuZXJhdGVJc0pzSW5kZXhhYmxlQ2FsbHVzZTF1c2UyZGlzcGF0Y2hQcm9wZXJ0eU5hbWVkaXNwYXRjaFByb3BlcnR5aGVscGVyRXhwcmVzc2lvbl9mYXN0UGF0aEZvck9uZVNob3RJbnRlcmNlcHRvcnsKICAgICAgICAgIGlmIChyZWNlaXZlciA9PSBudWxsKSByZXR1cm4gYTAgPT0gbnVsbDsKICAgICAgICAgIGlmICh0eXBlb2YgcmVjZWl2ZXIgIT0gIm9iamVjdCIpCiAgICAgICAgICAgIHJldHVybiBhMCAhPSBudWxsICYmIHJlY2VpdmVyID09PSBhMDsKICAgICAgICB9cmVjZWl2ZXIgIGEwIyA+Pj4gMGlmICh0eXBlb2YgcmVjZWl2ZXIgPT0gIm51bWJlciIgJiYgdHlwZW9mIGEwID09ICJudW1iZXIiKSAgcmV0dXJuICM7aWYgKHR5cGVvZiByZWNlaXZlciA9PSAibnVtYmVyIikgcmV0dXJuIC1yZWNlaXZlciAgICAgICAgICBpZiAodHlwZW9mIHJlY2VpdmVyID09ICJudW1iZXIiICYmIE1hdGguZmxvb3IocmVjZWl2ZXIpID09IHJlY2VpdmVyKQogICAgICAgICAgICByZXR1cm4gKH5yZWNlaXZlcikgPj4+IDA7CiAgICAgICAgICBjb250YWluc0FycmF5Y29udGFpbnNTdHJpbmdjb250YWluc0pzSW5kZXhhYmxlYXJyYXlDaGVja2dlbmVyaWNJbmRleGFibGVDaGVja29yRXhwdHlwZW9mIHJlY2VpdmVyID09ICJzdHJpbmciICAgICAgICAgIGlmICh0eXBlb2YgYTAgPT09ICJudW1iZXIiKQogICAgICAgICAgICBpZiAoIykKICAgICAgICAgICAgICBpZiAoKGEwID4+PiAwKSA9PT0gYTAgJiYgYTAgPCByZWNlaXZlci5sZW5ndGgpCiAgICAgICAgICAgICAgICByZXR1cm4gcmVjZWl2ZXJbYTBdOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYTAgPT09ICJudW1iZXIiKQogICAgICAgICAgICBpZiAoIyAmJiAhcmVjZWl2ZXIuaW1tdXRhYmxlJGxpc3QgJiYKICAgICAgICAgICAgICAgIChhMCA+Pj4gMCkgPT09IGEwICYmIGEwIDwgcmVjZWl2ZXIubGVuZ3RoKQogICAgICAgICAgICAgIHJldHVybiByZWNlaXZlclthMF0gPSBhMTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlY2VpdmVyID09PSAibnVtYmVyIikgcmV0dXJuIE1hdGguYWJzKHJlY2VpdmVyKTsKICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWNlaXZlciA9PT0gIm51bWJlciIpCiAgICAgICAgICAgICByZXR1cm4gcmVjZWl2ZXIgPiAwID8gMSA6IHJlY2VpdmVyIDwgMCA/IC0xIDogcmVjZWl2ZXI7CiAgICAgICAgZ2VuZXJhdGVPbmVTaG90SW50ZXJjZXB0b3JnZXRJbnRlcmNlcHRvck5hbWVnbG9iYWxPYmplY3RvcHRpbWl6ZWRQYXRoZnVuY3Rpb24oIykgeyAjOyByZXR1cm4gIy4jKHJlY2VpdmVyKS4jKCMpIH1nZW5lcmF0ZVR5cGVUb0ludGVyY2VwdG9yTWFwZGFydDJqcy5qc19lbWl0dGVyLm1haW5fY2FsbF9zdHViX2dlbmVyYXRvck1haW5DYWxsU3R1YkdlbmVyYXRvcmdlbmVyYXRlSW52b2tlTWFpbm1haW5DYWxsQ2xvc3VyZWN1cnJlbnRTY3JpcHRBY2Nlc3MgICAgICAoZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgIGNhbGxiYWNrKG51bGwpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvLyBXaGVuIHJ1bm5pbmcgYXMgYSBjb250ZW50LXNjcmlwdCBvZiBhIGNocm9tZS1leHRlbnNpb24gdGhlCiAgICAgICAgLy8gJ2N1cnJlbnRTY3JpcHQnIGlzIGBudWxsYCAoYnV0IG5vdCB1bmRlZmluZWQpLgogICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQuY3VycmVudFNjcmlwdCAhPSAndW5kZWZpbmVkJykgewogICAgICAgICAgY2FsbGJhY2soZG9jdW1lbnQuY3VycmVudFNjcmlwdCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB2YXIgc2NyaXB0cyA9IGRvY3VtZW50LnNjcmlwdHM7CiAgICAgICAgZnVuY3Rpb24gb25Mb2FkKGV2ZW50KSB7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNjcmlwdHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgc2NyaXB0c1tpXS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIiwgb25Mb2FkLCBmYWxzZSk7CiAgICAgICAgICB9CiAgICAgICAgICBjYWxsYmFjayhldmVudC50YXJnZXQpOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNjcmlwdHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgIHNjcmlwdHNbaV0uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIG9uTG9hZCwgZmFsc2UpOwogICAgICAgIH0KICAgICAgfSkoZnVuY3Rpb24oY3VycmVudFNjcmlwdCkgewogICAgICAgICNjdXJyZW50U2NyaXB0ID0gY3VycmVudFNjcmlwdDsKCiAgICAgICAgaWYgKHR5cGVvZiBkYXJ0TWFpblJ1bm5lciA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgZGFydE1haW5SdW5uZXIoI21haW5DYWxsQ2xvc3VyZSwgW10pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAjbWFpbkNhbGxDbG9zdXJlKFtdKTsKICAgICAgICB9CiAgICAgIH0pY3VycmVudFNjcmlwdGRhcnQyanMuanNfZW1pdHRlci5tZXRhZGF0YV9jb2xsZWN0b3Jqc19wcmVjZWRlbmNlX01ldGFkYXRhRW50cnlfQm91bmRNZXRhZGF0YUVudHJ5X0JvdW5kTWV0YWRhdGFFbnRyeSgscmM9LF92YWx1ZT1fTWV0YWRhdGFMaXN0c2V0RXhwcmVzc2lvbl9tZXRhZGF0YVRva2Vuc19tZXRhZGF0YU1hcF90eXBlc1Rva2Vuc190eXBlc01hcGdldE1ldGFkYXRhRm9yT3V0cHV0VW5pdGdldFR5cGVzRm9yT3V0cHV0VW5pdHJlaWZ5RGVmYXVsdEFyZ3VtZW50c19hZGRHbG9iYWxNZXRhZGF0YXJlaWZ5VHlwZWFkZFR5cGVJbk91dHB1dFVuaXRyZWlmeU5hbWVyZWlmeUV4cHJlc3Npb25uYW1lVG9LZXlwcmludGVkX2NvbXB1dGVUeXBlUmVwcmVzZW50YXRpb25UeXBlIHJlcHJlc2VudGF0aW9uIGZvciB0eXBlIHZhcmlhYmxlIHJlaWZpZWQgdHlwZXMgc2hvdWxkIG5vdCBiZSBzdHJpbmdzLmNvdW50VG9rZW5zSW5UeXBlc2ZpbmFsaXplTWFwbWV0YWRhdGFNYXB0eXBlc01hcGRhcnQyanMuanNfZW1pdHRlci5uYXRpdmVfZW1pdHRlcmhhc05hdGl2ZUNsYXNzZXNwcmVwYXJlTmF0aXZlQ2xhc3Nlc2ludGVyY2VwdG9yQ2xhc3Nlc05lZWRlZEJ5Q29uc3RhbnRzY2xhc3Nlc05lZWRlZEZvclJ0aXByZU9yZGVyd2Fsa25vbkxlYWZDbGFzc2VzZXh0ZW5zaW9uUG9pbnRzY29tcHV0ZUV4dGVuc2lvblBvaW50c25lZWRlZGlzVHJpdmlhbENsYXNzbGVhZlRhZ3Nub25sZWFmVGFnc25hdGl2ZVRhZ3NzdWZmaWNpbmdJbnRlcmNlcHRvcmZpbGxOYXRpdmVJbmZvbmF0aXZlTGVhZlRhZ3NuYXRpdmVOb25MZWFmVGFnc25hdGl2ZUV4dGVuc2lvbnNuYXRpdmVBbmNlc3Rvck9mbmF0aXZlQW5jZXN0b3JuZWVkc0FjY2Vzc29ybmVlZHNHZXR0ZXJuZWVkc1VuY2hlY2tlZFNldHRlcm5lZWRzQ2hlY2tlZFNldHRlcmNhbGxTdHVic2lzU2ltcGxlTWl4aW5BcHBsaWNhdGlvbnBvdGVudGlhbGx5Q29udmVydERhcnRDbG9zdXJlc1RvSnNzdHViUGFyYW1ldGVyc3N0dWJQYXJhbWV0ZXIjID0gIygjLCBnZW5lcmF0ZVBhcmFtZXRlclN0dWJTdGF0ZW1lbnRzYXJndW1lbnRzQnVmZmVyaW5kZXhPZkxhc3RPcHRpb25hbEFyZ3VtZW50SW5QYXJhbWV0ZXJzcmV0dXJuICMuIygjKWlzU3VwZXJ0eXBlT2ZOYXRpdmVDbGFzc3JlcXVpcmVzTmF0aXZlSXNDaGVja2RhcnQyanMuanNfZW1pdHRlci5uYXRpdmVfZ2VuZXJhdG9yTmF0aXZlR2VuZXJhdG9ybmVlZHNJc29sYXRlQWZmaW5pdHlUYWdJbml0aWFsaXphdGlvbmdlbmVyYXRlSXNvbGF0ZUFmZmluaXR5VGFnSW5pdGlhbGl6YXRpb25pbnRlcm5TdHJpbmdGdW5jdGlvbmdldElzb2xhdGVUYWdBY2Nlc3Npc29sYXRlVGFnQWNjZXNzZGlzcGF0Y2hQcm9wZXJ0eU5hbWVBY2Nlc3MgICAgICAhZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGludGVybiA9ICNpbnRlcm5TdHJpbmdGdW5jdGlvbjsKCiAgICAgICAgI2dldElzb2xhdGVUYWcgPSBmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgICByZXR1cm4gaW50ZXJuKCJfX19kYXJ0XyIgKyBuYW1lICsgI2lzb2xhdGVUYWcpOwogICAgICAgIH07CgogICAgICAgIC8vIFRvIGVuc3VyZSB0aGF0IGRpZmZlcmVudCBwcm9ncmFtcyBsb2FkZWQgaW50byB0aGUgc2FtZSBjb250ZXh0IChwYWdlKQogICAgICAgIC8vIHVzZSBkaXN0aW5jdCBkaXNwYXRjaCBwcm9wZXJpZXMsIHdlIHBsYWNlIGFuIG9iamVjdCBvbiBgT2JqZWN0YCB0bwogICAgICAgIC8vIGNvbnRhaW4gdGhlIG5hbWVzIGFscmVhZHkgaW4gdXNlLgogICAgICAgIHZhciB0YWJsZVByb3BlcnR5ID0gIl9fX2RhcnRfaXNvbGF0ZV90YWdzXyI7CiAgICAgICAgdmFyIHVzZWRQcm9wZXJ0aWVzID0gT2JqZWN0W3RhYmxlUHJvcGVydHldIHx8CiAgICAgICAgICAgIChPYmplY3RbdGFibGVQcm9wZXJ0eV0gPSBPYmplY3QuY3JlYXRlKG51bGwpKTsKCiAgICAgICAgdmFyIHJvb3RQcm9wZXJ0eSA9ICJfIjsKICAgICAgICBmb3IgKHZhciBpID0gMDsgOyBpKyspIHsKICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IGludGVybihyb290UHJvcGVydHkgKyAiXyIgKyBpICsgIl8iKTsKICAgICAgICAgIGlmICghKHByb3BlcnR5IGluIHVzZWRQcm9wZXJ0aWVzKSkgewogICAgICAgICAgICB1c2VkUHJvcGVydGllc1twcm9wZXJ0eV0gPSAxOwogICAgICAgICAgICAjaXNvbGF0ZVRhZyA9IHByb3BlcnR5OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCNpbml0aWFsaXplRGlzcGF0Y2hQcm9wZXJ0eSkgewogICAgICAgICAgI2Rpc3BhdGNoUHJvcGVydHlOYW1lID0gI2dldElzb2xhdGVUYWcoImRpc3BhdGNoX3JlY29yZCIpOwogICAgICAgIH0KICAgICAgfSgpOwogICAgaW5pdGlhbGl6ZURpc3BhdGNoUHJvcGVydHlnZXRJc29sYXRlVGFnaXNvbGF0ZVRhZ2dlbmVyYXRlSXNvbGF0ZVRhZ1Jvb3RaeFl4WGVuY29kZU5hdGl2ZUluZm9ub25MZWFmVGFnc2V4dGVuc2lvbnNmb3JtYXRUYWdzbGVhZlN0cm5vbkxlYWZTdHJidWlsZE5hdGl2ZUluZm9IYW5kbGVyaW5mb0FjY2Vzc3N1YmNsYXNzUmVhZEdlbmVyYXRvcmludGVyY2VwdG9yc0J5VGFnQWNjZXNzbGVhZlRhZ3NBY2Nlc3NzdWJjbGFzc1JlYWRzdWJjbGFzc2VzW2ldICAgICAgICAgIC8vIFRoZSBuYXRpdmUgaW5mbyBsb29rcyBsaWtlIHRoaXM6CiAgICAgICAgICAvLwogICAgICAgICAgLy8gSHRtbEVsZW1lbnQ6IHsKICAgICAgICAgIC8vICAgICAiJSI6ICJIVE1MRGl2RWxlbWVudHxIVE1MQW5jaG9yRWxlbWVudDtIVE1MRWxlbWVudDtGYW5jeUJ1dHRvbiIKICAgICAgICAgIC8vCiAgICAgICAgICAvLyBUaGUgZmlyc3QgdHdvIHNlbWljb2xvbi1zZXBhcmF0ZWQgcGFydHMgY29udGFpbiBkaXNwYXRjaCB0YWdzLCB0aGUKICAgICAgICAgIC8vIHRoaXJkIGNvbnRhaW5zIHRoZSBKYXZhU2NyaXB0IG5hbWVzIGZvciBjbGFzc2VzLgogICAgICAgICAgLy8KICAgICAgICAgIC8vIFRoZSB0YWdzIGluZGljYXRlIHRoYXQgSmF2YVNjcmlwdCBvYmplY3RzIHdpdGggdGhlIGRpc3BhdGNoIHRhZ3MKICAgICAgICAgIC8vICh1c3VhbGx5IGNvbnN0cnVjdG9yIG5hbWVzKSBIVE1MRGl2RWxlbWVudCwgSFRNTEFuY2hvckVsZW1lbnQgYW5kCiAgICAgICAgICAvLyBIVE1MRWxlbWVudCBhbGwgbWFwIHRvIHRoZSBEYXJ0IG5hdGl2ZSBjbGFzcyBuYW1lZCBIdG1sRWxlbWVudC4KICAgICAgICAgIC8vIFRoZSBmaXJzdCBzZXQgaXMgZm9yIGVmZmVjdGl2ZSBsZWFmIG5vZGVzIGluIHRoZSBoaWVyYXJjaHksIHRoZQogICAgICAgICAgLy8gc2Vjb25kIHNldCBpcyBub24tbGVhZiBub2Rlcy4KICAgICAgICAgIC8vCiAgICAgICAgICAvLyBUaGUgdGhpcmQgcGFydCBjb250YWlucyB0aGUgSmF2YVNjcmlwdCBuYW1lcyBvZiBEYXJ0IGNsYXNzZXMgdGhhdAogICAgICAgICAgLy8gZXh0ZW5kIHRoZSBuYXRpdmUgY2xhc3MuIEhlcmUsIEZhbmN5QnV0dG9uIGV4dGVuZHMgSHRtbEVsZW1lbnQsIHNvCiAgICAgICAgICAvLyB0aGUgcnVudGltZSBuZWVkcyB0byBrbm93IHRoYXQgd2luZG93LkhUTUxFbGVtZW50LnByb3RvdHlwZSBpcyB0aGUKICAgICAgICAgIC8vIHByb3RvdHlwZSB0aGF0IG5lZWRzIHRvIGJlIGV4dGVuZGVkIGluIGNyZWF0aW5nIHRoZSBjdXN0b20gZWxlbWVudC4KICAgICAgICAgIC8vCiAgICAgICAgICAvLyBUaGUgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBidWlsZCB0YWJsZXMgcmVmZXJlbmNlZCBieQogICAgICAgICAgLy8gZ2V0TmF0aXZlSW50ZXJjZXB0b3IgYW5kIGN1c3RvbSBlbGVtZW50IHN1cHBvcnQuCiAgICAgICAgICB7CiAgICAgICAgICAgIHZhciBuYXRpdmVTcGVjID0gI2luZm8uc3BsaXQoIjsiKTsKICAgICAgICAgICAgaWYgKG5hdGl2ZVNwZWNbMF0pIHsKICAgICAgICAgICAgICB2YXIgdGFncyA9IG5hdGl2ZVNwZWNbMF0uc3BsaXQoInwiKTsKICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICNpbnRlcmNlcHRvcnNCeVRhZ0FjY2Vzc1t0YWdzW2ldXSA9ICNjb25zdHJ1Y3RvcjsKICAgICAgICAgICAgICAgICNsZWFmVGFnc0FjY2Vzc1t0YWdzW2ldXSA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuYXRpdmVTcGVjWzFdKSB7CiAgICAgICAgICAgICAgdGFncyA9IG5hdGl2ZVNwZWNbMV0uc3BsaXQoInwiKTsKICAgICAgICAgICAgICBpZiAoI2FsbG93TmF0aXZlc1N1YmNsYXNzaW5nKSB7CiAgICAgICAgICAgICAgICBpZiAobmF0aXZlU3BlY1syXSkgewogICAgICAgICAgICAgICAgICB2YXIgc3ViY2xhc3NlcyA9IG5hdGl2ZVNwZWNbMl0uc3BsaXQoInwiKTsKICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdWJjbGFzc2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN1YmNsYXNzID0gI3N1YmNsYXNzUmVhZDsKICAgICAgICAgICAgICAgICAgICBzdWJjbGFzcy4jbmF0aXZlU3VwZXJjbGFzc1RhZ05hbWUgPSB0YWdzWzBdOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGFncy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAjaW50ZXJjZXB0b3JzQnlUYWdBY2Nlc3NbdGFnc1tpXV0gPSAjY29uc3RydWN0b3I7CiAgICAgICAgICAgICAgICAgICNsZWFmVGFnc0FjY2Vzc1t0YWdzW2ldXSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgbmF0aXZlU3VwZXJjbGFzc1RhZ05hbWVhbGxvd05hdGl2ZXNTdWJjbGFzc2luZ2RhcnQyanMuanNfZW1pdHRlci5wYXJhbWV0ZXJfc3R1Yl9nZW5lcmF0b3JQYXJhbWV0ZXJTdHViR2VuZXJhdG9yZW1wdHlTZWxlY3RvclNldG5lZWRzU3VwZXJHZXR0ZXJnZW5lcmF0ZVBhcmFtZXRlclN0dWJleHRyYUFyZ3VtZW50Q291bnR0YXJnZXRBcmd1bWVudHNvcHRpb25hbFBhcmFtZXRlclN0YXJ0cmV0dXJuICMuIy5jYWxsKHRoaXMsICMpO3JldHVybiB0aGlzLiMoIyk7cmV0dXJuICMoIylmdW5jdGlvbigjKSB7ICM7IH1nZW5lcmF0ZVBhcmFtZXRlclN0dWJzY2FuVGVhck9mZmNhbkJlQXBwbGllZGxpdmVTZWxlY3RvcnNtZW1iZXJUeXBlUGFyYW1ldGVyc3JlbmFtZWRDYWxsU2VsZWN0b3Jzc3R1YlNlbGVjdG9yc25hbWVkU2VsZWN0b3JjbG9zdXJlU2VsZWN0b3JyZW5hbWVkU2VsZWN0b3JyZW5hbWVkU2VsZWN0b3JXaXRoVHlwZUFyZ3VtZW50c2RhcnQyanMuanNfZW1pdHRlci5ydW50aW1lX3R5cGVfZ2VuZXJhdG9yanNJbnRlcm9wQW5hbHlzaXNGdW5jdGlvblR5cGVTaWduYXR1cmVFbWl0dGVyY2xhc3NGdW5jdGlvblR5cGVUeXBlVGVzdFR5cGVUZXN0c2lzVGVzdFR5cGVUZXN0UHJvcGVydGllc2Z1bmN0aW9uVHlwZUluZGV4X3Byb3BlcnRpZXNhZGRJc1Rlc3R0eXBlVGVzdHNhZGRTdWJzdGl0dXRpb25hZGRTaWduYXR1cmVmb3JFYWNoUHJvcGVydHloYW5kbGVUeXBlVGVzdHR5cGVUZXN0UnVudGltZVR5cGVHZW5lcmF0b3Jfb3V0cHV0VW5pdERhdGFlbWl0dGVyVGFza19ydGlDaGVja3Nfb3V0cHV0VW5pdFZpc2l0b3JnZW5lcmF0ZUlzVGVzdHNzdG9yZUZ1bmN0aW9uVHlwZUluTWV0YWRhdGFnZW5lcmF0ZUZ1bmN0aW9uVHlwZVNpZ25hdHVyZWlzVHlwZUNvbnRhaW5lZEluZ2VuZXJhdGVUeXBlQ2hlY2tfZ2VuZXJhdGVJc1Rlc3RzT250aGlzQWNjZXNzZW1pdFR5cGVDaGVja2dlbmVyYXRlZF9UeXBlQ29udGFpbmVkSW5PdXRwdXRVbml0VmlzaXRvcmRhcnQyanMuanNfZW1pdHRlci50eXBlX3Rlc3RfcmVnaXN0cnlfcnRpTmVlZGVkQ2xhc3Nlc1J1bnRpbWVUeXBlc0NoZWNrcyBoYXMgbm90IGJlZW4gY29tcHV0ZWQgeWV0LnJ0aU5lZWRlZENsYXNzZXMgaGFzIG5vdCBiZWVuIGNvbXB1dGVkIHlldC5saXZlTWVtYmVyc2FkZENsYXNzV2l0aFN1cGVyY2xhc3Nlc2FkZENsYXNzZXNXaXRoU3VwZXJjbGFzc2Vzc3NhLnRyYWNlcl9IVHJhY2VyJkhHcmFwaFZpc2l0b3ImVHJhY2VyVXRpbGFkZFByZWRlY2Vzc29ycyAiQmFkZFN1Y2Nlc3NvcnNhZGRJbnN0cnVjdGlvbnNzdHJpbmdpZmllcmJjaWNoYW5nZXN0ZW1wb3JhcnlJZGluc3RydWN0aW9uU3RyaW5nIDx8QApmcm9tX2JjaXRvX2JjaXhoYW5kbGVyc3BoaUlkaW5wdXRJZHMgWyBISVJISW5zdHJ1Y3Rpb25TdHJpbmdpZmllckxhdGVWYWx1ZTogQm9vbGlmeTogb3Bjb2RlQWJzOiBBZGRCaXRBbmRCaXROb3Q6IEJpdE9yQml0WG9ybGVuZ3RoSWRpbmRleElkQm91bmRzQ2hlY2s6IGxlbmd0aCA9ICwgaW5kZXggPSBCcmVhayA6IChCQnJlYWs6IChCQ29uc3RhbnQ6IENvbnRpbnVlIENvbnRpbnVlOiAoQmhhbmRsZUdlbmVyaWNJbnZva2VDcmVhdGVDcmVhdGVCb3hEaXZpZGVFeGl0RmllbGRHZXQ6IE51bGxDaGVjayBGaWVsZEdldDogdmFsdWVJZEZpZWxkU2V0OiByZWNlaXZlcklkUmVhZE1vZGlmeVdyaXRlOiA9IEdldExlbmd0aDogbG9jYWxOYW1lTG9jYWxHZXQ6IExvY2FsU2V0OiBHb3RvOiAoQkdyZWF0ZXJHcmVhdGVyRXF1YWxJZGVudGl0eWNvbmRpdGlvbklkSWYgKCk6IChCKSBlbHNlIChCaW52b2tlVHlwZWZ1bmN0aW9uTmFtZWFyZ3VtZW50c1N0cmluZ0luZGV4OiBJbmRleEFzc2lnbjogXSA9IEludGVyY2VwdG9yIChJbnRlcmNlcHRvcjogaGFuZGxlSW52b2tlRHluYW1pY0ludm9rZUNsb3N1cmVJbnZva2VEeW5hbWljTWV0aG9kSW52b2tlRHluYW1pY0dldHRlckludm9rZUR5bmFtaWNTZXR0ZXJJbnZva2VTdGF0aWNJbnZva2VTdXBlckludm9rZUNvbnN0cnVjdG9yQm9keUludm9rZUdlbmVyYXRvckJvZHlGb3JlaWduQ29kZTogTGVzc0xlc3NFcXVhbGVsZW1lbnRzU3RyaW5nTGl0ZXJhbExpc3Q6IFtib2R5QmxvY2tMb29wQnJhbmNoICgpIHRoZW4gKEJNdWx0aXBseU5lZ2F0ZTogTm90OiBQYXJhbWV0ZXJWYWx1ZTogTG9jYWxWYWx1ZTogUGhpOiBSZWY6IFJldHVybjogU2hpZnRMZWZ0U2hpZnRSaWdodFN0YXRpYzogTGF6eVN0YXRpYzogT25lU2hvdEludGVyY2VwdG9yU3RhdGljU3RvcmU6IGxlZnRJZHJpZ2h0SWRTdHJpbmdDb25jYXQ6ICArIFN0cmluZ2lmeTogU3VidHJhY3RTd2l0Y2g6ICg6IEJkZWZhdWx0OiBCVGhyb3c6IFRocm93RXhwcmVzc2lvbjogVHJ1bmNhdGluZ0RpdmlkZVJlbWFpbmRlckV4aXRUcnlUcnk6ICwgQ2F0Y2g6ICwgRmluYWxseTogSm9pbjogQklzOiBJc1ZpYUludGVyY2VwdG9yOiBfdHlwZUNvbnZlcnNpb25LaW5kVHlwZUNvbnZlcnNpb246IENIRUNLRURfTU9ERUFSR1VNRU5UQ0FTVEJPT0xFQU5fQ09OVkVSU0lPTlJFQ0VJVkVSVHlwZUtub3duOiAgd2l0bmVzc2VkIGJ5IFJhbmdlQ29udmVyc2lvbjogVHlwZUluZm9SZWFkUmF3OiBUeXBlSW5mb1JlYWRWYXJpYWJsZTogVHlwZUluZm9FeHByZXNzaW9uOiBBd2FpdDogZGFydDJqcy5fZW1iZWRkZWRfbmFtZXNHRVRURVJfUFJFRklYSnNHZXROYW1lLkdFVFRFUl9QUkVGSVhTRVRURVJfUFJFRklYSnNHZXROYW1lLlNFVFRFUl9QUkVGSVhDQUxMX1BSRUZJWEpzR2V0TmFtZS5DQUxMX1BSRUZJWENBTExfUFJFRklYMEpzR2V0TmFtZS5DQUxMX1BSRUZJWDBDQUxMX1BSRUZJWDFKc0dldE5hbWUuQ0FMTF9QUkVGSVgxQ0FMTF9QUkVGSVgySnNHZXROYW1lLkNBTExfUFJFRklYMkNBTExfUFJFRklYM0pzR2V0TmFtZS5DQUxMX1BSRUZJWDNDQUxMX1BSRUZJWDRKc0dldE5hbWUuQ0FMTF9QUkVGSVg0Q0FMTF9QUkVGSVg1SnNHZXROYW1lLkNBTExfUFJFRklYNUNBTExfQ0FUQ0hfQUxMSnNHZXROYW1lLkNBTExfQ0FUQ0hfQUxMUkVGTEVDVEFCTEVKc0dldE5hbWUuUkVGTEVDVEFCTEVDTEFTU19ERVNDUklQVE9SX1BST1BFUlRZSnNHZXROYW1lLkNMQVNTX0RFU0NSSVBUT1JfUFJPUEVSVFlSRVFVSVJFRF9QQVJBTUVURVJfUFJPUEVSVFlKc0dldE5hbWUuUkVRVUlSRURfUEFSQU1FVEVSX1BST1BFUlRZREVGQVVMVF9WQUxVRVNfUFJPUEVSVFlKc0dldE5hbWUuREVGQVVMVF9WQUxVRVNfUFJPUEVSVFlDQUxMX05BTUVfUFJPUEVSVFlKc0dldE5hbWUuQ0FMTF9OQU1FX1BST1BFUlRZREVGRVJSRURfQUNUSU9OX1BST1BFUlRZSnNHZXROYW1lLkRFRkVSUkVEX0FDVElPTl9QUk9QRVJUWU9QRVJBVE9SX0FTX1BSRUZJWEpzR2V0TmFtZS5PUEVSQVRPUl9BU19QUkVGSVhTSUdOQVRVUkVfTkFNRUpzR2V0TmFtZS5TSUdOQVRVUkVfTkFNRVJUSV9OQU1FSnNHZXROYW1lLlJUSV9OQU1FVFlQRURFRl9UQUdKc0dldE5hbWUuVFlQRURFRl9UQUdGVU5DVElPTl9UWVBFX1RBR0pzR2V0TmFtZS5GVU5DVElPTl9UWVBFX1RBR0ZVTkNUSU9OX1RZUEVfR0VORVJJQ19CT1VORFNfVEFHSnNHZXROYW1lLkZVTkNUSU9OX1RZUEVfR0VORVJJQ19CT1VORFNfVEFHRlVOQ1RJT05fVFlQRV9WT0lEX1JFVFVSTl9UQUdKc0dldE5hbWUuRlVOQ1RJT05fVFlQRV9WT0lEX1JFVFVSTl9UQUdGVU5DVElPTl9UWVBFX1JFVFVSTl9UWVBFX1RBR0pzR2V0TmFtZS5GVU5DVElPTl9UWVBFX1JFVFVSTl9UWVBFX1RBR0ZVTkNUSU9OX1RZUEVfUkVRVUlSRURfUEFSQU1FVEVSU19UQUdKc0dldE5hbWUuRlVOQ1RJT05fVFlQRV9SRVFVSVJFRF9QQVJBTUVURVJTX1RBR0ZVTkNUSU9OX1RZUEVfT1BUSU9OQUxfUEFSQU1FVEVSU19UQUdKc0dldE5hbWUuRlVOQ1RJT05fVFlQRV9PUFRJT05BTF9QQVJBTUVURVJTX1RBR0ZVTkNUSU9OX1RZUEVfTkFNRURfUEFSQU1FVEVSU19UQUdKc0dldE5hbWUuRlVOQ1RJT05fVFlQRV9OQU1FRF9QQVJBTUVURVJTX1RBR0ZVVFVSRV9PUl9UQUdKc0dldE5hbWUuRlVUVVJFX09SX1RBR0ZVVFVSRV9PUl9UWVBFX0FSR1VNRU5UX1RBR0pzR2V0TmFtZS5GVVRVUkVfT1JfVFlQRV9BUkdVTUVOVF9UQUdGVVRVUkVfQ0xBU1NfVFlQRV9OQU1FSnNHZXROYW1lLkZVVFVSRV9DTEFTU19UWVBFX05BTUVJU19JTkRFWEFCTEVfRklFTERfTkFNRUpzR2V0TmFtZS5JU19JTkRFWEFCTEVfRklFTERfTkFNRU5VTExfQ0xBU1NfVFlQRV9OQU1FSnNHZXROYW1lLk5VTExfQ0xBU1NfVFlQRV9OQU1FT0JKRUNUX0NMQVNTX1RZUEVfTkFNRUpzR2V0TmFtZS5PQkpFQ1RfQ0xBU1NfVFlQRV9OQU1FRlVOQ1RJT05fQ0xBU1NfVFlQRV9OQU1FSnNHZXROYW1lLkZVTkNUSU9OX0NMQVNTX1RZUEVfTkFNRWRhcnRPYmplY3RDb25zdHJ1Y3RvckpzQnVpbHRpbi5kYXJ0T2JqZWN0Q29uc3RydWN0b3Jpc0NoZWNrUHJvcGVydHlUb0pzQ29uc3RydWN0b3JOYW1lSnNCdWlsdGluLmlzQ2hlY2tQcm9wZXJ0eVRvSnNDb25zdHJ1Y3Rvck5hbWVKc0J1aWx0aW4uaXNGdW5jdGlvblR5cGVpc0Z1dHVyZU9yVHlwZUpzQnVpbHRpbi5pc0Z1dHVyZU9yVHlwZWlzVm9pZFR5cGVKc0J1aWx0aW4uaXNWb2lkVHlwZWlzRHluYW1pY1R5cGVKc0J1aWx0aW4uaXNEeW5hbWljVHlwZWlzSnNJbnRlcm9wVHlwZUFyZ3VtZW50SnNCdWlsdGluLmlzSnNJbnRlcm9wVHlwZUFyZ3VtZW50cmF3UnRpVG9Kc0NvbnN0cnVjdG9yTmFtZUpzQnVpbHRpbi5yYXdSdGlUb0pzQ29uc3RydWN0b3JOYW1lcmF3UnVudGltZVR5cGVKc0J1aWx0aW4ucmF3UnVudGltZVR5cGVKc0J1aWx0aW4uaXNTdWJ0eXBlaXNHaXZlblR5cGVSdGlKc0J1aWx0aW4uaXNHaXZlblR5cGVSdGlKc0J1aWx0aW4uZ2V0TWV0YWRhdGFKc0J1aWx0aW4uZ2V0VHlwZVRZUEVERUZfUFJFRElDQVRFX1BST1BFUlRZX05BTUUkJGlzVHlwZWRlZlRZUEVERUZfVFlQRV9QUk9QRVJUWV9OQU1FJHR5cGVkZWZUeXBlTkFUSVZFX1NVUEVSQ0xBU1NfVEFHX05BTUUkbmF0aXZlU3VwZXJjbGFzc1RhZ1NUQVRJQ19GVU5DVElPTl9OQU1FX1BST1BFUlRZX05BTUUkc3RhdGljX25hbWVNRVRBREFUQVRZUEVTR0VUX1RZUEVfRlJPTV9OQU1FZ2V0VHlwZUZyb21OYW1lTUFOR0xFRF9HTE9CQUxfTkFNRVNtYW5nbGVkR2xvYmFsTmFtZXNNQU5HTEVEX05BTUVTbWFuZ2xlZE5hbWVzSU5URVJDRVBUT1JTX0JZX1RBR2ludGVyY2VwdG9yc0J5VGFnTEVBRl9UQUdTR0VUX0lTT0xBVEVfVEFHSVNPTEFURV9UQUdESVNQQVRDSF9QUk9QRVJUWV9OQU1FVFlQRV9UT19JTlRFUkNFUFRPUl9NQVB0eXBlVG9JbnRlcmNlcHRvck1hcENVUlJFTlRfU0NSSVBUREVGRVJSRURfTElCUkFSWV9QQVJUU2RlZmVycmVkTGlicmFyeVBhcnRzREVGRVJSRURfUEFSVF9VUklTZGVmZXJyZWRQYXJ0VXJpc0RFRkVSUkVEX1BBUlRfSEFTSEVTZGVmZXJyZWRQYXJ0SGFzaGVzSU5JVElBTElaRV9MT0FERURfSFVOS2luaXRpYWxpemVMb2FkZWRIdW5rSVNfSFVOS19MT0FERURpc0h1bmtMb2FkZWRJU19IVU5LX0lOSVRJQUxJWkVEaXNIdW5rSW5pdGlhbGl6ZWRERUZFUlJFRF9JTklUSUFMSVpFRGRlZmVycmVkSW5pdGlhbGl6ZWRQUkVDT01QSUxFRHByZWNvbXBpbGVkRklOSVNIRURfQ0xBU1NFU2ZpbmlzaGVkQ2xhc3Nlc0FMTF9DTEFTU0VTYWxsQ2xhc3Nlc1RZUEVfSU5GT1JNQVRJT05TVEFUSUNTc3RhdGljc0xJQlJBUklFU0xBWklFU2xhemllc2RhcnQyanMuc291cmNlX2luZm9ybWF0aW9uLnBvc2l0aW9uUG9zaXRpb25Tb3VyY2VJbmZvcm1hdGlvbl9jb21wdXRlVGV4dHVyaVRleHQtW0Fic3RyYWN0UG9zaXRpb25Tb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5U291cmNlTWFwcGVkTWFya2VyQ29kZVBvc2l0aW9uZ2V0UG9zaXRpb25Db2RlUG9zaXRpb24oc3RhcnQ9ZW5kPSxjbG9zaW5nPUNvZGVQb3NpdGlvbk1hcENvZGVQb3NpdGlvblJlY29yZGVyX2NvZGVQb3NpdGlvbk1hcHJlZ2lzdGVyUG9zaXRpb25zcmVnaXN0ZXJDb2RlUG9zaXRpb25jb2RlUG9zaXRpb25Tb3VyY2VQb3NpdGlvbktpbmRTVEFSVFNvdXJjZVBvc2l0aW9uS2luZC5TVEFSVElOTkVSU291cmNlUG9zaXRpb25LaW5kLklOTkVSQ29kZVBvc2l0aW9uS2luZENvZGVQb3NpdGlvbktpbmQuU1RBUlRDTE9TSU5HQ29kZVBvc2l0aW9uS2luZC5DTE9TSU5HRU5EQ29kZVBvc2l0aW9uS2luZC5FTkRQb3NpdGlvblNvdXJjZUluZm9ybWF0aW9uUHJvY2Vzc29ydjJjb2RlUG9zaXRpb25SZWNvcmRlcmNvZGVQb3NpdGlvbk1hcHRyYWNlTGlzdGVuZXJzaW5saW5pbmdMaXN0ZW5lcmNvdmVyYWdlc291cmNlTWFwcGVyTm9kZVNvdXJjZUluZm9ybWF0aW9uTm9kZVRvU291cmNlSW5mb3JtYXRpb25NaXhpbmNvbXB1dGVTb3VyY2VJbmZvcm1hdGlvbl9JbmxpbmluZ1RyYWNlTGlzdGVuZXImVHJhY2VMaXN0ZW5lciZOb2RlVG9Tb3VyY2VJbmZvcm1hdGlvbk1peGluSW5saW5pbmdUcmFjZUxpc3RlbmVyX2ZyYW1lc29uU3RlcGxhc3RJbmxpbmluZ0NvbnRleHRuZXdJbmxpbmluZ0NvbnRleHRwb3BDb3VudHB1c2hlc19Qb3NpdGlvblRyYWNlTGlzdGVuZXImVHJhY2VMaXN0ZW5lciZOb2RlVG9Tb3VyY2VJbmZvcm1hdGlvbk1peGluUG9zaXRpb25UcmFjZUxpc3RlbmVycmVnaXN0ZXJQb3NpdGlvbnNvdXJjZVBvc2l0aW9uS2luZGNhbGxQb3NpdGlvbkNhbGxQb3NpdGlvbmNvZGVQb3NpdGlvbktpbmRnZXRTZW1hbnRpY1Bvc2l0aW9uRm9yQ2FsbHB1cmVBY2Nlc3N0YXJnZXRBY2Nlc3NVbmV4cGVjdGVkIHByb3BlcnR5IGFjY2VzcyBPZmZzZXRzdGF0ZW1lbnRPZmZzZXRzdWJleHByZXNzaW9uT2Zmc2V0bGVmdFRvUmlnaHRPZmZzZXRPZmZzZXRbc3RhdGVtZW50T2Zmc2V0PWxlZnRUb1JpZ2h0T2Zmc2V0PXN1YmV4cHJlc3Npb25PZmZzZXQ9QnJhbmNoS2luZENPTkRJVElPTkJyYW5jaEtpbmQuQ09ORElUSU9OTE9PUEJyYW5jaEtpbmQuTE9PUEJyYW5jaEtpbmQuQ0FUQ0hCcmFuY2hLaW5kLkZJTkFMTFlCcmFuY2hLaW5kLkNBU0VTdGVwS2luZEZVTl9FTlRSWVN0ZXBLaW5kLkZVTl9FTlRSWUZVTl9FWElUU3RlcEtpbmQuRlVOX0VYSVRTdGVwS2luZC5DQUxMU3RlcEtpbmQuTkVXQUNDRVNTU3RlcEtpbmQuQUNDRVNTU3RlcEtpbmQuUkVUVVJOU3RlcEtpbmQuQlJFQUtTdGVwS2luZC5DT05USU5VRVN0ZXBLaW5kLlRIUk9XRVhQUkVTU0lPTl9TVEFURU1FTlRTdGVwS2luZC5FWFBSRVNTSU9OX1NUQVRFTUVOVElGX0NPTkRJVElPTlN0ZXBLaW5kLklGX0NPTkRJVElPTkZPUl9JTklUSUFMSVpFUlN0ZXBLaW5kLkZPUl9JTklUSUFMSVpFUkZPUl9DT05ESVRJT05TdGVwS2luZC5GT1JfQ09ORElUSU9ORk9SX1VQREFURVN0ZXBLaW5kLkZPUl9VUERBVEVXSElMRV9DT05ESVRJT05TdGVwS2luZC5XSElMRV9DT05ESVRJT05ET19DT05ESVRJT05TdGVwS2luZC5ET19DT05ESVRJT05TV0lUQ0hfRVhQUkVTU0lPTlN0ZXBLaW5kLlNXSVRDSF9FWFBSRVNTSU9OTk9fSU5GT1N0ZXBLaW5kLk5PX0lORk9UcmFjZUxpc3RlbmVyb25TdGFydG9uRW5kcHVzaEJyYW5jaHBvcEJyYW5jaEphdmFTY3JpcHRUcmFjZXJjb2RlUG9zaXRpb25zbGlzdGVuZXJzb2Zmc2V0UG9zaXRpb25hY3RpdmVub3RpZnlTdGFydG5vdGlmeUVuZG5vdGlmeVB1c2hCcmFuY2hub3RpZnlQb3BCcmFuY2hub3RpZnlTdGVwZ2V0U3ludGF4T2Zmc2V0Z2V0T2Zmc2V0Rm9yTm9kZW5vZGVMaXN0X2hhbmRsZUZ1bmN0aW9uYWN0aXZlQmVmb3JlZW50cnlPZmZzZXRleGl0T2Zmc2V0dmlzaXRTdWJleHByZXNzaW9ub2xkU3RlcHNvbGRQb3NpdGlvbnBvc2l0aW9uTm9kZWNhbGxPZmZzZXRDb3ZlcmFnZV9ub2Rlc1dpdGhJbmZvX25vZGVzV2l0aEluZm9Db3VudF9ub2Rlc1dpdGhvdXRJbmZvX25vZGVzV2l0aG91dEluZm9Db3VudF9ub2Rlc1dpdGhvdXRJbmZvQ291bnRCeVR5cGVfbm9kZXNXaXRob3V0T2Zmc2V0X25vZGVzV2l0aG91dE9mZnNldENvdW50cmVnaXN0ZXJOb2RlV2l0aEluZm9yZWdpc3Rlck5vZGVXaXRob3V0SW5mb3JlZ2lzdGVyTm9kZXNXaXRob3V0T2Zmc2V0Y29sbGFwc2VnZXRDb3ZlcmFnZVJlcG9ydCUpIG5vZGVzIHdpdGggaW5mby5ObyBub2Rlcy4gbm9kZSB3aXRob3V0IG9mZnNldC4KTm9kZXMgd2l0aG91dCBpbmZvICgpIGJ5IHJ1bnRpbWUgdHlwZTpfQ292ZXJhZ2VMaXN0ZW5lciZUcmFjZUxpc3RlbmVyJk5vZGVUb1NvdXJjZUluZm9ybWF0aW9uTWl4aW5Db3ZlcmFnZUxpc3RlbmVyQ29kZVBvc2l0aW9uQ292ZXJhZ2VnZXRTb3VyY2VMb2NhdGlvbkhhc0NhcHR1cmVkUGxhY2Vob2xkZXJzZW5jbG9zaW5nRnVuY3Rpb25zU2lkZUVmZmVjdHNWaXNpdG9yVGhyb3dCZWhhdmlvclZpc2l0b3JzZXF1ZW5jZV9pc0ZpcnN0SW50ZXJwb2xhdGVkUHJvcGVydHlTdGF0aWNUeXBlUHJvdmlkZXJkYXJ0MmpzLnRhcmdldF9jaGVja3NkeW5hbWljQ2hlY2tzY292YXJpYW50Q2hlY2tzX2NoZWNrT3RoZXJQYXJhbWV0ZXJzX2NoZWNrQ292YXJpYW50UGFyYW1ldGVyc19jaGVja1R5cGVQYXJhbWV0ZXJzR3JhcGhCdWlsZGVyX0p1bXBIYW5kbGVyRW50cnlqdW1wSW5zdHJ1Y3Rpb25KdW1wSGFuZGxlcmhhc0FueUNvbnRpbnVlTnVsbEp1bXBIYW5kbGVyTnVsbEp1bXBIYW5kbGVyLmdlbmVyYXRlQnJlYWsgc2hvdWxkIG5vdCBiZSBjYWxsZWQuTnVsbEp1bXBIYW5kbGVyLmdlbmVyYXRlQ29udGludWUgc2hvdWxkIG5vdCBiZSBjYWxsZWQuVGFyZ2V0SnVtcEhhbmRsZXJqdW1wc2NvbnRpbnVlSW5zdHJ1Y3Rpb25Td2l0Y2hDYXNlSnVtcEhhbmRsZXJpc0NvbnRpbnVlVG9Td2l0Y2hDYXNlS2VybmVsU3RyaW5nQnVpbGRlclVuZXhwZWN0ZWQgbm9kZTogY29uY2F0cmVkaXJlY3Rpb25NYXBwaW5ndHlwZVZhcmlhYmxlTG9jYWxzY2FjaGVkVHlwZU9mVGhpc2NhY2hlZFR5cGVzT2ZDYXB0dXJlZFZhcmlhYmxlc2FjdGl2YXRpb25WYXJpYWJsZXNyZWRpcmVjdEVsZW1lbnRpc1N0b3JlZEluQ2xvc3VyZUZpZWxkY3JlYXRlQm94akZyb21pc1BhcmFtZXRlcnVwZGF0ZUNhcHR1cmVCb3hjdXJyZW50Qm94dG9CZUNvcGllZEVsZW1lbnRzb2xkQm94bmV3Qm94Ym94ZWRWYXJpYWJsZW9sZFZhbHVlZ2V0VHlwZU9mVGhpc2lzTmF0aXZlVXBncmFkZUZhY3Rvcnlpc0FjY2Vzc2VkRGlyZWN0bHlyZWRpcmVjdFRhcmdldF9pc1VzZWRJblRyeU9yR2VuZXJhdG9yUnVudGltZSB0eXBlIGluZm9ybWF0aW9uIG5vdCBhdmFpbGFibGUgZm9yIENhbm5vdCBmaW5kIHZhbHVlIGdldFR5cGVPZkNhcHR1cmVkVmFyaWFibGVsb2NhbEJveGxvY2FsVmFsdWVnZXRMb2NhbExvY2FsICBpcyBzdG9yZWQgaW4gYSBjbG9zdXJlIGZpZWxkLmxvb3BFbnRyeXNhdmVkRGlyZWN0TG9jYWxzZW50ZXJMb29wVXBkYXRlc3Bvc3RMb29wRGVmaW5pdGlvbm1lcmdlV2l0aG90aGVyTG9jYWxzam9pbmVkTG9jYWxzbWluZWxvY2Fsc0hhbmRsZXJzdGhpc1ZhbHVlU3ludGhldGljTG9jYWxfbmV4dEhhc2hDb2RlU3ludGhldGljTG9jYWwoTG9vcEhhbmRsZXJpbml0aWFsaXplaW5pdGlhbGl6ZXJHcmFwaHN0YXJ0QmxvY2tpbml0aWFsaXplckJsb2NrYmVnaW5Cb2R5QmxvY2t1cGRhdGVHcmFwaHVwZGF0ZUJsb2NrdXBkYXRlRW5kQmxvY2tsb29wS2luZGxhYmVsR3JhcGhsYWJlbEluZm9wcmV2aW91c0Jsb2NrYnJhbmNoRXhpdEJsb2NrbG9vcEV4aXRCbG9ja0tlcm5lbExvb3BIYW5kbGVyX0tlcm5lbExvb3BUeXBlVmlzaXRvclNzYUJyYW5jaHN0YXJ0TG9jYWxzZXhpdExvY2Fsc1NzYUJyYW5jaEJ1aWxkZXJkaWFnbm9zdGljTm9kZWNoZWNrTm90QWJvcnRlZGFib3J0ZWQgY29udHJvbCBmbG93Y29uZGl0aW9uQnJhbmNoc3RhcnRCcmFuY2hjb25kaXRpb25CcmFuY2hMb2NhbHNDYW5CZVJldXNlZG1lcmdlTG9jYWxzbWF5UmV1c2VGcm9tTG9jYWxzZnJvbUJyYW5jaHRvQnJhbmNoZnJvbUxvY2Fsc2J1aWxkQnJhbmNodmlzaXRCcmFuY2hqb2luQnJhbmNoX2hhbmRsZURpYW1vbmRCcmFuY2hoYW5kbGVJZk51bGxsZWZ0RXhwcmVzc2lvbmJvb2xpZmllZExlZnRib29saWZpZWRSaWdodG5vdElzQW5kdGhlblZhbHVlZWxzZVZhbHVlY29uZGl0aW9uU3RhcnRCbG9ja2NvbmRpdGlvbkdyYXBoU3dpdGNoQ29udGludWVBbmFseXNpc2NvbnRhaW5zQ29udGludWVzd2l0Y2hDYXNlQm9keWNvbnRpbnVlU3RtdHRyeUZpbmFsbHlTdGF0ZW1lbnQgdHlwZSAgbm90IGhhbmRsZWQgaW4gQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3NDbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcy5ub25lQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MucHJvcGVydHlDbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcy5wYXJhbWV0ZXJpbnN0YW5jZUZpZWxkQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MuaW5zdGFuY2VGaWVsZF90cnVzdFR5cGVfY2hlY2tUeXBlcmVhZEFzUHJvcGVydHlyZWFkVHlwZVZhcmlhYmxlcmVhZEFzUGFyYW1ldGVyVW5leHBlY3RlZCB0eXBlIHZhcmlhYmxlIGluIHN0YXRpYyBjb250ZXh0LlVuZXhwZWN0ZWQgdHlwZSB2YXJpYWJsZSBhY2Nlc3M6IHJlZmluZWRNYXNrSXJUb0VsZW1lbnRNYXBkYXJ0MmpzLmpzX21vZGVsLmVudkpQcm9ncmFtRW52X2NvbXBvbmVudHNKTGlicmFyeUVudmxpYnJhcnktZW52X2NsYXNzTWFwX21lbWJlck1hcF9zZXR0ZXJNYXBzZXR0ZXJNYXBKTGlicmFyeURhdGFpbXBvcnRDb3VudEpDbGFzc0VudktpbmRKQ2xhc3NFbnZLaW5kLm5vZGVKQ2xhc3NFbnZLaW5kLmNsb3N1cmVKQ2xhc3NFbnZLaW5kLnJlY29yZEpDbGFzc0VudlVuc3VwcG9ydGVkIEpDbGFzc0VudktpbmQgSkNsYXNzRW52SW1wbGNsYXNzLWVudl9jb25zdHJ1Y3Rvck1hcF9jb25zdHJ1Y3RvckJvZHlMaXN0UmVjb3JkRW52cmVjb3JkLWVudkNsb3N1cmVDbGFzc0VudmNsb3N1cmUtY2xhc3MtZW52SkNsYXNzRGF0YUtpbmRKQ2xhc3NEYXRhS2luZC5ub2RlSkNsYXNzRGF0YUtpbmQuY2xvc3VyZUpDbGFzc0RhdGFLaW5kLnJlY29yZEpDbGFzc0RhdGFVbmV4cGVjdGVkIEpDbGFzc0RhdGFLaW5kIEpDbGFzc0RhdGFJbXBsaXNDYWxsVHlwZUNvbXB1dGVkSk1lbWJlckRhdGFLaW5kSk1lbWJlckRhdGFLaW5kLmZ1bmN0aW9uSk1lbWJlckRhdGFLaW5kLmZpZWxkSk1lbWJlckRhdGFLaW5kLmNvbnN0cnVjdG9ySk1lbWJlckRhdGFLaW5kLmNvbnN0cnVjdG9yQm9keUpNZW1iZXJEYXRhS2luZC5zaWduYXR1cmVKTWVtYmVyRGF0YUtpbmQuZ2VuZXJhdG9yQm9keWNsb3N1cmVGdW5jdGlvbkpNZW1iZXJEYXRhS2luZC5jbG9zdXJlRnVuY3Rpb25KTWVtYmVyRGF0YUtpbmQuY2xvc3VyZUZpZWxkSk1lbWJlckRhdGFVbmV4cGVjdGVkIEpNZW1iZXJEYXRhS2luZCBKTWVtYmVyRGF0YUltcGxGdW5jdGlvbkRhdGFGdW5jdGlvbkRhdGFUeXBlVmFyaWFibGVzTWl4aW5GdW5jdGlvbkRhdGFGb3JFYWNoUGFyYW1ldGVyTWl4aW5fRnVuY3Rpb25EYXRhSW1wbCZKTWVtYmVyRGF0YUltcGwmRnVuY3Rpb25EYXRhVHlwZVZhcmlhYmxlc01peGluX0Z1bmN0aW9uRGF0YUltcGwmSk1lbWJlckRhdGFJbXBsJkZ1bmN0aW9uRGF0YVR5cGVWYXJpYWJsZXNNaXhpbiZGdW5jdGlvbkRhdGFGb3JFYWNoUGFyYW1ldGVyTWl4aW5GdW5jdGlvbkRhdGFJbXBsZnVuY3Rpb24tZGF0YVVuZXhwZWN0ZWQgbWVtYmVyIG5vZGUgU2lnbmF0dXJlRnVuY3Rpb25EYXRhc2lnbmF0dXJlLWZ1bmN0aW9uLWRhdGFTaWduYXR1cmVGdW5jdGlvbkRhdGEuZ2V0RnVuY3Rpb25UeXBlU2lnbmF0dXJlRGF0YS5mb3JFYWNoUGFyYW1ldGVyRGVsZWdhdGVkRnVuY3Rpb25EYXRhYmFzZURhdGFHZW5lcmF0b3JCb2R5RnVuY3Rpb25EYXRhZ2VuZXJhdG9yLWJvZHktZGF0YUpDb25zdHJ1Y3RvckRhdGFKQ29uc3RydWN0b3JEYXRhSW1wbGNvbnN0cnVjdG9yLWRhdGFfY29uc3RhbnRDb25zdHJ1Y3RvcmNvbXB1dGVDb25zdGFudENvbnN0cnVjdG9yVW5leHBlY3RlZCBjb25zdHJ1Y3RvciBDb25zdHJ1Y3RvckRhdGFJbXBsLl9nZXRDb25zdHJ1Y3RvckNvbnN0YW50Q29uc3RydWN0b3JCb2R5RGF0YUltcGxjb25zdHJ1Y3Rvci1ib2R5LWRhdGFKRmllbGREYXRhSkZpZWxkRGF0YUltcGxmaWVsZC1kYXRhX2NvbnN0YW50RXhwcmVzc2lvbkZpZWxkRGF0YUltcGwuZ2V0RmllbGRDb25zdGFudEpUeXBlZGVmRGF0YUpUeXBlVmFyaWFibGVEYXRhX2RlZmF1bHRUeXBlb3JkZXJlZF90eXBlc2V0T3JkZXJlZFR5cGVTZXRvcmRlcmVkLXR5cGUtc2V0X2xldmVsc3R5cGVzQ291bnR0eXBlTGlua0J1aWxkZXJsaW5rc2xldmVsQ291bnRsZXZlbHN0eXBlTGlzdGxldmVsTGlzdENhbm5vdCBleHRlbmQgZ2VuZXJpYyBjbGFzcyAgdXNpbmcgT3JkZXJlZFR5cGVTZXQuZXh0ZW5kQ2xhc3NleHRlbmRlZFR5cGVzbGV2ZWxPZmZzZXRzT3JkZXJlZFR5cGVTZXRCdWlsZGVyT3JkZXJlZFR5cGVTZXRCdWlsZGVyQmFzZV9hZGRBbGxTdXBlcnR5cGVzdG9UeXBlU2V0U3VwZXJ0eXBlcyBub3QgY29tcHV0ZWQgb24gZHVyaW5nIHJlc29sdXRpb24gb2YgX2FkZEF0RGVwdGhwcmV2ZXhpc3RpbmdUeXBlSW52YWxpZCBvcmRlcmVkIHR5cGVzZXQgZm9yIENhY2hlZFN0YXRpY1R5cGVObyBzdGF0aWMgdHlwZSBmb3VuZCBmb3IgTm8gc3RhdGljIHR5cGUgY2FjaGVkIGZvciBrZXJuZWwuZGVidWdfRGVidWdQcmludGVyJlZpc2l0b3ImSW5kZW50YXRpb25fRGVidWdQcmludGVyJlZpc2l0b3ImSW5kZW50YXRpb24mVGFnZ2luZy0tdW5uYW1lZC0tS2VybmVsRGFydFR5cGVzc3VidHlwZVZpc2l0b3Jwb3RlbnRpYWxTdWJ0eXBlVmlzaXRvcktlcm5lbE9yZGVyZWRUeXBlU2V0QnVpbGRlckFic3RyYWN0VHlwZVJlbGF0aW9uTWl4aW5fS2VybmVsU3VidHlwZVZpc2l0b3ImU3VidHlwZVZpc2l0b3ImQWJzdHJhY3RUeXBlUmVsYXRpb25NaXhpbktlcm5lbFN1YnR5cGVWaXNpdG9yX19LZXJuZWxQb3RlbnRpYWxTdWJ0eXBlVmlzaXRvciZQb3RlbnRpYWxTdWJ0eXBlVmlzaXRvciZBYnN0cmFjdFR5cGVSZWxhdGlvbk1peGluX0tlcm5lbFBvdGVudGlhbFN1YnR5cGVWaXNpdG9yU3RyaW5naWZpZXJDb25zdGFudGlmaWVyZmFpbE5vZGVfaW5pdGlhbGl6ZXJMb2NhbHNfY29tcHV0ZUxpc3RfY29tcHV0ZUFyZ3VtZW50c19jb21wdXRlQ29uc3RydWN0b3JJbnZvY2F0aW9ucmVnaXN0ZXJGaWVsZFVuZXhwZWN0ZWQgaW5pdGlhbGl6ZXIgRGFydFR5cGVDb252ZXJ0ZXJjdXJyZW50RnVuY3Rpb25UeXBlUGFyYW1ldGVyc0NvbnN0YW50VmFsdWVmaWVyVW5leHBlY3RlZCB1bmV2YWx1YXRlZCBjb25zdGFudCBkYXJ0MmpzLmtlcm5lbC5lbnZtZXJnZVNvcnRLUHJvZ3JhbUVudl9hZGRMaWJyYXJpZXNfZW5zdXJlTGlicmFyeU1hcEtMaWJyYXJ5RW52X2Vuc3VyZUNsYXNzTWFwX2Vuc3VyZU1lbWJlck1hcHNVbmV4cGVjdGVkIGxpYnJhcnkgbWVtYmVyIG5vZGU6IEtMaWJyYXJ5RGF0YV9tZXRhZGF0YUtDbGFzc0VudktDbGFzc0VudkltcGxfYnVpbGRGb3J3YXJkaW5nQ29uc3RydWN0b3JzdXBlcmNsYXNzQ29uc3RydWN0b3JzdXBlckZ1bmN0aW9uY2xvbmVWYXJpYWJsZWluY2x1ZGVTdGF0aWNpbmNsdWRlTm9TdWNoTWV0aG9kRm9yd2FyZGVyc2FkZENvbnN0cnVjdG9yc21peGluTWVtYmVyQ291bnRjbG9uZVZpc2l0b3JzdXBlcmNsYXNzU3Vic3RpdHV0aW9uc3VwZXJjbGFzc0Nsb25lcmZvcndhcmRpbmdDb25zdHJ1Y3RvcktDbGFzc0RhdGFLQ2xhc3NEYXRhSW1wbEtNZW1iZXJEYXRhS01lbWJlckRhdGFJbXBsS0Z1bmN0aW9uRGF0YUtGdW5jdGlvbkRhdGFNaXhpbl9LRnVuY3Rpb25EYXRhSW1wbCZLTWVtYmVyRGF0YUltcGwmS0Z1bmN0aW9uRGF0YU1peGluS0Z1bmN0aW9uRGF0YUltcGxLQ29uc3RydWN0b3JEYXRhS0NvbnN0cnVjdG9yRGF0YUltcGxLRmllbGREYXRhS0ZpZWxkRGF0YUltcGxLVHlwZWRlZkRhdGFLVHlwZVZhcmlhYmxlRGF0YW9yZGVyQnlGaWxlT2Zmc2V0YUxvY2JMb2NhVXJpYlVyaXVyaUNvbXBhcmV1bml2ZXJzZS5mdW5jdGlvbl9zZXRjb21wdXRlTWFza19jcmVhdGVTZWxlY3Rvck1hc2tzZWxlY3Rvck1hc2tub1N1Y2hNZXRob2RNYXNrbm9TdWNoTWV0aG9kc1NlbGVjdG9yTWFza0Z1bmN0aW9uU2V0Tm9kZU1BWF9FTEVNRU5UU19JTl9MSVNUbm9TdWNoTWV0aG9kUXVlcnlGdW5jdGlvblNldE5vZGUoRnVuY3Rpb25TZXRRdWVyeUVtcHR5RnVuY3Rpb25TZXRRdWVyeTxlbXB0eT5GdWxsRnVuY3Rpb25TZXRRdWVyeV9yZWNlaXZlckltcGFjdFJlZ2lzdHJ5TWl4aW5JbXBhY3REYXRhdG9EYXRhU2lua0ltcGFjdERhdGFJbXBsY2xhc3NSZWxhdGlvbl9DYWxsU3RydWN0dXJlX1N1cGVySW5pdGlhbGl6ZXJzb3VyY2VDb25zdHJ1Y3RvcnRhcmdldENvbnN0cnVjdG9yX1N1cGVySW52b2NhdGlvbl9JbnN0YW5jZUFjY2Vzc19EeW5hbWljQWNjZXNzX0Z1bmN0aW9uSW52b2NhdGlvbl9JbnN0YW5jZUludm9jYXRpb25fRHluYW1pY0ludm9jYXRpb25fTG9jYWxGdW5jdGlvbkludm9jYXRpb25fU3RhdGljSW52b2NhdGlvbl9Db25zdHJ1Y3Rvckludm9jYXRpb25fQ29uc3RJbnN0YW50aWF0aW9uX0ZlYXR1cmVfRmVhdHVyZS5sYXp5RmllbGRfRmVhdHVyZS5sb2FkTGlicmFyeV9GZWF0dXJlLnN0YWNrVHJhY2VfRmVhdHVyZS5jYXRjaENsYXVzZV9GZWF0dXJlLnRocm93RXhwcmVzc2lvbmxvY2FsV2l0aG91dEluaXRpYWxpemVyX0ZlYXR1cmUubG9jYWxXaXRob3V0SW5pdGlhbGl6ZXJzdHJpbmdDb25jYXRlbmF0aW9uX0ZlYXR1cmUuc3RyaW5nQ29uY2F0ZW5hdGlvbl9GZWF0dXJlLmFzc2VydFdpdGhNZXNzYWdlX0ZlYXR1cmUuYXNzZXJ0V2l0aG91dE1lc3NhZ2VfRmVhdHVyZS5udWxsTGl0ZXJhbF9UeXBlVXNlX1R5cGVVc2VLaW5kX1R5cGVVc2VLaW5kLnBhcmFtZXRlckNoZWNrX1R5cGVVc2VLaW5kLmNhdGNoVHlwZV9UeXBlVXNlS2luZC5hc3luY0ZvckluX1R5cGVVc2VLaW5kLnN5bmNGb3JJbl9UeXBlVXNlS2luZC5hc0Nhc3RfVHlwZVVzZUtpbmQuaW1wbGljaXRDYXN0X1R5cGVVc2VLaW5kLmlzQ2hlY2thc3luY1N0YXJNYXJrZXJfVHlwZVVzZUtpbmQuYXN5bmNTdGFyTWFya2VyX1R5cGVVc2VLaW5kLmFzeW5jTWFya2Vyc3luY1N0YXJNYXJrZXJfVHlwZVVzZUtpbmQuc3luY1N0YXJNYXJrZXJfUmVkaXJlY3RpbmdJbml0aWFsaXplcl9UeXBlTGl0ZXJhbF9HZW5lcmljSW5zdGFudGlhdGlvbl9TdGF0aWNBY2Nlc3NfTWFwTGl0ZXJhbF9Db250YWluZXJMaXRlcmFsX1J1bnRpbWVUeXBlVXNlZnJvbnRfZW5kLmNvbnN0YW50X2V2YWx1YXRvclJlc29sdXRpb25Xb3JsZEltcGFjdEJ1aWxkZXJfS2VybmVsSW1wYWN0QnVpbGRlciZJbXBhY3RCdWlsZGVyQmFzZSZLZXJuZWxJbXBhY3RSZWdpc3RyeU1peGluX2NvbXB1dGVSZWNlaXZlckNvbnN0cmFpbnRpclR5cGVfZ2V0VHlwZUFyZ3VtZW50c3JlZ2lzdGVyRmVhdHVyZXJlZ2lzdGVyTmF0aXZlRGF0YXJlZ2lzdGVyQ29uc3RhbnRMaXRlcmFscmVnaXN0ZXJDb25zdFN5bWJvbE5hbWVkYXJ0VHlwZUFyZ3VtZW50c19oYW5kbGVFeHRyYWN0VHlwZUFyZ3VtZW50c21hdGNoZWRUeXBlcmVjZWl2ZXJEYXJ0VHlwZWFyZ3VtZW50RGFydFR5cGVmaXJzdENhc2VmaXJzdENhc2VUeXBlb3ZlcnJpZGVzRXF1YWxzS2VybmVsSW1wYWN0QnVpbGRlcl9hbm5vdGF0aW9uc0tlcm5lbEltcGFjdENvbnZlcnRlcktlcm5lbEltcGFjdFJlZ2lzdHJ5TWl4aW5PcHRpbWl6YXRpb25UZXN0TG9nX3VuY29udmVydGVkX3JlZ2lzdGVyPG51bGwtZ3VhcmQ+RmllbGRHZXRGaWVsZFNldEZpZWxkQ2FsbENvbnN0YW50RmllbGRHZXRDb25zdGFudEZpZWxkQ2FsbF9yZWdpc3RlclNwZWNpYWxpemVydW5jb252ZXJ0ZWROYW1lU3BlY2lhbGl6ZXJJbmRleEFzc2lnbkluZGV4Qml0Tm90TmVnYXRlQWJzTW9kdWxvRHluYW1pY01vZHVsb1RydW5jYXRpbmdEaXZpZGUuU2hpZnRMZWZ0LlNoaWZ0UmlnaHQuRXF1YWxzTGVzc0VxdWFsc0dyZWF0ZXJFcXVhbHNDb2RlVW5pdEF0Q29tcGFyZVRvU3Vic3RyaW5nVHJpbVBhdHRlcm5NYXRjaFJvdW5kcmVnaXN0ZXJUeXBlQ29udmVyc2lvblR5cGVDb252ZXJzaW9uT3B0aW1pemF0aW9uTG9nKE9wdGltaXphdGlvbkxvZ0VudHJ5ZmFzdGEuZmFuZ29ybmNvbmRpdGlvbkJvdW5kYXJ5Y29uZGl0aW9uTGFzdFRva2Vuc3ludGhfVmFyaWFibGVzRGVjbGFyYXRpb25EaXJlY3RpdmVDb250ZXh0SW50ZXJuYWwgZXJyb3I6IFVuZXhwZWN0ZWQgc2NyaXB0IHRhZy5EaXJlY3RpdmVTdGF0ZVVua25vd25EaXJlY3RpdmVTdGF0ZS5Vbmtub3duRGlyZWN0aXZlU3RhdGUuU2NyaXB0RGlyZWN0aXZlU3RhdGUuTGlicmFyeUltcG9ydEFuZEV4cG9ydERpcmVjdGl2ZVN0YXRlLkltcG9ydEFuZEV4cG9ydERpcmVjdGl2ZVN0YXRlLlBhcnREaXJlY3RpdmVTdGF0ZS5QYXJ0T2ZEZWNsYXJhdGlvbnNEaXJlY3RpdmVTdGF0ZS5EZWNsYXJhdGlvbnNJbnRlcm5hbCBFcnJvcjogc2hvdWxkIG5vdCBjYWxsIHBhcnNlIHNob3VsZCBpbXBsZW1lbnQgcGFyc2VmYXN0YS5wYXJzZXIubG9vcF9zdGF0ZU91dHNpZGVMb29wTG9vcFN0YXRlLk91dHNpZGVMb29wSW5zaWRlU3dpdGNoTG9vcFN0YXRlLkluc2lkZVN3aXRjaEluc2lkZUxvb3BMb29wU3RhdGUuSW5zaWRlTG9vcGZpbmFsVG9rZW52YXJUb2tlbmFmdGVyRmFjdG9yeXJlcG9ydEV4dHJhbmVvdXNNb2RpZmllckludGVybmFsIGVycm9yOiBVbmV4cGVjdGVkIHN0YXRpY09yQ292YXJpYW50ICdJbnRlcm5hbCBlcnJvcjogVW5leHBlY3RlZCB2YXJGaW5hbE9yQ29uc3QgJ3BhcnNlQWJzdHJhY3RwYXJzZUNvbnN0cGFyc2VDb3ZhcmlhbnRwYXJzZUV4dGVybmFscGFyc2VGaW5hbHBhcnNlU3RhdGljcGFyc2VWYXJJbnRlcm5hbCBFcnJvcjogVW5oYW5kbGVkIG1vZGlmaWVyOiBJbnRlcm5hbCBFcnJvcjogVW5leHBlY3RlZCB2YXJGaW5hbE9yQ29uc3Q6IEludGVybmFsIEVycm9yOiBVbmhhbmRsZWQgcmVjb3Zlcnk6IGluY2x1ZGVJZGVudGlmaWVyZXJyb3JUb2tlbnJlcGxhY2VtZW50VG9rZW5yZXBsYWNlZFRva2VuX2xhc3RUb2tlbkluQ2hhaW5Ub2tlblN0cmVhbUdob3N0V3JpdGVycmlnaHRQYXJlbm5ld0VuZEdyb3VwZmFzdGEucGFyc2VyLnR5cGVfaW5mb3BhcnNlVHlwZU5vdFZvaWRpc1NpbXBsZVR5cGVBcmd1bWVudCBpcyBub3QgYSBTaW1wbGVUeXBlQXJndW1lbnQuaXNHZW5lcmFsaXplZEZ1bmN0aW9uVHlwZWNvbXB1dGVCdWlsdGluT3JWYXJBc1R5cGVjb21wdXRlUHJlZml4ZWRUeXBlY29tcHV0ZVZvaWRHRlRjb21wdXRlTm9UeXBlR0ZUY29tcHV0ZVNpbXBsZVdpdGhUeXBlQXJndW1lbnRzY29tcHV0ZUlkZW50aWZpZXJHRlRjb21wdXRlSWRlbnRpZmllclF1ZXN0aW9uR0ZUY29tcHV0ZUNhdGNoUGFyYW1ldGVySWRlbnRpZmllckNvbnRleHRDbGFzc09yTWl4aW5JZGVudGlmaWVyQ29udGV4dENvbWJpbmF0b3JJZGVudGlmaWVyQ29udGV4dGZvbGxvd2luZ1ZhbHVlc0NvbnN0cnVjdG9yUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHRjb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHNEb3R0ZWROYW1lSWRlbnRpZmllckNvbnRleHRFbnVtRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dEVudW1WYWx1ZURlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHRFeHByZXNzaW9uSWRlbnRpZmllckNvbnRleHRGaWVsZERlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHRGaWVsZEluaXRpYWxpemVySWRlbnRpZmllckNvbnRleHRGb3JtYWxQYXJhbWV0ZXJEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0SW1wb3J0UHJlZml4SWRlbnRpZmllckNvbnRleHRMaXRlcmFsU3ltYm9sSWRlbnRpZmllckNvbnRleHRMb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dExhYmVsRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dExhYmVsUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHRMaWJyYXJ5SWRlbnRpZmllckNvbnRleHRMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dE1ldGFkYXRhUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHRNZXRob2REZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0TmFtZWRBcmd1bWVudFJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0VG9wTGV2ZWxEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0VHlwZWRlZkRlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHRUeXBlUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHRwcmVmaXhlZFR5cGVWYXJpYWJsZURlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHRjaGVja0FzeW5jQXdhaXRZaWVsZEFzSWRlbnRpZmllcmxvb2tzTGlrZVN0YXJ0T2ZOZXh0Q2xhc3NNZW1iZXJsb29rc0xpa2VTdGFydE9mTmV4dFRvcExldmVsRGVjbGFyYXRpb25fU3NhSW5zdHJ1Y3Rpb25TZWxlY3Rpb24mSEJhc2VWaXNpdG9yJkNvZGVnZW5QaGFzZVNzYUluc3RydWN0aW9uU2VsZWN0aW9uc2ltcGxlT3BfaW50ZXJjZXB0ZWR0cnlSZXBsYWNlSW50ZXJjZXB0b3JXaXRoRHVtbXlyZWNlaXZlckFyZ3VtZW50aXNNYXRjaGluZ1JlYWRub01hdGNoaW5nUmVhZHJlcGxhY2VPcHBsdXNPck1pbnVzaW5jcmVtZW50T3BybXdzaW1wbGVzaW1wbGVCaW5hcnliaXRvcG9wZXJhbmQxb3BlcmFuZDJfU3NhVHlwZUtub3duUmVtb3ZlciZIQmFzZVZpc2l0b3ImQ29kZWdlblBoYXNlU3NhVHlwZUtub3duUmVtb3Zlcl9Tc2FUcnVzdGVkQ2hlY2tSZW1vdmVyJkhCYXNlVmlzaXRvciZDb2RlZ2VuUGhhc2VTc2FUcnVzdGVkQ2hlY2tSZW1vdmVyX1NzYUFzc2lnbm1lbnRDaGFpbmluZyZIQmFzZVZpc2l0b3ImQ29kZWdlblBoYXNlU3NhQXNzaWdubWVudENoYWluaW5ndHJ5Q2hhaW5Bc3NpZ25tZW50bmV4dFNldHRlcm5leHRTdG9yZXNpbXBsZVNvdXJjZV9Tc2FJbnN0cnVjdGlvbk1lcmdlciZIQmFzZVZpc2l0b3ImQ29kZWdlblBoYXNlU3NhSW5zdHJ1Y3Rpb25NZXJnZXJleHBlY3RlZElucHV0c3B1cmVJbnB1dHNtYXJrQXNHZW5lcmF0ZUF0VXNlU2l0ZWFuYWx5emVJbnB1dHNpc0VmZmVjdGl2ZWx5UHVyZWlzQXNzaWduZWRMb2NhbGluaXRpYWxpemluZ0Fzc2lnbm1lbnRDb3VudHN1cGVyTWV0aG9kdHJ5R2VuZXJhdGVBdFVzZVNpdGVpc0Jsb2NrU2luZ2xlUHJlZGVjZXNzb3J0cnlNZXJnaW5nRXhwcmVzc2lvbnNmaW5kSW5JbnB1dHNBbmRQb3BOb25NYXRjaGluZ25leHRJbnB1dG5ld0lucHV0c25ld0NvdW50X1NzYUNvbmRpdGlvbk1lcmdlciZIR3JhcGhWaXNpdG9yJkNvZGVnZW5QaGFzZVNzYUNvbmRpdGlvbk1lcmdlcmhhc0FueVN0YXRlbWVudGlzU2FmZVRvR2VuZXJhdGVBdFVzZVNpdGVzdGFydElmdGhlbklucHV0ZWxzZUlucHV0b3RoZXJJZm90aGVySm9pbm90aGVyUGhpbmV4dEluc3RydWN0aW9uX1NzYVNoYXJlUmVnaW9uQ29uc3RhbnRzJkhCYXNlVmlzaXRvciZDb2RlZ2VuUGhhc2VTc2FTaGFyZVJlZ2lvbkNvbnN0YW50c19jb3VudENhY2hlYWJsZVVzZXNjYWNoZWFibGV1c2VDb3VudF90aGlzX2hhbmRsZU51bGxfaGFuZGxlSW50X2hhbmRsZVN0cmluZ19pc0NhY2hlYWJsZVVzZV9udWxsX3NfRXhwcmVzc2lvbk5hbWVMaXZlUmFuZ2VMaXZlSW50ZXJ2YWxmb3JDaGVja2NoZWNrZWRJbnRlcnZhbGxvb3BVcGRhdGVyYW5nZWludGVydmFsZGllc0F0YXRMaXZlRW52aXJvbm1lbnRzdGFydElkZW5kSWRsb29wTWFya2Vyc3VzZXJJZGV4aXN0aW5nSWRhZGRMb29wTWFya2VycmVtb3ZlTG9vcE1hcmtlcl9Tc2FMaXZlSW50ZXJ2YWxCdWlsZGVyJkhCYXNlVmlzaXRvciZDb2RlZ2VuUGhhc2VTc2FMaXZlSW50ZXJ2YWxCdWlsZGVyaW5zdHJ1Y3Rpb25JZExpdmVJbnRlcnZhbEJ1aWxkZXIubWFya0lucHV0c0FzTGl2ZUluRW52aXJvbm1lbnRtYXJrQXNMaXZlSW5FbnZpcm9ubWVudGNoZWNrZWRJbnN0cnVjdGlvbk9yTm9uR2VuZXJhdGVBdFVzZVNpdGVyZW1vdmVGcm9tRW52aXJvbm1lbnRpZkluc3RydWN0aW9uc3VjY2Vzc29yRW52dXBkYXRlTG9vcE1hcmtlckNvcHkgPC0gQ29weUhhbmRsZXJhZGRDb3B5Q29waWVzOiAsIGFzc2lnbm1lbnRzOiBWYXJpYWJsZU5hbWVzb3duTmFtZWNvcHlIYW5kbGVyc2FsbFVzZWROYW1lc3N3YXBUZW1wdDBhZGROYW1lVXNlZFZhcmlhYmxlTmFtZXJmcmVlVGVtcG9yYXJ5TmFtZXN0ZW1wb3JhcnlJbmRleHRbMC05XSthbGxvY2F0ZVdpdGhIaW50YWxsb2NhdGVUZW1wb3JhcnlmaXJzdFBoaVVzZXJXaXRoRWxlbWVudGFsbG9jYXRlTmFtZWFkZEFsbG9jYXRlZE5hbWVmcmVlTmFtZV9Tc2FWYXJpYWJsZUFsbG9jYXRvciZIQmFzZVZpc2l0b3ImQ29kZWdlblBoYXNlU3NhVmFyaWFibGVBbGxvY2F0b3J2YXJpYWJsZU5hbWVyaGFuZGxlUGhpaGFuZGxlSW5zdHJ1Y3Rpb25uZWVkc05hbWVhdEludGVydmFsaW5zdHJ1Y3Rpb25JbnRlcnZhbGZyZWVVc2VkTmFtZXNBdFNzYVNpbXBsaWZ5SW50ZXJjZXB0b3JzX2VuY2xvc2luZ0NsYXNzc2hvdWxkUmVtb3ZldHJ5Q29tcHV0ZUNvbnN0YW50SW50ZXJjZXB0b3JjYW5Vc2VTZWxmRm9ySW50ZXJjZXB0b3Jjb25zdGFudEludGVyY2VwdG9ydHJ5Q29tcHV0ZUNvbnN0YW50SW50ZXJjZXB0b3JGcm9tVHlwZWZpbmREb21pbmF0b3J1c2VkcmV3cml0ZVNlbGZJbnRlcmNlcHRvclVzZXNyZXBsYWNlVXNlcldpdGhpbnN0YW5jZW9mQ2hlY2tvbmVTaG90SW50ZXJjZXB0b3JmaW5pc2hJbnZva2VjYWxsUmVjZWl2ZXJTc2FUeXBlUHJvcGFnYXRvcndvcmttYXBwZW5kaW5nT3B0aW1pemF0aW9uc3VwZGF0ZVR5cGVwcm9jZXNzV29ya2xpc3RhZGRUb1dvcmtMaXN0YWRkRGVwZW5kZW50SW5zdHJ1Y3Rpb25zVG9Xb3JrTGlzdHByb2Nlc3NQZW5kaW5nT3B0aW1pemF0aW9uc2NoZWNrUG9zaXRpdmVJbnRlZ2VyY2FuZGlkYXRlVHlwZW91dHB1dFR5cGVjb252ZXJ0SW5wdXRpc0NoZWNrRW5vdWdoRm9yTnNtT3JBZWNoZWNrUmVjZWl2ZXJjaGVja0FyZ3VtZW50YWRkQWxsVXNlcnNCdXRjaGVja0lucHV0c1ZhbHVlUmFuZ2VJbmZvaW50WmVyb2ludE9uZW5ld0ludFZhbHVlbmV3SW5zdHJ1Y3Rpb25WYWx1ZW5ld1Bvc2l0aXZlVmFsdWVuZXdBZGRWYWx1ZW5ld1N1YnRyYWN0VmFsdWVuZXdOZWdhdGVWYWx1ZW5ld1VuYm91bmRSYW5nZW5ld05vcm1hbGl6ZWRSYW5nZXVwbmV3TWFya2VyUmFuZ2VWYWx1ZU1hcmtlclZhbHVlcG9zaXRpdmVJbnRWYWx1ZUludFZhbHVlLmhhc2hDb2RlSW50VmFsdWUgTWF4SW50VmFsdWVNYXhNaW5JbnRWYWx1ZU1pblVua25vd25WYWx1ZUluc3RydWN0aW9uVmFsdWVJbnN0cnVjdGlvblZhbHVlLmhhc2hDb2RlSW5zdHJ1Y3Rpb246IFBvc2l0aXZlVmFsdWVCaW5hcnlPcGVyYXRpb25WYWx1ZUFkZFZhbHVlQWRkVmFsdWUuaGFzaENvZGVTdWJ0cmFjdFZhbHVlU3VidHJhY3RWYWx1ZS5oYXNoQ29kZU5lZ2F0ZVZhbHVlTmVnYXRlLmhhc2hDb2RldW5ib3VuZGlzU2luZ2xlVmFsdWVSYW5nZS5oYXNoQ29kZVNzYVZhbHVlUmFuZ2VBbmFseXplcmNvbnZlcnNpb25zU1NBIHZhbHVlIHJhbmdlIGJ1aWxkZXJyZW1vdmVSYW5nZUNvbnZlcnNpb25jb25zdGFudE51bWluZGV4UmFuZ2VsZW5ndGhSYW5nZW1heEluZGV4YmVsb3dMZW5ndGhjcmVhdGVSYW5nZUNvbnZlcnNpb25uZXdJbmRleFJhbmdlcmlnaHRSYW5nZWxlZnRSYW5nZWhhbmRsZUVxdWFsaXR5Q2hlY2toYW5kbGVJbnZva2VNb2R1bG9kaXZpc29yZGl2aWRlbmRoYW5kbGVCaW5hcnlPcGVyYXRpb250cnlDb21wdXRlUmFuZ2VuZWdhdGVPcGVyYXRpb25mbGlwT3BlcmF0aW9uY29tcHV0ZUNvbnN0cmFpbmVkUmFuZ2VtaXJyb3JPcHJldmVyc2VkTWlycm9yTG9vcFVwZGF0ZVJlY29nbml6ZXJsb29wUGhpdXBkYXRlUmFuZ2VzdGFydFJhbmdlcGhpUmFuZ2VpbnB1dFJhbmdlVmFsdWVTZXRjb2xsaXNpb25zY2FwYWNpdHlyZXNpemVwcm9iZW9sZFNpemVvbGRUYWJsZW9sZENvbGxpc2lvbnNWYWx1ZVNldE5vZGVfTUVSR0VfU09SVF9MSU1JVGJpbmFyeVNlYXJjaHNvcnRlZExpc3Rjb21wbG93ZXJCb3VuZHRtcDFfcmV2ZXJzZWluc2VydGlvblNvcnRzY3JhdGNoU3BhY2VfbW92aW5nSW5zZXJ0aW9uU29ydF9tZXJnZVNvcnR0YXJnZXRNaWRkbGVmaXJzdExpc3RmaXJzdFN0YXJ0Zmlyc3RFbmRzZWNvbmRMaXN0c2Vjb25kU3RhcnRzZWNvbmRFbmRjdXJzb3IxY3Vyc29yMmZpcnN0RWxlbWVudHNlY29uZEVsZW1lbnRfQ2Fub25pY2FsaXplX0lzVmFsaWRLZXlDYW5vbmljYWxpemVkTWFwX2Nhbm9uaWNhbGl6ZV9pc1ZhbGlkS2V5Rm5fYmFzZV9pc1ZhbGlkS2V5ey4uLn1fdG9TdHJpbmdWaXNpdGluZ19pc1RvU3RyaW5nVmlzaXRpbmdDb21iaW5lZEl0ZXJhYmxlVmlld19pdGVyYWJsZXNfQ29tYmluZWRJdGVyYXRvcl9pdGVyYXRvcnNDb21iaW5lZExpc3RWaWV3X2xpc3RzX3Rocm93Q2Fubm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgTGlzdGluaXRpYWxJbmRleENvbWJpbmVkTWFwVmlld196ZXJvX3VwcGVyQ2FzZUFfdXBwZXJDYXNlWl9sb3dlckNhc2VBX2xvd2VyQ2FzZVpfYXNjaWlDYXNlQml0ZXF1YWxzSWdub3JlQXNjaWlDYXNlYUNoYXJiQ2hhcmFDaGFyTG93ZXJDYXNlaGFzaElnbm9yZUFzY2lpQ2FzZWNvbXBhcmVBc2NpaVVwcGVyQ2FzZWRlZmF1bHRSZXN1bHRhVXBwZXJDYXNlYlVwcGVyQ2FzZWNvbXBhcmVBc2NpaUxvd2VyQ2FzZWFMb3dlckNhc2ViTG93ZXJDYXNlY29tcGFyZU5hdHVyYWxjb21wYXJlQXNjaWlMb3dlckNhc2VOYXR1cmFsY29tcGFyZUFzY2lpVXBwZXJDYXNlTmF0dXJhbF9jb21wYXJlTmF0dXJhbGx5YUlzRGlnaXRiSXNEaWdpdF9jb21wYXJlTnVtZXJpY2FsbHlhSW5kZXhiSW5kZXhfY29tcGFyZURpZ2l0Q291bnRfaXNEaWdpdF9pc05vblplcm9OdW1iZXJTdWZmaXhfR2V0S2V5RXF1YWxpdHllMWUyRXF1YWxpdHlCeV9nZXRLZXlfaW5uZXJnZXRLZXlEZWZhdWx0RXF1YWxpdHlJZGVudGl0eUVxdWFsaXR5SXRlcmFibGVFcXVhbGl0eV9lbGVtZW50RXF1YWxpdHllbGVtZW50RXF1YWxpdHllbGVtZW50czFlbGVtZW50czJpdDFpdDJoYXNOZXh0TGlzdEVxdWFsaXR5X1Vub3JkZXJlZEVxdWFsaXR5VW5vcmRlcmVkSXRlcmFibGVFcXVhbGl0eVNldEVxdWFsaXR5X01hcEVudHJ5ZXF1YWxpdHlfa2V5RXF1YWxpdHlfdmFsdWVFcXVhbGl0eU1hcEVxdWFsaXR5ZXF1YWxFbGVtZW50Q291bnRza2V5SGFzaHZhbHVlSGFzaE11bHRpRXF1YWxpdHlfZXF1YWxpdGllc2VxdWFsaXRpZXNlcURlZXBDb2xsZWN0aW9uRXF1YWxpdHlfdW5vcmRlcmVkQ2FzZUluc2Vuc2l0aXZlRXF1YWxpdHlzdHJpbmcxX0hBU0hfTUFTS0VxdWFsaXR5TWFwRXF1YWxpdHlTZXRtYXBNYXBLMVYxbWFwS2V5bWFwVmFsdWVtZXJnZU1hcHNncm91cEJ5bWluQnlvcmRlckJ5bWluVmFsdWVtaW5PcmRlckJ5ZWxlbWVudE9yZGVyQnltYXhCeW1heFZhbHVlbWF4T3JkZXJCeXRyYW5zaXRpdmVDbG9zdXJldmVydGV4MXZlcnRleDJ2ZXJ0ZXgzc3Ryb25nbHlDb25uZWN0ZWRDb21wb25lbnRzaW5kaWNlc2xvd0xpbmtzb25TdGFja3N0cm9uZ0Nvbm5lY3RJdGVyYWJsZVppcGl0ZXJhYmxlc2l0ZXJhdG9yc19JdGVyYXRvclppcFByaW9yaXR5UXVldWVIZWFwUHJpb3JpdHlRdWV1ZV9JTklUSUFMX0NBUEFDSVRZX2xvY2F0ZU5vIHN1Y2ggZWxlbWVudF9yZW1vdmVMYXN0X2J1YmJsZVVwX2J1YmJsZURvd25sZWZ0Q2hpbGRQb3NpdGlvbnBhcmVudEluZGV4cmlnaHRDaGlsZEluZGV4bGVmdENoaWxkSW5kZXhsZWZ0Q2hpbGRyaWdodENoaWxkbWluQ2hpbGRJbmRleG1pbkNoaWxkbmV3Q2FwYWNpdHluZXdRdWV1ZV9RdWV1ZUxpc3QmT2JqZWN0Jkxpc3RNaXhpblF1ZXVlTGlzdF90YWJsZV9oZWFkX3RhaWxpbml0aWFsQ2FwYWNpdHlfY2FzdEZyb21zb3VyY2VMaXN0YWRkQ291bnRfcHJlR3Jvd2VuZFNwYWNlcHJlU3BhY2VhZGRGaXJzdE5vIGVsZW1lbnRMZW5ndGggIG1heSBub3QgYmUgbmVnYXRpdmUubmV3VGFpbCBtdXN0IGJlIGluIHRoZSByYW5nZSBbMC4uX2lzUG93ZXJPZjJfbmV4dFBvd2VyT2YybmV4dE51bWJlcm5ld1RhYmxlX3dyaXRlVG9MaXN0Zmlyc3RQYXJ0U2l6ZW5ld0VsZW1lbnRDb3VudF9DYXN0UXVldWVMaXN0X1VuaW9uU2V0JlNldEJhc2UmVW5tb2RpZmlhYmxlU2V0TWl4aW5DYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBTZXRVbmlvblNldF9kaXNqb2ludF9pdGVyYWJsZV9kZWR1cEl0ZXJhYmxlVW5pb25TZXRDb250cm9sbGVyX3NldFVubW9kaWZpYWJsZUxpc3RWaWV3X05vbkdyb3dhYmxlTGlzdFZpZXcmRGVsZWdhdGluZ0xpc3QmTm9uR3Jvd2FibGVMaXN0TWl4aW5DYW5ub3QgY2hhbmdlIHRoZSBsZW5ndGggb2YgYSBmaXhlZC1sZW5ndGggbGlzdE5vbkdyb3dhYmxlTGlzdFZpZXdsaXN0QmFzZU5vbkdyb3dhYmxlTGlzdE1peGluX1VubW9kaWZpYWJsZVNldFZpZXcmRGVsZWdhdGluZ1NldCZVbm1vZGlmaWFibGVTZXRNaXhpblVubW9kaWZpYWJsZVNldFZpZXdzZXRCYXNlVW5tb2RpZmlhYmxlU2V0TWl4aW5Vbm1vZGlmaWFibGVNYXBNaXhpbkNhbm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIE1hcF9LZXlGb3JWYWx1ZV9EZWxlZ2F0aW5nSXRlcmFibGVCYXNlRGVsZWdhdGluZ0l0ZXJhYmxlVXNlIGl0ZXJhYmxlLmNhc3Q8RT4gaW5zdGVhZC5EZWxlZ2F0aW5nTGlzdFVzZSBsaXN0LmNhc3Q8RT4gaW5zdGVhZC5fbGlzdEJhc2VEZWxlZ2F0aW5nU2V0VXNlIHNldC5jYXN0PEU+IGluc3RlYWQuX3NldEJhc2VEZWxlZ2F0aW5nUXVldWVVc2UgcXVldWUuY2FzdDxFPiBpbnN0ZWFkLl9iYXNlUXVldWVEZWxlZ2F0aW5nTWFwVXNlIG1hcC5jYXN0PEssIFY+IGluc3RlYWQuX01hcEtleVNldCZfRGVsZWdhdGluZ0l0ZXJhYmxlQmFzZSZVbm1vZGlmaWFibGVTZXRNaXhpbk1hcEtleVNldF9iYXNlTWFwTWFwS2V5U2V0IGRvZXNuJ3Qgc3VwcG9ydCBsb29rdXAoKS5NYXBWYWx1ZVNldF9rZXlGb3JWYWx1ZWtleUZvclZhbHVldG9SZW1vdmV2YWx1ZXNUb1JldGFpbmtleXNUb1JlbW92ZWRhcnQyanNfaW5mby5zcmMuZ3JhcGh0YXJnZXRzT2Zzb3VyY2VzT2Zjb21wdXRlVG9wb2xvZ2ljYWxTb3J0ZmluZGVyY29udGFpbnNQYXRocG9zdE9yZGVyZmluZEN5Y2xlQ29udGFpbmluZ19jb21wb25lbnRDb250YWluaW5nZG9taW5hdG9yVHJlZWlEb21pbW1lZGlhdGVEb21pbmF0b3JzRWRnZUxpc3RHcmFwaF9lZGdlc19yZXZFZGdlc3JlbW92ZUVkZ2VyZW1vdmVOb2RlcmVtb3ZlQWxsTm9kZXNfTm9kZUluZm9sb3dsaW5rX1NjY0ZpbmRlcl9hbGxDb21wb25lbnRzX3N0cm9uZ0Nvbm5lY3Rub2RlSW5mb19wb3BfcHVzaHZJbmZvd3dJbmZvX0RvbWluYXRvckZpbmRlcnBvc3RPcmRlcklkbm9kZXNJblBvc3RPcmRlcm5vZGVzSW5SZXZlcnNlZFBvc3RPcmRlcmlkb21faW50ZXJzZWN0ZmluZ2VyMWZpbmdlcjJCSVRfT1JCSVRfWE9SQklUX0FORExFRlRfSEFORF9TSURFanNfY2hhcmFjdGVyX2NvZGVzY29tcGlsZXIuc3JjLmluZmVycmVyLm5vZGVfdHJhY2VyVHJhY2VyVmlzaXRvck1BWF9BTkFMWVNJU19DT1VOVGRhcnQyanMudHJhY2luZy5saW1pdGxpc3RzVG9BbmFseXplc2V0c1RvQW5hbHl6ZW1hcHNUb0FuYWx5emVfd291bGRCZVRvb01hbnlVc2Vyc3NlZW5Tb0ZhcmFjdHVhbFdvcmtUb28gbWFueSB1c2Vyc2FuYWx5emVTdG9yZWRJbnRvTGlzdGFuYWx5emVTdG9yZWRJbnRvU2V0YW5hbHl6ZVN0b3JlZEludG9NYXBCYWlsaW5nIG91dCBvbiAgYmVjYXVzZTogUGFzc2VkIHRocm91Z2ggYXdhaXRQYXNzZWQgdGhyb3VnaCB5aWVsZFVzZWQgYXMga2V5IGluIE1hcFN0b3JlZCBpbiBhIGxpc3QgdGhhdCBiYWlsZWQgb3V0Zmxvd0VzY2FwZSBmcm9tIGEgbGlzdCB2aWEgW1N0b3JlZCBpbiBhIHNldCB0aGF0IGJhaWxlZCBvdXRFc2NhcGUgZnJvbSBhIHNldCB2aWEgW1N0b3JlZCBpbiBhIG1hcCB0aGF0IGJhaWxlZCBvdXRFc2NhcGUgZnJvbSBhIG1hcCB2aWEgW21pZ2h0QWRkVG9Db250YWluZXJpc0luZGV4U2V0QXJndW1lbnRpc0luZGV4U2V0S2V5aXNJbmRleFNldFZhbHVlYmFpbG91dElmUmVhY2hlc1JlYWNoZWQgc3VwcHJlc3NlZCBwYXJhbWV0ZXIgd2l0aG91dCBwcmVjaXNlIHJlY2VpdmVyYWRkc1RvQ29udGFpbmVyU3RvcmVkIGluIHRvbyBtYW55IGNvbnRhaW5lcnNhZGRzVG9NYXBWYWx1ZVN0b3JlZCBpbiB0b28gbWFueSBtYXBzYWRkc1RvTWFwS2V5aXNQYXJhbWV0ZXJPZkxpc3RBZGRpbmdNZXRob2Rpc1BhcmFtZXRlck9mTWFwQWRkaW5nTWV0aG9kUGFzc2VkIHRvIG5vU3VjaE1ldGhvZGluZmVycmVkVGFyZ2V0VHlwZXNwYXJhbWV0ZXJJbmZvUmV0dXJuZWQgZnJvbSBhIGNsb3N1cml6ZWQgbWV0aG9kUmV0dXJuZWQgZnJvbSBhIGNsb3N1cmVFc2NhcGUgdG8gY29kZSB0aGF0IGhhcyBzcGVjaWFsIGJhY2tlbmQgdHJlYXRtZW50UGFzc2VkIHRvIGEgbmF0aXZlIG1ldGhvZGRvZXNOb3RFc2NhcGVMaXN0U2V0ZG9lc05vdEVzY2FwZVNldFNldGRvZXNOb3RFc2NhcGVNYXBTZXRkYXJ0MmpzLm5ld19qc19lbWl0dGVyLm1vZGVsaG9sZGVyc291dHB1dENvbnRhaW5zQ29uc3RhbnRMaXN0bmVlZHNOYXRpdmVTdXBwb3J0aGFzU29mdERlZmVycmVkQ2xhc3Nlc2xvYWRNYXBfbWV0YWRhdGFDb2xsZWN0b3JmaW5hbGl6ZXJzbWV0YWRhdGFGb3JPdXRwdXRVbml0bWV0YWRhdGFUeXBlc0Zvck91dHB1dFVuaXRpc1NwbGl0ZGVmZXJyZWRGcmFnbWVudHNtYWluRnJhZ21lbnRIb2xkZXJpc1N0YXRpY1N0YXRlSG9sZGVyaXNDb25zdGFudHNIb2xkZXJIb2xkZXIobmFtZT1GcmFnbWVudHN0YXRpY05vbkZpbmFsRmllbGRzc3RhdGljTGF6aWx5SW5pdGlhbGl6ZWRGaWVsZHNvdXRwdXRGaWxlTmFtZWlzTWFpbkZyYWdtZW50TWFpbkZyYWdtZW50aW52b2tlTWFpbk1haW5GcmFnbWVudCgpRGVmZXJyZWRGcmFnbWVudERlZmVycmVkRnJhZ21lbnQobmFtZT1Db25zdGFudChuYW1lPSx2YWx1ZT1GaWVsZENvbnRhaW5lcnN0YXRpY0ZpZWxkc0ZvclJlZmxlY3Rpb25MaWJyYXJ5KHVyaT0sZWxlbWVudD1pc0luaXRpYWxpemVkQnlDb25zdGFudFN0YXRpY0ZpZWxkKG5hbWU9X3N1cGVyY2xhc3NfbWl4aW5DbGFzc2NoZWNrZWRTZXR0ZXJzbm9TdWNoTWV0aG9kU3R1YnNvbmx5Rm9yUnRpaXNDbG9zdXJlQmFzZUNsYXNzaXNTb2Z0RGVmZXJyZWRzZXRTdXBlcmNsYXNzc2V0TWl4aW5DbGFzc3N1cGVyY2xhc3NOYW1lc3VwZXJjbGFzc0hvbGRlckluZGV4Q2xhc3MobmFtZT1NaXhpbkFwcGxpY2F0aW9uaW5zdGFuY2VGaWVsZHNNaXhpbihuYW1lPWFjY2Vzc29yTmFtZWdldHRlckZsYWdzc2V0dGVyRmxhZ3Npbml0aWFsaXplckluQWxsb2NhdG9ybmVlZHNJbnRlcmNlcHRlZEdldHRlcm5lZWRzSW50ZXJjZXB0ZWRTZXR0ZXJuZWVkc0ludGVyY2VwdGVkR2V0dGVyT25SZWNlaXZlcm5lZWRzSW50ZXJjZXB0ZWRTZXR0ZXJPblJlY2VpdmVybmVlZHNJbnRlcmNlcHRlZEdldHRlck9uVGhpc25lZWRzSW50ZXJjZXB0ZWRTZXR0ZXJPblRoaXNGaWVsZChuYW1lPURhcnRNZXRob2RuZWVkc1RlYXJPZmZ0ZWFyT2ZmTmFtZXBhcmFtZXRlclN0dWJzYXBwbHlJbmRleG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlc0luc3RhbmNlTWV0aG9kYWxpYXNOYW1laXNDbG9zdXJlQ2FsbE1ldGhvZEluc3RhbmNlTWV0aG9kKG5hbWU9LGNvZGU9U3R1Yk1ldGhvZFN0dWJNZXRob2QobmFtZT1QYXJhbWV0ZXJTdHViTWV0aG9kUGFyYW1ldGVyU3R1Yk1ldGhvZChuYW1lPSwgY2FsbE5hbWU9LCBjb2RlPVN0YXRpY0RhcnRNZXRob2RTdGF0aWNEYXJ0TWV0aG9kKG5hbWU9U3RhdGljU3R1Yk1ldGhvZFN0YXRpY1N0dWJNZXRob2QobmFtZT1kYXJ0MmpzLmpzX2VtaXR0ZXIucHJvZ3JhbV9idWlsZGVyY29sbGVjdG9yLmRhcnRmaWVsZF92aXNpdG9yLmRhcnRyZWdpc3RyeS5kYXJ0QWNjZXB0RmllbGRuZWVkc1NldHRlclByb2dyYW1CdWlsZGVyX2NvbnN0YW50SGFuZGxlcl9nZW5lcmF0ZWRDb2RlX2luZmVycmVkRGF0YV9zdG9yZUZ1bmN0aW9uVHlwZXNJbk1ldGFkYXRhX291dHB1dHNfY29uc3RhbnRzX3VubmVlZGVkTmF0aXZlQ2xhc3Nlc19ub3RTb2Z0RGVmZXJyZWRidWlsZFByb2dyYW1zdG9yZUZ1bmN0aW9uVHlwZXNJbk1ldGFkYXRhX2luaXRpYWxpemVTb2Z0RGVmZXJyZWRNYXByZWdpc3Rlck91dHB1dFVuaXRvdXRwdXRDbGFzc0xpc3RzcmVnaXN0ZXJDbGFzc2Vzb3V0cHV0U3RhdGljTGlzdHNyZWdpc3Rlck1lbWJlcnNvdXRwdXRDb25zdGFudExpc3RzX3JlZ2lzdGVyQ29uc3RhbnRzb3V0cHV0U3RhdGljTm9uRmluYWxGaWVsZExpc3RzX3JlZ2lzdGVyU3RhdGljU3RhdGVIb2xkZXJfYnVpbGRDbGFzc05vIENsYXNzIGZvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBzdXBlcmNsYXNzIGVmZmVjdGl2ZU1peGluQ2xhc3NObyBjbGFzcyBmb3IgZWZmZWN0aXZlIG1peGluIGNvbXB1dGVJbnRlcmNlcHRvcnNSZWZlcmVuY2VkRnJvbUNvbnN0YW50c19hZGRKc0ludGVyb3BTdHVic21haW5MaWJyYXJpZXNNYXBfYnVpbGRNYWluRnJhZ21lbnRkZWZlcnJlZExpYnJhcmllc01hcF9idWlsZERlZmVycmVkRnJhZ21lbnRsaWJyYXJpZXNNYXBDb3VudF9tYXJrRWFnZXJDbGFzc2VzbmFtaW5nRmluYWxpemVyX2J1aWxkTG9hZE1hcF9idWlsZFR5cGVUb0ludGVyY2VwdG9yTWFwX21hcmtFYWdlckludGVyY2VwdG9yQ2xhc3Nlc2FsbG9jYXRlZENsYXNzZXNQYXRoYmxhY2tMaXN0ZGFydDp0eXBlZF9kYXRhX2ltcGxlbWVudGF0aW9uUHJvZmlsZSBmaWxlIGRvZXMgbm90IGV4aXN0OiBQcm9maWxlIGluZm9ybWF0aW9uIChhbGxvY2F0ZWQgY2xhc3NlcykgaXMgZW1wdHkucmVhZEFzU3RyaW5nU3luY2FsbG9jYXRlZENsYXNzZXNLZXlzYWxsb2NhdGVkQ2xhc3Nlc3N0dWJHZW5lcmF0b3JsaWJyYXJpZXNNYXBfYnVpbGRJbnZva2VNYWluX2J1aWxkTGlicmFyaWVzX2J1aWxkU3RhdGljTm9uRmluYWxGaWVsZHNfYnVpbGRTdGF0aWNMYXppbHlJbml0aWFsaXplZEZpZWxkc19idWlsZENvbnN0YW50c2NvbnN0YW50VmFsdWVzX2J1aWxkU3RhdGljRmllbGRyZWdpc3RlckhvbGRlcmxhenlGaWVsZHNfYnVpbGRMYXp5RmllbGRfYnVpbGRMaWJyYXJ5dG9TdHJpbmdJbnZvY2F0aW9uX2J1aWxkU3R1Yk1ldGhvZGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy4jKHRoaXMpIH1zdHViTmFtZXNjbGFzc0VsZW1lbnRzc3R1Yk5hbWVmdW5jdGlvbihvYmopIHsgcmV0dXJuIG9iai4jIH1mdW5jdGlvbihvYmosIHYpIHsgcmV0dXJuIG9iai4jID0gdiB9aXNGdW5jdGlvbkxpa2VtaW5BcmdzbWF4QXJnc2Z1bmN0aW9uKHJlY2VpdmVyLCAjKSB7IHJldHVybiByZWNlaXZlci4jKCMpIH1tZW1iZXJFbGVtZW50c19idWlsZFN0YXRpY01ldGhvZF9nZW5lcmF0ZUdldEludGVyY2VwdG9yTWV0aG9kc19nZW5lcmF0ZU9uZVNob3RJbnRlcmNlcHRvcnN2aXNpdFN0YXRpY3NfYnVpbGRGaWVsZHNfaXNTb2Z0RGVmZXJyZWRjbGFzc2VzT25seU5lZWRlZEZvclJ0aWNsYXNzU3R1YkdlbmVyYXRvcnJ1bnRpbWVUeXBlR2VuZXJhdG9ydmlzaXRJbnN0YW5jZU1lbWJlcl9idWlsZE1ldGhvZGNhbGxTdHVic0Zvck1lbWJlcnZpc2l0TWVtYmVyZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9X2dlbmVyYXRlSW5zdGFudGlhdGlvblN0dWJzaXNIb2xkZXJJbnRlcmNlcHRlZENsYXNzZnVuY3Rpb24oKSB7fWhvbGRlck5hbWVfbWV0aG9kTmVlZHNTdHVic19tZXRob2RDYW5CZUFwcGxpZWRfY29tcHV0ZVBhcmFtZXRlckRlZmF1bHRWYWx1ZXNpc05vdEFwcGx5VGFyZ2V0bWVtYmVyVHlwZV9nZW5lcmF0ZUZ1bmN0aW9uVHlwZV9nZW5lcmF0ZVBhcmFtZXRlclN0dWJzdGhpcy4kcmVjZWl2ZXJ2aXNpdEZpZWxkc2lzQXBwbHlUYXJnZXRjb25zdGFudE9iamVjdENvbGxlY3Rvcm91dHB1dExpYnJhcnlMaXN0c2ludGVyY2VwdG9yQ29uc3RhbnRjb21wdXRlQ2xhc3NGaWx0ZXJiYWNrZW5kVHlwZUhlbHBlcnN1bm5lZWRlZENsYXNzZXNnZXRCYWNrZW5kVHlwZUhlbHBlcnNjb21wdXRlTmVlZGVkQ29uc3RhbnRzY29uc3RhbnRVbml0Y29tcHV0ZU5lZWRlZERlY2xhcmF0aW9uc21peGluQ2xhc3Nlc3NvcnRlZENsYXNzZXNjb21wdXRlTmVlZGVkU3RhdGljc2lzU3RhdGljRnVuY3Rpb25jb21wdXRlTmVlZGVkU3RhdGljTm9uRmluYWxGaWVsZHNhZGRUb091dHB1dFVuaXRhRmllbGREYXRhYkZpZWxkRGF0YWNvbXB1dGVOZWVkZWRMaWJyYXJpZXNGaWVsZFZpc2l0b3Jpc0xpYnJhcnlFeHBlY3RlZCBhIENsYXNzRW50aXR5IG9yIGEgTGlicmFyeUVudGl0eS5pc01peGluTmF0aXZlRmllbGRmaWVsZE5lZWRzR2V0dGVyZmllbGROZWVkc1NldHRlcmNhbkF2b2lkR2VuZXJhdGVkQ2hlY2tlZFNldHRlcmZpZWxkQWNjZXNzTmV2ZXJUaHJvd3NMaWJyYXJ5Q29udGVudHNMaWJyYXJpZXNNYXBfbGFzdExpYnJhcnlfbGFzdE1hcHBpbmdfZ2V0TWFwcGluZ1JlZ2lzdHJ5X2hvbGRlcnNNYXBfZGVmZXJyZWRMaWJyYXJpZXNNYXBfbGFzdE91dHB1dFVuaXRfbGFzdExpYnJhcmllc01hcF9tYXBVbml0VG9MaWJyYXJpZXNNYXB0YXJnZXRVbml0dGFyZ2V0TGlicmFyaWVzTWFwZGFydDJqcy5qc19lbWl0dGVyLnN0YXJ0dXBfZW1pdHRlcnNob3VsZEdlbmVyYXRlU291cmNlTWFwZ2VuZXJhdGVDb25zdGFudFJlZmVyZW5jZWdlbmVyYXRlU3RhdGljQ2xvc3VyZUFjY2Vzc2lzUHJlZml4TGVuZ3RoIy5zdWJzdHJpbmcoIy5uYW1lIy5jb25zdHJ1Y3RvcmlzUHJlZml4KCcnICsgIykgaW4gIy5wcm90b3R5cGUjLm5hbWUgPT09ICNtZXRhZGF0YUFjY2Vzc2dlbmVyYXRlRW1iZWRkZWRHbG9iYWxBY2Nlc3NTdHJpbmdbI110eXBlc0FjY2Vzc1VuaGFuZGxlZCBCdWlsdGluOiBvbWl0dGVkRnJhZ21lbnRzb3V0cHV0QnVmZmVyc2NvbXBpbGVyLnNyYy5qc19iYWNrZW5kLmpzX2ludGVyb3BfYW5hbHlzaXNidWlsZEpzSW50ZXJvcEJvb3RzdHJhcGNhbmRpZGF0ZVBhcmFtZXRlck5hbWVzYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWkZ1bmN0aW9uLnByb3RvdHlwZS4jID0gZnVuY3Rpb24oIykgeyByZXR1cm4gdGhpcygjKSB9YnVpbGRKc0Z1bmN0aW9uVHlwZWRhcnQyanMucmVzb2x1dGlvbi5yZWdpc3RyeV9jb25zdFN5bWJvbE5hbWVzX2NvbnN0YW50TGl0ZXJhbHNfc2VlbkNsYXNzZXNyZWdpc3RlclNlZW5DbGFzc3NlZW5DbGFzc1Jlc29sdXRpb25Xb3JsZEltcGFjdEJ1aWxkZXIoCiBmZWF0dXJlczoKIG1hcC1saXRlcmFsczoKIHNldC1saXRlcmFsczoKIGxpc3QtbGl0ZXJhbHM6CiBjb25zdC1saXRlcmFsczoKIGNvbnN0LXN5bWJvbC1uYW1lczogCiBuYXRpdmUtZGF0YToKIGluc3RhbnRpYXRpb25zOkZlYXR1cmVzYWRkRWxlbWVudEZlYXR1cmVzKGZyb21UZXh0ZXFQb3Njb21tYVBvc2RlbGltaXRlcnNlbmREZWxpbWl0ZXJzdmFsdWVTdGFydGVuZERlbGltaXRlckZvckNvbmRpdGlvbmluU3R5bGVGb3JTcHJlYWRGb3JJblNwcmVhZEZvckVudHJ5Rm9ySW5FbnRyeUZvckNvbXBsZXRlRm9ySW5Db21wbGV0ZUlmQ29uZGl0aW9uSWZTcHJlYWRJZkVudHJ5SWZDb21wbGV0ZUlmRWxzZUVsc2VTcHJlYWRFbHNlRW50cnlJZkVsc2VDb21wbGV0ZVNwcmVhZE9wZXJhdG9yTmVzdGVkbmVzdGVkU3RlcGxhc3RTdGVwaWZDb25kaXRpb25zcHJlYWRPcGVyYXRvcmZhc3RhLnBhcnNlci50eXBlX2luZm9faW1wbFByZWZpeGVkVHlwZVNpbXBsZU51bGxhYmxlVHlwZVdpdGgxQXJndW1lbnRwYXJzZVR5cGVSZXN0U2ltcGxlVHlwZVdpdGgxQXJndW1lbnRTaW1wbGVOdWxsYWJsZVR5cGVTaW1wbGVUeXBlQ29tcGxleFR5cGVJbmZvYmVmb3JlUXVlc3Rpb25NYXJrdHlwZVZhcmlhYmxlU3RhcnRlcnNnZnRIYXNSZXR1cm5UeXBlX25vbk51bGxhYmxldHlwZVZhcmlhYmxlRW5kR3JvdXBzdHlwZVJlZk9yUHJlZml4ZW5kR3JvdXBJbmRleGNvbXB1dGVSZXN0dHlwZVZhcmlhYmxlU3RhcnROb1R5cGVQYXJhbU9yQXJnU2ltcGxlVHlwZUFyZ3VtZW50MXBhcnNlRW5kR3JvdXBza2lwRW5kR3JvdXBTaW1wbGVUeXBlQXJndW1lbnQxR3RFcWJlZm9yZUVuZEdyb3VwU2ltcGxlVHlwZUFyZ3VtZW50MUd0R3RDb21wbGV4VHlwZVBhcmFtT3JBcmdJbmZvc2tpcEVuZHBhcnNlVW5leHBlY3RlZEVuZHBhcnNlTWlzc2luZ0NvbW1hdHlwZVN0YXJ0c3N1cGVyVHlwZUluZm9zdG9rZW4yaXNBcmd1bWVudHN0eXBlRm9sbG93c0V4dGVuZHNpbnZhbGlkVHlwZVZhcnNpbXBsZVR5cGVzaW1wbGVOdWxsYWJsZVR5cGVwcmVmaXhlZFR5cGVzaW1wbGVUeXBlV2l0aDFBcmd1bWVudHNpbXBsZVR5cGVXaXRoMUFyZ3VtZW50R3RFcXNpbXBsZVR5cGVXaXRoMUFyZ3VtZW50R3RHdHNpbXBsZU51bGxhYmxlVHlwZVdpdGgxQXJndW1lbnRzaW1wbGVUeXBlQXJndW1lbnQxc2ltcGxlVHlwZUFyZ3VtZW50MUd0RXFzaW1wbGVUeXBlQXJndW1lbnQxR3RHdGxvb2tzTGlrZU5hbWVsb29rc0xpa2VUeXBlUGFyYW1PckFyZ2lzQ2xvc2VycGFyc2VDbG9zZXJiZWZvcmVDbG9zZXJ1bnNwbGl0c3BsaXRDbG9zZXJkZWZhdWx0Q29tcGFyZUVtcHR5VW5tb2RpZmlhYmxlU2V0ZGFydDJqcy5qc19lbWl0dGVyLnN0YXJ0dXBfZW1pdHRlci5tb2RlbF9lbWl0dGVyUmFuZG9tSGFzaGVyU291cmNlTWFwQnVpbGRlckNvbnN0YW50T3JkZXJpbmdmcmFnbWVudF9lbWl0dGVyLmRhcnRNb2RlbEVtaXR0ZXJjb25zdGFudEVtaXR0ZXJfY29uc3RhbnRPcmRlcmluZ2RlZmVycmVkSW5pdGlhbGl6ZXJzR2xvYmFsJF9fZGFydF9kZWZlcnJlZF9pbml0aWFsaXplcnNfX3BhcnRFeHRlbnNpb25kZWZlcnJlZEV4dGVuc2lvbnBhcnQuanN0eXBlTmFtZVByb3BlcnR5YnVpbHRpbiRjbHNjb25zdGFudExpc3RHZW5lcmF0b3JtYWtlQ29uc3RMaXN0KCMpaW5pdC5jbXAxY21wMmZyYWdtZW50RW1pdHRlcmRlZmVycmVkTG9hZGluZ1N0YXRlbWFpbkNvZGVlbWl0TWFpbkZyYWdtZW50ZGVmZXJyZWRGcmFnbWVudHNDb2RlZnJhZ21lbnRDb2RlZW1pdERlZmVycmVkRnJhZ21lbnRodW5rSGFzaGVzd3JpdGVEZWZlcnJlZEZyYWdtZW50c2ZpbmFsaXplRGVmZXJyZWRMb2FkaW5nRGF0YXdyaXRlTWFpbkZyYWdtZW50d3JpdGVEZWZlcnJlZE1hcGJ1aWxkR2VuZXJhdGVkQnlmbGF2b3JmYXN0IHN0YXJ0dXAgZW1pdHRlciwgc3Ryb25nLCB0cnVzdCBwcmltaXRpdmVzLCBvbWl0IGNoZWNrcywgbGF4IHJ1bnRpbWUgdHlwZSwgQ1NQZnJhZ21lbnRzQ29kZXdyaXRlRGVmZXJyZWRGcmFnbWVudGJ1aWxkRGVmZXJyZWRJbml0aWFsaXplckdsb2JhbHNlbGYuI2RlZmVycmVkSW5pdGlhbGl6ZXJzID0gc2VsZi4jZGVmZXJyZWRJbml0aWFsaXplcnMgfHwgT2JqZWN0LmNyZWF0ZShudWxsKTtkZWZlcnJlZEluaXRpYWxpemVyc2xvY2F0aW9uQ29sbGVjdG9yY29kZU91dHB1dExpc3RlbmVyc3NvdXJjZS1tYXBzbWFpbk91dHB1dG91dHB1dExpc3RlbmVyc2h1bmtQcmVmaXguY3VycmVudCA9ICNbIiJdID0gLmN1cnJlbnRtYXBVcmlodW5rRmlsZU5hbWVtYXBGaWxlTmFtZW1hcFNlZ21lbnRzcGFydFNlZ21lbnRzX2NvbW1lbnRUaGlzIG1hcHBpbmcgc2hvd3Mgd2hpY2ggY29tcGlsZWQgYC5qc2AgZmlsZXMgYXJlIG5lZWRlZCBmb3IgYSBnaXZlbiBkZWZlcnJlZCBsaWJyYXJ5IGltcG9ydC5mcmFnZW1udEZyYWdtZW50RW1pdHRlcm1vZGVsRW1pdHRlcl9jYWxsME5hbWVfY2FsbDFOYW1lX2NhbGwyTmFtZWNhbGwwTmFtZWNhbGwxTmFtZWNhbGwyTmFtZW5vblN0YXRpY1N0YXRlSG9sZGVyc3NvZnREZWZlcnJlZElkc29mdERlZmVycmVkaG9sZGVyQ29kZWVtaXRIb2xkZXJzaW5pdGlhbGl6ZUVtcHR5SG9sZGVyc2h1bmtIZWxwZXJzZGlyZWN0QWNjZXNzVGVzdEV4cHJlc3Npb25jeWNsaWNUaHJvd3RlYXJPZmZDb2RlZW1iZWRkZWRUeXBlc2VtYmVkZGVkSW50ZXJjZXB0b3JUYWdzZW1iZWRkZWRMZWFmVGFnc2VtYmVkZGVkR2xvYmFsc09iamVjdHN0YXRpY1N0YXRlRGVjbGFyYXRpb25zdGF0aWNTdGF0ZWNvbnN0YW50SG9sZGVyUmVmZXJlbmNlYnVpbGRDb25zdGFudEhvbGRlclJlZmVyZW5jZWRlZmF1bHRBcmd1bWVudFZhbHVlc2RlZmVycmVkR2xvYmFsc29mdElkaXNUcmFja2luZ0FsbG9jYXRpb25zcHJvdG90eXBlc2VtaXRQcm90b3R5cGVzaW5oZXJpdGFuY2VlbWl0SW5oZXJpdGFuY2VhbGlhc2VzZW1pdEluc3RhbmNlTWV0aG9kQWxpYXNlc3RlYXJPZmZzZW1pdEluc3RhbGxUZWFyT2Zmc2VtaXRDb25zdGFudHNlbWl0U3RhdGljTm9uRmluYWxGaWVsZHNlbWl0TGF6aWx5SW5pdGlhbGl6ZWRTdGF0aWNzZW1iZWRkZWRHbG9iYWxzZW1pdEVtYmVkZGVkR2xvYmFsc25hdGl2ZVN1cHBvcnRlbWl0TmF0aXZlU3VwcG9ydGpzSW50ZXJvcFN1cHBvcnRjYWxsMHNlbGVjdG9yY2FsbDFzZWxlY3RvcmNhbGwyc2VsZWN0b3JpbnN0YWxsSG9sZGVyc0FzTG9jYWxzZW1pdEluc3RhbGxIb2xkZXJzQXNMb2NhbHNob2xkZXJJbml0c2hvbGRlcnNMaXN0WyNddXBkYXRlSG9sZGVyQXNzaWdubWVudHNhY3RpdmVIb2xkZXJzI2hvbGRlciA9IGh1bmtIZWxwZXJzLnVwZGF0ZUhvbGRlcihob2xkZXJzTGlzdFsjaW5kZXhdLCAjaG9sZGVyKSNob2xkZXIgPSBob2xkZXJzTGlzdFsjaW5kZXhdY2xhc3NQcm90b3R5cGVzaW5jbHVkZUNsb3N1cmVzY2xvc3VyZVByb3RvdHlwZXNtZXRob2RBbGlhc2VzbGF6eUluaXRpYWxpemVyc2RlZmVycmVkSG9sZGVyc0xpc3R1cGRhdGVIb2xkZXJzc3RhdGljTWV0aG9kZW1pdFN0YXRpY01ldGhvZGVtaXRDb25zdHJ1Y3RvcmhvbGRlckluaXRpYWxpemF0aW9uc3ZhciBob2xkZXJzID0gI2NvbnN0YW50SG9sZGVyanNNZXRob2RzZnVuY3Rpb24gIygpIHsgfXRoaXNSZWZzb2Z0RGVmKHRoaXMpcXVhbGlmaWVkTmFtZWFsbG9jYXRpb25zWyIiXSA9IHRydWVlbWl0dGVkRmllbGRzdW5kZXJzY29yZXZhciAjID0gdGhpczttYXhDaGFpbkxlbmd0aGNoYWluTGVuZ3RocHJldmlvdXNDb25zdGFudGZsdXNoQXNzaWdubWVudCM7Iy4jID0gI2Z1bmN0aW9uICMoIykgeyAjIH1wcm90byMucHJvdG90eXBlID0gIztlbWl0UHJvdG90eXBlZ2V0dGVyc1NldHRlcnNnZW5lcmF0ZUdldHRlcnNTZXR0ZXJzYWxsTWV0aG9kc2VtaXRJbnN0YW5jZU1ldGhvZHByb3BmdW5jdGlvbigpIHsgcmV0dXJuICM7IH1mdW5jdGlvbihyZWNlaXZlcikgeyByZXR1cm4gcmVjZWl2ZXJbI107IH1mdW5jdGlvbihyZWNlaXZlcikgeyByZXR1cm4gdGhpc1sjXTsgfWZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpc1sjXTsgfWZ1bmN0aW9uKCkgeyB9ZnVuY3Rpb24ocmVjZWl2ZXIsIHZhbCkgeyByZXR1cm4gcmVjZWl2ZXJbI10gPSB2YWw7IH1mdW5jdGlvbihyZWNlaXZlciwgdmFsKSB7IHJldHVybiB0aGlzWyNdID0gdmFsOyB9ZnVuY3Rpb24odmFsKSB7IHJldHVybiB0aGlzWyNdID0gdmFsOyB9c3R1Yk1ldGhvZGZvcmNlQWRkYXBwbHlOYW1lX2VuY29kZU9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlc2luaGVyaXRDYWxsc21peGluQ2FsbHNjbGFzc2VzSW5GcmFnbWVudF9taXhpbmh1bmtIZWxwZXJzLm1peGluc3VwZXJjbGFzc1JlZmVyZW5jZV9pbmhlcml0aHVua0hlbHBlcnMuaW5oZXJpdGxpc3RFbGVtZW50c2ZpcnN0Q2xhc3NfaW5oZXJpdE1hbnlodW5rSGVscGVycy5pbmhlcml0TWFueXdyYXBQaGFzZWZpcnN0QWxpYXN2YXIgXyA9ICMucHJvdG90eXBlO18gPSAjLnByb3RvdHlwZV8uIyA9IF8uIyhmdW5jdGlvbiAjKCl7I30pKCk7ZW1pdEluc3RhbGxUZWFyT2ZmY2FsbE5hbWVzZnVuc09yTmFtZXNhZGRGdW5Pck5hbWVjYWxsTmFtZUFycmF5ZnVuc09yTmFtZXNBcnJheWluc3RhbGxfc3RhdGljX2h1bmtIZWxwZXJzLl9zdGF0aWNfICAgICAgICAgICAgICAgICNpbnN0YWxsKCNjb250YWluZXIsICNnZXR0ZXJOYW1lLCAjbmFtZSwgI2Z1blR5cGUpZnVuVHlwZWluc3RhbGxlZE5hbWVfc3RhdGljaHVua0hlbHBlcnMuaW5zdGFsbFN0YXRpY1RlYXJPZmYgICAgICAgICAgICAjaW5zdGFsbCgjY29udGFpbmVyLCAjZ2V0dGVyTmFtZSwKICAgICAgICAgICAgICAgICAgICAgI3JlcXVpcmVkUGFyYW1ldGVyQ291bnQsICNvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMsCiAgICAgICAgICAgICAgICAgICAgICAjY2FsbE5hbWVzLCAjZnVuc09yTmFtZXMsICNmdW5UeXBlLCAjYXBwbHlJbmRleClpc0ludGVyY2VwdGVkVGFnX2luc3RhbmNlX2h1bmtIZWxwZXJzLl9pbnN0YW5jZV9faW5zdGFuY2VodW5rSGVscGVycy5pbnN0YWxsSW5zdGFuY2VUZWFyT2ZmICAgICAgICAgICAgI2luc3RhbGwoI2NvbnRhaW5lciwgI2dldHRlck5hbWUsICNpc0ludGVyY2VwdGVkLAogICAgICAgICAgICAgICAgICAgICAjcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwgI29wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcywKICAgICAgICAgICAgICAgICAgICAgI2NhbGxOYW1lcywgI2Z1bnNPck5hbWVzLCAjZnVuVHlwZSwgI2FwcGx5SW5kZXgpdmFyIF87aW5zdGFsbFRlYXJPZmZzaGFzTGlzdHZhciBtYWtlQ29uc3RMaXN0ID0gaHVua0hlbHBlcnMubWFrZUNvbnN0TGlzdDsjLiMgPSAjOyMuIyA9ICMoKTtzdGF0aWNGaWVsZHMjKCMsICMsICMsICMpO19sYXp5aHVua0hlbHBlcnMubGF6eWVtaXRFbWJlZGRlZEdsb2JhbHNGb3JEZWZlcnJlZExvYWRpbmdPYmplY3QuY3JlYXRlKG51bGwpaXNIdW5rTG9hZGVkRnVuY3Rpb25mdW5jdGlvbihoYXNoKSB7IHJldHVybiAhIVtoYXNoXTsgfWlzSHVua0luaXRpYWxpemVkRnVuY3Rpb25mdW5jdGlvbihoYXNoKSB7IHJldHVybiAhISNkZWZlcnJlZEluaXRpYWxpemVkW2hhc2hdOyB9aW5pdGlhbGl6ZUxvYWRlZEh1bmtGdW5jdGlvbiAgICAgICAgICAgIGZ1bmN0aW9uKGhhc2gpIHsKICAgICAgICAgICAgICB2YXIgaHVuayA9IFtoYXNoXTsKICAgICAgICAgICAgICBpZiAoaHVuayA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiRGVmZXJyZWRMb2FkaW5nIHN0YXRlIGVycm9yOiBjb2RlIHdpdGggaGFzaCAnIiArCiAgICAgICAgICAgICAgICAgICAgaGFzaCArICInIHdhcyBub3QgbG9hZGVkIjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaW5pdGlhbGl6ZURlZmVycmVkSHVuayhodW5rKTsKICAgICAgICAgICAgICAjZGVmZXJyZWRJbml0aWFsaXplZFtoYXNoXSA9IHRydWU7CiAgICAgICAgICAgIH1kZWZlcnJlZExvYWRIYXNoZXNmcmFnbWVudEluZGV4ZXNmcmFnbWVudFVyaXNmcmFnbWVudEhhc2hlc2xpYnJhcnlQYXJ0c01hcEVudHJpZXNmcmFnbWVudExpc3RpbmRleGVzZnJhZ21lbnRIYXNoc2V0VmFsdWVlbWl0TWFuZ2xlZEdsb2JhbE5hbWVzbmF0aXZlQ2xhc3Nlc05lZWRpbmdVbm1hbmdsZWROYW1lZW1pdEdldFR5cGVGcm9tTmFtZWdldEdsb2JhbEZyb21OYW1lZW1pdE1ldGFkYXRhbWV0YWRhdGFHbG9iYWxzY3JlYXRlR2xvYmFsbWFpblVuaXRnbG9iYWxzT2JqZWN0dmFyIGluaXQgPSAjOyAgICAgICAgLy8gT24gVjgsIHRoZSAnaW50ZXJuJyBmdW5jdGlvbiBjb252ZXJ0cyBhIHN0cmluZyB0byBhIHN5bWJvbCwgd2hpY2gKICAgICAgICAvLyBtYWtlcyBwcm9wZXJ0eSBhY2Nlc3MgbXVjaCBmYXN0ZXIuCiAgICAgICAgLy8gVE9ETyhzcmEpOiBVc2UgU3ltYm9sIG9uIG5vbi1JRTExIGJyb3dzZXJzLgogICAgICAgIGZ1bmN0aW9uIChzKSB7CiAgICAgICAgICB2YXIgbyA9IHt9OwogICAgICAgICAgb1tzXSA9IDE7CiAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoaHVua0hlbHBlcnMuY29udmVydFRvRmFzdE9iamVjdChvKSlbMF07CiAgICAgICAgfXN1YmNsYXNzQXNzaWdubWVudHNodW5rSGVscGVycy5zZXRPclVwZGF0ZUludGVyY2VwdG9yc0J5VGFnKCMpO2h1bmtIZWxwZXJzLnNldE9yVXBkYXRlTGVhZlRhZ3MoIyk7TG9jYWxBbGlhc2VzYWxpYXNpbml0aWFsaXphdGlvbnNIb2xkZXJDb2RlRGVmZXJyZWRMb2FkaW5nU3RhdGVEZWZlcnJlZFByaW1hcnlFeHByZXNzaW9udGVhck9mZlByb3BlcnR5TmFtZSR0ZWFyT2ZmY2FjaGVkQ2xhc3NGaWVsZE5hbWVzJGNhY2hlZEZpZWxkTmFtZXNtYWluQm9pbGVycGxhdGUoZnVuY3Rpb24gZGFydFByb2dyYW0oKSB7Ci8vIENvcGllcyB0aGUgb3duIHByb3BlcnRpZXMgZnJvbSBbZnJvbV0gdG8gW3RvXS4KZnVuY3Rpb24gY29weVByb3BlcnRpZXMoZnJvbSwgdG8pIHsKICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZyb20pOwogIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAgdmFyIGtleSA9IGtleXNbaV07CiAgICB0b1trZXldID0gZnJvbVtrZXldOwogIH0KfQoKLy8gT25seSB1c2UgZGlyZWN0IHByb3RvIGFjY2VzcyB0byBjb25zdHJ1Y3QgdGhlIHByb3RvdHlwZSBjaGFpbiAoaW5zdGVhZCBvZgovLyBjb3B5aW5nIHByb3BlcnRpZXMpIG9uIHBsYXRmb3JtcyB3aGVyZSB3ZSBrbm93IGl0IHdvcmtzIHdlbGwgKENocm9tZSAvIGQ4KS4KdmFyIHN1cHBvcnRzRGlyZWN0UHJvdG9BY2Nlc3MgPSAjZGlyZWN0QWNjZXNzVGVzdEV4cHJlc3Npb247CgovLyBTZXRzIHRoZSBuYW1lIHByb3BlcnR5IG9mIGZ1bmN0aW9ucywgaWYgdGhlIEpTIGVuZ2luZSBkb2Vzbid0IHNldCB0aGUgbmFtZQovLyBpdHNlbGYuCi8vIEFzIG9mIDIwMTggb25seSBJRTExIGRvZXNuJ3Qgc2V0IHRoZSBuYW1lLgpmdW5jdGlvbiBzZXRGdW5jdGlvbk5hbWVzSWZOZWNlc3NhcnkoaG9sZGVycykgewogIGZ1bmN0aW9uIHQoKXt9OwogIGlmICh0eXBlb2YgdC5uYW1lID09ICJzdHJpbmciKSByZXR1cm47CgogIGZvciAodmFyIGkgPSAwOyBpIDwgaG9sZGVycy5sZW5ndGg7IGkrKykgewogICAgdmFyIGhvbGRlciA9IGhvbGRlcnNbaV07CiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGhvbGRlcik7CiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGtleXMubGVuZ3RoOyBqKyspIHsKICAgICAgdmFyIGtleSA9IGtleXNbal07CiAgICAgIHZhciBmID0gaG9sZGVyW2tleV07CiAgICAgIGlmICh0eXBlb2YgZiA9PSAnZnVuY3Rpb24nKSBmLm5hbWUgPSBrZXk7CiAgICB9CiAgfQp9CgovLyBNYWtlcyBbY2xzXSBpbmhlcml0IGZyb20gW3N1cF0uCi8vIE9uIENocm9tZSwgRmlyZWZveCBhbmQgcmVjZW50IElFcyB0aGlzIGhhcHBlbnMgYnkgdXBkYXRpbmcgdGhlIGludGVybmFsCi8vIHByb3RvLXByb3BlcnR5IG9mIHRoZSBjbGFzc2VzICdwcm90b3R5cGUnIGZpZWxkLgovLyBPbGRlciBJRXMgdXNlIGBPYmplY3QuY3JlYXRlYCBhbmQgY29weSBvdmVyIHRoZSBwcm9wZXJ0aWVzLgpmdW5jdGlvbiBpbmhlcml0KGNscywgc3VwKSB7CiAgLy8gTm90ZSB0aGF0IFJUSSBuZWVkcyBjbHMubmFtZSwgYnV0IHdlIGRvbid0IG5lZWQgdG8gc2V0IGl0IGFueW1vcmUuCiAgY2xzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNsczsKICBjbHMucHJvdG90eXBlWyNvcGVyYXRvcklzUHJlZml4ICsgY2xzLm5hbWVdID0gY2xzOwoKICAvLyBUaGUgc3VwZXJjbGFzcyBpcyBvbmx5IG51bGwgZm9yIHRoZSBEYXJ0IE9iamVjdC4KICBpZiAoc3VwICE9IG51bGwpIHsKICAgIGlmIChzdXBwb3J0c0RpcmVjdFByb3RvQWNjZXNzKSB7CiAgICAgIC8vIEZpcmVmb3ggZG9lc24ndCBsaWtlIHRvIHVwZGF0ZSB0aGUgcHJvdG90eXBlcywgYnV0IHdoZW4gc2V0dGluZyB1cAogICAgICAvLyB0aGUgaGllcmFyY2h5IGNoYWluIGl0J3Mgb2suCiAgICAgIGNscy5wcm90b3R5cGUuX19wcm90b19fID0gc3VwLnByb3RvdHlwZTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdmFyIGNsc1Byb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwLnByb3RvdHlwZSk7CiAgICBjb3B5UHJvcGVydGllcyhjbHMucHJvdG90eXBlLCBjbHNQcm90b3R5cGUpOwogICAgY2xzLnByb3RvdHlwZSA9IGNsc1Byb3RvdHlwZTsKICB9Cn0KCi8vIEJhdGNoZWQgdmVyc2lvbiBvZiBbaW5oZXJpdF0gZm9yIG11bHRpcGxlIGNsYXNzZXMgZnJvbSBvbmUgc3VwZXJjbGFzcy4KZnVuY3Rpb24gaW5oZXJpdE1hbnkoc3VwLCBjbGFzc2VzKSB7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7CiAgICBpbmhlcml0KGNsYXNzZXNbaV0sIHN1cCk7CiAgfQp9CgovLyBNaXhlcyBpbiB0aGUgcHJvcGVydGllcyBvZiBbbWl4aW5dIGludG8gW2Nsc10uCmZ1bmN0aW9uIG1peGluKGNscywgbWl4aW4pIHsKICBjb3B5UHJvcGVydGllcyhtaXhpbi5wcm90b3R5cGUsIGNscy5wcm90b3R5cGUpOwogIGNscy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjbHM7Cn0KCi8vIENyZWF0ZXMgYSBsYXp5IGZpZWxkLgovLwovLyBBIGxhenkgZmllbGQgaGFzIGEgc3RvcmFnZSBlbnRyeSwgW25hbWVdLCB3aGljaCBob2xkcyB0aGUgdmFsdWUsIGFuZCBhCi8vIGdldHRlciAoW2dldHRlck5hbWVdKSB0byBhY2Nlc3MgdGhlIGZpZWxkLiBJZiB0aGUgZmllbGQgd2Fzbid0IHNldCBiZWZvcmUKLy8gdGhlIGZpcnN0IGFjY2VzcywgaXQgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgW2luaXRpYWxpemVyXS4KZnVuY3Rpb24gbGF6eShob2xkZXIsIG5hbWUsIGdldHRlck5hbWUsIGluaXRpYWxpemVyKSB7CiAgdmFyIHVuaW5pdGlhbGl6ZWRTZW50aW5lbCA9IGhvbGRlcjsKICBob2xkZXJbbmFtZV0gPSB1bmluaXRpYWxpemVkU2VudGluZWw7CiAgaG9sZGVyW2dldHRlck5hbWVdID0gZnVuY3Rpb24oKSB7CiAgICBob2xkZXJbZ2V0dGVyTmFtZV0gPSBmdW5jdGlvbigpIHsgI2N5Y2xpY1Rocm93KG5hbWUpIH07CiAgICB2YXIgcmVzdWx0OwogICAgdmFyIHNlbnRpbmVsSW5Qcm9ncmVzcyA9IGluaXRpYWxpemVyOwogICAgdHJ5IHsKICAgICAgaWYgKGhvbGRlcltuYW1lXSA9PT0gdW5pbml0aWFsaXplZFNlbnRpbmVsKSB7CiAgICAgICAgcmVzdWx0ID0gaG9sZGVyW25hbWVdID0gc2VudGluZWxJblByb2dyZXNzOwogICAgICAgIHJlc3VsdCA9IGhvbGRlcltuYW1lXSA9IGluaXRpYWxpemVyKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0ID0gaG9sZGVyW25hbWVdOwogICAgICB9CiAgICB9IGZpbmFsbHkgewogICAgICAvLyBVc2UgdHJ5LWZpbmFsbHksIG5vdCB0cnktY2F0Y2gvdGhyb3cgYXMgaXQgZGVzdHJveXMgdGhlIHN0YWNrCiAgICAgIC8vIHRyYWNlLgogICAgICBpZiAocmVzdWx0ID09PSBzZW50aW5lbEluUHJvZ3Jlc3MpIHsKICAgICAgICAvLyBUaGUgbGF6eSBzdGF0aWMgKGhvbGRlcltuYW1lXSkgbWlnaHQgaGF2ZSBiZWVuIHNldCB0byBhIGRpZmZlcmVudAogICAgICAgIC8vIHZhbHVlLiBBY2NvcmRpbmcgdG8gc3BlYyB3ZSBzdGlsbCBoYXZlIHRvIHJlc2V0IGl0IHRvIG51bGwsIGlmCiAgICAgICAgLy8gdGhlIGluaXRpYWxpemF0aW9uIGZhaWxlZC4KICAgICAgICBob2xkZXJbbmFtZV0gPSBudWxsOwogICAgICB9CiAgICAgIC8vIFRPRE8oZmxvaXRzY2gpOiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyB0aGUgZnVuY3Rpb24gc2hvdWxkIHByb2JhYmx5CiAgICAgIC8vIGJlIHVuaXF1ZSBmb3IgZWFjaCBzdGF0aWMuCiAgICAgIGhvbGRlcltnZXR0ZXJOYW1lXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpc1tuYW1lXTsgfTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfTsKfQoKLy8gR2l2ZW4gYSBsaXN0LCBtYXJrcyBpdCBhcyBjb25zdGFudC4KLy8KLy8gVGhlIHJ1bnRpbWUgZW5zdXJlcyB0aGF0IGNvbnN0LWxpc3RzIGNhbm5vdCBiZSBtb2RpZmllZC4KZnVuY3Rpb24gbWFrZUNvbnN0TGlzdChsaXN0KSB7CiAgLy8gQnkgYXNzaWduaW5nIGEgZnVuY3Rpb24gdG8gdGhlIHByb3BlcnRpZXMgdGhleSBiZWNvbWUgcGFydCBvZiB0aGUKICAvLyBoaWRkZW4gY2xhc3MuIFRoZSBhY3R1YWwgdmFsdWVzIG9mIHRoZSBmaWVsZHMgZG9uJ3QgbWF0dGVyLCBzaW5jZSB3ZQogIC8vIG9ubHkgY2hlY2sgaWYgdGhleSBleGlzdC4KICBsaXN0LmltbXV0YWJsZSRsaXN0ID0gQXJyYXk7CiAgbGlzdC5maXhlZCRsZW5ndGggPSBBcnJheTsKICByZXR1cm4gbGlzdDsKfQoKZnVuY3Rpb24gY29udmVydFRvRmFzdE9iamVjdChwcm9wZXJ0aWVzKSB7CiAgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIHRoYXQgdXNlcyAncHJvcGVydGllcycgYXMgcHJvdG90eXBlLiBUaGlzIHNob3VsZAogIC8vIG1ha2UgJ3Byb3BlcnRpZXMnIGEgZmFzdCBvYmplY3QuCiAgZnVuY3Rpb24gdCgpIHt9CiAgdC5wcm90b3R5cGUgPSBwcm9wZXJ0aWVzOwogIG5ldyB0KCk7CiAgcmV0dXJuIHByb3BlcnRpZXM7Cn0KCmZ1bmN0aW9uIGNvbnZlcnRBbGxUb0Zhc3RPYmplY3QoYXJyYXlPZk9iamVjdHMpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5T2ZPYmplY3RzLmxlbmd0aDsgKytpKSB7CiAgICBjb252ZXJ0VG9GYXN0T2JqZWN0KGFycmF5T2ZPYmplY3RzW2ldKTsKICB9Cn0KCi8vIFRoaXMgdmFyaWFibGUgaXMgdXNlZCBieSB0aGUgdGVhck9mZkNvZGUgdG8gZ3VhcmFudGVlIHVuaXF1ZSBmdW5jdGlvbnMgcGVyCi8vIHRlYXItb2Zmcy4KdmFyIGZ1bmN0aW9uQ291bnRlciA9IDA7CiN0ZWFyT2ZmQ29kZTsKCi8vIEVhY2ggZGVmZXJyZWQgaHVuayBjb21lcyB3aXRoIGl0cyBvd24gdHlwZXMgd2hpY2ggYXJlIGFkZGVkIHRvIHRoZSBlbmQKLy8gb2YgdGhlIHR5cGVzLWFycmF5LgovLyBUaGUgYGZ1blR5cGVzYCBwYXNzZWQgdG8gdGhlIGBpbnN0YWxsVGVhck9mZmAgZnVuY3Rpb24gYmVsb3cgaXMgcmVsYXRpdmUgdG8KLy8gdGhlIGh1bmsgdGhlIGZ1bmN0aW9uIGNvbWVzIGZyb20uIFRoZSBgdHlwZXNPZmZzZXRgIHZhcmlhYmxlIGVuY29kZXMgdGhlCi8vIG9mZnNldCBhdCB3aGljaCB0aGUgbmV3IHR5cGVzIHdpbGwgYmUgYWRkZWQuCnZhciB0eXBlc09mZnNldCA9IDA7CgovLyBBZGFwdHMgdGhlIHN0b3JlZCBkYXRhLCBzbyBpdCdzIHN1aXRhYmxlIGZvciBhIHRlYXJPZmYgY2FsbC4KLy8KLy8gU3RvcmVzIHRoZSB0ZWFyLW9mZiBnZXR0ZXItZnVuY3Rpb24gaW4gdGhlIFtjb250YWluZXJdJ3MgW2dldHRlck5hbWVdCi8vIHByb3BlcnR5LgovLwovLyBUaGUgW2NvbnRhaW5lcl0gaXMgZWl0aGVyIGEgY2xhc3MgKHRoYXQgaXMsIGl0cyBwcm90b3R5cGUpLCBvciB0aGUgaG9sZGVyIGZvcgovLyBzdGF0aWMgZnVuY3Rpb25zLgovLwovLyBUaGUgYXJndW1lbnQgW2Z1bnNPck5hbWVzXSBpcyBhbiBhcnJheSBvZiBzdHJpbmdzIG9yIGZ1bmN0aW9ucy4gSWYgaXQgaXMgYQovLyBuYW1lLCB0aGVuIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgZmV0Y2hlZCBmcm9tIHRoZSBjb250YWluZXIuIFRoZSBmaXJzdAovLyBlbnRyeSBpbiB0aGF0IGFycmF5ICptdXN0KiBiZSBhIHN0cmluZy4KLy8KLy8gVE9ETyhmbG9pdHNjaCk6IENoYW5nZSB0ZWFyT2ZmQ29kZSB0byBhY2NlcHQgdGhlIGRhdGEgZGlyZWN0bHksIG9yIGNyZWF0ZSBhCi8vIGRpZmZlcmVudCB0ZWFyT2ZmQ29kZT8KZnVuY3Rpb24gaW5zdGFsbFRlYXJPZmYoCiAgICBjb250YWluZXIsIGdldHRlck5hbWUsIGlzU3RhdGljLCBpc0ludGVyY2VwdGVkLCByZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzLCBjYWxsTmFtZXMsIGZ1bnNPck5hbWVzLCBmdW5UeXBlLCBhcHBseUluZGV4KSB7CiAgLy8gQSBmdW5jdGlvbiBjYW4gaGF2ZSBzZXZlcmFsIHN0dWJzIChmb3IgZXhhbXBsZSB0byBmaWxsIGluIG9wdGlvbmFsCiAgLy8gYXJndW1lbnRzKS4gV2UgY29sbGVjdCB0aGVzZSBmdW5jdGlvbnMgaW4gdGhlIGBmdW5zYCBhcnJheS4KICB2YXIgZnVucyA9IFtdOwogIGZvciAodmFyIGkgPSAwOyBpIDwgZnVuc09yTmFtZXMubGVuZ3RoOyBpKyspIHsKICAgIHZhciBmdW4gPSBmdW5zT3JOYW1lc1tpXTsKICAgIGlmICgodHlwZW9mIGZ1bikgPT0gJ3N0cmluZycpIGZ1biA9IGNvbnRhaW5lcltmdW5dOwogICAgZnVuLiNjYWxsTmFtZSA9IGNhbGxOYW1lc1tpXTsKICAgIGZ1bnMucHVzaChmdW4pOwogIH0KCiAgLy8gVGhlIG1haW4gZnVuY3Rpb24gdG8gd2hpY2ggYWxsIHN0dWJzIHJlZGlyZWN0LgogIHZhciBmdW4gPSBmdW5zWzBdOwoKICBmdW5bI2FyZ3VtZW50Q291bnRdID0gcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDsKICBmdW5bI2RlZmF1bHRBcmd1bWVudFZhbHVlc10gPSBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXM7CiAgdmFyIHJlZmxlY3Rpb25JbmZvID0gZnVuVHlwZTsKICBpZiAodHlwZW9mIHJlZmxlY3Rpb25JbmZvID09ICJudW1iZXIiKSB7CiAgICAvLyBUaGUgcmVmbGVjdGlvbkluZm8gY2FuIGVpdGhlciBiZSBhIGZ1bmN0aW9uLCBvciBhIHBvaW50ZXIgaW50byB0aGUgdHlwZXMKICAgIC8vIHRhYmxlLiBJZiBpdCBwb2ludHMgaW50byB0aGUgdHlwZXMtdGFibGUgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGluZGV4LAogICAgLy8gaW4gY2FzZSB0aGUgdGVhci1vZmYgaXMgcGFydCBvZiBhIGRlZmVycmVkIGh1bmsuCiAgICByZWZsZWN0aW9uSW5mbyA9IHJlZmxlY3Rpb25JbmZvICsgdHlwZXNPZmZzZXQ7CiAgfQogIHZhciBuYW1lID0gZnVuc09yTmFtZXNbMF07CiAgZnVuLiNzdHViTmFtZSA9IG5hbWU7CiAgdmFyIGdldHRlckZ1bmN0aW9uID0KICAgICAgdGVhck9mZihmdW5zLCBhcHBseUluZGV4IHx8IDAsIHJlZmxlY3Rpb25JbmZvLCBpc1N0YXRpYywgbmFtZSwgaXNJbnRlcmNlcHRlZCk7CiAgY29udGFpbmVyW2dldHRlck5hbWVdID0gZ2V0dGVyRnVuY3Rpb247CiAgaWYgKGlzU3RhdGljKSB7CiAgICBmdW4uID0gZ2V0dGVyRnVuY3Rpb247CiAgfQp9CgpmdW5jdGlvbiBpbnN0YWxsU3RhdGljVGVhck9mZigKICAgIGNvbnRhaW5lciwgZ2V0dGVyTmFtZSwKICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcywKICAgIGNhbGxOYW1lcywgZnVuc09yTmFtZXMsIGZ1blR5cGUsIGFwcGx5SW5kZXgpIHsKICAvLyBUT0RPKHNyYSk6IFNwZWNpYWxpemUgaW5zdGFsbFRlYXJPZmYgZm9yIHN0YXRpYyBtZXRob2RzLiBJdCBtaWdodCBiZQogIC8vIHBvc3NpYmxlIHRvIGhhbmRsZSBzb21lIHZlcnkgY29tbW9uIHNpbXBsZSBjYXNlcyBkaXJlY3RseS4KICByZXR1cm4gaW5zdGFsbFRlYXJPZmYoCiAgICAgIGNvbnRhaW5lciwgZ2V0dGVyTmFtZSwgdHJ1ZSwgZmFsc2UsCiAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcywKICAgICAgY2FsbE5hbWVzLCBmdW5zT3JOYW1lcywgZnVuVHlwZSwgYXBwbHlJbmRleCk7Cn0KCmZ1bmN0aW9uIGluc3RhbGxJbnN0YW5jZVRlYXJPZmYoCiAgICBjb250YWluZXIsIGdldHRlck5hbWUsIGlzSW50ZXJjZXB0ZWQsCiAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50LCBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMsCiAgICBjYWxsTmFtZXMsIGZ1bnNPck5hbWVzLCBmdW5UeXBlLCBhcHBseUluZGV4KSB7CiAgLy8gVE9ETyhzcmEpOiBTcGVjaWFsaXplIGluc3RhbGxUZWFyT2ZmIGZvciBpbnN0YW5jZSBtZXRob2RzLgogIHJldHVybiBpbnN0YWxsVGVhck9mZigKICAgICAgY29udGFpbmVyLCBnZXR0ZXJOYW1lLCBmYWxzZSwgaXNJbnRlcmNlcHRlZCwKICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwgb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzLAogICAgICBjYWxsTmFtZXMsIGZ1bnNPck5hbWVzLCBmdW5UeXBlLCBhcHBseUluZGV4KTsKfQoKLy8gSW5zdGVhZCBvZiBzZXR0aW5nIHRoZSBpbnRlcmNlcHRvciB0YWdzIGRpcmVjdGx5IHdlIHVzZSB0aGlzIHVwZGF0ZQovLyBmdW5jdGlvbi4gVGhpcyBtYWtlcyBpdCBlYXNpZXIgZm9yIGRlZmVycmVkIGZyYWdtZW50cyB0byBjb250cmlidXRlIHRvIHRoZQovLyBlbWJlZGRlZCBnbG9iYWwuCmZ1bmN0aW9uIHNldE9yVXBkYXRlSW50ZXJjZXB0b3JzQnlUYWcobmV3VGFncykgewogIHZhciB0YWdzID0gI2VtYmVkZGVkSW50ZXJjZXB0b3JUYWdzOwogIGlmICghdGFncykgewogICAgI2VtYmVkZGVkSW50ZXJjZXB0b3JUYWdzID0gbmV3VGFnczsKICAgIHJldHVybjsKICB9CiAgY29weVByb3BlcnRpZXMobmV3VGFncywgdGFncyk7Cn0KCi8vIEluc3RlYWQgb2Ygc2V0dGluZyB0aGUgbGVhZiB0YWdzIGRpcmVjdGx5IHdlIHVzZSB0aGlzIHVwZGF0ZQovLyBmdW5jdGlvbi4gVGhpcyBtYWtlcyBpdCBlYXNpZXIgZm9yIGRlZmVycmVkIGZyYWdtZW50cyB0byBjb250cmlidXRlIHRvIHRoZQovLyBlbWJlZGRlZCBnbG9iYWwuCmZ1bmN0aW9uIHNldE9yVXBkYXRlTGVhZlRhZ3MobmV3VGFncykgewogIHZhciB0YWdzID0gI2VtYmVkZGVkTGVhZlRhZ3M7CiAgaWYgKCF0YWdzKSB7CiAgICAjZW1iZWRkZWRMZWFmVGFncyA9IG5ld1RhZ3M7CiAgICByZXR1cm47CiAgfQogIGNvcHlQcm9wZXJ0aWVzKG5ld1RhZ3MsIHRhZ3MpOwp9CgovLyBVcGRhdGVzIHRoZSB0eXBlcyBlbWJlZGRlZCBnbG9iYWwuCmZ1bmN0aW9uIHVwZGF0ZVR5cGVzKG5ld1R5cGVzKSB7CiAgdmFyIHR5cGVzID0gI2VtYmVkZGVkVHlwZXM7CiAgdmFyIGxlbmd0aCA9IHR5cGVzLmxlbmd0aDsKICAvLyBUaGUgdGVhci1vZmYgZnVuY3Rpb24gdXNlcyBhbm90aGVyICd0eXBlc09mZnNldCcgdmFsdWUgY2FjaGVkIGluCiAgLy8gW2luaXRpYWxpemVEZWZlcnJlZEh1bmtdIHNvIFt1cGRhdGVUeXBlc10gY2FuIGJlIGNhbGxlZCBlaXRoZXIgYmVmb3JlIG9yCiAgLy8gYWZ0ZXIgdGhlIHRlYXJvZmZzIGhhdmUgYmVlbiBpbnN0YWxsZWQuCiAgdHlwZXMucHVzaC5hcHBseSh0eXBlcywgbmV3VHlwZXMpOwogIHJldHVybiBsZW5ndGg7Cn0KCi8vIFVwZGF0ZXMgdGhlIGdpdmVuIGhvbGRlciB3aXRoIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBbbmV3SG9sZGVyXS4KLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gYSBkZWZlcnJlZCBmcmFnbWVudCBpcyBpbml0aWFsaXplZC4KZnVuY3Rpb24gdXBkYXRlSG9sZGVyKGhvbGRlciwgbmV3SG9sZGVyKSB7CiAgY29weVByb3BlcnRpZXMobmV3SG9sZGVyLCBob2xkZXIpOwogIHJldHVybiBob2xkZXI7Cn0KCnZhciAjaHVua0hlbHBlcnMgPSAoZnVuY3Rpb24oKXsKICB2YXIgbWtJbnN0YW5jZSA9IGZ1bmN0aW9uKAogICAgICBpc0ludGVyY2VwdGVkLCByZXF1aXJlZFBhcmFtZXRlckNvdW50LCBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMsCiAgICAgIGNhbGxOYW1lcywgYXBwbHlJbmRleCkgewogICAgcmV0dXJuIGZ1bmN0aW9uKGNvbnRhaW5lciwgZ2V0dGVyTmFtZSwgbmFtZSwgZnVuVHlwZSkgewogICAgICByZXR1cm4gaW5zdGFsbEluc3RhbmNlVGVhck9mZigKICAgICAgICAgIGNvbnRhaW5lciwgZ2V0dGVyTmFtZSwgaXNJbnRlcmNlcHRlZCwKICAgICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcywKICAgICAgICAgIGNhbGxOYW1lcywgW25hbWVdLCBmdW5UeXBlLCBhcHBseUluZGV4KTsKICAgIH0KICB9LAoKICBta1N0YXRpYyA9IGZ1bmN0aW9uKAogICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50LCBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMsCiAgICAgIGNhbGxOYW1lcywgYXBwbHlJbmRleCkgewogICAgcmV0dXJuIGZ1bmN0aW9uKGNvbnRhaW5lciwgZ2V0dGVyTmFtZSwgbmFtZSwgZnVuVHlwZSkgewogICAgICByZXR1cm4gaW5zdGFsbFN0YXRpY1RlYXJPZmYoCiAgICAgICAgICBjb250YWluZXIsIGdldHRlck5hbWUsCiAgICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50LCBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMsCiAgICAgICAgICBjYWxsTmFtZXMsIFtuYW1lXSwgZnVuVHlwZSwgYXBwbHlJbmRleCk7CiAgICB9CiAgfTsKCiAgLy8gVE9ETyhzcmEpOiBNaW5pZnkgcHJvcGVydGllcyBvZiAnaHVua0hlbHBlcnMnLgogIHJldHVybiB7CiAgICBpbmhlcml0OiBpbmhlcml0LAogICAgaW5oZXJpdE1hbnk6IGluaGVyaXRNYW55LAogICAgbWl4aW46IG1peGluLAogICAgaW5zdGFsbFN0YXRpY1RlYXJPZmY6IGluc3RhbGxTdGF0aWNUZWFyT2ZmLAogICAgaW5zdGFsbEluc3RhbmNlVGVhck9mZjogaW5zdGFsbEluc3RhbmNlVGVhck9mZiwKCiAgICAgICAgLy8gVW5pbnRlcmNlcHRlZCBtZXRob2RzLgogICAgX2luc3RhbmNlXzB1OiBta0luc3RhbmNlKDAsIDAsIG51bGwsIFsjY2FsbDBzZWxlY3Rvcl0sIDApLAogICAgX2luc3RhbmNlXzF1OiBta0luc3RhbmNlKDAsIDEsIG51bGwsIFsjY2FsbDFzZWxlY3Rvcl0sIDApLAogICAgX2luc3RhbmNlXzJ1OiBta0luc3RhbmNlKDAsIDIsIG51bGwsIFsjY2FsbDJzZWxlY3Rvcl0sIDApLAoKICAgICAgICAvLyBJbnRlcmNlcHRlZCBtZXRob2RzLgogICAgX2luc3RhbmNlXzBpOiBta0luc3RhbmNlKDEsIDAsIG51bGwsIFsjY2FsbDBzZWxlY3Rvcl0sIDApLAogICAgX2luc3RhbmNlXzFpOiBta0luc3RhbmNlKDEsIDEsIG51bGwsIFsjY2FsbDFzZWxlY3Rvcl0sIDApLAogICAgX2luc3RhbmNlXzJpOiBta0luc3RhbmNlKDEsIDIsIG51bGwsIFsjY2FsbDJzZWxlY3Rvcl0sIDApLAoKICAgICAgICAvLyBTdGF0aWMgbWV0aG9kcy4KICAgIF9zdGF0aWNfMDogbWtTdGF0aWMoMCwgbnVsbCwgWyNjYWxsMHNlbGVjdG9yXSwgMCksCiAgICBfc3RhdGljXzE6IG1rU3RhdGljKDEsIG51bGwsIFsjY2FsbDFzZWxlY3Rvcl0sIDApLAogICAgX3N0YXRpY18yOiBta1N0YXRpYygyLCBudWxsLCBbI2NhbGwyc2VsZWN0b3JdLCAwKSwKCiAgICBtYWtlQ29uc3RMaXN0OiBtYWtlQ29uc3RMaXN0LAogICAgbGF6eTogbGF6eSwKICAgIHVwZGF0ZUhvbGRlcjogdXBkYXRlSG9sZGVyLAogICAgY29udmVydFRvRmFzdE9iamVjdDogY29udmVydFRvRmFzdE9iamVjdCwKICAgIHNldEZ1bmN0aW9uTmFtZXNJZk5lY2Vzc2FyeTogc2V0RnVuY3Rpb25OYW1lc0lmTmVjZXNzYXJ5LAogICAgdXBkYXRlVHlwZXM6IHVwZGF0ZVR5cGVzLAogICAgc2V0T3JVcGRhdGVJbnRlcmNlcHRvcnNCeVRhZzogc2V0T3JVcGRhdGVJbnRlcmNlcHRvcnNCeVRhZywKICAgIHNldE9yVXBkYXRlTGVhZlRhZ3M6IHNldE9yVXBkYXRlTGVhZlRhZ3MsCiAgfTsKfSkoKTsKCi8vIEV2ZXJ5IGRlZmVycmVkIGh1bmsgKGkuZS4gZnJhZ21lbnQpIGlzIGEgZnVuY3Rpb24gdGhhdCB3ZSBjYW4gaW52b2tlIHRvCi8vIGluaXRpYWxpemUgaXQuIEF0IHRoaXMgbW9tZW50IGl0IGNvbnRyaWJ1dGVzIGl0cyBkYXRhIHRvIHRoZSBtYWluIGh1bmsuCmZ1bmN0aW9uIGluaXRpYWxpemVEZWZlcnJlZEh1bmsoaHVuaykgewogIC8vIFVwZGF0ZSB0aGUgdHlwZXNPZmZzZXQgZm9yIHRoZSBuZXh0IGRlZmVycmVkIGxpYnJhcnkuCiAgdHlwZXNPZmZzZXQgPSAjZW1iZWRkZWRUeXBlcy5sZW5ndGg7CgogIC8vIFRPRE8oZmxvaXRzY2gpOiBleHRlbmQgbmF0aXZlcy4KICBodW5rKGh1bmtIZWxwZXJzLCAjZW1iZWRkZWRHbG9iYWxzT2JqZWN0LCBob2xkZXJzLCAjc3RhdGljU3RhdGUpOwp9CgovLyBSZXR1cm5zIHRoZSBnbG9iYWwgd2l0aCB0aGUgZ2l2ZW4gW25hbWVdLgpmdW5jdGlvbiBnZXRHbG9iYWxGcm9tTmFtZShuYW1lKSB7CiAgLy8gVE9ETyhmbG9pdHNjaCk6IHdlIGFyZSBydW5uaW5nIHRocm91Z2ggYWxsIGhvbGRlcnMuIFNpbmNlIG5lZ2F0aXZlCiAgLy8gbG9va3VwcyBhcmUgZXhwZW5zaXZlIHdlIG1pZ2h0IG5lZWQgdG8gaW1wcm92ZSB0aGlzLgogIC8vIFJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IGFsbCBuYW1lcyBhcmUgdW5pcXVlIGFjcm9zcyBhbGwgaG9sZGVycy4KICBmb3IgKHZhciBpID0gMDsgaSA8IGhvbGRlcnMubGVuZ3RoOyBpKyspIHsKICAgIC8vIFRoZSBjb25zdGFudCBob2xkZXIgcmV1c2VzIHRoZSBzYW1lIG5hbWVzLiBUaGVyZWZvcmUgd2UgbXVzdCBza2lwIGl0LgogICAgaWYgKGhvbGRlcnNbaV0gPT0gI2NvbnN0YW50SG9sZGVyUmVmZXJlbmNlKSBjb250aW51ZTsKICAgIC8vIFJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IGFsbCB2YXJpYWJsZXMgYXJlIHVuaXF1ZS4KICAgIGlmIChob2xkZXJzW2ldW25hbWVdKSByZXR1cm4gaG9sZGVyc1tpXVtuYW1lXTsKICB9Cn0KCmlmICgjaGFzU29mdERlZmVycmVkQ2xhc3NlcykgewogIC8vIExvYWRzIHRoZSBzb2Z0LWRlZmVycmVkIGNsYXNzZXMgYW5kIGluaXRpYWxpemVzIHRoZW0uCiAgLy8gVXBkYXRlcyB0aGUgcHJvdG90eXBlIG9mIHRoZSBnaXZlbiBvYmplY3QuCiAgZnVuY3Rpb24gc29mdERlZihvKSB7CiAgICBzb2Z0RGVmID0gZnVuY3Rpb24obykge307ICAvLyBSZXBsYWNlIG91cnNlbHZlcy4KICAgICNkZWZlcnJlZEdsb2JhbFsjc29mdElkXSgKICAgICAgICBob2xkZXJzLCAjZW1iZWRkZWRHbG9iYWxzT2JqZWN0LCAjc3RhdGljU3RhdGUsCiAgICAgICAgaHVua0hlbHBlcnMpOwogICAgaWYgKG8gIT0gbnVsbCkgewogICAgICAvLyBUT0RPKDI5NTc0KTogc2hvdWxkIHdlIGRvIHNvbWV0aGluZyBkaWZmZXJlbnQgZm9yIEZpcmVmb3g/CiAgICAgIC8vIElmIHdlIHJlY29tbWVuZCB0aGF0IHRoZSBwcm9ncmFtIHRyaWdnZXJzIHRoZSBsb2FkIGJ5IGl0c2VsZiBiZWZvcmUKICAgICAgLy8gY2xhc3NlcyBhcmUgbmVlZGVkLCB0aGVuIHRoaXMgbGluZSBzaG91bGQgcmFyZWx5IGJlIGhpdC4KICAgICAgLy8gQWxzbywgaXQgaXMgb25seSBoaXQgYXQgbW9zdCBvbmNlIChwZXIgc29mdC1kZWZlcnJlZCBjaHVuaykuCiAgICAgIG8uX19wcm90b19fID0gby5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7CiAgICB9CiAgfQp9CgppZiAoI2lzVHJhY2tpbmdBbGxvY2F0aW9ucykgewogIHZhciBhbGxvY2F0aW9ucyA9ICNkZWZlcnJlZEdsb2JhbFsnYWxsb2NhdGlvbnMnXSA9IHt9Owp9CgovLyBDcmVhdGVzIHRoZSBob2xkZXJzLgojaG9sZGVyczsKCi8vIElmIHRoZSBuYW1lIGlzIG5vdCBzZXQgb24gdGhlIGZ1bmN0aW9ucywgZG8gaXQgbm93LgpodW5rSGVscGVycy5zZXRGdW5jdGlvbk5hbWVzSWZOZWNlc3NhcnkoaG9sZGVycyk7CgovLyBUT0RPKGZsb2l0c2NoKTogd2Ugc2hvdWxkIGJ1aWxkIHRoaXMgb2JqZWN0IGFzIGEgbGl0ZXJhbC4KdmFyICNzdGF0aWNTdGF0ZURlY2xhcmF0aW9uID0ge307CgovLyBTZXRzIHRoZSBwcm90b3R5cGVzIG9mIGNsYXNzZXMuCiNwcm90b3R5cGVzOwovLyBTZXRzIGFsaWFzZXMgb2YgbWV0aG9kcyAob24gdGhlIHByb3RvdHlwZXMgb2YgY2xhc3NlcykuCiNhbGlhc2VzOwovLyBJbnN0YWxscyB0aGUgdGVhci1vZmZzIG9mIGZ1bmN0aW9ucy4KI3RlYXJPZmZzOwovLyBCdWlsZHMgdGhlIGluaGVyaXRhbmNlIHN0cnVjdHVyZS4KI2luaGVyaXRhbmNlOwoKLy8gSW5zdGFudGlhdGVzIGFsbCBjb25zdGFudHMuCiNjb25zdGFudHM7CgovLyBFbWl0cyB0aGUgZW1iZWRkZWQgZ2xvYmFscy4gRHVlIHRvIHR5cGUgY2hlY2tzIGluIGVhZ2VyIGluaXRpYWxpemVycyB0aGlzIGlzCi8vIG5lZWRlZCBiZWZvcmUgc3RhdGljIG5vbi1maW5hbCBmaWVsZHMgaW5pdGlhbGl6ZXJzLgojZW1iZWRkZWRHbG9iYWxzOwoKLy8gSW5pdGlhbGl6ZXMgdGhlIHN0YXRpYyBub24tZmluYWwgZmllbGRzICh3aXRoIHRoZWlyIGNvbnN0YW50IHZhbHVlcykuCiNzdGF0aWNOb25GaW5hbEZpZWxkczsKLy8gQ3JlYXRlcyBsYXp5IGdldHRlcnMgZm9yIHN0YXRpY3MgdGhhdCBtdXN0IHJ1biBpbml0aWFsaXplcnMgb24gZmlyc3QgYWNjZXNzLgojbGF6eVN0YXRpY3M7CgovLyBTZXRzIHVwIHRoZSBuYXRpdmUgc3VwcG9ydC4KLy8gTmF0aXZlLXN1cHBvcnQgdXNlcyBzZXRPclVwZGF0ZUludGVyY2VwdG9yc0J5VGFnIGFuZCBzZXRPclVwZGF0ZUxlYWZUYWdzLgojbmF0aXZlU3VwcG9ydDsKCi8vIFNldHMgdXAgdGhlIGpzLWludGVyb3Agc3VwcG9ydC4KI2pzSW50ZXJvcFN1cHBvcnQ7CgovLyBFbnN1cmUgaG9sZGVycyBhcmUgaW4gZmFzdCBtb2RlLCBub3cgd2UgaGF2ZSBmaW5pc2hlZCBhZGRpbmcgdGhpbmdzLgpjb252ZXJ0QWxsVG9GYXN0T2JqZWN0KGhvbGRlcnMpOwpjb252ZXJ0VG9GYXN0T2JqZWN0KCNzdGF0aWNTdGF0ZSk7CgovLyBJbnZva2VzIG1haW4gKG1ha2luZyBzdXJlIHRoYXQgaXQgcmVjb3JkcyB0aGUgJ2N1cnJlbnQtc2NyaXB0JyB2YWx1ZSkuCiNpbnZva2VNYWluOwp9KSgpCiAgKGZ1bmN0aW9uICgpIHsKICAgIHZhciBjbHMgPSBmdW5jdGlvbiAoKSB7fTsKICAgIGNscy5wcm90b3R5cGUgPSB7J3AnOiB7fX07CiAgICB2YXIgb2JqZWN0ID0gbmV3IGNscygpOwogICAgaWYgKCEob2JqZWN0Ll9fcHJvdG9fXyAmJiBvYmplY3QuX19wcm90b19fLnAgPT09IGNscy5wcm90b3R5cGUucCkpCiAgICAgIHJldHVybiBmYWxzZTsKCiAgICB0cnkgewogICAgICAvLyBBcmUgd2UgcnVubmluZyBvbiBhIHBsYXRmb3JtIHdoZXJlIHRoZSBwZXJmb3JtYW5jZSBpcyBnb29kPwogICAgICAvLyAoaS5lLiBDaHJvbWUgb3IgZDgpLgoKICAgICAgLy8gQ2hyb21lIHVzZXJBZ2VudD8KICAgICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT0gInVuZGVmaW5lZCIgJiYKICAgICAgICAgIHR5cGVvZiBuYXZpZ2F0b3IudXNlckFnZW50ID09ICJzdHJpbmciICYmCiAgICAgICAgICBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZS8iKSA+PSAwKSByZXR1cm4gdHJ1ZTsKICAgICAgLy8gZDggdmVyc2lvbigpIGxvb2tzIGxpa2UgIk4uTi5OLk4iLCBqc3NoZWxsIHZlcnNpb24oKSBsaWtlICJOIi4KICAgICAgaWYgKHR5cGVvZiB2ZXJzaW9uID09ICJmdW5jdGlvbiIgJiYKICAgICAgICAgIHZlcnNpb24ubGVuZ3RoID09IDApIHsKICAgICAgICB2YXIgdiA9IHZlcnNpb24oKTsKICAgICAgICBpZiAoL15cZCtcLlxkK1wuXGQrXC5cZCskLy50ZXN0KHYpKSByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfSBjYXRjaChfKSB7fQoKICAgIHJldHVybiBmYWxzZTsKICB9KSgpCmRlZmVycmVkQm9pbGVycGxhdGVEYXJ0MmZ1bmN0aW9uKGh1bmtIZWxwZXJzLCAjZW1iZWRkZWRHbG9iYWxzT2JqZWN0LCBob2xkZXJzTGlzdCwgI3N0YXRpY1N0YXRlKSB7CgovLyBCdWlsZHMgdGhlIGhvbGRlcnMuIFRoZXkgb25seSBjb250YWluIHRoZSBkYXRhIGZvciBuZXcgaG9sZGVycy4KI2hvbGRlcnM7CgovLyBJZiB0aGUgbmFtZSBpcyBub3Qgc2V0IG9uIHRoZSBmdW5jdGlvbnMsIGRvIGl0IG5vdy4KaHVua0hlbHBlcnMuc2V0RnVuY3Rpb25OYW1lc0lmTmVjZXNzYXJ5KCNkZWZlcnJlZEhvbGRlcnNMaXN0KTsKCi8vIFVwZGF0ZXMgdGhlIGhvbGRlcnMgb2YgdGhlIG1haW4tZnJhZ21lbnQuIFVzZXMgdGhlIHByb3ZpZGVkIGhvbGRlcnNMaXN0IHRvCi8vIGFjY2VzcyB0aGUgbWFpbiBob2xkZXJzLgovLyBUaGUgbG9jYWwgaG9sZGVycyBhcmUgcmVwbGFjZWQgYnkgdGhlIGNvbWJpbmVkIGhvbGRlcnMuIFRoaXMgaXMgbmVjZXNzYXJ5Ci8vIGZvciB0aGUgaW5oZXJpdGFuY2Ugc2V0dXAgYmVsb3cuCiN1cGRhdGVIb2xkZXJzOwovLyBTZXRzIHRoZSBwcm90b3R5cGVzIG9mIHRoZSBuZXcgY2xhc3Nlcy4KI3Byb3RvdHlwZXM7Ci8vIEFkZCBzaWduYXR1cmUgZnVuY3Rpb24gdHlwZXMgYW5kIGNvbXB1dGUgdGhlIHR5cGVzIG9mZnNldCBpbiBgaW5pdC50eXBlc2AuCi8vIFRoZXNlIGNhbiBvbmx5IHJlZmVyIHRvIHJlZ3VsYXIgY2xhc3NlcyBhbmQgaW4gRGFydCAyIG9ubHkgY2xvc3VyZXMgaGF2ZQovLyBmdW5jdGlvbiB0eXBlcyBzbyB0aGUgYHR5cGVzT2Zmc2V0YCBoYXMgYmVlbiBzYWZlbHkgY29tcHV0ZWQgYmVmb3JlIGl0J3MKLy8gcmVmZXJyZWQgaW4gdGhlIHNpZ25hdHVyZXMgb2YgdGhlIGBjbG9zdXJlc2AgYmVsb3cuCnZhciAjdHlwZXNPZmZzZXQgPSBodW5rSGVscGVycy51cGRhdGVUeXBlcygjdHlwZXMpOwojY2xvc3VyZXM7Ci8vIFNldHMgYWxpYXNlcyBvZiBtZXRob2RzIChvbiB0aGUgcHJvdG90eXBlcyBvZiBjbGFzc2VzKS4KI2FsaWFzZXM7Ci8vIEluc3RhbGxzIHRoZSB0ZWFyLW9mZnMgb2YgZnVuY3Rpb25zLgojdGVhck9mZnM7Ci8vIEJ1aWxkcyB0aGUgaW5oZXJpdGFuY2Ugc3RydWN0dXJlLgojaW5oZXJpdGFuY2U7CgovLyBJbnN0YW50aWF0ZXMgYWxsIGNvbnN0YW50cyBvZiB0aGlzIGRlZmVycmVkIGZyYWdtZW50LgovLyBOb3RlIHRoYXQgdGhlIGNvbnN0YW50LWhvbGRlciBoYXMgYmVlbiB1cGRhdGVkIGVhcmxpZXIgYW5kIHN0b3JpbmcgdGhlCi8vIGNvbnN0YW50IHZhbHVlcyBpbiB0aGUgY29uc3RhbnQtaG9sZGVyIG1ha2VzIHRoZW0gYXZhaWxhYmxlIGdsb2JhbGx5LgojY29uc3RhbnRzOwovLyBJbml0aWFsaXplcyB0aGUgc3RhdGljIG5vbi1maW5hbCBmaWVsZHMgKHdpdGggdGhlaXIgY29uc3RhbnQgdmFsdWVzKS4KI3N0YXRpY05vbkZpbmFsRmllbGRzOwovLyBDcmVhdGVzIGxhenkgZ2V0dGVycyBmb3Igc3RhdGljcyB0aGF0IG11c3QgcnVuIGluaXRpYWxpemVycyBvbiBmaXJzdCBhY2Nlc3MuCiNsYXp5U3RhdGljczsKCi8vIE5hdGl2ZS1zdXBwb3J0IHVzZXMgc2V0T3JVcGRhdGVJbnRlcmNlcHRvcnNCeVRhZyBhbmQgc2V0T3JVcGRhdGVMZWFmVGFncy4KI25hdGl2ZVN1cHBvcnQ7Cn1zb2Z0RGVmZXJyZWRCb2lsZXJwbGF0ZSNkZWZlcnJlZEdsb2JhbFsjc29mdElkXSA9CiAgZnVuY3Rpb24oaG9sZGVyc0xpc3QsICNlbWJlZGRlZEdsb2JhbHNPYmplY3QsICNzdGF0aWNTdGF0ZSwKICAgICAgICAgICBodW5rSGVscGVycykgewoKLy8gSW5zdGFsbHMgdGhlIGhvbGRlcnMgYXMgbG9jYWwgdmFyaWFibGVzLgojaW5zdGFsbEhvbGRlcnNBc0xvY2FsczsKLy8gU2V0cyB0aGUgcHJvdG90eXBlcyBvZiB0aGUgbmV3IGNsYXNzZXMuCiNwcm90b3R5cGVzOwovLyBTZXRzIGFsaWFzZXMgb2YgbWV0aG9kcyAob24gdGhlIHByb3RvdHlwZXMgb2YgY2xhc3NlcykuCiNhbGlhc2VzOwovLyBJbnN0YWxscyB0aGUgdGVhci1vZmZzIG9mIGZ1bmN0aW9ucy4KI3RlYXJPZmZzOwovLyBCdWlsZHMgdGhlIGluaGVyaXRhbmNlIHN0cnVjdHVyZS4KI2luaGVyaXRhbmNlOwp9X2RpZ2VzdFNpbmtfYnl0ZVNpbmtfRGlnZXN0U2lua2RhcnQyanMuc291cmNlX21hcF9idWlsZGVydGFyZ2V0RmlsZVVyaWxvY2F0aW9uUHJvdmlkZXJtaW5pZmllZEdsb2JhbE5hbWVzbWluaWZpZWRJbnN0YW5jZU5hbWVzYWRkTWFwcGluZ3ByaW50U3RyaW5nTGlzdE9ubGluZUNvbHVtbk1hcHNvdXJjZUxvY2F0aW9uTWFwc291cmNlTWFwRW50cnlrZXJuZWxMb2NhdGlvbnNvdXJjZUxpbmVDb2x1bW5NYXBfYnVpbGR1cmlNYXByZWdpc3RlckxvY2F0aW9uZm9yRWFjaEVsZW1lbnRtYXBwaW5nc0J1ZmZlcndyaXRlRW50cmllc3sKICAidmVyc2lvbiI6IDMsCiAgImVuZ2luZSI6ICIiLAogICJmaWxlIjogIiAgInNvdXJjZVJvb3QiOiAiIiwKICAic291cmNlcyI6IHJlbGF0aXZlU291cmNlVXJpTGlzdCAgIm5hbWVzIjogICAibWFwcGluZ3MiOiAiICAieF9vcmdfZGFydGxhbmdfZGFydDJqcyI6IHsKICAgICJtaW5pZmllZF9uYW1lcyI6IHsKICAgICAgImdsb2JhbCI6IHdyaXRlTWluaWZpZWROYW1lcyAgICAgICJpbnN0YW5jZSI6IAogICAgfSwKICAgICJmcmFtZXMiOiB3cml0ZUZyYW1lcwogIH0KfQpwcmV2aW91c1NvdXJjZUxvY2F0aW9ucHJldmlvdXNUYXJnZXRMaW5ldGFyZ2V0Q29sdW1uRW5jb2RlcmZpcnN0RW50cnlJbkxpbmVzb3VyY2VVcmlJbmRleEVuY29kZXJzb3VyY2VMaW5lRW5jb2RlcnNvdXJjZUNvbHVtbkVuY29kZXJzb3VyY2VOYW1lSW5kZXhFbmNvZGVydGFyZ2V0TGluZXRhcmdldENvbHVtbm1pbmlmaWVkTmFtZXNtaW5pZmllZE5hbWVvZmZzZXRFbmNvZGVydXJpRW5jb2RlcmxpbmVFbmNvZGVyY29sdW1uRW5jb2Rlcm5hbWVFbmNvZGVyZ2VuZXJhdGVTb3VyY2VNYXBUYWdzb3VyY2VNYXBGaWxlTmFtZQovLyMgc291cmNlTWFwcGluZ1VSTD1vdXRwdXRTb3VyY2VNYXBzb3VyY2VMb2NhdGlvbnNQcm92aWRlcnNvdXJjZU1hcEJ1aWxkZXJqcy5tYXBtYXAuanMubWFwLkRlbHRhRW5jb2RlclZMUV9CQVNFX1NISUZUVkxRX0JBU0VfTUFTS1ZMUV9DT05USU5VQVRJT05fQklUVkxRX0NPTlRJTlVBVElPTl9NQVNLQkFTRTY0X0RJR0lUU0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky9lbmNvZGVWTFFTb3VyY2VNYXBFbnRyeUxpbmVDb2x1bW5NYXBfZ2V0TGlzdGxpbmVNYXBmb3JFYWNoTGluZWdldEZpcnN0RWxlbWVudHNJbkxpbmVjb2x1bW5zZm9yRWFjaENvbHVtbkluZGV4TWFwZGFydDJqcy5qc19lbWl0dGVyLmNvbnN0YW50X29yZGVyaW5nX0NvbnN0YW50T3JkZXJpbmdfZGFydFR5cGVPcmRlcmluZ2NvbXBhcmVWYWx1ZXNjb21wYXJlTnVsbGFibGVjb21wYXJlTGlzdHNjb21wYXJlQ2xhc3Nlc2NvbXBhcmVUeXBlZGVmc2NvbXBhcmVEYXJ0VHlwZXNhSW50YkludGFTdHJpbmdiU3RyaW5nYUZpZWxkc2JGaWVsZHNhS2luZGJLaW5kdW5leHBlY3RlZCBTeW50aGV0aWNDb25zdGFudEtpbmQgX0tpbmRWaXNpdG9yTk9OQ09OU1RBTlRfRGFydFR5cGVLaW5kVmlzaXRvcl9EYXJ0VHlwZU9yZGVyaW5nX3Jvb3RUeXBlIHZhcmlhYmxlcyBhcmUgbm90IGV4cGVjdGVkIGluIGNvbnN0YW50czogJ19jb21wYXJlVHlwZUFyZ3VtZW50c2FBcmd1bWVudHNiQXJndW1lbnRzZGFydDJqcy5qc19lbWl0dGVyLmhlYWRlcnNIT09LU19BUElfVVNBR0UvLyBUaGUgY29kZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGhvb2tzOgovLyBkYXJ0UHJpbnQobWVzc2FnZSk6Ci8vICAgIGlmIHRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBpdCBpcyBjYWxsZWQgaW5zdGVhZCBvZiB0aGUgRGFydCBbcHJpbnRdCi8vICAgIG1ldGhvZC4KLy8KLy8gZGFydE1haW5SdW5uZXIobWFpbiwgYXJncyk6Ci8vICAgIGlmIHRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCwgdGhlIERhcnQgW21haW5dIG1ldGhvZCB3aWxsIG5vdCBiZSBpbnZva2VkCi8vICAgIGRpcmVjdGx5LiBJbnN0ZWFkLCBhIGNsb3N1cmUgdGhhdCB3aWxsIGludm9rZSBbbWFpbl0sIGFuZCBpdHMgYXJndW1lbnRzCi8vICAgIFthcmdzXSBpcyBwYXNzZWQgdG8gW2RhcnRNYWluUnVubmVyXS4KLy8KLy8gZGFydERlZmVycmVkTGlicmFyeUxvYWRlcih1cmksIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk6Ci8vICAgIGlmIHRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCwgaXQgd2lsbCBiZSBjYWxsZWQgd2hlbiBhIGRlZmVycmVkIGxpYnJhcnkKLy8gICAgaXMgbG9hZGVkLiBJdCBzaG91bGQgbG9hZCBhbmQgZXZhbCB0aGUgamF2YXNjcmlwdCBvZiBgdXJpYCwgYW5kIGNhbGwKLy8gICAgc3VjY2Vzc0NhbGxiYWNrLiBJZiBpdCBmYWlscyB0byBkbyBzbywgaXQgc2hvdWxkIGNhbGwgZXJyb3JDYWxsYmFjayB3aXRoCi8vICAgIGFuIGVycm9yLgovLwovLyBkYXJ0Q2FsbEluc3RydW1lbnRhdGlvbihpZCwgcXVhbGlmaWVkTmFtZSk6Ci8vICAgIGlmIHRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCwgaXQgd2lsbCBiZSBjYWxsZWQgYXQgZWFjaCBlbnRyeSBvZiBhCi8vICAgIG1ldGhvZCBvciBjb25zdHJ1Y3Rvci4gVXNlZCBvbmx5IHdoZW4gY29tcGlsaW5nIHByb2dyYW1zIHdpdGgKLy8gICAgLS1leHBlcmltZW50LWNhbGwtaW5zdHJ1bWVudGF0aW9uLgovLwovLyBkZWZhdWx0UGFja2FnZXNCYXNlOgovLyAgICBPdmVycmlkZSB0aGUgbG9jYXRpb24gd2hlcmUgYHBhY2thZ2U6YCB1cmlzIGFyZSByZXNvbHZlZCBmcm9tLiBCeSBkZWZhdWx0Ci8vICAgIHRoZXkgYXJlIHJlc29sdmVkIHVuZGVyICJwYWNrYWdlcy8iIGZyb20gdGhlIGN1cnJlbnQgd2luZG93IGxvY2F0aW9uLgpnZW5lcmF0ZWRCeSB2ZXJzaW9uOiAvLyBHZW5lcmF0ZWQgYnkgZGFydDJqc3RoZSBEYXJ0IHRvIEphdmFTY3JpcHQgY29tcGlsZXJEaWdlc3RIYXNoYmxvY2tTaXplaW5uZXJTaW5rb3V0ZXJTaW5rSG1hY19oYXNoX0htYWNTaW5rX291dGVyU2lua19pbm5lclJlc3VsdFNpbmtfaW5uZXJTaW5rX2lzQ2xvc2VkSE1BQyBpcyBjbG9zZWRhZGRTbGljZWlzTGFzdE1ENV9NRDVTaW5rMTczMjU4NDE5MzQwMjMyMzM0MTcyNTYyMzgzMTAyZW5kaWFudXBkYXRlSGFzaG1kNV9ub2lzZTM2MTQwOTAzNjAzOTA1NDAyNzEwMzI1MDQ0MTk2NjQxMTg1NDgzOTkxMjAwMDgwNDI2MjgyMTczNTk1NTQyNDkyNjEzMTMxNzcwMDM1NDE2MjMzNjU1Mjg3OTQyOTQ5MjUyMzMyMzA0NTYzMTM0MTgwNDYwMzY4MjQyNTQ2MjYxOTUyNzkyOTY1MDA2MTIzNjUzNTMyOTQxMjkxNzA3ODYzMjI1NDY1NjY0MzkyMTA2OTk5NDM1OTM0MDg2MDUzNjM0NDg4OTYxMzg4OTQyOTQ0ODMyNzUxNjM2MDY0MTA3NjAzMzM1MTE2MzUzMTUwMTI4NTAyODU4Mjk0MjQzNTYzNTEyMTczNTMyODQ3MzIzNjgzNTk1NjI0Mjk0NTg4NzM4MjI3MjM5MjgzMzE4MzkwMzA1NjI0MjU5NjU3NzQwMjc2Mzk3NTIzNjEyNzI4OTMzNTM0MTM5NDY5NjY0MzIwMDIzNjY1NjM5MzY0MzAwNzQzNTcyNDQ1MzE3MzY1NDYwMjgwOTM4NzMxNTE0NjEzMjk5NjI4NjQ1NDA5NjMzNjQ1MjExMjY4OTE0MTUyODc4NjEyMzkxNDIzNzUzMzI0MTE3MDA0ODU1NzEyMzk5OTgwNjkwNDI5MzkxNTc3MzIyNDAwNDQ0OTcxODczMzEzMzU5NDI2NDM1NTU1MjI3MzQ3Njg5MTYxMzA5MTUxNjQ5NDE0OTQ0NDIyNjMxNzQ3NTY5MTczOTUxNDgxNzQ1X3NoaWZ0QW1vdW50c1NoYTFfU2hhMVNpbmtfZXh0ZW5kZWQzMjg1Mzc3NTIwbmV3QTE1MTg1MDAyNDkxODU5Nzc1MzkzMjQwMDk1OTcwODMzOTU0Njk3ODJzaGExU2hhMjU2X1NoYTI1NlNpbmsxNzc5MDMzNzAzMzE0NDEzNDI3NzI3NzM0ODA3NjIxMzU5ODkzMTE5MjYwMDgyMjkyNDE1NDE0NTkyMjVfcm90cjMyX2NoX21hal9ic2lnMF9ic2lnMV9zc2lnMF9zc2lnMXRlbXAxdGVtcDJzaGEyNTYxMTE2MzUyNDA4MTg5OTQ0NzQ0MTMwNDkzMjM0NzEzOTIxMDA5NTczMTUwODk3MDk5MzI0NTM2MzU3NDgyODcwNzYzMjIxMzYyNDM4MTA4MDE0MjY4ODE5ODcxOTI1MDc4Mzg4MjE2MjA3ODIwNjI2MTQ4ODgxMDMzMjQ4MjIyNTgwMzgzNTM5MDQwMTQwMjIyMjQ3NzQxMjQ5MTUwMTIyMTU1NTA4MTY5MjE5OTYwNjQ5ODYyNTU0MjIwODgyMjgyMTgzNDM0OTI5NTI5OTY4MDgzMjEwMzEzNjcxMzMzNjU3MTg5MTM1ODQ1Mjg3MTExMjk0NzU3MzcyMTM5NjE4MjI5MTE2OTUxODM3MDAxOTg2NjYxMDUxMjE3NzAyNjM1MDI0NTY5NTYwMzcyNzMwNDg1OTIxMjgyMDMwMjQxMTMyNTk3MzA4MDAzMzQ1NzY0NzcxMzUxNjA2NTgxNzM2MDAzNTI4MDQ0MDk0NTcxOTA5MTMyMjgyMjIxODE1MzcwMDIwNjMxNzQ3ODczNzc5MTk1NTU2MjIyMjIwMjQxMDQ4MTUyMjI3NzMwNDUyMjM2MTg1MjQyNDI0Mjg0MzY0NzQyNzU2NzM0MTg3MzIwNDAzMTQ3OTMzMjkzMjUyOThEaWdlc3RTaW5rSGFzaFNpbmtfZW5kaWFuX2N1cnJlbnRDaHVua19tYXhNZXNzYWdlTGVuZ3RoSW5CeXRlczExMjU4OTk5MDY4NDI2MjNfbGVuZ3RoSW5CeXRlc19wZW5kaW5nRGF0YWNodW5rU2l6ZUluV29yZHNIYXNoLmFkZCgpIGNhbGxlZCBhZnRlciBjbG9zZSgpLl9pdGVyYXRlX2ZpbmFsaXplRGF0YV9ieXRlRGlnZXN0Ynl0ZURpZ2VzdGxlbmd0aEluQnl0ZXNieXRlRGF0YWFzQnl0ZURhdGFzZXRVaW50MzJwZW5kaW5nRGF0YUJ5dGVzcGVuZGluZ0RhdGFDaHVua3NnZXRVaW50MzJjb250ZW50c0xlbmd0aGZpbmFsaXplZExlbmd0aF9yb3VuZFVwSGFzaGluZyBpcyB1bnN1cHBvcnRlZCBmb3IgbWVzc2FnZXMgd2l0aCBtb3JlIHRoYW4gMl41MyBiaXRzLmxlbmd0aEluQml0c2hpZ2hCaXRzbG93Qml0c21hc2szMmJpdHNQZXJCeXRlYnl0ZXNQZXJXb3JkYWRkMzJyb3RsMzJtb2RTaGlmdEFjY3VtdWxhdG9yU2lua19ldmVudHNDYW4ndCBhZGQgdG8gYSBjbG9zZWQgc2luay5CeXRlQWNjdW11bGF0b3JTaW5rY29udmVydC5oZXhoZXhFbmNvZGVyaGV4RGVjb2RlckhleENvZGVjaGV4Y29udmVydC5wZXJjZW50cGVyY2VudEVuY29kZXJwZXJjZW50RGVjb2RlclBlcmNlbnRDb2RlY1N0cmluZ0FjY3VtdWxhdG9yU2lua2NvbnZlcnQuaGV4LmVuY29kZXJIZXhFbmNvZGVyX0hleEVuY29kZXJTaW5rX2NvbnZlcnRidWZmZXJJbmRleGJ5dGVPckludmFsaWQgYnl0ZSBfY29kZVVuaXRGb3JEaWdpdGNvbnZlcnQuaGV4LmRlY29kZXJIZXhEZWNvZGVyaXNFdmVuSW52YWxpZCBpbnB1dCBsZW5ndGgsIG11c3QgYmUgZXZlbi5fSGV4RGVjb2RlclNpbmtfbGFzdERpZ2l0X2Nsb3NlYnl0ZXNTdGFydGhleFBhaXJzYXNVdGY4U2lua0lucHV0IGVuZGVkIHdpdGggaW5jb21wbGV0ZSBlbmNvZGVkIGJ5dGUuX0hleERlY29kZXJCeXRlU2lua19kZWNvZGVzb3VyY2VTdGFydHNvdXJjZUVuZGRlc3RpbmF0aW9uU3RhcnRkZXN0aW5hdGlvbkluZGV4Zmlyc3REaWdpdHNlY29uZERpZ2l0Y29udmVydC5wZXJjZW50LmVuY29kZXJQZXJjZW50RW5jb2Rlcl9QZXJjZW50RW5jb2RlclNpbmtjb252ZXJ0LnBlcmNlbnQuZGVjb2RlclBlcmNlbnREZWNvZGVybGFzdERpZ2l0X1BlcmNlbnREZWNvZGVyU2lua19QZXJjZW50RGVjb2RlckJ5dGVTaW5rX2xhc3RQZXJjZW50Y29kZVVuaXRPcnNsaWNlU3RhcnRfY2hlY2tGb3JJbnZhbGlkQ29kZVVuaXROb24tQVNDSUkgY29kZSB1bml0IHR5cGVkX2RhdGEudHlwZWRfYnVmZmVyc0xpc3RCYXNlX1R5cGVkRGF0YUJ1ZmZlcklOSVRJQUxfTEVOR1RIX3R5cGVkQnVmZmVyX2RlZmF1bHRWYWx1ZW5ld0J1ZmZlcl9jcmVhdGVCdWZmZXJfY3JlYXRlQmlnZ2VyQnVmZmVyX2FkZEFsbF9pbnNlcnRLbm93bkxlbmd0aHdyaXRlSW5kZXhUb28gZmV3IGVsZW1lbnRzdmFsdWVzTGVuZ3RoX2Vuc3VyZUNhcGFjaXR5cmVxdWlyZWRDYXBhY2l0eV9zZXRSYW5nZWVsZW1lbnRTaXplSW5CeXRlc19JbnRCdWZmZXJfRmxvYXRCdWZmZXJVaW50OEJ1ZmZlcmluaXRpYWxMZW5ndGhJbnQ4QnVmZmVyVWludDhDbGFtcGVkQnVmZmVyVWludDE2QnVmZmVySW50MTZCdWZmZXJVaW50MzJCdWZmZXJJbnQzMkJ1ZmZlclVpbnQ2NEJ1ZmZlckludDY0QnVmZmVyRmxvYXQzMkJ1ZmZlckZsb2F0NjRCdWZmZXJJbnQzMng0QnVmZmVyRmxvYXQzMng0QnVmZmVyY29udmVydC51dGlsc2RpZ2l0Rm9yQ29kZVVuaXRJbnZhbGlkIGhleGFkZWNpbWFsIGNvZGUgdW5pdCBkYXJ0LmFzeW5jVk1MaWJyYXJ5SG9va3NDYXN0U3RyZWFtQ2FzdFN0cmVhbVRyYW5zZm9ybWVyRW1wdHlJdGVyYXRvckl0ZXJhYmxlRWxlbWVudEVycm9ycHJpbnRUb1pvbmVwcmludFRvQ29uc29sZVNpbmNlYXN5bmNfZXJyb3IuZGFydGJyb2FkY2FzdF9zdHJlYW1fY29udHJvbGxlci5kYXJ0ZGVmZXJyZWRfbG9hZC5kYXJ0ZnV0dXJlLmRhcnRmdXR1cmVfaW1wbC5kYXJ0c2NoZWR1bGVfbWljcm90YXNrLmRhcnRzdHJlYW0uZGFydHN0cmVhbV9jb250cm9sbGVyLmRhcnRzdHJlYW1faW1wbC5kYXJ0c3RyZWFtX3BpcGUuZGFydHN0cmVhbV90cmFuc2Zvcm1lcnMuZGFydHRpbWVyLmRhcnR6b25lLmRhcnRfU2NoZWR1bGVJbW1lZGlhdGVDbG9zdXJlX1RpbWVyRmFjdG9yeUNsb3N1cmVyZXBlYXRpbmdfRnV0dXJlT25WYWx1ZV9GdXR1cmVFcnJvclRlc3RfRnV0dXJlQWN0aW9uX0FzeW5jQ2FsbGJhY2tfVGltZXJDYWxsYmFja0NvbnRyb2xsZXJDYWxsYmFja0NvbnRyb2xsZXJDYW5jZWxDYWxsYmFja19Ob3RpZmljYXRpb25IYW5kbGVyX0V2ZW50R2VuZXJhdG9yX0RhdGFIYW5kbGVyX0RvbmVIYW5kbGVyX0Jyb2FkY2FzdENhbGxiYWNrX0Vycm9yQ2FsbGJhY2tfUHJlZGljYXRlX1RyYW5zZm9ybWF0aW9uX0Vycm9yVGVzdF9FcXVhbGl0eV9TaW5rTWFwcGVyX1RyYW5zZm9ybURhdGFIYW5kbGVyX1RyYW5zZm9ybUVycm9ySGFuZGxlcl9UcmFuc2Zvcm1Eb25lSGFuZGxlcl9TdWJzY3JpcHRpb25UcmFuc2Zvcm1lcmNhbmNlbE9uRXJyb3Jab25lQ2FsbGJhY2tab25lVW5hcnlDYWxsYmFja1pvbmVCaW5hcnlDYWxsYmFja0hhbmRsZVVuY2F1Z2h0RXJyb3JIYW5kbGVyUnVuSGFuZGxlclJ1blVuYXJ5SGFuZGxlclJ1bkJpbmFyeUhhbmRsZXJSZWdpc3RlckNhbGxiYWNrSGFuZGxlclJlZ2lzdGVyVW5hcnlDYWxsYmFja0hhbmRsZXJSZWdpc3RlckJpbmFyeUNhbGxiYWNrSGFuZGxlckVycm9yQ2FsbGJhY2tIYW5kbGVyU2NoZWR1bGVNaWNyb3Rhc2tIYW5kbGVyQ3JlYXRlVGltZXJIYW5kbGVyQ3JlYXRlUGVyaW9kaWNUaW1lckhhbmRsZXJQcmludEhhbmRsZXJGb3JrSGFuZGxlcnNwZWNpZmljYXRpb25fY29tcGxldGVyaXNTeW5jY29tcGxldGVpc0NvbXBsZXRlZHZtOmVudHJ5LXBvaW50aXNBZGRpbmdvbkxpc3RlblJlY2VpdmVkaXNTY2hlZHVsZWRpc1N1c3BlbmRlZEF0WWllbGRjYW5jZWxsYXRpb25Db21wbGV0ZXJvbkxpc3Rlbm9uUmVzdW1lb25DYW5jZWxfZ2VuZXJhdG9ycnVuQm9keXNjaGVkdWxlR2VuZXJhdG9yaXNQYXVzZWR5aWVsZCBiZWZvcmUgc3RyZWFtIGlzIGxpc3RlbmVkIHRvdW5leHBlY3RlZCB5aWVsZGhhc0xpc3RlbmVyd2hlbkRvbmVBZGRpbmdfU2NoZWR1bGVJbW1lZGlhdGVfVGltZXJGYWN0b3J5X2ZhY3RvcnlfQnJvYWRjYXN0U3RyZWFtaXNCcm9hZGNhc3RfQnJvYWRjYXN0U3Vic2NyaXB0aW9uX1NUQVRFX0VWRU5UX0lEX1NUQVRFX0ZJUklOR19TVEFURV9SRU1PVkVfQUZURVJfRklSSU5HX2V2ZW50U3RhdGVfbmV4dF9wcmV2aW91c29uRGF0YV9leHBlY3RzRXZlbnRldmVudElkX3RvZ2dsZUV2ZW50SWRfaXNGaXJpbmdfc2V0UmVtb3ZlQWZ0ZXJGaXJpbmdfcmVtb3ZlQWZ0ZXJGaXJpbmdfb25QYXVzZV9vblJlc3VtZV9Ccm9hZGNhc3RTdHJlYW1Db250cm9sbGVyX1NUQVRFX0lOSVRJQUxfU1RBVEVfQ0xPU0VEX1NUQVRFX0FERFNUUkVBTV9maXJzdFN1YnNjcmlwdGlvbl9sYXN0U3Vic2NyaXB0aW9uX2FkZFN0cmVhbVN0YXRlX2RvbmVGdXR1cmVvblBhdXNlQnJvYWRjYXN0IHN0cmVhbSBjb250cm9sbGVycyBkbyBub3Qgc3VwcG9ydCBwYXVzZSBjYWxsYmFja3NvblBhdXNlSGFuZGxlcm9uUmVzdW1lSGFuZGxlcl9pc0VtcHR5X2hhc09uZUxpc3RlbmVyX2lzQWRkaW5nU3RyZWFtX21heUFkZEV2ZW50X2Vuc3VyZURvbmVGdXR1cmVfYWRkTGlzdGVuZXJvbGRMYXN0X3JlbW92ZUxpc3RlbmVyX2NvbnRyb2xsZXJfc3Vic2NyaWJlX3JlY29yZENhbmNlbF9jYWxsT25DYW5jZWxfcmVjb3JkUGF1c2VfcmVjb3JkUmVzdW1lX2FkZEV2ZW50RXJyb3JDYW5ub3QgYWRkIG5ldyBldmVudHMgYWZ0ZXIgY2FsbGluZyBjbG9zZUNhbm5vdCBhZGQgbmV3IGV2ZW50cyB3aGlsZSBkb2luZyBhbiBhZGRTdHJlYW1fc2VuZERhdGFlcnJvckNhbGxiYWNrX3NlbmRFcnJvcmRvbmVGdXR1cmVfc2VuZERvbmVhZGRTdHJlYW1GdXR1cmVfYWRkRXJyb3JhZGRTdGF0ZV9mb3JFYWNoTGlzdGVuZXJDYW5ub3QgZmlyZSBuZXcgZXZlbnQuIENvbnRyb2xsZXIgaXMgYWxyZWFkeSBmaXJpbmcgYW4gZXZlbnRfbWF5Q29tcGxldGVfYXN5bmNDb21wbGV0ZV9TeW5jQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlcl9Bc3luY0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXJfYWRkUGVuZGluZ19Bc0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXJfaGFzUGVuZGluZ19hZGRQZW5kaW5nRXZlbnRoYW5kbGVOZXh0RGVmZXJyZWRMaWJyYXJ5RGFydCBzZGsgdi4gMS44RGVmZXJyZWRMb2FkRXhjZXB0aW9uRGVmZXJyZWRMb2FkRXhjZXB0aW9uOiAnRnV0dXJlT3IgY2FuJ3QgYmUgaW5zdGFudGlhdGVkX251bGxGdXR1cmVfZmFsc2VGdXR1cmVjb21wdXRhdGlvbl9jb21wbGV0ZW1pY3JvdGFza19hc3luY0NvbXBsZXRlRXJyb3JkZWxheWVkd2FpdGZ1dHVyZXNlYWdlckVycm9yaGFuZGxlRXJyb3J0aGVFcnJvcnRoZVN0YWNrVHJhY2VfY29tcGxldGVFcnJvcl9jb21wbGV0ZVdpdGhWYWx1ZW9uVmFsdWVfa1RydWVkb1doaWxlZG9uZVNpZ25hbG5leHRJdGVyYXRpb25iaW5kVW5hcnlDYWxsYmFja0d1YXJkZWRrZWVwR29pbmdhc1N0cmVhbXRpbWVvdXR0aW1lTGltaXRvblRpbWVvdXRUaW1lb3V0RXhjZXB0aW9uVGltZW91dEV4Y2VwdGlvbiBhZnRlciBfQ29tcGxldGVyRnV0dXJlIGFscmVhZHkgY29tcGxldGVkX0FzeW5jQ29tcGxldGVyX1N5bmNDb21wbGV0ZXJfRnV0dXJlTGlzdGVuZXJtYXNrRXJyb3JtYXNrVGVzdEVycm9ybWFza1doZW5jb21wbGV0ZXN0YXRlQ2hhaW5zdGF0ZVRoZW5zdGF0ZVRoZW5PbmVycm9yc3RhdGVDYXRjaGVycm9yc3RhdGVDYXRjaGVycm9yVGVzdHN0YXRlV2hlbmNvbXBsZXRlX25leHRMaXN0ZW5lcl96b25laGFuZGxlc1ZhbHVlaGFuZGxlc0Vycm9yaGFzRXJyb3JUZXN0aGFuZGxlc0NvbXBsZXRlX29uVmFsdWVfb25FcnJvcl9lcnJvclRlc3Rfd2hlbkNvbXBsZXRlQWN0aW9uaGFzRXJyb3JDYWxsYmFja2hhbmRsZVZhbHVlc291cmNlUmVzdWx0bWF0Y2hlc0Vycm9yVGVzdGFzeW5jRXJyb3JoYW5kbGVXaGVuQ29tcGxldGVfYXdhaXRlcl9zdGF0ZUluY29tcGxldGVfc3RhdGVQZW5kaW5nQ29tcGxldGVfc3RhdGVDaGFpbmVkX3N0YXRlVmFsdWVfc3RhdGVFcnJvcl9yZXN1bHRPckxpc3RlbmVyc2ltbWVkaWF0ZXpvbmVWYWx1ZV9zZXRWYWx1ZWltbWVkaWF0ZUVycm9yX2lzUGVuZGluZ0NvbXBsZXRlX21heUFkZExpc3RlbmVyX2lzQ2hhaW5lZF9pc0NvbXBsZXRlX2hhc0Vycm9yX3NldENoYWluZWRjdXJyZW50Wm9uZXJlZ2lzdGVyVW5hcnlDYWxsYmFja190aGVuTm9ab25lUmVnaXN0cmF0aW9ucmVnaXN0ZXJDYWxsYmFja19zZXRQZW5kaW5nQ29tcGxldGVfY2xlYXJQZW5kaW5nQ29tcGxldGVfZXJyb3JfY2hhaW5Tb3VyY2Vfc2V0RXJyb3JPYmplY3Rfc2V0RXJyb3JfY2xvbmVSZXN1bHRzY2hlZHVsZU1pY3JvdGFza19wcmVwZW5kTGlzdGVuZXJzZXhpc3RpbmdMaXN0ZW5lcnNfcmV2ZXJzZUxpc3RlbmVyc19yZW1vdmVMaXN0ZW5lcnNfY2hhaW5Gb3JlaWduRnV0dXJlX2NoYWluQ29yZUZ1dHVyZV9jaGFpbkZ1dHVyZV9wcm9wYWdhdGVUb0xpc3RlbmVyc2hhc0Vycm9yaGFuZGxlVW5jYXVnaHRFcnJvcmxpc3RlbmVySGFzRXJyb3JsaXN0ZW5lclZhbHVlT3JFcnJvcmluU2FtZUVycm9yWm9uZW9sZFpvbmVoYW5kbGVXaGVuQ29tcGxldGVDYWxsYmFja2NvbXBsZXRlUmVzdWx0b3JpZ2luYWxTb3VyY2VoYW5kbGVWYWx1ZUNhbGxiYWNrY2hhaW5Tb3VyY2V0aW1lckZ1dHVyZSBub3QgY29tcGxldGVkX0FzeW5jQ2FsbGJhY2tFbnRyeV9Bc3luY1J1bl9zY2hlZHVsZUltbWVkaWF0ZU1pY3JvdGFza3MgYXJlIG5vdCBzdXBwb3J0ZWRmcm9tRnV0dXJlX2Nsb3NlVW5jaGVja2VkZnJvbUZ1dHVyZXNmcm9tSXRlcmFibGVwZXJpb2RpY2NvbXB1dGF0aW9uQ291bnR3YXRjaHNlbmRFdmVudHN0YXJ0UGVyaW9kaWNUaW1lcmV2ZW50VHJhbnNmb3JtZWRtYXBTaW5rY2FzdEZyb21hc0Jyb2FkY2FzdFN0cmVhbWFzeW5jTWFwYXN5bmNFeHBhbmRuZXdTdHJlYW1waXBlc3RyZWFtQ29uc3VtZXJzdHJlYW1UcmFuc2Zvcm1lcnNlZW5GaXJzdG5lZWRsZWRyYWluZnV0dXJlVmFsdWVhc0Z1dHVyZWRpc3RpbmN0Zm91bmRSZXN1bHRlbGVtZW50SW5kZXhjcmVhdGVUaW1lck5vIHN0cmVhbSBldmVudHJlZ2lzdGVyZWRPblRpbWVvdXRydW5VbmFyeUd1YXJkZWRTdHJlYW1TdWJzY3JpcHRpb25oYW5kbGVEYXRhaGFuZGxlRG9uZXJlc3VtZVNpZ25hbFN0cmVhbVZpZXdfc3RyZWFtU3RyZWFtQ29uc3VtZXJTdHJlYW1TaW5rU3RyZWFtVHJhbnNmb3JtZXIjdHlwZUFyZzFmcm9tSGFuZGxlcnNmcm9tQmluZDIuMVNTU1RUU1RUUlNSVFN0cmVhbVRyYW5zZm9ybWVyQmFzZV9Db250cm9sbGVyRXZlbnRTaW5rV3JhcHBlclN0cmVhbUNvbnRyb2xsZXJicm9hZGNhc3Rvbkxpc3RlbkhhbmRsZXJvbkNhbmNlbEhhbmRsZXJTeW5jaHJvbm91c1N0cmVhbUNvbnRyb2xsZXJfU3RyZWFtQ29udHJvbGxlckxpZmVjeWNsZV9TdHJlYW1Db250cm9sbGVyQmFzZV9TdHJlYW1Db250cm9sbGVyX1NUQVRFX1NVQlNDUklCRURfU1RBVEVfQ0FOQ0VMRURfU1RBVEVfU1VCU0NSSVBUSU9OX01BU0tfdmFyRGF0YV9pc0NhbmNlbGVkX2lzSW5pdGlhbFN0YXRlX2lzSW5wdXRQYXVzZWRfcGVuZGluZ0V2ZW50c3ZhckRhdGFfZW5zdXJlUGVuZGluZ0V2ZW50c19iYWRFdmVudFN0YXRlQ2Fubm90IGFkZCBldmVudCBhZnRlciBjbG9zaW5nQ2Fubm90IGFkZCBldmVudCB3aGlsZSBhZGRpbmcgYSBzdHJlYW1TdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBsaXN0ZW5lZCB0by5wZW5kaW5nRXZlbnRzX3NldFBlbmRpbmdFdmVudHNfZ3VhcmRDYWxsYmFja19TeW5jU3RyZWFtQ29udHJvbGxlckRpc3BhdGNoX0FzeW5jU3RyZWFtQ29udHJvbGxlckRpc3BhdGNoX0FzeW5jU3RyZWFtQ29udHJvbGxlcl9TeW5jU3RyZWFtQ29udHJvbGxlcl9jcmVhdGVTdWJzY3JpcHRpb25fQ29udHJvbGxlclN1YnNjcmlwdGlvbl9vbkNhbmNlbF9TdHJlYW1TaW5rV3JhcHBlcl9BZGRTdHJlYW1TdGF0ZWFkZFN1YnNjcmlwdGlvbm1ha2VFcnJvckhhbmRsZXJfU3RyZWFtQ29udHJvbGxlckFkZFN0cmVhbVN0YXRlX0V2ZW50U2lua19FdmVudERpc3BhdGNoX0J1ZmZlcmluZ1N0cmVhbVN1YnNjcmlwdGlvbl9TVEFURV9DQU5DRUxfT05fRVJST1JfU1RBVEVfSU5QVVRfUEFVU0VEX1NUQVRFX1dBSVRfRk9SX0NBTkNFTF9TVEFURV9JTl9DQUxMQkFDS19TVEFURV9IQVNfUEVORElOR19TVEFURV9QQVVTRV9DT1VOVF9vbkRhdGFfb25Eb25lX2NhbmNlbEZ1dHVyZXNjaGVkdWxlcmVnaXN0ZXJCaW5hcnlDYWxsYmFja2hhbmRsZUVycm9yIGNhbGxiYWNrIG11c3QgdGFrZSBlaXRoZXIgYW4gT2JqZWN0ICh0aGUgZXJyb3IpLCBvciBib3RoIGFuIE9iamVjdCAodGhlIGVycm9yKSBhbmQgYSBTdGFja1RyYWNlLndhc1BhdXNlZF9pc1BhdXNlZHdhc0lucHV0UGF1c2VkY2FuY2VsU2NoZWR1bGVfaW5DYWxsYmFja19kZWNyZW1lbnRQYXVzZUNvdW50X21heVJlc3VtZUlucHV0X2NhbmNlbGNhbmNlbEZ1dHVyZV93YWl0c0ZvckNhbmNlbF9jYW5GaXJlX2NhbmNlbE9uRXJyb3JwZW5kaW5nX2NoZWNrU3RhdGVzZW5kRXJyb3JydW5CaW5hcnlHdWFyZGVkc2VuZERvbmVydW5HdWFyZGVkaXNJbnB1dFBhdXNlZF9TdHJlYW1JbXBsX29uTGlzdGVuX0dlbmVyYXRlZFN0cmVhbUltcGxfaXNVc2VkX0l0ZXJhYmxlUGVuZGluZ0V2ZW50c19pdGVyYXRvcmRpc3BhdGNoTm8gZXZlbnRzIHBlbmRpbmcuX0RlbGF5ZWRFdmVudHBlcmZvcm1fRGVsYXllZERhdGFfRGVsYXllZEVycm9yX0RlbGF5ZWREb25lTm8gZXZlbnRzIGFmdGVyIGEgZG9uZS5fUGVuZGluZ0V2ZW50c19TVEFURV9VTlNDSEVEVUxFRF9TVEFURV9TQ0hFRFVMRURfZXZlbnRTY2hlZHVsZWRfU3RyZWFtSW1wbEV2ZW50c2ZpcnN0UGVuZGluZ0V2ZW50bGFzdFBlbmRpbmdFdmVudF9Eb25lU3RyZWFtU3Vic2NyaXB0aW9uX0RPTkVfU0VOVF9TQ0hFRFVMRURfUEFVU0VEX3NjaGVkdWxlX2lzU2VudF9pc1NjaGVkdWxlZF9Bc0Jyb2FkY2FzdFN0cmVhbV9vbkxpc3RlbkhhbmRsZXJfb25DYW5jZWxIYW5kbGVyc2h1dGRvd25fY2FuY2VsU3Vic2NyaXB0aW9uX3BhdXNlU3Vic2NyaXB0aW9uX3Jlc3VtZVN1YnNjcmlwdGlvbl9pc1N1YnNjcmlwdGlvblBhdXNlZF9Ccm9hZGNhc3RTdWJzY3JpcHRpb25XcmFwcGVyQ2Fubm90IGNoYW5nZSBoYW5kbGVycyBvZiBhc0Jyb2FkY2FzdFN0cmVhbSBzb3VyY2Ugc3Vic2NyaXB0aW9uLl9zdGF0ZURhdGFBbHJlYWR5IHdhaXRpbmcgZm9yIG5leHQuX2luaXRpYWxpemVPckRvbmVzdGF0ZURhdGFtb3ZlTmV4dEZ1dHVyZV9FbXB0eVN0cmVhbV9Gb3J3YXJkaW5nU3RyZWFtX2hhbmRsZURhdGFfaGFuZGxlRXJyb3JfaGFuZGxlRG9uZV9Gb3J3YXJkaW5nU3RyZWFtU3Vic2NyaXB0aW9uX1doZXJlU3RyZWFtX3Rlc3RpbnB1dEV2ZW50X01hcFN0cmVhbV90cmFuc2Zvcm1vdXRwdXRFdmVudF9FeHBhbmRTdHJlYW1fZXhwYW5kX0hhbmRsZUVycm9yU3RyZWFtX1Rha2VTdHJlYW1fU3RhdGVTdHJlYW1TdWJzY3JpcHRpb25fc2hhcmVkU3RhdGVfZmxhZ19UYWtlV2hpbGVTdHJlYW1fU2tpcFN0cmVhbV9Ta2lwV2hpbGVTdHJlYW1oYXNGYWlsZWRfRGlzdGluY3RTdHJlYW1fU0VOVElORUxwcmV2aW91c0V2ZW50aXNFcXVhbF9FdmVudFNpbmtXcmFwcGVyX1NpbmtUcmFuc2Zvcm1lclN0cmVhbVN1YnNjcmlwdGlvbl90cmFuc2Zvcm1lclNpbmttYXBwZXJldmVudFNpbmtfaXNTdWJzY3JpYmVkU3RyZWFtIGlzIGFscmVhZHkgY2xvc2VkX1N0cmVhbVNpbmtUcmFuc2Zvcm1lcl9zaW5rTWFwcGVyX0JvdW5kU2lua1N0cmVhbV9IYW5kbGVyRXZlbnRTaW5rVGhlIHByb3ZpZGVkIHNpbmsgbXVzdCBub3QgYmUgbnVsbC5TaW5rIGlzIGNsb3NlZF9TdHJlYW1IYW5kbGVyVHJhbnNmb3JtZXJvdXRwdXRTaW5rX1N0cmVhbUJpbmRUcmFuc2Zvcm1lcl9iaW5kX1N0cmVhbVN1YnNjcmlwdGlvblRyYW5zZm9ybWVyX0JvdW5kU3Vic2NyaXB0aW9uU3RyZWFtVGltZXJiaW5kQ2FsbGJhY2tHdWFyZGVkY3JlYXRlUGVyaW9kaWNUaW1lcmJvdW5kQ2FsbGJhY2t0aWNrX2NyZWF0ZVRpbWVyVGltZXIgaW50ZXJmYWNlIG5vdCBzdXBwb3J0ZWQuX2NyZWF0ZVBlcmlvZGljVGltZXJBc3luY0Vycm9yX3N0YWNrVHJhY2Vfc3RhY2tUcmFjZT1fWm9uZUZ1bmN0aW9uZm9ya19ab25lU3BlY2lmaWNhdGlvbmVycm9yWm9uZW90aGVyWm9uZWFyZ3VtZW50MWFyZ3VtZW50MmJpbmRDYWxsYmFja2JpbmRVbmFyeUNhbGxiYWNrYmluZEJpbmFyeUNhbGxiYWNrYmluZEJpbmFyeUNhbGxiYWNrR3VhcmRlZF9lbnRlcl9sZWF2ZV9ab25lRGVsZWdhdGVfZGVsZWdhdGlvblRhcmdldGltcGxlbWVudGF0aW9uX2hhbmRsZVVuY2F1Z2h0RXJyb3JpbXBsWm9uZV9yZWdpc3RlckNhbGxiYWNrX3JlZ2lzdGVyVW5hcnlDYWxsYmFja19yZWdpc3RlckJpbmFyeUNhbGxiYWNrX2Vycm9yQ2FsbGJhY2tfc2NoZWR1bGVNaWNyb3Rhc2tfcHJpbnRfZm9ya19ab25lX0N1c3RvbVpvbmVfZGVsZWdhdGVDYWNoZXJlZ2lzdGVyZWRwYXJlbnREZWxlZ2F0ZWltcGxlbWVudGF0aW9uWm9uZV9Sb290Wm9uZV9yb290TWFwX3Jvb3REZWxlZ2F0ZV9sb2FkZWRMaWJyYXJpZXNfbmV4dENhbGxiYWNrX2xhc3RDYWxsYmFja19sYXN0UHJpb3JpdHlDYWxsYmFja19pc0luQ2FsbGJhY2tMb29wX3Jvb3Rab25lX2ZhdGFsRGFydEFzeW5jX2ZhdGFsdGhlbkNhbGxiYWNrYXdhaXRlclN0YWNrVHJhY2VfYXN5bmNTdGFja1RyYWNlSGVscGVyYXN5bmNfb3BfY2xlYXJBc3luY1RocmVhZFN0YWNrVHJhY2VTdGFja1RyYWNlX2NsZWFyQXN5bmNUaHJlYWRTdGFja1RyYWNlX3NldEFzeW5jVGhyZWFkU3RhY2tUcmFjZVN0YWNrVHJhY2Vfc2V0QXN5bmNUaHJlYWRTdGFja1RyYWNlX21vdmVOZXh0RGVidWdnZXJTdGVwQ2hlY2tBc3luY1N0YXJNb3ZlTmV4dF9kZWJ1Z2dlclN0ZXBDaGVja19zZXRTY2hlZHVsZUltbWVkaWF0ZUNsb3N1cmVfZW5zdXJlU2NoZWR1bGVJbW1lZGlhdGVfaW52b2tlRXJyb3JIYW5kbGVydW5hcnlFcnJvckhhbmRsZXJfY29tcGxldGVXaXRoRXJyb3JDYWxsYmFja19hc3luY0NvbXBsZXRlV2l0aEVycm9yQ2FsbGJhY2tfbm9uTnVsbEVycm9yX3JlZ2lzdGVyRXJyb3JIYW5kbGVyRXJyb3IgaGFuZGxlciBtdXN0IGFjY2VwdCBvbmUgT2JqZWN0IG9yIG9uZSBPYmplY3QgYW5kIGEgU3RhY2tUcmFjZSBhcyBhcmd1bWVudHMsIGFuZCByZXR1cm4gYSBhIHZhbGlkIHJlc3VsdF9taWNyb3Rhc2tMb29wX3N0YXJ0TWljcm90YXNrTG9vcF9zY2hlZHVsZUFzeW5jQ2FsbGJhY2tuZXdFbnRyeV9zY2hlZHVsZVByaW9yaXR5QXN5bmNDYWxsYmFja19ydW5HdWFyZGVkbm90aWZpY2F0aW9uSGFuZGxlcl9udWxsRGF0YUhhbmRsZXJfbnVsbEVycm9ySGFuZGxlcl9udWxsRG9uZUhhbmRsZXJfcnVuVXNlckNvZGVvblN1Y2Nlc3NfY2FuY2VsQW5kRXJyb3JfY2FuY2VsQW5kRXJyb3JXaXRoUmVwbGFjZW1lbnRfY2FuY2VsQW5kRXJyb3JDbG9zdXJlX2NhbmNlbEFuZFZhbHVlX2FkZEVycm9yV2l0aFJlcGxhY2VtZW50X3BhcmVudERlbGVnYXRlX3Jvb3RIYW5kbGVVbmNhdWdodEVycm9yX3JldGhyb3dBc3luY19yZXRocm93X3Jvb3RSdW5fcm9vdFJ1blVuYXJ5X3Jvb3RSdW5CaW5hcnlfcm9vdFJlZ2lzdGVyQ2FsbGJhY2tfcm9vdFJlZ2lzdGVyVW5hcnlDYWxsYmFja19yb290UmVnaXN0ZXJCaW5hcnlDYWxsYmFja19yb290RXJyb3JDYWxsYmFja19yb290U2NoZWR1bGVNaWNyb3Rhc2toYXNFcnJvckhhbmRsZXJfcm9vdENyZWF0ZVRpbWVyX3Jvb3RDcmVhdGVQZXJpb2RpY1RpbWVyX3Jvb3RQcmludF9wcmludFRvWm9uZV9yb290Rm9ya1pvbmVTcGVjaWZpY2F0aW9ucyBtdXN0IGJlIGluc3RhbnRpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBjb25zdHJ1Y3Rvci52YWx1ZU1hcHVuYXJ5T25FcnJvcmJpbmFyeU9uRXJyb3JvbkVycm9yIGNhbGxiYWNrIG11c3QgdGFrZSBlaXRoZXIgYW4gT2JqZWN0IF9ydW5ab25lZGRhcnQuY29sbGVjdGlvbmNvbGxlY3Rpb25zLmRhcnRoYXNoX21hcC5kYXJ0aGFzaF9zZXQuZGFydGl0ZXJhYmxlLmRhcnRpdGVyYXRvci5kYXJ0bGlua2VkX2hhc2hfbWFwLmRhcnRsaW5rZWRfaGFzaF9zZXQuZGFydGxpbmtlZF9saXN0LmRhcnRsaXN0LmRhcnRtYXBzLmRhcnRxdWV1ZS5kYXJ0c2V0LmRhcnRzcGxheV90cmVlLmRhcnRfSGFzaGVyX0hhc2hNYXBfZWxlbWVudENvdW50X2J1Y2tldHNfbW9kaWZpY2F0aW9uQ291bnRidWNrZXRzX2FkZEVudHJ5c3RhbXBfcmVtb3ZlRW50cnlwcmV2aW91c0luQnVja2V0YnVja2V0SW5kZXhuZXdFbGVtZW50c19yZXNpemVvbGRCdWNrZXRzbmV3QnVja2V0c19uZXdLZXlTZXRfQ3VzdG9tSGFzaE1hcF92YWxpZEtleXZhbGlkS2V5X0lkZW50aXR5SGFzaE1hcF9IYXNoTWFwRW50cnlfSGFzaE1hcEl0ZXJhYmxlX0hhc2hNYXBLZXlJdGVyYWJsZV9IYXNoTWFwVmFsdWVJdGVyYWJsZV9IYXNoTWFwSXRlcmF0b3Jfc3RhbXBfZW50cnlfSGFzaE1hcEtleUl0ZXJhdG9yX0hhc2hNYXBWYWx1ZUl0ZXJhdG9yX0hhc2hTZXRfbmV3RW1wdHlfcmVtb3ZlX2ZpbHRlcldoZXJlcmVtb3ZlTWF0Y2hpbmdtb2RpZmljYXRpb25Db3VudHRlc3RSZXN1bHRfbmV3U2ltaWxhclNldF9JZGVudGl0eUhhc2hTZXRfQ3VzdG9tSGFzaFNldF9lcXVhbGl0eV9oYXNoZXJfSGFzaFNldEVudHJ5X0hhc2hTZXRJdGVyYXRvcl9IYXNoRmllbGRCYXNlX2hhc2hNYXNrX3VzZWREYXRhX2RlbGV0ZWRLZXlzZGF0YVNpemVfSGFzaFZNQmFzZXZtOmV4YWN0LXJlc3VsdC10eXBlZGFydDp0eXBlZF9kYXRhI19VaW50MzJMaXN0TGlua2VkSGFzaE1hcF9nZXRJbmRleExpbmtlZEhhc2hNYXBfc2V0SW5kZXhkYXJ0OmNvcmUjX1NtaUxpbmtlZEhhc2hNYXBfZ2V0SGFzaE1hc2tMaW5rZWRIYXNoTWFwX3NldEhhc2hNYXNrZGFydDpjb3JlI19MaXN0TGlua2VkSGFzaE1hcF9nZXREYXRhTGlua2VkSGFzaE1hcF9zZXREYXRhTGlua2VkSGFzaE1hcF9nZXRVc2VkRGF0YUxpbmtlZEhhc2hNYXBfc2V0VXNlZERhdGFMaW5rZWRIYXNoTWFwX2dldERlbGV0ZWRLZXlzTGlua2VkSGFzaE1hcF9zZXREZWxldGVkS2V5c19IYXNoQmFzZV9JTklUSUFMX0lOREVYX0JJVFNfSU5JVElBTF9JTkRFWF9TSVpFX1VOVVNFRF9QQUlSX0RFTEVURURfUEFJUl9pbmRleFNpemVUb0hhc2hNYXNraW5kZXhTaXplaW5kZXhCaXRzX2hhc2hQYXR0ZXJuZnVsbEhhc2hoYXNoTWFza21hc2tlZEhhc2hfZmlyc3RQcm9iZXNpemVNYXNrX25leHRQcm9iZV9pc0RlbGV0ZWRrZXlPclZhbHVlX3NldERlbGV0ZWRBdF9jaGVja1N1bV9pc01vZGlmaWVkU2luY2VvbGREYXRhb2xkQ2hlY2tTdW1fT3BlcmF0b3JFcXVhbHNBbmRIYXNoQ29kZV9JZGVudGljYWxBbmRJZGVudGl0eUhhc2hDb2RlX19JbnRlcm5hbExpbmtlZEhhc2hNYXAmX0hhc2hWTUJhc2UmTWFwTWl4aW5LZXkgbm90IGluIG1hcC5uZXdFbnRyaWVzX19JbnRlcm5hbExpbmtlZEhhc2hNYXAmX0hhc2hWTUJhc2UmTWFwTWl4aW4mX0xpbmtlZEhhc2hNYXBNaXhpbl9yZWhhc2hfaW5pdG9sZFVzZWRfcmVnZW5lcmF0ZUluZGV4dG1wVXNlZF9pbnNlcnRoYXNoUGF0dGVybl9maW5kVmFsdWVPckluc2VydFBvaW50bWF4RW50cmllc2ZpcnN0RGVsZXRlZF9nZXRWYWx1ZU9yRGF0YWtpdmlfX0ludGVybmFsTGlua2VkSGFzaE1hcCZfSGFzaFZNQmFzZSZNYXBNaXhpbiZfTGlua2VkSGFzaE1hcE1peGluJl9IYXNoQmFzZV9fSW50ZXJuYWxMaW5rZWRIYXNoTWFwJl9IYXNoVk1CYXNlJk1hcE1peGluJl9MaW5rZWRIYXNoTWFwTWl4aW4mX0hhc2hCYXNlJl9PcGVyYXRvckVxdWFsc0FuZEhhc2hDb2RlX0ludGVybmFsTGlua2VkSGFzaE1hcF9MaW5rZWRIYXNoTWFwTWl4aW5fX0NvbXBhY3RMaW5rZWRJZGVudGl0eUhhc2hNYXAmX0hhc2hGaWVsZEJhc2UmTWFwTWl4aW5fX0NvbXBhY3RMaW5rZWRJZGVudGl0eUhhc2hNYXAmX0hhc2hGaWVsZEJhc2UmTWFwTWl4aW4mX0xpbmtlZEhhc2hNYXBNaXhpbl9fQ29tcGFjdExpbmtlZElkZW50aXR5SGFzaE1hcCZfSGFzaEZpZWxkQmFzZSZNYXBNaXhpbiZfTGlua2VkSGFzaE1hcE1peGluJl9IYXNoQmFzZV9fQ29tcGFjdExpbmtlZElkZW50aXR5SGFzaE1hcCZfSGFzaEZpZWxkQmFzZSZNYXBNaXhpbiZfTGlua2VkSGFzaE1hcE1peGluJl9IYXNoQmFzZSZfSWRlbnRpY2FsQW5kSWRlbnRpdHlIYXNoQ29kZV9Db21wYWN0TGlua2VkSWRlbnRpdHlIYXNoTWFwX19Db21wYWN0TGlua2VkQ3VzdG9tSGFzaE1hcCZfSGFzaEZpZWxkQmFzZSZNYXBNaXhpbl9fQ29tcGFjdExpbmtlZEN1c3RvbUhhc2hNYXAmX0hhc2hGaWVsZEJhc2UmTWFwTWl4aW4mX0xpbmtlZEhhc2hNYXBNaXhpbl9fQ29tcGFjdExpbmtlZEN1c3RvbUhhc2hNYXAmX0hhc2hGaWVsZEJhc2UmTWFwTWl4aW4mX0xpbmtlZEhhc2hNYXBNaXhpbiZfSGFzaEJhc2VfQ29tcGFjdExpbmtlZEN1c3RvbUhhc2hNYXBfQ29tcGFjdEl0ZXJhYmxlX2xlbl9zdGVwX0NvbXBhY3RJdGVyYXRvcl9fQ29tcGFjdExpbmtlZEhhc2hTZXQmX0hhc2hGaWVsZEJhc2UmX0hhc2hCYXNlX19Db21wYWN0TGlua2VkSGFzaFNldCZfSGFzaEZpZWxkQmFzZSZfSGFzaEJhc2UmX09wZXJhdG9yRXF1YWxzQW5kSGFzaENvZGVfX0NvbXBhY3RMaW5rZWRIYXNoU2V0Jl9IYXNoRmllbGRCYXNlJl9IYXNoQmFzZSZfT3BlcmF0b3JFcXVhbHNBbmRIYXNoQ29kZSZTZXRNaXhpbml0Zm91bmRNYXRjaGluZ19Db21wYWN0TGlua2VkSGFzaFNldF9nZXRLZXlPckRhdGFfX0NvbXBhY3RMaW5rZWRJZGVudGl0eUhhc2hTZXQmX0NvbXBhY3RMaW5rZWRIYXNoU2V0Jl9JZGVudGljYWxBbmRJZGVudGl0eUhhc2hDb2RlX0NvbXBhY3RMaW5rZWRJZGVudGl0eUhhc2hTZXRfQ29tcGFjdExpbmtlZEN1c3RvbUhhc2hTZXRmcm9tSXRlcmFibGVzZnJvbUVudHJpZXNIYXNoU2V0aXRlcmFibGVUb1Nob3J0U3RyaW5nbGVmdERlbGltaXRlcnJpZ2h0RGVsaW1pdGVyKC4uLilpdGVyYWJsZVRvRnVsbFN0cmluZ0hhc05leHRJdGVyYXRvcl9IQVNfTkVYVF9BTkRfTkVYVF9JTl9DVVJSRU5UX05PX05FWFRfTk9UX01PVkVEX1lFVF9tb3ZlTm8gbW9yZSBlbGVtZW50c0xpbmtlZExpc3RfZmlyc3RfaW5zZXJ0QmVmb3JldXBkYXRlRmlyc3RfdW5saW5rVG9vIG1hbnkgZWxlbWVudHNMaW5rZWRMaXN0RW50cnkgaXMgYWxyZWFkeSBpbiBhIExpbmtlZExpc3RfTGlua2VkTGlzdEl0ZXJhdG9yX3Zpc2l0ZWRGaXJzdExpbmtlZExpc3RFbnRyeXVubGlua2luc2VydEFmdGVyaW5zZXJ0QmVmb3JlX0xpc3RCYXNlJk9iamVjdCZMaXN0TWl4aW5saXN0VG9TdHJpbmdtYXBUb1N0cmluZ19pZF9maWxsTWFwV2l0aE1hcHBlZEl0ZXJhYmxlX2ZpbGxNYXBXaXRoSXRlcmFibGVza2V5SXRlcmF0b3J2YWx1ZUl0ZXJhdG9yaGFzTmV4dEtleWhhc05leHRWYWx1ZUl0ZXJhYmxlcyBkbyBub3QgaGF2ZSBzYW1lIGxlbmd0aC5NYXBNaXhpblVubW9kaWZpYWJsZU1hcEJhc2VDYW5ub3QgbW9kaWZ5IHVubW9kaWZpYWJsZSBtYXBfTWFwQmFzZVZhbHVlSXRlcmFibGVfTWFwQmFzZVZhbHVlSXRlcmF0b3JfVW5tb2RpZmlhYmxlTWFwTWl4aW5NYXBWaWV3X1VubW9kaWZpYWJsZU1hcFZpZXcmTWFwVmlldyZfVW5tb2RpZmlhYmxlTWFwTWl4aW5fRG91YmxlTGlua19wcmV2aW91c0xpbmtfbmV4dExpbmtEb3VibGVMaW5rZWRRdWV1ZUVudHJ5cHJldmlvdXNFbnRyeW5leHRFbnRyeV9Eb3VibGVMaW5rZWRRdWV1ZUVudHJ5X2FzTm9uU2VudGluZWxFbnRyeV9hcHBlbmRfcHJlcGVuZF9Eb3VibGVMaW5rZWRRdWV1ZUVsZW1lbnRfRG91YmxlTGlua2VkUXVldWVTZW50aW5lbERvdWJsZUxpbmtlZFF1ZXVlX3NlbnRpbmVsbGFzdEVudHJ5Zmlyc3RFbnRyeWZvckVhY2hFbnRyeV9Eb3VibGVMaW5rZWRRdWV1ZUl0ZXJhdG9yX25leHRFbnRyeXNlbnRpbmVsZWxlbWVudEVudHJ5TGlzdFF1ZXVlX2NoZWNrTW9kaWZpY2F0aW9uZXhwZWN0ZWRNb2RpZmljYXRpb25Db3VudHN0YXJ0RGlzdGFuY2VlbmREaXN0YW5jZXByZXZPZmZzZXRfTGlzdFF1ZXVlSXRlcmF0b3JfcG9zaXRpb25TZXRNaXhpbl9TZXRCYXNlJk9iamVjdCZTZXRNaXhpbnNldFRvU3RyaW5nX1NldEJhc2VDYW5ub3QgY2hhbmdlIHVubW9kaWZpYWJsZSBzZXRfU3BsYXlUcmVlTm9kZV9TcGxheVRyZWVNYXBOb2RlX1NwbGF5VHJlZV9zcGxheUNvdW50X2R1bW15X2NvbXBhcmF0b3JfY29tcGFyZV9zcGxheV9zcGxheU1pbl9zcGxheU1heF9hZGROZXdSb290X2xhc3RfY2xlYXJfVHlwZVRlc3RfU3BsYXlUcmVlTWFwJl9TcGxheVRyZWUmTWFwTWl4aW5TcGxheVRyZWVNYXBtYXBSb290c3BsYXlDb3VudGluaXRpYWxTcGxheUNvdW50Zmlyc3RLZXlsYXN0S2V5bGFzdEtleUJlZm9yZWZpcnN0S2V5QWZ0ZXJfU3BsYXlUcmVlSXRlcmF0b3JfdHJlZV93b3JrTGlzdF9maW5kTGVmdE1vc3REZXNjZW5kZW50c3RhcnRBdHN0YXJ0S2V5X2dldFZhbHVlX3JlYnVpbGRXb3JrTGlzdF9TcGxheVRyZWVLZXlJdGVyYWJsZV9jb3B5Tm9kZV9TcGxheVRyZWVWYWx1ZUl0ZXJhYmxlX1NwbGF5VHJlZUtleUl0ZXJhdG9yX1NwbGF5VHJlZVZhbHVlSXRlcmF0b3JtYXBOb2RlX1NwbGF5VHJlZU5vZGVJdGVyYXRvcl9TcGxheVRyZWVTZXQmX1NwbGF5VHJlZSZJdGVyYWJsZU1peGluX1NwbGF5VHJlZVNldCZfU3BsYXlUcmVlJkl0ZXJhYmxlTWl4aW4mU2V0TWl4aW5TcGxheVRyZWVTZXRfTU9ESUZJQ0FUSU9OX0NPVU5UX01BU0tfcmVoYXNoT2JqZWN0c19kZWZhdWx0RXF1YWxzX2RlZmF1bHRIYXNoQ29kZV9pdGVyYWJsZVBhcnRzVG9TdHJpbmdzbGVuZ3RoTGltaXRoZWFkQ291bnR0YWlsQ291bnRtYXhDb3VudG92ZXJoZWFkZWxsaXBzaXNTaXplcGVudWx0aW1hdGVTdHJpbmd1bHRpbWF0ZVN0cmluZ3BlbnVsdGltYXRldWx0aW1hdGVlbGlzaW9uX2R5bmFtaWNDb21wYXJlX2RlZmF1bHRDb21wYXJlZGFydC5jb252ZXJ0UE9XRVJTX09GX1RFTkNsYXNzSURDYXN0Q29udmVydGVycGFyc2VIZXhCeXRlYXNjaWkuZGFydGJhc2U2NC5kYXJ0Ynl0ZV9jb252ZXJzaW9uLmRhcnRjaHVua2VkX2NvbnZlcnNpb24uZGFydGNvZGVjLmRhcnRjb252ZXJ0ZXIuZGFydGVuY29kaW5nLmRhcnRodG1sX2VzY2FwZS5kYXJ0anNvbi5kYXJ0bGF0aW4xLmRhcnRsaW5lX3NwbGl0dGVyLmRhcnRzdHJpbmdfY29udmVyc2lvbi5kYXJ0dXRmLmRhcnRfSnNvblV0ZjhEZWNvZGVyX3Jldml2ZXJfYWxsb3dNYWxmb3JtZWRjaHVua0VuZF9Kc29uTGlzdGVuZXJoYW5kbGVTdHJpbmdoYW5kbGVOdW1iZXJoYW5kbGVCb29saGFuZGxlTnVsbGJlZ2luT2JqZWN0cHJvcGVydHlWYWx1ZWVuZE9iamVjdGJlZ2luQXJyYXlhcnJheUVsZW1lbnRlbmRBcnJheV9CdWlsZEpzb25MaXN0ZW5lcnB1c2hDb250YWluZXJwb3BDb250YWluZXJfUmV2aXZlckpzb25MaXN0ZW5lcnJldml2ZXJfTnVtYmVyQnVmZmVybWluQ2FwYWNpdHlrRGVmYXVsdE92ZXJoZWFkX2luaXRpYWxDYXBhY2l0eWVuc3VyZUNhcGFjaXR5cGFyc2VOdW1wYXJzZURvdWJsZV9DaHVua2VkSnNvblBhcnNlclRPUF9MRVZFTElOU0lERV9BUlJBWUlOU0lERV9PQkpFQ1RBRlRFUl9DT0xPTkFMTE9XX1NUUklOR19NQVNLQUxMT1dfVkFMVUVfTUFTS0FMTE9XX1ZBTFVFU1RSSU5HX09OTFlOT19WQUxVRVNOT05fRU1QVFlFTVBUWV9NQVNLU1RBVEVfSU5JVElBTFNUQVRFX0VORFNUQVRFX0FSUkFZX0VNUFRZU1RBVEVfQVJSQVlfVkFMVUVTVEFURV9BUlJBWV9DT01NQVNUQVRFX09CSkVDVF9FTVBUWVNUQVRFX09CSkVDVF9LRVlTVEFURV9PQkpFQ1RfQ09MT05TVEFURV9PQkpFQ1RfVkFMVUVTVEFURV9PQkpFQ1RfQ09NTUFWQUxVRV9SRUFEX0JJVFNCQUNLU1BBQ0VUQUJORVdMSU5FQ0FSUklBR0VfUkVUVVJORk9STV9GRUVEUVVPVEVERUNJTUFMUE9JTlRDSEFSXzBDSEFSXzlDSEFSX0VMQlJBQ0tFVFJCUkFDS0VUQ0hBUl9hQ0hBUl9iQ0hBUl9lQ0hBUl9mQ0hBUl9sQ0hBUl9uQ0hBUl9yQ0hBUl9zQ0hBUl90Q0hBUl91Tk9fUEFSVElBTFBBUlRJQUxfU1RSSU5HUEFSVElBTF9OVU1FUkFMUEFSVElBTF9LRVlXT1JETUFTS19QQVJUSUFMTlVNX1NJR05OVU1fWkVST05VTV9ESUdJVE5VTV9ET1ROVU1fRE9UX0RJR0lUTlVNX0VOVU1fRV9TSUdOTlVNX0VfRElHSVROVU1fU1VDQ0VTU1NUUl9QTEFJTlNUUl9FU0NBUEVTVFJfVVNUUl9VX0NPVU5UX1NISUZUU1RSX1VfVkFMVUVfU0hJRlRLV0RfVFlQRV9NQVNLS1dEX1RZUEVfU0hJRlRLV0RfTlVMTEtXRF9UUlVFS1dEX0ZBTFNFS1dEX0JPTUtXRF9DT1VOVF9TSElGVFRXT19CSVRfTUFTS3BhcnRpYWxTdGF0ZXNhdmVTdGF0ZXJlc3RvcmVTdGF0ZXBhcnRpYWxUeXBlbnVtU3RhdGVmaW5pc2hDaHVua051bWJlclVudGVybWluYXRlZCBzdHJpbmdnZXRDaGFyY29weUNoYXJzVG9MaXN0YmVnaW5TdHJpbmdhZGRDaGFyVG9TdHJpbmdhZGRTbGljZVRvU3RyaW5nZW5kU3RyaW5nYXNjaWlCaXRzcGFyc2VQYXJ0aWFscGFyc2VQYXJ0aWFsU3RyaW5ncGFyc2VQYXJ0aWFsTnVtYmVycGFyc2VQYXJ0aWFsS2V5d29yZGNvbnRpbnVlQ2h1bmtOdW1iZXJwYXJzZVN0cmluZ1RvQnVmZmVycGFyc2VTdHJpbmdFc2NhcGVjaHVua1N0cmluZ0VzY2FwZVVwYXJzZUhleERpZ2l0SW52YWxpZCBoZXggZGlnaXRrZXl3b3JkVHlwZWtleXdvcmRUeXBlSW5kZXjDr8K7wr9leHBlY3RlZENoYXJwYXJzZVN0cmluZ3BhcnNlTnVsbHBhcnNlRmFsc2VwYXJzZVRydWVwYXJzZU51bWJlcnBhcnNlS2V5d29yZFByZWZpeGNoYXJzc2xpY2VFbmRDb250cm9sIGNoYXJhY3RlciBpbiBzdHJpbmdjaHVua1N0cmluZ3N0cmluZ1N0YXRlcXVvdGVQb3NpdGlvbmhleFN0YXJ0SW52YWxpZCB1bmljb2RlIGVzY2FwZVVucmVjb2duaXplZCBzdHJpbmcgZXNjYXBlYmVnaW5DaHVua051bWJlcmFkZE51bWJlckNodW5rVW50ZXJtaW5hdGVkIG51bWJlciBsaXRlcmFsTWlzc2luZyBleHBlY3RlZCBkaWdpdGRpZ2l0Q291bnRoaWdoRGlnaXQ5MjIzMzcyMDM2ODU0Nzc1ODBleHBTaWduZXhwb25lbnRPdmVyZmxvd2JpdEZsYWdtYXhFeGFjdERvdWJsZXNpZ25lZE1hbnRpc3NhVW5leHBlY3RlZCBjaGFyYWN0ZXJVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dF9Kc29uU3RyaW5nUGFyc2VyX0pzb25TdHJpbmdEZWNvZGVyU2lua19wYXJzZXJfY3JlYXRlUGFyc2VyX1V0ZjhTdHJpbmdCdWZmZXJJTklUSUFMX0NBUEFDSVRZTUFTS19UV09fQklUTUFTS19TSVpFU0hJRlRfTUlTU0lOR1NISUZUX1ZBTFVFTUFYX0FTQ0lJTUFYX1RXT19CWVRFTUFYX1RIUkVFX0JZVEVNQVhfVU5JQ09ERU1BU0tfVFdPX0JZVEVNQVNLX1RIUkVFX0JZVEVNQVNLX0ZPVVJfQllURU1BU0tfQ09OVElOVUVfVEFHTUFTS19DT05USU5VRV9WQUxVRUNPTlRJTlVFX1RBR0xFQURfU1VSUk9HQVRFVEFJTF9TVVJST0dBVEVTSElGVF9ISUdIX1NVUlJPR0FURU1BU0tfTE9XX1NVUlJPR0FURWlzTGF0aW4xYWRkQ29udGludWF0aW9ubWlzc2luZ2NvZGVFbmRhZGRDaGFyQ29kZUV4cGVjdGVkIFVURi04IGNvbnRpbnVhdGlvbiBieXRlLCBmb3VuZCBJbnZhbGlkIGVuY29kaW5nOiBVKyBlbmNvZGVkIGluICBieXRlcy5JbmNvbXBsZXRlIFVURi04IHNlcXVlbmNlX3RvMTZCaXRjb250aW51ZUJ5dGVDb3VudFVuZXhwZWN0ZWQgVVRGLTggY29udGludWF0aW9uIGJ5dGVJbnZhbGlkIFVURi04IGJ5dGU6IHNlZW5CeXRlQ291bnRfSnNvblV0ZjhQYXJzZXJtYXhBc2NpaUNoYXJfSnNvblV0ZjhEZWNvZGVyU2lua19hZGRDaHVua0FzY2lpQ29kZWNfYWxsb3dJbnZhbGlkYWxsb3dJbnZhbGlkdXMtYXNjaWlfVW5pY29kZVN1YnNldEVuY29kZXJfc3Vic2V0TWFza3N0cmluZ0xlbmd0aENvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycy5Bc2NpaUVuY29kZXJfVW5pY29kZVN1YnNldEVuY29kZXJTaW5rU291cmNlIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyIHdpdGggY29kZSBwb2ludDogX1VuaWNvZGVTdWJzZXREZWNvZGVySW52YWxpZCB2YWx1ZSBpbiBpbnB1dDogX2NvbnZlcnRJbnZhbGlkQXNjaWlEZWNvZGVyc3RyaW5nU2lua19FcnJvckhhbmRsaW5nQXNjaWlEZWNvZGVyU2lua191dGY4U2lua19TaW1wbGVBc2NpaURlY29kZXJTaW5rU291cmNlIGNvbnRhaW5zIG5vbi1BU0NJSSBieXRlcy5CYXNlNjRDb2RlY19lbmNvZGVydXJsU2FmZWFscGhhYmV0aW52ZXJzZUFscGhhYmV0Zmlyc3RQYWRkaW5nZmlyc3RQYWRkaW5nU291cmNlSW5kZXhwYWRkaW5nQ291bnRvcmlnaW5hbENoYXJJbnZhbGlkIGJhc2U2NCBkYXRhZW5kTGVuZ3RoSW52YWxpZCBiYXNlNjQgZW5jb2RpbmcgbGVuZ3RoIF9jaGVja1BhZGRpbmdzb3VyY2VJbmRleEludmFsaWQgYmFzZTY0IHBhZGRpbmcsIHBhZGRlZCBsZW5ndGggbXVzdCBiZSBtdWx0aXBsZSBvZiBmb3VyLCBpcyBJbnZhbGlkIGJhc2U2NCBwYWRkaW5nLCAnPScgbm90IGF0IHRoZSBlbmRJbnZhbGlkIGJhc2U2NCBwYWRkaW5nLCBtb3JlIHRoYW4gdHdvICc9JyBjaGFyYWN0ZXJzQmFzZTY0RW5jb2Rlcl91cmxTYWZlX0Jhc2U2NEVuY29kZXJfYmFzZTY0QWxwaGFiZXRBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvX2Jhc2U2NFVybEFscGhhYmV0QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktX192YWx1ZVNoaWZ0X2NvdW50TWFza19zaXhCaXRNYXNrX2FscGhhYmV0X2VuY29kZVN0YXRlX3N0YXRlQml0c19zdGF0ZUNvdW50Y3JlYXRlQnVmZmVyZnVsbENodW5rc3BhcnRpYWxDaHVua0xlbmd0aGVuY29kZUNodW5rb3V0cHV0SW5kZXhleHBlY3RlZENoYXJzTm90IGEgYnl0ZSB2YWx1ZSBhdCBpbmRleCA6IDB4d3JpdGVGaW5hbENodW5rX0J1ZmZlckNhY2hpbmdCYXNlNjRFbmNvZGVyYnVmZmVyQ2FjaGVfQmFzZTY0RW5jb2RlclNpbmtfQXNjaWlCYXNlNjRFbmNvZGVyU2lua19VdGY4QmFzZTY0RW5jb2RlclNpbmtCYXNlNjREZWNvZGVyX0Jhc2U2NERlY29kZXJfaW52YWxpZF9wYWRkaW5nX3BfaW52ZXJzZUFscGhhYmV0X2NoYXJfcGVyY2VudF9jaGFyXzNfY2hhcl9kX2VuY29kZUNoYXJhY3RlclN0YXRlX2VuY29kZVBhZGRpbmdTdGF0ZWV4cGVjdGVkUGFkZGluZ19zdGF0ZVBhZGRpbmdfaGFzU2VlblBhZGRpbmdNaXNzaW5nIHBhZGRpbmcgY2hhcmFjdGVySW52YWxpZCBsZW5ndGgsIG11c3QgYmUgbXVsdGlwbGUgb2YgZm91cmRlY29kZUNodW5rb3V0SW5kZXhhc2NpaU1hc2thc2NpaU1heGVpZ2h0Qml0TWFza2JpdHNQZXJDaGFyYWN0ZXJjaGFyT3JJbnZhbGlkIGVuY29kaW5nIGJlZm9yZSBwYWRkaW5nSW52YWxpZCBjaGFyYWN0ZXJfYWxsb2NhdGVCdWZmZXJwYWRkaW5nU3RhcnRyZW1haW5kZXJMZW5ndGhfdHJpbVBhZGRpbmdDaGFyc25ld0VuZGV4cGVjdGVkUGFydGlhbFBhZGRpbmdJbnZhbGlkIHBhZGRpbmcgY2hhcmFjdGVyX0Jhc2U2NERlY29kZXJTaW5rX2RlY29kZXJCeXRlQ29udmVyc2lvblNpbmt3aXRoQ2FsbGJhY2tCeXRlQ29udmVyc2lvblNpbmtCYXNlX0J5dGVBZGFwdGVyU2lua19CeXRlQ2FsbGJhY2tTaW5rX0lOSVRJQUxfQlVGRkVSX1NJWkVfY2FsbGJhY2tfYnVmZmVySW5kZXhmcmVlQ291bnRncm93bl9yb3VuZFRvUG93ZXJPZjJfU2ltcGxlQ2FsbGJhY2tTaW5rX2FjY3VtdWxhdGVkX0NvbnZlcnRlclN0cmVhbUV2ZW50U2lua19ldmVudFNpbmtfY2h1bmtlZFNpbmtDb2RlY2Z1c2VpbnZlcnRlZF9GdXNlZENvZGVjX3NlY29uZF9JbnZlcnRlZENvZGVjX2NvZGVjY29kZWNDb252ZXJ0ZXJUaGlzIGNvbnZlcnRlciBkb2VzIG5vdCBzdXBwb3J0IGNodW5rZWQgY29udmVyc2lvbnM6IF9GdXNlZENvbnZlcnRlcl9uYW1lVG9FbmNvZGluZ2lzb184ODU5LTE6MTk4N2lzby1pci0xMDBpc29fODg1OS0xaXNvLTg4NTktMWxhdGluMWwxaWJtODE5Y3A4MTljc2lzb2xhdGluMWlzby1pci02YW5zaV94My40LTE5NjhhbnNpX3gzLjQtMTk4Nmlzb182NDYuaXJ2OjE5OTFpc282NDYtdXN1c2libTM2N2NwMzY3Y3Nhc2NpaWNzdXRmOHV0Zi04ZGVjb2RlU3RyZWFtYnl0ZVN0cmVhbWdldEJ5TmFtZUh0bWxFc2NhcGVNb2RlZXNjYXBlTHRHdGVzY2FwZVF1b3Rlc2NhcGVBcG9zZXNjYXBlU2xhc2hhdHRyaWJ1dGVzcUF0dHJpYnV0ZWN1c3RvbUh0bWxFc2NhcGUmYW1wOyZxdW90OyYjMzk7JiM0NztfSHRtbEVzY2FwZVNpbmtKc29uVW5zdXBwb3J0ZWRPYmplY3RFcnJvcnVuc3VwcG9ydGVkT2JqZWN0cGFydGlhbFJlc3VsdHNhZmVTdHJpbmdDb252ZXJ0aW5nIG9iamVjdCB0byBhbiBlbmNvZGFibGUgb2JqZWN0IGZhaWxlZDpDb252ZXJ0aW5nIG9iamVjdCBkaWQgbm90IHJldHVybiBhbiBlbmNvZGFibGUgb2JqZWN0Okpzb25DeWNsaWNFcnJvckN5Y2xpYyBlcnJvciBpbiBKU09OIHN0cmluZ2lmeUpzb25Db2RlY190b0VuY29kYWJsZXRvRW5jb2RhYmxld2l0aFJldml2ZXJ3aXRoSW5kZW50SnNvblV0ZjhFbmNvZGVyX2RlZmF1bHRCdWZmZXJTaXplREVGQVVMVF9CVUZGRVJfU0laRV9pbmRlbnRfYnVmZmVyU2l6ZWJ1ZmZlclNpemVfdXRmOEVuY29kZWFkZENodW5rYnl0ZUxpc3RfSnNvbkVuY29kZXJTaW5rX2lzRG9uZU9ubHkgb25lIGNhbGwgdG8gYWRkIGFsbG93ZWRhc1N0cmluZ1NpbmtfSnNvblV0ZjhFbmNvZGVyU2lua0pzb25EZWNvZGVyX0pzb25TdHJpbmdpZmllcmJhY2tzcGFjZXRhYm5ld2xpbmVjYXJyaWFnZVJldHVybmZvcm1GZWVkY2hhcl8wYmFja3NsYXNoY2hhcl9iY2hhcl9mY2hhcl9uY2hhcl9yY2hhcl90Y2hhcl91X3NlZW5fcGFydGlhbFJlc3VsdGNoYXJhY3RlcnN3cml0ZVN0cmluZ1NsaWNld3JpdGVOdW1iZXJ3cml0ZVN0cmluZ0NvbnRlbnRfY2hlY2tDeWNsZV9yZW1vdmVTZWVud3JpdGVPYmplY3R3cml0ZUpzb25WYWx1ZWN1c3RvbUpzb253cml0ZU1hcGtleVZhbHVlTGlzdGFsbFN0cmluZ0tleXMsIiI6X0pzb25QcmV0dHlQcmludE1peGluaW5kZW50TGV2ZWxfSnNvblN0cmluZ1N0cmluZ2lmaWVyX19Kc29uU3RyaW5nU3RyaW5naWZpZXJQcmV0dHkmX0pzb25TdHJpbmdTdHJpbmdpZmllciZfSnNvblByZXR0eVByaW50TWl4aW5fSnNvblN0cmluZ1N0cmluZ2lmaWVyUHJldHR5X0pzb25VdGY4U3RyaW5naWZpZXJ3cml0ZUFzY2lpU3RyaW5nd3JpdGVGb3VyQnl0ZUNoYXJDb2Rld3JpdGVNdWx0aUJ5dGVDaGFyQ29kZV9fSnNvblV0ZjhTdHJpbmdpZmllclByZXR0eSZfSnNvblV0ZjhTdHJpbmdpZmllciZfSnNvblByZXR0eVByaW50TWl4aW5fSnNvblV0ZjhTdHJpbmdpZmllclByZXR0eUxhdGluMUNvZGVjTGF0aW4xRW5jb2RlckxhdGluMURlY29kZXJfTGF0aW4xRGVjb2RlclNpbmtfYWRkU2xpY2VUb1NpbmtfY2hlY2tWYWxpZExhdGluMV9yZXBvcnRJbnZhbGlkTGF0aW4xU291cmNlIGNvbnRhaW5zIG5vbi1MYXRpbi0xIGNoYXJhY3RlcnMuX0xhdGluMUFsbG93SW52YWxpZERlY29kZXJTaW5rcHJldmlvdXNDaGFyX0xpbmVTcGxpdHRlclNpbmtfY2Fycnlfc2tpcExlYWRpbmdMRl9hZGRMaW5lc19MaW5lU3BsaXR0ZXJFdmVudFNpbmtmcm9tU3RyaW5nU2lua0Nsb3NhYmxlU3RyaW5nU2lua19DbG9zYWJsZVN0cmluZ1NpbmtfU3RyaW5nQ29udmVyc2lvblNpbmtBc1N0cmluZ1NpbmtBZGFwdGVyX01JTl9TVFJJTkdfU0laRVN0cmluZ0NvbnZlcnNpb25TaW5rQmFzZVN0cmluZ0NvbnZlcnNpb25TaW5rTWl4aW5fU3RyaW5nU2lua0NvbnZlcnNpb25TaW5rVFN0cmluZ1Npbmtfc3RyaW5nU2lua19TdHJpbmdDYWxsYmFja1NpbmtfU3RyaW5nQWRhcHRlclNpbmtfVXRmOFN0cmluZ1NpbmtBZGFwdGVyZW5kSW5kZXhfVXRmOENvbnZlcnNpb25TaW5rc3RyaW5nQnVmZmVyVXRmOENvZGVjVXRmOEVuY29kZXJfZmlsbEJ1ZmZlcmxhc3RDb2RlVW5pdHdhc0NvbWJpbmVkX3dyaXRlU3Vycm9nYXRlX1V0ZjhFbmNvZGVyX0RFRkFVTFRfQllURV9CVUZGRVJfU0laRXdpdGhCdWZmZXJTaXplbGVhZGluZ1N1cnJvZ2F0ZW5leHRDb2RlVW5pdHN0cmluZ0luZGV4X19VdGY4RW5jb2RlclNpbmsmX1V0ZjhFbmNvZGVyJlN0cmluZ0NvbnZlcnNpb25TaW5rTWl4aW5fVXRmOEVuY29kZXJTaW5raXNMYXN0U2xpY2VoYXNCZWVuQ29tYmluZWRVdGY4RGVjb2Rlcm9uZUJ5dGVzaXNGaXJzdENoYXJhY3RlcmZpcnN0UGFydF9pc0ZpcnN0Q2hhcmFjdGVyX2NvbnZlcnRJbnRlcmNlcHRlZF9VdGY4RGVjb2Rlcl9leHBlY3RlZFVuaXRzX2V4dHJhVW5pdHNfTElNSVRTaGFzUGFydGlhbElucHV0VW5maW5pc2hlZCBVVEYtOCBvY3RldCBzZXF1ZW5jZWV4cGVjdGVkVW5pdHNleHRyYVVuaXRzQmFkIFVURi04IGVuY29kaW5nIDB4T3ZlcmxvbmcgZW5jb2Rpbmcgb2YgMHhDaGFyYWN0ZXIgb3V0c2lkZSB2YWxpZCBVbmljb2RlIHJhbmdlOiBOZWdhdGl2ZSBVVEYtOCBjb2RlIHVuaXQ6IC0weF9hc2NpaU1hc2tiYXNlNjRiYXNlNjRVcmxfcGFkZGluZ0NoYXJodG1sRXNjYXBlX2xhdGluMU1hc2tfTEZfQ1JfT05FX0JZVEVfTElNSVRfVFdPX0JZVEVfTElNSVRfVEhSRUVfQllURV9MSU1JVF9GT1VSX0JZVEVfTElNSVRfU1VSUk9HQVRFX1RBR19NQVNLX1NVUlJPR0FURV9WQUxVRV9NQVNLX0xFQURfU1VSUk9HQVRFX01JTl9UQUlMX1NVUlJPR0FURV9NSU5fcGFyc2VEb3VibGVEb3VibGVfcGFyc2ViYXNlNjRFbmNvZGViYXNlNjRVcmxFbmNvZGViYXNlNjREZWNvZGVfcGFyc2VKc29uX2RlZmF1bHRUb0VuY29kYWJsZV9pc0xlYWRTdXJyb2dhdGVfaXNUYWlsU3Vycm9nYXRlX2NvbWJpbmVTdXJyb2dhdGVQYWlybGVhZF9zY2FuT25lQnl0ZUNoYXJhY3RlcnN1bml0c2RhcnQuZGV2ZWxvcGVyU2VuZFBvcnRSYXdSZWNlaXZlUG9ydGV4dGVuc2lvbi5kYXJ0cHJvZmlsZXIuZGFydHNlcnZpY2UuZGFydHRpbWVsaW5lLmRhcnRTZXJ2aWNlRXh0ZW5zaW9uSGFuZGxlclRpbWVsaW5lU3luY0Z1bmN0aW9uVGltZWxpbmVBc3luY0Z1bmN0aW9uX1VzZXJUYWdVc2VyVGFnX25ld1VzZXJUYWdfbGFiZWxtYWtlQ3VycmVudFVzZXJUYWdfbWFrZUN1cnJlbnRTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2VfZXJyb3JDb2RlX2Vycm9yRGV0YWlsa0ludmFsaWRQYXJhbXNrRXh0ZW5zaW9uRXJyb3JrRXh0ZW5zaW9uRXJyb3JNYXhrRXh0ZW5zaW9uRXJyb3JNaW5pbnZhbGlkUGFyYW1zZXh0ZW5zaW9uRXJyb3JleHRlbnNpb25FcnJvck1heGV4dGVuc2lvbkVycm9yTWluZXJyb3JEZXRhaWxfZXJyb3JDb2RlTWVzc2FnZUludmFsaWQgcGFyYW1zU2VydmVyIGVycm9yX3ZhbGlkYXRlRXJyb3JDb2RlT3V0IG9mIHJhbmdlX2lzRXJyb3JfdG9TdHJpbmdVc2VyVGFnTUFYX1VTRVJfVEFHU2RlZmF1bHRUYWdNZXRyaWNJbnZhbGlkIE1ldHJpYyBuYW1lLl90b0pTT05HYXVnZW1pbiBtdXN0IGJlIGxlc3MgdGhhbiBtYXhtZXRyaWNzL0NvdW50ZXJNZXRyaWNzX21ldHJpY3NtZXRyaWNSZWdpc3RlcmVkIG1ldHJpY3MgaGF2ZSB1bmlxdWUgbmFtZXNkZXJlZ2lzdGVyX3ByaW50TWV0cmljX3ByaW50TWV0cmljc2RhcnQudm0ucHJvZHVjdG1ldHJpY3NNZXRyaWNMaXN0U2VydmljZVByb3RvY29sSW5mb21ham9yVmVyc2lvbkRhcnQgVk0gU2VydmljZSBQcm90b2NvbCB2bGlzdGVuaW5nIG9uIFNlcnZpY2VnZXRJbmZvcmVjZWl2ZVBvcnR1cmlDb21wbGV0ZXJzZW5kUG9ydGNvbnRyb2xXZWJTZXJ2ZXJlbmFibGVnZXRJc29sYXRlSURjb250cm9sUG9ydEZsb3dUaW1lbGluZXN0YXJ0U3luY19hcmd1bWVudHNmaW5pc2hTeW5jVW5ldmVuIGNhbGxzIHRvIHN0YXJ0U3luYyBhbmQgZmluaXNoU3luY2luc3RhbnRTeW5jaW5zdGFudEFyZ3VtZW50c3RpbWVTeW5jVGltZWxpbmVUYXNrX3Rhc2tJZHdpdGhUYXNrSWR0YXNrSWRpbnN0YW50VW5ldmVuIGNhbGxzIHRvIHN0YXJ0IGFuZCBmaW5pc2hwYXNzWW91IGNhbm5vdCBwYXNzIGEgVGltZWxpbmVUYXNrIHdpdGhvdXQgZmluaXNoaW5nIGFsbCBzdGFydGVkIG9wZXJhdGlvbnNfQXN5bmNCbG9ja19TeW5jQmxvY2tfc3RhcnRDcHVfZmxvd19uZXh0U2VxdWVuY2VOdW1iZXJfaGFzVGltZWxpbmVkYXJ0LmRldmVsb3Blci50aW1lbGluZURldmVsb3Blcl9sb2d0aW1lc3RhbXBfcnVuRXh0ZW5zaW9ucGFyYW1ldGVyS2V5c3BhcmFtZXRlclZhbHVlc3JlcGx5UG9ydHRyYWNlX3NlcnZpY2VlcnJvckRldGFpbHNFeHRlbnNpb24gaGFuZGxlciBtdXN0IHJldHVybiBhIEZ1dHVyZUV4dGVuc2lvbiBoYW5kbGVyIG11c3QgY29tcGxldGUgdG8gYSBTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2VfcG9zdFJlc3BvbnNldm0tc2VydmljZTogcG9zdGluZyBubyByZXNwb25zZSBmb3IgcmVxdWVzdHsianNvbnJwYyI6IjIuMCIsdm0tc2VydmljZTogcG9zdGluZyBlcnJvciByZXNwb25zZSBmb3IgcmVxdWVzdCAiZXJyb3IiOnZtLXNlcnZpY2U6IHBvc3RpbmcgcmVzcG9uc2UgZm9yIHJlcXVlc3QgInJlc3VsdCI6ImlkIjoiIn0iaWQiOl9nZXRDdXJyZW50VGFnUHJvZmlsZXJfZ2V0Q3VycmVudFRhZ19nZXREZWZhdWx0VGFnVXNlclRhZ19kZWZhdWx0VGFnRGV2ZWxvcGVyX2RlYnVnZ2Vyd2hlbmluc3BlY3REZXZlbG9wZXJfaW5zcGVjdE11c3QgYmUgYSBTdHJpbmdNdXN0IGJlIGEgRGF0ZVRpbWVyZWdpc3RlckV4dGVuc2lvbmV4dC5NdXN0IGJlZ2luIHdpdGggZXh0LkV4dGVuc2lvbiBhbHJlYWR5IHJlZ2lzdGVyZWQ6IHBvc3RFdmVudGV2ZW50S2luZGV2ZW50RGF0YWV2ZW50RGF0YUFzU3RyaW5nX3Bvc3RFdmVudERldmVsb3Blcl9wb3N0RXZlbnRfbG9va3VwRXh0ZW5zaW9uRGV2ZWxvcGVyX2xvb2t1cEV4dGVuc2lvbl9yZWdpc3RlckV4dGVuc2lvbkRldmVsb3Blcl9yZWdpc3RlckV4dGVuc2lvbmdldEN1cnJlbnRUYWdfZ2V0U2VydmVySW5mb0RldmVsb3Blcl9nZXRTZXJ2ZXJJbmZvX3dlYlNlcnZlckNvbnRyb2xEZXZlbG9wZXJfd2ViU2VydmVyQ29udHJvbF9nZXRTZXJ2aWNlTWFqb3JWZXJzaW9uRGV2ZWxvcGVyX2dldFNlcnZpY2VNYWpvclZlcnNpb25fZ2V0U2VydmljZU1pbm9yVmVyc2lvbkRldmVsb3Blcl9nZXRTZXJ2aWNlTWlub3JWZXJzaW9uX2dldElzb2xhdGVJREZyb21TZW5kUG9ydERldmVsb3Blcl9nZXRJc29sYXRlSURGcm9tU2VuZFBvcnRfYXJndW1lbnRzQXNKc29uX2lzRGFydFN0cmVhbUVuYWJsZWRUaW1lbGluZV9pc0RhcnRTdHJlYW1FbmFibGVkX2dldE5leHRBc3luY0lkVGltZWxpbmVfZ2V0TmV4dEFzeW5jSWRfZ2V0VHJhY2VDbG9ja1RpbWVsaW5lX2dldFRyYWNlQ2xvY2tfZ2V0VGhyZWFkQ3B1Q2xvY2tUaW1lbGluZV9nZXRUaHJlYWRDcHVDbG9ja19yZXBvcnRUYXNrRXZlbnRUaW1lbGluZV9yZXBvcnRUYXNrRXZlbnRhcmd1bWVudHNBc0pzb25fcmVwb3J0Q29tcGxldGVFdmVudFRpbWVsaW5lX3JlcG9ydENvbXBsZXRlRXZlbnRzdGFydENwdV9yZXBvcnRGbG93RXZlbnRUaW1lbGluZV9yZXBvcnRGbG93RXZlbnRfcmVwb3J0SW5zdGFudEV2ZW50VGltZWxpbmVfcmVwb3J0SW5zdGFudEV2ZW50ZGFydC5mZmluYXRpdmVfdHlwZS5kYXJ0YW5ub3RhdGlvbnMuZGFydGR5bmFtaWNfbGlicmFyeS5kYXJ0UG9pbnRlckZmaV9zdG9yZUZmaV9sb2FkYWRkcmVzc0ZmaV9hZGRyZXNzRmZpX2VsZW1lbnRBdG9mZnNldEJ5RmZpX29mZnNldEJ5RmZpX2Nhc3Rhc0Z1bmN0aW9uRmZpX2FzRnVuY3Rpb25GZmlfZnJlZU5hdGl2ZVR5cGVfTmF0aXZlSW50ZWdlcl9OYXRpdmVEb3VibGVJbnQ4SW50MTZJbnQzMkludDY0VWludDhVaW50MTZVaW50MzJVaW50NjRJbnRQdHJGbG9hdFZvaWROYXRpdmVGdW5jdGlvblN0cnVjdERhcnRSZXByZXNlbnRhdGlvbk9mVW5zaXplZER5bmFtaWNMaWJyYXJ5Z2V0SGFuZGxlRmZpX2RsX2dldEhhbmRsZUZmaV9kbF9sb29rdXBzeW1ib2xOYW1lbG9va3VwRnVuY3Rpb25zdHJ1Y3R1bnNpemVkX29wZW5GZmlfZGxfb3BlbmFsbG9jYXRlRmZpX2FsbG9jYXRlZnJvbUFkZHJlc3NGZmlfZnJvbUFkZHJlc3NwdHJGZmlfc2l6ZU9mZnJvbUZ1bmN0aW9uRmZpX2Zyb21GdW5jdGlvbmRhcnQuX2ludGVybmFsSW50MzJMaXN0YXN5bmNfY2FzdC5kYXJ0Y2FzdC5kYXJ0cHJpbnQuZGFydHNvcnQuZGFydHN5bWJvbC5kYXJ0X1ByaW50Q2xvc3VyZV9FbGVtZW50UHJlZGljYXRlX0V4cGFuZEZ1bmN0aW9udGltZXJGYWN0b3J5ZXZlbnRIYW5kbGVyU2VuZERhdGF0aW1lck1pbGxpc2Vjb25kQ2xvY2tyZXNvdXJjZVJlYWRBc0J5dGVzcGFja2FnZVJvb3RTdHJpbmdwYWNrYWdlQ29uZmlnU3RyaW5ncGFja2FnZVJvb3RVcmlGdXR1cmVwYWNrYWdlQ29uZmlnVXJpRnV0dXJlcmVzb2x2ZVBhY2thZ2VVcmlGdXR1cmVfY29tcHV0ZVNjcmlwdFVyaV9jYWNoZWRTY3JpcHRwbGF0Zm9ybVNjcmlwdExpc3Rzc3JjU3RhcnRkc3RTdGFydGNpZEFycmF5Y2lkRXh0ZXJuYWxPbmVCeXRlU3RyaW5nY2lkR3Jvd2FibGVPYmplY3RBcnJheWNpZEltbXV0YWJsZUFycmF5Y2lkT25lQnl0ZVN0cmluZ2NpZFR3b0J5dGVTdHJpbmdjaWRVaW50OEFycmF5Vmlld2dldElEQ2xhc3NJRF9nZXRJRF9QYXRjaENvZGVVbml0c19zdHJpbmdzdHJpbmdPZjIuMkh0dHBTdGF0dXNjb250aW51ZV9zd2l0Y2hpbmdQcm90b2NvbHNwcm9jZXNzaW5nb2tjcmVhdGVkYWNjZXB0ZWRub25BdXRob3JpdGF0aXZlSW5mb3JtYXRpb25ub0NvbnRlbnRyZXNldENvbnRlbnRwYXJ0aWFsQ29udGVudG11bHRpU3RhdHVzYWxyZWFkeVJlcG9ydGVkaW1Vc2VkbXVsdGlwbGVDaG9pY2VzbW92ZWRQZXJtYW5lbnRseW1vdmVkVGVtcG9yYXJpbHlzZWVPdGhlcm5vdE1vZGlmaWVkdXNlUHJveHl0ZW1wb3JhcnlSZWRpcmVjdHBlcm1hbmVudFJlZGlyZWN0YmFkUmVxdWVzdHVuYXV0aG9yaXplZHBheW1lbnRSZXF1aXJlZGZvcmJpZGRlbm1ldGhvZE5vdEFsbG93ZWRub3RBY2NlcHRhYmxlcHJveHlBdXRoZW50aWNhdGlvblJlcXVpcmVkcmVxdWVzdFRpbWVvdXRjb25mbGljdGdvbmVsZW5ndGhSZXF1aXJlZHByZWNvbmRpdGlvbkZhaWxlZHJlcXVlc3RFbnRpdHlUb29MYXJnZXJlcXVlc3RVcmlUb29Mb25ndW5zdXBwb3J0ZWRNZWRpYVR5cGVyZXF1ZXN0ZWRSYW5nZU5vdFNhdGlzZmlhYmxlZXhwZWN0YXRpb25GYWlsZWRtaXNkaXJlY3RlZFJlcXVlc3R1bnByb2Nlc3NhYmxlRW50aXR5bG9ja2VkZmFpbGVkRGVwZW5kZW5jeXVwZ3JhZGVSZXF1aXJlZHByZWNvbmRpdGlvblJlcXVpcmVkdG9vTWFueVJlcXVlc3RzcmVxdWVzdEhlYWRlckZpZWxkc1Rvb0xhcmdlY29ubmVjdGlvbkNsb3NlZFdpdGhvdXRSZXNwb25zZXVuYXZhaWxhYmxlRm9yTGVnYWxSZWFzb25zY2xpZW50Q2xvc2VkUmVxdWVzdGludGVybmFsU2VydmVyRXJyb3Jub3RJbXBsZW1lbnRlZGJhZEdhdGV3YXlzZXJ2aWNlVW5hdmFpbGFibGVnYXRld2F5VGltZW91dGh0dHBWZXJzaW9uTm90U3VwcG9ydGVkdmFyaWFudEFsc29OZWdvdGlhdGVzaW5zdWZmaWNpZW50U3RvcmFnZWxvb3BEZXRlY3RlZG5vdEV4dGVuZGVkbmV0d29ya0F1dGhlbnRpY2F0aW9uUmVxdWlyZWRuZXR3b3JrQ29ubmVjdFRpbWVvdXRFcnJvclVzZSBjb250aW51ZV8gaW5zdGVhZFNXSVRDSElOR19QUk9UT0NPTFNVc2Ugc3dpdGNoaW5nUHJvdG9jb2xzIGluc3RlYWRPS1VzZSBvayBpbnN0ZWFkQ1JFQVRFRFVzZSBjcmVhdGVkIGluc3RlYWRBQ0NFUFRFRFVzZSBhY2NlcHRlZCBpbnN0ZWFkTk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT05Vc2Ugbm9uQXV0aG9yaXRhdGl2ZUluZm9ybWF0aW9uIGluc3RlYWROT19DT05URU5UVXNlIG5vQ29udGVudCBpbnN0ZWFkUkVTRVRfQ09OVEVOVFVzZSByZXNldENvbnRlbnQgaW5zdGVhZFBBUlRJQUxfQ09OVEVOVFVzZSBwYXJ0aWFsQ29udGVudCBpbnN0ZWFkTVVMVElQTEVfQ0hPSUNFU1VzZSBtdWx0aXBsZUNob2ljZXMgaW5zdGVhZE1PVkVEX1BFUk1BTkVOVExZVXNlIG1vdmVkUGVybWFuZW50bHkgaW5zdGVhZEZPVU5EVXNlIGZvdW5kIGluc3RlYWRNT1ZFRF9URU1QT1JBUklMWVVzZSBtb3ZlZFRlbXBvcmFyaWx5IGluc3RlYWRTRUVfT1RIRVJVc2Ugc2VlT3RoZXIgaW5zdGVhZE5PVF9NT0RJRklFRFVzZSBub3RNb2RpZmllZCBpbnN0ZWFkVVNFX1BST1hZVXNlIHVzZVByb3h5IGluc3RlYWRURU1QT1JBUllfUkVESVJFQ1RVc2UgdGVtcG9yYXJ5UmVkaXJlY3QgaW5zdGVhZEJBRF9SRVFVRVNUVXNlIGJhZFJlcXVlc3QgaW5zdGVhZFVOQVVUSE9SSVpFRFVzZSB1bmF1dGhvcml6ZWQgaW5zdGVhZFBBWU1FTlRfUkVRVUlSRURVc2UgcGF5bWVudFJlcXVpcmVkIGluc3RlYWRGT1JCSURERU5Vc2UgZm9yYmlkZGVuIGluc3RlYWROT1RfRk9VTkRVc2Ugbm90Rm91bmQgaW5zdGVhZE1FVEhPRF9OT1RfQUxMT1dFRFVzZSBtZXRob2ROb3RBbGxvd2VkIGluc3RlYWROT1RfQUNDRVBUQUJMRVVzZSBub3RBY2NlcHRhYmxlIGluc3RlYWRQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRFVzZSBwcm94eUF1dGhlbnRpY2F0aW9uUmVxdWlyZWQgaW5zdGVhZFJFUVVFU1RfVElNRU9VVFVzZSByZXF1ZXN0VGltZW91dCBpbnN0ZWFkQ09ORkxJQ1RVc2UgY29uZmxpY3QgaW5zdGVhZEdPTkVVc2UgZ29uZSBpbnN0ZWFkTEVOR1RIX1JFUVVJUkVEVXNlIGxlbmd0aFJlcXVpcmVkIGluc3RlYWRQUkVDT05ESVRJT05fRkFJTEVEVXNlIHByZWNvbmRpdGlvbkZhaWxlZCBpbnN0ZWFkUkVRVUVTVF9FTlRJVFlfVE9PX0xBUkdFVXNlIHJlcXVlc3RFbnRpdHlUb29MYXJnZSBpbnN0ZWFkUkVRVUVTVF9VUklfVE9PX0xPTkdVc2UgcmVxdWVzdFVyaVRvb0xvbmcgaW5zdGVhZFVOU1VQUE9SVEVEX01FRElBX1RZUEVVc2UgdW5zdXBwb3J0ZWRNZWRpYVR5cGUgaW5zdGVhZFJFUVVFU1RFRF9SQU5HRV9OT1RfU0FUSVNGSUFCTEVVc2UgcmVxdWVzdGVkUmFuZ2VOb3RTYXRpc2ZpYWJsZSBpbnN0ZWFkRVhQRUNUQVRJT05fRkFJTEVEVXNlIGV4cGVjdGF0aW9uRmFpbGVkIGluc3RlYWRVUEdSQURFX1JFUVVJUkVEVXNlIHVwZ3JhZGVSZXF1aXJlZCBpbnN0ZWFkSU5URVJOQUxfU0VSVkVSX0VSUk9SVXNlIGludGVybmFsU2VydmVyRXJyb3IgaW5zdGVhZE5PVF9JTVBMRU1FTlRFRFVzZSBub3RJbXBsZW1lbnRlZCBpbnN0ZWFkQkFEX0dBVEVXQVlVc2UgYmFkR2F0ZXdheSBpbnN0ZWFkU0VSVklDRV9VTkFWQUlMQUJMRVVzZSBzZXJ2aWNlVW5hdmFpbGFibGUgaW5zdGVhZEdBVEVXQVlfVElNRU9VVFVzZSBnYXRld2F5VGltZW91dCBpbnN0ZWFkSFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURURVc2UgaHR0cFZlcnNpb25Ob3RTdXBwb3J0ZWQgaW5zdGVhZE5FVFdPUktfQ09OTkVDVF9USU1FT1VUX0VSUk9SVXNlIG5ldHdvcmtDb25uZWN0VGltZW91dEVycm9yIGluc3RlYWRDYXN0U3RyZWFtU3Vic2NyaXB0aW9uX0Nhc3RJdGVyYWJsZUJhc2VDYXN0SXRlcmF0b3JDYXN0SXRlcmFibGVfRWZmaWNpZW50TGVuZ3RoQ2FzdEl0ZXJhYmxlX19DYXN0TGlzdEJhc2UmX0Nhc3RJdGVyYWJsZUJhc2UmTGlzdE1peGluX0Nhc3RMaXN0QmFzZXYxQ2FzdExpc3RDYXN0U2V0X2RlZmF1bHRFbXB0eVNldF9jb25kaXRpb25hbEFkZG90aGVyQ29udGFpbnNjYXN0RWxlbWVudENhc3RNYXBTS1NWQ2FzdFF1ZXVlRWZmaWNpZW50TGVuZ3RoSXRlcmFibGVMaXN0SXRlcmFibGVTdWJMaXN0SXRlcmFibGVfZW5kT3JMZW5ndGhfZW5kSW5kZXhyZWFsSW5kZXhuZXdTdGFydExpc3RJdGVyYXRvck1hcHBlZEl0ZXJhYmxlX2ZFZmZpY2llbnRMZW5ndGhNYXBwZWRJdGVyYWJsZU1hcHBlZEl0ZXJhdG9yTWFwcGVkTGlzdEl0ZXJhYmxlV2hlcmVJdGVyYWJsZVdoZXJlSXRlcmF0b3JFeHBhbmRJdGVyYWJsZUV4cGFuZEl0ZXJhdG9yX2N1cnJlbnRFeHBhbnNpb25UYWtlSXRlcmFibGVfdGFrZUNvdW50dGFrZUNvdW50RWZmaWNpZW50TGVuZ3RoVGFrZUl0ZXJhYmxlaXRlcmFibGVMZW5ndGhUYWtlSXRlcmF0b3JUYWtlV2hpbGVJdGVyYWJsZVRha2VXaGlsZUl0ZXJhdG9yX2lzRmluaXNoZWRTa2lwSXRlcmFibGVfc2tpcENvdW50RWZmaWNpZW50TGVuZ3RoU2tpcEl0ZXJhYmxlU2tpcEl0ZXJhdG9yU2tpcFdoaWxlSXRlcmFibGVTa2lwV2hpbGVJdGVyYXRvcl9oYXNTa2lwcGVkRW1wdHlJdGVyYWJsZUZvbGxvd2VkQnlJdGVyYWJsZWZpcnN0RWZmaWNpZW50RWZmaWNpZW50TGVuZ3RoRm9sbG93ZWRCeUl0ZXJhYmxlRm9sbG93ZWRCeUl0ZXJhdG9yX25leHRJdGVyYWJsZVdoZXJlVHlwZUl0ZXJhYmxlV2hlcmVUeXBlSXRlcmF0b3Jub0VsZW1lbnR0b29NYW55dG9vRmV3Rml4ZWRMZW5ndGhMaXN0TWl4aW5DYW5ub3QgYWRkIHRvIGEgZml4ZWQtbGVuZ3RoIGxpc3RDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdENhbm5vdCBjbGVhciBhIGZpeGVkLWxlbmd0aCBsaXN0VW5tb2RpZmlhYmxlTGlzdE1peGluQ2Fubm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgbGlzdENhbm5vdCBjaGFuZ2UgdGhlIGxlbmd0aCBvZiBhbiB1bm1vZGlmaWFibGUgbGlzdENhbm5vdCBhZGQgdG8gYW4gdW5tb2RpZmlhYmxlIGxpc3RDYW5ub3QgcmVtb3ZlIGZyb20gYW4gdW5tb2RpZmlhYmxlIGxpc3RDYW5ub3QgY2xlYXIgYW4gdW5tb2RpZmlhYmxlIGxpc3RGaXhlZExlbmd0aExpc3RCYXNlVW5tb2RpZmlhYmxlTGlzdEJhc2VfTGlzdEluZGljZXNJdGVyYWJsZV9iYWNrZWRMaXN0TGlzdE1hcFZpZXdSZXZlcnNlZExpc3RJdGVyYWJsZVVubW9kaWZpYWJsZUxpc3RFcnJvckNhbm5vdCBhZGQgdG8gdW5tb2RpZmlhYmxlIExpc3RDYW5ub3QgY2hhbmdlIHRoZSBjb250ZW50IG9mIGFuIHVubW9kaWZpYWJsZSBMaXN0Q2Fubm90IGNoYW5nZSBsZW5ndGggb2YgdW5tb2RpZmlhYmxlIExpc3RDYW5ub3QgcmVtb3ZlIGZyb20gdW5tb2RpZmlhYmxlIExpc3ROb25Hcm93YWJsZUxpc3RFcnJvckNhbm5vdCBhZGQgdG8gbm9uLWdyb3dhYmxlIExpc3RDYW5ub3QgY2hhbmdlIGxlbmd0aCBvZiBub24tZ3Jvd2FibGUgTGlzdENhbm5vdCByZW1vdmUgZnJvbSBub24tZ3Jvd2FibGUgTGlzdFNvcnRfSU5TRVJUSU9OX1NPUlRfVEhSRVNIT0xEc29ydFJhbmdlT3V0T2ZSYW5nZV9kb1NvcnRfaW5zZXJ0aW9uU29ydGVsX2R1YWxQaXZvdFF1aWNrc29ydHNpeHRoaW5kZXgxaW5kZXg1aW5kZXgzaW5kZXgyaW5kZXg0ZWwxZWwyZWwzZWw0ZWw1cGl2b3QxcGl2b3QyZ3JlYXRwaXZvdHNfYXJlX2VxdWFsYWtjb21wX3Bpdm90MWNvbXBfcGl2b3QycmVzZXJ2ZWRXb3JkUkUoPzphc3NlcnR8YnJlYWt8Yyg/OmEoPzpzZXx0Y2gpfGxhc3N8b24oPzpzdHx0aW51ZSkpfGQoPzplZmF1bHR8byl8ZSg/OmxzZXxudW18eHRlbmRzKXxmKD86YWxzZXxpbmFsKD86bHkpP3xvcil8aVtmbnNdfG4oPzpld3x1bGwpfHJldCg/Omhyb3d8dXJuKXxzKD86dXBlcnx3aXRjaCl8dCg/OmgoPzppc3xyb3cpfHIoPzp1ZXx5KSl8dig/OmFyfG9pZCl8dyg/OmhpbGV8aXRoKSlwdWJsaWNJZGVudGlmaWVyUkUoPyFcYig/IVwkKSlbYS16QS1aJF1bXHckXSpcYig/IVwkKSlbYS16QS1aJF9dW1x3JF0qb3BlcmF0b3JSRSg/OltcLSsqLyUmfF5dfFxbXF09P3w9PXx+Lz98PFs8PV0/fD5bPj1dP3x1bmFyeS0pcHVibGljU3ltYm9sUGF0dGVybl4oPzokfCg/Oj0/JHxbLl0oPyEkKSkpKz8kc3ltYm9sUGF0dGVybnVudmFsaWRhdGVkYXJiaXRyYXJ5UHJpbWVTeW1ib2woInZhbGlkYXRlUHVibGljU3ltYm9sIiBpcyBhIHByaXZhdGUgaWRlbnRpZmllciIgaXMgbm90IGEgdmFsaWQgKHF1YWxpZmllZCkgc3ltYm9sIG5hbWVpc1ZhbGlkU3ltYm9sY29tcHV0ZVVubWFuZ2xlZE5hbWVhZGRfc2V0dGVyX3N1ZmZpeG5ld0xhc3RuZXdGaXJzdGlzNjRCaXRfcHJpbnRDbG9zdXJlX2lucXVpcmVJczY0Qml0SW50ZXJuYWxfaW5xdWlyZUlzNjRCaXRfY2xhc3NSYW5nZUNoZWNrY2lkbG93ZXJMaW1pdHVwcGVyTGltaXRfY2xhc3NSYW5nZUNoZWNrTmVnYXRpdmVfcHJlcGVuZFR5cGVBcmd1bWVudHNJbnRlcm5hbF9wcmVwZW5kVHlwZUFyZ3VtZW50c2Z1bmN0aW9uVHlwZUFyZ3VtZW50c3BhcmVudFR5cGVBcmd1bWVudHNwYXJlbnRMZW50b3RhbExlbl9ib3VuZHNDaGVja0ZvclBhcnRpYWxJbnN0YW50aWF0aW9uSW50ZXJuYWxfYm91bmRzQ2hlY2tGb3JQYXJ0aWFsSW5zdGFudGlhdGlvbl9ncm93UmVnRXhwU3RhY2tuZXdTdGFja3Vuc2FmZUNhc3RJbnRlcm5hbF91bnNhZmVDYXN0X3Vuc3VwcG9ydGVkUHJpbnQncHJpbnQnIGlzIG5vdCBzdXBwb3J0ZWRkaWdpdDBkaWdpdDFkaWdpdDJJbnRlcm5hbF9leHRyYWN0VHlwZUFyZ3VtZW50c19jaGVja0NvdW50bWFrZUxpc3RGaXhlZExlbmd0aEludGVybmFsX21ha2VMaXN0Rml4ZWRMZW5ndGhncm93YWJsZUxpc3RtYWtlRml4ZWRMaXN0VW5tb2RpZmlhYmxlSW50ZXJuYWxfbWFrZUZpeGVkTGlzdFVubW9kaWZpYWJsZWZpeGVkTGVuZ3RoTGlzdGRhcnQuaXNvbGF0ZWNhcGFiaWxpdHkuZGFydF9JbW1lZGlhdGVDYWxsYmFja19OdWxsYXJ5RnVuY3Rpb25fVW5hcnlGdW5jdGlvbl9CaW5hcnlGdW5jdGlvbl9DYXBhYmlsaXR5SW1wbENhcGFiaWxpdHlJbXBsX2ZhY3RvcnlfZ2V0X2hhc2hjb2RlQ2FwYWJpbGl0eUltcGxfZXF1YWxzQ2FwYWJpbGl0eUltcGxfZ2V0X2hhc2hjb2RlX1JlY2VpdmVQb3J0SW1wbF9yYXdQb3J0ZnJvbVJhd1JlY2VpdmVQb3J0X1Jhd1JlY2VpdmVQb3J0SW1wbF9oYW5kbGVyTWFwUmF3UmVjZWl2ZVBvcnRJbXBsX2ZhY3RvcnlfY2xvc2VJbnRlcm5hbF9nZXRfc2VuZHBvcnRfZ2V0X2lkUmF3UmVjZWl2ZVBvcnRJbXBsX2dldF9pZFJhd1JlY2VpdmVQb3J0SW1wbF9nZXRfc2VuZHBvcnRfbG9va3VwSGFuZGxlcl9oYW5kbGVNZXNzYWdlUmF3UmVjZWl2ZVBvcnRJbXBsX2Nsb3NlSW50ZXJuYWxfaW5pdEhhbmRsZXJNYXB0ZW1wTWFwX1NlbmRQb3J0SW1wbF9zZW5kSW50ZXJuYWxTZW5kUG9ydEltcGxfZ2V0X2lkU2VuZFBvcnRJbXBsX2dldF9oYXNoY29kZVNlbmRQb3J0SW1wbF9zZW5kSW50ZXJuYWxfX1RpbWVySGVhcF91c2VkaW5pdFNpemVfaW5kZXhPck5leHRfY29tcGFyZVRvX3N3YXBsZWZ0SW5kZXhuZXdlc3RfbGVmdENoaWxkX3JpZ2h0Q2hpbGRfbGVmdENoaWxkSW5kZXhfcmlnaHRDaGlsZEluZGV4X1RpbWVyX05PX1RJTUVSX1pFUk9fRVZFTlRfVElNRU9VVF9FVkVOVF9oZWFwX2ZpcnN0WmVyb1RpbWVyX2xhc3RaZXJvVGltZXJfSURfTUFTS19pZENvdW50X3JlY2VpdmVQb3J0X3NlbmRQb3J0X3NjaGVkdWxlZFdha2V1cFRpbWVfaGFuZGxpbmdDYWxsYmFja3Nfd2FrZXVwVGltZV9taWxsaVNlY29uZHNfcmVwZWF0aW5nX3RpY2tfbmV4dElkbWlsbGlTZWNvbmRzd2FrZXVwVGltZV9lbnF1ZXVlX2lzSW5IZWFwX2FkdmFuY2VXYWtldXBUaW1lX25vdGlmeVplcm9IYW5kbGVyX3F1ZXVlRnJvbVplcm9FdmVudHBlbmRpbmdUaW1lcnNfbm90aWZ5RXZlbnRIYW5kbGVyX3F1ZXVlRnJvbVRpbWVvdXRFdmVudGN1cnJlbnRUaW1lX3J1blRpbWVyc292ZXJkdWVtaXNzZWRUaWNrc2ltbWVkaWF0ZUNhbGxiYWNrX3NjaGVkdWxlV2FrZXVwX2NhbmNlbFdha2V1cF9jcmVhdGVUaW1lckhhbmRsZXJfc2h1dGRvd25UaW1lckhhbmRsZXJJc29sYXRlU3Bhd25FeGNlcHRpb25Jc29sYXRlU3Bhd25FeGNlcHRpb246IF9jdXJyZW50SXNvbGF0ZV9yb290VXJpX1BBVVNFX1JFU1VNRV9QSU5HX0tJTExfQUREX0VYSVRfREVMX0VYSVRfQUREX0VSUk9SX0RFTF9FUlJPUl9FUlJPUl9GQVRBTGJlZm9yZU5leHRFdmVudHBhdXNlQ2FwYWJpbGl0eXRlcm1pbmF0ZUNhcGFiaWxpdHlfcGFja2FnZVN1cHBvcnRlZF9zcGF3bkNvbW1vbnJlYWR5UG9ydHJlYWR5TWVzc2FnZWNhcGFiaWxpdGllc1VuYWJsZSB0byBzcGF3biBpc29sYXRlOiBJbnRlcm5hbCBlcnJvcjogdW5leHBlY3RlZCBmb3JtYXQgZm9yIHJlYWR5IG1lc3NhZ2U6IF9zcGF3bkZ1bmN0aW9uSXNvbGF0ZV9zcGF3bkZ1bmN0aW9udG9wTGV2ZWxGdW5jdGlvbnBhdXNlZGVycm9yc0FyZUZhdGFsb25FeGl0X3NwYXduVXJpSXNvbGF0ZV9zcGF3blVyaV9zZW5kT09CSXNvbGF0ZV9zZW5kT09CX2dldERlYnVnTmFtZUlzb2xhdGVfZ2V0RGVidWdOYW1lX2dldEN1cnJlbnRJc29sYXRlcG9ydEFuZENhcGFiaWxpdGllc19nZXRQb3J0QW5kQ2FwYWJpbGl0aWVzT2ZDdXJyZW50SXNvbGF0ZUlzb2xhdGVfZ2V0UG9ydEFuZENhcGFiaWxpdGllc09mQ3VycmVudElzb2xhdGVfZ2V0Q3VycmVudFJvb3RVcmlfZ2V0Q3VycmVudFJvb3RVcmlTdHJJc29sYXRlX2dldEN1cnJlbnRSb290VXJpU3RycGFja2FnZXMvIGRpcmVjdG9yeSByZXNvbHV0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gRGFydCAyLmhvb2tJc29sYXRlLnBhY2thZ2VSb290SXNvbGF0ZS5wYWNrYWdlQ29uZmlncmVzb2x2ZVBhY2thZ2VVcmlJc29sYXRlLnJlc29sdmVQYWNrYWdlVXJpc3Bhd25Jc29sYXRlLnNwYXduc3Bhd25VcmlhdXRvbWF0aWNQYWNrYWdlUmVzb2x1dGlvbkNhbm5vdCBzaW11bHRhbmVvdXNseSByZXF1ZXN0IGF1dG9tYXRpY1BhY2thZ2VSZXNvbHV0aW9uIGFuZCBzcGVjaWZ5IGFwYWNrYWdlUm9vdC5wYWNrYWdlQ29uZmlnLkNhbm5vdCBzaW11bHRhbmVvdXNseSBzcGVjaWZ5IGEgcGFja2FnZVJvb3QgYW5kIGEgcGFja2FnZUNvbmZpZy5zcGF3bmVkVXJpcmVzdW1lQ2FwYWJpbGl0eV9wYXVzZWFkZE9uRXhpdExpc3RlbmVycmVzcG9uc2VQb3J0cmVtb3ZlT25FeGl0TGlzdGVuZXJzZXRFcnJvcnNGYXRhbHByaW9yaXR5YWRkRXJyb3JMaXN0ZW5lcnJlbW92ZUVycm9yTGlzdGVuZXJsaXN0TWVzc2FnZWVycm9yRGVzY3JpcHRpb25zdGFja0Rlc2NyaXB0aW9uUmVjZWl2ZVBvcnRyYXdQb3J0bmV3SGFuZGxlclJlbW90ZUVycm9yX2Rlc2NyaXB0aW9uQ2FwYWJpbGl0eV9wZW5kaW5nSW1tZWRpYXRlQ2FsbGJhY2tfaXNvbGF0ZVNjaGVkdWxlSW1tZWRpYXRlX3J1blBlbmRpbmdJbW1lZGlhdGVDYWxsYmFja19yZW1vdmVQZW5kaW5nSW1tZWRpYXRlQ2FsbGJhY2tfZ2V0SXNvbGF0ZVNjaGVkdWxlSW1tZWRpYXRlQ2xvc3VyZV9zdGFydE1haW5Jc29sYXRlX2dldFN0YXJ0TWFpbklzb2xhdGVGdW5jdGlvbl9zdGFydElzb2xhdGVwYXJlbnRQb3J0aXNTcGF3blVyaV9zZXR1cEhvb2tzZGFydC5tYXRoamVua2luc19zbWlfaGFzaC5kYXJ0cG9pbnQuZGFydHJhbmRvbS5kYXJ0cmVjdGFuZ2xlLmRhcnRfUmFuZG9tX2tTVEFURV9MT19rU1RBVEVfSElfUE9XMl8zMl9QT1cyXzUzX0RfUE9XMl8yN19EX3Bybmdfd2l0aFN0YXRlX25leHRTdGF0ZVJhbmRvbV9uZXh0U3RhdGVNdXN0IGJlIHBvc2l0aXZlIGFuZCA8PSAyXjMycm5kMzJuZXh0RG91YmxlbmV4dEJvb2xfc2V0dXBTZWVkUmFuZG9tX3NldHVwU2VlZF9pbml0aWFsU2VlZFJhbmRvbV9pbml0aWFsU2VlZF9uZXh0U2VlZF9TZWN1cmVSYW5kb21fZ2V0Qnl0ZXNTZWN1cmVSYW5kb21fZ2V0Qnl0ZXNybmRfSmVua2luc1NtaUhhc2hoYXNoMmhhc2g0UG9pbnRQb2ludChmYWN0b3JkaXN0YW5jZVRvc3F1YXJlZERpc3RhbmNlVG9zZWN1cmVfUmVjdGFuZ2xlQmFzZWhlaWdodGJvdHRvbVJlY3RhbmdsZSAoIHggeDB5MGJvdW5kaW5nQm94Y29udGFpbnNSZWN0YW5nbGVhbm90aGVyY29udGFpbnNQb2ludHRvcExlZnR0b3BSaWdodGJvdHRvbVJpZ2h0Ym90dG9tTGVmdFJlY3RhbmdsZWZyb21Qb2ludHNNdXRhYmxlUmVjdGFuZ2xlX3dpZHRoX2hlaWdodGxuMTBsbjJsb2cyZWxvZzEwZXBpc3FydDFfMnNxcnQyX2RvdWJsZVBvd2RhcnQ6Y29yZSNfRG91YmxlX3Bvd01hdGhfZG91YmxlUG93X2ludFBvd19hdGFuMk1hdGhfYXRhbjJfc2luTWF0aF9zaW5fY29zTWF0aF9jb3NfdGFuTWF0aF90YW5fYWNvc01hdGhfYWNvc19hc2luTWF0aF9hc2luX2F0YW5NYXRoX2F0YW5fc3FydE1hdGhfc3FydF9leHBNYXRoX2V4cE1hdGhfbG9nYXRhbjJwb3dzaW5yYWRpYW5zY29zdGFuYWNvc2FzaW5hdGFuc3FydF9jbGFtcFRvWmVyb2RhcnQubWlycm9yc19JbnRlcm5hbE1pcnJvckVycm9yX21zZ19Mb2NhbE1pcnJvclN5c3RlbV9pc29sYXRlX2NvbXB1dGVMaWJyYXJpZXNNaXJyb3JTeXN0ZW1fbGlicmFyaWVzX2NvbXB1dGVJc29sYXRlTWlycm9yU3lzdGVtX2lzb2xhdGVNaXJyb3JTeXN0ZW0gZm9yIGlzb2xhdGUgJ19Tb3VyY2VMb2NhdGlvbl9Mb2NhbE1pcnJvcl9Mb2NhbElzb2xhdGVNaXJyb3Jyb290TGlicmFyeWlzQ3VycmVudElzb2xhdGVNaXJyb3Igb24gJ2xvYWRVcmlDYW5ub3QgbG9hZCBfbG9hZFVyaUlzb2xhdGVNaXJyb3JfbG9hZFVyaV9TeW50aGV0aWNBY2Nlc3NvcnNpbXBsZU5hbWVpc0NvbnN0Q29uc3RydWN0b3JfU3ludGhldGljU2V0dGVyUGFyYW1ldGVyaGFzRGVmYXVsdFZhbHVlX0xvY2FsT2JqZWN0TWlycm9yX3JlZmxlY3RlZV9pbnZva2VyZWZsZWN0ZWVfaW52b2tlR2V0dGVyX2ludm9rZVNldHRlcm51bVBvc2l0aW9uYWxBcmd1bWVudHNudW1OYW1lZEFyZ3VtZW50c3NldEZpZWxkdW53cmFwcGVkd2l0aG91dEVxdWFsVU5SRUFDSEFCTEVfTG9jYWxJbnN0YW5jZU1pcnJvcmhhc1JlZmxlY3RlZUluc3RhbmNlTWlycm9yIG9uIEluc3RhbmNlTWlycm9yX2ludm9rZUluc3RhbmNlTWlycm9yX2ludm9rZUdldHRlckluc3RhbmNlTWlycm9yX2ludm9rZVNldHRlcl9jb21wdXRlVHlwZUluc3RhbmNlTWlycm9yX2NvbXB1dGVUeXBlX0xvY2FsQ2xvc3VyZU1pcnJvcl9mdW5jdGlvbkNsb3N1cmVNaXJyb3Igb24gJ19jb21wdXRlRnVuY3Rpb25DbG9zdXJlTWlycm9yX2Z1bmN0aW9uX0xvY2FsVHlwZU1pcnJvcl9yZWZsZWN0ZWRUeXBlX0xvY2FsQ2xhc3NNaXJyb3Jfc2ltcGxlTmFtZV9vd25lcl9pc0dlbmVyaWNfaXNUcmFuc2Zvcm1lZE1peGluQXBwbGljYXRpb25faXNHZW5lcmljRGVjbGFyYXRpb25faW5zdGFudGlhdG9yX3F1YWxpZmllZE5hbWVfdHJ1ZVN1cGVyY2xhc3NGaWVsZF9zdXBlcmludGVyZmFjZXNfY2FjaGVkU3RhdGljTWVtYmVyc19jYWNoZWRJbnN0YW5jZU1lbWJlcnNfZGVjbGFyYXRpb25zcmVmbGVjdGVkVHlwZWhhc1JlZmxlY3RlZFR5cGVEZWNsYXJhdGlvbnMgb2YgZ2VuZXJpY3MgaGF2ZSBubyByZWZsZWN0ZWQgdHlwZV9taXhpbkFwcGxpY2F0aW9uTmFtZV90cnVlU3VwZXJjbGFzc2lzT3JpZ2luYWxEZWNsYXJhdGlvbnN1cGVyaW50ZXJmYWNlc2ludGVyZmFjZVR5cGVzaW50ZXJmYWNlTWlycm9yc21peGluVHlwZXN0YXRpY01lbWJlcnNpbnN0YW5jZU1lbWJlcnNkZWNsc19jb21wdXRlTWVtYmVyc19jb21wdXRlQ29uc3RydWN0b3Jzc3RyaW5nTmFtZV9wYXRjaENvbnN0cnVjdG9yTmFtZV9pc0Fub255bW91c01peGluQXBwbGljYXRpb25vcmlnaW5hbERlY2xhcmF0aW9ubWlycm9yQ2xhc3NNaXJyb3Igb24gJ2lzQXNzaWduYWJsZVRvb3RoZXJSZWZsZWN0ZWRUeXBlb3RoZXJEZWNsYXJhdGlvbl9saWJyYXJ5VXJpQ2xhc3NNaXJyb3JfbGlicmFyeVVyaV9zdXBlcnR5cGVDbGFzc01pcnJvcl9zdXBlcnR5cGVfc3VwZXJ0eXBlSW5zdGFudGlhdGVkQ2xhc3NNaXJyb3Jfc3VwZXJ0eXBlX2luc3RhbnRpYXRlZF9uYXRpdmVJbnRlcmZhY2VzQ2xhc3NNaXJyb3JfaW50ZXJmYWNlc19uYXRpdmVJbnRlcmZhY2VzSW5zdGFudGlhdGVkQ2xhc3NNaXJyb3JfaW50ZXJmYWNlc19pbnN0YW50aWF0ZWRfbmF0aXZlTWl4aW5DbGFzc01pcnJvcl9taXhpbl9uYXRpdmVNaXhpbkluc3RhbnRpYXRlZENsYXNzTWlycm9yX21peGluX2luc3RhbnRpYXRlZENsYXNzTWlycm9yX21lbWJlcnNDbGFzc01pcnJvcl9jb25zdHJ1Y3RvcnNDbGFzc01pcnJvcl9pbnZva2VDbGFzc01pcnJvcl9pbnZva2VHZXR0ZXJDbGFzc01pcnJvcl9pbnZva2VTZXR0ZXJfaW52b2tlQ29uc3RydWN0b3JDbGFzc01pcnJvcl9pbnZva2VDb25zdHJ1Y3Rvcl9DbGFzc01pcnJvcl90eXBlX3ZhcmlhYmxlc0NsYXNzTWlycm9yX3R5cGVfdmFyaWFibGVzX2NvbXB1dGVUeXBlQXJndW1lbnRzQ2xhc3NNaXJyb3JfdHlwZV9hcmd1bWVudHNfTG9jYWxGdW5jdGlvblR5cGVNaXJyb3JfZnVuY3Rpb25SZWZsZWN0ZWVfY2FsbE1ldGhvZF9wYXJhbWV0ZXJzX0Z1bmN0aW9uVHlwZU1pcnJvcl9jYWxsX21ldGhvZF9GdW5jdGlvblR5cGVNaXJyb3JfcGFyYW1ldGVyc0Z1bmN0aW9uVHlwZU1pcnJvciBvbiAnRnVuY3Rpb25UeXBlTWlycm9yX2NhbGxfbWV0aG9kZnVuY3Rpb25SZWZsZWN0ZWVfRnVuY3Rpb25UeXBlTWlycm9yX3JldHVybl90eXBlRnVuY3Rpb25UeXBlTWlycm9yX3JldHVybl90eXBlRnVuY3Rpb25UeXBlTWlycm9yX3BhcmFtZXRlcnNfTG9jYWxEZWNsYXJhdGlvbk1pcnJvcl9Mb2NhbFR5cGVWYXJpYWJsZU1pcnJvcl91cHBlckJvdW5kVHlwZSB2YXJpYWJsZXMgaGF2ZSBubyByZWZsZWN0ZWQgdHlwZVR5cGVWYXJpYWJsZU1pcnJvciBvbiAnX1R5cGVWYXJpYWJsZU1pcnJvcl9vd25lclR5cGVWYXJpYWJsZU1pcnJvcl9vd25lcl9UeXBlVmFyaWFibGVNaXJyb3JfdXBwZXJfYm91bmRUeXBlVmFyaWFibGVNaXJyb3JfdXBwZXJfYm91bmRfTG9jYWxUeXBlZGVmTWlycm9yX3JlZmVyZW50cmVmZXJlbnRUeXBlZGVmTWlycm9yIG9uICdfbmF0aXZlUmVmZXJlbnRUeXBlZGVmTWlycm9yX3JlZmVyZW50X25hdGl2ZURlY2xhcmF0aW9uVHlwZWRlZk1pcnJvcl9kZWNsYXJhdGlvbl9Mb2NhbExpYnJhcnlNaXJyb3JfY2FjaGVkTGlicmFyeURlcGVuZGVuY2llc0xpYnJhcnlNaXJyb3Igb24gJ2xpYnJhcnlEZXBlbmRlbmNpZXNfbGlicmFyeURlcGVuZGVuY2llc0xpYnJhcnlNaXJyb3JfbGlicmFyeURlcGVuZGVuY2llc0xpYnJhcnlNaXJyb3JfaW52b2tlTGlicmFyeU1pcnJvcl9pbnZva2VHZXR0ZXJMaWJyYXJ5TWlycm9yX2ludm9rZVNldHRlckxpYnJhcnlNaXJyb3JfbWVtYmVyc19Mb2NhbExpYnJhcnlEZXBlbmRlbmN5TWlycm9yX3RhcmdldE1pcnJvck9yUHJlZml4bXV0YWJsZUNvbWJpbmF0b3JzcHJlZml4U3RyaW5ndW53cmFwcGVkTWV0YWRhdGFtaXJyb3JPck51bGxzYXZlZFByZWZpeF90cnlVcGdyYWRlUHJlZml4TGlicmFyeU1pcnJvcl9mcm9tUHJlZml4X0xvY2FsQ29tYmluYXRvck1pcnJvcmlkZW50aWZpZXJzaWRlbnRpZmllclN0cmluZ19Mb2NhbE1ldGhvZE1pcnJvcl9raW5kRmxhZ3NrQWJzdHJhY3RrR2V0dGVya1NldHRlcmtDb25zdHJ1Y3RvcmtDb25zdEN0b3JrR2VuZXJhdGl2ZUN0b3JrUmVkaXJlY3RpbmdDdG9ya0ZhY3RvcnlDdG9ya0V4dGVybmFsa1N5bnRoZXRpY19vcGVyYXRvcnNfY29uc3RydWN0b3JOYW1lX01ldGhvZE1pcnJvcl9wYXJhbWV0ZXJzSW50ZXJuYWwgZXJyb3IgaW4gTWV0aG9kTWlycm9yLmNvbnN0cnVjdG9yTmFtZTogbWFsZm9ybWVkIG5hbWUgPGRlZmluaW5nTGlicmFyeW93bmVyTmFtZWNuTWV0aG9kTWlycm9yIG9uICdfTWV0aG9kTWlycm9yX293bmVyTWV0aG9kTWlycm9yX293bmVyX01ldGhvZE1pcnJvcl9yZXR1cm5fdHlwZU1ldGhvZE1pcnJvcl9yZXR1cm5fdHlwZU1ldGhvZE1pcnJvcl9wYXJhbWV0ZXJzX01ldGhvZE1pcnJvcl9zb3VyY2VNZXRob2RNaXJyb3Jfc291cmNlX0xvY2FsVmFyaWFibGVNaXJyb3J1bmV4cGVjdGVkIG93bmVyIFZhcmlhYmxlTWlycm9yIG9uICdfVmFyaWFibGVNaXJyb3JfdHlwZVZhcmlhYmxlTWlycm9yX3R5cGVfTG9jYWxQYXJhbWV0ZXJNaXJyb3JfdW5taXJyb3JlZE1ldGFkYXRhX2RlZmF1bHRWYWx1ZVJlZmxlY3RlZVBhcmFtZXRlck1pcnJvci5sb2NhdGlvbiB1bmltcGxlbWVudGVkUGFyYW1ldGVyTWlycm9yIG9uICdfUGFyYW1ldGVyTWlycm9yX3R5cGVQYXJhbWV0ZXJNaXJyb3JfdHlwZV9TcGVjaWFsVHlwZU1pcnJvcnZvaWQgaGFzIG5vIHJlZmxlY3RlZCB0eXBlVHlwZU1pcnJvciBvbiAnX01pcnJvcnNfY3VycmVudE1pcnJvclN5c3RlbV9kZWNsYXJhdGlvbkNhY2hlQ2xhc3NNaXJyb3JfaW5zdGFudGlhdGlvbkNhY2hlVHlwZU1pcnJvcmN1cnJlbnRNaXJyb3JTeXN0ZW1yZWZsZWN0bWFrZUxvY2FsQ2xhc3NNaXJyb3JNaXJyb3JzX21ha2VMb2NhbENsYXNzTWlycm9ybWFrZUxvY2FsVHlwZU1pcnJvck1pcnJvcnNfbWFrZUxvY2FsVHlwZU1pcnJvcmluc3RhbnRpYXRlR2VuZXJpY1R5cGVNaXJyb3JzX2luc3RhbnRpYXRlR2VuZXJpY1R5cGVyZWZsZWN0Q2xhc3NjbGFzc01pcnJvcnJlZmxlY3RUeXBldHlwZU1pcnJvcl9pbnN0YW50aWF0ZVR5cGVUeXBlIGFyZ3VtZW50cyBsaXN0IGNhbm5vdCBiZSBlbXB0eS5fTWlycm9yUmVmZXJlbmNlX3VuaW5zdGFudGlhYmxlY2xhc3MgX01pcnJvclJlZmVyZW5jZSBjYW5ub3QgYmUgaW5zdGFudGlhdGVkTWlycm9yUmVmZXJlbmNlX2VxdWFsc01pcnJvclN5c3RlbV9tYW5nbGVOYW1lTWlycm9yc19tYW5nbGVOYW1lZmluZExpYnJhcnlUaGVyZSBhcmUgbXVsdGlwbGUgbGlicmFyaWVzIG5hbWVkIFRoZXJlIGlzIG5vIGxpYnJhcnkgbmFtZWQgJ2dldFN5bWJvbE1pcnJvcklzb2xhdGVNaXJyb3JEZWNsYXJhdGlvbk1pcnJvck9iamVjdE1pcnJvckluc3RhbmNlTWlycm9yQ2xvc3VyZU1pcnJvckxpYnJhcnlNaXJyb3JMaWJyYXJ5RGVwZW5kZW5jeU1pcnJvckNvbWJpbmF0b3JNaXJyb3JGdW5jdGlvblR5cGVNaXJyb3JUeXBlVmFyaWFibGVNaXJyb3JUeXBlZGVmTWlycm9yTWV0aG9kTWlycm9yVmFyaWFibGVNaXJyb3JQYXJhbWV0ZXJNaXJyb3J0cmltbWVkVGV4dGlzRG9jQ29tbWVudE1pcnJvcnNVc2VkTm8gbG9uZ2VyIGhhcyBhbnkgZWZmZWN0LiBXaWxsIGJlIHJlbW92ZWQgaW4gYSBsYXRlciByZWxlYXNlLnN5bWJvbHNtZXRhVGFyZ2V0c292ZXJyaWRlX2RpcnR5X25fY29tcHV0ZVF1YWxpZmllZE5hbWVfbWFrZVNpZ25hdHVyZVN0cmluZ2ZvdW5kX29wdGlvbmFsX3Bvc2l0aW9uYWxmb3VuZF9vcHRpb25hbF9uYW1lZERlY2xhcmF0aW9uTWlycm9yX2xvY2F0aW9uRGVjbGFyYXRpb25NaXJyb3JfbWV0YWRhdGFfc3VidHlwZVRlc3RUeXBlTWlycm9yX3N1YnR5cGVUZXN0X2FzU2V0dGVyZGFydC5wcm9maWxlckRhcnQgU0RLIDEuMTJkYXJ0LnR5cGVkX2RhdGF1bm1vZGlmaWFibGVfdHlwZWRfZGF0YS5kYXJ0X1R5cGVkTGlzdEJhc2VDYW5ub3QgcmVzaXplIGEgZml4ZWQtbGVuZ3RoIGxpc3RUeXBlZERhdGFfc2V0UmFuZ2VzdGFydEluQnl0ZXNzdGFydEZyb21JbkJ5dGVzdG9DaWRmcm9tQ2lkX0ludExpc3RNaXhpbl9jcmVhdGVMaXN0ZnJvbUFzVHlwZWRMaXN0ZnJvbUFzTGlzdHRlbXBCdWZmZXJDYW5ub3QgaW5zZXJ0IGludG8gYSBmaXhlZC1sZW5ndGggbGlzdF9Eb3VibGVMaXN0TWl4aW5fRmxvYXQzMng0TGlzdE1peGluU0lNRCBkb24ndCBoYXZlIGRlZmF1bHQgY29tcGFyZS5fSW50MzJ4NExpc3RNaXhpbl9GbG9hdDY0eDJMaXN0TWl4aW5fQnl0ZUJ1ZmZlcl9OZXdhc0ludDhMaXN0YXNVaW50OENsYW1wZWRMaXN0YXNJbnQxNkxpc3Rhc1VpbnQxNkxpc3Rhc0ludDMyTGlzdGFzVWludDMyTGlzdGFzSW50NjRMaXN0YXNVaW50NjRMaXN0YXNGbG9hdDMyTGlzdGFzRmxvYXQ2NExpc3Rhc0Zsb2F0MzJ4NExpc3Rhc0ludDMyeDRMaXN0YXNGbG9hdDY0eDJMaXN0X1R5cGVkTGlzdFR5cGVkRGF0YV9sZW5ndGhfZ2V0SW50OFR5cGVkRGF0YV9HZXRJbnQ4X3NldEludDhUeXBlZERhdGFfU2V0SW50OF9nZXRVaW50OFR5cGVkRGF0YV9HZXRVaW50OF9zZXRVaW50OFR5cGVkRGF0YV9TZXRVaW50OF9nZXRJbnQxNlR5cGVkRGF0YV9HZXRJbnQxNl9zZXRJbnQxNlR5cGVkRGF0YV9TZXRJbnQxNl9nZXRVaW50MTZUeXBlZERhdGFfR2V0VWludDE2X3NldFVpbnQxNlR5cGVkRGF0YV9TZXRVaW50MTZfZ2V0SW50MzJUeXBlZERhdGFfR2V0SW50MzJfc2V0SW50MzJUeXBlZERhdGFfU2V0SW50MzJfZ2V0VWludDMyVHlwZWREYXRhX0dldFVpbnQzMl9zZXRVaW50MzJUeXBlZERhdGFfU2V0VWludDMyX2dldEludDY0VHlwZWREYXRhX0dldEludDY0X3NldEludDY0VHlwZWREYXRhX1NldEludDY0X2dldFVpbnQ2NFR5cGVkRGF0YV9HZXRVaW50NjRfc2V0VWludDY0VHlwZWREYXRhX1NldFVpbnQ2NF9nZXRGbG9hdDMyVHlwZWREYXRhX0dldEZsb2F0MzJfc2V0RmxvYXQzMlR5cGVkRGF0YV9TZXRGbG9hdDMyX2dldEZsb2F0NjRUeXBlZERhdGFfR2V0RmxvYXQ2NF9zZXRGbG9hdDY0VHlwZWREYXRhX1NldEZsb2F0NjRfZ2V0RmxvYXQzMng0VHlwZWREYXRhX0dldEZsb2F0MzJ4NF9zZXRGbG9hdDMyeDRUeXBlZERhdGFfU2V0RmxvYXQzMng0X2dldEludDMyeDRUeXBlZERhdGFfR2V0SW50MzJ4NF9zZXRJbnQzMng0VHlwZWREYXRhX1NldEludDMyeDRfZ2V0RmxvYXQ2NHgyVHlwZWREYXRhX0dldEZsb2F0NjR4Ml9zZXRGbG9hdDY0eDJUeXBlZERhdGFfU2V0RmxvYXQ2NHgyX3NldENvZGVVbml0c2J5dGVTdGFydHNraXBDb3VudCArIGxlbmd0aF9fSW50OExpc3QmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluX0ludDhMaXN0X19VaW50OExpc3QmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluX1VpbnQ4TGlzdF9fVWludDhDbGFtcGVkTGlzdCZfVHlwZWRMaXN0Jl9JbnRMaXN0TWl4aW5fVWludDhDbGFtcGVkTGlzdF9fSW50MTZMaXN0Jl9UeXBlZExpc3QmX0ludExpc3RNaXhpbl9JbnQxNkxpc3RfZ2V0SW5kZXhlZEludDE2X3NldEluZGV4ZWRJbnQxNl9fVWludDE2TGlzdCZfVHlwZWRMaXN0Jl9JbnRMaXN0TWl4aW5fVWludDE2TGlzdF9nZXRJbmRleGVkVWludDE2X3NldEluZGV4ZWRVaW50MTZfX0ludDMyTGlzdCZfVHlwZWRMaXN0Jl9JbnRMaXN0TWl4aW5fSW50MzJMaXN0X2dldEluZGV4ZWRJbnQzMl9zZXRJbmRleGVkSW50MzJfX1VpbnQzMkxpc3QmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluX1VpbnQzMkxpc3RfZ2V0SW5kZXhlZFVpbnQzMl9zZXRJbmRleGVkVWludDMyX19JbnQ2NExpc3QmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluX0ludDY0TGlzdF9nZXRJbmRleGVkSW50NjRfc2V0SW5kZXhlZEludDY0X19VaW50NjRMaXN0Jl9UeXBlZExpc3QmX0ludExpc3RNaXhpbl9VaW50NjRMaXN0X2dldEluZGV4ZWRVaW50NjRfc2V0SW5kZXhlZFVpbnQ2NF9fRmxvYXQzMkxpc3QmX1R5cGVkTGlzdCZfRG91YmxlTGlzdE1peGluX0Zsb2F0MzJMaXN0X2dldEluZGV4ZWRGbG9hdDMyX3NldEluZGV4ZWRGbG9hdDMyX19GbG9hdDY0TGlzdCZfVHlwZWRMaXN0Jl9Eb3VibGVMaXN0TWl4aW5fRmxvYXQ2NExpc3RfZ2V0SW5kZXhlZEZsb2F0NjRfc2V0SW5kZXhlZEZsb2F0NjRfX0Zsb2F0MzJ4NExpc3QmX1R5cGVkTGlzdCZfRmxvYXQzMng0TGlzdE1peGluX0Zsb2F0MzJ4NExpc3RfZ2V0SW5kZXhlZEZsb2F0MzJ4NF9zZXRJbmRleGVkRmxvYXQzMng0X19JbnQzMng0TGlzdCZfVHlwZWRMaXN0Jl9JbnQzMng0TGlzdE1peGluX0ludDMyeDRMaXN0X2dldEluZGV4ZWRJbnQzMng0X3NldEluZGV4ZWRJbnQzMng0X19GbG9hdDY0eDJMaXN0Jl9UeXBlZExpc3QmX0Zsb2F0NjR4Mkxpc3RNaXhpbl9GbG9hdDY0eDJMaXN0X2dldEluZGV4ZWRGbG9hdDY0eDJfc2V0SW5kZXhlZEZsb2F0NjR4Ml9fRXh0ZXJuYWxJbnQ4QXJyYXkmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluX0V4dGVybmFsSW50OEFycmF5X19FeHRlcm5hbFVpbnQ4QXJyYXkmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluX0V4dGVybmFsVWludDhBcnJheV9fRXh0ZXJuYWxVaW50OENsYW1wZWRBcnJheSZfVHlwZWRMaXN0Jl9JbnRMaXN0TWl4aW5fRXh0ZXJuYWxVaW50OENsYW1wZWRBcnJheV9fRXh0ZXJuYWxJbnQxNkFycmF5Jl9UeXBlZExpc3QmX0ludExpc3RNaXhpbl9FeHRlcm5hbEludDE2QXJyYXlfX0V4dGVybmFsVWludDE2QXJyYXkmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluX0V4dGVybmFsVWludDE2QXJyYXlfX0V4dGVybmFsSW50MzJBcnJheSZfVHlwZWRMaXN0Jl9JbnRMaXN0TWl4aW5fRXh0ZXJuYWxJbnQzMkFycmF5X19FeHRlcm5hbFVpbnQzMkFycmF5Jl9UeXBlZExpc3QmX0ludExpc3RNaXhpbl9FeHRlcm5hbFVpbnQzMkFycmF5X19FeHRlcm5hbEludDY0QXJyYXkmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluX0V4dGVybmFsSW50NjRBcnJheV9fRXh0ZXJuYWxVaW50NjRBcnJheSZfVHlwZWRMaXN0Jl9JbnRMaXN0TWl4aW5fRXh0ZXJuYWxVaW50NjRBcnJheV9fRXh0ZXJuYWxGbG9hdDMyQXJyYXkmX1R5cGVkTGlzdCZfRG91YmxlTGlzdE1peGluX0V4dGVybmFsRmxvYXQzMkFycmF5X19FeHRlcm5hbEZsb2F0NjRBcnJheSZfVHlwZWRMaXN0Jl9Eb3VibGVMaXN0TWl4aW5fRXh0ZXJuYWxGbG9hdDY0QXJyYXlfX0V4dGVybmFsRmxvYXQzMng0QXJyYXkmX1R5cGVkTGlzdCZfRmxvYXQzMng0TGlzdE1peGluX0V4dGVybmFsRmxvYXQzMng0QXJyYXlfX0V4dGVybmFsSW50MzJ4NEFycmF5Jl9UeXBlZExpc3QmX0ludDMyeDRMaXN0TWl4aW5fRXh0ZXJuYWxJbnQzMng0QXJyYXlfX0V4dGVybmFsRmxvYXQ2NHgyQXJyYXkmX1R5cGVkTGlzdCZfRmxvYXQ2NHgyTGlzdE1peGluX0V4dGVybmFsRmxvYXQ2NHgyQXJyYXlfRmxvYXQzMng0RmxvYXQzMng0X2FkZEZsb2F0MzJ4NF9uZWdhdGVGbG9hdDMyeDRfc3ViRmxvYXQzMng0X211bEZsb2F0MzJ4NF9kaXZGbG9hdDMyeDRfY21wbHRsZXNzVGhhbk9yRXF1YWxGbG9hdDMyeDRfY21wbHRlRmxvYXQzMng0X2NtcGd0Z3JlYXRlclRoYW5PckVxdWFsRmxvYXQzMng0X2NtcGd0ZUZsb2F0MzJ4NF9jbXBlcXVhbG5vdEVxdWFsRmxvYXQzMng0X2NtcG5lcXVhbHNjYWxlRmxvYXQzMng0X3NjYWxlRmxvYXQzMng0X2Fic2NsYW1wRmxvYXQzMng0X2NsYW1wRmxvYXQzMng0X2dldFhGbG9hdDMyeDRfZ2V0WUZsb2F0MzJ4NF9nZXRaRmxvYXQzMng0X2dldFdzaWduTWFza0Zsb2F0MzJ4NF9nZXRTaWduTWFza0Zsb2F0MzJ4NF9zaHVmZmxlc2h1ZmZsZU1peEZsb2F0MzJ4NF9zaHVmZmxlTWl4end3aXRoWEZsb2F0MzJ4NF9zZXRYd2l0aFlGbG9hdDMyeDRfc2V0WXdpdGhaRmxvYXQzMng0X3NldFp3aXRoV0Zsb2F0MzJ4NF9zZXRXRmxvYXQzMng0X21pbkZsb2F0MzJ4NF9tYXhGbG9hdDMyeDRfc3FydHJlY2lwcm9jYWxGbG9hdDMyeDRfcmVjaXByb2NhbHJlY2lwcm9jYWxTcXJ0RmxvYXQzMng0X3JlY2lwcm9jYWxTcXJ0X0ludDMyeDRJbnQzMng0X29ySW50MzJ4NF9hbmRJbnQzMng0X3hvckludDMyeDRfYWRkSW50MzJ4NF9zdWJJbnQzMng0X2dldFhJbnQzMng0X2dldFlJbnQzMng0X2dldFpJbnQzMng0X2dldFdJbnQzMng0X2dldFNpZ25NYXNrSW50MzJ4NF9zaHVmZmxlSW50MzJ4NF9zaHVmZmxlTWl4SW50MzJ4NF9zZXRYSW50MzJ4NF9zZXRZSW50MzJ4NF9zZXRaSW50MzJ4NF9zZXRXZmxhZ1hJbnQzMng0X2dldEZsYWdYZmxhZ1lJbnQzMng0X2dldEZsYWdZZmxhZ1pJbnQzMng0X2dldEZsYWdaZmxhZ1dJbnQzMng0X2dldEZsYWdXd2l0aEZsYWdYSW50MzJ4NF9zZXRGbGFnWHdpdGhGbGFnWUludDMyeDRfc2V0RmxhZ1l3aXRoRmxhZ1pJbnQzMng0X3NldEZsYWdad2l0aEZsYWdXSW50MzJ4NF9zZXRGbGFnV0ludDMyeDRfc2VsZWN0X0Zsb2F0NjR4MkZsb2F0NjR4Ml9hZGRGbG9hdDY0eDJfbmVnYXRlRmxvYXQ2NHgyX3N1YkZsb2F0NjR4Ml9tdWxGbG9hdDY0eDJfZGl2RmxvYXQ2NHgyX3NjYWxlRmxvYXQ2NHgyX2Fic0Zsb2F0NjR4Ml9jbGFtcEZsb2F0NjR4Ml9nZXRYRmxvYXQ2NHgyX2dldFlGbG9hdDY0eDJfZ2V0U2lnbk1hc2tGbG9hdDY0eDJfc2V0WEZsb2F0NjR4Ml9zZXRZRmxvYXQ2NHgyX21pbkZsb2F0NjR4Ml9tYXhGbG9hdDY0eDJfc3FydF9UeXBlZExpc3RJdGVyYXRvcl9hcnJheV9UeXBlZExpc3RWaWV3X3R5cGVkRGF0YXZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZVR5cGVkRGF0YVZpZXdfdHlwZWREYXRhVHlwZWREYXRhVmlld19vZmZzZXRJbkJ5dGVzVHlwZWREYXRhVmlld19sZW5ndGhfX0ludDhBcnJheVZpZXcmX1R5cGVkTGlzdFZpZXcmX0ludExpc3RNaXhpbl9JbnQ4QXJyYXlWaWV3VHlwZWREYXRhVmlld19JbnQ4QXJyYXlWaWV3X25ld19fVWludDhBcnJheVZpZXcmX1R5cGVkTGlzdFZpZXcmX0ludExpc3RNaXhpbl9VaW50OEFycmF5Vmlld1R5cGVkRGF0YVZpZXdfVWludDhBcnJheVZpZXdfbmV3X19VaW50OENsYW1wZWRBcnJheVZpZXcmX1R5cGVkTGlzdFZpZXcmX0ludExpc3RNaXhpbl9VaW50OENsYW1wZWRBcnJheVZpZXdUeXBlZERhdGFWaWV3X1VpbnQ4Q2xhbXBlZEFycmF5Vmlld19uZXdfX0ludDE2QXJyYXlWaWV3Jl9UeXBlZExpc3RWaWV3Jl9JbnRMaXN0TWl4aW5fSW50MTZBcnJheVZpZXdUeXBlZERhdGFWaWV3X0ludDE2QXJyYXlWaWV3X25ld19fVWludDE2QXJyYXlWaWV3Jl9UeXBlZExpc3RWaWV3Jl9JbnRMaXN0TWl4aW5fVWludDE2QXJyYXlWaWV3VHlwZWREYXRhVmlld19VaW50MTZBcnJheVZpZXdfbmV3X19JbnQzMkFycmF5VmlldyZfVHlwZWRMaXN0VmlldyZfSW50TGlzdE1peGluX0ludDMyQXJyYXlWaWV3VHlwZWREYXRhVmlld19JbnQzMkFycmF5Vmlld19uZXdfX1VpbnQzMkFycmF5VmlldyZfVHlwZWRMaXN0VmlldyZfSW50TGlzdE1peGluX1VpbnQzMkFycmF5Vmlld1R5cGVkRGF0YVZpZXdfVWludDMyQXJyYXlWaWV3X25ld19fSW50NjRBcnJheVZpZXcmX1R5cGVkTGlzdFZpZXcmX0ludExpc3RNaXhpbl9JbnQ2NEFycmF5Vmlld1R5cGVkRGF0YVZpZXdfSW50NjRBcnJheVZpZXdfbmV3X19VaW50NjRBcnJheVZpZXcmX1R5cGVkTGlzdFZpZXcmX0ludExpc3RNaXhpbl9VaW50NjRBcnJheVZpZXdUeXBlZERhdGFWaWV3X1VpbnQ2NEFycmF5Vmlld19uZXdfX0Zsb2F0MzJBcnJheVZpZXcmX1R5cGVkTGlzdFZpZXcmX0RvdWJsZUxpc3RNaXhpbl9GbG9hdDMyQXJyYXlWaWV3VHlwZWREYXRhVmlld19GbG9hdDMyQXJyYXlWaWV3X25ld19fRmxvYXQ2NEFycmF5VmlldyZfVHlwZWRMaXN0VmlldyZfRG91YmxlTGlzdE1peGluX0Zsb2F0NjRBcnJheVZpZXdUeXBlZERhdGFWaWV3X0Zsb2F0NjRBcnJheVZpZXdfbmV3X19GbG9hdDMyeDRBcnJheVZpZXcmX1R5cGVkTGlzdFZpZXcmX0Zsb2F0MzJ4NExpc3RNaXhpbl9GbG9hdDMyeDRBcnJheVZpZXdUeXBlZERhdGFWaWV3X0Zsb2F0MzJ4NEFycmF5Vmlld19uZXdfX0ludDMyeDRBcnJheVZpZXcmX1R5cGVkTGlzdFZpZXcmX0ludDMyeDRMaXN0TWl4aW5fSW50MzJ4NEFycmF5Vmlld1R5cGVkRGF0YVZpZXdfSW50MzJ4NEFycmF5Vmlld19uZXdfX0Zsb2F0NjR4MkFycmF5VmlldyZfVHlwZWRMaXN0VmlldyZfRmxvYXQ2NHgyTGlzdE1peGluX0Zsb2F0NjR4MkFycmF5Vmlld1R5cGVkRGF0YVZpZXdfRmxvYXQ2NHgyQXJyYXlWaWV3X25ld19CeXRlRGF0YVZpZXdUeXBlZERhdGFWaWV3X0J5dGVEYXRhVmlld19uZXdnZXRJbnQ4c2V0SW50OGdldFVpbnQ4c2V0VWludDhnZXRJbnQxNnNldEludDE2Z2V0SW50MzJzZXRJbnQzMmdldEludDY0c2V0SW50NjRnZXRVaW50NjRzZXRVaW50NjRnZXRGbG9hdDMyc2V0RmxvYXQzMmdldEZsb2F0MzJ4NHNldEZsb2F0MzJ4NEJ5dGVCdWZmZXJUeXBlZERhdGFfVHlwZWRJbnRMaXN0X1R5cGVkRmxvYXRMaXN0RW5kaWFuX2xpdHRsZUVuZGlhbmJpZ2xpdHRsZUJ5dGVEYXRhX3ZpZXd0eXBlZERhdGFJbnQ4TGlzdGJ5dGVzUGVyRWxlbWVudFR5cGVkRGF0YV9JbnQ4QXJyYXlfbmV3ZnJvbUxpc3RUeXBlZERhdGFfVWludDhBcnJheV9uZXdVaW50OENsYW1wZWRMaXN0VHlwZWREYXRhX1VpbnQ4Q2xhbXBlZEFycmF5X25ld0ludDE2TGlzdFR5cGVkRGF0YV9JbnQxNkFycmF5X25ld1R5cGVkRGF0YV9VaW50MTZBcnJheV9uZXdUeXBlZERhdGFfSW50MzJBcnJheV9uZXdUeXBlZERhdGFfVWludDMyQXJyYXlfbmV3SW50NjRMaXN0VHlwZWREYXRhX0ludDY0QXJyYXlfbmV3VWludDY0TGlzdFR5cGVkRGF0YV9VaW50NjRBcnJheV9uZXdGbG9hdDMyTGlzdFR5cGVkRGF0YV9GbG9hdDMyQXJyYXlfbmV3RmxvYXQ2NExpc3RUeXBlZERhdGFfRmxvYXQ2NEFycmF5X25ld0Zsb2F0MzJ4NExpc3RUeXBlZERhdGFfRmxvYXQzMng0QXJyYXlfbmV3SW50MzJ4NExpc3RUeXBlZERhdGFfSW50MzJ4NEFycmF5X25ld0Zsb2F0NjR4Mkxpc3RUeXBlZERhdGFfRmxvYXQ2NHgyQXJyYXlfbmV3RmxvYXQzMng0eHh4eHh4eHl4eHh6eHh4d3h4eXh4eHl5eHh5enh4eXd4eHp4eHh6eXh4enp4eHp3eHh3eHh4d3l4eHd6eHh3d3h5eHh4eXh5eHl4enh5eHd4eXl4eHl5eXh5eXp4eXl3eHl6eHh5enl4eXp6eHl6d3h5d3h4eXd5eHl3enh5d3d4enh4eHp4eXh6eHp4enh3eHp5eHh6eXl4enl6eHp5d3h6enh4enp5eHp6enh6end4end4eHp3eXh6d3p4end3eHd4eHh3eHl4d3h6eHd4d3h3eXh4d3l5eHd5enh3eXd4d3p4eHd6eXh3enp4d3p3eHd3eHh3d3l4d3d6eHd3d3l4eHh5eHh5eXh4enl4eHd5eHl4eXh5eXl4eXp5eHl3eXh6eHl4enl5eHp6eXh6d3l4d3h5eHd5eXh3enl4d3d5eXh4eXl4eXl5eHp5eXh3eXl5eHl5eXl5eXl6eXl5d3l5enh5eXp5eXl6enl5end5eXd4eXl3eXl5d3p5eXd3eXp4eHl6eHl5enh6eXp4d3l6eXh5enl5eXp5enl6eXd5enp4eXp6eXl6enp5enp3eXp3eHl6d3l5end6eXp3d3l3eHh5d3h5eXd4enl3eHd5d3l4eXd5eXl3eXp5d3l3eXd6eHl3enl5d3p6eXd6d3l3d3h5d3d5eXd3enl3d3d6eHh4enh4eXp4eHp6eHh3enh5eHp4eXl6eHl6enh5d3p4enh6eHp5enh6enp4end6eHd4enh3eXp4d3p6eHd3enl4eHp5eHl6eXh6enl4d3p5eXh6eXl5enl5enp5eXd6eXp4enl6eXp5enp6eXp3enl3eHp5d3l6eXd6enl3d3p6eHh6enh5enp4enp6eHd6enl4enp5eXp6eXp6enl3enp6eHp6enl6enp6enp6d3p6d3h6end5enp3enp6d3d6d3h4end4eXp3eHp6d3h3end5eHp3eXl6d3l6end5d3p3enh6d3p5end6enp3end6d3d4end3eXp3d3p6d3d3d3h4eHd4eHl3eHh6d3h4d3d4eXh3eHl5d3h5end4eXd3eHp4d3h6eXd4enp3eHp3d3h3eHd4d3l3eHd6d3h3d3d5eHh3eXh5d3l4end5eHd3eXl4d3l5eXd5eXp3eXl3d3l6eHd5enl3eXp6d3l6d3d5d3h3eXd5d3l3end5d3d3enh4d3p4eXd6eHp3enh3d3p5eHd6eXl3enl6d3p5d3d6enh3enp5d3p6end6end3end4d3p3eXd6d3p3end3d3d4eHd3eHl3d3h6d3d4d3d3eXh3d3l5d3d5end3eXd3d3p4d3d6eXd3enp3d3p3d3d3eHd3d3l3d3d6d3d3d0Zsb2F0MzJ4NF9mcm9tRG91Ymxlc3NwbGF0RmxvYXQzMng0X3NwbGF0emVyb0Zsb2F0MzJ4NF96ZXJvZnJvbUludDMyeDRCaXRzRmxvYXQzMng0X2Zyb21JbnQzMng0Qml0c2Zyb21GbG9hdDY0eDJGbG9hdDMyeDRfZnJvbUZsb2F0NjR4MkludDMyeDRJbnQzMng0X2Zyb21JbnRzSW50MzJ4NF9mcm9tQm9vbHNmcm9tRmxvYXQzMng0Qml0c0ludDMyeDRfZnJvbUZsb2F0MzJ4NEJpdHNGbG9hdDY0eDJGbG9hdDY0eDJfZnJvbURvdWJsZXNGbG9hdDY0eDJfc3BsYXRGbG9hdDY0eDJfemVyb2Zyb21GbG9hdDMyeDRGbG9hdDY0eDJfZnJvbUZsb2F0MzJ4NFVubW9kaWZpYWJsZUJ5dGVCdWZmZXJWaWV3VW5tb2RpZmlhYmxlQnl0ZURhdGFWaWV3QW4gVW5tb2RpZmlhYmxlQnl0ZURhdGFWaWV3IG1heSBub3QgYmUgbW9kaWZpZWRfVW5tb2RpZmlhYmxlTGlzdE1peGluVERfVW5tb2RpZmlhYmxlVWludDhMaXN0VmlldyZVbm1vZGlmaWFibGVMaXN0QmFzZSZfVW5tb2RpZmlhYmxlTGlzdE1peGluVW5tb2RpZmlhYmxlVWludDhMaXN0Vmlld19Vbm1vZGlmaWFibGVJbnQ4TGlzdFZpZXcmVW5tb2RpZmlhYmxlTGlzdEJhc2UmX1VubW9kaWZpYWJsZUxpc3RNaXhpblVubW9kaWZpYWJsZUludDhMaXN0Vmlld19Vbm1vZGlmaWFibGVVaW50OENsYW1wZWRMaXN0VmlldyZVbm1vZGlmaWFibGVMaXN0QmFzZSZfVW5tb2RpZmlhYmxlTGlzdE1peGluVW5tb2RpZmlhYmxlVWludDhDbGFtcGVkTGlzdFZpZXdfVW5tb2RpZmlhYmxlVWludDE2TGlzdFZpZXcmVW5tb2RpZmlhYmxlTGlzdEJhc2UmX1VubW9kaWZpYWJsZUxpc3RNaXhpblVubW9kaWZpYWJsZVVpbnQxNkxpc3RWaWV3X1VubW9kaWZpYWJsZUludDE2TGlzdFZpZXcmVW5tb2RpZmlhYmxlTGlzdEJhc2UmX1VubW9kaWZpYWJsZUxpc3RNaXhpblVubW9kaWZpYWJsZUludDE2TGlzdFZpZXdfVW5tb2RpZmlhYmxlVWludDMyTGlzdFZpZXcmVW5tb2RpZmlhYmxlTGlzdEJhc2UmX1VubW9kaWZpYWJsZUxpc3RNaXhpblVubW9kaWZpYWJsZVVpbnQzMkxpc3RWaWV3X1VubW9kaWZpYWJsZUludDMyTGlzdFZpZXcmVW5tb2RpZmlhYmxlTGlzdEJhc2UmX1VubW9kaWZpYWJsZUxpc3RNaXhpblVubW9kaWZpYWJsZUludDMyTGlzdFZpZXdfVW5tb2RpZmlhYmxlVWludDY0TGlzdFZpZXcmVW5tb2RpZmlhYmxlTGlzdEJhc2UmX1VubW9kaWZpYWJsZUxpc3RNaXhpblVubW9kaWZpYWJsZVVpbnQ2NExpc3RWaWV3X1VubW9kaWZpYWJsZUludDY0TGlzdFZpZXcmVW5tb2RpZmlhYmxlTGlzdEJhc2UmX1VubW9kaWZpYWJsZUxpc3RNaXhpblVubW9kaWZpYWJsZUludDY0TGlzdFZpZXdfVW5tb2RpZmlhYmxlSW50MzJ4NExpc3RWaWV3JlVubW9kaWZpYWJsZUxpc3RCYXNlJl9Vbm1vZGlmaWFibGVMaXN0TWl4aW5Vbm1vZGlmaWFibGVJbnQzMng0TGlzdFZpZXdfVW5tb2RpZmlhYmxlRmxvYXQzMng0TGlzdFZpZXcmVW5tb2RpZmlhYmxlTGlzdEJhc2UmX1VubW9kaWZpYWJsZUxpc3RNaXhpblVubW9kaWZpYWJsZUZsb2F0MzJ4NExpc3RWaWV3X1VubW9kaWZpYWJsZUZsb2F0NjR4Mkxpc3RWaWV3JlVubW9kaWZpYWJsZUxpc3RCYXNlJl9Vbm1vZGlmaWFibGVMaXN0TWl4aW5Vbm1vZGlmaWFibGVGbG9hdDY0eDJMaXN0Vmlld19Vbm1vZGlmaWFibGVGbG9hdDMyTGlzdFZpZXcmVW5tb2RpZmlhYmxlTGlzdEJhc2UmX1VubW9kaWZpYWJsZUxpc3RNaXhpblVubW9kaWZpYWJsZUZsb2F0MzJMaXN0Vmlld19Vbm1vZGlmaWFibGVGbG9hdDY0TGlzdFZpZXcmVW5tb2RpZmlhYmxlTGlzdEJhc2UmX1VubW9kaWZpYWJsZUxpc3RNaXhpblVubW9kaWZpYWJsZUZsb2F0NjRMaXN0Vmlld19jb252VTMyX2NvbnZVNjRfY29udkYzMl9jb252RjY0X2J5dGVTd2FwMTZfYnl0ZVN3YXAzMjQyNzgyNTUzNjA0Mjk0OTAxNzYwX2J5dGVTd2FwNjRfdG9JbnRfdG9JbnQ4X3RvVWludDhfdG9DbGFtcGVkVWludDhfdG9JbnQxNl90b1VpbnQxNl90b0ludDMyX3RvVWludDMyX3JhbmdlQ2hlY2tfb2Zmc2V0QWxpZ25tZW50Q2hlY2thbGlnbm1lbnRPZmZzZXQgKCkgbXVzdCBiZSBhIG11bHRpcGxlIG9mIEJZVEVTX1BFUl9FTEVNRU5UICh2bXNlcnZpY2VfaW9zZXJ2ZXIuZGFydFBlbmRpbmdXcml0ZXBhcmVudF9kaXJlY3RvcnljcmVhdGVyZWN1cnNpdmV3cml0ZUFzQnl0ZXNXcml0ZUxpbWl0ZXJwZW5kaW5nV3JpdGVza01heE9wZW5Xcml0ZXNvcGVuV3JpdGVzc2NoZWR1bGVXcml0ZXB3X21heWJlV3JpdGVGaWxlc193cml0ZUNvbXBsZXRlZEZpbGVSZXF1ZXN0c3BsaWJyYXJ5VXJsSXNvbGF0ZUxvYWRlclN0YXRlaXNvbGF0ZUlkX2RlYWRfd29ya2luZ0RpcmVjdG9yeV9yb290U2NyaXB0X3BhY2thZ2VFcnJvcl9wYWNrYWdlUm9vdF9wYWNrYWdlQ29uZmlnX3BhY2thZ2VNYXBfbWF4RmlsZVJlcXVlc3RzY3VycmVudEZpbGVSZXF1ZXN0c19maWxlUmVxdWVzdFF1ZXVlX3BlbmRpbmdQYWNrYWdlTG9hZHNfcGFja2FnZXNQb3J0cGFja2FnZVJvb3RGbGFncGFja2FnZXNDb25maWdGbGFnd29ya2luZ0RpcmVjdG9yeXJvb3RTY3JpcHRfc2V0UGFja2FnZVJvb3Rfc2V0UGFja2FnZXNDb25maWd1cGRhdGVQYWNrYWdlTWFwX3BhY2thZ2VzUmVhZHlzaG91bGRJc3N1ZUZpbGVSZXF1ZXN0ZW5xdWV1ZUZpbGVSZXF1ZXN0ZGVxdWV1ZUZpbGVSZXF1ZXN0ZmlsZTpodHRwOmh0dHBzOnBhY2thZ2VzUGFyYW1wYWNrYWdlc05hbWVfcmVxdWVzdFBhY2thZ2VzTWFwX3RyaWdnZXJQYWNrYWdlUmVzb2x1dGlvbl9yZXNvbHZlUGFja2FnZVVyaXdyb25ncGFja2FnZTovL1VSSXMgdXNpbmcgdGhlICdwYWNrYWdlOicgc2NoZW1lIHNob3VsZCBsb29rIGxpa2UgJywgbm90ICdwYWNrYWdlTmFtZUVuZFVSSVMgdXNpbmcgdGhlICdwYWNrYWdlOicgc2NoZW1lIHNob3VsZCBsb29rIGxpa2UgJ3BhY2thZ2U6cGFja2FnZU5hbWUnLCBub3QgJ3BhY2thZ2U6UmVzb2x2aW5nIHBhY2thZ2Ugd2l0aCB1cmkgcGF0aDogUmVzb2x2aW5nIHBhY2thZ2Ugd2l0aCBwZW5kaW5nIHJlc29sdXRpb24gZXJyb3I6ICdwYWNrYWdlOi8nLCBub3QgJ3BhY2thZ2U6TWFwcGVkICcnIHBhY2thZ2UgdG8gJ05vIG1hcHBpbmcgZm9yICcnIHBhY2thZ2Ugd2hlbiByZXNvbHZpbmcgJ1BhdGggdG8gYmUgcmVzb2x2ZWQgaW4gcGFja2FnZTogUmVzb2x2ZWQgJycgdG8gJ19oYW5kbGVQYWNrYWdlc1JlcGx5UmVxdWVzdGVkIHBhY2thZ2VzIG1hcCBmb3IgJ0dvdCBwYWNrYWdlcyByZXBseTogR290IGZhaWx1cmUgcmVzcG9uc2Ugb24gcGFja2FnZSBwb3J0OiAnUmVjZWl2ZWQgcGFja2FnZSByb290OiAnU2V0dXAgcGFja2FnZSBtYXA6IEJhZCB0eXBlIG9mIHBhY2thZ2VzIHJlcGx5OiByZXFXZWJTb2NrZXRDbGllbnRQQVJTRV9FUlJPUl9DT0RFQklOQVJZX01FU1NBR0VfRVJST1JfQ09ERU5PVF9NQVBfRVJST1JfQ09ERUlEX0VSUk9SX0NPREVzb2NrZXRzZXJ2aWNlb25XZWJTb2NrZXRNZXNzYWdlZGlzY29ubmVjdE1lc3NhZ2UgcGFyc2UgZXJyb3I6IE1lc3NhZ2UgbXVzdCBiZSBhIEpTT04gbWFwLnJwY29uUmVxdWVzdG9uTm90aWZpY2F0aW9ub25SZXNwb25zZU1lc3NhZ2UgbXVzdCBiZSBhIHN0cmluZy5wb3N0YWRkVXRmOFRleHRIdHRwUmVxdWVzdENsaWVudGpzb25Db250ZW50VHlwZWNoYXJzZXRzZW5kRXZlbnRzQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luQ2FuIG5vdCBoYW5kbGUgYmluYXJ5IHJlc3BvbnNlc1dFQlNPQ0tFVF9QQVRIL3dzUk9PVF9SRURJUkVDVF9QQVRIL2luZGV4Lmh0bWxfc2VydmljZV9pcF9wb3J0X29yaWdpbkNoZWNrRGlzYWJsZWRfYXV0aENvZGVzRGlzYWJsZWRfc2VydmVyYXV0aENvZGVzRGlzYWJsZWRzZXJ2ZXJBZGRyZXNzaXBfaXNBbGxvd2VkT3JpZ2lubG9jYWxob3N0OjoxMTI3LjAuMC4xX29yaWdpbkNoZWNrb3JpZ2luc1NlYy1XZWJTb2NrZXQtT3JpZ2luT3JpZ2luX2NoZWNrQXV0aFRva2VuQW5kR2V0UGF0aHJlcXVlc3RVcmlyZXF1ZXN0UGF0aFNlZ21lbnRzYXV0aFRva2VuX3JlcXVlc3RIYW5kbGVyZm9yYmlkZGVuIG9yaWdpblBVVGZzTmFtZUxpc3Rmc1BhdGhMaXN0ZnNQYXRoQmFzZTY0TGlzdGZzVXJpQmFzZTY0TGlzdGZzTmFtZWZzUGF0aGZzVXJpZGV2X2ZzX25hbWVkZXZfZnNfdXJpX2I2NGRlY29kZWRGc1VyaWRldl9mc19wYXRoZGV2X2ZzX3BhdGhfYjY0ZGV2ZnNoYW5kbGVQdXRTdHJlYW1tZXRob2Qgbm90IGFsbG93ZWRtaXNzaW5nIG9yIGludmFsaWQgYXV0aGVudGljYXRpb24gY29kZXdlYlNvY2tldFRoaXMgVk0gd2FzIGJ1aWx0IHdpdGhvdXQgdGhlIE9ic2VydmF0b3J5IFVJLmFzc2V0bWltZVR5cGVzdGFydHVwcG9sbEVycm9ycG9sbFN0YWNrcG9sbGFkZHJlc3Nlc2F0dGVtcHRzbWF4QXR0ZW1wdHNPYnNlcnZhdG9yeSBzZXJ2ZXIgZmFpbGVkIHRvIHN0YXJ0IGFmdGVyICB0cmllc0NvdWxkIG5vdCBzdGFydCBPYnNlcnZhdG9yeSBIVFRQIHNlcnZlcjoKaXNFeGl0aW5nT2JzZXJ2YXRvcnkgSFRUUCBzZXJ2ZXIgZXhpdGluZyBiZWZvcmUgbGlzdGVuaW5nIGFzIHZtIHNlcnZpY2UgaGFzIHJlY2VpdmVkIGV4aXQgcmVxdWVzdApPYnNlcnZhdG9yeSBsaXN0ZW5pbmcgb24gL2RhcnQuc2VydmljZXMvQ3JlYXRpbmcgY3JlYXRlU3luY0RlbGV0aW5nIGRlbGV0ZVN5bmNvbGRTZXJ2ZXJBZGRyZXNzT2JzZXJ2YXRvcnkgbm8gbG9uZ2VyIGxpc3RlbmluZyBvbiBDb3VsZCBub3Qgc2h1dGRvd24gT2JzZXJ2YXRvcnkgSFRUUCBzZXJ2ZXI6Cl9hdXRvU3RhcnRfaXNXaW5kb3dzX2lzRnVjaHNpYV9zaWduYWxXYXRjaF9zaWduYWxTdWJzY3JpcHRpb25zZXJ2ZXJzZXJ2ZXJGdXR1cmVfcmVnaXN0ZXJTaWduYWxIYW5kbGVyVGltZXJfdHJhY2VMb2FkaW5nX2RldGVybWluaXN0aWNfaHR0cENsaWVudF9TUEFDRV9IQVNIX0RPVF9DT0xPTl9ERUxfaW52YWxpZFBhY2thZ2VOYW1lQ2hhcnNfRGFydF9rQ2Fub25pY2FsaXplVXJsX0RhcnRfa1NjcmlwdFRhZ19EYXJ0X2tTb3VyY2VUYWdfRGFydF9rSW1wb3J0VGFnX0RhcnRfa0luaXRMb2FkZXJfRGFydF9rUmVzb3VyY2VMb2FkX0RhcnRfa0dldFBhY2thZ2VSb290VXJpX0RhcnRfa0dldFBhY2thZ2VDb25maWdVcmlfRGFydF9rUmVzb2x2ZVBhY2thZ2VVcmlfRGFydF9rSW1wb3J0RXh0ZW5zaW9uX0RhcnRfa1Jlc29sdmVBc0ZpbGVQYXRoc2lsZW50T2JzZXJ2YXRvcnlTSUxFTlRfT0JTRVJWQVRPUllfc2FuaXRpemVXaW5kb3dzUGF0aGZpeGVkUGF0aF90cmltV2luZG93c1BhdGhfZW5mb3JjZVRyYWlsaW5nU2xhc2glIF9zZW5kUmVzb3VyY2VSZXNwb25zZUNvdWxkIG5vdCBsb2FkICJDb3VsZCBub3QgaW1wb3J0ICIiIGZyb20gIl9zZW5kRXh0ZW5zaW9uSW1wb3J0UmVzcG9uc2VDb3VsZCBub3QgcmVzb2x2ZSAiX2xvYWRIdHRwbWF4Q29ubmVjdGlvbnNQZXJIb3N0X2xvYWRGaWxlbG9hZGVyU3RhdGVfbG9hZERhdGFVcmltaW1lYXBwbGljYXRpb24vZGFydHRleHQvcGxhaW5NSU1FLXR5cGUgbXVzdCBiZSBhcHBsaWNhdGlvbi9kYXJ0IG9yIHRleHQvcGxhaW46IFVTLUFTQ0lJT25seSB1dGYtOCBvciBVUy1BU0NJSSBlbmNvZGluZ3MgYXJlIHN1cHBvcnRlZDogSW52YWxpZCBkYXRhIHVyaSAoKToKICBfbG9hZFBhY2thZ2V0cmFjZUxvYWRpbmdFeGNlcHRpb24gKCkgd2hlbiByZXNvbHZpbmcgcGFja2FnZSBVUkk6IFBlbmRpbmcgcGFja2FnZSBsb2FkIG9mICcgcGVuZGluZ19oYW5kbGVSZXNvdXJjZVJlcXVlc3RVbmtub3duIHNjaGVtZSAoKSBmb3IgX3BhcnNlUGFja2FnZXNGaWxlcGFja2FnZXNGaWxlaW52YWxpZFBhY2thZ2VOYW1lU2tpcHBpbmcgY29tbWVudCBpbiBMaW5lIHN0YXJ0cyB3aXRoICc6JyBpbiBNaXNzaW5nIHBhY2thZ2UgbmFtZSBpbiBMaW5lIGhhcyBubyAnOicgaW4gTWlzc2luZyAnOicgc2VwYXJhdG9yIGluIEludmFsaWQgcGFja2FnZSBuYW1lIEludmFsaWQgcGFja2FnZSBuYW1lICdwYWNrYWdlTmFtZTogb3JpZ2luYWwgcGFja2FnZVVyaTogbWFwcGluZzogUGFyc2VkIHBhY2thZ2VzIGZpbGUgYXQgLiBTZW5kaW5nOgpfbG9hZFBhY2thZ2VzRmlsZUxvYWRlZCBwYWNrYWdlcyBmaWxlIGZyb20gRXJyb3IgbG9hZGluZyBwYWNrYWdlczogVW5jYXVnaHQgZXJyb3IgKCkgbG9hZGluZyBwYWNrYWdlcyBmaWxlLl9maW5kUGFja2FnZXNGaWxlZGlyVXJpQ2hlY2tpbmcgZm9yICBmaWxlLiBleGlzdHM6IENvdWxkIG5vdCByZXNvbHZlIGEgcGFja2FnZSBsb2NhdGlvbiBmcm9tIENvdWxkIG5vdCByZXNvbHZlIGEgcGFja2FnZSBsb2NhdGlvbiBmb3IgYmFzZSBhdCBfbG9hZEh0dHBQYWNrYWdlc0ZpbGVyZXNvdXJjZUZldGNoaW5nIHBhY2thZ2VzIGZpbGUgZnJvbSAncnNwOnN0cmVhbTpmb3ItaXRlcmF0b3I6cHJvZHVjdC1tb2RlR290IHN0YXR1cyAgZmV0Y2hpbmcgJ0xvYWRlZCBwYWNrYWdlcyBmaWxlIGZyb20gJyc6CkVycm9yIGxvYWRpbmcgcGFja2FnZXMgZmlsZSBmcm9tICcpIGxvYWRpbmcgcGFja2FnZXMgZmlsZSBmcm9tICdfbG9hZFBhY2thZ2VzRGF0YU1JTUUtdHlwZSBtdXN0IGJlIHRleHQvcGxhaW46ICkgbG9hZGluZyBwYWNrYWdlcyBkYXRhLl9oYW5kbGVQYWNrYWdlc1JlcXVlc3RVbnN1cHBvcnRlZCBzY2hlbWUgdXNlZCB0byBsb2NhdGUgLnBhY2thZ2VzIGZpbGU6IEhhbmRsaW5nIGxvYWQgb2YgcGFja2FnZXMgbWFwOiAnUGFja2FnZXMgZmlsZSAnKSBmb3IgcGFja2FnZSBmaWxlIGF0IFVua25vd24gcGFja2FnZXMgcmVxdWVzdCB0YWc6IEVycm9yIGhhbmRsaW5nIHBhY2thZ2VzIHJlcXVlc3Q6ICkgaGFuZGxpbmcgcGFja2FnZXMgcmVxdWVzdC5zaHV0ZG93bkxvYWRlcnNTZXJ2aWNlIHNodXRkb3duaWVkaWxzX3Byb2Nlc3NMb2FkUmVxdWVzdGlzUmVsb2FkaW5ncGF0aFVyaSkgaW4gQ2Fubm90IHJlc29sdmUgc2NoZW1lICgpIHRvIGZpbGUgcGF0aFVua25vd24gbG9hZGVyIHJlcXVlc3QgdGFnPXNlcnZlclByaW50X25vdGlmeVNlcnZlclN0YXRlVk1TZXJ2aWNlSU9fTm90aWZ5U2VydmVyU3RhdGVfbGF6eVNlcnZlckJvb3RjbGVhbnVwQ2FsbGJhY2tFcnJvciBpbiB2bS1zZXJ2aWNlIHNodXRkb3duOiBjcmVhdGVUZW1wRGlyQ2FsbGJhY2tjcmVhdGVUZW1wZGVsZXRlRGlyQ2FsbGJhY2t3cml0ZUZpbGVDYWxsYmFja3dyaXRlU3RyZWFtRmlsZUNhbGxiYWNrcmVhZEZpbGVDYWxsYmFja2xpc3RGaWxlc0NhbGxiYWNrZGlyUGF0aGRpclBhdGhTdHJmaWxlRW50aXR5ZmlsZVBhdGhtb2RpZmllZHNlcnZlckluZm9ybWF0aW9uQ2FsbGJhY2t3ZWJTZXJ2ZXJDb250cm9sQ2FsbGJhY2tfY2xlYXJGdXR1cmVfb25TaWduYWxzaWduYWxfcmVnaXN0ZXJTaWduYWxIYW5kbGVyX3NodXRkb3duVk1TZXJ2aWNlSU9fU2h1dGRvd25kYXJ0Ll92bXNlcnZpY2Vhc3NldC5kYXJ0Y2xpZW50LmRhcnRkZXZmcy5kYXJ0Y29uc3RhbnRzLmRhcnRydW5uaW5nX2lzb2xhdGUuZGFydHJ1bm5pbmdfaXNvbGF0ZXMuZGFydG1lc3NhZ2UuZGFydG1lc3NhZ2Vfcm91dGVyLmRhcnRuYW1lZF9sb29rdXAuZGFydFNlcnZlclN0YXJ0Q2FsbGJhY2tTZXJ2ZXJTdG9wQ2FsbGJhY2tDbGVhbnVwQ2FsbGJhY2tDcmVhdGVUZW1wRGlyQ2FsbGJhY2tEZWxldGVEaXJDYWxsYmFja1dyaXRlRmlsZUNhbGxiYWNrV3JpdGVTdHJlYW1GaWxlQ2FsbGJhY2tSZWFkRmlsZUNhbGxiYWNrTGlzdEZpbGVzQ2FsbGJhY2tTZXJ2ZXJJbmZvcm1hbWVzc2FnZV9yb3V0ZXJ0aW9uQ2FsbGJhY2tTZXJ2ZXJJbmZvcm1hdGlvbkNhbGxiYWNrV2ViU2VydmVyQ29udHJvbENhbGxiYWNrQ2xpZW50U2VydmljZUhhbmRsZUlzb2xhdGVFbWJlZGRlckRhdGFWTVNlcnZpY2VFbWJlZGRlckhvb2tzc2VydmVyU3RhcnRzZXJ2ZXJTdG9wY3JlYXRlVGVtcERpcmRlbGV0ZURpcndyaXRlRmlsZXdyaXRlU3RyZWFtRmlsZXJlYWRGaWxlbGlzdEZpbGVzc2VydmVySW5mb3JtYXRpb253ZWJTZXJ2ZXJDb250cm9sVk1TZXJ2aWNlc2VydmljZU5hbWVzcGFjZWNsaWVudHNfc2VydmljZVJlcXVlc3Rzc3JydW5uaW5nSXNvbGF0ZXNldmVudFBvcnRrU2VydmljZVN0cmVhbV9TZXJ2aWNlc2VydmljZVN0cmVhbXNtZXNzYWdlSGFuZGxlcl9hZGRDbGllbnRzdHJlYW1zc2VydmljZXNfcmVtb3ZlQ2xpZW50bmFtZXNwYWNla2V5T2ZzdHJlYW1JZF9pc0FueUNsaWVudFN1YnNjcmliZWRfZXZlbnRNZXNzYWdlSGFuZGxlcmpzb25ycGMyLjBzdHJlYW1Ob3RpZnlTZXJ2aWNlVW5yZWdpc3RlcmVkc2VydmljZUhhbmRsZXNfY29udHJvbE1lc3NhZ2VIYW5kbGVycG9ydElkaXNvbGF0ZVN0YXJ0dXBpc29sYXRlU2h1dGRvd25fc2VydmVyTWVzc2FnZUhhbmRsZXJfaGFuZGxlTmF0aXZlUnBjQ2FsbFRoZSBjbGllbnQgc2VudCBhIG5vbi1yZXF1ZXN0IGpzb24tcnBjIG1lc3NhZ2Uucm91dGVSZXF1ZXN0VGhlIHJwYyBjYWxsIHJlc3VsdGVkIGluIGV4Y2VwdGlvbjogX2V4aXRjbGllbnRzTGlzdEludGVybmFsIHZtLXNlcnZpY2UgZXJyb3I6IGlnbm9yaW5nIGlsbGVnYWwgbWVzc2FnZTogX2ZpbmRGaXJzdENsaWVudFRoYXRIYW5kbGVzU2VydmljZV9zdHJlYW1MaXN0ZW5zdHJlYW1MaXN0ZW46IGludmFsaWQgJ3N0cmVhbUlkJyBwYXJhbWV0ZXI6IF9zZW5kU2VydmljZVJlZ2lzdGVyZWRFdmVudF9zdHJlYW1DYW5jZWxfaGFzTmFtZXNwYWNlX2dldE5hbWVzcGFjZV9nZXRNZXRob2RfcmVnaXN0ZXJTZXJ2aWNlcmVnaXN0ZXJTZXJ2aWNlOiBpbnZhbGlkICdzZXJ2aWNlJyBwYXJhbWV0ZXI6IHJlZ2lzdGVyU2VydmljZTogaW52YWxpZCAnYWxpYXMnIHBhcmFtZXRlcjogU2VydmljZVJlZ2lzdGVyZWRfaGFuZGxlU2VydmljZW5ld0lkb2xkSWRzZXJpYWxmb3J3YXJkVG9Kc29uVW5rbm93biBzZXJ2aWNlOiBhcmdzT2ZTdHJpbmdfcm91dGVSZXF1ZXN0SW1wbGNvbXBsZXRlZHN0cmVhbUxpc3RlbnN0cmVhbUNhbmNlbHNob3VsZEhhbmRsZU1lc3NhZ2VoYW5kbGVNZXNzYWdlc2VuZFRvVk1zZXRFcnJvclJlc3BvbnNlVW5leHBlY3RlZCBleGNlcHRpb246cm91dGVSZXNwb25zZXJlbGVhc2VBc3NldGV4dGVuc2lvblN0YXJ0dGV4dC9odG1sOyBjaGFyc2V0PVVURi04YXBwbGljYXRpb24vZGFydDsgY2hhcnNldD1VVEYtOGFwcGxpY2F0aW9uL2phdmFzY3JpcHQ7IGNoYXJzZXQ9VVRGLThjc3N0ZXh0L2NzczsgY2hhcnNldD1VVEYtOGdpZmltYWdlL2dpZnBuZ2ltYWdlL3BuZ2pwZ2ltYWdlL2pwZWdqcGVnaW1hZ2Uvc3ZnK3htbHRhckJ5dGVzYXNzZXRMaXN0YXNzZXRzQ2xpZW50X0ZpbGVTeXN0ZW1yZXNvbHZlUGF0aERldkZTX2ZzTWFwX3JwY05hbWVzX2xpc3REZXZGU19jcmVhdGVEZXZGU19kZWxldGVEZXZGU19yZWFkRGV2RlNGaWxlX3dyaXRlRGV2RlNGaWxlX3dyaXRlRGV2RlNGaWxlc19saXN0RGV2RlNGaWxlc2RlbGV0aW9uc1VuZXhwZWN0ZWQgcnBjIEZpbGVTeXN0ZW1MaXN0ZnNOYW1lc3VyaVBhcmFtRlNGaWxlZmlsZUNvbnRlbnRzX3JlYWREZXZGU0ZpbGU6IGRlY29kZWRGaWxlQ29udGVudHNmaWxlSW5mbzogaW52YWxpZCAnZmlsZXMnIHBhcmFtZXRlciBhdCBpbmRleCBmaWxlTGlzdEZTRmlsZUxpc3RDb25zdGFudHNTRVJWSUNFX0VYSVRfTUVTU0FHRV9JRElTT0xBVEVfU1RBUlRVUF9NRVNTQUdFX0lESVNPTEFURV9TSFVURE9XTl9NRVNTQUdFX0lEV0VCX1NFUlZFUl9DT05UUk9MX01FU1NBR0VfSURTRVJWRVJfSU5GT19NRVNTQUdFX0lETUVUSE9EX0NBTExfRlJPTV9OQVRJVkVSdW5uaW5nSXNvbGF0ZXNlcnZpY2VJZGlzb2xhdGVzL3NlbmRUb0lzb2xhdGVSdW5uaW5nSXNvbGF0ZXNpc29sYXRlc19yb290UG9ydElkcmlpc29sYXRlUGFyYW1pbnZhbGlkICdpc29sYXRlSWQnIHBhcmFtZXRlcjogU2VudGluZWxDb2xsZWN0ZWR2YWx1ZUFzU3RyaW5nPGNvbGxlY3RlZD5zZXRSZXNwb25zZWV2YWx1YXRlSW5GcmFtZV9FdmFsdWF0b3JfbWVzc2FnZV9idWlsZFNjb3BlYnVpbGRTY29wZVJlc3BvbnNlcmVzcG9uc2VKc29uZGVjb2RlSnNvbmtlcm5lbEJhc2U2NF9jb21waWxlRXhwcmVzc2lvbl9ldmFsdWF0ZUNvbXBpbGVkRXhwcmVzc2lvbl9zZXR1cFBhcmFtc2J1aWxkU2NvcGVQYXJhbXNfYnVpbGRFeHByZXNzaW9uRXZhbHVhdGlvblNjb3BlYnVpbGRTY29wZWJ1aWxkU2NvcGVSZXNwb25zZVJlc3VsdGV4dGVybmFsQ2xpZW50Y29tcGlsZVBhcmFtc3BhcmFtX25hbWVzdHlwZV9wYXJhbXNfbmFtZXNqc29uTWFwa2VybmVsQnl0ZXNjb21waWxlRXhwcmVzc2lvblBhcmFtc2Rpc2FibGVCcmVha3BvaW50c3J1blBhcmFtc3J1bkV4cHJlc3Npb25mcmFtZUluZGV4dGFyZ2V0SWRNZXNzYWdlVHlwZVJlcXVlc3RNZXNzYWdlVHlwZS5SZXF1ZXN0Tm90aWZpY2F0aW9uTWVzc2FnZVR5cGUuTm90aWZpY2F0aW9uUmVzcG9uc2VNZXNzYWdlVHlwZS5SZXNwb25zZV9mcm9tSnNvblJwY1JlcXVlc3RfZnJvbUpzb25ScGNOb3RpZmljYXRpb25fZnJvbUpzb25ScGNSZXN1bHRfZnJvbUpzb25ScGNFcnJvcmZvck1ldGhvZHF1ZXJ5UGFyYW1ldGVyc2Zvcklzb2xhdGVmcm9tSnNvblJwYyJpZCIgbXVzdCBiZSBhIG51bWJlciwgc3RyaW5nLCBvciBudWxsLkludmFsaWQgbWVzc2FnZSBmb3JtYXRfbWV0aG9kTmFtZUZyb21Vcml0b1VyaW92ZXJsb2Fkc19tYWtlQWxsU3RyaW5nbmV3X2xpc3Rfc2V0UmVzcG9uc2VGcm9tUG9ydGNvdWxkIG5vdCBzZW5kIG1lc3NhZ2UgW10gdG8gaXNvbGF0ZV9tZXRob2ROZWVkc09iamVjdFBhcmFtZXRlcnNNZXNzYWdlUm91dGVyUmVzcG9uc2VQYXlsb2FkS2luZFJlc3BvbnNlUGF5bG9hZEtpbmQuU3RyaW5nUmVzcG9uc2VQYXlsb2FkS2luZC5CaW5hcnlVdGY4U3RyaW5nUmVzcG9uc2VQYXlsb2FkS2luZC5VdGY4U3RyaW5nU2VydmljZUVycm9ySW50ZXJuYWxFcnJvclVucmVjb2duaXplZCByZXNwb25zZTogQmluYXJ5IHJlc3BvbnNlcyBjYW4gbm90IGJlIGRlY29kZWRfTmFtZWRMb29rdXAmT2JqZWN0Jkl0ZXJhYmxlTWl4aW5OYW1lZExvb2t1cF9lbGVtZW50c19pZHNJZEdlbmVyYXRvcmlzb2xhdGVDb250cm9sUG9ydHNjcmlwdExvYWRQb3J0c2VydmljZUF1dGhUb2tlbmlzb2xhdGVFbWJlZGRlckRhdGFrUGFyc2VFcnJvcmtJbnZhbGlkUmVxdWVzdGtNZXRob2ROb3RGb3VuZGtJbnRlcm5hbEVycm9ya0ZlYXR1cmVEaXNhYmxlZGtDYW5ub3RBZGRCcmVha3BvaW50a1N0cmVhbUFscmVhZHlTdWJzY3JpYmVka1N0cmVhbU5vdFN1YnNjcmliZWRrSXNvbGF0ZU11c3RCZVJ1bm5hYmxla0lzb2xhdGVNdXN0QmVQYXVzZWRrQ2Fubm90UmVzdW1la0lzb2xhdGVJc1JlbG9hZGluZ2tJc29sYXRlUmVsb2FkQmFycmVka0lzb2xhdGVNdXN0SGF2ZVJlbG9hZGVka1NlcnZpY2VBbHJlYWR5UmVnaXN0ZXJlZGtTZXJ2aWNlRGlzYXBwZWFyZWRrRXhwcmVzc2lvbkNvbXBpbGF0aW9uRXJyb3JrRmlsZVN5c3RlbUFscmVhZHlFeGlzdHNrRmlsZVN5c3RlbURvZXNOb3RFeGlzdGtGaWxlRG9lc05vdEV4aXN0X2Vycm9yTWVzc2FnZXNGZWF0dXJlIGlzIGRpc2FibGVkU3RyZWFtIGFscmVhZHkgc3Vic2NyaWJlZFN0cmVhbSBub3Qgc3Vic2NyaWJlZEZpbGUgc3lzdGVtIGFscmVhZHkgZXhpc3RzRmlsZSBzeXN0ZW0gZG9lcyBub3QgZXhpc3RGaWxlIGRvZXMgbm90IGV4aXN0U2VydmljZSBhbHJlYWR5IHJlZ2lzdGVyZWRTZXJ2aWNlIGhhcyBkaXNhcHBlYXJlZEV4cHJlc3Npb24gY29tcGlsYXRpb24gZXJyb3JzaG9ydERlbGF5X2Fzc2V0c19kZWNvZGVBc3NldHNWTVNlcnZpY2VfRGVjb2RlQXNzZXRzQ291bGQgbm90IGxvYWQgT2JzZXJ2YXRvcnkgYXNzZXRzOiBfZW5jb2RlRGV2RlNEaXNhYmxlZEVycm9yRGV2RlMgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIERhcnQgaW1wbGVtZW50YXRpb25fZW5jb2RlRmlsZVN5c3RlbUFscmVhZHlFeGlzdHNFcnJvcjogZmlsZSBzeXN0ZW0gJycgYWxyZWFkeSBleGlzdHNfZW5jb2RlRmlsZVN5c3RlbURvZXNOb3RFeGlzdEVycm9yJyBkb2VzIG5vdCBleGlzdHNlbmRJc29sYXRlU2VydmljZU1lc3NhZ2VWTVNlcnZpY2VfU2VuZElzb2xhdGVTZXJ2aWNlTWVzc2FnZXNlbmRSb290U2VydmljZU1lc3NhZ2VWTVNlcnZpY2VfU2VuZFJvb3RTZXJ2aWNlTWVzc2FnZXNlbmRPYmplY3RSb290U2VydmljZU1lc3NhZ2VWTVNlcnZpY2VfU2VuZE9iamVjdFJvb3RTZXJ2aWNlTWVzc2FnZV9tYWtlQXV0aFRva2Vua1Rva2VuQnl0ZVNpemVlbmNvZGVScGNFcnJvcmVuY29kZU1pc3NpbmdQYXJhbUVycm9yIGV4cGVjdHMgdGhlICcnIHBhcmFtZXRlcmVuY29kZUludmFsaWRQYXJhbUVycm9yOiBpbnZhbGlkICcnIHBhcmFtZXRlcjogZW5jb2RlQ29tcGlsYXRpb25FcnJvcmRpYWdub3N0aWNlbmNvZGVSZXN1bHRlbmNvZGVTdWNjZXNzU3VjY2Vzc2Jvb3RfcmVnaXN0ZXJJc29sYXRlcG9ydF9pZF9vblN0YXJ0Vk1TZXJ2aWNlX09uU3RhcnRfb25FeGl0Vk1TZXJ2aWNlX09uRXhpdG9uU2VydmVyQWRkcmVzc0NoYW5nZVZNU2VydmljZV9PblNlcnZlckFkZHJlc3NDaGFuZ2Vfdm1MaXN0ZW5TdHJlYW1WTVNlcnZpY2VfTGlzdGVuU3RyZWFtX3ZtQ2FuY2VsU3RyZWFtVk1TZXJ2aWNlX0NhbmNlbFN0cmVhbV9yZXF1ZXN0QXNzZXRzVk1TZXJ2aWNlX1JlcXVlc3RBc3NldHNfc3Bhd25VcmlOb3RpZnlWTVNlcnZpY2Vfc3Bhd25VcmlOb3RpZnlfc2V0dXBDb21wbGV0ZWRfbG9hZFBvcnRfaXNvbGF0ZUlkX2xvZ0lkX3ByaW50U3RyaW5nQnVpbHRpbl9QcmludFN0cmluZ19nZXRQcmludENsb3N1cmVfbWFrZUxvYWRlclJlcXVlc3RTZXJ2aWNlIGlzb2xhdGUgaXMgbm90IGF2YWlsYWJsZS4qIF9zZXRXb3JraW5nRGlyZWN0b3J5U2V0dGluZyB3b3JraW5nIGRpcmVjdG9yeTogV29ya2luZyBkaXJlY3RvcnkgVVJJOiBTZXR0aW5nIHBhY2thZ2Ugcm9vdDogcGFja2FnZVJvb3RTdHJQYWNrYWdlIHJvb3QgVVJJOiBfc2V0UGFja2FnZXNNYXBSZXNvbHZpbmcgcGFja2FnZXMgbWFwOiBObyBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHNldC5wYWNrYWdlc1VyaVN0clJlc29sdmVkIHBhY2thZ2VzIG1hcCB0bzogX3Jlc29sdmVTY3JpcHRVcmlSZXNvbHZpbmcgc2NyaXB0OiBSZXNvbHZlZCBlbnRyeSBwb2ludCB0bzogX2ZpbGVQYXRoRnJvbVVyaXVzZXJVcmlHZXR0aW5nIGZpbGUgcGF0aCBmcm9tOiBOb3QgYSBrbm93biBzY2hlbWU6IF9yZXNvdXJjZVJlYWRBc0J5dGVzX2dldFBhY2thZ2VSb290RnV0dXJlUmVxdWVzdCBmb3IgcGFja2FnZSByb290IGZyb20gdXNlciBjb2RlLl9nZXRQYWNrYWdlQ29uZmlnRnV0dXJlUmVxdWVzdCBmb3IgcGFja2FnZSBjb25maWcgZnJvbSB1c2VyIGNvZGUuX3Jlc29sdmVQYWNrYWdlVXJpRnV0dXJlUmVxdWVzdCBmb3IgcGFja2FnZSBVcmkgcmVzb2x1dGlvbiBmcm9tIHVzZXIgY29kZTogTm9uLXBhY2thZ2UgVXJpLCByZXR1cm5pbmcgdW5tb2RpZmllZDogRXhjZXB0aW9uIHdoZW4gcmVzb2x2aW5nIHBhY2thZ2UgVVJJOiBuYXRpdmV3cmFwcGVyc05hdGl2ZUZpZWxkV3JhcHBlckNsYXNzMU5hdGl2ZUZpZWxkV3JhcHBlckNsYXNzMk5hdGl2ZUZpZWxkV3JhcHBlckNsYXNzM05hdGl2ZUZpZWxkV3JhcHBlckNsYXNzNGRhcnQuaW9ieXRlc19idWlsZGVyLmRhcnRjb21tb24uZGFydGRhdGFfdHJhbnNmb3JtZXIuZGFydGRpcmVjdG9yeS5kYXJ0ZGlyZWN0b3J5X2ltcGwuZGFydGVtYmVkZGVyX2NvbmZpZy5kYXJ0ZXZlbnRoYW5kbGVyLmRhcnRmaWxlLmRhcnRmaWxlX2ltcGwuZGFydGZpbGVfc3lzdGVtX2VudGl0eS5kYXJ0aW9fcmVzb3VyY2VfaW5mby5kYXJ0aW9fc2luay5kYXJ0aW9fc2VydmljZS5kYXJ0bGluay5kYXJ0bmFtZXNwYWNlX2ltcGwuZGFydG92ZXJyaWRlcy5kYXJ0cGxhdGZvcm0uZGFydHBsYXRmb3JtX2ltcGwuZGFydHByb2Nlc3MuZGFydHNlY3VyZV9zZXJ2ZXJfc29ja2V0LmRhcnRzZWN1cmVfc29ja2V0LmRhcnRzZWN1cml0eV9jb250ZXh0LmRhcnRzZXJ2aWNlX29iamVjdC5kYXJ0c29ja2V0LmRhcnRzdGRpby5kYXJ0c3RyaW5nX3RyYW5zZm9ybWVyLmRhcnRzeW5jX3NvY2tldC5kYXJ0X0FzeW5jRGlyZWN0b3J5TGlzdGVyT3BzSW1wbF9zZXRQb2ludGVyRGlyZWN0b3J5X1NldEFzeW5jRGlyZWN0b3J5TGlzdGVyUG9pbnRlcmdldFBvaW50ZXJEaXJlY3RvcnlfR2V0QXN5bmNEaXJlY3RvcnlMaXN0ZXJQb2ludGVyX1JhbmRvbUFjY2Vzc0ZpbGVPcHNJbXBsRmlsZV9TZXRQb2ludGVyRmlsZV9HZXRQb2ludGVyRmlsZV9DbG9zZUZpbGVfUmVhZEJ5dGVGaWxlX1JlYWRyZWFkSW50b0ZpbGVfUmVhZEludG9GaWxlX1dyaXRlQnl0ZXdyaXRlRnJvbUZpbGVfV3JpdGVGcm9tRmlsZV9Qb3NpdGlvbnNldFBvc2l0aW9uRmlsZV9TZXRQb3NpdGlvbkZpbGVfVHJ1bmNhdGVGaWxlX0xlbmd0aEZpbGVfRmx1c2hsb2NrRmlsZV9Mb2NrX1dhdGNoZXJQYXRocGF0aElkX0lub3RpZnlGaWxlU3lzdGVtV2F0Y2hlcl9pZE1hcF9uZXdXYXRjaGVyX2RvbmVXYXRjaGVyX3BhdGhXYXRjaGVkX3dhdGNoZXJQYXRoX3BhdGhXYXRjaGVkRW5kX1dpbjMyRmlsZVN5c3RlbVdhdGNoZXJfRlNFdmVudFN0cmVhbUZpbGVTeXN0ZW1XYXRjaGVyc29ja2V0SWRfRmlsdGVySW1wbEZpbHRlcl9Qcm9jZXNzcHJvY2Vzc2VkRmlsdGVyX1Byb2Nlc3NlZF9aTGliSW5mbGF0ZUZpbHRlcndpbmRvd0JpdHNGaWx0ZXJfQ3JlYXRlWkxpYkluZmxhdGVfWkxpYkRlZmxhdGVGaWx0ZXJnemlwbWVtTGV2ZWxGaWx0ZXJfQ3JlYXRlWkxpYkRlZmxhdGVfSU9TZXJ2aWNlUG9ydHNtYXhQb3J0c19wb3J0c19mcmVlUG9ydHNfdXNlZFBvcnRzX2dldFBvcnRmb3JSZXF1ZXN0SWRfcmV0dXJuUG9ydF9uZXdTZXJ2aWNlUG9ydElPU2VydmljZV9OZXdTZXJ2aWNlUG9ydF9OYW1lc3BhY2VJbXBsX2NhY2hlZE5hbWVzcGFjZU5hbWVzcGFjZV9DcmVhdGVfZ2V0UG9pbnRlck5hbWVzcGFjZV9HZXRQb2ludGVyX2dldERlZmF1bHROYW1lc3BhY2VfR2V0RGVmYXVsdF9zZXR1cE5hbWVzcGFjZV9uYW1lc3BhY2VfbmFtZXNwYWNlUG9pbnRlcl9TaWduYWxDb250cm9sbGVyX2xpc3Rlbl9zaWduYWxOdW1iZXJGYWlsZWQgdG8gbGlzdGVuIGZvciBfc2V0U2lnbmFsSGFuZGxlclByb2Nlc3NfU2V0U2lnbmFsSGFuZGxlcl9jbGVhclNpZ25hbEhhbmRsZXJQcm9jZXNzX0NsZWFyU2lnbmFsSGFuZGxlcl9Qcm9jZXNzU3RhcnRTdGF0dXNfZXJyb3JNZXNzYWdlX1Byb2Nlc3NJbXBsTmF0aXZlV3JhcHBlcl9Qcm9jZXNzSW1wbF9yZXNvdXJjZUluZm9jb25uZWN0ZWRSZXNvdXJjZUhhbmRsZXJfcGF0aF9tb2RlX3N0ZGluX3N0ZG91dF9zdGRlcnJfZXhpdEhhbmRsZXJfZW5kZWRfc3RhcnRlZF9leGl0Q29kZWluY2x1ZGVQYXJlbnRFbnZpcm9ubWVudHJ1bkluU2hlbGxleHQuZGFydC5pby5nZXRQcm9jZXNzZXNleHQuZGFydC5pby5nZXRQcm9jZXNzQnlJZFBhdGggaXMgbm90IGEgU3RyaW5nOiBBcmd1bWVudHMgaXMgbm90IGEgTGlzdDogTm9uLXN0cmluZyBhcmd1bWVudDogX3dpbmRvd3NBcmd1bWVudEVzY2FwZVdvcmtpbmdEaXJlY3RvcnkgaXMgbm90IGEgU3RyaW5nOiBFbnZpcm9ubWVudCBpcyBub3QgYSBtYXA6IEVudmlyb25tZW50IGtleSBvciB2YWx1ZSBpcyBub3QgYSBzdHJpbmc6IChNb2RlIGlzIG5vdCBhIFByb2Nlc3NTdGFydE1vZGU6IF9zdGRpbk5hdGl2ZVNvY2tldF9uYXRpdmVTb2NrZXRfc3Rkb3V0TmF0aXZlU29ja2V0X3N0ZGVyck5hdGl2ZVNvY2tldF9tb2RlSXNBdHRhY2hlZF9tb2RlSGFzU3RkaW9fZ2V0U2hlbGxDb21tYW5kY21kLmV4ZV9nZXRTaGVsbEFyZ3VtZW50c2V4ZWN1dGFibGVzaGVsbEFyZ3VtZW50cy9jY29tbWFuZExpbmUnIiciJ25leHRQb3NxdW90ZVBvc251bUJhY2tzbGFzaF9pbnRGcm9tQnl0ZXNfc3RhcnROYXRpdmVleGl0RGF0YVJlYWRFWElUX0RBVEFfU0laRWV4aXREYXRhQnVmZmVyaW50c2hhbmRsZUV4aXRkZXN0cm95c3RvcHBlZF9ydW5BbmRXYWl0c3Rkb3V0RW5jb2RpbmdzdGRlcnJFbmNvZGluZ193YWl0Z2V0T3V0cHV0UHJvY2Vzc19TdGFydGV4aXRIYW5kbGVyUHJvY2Vzc19XYWl0QXJndW1lbnQgJ3NpZ25hbCcgbXVzdCBiZSBhIFByb2Nlc3NTaWduYWxwaWRfSW50ZXJuZXRBZGRyZXNzX2FkZHJlc3NMb29wYmFja0lQdjRfYWRkcmVzc0xvb3BiYWNrSVB2Nl9hZGRyZXNzQW55SVB2NF9hZGRyZXNzQW55SVB2Nl9JUHY0QWRkckxlbmd0aF9JUHY2QWRkckxlbmd0aGxvb3BiYWNrSVB2NGxvb3BiYWNrSVB2NmFueUlQdjRhbnlJUHY2X2hvc3RfaW5fYWRkcnJhd0FkZHJlc3Npc0xvb3BiYWNraXNMaW5rTG9jYWxpc011bHRpY2FzdEludmFsaWQgaW50ZXJuZXQgYWRkcmVzcyBpbl9hZGRyMC4wLjAuMF9jbG9uZVdpdGhOZXdIb3N0SW50ZXJuZXRBZGRyZXNzKCdfcGFyc2VJbnRlcm5ldEFkZHJlc3NfUGFyc2VfTmV0d29ya0ludGVyZmFjZU5ldHdvcmtJbnRlcmZhY2UoJ19OYXRpdmVTb2NrZXROYXRpdmVXcmFwcGVyX19OYXRpdmVTb2NrZXQmX05hdGl2ZVNvY2tldE5hdGl2ZVdyYXBwZXImX1NlcnZpY2VPYmplY3RfX3NlcnZpY2VJZF9zZXJ2aWNlSWRfc2VydmljZVBhdGhfc2VydmljZVR5cGVQYXRoX3NlcnZpY2VUeXBlTmFtZV9zZXJ2aWNlVHlwZV9OYXRpdmVTb2NrZXRyZWFkRXZlbnR3cml0ZUV2ZW50ZXJyb3JFdmVudGNsb3NlZEV2ZW50ZGVzdHJveWVkRXZlbnRmaXJzdEV2ZW50bGFzdEV2ZW50ZXZlbnRDb3VudGNsb3NlQ29tbWFuZHNodXRkb3duUmVhZENvbW1hbmRzaHV0ZG93bldyaXRlQ29tbWFuZHJldHVyblRva2VuQ29tbWFuZHNldEV2ZW50TWFza0NvbW1hbmRmaXJzdENvbW1hbmRsYXN0Q29tbWFuZGxpc3RlbmluZ1NvY2tldHBpcGVTb2NrZXR0eXBlTm9ybWFsU29ja2V0dHlwZUxpc3RlbmluZ1NvY2tldHR5cGVQaXBldHlwZVR5cGVNYXNrdGNwU29ja2V0dWRwU29ja2V0aW50ZXJuYWxTb2NrZXRpbnRlcm5hbFNpZ25hbFNvY2tldHR5cGVUY3BTb2NrZXR0eXBlVWRwU29ja2V0dHlwZUludGVybmFsU29ja2V0dHlwZUludGVybmFsU2lnbmFsU29ja2V0dHlwZVByb3RvY29sTWFza2hvc3ROYW1lTG9va3VwTWVzc2FnZWxpc3RJbnRlcmZhY2VzTWVzc2FnZXJldmVyc2VMb29rdXBNZXNzYWdlcHJvdG9jb2xJUHY0cHJvdG9jb2xJUHY2bm9ybWFsVG9rZW5CYXRjaFNpemVsaXN0ZW5pbmdUb2tlbkJhdGNoU2l6ZV9yZXRyeUR1cmF0aW9uX3JldHJ5RHVyYXRpb25Mb29wYmFja2lzQ2xvc2luZ2lzQ2xvc2VkUmVhZGNsb3NlZFJlYWRFdmVudFNlbnRpc0Nsb3NlZFdyaXRlY2xvc2VDb21wbGV0ZXJldmVudEhhbmRsZXJzZmxhZ3NTZW50dHlwZUZsYWdzbG9jYWxQb3J0bG9jYWxBZGRyZXNzYXZhaWxhYmxlc2VuZFJlYWRFdmVudHNyZWFkRXZlbnRJc3N1ZWRzZW5kV3JpdGVFdmVudHN3cml0ZUV2ZW50SXNzdWVkd3JpdGVBdmFpbGFibGVyZXNvdXJjZUluZm9kYXRhZ3JhbW5vcm1hbF93YXRjaENvbW1vbm5hdGl2ZVNldFNvY2tldElkd2F0Y2hTaWduYWxGYWlsZWQgaG9zdCBsb29rdXA6ICdyZXZlcnNlTG9va3VwYWRkckZhaWxlZCByZXZlcnNlIGhvc3QgbG9va3VwbGlzdEludGVyZmFjZXNpbmNsdWRlTG9vcGJhY2tpbmNsdWRlTGlua0xvY2FsRmFpbGVkIGxpc3RpbmcgaW50ZXJmYWNlc3N0YXJ0Q29ubmVjdHNvdXJjZUFkZHJlc3Njb25uZWN0aW5nY29ubmVjdE5leHRuYXRpdmVDcmVhdGVDb25uZWN0bmF0aXZlQ3JlYXRlQmluZENvbm5lY3Rpc0JpbmRFcnJvckJpbmQgZmFpbGVkQ29ubmVjdGlvbiBmYWlsZWRzZXRIYW5kbGVyc3NldExpc3RlbmluZ0Nvbm5lY3Rpb24gYXR0ZW1wdCBjYW5jZWxsZWQsIGhvc3Q6ICwgcG9ydDogY29ubmVjdHNvY2tldEZ1dHVyZUNvbm5lY3Rpb24gdGltZWQgb3V0LCBob3N0OiBfcmVzb2x2ZUhvc3RiYWNrbG9ndjZPbmx5c2hhcmVkbmF0aXZlQ3JlYXRlQmluZExpc3RlbkZhaWxlZCB0byBjcmVhdGUgc2VydmVyIHNvY2tldGNvbm5lY3RUb0V2ZW50SGFuZGxlcnNldHVwUmVzb3VyY2VJbmZvYmluZERhdGFncmFtcmV1c2VBZGRyZXNzcmV1c2VQb3J0dHRsbmF0aXZlQ3JlYXRlQmluZERhdGFncmFtRmFpbGVkIHRvIGNyZWF0ZSBkYXRhZ3JhbSBzb2NrZXRpc0xpc3RlbmluZ2lzUGlwZWlzSW50ZXJuYWxpc0ludGVybmFsU2lnbmFsaXNUY3Bpc1VkcElsbGVnYWwgbGVuZ3RoIG5hdGl2ZVJlYWRSZWFkIGZhaWxlZHRvdGFsUmVhZGRpZFJlYWRyZWNlaXZlbmF0aXZlUmVjdkZyb21SZWNlaXZlIGZhaWxlZG5hdGl2ZUF2YWlsYWJsZUludmFsaWQgYXJndW1lbnRzIHRvIHdyaXRlIG9uIFNvY2tldGJ1ZmZlckFuZFN0YXJ0bmF0aXZlV3JpdGVXcml0ZSBmYWlsZWRhZGRXcml0ZW5hdGl2ZVNlbmRUb1NlbmQgZmFpbGVkcmV0dXJuVG9rZW5zbmF0aXZlQWNjZXB0YWRkUmVhZG5hdGl2ZUdldFBvcnRuYXRpdmVHZXRSZW1vdGVQZWVyaXNzdWVSZWFkRXZlbnRpc3N1ZVdyaXRlRXZlbnRtdWx0aXBsZXhldmVudHNPYmpkaXNjb25uZWN0RnJvbUV2ZW50SGFuZGxlcm5hdGl2ZUdldEVycm9ydG9rZW5CYXRjaFNpemVzZW5kVG9FdmVudEhhbmRsZXJkZXN0cm95ZWRkaXJlY3Rpb25zaHV0ZG93blJlYWRzaHV0ZG93bldyaXRlZnVsbERhdGFleHQuZGFydC5pby5nZXRPcGVuU29ja2V0c2V4dC5kYXJ0LmlvLmdldFNvY2tldEJ5SURpc0Vycm9yUmVzcG9uc2VjcmVhdGVFcnJvclVua25vd24gZXJyb3JnZXRPcHRpb25uYXRpdmVHZXRPcHRpb25zZXRPcHRpb25uYXRpdmVTZXRPcHRpb25nZXRSYXdPcHRpb25vcHRpb24udmFsdWVuYXRpdmVHZXRSYXdPcHRpb25zZXRSYXdPcHRpb25uYXRpdmVTZXRSYXdPcHRpb25tdWx0aWNhc3RBZGRyZXNzVGhlIG5ldHdvcmsgaW50ZXJmYWNlIGRvZXMgbm90IGhhdmUgYW4gYWRkcmVzcyBvZiB0aGUgc2FtZSBmYW1pbHkgYXMgdGhlIG11bHRpY2FzdCBhZGRyZXNzam9pbk11bHRpY2FzdGludGVyZmFjZUFkZHJpbnRlcmZhY2VJbmRleG5hdGl2ZUpvaW5NdWx0aWNhc3RsZWF2ZU11bHRpY2FzdG5hdGl2ZUxlYXZlTXVsdGljYXN0U29ja2V0X1NldFNvY2tldElkU29ja2V0X0F2YWlsYWJsZVNvY2tldF9SZWFkU29ja2V0X1JlY3ZGcm9tU29ja2V0X1dyaXRlTGlzdFNvY2tldF9TZW5kVG9Tb2NrZXRfQ3JlYXRlQ29ubmVjdFNvY2tldF9DcmVhdGVCaW5kQ29ubmVjdHNvdXJjZUFkZHJTb2NrZXRCYXNlX0lzQmluZEVycm9yZXJyb3JOdW1iZXJTZXJ2ZXJTb2NrZXRfQ3JlYXRlQmluZExpc3RlblNvY2tldF9DcmVhdGVCaW5kRGF0YWdyYW1TZXJ2ZXJTb2NrZXRfQWNjZXB0U29ja2V0X0dldFBvcnRTb2NrZXRfR2V0UmVtb3RlUGVlcm5hdGl2ZUdldFNvY2tldElkU29ja2V0X0dldFNvY2tldElkU29ja2V0X0dldEVycm9yU29ja2V0X0dldE9wdGlvbnByb3RvY29sU29ja2V0X0dldFJhd09wdGlvblNvY2tldF9TZXRPcHRpb25Tb2NrZXRfU2V0UmF3T3B0aW9uU29ja2V0X0pvaW5NdWx0aWNhc3RTb2NrZXRfTGVhdmVNdWx0aWNhc3RfUmF3U2VydmVyU29ja2V0X3NvY2tldF9yZWZlcmVuY2VQb3J0X3Y2T25seUludmFsaWQgYmFja2xvZyBTdHJlYW0gd2FzIGFscmVhZHkgbGlzdGVuZWQgdG9fb25TdWJzY3JpcHRpb25TdGF0ZUNoYW5nZV9vblBhdXNlU3RhdGVDaGFuZ2VfcmVzdW1lX1Jhd1NvY2tldF9yZWFkRXZlbnRzRW5hYmxlZF93cml0ZUV2ZW50c0VuYWJsZWRfaXNNYWNPU1Rlcm1pbmFsSW5wdXR3cml0ZUV2ZW50c0VuYWJsZWRuYXRpdmVUYXNrbmF0aXZlU29ja2V0X3dyaXRlUGlwZV9yZWFkUGlwZWZkc29ja2V0VHlwZXJlYWRFdmVudHNFbmFibGVkZW5hYmxlZF9TZXJ2ZXJTb2NrZXRyYXdTb2NrZXRfU29ja2V0U3RyZWFtQ29uc3VtZXJzdHJlYW1Db21wbGV0ZXJfZW5zdXJlUmF3U29ja2V0U3Vic2NyaXB0aW9uX2NvbnN1bWVyRG9uZV93cml0ZV9lbmFibGVXcml0ZUV2ZW50X2Rpc2FibGVXcml0ZUV2ZW50X1NvY2tldF9jb250cm9sbGVyQ2xvc2VkX2NvbnN1bWVyX2RldGFjaFJlYWR5c2VwQ2Fubm90IHNlbmQgZXJyb3JzIG9uIHNvY2tldHNfY2xvc2VSYXdTb2NrZXRfZGV0YWNoUmF3X1Jhd0RhdGFncmFtU29ja2V0bXVsdGljYXN0TG9vcGJhY2ttdWx0aWNhc3RIb3BzbXVsdGljYXN0SW50ZXJmYWNlYnJvYWRjYXN0RW5hYmxlZF9TZWN1cmVTb2NrZXRyZW5lZ290aWF0ZXVzZVNlc3Npb25DYWNoZXJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZXJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZXBlZXJDZXJ0aWZpY2F0ZXBlZXJDZXJ0aWZpY2F0ZSBjYWxsZWQgb24gZGVzdHJveWVkIFNlY3VyZVNvY2tldHNlbGVjdGVkUHJvdG9jb2xzZWxlY3RlZFByb3RvY29sIGNhbGxlZCBvbiBkZXN0cm95ZWQgU2VjdXJlU29ja2V0X1NlY3VyZUZpbHRlckltcGxFTkNSWVBURURfU0laRWJ1ZmZlcnNTZWN1cmVTb2NrZXRfQ29ubmVjdGhvc3ROYW1laXNfc2VydmVycHJvdG9jb2xzX2Rlc3Ryb3lTZWN1cmVTb2NrZXRfRGVzdHJveWhhbmRzaGFrZVNlY3VyZVNvY2tldF9IYW5kc2hha2VyZWhhbmRzaGFrZXByb2Nlc3NCdWZmZXJTZWN1cmVTb2NrZXRfR2V0U2VsZWN0ZWRQcm90b2NvbFNlY3VyZVNvY2tldF9SZW5lZ290aWF0ZVNlY3VyZVNvY2tldF9Jbml0U2VjdXJlU29ja2V0X1BlZXJDZXJ0aWZpY2F0ZXJlZ2lzdGVyQmFkQ2VydGlmaWNhdGVDYWxsYmFja1NlY3VyZVNvY2tldF9SZWdpc3RlckJhZENlcnRpZmljYXRlQ2FsbGJhY2tyZWdpc3RlckhhbmRzaGFrZUNvbXBsZXRlQ2FsbGJhY2tTZWN1cmVTb2NrZXRfUmVnaXN0ZXJIYW5kc2hha2VDb21wbGV0ZUNhbGxiYWNraGFuZHNoYWtlQ29tcGxldGVIYW5kbGVyX3BvaW50ZXJTZWN1cmVTb2NrZXRfRmlsdGVyUG9pbnRlcl9TZWN1cml0eUNvbnRleHRkZWZhdWx0Q29udGV4dHdpdGhUcnVzdGVkUm9vdHNfY3JlYXRlTmF0aXZlQ29udGV4dF90cnVzdEJ1aWx0aW5Sb290c1NlY3VyaXR5Q29udGV4dF9BbGxvY2F0ZXVzZVByaXZhdGVLZXlwYXNzd29yZHVzZVByaXZhdGVLZXlCeXRlc1NlY3VyaXR5Q29udGV4dF9Vc2VQcml2YXRlS2V5Qnl0ZXNrZXlCeXRlc3NldFRydXN0ZWRDZXJ0aWZpY2F0ZXNzZXRUcnVzdGVkQ2VydGlmaWNhdGVzQnl0ZXNTZWN1cml0eUNvbnRleHRfU2V0VHJ1c3RlZENlcnRpZmljYXRlc0J5dGVzY2VydEJ5dGVzdXNlQ2VydGlmaWNhdGVDaGFpbnVzZUNlcnRpZmljYXRlQ2hhaW5CeXRlc1NlY3VyaXR5Q29udGV4dF9Vc2VDZXJ0aWZpY2F0ZUNoYWluQnl0ZXNjaGFpbkJ5dGVzc2V0Q2xpZW50QXV0aG9yaXRpZXNzZXRDbGllbnRBdXRob3JpdGllc0J5dGVzU2VjdXJpdHlDb250ZXh0X1NldENsaWVudEF1dGhvcml0aWVzQnl0ZXNhdXRoQ2VydEJ5dGVzc2V0QWxwblByb3RvY29sc2lzU2VydmVyZW5jb2RlZFByb3RvY29sc19zZXRBbHBuUHJvdG9jb2xzU2VjdXJpdHlDb250ZXh0X1NldEFscG5Qcm90b2NvbHNTZWN1cml0eUNvbnRleHRfVHJ1c3RCdWlsdGluUm9vdHNfWDUwOUNlcnRpZmljYXRlSW1wbF9jYWNoZWREZXJfY2FjaGVkUGVtX2NhY2hlZFNoYTFfZGVyWDUwOV9EZXJkZXJfcGVtWDUwOV9QZW1wZW1fc2hhMVg1MDlfU2hhMXN1YmplY3RYNTA5X1N1YmplY3Rpc3N1ZXJYNTA5X0lzc3VlcnN0YXJ0VmFsaWRpdHlfc3RhcnRWYWxpZGl0eWlzVXRjZW5kVmFsaWRpdHlfZW5kVmFsaWRpdHlYNTA5X1N0YXJ0VmFsaWRpdHlYNTA5X0VuZFZhbGlkaXR5X1Jhd1N5bmNocm9ub3VzU29ja2V0Y29ubmVjdFN5bmNyZWFkU3luY19OYXRpdmVTeW5jaHJvbm91c1NvY2tldE5hdGl2ZVdyYXBwZXJfTmF0aXZlU3luY2hyb25vdXNTb2NrZXRQYXJhbWV0ZXIgaG9zdCBjYW5ub3QgYmUgbnVsbG5hdGl2ZUNyZWF0ZUNvbm5lY3RTeW5jbmF0aXZlQ2xvc2VTeW5jX2NoZWNrQXZhaWxhYmxlU29ja2V0IGlzIGNsb3NlZCBmb3IgcmVhZGluZ0ludmFsaWQgYXJndW1lbnRzIHRvIHJlYWRJbnRvU3luY3N0YXJ0IGNhbm5vdCBiZSBudWxsbmF0aXZlUmVhZEludG9yZWFkSW50b1N5bmMgZmFpbGVkbmF0aXZlU2h1dGRvd25SZWFkbmF0aXZlU2h1dGRvd25Xcml0ZVNvY2tldCBpcyBjbG9zZWQgZm9yIHdyaXRpbmdJbnZhbGlkIGFyZ3VtZW50cyB0byB3cml0ZUZyb21TeW5jc3RhcnQgY2Fubm90IGJlIGVxdWFsIHRvIG51bGx3cml0ZUZyb21TeW5jIGZhaWxlZF9uYXRpdmVMb29rdXBSZXF1ZXN0U3luY2hyb25vdXNTb2NrZXRfTG9va3VwUmVxdWVzdFN5bmNocm9ub3VzU29ja2V0X0NyZWF0ZUNvbm5lY3RTeW5jU3luY2hyb25vdXNTb2NrZXRfQXZhaWxhYmxlU3luY2hyb25vdXNTb2NrZXRfQ2xvc2VTeW5jU3luY2hyb25vdXNTb2NrZXRfR2V0UG9ydFN5bmNocm9ub3VzU29ja2V0X0dldFJlbW90ZVBlZXJTeW5jaHJvbm91c1NvY2tldF9SZWFkU3luY2hyb25vdXNTb2NrZXRfUmVhZExpc3RTeW5jaHJvbm91c1NvY2tldF9TaHV0ZG93blJlYWRTeW5jaHJvbm91c1NvY2tldF9TaHV0ZG93bldyaXRlU3luY2hyb25vdXNTb2NrZXRfV3JpdGVMaXN0dG9CeXRlc19Db3B5aW5nQnl0ZXNCdWlsZGVyX2luaXRTaXplX2VtcHR5TGlzdF9wb3cycm91bmR1cF9CeXRlc0J1aWxkZXJfY2h1bmtzdHlwZWRCeXRlc0lPRXhjZXB0aW9uT1NFcnJvcm5vRXJyb3JDb2RlT1MgRXJyb3IsIGVycm5vID0gOiBlcnJubyA9IF9CdWZmZXJBbmRTdGFydF9JT0NyeXB0b2dldFJhbmRvbUJ5dGVzQ3J5cHRvX0dldFJhbmRvbUJ5dGVzWkxpYk9wdGlvbm1pbldpbmRvd0JpdHNNSU5fV0lORE9XX0JJVFNVc2UgbWluV2luZG93Qml0cyBpbnN0ZWFkbWF4V2luZG93Qml0c01BWF9XSU5ET1dfQklUU1VzZSBtYXhXaW5kb3dCaXRzIGluc3RlYWRkZWZhdWx0V2luZG93Qml0c0RFRkFVTFRfV0lORE9XX0JJVFNVc2UgZGVmYXVsdFdpbmRvd0JpdHMgaW5zdGVhZG1pbkxldmVsTUlOX0xFVkVMVXNlIG1pbkxldmVsIGluc3RlYWRtYXhMZXZlbE1BWF9MRVZFTFVzZSBtYXhMZXZlbCBpbnN0ZWFkZGVmYXVsdExldmVsREVGQVVMVF9MRVZFTFVzZSBkZWZhdWx0TGV2ZWwgaW5zdGVhZG1pbk1lbUxldmVsTUlOX01FTV9MRVZFTFVzZSBtaW5NZW1MZXZlbCBpbnN0ZWFkbWF4TWVtTGV2ZWxNQVhfTUVNX0xFVkVMVXNlIG1heE1lbUxldmVsIGluc3RlYWRkZWZhdWx0TWVtTGV2ZWxERUZBVUxUX01FTV9MRVZFTFVzZSBkZWZhdWx0TWVtTGV2ZWwgaW5zdGVhZHN0cmF0ZWd5RmlsdGVyZWRTVFJBVEVHWV9GSUxURVJFRFVzZSBzdHJhdGVneUZpbHRlcmVkIGluc3RlYWRzdHJhdGVneUh1ZmZtYW5Pbmx5U1RSQVRFR1lfSFVGRk1BTl9PTkxZVXNlIHN0cmF0ZWd5SHVmZm1hbk9ubHkgaW5zdGVhZHN0cmF0ZWd5UmxlU1RSQVRFR1lfUkxFVXNlIHN0cmF0ZWd5UmxlIGluc3RlYWRzdHJhdGVneUZpeGVkU1RSQVRFR1lfRklYRURVc2Ugc3RyYXRlZ3lGaXhlZCBpbnN0ZWFkc3RyYXRlZ3lEZWZhdWx0U1RSQVRFR1lfREVGQVVMVFVzZSBzdHJhdGVneURlZmF1bHQgaW5zdGVhZFpMaWJDb2RlY19kZWZhdWx0WkxpYkVuY29kZXJaTGliRGVjb2RlclJhd1pMaWJGaWx0ZXJkZWZsYXRlRmlsdGVyaW5mbGF0ZUZpbHRlcl9tYWtlWkxpYkRlZmxhdGVGaWx0ZXJfbWFrZVpMaWJJbmZsYXRlRmlsdGVyX0J1ZmZlclNpbmtfWkxpYkVuY29kZXJTaW5rX1pMaWJEZWNvZGVyU2lua19GaWx0ZXJTaW5rb3ZlcnJpZGVzZnJvbVJhd1BhdGhnZXRDdXJyZW50RGlyZWN0b3J5c2V0Q3VycmVudERpcmVjdG9yeXN5c3RlbVRlbXBnZXRTeXN0ZW1UZW1wRGlyZWN0b3J5cmVzb2x2ZVN5bWJvbGljTGlua3NyZXNvbHZlU3ltYm9saWNMaW5rc1N5bmNyZW5hbWVuZXdQYXRocmVuYW1lU3luY2Fic29sdXRlZm9sbG93TGlua3NsaXN0U3luY19EaXJlY3RvcnlfcmF3UGF0aHJhd1BhdGhyYXdQYXRoIGNhbm5vdCBiZSBudWxsRGlyZWN0b3J5X0N1cnJlbnRfc2V0Q3VycmVudERpcmVjdG9yeV9TZXRDdXJyZW50X2NyZWF0ZVRlbXBEaXJlY3RvcnlfQ3JlYXRlVGVtcF9zeXN0ZW1UZW1wRGlyZWN0b3J5X1N5c3RlbVRlbXBfZXhpc3RzRGlyZWN0b3J5X0V4aXN0c0RpcmVjdG9yeV9DcmVhdGVfZGVsZXRlTmF0aXZlRGlyZWN0b3J5X0RlbGV0ZV9yZW5hbWVEaXJlY3RvcnlfUmVuYW1lX2ZpbGxXaXRoRGlyZWN0b3J5TGlzdGluZ0RpcmVjdG9yeV9GaWxsV2l0aERpcmVjdG9yeUxpc3RpbmdHZXR0aW5nIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZmFpbGVkIGlzIG5vdCBhIFN0cmluZyBvciBEaXJlY3RvcnlUaGlzIGVtYmVkZGVyIGRpc2FsbG93cyBzZXR0aW5nIERpcmVjdG9yeS5jdXJyZW50U2V0dGluZyBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZhaWxlZF9pc0Vycm9yUmVzcG9uc2VfZXhjZXB0aW9uT3JFcnJvckZyb21SZXNwb25zZUV4aXN0cyBmYWlsZWRfYWJzb2x1dGVQYXRoQ3JlYXRpb24gZmFpbGVkRGlyZWN0b3J5LmNyZWF0ZVRlbXAgY2FsbGVkIHdpdGggYW4gZW1wdHkgcGF0aC4gVG8gdXNlIHRoZSBzeXN0ZW0gdGVtcCBkaXJlY3RvcnksIHVzZSBEaXJlY3Rvcnkuc3lzdGVtVGVtcGZ1bGxQcmVmaXhDcmVhdGlvbiBvZiB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZhaWxlZF9kZWxldGVEZWxldGlvbiBmYWlsZWRfZGVsZXRlU3luY1JlbmFtZSBmYWlsZWREaXJlY3Rvcnk6ICdlcnJfQXN5bmNEaXJlY3RvcnlMaXN0ZXJPcHNfQXN5bmNEaXJlY3RvcnlMaXN0ZXJsaXN0RmlsZWxpc3REaXJlY3RvcnlsaXN0TGlua2xpc3RFcnJvcmxpc3REb25lcmVzcG9uc2VUeXBlcmVzcG9uc2VQYXRocmVzcG9uc2VDb21wbGV0ZXJlc3BvbnNlRXJyb3JjYW5jZWxlZG5leHRSdW5uaW5nX29wc19jbGVhbnVwZXJyb3JUeXBlcmVzcG9uc2VFcnJvckluZm9lcnJvclBhdGhEaXJlY3RvcnkgbGlzdGluZyBmYWlsZWRfRW1iZWRkZXJDb25maWdfbWF5Q2hkaXJfbWF5RXhpdF9tYXlTZXRFY2hvTW9kZV9tYXlTZXRMaW5lTW9kZV9tYXlTbGVlcF9FdmVudEhhbmRsZXJfdGltZXJNaWxsaXNlY29uZENsb2NrRXZlbnRIYW5kbGVyX1RpbWVyTWlsbGlzZWNvbmRDbG9ja0V2ZW50SGFuZGxlcl9TZW5kRGF0YXNlbmRlclJFQURVc2UgcmVhZCBpbnN0ZWFkV1JJVEVVc2Ugd3JpdGUgaW5zdGVhZEFQUEVORFVzZSBhcHBlbmQgaW5zdGVhZHdyaXRlT25seVdSSVRFX09OTFlVc2Ugd3JpdGVPbmx5IGluc3RlYWR3cml0ZU9ubHlBcHBlbmRXUklURV9PTkxZX0FQUEVORFVzZSB3cml0ZU9ubHlBcHBlbmQgaW5zdGVhZEZpbGVMb2NrU0hBUkVEVXNlIHNoYXJlZCBpbnN0ZWFkZXhjbHVzaXZlRVhDTFVTSVZFVXNlIGV4Y2x1c2l2ZSBpbnN0ZWFkYmxvY2tpbmdTaGFyZWRCTE9DS0lOR19TSEFSRURVc2UgYmxvY2tpbmdTaGFyZWQgaW5zdGVhZGJsb2NraW5nRXhjbHVzaXZlQkxPQ0tJTkdfRVhDTFVTSVZFVXNlIGJsb2NraW5nRXhjbHVzaXZlIGluc3RlYWRjcmVhdGVGaWxlY29weVN5bmNsYXN0QWNjZXNzZWRsYXN0QWNjZXNzZWRTeW5jc2V0TGFzdEFjY2Vzc2Vkc2V0TGFzdEFjY2Vzc2VkU3luY2xhc3RNb2RpZmllZGxhc3RNb2RpZmllZFN5bmNzZXRMYXN0TW9kaWZpZWRzZXRMYXN0TW9kaWZpZWRTeW5jb3BlblJlYWRyZWFkQXNMaW5lc3JlYWRBc0xpbmVzU3luY3dyaXRlQXNTdHJpbmdSYW5kb21BY2Nlc3NGaWxlcmVhZEJ5dGVTeW5jd3JpdGVCeXRlU3luY3Bvc2l0aW9uU3luY3NldFBvc2l0aW9uU3luY3RydW5jYXRlU3luY2ZsdXNoU3luY2xvY2tTeW5jdW5sb2NrdW5sb2NrU3luYywgcGF0aCA9ICdfRmlsZVN0cmVhbV9vcGVuZWRGaWxlX2Nsb3NlQ29tcGxldGVyX3Vuc3Vic2NyaWJlZF9yZWFkSW5Qcm9ncmVzc19hdEVuZGZvclN0ZGluX3NldHVwQ29udHJvbGxlcl9yZWFkQmxvY2tfY2xvc2VGaWxlQmFkIGVuZCBwb3NpdGlvbjogQmFkIHN0YXJ0IHBvc2l0aW9uOiBvblJlYWR5b25PcGVuRmlsZW9wZW5GYWlsZWRfRmlsZVN0cmVhbUNvbnN1bWVyX2ZpbGVfb3BlbkZ1dHVyZWZyb21TdGRpb29wZW5lZEZpbGVfRmlsZV9kaXNwYXRjaFdpdGhOYW1lc3BhY2VDYW5ub3QgY2hlY2sgZXhpc3RlbmNlRmlsZV9FeGlzdHNDYW5ub3QgY2hlY2sgZXhpc3RlbmNlIG9mIGZpbGVDYW5ub3QgY3JlYXRlIGZpbGVGaWxlX0NyZWF0ZV9jcmVhdGVMaW5rRmlsZV9DcmVhdGVMaW5rX2xpbmtUYXJnZXRGaWxlX0xpbmtUYXJnZXRDYW5ub3QgZGVsZXRlIGZpbGVGaWxlX0RlbGV0ZV9kZWxldGVMaW5rTmF0aXZlRmlsZV9EZWxldGVMaW5rQ2Fubm90IHJlbmFtZSBmaWxlIHRvICdGaWxlX1JlbmFtZW9sZFBhdGhfcmVuYW1lTGlua0ZpbGVfUmVuYW1lTGlua0Nhbm5vdCBjb3B5IGZpbGUgdG8gJ19jb3B5RmlsZV9Db3B5SW52YWxpZCBmaWxlIG1vZGUgZm9yIHRoaXMgb3BlcmF0aW9uQ2Fubm90IG9wZW4gZmlsZUNhbm5vdCByZXRyaWV2ZSBsZW5ndGggb2YgZmlsZV9sZW5ndGhGcm9tUGF0aEZpbGVfTGVuZ3RoRnJvbVBhdGhDYW5ub3QgcmV0cmlldmUgYWNjZXNzIHRpbWVfbGFzdEFjY2Vzc2VkRmlsZV9MYXN0QWNjZXNzZWRtaWxsaXNDYW5ub3Qgc2V0IGFjY2VzcyB0aW1lX3NldExhc3RBY2Nlc3NlZEZpbGVfU2V0TGFzdEFjY2Vzc2VkRmFpbGVkIHRvIHNldCBmaWxlIGFjY2VzcyB0aW1lQ2Fubm90IHJldHJpZXZlIG1vZGlmaWNhdGlvbiB0aW1lX2xhc3RNb2RpZmllZEZpbGVfTGFzdE1vZGlmaWVkQ2Fubm90IHNldCBtb2RpZmljYXRpb24gdGltZV9zZXRMYXN0TW9kaWZpZWRGaWxlX1NldExhc3RNb2RpZmllZEZhaWxlZCB0byBzZXQgZmlsZSBtb2RpZmljYXRpb24gdGltZUZpbGVfT3Blbl9vcGVuU3RkaW9GaWxlX09wZW5TdGRpb19vcGVuU3RkaW9TeW5jQ2Fubm90IG9wZW4gc3RkaW8gZmlsZSBmb3I6IGNvbnN1bWVycmVhZERhdGFDaHVua2VkX3RyeURlY29kZUZhaWxlZCB0byBkZWNvZGUgZGF0YSB1c2luZyBlbmNvZGluZyAnRmlsZTogJ3Rocm93SWZFcnJvcl9SYW5kb21BY2Nlc3NGaWxlT3BzX1JhbmRvbUFjY2Vzc0ZpbGVfY29ubmVjdGVkUmVzb3VyY2VIYW5kbGVyX2FzeW5jRGlzcGF0Y2hlZF9maWxlU2VydmljZWxvY2tVbmxvY2tfbWF5YmVDb25uZWN0SGFuZGxlcl9tYXliZVBlcmZvcm1DbGVhbnVwZXh0LmRhcnQuaW8uZ2V0T3BlbkZpbGVzZXh0LmRhcnQuaW8uZ2V0RmlsZUJ5SURfZGlzcGF0Y2htYXJrQ2xvc2VkQ2Fubm90IGNsb3NlIGZpbGVyZWFkQnl0ZSBmYWlsZWRyZWFkIGZhaWxlZHJlYWRTeW5jIGZhaWxlZHJlYWRJbnRvIGZhaWxlZHdyaXRlQnl0ZSBmYWlsZWRJbnZhbGlkIGFyZ3VtZW50cyB0byB3cml0ZUZyb213cml0ZUZyb20gZmFpbGVkcG9zaXRpb24gZmFpbGVkc2V0UG9zaXRpb24gZmFpbGVkdHJ1bmNhdGUgZmFpbGVkbGVuZ3RoIGZhaWxlZGZsdXNoIGZhaWxlZF9maWxlTG9ja1ZhbHVlZmxsb2NrIGZhaWxlZHVubG9jayBmYWlsZWRGaWxlIGNsb3NlZEFuIGFzeW5jIG9wZXJhdGlvbiBpcyBjdXJyZW50bHkgcGVuZGluZ0ZpbGVTeXN0ZW1FbnRpdHlUeXBlRklMRVVzZSBmaWxlIGluc3RlYWRkaXJlY3RvcnlESVJFQ1RPUllVc2UgZGlyZWN0b3J5IGluc3RlYWRMSU5LVXNlIGxpbmsgaW5zdGVhZF90eXBlTGlzdF9sb29rdXBGaWxlU3RhdF9jaGFuZ2VkVGltZV9tb2RpZmllZFRpbWVfYWNjZXNzZWRUaW1lX25vdEZvdW5kYWNjZXNzZWRfaW50ZXJuYWxOb3RGb3VuZF9zdGF0U3luY0ZpbGVfU3RhdHN0YXRTeW5jX3N0YXRTeW5jSW50ZXJuYWxfc3RhdEZpbGVTdGF0OiB0eXBlIAogICAgICAgICAgY2hhbmdlZCAKICAgICAgICAgIG1vZGlmaWVkIAogICAgICAgICAgYWNjZXNzZWQgCiAgICAgICAgICBtb2RlIG1vZGVTdHJpbmcKICAgICAgICAgIHNpemUgcGVybWlzc2lvbnMtLS0tLXgtdy0td3hyLS1yLXhydy1yd3goc3VpZCkgKGd1aWQpIChzdGlja3kpIF9hYnNvbHV0ZVdpbmRvd3NQYXRoUGF0dGVybl4oXFxcXHxbYS16QS1aXTpbL1xcXSlfcGFyZW50UmVnRXhwW14vXFxdWy9cXF0rW14vXFxdW14vXS8rW14vXUNhbm5vdCByZXNvbHZlIHN5bWJvbGljIGxpbmtzdHJpbW1lZFBhdGhmc1dhdGNoX2lkZW50aWNhbHBhdGgxcGF0aDJFcnJvciBpbiBGaWxlU3lzdGVtRW50aXR5LmlkZW50aWNhbChmc2VJZGVudGljYWxfcmF3QWJzb2x1dGVQYXRoX2lkZW50aWNhbFN5bmNFcnJvciBpbiBGaWxlU3lzdGVtRW50aXR5LmlkZW50aWNhbFN5bmNpZGVudGljYWxTeW5jZnNlSWRlbnRpY2FsU3luY2lzV2F0Y2hTdXBwb3J0ZWRmc1dhdGNoSXNTdXBwb3J0ZWRfdG9VdGY4QXJyYXlfdG9OdWxsVGVybWluYXRlZFV0ZjhBcnJheV90b1N0cmluZ0Zyb21VdGY4QXJyYXlub25OdWxsVGVybWluYXRlZHR5cGVTeW5jaXNMaW5rX2lzTGlua1Jhd2lzRmlsZWlzTGlua1N5bmNfaXNMaW5rUmF3U3luY2lzRmlsZVN5bmNpc0RpcmVjdG9yeVN5bmNfZ2V0VHlwZU5hdGl2ZUZpbGVfR2V0VHlwZV9pZGVudGljYWxOYXRpdmVGaWxlX0FyZUlkZW50aWNhbF9yZXNvbHZlU3ltYm9saWNMaW5rc0ZpbGVfUmVzb2x2ZVN5bWJvbGljTGlua3NwYXJlbnRPZnJvb3RFbmRbL1xcXV9nZXRUeXBlU3luY0hlbHBlckVycm9yIGdldHRpbmcgdHlwZSBvZiBGaWxlU3lzdGVtRW50aXR5X2dldFR5cGVTeW5jZnNlR2V0VHlwZVN5bmNfZ2V0VHlwZVJlcXVlc3RFcnJvciBnZXR0aW5nIHR5cGVfZ2V0VHlwZWZzZUdldFR5cGVfdGhyb3dJZkVycm9yX3RyaW1UcmFpbGluZ1BhdGhTZXBhcmF0b3JzX2Vuc3VyZVRyYWlsaW5nUGF0aFNlcGFyYXRvcnNGaWxlU3lzdGVtRXZlbnRDUkVBVEVVc2UgY3JlYXRlIGluc3RlYWRtb2RpZnlNT0RJRllVc2UgbW9kaWZ5IGluc3RlYWRERUxFVEVVc2UgZGVsZXRlIGluc3RlYWRtb3ZlTU9WRVVzZSBtb3ZlIGluc3RlYWRVc2UgYWxsIGluc3RlYWRfbW9kaWZ5QXR0cmlidXRlc19kZWxldGVTZWxmX2lzRGlyRmlsZVN5c3RlbUNyZWF0ZUV2ZW50RmlsZVN5c3RlbUNyZWF0ZUV2ZW50KCdGaWxlU3lzdGVtTW9kaWZ5RXZlbnRjb250ZW50Q2hhbmdlZEZpbGVTeXN0ZW1Nb2RpZnlFdmVudCgnJywgY29udGVudENoYW5nZWQ9RmlsZVN5c3RlbURlbGV0ZUV2ZW50RmlsZVN5c3RlbURlbGV0ZUV2ZW50KCdGaWxlU3lzdGVtTW92ZUV2ZW50RmlsZVN5c3RlbU1vdmVFdmVudCgnLCAnX0ZpbGVTeXN0ZW1XYXRjaGVyX3JlY3Vyc2l2ZV9icm9hZGNhc3RDb250cm9sbGVyRmlsZSBzeXN0ZW0gd2F0Y2hpbmcgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtRmFpbGVkIHRvIGluaXRpYWxpemUgZmlsZSBzeXN0ZW0gZW50aXR5IHdhdGNoZXJGYWlsZWQgdG8gd2F0Y2ggcGF0aF9kb25lUGF0aFdhdGNoZWRfcGF0aEZyb21QYXRoSWRfbGlzdGVuT25Tb2NrZXRzdG9wc2dldFBhdGhnZXRJc0RpcnJld3JpdGVNb3ZlaXNEaXJfaW5pdFdhdGNoZXJGaWxlU3lzdGVtV2F0Y2hlcl9Jbml0V2F0Y2hlcl9jbG9zZVdhdGNoZXJGaWxlU3lzdGVtV2F0Y2hlcl9DbG9zZVdhdGNoZXJfd2F0Y2hQYXRoRmlsZVN5c3RlbVdhdGNoZXJfV2F0Y2hQYXRoX3Vud2F0Y2hQYXRoRmlsZVN5c3RlbVdhdGNoZXJfVW53YXRjaFBhdGhwYXRoX2lkX3JlYWRFdmVudHNGaWxlU3lzdGVtV2F0Y2hlcl9SZWFkRXZlbnRzX2dldFNvY2tldElkRmlsZVN5c3RlbVdhdGNoZXJfR2V0U29ja2V0SWRGaWxlU3lzdGVtV2F0Y2hlcl9Jc1N1cHBvcnRlZF9JT1Jlc291cmNlSW5mb19zd19zdGFydFRpbWVlbGFwc2VkTWljcm9zZWNvbmRzZnVsbFZhbHVlTWFwcmVmZXJlbmNlVmFsdWVNYXBnZXROZXh0SURfUmVhZFdyaXRlUmVzb3VyY2VJbmZvdG90YWxXcml0dGVucmVhZENvdW50d3JpdGVDb3VudGxhc3RSZWFkbGFzdFdyaXRlX0ZpbGVSZXNvdXJjZUluZm9vcGVuRmlsZXNGaWxlT3BlbmVkRmlsZUNsb3NlZGdldE9wZW5GaWxlc0xpc3RnZXRPcGVuRmlsZXNfb3BlbmZpbGVzanNvblZhbHVlZ2V0RmlsZUluZm9NYXBnZXRGaWxlSW5mb01hcEJ5SURfUHJvY2Vzc1Jlc291cmNlSW5mb3N0YXJ0ZWRBdHN0YXJ0ZWRQcm9jZXNzZXNQcm9jZXNzU3RhcnRlZFByb2Nlc3NTdG9wcGVkZ2V0U3RhcnRlZFByb2Nlc3Nlc0xpc3RnZXRTdGFydGVkUHJvY2Vzc2VzX3N0YXJ0ZWRwcm9jZXNzZXNnZXRQcm9jZXNzSW5mb01hcEJ5SWRfU29ja2V0UmVzb3VyY2VJbmZvX3RjcFN0cmluZ1RDUF91ZHBTdHJpbmdVRFBvcGVuU29ja2V0c2xpc3RlbmluZzpyZW1vdGVyZW1vdGVIb3N0Z2V0T3BlblNvY2tldHNMaXN0Z2V0U29ja2V0SW5mb01hcGxpc3RlbmluZ05BYWRkcmVzc1R5cGVnZXRTb2NrZXRJbmZvTWFwQnlJRGdldE9wZW5Tb2NrZXRzX29wZW5zb2NrZXRzU29ja2V0T3BlbmVkU29ja2V0Q2xvc2VkX1N0cmVhbVNpbmtJbXBsX2RvbmVDb21wbGV0ZXJfY29udHJvbGxlckluc3RhbmNlX2NvbnRyb2xsZXJDb21wbGV0ZXJfaXNCb3VuZFN0cmVhbVNpbmsgaXMgY2xvc2VkU3RyZWFtU2luayBpcyBhbHJlYWR5IGJvdW5kIHRvIGEgc3RyZWFtU3RyZWFtU2luayBpcyBib3VuZCB0byBhIHN0cmVhbV9jbG9zZVRhcmdldF9jb21wbGV0ZURvbmVWYWx1ZV9jb21wbGV0ZURvbmVFcnJvcl9JT1NpbmtJbXBsX2VuY29kaW5nX2VuY29kaW5nTXV0YWJsZUlPU2luayBlbmNvZGluZyBpcyBub3QgbXV0YWJsZV9JT1NlcnZpY2Vfc2VydmljZVBvcnRzX3JlcGx5VG9Qb3J0X21lc3NhZ2VNYXBmaWxlRXhpc3RzZmlsZUNyZWF0ZWZpbGVEZWxldGVmaWxlUmVuYW1lZmlsZUNvcHlmaWxlT3BlbmZpbGVSZXNvbHZlU3ltYm9saWNMaW5rc2ZpbGVDbG9zZWZpbGVQb3NpdGlvbmZpbGVTZXRQb3NpdGlvbmZpbGVUcnVuY2F0ZWZpbGVMZW5ndGhGcm9tUGF0aGZpbGVMYXN0QWNjZXNzZWRmaWxlU2V0TGFzdEFjY2Vzc2VkZmlsZUxhc3RNb2RpZmllZGZpbGVTZXRMYXN0TW9kaWZpZWRmaWxlRmx1c2hmaWxlUmVhZEJ5dGVmaWxlV3JpdGVCeXRlZmlsZVJlYWRmaWxlUmVhZEludG9maWxlV3JpdGVGcm9tZmlsZUNyZWF0ZUxpbmtmaWxlRGVsZXRlTGlua2ZpbGVSZW5hbWVMaW5rZmlsZUxpbmtUYXJnZXRmaWxlVHlwZWZpbGVJZGVudGljYWxmaWxlU3RhdGZpbGVMb2Nrc29ja2V0TG9va3Vwc29ja2V0TGlzdEludGVyZmFjZXNzb2NrZXRSZXZlcnNlTG9va3VwZGlyZWN0b3J5Q3JlYXRlZGlyZWN0b3J5RGVsZXRlZGlyZWN0b3J5RXhpc3RzZGlyZWN0b3J5Q3JlYXRlVGVtcGRpcmVjdG9yeUxpc3RTdGFydGRpcmVjdG9yeUxpc3ROZXh0ZGlyZWN0b3J5TGlzdFN0b3BkaXJlY3RvcnlSZW5hbWVzc2xQcm9jZXNzRmlsdGVyX2Vuc3VyZUluaXRpYWxpemVfZ2V0TmV4dElkc2VydmljZVBvcnRjcmVhdGVMaW5rdXBkYXRlU3luY3RhcmdldFN5bmNfTGlua0xpbms6ICdfZXhjZXB0aW9uRnJvbVJlc3BvbnNlQ2Fubm90IGNyZWF0ZSBsaW5rIHRvIHRhcmdldCAnQ2Fubm90IGNyZWF0ZSBsaW5rQ2Fubm90IGRlbGV0ZSBsaW5rQ2Fubm90IHJlbmFtZSBsaW5rIHRvICdDYW5ub3QgcmVuYW1lIGxpbmsgJ0Nhbm5vdCBnZXQgdGFyZ2V0IG9mIGxpbmtDYW5ub3QgcmVhZCBsaW5rX05hbWVzcGFjZUlPT3ZlcnJpZGVzX2dsb2JhbHNvY2tldENvbm5lY3Rzb2NrZXRTdGFydENvbm5lY3RydW5XaXRoSU9PdmVycmlkZXNfSU9PdmVycmlkZXNTY29wZV9jcmVhdGVEaXJlY3RvcnlfZ2V0Q3VycmVudERpcmVjdG9yeV9zZXRDdXJyZW50RGlyZWN0b3J5X2dldFN5c3RlbVRlbXBEaXJlY3RvcnlfY3JlYXRlRmlsZV9mc2VJZGVudGljYWxfZnNlSWRlbnRpY2FsU3luY19mc2VHZXRUeXBlX2ZzZUdldFR5cGVTeW5jX2ZzV2F0Y2hfZnNXYXRjaElzU3VwcG9ydGVkX3NvY2tldENvbm5lY3Rfc29ja2V0U3RhcnRDb25uZWN0X251bWJlck9mUHJvY2Vzc29yc19wYXRoU2VwYXJhdG9yX29wZXJhdGluZ1N5c3RlbV9vcGVyYXRpbmdTeXN0ZW1WZXJzaW9uX2xvY2FsSG9zdG5hbWVfdmVyc2lvbmlzTGludXhsaW51eGlzTWFjT1NtYWNvc2lzQW5kcm9pZGFuZHJvaWRpc0lPU2lvc2lzRnVjaHNpYWZ1Y2hzaWFudW1iZXJPZlByb2Nlc3NvcnNsb2NhbGVOYW1lb3BlcmF0aW5nU3lzdGVtb3BlcmF0aW5nU3lzdGVtVmVyc2lvbmxvY2FsSG9zdG5hbWVyZXNvbHZlZEV4ZWN1dGFibGVleGVjdXRhYmxlQXJndW1lbnRzcGFja2FnZXMvIGRpcmVjdG9yeSByZXNvbHV0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gRGFydCAyX1BsYXRmb3JtX2xvY2FsZUNsb3N1cmVfZW52aXJvbm1lbnRDYWNoZV9jYWNoZWRPU1ZlcnNpb25fbmF0aXZlU2NyaXB0ZGFydDpkYXRhOlBsYXRmb3JtX051bWJlck9mUHJvY2Vzc29yc1BsYXRmb3JtX1BhdGhTZXBhcmF0b3JQbGF0Zm9ybV9PcGVyYXRpbmdTeXN0ZW1QbGF0Zm9ybV9PcGVyYXRpbmdTeXN0ZW1WZXJzaW9uUGxhdGZvcm1fTG9jYWxIb3N0bmFtZV9leGVjdXRhYmxlUGxhdGZvcm1fRXhlY3V0YWJsZU5hbWVfcmVzb2x2ZWRFeGVjdXRhYmxlUGxhdGZvcm1fUmVzb2x2ZWRFeGVjdXRhYmxlTmFtZVBsYXRmb3JtX0Vudmlyb25tZW50X2V4ZWN1dGFibGVBcmd1bWVudHNQbGF0Zm9ybV9FeGVjdXRhYmxlQXJndW1lbnRzUGxhdGZvcm1fR2V0VmVyc2lvbl9sb2NhbGVOYW1lUGxhdGZvcm1fTG9jYWxlTmFtZV9zY3JpcHRlcXVhbHNJbmRleF9DYXNlSW5zZW5zaXRpdmVTdHJpbmdNYXBfUHJvY2Vzc1V0aWxzX2tpbGxQaWRQcm9jZXNzX0tpbGxQaWRfd2F0Y2hTaWduYWxJbnRlcm5hbFByb2Nlc3NfRXhpdF9zZXRFeGl0Q29kZVByb2Nlc3NfU2V0RXhpdENvZGVfZ2V0RXhpdENvZGVQcm9jZXNzX0dldEV4aXRDb2RlX3NsZWVwUHJvY2Vzc19TbGVlcF9waWRQcm9jZXNzX1BpZF93YXRjaFNpZ25hbExpc3RlbmluZyBmb3Igc2lnbmFsICBpcyBub3Qgc3VwcG9ydGVkUHJvY2Vzc0luZm9fbWF4UnNzUHJvY2Vzc0luZm9fTWF4UlNTX2N1cnJlbnRSc3NQcm9jZXNzSW5mb19DdXJyZW50UlNTY3VycmVudFJzc21heFJzc1Byb2Nlc3NTdGFydE1vZGVVc2Ugbm9ybWFsIGluc3RlYWRpbmhlcml0U3RkaW9JTkhFUklUX1NURElPVXNlIGluaGVyaXRTdGRpbyBpbnN0ZWFkZGV0YWNoZWRERVRBQ0hFRFVzZSBkZXRhY2hlZCBpbnN0ZWFkZGV0YWNoZWRXaXRoU3RkaW9ERVRBQ0hFRF9XSVRIX1NURElPVXNlIGRldGFjaGVkV2l0aFN0ZGlvIGluc3RlYWRydW5TeW5ja2lsbFBpZFByb2Nlc3NTaWduYWxzaWdodXBTSUdIVVBzaWdpbnRTSUdJTlRzaWdxdWl0U0lHUVVJVHNpZ2lsbFNJR0lMTHNpZ3RyYXBTSUdUUkFQc2lnYWJydFNJR0FCUlRzaWdidXNTSUdCVVNzaWdmcGVTSUdGUEVzaWdraWxsU0lHS0lMTHNpZ3VzcjFTSUdVU1Ixc2lnc2VndlNJR1NFR1ZzaWd1c3IyU0lHVVNSMnNpZ3BpcGVTSUdQSVBFc2lnYWxybVNJR0FMUk1zaWd0ZXJtU0lHVEVSTXNpZ2NobGRTSUdDSExEc2lnY29udFNJR0NPTlRzaWdzdG9wU0lHU1RPUHNpZ3RzdHBTSUdUU1RQc2lndHRpblNJR1RUSU5zaWd0dG91U0lHVFRPVXNpZ3VyZ1NJR1VSR3NpZ3hjcHVTSUdYQ1BVc2lneGZzelNJR1hGU1pzaWd2dGFscm1TSUdWVEFMUk1zaWdwcm9mU0lHUFJPRnNpZ3dpbmNoU0lHV0lOQ0hzaWdwb2xsU0lHUE9MTHNpZ3N5c1NJR1NZU1VzZSBzaWdodXAgaW5zdGVhZFVzZSBzaWdpbnQgaW5zdGVhZFVzZSBzaWdxdWl0IGluc3RlYWRVc2Ugc2lnaWxsIGluc3RlYWRVc2Ugc2lndHJhcCBpbnN0ZWFkVXNlIHNpZ2FicnQgaW5zdGVhZFVzZSBzaWdidXMgaW5zdGVhZFVzZSBzaWdmcGUgaW5zdGVhZFVzZSBzaWdraWxsIGluc3RlYWRVc2Ugc2lndXNyMSBpbnN0ZWFkVXNlIHNpZ3NlZ3YgaW5zdGVhZFVzZSBzaWd1c3IyIGluc3RlYWRVc2Ugc2lncGlwZSBpbnN0ZWFkVXNlIHNpZ2Fscm0gaW5zdGVhZFVzZSBzaWd0ZXJtIGluc3RlYWRVc2Ugc2lnY2hsZCBpbnN0ZWFkVXNlIHNpZ2NvbnQgaW5zdGVhZFVzZSBzaWdzdG9wIGluc3RlYWRVc2Ugc2lndHN0cCBpbnN0ZWFkVXNlIHNpZ3R0aW4gaW5zdGVhZFVzZSBzaWd0dG91IGluc3RlYWRVc2Ugc2lndXJnIGluc3RlYWRVc2Ugc2lneGNwdSBpbnN0ZWFkVXNlIHNpZ3hmc3ogaW5zdGVhZFVzZSBzaWd2dGFscm0gaW5zdGVhZFVzZSBzaWdwcm9mIGluc3RlYWRVc2Ugc2lnd2luY2ggaW5zdGVhZFVzZSBzaWdwb2xsIGluc3RlYWRVc2Ugc2lnc3lzIGluc3RlYWRTaWduYWxFeGNlcHRpb24sIG9zRXJyb3I6IFNpZ25hbEV4Y2VwdGlvbjogUHJvY2Vzc0V4Y2VwdGlvbk9TIGVycm9yIGNvZGU6IFByb2Nlc3NFeGNlcHRpb246IAogIENvbW1hbmQ6IFNlY3VyZVNlcnZlclNvY2tldHN1cHBvcnRlZFByb3RvY29sc3NlcnZlclNvY2tldFJhd1NlY3VyZVNlcnZlclNvY2tldF9jb250ZXh0Y29ubmVjdGlvbnNlY3VyZUNvbm5lY3Rpb25TZWN1cmVTb2NrZXRvbkJhZENlcnRpZmljYXRlcmF3U3RhdGVkZXRhY2hlZFJhd3NlY3VyZVNlcnZlcmJ1ZmZlcmVkRGF0YVJhd1NlY3VyZVNvY2tldFg1MDlDZXJ0aWZpY2F0ZV9GaWx0ZXJTdGF0dXNyZWFkRW1wdHl3cml0ZUVtcHR5cmVhZFBsYWludGV4dE5vTG9uZ2VyRW1wdHl3cml0ZVBsYWludGV4dE5vTG9uZ2VyRnVsbHJlYWRFbmNyeXB0ZWROb0xvbmdlckZ1bGx3cml0ZUVuY3J5cHRlZE5vTG9uZ2VyRW1wdHlfUmF3U2VjdXJlU29ja2V0aGFuZHNoYWtlU3RhdHVzY29ubmVjdGVkU3RhdHVzY2xvc2VkU3RhdHVzcmVhZFBsYWludGV4dElkd3JpdGVQbGFpbnRleHRJZHJlYWRFbmNyeXB0ZWRJZHdyaXRlRW5jcnlwdGVkSWRidWZmZXJDb3VudF9oYW5kc2hha2VDb21wbGV0ZV9zb2NrZXRTdWJzY3JpcHRpb25fYnVmZmVyZWREYXRhX2J1ZmZlcmVkRGF0YUluZGV4X3N0YXR1c19wYXVzZUNvdW50X3BlbmRpbmdSZWFkRXZlbnRfc29ja2V0Q2xvc2VkUmVhZF9zb2NrZXRDbG9zZWRXcml0ZV9jbG9zZWRSZWFkX2Nsb3NlZFdyaXRlX2ZpbHRlclN0YXR1c19jb25uZWN0UGVuZGluZ19maWx0ZXJQZW5kaW5nX2ZpbHRlckFjdGl2ZV9zZWN1cmVGaWx0ZXJfc2VsZWN0ZWRQcm90b2NvbHJlcXVlc3RlZFBvcnRfc2VjdXJlSGFuZHNoYWtlQ29tcGxldGVIYW5kbGVyX29uQmFkQ2VydGlmaWNhdGVXcmFwcGVyX2V2ZW50RGlzcGF0Y2hlcl9kb25lSGFuZGxlclN1YnNjcmlwdGlvbiBwYXNzZWQgdG8gVExTIHVwZ3JhZGUgaXMgcGF1c2VkX3NlY3VyZUhhbmRzaGFrZV9pc0J1ZmZlckVuY3J5cHRlZF9zZW5kV3JpdGVFdmVudF92ZXJpZnlGaWVsZHNob3N0IGlzIG5vdCBhIFN0cmluZyBvciBhbiBJbnRlcm5ldEFkZHJlc3NyZXF1ZXN0ZWRQb3J0IGlzIG5vdCBpbiB0aGUgcmFuZ2UgMC4uNjU1MzVfY29tcGxldGVDbG9zZUNvbXBsZXRlcl9zY2hlZHVsZVJlYWRFdmVudEludmFsaWQgbGVuZ3RoIHBhcmFtZXRlciBpbiBTZWN1cmVTb2NrZXQucmVhZCAobGVuZ3RoOiBSZWFkaW5nIGZyb20gYSBjbG9zZWQgc29ja2V0X3NjaGVkdWxlRmlsdGVySW52YWxpZCBieXRlcyBwYXJhbWV0ZXIgaW4gU2VjdXJlU29ja2V0LnJlYWQgKGJ5dGVzOiBJbnZhbGlkIG9mZnNldCBwYXJhbWV0ZXIgaW4gU2VjdXJlU29ja2V0LnJlYWQgKG9mZnNldDogV3JpdGluZyB0byBhIGNsb3NlZCBzb2NrZXR3cml0dGVuY2VydGlmaWNhdGVvbkJhZENlcnRpZmljYXRlIGNhbGxiYWNrIHJldHVybmVkIG5vbi1ib29sZWFuIF9yZWFkSGFuZGxlcl93cml0ZUhhbmRsZXJfY2xvc2VIYW5kbGVyX3JlYWRTb2NrZXRfd3JpdGVTb2NrZXRDb25uZWN0aW9uIHRlcm1pbmF0ZWQgZHVyaW5nIGhhbmRzaGFrZUNhbGxlZCByZW5lZ290aWF0ZSBvbiBhIG5vbi1jb25uZWN0ZWQgc29ja2V0X3RyeUZpbHRlcl9wdXNoQWxsRmlsdGVyU3RhZ2VzX3JlYWRTb2NrZXRPckJ1ZmZlcmVkRGF0YXdyaXRlRnJvbVNvdXJjZXJlYWRUb1NvY2tldF9zZW5kUmVhZEV2ZW50d2FzSW5IYW5kc2hha2VidWZzIGVycm9yIG5ld19zdGFydG5ld19lbmRfRXh0ZXJuYWxCdWZmZXJhZHZhbmNlU3RhcnRhZHZhbmNlRW5kbGluZWFyTGVuZ3RobGluZWFyRnJlZWJ5dGVzUmVhZHRvUmVhZGlucHV0RGF0YXRvV3JpdGVfU2VjdXJlRmlsdGVyVGxzRXhjZXB0aW9uSGFuZHNoYWtlRXhjZXB0aW9uQ2VydGlmaWNhdGVFeGNlcHRpb25TZWN1cml0eUNvbnRleHRhbHBuU3VwcG9ydGVkX3Byb3RvY29sc1RvTGVuZ3RoRW5jb2Rpbmdwcm90b2NvbHNMZW5ndGhleHBlY3RlZExlbmd0aExlbmd0aCBvZiBwcm90b2NvbCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMjU1ICh3YXM6IFRoZSBtYXhpbXVtIG1lc3NhZ2UgbGVuZ3RoIHN1cHBvcnRlZCBpcyAyXjEzLTEuYnl0ZXNPZmZzZXRfcHJvdG9jb2xzVG9MZW5ndGhFbmNvZGluZ05vbkFzY2lpQmFpbG91dGFkZFByb3RvY29sb3V0Qnl0ZXNwcm90b2NvbEJ5dGVzX1NlcnZpY2VPYmplY3RJbnRlcm5ldEFkZHJlc3NUeXBlSVB2NElQdjZJUF9WNFVzZSBJUHY0IGluc3RlYWRJUF9WNlVzZSBJUHY2IGluc3RlYWRBTllVc2UgYW55IGluc3RlYWRfZnJvbUludmFsaWQgdHlwZTogSW52YWxpZCBJbnRlcm5ldEFkZHJlc3NJbnRlcm5ldEFkZHJlc3NUeXBlOiBJbnRlcm5ldEFkZHJlc3NMT09QQkFDS19JUF9WNFVzZSBsb29wYmFja0lQdjQgaW5zdGVhZExPT1BCQUNLX0lQX1Y2VXNlIGxvb3BiYWNrSVB2NiBpbnN0ZWFkQU5ZX0lQX1Y0VXNlIGFueUlQdjQgaW5zdGVhZEFOWV9JUF9WNlVzZSBhbnlJUHY2IGluc3RlYWROZXR3b3JrSW50ZXJmYWNlX2xpc3RTdXBwb3J0ZWROZXR3b3JrSW50ZXJmYWNlX0xpc3RTdXBwb3J0ZWRsaXN0U3VwcG9ydGVkUmF3U2VydmVyU29ja2V0U2VydmVyU29ja2V0U29ja2V0RGlyZWN0aW9uUkVDRUlWRVVzZSByZWNlaXZlIGluc3RlYWRTRU5EVXNlIHNlbmQgaW5zdGVhZFVzZSBib3RoIGluc3RlYWRTb2NrZXRPcHRpb250Y3BOb0RlbGF5VENQX05PREVMQVlVc2UgdGNwTm9EZWxheSBpbnN0ZWFkX2lwTXVsdGljYXN0TG9vcF9pcE11bHRpY2FzdEhvcHNfaXBNdWx0aWNhc3RJZl9pcEJyb2FkY2FzdF9SYXdTb2NrZXRPcHRpb25zU09MX1NPQ0tFVF9SYXdTb2NrZXRPcHRpb25zLlNPTF9TT0NLRVRJUFBST1RPX0lQX1Jhd1NvY2tldE9wdGlvbnMuSVBQUk9UT19JUElQX01VTFRJQ0FTVF9JRl9SYXdTb2NrZXRPcHRpb25zLklQX01VTFRJQ0FTVF9JRklQUFJPVE9fSVBWNl9SYXdTb2NrZXRPcHRpb25zLklQUFJPVE9fSVBWNklQVjZfTVVMVElDQVNUX0lGX1Jhd1NvY2tldE9wdGlvbnMuSVBWNl9NVUxUSUNBU1RfSUZJUFBST1RPX1RDUF9SYXdTb2NrZXRPcHRpb25zLklQUFJPVE9fVENQSVBQUk9UT19VRFBfUmF3U29ja2V0T3B0aW9ucy5JUFBST1RPX1VEUFJhd1NvY2tldE9wdGlvbl9vcHRpb25zQ2FjaGVfZ2V0TmF0aXZlT3B0aW9uVmFsdWVSYXdTb2NrZXRPcHRpb25fR2V0T3B0aW9uVmFsdWVmcm9tSW50ZnJvbUJvb2xsZXZlbFNvY2tldGxldmVsSVB2NElQdjRNdWx0aWNhc3RJbnRlcmZhY2VsZXZlbElQdjZJUHY2TXVsdGljYXN0SW50ZXJmYWNlbGV2ZWxUY3BsZXZlbFVkcF9nZXRPcHRpb25WYWx1ZVJhd1NvY2tldEV2ZW50cmVhZENsb3NlZFJFQURfQ0xPU0VEVXNlIHJlYWRDbG9zZWQgaW5zdGVhZENMT1NFRFVzZSBjbG9zZWQgaW5zdGVhZFJhd1NvY2tldEV2ZW50LnJlYWRSYXdTb2NrZXRFdmVudC53cml0ZVJhd1NvY2tldEV2ZW50LnJlYWRDbG9zZWRSYXdTb2NrZXRFdmVudC5jbG9zZWRDb25uZWN0aW9uVGFza1Jhd1NvY2tldFNvY2tldF9jb25uZWN0X3N0YXJ0Q29ubmVjdHJhd1Rhc2tEYXRhZ3JhbVJhd0RhdGFncmFtU29ja2V0VGhpcyBwcm9wZXJ0eSBpcyBub3QgaW1wbGVtZW50ZWQuIFVzZSBnZXRSYXdPcHRpb24gYW5kIHNldFJhd09wdGlvbiBpbnN0ZWFkLlNvY2tldCBoYXMgYmVlbiBjbG9zZWQsIGFkZHJlc3MgPSAsIHBvcnQgPSBfU3RkU3RyZWFtU3RkaW5fZmRfZWNob01vZGVTdGRpbl9HZXRFY2hvTW9kZV9zZXRFY2hvTW9kZVN0ZGluX1NldEVjaG9Nb2RlX2xpbmVNb2RlU3RkaW5fR2V0TGluZU1vZGVfc2V0TGluZU1vZGVTdGRpbl9TZXRMaW5lTW9kZVN0ZGluX1JlYWRCeXRlU3RkaW5fQW5zaVN1cHBvcnRlZHJlYWRMaW5lU3luY3JldGFpbk5ld2xpbmVzQ1JMRmNySXNOZXdsaW5lbGluZU1vZGVlY2hvTW9kZUVycm9yIGdldHRpbmcgdGVybWluYWwgZWNobyBtb2RlVGhpcyBlbWJlZGRlciBkaXNhbGxvd3Mgc2V0dGluZyBTdGRpbi5lY2hvTW9kZUVycm9yIHNldHRpbmcgdGVybWluYWwgZWNobyBtb2RlRXJyb3IgZ2V0dGluZyB0ZXJtaW5hbCBsaW5lIG1vZGVUaGlzIGVtYmVkZGVyIGRpc2FsbG93cyBzZXR0aW5nIFN0ZGluLmxpbmVNb2RlRXJyb3Igc2V0dGluZyB0ZXJtaW5hbCBsaW5lIG1vZGVFcnJvciBkZXRlcm1pbmluZyBBTlNJIHN1cHBvcnRFcnJvciByZWFkaW5nIGJ5dGUgZnJvbSBzdGRpbmhhc1Rlcm1pbmFsU3Rkb3V0X25vbkJsb2NraW5nX3Rlcm1pbmFsU2l6ZUNvdWxkIG5vdCBnZXQgdGVybWluYWwgc2l6ZV9nZXRUZXJtaW5hbFNpemVTdGRvdXRfR2V0VGVybWluYWxTaXplX2dldEFuc2lTdXBwb3J0ZWRTdGRvdXRfQW5zaVN1cHBvcnRlZF9oYXNUZXJtaW5hbHRlcm1pbmFsQ29sdW1uc190ZXJtaW5hbENvbHVtbnN0ZXJtaW5hbExpbmVzX3Rlcm1pbmFsTGluZXNTdGRvdXRFeGNlcHRpb25TdGRvdXRFeGNlcHRpb246IFN0ZGluRXhjZXB0aW9uU3RkaW5FeGNlcHRpb246IF9TdGRDb25zdW1lcl9TdGRTaW5rU3RkaW9UeXBldGVybWluYWxURVJNSU5BTFVzZSB0ZXJtaW5hbCBpbnN0ZWFkUElQRVVzZSBwaXBlIGluc3RlYWRVc2Ugb3RoZXIgaW5zdGVhZFN0ZGlvVHlwZTogX1N0ZElPVXRpbHNfbmF0aXZlU29ja2V0VHlwZUVycm9yIHJldHJpZXZpbmcgc29ja2V0IHR5cGVfZ2V0U3RkaW9PdXRwdXRTdHJlYW1Db3VsZG4ndCBkZXRlcm1pbmUgZmlsZSB0eXBlIG9mIHN0ZGlvIGhhbmRsZSAoZmQgX2dldFN0ZGlvSW5wdXRTdHJlYW1Db3VsZG4ndCBkZXRlcm1pbmUgZmlsZSB0eXBlIG9mIHN0ZGluIChmZCBfc29ja2V0VHlwZV9nZXRTdGRpb0hhbmRsZVR5cGVGaWxlX0dldFN0ZGlvSGFuZGxlVHlwZVN5c3RlbUVuY29kaW5nc3lzdGVtX1dpbmRvd3NDb2RlUGFnZUVuY29kZXJJbnZhbGlkIGNoYXJhY3RlciBmb3IgZW5jb2RpbmdfZW5jb2RlU3RyaW5nU3RyaW5nVG9TeXN0ZW1FbmNvZGluZ19XaW5kb3dzQ29kZVBhZ2VFbmNvZGVyU2lua19XaW5kb3dzQ29kZVBhZ2VEZWNvZGVyX2RlY29kZUJ5dGVzU3lzdGVtRW5jb2RpbmdUb1N0cmluZ19XaW5kb3dzQ29kZVBhZ2VEZWNvZGVyU2lua1Jhd1N5bmNocm9ub3VzU29ja2V0X3NpZ25hbENvbnRyb2xsZXJzX3N1Y2Nlc3NSZXNwb25zZV9pbGxlZ2FsQXJndW1lbnRSZXNwb25zZV9vc0Vycm9yUmVzcG9uc2VfZmlsZUNsb3NlZFJlc3BvbnNlX2Vycm9yUmVzcG9uc2VFcnJvclR5cGVfb3NFcnJvclJlc3BvbnNlRXJyb3JDb2RlX29zRXJyb3JSZXNwb25zZU1lc3NhZ2V6bGliWkxJQlVzZSB6bGliIGluc3RlYWRHWklQVXNlIGd6aXAgaW5zdGVhZFVzZSBGaWxlTW9kZS5yZWFkIGluc3RlYWRVc2UgRmlsZU1vZGUud3JpdGUgaW5zdGVhZFVzZSBGaWxlTW9kZS5hcHBlbmQgaW5zdGVhZFVzZSBGaWxlTW9kZS53cml0ZU9ubHkgaW5zdGVhZFVzZSBGaWxlTW9kZS53cml0ZU9ubHlBcHBlbmQgaW5zdGVhZF9ibG9ja1NpemVfaW9PdmVycmlkZXNUb2tlbl9hc3luY1J1blpvbmVkX25leHRTZXJ2aWNlSWRfc3RkaW9IYW5kbGVUeXBlVGVybWluYWxfc3RkaW9IYW5kbGVUeXBlUGlwZV9zdGRpb0hhbmRsZVR5cGVGaWxlX3N0ZGlvSGFuZGxlVHlwZVNvY2tldF9zdGRpb0hhbmRsZVR5cGVPdGhlcl9zdGRpbkZEX3N0ZG91dEZEX3N0ZGVyckZEc3lzdGVtRW5jb2RpbmdTWVNURU1fRU5DT0RJTkdVc2Ugc3lzdGVtRW5jb2RpbmcgaW5zdGVhZF91cmlCYXNlQ2xvc3VyZV9nZXRVcmlCYXNlQ2xvc3VyZV9tYWtlVWludDhMaXN0Vmlld19nZXRXYXRjaFNpZ25hbEludGVybmFsX3J1bk5vbkludGVyYWN0aXZlUHJvY2Vzc2ZvbGRTdHJlYW1fcnVuTm9uSW50ZXJhY3RpdmVQcm9jZXNzU3luY190aHJvd09uQmFkUG9ydEludmFsaWQgcG9ydCBfdGhyb3dPbkJhZFR0bEludmFsaWQgdHRsIF9tYWtlRGF0YWdyYW1fZ2V0U3RkaW9IYW5kbGVTb2NrZXRfR2V0U3RkaW9IYW5kbGVfZ2V0U29ja2V0VHlwZVNvY2tldF9HZXRUeXBlX2Vuc3VyZUZhc3RBbmRTZXJpYWxpemFibGVCeXRlRGF0YUxpc3QgZWxlbWVudCBpcyBudWxsIGF0IGluZGV4IF92YWxpZGF0ZVpMaWJXaW5kb3dCaXRzX3ZhbGlkYXRlWkxpYmVMZXZlbF92YWxpZGF0ZVpMaWJNZW1MZXZlbF92YWxpZGF0ZVpMaWJTdHJhdGVneXN0cmF0ZWdpZXNVbnN1cHBvcnRlZCAnc3RyYXRlZ3knVGhpcyBlbWJlZGRlciBkaXNhbGxvd3MgY2FsbGluZyBkYXJ0OmlvJ3MgZXhpdCgpc2xlZXBzbGVlcDogZHVyYXRpb24gY2Fubm90IGJlIG5lZ2F0aXZlVGhpcyBlbWJlZGRlciBkaXNhbGxvd3MgY2FsbGluZyBkYXJ0OmlvJ3Mgc2xlZXAoKV9zZXRTdGRpb0ZEc3N0ZGlvVHlwZXN0ZGlvZmRkYXJ0LmNsaXdhaXRfZm9yLmRhcnRfV2FpdEZvclV0aWxzd2FpdEZvckV2ZW50d2FpdEZvciBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZW1iZWRkZXJfd2FpdEZvckV2ZW50Q2xvc3VyZV93YWl0Rm9yRXZlbnRDTElfV2FpdEZvckV2ZW50dGltZW91dE1pbGxpc19nZXRXYWl0Rm9yRXZlbnR3YWl0Rm9yZnV0dXJlQ29tcGxldGVkc3RhY2t0cmFjZXdhaXRGb3IoKSB0aW1lZCBvdXRkYXJ0LmNvcmVNYXBzYmlnaW50LmRhcnRib29sLmRhcnRjb21wYXJhYmxlLmRhcnRkYXRlX3RpbWUuZGFydGRvdWJsZS5kYXJ0ZHVyYXRpb24uZGFydGVycm9ycy5kYXJ0ZXhjZXB0aW9ucy5kYXJ0ZXhwYW5kby5kYXJ0ZnVuY3Rpb24uZGFydGlkZW50aWNhbC5kYXJ0aW50LmRhcnRpbnZvY2F0aW9uLmRhcnRtYXAuZGFydG51bGwuZGFydG51bS5kYXJ0b2JqZWN0LmRhcnRwYXR0ZXJuLmRhcnRyZWdleHAuZGFydHNpbmsuZGFydHN0YWNrdHJhY2UuZGFydHN0b3B3YXRjaC5kYXJ0c3RyaW5nLmRhcnRzdHJpbmdfYnVmZmVyLmRhcnRzdHJpbmdfc2luay5kYXJ0dHlwZS5kYXJ0dXJpLmRhcnRfU3luY0dlbmVyYXRvckNhbGxiYWNrX1VyaUJhc2VDbG9zdXJlQ29tcGFyYXRvcl9HZW5lcmF0b3JfRW51bUhlbHBlcl9tb3ZlTmV4dEZuX3lpZWxkRWFjaEl0ZXJhdG9yX0xpc3RMaXN0X2FsbG9jYXRlTGlzdF9nZXRJbmRleGVkX3NldEluZGV4ZWRMaXN0X3NldEluZGV4ZWRMaXN0X2dldExlbmd0aF9zbGljZW5lZWRzVHlwZUFyZ3VtZW50X3NsaWNlSW50ZXJuYWxMaXN0X3NsaWNlaXRlcmFibGVBc0xpc3Rfc2V0TGVuZ3RoX0ltbXV0YWJsZUxpc3RJbW11dGFibGVBcnJheSBjYW4gb25seSBiZSBhbGxvY2F0ZWQgYnkgdGhlIFZNSW1tdXRhYmxlTGlzdF9mcm9tX0ZpeGVkU2l6ZUFycmF5SXRlcmF0b3JfQmlnSW50SW1wbF9kaWdpdEJpdHNfZGlnaXRCYXNlX2RpZ2l0TWFza19oYWxmRGlnaXRCaXRzX2hhbGZEaWdpdE1hc2t0d29fbWludXNPbmVfb25lRGlnaXRNYXNrX3R3b0RpZ2l0TWFza19vbmVCaWxsaW9uX21pbkludC05MjIzMzcyMDM2ODU0Nzc1ODA4X21heEludDkyMjMzNzIwMzY4NTQ3NzU4MDdfbGFzdERpdmlkZW5kRGlnaXRzX2xhc3REaXZpZGVuZFVzZWRfbGFzdERpdmlzb3JEaWdpdHNfbGFzdERpdmlzb3JVc2VkX2xhc3RRdW9SZW1EaWdpdHNfbGFzdFF1b1JlbVVzZWRfbGFzdFJlbVVzZWRfbGFzdFJlbV9uc2hfaXNOZWdhdGl2ZV9kaWdpdHNfYml0c0ZvckZyb21Eb3VibGVfZGl2aXNvckxvd1RvcERpZ2l0X2Rpdmlzb3JUb3BEaWdpdF9xdW90aWVudERpZ2l0X3F1b3RpZW50SGlnaERpZ2l0X25vcm1hbGl6ZWRyYWRpeENvdWxkIG5vdCBwYXJzZSBCaWdJbnRfcGFyc2VEZWNpbWFsXzBkaWdpdEluUGFydENvdW50X2NvZGVVbml0VG9SYWRpeFZhbHVlXzlfYV9wYXJzZUhleHN0YXJ0UG9zaGV4Q2hhcnNQZXJEaWdpdHNvdXJjZUxlbmd0aGxhc3REaWdpdExlbmd0aGRpZ2l0SW5kZXhfcGFyc2VSYWRpeF90cnlQYXJzZXJlXlxzKihbKy1dPykoKDB4W2EtZjAtOV0rKXwoXGQrKXwoW2EtejAtOV0rKSlccyokY2FzZVNlbnNpdGl2ZXNpZ25JbmRleGhleEluZGV4ZGVjaW1hbEluZGV4bm9uRGVjaW1hbEhleEluZGV4ZGVjaW1hbE1hdGNoaGV4TWF0Y2hub25EZWNpbWFsTWF0Y2hpcyBub3QgYW4gaW50ZWdlcl9ub3JtYWxpemVfaXNaZXJvX2Nsb25lRGlnaXRzcmVzdWx0RGlnaXRzNDI5NDk2NzI5Nl9mcm9tSW50X2Zyb21Eb3VibGVleHBvbmVudEJpYXNWYWx1ZSBtdXN0IGJlIGZpbml0ZTogZmxvb3JUb0RvdWJsZWJpYXNlZEV4cG9uZW50dW5zaGlmdGVkRGlnaXRzdW5zaGlmdGVkQmlnYWJzUmVzdWx0X2RsU2hpZnRyZXN1bHRVc2VkX2RsU2hpZnREaWdpdHN4RGlnaXRzeFVzZWRfZHJTaGlmdF9kclNoaWZ0RGlnaXRzX2xzaGRpZ2l0U2hpZnRiaXRTaGlmdGNhcnJ5Qml0U2hpZnRiaXRNYXNrY2FycnlzaGlmdEFtb3VudHNoaWZ0LWFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIF9sU2hpZnREaWdpdHNkaWdpdHNTaGlmdF9yc2hfclNoaWZ0RGlnaXRzX2Fic0NvbXBhcmViaWdJbnRfY29tcGFyZURpZ2l0c290aGVyRGlnaXRzb3RoZXJVc2VkX2Fic0FkZF9hYnNTdWJfYWJzQWRkU2V0U2lnbl9hYnNTdWJTZXRTaWduX2Fic0FuZFNldFNpZ25fYWJzQW5kTm90U2V0U2lnbl9hYnNPclNldFNpZ25sRGlnaXRzX2Fic1hvclNldFNpZ250aGlzMW90aGVyMW4xX211bEFkZHhJbmRleG11bHRpcGxpY2FuZERpZ2l0c2FjY3VtdWxhdG9yRGlnaXRzeGx4aG1sbWhwaHBsX3NxckFkZGFjY3VsdW1hdG9yRGlnaXRzX211bERpZ2l0c19zcXJEaWdpdHNfZXN0aW1hdGVRdW90aWVudERpZ2l0cXVvdGllbnREaWdpdF9kaXZfZGl2UmVtbGFzdFF1b191c2VkcXVvX2RpZ2l0c3F1b19yZW1yZW1EaWdpdHNyZW1uc2h5RGlnaXRzeVVzZWRudW1FeHRyYURpZ2l0c3RtcERpZ2l0c255RGlnaXRzZDBkMV9yZW1EaWdpdHNFeHBvbmVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZTogbW9kUG93YmlnRXhwb25lbnRiaWdNb2R1bHVzbW9kdWx1c2V4cG9uZW50IG11c3QgYmUgcG9zaXRpdmU6IG1vZHVsdXMgbXVzdCBiZSBzdHJpY3RseSBwb3NpdGl2ZTogZXhwb25lbnRCaXRsZW5jYW5ub3RVc2VNb250Z29tZXJ5X25vcm1Nb2R1bHVzVXNlZHJlc3VsdDJEaWdpdHNnRGlnaXRzZ1VzZWRyZXN1bHQyVXNlZF9zcXJfbXVsX3JldmVydGttZzJEaWdpdHNnMlVzZWRleHBvbmVudERpZ2l0c2d3RGlnaXRzc3dhcERpZ2l0c3N3YXBVc2VkX2JpbmFyeUdjZGludm1heFVzZWRtYXhMZW5Ob3QgY29wcmltZW11c3Qgbm90IGJlIHplcm9kaWdpdFNoaWZ0QW1vdW50dURpZ2l0c3ZEaWdpdHNhY2FiY2RVc2VkYWJjZExlbmFEaWdpdHNiRGlnaXRzY0RpZ2l0c2REaWdpdHNhSXNOZWdhdGl2ZWJJc05lZ2F0aXZlY0lzTmVnYXRpdmVkSXNOZWdhdGl2ZWFfY21wX2NiX2NtcF9kY19jbXBfYWRfY21wX2Jtb2RJbnZlcnNlTW9kdWx1cyBtdXN0IGJlIHN0cmljdGx5IHBvc2l0aXZlOiBnY2Rpc1ZhbGlkSW50bWF4RG91YmxlRXhwb25lbnRyZXN1bHRCaXRzY2FjaGVkQml0c2NhY2hlZEJpdHNMZW5ndGhyZWFkQml0c25leHREaWdpdG5leHREaWdpdExlbmd0aGxlYWRpbmdCaXRzcm91bmRVcGRlY2ltYWxEaWdpdENodW5rc2RpZ2l0czl6ZXJvczAwMDAwMDAwMDAwMDAwX3RvUmFkaXhDb2RlVW5pdGRpZ2l0U3RyaW5nX3RvSGV4U3RyaW5ncmV2ZXJzZWREaWdpdENvZGVVbml0c21zYkNodW5rX2Rhc2hfQmlnSW50UmVkdWN0aW9uX0JpZ0ludE1vbnRnb21lcnlSZWR1Y3Rpb25fbW9kdWx1c19tb2R1bHVzRGlnaXRzX2FyZ3NfZGlnaXRzUGVyU3RlcF94RGlnaXRfeEhpZ2hEaWdpdF9yaG9EaWdpdF9yaG9IaWdoRGlnaXRfbXVEaWdpdF9tdUhpZ2hEaWdpdF9pbnZEaWdpdF9pbnZEaWdpdFBhaXJfbXVsTW9kcmhvbHJob2hkaGRsX3JlZHVjZV9CaWdJbnRDbGFzc2ljUmVkdWN0aW9uX25vcm1Nb2R1bHVzX25vcm1Nb2R1bHVzRGlnaXRzX25lZ05vcm1Nb2R1bHVzRGlnaXRzX21vZHVsdXNOc2hfdG1wRGlnaXRzbmVnTm9ybU1vZHVsdXNfRG91YmxlQ0FDSEVfU0laRV9MT0cyQ0FDSEVfTEVOR1RIQ0FDSEVfTUFTS19jYWNoZUV2aWN0SW5kZXhmcm9tSW50ZWdlckRvdWJsZV9kb3VibGVGcm9tSW50ZWdlckRvdWJsZV9oYXNoQ29kZV9pZGVudGl0eUhhc2hDb2RlRG91YmxlX2FkZF9zdWJEb3VibGVfc3ViRG91YmxlX211bF90cnVuY19kaXZEb3VibGVfdHJ1bmNfZGl2RG91YmxlX2Rpdl9tb2R1bG9Eb3VibGVfbW9kdWxvX3JlbWFpbmRlckRvdWJsZV9yZW1haW5kZXJEb3VibGVfZmxpcFNpZ25CaXRfZXF1YWxEb3VibGVfZXF1YWxfZXF1YWxUb0ludGVnZXJEb3VibGVfZXF1YWxUb0ludGVnZXJfZ3JlYXRlclRoYW5Eb3VibGVfZ3JlYXRlclRoYW5fYWRkRnJvbUludGVnZXJfc3ViRnJvbUludGVnZXJfbXVsRnJvbUludGVnZXJfdHJ1bmNEaXZGcm9tSW50ZWdlcl9tb2R1bG9Gcm9tSW50ZWdlcl9yZW1haW5kZXJGcm9tSW50ZWdlcl9ncmVhdGVyVGhhbkZyb21JbnRlZ2VyRG91YmxlX2dyZWF0ZXJUaGFuRnJvbUludGVnZXJEb3VibGVfZ2V0SXNOZWdhdGl2ZURvdWJsZV9nZXRJc0luZmluaXRlRG91YmxlX2dldElzTmFOZmxvb3JjZWlsY2VpbFRvRG91YmxlRG91YmxlX3JvdW5kRG91YmxlX2Zsb29yRG91YmxlX2NlaWxEb3VibGVfdHJ1bmNhdGVub3QgYSBudW1iZXJEb3VibGVfdG9JbnREb3VibGVfdG9TdHJpbmcwLjBub3QgYW4gaW50ZWdlcl90b1N0cmluZ0FzRml4ZWREb3VibGVfdG9TdHJpbmdBc0ZpeGVkLUluZmluaXR5X3RvU3RyaW5nQXNFeHBvbmVudGlhbERvdWJsZV90b1N0cmluZ0FzRXhwb25lbnRpYWx0b1N0cmluZ0FzUHJlY2lzaW9ucHJlY2lzaW9uX3RvU3RyaW5nQXNQcmVjaXNpb25Eb3VibGVfdG9TdHJpbmdBc1ByZWNpc2lvbkVRVUFMR1JFQVRFUnRoaXNJc05lZ2F0aXZlb3RoZXJJc05lZ2F0aXZlTUFYX0VYQUNUX0lOVF9UT19ET1VCTEU5MDA3MTk5MjU0NzQwOTkyTUlOX0VYQUNUX0lOVF9UT19ET1VCTEVsaW1pdEludHNUbzY0Qml0c21heEludDY0UGx1czFBc0RvdWJsZV9Bc3NlcnRpb25FcnJvcl9mYWlsZWRBc3NlcnRpb25fdXJsX2xpbmVfY29sdW1uX3Rocm93TmV3YXNzZXJ0aW9uU3RhcnRhc3NlcnRpb25FbmRfZG9UaHJvd05ld0Fzc2VydGlvbkVycm9yX3Rocm93TmV3X2V2YWx1YXRlQXNzZXJ0aW9uX21lc3NhZ2VTdHJpbmdpcyBub3QgdHJ1ZS5jb2x1bW5JbmZvIHBvcyAnOiBGYWlsZWQgYXNzZXJ0aW9uOiBsaW5lIF9UeXBlRXJyb3JlcnJvck1zZ2lzIGFzc2lnbmFibGVUeXBlRXJyb3JfdGhyb3dOZXdzcmNfdmFsdWVkc3RfdHlwZWRzdF9uYW1lX0Nhc3RFcnJvcl9lcnJvck1zZ19JbnRlcm5hbEVycm9ySW50ZXJuYWxFcnJvcjogJ0Vycm9yOiBmaWVsZCAnJyBpcyBhbHJlYWR5IGluaXRpYWxpemVkLl9DbG9zdXJlX2luc3RhbnRpYXRvcl90eXBlX2FyZ3VtZW50c19mdW5jdGlvbl90eXBlX2FyZ3VtZW50c19kZWxheWVkX3R5cGVfYXJndW1lbnRzQ2xvc3VyZV9lcXVhbHNfY29tcHV0ZUhhc2hDbG9zdXJlX2Nsb25lQ2xvc3VyZV9jb21wdXRlSGFzaF9Hcm93YWJsZUxpc3R3aXRoQ2FwYWNpdHlHcm93YWJsZUxpc3RfYWxsb2NhdGVfY2FwYWNpdHlHcm93YWJsZUxpc3RfZ2V0Q2FwYWNpdHlHcm93YWJsZUxpc3RfZ2V0TGVuZ3RobmV3X2xlbmd0aG9sZF9jYXBhY2l0eW5ld19jYXBhY2l0eXNob3VsZFNocmlua1RvRml0X3Nocmlua0dyb3dhYmxlTGlzdF9zZXRMZW5ndGhfc2V0RGF0YUdyb3dhYmxlTGlzdF9zZXREYXRhR3Jvd2FibGVMaXN0X2dldEluZGV4ZWRHcm93YWJsZUxpc3Rfc2V0SW5kZXhlZF9uZXh0Q2FwYWNpdHlpc1ZNTGlzdGNhcGl0ZXJMZW5uZXdMZW5fYWxsb2NhdGVEYXRhbmV3RGF0YV9qb2luV2l0aFNlcGFyYXRvcmNvZGVVbml0Q291bnRmaXJzdE5vbk9uZUJ5dGVTdHJpbmdMaW1pdG5leHRFbGVtZW50Y29weUluZGV4b25lYnl0ZUNhbmFyeWVsZW1lbnRTdHJpbmdfSW1tdXRhYmxlTWFwX2t2UGFpcnNrZXlWYWx1ZVBhaXJzQ2Fubm90IHNldCB2YWx1ZSBpbiB1bm1vZGlmaWFibGUgTWFwQ2Fubm90IGNsZWFyIHVubW9kaWZpYWJsZSBNYXBDYW5ub3QgcmVtb3ZlIGZyb20gdW5tb2RpZmlhYmxlIE1hcF9JbW11dGFibGVNYXBLZXlJdGVyYWJsZV9JbW11dGFibGVNYXBWYWx1ZUl0ZXJhYmxlX0ltbXV0YWJsZU1hcEVudHJ5SXRlcmFibGVfSW1tdXRhYmxlTWFwS2V5SXRlcmF0b3JfbmV4dEluZGV4X0ltbXV0YWJsZU1hcFZhbHVlSXRlcmF0b3JfSW1tdXRhYmxlTWFwRW50cnlJdGVyYXRvcl9JbnRlZ2VySW1wbGVtZW50YXRpb24wMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpfYml0QW5kRnJvbUludGVnZXJfYml0T3JGcm9tSW50ZWdlcl9iaXRYb3JGcm9tSW50ZWdlcl9iaXRBbmRGcm9tU21pSW50ZWdlcl9iaXRBbmRGcm9tSW50ZWdlckludGVnZXJfYml0T3JGcm9tSW50ZWdlckludGVnZXJfYml0WG9yRnJvbUludGVnZXJfc2hyRnJvbUludGVnZXJJbnRlZ2VyX3NockZyb21JbnRlZ2VyX3NobEZyb21JbnRlZ2VySW50ZWdlcl9zaGxGcm9tSW50ZWdlckludGVnZXJfYWRkRnJvbUludGVnZXJJbnRlZ2VyX3N1YkZyb21JbnRlZ2VySW50ZWdlcl9tdWxGcm9tSW50ZWdlckludGVnZXJfdHJ1bmNEaXZGcm9tSW50ZWdlckludGVnZXJfbW9kdWxvRnJvbUludGVnZXJJbnRlZ2VyX2dyZWF0ZXJUaGFuRnJvbUludGVnZXJJbnRlZ2VyX2VxdWFsVG9JbnRlZ2VybWluSW50NjRBc0RvdWJsZV90b1BvdzJTdHJpbmdfbWluSW50NjRUb1JhZGl4U3RyaW5nX3NldEF0Yml0c1BlckRpZ2l0X1NtaV9kaWdpdFRhYmxlX3NtYWxsTG9va3VwVGFibGUtOTktOTgtOTctOTYtOTUtOTQtOTMtOTItOTEtOTAtODktODgtODctODYtODUtODQtODMtODItODEtODAtNzktNzgtNzctNzYtNzUtNzQtNzMtNzItNzEtNzAtNjktNjgtNjctNjYtNjUtNjQtNjMtNjItNjEtNjAtNTktNTgtNTctNTYtNTUtNTQtNTMtNTItNTEtNTAtNDktNDgtNDctNDYtNDUtNDQtNDMtNDItNDEtNDAtMzktMzgtMzctMzYtMzUtMzQtMzMtMzItMzEtMzAtMjktMjgtMjctMjYtMjUtMjQtMjMtMjItMjEtMjAtMTktMTgtMTctMTYtMTUtMTQtMTMtMTItMTEtMTAtOS04LTctNi01LTQtMzIzNDU2Nzg5MTAxMTEyMTMxNDE1MTYxNzE4MTkyMDIxMjIyMzI0MjUyNjI3MjgyOTMwMzEzMjMzMzQzNTM2MzczODM5NDA0MTQyNDM0NDQ1NDY0NzQ4NDk1MDUxNTI1MzU0NTU1NjU3NTg1OTYwNjE2MjYzNjQ2NTY2Njc2ODY5NzA3MTcyNzM3NDc1NzY3Nzc4Nzk4MDgxODI4Mzg0ODU4Njg3ODg4OTkwOTE5MjkzOTQ5NTk2OTc5ODk5X1BPV18xMF83X1BPV18xMF84X1BPV18xMF85X1NtaSBjYW4gb25seSBiZSBhbGxvY2F0ZWQgYnkgdGhlIFZNU21pX2JpdE5lZ2F0ZVNtaV9iaXRMZW5ndGhTbWlfYml0QW5kRnJvbVNtaV9wb3NpdGl2ZUJhc2UxMExlbmd0aHNtaURJR0lUX1pFUk90d29EaWdpdHNfbmVnYXRpdmVCYXNlMTBMZW5ndGhuZWdTbWlfbmVnYXRpdmVUb1N0cmluZ01JTlVTX1NJR05fTWludF9NaW50IGNhbiBvbmx5IGJlIGFsbG9jYXRlZCBieSB0aGUgVk1NaW50X2JpdE5lZ2F0ZU1pbnRfYml0TGVuZ3RoX01FVEhPRF9HRVRURVJfU0VUVEVSX0ZJRUxEX0xPQ0FMX1ZBUl9LSU5EX1NISUZUX0tJTkRfQklUU19LSU5EX01BU0tfRFlOQU1JQ19TVVBFUl9TVEFUSUNfQ09OU1RSVUNUT1JfVE9QX0xFVkVMX0xFVkVMX1NISUZUX0xFVkVMX0JJVFNfTEVWRUxfTUFTS19UWVBFX0FSR1NfTEVOX0NPVU5UX1BPU0lUSU9OQUxfQ09VTlRfRklSU1RfTkFNRURfRU5UUllfZnVuY3Rpb25OYW1lX2FyZ3VtZW50c0Rlc2NyaXB0b3JfaXNTdXBlckludm9jYXRpb25fZGVsYXllZFR5cGVBcmd1bWVudHNMZW5fbWVtYmVyTmFtZV9wb3NpdGlvbmFsQXJndW1lbnRzX25hbWVkQXJndW1lbnRzX3dpdGhvdXRUeXBlX3NldE1lbWJlck5hbWVBbmRUeXBlX3R5cGVBcmdzTGVudHlwZUFyZ3NMZW5fdW5wYWNrVHlwZUFyZ3VtZW50c0ludm9jYXRpb25NaXJyb3JfdW5wYWNrVHlwZUFyZ3VtZW50c251bVR5cGVBcmd1bWVudHNyZWNlaXZlckluZGV4bmFtZWRFbnRyeUluZGV4YXJnX25hbWVhcmdfdmFsdWVfYWxsb2NhdGVJbnZvY2F0aW9uTWlycm9yYXJndW1lbnRzRGVzY3JpcHRvcmlzU3VwZXJJbnZvY2F0aW9uX2FsbG9jYXRlSW52b2NhdGlvbk1pcnJvckZvckNsb3N1cmVkZWxheWVkVHlwZUFyZ3VtZW50c0xlbl9MaWJyYXJ5UHJlZml4X2xvYWRMaWJyYXJ5UHJlZml4X2xvYWRfbG9hZEVycm9yTGlicmFyeVByZWZpeF9sb2FkRXJyb3JMaWJyYXJ5UHJlZml4X2lzTG9hZGVkX2ludmFsaWRhdGVEZXBlbmRlbnRDb2RlTGlicmFyeVByZWZpeF9pbnZhbGlkYXRlRGVwZW5kZW50Q29kZWhhc0NvbXBsZXRlZF9SZWdFeHBIYXNoS2V5dGhhdF9SZWdFeHBIYXNoVmFsdWVfUmVnRXhwTWF0Y2hfcmVnZXhwX21hdGNoX01BVENIX1BBSVJncm91cElkeF9ncm91cENvdW50X3N1YnN0cmluZ1VuY2hlY2tlZGdyb3Vwc2dyb3Vwc1NwZWNncm91cHNMaXN0bmFtZWRHcm91cGlkeF9ncm91cE5hbWVJbmRleE5vdCBhIGNhcHR1cmUgZ3JvdXAgbmFtZTogZ3JvdXBOYW1lc19ncm91cE5hbWVzX1JlZ0V4cF93b3JkQ2hhcmFjdGVyTWFwUmVnRXhwX2ZhY3RvcnlfRXhlY3V0ZU1hdGNoYWxsTWF0Y2hlc21hdGNoQXNQcmVmaXhfRXhlY3V0ZU1hdGNoU3RpY2t5c3RyaW5nTWF0Y2hSZWdFeHBfZ2V0UGF0dGVyblJlZ0V4cF9nZXRJc011bHRpTGluZWlzQ2FzZVNlbnNpdGl2ZVJlZ0V4cF9nZXRJc0Nhc2VTZW5zaXRpdmVSZWdFeHBfZ2V0R3JvdXBDb3VudF9ncm91cE5hbWVMaXN0UmVnRXhwX2dldEdyb3VwTmFtZU1hcFJlZ0V4cF9FeGVjdXRlTWF0Y2hzdGFydF9pbmRleFJlZ0V4cF9FeGVjdXRlTWF0Y2hTdGlja3lfQWxsTWF0Y2hlc0l0ZXJhYmxlX3JlX3N0cl9BbGxNYXRjaGVzSXRlcmF0b3JfU3RyaW5nQmFzZV9sZW5ndGhCaXRzX21heExlbmd0aFZhbHVlX2xlbmd0aE1hc2tfc3RhcnRCaXRzX21heFN0YXJ0VmFsdWVfbWF4VW5zaWduZWRTbWlCaXRzX21heEpvaW5SZXBsYWNlT25lQnl0ZVN0cmluZ0xlbmd0aF9pc1doaXRlc3BhY2VfU3RyaW5nQmFzZSBjYW4ndCBiZSBpbnN0YW5pYXRlZFN0cmluZ19nZXRIYXNoQ29kZV9pc09uZUJ5dGVjcmVhdGVGcm9tQ2hhckNvZGVzY2NpZGNvZGVDb3VudF9zY2FuQ29kZVVuaXRzX2NyZWF0ZVN0cmluZ0Zyb21JdGVyYWJsZWNoYXJDb2RlTGlzdGlzT25lQnl0ZVN0cmluZ19jcmVhdGVPbmVCeXRlU3RyaW5nX2NyZWF0ZUZyb21Db2RlUG9pbnRzU3RyaW5nQmFzZV9jcmVhdGVGcm9tQ29kZVBvaW50c2NvZGVQb2ludHNTdHJpbmdfY2hhckF0U3RyaW5nX2dldExlbmd0aFN0cmluZ19jb25jYXR0aGlzTGVuZ3Rob3RoZXJMZW5ndGh0aGlzQ29kZVVuaXRvdGhlckNvZGVVbml0X3N1YnN0cmluZ01hdGNoZXNfc3Vic3RyaW5nVW5jaGVja2VkTmF0aXZlU3RyaW5nQmFzZV9zdWJzdHJpbmdVbmNoZWNrZWRfaXNPbmVCeXRlV2hpdGVzcGFjZV9pc1R3b0J5dGVXaGl0ZXNwYWNlX2ZpcnN0Tm9uV2hpdGVzcGFjZV9sYXN0Tm9uV2hpdGVzcGFjZXRyaW1MZWZ0dGltZXNwYWRSaWdodCBpcyBub3QgYSBQYXR0ZXJuIGlzIG5vdCBhIFN0cmluZyBpcyBub3QgYW4gaW50cmVwbGFjZW1lbnRJc09uZUJ5dGVyZXBsYWNlbWVudExlbmd0aHNsaWNlc19hZGRSZXBsYWNlU2xpY2Vfam9pblJlcGxhY2VBbGxPbmVCeXRlUmVzdWx0c2xpY2VMZW5ndGhfam9pblJlcGxhY2VBbGxSZXN1bHRTdHJpbmdCYXNlX2pvaW5SZXBsYWNlQWxsUmVzdWx0cmVwbGFjZW1lbnRTdHJpbmdzQXJlT25lQnl0ZXJlcGxhY2VGaXJzdE1hcHBlZF9tYXRjaFN0cmluZ19zdHJpbmdJZGVudGl0eV9zcGxpdE1hcEpvaW5FbXB0eVN0cmluZ3N0cmluZ1BhdHRlcm5faW50ZXJwb2xhdGVTaW5nbGVfaW50ZXJwb2xhdGVwcmV2aW91c0luZGV4U3RyaW5nX3RvVXBwZXJDYXNlU3RyaW5nX3RvTG93ZXJDYXNlX2NvbmNhdFJhbmdlX2NvbmNhdFJhbmdlTmF0aXZlU3RyaW5nX2NvbmNhdFJhbmdlX09uZUJ5dGVTdHJpbmdfTENfVEFCTEUAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6W1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f8KAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoMKhwqLCo8KkwqXCpsKnwqjCqcKqwqvCrMKtwq7Cr8KwwrHCssKzwrTCtcK2wrfCuMK5wrrCu8K8wr3CvsK/w6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtsOXw7jDucO6w7vDvMO9w77Dn8Oww7HDssOzw7TDtcO2w7fDuMO5w7rDu8O8w73DvsO/X1VDX1RBQkxFQEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVp7fH1+f8KwwrHCssKzwrQAwrbCt8K4wrnCusK7wrzCvcK+wr/DgMOBw4LDg8OEw4XDhsOHw4jDicOKw4vDjMONw47Dj8OQw5HDksOTw5TDlcOWw5fDmMOZw5rDm8Ocw53DngDDkMORw5LDk8OUw5XDlsO3w5jDmcOaw5vDnMOdw54AX09uZUJ5dGVTdHJpbmcgY2FuIG9ubHkgYmUgYWxsb2NhdGVkIGJ5IHRoZSBWTVN0cmluZ19jb2RlVW5pdEF0T25lQnl0ZVN0cmluZ19zdWJzdHJpbmdVbmNoZWNrZWRfc3BsaXRXaXRoQ2hhckNvZGVPbmVCeXRlU3RyaW5nX3NwbGl0V2l0aENoYXJDb2RlcGF0dGVybkFzU3RyaW5nX2NvbmNhdEFsbHN0cmluZ3NMZW5ndGhySXhlTGVuZ3RocENpZHBhdHRlcm5DdTBwYWRDaWRwYWRMZW5ndGhyZXN1bHRMZW5ndGhwYWRDaGFyX2FsbG9jYXRlT25lQnl0ZVN0cmluZ19hbGxvY2F0ZV9hbGxvY2F0ZUZyb21PbmVCeXRlTGlzdE9uZUJ5dGVTdHJpbmdfYWxsb2NhdGVGcm9tT25lQnl0ZUxpc3RPbmVCeXRlU3RyaW5nX3NldEF0b25lQnl0ZVN0cmluZ19Ud29CeXRlU3RyaW5nX1R3b0J5dGVTdHJpbmcgY2FuIG9ubHkgYmUgYWxsb2NhdGVkIGJ5IHRoZSBWTV9hbGxvY2F0ZUZyb21Ud29CeXRlTGlzdFR3b0J5dGVTdHJpbmdfYWxsb2NhdGVGcm9tVHdvQnl0ZUxpc3RfRXh0ZXJuYWxPbmVCeXRlU3RyaW5nX0V4dGVybmFsT25lQnl0ZVN0cmluZyBjYW4gb25seSBiZSBhbGxvY2F0ZWQgYnkgdGhlIFZNX0V4dGVybmFsVHdvQnl0ZVN0cmluZ19FeHRlcm5hbFR3b0J5dGVTdHJpbmcgY2FuIG9ubHkgYmUgYWxsb2NhdGVkIGJ5IHRoZSBWTV9TdHJpbmdNYXRjaF9TdHJpbmdBbGxNYXRjaGVzSXRlcmFibGVfaW5wdXRfcGF0dGVybl9TdHJpbmdBbGxNYXRjaGVzSXRlcmF0b3JfQWJzdHJhY3RUeXBlQWJzdHJhY3RUeXBlX3RvU3RyaW5nX1R5cGVUeXBlX2dldEhhc2hDb2RlX1R5cGVSZWZfVHlwZVBhcmFtZXRlcl9XZWFrUHJvcGVydHlfbmV3V2Vha1Byb3BlcnR5X25ld1dlYWtQcm9wZXJ0eV9nZXRLZXlXZWFrUHJvcGVydHlfZ2V0VmFsdWVXZWFrUHJvcGVydHlfc2V0VmFsdWVEZXByZWNhdGVkZXhwaXJlc1VzZSBgbWVzc2FnZWAgaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIERhcnQgMy4wLjBEZXByZWNhdGVkIGZlYXR1cmU6IF9PdmVycmlkZVByb3Zpc2lvbmFsX1Byb3h5QmlnSW50dHJ5UGFyc2VCb29sX2Zyb21FbnZpcm9ubWVudERhdGVUaW1lX01JQ1JPU0VDT05EX0lOREVYX01JTExJU0VDT05EX0lOREVYX1NFQ09ORF9JTkRFWF9NSU5VVEVfSU5ERVhfSE9VUl9JTkRFWF9EQVlfSU5ERVhfV0VFS0RBWV9JTkRFWF9NT05USF9JTkRFWF9ZRUFSX0lOREVYX19wYXJ0c19EQVlTX1VOVElMX01PTlRIbW9uZGF5dHVlc2RheXdlZG5lc2RheXRodXJzZGF5ZnJpZGF5c2F0dXJkYXlzdW5kYXlkYXlzUGVyV2Vla2phbnVhcnlmZWJydWFyeW1hcmNoYXByaWxqdW5lanVseWF1Z3VzdHNlcHRlbWJlcm9jdG9iZXJub3ZlbWJlcmRlY2VtYmVybW9udGhzUGVyWWVhcl9tYXhNaWxsaXNlY29uZHNTaW5jZUVwb2NoODY0MDAwMDAwMDAwMDAwMF9wYXJzZUZvcm1hdF4oWystXT9cZHs0LDZ9KS0/KFxkXGQpLT8oXGRcZCkoPzpbIFRdKFxkXGQpKD86Oj8oXGRcZCkoPzo6PyhcZFxkKSg/OlsuLF0oXGR7MSw2fSkpPyk/KT8oID9belpdfCA/KFstK10pKFxkXGQpKD86Oj8oXGRcZCkpPyk/KT8keWVhcm1vbnRoZGF5aG91cm1pbnV0ZW1pbGxpc2Vjb25kbWljcm9zZWNvbmR1dGNmcm9tTWlsbGlzZWNvbmRzU2luY2VFcG9jaGZyb21NaWNyb3NlY29uZHNTaW5jZUVwb2NobWljcm9zZWNvbmRzU2luY2VFcG9jaF93aXRoVmFsdWVEYXRlVGltZSBpcyBvdXRzaWRlIHZhbGlkIHJhbmdlOiAnaXNVdGMnIGZsYWcgbWF5IG5vdCBiZSAnbnVsbCdfbm93X2dldEN1cnJlbnRNaWNyb3NEYXRlVGltZV9jdXJyZW50VGltZU1pY3Jvc190aW1lWm9uZU5hbWVGb3JDbGFtcGVkU2Vjb25kc0RhdGVUaW1lX3RpbWVab25lTmFtZXNlY29uZHNTaW5jZUVwb2NoX3RpbWVab25lT2Zmc2V0SW5TZWNvbmRzRm9yQ2xhbXBlZFNlY29uZHNEYXRlVGltZV90aW1lWm9uZU9mZnNldEluU2Vjb25kc19sb2NhbFRpbWVab25lQWRqdXN0bWVudEluU2Vjb25kc0RhdGVUaW1lX2xvY2FsVGltZVpvbmVBZGp1c3RtZW50SW5TZWNvbmRzX2NvbXB1dGVVcHBlclBhcnRsb2NhbE1pY3Jvc0RBWVNfSU5fNF9ZRUFSU0RBWVNfSU5fMTAwX1lFQVJTREFZU19JTl80MDBfWUVBUlNEQVlTXzE5NzBfVE9fMjAwMERBWVNfT0ZGU0VUWUVBUlNfT0ZGU0VUcmVzdWx0WWVhcnJlc3VsdE1vbnRocmVzdWx0RGF5ZGF5c1NpbmNlMTk3MGRheXN5ZDF5ZDJ5ZDNpc0xlYXBkYXlzVW50aWxNb250aHJlc3VsdE1pY3Jvc2Vjb25kcmVzdWx0TWlsbGlzZWNvbmRyZXN1bHRTZWNvbmRyZXN1bHRNaW51dGVyZXN1bHRIb3VycmVzdWx0V2Vla2RheV9sb2NhbERhdGVJblV0Y01pY3Jvc21pY3Jvc19mbG9vcmVkRGl2aXNpb25fZGF5RnJvbVllYXJfaXNMZWFwWWVhcl93ZWVrRGF5X2VxdWl2YWxlbnRZZWFycmVjZW50WWVhcl95ZWFyc0Zyb21TZWNvbmRzU2luY2VFcG9jaERBWVNfWUVBUl8yMDk4X2VxdWl2YWxlbnRTZWNvbmRzQ1VUX09GRl9TRUNPTkRTZXF1aXZhbGVudFllYXJlcXVpdmFsZW50RGF5c2RpZmZEYXlzX3RpbWVab25lT2Zmc2V0SW5TZWNvbmRzZXF1aXZhbGVudFNlY29uZHNfdGltZVpvbmVOYW1lZm9ybWF0dGVkU3RyaW5ncGFyc2VJbnRPclplcm9tYXRjaGVkcGFyc2VNaWxsaUFuZE1pY3Jvc2Vjb25kc3llYXJzYWRkT25lTWlsbGlzZWNvbmRtaWxsaUFuZE1pY3Jvc2Vjb25kc2hvdXJEaWZmZXJlbmNlbWludXRlRGlmZmVyZW5jZVRpbWUgb3V0IG9mIHJhbmdlSW52YWxpZCBkYXRlIGZvcm1hdGlzQmVmb3JlaXNBZnRlcmlzQXRTYW1lTW9tZW50QXN0b0xvY2FsdG9VdGNfZm91ckRpZ2l0c2Fic04wMDBfc2l4RGlnaXRzX3RocmVlRGlnaXRzX3R3b0RpZ2l0c3NlY19icm9rZW5Eb3duRGF0ZVRvVmFsdWVyZWFsTW9udGhhZGp1c3RtZW50em9uZU9mZnNldHRpbWVab25lTmFtZVVUQ3RpbWVab25lT2Zmc2V0b2Zmc2V0SW5TZWNvbmRzd2Vla2RheW5hbmluZmluaXR5bmVnYXRpdmVJbmZpbml0eW1pblBvc2l0aXZlbWF4RmluaXRlX25hdGl2ZVBhcnNlX3RyeVBhcnNlRG91YmxlX1pFUk9fTUlOVVNfTl9JX2VkaWdpdHNTZWVuZXhwb25lbnREZWx0YWZpcnN0Q2hhcm5maW5pdHlNQVhfRVhBQ1RfRE9VQkxFZXhwUGFydFAxMG5lZ0V4cG9uZW50SW52YWxpZCBkb3VibGVEdXJhdGlvbm1pY3Jvc2Vjb25kc1Blck1pbGxpc2Vjb25kbWlsbGlzZWNvbmRzUGVyU2Vjb25kc2Vjb25kc1Blck1pbnV0ZW1pbnV0ZXNQZXJIb3VyaG91cnNQZXJEYXltaWNyb3NlY29uZHNQZXJTZWNvbmRtaWNyb3NlY29uZHNQZXJNaW51dGVtaWNyb3NlY29uZHNQZXJIb3VybWljcm9zZWNvbmRzUGVyRGF5bWlsbGlzZWNvbmRzUGVyTWludXRlbWlsbGlzZWNvbmRzUGVySG91cm1pbGxpc2Vjb25kc1BlckRheXNlY29uZHNQZXJIb3Vyc2Vjb25kc1BlckRheW1pbnV0ZXNQZXJEYXlfZHVyYXRpb25fbWljcm9zZWNvbmRzcXVvdGllbnRpbkRheXNpbkhvdXJzaW5NaW51dGVzaW5TZWNvbmRzc2l4RGlnaXRzMDAwMDB0d29EaWdpdE1pbnV0ZXN0d29EaWdpdFNlY29uZHNzaXhEaWdpdFVzX3N0cmluZ1RvU2FmZVN0cmluZ19vYmplY3RUb1N0cmluZ0Fzc2VydGlvbkVycm9yQXNzZXJ0aW9uIGZhaWxlZENhc3RFcnJvck51bGxUaHJvd25FcnJvclRocm93IG9mIG51bGwuQXJndW1lbnRFcnJvcl9oYXNWYWx1ZWludmFsaWRWYWx1ZU11c3Qgbm90IGJlIG51bGxjaGVja05vdE51bGxfZXJyb3JOYW1lSW52YWxpZCBhcmd1bWVudChzKV9lcnJvckV4cGxhbmF0aW9uZXhwbGFuYXRpb25lcnJvclZhbHVlVmFsdWUgbm90IGluIHJhbmdlSW52YWxpZCB2YWx1ZWluZGV4YWJsZWNoZWNrVmFsdWVJbkludGVydmFsY2hlY2tWYWxpZEluZGV4Y2hlY2tWYWxpZFJhbmdlc3RhcnROYW1lZW5kTmFtZWNoZWNrTm90TmVnYXRpdmU6IE5vdCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gOiBOb3QgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDogTm90IGluIHJhbmdlICwgaW5jbHVzaXZlOiBWYWxpZCB2YWx1ZSByYW5nZSBpcyBlbXB0eTogT25seSB2YWxpZCB2YWx1ZSBpcyBJbmRleEVycm9ySW5kZXggb3V0IG9mIHJhbmdlOiBpbmRleCBtdXN0IG5vdCBiZSBuZWdhdGl2ZTogbm8gaW5kaWNlcyBhcmUgdmFsaWQ6IGluZGV4IHNob3VsZCBiZSBsZXNzIHRoYW4gRmFsbFRocm91Z2hFcnJvcl90aHJvd05ld2Nhc2VfY2xhdXNlX3Bvcyc6IFN3aXRjaCBjYXNlIGZhbGwtdGhyb3VnaCBhdCBsaW5lIF9jbGFzc05hbWVBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yX3Rocm93TmV3Q2Fubm90IGluc3RhbnRpYXRlIGFic3RyYWN0IGNsYXNzIF91cmwgJycgbGluZSBfZXhpc3RpbmdBcmd1bWVudE5hbWVzX2ludm9jYXRpb25faW52b2NhdGlvbl90eXBlaW52b2NhdGlvbl90eXBlVXNlIE5vU3VjaE1ldGhvZC53aXRoSW52b2NhdGlvbiBpbnN0ZWFkZXhpc3RpbmdBcmd1bWVudE5hbWVzX3Rocm93TmV3SW52b2NhdGlvbl90aHJvd05ld0lmTm90TG9hZGVkX05hbWVkQXJndW1lbnRzTWFwX2V4aXN0aW5nTWV0aG9kU2lnbmF0dXJlTm9TdWNoTWV0aG9kRXJyb3JfZXhpc3RpbmdNZXRob2RTaWduYXR1cmVpbnZvY2F0aW9uVHlwZV90b1N0cmluZ0RlcHJlY2F0ZWROb1N1Y2hNZXRob2RFcnJvcjogQ2Fubm90IGFzc2lnbiB0byBmaW5hbCB2YXJpYWJsZSAnYXJnc19taXNtYXRjaGFyZ3NfbWVzc2FnZSB3aXRoIG1hdGNoaW5nIGFyZ3VtZW50c3R5cGVfc3RyZ2V0dGVyIG9yIHNldHRlcm1zZ19idWZOb1N1Y2hNZXRob2RFcnJvcjogaXNfdHlwZV9jYWxsVGhlIG51bGwgb2JqZWN0IGRvZXMgbm90IGhhdmUgYSBUaGUgJyB3YXMgY2FsbGVkIG9uIG51bGwuQ2xvc3VyZSBjYWxsIHdpdGggbWlzbWF0Y2hlZCBhcmd1bWVudHM6IGZ1bmN0aW9uICdBdHRlbXB0ZWQgdG8gdXNlIHR5cGUgJycgYXMgYSBmdW5jdGlvbi4gU2luY2UgdHlwZXMgZG8gbm90IGRlZmluZSBhIG1ldGhvZCAnY2FsbCcsIHRoaXMgaXMgbm90IHBvc3NpYmxlLiBEaWQgeW91IGludGVuZCB0byBjYWxsIHRoZSAgY29uc3RydWN0b3IgYW5kIGZvcmdldCB0aGUgJ25ldycgb3BlcmF0b3I/JyBoYXMgbm8gaW5zdGFuY2UgU3VwZXIgY2xhc3Mgb2YgY2xhc3MgJycgaGFzIG5vIGluc3RhbmNlIHN1cGVyLk5vIHN0YXRpYyBkZWNsYXJlZCBpbiBjbGFzcyAnTm8gY29uc3RydWN0b3IgJyBkZWNsYXJlZCBpbiBjbGFzcyAnTm8gdG9wLWxldmVsIGRlY2xhcmVkLlJlY2VpdmVyOiB0b3AtbGV2ZWxSZWNlaXZlcjogVHJpZWQgY2FsbGluZzogZm9ybWFsUGFyYW1ldGVycwpGb3VuZDogdHlwZUFyZ3VtZW50c0J1ZmFyZ3VtZW50c0J1ZmV4aXN0aW5nU2lnYXJnc01zZ2tpbmRCdWZtc2dCdWZVbnN1cHBvcnRlZEVycm9yVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiBVbmltcGxlbWVudGVkRXJyb3JVbmltcGxlbWVudGVkRXJyb3I6IFN0YXRlRXJyb3JCYWQgc3RhdGU6IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcm1vZGlmaWVkT2JqZWN0Q29uY3VycmVudCBtb2RpZmljYXRpb24gZHVyaW5nIGl0ZXJhdGlvbi5Db25jdXJyZW50IG1vZGlmaWNhdGlvbiBkdXJpbmcgaXRlcmF0aW9uOiBPdXRPZk1lbW9yeUVycm9yT3V0IG9mIE1lbW9yeVN0YWNrT3ZlcmZsb3dFcnJvclN0YWNrIE92ZXJmbG93Q3ljbGljSW5pdGlhbGl6YXRpb25FcnJvclJlYWRpbmcgc3RhdGljIHZhcmlhYmxlIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb25SZWFkaW5nIHN0YXRpYyB2YXJpYWJsZSAnJyBkdXJpbmcgaXRzIGluaXRpYWxpemF0aW9uX0V4Y2VwdGlvbkV4Y2VwdGlvbjogRm9ybWF0RXhjZXB0aW9ub2JqZWN0U291cmNlbGluZU51bXByZXZpb3VzQ2hhcldhc0NSIChhdCBsaW5lICwgY2hhcmFjdGVyICkKIChhdCBjaGFyYWN0ZXIgc2xpY2VtYXJrT2Zmc2V0IChhdCBvZmZzZXQgSW50ZWdlckRpdmlzaW9uQnlaZXJvRXhjZXB0aW9uRXhwYW5kb19taW5TaXplX2RlbGV0ZWRFbnRyeW9sZF9kYXRhbmV3X3NpemVFeHBhbmRvcyBhcmUgbm90IGFsbG93ZWQgb24gc3RyaW5ncywgbnVtYmVycywgYm9vbGVhbnMgb3IgbnVsbF9saW1pdEV4cGFuZG86d3BlbXB0eV9pZHhfYXBwbHlGdW5jdGlvbl9hcHBseV9QQVJTRV9MSU1JVFMxMDczNzQxODI0NDYxMTY4NjAxODQyNzM4NzkwNDQwNTI1NTUxNTMwMTg5NzYyNjcxMTUyOTIxNTA0NjA2ODQ2OTc2MTQ5MDExNjExOTM4NDc2NTYyNTc4OTczMDIyMzA1MzYwMjgxNjM5MDk4MjEwNDg1ODI5ODgwNDkxMzUwODUxNzE3NjcyOTkyMDg5MTAwMDAwMDAwMDAwMDAwMDAwMDUwNTQ0NzAyODQ5OTI5Mzc3MTIyMTg2MTExMDY3NDA0MzY5OTI2NjU0MTY2MDkxODMxNzk4NDEyMTc3OTUzMzM3ODA5MzcxMTM2NDM3ODkzODkwMzgwODU5Mzc1Mjg2MjQyMzA1MTUwOTgxNTc5MzM3NDgxMzM2NzU4MjA4MTAyNDc5OTAwNjY4NTc4Mjg4NDEyMTE2Mzg0MDAwMDAwMDAwMDAwMDAzMjQzOTE5OTMyNTIxNTA4NjgxMjgyODEwMDU3ODgzMDgyNzUyNTA0MDM2MzYxOTM2NDY3MzgzODc2NDg4MzM4NDY1MzU3ODI0MjQ4MTE1Mjg3MzIwMzczNjU3NjIzMjIxODI2NTA4OTIxMjQxNjM1MzgxNDc4MzIwNTQ2OTA0MTUzMTQ0MTAwMDAwMDAwMDAwMDc4NzY2Mjc4Mzc4ODU0OTc2MTE2Njc4ODk1MTQ5NTI5ODQ5NjEyMzg2NDIwNjgzNjkzMTAxMDU2MzM3OTIyMDUwODA1NjY0MDYyNTEzMTYyMTcwMzg0MjI2NzEzNl9tYXhJbnQ2NF9taW5JbnQ2NF9pbnQ2NFVuc2lnbmVkT3ZlcmZsb3dMaW1pdHM2ODcxOTQ3NjczNV9pbnQ2NFVuc2lnbmVkU21pT3ZlcmZsb3dMaW1pdHMxMTUyOTIxNTA0NjA2ODQ2OTc1X2ludDY0T3ZlcmZsb3dMaW1pdHNfdHJ5UGFyc2VTbWlpeHNtaUxpbWl0X2tOdWxsX3Rocm93Rm9ybWF0RXhjZXB0aW9uSW52YWxpZCBudW1iZXJJbnZhbGlkIHJhZGl4LSBudW1iZXJhbGxvd1U2NHRhYmxlSW5kZXhzbWFsbEJsb2NrU2l6ZWJsb2NrRW5kbXVsdGlwbGllcnBvc2l0aXZlT3ZlcmZsb3dMaW1pdG5lZ2F0aXZlT3ZlcmZsb3dMaW1pdFBvc2l0aXZlIGlucHV0IGV4Y2VlZHMgdGhlIGxpbWl0IG9mIGludGVnZXJOZWdhdGl2ZSBpbnB1dCBleGNlZWRzIHRoZSBsaW1pdCBvZiBpbnRlZ2VyX3BhcnNlQmxvY2tfaW5pdEludDY0T3ZlcmZsb3dMaW1pdHNJbnRlZ2VyX2Zyb21FbnZpcm9ubWVudFRoZSBzb3VyY2UgbXVzdCBub3QgYmUgbnVsbFJhZGl4ICBub3QgaW4gcmFuZ2UgMi4uMzZnZW5lcmljTWV0aG9kX0ludm9jYXRpb25fcG9zaXRpb25hbF9uYW1lZF9lbnN1cmVOb25OdWxsVHlwZXNUeXBlIGFyZ3VtZW50cyBtdXN0IGJlIG5vbi1udWxsLCB3YXMgbnVsbCBhdCBpbmRleCBfbWFrZVVubW9kaWZpYWJsZV9HZW5lcmF0b3JJdGVyYWJsZUJpZGlyZWN0aW9uYWxJdGVyYXRvcm1vdmVQcmV2aW91c19mcm9tTGl0ZXJhbExpc3RfbmV3Y29weVJhbmdlTm90IGJpZyBlbm91Z2ggdG8gaG9sZCAgZWxlbWVudHMgYXQgcG9zaXRpb24gd3JpdGVJdGVyYWJsZXRhcmdldExlbmd0aE1hcEVudHJ5KF9IQVNIX0NPREVjbGFzcyBOdWxsIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWRfcmV0dXJuSW50TnVsbF9yZXR1cm5Eb3VibGVOdWxsX2hhc2hDb2RlUm5kX29iamVjdEhhc2hDb2RlT2JqZWN0X3RvU3RyaW5nX2hhdmVTYW1lUnVudGltZVR5cGVPYmplY3RfaGF2ZVNhbWVSdW50aW1lVHlwZV9pbnN0YW5jZU9mT2JqZWN0X2luc3RhbmNlT2ZpbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzX3NpbXBsZUluc3RhbmNlT2ZPYmplY3Rfc2ltcGxlSW5zdGFuY2VPZl9zaW1wbGVJbnN0YW5jZU9mVHJ1ZV9zaW1wbGVJbnN0YW5jZU9mRmFsc2VPYmplY3RfZXF1YWxzZGFydDpjb3JlI19UeXBlT2JqZWN0X3J1bnRpbWVUeXBlTWF0Y2hncm91cEluZGljZXNfTUFYX0NBQ0hFX1NJWkVfcmVjZW50bHlVc2VkX2ZpbmRFc2NhcGVDaGFyAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAAAAAAEBAAEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEAAAAAAQEBAQEBAQEBAQEBAAAAAQFlc2NhcGVDaGFySW5kZXhwcmV2aW91c1NsaWNlRW5kSW5kZXhSZWdFeHBNYXRjaFNpbmtzdGFja1RyYWNlU3RyaW5nU3RhY2tUcmFjZV9jdXJyZW50X1N0cmluZ1N0YWNrVHJhY2VTdG9wd2F0Y2hfZnJlcXVlbmN5X2NvbXB1dGVGcmVxdWVuY3lTdG9wd2F0Y2hfZnJlcXVlbmN5ZWxhcHNlZFRpY2tzdGlja3N0aWNrc1BlclNlY29uZHJlbWFpbmluZ1RpY2tzX2luaXRUaWNrZXJTdG9wd2F0Y2hfbm93ZnJvbUNoYXJDb2Rlc2Zyb21DaGFyQ29kZVN0cmluZ19mcm9tRW52aXJvbm1lbnRSdW5lc05vIGVsZW1lbnRzLnByZXZpb3VzQ29kZVJ1bmVJdGVyYXRvcl9uZXh0UG9zaXRpb25fY3VycmVudENvZGVQb2ludF9jaGVja1NwbGl0U3Vycm9nYXRlSW5kZXggaW5zaWRlIHN1cnJvZ2F0ZSBwYWlyOiByYXdJbmRleGN1cnJlbnRTaXplY3VycmVudEFzU3RyaW5ncHJldkNvZGVVbml0U3RyaW5nQnVmZmVyX0JVRkZFUl9TSVpFX1BBUlRTX1RPX0NPTVBBQ1RfUEFSVFNfVE9fQ09NUEFDVF9TSVpFX0xJTUlUX3BhcnRzQ29kZVVuaXRzX3BhcnRzQ29tcGFjdGlvbkluZGV4X3BhcnRzQ29kZVVuaXRzU2luY2VDb21wYWN0aW9uX2J1ZmZlclBvc2l0aW9uX2J1ZmZlckNvZGVVbml0TWFnbml0dWRlX2NvbnN1bWVCdWZmZXJfYWRkUGFydHBhcnRzU2luY2VDb21wYWN0aW9uX2NvbXBhY3Rjb21wYWN0ZWRTdHJpbmdCdWZmZXJfY3JlYXRlU3RyaW5nRnJvbVVpbnQxNkFycmF5U3RyaW5nU2lua1VyaWF1dGhvcml0eXVuZW5jb2RlZFBhdGhkYXRhRnJvbVN0cmluZ2RhdGFGcm9tQnl0ZXNhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1wZXJjZW50RW5jb2RlZHF1ZXJ5UGFyYW1ldGVyc0FsbGhhc1BvcnRoYXNBYnNvbHV0ZVBhdGhyZW1vdmVGcmFnbWVudGRhdGFEZWx0YXNjaGVtZUVuZGhvc3RTdGFydHBvcnRTdGFydHBhdGhTdGFydHF1ZXJ5U3RhcnRmcmFnbWVudFN0YXJ0aXNTaW1wbGUvLi5zY2hlbWVBdXRoZmlsZTovL2ZpbGU6Ly8vNDQzZW5jb2RlQ29tcG9uZW50ZW5jb2RlUXVlcnlDb21wb25lbnRkZWNvZGVDb21wb25lbnRlbmNvZGVkQ29tcG9uZW50ZGVjb2RlUXVlcnlDb21wb25lbnRlbmNvZGVGdWxsZGVjb2RlRnVsbHNwbGl0UXVlcnlTdHJpbmdwYXJzZUlQdjRBZGRyZXNzX3BhcnNlSVB2NEFkZHJlc3NJbGxlZ2FsIElQdjQgYWRkcmVzcywgcGFydEluZGV4cGFydFN0YXJ0aW52YWxpZCBjaGFyYWN0ZXJJUHY0IGFkZHJlc3Mgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSA0IHBhcnRzZWFjaCBwYXJ0IG11c3QgYmUgaW4gdGhlIHJhbmdlIDAuLjI1NXBhcnNlSVB2NkFkZHJlc3NJbGxlZ2FsIElQdjYgYWRkcmVzcywgcGFyc2VIZXhhbiBJUHY2IHBhcnQgY2FuIG9ubHkgY29udGFpbiBhIG1heGltdW0gb2YgNCBoZXggZGlnaXRzZWFjaCBwYXJ0IG11c3QgYmUgaW4gdGhlIHJhbmdlIG9mIGAweDAuLjB4RkZGRmBhZGRyZXNzIGlzIHRvbyBzaG9ydHdpbGRjYXJkU2VlbnNlZW5Eb3RpbnZhbGlkIHN0YXJ0IGNvbG9uLm9ubHkgb25lIHdpbGRjYXJkIGA6OmAgaXMgYWxsb3dlZHRvbyBmZXcgcGFydHNhdEVuZGlzTGFzdFdpbGRjYXJkZXhwZWN0ZWQgYSBwYXJ0IGFmdGVyIGxhc3QgYDpgYW4gYWRkcmVzcyB3aXRoIGEgd2lsZGNhcmQgbXVzdCBoYXZlIGxlc3MgdGhhbiA3IHBhcnRzYW4gYWRkcmVzcyB3aXRob3V0IGEgd2lsZGNhcmQgbXVzdCBjb250YWluIGV4YWN0bHkgOCBwYXJ0c3dpbGRDYXJkTGVuZ3RoX1VyaV9pc1dpbmRvd3NDYWNoZWRfdXNlckluZm9fcXVlcnlfZnJhZ21lbnRfcGF0aFNlZ21lbnRzX2hhc2hDb2RlQ2FjaGVfcXVlcnlQYXJhbWV0ZXJzX3F1ZXJ5UGFyYW1ldGVyTGlzdHNfdW5yZXNlcnZlZFRhYmxlX3VucmVzZXJ2ZWQyMzk2VGFibGVfZW5jb2RlRnVsbFRhYmxlX3NjaGVtZVRhYmxlX3NjaGVtZUxvd2VyVGFibGVfc3ViRGVsaW1pdGVyc1RhYmxlX2dlbkRlbGltaXRlcnNUYWJsZV91c2VyaW5mb1RhYmxlX3JlZ05hbWVUYWJsZV9wYXRoQ2hhclRhYmxlX3BhdGhDaGFyT3JTbGFzaFRhYmxlX3F1ZXJ5Q2hhclRhYmxlX2lzV2luZG93c1BsYXRmb3JtVXJpX2lzV2luZG93c1BsYXRmb3Jtbm90U2ltcGxlSW52YWxpZCBlbXB0eSBzY2hlbWV1c2VySW5mb1N0YXJ0SW52YWxpZCBwb3J0YWxsb3dTY2hlbWVfd3JpdGVBdXRob3JpdHlfZGVmYXVsdFBvcnR0aGlzU2NoZW1lX2NvbXBhcmVTY2hlbWVzY2hlbWVDaGFydXJpQ2hhcmxvd2VyQ2hhcl9tYWtlSHR0cFVyaWhhc1VzZXJJbmZvYXRTaWduaG9zdEVuZEludmFsaWQgSVB2NiBob3N0IGVudHJ5LkludmFsaWQgZW5kIG9mIGF1dGhvcml0eXBvcnRTdHJpbmdfY2hlY2tOb25XaW5kb3dzUGF0aFJlc2VydmVkQ2hhcmFjdGVyc3NlZ21lbnRzYXJndW1lbnRFcnJvcklsbGVnYWwgcGF0aCBjaGFyYWN0ZXIgX2NoZWNrV2luZG93c1BhdGhSZXNlcnZlZENoYXJhY3RlcnNmaXJzdFNlZ21lbnRbIiovOjw+P1xcfF1JbGxlZ2FsIGNoYXJhY3RlciBpbiBwYXRoSWxsZWdhbCBjaGFyYWN0ZXIgaW4gcGF0aDogX2NoZWNrV2luZG93c0RyaXZlTGV0dGVySWxsZWdhbCBkcml2ZSBsZXR0ZXIgX21ha2VGaWxlVXJpc2xhc2hUZXJtaW5hdGVkX21ha2VXaW5kb3dzRmlsZVVybFxcP1xVTkNcV2luZG93cyBwYXRocyB3aXRoIFxcP1wgcHJlZml4IG11c3QgYmUgYWJzb2x1dGVXaW5kb3dzIHBhdGhzIHdpdGggZHJpdmUgbGV0dGVyIG11c3QgYmUgYWJzb2x1dGVob3N0UGFydHBhdGhQYXJ0c2NoZW1lQ2hhbmdlZHBhdGhUb1NwbGl0cXVlcnlQYXJhbWV0ZXJMaXN0c19tYWtlUG9ydF9tYWtlSG9zdHN0cmljdElQdjZNaXNzaW5nIGVuZCBgXWAgdG8gbWF0Y2ggYFtgIGluIGhvc3RfaXNSZWdOYW1lQ2hhcl9ub3JtYWxpemVSZWdOYW1lc2VjdGlvblN0YXJ0aXNOb3JtYWxpemVkJTI1X21ha2VTY2hlbWVmaXJzdENvZGVVbml0U2NoZW1lIG5vdCBzdGFydGluZyB3aXRoIGFscGhhYmV0aWMgY2hhcmFjdGVyY29udGFpbnNVcHBlckNhc2VJbGxlZ2FsIHNjaGVtZSBjaGFyYWN0ZXJfY2Fub25pY2FsaXplU2NoZW1lX21ha2VVc2VySW5mb19tYWtlUGF0aGVuc3VyZUxlYWRpbmdTbGFzaEJvdGggcGF0aCBhbmQgcGF0aFNlZ21lbnRzIHNwZWNpZmllZGVzY2FwZURlbGltaXRlcnNfbm9ybWFsaXplUGF0aF9tYWtlUXVlcnlCb3RoIHF1ZXJ5IGFuZCBxdWVyeVBhcmFtZXRlcnMgc3BlY2lmaWVkd3JpdGVQYXJhbWV0ZXJfbWFrZUZyYWdtZW50X25vcm1hbGl6ZUVzY2FwZWxvd2VyQ2FzZWZpcnN0RGlnaXRWYWx1ZXNlY29uZERpZ2l0VmFsdWVfZXNjYXBlQ2hhcmVuY29kZWRCeXRlc19ub3JtYWxpemVPclN1YnN0cmluZ2NoYXJUYWJsZV9pc1NjaGVtZUNoYXJhY3Rlcl9pc0dlbmVyYWxEZWxpbWl0ZXJfbWVyZ2VQYXRoc2JhY2tDb3VudHJlZlN0YXJ0YmFzZUVuZF9tYXlDb250YWluRG90U2VnbWVudHMvLl9yZW1vdmVEb3RTZWdtZW50c19ub3JtYWxpemVSZWxhdGl2ZVBhdGhfZXNjYXBlU2NoZW1lJTNBdGFyZ2V0U2NoZW1ldGFyZ2V0VXNlckluZm90YXJnZXRIb3N0dGFyZ2V0UG9ydHRhcmdldFBhdGh0YXJnZXRRdWVyeW1lcmdlZFBhdGhDYW5ub3QgdXNlIG9yaWdpbiB3aXRob3V0IGEgc2NoZW1lOiBPcmlnaW4gaXMgb25seSBhcHBsaWNhYmxlIHNjaGVtZXMgaHR0cCBhbmQgaHR0cHM6IEEgOiBVUkkgc2hvdWxkIGhhdmUgYSBub24tZW1wdHkgaG9zdCBuYW1lOiA6Ly9DYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgIFVSSUNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20gYSBVUkkgd2l0aCBhIHF1ZXJ5IGNvbXBvbmVudENhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20gYSBVUkkgd2l0aCBhIGZyYWdtZW50IGNvbXBvbmVudF90b0ZpbGVQYXRoQ2Fubm90IGV4dHJhY3QgYSBub24tV2luZG93cyBmaWxlIHBhdGggZnJvbSBhIGZpbGUgVVJJIHdpdGggYW4gYXV0aG9yaXR5X3RvV2luZG93c0ZpbGVQYXRoaGFzRHJpdmVMZXR0ZXJfaXNQYXRoQWJzb2x1dGVzc19pbml0aWFsaXplVGV4dF9zcGxpdFF1ZXJ5U3RyaW5nQWxscGFyc2VQYWlyX3VyaUVuY29kZWNhbm9uaWNhbFRhYmxlc3BhY2VUb1BsdXNoZXhEaWdpdHMwMTIzNDU2Nzg5QUJDREVGX2hleENoYXJQYWlyVG9CeXRlSW52YWxpZCBVUkwgZW5jb2RpbmdfdXJpRGVjb2RlcGx1c1RvU3BhY2VJbGxlZ2FsIHBlcmNlbnQgZW5jb2RpbmcgaW4gVVJJVHJ1bmNhdGVkIFVSSV9pc0FscGhhYmV0aWNDaGFyYWN0ZXJfaXNVbnJlc2VydmVkQ2hhclVyaURhdGFfbm9TY2hlbWVfc2VwYXJhdG9ySW5kaWNlc191cmlDYWNoZV9iYXNlNjRfdG9rZW5DaGFyVGFibGVfdXJpY1RhYmxlX2Jhc2U2NFRhYmxlY2hhcnNldE5hbWVlbmNvZGluZ05hbWU7YmFzZTY0LGZyb21CeXRlc1NjaGVtZSBtdXN0IGJlICdkYXRhJ0RhdGEgdXJpIG11c3Qgbm90IGhhdmUgYXV0aG9yaXR5RGF0YSB1cmkgbXVzdCBub3QgaGF2ZSBhIGZyYWdtZW50IHBhcnRzbGFzaEluZGV4SW52YWxpZCBNSU1FIHR5cGU7Y2hhcnNldD1QYXJhbWV0ZXIgbmFtZXMgbXVzdCBub3QgYmUgZW1wdHlQYXJhbWV0ZXIgdmFsdWVzIG11c3Qgbm90IGJlIGVtcHR5cGFyYW1ldGVyc1siX3ZhbGlkYXRlTWltZVR5cGVEb2VzIG5vdCBzdGFydCB3aXRoICdkYXRhOidjb2xvbkluZGV4cXVlcnlJbmRleHBhcmFtZXRlclN0YXJ0cGFyYW1ldGVyRW5kaXNCYXNlNjRrZXlTdGFydGtleUVuZGNvbnRlbnRUZXh0SW52YWxpZCBwZXJjZW50IGVzY2FwZVVua25vd24gY2hhcnNldDogbGFzdFNlcGFyYXRvckV4cGVjdGluZyAnPSdfdXJpRW5jb2RlQnl0ZXNub24tYnl0ZSB2YWx1ZV9TaW1wbGVVcmlfdXJpX3NjaGVtZUVuZF9ob3N0U3RhcnRfcG9ydFN0YXJ0X3BhdGhTdGFydF9xdWVyeVN0YXJ0X2ZyYWdtZW50U3RhcnRfc2NoZW1lQ2FjaGVfaXNGaWxlX2lzSHR0cF9pc0h0dHBzX2lzUGFja2FnZV9pc1NjaGVtZWlzSHR0cE9yaWdpbiBpcyBvbmx5IGFwcGxpY2FibGUgdG8gc2NoZW1lcyBodHRwIGFuZCBodHRwczogX2lzUG9ydHBvcnREaWdpdFN0YXJ0X3NpbXBsZU1lcmdlX3RvTm9uU2ltcGxlbmV3VXJpcmVmVXJpYmFzZVN0YXJ0cmVmRW5kX0RhdGFVcmlfb3V0c3RhbmRpbmdMb2FkUmVxdWVzdHNfbWF4QXNjaWlfbWF4TGF0aW4xX21heFV0ZjE2X21heFVuaWNvZGVuZXh0IHJlbGVhc2Vwcm92aXNpb25hbHByb3h5X1BFUkNFTlRfQU1QRVJTQU5EX1BMVVNfU0xBU0hfRVFVQUxTX1VQUEVSX0NBU0VfQV9VUFBFUl9DQVNFX1pfTEVGVF9CUkFDS0VUX0JBQ0tTTEFTSF9SSUdIVF9CUkFDS0VUX0xPV0VSX0NBU0VfQV9MT1dFUl9DQVNFX0ZfTE9XRVJfQ0FTRV9aX2hleERpZ2l0c19zY2hlbWVFbmRJbmRleF9ob3N0U3RhcnRJbmRleF9wb3J0U3RhcnRJbmRleF9wYXRoU3RhcnRJbmRleF9xdWVyeVN0YXJ0SW5kZXhfZnJhZ21lbnRTdGFydEluZGV4X25vdFNpbXBsZUluZGV4X3VyaVN0YXJ0X25vblNpbXBsZUVuZFN0YXRlc19zY2hlbWVTdGFydF9zY2FubmVyVGFibGVzX21heF9taW5fbmV3RGlnaXRzX2NvbXBsZXRlRGVmZXJyZWRMb2Fkc3N0aWxsT3V0c3RhbmRpbmdMb2FkUmVxdWVzdHNvdXRzdGFuZGluZ1JlcXVlc3RzX2dldEhhc2hPYmplY3RfZ2V0SGFzaF9zZXRIYXNoT2JqZWN0X3NldEhhc2hfdW5zdXBwb3J0ZWRVcmlCYXNlJ1VyaS5iYXNlJyBpcyBub3Qgc3VwcG9ydGVkSWRlbnRpY2FsX2NvbXBhcmlzb25pZGVudGl0eUhhc2hDb2RlX2lzVHJhaWxTdXJyb2dhdGVfY3JlYXRlVGFibGVzc3RhdGVDb3VudHNjaGVtZU9yUGF0aGF1dGhPclBhdGhhdXRoT3JQYXRoU2xhc2h1aW5mb09ySG9zdDB1aW5mb09ySG9zdHVpbmZvT3JQb3J0MHVpbmZvT3JQb3J0aXB2Nkhvc3RyZWxQYXRoU2VncGF0aFNlZ3NjaGVtZU9yUGF0aERvdHNjaGVtZU9yUGF0aERvdDJyZWxQYXRoU2VnRG90cmVsUGF0aFNlZ0RvdDJwYXRoU2VnRG90cGF0aFNlZ0RvdDJzY2hlbWUwdW5yZXNlcnZlZDAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LS5ffnN1YkRlbGltcyEkJicoKSorLDs9cGNoYXJ0YWJsZXNkZWZhdWx0VHJhbnNpdGlvbnNldENoYXJzdHJhbnNpdGlvbkFaMDlheistLl9zY2FuX3N0YXJ0c1dpdGhEYXRhX3N0cmluZ09yTnVsbExlbmd0aGRhcnQuX2h0dHBjcnlwdG8uZGFydGh0dHBfZGF0ZS5kYXJ0aHR0cF9oZWFkZXJzLmRhcnRodHRwX2ltcGwuZGFydGh0dHBfcGFyc2VyLmRhcnRodHRwX3Nlc3Npb24uZGFydHdlYnNvY2tldC5kYXJ0d2Vic29ja2V0X2ltcGwuZGFydF9CeXRlc0NvbnN1bWVyQmFkQ2VydGlmaWNhdGVDYWxsYmFja2NyX1Byb3RvY29sU2VsZWN0b3JIdHRwU2VydmVyc2VydmVySGVhZGVyYXV0b0NvbXByZXNzaWRsZVRpbWVvdXRkZWZhdWx0UmVzcG9uc2VIZWFkZXJzYmluZFNlY3VyZWxpc3Rlbk9uc2Vzc2lvblRpbWVvdXRjb25uZWN0aW9uc0luZm9IdHRwQ29ubmVjdGlvbnNJbmZvaWRsZUh0dHBIZWFkZXJzYWNjZXB0SGVhZGVyYWNjZXB0Q2hhcnNldEhlYWRlcmFjY2VwdC1jaGFyc2V0YWNjZXB0RW5jb2RpbmdIZWFkZXJhY2NlcHQtZW5jb2RpbmdhY2NlcHRMYW5ndWFnZUhlYWRlcmFjY2VwdC1sYW5ndWFnZWFjY2VwdFJhbmdlc0hlYWRlcmFjY2VwdC1yYW5nZXNhZ2VIZWFkZXJhZ2VhbGxvd0hlYWRlcmFsbG93YXV0aG9yaXphdGlvbkhlYWRlcmF1dGhvcml6YXRpb25jYWNoZUNvbnRyb2xIZWFkZXJjYWNoZS1jb250cm9sY29ubmVjdGlvbkhlYWRlcmNvbnRlbnRFbmNvZGluZ0hlYWRlcmNvbnRlbnQtZW5jb2Rpbmdjb250ZW50TGFuZ3VhZ2VIZWFkZXJjb250ZW50LWxhbmd1YWdlY29udGVudExlbmd0aEhlYWRlcmNvbnRlbnQtbGVuZ3RoY29udGVudExvY2F0aW9uSGVhZGVyY29udGVudC1sb2NhdGlvbmNvbnRlbnRNRDVIZWFkZXJjb250ZW50LW1kNWNvbnRlbnRSYW5nZUhlYWRlcmNvbnRlbnQtcmFuZ2Vjb250ZW50VHlwZUhlYWRlcmNvbnRlbnQtdHlwZWRhdGVIZWFkZXJldGFnSGVhZGVyZXRhZ2V4cGVjdEhlYWRlcmV4cGVjdGV4cGlyZXNIZWFkZXJmcm9tSGVhZGVyaG9zdEhlYWRlcmlmTWF0Y2hIZWFkZXJpZi1tYXRjaGlmTW9kaWZpZWRTaW5jZUhlYWRlcmlmLW1vZGlmaWVkLXNpbmNlaWZOb25lTWF0Y2hIZWFkZXJpZi1ub25lLW1hdGNoaWZSYW5nZUhlYWRlcmlmLXJhbmdlaWZVbm1vZGlmaWVkU2luY2VIZWFkZXJpZi11bm1vZGlmaWVkLXNpbmNlbGFzdE1vZGlmaWVkSGVhZGVybGFzdC1tb2RpZmllZGxvY2F0aW9uSGVhZGVybWF4Rm9yd2FyZHNIZWFkZXJtYXgtZm9yd2FyZHNwcmFnbWFIZWFkZXJwcm94eUF1dGhlbnRpY2F0ZUhlYWRlcnByb3h5LWF1dGhlbnRpY2F0ZXByb3h5QXV0aG9yaXphdGlvbkhlYWRlcnByb3h5LWF1dGhvcml6YXRpb25yYW5nZUhlYWRlcnJlZmVyZXJIZWFkZXJyZWZlcmVycmV0cnlBZnRlckhlYWRlcnJldHJ5LWFmdGVydGVIZWFkZXJ0ZXRyYWlsZXJIZWFkZXJ0cmFpbGVydHJhbnNmZXJFbmNvZGluZ0hlYWRlcnRyYW5zZmVyLWVuY29kaW5ndXBncmFkZUhlYWRlcnVwZ3JhZGV1c2VyQWdlbnRIZWFkZXJ1c2VyLWFnZW50dmFyeUhlYWRlcnZhcnl2aWFIZWFkZXJ3YXJuaW5nSGVhZGVyd3d3QXV0aGVudGljYXRlSGVhZGVyd3d3LWF1dGhlbnRpY2F0ZUFDQ0VQVFVzZSBhY2NlcHRIZWFkZXIgaW5zdGVhZEFDQ0VQVF9DSEFSU0VUVXNlIGFjY2VwdENoYXJzZXRIZWFkZXIgaW5zdGVhZEFDQ0VQVF9FTkNPRElOR1VzZSBhY2NlcHRFbmNvZGluZ0hlYWRlciBpbnN0ZWFkQUNDRVBUX0xBTkdVQUdFVXNlIGFjY2VwdExhbmd1YWdlSGVhZGVyIGluc3RlYWRBQ0NFUFRfUkFOR0VTVXNlIGFjY2VwdFJhbmdlc0hlYWRlciBpbnN0ZWFkQUdFVXNlIGFnZUhlYWRlciBpbnN0ZWFkQUxMT1dVc2UgYWxsb3dIZWFkZXIgaW5zdGVhZEFVVEhPUklaQVRJT05Vc2UgYXV0aG9yaXphdGlvbkhlYWRlciBpbnN0ZWFkQ0FDSEVfQ09OVFJPTFVzZSBjYWNoZUNvbnRyb2xIZWFkZXIgaW5zdGVhZENPTk5FQ1RJT05Vc2UgY29ubmVjdGlvbkhlYWRlciBpbnN0ZWFkQ09OVEVOVF9FTkNPRElOR1VzZSBjb250ZW50RW5jb2RpbmdIZWFkZXIgaW5zdGVhZENPTlRFTlRfTEFOR1VBR0VVc2UgY29udGVudExhbmd1YWdlSGVhZGVyIGluc3RlYWRDT05URU5UX0xFTkdUSFVzZSBjb250ZW50TGVuZ3RoSGVhZGVyIGluc3RlYWRDT05URU5UX0xPQ0FUSU9OVXNlIGNvbnRlbnRMb2NhdGlvbkhlYWRlciBpbnN0ZWFkQ09OVEVOVF9NRDVVc2UgY29udGVudE1ENUhlYWRlciBpbnN0ZWFkQ09OVEVOVF9SQU5HRVVzZSBjb250ZW50UmFuZ2VIZWFkZXIgaW5zdGVhZENPTlRFTlRfVFlQRVVzZSBjb250ZW50VHlwZUhlYWRlciBpbnN0ZWFkREFURVVzZSBkYXRlSGVhZGVyIGluc3RlYWRFVEFHVXNlIGV0YWdIZWFkZXIgaW5zdGVhZEVYUEVDVFVzZSBleHBlY3RIZWFkZXIgaW5zdGVhZEVYUElSRVNVc2UgZXhwaXJlc0hlYWRlciBpbnN0ZWFkRlJPTVVzZSBmcm9tSGVhZGVyIGluc3RlYWRIT1NUVXNlIGhvc3RIZWFkZXIgaW5zdGVhZElGX01BVENIVXNlIGlmTWF0Y2hIZWFkZXIgaW5zdGVhZElGX01PRElGSUVEX1NJTkNFVXNlIGlmTW9kaWZpZWRTaW5jZUhlYWRlciBpbnN0ZWFkSUZfTk9ORV9NQVRDSFVzZSBpZk5vbmVNYXRjaEhlYWRlciBpbnN0ZWFkSUZfUkFOR0VVc2UgaWZSYW5nZUhlYWRlciBpbnN0ZWFkSUZfVU5NT0RJRklFRF9TSU5DRVVzZSBpZlVubW9kaWZpZWRTaW5jZUhlYWRlciBpbnN0ZWFkTEFTVF9NT0RJRklFRFVzZSBsYXN0TW9kaWZpZWRIZWFkZXIgaW5zdGVhZExPQ0FUSU9OVXNlIGxvY2F0aW9uSGVhZGVyIGluc3RlYWRNQVhfRk9SV0FSRFNVc2UgbWF4Rm9yd2FyZHNIZWFkZXIgaW5zdGVhZFBSQUdNQVVzZSBwcmFnbWFIZWFkZXIgaW5zdGVhZFBST1hZX0FVVEhFTlRJQ0FURVVzZSBwcm94eUF1dGhlbnRpY2F0ZUhlYWRlciBpbnN0ZWFkUFJPWFlfQVVUSE9SSVpBVElPTlVzZSBwcm94eUF1dGhvcml6YXRpb25IZWFkZXIgaW5zdGVhZFJBTkdFVXNlIHJhbmdlSGVhZGVyIGluc3RlYWRSRUZFUkVSVXNlIHJlZmVyZXJIZWFkZXIgaW5zdGVhZFJFVFJZX0FGVEVSVXNlIHJldHJ5QWZ0ZXJIZWFkZXIgaW5zdGVhZFNFUlZFUlVzZSBzZXJ2ZXJIZWFkZXIgaW5zdGVhZFRFVXNlIHRlSGVhZGVyIGluc3RlYWRUUkFJTEVSVXNlIHRyYWlsZXJIZWFkZXIgaW5zdGVhZFRSQU5TRkVSX0VOQ09ESU5HVXNlIHRyYW5zZmVyRW5jb2RpbmdIZWFkZXIgaW5zdGVhZFVQR1JBREVVc2UgdXBncmFkZUhlYWRlciBpbnN0ZWFkVVNFUl9BR0VOVFVzZSB1c2VyQWdlbnRIZWFkZXIgaW5zdGVhZFZBUllVc2UgdmFyeUhlYWRlciBpbnN0ZWFkVklBVXNlIHZpYUhlYWRlciBpbnN0ZWFkVXNlIHdhcm5pbmdIZWFkZXIgaW5zdGVhZFdXV19BVVRIRU5USUNBVEVVc2Ugd3d3QXV0aGVudGljYXRlSGVhZGVyIGluc3RlYWRjb29raWVIZWFkZXJjb29raWVzZXRDb29raWVIZWFkZXJzZXQtY29va2llQ09PS0lFVXNlIGNvb2tpZUhlYWRlciBpbnN0ZWFkU0VUX0NPT0tJRVVzZSBzZXRDb29raWVIZWFkZXIgaW5zdGVhZGdlbmVyYWxIZWFkZXJzR0VORVJBTF9IRUFERVJTVXNlIGdlbmVyYWxIZWFkZXJzIGluc3RlYWRlbnRpdHlIZWFkZXJzRU5USVRZX0hFQURFUlNVc2UgZW50aXR5SGVhZGVycyBpbnN0ZWFkcmVzcG9uc2VIZWFkZXJzUkVTUE9OU0VfSEVBREVSU1VzZSByZXNwb25zZUhlYWRlcnMgaW5zdGVhZHJlcXVlc3RIZWFkZXJzUkVRVUVTVF9IRUFERVJTVXNlIHJlcXVlc3RIZWFkZXJzIGluc3RlYWRpZk1vZGlmaWVkU2luY2Vjb250ZW50TGVuZ3RoY2h1bmtlZFRyYW5zZmVyRW5jb2Rpbmdub0ZvbGRpbmdIZWFkZXJWYWx1ZXBhcmFtZXRlclNlcGFyYXRvcnZhbHVlU2VwYXJhdG9ycHJlc2VydmVCYWNrc2xhc2hIdHRwU2Vzc2lvbnBsYWluVEVYVFVzZSB0ZXh0IGluc3RlYWRIVE1MVXNlIGh0bWwgaW5zdGVhZEpTT05Vc2UganNvbiBpbnN0ZWFkb2N0ZXQtc3RyZWFtVXNlIGJpbmFyeSBpbnN0ZWFkcHJpbWFyeVR5cGVzdWJUeXBlQ29va2llbWF4QWdlaHR0cE9ubHlmcm9tU2V0Q29va2llVmFsdWVIdHRwUmVxdWVzdHJlcXVlc3RlZFVyaWNvb2tpZXNzZXNzaW9ucHJvdG9jb2xWZXJzaW9uSHR0cFJlc3BvbnNlZGVhZGxpbmVkZXRhY2hTb2NrZXR3cml0ZUhlYWRlcnNkZWZhdWx0SHR0cFBvcnRERUZBVUxUX0hUVFBfUE9SVFVzZSBkZWZhdWx0SHR0cFBvcnQgaW5zdGVhZGRlZmF1bHRIdHRwc1BvcnRERUZBVUxUX0hUVFBTX1BPUlRVc2UgZGVmYXVsdEh0dHBzUG9ydCBpbnN0ZWFkY29ubmVjdGlvblRpbWVvdXRhdXRvVW5jb21wcmVzc3VzZXJBZ2VudGNyZWF0ZUh0dHBDbGllbnRvcGVuVXJscHV0VXJsZGVsZXRlVXJscGF0Y2hVcmxoZWFkVXJsYXV0aGVudGljYXRlYWRkQ3JlZGVudGlhbHNyZWFsbWNyZWRlbnRpYWxzZmluZFByb3h5ZmluZFByb3h5RnJvbUVudmlyb25tZW50YXV0aGVudGljYXRlUHJveHlhZGRQcm94eUNyZWRlbnRpYWxzYmFkQ2VydGlmaWNhdGVDYWxsYmFja2ZvbGxvd1JlZGlyZWN0c21heFJlZGlyZWN0c0h0dHBDbGllbnRSZXNwb25zZWlzUmVkaXJlY3RyZWRpcmVjdHNmb2xsb3dMb29wc0h0dHBDbGllbnRDcmVkZW50aWFsc0h0dHBDbGllbnRCYXNpY0NyZWRlbnRpYWxzdXNlcm5hbWVIdHRwQ2xpZW50RGlnZXN0Q3JlZGVudGlhbHNIdHRwQ29ubmVjdGlvbkluZm9SZWRpcmVjdEluZm9EZXRhY2hlZFNvY2tldHVucGFyc2VkRGF0YUh0dHBFeGNlcHRpb25IdHRwRXhjZXB0aW9uOiAsIHVyaSA9IFJlZGlyZWN0RXhjZXB0aW9uUmVkaXJlY3RFeGNlcHRpb246IF9DcnlwdG9VdGlsc1BBRExJTkVfTEVOR1RIX2VuY29kZVRhYmxlX2VuY29kZVRhYmxlVXJsU2FmZV9kZWNvZGVUYWJsZV9ybmdieXRlc1RvSGV4Ynl0ZXNUb0Jhc2U2NGFkZExpbmVTZXBhcmF0b3JjaHVua0xlbmd0aG91dHB1dExlbmJhc2U2NFN0cmluZ1RvQnl0ZXNpZ25vcmVJbnZhbGlkQ2hhcmFjdGVyc2V4dHJhc0xlbkludmFsaWQgY2hhcmFjdGVyOiBTaXplIG9mIEJhc2UgNjQgY2hhcmFjdGVycyBpbiBJbnB1dAogICAgICAgICAgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIElucHV0OiBjdXJyZW50Q29kZVVuaXRfY2h1bmtTaXplSW5Xb3Jkc19kaWdlc3RTaXplSW5Xb3Jkc19iaWdFbmRpYW5Xb3Jkc19oX2RpZ2VzdENhbGxlZEhhc2ggdXBkYXRlIG1ldGhvZCBjYWxsZWQgYWZ0ZXIgZGlnZXN0IHdhcyByZXRyaWV2ZWRfcmVzdWx0QXNCeXRlc191cGRhdGVIYXNoX2FkZDMyX3JvdGwzMm1vZF9zaGlmdF93b3JkVG9CeXRlc19ieXRlc1RvQ2h1bmtkYXRhSW5kZXh3b3JkSW5kZXh3M3cydzF3MHdvcmRjaHVua1NpemVJbkJ5dGVzemVyb1BhZGRpbmdfTUQ1X2tfcnQxX1NIQTFfd0h0dHBEYXRld2tkYXlNb25UdWVXZWRUaHVGcmlTYXRTdW5KYW5GZWJNYXJBcHJNYXlKdW5KdWxBdWdTZXBPY3ROb3ZEZWMgMDowIEdNVFNQd2tkYXlzd2Vla2RheXNNb25kYXlUdWVzZGF5V2VkbmVzZGF5VGh1cnNkYXlGcmlkYXlTYXR1cmRheVN1bmRheW1vbnRoc3drZGF5c0xvd2VyQ2FzZW1vbnR1ZXdlZHRodWZyaXNhdHdlZWtkYXlzTG93ZXJDYXNlbW9udGhzTG93ZXJDYXNlamFuZmVibWFyYXByanVuanVsYXVnb2N0bm92ZGVjZm9ybWF0UmZjMTEyM2Zvcm1hdFJmYzg1MGZvcm1hdEFzY3RpbWVJbnZhbGlkIEhUVFAgZGF0ZSBleHBlY3RXZWVrZGF5ZXhwZWN0TW9udGhleHBlY3ROdW1leHBlY3RFbmRHTVRfcGFyc2VDb29raWVEYXRlSW52YWxpZCBjb29raWUgZGF0ZSBpc0VuZGlzRGVsaW1pdGVyaXNOb25EZWxpbWl0ZXJnZXRNb250aHRpbWVTdHJkYXlPZk1vbnRoU3RybW9udGhTdHJ5ZWFyU3RyZGF5T2ZNb250aHRpbWVMaXN0X0h0dHBIZWFkZXJzX2hlYWRlcnNfbXV0YWJsZV9ub0ZvbGRpbmdIZWFkZXJzX2NvbnRlbnRMZW5ndGhfcGVyc2lzdGVudENvbm5lY3Rpb25fY2h1bmtlZFRyYW5zZmVyRW5jb2RpbmdfZGVmYXVsdFBvcnRGb3JTY2hlbWVkZWZhdWx0UG9ydEZvclNjaGVtZWluaXRpYWxIZWFkZXJzMS4wTW9yZSB0aGFuIG9uZSB2YWx1ZSBmb3IgaGVhZGVyIF9jaGVja011dGFibGVjaHVua2VkMS4xVHJ5aW5nIHRvIHNldCAnQ29ubmVjdGlvbjogS2VlcC1BbGl2ZScgb24gSFRUUCAxLjAgaGVhZGVycyB3aXRoIG5vIENvbnRlbnRMZW5ndGhrZWVwLWFsaXZlVHJ5aW5nIHRvIGNsZWFyIENvbnRlbnRMZW5ndGggb24gSFRUUCAxLjAgaGVhZGVycyB3aXRoICdDb25uZWN0aW9uOiBLZWVwLUFsaXZlJyBzZXRUcnlpbmcgdG8gc2V0ICdUcmFuc2Zlci1FbmNvZGluZzogQ2h1bmtlZCcgb24gSFRUUCAxLjAgaGVhZGVyc19hZGRWYWx1ZV91cGRhdGVIb3N0SGVhZGVyX2FkZERhdGVfYWRkSG9zdF9hZGRFeHBpcmVzX2FkZENvbm5lY3Rpb25fYWRkQ29udGVudFR5cGVfYWRkQ29udGVudExlbmd0aF9hZGRUcmFuc2ZlckVuY29kaW5nX2FkZElmTW9kaWZpZWRTaW5jZVVuZXhwZWN0ZWQgdHlwZSBmb3IgaGVhZGVyIG5hbWVkIGxvd2VyQ2FzZVZhbHVlSFRUUCBoZWFkZXJzIGFyZSBub3QgbXV0YWJsZWRlZmF1bHRQb3J0X2ZvbGRIZWFkZXJuYW1lRGF0YV9wYXJzZUNvb2tpZXNwYXJzZUNvb2tpZVN0cmluZ3NraXBXU3BhcnNlTmFtZXBhcnNlVmFsdWVoZWFkZXJWYWx1ZV92YWxpZGF0ZUZpZWxkSW52YWxpZCBIVFRQIGhlYWRlciBmaWVsZCBuYW1lOiBfdmFsaWRhdGVWYWx1ZUludmFsaWQgSFRUUCBoZWFkZXIgZmllbGQgdmFsdWU6IF9IZWFkZXJWYWx1ZV91bm1vZGlmaWFibGVQYXJhbWV0ZXJzX2Vuc3VyZVBhcmFtZXRlcnNGYWlsZWQgdG8gcGFyc2UgaGVhZGVyIHZhbHVlbWF5YmVFeHBlY3RwYXJzZVBhcmFtZXRlcnNwYXJzZVBhcmFtZXRlck5hbWVwYXJzZVBhcmFtZXRlclZhbHVlX0NvbnRlbnRUeXBlX3ByaW1hcnlUeXBlX3N1YlR5cGVsb3dlckNhc2VLZXlfQ29va2llX3ZhbGlkYXRlX3BhcnNlU2V0Q29va2llVmFsdWVGYWlsZWQgdG8gcGFyc2UgaGVhZGVyIHZhbHVlIFtwYXJzZUF0dHJpYnV0ZXNwYXJzZUF0dHJpYnV0ZU5hbWVwYXJzZUF0dHJpYnV0ZVZhbHVlbWF4LWFnZWh0dHBvbmx5OyBFeHBpcmVzPTsgTWF4LUFnZT07IERvbWFpbj07IFBhdGg9OyBTZWN1cmU7IEh0dHBPbmx5c2VwYXJhdG9yc0ludmFsaWQgY2hhcmFjdGVyIGluIGNvb2tpZSBuYW1lLCBjb2RlIHVuaXQ6ICdJbnZhbGlkIGNoYXJhY3RlciBpbiBjb29raWUgdmFsdWUsIGNvZGUgdW5pdDogJ19JTklUX1NJWkVfSHR0cEluY29taW5nX3RyYW5zZmVyTGVuZ3RoX2RhdGFDb21wbGV0ZXJmdWxsQm9keVJlYWR1cGdyYWRlZGhhc1N1YnNjcmliZXJ0cmFuc2Zlckxlbmd0aGRhdGFEb25lX0h0dHBJbmJvdW5kTWVzc2FnZV9pbmNvbWluZ19jb29raWVzX0h0dHBSZXF1ZXN0X2h0dHBTZXJ2ZXJfaHR0cENvbm5lY3Rpb25fc2Vzc2lvbl9yZXF1ZXN0ZWRVcmlfc2Vzc2lvbk1hbmFnZXJJbnN0YW5jZXNlc3Npb25JZHNzZXNzaW9uSWRfc2Vzc2lvbk1hbmFnZXJnZXRTZXNzaW9uX21hcmtTZWVueC1mb3J3YXJkZWQtcHJvdG9ob3N0TGlzdHgtZm9yd2FyZGVkLWhvc3RfZGVzdHJveWVkY3JlYXRlU2Vzc2lvbl9IdHRwQ2xpZW50UmVzcG9uc2VfaHR0cFJlcXVlc3RfcmVzcG9uc2VSZWRpcmVjdHNfaHR0cENsaWVudENvbm5lY3Rpb25Tb2NrZXQgaXMgbm90IGEgU2VjdXJlU29ja2V0SEVBRFBPU1RSZXNwb25zZSBoYXMgbm8gTG9jYXRpb24gaGVhZGVyIGZvciByZWRpcmVjdFJlZGlyZWN0IGxvb3AgZGV0ZWN0ZWRfb3BlblVybEZyb21SZXF1ZXN0X2Nvbm5lY3Rpb25DbG9zZWRfc2hvdWxkQXV0aGVudGljYXRlUHJveHljaGFsbGVuZ2Vfc2hvdWxkQXV0aGVudGljYXRlX2F1dGhlbnRpY2F0ZXByb3h5QXV0aHJldHJ5YXV0aENoYWxsZW5nZWZpbmRDcmVkZW50aWFsc19maW5kUHJveHlDcmVkZW50aWFsc19wcm94eV9maW5kQ3JlZGVudGlhbHNyZW1vdmVDcmVkZW50aWFsc19yZW1vdmVQcm94eUNyZWRlbnRpYWxzX3JlbW92ZUNyZWRlbnRpYWxzcmVxdWVzdEF1dGhlbnRpY2F0aW9uX2F1dGhlbnRpY2F0ZVByb3h5YWxnb3JpdGhtbm9uY2Vxb3Bub25jZUNvdW50c3RhbGVjcmVkc0F2YWlsYWJsZXRhcmdldEFkZFN0cmVhbV9IdHRwT3V0Ym91bmRNZXNzYWdlX2VuY29kaW5nU2V0X2J1ZmZlck91dHB1dF9vdXRnb2luZ291dGdvaW5nb3V0Ym91bmRoZWFkZXJzV3JpdHRlbkhlYWRlciBhbHJlYWR5IHNlbnRfd3JpdGVIZWFkZXJfaXNDb25uZWN0aW9uQ2xvc2VkX0h0dHBSZXNwb25zZV9zdGF0dXNDb2RlX3JlYXNvblBocmFzZV9kZWFkbGluZV9kZWFkbGluZVRpbWVyZGVmYXVsdEhlYWRlcnNfaXNDbG9zaW5nX2ZpbmRSZWFzb25QaHJhc2VIZWFkZXJzIGFscmVhZHkgc2VudGhlYWRlcnNGdXR1cmVkcmFpblJlcXVlc3RzZXRPdXRnb2luZ19pc05ld2hlYWRlckJ5dGVzc2V0SGVhZGVyU3dpdGNoaW5nIFByb3RvY29sc0NyZWF0ZWRBY2NlcHRlZE5vbi1BdXRob3JpdGF0aXZlIEluZm9ybWF0aW9uTm8gQ29udGVudFJlc2V0IENvbnRlbnRQYXJ0aWFsIENvbnRlbnRNdWx0aXBsZSBDaG9pY2VzTW92ZWQgUGVybWFuZW50bHlGb3VuZFNlZSBPdGhlck5vdCBNb2RpZmllZFVzZSBQcm94eVRlbXBvcmFyeSBSZWRpcmVjdEJhZCBSZXF1ZXN0VW5hdXRob3JpemVkUGF5bWVudCBSZXF1aXJlZEZvcmJpZGRlbk5vdCBGb3VuZE1ldGhvZCBOb3QgQWxsb3dlZE5vdCBBY2NlcHRhYmxlUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWRSZXF1ZXN0IFRpbWUtb3V0Q29uZmxpY3RHb25lTGVuZ3RoIFJlcXVpcmVkUHJlY29uZGl0aW9uIEZhaWxlZFJlcXVlc3QgRW50aXR5IFRvbyBMYXJnZVJlcXVlc3QtVVJJIFRvbyBMb25nVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZVJlcXVlc3RlZCByYW5nZSBub3Qgc2F0aXNmaWFibGVFeHBlY3RhdGlvbiBGYWlsZWRJbnRlcm5hbCBTZXJ2ZXIgRXJyb3JOb3QgSW1wbGVtZW50ZWRCYWQgR2F0ZXdheVNlcnZpY2UgVW5hdmFpbGFibGVHYXRld2F5IFRpbWUtb3V0SHR0cCBWZXJzaW9uIG5vdCBzdXBwb3J0ZWRTdGF0dXMgX0h0dHBDbGllbnRSZXF1ZXN0X3Jlc3BvbnNlQ29tcGxldGVyX3Jlc3BvbnNlX2ZvbGxvd1JlZGlyZWN0c19tYXhSZWRpcmVjdHNSZXF1ZXN0IGFscmVhZHkgc2VudF9vbkluY29taW5naW5jb21pbmdSZWRpcmVjdCBsaW1pdCBleGNlZWRlZF9yZXF1ZXN0VXJpdXJpU3RhcnRpbmdGcm9tUGF0aGlzRGlyZWN0Q09OTkVDVF9wcm94eVR1bm5lbF9IdHRwR1ppcFNpbmtfY29uc3VtZV9IdHRwT3V0Z29pbmdfZm9vdGVyQW5kQ2h1bmswTGVuZ3RoX2NodW5rMExlbmd0aGlnbm9yZUJvZHlfY2xvc2VGdXR1cmVfcGVuZGluZ0NodW5rZWRGb290ZXJfYnl0ZXNXcml0dGVuX2d6aXBfZ3ppcFNpbmtfZ3ppcEFkZF9nemlwQnVmZmVyX2d6aXBCdWZmZXJMZW5ndGhfc29ja2V0RXJyb3JkcmFpbkZ1dHVyZWFjY2VwdEVuY29kaW5nc2NvbnRlbnRFbmNvZGluZ19hZGRHWmlwQ2h1bmtfY2h1bmtIZWFkZXJDb250ZW50IHNpemUgZXhjZWVkcyBzcGVjaWZpZWQgY29udGVudExlbmd0aC4gIGJ5dGVzIHdyaXR0ZW4gd2hpbGUgZXhwZWN0ZWQgX2lnbm9yZUVycm9yTm8gY29udGVudCBldmVuIHRob3VnaCBjb250ZW50TGVuZ3RoIHdhcyBzcGVjaWZpZWQgdG8gYmUgZ3JlYXRlciB0aGFuIDA6IENvbnRlbnQgc2l6ZSBiZWxvdyBzcGVjaWZpZWQgY29udGVudExlbmd0aC4gIGJ5dGVzIHdyaXR0ZW4gYnV0IGV4cGVjdGVkIGZvb3RlckFuZEhlYWRlcl9IdHRwQ2xpZW50Q29ubmVjdGlvbl9odHRwUGFyc2VyX2Rpc3Bvc2VfaWRsZVRpbWVyX2N1cnJlbnRVcmlfbmV4dFJlc3BvbnNlQ29tcGxldGVyX3N0cmVhbUZ1dHVyZWxpc3RlblRvU3RyZWFtVW5leHBlY3RlZCByZXNwb25zZSAodW5zb2xpY2l0ZWQgcmVzcG9uc2Ugd2l0aG91dCByZXF1ZXN0KS5Db25uZWN0aW9uIGNsb3NlZCBiZWZvcmUgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkU29ja2V0IGNsb3NlZCBiZWZvcmUgcmVxdWVzdCB3YXMgc2VudHByb3h5Q3JlZHNjcmVkc2lzQXV0aGVudGljYXRlZGF1dGhCYXNpYyBfcHJveHlDcmVkZW50aWFsc2F1dGhvcml6ZWlzSGVhZHN0YXJ0VGltZXJfcmV0dXJuQ29ubmVjdGlvbmF1dGhJbmZvcHJveHktYXV0aGVudGljYXRpb24taW5mb25leHRub25jZWF1dGhlbnRpY2F0aW9uLWluZm9Db25uZWN0aW9uIGNsb3NlZCBiZWZvcmUgZGF0YSB3YXMgcmVjZWl2ZWRkZXRhY2hJbmNvbWluZ2NyZWF0ZVByb3h5VHVubmVsUHJveHkgZmFpbGVkIHRvIGVzdGFibGlzaCB0dW5uZWwgc2VjdXJlU29ja2V0aXNTZWN1cmVzc2g6c3RvcFRpbWVyX0Nvbm5lY3Rpb25JbmZvX0Nvbm5lY3Rpb25UYXJnZXRfaWRsZV9hY3RpdmVfc29ja2V0VGFza3NfY29ubmVjdGluZ2hhc0lkbGVoYXNBY3RpdmV0YWtlSWRsZV9jaGVja1BlbmRpbmdhZGROZXdBY3RpdmVyZXR1cm5Db25uZWN0aW9uY29ubmVjdGlvbkNsb3NlZHVyaUhvc3R1cmlQb3J0X2Nvbm5lY3Rpb25zQ2hhbmdlZGN1cnJlbnRCYWRDZXJ0aWZpY2F0ZUNhbGxiYWNrX2JhZENlcnRpZmljYXRlQ2FsbGJhY2tjb25uZWN0aW9uVGFza3R1bm5lbF9nZXRDb25uZWN0aW9uVGFyZ2V0X0h0dHBDbGllbnRfY2xvc2luZ19jbG9zaW5nRm9yY2VmdWxseV9jb25uZWN0aW9uVGFyZ2V0c19jcmVkZW50aWFsc19maW5kUHJveHlfaWRsZVRpbWVvdXRfcGxhdGZvcm1FbnZpcm9ubWVudENhY2hlaGFzaE1hcmtfb3BlblVybF9jbG9zZUNvbm5lY3Rpb25zQ2xpZW50IGlzIGNsb3NlZE5vIGhvc3Qgc3BlY2lmaWVkIGluIFVSSSBVbnN1cHBvcnRlZCBzY2hlbWUgJycgaW4gVVJJIHByb3h5Q29uZl9nZXRDb25uZWN0aW9uY29ubmVjdGlvblRhcmdldHByb3hpZXNObyBwcm94aWVzIGdpdmVuc2l0ZUNyZWRlbnRpYWxzX2ZpbmRQcm94eUZyb21FbnZpcm9ubWVudGNoZWNrTm9Qcm94eURJUkVDVGNoZWNrUHJveHk6MTA4MFBST1hZIHByb3h5Q2Znbm9Qcm94eW5vX3Byb3h5Tk9fUFJPWFlodHRwX3Byb3h5SFRUUF9QUk9YWWh0dHBzX3Byb3h5SFRUUFNfUFJPWFlfX0h0dHBDb25uZWN0aW9uJkxpbmtlZExpc3RFbnRyeSZfU2VydmljZU9iamVjdF9IdHRwQ29ubmVjdGlvbl9BQ1RJVkVfSURMRV9DTE9TSU5HX0RFVEFDSEVEX2Nvbm5lY3Rpb25zX2lkbGVNYXJrX21hcmtBY3RpdmVfbWFya0lkbGVfaGFuZGxlUmVxdWVzdG1hcmtJZGxlaXNNYXJrZWRJZGxlZGV0YWNoZWRJbmNvbWluZ19pc0FjdGl2ZV9pc0lkbGVfaXNEZXRhY2hlZGlvL2h0dHAvc2VydmVyY29ubmVjdGlvbnNIdHRwU2VydmVyQ29ubmVjdGlvbiA8LT4gdXNlcl9uYW1lQFNvY2tldFVzZXJTb2NrZXRBY3RpdmVJZGxlQ2xvc2luZ0RldGFjaGVkX19IdHRwU2VydmVyJlN0cmVhbSZfU2VydmljZU9iamVjdF9IdHRwU2VydmVyX3NlcnZlcnNfc2VydmVyU29ja2V0X2Nsb3NlU2VydmVyX2FjdGl2ZUNvbm5lY3Rpb25zX2lkbGVDb25uZWN0aW9uc19pbml0RGVmYXVsdFJlc3BvbnNlSGVhZGVyc1gtRnJhbWUtT3B0aW9uc1NBTUVPUklHSU5YLUNvbnRlbnQtVHlwZS1PcHRpb25zbm9zbmlmZlgtWFNTLVByb3RlY3Rpb24xOyBtb2RlPWJsb2NrSHR0cFNlcnZlciBpcyBub3QgYm91bmQgdG8gYSBzb2NrZXRjb25uaW8vaHR0cC9zZXJ2ZXJzX1Byb3h5Q29uZmlndXJhdGlvblBST1hZX1BSRUZJWERJUkVDVF9QUkVGSVhjb25maWd1cmF0aW9uSW52YWxpZCBwcm94eSBjb25maWd1cmF0aW9uIHVzZXJpbmZvaW52YWxpZCBwb3J0ICdfSHR0cENvbm5lY3Rpb25JbmZvX0RldGFjaGVkU29ja2V0X0F1dGhlbnRpY2F0aW9uU2NoZW1lX3NjaGVtZVVOS05PV05CQVNJQ0RJR0VTVGJhc2ljQmFzaWNfQ3JlZGVudGlhbHNoYTFfU2l0ZUNyZWRlbnRpYWxzdGhpc1BvcnRvdGhlclBvcnRfUHJveHlDcmVkZW50aWFsc2F1dGhvcml6ZVByb3h5X0h0dHBDbGllbnRDcmVkZW50aWFsc19IdHRwQ2xpZW50QmFzaWNDcmVkZW50aWFsc19IdHRwQ2xpZW50RGlnZXN0Q3JlZGVudGlhbHNoYTJjbm9uY2VuY0RpZ2VzdCB1c2VybmFtZT0iLCByZWFsbT0iLCBub25jZT0iLCB1cmk9IiwgYWxnb3JpdGhtPSIsIHFvcD0iLCBjbm9uY2U9IiwgbmM9IiwgcmVzcG9uc2U9Il9SZWRpcmVjdEluZm9fQ29uc3RIVFRQSFRUUDFET1RIVFRQMTBIVFRQMTFTRVBBUkFUT1JfTUFQX0NoYXJDb2RlSFREQVNIU0VNSV9DT0xPTl9TdGF0ZU1FVEhPRF9PUl9SRVNQT05TRV9IVFRQX1ZFUlNJT05SRVNQT05TRV9IVFRQX1ZFUlNJT05SRVFVRVNUX0xJTkVfTUVUSE9EUkVRVUVTVF9MSU5FX1VSSVJFUVVFU1RfTElORV9IVFRQX1ZFUlNJT05SRVFVRVNUX0xJTkVfRU5ESU5HUkVTUE9OU0VfTElORV9TVEFUVVNfQ09ERVJFU1BPTlNFX0xJTkVfUkVBU09OX1BIUkFTRVJFU1BPTlNFX0xJTkVfRU5ESU5HSEVBREVSX1NUQVJUSEVBREVSX0ZJRUxESEVBREVSX1ZBTFVFX1NUQVJUSEVBREVSX1ZBTFVFSEVBREVSX1ZBTFVFX0ZPTERJTkdfT1JfRU5ESU5HSEVBREVSX1ZBTFVFX0ZPTERfT1JfRU5ESEVBREVSX0VORElOR0NIVU5LX1NJWkVfU1RBUlRJTkdfQ1JDSFVOS19TSVpFX1NUQVJUSU5HX0xGQ0hVTktfU0laRUNIVU5LX1NJWkVfRVhURU5TSU9OQ0hVTktfU0laRV9FTkRJTkdDSFVOS0VEX0JPRFlfRE9ORV9DUkNIVU5LRURfQk9EWV9ET05FX0xGQk9EWVVQR1JBREVERkFJTFVSRUZJUlNUX0JPRFlfU1RBVEVfSHR0cFZlcnNpb25VTkRFVEVSTUlORURfTWVzc2FnZVR5cGVSRVFVRVNUUkVTUE9OU0VfSHR0cERldGFjaGVkU3RyZWFtU3Vic2NyaXB0aW9uX2luamVjdERhdGFfdXNlck9uRGF0YV9zY2hlZHVsZWRfbWF5YmVTY2hlZHVsZURhdGFfSHR0cERldGFjaGVkSW5jb21pbmdfSHR0cFBhcnNlcl9wYXJzZXJDYWxsZWRfcmVxdWVzdFBhcnNlcl9odHRwVmVyc2lvbkluZGV4X21lc3NhZ2VUeXBlX3N0YXR1c0NvZGVMZW5ndGhfdXJpX29yX3JlYXNvbl9waHJhc2VfaGVhZGVyRmllbGRfaGVhZGVyVmFsdWVfaHR0cFZlcnNpb25fY29ubmVjdGlvblVwZ3JhZGVfY2h1bmtlZF9ub01lc3NhZ2VCb2R5X3JlbWFpbmluZ0NvbnRlbnRfcGF1c2VkX2JvZHlQYXVzZWRfYm9keUNvbnRyb2xsZXJfcGF1c2VTdGF0ZUNoYW5nZWRfcmVzZXRyZXF1ZXN0UGFyc2VycmVzcG9uc2VQYXJzZXJfZG9QYXJzZV9oZWFkZXJzRW5kX2NyZWF0ZUluY29taW5nX2Nsb3NlSW5jb21pbmdEYXRhIG9uIGNsb3NlZCBjb25uZWN0aW9uRGF0YSBvbiBmYWlsZWQgY29ubmVjdGlvbkludmFsaWQgcmVxdWVzdCBtZXRob2RJbnZhbGlkIHJlc3BvbnNlIGxpbmVJbnZhbGlkIHJlcXVlc3QgbGluZV9leHBlY3RJbnZhbGlkIHJlcXVlc3QgVVJJSW52YWxpZCByZXNwb25zZSBzdGF0dXMgY29kZUludmFsaWQgcmVzcG9uc2UgcmVhc29uIHBocmFzZUludmFsaWQgaGVhZGVyIGZpZWxkIG5hbWVoZWFkZXJGaWVsZF9jYXNlSW5zZW5zaXRpdmVDb21wYXJlaXNSZXNwb25zZWlzVXBncmFkZUNvZGVpc1VwZ3JhZGVfZXhwZWN0SGV4RGlnaXRkYXRhQXZhaWxhYmxlX3JlbGVhc2VCdWZmZXJDb25uZWN0aW9uIGNsb3NlZCB3aGlsZSByZWNlaXZpbmcgZGF0YUNvbm5lY3Rpb24gY2xvc2VkIGJlZm9yZSBmdWxsIGhlYWRlciB3YXMgcmVjZWl2ZWRDb25uZWN0aW9uIGNsb3NlZCBiZWZvcmUgZnVsbCBib2R5IHdhcyByZWNlaXZlZG1lc3NhZ2VUeXBlcmVhZFVucGFyc2VkRGF0YV9pc1Rva2VuQ2hhcl9pc1ZhbHVlQ2hhcl90b2tlbml6ZUZpZWxkVmFsdWVfdG9Mb3dlckNhc2VCeXRldmFsMXZhbDJGYWlsZWQgdG8gcGFyc2UgSFRUUF9IdHRwU2Vzc2lvbl9sYXN0U2Vlbl90aW1lb3V0Q2FsbGJhY2tfcHJldl9yZW1vdmVGcm9tVGltZW91dFF1ZXVlX3Nlc3Npb25zX2J1bXBUb0VuZGxhc3RTZWVuSHR0cFNlc3Npb24gaWQ6X0h0dHBTZXNzaW9uTWFuYWdlcl9zZXNzaW9uVGltZW91dF90aW1lcmNyZWF0ZVNlc3Npb25JZF9LRVlfTEVOR1RIX2FkZFRvVGltZW91dFF1ZXVlX3N0b3BUaW1lcl9zdGFydFRpbWVyX3RpbWVyVGltZW91dEh0dHBPdmVycmlkZXNydW5XaXRoSHR0cE92ZXJyaWRlc19IdHRwT3ZlcnJpZGVzU2NvcGVfY3JlYXRlSHR0cENsaWVudFdlYlNvY2tldFN0YXR1c25vcm1hbENsb3N1cmVnb2luZ0F3YXlwcm90b2NvbEVycm9ydW5zdXBwb3J0ZWREYXRhcmVzZXJ2ZWQxMDA0bm9TdGF0dXNSZWNlaXZlZGFibm9ybWFsQ2xvc3VyZWludmFsaWRGcmFtZVBheWxvYWREYXRhcG9saWN5VmlvbGF0aW9ubWVzc2FnZVRvb0JpZ21pc3NpbmdNYW5kYXRvcnlFeHRlbnNpb25yZXNlcnZlZDEwMTVOT1JNQUxfQ0xPU1VSRVVzZSBub3JtYWxDbG9zdXJlIGluc3RlYWRHT0lOR19BV0FZVXNlIGdvaW5nQXdheSBpbnN0ZWFkUFJPVE9DT0xfRVJST1JVc2UgcHJvdG9jb2xFcnJvciBpbnN0ZWFkVU5TVVBQT1JURURfREFUQVVzZSB1bnN1cHBvcnRlZERhdGEgaW5zdGVhZFJFU0VSVkVEXzEwMDRVc2UgcmVzZXJ2ZWQxMDA0IGluc3RlYWROT19TVEFUVVNfUkVDRUlWRURVc2Ugbm9TdGF0dXNSZWNlaXZlZCBpbnN0ZWFkQUJOT1JNQUxfQ0xPU1VSRVVzZSBhYm5vcm1hbENsb3N1cmUgaW5zdGVhZElOVkFMSURfRlJBTUVfUEFZTE9BRF9EQVRBVXNlIGludmFsaWRGcmFtZVBheWxvYWREYXRhIGluc3RlYWRQT0xJQ1lfVklPTEFUSU9OVXNlIHBvbGljeVZpb2xhdGlvbiBpbnN0ZWFkTUVTU0FHRV9UT09fQklHVXNlIG1lc3NhZ2VUb29CaWcgaW5zdGVhZE1JU1NJTkdfTUFOREFUT1JZX0VYVEVOU0lPTlVzZSBtaXNzaW5nTWFuZGF0b3J5RXh0ZW5zaW9uIGluc3RlYWRSRVNFUlZFRF8xMDE1VXNlIHJlc2VydmVkMTAxNSBpbnN0ZWFkQ29tcHJlc3Npb25PcHRpb25zY29tcHJlc3Npb25EZWZhdWx0VXNlIGNvbXByZXNzaW9uRGVmYXVsdCBpbnN0ZWFkY29tcHJlc3Npb25PZmZPRkZVc2UgY29tcHJlc3Npb25PZmYgaW5zdGVhZGNsaWVudE5vQ29udGV4dFRha2VvdmVyc2VydmVyTm9Db250ZXh0VGFrZW92ZXJjbGllbnRNYXhXaW5kb3dCaXRzc2VydmVyTWF4V2luZG93Qml0c19jcmVhdGVTZXJ2ZXJSZXNwb25zZUhlYWRlcnJlcXVlc3RlZG13YklsbGVnYWwgMCBwYWRkaW5nIG9uIHZhbHVlLjsgc2VydmVyX21heF93aW5kb3dfYml0cz1fY3JlYXRlQ2xpZW50UmVxdWVzdEhlYWRlcjsgY2xpZW50X21heF93aW5kb3dfYml0cz07IGNsaWVudF9tYXhfd2luZG93X2JpdHNfY3JlYXRlSGVhZGVyOyBjbGllbnRfbm9fY29udGV4dF90YWtlb3Zlcjsgc2VydmVyX25vX2NvbnRleHRfdGFrZW92ZXJoZWFkZXJMaXN0V2ViU29ja2V0VHJhbnNmb3JtZXJwcm90b2NvbFNlbGVjdG9yY29tcHJlc3Npb25pc1VwZ3JhZGVSZXF1ZXN0V2ViU29ja2V0Q09OTkVDVElOR1VzZSBjb25uZWN0aW5nIGluc3RlYWRVc2Ugb3BlbiBpbnN0ZWFkVXNlIGNsb3NpbmcgaW5zdGVhZHBpbmdJbnRlcnZhbFRoaXMgY29uc3RydWN0b3Igd2lsbCBiZSByZW1vdmVkIGluIERhcnQgMi4wLiBVc2UgYGltcGxlbWVudHNgIGluc3RlYWQgb2YgYGV4dGVuZHNgIGlmIGltcGxlbWVudGluZyB0aGlzIGFic3RyYWN0IGNsYXNzLmZyb21VcGdyYWRlZFNvY2tldHNlcnZlclNpZGVUaGUgc2VydmVyU2lkZSBhcmd1bWVudCBtdXN0IGJlIHBhc3NlZCBleHBsaWNpdGx5IHRvIFdlYlNvY2tldC5mcm9tVXBncmFkZWRTb2NrZXQucmVhZHlTdGF0ZWNsb3NlQ29kZWNsb3NlUmVhc29uV2ViU29ja2V0RXhjZXB0aW9uV2ViU29ja2V0RXhjZXB0aW9uOiBfV2ViU29ja2V0TWVzc2FnZVR5cGVfV2ViU29ja2V0T3Bjb2RlQ09OVElOVUFUSU9OUkVTRVJWRURfM1JFU0VSVkVEXzRSRVNFUlZFRF81UkVTRVJWRURfNlJFU0VSVkVEXzdDTE9TRVBJTkdQT05HUkVTRVJWRURfQlJFU0VSVkVEX0NSRVNFUlZFRF9EUkVTRVJWRURfRVJFU0VSVkVEX0ZfRW5jb2RlZFN0cmluZ19Db21wcmVzc2lvbk1heFdpbmRvd0JpdHNfV2ViU29ja2V0UHJvdG9jb2xUcmFuc2Zvcm1lckxFTl9GSVJTVExFTl9SRVNUUEFZTE9BREZJTlJTVjFSU1YyUlNWM09QQ09ERV9maW5fY29tcHJlc3NlZF9vcGNvZGVfbWFza2VkX3JlbWFpbmluZ0xlbkJ5dGVzX3JlbWFpbmluZ01hc2tpbmdLZXlCeXRlc19yZW1haW5pbmdQYXlsb2FkQnl0ZXNfdW5tYXNraW5nSW5kZXhfY3VycmVudE1lc3NhZ2VUeXBlX3NlcnZlclNpZGVfbWFza2luZ0J5dGVzX3BheWxvYWRfZGVmbGF0ZVdlYlNvY2tldCB0cmFuc2Zvcm1lciBhbHJlYWR5IHVzZWQubGFzdEluZGV4UHJvdG9jb2wgZXJyb3JfaXNDb250cm9sRnJhbWVfbGVuZ3RoRG9uZV9tYXNrRG9uZXBheWxvYWRMZW5ndGhfdW5tYXNrX2NvbnRyb2xGcmFtZUVuZF9tZXNzYWdlRnJhbWVFbmRCTE9DS19TSVpFYmxvY2tDb3VudGJsb2NrTWFza2Jsb2NrQnVmZmVyUmVjZWl2ZWQgbWFza2VkIGZyYW1lIGZyb20gc2VydmVyUmVjZWl2ZWQgdW5tYXNrZWQgZnJhbWUgZnJvbSBjbGllbnRfc3RhcnRQYXlsb2FkX3ByZXBhcmVGb3JOZXh0RnJhbWVwcm9jZXNzSW5jb21pbmdNZXNzYWdlX1dlYlNvY2tldFBpbmdfV2ViU29ja2V0UG9uZ19XZWJTb2NrZXRUcmFuc2Zvcm1lckltcGxfcHJvdG9jb2xTZWxlY3Rvcl9jb21wcmVzc2lvbl91cGdyYWRlSW52YWxpZCBXZWJTb2NrZXQgdXBncmFkZSByZXF1ZXN0VXBncmFkZXdlYnNvY2tldFNlYy1XZWJTb2NrZXQtS2V5U2VjLVdlYlNvY2tldC1BY2NlcHRTZWMtV2ViU29ja2V0LVByb3RvY29sZGVmbGF0ZVNlbGVjdGVkIHByb3RvY29sIGlzIG5vdCBpbiB0aGUgbGlzdCBvZiBhdmFpbGFibGUgcHJvdG9jb2xzX25lZ290aWF0ZUNvbXByZXNzaW9uZXh0ZW5zaW9uSGVhZGVyU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zaHZfaXNVcGdyYWRlUmVxdWVzdFNlYy1XZWJTb2NrZXQtVmVyc2lvbl9XZWJTb2NrZXRQZXJNZXNzYWdlRGVmbGF0ZV9lbnN1cmVEZWNvZGVyX2Vuc3VyZUVuY29kZXJwcm9jZXNzT3V0Z29pbmdNZXNzYWdlTGlzdCBlbGVtZW50IGlzIG5vdCBhIGJ5dGUgdmFsdWUgKHZhbHVlICBhdCBpbmRleCBfV2ViU29ja2V0T3V0Z29pbmdUcmFuc2Zvcm1lcl9kZWZsYXRlSGVscGVyV2ViU29ja2V0IHRyYW5zZm9ybWVyIGFscmVhZHkgdXNlZGFkZEZyYW1lX291dENsb3NlQ29kZV9vdXRDbG9zZVJlYXNvbmNyZWF0ZUZyYW1lY29tcHJlc3NlZGRhdGFMZW5ndGhoZWFkZXJTaXplaG9jbGVuZ3RoQnl0ZXNtYXNrQnl0ZXNfV2ViU29ja2V0Q29uc3VtZXJfaXNzdWVkUGF1c2VfZW5zdXJlQ29udHJvbGxlcl9kb25lY2xvc2VTb2NrZXRfX1dlYlNvY2tldEltcGwmU3RyZWFtJl9TZXJ2aWNlT2JqZWN0X1dlYlNvY2tldEltcGxfd2ViU29ja2V0c1BFUl9NRVNTQUdFX0RFRkxBVEVwZXJtZXNzYWdlLWRlZmxhdGVfcmVhZHlTdGF0ZV93cml0ZUNsb3NlZF9jbG9zZUNvZGVfY2xvc2VSZWFzb25fcGluZ0ludGVydmFsX3BpbmdUaW1lcl9jbG9zZVRpbWVyX2Zyb21Tb2NrZXR3c3dzc1Vuc3VwcG9ydGVkIFVSTCBzY2hlbWUgJ25vbmNlRGF0YUNhY2hlLUNvbnRyb2xuby1jYWNoZUNvbm5lY3Rpb24gdG8gJycgd2FzIG5vdCB1cGdyYWRlZCB0byB3ZWJzb2NrZXRSZXNwb25zZSBkaWQgbm90IGNvbnRhaW4gYSAnU2VjLVdlYlNvY2tldC1BY2NlcHQnIGhlYWRlcmV4cGVjdGVkQWNjZXB0cmVjZWl2ZWRBY2NlcHRSZWFzcG9uc2UgaGVhZGVyICdTZWMtV2ViU29ja2V0LUFjY2VwdCcgaXMgdGhlIHdyb25nIGxlbmd0aEJhZCByZXNwb25zZSAnU2VjLVdlYlNvY2tldC1BY2NlcHQnIGhlYWRlcm5lZ290aWF0ZUNsaWVudENvbXByZXNzaW9uZ2V0V2luZG93Qml0c1Jlc2VydmVkIHN0YXR1cyBjb2RlIGlvL3dlYnNvY2tldHNfaXNSZXNlcnZlZFN0YXR1c0NvZGVfTUFTS184X01BU0tfMzJfQklUU19QRVJfQllURV9CWVRFU19QRVJfV09SRF9PVVRHT0lOR19CVUZGRVJfU0laRV9EQVJUX1NFU1NJT05fSUREQVJUU0VTU0lEX2h0dHBPdmVycmlkZXNUb2tlbl93ZWJTb2NrZXRHVUlEMjU4RUFGQTUtRTkxNC00N0RBLTk1Q0EtQzVBQjBEQzg1QjExX2NsaWVudE5vQ29udGV4dFRha2VvdmVyY2xpZW50X25vX2NvbnRleHRfdGFrZW92ZXJfc2VydmVyTm9Db250ZXh0VGFrZW92ZXJzZXJ2ZXJfbm9fY29udGV4dF90YWtlb3Zlcl9jbGllbnRNYXhXaW5kb3dCaXRzY2xpZW50X21heF93aW5kb3dfYml0c19zZXJ2ZXJNYXhXaW5kb3dCaXRzc2VydmVyX21heF93aW5kb3dfYml0c19nZXRIdHRwVmVyc2lvbkRhcnQvIChkYXJ0OmlvKXNka3Jvb3Q6L3BrZy9jb21waWxlci9iaW4vZGFydDJqcy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvZGFydDJqcy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV91bnN0YWJsZS9kYXJ0MmpzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL2NvbXBpbGVyX25ldy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvY29tbWFuZGxpbmVfb3B0aW9ucy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvZmlsZW5hbWVzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9vcHRpb25zLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9zb3VyY2VfZmlsZV9wcm92aWRlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvdXRpbC9jb21tYW5kX2xpbmUuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3V0aWwvdXJpX2V4dHJhcy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvdXRpbC91dGlsLmRhcnRwYWNrYWdlOmtlcm5lbC9rZXJuZWwuZGFydHBhY2thZ2U6a2VybmVsL3RhcmdldC90YXJnZXRzLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS9jb21waWxlcl9vcHRpb25zLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS9kaWFnbm9zdGljX21lc3NhZ2UuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfcHJvdG90eXBlL2V4cGVyaW1lbnRhbF9mbGFncy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUvZmlsZV9zeXN0ZW0uZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9iYXNlL3Byb2Nlc3NlZF9vcHRpb25zLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvYmFzZS9saWJyYXJpZXNfc3BlY2lmaWNhdGlvbi5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2NvbXBpbGVyX2NvbnRleHQuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9mYXN0YV9jb2Rlcy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NldmVyaXR5LmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMva2VybmVsX2dlbmVyYXRvcl9pbXBsLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc2Nhbm5lci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV91bnN0YWJsZS9jb21waWxlcl9zdGF0ZS5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUva2VybmVsX2dlbmVyYXRvci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUvc3RhbmRhcmRfZmlsZV9zeXN0ZW0uZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9jb21wdXRlX3BsYXRmb3JtX2JpbmFyaWVzX2xvY2F0aW9uLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL3JlZGlyZWN0aW5nX2ZhY3RvcnlfYm9keS5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL29wZXJhdG9yLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL2FzeW5jX21vZGlmaWVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc2Nhbm5lci9jaGFyYWN0ZXJzLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdXRpbC9saW5rLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdXRpbC9saW5rX2ltcGxlbWVudGF0aW9uLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdXRpbC9yZWxhdGl2aXplLmRhcnRwYWNrYWdlOmNvbXBpbGVyL2NvbXBpbGVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9hcGlpbXBsLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9jb2xvcnMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2lvL3NvdXJjZV9maWxlLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy91dGlsL2VtcHR5c2V0LmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy91dGlsL21hcGxldC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvdXRpbC9zZXRsZXQuZGFydHBhY2thZ2U6a2VybmVsL2FzdC5kYXJ0cGFja2FnZTprZXJuZWwvYmluYXJ5L2FzdF90b19iaW5hcnkuZGFydHBhY2thZ2U6a2VybmVsL2JpbmFyeS9hc3RfZnJvbV9iaW5hcnkuZGFydHBhY2thZ2U6a2VybmVsL3RleHQvYXN0X3RvX3RleHQuZGFydHBhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0cGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0cGFja2FnZTpwYWNrYWdlX2NvbmZpZy9wYWNrYWdlcy5kYXJ0cGFja2FnZTpwYWNrYWdlX2NvbmZpZy9wYWNrYWdlc19maWxlLmRhcnRwYWNrYWdlOnBhY2thZ2VfY29uZmlnL3NyYy9wYWNrYWdlc19pbXBsLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS90ZXJtaW5hbF9jb2xvcl9zdXBwb3J0LmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvY29tbWFuZF9saW5lX3JlcG9ydGluZy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL21lc3NhZ2VzLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcHJvYmxlbXMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90aWNrZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS91cmlfdHJhbnNsYXRvci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NjYW5uZXIvdG9rZW4uZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9zY2FubmVyL3Rva2VuLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvY29sb3JzLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL3R5cGVfbGFiZWxlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2NyYXNoLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvZGlsbC9kaWxsX3RhcmdldC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfdGFyZ2V0LmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL3V0aWxzLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL3ZlcmlmaWVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvbG9hZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc2Nhbm5lci9zdHJpbmdfc2Nhbm5lci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NjYW5uZXIvdXRmOF9ieXRlc19zY2FubmVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc2Nhbm5lci9yZWNvdmVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc2Nhbm5lci9lcnJvcl90b2tlbi5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NjYW5uZXIvdG9rZW5fY29uc3RhbnRzLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvaW5jcmVtZW50YWxfY29tcGlsZXIuZGFydHBhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvb2xkX3RvX25ld19hcGkuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2NvbW1vbi90YXNrcy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvY29tbW9uLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9jb21waWxlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvZGlhZ25vc3RpY3MvbWVzc2FnZXMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2Vudmlyb25tZW50LmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pby9sb2NhdGlvbl9wcm92aWRlci5kYXJ0cGFja2FnZTprZXJuZWwvdmlzaXRvci5kYXJ0cGFja2FnZTprZXJuZWwvY2Fub25pY2FsX25hbWUuZGFydHBhY2thZ2U6a2VybmVsL3RyYW5zZm9ybWF0aW9ucy9mbGFncy5kYXJ0cGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0cGFja2FnZTprZXJuZWwvY29xX2Fubm90LmRhcnRwYWNrYWdlOmtlcm5lbC9iaW5hcnkvdGFnLmRhcnRwYWNrYWdlOmtlcm5lbC9pbXBvcnRfdGFibGUuZGFydHBhY2thZ2U6a2VybmVsL3NyYy9oZWFwLmRhcnRwYWNrYWdlOmtlcm5lbC9saWJyYXJ5X2luZGV4LmRhcnRwYWNrYWdlOmNoYXJjb2RlL2FzY2lpLmRhcnRwYWNrYWdlOnBhY2thZ2VfY29uZmlnL3NyYy91dGlsLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc2Nhbm5lci9zdHJpbmdfY2Fub25pY2FsaXplci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Jhc2Uvc3ludGFjdGljX2VudGl0eS5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL3NjYW5uZXIvc3RyaW5nX3V0aWxpdGllcy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2JsYWNrbGlzdGVkX2NsYXNzZXMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90YXJnZXRfaW1wbGVtZW50YXRpb24uZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9kaWxsL2RpbGxfbGlicmFyeV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvZGlsbC9kaWxsX2xvYWRlci5kYXJ0cGFja2FnZTprZXJuZWwvY2xvbmUuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9kaWxsL2RpbGxfbWVtYmVyX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zY29wZS5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NvdXJjZS9zb3VyY2VfY2xhc3NfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NvdXJjZS9zb3VyY2VfbG9hZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2NvbnN0YW50X2V2YWx1YXRvci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfY29uc3RhbnRzLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL21ldGFkYXRhX2NvbGxlY3Rvci5kYXJ0cGFja2FnZTprZXJuZWwvYmluYXJ5L2xpbWl0ZWRfYXN0X3RvX2JpbmFyeS5kYXJ0cGFja2FnZTprZXJuZWwvdmVyaWZpZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX3NjaGVtYS5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfc2hhZG93X2FzdC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NjYW5uZXIvYXJyYXlfYmFzZWRfc2Nhbm5lci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUvaW5jcmVtZW50YWxfa2VybmVsX2dlbmVyYXRvci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUvbWVtb3J5X2ZpbGVfc3lzdGVtLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlcl9ncmFwaC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2NvbWJpbmF0b3IuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS91dGlsL2Vycm9yX3JlcG9ydGVyX2ZpbGVfY29waWVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvaHlicmlkX2ZpbGVfc3lzdGVtLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF9saWJyYXJ5X2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9saWJyYXJ5X2dyYXBoLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc291cmNlL3NvdXJjZV9saWJyYXJ5X2J1aWxkZXIuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL251bGxfY29tcGlsZXJfb3V0cHV0LmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9kaWFnbm9zdGljcy9kaWFnbm9zdGljX2xpc3RlbmVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9kaWFnbm9zdGljcy9pbnZhcmlhbnQuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2RpYWdub3N0aWNzL3NvdXJjZV9zcGFuLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9kaWFnbm9zdGljcy9zcGFubmFibGUuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2hlbHBlcnMvaGVscGVycy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvYmFja2VuZF9zdHJhdGVneS5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvY29tbW9uL25hbWVzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9jb21tb24vd29yay5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvY29tcGlsZV90aW1lX2NvbnN0YW50cy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvY29tbW9uX2VsZW1lbnRzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9kZWZlcnJlZF9sb2FkLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9kaWFnbm9zdGljcy9jb2RlX2xvY2F0aW9uLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9kdW1wX2luZm8uZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2VsZW1lbnRzL2VudGl0aWVzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9lbnF1ZXVlLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9mcm9udGVuZF9zdHJhdGVneS5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci90cml2aWFsLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci90eXBlbWFza3MvbWFza3MuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL3R5cGVzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pby9zb3VyY2VfaW5mb3JtYXRpb24uZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvYmFja2VuZC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9pbmZlcnJlZF9kYXRhLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19tb2RlbC9qc19zdHJhdGVneS5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMva2VybmVsL2tlcm5lbF9zdHJhdGVneS5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMva2VybmVsL2xvYWRlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvc2VyaWFsaXphdGlvbi90YXNrLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9zZXJpYWxpemF0aW9uL3N0cmF0ZWdpZXMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS9ub2Rlcy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvdW5pdmVyc2Uvc2VsZWN0b3IuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3VuaXZlcnNlL2NvZGVnZW5fd29ybGRfYnVpbGRlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvdW5pdmVyc2UvcmVzb2x1dGlvbl93b3JsZF9idWlsZGVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy91bml2ZXJzZS93b3JsZF9pbXBhY3QuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3dvcmxkLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9kaWFnbm9zdGljcy9nZW5lcmF0ZWQvc2hhcmVkX21lc3NhZ2VzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9jb25zdGFudHMvZXhwcmVzc2lvbnMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2lvL2NvZGVfb3V0cHV0LmRhcnRwYWNrYWdlOmtlcm5lbC9zcmMvaGllcmFyY2h5X2Jhc2VkX3R5cGVfZW52aXJvbm1lbnQuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9zY2FubmVyL2ludGVybmVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2NsYXNzX2hpZXJhcmNoeV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2Uvc3RhbmRhcmRfYm91bmRzLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2ltcGxpY2l0X2ZpZWxkX3R5cGUuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2NsYXNzX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2VudW1fYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfZmllbGRfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfZm9ybWFsX3BhcmFtZXRlcl9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF9mdW5jdGlvbl90eXBlX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2ludmFsaWRfdHlwZV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF9taXhpbl9hcHBsaWNhdGlvbl9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF9uYW1lZF90eXBlX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX3ByZWZpeF9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF9wcm9jZWR1cmVfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfdHlwZV9hbGlhc19idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF90eXBlX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX3R5cGVfdmFyaWFibGVfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfdmFyaWFibGVfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9sb2FkX2xpYnJhcnlfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC91bmxpbmtlZF9zY29wZS5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3Jld3JpdGVfc2V2ZXJpdHkuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90YXJnZXQuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9kaWxsL2RpbGxfY2xhc3NfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2RpbGwvZGlsbF90eXBlX2FsaWFzX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvdHlwZV9idWlsZGVyX2NvbXB1dGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvbW9kaWZpZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9iYXNlL2luc3RydW1lbnRhdGlvbi5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2V4cG9ydC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2ltcG9ydC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9ib2R5X2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvdHJhbnNmb3JtX2NvbGxlY3Rpb25zLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL3RyYW5zZm9ybV9zZXRfbGl0ZXJhbHMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvY2xhc3NfbWVtYmVyX3BhcnNlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL2ludGVyZmFjZV9yZXNvbHZlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NvdXJjZS9kaWV0X2xpc3RlbmVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc291cmNlL2RpZXRfcGFyc2VyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc291cmNlL291dGxpbmVfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9jb2xsZWN0aW9ucy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL2luZmVyZW5jZV9oZWxwZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX2luZmVyZW5jZV9lbmdpbmUuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX2luZmVycmVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2UvdHlwZV9wcm9tb3Rpb24uZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX3NjaGVtYV9lbGltaW5hdGlvbi5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL3R5cGVfc2NoZW1hX2Vudmlyb25tZW50LmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2ltcGxpY2l0X3R5cGVfYXJndW1lbnQuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2V4cHJlc3Npb25fZ2VuZXJhdG9yLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvaWRlbnRpZmllcnMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2J1aWx0aW5fdHlwZV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9jbGFzc19idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9jb25zdHJ1Y3Rvcl9yZWZlcmVuY2VfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvZGVjbGFyYXRpb24uZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2R5bmFtaWNfdHlwZV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9lbnVtX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2ZpZWxkX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2Zvcm1hbF9wYXJhbWV0ZXJfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvZnVuY3Rpb25fdHlwZV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9pbnZhbGlkX3R5cGVfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvbGlicmFyeV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9tZW1iZXJfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvbWV0YWRhdGFfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvbWl4aW5fYXBwbGljYXRpb25fYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvbW9kaWZpZXJfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvbmFtZV9pdGVyYXRvci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvbmFtZWRfdHlwZV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9wcmVmaXhfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvcHJvY2VkdXJlX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL3R5cGVfYWxpYXNfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvdHlwZV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci90eXBlX2RlY2xhcmF0aW9uX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL3R5cGVfdmFyaWFibGVfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvdW5yZXNvbHZlZF90eXBlLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci92b2lkX3R5cGVfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NjYW5uZXIvYWJzdHJhY3Rfc2Nhbm5lci5kYXJ0cGFja2FnZTprZXJuZWwvdXRpbC9ncmFwaC5kYXJ0cGFja2FnZTprZXJuZWwvc3JjL2JvdW5kc19jaGVja3MuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvdHlwZV9hbGdvcml0aG1zLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvYmFzZS9yZXNvbHZlX3JlbGF0aXZlX3VyaS5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2NvbmZpZ3VyYXRpb24uZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2hlbHBlcnMvdHJhY2UuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2hlbHBlcnMvZGVidWdfY29sbGVjdGlvbi5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaGVscGVycy9leHBlbnNpdmVfbWFwLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9oZWxwZXJzL2V4cGVuc2l2ZV9zZXQuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2hlbHBlcnMvc3RhdHMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2hlbHBlcnMvdHJhY2tfbWFwLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL2pzX2JhY2tlbmQuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS9zc2EuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3VuaXZlcnNlL3dvcmxkX2J1aWxkZXIuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2VsZW1lbnRzL25hbWVzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy91bml2ZXJzZS9jYWxsX3N0cnVjdHVyZS5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvY29uc3RhbnRzL2NvbnN0YW50X3N5c3RlbS5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvY29uc3RhbnRzL3ZhbHVlcy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvZWxlbWVudHMvdHlwZXMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2tlcm5lbC9kYXJ0MmpzX3RhcmdldC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMva2VybmVsL2tlbGVtZW50cy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy91bml2ZXJzZS91c2UuZGFydHBhY2thZ2U6ZGFydDJqc19pbmZvL2luZm8uZGFydHBhY2thZ2U6ZGFydDJqc19pbmZvL2pzb25faW5mb19jb2RlYy5kYXJ0cGFja2FnZTpkYXJ0MmpzX2luZm8vYmluYXJ5X3NlcmlhbGl6YXRpb24uZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzL2pzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL2ZpZWxkX2FuYWx5c2lzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy91dGlsL3NpbmtfYWRhcHRlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9lbnF1ZXVlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvdW5pdmVyc2UvbWVtYmVyX3VzYWdlLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy91dGlsL2VudW1zZXQuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2NvbW1vbi9iYWNrZW5kX2FwaS5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9hbm5vdGF0aW9ucy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9iYWNrZW5kX3VzYWdlLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL2ludGVyY2VwdG9yX2RhdGEuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvbm9fc3VjaF9tZXRob2RfcmVnaXN0cnkuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvcnVudGltZV90eXBlcy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvbmF0aXZlL2VucXVldWUuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL25hdGl2ZS9yZXNvbHZlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvdW5pdmVyc2UvY2xhc3NfaGllcmFyY2h5LmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci90eXBlX2dyYXBoX2luZmVycmVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci90eXBlbWFza3MvY29uc3RhbnRzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci9pbmZlcnJlcl9lbmdpbmUuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2NvbW1vbi9jb2RlZ2VuLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19tb2RlbC9lbGVtZW50cy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvdW5pdmVyc2UvY2xhc3Nfc2V0LmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qcy9yZXdyaXRlX2FzeW5jLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL2pzX2VtaXR0ZXIuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvc29ydGVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy90cmFjZXIuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvYmFja2VuZF9pbXBhY3QuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvY2hlY2tlZF9tb2RlX2hlbHBlcnMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvY29kZWdlbl9saXN0ZW5lci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9jb25zdGFudF9oYW5kbGVyX2phdmFzY3JpcHQuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvY3VzdG9tX2VsZW1lbnRzX2FuYWx5c2lzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL2ltcGFjdF90cmFuc2Zvcm1lci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9uYW1lci5kYXJ0cGFja2FnZTpqc19hc3QvanNfYXN0LmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL3Jlc29sdXRpb25fbGlzdGVuZXIuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3VuaXZlcnNlL3NpZGVfZWZmZWN0cy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaW8va2VybmVsX3NvdXJjZV9pbmZvcm1hdGlvbi5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanMvanNfc291cmNlX21hcHBpbmcuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL25hdGl2ZS9iZWhhdmlvci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvc3NhL2J1aWxkZXJfa2VybmVsLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2EvZ3JhcGhfYnVpbGRlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvc3NhL3R5cGVzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19tb2RlbC9jbG9zdXJlLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19tb2RlbC9lbnYuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX21vZGVsL2VsZW1lbnRfbWFwLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19tb2RlbC9lbGVtZW50X21hcF9pbXBsLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19tb2RlbC9qc193b3JsZC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfbW9kZWwvanNfd29ybGRfYnVpbGRlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfbW9kZWwvbG9jYWxzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9jb21tb24vcmVzb2x1dGlvbi5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaXIvYW5ub3RhdGlvbnMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2lyL2Nsb3N1cmUuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2lyL2ltcGFjdC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaXIvaW1wYWN0X2RhdGEuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2lyL21vZHVsYXIuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2lyL3Njb3BlLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9rZXJuZWwvZGVmZXJyZWRfbG9hZC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMva2VybmVsL2VsZW1lbnRfbWFwLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9rZXJuZWwvZWxlbWVudF9tYXBfaW1wbC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMva2VybmVsL2Zyb250X2VuZF9hZGFwdGVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9jbG9zdXJlLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9lbGVtZW50cy9qdW1wcy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvc3NhL2ludm9rZV9keW5hbWljX3NwZWNpYWxpemVycy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvc3NhL3ZhbGlkYXRlLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9lbGVtZW50cy9lbnRpdHlfdXRpbHMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2VsZW1lbnRzL29wZXJhdG9ycy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMva2VybmVsL2ludm9jYXRpb25fbWlycm9yX2NvbnN0YW50cy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaXIvc3RhdGljX3R5cGUuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2tlcm5lbC9rZXJuZWxfd29ybGQuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2NvbnN0YW50cy9jb25zdHJ1Y3RvcnMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2NvbnN0YW50cy9ldmFsdWF0aW9uLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvbmFtZXMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX2NvbnN0cmFpbnRfZ2F0aGVyZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvdHlwZXMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2JvZHlfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9leHByZXNzaW9uX2dlbmVyYXRvcl9oZWxwZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvZm9yZXN0LmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvY29uc3RhbnRfY29udGV4dC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3F1b3RlLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc291cmNlL3Njb3BlX2xpc3RlbmVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2NvbnN0bmVzcy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9leHByZXNzaW9uX2dlbmVyYXRvci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfYXBpLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF9hc3RfYXBpLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL2Vycm9yX2RlbGVnYXRpb25fbGlzdGVuZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvbGlzdGVuZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvcGFyc2VyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL3BhcnNlcl9lcnJvci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci9hc3NlcnQuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvZm9ybWFsX3BhcmFtZXRlcl9raW5kLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL2lkZW50aWZpZXJfY29udGV4dC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci9tZW1iZXJfa2luZC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci90b3BfbGV2ZWxfcGFyc2VyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL3V0aWwuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9pZ25vcmVkX3BhcnNlcl9lcnJvcnMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zb3VyY2Uvc3RhY2tfbGlzdGVuZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zY2FubmVyL2tleXdvcmRfc3RhdGUuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvY29uc3RhbnRfZW1pdHRlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvc3NhL2NvZGVnZW4uZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS9vcHRpbWl6ZS5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvZWxlbWVudHMvaW5kZXhlZC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaXIvY29uc3RhbnRzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci9zdGF0aWNfdHlwZV9iYXNlLmRhcnRwYWNrYWdlOmNvbGxlY3Rpb24vY29sbGVjdGlvbi5kYXJ0cGFja2FnZTpkYXJ0MmpzX2luZm8vc3JjL3V0aWwuZGFydHBhY2thZ2U6ZGFydDJqc19pbmZvL3NyYy9iaW5hcnkvc2luay5kYXJ0cGFja2FnZTpkYXJ0MmpzX2luZm8vc3JjL2JpbmFyeS9zb3VyY2UuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzL2pzX2RlYnVnLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci9zY29wZV92aXNpdG9yLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci91dGlsLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci9ydW50aW1lX3R5cGVfYW5hbHlzaXMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3VuaXZlcnNlL2ZlYXR1cmUuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL3R5cGVfZ3JhcGhfbm9kZXMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL2J1aWxkZXJfa2VybmVsLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci9jbG9zdXJlX3RyYWNlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvZGVidWcuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL2xvY2Fsc19oYW5kbGVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci9saXN0X3RyYWNlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvbWFwX3RyYWNlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvc2V0X3RyYWNlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvdHlwZV9ncmFwaF9kdW1wLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci90eXBlX3N5c3RlbS5kYXJ0cGFja2FnZTpqc19ydW50aW1lL3NoYXJlZC9hc3luY19hd2FpdF9lcnJvcl9jb2Rlcy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9jbGFzc19zdHViX2dlbmVyYXRvci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9jb2RlX2VtaXR0ZXJfdGFzay5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9pbnN0YW50aWF0aW9uX3N0dWJfZ2VuZXJhdG9yLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL2ludGVyY2VwdG9yX3N0dWJfZ2VuZXJhdG9yLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL21haW5fY2FsbF9zdHViX2dlbmVyYXRvci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9tZXRhZGF0YV9jb2xsZWN0b3IuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvbmF0aXZlX2VtaXR0ZXIuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvbmF0aXZlX2dlbmVyYXRvci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9wYXJhbWV0ZXJfc3R1Yl9nZW5lcmF0b3IuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvcnVudGltZV90eXBlX2dlbmVyYXRvci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci90eXBlX3Rlc3RfcmVnaXN0cnkuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS9zc2FfdHJhY2VyLmRhcnRwYWNrYWdlOmpzX3J1bnRpbWUvc2hhcmVkL2VtYmVkZGVkX25hbWVzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pby9wb3NpdGlvbl9pbmZvcm1hdGlvbi5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvbmF0aXZlL2pzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci9zdGF0aWNfdHlwZV9wcm92aWRlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvdW5pdmVyc2UvdGFyZ2V0X2NoZWNrcy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvc3NhL2p1bXBfaGFuZGxlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvc3NhL2tlcm5lbF9zdHJpbmdfYnVpbGRlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvc3NhL2xvY2Fsc19oYW5kbGVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2EvbG9vcF9oYW5kbGVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2Evc3NhX2JyYW5jaF9idWlsZGVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2Evc3dpdGNoX2NvbnRpbnVlX2FuYWx5c2lzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2EvdHlwZV9idWlsZGVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci9lbGVtZW50X21hcC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvb3JkZXJlZF90eXBlc2V0LmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci9jYWNoZWRfc3RhdGljX3R5cGUuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2lyL2RlYnVnLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci90eXBlcy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaXIvdmlzaXRvcnMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2tlcm5lbC9lbnYuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3VuaXZlcnNlL2Z1bmN0aW9uX3NldC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUvY29uc3RhbnRfZXZhbHVhdG9yLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9rZXJuZWwva2VybmVsX2ltcGFjdC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvc3NhL2xvZ2dpbmcuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvZmFuZ29ybi5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci9kaXJlY3RpdmVfY29udGV4dC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci9mb3J3YXJkaW5nX2xpc3RlbmVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL2xpdGVyYWxfZW50cnlfaW5mby5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci9sb29wX3N0YXRlLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL21vZGlmaWVyX2NvbnRleHQuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvcmVjb3ZlcnlfbGlzdGVuZXJzLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL3Rva2VuX3N0cmVhbV9yZXdyaXRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci90eXBlX2luZm8uZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvaWRlbnRpZmllcl9jb250ZXh0X2ltcGwuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS9jb2RlZ2VuX2hlbHBlcnMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS92YXJpYWJsZV9hbGxvY2F0b3IuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS9pbnRlcmNlcHRvcl9zaW1wbGlmaWVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2EvdHlwZXNfcHJvcGFnYXRpb24uZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS92YWx1ZV9yYW5nZV9hbmFseXplci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvc3NhL3ZhbHVlX3NldC5kYXJ0cGFja2FnZTpjb2xsZWN0aW9uL3NyYy9hbGdvcml0aG1zLmRhcnRwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2Nhbm9uaWNhbGl6ZWRfbWFwLmRhcnRwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2NvbWJpbmVkX3dyYXBwZXJzL2NvbWJpbmVkX2l0ZXJhYmxlLmRhcnRwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2NvbWJpbmVkX3dyYXBwZXJzL2NvbWJpbmVkX2xpc3QuZGFydHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvY29tYmluZWRfd3JhcHBlcnMvY29tYmluZWRfbWFwLmRhcnRwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2NvbXBhcmF0b3JzLmRhcnRwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2VxdWFsaXR5LmRhcnRwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2VxdWFsaXR5X21hcC5kYXJ0cGFja2FnZTpjb2xsZWN0aW9uL3NyYy9lcXVhbGl0eV9zZXQuZGFydHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvZnVuY3Rpb25zLmRhcnRwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2l0ZXJhYmxlX3ppcC5kYXJ0cGFja2FnZTpjb2xsZWN0aW9uL3NyYy9wcmlvcml0eV9xdWV1ZS5kYXJ0cGFja2FnZTpjb2xsZWN0aW9uL3NyYy9xdWV1ZV9saXN0LmRhcnRwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL3VuaW9uX3NldC5kYXJ0cGFja2FnZTpjb2xsZWN0aW9uL3NyYy91bm1vZGlmaWFibGVfd3JhcHBlcnMuZGFydHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvdW5pb25fc2V0X2NvbnRyb2xsZXIuZGFydHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvd3JhcHBlcnMuZGFydHBhY2thZ2U6ZGFydDJqc19pbmZvL3NyYy9ncmFwaC5kYXJ0cGFja2FnZTpqc19hc3Qvc3JjL3ByZWNlZGVuY2UuZGFydHBhY2thZ2U6anNfYXN0L3NyYy9jaGFyYWN0ZXJzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci9ub2RlX3RyYWNlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9tb2RlbC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9wcm9ncmFtX2J1aWxkZXIvcHJvZ3JhbV9idWlsZGVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL3N0YXJ0dXBfZW1pdHRlci9lbWl0dGVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL2pzX2ludGVyb3BfYW5hbHlzaXMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3Jlc29sdXRpb24vcmVnaXN0cnkuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3V0aWwvZmVhdHVyZXMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvbGl0ZXJhbF9lbnRyeV9pbmZvX2ltcGwuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvdHlwZV9pbmZvX2ltcGwuZGFydHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvdXRpbHMuZGFydHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvZW1wdHlfdW5tb2RpZmlhYmxlX3NldC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9zdGFydHVwX2VtaXR0ZXIvbW9kZWxfZW1pdHRlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaGFzaC9zaGExLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pby9zb3VyY2VfbWFwX2J1aWxkZXIuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvY29uc3RhbnRfb3JkZXJpbmcuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvaGVhZGVycy5kYXJ0cGFja2FnZTpjcnlwdG8vY3J5cHRvLmRhcnRwYWNrYWdlOmNyeXB0by9zcmMvZGlnZXN0LmRhcnRwYWNrYWdlOmNyeXB0by9zcmMvaGFzaC5kYXJ0cGFja2FnZTpjcnlwdG8vc3JjL2htYWMuZGFydHBhY2thZ2U6Y3J5cHRvL3NyYy9tZDUuZGFydHBhY2thZ2U6Y3J5cHRvL3NyYy9zaGExLmRhcnRwYWNrYWdlOmNyeXB0by9zcmMvc2hhMjU2LmRhcnRwYWNrYWdlOmNvbnZlcnQvY29udmVydC5kYXJ0cGFja2FnZTpjcnlwdG8vc3JjL2RpZ2VzdF9zaW5rLmRhcnRwYWNrYWdlOmNyeXB0by9zcmMvaGFzaF9zaW5rLmRhcnRwYWNrYWdlOmNyeXB0by9zcmMvdXRpbHMuZGFydHBhY2thZ2U6Y29udmVydC9zcmMvYWNjdW11bGF0b3Jfc2luay5kYXJ0cGFja2FnZTpjb252ZXJ0L3NyYy9ieXRlX2FjY3VtdWxhdG9yX3NpbmsuZGFydHBhY2thZ2U6Y29udmVydC9zcmMvaGV4LmRhcnRwYWNrYWdlOmNvbnZlcnQvc3JjL3BlcmNlbnQuZGFydHBhY2thZ2U6Y29udmVydC9zcmMvc3RyaW5nX2FjY3VtdWxhdG9yX3NpbmsuZGFydHBhY2thZ2U6dHlwZWRfZGF0YS90eXBlZF9kYXRhLmRhcnRwYWNrYWdlOmNvbnZlcnQvc3JjL2hleC9lbmNvZGVyLmRhcnRwYWNrYWdlOmNvbnZlcnQvc3JjL2hleC9kZWNvZGVyLmRhcnRwYWNrYWdlOmNvbnZlcnQvc3JjL3BlcmNlbnQvZW5jb2Rlci5kYXJ0cGFja2FnZTpjb252ZXJ0L3NyYy9wZXJjZW50L2RlY29kZXIuZGFydHBhY2thZ2U6dHlwZWRfZGF0YS90eXBlZF9idWZmZXJzLmRhcnRwYWNrYWdlOmNvbnZlcnQvc3JjL3V0aWxzLmRhcnRkYXJ0OmNvbnZlcnRkYXJ0OmRldmVsb3BlcmRhcnQ6ZmZpZGFydDppc29sYXRlZGFydDptYXRoZGFydDpwcm9maWxlcmRhcnQ6dHlwZWRfZGF0YWRhcnQ6dm1zZXJ2aWNlX2lvZGFydDpfdm1zZXJ2aWNlZGFydDpfYnVpbHRpbmRhcnQ6bmF0aXZld3JhcHBlcnNkYXJ0OmNsaWRhcnQ6X2h0dHB2bS5jYWxsLXNpdGUtYXR0cmlidXRlcy5tZXRhZGF0YQAAAHtbhgExaQYBN1cwAThVIwE5Eq8BRdkmAAAAIAAAAAkAAABNAABHrAAAWKcAAGJVAABohAAAa2oAAIm/AAC9AAAAwhAAAMmCAADuYAAA9VQAAQZQAAEMigABERQAARNvAAEWFgABYD8AAW8OAAF6DwADkgoAA5UPAAOo/QADr7MAA7PBAAO7kwADzLYAA9KyAAPhlgAD6w4AA+yeAAP4fwAEC20ABBz0AAQeQQAEJHMABDnuAAQ9nQAEVUIABFwkAAR2VwAElR0AByt8AAgzxgAJMSQACg9sAAqX8AAKvEUACr2BAArMfgAK06oACth6AArjJgAK74cACvRLAAr3HAAK/XcACxYFAAsffAALcTgAC4xwAAuenwALpKsAC/BgAAv7iwAMCYwADCEKAAwoHAAMNwoADEUyAAxSPQAMW6kADL9ZAA0EyAANDEMADSEfAA0iYQANdAoADZQAAA2U2AANmMMADhdnAA4kjAAOJUYADj6SAA4/0wAOSncADljPAA5fFAAOcx8ADn/AAA6FwgAOknEADpNY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